diff --git a/build/cjs/vexflow-bravura.js b/build/cjs/vexflow-bravura.js new file mode 100644 index 0000000000..4d23137927 --- /dev/null +++ b/build/cjs/vexflow-bravura.js @@ -0,0 +1,7 @@ +/*! + * VexFlow 4.0.1-alpha.2 2022-02-02T09:30:30.784Z 0df10df6d1fab3a99f5aa306341a31c6e686d659 + * Copyright (c) 2010 Mohit Muthanna Cheppudira + * https://www.vexflow.com https://github.com/0xfe/vexflow + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.Vex=e():t.Vex=e()}("undefined"!=typeof window?window:"undefined"!=typeof globalThis?globalThis:this,(function(){return(()=>{"use strict";var t={d:(e,i)=>{for(var s in i)t.o(i,s)&&!t.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:i[s]})}};t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),t.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var e={};function i(t,e,i=!0){if("object"!=typeof t||null===t)return!1;let s=t.constructor;if(i){for(;null!==t;){if(s=t.constructor,"CATEGORY"in s&&s.CATEGORY===e)return!0;t=Object.getPrototypeOf(t)}return!1}return"CATEGORY"in s&&s.CATEGORY===e}t.d(e,{default:()=>ki});const s=t=>i(t,h.Barline),a=t=>i(t,h.GraceNote),n=t=>i(t,h.Note),o=t=>i(t,h.StaveNote),l=t=>i(t,h.StemmableNote),r=t=>i(t,h.TabNote);var h;!function(t){t.Accidental="Accidental",t.Annotation="Annotation",t.Articulation="Articulation",t.Barline="Barline",t.BarNote="BarNote",t.Beam="Beam",t.Bend="Bend",t.ChordSymbol="ChordSymbol",t.Clef="Clef",t.ClefNote="ClefNote",t.Crescendo="Crescendo",t.Curve="Curve",t.Dot="Dot",t.Element="Element",t.Fraction="Fraction",t.FretHandFinger="FretHandFinger",t.GhostNote="GhostNote",t.Glyph="Glyph",t.GlyphNote="GlyphNote",t.GraceNote="GraceNote",t.GraceNoteGroup="GraceNoteGroup",t.GraceTabNote="GraceTabNote",t.KeySignature="KeySignature",t.KeySigNote="KeySigNote",t.Modifier="Modifier",t.MultiMeasureRest="MultiMeasureRest",t.Note="Note",t.NoteHead="NoteHead",t.NoteSubGroup="NoteSubGroup",t.Ornament="Ornament",t.Parenthesis="Parenthesis",t.PedalMarking="PedalMarking",t.RenderContext="RenderContext",t.RepeatNote="RepeatNote",t.Repetition="Repetition",t.Stave="Stave",t.StaveConnector="StaveConnector",t.StaveHairpin="StaveHairpin",t.StaveLine="StaveLine",t.StaveModifier="StaveModifier",t.StaveNote="StaveNote",t.StaveSection="StaveSection",t.StaveTempo="StaveTempo",t.StaveText="StaveText",t.StaveTie="StaveTie",t.Stem="Stem",t.StemmableNote="StemmableNote",t.StringNumber="StringNumber",t.Stroke="Stroke",t.System="System",t.TabNote="TabNote",t.TabSlide="TabSlide",t.TabStave="TabStave",t.TabTie="TabTie",t.TextBracket="TextBracket",t.TextDynamics="TextDynamics",t.TextNote="TextNote",t.Tickable="Tickable",t.TimeSignature="TimeSignature",t.TimeSigNote="TimeSigNote",t.Tremolo="Tremolo",t.Tuplet="Tuplet",t.Vibrato="Vibrato",t.VibratoBracket="VibratoBracket",t.Voice="Voice",t.Volta="Volta"}(h||(h={}));class c extends Error{constructor(t,e=""){super("[RuntimeError] "+t+": "+e),this.code=t}}function d(){return"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==t.g?t.g:Function("return this")()}function b(t,e="undefined",i=""){if(void 0===t)throw new c(e,i);return t}function m(t,...e){if(!e)return;const i=Array.prototype.slice.call(e).join(" ");d().console.log(t+": "+i)}function g(...t){const e=t.join(" "),i=new Error;d().console.log("Warning: ",e,i.stack)}function _(t,e){let i=e+(t-e)/2;var s,a;return i%2>0&&(i=((s=10*i)%(a=5)>=a/2?parseInt(""+s/a,10)*a+a:parseInt(""+s/a,10)*a)/10),i}function x(t){return`vf-${t}`}function p(t){return(t%=2*Math.PI)<0&&(t+=2*Math.PI),t}class u{constructor(t,e){this.numerator=1,this.denominator=1,this.set(t,e)}static get CATEGORY(){return h.Fraction}static GCD(t,e){if("number"!=typeof t||Number.isNaN(t)||"number"!=typeof e||Number.isNaN(e))throw new c("BadArgument",`Invalid numbers: ${t}, ${e}`);let i;for(;0!==e;)i=e,e=t%e,t=i;return t}static LCM(t,e){return t*e/u.GCD(t,e)}static LCMM(t){return 0===t.length?0:1===t.length?t[0]:2===t.length?u.LCM(t[0],t[1]):u.LCM(t.shift(),u.LCMM(t))}set(t=1,e=1){return this.numerator=t,this.denominator=e,this}value(){return this.numerator/this.denominator}simplify(){let t=this.numerator,e=this.denominator;const i=u.GCD(t,e);return t/=i,e/=i,e<0&&(e=-e,t=-t),this.set(t,e)}add(t=0,e=1){const[i,s]=f(t,e),a=u.LCM(this.denominator,s),n=a/this.denominator,o=a/s,l=this.numerator*n+i*o;return this.set(l,a)}subtract(t=0,e=1){const[i,s]=f(t,e),a=u.LCM(this.denominator,s),n=a/this.denominator,o=a/s,l=this.numerator*n-i*o;return this.set(l,a)}multiply(t=1,e=1){const[i,s]=f(t,e);return this.set(this.numerator*i,this.denominator*s)}divide(t=1,e=1){const[i,s]=f(t,e);return this.set(this.numerator*s,this.denominator*i)}equals(t){const e=u.__staticFractionA.copy(t).simplify(),i=u.__staticFractionB.copy(this).simplify();return e.numerator===i.numerator&&e.denominator===i.denominator}greaterThan(t){const e=u.__staticFractionB.copy(this);return e.subtract(t),e.numerator>0}greaterThanEquals(t){const e=u.__staticFractionB.copy(this);return e.subtract(t),e.numerator>=0}lessThan(t){return!this.greaterThanEquals(t)}lessThanEquals(t){return!this.greaterThan(t)}clone(){return new u(this.numerator,this.denominator)}copy(t){return"number"==typeof t?this.set(t,1):this.set(t.numerator,t.denominator)}quotient(){return Math.floor(this.numerator/this.denominator)}remainder(){return this.numerator%this.denominator}makeAbs(){return this.denominator=Math.abs(this.denominator),this.numerator=Math.abs(this.numerator),this}toString(){return`${this.numerator}/${this.denominator}`}toSimplifiedString(){return u.__staticFractionTmp.copy(this).simplify().toString()}toMixedString(){let t="";const e=this.quotient(),i=u.__staticFractionTmp.copy(this);return e<0&&i.makeAbs(),0!==e?(t+=e,0!==i.numerator&&(t+=` ${i.toSimplifiedString()}`)):t=0===i.numerator?"0":i.toSimplifiedString(),t}parse(t){const e=t.split("/"),i=parseInt(e[0],10),s=e[1]?parseInt(e[1],10):1;return this.set(i,s)}}function f(t,e=1){return"number"==typeof t?[t,e]:[t.numerator,t.denominator]}u.__staticFractionA=new u,u.__staticFractionB=new u,u.__staticFractionTmp=new u;class y{constructor(t,e,i,s){this.x=t,this.y=e,this.w=i,this.h=s}static copy(t){return new y(t.x,t.y,t.w,t.h)}getX(){return this.x}getY(){return this.y}getW(){return this.w}getH(){return this.h}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setW(t){return this.w=t,this}setH(t){return this.h=t,this}move(t,e){return this.x+=t,this.y+=e,this}clone(){return y.copy(this)}mergeWith(t){const e=t,i=this.xthis.x2)&&(this.x2=t),(isNaN(this.y1)||ethis.y2)&&(this.y2=e)}addX(t){this.addPoint(t,this.y1)}addY(t){this.addPoint(this.x1,t)}addQuadraticCurve(t,e,i,s,a,n){this.addPoint(t,e),this.addPoint(a,n);const o=i-t;let l=o-(a-i);if(0!=l){const e=o/l;if(e>0&&e<1){const s=1-e;this.addX(s*s*t+2*s*e*i+e*e*a)}}const r=s-e;if(l=r-(n-s),0!=l){const t=r/l;if(t>0&&t<1){const i=1-t;this.addY(i*i*e+2*i*t*s+t*t*n)}}}addBezierCurve(t,e,i,s,a,n,o,l){const r=[t,e],h=[i,s],c=[a,n],d=[o,l];let b;this.addPoint(r[0],r[1]),this.addPoint(d[0],d[1]);const m=(t,e)=>Math.pow(1-t,3)*r[e]+3*Math.pow(1-t,2)*t*h[e]+3*(1-t)*Math.pow(t,2)*c[e]+Math.pow(t,3)*d[e];for(b=0;b<=1;b++){const t=6*r[b]-12*h[b]+6*c[b],e=-3*r[b]+9*h[b]-9*c[b]+3*d[b],i=3*h[b]-3*r[b];if(0===e){if(0===t)continue;const e=-i/t;0=600;{const e=parseInt(t,10);return isNaN(e)?"bold"===t.toLowerCase():e>=600}}return!1}static isItalic(t){return!!t&&t.toLowerCase()===w.ITALIC}static loadWebFont(t,e,i=!0){return v(this,void 0,void 0,(function*(){const s=new FontFace(t,(i?`url(${e}2) format('woff2'), `:"")+`url(${e}) format('woff')`);return yield s.load(),document.fonts.add(s),s}))}static loadWebFonts(){return v(this,void 0,void 0,(function*(){const t=E.WEB_FONT_HOST,e=E.WEB_FONT_FILES;for(const i in e){const s=e[i];E.loadWebFont(i,t+s)}}))}static loadTextFonts(){}static load(t,e,i){let s=C[t];return s||(s=new E(t),C[t]=s),e&&s.setData(e),i&&s.setMetrics(i),s}getName(){return this.name}getData(){return b(this.data,"FontError","Missing font data")}getMetrics(){return b(this.metrics,"FontError","Missing metrics")}setData(t){this.data=t}setMetrics(t){this.metrics=t}hasData(){return void 0!==this.data}getResolution(){return this.getData().resolution}getGlyphs(){return this.getData().glyphs}lookupMetric(t,e){const i=t.split(".");let s=this.getMetrics();for(let t=0;tt[e]))}}return[]}getElementsByType(t){return this.getElementsByAttribute("type",t)}getElementsByClass(t){return this.getElementsByAttribute("class",t)}onUpdate(t){return["id","type","class"].includes(t.name)&&this.updateIndex(t),this}}class N{constructor(){var t;this.attrs={id:N.newID(),el:void 0,type:this.getCategory(),classes:{}},this.rendered=!1,null===(t=F.getDefaultRegistry())||void 0===t||t.register(this)}static get CATEGORY(){return h.Element}static newID(){return"auto"+N.ID++}getCategory(){return this.constructor.CATEGORY}setStyle(t){return this.style=t,this}getStyle(){return this.style}applyStyle(t=this.context,e=this.getStyle()){return e&&t?(t.save(),e.shadowColor&&t.setShadowColor(e.shadowColor),e.shadowBlur&&t.setShadowBlur(e.shadowBlur),e.fillStyle&&t.setFillStyle(e.fillStyle),e.strokeStyle&&t.setStrokeStyle(e.strokeStyle),e.lineWidth&&t.setLineWidth(e.lineWidth),this):this}restoreStyle(t=this.context,e=this.getStyle()){return e&&t?(t.restore(),this):this}drawWithStyle(){this.checkContext(),this.applyStyle(),this.draw(),this.restoreStyle()}hasClass(t){return!0===this.attrs.classes[t]}addClass(t){var e;return this.attrs.classes[t]=!0,null===(e=this.registry)||void 0===e||e.onUpdate({id:this.attrs.id,name:"class",value:t,oldValue:void 0}),this}removeClass(t){var e;return delete this.attrs.classes[t],null===(e=this.registry)||void 0===e||e.onUpdate({id:this.attrs.id,name:"class",value:void 0,oldValue:t}),this}onRegister(t){return this.registry=t,this}isRendered(){return this.rendered}setRendered(t=!0){return this.rendered=t,this}getAttributes(){return this.attrs}getAttribute(t){return this.attrs[t]}setAttribute(t,e){var i;const s=this.attrs.id,a=this.attrs[t];return this.attrs[t]=e,null===(i=this.registry)||void 0===i||i.onUpdate({id:s,name:t,value:e,oldValue:a}),this}getBoundingBox(){return this.boundingBox}getContext(){return this.context}setContext(t){return this.context=t,this}checkContext(){return b(this.context,"NoContext","No rendering context attached to instance.")}set font(t){this.setFont(t)}get font(){return E.toCSSString(this.textFont)}setFont(t,e,i,s){const a=this.constructor.TEXT_FONT,n="object"==typeof t,o="string"==typeof t,l=void 0===t,r=void 0===e&&void 0===i&&void 0===s;return this.textFont=n?Object.assign(Object.assign({},a),t):o&&r?E.fromCSSString(t):l&&r?Object.assign({},a):E.validate(null!=t?t:a.family,null!=e?e:a.size,null!=i?i:a.weight,null!=s?s:a.style),this}getFont(){return this.textFont||this.resetFont(),E.toCSSString(this.textFont)}resetFont(){this.setFont()}get fontInfo(){return this.textFont||this.resetFont(),Object.assign({},this.textFont)}set fontInfo(t){this.setFont(t)}setFontSize(t){const e=this.fontInfo;return this.setFont(e.family,t,e.weight,e.style),this}getFontSize(){return this.fontSize}set fontSize(t){this.setFontSize(t)}get fontSize(){let t=this.fontInfo.size;return"number"==typeof t&&(t=`${t}pt`),t}get fontSizeInPoints(){return E.convertSizeToPointValue(this.fontSize)}get fontSizeInPixels(){return E.convertSizeToPixelValue(this.fontSize)}get fontStyle(){return this.fontInfo.style}set fontStyle(t){const e=this.fontInfo;this.setFont(e.family,e.size,e.weight,t)}get fontWeight(){return this.fontInfo.weight+""}set fontWeight(t){const e=this.fontInfo;this.setFont(e.family,e.size,t,e.style)}}var A,P;N.ID=1e3,N.TEXT_FONT={family:E.SANS_SERIF,size:E.SIZE,weight:T.NORMAL,style:w.NORMAL},function(t){t[t.MOVE=0]="MOVE",t[t.LINE=1]="LINE",t[t.QUADRATIC=2]="QUADRATIC",t[t.BEZIER=3]="BEZIER"}(A||(A={}));class B{constructor(t,e,i){this.point=-1,this.metrics=R.loadMetrics(t,e,i),this.bbox=R.getOutlineBoundingBox(this.metrics.outline,this.metrics.scale,this.metrics.x_shift,this.metrics.y_shift),i&&(this.point=R.lookupFontMetric(this.metrics.font,i,e,"point",-1))}}class M{constructor(t,e,i,s){this.outline=t,this.originX=e,this.originY=i,this.scale=s,this.i=0}done(){return this.i>=this.outline.length}next(){return this.outline[this.i++]}nextX(){return this.originX+this.outline[this.i++]*this.scale}nextY(){return this.originY-this.outline[this.i++]*this.scale}static parse(t){const e=[],i=t.split(" ");let s=0;for(;s{const e=t.getTickContext();a&&t.setStave(a),e.setXOffset(n)}))}}class L{static get NUM_TONES(){return this.canonical_notes.length}static get roots(){return["c","d","e","f","g","a","b"]}static get root_values(){return[0,2,4,5,7,9,11]}static get root_indices(){return{c:0,d:1,e:2,f:3,g:4,a:5,b:6}}static get canonical_notes(){return["c","c#","d","d#","e","f","f#","g","g#","a","a#","b"]}static get diatonic_intervals(){return["unison","m2","M2","m3","M3","p4","dim5","p5","m6","M6","b7","M7","octave"]}static get diatonic_accidentals(){return{unison:{note:0,accidental:0},m2:{note:1,accidental:-1},M2:{note:1,accidental:0},m3:{note:2,accidental:-1},M3:{note:2,accidental:0},p4:{note:3,accidental:0},dim5:{note:4,accidental:-1},p5:{note:4,accidental:0},m6:{note:5,accidental:-1},M6:{note:5,accidental:0},b7:{note:6,accidental:-1},M7:{note:6,accidental:0},octave:{note:7,accidental:0}}}static get intervals(){return{u:0,unison:0,m2:1,b2:1,min2:1,S:1,H:1,2:2,M2:2,maj2:2,T:2,W:2,m3:3,b3:3,min3:3,M3:4,3:4,maj3:4,4:5,p4:5,"#4":6,b5:6,aug4:6,dim5:6,5:7,p5:7,"#5":8,b6:8,aug5:8,6:9,M6:9,maj6:9,b7:10,m7:10,min7:10,dom7:10,M7:11,maj7:11,8:12,octave:12}}static get scales(){return{major:[2,2,1,2,2,2,1],minor:[2,1,2,2,1,2,2],ionian:[2,2,1,2,2,2,1],dorian:[2,1,2,2,2,1,2],phyrgian:[1,2,2,2,1,2,2],lydian:[2,2,2,1,2,2,1],mixolydian:[2,2,1,2,2,1,2],aeolian:[2,1,2,2,1,2,2],locrian:[1,2,2,1,2,2,2]}}static get scaleTypes(){return{M:L.scales.major,m:L.scales.minor}}static get accidentals(){return["bb","b","n","#","##"]}static get noteValues(){return{c:{root_index:0,int_val:0},cn:{root_index:0,int_val:0},"c#":{root_index:0,int_val:1},"c##":{root_index:0,int_val:2},cb:{root_index:0,int_val:11},cbb:{root_index:0,int_val:10},d:{root_index:1,int_val:2},dn:{root_index:1,int_val:2},"d#":{root_index:1,int_val:3},"d##":{root_index:1,int_val:4},db:{root_index:1,int_val:1},dbb:{root_index:1,int_val:0},e:{root_index:2,int_val:4},en:{root_index:2,int_val:4},"e#":{root_index:2,int_val:5},"e##":{root_index:2,int_val:6},eb:{root_index:2,int_val:3},ebb:{root_index:2,int_val:2},f:{root_index:3,int_val:5},fn:{root_index:3,int_val:5},"f#":{root_index:3,int_val:6},"f##":{root_index:3,int_val:7},fb:{root_index:3,int_val:4},fbb:{root_index:3,int_val:3},g:{root_index:4,int_val:7},gn:{root_index:4,int_val:7},"g#":{root_index:4,int_val:8},"g##":{root_index:4,int_val:9},gb:{root_index:4,int_val:6},gbb:{root_index:4,int_val:5},a:{root_index:5,int_val:9},an:{root_index:5,int_val:9},"a#":{root_index:5,int_val:10},"a##":{root_index:5,int_val:11},ab:{root_index:5,int_val:8},abb:{root_index:5,int_val:7},b:{root_index:6,int_val:11},bn:{root_index:6,int_val:11},"b#":{root_index:6,int_val:0},"b##":{root_index:6,int_val:1},bb:{root_index:6,int_val:10},bbb:{root_index:6,int_val:9}}}isValidNoteValue(t){return t>=0&&t=0&&t3)throw new c("BadArguments","Invalid note name: "+t);const e=t.toLowerCase(),i=/^([cdefgab])(b|bb|n|#|##)?$/.exec(e);if(null!==i){return{root:i[1],accidental:i[2]}}throw new c("BadArguments","Invalid note name: "+t)}getKeyParts(t){if(!t||t.length<1)throw new c("BadArguments","Invalid key: "+t);const e=t.toLowerCase(),i=/^([cdefgab])(b|#)?(mel|harm|m|M)?$/.exec(e);if(null!==i){const t=i[1],e=i[2];let s=i[3];return s||(s="M"),{root:t,accidental:e,type:s}}throw new c("BadArguments",`Invalid key: ${t}`)}getNoteValue(t){const e=L.noteValues[t];if(void 0===e)throw new c("BadArguments",`Invalid note name: ${t}`);return e.int_val}getIntervalValue(t){const e=L.intervals[t];if(void 0===e)throw new c("BadArguments",`Invalid interval name: ${t}`);return e}getCanonicalNoteName(t){if(!this.isValidNoteValue(t))throw new c("BadArguments",`Invalid note value: ${t}`);return L.canonical_notes[t]}getCanonicalIntervalName(t){if(!this.isValidIntervalValue(t))throw new c("BadArguments",`Invalid interval value: ${t}`);return L.diatonic_intervals[t]}getRelativeNoteValue(t,e,i=1){if(1!==i&&-1!==i)throw new c("BadArguments",`Invalid direction: ${i}`);let s=(t+i*e)%L.NUM_TONES;return s<0&&(s+=L.NUM_TONES),s}getRelativeNoteName(t,e){const i=this.getNoteParts(t),s=this.getNoteValue(i.root);let a=e-s;if(Math.abs(a)>L.NUM_TONES-3){let i=1;a>0&&(i=-1);const n=(e+1+(s+1))%L.NUM_TONES*i;if(Math.abs(n)>2)throw new c("BadArguments",`Notes not related: ${t}, ${e})`);a=n}if(Math.abs(a)>2)throw new c("BadArguments",`Notes not related: ${t}, ${e})`);let n=i.root;if(a>0)for(let t=1;t<=a;++t)n+="#";else if(a<0)for(let t=-1;t>=a;--t)n+="b";return n}getScaleTones(t,e){const i=[t];let s=t;for(let a=0;a":{aboveCode:"articAccentAbove",belowCode:"articAccentBelow",between_lines:!0},"a-":{aboveCode:"articTenutoAbove",belowCode:"articTenutoBelow",between_lines:!0},"a^":{aboveCode:"articMarcatoAbove",belowCode:"articMarcatoBelow",between_lines:!1},"a+":{code:"pluckedLeftHandPizzicato",between_lines:!1},ao:{aboveCode:"pluckedSnapPizzicatoAbove",belowCode:"pluckedSnapPizzicatoBelow",between_lines:!1},ah:{code:"stringsHarmonic",between_lines:!1},"a@":{aboveCode:"fermataAbove",belowCode:"fermataBelow",between_lines:!1},"a@a":{code:"fermataAbove",between_lines:!1},"a@u":{code:"fermataBelow",between_lines:!1},"a|":{code:"stringsUpBow",between_lines:!1},am:{code:"stringsDownBow",between_lines:!1},"a,":{code:"pictChokeCymbal",between_lines:!1}},V={mordent:{code:"ornamentShortTrill"},mordent_inverted:{code:"ornamentMordent"},turn:{code:"ornamentTurn"},turn_inverted:{code:"ornamentTurnSlash"},tr:{code:"ornamentTrill"},upprall:{code:"ornamentPrecompSlideTrillDAnglebert"},downprall:{code:"ornamentPrecompDoubleCadenceUpperPrefix"},prallup:{code:"ornamentPrecompTrillSuffixDandrieu"},pralldown:{code:"ornamentPrecompTrillLowerSuffix"},upmordent:{code:"ornamentPrecompSlideTrillBach"},downmordent:{code:"ornamentPrecompDoubleCadenceUpperPrefixTurn"},lineprall:{code:"ornamentPrecompAppoggTrill"},prallprall:{code:"ornamentTremblement"},scoop:{code:"brassScoop"},doit:{code:"brassDoitMedium"},fall:{code:"brassFallLipShort"},doitLong:{code:"brassLiftMedium"},fallLong:{code:"brassFallRoughMedium"},bend:{code:"brassBend"},plungerClosed:{code:"brassMuteClosed"},plungerOpen:{code:"brassMuteOpen"},flip:{code:"brassFlip"},jazzTurn:{code:"brassJazzTurn"},smear:{code:"brassSmear"}};class K{static currentMusicFont(){if(0===K.MUSIC_FONT_STACK.length)throw new c("NoFonts","The font stack is empty. See: await Flow.fetchMusicFont(...); Flow.setMusicFont(...).");return K.MUSIC_FONT_STACK[0]}static clefProperties(t){if(!t||!(t in G))throw new c("BadArgument","Invalid clef: "+t);return G[t]}static keyProperties(t,e="treble",i){let s={octave_shift:0};"object"==typeof i&&(s=Object.assign(Object.assign({},s),i));const a=t.split("/");if(a.length<2)throw new c("BadArguments",`First argument must be note/octave or note/octave/glyph-code: ${t}`);const n=a[0].toUpperCase(),o=Y[n];if(!o)throw new c("BadArguments","Invalid key name: "+n);o.octave&&(a[1]=o.octave.toString());let l=parseInt(a[1],10);l+=-1*s.octave_shift;let r=(7*l-28+o.index)/2;r+=K.clefProperties(e).line_shift;let h=0;r<=0&&2*r%2==0&&(h=1),r>=6&&2*r%2==0&&(h=-1);const d=void 0!==o.int_val?12*l+o.int_val:void 0,b=o.code,m=o.shift_right;let g={};if(a.length>2&&a[2]){const t=a[2].toUpperCase();g=H[t]||{}}return Object.assign({key:n,octave:l,line:r,int_value:d,accidental:o.accidental,code:b,stroke:h,shift_right:m,displaced:!1},g)}static integerToNote(t){if(void 0===t||t<0||t>11)throw new c("BadArguments",`integerToNote() requires an integer in the range [0, 11]: ${t}`);const e={0:"C",1:"C#",2:"D",3:"D#",4:"E",5:"F",6:"F#",7:"G",8:"G#",9:"A",10:"A#",11:"B"}[t];if(!e)throw new c("BadArguments",`Unknown note value for integer: ${t}`);return e}static tabToGlyph(t,e=1){let i,s=0,a=0;if("X"===t.toUpperCase()){const t=new R("accidentalDoubleSharp",K.TABLATURE_FONT_SCALE).getMetrics();if(i="accidentalDoubleSharp",null==t.width||null==t.height)throw new c("InvalidMetrics","Width and height required");s=t.width,a=-t.height/2}else s=K.textWidth(t);return{text:t,code:i,getWidth:()=>s*e,shift_y:a}}static textWidth(t){return 7*t.toString().length}static articulationCodes(t){return X[t]}static accidentalCodes(t){return j[t]}static ornamentCodes(t){return V[t]}static keySignature(t){const e=W[t];if(!e)throw new c("BadKeySignature",`Bad key signature spec: '${t}'`);if(!e.acc)return[];const i={b:[2,.5,2.5,1,3,1.5,3.5],"#":[0,1.5,-.5,1,2.5,.5,2]}[e.acc],s=[];for(let t=0;tR.getWidth(a,t)}),s)}}K.STEM_WIDTH=1.5,K.STEM_HEIGHT=35,K.STAVE_LINE_THICKNESS=1,K.RESOLUTION=z,K.MUSIC_FONT_STACK=[],K.NOTATION_FONT_SCALE=39,K.TABLATURE_FONT_SCALE=39,K.SLASH_NOTEHEAD_WIDTH=15,K.STAVE_LINE_DISTANCE=10,K.TEXT_HEIGHT_OFFSET_HACK=1,K.accidentalMap=j,K.accidentalColumnsTable={1:{a:[1],b:[1]},2:{a:[1,2]},3:{a:[1,3,2],b:[1,2,1],second_on_bottom:[1,2,3]},4:{a:[1,3,4,2],b:[1,2,3,1],spaced_out_tetrachord:[1,2,1,2]},5:{a:[1,3,5,4,2],b:[1,2,4,3,1],spaced_out_pentachord:[1,2,3,2,1],very_spaced_out_pentachord:[1,2,1,2,1]},6:{a:[1,3,5,6,4,2],b:[1,2,4,5,3,1],spaced_out_hexachord:[1,3,2,1,3,2],very_spaced_out_hexachord:[1,2,1,2,1,2]}},K.unicode={sharp:String.fromCharCode(9839),flat:String.fromCharCode(9837),natural:String.fromCharCode(9838),triangle:String.fromCharCode(9651),"o-with-slash":String.fromCharCode(248),degrees:String.fromCharCode(176),circle:String.fromCharCode(9675)},K.validTypes={n:{name:"note"},r:{name:"rest"},h:{name:"harmonic"},m:{name:"muted"},s:{name:"slash"},g:{name:"ghost"}},K.TIME4_4={num_beats:4,beat_value:4,resolution:z};const $={"1/2":{common:{stem:!1,stem_offset:0,flag:!1,dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadDoubleWhole"},h:{code_head:"unpitchedPercussionClef1"},m:{code_head:"vexNoteHeadMutedBreve",stem_offset:0},r:{code_head:"restDoubleWhole",rest:!0,position:"B/5",dot_shiftY:.5},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadDoubleWhole"}}},1:{common:{stem:!1,stem_offset:0,flag:!1,dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadWhole"},h:{code_head:"noteheadDiamondWhole"},m:{code_head:"noteheadXWhole",stem_offset:-3},r:{code_head:"restWhole",rest:!0,position:"D/5",dot_shiftY:.5},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadWhole"}}},2:{common:{stem:!0,stem_offset:0,flag:!1,dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadHalf"},h:{code_head:"noteheadDiamondHalf"},m:{code_head:"noteheadXHalf",stem_offset:-3},r:{code_head:"restHalf",stem:!1,rest:!0,position:"B/4",dot_shiftY:-.5},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadHalf"}}},4:{common:{stem:!0,stem_offset:0,flag:!1,dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"restQuarter",stem:!1,rest:!0,position:"B/4",dot_shiftY:-.5,line_above:1.5,line_below:1.5},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}},8:{common:{stem:!0,stem_offset:0,flag:!0,beam_count:1,stem_beam_extension:0,code_flag_upstem:"flag8thUp",code_flag_downstem:"flag8thDown",dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"rest8th",stem:!1,flag:!1,rest:!0,position:"B/4",dot_shiftY:-.5,line_above:1,line_below:1},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}},16:{common:{beam_count:2,stem_beam_extension:0,stem:!0,stem_offset:0,flag:!0,code_flag_upstem:"flag16thUp",code_flag_downstem:"flag16thDown",dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"rest16th",stem:!1,flag:!1,rest:!0,position:"B/4",dot_shiftY:-.5,line_above:1,line_below:2},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}},32:{common:{beam_count:3,stem_beam_extension:7.5,stem:!0,stem_offset:0,flag:!0,code_flag_upstem:"flag32ndUp",code_flag_downstem:"flag32ndDown",dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"rest32nd",stem:!1,flag:!1,rest:!0,position:"B/4",dot_shiftY:-1.5,line_above:2,line_below:2},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}},64:{common:{beam_count:4,stem_beam_extension:15,stem:!0,stem_offset:0,flag:!0,code_flag_upstem:"flag64thUp",code_flag_downstem:"flag64thDown",dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"rest64th",stem:!1,flag:!1,rest:!0,position:"B/4",dot_shiftY:-1.5,line_above:2,line_below:3},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}},128:{common:{beam_count:5,stem_beam_extension:22.5,stem:!0,stem_offset:0,flag:!0,code_flag_upstem:"flag128thUp",code_flag_downstem:"flag128thDown",dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"rest128th",stem:!1,flag:!1,rest:!0,position:"B/4",dot_shiftY:-2.5,line_above:3,line_below:3},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}}};function q(...t){J.DEBUG&&m("Vex.Flow.Accidental",t)}class J extends O{constructor(t){super(),q("New accidental: ",t),this.type=t,this.position=O.Position.LEFT,this.render_options={font_scale:38,parenLeftPadding:2,parenRightPadding:2},this.accidental=K.accidentalCodes(this.type),b(this.accidental,"ArgumentError",`Unknown accidental type: ${t}`),this.cautionary=!1,this.reset()}static get CATEGORY(){return h.Accidental}static format(t,e){if(!t||0===t.length)return;const i=K.currentMusicFont(),s=i.lookupMetric("accidental.noteheadAccidentalPadding"),a=e.left_shift+s,n=i.lookupMetric("accidental.accidentalSpacing"),o=i.lookupMetric("accidental.leftPadding"),l=[];let r,h=0;for(let e=0;ee.line-t.line));const c=[];let d,b=0;for(let t=0;tb?e.shift:b,d=e.line}let m=0;for(let t=0;tc[i+t],n=t=>t.map(a),o=(t,e)=>{const[i,s]=n([t,e]).map((t=>t.line));return i-s},l=(...t)=>t.map(n).every((([t,e])=>!this.checkCollision(t,e))),r=s-i+1;let h,d,b=this.checkCollision(c[i],c[s])?"a":"b";switch(r){case 3:"a"===b&&.5===o(1,2)&&.5!==o(0,1)&&(b="second_on_bottom");break;case 4:l([0,2],[1,3])&&(b="spaced_out_tetrachord");break;case 5:"b"===b&&l([1,3])&&(b="spaced_out_pentachord",l([0,2],[2,4])&&(b="very_spaced_out_pentachord"));break;case 6:l([0,3],[1,4],[2,5])&&(b="spaced_out_hexachord"),l([0,2],[2,4],[1,3],[3,5])&&(b="very_spaced_out_hexachord")}if(r>=7){let e=2,i=!0;for(;!0===i;){i=!1;for(let t=0;t+ed?m:d}else for(h=t;h<=s;h++)d=K.accidentalColumnsTable[r][b][h-t],c[h].column=d,m=m>d?m:d;t=s}const g=[],_=[];for(let t=0;t<=m;t++)g[t]=0,_[t]=0;g[0]=b+a,_[0]=b+a,c.forEach((t=>{t.width>g[t.column]&&(g[t.column]=t.width)}));for(let t=1;t{let e=0;const i=p+t.numAcc;for(;p0?(s=e.flatLine||e.dblSharpLine?2.5:3,t.dblSharpLine&&(i-=.5)):(s=t.flatLine||t.dblSharpLine?2.5:3,e.dblSharpLine&&(i-=.5));const a=Math.abs(i){const e=new u(0,1);t.getTickables().forEach((t=>{if(t.shouldIgnoreTicks())return;const i=a[e.value()];i?i.push(t):(s.push(e.value()),a[e.value()]=[t]),e.add(t.getTicks())}))}));const n=new L;e||(e="C");const l=n.createScaleMap(e),r={};s.forEach((t=>{const e=a[t],s=[],c=t=>{if(!o(t)||t.isRest()||t.shouldIgnoreTicks())return;const e=t;e.keys.forEach(((t,a)=>{const o=n.getNoteParts(t.split("/")[0]),c=t.split("/")[1],d=o.accidental||"n",b=o.root+d;r[o.root+c]||(r[o.root+c]=l[o.root]);const m=r[o.root+c]===b,g=s.indexOf(t)>-1;if(e.getModifiers().forEach(((t,s)=>{i(t,h.Accidental)&&t.type==d&&t.getIndex()==a&&e.getModifiers().splice(s,1)})),!m||m&&g){r[o.root+c]=b;const i=new J(d);e.addModifier(i,a),s.push(t)}})),e.getModifiers().forEach((t=>{i(t,h.GraceNoteGroup)&&t.getGraceNotes().forEach(c)}))};e.forEach(c)}))}reset(){const t=this.render_options.font_scale;this.glyph=new R(this.accidental.code,t),this.glyph.setOriginX(1),this.cautionary&&(this.parenLeft=new R(K.accidentalCodes("{").code,t),this.parenRight=new R(K.accidentalCodes("}").code,t),this.parenLeft.setOriginX(1),this.parenRight.setOriginX(1))}getWidth(){if(this.cautionary){const t=b(this.parenLeft),e=b(this.parenRight),i=t.getMetrics().width+e.getMetrics().width+this.render_options.parenLeftPadding+this.render_options.parenRightPadding;return this.glyph.getMetrics().width+i}return this.glyph.getMetrics().width}setNote(t){return b(t,"ArgumentError",`Bad note value: ${t}`),this.note=t,a(t)&&(this.render_options.font_scale=25,this.reset()),this}setAsCautionary(){return this.cautionary=!0,this.render_options.font_scale=28,this.reset(),this}draw(){const{type:t,position:e,index:i,cautionary:s,x_shift:a,y_shift:n,glyph:o,render_options:{parenLeftPadding:l,parenRightPadding:r}}=this,h=this.checkContext(),c=this.checkAttachedNote();this.setRendered();const d=c.getModifierStartXY(e,i);let m=d.x+a;const g=d.y+n;if(q("Rendering: ",t,m,g),s){const t=b(this.parenLeft),e=b(this.parenRight);e.render(h,m,g),m-=e.getMetrics().width,m-=r,m-=this.accidental.parenRightPaddingAdjustment,o.render(h,m,g),m-=o.getMetrics().width,m-=l,t.render(h,m,g)}else o.render(h,m,g)}}J.DEBUG=!1;class Q extends N{constructor(t){super(),this.stem_up_y_offset=0,this.stem_down_y_offset=0,this.stem_up_y_base_offset=0,this.stem_down_y_base_offset=0,this.x_begin=(null==t?void 0:t.x_begin)||0,this.x_end=(null==t?void 0:t.x_end)||0,this.y_top=(null==t?void 0:t.y_top)||0,this.y_bottom=(null==t?void 0:t.y_bottom)||0,this.stem_extension=(null==t?void 0:t.stem_extension)||0,this.stem_direction=(null==t?void 0:t.stem_direction)||0,this.hide=(null==t?void 0:t.hide)||!1,this.isStemlet=(null==t?void 0:t.isStemlet)||!1,this.stemletHeight=(null==t?void 0:t.stemletHeight)||0,this.renderHeightAdjustment=0,this.setOptions(t)}static get CATEGORY(){return h.Stem}static get UP(){return 1}static get DOWN(){return-1}static get WIDTH(){return K.STEM_WIDTH}static get HEIGHT(){return K.STEM_HEIGHT}setOptions(t){this.stem_up_y_offset=(null==t?void 0:t.stem_up_y_offset)||0,this.stem_down_y_offset=(null==t?void 0:t.stem_down_y_offset)||0,this.stem_up_y_base_offset=(null==t?void 0:t.stem_up_y_base_offset)||0,this.stem_down_y_base_offset=(null==t?void 0:t.stem_down_y_base_offset)||0}setNoteHeadXBounds(t,e){return this.x_begin=t,this.x_end=e,this}setDirection(t){this.stem_direction=t}setExtension(t){this.stem_extension=t}getExtension(){return this.stem_extension}setYBounds(t,e){this.y_top=t,this.y_bottom=e}getHeight(){const t=this.stem_direction===Q.UP?this.stem_up_y_offset:this.stem_down_y_offset;return(this.y_bottom-this.y_top+(Q.HEIGHT-t+this.stem_extension))*this.stem_direction}getBoundingBox(){throw new c("NotImplemented","getBoundingBox() not implemented.")}getExtents(){const t=this.stem_direction===Q.UP,e=[this.y_top,this.y_bottom],i=Q.HEIGHT+this.stem_extension,s=(t?Math.min:Math.max)(...e),a=(t?Math.max:Math.min)(...e);return{topY:s+i*-this.stem_direction,baseY:a}}setVisibility(t){return this.hide=!t,this}setStemlet(t,e){return this.isStemlet=t,this.stemletHeight=e,this}adjustHeightForFlag(){this.renderHeightAdjustment=K.currentMusicFont().lookupMetric("stem.heightAdjustmentForFlag",-3)}adjustHeightForBeam(){this.renderHeightAdjustment=-Q.WIDTH/2}draw(){if(this.setRendered(),this.hide)return;const t=this.checkContext();let e,i;const s=this.stem_direction;let a=0;s===Q.DOWN?(e=this.x_begin,i=this.y_top+this.stem_down_y_offset,a=this.stem_down_y_base_offset):(e=this.x_end,i=this.y_bottom-this.stem_up_y_offset,a=this.stem_up_y_base_offset);const n=this.getHeight();!function(...t){Q.DEBUG&&m("Vex.Flow.Stem",t)}("Rendering stem - ","Top Y: ",this.y_top,"Bottom Y: ",this.y_bottom);const o=this.isStemlet?n-this.stemletHeight*this.stem_direction:0;t.save(),this.applyStyle(t),t.beginPath(),t.setLineWidth(Q.WIDTH),t.moveTo(e,i-o+a),t.lineTo(e,i-n-this.renderHeightAdjustment*s),t.stroke(),this.restoreStyle(t),t.restore()}}function Z(...t){it.DEBUG&&m("Vex.Flow.TextFormatter",t)}Q.DEBUG=!1;const tt={},et={};class it{constructor(t){this.family="",this.size=14,this.resolution=1e3,this.glyphs={},this.serifs=!1,this.monospaced=!1,this.italic=!1,this.bold=!1,this.superscriptOffset=0,this.subscriptOffset=0,this.maxSizeGlyph="H",this.cacheKey="",this.updateParams(t)}static getFontFamilies(){const t=[];for(const e in et){const i=et[e];t.push(Object.assign({},i))}return t}static create(t={}){Z("create: ",t),t.family||(t.family=E.SANS_SERIF);const e=[],i=t.family.split(/\s*,\s*/);for(const t of i){for(const i in et)i.startsWith(t)&&e.push(et[i]);if(e.length>0)break}let s;if(0===e.length)s=new it(Object.values(et)[0]);else if(1===e.length)s=new it(e[0]);else{const i=E.isBold(t.weight),a=E.isItalic(t.style),n=e.find((t=>t.bold===i&&t.italic===a));if(n)s=new it(n);else{const t=e.find((t=>t.italic===a||t.bold===i));s=new it(t||e[0])}}const a=t.size;if(void 0!==a){const t=E.convertSizeToPointValue(a);s.setFontSize(t)}return s}static getInfo(t){return et[t]}static registerInfo(t,e=!1){Z("registerInfo: ",t,e);const i=t.family;(void 0===et[i]||e)&&(et[i]=t)}updateParams(t){t.family&&(this.family=t.family),t.resolution&&(this.resolution=t.resolution),t.glyphs&&(this.glyphs=t.glyphs),t.serifs&&(this.serifs=t.serifs),t.monospaced&&(this.monospaced=t.monospaced),t.italic&&(this.italic=t.italic),t.bold&&(this.bold=t.bold),t.maxSizeGlyph&&(this.maxSizeGlyph=t.maxSizeGlyph),t.superscriptOffset&&(this.superscriptOffset=t.superscriptOffset),t.subscriptOffset&&(this.subscriptOffset=t.subscriptOffset),this.updateCacheKey()}updateCacheKey(){const t=this.family.replace(/\s+/g,"_"),e=this.size,i=this.bold?T.BOLD:T.NORMAL,s=this.italic?w.ITALIC:w.NORMAL;this.cacheKey=`${t}%${e}%${i}%${s}`}getGlyphMetrics(t){return this.glyphs[t]?this.glyphs[t]:this.glyphs[this.maxSizeGlyph]}get maxHeight(){return this.getGlyphMetrics(this.maxSizeGlyph).ha/this.resolution*this.fontSizeInPixels}getWidthForCharacterInEm(t){var e;const i=this.getGlyphMetrics(t);if(i){return(null!==(e=i.advanceWidth)&&void 0!==e?e:0)/this.resolution}return.65}getWidthForTextInEm(t){const e=this.cacheKey;let i=tt[e];void 0===i&&(i={},tt[e]=i);let s=i[t];if(void 0===s){s=0;for(let e=0;et>e?t:e)),h+=(this.text_line+1)*K.STAVE_LINE_DISTANCE+l,b&&i===Q.DOWN&&(h=Math.max(h,c.topY+l+d*this.text_line))}else if(this.verticalJustification===at.CENTER){const t=e.getYForTopText(this.text_line)-1;h=t+(g.getYForBottomText(this.text_line)-t)/2+l/2}else if(this.verticalJustification===at.TOP)h=e.getYs()[0]-(this.text_line+1)*K.STAVE_LINE_DISTANCE,b&&i===Q.UP&&(d=c.topY=1}function ct(t,e){return ht(t,e)?e===ot?Math.ceil:Math.floor:Math.round}const dt=t=>o(t)||a(t);class bt extends O{constructor(t){super(),this.type=t,this.position=lt,this.render_options={font_scale:38},this.reset()}static get CATEGORY(){return h.Articulation}static format(t,e){if(!t||0===t.length)return!1;const i=(t,e,i)=>rt(ct(e,i),b(t.glyph.getMetrics().height)/10+.5);t.forEach((t=>{const s=t.checkAttachedNote();let a=5;const n=s.hasStem()?s.getStemDirection():Q.UP;let o=0;if(l(s)){const t=s.getStem();t&&(o=Math.abs(t.getHeight())/K.STAVE_LINE_DISTANCE)}const r=s.getStave();if(r&&(a=r.getNumLines()),t.getPosition()===ot){let l=s.getLineNumber(!0);n===Q.UP&&(l+=o);let r=i(t,e.top_text_line,ot);const h=l+e.top_text_line+.5;!t.articulation.between_lines&&ht.getWidth())).reduce(((t,e)=>Math.max(e,t)));return e.left_shift+=s/2,e.right_shift+=s/2,!0}static easyScoreHook({articulations:t},e,i){if(!t)return;const s={staccato:"a.",tenuto:"a-",accent:"a>"};t.split(",").map((t=>t.trim().split("."))).map((([t,e])=>{const a={type:s[t]};return e&&(a.position=O.PositionString[e]),i.getFactory().Articulation(a)})).map((t=>e.addModifier(t,0)))}reset(){this.articulation=K.articulationCodes(this.type);const t=b(this.articulation,"ArgumentError",`Articulation not found: ${this.type}`),e=(this.position===ot?t.aboveCode:t.belowCode)||t.code;this.glyph=new R(null!=e?e:"",this.render_options.font_scale),this.setWidth(b(this.glyph.getMetrics().width))}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=this.checkIndex(),{position:s,glyph:a,text_line:n}=this,o=this.articulation.between_lines,l=e.checkStave(),h=l.getSpacingBetweenLines(),d=r(e),{x:b}=e.getModifierStartXY(s,i),g=!o||d,_=function(t,e){const i=e===ot&&t.getStemDirection()===Q.UP||e===lt&&t.getStemDirection()===Q.DOWN;return dt(t)?t.hasStem()&&i?.5:1:t.hasStem()&&i?1:0}(e,s),x=K.currentMusicFont().lookupMetric(`articulation.${a.getCode()}.padding`,0);let p={[ot]:()=>{a.setOrigin(.5,1);const t=function(t,e){const i=t.getStemDirection(),{topY:s,baseY:a}=t.getStemExtents();if(dt(t))return t.hasStem()?i===Q.UP?s:a:Math.min(...t.getYs());if(r(t))return t.hasStem()&&i===Q.UP?s:t.checkStave().getYForTopText(e);throw new c("UnknownCategory","Only can get the top and bottom ys of stavenotes and tabnotes")}(e,n)-(n+_)*h;return g?Math.min(l.getYForTopText(bt.INITIAL_OFFSET),t):t},[lt]:()=>{a.setOrigin(.5,0);const t=function(t,e){const i=t.getStemDirection(),{topY:s,baseY:a}=t.getStemExtents();if(dt(t))return t.hasStem()?i===Q.UP?a:s:Math.max(...t.getYs());if(r(t))return t.hasStem()?i===Q.UP?t.checkStave().getYForBottomText(e):s:t.checkStave().getYForBottomText(e);throw new c("UnknownCategory","Only can get the top and bottom ys of stavenotes and tabnotes")}(e,n)+(n+_)*h;return g?Math.max(l.getYForBottomText(bt.INITIAL_OFFSET),t):t}}[s]();if(!d){const t=s===ot?-1:1,n=e.getKeyProps()[i].line,l=(e.getYs()[i]-p)/h+Number(n),r=function(t,e,i,s){const a=rt(ct(e,i),e);if(t&&ht(a,i)&&a%1==0)return a+.5*-s;return a}(o,l,s,t);ht(r,s)&&a.setOrigin(.5,.5),p+=Math.abs(r-l)*h*t+x*t}!function(...t){bt.DEBUG&&m("Vex.Flow.Articulation",t)}(`Rendering articulation at (x: ${b}, y: ${p})`),a.render(t,b,p)}}bt.DEBUG=!1,bt.INITIAL_OFFSET=-.5;class mt{static get CATEGORY(){return h.RenderContext}set font(t){this.setFont(t)}get font(){return this.getFont()}setRawFont(t){return this.setFont(t),this}}class gt extends N{constructor(){super(),this._preFormatted=!1,this._postFormatted=!1,this.ticks=new u(0,1),this.intrinsicTicks=0,this.tickMultiplier=new u(1,1),this.width=0,this.x_shift=0,this.modifiers=[],this.tupletStack=[],this.align_center=!1,this.center_x_shift=0,this.ignore_ticks=!1,this.formatterMetrics={freedom:{left:0,right:0},duration:"",iterations:0,space:{used:0,mean:0,deviation:0}}}static get CATEGORY(){return h.Tickable}reset(){return this}getTicks(){return this.ticks}shouldIgnoreTicks(){return this.ignore_ticks}setIgnoreTicks(t){return this.ignore_ticks=t,this}setWidth(t){this.width=t}getWidth(){if(!this._preFormatted)throw new c("UnformattedNote","Can't call GetWidth on an unformatted note.");return this.width+(this.modifierContext?this.modifierContext.getWidth():0)}setXShift(t){return this.x_shift=t,this}getXShift(){return this.x_shift}getX(){return this.checkTickContext("Can't getX() without a TickContext.").getX()+this.x_shift}getFormatterMetrics(){return this.formatterMetrics}getCenterXShift(){return this.isCenterAligned()?this.center_x_shift:0}setCenterXShift(t){return this.center_x_shift=t,this}isCenterAligned(){return this.align_center}setCenterAlignment(t){return this.align_center=t,this}getVoice(){return b(this.voice,"NoVoice","Tickable has no voice.")}setVoice(t){this.voice=t}getTuplet(){return this.tuplet}getTupletStack(){return this.tupletStack}resetTuplet(t){let e,i;if(t){const s=this.tupletStack.indexOf(t);return-1!==s&&(this.tupletStack.splice(s,1),e=t.getNoteCount(),i=t.getNotesOccupied(),this.applyTickMultiplier(e,i)),this}for(;this.tupletStack.length;)e=(t=this.tupletStack.pop()).getNoteCount(),i=t.getNotesOccupied(),this.applyTickMultiplier(e,i);return this}setTuplet(t){if(t){this.tupletStack.push(t);const e=t.getNoteCount(),i=t.getNotesOccupied();this.applyTickMultiplier(i,e)}return this.tuplet=t,this}addToModifierContext(t){this.modifierContext=t;for(let t=0;tK.getGlyphProps(this.duration,t))),this.playNote=void 0,this.ignore_ticks=!1,this.width=0,this.leftDisplacedHeadPx=0,this.rightDisplacedHeadPx=0,this.x_shift=0,this.ys=[],t.align_center&&this.setCenterAlignment(t.align_center),this.render_options={annotation_spacing:5,glyph_font_scale:1,stroke_px:1,scale:1,font:"",y_shift:0}}static get CATEGORY(){return h.Note}static plotMetrics(t,e,i){const s=e.getMetrics(),a=e.getAbsoluteX()-s.modLeftPx-s.leftDisplacedHeadPx,n=e.getAbsoluteX()-s.leftDisplacedHeadPx,o=e.getAbsoluteX(),l=e.getAbsoluteX()+s.notePx,r=e.getAbsoluteX()+s.notePx+s.rightDisplacedHeadPx,h=e.getAbsoluteX()+s.notePx+s.rightDisplacedHeadPx+s.modRightPx,c=h+(e.getFormatterMetrics().freedom.right||0),d=h-a;t.save(),t.setFont(E.SANS_SERIF,8),t.fillText(Math.round(d)+"px",a+e.getXShift(),i);const b=i+7;function m(i,s,a,n=b){t.beginPath(),t.setStrokeStyle(a),t.setFillStyle(a),t.setLineWidth(3),t.moveTo(i+e.getXShift(),n),t.lineTo(s+e.getXShift(),n),t.stroke()}m(a,n,"red"),m(n,o,"#999"),m(o,l,"green"),m(l,r,"#999"),m(r,h,"red"),m(h,c,"#DD0"),m(a-e.getXShift(),a,"#BBB"),function(t,e,i,s="#F55"){t.save(),t.setFillStyle(s),t.beginPath(),t.arc(e,i,3,0,2*Math.PI,!0),t.closePath(),t.fill(),t.restore()}(t,o+e.getXShift(),b,"blue");const g=e.getFormatterMetrics();if(g.iterations>0){const s=g.space.deviation,a=s>=0?"+":"";t.setFillStyle("red"),t.fillText(a+Math.round(s),o+e.getXShift(),i-10)}t.restore()}static parseDuration(t){if(!t)return;const e=/(\d*\/?\d+|[a-z])(d*)([nrhms]|$)/.exec(t);if(!e)return;return{duration:e[1],dots:e[2].length,type:e[3]||"n"}}static parseNoteStruct(t){const e=_t.parseDuration(t.duration);if(!e)return;let i=t.type;if(i&&!K.validTypes[i])return;const s=[];i||(i=e.type||"n",void 0!==t.keys&&t.keys.forEach(((t,e)=>{const a=t.split("/");s[e]=a&&3===a.length?a[2]:i})));let a=K.durationToTicks(e.duration);if(!a)return;const n=t.dots?t.dots:e.dots;if("number"!=typeof n)return;let o=a;for(let t=0;t0}hasStem(){return!1}getNoteType(){return this.noteType}getBeam(){return this.beam}checkBeam(){return b(this.beam,"NoBeam","No beam attached to instance")}hasBeam(){return null!=this.beam}setBeam(t){return this.beam=t,this}addModifier(t,e=0){const i="Note.addModifier(modifier: Modifier, index: number=0)";if("string"==typeof e&&(e=parseInt(e),console.warn(i+" expected a number for `index`, but received a string.")),"object"!=typeof t||"number"!=typeof e)throw new c("WrongParams","Incorrect call signature. Use "+i+" instead.");return t.setNote(this),t.setIndex(e),super.addModifier(t),this}getModifiersByType(t){return this.checkModifierContext().getMembers(t)}getModifierStartXY(t,e,i){if(!this.preFormatted)throw new c("UnformattedNote","Can't call GetModifierStartXY on an unformatted note");return{x:this.getAbsoluteX(),y:this.ys[0]}}getRightParenthesisPx(t){return this.getKeyProps()[t].displaced?this.getRightDisplacedHeadPx():0}getLeftParenthesisPx(t){return this.getKeyProps()[t].displaced?this.getLeftDisplacedHeadPx():0}getFirstDotPx(){let t=this.getRightDisplacedHeadPx();return 0!==this.checkModifierContext().getMembers("Parenthesis").length&&(t+=K.currentMusicFont().lookupMetric("parenthesis.default.width")),t}getMetrics(){if(!this.preFormatted)throw new c("UnformattedNote","Can't call getMetrics on an unformatted note.");const t=this.modifierContext?this.modifierContext.getState().left_shift:0,e=this.modifierContext?this.modifierContext.getState().right_shift:0,i=this.getWidth();return{width:i,glyphWidth:this.getGlyphWidth(),notePx:i-t-e-this.leftDisplacedHeadPx-this.rightDisplacedHeadPx,modLeftPx:t,modRightPx:e,leftDisplacedHeadPx:this.leftDisplacedHeadPx,rightDisplacedHeadPx:this.rightDisplacedHeadPx,glyphPx:0}}getAbsoluteX(){let t=this.checkTickContext("Can't getAbsoluteX() without a TickContext.").getX();return this.stave&&(t+=this.stave.getNoteStartX()+K.currentMusicFont().lookupMetric("stave.padding")),this.isCenterAligned()&&(t+=this.getCenterXShift()),t}getStemDirection(){throw new c("NoStem","No stem attached to this note.")}getStemExtents(){throw new c("NoStem","No stem attached to this note.")}getTieRightX(){let t=this.getAbsoluteX();return t+=this.glyph.getWidth()/2,t+=-this.width/2+this.width+2,t}getTieLeftX(){let t=this.getAbsoluteX();return t+=this.glyph.getWidth()/2,t-=this.width/2+2,t}getKeys(){return this.keys}getKeyProps(){return this.keyProps}}var xt,pt,ut,ft,yt,St,Tt;!function(t){t[t.CENTER=0]="CENTER",t[t.LEFT=1]="LEFT",t[t.RIGHT=2]="RIGHT",t[t.ABOVE=3]="ABOVE",t[t.BELOW=4]="BELOW",t[t.BEGIN=5]="BEGIN",t[t.END=6]="END"}(xt||(xt={}));class wt extends N{constructor(){super(),this.width=0,this.x=0,this.padding=10,this.position=xt.ABOVE}static get CATEGORY(){return h.StaveModifier}static get Position(){return xt}getPosition(){return this.position}setPosition(t){return this.position=t,this}getStave(){return this.stave}checkStave(){return b(this.stave,"NoStave","No stave attached to instance.")}setStave(t){return this.stave=t,this}getWidth(){return this.width}setWidth(t){return this.width=t,this}getX(){return this.x}setX(t){return this.x=t,this}placeGlyphOnLine(t,e,i,s=0){t.setYShift(e.getYForLine(null!=i?i:0)-e.getYForGlyphs()+s)}getPadding(t){return void 0!==t&&t<2?0:this.padding}setPadding(t){return this.padding=t,this}setLayoutMetrics(t){return this.layoutMetrics=t,this}getLayoutMetrics(){return this.layoutMetrics}draw(...t){}}!function(t){t[t.SINGLE=1]="SINGLE",t[t.DOUBLE=2]="DOUBLE",t[t.END=3]="END",t[t.REPEAT_BEGIN=4]="REPEAT_BEGIN",t[t.REPEAT_END=5]="REPEAT_END",t[t.REPEAT_BOTH=6]="REPEAT_BOTH",t[t.NONE=7]="NONE"}(pt||(pt={}));class vt extends wt{constructor(t){super(),this.thickness=K.STAVE_LINE_THICKNESS;const e=pt;this.widths={},this.widths[e.SINGLE]=5,this.widths[e.DOUBLE]=5,this.widths[e.END]=5,this.widths[e.REPEAT_BEGIN]=5,this.widths[e.REPEAT_END]=5,this.widths[e.REPEAT_BOTH]=5,this.widths[e.NONE]=5,this.paddings={},this.paddings[e.SINGLE]=0,this.paddings[e.DOUBLE]=0,this.paddings[e.END]=0,this.paddings[e.REPEAT_BEGIN]=15,this.paddings[e.REPEAT_END]=15,this.paddings[e.REPEAT_BOTH]=15,this.paddings[e.NONE]=0,this.layoutMetricsMap={},this.layoutMetricsMap[e.SINGLE]={xMin:0,xMax:1,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.DOUBLE]={xMin:-3,xMax:1,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.END]={xMin:-5,xMax:1,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.REPEAT_END]={xMin:-10,xMax:1,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.REPEAT_BEGIN]={xMin:-2,xMax:10,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.REPEAT_BOTH]={xMin:-10,xMax:10,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.NONE]={xMin:0,xMax:0,paddingLeft:5,paddingRight:5},this.setPosition(xt.BEGIN),this.setType(t)}static get CATEGORY(){return h.Barline}static get type(){return pt}static get typeString(){return{single:pt.SINGLE,double:pt.DOUBLE,end:pt.END,repeatBegin:pt.REPEAT_BEGIN,repeatEnd:pt.REPEAT_END,repeatBoth:pt.REPEAT_BOTH,none:pt.NONE}}getType(){return this.type}setType(t){return this.type="string"==typeof t?vt.typeString[t]:t,this.setWidth(this.widths[this.type]),this.setPadding(this.paddings[this.type]),this.setLayoutMetrics(this.layoutMetricsMap[this.type]),this}draw(t){switch(t.checkContext(),this.setRendered(),this.type){case pt.SINGLE:this.drawVerticalBar(t,this.x,!1);break;case pt.DOUBLE:this.drawVerticalBar(t,this.x,!0);break;case pt.END:this.drawVerticalEndBar(t,this.x);break;case pt.REPEAT_BEGIN:this.drawRepeatBar(t,this.x,!0),t.getX()!==this.x&&this.drawVerticalBar(t,t.getX());break;case pt.REPEAT_END:this.drawRepeatBar(t,this.x,!1);break;case pt.REPEAT_BOTH:this.drawRepeatBar(t,this.x,!1),this.drawRepeatBar(t,this.x,!0)}}drawVerticalBar(t,e,i){const s=t.checkContext(),a=t.getTopLineTopY(),n=t.getBottomLineBottomY();i&&s.fillRect(e-3,a,1,n-a),s.fillRect(e,a,1,n-a)}drawVerticalEndBar(t,e){const i=t.checkContext(),s=t.getTopLineTopY(),a=t.getBottomLineBottomY();i.fillRect(e-5,s,1,a-s),i.fillRect(e-2,s,3,a-s)}drawRepeatBar(t,e,i){const s=t.checkContext(),a=t.getTopLineTopY(),n=t.getBottomLineBottomY();let o=3;i||(o=-5),s.fillRect(e+o,a,1,n-a),s.fillRect(e-2,a,3,n-a);i?o+=4:o-=4;const l=e+o+1;let r=(t.getNumLines()-1)*t.getSpacingBetweenLines();r=r/2-t.getSpacingBetweenLines()/2;let h=a+r+1;s.beginPath(),s.arc(l,h,2,0,2*Math.PI,!1),s.fill(),h+=t.getSpacingBetweenLines(),s.beginPath(),s.arc(l,h,2,0,2*Math.PI,!1),s.fill()}}class Dt extends _t{constructor(t=pt.SINGLE){super({duration:"b"}),this.metrics={widths:{}};const e=pt;this.metrics.widths={[e.SINGLE]:8,[e.DOUBLE]:12,[e.END]:15,[e.REPEAT_BEGIN]:14,[e.REPEAT_END]:14,[e.REPEAT_BOTH]:18,[e.NONE]:0},this.ignore_ticks=!0,this.setType(t)}static get CATEGORY(){return h.BarNote}getType(){return this.type}setType(t){return this.type="string"==typeof t?vt.typeString[t]:t,this.setWidth(this.metrics.widths[this.type]),this}addToModifierContext(t){return this}preFormat(){return this.preFormatted=!0,this}draw(){const t=this.checkContext();!function(...t){Dt.DEBUG&&m("Vex.Flow.BarNote",t)}("Rendering bar line at: ",this.getAbsoluteX()),this.style&&this.applyStyle(t);const e=new vt(this.type);e.setX(this.getAbsoluteX()),e.draw(this.checkStave()),this.style&&this.restoreStyle(t),this.setRendered()}}Dt.DEBUG=!1;class Ct extends O{constructor(t,e=!1,i){super(),this.text=t,this.x_shift=0,this.release=e,this.tap="",this.resetFont(),this.render_options={line_width:1.5,line_style:"#777777",bend_width:8,release_width:8},i?this.phrase=i:(this.phrase=[{type:Ct.UP,text:this.text}],this.release&&this.phrase.push({type:Ct.DOWN,text:""})),this.updateWidth()}static get CATEGORY(){return h.Bend}static get UP(){return 0}static get DOWN(){return 1}static format(t,e){if(!t||0===t.length)return!1;let i=0;for(let s=0;st{const n=t+s,o=i;e.save(),e.beginPath(),e.setLineWidth(this.render_options.line_width),e.setStrokeStyle(this.render_options.line_style),e.setFillStyle(this.render_options.line_style),e.moveTo(t,i),e.quadraticCurveTo(n,o,t+s,a),e.stroke(),e.restore()},d=(t,i,s,a)=>{e.save(),e.beginPath(),e.setLineWidth(this.render_options.line_width),e.setStrokeStyle(this.render_options.line_style),e.setFillStyle(this.render_options.line_style),e.moveTo(t,a),e.quadraticCurveTo(t+s,a,t+s,i),e.stroke(),e.restore()},b=(t,i,s)=>{const a=i+4*s;e.beginPath(),e.moveTo(t,i),e.lineTo(t-4,a),e.lineTo(t+4,a),e.closePath(),e.fill()},m=(t,i)=>{e.save(),e.setFont(this.textFont);const s=t-e.measureText(i).width/2;e.fillText(i,s,r),e.restore()};let g,_=0,x=0;if(null===(t=this.tap)||void 0===t?void 0:t.length){m(i.getModifierStartXY(O.Position.CENTER,this.index).x,this.tap)}for(let t=0;t0){const e=o.symbolBlocks[t-1];kt.isSuperscript(e)||(a=s)}n&&a>0&&(c=!0,e.xShift=e.xShift+(a-s),s=a,a=0,o.setEnableKerning(!1)),i||n||(a=0),e.vAlign=c,s+=e.width}o.updateKerningAdjustments(),o.updateOverBarAdjustments(),o.getVertical()===ft.TOP?(o.setTextLine(e.top_text_line),e.top_text_line+=h):(o.setTextLine(e.text_line+1),e.text_line+=h+1),o.getReportWidth()?n.push(s):n.push(0)}return s=n.reduce(((t,e)=>t+e),0),e.left_shift+=s/2,e.right_shift+=s/2,!0}static get TEXT_FONT(){let t="Roboto Slab, Times, serif";return"Petaluma"===K.currentMusicFont().getName()&&(t="PetalumaScript, Arial, sans-serif"),{family:t,size:12,weight:T.NORMAL,style:w.NORMAL}}get superscriptOffset(){return kt.superscriptOffset*this.textFormatter.fontSizeInPixels}get subscriptOffset(){return kt.subscriptOffset*this.textFormatter.fontSizeInPixels}setReportWidth(t){return this.reportWidth=t,this}getReportWidth(){return this.reportWidth}updateOverBarAdjustments(){const t=this.symbolBlocks.findIndex((({symbolType:t,glyph:e})=>t===yt.GLYPH&&void 0!==e&&"csymDiagonalArrangementSlash"===e.code));if(t<0)return;const e=this.symbolBlocks[t].width/4,i=.25*this.textFormatter.fontSizeInPixels;let s=0;for(;s0?this.symbolBlocks[t-1]:void 0;let s=0;e.symbolType===yt.GLYPH&&void 0!==e.glyph&&e.glyph.code===kt.glyphs.over.code&&(s+=e.glyph.metrics.x_shift),void 0!==i&&i.symbolType===yt.GLYPH&&void 0!==i.glyph&&i.glyph.code===kt.glyphs.over.code&&(s+=i.glyph.metrics.x_shift);let a=!1,n=!1;void 0!==i&&i.symbolType===yt.TEXT&&(a=kt.upperKerningText.some((t=>t===i.text[i.text.length-1])),n=kt.lowerKerningText.some((t=>t===i.text[i.text.length-1])));const o=kt.kerningOffset*this.textFormatter.fontSizeInPixels;return a&&e.symbolModifier===St.SUPERSCRIPT&&(s+=o),n&&e.symbolType===yt.TEXT&&(e.text[0]>="a"&&e.text[0]<="z"&&(s+=o/2),kt.upperKerningText.some((t=>t===(null==i?void 0:i.text[i.text.length-1])))&&(s+=o/2)),s}getSymbolBlock(t={}){var e,i,s;const a=null!==(e=t.symbolType)&&void 0!==e?e:yt.TEXT,n={text:null!==(i=t.text)&&void 0!==i?i:"",symbolType:a,symbolModifier:null!==(s=t.symbolModifier)&&void 0!==s?s:St.NONE,xShift:0,yShift:0,vAlign:!1,width:0};if(a===yt.GLYPH&&"string"==typeof t.glyph){const e=kt.glyphs[t.glyph],i=20;n.glyph=new R(e.code,i,{category:"chordSymbol"})}else a===yt.TEXT?n.width=this.textFormatter.getWidthForTextInEm(n.text):a===yt.LINE&&(n.width=t.width);return n}addSymbolBlock(t){return this.symbolBlocks.push(this.getSymbolBlock(t)),this}addText(t,e={}){const i=yt.TEXT;return this.addSymbolBlock(Object.assign(Object.assign({},e),{text:t,symbolType:i}))}addTextSuperscript(t){const e=yt.TEXT,i=St.SUPERSCRIPT;return this.addSymbolBlock({text:t,symbolType:e,symbolModifier:i})}addTextSubscript(t){const e=yt.TEXT,i=St.SUBSCRIPT;return this.addSymbolBlock({text:t,symbolType:e,symbolModifier:i})}addGlyphSuperscript(t){const e=yt.GLYPH,i=St.SUPERSCRIPT;return this.addSymbolBlock({glyph:t,symbolType:e,symbolModifier:i})}addGlyph(t,e={}){const i=yt.GLYPH;return this.addSymbolBlock(Object.assign(Object.assign({},e),{glyph:t,symbolType:i}))}addGlyphOrText(t,e={}){let i="";for(let s=0;s0&&(this.addText(i,e),i=""),this.addGlyph(a,e)):i+=a}return i.length>0&&this.addText(i,e),this}addLine(t,e={}){const i=yt.LINE;return this.addSymbolBlock(Object.assign(Object.assign({},e),{symbolType:i,width:t}))}setFont(t,e,i,s){return super.setFont(t,e,i,s),this.textFormatter=it.create(this.textFont),this}setEnableKerning(t){return this.useKerning=t,this}setVertical(t){return this.vertical="string"==typeof t?kt.VerticalJustifyString[t]:t,this}getVertical(){return this.vertical}setHorizontal(t){return this.horizontal="string"==typeof t?kt.HorizontalJustifyString[t]:t,this}getHorizontal(){return this.horizontal}getWidth(){let t=0;return this.symbolBlocks.forEach((e=>{t+=e.vAlign?0:e.width})),t}getYOffsetForText(t){var e;let i=0,s=0;for(s=0;s0?i/a*-1:0}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered(),t.save();const i=Object.keys(this.getAttribute("classes")).join(" ");t.openGroup(i,this.getAttribute("id"));const s=e.getModifierStartXY(O.Position.ABOVE,this.index);let a;t.setFont(this.textFont);const n=e.hasStem(),o=e.checkStave();if(this.vertical===ft.BOTTOM){if(a=o.getYForBottomText(this.text_line+K.TEXT_HEIGHT_OFFSET_HACK),n){const t=e.checkStem().getExtents(),i=o.getSpacingBetweenLines(),s=1===e.getStemDirection()?t.baseY:t.topY;a=Math.max(a,s+i*(this.text_line+2))}}else if(a=Math.min(o.getYForTopText(this.text_line),e.getYs()[0]-10),n){const t=e.checkStem().getExtents(),i=o.getSpacingBetweenLines();a=Math.min(a,t.topY-5-i*this.text_line)}let l=s.x;l=this.horizontal===ut.LEFT?s.x:this.horizontal===ut.RIGHT?s.x+this.getWidth():this.horizontal===ut.CENTER?s.x-this.getWidth()/2:e.getStemX()-this.getWidth()/2,Et("Rendering ChordSymbol: ",this.textFormatter,l,a),this.symbolBlocks.forEach((e=>{const i=kt.isSuperscript(e),s=kt.isSubscript(e);let n=a;if(Et("shift was ",e.xShift,e.yShift),Et("curY pre sub ",n),i&&(n+=this.superscriptOffset),s&&(n+=this.subscriptOffset),Et("curY sup/sub ",n),e.symbolType===yt.TEXT){if((i||s)&&(t.save(),this.textFont)){const{family:e,size:i,weight:s,style:a}=this.textFont,n=E.scaleSize(i,kt.superSubRatio);t.setFont(e,n,s,a)}Et("Rendering Text: ",e.text,l+e.xShift,n+e.yShift),t.fillText(e.text,l+e.xShift,n+e.yShift),(i||s)&&t.restore()}else e.symbolType===yt.GLYPH&&e.glyph?(n+=e.yShift,Et("Rendering Glyph: ",e.glyph.code,l+e.xShift,n),e.glyph.render(t,l+e.xShift,n)):e.symbolType===yt.LINE&&(Et("Rendering Line : ",e.width,l,n),t.beginPath(),t.setLineWidth(1),t.moveTo(l,a),t.lineTo(l+e.width,n),t.stroke());l+=e.width,e.vAlign&&(l+=e.xShift)})),t.closeGroup(),t.restore()}}kt.DEBUG=!1,kt.HorizontalJustify=ut,kt.HorizontalJustifyString={left:ut.LEFT,right:ut.RIGHT,center:ut.CENTER,centerStem:ut.CENTER_STEM},kt.VerticalJustify=ft,kt.VerticalJustifyString={top:ft.TOP,above:ft.TOP,below:ft.BOTTOM,bottom:ft.BOTTOM},kt.glyphs={diminished:{code:"csymDiminished"},dim:{code:"csymDiminished"},halfDiminished:{code:"csymHalfDiminished"},"+":{code:"csymAugmented"},augmented:{code:"csymAugmented"},majorSeventh:{code:"csymMajorSeventh"},minor:{code:"csymMinor"},"-":{code:"csymMinor"},"(":{code:"csymParensLeftTall"},leftParen:{code:"csymParensLeftTall"},")":{code:"csymParensRightTall"},rightParen:{code:"csymParensRightTall"},leftBracket:{code:"csymBracketLeftTall"},rightBracket:{code:"csymBracketRightTall"},leftParenTall:{code:"csymParensLeftVeryTall"},rightParenTall:{code:"csymParensRightVeryTall"},"/":{code:"csymDiagonalArrangementSlash"},over:{code:"csymDiagonalArrangementSlash"},"#":{code:"accidentalSharp"},b:{code:"accidentalFlat"}},kt.symbolTypes=yt,kt.symbolModifiers=St,kt.noFormat=!1;class Ft extends O{constructor(){super(),this.position=O.Position.RIGHT,this.radius=2,this.setWidth(5),this.dot_shiftY=0}static get CATEGORY(){return h.Dot}static getDots(t){return t.getModifiersByType(Ft.CATEGORY)}static buildAndAttach(t,e){for(const i of t)if(null==e?void 0:e.all)for(let t=0;te.line-t.line));let n=i,l=0,h=null,d=null,b=null,m=0;for(let t=0;tl?n:l,h=r,d=i}return e.right_shift+=l,!0}setNote(t){return this.note=t,a(t)&&(this.radius*=.5,this.setWidth(3)),this}setDotShiftY(t){return this.dot_shiftY=t,this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.checkStave().getSpacingBetweenLines(),s=e.getModifierStartXY(this.position,this.index,{forceFlagRight:!0});r(e)&&(s.y=e.getStemExtents().baseY);const a=s.x+this.x_shift+this.width-this.radius,n=s.y+this.y_shift+this.dot_shiftY*i;t.beginPath(),t.arc(a,n,this.radius,0,2*Math.PI,!1),t.fill()}}class Nt extends O{constructor(t){super(),this.finger=t,this.width=7,this.position=O.Position.LEFT,this.x_shift=0,this.y_shift=0,this.x_offset=0,this.y_offset=0,this.resetFont()}static get CATEGORY(){return h.FretHandFinger}static format(t,e){const{left_shift:i,right_shift:s}=e;if(!t||0===t.length)return!1;const a=[];let n=null,o=0,l=0;for(let r=0;re.line-t.line));let r=0,h=0,c=0,d=0,b=null,m=null;for(let t=0;tc?e:c):o===O.Position.RIGHT&&(g.setXShift(h),e=l+u,d=e>d?e:d),b=_,m=n}return e.left_shift+=c,e.right_shift+=d,!0}static easyScoreHook({fingerings:t}={},e,i){null==t||t.split(",").map((t=>{const e=t.trim().split("."),s={number:e[0]};return e[1]&&(s.position=e[1]),i.getFactory().Fingering(s)})).map(((t,i)=>e.addModifier(t,i)))}setFretHandFinger(t){return this.finger=t,this}getFretHandFinger(){return this.finger}setOffsetX(t){return this.x_offset=t,this}setOffsetY(t){return this.y_offset=t,this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.getModifierStartXY(this.position,this.index);let s=i.x+this.x_shift+this.x_offset,a=i.y+this.y_shift+this.y_offset+5;switch(this.position){case O.Position.ABOVE:s-=4,a-=12;break;case O.Position.BELOW:s-=2,a+=10;break;case O.Position.LEFT:s-=this.width;break;case O.Position.RIGHT:s+=1;break;default:throw new c("InvalidPosition",`The position ${this.position} does not exist`)}t.save(),t.setFont(this.textFont),t.fillText(""+this.finger,s,a),t.restore()}}Nt.TEXT_FONT={family:E.SANS_SERIF,size:9,weight:T.BOLD,style:w.NORMAL};class At extends N{constructor(t,e){super(),this.setNotes(t),this.text=e,this.render_options={cp1:8,cp2:12,text_shift_x:0,first_x_shift:0,last_x_shift:0,y_shift:7,tie_spacing:0},this.resetFont()}static get CATEGORY(){return h.StaveTie}setDirection(t){return this.direction=t,this}setNotes(t){if(!t.first_note&&!t.last_note)throw new c("BadArguments","Tie needs to have either first_note or last_note set.");if(t.first_indices||(t.first_indices=[0]),t.last_indices||(t.last_indices=[0]),t.first_indices.length!==t.last_indices.length)throw new c("BadArguments","Tied notes must have same number of indices.");return this.notes=t,this}isPartial(){return!this.notes.first_note||!this.notes.last_note}renderTie(t){if(0===t.first_ys.length||0===t.last_ys.length)throw new c("BadArguments","No Y-values to render");const e=this.checkContext();let i=this.render_options.cp1,s=this.render_options.cp2;Math.abs(t.last_x_px-t.first_x_px)<10&&(i=2,s=8);const a=this.render_options.first_x_shift,n=this.render_options.last_x_shift,o=this.render_options.y_shift*t.direction,l=this.notes.first_indices,r=this.notes.last_indices;for(let h=0;hMath.pow(this.options.softmaxFactor,e.getTicks().value()/t))).reduce(((t,e)=>t+e),0),this.expTicksUsed}softmax(t){this.expTicksUsed||(this.expTicksUsed=this.reCalculateExpTicksUsed());const e=this.ticksUsed.value();return(t=>Math.pow(this.options.softmaxFactor,t/e))(t)/this.expTicksUsed}addTickable(t){if(!t.shouldIgnoreTicks()){const e=t.getTicks();if(this.ticksUsed.add(e),this.expTicksUsed=0,(this.mode===Tt.STRICT||this.mode===Tt.FULL)&&this.ticksUsed.greaterThan(this.totalTicks))throw this.ticksUsed.subtract(e),new c("BadArgument","Too many ticks.");e.lessThan(this.smallestTickCount)&&(this.smallestTickCount=e.clone()),this.resolutionMultiplier=this.ticksUsed.denominator,this.totalTicks.add(0,this.ticksUsed.denominator)}return this.tickables.push(t),t.setVoice(this),this}addTickables(t){for(let e=0;e{e.getStave()||e.setStave(t)})),this.preFormatted=!0,this}checkStave(){return b(this.stave,"NoStave","No stave attached to instance.")}draw(t=this.checkContext(),e){let i;e=null!=e?e:this.stave,this.setRendered();for(let s=0;s1){const e=new Fe(t);e.render_options.beam_width=3,e.render_options.partial_beam_length=4,this.beams.push(e)}return this}setWidth(t){return this.width=t,this}getWidth(){return this.width}getGraceNotes(){return this.grace_notes}draw(){const t=this.checkContext(),e=this.checkAttachedNote();if(this.setRendered(),function(...t){Mt.DEBUG&&m("Vex.Flow.GraceNoteGroup",t)}("Drawing grace note group for:",e),this.alignSubNotesWithNote(this.getGraceNotes(),e),this.grace_notes.forEach((e=>e.setContext(t).draw())),this.beams.forEach((e=>e.setContext(t).draw())),this.show_slur){const i=o(e),s=i?At:Pt;this.slur=new s({last_note:this.grace_notes[0],first_note:e,first_indices:[0],last_indices:[0]}),this.slur.render_options.cp2=12,this.slur.render_options.y_shift=(i?7:5)+this.render_options.slur_y_shift,this.slur.setContext(t).draw()}}}Mt.DEBUG=!1;class Rt extends O{constructor(t){super(),this.preFormatted=!1,this.position=O.Position.LEFT,this.subNotes=t,this.subNotes.forEach((t=>{t.setIgnoreTicks(!1)})),this.width=0,this.formatter=new we,this.voice=new Bt({num_beats:4,beat_value:4,resolution:K.RESOLUTION}).setStrict(!1),this.voice.addTickables(this.subNotes)}static get CATEGORY(){return h.NoteSubGroup}static format(t,e){if(!t||0===t.length)return!1;let i=0;for(let e=0;ee.setContext(t).drawWithStyle()))}}class Ot{constructor(t){this.preFormatted=!1,this.postFormatted=!1,this.tickID=t&&t.tickID?t.tickID:0,this.currentTick=new u(0,1),this.maxTicks=new u(0,1),this.maxTickable=void 0,this.minTicks=void 0,this.minTickable=void 0,this.padding=1,this.x=0,this.xBase=0,this.xOffset=0,this.tickables=[],this.tickablesByVoice={},this.notePx=0,this.glyphPx=0,this.leftDisplacedHeadPx=0,this.rightDisplacedHeadPx=0,this.modLeftPx=0,this.modRightPx=0,this.totalLeftPx=0,this.totalRightPx=0,this.tContexts=[],this.width=0,this.formatterMetrics={freedom:{left:0,right:0}}}static getNextContext(t){const e=t.tContexts,i=e.indexOf(t);if(i+1t.isCenterAligned()))}getMetrics(){const{width:t,glyphPx:e,notePx:i,leftDisplacedHeadPx:s,rightDisplacedHeadPx:a,modLeftPx:n,modRightPx:o,totalLeftPx:l,totalRightPx:r}=this;return{width:t,glyphPx:e,notePx:i,leftDisplacedHeadPx:s,rightDisplacedHeadPx:a,modLeftPx:n,modRightPx:o,totalLeftPx:l,totalRightPx:r}}getCurrentTick(){return this.currentTick}setCurrentTick(t){this.currentTick=t,this.preFormatted=!1}addTickable(t,e){if(!t)throw new c("BadArgument","Invalid tickable added.");if(!t.shouldIgnoreTicks()){const e=t.getTicks();e.greaterThan(this.maxTicks)&&(this.maxTicks=e.clone(),this.maxTickable=t),(null==this.minTicks||e.lessThan(this.minTicks))&&(this.minTicks=e.clone(),this.minTickable=t)}return t.setTickContext(this),this.tickables.push(t),this.tickablesByVoice[e||0]=t,this.preFormatted=!1,this}preFormat(){if(this.preFormatted)return this;for(let t=0;t=0,!this.ornament)throw new c("ArgumentError",`Ornament not found: '${this.type}'`);this.x_shift=e?e.xOffset:0,this.y_shift=e?e.yOffset:0,this.glyph=new R(this.ornament.code,this.render_options.font_scale,{category:`ornament.${this.ornament.code}`}),Lt.ornamentNoteTransition.indexOf(this.type)>=0&&(this.delayed=!0),e||this.glyph.setOrigin(.5,1)}static get CATEGORY(){return h.Ornament}static format(t,e){if(!t||0===t.length)return!1;let i=0,s=e.right_shift,a=e.left_shift,n=0;for(let o=0;o=0&&(l.x_shift+=s+2),Lt.ornamentAttack.indexOf(l.type)>=0&&(l.x_shift-=a+2),l.reportedWidth&&l.x_shift<0?a+=l.reportedWidth:l.reportedWidth&&l.x_shift>0?s+=l.reportedWidth:i=Math.max(l.getWidth(),i),Lt.ornamentArticulation.indexOf(l.type)>=0){b(l.note,"NoAttachedNote").getLineNumber()>=3||l.getPosition()===O.Position.ABOVE?(e.top_text_line+=r,l.y_shift+=n,n-=l.glyph.bbox.getH()):(e.text_line+=r,l.y_shift+=n,n+=l.glyph.bbox.getH())}else l.getPosition()===O.Position.ABOVE?(l.setTextLine(e.top_text_line),e.top_text_line+=r):(l.setTextLine(e.text_line),e.text_line+=r)}return e.left_shift=a+i/2,e.right_shift=s+i/2,!0}static get ornamentNoteTransition(){return["flip","jazzTurn","smear"]}static get ornamentAttack(){return["scoop"]}static get ornamentAlignWithNoteHead(){return["doit","fall","fallLong","doitLong","bend","plungerClosed","plungerOpen","scoop"]}static get ornamentRelease(){return["doit","fall","fallLong","doitLong","jazzTurn","smear","flip"]}static get ornamentArticulation(){return["bend","plungerClosed","plungerOpen"]}getMetrics(){return K.currentMusicFont().getMetrics().glyphs.jazzOrnaments[this.ornament.code]}setDelayed(t){return this.delayed=t,this}setUpperAccidental(t){const e=this.render_options.font_scale/1.3;return this.accidentalUpper=new R(K.accidentalCodes(t).code,e),this.accidentalUpper.setOrigin(.5,1),this}setLowerAccidental(t){const e=this.render_options.font_scale/1.3;return this.accidentalLower=new R(K.accidentalCodes(t).code,e),this.accidentalLower.setOrigin(.5,1),this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.getStemDirection(),s=e.checkStave(),a=Object.keys(this.getAttribute("classes")).join(" ");t.openGroup(a,this.getAttribute("id"));const n=e.checkStem().getExtents();let o=i===Q.DOWN?n.baseY:n.topY;r(e)&&(e.hasStem()?i===Q.DOWN&&(o=s.getYForTopText(this.text_line)):o=s.getYForTopText(this.text_line));const l=i===Q.DOWN,h=s.getSpacingBetweenLines();let c=1;!l&&e.hasBeam()&&(c+=.5);const d=o-h*(this.text_line+c),b=e.getModifierStartXY(this.position,this.index);let g=b.x,_=this.ornamentAlignWithNoteHead?b.y:Math.min(s.getYForTopText(this.text_line),d);if(_+=this.y_shift,this.delayed){let t=0;const i=g-(s.getX()-10);if(void 0!==this.delayXShift)t=this.delayXShift;else{t+=this.glyph.getMetrics().width/2;const a=Ot.getNextContext(e.getTickContext());t+=a?.5*(a.getX()-i):.5*(s.getX()+s.getWidth()-i),this.delayXShift=t}g+=t}!function(...t){Lt.DEBUG&&m("Vex.Flow.Ornament",t)}("Rendering ornament: ",this.ornament,g,_),this.accidentalLower&&(this.accidentalLower.render(t,g,_),_-=this.accidentalLower.getMetrics().height,_-=this.render_options.accidentalLowerPadding),this.stemUpYOffset&&e.hasStem()&&1===e.getStemDirection()&&(_+=this.stemUpYOffset),e.getLineNumber()<5&&Lt.ornamentNoteTransition.indexOf(this.type)>=0&&(_=e.checkStave().getBoundingBox().getY()+40),this.glyph.render(t,g+this.x_shift,_),this.accidentalUpper&&(_-=this.glyph.getMetrics().height+this.render_options.accidentalUpperPadding,this.accidentalUpper.render(t,g,_)),t.closeGroup()}}Lt.DEBUG=!1;class zt extends O{constructor(t){super(),this.position=null!=t?t:O.Position.LEFT,this.point=K.currentMusicFont().lookupMetric("parenthesis.default.point"),this.setWidth(K.currentMusicFont().lookupMetric("parenthesis.default.width"))}static get CATEGORY(){return h.Parenthesis}static buildAndAttach(t){for(const e of t)for(let t=0;tr+a.width?s:r+a.width),o===P.LEFT&&(r=n.getLeftParenthesisPx(l),i=i>r+a.width?i:r+a.width),a.setXShift(r)}return e.left_shift+=i,e.right_shift+=s,!0}setNote(t){return this.note=t,this.point=K.currentMusicFont().lookupMetric("parenthesis.default.point"),this.setWidth(K.currentMusicFont().lookupMetric("parenthesis.default.width")),a(t)&&(this.point=K.currentMusicFont().lookupMetric("parenthesis.gracenote.point"),this.setWidth(K.currentMusicFont().lookupMetric("parenthesis.gracenote.width"))),this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.getModifierStartXY(this.position,this.index,{forceFlagRight:!0}),s=i.x+this.x_shift,a=i.y+this.y_shift;this.position==O.Position.RIGHT?R.renderGlyph(t,s+1,a,this.point,"noteheadParenthesisRight",{category:"noteHead.standard.noteheadParenthesisRight"}):this.position==O.Position.LEFT&&R.renderGlyph(t,s-2,a,this.point,"noteheadParenthesisLeft",{category:"noteHead.standard.noteheadParenthesisLeft"})}}class Ut extends _t{constructor(t){super(t),this.custom_glyph=!1,this.stem_up_x_offset=0,this.stem_down_x_offset=0,this.index=t.index,this.x=t.x||0,this.y=t.y||0,t.note_type&&(this.noteType=t.note_type),this.displaced=t.displaced||!1,this.stem_direction=t.stem_direction||Q.UP,this.line=t.line||0,this.glyph=K.getGlyphProps(this.duration,this.noteType),b(this.glyph,"BadArguments",`No glyph found for duration '${this.duration}' and type '${this.noteType}'`),this.glyph_code=this.glyph.code_head,this.x_shift=t.x_shift||0,t.custom_glyph_code&&(this.custom_glyph=!0,this.glyph_code=t.custom_glyph_code,this.stem_up_x_offset=t.stem_up_x_offset||0,this.stem_down_x_offset=t.stem_down_x_offset||0),this.style=t.style,this.slashed=t.slashed||!1,this.render_options=Object.assign(Object.assign({},this.render_options),{glyph_font_scale:t.glyph_font_scale||K.NOTATION_FONT_SCALE}),this.setWidth(this.glyph.getWidth(this.render_options.glyph_font_scale))}static get CATEGORY(){return h.NoteHead}getWidth(){return this.width}isDisplaced(){return!0===this.displaced}getGlyph(){return this.glyph}setX(t){return this.x=t,this}getY(){return this.y}setY(t){return this.y=t,this}getLine(){return this.line}setLine(t){return this.line=t,this}getAbsoluteX(){const t=this.preFormatted?super.getAbsoluteX():this.x,e=Q.WIDTH/2,i=K.currentMusicFont(),s=i.lookupMetric("notehead.shiftX",0)*this.stem_direction,a=i.lookupMetric("noteHead.displaced.shiftX",0)*this.stem_direction;return t+s+(this.displaced?(this.width-e)*this.stem_direction+a:0)}getBoundingBox(){if(!this.preFormatted)throw new c("UnformattedNote","Can't call getBoundingBox on an unformatted note.");const t=this.checkStave().getSpacingBetweenLines(),e=t/2,i=this.y-e;return new y(this.getAbsoluteX(),i,this.width,t)}setStave(t){const e=this.getLine();return this.stave=t,this.stave&&(this.setY(this.stave.getYForNote(e)),this.setContext(this.stave.getContext())),this}preFormat(){if(this.preFormatted)return this;const t=this.getWidth()+this.leftDisplacedHeadPx+this.rightDisplacedHeadPx;return this.setWidth(t),this.preFormatted=!0,this}draw(){const t=this.checkContext();this.setRendered();let e=this.getAbsoluteX();this.custom_glyph&&(e+=this.stem_direction===Q.UP?this.stem_up_x_offset:this.stem_down_x_offset);const i=this.y;!function(...t){Ut.DEBUG&&m("Vex.Flow.NoteHead",t)}("Drawing note head '",this.noteType,this.duration,"' at",e,i);const s=this.stem_direction,a=this.render_options.glyph_font_scale;this.style&&this.applyStyle(t);const n=`${this.glyph_code}Stem${s===Q.UP?"Up":"Down"}`;if("s"===this.noteType){const a=this.checkStave().getSpacingBetweenLines();!function(t,e,i,s,a,n){const o=K.SLASH_NOTEHEAD_WIDTH;t.save(),t.setLineWidth(K.STEM_WIDTH);let l=!1;if(K.durationToNumber(e)>2&&(l=!0),l||(i-=K.STEM_WIDTH/2*a),t.beginPath(),t.moveTo(i,s+n),t.lineTo(i,s+1),t.lineTo(i+o,s-n),t.lineTo(i+o,s),t.lineTo(i,s+n),t.closePath(),l?t.fill():t.stroke(),K.durationToFraction(e).equals(.5)){const e=[-3,-1,o+1,o+3];for(let a=0;a2?i[1]:void 0;let o=s>2?i[2]:i[1];2===s&&-1===a.stemDirection&&1===o.stemDirection&&(a=i[1],o=i[0]);const l=Math.max(a.voice_shift,o.voice_shift);let r=0;if(2===s){const t=a.stemDirection===o.stemDirection?0:.5;return a.minLine<=o.maxLine+t&&(a.isrest?Wt(a,0,1):o.isrest?Wt(o,0,-1):a.stemDirection===o.stemDirection?(r=l+2,a.note.setXShift(r)):(r=l+2,o.note.setXShift(r))),e.right_shift+=r,!0}if(!n)throw new c("InvalidState","noteM not defined.");if(n.isrest&&!a.isrest&&!o.isrest&&(a.minLine<=n.maxLine||n.minLine<=o.maxLine)){return n.maxLine-n.minLinet.postFormat())),!0)}reset(){super.reset();const t=this._noteHeads.map((t=>t.getStyle()));this.buildNoteHeads(),this._noteHeads.forEach(((e,i)=>{const s=t[i];s&&e.setStyle(s)}));const e=this.stave;return e&&this._noteHeads.forEach((t=>t.setStave(e))),this.calcNoteDisplacements(),this}setBeam(t){return this.beam=t,this.calcNoteDisplacements(),this.stem&&this.stem.setExtension(this.getStemExtension()),this}buildStem(){return this.setStem(new Q({hide:!!this.isRest()})),this}buildNoteHeads(){this._noteHeads=[];const t=this.getStemDirection(),e=this.getKeys();let i,s,a,n,o,l=!1;t===Q.UP?(a=0,n=e.length,o=1):(a=e.length-1,n=-1,o=-1);for(let e=a;e!==n;e+=o){const a=this.keyProps[e],n=a.line;void 0===i?i=n:(s=Math.abs(i-n),0===s||.5===s?l=!l:(l=!1,this.use_default_head_x=!0)),i=n;const o=new Ut({duration:this.duration,note_type:this.noteType,displaced:l,stem_direction:t,custom_glyph_code:a.code,glyph_font_scale:this.render_options.glyph_font_scale,x_shift:a.shift_right,stem_up_x_offset:a.stem_up_x_offset,stem_down_x_offset:a.stem_down_x_offset,line:a.line});this._noteHeads[e]=o}}autoStem(){this.setStemDirection(this.calculateOptimalStemDirection())}calculateOptimalStemDirection(){this.minLine=this.keyProps[0].line,this.maxLine=this.keyProps[this.keyProps.length-1].line;return(this.minLine+this.maxLine)/2<3?Q.UP:Q.DOWN}calculateKeyProps(){let t;for(let e=0;e0&&(this.keyProps[e-1].displaced=!0)),t=n,this.keyProps.push(a)}t=void 0,this.keyProps.forEach((e=>{t&&e.linet.line-e.line))}getBoundingBox(){var t,e;if(!this.preFormatted)throw new c("UnformattedNote","Can't call getBoundingBox on an unformatted note.");const{width:i,modLeftPx:s,leftDisplacedHeadPx:a}=this.getMetrics(),n=this.getAbsoluteX()-s-a;let o=0,l=0;const r=(null!==(e=null===(t=this.getStave())||void 0===t?void 0:t.getSpacingBetweenLines())&&void 0!==e?e:0)/2,h=2*r;if(this.isRest()){const t=this.ys[0],e=K.durationToFraction(this.duration);e.equals(1)||e.equals(2)?(o=t-r,l=t+r):(o=t-this.glyph.line_above*h,l=t+this.glyph.line_below*h)}else if(this.glyph.stem){const t=this.getStemExtents();t.baseY+=r*this.getStemDirection(),o=Math.min(t.topY,t.baseY),l=Math.max(t.topY,t.baseY)}else{o=0,l=0;for(let t=0;te&&(e=s):s1}hasStem(){return this.glyph.stem}hasFlag(){return super.hasFlag()&&!this.isRest()}getStemX(){return"r"===this.noteType?this.getCenterGlyphX():super.getStemX()+(this.stem_direction?Q.WIDTH/(2*-this.stem_direction):0)}getYForTopText(t){const e=this.getStemExtents();return Math.min(this.checkStave().getYForTopText(t),e.topY-this.render_options.annotation_spacing*(t+1))}getYForBottomText(t){const e=this.getStemExtents();return Math.max(this.checkStave().getYForTopText(t),e.baseY+this.render_options.annotation_spacing*t)}setStave(t){super.setStave(t);const e=this._noteHeads.map((e=>(e.setStave(t),e.getY())));if(this.setYs(e),this.stem){const{y_top:t,y_bottom:e}=this.getNoteHeadBounds();this.stem.setYBounds(t,e)}return this}isDisplaced(){return this.displaced}setNoteDisplaced(t){return this.displaced=t,this}getTieRightX(){let t=this.getAbsoluteX();return t+=this.getGlyphWidth()+this.x_shift+this.rightDisplacedHeadPx,this.modifierContext&&(t+=this.modifierContext.getRightShift()),t}getTieLeftX(){let t=this.getAbsoluteX();return t+=this.x_shift-this.leftDisplacedHeadPx,t}getLineForRest(){let t=this.keyProps[0].line;if(this.keyProps.length>1){const e=this.keyProps[this.keyProps.length-1].line;t=_(Math.max(t,e),Math.min(t,e))}return t}getModifierStartXY(t,e,i={}){var s,a;if(!this.preFormatted)throw new c("UnformattedNote","Can't call GetModifierStartXY on an unformatted note");if(0===this.ys.length)throw new c("NoYValues","No Y-Values calculated for this note.");const{ABOVE:n,BELOW:o,LEFT:l,RIGHT:r}=O.Position;let h=0;return t===l?h=-2:t===r?(h=this.getGlyphWidth()+this.x_shift+2,this.stem_direction===Q.UP&&this.hasFlag()&&(i.forceFlagRight||((t,e)=>e===(t.getStemDirection()===Q.UP?t.keyProps.length-1:0))(this,e))&&(h+=null!==(a=null===(s=null==this?void 0:this.flag)||void 0===s?void 0:s.getMetrics().width)&&void 0!==a?a:0)):t!==o&&t!==n||(h=this.getGlyphWidth()/2),{x:this.getAbsoluteX()+h,y:this.ys[e]}}setStyle(t){var e;return super.setStyle(t),this._noteHeads.forEach((e=>e.setStyle(t))),null===(e=this.stem)||void 0===e||e.setStyle(t),this}setStemStyle(t){const e=this.getStem();return null==e||e.setStyle(t),this}getStemStyle(){var t;return null===(t=this.stem)||void 0===t?void 0:t.getStyle()}setLedgerLineStyle(t){this.ledgerLineStyle=t}getLedgerLineStyle(){return this.ledgerLineStyle}setFlagStyle(t){this.flagStyle=t}getFlagStyle(){return this.flagStyle}setKeyStyle(t,e){return this._noteHeads[t].setStyle(e),this}setKeyLine(t,e){return this.keyProps[t].line=e,this.reset(),this}getKeyLine(t){return this.keyProps[t].line}getVoiceShiftWidth(){return this.getGlyphWidth()*(this.displaced?2:1)}calcNoteDisplacements(){this.setLeftDisplacedHeadPx(this.displaced&&this.stem_direction===Q.DOWN?this.getGlyphWidth():0),this.setRightDisplacedHeadPx(!this.hasFlag()&&this.displaced&&this.stem_direction===Q.UP?this.getGlyphWidth():0)}preFormat(){if(this.preFormatted)return;let t=0;this.modifierContext&&(this.modifierContext.preFormat(),0===this.modifierContext.getWidth()&&(t=Gt.minNoteheadPadding));let e=this.getGlyphWidth()+this.leftDisplacedHeadPx+this.rightDisplacedHeadPx+t;this.shouldDrawFlag()&&this.stem_direction===Q.UP&&(e+=this.getGlyphWidth()),this.setWidth(e),this.preFormatted=!0}getNoteHeadBounds(){let t,e,i,s,a=1/0,n=-1/0,o=this.checkStave().getNumLines(),l=1,r=o,h=l;return this._noteHeads.forEach((c=>{const d=c.getLine(),b=c.getY();a=Math.min(b,a),n=Math.max(b,n),void 0===e&&c.isDisplaced()&&(e=c.getAbsoluteX()),void 0!==t||c.isDisplaced()||(t=c.getAbsoluteX()),o=Math.max(d,o),l=Math.min(d,l),c.isDisplaced()?(i=void 0===i?d:Math.max(d,i),s=void 0===s?d:Math.min(d,s)):(r=Math.max(d,r),h=Math.min(d,h))}),this),{y_top:a,y_bottom:n,displaced_x:e,non_displaced_x:t,highest_line:o,lowest_line:l,highest_displaced_line:i,lowest_displaced_line:s,highest_non_displaced_line:r,lowest_non_displaced_line:h}}getNoteHeadBeginX(){return this.getAbsoluteX()+this.x_shift}getNoteHeadEndX(){return this.getNoteHeadBeginX()+this.getGlyphWidth()}get noteHeads(){return this._noteHeads.slice()}get note_heads(){return console.warn("StaveNote.note_heads is deprecated. Use StaveNote.noteHeads instead.","This accessor will be removed in VexFlow 5.0."),this.noteHeads}drawLedgerLines(){const t=this.checkStave(),{glyph:e,render_options:{stroke_px:i}}=this,s=this.checkContext(),a=e.getWidth()+2*i,n=2*(e.getWidth()+i)-Q.WIDTH/2;if(this.isRest())return;if(!s)throw new c("NoCanvasContext","Can't draw without a canvas context.");const{highest_line:o,lowest_line:l,highest_displaced_line:r,highest_non_displaced_line:h,lowest_displaced_line:d,lowest_non_displaced_line:b,displaced_x:m,non_displaced_x:g}=this.getNoteHeadBounds();if(o<6&&l>0)return;const _=Math.min(null!=m?m:0,null!=g?g:0),x=(t,e,o)=>{let l;l=o&&e?_-i:e?(null!=g?g:0)-i:(null!=m?m:0)-i;const r=e&&o?n:a;s.beginPath(),s.moveTo(l,t),s.lineTo(l+r,t),s.stroke()},p=Object.assign(Object.assign({},t.getDefaultLedgerLineStyle()),this.getLedgerLineStyle());this.applyStyle(s,p);for(let e=6;e<=o;++e){const i=void 0!==g&&e<=h,s=void 0!==r&&e<=r;x(t.getYForNote(e),i,s)}for(let e=0;e>=l;--e){const i=void 0!==g&&e>=b,s=void 0!==d&&e>=d;x(t.getYForNote(e),i,s)}this.restoreStyle(s,p)}drawModifiers(){const t=this.checkContext();t.openGroup("modifiers");for(let e=0;e{t.openGroup("notehead",void 0,{pointerBBox:!0}),e.setContext(t).draw(),t.closeGroup()}))}drawStem(t){var e;const i=this.checkContext();t&&this.setStem(new Q(t)),this.shouldDrawFlag()&&this.stem&&this.stem.adjustHeightForFlag(),i.openGroup("stem",void 0,{pointerBBox:!0}),null===(e=this.stem)||void 0===e||e.setContext(i).draw(),i.closeGroup()}getStemExtension(){const t=super.getStemExtension();if(!this.glyph.stem)return t;const e=this.getStemDirection();if(e!==this.calculateOptimalStemDirection())return t;let i;i=e===Q.UP?3-this.maxLine:this.minLine-3;const s=i-3.5;if(s<=0)return t;const a=this.getStave();let n=10;return null!=a&&(n=a.getSpacingBetweenLines()),t+s*n}draw(){var t;if(0===this.ys.length)throw new c("NoYValues","Can't draw note without Y values.");const e=this.checkContext(),i=this.getNoteHeadBeginX(),s=this.hasStem()&&!this.beam;this._noteHeads.forEach((t=>t.setX(i)));const a=this.getStemX();null===(t=this.stem)||void 0===t||t.setNoteHeadXBounds(a,a),function(...t){Gt.DEBUG&&m("Vex.Flow.StaveNote",t)}("Rendering ",this.isChord()?"chord :":"note :",this.keys),this.applyStyle(),this.setAttribute("el",e.openGroup("stavenote",this.getAttribute("id"))),this.drawLedgerLines(),e.openGroup("note",void 0,{pointerBBox:!0}),s&&this.drawStem(),this.drawNoteHeads(),this.drawFlag(),e.closeGroup(),this.drawModifiers(),e.closeGroup(),this.restoreStyle(),this.setRendered()}}function Yt(t){if(!t)return!1;const e=d();return"function"==typeof e.HTMLCanvasElement&&t instanceof e.HTMLCanvasElement||"function"==typeof t.getContext&&"function"==typeof t.toDataURL}Gt.DEBUG=!1;class Ht extends mt{constructor(t){super(),this.textHeight=0,this.context2D=t,t.canvas?this.canvas=t.canvas:this.canvas={width:Ht.WIDTH,height:Ht.HEIGHT}}static get WIDTH(){return 600}static get HEIGHT(){return 400}static get CANVAS_BROWSER_SIZE_LIMIT(){return 32767}static sanitizeCanvasDims(t,e){const i=this.CANVAS_BROWSER_SIZE_LIMIT;return Math.max(t,e)>i&&(g("Canvas dimensions exceed browser limit. Cropping to "+i),t>i&&(t=i),e>i&&(e=i)),[t,e]}clear(){this.context2D.clearRect(0,0,this.canvas.width,this.canvas.height)}openGroup(t,e,i){}closeGroup(){}add(t){}setFillStyle(t){return this.context2D.fillStyle=t,this}setBackgroundFillStyle(t){return this}setStrokeStyle(t){return this.context2D.strokeStyle=t,this}setShadowColor(t){return this.context2D.shadowColor=t,this}setShadowBlur(t){const e=this.context2D.getTransform(),i=Math.sqrt(e.a*e.a+e.b*e.b+e.c*e.c+e.d*e.d);return this.context2D.shadowBlur=i*t,this}setLineWidth(t){return this.context2D.lineWidth=t,this}setLineCap(t){return this.context2D.lineCap=t,this}setLineDash(t){return this.context2D.setLineDash(t),this}scale(t,e){return this.context2D.scale(t,e),this}resize(t,e){const i=this.context2D.canvas,s=d().devicePixelRatio||1;return[t,e]=Ht.sanitizeCanvasDims(t*s,e*s),t=t/s|0,e=e/s|0,i.width=t*s,i.height=e*s,Yt(i)&&(i.style.width=t+"px",i.style.height=e+"px"),this.scale(s,s)}rect(t,e,i,s){return this.context2D.rect(t,e,i,s),this}fillRect(t,e,i,s){return this.context2D.fillRect(t,e,i,s),this}clearRect(t,e,i,s){return this.context2D.clearRect(t,e,i,s),this}beginPath(){return this.context2D.beginPath(),this}moveTo(t,e){return this.context2D.moveTo(t,e),this}lineTo(t,e){return this.context2D.lineTo(t,e),this}bezierCurveTo(t,e,i,s,a,n){return this.context2D.bezierCurveTo(t,e,i,s,a,n),this}quadraticCurveTo(t,e,i,s){return this.context2D.quadraticCurveTo(t,e,i,s),this}arc(t,e,i,s,a,n){return this.context2D.arc(t,e,i,s,a,n),this}fill(){return this.context2D.fill(),this}stroke(){return this.context2D.stroke(),this}closePath(){return this.context2D.closePath(),this}measureText(t){const e=this.context2D.measureText(t);let i=0,s=0;return e.fontBoundingBoxAscent?(i=-e.fontBoundingBoxAscent,s=e.fontBoundingBoxDescent+e.fontBoundingBoxAscent):(i=-e.actualBoundingBoxAscent,s=e.actualBoundingBoxDescent+e.actualBoundingBoxAscent),{x:0,y:i,width:e.width,height:s}}fillText(t,e,i){return this.context2D.fillText(t,e,i),this}save(){return this.context2D.save(),this}restore(){return this.context2D.restore(),this}set fillStyle(t){this.context2D.fillStyle=t}get fillStyle(){return this.context2D.fillStyle}set strokeStyle(t){this.context2D.strokeStyle=t}get strokeStyle(){return this.context2D.strokeStyle}setFont(t,e,i,s){const a=E.validate(t,e,i,s);return this.context2D.font=E.toCSSString(a),this.textHeight=E.convertSizeToPixelValue(a.size),this}getFont(){return this.context2D.font}}const jt={path:{x:!0,y:!0,width:!0,height:!0,"font-family":!0,"font-weight":!0,"font-style":!0,"font-size":!0},rect:{"font-family":!0,"font-weight":!0,"font-style":!0,"font-size":!0},text:{width:!0,height:!0}},Xt="http://www.w3.org/2000/svg",Vt=2*Math.PI;class Kt extends mt{constructor(t){super(),this.width=0,this.height=0,this.backgroundFillStyle="white",this.fontCSSString="",this.element=t;const e=this.create("svg");this.element.appendChild(e),this.svg=e,this.parent=this.svg,this.groups=[this.svg],this.path="",this.pen={x:NaN,y:NaN},this.lineWidth=1;const i={"font-family":E.SANS_SERIF,"font-size":E.SIZE+"pt","font-weight":T.NORMAL,"font-style":w.NORMAL};this.state=Object.assign({scale:{x:1,y:1}},i),this.attributes=Object.assign({"stroke-width":.3,"stroke-dasharray":"none",fill:"black",stroke:"black"},i),this.shadow_attributes={width:0,color:"black"},this.state_stack=[]}create(t){return document.createElementNS(Xt,t)}openGroup(t,e,i){const s=this.create("g");return this.groups.push(s),this.parent.appendChild(s),this.parent=s,t&&s.setAttribute("class",x(t)),e&&s.setAttribute("id",x(e)),i&&i.pointerBBox&&s.setAttribute("pointer-events","bounding-box"),s}closeGroup(){this.groups.pop(),this.parent=this.groups[this.groups.length-1]}add(t){this.parent.appendChild(t)}setFillStyle(t){return this.attributes.fill=t,this}setBackgroundFillStyle(t){return this.backgroundFillStyle=t,this}setStrokeStyle(t){return this.attributes.stroke=t,this}setShadowColor(t){return this.shadow_attributes.color=t,this}setShadowBlur(t){return this.shadow_attributes.width=t,this}setLineWidth(t){return this.attributes["stroke-width"]=t,this.lineWidth=t,this}setLineDash(t){if("[object Array]"===Object.prototype.toString.call(t))return this.attributes["stroke-dasharray"]=t.join(","),this;throw new c("ArgumentError","lineDash must be an array of integers.")}setLineCap(t){return this.attributes["stroke-linecap"]=t,this}resize(t,e){this.width=t,this.height=e,this.element.style.width=t.toString(),this.svg.style.width=t.toString(),this.svg.style.height=e.toString();const i={width:t,height:e};return this.applyAttributes(this.svg,i),this.scale(this.state.scale.x,this.state.scale.y),this}scale(t,e){this.state.scale={x:t,y:e};const i=this.width/t,s=this.height/e;return this.setViewBox(0,0,i,s),this}setViewBox(t,e,i,s){if("string"==typeof t)this.svg.setAttribute("viewBox",t);else{const a=t+" "+e+" "+i+" "+s;this.svg.setAttribute("viewBox",a)}}applyAttributes(t,e){const i=jt[t.nodeName];for(const s in e)i&&i[s]||t.setAttributeNS(null,s,e[s]);return t}clear(){for(;this.svg.lastChild;)this.svg.removeChild(this.svg.lastChild);this.scale(this.state.scale.x,this.state.scale.y)}rect(t,e,i,s,a){s<0&&(e+=s,s*=-1);const n=this.create("rect");return a=null!=a?a:{fill:"none","stroke-width":this.lineWidth,stroke:"black"},this.applyAttributes(n,Object.assign({x:t,y:e,width:i,height:s},a)),this.add(n),this}fillRect(t,e,i,s){const a={fill:this.attributes.fill};return this.rect(t,e,i,s,a),this}clearRect(t,e,i,s){return this.rect(t,e,i,s,{"stroke-width":0,fill:this.backgroundFillStyle}),this}beginPath(){return this.path="",this.pen.x=NaN,this.pen.y=NaN,this}moveTo(t,e){return this.path+="M"+t+" "+e,this.pen.x=t,this.pen.y=e,this}lineTo(t,e){return this.path+="L"+t+" "+e,this.pen.x=t,this.pen.y=e,this}bezierCurveTo(t,e,i,s,a,n){return this.path+="C"+t+" "+e+","+i+" "+s+","+a+" "+n,this.pen.x=a,this.pen.y=n,this}quadraticCurveTo(t,e,i,s){return this.path+="Q"+t+" "+e+","+i+" "+s,this.pen.x=i,this.pen.y=s,this}arc(t,e,i,s,a,n){const o=t+i*Math.cos(s),l=e+i*Math.sin(s);if(!n&&a-s>=Vt||n&&s-a>=Vt){const a=t+i*Math.cos(s+Math.PI),n=e+i*Math.sin(s+Math.PI);this.path+=`M${o} ${l} A${i} ${i} 0 0 0 ${a} ${n} `,this.path+=`A${i} ${i} 0 0 0 ${o} ${l}`,this.pen.x=o,this.pen.y=l}else{const r=t+i*Math.cos(a),h=e+i*Math.sin(a);let c;s=p(s),a=p(a),c=Math.abs(a-s)a&&(c=!c);const d=!n;this.path+=`M${o} ${l} A${i} ${i} 0 ${+c} ${+d} ${r} ${h}`,this.pen.x=r,this.pen.y=h}return this}closePath(){return this.path+="Z",this}getShadowStyle(){const t=this.shadow_attributes;return`filter: drop-shadow(0 0 ${t.width/1.5}px ${t.color})`}fill(t){const e=this.create("path");return void 0===t&&(t=Object.assign(Object.assign({},this.attributes),{stroke:"none"})),t.d=this.path,this.shadow_attributes.width>0&&(t.style=this.getShadowStyle()),this.applyAttributes(e,t),this.add(e),this}stroke(){const t=this.create("path"),e=Object.assign(Object.assign({},this.attributes),{fill:"none","stroke-width":this.lineWidth,d:this.path});return this.shadow_attributes.width>0&&(e.style=this.getShadowStyle()),this.applyAttributes(t,e),this.add(t),this}measureText(t){return Kt.measureTextCache.lookup(t,this.svg,this.attributes)}fillText(t,e,i){if(!t||t.length<=0)return this;const s=Object.assign(Object.assign({},this.attributes),{stroke:"none",x:e,y:i}),a=this.create("text");return a.textContent=t,this.applyAttributes(a,s),this.add(a),this}save(){return this.state_stack.push({state:{"font-family":this.state["font-family"],"font-weight":this.state["font-weight"],"font-style":this.state["font-style"],"font-size":this.state["font-size"],scale:this.state.scale},attributes:{"font-family":this.attributes["font-family"],"font-weight":this.attributes["font-weight"],"font-style":this.attributes["font-style"],"font-size":this.attributes["font-size"],fill:this.attributes.fill,stroke:this.attributes.stroke,"stroke-width":this.attributes["stroke-width"],"stroke-dasharray":this.attributes["stroke-dasharray"]},shadow_attributes:{width:this.shadow_attributes.width,color:this.shadow_attributes.color},lineWidth:this.lineWidth}),this}restore(){const t=this.state_stack.pop();if(t){const e=t;this.state["font-family"]=e.state["font-family"],this.state["font-weight"]=e.state["font-weight"],this.state["font-style"]=e.state["font-style"],this.state["font-size"]=e.state["font-size"],this.state.scale=e.state.scale,this.attributes["font-family"]=e.attributes["font-family"],this.attributes["font-weight"]=e.attributes["font-weight"],this.attributes["font-style"]=e.attributes["font-style"],this.attributes["font-size"]=e.attributes["font-size"],this.attributes.fill=e.attributes.fill,this.attributes.stroke=e.attributes.stroke,this.attributes["stroke-width"]=e.attributes["stroke-width"],this.attributes["stroke-dasharray"]=e.attributes["stroke-dasharray"],this.shadow_attributes.width=e.shadow_attributes.width,this.shadow_attributes.color=e.shadow_attributes.color,this.lineWidth=e.lineWidth}return this}set fillStyle(t){this.setFillStyle(t)}get fillStyle(){return this.attributes.fill}set strokeStyle(t){this.setStrokeStyle(t)}get strokeStyle(){return this.attributes.stroke}setFont(t,e,i,s){const a=E.validate(t,e,i,s);this.fontCSSString=E.toCSSString(a);const n={"font-family":a.family,"font-size":a.size,"font-weight":a.weight,"font-style":a.style};return this.attributes=Object.assign(Object.assign({},this.attributes),n),this.state=Object.assign(Object.assign({},this.state),n),this}getFont(){return this.fontCSSString}}var $t,qt,Jt,Qt;Kt.measureTextCache=new class{constructor(){this.cache={}}lookup(t,e,i){let s=this.cache[t];void 0===s&&(s={},this.cache[t]=s);const a=`${i["font-family"]}%${i["font-size"]}%${i["font-weight"]}%${i["font-style"]}`;let n=s[a];return void 0===n&&(n=this.measureImpl(t,e,i),s[a]=n),n}measureImpl(t,e,i){let s=this.txt;s||(s=document.createElementNS(Xt,"text"),this.txt=s),s.textContent=t,s.setAttributeNS(null,"font-family",i["font-family"]),s.setAttributeNS(null,"font-size",i["font-size"]),s.setAttributeNS(null,"font-style",i["font-style"]),s.setAttributeNS(null,"font-weight",i["font-weight"]),e.appendChild(s);const a=s.getBBox();return e.removeChild(s),{x:a.x,y:a.y,width:a.width,height:a.height}}},function(t){t[t.CANVAS=1]="CANVAS",t[t.SVG=2]="SVG"}($t||($t={})),function(t){t[t.NONE=1]="NONE",t[t.UP=2]="UP",t[t.DOWN=3]="DOWN"}(qt||(qt={}));class Zt{constructor(t,e){if(i(t,h.RenderContext))this.ctx=t;else{if(void 0===e)throw new c("InvalidArgument","Missing backend argument");const i=e;let s;if("string"==typeof t){const e=document.getElementById(t);if(!e)throw new c("BadElementId",`Can't find element with ID "${e}"`);s=e}else s=t;if(i===Zt.Backends.CANVAS){if(!Yt(s))throw new c("BadElement","CANVAS context requires an HTMLCanvasElement.");const t=s.getContext("2d");if(!t)throw new c("BadElement","Can't get canvas context");this.ctx=new Ht(t)}else{if(i!==Zt.Backends.SVG)throw new c("InvalidBackend",`No support for backend: ${i}`);if(!function(t){if(!t)return!1;const e=d();return"function"==typeof e.HTMLDivElement&&t instanceof e.HTMLDivElement||"function"==typeof t.appendChild&&"object"==typeof t.style}(s))throw new c("BadElement","SVG context requires an HTMLDivElement.");this.ctx=new Kt(s)}}}static buildContext(t,e,i,s,a="#FFF"){const n=new Zt(t,e);i&&s&&n.resize(i,s);const o=n.getContext();return o.setBackgroundFillStyle(a),Zt.lastContext=o,o}static getCanvasContext(t,e,i,s){return Zt.buildContext(t,Zt.Backends.CANVAS,e,i,s)}static getSVGContext(t,e,i,s){return Zt.buildContext(t,Zt.Backends.SVG,e,i,s)}static drawDashedLine(t,e,i,s,a,n){t.beginPath();const o=s-e,l=a-i,r=Math.atan2(l,o);let h=e,c=i;t.moveTo(e,i);let d=0,b=!0;for(;!(o<0?h<=s:h>=s)||!(l<0?c<=a:c>=a);){const e=n[d++%n.length],i=h+Math.cos(r)*e;h=o<0?Math.max(s,i):Math.min(s,i);const m=c+Math.sin(r)*e;c=l<0?Math.max(a,m):Math.min(a,m),b?t.lineTo(h,c):t.moveTo(h,c),b=!b}t.closePath(),t.stroke()}resize(t,e){return this.ctx.resize(t,e),this}getContext(){return this.ctx}}Zt.Backends=$t,Zt.LineEndType=qt,Zt.lastContext=void 0;class te extends O{constructor(t){super(),this.string_number=t,this.setWidth(20),this.position=O.Position.ABOVE,this.x_shift=0,this.y_shift=0,this.text_line=0,this.stem_offset=0,this.x_offset=0,this.y_offset=0,this.dashed=!0,this.leg=Zt.LineEndType.NONE,this.radius=8,this.resetFont()}static get CATEGORY(){return h.StringNumber}static get metrics(){return K.currentMusicFont().getMetrics().glyphs.stringNumber}static format(t,e){const i=e.left_shift,s=e.right_shift;if(!t||0===t.length)return!1;const a=[];let n=null,l=0,r=0;for(let h=0;he.line-t.line));let h=0,d=0,b=0,m=null,g=null;for(let t=0;td?e:d):o===O.Position.RIGHT&&(r.setXShift(h),e+=x,b=e>b?e:b),m=c,g=n}return e.left_shift+=d,e.right_shift+=b,!0}setLineEndType(t){return t>=Zt.LineEndType.NONE&&t<=Zt.LineEndType.DOWN&&(this.leg=t),this}setStringNumber(t){return this.string_number=t,this}setOffsetX(t){return this.x_offset=t,this}setOffsetY(t){return this.y_offset=t,this}setLastNote(t){return this.last_note=t,this}setDashed(t){return this.dashed=t,this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.getModifierStartXY(this.position,this.index),s=e.hasStem()?e.getStemDirection():Q.UP;let a=i.x+this.x_shift+this.x_offset,n={};e.hasStem()&&(n=e.checkStem().getExtents());let o=i.y+this.y_shift+this.y_offset;switch(this.position){case O.Position.ABOVE:o=e.getYs().reduce(((t,e)=>tt>e?t:e)),e.hasStem()&&s==Q.DOWN&&(o=n.topY-te.metrics.stemPadding),o+=this.radius+te.metrics.verticalPadding+this.text_line*K.STAVE_LINE_DISTANCE;break;case O.Position.LEFT:a-=this.radius/2+te.metrics.leftPadding;break;case O.Position.RIGHT:a+=this.radius/2+te.metrics.rightPadding;break;default:throw new c("InvalidPosition",`The position ${this.position} is invalid`)}t.save(),t.beginPath(),t.arc(a,o,this.radius,0,2*Math.PI,!1),t.setLineWidth(1.5),t.stroke(),t.setFont(this.textFont);const r=a-t.measureText(this.string_number).width/2;t.fillText(""+this.string_number,r,o+4.5);const h=this.last_note;if(l(h)){const i=h.getStemX()-e.getX()+5;let s,n;switch(t.setStrokeStyle("#000000"),t.setLineCap("round"),t.setLineWidth(.6),this.dashed?Zt.drawDashedLine(t,a+10,o,a+i,o,[3,3]):Zt.drawDashedLine(t,a+10,o,a+i,o,[3,0]),this.leg){case Zt.LineEndType.UP:s=-10,n=this.dashed?[3,3]:[3,0],Zt.drawDashedLine(t,a+i,o,a+i,o+s,n);break;case Zt.LineEndType.DOWN:s=10,n=this.dashed?[3,3]:[3,0],Zt.drawDashedLine(t,a+i,o,a+i,o+s,n)}}t.restore()}}te.TEXT_FONT={family:E.SANS_SERIF,size:E.SIZE,weight:T.BOLD,style:w.NORMAL};class ee extends O{constructor(t,e){super(),this.options=Object.assign({all_voices:!0},e),this.all_voices=this.options.all_voices,this.type=t,this.position=O.Position.LEFT,this.render_options={font_scale:38},this.resetFont(),this.setXShift(0),this.setWidth(10)}static get CATEGORY(){return h.Stroke}static format(t,e){const i=e.left_shift;if(!t||0===t.length)return!1;const s=t.map((t=>{const e=t.getNote(),i=t.checkIndex();if(o(e)){const{line:s}=e.getKeyProps()[i];return{line:s,shift:e.getLeftDisplacedHeadPx(),stroke:t}}if(r(e)){const{str:s}=e.getPositions()[i];return{line:s,shift:0,stroke:t}}throw new c("Internal","Unexpected instance.")})),a=i,n=s.reduce(((t,{stroke:e,shift:i})=>(e.setXShift(a+i),Math.max(e.getWidth()+0,t))),0);return e.left_shift+=n,!0}getPosition(){return this.position}addEndNote(t){return this.note_end=t,this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.getModifierStartXY(this.position,this.index);let s=e.getYs(),a=i.y,l=i.y;const r=i.x-5,h=e.checkStave().getSpacingBetweenLines(),d=this.checkModifierContext().getMembers(e.getCategory());for(let t=0;t0){s-=o.map((t=>t.getTextHeight())).reduce(((t,e)=>t>e?t:e))/K.STAVE_LINE_DISTANCE+1}else e.top_text_line+=1;for(let e=0;e=t.line?i.above:i.below}}this.placeGlyphOnLine(s,this.checkStave(),t.line),this.glyphs.push(s);const n=this.xPositions[this.xPositions.length-1],o=s.getMetrics().width+a;this.xPositions.push(n+o),this.width+=o}cancelKey(t){return this.formatted=!1,this.cancelKeySpec=t,this}convertToCancelAccList(t){const e=K.keySignature(t),i=this.accList.length>0&&e.length>0&&e[0].type!==this.accList[0].type,s=i?e.length:e.length-this.accList.length;if(s<1)return;const a=[];for(let t=0;t0?e[0].type:void 0;let s;if(this.cancelKeySpec&&(s=this.convertToCancelAccList(this.cancelKeySpec)),this.alterKeySpec&&this.convertToAlterAccList(this.alterKeySpec),this.accList.length>0){const a=(this.position===xt.END?t.getEndClef():t.getClef())||t.getClef();s&&this.convertAccLines(a,s.type,s.accList),this.convertAccLines(a,i,e);for(let t=0;t0?"PlusSmall":"Plus";break;case"(":s=i.length>0?"ParensLeftSmall":"ParensLeft";break;case")":s=i.length>0?"ParensRightSmall":"ParensRight"}const a=new R("timeSig"+s,this.timeSignature.point);this.topGlyphs.push(a),l+=null!==(o=a.getMetrics().width)&&void 0!==o?o:0}let r=0;for(let t=0;t0?e.getYForLine(this.timeSignature.topLine):(e.getYForLine(this.timeSignature.topLine)+e.getYForLine(this.timeSignature.bottomLine))/2;for(let t=0;t{const e=t.split("/");if(2!==e.length&&"+"!==e[0]&&"-"!==e[0])throw new c("BadTimeSignature",`Invalid time spec: ${t}. Must be in the form "/"`);e.forEach((e=>{if(0==/^[0-9+\-()]+$/.test(e))throw new c("BadTimeSignature",`Invalid time spec: ${t}. Must contain valid signatures.`)}))})(t);const s=t.split("/");return{num:!0,glyph:this.makeTimeSignatureGlyph(null!==(e=s[0])&&void 0!==e?e:"",null!==(i=s[1])&&void 0!==i?i:"")}}makeTimeSignatureGlyph(t,e){return new me(this,t,e,"timeSig0",this.point)}getInfo(){return this.info}setTimeSig(t){return this.info=this.parseTimeSpec(t),this}draw(){const t=this.checkStave(),e=t.checkContext();this.setRendered(),e.openGroup("timesignature",this.getAttribute("id")),this.info.glyph.setStave(t),this.info.glyph.setContext(e),this.placeGlyphOnLine(this.info.glyph,t,this.info.line),this.info.glyph.renderToStave(this.x),e.closeGroup()}}const _e={[vt.CATEGORY]:0,[ne.CATEGORY]:1,[oe.CATEGORY]:2,[ge.CATEGORY]:3},xe={[ge.CATEGORY]:0,[oe.CATEGORY]:1,[vt.CATEGORY]:2,[ne.CATEGORY]:3};class pe extends N{constructor(t,e,i,s){super(),this.height=0,this.x=t,this.y=e,this.width=i,this.formatted=!1,this.start_x=t+5,this.end_x=t+i,this.modifiers=[],this.measure=0,this.clef="treble",this.endClef=void 0,this.resetFont(),this.options=Object.assign({vertical_bar_width:10,num_lines:5,fill_style:"#999999",left_bar:!0,right_bar:!0,spacing_between_lines_px:K.STAVE_LINE_DISTANCE,space_above_staff_ln:4,space_below_staff_ln:4,top_text_position:1,bottom_text_position:4,line_config:[]},s),this.bounds={x:this.x,y:this.y,w:this.width,h:0},this.defaultLedgerLineStyle={strokeStyle:"#444",lineWidth:1.4},this.resetLines(),this.addModifier(new vt(this.options.left_bar?pt.SINGLE:pt.NONE)),this.addEndModifier(new vt(this.options.right_bar?pt.SINGLE:pt.NONE))}static get CATEGORY(){return h.Stave}static get defaultPadding(){const t=K.currentMusicFont();return t.lookupMetric("stave.padding")+t.lookupMetric("stave.endPaddingMax")}static get rightPadding(){return K.currentMusicFont().lookupMetric("stave.endPaddingMax")}setDefaultLedgerLineStyle(t){this.defaultLedgerLineStyle=t}getDefaultLedgerLineStyle(){return Object.assign(Object.assign({},this.getStyle()),this.defaultLedgerLineStyle)}space(t){return this.options.spacing_between_lines_px*t}resetLines(){this.options.line_config=[];for(let t=0;ti.getWidth()&&(e-=i.getWidth()),e}setRepetitionType(t,e=0){return this.modifiers.push(new le(t,this.x,e)),this}setVoltaType(t,e,i){return this.modifiers.push(new be(t,e,this.x,i)),this}setSection(t,e,i=0,s){const a=new re(t,this.x+i,e);return s&&a.setFontSize(s),this.modifiers.push(a),this}setTempo(t,e){return this.modifiers.push(new he(t,this.x,e)),this}setText(t,e,i={}){return this.modifiers.push(new de(t,e,i)),this}getHeight(){return this.height}getSpacingBetweenLines(){return this.options.spacing_between_lines_px}getBoundingBox(){return new y(this.x,this.y,this.width,this.getBottomY()-this.y)}getBottomY(){const t=this.options,e=t.spacing_between_lines_px;return this.getYForLine(t.num_lines)+t.space_below_staff_ln*e}getBottomLineY(){return this.getYForLine(this.options.num_lines)}getYForLine(t){const e=this.options,i=e.spacing_between_lines_px,s=e.space_above_staff_ln;return this.y+t*i+s*i}getLineForY(t){const e=this.options,i=e.spacing_between_lines_px,s=e.space_above_staff_ln;return(t-this.y)/i-s}getYForTopText(t=0){return this.getYForLine(-t-this.options.top_text_position)}getYForBottomText(t=0){return this.getYForLine(this.options.bottom_text_position+t)}getYForNote(t){const e=this.options,i=e.spacing_between_lines_px,s=e.space_above_staff_ln;return this.y+s*i+5*i-t*i}getYForGlyphs(){return this.getYForLine(3)}addModifier(t,e){return void 0!==e&&t.setPosition(e),t.setStave(this),this.formatted=!1,this.modifiers.push(t),this}addEndModifier(t){return this.addModifier(t,xt.END),this}setBegBarType(t){const{SINGLE:e,REPEAT_BEGIN:i,NONE:s}=pt;return t!==e&&t!==i&&t!==s||(this.modifiers[0].setType(t),this.formatted=!1),this}setEndBarType(t){return t!==pt.REPEAT_BEGIN&&(this.modifiers[1].setType(t),this.formatted=!1),this}setClef(t,e,i,s){void 0===s&&(s=xt.BEGIN),s===xt.END?this.endClef=t:this.clef=t;const a=this.getModifiers(s,ne.CATEGORY);return 0===a.length?this.addClef(t,e,i,s):a[0].setType(t,e,i),this}getClef(){return this.clef}setEndClef(t,e,i){return this.setClef(t,e,i,xt.END),this}getEndClef(){return this.endClef}setKeySignature(t,e,i){void 0===i&&(i=xt.BEGIN);const s=this.getModifiers(i,oe.CATEGORY);return 0===s.length?this.addKeySignature(t,e,i):s[0].setKeySig(t,e),this}setEndKeySignature(t,e){return this.setKeySignature(t,e,xt.END),this}setTimeSignature(t,e,i){void 0===i&&(i=xt.BEGIN);const s=this.getModifiers(i,ge.CATEGORY);return 0===s.length?this.addTimeSignature(t,e,i):s[0].setTimeSig(t),this}setEndTimeSignature(t,e){return this.setTimeSignature(t,e,xt.END),this}addKeySignature(t,e,i){return void 0===i&&(i=xt.BEGIN),this.addModifier(new oe(t,e).setPosition(i),i),this}addClef(t,e,i,s){return void 0===s||s===xt.BEGIN?this.clef=t:s===xt.END&&(this.endClef=t),this.addModifier(new ne(t,e,i),s),this}addEndClef(t,e,i){return this.addClef(t,e,i,xt.END),this}addTimeSignature(t,e,i){return this.addModifier(new ge(t,e),i),this}addEndTimeSignature(t,e){return this.addTimeSignature(t,e,xt.END),this}addTrebleGlyph(){return this.addClef("treble"),this}getModifiers(t,e){const i=void 0===t,s=void 0===e;return i&&s?this.modifiers:i?this.modifiers.filter((t=>e===t.getCategory())):s?this.modifiers.filter((e=>t===e.getPosition())):this.modifiers.filter((i=>t===i.getPosition()&&e===i.getCategory()))}sortByCategory(t,e){for(let i=t.length-1;i>=0;i--)for(let s=0;se[t[s+1].getCategory()]){const e=t[s];t[s]=t[s+1],t[s+1]=e}}format(){const t=this.modifiers[0],e=this.modifiers[1],i=this.getModifiers(xt.BEGIN),a=this.getModifiers(xt.END);let n,o,l;this.sortByCategory(i,_e),this.sortByCategory(a,xe),i.length>1&&t.getType()===pt.REPEAT_BEGIN&&(i.push(i.splice(0,1)[0]),i.splice(0,0,new vt(pt.SINGLE))),a.indexOf(e)>0&&a.splice(0,0,new vt(pt.NONE));let r=0,h=this.x;for(let t=0;t0){t.save(),t.setFont(this.textFont);const e=t.measureText(""+this.measure).width;a=this.getYForTopText(0)+3,t.fillText(""+this.measure,this.x-e/2,a),t.restore()}return t.closeGroup(),this}getVerticalBarWidth(){return this.options.vertical_bar_width}getConfigForLines(){return this.options.line_config}setConfigForLine(t,e){if(t>=this.options.num_lines||t<0)throw new c("StaveConfigError","The line number must be within the range of the number of lines in the Stave.");if(void 0===e.visible)throw new c("StaveConfigError","The line configuration object is missing the 'visible' property.");if("boolean"!=typeof e.visible)throw new c("StaveConfigError","The line configuration objects 'visible' property must be true or false.");return this.options.line_config[t]=e,this}setConfigForLines(t){if(t.length!==this.options.num_lines)throw new c("StaveConfigError","The length of the lines configuration array must match the number of lines in the Stave");for(const e in t)null==t[e].visible&&(t[e]=this.options.line_config[e]),this.options.line_config[e]=Object.assign(Object.assign({},this.options.line_config[e]),t[e]);return this.options.line_config=t,this}}function ue(t,e,i,s,a){if(e!==fe.type.BOLD_DOUBLE_LEFT&&e!==fe.type.BOLD_DOUBLE_RIGHT)throw new c("InvalidConnector","A REPEAT_BEGIN or REPEAT_END type must be provided.");let n=3,o=3.5;e===fe.type.BOLD_DOUBLE_RIGHT&&(n=-5,o=3),t.fillRect(i+n,s,1,a-s),t.fillRect(i-2,s,o,a-s)}pe.TEXT_FONT={family:E.SANS_SERIF,size:8,weight:T.NORMAL,style:w.NORMAL};class fe extends N{constructor(t,e){super(),this.thickness=K.STAVE_LINE_THICKNESS,this.width=3,this.top_stave=t,this.bottom_stave=e,this.type=fe.type.DOUBLE,this.resetFont(),this.x_shift=0,this.texts=[]}static get CATEGORY(){return h.StaveConnector}setType(t){return(t="string"==typeof t?fe.typeString[t]:t)>=fe.type.SINGLE_RIGHT&&t<=fe.type.NONE&&(this.type=t),this}setText(t,e={}){return this.texts.push({content:t,options:Object.assign({shift_x:0,shift_y:0},e)}),this}setXShift(t){if("number"!=typeof t)throw new c("InvalidType","x_shift must be a Number");return this.x_shift=t,this}getXShift(){return this.x_shift}draw(){const t=this.checkContext();this.setRendered();let e=this.top_stave.getYForLine(0),i=this.bottom_stave.getYForLine(this.bottom_stave.getNumLines()-1)+this.thickness,s=this.width,a=this.top_stave.getX();(this.type===fe.type.SINGLE_RIGHT||this.type===fe.type.BOLD_DOUBLE_RIGHT||this.type===fe.type.THIN_DOUBLE)&&(a=this.top_stave.getX()+this.top_stave.getWidth());let n=i-e;switch(this.type){case fe.type.SINGLE:case fe.type.SINGLE_LEFT:case fe.type.SINGLE_RIGHT:s=1;break;case fe.type.DOUBLE:a-=this.width+2,e-=this.thickness,n+=.5;break;case fe.type.BRACE:{s=12;const a=this.top_stave.getX()-2+this.x_shift,o=e,l=a,r=i,h=a-s,c=o+n/2,d=h-.9*s,b=o+.2*n,m=a+1.1*s,g=c-.135*n,_=m,x=c+.135*n,p=d,u=r-.2*n,f=h-s,y=u,S=a+.4*s,T=c+.135*n,w=S,v=c-.135*n,D=f,C=b;t.beginPath(),t.moveTo(a,o),t.bezierCurveTo(d,b,m,g,h,c),t.bezierCurveTo(_,x,p,u,l,r),t.bezierCurveTo(f,y,S,T,h,c),t.bezierCurveTo(w,v,D,C,a,o),t.fill(),t.stroke();break}case fe.type.BRACKET:e-=6,i+=6,n=i-e,R.renderGlyph(t,a-5,e,40,"bracketTop"),R.renderGlyph(t,a-5,i,40,"bracketBottom"),a-=this.width+2;break;case fe.type.BOLD_DOUBLE_LEFT:ue(t,this.type,a+this.x_shift,e,i-this.thickness);break;case fe.type.BOLD_DOUBLE_RIGHT:ue(t,this.type,a,e,i-this.thickness);break;case fe.type.THIN_DOUBLE:s=1,n-=this.thickness;break;case fe.type.NONE:break;default:throw new c("InvalidType",`The provided StaveConnector.type (${this.type}) is invalid.`)}this.type!==fe.type.BRACE&&this.type!==fe.type.BOLD_DOUBLE_LEFT&&this.type!==fe.type.BOLD_DOUBLE_RIGHT&&this.type!==fe.type.NONE&&t.fillRect(a,e,s,n),this.type===fe.type.THIN_DOUBLE&&t.fillRect(a-3,e,s,n),t.save(),t.setLineWidth(2),t.setFont(this.textFont);for(let e=0;et.reduce(((t,e)=>t+e),0);function Se(t,e,i){const s=we.getResolutionMultiplier(t),a={},n=[],o=[];return t.forEach(((t,l)=>{const r=new u(0,s);t.getTickables().forEach((t=>{const s=r.numerator;if(!a[s]){const t=e({tickID:s});o.push(t),a[s]=t,n.push(s)}i(t,a[s],l),r.add(t.getTicks())}))})),{map:a,array:o,list:n.sort(((t,e)=>t-e)),resolutionMultiplier:s}}function Te(t,e,i,s){let a=e;for(let e=i+1;e{e.addToModifierContext(new ae);const s=(new Ot).addTickable(e).preFormat(),a=s.getMetrics();return s.setX(t+a.totalLeftPx),t+s.getWidth()+a.totalRightPx+i}),e)}static plotDebugging(t,e,i,s,a,n){const o=i+(n=Object.assign({stavePadding:K.currentMusicFont().lookupMetric("stave.padding")},n)).stavePadding,l=e.contextGaps;t.save(),t.setFont(E.SANS_SERIF,8),l.gaps.forEach((e=>{var i,n,l;i=o+e.x1,n=o+e.x2,l="rgba(100,200,100,0.4)",t.beginPath(),t.setStrokeStyle(l),t.setFillStyle(l),t.setLineWidth(1),t.fillRect(i,s,Math.max(n-i,0),a-s),t.setFillStyle("green"),t.fillText(Math.round(e.x2-e.x1).toString(),o+e.x1,a+12)})),t.setFillStyle("red"),t.fillText(`Loss: ${(e.totalCost||0).toFixed(2)} Shift: ${(e.totalShift||0).toFixed(2)} Gap: ${l.total.toFixed(2)}`,o-20,a+27),t.restore()}static FormatAndDraw(t,e,i,s){let a={auto_beam:!1,align_rests:!1};"object"==typeof s?a=Object.assign(Object.assign({},a),s):"boolean"==typeof s&&(a.auto_beam=s);const n=new Bt(K.TIME4_4).setMode(Bt.Mode.SOFT).addTickables(i),o=a.auto_beam?Fe.applyAndGetBeams(n):[];return(new we).joinVoices([n]).formatToStave([n],e,{align_rests:a.align_rests,stave:e}),n.setStave(e).draw(t,e),o.forEach((e=>e.setContext(t).draw())),n.getBoundingBox()}static FormatAndDrawTab(t,e,i,s,a,n,o){let l={auto_beam:n,align_rests:!1};"object"==typeof o?l=Object.assign(Object.assign({},l),o):"boolean"==typeof o&&(l.auto_beam=o);const r=new Bt(K.TIME4_4).setMode(Bt.Mode.SOFT).addTickables(a),h=new Bt(K.TIME4_4).setMode(Bt.Mode.SOFT).addTickables(s),c=l.auto_beam?Fe.applyAndGetBeams(r):[];(new we).joinVoices([r]).joinVoices([h]).formatToStave([r,h],i,{align_rests:l.align_rests}),r.draw(t,i),h.draw(t,e),c.forEach((e=>e.setContext(t).draw())),new fe(i,e).setContext(t).draw()}static AlignRestsToNotes(t,e,i){t.forEach(((s,a)=>{if(o(s)&&s.isRest()){if(s.getTuplet()&&!i)return;const n=s.getGlyph().position.toUpperCase();if("R/4"!==n&&"B/4"!==n)return;if(e||s.getBeam()){const e=s.getKeyProps()[0];if(0===a)e.line=Te(t,e.line,a,!1);else if(a>0&&awe.AlignRestsToNotes(t.getTickables(),e)))}preCalculateMinTotalWidth(t){const e=K.currentMusicFont().lookupMetric("stave.unalignedNotePadding");let i=0,s=0,a=0;const n=[],o=[];if(this.hasMinTotalWidth)return this.minTotalWidth;if(!this.tickContexts){if(!t)throw new c("BadArgument","'voices' required to run preCalculateMinTotalWidth");this.createTickContexts(t)}const{list:l,map:r}=this.tickContexts;this.minTotalWidth=0,l.forEach((e=>{const l=r[e];l.preFormat(),l.getTickables().length{s+=t.getMetrics().width,a+=t.getTicks().value(),n.push(t.getMetrics().width),o.push(t.getTicks().value())}));const h=l.getWidth();this.minTotalWidth+=h})),this.hasMinTotalWidth=!0;const h=s>0?s/n.length:1/n.length,d=ye(n.map((t=>Math.pow(t-h,2)))),b=Math.pow(d/n.length,.5)/h,m=a/o.length,g=ye(o.map((t=>Math.pow(t-m,2)))),_=Math.pow(g/o.length,.5)/m,x=Math.max(_,b)*l.length*e,p=e*i;return this.minTotalWidth+Math.max(p,x)}getMinTotalWidth(){if(!this.hasMinTotalWidth)throw new c("NoMinTotalWidth","Call 'preCalculateMinTotalWidth' or 'preFormat' before calling 'getMinTotalWidth'");return this.minTotalWidth}static getResolutionMultiplier(t){if(!t||!t.length)throw new c("BadArgument","No voices to format");const e=t[0].getTotalTicks();return t.reduce(((t,i)=>{if(!i.getTotalTicks().equals(e))throw new c("TickMismatch","Voices should have same total note duration in ticks.");if(i.getMode()===Bt.Mode.STRICT&&!i.isComplete())throw new c("IncompleteVoice","Voice does not have enough notes.");return Math.max(t,u.LCM(t,i.getResolutionMultiplier()))}),1)}createModifierContexts(t){const e=Se(t,(()=>new ae),((t,e)=>t.addToModifierContext(e)));return this.modifierContexts=e,e}createTickContexts(t){const e=Se(t,(t=>new Ot(t)),((t,e,i)=>e.addTickable(t,i)));this.tickContexts=e;const i=this.tickContexts.array;return i.forEach((t=>{t.tContexts=i})),e}preFormat(t=0,e,i,s){const a=this.tickContexts;if(!a)throw new c("NoTickContexts","preFormat requires TickContexts");const{list:n,map:o}=a;this.lossHistory=[],i&&s&&i.forEach((t=>t.setStave(s).preFormat()));let l=0,r=0;this.minTotalWidth=0;let h=0;n.forEach((t=>{const e=o[t];e.preFormat();const i=e.getWidth();this.minTotalWidth+=i;const s=e.getMaxTicks().value();h+=s;const a=e.getMetrics();l=l+r+a.totalLeftPx,e.setX(l),r=i-a.totalLeftPx}));const{globalSoftmax:d,softmaxFactor:m,maxIterations:g}=this.formatterOptions,_=ye(n.map((t=>Math.pow(m,o[t].getMaxTicks().value()/h))));if(this.minTotalWidth=l+r,this.hasMinTotalWidth=!0,t<=0)return this.evaluate();const x=o[n[0]],p=o[n[n.length-1]];function u(t){return n.map(((e,i)=>{const s=o[e],a=s.getTickablesByVoice();let l;if(i>0){const e=o[n[i-1]];for(let r=i-1;r>=0;r--){const i=o[n[r]].getTickablesByVoice(),c=[];if(Object.keys(a).forEach((t=>{i[t]&&c.push(t)})),c.length>0){let n=0,o=1/0,r=0;if(c.forEach((t=>{const e=i[t].getTicks().value();e>n&&(l=i[t],n=e);const s=a[t],r=s.getX()-(s.getMetrics().modLeftPx+s.getMetrics().leftDisplacedHeadPx),h=i[t].getMetrics(),c=i[t].getX()+h.notePx+h.modRightPx+h.rightDisplacedHeadPx;o=Math.min(o,r-c)})),o=Math.min(o,s.getX()-(e.getX()+.05*t)),d){const e=h;r=Math.pow(m,n/e)/_*t}else void 0!==l&&(r=l.getVoice().softmax(n)*t);return{expectedDistance:r,maxNegativeShiftPx:o,fromTickable:l}}}}return{expectedDistance:0,fromTickablePx:0,maxNegativeShiftPx:0}}))}function f(t){const e=y/2;let i=0;return n.forEach(((s,a)=>{const n=o[s];if(a>0){const e=n.getX(),s=t[a],o=b(s.fromTickable).getX()+s.expectedDistance-(e+i);let l=0;o>0?i+=o:o<0&&(l=Math.min(s.maxNegativeShiftPx,Math.abs(o)),i+=-l),n.setX(e+i)}n.getCenterAlignedTickables().forEach((t=>{t.setCenterXShift(e-n.getX())}))})),p.getX()-x.getX()}const y=t-p.getMetrics().notePx-p.getMetrics().totalRightPx-x.getMetrics().totalLeftPx,S=K.currentMusicFont(),T=S.lookupMetric("stave.endPaddingMin"),w=S.lookupMetric("stave.endPaddingMax");let v=y;const D=u(v);let C=f(D);const E=((t,e)=>{let i=t/2;if(e.length>1)for(let t=1;tF&&N>0||C+k1;)v-=C-F,C=f(u(v)),N--;return this.justifyWidth=t,this.evaluate()}evaluate(){if(!this.tickContexts)return 0;const t=this.tickContexts,e=this.justifyWidth;this.contextGaps={total:0,gaps:[]},t.list.forEach(((e,i)=>{if(0===i)return;const s=t.list[i-1],a=t.map[s],n=t.map[e],o=a.getMetrics(),l=n.getMetrics(),r=a.getX()+o.notePx+o.totalRightPx,h=n.getX()-l.totalLeftPx,c=h-r;this.contextGaps.total+=c,this.contextGaps.gaps.push({x1:r,x2:h}),n.getFormatterMetrics().freedom.left=c,a.getFormatterMetrics().freedom.right=c})),this.durationStats={};const i=this.durationStats;this.voices.forEach((t=>{t.getTickables().forEach(((t,s,a)=>{const n=t.getTicks().clone().simplify().toString(),o=t.getMetrics(),l=t.getFormatterMetrics(),r=t.getX()+o.notePx+o.modRightPx+o.rightDisplacedHeadPx;let h=0;if(s{t.getTickables().forEach((t=>{const e=t.getTicks().clone().simplify().toString(),a=t.getFormatterMetrics();a.space.mean=i[e].mean,a.duration=e,a.iterations+=1,a.space.deviation=a.space.used-a.space.mean,s+=Math.pow(a.space.deviation,2)}))})),this.totalCost=Math.sqrt(s),this.lossHistory.push(this.totalCost),this.totalCost}tune(t){var e;const i=this.tickContexts;if(!i)return 0;const s=null!==(e=null==t?void 0:t.alpha)&&void 0!==e?e:.5;let a=0;return this.totalShift=0,i.list.forEach(((t,e,n)=>{const o=i.map[t],l=e>0?i.map[n[e-1]]:void 0,r=et.getFormatterMetrics().space.deviation)));h>0?a=-Math.min(o.getFormatterMetrics().freedom.right,Math.abs(h)):h<0&&(a=r?Math.min(r.getFormatterMetrics().freedom.right,Math.abs(h)):0),a*=s,this.totalShift+=a})),this.evaluate()}postFormat(){const t=t=>t.list.forEach((e=>t.map[e].postFormat()));return this.modifierContexts&&t(this.modifierContexts),this.tickContexts&&t(this.tickContexts),this}joinVoices(t){return this.createModifierContexts(t),this.hasMinTotalWidth=!1,this}format(t,e,i){const s=Object.assign({align_rests:!1},i);this.voices=t;const a=this.formatterOptions.softmaxFactor;return a&&this.voices.forEach((t=>t.setSoftmaxFactor(a))),this.alignRests(t,s.align_rests),this.createTickContexts(t),this.preFormat(e,s.context,t,s.stave),s.stave&&this.postFormat(),this}formatToStave(t,e,i){const s=Object.assign({context:e.getContext()},i),a=e.getNoteEndX()-e.getNoteStartX()-pe.defaultPadding;return function(...t){we.DEBUG&&m("Vex.Flow.Formatter",t)}("Formatting voices to width: ",a),this.format(t,a,s)}getTickContext(t){var e;return null===(e=this.tickContexts)||void 0===e?void 0:e.map[t]}}var ve;we.DEBUG=!1,function(t){t[t.BOTTOM=-1]="BOTTOM",t[t.TOP=1]="TOP"}(ve||(ve={}));class De extends N{constructor(t,e={}){if(super(),this.numerator_glyphs=[],this.denom_glyphs=[],!t||!t.length)throw new c("BadArguments","No notes provided for tuplet.");this.options=e,this.notes=t,this.num_notes=null!=this.options.num_notes?this.options.num_notes:t.length,this.options.beats_occupied&&this.beatsOccupiedDeprecationWarning(),this.notes_occupied=this.options.notes_occupied||this.options.beats_occupied||2,null!=this.options.bracketed?this.bracketed=this.options.bracketed:this.bracketed=t.some((t=>!t.hasBeam())),this.ratioed=null!=this.options.ratioed?this.options.ratioed:Math.abs(this.notes_occupied-this.num_notes)>1,this.point=K.currentMusicFont().lookupMetric("digits.tupletPoint"),this.y_pos=16,this.x_pos=100,this.width=200,this.setTupletLocation(this.options.location||De.LOCATION_TOP),we.AlignRestsToNotes(t,!0,!0),this.resolveGlyphs(),this.attach()}static get CATEGORY(){return h.Tuplet}static get LOCATION_TOP(){return ve.TOP}static get LOCATION_BOTTOM(){return ve.BOTTOM}static get NESTING_OFFSET(){return 15}static get metrics(){return K.currentMusicFont().getMetrics().glyphs.tuplet}attach(){for(let t=0;t=1;)this.numerator_glyphs.unshift(new R("timeSig"+t%10,this.point)),t=parseInt((t/10).toString(),10);for(this.denom_glyphs=[],t=this.notes_occupied;t>=1;)this.denom_glyphs.unshift(new R("timeSig"+t%10,this.point)),t=parseInt((t/10).toString(),10)}getNestedTupletCount(){const t=this.location,e=this.notes[0];let i=a(e,t),s=a(e,t);function a(t,e){return t.getTupletStack().filter((t=>t.location===e)).length}return this.notes.forEach((e=>{const n=a(e,t);i=n>i?n:i,s=n0&&(s=Math.min(n,s))}}}else{let t=De.metrics.bottomLine;this.notes.forEach((e=>{const i=e.getModifierContext();i&&(t=Math.max(t,i.getState().text_line+1))})),s=i.checkStave().getYForLine(t)+De.metrics.noteHeadOffset;for(let t=0;ts&&(s=e)}}return s+t+e}draw(){const t=this.checkContext();this.setRendered();const e=this.notes[0],i=this.notes[this.notes.length-1];this.bracketed?(this.x_pos=e.getTieLeftX()-5,this.width=i.getTieRightX()-this.x_pos+5):(this.x_pos=e.getStemX(),this.width=i.getStemX()-this.x_pos),this.y_pos=this.getYPosition();const s=(t,e)=>t+b(e.getMetrics().width);let a=this.numerator_glyphs.reduce(s,0);this.ratioed&&(a=this.denom_glyphs.reduce(s,a),a+=.32*this.point);const n=this.x_pos+this.width/2-a/2;if(this.bracketed){const e=this.width/2-a/2-5;e>0&&(t.fillRect(this.x_pos,this.y_pos,e,1),t.fillRect(this.x_pos+this.width/2+a/2+5,this.y_pos,e,1),t.fillRect(this.x_pos,this.y_pos+(this.location===De.LOCATION_BOTTOM?1:0),1,10*this.location),t.fillRect(this.x_pos+this.width,this.y_pos+(this.location===De.LOCATION_BOTTOM?1:0),1,10*this.location))}const o=K.currentMusicFont().lookupMetric("digits.shiftY",0);let l=0;if(this.numerator_glyphs.forEach((e=>{e.render(t,n+l,this.y_pos+this.point/3-2+o),l+=b(e.getMetrics().width)})),this.ratioed){const e=n+l+.16*this.point,i=.06*this.point;t.beginPath(),t.arc(e,this.y_pos-.08*this.point,i,0,2*Math.PI,!0),t.closePath(),t.fill(),t.beginPath(),t.arc(e,this.y_pos+.12*this.point,i,0,2*Math.PI,!0),t.closePath(),t.fill(),l+=.32*this.point,this.denom_glyphs.forEach((e=>{e.render(t,n+l,this.y_pos+this.point/3-2+o),l+=b(e.getMetrics().width)}))}}}function Ce(t){let e=0;return t.forEach((t=>{t.keyProps&&t.keyProps.forEach((t=>{e+=t.line-3}))})),e>=0?Q.DOWN:Q.UP}const Ee="L",ke="B";class Fe extends N{constructor(t,e=!1){if(super(),this.slope=0,this.y_shift=0,!t||0===t.length)throw new c("BadArguments","No notes provided for beam.");if(1===t.length)throw new c("BadArguments","Too few notes for beam.");if(this.ticks=t[0].getIntrinsicTicks(),this.ticks>=K.durationToTicks("4"))throw new c("BadArguments","Beams can only be applied to notes shorter than a quarter note.");let i,s;for(this.stem_direction=Q.UP,i=0;it+e.getStemDirection()),0);a=e>-1?Q.UP:Q.DOWN}for(i=0;i(new u).parse(t)));{const e=parseInt(t.split("/")[0],10),i=parseInt(t.split("/")[1],10);if(e%3==0)return[new u(3,i)];if(i>4)return[new u(2,i)];if(i<=4)return[new u(1,i)]}return[new u(1,4)]}static applyAndGetBeams(t,e,i){return Fe.generateBeams(t.getTickables(),{groups:i,stem_direction:e})}static generateBeams(t,e={}){e.groups&&e.groups.length||(e.groups=[new u(2,8)]);const i=e.groups.map((t=>{if(!t.multiply)throw new c("InvalidBeamGroups","The beam groups must be an array of Vex.Flow.Fractions");return t.clone().multiply(K.RESOLUTION,1)})),s=t;let a=0,n=[],o=[];function l(){i.length-1>a?a+=1:a=0}!function(){let t=[],e=new u(0,1);s.forEach((s=>{if(t=[],s.shouldIgnoreTicks())return n.push(o),void(o=t);o.push(s);const r=i[a].clone(),h=(c=o,c.reduce(((t,e)=>e.getTicks().clone().add(t)),new u(0,1))).add(e);var c;const d=K.durationToNumber(s.getDuration())<8;if(d&&s.getTuplet()&&(r.numerator*=2),h.greaterThan(r)){if(!d){const e=o.pop();e&&t.push(e)}n.push(o);do{e=h.subtract(i[a]),l()}while(e.greaterThanEquals(i[a]));o=t}else h.equals(r)&&(n.push(o),e=new u(0,1),o=t,l())})),o.length>0&&n.push(o)}(),function(){const t=[];n.forEach((i=>{let s=[];i.forEach(((i,a,n)=>{const o=0===a||a===n.length-1,l=n[a-1],r=!e.beam_rests&&i.isRest(),h=e.beam_rests&&e.beam_middle_only&&i.isRest()&&o;let c=!1;if(e.maintain_stem_directions&&l&&!i.isRest()&&!l.isRest()){const t=l.getStemDirection();c=i.getStemDirection()!==t}const d=parseInt(i.getDuration(),10)<8;r||h||c||d?(s.length>0&&t.push(s),s=c?[i]:[]):s.push(i)})),s.length>0&&t.push(s)})),n=t}(),n.forEach((t=>{let i;if(e.maintain_stem_directions){const e=function(t){for(let e=0;e{t.setStemDirection(e)}))}(t,i)}));const r=n.filter((t=>{if(t.length>1){let e=!0;return t.forEach((t=>{t.getIntrinsicTicks()>=K.durationToTicks("4")&&(e=!1)})),e}return!1})),h=function(){const t=[];return n.forEach((e=>{let i;e.forEach((e=>{const s=e.getTuplet();s&&i!==s&&(i=s,t.push(i))}))})),t}(),d=[];return r.forEach((t=>{const i=new Fe(t);e.show_stemlets&&(i.render_options.show_stemlets=!0),e.secondary_breaks&&(i.render_options.secondary_break_ticks=K.durationToTicks(e.secondary_breaks)),!0===e.flat_beams&&(i.render_options.flat_beams=!0,i.render_options.flat_beam_offset=e.flat_beam_offset),d.push(i)})),h.forEach((t=>{const e=t.notes[0].stem_direction===Q.DOWN?ve.BOTTOM:ve.TOP;t.setTupletLocation(e);let i=!1;for(let e=0;et.getGlyph().beam_count)).reduce(((t,e)=>e>t?e:t))}breakSecondaryAt(t){return this.break_on_indices=t,this}getSlopeY(t,e,i,s){return i+(t-e)*s}calculateSlope(){const{notes:t,stem_direction:e,render_options:{max_slope:i,min_slope:s,slope_iterations:a,slope_cost:n}}=this,o=t[0],l=function(t,e){const i=t.getStemExtents().topY,s=t.getStemX();return(e.getStemExtents().topY-i)/(e.getStemX()-s)}(o,t[t.length-1]),r=(i-s)/a;let h=Number.MAX_VALUE,c=0,d=0;for(let a=s;a<=i;a+=r){let i=0,s=0;for(let n=1;na)&&(r=a,o=Math.min(...s.getYs()),l=s.getBeamCount())}let h=n/t.length;const c=s+l*(1.5*i),d=o+c*-e;e===Q.DOWN&&hd&&(h=o-c),a?(e===Q.DOWN&&h>a||e===Q.UP&&h=8&&(c=-1!==this.break_on_indices.indexOf(r),this.render_options.secondary_break_ticks&&l>=this.render_options.secondary_break_ticks&&(l=0,c=!0));const d=h.getIntrinsicTicks(){const i=e.getStem();i&&i.setContext(t).draw()}),this)}drawBeamLines(t){const e=["4","8","16","32","64"],i=this.notes[0];let s=this.getBeamYToDraw();const a=i.getStemX(),n=this.render_options.beam_width*this.stem_direction;for(let i=0;i0||!0===e;return!e||a>0||(this.pos=s),o?this.matchSuccess():this.matchFail(s),{success:o,results:i,numMatches:a}}expectZeroOrMore(t){return this.expectOneOrMore(t,!0)}expect(t){if(Me("Evaluating rule function:",t),!t)throw new c("Invalid rule function");let e;const i=t.bind(this.grammar)();if(i.token)e=this.matchToken(i.token,!0===i.noSpace),e.success&&(this.pos+=e.incrementPos);else{if(!i.expect)throw Me(i),new c("Bad grammar! No `token` or `expect` property "+i);e=i.oneOrMore?this.expectOneOrMore(i):i.zeroOrMore?this.expectZeroOrMore(i):this.expectOne(i)}const s=[];return e.matches=s,e.results&&e.results.forEach((t=>s.push(Re(t)))),i.run&&e.success&&i.run({matches:s}),e}}function Le(...t){He.DEBUG&&m("Vex.Flow.EasyScore",t)}Oe.DEBUG=!1;class ze{constructor(t){this.builder=t}begin(){return this.LINE}LINE(){return{expect:[this.PIECE,this.PIECES,this.EOL]}}PIECE(){return{expect:[this.CHORDORNOTE,this.PARAMS],run:()=>this.builder.commitPiece()}}PIECES(){return{expect:[this.COMMA,this.PIECE],zeroOrMore:!0}}PARAMS(){return{expect:[this.DURATION,this.TYPE,this.DOTS,this.OPTS]}}CHORDORNOTE(){return{expect:[this.CHORD,this.SINGLENOTE],or:!0}}CHORD(){return{expect:[this.LPAREN,this.NOTES,this.RPAREN],run:t=>this.builder.addChord(t.matches[1])}}NOTES(){return{expect:[this.NOTE],oneOrMore:!0}}NOTE(){return{expect:[this.NOTENAME,this.ACCIDENTAL,this.OCTAVE]}}SINGLENOTE(){return{expect:[this.NOTENAME,this.ACCIDENTAL,this.OCTAVE],run:t=>{const e=t;this.builder.addSingleNote(e.matches[0],e.matches[1],e.matches[2])}}}ACCIDENTAL(){return{expect:[this.MICROTONES,this.ACCIDENTALS],maybe:!0,or:!0}}DOTS(){return{expect:[this.DOT],zeroOrMore:!0,run:t=>this.builder.setNoteDots(t.matches)}}TYPE(){return{expect:[this.SLASH,this.MAYBESLASH,this.TYPES],maybe:!0,run:t=>this.builder.setNoteType(t.matches[2])}}DURATION(){return{expect:[this.SLASH,this.DURATIONS],maybe:!0,run:t=>this.builder.setNoteDuration(t.matches[1])}}OPTS(){return{expect:[this.LBRACKET,this.KEYVAL,this.KEYVALS,this.RBRACKET],maybe:!0}}KEYVALS(){return{expect:[this.COMMA,this.KEYVAL],zeroOrMore:!0}}KEYVAL(){return{expect:[this.KEY,this.EQUALS,this.VAL],run:t=>this.builder.addNoteOption(t.matches[0],t.matches[2].slice(1,-1))}}VAL(){return{expect:[this.SVAL,this.DVAL],or:!0}}KEY(){return{token:"[a-zA-Z][a-zA-Z0-9]*"}}DVAL(){return{token:'["][^"]*["]'}}SVAL(){return{token:"['][^']*[']"}}NOTENAME(){return{token:"[a-gA-G]"}}OCTAVE(){return{token:"[0-9]+"}}ACCIDENTALS(){return{token:"bb|b|##|#|n"}}MICROTONES(){return{token:"bbs|bss|bs|db|d|\\+\\+-|\\+-|\\+\\+|\\+|k|o"}}DURATIONS(){return{token:"[0-9whq]+"}}TYPES(){return{token:"[rRsSmMhHgG]"}}LPAREN(){return{token:"[(]"}}RPAREN(){return{token:"[)]"}}COMMA(){return{token:"[,]"}}DOT(){return{token:"[.]"}}SLASH(){return{token:"[/]"}}MAYBESLASH(){return{token:"[/]?"}}EQUALS(){return{token:"[=]"}}LBRACKET(){return{token:"\\["}}RBRACKET(){return{token:"\\]"}}EOL(){return{token:"$"}}}class Ue{constructor(t){this.chord=[],this.dots=0,this.options={},this.duration=t}}class Ie{constructor(t){this.commitHooks=[],this.factory=t,this.reset()}reset(t){this.options=Object.assign({stem:"auto",clef:"treble"},t),this.elements={notes:[],accidentals:[]},this.rollingDuration="8",this.resetPiece()}getFactory(){return this.factory}getElements(){return this.elements}addCommitHook(t){this.commitHooks.push(t)}resetPiece(){Le("resetPiece"),this.piece=new Ue(this.rollingDuration)}setNoteDots(t){Le("setNoteDots:",t),t&&(this.piece.dots=t.length)}setNoteDuration(t){Le("setNoteDuration:",t),this.rollingDuration=this.piece.duration=t||this.rollingDuration}setNoteType(t){Le("setNoteType:",t),t&&(this.piece.type=t)}addNoteOption(t,e){Le("addNoteOption: key:",t,"value:",e),this.piece.options[t]=e}addNote(t,e,i){Le("addNote:",t,e,i),this.piece.chord.push({key:t,accid:e,octave:i})}addSingleNote(t,e,i){Le("addSingleNote:",t,e,i),this.addNote(t,e,i)}addChord(t){Le("startChord"),"object"!=typeof t[0]?this.addSingleNote(t[0]):t.forEach((t=>{t&&this.addNote(...t)})),Le("endChord")}commitPiece(){Le("commitPiece");const{factory:t}=this;if(!t)return;const e=Object.assign(Object.assign({},this.options),this.piece.options),i=b(e.stem,"BadArguments","options.stem is not defined").toLowerCase(),s=b(e.clef,"BadArguments","options.clef is not defined").toLowerCase(),{chord:a,duration:n,dots:o,type:l}=this.piece,r=L.accidentals,h=a.map((t=>{var e;return t.key+(r.includes(null!==(e=t.accid)&&void 0!==e?e:"")?t.accid:"")+"/"+t.octave})),c="auto"===i,d="g"==(null==l?void 0:l.toLowerCase())?t.GhostNote({duration:n,dots:o}):t.StaveNote({keys:h,duration:n,dots:o,type:l,clef:s,auto_stem:c});c||d.setStemDirection("up"===i?Q.UP:Q.DOWN);const m=[];a.forEach(((e,i)=>{const s=e.accid;if("string"==typeof s){const e=t.Accidental({type:s});d.addModifier(e,i),m.push(e)}else m.push(void 0)}));for(let t=0;tt(e,d,this))),this.elements.notes.push(d),this.elements.accidentals.push(m),this.resetPiece()}}function We(t,e){void 0!==t.id&&e.setAttribute("id",t.id)}const Ge=/\s*,\s*/;function Ye(t,e){void 0!==t.class&&t.class.split(Ge).forEach((t=>e.addClass(t)))}class He{constructor(t={}){this.defaults={clef:"treble",time:"4/4",stem:"auto"},this.setOptions(t)}set(t){return this.defaults=Object.assign(Object.assign({},this.defaults),t),this}setOptions(t){var e,i;const s=t.factory,a=null!==(e=t.builder)&&void 0!==e?e:new Ie(s);return this.options=Object.assign(Object.assign({commitHooks:[We,Ye,bt.easyScoreHook,Nt.easyScoreHook],throwOnError:!1},t),{factory:s,builder:a}),this.factory=s,this.builder=a,this.grammar=new ze(this.builder),this.parser=new Oe(this.grammar),null===(i=this.options.commitHooks)||void 0===i||i.forEach((t=>this.addCommitHook(t))),this}setContext(t){return this.factory.setContext(t),this}parse(t,e={}){this.builder.reset(e);const i=this.parser.parse(t);if(!i.success&&this.options.throwOnError)throw Le(i),new c("Error parsing line: "+t);return i}beam(t,e){return this.factory.Beam({notes:t,options:e}),t}tuplet(t,e){return this.factory.Tuplet({notes:t,options:e}),t}notes(t,e={}){return e=Object.assign({clef:this.defaults.clef,stem:this.defaults.stem},e),this.parse(t,e),this.builder.getElements().notes}voice(t,e={}){return e=Object.assign({time:this.defaults.time},e),this.factory.Voice(e).addTickables(t)}addCommitHook(t){this.builder.addCommitHook(t)}}He.DEBUG=!1;const je="Ghost note must have valid initialization data to identify duration.";class Xe extends It{static get CATEGORY(){return h.GhostNote}constructor(t){if(!t)throw new c("BadArguments",je);let e;if("string"==typeof t)e={duration:t};else{if("object"!=typeof t)throw new c("BadArguments",je);e=t}super(e),this.setWidth(0)}isRest(){return!0}setStave(t){return super.setStave(t),this}addToModifierContext(t){return this}preFormat(){return this.preFormatted=!0,this}draw(){this.setRendered();for(let t=0;t=Ze.type.TEXT&&t<=Ze.type.MIXED&&(this.type=t),this}setCustomText(t,e){return this.custom_depress_text=t||"",this.custom_release_text=e||"",this}setLine(t){return this.line=t,this}drawBracketed(){const t=this.checkContext();let e,i,s=!1;this.notes.forEach(((a,n,o)=>{s=!s;const l=a.getAbsoluteX(),r=a.checkStave().getYForBottomText(this.line+3);if(l{e=!e;const s=i.checkStave(),a=i.getAbsoluteX(),n=s.getYForBottomText(this.line+3),o=K.currentMusicFont().lookupMetric(`pedalMarking.${e?"down":"up"}.point`);let l=0;e?this.custom_depress_text?(l=t.measureText(this.custom_depress_text).width,t.fillText(this.custom_depress_text,a-l/2,n)):Qe("pedal_depress",t,a,n,o):this.custom_release_text?(l=t.measureText(this.custom_release_text).width,t.fillText(this.custom_release_text,a-l/2,n)):Qe("pedal_release",t,a,n,o)}))}draw(){const t=this.checkContext();this.setRendered(),t.save(),t.setStrokeStyle(this.render_options.color),t.setFillStyle(this.render_options.color),t.setFont(this.textFont),function(...t){Ze.DEBUG&&m("Vex.Flow.PedalMarking",t)}("Rendering Pedal Marking"),this.type===Ze.type.BRACKET||this.type===Ze.type.MIXED?(t.setLineWidth(this.render_options.bracket_line_width),this.drawBracketed()):this.type===Ze.type.TEXT&&this.drawText(),t.restore()}}Ze.DEBUG=!1,Ze.TEXT_FONT={family:E.SERIF,size:12,weight:T.BOLD,style:w.ITALIC},Ze.GLYPHS={pedal_depress:{code:"keyboardPedalPed",x_shift:-10,y_shift:0},pedal_release:{code:"keyboardPedalUp",x_shift:-2,y_shift:3}},Ze.type={TEXT:1,BRACKET:2,MIXED:3},Ze.typeString={text:Ze.type.TEXT,bracket:Ze.type.BRACKET,mixed:Ze.type.MIXED};const ti={1:"repeat1Bar",2:"repeat2Bars",4:"repeat4Bars",slash:"repeatBarSlash"};class ei extends Ve{static get CATEGORY(){return h.RepeatNote}constructor(t,e,i){super(void 0,Object.assign({duration:"q",align_center:"slash"!==t},e),i);const s=new R(ti[t]||"repeat1Bar",K.currentMusicFont().lookupMetric("repeatNote.point",40),{category:"repeatNote"});this.setGlyph(s)}}function ii(t,e,i,s,a,n,o){t.beginPath(),t.moveTo(e,i),t.lineTo(s,a),t.lineTo(n,o),t.lineTo(e,i),t.closePath(),t.fill()}class si extends N{constructor(t){super(),this.setNotes(t),this.text="",this.resetFont(),this.render_options={padding_left:4,padding_right:3,line_width:1,line_dash:void 0,rounded_end:!0,color:void 0,draw_start_arrow:!1,draw_end_arrow:!1,arrowhead_length:10,arrowhead_angle:Math.PI/8,text_position_vertical:si.TextVerticalPosition.TOP,text_justification:si.TextJustification.CENTER}}static get CATEGORY(){return h.StaveLine}setText(t){return this.text=t,this}setNotes(t){if(!t.first_note&&!t.last_note)throw new c("BadArguments","Notes needs to have either first_note or last_note set.");if(t.first_indices||(t.first_indices=[0]),t.last_indices||(t.last_indices=[0]),t.first_indices.length!==t.last_indices.length)throw new c("BadArguments","Connected notes must have same number of indices.");return this.notes=t,this.first_note=t.first_note,this.first_indices=t.first_indices,this.last_note=t.last_note,this.last_indices=t.last_indices,this}applyLineStyle(){const t=this.checkContext(),e=this.render_options;e.line_dash&&t.setLineDash(e.line_dash),e.line_width&&t.setLineWidth(e.line_width),e.rounded_end?t.setLineCap("round"):t.setLineCap("square")}applyFontStyle(){const t=this.checkContext();t.setFont(this.textFont);const e=this.render_options.color;e&&(t.setStrokeStyle(e),t.setFillStyle(e))}drawArrowLine(t,e,i){const s=this.render_options.draw_start_arrow&&this.render_options.draw_end_arrow,a=e.x,n=e.y,o=i.x,l=i.y,r=Math.sqrt((o-a)*(o-a)+(l-n)*(l-n)),h=(r-this.render_options.arrowhead_length/3)/r;let c,d,b,m;this.render_options.draw_end_arrow||s?(c=Math.round(a+(o-a)*h),d=Math.round(n+(l-n)*h)):(c=o,d=l),this.render_options.draw_start_arrow||s?(b=a+(o-a)*(1-h),m=n+(l-n)*(1-h)):(b=a,m=n),this.render_options.color&&(t.setStrokeStyle(this.render_options.color),t.setFillStyle(this.render_options.color)),t.beginPath(),t.moveTo(b,m),t.lineTo(c,d),t.stroke(),t.closePath();const g=Math.atan2(l-n,o-a),_=Math.abs(this.render_options.arrowhead_length/Math.cos(this.render_options.arrowhead_angle));let x,p,u,f,y,S;(this.render_options.draw_end_arrow||s)&&(x=g+Math.PI+this.render_options.arrowhead_angle,u=o+Math.cos(x)*_,f=l+Math.sin(x)*_,p=g+Math.PI-this.render_options.arrowhead_angle,y=o+Math.cos(p)*_,S=l+Math.sin(p)*_,ii(t,u,f,o,l,y,S)),(this.render_options.draw_start_arrow||s)&&(x=g+this.render_options.arrowhead_angle,u=a+Math.cos(x)*_,f=n+Math.sin(x)*_,p=g-this.render_options.arrowhead_angle,y=a+Math.cos(p)*_,S=n+Math.sin(p)*_,ii(t,u,f,a,n,y,S))}draw(){const t=this.checkContext();this.setRendered();const e=this.first_note,i=this.last_note,s=this.render_options;t.save(),this.applyLineStyle();let a={x:0,y:0},n={x:0,y:0};this.first_indices.forEach(((o,l)=>{const r=this.last_indices[l];a=e.getModifierStartXY(2,o),n=i.getModifierStartXY(1,r);const h=a.y>n.y;a.x+=e.getMetrics().modRightPx+s.padding_left,n.x-=i.getMetrics().modLeftPx+s.padding_right;const c=e.getGlyph().getWidth();e.getKeyProps()[o].displaced&&1===e.getStemDirection()&&(a.x+=c+s.padding_left);i.getKeyProps()[r].displaced&&-1===i.getStemDirection()&&(n.x-=c+s.padding_right),a.y+=h?-3:1,n.y+=h?2:0,this.drawArrowLine(t,a,n)})),t.restore();const o=t.measureText(this.text).width,l=s.text_justification;let r=0;if(l===si.TextJustification.LEFT)r=a.x;else if(l===si.TextJustification.CENTER){r=(n.x-a.x)/2+a.x-o/2}else l===si.TextJustification.RIGHT&&(r=n.x-o);let h=0;const c=s.text_position_vertical;return c===si.TextVerticalPosition.TOP?h=e.checkStave().getYForTopText():c===si.TextVerticalPosition.BOTTOM&&(h=e.checkStave().getYForBottomText(K.TEXT_HEIGHT_OFFSET_HACK)),t.save(),this.applyFontStyle(),t.fillText(this.text,r,h),t.restore(),this}}si.TEXT_FONT=Object.assign({},N.TEXT_FONT),si.TextVerticalPosition={TOP:1,BOTTOM:2},si.TextJustification={LEFT:1,CENTER:2,RIGHT:3};class ai extends N{constructor(t={}){super(),this.setOptions(t),this.parts=[]}static get CATEGORY(){return h.System}setOptions(t={}){if(!t.factory)throw new c("NoFactory","System.setOptions(options) requires a factory.");this.factory=t.factory,this.options=Object.assign(Object.assign({factory:this.factory,x:10,y:10,width:500,spaceBetweenStaves:12,autoWidth:!1,noJustification:!1,debugFormatter:!1,formatIterations:0,noPadding:!1},t),{details:Object.assign({alpha:.5},t.details),formatOptions:Object.assign({},t.formatOptions)}),!1===this.options.noJustification&&void 0===t.width&&(this.options.autoWidth=!0)}setContext(t){return super.setContext(t),this.factory.setContext(t),this}addConnector(t="double"){return this.connector=this.factory.StaveConnector({top_stave:this.parts[0].stave,bottom_stave:this.parts[this.parts.length-1].stave,type:t}),this.connector}addStave(t){var e;const i=Object.assign({left_bar:!1},t.options),s=null!==(e=t.stave)&&void 0!==e?e:this.factory.Stave({x:this.options.x,y:this.options.y,width:this.options.width,options:i}),a=Object.assign(Object.assign({stave:s,spaceAbove:0,spaceBelow:0,debugNoteMetrics:!1,noJustification:!1},t),{options:i}),n=this.getContext();return a.voices.forEach((t=>t.setContext(n).setStave(s).getTickables().forEach((t=>t.setStave(s))))),this.parts.push(a),s}format(){const t=this.options.details;let e=0;const i=new we(t);this.formatter=i;let s=this.options.y,a=0,n=[];const o=[];this.parts.forEach((t=>{s+=t.stave.space(t.spaceAbove),t.stave.setY(s),this.options.autoWidth?t.voices.forEach((t=>{i.joinVoices([t])})):i.joinVoices(t.voices),s+=t.stave.space(t.spaceBelow),s+=t.stave.space(this.options.spaceBetweenStaves),t.debugNoteMetrics&&(o.push({y:s,voice:t.voices[0]}),s+=15),n=n.concat(t.voices),a=Math.max(a,t.stave.getNoteStartX())})),this.parts.forEach((t=>t.stave.setNoteStartX(a))),this.options.autoWidth?(e=i.preCalculateMinTotalWidth(n),this.parts.forEach((t=>{t.stave.setWidth(e+pe.rightPadding+(a-this.options.x))}))):e=this.options.noPadding?this.options.width-this.options.x:this.options.width-(a-this.options.x)-pe.defaultPadding,i.format(n,this.options.noJustification?0:e,this.options.formatOptions);for(let e=0;e{e.voice.getTickables().forEach((i=>_t.plotMetrics(t,i,e.y)))}))}}class ni extends It{constructor(t,e=!1){super(t),this.glyphs=[],this.greatestString=()=>this.positions.map((t=>t.str)).reduce(((t,e)=>t>e?t:e)),this.leastString=()=>this.positions.map((t=>t.str)).reduce(((t,e)=>tthis.width}setStave(t){super.setStave(t);const e=t.getContext();if(this.setContext(e),e){this.width=0;for(let t=0;ti.width),this.width=Math.max(i.getWidth(),this.width)}this.glyph.getWidth=()=>this.width}const i=this.positions.map((({str:e})=>t.getYForLine(Number(e)-1)));return this.setYs(i),this.stem&&this.stem.setYBounds(this.getStemY(),this.getStemY()),this}getPositions(){return this.positions}getModifierStartXY(t,e){if(!this.preFormatted)throw new c("UnformattedNote","Can't call GetModifierStartXY on an unformatted note");if(0===this.ys.length)throw new c("NoYValues","No Y-Values calculated for this note.");let i=0;if(t===O.Position.LEFT)i=-2;else if(t===O.Position.RIGHT)i=this.width+2;else if(t===O.Position.BELOW||t===O.Position.ABOVE){i=this.glyph.getWidth()/2}return{x:this.getAbsoluteX()+i,y:this.ys[e]}}getLineForRest(){return Number(this.positions[0].str)}preFormat(){this.preFormatted||(this.modifierContext&&this.modifierContext.preFormat(),this.preFormatted=!0)}getStemX(){return this.getCenterGlyphX()}getStemY(){const t=this.checkStave().getNumLines()-.5,e=Q.UP===this.stem_direction?-.5:t;return this.checkStave().getYForLine(e)}getStemExtents(){return this.checkStem().getExtents()}drawFlag(){const{beam:t,glyph:e,stem_direction:i,render_options:{draw_stem:s,glyph_font_scale:a}}=this,n=this.checkContext(),o=null==t&&s;if(e.flag&&o){const t=this.getStemX()+1,s=this.getStemY()-this.checkStem().getHeight(),o=i===Q.DOWN?e.code_flag_downstem:e.code_flag_upstem;R.renderGlyph(n,t,s,a,o,{category:"flag.tabStem"})}}drawModifiers(){this.modifiers.forEach((t=>{i(t,h.Dot)&&!this.render_options.draw_dots||(t.setContext(this.getContext()),t.drawWithStyle())}))}drawStemThrough(){const t=this.getStemX(),e=this.getStemY(),i=this.checkContext(),s=this.render_options.draw_stem,a=this.render_options.draw_stem_through_stave;if(s&&a){const s=function(t,e,i,s){const a=1!==s,n=-1!==s,o=i.getSpacingBetweenLines(),l=i.getNumLines(),r=[];return e.forEach((e=>{const h=e.indexOf(l)>-1,c=e.indexOf(1)>-1;if(a&&c||n&&h)return;1===e.length&&e.push(e[0]);const d=[];e.forEach(((e,a,n)=>{const r=1===e,h=e===l;let c=i.getYForLine(e-1);0!==a||r?a!==n.length-1||h||(c+=o/2-1):c-=o/2-1,d.push(c),1===s&&r?d.push(t-2):-1===s&&h&&d.push(t+2)})),r.push(d.sort(((t,e)=>t-e)))})),r}(e,function(t,e){const i=[];let s=[];for(let a=1;a<=t;a++)e.indexOf(a)>-1?(i.push(s),s=[]):s.push(a);return s.length>0&&i.push(s),i}(this.checkStave().getNumLines(),this.positions.map((t=>Number(t.str)))),this.checkStave(),this.getStemDirection());i.save(),i.setLineWidth(Q.WIDTH),s.forEach((e=>{0!==e.length&&(i.beginPath(),i.moveTo(t,e[0]),i.lineTo(t,e[e.length-1]),i.stroke(),i.closePath())})),i.restore()}}drawPositions(){const t=this.checkContext(),e=this.getAbsoluteX(),i=this.ys;for(let s=0;s{const i=di.GLYPHS[e];if(!i)throw new c("Invalid dynamics character: "+e);const s=b(this.render_options.glyph_font_size),a=new R(i.code,s,{category:"textNote"});this.glyphs.push(a),t+=i.width})),this.setWidth(t),this.preFormatted=!0,this}draw(){this.setRendered();const t=this.getAbsoluteX(),e=this.checkStave().getYForLine(this.line+-3);ci("Rendering Dynamics: ",this.sequence);let i=t;this.glyphs.forEach(((t,s)=>{const a=this.sequence[s];t.render(this.checkContext(),i,e),i+=di.GLYPHS[a].width}))}}di.DEBUG=!1;class bi extends _t{constructor(t,e){super({duration:"b"});const i=new ge(t,e);this.timeSigInfo=i.getInfo(),this.setWidth(this.timeSigInfo.glyph.getMetrics().width),this.ignore_ticks=!0}static get CATEGORY(){return h.TimeSigNote}addToModifierContext(t){return this}preFormat(){return this.preFormatted=!0,this}draw(){const t=this.checkStave(),e=this.checkContext();this.setRendered(),this.timeSigInfo.glyph.getContext()||this.timeSigInfo.glyph.setContext(e),this.timeSigInfo.glyph.setStave(t),this.timeSigInfo.glyph.setYShift(t.getYForLine(2)-t.getYForGlyphs()),this.timeSigInfo.glyph.renderToStave(this.getAbsoluteX())}}class mi extends N{constructor(t){super(),t.start&&(this.start=t.start),t.stop&&(this.stop=t.stop),this.line=1,this.render_options={harsh:!1,wave_height:6,wave_width:4,wave_girth:2,vibrato_width:0}}static get CATEGORY(){return h.VibratoBracket}setLine(t){return this.line=t,this}setHarsh(t){return this.render_options.harsh=t,this}draw(){const t=this.checkContext();this.setRendered();const e=this.start&&this.start.checkStave().getYForTopText(this.line)||this.stop&&this.stop.checkStave().getYForTopText(this.line)||0,i=this.start&&this.start.getAbsoluteX()||this.stop&&this.stop.checkStave().getTieStartX()||0,s=this.stop&&this.stop.getAbsoluteX()-this.stop.getWidth()-5||this.start&&this.start.checkStave().getTieEndX()-10||0;this.render_options.vibrato_width=s-i,function(...t){mi.DEBUG&&m("Vex.Flow.VibratoBracket",t)}("Rendering VibratoBracket: start_x:",i,"stop_x:",s,"y:",e),ie.renderVibrato(t,i,e,this.render_options)}}function gi(...t){_i.DEBUG&&m("Vex.Flow.Factory",t)}mi.DEBUG=!1;class _i{constructor(t={}){gi("New factory: ",t),this.options={stave:{space:10},renderer:{elementId:"",width:500,height:200,background:"#FFF"},font:_i.TEXT_FONT},this.setOptions(t)}static newFromElementId(t,e=500,i=200){return new _i({renderer:{elementId:t,width:e,height:i}})}reset(){this.renderQ=[],this.systems=[],this.staves=[],this.voices=[],this.stave=void 0}setOptions(t){this.options=Object.assign(Object.assign({},this.options),t),this.initRenderer(),this.reset()}initRenderer(){const{elementId:t,width:e,height:i,background:s}=this.options.renderer;if(null==t)return;if(""==t)throw gi(this),new c("renderer.elementId not set in FactoryOptions");let a=this.options.renderer.backend;if(void 0===a){a=Yt(document.getElementById(t))?Zt.Backends.CANVAS:Zt.Backends.SVG}this.context=Zt.buildContext(t,a,e,i,s)}getContext(){return this.context}setContext(t){return this.context=t,this}getStave(){return this.stave}getVoices(){return this.voices}Stave(t){const e=this.options.stave.space,i=Object.assign({x:0,y:0,width:this.options.renderer.width-1*e,options:{spacing_between_lines_px:1*e}},t),s=new pe(i.x,i.y,i.width,i.options);return this.staves.push(s),s.setContext(this.context),this.stave=s,s}TabStave(t){const e=this.options.stave.space,i=Object.assign({x:0,y:0,width:this.options.renderer.width-1*e,options:{spacing_between_lines_px:1.3*e}},t),s=new oi(i.x,i.y,i.width,i.options);return this.staves.push(s),s.setContext(this.context),this.stave=s,s}StaveNote(t){const e=new Gt(t);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}GlyphNote(t,e,i){const s=new Ve(t,e,i);return this.stave&&s.setStave(this.stave),s.setContext(this.context),this.renderQ.push(s),s}RepeatNote(t,e,i){const s=new ei(t,e,i);return this.stave&&s.setStave(this.stave),s.setContext(this.context),this.renderQ.push(s),s}GhostNote(t){const e=new Xe(t);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}TextNote(t){const e=new ce(t);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}BarNote(t={}){const e=new Dt(t.type);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}ClefNote(t){const e=Object.assign({type:"treble",options:{size:"default",annotation:void 0}},t),i=new Ne(e.type,e.options.size,e.options.annotation);return this.stave&&i.setStave(this.stave),i.setContext(this.context),this.renderQ.push(i),i}TimeSigNote(t){const e=Object.assign({time:"4/4"},t),i=new bi(e.time);return this.stave&&i.setStave(this.stave),i.setContext(this.context),this.renderQ.push(i),i}KeySigNote(t){const e=new $e(t.key,t.cancelKey,t.alterKey);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}TabNote(t){const e=new ni(t);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}GraceNote(t){const e=new Ke(t);return this.stave&&e.setStave(this.stave),e.setContext(this.context),e}GraceNoteGroup(t){const e=new Mt(t.notes,t.slur);return e.setContext(this.context),e}Accidental(t){const e=new J(t.type);return e.setContext(this.context),e}Annotation(t){const e=Object.assign({text:"p",hJustify:st.CENTER,vJustify:at.BOTTOM},t),i=new nt(e.text);return i.setJustification(e.hJustify),i.setVerticalJustification(e.vJustify),i.setFont(e.font),i.setContext(this.context),i}ChordSymbol(t){const e=Object.assign({vJustify:"top",hJustify:"center",kerning:!0,reportWidth:!0},t),i=new kt;return i.setHorizontal(e.hJustify),i.setVertical(e.vJustify),i.setEnableKerning(e.kerning),i.setReportWidth(e.reportWidth),"string"==typeof e.fontFamily&&"number"==typeof e.fontSize?"string"==typeof e.fontWeight?i.setFont(e.fontFamily,e.fontSize,e.fontWeight):i.setFont(e.fontFamily,e.fontSize,""):"number"==typeof e.fontSize&&i.setFontSize(e.fontSize),i.setContext(this.context),i}Articulation(t){const e=Object.assign({type:"a.",position:"above"},t),i=new bt(e.type);return i.setPosition(e.position),i.setContext(this.context),i}TextDynamics(t){const e=Object.assign({text:"p",duration:"q",dots:0,line:0},t),i=new di({text:e.text,line:e.line,duration:e.duration,dots:e.dots});return this.stave&&i.setStave(this.stave),i.setContext(this.context),this.renderQ.push(i),i}Fingering(t){const e=Object.assign({number:"0",position:"left"},t),i=new Nt(e.number);return i.setPosition(e.position),i.setContext(this.context),i}StringNumber(t){const e=new te(t.number);return e.setPosition(t.position),e.setContext(this.context),e}TickContext(){return new Ot}ModifierContext(){return new ae}MultiMeasureRest(t){const e=b(t.number_of_measures,"NoNumberOfMeasures"),i=new Je(e,t);return i.setContext(this.context),this.renderQ.push(i),i}Voice(t){const e=Object.assign({time:"4/4"},t),i=new Bt(e.time,e.options);return this.voices.push(i),i}StaveConnector(t){const e=new fe(t.top_stave,t.bottom_stave);return e.setType(t.type).setContext(this.context),this.renderQ.push(e),e}Formatter(t){return new we(t)}Tuplet(t){const e=Object.assign({notes:[],options:{}},t),i=new De(e.notes,e.options).setContext(this.context);return this.renderQ.push(i),i}Beam(t){var e,i,s;const a=new Fe(t.notes,null===(e=t.options)||void 0===e?void 0:e.autoStem).setContext(this.context);return a.breakSecondaryAt(null!==(s=null===(i=t.options)||void 0===i?void 0:i.secondaryBeamBreaks)&&void 0!==s?s:[]),this.renderQ.push(a),a}Curve(t){const e=new Be(t.from,t.to,t.options).setContext(this.context);return this.renderQ.push(e),e}StaveTie(t){var e;const i=new At({first_note:t.from,last_note:t.to,first_indices:t.first_indices,last_indices:t.last_indices},t.text);return(null===(e=t.options)||void 0===e?void 0:e.direction)&&i.setDirection(t.options.direction),i.setContext(this.context),this.renderQ.push(i),i}StaveLine(t){var e,i;const s=new si({first_note:t.from,last_note:t.to,first_indices:t.first_indices,last_indices:t.last_indices});return(null===(e=t.options)||void 0===e?void 0:e.text)&&s.setText(t.options.text),(null===(i=t.options)||void 0===i?void 0:i.font)&&s.setFont(t.options.font),s.setContext(this.context),this.renderQ.push(s),s}VibratoBracket(t){const e=new mi({start:t.from,stop:t.to});return t.options.line&&e.setLine(t.options.line),t.options.harsh&&e.setHarsh(t.options.harsh),e.setContext(this.context),this.renderQ.push(e),e}TextBracket(t){const e=new hi({start:t.from,stop:t.to,text:t.text,superscript:t.options.superscript,position:t.options.position});return t.options.line&&e.setLine(t.options.line),t.options.font&&e.setFont(t.options.font),e.setContext(this.context),this.renderQ.push(e),e}System(t={}){t.factory=this;const e=new ai(t).setContext(this.context);return this.systems.push(e),e}EasyScore(t={}){return t.factory=this,new He(t)}PedalMarking(t){const e=Object.assign({notes:[],options:{style:"mixed"}},t),i=new Ze(e.notes);return i.setType(Ze.typeString[e.options.style]),i.setContext(this.context),this.renderQ.push(i),i}NoteSubGroup(t){const e=Object.assign({notes:[]},t),i=new Rt(e.notes);return i.setContext(this.context),i}draw(){const t=this.context;this.systems.forEach((e=>e.setContext(t).format())),this.staves.forEach((e=>e.setContext(t).draw())),this.voices.forEach((e=>e.setContext(t).draw())),this.renderQ.forEach((e=>{e.isRendered()||e.setContext(t).draw()})),this.systems.forEach((e=>e.setContext(t).draw())),this.reset()}}_i.DEBUG=!1,_i.TEXT_FONT=Object.assign({},N.TEXT_FONT);class xi extends N{constructor(t,e){super(),this.setNotes(t),this.hairpin=e,this.position=O.Position.BELOW,this.render_options={height:10,y_shift:0,left_shift_px:0,right_shift_px:0,right_shift_ticks:0,left_shift_ticks:0}}static get CATEGORY(){return h.StaveHairpin}static FormatByTicksAndDraw(t,e,i,s,a,n){var o,l;const r=e.pixelsPerTick;if(null==r)throw new c("BadArguments","A valid Formatter must be provide to draw offsets by ticks.");const h=r*(null!==(o=n.left_shift_ticks)&&void 0!==o?o:0),d=r*(null!==(l=n.right_shift_ticks)&&void 0!==l?l:0),b={height:n.height,y_shift:n.y_shift,left_shift_px:h,right_shift_px:d,right_shift_ticks:0,left_shift_ticks:0};new xi({first_note:i.first_note,last_note:i.last_note},s).setContext(t).setRenderOptions(b).setPosition(a).draw()}setPosition(t){return t!==O.Position.ABOVE&&t!==O.Position.BELOW||(this.position=t),this}setRenderOptions(t){return null!=t.height&&null!=t.y_shift&&null!=t.left_shift_px&&null!=t.right_shift_px&&(this.render_options=t),this}setNotes(t){if(!t.first_note&&!t.last_note)throw new c("BadArguments","Hairpin needs to have either first_note or last_note set.");return this.notes=t,this.first_note=t.first_note,this.last_note=t.last_note,this}renderHairpin(t){const e=this.checkContext();let i=this.render_options.y_shift+20,s=t.first_y;this.position===O.Position.ABOVE&&(i=30-i,s=t.first_y-t.staff_height);const a=this.render_options.left_shift_px,n=this.render_options.right_shift_px;switch(e.beginPath(),this.hairpin){case xi.type.CRESC:e.moveTo(t.last_x+n,s+i),e.lineTo(t.first_x+a,s+this.render_options.height/2+i),e.lineTo(t.last_x+n,s+this.render_options.height+i);break;case xi.type.DECRESC:e.moveTo(t.first_x+a,s+i),e.lineTo(t.last_x+n,s+this.render_options.height/2+i),e.lineTo(t.first_x+a,s+this.render_options.height+i)}e.stroke(),e.closePath()}draw(){this.checkContext(),this.setRendered();const t=this.first_note,e=this.last_note;if(!t||!e)throw new c("NoNote","Notes required to draw");const i=t.getModifierStartXY(this.position,0),s=e.getModifierStartXY(this.position,0);this.renderHairpin({first_x:i.x,last_x:s.x,first_y:t.checkStave().getY()+t.checkStave().getHeight(),last_y:e.checkStave().getY()+e.checkStave().getHeight(),staff_height:t.checkStave().getHeight()})}}xi.type={CRESC:1,DECRESC:2};class pi extends Pt{constructor(t,e){if(super(t,"sl."),!e){let i=t.first_note.getPositions()[0].fret;"string"==typeof i&&(i=parseInt(i,10));let s=t.last_note.getPositions()[0].fret;"string"==typeof s&&(s=parseInt(s,10)),e=isNaN(i)||isNaN(s)?pi.SLIDE_UP:i>s?pi.SLIDE_DOWN:pi.SLIDE_UP}this.direction=e,this.render_options.cp1=11,this.render_options.cp2=14,this.render_options.y_shift=.5,this.resetFont()}static get CATEGORY(){return h.TabSlide}static get SLIDE_UP(){return 1}static get SLIDE_DOWN(){return-1}static createSlideUp(t){return new pi(t,pi.SLIDE_UP)}static createSlideDown(t){return new pi(t,pi.SLIDE_DOWN)}renderTie(t){if(0===t.first_ys.length||0===t.last_ys.length)throw new c("BadArguments","No Y-values to render");const e=this.checkContext(),i=t.first_x_px,s=t.first_ys,a=t.last_x_px,n=t.direction;if(n!==pi.SLIDE_UP&&n!==pi.SLIDE_DOWN)throw new c("BadSlide","Invalid slide direction");const o=this.notes.first_indices;for(let t=0;tthis.tuningValues.length)throw new c("BadArguments",`String number must be between 1 and ${this.tuningValues.length}:${t}`);return this.tuningValues[e-1]}getValueForFret(t,e){const i=this.getValueForString(e),s=Number(t);if(s<0)throw new c("BadArguments",`Fret number must be 0 or higher: ${t}`);return i+s}getNoteForFret(t,e){const i=this.getValueForFret(t,e),s=Math.floor(i/12),a=i%12;return`${K.integerToNote(a)}/${s}`}}var fi=function(t,e,i,s){return new(i||(i=Promise))((function(a,n){function o(t){try{r(s.next(t))}catch(t){n(t)}}function l(t){try{r(s.throw(t))}catch(t){n(t)}}function r(t){var e;t.done?a(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(o,l)}r((s=s.apply(t,e||[])).next())}))};class yi{static get BUILD(){return{VERSION:"4.0.1-alpha.2",ID:"0df10df6d1fab3a99f5aa306341a31c6e686d659",DATE:"2022-02-02T09:30:30.784Z"}}static get Flow(){return yi}static setMusicFont(...t){const e=t.map((t=>E.load(t)));return K.MUSIC_FONT_STACK=e,R.MUSIC_FONT_STACK=e.slice(),R.CURRENT_CACHE_KEY=t.join(","),e}static fetchMusicFont(t,e){return fi(this,void 0,void 0,(function*(){}))}static getMusicFont(){return K.MUSIC_FONT_STACK.map((t=>t.getName()))}static get NOTATION_FONT_SCALE(){return K.NOTATION_FONT_SCALE}static set NOTATION_FONT_SCALE(t){K.NOTATION_FONT_SCALE=t}static get TABLATURE_FONT_SCALE(){return K.TABLATURE_FONT_SCALE}static set TABLATURE_FONT_SCALE(t){K.TABLATURE_FONT_SCALE=t}static get RESOLUTION(){return K.RESOLUTION}static set RESOLUTION(t){K.RESOLUTION=t}static get SLASH_NOTEHEAD_WIDTH(){return K.SLASH_NOTEHEAD_WIDTH}static set SLASH_NOTEHEAD_WIDTH(t){K.SLASH_NOTEHEAD_WIDTH=t}static get STAVE_LINE_DISTANCE(){return K.STAVE_LINE_DISTANCE}static set STAVE_LINE_DISTANCE(t){K.STAVE_LINE_DISTANCE=t}static get STAVE_LINE_THICKNESS(){return K.STAVE_LINE_THICKNESS}static set STAVE_LINE_THICKNESS(t){K.STAVE_LINE_THICKNESS=t}static get STEM_HEIGHT(){return K.STEM_HEIGHT}static set STEM_HEIGHT(t){K.STEM_HEIGHT=t}static get STEM_WIDTH(){return K.STEM_WIDTH}static set STEM_WIDTH(t){K.STEM_WIDTH=t}static get TIME4_4(){return K.TIME4_4}static get accidentalMap(){return K.accidentalMap}static get unicode(){return K.unicode}static keySignature(t){return K.keySignature(t)}static hasKeySignature(t){return K.hasKeySignature(t)}static getKeySignatures(){return K.getKeySignatures()}static clefProperties(t){return K.clefProperties(t)}static keyProperties(t,e,i){return K.keyProperties(t,e,i)}static durationToTicks(t){return K.durationToTicks(t)}}yi.Accidental=J,yi.Annotation=nt,yi.Articulation=bt,yi.Barline=vt,yi.BarNote=Dt,yi.Beam=Fe,yi.Bend=Ct,yi.BoundingBox=y,yi.BoundingBoxComputation=S,yi.CanvasContext=Ht,yi.ChordSymbol=kt,yi.Clef=ne,yi.ClefNote=Ne,yi.Crescendo=Ae,yi.Curve=Be,yi.Dot=Ft,yi.EasyScore=He,yi.Element=N,yi.Factory=_i,yi.Font=E,yi.Formatter=we,yi.Fraction=u,yi.FretHandFinger=Nt,yi.GhostNote=Xe,yi.Glyph=R,yi.GlyphNote=Ve,yi.GraceNote=Ke,yi.GraceNoteGroup=Mt,yi.GraceTabNote=class extends ni{static get CATEGORY(){return h.GraceTabNote}constructor(t){super(t,!1),this.render_options=Object.assign(Object.assign({},this.render_options),{y_shift:.3,scale:.6,font:`7.5pt ${E.SANS_SERIF}`}),this.updateWidth()}},yi.KeyManager=class{constructor(t){this.music=new L,this.setKey(t)}setKey(t){return this.key=t,this.reset(),this}getKey(){return this.key}reset(){this.keyParts=this.music.getKeyParts(this.key),this.keyString=this.keyParts.root,this.keyParts.accidental&&(this.keyString+=this.keyParts.accidental);if(!L.scaleTypes[this.keyParts.type])throw new c("BadArguments",`Unsupported key type: ${this.key}`);this.scale=this.music.getScaleTones(this.music.getNoteValue(this.keyString),L.scaleTypes[this.keyParts.type]),this.scaleMap={},this.scaleMapByValue={},this.originalScaleMapByValue={};const t=L.root_indices[this.keyParts.root];for(let e=0;e1){const s=[];let a;t.sort(e);for(let e=0;e":{x_min:35,x_max:421,y_min:28,y_max:632,ha:604,leftSideBearing:35,advanceWidth:466},"?":{x_min:45,x_max:548,y_min:-17,y_max:767,ha:784,leftSideBearing:45,advanceWidth:592},"@":{x_min:51,x_max:730,y_min:-78,y_max:753,ha:831,leftSideBearing:51,advanceWidth:781},A:{x_min:37,x_max:554,y_min:-4,y_max:746,ha:750,leftSideBearing:37,advanceWidth:617},B:{x_min:37,x_max:532,y_min:3,y_max:783,ha:780,leftSideBearing:37,advanceWidth:579},C:{x_min:37,x_max:583,y_min:-3,y_max:775,ha:778,leftSideBearing:37,advanceWidth:623},D:{x_min:50,x_max:530,y_min:-15,y_max:749,ha:764,leftSideBearing:50,advanceWidth:579},E:{x_min:45,x_max:531,y_min:-1,y_max:743,ha:744,leftSideBearing:45,advanceWidth:585},F:{x_min:45,x_max:459,y_min:23,y_max:727,ha:704,leftSideBearing:45,advanceWidth:510},G:{x_min:31,x_max:577,y_min:-8,y_max:733,ha:741,leftSideBearing:31,advanceWidth:611},H:{x_min:37,x_max:493,y_min:-22,y_max:758,ha:780,leftSideBearing:37,advanceWidth:535},I:{x_min:47,x_max:501,y_min:-3,y_max:731,ha:734,leftSideBearing:47,advanceWidth:541},J:{x_min:33,x_max:531,y_min:-23,y_max:725,ha:748,leftSideBearing:33,advanceWidth:573},K:{x_min:43,x_max:505,y_min:-10,y_max:740,ha:750,leftSideBearing:43,advanceWidth:560},L:{x_min:49,x_max:457,y_min:-2,y_max:746,ha:748,leftSideBearing:49,advanceWidth:510},M:{x_min:35,x_max:699,y_min:1,y_max:744,ha:743,leftSideBearing:35,advanceWidth:743},N:{x_min:34,x_max:533,y_min:-17,y_max:761,ha:778,leftSideBearing:34,advanceWidth:579},O:{x_min:41,x_max:608,y_min:-5,y_max:735,ha:740,leftSideBearing:41,advanceWidth:667},P:{x_min:53,x_max:451,y_min:-18,y_max:735,ha:753,leftSideBearing:53,advanceWidth:497},Q:{x_min:40,x_max:599,y_min:-67,y_max:744,ha:811,leftSideBearing:40,advanceWidth:648},R:{x_min:39,x_max:487,y_min:16,y_max:735,ha:719,leftSideBearing:39,advanceWidth:535},S:{x_min:35,x_max:552,y_min:-47,y_max:708,ha:755,leftSideBearing:35,advanceWidth:604},T:{x_min:26,x_max:656,y_min:-13,y_max:718,ha:731,leftSideBearing:26,advanceWidth:705},U:{x_min:41,x_max:518,y_min:-20,y_max:748,ha:768,leftSideBearing:41,advanceWidth:567},V:{x_min:47,x_max:509,y_min:-26,y_max:744,ha:770,leftSideBearing:47,advanceWidth:567},W:{x_min:44,x_max:789,y_min:-35,y_max:720,ha:755,leftSideBearing:44,advanceWidth:833},X:{x_min:63,x_max:635,y_min:-10,y_max:745,ha:755,leftSideBearing:63,advanceWidth:680},Y:{x_min:43,x_max:503,y_min:-21,y_max:734,ha:755,leftSideBearing:43,advanceWidth:541},Z:{x_min:42,x_max:584,y_min:-10,y_max:739,ha:749,leftSideBearing:42,advanceWidth:629},"[":{x_min:46,x_max:346,y_min:-150,y_max:884,ha:1034,leftSideBearing:46,advanceWidth:291},"\\":{x_min:20,x_max:616,y_min:-100,y_max:797,ha:897,leftSideBearing:20,advanceWidth:645},"]":{x_min:-76,x_max:226,y_min:-150,y_max:881,ha:1031,leftSideBearing:-76,advanceWidth:297},"^":{x_min:43,x_max:437,y_min:517,y_max:812,ha:295,leftSideBearing:43,advanceWidth:478},_:{x_min:29,x_max:563,y_min:-110,y_max:-1,ha:109,leftSideBearing:29,advanceWidth:598},"`":{x_min:54,x_max:321,y_min:540,y_max:747,ha:207,leftSideBearing:54,advanceWidth:368},a:{x_min:20,x_max:447,y_min:-17,y_max:495,ha:512,leftSideBearing:20,advanceWidth:494},b:{x_min:37,x_max:466,y_min:-27,y_max:770,ha:797,leftSideBearing:37,advanceWidth:510},c:{x_min:35,x_max:456,y_min:-9,y_max:507,ha:516,leftSideBearing:35,advanceWidth:460},d:{x_min:45,x_max:520,y_min:-15,y_max:764,ha:779,leftSideBearing:45,advanceWidth:560},e:{x_min:33,x_max:370,y_min:-5,y_max:501,ha:506,leftSideBearing:33,advanceWidth:397},f:{x_min:35,x_max:411,y_min:-13,y_max:695,ha:708,leftSideBearing:35,advanceWidth:453},g:{x_min:33,x_max:551,y_min:-257,y_max:505,ha:762,leftSideBearing:33,advanceWidth:611},h:{x_min:32,x_max:458,y_min:-29,y_max:743,ha:772,leftSideBearing:32,advanceWidth:491},i:{x_min:45,x_max:167,y_min:-13,y_max:631,ha:644,leftSideBearing:45,advanceWidth:220},j:{x_min:-127,x_max:261,y_min:-231,y_max:601,ha:832,leftSideBearing:-127,advanceWidth:308},k:{x_min:39,x_max:443,y_min:-3,y_max:700,ha:703,leftSideBearing:39,advanceWidth:497},l:{x_min:58,x_max:168,y_min:-8,y_max:686,ha:694,leftSideBearing:58,advanceWidth:227},m:{x_min:39,x_max:688,y_min:-14,y_max:501,ha:515,leftSideBearing:39,advanceWidth:718},n:{x_min:45,x_max:491,y_min:-32,y_max:512,ha:544,leftSideBearing:45,advanceWidth:541},o:{x_min:41,x_max:424,y_min:-12,y_max:493,ha:505,leftSideBearing:41,advanceWidth:447},p:{x_min:25,x_max:529,y_min:-260,y_max:500,ha:760,leftSideBearing:25,advanceWidth:573},q:{x_min:53,x_max:603,y_min:-235,y_max:514,ha:749,leftSideBearing:53,advanceWidth:623},r:{x_min:32,x_max:407,y_min:-7,y_max:492,ha:499,leftSideBearing:32,advanceWidth:460},s:{x_min:49,x_max:416,y_min:-12,y_max:519,ha:531,leftSideBearing:49,advanceWidth:460},t:{x_min:32,x_max:442,y_min:-5,y_max:684,ha:689,leftSideBearing:32,advanceWidth:469},u:{x_min:41,x_max:487,y_min:-5,y_max:507,ha:512,leftSideBearing:41,advanceWidth:510},v:{x_min:16,x_max:441,y_min:-20,y_max:542,ha:562,leftSideBearing:16,advanceWidth:456},w:{x_min:39,x_max:639,y_min:-22,y_max:505,ha:527,leftSideBearing:39,advanceWidth:661},x:{x_min:15,x_max:505,y_min:-39,y_max:539,ha:578,leftSideBearing:15,advanceWidth:541},y:{x_min:-98,x_max:501,y_min:-242,y_max:511,ha:753,leftSideBearing:-98,advanceWidth:548},z:{x_min:27,x_max:479,y_min:-3,y_max:494,ha:497,leftSideBearing:27,advanceWidth:494},"{":{x_min:0,x_max:0,y_min:0,y_max:0,ha:0,leftSideBearing:0,advanceWidth:308},"|":{x_min:0,x_max:0,y_min:0,y_max:0,ha:0,leftSideBearing:0,advanceWidth:308},"}":{x_min:0,x_max:0,y_min:0,y_max:0,ha:0,leftSideBearing:0,advanceWidth:308},"~":{x_min:0,x_max:0,y_min:0,y_max:0,ha:0,leftSideBearing:0,advanceWidth:308}},fontFamily:"PetalumaScript",resolution:1e3,generatedOn:"2020-06-14T18:33:25.407Z"},Ei={spacing:50,glyphs:{" ":{x_min:0,x_max:509,y_min:0,y_max:2e3,ha:2e3,leftSideBearing:0,advanceWidth:509},0:{x_min:121,x_max:1048,y_min:-21,y_max:1477,ha:1498,leftSideBearing:121,advanceWidth:1168},1:{x_min:117,x_max:767,y_min:0,y_max:1456,ha:1456,leftSideBearing:117,advanceWidth:844},2:{x_min:75.8474576645637,x_max:1040,y_min:0,y_max:1477,ha:1477,leftSideBearing:75,advanceWidth:1131},3:{x_min:74.85365853658536,x_max:994,y_min:-21,y_max:1477,ha:1498,leftSideBearing:74,advanceWidth:1106},4:{x_min:63,x_max:1114,y_min:0,y_max:1456,ha:1456,leftSideBearing:63,advanceWidth:1187},5:{x_min:96.8448275474953,x_max:982,y_min:-21,y_max:1456,ha:1477,leftSideBearing:96,advanceWidth:1081},6:{x_min:121,x_max:1067,y_min:-21,y_max:1477,ha:1498,leftSideBearing:121,advanceWidth:1144},7:{x_min:76,x_max:1060,y_min:0,y_max:1456,ha:1456,leftSideBearing:-30,advanceWidth:1128},8:{x_min:92,x_max:1039,y_min:-21,y_max:1477,ha:1498,leftSideBearing:92,advanceWidth:1131},9:{x_min:84,x_max:1026,y_min:-21,y_max:1477,ha:1498,leftSideBearing:84,advanceWidth:1154},"!":{x_min:143,x_max:340,y_min:0,y_max:1456,ha:1456,leftSideBearing:143,advanceWidth:483},'"':{x_min:166,x_max:634,y_min:1055,y_max:1560,ha:505,leftSideBearing:166,advanceWidth:770},"#":{x_min:63,x_max:1179,y_min:0,y_max:1456,ha:1456,leftSideBearing:63,advanceWidth:1246},$:{x_min:81.92156915727656,x_max:1012,y_min:-208,y_max:1693,ha:1901,leftSideBearing:81,advanceWidth:1110},"%":{x_min:77,x_max:1384,y_min:-21,y_max:1477,ha:1498,leftSideBearing:77,advanceWidth:1460},"&":{x_min:74,x_max:1242,y_min:-21,y_max:1477,ha:1498,leftSideBearing:74,advanceWidth:1289},"'":{x_min:166,x_max:324,y_min:1055,y_max:1560,ha:505,leftSideBearing:166,advanceWidth:460},"(":{x_min:114,x_max:650,y_min:-463,y_max:1636,ha:2099,leftSideBearing:114,advanceWidth:662},")":{x_min:11,x_max:547,y_min:-463,y_max:1636,ha:2099,leftSideBearing:11,advanceWidth:654},"*":{x_min:66,x_max:893,y_min:607,y_max:1456,ha:849,leftSideBearing:66,advanceWidth:958},"+":{x_min:73,x_max:1071,y_min:146,y_max:1206,ha:1060,leftSideBearing:73,advanceWidth:1145},",":{x_min:23,x_max:315,y_min:-311,y_max:221,ha:532,leftSideBearing:23,advanceWidth:404},"-":{x_min:154,x_max:643,y_min:538,y_max:692,ha:154,leftSideBearing:154,advanceWidth:797},".":{x_min:145,x_max:342,y_min:0,y_max:202,ha:202,leftSideBearing:145,advanceWidth:493},"/":{x_min:0,x_max:774,y_min:-125,y_max:1456,ha:1581,leftSideBearing:0,advanceWidth:824},":":{x_min:145,x_max:342,y_min:0,y_max:1082,ha:1082,leftSideBearing:145,advanceWidth:419},";":{x_min:53,x_max:345,y_min:-311,y_max:1082,ha:1393,leftSideBearing:53,advanceWidth:424},"<":{x_min:76,x_max:892,y_min:107,y_max:1013,ha:906,leftSideBearing:76,advanceWidth:1017},"=":{x_min:147,x_max:981,y_min:407,y_max:987,ha:580,leftSideBearing:147,advanceWidth:1127},">":{x_min:125,x_max:980,y_min:87,y_max:993,ha:906,leftSideBearing:125,advanceWidth:1060},"?":{x_min:65.92660602419838,x_max:890,y_min:0,y_max:1477,ha:1477,leftSideBearing:65,advanceWidth:953},"@":{x_min:84.3592218305664,x_max:1705.2346925277395,y_min:-453,y_max:1431,ha:1884,leftSideBearing:84,advanceWidth:1821},A:{x_min:70,x_max:1463,y_min:0,y_max:1456,ha:1456,leftSideBearing:70,advanceWidth:1533},B:{x_min:81,x_max:1253,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1322},C:{x_min:80,x_max:1174,y_min:-21,y_max:1477,ha:1498,leftSideBearing:80,advanceWidth:1290},D:{x_min:81,x_max:1291,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1356},E:{x_min:81,x_max:1190,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1306},F:{x_min:81,x_max:1176,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1256},G:{x_min:80,x_max:1226,y_min:-21,y_max:1477,ha:1498,leftSideBearing:80,advanceWidth:1346},H:{x_min:81,x_max:1497,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1578},I:{x_min:81,x_max:604,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:685},J:{x_min:60,x_max:1100,y_min:-21,y_max:1456,ha:1477,leftSideBearing:60,advanceWidth:1169},K:{x_min:81,x_max:1427,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1501},L:{x_min:81,x_max:1130,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1210},M:{x_min:94,x_max:1888,y_min:0,y_max:1456,ha:1456,leftSideBearing:94,advanceWidth:1982},N:{x_min:83,x_max:1509,y_min:0,y_max:1456,ha:1456,leftSideBearing:83,advanceWidth:1592},O:{x_min:70,x_max:1281,y_min:-21,y_max:1477,ha:1498,leftSideBearing:70,advanceWidth:1351},P:{x_min:81,x_max:1242,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1297},Q:{x_min:70,x_max:1348,y_min:-245,y_max:1477,ha:1722,leftSideBearing:70,advanceWidth:1376},R:{x_min:81,x_max:1285,y_min:0,y_max:1455,ha:1455,leftSideBearing:81,advanceWidth:1385},S:{x_min:115,x_max:1116,y_min:-21,y_max:1477,ha:1498,leftSideBearing:115,advanceWidth:1206},T:{x_min:96,x_max:1306,y_min:0,y_max:1456,ha:1456,leftSideBearing:96,advanceWidth:1406},U:{x_min:70,x_max:1452,y_min:-21,y_max:1456,ha:1477,leftSideBearing:70,advanceWidth:1522},V:{x_min:65,x_max:1443,y_min:0,y_max:1456,ha:1456,leftSideBearing:65,advanceWidth:1508},W:{x_min:72,x_max:2057,y_min:0,y_max:1456,ha:1456,leftSideBearing:72,advanceWidth:2129},X:{x_min:80,x_max:1449,y_min:0,y_max:1456,ha:1456,leftSideBearing:80,advanceWidth:1529},Y:{x_min:65,x_max:1396,y_min:0,y_max:1456,ha:1456,leftSideBearing:65,advanceWidth:1461},Z:{x_min:90,x_max:1107,y_min:0,y_max:1456,ha:1456,leftSideBearing:90,advanceWidth:1197},"[":{x_min:157,x_max:541,y_min:-312,y_max:1664,ha:1976,leftSideBearing:157,advanceWidth:573},"\\":{x_min:36,x_max:830,y_min:-125,y_max:1456,ha:1581,leftSideBearing:36,advanceWidth:841},"]":{x_min:23,x_max:408,y_min:-312,y_max:1664,ha:1976,leftSideBearing:23,advanceWidth:552},"^":{x_min:71,x_max:802,y_min:729,y_max:1456,ha:727,leftSideBearing:71,advanceWidth:864},_:{x_min:119,x_max:1041,y_min:-154,y_max:0,ha:154,leftSideBearing:119,advanceWidth:1168},"`":{x_min:40,x_max:456,y_min:1288,y_max:1560,ha:272,leftSideBearing:40,advanceWidth:496},a:{x_min:79,x_max:1053,y_min:-21,y_max:1102,ha:1123,leftSideBearing:79,advanceWidth:1132},b:{x_min:-16,x_max:1071,y_min:-21,y_max:1560,ha:1581,leftSideBearing:-16,advanceWidth:1145},c:{x_min:78,x_max:988,y_min:-21,y_max:1102,ha:1123,leftSideBearing:78,advanceWidth:1067},d:{x_min:78,x_max:1156,y_min:-21,y_max:1560,ha:1581,leftSideBearing:78,advanceWidth:1218},e:{x_min:74,x_max:980,y_min:-21,y_max:1102,ha:1123,leftSideBearing:74,advanceWidth:1059},f:{x_min:64,x_max:731,y_min:0,y_max:1581,ha:1581,leftSideBearing:64,advanceWidth:725},g:{x_min:78,x_max:1133,y_min:-437,y_max:1102,ha:1539,leftSideBearing:78,advanceWidth:1157},h:{x_min:49,x_max:1255,y_min:0,y_max:1560,ha:1560,leftSideBearing:49,advanceWidth:1315},i:{x_min:67,x_max:590,y_min:0,y_max:1560,ha:1560,leftSideBearing:67,advanceWidth:652},j:{x_min:-56,x_max:381,y_min:-437,y_max:1560,ha:1997,leftSideBearing:-56,advanceWidth:525},k:{x_min:64,x_max:1248,y_min:0,y_max:1560,ha:1560,leftSideBearing:64,advanceWidth:1287},l:{x_min:64,x_max:587,y_min:0,y_max:1560,ha:1560,leftSideBearing:64,advanceWidth:653},m:{x_min:74,x_max:1905,y_min:0,y_max:1102,ha:1102,leftSideBearing:74,advanceWidth:1977},n:{x_min:74,x_max:1278,y_min:0,y_max:1102,ha:1102,leftSideBearing:74,advanceWidth:1343},o:{x_min:78,x_max:1046,y_min:-21,y_max:1102,ha:1123,leftSideBearing:78,advanceWidth:1124},p:{x_min:34,x_max:1119,y_min:-416,y_max:1102,ha:1518,leftSideBearing:34,advanceWidth:1197},q:{x_min:78,x_max:1135,y_min:-416,y_max:1102,ha:1518,leftSideBearing:78,advanceWidth:1139},r:{x_min:72,x_max:808,y_min:0,y_max:1102,ha:1102,leftSideBearing:72,advanceWidth:854},s:{x_min:104,x_max:933,y_min:-21,y_max:1102,ha:1123,leftSideBearing:104,advanceWidth:1022},t:{x_min:24,x_max:678,y_min:-17,y_max:1343,ha:1360,leftSideBearing:24,advanceWidth:730},u:{x_min:52,x_max:1181,y_min:-21,y_max:1082,ha:1103,leftSideBearing:52,advanceWidth:1245},v:{x_min:26,x_max:1176,y_min:0,y_max:1082,ha:1082,leftSideBearing:26,advanceWidth:1206},w:{x_min:52,x_max:1777,y_min:0,y_max:1082,ha:1082,leftSideBearing:52,advanceWidth:1823},x:{x_min:42,x_max:1163,y_min:0,y_max:1082,ha:1082,leftSideBearing:42,advanceWidth:1203},y:{x_min:24,x_max:1172,y_min:-437,y_max:1082,ha:1519,leftSideBearing:24,advanceWidth:1192},z:{x_min:88,x_max:960,y_min:0,y_max:1082,ha:1082,leftSideBearing:88,advanceWidth:1032},"{":{x_min:63,x_max:671,y_min:-364,y_max:1597,ha:1961,leftSideBearing:63,advanceWidth:701},"|":{x_min:150,x_max:307,y_min:-270,y_max:1456,ha:1726,leftSideBearing:150,advanceWidth:451},"}":{x_min:27,x_max:635,y_min:-364,y_max:1597,ha:1961,leftSideBearing:27,advanceWidth:701},"~":{x_min:121,x_max:1257,y_min:401,y_max:803,ha:402,leftSideBearing:121,advanceWidth:1386}},fontFamily:"Roboto Slab",resolution:2048,generatedOn:"2020-06-15T19:12:58.120Z"};E.load("Bravura",Ti,wi),E.load("Custom",vi,Di),yi.setMusicFont("Bravura","Custom"),function(){{const t=Ei,{fontFamily:e,resolution:i,glyphs:s}=t;E.load(e,t);const a="b";it.registerInfo({family:e,resolution:i,glyphs:s,maxSizeGlyph:a,monospaced:!1,bold:!1,italic:!1,superscriptOffset:.66,subscriptOffset:.66,serifs:!0,description:"Text font to pair with the Bravura / Gonville music fonts."})}{const t=Ci,{fontFamily:e,resolution:i,glyphs:s}=t;E.load(e,t);const a="b";it.registerInfo({family:e,resolution:i,glyphs:s,maxSizeGlyph:a,monospaced:!1,bold:!1,italic:!1,superscriptOffset:.66,subscriptOffset:.66,serifs:!1,description:"Text font to pair with the Petaluma music font."})}}();const ki=Si;return e=e.default})()})); +//# sourceMappingURL=vexflow-bravura.js.map \ No newline at end of file diff --git a/build/cjs/vexflow-bravura.js.map b/build/cjs/vexflow-bravura.js.map new file mode 100644 index 0000000000..33007eeb8d --- /dev/null +++ b/build/cjs/vexflow-bravura.js.map @@ -0,0 +1 @@ +{"version":3,"file":"vexflow-bravura.js","mappings":"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","sources":["webpack://Vex/webpack/universalModuleDefinition","webpack://Vex/webpack/bootstrap","webpack://Vex/webpack/runtime/define property getters","webpack://Vex/webpack/runtime/global","webpack://Vex/webpack/runtime/hasOwnProperty shorthand","webpack://Vex/./src/typeguard.ts","webpack://Vex/./src/util.ts","webpack://Vex/./src/fraction.ts","webpack://Vex/./src/boundingbox.ts","webpack://Vex/./src/boundingboxcomputation.ts","webpack://Vex/./src/font.ts","webpack://Vex/./src/registry.ts","webpack://Vex/./src/element.ts","webpack://Vex/./src/glyph.ts","webpack://Vex/./src/modifier.ts","webpack://Vex/./src/music.ts","webpack://Vex/./src/tables.ts","webpack://Vex/./src/accidental.ts","webpack://Vex/./src/stem.ts","webpack://Vex/./src/textformatter.ts","webpack://Vex/./src/annotation.ts","webpack://Vex/./src/articulation.ts","webpack://Vex/./src/rendercontext.ts","webpack://Vex/./src/tickable.ts","webpack://Vex/./src/note.ts","webpack://Vex/./src/stavemodifier.ts","webpack://Vex/./src/stavebarline.ts","webpack://Vex/./src/chordsymbol.ts","webpack://Vex/./src/voice.ts","webpack://Vex/./src/barnote.ts","webpack://Vex/./src/bend.ts","webpack://Vex/./src/dot.ts","webpack://Vex/./src/frethandfinger.ts","webpack://Vex/./src/stavetie.ts","webpack://Vex/./src/tabtie.ts","webpack://Vex/./src/gracenotegroup.ts","webpack://Vex/./src/notesubgroup.ts","webpack://Vex/./src/tickcontext.ts","webpack://Vex/./src/ornament.ts","webpack://Vex/./src/parenthesis.ts","webpack://Vex/./src/notehead.ts","webpack://Vex/./src/stemmablenote.ts","webpack://Vex/./src/stavenote.ts","webpack://Vex/./src/web.ts","webpack://Vex/./src/canvascontext.ts","webpack://Vex/./src/svgcontext.ts","webpack://Vex/./src/renderer.ts","webpack://Vex/./src/textnote.ts","webpack://Vex/./src/stavevolta.ts","webpack://Vex/./src/stringnumber.ts","webpack://Vex/./src/strokes.ts","webpack://Vex/./src/vibrato.ts","webpack://Vex/./src/modifiercontext.ts","webpack://Vex/./src/clef.ts","webpack://Vex/./src/keysignature.ts","webpack://Vex/./src/staverepetition.ts","webpack://Vex/./src/stavesection.ts","webpack://Vex/./src/stavetempo.ts","webpack://Vex/./src/stavetext.ts","webpack://Vex/./src/timesigglyph.ts","webpack://Vex/./src/timesignature.ts","webpack://Vex/./src/stave.ts","webpack://Vex/./src/staveconnector.ts","webpack://Vex/./src/formatter.ts","webpack://Vex/./src/tuplet.ts","webpack://Vex/./src/beam.ts","webpack://Vex/./src/clefnote.ts","webpack://Vex/./src/crescendo.ts","webpack://Vex/./src/curve.ts","webpack://Vex/./src/parser.ts","webpack://Vex/./src/easyscore.ts","webpack://Vex/./src/ghostnote.ts","webpack://Vex/./src/glyphnote.ts","webpack://Vex/./src/gracenote.ts","webpack://Vex/./src/keysignote.ts","webpack://Vex/./src/multimeasurerest.ts","webpack://Vex/./src/pedalmarking.ts","webpack://Vex/./src/repeatnote.ts","webpack://Vex/./src/staveline.ts","webpack://Vex/./src/system.ts","webpack://Vex/./src/tabnote.ts","webpack://Vex/./src/tabstave.ts","webpack://Vex/./src/textbracket.ts","webpack://Vex/./src/textdynamics.ts","webpack://Vex/./src/timesignote.ts","webpack://Vex/./src/vibratobracket.ts","webpack://Vex/./src/factory.ts","webpack://Vex/./src/stavehairpin.ts","webpack://Vex/./src/tabslide.ts","webpack://Vex/./src/tuning.ts","webpack://Vex/./src/flow.ts","webpack://Vex/./src/version.ts","webpack://Vex/./src/gracetabnote.ts","webpack://Vex/./src/keymanager.ts","webpack://Vex/./src/tremolo.ts","webpack://Vex/./src/vex.ts","webpack://Vex/./src/fonts/bravura_glyphs.ts","webpack://Vex/./src/fonts/bravura_metrics.ts","webpack://Vex/./src/fonts/custom_glyphs.ts","webpack://Vex/./src/fonts/custom_metrics.ts","webpack://Vex/./src/fonts/petalumascript_glyphs.ts","webpack://Vex/./src/fonts/robotoslab_glyphs.ts","webpack://Vex/./src/fonts/load_bravura.ts","webpack://Vex/./src/fonts/load_custom.ts","webpack://Vex/./entry/vexflow-bravura.ts","webpack://Vex/./src/fonts/textfonts.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Vex\"] = factory();\n\telse\n\t\troot[\"Vex\"] = factory();\n})((typeof window !== 'undefined' ? window : typeof globalThis !== 'undefined' ? globalThis : this), function() {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Ron B. Yeh\n// MIT License\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * Use instead of `instanceof` as a more flexible type guard.\n * @param obj check if this object's CATEGORY matches the provided category.\n * @param category a string representing a category of VexFlow objects.\n * @param checkAncestors defaults to `true`, so we walk up the prototype chain to look for a matching `CATEGORY`.\n * If `false`, we do not check the superclass or other ancestors.\n * @returns true if `obj` has a static `CATEGORY` property that matches `category`.\n */\nexport function isCategory(obj, category, checkAncestors = true) {\n // obj is undefined, a number, a primitive string, or null.\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n // `obj.constructor` is a reference to the constructor function that created the `obj` instance.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor\n let constructorFcn = obj.constructor;\n // Check if the object's static .CATEGORY matches the provided category.\n if (checkAncestors) {\n // Walk up the prototype chain to look for a matching obj.constructor.CATEGORY.\n while (obj !== null) {\n constructorFcn = obj.constructor;\n if ('CATEGORY' in constructorFcn && constructorFcn.CATEGORY === category) {\n return true;\n }\n obj = Object.getPrototypeOf(obj);\n }\n return false;\n }\n else {\n // Do not walk up the prototype chain. Just check this particular object's static .CATEGORY string.\n return 'CATEGORY' in constructorFcn && constructorFcn.CATEGORY === category;\n }\n}\nexport const isAccidental = (obj) => isCategory(obj, Category.Accidental);\nexport const isAnnotation = (obj) => isCategory(obj, Category.Annotation);\nexport const isBarline = (obj) => isCategory(obj, Category.Barline);\nexport const isDot = (obj) => isCategory(obj, Category.Dot);\nexport const isGraceNote = (obj) => isCategory(obj, Category.GraceNote);\nexport const isGraceNoteGroup = (obj) => isCategory(obj, Category.GraceNoteGroup);\nexport const isNote = (obj) => isCategory(obj, Category.Note);\nexport const isRenderContext = (obj) => isCategory(obj, Category.RenderContext);\nexport const isStaveNote = (obj) => isCategory(obj, Category.StaveNote);\nexport const isStemmableNote = (obj) => isCategory(obj, Category.StemmableNote);\nexport const isTabNote = (obj) => isCategory(obj, Category.TabNote);\n// 'const' enums are erased by the TypeScript compiler. The string values are inlined at all the use sites.\n// See: https://www.typescriptlang.org/docs/handbook/enums.html#const-enums\nexport var Category;\n(function (Category) {\n Category[\"Accidental\"] = \"Accidental\";\n Category[\"Annotation\"] = \"Annotation\";\n Category[\"Articulation\"] = \"Articulation\";\n Category[\"Barline\"] = \"Barline\";\n Category[\"BarNote\"] = \"BarNote\";\n Category[\"Beam\"] = \"Beam\";\n Category[\"Bend\"] = \"Bend\";\n Category[\"ChordSymbol\"] = \"ChordSymbol\";\n Category[\"Clef\"] = \"Clef\";\n Category[\"ClefNote\"] = \"ClefNote\";\n Category[\"Crescendo\"] = \"Crescendo\";\n Category[\"Curve\"] = \"Curve\";\n Category[\"Dot\"] = \"Dot\";\n Category[\"Element\"] = \"Element\";\n Category[\"Fraction\"] = \"Fraction\";\n Category[\"FretHandFinger\"] = \"FretHandFinger\";\n Category[\"GhostNote\"] = \"GhostNote\";\n Category[\"Glyph\"] = \"Glyph\";\n Category[\"GlyphNote\"] = \"GlyphNote\";\n Category[\"GraceNote\"] = \"GraceNote\";\n Category[\"GraceNoteGroup\"] = \"GraceNoteGroup\";\n Category[\"GraceTabNote\"] = \"GraceTabNote\";\n Category[\"KeySignature\"] = \"KeySignature\";\n Category[\"KeySigNote\"] = \"KeySigNote\";\n Category[\"Modifier\"] = \"Modifier\";\n Category[\"MultiMeasureRest\"] = \"MultiMeasureRest\";\n Category[\"Note\"] = \"Note\";\n Category[\"NoteHead\"] = \"NoteHead\";\n Category[\"NoteSubGroup\"] = \"NoteSubGroup\";\n Category[\"Ornament\"] = \"Ornament\";\n Category[\"Parenthesis\"] = \"Parenthesis\";\n Category[\"PedalMarking\"] = \"PedalMarking\";\n Category[\"RenderContext\"] = \"RenderContext\";\n Category[\"RepeatNote\"] = \"RepeatNote\";\n Category[\"Repetition\"] = \"Repetition\";\n Category[\"Stave\"] = \"Stave\";\n Category[\"StaveConnector\"] = \"StaveConnector\";\n Category[\"StaveHairpin\"] = \"StaveHairpin\";\n Category[\"StaveLine\"] = \"StaveLine\";\n Category[\"StaveModifier\"] = \"StaveModifier\";\n Category[\"StaveNote\"] = \"StaveNote\";\n Category[\"StaveSection\"] = \"StaveSection\";\n Category[\"StaveTempo\"] = \"StaveTempo\";\n Category[\"StaveText\"] = \"StaveText\";\n Category[\"StaveTie\"] = \"StaveTie\";\n Category[\"Stem\"] = \"Stem\";\n Category[\"StemmableNote\"] = \"StemmableNote\";\n Category[\"StringNumber\"] = \"StringNumber\";\n Category[\"Stroke\"] = \"Stroke\";\n Category[\"System\"] = \"System\";\n Category[\"TabNote\"] = \"TabNote\";\n Category[\"TabSlide\"] = \"TabSlide\";\n Category[\"TabStave\"] = \"TabStave\";\n Category[\"TabTie\"] = \"TabTie\";\n Category[\"TextBracket\"] = \"TextBracket\";\n Category[\"TextDynamics\"] = \"TextDynamics\";\n Category[\"TextNote\"] = \"TextNote\";\n Category[\"Tickable\"] = \"Tickable\";\n Category[\"TimeSignature\"] = \"TimeSignature\";\n Category[\"TimeSigNote\"] = \"TimeSigNote\";\n Category[\"Tremolo\"] = \"Tremolo\";\n Category[\"Tuplet\"] = \"Tuplet\";\n Category[\"Vibrato\"] = \"Vibrato\";\n Category[\"VibratoBracket\"] = \"VibratoBracket\";\n Category[\"Voice\"] = \"Voice\";\n Category[\"Volta\"] = \"Volta\";\n})(Category || (Category = {}));\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// Note: Keep this module free of imports to reduce the chance of circular dependencies.\n/** `RuntimeError` will be thrown by VexFlow classes in case of error. */\nexport class RuntimeError extends Error {\n constructor(code, message = '') {\n super('[RuntimeError] ' + code + ': ' + message);\n this.code = code;\n }\n}\n/** VexFlow can be used outside of the browser (e.g., Node) where `window` may not be defined. */\n// eslint-disable-next-line\nexport function globalObject() {\n if (typeof globalThis !== 'undefined') {\n return globalThis;\n }\n if (typeof self !== 'undefined') {\n return self;\n }\n if (typeof window !== 'undefined') {\n return window;\n }\n if (typeof global !== 'undefined') {\n return global;\n }\n return Function('return this')();\n}\n/**\n * Check that `x` is of type `T` and not `undefined`.\n * If `x` is `undefined`, throw a RuntimeError with the optionally provided error code and message.\n */\nexport function defined(x, code = 'undefined', message = '') {\n if (x === undefined) {\n throw new RuntimeError(code, message);\n }\n return x;\n}\n/** Default log function sends all arguments to console. */\n// eslint-disable-next-line\nexport function log(block, ...args) {\n if (!args)\n return;\n const line = Array.prototype.slice.call(args).join(' ');\n globalObject().console.log(block + ': ' + line);\n}\n/** Dump warning to console. */\n// eslint-disable-next-line\nexport function warn(...args) {\n const line = args.join(' ');\n const err = new Error();\n globalObject().console.log('Warning: ', line, err.stack);\n}\n/** Round number to nearest fractional value (`.5`, `.25`, etc.) */\nfunction roundN(x, n) {\n return x % n >= n / 2 ? parseInt(`${x / n}`, 10) * n + n : parseInt(`${x / n}`, 10) * n;\n}\n/** Locate the mid point between stave lines. Returns a fractional line if a space. */\nexport function midLine(a, b) {\n let mid_line = b + (a - b) / 2;\n if (mid_line % 2 > 0) {\n mid_line = roundN(mid_line * 10, 5) / 10;\n }\n return mid_line;\n}\n/**\n * Used by various classes (e.g., SVGContext) to provide a\n * unique prefix to element names (or other keys in shared namespaces).\n */\nexport function prefix(text) {\n return `vf-${text}`;\n}\n/**\n * Convert an arbitrary angle in radians to the equivalent one in the range [0, pi).\n */\nexport function normalizeAngle(a) {\n a = a % (2 * Math.PI);\n if (a < 0) {\n a += 2 * Math.PI;\n }\n return a;\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Author: Joshua Koo / @zz85\n// Author: @incompleteopus\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\n/** Fraction represents a rational number. */\nexport class Fraction {\n /** Set the numerator and denominator. */\n constructor(numerator, denominator) {\n this.numerator = 1;\n this.denominator = 1;\n this.set(numerator, denominator);\n }\n static get CATEGORY() {\n return Category.Fraction;\n }\n /**\n * GCD: Greatest common divisor using the Euclidean algorithm.\n * Note: GCD(0, 0) => 0 and GCD(0, n) => n.\n */\n static GCD(a, b) {\n if (typeof a !== 'number' || Number.isNaN(a) || typeof b !== 'number' || Number.isNaN(b)) {\n throw new RuntimeError('BadArgument', `Invalid numbers: ${a}, ${b}`);\n }\n let t;\n while (b !== 0) {\n t = b;\n b = a % b;\n a = t;\n }\n return a;\n }\n /** LCM: Lowest common multiple. */\n static LCM(a, b) {\n return (a * b) / Fraction.GCD(a, b);\n }\n /** Lowest common multiple for more than two numbers. */\n static LCMM(args) {\n if (args.length === 0) {\n return 0;\n }\n else if (args.length === 1) {\n return args[0];\n }\n else if (args.length === 2) {\n return Fraction.LCM(args[0], args[1]);\n }\n else {\n // args.shift() removes the first number.\n // LCM the first number with the rest of the numbers.\n return Fraction.LCM(args.shift(), Fraction.LCMM(args));\n }\n }\n /** Set the numerator and denominator. */\n set(numerator = 1, denominator = 1) {\n this.numerator = numerator;\n this.denominator = denominator;\n return this;\n }\n /** Return the value of the fraction. */\n value() {\n return this.numerator / this.denominator;\n }\n /** Simplify numerator and denominator using GCD. */\n simplify() {\n let u = this.numerator;\n let d = this.denominator;\n const gcd = Fraction.GCD(u, d);\n u /= gcd;\n d /= gcd;\n if (d < 0) {\n d = -d;\n u = -u;\n }\n return this.set(u, d);\n }\n /** Add value of another fraction. */\n add(param1 = 0, param2 = 1) {\n const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2);\n const lcm = Fraction.LCM(this.denominator, otherDenominator);\n const a = lcm / this.denominator;\n const b = lcm / otherDenominator;\n const u = this.numerator * a + otherNumerator * b;\n return this.set(u, lcm);\n }\n /** Substract value of another fraction. */\n subtract(param1 = 0, param2 = 1) {\n const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2);\n const lcm = Fraction.LCM(this.denominator, otherDenominator);\n const a = lcm / this.denominator;\n const b = lcm / otherDenominator;\n const u = this.numerator * a - otherNumerator * b;\n return this.set(u, lcm);\n }\n /** Multiply by value of another fraction. */\n multiply(param1 = 1, param2 = 1) {\n const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2);\n return this.set(this.numerator * otherNumerator, this.denominator * otherDenominator);\n }\n /** Divide by value of another Fraction. */\n divide(param1 = 1, param2 = 1) {\n const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2);\n return this.set(this.numerator * otherDenominator, this.denominator * otherNumerator);\n }\n /** Simplify both sides and check if they are equal. */\n equals(compare) {\n const a = Fraction.__staticFractionA.copy(compare).simplify();\n const b = Fraction.__staticFractionB.copy(this).simplify();\n return a.numerator === b.numerator && a.denominator === b.denominator;\n }\n /** Greater than operator. */\n greaterThan(compare) {\n const a = Fraction.__staticFractionB.copy(this);\n a.subtract(compare);\n return a.numerator > 0;\n }\n /** Greater than or equals operator. */\n greaterThanEquals(compare) {\n const a = Fraction.__staticFractionB.copy(this);\n a.subtract(compare);\n return a.numerator >= 0;\n }\n /** Less than operator. */\n lessThan(compare) {\n return !this.greaterThanEquals(compare);\n }\n /** Less than or equals operator. */\n lessThanEquals(compare) {\n return !this.greaterThan(compare);\n }\n /** Return a new copy with current values. */\n clone() {\n return new Fraction(this.numerator, this.denominator);\n }\n /** Copy value of another fraction. */\n copy(other) {\n if (typeof other === 'number') {\n return this.set(other, 1);\n }\n else {\n return this.set(other.numerator, other.denominator);\n }\n }\n /** Return the integer component (eg. 5/2 => 2). */\n quotient() {\n return Math.floor(this.numerator / this.denominator);\n }\n /** Return the remainder component (eg. 5/2 => 1). */\n remainder() {\n return this.numerator % this.denominator;\n }\n /** Calculate absolute value. */\n makeAbs() {\n this.denominator = Math.abs(this.denominator);\n this.numerator = Math.abs(this.numerator);\n return this;\n }\n /** Return a raw string representation (eg. \"5/2\"). */\n toString() {\n return `${this.numerator}/${this.denominator}`;\n }\n /** Return a simplified string respresentation. */\n toSimplifiedString() {\n return Fraction.__staticFractionTmp.copy(this).simplify().toString();\n }\n /** Return string representation in mixed form. */\n toMixedString() {\n let s = '';\n const q = this.quotient();\n const f = Fraction.__staticFractionTmp.copy(this);\n if (q < 0) {\n f.makeAbs();\n }\n if (q !== 0) {\n s += q;\n if (f.numerator !== 0) {\n s += ` ${f.toSimplifiedString()}`;\n }\n }\n else if (f.numerator === 0) {\n s = '0';\n }\n else {\n s = f.toSimplifiedString();\n }\n return s;\n }\n /** Parse a fraction string. */\n parse(str) {\n const i = str.split('/');\n const n = parseInt(i[0], 10);\n const d = i[1] ? parseInt(i[1], 10) : 1;\n return this.set(n, d);\n }\n}\n// Cached objects for comparisons.\nFraction.__staticFractionA = new Fraction();\nFraction.__staticFractionB = new Fraction();\nFraction.__staticFractionTmp = new Fraction();\n/** Helper function to extract the numerator and denominator from another fraction. */\nfunction getNumeratorAndDenominator(n, d = 1) {\n if (typeof n === 'number') {\n // Both params are numbers, so we return them as [numerator, denominator].\n return [n, d];\n }\n else {\n // First param is a Fraction object. We ignore the second param.\n return [n.numerator, n.denominator];\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nexport class BoundingBox {\n constructor(x, y, w, h) {\n this.x = x;\n this.y = y;\n this.w = w;\n this.h = h;\n }\n /**\n * Create a new copy.\n */\n static copy(that) {\n return new BoundingBox(that.x, that.y, that.w, that.h);\n }\n /** Get x position. */\n getX() {\n return this.x;\n }\n /** Get y position. */\n getY() {\n return this.y;\n }\n /** Get width. */\n getW() {\n return this.w;\n }\n /** Get height. */\n getH() {\n return this.h;\n }\n /** Set x position. */\n setX(x) {\n this.x = x;\n return this;\n }\n /** Set y position. */\n setY(y) {\n this.y = y;\n return this;\n }\n /** Set width. */\n setW(w) {\n this.w = w;\n return this;\n }\n /** Set height. */\n setH(h) {\n this.h = h;\n return this;\n }\n /** Move to position. */\n move(x, y) {\n this.x += x;\n this.y += y;\n return this;\n }\n /** Clone. */\n clone() {\n return BoundingBox.copy(this);\n }\n /**\n * Merge my box with given box. Creates a bigger bounding box unless\n * the given box is contained in this one.\n */\n mergeWith(boundingBox) {\n const that = boundingBox;\n const new_x = this.x < that.x ? this.x : that.x;\n const new_y = this.y < that.y ? this.y : that.y;\n const new_w = Math.max(this.x + this.w, that.x + that.w) - new_x;\n const new_h = Math.max(this.y + this.h, that.y + that.h) - new_y;\n this.x = new_x;\n this.y = new_y;\n this.w = new_w;\n this.h = new_h;\n return this;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n/**\n * BoundingBoxComputation computes metrics for a bounding box by continuously\n * taking canvas path commands.\n *\n * Warning: This class is merely a crutch to get bounding box information without\n * explicit metadata. This is likely to get deprecated following SMuFL support.\n *\n * based on: https://github.com/canvg/canvg/blob/master/src/BoundingBox.ts (MIT License)\n */\nexport class BoundingBoxComputation {\n constructor() {\n this.x1 = Number.NaN;\n this.y1 = Number.NaN;\n this.x2 = Number.NaN;\n this.y2 = Number.NaN;\n }\n /** Get calculated X1. */\n getX1() {\n return this.x1;\n }\n /** Get calculated Y1. */\n getY1() {\n return this.y1;\n }\n /** Get calculated width. */\n width() {\n return this.x2 - this.x1;\n }\n /** Get calculated height. */\n height() {\n return this.y2 - this.y1;\n }\n /** Add point to BoundingBox. */\n addPoint(x, y) {\n if (isNaN(this.x1) || x < this.x1)\n this.x1 = x;\n if (isNaN(this.x2) || x > this.x2)\n this.x2 = x;\n if (isNaN(this.y1) || y < this.y1)\n this.y1 = y;\n if (isNaN(this.y2) || y > this.y2)\n this.y2 = y;\n }\n /** Add X to BoundingBox. */\n addX(x) {\n this.addPoint(x, this.y1);\n }\n /** Add Y to BoundingBox. */\n addY(y) {\n this.addPoint(this.x1, y);\n }\n /** Add quadratic curve to BoundingBox. */\n addQuadraticCurve(p0x, p0y, p1x, p1y, p2x, p2y) {\n this.addPoint(p0x, p0y);\n this.addPoint(p2x, p2y);\n const p01x = p1x - p0x;\n const p12x = p2x - p1x;\n let denom = p01x - p12x;\n if (denom != 0) {\n const t = p01x / denom;\n if (t > 0 && t < 1) {\n const it = 1 - t;\n this.addX(it * it * p0x + 2 * it * t * p1x + t * t * p2x);\n }\n }\n const p01y = p1y - p0y;\n const p12y = p2y - p1y;\n denom = p01y - p12y;\n if (denom != 0) {\n const t = p01y / denom;\n if (t > 0 && t < 1) {\n const it = 1 - t;\n this.addY(it * it * p0y + 2 * it * t * p1y + t * t * p2y);\n }\n }\n }\n /** Add bezier curve to BoundingBox. */\n addBezierCurve(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) {\n // from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html\n const p0 = [p0x, p0y];\n const p1 = [p1x, p1y];\n const p2 = [p2x, p2y];\n const p3 = [p3x, p3y];\n let i;\n this.addPoint(p0[0], p0[1]);\n this.addPoint(p3[0], p3[1]);\n const f = (t, i) => Math.pow(1 - t, 3) * p0[i] +\n 3 * Math.pow(1 - t, 2) * t * p1[i] +\n 3 * (1 - t) * Math.pow(t, 2) * p2[i] +\n Math.pow(t, 3) * p3[i];\n for (i = 0; i <= 1; i++) {\n const b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i];\n const a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i];\n const c = 3 * p1[i] - 3 * p0[i];\n if (a === 0) {\n if (b === 0)\n continue;\n const t = -c / b;\n if (0 < t && t < 1) {\n if (i === 0)\n this.addX(f(t, i));\n if (i === 1)\n this.addY(f(t, i));\n }\n continue;\n }\n const b2ac = Math.pow(b, 2) - 4 * c * a;\n if (b2ac < 0)\n continue;\n const t1 = (-b + Math.sqrt(b2ac)) / (2 * a);\n if (0 < t1 && t1 < 1) {\n if (i === 0)\n this.addX(f(t1, i));\n if (i === 1)\n this.addY(f(t1, i));\n }\n const t2 = (-b - Math.sqrt(b2ac)) / (2 * a);\n if (0 < t2 && t2 < 1) {\n if (i === 0)\n this.addX(f(t2, i));\n if (i === 1)\n this.addY(f(t2, i));\n }\n }\n }\n}\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { defined } from './util';\nexport var FontWeight;\n(function (FontWeight) {\n FontWeight[\"NORMAL\"] = \"normal\";\n FontWeight[\"BOLD\"] = \"bold\";\n})(FontWeight || (FontWeight = {}));\nexport var FontStyle;\n(function (FontStyle) {\n FontStyle[\"NORMAL\"] = \"normal\";\n FontStyle[\"ITALIC\"] = \"italic\";\n})(FontStyle || (FontStyle = {}));\n// Internal element for parsing CSS font shorthand strings.\nlet fontParser;\nconst Fonts = {};\nexport class Font {\n /**\n * Use `Font.load(fontName)` to get a Font object.\n * Do not call this constructor directly.\n */\n constructor(fontName) {\n this.name = fontName;\n }\n /**\n * @param fontSize a font size to convert. Can be specified as a CSS length string (e.g., '16pt', '1em')\n * or as a number (the unit is assumed to be 'pt'). See `Font.scaleToPxFrom` for the supported\n * units (e.g., pt, em, %).\n * @returns the number of pixels that is equivalent to `fontSize`\n */\n static convertSizeToPixelValue(fontSize = Font.SIZE) {\n var _a;\n if (typeof fontSize === 'number') {\n // Assume the numeric fontSize is specified in pt.\n return fontSize * Font.scaleToPxFrom.pt;\n }\n else {\n const value = parseFloat(fontSize);\n if (isNaN(value)) {\n return 0;\n }\n const unit = fontSize.replace(/[\\d.\\s]/g, '').toLowerCase(); // Extract the unit by removing all numbers, dots, spaces.\n const conversionFactor = (_a = Font.scaleToPxFrom[unit]) !== null && _a !== void 0 ? _a : 1;\n return value * conversionFactor;\n }\n }\n /**\n * @param fontSize a font size to convert. Can be specified as a CSS length string (e.g., '16pt', '1em')\n * or as a number (the unit is assumed to be 'pt'). See `Font.scaleToPxFrom` for the supported\n * units (e.g., pt, em, %).\n * @returns the number of points that is equivalent to `fontSize`\n */\n static convertSizeToPointValue(fontSize = Font.SIZE) {\n var _a;\n if (typeof fontSize === 'number') {\n // Assume the numeric fontSize is specified in pt.\n return fontSize;\n }\n else {\n const value = parseFloat(fontSize);\n if (isNaN(value)) {\n return 0;\n }\n const unit = fontSize.replace(/[\\d.\\s]/g, '').toLowerCase(); // Extract the unit by removing all numbers, dots, spaces.\n const conversionFactor = ((_a = Font.scaleToPxFrom[unit]) !== null && _a !== void 0 ? _a : 1) / Font.scaleToPxFrom.pt;\n return value * conversionFactor;\n }\n }\n /**\n * @param f\n * @param size\n * @param weight\n * @param style\n * @returns the `size` field will include the units (e.g., '12pt', '16px').\n */\n static validate(f, size, weight, style) {\n // If f is a string but all other arguments are undefined, we assume that\n // f is CSS font shorthand (e.g., 'italic bold 10pt Arial').\n if (typeof f === 'string' && size === undefined && weight === undefined && style === undefined) {\n return Font.fromCSSString(f);\n }\n let family;\n if (typeof f === 'object') {\n // f is a FontInfo object, so we extract its fields.\n family = f.family;\n size = f.size;\n weight = f.weight;\n style = f.style;\n }\n else {\n // f is a string representing the font family name or undefined.\n family = f;\n }\n family = family !== null && family !== void 0 ? family : Font.SANS_SERIF;\n size = size !== null && size !== void 0 ? size : Font.SIZE + 'pt';\n weight = weight !== null && weight !== void 0 ? weight : FontWeight.NORMAL;\n style = style !== null && style !== void 0 ? style : FontStyle.NORMAL;\n if (weight === '') {\n weight = FontWeight.NORMAL;\n }\n if (style === '') {\n style = FontStyle.NORMAL;\n }\n // If size is a number, we assume the unit is `pt`.\n if (typeof size === 'number') {\n size = `${size}pt`;\n }\n // If weight is a number (e.g., 900), turn it into a string representation of that number.\n if (typeof weight === 'number') {\n weight = weight.toString();\n }\n // At this point, `family`, `size`, `weight`, and `style` are all strings.\n return { family, size, weight, style };\n }\n /**\n * @param cssFontShorthand a string formatted as CSS font shorthand (e.g., 'italic bold 15pt Arial').\n */\n static fromCSSString(cssFontShorthand) {\n // Let the browser parse this string for us.\n // First, create a span element.\n // Then, set its style.font and extract it back out.\n if (!fontParser) {\n fontParser = document.createElement('span');\n }\n fontParser.style.font = cssFontShorthand;\n const { fontFamily, fontSize, fontWeight, fontStyle } = fontParser.style;\n return { family: fontFamily, size: fontSize, weight: fontWeight, style: fontStyle };\n }\n /**\n * @returns a CSS font shorthand string of the form `italic bold 16pt Arial`.\n */\n static toCSSString(fontInfo) {\n var _a;\n if (!fontInfo) {\n return '';\n }\n let style;\n const st = fontInfo.style;\n if (st === FontStyle.NORMAL || st === '' || st === undefined) {\n style = ''; // no space! Omit the style section.\n }\n else {\n style = st.trim() + ' ';\n }\n let weight;\n const wt = fontInfo.weight;\n if (wt === FontWeight.NORMAL || wt === '' || wt === undefined) {\n weight = ''; // no space! Omit the weight section.\n }\n else if (typeof wt === 'number') {\n weight = wt + ' ';\n }\n else {\n weight = wt.trim() + ' ';\n }\n let size;\n const sz = fontInfo.size;\n if (sz === undefined) {\n size = Font.SIZE + 'pt ';\n }\n else if (typeof sz === 'number') {\n size = sz + 'pt ';\n }\n else {\n // size is already a string.\n size = sz.trim() + ' ';\n }\n const family = (_a = fontInfo.family) !== null && _a !== void 0 ? _a : Font.SANS_SERIF;\n return `${style}${weight}${size}${family}`;\n }\n /**\n * @param fontSize a number representing a font size, or a string font size with units.\n * @param scaleFactor multiply the size by this factor.\n * @returns size * scaleFactor (e.g., 16pt * 3 = 48pt, 8px * 0.5 = 4px, 24 * 2 = 48).\n * If the fontSize argument was a number, the return value will be a number.\n * If the fontSize argument was a string, the return value will be a string.\n */\n static scaleSize(fontSize, scaleFactor) {\n if (typeof fontSize === 'number') {\n return (fontSize * scaleFactor);\n }\n else {\n const value = parseFloat(fontSize);\n const unit = fontSize.replace(/[\\d.\\s]/g, ''); // Remove all numbers, dots, spaces.\n return `${value * scaleFactor}${unit}`;\n }\n }\n /**\n * @param weight a string (e.g., 'bold') or a number (e.g., 600 / semi-bold in the OpenType spec).\n * @returns true if the font weight indicates bold.\n */\n static isBold(weight) {\n if (!weight) {\n return false;\n }\n else if (typeof weight === 'number') {\n return weight >= 600;\n }\n else {\n // a string can be 'bold' or '700'\n const parsedWeight = parseInt(weight, 10);\n if (isNaN(parsedWeight)) {\n return weight.toLowerCase() === 'bold';\n }\n else {\n return parsedWeight >= 600;\n }\n }\n }\n /**\n * @param style\n * @returns true if the font style indicates 'italic'.\n */\n static isItalic(style) {\n if (!style) {\n return false;\n }\n else {\n return style.toLowerCase() === FontStyle.ITALIC;\n }\n }\n /**\n * @param fontName\n * @param woffURL The absolute or relative URL to the woff file.\n * @param includeWoff2 If true, we assume that a woff2 file is in\n * the same folder as the woff file, and will append a `2` to the url.\n */\n // Support distributions of the typescript compiler that do not yet include the FontFace API declarations.\n // eslint-disable-next-line\n // @ts-ignore\n static loadWebFont(fontName, woffURL, includeWoff2 = true) {\n return __awaiter(this, void 0, void 0, function* () {\n const woff2URL = includeWoff2 ? `url(${woffURL}2) format('woff2'), ` : '';\n const woff1URL = `url(${woffURL}) format('woff')`;\n const woffURLs = woff2URL + woff1URL;\n // eslint-disable-next-line\n // @ts-ignore\n const fontFace = new FontFace(fontName, woffURLs);\n yield fontFace.load();\n // eslint-disable-next-line\n // @ts-ignore\n document.fonts.add(fontFace);\n return fontFace;\n });\n }\n /**\n * Load the web fonts that are used by ChordSymbol. For example, `flow.html` calls:\n * `await Vex.Flow.Font.loadWebFonts();`\n * Alternatively, you may load web fonts with a stylesheet link (e.g., from Google Fonts),\n * and a @font-face { font-family: ... } rule in your CSS.\n * If you do not load either of these fonts, ChordSymbol will fall back to Times or Arial,\n * depending on the current music engraving font.\n *\n * You can customize `Font.WEB_FONT_HOST` and `Font.WEB_FONT_FILES` to load different fonts\n * for your app.\n */\n static loadWebFonts() {\n return __awaiter(this, void 0, void 0, function* () {\n const host = Font.WEB_FONT_HOST;\n const files = Font.WEB_FONT_FILES;\n for (const fontName in files) {\n const fontPath = files[fontName];\n Font.loadWebFont(fontName, host + fontPath);\n }\n });\n }\n static loadTextFonts() {\n //\n }\n /**\n * @param fontName\n * @param data optionally set the Font object's `.data` property.\n * This is usually done when setting up a font for the first time.\n * @param metrics optionally set the Font object's `.metrics` property.\n * This is usually done when setting up a font for the first time.\n * @returns a Font object with the given `fontName`.\n * Reuse an existing Font object if a matching one is found.\n */\n static load(fontName, data, metrics) {\n let font = Fonts[fontName];\n if (!font) {\n font = new Font(fontName);\n Fonts[fontName] = font;\n }\n if (data) {\n font.setData(data);\n }\n if (metrics) {\n font.setMetrics(metrics);\n }\n return font;\n }\n getName() {\n return this.name;\n }\n getData() {\n return defined(this.data, 'FontError', 'Missing font data');\n }\n getMetrics() {\n return defined(this.metrics, 'FontError', 'Missing metrics');\n }\n setData(data) {\n this.data = data;\n }\n setMetrics(metrics) {\n this.metrics = metrics;\n }\n hasData() {\n return this.data !== undefined;\n }\n getResolution() {\n return this.getData().resolution;\n }\n getGlyphs() {\n return this.getData().glyphs;\n }\n /**\n * Use the provided key to look up a value in this font's metrics file (e.g., bravura_metrics.ts, petaluma_metrics.ts).\n * @param key is a string separated by periods (e.g., stave.endPaddingMax, clef.lineCount.'5'.shiftY).\n * @param defaultValue is returned if the lookup fails.\n * @returns the retrieved value (or `defaultValue` if the lookup fails).\n */\n // eslint-disable-next-line\n lookupMetric(key, defaultValue) {\n const keyParts = key.split('.');\n // Start with the top level font metrics object, and keep looking deeper into the object (via each part of the period-delimited key).\n let currObj = this.getMetrics();\n for (let i = 0; i < keyParts.length; i++) {\n const keyPart = keyParts[i];\n const value = currObj[keyPart];\n if (value === undefined) {\n // If the key lookup fails, we fall back to the defaultValue.\n return defaultValue;\n }\n // The most recent lookup succeeded, so we drill deeper into the object.\n currObj = value;\n }\n // After checking every part of the key (i.e., the loop completed), return the most recently retrieved value.\n return currObj;\n }\n /** For debugging. */\n toString() {\n return '[' + this.name + ' Font]';\n }\n}\n//////////////////////////////////////////////////////////////////////////////////////////////////\n// STATIC MEMBERS\n/** Default sans-serif font family. */\nFont.SANS_SERIF = 'Arial, sans-serif';\n/** Default serif font family. */\nFont.SERIF = 'Times New Roman, serif';\n/** Default font size in `pt`. */\nFont.SIZE = 10;\n// CSS Font Sizes: 36pt == 48px == 3em == 300% == 0.5in\n/** Given a length (for units: pt, px, em, %, in, mm, cm) what is the scale factor to convert it to px? */\nFont.scaleToPxFrom = {\n pt: 4 / 3,\n px: 1,\n em: 16,\n '%': 4 / 25,\n in: 96,\n mm: 96 / 25.4,\n cm: 96 / 2.54,\n};\n/**\n * Customize this field to specify a different CDN for delivering web fonts.\n * Alternative: https://cdn.jsdelivr.net/npm/vexflow-fonts@1.0.3/\n * Or you can use your own host.\n */\nFont.WEB_FONT_HOST = 'https://unpkg.com/vexflow-fonts@1.0.3/';\n/**\n * These font files will be loaded from the CDN specified by `Font.WEB_FONT_HOST` when\n * `await Font.loadWebFonts()` is called. Customize this field to specify a different\n * set of fonts to load. See: `Font.loadWebFonts()`.\n */\nFont.WEB_FONT_FILES = {\n 'Roboto Slab': 'robotoslab/RobotoSlab-Medium_2.001.woff',\n PetalumaScript: 'petaluma/PetalumaScript_1.10_FS.woff',\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Mohit Cheppudira\n//\n// ## Description\n//\n// This file implements a registry for VexFlow elements. It allows users\n// to track, query, and manage some subset of generated elements, and\n// dynamically get and set attributes.\n//\n// There are two ways to register with a registry:\n//\n// 1) Explicitly call `registry.register(elem:Element, id?:string)`, or,\n// 2) Call `Registry.enableDefaultRegistry(registry)` when ready, and all future\n// elements will automatically register with it.\n//\n// Once an element is registered, selected attributes are tracked and indexed by\n// the registry. This allows fast look up of elements by attributes like id, type,\n// and class.\nimport { RuntimeError } from './util';\n// Indexes are represented as maps of maps of maps. This allows\n// for both multi-labeling (e.g., an element can have multiple classes)\n// and efficient lookup.\nclass Index {\n constructor() {\n this.id = {};\n this.type = {};\n this.class = {};\n }\n}\nexport class Registry {\n constructor() {\n this.index = new Index();\n }\n static getDefaultRegistry() {\n return Registry.defaultRegistry;\n }\n // If you call `enableDefaultRegistry`, any new elements will auto-register with\n // the provided registry as soon as they're constructed.\n static enableDefaultRegistry(registry) {\n Registry.defaultRegistry = registry;\n }\n static disableDefaultRegistry() {\n Registry.defaultRegistry = undefined;\n }\n clear() {\n this.index = new Index();\n return this;\n }\n setIndexValue(name, value, id, elem) {\n const index = this.index;\n if (!index[name][value]) {\n index[name][value] = {};\n }\n index[name][value][id] = elem;\n }\n // Updates the indexes for element 'id'. If an element's attribute changes\n // from A -> B, make sure to remove the element from A.\n updateIndex({ id, name, value, oldValue }) {\n const elem = this.getElementById(id);\n if (oldValue !== undefined && this.index[name][oldValue]) {\n delete this.index[name][oldValue][id];\n }\n if (value && elem) {\n this.setIndexValue(name, value, elem.getAttribute('id'), elem);\n }\n }\n /**\n * Register element `elem` with this registry.\n * This adds the element to its index and watches it for attribute changes.\n * @param elem\n * @param id\n * @returns this\n */\n register(elem, id) {\n id = id || elem.getAttribute('id');\n if (!id) {\n throw new RuntimeError(\"Can't add element without `id` attribute to registry\");\n }\n // Manually add id to index, then update other indexes.\n elem.setAttribute('id', id);\n this.setIndexValue('id', id, id, elem);\n this.updateIndex({ id, name: 'type', value: elem.getAttribute('type'), oldValue: undefined });\n elem.onRegister(this);\n return this;\n }\n getElementById(id) {\n var _a, _b;\n return (_b = (_a = this.index.id) === null || _a === void 0 ? void 0 : _a[id]) === null || _b === void 0 ? void 0 : _b[id]; // return undefined if the id is not found.\n }\n getElementsByAttribute(attribute, value) {\n const index_attr = this.index[attribute];\n if (index_attr) {\n const index_attr_val = index_attr[value];\n if (index_attr_val) {\n const keys = Object.keys(index_attr_val);\n return keys.map((k) => index_attr_val[k]);\n }\n }\n return [];\n }\n getElementsByType(type) {\n return this.getElementsByAttribute('type', type);\n }\n getElementsByClass(className) {\n return this.getElementsByAttribute('class', className);\n }\n // This is called by the element when an attribute value changes. If an indexed\n // attribute changes, then update the local index.\n onUpdate(info) {\n const allowedNames = ['id', 'type', 'class'];\n if (allowedNames.includes(info.name)) {\n this.updateIndex(info);\n }\n return this;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Mohit Cheppudira\n// MIT License\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Registry } from './registry';\nimport { Category } from './typeguard';\nimport { defined } from './util';\n/**\n * Element implements a generic base class for VexFlow, with implementations\n * of general functions and properties that can be inherited by all VexFlow elements.\n */\nexport class Element {\n constructor() {\n var _a;\n this.attrs = {\n id: Element.newID(),\n el: undefined,\n type: this.getCategory(),\n classes: {},\n };\n this.rendered = false;\n // If a default registry exist, then register with it right away.\n (_a = Registry.getDefaultRegistry()) === null || _a === void 0 ? void 0 : _a.register(this);\n }\n static get CATEGORY() {\n return Category.Element;\n }\n static newID() {\n return `auto${Element.ID++}`;\n }\n /** Get element category string. */\n getCategory() {\n return this.constructor.CATEGORY;\n }\n /**\n * Set the element style used to render.\n *\n * Example:\n * ```typescript\n * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' });\n * element.draw();\n * ```\n * Note: If the element draws additional sub-elements (ie.: Modifiers in a Stave),\n * the style can be applied to all of them by means of the context:\n * ```typescript\n * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' });\n * element.getContext().setFillStyle('red');\n * element.getContext().setStrokeStyle('red');\n * element.draw();\n * ```\n * or using drawWithStyle:\n * ```typescript\n * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' });\n * element.drawWithStyle();\n * ```\n */\n setStyle(style) {\n this.style = style;\n return this;\n }\n /** Get the element style used for rendering. */\n getStyle() {\n return this.style;\n }\n /** Apply the element style to `context`. */\n applyStyle(context = this.context, style = this.getStyle()) {\n if (!style)\n return this;\n if (!context)\n return this;\n context.save();\n if (style.shadowColor)\n context.setShadowColor(style.shadowColor);\n if (style.shadowBlur)\n context.setShadowBlur(style.shadowBlur);\n if (style.fillStyle)\n context.setFillStyle(style.fillStyle);\n if (style.strokeStyle)\n context.setStrokeStyle(style.strokeStyle);\n if (style.lineWidth)\n context.setLineWidth(style.lineWidth);\n return this;\n }\n /** Restore the style of `context`. */\n restoreStyle(context = this.context, style = this.getStyle()) {\n if (!style)\n return this;\n if (!context)\n return this;\n context.restore();\n return this;\n }\n /**\n * Draw the element and all its sub-elements (ie.: Modifiers in a Stave)\n * with the element style.\n */\n drawWithStyle() {\n this.checkContext();\n this.applyStyle();\n this.draw();\n this.restoreStyle();\n }\n /** Check if it has a class label (An element can have multiple class labels). */\n hasClass(className) {\n return this.attrs.classes[className] === true;\n }\n /** Add a class label (An element can have multiple class labels). */\n addClass(className) {\n var _a;\n this.attrs.classes[className] = true;\n (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({\n id: this.attrs.id,\n name: 'class',\n value: className,\n oldValue: undefined,\n });\n return this;\n }\n /** Remove a class label (An element can have multiple class labels). */\n removeClass(className) {\n var _a;\n delete this.attrs.classes[className];\n (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({\n id: this.attrs.id,\n name: 'class',\n value: undefined,\n oldValue: className,\n });\n return this;\n }\n /** Call back from registry after the element is registered. */\n onRegister(registry) {\n this.registry = registry;\n return this;\n }\n /** Return the rendered status. */\n isRendered() {\n return this.rendered;\n }\n /** Set the rendered status. */\n setRendered(rendered = true) {\n this.rendered = rendered;\n return this;\n }\n /** Return the element attributes. */\n getAttributes() {\n return this.attrs;\n }\n /** Return an attribute. */\n // eslint-disable-next-line\n getAttribute(name) {\n return this.attrs[name];\n }\n /** Set an attribute. */\n // eslint-disable-next-line\n setAttribute(name, value) {\n var _a;\n const oldID = this.attrs.id;\n const oldValue = this.attrs[name];\n this.attrs[name] = value;\n // Register with old id to support id changes.\n (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({ id: oldID, name, value, oldValue });\n return this;\n }\n /** Get the boundingBox. */\n getBoundingBox() {\n return this.boundingBox;\n }\n /** Return the context. */\n getContext() {\n return this.context;\n }\n /** Set the context. */\n setContext(context) {\n this.context = context;\n return this;\n }\n /** Validate and return the context. */\n checkContext() {\n return defined(this.context, 'NoContext', 'No rendering context attached to instance.');\n }\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // Font Handling\n /**\n * Provide a CSS compatible font string (e.g., 'bold 16px Arial').\n */\n set font(f) {\n this.setFont(f);\n }\n /** Returns the CSS compatible font string. */\n get font() {\n return Font.toCSSString(this.textFont);\n }\n /**\n * Set the element's font family, size, weight, style (e.g., `Arial`, `10pt`, `bold`, `italic`).\n * @param font is 1) a `FontInfo` object or\n * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or\n * 3) a string representing the font family (at least one of `size`, `weight`, or `style` must also be provided).\n * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt').\n * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900).\n * @param style is a string (e.g., 'italic', 'normal').\n * If no arguments are provided, then the font is set to the default font.\n * Each Element subclass may specify its own default by overriding the static `TEXT_FONT` property.\n */\n setFont(font, size, weight, style) {\n // Allow subclasses to override `TEXT_FONT`.\n const defaultTextFont = this.constructor.TEXT_FONT;\n const fontIsObject = typeof font === 'object';\n const fontIsString = typeof font === 'string';\n const fontIsUndefined = font === undefined;\n const sizeWeightStyleAreUndefined = size === undefined && weight === undefined && style === undefined;\n if (fontIsObject) {\n // `font` is case 1) a FontInfo object\n this.textFont = Object.assign(Object.assign({}, defaultTextFont), font);\n }\n else if (fontIsString && sizeWeightStyleAreUndefined) {\n // `font` is case 2) CSS font shorthand.\n this.textFont = Font.fromCSSString(font);\n }\n else if (fontIsUndefined && sizeWeightStyleAreUndefined) {\n // All arguments are undefined. Do not check for `arguments.length === 0`,\n // which fails on the edge case: `setFont(undefined)`.\n // TODO: See if we can remove this case entirely without introducing a visual diff.\n // The else case below seems like it should be equivalent to this case.\n this.textFont = Object.assign({}, defaultTextFont);\n }\n else {\n // `font` is case 3) a font family string (e.g., 'Times New Roman').\n // The other parameters represent the size, weight, and style.\n // It is okay for `font` to be undefined while one or more of the other arguments is provided.\n // Following CSS conventions, unspecified params are reset to the default.\n this.textFont = Font.validate(font !== null && font !== void 0 ? font : defaultTextFont.family, size !== null && size !== void 0 ? size : defaultTextFont.size, weight !== null && weight !== void 0 ? weight : defaultTextFont.weight, style !== null && style !== void 0 ? style : defaultTextFont.style);\n }\n return this;\n }\n getFont() {\n if (!this.textFont) {\n this.resetFont();\n }\n return Font.toCSSString(this.textFont);\n }\n /**\n * Reset the text font to the style indicated by the static `TEXT_FONT` property.\n * Subclasses can call this to initialize `textFont` for the first time.\n */\n resetFont() {\n this.setFont();\n }\n /** Return a copy of the current FontInfo object. */\n get fontInfo() {\n if (!this.textFont) {\n this.resetFont();\n }\n // We can cast to Required here, because\n // we just called resetFont() above to ensure this.textFont is set.\n return Object.assign({}, this.textFont);\n }\n set fontInfo(fontInfo) {\n this.setFont(fontInfo);\n }\n /** Change the font size, while keeping everything else the same. */\n setFontSize(size) {\n const fontInfo = this.fontInfo;\n this.setFont(fontInfo.family, size, fontInfo.weight, fontInfo.style);\n return this;\n }\n /**\n * @returns a CSS font-size string (e.g., '18pt', '12px', '1em').\n * See Element.fontSizeInPixels or Element.fontSizeInPoints if you need to get a number for calculation purposes.\n */\n getFontSize() {\n return this.fontSize;\n }\n /**\n * The size is 1) a string of the form '10pt' or '16px', compatible with the CSS font-size property.\n * or 2) a number, which is interpreted as a point size (i.e. 12 == '12pt').\n */\n set fontSize(size) {\n this.setFontSize(size);\n }\n /**\n * @returns a CSS font-size string (e.g., '18pt', '12px', '1em').\n */\n get fontSize() {\n let size = this.fontInfo.size;\n if (typeof size === 'number') {\n size = `${size}pt`;\n }\n return size;\n }\n /**\n * @returns the font size in `pt`.\n */\n get fontSizeInPoints() {\n return Font.convertSizeToPointValue(this.fontSize);\n }\n /**\n * @returns the font size in `px`.\n */\n get fontSizeInPixels() {\n return Font.convertSizeToPixelValue(this.fontSize);\n }\n /**\n * @returns a CSS font-style string (e.g., 'italic').\n */\n get fontStyle() {\n return this.fontInfo.style;\n }\n set fontStyle(style) {\n const fontInfo = this.fontInfo;\n this.setFont(fontInfo.family, fontInfo.size, fontInfo.weight, style);\n }\n /**\n * @returns a CSS font-weight string (e.g., 'bold').\n * As in CSS, font-weight is always returned as a string, even if it was set as a number.\n */\n get fontWeight() {\n return this.fontInfo.weight + '';\n }\n set fontWeight(weight) {\n const fontInfo = this.fontInfo;\n this.setFont(fontInfo.family, fontInfo.size, weight, fontInfo.style);\n }\n}\nElement.ID = 1000;\n/**\n * Default font for text. This is not related to music engraving. Instead, see `Flow.setMusicFont(...fontNames)`\n * to customize the font for musical symbols placed on the score.\n */\nElement.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: Font.SIZE,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { BoundingBox } from './boundingbox';\nimport { BoundingBoxComputation } from './boundingboxcomputation';\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nexport var OutlineCode;\n(function (OutlineCode) {\n OutlineCode[OutlineCode[\"MOVE\"] = 0] = \"MOVE\";\n OutlineCode[OutlineCode[\"LINE\"] = 1] = \"LINE\";\n OutlineCode[OutlineCode[\"QUADRATIC\"] = 2] = \"QUADRATIC\";\n OutlineCode[OutlineCode[\"BEZIER\"] = 3] = \"BEZIER\";\n})(OutlineCode || (OutlineCode = {}));\nclass GlyphCacheEntry {\n constructor(fontStack, code, category) {\n this.point = -1;\n this.metrics = Glyph.loadMetrics(fontStack, code, category);\n this.bbox = Glyph.getOutlineBoundingBox(this.metrics.outline, this.metrics.scale, this.metrics.x_shift, this.metrics.y_shift);\n if (category) {\n this.point = Glyph.lookupFontMetric(this.metrics.font, category, code, 'point', -1);\n }\n }\n}\nclass GlyphCache {\n constructor() {\n this.cache = new Map();\n }\n lookup(code, category) {\n let entries = this.cache.get(Glyph.CURRENT_CACHE_KEY);\n if (entries === undefined) {\n entries = {};\n this.cache.set(Glyph.CURRENT_CACHE_KEY, entries);\n }\n const key = category ? `${code}%${category}` : code;\n let entry = entries[key];\n if (entry === undefined) {\n entry = new GlyphCacheEntry(Glyph.MUSIC_FONT_STACK, code, category);\n entries[key] = entry;\n }\n return entry;\n }\n}\nclass GlyphOutline {\n constructor(outline, originX, originY, scale) {\n this.outline = outline;\n this.originX = originX;\n this.originY = originY;\n this.scale = scale;\n this.i = 0;\n // Automatically assign private properties: this.outline, this.originX, this.originY, and this.scale.\n }\n done() {\n return this.i >= this.outline.length;\n }\n next() {\n return this.outline[this.i++];\n }\n nextX() {\n return this.originX + this.outline[this.i++] * this.scale;\n }\n nextY() {\n return this.originY - this.outline[this.i++] * this.scale;\n }\n static parse(str) {\n const result = [];\n const parts = str.split(' ');\n let i = 0;\n while (i < parts.length) {\n switch (parts[i++]) {\n case 'm':\n result.push(OutlineCode.MOVE, parseInt(parts[i++]), parseInt(parts[i++]));\n break;\n case 'l':\n result.push(OutlineCode.LINE, parseInt(parts[i++]), parseInt(parts[i++]));\n break;\n case 'q':\n result.push(OutlineCode.QUADRATIC, parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]));\n break;\n case 'b':\n result.push(OutlineCode.BEZIER, parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]));\n break;\n }\n }\n return result;\n }\n}\nexport class Glyph extends Element {\n /**\n * @param code\n * @param point\n * @param options\n */\n constructor(code, point, options) {\n super();\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // INSTANCE MEMBERS\n this.bbox = new BoundingBox(0, 0, 0, 0);\n this.topGlyphs = [];\n this.botGlyphs = [];\n this.options = {};\n this.scale = 1;\n this.code = code;\n this.point = point;\n this.originShift = { x: 0, y: 0 };\n this.x_shift = 0;\n this.y_shift = 0;\n if (options) {\n this.setOptions(options);\n }\n else {\n this.reset();\n }\n }\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // STATIC MEMBERS\n static get CATEGORY() {\n return Category.Glyph;\n }\n /**\n * Pass a key of the form `glyphs.{category}.{code}.{key}` to Font.lookupMetric(). If the initial lookup fails,\n * try again with the path `glyphs.{category}.{key}`. If the second lookup fails, return the defaultValue.\n *\n * @param font\n * @param category any metric path under 'glyphs', so 'stem.up' could resolve to glyphs.stem.up.shiftX, glyphs.stem.up.shiftY, etc.\n * @param code\n * @param key\n * @param defaultValue\n */\n static lookupFontMetric(font, category, code, key, defaultValue) {\n let value = font.lookupMetric(`glyphs.${category}.${code}.${key}`, undefined);\n if (value === undefined) {\n // The first lookup failed, so we omit .${code} and try again (with a defaultValue this time).\n value = font.lookupMetric(`glyphs.${category}.${key}`, defaultValue);\n }\n return value;\n }\n static lookupGlyph(fontStack, code) {\n defined(fontStack, 'BadFontStack', 'Font stack is misconfigured');\n let glyph;\n let font;\n for (let i = 0; i < fontStack.length; i++) {\n font = fontStack[i];\n glyph = font.getGlyphs()[code];\n if (glyph)\n return { glyph, font };\n }\n throw new RuntimeError('BadGlyph', `Glyph ${code} does not exist in font.`);\n }\n static loadMetrics(fontStack, code, category) {\n const { glyph, font } = Glyph.lookupGlyph(fontStack, code);\n if (!glyph.o)\n throw new RuntimeError('BadGlyph', `Glyph ${code} has no outline defined.`);\n let x_shift = 0;\n let y_shift = 0;\n let scale = 1;\n if (category && font) {\n x_shift = Glyph.lookupFontMetric(font, category, code, 'shiftX', 0);\n y_shift = Glyph.lookupFontMetric(font, category, code, 'shiftY', 0);\n scale = Glyph.lookupFontMetric(font, category, code, 'scale', 1);\n }\n const x_min = glyph.x_min;\n const x_max = glyph.x_max;\n const ha = glyph.ha;\n if (!glyph.cached_outline) {\n glyph.cached_outline = GlyphOutline.parse(glyph.o);\n }\n return {\n x_min,\n x_max,\n x_shift,\n y_shift,\n scale,\n ha,\n outline: glyph.cached_outline,\n font,\n width: x_max - x_min,\n height: ha,\n };\n }\n /**\n * Renders glyphs from the default font stack.\n *\n * @param ctx Canvas or SVG context\n * @param x_pos x coordinate\n * @param y_pos y coordinate\n * @param point the point size of the font\n * @param code the glyph code in font.getGlyphs()\n * @param options\n * @returns\n */\n static renderGlyph(ctx, x_pos, y_pos, point, code, options) {\n var _a;\n const data = Glyph.cache.lookup(code, options === null || options === void 0 ? void 0 : options.category);\n const metrics = data.metrics;\n if (data.point != -1) {\n point = data.point;\n }\n const customScale = (_a = options === null || options === void 0 ? void 0 : options.scale) !== null && _a !== void 0 ? _a : 1;\n const scale = ((point * 72.0) / (metrics.font.getResolution() * 100.0)) * metrics.scale * customScale;\n Glyph.renderOutline(ctx, metrics.outline, scale, x_pos + metrics.x_shift * customScale, y_pos + metrics.y_shift * customScale);\n return metrics;\n }\n static renderOutline(ctx, outline, scale, x_pos, y_pos) {\n const go = new GlyphOutline(outline, x_pos, y_pos, scale);\n ctx.beginPath();\n let x, y;\n while (!go.done()) {\n switch (go.next()) {\n case OutlineCode.MOVE:\n ctx.moveTo(go.nextX(), go.nextY());\n break;\n case OutlineCode.LINE:\n ctx.lineTo(go.nextX(), go.nextY());\n break;\n case OutlineCode.QUADRATIC:\n x = go.nextX();\n y = go.nextY();\n ctx.quadraticCurveTo(go.nextX(), go.nextY(), x, y);\n break;\n case OutlineCode.BEZIER:\n x = go.nextX();\n y = go.nextY();\n ctx.bezierCurveTo(go.nextX(), go.nextY(), go.nextX(), go.nextY(), x, y);\n break;\n }\n }\n ctx.fill();\n }\n static getOutlineBoundingBox(outline, scale, x_pos, y_pos) {\n const go = new GlyphOutline(outline, x_pos, y_pos, scale);\n const bboxComp = new BoundingBoxComputation();\n // (penX, penY) hold the pen position: the start of each stroke.\n let penX = x_pos;\n let penY = y_pos;\n let x, y;\n while (!go.done()) {\n switch (go.next()) {\n case OutlineCode.MOVE:\n // Note that we don't add any points to the bounding box until a srroke is actually drawn.\n penX = go.nextX();\n penY = go.nextY();\n break;\n case OutlineCode.LINE:\n bboxComp.addPoint(penX, penY);\n penX = go.nextX();\n penY = go.nextY();\n bboxComp.addPoint(penX, penY);\n break;\n case OutlineCode.QUADRATIC:\n x = go.nextX();\n y = go.nextY();\n bboxComp.addQuadraticCurve(penX, penY, go.nextX(), go.nextY(), x, y);\n penX = x;\n penY = y;\n break;\n case OutlineCode.BEZIER:\n x = go.nextX();\n y = go.nextY();\n bboxComp.addBezierCurve(penX, penY, go.nextX(), go.nextY(), go.nextX(), go.nextY(), x, y);\n penX = x;\n penY = y;\n break;\n }\n }\n return new BoundingBox(bboxComp.getX1(), bboxComp.getY1(), bboxComp.width(), bboxComp.height());\n }\n static getWidth(code, point, category) {\n const data = Glyph.cache.lookup(code, category);\n if (data.point != -1) {\n point = data.point;\n }\n const scale = (point * 72) / (data.metrics.font.getResolution() * 100);\n return data.bbox.getW() * scale;\n }\n // eslint-disable-next-line\n draw(...args) {\n // DO NOTHING.\n }\n getCode() {\n return this.code;\n }\n // eslint-disable-next-line\n setOptions(options) {\n this.options = Object.assign(Object.assign({}, this.options), options);\n this.reset();\n }\n setPoint(point) {\n this.point = point;\n return this;\n }\n setStave(stave) {\n this.stave = stave;\n return this;\n }\n setXShift(x_shift) {\n this.x_shift = x_shift;\n return this;\n }\n setYShift(y_shift) {\n this.y_shift = y_shift;\n return this;\n }\n reset() {\n const data = Glyph.cache.lookup(this.code, this.options.category);\n this.metrics = data.metrics;\n // Override point from metrics file\n if (data.point != -1) {\n this.point = data.point;\n }\n this.scale = (this.point * 72) / (this.metrics.font.getResolution() * 100);\n this.bbox = new BoundingBox(data.bbox.getX() * this.scale, data.bbox.getY() * this.scale, data.bbox.getW() * this.scale, data.bbox.getH() * this.scale);\n }\n checkMetrics() {\n return defined(this.metrics, 'BadGlyph', `Glyph ${this.code} is not initialized.`);\n }\n getMetrics() {\n const metrics = this.checkMetrics();\n const metricsScale = metrics.scale;\n return {\n x_min: metrics.x_min * this.scale * metricsScale,\n x_max: metrics.x_max * this.scale * metricsScale,\n width: this.bbox.getW(),\n height: this.bbox.getH(),\n scale: this.scale * metricsScale,\n x_shift: metrics.x_shift,\n y_shift: metrics.y_shift,\n outline: metrics.outline,\n font: metrics.font,\n ha: metrics.ha,\n };\n }\n setOriginX(x) {\n const { bbox } = this;\n const originX = Math.abs(bbox.getX() / bbox.getW());\n const xShift = (x - originX) * bbox.getW();\n this.originShift.x = -xShift;\n }\n setOriginY(y) {\n const { bbox } = this;\n const originY = Math.abs(bbox.getY() / bbox.getH());\n const yShift = (y - originY) * bbox.getH();\n this.originShift.y = -yShift;\n }\n setOrigin(x, y) {\n this.setOriginX(x);\n this.setOriginY(y);\n }\n render(ctx, x, y) {\n const metrics = this.checkMetrics();\n const outline = metrics.outline;\n const scale = this.scale * metrics.scale;\n this.setRendered();\n this.applyStyle(ctx);\n const xPos = x + this.originShift.x + metrics.x_shift;\n const yPos = y + this.originShift.y + metrics.y_shift;\n Glyph.renderOutline(ctx, outline, scale, xPos, yPos);\n this.restoreStyle(ctx);\n }\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n renderToStave(x) {\n const context = this.checkContext();\n const metrics = this.checkMetrics();\n const stave = this.checkStave();\n const outline = metrics.outline;\n const scale = this.scale * metrics.scale;\n this.setRendered();\n this.applyStyle();\n const xPos = x + this.x_shift + metrics.x_shift;\n const yPos = stave.getYForGlyphs() + this.y_shift + metrics.y_shift;\n Glyph.renderOutline(context, outline, scale, xPos, yPos);\n this.restoreStyle();\n }\n}\nGlyph.cache = new GlyphCache();\n// The current cache key for GlyphCache above.\n// Computed when Flow.setMusicFont(...) is called.\n// It is set to a comma separated list of font names.\nGlyph.CURRENT_CACHE_KEY = '';\n// Used by the GlyphCache above.\n// Set when Flow.setMusicFont(...) is called.\nGlyph.MUSIC_FONT_STACK = [];\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nexport var ModifierPosition;\n(function (ModifierPosition) {\n ModifierPosition[ModifierPosition[\"CENTER\"] = 0] = \"CENTER\";\n ModifierPosition[ModifierPosition[\"LEFT\"] = 1] = \"LEFT\";\n ModifierPosition[ModifierPosition[\"RIGHT\"] = 2] = \"RIGHT\";\n ModifierPosition[ModifierPosition[\"ABOVE\"] = 3] = \"ABOVE\";\n ModifierPosition[ModifierPosition[\"BELOW\"] = 4] = \"BELOW\";\n})(ModifierPosition || (ModifierPosition = {}));\n// To enable logging for this class. Set `Vex.Flow.Modifier.DEBUG` to `true`.\n// function L(...args) { if (Modifier.DEBUG) log('Vex.Flow.Modifier', args); }\n/**\n * `Modifier` is an abstract interface for notational elements that modify\n * a `Note`. Examples of modifiers are `Accidental`, `Annotation`, `Stroke`, etc.\n *\n * For a `Modifier` instance to be positioned correctly, it must be part of\n * a `ModifierContext`. All modifiers in the same context are rendered relative to\n * one another.\n *\n * Typically, all modifiers to a note are part of the same `ModifierContext` instance. Also,\n * in multi-voice staves, all modifiers to notes on the same `tick` are part of the same\n * `ModifierContext`. This ensures that multiple voices don't trample all over each other.\n */\nexport class Modifier extends Element {\n constructor() {\n super();\n this.width = 0;\n // The `text_line` is reserved space above or below a stave.\n this.text_line = 0;\n this.position = Modifier.Position.LEFT;\n this.x_shift = 0;\n this.y_shift = 0;\n this.spacingFromNextModifier = 0;\n }\n /**\n * Modifiers category string. Every modifier has a different category.\n * The `ModifierContext` uses this to determine the type and order of the modifiers.\n */\n static get CATEGORY() {\n return Category.Modifier;\n }\n /** Modifiers can be positioned almost anywhere, relative to a note. */\n static get Position() {\n return ModifierPosition;\n }\n static get PositionString() {\n return {\n center: ModifierPosition.CENTER,\n above: ModifierPosition.ABOVE,\n below: ModifierPosition.BELOW,\n left: ModifierPosition.LEFT,\n right: ModifierPosition.RIGHT,\n };\n }\n /** Called when position changes. */\n reset() {\n // DO NOTHING.\n }\n /** Get modifier widths. */\n getWidth() {\n return this.width;\n }\n /** Set modifier widths. */\n setWidth(width) {\n this.width = width;\n return this;\n }\n /** Get attached note (`StaveNote`, `TabNote`, etc.) */\n getNote() {\n return defined(this.note, 'NoNote', 'Modifier has no note.');\n }\n /**\n * Used in draw() to check and get the attached note (`StaveNote`, `TabNote`, etc.).\n * Also verifies that the index is valid.\n */\n checkAttachedNote() {\n const category = this.getCategory();\n defined(this.index, 'NoIndex', `Can't draw ${category} without an index.`);\n return defined(this.note, 'NoNote', `Can't draw ${category} without a note.`);\n }\n /**\n * Set attached note.\n * @param note (`StaveNote`, `TabNote`, etc.)\n */\n setNote(note) {\n this.note = note;\n return this;\n }\n /** Get note index, which is a specific note in a chord. */\n getIndex() {\n return this.index;\n }\n /** Check and get note index, which is a specific note in a chord. */\n checkIndex() {\n return defined(this.index, 'NoIndex', 'Modifier has an invalid index.');\n }\n /** Set note index, which is a specific note in a chord. */\n setIndex(index) {\n this.index = index;\n return this;\n }\n /** Get `ModifierContext`. */\n getModifierContext() {\n return this.modifierContext;\n }\n /** Check and get `ModifierContext`. */\n checkModifierContext() {\n return defined(this.modifierContext, 'NoModifierContext', 'Modifier Context Required');\n }\n /** Every modifier must be part of a `ModifierContext`. */\n setModifierContext(c) {\n this.modifierContext = c;\n return this;\n }\n /** Get position. */\n getPosition() {\n return this.position;\n }\n /**\n * Set position.\n * @param position CENTER | LEFT | RIGHT | ABOVE | BELOW\n */\n setPosition(position) {\n this.position = typeof position === 'string' ? Modifier.PositionString[position] : position;\n this.reset();\n return this;\n }\n /** Set the `text_line` for the modifier. */\n setTextLine(line) {\n this.text_line = line;\n return this;\n }\n /** Shift modifier down `y` pixels. Negative values shift up. */\n setYShift(y) {\n this.y_shift = y;\n return this;\n }\n /** Set spacing from next modifier. */\n setSpacingFromNextModifier(x) {\n this.spacingFromNextModifier = x;\n }\n /** Get spacing from next modifier. */\n getSpacingFromNextModifier() {\n return this.spacingFromNextModifier;\n }\n /**\n * Shift modifier `x` pixels in the direction of the modifier. Negative values\n * shift reverse.\n */\n setXShift(x) {\n this.x_shift = 0;\n if (this.position === Modifier.Position.LEFT) {\n this.x_shift -= x;\n }\n else {\n this.x_shift += x;\n }\n return this;\n }\n /** Get shift modifier `x` */\n getXShift() {\n return this.x_shift;\n }\n /** Render the modifier onto the canvas. */\n draw() {\n this.checkContext();\n throw new RuntimeError('NotImplemented', 'draw() not implemented for this modifier.');\n }\n // aligns sub notes of NoteSubGroup (or GraceNoteGroup) to the main note with correct x-offset\n alignSubNotesWithNote(subNotes, note) {\n // Shift over the tick contexts of each note\n const tickContext = note.getTickContext();\n const metrics = tickContext.getMetrics();\n const stave = note.getStave();\n const subNoteXOffset = tickContext.getX() - metrics.modLeftPx - metrics.modRightPx + this.getSpacingFromNextModifier();\n subNotes.forEach((subNote) => {\n const subTickContext = subNote.getTickContext();\n if (stave)\n subNote.setStave(stave);\n subTickContext.setXOffset(subNoteXOffset); // don't touch baseX to avoid shift each render\n });\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { RuntimeError } from './util';\n/** Music implements some standard music theory routines. */\nexport class Music {\n /** Number of an canonical notes (12). */\n static get NUM_TONES() {\n return this.canonical_notes.length;\n }\n /** Names of root notes ('c', 'd',...) */\n static get roots() {\n return ['c', 'd', 'e', 'f', 'g', 'a', 'b'];\n }\n /** Values of the root notes.*/\n static get root_values() {\n return [0, 2, 4, 5, 7, 9, 11];\n }\n /** Indices of the root notes.*/\n static get root_indices() {\n return {\n c: 0,\n d: 1,\n e: 2,\n f: 3,\n g: 4,\n a: 5,\n b: 6,\n };\n }\n /** Names of canonical notes ('c', 'c#', 'd',...). */\n static get canonical_notes() {\n return ['c', 'c#', 'd', 'd#', 'e', 'f', 'f#', 'g', 'g#', 'a', 'a#', 'b'];\n }\n /** Names of diatonic intervals ('unison', 'm2', 'M2',...). */\n static get diatonic_intervals() {\n return ['unison', 'm2', 'M2', 'm3', 'M3', 'p4', 'dim5', 'p5', 'm6', 'M6', 'b7', 'M7', 'octave'];\n }\n /** NoteAccidental associated to diatonic intervals. */\n static get diatonic_accidentals() {\n return {\n unison: { note: 0, accidental: 0 },\n m2: { note: 1, accidental: -1 },\n M2: { note: 1, accidental: 0 },\n m3: { note: 2, accidental: -1 },\n M3: { note: 2, accidental: 0 },\n p4: { note: 3, accidental: 0 },\n dim5: { note: 4, accidental: -1 },\n p5: { note: 4, accidental: 0 },\n m6: { note: 5, accidental: -1 },\n M6: { note: 5, accidental: 0 },\n b7: { note: 6, accidental: -1 },\n M7: { note: 6, accidental: 0 },\n octave: { note: 7, accidental: 0 },\n };\n }\n /** Semitones shift associated to intervals .*/\n static get intervals() {\n return {\n u: 0,\n unison: 0,\n m2: 1,\n b2: 1,\n min2: 1,\n S: 1,\n H: 1,\n 2: 2,\n M2: 2,\n maj2: 2,\n T: 2,\n W: 2,\n m3: 3,\n b3: 3,\n min3: 3,\n M3: 4,\n 3: 4,\n maj3: 4,\n 4: 5,\n p4: 5,\n '#4': 6,\n b5: 6,\n aug4: 6,\n dim5: 6,\n 5: 7,\n p5: 7,\n '#5': 8,\n b6: 8,\n aug5: 8,\n 6: 9,\n M6: 9,\n maj6: 9,\n b7: 10,\n m7: 10,\n min7: 10,\n dom7: 10,\n M7: 11,\n maj7: 11,\n 8: 12,\n octave: 12,\n };\n }\n /** Semitones shifts associated with scales. */\n static get scales() {\n return {\n major: [2, 2, 1, 2, 2, 2, 1],\n minor: [2, 1, 2, 2, 1, 2, 2],\n ionian: [2, 2, 1, 2, 2, 2, 1],\n dorian: [2, 1, 2, 2, 2, 1, 2],\n phyrgian: [1, 2, 2, 2, 1, 2, 2],\n lydian: [2, 2, 2, 1, 2, 2, 1],\n mixolydian: [2, 2, 1, 2, 2, 1, 2],\n aeolian: [2, 1, 2, 2, 1, 2, 2],\n locrian: [1, 2, 2, 1, 2, 2, 2],\n };\n }\n /** Scales associated with m (minor) and M (major). */\n static get scaleTypes() {\n return {\n M: Music.scales.major,\n m: Music.scales.minor,\n };\n }\n /** Accidentals abbreviations. */\n static get accidentals() {\n return ['bb', 'b', 'n', '#', '##'];\n }\n /** Note values. */\n static get noteValues() {\n return {\n c: { root_index: 0, int_val: 0 },\n cn: { root_index: 0, int_val: 0 },\n 'c#': { root_index: 0, int_val: 1 },\n 'c##': { root_index: 0, int_val: 2 },\n cb: { root_index: 0, int_val: 11 },\n cbb: { root_index: 0, int_val: 10 },\n d: { root_index: 1, int_val: 2 },\n dn: { root_index: 1, int_val: 2 },\n 'd#': { root_index: 1, int_val: 3 },\n 'd##': { root_index: 1, int_val: 4 },\n db: { root_index: 1, int_val: 1 },\n dbb: { root_index: 1, int_val: 0 },\n e: { root_index: 2, int_val: 4 },\n en: { root_index: 2, int_val: 4 },\n 'e#': { root_index: 2, int_val: 5 },\n 'e##': { root_index: 2, int_val: 6 },\n eb: { root_index: 2, int_val: 3 },\n ebb: { root_index: 2, int_val: 2 },\n f: { root_index: 3, int_val: 5 },\n fn: { root_index: 3, int_val: 5 },\n 'f#': { root_index: 3, int_val: 6 },\n 'f##': { root_index: 3, int_val: 7 },\n fb: { root_index: 3, int_val: 4 },\n fbb: { root_index: 3, int_val: 3 },\n g: { root_index: 4, int_val: 7 },\n gn: { root_index: 4, int_val: 7 },\n 'g#': { root_index: 4, int_val: 8 },\n 'g##': { root_index: 4, int_val: 9 },\n gb: { root_index: 4, int_val: 6 },\n gbb: { root_index: 4, int_val: 5 },\n a: { root_index: 5, int_val: 9 },\n an: { root_index: 5, int_val: 9 },\n 'a#': { root_index: 5, int_val: 10 },\n 'a##': { root_index: 5, int_val: 11 },\n ab: { root_index: 5, int_val: 8 },\n abb: { root_index: 5, int_val: 7 },\n b: { root_index: 6, int_val: 11 },\n bn: { root_index: 6, int_val: 11 },\n 'b#': { root_index: 6, int_val: 0 },\n 'b##': { root_index: 6, int_val: 1 },\n bb: { root_index: 6, int_val: 10 },\n bbb: { root_index: 6, int_val: 9 },\n };\n }\n isValidNoteValue(note) {\n return note >= 0 && note < Music.canonical_notes.length;\n }\n isValidIntervalValue(interval) {\n return interval >= 0 && interval < Music.diatonic_intervals.length;\n }\n /** Return root and accidental associated to a note. */\n getNoteParts(noteString) {\n if (!noteString || noteString.length < 1) {\n throw new RuntimeError('BadArguments', 'Invalid note name: ' + noteString);\n }\n if (noteString.length > 3) {\n throw new RuntimeError('BadArguments', 'Invalid note name: ' + noteString);\n }\n const note = noteString.toLowerCase();\n const regex = /^([cdefgab])(b|bb|n|#|##)?$/;\n const match = regex.exec(note);\n if (match !== null) {\n const root = match[1];\n const accidental = match[2];\n return {\n root,\n accidental,\n };\n }\n else {\n throw new RuntimeError('BadArguments', 'Invalid note name: ' + noteString);\n }\n }\n /** Return root, accidental and type associated to a key. */\n getKeyParts(keyString) {\n if (!keyString || keyString.length < 1) {\n throw new RuntimeError('BadArguments', 'Invalid key: ' + keyString);\n }\n const key = keyString.toLowerCase();\n // Support Major, Minor, Melodic Minor, and Harmonic Minor key types.\n const regex = /^([cdefgab])(b|#)?(mel|harm|m|M)?$/;\n const match = regex.exec(key);\n if (match !== null) {\n const root = match[1];\n const accidental = match[2];\n let type = match[3];\n // Unspecified type implies major\n if (!type)\n type = 'M';\n return {\n root,\n accidental,\n type,\n };\n }\n else {\n throw new RuntimeError('BadArguments', `Invalid key: ${keyString}`);\n }\n }\n /** Note value associated to a note name. */\n getNoteValue(noteString) {\n const value = Music.noteValues[noteString];\n if (value === undefined) {\n throw new RuntimeError('BadArguments', `Invalid note name: ${noteString}`);\n }\n return value.int_val;\n }\n /** Interval value associated to an interval name. */\n getIntervalValue(intervalString) {\n const value = Music.intervals[intervalString];\n if (value === undefined) {\n throw new RuntimeError('BadArguments', `Invalid interval name: ${intervalString}`);\n }\n return value;\n }\n /** Canonical note name associated to a value. */\n getCanonicalNoteName(noteValue) {\n if (!this.isValidNoteValue(noteValue)) {\n throw new RuntimeError('BadArguments', `Invalid note value: ${noteValue}`);\n }\n return Music.canonical_notes[noteValue];\n }\n /** Interval name associated to a value. */\n getCanonicalIntervalName(intervalValue) {\n if (!this.isValidIntervalValue(intervalValue)) {\n throw new RuntimeError('BadArguments', `Invalid interval value: ${intervalValue}`);\n }\n return Music.diatonic_intervals[intervalValue];\n }\n /**\n * Given a note, interval, and interval direction, produce the relative note.\n */\n getRelativeNoteValue(noteValue, intervalValue, direction = 1) {\n if (direction !== 1 && direction !== -1) {\n throw new RuntimeError('BadArguments', `Invalid direction: ${direction}`);\n }\n let sum = (noteValue + direction * intervalValue) % Music.NUM_TONES;\n if (sum < 0)\n sum += Music.NUM_TONES;\n return sum;\n }\n /**\n * Given a root and note value, produce the relative note name.\n */\n getRelativeNoteName(root, noteValue) {\n const parts = this.getNoteParts(root);\n const rootValue = this.getNoteValue(parts.root);\n let interval = noteValue - rootValue;\n if (Math.abs(interval) > Music.NUM_TONES - 3) {\n let multiplier = 1;\n if (interval > 0)\n multiplier = -1;\n // Possibly wrap around. (Add +1 for modulo operator)\n const reverse_interval = ((noteValue + 1 + (rootValue + 1)) % Music.NUM_TONES) * multiplier;\n if (Math.abs(reverse_interval) > 2) {\n throw new RuntimeError('BadArguments', `Notes not related: ${root}, ${noteValue})`);\n }\n else {\n interval = reverse_interval;\n }\n }\n if (Math.abs(interval) > 2) {\n throw new RuntimeError('BadArguments', `Notes not related: ${root}, ${noteValue})`);\n }\n let relativeNoteName = parts.root;\n if (interval > 0) {\n for (let i = 1; i <= interval; ++i) {\n relativeNoteName += '#';\n }\n }\n else if (interval < 0) {\n for (let i = -1; i >= interval; --i) {\n relativeNoteName += 'b';\n }\n }\n return relativeNoteName;\n }\n /**\n * Return scale tones, given intervals. Each successive interval is\n * relative to the previous one, e.g., Major Scale:\n *\n * TTSTTTS = [2,2,1,2,2,2,1]\n *\n * When used with key = 0, returns C scale (which is isomorphic to\n * interval list).\n */\n getScaleTones(key, intervals) {\n const tones = [key];\n let nextNote = key;\n for (let i = 0; i < intervals.length; i++) {\n nextNote = this.getRelativeNoteValue(nextNote, intervals[i]);\n if (nextNote !== key)\n tones.push(nextNote);\n }\n return tones;\n }\n /**\n * Return the interval of a note, given a diatonic scale.\n * e.g., given the scale C, and the note E, returns M3.\n */\n getIntervalBetween(note1, note2, direction = 1) {\n if (direction !== 1 && direction !== -1) {\n throw new RuntimeError('BadArguments', `Invalid direction: ${direction}`);\n }\n if (!this.isValidNoteValue(note1) || !this.isValidNoteValue(note2)) {\n throw new RuntimeError('BadArguments', `Invalid notes: ${note1}, ${note2}`);\n }\n let difference = direction === 1 ? note2 - note1 : note1 - note2;\n if (difference < 0)\n difference += Music.NUM_TONES;\n return difference;\n }\n /**\n * Create a scale map that represents the pitch state for a\n * `keySignature`. For example, passing a `G` to `keySignature` would\n * return a scale map with every note naturalized except for `F` which\n * has an `F#` state.\n */\n createScaleMap(keySignature) {\n const keySigParts = this.getKeyParts(keySignature);\n if (!keySigParts.type)\n throw new RuntimeError('BadArguments', 'Unsupported key type: undefined');\n const scaleName = Music.scaleTypes[keySigParts.type];\n let keySigString = keySigParts.root;\n if (keySigParts.accidental)\n keySigString += keySigParts.accidental;\n if (!scaleName)\n throw new RuntimeError('BadArguments', 'Unsupported key type: ' + keySignature);\n const scale = this.getScaleTones(this.getNoteValue(keySigString), scaleName);\n const noteLocation = Music.root_indices[keySigParts.root];\n const scaleMap = {};\n for (let i = 0; i < Music.roots.length; ++i) {\n const index = (noteLocation + i) % Music.roots.length;\n const rootName = Music.roots[index];\n let noteName = this.getRelativeNoteName(rootName, scale[i]);\n if (noteName.length === 1) {\n noteName += 'n';\n }\n scaleMap[rootName] = noteName;\n }\n return scaleMap;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { Fraction } from './fraction';\nimport { Glyph } from './glyph';\nimport { RuntimeError } from './util';\nconst RESOLUTION = 16384;\n/**\n * Map duration numbers to 'ticks', the unit of duration used throughout VexFlow.\n * For example, a quarter note is 4, so it maps to RESOLUTION / 4 = 4096 ticks.\n */\nconst durations = {\n '1/2': RESOLUTION * 2,\n 1: RESOLUTION / 1,\n 2: RESOLUTION / 2,\n 4: RESOLUTION / 4,\n 8: RESOLUTION / 8,\n 16: RESOLUTION / 16,\n 32: RESOLUTION / 32,\n 64: RESOLUTION / 64,\n 128: RESOLUTION / 128,\n 256: RESOLUTION / 256,\n};\nconst durationAliases = {\n w: '1',\n h: '2',\n q: '4',\n // This is the default duration used to render bars (BarNote). Bars no longer\n // consume ticks, so this should be a no-op.\n // TODO(0xfe): This needs to be cleaned up.\n b: '256',\n};\nconst keySignatures = {\n C: { num: 0 },\n Am: { num: 0 },\n F: { acc: 'b', num: 1 },\n Dm: { acc: 'b', num: 1 },\n Bb: { acc: 'b', num: 2 },\n Gm: { acc: 'b', num: 2 },\n Eb: { acc: 'b', num: 3 },\n Cm: { acc: 'b', num: 3 },\n Ab: { acc: 'b', num: 4 },\n Fm: { acc: 'b', num: 4 },\n Db: { acc: 'b', num: 5 },\n Bbm: { acc: 'b', num: 5 },\n Gb: { acc: 'b', num: 6 },\n Ebm: { acc: 'b', num: 6 },\n Cb: { acc: 'b', num: 7 },\n Abm: { acc: 'b', num: 7 },\n G: { acc: '#', num: 1 },\n Em: { acc: '#', num: 1 },\n D: { acc: '#', num: 2 },\n Bm: { acc: '#', num: 2 },\n A: { acc: '#', num: 3 },\n 'F#m': { acc: '#', num: 3 },\n E: { acc: '#', num: 4 },\n 'C#m': { acc: '#', num: 4 },\n B: { acc: '#', num: 5 },\n 'G#m': { acc: '#', num: 5 },\n 'F#': { acc: '#', num: 6 },\n 'D#m': { acc: '#', num: 6 },\n 'C#': { acc: '#', num: 7 },\n 'A#m': { acc: '#', num: 7 },\n};\nconst clefs = {\n treble: { line_shift: 0 },\n bass: { line_shift: 6 },\n tenor: { line_shift: 4 },\n alto: { line_shift: 3 },\n soprano: { line_shift: 1 },\n percussion: { line_shift: 0 },\n 'mezzo-soprano': { line_shift: 2 },\n 'baritone-c': { line_shift: 5 },\n 'baritone-f': { line_shift: 5 },\n subbass: { line_shift: 7 },\n french: { line_shift: -1 },\n};\nconst notesInfo = {\n C: { index: 0, int_val: 0 },\n CN: { index: 0, int_val: 0, accidental: 'n' },\n 'C#': { index: 0, int_val: 1, accidental: '#' },\n 'C##': { index: 0, int_val: 2, accidental: '##' },\n CB: { index: 0, int_val: 11, accidental: 'b' },\n CBB: { index: 0, int_val: 10, accidental: 'bb' },\n D: { index: 1, int_val: 2 },\n DN: { index: 1, int_val: 2, accidental: 'n' },\n 'D#': { index: 1, int_val: 3, accidental: '#' },\n 'D##': { index: 1, int_val: 4, accidental: '##' },\n DB: { index: 1, int_val: 1, accidental: 'b' },\n DBB: { index: 1, int_val: 0, accidental: 'bb' },\n E: { index: 2, int_val: 4 },\n EN: { index: 2, int_val: 4, accidental: 'n' },\n 'E#': { index: 2, int_val: 5, accidental: '#' },\n 'E##': { index: 2, int_val: 6, accidental: '##' },\n EB: { index: 2, int_val: 3, accidental: 'b' },\n EBB: { index: 2, int_val: 2, accidental: 'bb' },\n F: { index: 3, int_val: 5 },\n FN: { index: 3, int_val: 5, accidental: 'n' },\n 'F#': { index: 3, int_val: 6, accidental: '#' },\n 'F##': { index: 3, int_val: 7, accidental: '##' },\n FB: { index: 3, int_val: 4, accidental: 'b' },\n FBB: { index: 3, int_val: 3, accidental: 'bb' },\n G: { index: 4, int_val: 7 },\n GN: { index: 4, int_val: 7, accidental: 'n' },\n 'G#': { index: 4, int_val: 8, accidental: '#' },\n 'G##': { index: 4, int_val: 9, accidental: '##' },\n GB: { index: 4, int_val: 6, accidental: 'b' },\n GBB: { index: 4, int_val: 5, accidental: 'bb' },\n A: { index: 5, int_val: 9 },\n AN: { index: 5, int_val: 9, accidental: 'n' },\n 'A#': { index: 5, int_val: 10, accidental: '#' },\n 'A##': { index: 5, int_val: 11, accidental: '##' },\n AB: { index: 5, int_val: 8, accidental: 'b' },\n ABB: { index: 5, int_val: 7, accidental: 'bb' },\n B: { index: 6, int_val: 11 },\n BN: { index: 6, int_val: 11, accidental: 'n' },\n 'B#': { index: 6, int_val: 12, accidental: '#' },\n 'B##': { index: 6, int_val: 13, accidental: '##' },\n BB: { index: 6, int_val: 10, accidental: 'b' },\n BBB: { index: 6, int_val: 9, accidental: 'bb' },\n R: { index: 6, rest: true },\n X: {\n index: 6,\n accidental: '',\n octave: 4,\n code: 'noteheadXBlack',\n shift_right: 5.5,\n },\n};\nconst validNoteTypes = {\n n: { name: 'note' },\n r: { name: 'rest' },\n h: { name: 'harmonic' },\n m: { name: 'muted' },\n s: { name: 'slash' },\n g: { name: 'ghost' },\n};\nconst customNoteHeads = {\n /* Diamond */\n D0: { code: 'noteheadDiamondWhole' },\n D1: { code: 'noteheadDiamondHalf' },\n D2: { code: 'noteheadDiamondBlack' },\n D3: { code: 'noteheadDiamondBlack' },\n /* Triangle */\n T0: { code: 'noteheadTriangleUpWhole' },\n T1: { code: 'noteheadTriangleUpHalf' },\n T2: { code: 'noteheadTriangleUpBlack' },\n T3: { code: 'noteheadTriangleUpBlack' },\n /* Cross */\n X0: { code: 'noteheadXWhole' },\n X1: { code: 'noteheadXHalf' },\n X2: { code: 'noteheadXBlack' },\n X3: { code: 'noteheadCircleX' },\n /* Square */\n S1: { code: 'noteheadSquareWhite' },\n S2: { code: 'noteheadSquareBlack' },\n /* Rectangle */\n R1: { code: 'vexNoteHeadRectWhite' },\n R2: { code: 'vexNoteHeadRectBlack' }, // no smufl code\n};\nconst accidentals = {\n '#': { code: 'accidentalSharp', parenRightPaddingAdjustment: -1 },\n '##': { code: 'accidentalDoubleSharp', parenRightPaddingAdjustment: -1 },\n b: { code: 'accidentalFlat', parenRightPaddingAdjustment: -2 },\n bb: { code: 'accidentalDoubleFlat', parenRightPaddingAdjustment: -2 },\n n: { code: 'accidentalNatural', parenRightPaddingAdjustment: -1 },\n '{': { code: 'accidentalParensLeft', parenRightPaddingAdjustment: -1 },\n '}': { code: 'accidentalParensRight', parenRightPaddingAdjustment: -1 },\n db: { code: 'accidentalThreeQuarterTonesFlatZimmermann', parenRightPaddingAdjustment: -1 },\n d: { code: 'accidentalQuarterToneFlatStein', parenRightPaddingAdjustment: 0 },\n '++': { code: 'accidentalThreeQuarterTonesSharpStein', parenRightPaddingAdjustment: -1 },\n '+': { code: 'accidentalQuarterToneSharpStein', parenRightPaddingAdjustment: -1 },\n '+-': { code: 'accidentalKucukMucennebSharp', parenRightPaddingAdjustment: -1 },\n bs: { code: 'accidentalBakiyeFlat', parenRightPaddingAdjustment: -1 },\n bss: { code: 'accidentalBuyukMucennebFlat', parenRightPaddingAdjustment: -1 },\n o: { code: 'accidentalSori', parenRightPaddingAdjustment: -1 },\n k: { code: 'accidentalKoron', parenRightPaddingAdjustment: -1 },\n bbs: { code: 'vexAccidentalMicrotonal1', parenRightPaddingAdjustment: -1 },\n '++-': { code: 'vexAccidentalMicrotonal2', parenRightPaddingAdjustment: -1 },\n ashs: { code: 'vexAccidentalMicrotonal3', parenRightPaddingAdjustment: -1 },\n afhf: { code: 'vexAccidentalMicrotonal4', parenRightPaddingAdjustment: -1 },\n accSagittal5v7KleismaUp: { code: 'accSagittal5v7KleismaUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v7KleismaDown: { code: 'accSagittal5v7KleismaDown', parenRightPaddingAdjustment: -1 },\n accSagittal5CommaUp: { code: 'accSagittal5CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal5CommaDown: { code: 'accSagittal5CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal7CommaUp: { code: 'accSagittal7CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal7CommaDown: { code: 'accSagittal7CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal25SmallDiesisUp: { code: 'accSagittal25SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal25SmallDiesisDown: { code: 'accSagittal25SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal35MediumDiesisUp: { code: 'accSagittal35MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal35MediumDiesisDown: { code: 'accSagittal35MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal11MediumDiesisUp: { code: 'accSagittal11MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal11MediumDiesisDown: { code: 'accSagittal11MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal11LargeDiesisUp: { code: 'accSagittal11LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal11LargeDiesisDown: { code: 'accSagittal11LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal35LargeDiesisUp: { code: 'accSagittal35LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal35LargeDiesisDown: { code: 'accSagittal35LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp25SDown: { code: 'accSagittalSharp25SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat25SUp: { code: 'accSagittalFlat25SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7CDown: { code: 'accSagittalSharp7CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7CUp: { code: 'accSagittalFlat7CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5CDown: { code: 'accSagittalSharp5CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5CUp: { code: 'accSagittalFlat5CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v7kDown: { code: 'accSagittalSharp5v7kDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v7kUp: { code: 'accSagittalFlat5v7kUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp: { code: 'accSagittalSharp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat: { code: 'accSagittalFlat', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v7kUp: { code: 'accSagittalSharp5v7kUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v7kDown: { code: 'accSagittalFlat5v7kDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5CUp: { code: 'accSagittalSharp5CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5CDown: { code: 'accSagittalFlat5CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7CUp: { code: 'accSagittalSharp7CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7CDown: { code: 'accSagittalFlat7CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp25SUp: { code: 'accSagittalSharp25SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat25SDown: { code: 'accSagittalFlat25SDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp35MUp: { code: 'accSagittalSharp35MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat35MDown: { code: 'accSagittalFlat35MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11MUp: { code: 'accSagittalSharp11MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11MDown: { code: 'accSagittalFlat11MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11LUp: { code: 'accSagittalSharp11LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11LDown: { code: 'accSagittalFlat11LDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp35LUp: { code: 'accSagittalSharp35LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat35LDown: { code: 'accSagittalFlat35LDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp25SDown: { code: 'accSagittalDoubleSharp25SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat25SUp: { code: 'accSagittalDoubleFlat25SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp7CDown: { code: 'accSagittalDoubleSharp7CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat7CUp: { code: 'accSagittalDoubleFlat7CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5CDown: { code: 'accSagittalDoubleSharp5CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5CUp: { code: 'accSagittalDoubleFlat5CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5v7kDown: { code: 'accSagittalDoubleSharp5v7kDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5v7kUp: { code: 'accSagittalDoubleFlat5v7kUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp: { code: 'accSagittalDoubleSharp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat: { code: 'accSagittalDoubleFlat', parenRightPaddingAdjustment: -1 },\n accSagittal7v11KleismaUp: { code: 'accSagittal7v11KleismaUp', parenRightPaddingAdjustment: -1 },\n accSagittal7v11KleismaDown: { code: 'accSagittal7v11KleismaDown', parenRightPaddingAdjustment: -1 },\n accSagittal17CommaUp: { code: 'accSagittal17CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal17CommaDown: { code: 'accSagittal17CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal55CommaUp: { code: 'accSagittal55CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal55CommaDown: { code: 'accSagittal55CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal7v11CommaUp: { code: 'accSagittal7v11CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal7v11CommaDown: { code: 'accSagittal7v11CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v11SmallDiesisUp: { code: 'accSagittal5v11SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v11SmallDiesisDown: { code: 'accSagittal5v11SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v11SDown: { code: 'accSagittalSharp5v11SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v11SUp: { code: 'accSagittalFlat5v11SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v11CDown: { code: 'accSagittalSharp7v11CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v11CUp: { code: 'accSagittalFlat7v11CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp55CDown: { code: 'accSagittalSharp55CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat55CUp: { code: 'accSagittalFlat55CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp17CDown: { code: 'accSagittalSharp17CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat17CUp: { code: 'accSagittalFlat17CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v11kDown: { code: 'accSagittalSharp7v11kDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v11kUp: { code: 'accSagittalFlat7v11kUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v11kUp: { code: 'accSagittalSharp7v11kUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v11kDown: { code: 'accSagittalFlat7v11kDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp17CUp: { code: 'accSagittalSharp17CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat17CDown: { code: 'accSagittalFlat17CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp55CUp: { code: 'accSagittalSharp55CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat55CDown: { code: 'accSagittalFlat55CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v11CUp: { code: 'accSagittalSharp7v11CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v11CDown: { code: 'accSagittalFlat7v11CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v11SUp: { code: 'accSagittalSharp5v11SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v11SDown: { code: 'accSagittalFlat5v11SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5v11SDown: { code: 'accSagittalDoubleSharp5v11SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5v11SUp: { code: 'accSagittalDoubleFlat5v11SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp7v11CDown: { code: 'accSagittalDoubleSharp7v11CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat7v11CUp: { code: 'accSagittalDoubleFlat7v11CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp55CDown: { code: 'accSagittalDoubleSharp55CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat55CUp: { code: 'accSagittalDoubleFlat55CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp17CDown: { code: 'accSagittalDoubleSharp17CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat17CUp: { code: 'accSagittalDoubleFlat17CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp7v11kDown: { code: 'accSagittalDoubleSharp7v11kDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat7v11kUp: { code: 'accSagittalDoubleFlat7v11kUp', parenRightPaddingAdjustment: -1 },\n accSagittal23CommaUp: { code: 'accSagittal23CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal23CommaDown: { code: 'accSagittal23CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v19CommaUp: { code: 'accSagittal5v19CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v19CommaDown: { code: 'accSagittal5v19CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v23SmallDiesisUp: { code: 'accSagittal5v23SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v23SmallDiesisDown: { code: 'accSagittal5v23SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v23SDown: { code: 'accSagittalSharp5v23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v23SUp: { code: 'accSagittalFlat5v23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v19CDown: { code: 'accSagittalSharp5v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v19CUp: { code: 'accSagittalFlat5v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp23CDown: { code: 'accSagittalSharp23CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat23CUp: { code: 'accSagittalFlat23CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp23CUp: { code: 'accSagittalSharp23CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat23CDown: { code: 'accSagittalFlat23CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v19CUp: { code: 'accSagittalSharp5v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v19CDown: { code: 'accSagittalFlat5v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v23SUp: { code: 'accSagittalSharp5v23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v23SDown: { code: 'accSagittalFlat5v23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5v23SDown: { code: 'accSagittalDoubleSharp5v23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5v23SUp: { code: 'accSagittalDoubleFlat5v23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5v19CDown: { code: 'accSagittalDoubleSharp5v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5v19CUp: { code: 'accSagittalDoubleFlat5v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp23CDown: { code: 'accSagittalDoubleSharp23CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat23CUp: { code: 'accSagittalDoubleFlat23CUp', parenRightPaddingAdjustment: -1 },\n accSagittal19SchismaUp: { code: 'accSagittal19SchismaUp', parenRightPaddingAdjustment: -1 },\n accSagittal19SchismaDown: { code: 'accSagittal19SchismaDown', parenRightPaddingAdjustment: -1 },\n accSagittal17KleismaUp: { code: 'accSagittal17KleismaUp', parenRightPaddingAdjustment: -1 },\n accSagittal17KleismaDown: { code: 'accSagittal17KleismaDown', parenRightPaddingAdjustment: -1 },\n accSagittal143CommaUp: { code: 'accSagittal143CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal143CommaDown: { code: 'accSagittal143CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal11v49CommaUp: { code: 'accSagittal11v49CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal11v49CommaDown: { code: 'accSagittal11v49CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal19CommaUp: { code: 'accSagittal19CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal19CommaDown: { code: 'accSagittal19CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal7v19CommaUp: { code: 'accSagittal7v19CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal7v19CommaDown: { code: 'accSagittal7v19CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal49SmallDiesisUp: { code: 'accSagittal49SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal49SmallDiesisDown: { code: 'accSagittal49SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal23SmallDiesisUp: { code: 'accSagittal23SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal23SmallDiesisDown: { code: 'accSagittal23SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v13MediumDiesisUp: { code: 'accSagittal5v13MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v13MediumDiesisDown: { code: 'accSagittal5v13MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal11v19MediumDiesisUp: { code: 'accSagittal11v19MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal11v19MediumDiesisDown: { code: 'accSagittal11v19MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal49MediumDiesisUp: { code: 'accSagittal49MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal49MediumDiesisDown: { code: 'accSagittal49MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v49MediumDiesisUp: { code: 'accSagittal5v49MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v49MediumDiesisDown: { code: 'accSagittal5v49MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal49LargeDiesisUp: { code: 'accSagittal49LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal49LargeDiesisDown: { code: 'accSagittal49LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal11v19LargeDiesisUp: { code: 'accSagittal11v19LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal11v19LargeDiesisDown: { code: 'accSagittal11v19LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v13LargeDiesisUp: { code: 'accSagittal5v13LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v13LargeDiesisDown: { code: 'accSagittal5v13LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp23SDown: { code: 'accSagittalSharp23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat23SUp: { code: 'accSagittalFlat23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp49SDown: { code: 'accSagittalSharp49SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat49SUp: { code: 'accSagittalFlat49SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v19CDown: { code: 'accSagittalSharp7v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v19CUp: { code: 'accSagittalFlat7v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp19CDown: { code: 'accSagittalSharp19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat19CUp: { code: 'accSagittalFlat19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11v49CDown: { code: 'accSagittalSharp11v49CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11v49CUp: { code: 'accSagittalFlat11v49CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp143CDown: { code: 'accSagittalSharp143CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat143CUp: { code: 'accSagittalFlat143CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp17kDown: { code: 'accSagittalSharp17kDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat17kUp: { code: 'accSagittalFlat17kUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp19sDown: { code: 'accSagittalSharp19sDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat19sUp: { code: 'accSagittalFlat19sUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp19sUp: { code: 'accSagittalSharp19sUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat19sDown: { code: 'accSagittalFlat19sDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp17kUp: { code: 'accSagittalSharp17kUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat17kDown: { code: 'accSagittalFlat17kDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp143CUp: { code: 'accSagittalSharp143CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat143CDown: { code: 'accSagittalFlat143CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11v49CUp: { code: 'accSagittalSharp11v49CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11v49CDown: { code: 'accSagittalFlat11v49CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp19CUp: { code: 'accSagittalSharp19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat19CDown: { code: 'accSagittalFlat19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v19CUp: { code: 'accSagittalSharp7v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v19CDown: { code: 'accSagittalFlat7v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp49SUp: { code: 'accSagittalSharp49SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat49SDown: { code: 'accSagittalFlat49SDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp23SUp: { code: 'accSagittalSharp23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat23SDown: { code: 'accSagittalFlat23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v13MUp: { code: 'accSagittalSharp5v13MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v13MDown: { code: 'accSagittalFlat5v13MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11v19MUp: { code: 'accSagittalSharp11v19MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11v19MDown: { code: 'accSagittalFlat11v19MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp49MUp: { code: 'accSagittalSharp49MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat49MDown: { code: 'accSagittalFlat49MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v49MUp: { code: 'accSagittalSharp5v49MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v49MDown: { code: 'accSagittalFlat5v49MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp49LUp: { code: 'accSagittalSharp49LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat49LDown: { code: 'accSagittalFlat49LDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11v19LUp: { code: 'accSagittalSharp11v19LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11v19LDown: { code: 'accSagittalFlat11v19LDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v13LUp: { code: 'accSagittalSharp5v13LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v13LDown: { code: 'accSagittalFlat5v13LDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp23SDown: { code: 'accSagittalDoubleSharp23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat23SUp: { code: 'accSagittalDoubleFlat23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp49SDown: { code: 'accSagittalDoubleSharp49SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat49SUp: { code: 'accSagittalDoubleFlat49SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp7v19CDown: { code: 'accSagittalDoubleSharp7v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat7v19CUp: { code: 'accSagittalDoubleFlat7v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp19CDown: { code: 'accSagittalDoubleSharp19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat19CUp: { code: 'accSagittalDoubleFlat19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp11v49CDown: { code: 'accSagittalDoubleSharp11v49CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat11v49CUp: { code: 'accSagittalDoubleFlat11v49CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp143CDown: { code: 'accSagittalDoubleSharp143CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat143CUp: { code: 'accSagittalDoubleFlat143CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp17kDown: { code: 'accSagittalDoubleSharp17kDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat17kUp: { code: 'accSagittalDoubleFlat17kUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp19sDown: { code: 'accSagittalDoubleSharp19sDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat19sUp: { code: 'accSagittalDoubleFlat19sUp', parenRightPaddingAdjustment: -1 },\n accSagittalShaftUp: { code: 'accSagittalShaftUp', parenRightPaddingAdjustment: -1 },\n accSagittalShaftDown: { code: 'accSagittalShaftDown', parenRightPaddingAdjustment: -1 },\n accSagittalAcute: { code: 'accSagittalAcute', parenRightPaddingAdjustment: -1 },\n accSagittalGrave: { code: 'accSagittalGrave', parenRightPaddingAdjustment: -1 },\n accSagittal1MinaUp: { code: 'accSagittal1MinaUp', parenRightPaddingAdjustment: -1 },\n accSagittal1MinaDown: { code: 'accSagittal1MinaDown', parenRightPaddingAdjustment: -1 },\n accSagittal2MinasUp: { code: 'accSagittal2MinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal2MinasDown: { code: 'accSagittal2MinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal1TinaUp: { code: 'accSagittal1TinaUp', parenRightPaddingAdjustment: -1 },\n accSagittal1TinaDown: { code: 'accSagittal1TinaDown', parenRightPaddingAdjustment: -1 },\n accSagittal2TinasUp: { code: 'accSagittal2TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal2TinasDown: { code: 'accSagittal2TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal3TinasUp: { code: 'accSagittal3TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal3TinasDown: { code: 'accSagittal3TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal4TinasUp: { code: 'accSagittal4TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal4TinasDown: { code: 'accSagittal4TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal5TinasUp: { code: 'accSagittal5TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal5TinasDown: { code: 'accSagittal5TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal6TinasUp: { code: 'accSagittal6TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal6TinasDown: { code: 'accSagittal6TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal7TinasUp: { code: 'accSagittal7TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal7TinasDown: { code: 'accSagittal7TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal8TinasUp: { code: 'accSagittal8TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal8TinasDown: { code: 'accSagittal8TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal9TinasUp: { code: 'accSagittal9TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal9TinasDown: { code: 'accSagittal9TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittalFractionalTinaUp: { code: 'accSagittalFractionalTinaUp', parenRightPaddingAdjustment: -1 },\n accSagittalFractionalTinaDown: { code: 'accSagittalFractionalTinaDown', parenRightPaddingAdjustment: -1 },\n accidentalNarrowReversedFlat: { code: 'accidentalNarrowReversedFlat', parenRightPaddingAdjustment: -1 },\n accidentalNarrowReversedFlatAndFlat: {\n code: 'accidentalNarrowReversedFlatAndFlat',\n parenRightPaddingAdjustment: -1,\n },\n accidentalWilsonPlus: { code: 'accidentalWilsonPlus', parenRightPaddingAdjustment: -1 },\n accidentalWilsonMinus: { code: 'accidentalWilsonMinus', parenRightPaddingAdjustment: -1 },\n};\n// Helps determine the layout of accidentals.\nconst accidentalColumns = {\n 1: {\n a: [1],\n b: [1],\n },\n 2: {\n a: [1, 2],\n },\n 3: {\n a: [1, 3, 2],\n b: [1, 2, 1],\n second_on_bottom: [1, 2, 3],\n },\n 4: {\n a: [1, 3, 4, 2],\n b: [1, 2, 3, 1],\n spaced_out_tetrachord: [1, 2, 1, 2],\n },\n 5: {\n a: [1, 3, 5, 4, 2],\n b: [1, 2, 4, 3, 1],\n spaced_out_pentachord: [1, 2, 3, 2, 1],\n very_spaced_out_pentachord: [1, 2, 1, 2, 1],\n },\n 6: {\n a: [1, 3, 5, 6, 4, 2],\n b: [1, 2, 4, 5, 3, 1],\n spaced_out_hexachord: [1, 3, 2, 1, 3, 2],\n very_spaced_out_hexachord: [1, 2, 1, 2, 1, 2],\n },\n};\nconst articulations = {\n 'a.': { code: 'augmentationDot', between_lines: true },\n av: {\n aboveCode: 'articStaccatissimoAbove',\n belowCode: 'articStaccatissimoBelow',\n between_lines: true,\n },\n 'a>': {\n aboveCode: 'articAccentAbove',\n belowCode: 'articAccentBelow',\n between_lines: true,\n },\n 'a-': {\n aboveCode: 'articTenutoAbove',\n belowCode: 'articTenutoBelow',\n between_lines: true,\n },\n 'a^': {\n aboveCode: 'articMarcatoAbove',\n belowCode: 'articMarcatoBelow',\n between_lines: false,\n },\n 'a+': { code: 'pluckedLeftHandPizzicato', between_lines: false },\n ao: {\n aboveCode: 'pluckedSnapPizzicatoAbove',\n belowCode: 'pluckedSnapPizzicatoBelow',\n between_lines: false,\n },\n ah: { code: 'stringsHarmonic', between_lines: false },\n 'a@': { aboveCode: 'fermataAbove', belowCode: 'fermataBelow', between_lines: false },\n 'a@a': { code: 'fermataAbove', between_lines: false },\n 'a@u': { code: 'fermataBelow', between_lines: false },\n 'a|': { code: 'stringsUpBow', between_lines: false },\n am: { code: 'stringsDownBow', between_lines: false },\n 'a,': { code: 'pictChokeCymbal', between_lines: false }, // Choked\n};\nconst ornaments = {\n mordent: { code: 'ornamentShortTrill' },\n mordent_inverted: { code: 'ornamentMordent' },\n turn: { code: 'ornamentTurn' },\n turn_inverted: { code: 'ornamentTurnSlash' },\n tr: { code: 'ornamentTrill' },\n upprall: { code: 'ornamentPrecompSlideTrillDAnglebert' },\n downprall: { code: 'ornamentPrecompDoubleCadenceUpperPrefix' },\n prallup: { code: 'ornamentPrecompTrillSuffixDandrieu' },\n pralldown: { code: 'ornamentPrecompTrillLowerSuffix' },\n upmordent: { code: 'ornamentPrecompSlideTrillBach' },\n downmordent: { code: 'ornamentPrecompDoubleCadenceUpperPrefixTurn' },\n lineprall: { code: 'ornamentPrecompAppoggTrill' },\n prallprall: { code: 'ornamentTremblement' },\n scoop: { code: 'brassScoop' },\n doit: { code: 'brassDoitMedium' },\n fall: { code: 'brassFallLipShort' },\n doitLong: { code: 'brassLiftMedium' },\n fallLong: { code: 'brassFallRoughMedium' },\n bend: { code: 'brassBend' },\n plungerClosed: { code: 'brassMuteClosed' },\n plungerOpen: { code: 'brassMuteOpen' },\n flip: { code: 'brassFlip' },\n jazzTurn: { code: 'brassJazzTurn' },\n smear: { code: 'brassSmear' },\n};\nexport class Tables {\n /**\n * @returns the `Font` object at the head of the music font stack.\n */\n static currentMusicFont() {\n if (Tables.MUSIC_FONT_STACK.length === 0) {\n throw new RuntimeError('NoFonts', 'The font stack is empty. See: await Flow.fetchMusicFont(...); Flow.setMusicFont(...).');\n }\n else {\n return Tables.MUSIC_FONT_STACK[0];\n }\n }\n static clefProperties(clef) {\n if (!clef || !(clef in clefs))\n throw new RuntimeError('BadArgument', 'Invalid clef: ' + clef);\n return clefs[clef];\n }\n /**\n * @param keyOctaveGlyph a string in the format \"key/octave\" (e.g., \"c/5\") or \"key/octave/custom-note-head-code\" (e.g., \"g/5/t3\").\n * @param clef\n * @param params a struct with one option, `octave_shift` for clef ottavation (0 = default; 1 = 8va; -1 = 8vb, etc.).\n * @returns properties for the specified note.\n */\n // eslint-disable-next-line\n static keyProperties(keyOctaveGlyph, clef = 'treble', params) {\n let options = { octave_shift: 0 };\n if (typeof params === 'object') {\n options = Object.assign(Object.assign({}, options), params);\n }\n const pieces = keyOctaveGlyph.split('/');\n if (pieces.length < 2) {\n throw new RuntimeError('BadArguments', `First argument must be note/octave or note/octave/glyph-code: ${keyOctaveGlyph}`);\n }\n const key = pieces[0].toUpperCase();\n const value = notesInfo[key];\n if (!value)\n throw new RuntimeError('BadArguments', 'Invalid key name: ' + key);\n if (value.octave)\n pieces[1] = value.octave.toString();\n let octave = parseInt(pieces[1], 10);\n // Octave_shift is the shift to compensate for clef 8va/8vb.\n octave += -1 * options.octave_shift;\n const baseIndex = octave * 7 - 4 * 7;\n let line = (baseIndex + value.index) / 2;\n line += Tables.clefProperties(clef).line_shift;\n let stroke = 0;\n if (line <= 0 && (line * 2) % 2 === 0)\n stroke = 1; // stroke up\n if (line >= 6 && (line * 2) % 2 === 0)\n stroke = -1; // stroke down\n // Integer value for note arithmetic.\n const int_value = typeof value.int_val !== 'undefined' ? octave * 12 + value.int_val : undefined;\n // If the user specified a glyph, overwrite the glyph code.\n const code = value.code;\n const shift_right = value.shift_right;\n let customNoteHeadProps = {};\n if (pieces.length > 2 && pieces[2]) {\n const glyphName = pieces[2].toUpperCase();\n customNoteHeadProps = customNoteHeads[glyphName] || {};\n }\n return Object.assign({ key,\n octave,\n line,\n int_value, accidental: value.accidental, code,\n stroke,\n shift_right, displaced: false }, customNoteHeadProps);\n }\n static integerToNote(integer) {\n if (typeof integer === 'undefined' || integer < 0 || integer > 11) {\n throw new RuntimeError('BadArguments', `integerToNote() requires an integer in the range [0, 11]: ${integer}`);\n }\n const table = {\n 0: 'C',\n 1: 'C#',\n 2: 'D',\n 3: 'D#',\n 4: 'E',\n 5: 'F',\n 6: 'F#',\n 7: 'G',\n 8: 'G#',\n 9: 'A',\n 10: 'A#',\n 11: 'B',\n };\n const noteValue = table[integer];\n if (!noteValue) {\n throw new RuntimeError('BadArguments', `Unknown note value for integer: ${integer}`);\n }\n return noteValue;\n }\n static tabToGlyph(fret, scale = 1.0) {\n let glyph = undefined;\n let width = 0;\n let shift_y = 0;\n if (fret.toUpperCase() === 'X') {\n const glyphMetrics = new Glyph('accidentalDoubleSharp', Tables.TABLATURE_FONT_SCALE).getMetrics();\n glyph = 'accidentalDoubleSharp';\n if (glyphMetrics.width == undefined || glyphMetrics.height == undefined)\n throw new RuntimeError('InvalidMetrics', 'Width and height required');\n width = glyphMetrics.width;\n shift_y = -glyphMetrics.height / 2;\n }\n else {\n width = Tables.textWidth(fret);\n }\n return {\n text: fret,\n code: glyph,\n getWidth: () => width * scale,\n shift_y,\n };\n }\n // Used by annotation.ts and bend.ts. Clearly this implementation only works for the default font size.\n // TODO: The actual width depends on the font family, size, weight, style.\n static textWidth(text) {\n return 7 * text.toString().length;\n }\n static articulationCodes(artic) {\n return articulations[artic];\n }\n static accidentalCodes(acc) {\n return accidentals[acc];\n }\n static ornamentCodes(acc) {\n return ornaments[acc];\n }\n static keySignature(spec) {\n const keySpec = keySignatures[spec];\n if (!keySpec) {\n throw new RuntimeError('BadKeySignature', `Bad key signature spec: '${spec}'`);\n }\n if (!keySpec.acc) {\n return [];\n }\n const accidentalList = {\n b: [2, 0.5, 2.5, 1, 3, 1.5, 3.5],\n '#': [0, 1.5, -0.5, 1, 2.5, 0.5, 2],\n };\n const notes = accidentalList[keySpec.acc];\n const acc_list = [];\n for (let i = 0; i < keySpec.num; ++i) {\n const line = notes[i];\n acc_list.push({ type: keySpec.acc, line });\n }\n return acc_list;\n }\n static getKeySignatures() {\n return keySignatures;\n }\n static hasKeySignature(spec) {\n return spec in keySignatures;\n }\n /**\n * Convert duration aliases to the number based duration.\n * If the input isn't an alias, simply return the input.\n * @param duration\n * @returns Example: 'q' -> '4', '8' -> '8'\n */\n static sanitizeDuration(duration) {\n const durationNumber = durationAliases[duration];\n if (durationNumber !== undefined) {\n duration = durationNumber;\n }\n if (durations[duration] === undefined) {\n throw new RuntimeError('BadArguments', `The provided duration is not valid: ${duration}`);\n }\n return duration;\n }\n /** Convert the `duration` to a fraction. */\n static durationToFraction(duration) {\n return new Fraction().parse(Tables.sanitizeDuration(duration));\n }\n /** Convert the `duration` to a number. */\n static durationToNumber(duration) {\n return Tables.durationToFraction(duration).value();\n }\n /* Convert the `duration` to total ticks. */\n static durationToTicks(duration) {\n duration = Tables.sanitizeDuration(duration);\n const ticks = durations[duration];\n if (ticks === undefined) {\n throw new RuntimeError('InvalidDuration');\n }\n return ticks;\n }\n // Return a glyph given duration and type. The type can be a custom glyph code from customNoteHeads.\n // The default type is a regular note ('n').\n // eslint-disable-next-line\n static getGlyphProps(duration, type = 'n') {\n duration = Tables.sanitizeDuration(duration);\n // Lookup duration for default glyph head code\n const code = durationCodes[duration];\n if (code === undefined) {\n return undefined;\n }\n // Get glyph properties for 'type' from duration string (note, rest, harmonic, muted, slash)\n let glyphTypeProperties = code.type[type];\n // If this isn't a standard type, then lookup the custom note head map.\n if (glyphTypeProperties === undefined) {\n // Try and get it from the custom list of note heads\n const customGlyphTypeProperties = customNoteHeads[type.toUpperCase()];\n // If not, then return with nothing.\n if (customGlyphTypeProperties === undefined) {\n return undefined;\n }\n // Otherwise set it as the code_head value\n glyphTypeProperties = Object.assign({ code_head: customGlyphTypeProperties.code }, customGlyphTypeProperties);\n }\n const code_head = glyphTypeProperties.code_head;\n // The default implementation of getWidth() calls Glyph.getWidth(code_head, scale).\n // This can be overridden by an individual glyph type (see slash noteheads below: Tables.SLASH_NOTEHEAD_WIDTH).\n const getWidth = (scale = Tables.NOTATION_FONT_SCALE) => Glyph.getWidth(code_head, scale);\n // Merge duration props for 'duration' with the note head properties.\n return Object.assign(Object.assign(Object.assign({}, code.common), { getWidth: getWidth }), glyphTypeProperties);\n }\n}\nTables.STEM_WIDTH = 1.5;\nTables.STEM_HEIGHT = 35;\nTables.STAVE_LINE_THICKNESS = 1;\nTables.RESOLUTION = RESOLUTION;\n/**\n * Customize this by calling Flow.setMusicFont(...fontNames);\n */\nTables.MUSIC_FONT_STACK = [];\nTables.NOTATION_FONT_SCALE = 39;\nTables.TABLATURE_FONT_SCALE = 39;\nTables.SLASH_NOTEHEAD_WIDTH = 15;\nTables.STAVE_LINE_DISTANCE = 10;\n// HACK:\n// Since text origins are positioned at the baseline, we must\n// compensate for the ascender of the text. Of course, 1 staff space is\n// a very poor approximation.\n//\n// This will be deprecated in the future. This is a temporary solution until\n// we have more robust text metrics.\nTables.TEXT_HEIGHT_OFFSET_HACK = 1;\nTables.accidentalMap = accidentals;\nTables.accidentalColumnsTable = accidentalColumns;\nTables.unicode = {\n // ♯ accidental sharp\n sharp: String.fromCharCode(0x266f),\n // ♭ accidental flat\n flat: String.fromCharCode(0x266d),\n // ♮ accidental natural\n natural: String.fromCharCode(0x266e),\n // △ major seventh\n triangle: String.fromCharCode(0x25b3),\n // ø half-diminished\n 'o-with-slash': String.fromCharCode(0x00f8),\n // ° diminished\n degrees: String.fromCharCode(0x00b0),\n // ○ diminished\n circle: String.fromCharCode(0x25cb),\n};\n/* The list of valid note types. Used by note.ts during parseNoteStruct(). */\nTables.validTypes = validNoteTypes;\n// Default time signature.\nTables.TIME4_4 = {\n num_beats: 4,\n beat_value: 4,\n resolution: RESOLUTION,\n};\n// 1/2, 1, 2, 4, 8, 16, 32, 64, 128\n// NOTE: There is no 256 here! However, there are other mentions of 256 in this file.\n// For example, in durations has a 256 key, and sanitizeDuration() can return 256.\n// The sanitizeDuration() bit may need to be removed by 0xfe.\n// eslint-disable-next-line\nconst durationCodes = {\n '1/2': {\n common: {\n stem: false,\n stem_offset: 0,\n flag: false,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Breve note\n code_head: 'noteheadDoubleWhole',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDoubleWhole', scale);\n // },\n },\n h: {\n // Breve note harmonic\n code_head: 'unpitchedPercussionClef1',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('unpitchedPercussionClef1', scale);\n // },\n },\n m: {\n // Breve note muted\n code_head: 'vexNoteHeadMutedBreve',\n stem_offset: 0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('vexNoteHeadMutedBreve', scale);\n // },\n },\n r: {\n // Breve rest\n code_head: 'restDoubleWhole',\n rest: true,\n position: 'B/5',\n dot_shiftY: 0.5,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('restDoubleWhole', scale);\n // },\n },\n s: {\n // Breve note slash -\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadDoubleWhole',\n },\n },\n },\n 1: {\n common: {\n stem: false,\n stem_offset: 0,\n flag: false,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Whole note\n code_head: 'noteheadWhole',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadWhole', scale);\n // },\n },\n h: {\n // Whole note harmonic\n code_head: 'noteheadDiamondWhole',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondWhole', scale);\n // },\n },\n m: {\n // Whole note muted\n code_head: 'noteheadXWhole',\n stem_offset: -3,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXWhole', scale);\n // },\n },\n r: {\n // Whole rest\n code_head: 'restWhole',\n rest: true,\n position: 'D/5',\n dot_shiftY: 0.5,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('restWhole', scale);\n // },\n },\n s: {\n // Whole note slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadWhole',\n },\n },\n },\n 2: {\n common: {\n stem: true,\n stem_offset: 0,\n flag: false,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Half note\n code_head: 'noteheadHalf',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadHalf', scale);\n // },\n },\n h: {\n // Half note harmonic\n code_head: 'noteheadDiamondHalf',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondHalf', scale);\n // },\n },\n m: {\n // Half note muted\n code_head: 'noteheadXHalf',\n stem_offset: -3,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXHalf', scale);\n // },\n },\n r: {\n // Half rest\n code_head: 'restHalf',\n stem: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('restHalf', scale);\n // },\n },\n s: {\n // Half note slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadHalf',\n },\n },\n },\n 4: {\n common: {\n stem: true,\n stem_offset: 0,\n flag: false,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Quarter note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Quarter harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Quarter muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Quarter rest\n code_head: 'restQuarter',\n stem: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n line_above: 1.5,\n line_below: 1.5,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('restQuarter', scale);\n // },\n },\n s: {\n // Quarter slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 8: {\n common: {\n stem: true,\n stem_offset: 0,\n flag: true,\n beam_count: 1,\n stem_beam_extension: 0,\n code_flag_upstem: 'flag8thUp',\n code_flag_downstem: 'flag8thDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Eighth note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Eighth note harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Eighth note muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Eighth rest\n code_head: 'rest8th',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n line_above: 1.0,\n line_below: 1.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest8th', scale);\n // },\n },\n s: {\n // Eighth slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 16: {\n common: {\n beam_count: 2,\n stem_beam_extension: 0,\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'flag16thUp',\n code_flag_downstem: 'flag16thDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Sixteenth note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Sixteenth note harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Sixteenth note muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Sixteenth rest\n code_head: 'rest16th',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n line_above: 1.0,\n line_below: 2.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest16th', scale);\n // },\n },\n s: {\n // Sixteenth slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 32: {\n common: {\n beam_count: 3,\n stem_beam_extension: 7.5,\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'flag32ndUp',\n code_flag_downstem: 'flag32ndDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Thirty-second note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Thirty-second harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Thirty-second muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Thirty-second rest\n code_head: 'rest32nd',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -1.5,\n line_above: 2.0,\n line_below: 2.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest32nd', scale);\n // },\n },\n s: {\n // Thirty-second slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 64: {\n common: {\n beam_count: 4,\n stem_beam_extension: 15,\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'flag64thUp',\n code_flag_downstem: 'flag64thDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Sixty-fourth note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Sixty-fourth harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Sixty-fourth muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Sixty-fourth rest\n code_head: 'rest64th',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -1.5,\n line_above: 2.0,\n line_below: 3.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest64th', scale);\n // },\n },\n s: {\n // Sixty-fourth slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 128: {\n common: {\n beam_count: 5,\n stem_beam_extension: 22.5,\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'flag128thUp',\n code_flag_downstem: 'flag128thDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Hundred-twenty-eight note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Hundred-twenty-eight harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Hundred-twenty-eight muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Hundred-twenty-eight rest\n code_head: 'rest128th',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -2.5,\n line_above: 3.0,\n line_below: 3.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest128th', scale);\n // },\n },\n s: {\n // Hundred-twenty-eight slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// @author Mohit Cheppudira\n// @author Greg Ristow (modifications)\nimport { Fraction } from './fraction';\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Music } from './music';\nimport { Tables } from './tables';\nimport { Category, isAccidental, isGraceNote, isGraceNoteGroup, isStaveNote } from './typeguard';\nimport { defined, log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Accidental.DEBUG)\n log('Vex.Flow.Accidental', args);\n}\n/**\n * An `Accidental` inherits from `Modifier`, and is formatted within a\n * `ModifierContext`. Accidentals are modifiers that can be attached to\n * notes. Support is included for both western and microtonal accidentals.\n *\n * See `tests/accidental_tests.ts` for usage examples.\n */\nexport class Accidental extends Modifier {\n /**\n * Create accidental.\n * @param type value from `Vex.Flow.accidentalCodes.accidentals` table in `tables.ts`.\n * For example: `#`, `##`, `b`, `n`, etc.\n */\n constructor(type) {\n super();\n L('New accidental: ', type);\n this.type = type;\n this.position = Modifier.Position.LEFT;\n this.render_options = {\n // Font size for glyphs\n font_scale: 38,\n // Padding between accidental and parentheses on each side\n parenLeftPadding: 2,\n parenRightPadding: 2,\n };\n this.accidental = Tables.accidentalCodes(this.type);\n defined(this.accidental, 'ArgumentError', `Unknown accidental type: ${type}`);\n // Cautionary accidentals have parentheses around them\n this.cautionary = false;\n this.reset();\n }\n /** Accidentals category string. */\n static get CATEGORY() {\n return Category.Accidental;\n }\n /** Arrange accidentals inside a ModifierContext. */\n static format(accidentals, state) {\n // If there are no accidentals, no need to format their positions.\n if (!accidentals || accidentals.length === 0)\n return;\n const musicFont = Tables.currentMusicFont();\n const noteheadAccidentalPadding = musicFont.lookupMetric('accidental.noteheadAccidentalPadding');\n const leftShift = state.left_shift + noteheadAccidentalPadding;\n const accidentalSpacing = musicFont.lookupMetric('accidental.accidentalSpacing');\n const additionalPadding = musicFont.lookupMetric('accidental.leftPadding'); // padding to the left of all accidentals\n const accList = [];\n let prevNote = undefined;\n let shiftL = 0;\n // First determine the accidentals' Y positions from the note.keys\n for (let i = 0; i < accidentals.length; ++i) {\n const acc = accidentals[i];\n const note = acc.getNote();\n const stave = note.getStave();\n const index = acc.checkIndex();\n const props = note.getKeyProps()[index];\n if (note !== prevNote) {\n // Iterate through all notes to get the displaced pixels\n for (let n = 0; n < note.keys.length; ++n) {\n shiftL = Math.max(note.getLeftDisplacedHeadPx(), shiftL);\n }\n prevNote = note;\n }\n if (stave) {\n const lineSpace = stave.getSpacingBetweenLines();\n const y = stave.getYForLine(props.line);\n const accLine = Math.round((y / lineSpace) * 2) / 2;\n accList.push({ y, line: accLine, shift: shiftL, acc, lineSpace });\n }\n else {\n accList.push({ line: props.line, shift: shiftL, acc });\n }\n }\n // Sort accidentals by line number.\n accList.sort((a, b) => b.line - a.line);\n // FIXME: Confusing name. Each object in this array has a property called `line`.\n // So if this is a list of lines, you end up with: `line.line` which is very awkward.\n const lineList = [];\n // amount by which all accidentals must be shifted right or left for\n // stem flipping, notehead shifting concerns.\n let accShift = 0;\n let previousLine = undefined;\n // Create an array of unique line numbers (lineList) from accList\n for (let i = 0; i < accList.length; i++) {\n const acc = accList[i];\n // if this is the first line, or a new line, add a lineList\n if (previousLine === undefined || previousLine !== acc.line) {\n lineList.push({\n line: acc.line,\n flatLine: true,\n dblSharpLine: true,\n numAcc: 0,\n width: 0,\n column: 0,\n });\n }\n // if this accidental is not a flat, the accidental needs 3.0 lines lower\n // clearance instead of 2.5 lines for b or bb.\n // FIXME: Naming could use work. acc.acc is very awkward\n if (acc.acc.type !== 'b' && acc.acc.type !== 'bb') {\n lineList[lineList.length - 1].flatLine = false;\n }\n // if this accidental is not a double sharp, the accidental needs 3.0 lines above\n if (acc.acc.type !== '##') {\n lineList[lineList.length - 1].dblSharpLine = false;\n }\n // Track how many accidentals are on this line:\n lineList[lineList.length - 1].numAcc++;\n // Track the total x_offset needed for this line which will be needed\n // for formatting lines w/ multiple accidentals:\n // width = accidental width + universal spacing between accidentals\n lineList[lineList.length - 1].width += acc.acc.getWidth() + accidentalSpacing;\n // if this accShift is larger, use it to keep first column accidentals in the same line\n accShift = acc.shift > accShift ? acc.shift : accShift;\n previousLine = acc.line;\n }\n // ### Place Accidentals in Columns\n //\n // Default to a classic triangular layout (middle accidental farthest left),\n // but follow exceptions as outlined in G. Read's _Music Notation_ and\n // Elaine Gould's _Behind Bars_.\n //\n // Additionally, this implements different vertical collision rules for\n // flats (only need 2.5 lines clearance below) and double sharps (only\n // need 2.5 lines of clearance above or below).\n //\n // Classic layouts and exception patterns are found in the 'tables.js'\n // in 'Tables.accidentalColumnsTable'\n //\n // Beyond 6 vertical accidentals, default to the parallel ascending lines approach,\n // using as few columns as possible for the verticle structure.\n //\n // TODO (?): Allow column to be specified for an accidental at run-time?\n let totalColumns = 0;\n // establish the boundaries for a group of notes with clashing accidentals:\n for (let i = 0; i < lineList.length; i++) {\n let noFurtherConflicts = false;\n const groupStart = i;\n let groupEnd = i;\n while (groupEnd + 1 < lineList.length && !noFurtherConflicts) {\n // if this note conflicts with the next:\n if (this.checkCollision(lineList[groupEnd], lineList[groupEnd + 1])) {\n // include the next note in the group:\n groupEnd++;\n }\n else {\n noFurtherConflicts = true;\n }\n }\n // Gets an a line from the `lineList`, relative to the current group\n const getGroupLine = (index) => lineList[groupStart + index];\n const getGroupLines = (indexes) => indexes.map(getGroupLine);\n const lineDifference = (indexA, indexB) => {\n const [a, b] = getGroupLines([indexA, indexB]).map((item) => item.line);\n return a - b;\n };\n const notColliding = (...indexPairs) => indexPairs.map(getGroupLines).every(([line1, line2]) => !this.checkCollision(line1, line2));\n // Set columns for the lines in this group:\n const groupLength = groupEnd - groupStart + 1;\n // Set the accidental column for each line of the group\n let endCase = this.checkCollision(lineList[groupStart], lineList[groupEnd]) ? 'a' : 'b';\n switch (groupLength) {\n case 3:\n if (endCase === 'a' && lineDifference(1, 2) === 0.5 && lineDifference(0, 1) !== 0.5) {\n endCase = 'second_on_bottom';\n }\n break;\n case 4:\n if (notColliding([0, 2], [1, 3])) {\n endCase = 'spaced_out_tetrachord';\n }\n break;\n case 5:\n if (endCase === 'b' && notColliding([1, 3])) {\n endCase = 'spaced_out_pentachord';\n if (notColliding([0, 2], [2, 4])) {\n endCase = 'very_spaced_out_pentachord';\n }\n }\n break;\n case 6:\n if (notColliding([0, 3], [1, 4], [2, 5])) {\n endCase = 'spaced_out_hexachord';\n }\n if (notColliding([0, 2], [2, 4], [1, 3], [3, 5])) {\n endCase = 'very_spaced_out_hexachord';\n }\n break;\n default:\n break;\n }\n let groupMember;\n let column;\n // If the group contains seven members or more, use ascending parallel lines\n // of accidentals, using as few columns as possible while avoiding collisions.\n if (groupLength >= 7) {\n // First, determine how many columns to use:\n let patternLength = 2;\n let collisionDetected = true;\n while (collisionDetected === true) {\n collisionDetected = false;\n for (let line = 0; line + patternLength < lineList.length; line++) {\n if (this.checkCollision(lineList[line], lineList[line + patternLength])) {\n collisionDetected = true;\n patternLength++;\n break;\n }\n }\n }\n // Then, assign a column to each line of accidentals\n for (groupMember = i; groupMember <= groupEnd; groupMember++) {\n column = ((groupMember - i) % patternLength) + 1;\n lineList[groupMember].column = column;\n totalColumns = totalColumns > column ? totalColumns : column;\n }\n }\n else {\n // If the group contains fewer than seven members, use the layouts from\n // the Tables.accidentalColumnsTable (See: tables.ts).\n for (groupMember = i; groupMember <= groupEnd; groupMember++) {\n column = Tables.accidentalColumnsTable[groupLength][endCase][groupMember - i];\n lineList[groupMember].column = column;\n totalColumns = totalColumns > column ? totalColumns : column;\n }\n }\n // Increment i to the last note that was set, so that if a lower set of notes\n // does not conflict at all with this group, it can have its own classic shape.\n i = groupEnd;\n }\n // ### Convert Columns to x_offsets\n //\n // This keeps columns aligned, even if they have different accidentals within them\n // which sometimes results in a larger x_offset than is an accidental might need\n // to preserve the symmetry of the accidental shape.\n //\n // Neither A.C. Vinci nor G. Read address this, and it typically only happens in\n // music with complex chord clusters.\n //\n // TODO (?): Optionally allow closer compression of accidentals, instead of forcing\n // parallel columns.\n // track each column's max width, which will be used as initial shift of later columns:\n const columnWidths = [];\n const columnXOffsets = [];\n for (let i = 0; i <= totalColumns; i++) {\n columnWidths[i] = 0;\n columnXOffsets[i] = 0;\n }\n columnWidths[0] = accShift + leftShift;\n columnXOffsets[0] = accShift + leftShift;\n // Fill columnWidths with widest needed x-space;\n // this is what keeps the columns parallel.\n lineList.forEach((line) => {\n if (line.width > columnWidths[line.column])\n columnWidths[line.column] = line.width;\n });\n for (let i = 1; i < columnWidths.length; i++) {\n // this column's offset = this column's width + previous column's offset\n columnXOffsets[i] = columnWidths[i] + columnXOffsets[i - 1];\n }\n const totalShift = columnXOffsets[columnXOffsets.length - 1];\n // Set the xShift for each accidental according to column offsets:\n let accCount = 0;\n lineList.forEach((line) => {\n let lineWidth = 0;\n const lastAccOnLine = accCount + line.numAcc;\n // handle all of the accidentals on a given line:\n for (accCount; accCount < lastAccOnLine; accCount++) {\n const xShift = columnXOffsets[line.column - 1] + lineWidth;\n accList[accCount].acc.setXShift(xShift);\n // keep track of the width of accidentals we've added so far, so that when\n // we loop, we add space for them.\n lineWidth += accList[accCount].acc.getWidth() + accidentalSpacing;\n L('Line, accCount, shift: ', line.line, accCount, xShift);\n }\n });\n // update the overall layout with the full width of the accidental shapes:\n state.left_shift += totalShift + additionalPadding;\n }\n /** Helper function to determine whether two lines of accidentals collide vertically */\n static checkCollision(line1, line2) {\n let clearance = line2.line - line1.line;\n let clearanceRequired = 3;\n // But less clearance is required for certain accidentals: b, bb and ##.\n if (clearance > 0) {\n // then line 2 is on top\n clearanceRequired = line2.flatLine || line2.dblSharpLine ? 2.5 : 3.0;\n if (line1.dblSharpLine)\n clearance -= 0.5;\n }\n else {\n // line 1 is on top\n clearanceRequired = line1.flatLine || line1.dblSharpLine ? 2.5 : 3.0;\n if (line2.dblSharpLine)\n clearance -= 0.5;\n }\n const collision = Math.abs(clearance) < clearanceRequired;\n L('Line_1, Line_2, Collision: ', line1.line, line2.line, collision);\n return collision;\n }\n /**\n * Use this method to automatically apply accidentals to a set of `voices`.\n * The accidentals will be remembered between all the voices provided.\n * Optionally, you can also provide an initial `keySignature`.\n */\n static applyAccidentals(voices, keySignature) {\n const tickPositions = [];\n const tickNoteMap = {};\n // Sort the tickables in each voice by their tick position in the voice.\n voices.forEach((voice) => {\n const tickPosition = new Fraction(0, 1);\n const tickable = voice.getTickables();\n tickable.forEach((t) => {\n if (t.shouldIgnoreTicks())\n return;\n const notesAtPosition = tickNoteMap[tickPosition.value()];\n if (!notesAtPosition) {\n tickPositions.push(tickPosition.value());\n tickNoteMap[tickPosition.value()] = [t];\n }\n else {\n notesAtPosition.push(t);\n }\n tickPosition.add(t.getTicks());\n });\n });\n const music = new Music();\n // Default key signature is C major.\n if (!keySignature)\n keySignature = 'C';\n // Get the scale map, which represents the current state of each pitch.\n const scaleMapKey = music.createScaleMap(keySignature);\n const scaleMap = {};\n tickPositions.forEach((tickPos) => {\n const tickables = tickNoteMap[tickPos];\n // Array to store all pitches that modified accidental states\n // at this tick position\n const modifiedPitches = [];\n const processNote = (t) => {\n // Only StaveNote implements .addModifier(), which is used below.\n if (!isStaveNote(t) || t.isRest() || t.shouldIgnoreTicks()) {\n return;\n }\n // Go through each key and determine if an accidental should be applied.\n const staveNote = t;\n staveNote.keys.forEach((keyString, keyIndex) => {\n const key = music.getNoteParts(keyString.split('/')[0]);\n const octave = keyString.split('/')[1];\n // Force a natural for every key without an accidental\n const accidentalString = key.accidental || 'n';\n const pitch = key.root + accidentalString;\n // Determine if the current pitch has the same accidental\n // as the scale state\n if (!scaleMap[key.root + octave])\n scaleMap[key.root + octave] = scaleMapKey[key.root];\n const sameAccidental = scaleMap[key.root + octave] === pitch;\n // Determine if an identical pitch in the chord already\n // modified the accidental state\n const previouslyModified = modifiedPitches.indexOf(keyString) > -1;\n // Remove accidentals\n staveNote.getModifiers().forEach((modifier, index) => {\n if (isAccidental(modifier) && modifier.type == accidentalString && modifier.getIndex() == keyIndex) {\n staveNote.getModifiers().splice(index, 1);\n }\n });\n // Add the accidental to the StaveNote\n if (!sameAccidental || (sameAccidental && previouslyModified)) {\n // Modify the scale map so that the root pitch has an\n // updated state\n scaleMap[key.root + octave] = pitch;\n // Create the accidental\n const accidental = new Accidental(accidentalString);\n // Attach the accidental to the StaveNote\n staveNote.addModifier(accidental, keyIndex);\n // Add the pitch to list of pitches that modified accidentals\n modifiedPitches.push(keyString);\n }\n });\n // process grace notes\n staveNote.getModifiers().forEach((modifier) => {\n if (isGraceNoteGroup(modifier)) {\n modifier.getGraceNotes().forEach(processNote);\n }\n });\n };\n tickables.forEach(processNote);\n });\n }\n reset() {\n const fontScale = this.render_options.font_scale;\n this.glyph = new Glyph(this.accidental.code, fontScale);\n this.glyph.setOriginX(1.0);\n if (this.cautionary) {\n this.parenLeft = new Glyph(Tables.accidentalCodes('{').code, fontScale);\n this.parenRight = new Glyph(Tables.accidentalCodes('}').code, fontScale);\n this.parenLeft.setOriginX(1.0);\n this.parenRight.setOriginX(1.0);\n }\n }\n /** Get width in pixels. */\n getWidth() {\n if (this.cautionary) {\n const parenLeft = defined(this.parenLeft);\n const parenRight = defined(this.parenRight);\n const parenWidth = parenLeft.getMetrics().width +\n parenRight.getMetrics().width +\n this.render_options.parenLeftPadding +\n this.render_options.parenRightPadding;\n return this.glyph.getMetrics().width + parenWidth;\n }\n else {\n return this.glyph.getMetrics().width;\n }\n }\n /** Attach this accidental to `note`, which must be a `StaveNote`. */\n setNote(note) {\n defined(note, 'ArgumentError', `Bad note value: ${note}`);\n this.note = note;\n // Accidentals attached to grace notes are rendered smaller.\n if (isGraceNote(note)) {\n this.render_options.font_scale = 25;\n this.reset();\n }\n return this;\n }\n /** If called, draws parenthesis around accidental. */\n setAsCautionary() {\n this.cautionary = true;\n this.render_options.font_scale = 28;\n this.reset();\n return this;\n }\n /** Render accidental onto canvas. */\n draw() {\n const { type, position, index, cautionary, x_shift, y_shift, glyph, render_options: { parenLeftPadding, parenRightPadding }, } = this;\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n // Figure out the start `x` and `y` coordinates for note and index.\n const start = note.getModifierStartXY(position, index);\n let accX = start.x + x_shift;\n const accY = start.y + y_shift;\n L('Rendering: ', type, accX, accY);\n if (!cautionary) {\n glyph.render(ctx, accX, accY);\n }\n else {\n const parenLeft = defined(this.parenLeft);\n const parenRight = defined(this.parenRight);\n // Render the accidental in parentheses.\n parenRight.render(ctx, accX, accY);\n accX -= parenRight.getMetrics().width;\n accX -= parenRightPadding;\n accX -= this.accidental.parenRightPaddingAdjustment;\n glyph.render(ctx, accX, accY);\n accX -= glyph.getMetrics().width;\n accX -= parenLeftPadding;\n parenLeft.render(ctx, accX, accY);\n }\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Accidental.DEBUG` to `true`. */\nAccidental.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This file implements the `Stem` object. Generally this object is handled\n// by its parent `StemmableNote`.\nimport { Element } from './element';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Stem.DEBUG)\n log('Vex.Flow.Stem', args);\n}\nexport class Stem extends Element {\n constructor(options) {\n super();\n this.stem_up_y_offset = 0;\n this.stem_down_y_offset = 0;\n this.stem_up_y_base_offset = 0;\n this.stem_down_y_base_offset = 0;\n // Default notehead x bounds\n this.x_begin = (options === null || options === void 0 ? void 0 : options.x_begin) || 0;\n this.x_end = (options === null || options === void 0 ? void 0 : options.x_end) || 0;\n // Y bounds for top/bottom most notehead\n this.y_top = (options === null || options === void 0 ? void 0 : options.y_top) || 0;\n this.y_bottom = (options === null || options === void 0 ? void 0 : options.y_bottom) || 0;\n // Stem top extension\n this.stem_extension = (options === null || options === void 0 ? void 0 : options.stem_extension) || 0;\n // Direction of the stem\n this.stem_direction = (options === null || options === void 0 ? void 0 : options.stem_direction) || 0;\n // Flag to override all draw calls\n this.hide = (options === null || options === void 0 ? void 0 : options.hide) || false;\n this.isStemlet = (options === null || options === void 0 ? void 0 : options.isStemlet) || false;\n this.stemletHeight = (options === null || options === void 0 ? void 0 : options.stemletHeight) || 0;\n // Use to adjust the rendered height without affecting\n // the results of `.getExtents()`\n this.renderHeightAdjustment = 0;\n this.setOptions(options);\n }\n static get CATEGORY() {\n return Category.Stem;\n }\n // Stem directions\n static get UP() {\n return 1;\n }\n static get DOWN() {\n return -1;\n }\n // Theme\n static get WIDTH() {\n return Tables.STEM_WIDTH;\n }\n static get HEIGHT() {\n return Tables.STEM_HEIGHT;\n }\n setOptions(options) {\n // Changing where the stem meets the head\n this.stem_up_y_offset = (options === null || options === void 0 ? void 0 : options.stem_up_y_offset) || 0;\n this.stem_down_y_offset = (options === null || options === void 0 ? void 0 : options.stem_down_y_offset) || 0;\n this.stem_up_y_base_offset = (options === null || options === void 0 ? void 0 : options.stem_up_y_base_offset) || 0;\n this.stem_down_y_base_offset = (options === null || options === void 0 ? void 0 : options.stem_down_y_base_offset) || 0;\n }\n // Set the x bounds for the default notehead\n setNoteHeadXBounds(x_begin, x_end) {\n this.x_begin = x_begin;\n this.x_end = x_end;\n return this;\n }\n // Set the direction of the stem in relation to the noteheads\n setDirection(direction) {\n this.stem_direction = direction;\n }\n // Set the extension for the stem, generally for flags or beams\n setExtension(ext) {\n this.stem_extension = ext;\n }\n getExtension() {\n return this.stem_extension;\n }\n // The the y bounds for the top and bottom noteheads\n setYBounds(y_top, y_bottom) {\n this.y_top = y_top;\n this.y_bottom = y_bottom;\n }\n // Gets the entire height for the stem\n getHeight() {\n const y_offset = this.stem_direction === Stem.UP ? this.stem_up_y_offset : this.stem_down_y_offset;\n const unsigned_height = this.y_bottom - this.y_top + (Stem.HEIGHT - y_offset + this.stem_extension); // parentheses just for grouping.\n return unsigned_height * this.stem_direction;\n }\n getBoundingBox() {\n throw new RuntimeError('NotImplemented', 'getBoundingBox() not implemented.');\n }\n // Get the y coordinates for the very base of the stem to the top of\n // the extension\n getExtents() {\n const isStemUp = this.stem_direction === Stem.UP;\n const ys = [this.y_top, this.y_bottom];\n const stemHeight = Stem.HEIGHT + this.stem_extension;\n const innerMostNoteheadY = (isStemUp ? Math.min : Math.max)(...ys);\n const outerMostNoteheadY = (isStemUp ? Math.max : Math.min)(...ys);\n const stemTipY = innerMostNoteheadY + stemHeight * -this.stem_direction;\n return { topY: stemTipY, baseY: outerMostNoteheadY };\n }\n setVisibility(isVisible) {\n this.hide = !isVisible;\n return this;\n }\n setStemlet(isStemlet, stemletHeight) {\n this.isStemlet = isStemlet;\n this.stemletHeight = stemletHeight;\n return this;\n }\n adjustHeightForFlag() {\n this.renderHeightAdjustment = Tables.currentMusicFont().lookupMetric('stem.heightAdjustmentForFlag', -3);\n }\n adjustHeightForBeam() {\n this.renderHeightAdjustment = -Stem.WIDTH / 2;\n }\n // Render the stem onto the canvas\n draw() {\n this.setRendered();\n if (this.hide)\n return;\n const ctx = this.checkContext();\n let stem_x;\n let stem_y;\n const stem_direction = this.stem_direction;\n let y_base_offset = 0;\n if (stem_direction === Stem.DOWN) {\n // Down stems are rendered to the left of the head.\n stem_x = this.x_begin;\n stem_y = this.y_top + this.stem_down_y_offset;\n y_base_offset = this.stem_down_y_base_offset;\n }\n else {\n // Up stems are rendered to the right of the head.\n stem_x = this.x_end;\n stem_y = this.y_bottom - this.stem_up_y_offset;\n y_base_offset = this.stem_up_y_base_offset;\n }\n const stemHeight = this.getHeight();\n L('Rendering stem - ', 'Top Y: ', this.y_top, 'Bottom Y: ', this.y_bottom);\n // The offset from the stem's base which is required fo satisfy the stemlet height\n const stemletYOffset = this.isStemlet ? stemHeight - this.stemletHeight * this.stem_direction : 0;\n // Draw the stem\n ctx.save();\n this.applyStyle(ctx);\n ctx.beginPath();\n ctx.setLineWidth(Stem.WIDTH);\n ctx.moveTo(stem_x, stem_y - stemletYOffset + y_base_offset);\n ctx.lineTo(stem_x, stem_y - stemHeight - this.renderHeightAdjustment * stem_direction);\n ctx.stroke();\n this.restoreStyle(ctx);\n ctx.restore();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Stem.DEBUG` to `true`. */\nStem.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font, FontStyle, FontWeight } from './font';\nimport { log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (TextFormatter.DEBUG)\n log('Vex.Flow.TextFormatter', args);\n}\n/**\n * Text widths are stored in a cache, so we don't have to recompute widths\n * for the same font + string combination.\n *\n * The cache is first keyed by the font information. The key is of the form:\n * `${family}-${size}-${weight}-${style}`\n * The second level key is the specific text to be measured.\n *\n * The stored value is the measured width in `em` units.\n * textWidth == textWidthCache[cacheKey][textToMeasure]\n */\nconst textWidthCache = {};\n/**\n * Applications may register additional fonts via `TextFormatter.registerInfo(info)`.\n * The metrics for those fonts will be made available to the application.\n */\nconst registry = {};\nexport class TextFormatter {\n /**\n * Use `TextFormatter.create(...)` to build an instance from information previously\n * registered via `TextFormatter.registerInfo(info)`.\n */\n constructor(formatterInfo) {\n /** Font family. */\n this.family = '';\n /** Specified in `pt` units. */\n this.size = 14;\n /** Font metrics are extracted at 1000 upem (units per em). */\n this.resolution = 1000;\n /**\n * For text formatting, we do not require glyph outlines, but instead rely on glyph\n * bounding box metrics such as:\n * ```\n * {\n * x_min: 48,\n * x_max: 235,\n * y_min: -17,\n * y_max: 734,\n * ha: 751,\n * leftSideBearing: 48,\n * advanceWidth: 286,\n * }\n * ```\n */\n this.glyphs = {};\n this.serifs = false;\n this.monospaced = false;\n this.italic = false;\n this.bold = false;\n this.superscriptOffset = 0;\n this.subscriptOffset = 0;\n this.maxSizeGlyph = 'H';\n // This is an internal key used to index the `textWidthCache`.\n this.cacheKey = '';\n this.updateParams(formatterInfo);\n }\n /**\n * Return all registered font families.\n */\n static getFontFamilies() {\n const registeredFonts = [];\n for (const fontFamily in registry) {\n const formatterInfo = registry[fontFamily];\n registeredFonts.push(Object.assign({}, formatterInfo));\n }\n return registeredFonts;\n }\n /**\n * Call `TextFormatter.registerInfo(info)` to register font information before using this method.\n *\n * This method creates a formatter for the font that most closely matches the requested font.\n * We compare font family, bold, and italic attributes.\n * This method will return a fallback formatter if there are no matches.\n */\n static create(requestedFont = {}) {\n L('create: ', requestedFont);\n if (!requestedFont.family) {\n requestedFont.family = Font.SANS_SERIF;\n }\n // TODO: One potential (small) optimization is to cache the TextFormatter object\n // returned for each font info. We would probably want to clear the cache if\n // the registry is ever updated.\n const candidates = [];\n // The incoming font family is a string of comma-separated font family names.\n // (e.g., `PetalumaScript, Arial, sans-serif`).\n const requestedFamilies = requestedFont.family.split(/\\s*,\\s*/);\n for (const requestedFamily of requestedFamilies) {\n for (const fontFamily in registry) {\n // Support cases where the registry contains 'Roboto Slab Medium',\n // but the requestedFont.family is 'Roboto Slab'.\n if (fontFamily.startsWith(requestedFamily)) {\n candidates.push(registry[fontFamily]);\n }\n }\n if (candidates.length > 0) {\n break;\n }\n }\n let formatter;\n if (candidates.length === 0) {\n // No match, so return a fallback text formatter.\n formatter = new TextFormatter(Object.values(registry)[0]);\n }\n else if (candidates.length === 1) {\n formatter = new TextFormatter(candidates[0]);\n }\n else {\n const bold = Font.isBold(requestedFont.weight);\n const italic = Font.isItalic(requestedFont.style);\n const perfectMatch = candidates.find((f) => f.bold === bold && f.italic === italic);\n if (perfectMatch) {\n formatter = new TextFormatter(perfectMatch);\n }\n else {\n const partialMatch = candidates.find((f) => f.italic === italic || f.bold === bold);\n if (partialMatch) {\n formatter = new TextFormatter(partialMatch);\n }\n else {\n formatter = new TextFormatter(candidates[0]);\n }\n }\n }\n const fontSize = requestedFont.size;\n if (typeof fontSize !== 'undefined') {\n const fontSizeInPt = Font.convertSizeToPointValue(fontSize);\n formatter.setFontSize(fontSizeInPt);\n }\n return formatter;\n }\n /**\n * @param fontFamily used as a key to the font registry.\n * @returns the same info object that was passed in via `TextFormatter.registerInfo(info)`\n */\n static getInfo(fontFamily) {\n return registry[fontFamily];\n }\n /**\n * Apps may register their own fonts and metrics, and those metrics\n * will be available to the app for formatting.\n *\n * Metrics can be generated from a font file using fontgen_text.js in the tools/fonts directory.\n * @param info\n * @param overwrite\n */\n static registerInfo(info, overwrite = false) {\n L('registerInfo: ', info, overwrite);\n const fontFamily = info.family;\n const currFontInfo = registry[fontFamily];\n if (currFontInfo === undefined || overwrite) {\n registry[fontFamily] = info;\n }\n }\n updateParams(params) {\n if (params.family)\n this.family = params.family;\n if (params.resolution)\n this.resolution = params.resolution;\n if (params.glyphs)\n this.glyphs = params.glyphs;\n if (params.serifs)\n this.serifs = params.serifs;\n if (params.monospaced)\n this.monospaced = params.monospaced;\n if (params.italic)\n this.italic = params.italic;\n if (params.bold)\n this.bold = params.bold;\n if (params.maxSizeGlyph)\n this.maxSizeGlyph = params.maxSizeGlyph;\n if (params.superscriptOffset)\n this.superscriptOffset = params.superscriptOffset;\n if (params.subscriptOffset)\n this.subscriptOffset = params.subscriptOffset;\n this.updateCacheKey();\n }\n /** Create a hash with the current font data, so we can cache computed widths. */\n updateCacheKey() {\n const family = this.family.replace(/\\s+/g, '_');\n const size = this.size;\n const weight = this.bold ? FontWeight.BOLD : FontWeight.NORMAL;\n const style = this.italic ? FontStyle.ITALIC : FontStyle.NORMAL;\n // Use the same key format as SVGContext.\n this.cacheKey = `${family}%${size}%${weight}%${style}`;\n }\n /**\n * The glyphs table is indexed by the character (e.g., 'C', '@').\n * See: robotoslab_glyphs.ts & petalumascript_glyphs.ts.\n */\n getGlyphMetrics(character) {\n if (this.glyphs[character]) {\n return this.glyphs[character];\n }\n else {\n return this.glyphs[this.maxSizeGlyph];\n }\n }\n get maxHeight() {\n const metrics = this.getGlyphMetrics(this.maxSizeGlyph);\n return (metrics.ha / this.resolution) * this.fontSizeInPixels;\n }\n /**\n * Retrieve the character's advanceWidth as a fraction of an `em` unit.\n * For the space character ' ' as defined in the:\n * petalumascript_glyphs.ts: 250 advanceWidth in the 1000 unitsPerEm font returns 0.25.\n * robotoslab_glyphs.ts: 509 advanceWidth in the 2048 unitsPerEm font returns 0.2485.\n */\n getWidthForCharacterInEm(c) {\n var _a;\n const metrics = this.getGlyphMetrics(c);\n if (!metrics) {\n // An arbitrary number, close to the `em` width of the '#' and '5' characters in PetalumaScript.\n return 0.65;\n }\n else {\n const advanceWidth = (_a = metrics.advanceWidth) !== null && _a !== void 0 ? _a : 0;\n return advanceWidth / this.resolution;\n }\n }\n /**\n * Retrieve the total width of `text` in `em` units.\n */\n getWidthForTextInEm(text) {\n const key = this.cacheKey;\n // Get the cache for this specific font family, size, weight, style combination.\n // The cache contains previously computed widths for different `text` strings.\n let cachedWidths = textWidthCache[key];\n if (cachedWidths === undefined) {\n cachedWidths = {};\n textWidthCache[key] = cachedWidths;\n }\n let width = cachedWidths[text];\n if (width === undefined) {\n width = 0;\n for (let i = 0; i < text.length; ++i) {\n width += this.getWidthForCharacterInEm(text[i]);\n }\n cachedWidths[text] = width;\n }\n return width;\n }\n /** The width of the text (in `em`) is scaled by the font size (in `px`). */\n getWidthForTextInPx(text) {\n return this.getWidthForTextInEm(text) * this.fontSizeInPixels;\n }\n /**\n * @param size in pt.\n */\n setFontSize(size) {\n this.size = size;\n // The width cache key depends on the current font size.\n this.updateCacheKey();\n return this;\n }\n /** `this.size` is specified in points. Convert to pixels. */\n get fontSizeInPixels() {\n return this.size * Font.scaleToPxFrom.pt;\n }\n getResolution() {\n return this.resolution;\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.TextFormatter.DEBUG` to `true`. */\nTextFormatter.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { TextFormatter } from './textformatter';\nimport { Category, isStemmableNote, isTabNote } from './typeguard';\nimport { log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Annotation.DEBUG)\n log('Vex.Flow.Annotation', args);\n}\nexport var AnnotationHorizontalJustify;\n(function (AnnotationHorizontalJustify) {\n AnnotationHorizontalJustify[AnnotationHorizontalJustify[\"LEFT\"] = 1] = \"LEFT\";\n AnnotationHorizontalJustify[AnnotationHorizontalJustify[\"CENTER\"] = 2] = \"CENTER\";\n AnnotationHorizontalJustify[AnnotationHorizontalJustify[\"RIGHT\"] = 3] = \"RIGHT\";\n AnnotationHorizontalJustify[AnnotationHorizontalJustify[\"CENTER_STEM\"] = 4] = \"CENTER_STEM\";\n})(AnnotationHorizontalJustify || (AnnotationHorizontalJustify = {}));\nexport var AnnotationVerticalJustify;\n(function (AnnotationVerticalJustify) {\n AnnotationVerticalJustify[AnnotationVerticalJustify[\"TOP\"] = 1] = \"TOP\";\n AnnotationVerticalJustify[AnnotationVerticalJustify[\"CENTER\"] = 2] = \"CENTER\";\n AnnotationVerticalJustify[AnnotationVerticalJustify[\"BOTTOM\"] = 3] = \"BOTTOM\";\n AnnotationVerticalJustify[AnnotationVerticalJustify[\"CENTER_STEM\"] = 4] = \"CENTER_STEM\";\n})(AnnotationVerticalJustify || (AnnotationVerticalJustify = {}));\n/**\n * Annotations are modifiers that can be attached to\n * notes.\n *\n * See `tests/annotation_tests.ts` for usage examples.\n */\nexport class Annotation extends Modifier {\n /**\n * Annotations inherit from `Modifier` and is positioned correctly when\n * in a `ModifierContext`.\n * Create a new `Annotation` with the string `text`.\n */\n constructor(text) {\n super();\n this.text = text;\n this.horizontalJustification = AnnotationHorizontalJustify.CENTER;\n // warning: the default in the constructor is TOP, but in the factory the default is BOTTOM.\n // this is to support legacy application that may expect this.\n this.verticalJustification = AnnotationVerticalJustify.TOP;\n this.resetFont();\n // The default width is calculated from the text.\n this.setWidth(Tables.textWidth(text));\n }\n /** Annotations category string. */\n static get CATEGORY() {\n return Category.Annotation;\n }\n /** Arrange annotations within a `ModifierContext` */\n static format(annotations, state) {\n if (!annotations || annotations.length === 0)\n return false;\n let width = 0;\n for (let i = 0; i < annotations.length; ++i) {\n const annotation = annotations[i];\n const textFormatter = TextFormatter.create(annotation.textFont);\n // Text height is expressed in fractional stave spaces.\n const textLines = (5 + textFormatter.maxHeight) / Tables.STAVE_LINE_DISTANCE;\n let verticalSpaceNeeded = textLines;\n const note = annotation.checkAttachedNote();\n const stave = note.getStave();\n const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP;\n let stemHeight = 0;\n let lines = 5;\n if (isTabNote(note)) {\n if (note.render_options.draw_stem) {\n const stem = note.getStem();\n if (stem) {\n stemHeight = Math.abs(stem.getHeight()) / Tables.STAVE_LINE_DISTANCE;\n }\n }\n else {\n stemHeight = 0;\n }\n }\n else if (isStemmableNote(note)) {\n const stem = note.getStem();\n if (stem && note.getNoteType() === 'n') {\n stemHeight = Math.abs(stem.getHeight()) / Tables.STAVE_LINE_DISTANCE;\n }\n }\n if (stave) {\n lines = stave.getNumLines();\n }\n // Get the text width from the font metrics.\n const textWidth = textFormatter.getWidthForTextInPx(annotation.text);\n width = Math.max(width, textWidth);\n if (annotation.verticalJustification === this.VerticalJustify.TOP) {\n let noteLine = note.getLineNumber(true);\n if (isTabNote(note)) {\n noteLine = lines - (note.leastString() - 0.5);\n }\n if (stemDirection === Stem.UP) {\n noteLine += stemHeight;\n }\n const curTop = noteLine + state.top_text_line + 0.5;\n if (curTop < lines) {\n annotation.setTextLine(lines - noteLine);\n verticalSpaceNeeded += lines - noteLine;\n state.top_text_line = verticalSpaceNeeded;\n }\n else {\n annotation.setTextLine(state.top_text_line);\n state.top_text_line += verticalSpaceNeeded;\n }\n }\n else if (annotation.verticalJustification === this.VerticalJustify.BOTTOM) {\n let noteLine = lines - note.getLineNumber();\n if (isTabNote(note)) {\n noteLine = note.greatestString() - 1;\n }\n if (stemDirection === Stem.DOWN) {\n noteLine += stemHeight;\n }\n const curBottom = noteLine + state.text_line + 1;\n if (curBottom < lines) {\n annotation.setTextLine(lines - curBottom);\n verticalSpaceNeeded += lines - curBottom;\n state.text_line = verticalSpaceNeeded;\n }\n else {\n annotation.setTextLine(state.text_line);\n state.text_line += verticalSpaceNeeded;\n }\n }\n else {\n annotation.setTextLine(state.text_line);\n }\n }\n state.left_shift += width / 2;\n state.right_shift += width / 2;\n return true;\n }\n /**\n * Set vertical position of text (above or below stave).\n * @param just value in `AnnotationVerticalJustify`.\n */\n setVerticalJustification(just) {\n this.verticalJustification = typeof just === 'string' ? Annotation.VerticalJustifyString[just] : just;\n return this;\n }\n /**\n * Get horizontal justification.\n */\n getJustification() {\n return this.horizontalJustification;\n }\n /**\n * Set horizontal justification.\n * @param justification value in `Annotation.Justify`.\n */\n setJustification(just) {\n this.horizontalJustification = typeof just === 'string' ? Annotation.HorizontalJustifyString[just] : just;\n return this;\n }\n /** Render text beside the note. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP;\n const textFormatter = TextFormatter.create(this.textFont);\n const start = note.getModifierStartXY(ModifierPosition.ABOVE, this.index);\n this.setRendered();\n // We're changing context parameters. Save current state.\n ctx.save();\n const classString = Object.keys(this.getAttribute('classes')).join(' ');\n ctx.openGroup(classString, this.getAttribute('id'));\n ctx.setFont(this.textFont);\n const text_width = ctx.measureText(this.text).width;\n const text_height = textFormatter.maxHeight + 2;\n let x;\n let y;\n if (this.horizontalJustification === AnnotationHorizontalJustify.LEFT) {\n x = start.x;\n }\n else if (this.horizontalJustification === AnnotationHorizontalJustify.RIGHT) {\n x = start.x - text_width;\n }\n else if (this.horizontalJustification === AnnotationHorizontalJustify.CENTER) {\n x = start.x - text_width / 2;\n } /* CENTER_STEM */\n else {\n x = note.getStemX() - text_width / 2;\n }\n let stem_ext = {};\n let spacing = 0;\n const has_stem = note.hasStem();\n const stave = note.checkStave();\n // The position of the text varies based on whether or not the note\n // has a stem.\n if (has_stem) {\n stem_ext = note.checkStem().getExtents();\n spacing = stave.getSpacingBetweenLines();\n }\n if (this.verticalJustification === AnnotationVerticalJustify.BOTTOM) {\n // Use the largest (lowest) Y value\n const ys = note.getYs();\n y = ys.reduce((a, b) => (a > b ? a : b));\n y += (this.text_line + 1) * Tables.STAVE_LINE_DISTANCE + text_height;\n if (has_stem && stemDirection === Stem.DOWN) {\n y = Math.max(y, stem_ext.topY + text_height + spacing * this.text_line);\n }\n }\n else if (this.verticalJustification === AnnotationVerticalJustify.CENTER) {\n const yt = note.getYForTopText(this.text_line) - 1;\n const yb = stave.getYForBottomText(this.text_line);\n y = yt + (yb - yt) / 2 + text_height / 2;\n }\n else if (this.verticalJustification === AnnotationVerticalJustify.TOP) {\n y = note.getYs()[0] - (this.text_line + 1) * Tables.STAVE_LINE_DISTANCE;\n if (has_stem && stemDirection === Stem.UP) {\n // If the stem is above the stave already, go with default line width vs. actual\n // since the lines between don't really matter.\n spacing = stem_ext.topY < stave.getTopLineTopY() ? Tables.STAVE_LINE_DISTANCE : spacing;\n y = Math.min(y, stem_ext.topY - spacing * (this.text_line + 1));\n }\n } /* CENTER_STEM */\n else {\n const extents = note.getStemExtents();\n y = extents.topY + (extents.baseY - extents.topY) / 2 + text_height / 2;\n }\n L('Rendering annotation: ', this.text, x, y);\n ctx.fillText(this.text, x, y);\n ctx.closeGroup();\n ctx.restore();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Annotation.DEBUG` to `true`. */\nAnnotation.DEBUG = false;\nAnnotation.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n/** Text annotations can be positioned and justified relative to the note. */\nAnnotation.HorizontalJustify = AnnotationHorizontalJustify;\nAnnotation.HorizontalJustifyString = {\n left: AnnotationHorizontalJustify.LEFT,\n right: AnnotationHorizontalJustify.RIGHT,\n center: AnnotationHorizontalJustify.CENTER,\n centerStem: AnnotationHorizontalJustify.CENTER_STEM,\n};\nAnnotation.VerticalJustify = AnnotationVerticalJustify;\nAnnotation.VerticalJustifyString = {\n above: AnnotationVerticalJustify.TOP,\n top: AnnotationVerticalJustify.TOP,\n below: AnnotationVerticalJustify.BOTTOM,\n bottom: AnnotationVerticalJustify.BOTTOM,\n center: AnnotationVerticalJustify.CENTER,\n centerStem: AnnotationVerticalJustify.CENTER_STEM,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Larry Kuhns.\n// MIT License\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category, isGraceNote, isStaveNote, isStemmableNote, isTabNote } from './typeguard';\nimport { defined, log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Articulation.DEBUG)\n log('Vex.Flow.Articulation', args);\n}\nconst { ABOVE, BELOW } = Modifier.Position;\nfunction roundToNearestHalf(mathFn, value) {\n return mathFn(value / 0.5) * 0.5;\n}\n// This includes both staff and ledger lines\nfunction isWithinLines(line, position) {\n return position === ABOVE ? line <= 5 : line >= 1;\n}\nfunction getRoundingFunction(line, position) {\n if (isWithinLines(line, position)) {\n if (position === ABOVE) {\n return Math.ceil;\n }\n else {\n return Math.floor;\n }\n }\n else {\n return Math.round;\n }\n}\nfunction snapLineToStaff(canSitBetweenLines, line, position, offsetDirection) {\n // Initially, snap to nearest staff line or space\n const snappedLine = roundToNearestHalf(getRoundingFunction(line, position), line);\n const canSnapToStaffSpace = canSitBetweenLines && isWithinLines(snappedLine, position);\n const onStaffLine = snappedLine % 1 === 0;\n if (canSnapToStaffSpace && onStaffLine) {\n const HALF_STAFF_SPACE = 0.5;\n return snappedLine + HALF_STAFF_SPACE * -offsetDirection;\n }\n else {\n return snappedLine;\n }\n}\n// Helper function for checking if a Note object is either a StaveNote or a GraceNote.\nconst isStaveOrGraceNote = (note) => isStaveNote(note) || isGraceNote(note);\nfunction getTopY(note, textLine) {\n const stemDirection = note.getStemDirection();\n const { topY: stemTipY, baseY: stemBaseY } = note.getStemExtents();\n if (isStaveOrGraceNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return stemTipY;\n }\n else {\n return stemBaseY;\n }\n }\n else {\n return Math.min(...note.getYs());\n }\n }\n else if (isTabNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return stemTipY;\n }\n else {\n return note.checkStave().getYForTopText(textLine);\n }\n }\n else {\n return note.checkStave().getYForTopText(textLine);\n }\n }\n else {\n throw new RuntimeError('UnknownCategory', 'Only can get the top and bottom ys of stavenotes and tabnotes');\n }\n}\nfunction getBottomY(note, textLine) {\n const stemDirection = note.getStemDirection();\n const { topY: stemTipY, baseY: stemBaseY } = note.getStemExtents();\n if (isStaveOrGraceNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return stemBaseY;\n }\n else {\n return stemTipY;\n }\n }\n else {\n return Math.max(...note.getYs());\n }\n }\n else if (isTabNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return note.checkStave().getYForBottomText(textLine);\n }\n else {\n return stemTipY;\n }\n }\n else {\n return note.checkStave().getYForBottomText(textLine);\n }\n }\n else {\n throw new RuntimeError('UnknownCategory', 'Only can get the top and bottom ys of stavenotes and tabnotes');\n }\n}\n/**\n * Get the initial offset of the articulation from the y value of the starting position.\n * This is required because the top/bottom text positions already have spacing applied to\n * provide a \"visually pleasant\" default position. However the y values provided from\n * the stavenote's top/bottom do *not* have any pre-applied spacing. This function\n * normalizes this asymmetry.\n * @param note\n * @param position\n * @returns\n */\nfunction getInitialOffset(note, position) {\n const isOnStemTip = (position === ABOVE && note.getStemDirection() === Stem.UP) ||\n (position === BELOW && note.getStemDirection() === Stem.DOWN);\n if (isStaveOrGraceNote(note)) {\n if (note.hasStem() && isOnStemTip) {\n return 0.5;\n }\n else {\n // this amount is larger than the stem-tip offset because we start from\n // the center of the notehead\n return 1;\n }\n }\n else {\n if (note.hasStem() && isOnStemTip) {\n return 1;\n }\n else {\n return 0;\n }\n }\n}\n/**\n * Articulations and Accents are modifiers that can be\n * attached to notes. The complete list of articulations is available in\n * `tables.ts` under `Vex.Flow.articulationCodes`.\n *\n * See `tests/articulation_tests.ts` for usage examples.\n */\nexport class Articulation extends Modifier {\n /**\n * Create a new articulation.\n * @param type entry in `Vex.Flow.articulationCodes` in `tables.ts`\n */\n constructor(type) {\n super();\n this.type = type;\n this.position = BELOW;\n this.render_options = {\n font_scale: 38,\n };\n this.reset();\n }\n /** Articulations category string. */\n static get CATEGORY() {\n return Category.Articulation;\n }\n /**\n * FIXME:\n * Most of the complex formatting logic (ie: snapping to space) is\n * actually done in .render(). But that logic belongs in this method.\n *\n * Unfortunately, this isn't possible because, by this point, stem lengths\n * have not yet been finalized. Finalized stem lengths are required to determine the\n * initial position of any stem-side articulation.\n *\n * This indicates that all objects should have their stave set before being\n * formatted. It can't be an optional if you want accurate vertical positioning.\n * Consistently positioned articulations that play nice with other modifiers\n * won't be possible until we stop relying on render-time formatting.\n *\n * Ideally, when this function has completed, the vertical articulation positions\n * should be ready to render without further adjustment. But the current state\n * is far from this ideal.\n */\n static format(articulations, state) {\n if (!articulations || articulations.length === 0)\n return false;\n const margin = 0.5;\n const getIncrement = (articulation, line, position) => roundToNearestHalf(getRoundingFunction(line, position), defined(articulation.glyph.getMetrics().height) / 10 + margin);\n articulations.forEach((articulation) => {\n const note = articulation.checkAttachedNote();\n let lines = 5;\n const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP;\n let stemHeight = 0;\n // Decide if we need to consider beam direction in placement.\n if (isStemmableNote(note)) {\n const stem = note.getStem();\n if (stem) {\n stemHeight = Math.abs(stem.getHeight()) / Tables.STAVE_LINE_DISTANCE;\n }\n }\n const stave = note.getStave();\n if (stave) {\n lines = stave.getNumLines();\n }\n if (articulation.getPosition() === ABOVE) {\n let noteLine = note.getLineNumber(true);\n if (stemDirection === Stem.UP) {\n noteLine += stemHeight;\n }\n let increment = getIncrement(articulation, state.top_text_line, ABOVE);\n const curTop = noteLine + state.top_text_line + 0.5;\n // If articulation must be above stave, add lines between note and stave top\n if (!articulation.articulation.between_lines && curTop < lines) {\n increment += lines - curTop;\n }\n articulation.setTextLine(state.top_text_line);\n state.top_text_line += increment;\n }\n else if (articulation.getPosition() === BELOW) {\n let noteLine = Math.max(lines - note.getLineNumber(), 0);\n if (stemDirection === Stem.DOWN) {\n noteLine += stemHeight;\n }\n let increment = getIncrement(articulation, state.text_line, BELOW);\n const curBottom = noteLine + state.text_line + 0.5;\n // if articulation must be below stave, add lines from note to stave bottom\n if (!articulation.articulation.between_lines && curBottom < lines) {\n increment += lines - curBottom;\n }\n articulation.setTextLine(state.text_line);\n state.text_line += increment;\n }\n });\n const width = articulations\n .map((articulation) => articulation.getWidth())\n .reduce((maxWidth, articWidth) => Math.max(articWidth, maxWidth));\n state.left_shift += width / 2;\n state.right_shift += width / 2;\n return true;\n }\n static easyScoreHook({ articulations }, note, builder) {\n if (!articulations)\n return;\n const articNameToCode = {\n staccato: 'a.',\n tenuto: 'a-',\n accent: 'a>',\n };\n articulations\n .split(',')\n .map((articString) => articString.trim().split('.'))\n .map(([name, position]) => {\n const artic = { type: articNameToCode[name] };\n if (position)\n artic.position = Modifier.PositionString[position];\n return builder.getFactory().Articulation(artic);\n })\n .map((artic) => note.addModifier(artic, 0));\n }\n reset() {\n this.articulation = Tables.articulationCodes(this.type);\n const articulation = defined(this.articulation, 'ArgumentError', `Articulation not found: ${this.type}`);\n const code = (this.position === ABOVE ? articulation.aboveCode : articulation.belowCode) || articulation.code;\n this.glyph = new Glyph(code !== null && code !== void 0 ? code : '', this.render_options.font_scale);\n this.setWidth(defined(this.glyph.getMetrics().width));\n }\n /** Render articulation in position next to note. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const index = this.checkIndex();\n const { position, glyph, text_line: textLine } = this;\n const canSitBetweenLines = this.articulation.between_lines;\n const stave = note.checkStave();\n const staffSpace = stave.getSpacingBetweenLines();\n const isTab = isTabNote(note);\n // Articulations are centered over/under the note head.\n const { x } = note.getModifierStartXY(position, index);\n const shouldSitOutsideStaff = !canSitBetweenLines || isTab;\n const initialOffset = getInitialOffset(note, position);\n const padding = Tables.currentMusicFont().lookupMetric(`articulation.${glyph.getCode()}.padding`, 0);\n let y = {\n [ABOVE]: () => {\n glyph.setOrigin(0.5, 1);\n const y = getTopY(note, textLine) - (textLine + initialOffset) * staffSpace;\n return shouldSitOutsideStaff ? Math.min(stave.getYForTopText(Articulation.INITIAL_OFFSET), y) : y;\n },\n [BELOW]: () => {\n glyph.setOrigin(0.5, 0);\n const y = getBottomY(note, textLine) + (textLine + initialOffset) * staffSpace;\n return shouldSitOutsideStaff ? Math.max(stave.getYForBottomText(Articulation.INITIAL_OFFSET), y) : y;\n },\n }[position]();\n if (!isTab) {\n const offsetDirection = position === ABOVE ? -1 : +1;\n const noteLine = note.getKeyProps()[index].line;\n const distanceFromNote = (note.getYs()[index] - y) / staffSpace;\n const articLine = distanceFromNote + Number(noteLine);\n const snappedLine = snapLineToStaff(canSitBetweenLines, articLine, position, offsetDirection);\n if (isWithinLines(snappedLine, position))\n glyph.setOrigin(0.5, 0.5);\n y += Math.abs(snappedLine - articLine) * staffSpace * offsetDirection + padding * offsetDirection;\n }\n L(`Rendering articulation at (x: ${x}, y: ${y})`);\n glyph.render(ctx, x, y);\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Articulation.DEBUG` to `true`. */\nArticulation.DEBUG = false;\nArticulation.INITIAL_OFFSET = -0.5;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2021.\n// MIT License\nimport { Category } from './typeguard';\nexport class RenderContext {\n static get CATEGORY() {\n return Category.RenderContext;\n }\n set font(f) {\n this.setFont(f);\n }\n get font() {\n return this.getFont();\n }\n /**\n * This is kept for backwards compatibility with 3.0.9.\n * @deprecated use `setFont(...)` instead since it now supports CSS font shorthand.\n */\n setRawFont(f) {\n this.setFont(f);\n return this;\n }\n}\n/**\n * Draw a tiny dot marker on the specified context. A great debugging aid.\n * @param ctx context\n * @param x dot x coordinate\n * @param y dot y coordinate\n * @param color\n */\nexport function drawDot(ctx, x, y, color = '#F55') {\n ctx.save();\n ctx.setFillStyle(color);\n // draw a circle\n ctx.beginPath();\n ctx.arc(x, y, 3, 0, Math.PI * 2, true);\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Fraction } from './fraction';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\n/**\n * Tickable represents a element that sit on a score and\n * has a duration, i.e., Tickables occupy space in the musical rendering dimension.\n */\nexport class Tickable extends Element {\n constructor() {\n super();\n this._preFormatted = false;\n this._postFormatted = false;\n // These properties represent the duration of\n // this tickable element.\n this.ticks = new Fraction(0, 1); // Fractional value of ticks\n this.intrinsicTicks = 0; // Floating point value of ticks\n this.tickMultiplier = new Fraction(1, 1);\n // Formatter metrics\n this.width = 0;\n this.x_shift = 0; // Shift from tick context\n this.modifiers = [];\n this.tupletStack = [];\n this.align_center = false;\n this.center_x_shift = 0; // Shift from tick context if center aligned\n // This flag tells the formatter to ignore this tickable during\n // formatting and justification. It is set by tickables such as BarNote.\n this.ignore_ticks = false;\n // This is a space for an external formatting class or function to maintain\n // metrics.\n this.formatterMetrics = {\n // The freedom of a tickable is the distance it can move without colliding\n // with neighboring elements. A formatter can set these values during its\n // formatting pass, which a different formatter can then use to fine tune.\n freedom: { left: 0, right: 0 },\n // The simplified rational duration of this tick as a string. It can be\n // used as an index to a map or hashtable.\n duration: '',\n // The number of formatting iterations undergone.\n iterations: 0,\n // The space in pixels allocated by this formatter, along with the mean space\n // for tickables of this duration, and the deviation from the mean.\n space: {\n used: 0,\n mean: 0,\n deviation: 0,\n },\n };\n }\n static get CATEGORY() {\n return Category.Tickable;\n }\n /** Reset the Tickable, this function will be overloaded. */\n reset() {\n return this;\n }\n /** Return the ticks. */\n getTicks() {\n return this.ticks;\n }\n /** Check if it ignores the ticks. */\n shouldIgnoreTicks() {\n return this.ignore_ticks;\n }\n /** Ignore the ticks. */\n setIgnoreTicks(flag) {\n this.ignore_ticks = flag;\n return this;\n }\n /** Set width of note. Used by the formatter for positioning. */\n setWidth(width) {\n this.width = width;\n }\n /** Get width of note. Used by the formatter for positioning. */\n getWidth() {\n if (!this._preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call GetWidth on an unformatted note.\");\n }\n return this.width + (this.modifierContext ? this.modifierContext.getWidth() : 0);\n }\n /** Displace note by `x` pixels. Used by the formatter. */\n setXShift(x) {\n this.x_shift = x;\n return this;\n }\n /** Get the `x` displaced pixels of the note. */\n getXShift() {\n return this.x_shift;\n }\n /** Get `x` position of this tick context. */\n getX() {\n const tickContext = this.checkTickContext(`Can't getX() without a TickContext.`);\n return tickContext.getX() + this.x_shift;\n }\n /** Return the formatterMetrics. */\n getFormatterMetrics() {\n return this.formatterMetrics;\n }\n /** Return the center `x` shift. */\n getCenterXShift() {\n if (this.isCenterAligned()) {\n return this.center_x_shift;\n }\n return 0;\n }\n /** Set the center `x` shift. */\n setCenterXShift(centerXShift) {\n this.center_x_shift = centerXShift;\n return this;\n }\n // Check if tickable is center aligned. */\n isCenterAligned() {\n return this.align_center;\n }\n // Set/unset center alignment. */\n setCenterAlignment(align_center) {\n this.align_center = align_center;\n return this;\n }\n /**\n * Return the associated voice. Every tickable must be associated with a voice.\n * This allows formatters and preFormatter to associate them with the right modifierContexts.\n */\n getVoice() {\n return defined(this.voice, 'NoVoice', 'Tickable has no voice.');\n }\n /** Set the associated voice. */\n setVoice(voice) {\n this.voice = voice;\n }\n /** Get the tuplet. */\n getTuplet() {\n return this.tuplet;\n }\n /** Return the intrinsic ticks. */\n getTupletStack() {\n return this.tupletStack;\n }\n /**\n * Reset the specific Tuplet if this is not provided, all tuplets are reset.\n * Remove any prior tuplets from the tick calculation and\n * reset the intrinsic tick value.\n */\n resetTuplet(tuplet) {\n let noteCount;\n let notesOccupied;\n if (tuplet) {\n const i = this.tupletStack.indexOf(tuplet);\n if (i !== -1) {\n this.tupletStack.splice(i, 1);\n noteCount = tuplet.getNoteCount();\n notesOccupied = tuplet.getNotesOccupied();\n // Revert old multiplier by inverting numerator & denom.:\n this.applyTickMultiplier(noteCount, notesOccupied);\n }\n return this;\n }\n while (this.tupletStack.length) {\n tuplet = this.tupletStack.pop();\n noteCount = tuplet.getNoteCount();\n notesOccupied = tuplet.getNotesOccupied();\n // Revert old multiplier by inverting numerator & denom.:\n this.applyTickMultiplier(noteCount, notesOccupied);\n }\n return this;\n }\n /** Attach to new tuplet. */\n setTuplet(tuplet) {\n if (tuplet) {\n this.tupletStack.push(tuplet);\n const noteCount = tuplet.getNoteCount();\n const notesOccupied = tuplet.getNotesOccupied();\n this.applyTickMultiplier(notesOccupied, noteCount);\n }\n this.tuplet = tuplet;\n return this;\n }\n /**\n * Add self to the provided ModifierContext `mc`.\n * If this tickable has modifiers, set modifierContext.\n * @returns this\n */\n addToModifierContext(mc) {\n this.modifierContext = mc;\n for (let i = 0; i < this.modifiers.length; ++i) {\n this.modifierContext.addMember(this.modifiers[i]);\n }\n this.modifierContext.addMember(this);\n this._preFormatted = false;\n return this;\n }\n /**\n * Optional, if tickable has modifiers, associate a Modifier.\n * @param mod the modifier\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n addModifier(modifier, index = 0) {\n this.modifiers.push(modifier);\n this._preFormatted = false;\n return this;\n }\n /** Get the list of associated modifiers. */\n getModifiers() {\n return this.modifiers;\n }\n /** Set the Tick Context. */\n setTickContext(tc) {\n this.tickContext = tc;\n this._preFormatted = false;\n }\n checkTickContext(message = 'Tickable has no tick context.') {\n return defined(this.tickContext, 'NoTickContext', message);\n }\n /** Preformat the Tickable. */\n preFormat() {\n if (this._preFormatted)\n return;\n this.width = 0;\n if (this.modifierContext) {\n this.modifierContext.preFormat();\n this.width += this.modifierContext.getWidth();\n }\n }\n /** Set preformatted status. */\n set preFormatted(value) {\n this._preFormatted = value;\n }\n get preFormatted() {\n return this._preFormatted;\n }\n /** Postformat the Tickable. */\n postFormat() {\n if (this._postFormatted)\n return this;\n this._postFormatted = true;\n return this;\n }\n /** Set postformatted status. */\n set postFormatted(value) {\n this._postFormatted = value;\n }\n get postFormatted() {\n return this._postFormatted;\n }\n /** Return the intrinsic ticks. */\n getIntrinsicTicks() {\n return this.intrinsicTicks;\n }\n /** Set the intrinsic ticks. */\n setIntrinsicTicks(intrinsicTicks) {\n this.intrinsicTicks = intrinsicTicks;\n this.ticks = this.tickMultiplier.clone().multiply(this.intrinsicTicks);\n }\n /** Get the tick multiplier. */\n getTickMultiplier() {\n return this.tickMultiplier;\n }\n /** Apply a tick multiplier. */\n applyTickMultiplier(numerator, denominator) {\n this.tickMultiplier.multiply(numerator, denominator);\n this.ticks = this.tickMultiplier.clone().multiply(this.intrinsicTicks);\n }\n /** Set the duration. */\n setDuration(duration) {\n const ticks = duration.numerator * (Tables.RESOLUTION / duration.denominator);\n this.ticks = this.tickMultiplier.clone().multiply(ticks);\n this.intrinsicTicks = this.ticks.value();\n }\n getAbsoluteX() {\n const tickContext = this.checkTickContext(`Can't getAbsoluteX() without a TickContext.`);\n return tickContext.getX();\n }\n /** Attach this note to a modifier context. */\n setModifierContext(mc) {\n this.modifierContext = mc;\n return this;\n }\n /** Get `ModifierContext`. */\n getModifierContext() {\n return this.modifierContext;\n }\n /** Check and get `ModifierContext`. */\n checkModifierContext() {\n return defined(this.modifierContext, 'NoModifierContext', 'No modifier context attached to this tickable.');\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from './font';\nimport { drawDot } from './rendercontext';\nimport { Tables } from './tables';\nimport { Tickable } from './tickable';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\n/**\n * Note implements an abstract interface for notes and chords that\n * are rendered on a stave. Notes have some common properties: All of them\n * have a value (e.g., pitch, fret, etc.) and a duration (quarter, half, etc.)\n *\n * Some notes have stems, heads, dots, etc. Most notational elements that\n * surround a note are called *modifiers*, and every note has an associated\n * array of them. All notes also have a rendering context and belong to a stave.\n */\nexport class Note extends Tickable {\n /**\n * Every note is a tickable, i.e., it can be mutated by the `Formatter` class for\n * positioning and layout.\n *\n * @param noteStruct To create a new note you need to provide a `noteStruct`.\n */\n constructor(noteStruct) {\n super();\n if (!noteStruct) {\n throw new RuntimeError('BadArguments', 'Note must have valid initialization data to identify duration and type.');\n }\n /** Parses `noteStruct` and get note properties. */\n const parsedNoteStruct = Note.parseNoteStruct(noteStruct);\n if (!parsedNoteStruct) {\n throw new RuntimeError('BadArguments', `Invalid note initialization object: ${JSON.stringify(noteStruct)}`);\n }\n // Set note properties from parameters.\n this.keys = noteStruct.keys || [];\n // per-pitch properties\n this.keyProps = [];\n this.duration = parsedNoteStruct.duration;\n this.noteType = parsedNoteStruct.type;\n this.customTypes = parsedNoteStruct.customTypes;\n if (noteStruct.duration_override) {\n // Custom duration\n this.setDuration(noteStruct.duration_override);\n }\n else {\n // Default duration\n this.setIntrinsicTicks(parsedNoteStruct.ticks);\n }\n this.modifiers = [];\n // Get the glyph code for this note from the font.\n this.glyph = Tables.getGlyphProps(this.duration, this.noteType);\n this.customGlyphs = this.customTypes.map((t) => Tables.getGlyphProps(this.duration, t));\n // Note to play for audio players.\n this.playNote = undefined;\n // Positioning contexts used by the Formatter.\n this.ignore_ticks = false;\n // Positioning variables\n this.width = 0; // Width in pixels calculated after preFormat\n this.leftDisplacedHeadPx = 0; // Extra room on left for displaced note head\n this.rightDisplacedHeadPx = 0; // Extra room on right for displaced note head\n this.x_shift = 0; // X shift from tick context X\n this.ys = []; // list of y coordinates for each note\n // we need to hold on to these for ties and beams.\n if (noteStruct.align_center) {\n this.setCenterAlignment(noteStruct.align_center);\n }\n // The render surface.\n this.render_options = {\n annotation_spacing: 5,\n glyph_font_scale: 1,\n stroke_px: 1,\n scale: 1,\n font: '',\n y_shift: 0,\n };\n }\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // STATIC MEMBERS\n static get CATEGORY() {\n return Category.Note;\n }\n /** Debug helper. Displays various note metrics for the given note. */\n static plotMetrics(ctx, note, yPos) {\n const metrics = note.getMetrics();\n const xStart = note.getAbsoluteX() - metrics.modLeftPx - metrics.leftDisplacedHeadPx;\n const xPre1 = note.getAbsoluteX() - metrics.leftDisplacedHeadPx;\n const xAbs = note.getAbsoluteX();\n const xPost1 = note.getAbsoluteX() + metrics.notePx;\n const xPost2 = note.getAbsoluteX() + metrics.notePx + metrics.rightDisplacedHeadPx;\n const xEnd = note.getAbsoluteX() + metrics.notePx + metrics.rightDisplacedHeadPx + metrics.modRightPx;\n const xFreedomRight = xEnd + (note.getFormatterMetrics().freedom.right || 0);\n const xWidth = xEnd - xStart;\n ctx.save();\n ctx.setFont(Font.SANS_SERIF, 8);\n ctx.fillText(Math.round(xWidth) + 'px', xStart + note.getXShift(), yPos);\n const y = yPos + 7;\n function stroke(x1, x2, color, yy = y) {\n ctx.beginPath();\n ctx.setStrokeStyle(color);\n ctx.setFillStyle(color);\n ctx.setLineWidth(3);\n ctx.moveTo(x1 + note.getXShift(), yy);\n ctx.lineTo(x2 + note.getXShift(), yy);\n ctx.stroke();\n }\n stroke(xStart, xPre1, 'red');\n stroke(xPre1, xAbs, '#999');\n stroke(xAbs, xPost1, 'green');\n stroke(xPost1, xPost2, '#999');\n stroke(xPost2, xEnd, 'red');\n stroke(xEnd, xFreedomRight, '#DD0');\n stroke(xStart - note.getXShift(), xStart, '#BBB'); // Shift\n drawDot(ctx, xAbs + note.getXShift(), y, 'blue');\n const formatterMetrics = note.getFormatterMetrics();\n if (formatterMetrics.iterations > 0) {\n const spaceDeviation = formatterMetrics.space.deviation;\n const prefix = spaceDeviation >= 0 ? '+' : '';\n ctx.setFillStyle('red');\n ctx.fillText(prefix + Math.round(spaceDeviation), xAbs + note.getXShift(), yPos - 10);\n }\n ctx.restore();\n }\n static parseDuration(durationString) {\n if (!durationString) {\n return undefined;\n }\n const regexp = /(\\d*\\/?\\d+|[a-z])(d*)([nrhms]|$)/;\n const result = regexp.exec(durationString);\n if (!result) {\n return undefined;\n }\n const duration = result[1];\n const dots = result[2].length;\n const type = result[3] || 'n';\n return { duration, dots, type };\n }\n static parseNoteStruct(noteStruct) {\n // Preserve backwards-compatibility\n const durationProps = Note.parseDuration(noteStruct.duration);\n if (!durationProps) {\n return undefined;\n }\n // If specified type is invalid, return undefined.\n let type = noteStruct.type;\n if (type && !Tables.validTypes[type]) {\n return undefined;\n }\n // If no type specified, check duration or custom types\n const customTypes = [];\n if (!type) {\n type = durationProps.type || 'n';\n // If we have keys, try and check if we've got a custom glyph\n if (noteStruct.keys !== undefined) {\n noteStruct.keys.forEach((k, i) => {\n const result = k.split('/');\n // We have a custom glyph specified after the note eg. /X2\n customTypes[i] = (result && result.length === 3 ? result[2] : type);\n });\n }\n }\n // Calculate the tick duration of the note\n let ticks = Tables.durationToTicks(durationProps.duration);\n if (!ticks) {\n return undefined;\n }\n // Are there any dots?\n const dots = noteStruct.dots ? noteStruct.dots : durationProps.dots;\n if (typeof dots !== 'number') {\n return undefined;\n }\n // Add ticks as necessary depending on the numbr of dots\n let currentTicks = ticks;\n for (let i = 0; i < dots; i++) {\n if (currentTicks <= 1)\n return undefined;\n currentTicks = currentTicks / 2;\n ticks += currentTicks;\n }\n return {\n duration: durationProps.duration,\n type,\n customTypes,\n dots,\n ticks,\n };\n }\n /**\n * Get the play note, which is arbitrary data that can be used by an\n * audio player.\n */\n getPlayNote() {\n return this.playNote;\n }\n /**\n * Set the play note, which is arbitrary data that can be used by an\n * audio player.\n */\n setPlayNote(note) {\n this.playNote = note;\n return this;\n }\n /**\n * @returns true if this note is a type of rest.\n *\n * Rests don't have pitches, but take up space in the score.\n * Subclasses should override this default implementation.\n */\n isRest() {\n return false;\n }\n /** Add stroke. */\n addStroke(index, stroke) {\n stroke.setNote(this);\n stroke.setIndex(index);\n this.modifiers.push(stroke);\n this.preFormatted = false;\n return this;\n }\n /** Get the target stave. */\n getStave() {\n return this.stave;\n }\n /** Check and get the target stave. */\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n /** Set the target stave. */\n setStave(stave) {\n this.stave = stave;\n this.setYs([stave.getYForLine(0)]); // Update Y values if the stave is changed.\n this.setContext(this.stave.getContext());\n return this;\n }\n /** Get spacing to the left of the notes. */\n getLeftDisplacedHeadPx() {\n return this.leftDisplacedHeadPx;\n }\n /** Get spacing to the right of the notes. */\n getRightDisplacedHeadPx() {\n return this.rightDisplacedHeadPx;\n }\n /** Set spacing to the left of the notes. */\n setLeftDisplacedHeadPx(x) {\n this.leftDisplacedHeadPx = x;\n return this;\n }\n /** Set spacing to the right of the notes. */\n setRightDisplacedHeadPx(x) {\n this.rightDisplacedHeadPx = x;\n return this;\n }\n /** True if this note has no duration (e.g., bar notes, spacers, etc.). */\n shouldIgnoreTicks() {\n return this.ignore_ticks;\n }\n /** Get the stave line number for the note. */\n // eslint-disable-next-line\n getLineNumber(isTopNote) {\n return 0;\n }\n /** Get the stave line number for rest. */\n getLineForRest() {\n return 0;\n }\n /** Get the glyph associated with this note. */\n // eslint-disable-next-line\n getGlyph() {\n return this.glyph;\n }\n /** Get the glyph width. */\n getGlyphWidth() {\n // TODO: FIXME (multiple potential values for this.glyph)\n if (this.glyph) {\n if (this.glyph.getMetrics) {\n return this.glyph.getMetrics().width;\n }\n else if (this.glyph.getWidth) {\n return this.glyph.getWidth(this.render_options.glyph_font_scale);\n }\n }\n return 0;\n }\n /**\n * Set Y positions for this note. Each Y value is associated with\n * an individual pitch/key within the note/chord.\n */\n setYs(ys) {\n this.ys = ys;\n return this;\n }\n /**\n * Get Y positions for this note. Each Y value is associated with\n * an individual pitch/key within the note/chord.\n */\n getYs() {\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', 'No Y-values calculated for this note.');\n }\n return this.ys;\n }\n /**\n * Get the Y position of the space above the stave onto which text can\n * be rendered.\n */\n getYForTopText(text_line) {\n return this.checkStave().getYForTopText(text_line);\n }\n /** Return the voice that this note belongs in. */\n getVoice() {\n if (!this.voice)\n throw new RuntimeError('NoVoice', 'Note has no voice.');\n return this.voice;\n }\n /** Attach this note to `voice`. */\n setVoice(voice) {\n this.voice = voice;\n this.preFormatted = false;\n return this;\n }\n /** Get the `TickContext` for this note. */\n getTickContext() {\n return this.checkTickContext();\n }\n /** Set the `TickContext` for this note. */\n setTickContext(tc) {\n this.tickContext = tc;\n this.preFormatted = false;\n return this;\n }\n /** Accessor to duration. */\n getDuration() {\n return this.duration;\n }\n /** Accessor to isDotted. */\n isDotted() {\n return this.getModifiersByType('Dot').length > 0;\n }\n /** Accessor to hasStem. */\n hasStem() {\n return false;\n }\n /** Accessor to note type. */\n getNoteType() {\n return this.noteType;\n }\n /** Get the beam. */\n getBeam() {\n return this.beam;\n }\n /** Check and get the beam. */\n checkBeam() {\n return defined(this.beam, 'NoBeam', 'No beam attached to instance');\n }\n /** Check it has a beam. */\n hasBeam() {\n return this.beam != undefined;\n }\n /** Set the beam. */\n setBeam(beam) {\n this.beam = beam;\n return this;\n }\n /**\n * Attach a modifier to this note.\n * @param modifier the Modifier to add.\n * @param index of the key to modify.\n * @returns this\n */\n addModifier(modifier, index = 0) {\n const signature = 'Note.addModifier(modifier: Modifier, index: number=0)';\n // Backwards compatibility with 3.0.9.\n if (typeof index === 'string') {\n index = parseInt(index);\n // eslint-disable-next-line\n console.warn(signature + ' expected a number for `index`, but received a string.');\n }\n // Some versions of VexFlow had the two parameters reversed.\n // Check here and throw an error if the argument types are not correct.\n if (typeof modifier !== 'object' || typeof index !== 'number') {\n throw new RuntimeError('WrongParams', 'Incorrect call signature. Use ' + signature + ' instead.');\n }\n modifier.setNote(this);\n modifier.setIndex(index);\n super.addModifier(modifier);\n return this;\n }\n // Get all modifiers of a specific type in the `ModifierContext`\n getModifiersByType(type) {\n return this.checkModifierContext().getMembers(type);\n }\n /** Get the coordinates for where modifiers begin. */\n // eslint-disable-next-line\n getModifierStartXY(position, index, options) {\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call GetModifierStartXY on an unformatted note\");\n }\n return {\n x: this.getAbsoluteX(),\n y: this.ys[0],\n };\n }\n getRightParenthesisPx(index) {\n const props = this.getKeyProps()[index];\n return props.displaced ? this.getRightDisplacedHeadPx() : 0;\n }\n getLeftParenthesisPx(index) {\n const props = this.getKeyProps()[index];\n return props.displaced ? this.getLeftDisplacedHeadPx() : 0;\n }\n getFirstDotPx() {\n let px = this.getRightDisplacedHeadPx();\n if (this.checkModifierContext().getMembers('Parenthesis').length !== 0)\n px += Tables.currentMusicFont().lookupMetric('parenthesis.default.width');\n return px;\n }\n /** Get the metrics for this note. */\n getMetrics() {\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call getMetrics on an unformatted note.\");\n }\n const modLeftPx = this.modifierContext ? this.modifierContext.getState().left_shift : 0;\n const modRightPx = this.modifierContext ? this.modifierContext.getState().right_shift : 0;\n const width = this.getWidth();\n const glyphWidth = this.getGlyphWidth();\n const notePx = width -\n modLeftPx - // subtract left modifiers\n modRightPx - // subtract right modifiers\n this.leftDisplacedHeadPx - // subtract left displaced head\n this.rightDisplacedHeadPx; // subtract right displaced head\n // NOTE: If you change this, remember to update MockTickable.getMetrics() in the tests/ directory.\n return {\n width,\n glyphWidth,\n notePx,\n // Modifier spacing.\n modLeftPx,\n modRightPx,\n // Displaced note head on left or right.\n leftDisplacedHeadPx: this.leftDisplacedHeadPx,\n rightDisplacedHeadPx: this.rightDisplacedHeadPx,\n glyphPx: 0,\n };\n }\n /**\n * Get the absolute `X` position of this note's tick context. This\n * excludes x_shift, so you'll need to factor it in if you're\n * looking for the post-formatted x-position.\n */\n getAbsoluteX() {\n const tickContext = this.checkTickContext(`Can't getAbsoluteX() without a TickContext.`);\n // Position note to left edge of tick context.\n let x = tickContext.getX();\n if (this.stave) {\n x += this.stave.getNoteStartX() + Tables.currentMusicFont().lookupMetric('stave.padding');\n }\n if (this.isCenterAligned()) {\n x += this.getCenterXShift();\n }\n return x;\n }\n /** Get the direction of the stem. */\n getStemDirection() {\n throw new RuntimeError('NoStem', 'No stem attached to this note.');\n }\n /** Get the top and bottom `y` values of the stem. */\n getStemExtents() {\n throw new RuntimeError('NoStem', 'No stem attached to this note.');\n }\n /** Get the `x` coordinate to the right of the note. */\n getTieRightX() {\n let tieStartX = this.getAbsoluteX();\n const note_glyph_width = this.glyph.getWidth();\n tieStartX += note_glyph_width / 2;\n tieStartX += -this.width / 2 + this.width + 2;\n return tieStartX;\n }\n /** Get the `x` coordinate to the left of the note. */\n getTieLeftX() {\n let tieEndX = this.getAbsoluteX();\n const note_glyph_width = this.glyph.getWidth();\n tieEndX += note_glyph_width / 2;\n tieEndX -= this.width / 2 + 2;\n return tieEndX;\n }\n // Get the pitches in the note\n getKeys() {\n return this.keys;\n }\n // Get the properties for all the keys in the note\n getKeyProps() {\n return this.keyProps;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// A base class for stave modifiers (e.g. clefs, key signatures)\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { defined } from './util';\nexport var StaveModifierPosition;\n(function (StaveModifierPosition) {\n StaveModifierPosition[StaveModifierPosition[\"CENTER\"] = 0] = \"CENTER\";\n StaveModifierPosition[StaveModifierPosition[\"LEFT\"] = 1] = \"LEFT\";\n StaveModifierPosition[StaveModifierPosition[\"RIGHT\"] = 2] = \"RIGHT\";\n StaveModifierPosition[StaveModifierPosition[\"ABOVE\"] = 3] = \"ABOVE\";\n StaveModifierPosition[StaveModifierPosition[\"BELOW\"] = 4] = \"BELOW\";\n StaveModifierPosition[StaveModifierPosition[\"BEGIN\"] = 5] = \"BEGIN\";\n StaveModifierPosition[StaveModifierPosition[\"END\"] = 6] = \"END\";\n})(StaveModifierPosition || (StaveModifierPosition = {}));\nexport class StaveModifier extends Element {\n constructor() {\n super();\n this.width = 0;\n this.x = 0;\n this.padding = 10;\n this.position = StaveModifierPosition.ABOVE;\n }\n static get CATEGORY() {\n return Category.StaveModifier;\n }\n static get Position() {\n return StaveModifierPosition;\n }\n getPosition() {\n return this.position;\n }\n setPosition(position) {\n this.position = position;\n return this;\n }\n getStave() {\n return this.stave;\n }\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n setStave(stave) {\n this.stave = stave;\n return this;\n }\n getWidth() {\n return this.width;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n getX() {\n return this.x;\n }\n setX(x) {\n this.x = x;\n return this;\n }\n placeGlyphOnLine(glyph, stave, line, customShift = 0) {\n glyph.setYShift(stave.getYForLine(line !== null && line !== void 0 ? line : 0) - stave.getYForGlyphs() + customShift);\n }\n getPadding(index) {\n return index !== undefined && index < 2 ? 0 : this.padding;\n }\n setPadding(padding) {\n this.padding = padding;\n return this;\n }\n setLayoutMetrics(layoutMetrics) {\n this.layoutMetrics = layoutMetrics;\n return this;\n }\n getLayoutMetrics() {\n return this.layoutMetrics;\n }\n // eslint-disable-next-line\n draw(...args) {\n // DO NOTHING.\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// Author Larry Kuhns 2011\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nexport var BarlineType;\n(function (BarlineType) {\n BarlineType[BarlineType[\"SINGLE\"] = 1] = \"SINGLE\";\n BarlineType[BarlineType[\"DOUBLE\"] = 2] = \"DOUBLE\";\n BarlineType[BarlineType[\"END\"] = 3] = \"END\";\n BarlineType[BarlineType[\"REPEAT_BEGIN\"] = 4] = \"REPEAT_BEGIN\";\n BarlineType[BarlineType[\"REPEAT_END\"] = 5] = \"REPEAT_END\";\n BarlineType[BarlineType[\"REPEAT_BOTH\"] = 6] = \"REPEAT_BOTH\";\n BarlineType[BarlineType[\"NONE\"] = 7] = \"NONE\";\n})(BarlineType || (BarlineType = {}));\nexport class Barline extends StaveModifier {\n constructor(type) {\n super();\n this.thickness = Tables.STAVE_LINE_THICKNESS;\n const TYPE = BarlineType;\n this.widths = {};\n this.widths[TYPE.SINGLE] = 5;\n this.widths[TYPE.DOUBLE] = 5;\n this.widths[TYPE.END] = 5;\n this.widths[TYPE.REPEAT_BEGIN] = 5;\n this.widths[TYPE.REPEAT_END] = 5;\n this.widths[TYPE.REPEAT_BOTH] = 5;\n this.widths[TYPE.NONE] = 5;\n this.paddings = {};\n this.paddings[TYPE.SINGLE] = 0;\n this.paddings[TYPE.DOUBLE] = 0;\n this.paddings[TYPE.END] = 0;\n this.paddings[TYPE.REPEAT_BEGIN] = 15;\n this.paddings[TYPE.REPEAT_END] = 15;\n this.paddings[TYPE.REPEAT_BOTH] = 15;\n this.paddings[TYPE.NONE] = 0;\n this.layoutMetricsMap = {};\n this.layoutMetricsMap[TYPE.SINGLE] = {\n xMin: 0,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.DOUBLE] = {\n xMin: -3,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.END] = {\n xMin: -5,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.REPEAT_END] = {\n xMin: -10,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.REPEAT_BEGIN] = {\n xMin: -2,\n xMax: 10,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.REPEAT_BOTH] = {\n xMin: -10,\n xMax: 10,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.NONE] = {\n xMin: 0,\n xMax: 0,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.setPosition(StaveModifierPosition.BEGIN);\n this.setType(type);\n }\n static get CATEGORY() {\n return Category.Barline;\n }\n static get type() {\n return BarlineType;\n }\n static get typeString() {\n return {\n single: BarlineType.SINGLE,\n double: BarlineType.DOUBLE,\n end: BarlineType.END,\n repeatBegin: BarlineType.REPEAT_BEGIN,\n repeatEnd: BarlineType.REPEAT_END,\n repeatBoth: BarlineType.REPEAT_BOTH,\n none: BarlineType.NONE,\n };\n }\n getType() {\n return this.type;\n }\n setType(type) {\n this.type = typeof type === 'string' ? Barline.typeString[type] : type;\n this.setWidth(this.widths[this.type]);\n this.setPadding(this.paddings[this.type]);\n this.setLayoutMetrics(this.layoutMetricsMap[this.type]);\n return this;\n }\n // Draw barlines\n draw(stave) {\n stave.checkContext();\n this.setRendered();\n switch (this.type) {\n case BarlineType.SINGLE:\n this.drawVerticalBar(stave, this.x, false);\n break;\n case BarlineType.DOUBLE:\n this.drawVerticalBar(stave, this.x, true);\n break;\n case BarlineType.END:\n this.drawVerticalEndBar(stave, this.x);\n break;\n case BarlineType.REPEAT_BEGIN:\n // If the barline is shifted over (in front of clef/time/key)\n // Draw vertical bar at the beginning.\n this.drawRepeatBar(stave, this.x, true);\n if (stave.getX() !== this.x) {\n this.drawVerticalBar(stave, stave.getX());\n }\n break;\n case BarlineType.REPEAT_END:\n this.drawRepeatBar(stave, this.x, false);\n break;\n case BarlineType.REPEAT_BOTH:\n this.drawRepeatBar(stave, this.x, false);\n this.drawRepeatBar(stave, this.x, true);\n break;\n default:\n // Default is NONE, so nothing to draw\n break;\n }\n }\n drawVerticalBar(stave, x, double_bar) {\n const staveCtx = stave.checkContext();\n const topY = stave.getTopLineTopY();\n const botY = stave.getBottomLineBottomY();\n if (double_bar) {\n staveCtx.fillRect(x - 3, topY, 1, botY - topY);\n }\n staveCtx.fillRect(x, topY, 1, botY - topY);\n }\n drawVerticalEndBar(stave, x) {\n const staveCtx = stave.checkContext();\n const topY = stave.getTopLineTopY();\n const botY = stave.getBottomLineBottomY();\n staveCtx.fillRect(x - 5, topY, 1, botY - topY);\n staveCtx.fillRect(x - 2, topY, 3, botY - topY);\n }\n drawRepeatBar(stave, x, begin) {\n const staveCtx = stave.checkContext();\n const topY = stave.getTopLineTopY();\n const botY = stave.getBottomLineBottomY();\n let x_shift = 3;\n if (!begin) {\n x_shift = -5;\n }\n staveCtx.fillRect(x + x_shift, topY, 1, botY - topY);\n staveCtx.fillRect(x - 2, topY, 3, botY - topY);\n const dot_radius = 2;\n // Shift dots left or right\n if (begin) {\n x_shift += 4;\n }\n else {\n x_shift -= 4;\n }\n const dot_x = x + x_shift + dot_radius / 2;\n // calculate the y offset based on number of stave lines\n let y_offset = (stave.getNumLines() - 1) * stave.getSpacingBetweenLines();\n y_offset = y_offset / 2 - stave.getSpacingBetweenLines() / 2;\n let dot_y = topY + y_offset + dot_radius / 2;\n // draw the top repeat dot\n staveCtx.beginPath();\n staveCtx.arc(dot_x, dot_y, dot_radius, 0, Math.PI * 2, false);\n staveCtx.fill();\n // draw the bottom repeat dot\n dot_y += stave.getSpacingBetweenLines();\n staveCtx.beginPath();\n staveCtx.arc(dot_x, dot_y, dot_radius, 0, Math.PI * 2, false);\n staveCtx.fill();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// Author: Aaron (@AaronDavidNewman)\n//\n// This implements chord symbols above/below a chord.\n// Chord symbols are modifiers that can be attached to notes.\n// They can contain multiple 'blocks' which represent text or\n// glyphs with various positioning options.\n//\n// See `tests/chordsymbol_tests.ts` for usage examples.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Tables } from './tables';\nimport { TextFormatter } from './textformatter';\nimport { Category } from './typeguard';\nimport { log } from './util';\n// To enable logging for this class. Set `Vex.Flow.ChordSymbol.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (ChordSymbol.DEBUG)\n log('Vex.Flow.ChordSymbol', args);\n}\nexport var ChordSymbolHorizontalJustify;\n(function (ChordSymbolHorizontalJustify) {\n ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify[\"LEFT\"] = 1] = \"LEFT\";\n ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify[\"CENTER\"] = 2] = \"CENTER\";\n ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify[\"RIGHT\"] = 3] = \"RIGHT\";\n ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify[\"CENTER_STEM\"] = 4] = \"CENTER_STEM\";\n})(ChordSymbolHorizontalJustify || (ChordSymbolHorizontalJustify = {}));\nexport var ChordSymbolVerticalJustify;\n(function (ChordSymbolVerticalJustify) {\n ChordSymbolVerticalJustify[ChordSymbolVerticalJustify[\"TOP\"] = 1] = \"TOP\";\n ChordSymbolVerticalJustify[ChordSymbolVerticalJustify[\"BOTTOM\"] = 2] = \"BOTTOM\";\n})(ChordSymbolVerticalJustify || (ChordSymbolVerticalJustify = {}));\nexport var SymbolTypes;\n(function (SymbolTypes) {\n SymbolTypes[SymbolTypes[\"GLYPH\"] = 1] = \"GLYPH\";\n SymbolTypes[SymbolTypes[\"TEXT\"] = 2] = \"TEXT\";\n SymbolTypes[SymbolTypes[\"LINE\"] = 3] = \"LINE\";\n})(SymbolTypes || (SymbolTypes = {}));\nexport var SymbolModifiers;\n(function (SymbolModifiers) {\n SymbolModifiers[SymbolModifiers[\"NONE\"] = 1] = \"NONE\";\n SymbolModifiers[SymbolModifiers[\"SUBSCRIPT\"] = 2] = \"SUBSCRIPT\";\n SymbolModifiers[SymbolModifiers[\"SUPERSCRIPT\"] = 3] = \"SUPERSCRIPT\";\n})(SymbolModifiers || (SymbolModifiers = {}));\n/**\n * ChordSymbol is a modifier that creates a chord symbol above/below a chord.\n * As a modifier, it is attached to an existing note.\n */\nexport class ChordSymbol extends Modifier {\n constructor() {\n super();\n this.symbolBlocks = [];\n this.horizontal = ChordSymbolHorizontalJustify.LEFT;\n this.vertical = ChordSymbolVerticalJustify.TOP;\n this.useKerning = true;\n this.reportWidth = true;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.ChordSymbol;\n }\n static get superSubRatio() {\n return ChordSymbol.metrics.global.superSubRatio;\n }\n /** Currently unused: Globally turn off text formatting, if the built-in formatting does not work for your font. */\n static set NO_TEXT_FORMAT(val) {\n ChordSymbol.noFormat = val;\n }\n static get NO_TEXT_FORMAT() {\n return ChordSymbol.noFormat;\n }\n // eslint-disable-next-line\n static getMetricForGlyph(glyphCode) {\n if (ChordSymbol.metrics[glyphCode]) {\n return ChordSymbol.metrics[glyphCode];\n }\n return undefined;\n }\n static get engravingFontResolution() {\n return Tables.currentMusicFont().getResolution();\n }\n static get spacingBetweenBlocks() {\n return ChordSymbol.metrics.global.spacing / ChordSymbol.engravingFontResolution;\n }\n static getWidthForGlyph(glyph) {\n const metric = ChordSymbol.getMetricForGlyph(glyph.code);\n if (!metric) {\n return 0.65; // probably should do something here.\n }\n return metric.advanceWidth / ChordSymbol.engravingFontResolution;\n }\n static getYShiftForGlyph(glyph) {\n const metric = ChordSymbol.getMetricForGlyph(glyph.code);\n if (!metric) {\n return 0;\n }\n return metric.yOffset / ChordSymbol.engravingFontResolution;\n }\n static getXShiftForGlyph(glyph) {\n const metric = ChordSymbol.getMetricForGlyph(glyph.code);\n if (!metric) {\n return 0;\n }\n return (-1 * metric.leftSideBearing) / ChordSymbol.engravingFontResolution;\n }\n static get superscriptOffset() {\n return ChordSymbol.metrics.global.superscriptOffset / ChordSymbol.engravingFontResolution;\n }\n static get subscriptOffset() {\n return ChordSymbol.metrics.global.subscriptOffset / ChordSymbol.engravingFontResolution;\n }\n static get kerningOffset() {\n return ChordSymbol.metrics.global.kerningOffset / ChordSymbol.engravingFontResolution;\n }\n // eslint-disable-next-line\n static get metrics() {\n return Tables.currentMusicFont().getMetrics().glyphs.chordSymbol;\n }\n static get lowerKerningText() {\n // For example, see: `bravura_metrics.ts`\n // BravuraMetrics.glyphs.chordSymbol.global.lowerKerningText, which returns an array of letters.\n // ['D', 'F', 'P', 'T', 'V', 'Y']\n return ChordSymbol.metrics.global.lowerKerningText;\n }\n static get upperKerningText() {\n return ChordSymbol.metrics.global.upperKerningText;\n }\n static isSuperscript(block) {\n return block.symbolModifier !== undefined && block.symbolModifier === SymbolModifiers.SUPERSCRIPT;\n }\n static isSubscript(block) {\n return block.symbolModifier !== undefined && block.symbolModifier === SymbolModifiers.SUBSCRIPT;\n }\n /**\n * Estimate the width of the whole chord symbol, based on the sum of the widths of the individual blocks.\n * Estimate how many lines above/below the staff we need.\n */\n static format(symbols, state) {\n var _a;\n if (!symbols || symbols.length === 0)\n return false;\n let width = 0;\n let nonSuperWidth = 0;\n const reportedWidths = [];\n for (const symbol of symbols) {\n const fontSize = Font.convertSizeToPointValue((_a = symbol.textFont) === null || _a === void 0 ? void 0 : _a.size);\n const fontAdj = Font.scaleSize(fontSize, 0.05);\n const glyphAdj = fontAdj * 2;\n let lineSpaces = 1;\n let vAlign = false;\n for (let j = 0; j < symbol.symbolBlocks.length; ++j) {\n const block = symbol.symbolBlocks[j];\n const sup = ChordSymbol.isSuperscript(block);\n const sub = ChordSymbol.isSubscript(block);\n const superSubScale = sup || sub ? ChordSymbol.superSubRatio : 1;\n const adj = block.symbolType === SymbolTypes.GLYPH ? glyphAdj * superSubScale : fontAdj * superSubScale;\n // If there are super/subscripts, they extend beyond the line so\n // assume they take up 2 lines\n if (sup || sub) {\n lineSpaces = 2;\n }\n // If there is a symbol-specific offset, add it but consider font\n // size since font and glyphs will be interspersed.\n const fontSize = symbol.textFormatter.fontSizeInPixels;\n const superSubFontSize = fontSize * superSubScale;\n if (block.symbolType === SymbolTypes.GLYPH && block.glyph !== undefined) {\n block.width = ChordSymbol.getWidthForGlyph(block.glyph) * superSubFontSize;\n block.yShift += ChordSymbol.getYShiftForGlyph(block.glyph) * superSubFontSize;\n block.xShift += ChordSymbol.getXShiftForGlyph(block.glyph) * superSubFontSize;\n block.glyph.scale = block.glyph.scale * adj;\n }\n else if (block.symbolType === SymbolTypes.TEXT) {\n block.width = block.width * superSubFontSize;\n block.yShift += symbol.getYOffsetForText(block.text) * adj;\n }\n if (block.symbolType === SymbolTypes.GLYPH &&\n block.glyph !== undefined &&\n block.glyph.code === ChordSymbol.glyphs.over.code) {\n lineSpaces = 2;\n }\n block.width += ChordSymbol.spacingBetweenBlocks * fontSize * superSubScale;\n // If a subscript immediately follows a superscript block, try to\n // overlay them.\n if (sup && j > 0) {\n const prev = symbol.symbolBlocks[j - 1];\n if (!ChordSymbol.isSuperscript(prev)) {\n nonSuperWidth = width;\n }\n }\n if (sub && nonSuperWidth > 0) {\n vAlign = true;\n // slide the symbol over so it lines up with superscript\n block.xShift = block.xShift + (nonSuperWidth - width);\n width = nonSuperWidth;\n nonSuperWidth = 0;\n // If we have vertically lined up, turn kerning off.\n symbol.setEnableKerning(false);\n }\n if (!sup && !sub) {\n nonSuperWidth = 0;\n }\n block.vAlign = vAlign;\n width += block.width;\n }\n // make kerning adjustments after computing super/subscripts\n symbol.updateKerningAdjustments();\n symbol.updateOverBarAdjustments();\n if (symbol.getVertical() === ChordSymbolVerticalJustify.TOP) {\n symbol.setTextLine(state.top_text_line);\n state.top_text_line += lineSpaces;\n }\n else {\n symbol.setTextLine(state.text_line + 1);\n state.text_line += lineSpaces + 1;\n }\n if (symbol.getReportWidth()) {\n reportedWidths.push(width);\n }\n else {\n reportedWidths.push(0);\n }\n }\n width = reportedWidths.reduce((a, b) => a + b, 0);\n state.left_shift += width / 2;\n state.right_shift += width / 2;\n return true;\n }\n /**\n * Default text font.\n * Choose a font family that works well with the current music engraving font.\n * @override `Element.TEXT_FONT`.\n */\n static get TEXT_FONT() {\n let family = 'Roboto Slab, Times, serif';\n if (Tables.currentMusicFont().getName() === 'Petaluma') {\n // Fixes Issue #1180\n family = 'PetalumaScript, Arial, sans-serif';\n }\n return {\n family,\n size: 12,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n };\n }\n /**\n * The offset is specified in `em`. Scale this value by the font size in pixels.\n */\n get superscriptOffset() {\n return ChordSymbol.superscriptOffset * this.textFormatter.fontSizeInPixels;\n }\n get subscriptOffset() {\n return ChordSymbol.subscriptOffset * this.textFormatter.fontSizeInPixels;\n }\n setReportWidth(value) {\n this.reportWidth = value;\n return this;\n }\n getReportWidth() {\n return this.reportWidth;\n }\n updateOverBarAdjustments() {\n const barIndex = this.symbolBlocks.findIndex(({ symbolType, glyph }) => symbolType === SymbolTypes.GLYPH && glyph !== undefined && glyph.code === 'csymDiagonalArrangementSlash');\n if (barIndex < 0) {\n return;\n }\n const bar = this.symbolBlocks[barIndex];\n const xoff = bar.width / 4;\n const yoff = 0.25 * this.textFormatter.fontSizeInPixels;\n let symIndex = 0;\n for (symIndex === 0; symIndex < barIndex; ++symIndex) {\n const symbol = this.symbolBlocks[symIndex];\n symbol.xShift = symbol.xShift + xoff;\n symbol.yShift = symbol.yShift - yoff;\n }\n for (symIndex = barIndex + 1; symIndex < this.symbolBlocks.length; ++symIndex) {\n const symbol = this.symbolBlocks[symIndex];\n symbol.xShift = symbol.xShift - xoff;\n symbol.yShift = symbol.yShift + yoff;\n }\n }\n updateKerningAdjustments() {\n let accum = 0;\n for (let j = 0; j < this.symbolBlocks.length; ++j) {\n const symbol = this.symbolBlocks[j];\n accum += this.getKerningAdjustment(j);\n symbol.xShift += accum;\n }\n }\n /** Do some basic kerning so that letter chords like 'A' don't have the extensions hanging off to the right. */\n getKerningAdjustment(j) {\n if (!this.useKerning) {\n return 0;\n }\n const currSymbol = this.symbolBlocks[j];\n const prevSymbol = j > 0 ? this.symbolBlocks[j - 1] : undefined;\n let adjustment = 0;\n // Move things into the '/' over bar\n if (currSymbol.symbolType === SymbolTypes.GLYPH &&\n currSymbol.glyph !== undefined &&\n currSymbol.glyph.code === ChordSymbol.glyphs.over.code) {\n adjustment += currSymbol.glyph.metrics.x_shift;\n }\n if (prevSymbol !== undefined &&\n prevSymbol.symbolType === SymbolTypes.GLYPH &&\n prevSymbol.glyph !== undefined &&\n prevSymbol.glyph.code === ChordSymbol.glyphs.over.code) {\n adjustment += prevSymbol.glyph.metrics.x_shift;\n }\n // For superscripts that follow a letter without much top part, move it to the left slightly\n let preKernUpper = false;\n let preKernLower = false;\n if (prevSymbol !== undefined && prevSymbol.symbolType === SymbolTypes.TEXT) {\n preKernUpper = ChordSymbol.upperKerningText.some((xx) => xx === prevSymbol.text[prevSymbol.text.length - 1]);\n preKernLower = ChordSymbol.lowerKerningText.some((xx) => xx === prevSymbol.text[prevSymbol.text.length - 1]);\n }\n const kerningOffsetPixels = ChordSymbol.kerningOffset * this.textFormatter.fontSizeInPixels;\n // TODO: adjust kern for font size.\n // Where should this constant live?\n if (preKernUpper && currSymbol.symbolModifier === SymbolModifiers.SUPERSCRIPT) {\n adjustment += kerningOffsetPixels;\n }\n if (preKernLower && currSymbol.symbolType === SymbolTypes.TEXT) {\n if (currSymbol.text[0] >= 'a' && currSymbol.text[0] <= 'z') {\n adjustment += kerningOffsetPixels / 2;\n }\n if (ChordSymbol.upperKerningText.some((xx) => xx === (prevSymbol === null || prevSymbol === void 0 ? void 0 : prevSymbol.text[prevSymbol.text.length - 1]))) {\n adjustment += kerningOffsetPixels / 2;\n }\n }\n return adjustment;\n }\n /**\n * ChordSymbol allows multiple blocks so we can mix glyphs and font text.\n * Each block can have its own vertical orientation.\n */\n // eslint-disable-next-line\n getSymbolBlock(params = {}) {\n var _a, _b, _c;\n const symbolType = (_a = params.symbolType) !== null && _a !== void 0 ? _a : SymbolTypes.TEXT;\n const symbolBlock = {\n text: (_b = params.text) !== null && _b !== void 0 ? _b : '',\n symbolType,\n symbolModifier: (_c = params.symbolModifier) !== null && _c !== void 0 ? _c : SymbolModifiers.NONE,\n xShift: 0,\n yShift: 0,\n vAlign: false,\n width: 0,\n };\n // Note: symbol widths are resolution and font-independent.\n // We convert to pixel values when we know what the font is.\n if (symbolType === SymbolTypes.GLYPH && typeof params.glyph === 'string') {\n const glyphArgs = ChordSymbol.glyphs[params.glyph];\n const glyphPoints = 20;\n symbolBlock.glyph = new Glyph(glyphArgs.code, glyphPoints, { category: 'chordSymbol' });\n // Beware: glyph.metrics is not the same as glyph.getMetrics() !\n // rv.glyph.point = rv.glyph.point * rv.glyph.metrics.scale;\n // rv.width = rv.glyph.getMetrics().width;\n // don't set yShift here, b/c we need to do it at formatting time after the font is set.\n }\n else if (symbolType === SymbolTypes.TEXT) {\n symbolBlock.width = this.textFormatter.getWidthForTextInEm(symbolBlock.text);\n }\n else if (symbolType === SymbolTypes.LINE) {\n symbolBlock.width = params.width;\n }\n return symbolBlock;\n }\n /** Add a symbol to this chord, could be text, glyph or line. */\n // eslint-disable-next-line\n addSymbolBlock(parameters) {\n this.symbolBlocks.push(this.getSymbolBlock(parameters));\n return this;\n }\n // ### Convenience functions for creating different types of chord symbol parts.\n /** Add a text block. */\n // eslint-disable-next-line\n addText(text, parameters = {}) {\n const symbolType = SymbolTypes.TEXT;\n return this.addSymbolBlock(Object.assign(Object.assign({}, parameters), { text, symbolType }));\n }\n /** Add a text block with superscript modifier. */\n addTextSuperscript(text) {\n const symbolType = SymbolTypes.TEXT;\n const symbolModifier = SymbolModifiers.SUPERSCRIPT;\n return this.addSymbolBlock({ text, symbolType, symbolModifier });\n }\n /** Add a text block with subscript modifier. */\n addTextSubscript(text) {\n const symbolType = SymbolTypes.TEXT;\n const symbolModifier = SymbolModifiers.SUBSCRIPT;\n return this.addSymbolBlock({ text, symbolType, symbolModifier });\n }\n /** Add a glyph block with superscript modifier. */\n addGlyphSuperscript(glyph) {\n const symbolType = SymbolTypes.GLYPH;\n const symbolModifier = SymbolModifiers.SUPERSCRIPT;\n return this.addSymbolBlock({ glyph, symbolType, symbolModifier });\n }\n /** Add a glyph block. */\n // eslint-disable-next-line\n addGlyph(glyph, params = {}) {\n const symbolType = SymbolTypes.GLYPH;\n return this.addSymbolBlock(Object.assign(Object.assign({}, params), { glyph, symbolType }));\n }\n /**\n * Add a glyph for each character in 'text'. If the glyph is not available, use text from the font.\n * e.g. `addGlyphOrText('(+5#11)')` will use text for the '5' and '11', and glyphs for everything else.\n */\n // eslint-disable-next-line\n addGlyphOrText(text, params = {}) {\n let str = '';\n for (let i = 0; i < text.length; ++i) {\n const char = text[i];\n if (ChordSymbol.glyphs[char]) {\n if (str.length > 0) {\n this.addText(str, params);\n str = '';\n }\n this.addGlyph(char, params);\n }\n else {\n // Collect consecutive characters with no glyphs.\n str += char;\n }\n }\n if (str.length > 0) {\n this.addText(str, params);\n }\n return this;\n }\n /** Add a line of the given width, used as a continuation of the previous symbol in analysis, or lyrics, etc. */\n // eslint-disable-next-line\n addLine(width, params = {}) {\n const symbolType = SymbolTypes.LINE;\n return this.addSymbolBlock(Object.assign(Object.assign({}, params), { symbolType, width }));\n }\n /**\n * Set the chord symbol's font family, size, weight, style (e.g., `Arial`, `10pt`, `bold`, `italic`).\n *\n * @param f is 1) a `FontInfo` object or\n * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or\n * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided).\n * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt').\n * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900).\n * @param style is a string (e.g., 'italic', 'normal').\n *\n * @override See: Element.\n */\n setFont(f, size, weight, style) {\n super.setFont(f, size, weight, style);\n this.textFormatter = TextFormatter.create(this.textFont);\n return this;\n }\n setEnableKerning(val) {\n this.useKerning = val;\n return this;\n }\n /** Set vertical position of text (above or below stave). */\n setVertical(vj) {\n this.vertical = typeof vj === 'string' ? ChordSymbol.VerticalJustifyString[vj] : vj;\n return this;\n }\n getVertical() {\n return this.vertical;\n }\n /** Set horizontal justification. */\n setHorizontal(hj) {\n this.horizontal = typeof hj === 'string' ? ChordSymbol.HorizontalJustifyString[hj] : hj;\n return this;\n }\n getHorizontal() {\n return this.horizontal;\n }\n getWidth() {\n let width = 0;\n this.symbolBlocks.forEach((symbol) => {\n width += symbol.vAlign ? 0 : symbol.width;\n });\n return width;\n }\n getYOffsetForText(text) {\n var _a;\n let acc = 0;\n let i = 0;\n for (i = 0; i < text.length; ++i) {\n const metrics = this.textFormatter.getGlyphMetrics(text[i]);\n if (metrics) {\n const yMax = (_a = metrics.y_max) !== null && _a !== void 0 ? _a : 0;\n acc = yMax < acc ? yMax : acc;\n }\n }\n const resolution = this.textFormatter.getResolution();\n return i > 0 ? -1 * (acc / resolution) : 0;\n }\n /** Render text and glyphs above/below the note. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n // We're changing context parameters. Save current state.\n ctx.save();\n const classString = Object.keys(this.getAttribute('classes')).join(' ');\n ctx.openGroup(classString, this.getAttribute('id'));\n const start = note.getModifierStartXY(Modifier.Position.ABOVE, this.index);\n ctx.setFont(this.textFont);\n let y;\n // The position of the text varies based on whether or not the note\n // has a stem.\n const hasStem = note.hasStem();\n const stave = note.checkStave();\n if (this.vertical === ChordSymbolVerticalJustify.BOTTOM) {\n // HACK: We need to compensate for the text's height since its origin is bottom-right.\n y = stave.getYForBottomText(this.text_line + Tables.TEXT_HEIGHT_OFFSET_HACK);\n if (hasStem) {\n const stem_ext = note.checkStem().getExtents();\n const spacing = stave.getSpacingBetweenLines();\n const stem_base = note.getStemDirection() === 1 ? stem_ext.baseY : stem_ext.topY;\n y = Math.max(y, stem_base + spacing * (this.text_line + 2));\n }\n }\n else {\n // (this.vertical === VerticalJustify.TOP)\n y = Math.min(stave.getYForTopText(this.text_line), note.getYs()[0] - 10);\n if (hasStem) {\n const stem_ext = note.checkStem().getExtents();\n const spacing = stave.getSpacingBetweenLines();\n y = Math.min(y, stem_ext.topY - 5 - spacing * this.text_line);\n }\n }\n let x = start.x;\n if (this.horizontal === ChordSymbolHorizontalJustify.LEFT) {\n x = start.x;\n }\n else if (this.horizontal === ChordSymbolHorizontalJustify.RIGHT) {\n x = start.x + this.getWidth();\n }\n else if (this.horizontal === ChordSymbolHorizontalJustify.CENTER) {\n x = start.x - this.getWidth() / 2;\n }\n else {\n // HorizontalJustify.CENTER_STEM\n x = note.getStemX() - this.getWidth() / 2;\n }\n L('Rendering ChordSymbol: ', this.textFormatter, x, y);\n this.symbolBlocks.forEach((symbol) => {\n const isSuper = ChordSymbol.isSuperscript(symbol);\n const isSub = ChordSymbol.isSubscript(symbol);\n let curY = y;\n L('shift was ', symbol.xShift, symbol.yShift);\n L('curY pre sub ', curY);\n if (isSuper) {\n curY += this.superscriptOffset;\n }\n if (isSub) {\n curY += this.subscriptOffset;\n }\n L('curY sup/sub ', curY);\n if (symbol.symbolType === SymbolTypes.TEXT) {\n if (isSuper || isSub) {\n ctx.save();\n if (this.textFont) {\n const { family, size, weight, style } = this.textFont;\n const smallerFontSize = Font.scaleSize(size, ChordSymbol.superSubRatio);\n ctx.setFont(family, smallerFontSize, weight, style);\n }\n }\n // TODO???\n // We estimate the text width, fill it in with the empirical value so the formatting is even.\n // const textDim = ctx.measureText(symbol.text);\n // symbol.width = textDim.width;\n L('Rendering Text: ', symbol.text, x + symbol.xShift, curY + symbol.yShift);\n ctx.fillText(symbol.text, x + symbol.xShift, curY + symbol.yShift);\n if (isSuper || isSub) {\n ctx.restore();\n }\n }\n else if (symbol.symbolType === SymbolTypes.GLYPH && symbol.glyph) {\n curY += symbol.yShift;\n L('Rendering Glyph: ', symbol.glyph.code, x + symbol.xShift, curY);\n symbol.glyph.render(ctx, x + symbol.xShift, curY);\n }\n else if (symbol.symbolType === SymbolTypes.LINE) {\n L('Rendering Line : ', symbol.width, x, curY);\n ctx.beginPath();\n ctx.setLineWidth(1); // ?\n ctx.moveTo(x, y);\n ctx.lineTo(x + symbol.width, curY);\n ctx.stroke();\n }\n x += symbol.width;\n if (symbol.vAlign) {\n x += symbol.xShift;\n }\n });\n ctx.closeGroup();\n ctx.restore();\n }\n}\nChordSymbol.DEBUG = false;\n// Chord symbols can be positioned and justified relative to the note.\nChordSymbol.HorizontalJustify = ChordSymbolHorizontalJustify;\nChordSymbol.HorizontalJustifyString = {\n left: ChordSymbolHorizontalJustify.LEFT,\n right: ChordSymbolHorizontalJustify.RIGHT,\n center: ChordSymbolHorizontalJustify.CENTER,\n centerStem: ChordSymbolHorizontalJustify.CENTER_STEM,\n};\nChordSymbol.VerticalJustify = ChordSymbolVerticalJustify;\nChordSymbol.VerticalJustifyString = {\n top: ChordSymbolVerticalJustify.TOP,\n above: ChordSymbolVerticalJustify.TOP,\n below: ChordSymbolVerticalJustify.BOTTOM,\n bottom: ChordSymbolVerticalJustify.BOTTOM,\n};\n// Glyph data\nChordSymbol.glyphs = {\n diminished: {\n code: 'csymDiminished',\n },\n dim: {\n code: 'csymDiminished',\n },\n halfDiminished: {\n code: 'csymHalfDiminished',\n },\n '+': {\n code: 'csymAugmented',\n },\n augmented: {\n code: 'csymAugmented',\n },\n majorSeventh: {\n code: 'csymMajorSeventh',\n },\n minor: {\n code: 'csymMinor',\n },\n '-': {\n code: 'csymMinor',\n },\n '(': {\n code: 'csymParensLeftTall',\n },\n leftParen: {\n code: 'csymParensLeftTall',\n },\n ')': {\n code: 'csymParensRightTall',\n },\n rightParen: {\n code: 'csymParensRightTall',\n },\n leftBracket: {\n code: 'csymBracketLeftTall',\n },\n rightBracket: {\n code: 'csymBracketRightTall',\n },\n leftParenTall: {\n code: 'csymParensLeftVeryTall',\n },\n rightParenTall: {\n code: 'csymParensRightVeryTall',\n },\n '/': {\n code: 'csymDiagonalArrangementSlash',\n },\n over: {\n code: 'csymDiagonalArrangementSlash',\n },\n '#': {\n code: 'accidentalSharp',\n },\n b: {\n code: 'accidentalFlat',\n },\n};\nChordSymbol.symbolTypes = SymbolTypes;\nChordSymbol.symbolModifiers = SymbolModifiers;\n/** Currently unused. */\nChordSymbol.noFormat = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Fraction } from './fraction';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nexport var VoiceMode;\n(function (VoiceMode) {\n VoiceMode[VoiceMode[\"STRICT\"] = 1] = \"STRICT\";\n VoiceMode[VoiceMode[\"SOFT\"] = 2] = \"SOFT\";\n VoiceMode[VoiceMode[\"FULL\"] = 3] = \"FULL\";\n})(VoiceMode || (VoiceMode = {}));\n/**\n * `Voice` is mainly a container object to group `Tickables` for formatting.\n */\nexport class Voice extends Element {\n constructor(time, options) {\n super();\n this.resolutionMultiplier = 1;\n this.mode = VoiceMode.STRICT;\n this.preFormatted = false;\n this.ticksUsed = new Fraction(0, 1);\n this.largestTickWidth = 0;\n this.tickables = [];\n this.options = Object.assign({ softmaxFactor: 100 }, options);\n // Convert the `time` string into a VoiceTime object if necessary.\n let voiceTime;\n if (typeof time === 'string') {\n // Time signature shortcut: \"4/4\", \"3/8\", etc.\n const match = time.match(/(\\d+)\\/(\\d+)/);\n if (match) {\n voiceTime = {\n num_beats: parseInt(match[1]),\n beat_value: parseInt(match[2]),\n };\n }\n }\n else {\n voiceTime = time;\n }\n // Default time signature is 4/4.\n this.time = Object.assign({ num_beats: 4, beat_value: 4, resolution: Tables.RESOLUTION }, voiceTime);\n // Recalculate total ticks.\n this.totalTicks = new Fraction(this.time.num_beats * (this.time.resolution / this.time.beat_value), 1);\n this.smallestTickCount = this.totalTicks.clone();\n }\n static get CATEGORY() {\n return Category.Voice;\n }\n /**\n * Modes allow the addition of ticks in three different ways:\n * - STRICT: This is the default. Ticks must fill the voice.\n * - SOFT: Ticks can be added without restrictions.\n * - FULL: Ticks do not need to fill the voice, but can't exceed the maximum tick length.\n */\n static get Mode() {\n return VoiceMode;\n }\n /** Get the total ticks in the voice. */\n getTotalTicks() {\n return this.totalTicks;\n }\n /** Get the total ticks used in the voice by all the tickables. */\n getTicksUsed() {\n return this.ticksUsed;\n }\n /** Get the largest width of all the tickables. */\n getLargestTickWidth() {\n return this.largestTickWidth;\n }\n /** Get the tick count for the shortest tickable */\n getSmallestTickCount() {\n return this.smallestTickCount;\n }\n /** Get the tickables in the voice. */\n getTickables() {\n return this.tickables;\n }\n /** Get the voice mode. */\n getMode() {\n return this.mode;\n }\n /**\n * Set the voice mode.\n * @param mode value from `VoiceMode`\n */\n setMode(mode) {\n this.mode = mode;\n return this;\n }\n /** Get the resolution multiplier for the voice. */\n getResolutionMultiplier() {\n return this.resolutionMultiplier;\n }\n /** Get the actual tick resolution for the voice. */\n getActualResolution() {\n return this.resolutionMultiplier * this.time.resolution;\n }\n /** Set the voice's stave. */\n setStave(stave) {\n this.stave = stave;\n // Reset the bounding box so we can reformat.\n this.boundingBox = undefined;\n return this;\n }\n getStave() {\n return this.stave;\n }\n /** Get the bounding box for the voice. */\n getBoundingBox() {\n if (!this.boundingBox) {\n const stave = this.checkStave();\n let boundingBox = undefined;\n for (let i = 0; i < this.tickables.length; ++i) {\n const tickable = this.tickables[i];\n tickable.setStave(stave);\n const bb = tickable.getBoundingBox();\n if (bb) {\n boundingBox = boundingBox ? boundingBox.mergeWith(bb) : bb;\n }\n }\n this.boundingBox = boundingBox;\n }\n return this.boundingBox;\n }\n /** Set the voice mode to strict or soft. */\n setStrict(strict) {\n this.mode = strict ? VoiceMode.STRICT : VoiceMode.SOFT;\n return this;\n }\n /** Determine if the voice is complete according to the voice mode. */\n isComplete() {\n if (this.mode === VoiceMode.STRICT || this.mode === VoiceMode.FULL) {\n return this.ticksUsed.equals(this.totalTicks);\n }\n else {\n return true;\n }\n }\n /**\n * We use softmax to layout the tickables proportional to the exponent of\n * their duration. The softmax factor is used to determine the 'linearness' of\n * the layout.\n *\n * The softmax of all the tickables in this voice should sum to 1.\n */\n setSoftmaxFactor(factor) {\n this.options.softmaxFactor = factor;\n return this;\n }\n /**\n * Calculate the sum of the exponents of all the ticks in this voice to use\n * as the denominator of softmax.\n */\n reCalculateExpTicksUsed() {\n const totalTicks = this.ticksUsed.value();\n const exp = (tickable) => Math.pow(this.options.softmaxFactor, tickable.getTicks().value() / totalTicks);\n this.expTicksUsed = this.tickables.map(exp).reduce((a, b) => a + b, 0);\n return this.expTicksUsed;\n }\n /** Get the softmax-scaled value of a tick duration. 'tickValue' is a number. */\n softmax(tickValue) {\n if (!this.expTicksUsed) {\n this.expTicksUsed = this.reCalculateExpTicksUsed();\n }\n const totalTicks = this.ticksUsed.value();\n const exp = (v) => Math.pow(this.options.softmaxFactor, v / totalTicks);\n const sm = exp(tickValue) / this.expTicksUsed;\n return sm;\n }\n /** Add a tickable to the voice. */\n addTickable(tickable) {\n if (!tickable.shouldIgnoreTicks()) {\n const ticks = tickable.getTicks();\n // Update the total ticks for this line.\n this.ticksUsed.add(ticks);\n this.expTicksUsed = 0; // reset\n if ((this.mode === VoiceMode.STRICT || this.mode === VoiceMode.FULL) &&\n this.ticksUsed.greaterThan(this.totalTicks)) {\n this.ticksUsed.subtract(ticks);\n throw new RuntimeError('BadArgument', 'Too many ticks.');\n }\n // Track the smallest tickable for formatting.\n if (ticks.lessThan(this.smallestTickCount)) {\n this.smallestTickCount = ticks.clone();\n }\n this.resolutionMultiplier = this.ticksUsed.denominator;\n // Expand total ticks using denominator from ticks used.\n this.totalTicks.add(0, this.ticksUsed.denominator);\n }\n // Add the tickable to the line.\n this.tickables.push(tickable);\n tickable.setVoice(this);\n return this;\n }\n /** Add an array of tickables to the voice. */\n addTickables(tickables) {\n for (let i = 0; i < tickables.length; ++i) {\n this.addTickable(tickables[i]);\n }\n return this;\n }\n /** Preformat the voice by applying the voice's stave to each note. */\n preFormat() {\n if (this.preFormatted)\n return this;\n const stave = this.checkStave();\n this.tickables.forEach((tickable) => {\n if (!tickable.getStave()) {\n tickable.setStave(stave);\n }\n });\n this.preFormatted = true;\n return this;\n }\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n /**\n * Render the voice onto the canvas `context` and an optional `stave`.\n * If `stave` is omitted, it is expected that the notes have staves\n * already set.\n *\n * This method also calculates the voice's boundingBox while drawing\n * the notes. Note the similarities with this.getBoundingBox().\n */\n draw(context = this.checkContext(), stave) {\n stave = stave !== null && stave !== void 0 ? stave : this.stave;\n this.setRendered();\n let boundingBox = undefined;\n for (let i = 0; i < this.tickables.length; ++i) {\n const tickable = this.tickables[i];\n // Set the stave if provided.\n if (stave) {\n tickable.setStave(stave);\n }\n defined(tickable.getStave(), 'MissingStave', 'The voice cannot draw tickables without staves.');\n const bb = tickable.getBoundingBox();\n if (bb) {\n boundingBox = boundingBox ? boundingBox.mergeWith(bb) : bb;\n }\n tickable.setContext(context);\n tickable.drawWithStyle();\n }\n this.boundingBox = boundingBox;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Note } from './note';\nimport { Barline, BarlineType } from './stavebarline';\nimport { Category } from './typeguard';\nimport { log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (BarNote.DEBUG)\n log('Vex.Flow.BarNote', args);\n}\n/**\n * A `BarNote` is used to render bar lines (from `barline.ts`). `BarNote`s can\n * be added to a voice and rendered in the middle of a stave. Since it has no\n * duration, it consumes no `tick`s, and is dealt with appropriately by the formatter.\n *\n * See `tests/barnote_tests.ts` for usage examples.\n */\nexport class BarNote extends Note {\n constructor(type = BarlineType.SINGLE) {\n super({ duration: 'b' });\n this.metrics = {\n widths: {},\n };\n const TYPE = BarlineType;\n this.metrics.widths = {\n [TYPE.SINGLE]: 8,\n [TYPE.DOUBLE]: 12,\n [TYPE.END]: 15,\n [TYPE.REPEAT_BEGIN]: 14,\n [TYPE.REPEAT_END]: 14,\n [TYPE.REPEAT_BOTH]: 18,\n [TYPE.NONE]: 0,\n };\n // Tell the formatter that bar notes have no duration.\n this.ignore_ticks = true;\n this.setType(type);\n }\n static get CATEGORY() {\n return Category.BarNote;\n }\n /** Get the type of bar note.*/\n getType() {\n return this.type;\n }\n /** Set the type of bar note. */\n setType(type) {\n this.type = typeof type === 'string' ? Barline.typeString[type] : type;\n // Set width to width of relevant `Barline`.\n this.setWidth(this.metrics.widths[this.type]);\n return this;\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n /** Overridden to ignore. */\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n /** Render note to stave. */\n draw() {\n const ctx = this.checkContext();\n L('Rendering bar line at: ', this.getAbsoluteX());\n if (this.style)\n this.applyStyle(ctx);\n const barline = new Barline(this.type);\n barline.setX(this.getAbsoluteX());\n barline.draw(this.checkStave());\n if (this.style)\n this.restoreStyle(ctx);\n this.setRendered();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.BarNote.DEBUG` to `true`. */\nBarNote.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Modifier } from './modifier';\nimport { TextFormatter } from './textformatter';\nimport { Category, isTabNote } from './typeguard';\nimport { RuntimeError } from './util';\n/** Bend implements tablature bends. */\nexport class Bend extends Modifier {\n /**\n * Example of a phrase:\n * ```\n * [{\n * type: UP,\n * text: \"whole\"\n * width: 8;\n * },\n * {\n * type: DOWN,\n * text: \"whole\"\n * width: 8;\n * },\n * {\n * type: UP,\n * text: \"half\"\n * width: 8;\n * },\n * {\n * type: UP,\n * text: \"whole\"\n * width: 8;\n * },\n * {\n * type: DOWN,\n * text: \"1 1/2\"\n * width: 8;\n * }]\n * ```\n * @param text text for bend (\"Full\", \"Half\", etc.) (DEPRECATED)\n * @param release if true, render a release. (DEPRECATED)\n * @param phrase if set, ignore \"text\" and \"release\", and use the more sophisticated phrase specified\n */\n constructor(text, release = false, phrase) {\n super();\n this.text = text;\n this.x_shift = 0;\n this.release = release;\n this.tap = '';\n this.resetFont();\n this.render_options = {\n line_width: 1.5,\n line_style: '#777777',\n bend_width: 8,\n release_width: 8,\n };\n if (phrase) {\n this.phrase = phrase;\n }\n else {\n // Backward compatibility\n this.phrase = [{ type: Bend.UP, text: this.text }];\n if (this.release)\n this.phrase.push({ type: Bend.DOWN, text: '' });\n }\n this.updateWidth();\n }\n static get CATEGORY() {\n return Category.Bend;\n }\n static get UP() {\n return 0;\n }\n static get DOWN() {\n return 1;\n }\n // Arrange bends in `ModifierContext`\n static format(bends, state) {\n if (!bends || bends.length === 0)\n return false;\n let last_width = 0;\n // Format Bends\n for (let i = 0; i < bends.length; ++i) {\n const bend = bends[i];\n const note = bend.checkAttachedNote();\n if (isTabNote(note)) {\n const stringPos = note.leastString() - 1;\n if (state.top_text_line < stringPos) {\n state.top_text_line = stringPos;\n }\n }\n bend.setXShift(last_width);\n last_width = bend.getWidth();\n bend.setTextLine(state.top_text_line);\n }\n state.right_shift += last_width;\n state.top_text_line += 1;\n return true;\n }\n /** Set horizontal shift in pixels. */\n setXShift(value) {\n this.x_shift = value;\n this.updateWidth();\n return this;\n }\n setTap(value) {\n this.tap = value;\n return this;\n }\n /** Get text provided in the constructor. */\n getText() {\n return this.text;\n }\n getTextHeight() {\n const textFormatter = TextFormatter.create(this.textFont);\n return textFormatter.maxHeight;\n }\n /** Recalculate width. */\n updateWidth() {\n const textFormatter = TextFormatter.create(this.textFont);\n const measureText = (text) => {\n return textFormatter.getWidthForTextInPx(text);\n };\n let totalWidth = 0;\n for (let i = 0; i < this.phrase.length; ++i) {\n const bend = this.phrase[i];\n if (bend.width !== undefined) {\n totalWidth += bend.width;\n }\n else {\n const additional_width = bend.type === Bend.UP ? this.render_options.bend_width : this.render_options.release_width;\n bend.width = Math.max(additional_width, measureText(bend.text)) + 3;\n bend.draw_width = bend.width / 2;\n totalWidth += bend.width;\n }\n }\n this.setWidth(totalWidth + this.x_shift);\n return this;\n }\n /** Draw the bend on the rendering context. */\n draw() {\n var _a;\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(Modifier.Position.RIGHT, this.index);\n start.x += 3;\n start.y += 0.5;\n const x_shift = this.x_shift;\n const stave = note.checkStave();\n const spacing = stave.getSpacingBetweenLines();\n const lowestY = note.getYs().reduce((a, b) => (a < b ? a : b));\n // this.text_line is relative to top string in the group.\n const bend_height = start.y - ((this.text_line + 1) * spacing + start.y - lowestY) + 3;\n const annotation_y = start.y - ((this.text_line + 1) * spacing + start.y - lowestY) - 1;\n const renderBend = (x, y, width, height) => {\n const cp_x = x + width;\n const cp_y = y;\n ctx.save();\n ctx.beginPath();\n ctx.setLineWidth(this.render_options.line_width);\n ctx.setStrokeStyle(this.render_options.line_style);\n ctx.setFillStyle(this.render_options.line_style);\n ctx.moveTo(x, y);\n ctx.quadraticCurveTo(cp_x, cp_y, x + width, height);\n ctx.stroke();\n ctx.restore();\n };\n const renderRelease = (x, y, width, height) => {\n ctx.save();\n ctx.beginPath();\n ctx.setLineWidth(this.render_options.line_width);\n ctx.setStrokeStyle(this.render_options.line_style);\n ctx.setFillStyle(this.render_options.line_style);\n ctx.moveTo(x, height);\n ctx.quadraticCurveTo(x + width, height, x + width, y);\n ctx.stroke();\n ctx.restore();\n };\n const renderArrowHead = (x, y, direction) => {\n const width = 4;\n const yBase = y + width * direction;\n ctx.beginPath();\n ctx.moveTo(x, y); // tip of the arrow\n ctx.lineTo(x - width, yBase);\n ctx.lineTo(x + width, yBase);\n ctx.closePath();\n ctx.fill();\n };\n const renderText = (x, text) => {\n ctx.save();\n ctx.setFont(this.textFont);\n const render_x = x - ctx.measureText(text).width / 2;\n ctx.fillText(text, render_x, annotation_y);\n ctx.restore();\n };\n let last_bend = undefined;\n let last_bend_draw_width = 0;\n let last_drawn_width = 0;\n if ((_a = this.tap) === null || _a === void 0 ? void 0 : _a.length) {\n const tapStart = note.getModifierStartXY(Modifier.Position.CENTER, this.index);\n renderText(tapStart.x, this.tap);\n }\n for (let i = 0; i < this.phrase.length; ++i) {\n const bend = this.phrase[i];\n if (!bend.draw_width)\n bend.draw_width = 0;\n if (i === 0)\n bend.draw_width += x_shift;\n last_drawn_width = bend.draw_width + last_bend_draw_width - (i === 1 ? x_shift : 0);\n if (bend.type === Bend.UP) {\n if (last_bend && last_bend.type === Bend.UP) {\n renderArrowHead(start.x, bend_height, +1);\n }\n renderBend(start.x, start.y, last_drawn_width, bend_height);\n }\n if (bend.type === Bend.DOWN) {\n if (last_bend && last_bend.type === Bend.UP) {\n renderRelease(start.x, start.y, last_drawn_width, bend_height);\n }\n if (last_bend && last_bend.type === Bend.DOWN) {\n renderArrowHead(start.x, start.y, -1);\n renderRelease(start.x, start.y, last_drawn_width, bend_height);\n }\n if (!last_bend) {\n last_drawn_width = bend.draw_width;\n renderRelease(start.x, start.y, last_drawn_width, bend_height);\n }\n }\n renderText(start.x + last_drawn_width, bend.text);\n last_bend = bend;\n last_bend_draw_width = bend.draw_width;\n last_bend.x = start.x;\n start.x += last_drawn_width;\n }\n if (!last_bend || last_bend.x == undefined) {\n throw new RuntimeError('NoLastBendForBend', 'Internal error.');\n }\n // Final arrowhead and text\n if (last_bend.type === Bend.UP) {\n renderArrowHead(last_bend.x + last_drawn_width, bend_height, +1);\n }\n else if (last_bend.type === Bend.DOWN) {\n renderArrowHead(last_bend.x + last_drawn_width, start.y, -1);\n }\n }\n}\n/** Default text font. */\nBend.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n//\n// This class implements dot modifiers for notes.\nimport { Modifier } from './modifier';\nimport { Category, isGraceNote, isStaveNote, isTabNote } from './typeguard';\nimport { RuntimeError } from './util';\nexport class Dot extends Modifier {\n constructor() {\n super();\n this.position = Modifier.Position.RIGHT;\n this.radius = 2;\n this.setWidth(5);\n this.dot_shiftY = 0;\n }\n static get CATEGORY() {\n return Category.Dot;\n }\n /** Returns the dots associated to a Note. */\n static getDots(note) {\n return note.getModifiersByType(Dot.CATEGORY);\n }\n /** Add a dot on the specified keys to the notes. */\n static buildAndAttach(notes, options) {\n for (const note of notes) {\n if (options === null || options === void 0 ? void 0 : options.all) {\n for (let i = 0; i < note.keys.length; i++) {\n const dot = new Dot();\n dot.setDotShiftY(note.glyph.dot_shiftY);\n note.addModifier(dot, i);\n }\n }\n else if ((options === null || options === void 0 ? void 0 : options.index) != undefined) {\n const dot = new Dot();\n dot.setDotShiftY(note.glyph.dot_shiftY);\n note.addModifier(dot, options === null || options === void 0 ? void 0 : options.index);\n }\n else {\n const dot = new Dot();\n dot.setDotShiftY(note.glyph.dot_shiftY);\n note.addModifier(dot, 0);\n }\n }\n }\n // Arrange dots inside a ModifierContext.\n static format(dots, state) {\n const right_shift = state.right_shift;\n const dot_spacing = 1;\n if (!dots || dots.length === 0)\n return false;\n const dot_list = [];\n const max_shift_map = {};\n for (let i = 0; i < dots.length; ++i) {\n const dot = dots[i];\n const note = dot.getNote();\n let props;\n let shift;\n if (isStaveNote(note)) {\n const index = dot.checkIndex();\n props = note.getKeyProps()[index];\n // consider right displaced head with no previous modifier\n shift = note.getFirstDotPx();\n }\n else if (isTabNote(note)) {\n props = { line: 0.5 }; // Shim key props for dot placement\n shift = right_shift;\n }\n else {\n // note object is not StaveNote or TabNote.\n throw new RuntimeError('Internal', 'Unexpected instance.');\n }\n const note_id = note.getAttribute('id');\n dot_list.push({ line: props.line, note, note_id, dot });\n max_shift_map[note_id] = Math.max(max_shift_map[note_id] || shift, shift);\n }\n // Sort dots by line number.\n dot_list.sort((a, b) => b.line - a.line);\n let dot_shift = right_shift;\n let x_width = 0;\n let last_line = null;\n let last_note = null;\n let prev_dotted_space = null;\n let half_shiftY = 0;\n for (let i = 0; i < dot_list.length; ++i) {\n const { dot, note, note_id, line } = dot_list[i];\n // Reset the position of the dot every line.\n if (line !== last_line || note !== last_note) {\n dot_shift = max_shift_map[note_id];\n }\n if (!note.isRest() && line !== last_line) {\n if (Math.abs(line % 1) === 0.5) {\n // note is on a space, so no dot shift\n half_shiftY = 0;\n }\n else {\n // note is on a line, so shift dot to space above the line\n half_shiftY = 0.5;\n if (last_note != null && !last_note.isRest() && last_line != null && last_line - line === 0.5) {\n // previous note on a space, so shift dot to space below the line\n half_shiftY = -0.5;\n }\n else if (line + half_shiftY === prev_dotted_space) {\n // previous space is dotted, so shift dot to space below the line\n half_shiftY = -0.5;\n }\n }\n }\n // convert half_shiftY to a multiplier for dots.draw()\n if (note.isRest()) {\n dot.dot_shiftY += -half_shiftY;\n }\n else {\n dot.dot_shiftY = -half_shiftY;\n }\n prev_dotted_space = line + half_shiftY;\n dot.setXShift(dot_shift);\n dot_shift += dot.getWidth() + dot_spacing; // spacing\n x_width = dot_shift > x_width ? dot_shift : x_width;\n last_line = line;\n last_note = note;\n }\n // Update state.\n state.right_shift += x_width;\n return true;\n }\n setNote(note) {\n this.note = note;\n if (isGraceNote(note)) {\n this.radius *= 0.5;\n this.setWidth(3);\n }\n return this;\n }\n setDotShiftY(y) {\n this.dot_shiftY = y;\n return this;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const stave = note.checkStave();\n const lineSpace = stave.getSpacingBetweenLines();\n const start = note.getModifierStartXY(this.position, this.index, { forceFlagRight: true });\n // Set the starting y coordinate to the base of the stem for TabNotes.\n if (isTabNote(note)) {\n start.y = note.getStemExtents().baseY;\n }\n const x = start.x + this.x_shift + this.width - this.radius;\n const y = start.y + this.y_shift + this.dot_shiftY * lineSpace;\n ctx.beginPath();\n ctx.arc(x, y, this.radius, 0, Math.PI * 2, false);\n ctx.fill();\n }\n}\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n// Author Larry Kuhns 2013\n// Class to draws string numbers into the notation.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { Tables } from './tables';\nimport { TextFormatter } from './textformatter';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class FretHandFinger extends Modifier {\n constructor(finger) {\n super();\n this.finger = finger;\n this.width = 7;\n this.position = Modifier.Position.LEFT; // Default position above stem or note head\n this.x_shift = 0;\n this.y_shift = 0;\n this.x_offset = 0; // Horizontal offset from default\n this.y_offset = 0; // Vertical offset from default\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.FretHandFinger;\n }\n // Arrange fingerings inside a ModifierContext.\n static format(nums, state) {\n const { left_shift, right_shift } = state;\n const num_spacing = 1;\n if (!nums || nums.length === 0)\n return false;\n const nums_list = [];\n let prev_note = null;\n let shiftLeft = 0;\n let shiftRight = 0;\n for (let i = 0; i < nums.length; ++i) {\n const num = nums[i];\n const note = num.getNote();\n const pos = num.getPosition();\n const index = num.checkIndex();\n const props = note.getKeyProps()[index];\n const textFormatter = TextFormatter.create(num.textFont);\n const textHeight = textFormatter.maxHeight;\n if (num.position === ModifierPosition.ABOVE) {\n state.top_text_line += textHeight / Tables.STAVE_LINE_DISTANCE + 0.5;\n }\n if (num.position === ModifierPosition.BELOW) {\n state.text_line += textHeight / Tables.STAVE_LINE_DISTANCE + 0.5;\n }\n if (note !== prev_note) {\n for (let n = 0; n < note.keys.length; ++n) {\n if (left_shift === 0) {\n shiftLeft = Math.max(note.getLeftDisplacedHeadPx(), shiftLeft);\n }\n if (right_shift === 0) {\n shiftRight = Math.max(note.getRightDisplacedHeadPx(), shiftRight);\n }\n }\n prev_note = note;\n }\n nums_list.push({\n note,\n num,\n pos,\n line: props.line,\n shiftL: shiftLeft,\n shiftR: shiftRight,\n });\n }\n // Sort fingernumbers by line number.\n nums_list.sort((a, b) => b.line - a.line);\n let numShiftL = 0;\n let numShiftR = 0;\n let xWidthL = 0;\n let xWidthR = 0;\n let lastLine = null;\n let lastNote = null;\n for (let i = 0; i < nums_list.length; ++i) {\n let num_shift = 0;\n const { note, pos, num, line, shiftL, shiftR } = nums_list[i];\n // Reset the position of the string number every line.\n if (line !== lastLine || note !== lastNote) {\n numShiftL = left_shift + shiftL;\n numShiftR = right_shift + shiftR;\n }\n const numWidth = num.getWidth() + num_spacing;\n if (pos === Modifier.Position.LEFT) {\n num.setXShift(left_shift + numShiftL);\n num_shift = left_shift + numWidth; // spacing\n xWidthL = num_shift > xWidthL ? num_shift : xWidthL;\n }\n else if (pos === Modifier.Position.RIGHT) {\n num.setXShift(numShiftR);\n num_shift = shiftRight + numWidth; // spacing\n xWidthR = num_shift > xWidthR ? num_shift : xWidthR;\n }\n lastLine = line;\n lastNote = note;\n }\n state.left_shift += xWidthL;\n state.right_shift += xWidthR;\n return true;\n }\n static easyScoreHook({ fingerings } = {}, note, builder) {\n fingerings === null || fingerings === void 0 ? void 0 : fingerings.split(',').map((fingeringString) => {\n const split = fingeringString.trim().split('.');\n const params = { number: split[0] };\n if (split[1])\n params.position = split[1];\n return builder.getFactory().Fingering(params);\n }).map((fingering, index) => note.addModifier(fingering, index));\n }\n setFretHandFinger(finger) {\n this.finger = finger;\n return this;\n }\n getFretHandFinger() {\n return this.finger;\n }\n setOffsetX(x) {\n this.x_offset = x;\n return this;\n }\n setOffsetY(y) {\n this.y_offset = y;\n return this;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(this.position, this.index);\n let dot_x = start.x + this.x_shift + this.x_offset;\n let dot_y = start.y + this.y_shift + this.y_offset + 5;\n switch (this.position) {\n case Modifier.Position.ABOVE:\n dot_x -= 4;\n dot_y -= 12;\n break;\n case Modifier.Position.BELOW:\n dot_x -= 2;\n dot_y += 10;\n break;\n case Modifier.Position.LEFT:\n dot_x -= this.width;\n break;\n case Modifier.Position.RIGHT:\n dot_x += 1;\n break;\n default:\n throw new RuntimeError('InvalidPosition', `The position ${this.position} does not exist`);\n }\n ctx.save();\n ctx.setFont(this.textFont);\n ctx.fillText('' + this.finger, dot_x, dot_y);\n ctx.restore();\n }\n}\nFretHandFinger.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 9,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// This class implements varies types of ties between contiguous notes. The\n// ties include: regular ties, hammer ons, pull offs, and slides.\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StaveTie extends Element {\n /**\n * @param notes is a struct that has:\n *\n * {\n * first_note: Note,\n * last_note: Note,\n * first_indices: [n1, n2, n3],\n * last_indices: [n1, n2, n3]\n * }\n *\n * @param text\n */\n constructor(notes, text) {\n super();\n this.setNotes(notes);\n this.text = text;\n this.render_options = {\n cp1: 8,\n cp2: 12,\n text_shift_x: 0,\n first_x_shift: 0,\n last_x_shift: 0,\n y_shift: 7,\n tie_spacing: 0,\n };\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StaveTie;\n }\n setDirection(direction) {\n this.direction = direction;\n return this;\n }\n /**\n * Set the notes to attach this tie to.\n *\n * @param {!Object} notes The notes to tie up.\n */\n setNotes(notes) {\n if (!notes.first_note && !notes.last_note) {\n throw new RuntimeError('BadArguments', 'Tie needs to have either first_note or last_note set.');\n }\n if (!notes.first_indices) {\n notes.first_indices = [0];\n }\n if (!notes.last_indices) {\n notes.last_indices = [0];\n }\n if (notes.first_indices.length !== notes.last_indices.length) {\n throw new RuntimeError('BadArguments', 'Tied notes must have same number of indices.');\n }\n this.notes = notes;\n return this;\n }\n /**\n * @return {boolean} Returns true if this is a partial bar.\n */\n isPartial() {\n return !this.notes.first_note || !this.notes.last_note;\n }\n renderTie(params) {\n if (params.first_ys.length === 0 || params.last_ys.length === 0) {\n throw new RuntimeError('BadArguments', 'No Y-values to render');\n }\n const ctx = this.checkContext();\n let cp1 = this.render_options.cp1;\n let cp2 = this.render_options.cp2;\n if (Math.abs(params.last_x_px - params.first_x_px) < 10) {\n cp1 = 2;\n cp2 = 8;\n }\n const first_x_shift = this.render_options.first_x_shift;\n const last_x_shift = this.render_options.last_x_shift;\n const y_shift = this.render_options.y_shift * params.direction;\n // setNotes(...) verified that first_indices and last_indices are not undefined.\n // As a result, we use the ! non-null assertion operator here.\n // eslint-disable-next-line\n const first_indices = this.notes.first_indices;\n // eslint-disable-next-line\n const last_indices = this.notes.last_indices;\n for (let i = 0; i < first_indices.length; ++i) {\n const cp_x = (params.last_x_px + last_x_shift + (params.first_x_px + first_x_shift)) / 2;\n const first_y_px = params.first_ys[first_indices[i]] + y_shift;\n const last_y_px = params.last_ys[last_indices[i]] + y_shift;\n if (isNaN(first_y_px) || isNaN(last_y_px)) {\n throw new RuntimeError('BadArguments', 'Bad indices for tie rendering.');\n }\n const top_cp_y = (first_y_px + last_y_px) / 2 + cp1 * params.direction;\n const bottom_cp_y = (first_y_px + last_y_px) / 2 + cp2 * params.direction;\n ctx.beginPath();\n ctx.moveTo(params.first_x_px + first_x_shift, first_y_px);\n ctx.quadraticCurveTo(cp_x, top_cp_y, params.last_x_px + last_x_shift, last_y_px);\n ctx.quadraticCurveTo(cp_x, bottom_cp_y, params.first_x_px + first_x_shift, first_y_px);\n ctx.closePath();\n ctx.fill();\n }\n }\n renderText(first_x_px, last_x_px) {\n var _a, _b, _c;\n if (!this.text)\n return;\n const ctx = this.checkContext();\n let center_x = (first_x_px + last_x_px) / 2;\n center_x -= ctx.measureText(this.text).width / 2;\n const stave = (_b = (_a = this.notes.first_note) === null || _a === void 0 ? void 0 : _a.checkStave()) !== null && _b !== void 0 ? _b : (_c = this.notes.last_note) === null || _c === void 0 ? void 0 : _c.checkStave();\n if (stave) {\n ctx.save();\n ctx.setFont(this.textFont);\n ctx.fillText(this.text, center_x + this.render_options.text_shift_x, stave.getYForTopText() - 1);\n ctx.restore();\n }\n }\n draw() {\n this.checkContext();\n this.setRendered();\n const first_note = this.notes.first_note;\n const last_note = this.notes.last_note;\n // Provide some default values so the compiler doesn't complain.\n let first_x_px = 0;\n let last_x_px = 0;\n let first_ys = [0];\n let last_ys = [0];\n let stem_direction = 0;\n if (first_note) {\n first_x_px = first_note.getTieRightX() + this.render_options.tie_spacing;\n stem_direction = first_note.getStemDirection();\n first_ys = first_note.getYs();\n }\n else if (last_note) {\n const stave = last_note.checkStave();\n first_x_px = stave.getTieStartX();\n first_ys = last_note.getYs();\n this.notes.first_indices = this.notes.last_indices;\n }\n if (last_note) {\n last_x_px = last_note.getTieLeftX() + this.render_options.tie_spacing;\n stem_direction = last_note.getStemDirection();\n last_ys = last_note.getYs();\n }\n else if (first_note) {\n const stave = first_note.checkStave();\n last_x_px = stave.getTieEndX();\n last_ys = first_note.getYs();\n this.notes.last_indices = this.notes.first_indices;\n }\n if (this.direction) {\n stem_direction = this.direction;\n }\n this.renderTie({\n first_x_px,\n last_x_px,\n first_ys,\n last_ys,\n direction: stem_direction,\n });\n this.renderText(first_x_px, last_x_px);\n return true;\n }\n}\n/** Default text font. */\nStaveTie.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n","// / [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This class implements varies types of ties between contiguous notes. The\n// ties include: regular ties, hammer ons, pull offs, and slides.\nimport { StaveTie } from './stavetie';\nimport { Category } from './typeguard';\nexport class TabTie extends StaveTie {\n static get CATEGORY() {\n return Category.TabTie;\n }\n static createHammeron(notes) {\n return new TabTie(notes, 'H');\n }\n static createPulloff(notes) {\n return new TabTie(notes, 'P');\n }\n /**\n * @param notes is a struct that has:\n * {\n * first_note: Note,\n * last_note: Note,\n * first_indices: [n1, n2, n3],\n * last_indices: [n1, n2, n3]\n * }\n *\n * @param text\n */\n constructor(notes, text) {\n super(notes, text);\n this.render_options.cp1 = 9;\n this.render_options.cp2 = 11;\n this.render_options.y_shift = 3;\n this.direction = -1; // Tab tie's are always face up.\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements `GraceNoteGroup` which is used to format and\n// render grace notes.\nimport { Beam } from './beam';\nimport { Formatter } from './formatter';\nimport { Modifier } from './modifier';\nimport { StaveTie } from './stavetie';\nimport { Tables } from './tables';\nimport { TabTie } from './tabtie';\nimport { Category, isStaveNote } from './typeguard';\nimport { log } from './util';\nimport { Voice } from './voice';\n// To enable logging for this class. Set `GraceNoteGroup.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (GraceNoteGroup.DEBUG)\n log('Vex.Flow.GraceNoteGroup', args);\n}\n/** GraceNoteGroup is used to format and render grace notes. */\nexport class GraceNoteGroup extends Modifier {\n //** `GraceNoteGroup` inherits from `Modifier` and is placed inside a `ModifierContext`. */\n constructor(grace_notes, show_slur) {\n super();\n this.preFormatted = false;\n this.position = Modifier.Position.LEFT;\n this.grace_notes = grace_notes;\n this.width = 0;\n this.show_slur = show_slur;\n this.slur = undefined;\n this.voice = new Voice({\n num_beats: 4,\n beat_value: 4,\n resolution: Tables.RESOLUTION,\n }).setStrict(false);\n this.render_options = {\n slur_y_shift: 0,\n };\n this.beams = [];\n this.voice.addTickables(this.grace_notes);\n return this;\n }\n static get CATEGORY() {\n return Category.GraceNoteGroup;\n }\n /** Arranges groups inside a `ModifierContext`. */\n static format(gracenote_groups, state) {\n const group_spacing_stave = 4;\n const group_spacing_tab = 0;\n if (!gracenote_groups || gracenote_groups.length === 0)\n return false;\n const group_list = [];\n let prev_note = null;\n let shiftL = 0;\n for (let i = 0; i < gracenote_groups.length; ++i) {\n const gracenote_group = gracenote_groups[i];\n const note = gracenote_group.getNote();\n const is_stavenote = isStaveNote(note);\n const spacing = is_stavenote ? group_spacing_stave : group_spacing_tab;\n if (is_stavenote && note !== prev_note) {\n // Iterate through all notes to get the displaced pixels\n for (let n = 0; n < note.keys.length; ++n) {\n shiftL = Math.max(note.getLeftDisplacedHeadPx(), shiftL);\n }\n prev_note = note;\n }\n group_list.push({ shift: shiftL, gracenote_group, spacing });\n }\n // If first note left shift in case it is displaced\n let group_shift = group_list[0].shift;\n let formatWidth;\n for (let i = 0; i < group_list.length; ++i) {\n const gracenote_group = group_list[i].gracenote_group;\n gracenote_group.preFormat();\n formatWidth = gracenote_group.getWidth() + group_list[i].spacing;\n group_shift = Math.max(formatWidth, group_shift);\n }\n for (let i = 0; i < group_list.length; ++i) {\n const gracenote_group = group_list[i].gracenote_group;\n formatWidth = gracenote_group.getWidth() + group_list[i].spacing;\n gracenote_group.setSpacingFromNextModifier(group_shift - Math.min(formatWidth, group_shift));\n }\n state.left_shift += group_shift;\n return true;\n }\n preFormat() {\n if (this.preFormatted)\n return;\n if (!this.formatter) {\n this.formatter = new Formatter();\n }\n this.formatter.joinVoices([this.voice]).format([this.voice], 0, {});\n this.setWidth(this.formatter.getMinTotalWidth());\n this.preFormatted = true;\n }\n beamNotes(grace_notes) {\n grace_notes = grace_notes || this.grace_notes;\n if (grace_notes.length > 1) {\n const beam = new Beam(grace_notes);\n beam.render_options.beam_width = 3;\n beam.render_options.partial_beam_length = 4;\n this.beams.push(beam);\n }\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n getWidth() {\n return this.width;\n }\n getGraceNotes() {\n return this.grace_notes;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n L('Drawing grace note group for:', note);\n this.alignSubNotesWithNote(this.getGraceNotes(), note); // Modifier function\n // Draw grace notes.\n this.grace_notes.forEach((graceNote) => graceNote.setContext(ctx).draw());\n // Draw beams.\n this.beams.forEach((beam) => beam.setContext(ctx).draw());\n if (this.show_slur) {\n // Create and draw slur.\n const is_stavenote = isStaveNote(note);\n const TieClass = is_stavenote ? StaveTie : TabTie;\n this.slur = new TieClass({\n last_note: this.grace_notes[0],\n first_note: note,\n first_indices: [0],\n last_indices: [0],\n });\n this.slur.render_options.cp2 = 12;\n this.slur.render_options.y_shift = (is_stavenote ? 7 : 5) + this.render_options.slur_y_shift;\n this.slur.setContext(ctx).draw();\n }\n }\n}\nGraceNoteGroup.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2016\n//\n// ## Description\n//\n// This file implements `NoteSubGroup` which is used to format and\n// render notes as a `Modifier`\n// ex) ClefNote, TimeSigNote and BarNote.\nimport { Formatter } from './formatter';\nimport { Modifier } from './modifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { Voice } from './voice';\nexport class NoteSubGroup extends Modifier {\n constructor(subNotes) {\n super();\n this.preFormatted = false;\n this.position = Modifier.Position.LEFT;\n this.subNotes = subNotes;\n this.subNotes.forEach((subNote) => {\n subNote.setIgnoreTicks(false);\n });\n this.width = 0;\n this.formatter = new Formatter();\n this.voice = new Voice({\n num_beats: 4,\n beat_value: 4,\n resolution: Tables.RESOLUTION,\n }).setStrict(false);\n this.voice.addTickables(this.subNotes);\n }\n static get CATEGORY() {\n return Category.NoteSubGroup;\n }\n // Arrange groups inside a `ModifierContext`\n static format(groups, state) {\n if (!groups || groups.length === 0)\n return false;\n let width = 0;\n for (let i = 0; i < groups.length; ++i) {\n const group = groups[i];\n group.preFormat();\n width += group.getWidth();\n }\n state.left_shift += width;\n return true;\n }\n preFormat() {\n if (this.preFormatted)\n return;\n this.formatter.joinVoices([this.voice]).format([this.voice], 0);\n this.setWidth(this.formatter.getMinTotalWidth());\n this.preFormatted = true;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n getWidth() {\n return this.width;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n this.alignSubNotesWithNote(this.subNotes, note); // Modifier function\n this.subNotes.forEach((subNote) => subNote.setContext(ctx).drawWithStyle());\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// A formatter for abstract tickable objects, such as notes, chords,\n// tabs, etc.\nimport { Fraction } from './fraction';\nimport { RuntimeError } from './util';\n/**\n * TickContext formats abstract tickable objects, such as notes, chords, tabs, etc.\n */\nexport class TickContext {\n constructor(options) {\n this.preFormatted = false;\n this.postFormatted = false;\n this.tickID = options && options.tickID ? options.tickID : 0;\n this.currentTick = new Fraction(0, 1);\n this.maxTicks = new Fraction(0, 1);\n this.maxTickable = undefined; // Biggest tickable\n this.minTicks = undefined; // this can remian null if all tickables have ignore_ticks\n this.minTickable = undefined;\n this.padding = 1; // padding on each side (width += padding * 2)\n this.x = 0;\n this.xBase = 0; // base x position without xOffset\n this.xOffset = 0; // xBase and xOffset are an alternative way to describe x (x = xB + xO)\n this.tickables = []; // Notes, tabs, chords, lyrics.\n this.tickablesByVoice = {}; // Tickables indexed by voice number\n // Formatting metrics\n this.notePx = 0; // width of widest note in this context\n this.glyphPx = 0; // width of glyph (note head)\n this.leftDisplacedHeadPx = 0; // Extra left pixels for displaced notes\n this.rightDisplacedHeadPx = 0; // Extra right pixels for displaced notes\n this.modLeftPx = 0; // Left modifier pixels\n this.modRightPx = 0; // Right modifier pixels\n this.totalLeftPx = 0; // Total left pixels\n this.totalRightPx = 0; // Total right pixels\n this.tContexts = []; // Parent array of tick contexts\n this.width = 0;\n this.formatterMetrics = {\n // The freedom of a tickcontext is the distance it can move without colliding\n // with neighboring elements. A formatter can set these values during its\n // formatting pass, which a different formatter can then use to fine tune.\n freedom: { left: 0, right: 0 },\n };\n }\n static getNextContext(tContext) {\n const contexts = tContext.tContexts;\n const index = contexts.indexOf(tContext);\n if (index + 1 < contexts.length)\n return contexts[index + 1];\n }\n getTickID() {\n return this.tickID;\n }\n getX() {\n return this.x;\n }\n setX(x) {\n this.x = x;\n this.xBase = x;\n this.xOffset = 0;\n return this;\n }\n getXBase() {\n return this.xBase;\n } // use of xBase and xOffset is optional, avoids offset creep\n setXBase(xBase) {\n this.xBase = xBase;\n this.x = xBase + this.xOffset;\n }\n getXOffset() {\n return this.xOffset;\n }\n setXOffset(xOffset) {\n this.xOffset = xOffset;\n this.x = this.xBase + xOffset;\n }\n getWidth() {\n return this.width + this.padding * 2;\n }\n setPadding(padding) {\n this.padding = padding;\n return this;\n }\n getMaxTicks() {\n return this.maxTicks;\n }\n getMinTicks() {\n return this.minTicks;\n }\n getMaxTickable() {\n return this.maxTickable;\n }\n getMinTickable() {\n return this.minTickable;\n }\n getTickables() {\n return this.tickables;\n }\n /**\n * Introduced on 2020-04-17 as getTickablesForVoice(voiceIndex).\n * https://github.com/0xfe/vexflow/blame/dc97b0cc5bb93171c0038638c34362dc958222ca/src/tickcontext.js#L63\n * Renamed on 2021-08-05 to getTickableForVoice(voiceIndex). Method renamed to singular, since it returns one Tickable.\n */\n getTickableForVoice(voiceIndex) {\n return this.tickablesByVoice[voiceIndex];\n }\n getTickablesByVoice() {\n return this.tickablesByVoice;\n }\n getCenterAlignedTickables() {\n return this.tickables.filter((tickable) => tickable.isCenterAligned());\n }\n /** Gets widths context, note and left/right modifiers for formatting. */\n getMetrics() {\n const { width, glyphPx, notePx, leftDisplacedHeadPx, rightDisplacedHeadPx, modLeftPx, modRightPx, totalLeftPx, totalRightPx, } = this;\n return {\n width,\n glyphPx,\n notePx,\n leftDisplacedHeadPx,\n rightDisplacedHeadPx,\n modLeftPx,\n modRightPx,\n totalLeftPx,\n totalRightPx,\n };\n }\n getCurrentTick() {\n return this.currentTick;\n }\n setCurrentTick(tick) {\n this.currentTick = tick;\n this.preFormatted = false;\n }\n addTickable(tickable, voiceIndex) {\n if (!tickable) {\n throw new RuntimeError('BadArgument', 'Invalid tickable added.');\n }\n if (!tickable.shouldIgnoreTicks()) {\n const ticks = tickable.getTicks();\n if (ticks.greaterThan(this.maxTicks)) {\n this.maxTicks = ticks.clone();\n this.maxTickable = tickable;\n }\n if (this.minTicks == null) {\n this.minTicks = ticks.clone();\n this.minTickable = tickable;\n }\n else if (ticks.lessThan(this.minTicks)) {\n this.minTicks = ticks.clone();\n this.minTickable = tickable;\n }\n }\n tickable.setTickContext(this);\n this.tickables.push(tickable);\n this.tickablesByVoice[voiceIndex || 0] = tickable;\n this.preFormatted = false;\n return this;\n }\n preFormat() {\n if (this.preFormatted)\n return this;\n for (let i = 0; i < this.tickables.length; ++i) {\n const tickable = this.tickables[i];\n tickable.preFormat();\n const metrics = tickable.getMetrics();\n // Maintain max displaced head pixels from all tickables in the context\n this.leftDisplacedHeadPx = Math.max(this.leftDisplacedHeadPx, metrics.leftDisplacedHeadPx);\n this.rightDisplacedHeadPx = Math.max(this.rightDisplacedHeadPx, metrics.rightDisplacedHeadPx);\n // Maintain the widest note for all tickables in the context\n this.notePx = Math.max(this.notePx, metrics.notePx);\n // Maintain the widest note head\n this.glyphPx = Math.max(this.glyphPx, metrics.glyphWidth || 0);\n // Total modifier shift\n this.modLeftPx = Math.max(this.modLeftPx, metrics.modLeftPx);\n this.modRightPx = Math.max(this.modRightPx, metrics.modRightPx);\n // Total shift\n this.totalLeftPx = Math.max(this.totalLeftPx, metrics.modLeftPx + metrics.leftDisplacedHeadPx);\n this.totalRightPx = Math.max(this.totalRightPx, metrics.modRightPx + metrics.rightDisplacedHeadPx);\n // Recalculate the tick context total width\n this.width = this.notePx + this.totalLeftPx + this.totalRightPx;\n }\n return this;\n }\n postFormat() {\n if (this.postFormatted)\n return this;\n this.postFormatted = true;\n return this;\n }\n getFormatterMetrics() {\n return this.formatterMetrics;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Cyril Silverman\n// MIT License\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { TickContext } from './tickcontext';\nimport { Category, isTabNote } from './typeguard';\nimport { defined, log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Ornament.DEBUG)\n log('Vex.Flow.Ornament', args);\n}\n/**\n * Ornament implements ornaments as modifiers that can be\n * attached to notes. The complete list of ornaments is available in\n * `tables.ts` under `Vex.Flow.ornamentCodes`.\n *\n * See `tests/ornament_tests.ts` for usage examples.\n */\nexport class Ornament extends Modifier {\n /**\n * Create a new ornament of type `type`, which is an entry in\n * `Vex.Flow.ornamentCodes` in `tables.ts`.\n */\n constructor(type) {\n super();\n this.type = type;\n this.delayed = false;\n this.render_options = {\n font_scale: 38,\n accidentalLowerPadding: 3,\n accidentalUpperPadding: 3,\n };\n this.ornament = Tables.ornamentCodes(this.type);\n // new ornaments have their origin at the origin, and have more specific\n // metrics. Legacy ornaments do some\n // x scaling, and have hard-coded metrics\n const metrics = this.getMetrics();\n // some jazz ornaments are above or below depending on stem direction.\n this.adjustForStemDirection = false;\n // some jazz ornaments like falls are supposed to overlap with future bars\n // and so we report a different width than they actually take up.\n this.reportedWidth = metrics && metrics.reportedWidth ? metrics.reportedWidth : 0;\n this.stemUpYOffset = metrics && metrics.stemUpYOffset ? metrics.stemUpYOffset : 0;\n this.ornamentAlignWithNoteHead = Ornament.ornamentAlignWithNoteHead.indexOf(this.type) >= 0;\n if (!this.ornament) {\n throw new RuntimeError('ArgumentError', `Ornament not found: '${this.type}'`);\n }\n this.x_shift = metrics ? metrics.xOffset : 0;\n this.y_shift = metrics ? metrics.yOffset : 0;\n this.glyph = new Glyph(this.ornament.code, this.render_options.font_scale, {\n category: `ornament.${this.ornament.code}`,\n });\n // Is this a jazz ornament that goes between this note and the next note.\n if (Ornament.ornamentNoteTransition.indexOf(this.type) >= 0) {\n this.delayed = true;\n }\n // Legacy ornaments need this. I don't know why, but horizontal spacing issues\n // happen if I don't set it.\n if (!metrics) {\n this.glyph.setOrigin(0.5, 1.0); // FIXME: SMuFL won't require a vertical origin shift\n }\n }\n /** Ornaments category string. */\n static get CATEGORY() {\n return Category.Ornament;\n }\n /** Arrange ornaments inside `ModifierContext` */\n static format(ornaments, state) {\n if (!ornaments || ornaments.length === 0)\n return false;\n let width = 0; // width is used by ornaments, which are always centered on the note head\n let right_shift = state.right_shift; // jazz ornaments calculate r/l shift separately\n let left_shift = state.left_shift;\n let yOffset = 0;\n for (let i = 0; i < ornaments.length; ++i) {\n const ornament = ornaments[i];\n const increment = 2;\n if (Ornament.ornamentRelease.indexOf(ornament.type) >= 0) {\n ornament.x_shift += right_shift + 2;\n }\n if (Ornament.ornamentAttack.indexOf(ornament.type) >= 0) {\n ornament.x_shift -= left_shift + 2;\n }\n if (ornament.reportedWidth && ornament.x_shift < 0) {\n left_shift += ornament.reportedWidth;\n }\n else if (ornament.reportedWidth && ornament.x_shift > 0) {\n right_shift += ornament.reportedWidth;\n }\n else {\n width = Math.max(ornament.getWidth(), width);\n }\n // articulations above/below the line can be stacked.\n if (Ornament.ornamentArticulation.indexOf(ornament.type) >= 0) {\n // Unfortunately we don't know the stem direction. So we base it\n // on the line number, but also allow it to be overridden.\n const ornamentNote = defined(ornament.note, 'NoAttachedNote');\n if (ornamentNote.getLineNumber() >= 3 || ornament.getPosition() === Modifier.Position.ABOVE) {\n state.top_text_line += increment;\n ornament.y_shift += yOffset;\n yOffset -= ornament.glyph.bbox.getH();\n }\n else {\n state.text_line += increment;\n ornament.y_shift += yOffset;\n yOffset += ornament.glyph.bbox.getH();\n }\n }\n else {\n if (ornament.getPosition() === Modifier.Position.ABOVE) {\n ornament.setTextLine(state.top_text_line);\n state.top_text_line += increment;\n }\n else {\n ornament.setTextLine(state.text_line);\n state.text_line += increment;\n }\n }\n }\n // Note: 'legit' ornaments don't consider other modifiers when calculating their\n // X position, but jazz ornaments sometimes need to.\n state.left_shift = left_shift + width / 2;\n state.right_shift = right_shift + width / 2;\n return true;\n }\n /**\n * ornamentNoteTransition means the jazz ornament represents an effect from one note to another,\n * these are generally on the top of the staff.\n */\n static get ornamentNoteTransition() {\n return ['flip', 'jazzTurn', 'smear'];\n }\n /**\n * ornamentAttack indicates something that happens in the attach, placed before the note and\n * any accidentals\n */\n static get ornamentAttack() {\n return ['scoop'];\n }\n /**\n * The ornament is aligned based on the note head, but without regard to whether the\n * stem goes up or down.\n */\n static get ornamentAlignWithNoteHead() {\n return ['doit', 'fall', 'fallLong', 'doitLong', 'bend', 'plungerClosed', 'plungerOpen', 'scoop'];\n }\n /**\n * An ornament that happens on the release of the note, generally placed after the\n * note and overlapping the next beat/measure..\n */\n static get ornamentRelease() {\n return ['doit', 'fall', 'fallLong', 'doitLong', 'jazzTurn', 'smear', 'flip'];\n }\n /** ornamentArticulation goes above/below the note based on space availablity */\n static get ornamentArticulation() {\n return ['bend', 'plungerClosed', 'plungerOpen'];\n }\n /**\n * Legacy ornaments have hard-coded metrics. If additional ornament types are\n * added, get their metrics here.\n */\n // eslint-disable-next-line\n getMetrics() {\n return Tables.currentMusicFont().getMetrics().glyphs.jazzOrnaments[this.ornament.code];\n }\n /** Set whether the ornament is to be delayed. */\n setDelayed(delayed) {\n this.delayed = delayed;\n return this;\n }\n /** Set the upper accidental for the ornament. */\n setUpperAccidental(accid) {\n const scale = this.render_options.font_scale / 1.3;\n this.accidentalUpper = new Glyph(Tables.accidentalCodes(accid).code, scale);\n this.accidentalUpper.setOrigin(0.5, 1.0);\n return this;\n }\n /** Set the lower accidental for the ornament. */\n setLowerAccidental(accid) {\n const scale = this.render_options.font_scale / 1.3;\n this.accidentalLower = new Glyph(Tables.accidentalCodes(accid).code, scale);\n this.accidentalLower.setOrigin(0.5, 1.0);\n return this;\n }\n /** Render ornament in position next to note. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const stemDir = note.getStemDirection();\n const stave = note.checkStave();\n const classString = Object.keys(this.getAttribute('classes')).join(' ');\n ctx.openGroup(classString, this.getAttribute('id'));\n // Get stem extents\n const stemExtents = note.checkStem().getExtents();\n let y = stemDir === Stem.DOWN ? stemExtents.baseY : stemExtents.topY;\n // TabNotes don't have stems attached to them. Tab stems are rendered outside the stave.\n if (isTabNote(note)) {\n if (note.hasStem()) {\n if (stemDir === Stem.DOWN) {\n y = stave.getYForTopText(this.text_line);\n }\n }\n else {\n // Without a stem\n y = stave.getYForTopText(this.text_line);\n }\n }\n const isPlacedOnNoteheadSide = stemDir === Stem.DOWN;\n const spacing = stave.getSpacingBetweenLines();\n let lineSpacing = 1;\n // Beamed stems are longer than quarter note stems, adjust accordingly\n if (!isPlacedOnNoteheadSide && note.hasBeam()) {\n lineSpacing += 0.5;\n }\n const totalSpacing = spacing * (this.text_line + lineSpacing);\n const glyphYBetweenLines = y - totalSpacing;\n // Get initial coordinates for the modifier position\n const start = note.getModifierStartXY(this.position, this.index);\n let glyphX = start.x;\n // If the ornament is aligned with the note head, don't consider the stave y\n // but use the 'natural' modifier y\n let glyphY = this.ornamentAlignWithNoteHead\n ? start.y\n : Math.min(stave.getYForTopText(this.text_line), glyphYBetweenLines);\n glyphY += this.y_shift;\n // Ajdust x position if ornament is delayed\n if (this.delayed) {\n let delayXShift = 0;\n const startX = glyphX - (stave.getX() - 10);\n if (this.delayXShift !== undefined) {\n delayXShift = this.delayXShift;\n }\n else {\n delayXShift += this.glyph.getMetrics().width / 2;\n const nextContext = TickContext.getNextContext(note.getTickContext());\n if (nextContext) {\n delayXShift += (nextContext.getX() - startX) * 0.5;\n }\n else {\n delayXShift += (stave.getX() + stave.getWidth() - startX) * 0.5;\n }\n this.delayXShift = delayXShift;\n }\n glyphX += delayXShift;\n }\n L('Rendering ornament: ', this.ornament, glyphX, glyphY);\n if (this.accidentalLower) {\n this.accidentalLower.render(ctx, glyphX, glyphY);\n glyphY -= this.accidentalLower.getMetrics().height;\n glyphY -= this.render_options.accidentalLowerPadding;\n }\n if (this.stemUpYOffset && note.hasStem() && note.getStemDirection() === 1) {\n glyphY += this.stemUpYOffset;\n }\n if (note.getLineNumber() < 5 && Ornament.ornamentNoteTransition.indexOf(this.type) >= 0) {\n glyphY = note.checkStave().getBoundingBox().getY() + 40;\n }\n this.glyph.render(ctx, glyphX + this.x_shift, glyphY);\n if (this.accidentalUpper) {\n glyphY -= this.glyph.getMetrics().height + this.render_options.accidentalUpperPadding;\n this.accidentalUpper.render(ctx, glyphX, glyphY);\n }\n ctx.closeGroup();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Ornament.DEBUG` to `true`. */\nOrnament.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Rodrigo Vilar\n// MIT License\nimport { Glyph } from './glyph';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { Tables } from './tables';\nimport { Category, isGraceNote } from './typeguard';\n/** Parenthesis implements parenthesis modifiers for notes. */\nexport class Parenthesis extends Modifier {\n /**\n * Constructor\n *\n * @param position Modifier.Position.LEFT (default) or Modifier.Position.RIGHT\n */\n constructor(position) {\n super();\n this.position = position !== null && position !== void 0 ? position : Modifier.Position.LEFT;\n this.point = Tables.currentMusicFont().lookupMetric('parenthesis.default.point');\n this.setWidth(Tables.currentMusicFont().lookupMetric('parenthesis.default.width'));\n }\n static get CATEGORY() {\n return Category.Parenthesis;\n }\n /** Add parentheses to the notes. */\n static buildAndAttach(notes) {\n for (const note of notes) {\n for (let i = 0; i < note.keys.length; i++) {\n note.addModifier(new Parenthesis(ModifierPosition.LEFT), i);\n note.addModifier(new Parenthesis(ModifierPosition.RIGHT), i);\n }\n }\n }\n /** Arrange parentheses inside a ModifierContext. */\n static format(parentheses, state) {\n if (!parentheses || parentheses.length === 0)\n return false;\n let x_widthL = 0;\n let x_widthR = 0;\n for (let i = 0; i < parentheses.length; ++i) {\n const parenthesis = parentheses[i];\n const note = parenthesis.getNote();\n const pos = parenthesis.getPosition();\n const index = parenthesis.checkIndex();\n let shift = 0;\n if (pos === ModifierPosition.RIGHT) {\n shift = note.getRightParenthesisPx(index);\n x_widthR = x_widthR > shift + parenthesis.width ? x_widthR : shift + parenthesis.width;\n }\n if (pos === ModifierPosition.LEFT) {\n shift = note.getLeftParenthesisPx(index);\n x_widthL = x_widthL > shift + parenthesis.width ? x_widthL : shift + parenthesis.width;\n }\n parenthesis.setXShift(shift);\n }\n state.left_shift += x_widthL;\n state.right_shift += x_widthR;\n return true;\n }\n /** Set the associated note. */\n setNote(note) {\n this.note = note;\n this.point = Tables.currentMusicFont().lookupMetric('parenthesis.default.point');\n this.setWidth(Tables.currentMusicFont().lookupMetric('parenthesis.default.width'));\n if (isGraceNote(note)) {\n this.point = Tables.currentMusicFont().lookupMetric('parenthesis.gracenote.point');\n this.setWidth(Tables.currentMusicFont().lookupMetric('parenthesis.gracenote.width'));\n }\n return this;\n }\n /** Render the parenthesis. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(this.position, this.index, { forceFlagRight: true });\n const x = start.x + this.x_shift;\n const y = start.y + this.y_shift;\n if (this.position == Modifier.Position.RIGHT) {\n Glyph.renderGlyph(ctx, x + 1, y, this.point, 'noteheadParenthesisRight', {\n category: `noteHead.standard.noteheadParenthesisRight`,\n });\n }\n else if (this.position == Modifier.Position.LEFT) {\n Glyph.renderGlyph(ctx, x - 2, y, this.point, 'noteheadParenthesisLeft', {\n category: `noteHead.standard.noteheadParenthesisLeft`,\n });\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { BoundingBox } from './boundingbox';\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (NoteHead.DEBUG)\n log('Vex.Flow.NoteHead', args);\n}\n/**\n * Draw slashnote head manually. No glyph exists for this.\n * @param ctx the Canvas context\n * @param duration the duration of the note. ex: \"4\"\n * @param x the x coordinate to draw at\n * @param y the y coordinate to draw at\n * @param stem_direction the direction of the stem\n */\nfunction drawSlashNoteHead(ctx, duration, x, y, stem_direction, staveSpace) {\n const width = Tables.SLASH_NOTEHEAD_WIDTH;\n ctx.save();\n ctx.setLineWidth(Tables.STEM_WIDTH);\n let fill = false;\n if (Tables.durationToNumber(duration) > 2) {\n fill = true;\n }\n if (!fill)\n x -= (Tables.STEM_WIDTH / 2) * stem_direction;\n ctx.beginPath();\n ctx.moveTo(x, y + staveSpace);\n ctx.lineTo(x, y + 1);\n ctx.lineTo(x + width, y - staveSpace);\n ctx.lineTo(x + width, y);\n ctx.lineTo(x, y + staveSpace);\n ctx.closePath();\n if (fill) {\n ctx.fill();\n }\n else {\n ctx.stroke();\n }\n if (Tables.durationToFraction(duration).equals(0.5)) {\n const breve_lines = [-3, -1, width + 1, width + 3];\n for (let i = 0; i < breve_lines.length; i++) {\n ctx.beginPath();\n ctx.moveTo(x + breve_lines[i], y - 10);\n ctx.lineTo(x + breve_lines[i], y + 11);\n ctx.stroke();\n }\n }\n ctx.restore();\n}\n/**\n * `NoteHeads` are typically not manipulated\n * directly, but used internally in `StaveNote`.\n *\n * See `tests/notehead_tests.ts` for usage examples.\n */\nexport class NoteHead extends Note {\n constructor(noteStruct) {\n super(noteStruct);\n this.custom_glyph = false;\n this.stem_up_x_offset = 0;\n this.stem_down_x_offset = 0;\n this.index = noteStruct.index;\n this.x = noteStruct.x || 0;\n this.y = noteStruct.y || 0;\n if (noteStruct.note_type)\n this.noteType = noteStruct.note_type;\n this.displaced = noteStruct.displaced || false;\n this.stem_direction = noteStruct.stem_direction || Stem.UP;\n this.line = noteStruct.line || 0;\n // Get glyph code based on duration and note type. This could be\n // regular notes, rests, or other custom codes.\n this.glyph = Tables.getGlyphProps(this.duration, this.noteType);\n defined(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`);\n this.glyph_code = this.glyph.code_head;\n this.x_shift = noteStruct.x_shift || 0;\n if (noteStruct.custom_glyph_code) {\n this.custom_glyph = true;\n this.glyph_code = noteStruct.custom_glyph_code;\n this.stem_up_x_offset = noteStruct.stem_up_x_offset || 0;\n this.stem_down_x_offset = noteStruct.stem_down_x_offset || 0;\n }\n this.style = noteStruct.style;\n this.slashed = noteStruct.slashed || false;\n this.render_options = Object.assign(Object.assign({}, this.render_options), { \n // font size for note heads\n glyph_font_scale: noteStruct.glyph_font_scale || Tables.NOTATION_FONT_SCALE });\n this.setWidth(this.glyph.getWidth(this.render_options.glyph_font_scale));\n }\n static get CATEGORY() {\n return Category.NoteHead;\n }\n /** Get the width of the notehead. */\n getWidth() {\n return this.width;\n }\n /** Determine if the notehead is displaced. */\n isDisplaced() {\n return this.displaced === true;\n }\n /** Get the glyph data. */\n getGlyph() {\n return this.glyph;\n }\n /** Set the X coordinate. */\n setX(x) {\n this.x = x;\n return this;\n }\n /** Get the Y coordinate. */\n getY() {\n return this.y;\n }\n /** Set the Y coordinate. */\n setY(y) {\n this.y = y;\n return this;\n }\n /** Get the stave line the notehead is placed on. */\n getLine() {\n return this.line;\n }\n /** Set the stave line the notehead is placed on. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Get the canvas `x` coordinate position of the notehead. */\n getAbsoluteX() {\n // If the note has not been preformatted, then get the static x value\n // Otherwise, it's been formatted and we should use it's x value relative\n // to its tick context\n const x = !this.preFormatted ? this.x : super.getAbsoluteX();\n // For a more natural displaced notehead, we adjust the displacement amount\n // by half the stem width in order to maintain a slight overlap with the stem\n const displacementStemAdjustment = Stem.WIDTH / 2;\n const musicFont = Tables.currentMusicFont();\n const fontShift = musicFont.lookupMetric('notehead.shiftX', 0) * this.stem_direction;\n const displacedFontShift = musicFont.lookupMetric('noteHead.displaced.shiftX', 0) * this.stem_direction;\n return (x +\n fontShift +\n (this.displaced ? (this.width - displacementStemAdjustment) * this.stem_direction + displacedFontShift : 0));\n }\n /** Get the `BoundingBox` for the `NoteHead`. */\n getBoundingBox() {\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call getBoundingBox on an unformatted note.\");\n }\n const spacing = this.checkStave().getSpacingBetweenLines();\n const half_spacing = spacing / 2;\n const min_y = this.y - half_spacing;\n return new BoundingBox(this.getAbsoluteX(), min_y, this.width, spacing);\n }\n /** Set notehead to a provided `stave`. */\n setStave(stave) {\n const line = this.getLine();\n this.stave = stave;\n if (this.stave) {\n this.setY(this.stave.getYForNote(line));\n this.setContext(this.stave.getContext());\n }\n return this;\n }\n /** Pre-render formatting. */\n preFormat() {\n if (this.preFormatted)\n return this;\n const width = this.getWidth() + this.leftDisplacedHeadPx + this.rightDisplacedHeadPx;\n this.setWidth(width);\n this.preFormatted = true;\n return this;\n }\n /** Draw the notehead. */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n let head_x = this.getAbsoluteX();\n if (this.custom_glyph) {\n // head_x += this.x_shift;\n head_x += this.stem_direction === Stem.UP ? this.stem_up_x_offset : this.stem_down_x_offset;\n }\n const y = this.y;\n L(\"Drawing note head '\", this.noteType, this.duration, \"' at\", head_x, y);\n // Begin and end positions for head.\n const stem_direction = this.stem_direction;\n const glyph_font_scale = this.render_options.glyph_font_scale;\n if (this.style) {\n this.applyStyle(ctx);\n }\n const categorySuffix = `${this.glyph_code}Stem${stem_direction === Stem.UP ? 'Up' : 'Down'}`;\n if (this.noteType === 's') {\n const staveSpace = this.checkStave().getSpacingBetweenLines();\n drawSlashNoteHead(ctx, this.duration, head_x, y, stem_direction, staveSpace);\n }\n else {\n Glyph.renderGlyph(ctx, head_x, y, glyph_font_scale, this.glyph_code, {\n category: this.custom_glyph ? `noteHead.custom.${categorySuffix}` : `noteHead.standard.${categorySuffix}`,\n });\n }\n if (this.style) {\n this.restoreStyle(ctx);\n }\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.NoteHead.DEBUG` to `true`. */\nNoteHead.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// `StemmableNote` is an abstract interface for notes with optional stems.\n// Examples of stemmable notes are `StaveNote` and `TabNote`\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StemmableNote extends Note {\n constructor(noteStruct) {\n super(noteStruct);\n }\n static get CATEGORY() {\n return Category.StemmableNote;\n }\n // Get and set the note's `Stem`\n getStem() {\n return this.stem;\n }\n checkStem() {\n if (!this.stem) {\n throw new RuntimeError('NoStem', 'No stem attached to instance');\n }\n return this.stem;\n }\n setStem(stem) {\n this.stem = stem;\n return this;\n }\n // Builds and sets a new stem\n buildStem() {\n const stem = new Stem();\n this.setStem(stem);\n return this;\n }\n buildFlag(category = 'flag') {\n const { glyph } = this;\n if (this.hasFlag()) {\n const flagCode = this.getStemDirection() === Stem.DOWN ? glyph.code_flag_downstem : glyph.code_flag_upstem;\n this.flag = new Glyph(flagCode, this.render_options.glyph_font_scale, { category });\n }\n }\n // Get the custom glyph associated with the outer note head on the base of the stem.\n getBaseCustomNoteHeadGlyph() {\n if (this.getStemDirection() === Stem.DOWN) {\n return this.customGlyphs[this.customGlyphs.length - 1];\n }\n else {\n return this.customGlyphs[0];\n }\n }\n // Get the full length of stem\n getStemLength() {\n return Stem.HEIGHT + this.getStemExtension();\n }\n // Get the number of beams for this duration\n getBeamCount() {\n const glyph = this.getGlyph();\n if (glyph) {\n return glyph.beam_count;\n }\n else {\n return 0;\n }\n }\n // Get the minimum length of stem\n getStemMinimumLength() {\n const frac = Tables.durationToFraction(this.duration);\n let length = frac.value() <= 1 ? 0 : 20;\n // if note is flagged, cannot shorten beam\n switch (this.duration) {\n case '8':\n if (this.beam == undefined)\n length = 35;\n break;\n case '16':\n length = this.beam == undefined ? 35 : 25;\n break;\n case '32':\n length = this.beam == undefined ? 45 : 35;\n break;\n case '64':\n length = this.beam == undefined ? 50 : 40;\n break;\n case '128':\n length = this.beam == undefined ? 55 : 45;\n break;\n default:\n break;\n }\n return length;\n }\n // Get/set the direction of the stem\n getStemDirection() {\n if (!this.stem_direction)\n throw new RuntimeError('NoStem', 'No stem attached to this note.');\n return this.stem_direction;\n }\n setStemDirection(direction) {\n if (!direction)\n direction = Stem.UP;\n if (direction !== Stem.UP && direction !== Stem.DOWN) {\n throw new RuntimeError('BadArgument', `Invalid stem direction: ${direction}`);\n }\n this.stem_direction = direction;\n // Reset and reformat everything. Flag has to be built before calling getStemExtension.\n this.reset();\n if (this.hasFlag()) {\n this.buildFlag();\n }\n this.beam = undefined;\n if (this.stem) {\n this.stem.setDirection(direction);\n this.stem.setExtension(this.getStemExtension());\n // Lookup the base custom notehead (closest to the base of the stem) to extend or shorten\n // the stem appropriately. If there's no custom note head, lookup the standard notehead.\n const glyph = this.getBaseCustomNoteHeadGlyph() || this.getGlyph();\n // Get the font-specific customizations for the note heads.\n const offsets = Tables.currentMusicFont().lookupMetric(`stem.noteHead.${glyph.code_head}`, {\n offsetYBaseStemUp: 0,\n offsetYTopStemUp: 0,\n offsetYBaseStemDown: 0,\n offsetYTopStemDown: 0,\n });\n // Configure the stem to use these offsets.\n this.stem.setOptions({\n stem_up_y_offset: offsets.offsetYTopStemUp,\n stem_down_y_offset: offsets.offsetYTopStemDown,\n stem_up_y_base_offset: offsets.offsetYBaseStemUp,\n stem_down_y_base_offset: offsets.offsetYBaseStemDown, // glyph.stem_down_y_base_offset,\n });\n }\n if (this.preFormatted) {\n this.preFormat();\n }\n return this;\n }\n // Get the `x` coordinate of the stem\n getStemX() {\n const x_begin = this.getAbsoluteX() + this.x_shift;\n const x_end = this.getAbsoluteX() + this.x_shift + this.getGlyphWidth();\n const stem_x = this.stem_direction === Stem.DOWN ? x_begin : x_end;\n return stem_x;\n }\n // Get the `x` coordinate for the center of the glyph.\n // Used for `TabNote` stems and stemlets over rests\n getCenterGlyphX() {\n return this.getAbsoluteX() + this.x_shift + this.getGlyphWidth() / 2;\n }\n // Get the stem extension for the current duration\n getStemExtension() {\n const glyph = this.getGlyph();\n if (this.stem_extension_override != undefined) {\n return this.stem_extension_override;\n }\n // Use stem_beam_extension with beams\n if (this.beam) {\n return glyph.stem_beam_extension;\n }\n const flagCode = this.getStemDirection() === Stem.DOWN ? this.glyph.code_flag_downstem : this.glyph.code_flag_upstem;\n return Math.abs(Tables.currentMusicFont().lookupMetric(`glyphs.flag.${flagCode}.shiftY`, 0));\n }\n // Set the stem length to a specific. Will override the default length.\n setStemLength(height) {\n this.stem_extension_override = height - Stem.HEIGHT;\n return this;\n }\n // Get the top and bottom `y` values of the stem.\n getStemExtents() {\n if (!this.stem)\n throw new RuntimeError('NoStem', 'No stem attached to this note.');\n return this.stem.getExtents();\n }\n /** Gets the `y` value for the top modifiers at a specific `textLine`. */\n getYForTopText(textLine) {\n const stave = this.checkStave();\n if (this.hasStem()) {\n const extents = this.getStemExtents();\n if (!extents)\n throw new RuntimeError('InvalidState', 'Stem does not have extents.');\n return Math.min(stave.getYForTopText(textLine), extents.topY - this.render_options.annotation_spacing * (textLine + 1));\n }\n else {\n return stave.getYForTopText(textLine);\n }\n }\n /** Gets the `y` value for the bottom modifiers at a specific `textLine`. */\n getYForBottomText(textLine) {\n const stave = this.checkStave();\n if (this.hasStem()) {\n const extents = this.getStemExtents();\n if (!extents)\n throw new RuntimeError('InvalidState', 'Stem does not have extents.');\n return Math.max(stave.getYForTopText(textLine), extents.baseY + this.render_options.annotation_spacing * textLine);\n }\n else {\n return stave.getYForBottomText(textLine);\n }\n }\n hasFlag() {\n return Tables.getGlyphProps(this.duration).flag && !this.beam;\n }\n /** Post formats the note. */\n postFormat() {\n var _a;\n (_a = this.beam) === null || _a === void 0 ? void 0 : _a.postFormat();\n this.postFormatted = true;\n return this;\n }\n /** Renders the stem onto the canvas. */\n drawStem(stemOptions) {\n var _a;\n this.checkContext();\n this.setRendered();\n this.setStem(new Stem(stemOptions));\n (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setContext(this.getContext()).draw();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// This file implements notes for standard notation. This consists of one or\n// more `NoteHeads`, an optional stem, and an optional flag.\n//\n// Throughout these comments, a \"note\" refers to the entire `StaveNote`,\n// and a \"key\" refers to a specific pitch/notehead within a note.\n//\n// See `tests/stavenote_tests.ts` for usage examples.\nimport { BoundingBox } from './boundingbox';\nimport { Modifier } from './modifier';\nimport { NoteHead } from './notehead';\nimport { Stem } from './stem';\nimport { StemmableNote } from './stemmablenote';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, log, midLine, RuntimeError, warn } from './util';\nfunction showDeprecationWarningForNoteHeads() {\n // eslint-disable-next-line\n console.warn('StaveNote.note_heads is deprecated. Use StaveNote.noteHeads instead.', 'This accessor will be removed in VexFlow 5.0.');\n}\n// To enable logging for this class. Set `Vex.Flow.StaveNote.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (StaveNote.DEBUG)\n log('Vex.Flow.StaveNote', args);\n}\nconst isInnerNoteIndex = (note, index) => index === (note.getStemDirection() === Stem.UP ? note.keyProps.length - 1 : 0);\n// Helper methods for rest positioning in ModifierContext.\nfunction shiftRestVertical(rest, note, dir) {\n const delta = dir;\n rest.line += delta;\n rest.maxLine += delta;\n rest.minLine += delta;\n rest.note.setKeyLine(0, rest.note.getKeyLine(0) + delta);\n}\n// Called from formatNotes :: center a rest between two notes\nfunction centerRest(rest, noteU, noteL) {\n const delta = rest.line - midLine(noteU.minLine, noteL.maxLine);\n rest.note.setKeyLine(0, rest.note.getKeyLine(0) - delta);\n rest.line -= delta;\n rest.maxLine -= delta;\n rest.minLine -= delta;\n}\nexport class StaveNote extends StemmableNote {\n constructor(noteStruct) {\n var _a, _b, _c;\n super(noteStruct);\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // INSTANCE MEMBERS\n this.minLine = 0;\n this.maxLine = 0;\n this.ledgerLineStyle = {};\n this.clef = (_a = noteStruct.clef) !== null && _a !== void 0 ? _a : 'treble';\n this.octave_shift = (_b = noteStruct.octave_shift) !== null && _b !== void 0 ? _b : 0;\n // Pull note rendering properties.\n this.glyph = Tables.getGlyphProps(this.duration, this.noteType);\n defined(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`);\n // if true, displace note to right\n this.displaced = false;\n this.dot_shiftY = 0;\n // for displaced ledger lines\n this.use_default_head_x = false;\n // Drawing\n this._noteHeads = [];\n this.modifiers = [];\n this.render_options = Object.assign(Object.assign({}, this.render_options), { \n // font size for note heads and rests\n glyph_font_scale: noteStruct.glyph_font_scale || Tables.NOTATION_FONT_SCALE, \n // number of stroke px to the left and right of head\n stroke_px: noteStruct.stroke_px || StaveNote.LEDGER_LINE_OFFSET });\n this.calculateKeyProps();\n this.buildStem();\n // Set the stem direction\n if (noteStruct.auto_stem) {\n this.autoStem();\n }\n else {\n this.setStemDirection((_c = noteStruct.stem_direction) !== null && _c !== void 0 ? _c : Stem.UP);\n }\n this.reset();\n this.buildFlag();\n }\n static get CATEGORY() {\n return Category.StaveNote;\n }\n /**\n * @deprecated Use Stem.UP.\n */\n static get STEM_UP() {\n return Stem.UP;\n }\n /**\n * @deprecated Use Stem.DOWN.\n */\n static get STEM_DOWN() {\n return Stem.DOWN;\n }\n static get LEDGER_LINE_OFFSET() {\n return 3;\n }\n static get minNoteheadPadding() {\n const musicFont = Tables.currentMusicFont();\n return musicFont.lookupMetric('glyphs.noteHead.minPadding');\n }\n /** Format notes inside a ModifierContext. */\n static format(notes, state) {\n if (!notes || notes.length < 2)\n return false;\n const notesList = [];\n for (let i = 0; i < notes.length; i++) {\n const props = notes[i].getKeyProps();\n const line = props[0].line;\n let minL = props[props.length - 1].line;\n const stemDirection = notes[i].getStemDirection();\n const stemMax = notes[i].getStemLength() / 10;\n const stemMin = notes[i].getStemMinimumLength() / 10;\n let maxL;\n if (notes[i].isRest()) {\n maxL = line + notes[i].glyph.line_above;\n minL = line - notes[i].glyph.line_below;\n }\n else {\n maxL = stemDirection === 1 ? props[props.length - 1].line + stemMax : props[props.length - 1].line;\n minL = stemDirection === 1 ? props[0].line : props[0].line - stemMax;\n }\n notesList.push({\n line: props[0].line,\n maxLine: maxL,\n minLine: minL,\n isrest: notes[i].isRest(),\n stemDirection: stemDirection,\n stemMax,\n stemMin,\n voice_shift: notes[i].getVoiceShiftWidth(),\n is_displaced: notes[i].isDisplaced(),\n note: notes[i],\n });\n }\n const voices = notesList.length;\n let noteU = notesList[0];\n const noteM = voices > 2 ? notesList[1] : undefined;\n let noteL = voices > 2 ? notesList[2] : notesList[1];\n // for two voice backward compatibility, ensure upper voice is stems up\n // for three voices, the voices must be in order (upper, middle, lower)\n if (voices === 2 && noteU.stemDirection === -1 && noteL.stemDirection === 1) {\n noteU = notesList[1];\n noteL = notesList[0];\n }\n const voiceXShift = Math.max(noteU.voice_shift, noteL.voice_shift);\n let xShift = 0;\n // Test for two voice note intersection\n if (voices === 2) {\n const lineSpacing = noteU.stemDirection === noteL.stemDirection ? 0.0 : 0.5;\n if (noteU.minLine <= noteL.maxLine + lineSpacing) {\n if (noteU.isrest) {\n // shift rest up\n shiftRestVertical(noteU, noteL, 1);\n }\n else if (noteL.isrest) {\n // shift rest down\n shiftRestVertical(noteL, noteU, -1);\n }\n else if (noteU.stemDirection === noteL.stemDirection) {\n // upper voice is middle voice, so shift it right\n xShift = voiceXShift + 2;\n noteU.note.setXShift(xShift);\n }\n else {\n // shift lower voice right\n xShift = voiceXShift + 2;\n noteL.note.setXShift(xShift);\n }\n }\n // format complete\n state.right_shift += xShift;\n return true;\n }\n if (!noteM)\n throw new RuntimeError('InvalidState', 'noteM not defined.');\n // For three voices, test if rests can be repositioned\n //\n // Special case 1 :: middle voice rest between two notes\n //\n if (noteM.isrest && !noteU.isrest && !noteL.isrest) {\n if (noteU.minLine <= noteM.maxLine || noteM.minLine <= noteL.maxLine) {\n const restHeight = noteM.maxLine - noteM.minLine;\n const space = noteU.minLine - noteL.maxLine;\n if (restHeight < space) {\n // center middle voice rest between the upper and lower voices\n centerRest(noteM, noteU, noteL);\n }\n else {\n xShift = voiceXShift + 2; // shift middle rest right\n noteM.note.setXShift(xShift);\n if (noteL.note.hasBeam() === false) {\n noteL.stemDirection = -1;\n noteL.note.setStemDirection(-1);\n }\n if (noteU.minLine <= noteL.maxLine && noteU.note.hasBeam() === false) {\n noteU.stemDirection = 1;\n noteU.note.setStemDirection(1);\n }\n }\n // format complete\n state.right_shift += xShift;\n return true;\n }\n }\n // Special case 2 :: all voices are rests\n if (noteU.isrest && noteM.isrest && noteL.isrest) {\n // Shift upper voice rest up\n shiftRestVertical(noteU, noteM, 1);\n // Shift lower voice rest down\n shiftRestVertical(noteL, noteM, -1);\n // format complete\n state.right_shift += xShift;\n return true;\n }\n // Test if any other rests can be repositioned\n if (noteM.isrest && noteU.isrest && noteM.minLine <= noteL.maxLine) {\n // Shift middle voice rest up\n shiftRestVertical(noteM, noteL, 1);\n }\n if (noteM.isrest && noteL.isrest && noteU.minLine <= noteM.maxLine) {\n // Shift middle voice rest down\n shiftRestVertical(noteM, noteU, -1);\n }\n if (noteU.isrest && noteU.minLine <= noteM.maxLine) {\n // shift upper voice rest up;\n shiftRestVertical(noteU, noteM, 1);\n }\n if (noteL.isrest && noteM.minLine <= noteL.maxLine) {\n // shift lower voice rest down\n shiftRestVertical(noteL, noteM, -1);\n }\n // If middle voice intersects upper or lower voice\n if (noteU.minLine <= noteM.maxLine + 0.5 || noteM.minLine <= noteL.maxLine) {\n // shift middle note right\n xShift = voiceXShift + 2;\n noteM.note.setXShift(xShift);\n if (noteL.note.hasBeam() === false) {\n noteL.stemDirection = -1;\n noteL.note.setStemDirection(-1);\n }\n if (noteU.minLine <= noteL.maxLine && noteU.note.hasBeam() === false) {\n noteU.stemDirection = 1;\n noteU.note.setStemDirection(1);\n }\n }\n state.right_shift += xShift;\n return true;\n }\n static postFormat(notes) {\n if (!notes)\n return false;\n notes.forEach((note) => note.postFormat());\n return true;\n }\n reset() {\n super.reset();\n // Save prior noteHead styles & reapply them after making new noteheads.\n const noteHeadStyles = this._noteHeads.map((noteHead) => noteHead.getStyle());\n this.buildNoteHeads();\n this._noteHeads.forEach((noteHead, index) => {\n const noteHeadStyle = noteHeadStyles[index];\n if (noteHeadStyle)\n noteHead.setStyle(noteHeadStyle);\n });\n const stave = this.stave;\n if (stave) {\n this._noteHeads.forEach((head) => head.setStave(stave));\n }\n this.calcNoteDisplacements();\n return this;\n }\n setBeam(beam) {\n this.beam = beam;\n this.calcNoteDisplacements();\n // Update stem extension is a beam is assigned.\n if (this.stem) {\n this.stem.setExtension(this.getStemExtension());\n }\n return this;\n }\n // Builds a `Stem` for the note\n buildStem() {\n this.setStem(new Stem({ hide: !!this.isRest() }));\n return this;\n }\n // Builds a `NoteHead` for each key in the note\n buildNoteHeads() {\n this._noteHeads = [];\n const stemDirection = this.getStemDirection();\n const keys = this.getKeys();\n let lastLine = undefined;\n let lineDiff = undefined;\n let displaced = false;\n // Draw notes from bottom to top.\n // For down-stem notes, we draw from top to bottom.\n let start;\n let end;\n let step;\n if (stemDirection === Stem.UP) {\n start = 0;\n end = keys.length;\n step = 1;\n }\n else {\n start = keys.length - 1;\n end = -1;\n step = -1;\n }\n for (let i = start; i !== end; i += step) {\n const noteProps = this.keyProps[i];\n const line = noteProps.line;\n // Keep track of last line with a note head, so that consecutive heads\n // are correctly displaced.\n if (lastLine === undefined) {\n lastLine = line;\n }\n else {\n lineDiff = Math.abs(lastLine - line);\n if (lineDiff === 0 || lineDiff === 0.5) {\n displaced = !displaced;\n }\n else {\n displaced = false;\n this.use_default_head_x = true;\n }\n }\n lastLine = line;\n const notehead = new NoteHead({\n duration: this.duration,\n note_type: this.noteType,\n displaced,\n stem_direction: stemDirection,\n custom_glyph_code: noteProps.code,\n glyph_font_scale: this.render_options.glyph_font_scale,\n x_shift: noteProps.shift_right,\n stem_up_x_offset: noteProps.stem_up_x_offset,\n stem_down_x_offset: noteProps.stem_down_x_offset,\n line: noteProps.line,\n });\n this._noteHeads[i] = notehead;\n }\n }\n // Automatically sets the stem direction based on the keys in the note\n autoStem() {\n this.setStemDirection(this.calculateOptimalStemDirection());\n }\n calculateOptimalStemDirection() {\n // Figure out optimal stem direction based on given notes\n this.minLine = this.keyProps[0].line;\n this.maxLine = this.keyProps[this.keyProps.length - 1].line;\n const MIDDLE_LINE = 3;\n const decider = (this.minLine + this.maxLine) / 2;\n const stemDirection = decider < MIDDLE_LINE ? Stem.UP : Stem.DOWN;\n return stemDirection;\n }\n // Calculates and stores the properties for each key in the note\n calculateKeyProps() {\n let lastLine;\n for (let i = 0; i < this.keys.length; ++i) {\n const key = this.keys[i];\n // All rests use the same position on the line.\n // if (this.glyph.rest) key = this.glyph.position;\n if (this.glyph.rest)\n this.glyph.position = key;\n const options = { octave_shift: this.octave_shift || 0 };\n const props = Tables.keyProperties(key, this.clef, options);\n if (!props) {\n throw new RuntimeError('BadArguments', `Invalid key for note properties: ${key}`);\n }\n // Override line placement for default rests\n if (props.key === 'R') {\n if (this.duration === '1' || this.duration === 'w') {\n props.line = 4;\n }\n else {\n props.line = 3;\n }\n }\n // Calculate displacement of this note\n const line = props.line;\n if (lastLine == undefined) {\n lastLine = line;\n }\n else {\n if (Math.abs(lastLine - line) === 0.5) {\n this.displaced = true;\n props.displaced = true;\n // Have to mark the previous note as\n // displaced as well, for modifier placement\n if (this.keyProps.length > 0) {\n this.keyProps[i - 1].displaced = true;\n }\n }\n }\n lastLine = line;\n this.keyProps.push(props);\n }\n // Sort the notes from lowest line to highest line\n lastLine = undefined;\n this.keyProps.forEach((key) => {\n if (lastLine && key.line < lastLine) {\n warn('Unsorted keys in note will be sorted. ' + 'See https://github.com/0xfe/vexflow/issues/104 for details.');\n }\n lastLine = key.line;\n });\n this.keyProps.sort((a, b) => a.line - b.line);\n }\n // Get the `BoundingBox` for the entire note\n getBoundingBox() {\n var _a, _b;\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call getBoundingBox on an unformatted note.\");\n }\n const { width: w, modLeftPx, leftDisplacedHeadPx } = this.getMetrics();\n const x = this.getAbsoluteX() - modLeftPx - leftDisplacedHeadPx;\n let minY = 0;\n let maxY = 0;\n const halfLineSpacing = ((_b = (_a = this.getStave()) === null || _a === void 0 ? void 0 : _a.getSpacingBetweenLines()) !== null && _b !== void 0 ? _b : 0) / 2;\n const lineSpacing = halfLineSpacing * 2;\n if (this.isRest()) {\n const y = this.ys[0];\n const frac = Tables.durationToFraction(this.duration);\n if (frac.equals(1) || frac.equals(2)) {\n minY = y - halfLineSpacing;\n maxY = y + halfLineSpacing;\n }\n else {\n minY = y - this.glyph.line_above * lineSpacing;\n maxY = y + this.glyph.line_below * lineSpacing;\n }\n }\n else if (this.glyph.stem) {\n const ys = this.getStemExtents();\n ys.baseY += halfLineSpacing * this.getStemDirection();\n minY = Math.min(ys.topY, ys.baseY);\n maxY = Math.max(ys.topY, ys.baseY);\n }\n else {\n minY = 0;\n maxY = 0;\n for (let i = 0; i < this.ys.length; ++i) {\n const yy = this.ys[i];\n if (i === 0) {\n minY = yy;\n maxY = yy;\n }\n else {\n minY = Math.min(yy, minY);\n maxY = Math.max(yy, maxY);\n }\n }\n minY -= halfLineSpacing;\n maxY += halfLineSpacing;\n }\n return new BoundingBox(x, minY, w, maxY - minY);\n }\n // Gets the line number of the bottom note in the chord.\n // If `isTopNote` is `true` then get the top note's line number instead\n getLineNumber(isTopNote) {\n if (!this.keyProps.length) {\n throw new RuntimeError('NoKeyProps', \"Can't get bottom note line, because note is not initialized properly.\");\n }\n let resultLine = this.keyProps[0].line;\n // No precondition assumed for sortedness of keyProps array\n for (let i = 0; i < this.keyProps.length; i++) {\n const thisLine = this.keyProps[i].line;\n if (isTopNote) {\n if (thisLine > resultLine)\n resultLine = thisLine;\n }\n else {\n if (thisLine < resultLine)\n resultLine = thisLine;\n }\n }\n return resultLine;\n }\n /**\n * @returns true if this note is a type of rest. Rests don't have pitches, but take up space in the score.\n */\n isRest() {\n return this.glyph.rest;\n }\n // Determine if the current note is a chord\n isChord() {\n return !this.isRest() && this.keys.length > 1;\n }\n // Determine if the `StaveNote` has a stem\n hasStem() {\n return this.glyph.stem;\n }\n hasFlag() {\n return super.hasFlag() && !this.isRest();\n }\n getStemX() {\n if (this.noteType === 'r') {\n return this.getCenterGlyphX();\n }\n else {\n // We adjust the origin of the stem because we want the stem left-aligned\n // with the notehead if stemmed-down, and right-aligned if stemmed-up\n return super.getStemX() + (this.stem_direction ? Stem.WIDTH / (2 * -this.stem_direction) : 0);\n }\n }\n // Get the `y` coordinate for text placed on the top/bottom of a\n // note at a desired `text_line`\n getYForTopText(textLine) {\n const extents = this.getStemExtents();\n return Math.min(this.checkStave().getYForTopText(textLine), extents.topY - this.render_options.annotation_spacing * (textLine + 1));\n }\n getYForBottomText(textLine) {\n const extents = this.getStemExtents();\n return Math.max(this.checkStave().getYForTopText(textLine), extents.baseY + this.render_options.annotation_spacing * textLine);\n }\n // Sets the current note to the provided `stave`. This applies\n // `y` values to the `NoteHeads`.\n setStave(stave) {\n super.setStave(stave);\n const ys = this._noteHeads.map((notehead) => {\n notehead.setStave(stave);\n return notehead.getY();\n });\n this.setYs(ys);\n if (this.stem) {\n const { y_top, y_bottom } = this.getNoteHeadBounds();\n this.stem.setYBounds(y_top, y_bottom);\n }\n return this;\n }\n // Check if note is shifted to the right\n isDisplaced() {\n return this.displaced;\n }\n // Sets whether shift note to the right. `displaced` is a `boolean`\n setNoteDisplaced(displaced) {\n this.displaced = displaced;\n return this;\n }\n // Get the starting `x` coordinate for a `StaveTie`\n getTieRightX() {\n let tieStartX = this.getAbsoluteX();\n tieStartX += this.getGlyphWidth() + this.x_shift + this.rightDisplacedHeadPx;\n if (this.modifierContext)\n tieStartX += this.modifierContext.getRightShift();\n return tieStartX;\n }\n // Get the ending `x` coordinate for a `StaveTie`\n getTieLeftX() {\n let tieEndX = this.getAbsoluteX();\n tieEndX += this.x_shift - this.leftDisplacedHeadPx;\n return tieEndX;\n }\n // Get the stave line on which to place a rest\n getLineForRest() {\n let restLine = this.keyProps[0].line;\n if (this.keyProps.length > 1) {\n const lastLine = this.keyProps[this.keyProps.length - 1].line;\n const top = Math.max(restLine, lastLine);\n const bot = Math.min(restLine, lastLine);\n restLine = midLine(top, bot);\n }\n return restLine;\n }\n // Get the default `x` and `y` coordinates for the provided `position`\n // and key `index`\n getModifierStartXY(position, index, options = {}) {\n var _a, _b;\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call GetModifierStartXY on an unformatted note\");\n }\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', 'No Y-Values calculated for this note.');\n }\n const { ABOVE, BELOW, LEFT, RIGHT } = Modifier.Position;\n let x = 0;\n if (position === LEFT) {\n // FIXME: Left modifier padding, move to font file\n x = -1 * 2;\n }\n else if (position === RIGHT) {\n // FIXME: Right modifier padding, move to font file\n x = this.getGlyphWidth() + this.x_shift + 2;\n if (this.stem_direction === Stem.UP &&\n this.hasFlag() &&\n (options.forceFlagRight || isInnerNoteIndex(this, index))) {\n x += (_b = (_a = this === null || this === void 0 ? void 0 : this.flag) === null || _a === void 0 ? void 0 : _a.getMetrics().width) !== null && _b !== void 0 ? _b : 0;\n }\n }\n else if (position === BELOW || position === ABOVE) {\n x = this.getGlyphWidth() / 2;\n }\n return {\n x: this.getAbsoluteX() + x,\n y: this.ys[index],\n };\n }\n // Sets the style of the complete StaveNote, including all keys\n // and the stem.\n setStyle(style) {\n var _a;\n super.setStyle(style);\n this._noteHeads.forEach((notehead) => notehead.setStyle(style));\n (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setStyle(style);\n return this;\n }\n setStemStyle(style) {\n const stem = this.getStem();\n stem === null || stem === void 0 ? void 0 : stem.setStyle(style);\n return this;\n }\n getStemStyle() {\n var _a;\n return (_a = this.stem) === null || _a === void 0 ? void 0 : _a.getStyle();\n }\n setLedgerLineStyle(style) {\n this.ledgerLineStyle = style;\n }\n getLedgerLineStyle() {\n return this.ledgerLineStyle;\n }\n setFlagStyle(style) {\n this.flagStyle = style;\n }\n getFlagStyle() {\n return this.flagStyle;\n }\n // Sets the notehead at `index` to the provided coloring `style`.\n //\n // `style` is an `object` with the following properties: `shadowColor`,\n // `shadowBlur`, `fillStyle`, `strokeStyle`\n setKeyStyle(index, style) {\n this._noteHeads[index].setStyle(style);\n return this;\n }\n setKeyLine(index, line) {\n this.keyProps[index].line = line;\n this.reset();\n return this;\n }\n getKeyLine(index) {\n return this.keyProps[index].line;\n }\n // Get the width of the note if it is displaced. Used for `Voice`\n // formatting\n getVoiceShiftWidth() {\n // TODO: may need to accomodate for dot here.\n return this.getGlyphWidth() * (this.displaced ? 2 : 1);\n }\n // Calculates and sets the extra pixels to the left or right\n // if the note is displaced.\n calcNoteDisplacements() {\n this.setLeftDisplacedHeadPx(this.displaced && this.stem_direction === Stem.DOWN ? this.getGlyphWidth() : 0);\n // For upstems with flags, the extra space is unnecessary, since it's taken\n // up by the flag.\n this.setRightDisplacedHeadPx(!this.hasFlag() && this.displaced && this.stem_direction === Stem.UP ? this.getGlyphWidth() : 0);\n }\n // Pre-render formatting\n preFormat() {\n if (this.preFormatted)\n return;\n let noteHeadPadding = 0;\n if (this.modifierContext) {\n this.modifierContext.preFormat();\n // If there are no modifiers on this note, make sure there is adequate padding\n // between the notes.\n if (this.modifierContext.getWidth() === 0) {\n noteHeadPadding = StaveNote.minNoteheadPadding;\n }\n }\n let width = this.getGlyphWidth() + this.leftDisplacedHeadPx + this.rightDisplacedHeadPx + noteHeadPadding;\n // For upward flagged notes, the width of the flag needs to be added\n if (this.shouldDrawFlag() && this.stem_direction === Stem.UP) {\n width += this.getGlyphWidth();\n // TODO: Add flag width as a separate metric\n }\n this.setWidth(width);\n this.preFormatted = true;\n }\n /**\n * @typedef {Object} noteHeadBounds\n * @property {number} y_top the highest notehead bound\n * @property {number} y_bottom the lowest notehead bound\n * @property {number|Null} displaced_x the starting x for displaced noteheads\n * @property {number|Null} non_displaced_x the starting x for non-displaced noteheads\n * @property {number} highest_line the highest notehead line in traditional music line\n * numbering (bottom line = 1, top line = 5)\n * @property {number} lowest_line the lowest notehead line\n * @property {number|false} highest_displaced_line the highest staff line number\n * for a displaced notehead\n * @property {number|false} lowest_displaced_line\n * @property {number} highest_non_displaced_line\n * @property {number} lowest_non_displaced_line\n */\n /**\n * Get the staff line and y value for the highest & lowest noteheads\n * @returns {noteHeadBounds}\n */\n getNoteHeadBounds() {\n // Top and bottom Y values for stem.\n let yTop = +Infinity;\n let yBottom = -Infinity;\n let nonDisplacedX;\n let displacedX;\n let highestLine = this.checkStave().getNumLines();\n let lowestLine = 1;\n let highestDisplacedLine;\n let lowestDisplacedLine;\n let highestNonDisplacedLine = highestLine;\n let lowestNonDisplacedLine = lowestLine;\n this._noteHeads.forEach((notehead) => {\n const line = notehead.getLine();\n const y = notehead.getY();\n yTop = Math.min(y, yTop);\n yBottom = Math.max(y, yBottom);\n if (displacedX === undefined && notehead.isDisplaced()) {\n displacedX = notehead.getAbsoluteX();\n }\n if (nonDisplacedX === undefined && !notehead.isDisplaced()) {\n nonDisplacedX = notehead.getAbsoluteX();\n }\n highestLine = Math.max(line, highestLine);\n lowestLine = Math.min(line, lowestLine);\n if (notehead.isDisplaced()) {\n highestDisplacedLine = highestDisplacedLine === undefined ? line : Math.max(line, highestDisplacedLine);\n lowestDisplacedLine = lowestDisplacedLine === undefined ? line : Math.min(line, lowestDisplacedLine);\n }\n else {\n highestNonDisplacedLine = Math.max(line, highestNonDisplacedLine);\n lowestNonDisplacedLine = Math.min(line, lowestNonDisplacedLine);\n }\n }, this);\n return {\n y_top: yTop,\n y_bottom: yBottom,\n displaced_x: displacedX,\n non_displaced_x: nonDisplacedX,\n highest_line: highestLine,\n lowest_line: lowestLine,\n highest_displaced_line: highestDisplacedLine,\n lowest_displaced_line: lowestDisplacedLine,\n highest_non_displaced_line: highestNonDisplacedLine,\n lowest_non_displaced_line: lowestNonDisplacedLine,\n };\n }\n // Get the starting `x` coordinate for the noteheads\n getNoteHeadBeginX() {\n return this.getAbsoluteX() + this.x_shift;\n }\n // Get the ending `x` coordinate for the noteheads\n getNoteHeadEndX() {\n const xBegin = this.getNoteHeadBeginX();\n return xBegin + this.getGlyphWidth();\n }\n get noteHeads() {\n return this._noteHeads.slice();\n }\n /** @deprecated use StaveNote.noteHeads instead. */\n get note_heads() {\n showDeprecationWarningForNoteHeads();\n return this.noteHeads;\n }\n // Draw the ledger lines between the stave and the highest/lowest keys\n drawLedgerLines() {\n const stave = this.checkStave();\n const { glyph, render_options: { stroke_px }, } = this;\n const ctx = this.checkContext();\n const width = glyph.getWidth() + stroke_px * 2;\n const doubleWidth = 2 * (glyph.getWidth() + stroke_px) - Stem.WIDTH / 2;\n if (this.isRest())\n return;\n if (!ctx) {\n throw new RuntimeError('NoCanvasContext', \"Can't draw without a canvas context.\");\n }\n const { highest_line, lowest_line, highest_displaced_line, highest_non_displaced_line, lowest_displaced_line, lowest_non_displaced_line, displaced_x, non_displaced_x, } = this.getNoteHeadBounds();\n // Early out if there are no ledger lines to draw.\n if (highest_line < 6 && lowest_line > 0)\n return;\n const min_x = Math.min(displaced_x !== null && displaced_x !== void 0 ? displaced_x : 0, non_displaced_x !== null && non_displaced_x !== void 0 ? non_displaced_x : 0);\n const drawLedgerLine = (y, normal, displaced) => {\n let x;\n if (displaced && normal)\n x = min_x - stroke_px;\n else if (normal)\n x = (non_displaced_x !== null && non_displaced_x !== void 0 ? non_displaced_x : 0) - stroke_px;\n else\n x = (displaced_x !== null && displaced_x !== void 0 ? displaced_x : 0) - stroke_px;\n const ledgerWidth = normal && displaced ? doubleWidth : width;\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(x + ledgerWidth, y);\n ctx.stroke();\n };\n const style = Object.assign(Object.assign({}, stave.getDefaultLedgerLineStyle()), this.getLedgerLineStyle());\n this.applyStyle(ctx, style);\n // Draw ledger lines below the staff:\n for (let line = 6; line <= highest_line; ++line) {\n const normal = non_displaced_x !== undefined && line <= highest_non_displaced_line;\n const displaced = highest_displaced_line !== undefined && line <= highest_displaced_line;\n drawLedgerLine(stave.getYForNote(line), normal, displaced);\n }\n // Draw ledger lines above the staff:\n for (let line = 0; line >= lowest_line; --line) {\n const normal = non_displaced_x !== undefined && line >= lowest_non_displaced_line;\n const displaced = lowest_displaced_line !== undefined && line >= lowest_displaced_line;\n drawLedgerLine(stave.getYForNote(line), normal, displaced);\n }\n this.restoreStyle(ctx, style);\n }\n // Draw all key modifiers\n drawModifiers() {\n const ctx = this.checkContext();\n ctx.openGroup('modifiers');\n for (let i = 0; i < this.modifiers.length; i++) {\n const modifier = this.modifiers[i];\n const index = modifier.checkIndex();\n const notehead = this._noteHeads[index];\n const noteheadStyle = notehead.getStyle();\n notehead.applyStyle(ctx, noteheadStyle);\n modifier.setContext(ctx);\n modifier.drawWithStyle();\n notehead.restoreStyle(ctx, noteheadStyle);\n }\n ctx.closeGroup();\n }\n shouldDrawFlag() {\n const hasStem = this.stem !== undefined;\n const hasFlag = this.glyph.flag; // specified in tables.js\n const hasNoBeam = this.beam === undefined;\n return hasStem && hasFlag && hasNoBeam;\n }\n // Draw the flag for the note\n drawFlag() {\n var _a;\n const ctx = this.checkContext();\n if (!ctx) {\n throw new RuntimeError('NoCanvasContext', \"Can't draw without a canvas context.\");\n }\n if (this.shouldDrawFlag()) {\n const { y_top, y_bottom } = this.getNoteHeadBounds();\n // eslint-disable-next-line\n const noteStemHeight = this.stem.getHeight();\n const flagX = this.getStemX();\n // FIXME: What's with the magic +/- 2\n // ANSWER: a corner of the note stem pokes out beyond the tip of the flag.\n // The extra +/- 2 pushes the flag glyph outward so it covers the stem entirely.\n // Alternatively, we could shorten the stem.\n const extension = this.flag !== undefined ? this.flag.checkMetrics().y_shift : 0;\n const flagY = this.getStemDirection() === Stem.DOWN\n ? // Down stems are below the note head and have flags on the right.\n y_top - noteStemHeight + 2 - extension\n : // Up stems are above the note head and have flags on the right.\n y_bottom - noteStemHeight - 2 - extension;\n // Draw the Flag\n ctx.openGroup('flag', undefined, { pointerBBox: true });\n this.applyStyle(ctx, this.getFlagStyle());\n (_a = this.flag) === null || _a === void 0 ? void 0 : _a.render(ctx, flagX, flagY);\n this.restoreStyle(ctx, this.getFlagStyle());\n ctx.closeGroup();\n }\n }\n // Draw the NoteHeads\n drawNoteHeads() {\n const ctx = this.checkContext();\n this._noteHeads.forEach((notehead) => {\n ctx.openGroup('notehead', undefined, { pointerBBox: true });\n notehead.setContext(ctx).draw();\n ctx.closeGroup();\n });\n }\n drawStem(stemOptions) {\n var _a;\n // GCR TODO: I can't find any context in which this is called with the stemStruct\n // argument in the codebase or tests. Nor can I find a case where super.drawStem\n // is called at all. Perhaps these should be removed?\n const ctx = this.checkContext();\n if (stemOptions) {\n this.setStem(new Stem(stemOptions));\n }\n // If we will render a flag, we shorten the stem so that the tip\n // does not poke through the flag.\n if (this.shouldDrawFlag() && this.stem) {\n this.stem.adjustHeightForFlag();\n }\n ctx.openGroup('stem', undefined, { pointerBBox: true });\n (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setContext(ctx).draw();\n ctx.closeGroup();\n }\n /**\n * Override stemmablenote stem extension to adjust for distance from middle line.\n */\n getStemExtension() {\n const super_stem_extension = super.getStemExtension();\n if (!this.glyph.stem) {\n return super_stem_extension;\n }\n const stem_direction = this.getStemDirection();\n if (stem_direction !== this.calculateOptimalStemDirection()) {\n return super_stem_extension; // no adjustment for manually set stem direction.\n }\n let mid_line_distance;\n const MIDDLE_LINE = 3;\n if (stem_direction === Stem.UP) {\n // Note that the use of maxLine here instead of minLine might\n // seem counterintuitive, but in the case of (say) treble clef\n // chord(F2, E4) stem up, we do not want to extend the stem because\n // of F2, when a normal octave-length stem above E4 is fine.\n //\n // maxLine and minLine are set in calculateOptimalStemDirection() so\n // will be known.\n mid_line_distance = MIDDLE_LINE - this.maxLine;\n }\n else {\n mid_line_distance = this.minLine - MIDDLE_LINE;\n }\n // how many lines more than an octave is the relevant notehead?\n const lines_over_octave_from_mid_line = mid_line_distance - 3.5;\n if (lines_over_octave_from_mid_line <= 0) {\n return super_stem_extension;\n }\n const stave = this.getStave();\n let spacing_between_lines = 10;\n if (stave != undefined) {\n spacing_between_lines = stave.getSpacingBetweenLines();\n }\n return super_stem_extension + lines_over_octave_from_mid_line * spacing_between_lines;\n }\n // Draws all the `StaveNote` parts. This is the main drawing method.\n draw() {\n var _a;\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', \"Can't draw note without Y values.\");\n }\n const ctx = this.checkContext();\n const xBegin = this.getNoteHeadBeginX();\n const shouldRenderStem = this.hasStem() && !this.beam;\n // Format note head x positions\n this._noteHeads.forEach((notehead) => notehead.setX(xBegin));\n // Format stem x positions\n const stemX = this.getStemX();\n (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setNoteHeadXBounds(stemX, stemX);\n L('Rendering ', this.isChord() ? 'chord :' : 'note :', this.keys);\n // Apply the overall style -- may be contradicted by local settings:\n this.applyStyle();\n this.setAttribute('el', ctx.openGroup('stavenote', this.getAttribute('id')));\n this.drawLedgerLines();\n ctx.openGroup('note', undefined, { pointerBBox: true });\n if (shouldRenderStem)\n this.drawStem();\n this.drawNoteHeads();\n this.drawFlag();\n ctx.closeGroup();\n this.drawModifiers();\n ctx.closeGroup();\n this.restoreStyle();\n this.setRendered();\n }\n}\nStaveNote.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Ron B. Yeh\n// MIT License\n//\n// Utilities for working with Web APIs.\n// See: https://developer.mozilla.org/en-US/docs/Web/API\nimport { globalObject } from './util';\n// eslint-disable-next-line\nexport function isHTMLCanvas(element) {\n if (!element)\n return false;\n const global = globalObject();\n return (\n // It's either an instance of the HTMLCanvasElement class,\n (typeof global.HTMLCanvasElement === 'function' && element instanceof global.HTMLCanvasElement) ||\n // OR it's pretending to be a element. Good enough!\n // Do not rely on .tagName, because node-canvas doesn't provide a tagName.\n (typeof element.getContext === 'function' && typeof element.toDataURL === 'function'));\n}\n// eslint-disable-next-line\nexport function isHTMLDiv(element) {\n if (!element)\n return false;\n const global = globalObject();\n return (\n // It's either an instance of the HTMLDivElement class.\n (typeof global.HTMLDivElement === 'function' && element instanceof global.HTMLDivElement) ||\n // OR it's pretending to be a
. See: svgcontext.ts.\n (typeof element.appendChild === 'function' && typeof element.style === 'object'));\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from './font';\nimport { RenderContext } from './rendercontext';\nimport { globalObject, warn } from './util';\nimport { isHTMLCanvas } from './web';\n/**\n * A rendering context for the Canvas backend. This class serves as a proxy for the\n * underlying CanvasRenderingContext2D object, part of the browser's API.\n */\nexport class CanvasContext extends RenderContext {\n constructor(context) {\n super();\n /** Height of one line of text (in pixels). */\n this.textHeight = 0;\n this.context2D = context;\n if (!context.canvas) {\n this.canvas = {\n width: CanvasContext.WIDTH,\n height: CanvasContext.HEIGHT,\n };\n }\n else {\n this.canvas = context.canvas;\n }\n }\n static get WIDTH() {\n return 600;\n }\n static get HEIGHT() {\n return 400;\n }\n static get CANVAS_BROWSER_SIZE_LIMIT() {\n return 32767; // Chrome/Firefox. Could be determined more precisely by npm module canvas-size.\n }\n /**\n * Ensure that width and height do not exceed the browser limit.\n * @returns array of [width, height] clamped to the browser limit.\n */\n static sanitizeCanvasDims(width, height) {\n const limit = this.CANVAS_BROWSER_SIZE_LIMIT;\n if (Math.max(width, height) > limit) {\n warn('Canvas dimensions exceed browser limit. Cropping to ' + limit);\n if (width > limit) {\n width = limit;\n }\n if (height > limit) {\n height = limit;\n }\n }\n return [width, height];\n }\n /**\n * Set all pixels to transparent black rgba(0,0,0,0).\n */\n clear() {\n this.context2D.clearRect(0, 0, this.canvas.width, this.canvas.height);\n }\n // eslint-disable-next-line\n openGroup(cls, id, attrs) {\n // Containers not implemented.\n }\n closeGroup() {\n // Containers not implemented.\n }\n // eslint-disable-next-line\n add(child) {\n // Containers not implemented.\n }\n setFillStyle(style) {\n this.context2D.fillStyle = style;\n return this;\n }\n /** CanvasContext ignores `setBackgroundFillStyle()`. */\n // eslint-disable-next-line\n setBackgroundFillStyle(style) {\n // DO NOTHING\n return this;\n }\n setStrokeStyle(style) {\n this.context2D.strokeStyle = style;\n return this;\n }\n setShadowColor(color) {\n this.context2D.shadowColor = color;\n return this;\n }\n setShadowBlur(blur) {\n // CanvasRenderingContext2D does not scale the shadow blur by the current\n // transform, so we have to do it manually. We assume uniform scaling\n // (though allow for rotation) because the blur can only be scaled\n // uniformly anyway.\n const t = this.context2D.getTransform();\n const scale = Math.sqrt(t.a * t.a + t.b * t.b + t.c * t.c + t.d * t.d);\n this.context2D.shadowBlur = scale * blur;\n return this;\n }\n setLineWidth(width) {\n this.context2D.lineWidth = width;\n return this;\n }\n setLineCap(capType) {\n this.context2D.lineCap = capType;\n return this;\n }\n setLineDash(dash) {\n this.context2D.setLineDash(dash);\n return this;\n }\n scale(x, y) {\n this.context2D.scale(x, y);\n return this;\n }\n resize(width, height) {\n const canvas = this.context2D.canvas;\n const devicePixelRatio = globalObject().devicePixelRatio || 1;\n // Scale the canvas size by the device pixel ratio clamping to the maximum supported size.\n [width, height] = CanvasContext.sanitizeCanvasDims(width * devicePixelRatio, height * devicePixelRatio);\n // Divide back down by the pixel ratio and convert to integers.\n width = (width / devicePixelRatio) | 0;\n height = (height / devicePixelRatio) | 0;\n canvas.width = width * devicePixelRatio;\n canvas.height = height * devicePixelRatio;\n // The canvas could be an instance of either HTMLCanvasElement or an OffscreenCanvas.\n // Only HTMLCanvasElement has a style attribute.\n if (isHTMLCanvas(canvas)) {\n canvas.style.width = width + 'px';\n canvas.style.height = height + 'px';\n }\n return this.scale(devicePixelRatio, devicePixelRatio);\n }\n rect(x, y, width, height) {\n this.context2D.rect(x, y, width, height);\n return this;\n }\n fillRect(x, y, width, height) {\n this.context2D.fillRect(x, y, width, height);\n return this;\n }\n /**\n * Set the pixels in a rectangular area to transparent black rgba(0,0,0,0).\n */\n clearRect(x, y, width, height) {\n this.context2D.clearRect(x, y, width, height);\n return this;\n }\n beginPath() {\n this.context2D.beginPath();\n return this;\n }\n moveTo(x, y) {\n this.context2D.moveTo(x, y);\n return this;\n }\n lineTo(x, y) {\n this.context2D.lineTo(x, y);\n return this;\n }\n bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) {\n this.context2D.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);\n return this;\n }\n quadraticCurveTo(cpx, cpy, x, y) {\n this.context2D.quadraticCurveTo(cpx, cpy, x, y);\n return this;\n }\n arc(x, y, radius, startAngle, endAngle, counterclockwise) {\n this.context2D.arc(x, y, radius, startAngle, endAngle, counterclockwise);\n return this;\n }\n fill() {\n this.context2D.fill();\n return this;\n }\n stroke() {\n this.context2D.stroke();\n return this;\n }\n closePath() {\n this.context2D.closePath();\n return this;\n }\n measureText(text) {\n const metrics = this.context2D.measureText(text);\n let y = 0;\n let height = 0;\n if (metrics.fontBoundingBoxAscent) {\n y = -metrics.fontBoundingBoxAscent;\n height = metrics.fontBoundingBoxDescent + metrics.fontBoundingBoxAscent;\n }\n else {\n y = -metrics.actualBoundingBoxAscent;\n height = metrics.actualBoundingBoxDescent + metrics.actualBoundingBoxAscent;\n }\n // Return x, y, width & height in the same manner as svg getBBox\n return {\n x: 0,\n y: y,\n width: metrics.width,\n height: height,\n };\n }\n fillText(text, x, y) {\n this.context2D.fillText(text, x, y);\n return this;\n }\n save() {\n this.context2D.save();\n return this;\n }\n restore() {\n this.context2D.restore();\n return this;\n }\n set fillStyle(style) {\n this.context2D.fillStyle = style;\n }\n get fillStyle() {\n return this.context2D.fillStyle;\n }\n set strokeStyle(style) {\n this.context2D.strokeStyle = style;\n }\n get strokeStyle() {\n return this.context2D.strokeStyle;\n }\n /**\n * @param f is 1) a `FontInfo` object or\n * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or\n * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided).\n * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt').\n * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900).\n * @param style is a string (e.g., 'italic', 'normal').\n */\n setFont(f, size, weight, style) {\n const fontInfo = Font.validate(f, size, weight, style);\n this.context2D.font = Font.toCSSString(fontInfo);\n this.textHeight = Font.convertSizeToPixelValue(fontInfo.size);\n return this;\n }\n /** Return a string of the form `'italic bold 15pt Arial'` */\n getFont() {\n return this.context2D.font;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// @author Gregory Ristow (2015)\nimport { Font, FontStyle, FontWeight } from './font';\nimport { RenderContext } from './rendercontext';\nimport { normalizeAngle, prefix, RuntimeError } from './util';\n/** For a particular element type (e.g., rect), we will not apply certain presentation attributes. */\nconst ATTRIBUTES_TO_IGNORE = {\n path: {\n x: true,\n y: true,\n width: true,\n height: true,\n 'font-family': true,\n 'font-weight': true,\n 'font-style': true,\n 'font-size': true,\n },\n rect: {\n 'font-family': true,\n 'font-weight': true,\n 'font-style': true,\n 'font-size': true,\n },\n text: {\n width: true,\n height: true,\n },\n};\n/** Create the SVG in the SVG namespace. */\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst TWO_PI = 2 * Math.PI;\nclass MeasureTextCache {\n constructor() {\n // The cache is keyed first by the text string, then by the font attributes\n // joined together.\n this.cache = {};\n }\n lookup(text, svg, attributes) {\n let entries = this.cache[text];\n if (entries === undefined) {\n entries = {};\n this.cache[text] = entries;\n }\n const family = attributes['font-family'];\n const size = attributes['font-size'];\n const weight = attributes['font-weight'];\n const style = attributes['font-style'];\n const key = `${family}%${size}%${weight}%${style}`;\n let entry = entries[key];\n if (entry === undefined) {\n entry = this.measureImpl(text, svg, attributes);\n entries[key] = entry;\n }\n return entry;\n }\n measureImpl(text, svg, attributes) {\n let txt = this.txt;\n if (!txt) {\n // Create the SVG text element that will be used to measure text in the event\n // of a cache miss.\n txt = document.createElementNS(SVG_NS, 'text');\n this.txt = txt;\n }\n txt.textContent = text;\n txt.setAttributeNS(null, 'font-family', attributes['font-family']);\n txt.setAttributeNS(null, 'font-size', attributes['font-size']);\n txt.setAttributeNS(null, 'font-style', attributes['font-style']);\n txt.setAttributeNS(null, 'font-weight', attributes['font-weight']);\n svg.appendChild(txt);\n const bbox = txt.getBBox();\n svg.removeChild(txt);\n return { x: bbox.x, y: bbox.y, width: bbox.width, height: bbox.height };\n }\n}\n/**\n * SVG rendering context with an API similar to CanvasRenderingContext2D.\n */\nexport class SVGContext extends RenderContext {\n constructor(element) {\n super();\n this.width = 0;\n this.height = 0;\n this.backgroundFillStyle = 'white';\n /** Formatted as CSS font shorthand (e.g., 'italic bold 12pt Arial') */\n this.fontCSSString = '';\n this.element = element;\n // Create a SVG element and add it to the container element.\n const svg = this.create('svg');\n this.element.appendChild(svg);\n this.svg = svg;\n this.parent = this.svg;\n this.groups = [this.svg];\n this.path = '';\n this.pen = { x: NaN, y: NaN };\n this.lineWidth = 1.0;\n const defaultFontAttributes = {\n 'font-family': Font.SANS_SERIF,\n 'font-size': Font.SIZE + 'pt',\n 'font-weight': FontWeight.NORMAL,\n 'font-style': FontStyle.NORMAL,\n };\n this.state = Object.assign({ scale: { x: 1, y: 1 } }, defaultFontAttributes);\n this.attributes = Object.assign({ 'stroke-width': 0.3, 'stroke-dasharray': 'none', fill: 'black', stroke: 'black' }, defaultFontAttributes);\n this.shadow_attributes = {\n width: 0,\n color: 'black',\n };\n this.state_stack = [];\n }\n create(svgElementType) {\n return document.createElementNS(SVG_NS, svgElementType);\n }\n // Allow grouping elements in containers for interactivity.\n openGroup(cls, id, attrs) {\n const group = this.create('g');\n this.groups.push(group);\n this.parent.appendChild(group);\n this.parent = group;\n if (cls)\n group.setAttribute('class', prefix(cls));\n if (id)\n group.setAttribute('id', prefix(id));\n if (attrs && attrs.pointerBBox) {\n group.setAttribute('pointer-events', 'bounding-box');\n }\n return group;\n }\n closeGroup() {\n this.groups.pop();\n this.parent = this.groups[this.groups.length - 1];\n }\n add(elem) {\n this.parent.appendChild(elem);\n }\n setFillStyle(style) {\n this.attributes.fill = style;\n return this;\n }\n /**\n * Used to set the fill color for `clearRect()`. This allows us to simulate\n * cutting a \"hole\" into the SVG drawing.\n */\n setBackgroundFillStyle(style) {\n this.backgroundFillStyle = style;\n return this;\n }\n setStrokeStyle(style) {\n this.attributes.stroke = style;\n return this;\n }\n setShadowColor(color) {\n this.shadow_attributes.color = color;\n return this;\n }\n /**\n * @param blur A non-negative float specifying the level of shadow blur, where 0\n * represents no blur and larger numbers represent increasingly more blur.\n * @returns this\n */\n setShadowBlur(blur) {\n this.shadow_attributes.width = blur;\n return this;\n }\n /**\n * @param width\n * @returns this\n */\n setLineWidth(width) {\n this.attributes['stroke-width'] = width;\n this.lineWidth = width;\n return this;\n }\n /**\n * @param lineDash an array of integers in the form of [dash, space, dash, space, etc...]\n * @returns this\n *\n * See: [SVG `stroke-dasharray` attribute](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray)\n */\n setLineDash(lineDash) {\n if (Object.prototype.toString.call(lineDash) === '[object Array]') {\n this.attributes['stroke-dasharray'] = lineDash.join(',');\n return this;\n }\n else {\n throw new RuntimeError('ArgumentError', 'lineDash must be an array of integers.');\n }\n }\n /**\n * @param capType\n * @returns this\n */\n setLineCap(capType) {\n this.attributes['stroke-linecap'] = capType;\n return this;\n }\n // ### Sizing & Scaling Methods:\n // TODO (GCR): See note at scale() -- separate our internal\n // conception of pixel-based width/height from the style.width\n // and style.height properties eventually to allow users to\n // apply responsive sizing attributes to the SVG.\n resize(width, height) {\n this.width = width;\n this.height = height;\n this.element.style.width = width.toString();\n this.svg.style.width = width.toString();\n this.svg.style.height = height.toString();\n const attributes = {\n width,\n height,\n };\n this.applyAttributes(this.svg, attributes);\n this.scale(this.state.scale.x, this.state.scale.y);\n return this;\n }\n scale(x, y) {\n // uses viewBox to scale\n // TODO (GCR): we may at some point want to distinguish the\n // style.width / style.height properties that are applied to\n // the SVG object from our internal conception of the SVG\n // width/height. This would allow us to create automatically\n // scaling SVG's that filled their containers, for instance.\n //\n // As this isn't implemented in Canvas contexts,\n // I've left as is for now, but in using the viewBox to\n // handle internal scaling, am trying to make it possible\n // for us to eventually move in that direction.\n this.state.scale = { x, y };\n const visibleWidth = this.width / x;\n const visibleHeight = this.height / y;\n this.setViewBox(0, 0, visibleWidth, visibleHeight);\n return this;\n }\n /**\n * 1 arg: string in the \"x y w h\" format\n * 4 args: x:number, y:number, w:number, h:number\n */\n setViewBox(viewBox_or_minX, minY, width, height) {\n if (typeof viewBox_or_minX === 'string') {\n this.svg.setAttribute('viewBox', viewBox_or_minX);\n }\n else {\n const viewBoxString = viewBox_or_minX + ' ' + minY + ' ' + width + ' ' + height;\n this.svg.setAttribute('viewBox', viewBoxString);\n }\n }\n // ### Drawing helper methods:\n applyAttributes(element, attributes) {\n const attrNamesToIgnore = ATTRIBUTES_TO_IGNORE[element.nodeName];\n for (const attrName in attributes) {\n if (attrNamesToIgnore && attrNamesToIgnore[attrName]) {\n continue;\n }\n element.setAttributeNS(null, attrName, attributes[attrName]);\n }\n return element;\n }\n // ### Shape & Path Methods:\n clear() {\n // Clear the SVG by removing all inner children.\n // (This approach is usually slightly more efficient\n // than removing the old SVG & adding a new one to\n // the container element, since it does not cause the\n // container to resize twice. Also, the resize\n // triggered by removing the entire SVG can trigger\n // a touchcancel event when the element resizes away\n // from a touch point.)\n while (this.svg.lastChild) {\n this.svg.removeChild(this.svg.lastChild);\n }\n // Replace the viewbox attribute we just removed.\n this.scale(this.state.scale.x, this.state.scale.y);\n }\n // ## Rectangles:\n rect(x, y, width, height, attributes) {\n // Avoid invalid negative height attributes by flipping the rectangle on its head:\n if (height < 0) {\n y += height;\n height *= -1;\n }\n const rectangle = this.create('rect');\n attributes = attributes !== null && attributes !== void 0 ? attributes : { fill: 'none', 'stroke-width': this.lineWidth, stroke: 'black' };\n this.applyAttributes(rectangle, Object.assign({ x, y, width, height }, attributes));\n this.add(rectangle);\n return this;\n }\n fillRect(x, y, width, height) {\n const attributes = { fill: this.attributes.fill };\n this.rect(x, y, width, height, attributes);\n return this;\n }\n clearRect(x, y, width, height) {\n // Currently this fills a rect with the backgroundFillStyle, rather\n // than \"cut a hole\" into the existing shapes.\n //\n // Since tabNote seems to be the only module that makes use of this\n // it may be worth creating a separate tabStave that would\n // draw lines around locations of tablature fingering.\n this.rect(x, y, width, height, { 'stroke-width': 0, fill: this.backgroundFillStyle });\n return this;\n }\n // ## Paths:\n beginPath() {\n this.path = '';\n this.pen.x = NaN;\n this.pen.y = NaN;\n return this;\n }\n moveTo(x, y) {\n this.path += 'M' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n lineTo(x, y) {\n this.path += 'L' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n bezierCurveTo(x1, y1, x2, y2, x, y) {\n this.path += 'C' + x1 + ' ' + y1 + ',' + x2 + ' ' + y2 + ',' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n quadraticCurveTo(x1, y1, x, y) {\n this.path += 'Q' + x1 + ' ' + y1 + ',' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n arc(x, y, radius, startAngle, endAngle, counterclockwise) {\n const x0 = x + radius * Math.cos(startAngle);\n const y0 = y + radius * Math.sin(startAngle);\n // Handle the edge case where arc length is greater than or equal to\n // the circle's circumference:\n // https://html.spec.whatwg.org/multipage/canvas.html#ellipse-method-steps\n if ((!counterclockwise && endAngle - startAngle >= TWO_PI) ||\n (counterclockwise && startAngle - endAngle >= TWO_PI)) {\n const x1 = x + radius * Math.cos(startAngle + Math.PI);\n const y1 = y + radius * Math.sin(startAngle + Math.PI);\n // There's no way to specify a completely circular arc in SVG so we have to\n // use two semi-circular arcs.\n this.path += `M${x0} ${y0} A${radius} ${radius} 0 0 0 ${x1} ${y1} `;\n this.path += `A${radius} ${radius} 0 0 0 ${x0} ${y0}`;\n this.pen.x = x0;\n this.pen.y = y0;\n }\n else {\n const x1 = x + radius * Math.cos(endAngle);\n const y1 = y + radius * Math.sin(endAngle);\n startAngle = normalizeAngle(startAngle);\n endAngle = normalizeAngle(endAngle);\n let large;\n if (Math.abs(endAngle - startAngle) < Math.PI) {\n large = counterclockwise;\n }\n else {\n large = !counterclockwise;\n }\n if (startAngle > endAngle) {\n large = !large;\n }\n const sweep = !counterclockwise;\n this.path += `M${x0} ${y0} A${radius} ${radius} 0 ${+large} ${+sweep} ${x1} ${y1}`;\n this.pen.x = x1;\n this.pen.y = y1;\n }\n return this;\n }\n closePath() {\n this.path += 'Z';\n return this;\n }\n getShadowStyle() {\n const sa = this.shadow_attributes;\n // A CSS drop-shadow filter blur looks different than a canvas shadowBlur\n // of the same radius, so we scale the drop-shadow radius here to make it\n // look close to the canvas shadow.\n return `filter: drop-shadow(0 0 ${sa.width / 1.5}px ${sa.color})`;\n }\n fill(attributes) {\n const path = this.create('path');\n if (typeof attributes === 'undefined') {\n attributes = Object.assign(Object.assign({}, this.attributes), { stroke: 'none' });\n }\n attributes.d = this.path;\n if (this.shadow_attributes.width > 0) {\n attributes.style = this.getShadowStyle();\n }\n this.applyAttributes(path, attributes);\n this.add(path);\n return this;\n }\n stroke() {\n const path = this.create('path');\n const attributes = Object.assign(Object.assign({}, this.attributes), { fill: 'none', 'stroke-width': this.lineWidth, d: this.path });\n if (this.shadow_attributes.width > 0) {\n attributes.style = this.getShadowStyle();\n }\n this.applyAttributes(path, attributes);\n this.add(path);\n return this;\n }\n // ## Text Methods:\n measureText(text) {\n return SVGContext.measureTextCache.lookup(text, this.svg, this.attributes);\n }\n fillText(text, x, y) {\n if (!text || text.length <= 0) {\n return this;\n }\n const attributes = Object.assign(Object.assign({}, this.attributes), { stroke: 'none', x,\n y });\n const txt = this.create('text');\n txt.textContent = text;\n this.applyAttributes(txt, attributes);\n this.add(txt);\n return this;\n }\n // TODO: State should be deep-copied.\n save() {\n this.state_stack.push({\n state: {\n 'font-family': this.state['font-family'],\n 'font-weight': this.state['font-weight'],\n 'font-style': this.state['font-style'],\n 'font-size': this.state['font-size'],\n scale: this.state.scale,\n },\n attributes: {\n 'font-family': this.attributes['font-family'],\n 'font-weight': this.attributes['font-weight'],\n 'font-style': this.attributes['font-style'],\n 'font-size': this.attributes['font-size'],\n fill: this.attributes.fill,\n stroke: this.attributes.stroke,\n 'stroke-width': this.attributes['stroke-width'],\n 'stroke-dasharray': this.attributes['stroke-dasharray'],\n },\n shadow_attributes: {\n width: this.shadow_attributes.width,\n color: this.shadow_attributes.color,\n },\n lineWidth: this.lineWidth,\n });\n return this;\n }\n // TODO: State should be deep-restored.\n restore() {\n const savedState = this.state_stack.pop();\n if (savedState) {\n const state = savedState;\n this.state['font-family'] = state.state['font-family'];\n this.state['font-weight'] = state.state['font-weight'];\n this.state['font-style'] = state.state['font-style'];\n this.state['font-size'] = state.state['font-size'];\n this.state.scale = state.state.scale;\n this.attributes['font-family'] = state.attributes['font-family'];\n this.attributes['font-weight'] = state.attributes['font-weight'];\n this.attributes['font-style'] = state.attributes['font-style'];\n this.attributes['font-size'] = state.attributes['font-size'];\n this.attributes.fill = state.attributes.fill;\n this.attributes.stroke = state.attributes.stroke;\n this.attributes['stroke-width'] = state.attributes['stroke-width'];\n this.attributes['stroke-dasharray'] = state.attributes['stroke-dasharray'];\n this.shadow_attributes.width = state.shadow_attributes.width;\n this.shadow_attributes.color = state.shadow_attributes.color;\n this.lineWidth = state.lineWidth;\n }\n return this;\n }\n set fillStyle(style) {\n this.setFillStyle(style);\n }\n get fillStyle() {\n return this.attributes.fill;\n }\n set strokeStyle(style) {\n this.setStrokeStyle(style);\n }\n get strokeStyle() {\n return this.attributes.stroke;\n }\n /**\n * @param f is 1) a `FontInfo` object or\n * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or\n * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided).\n * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt').\n * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900). It is inserted\n * into the font-weight attribute (e.g., font-weight=\"bold\")\n * @param style is a string (e.g., 'italic', 'normal') that is inserted into the\n * font-style attribute (e.g., font-style=\"italic\")\n */\n setFont(f, size, weight, style) {\n const fontInfo = Font.validate(f, size, weight, style);\n this.fontCSSString = Font.toCSSString(fontInfo);\n const fontAttributes = {\n 'font-family': fontInfo.family,\n 'font-size': fontInfo.size,\n 'font-weight': fontInfo.weight,\n 'font-style': fontInfo.style,\n };\n this.attributes = Object.assign(Object.assign({}, this.attributes), fontAttributes);\n this.state = Object.assign(Object.assign({}, this.state), fontAttributes);\n return this;\n }\n /** Return a string of the form `'italic bold 15pt Arial'` */\n getFont() {\n return this.fontCSSString;\n }\n}\nSVGContext.measureTextCache = new MeasureTextCache();\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { CanvasContext } from './canvascontext';\nimport { SVGContext } from './svgcontext';\nimport { isRenderContext } from './typeguard';\nimport { RuntimeError } from './util';\nimport { isHTMLCanvas, isHTMLDiv } from './web';\nexport var RendererBackends;\n(function (RendererBackends) {\n RendererBackends[RendererBackends[\"CANVAS\"] = 1] = \"CANVAS\";\n RendererBackends[RendererBackends[\"SVG\"] = 2] = \"SVG\";\n})(RendererBackends || (RendererBackends = {}));\n// End of line types\nexport var RendererLineEndType;\n(function (RendererLineEndType) {\n RendererLineEndType[RendererLineEndType[\"NONE\"] = 1] = \"NONE\";\n RendererLineEndType[RendererLineEndType[\"UP\"] = 2] = \"UP\";\n RendererLineEndType[RendererLineEndType[\"DOWN\"] = 3] = \"DOWN\";\n})(RendererLineEndType || (RendererLineEndType = {}));\n/**\n * Support Canvas & SVG rendering contexts.\n */\nexport class Renderer {\n constructor(arg0, arg1) {\n if (isRenderContext(arg0)) {\n // The user has provided what looks like a RenderContext, let's just use it.\n this.ctx = arg0;\n }\n else {\n if (arg1 === undefined) {\n // The backend must be specified if the render context isn't directly provided.\n throw new RuntimeError('InvalidArgument', 'Missing backend argument');\n }\n const backend = arg1;\n let element;\n if (typeof arg0 == 'string') {\n const maybeElement = document.getElementById(arg0);\n if (!maybeElement) {\n throw new RuntimeError('BadElementId', `Can't find element with ID \"${maybeElement}\"`);\n }\n element = maybeElement;\n }\n else {\n element = arg0;\n }\n // Verify backend and create context\n if (backend === Renderer.Backends.CANVAS) {\n if (!isHTMLCanvas(element)) {\n throw new RuntimeError('BadElement', 'CANVAS context requires an HTMLCanvasElement.');\n }\n const context = element.getContext('2d');\n if (!context) {\n throw new RuntimeError('BadElement', \"Can't get canvas context\");\n }\n this.ctx = new CanvasContext(context);\n }\n else if (backend === Renderer.Backends.SVG) {\n if (!isHTMLDiv(element)) {\n throw new RuntimeError('BadElement', 'SVG context requires an HTMLDivElement.');\n }\n this.ctx = new SVGContext(element);\n }\n else {\n throw new RuntimeError('InvalidBackend', `No support for backend: ${backend}`);\n }\n }\n }\n static buildContext(elementId, backend, width, height, background = '#FFF') {\n const renderer = new Renderer(elementId, backend);\n if (width && height) {\n renderer.resize(width, height);\n }\n const ctx = renderer.getContext();\n ctx.setBackgroundFillStyle(background);\n Renderer.lastContext = ctx;\n return ctx;\n }\n static getCanvasContext(elementId, width, height, background) {\n return Renderer.buildContext(elementId, Renderer.Backends.CANVAS, width, height, background);\n }\n static getSVGContext(elementId, width, height, background) {\n return Renderer.buildContext(elementId, Renderer.Backends.SVG, width, height, background);\n }\n // Draw a dashed line (horizontal, vertical or diagonal\n // dashPattern = [3,3] draws a 3 pixel dash followed by a three pixel space.\n // setting the second number to 0 draws a solid line.\n static drawDashedLine(context, fromX, fromY, toX, toY, dashPattern) {\n context.beginPath();\n const dx = toX - fromX;\n const dy = toY - fromY;\n const angle = Math.atan2(dy, dx);\n let x = fromX;\n let y = fromY;\n context.moveTo(fromX, fromY);\n let idx = 0;\n let draw = true;\n while (!((dx < 0 ? x <= toX : x >= toX) && (dy < 0 ? y <= toY : y >= toY))) {\n const dashLength = dashPattern[idx++ % dashPattern.length];\n const nx = x + Math.cos(angle) * dashLength;\n x = dx < 0 ? Math.max(toX, nx) : Math.min(toX, nx);\n const ny = y + Math.sin(angle) * dashLength;\n y = dy < 0 ? Math.max(toY, ny) : Math.min(toY, ny);\n if (draw) {\n context.lineTo(x, y);\n }\n else {\n context.moveTo(x, y);\n }\n draw = !draw;\n }\n context.closePath();\n context.stroke();\n }\n resize(width, height) {\n this.ctx.resize(width, height);\n return this;\n }\n getContext() {\n return this.ctx;\n }\n}\nRenderer.Backends = RendererBackends;\nRenderer.LineEndType = RendererLineEndType;\n// Used by vexflow_test_helpers.ts\n// Should this be private?\n// Can we do this in a cleaner way?\nRenderer.lastContext = undefined;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport var Justification;\n(function (Justification) {\n Justification[Justification[\"LEFT\"] = 1] = \"LEFT\";\n Justification[Justification[\"CENTER\"] = 2] = \"CENTER\";\n Justification[Justification[\"RIGHT\"] = 3] = \"RIGHT\";\n})(Justification || (Justification = {}));\n/**\n * `TextNote` is a notation element that is positioned in time. Generally\n * meant for objects that sit above/below the staff and inline with each other.\n * `TextNote` has to be assigned to a `Stave` before rendering by means of `setStave`.\n * Examples of this would be such as dynamics, lyrics, chord changes, etc.\n */\nexport class TextNote extends Note {\n constructor(noteStruct) {\n super(noteStruct);\n this.text = noteStruct.text || '';\n this.superscript = noteStruct.superscript;\n this.subscript = noteStruct.subscript;\n this.setFont(noteStruct.font);\n this.line = noteStruct.line || 0;\n this.smooth = noteStruct.smooth || false;\n this.ignore_ticks = noteStruct.ignore_ticks || false;\n this.justification = Justification.LEFT;\n // Determine and set initial note width. Note that the text width is\n // an approximation and isn't very accurate. The only way to accurately\n // measure the length of text is with `CanvasRenderingContext2D.measureText()`.\n if (noteStruct.glyph) {\n const struct = TextNote.GLYPHS[noteStruct.glyph];\n if (!struct)\n throw new RuntimeError('Invalid glyph type: ' + noteStruct.glyph);\n this.glyph = new Glyph(struct.code, 40, { category: 'textNote' });\n this.setWidth(this.glyph.getMetrics().width);\n }\n else {\n this.glyph = undefined;\n }\n }\n static get CATEGORY() {\n return Category.TextNote;\n }\n static get Justification() {\n return Justification;\n }\n /** Glyph data. */\n static get GLYPHS() {\n return {\n segno: {\n code: 'segno',\n },\n tr: {\n code: 'ornamentTrill',\n },\n mordent: {\n code: 'ornamentMordent',\n },\n mordent_upper: {\n code: 'ornamentShortTrill',\n },\n mordent_lower: {\n code: 'ornamentMordent',\n },\n f: {\n code: 'dynamicForte',\n },\n p: {\n code: 'dynamicPiano',\n },\n m: {\n code: 'dynamicMezzo',\n },\n s: {\n code: 'dynamicSforzando',\n },\n z: {\n code: 'dynamicZ',\n },\n coda: {\n code: 'coda',\n },\n pedal_open: {\n code: 'keyboardPedalPed',\n },\n pedal_close: {\n code: 'keyboardPedalUp',\n },\n caesura_straight: {\n code: 'caesura',\n },\n caesura_curved: {\n code: 'caesuraCurved',\n },\n breath: {\n code: 'breathMarkComma',\n },\n tick: {\n code: 'breathMarkTick',\n },\n turn: {\n code: 'ornamentTurn',\n },\n turn_inverted: {\n code: 'ornamentTurnSlash',\n },\n };\n }\n /** Set the horizontal justification of the TextNote. */\n setJustification(just) {\n this.justification = just;\n return this;\n }\n /** Set the Stave line on which the note should be placed. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Pre-render formatting. */\n preFormat() {\n if (this.preFormatted)\n return;\n const tickContext = this.checkTickContext(`Can't preformat without a TickContext.`);\n if (this.smooth) {\n this.setWidth(0);\n }\n else {\n if (this.glyph) {\n // Width already set.\n }\n else {\n const ctx = this.checkContext();\n ctx.setFont(this.textFont);\n this.setWidth(ctx.measureText(this.text).width);\n }\n }\n if (this.justification === Justification.CENTER) {\n this.leftDisplacedHeadPx = this.width / 2;\n }\n else if (this.justification === Justification.RIGHT) {\n this.leftDisplacedHeadPx = this.width;\n }\n // We reposition to the center of the note head\n this.rightDisplacedHeadPx = tickContext.getMetrics().glyphPx / 2;\n this.preFormatted = true;\n }\n /**\n * Renders the TextNote.\n * `TextNote` has to be assigned to a `Stave` before rendering by means of `setStave`.\n */\n draw() {\n const ctx = this.checkContext();\n const stave = this.checkStave();\n const tickContext = this.checkTickContext(`Can't draw without a TickContext.`);\n this.setRendered();\n // Reposition to center of note head\n let x = this.getAbsoluteX() + tickContext.getMetrics().glyphPx / 2;\n // Align based on tick-context width.\n const width = this.getWidth();\n if (this.justification === Justification.CENTER) {\n x -= width / 2;\n }\n else if (this.justification === Justification.RIGHT) {\n x -= width;\n }\n let y;\n if (this.glyph) {\n y = stave.getYForLine(this.line + -3);\n this.glyph.render(ctx, x, y);\n }\n else {\n y = stave.getYForLine(this.line + -3);\n this.applyStyle(ctx);\n ctx.setFont(this.textFont);\n ctx.fillText(this.text, x, y);\n const height = ctx.measureText(this.text).height;\n // We called this.setFont(...) in the constructor, so we know this.textFont is available.\n // eslint-disable-next-line\n const { family, size, weight, style } = this.textFont;\n // Scale the font size by 1/1.3.\n const smallerFontSize = Font.scaleSize(size, 0.769231);\n if (this.superscript) {\n ctx.setFont(family, smallerFontSize, weight, style);\n ctx.fillText(this.superscript, x + this.width + 2, y - height / 2.2);\n }\n if (this.subscript) {\n ctx.setFont(family, smallerFontSize, weight, style);\n ctx.fillText(this.subscript, x + this.width + 2, y + height / 2.2 - 1);\n }\n this.restoreStyle(ctx);\n }\n }\n}\nTextNote.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 12,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Larry Kuhns 2011\nimport { Font, FontStyle, FontWeight } from './font';\nimport { StaveModifier } from './stavemodifier';\nimport { Category } from './typeguard';\nexport var VoltaType;\n(function (VoltaType) {\n VoltaType[VoltaType[\"NONE\"] = 1] = \"NONE\";\n VoltaType[VoltaType[\"BEGIN\"] = 2] = \"BEGIN\";\n VoltaType[VoltaType[\"MID\"] = 3] = \"MID\";\n VoltaType[VoltaType[\"END\"] = 4] = \"END\";\n VoltaType[VoltaType[\"BEGIN_END\"] = 5] = \"BEGIN_END\";\n})(VoltaType || (VoltaType = {}));\nexport class Volta extends StaveModifier {\n constructor(type, number, x, y_shift) {\n super();\n this.volta = type;\n this.x = x;\n this.y_shift = y_shift;\n this.number = number;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.Volta;\n }\n static get type() {\n return VoltaType;\n }\n setShiftY(y) {\n this.y_shift = y;\n return this;\n }\n draw(stave, x) {\n const ctx = stave.checkContext();\n this.setRendered();\n let width = stave.getWidth() - x; // don't include x (offset) for width\n const top_y = stave.getYForTopText(stave.getNumLines()) + this.y_shift;\n const vert_height = 1.5 * stave.getSpacingBetweenLines();\n switch (this.volta) {\n case VoltaType.BEGIN:\n ctx.fillRect(this.x + x, top_y, 1, vert_height);\n break;\n case VoltaType.END:\n width -= 5;\n ctx.fillRect(this.x + x + width, top_y, 1, vert_height);\n break;\n case VoltaType.BEGIN_END:\n width -= 3;\n ctx.fillRect(this.x + x, top_y, 1, vert_height);\n ctx.fillRect(this.x + x + width, top_y, 1, vert_height);\n break;\n default:\n break;\n }\n // If the beginning of a volta, draw measure number\n if (this.volta === VoltaType.BEGIN || this.volta === VoltaType.BEGIN_END) {\n ctx.save();\n ctx.setFont(this.textFont);\n ctx.fillText(this.number, this.x + x + 5, top_y + 15);\n ctx.restore();\n }\n ctx.fillRect(this.x + x, top_y, width, 1);\n return this;\n }\n}\nVolta.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 9,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Larry Kuhns\n//\n// This file implements the `StringNumber` class which renders string\n// number annotations beside notes.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { Renderer } from './renderer';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category, isStaveNote, isStemmableNote } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StringNumber extends Modifier {\n constructor(number) {\n super();\n this.string_number = number;\n this.setWidth(20); // ???\n this.position = Modifier.Position.ABOVE; // Default position above stem or note head\n this.x_shift = 0;\n this.y_shift = 0;\n this.text_line = 0;\n this.stem_offset = 0;\n this.x_offset = 0; // Horizontal offset from default\n this.y_offset = 0; // Vertical offset from default\n this.dashed = true; // true - draw dashed extension false - no extension\n this.leg = Renderer.LineEndType.NONE; // draw upward/downward leg at the of extension line\n this.radius = 8;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StringNumber;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static get metrics() {\n return Tables.currentMusicFont().getMetrics().glyphs.stringNumber;\n }\n // ## Static Methods\n // Arrange string numbers inside a `ModifierContext`\n static format(nums, state) {\n const left_shift = state.left_shift;\n const right_shift = state.right_shift;\n const num_spacing = 1;\n if (!nums || nums.length === 0)\n return false;\n const nums_list = [];\n let prev_note = null;\n let shift_left = 0;\n let shift_right = 0;\n const modLines = 0;\n for (let i = 0; i < nums.length; ++i) {\n const num = nums[i];\n const note = num.getNote();\n const pos = num.getPosition();\n if (!isStaveNote(note)) {\n throw new RuntimeError('NoStaveNote');\n }\n const index = num.checkIndex();\n const props = note.getKeyProps()[index];\n const mc = note.getModifierContext();\n const verticalSpaceNeeded = (num.radius * 2) / Tables.STAVE_LINE_DISTANCE + 0.5;\n if (mc) {\n if (pos === ModifierPosition.ABOVE) {\n num.text_line = mc.getState().top_text_line;\n state.top_text_line += verticalSpaceNeeded;\n }\n else if (pos === ModifierPosition.BELOW) {\n num.text_line = mc.getState().text_line;\n state.text_line += verticalSpaceNeeded;\n }\n }\n if (note !== prev_note) {\n for (let n = 0; n < note.keys.length; ++n) {\n if (left_shift === 0) {\n shift_left = Math.max(note.getLeftDisplacedHeadPx(), shift_left);\n }\n if (right_shift === 0) {\n shift_right = Math.max(note.getRightDisplacedHeadPx(), shift_right);\n }\n }\n prev_note = note;\n }\n const glyphLine = modLines === 0 ? props.line : modLines;\n nums_list.push({\n pos,\n note,\n num,\n line: glyphLine,\n shiftL: shift_left,\n shiftR: shift_right,\n });\n }\n // Sort string numbers by line number.\n nums_list.sort((a, b) => b.line - a.line);\n let num_shiftR = 0;\n let x_widthL = 0;\n let x_widthR = 0;\n let last_line = null;\n let last_note = null;\n for (let i = 0; i < nums_list.length; ++i) {\n let num_shift = 0;\n const note = nums_list[i].note;\n const pos = nums_list[i].pos;\n const num = nums_list[i].num;\n const line = nums_list[i].line;\n const shiftR = nums_list[i].shiftR;\n // Reset the position of the string number every line.\n if (line !== last_line || note !== last_note) {\n num_shiftR = right_shift + shiftR;\n }\n const num_width = num.getWidth() + num_spacing;\n if (pos === Modifier.Position.LEFT) {\n num.setXShift(left_shift);\n num_shift = shift_left + num_width; // spacing\n x_widthL = num_shift > x_widthL ? num_shift : x_widthL;\n }\n else if (pos === Modifier.Position.RIGHT) {\n num.setXShift(num_shiftR);\n num_shift += num_width; // spacing\n x_widthR = num_shift > x_widthR ? num_shift : x_widthR;\n }\n last_line = line;\n last_note = note;\n }\n state.left_shift += x_widthL;\n state.right_shift += x_widthR;\n return true;\n }\n setLineEndType(leg) {\n if (leg >= Renderer.LineEndType.NONE && leg <= Renderer.LineEndType.DOWN) {\n this.leg = leg;\n }\n return this;\n }\n setStringNumber(number) {\n this.string_number = number;\n return this;\n }\n setOffsetX(x) {\n this.x_offset = x;\n return this;\n }\n setOffsetY(y) {\n this.y_offset = y;\n return this;\n }\n setLastNote(note) {\n this.last_note = note;\n return this;\n }\n setDashed(dashed) {\n this.dashed = dashed;\n return this;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(this.position, this.index);\n const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP;\n let dot_x = start.x + this.x_shift + this.x_offset;\n let stem_ext = {};\n if (note.hasStem()) {\n stem_ext = note.checkStem().getExtents();\n }\n let dot_y = start.y + this.y_shift + this.y_offset;\n switch (this.position) {\n case Modifier.Position.ABOVE:\n {\n const ys = note.getYs();\n dot_y = ys.reduce((a, b) => (a < b ? a : b));\n if (note.hasStem() && stemDirection == Stem.UP) {\n dot_y = stem_ext.topY + StringNumber.metrics.stemPadding;\n }\n dot_y -= this.radius + StringNumber.metrics.verticalPadding + this.text_line * Tables.STAVE_LINE_DISTANCE;\n }\n break;\n case Modifier.Position.BELOW:\n {\n const ys = note.getYs();\n dot_y = ys.reduce((a, b) => (a > b ? a : b));\n if (note.hasStem() && stemDirection == Stem.DOWN) {\n dot_y = stem_ext.topY - StringNumber.metrics.stemPadding;\n }\n dot_y += this.radius + StringNumber.metrics.verticalPadding + this.text_line * Tables.STAVE_LINE_DISTANCE;\n }\n break;\n case Modifier.Position.LEFT:\n dot_x -= this.radius / 2 + StringNumber.metrics.leftPadding;\n break;\n case Modifier.Position.RIGHT:\n dot_x += this.radius / 2 + StringNumber.metrics.rightPadding;\n break;\n default:\n throw new RuntimeError('InvalidPosition', `The position ${this.position} is invalid`);\n }\n ctx.save();\n ctx.beginPath();\n ctx.arc(dot_x, dot_y, this.radius, 0, Math.PI * 2, false);\n ctx.setLineWidth(1.5);\n ctx.stroke();\n ctx.setFont(this.textFont);\n const x = dot_x - ctx.measureText(this.string_number).width / 2;\n ctx.fillText('' + this.string_number, x, dot_y + 4.5);\n const lastNote = this.last_note;\n if (isStemmableNote(lastNote)) {\n // Only StemmableNote objects have getStemX().\n const end = lastNote.getStemX() - note.getX() + 5;\n ctx.setStrokeStyle('#000000');\n ctx.setLineCap('round');\n ctx.setLineWidth(0.6);\n if (this.dashed) {\n Renderer.drawDashedLine(ctx, dot_x + 10, dot_y, dot_x + end, dot_y, [3, 3]);\n }\n else {\n Renderer.drawDashedLine(ctx, dot_x + 10, dot_y, dot_x + end, dot_y, [3, 0]);\n }\n let len;\n let pattern;\n switch (this.leg) {\n case Renderer.LineEndType.UP:\n len = -10;\n pattern = this.dashed ? [3, 3] : [3, 0];\n Renderer.drawDashedLine(ctx, dot_x + end, dot_y, dot_x + end, dot_y + len, pattern);\n break;\n case Renderer.LineEndType.DOWN:\n len = 10;\n pattern = this.dashed ? [3, 3] : [3, 0];\n Renderer.drawDashedLine(ctx, dot_x + end, dot_y, dot_x + end, dot_y + len, pattern);\n break;\n default:\n break;\n }\n }\n ctx.restore();\n }\n}\nStringNumber.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: Font.SIZE,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Larry Kuhns\n//\n// This file implements the `Stroke` class which renders chord strokes\n// that can be arpeggiated, brushed, rasquedo, etc.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Category, isNote, isStaveNote, isTabNote } from './typeguard';\nimport { RuntimeError } from './util';\nexport class Stroke extends Modifier {\n constructor(type, options) {\n super();\n this.options = Object.assign({ all_voices: true }, options);\n // multi voice - span stroke across all voices if true\n this.all_voices = this.options.all_voices;\n // multi voice - end note of stroke, set in draw()\n this.type = type;\n this.position = Modifier.Position.LEFT;\n this.render_options = {\n font_scale: 38,\n };\n this.resetFont();\n this.setXShift(0);\n this.setWidth(10);\n }\n static get CATEGORY() {\n return Category.Stroke;\n }\n // Arrange strokes inside `ModifierContext`\n static format(strokes, state) {\n const left_shift = state.left_shift;\n const stroke_spacing = 0;\n if (!strokes || strokes.length === 0)\n return false;\n const strokeList = strokes.map((stroke) => {\n const note = stroke.getNote();\n const index = stroke.checkIndex();\n if (isStaveNote(note)) {\n // Only StaveNote objects have getKeyProps().\n const { line } = note.getKeyProps()[index];\n const shift = note.getLeftDisplacedHeadPx();\n return { line, shift, stroke };\n }\n else if (isTabNote(note)) {\n // Only TabNote objects have getPositions().\n const { str: string } = note.getPositions()[index];\n return { line: string, shift: 0, stroke };\n }\n else {\n throw new RuntimeError('Internal', 'Unexpected instance.');\n }\n });\n const strokeShift = left_shift;\n // There can only be one stroke .. if more than one, they overlay each other\n const xShift = strokeList.reduce((xShift, { stroke, shift }) => {\n stroke.setXShift(strokeShift + shift);\n return Math.max(stroke.getWidth() + stroke_spacing, xShift);\n }, 0);\n state.left_shift += xShift;\n return true;\n }\n getPosition() {\n return this.position;\n }\n addEndNote(note) {\n this.note_end = note;\n return this;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(this.position, this.index);\n let ys = note.getYs();\n let topY = start.y;\n let botY = start.y;\n const x = start.x - 5;\n const line_space = note.checkStave().getSpacingBetweenLines();\n const notes = this.checkModifierContext().getMembers(note.getCategory());\n for (let i = 0; i < notes.length; i++) {\n const note = notes[i];\n if (isNote(note)) {\n // Only Note objects have getYs().\n // note is an instance of either StaveNote or TabNote.\n ys = note.getYs();\n for (let n = 0; n < ys.length; n++) {\n if (this.note === notes[i] || this.all_voices) {\n topY = Math.min(topY, ys[n]);\n botY = Math.max(botY, ys[n]);\n }\n }\n }\n }\n let arrow = '';\n let arrow_shift_x = 0;\n let arrow_y = 0;\n let text_shift_x = 0;\n let text_y = 0;\n switch (this.type) {\n case Stroke.Type.BRUSH_DOWN:\n arrow = 'arrowheadBlackUp';\n arrow_shift_x = -3;\n arrow_y = topY - line_space / 2 + 10;\n botY += line_space / 2;\n break;\n case Stroke.Type.BRUSH_UP:\n arrow = 'arrowheadBlackDown';\n arrow_shift_x = 0.5;\n arrow_y = botY + line_space / 2;\n topY -= line_space / 2;\n break;\n case Stroke.Type.ROLL_DOWN:\n case Stroke.Type.RASQUEDO_DOWN:\n arrow = 'arrowheadBlackUp';\n arrow_shift_x = -3;\n text_shift_x = this.x_shift + arrow_shift_x - 2;\n if (isStaveNote(note)) {\n topY += 1.5 * line_space;\n if ((botY - topY) % 2 !== 0) {\n botY += 0.5 * line_space;\n }\n else {\n botY += line_space;\n }\n arrow_y = topY - line_space;\n text_y = botY + line_space + 2;\n }\n else {\n topY += 1.5 * line_space;\n botY += line_space;\n arrow_y = topY - 0.75 * line_space;\n text_y = botY + 0.25 * line_space;\n }\n break;\n case Stroke.Type.ROLL_UP:\n case Stroke.Type.RASQUEDO_UP:\n arrow = 'arrowheadBlackDown';\n arrow_shift_x = -4;\n text_shift_x = this.x_shift + arrow_shift_x - 1;\n if (isStaveNote(note)) {\n arrow_y = line_space / 2;\n topY += 0.5 * line_space;\n if ((botY - topY) % 2 === 0) {\n botY += line_space / 2;\n }\n arrow_y = botY + 0.5 * line_space;\n text_y = topY - 1.25 * line_space;\n }\n else {\n topY += 0.25 * line_space;\n botY += 0.5 * line_space;\n arrow_y = botY + 0.25 * line_space;\n text_y = topY - line_space;\n }\n break;\n case Stroke.Type.ARPEGGIO_DIRECTIONLESS:\n topY += 0.5 * line_space;\n botY += line_space; // * 0.5 can lead to slight underlap instead of overlap sometimes\n break;\n default:\n throw new RuntimeError('InvalidType', `The stroke type ${this.type} does not exist`);\n }\n let strokeLine = 'straight';\n // Draw the stroke\n if (this.type === Stroke.Type.BRUSH_DOWN || this.type === Stroke.Type.BRUSH_UP) {\n ctx.fillRect(x + this.x_shift, topY, 1, botY - topY);\n }\n else {\n strokeLine = 'wiggly';\n if (isStaveNote(note)) {\n for (let i = topY; i <= botY; i += line_space) {\n Glyph.renderGlyph(ctx, x + this.x_shift - 4, i, this.render_options.font_scale, 'vexWiggleArpeggioUp');\n }\n }\n else {\n let i;\n for (i = topY; i <= botY; i += 10) {\n Glyph.renderGlyph(ctx, x + this.x_shift - 4, i, this.render_options.font_scale, 'vexWiggleArpeggioUp');\n }\n if (this.type === Stroke.Type.RASQUEDO_DOWN) {\n text_y = i + 0.25 * line_space;\n }\n }\n }\n if (this.type === Stroke.Type.ARPEGGIO_DIRECTIONLESS) {\n return; // skip drawing arrow heads or text\n }\n // Draw the arrow head\n Glyph.renderGlyph(ctx, x + this.x_shift + arrow_shift_x, arrow_y, this.render_options.font_scale, arrow, {\n category: `stroke.${arrow}.${strokeLine}`,\n });\n // Draw the rasquedo \"R\"\n if (this.type === Stroke.Type.RASQUEDO_DOWN || this.type === Stroke.Type.RASQUEDO_UP) {\n ctx.save();\n ctx.setFont(this.textFont);\n ctx.fillText('R', x + text_shift_x, text_y);\n ctx.restore();\n }\n }\n}\nStroke.Type = {\n BRUSH_DOWN: 1,\n BRUSH_UP: 2,\n ROLL_DOWN: 3,\n ROLL_UP: 4,\n RASQUEDO_DOWN: 5,\n RASQUEDO_UP: 6,\n ARPEGGIO_DIRECTIONLESS: 7, // Arpeggiated chord without upwards or downwards arrow\n};\nStroke.TEXT_FONT = {\n family: Font.SERIF,\n size: Font.SIZE,\n weight: FontWeight.BOLD,\n style: FontStyle.ITALIC,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Bend } from './bend';\nimport { Modifier } from './modifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\n/** `Vibrato` implements diverse vibratos. */\nexport class Vibrato extends Modifier {\n constructor() {\n super();\n this.position = Modifier.Position.RIGHT;\n this.render_options = {\n harsh: false,\n vibrato_width: 20,\n wave_height: 6,\n wave_width: 4,\n wave_girth: 2,\n };\n this.setVibratoWidth(this.render_options.vibrato_width);\n }\n static get CATEGORY() {\n return Category.Vibrato;\n }\n /** Arrange vibratos inside a `ModifierContext`. */\n static format(vibratos, state, context) {\n if (!vibratos || vibratos.length === 0)\n return false;\n // Vibratos are always on top.\n let text_line = state.top_text_line;\n let width = 0;\n let shift = state.right_shift - 7;\n // If there's a bend, drop the text line\n const bends = context.getMembers(Bend.CATEGORY);\n if (bends && bends.length > 0) {\n const bendHeight = bends.map((bb) => bb.getTextHeight()).reduce((a, b) => (a > b ? a : b)) / Tables.STAVE_LINE_DISTANCE;\n text_line = text_line - (bendHeight + 1);\n }\n else {\n state.top_text_line += 1;\n }\n // Format Vibratos\n for (let i = 0; i < vibratos.length; ++i) {\n const vibrato = vibratos[i];\n vibrato.setXShift(shift);\n vibrato.setTextLine(text_line);\n width += vibrato.getWidth();\n shift += width;\n }\n state.right_shift += width;\n return true;\n }\n /** Set harsh vibrato. */\n setHarsh(harsh) {\n this.render_options.harsh = harsh;\n return this;\n }\n /** Set vibrato width in pixels. */\n setVibratoWidth(width) {\n this.render_options.vibrato_width = width;\n this.setWidth(width);\n return this;\n }\n /** Draw the vibrato on the rendering context. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(Modifier.Position.RIGHT, this.index);\n const vx = start.x + this.x_shift;\n const vy = note.getYForTopText(this.text_line) + 2;\n Vibrato.renderVibrato(ctx, vx, vy, this.render_options);\n }\n /**\n * Static rendering method that can be called from\n * other classes (e.g. VibratoBracket).\n */\n static renderVibrato(ctx, x, y, opts) {\n const { harsh, vibrato_width, wave_width, wave_girth, wave_height } = opts;\n const num_waves = vibrato_width / wave_width;\n ctx.beginPath();\n let i;\n if (harsh) {\n ctx.moveTo(x, y + wave_girth + 1);\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.lineTo(x + wave_width, y - wave_height / 2);\n x += wave_width;\n ctx.lineTo(x + wave_width, y + wave_height / 2);\n x += wave_width;\n }\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.lineTo(x - wave_width, y - wave_height / 2 + wave_girth + 1);\n x -= wave_width;\n ctx.lineTo(x - wave_width, y + wave_height / 2 + wave_girth + 1);\n x -= wave_width;\n }\n ctx.fill();\n }\n else {\n ctx.moveTo(x, y + wave_girth);\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.quadraticCurveTo(x + wave_width / 2, y - wave_height / 2, x + wave_width, y);\n x += wave_width;\n ctx.quadraticCurveTo(x + wave_width / 2, y + wave_height / 2, x + wave_width, y);\n x += wave_width;\n }\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.quadraticCurveTo(x - wave_width / 2, y + wave_height / 2 + wave_girth, x - wave_width, y + wave_girth);\n x -= wave_width;\n ctx.quadraticCurveTo(x - wave_width / 2, y - wave_height / 2 + wave_girth, x - wave_width, y + wave_girth);\n x -= wave_width;\n }\n ctx.fill();\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This class implements various types of members to notes (e.g. bends,\n// fingering positions etc.)\nimport { Accidental } from './accidental';\nimport { Annotation } from './annotation';\nimport { Articulation } from './articulation';\nimport { Bend } from './bend';\nimport { ChordSymbol } from './chordsymbol';\nimport { Dot } from './dot';\nimport { FretHandFinger } from './frethandfinger';\nimport { GraceNoteGroup } from './gracenotegroup';\nimport { NoteSubGroup } from './notesubgroup';\nimport { Ornament } from './ornament';\nimport { Parenthesis } from './parenthesis';\nimport { StaveNote } from './stavenote';\nimport { StringNumber } from './stringnumber';\nimport { Stroke } from './strokes';\nimport { Category } from './typeguard';\nimport { log, RuntimeError } from './util';\nimport { Vibrato } from './vibrato';\n// To enable logging for this class. Set `Vex.Flow.ModifierContext.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (ModifierContext.DEBUG)\n log('Vex.Flow.ModifierContext', args);\n}\nexport class ModifierContext {\n constructor() {\n // Formatting data.\n this.state = {\n left_shift: 0,\n right_shift: 0,\n text_line: 0,\n top_text_line: 0,\n };\n // Current members\n this.members = {};\n this.preFormatted = false;\n this.postFormatted = false;\n this.formatted = false;\n this.width = 0;\n this.spacing = 0;\n }\n addModifier(member) {\n L('addModifier is deprecated, use addMember instead.');\n return this.addMember(member);\n }\n /**\n * this.members maps CATEGORY strings to arrays of Tickable | Modifier | StaveNote | TabNote.\n * Here we add a new member to this.members, and create a new array if needed.\n * @param member\n * @returns this\n */\n addMember(member) {\n const category = member.getCategory();\n if (!this.members[category]) {\n this.members[category] = [];\n }\n this.members[category].push(member);\n member.setModifierContext(this);\n this.preFormatted = false;\n return this;\n }\n /**\n * @deprecated\n */\n getModifiers(category) {\n L('getModifiers is deprecated, use getMembers instead.');\n return this.getMembers(category);\n }\n getMembers(category) {\n var _a;\n return (_a = this.members[category]) !== null && _a !== void 0 ? _a : [];\n }\n getWidth() {\n return this.width;\n }\n getLeftShift() {\n return this.state.left_shift;\n }\n getRightShift() {\n return this.state.right_shift;\n }\n getState() {\n return this.state;\n }\n getMetrics() {\n if (!this.formatted) {\n throw new RuntimeError('UnformattedMember', 'Unformatted member has no metrics.');\n }\n return {\n width: this.state.left_shift + this.state.right_shift + this.spacing,\n spacing: this.spacing,\n };\n }\n preFormat() {\n if (this.preFormatted)\n return;\n L('Preformatting ModifierContext');\n const state = this.state;\n const members = this.members;\n // The ordering below determines when different members are formatted and rendered.\n StaveNote.format(members[Category.StaveNote], state);\n Parenthesis.format(members[Category.Parenthesis], state);\n Dot.format(members[Category.Dot], state);\n FretHandFinger.format(members[Category.FretHandFinger], state);\n Accidental.format(members[Category.Accidental], state);\n Stroke.format(members[Category.Stroke], state);\n GraceNoteGroup.format(members[Category.GraceNoteGroup], state);\n NoteSubGroup.format(members[Category.NoteSubGroup], state);\n StringNumber.format(members[Category.StringNumber], state);\n Articulation.format(members[Category.Articulation], state);\n Ornament.format(members[Category.Ornament], state);\n Annotation.format(members[Category.Annotation], state);\n ChordSymbol.format(members[Category.ChordSymbol], state);\n Bend.format(members[Category.Bend], state);\n Vibrato.format(members[Category.Vibrato], state, this);\n // Update width of this member context\n this.width = state.left_shift + state.right_shift;\n this.preFormatted = true;\n }\n postFormat() {\n if (this.postFormatted)\n return;\n L('Postformatting ModifierContext');\n // If post-formatting is required for an element, add more lines below.\n StaveNote.postFormat(this.getMembers(Category.StaveNote));\n }\n}\nModifierContext.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna Cheppudira 2013.\n// Co-author: Benjamin W. Bohl\n// MIT License\nimport { Glyph } from './glyph';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Clef.DEBUG)\n log('Vex.Flow.Clef', args);\n}\n/**\n * Clef implements various types of clefs that can be rendered on a stave.\n *\n * See `tests/clef_tests.ts` for usage examples.\n */\nexport class Clef extends StaveModifier {\n /** Create a new clef. */\n constructor(type, size, annotation) {\n super();\n /**\n * The attribute `clef` must be a key from\n * `Clef.types`\n */\n this.clef = Clef.types['treble'];\n this.setPosition(StaveModifierPosition.BEGIN);\n this.setType(type, size, annotation);\n this.setWidth(Tables.currentMusicFont().lookupMetric(`clef.${this.size}.width`));\n L('Creating clef:', type);\n }\n static get CATEGORY() {\n return Category.Clef;\n }\n /**\n * Every clef name is associated with a glyph code from the font file\n * and a default stave line number.\n */\n static get types() {\n return {\n treble: {\n code: 'gClef',\n line: 3,\n point: 0,\n },\n bass: {\n code: 'fClef',\n line: 1,\n point: 0,\n },\n alto: {\n code: 'cClef',\n line: 2,\n point: 0,\n },\n tenor: {\n code: 'cClef',\n line: 1,\n point: 0,\n },\n percussion: {\n code: 'restMaxima',\n line: 2,\n point: 0,\n },\n soprano: {\n code: 'cClef',\n line: 4,\n point: 0,\n },\n 'mezzo-soprano': {\n code: 'cClef',\n line: 3,\n point: 0,\n },\n 'baritone-c': {\n code: 'cClef',\n line: 0,\n point: 0,\n },\n 'baritone-f': {\n code: 'fClef',\n line: 2,\n point: 0,\n },\n subbass: {\n code: 'fClef',\n line: 0,\n point: 0,\n },\n french: {\n code: 'gClef',\n line: 4,\n point: 0,\n },\n tab: {\n code: '6stringTabClef',\n point: 0,\n },\n };\n }\n /** Set clef type, size and annotation. */\n setType(type, size, annotation) {\n this.type = type;\n this.clef = Clef.types[type];\n if (size === undefined) {\n this.size = 'default';\n }\n else {\n this.size = size;\n }\n const musicFont = Tables.currentMusicFont();\n this.clef.point = musicFont.lookupMetric(`clef.${this.size}.point`, 0);\n this.glyph = new Glyph(this.clef.code, this.clef.point, {\n category: `clef.${this.clef.code}.${this.size}`,\n });\n // If an annotation, such as 8va, is specified, add it to the Clef object.\n if (annotation !== undefined) {\n const code = musicFont.lookupMetric(`clef.annotations.${annotation}.smuflCode`);\n const point = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.point`);\n const line = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.${this.type}.line`);\n const x_shift = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.${this.type}.shiftX`);\n this.annotation = { code, point, line, x_shift };\n this.attachment = new Glyph(this.annotation.code, this.annotation.point);\n this.attachment.metrics.x_max = 0;\n this.attachment.setXShift(this.annotation.x_shift);\n }\n else {\n this.annotation = undefined;\n }\n return this;\n }\n /** Get clef width. */\n getWidth() {\n if (this.type === 'tab') {\n defined(this.stave, 'ClefError', \"Can't get width without stave.\");\n }\n return this.width;\n }\n /** Set associated stave. */\n setStave(stave) {\n this.stave = stave;\n if (this.type === 'tab') {\n const glyph = defined(this.glyph, 'ClefError', \"Can't set stave without glyph.\");\n const numLines = this.stave.getNumLines();\n const musicFont = Tables.currentMusicFont();\n const point = musicFont.lookupMetric(`clef.lineCount.${numLines}.point`);\n const shiftY = musicFont.lookupMetric(`clef.lineCount.${numLines}.shiftY`);\n glyph.setPoint(point);\n glyph.setYShift(shiftY);\n }\n return this;\n }\n /** Render clef. */\n draw() {\n const glyph = defined(this.glyph, 'ClefError', \"Can't draw clef without glyph.\");\n const stave = this.checkStave();\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.openGroup('clef', this.getAttribute('id'));\n glyph.setStave(stave);\n glyph.setContext(ctx);\n if (this.clef.line !== undefined) {\n this.placeGlyphOnLine(glyph, stave, this.clef.line);\n }\n glyph.renderToStave(this.x);\n if (this.annotation !== undefined && this.attachment !== undefined) {\n this.placeGlyphOnLine(this.attachment, stave, this.annotation.line);\n this.attachment.setStave(stave);\n this.attachment.setContext(ctx);\n this.attachment.renderToStave(this.x);\n }\n ctx.closeGroup();\n }\n}\n/** To enable logging for this class, set `Vex.Flow.Clef.DEBUG` to `true`. */\nClef.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Cyril Silverman\n//\n// ## Description\n//\n// This file implements key signatures. A key signature sits on a stave\n// and indicates the notes with implicit accidentals.\nimport { Glyph } from './glyph';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined } from './util';\nexport class KeySignature extends StaveModifier {\n // Create a new Key Signature based on a `key_spec`\n constructor(keySpec, cancelKeySpec, alterKeySpec) {\n super();\n this.accList = [];\n this.setKeySig(keySpec, cancelKeySpec, alterKeySpec);\n this.setPosition(StaveModifierPosition.BEGIN);\n this.glyphFontScale = 38; // TODO(0xFE): Should this match StaveNote?\n this.glyphs = [];\n this.xPositions = []; // relative to this.x\n this.paddingForced = false;\n }\n static get CATEGORY() {\n return Category.KeySignature;\n }\n // Add an accidental glyph to the `KeySignature` instance which represents\n // the provided `acc`. If `nextAcc` is also provided, the appropriate\n // spacing will be included in the glyph's position\n convertToGlyph(acc, nextAcc) {\n const accGlyphData = Tables.accidentalCodes(acc.type);\n const glyph = new Glyph(accGlyphData.code, this.glyphFontScale);\n // Determine spacing between current accidental and the next accidental\n let extraWidth = 1;\n if (acc.type === 'n' && nextAcc) {\n const spacing = KeySignature.accidentalSpacing[nextAcc.type];\n if (spacing) {\n const isAbove = nextAcc.line >= acc.line;\n extraWidth = isAbove ? spacing.above : spacing.below;\n }\n }\n // Place the glyph on the stave\n this.placeGlyphOnLine(glyph, this.checkStave(), acc.line);\n this.glyphs.push(glyph);\n const xPosition = this.xPositions[this.xPositions.length - 1];\n const glyphWidth = glyph.getMetrics().width + extraWidth;\n // Store the next accidental's x position\n this.xPositions.push(xPosition + glyphWidth);\n // Expand size of key signature\n this.width += glyphWidth;\n }\n // Cancel out a key signature provided in the `spec` parameter. This will\n // place appropriate natural accidentals before the key signature.\n cancelKey(spec) {\n this.formatted = false;\n this.cancelKeySpec = spec;\n return this;\n }\n convertToCancelAccList(spec) {\n // Get the accidental list for the cancelled key signature\n const cancel_accList = Tables.keySignature(spec);\n // If the cancelled key has a different accidental type, ie: # vs b\n const different_types = this.accList.length > 0 && cancel_accList.length > 0 && cancel_accList[0].type !== this.accList[0].type;\n // Determine how many naturals needed to add\n const naturals = different_types ? cancel_accList.length : cancel_accList.length - this.accList.length;\n // Return if no naturals needed\n if (naturals < 1)\n return undefined;\n // Get the line position for each natural\n const cancelled = [];\n for (let i = 0; i < naturals; i++) {\n let index = i;\n if (!different_types) {\n index = cancel_accList.length - naturals + i;\n }\n const acc = cancel_accList[index];\n cancelled.push({ type: 'n', line: acc.line });\n }\n // Combine naturals with main accidental list for the key signature\n this.accList = cancelled.concat(this.accList);\n return {\n accList: cancelled,\n type: cancel_accList[0].type,\n };\n }\n // Deprecated\n addToStave(stave) {\n this.paddingForced = true;\n stave.addModifier(this);\n return this;\n }\n // Apply the accidental staff line placement based on the `clef` and\n // the accidental `type` for the key signature ('# or 'b').\n convertAccLines(clef, type, accList = this.accList) {\n let offset = 0.0; // if clef === \"treble\"\n let customLines; // when clef doesn't follow treble key sig shape\n switch (clef) {\n // Treble & Subbass both have offsets of 0, so are not included.\n case 'soprano':\n if (type === '#')\n customLines = [2.5, 0.5, 2, 0, 1.5, -0.5, 1];\n else\n offset = -1;\n break;\n case 'mezzo-soprano':\n if (type === 'b')\n customLines = [0, 2, 0.5, 2.5, 1, 3, 1.5];\n else\n offset = 1.5;\n break;\n case 'alto':\n offset = 0.5;\n break;\n case 'tenor':\n if (type === '#')\n customLines = [3, 1, 2.5, 0.5, 2, 0, 1.5];\n else\n offset = -0.5;\n break;\n case 'baritone-f':\n case 'baritone-c':\n if (type === 'b')\n customLines = [0.5, 2.5, 1, 3, 1.5, 3.5, 2];\n else\n offset = 2;\n break;\n case 'bass':\n case 'french':\n offset = 1;\n break;\n default:\n break;\n }\n // If there's a special case, assign those lines/spaces:\n let i;\n if (typeof customLines !== 'undefined') {\n for (i = 0; i < accList.length; ++i) {\n accList[i].line = customLines[i];\n }\n }\n else if (offset !== 0) {\n for (i = 0; i < accList.length; ++i) {\n accList[i].line += offset;\n }\n }\n }\n getPadding(index) {\n if (!this.formatted)\n this.format();\n return this.glyphs.length === 0 || (!this.paddingForced && index < 2) ? 0 : this.padding;\n }\n getWidth() {\n if (!this.formatted)\n this.format();\n return this.width;\n }\n setKeySig(keySpec, cancelKeySpec, alterKeySpec) {\n this.formatted = false;\n this.keySpec = keySpec;\n this.cancelKeySpec = cancelKeySpec;\n this.alterKeySpec = alterKeySpec;\n return this;\n }\n // Alter the accidentals of a key spec one by one.\n // Each alteration is a new accidental that replaces the\n // original accidental (or the canceled one).\n alterKey(alterKeySpec) {\n this.formatted = false;\n this.alterKeySpec = alterKeySpec;\n return this;\n }\n convertToAlterAccList(alterKeySpec) {\n const max = Math.min(alterKeySpec.length, this.accList.length);\n for (let i = 0; i < max; ++i) {\n if (alterKeySpec[i]) {\n this.accList[i].type = alterKeySpec[i];\n }\n }\n }\n format() {\n const stave = this.checkStave();\n this.width = 0;\n this.glyphs = [];\n this.xPositions = [0]; // initialize with initial x position\n this.accList = Tables.keySignature(defined(this.keySpec));\n const accList = this.accList;\n const firstAccidentalType = accList.length > 0 ? accList[0].type : undefined;\n let cancelAccList;\n if (this.cancelKeySpec) {\n cancelAccList = this.convertToCancelAccList(this.cancelKeySpec);\n }\n if (this.alterKeySpec) {\n this.convertToAlterAccList(this.alterKeySpec);\n }\n if (this.accList.length > 0) {\n const clef = (this.position === StaveModifierPosition.END ? stave.getEndClef() : stave.getClef()) || stave.getClef();\n if (cancelAccList) {\n this.convertAccLines(clef, cancelAccList.type, cancelAccList.accList);\n }\n this.convertAccLines(clef, firstAccidentalType, accList);\n for (let i = 0; i < this.accList.length; ++i) {\n this.convertToGlyph(this.accList[i], this.accList[i + 1]);\n }\n }\n this.formatted = true;\n }\n draw() {\n const stave = this.checkStave();\n const ctx = stave.checkContext();\n if (!this.formatted)\n this.format();\n this.setRendered();\n ctx.openGroup('keysignature', this.getAttribute('id'));\n for (let i = 0; i < this.glyphs.length; i++) {\n const glyph = this.glyphs[i];\n const x = this.x + this.xPositions[i];\n glyph.setStave(stave);\n glyph.setContext(ctx);\n glyph.renderToStave(x);\n }\n ctx.closeGroup();\n }\n}\n// Space between natural and following accidental depending\n// on vertical position\nKeySignature.accidentalSpacing = {\n '#': {\n above: 6,\n below: 4,\n },\n b: {\n above: 4,\n below: 7,\n },\n n: {\n above: 4,\n below: 1,\n },\n '##': {\n above: 6,\n below: 4,\n },\n bb: {\n above: 4,\n below: 7,\n },\n db: {\n above: 4,\n below: 7,\n },\n d: {\n above: 4,\n below: 7,\n },\n bbs: {\n above: 4,\n below: 7,\n },\n '++': {\n above: 6,\n below: 4,\n },\n '+': {\n above: 6,\n below: 4,\n },\n '+-': {\n above: 6,\n below: 4,\n },\n '++-': {\n above: 6,\n below: 4,\n },\n bs: {\n above: 4,\n below: 10,\n },\n bss: {\n above: 4,\n below: 10,\n },\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Larry Kuhns 2011\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { StaveModifier } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nexport class Repetition extends StaveModifier {\n constructor(type, x, y_shift) {\n super();\n this.symbol_type = type;\n this.x = x;\n this.x_shift = 0;\n this.y_shift = y_shift;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.Repetition;\n }\n setShiftX(x) {\n this.x_shift = x;\n return this;\n }\n setShiftY(y) {\n this.y_shift = y;\n return this;\n }\n draw(stave, x) {\n this.setRendered();\n switch (this.symbol_type) {\n case Repetition.type.CODA_RIGHT:\n this.drawCodaFixed(stave, x + stave.getWidth());\n break;\n case Repetition.type.CODA_LEFT:\n this.drawSymbolText(stave, x, 'Coda', true);\n break;\n case Repetition.type.SEGNO_LEFT:\n this.drawSignoFixed(stave, x);\n break;\n case Repetition.type.SEGNO_RIGHT:\n this.drawSignoFixed(stave, x + stave.getWidth());\n break;\n case Repetition.type.DC:\n this.drawSymbolText(stave, x, 'D.C.', false);\n break;\n case Repetition.type.DC_AL_CODA:\n this.drawSymbolText(stave, x, 'D.C. al', true);\n break;\n case Repetition.type.DC_AL_FINE:\n this.drawSymbolText(stave, x, 'D.C. al Fine', false);\n break;\n case Repetition.type.DS:\n this.drawSymbolText(stave, x, 'D.S.', false);\n break;\n case Repetition.type.DS_AL_CODA:\n this.drawSymbolText(stave, x, 'D.S. al', true);\n break;\n case Repetition.type.DS_AL_FINE:\n this.drawSymbolText(stave, x, 'D.S. al Fine', false);\n break;\n case Repetition.type.FINE:\n this.drawSymbolText(stave, x, 'Fine', false);\n break;\n case Repetition.type.TO_CODA:\n this.drawSymbolText(stave, x, 'To', true);\n break;\n default:\n break;\n }\n return this;\n }\n drawCodaFixed(stave, x) {\n const y = stave.getYForTopText(stave.getNumLines()) + this.y_shift;\n Glyph.renderGlyph(stave.checkContext(), this.x + x + this.x_shift, y + Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY'), 40, 'coda', { category: 'coda' });\n return this;\n }\n drawSignoFixed(stave, x) {\n const y = stave.getYForTopText(stave.getNumLines()) + this.y_shift;\n Glyph.renderGlyph(stave.checkContext(), this.x + x + this.x_shift, y + Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY'), 30, 'segno', { category: 'segno' });\n return this;\n }\n drawSymbolText(stave, x, text, draw_coda) {\n const ctx = stave.checkContext();\n ctx.save();\n ctx.setFont(this.textFont);\n let text_x = 0;\n let symbol_x = 0;\n const modifierWidth = stave.getNoteStartX() - this.x;\n switch (this.symbol_type) {\n // To the left with symbol\n case Repetition.type.CODA_LEFT:\n // Offset Coda text to right of stave beginning\n text_x = this.x + stave.getVerticalBarWidth();\n symbol_x =\n text_x +\n ctx.measureText(text).width +\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol');\n break;\n // To the right without symbol\n case Repetition.type.DC:\n case Repetition.type.DC_AL_FINE:\n case Repetition.type.DS:\n case Repetition.type.DS_AL_FINE:\n case Repetition.type.FINE:\n text_x =\n this.x +\n x +\n this.x_shift +\n stave.getWidth() -\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.spacing') -\n modifierWidth -\n ctx.measureText(text).width;\n break;\n // To the right with symbol\n default:\n text_x =\n this.x +\n x +\n this.x_shift +\n stave.getWidth() -\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.spacing') -\n modifierWidth -\n ctx.measureText(text).width -\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol');\n symbol_x =\n text_x +\n ctx.measureText(text).width +\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol');\n break;\n }\n const y = stave.getYForTopText(stave.getNumLines()) +\n this.y_shift +\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY');\n if (draw_coda) {\n Glyph.renderGlyph(ctx, symbol_x, y, 40, 'coda', { category: 'coda' });\n }\n ctx.fillText(text, text_x, y + 5);\n ctx.restore();\n return this;\n }\n}\nRepetition.TEXT_FONT = {\n family: Font.SERIF,\n size: 12,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\nRepetition.type = {\n NONE: 1,\n CODA_LEFT: 2,\n CODA_RIGHT: 3,\n SEGNO_LEFT: 4,\n SEGNO_RIGHT: 5,\n DC: 6,\n DC_AL_CODA: 7,\n DC_AL_FINE: 8,\n DS: 9,\n DS_AL_CODA: 10,\n DS_AL_FINE: 11,\n FINE: 12,\n TO_CODA: 13, // To Coda at end of stave\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Larry Kuhns 2011\nimport { Font, FontStyle, FontWeight } from './font';\nimport { StaveModifier } from './stavemodifier';\nimport { Category } from './typeguard';\nexport class StaveSection extends StaveModifier {\n constructor(section, x, shift_y) {\n super();\n this.setWidth(16);\n this.section = section;\n this.x = x;\n this.shift_x = 0;\n this.shift_y = shift_y;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StaveSection;\n }\n setStaveSection(section) {\n this.section = section;\n return this;\n }\n setShiftX(x) {\n this.shift_x = x;\n return this;\n }\n setShiftY(y) {\n this.shift_y = y;\n return this;\n }\n draw(stave, shift_x) {\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.save();\n ctx.setLineWidth(2);\n ctx.setFont(this.textFont);\n const paddingX = 2;\n const paddingY = 2;\n const rectWidth = 2;\n const textMeasurements = ctx.measureText(this.section);\n const textWidth = textMeasurements.width;\n const textHeight = textMeasurements.height;\n const width = textWidth + 2 * paddingX; // add left & right padding\n const height = textHeight + 2 * paddingY; // add top & bottom padding\n // Seems to be a good default y\n const y = stave.getYForTopText(2) + this.shift_y;\n const x = this.x + shift_x;\n ctx.beginPath();\n ctx.setLineWidth(rectWidth);\n ctx.rect(x, y + textMeasurements.y - paddingY, width, height);\n ctx.stroke();\n ctx.fillText(this.section, x + paddingX, y);\n ctx.restore();\n return this;\n }\n}\nStaveSection.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 10,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Radosaw Eichler 2012\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nexport class StaveTempo extends StaveModifier {\n constructor(tempo, x, shift_y) {\n super();\n /** Font size for note. */\n this.render_options = { glyph_font_scale: 30 };\n this.tempo = tempo;\n this.position = StaveModifierPosition.ABOVE;\n this.x = x;\n this.shift_x = 10;\n this.shift_y = shift_y;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StaveTempo;\n }\n setTempo(tempo) {\n this.tempo = tempo;\n return this;\n }\n setShiftX(x) {\n this.shift_x = x;\n return this;\n }\n setShiftY(y) {\n this.shift_y = y;\n return this;\n }\n draw(stave, shift_x) {\n const ctx = stave.checkContext();\n this.setRendered();\n const options = this.render_options;\n // FIXME: What does the '38' mean? Why 38? Is that supposed to\n // be the default font size for standard notation?\n const scale = options.glyph_font_scale / 38;\n const name = this.tempo.name;\n const duration = this.tempo.duration;\n const dots = this.tempo.dots || 0;\n const bpm = this.tempo.bpm;\n let x = this.x + this.shift_x + shift_x;\n const y = stave.getYForTopText(1) + this.shift_y;\n ctx.save();\n if (name) {\n ctx.setFont(this.textFont);\n ctx.fillText(name, x, y);\n x += ctx.measureText(name).width;\n }\n if (duration && bpm) {\n // Override the weight and style.\n ctx.setFont(Object.assign(Object.assign({}, this.textFont), { weight: 'normal', style: 'normal' }));\n if (name) {\n x += ctx.measureText(' ').width;\n ctx.fillText('(', x, y);\n x += ctx.measureText('(').width;\n }\n const code = Tables.getGlyphProps(duration);\n x += 3 * scale;\n Glyph.renderGlyph(ctx, x, y, options.glyph_font_scale, code.code_head);\n x += code.getWidth() * scale;\n // Draw stem and flags\n if (code.stem) {\n let stem_height = 30;\n if (code.beam_count)\n stem_height += 3 * (code.beam_count - 1);\n stem_height *= scale;\n const y_top = y - stem_height;\n ctx.fillRect(x - scale, y_top, scale, stem_height);\n if (code.flag) {\n Glyph.renderGlyph(ctx, x, y_top, options.glyph_font_scale, code.code_flag_upstem, {\n category: 'flag.staveTempo',\n });\n if (!dots)\n x += 6 * scale;\n }\n }\n // Draw dot\n for (let i = 0; i < dots; i++) {\n x += 6 * scale;\n ctx.beginPath();\n ctx.arc(x, y + 2 * scale, 2 * scale, 0, Math.PI * 2, false);\n ctx.fill();\n }\n ctx.fillText(' = ' + bpm + (name ? ')' : ''), x + 3 * scale, y);\n }\n ctx.restore();\n return this;\n }\n}\nStaveTempo.TEXT_FONT = {\n family: Font.SERIF,\n size: 14,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2014\nimport { Font, FontStyle, FontWeight } from './font';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Justification, TextNote } from './textnote';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StaveText extends StaveModifier {\n constructor(text, position, options = {}) {\n super();\n this.setWidth(16);\n this.text = text;\n this.position = position;\n this.options = Object.assign({ shift_x: 0, shift_y: 0, justification: TextNote.Justification.CENTER }, options);\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StaveText;\n }\n setStaveText(text) {\n this.text = text;\n return this;\n }\n setShiftX(x) {\n this.shift_x = x;\n return this;\n }\n setShiftY(y) {\n this.shift_y = y;\n return this;\n }\n setText(text) {\n this.text = text;\n return this;\n }\n draw(stave) {\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.save();\n ctx.setLineWidth(2);\n ctx.setFont(this.textFont);\n const text_width = ctx.measureText('' + this.text).width;\n let x;\n let y;\n switch (this.position) {\n case StaveModifierPosition.LEFT:\n case StaveModifierPosition.RIGHT:\n y = (stave.getYForLine(0) + stave.getBottomLineY()) / 2 + this.options.shift_y;\n if (this.position === StaveModifierPosition.LEFT) {\n x = stave.getX() - text_width - 24 + this.options.shift_x;\n }\n else {\n x = stave.getX() + stave.getWidth() + 24 + this.options.shift_x;\n }\n break;\n case StaveModifierPosition.ABOVE:\n case StaveModifierPosition.BELOW:\n x = stave.getX() + this.options.shift_x;\n if (this.options.justification === Justification.CENTER) {\n x += stave.getWidth() / 2 - text_width / 2;\n }\n else if (this.options.justification === Justification.RIGHT) {\n x += stave.getWidth() - text_width;\n }\n if (this.position === StaveModifierPosition.ABOVE) {\n y = stave.getYForTopText(2) + this.options.shift_y;\n }\n else {\n y = stave.getYForBottomText(2) + this.options.shift_y;\n }\n break;\n default:\n throw new RuntimeError('InvalidPosition', 'Value Must be in Modifier.Position.');\n }\n ctx.fillText('' + this.text, x, y + 4);\n ctx.restore();\n return this;\n }\n}\nStaveText.TEXT_FONT = {\n family: Font.SERIF,\n size: 16,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// Renders time signatures glyphs for staffs\n// This class is used by TimeSignature to render the associated glyphs\nimport { Glyph } from './glyph';\nimport { defined } from './util';\nexport class TimeSignatureGlyph extends Glyph {\n constructor(timeSignature, topDigits, botDigits, code, point, options) {\n var _a;\n super(code, point, options);\n this.timeSignature = timeSignature;\n this.topGlyphs = [];\n this.botGlyphs = [];\n let topWidth = 0;\n for (let i = 0; i < topDigits.length; ++i) {\n let timeSigType = topDigits[i];\n switch (topDigits[i]) {\n case '-':\n timeSigType = 'Minus';\n break;\n case '+':\n timeSigType = botDigits.length > 0 ? 'PlusSmall' : 'Plus';\n break;\n case '(':\n timeSigType = botDigits.length > 0 ? 'ParensLeftSmall' : 'ParensLeft';\n break;\n case ')':\n timeSigType = botDigits.length > 0 ? 'ParensRightSmall' : 'ParensRight';\n break;\n }\n const topGlyph = new Glyph('timeSig' + timeSigType, this.timeSignature.point);\n this.topGlyphs.push(topGlyph);\n topWidth += (_a = topGlyph.getMetrics().width) !== null && _a !== void 0 ? _a : 0;\n }\n let botWidth = 0;\n for (let i = 0; i < botDigits.length; ++i) {\n let timeSigType = botDigits[i];\n switch (botDigits[i]) {\n case '+':\n timeSigType = 'PlusSmall';\n break;\n case '(':\n timeSigType = 'ParensLeftSmall';\n break;\n case ')':\n timeSigType = 'ParensRightSmall';\n break;\n }\n const botGlyph = new Glyph('timeSig' + timeSigType, this.timeSignature.point);\n this.botGlyphs.push(botGlyph);\n botWidth += defined(botGlyph.getMetrics().width);\n }\n this.width = Math.max(topWidth, botWidth);\n this.xMin = this.getMetrics().x_min;\n this.topStartX = (this.width - topWidth) / 2.0;\n this.botStartX = (this.width - botWidth) / 2.0;\n this.reset();\n }\n getMetrics() {\n return {\n x_min: this.xMin,\n x_max: this.xMin + this.width,\n width: this.width,\n };\n }\n renderToStave(x) {\n const stave = this.checkStave();\n const ctx = this.checkContext();\n let start_x = x + this.topStartX;\n let y = 0;\n if (this.botGlyphs.length > 0)\n y = stave.getYForLine(this.timeSignature.topLine);\n else\n y = (stave.getYForLine(this.timeSignature.topLine) + stave.getYForLine(this.timeSignature.bottomLine)) / 2;\n for (let i = 0; i < this.topGlyphs.length; ++i) {\n const glyph = this.topGlyphs[i];\n Glyph.renderOutline(ctx, glyph.getMetrics().outline, this.scale, start_x + this.x_shift, y);\n start_x += defined(glyph.getMetrics().width);\n }\n start_x = x + this.botStartX;\n y = stave.getYForLine(this.timeSignature.bottomLine);\n for (let i = 0; i < this.botGlyphs.length; ++i) {\n const glyph = this.botGlyphs[i];\n this.timeSignature.placeGlyphOnLine(glyph, stave, 0);\n Glyph.renderOutline(ctx, glyph.getMetrics().outline, this.scale, start_x + glyph.getMetrics().x_shift, y);\n start_x += defined(glyph.getMetrics().width);\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// Implements time signatures glyphs for staffs\n// See tables.js for the internal time signatures\n// representation\nimport { Glyph } from './glyph';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { TimeSignatureGlyph } from './timesigglyph';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nconst assertIsValidTimeSig = (timeSpec) => {\n const numbers = timeSpec.split('/');\n if (numbers.length !== 2 && numbers[0] !== '+' && numbers[0] !== '-') {\n throw new RuntimeError('BadTimeSignature', `Invalid time spec: ${timeSpec}. Must be in the form \"/\"`);\n }\n numbers.forEach((number) => {\n // Characters consisting in number 0..9, '+', '-', '(' or ')'\n if (/^[0-9+\\-()]+$/.test(number) == false) {\n throw new RuntimeError('BadTimeSignature', `Invalid time spec: ${timeSpec}. Must contain valid signatures.`);\n }\n });\n};\nexport class TimeSignature extends StaveModifier {\n constructor(timeSpec = '4/4', customPadding = 15, validate_args = true) {\n super();\n this.validate_args = validate_args;\n const padding = customPadding;\n const musicFont = Tables.currentMusicFont();\n this.point = musicFont.lookupMetric('digits.point');\n const fontLineShift = musicFont.lookupMetric('digits.shiftLine', 0);\n this.topLine = 2 + fontLineShift;\n this.bottomLine = 4 + fontLineShift;\n this.setPosition(StaveModifierPosition.BEGIN);\n this.info = this.parseTimeSpec(timeSpec);\n this.setWidth(defined(this.info.glyph.getMetrics().width));\n this.setPadding(padding);\n }\n static get CATEGORY() {\n return Category.TimeSignature;\n }\n static get glyphs() {\n return {\n C: {\n code: 'timeSigCommon',\n point: 40,\n line: 2,\n },\n 'C|': {\n code: 'timeSigCutCommon',\n point: 40,\n line: 2,\n },\n };\n }\n parseTimeSpec(timeSpec) {\n var _a, _b;\n if (timeSpec === 'C' || timeSpec === 'C|') {\n const { line, code, point } = TimeSignature.glyphs[timeSpec];\n return {\n line,\n num: false,\n glyph: new Glyph(code, point),\n };\n }\n if (this.validate_args) {\n assertIsValidTimeSig(timeSpec);\n }\n const parts = timeSpec.split('/');\n return {\n num: true,\n glyph: this.makeTimeSignatureGlyph((_a = parts[0]) !== null && _a !== void 0 ? _a : '', (_b = parts[1]) !== null && _b !== void 0 ? _b : ''),\n };\n }\n makeTimeSignatureGlyph(topDigits, botDigits) {\n return new TimeSignatureGlyph(this, topDigits, botDigits, 'timeSig0', this.point);\n }\n getInfo() {\n return this.info;\n }\n setTimeSig(timeSpec) {\n this.info = this.parseTimeSpec(timeSpec);\n return this;\n }\n draw() {\n const stave = this.checkStave();\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.openGroup('timesignature', this.getAttribute('id'));\n this.info.glyph.setStave(stave);\n this.info.glyph.setContext(ctx);\n this.placeGlyphOnLine(this.info.glyph, stave, this.info.line);\n this.info.glyph.renderToStave(this.x);\n ctx.closeGroup();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { BoundingBox } from './boundingbox';\nimport { Clef } from './clef';\nimport { Element } from './element';\nimport { Font, FontStyle, FontWeight } from './font';\nimport { KeySignature } from './keysignature';\nimport { Barline, BarlineType } from './stavebarline';\nimport { StaveModifierPosition } from './stavemodifier';\nimport { Repetition } from './staverepetition';\nimport { StaveSection } from './stavesection';\nimport { StaveTempo } from './stavetempo';\nimport { StaveText } from './stavetext';\nimport { Volta } from './stavevolta';\nimport { Tables } from './tables';\nimport { TimeSignature } from './timesignature';\nimport { Category, isBarline } from './typeguard';\nimport { RuntimeError } from './util';\n// Used by Stave.format() to sort the modifiers at the beginning and end of a stave.\n// The keys (computed property names) match the CATEGORY property in the\n// Barline, Clef, KeySignature, TimeSignature classes.\nconst SORT_ORDER_BEG_MODIFIERS = {\n [Barline.CATEGORY]: 0,\n [Clef.CATEGORY]: 1,\n [KeySignature.CATEGORY]: 2,\n [TimeSignature.CATEGORY]: 3,\n};\nconst SORT_ORDER_END_MODIFIERS = {\n [TimeSignature.CATEGORY]: 0,\n [KeySignature.CATEGORY]: 1,\n [Barline.CATEGORY]: 2,\n [Clef.CATEGORY]: 3,\n};\nexport class Stave extends Element {\n constructor(x, y, width, options) {\n super();\n // Initialized by the constructor via this.resetLines().\n this.height = 0;\n this.x = x;\n this.y = y;\n this.width = width;\n this.formatted = false;\n this.start_x = x + 5;\n this.end_x = x + width;\n this.modifiers = []; // stave modifiers (clef, key, time, barlines, coda, segno, etc.)\n this.measure = 0;\n this.clef = 'treble';\n this.endClef = undefined;\n this.resetFont();\n this.options = Object.assign({ vertical_bar_width: 10, num_lines: 5, fill_style: '#999999', left_bar: true, right_bar: true, spacing_between_lines_px: Tables.STAVE_LINE_DISTANCE, space_above_staff_ln: 4, space_below_staff_ln: 4, top_text_position: 1, bottom_text_position: 4, line_config: [] }, options);\n this.bounds = { x: this.x, y: this.y, w: this.width, h: 0 };\n this.defaultLedgerLineStyle = { strokeStyle: '#444', lineWidth: 1.4 };\n this.resetLines();\n // beg bar\n this.addModifier(new Barline(this.options.left_bar ? BarlineType.SINGLE : BarlineType.NONE));\n // end bar\n this.addEndModifier(new Barline(this.options.right_bar ? BarlineType.SINGLE : BarlineType.NONE));\n }\n static get CATEGORY() {\n return Category.Stave;\n }\n // This is the sum of the padding that normally goes on left + right of a stave during\n // drawing. Used to size staves correctly with content width.\n static get defaultPadding() {\n const musicFont = Tables.currentMusicFont();\n return musicFont.lookupMetric('stave.padding') + musicFont.lookupMetric('stave.endPaddingMax');\n }\n // Right padding, used by system if startX is already determined.\n static get rightPadding() {\n const musicFont = Tables.currentMusicFont();\n return musicFont.lookupMetric('stave.endPaddingMax');\n }\n /** Set default style for ledger lines. */\n setDefaultLedgerLineStyle(style) {\n this.defaultLedgerLineStyle = style;\n }\n /** Get default style for ledger lines. */\n getDefaultLedgerLineStyle() {\n return Object.assign(Object.assign({}, this.getStyle()), this.defaultLedgerLineStyle);\n }\n space(spacing) {\n return this.options.spacing_between_lines_px * spacing;\n }\n resetLines() {\n this.options.line_config = [];\n for (let i = 0; i < this.options.num_lines; i++) {\n this.options.line_config.push({ visible: true });\n }\n this.height = (this.options.num_lines + this.options.space_above_staff_ln) * this.options.spacing_between_lines_px;\n this.options.bottom_text_position = this.options.num_lines;\n }\n setNoteStartX(x) {\n if (!this.formatted)\n this.format();\n this.start_x = x;\n const begBarline = this.modifiers[0];\n begBarline.setX(this.start_x - begBarline.getWidth());\n return this;\n }\n getNoteStartX() {\n if (!this.formatted)\n this.format();\n return this.start_x;\n }\n getNoteEndX() {\n if (!this.formatted)\n this.format();\n return this.end_x;\n }\n getTieStartX() {\n return this.start_x;\n }\n getTieEndX() {\n return this.end_x;\n }\n getX() {\n return this.x;\n }\n getNumLines() {\n return this.options.num_lines;\n }\n setNumLines(n) {\n this.options.num_lines = n;\n this.resetLines();\n return this;\n }\n setY(y) {\n this.y = y;\n return this;\n }\n getY() {\n return this.y;\n }\n getTopLineTopY() {\n return this.getYForLine(0) - Tables.STAVE_LINE_THICKNESS / 2;\n }\n getBottomLineBottomY() {\n return this.getYForLine(this.getNumLines() - 1) + Tables.STAVE_LINE_THICKNESS / 2;\n }\n setX(x) {\n const shift = x - this.x;\n this.formatted = false;\n this.x = x;\n this.start_x += shift;\n this.end_x += shift;\n for (let i = 0; i < this.modifiers.length; i++) {\n const mod = this.modifiers[i];\n mod.setX(mod.getX() + shift);\n }\n return this;\n }\n setWidth(width) {\n this.formatted = false;\n this.width = width;\n this.end_x = this.x + width;\n // reset the x position of the end barline (TODO(0xfe): This makes no sense)\n // this.modifiers[1].setX(this.end_x);\n return this;\n }\n getWidth() {\n return this.width;\n }\n getStyle() {\n return Object.assign({ fillStyle: this.options.fill_style, strokeStyle: this.options.fill_style, lineWidth: Tables.STAVE_LINE_THICKNESS }, this.style);\n }\n setMeasure(measure) {\n this.measure = measure;\n return this;\n }\n /**\n * Gets the pixels to shift from the beginning of the stave\n * following the modifier at the provided index\n * @param {Number} index The index from which to determine the shift\n * @return {Number} The amount of pixels shifted\n */\n getModifierXShift(index = 0) {\n if (typeof index !== 'number') {\n throw new RuntimeError('InvalidIndex', 'Must be of number type');\n }\n if (!this.formatted)\n this.format();\n if (this.getModifiers(StaveModifierPosition.BEGIN).length === 1) {\n return 0;\n }\n // for right position modifiers zero shift seems correct, see 'Volta + Modifier Measure Test'\n if (this.modifiers[index].getPosition() === StaveModifierPosition.RIGHT) {\n return 0;\n }\n let start_x = this.start_x - this.x;\n const begBarline = this.modifiers[0];\n if (begBarline.getType() === BarlineType.REPEAT_BEGIN && start_x > begBarline.getWidth()) {\n start_x -= begBarline.getWidth();\n }\n return start_x;\n }\n /** Coda & Segno Symbol functions */\n setRepetitionType(type, yShift = 0) {\n this.modifiers.push(new Repetition(type, this.x, yShift));\n return this;\n }\n // Volta functions\n setVoltaType(type, number_t, y) {\n this.modifiers.push(new Volta(type, number_t, this.x, y));\n return this;\n }\n // Section functions\n setSection(section, y, xOffset = 0, fontSize) {\n const staveSection = new StaveSection(section, this.x + xOffset, y);\n if (fontSize)\n staveSection.setFontSize(fontSize);\n this.modifiers.push(staveSection);\n return this;\n }\n // Tempo functions\n setTempo(tempo, y) {\n this.modifiers.push(new StaveTempo(tempo, this.x, y));\n return this;\n }\n // Text functions\n setText(text, position, options = {}) {\n this.modifiers.push(new StaveText(text, position, options));\n return this;\n }\n getHeight() {\n return this.height;\n }\n getSpacingBetweenLines() {\n return this.options.spacing_between_lines_px;\n }\n getBoundingBox() {\n return new BoundingBox(this.x, this.y, this.width, this.getBottomY() - this.y);\n }\n getBottomY() {\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const score_bottom = this.getYForLine(options.num_lines) + options.space_below_staff_ln * spacing;\n return score_bottom;\n }\n getBottomLineY() {\n return this.getYForLine(this.options.num_lines);\n }\n // This returns\n /** @returns the y for the *center* of a staff line */\n getYForLine(line) {\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const headroom = options.space_above_staff_ln;\n const y = this.y + line * spacing + headroom * spacing;\n return y;\n }\n getLineForY(y) {\n // Does the reverse of getYForLine - somewhat dumb and just calls\n // getYForLine until the right value is reaches\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const headroom = options.space_above_staff_ln;\n return (y - this.y) / spacing - headroom;\n }\n getYForTopText(line = 0) {\n return this.getYForLine(-line - this.options.top_text_position);\n }\n getYForBottomText(line = 0) {\n return this.getYForLine(this.options.bottom_text_position + line);\n }\n getYForNote(line) {\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const headroom = options.space_above_staff_ln;\n return this.y + headroom * spacing + 5 * spacing - line * spacing;\n }\n getYForGlyphs() {\n return this.getYForLine(3);\n }\n // This method adds a stave modifier to the stave. Note that the first two\n // modifiers (BarLines) are automatically added upon construction.\n addModifier(modifier, position) {\n if (position !== undefined) {\n modifier.setPosition(position);\n }\n modifier.setStave(this);\n this.formatted = false;\n this.modifiers.push(modifier);\n return this;\n }\n addEndModifier(modifier) {\n this.addModifier(modifier, StaveModifierPosition.END);\n return this;\n }\n // Bar Line functions\n setBegBarType(type) {\n // Only valid bar types at beginning of stave is none, single or begin repeat\n const { SINGLE, REPEAT_BEGIN, NONE } = BarlineType;\n if (type === SINGLE || type === REPEAT_BEGIN || type === NONE) {\n this.modifiers[0].setType(type);\n this.formatted = false;\n }\n return this;\n }\n setEndBarType(type) {\n // Repeat end not valid at end of stave\n if (type !== BarlineType.REPEAT_BEGIN) {\n this.modifiers[1].setType(type);\n this.formatted = false;\n }\n return this;\n }\n setClef(clefSpec, size, annotation, position) {\n if (position === undefined) {\n position = StaveModifierPosition.BEGIN;\n }\n if (position === StaveModifierPosition.END) {\n this.endClef = clefSpec;\n }\n else {\n this.clef = clefSpec;\n }\n const clefs = this.getModifiers(position, Clef.CATEGORY);\n if (clefs.length === 0) {\n this.addClef(clefSpec, size, annotation, position);\n }\n else {\n clefs[0].setType(clefSpec, size, annotation);\n }\n return this;\n }\n getClef() {\n return this.clef;\n }\n setEndClef(clefSpec, size, annotation) {\n this.setClef(clefSpec, size, annotation, StaveModifierPosition.END);\n return this;\n }\n getEndClef() {\n return this.endClef;\n }\n setKeySignature(keySpec, cancelKeySpec, position) {\n if (position === undefined) {\n position = StaveModifierPosition.BEGIN;\n }\n const keySignatures = this.getModifiers(position, KeySignature.CATEGORY);\n if (keySignatures.length === 0) {\n this.addKeySignature(keySpec, cancelKeySpec, position);\n }\n else {\n keySignatures[0].setKeySig(keySpec, cancelKeySpec);\n }\n return this;\n }\n setEndKeySignature(keySpec, cancelKeySpec) {\n this.setKeySignature(keySpec, cancelKeySpec, StaveModifierPosition.END);\n return this;\n }\n setTimeSignature(timeSpec, customPadding, position) {\n if (position === undefined) {\n position = StaveModifierPosition.BEGIN;\n }\n const timeSignatures = this.getModifiers(position, TimeSignature.CATEGORY);\n if (timeSignatures.length === 0) {\n this.addTimeSignature(timeSpec, customPadding, position);\n }\n else {\n timeSignatures[0].setTimeSig(timeSpec);\n }\n return this;\n }\n setEndTimeSignature(timeSpec, customPadding) {\n this.setTimeSignature(timeSpec, customPadding, StaveModifierPosition.END);\n return this;\n }\n /**\n * Add a key signature to the stave.\n *\n * Example:\n * `stave.addKeySignature('Db');`\n * @param keySpec new key specification `[A-G][b|#]?`\n * @param cancelKeySpec\n * @param position\n * @returns\n */\n addKeySignature(keySpec, cancelKeySpec, position) {\n if (position === undefined) {\n position = StaveModifierPosition.BEGIN;\n }\n this.addModifier(new KeySignature(keySpec, cancelKeySpec).setPosition(position), position);\n return this;\n }\n /**\n * Add a clef to the stave.\n *\n * Example:\n *\n * stave.addClef('treble')\n * @param clef clef (treble|bass|...) see {@link Clef.types}\n * @param size\n * @param annotation\n * @param position\n * @returns\n */\n addClef(clef, size, annotation, position) {\n if (position === undefined || position === StaveModifierPosition.BEGIN) {\n this.clef = clef;\n }\n else if (position === StaveModifierPosition.END) {\n this.endClef = clef;\n }\n this.addModifier(new Clef(clef, size, annotation), position);\n return this;\n }\n addEndClef(clef, size, annotation) {\n this.addClef(clef, size, annotation, StaveModifierPosition.END);\n return this;\n }\n /**\n * Add a time signature to the stave\n *\n * Example:\n *\n * `stave.addTimeSignature('4/4');`\n * @param timeSpec time signature specification `(C\\||C|\\d\\/\\d)`\n * @param customPadding\n * @param position\n * @returns\n */\n addTimeSignature(timeSpec, customPadding, position) {\n this.addModifier(new TimeSignature(timeSpec, customPadding), position);\n return this;\n }\n addEndTimeSignature(timeSpec, customPadding) {\n this.addTimeSignature(timeSpec, customPadding, StaveModifierPosition.END);\n return this;\n }\n // Deprecated\n addTrebleGlyph() {\n this.addClef('treble');\n return this;\n }\n /**\n * @param position\n * @param category\n * @returns array of StaveModifiers that match the provided position and category.\n */\n getModifiers(position, category) {\n const noPosition = position === undefined;\n const noCategory = category === undefined;\n if (noPosition && noCategory) {\n return this.modifiers;\n }\n else if (noPosition) {\n // A category was provided.\n return this.modifiers.filter((m) => category === m.getCategory());\n }\n else if (noCategory) {\n // A position was provided.\n return this.modifiers.filter((m) => position === m.getPosition());\n }\n else {\n // Both position and category were provided!\n return this.modifiers.filter((m) => position === m.getPosition() && category === m.getCategory());\n }\n }\n /**\n * Use the modifier's `getCategory()` as a key for the `order` array.\n * The retrieved value is used to sort modifiers from left to right (0 to to 3).\n */\n sortByCategory(items, order) {\n for (let i = items.length - 1; i >= 0; i--) {\n for (let j = 0; j < i; j++) {\n if (order[items[j].getCategory()] > order[items[j + 1].getCategory()]) {\n const temp = items[j];\n items[j] = items[j + 1];\n items[j + 1] = temp;\n }\n }\n }\n }\n format() {\n const begBarline = this.modifiers[0];\n const endBarline = this.modifiers[1];\n const begModifiers = this.getModifiers(StaveModifierPosition.BEGIN);\n const endModifiers = this.getModifiers(StaveModifierPosition.END);\n this.sortByCategory(begModifiers, SORT_ORDER_BEG_MODIFIERS);\n this.sortByCategory(endModifiers, SORT_ORDER_END_MODIFIERS);\n if (begModifiers.length > 1 && begBarline.getType() === BarlineType.REPEAT_BEGIN) {\n begModifiers.push(begModifiers.splice(0, 1)[0]);\n begModifiers.splice(0, 0, new Barline(BarlineType.SINGLE));\n }\n if (endModifiers.indexOf(endBarline) > 0) {\n endModifiers.splice(0, 0, new Barline(BarlineType.NONE));\n }\n let width;\n let padding;\n let modifier;\n let offset = 0;\n let x = this.x;\n for (let i = 0; i < begModifiers.length; i++) {\n modifier = begModifiers[i];\n padding = modifier.getPadding(i + offset);\n width = modifier.getWidth();\n x += padding;\n modifier.setX(x);\n x += width;\n if (padding + width === 0)\n offset--;\n }\n this.start_x = x;\n x = this.x + this.width;\n const widths = {\n left: 0,\n right: 0,\n paddingRight: 0,\n paddingLeft: 0,\n };\n let lastBarlineIdx = 0;\n for (let i = 0; i < endModifiers.length; i++) {\n modifier = endModifiers[i];\n lastBarlineIdx = isBarline(modifier) ? i : lastBarlineIdx;\n widths.right = 0;\n widths.left = 0;\n widths.paddingRight = 0;\n widths.paddingLeft = 0;\n const layoutMetrics = modifier.getLayoutMetrics();\n if (layoutMetrics) {\n if (i !== 0) {\n widths.right = layoutMetrics.xMax || 0;\n widths.paddingRight = layoutMetrics.paddingRight || 0;\n }\n widths.left = -layoutMetrics.xMin || 0;\n widths.paddingLeft = layoutMetrics.paddingLeft || 0;\n if (i === endModifiers.length - 1) {\n widths.paddingLeft = 0;\n }\n }\n else {\n widths.paddingRight = modifier.getPadding(i - lastBarlineIdx);\n if (i !== 0) {\n widths.right = modifier.getWidth();\n }\n if (i === 0) {\n widths.left = modifier.getWidth();\n }\n }\n x -= widths.paddingRight;\n x -= widths.right;\n modifier.setX(x);\n x -= widths.left;\n x -= widths.paddingLeft;\n }\n this.end_x = endModifiers.length === 1 ? this.x + this.width : x;\n this.formatted = true;\n }\n /**\n * All drawing functions below need the context to be set.\n */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n ctx.openGroup('stave', this.getAttribute('id'));\n if (!this.formatted)\n this.format();\n const num_lines = this.options.num_lines;\n const width = this.width;\n const x = this.x;\n let y;\n // Render lines\n for (let line = 0; line < num_lines; line++) {\n y = this.getYForLine(line);\n this.applyStyle();\n if (this.options.line_config[line].visible) {\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(x + width, y);\n ctx.stroke();\n }\n this.restoreStyle();\n }\n // Draw the modifiers (bar lines, coda, segno, repeat brackets, etc.)\n for (let i = 0; i < this.modifiers.length; i++) {\n const modifier = this.modifiers[i];\n // Only draw modifier if it has a draw function\n if (typeof modifier.draw === 'function') {\n modifier.applyStyle(ctx);\n modifier.draw(this, this.getModifierXShift(i));\n modifier.restoreStyle(ctx);\n }\n }\n // Render measure numbers\n if (this.measure > 0) {\n ctx.save();\n ctx.setFont(this.textFont);\n const textWidth = ctx.measureText('' + this.measure).width;\n y = this.getYForTopText(0) + 3;\n ctx.fillText('' + this.measure, this.x - textWidth / 2, y);\n ctx.restore();\n }\n ctx.closeGroup();\n return this;\n }\n getVerticalBarWidth() {\n return this.options.vertical_bar_width;\n }\n /**\n * Get the current configuration for the Stave.\n * @return {Array} An array of configuration objects.\n */\n getConfigForLines() {\n return this.options.line_config;\n }\n /**\n * Configure properties of the lines in the Stave\n * @param line_number The index of the line to configure.\n * @param line_config An configuration object for the specified line.\n * @throws RuntimeError \"StaveConfigError\" When the specified line number is out of\n * range of the number of lines specified in the constructor.\n */\n setConfigForLine(line_number, line_config) {\n if (line_number >= this.options.num_lines || line_number < 0) {\n throw new RuntimeError('StaveConfigError', 'The line number must be within the range of the number of lines in the Stave.');\n }\n if (line_config.visible === undefined) {\n throw new RuntimeError('StaveConfigError', \"The line configuration object is missing the 'visible' property.\");\n }\n if (typeof line_config.visible !== 'boolean') {\n throw new RuntimeError('StaveConfigError', \"The line configuration objects 'visible' property must be true or false.\");\n }\n this.options.line_config[line_number] = line_config;\n return this;\n }\n /**\n * Set the staff line configuration array for all of the lines at once.\n * @param lines_configuration An array of line configuration objects. These objects\n * are of the same format as the single one passed in to setLineConfiguration().\n * The caller can set null for any line config entry if it is desired that the default be used\n * @throws RuntimeError \"StaveConfigError\" When the lines_configuration array does not have\n * exactly the same number of elements as the num_lines configuration object set in\n * the constructor.\n */\n setConfigForLines(lines_configuration) {\n if (lines_configuration.length !== this.options.num_lines) {\n throw new RuntimeError('StaveConfigError', 'The length of the lines configuration array must match the number of lines in the Stave');\n }\n // Make sure the defaults are present in case an incomplete set of\n // configuration options were supplied.\n // eslint-disable-next-line\n for (const line_config in lines_configuration) {\n // Allow '{}' to be used if the caller just wants the default for a particular node.\n if (lines_configuration[line_config].visible == undefined) {\n lines_configuration[line_config] = this.options.line_config[line_config];\n }\n this.options.line_config[line_config] = Object.assign(Object.assign({}, this.options.line_config[line_config]), lines_configuration[line_config]);\n }\n this.options.line_config = lines_configuration;\n return this;\n }\n}\nStave.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 8,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nfunction drawBoldDoubleLine(ctx, type, topX, topY, botY) {\n if (type !== StaveConnector.type.BOLD_DOUBLE_LEFT && type !== StaveConnector.type.BOLD_DOUBLE_RIGHT) {\n throw new RuntimeError('InvalidConnector', 'A REPEAT_BEGIN or REPEAT_END type must be provided.');\n }\n let x_shift = 3;\n let variableWidth = 3.5; // Width for avoiding anti-aliasing width issues\n const thickLineOffset = 2; // For aesthetics\n if (type === StaveConnector.type.BOLD_DOUBLE_RIGHT) {\n x_shift = -5; // Flips the side of the thin line\n variableWidth = 3;\n }\n // Thin line\n ctx.fillRect(topX + x_shift, topY, 1, botY - topY);\n // Thick line\n ctx.fillRect(topX - thickLineOffset, topY, variableWidth, botY - topY);\n}\n/** StaveConnector implements the connector lines between staves of a system. */\nexport class StaveConnector extends Element {\n constructor(top_stave, bottom_stave) {\n super();\n this.thickness = Tables.STAVE_LINE_THICKNESS;\n this.width = 3;\n this.top_stave = top_stave;\n this.bottom_stave = bottom_stave;\n this.type = StaveConnector.type.DOUBLE;\n this.resetFont();\n // 1. Offset Bold Double Left to align with offset Repeat Begin bars\n // 2. Offset BRACE type not to overlap with another StaveConnector\n this.x_shift = 0;\n this.texts = [];\n }\n static get CATEGORY() {\n return Category.StaveConnector;\n }\n /**\n * Set type.\n * @param type see {@link StaveConnector.type} & {@link StaveConnector.typeString}\n */\n setType(type) {\n type = typeof type === 'string' ? StaveConnector.typeString[type] : type;\n if (type >= StaveConnector.type.SINGLE_RIGHT && type <= StaveConnector.type.NONE) {\n this.type = type;\n }\n return this;\n }\n /** Set optional associated Text. */\n setText(text, options = {}) {\n this.texts.push({\n content: text,\n options: Object.assign({ shift_x: 0, shift_y: 0 }, options),\n });\n return this;\n }\n setXShift(x_shift) {\n if (typeof x_shift !== 'number') {\n throw new RuntimeError('InvalidType', 'x_shift must be a Number');\n }\n this.x_shift = x_shift;\n return this;\n }\n getXShift() {\n return this.x_shift;\n }\n /** Render connector and associated text. */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n let topY = this.top_stave.getYForLine(0);\n let botY = this.bottom_stave.getYForLine(this.bottom_stave.getNumLines() - 1) + this.thickness;\n let width = this.width;\n let topX = this.top_stave.getX();\n const isRightSidedConnector = this.type === StaveConnector.type.SINGLE_RIGHT ||\n this.type === StaveConnector.type.BOLD_DOUBLE_RIGHT ||\n this.type === StaveConnector.type.THIN_DOUBLE;\n if (isRightSidedConnector) {\n topX = this.top_stave.getX() + this.top_stave.getWidth();\n }\n let attachment_height = botY - topY;\n switch (this.type) {\n case StaveConnector.type.SINGLE:\n width = 1;\n break;\n case StaveConnector.type.SINGLE_LEFT:\n width = 1;\n break;\n case StaveConnector.type.SINGLE_RIGHT:\n width = 1;\n break;\n case StaveConnector.type.DOUBLE:\n topX -= this.width + 2;\n topY -= this.thickness;\n attachment_height += 0.5;\n break;\n case StaveConnector.type.BRACE: {\n width = 12;\n // May need additional code to draw brace\n const x1 = this.top_stave.getX() - 2 + this.x_shift;\n const y1 = topY;\n const x3 = x1;\n const y3 = botY;\n const x2 = x1 - width;\n const y2 = y1 + attachment_height / 2.0;\n const cpx1 = x2 - 0.9 * width;\n const cpy1 = y1 + 0.2 * attachment_height;\n const cpx2 = x1 + 1.1 * width;\n const cpy2 = y2 - 0.135 * attachment_height;\n const cpx3 = cpx2;\n const cpy3 = y2 + 0.135 * attachment_height;\n const cpx4 = cpx1;\n const cpy4 = y3 - 0.2 * attachment_height;\n const cpx5 = x2 - width;\n const cpy5 = cpy4;\n const cpx6 = x1 + 0.4 * width;\n const cpy6 = y2 + 0.135 * attachment_height;\n const cpx7 = cpx6;\n const cpy7 = y2 - 0.135 * attachment_height;\n const cpx8 = cpx5;\n const cpy8 = cpy1;\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, x2, y2);\n ctx.bezierCurveTo(cpx3, cpy3, cpx4, cpy4, x3, y3);\n ctx.bezierCurveTo(cpx5, cpy5, cpx6, cpy6, x2, y2);\n ctx.bezierCurveTo(cpx7, cpy7, cpx8, cpy8, x1, y1);\n ctx.fill();\n ctx.stroke();\n break;\n }\n case StaveConnector.type.BRACKET:\n topY -= 6;\n botY += 6;\n attachment_height = botY - topY;\n Glyph.renderGlyph(ctx, topX - 5, topY, 40, 'bracketTop');\n Glyph.renderGlyph(ctx, topX - 5, botY, 40, 'bracketBottom');\n topX -= this.width + 2;\n break;\n case StaveConnector.type.BOLD_DOUBLE_LEFT:\n drawBoldDoubleLine(ctx, this.type, topX + this.x_shift, topY, botY - this.thickness);\n break;\n case StaveConnector.type.BOLD_DOUBLE_RIGHT:\n drawBoldDoubleLine(ctx, this.type, topX, topY, botY - this.thickness);\n break;\n case StaveConnector.type.THIN_DOUBLE:\n width = 1;\n attachment_height -= this.thickness;\n break;\n case StaveConnector.type.NONE:\n break;\n default:\n throw new RuntimeError('InvalidType', `The provided StaveConnector.type (${this.type}) is invalid.`);\n }\n if (this.type !== StaveConnector.type.BRACE &&\n this.type !== StaveConnector.type.BOLD_DOUBLE_LEFT &&\n this.type !== StaveConnector.type.BOLD_DOUBLE_RIGHT &&\n this.type !== StaveConnector.type.NONE) {\n ctx.fillRect(topX, topY, width, attachment_height);\n }\n // If the connector is a thin double barline, draw the paralell line\n if (this.type === StaveConnector.type.THIN_DOUBLE) {\n ctx.fillRect(topX - 3, topY, width, attachment_height);\n }\n ctx.save();\n ctx.setLineWidth(2);\n ctx.setFont(this.textFont);\n // Add stave connector text\n for (let i = 0; i < this.texts.length; i++) {\n const text = this.texts[i];\n const text_width = ctx.measureText('' + text.content).width;\n const x = this.top_stave.getX() - text_width - 24 + text.options.shift_x;\n const y = (this.top_stave.getYForLine(0) + this.bottom_stave.getBottomLineY()) / 2 + text.options.shift_y;\n ctx.fillText('' + text.content, x, y + 4);\n }\n ctx.restore();\n }\n}\nStaveConnector.TEXT_FONT = {\n family: Font.SERIF,\n size: 16,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n/**\n * SINGLE_LEFT and SINGLE are the same value for compatibility\n * with older versions of vexflow which didn't have right sided\n * stave connectors.\n */\nStaveConnector.type = {\n SINGLE_RIGHT: 0,\n SINGLE_LEFT: 1,\n SINGLE: 1,\n DOUBLE: 2,\n BRACE: 3,\n BRACKET: 4,\n BOLD_DOUBLE_LEFT: 5,\n BOLD_DOUBLE_RIGHT: 6,\n THIN_DOUBLE: 7,\n NONE: 8,\n};\n/**\n * Connector type:\n * * \"singleRight\"\n * * \"singleLeft\"\n * * \"single\"\n * * \"double\"\n * * \"brace\"\n * * \"bracket\"\n * * \"boldDoubleLeft\"\n * * \"boldDoubleRight\"\n * * \"thinDouble\"\n * * \"none\"\n */\nStaveConnector.typeString = {\n singleRight: StaveConnector.type.SINGLE_RIGHT,\n singleLeft: StaveConnector.type.SINGLE_LEFT,\n single: StaveConnector.type.SINGLE,\n double: StaveConnector.type.DOUBLE,\n brace: StaveConnector.type.BRACE,\n bracket: StaveConnector.type.BRACKET,\n boldDoubleLeft: StaveConnector.type.BOLD_DOUBLE_LEFT,\n boldDoubleRight: StaveConnector.type.BOLD_DOUBLE_RIGHT,\n thinDouble: StaveConnector.type.THIN_DOUBLE,\n none: StaveConnector.type.NONE,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Beam } from './beam';\nimport { Font } from './font';\nimport { Fraction } from './fraction';\nimport { ModifierContext } from './modifiercontext';\nimport { Stave } from './stave';\nimport { StaveConnector } from './staveconnector';\nimport { Tables } from './tables';\nimport { TickContext } from './tickcontext';\nimport { isNote, isStaveNote } from './typeguard';\nimport { defined, log, midLine, RuntimeError } from './util';\nimport { Voice } from './voice';\n// Helper function\nconst sumArray = (arr) => arr.reduce((a, b) => a + b, 0);\n/**\n * Create `Alignment`s for each tick in `voices`. Also calculate the\n * total number of ticks in voices.\n */\nfunction createContexts(voices, makeContext, addToContext) {\n const resolutionMultiplier = Formatter.getResolutionMultiplier(voices);\n // Initialize tick maps.\n const tickToContextMap = {};\n const tickList = [];\n const contexts = [];\n // For each voice, extract notes and create a context for every\n // new tick that hasn't been seen before.\n voices.forEach((voice, voiceIndex) => {\n // Use resolution multiplier as denominator so that no additional expansion\n // of fractional tick values is needed.\n const ticksUsed = new Fraction(0, resolutionMultiplier);\n voice.getTickables().forEach((tickable) => {\n const integerTicks = ticksUsed.numerator;\n // If we have no tick context for this tick, create one.\n if (!tickToContextMap[integerTicks]) {\n const newContext = makeContext({ tickID: integerTicks });\n contexts.push(newContext);\n tickToContextMap[integerTicks] = newContext;\n // Maintain a list of unique integerTicks.\n tickList.push(integerTicks);\n }\n // Add this tickable to the TickContext.\n addToContext(tickable, tickToContextMap[integerTicks], voiceIndex);\n ticksUsed.add(tickable.getTicks());\n });\n });\n return {\n map: tickToContextMap,\n array: contexts,\n list: tickList.sort((a, b) => a - b),\n resolutionMultiplier,\n };\n}\n// eslint-disable-next-line\nfunction L(...args) {\n if (Formatter.DEBUG)\n log('Vex.Flow.Formatter', args);\n}\n/**\n * Get the rest line number of the next non-rest note(s).\n * @param notes array of Notes\n * @param currRestLine\n * @param currNoteIndex current note index\n * @param compare if true, return the midpoint between the current rest line and the next rest line\n * @returns a line number, which determines the vertical position of a rest.\n */\nfunction getRestLineForNextNoteGroup(notes, currRestLine, currNoteIndex, compare) {\n // If no valid next note group, nextRestLine is same as current.\n let nextRestLine = currRestLine;\n // Start with the next note and keep going until we find a valid non-rest note group.\n for (let noteIndex = currNoteIndex + 1; noteIndex < notes.length; noteIndex++) {\n const note = notes[noteIndex];\n if (isNote(note) && !note.isRest() && !note.shouldIgnoreTicks()) {\n nextRestLine = note.getLineForRest();\n break;\n }\n }\n // Locate the mid point between two lines.\n if (compare && currRestLine !== nextRestLine) {\n const top = Math.max(currRestLine, nextRestLine);\n const bot = Math.min(currRestLine, nextRestLine);\n nextRestLine = midLine(top, bot);\n }\n return nextRestLine;\n}\n/**\n * Format implements the formatting and layout algorithms that are used\n * to position notes in a voice. The algorithm can align multiple voices both\n * within a stave, and across multiple staves.\n *\n * To do this, the formatter breaks up voices into a grid of rational-valued\n * `ticks`, to which each note is assigned. Then, minimum widths are assigned\n * to each tick based on the widths of the notes and modifiers in that tick. This\n * establishes the smallest amount of space required for each tick.\n *\n * Finally, the formatter distributes the left over space proportionally to\n * all the ticks, setting the `x` values of the notes in each tick.\n *\n * See `tests/formatter_tests.ts` for usage examples. The helper functions included\n * here (`FormatAndDraw`, `FormatAndDrawTab`) also serve as useful usage examples.\n */\nexport class Formatter {\n constructor(options) {\n this.formatterOptions = Object.assign({ globalSoftmax: false, softmaxFactor: 100, maxIterations: 5 }, options);\n this.justifyWidth = 0;\n this.totalCost = 0;\n this.totalShift = 0;\n this.durationStats = {};\n // Minimum width required to render all the notes in the voices.\n this.minTotalWidth = 0;\n // This is set to `true` after `minTotalWidth` is calculated.\n this.hasMinTotalWidth = false;\n // Arrays of tick and modifier contexts.\n this.tickContexts = undefined;\n this.modifierContexts = undefined;\n // Gaps between contexts, for free movement of notes post\n // formatting.\n this.contextGaps = {\n total: 0,\n gaps: [],\n };\n this.voices = [];\n this.lossHistory = [];\n }\n /**\n * Helper function to layout \"notes\" one after the other without\n * regard for proportions. Useful for tests and debugging.\n */\n static SimpleFormat(notes, x = 0, { paddingBetween = 10 } = {}) {\n notes.reduce((accumulator, note) => {\n note.addToModifierContext(new ModifierContext());\n const tick = new TickContext().addTickable(note).preFormat();\n const metrics = tick.getMetrics();\n tick.setX(accumulator + metrics.totalLeftPx);\n return accumulator + tick.getWidth() + metrics.totalRightPx + paddingBetween;\n }, x);\n }\n /** Helper function to plot formatter debug info. */\n static plotDebugging(ctx, formatter, xPos, y1, y2, options) {\n options = Object.assign({ stavePadding: Tables.currentMusicFont().lookupMetric('stave.padding') }, options);\n const x = xPos + options.stavePadding;\n const contextGaps = formatter.contextGaps;\n function stroke(x1, x2, color) {\n ctx.beginPath();\n ctx.setStrokeStyle(color);\n ctx.setFillStyle(color);\n ctx.setLineWidth(1);\n ctx.fillRect(x1, y1, Math.max(x2 - x1, 0), y2 - y1);\n }\n ctx.save();\n ctx.setFont(Font.SANS_SERIF, 8);\n contextGaps.gaps.forEach((gap) => {\n stroke(x + gap.x1, x + gap.x2, 'rgba(100,200,100,0.4)');\n ctx.setFillStyle('green');\n ctx.fillText(Math.round(gap.x2 - gap.x1).toString(), x + gap.x1, y2 + 12);\n });\n ctx.setFillStyle('red');\n ctx.fillText(`Loss: ${(formatter.totalCost || 0).toFixed(2)} Shift: ${(formatter.totalShift || 0).toFixed(2)} Gap: ${contextGaps.total.toFixed(2)}`, x - 20, y2 + 27);\n ctx.restore();\n }\n /**\n * Helper function to format and draw a single voice. Returns a bounding\n * box for the notation.\n * @param ctx the rendering context\n * @param stave the stave to which to draw (`Stave` or `TabStave`)\n * @param notes array of `Note` instances (`Note`, `TextNote`, `TabNote`, etc.)\n * @param params one of below:\n * * Setting `autobeam` only `(context, stave, notes, true)` or\n * `(ctx, stave, notes, {autobeam: true})`\n * * Setting `align_rests` a struct is needed `(context, stave, notes, {align_rests: true})`\n * * Setting both a struct is needed `(context, stave, notes, {\n * autobeam: true, align_rests: true})`\n * * `autobeam` automatically generates beams for the notes.\n * * `align_rests` aligns rests with nearby notes.\n */\n static FormatAndDraw(ctx, stave, notes, params) {\n let options = {\n auto_beam: false,\n align_rests: false,\n };\n if (typeof params === 'object') {\n options = Object.assign(Object.assign({}, options), params);\n }\n else if (typeof params === 'boolean') {\n options.auto_beam = params;\n }\n // Start by creating a voice and adding all the notes to it.\n const voice = new Voice(Tables.TIME4_4).setMode(Voice.Mode.SOFT).addTickables(notes);\n // Then create beams, if requested.\n const beams = options.auto_beam ? Beam.applyAndGetBeams(voice) : [];\n // Instantiate a `Formatter` and format the notes.\n new Formatter()\n .joinVoices([voice]) // , { align_rests: options.align_rests })\n .formatToStave([voice], stave, { align_rests: options.align_rests, stave });\n // Render the voice and beams to the stave.\n voice.setStave(stave).draw(ctx, stave);\n beams.forEach((beam) => beam.setContext(ctx).draw());\n // Return the bounding box of the voice.\n return voice.getBoundingBox();\n }\n /**\n * Helper function to format and draw aligned tab and stave notes in two\n * separate staves.\n * @param ctx the rendering context\n * @param tabstave a `TabStave` instance on which to render `TabNote`s.\n * @param stave a `Stave` instance on which to render `Note`s.\n * @param notes array of `Note` instances for the stave (`Note`, `BarNote`, etc.)\n * @param tabnotes array of `Note` instances for the tab stave (`TabNote`, `BarNote`, etc.)\n * @param autobeam automatically generate beams.\n * @param params a configuration object:\n * * `autobeam` automatically generates beams for the notes.\n * * `align_rests` aligns rests with nearby notes.\n */\n static FormatAndDrawTab(ctx, tabstave, stave, tabnotes, notes, autobeam, params) {\n let opts = {\n auto_beam: autobeam,\n align_rests: false,\n };\n if (typeof params === 'object') {\n opts = Object.assign(Object.assign({}, opts), params);\n }\n else if (typeof params === 'boolean') {\n opts.auto_beam = params;\n }\n // Create a `4/4` voice for `notes`.\n const notevoice = new Voice(Tables.TIME4_4).setMode(Voice.Mode.SOFT).addTickables(notes);\n // Create a `4/4` voice for `tabnotes`.\n const tabvoice = new Voice(Tables.TIME4_4).setMode(Voice.Mode.SOFT).addTickables(tabnotes);\n // Then create beams, if requested.\n const beams = opts.auto_beam ? Beam.applyAndGetBeams(notevoice) : [];\n // Instantiate a `Formatter` and align tab and stave notes.\n new Formatter()\n .joinVoices([notevoice]) // , { align_rests: opts.align_rests })\n .joinVoices([tabvoice])\n .formatToStave([notevoice, tabvoice], stave, { align_rests: opts.align_rests });\n // Render voices and beams to staves.\n notevoice.draw(ctx, stave);\n tabvoice.draw(ctx, tabstave);\n beams.forEach((beam) => beam.setContext(ctx).draw());\n // Draw a connector between tab and note staves.\n new StaveConnector(stave, tabstave).setContext(ctx).draw();\n }\n /**\n * Automatically set the vertical position of rests based on previous/next note positions.\n * @param tickables an array of Tickables.\n * @param alignAllNotes If `false`, only align rests that are within a group of beamed notes.\n * @param alignTuplets If `false`, ignores tuplets.\n */\n static AlignRestsToNotes(tickables, alignAllNotes, alignTuplets) {\n tickables.forEach((currTickable, index) => {\n if (isStaveNote(currTickable) && currTickable.isRest()) {\n if (currTickable.getTuplet() && !alignTuplets) {\n return;\n }\n // If activated rests not on default can be rendered as specified.\n const position = currTickable.getGlyph().position.toUpperCase();\n if (position !== 'R/4' && position !== 'B/4') {\n return;\n }\n if (alignAllNotes || currTickable.getBeam()) {\n // Align rests with previous/next notes.\n const props = currTickable.getKeyProps()[0];\n if (index === 0) {\n props.line = getRestLineForNextNoteGroup(tickables, props.line, index, false);\n }\n else if (index > 0 && index < tickables.length) {\n // If previous tickable is a rest, use its line number.\n const prevTickable = tickables[index - 1];\n if (isStaveNote(prevTickable)) {\n if (prevTickable.isRest()) {\n props.line = prevTickable.getKeyProps()[0].line;\n }\n else {\n const restLine = prevTickable.getLineForRest();\n // Get the rest line for next valid non-rest note group.\n props.line = getRestLineForNextNoteGroup(tickables, restLine, index, true);\n }\n }\n }\n currTickable.setKeyLine(0, props.line);\n }\n }\n });\n }\n /**\n * Find all the rests in each of the `voices` and align them to neighboring notes.\n *\n * @param voices\n * @param alignAllNotes If `false`, only align rests within beamed groups of notes. If `true`, align all rests.\n */\n alignRests(voices, alignAllNotes) {\n if (!voices || !voices.length) {\n throw new RuntimeError('BadArgument', 'No voices to format rests');\n }\n voices.forEach((voice) => Formatter.AlignRestsToNotes(voice.getTickables(), alignAllNotes));\n }\n /**\n * Estimate the width required to render 'voices'. This is done by:\n * 1. Sum the widths of all the tick contexts\n * 2. Estimate the padding.\n * The latter is done by calculating the padding 3 different ways, and taking the\n * greatest value:\n * 1. the padding required for unaligned notes in different voices\n * 2. the padding based on the stddev of the tickable widths\n * 3. the padding based on the stddev of the tickable durations.\n *\n * The last 2 quantities estimate a 'width entropy', where notes might need more\n * room than the proportional formatting gives them. A measure of all same duration\n * and width will need no extra padding, and all these quantities will be\n * zero in that case.\n *\n * @param voices the voices that contain the notes\n * @returns the estimated width in pixels\n */\n preCalculateMinTotalWidth(voices) {\n const unalignedPadding = Tables.currentMusicFont().lookupMetric('stave.unalignedNotePadding');\n // Calculate additional padding based on 3 methods:\n // 1) unaligned beats in voices, 2) variance of width, 3) variance of durations\n let unalignedCtxCount = 0;\n let wsum = 0;\n let dsum = 0;\n const widths = [];\n const durations = [];\n // Cache results.\n if (this.hasMinTotalWidth)\n return this.minTotalWidth;\n // Create tick contexts if not already created.\n if (!this.tickContexts) {\n if (!voices) {\n throw new RuntimeError('BadArgument', \"'voices' required to run preCalculateMinTotalWidth\");\n }\n this.createTickContexts(voices);\n }\n // eslint-disable-next-line\n const { list: contextList, map: contextMap } = this.tickContexts;\n this.minTotalWidth = 0;\n // Go through each tick context and calculate total width,\n // and also accumulate values used in padding hints\n contextList.forEach((tick) => {\n const context = contextMap[tick];\n context.preFormat();\n // If this TC doesn't have all the voices on it, it's unaligned.\n // so increment the unaligned padding accumulator\n if (context.getTickables().length < voices.length) {\n unalignedCtxCount += 1;\n }\n // Calculate the 'width entropy' over all the Tickables.\n context.getTickables().forEach((t) => {\n wsum += t.getMetrics().width;\n dsum += t.getTicks().value();\n widths.push(t.getMetrics().width);\n durations.push(t.getTicks().value());\n });\n const width = context.getWidth();\n this.minTotalWidth += width;\n });\n this.hasMinTotalWidth = true;\n // normalized (0-1) STDDEV of widths/durations gives us padding hints.\n const wavg = wsum > 0 ? wsum / widths.length : 1 / widths.length;\n const wvar = sumArray(widths.map((ll) => Math.pow(ll - wavg, 2)));\n const wpads = Math.pow(wvar / widths.length, 0.5) / wavg;\n const davg = dsum / durations.length;\n const dvar = sumArray(durations.map((ll) => Math.pow(ll - davg, 2)));\n const dpads = Math.pow(dvar / durations.length, 0.5) / davg;\n // Find max of 3 methods pad the width with that\n const padmax = Math.max(dpads, wpads) * contextList.length * unalignedPadding;\n const unalignedPad = unalignedPadding * unalignedCtxCount;\n return this.minTotalWidth + Math.max(unalignedPad, padmax);\n }\n /**\n * Get minimum width required to render all voices. Either `format` or\n * `preCalculateMinTotalWidth` must be called before this method.\n */\n getMinTotalWidth() {\n if (!this.hasMinTotalWidth) {\n throw new RuntimeError('NoMinTotalWidth', \"Call 'preCalculateMinTotalWidth' or 'preFormat' before calling 'getMinTotalWidth'\");\n }\n return this.minTotalWidth;\n }\n /** Calculate the resolution multiplier for `voices`. */\n static getResolutionMultiplier(voices) {\n if (!voices || !voices.length) {\n throw new RuntimeError('BadArgument', 'No voices to format');\n }\n const totalTicks = voices[0].getTotalTicks();\n const resolutionMultiplier = voices.reduce((accumulator, voice) => {\n if (!voice.getTotalTicks().equals(totalTicks)) {\n throw new RuntimeError('TickMismatch', 'Voices should have same total note duration in ticks.');\n }\n if (voice.getMode() === Voice.Mode.STRICT && !voice.isComplete()) {\n throw new RuntimeError('IncompleteVoice', 'Voice does not have enough notes.');\n }\n return Math.max(accumulator, Fraction.LCM(accumulator, voice.getResolutionMultiplier()));\n }, 1);\n return resolutionMultiplier;\n }\n /** Create a `ModifierContext` for each tick in `voices`. */\n createModifierContexts(voices) {\n const fn = (tickable, context) => tickable.addToModifierContext(context);\n const contexts = createContexts(voices, () => new ModifierContext(), fn);\n this.modifierContexts = contexts;\n return contexts;\n }\n /**\n * Create a `TickContext` for each tick in `voices`. Also calculate the\n * total number of ticks in voices.\n */\n createTickContexts(voices) {\n const fn = (tickable, context, voiceIndex) => context.addTickable(tickable, voiceIndex);\n const contexts = createContexts(voices, (tick) => new TickContext(tick), fn);\n this.tickContexts = contexts;\n const contextArray = this.tickContexts.array;\n contextArray.forEach((context) => {\n context.tContexts = contextArray;\n });\n return contexts;\n }\n /**\n * This is the core formatter logic. Format voices and justify them\n * to `justifyWidth` pixels. `renderingContext` is required to justify elements\n * that can't retreive widths without a canvas. This method sets the `x` positions\n * of all the tickables/notes in the formatter.\n */\n preFormat(justifyWidth = 0, renderingContext, voicesParam, stave) {\n // Initialize context maps.\n const contexts = this.tickContexts;\n if (!contexts) {\n throw new RuntimeError('NoTickContexts', 'preFormat requires TickContexts');\n }\n const { list: contextList, map: contextMap } = contexts;\n // Reset loss history for evaluator.\n this.lossHistory = [];\n // If voices and a stave were provided, set the Stave for each voice\n // and preFormat to apply Y values to the notes;\n if (voicesParam && stave) {\n voicesParam.forEach((voice) => voice.setStave(stave).preFormat());\n }\n // Now distribute the ticks to each tick context, and assign them their\n // own X positions.\n let x = 0;\n let shift = 0;\n this.minTotalWidth = 0;\n let totalTicks = 0;\n // Pass 1: Give each note maximum width requested by context.\n contextList.forEach((tick) => {\n const context = contextMap[tick];\n // Make sure that all tickables in this context have calculated their\n // space requirements.\n context.preFormat();\n const width = context.getWidth();\n this.minTotalWidth += width;\n const maxTicks = context.getMaxTicks().value();\n totalTicks += maxTicks;\n const metrics = context.getMetrics();\n x = x + shift + metrics.totalLeftPx;\n context.setX(x);\n // Calculate shift for the next tick.\n shift = width - metrics.totalLeftPx;\n });\n // Use softmax based on all notes across all staves. (options.globalSoftmax)\n const { globalSoftmax, softmaxFactor, maxIterations } = this.formatterOptions;\n const exp = (tick) => Math.pow(softmaxFactor, (contextMap[tick].getMaxTicks().value() / totalTicks));\n const expTicksUsed = sumArray(contextList.map(exp));\n this.minTotalWidth = x + shift;\n this.hasMinTotalWidth = true;\n // No justification needed. End formatting.\n if (justifyWidth <= 0)\n return this.evaluate();\n // Start justification. Subtract the right extra pixels of the final context because the formatter\n // justifies based on the context's X position, which is the left-most part of the note head.\n const firstContext = contextMap[contextList[0]];\n const lastContext = contextMap[contextList[contextList.length - 1]];\n // Calculate the \"distance error\" between the tick contexts. The expected distance is the spacing proportional to\n // the softmax of the ticks.\n function calculateIdealDistances(adjustedJustifyWidth) {\n const distances = contextList.map((tick, i) => {\n const context = contextMap[tick];\n const voices = context.getTickablesByVoice();\n let backTickable;\n if (i > 0) {\n const prevContext = contextMap[contextList[i - 1]];\n // Go through each tickable and search backwards for another tickable\n // in the same voice. If found, use that duration (ticks) to calculate\n // the expected distance.\n for (let j = i - 1; j >= 0; j--) {\n const backTick = contextMap[contextList[j]];\n const backVoices = backTick.getTickablesByVoice();\n // Look for matching voices between tick contexts.\n const matchingVoices = [];\n Object.keys(voices).forEach((v) => {\n if (backVoices[v]) {\n matchingVoices.push(v);\n }\n });\n if (matchingVoices.length > 0) {\n // Found matching voices, get largest duration\n let maxTicks = 0;\n let maxNegativeShiftPx = Infinity;\n let expectedDistance = 0;\n matchingVoices.forEach((v) => {\n const ticks = backVoices[v].getTicks().value();\n if (ticks > maxTicks) {\n backTickable = backVoices[v];\n maxTicks = ticks;\n }\n // Calculate the limits of the shift based on modifiers, etc.\n const thisTickable = voices[v];\n const insideLeftEdge = thisTickable.getX() -\n (thisTickable.getMetrics().modLeftPx + thisTickable.getMetrics().leftDisplacedHeadPx);\n const backMetrics = backVoices[v].getMetrics();\n const insideRightEdge = backVoices[v].getX() + backMetrics.notePx + backMetrics.modRightPx + backMetrics.rightDisplacedHeadPx;\n // Don't allow shifting if notes in the same voice can collide\n maxNegativeShiftPx = Math.min(maxNegativeShiftPx, insideLeftEdge - insideRightEdge);\n });\n // Don't shift further left than the notehead of the last context. Actually, stay at most 5% to the right\n // so that two different tick contexts don't align across staves.\n maxNegativeShiftPx = Math.min(maxNegativeShiftPx, context.getX() - (prevContext.getX() + adjustedJustifyWidth * 0.05));\n // Calculate the expected distance of the current context from the last matching tickable. The\n // distance is scaled down by the softmax for the voice.\n if (globalSoftmax) {\n const t = totalTicks;\n expectedDistance = (Math.pow(softmaxFactor, (maxTicks / t)) / expTicksUsed) * adjustedJustifyWidth;\n }\n else if (typeof backTickable !== 'undefined') {\n expectedDistance = backTickable.getVoice().softmax(maxTicks) * adjustedJustifyWidth;\n }\n return {\n expectedDistance,\n maxNegativeShiftPx,\n fromTickable: backTickable,\n };\n }\n }\n }\n return { expectedDistance: 0, fromTickablePx: 0, maxNegativeShiftPx: 0 };\n });\n return distances;\n }\n function shiftToIdealDistances(idealDistances) {\n // Distribute ticks to the contexts based on the calculated distance error.\n const centerX = adjustedJustifyWidth / 2;\n let spaceAccum = 0;\n contextList.forEach((tick, index) => {\n const context = contextMap[tick];\n if (index > 0) {\n const contextX = context.getX();\n const ideal = idealDistances[index];\n const errorPx = defined(ideal.fromTickable).getX() + ideal.expectedDistance - (contextX + spaceAccum);\n let negativeShiftPx = 0;\n if (errorPx > 0) {\n spaceAccum += errorPx;\n }\n else if (errorPx < 0) {\n negativeShiftPx = Math.min(ideal.maxNegativeShiftPx, Math.abs(errorPx));\n spaceAccum += -negativeShiftPx;\n }\n context.setX(contextX + spaceAccum);\n }\n // Move center aligned tickables to middle\n context.getCenterAlignedTickables().forEach((tickable) => {\n tickable.setCenterXShift(centerX - context.getX());\n });\n });\n return lastContext.getX() - firstContext.getX();\n }\n const adjustedJustifyWidth = justifyWidth -\n lastContext.getMetrics().notePx -\n lastContext.getMetrics().totalRightPx -\n firstContext.getMetrics().totalLeftPx;\n const musicFont = Tables.currentMusicFont();\n const configMinPadding = musicFont.lookupMetric('stave.endPaddingMin');\n const configMaxPadding = musicFont.lookupMetric('stave.endPaddingMax');\n let targetWidth = adjustedJustifyWidth;\n const distances = calculateIdealDistances(targetWidth);\n let actualWidth = shiftToIdealDistances(distances);\n // Calculate right justification by finding max of (configured value, min distance between tickables)\n // so measures with lots of white space use it evenly, and crowded measures use at least the configured\n // space.\n const calcMinDistance = (targetWidth, distances) => {\n let mdCalc = targetWidth / 2;\n if (distances.length > 1) {\n for (let di = 1; di < distances.length; ++di) {\n mdCalc = Math.min(distances[di].expectedDistance / 2, mdCalc);\n }\n }\n return mdCalc;\n };\n const minDistance = calcMinDistance(targetWidth, distances);\n // Just one context. Done formatting.\n if (contextList.length === 1)\n return 0;\n // right justify to either the configured padding, or the min distance between notes, whichever is greatest.\n // This * 2 keeps the existing formatting unless there is 'a lot' of extra whitespace, which won't break\n // existing visual regression tests.\n const paddingMax = configMaxPadding * 2 < minDistance ? minDistance : configMaxPadding;\n const paddingMin = paddingMax - (configMaxPadding - configMinPadding);\n const maxX = adjustedJustifyWidth - paddingMin;\n let iterations = maxIterations;\n // Adjust justification width until the right margin is as close as possible to the calculated padding,\n // without going over\n while ((actualWidth > maxX && iterations > 0) || (actualWidth + paddingMax < maxX && iterations > 1)) {\n targetWidth -= actualWidth - maxX;\n actualWidth = shiftToIdealDistances(calculateIdealDistances(targetWidth));\n iterations--;\n }\n this.justifyWidth = justifyWidth;\n return this.evaluate();\n }\n /** Calculate the total cost of this formatting decision. */\n evaluate() {\n if (!this.tickContexts)\n return 0;\n const contexts = this.tickContexts;\n const justifyWidth = this.justifyWidth;\n // Calculate available slack per tick context. This works out how much freedom\n // to move a context has in either direction, without affecting other notes.\n this.contextGaps = { total: 0, gaps: [] };\n contexts.list.forEach((tick, index) => {\n if (index === 0)\n return;\n const prevTick = contexts.list[index - 1];\n const prevContext = contexts.map[prevTick];\n const context = contexts.map[tick];\n const prevMetrics = prevContext.getMetrics();\n const currMetrics = context.getMetrics();\n // Calculate X position of right edge of previous note\n const insideRightEdge = prevContext.getX() + prevMetrics.notePx + prevMetrics.totalRightPx;\n // Calculate X position of left edge of current note\n const insideLeftEdge = context.getX() - currMetrics.totalLeftPx;\n const gap = insideLeftEdge - insideRightEdge;\n this.contextGaps.total += gap;\n this.contextGaps.gaps.push({ x1: insideRightEdge, x2: insideLeftEdge });\n // Tell the tick contexts how much they can reposition themselves.\n context.getFormatterMetrics().freedom.left = gap;\n prevContext.getFormatterMetrics().freedom.right = gap;\n });\n // Calculate mean distance in each voice for each duration type, then calculate\n // how far each note is from the mean.\n this.durationStats = {};\n const durationStats = this.durationStats;\n function updateStats(duration, space) {\n const stats = durationStats[duration];\n if (stats === undefined) {\n durationStats[duration] = { mean: space, count: 1 };\n }\n else {\n stats.count += 1;\n stats.mean = (stats.mean + space) / 2;\n }\n }\n this.voices.forEach((voice) => {\n voice.getTickables().forEach((note, i, notes) => {\n const duration = note.getTicks().clone().simplify().toString();\n const metrics = note.getMetrics();\n const formatterMetrics = note.getFormatterMetrics();\n const leftNoteEdge = note.getX() + metrics.notePx + metrics.modRightPx + metrics.rightDisplacedHeadPx;\n let space = 0;\n if (i < notes.length - 1) {\n const rightNote = notes[i + 1];\n const rightMetrics = rightNote.getMetrics();\n const rightNoteEdge = rightNote.getX() - rightMetrics.modLeftPx - rightMetrics.leftDisplacedHeadPx;\n space = rightNoteEdge - leftNoteEdge;\n formatterMetrics.space.used = rightNote.getX() - note.getX();\n rightNote.getFormatterMetrics().freedom.left = space;\n }\n else {\n space = justifyWidth - leftNoteEdge;\n formatterMetrics.space.used = justifyWidth - note.getX();\n }\n formatterMetrics.freedom.right = space;\n updateStats(duration, formatterMetrics.space.used);\n });\n });\n // Calculate how much each note deviates from the mean. Loss function is square\n // root of the sum of squared deviations.\n let totalDeviation = 0;\n this.voices.forEach((voice) => {\n voice.getTickables().forEach((note) => {\n const duration = note.getTicks().clone().simplify().toString();\n const metrics = note.getFormatterMetrics();\n metrics.space.mean = durationStats[duration].mean;\n metrics.duration = duration;\n metrics.iterations += 1;\n metrics.space.deviation = metrics.space.used - metrics.space.mean;\n totalDeviation += Math.pow(metrics.space.deviation, 2);\n });\n });\n this.totalCost = Math.sqrt(totalDeviation);\n this.lossHistory.push(this.totalCost);\n return this.totalCost;\n }\n /**\n * Run a single iteration of rejustification. At a high level, this method calculates\n * the overall \"loss\" (or cost) of this layout, and repositions tickcontexts in an\n * attempt to reduce the cost. You can call this method multiple times until it finds\n * and oscillates around a global minimum.\n * @param alpha the \"learning rate\" for the formatter. It determines how much of a shift\n * the formatter should make based on its cost function.\n */\n tune(options) {\n var _a;\n const contexts = this.tickContexts;\n if (!contexts) {\n return 0;\n }\n const alpha = (_a = options === null || options === void 0 ? void 0 : options.alpha) !== null && _a !== void 0 ? _a : 0.5;\n // Move `current` tickcontext by `shift` pixels, and adjust the freedom\n // on adjacent tickcontexts.\n function move(current, shift, prev, next) {\n current.setX(current.getX() + shift);\n current.getFormatterMetrics().freedom.left += shift;\n current.getFormatterMetrics().freedom.right -= shift;\n if (prev)\n prev.getFormatterMetrics().freedom.right += shift;\n if (next)\n next.getFormatterMetrics().freedom.left -= shift;\n }\n let shift = 0;\n this.totalShift = 0;\n contexts.list.forEach((tick, index, list) => {\n const context = contexts.map[tick];\n const prevContext = index > 0 ? contexts.map[list[index - 1]] : undefined;\n const nextContext = index < list.length - 1 ? contexts.map[list[index + 1]] : undefined;\n move(context, shift, prevContext, nextContext);\n const cost = -sumArray(context.getTickables().map((t) => t.getFormatterMetrics().space.deviation));\n if (cost > 0) {\n shift = -Math.min(context.getFormatterMetrics().freedom.right, Math.abs(cost));\n }\n else if (cost < 0) {\n if (nextContext) {\n shift = Math.min(nextContext.getFormatterMetrics().freedom.right, Math.abs(cost));\n }\n else {\n shift = 0;\n }\n }\n shift *= alpha;\n this.totalShift += shift;\n });\n return this.evaluate();\n }\n /**\n * This is the top-level call for all formatting logic completed\n * after `x` *and* `y` values have been computed for the notes\n * in the voices.\n */\n postFormat() {\n const postFormatContexts = (contexts) => contexts.list.forEach((tick) => contexts.map[tick].postFormat());\n if (this.modifierContexts)\n postFormatContexts(this.modifierContexts);\n if (this.tickContexts)\n postFormatContexts(this.tickContexts);\n return this;\n }\n /**\n * Take all `voices` and create `ModifierContext`s out of them. This tells\n * the formatters that the voices belong on a single stave.\n */\n joinVoices(voices) {\n this.createModifierContexts(voices);\n this.hasMinTotalWidth = false;\n return this;\n }\n /**\n * Align rests in voices, justify the contexts, and position the notes\n * so voices are aligned and ready to render onto the stave. This method\n * mutates the `x` positions of all tickables in `voices`.\n *\n * Voices are full justified to fit in `justifyWidth` pixels.\n *\n * Set `options.context` to the rendering context. Set `options.align_rests`\n * to true to enable rest alignment.\n */\n format(voices, justifyWidth, options) {\n const opts = Object.assign({ align_rests: false }, options);\n this.voices = voices;\n const softmaxFactor = this.formatterOptions.softmaxFactor;\n if (softmaxFactor) {\n this.voices.forEach((v) => v.setSoftmaxFactor(softmaxFactor));\n }\n this.alignRests(voices, opts.align_rests);\n this.createTickContexts(voices);\n this.preFormat(justifyWidth, opts.context, voices, opts.stave);\n // Only postFormat if a stave was supplied for y value formatting\n if (opts.stave)\n this.postFormat();\n return this;\n }\n // This method is just like `format` except that the `justifyWidth` is inferred from the `stave`.\n formatToStave(voices, stave, optionsParam) {\n const options = Object.assign({ context: stave.getContext() }, optionsParam);\n // eslint-disable-next-line\n const justifyWidth = stave.getNoteEndX() - stave.getNoteStartX() - Stave.defaultPadding;\n L('Formatting voices to width: ', justifyWidth);\n return this.format(voices, justifyWidth, options);\n }\n getTickContext(tick) {\n var _a;\n return (_a = this.tickContexts) === null || _a === void 0 ? void 0 : _a.map[tick];\n }\n}\n// To enable logging for this class. Set `Vex.Flow.Formatter.DEBUG` to `true`.\nFormatter.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n/**\n * ## Description\n *\n * Create a new tuplet from the specified notes. The notes must\n * be part of the same voice. If they are of different rhythmic\n * values, then options.num_notes must be set.\n *\n * @constructor\n * @param {Array.} A set of notes: staveNotes,\n * notes, etc... any class that inherits stemmableNote at some\n * point in its prototype chain.\n * @param options: object {\n *\n * num_notes: fit this many notes into...\n * notes_occupied: ...the space of this many notes\n *\n * Together, these two properties make up the tuplet ratio\n * in the form of num_notes : notes_occupied.\n * num_notes defaults to the number of notes passed in, so\n * it is important that if you omit this property, all of\n * the notes passed should be of the same note value.\n * notes_occupied defaults to 2 -- so you should almost\n * certainly pass this parameter for anything other than\n * a basic triplet.\n *\n * location:\n * default 1, which is above the notes: ┌─── 3 ───┐\n * -1 is below the notes └─── 3 ───┘\n *\n * bracketed: boolean, draw a bracket around the tuplet number\n * when true: ┌─── 3 ───┐ when false: 3\n * defaults to true if notes are not beamed, false otherwise\n *\n * ratioed: boolean\n * when true: ┌─── 7:8 ───┐, when false: ┌─── 7 ───┐\n * defaults to true if the difference between num_notes and\n * notes_occupied is greater than 1.\n *\n * y_offset: int, default 0\n * manually offset a tuplet, for instance to avoid collisions\n * with articulations, etc...\n * }\n */\nimport { Element } from './element';\nimport { Formatter } from './formatter';\nimport { Glyph } from './glyph';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nexport var TupletLocation;\n(function (TupletLocation) {\n TupletLocation[TupletLocation[\"BOTTOM\"] = -1] = \"BOTTOM\";\n TupletLocation[TupletLocation[\"TOP\"] = 1] = \"TOP\";\n})(TupletLocation || (TupletLocation = {}));\nexport class Tuplet extends Element {\n constructor(notes, options = {}) {\n super();\n this.numerator_glyphs = [];\n this.denom_glyphs = [];\n if (!notes || !notes.length) {\n throw new RuntimeError('BadArguments', 'No notes provided for tuplet.');\n }\n this.options = options;\n this.notes = notes;\n this.num_notes = this.options.num_notes != undefined ? this.options.num_notes : notes.length;\n // We accept beats_occupied, but warn that it's deprecated:\n // the preferred property name is now notes_occupied.\n if (this.options.beats_occupied) {\n this.beatsOccupiedDeprecationWarning();\n }\n this.notes_occupied = this.options.notes_occupied || this.options.beats_occupied || 2;\n if (this.options.bracketed != undefined) {\n this.bracketed = this.options.bracketed;\n }\n else {\n this.bracketed = notes.some((note) => !note.hasBeam());\n }\n this.ratioed =\n this.options.ratioed != undefined ? this.options.ratioed : Math.abs(this.notes_occupied - this.num_notes) > 1;\n this.point = Tables.currentMusicFont().lookupMetric('digits.tupletPoint');\n this.y_pos = 16;\n this.x_pos = 100;\n this.width = 200;\n this.setTupletLocation(this.options.location || Tuplet.LOCATION_TOP);\n Formatter.AlignRestsToNotes(notes, true, true);\n this.resolveGlyphs();\n this.attach();\n }\n static get CATEGORY() {\n return Category.Tuplet;\n }\n static get LOCATION_TOP() {\n return TupletLocation.TOP;\n }\n static get LOCATION_BOTTOM() {\n return TupletLocation.BOTTOM;\n }\n static get NESTING_OFFSET() {\n return 15;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static get metrics() {\n return Tables.currentMusicFont().getMetrics().glyphs.tuplet;\n }\n attach() {\n for (let i = 0; i < this.notes.length; i++) {\n const note = this.notes[i];\n note.setTuplet(this);\n }\n }\n detach() {\n for (let i = 0; i < this.notes.length; i++) {\n const note = this.notes[i];\n note.resetTuplet(this);\n }\n }\n /**\n * Set whether or not the bracket is drawn.\n */\n setBracketed(bracketed) {\n this.bracketed = !!bracketed;\n return this;\n }\n /**\n * Set whether or not the ratio is shown.\n */\n setRatioed(ratioed) {\n this.ratioed = !!ratioed;\n return this;\n }\n /**\n * Set the tuplet indicator to be displayed either on the top or bottom of the stave.\n */\n setTupletLocation(location) {\n if (location !== Tuplet.LOCATION_TOP && location !== Tuplet.LOCATION_BOTTOM) {\n // eslint-disable-next-line\n console.warn(`Invalid tuplet location [${location}]. Using Tuplet.LOCATION_TOP.`);\n location = Tuplet.LOCATION_TOP;\n }\n this.location = location;\n return this;\n }\n getNotes() {\n return this.notes;\n }\n getNoteCount() {\n return this.num_notes;\n }\n beatsOccupiedDeprecationWarning() {\n // eslint-disable-next-line\n console.warn('beats_occupied has been deprecated as an option for tuplets. Please use notes_occupied instead.', 'Calls to getBeatsOccupied / setBeatsOccupied should now be routed to getNotesOccupied / setNotesOccupied.', 'The old methods will be removed in VexFlow 5.0.');\n }\n getBeatsOccupied() {\n this.beatsOccupiedDeprecationWarning();\n return this.getNotesOccupied();\n }\n setBeatsOccupied(beats) {\n this.beatsOccupiedDeprecationWarning();\n return this.setNotesOccupied(beats);\n }\n getNotesOccupied() {\n return this.notes_occupied;\n }\n setNotesOccupied(notes) {\n this.detach();\n this.notes_occupied = notes;\n this.resolveGlyphs();\n this.attach();\n }\n resolveGlyphs() {\n this.numerator_glyphs = [];\n let n = this.num_notes;\n while (n >= 1) {\n this.numerator_glyphs.unshift(new Glyph('timeSig' + (n % 10), this.point));\n n = parseInt((n / 10).toString(), 10);\n }\n this.denom_glyphs = [];\n n = this.notes_occupied;\n while (n >= 1) {\n this.denom_glyphs.unshift(new Glyph('timeSig' + (n % 10), this.point));\n n = parseInt((n / 10).toString(), 10);\n }\n }\n // determine how many tuplets are nested within this tuplet\n // on the same side (above/below), to calculate a y\n // offset for this tuplet:\n getNestedTupletCount() {\n const location = this.location;\n const first_note = this.notes[0];\n let maxTupletCount = countTuplets(first_note, location);\n let minTupletCount = countTuplets(first_note, location);\n // Count the tuplets that are on the same side (above/below)\n // as this tuplet:\n function countTuplets(note, location) {\n return note.getTupletStack().filter((tuplet) => tuplet.location === location).length;\n }\n this.notes.forEach((note) => {\n const tupletCount = countTuplets(note, location);\n maxTupletCount = tupletCount > maxTupletCount ? tupletCount : maxTupletCount;\n minTupletCount = tupletCount < minTupletCount ? tupletCount : minTupletCount;\n });\n return maxTupletCount - minTupletCount;\n }\n // determine the y position of the tuplet:\n getYPosition() {\n // offset the tuplet for any nested tuplets between\n // it and the notes:\n const nested_tuplet_y_offset = this.getNestedTupletCount() * Tuplet.NESTING_OFFSET * -this.location;\n // offset the tuplet for any manual y_offset:\n const y_offset = this.options.y_offset || 0;\n // now iterate through the notes and find our highest\n // or lowest locations, to form a base y_pos\n const first_note = this.notes[0];\n let y_pos;\n if (this.location === Tuplet.LOCATION_TOP) {\n y_pos = first_note.checkStave().getYForLine(0) - Tuplet.metrics.topModifierOffset;\n // check modifiers above note to see if they will collide with tuplet beam\n for (let i = 0; i < this.notes.length; ++i) {\n const note = this.notes[i];\n let modLines = 0;\n const mc = note.getModifierContext();\n if (mc) {\n modLines = Math.max(modLines, mc.getState().top_text_line);\n }\n const modY = note.getYForTopText(modLines) - Tuplet.metrics.noteHeadOffset;\n if (note.hasStem() || note.isRest()) {\n const top_y = note.getStemDirection() === Stem.UP\n ? note.getStemExtents().topY - Tuplet.metrics.stemOffset\n : note.getStemExtents().baseY - Tuplet.metrics.noteHeadOffset;\n y_pos = Math.min(top_y, y_pos);\n if (modLines > 0) {\n y_pos = Math.min(modY, y_pos);\n }\n }\n }\n }\n else {\n let lineCheck = Tuplet.metrics.bottomLine; // tuplet default on line 4\n // check modifiers below note to see if they will collide with tuplet beam\n this.notes.forEach((nn) => {\n const mc = nn.getModifierContext();\n if (mc) {\n lineCheck = Math.max(lineCheck, mc.getState().text_line + 1);\n }\n });\n y_pos = first_note.checkStave().getYForLine(lineCheck) + Tuplet.metrics.noteHeadOffset;\n for (let i = 0; i < this.notes.length; ++i) {\n if (this.notes[i].hasStem() || this.notes[i].isRest()) {\n const bottom_y = this.notes[i].getStemDirection() === Stem.UP\n ? this.notes[i].getStemExtents().baseY + Tuplet.metrics.noteHeadOffset\n : this.notes[i].getStemExtents().topY + Tuplet.metrics.stemOffset;\n if (bottom_y > y_pos) {\n y_pos = bottom_y;\n }\n }\n }\n }\n return y_pos + nested_tuplet_y_offset + y_offset;\n }\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n // determine x value of left bound of tuplet\n const first_note = this.notes[0];\n const last_note = this.notes[this.notes.length - 1];\n if (!this.bracketed) {\n this.x_pos = first_note.getStemX();\n this.width = last_note.getStemX() - this.x_pos;\n }\n else {\n this.x_pos = first_note.getTieLeftX() - 5;\n this.width = last_note.getTieRightX() - this.x_pos + 5;\n }\n // determine y value for tuplet\n this.y_pos = this.getYPosition();\n const addGlyphWidth = (width, glyph) => width + defined(glyph.getMetrics().width);\n // calculate total width of tuplet notation\n let width = this.numerator_glyphs.reduce(addGlyphWidth, 0);\n if (this.ratioed) {\n width = this.denom_glyphs.reduce(addGlyphWidth, width);\n width += this.point * 0.32;\n }\n const notation_center_x = this.x_pos + this.width / 2;\n const notation_start_x = notation_center_x - width / 2;\n // draw bracket if the tuplet is not beamed\n if (this.bracketed) {\n const line_width = this.width / 2 - width / 2 - 5;\n // only draw the bracket if it has positive length\n if (line_width > 0) {\n ctx.fillRect(this.x_pos, this.y_pos, line_width, 1);\n ctx.fillRect(this.x_pos + this.width / 2 + width / 2 + 5, this.y_pos, line_width, 1);\n ctx.fillRect(this.x_pos, this.y_pos + (this.location === Tuplet.LOCATION_BOTTOM ? 1 : 0), 1, this.location * 10);\n ctx.fillRect(this.x_pos + this.width, this.y_pos + (this.location === Tuplet.LOCATION_BOTTOM ? 1 : 0), 1, this.location * 10);\n }\n }\n // draw numerator glyphs\n const shiftY = Tables.currentMusicFont().lookupMetric('digits.shiftY', 0);\n let x_offset = 0;\n this.numerator_glyphs.forEach((glyph) => {\n glyph.render(ctx, notation_start_x + x_offset, this.y_pos + this.point / 3 - 2 + shiftY);\n x_offset += defined(glyph.getMetrics().width);\n });\n // display colon and denominator if the ratio is to be shown\n if (this.ratioed) {\n const colon_x = notation_start_x + x_offset + this.point * 0.16;\n const colon_radius = this.point * 0.06;\n ctx.beginPath();\n ctx.arc(colon_x, this.y_pos - this.point * 0.08, colon_radius, 0, Math.PI * 2, true);\n ctx.closePath();\n ctx.fill();\n ctx.beginPath();\n ctx.arc(colon_x, this.y_pos + this.point * 0.12, colon_radius, 0, Math.PI * 2, true);\n ctx.closePath();\n ctx.fill();\n x_offset += this.point * 0.32;\n this.denom_glyphs.forEach((glyph) => {\n glyph.render(ctx, notation_start_x + x_offset, this.y_pos + this.point / 3 - 2 + shiftY);\n x_offset += defined(glyph.getMetrics().width);\n });\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Fraction } from './fraction';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { TupletLocation } from './tuplet';\nimport { Category, isStaveNote, isTabNote } from './typeguard';\nimport { RuntimeError } from './util';\nfunction calculateStemDirection(notes) {\n let lineSum = 0;\n notes.forEach((note) => {\n if (note.keyProps) {\n note.keyProps.forEach((keyProp) => {\n lineSum += keyProp.line - 3;\n });\n }\n });\n if (lineSum >= 0) {\n return Stem.DOWN;\n }\n return Stem.UP;\n}\nfunction getStemSlope(firstNote, lastNote) {\n const firstStemTipY = firstNote.getStemExtents().topY;\n const firstStemX = firstNote.getStemX();\n const lastStemTipY = lastNote.getStemExtents().topY;\n const lastStemX = lastNote.getStemX();\n return (lastStemTipY - firstStemTipY) / (lastStemX - firstStemX);\n}\nconst BEAM_LEFT = 'L';\nconst BEAM_RIGHT = 'R';\nconst BEAM_BOTH = 'B';\n/** `Beams` span over a set of `StemmableNotes`. */\nexport class Beam extends Element {\n constructor(notes, auto_stem = false) {\n super();\n this.slope = 0;\n this.y_shift = 0;\n if (!notes || notes.length === 0) {\n throw new RuntimeError('BadArguments', 'No notes provided for beam.');\n }\n if (notes.length === 1) {\n throw new RuntimeError('BadArguments', 'Too few notes for beam.');\n }\n // Validate beam line, direction and ticks.\n this.ticks = notes[0].getIntrinsicTicks();\n if (this.ticks >= Tables.durationToTicks('4')) {\n throw new RuntimeError('BadArguments', 'Beams can only be applied to notes shorter than a quarter note.');\n }\n let i; // shared iterator\n let note;\n this.stem_direction = Stem.UP;\n for (i = 0; i < notes.length; ++i) {\n note = notes[i];\n if (note.hasStem()) {\n this.stem_direction = note.getStemDirection();\n break;\n }\n }\n let stem_direction = this.stem_direction;\n // Figure out optimal stem direction based on given notes\n if (auto_stem && isStaveNote(notes[0])) {\n stem_direction = calculateStemDirection(notes);\n }\n else if (auto_stem && isTabNote(notes[0])) {\n // Auto Stem TabNotes\n const stem_weight = notes.reduce((memo, note) => memo + note.getStemDirection(), 0);\n stem_direction = stem_weight > -1 ? Stem.UP : Stem.DOWN;\n }\n // Apply stem directions and attach beam to notes\n for (i = 0; i < notes.length; ++i) {\n note = notes[i];\n if (auto_stem) {\n note.setStemDirection(stem_direction);\n this.stem_direction = stem_direction;\n }\n note.setBeam(this);\n }\n this.postFormatted = false;\n this.notes = notes;\n this.beam_count = this.getBeamCount();\n this.break_on_indices = [];\n this.render_options = {\n beam_width: 5,\n max_slope: 0.25,\n min_slope: -0.25,\n slope_iterations: 20,\n slope_cost: 100,\n show_stemlets: false,\n stemlet_extension: 7,\n partial_beam_length: 10,\n flat_beams: false,\n min_flat_beam_offset: 15,\n };\n }\n static get CATEGORY() {\n return Category.Beam;\n }\n /** Get the direction of the beam */\n getStemDirection() {\n return this.stem_direction;\n }\n /**\n * Get the default beam groups for a provided time signature.\n * Attempt to guess if the time signature is not found in table.\n * Currently this is fairly naive.\n */\n static getDefaultBeamGroups(time_sig) {\n if (!time_sig || time_sig === 'c') {\n time_sig = '4/4';\n }\n const defaults = {\n '1/2': ['1/2'],\n '2/2': ['1/2'],\n '3/2': ['1/2'],\n '4/2': ['1/2'],\n '1/4': ['1/4'],\n '2/4': ['1/4'],\n '3/4': ['1/4'],\n '4/4': ['1/4'],\n '1/8': ['1/8'],\n '2/8': ['2/8'],\n '3/8': ['3/8'],\n '4/8': ['2/8'],\n '1/16': ['1/16'],\n '2/16': ['2/16'],\n '3/16': ['3/16'],\n '4/16': ['2/16'],\n };\n const groups = defaults[time_sig];\n if (groups === undefined) {\n // If no beam groups found, naively determine\n // the beam groupings from the time signature\n const beatTotal = parseInt(time_sig.split('/')[0], 10);\n const beatValue = parseInt(time_sig.split('/')[1], 10);\n const tripleMeter = beatTotal % 3 === 0;\n if (tripleMeter) {\n return [new Fraction(3, beatValue)];\n }\n else if (beatValue > 4) {\n return [new Fraction(2, beatValue)];\n }\n else if (beatValue <= 4) {\n return [new Fraction(1, beatValue)];\n }\n }\n else {\n return groups.map((group) => new Fraction().parse(group));\n }\n return [new Fraction(1, 4)];\n }\n /**\n * A helper function to automatically build basic beams for a voice. For more\n * complex auto-beaming use `Beam.generateBeams()`.\n * @param voice the voice to generate the beams for\n * @param stem_direction a stem direction to apply to the entire voice\n * @param groups an array of `Fraction` representing beat groupings for the beam\n */\n static applyAndGetBeams(voice, stem_direction, groups) {\n return Beam.generateBeams(voice.getTickables(), { groups, stem_direction });\n }\n /**\n * A helper function to autimatically build beams for a voice with\n * configuration options.\n *\n * Example configuration object:\n *\n * ```\n * config = {\n * groups: [new Vex.Flow.Fraction(2, 8)],\n * stem_direction: -1,\n * beam_rests: true,\n * beam_middle_only: true,\n * show_stemlets: false\n * };\n * ```\n * @param notes an array of notes to create the beams for\n * @param config the configuration object\n * @param config.stem_direction set to apply the same direction to all notes\n * @param config.beam_rests set to `true` to include rests in the beams\n * @param config.beam_middle_only set to `true` to only beam rests in the middle of the beat\n * @param config.show_stemlets set to `true` to draw stemlets for rests\n * @param config.maintain_stem_directions set to `true` to not apply new stem directions\n * @param config.groups array of `Fractions` that represent the beat structure to beam the notes\n *\n */\n static generateBeams(notes, config = {}) {\n if (!config.groups || !config.groups.length) {\n config.groups = [new Fraction(2, 8)];\n }\n // Convert beam groups to tick amounts\n const tickGroups = config.groups.map((group) => {\n if (!group.multiply) {\n throw new RuntimeError('InvalidBeamGroups', 'The beam groups must be an array of Vex.Flow.Fractions');\n }\n return group.clone().multiply(Tables.RESOLUTION, 1);\n });\n const unprocessedNotes = notes;\n let currentTickGroup = 0;\n let noteGroups = [];\n let currentGroup = [];\n function getTotalTicks(vf_notes) {\n return vf_notes.reduce((memo, note) => note.getTicks().clone().add(memo), new Fraction(0, 1));\n }\n function nextTickGroup() {\n if (tickGroups.length - 1 > currentTickGroup) {\n currentTickGroup += 1;\n }\n else {\n currentTickGroup = 0;\n }\n }\n function createGroups() {\n let nextGroup = [];\n // number of ticks in current group\n let currentGroupTotalTicks = new Fraction(0, 1);\n unprocessedNotes.forEach((unprocessedNote) => {\n nextGroup = [];\n if (unprocessedNote.shouldIgnoreTicks()) {\n noteGroups.push(currentGroup);\n currentGroup = nextGroup;\n return; // Ignore untickables (like bar notes)\n }\n currentGroup.push(unprocessedNote);\n const ticksPerGroup = tickGroups[currentTickGroup].clone();\n const totalTicks = getTotalTicks(currentGroup).add(currentGroupTotalTicks);\n // Double the amount of ticks in a group, if it's an unbeamable tuplet\n const unbeamable = Tables.durationToNumber(unprocessedNote.getDuration()) < 8;\n if (unbeamable && unprocessedNote.getTuplet()) {\n ticksPerGroup.numerator *= 2;\n }\n // If the note that was just added overflows the group tick total\n if (totalTicks.greaterThan(ticksPerGroup)) {\n // If the overflow note can be beamed, start the next group\n // with it. Unbeamable notes leave the group overflowed.\n if (!unbeamable) {\n const note = currentGroup.pop();\n if (note)\n nextGroup.push(note);\n }\n noteGroups.push(currentGroup);\n // We have overflown, so we're going to next tick group. As we might have\n // overflown by more than 1 group, we need to go forward as many times as\n // needed, decreasing currentGroupTotalTicks by as many ticks as there are\n // in current groups as we go forward.\n do {\n currentGroupTotalTicks = totalTicks.subtract(tickGroups[currentTickGroup]);\n nextTickGroup();\n } while (currentGroupTotalTicks.greaterThanEquals(tickGroups[currentTickGroup]));\n currentGroup = nextGroup;\n }\n else if (totalTicks.equals(ticksPerGroup)) {\n noteGroups.push(currentGroup);\n currentGroupTotalTicks = new Fraction(0, 1);\n currentGroup = nextGroup;\n nextTickGroup();\n }\n });\n // Adds any remainder notes beam\n if (currentGroup.length > 0) {\n noteGroups.push(currentGroup);\n }\n }\n function getBeamGroups() {\n return noteGroups.filter((group) => {\n if (group.length > 1) {\n let beamable = true;\n group.forEach((note) => {\n if (note.getIntrinsicTicks() >= Tables.durationToTicks('4')) {\n beamable = false;\n }\n });\n return beamable;\n }\n return false;\n });\n }\n // Splits up groups by Rest\n function sanitizeGroups() {\n const sanitizedGroups = [];\n noteGroups.forEach((group) => {\n let tempGroup = [];\n group.forEach((note, index, group) => {\n const isFirstOrLast = index === 0 || index === group.length - 1;\n const prevNote = group[index - 1];\n const breaksOnEachRest = !config.beam_rests && note.isRest();\n const breaksOnFirstOrLastRest = config.beam_rests && config.beam_middle_only && note.isRest() && isFirstOrLast;\n let breakOnStemChange = false;\n if (config.maintain_stem_directions && prevNote && !note.isRest() && !prevNote.isRest()) {\n const prevDirection = prevNote.getStemDirection();\n const currentDirection = note.getStemDirection();\n breakOnStemChange = currentDirection !== prevDirection;\n }\n const isUnbeamableDuration = parseInt(note.getDuration(), 10) < 8;\n // Determine if the group should be broken at this note\n const shouldBreak = breaksOnEachRest || breaksOnFirstOrLastRest || breakOnStemChange || isUnbeamableDuration;\n if (shouldBreak) {\n // Add current group\n if (tempGroup.length > 0) {\n sanitizedGroups.push(tempGroup);\n }\n // Start a new group. Include the current note if the group\n // was broken up by stem direction, as that note needs to start\n // the next group of notes\n tempGroup = breakOnStemChange ? [note] : [];\n }\n else {\n // Add note to group\n tempGroup.push(note);\n }\n });\n // If there is a remaining group, add it as well\n if (tempGroup.length > 0) {\n sanitizedGroups.push(tempGroup);\n }\n });\n noteGroups = sanitizedGroups;\n }\n function formatStems() {\n noteGroups.forEach((group) => {\n let stemDirection;\n if (config.maintain_stem_directions) {\n const note = findFirstNote(group);\n stemDirection = note ? note.getStemDirection() : Stem.UP;\n }\n else {\n if (config.stem_direction) {\n stemDirection = config.stem_direction;\n }\n else {\n stemDirection = calculateStemDirection(group);\n }\n }\n applyStemDirection(group, stemDirection);\n });\n }\n function findFirstNote(group) {\n for (let i = 0; i < group.length; i++) {\n const note = group[i];\n if (!note.isRest()) {\n return note;\n }\n }\n return false;\n }\n function applyStemDirection(group, direction) {\n group.forEach((note) => {\n note.setStemDirection(direction);\n });\n }\n // Get all of the tuplets in all of the note groups\n function getTuplets() {\n const uniqueTuplets = [];\n // Go through all of the note groups and inspect for tuplets\n noteGroups.forEach((group) => {\n let tuplet;\n group.forEach((note) => {\n const noteTuplet = note.getTuplet();\n if (noteTuplet && tuplet !== noteTuplet) {\n tuplet = noteTuplet;\n uniqueTuplets.push(tuplet);\n }\n });\n });\n return uniqueTuplets;\n }\n // Using closures to store the variables throughout the various functions\n // IMO Keeps it this process lot cleaner - but not super consistent with\n // the rest of the API's style - Silverwolf90 (Cyril)\n createGroups();\n sanitizeGroups();\n formatStems();\n // Get the notes to be beamed\n const beamedNoteGroups = getBeamGroups();\n // Get the tuplets in order to format them accurately\n const allTuplets = getTuplets();\n // Create a Vex.Flow.Beam from each group of notes to be beamed\n const beams = [];\n beamedNoteGroups.forEach((group) => {\n const beam = new Beam(group);\n if (config.show_stemlets) {\n beam.render_options.show_stemlets = true;\n }\n if (config.secondary_breaks) {\n beam.render_options.secondary_break_ticks = Tables.durationToTicks(config.secondary_breaks);\n }\n if (config.flat_beams === true) {\n beam.render_options.flat_beams = true;\n beam.render_options.flat_beam_offset = config.flat_beam_offset;\n }\n beams.push(beam);\n });\n // Reformat tuplets\n allTuplets.forEach((tuplet) => {\n // Set the tuplet location based on the stem direction\n const direction = tuplet.notes[0].stem_direction === Stem.DOWN ? TupletLocation.BOTTOM : TupletLocation.TOP;\n tuplet.setTupletLocation(direction);\n // If any of the notes in the tuplet are not beamed, draw a bracket.\n let bracketed = false;\n for (let i = 0; i < tuplet.notes.length; i++) {\n const note = tuplet.notes[i];\n if (!note.hasBeam()) {\n bracketed = true;\n break;\n }\n }\n tuplet.setBracketed(bracketed);\n });\n return beams;\n }\n /** Get the notes in this beam. */\n getNotes() {\n return this.notes;\n }\n /** Get the max number of beams in the set of notes. */\n getBeamCount() {\n const beamCounts = this.notes.map((note) => note.getGlyph().beam_count);\n const maxBeamCount = beamCounts.reduce((max, beamCount) => (beamCount > max ? beamCount : max));\n return maxBeamCount;\n }\n /** Set which note `indices` to break the secondary beam at. */\n breakSecondaryAt(indices) {\n this.break_on_indices = indices;\n return this;\n }\n /** Return the y coordinate for linear function. */\n getSlopeY(x, first_x_px, first_y_px, slope) {\n return first_y_px + (x - first_x_px) * slope;\n }\n /** Calculate the best possible slope for the provided notes. */\n calculateSlope() {\n const { notes, stem_direction: stemDirection, render_options: { max_slope, min_slope, slope_iterations, slope_cost }, } = this;\n const firstNote = notes[0];\n const initialSlope = getStemSlope(firstNote, notes[notes.length - 1]);\n const increment = (max_slope - min_slope) / slope_iterations;\n let minCost = Number.MAX_VALUE;\n let bestSlope = 0;\n let yShift = 0;\n // iterate through slope values to find best weighted fit\n for (let slope = min_slope; slope <= max_slope; slope += increment) {\n let totalStemExtension = 0;\n let yShiftTemp = 0;\n // iterate through notes, calculating y shift and stem extension\n for (let i = 1; i < notes.length; ++i) {\n const note = notes[i];\n if (note.hasStem() || note.isRest()) {\n const adjustedStemTipY = this.getSlopeY(note.getStemX(), firstNote.getStemX(), firstNote.getStemExtents().topY, slope) + yShiftTemp;\n const stemTipY = note.getStemExtents().topY;\n // beam needs to be shifted up to accommodate note\n if (stemTipY * stemDirection < adjustedStemTipY * stemDirection) {\n const diff = Math.abs(stemTipY - adjustedStemTipY);\n yShiftTemp += diff * -stemDirection;\n totalStemExtension += diff * i;\n }\n else {\n // beam overshoots note, account for the difference\n totalStemExtension += (stemTipY - adjustedStemTipY) * stemDirection;\n }\n }\n }\n // most engraving books suggest aiming for a slope about half the angle of the\n // difference between the first and last notes' stem length;\n const idealSlope = initialSlope / 2;\n const distanceFromIdeal = Math.abs(idealSlope - slope);\n // This tries to align most beams to something closer to the idealSlope, but\n // doesn't go crazy. To disable, set this.render_options.slope_cost = 0\n const cost = slope_cost * distanceFromIdeal + Math.abs(totalStemExtension);\n // update state when a more ideal slope is found\n if (cost < minCost) {\n minCost = cost;\n bestSlope = slope;\n yShift = yShiftTemp;\n }\n }\n this.slope = bestSlope;\n this.y_shift = yShift;\n }\n /** Calculate a slope and y-shift for flat beams. */\n calculateFlatSlope() {\n const { notes, stem_direction, render_options: { beam_width, min_flat_beam_offset, flat_beam_offset }, } = this;\n // If a flat beam offset has not yet been supplied or calculated,\n // generate one based on the notes in this particular note group\n let total = 0;\n let extremeY = 0; // Store the highest or lowest note here\n let extremeBeamCount = 0; // The beam count of the extreme note\n let currentExtreme = 0;\n for (let i = 0; i < notes.length; i++) {\n // Total up all of the offsets so we can average them out later\n const note = notes[i];\n const stemTipY = note.getStemExtents().topY;\n total += stemTipY;\n // Store the highest (stems-up) or lowest (stems-down) note so the\n // offset can be adjusted in case the average isn't enough\n if (stem_direction === Stem.DOWN && currentExtreme < stemTipY) {\n currentExtreme = stemTipY;\n extremeY = Math.max(...note.getYs());\n extremeBeamCount = note.getBeamCount();\n }\n else if (stem_direction === Stem.UP && (currentExtreme === 0 || currentExtreme > stemTipY)) {\n currentExtreme = stemTipY;\n extremeY = Math.min(...note.getYs());\n extremeBeamCount = note.getBeamCount();\n }\n }\n // Average the offsets to try and come up with a reasonable one that\n // works for all of the notes in the beam group.\n let offset = total / notes.length;\n // In case the average isn't long enough, add or subtract some more\n // based on the highest or lowest note (again, based on the stem\n // direction). This also takes into account the added height due to\n // the width of the beams.\n const beamWidth = beam_width * 1.5;\n const extremeTest = min_flat_beam_offset + extremeBeamCount * beamWidth;\n const newOffset = extremeY + extremeTest * -stem_direction;\n if (stem_direction === Stem.DOWN && offset < newOffset) {\n offset = extremeY + extremeTest;\n }\n else if (stem_direction === Stem.UP && offset > newOffset) {\n offset = extremeY - extremeTest;\n }\n if (!flat_beam_offset) {\n // Set the offset for the group based on the calculations above.\n this.render_options.flat_beam_offset = offset;\n }\n else if (stem_direction === Stem.DOWN && offset > flat_beam_offset) {\n this.render_options.flat_beam_offset = offset;\n }\n else if (stem_direction === Stem.UP && offset < flat_beam_offset) {\n this.render_options.flat_beam_offset = offset;\n }\n // for flat beams, the slope and y_shift are simply 0\n this.slope = 0;\n this.y_shift = 0;\n }\n /** Return the Beam y offset. */\n getBeamYToDraw() {\n const firstNote = this.notes[0];\n const firstStemTipY = firstNote.getStemExtents().topY;\n let beamY = firstStemTipY;\n // For flat beams, set the first and last Y to the offset, rather than\n // using the note's stem extents.\n if (this.render_options.flat_beams && this.render_options.flat_beam_offset) {\n beamY = this.render_options.flat_beam_offset;\n }\n return beamY;\n }\n /**\n * Create new stems for the notes in the beam, so that each stem\n * extends into the beams.\n */\n applyStemExtensions() {\n const { notes, slope, y_shift, stem_direction, beam_count, render_options: { show_stemlets, stemlet_extension, beam_width }, } = this;\n const firstNote = notes[0];\n const firstStemTipY = this.getBeamYToDraw();\n const firstStemX = firstNote.getStemX();\n for (let i = 0; i < notes.length; ++i) {\n const note = notes[i];\n const stem = note.getStem();\n if (stem) {\n const stemX = note.getStemX();\n const { topY: stemTipY } = note.getStemExtents();\n const beamedStemTipY = this.getSlopeY(stemX, firstStemX, firstStemTipY, slope) + y_shift;\n const preBeamExtension = stem.getExtension();\n const beamExtension = stem_direction === Stem.UP ? stemTipY - beamedStemTipY : beamedStemTipY - stemTipY;\n stem.setExtension(preBeamExtension + beamExtension);\n stem.adjustHeightForBeam();\n if (note.isRest() && show_stemlets) {\n const beamWidth = beam_width;\n const totalBeamWidth = (beam_count - 1) * beamWidth * 1.5 + beamWidth;\n stem.setVisibility(true).setStemlet(true, totalBeamWidth + stemlet_extension);\n }\n }\n }\n }\n /** Return upper level beam direction. */\n lookupBeamDirection(duration, prev_tick, tick, next_tick) {\n if (duration === '4') {\n return BEAM_LEFT;\n }\n const lookup_duration = `${Tables.durationToNumber(duration) / 2}`;\n const prev_note_gets_beam = prev_tick < Tables.durationToTicks(lookup_duration);\n const next_note_gets_beam = next_tick < Tables.durationToTicks(lookup_duration);\n const note_gets_beam = tick < Tables.durationToTicks(lookup_duration);\n if (prev_note_gets_beam && next_note_gets_beam && note_gets_beam) {\n return BEAM_BOTH;\n }\n else if (prev_note_gets_beam && !next_note_gets_beam && note_gets_beam) {\n return BEAM_LEFT;\n }\n else if (!prev_note_gets_beam && next_note_gets_beam && note_gets_beam) {\n return BEAM_RIGHT;\n }\n return this.lookupBeamDirection(lookup_duration, prev_tick, tick, next_tick);\n }\n /** Get the x coordinates for the beam lines of specific `duration`. */\n getBeamLines(duration) {\n const tick_of_duration = Tables.durationToTicks(duration);\n let beam_started = false;\n const beam_lines = [];\n let current_beam = undefined;\n const partial_beam_length = this.render_options.partial_beam_length;\n let previous_should_break = false;\n let tick_tally = 0;\n for (let i = 0; i < this.notes.length; ++i) {\n const note = this.notes[i];\n // See if we need to break secondary beams on this note.\n const ticks = note.getTicks().value();\n tick_tally += ticks;\n let should_break = false;\n // 8th note beams are always drawn.\n if (parseInt(duration, 10) >= 8) {\n // First, check to see if any indices were set up through breakSecondaryAt()\n should_break = this.break_on_indices.indexOf(i) !== -1;\n // If the secondary breaks were auto-configured in the render options,\n // handle that as well.\n if (this.render_options.secondary_break_ticks && tick_tally >= this.render_options.secondary_break_ticks) {\n tick_tally = 0;\n should_break = true;\n }\n }\n const note_gets_beam = note.getIntrinsicTicks() < tick_of_duration;\n const stem_x = note.getStemX() - Stem.WIDTH / 2;\n // Check to see if the next note in the group will get a beam at this\n // level. This will help to inform the partial beam logic below.\n const prev_note = this.notes[i - 1];\n const next_note = this.notes[i + 1];\n const next_note_gets_beam = next_note && next_note.getIntrinsicTicks() < tick_of_duration;\n const prev_note_gets_beam = prev_note && prev_note.getIntrinsicTicks() < tick_of_duration;\n const beam_alone = prev_note && next_note && note_gets_beam && !prev_note_gets_beam && !next_note_gets_beam;\n // const beam_alone = note_gets_beam && !prev_note_gets_beam && !next_note_gets_beam;\n if (note_gets_beam) {\n // This note gets a beam at the current level\n if (beam_started) {\n // We're currently in the middle of a beam. Just continue it on to\n // the stem X of the current note.\n current_beam = beam_lines[beam_lines.length - 1];\n current_beam.end = stem_x;\n // If a secondary beam break is set up, end the beam right now.\n if (should_break) {\n beam_started = false;\n if (next_note && !next_note_gets_beam && current_beam.end === undefined) {\n // This note gets a beam,.but the next one does not. This means\n // we need a partial pointing right.\n current_beam.end = current_beam.start - partial_beam_length;\n }\n }\n }\n else {\n // No beam started yet. Start a new one.\n current_beam = { start: stem_x, end: undefined };\n beam_started = true;\n if (beam_alone) {\n // previous and next beam exists and does not get a beam but current gets it.\n const prev_tick = prev_note.getIntrinsicTicks();\n const next_tick = next_note.getIntrinsicTicks();\n const tick = note.getIntrinsicTicks();\n const beam_direction = this.lookupBeamDirection(duration, prev_tick, tick, next_tick);\n if ([BEAM_LEFT, BEAM_BOTH].includes(beam_direction)) {\n current_beam.end = current_beam.start - partial_beam_length;\n }\n else {\n current_beam.end = current_beam.start + partial_beam_length;\n }\n }\n else if (!next_note_gets_beam) {\n // The next note doesn't get a beam. Draw a partial.\n if ((previous_should_break || i === 0) && next_note) {\n // This is the first note (but not the last one), or it is\n // following a secondary break. Draw a partial to the right.\n current_beam.end = current_beam.start + partial_beam_length;\n }\n else {\n // By default, draw a partial to the left.\n current_beam.end = current_beam.start - partial_beam_length;\n }\n }\n else if (should_break) {\n // This note should have a secondary break after it. Even though\n // we just started a beam, it needs to end immediately.\n current_beam.end = current_beam.start - partial_beam_length;\n beam_started = false;\n }\n beam_lines.push(current_beam);\n }\n }\n else {\n // The current note does not get a beam.\n beam_started = false;\n }\n // Store the secondary break flag to inform the partial beam logic in\n // the next iteration of the loop.\n previous_should_break = should_break;\n }\n // Add a partial beam pointing left if this is the last note in the group\n const last_beam = beam_lines[beam_lines.length - 1];\n if (last_beam && last_beam.end === undefined) {\n last_beam.end = last_beam.start - partial_beam_length;\n }\n return beam_lines;\n }\n /** Render the stems for each note. */\n drawStems(ctx) {\n this.notes.forEach((note) => {\n const stem = note.getStem();\n if (stem) {\n stem.setContext(ctx).draw();\n }\n }, this);\n }\n // Render the beam lines\n drawBeamLines(ctx) {\n const valid_beam_durations = ['4', '8', '16', '32', '64'];\n const firstNote = this.notes[0];\n let beamY = this.getBeamYToDraw();\n const firstStemX = firstNote.getStemX();\n const beamThickness = this.render_options.beam_width * this.stem_direction;\n // Draw the beams.\n for (let i = 0; i < valid_beam_durations.length; ++i) {\n const duration = valid_beam_durations[i];\n const beamLines = this.getBeamLines(duration);\n for (let j = 0; j < beamLines.length; ++j) {\n const beam_line = beamLines[j];\n const startBeamX = beam_line.start;\n const startBeamY = this.getSlopeY(startBeamX, firstStemX, beamY, this.slope);\n const lastBeamX = beam_line.end;\n if (lastBeamX) {\n const lastBeamY = this.getSlopeY(lastBeamX, firstStemX, beamY, this.slope);\n ctx.beginPath();\n ctx.moveTo(startBeamX, startBeamY);\n ctx.lineTo(startBeamX, startBeamY + beamThickness);\n ctx.lineTo(lastBeamX + 1, lastBeamY + beamThickness);\n ctx.lineTo(lastBeamX + 1, lastBeamY);\n ctx.closePath();\n ctx.fill();\n }\n else {\n throw new RuntimeError('NoLastBeamX', 'lastBeamX undefined.');\n }\n }\n beamY += beamThickness * 1.5;\n }\n }\n /** Pre-format the beam. */\n preFormat() {\n return this;\n }\n /**\n * Post-format the beam. This can only be called after\n * the notes in the beam have both `x` and `y` values. ie: they've\n * been formatted and have staves.\n */\n postFormat() {\n if (this.postFormatted)\n return;\n // Calculate a smart slope if we're not forcing the beams to be flat.\n if (isTabNote(this.notes[0]) || this.render_options.flat_beams) {\n this.calculateFlatSlope();\n }\n else {\n this.calculateSlope();\n }\n this.applyStemExtensions();\n this.postFormatted = true;\n }\n /** Render the beam to the canvas context */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n if (this.unbeamable)\n return;\n if (!this.postFormatted) {\n this.postFormat();\n }\n this.drawStems(ctx);\n this.applyStyle();\n this.drawBeamLines(ctx);\n this.restoreStyle();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2014\n// MIT License\nimport { Clef } from './clef';\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Category } from './typeguard';\n/** ClefNote implements clef annotations in measures. */\nexport class ClefNote extends Note {\n constructor(type, size, annotation) {\n super({ duration: 'b' });\n this.type = type;\n this.clef_obj = new Clef(type, size, annotation);\n this.clef = this.clef_obj.clef;\n this.glyph = new Glyph(this.clef.code, this.clef.point);\n this.setWidth(this.glyph.getMetrics().width);\n // Note properties\n this.ignore_ticks = true;\n }\n static get CATEGORY() {\n return Category.ClefNote;\n }\n /** Set clef type, size and annotation. */\n setType(type, size, annotation) {\n this.type = type;\n this.clef_obj = new Clef(type, size, annotation);\n this.clef = this.clef_obj.clef;\n this.glyph = new Glyph(this.clef.code, this.clef.point);\n this.setWidth(this.glyph.getMetrics().width);\n return this;\n }\n /** Get associated clef. */\n getClef() {\n return this.clef;\n }\n /** Set associated context. */\n setContext(context) {\n super.setContext(context);\n this.glyph.setContext(this.getContext());\n return this;\n }\n /** Get bounding box. */\n getBoundingBox() {\n return super.getBoundingBox();\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n /** Render clef note. */\n draw() {\n var _a;\n const stave = this.checkStave();\n if (!this.glyph.getContext()) {\n this.glyph.setContext(this.getContext());\n }\n this.setRendered();\n const abs_x = this.getAbsoluteX();\n this.glyph.setStave(stave);\n this.glyph.setYShift(stave.getYForLine((_a = this.clef.line) !== null && _a !== void 0 ? _a : 0) - stave.getYForGlyphs());\n this.glyph.renderToStave(abs_x);\n // If the Vex.Flow.Clef has an annotation, such as 8va, draw it.\n if (this.clef_obj.annotation !== undefined) {\n const attachment = new Glyph(this.clef_obj.annotation.code, this.clef_obj.annotation.point);\n if (!attachment.getContext()) {\n attachment.setContext(this.getContext());\n }\n attachment.setStave(stave);\n attachment.setYShift(stave.getYForLine(this.clef_obj.annotation.line) - stave.getYForGlyphs());\n attachment.setXShift(this.clef_obj.annotation.x_shift);\n attachment.renderToStave(abs_x);\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// This file implements the `Crescendo` object which draws crescendos and\n// decrescendo dynamics markings. A `Crescendo` is initialized with a\n// duration and formatted as part of a `Voice` like any other `Note`\n// type in VexFlow. This object would most likely be formatted in a Voice\n// with `TextNotes` - which are used to represent other dynamics markings.\nimport { Note } from './note';\nimport { TickContext } from './tickcontext';\nimport { Category } from './typeguard';\nimport { log } from './util';\n// To enable logging for this class. Set `Vex.Flow.Crescendo.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (Crescendo.DEBUG)\n log('Vex.Flow.Crescendo', args);\n}\n// Private helper to draw the hairpin\nfunction renderHairpin(ctx, params) {\n const begin_x = params.begin_x;\n const end_x = params.end_x;\n const y = params.y;\n const half_height = params.height / 2;\n ctx.beginPath();\n if (params.reverse) {\n ctx.moveTo(begin_x, y - half_height);\n ctx.lineTo(end_x, y);\n ctx.lineTo(begin_x, y + half_height);\n }\n else {\n ctx.moveTo(end_x, y - half_height);\n ctx.lineTo(begin_x, y);\n ctx.lineTo(end_x, y + half_height);\n }\n ctx.stroke();\n ctx.closePath();\n}\nexport class Crescendo extends Note {\n // Initialize the crescendo's properties\n constructor(noteStruct) {\n super(noteStruct);\n this.options = {\n // Extensions to the length of the crescendo on either side\n extend_left: 0,\n extend_right: 0,\n // Vertical shift\n y_shift: 0,\n };\n // Whether the object is a decrescendo\n this.decrescendo = false;\n // The staff line to be placed on\n this.line = noteStruct.line || 0;\n // The height at the open end of the cresc/decresc\n this.height = 15;\n }\n /** Crescendo category string. */\n static get CATEGORY() {\n return Category.Crescendo;\n }\n // Set the line to center the element on\n setLine(line) {\n this.line = line;\n return this;\n }\n // Set the full height at the open end\n setHeight(height) {\n this.height = height;\n return this;\n }\n // Set whether the sign should be a descresendo by passing a bool\n // to `decresc`\n setDecrescendo(decresc) {\n this.decrescendo = decresc;\n return this;\n }\n // Preformat the note\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n // Render the Crescendo object onto the canvas\n draw() {\n const ctx = this.checkContext();\n const stave = this.checkStave();\n this.setRendered();\n const tick_context = this.getTickContext();\n const next_context = TickContext.getNextContext(tick_context);\n const begin_x = this.getAbsoluteX();\n const end_x = next_context ? next_context.getX() : stave.getX() + stave.getWidth();\n const y = stave.getYForLine(this.line + -3) + 1;\n L('Drawing ', this.decrescendo ? 'decrescendo ' : 'crescendo ', this.height, 'x', begin_x - end_x);\n renderHairpin(ctx, {\n begin_x: begin_x - this.options.extend_left,\n end_x: end_x + this.options.extend_right,\n y: y + this.options.y_shift,\n height: this.height,\n reverse: this.decrescendo,\n });\n }\n}\nCrescendo.DEBUG = false;\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n//\n// This class implements curves (for slurs)\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport var CurvePosition;\n(function (CurvePosition) {\n CurvePosition[CurvePosition[\"NEAR_HEAD\"] = 1] = \"NEAR_HEAD\";\n CurvePosition[CurvePosition[\"NEAR_TOP\"] = 2] = \"NEAR_TOP\";\n})(CurvePosition || (CurvePosition = {}));\nexport class Curve extends Element {\n // from: Start note\n // to: End note\n // options:\n // cps: List of control points\n // x_shift: pixels to shift\n // y_shift: pixels to shift\n constructor(from, to, options) {\n super();\n this.render_options = Object.assign({ thickness: 2, x_shift: 0, y_shift: 10, position: CurvePosition.NEAR_HEAD, position_end: CurvePosition.NEAR_HEAD, invert: false, cps: [\n { x: 0, y: 10 },\n { x: 0, y: 10 },\n ] }, options);\n this.from = from;\n this.to = to;\n }\n static get CATEGORY() {\n return Category.Curve;\n }\n static get Position() {\n return CurvePosition;\n }\n static get PositionString() {\n return {\n nearHead: CurvePosition.NEAR_HEAD,\n nearTop: CurvePosition.NEAR_TOP,\n };\n }\n setNotes(from, to) {\n if (!from && !to) {\n throw new RuntimeError('BadArguments', 'Curve needs to have either `from` or `to` set.');\n }\n this.from = from;\n this.to = to;\n return this;\n }\n /**\n * @return {boolean} Returns true if this is a partial bar.\n */\n isPartial() {\n return !this.from || !this.to;\n }\n renderCurve(params) {\n const ctx = this.checkContext();\n const x_shift = this.render_options.x_shift;\n const y_shift = this.render_options.y_shift * params.direction;\n const first_x = params.first_x + x_shift;\n const first_y = params.first_y + y_shift;\n const last_x = params.last_x - x_shift;\n const last_y = params.last_y + y_shift;\n const thickness = this.render_options.thickness;\n const cps = this.render_options.cps;\n const { x: cp0x, y: cp0y } = cps[0];\n const { x: cp1x, y: cp1y } = cps[1];\n const cp_spacing = (last_x - first_x) / (cps.length + 2);\n ctx.beginPath();\n ctx.moveTo(first_x, first_y);\n ctx.bezierCurveTo(first_x + cp_spacing + cp0x, first_y + cp0y * params.direction, last_x - cp_spacing + cp1x, last_y + cp1y * params.direction, last_x, last_y);\n ctx.bezierCurveTo(last_x - cp_spacing + cp1x, last_y + (cp1y + thickness) * params.direction, first_x + cp_spacing + cp0x, first_y + (cp0y + thickness) * params.direction, first_x, first_y);\n ctx.stroke();\n ctx.closePath();\n ctx.fill();\n }\n draw() {\n this.checkContext();\n this.setRendered();\n const first_note = this.from;\n const last_note = this.to;\n let first_x;\n let last_x;\n let first_y;\n let last_y;\n let stem_direction = 0;\n let metric = 'baseY';\n let end_metric = 'baseY';\n function getPosition(position) {\n return typeof position === 'string' ? Curve.PositionString[position] : position;\n }\n const position = getPosition(this.render_options.position);\n const position_end = getPosition(this.render_options.position_end);\n if (position === CurvePosition.NEAR_TOP) {\n metric = 'topY';\n end_metric = 'topY';\n }\n if (position_end === CurvePosition.NEAR_HEAD) {\n end_metric = 'baseY';\n }\n else if (position_end === CurvePosition.NEAR_TOP) {\n end_metric = 'topY';\n }\n if (first_note) {\n first_x = first_note.getTieRightX();\n stem_direction = first_note.getStemDirection();\n first_y = first_note.getStemExtents()[metric];\n }\n else {\n const stave = last_note.checkStave();\n first_x = stave.getTieStartX();\n first_y = last_note.getStemExtents()[metric];\n }\n if (last_note) {\n last_x = last_note.getTieLeftX();\n stem_direction = last_note.getStemDirection();\n last_y = last_note.getStemExtents()[end_metric];\n }\n else {\n const stave = first_note.checkStave();\n last_x = stave.getTieEndX();\n last_y = first_note.getStemExtents()[end_metric];\n }\n this.renderCurve({\n first_x,\n last_x,\n first_y,\n last_y,\n direction: stem_direction * (this.render_options.invert === true ? -1 : 1),\n });\n return true;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// A generic text parsing class for VexFlow.\nimport { log, RuntimeError } from './util';\n// To enable logging for this class. Set `Vex.Flow.Parser.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (Parser.DEBUG)\n log('Vex.Flow.Parser', args);\n}\nconst NO_ERROR_POS = -1;\n// Converts parser results into an easy to reference list that can be\n// used in triggers. This function returns:\n// - nested array in which the leaf elements are string or null\n// - string (including empty strings)\n// - null\nfunction flattenMatches(r) {\n if ('matchedString' in r)\n return r.matchedString; // string\n if ('results' in r)\n return flattenMatches(r.results);\n const results = r;\n if (results.length === 1)\n return flattenMatches(results[0]);\n if (results.length === 0)\n return null;\n return results.map(flattenMatches); // nested array\n}\n// This is the base parser class. Given an arbitrary context-free grammar, it\n// can parse any line and execute code when specific rules are met (e.g.,\n// when a string is terminated.)\nexport class Parser {\n // For an example of a simple grammar, take a look at tests/parser_tests.ts or\n // the EasyScore grammar in easyscore.ts.\n constructor(grammar) {\n this.grammar = grammar;\n this.line = '';\n this.pos = 0;\n this.errorPos = NO_ERROR_POS;\n }\n // Parse `line` using current grammar. Returns `{success: true}` if the\n // line parsed correctly, otherwise returns `{success: false, errorPos: N}`\n // where `errorPos` is the location of the error in the string.\n parse(line) {\n this.line = line;\n this.pos = 0;\n this.errorPos = NO_ERROR_POS;\n const result = this.expect(this.grammar.begin());\n result.errorPos = this.errorPos;\n return result;\n }\n matchFail(returnPos) {\n if (this.errorPos === NO_ERROR_POS)\n this.errorPos = this.pos;\n this.pos = returnPos;\n }\n matchSuccess() {\n this.errorPos = NO_ERROR_POS;\n }\n // Look for `token` in this.line[this.pos], and return success\n // if one is found. `token` is specified as a regular expression.\n matchToken(token, noSpace = false) {\n const regexp = noSpace ? new RegExp('^((' + token + '))') : new RegExp('^((' + token + ')\\\\s*)');\n const workingLine = this.line.slice(this.pos);\n const result = workingLine.match(regexp);\n if (result !== null) {\n return {\n success: true,\n matchedString: result[2],\n incrementPos: result[1].length,\n pos: this.pos,\n };\n }\n else {\n return { success: false, pos: this.pos };\n }\n }\n // Execute rule to match a sequence of tokens (or rules). If `maybe` is\n // set, then return success even if the token is not found, but reset\n // the position before exiting.\n // TODO: expectOne(...) is never called with the `maybe` parameter.\n expectOne(rule, maybe = false) {\n const results = [];\n const pos = this.pos;\n let allMatches = true;\n let oneMatch = false;\n maybe = maybe === true || rule.maybe === true;\n // Execute all sub rules in sequence.\n if (rule.expect) {\n for (const next of rule.expect) {\n const localPos = this.pos;\n const result = this.expect(next);\n // If `rule.or` is set, then return success if any one\n // of the subrules match, else all subrules must match.\n if (result.success) {\n results.push(result);\n oneMatch = true;\n if (rule.or)\n break;\n }\n else {\n allMatches = false;\n if (!rule.or) {\n this.pos = localPos;\n break;\n }\n }\n }\n }\n const gotOne = (rule.or && oneMatch) || allMatches;\n const success = gotOne || maybe === true;\n const numMatches = gotOne ? 1 : 0;\n if (maybe && !gotOne)\n this.pos = pos;\n if (success) {\n this.matchSuccess();\n }\n else {\n this.matchFail(pos);\n }\n return { success, results, numMatches };\n }\n // Try to match multiple (one or more) instances of the rule. If `maybe` is set,\n // then a failed match is also a success (but the position is reset).\n expectOneOrMore(rule, maybe = false) {\n const results = [];\n const pos = this.pos;\n let numMatches = 0;\n let more = true;\n do {\n const result = this.expectOne(rule);\n if (result.success && result.results) {\n numMatches++;\n results.push(result.results);\n }\n else {\n more = false;\n }\n } while (more);\n const success = numMatches > 0 || maybe === true;\n if (maybe && !(numMatches > 0))\n this.pos = pos;\n if (success) {\n this.matchSuccess();\n }\n else {\n this.matchFail(pos);\n }\n return { success, results, numMatches };\n }\n // Match zero or more instances of `rule`. Offloads to `expectOneOrMore`.\n expectZeroOrMore(rule) {\n return this.expectOneOrMore(rule, true);\n }\n // Execute the rule produced by the provided `rules` function. This\n // offloads to one of the above matchers and consolidates the results. It is also\n // responsible for executing any code triggered by the rule (in `rule.run`.)\n expect(ruleFunc) {\n L('Evaluating rule function:', ruleFunc);\n if (!ruleFunc) {\n throw new RuntimeError('Invalid rule function');\n }\n let result;\n // Get rule from Grammar class.\n // expect(...) handles both lexing & parsing:\n // - lexer rules produce tokens.\n // - parser rules produce expressions which may trigger code via the\n // { run: () => ... } trigger functions in easyscore.ts.\n // These functions build the VexFlow objects that are displayed on screen.\n const rule = ruleFunc.bind(this.grammar)();\n if (rule.token) {\n // A lexer rule has a `token` property.\n // Base case: parse the regex and throw an error if the\n // line doesn't match.\n result = this.matchToken(rule.token, rule.noSpace === true);\n if (result.success) {\n // Token match! Update position and throw away parsed portion\n // of string.\n this.pos += result.incrementPos;\n }\n }\n else if (rule.expect) {\n // A parser rule has an `expect` property.\n if (rule.oneOrMore) {\n result = this.expectOneOrMore(rule);\n }\n else if (rule.zeroOrMore) {\n result = this.expectZeroOrMore(rule);\n }\n else {\n result = this.expectOne(rule);\n }\n }\n else {\n L(rule);\n throw new RuntimeError('Bad grammar! No `token` or `expect` property ' + rule);\n }\n // If there's a trigger attached to this rule, then run it.\n // Make the matches accessible through `state.matches` in the\n // `run: (state) => ...` trigger.\n const matches = [];\n result.matches = matches;\n if (result.results) {\n result.results.forEach((r) => matches.push(flattenMatches(r)));\n }\n if (rule.run && result.success) {\n rule.run({ matches });\n }\n return result;\n }\n}\nParser.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Articulation } from './articulation';\nimport { Dot } from './dot';\nimport { FretHandFinger } from './frethandfinger';\nimport { Music } from './music';\nimport { Parser } from './parser';\nimport { Stem } from './stem';\nimport { defined, log, RuntimeError } from './util';\n// To enable logging for this class. Set `Vex.Flow.EasyScore.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (EasyScore.DEBUG)\n log('Vex.Flow.EasyScore', args);\n}\nexport class EasyScoreGrammar {\n constructor(builder) {\n this.builder = builder;\n }\n begin() {\n return this.LINE;\n }\n LINE() {\n return {\n expect: [this.PIECE, this.PIECES, this.EOL],\n };\n }\n PIECE() {\n return {\n expect: [this.CHORDORNOTE, this.PARAMS],\n run: () => this.builder.commitPiece(),\n };\n }\n PIECES() {\n return {\n expect: [this.COMMA, this.PIECE],\n zeroOrMore: true,\n };\n }\n PARAMS() {\n return {\n expect: [this.DURATION, this.TYPE, this.DOTS, this.OPTS],\n };\n }\n CHORDORNOTE() {\n return {\n expect: [this.CHORD, this.SINGLENOTE],\n or: true,\n };\n }\n CHORD() {\n return {\n expect: [this.LPAREN, this.NOTES, this.RPAREN],\n // eslint-disable-next-line\n run: (state) => this.builder.addChord(state.matches[1]),\n };\n }\n NOTES() {\n return {\n expect: [this.NOTE],\n oneOrMore: true,\n };\n }\n NOTE() {\n return {\n expect: [this.NOTENAME, this.ACCIDENTAL, this.OCTAVE],\n };\n }\n SINGLENOTE() {\n return {\n expect: [this.NOTENAME, this.ACCIDENTAL, this.OCTAVE],\n run: (state) => {\n // eslint-disable-next-line\n const s = state;\n this.builder.addSingleNote(s.matches[0], s.matches[1], s.matches[2]);\n },\n };\n }\n ACCIDENTAL() {\n return {\n expect: [this.MICROTONES, this.ACCIDENTALS],\n maybe: true,\n or: true,\n };\n }\n DOTS() {\n return {\n expect: [this.DOT],\n zeroOrMore: true,\n // eslint-disable-next-line\n run: (state) => this.builder.setNoteDots(state.matches),\n };\n }\n TYPE() {\n return {\n expect: [this.SLASH, this.MAYBESLASH, this.TYPES],\n maybe: true,\n // eslint-disable-next-line\n run: (state) => this.builder.setNoteType(state.matches[2]),\n };\n }\n DURATION() {\n return {\n expect: [this.SLASH, this.DURATIONS],\n maybe: true,\n // eslint-disable-next-line\n run: (state) => this.builder.setNoteDuration(state.matches[1]),\n };\n }\n OPTS() {\n return {\n expect: [this.LBRACKET, this.KEYVAL, this.KEYVALS, this.RBRACKET],\n maybe: true,\n };\n }\n KEYVALS() {\n return {\n expect: [this.COMMA, this.KEYVAL],\n zeroOrMore: true,\n };\n }\n KEYVAL() {\n const unquote = (str) => str.slice(1, -1);\n return {\n expect: [this.KEY, this.EQUALS, this.VAL],\n // eslint-disable-next-line\n run: (state) => this.builder.addNoteOption(state.matches[0], unquote(state.matches[2])),\n };\n }\n VAL() {\n return {\n expect: [this.SVAL, this.DVAL],\n or: true,\n };\n }\n KEY() {\n return { token: '[a-zA-Z][a-zA-Z0-9]*' };\n }\n DVAL() {\n return { token: '[\"][^\"]*[\"]' };\n }\n SVAL() {\n return { token: \"['][^']*[']\" };\n }\n NOTENAME() {\n return { token: '[a-gA-G]' };\n }\n OCTAVE() {\n return { token: '[0-9]+' };\n }\n ACCIDENTALS() {\n return { token: 'bb|b|##|#|n' };\n }\n MICROTONES() {\n return { token: 'bbs|bss|bs|db|d|\\\\+\\\\+-|\\\\+-|\\\\+\\\\+|\\\\+|k|o' };\n }\n DURATIONS() {\n return { token: '[0-9whq]+' };\n }\n TYPES() {\n return { token: '[rRsSmMhHgG]' };\n }\n LPAREN() {\n return { token: '[(]' };\n }\n RPAREN() {\n return { token: '[)]' };\n }\n COMMA() {\n return { token: '[,]' };\n }\n DOT() {\n return { token: '[.]' };\n }\n SLASH() {\n return { token: '[/]' };\n }\n MAYBESLASH() {\n return { token: '[/]?' };\n }\n EQUALS() {\n return { token: '[=]' };\n }\n LBRACKET() {\n return { token: '\\\\[' };\n }\n RBRACKET() {\n return { token: '\\\\]' };\n }\n EOL() {\n return { token: '$' };\n }\n}\nexport class Piece {\n constructor(duration) {\n this.chord = [];\n this.dots = 0;\n this.options = {};\n this.duration = duration;\n }\n}\nexport class Builder {\n constructor(factory) {\n this.commitHooks = [];\n this.factory = factory;\n this.reset();\n }\n reset(options) {\n this.options = Object.assign({ stem: 'auto', clef: 'treble' }, options);\n this.elements = { notes: [], accidentals: [] };\n this.rollingDuration = '8';\n this.resetPiece();\n }\n getFactory() {\n return this.factory;\n }\n getElements() {\n return this.elements;\n }\n addCommitHook(commitHook) {\n this.commitHooks.push(commitHook);\n }\n resetPiece() {\n L('resetPiece');\n this.piece = new Piece(this.rollingDuration);\n }\n setNoteDots(dots) {\n L('setNoteDots:', dots);\n if (dots)\n this.piece.dots = dots.length;\n }\n setNoteDuration(duration) {\n L('setNoteDuration:', duration);\n this.rollingDuration = this.piece.duration = duration || this.rollingDuration;\n }\n setNoteType(type) {\n L('setNoteType:', type);\n if (type)\n this.piece.type = type;\n }\n addNoteOption(key, value) {\n L('addNoteOption: key:', key, 'value:', value);\n this.piece.options[key] = value;\n }\n addNote(key, accid, octave) {\n L('addNote:', key, accid, octave);\n this.piece.chord.push({\n key: key,\n accid,\n octave,\n });\n }\n addSingleNote(key, accid, octave) {\n L('addSingleNote:', key, accid, octave);\n this.addNote(key, accid, octave);\n }\n // notes is an array with 3 entries\n addChord(notes) {\n L('startChord');\n if (typeof notes[0] !== 'object') {\n this.addSingleNote(notes[0]);\n }\n else {\n notes.forEach((n) => {\n if (n)\n this.addNote(...n); // n => [string, string | null, string]\n });\n }\n L('endChord');\n }\n commitPiece() {\n L('commitPiece');\n const { factory } = this;\n if (!factory)\n return;\n const options = Object.assign(Object.assign({}, this.options), this.piece.options);\n // reset() sets this.options.stem & this.options.clef but we check to make sure nothing has changed.\n // e.g., auto | up | down\n const stem = defined(options.stem, 'BadArguments', 'options.stem is not defined').toLowerCase();\n // e.g., treble | bass\n const clef = defined(options.clef, 'BadArguments', 'options.clef is not defined').toLowerCase();\n const { chord, duration, dots, type } = this.piece;\n // Create a string[] that will be assigned to the .keys property of the StaveNote.\n // Each string in the array represents a note pitch and is of the form: {NoteName}{Accidental}/{Octave}\n // Only standard accidentals are included in the .keys property. Microtonal accidentals are not included.\n const standardAccidentals = Music.accidentals;\n const keys = chord.map((notePiece) => {\n var _a;\n return notePiece.key +\n (standardAccidentals.includes((_a = notePiece.accid) !== null && _a !== void 0 ? _a : '') ? notePiece.accid : '') +\n '/' +\n notePiece.octave;\n });\n const auto_stem = stem === 'auto'; // StaveNoteStruct expects the underscore & lowercase.\n // Build a GhostNote or StaveNote using the information we gathered.\n const note = (type === null || type === void 0 ? void 0 : type.toLowerCase()) == 'g'\n ? factory.GhostNote({ duration, dots })\n : factory.StaveNote({ keys, duration, dots, type, clef, auto_stem });\n if (!auto_stem)\n note.setStemDirection(stem === 'up' ? Stem.UP : Stem.DOWN);\n // Attach accidentals.\n const accidentals = [];\n chord.forEach((notePiece, index) => {\n const accid = notePiece.accid;\n if (typeof accid === 'string') {\n const accidental = factory.Accidental({ type: accid });\n note.addModifier(accidental, index);\n accidentals.push(accidental);\n }\n else {\n accidentals.push(undefined);\n }\n });\n // Attach dots.\n for (let i = 0; i < dots; i++)\n Dot.buildAndAttach([note], { all: true });\n this.commitHooks.forEach((commitHook) => commitHook(options, note, this));\n this.elements.notes.push(note);\n this.elements.accidentals.push(accidentals);\n this.resetPiece();\n }\n}\n/**\n * Commit hook used by EasyScore.setOptions().\n */\nfunction setId(options, note) {\n if (options.id === undefined)\n return;\n note.setAttribute('id', options.id);\n}\n// Used by setClass() below.\nconst commaSeparatedRegex = /\\s*,\\s*/;\n/**\n * Commit hook used by EasyScore.setOptions().\n */\nfunction setClass(options, note) {\n if (options.class === undefined)\n return;\n options.class.split(commaSeparatedRegex).forEach((className) => note.addClass(className));\n}\n/**\n * EasyScore implements a parser for a simple language to generate VexFlow objects.\n */\nexport class EasyScore {\n constructor(options = {}) {\n this.defaults = {\n clef: 'treble',\n time: '4/4',\n stem: 'auto',\n };\n this.setOptions(options);\n }\n /**\n * Set the score defaults.\n * clef must be set appropriately to avoid errors when adding Staves.\n * @param defaults.clef default clef ( treble | bass ...) see {@link Clef.types}\n * @param defaults.time default time signature ( 4/4 | 9/8 ...)\n * @param defaults.stem default stem arrangement (auto | up | down)\n * @returns this\n */\n set(defaults) {\n this.defaults = Object.assign(Object.assign({}, this.defaults), defaults);\n return this;\n }\n /**\n * @param options.factory is required.\n * @returns this\n */\n setOptions(options) {\n var _a, _b;\n // eslint-disable-next-line\n const factory = options.factory; // ! operator, because options.factory was set in Factory.EasyScore().\n const builder = (_a = options.builder) !== null && _a !== void 0 ? _a : new Builder(factory);\n this.options = Object.assign(Object.assign({ commitHooks: [setId, setClass, Articulation.easyScoreHook, FretHandFinger.easyScoreHook], throwOnError: false }, options), { factory,\n builder });\n this.factory = factory;\n this.builder = builder;\n this.grammar = new EasyScoreGrammar(this.builder);\n this.parser = new Parser(this.grammar);\n (_b = this.options.commitHooks) === null || _b === void 0 ? void 0 : _b.forEach((commitHook) => this.addCommitHook(commitHook));\n return this;\n }\n setContext(context) {\n this.factory.setContext(context);\n return this;\n }\n parse(line, options = {}) {\n this.builder.reset(options);\n const result = this.parser.parse(line);\n if (!result.success && this.options.throwOnError) {\n L(result);\n throw new RuntimeError('Error parsing line: ' + line);\n }\n return result;\n }\n beam(notes, options) {\n this.factory.Beam({ notes, options });\n return notes;\n }\n tuplet(notes, options) {\n this.factory.Tuplet({ notes, options });\n return notes;\n }\n notes(line, options = {}) {\n options = Object.assign({ clef: this.defaults.clef, stem: this.defaults.stem }, options);\n this.parse(line, options);\n return this.builder.getElements().notes;\n }\n voice(notes, options = {}) {\n options = Object.assign({ time: this.defaults.time }, options);\n return this.factory.Voice(options).addTickables(notes);\n }\n addCommitHook(commitHook) {\n this.builder.addCommitHook(commitHook);\n }\n}\nEasyScore.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\nimport { StemmableNote } from './stemmablenote';\nimport { Category, isAnnotation } from './typeguard';\nimport { RuntimeError } from './util';\nconst ERROR_MSG = 'Ghost note must have valid initialization data to identify duration.';\nexport class GhostNote extends StemmableNote {\n static get CATEGORY() {\n return Category.GhostNote;\n }\n constructor(parameter) {\n if (!parameter) {\n throw new RuntimeError('BadArguments', ERROR_MSG);\n }\n let noteStruct;\n if (typeof parameter === 'string') {\n // Preserve backwards-compatibility\n noteStruct = { duration: parameter };\n }\n else if (typeof parameter === 'object') {\n noteStruct = parameter;\n }\n else {\n throw new RuntimeError('BadArguments', ERROR_MSG);\n }\n super(noteStruct);\n // Note properties\n this.setWidth(0);\n }\n /**\n * @returns true if this note is a type of rest. Rests don't have pitches, but take up space in the score.\n */\n isRest() {\n return true;\n }\n setStave(stave) {\n super.setStave(stave);\n return this;\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n draw() {\n // Draw Annotations\n this.setRendered();\n for (let i = 0; i < this.modifiers.length; ++i) {\n const modifier = this.modifiers[i];\n if (isAnnotation(modifier)) {\n modifier.setContext(this.getContext());\n modifier.drawWithStyle();\n }\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { Note } from './note';\nimport { Category } from './typeguard';\nexport class GlyphNote extends Note {\n constructor(glyph, noteStruct, options) {\n super(noteStruct);\n this.options = Object.assign({ ignoreTicks: false, line: 2 }, options);\n // Note properties\n this.ignore_ticks = this.options.ignoreTicks;\n if (glyph) {\n this.setGlyph(glyph);\n }\n }\n static get CATEGORY() {\n return Category.GlyphNote;\n }\n setGlyph(glyph) {\n this.glyph = glyph;\n this.setWidth(this.glyph.getMetrics().width);\n return this;\n }\n getBoundingBox() {\n return this.glyph.getBoundingBox();\n }\n preFormat() {\n if (!this.preFormatted && this.modifierContext) {\n this.modifierContext.preFormat();\n }\n this.preFormatted = true;\n return this;\n }\n drawModifiers() {\n const ctx = this.checkContext();\n ctx.openGroup('modifiers');\n for (let i = 0; i < this.modifiers.length; i++) {\n const modifier = this.modifiers[i];\n modifier.setContext(ctx);\n modifier.drawWithStyle();\n }\n ctx.closeGroup();\n }\n draw() {\n const stave = this.checkStave();\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.openGroup('glyphNote', this.getAttribute('id'));\n // Context is set when setStave is called on Note\n const glyph = this.glyph;\n if (!glyph.getContext()) {\n glyph.setContext(ctx);\n }\n glyph.setStave(stave);\n glyph.setYShift(stave.getYForLine(this.options.line) - stave.getYForGlyphs());\n const x = this.isCenterAligned() ? this.getAbsoluteX() - this.getWidth() / 2 : this.getAbsoluteX();\n glyph.renderToStave(x);\n this.drawModifiers();\n ctx.closeGroup();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { StaveNote } from './stavenote';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class GraceNote extends StaveNote {\n constructor(noteStruct) {\n super(Object.assign({ glyph_font_scale: Tables.NOTATION_FONT_SCALE * GraceNote.SCALE, stroke_px: GraceNote.LEDGER_LINE_OFFSET }, noteStruct));\n this.slash = noteStruct.slash || false;\n this.slur = true;\n this.buildNoteHeads();\n this.width = 3;\n }\n static get CATEGORY() {\n return Category.GraceNote;\n }\n static get LEDGER_LINE_OFFSET() {\n return 2;\n }\n static get SCALE() {\n return 0.66;\n }\n getStemExtension() {\n if (this.stem_extension_override) {\n return this.stem_extension_override;\n }\n const glyph = this.getGlyph();\n if (glyph) {\n let ret = super.getStemExtension();\n if (glyph.stem) {\n const staveNoteScale = this.getStaveNoteScale();\n ret = (Stem.HEIGHT + ret) * staveNoteScale - Stem.HEIGHT;\n }\n return ret;\n }\n return 0;\n }\n // FIXME: move this to more basic class.\n getStaveNoteScale() {\n return this.render_options.glyph_font_scale / Tables.NOTATION_FONT_SCALE;\n }\n draw() {\n super.draw();\n this.setRendered();\n const stem = this.stem;\n if (this.slash && stem) {\n const staveNoteScale = this.getStaveNoteScale();\n // some magic numbers are based on the staveNoteScale 0.66.\n const offsetScale = staveNoteScale / 0.66;\n let slashBBox = undefined;\n const beam = this.beam;\n if (beam) {\n // FIXME: should render slash after beam?\n if (!beam.postFormatted) {\n beam.postFormat();\n }\n slashBBox = this.calcBeamedNotesSlashBBox(8 * offsetScale, 8 * offsetScale, {\n stem: 6 * offsetScale,\n beam: 5 * offsetScale,\n });\n }\n else {\n const stem_direction = this.getStemDirection();\n const noteHeadBounds = this.getNoteHeadBounds();\n const noteStemHeight = stem.getHeight();\n let x = this.getAbsoluteX();\n let y = stem_direction === Stem.DOWN\n ? noteHeadBounds.y_top - noteStemHeight\n : noteHeadBounds.y_bottom - noteStemHeight;\n let defaultOffsetY = Tables.STEM_HEIGHT;\n defaultOffsetY -= defaultOffsetY / 2.8;\n y += defaultOffsetY * staveNoteScale * stem_direction;\n const offsets = stem_direction === Stem.UP\n ? {\n x1: 1,\n y1: 0,\n x2: 13,\n y2: -9,\n }\n : {\n x1: -4,\n y1: 1,\n x2: 13,\n y2: 9,\n };\n x += offsets.x1 * offsetScale;\n y += offsets.y1 * offsetScale;\n slashBBox = {\n x1: x,\n y1: y,\n x2: x + offsets.x2 * offsetScale,\n y2: y + offsets.y2 * offsetScale,\n };\n }\n // FIXME: avoid staff lines, ledger lines or others.\n const ctx = this.checkContext();\n ctx.save();\n ctx.setLineWidth(1 * offsetScale); // FIXME: use more appropriate value.\n ctx.beginPath();\n ctx.moveTo(slashBBox.x1, slashBBox.y1);\n ctx.lineTo(slashBBox.x2, slashBBox.y2);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n }\n }\n calcBeamedNotesSlashBBox(slashStemOffset, slashBeamOffset, protrusions) {\n const beam = this.beam;\n if (!beam)\n throw new RuntimeError('NoBeam', \"Can't calculate without a beam.\");\n const beam_slope = beam.slope;\n const isBeamEndNote = beam.notes[beam.notes.length - 1] === this;\n const scaleX = isBeamEndNote ? -1 : 1;\n const beam_angle = Math.atan(beam_slope * scaleX);\n // slash line intersecting point on beam.\n const iPointOnBeam = {\n dx: Math.cos(beam_angle) * slashBeamOffset,\n dy: Math.sin(beam_angle) * slashBeamOffset,\n };\n slashStemOffset *= this.getStemDirection();\n const slash_angle = Math.atan((iPointOnBeam.dy - slashStemOffset) / iPointOnBeam.dx);\n const protrusion_stem_dx = Math.cos(slash_angle) * protrusions.stem * scaleX;\n const protrusion_stem_dy = Math.sin(slash_angle) * protrusions.stem;\n const protrusion_beam_dx = Math.cos(slash_angle) * protrusions.beam * scaleX;\n const protrusion_beam_dy = Math.sin(slash_angle) * protrusions.beam;\n const stemX = this.getStemX();\n const stem0X = beam.notes[0].getStemX();\n const stemY = beam.getBeamYToDraw() + (stemX - stem0X) * beam_slope;\n const ret = {\n x1: stemX - protrusion_stem_dx,\n y1: stemY + slashStemOffset - protrusion_stem_dy,\n x2: stemX + iPointOnBeam.dx * scaleX + protrusion_beam_dx,\n y2: stemY + iPointOnBeam.dy + protrusion_beam_dy,\n };\n return ret;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Mark Meeus 2019\nimport { KeySignature } from './keysignature';\nimport { Note } from './note';\nimport { Category } from './typeguard';\nexport class KeySigNote extends Note {\n constructor(keySpec, cancelKeySpec, alterKeySpec) {\n super({ duration: 'b' });\n this.keySignature = new KeySignature(keySpec, cancelKeySpec, alterKeySpec);\n // Note properties\n this.ignore_ticks = true;\n }\n static get CATEGORY() {\n return Category.KeySigNote;\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n preFormat() {\n this.preFormatted = true;\n this.keySignature.setStave(this.checkStave());\n this.setWidth(this.keySignature.getWidth());\n return this;\n }\n draw() {\n const ctx = this.checkStave().checkContext();\n this.setRendered();\n this.keySignature.setX(this.getAbsoluteX());\n this.keySignature.setContext(ctx);\n this.keySignature.draw();\n }\n}\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n//\n// This class implements multiple measure rests.\nimport { Element } from './element';\nimport { Glyph } from './glyph';\nimport { NoteHead } from './notehead';\nimport { StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { TimeSignature } from './timesignature';\nimport { Category, isBarline } from './typeguard';\nimport { defined } from './util';\nlet semibreve_rest;\nfunction get_semibreve_rest() {\n if (!semibreve_rest) {\n const noteHead = new NoteHead({ duration: 'w', note_type: 'r' });\n semibreve_rest = {\n glyph_font_scale: noteHead.render_options.glyph_font_scale,\n glyph_code: noteHead.glyph_code,\n width: noteHead.getWidth(),\n };\n }\n return semibreve_rest;\n}\nexport class MultiMeasureRest extends Element {\n /**\n *\n * @param number_of_measures Number of measures.\n * @param options The options object.\n */\n constructor(number_of_measures, options) {\n super();\n this.xs = { left: NaN, right: NaN };\n this.hasPaddingLeft = false;\n this.hasPaddingRight = false;\n this.hasLineThickness = false;\n this.hasSymbolSpacing = false;\n this.number_of_measures = number_of_measures;\n // Keep track of whether these four options were provided.\n this.hasPaddingLeft = typeof options.padding_left === 'number';\n this.hasPaddingRight = typeof options.padding_right === 'number';\n this.hasLineThickness = typeof options.line_thickness === 'number';\n this.hasSymbolSpacing = typeof options.symbol_spacing === 'number';\n const musicFont = Tables.currentMusicFont();\n this.render_options = Object.assign({ use_symbols: false, show_number: true, number_line: -0.5, number_glyph_point: musicFont.lookupMetric('digits.point'), line: 2, spacing_between_lines_px: Tables.STAVE_LINE_DISTANCE, serif_thickness: 2, semibreve_rest_glyph_scale: Tables.NOTATION_FONT_SCALE, padding_left: 0, padding_right: 0, line_thickness: 5, symbol_spacing: 0 }, options);\n const fontLineShift = musicFont.lookupMetric('digits.shiftLine', 0);\n this.render_options.number_line += fontLineShift;\n }\n static get CATEGORY() {\n return Category.MultiMeasureRest;\n }\n getXs() {\n return this.xs;\n }\n setStave(stave) {\n this.stave = stave;\n return this;\n }\n getStave() {\n return this.stave;\n }\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n drawLine(stave, ctx, left, right, spacingBetweenLines) {\n const options = this.render_options;\n const y = stave.getYForLine(options.line);\n const padding = (right - left) * 0.1;\n left += padding;\n right -= padding;\n let lineThicknessHalf;\n if (this.hasLineThickness) {\n lineThicknessHalf = options.line_thickness * 0.5;\n }\n else {\n lineThicknessHalf = spacingBetweenLines * 0.25;\n }\n const serifThickness = options.serif_thickness;\n const top = y - spacingBetweenLines;\n const bot = y + spacingBetweenLines;\n const leftIndented = left + serifThickness;\n const rightIndented = right - serifThickness;\n const lineTop = y - lineThicknessHalf;\n const lineBottom = y + lineThicknessHalf;\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(left, top);\n ctx.lineTo(leftIndented, top);\n ctx.lineTo(leftIndented, lineTop);\n ctx.lineTo(rightIndented, lineTop);\n ctx.lineTo(rightIndented, top);\n ctx.lineTo(right, top);\n ctx.lineTo(right, bot);\n ctx.lineTo(rightIndented, bot);\n ctx.lineTo(rightIndented, lineBottom);\n ctx.lineTo(leftIndented, lineBottom);\n ctx.lineTo(leftIndented, bot);\n ctx.lineTo(left, bot);\n ctx.closePath();\n ctx.fill();\n }\n drawSymbols(stave, ctx, left, right, spacingBetweenLines) {\n const n4 = Math.floor(this.number_of_measures / 4);\n const n = this.number_of_measures % 4;\n const n2 = Math.floor(n / 2);\n const n1 = n % 2;\n const options = this.render_options;\n // FIXME: TODO: invalidate semibreve_rest at the appropriate time\n // (e.g., if the system font settings are changed).\n semibreve_rest = undefined;\n const rest = get_semibreve_rest();\n const rest_scale = options.semibreve_rest_glyph_scale;\n const rest_width = rest.width * (rest_scale / rest.glyph_font_scale);\n const glyphs = {\n 2: {\n width: rest_width * 0.5,\n height: spacingBetweenLines,\n },\n 1: {\n width: rest_width,\n },\n };\n /* 10: normal spacingBetweenLines */\n const spacing = this.hasSymbolSpacing ? options.symbol_spacing : 10;\n const width = n4 * glyphs[2].width + n2 * glyphs[2].width + n1 * glyphs[1].width + (n4 + n2 + n1 - 1) * spacing;\n let x = left + (right - left) * 0.5 - width * 0.5;\n const line = options.line;\n const yTop = stave.getYForLine(line - 1);\n const yMiddle = stave.getYForLine(line);\n const yBottom = stave.getYForLine(line + 1);\n ctx.save();\n ctx.setStrokeStyle('none');\n ctx.setLineWidth(0);\n for (let i = 0; i < n4; ++i) {\n ctx.fillRect(x, yMiddle - glyphs[2].height, glyphs[2].width, glyphs[2].height);\n ctx.fillRect(x, yBottom - glyphs[2].height, glyphs[2].width, glyphs[2].height);\n x += glyphs[2].width + spacing;\n }\n for (let i = 0; i < n2; ++i) {\n ctx.fillRect(x, yMiddle - glyphs[2].height, glyphs[2].width, glyphs[2].height);\n x += glyphs[2].width + spacing;\n }\n for (let i = 0; i < n1; ++i) {\n Glyph.renderGlyph(ctx, x, yTop, rest_scale, rest.glyph_code);\n x += glyphs[1].width + spacing;\n }\n ctx.restore();\n }\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n const stave = this.checkStave();\n let left = stave.getNoteStartX();\n let right = stave.getNoteEndX();\n // FIXME: getNoteStartX() returns x + 5(barline width)\n // getNoteEndX() returns x + width(no barline width)\n // See Stave constructor. How do we fix this?\n // Here, we subtract the barline width.\n const begModifiers = stave.getModifiers(StaveModifierPosition.BEGIN);\n if (begModifiers.length === 1 && isBarline(begModifiers[0])) {\n left -= begModifiers[0].getWidth();\n }\n const options = this.render_options;\n if (this.hasPaddingLeft) {\n left = stave.getX() + options.padding_left;\n }\n if (this.hasPaddingRight) {\n right = stave.getX() + stave.getWidth() - options.padding_right;\n }\n this.xs.left = left;\n this.xs.right = right;\n const spacingBetweenLines = options.spacing_between_lines_px;\n if (options.use_symbols) {\n this.drawSymbols(stave, ctx, left, right, spacingBetweenLines);\n }\n else {\n this.drawLine(stave, ctx, left, right, spacingBetweenLines);\n }\n if (options.show_number) {\n const timeSpec = '/' + this.number_of_measures;\n const timeSig = new TimeSignature(timeSpec, 0, false);\n timeSig.point = options.number_glyph_point;\n timeSig.setTimeSig(timeSpec);\n timeSig.setStave(stave);\n timeSig.setX(left + (right - left) * 0.5 - timeSig.getInfo().glyph.getMetrics().width * 0.5);\n timeSig.bottomLine = options.number_line;\n timeSig.setContext(ctx).draw();\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (PedalMarking.DEBUG)\n log('Vex.Flow.PedalMarking', args);\n}\n/**\n * Draws a pedal glyph with the provided `name` on a rendering `context`\n * at the coordinates `x` and `y. Takes into account the glyph data\n * coordinate shifts.\n */\nfunction drawPedalGlyph(name, context, x, y, point) {\n const glyph_data = PedalMarking.GLYPHS[name];\n const glyph = new Glyph(glyph_data.code, point, { category: 'pedalMarking' });\n glyph.render(context, x + glyph_data.x_shift, y + glyph_data.y_shift);\n}\n/**\n * PedalMarking implements different types of pedal markings. These notation\n * elements indicate to the performer when to depress and release the a pedal.\n *\n * In order to create \"Sostenuto\", and \"una corda\" markings, you must set\n * custom text for the release/depress pedal markings.\n */\nexport class PedalMarking extends Element {\n constructor(notes) {\n super();\n this.notes = notes;\n this.type = PedalMarking.type.TEXT;\n this.line = 0;\n // Custom text for the release/depress markings\n this.custom_depress_text = '';\n this.custom_release_text = '';\n this.resetFont();\n this.render_options = {\n bracket_height: 10,\n text_margin_right: 6,\n bracket_line_width: 1,\n color: 'black',\n };\n }\n static get CATEGORY() {\n return Category.PedalMarking;\n }\n /**\n * Create a sustain pedal marking. Returns the defaults PedalMarking.\n * Which uses the traditional \"Ped\" and \"*\"\" markings.\n */\n static createSustain(notes) {\n const pedal = new PedalMarking(notes);\n return pedal;\n }\n /** Create a sostenuto pedal marking */\n static createSostenuto(notes) {\n const pedal = new PedalMarking(notes);\n pedal.setType(PedalMarking.type.MIXED);\n pedal.setCustomText('Sost. Ped.');\n return pedal;\n }\n /** Create an una corda pedal marking */\n static createUnaCorda(notes) {\n const pedal = new PedalMarking(notes);\n pedal.setType(PedalMarking.type.TEXT);\n pedal.setCustomText('una corda', 'tre corda');\n return pedal;\n }\n /** Set pedal type. */\n setType(type) {\n type = typeof type === 'string' ? PedalMarking.typeString[type] : type;\n if (type >= PedalMarking.type.TEXT && type <= PedalMarking.type.MIXED) {\n this.type = type;\n }\n return this;\n }\n /**\n * Set custom text for the `depress`/`release` pedal markings. No text is\n * set if the parameter is falsy.\n */\n setCustomText(depress, release) {\n this.custom_depress_text = depress || '';\n this.custom_release_text = release || '';\n return this;\n }\n /** Set the staff line to render the markings on. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Draw the bracket based pedal markings. */\n drawBracketed() {\n const ctx = this.checkContext();\n let is_pedal_depressed = false;\n let prev_x;\n let prev_y;\n // Iterate through each note\n this.notes.forEach((note, index, notes) => {\n // Each note triggers the opposite pedal action\n is_pedal_depressed = !is_pedal_depressed;\n // Get the initial coordinates for the note\n const x = note.getAbsoluteX();\n const y = note.checkStave().getYForBottomText(this.line + 3);\n // Throw if current note is positioned before the previous note\n if (x < prev_x) {\n throw new RuntimeError('InvalidConfiguration', 'The notes provided must be in order of ascending x positions');\n }\n // Determine if the previous or next note are the same\n // as the current note. We need to keep track of this for\n // when adjustments are made for the release+depress action\n const next_is_same = notes[index + 1] === note;\n const prev_is_same = notes[index - 1] === note;\n let x_shift = 0;\n const point = Tables.currentMusicFont().lookupMetric(`pedalMarking.${is_pedal_depressed ? 'down' : 'up'}.point`);\n if (is_pedal_depressed) {\n // Adjustment for release+depress\n x_shift = prev_is_same ? 5 : 0;\n if (this.type === PedalMarking.type.MIXED && !prev_is_same) {\n // For MIXED style, start with text instead of bracket\n if (this.custom_depress_text) {\n // If we have custom text, use instead of the default \"Ped\" glyph\n const text_width = ctx.measureText(this.custom_depress_text).width;\n ctx.fillText(this.custom_depress_text, x - text_width / 2, y);\n x_shift = text_width / 2 + this.render_options.text_margin_right;\n }\n else {\n // Render the Ped glyph in position\n drawPedalGlyph('pedal_depress', ctx, x, y, point);\n x_shift = 20 + this.render_options.text_margin_right;\n }\n }\n else {\n // Draw start bracket\n ctx.beginPath();\n ctx.moveTo(x, y - this.render_options.bracket_height);\n ctx.lineTo(x + x_shift, y);\n ctx.stroke();\n ctx.closePath();\n }\n }\n else {\n // Adjustment for release+depress\n x_shift = next_is_same ? -5 : 0;\n // Draw end bracket\n ctx.beginPath();\n ctx.moveTo(prev_x, prev_y);\n ctx.lineTo(x + x_shift, y);\n ctx.lineTo(x, y - this.render_options.bracket_height);\n ctx.stroke();\n ctx.closePath();\n }\n // Store previous coordinates\n prev_x = x + x_shift;\n prev_y = y;\n });\n }\n /**\n * Draw the text based pedal markings. This defaults to the traditional\n * \"Ped\" and \"*\"\" symbols if no custom text has been provided.\n */\n drawText() {\n const ctx = this.checkContext();\n let is_pedal_depressed = false;\n // Iterate through each note, placing glyphs or custom text accordingly\n this.notes.forEach((note) => {\n is_pedal_depressed = !is_pedal_depressed;\n const stave = note.checkStave();\n const x = note.getAbsoluteX();\n const y = stave.getYForBottomText(this.line + 3);\n const point = Tables.currentMusicFont().lookupMetric(`pedalMarking.${is_pedal_depressed ? 'down' : 'up'}.point`);\n let text_width = 0;\n if (is_pedal_depressed) {\n if (this.custom_depress_text) {\n text_width = ctx.measureText(this.custom_depress_text).width;\n ctx.fillText(this.custom_depress_text, x - text_width / 2, y);\n }\n else {\n drawPedalGlyph('pedal_depress', ctx, x, y, point);\n }\n }\n else {\n if (this.custom_release_text) {\n text_width = ctx.measureText(this.custom_release_text).width;\n ctx.fillText(this.custom_release_text, x - text_width / 2, y);\n }\n else {\n drawPedalGlyph('pedal_release', ctx, x, y, point);\n }\n }\n });\n }\n /** Render the pedal marking in position on the rendering context. */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n ctx.save();\n ctx.setStrokeStyle(this.render_options.color);\n ctx.setFillStyle(this.render_options.color);\n ctx.setFont(this.textFont);\n L('Rendering Pedal Marking');\n if (this.type === PedalMarking.type.BRACKET || this.type === PedalMarking.type.MIXED) {\n ctx.setLineWidth(this.render_options.bracket_line_width);\n this.drawBracketed();\n }\n else if (this.type === PedalMarking.type.TEXT) {\n this.drawText();\n }\n ctx.restore();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.PedalMarking.DEBUG` to `true`. */\nPedalMarking.DEBUG = false;\nPedalMarking.TEXT_FONT = {\n family: Font.SERIF,\n size: 12,\n weight: FontWeight.BOLD,\n style: FontStyle.ITALIC,\n};\n/** Glyph data */\nPedalMarking.GLYPHS = {\n pedal_depress: {\n code: 'keyboardPedalPed',\n x_shift: -10,\n y_shift: 0,\n },\n pedal_release: {\n code: 'keyboardPedalUp',\n x_shift: -2,\n y_shift: 3,\n },\n};\n/** Pedal type as number. */\nPedalMarking.type = {\n TEXT: 1,\n BRACKET: 2,\n MIXED: 3,\n};\n/** Pedal type as string. */\nPedalMarking.typeString = {\n text: PedalMarking.type.TEXT,\n bracket: PedalMarking.type.BRACKET,\n mixed: PedalMarking.type.MIXED,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { Glyph } from './glyph';\nimport { GlyphNote } from './glyphnote';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\n// Map `type` to SMuFL glyph code.\nconst CODES = {\n '1': 'repeat1Bar',\n '2': 'repeat2Bars',\n '4': 'repeat4Bars',\n slash: 'repeatBarSlash',\n};\nexport class RepeatNote extends GlyphNote {\n static get CATEGORY() {\n return Category.RepeatNote;\n }\n constructor(type, noteStruct, options) {\n super(undefined, Object.assign({ duration: 'q', align_center: type !== 'slash' }, noteStruct), options);\n const glyphCode = CODES[type] || 'repeat1Bar';\n const glyph = new Glyph(glyphCode, Tables.currentMusicFont().lookupMetric('repeatNote.point', 40), {\n category: 'repeatNote',\n });\n this.setGlyph(glyph);\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements `StaveLine` which are simply lines that connect\n// two notes. This object is highly configurable, see the `render_options`.\n// A simple line is often used for notating glissando articulations, but you\n// can format a `StaveLine` with arrows or colors for more pedagogical\n// purposes, such as diagrams.\nimport { Element } from './element';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\n// Attribution: Arrow rendering implementations based off of\n// Patrick Horgan's article, \"Drawing lines and arcs with\n// arrow heads on HTML5 Canvas\"\n//\n// Draw an arrow head that connects between 3 coordinates.\nfunction drawArrowHead(ctx, x0, y0, x1, y1, x2, y2) {\n // all cases do this.\n ctx.beginPath();\n ctx.moveTo(x0, y0);\n ctx.lineTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.lineTo(x0, y0);\n ctx.closePath();\n ctx.fill();\n}\nexport class StaveLine extends Element {\n // Initialize the StaveLine with the given `notes`.\n //\n // `notes` is a struct that has:\n //\n // ```\n // {\n // first_note: Note,\n // last_note: Note,\n // first_indices: [n1, n2, n3],\n // last_indices: [n1, n2, n3]\n // }\n // ```\n constructor(notes) {\n super();\n this.setNotes(notes);\n this.text = '';\n this.resetFont();\n this.render_options = {\n // Space to add to the left or the right\n padding_left: 4,\n padding_right: 3,\n // The width of the line in pixels\n line_width: 1,\n // An array of line/space lengths. (TODO/QUESTION: Is this supported in SVG?).\n line_dash: undefined,\n // Can draw rounded line end, instead of a square. (TODO/QUESTION: Is this supported in SVG?).\n rounded_end: true,\n // The color of the line and arrowheads\n color: undefined,\n // Flags to draw arrows on each end of the line\n draw_start_arrow: false,\n draw_end_arrow: false,\n // The length of the arrowhead sides\n arrowhead_length: 10,\n // The angle of the arrowhead\n arrowhead_angle: Math.PI / 8,\n // The position of the text\n text_position_vertical: StaveLine.TextVerticalPosition.TOP,\n text_justification: StaveLine.TextJustification.CENTER,\n };\n }\n static get CATEGORY() {\n return Category.StaveLine;\n }\n // The the annotation for the `StaveLine`\n setText(text) {\n this.text = text;\n return this;\n }\n // Set the notes for the `StaveLine`\n setNotes(notes) {\n if (!notes.first_note && !notes.last_note) {\n throw new RuntimeError('BadArguments', 'Notes needs to have either first_note or last_note set.');\n }\n if (!notes.first_indices)\n notes.first_indices = [0];\n if (!notes.last_indices)\n notes.last_indices = [0];\n if (notes.first_indices.length !== notes.last_indices.length) {\n throw new RuntimeError('BadArguments', 'Connected notes must have same number of indices.');\n }\n this.notes = notes;\n this.first_note = notes.first_note;\n this.first_indices = notes.first_indices;\n this.last_note = notes.last_note;\n this.last_indices = notes.last_indices;\n return this;\n }\n // Apply the style of the `StaveLine` to the context\n applyLineStyle() {\n const ctx = this.checkContext();\n const render_options = this.render_options;\n if (render_options.line_dash) {\n ctx.setLineDash(render_options.line_dash);\n }\n if (render_options.line_width) {\n ctx.setLineWidth(render_options.line_width);\n }\n if (render_options.rounded_end) {\n ctx.setLineCap('round');\n }\n else {\n ctx.setLineCap('square');\n }\n }\n // Apply the text styling to the context\n applyFontStyle() {\n const ctx = this.checkContext();\n ctx.setFont(this.textFont);\n const render_options = this.render_options;\n const color = render_options.color;\n if (color) {\n ctx.setStrokeStyle(color);\n ctx.setFillStyle(color);\n }\n }\n // Helper function to draw a line with arrow heads\n drawArrowLine(ctx, pt1, pt2) {\n const both_arrows = this.render_options.draw_start_arrow && this.render_options.draw_end_arrow;\n const x1 = pt1.x;\n const y1 = pt1.y;\n const x2 = pt2.x;\n const y2 = pt2.y;\n // For ends with arrow we actually want to stop before we get to the arrow\n // so that wide lines won't put a flat end on the arrow.\n const distance = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));\n const ratio = (distance - this.render_options.arrowhead_length / 3) / distance;\n let end_x;\n let end_y;\n let start_x;\n let start_y;\n if (this.render_options.draw_end_arrow || both_arrows) {\n end_x = Math.round(x1 + (x2 - x1) * ratio);\n end_y = Math.round(y1 + (y2 - y1) * ratio);\n }\n else {\n end_x = x2;\n end_y = y2;\n }\n if (this.render_options.draw_start_arrow || both_arrows) {\n start_x = x1 + (x2 - x1) * (1 - ratio);\n start_y = y1 + (y2 - y1) * (1 - ratio);\n }\n else {\n start_x = x1;\n start_y = y1;\n }\n if (this.render_options.color) {\n ctx.setStrokeStyle(this.render_options.color);\n ctx.setFillStyle(this.render_options.color);\n }\n // Draw the shaft of the arrow\n ctx.beginPath();\n ctx.moveTo(start_x, start_y);\n ctx.lineTo(end_x, end_y);\n ctx.stroke();\n ctx.closePath();\n // calculate the angle of the line\n const line_angle = Math.atan2(y2 - y1, x2 - x1);\n // h is the line length of a side of the arrow head\n const h = Math.abs(this.render_options.arrowhead_length / Math.cos(this.render_options.arrowhead_angle));\n let angle1;\n let angle2;\n let top_x;\n let top_y;\n let bottom_x;\n let bottom_y;\n if (this.render_options.draw_end_arrow || both_arrows) {\n angle1 = line_angle + Math.PI + this.render_options.arrowhead_angle;\n top_x = x2 + Math.cos(angle1) * h;\n top_y = y2 + Math.sin(angle1) * h;\n angle2 = line_angle + Math.PI - this.render_options.arrowhead_angle;\n bottom_x = x2 + Math.cos(angle2) * h;\n bottom_y = y2 + Math.sin(angle2) * h;\n drawArrowHead(ctx, top_x, top_y, x2, y2, bottom_x, bottom_y);\n }\n if (this.render_options.draw_start_arrow || both_arrows) {\n angle1 = line_angle + this.render_options.arrowhead_angle;\n top_x = x1 + Math.cos(angle1) * h;\n top_y = y1 + Math.sin(angle1) * h;\n angle2 = line_angle - this.render_options.arrowhead_angle;\n bottom_x = x1 + Math.cos(angle2) * h;\n bottom_y = y1 + Math.sin(angle2) * h;\n drawArrowHead(ctx, top_x, top_y, x1, y1, bottom_x, bottom_y);\n }\n }\n // Renders the `StaveLine` on the context\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n const first_note = this.first_note;\n const last_note = this.last_note;\n const render_options = this.render_options;\n ctx.save();\n this.applyLineStyle();\n // Cycle through each set of indices and draw lines\n let start_position = { x: 0, y: 0 };\n let end_position = { x: 0, y: 0 };\n this.first_indices.forEach((first_index, i) => {\n const last_index = this.last_indices[i];\n // Get initial coordinates for the start/end of the line\n start_position = first_note.getModifierStartXY(2, first_index);\n end_position = last_note.getModifierStartXY(1, last_index);\n const upwards_slope = start_position.y > end_position.y;\n // Adjust `x` coordinates for modifiers\n start_position.x += first_note.getMetrics().modRightPx + render_options.padding_left;\n end_position.x -= last_note.getMetrics().modLeftPx + render_options.padding_right;\n // Adjust first `x` coordinates for displacements\n const notehead_width = first_note.getGlyph().getWidth();\n const first_displaced = first_note.getKeyProps()[first_index].displaced;\n if (first_displaced && first_note.getStemDirection() === 1) {\n start_position.x += notehead_width + render_options.padding_left;\n }\n // Adjust last `x` coordinates for displacements\n const last_displaced = last_note.getKeyProps()[last_index].displaced;\n if (last_displaced && last_note.getStemDirection() === -1) {\n end_position.x -= notehead_width + render_options.padding_right;\n }\n // Adjust y position better if it's not coming from the center of the note\n start_position.y += upwards_slope ? -3 : 1;\n end_position.y += upwards_slope ? 2 : 0;\n this.drawArrowLine(ctx, start_position, end_position);\n });\n ctx.restore();\n // Determine the x coordinate where to start the text\n const text_width = ctx.measureText(this.text).width;\n const justification = render_options.text_justification;\n let x = 0;\n if (justification === StaveLine.TextJustification.LEFT) {\n x = start_position.x;\n }\n else if (justification === StaveLine.TextJustification.CENTER) {\n const delta_x = end_position.x - start_position.x;\n const center_x = delta_x / 2 + start_position.x;\n x = center_x - text_width / 2;\n }\n else if (justification === StaveLine.TextJustification.RIGHT) {\n x = end_position.x - text_width;\n }\n // Determine the y value to start the text\n let y = 0;\n const vertical_position = render_options.text_position_vertical;\n if (vertical_position === StaveLine.TextVerticalPosition.TOP) {\n y = first_note.checkStave().getYForTopText();\n }\n else if (vertical_position === StaveLine.TextVerticalPosition.BOTTOM) {\n y = first_note.checkStave().getYForBottomText(Tables.TEXT_HEIGHT_OFFSET_HACK);\n }\n // Draw the text\n ctx.save();\n this.applyFontStyle();\n ctx.fillText(this.text, x, y);\n ctx.restore();\n return this;\n }\n}\n/** Default text font. */\nStaveLine.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n// Text Positioning\nStaveLine.TextVerticalPosition = {\n TOP: 1,\n BOTTOM: 2,\n};\nStaveLine.TextJustification = {\n LEFT: 1,\n CENTER: 2,\n RIGHT: 3,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { BoundingBox } from './boundingbox';\nimport { Element } from './element';\nimport { Formatter } from './formatter';\nimport { Note } from './note';\nimport { Stave } from './stave';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\n/**\n * System implements a musical system, which is a collection of staves,\n * each which can have one or more voices. All voices across all staves in\n * the system are formatted together.\n */\nexport class System extends Element {\n constructor(params = {}) {\n super();\n this.setOptions(params);\n this.parts = [];\n }\n static get CATEGORY() {\n return Category.System;\n }\n /** Set formatting options. */\n setOptions(options = {}) {\n if (!options.factory) {\n throw new RuntimeError('NoFactory', 'System.setOptions(options) requires a factory.');\n }\n this.factory = options.factory;\n this.options = Object.assign(Object.assign({ factory: this.factory, x: 10, y: 10, width: 500, spaceBetweenStaves: 12, autoWidth: false, noJustification: false, debugFormatter: false, formatIterations: 0, noPadding: false }, options), { details: Object.assign({ alpha: 0.5 }, options.details), formatOptions: Object.assign({}, options.formatOptions) });\n if (this.options.noJustification === false && typeof options.width === 'undefined') {\n this.options.autoWidth = true;\n }\n }\n /** Set associated context. */\n setContext(context) {\n super.setContext(context);\n this.factory.setContext(context);\n return this;\n }\n /**\n * Add connector between staves.\n * @param type see {@link StaveConnector.typeString}\n */\n addConnector(type = 'double') {\n this.connector = this.factory.StaveConnector({\n top_stave: this.parts[0].stave,\n bottom_stave: this.parts[this.parts.length - 1].stave,\n type,\n });\n return this.connector;\n }\n /**\n * Add a stave to the system.\n *\n * Example (one voice):\n *\n * `system.addStave({voices: [score.voice(score.notes('C#5/q, B4, A4, G#4'))]});`\n *\n * Example (two voices):\n *\n * `system.addStave({voices: [`\n * `score.voice(score.notes('C#5/q, B4, A4, G#4', {stem: 'up'})),`\n * `score.voice(score.notes('C#4/h, C#4', {stem: 'down'}))`\n * `]});`\n */\n addStave(params) {\n var _a;\n const staveOptions = Object.assign({ left_bar: false }, params.options);\n const stave = (_a = params.stave) !== null && _a !== void 0 ? _a : this.factory.Stave({ x: this.options.x, y: this.options.y, width: this.options.width, options: staveOptions });\n const p = Object.assign(Object.assign({ stave, \n /* voices: [], */\n spaceAbove: 0, spaceBelow: 0, debugNoteMetrics: false, noJustification: false }, params), { options: staveOptions });\n const ctx = this.getContext();\n p.voices.forEach((voice) => voice\n .setContext(ctx)\n .setStave(stave)\n .getTickables()\n .forEach((tickable) => tickable.setStave(stave)));\n this.parts.push(p);\n return stave;\n }\n /** Format the system. */\n format() {\n const options_details = this.options.details;\n let justifyWidth = 0;\n const formatter = new Formatter(options_details);\n this.formatter = formatter;\n let y = this.options.y;\n let startX = 0;\n let allVoices = [];\n const debugNoteMetricsYs = [];\n // Join the voices for each stave.\n this.parts.forEach((part) => {\n y = y + part.stave.space(part.spaceAbove);\n part.stave.setY(y);\n if (this.options.autoWidth) {\n part.voices.forEach((voice) => {\n formatter.joinVoices([voice]);\n });\n }\n else {\n formatter.joinVoices(part.voices);\n }\n y = y + part.stave.space(part.spaceBelow);\n y = y + part.stave.space(this.options.spaceBetweenStaves);\n if (part.debugNoteMetrics) {\n debugNoteMetricsYs.push({ y, voice: part.voices[0] });\n y += 15;\n }\n allVoices = allVoices.concat(part.voices);\n startX = Math.max(startX, part.stave.getNoteStartX());\n });\n // Update the start position of all staves.\n this.parts.forEach((part) => part.stave.setNoteStartX(startX));\n if (this.options.autoWidth) {\n justifyWidth = formatter.preCalculateMinTotalWidth(allVoices);\n this.parts.forEach((part) => {\n part.stave.setWidth(justifyWidth + Stave.rightPadding + (startX - this.options.x));\n });\n }\n else {\n justifyWidth = this.options.noPadding\n ? this.options.width - this.options.x\n : this.options.width - (startX - this.options.x) - Stave.defaultPadding;\n }\n formatter.format(allVoices, this.options.noJustification ? 0 : justifyWidth, this.options.formatOptions);\n for (let i = 0; i < this.options.formatIterations; i++) {\n formatter.tune(options_details);\n }\n this.startX = startX;\n this.debugNoteMetricsYs = debugNoteMetricsYs;\n this.lastY = y;\n this.boundingBox = new BoundingBox(this.options.x, this.options.y, this.options.width, this.lastY - this.options.y);\n }\n /** Render the system. */\n draw() {\n // Render debugging information, if requested.\n const ctx = this.checkContext();\n if (!this.formatter || !this.startX || !this.lastY || !this.debugNoteMetricsYs) {\n throw new RuntimeError('NoFormatter', 'format() must be called before draw()');\n }\n this.setRendered();\n if (this.options.debugFormatter) {\n Formatter.plotDebugging(ctx, this.formatter, this.startX, this.options.y, this.lastY);\n }\n this.debugNoteMetricsYs.forEach((d) => {\n d.voice.getTickables().forEach((tickable) => Note.plotMetrics(ctx, tickable, d.y));\n });\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// The file implements notes for Tablature notation. This consists of one or\n// more fret positions, and can either be drawn with or without stems.\n//\n// See `tests/tabnote_tests.ts` for usage examples.\nimport { Font } from './font';\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { StemmableNote } from './stemmablenote';\nimport { Tables } from './tables';\nimport { Category, isDot } from './typeguard';\nimport { defined, RuntimeError } from './util';\n// Gets the unused strings grouped together if consecutive.\n//\n// Parameters:\n// * num_lines - The number of lines\n// * strings_used - An array of numbers representing which strings have fret positions\nfunction getUnusedStringGroups(num_lines, strings_used) {\n const stem_through = [];\n let group = [];\n for (let string = 1; string <= num_lines; string++) {\n const is_used = strings_used.indexOf(string) > -1;\n if (!is_used) {\n group.push(string);\n }\n else {\n stem_through.push(group);\n group = [];\n }\n }\n if (group.length > 0)\n stem_through.push(group);\n return stem_through;\n}\n// Gets groups of points that outline the partial stem lines\n// between fret positions\n//\n// Parameters:\n// * stem_Y - The `y` coordinate the stem is located on\n// * unused_strings - An array of groups of unused strings\n// * stave - The stave to use for reference\n// * stem_direction - The direction of the stem\nfunction getPartialStemLines(stem_y, unused_strings, stave, stem_direction) {\n const up_stem = stem_direction !== 1;\n const down_stem = stem_direction !== -1;\n const line_spacing = stave.getSpacingBetweenLines();\n const total_lines = stave.getNumLines();\n const stem_lines = [];\n unused_strings.forEach((strings) => {\n const containsLastString = strings.indexOf(total_lines) > -1;\n const containsFirstString = strings.indexOf(1) > -1;\n if ((up_stem && containsFirstString) || (down_stem && containsLastString)) {\n return;\n }\n // If there's only one string in the group, push a duplicate value.\n // We do this because we need 2 strings to convert into upper/lower y\n // values.\n if (strings.length === 1) {\n strings.push(strings[0]);\n }\n const line_ys = [];\n // Iterate through each group string and store it's y position\n strings.forEach((string, index, strings) => {\n const isTopBound = string === 1;\n const isBottomBound = string === total_lines;\n // Get the y value for the appropriate staff line,\n // we adjust for a 0 index array, since string numbers are index 1\n let y = stave.getYForLine(string - 1);\n // Unless the string is the first or last, add padding to each side\n // of the line\n if (index === 0 && !isTopBound) {\n y -= line_spacing / 2 - 1;\n }\n else if (index === strings.length - 1 && !isBottomBound) {\n y += line_spacing / 2 - 1;\n }\n // Store the y value\n line_ys.push(y);\n // Store a subsequent y value connecting this group to the main\n // stem above/below the stave if it's the top/bottom string\n if (stem_direction === 1 && isTopBound) {\n line_ys.push(stem_y - 2);\n }\n else if (stem_direction === -1 && isBottomBound) {\n line_ys.push(stem_y + 2);\n }\n });\n // Add the sorted y values to the\n stem_lines.push(line_ys.sort((a, b) => a - b));\n });\n return stem_lines;\n}\nexport class TabNote extends StemmableNote {\n // Initialize the TabNote with a `noteStruct` full of properties\n // and whether to `draw_stem` when rendering the note\n constructor(noteStruct, draw_stem = false) {\n super(noteStruct);\n this.glyphs = [];\n // Return the number of the greatest string, which is the string lowest on the display\n this.greatestString = () => {\n return this.positions.map((x) => x.str).reduce((a, b) => (a > b ? a : b));\n };\n // Return the number of the least string, which is the string highest on the display\n this.leastString = () => {\n return this.positions.map((x) => x.str).reduce((a, b) => (a < b ? a : b));\n };\n this.ghost = false; // Renders parenthesis around notes\n // Note properties\n // The fret positions in the note. An array of `{ str: X, fret: X }`\n this.positions = noteStruct.positions || [];\n // Render Options\n this.render_options = Object.assign(Object.assign({}, this.render_options), { \n // font size for note heads and rests\n glyph_font_scale: Tables.TABLATURE_FONT_SCALE, \n // Flag to draw a stem\n draw_stem, \n // Flag to draw dot modifiers\n draw_dots: draw_stem, \n // Flag to extend the main stem through the stave and fret positions\n draw_stem_through_stave: false, \n // vertical shift from stave line\n y_shift: 0, \n // normal glyph scale\n scale: 1.0, \n // default tablature font\n font: `${Font.SIZE}pt ${Font.SANS_SERIF}` });\n this.glyph = Tables.getGlyphProps(this.duration, this.noteType);\n defined(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`);\n this.buildStem();\n if (noteStruct.stem_direction) {\n this.setStemDirection(noteStruct.stem_direction);\n }\n else {\n this.setStemDirection(Stem.UP);\n }\n // Renders parenthesis around notes\n this.ghost = false;\n this.updateWidth();\n }\n static get CATEGORY() {\n return Category.TabNote;\n }\n reset() {\n super.reset();\n if (this.stave)\n this.setStave(this.stave);\n return this;\n }\n // Set as ghost `TabNote`, surrounds the fret positions with parenthesis.\n // Often used for indicating frets that are being bent to\n setGhost(ghost) {\n this.ghost = ghost;\n this.updateWidth();\n return this;\n }\n // Determine if the note has a stem\n hasStem() {\n if (this.render_options.draw_stem)\n return true;\n return false;\n }\n // Get the default stem extension for the note\n getStemExtension() {\n if (this.stem_extension_override != null) {\n return this.stem_extension_override;\n }\n if (this.flag) {\n return this.getStemDirection() === 1 ? -this.flag.checkMetrics().y_shift : this.flag.checkMetrics().y_shift;\n }\n return 0;\n }\n // Calculate and store the width of the note\n updateWidth() {\n this.glyphs = [];\n this.width = 0;\n for (let i = 0; i < this.positions.length; ++i) {\n let fret = this.positions[i].fret;\n if (this.ghost)\n fret = '(' + fret + ')';\n const glyph = Tables.tabToGlyph(fret.toString(), this.render_options.scale);\n this.glyphs.push(glyph);\n this.width = Math.max(glyph.getWidth(), this.width);\n }\n // For some reason we associate a notehead glyph with a TabNote, and this\n // glyph is used for certain width calculations. Of course, this is totally\n // incorrect since a notehead is a poor approximation for the dimensions of\n // a fret number which can have multiple digits. As a result, we must\n // overwrite getWidth() to return the correct width\n this.glyph.getWidth = () => this.width;\n }\n // Set the `stave` to the note\n setStave(stave) {\n super.setStave(stave);\n const ctx = stave.getContext();\n this.setContext(ctx);\n // Calculate the fret number width based on font used\n if (ctx) {\n this.width = 0;\n for (let i = 0; i < this.glyphs.length; ++i) {\n const glyph = this.glyphs[i];\n const text = '' + glyph.text;\n if (text.toUpperCase() !== 'X') {\n ctx.save();\n ctx.setFont(this.render_options.font);\n glyph.width = ctx.measureText(text).width;\n ctx.restore();\n glyph.getWidth = () => glyph.width;\n }\n this.width = Math.max(glyph.getWidth(), this.width);\n }\n this.glyph.getWidth = () => this.width;\n }\n // we subtract 1 from `line` because getYForLine expects a 0-based index,\n // while the position.str is a 1-based index\n const ys = this.positions.map(({ str: line }) => stave.getYForLine(Number(line) - 1));\n this.setYs(ys);\n if (this.stem) {\n this.stem.setYBounds(this.getStemY(), this.getStemY());\n }\n return this;\n }\n // Get the fret positions for the note\n getPositions() {\n return this.positions;\n }\n // Get the default `x` and `y` coordinates for a modifier at a specific\n // `position` at a fret position `index`\n getModifierStartXY(position, index) {\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call GetModifierStartXY on an unformatted note\");\n }\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', 'No Y-Values calculated for this note.');\n }\n let x = 0;\n if (position === Modifier.Position.LEFT) {\n x = -1 * 2; // FIXME: modifier padding, move to font file\n }\n else if (position === Modifier.Position.RIGHT) {\n x = this.width + 2; // FIXME: modifier padding, move to font file\n }\n else if (position === Modifier.Position.BELOW || position === Modifier.Position.ABOVE) {\n const note_glyph_width = this.glyph.getWidth();\n x = note_glyph_width / 2;\n }\n return {\n x: this.getAbsoluteX() + x,\n y: this.ys[index],\n };\n }\n // Get the default line for rest\n getLineForRest() {\n return Number(this.positions[0].str);\n }\n // Pre-render formatting\n preFormat() {\n if (this.preFormatted)\n return;\n if (this.modifierContext)\n this.modifierContext.preFormat();\n // width is already set during init()\n this.preFormatted = true;\n }\n // Get the x position for the stem\n getStemX() {\n return this.getCenterGlyphX();\n }\n // Get the y position for the stem\n getStemY() {\n const num_lines = this.checkStave().getNumLines();\n // The decimal staff line amounts provide optimal spacing between the\n // fret number and the stem\n const stemUpLine = -0.5;\n const stemDownLine = num_lines - 0.5;\n const stemStartLine = Stem.UP === this.stem_direction ? stemUpLine : stemDownLine;\n return this.checkStave().getYForLine(stemStartLine);\n }\n // Get the stem extents for the tabnote\n getStemExtents() {\n return this.checkStem().getExtents();\n }\n // Draw the fal onto the context\n drawFlag() {\n const { beam, glyph, stem_direction, render_options: { draw_stem, glyph_font_scale }, } = this;\n const context = this.checkContext();\n const shouldDrawFlag = beam == undefined && draw_stem;\n // Now it's the flag's turn.\n if (glyph.flag && shouldDrawFlag) {\n const flag_x = this.getStemX() + 1;\n const flag_y = this.getStemY() - this.checkStem().getHeight();\n const flag_code = stem_direction === Stem.DOWN\n ? glyph.code_flag_downstem // Down stems have flags on the left.\n : glyph.code_flag_upstem;\n // Draw the Flag\n Glyph.renderGlyph(context, flag_x, flag_y, glyph_font_scale, flag_code, { category: 'flag.tabStem' });\n }\n }\n // Render the modifiers onto the context.\n drawModifiers() {\n this.modifiers.forEach((modifier) => {\n // Only draw the dots if enabled.\n if (isDot(modifier) && !this.render_options.draw_dots) {\n return;\n }\n modifier.setContext(this.getContext());\n modifier.drawWithStyle();\n });\n }\n // Render the stem extension through the fret positions\n drawStemThrough() {\n const stemX = this.getStemX();\n const stemY = this.getStemY();\n const ctx = this.checkContext();\n const drawStem = this.render_options.draw_stem;\n const stemThrough = this.render_options.draw_stem_through_stave;\n if (drawStem && stemThrough) {\n const numLines = this.checkStave().getNumLines();\n const stringsUsed = this.positions.map((position) => Number(position.str));\n const unusedStrings = getUnusedStringGroups(numLines, stringsUsed);\n const stemLines = getPartialStemLines(stemY, unusedStrings, this.checkStave(), this.getStemDirection());\n ctx.save();\n ctx.setLineWidth(Stem.WIDTH);\n stemLines.forEach((bounds) => {\n if (bounds.length === 0)\n return;\n ctx.beginPath();\n ctx.moveTo(stemX, bounds[0]);\n ctx.lineTo(stemX, bounds[bounds.length - 1]);\n ctx.stroke();\n ctx.closePath();\n });\n ctx.restore();\n }\n }\n // Render the fret positions onto the context\n drawPositions() {\n const ctx = this.checkContext();\n const x = this.getAbsoluteX();\n const ys = this.ys;\n for (let i = 0; i < this.positions.length; ++i) {\n const y = ys[i] + this.render_options.y_shift;\n const glyph = this.glyphs[i];\n // Center the fret text beneath the notation note head\n const note_glyph_width = this.glyph.getWidth();\n const tab_x = x + note_glyph_width / 2 - glyph.getWidth() / 2;\n // FIXME: Magic numbers.\n ctx.clearRect(tab_x - 2, y - 3, glyph.getWidth() + 4, 6);\n if (glyph.code) {\n Glyph.renderGlyph(ctx, tab_x, y, this.render_options.glyph_font_scale * this.render_options.scale, glyph.code);\n }\n else {\n ctx.save();\n ctx.setFont(this.render_options.font);\n const text = glyph.text.toString();\n ctx.fillText(text, tab_x, y + 5 * this.render_options.scale);\n ctx.restore();\n }\n }\n }\n // The main rendering function for the entire note.\n draw() {\n const ctx = this.checkContext();\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', \"Can't draw note without Y values.\");\n }\n this.setRendered();\n const render_stem = this.beam == undefined && this.render_options.draw_stem;\n ctx.openGroup('tabnote', undefined, { pointerBBox: true });\n this.drawPositions();\n this.drawStemThrough();\n if (this.stem && render_stem) {\n const stem_x = this.getStemX();\n this.stem.setNoteHeadXBounds(stem_x, stem_x);\n ctx.openGroup('stem', undefined, { pointerBBox: true });\n this.stem.setContext(ctx).draw();\n ctx.closeGroup();\n }\n this.drawFlag();\n this.drawModifiers();\n ctx.closeGroup();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { Stave } from './stave';\nimport { Category } from './typeguard';\nexport class TabStave extends Stave {\n static get CATEGORY() {\n return Category.TabStave;\n }\n constructor(x, y, width, options) {\n const tab_options = Object.assign({ spacing_between_lines_px: 13, num_lines: 6, top_text_position: 1 }, options);\n super(x, y, width, tab_options);\n }\n getYForGlyphs() {\n return this.getYForLine(2.5);\n }\n // Deprecated\n addTabGlyph() {\n this.addClef('tab');\n return this;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Cyril Silverman\n//\n// This file implements `TextBrackets` which extend between two notes.\n// The octave transposition markings (8va, 8vb, 15va, 15vb) can be created\n// using this class.\nimport { Element } from './element';\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Renderer } from './renderer';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { log, RuntimeError } from './util';\n// To enable logging for this class. Set `Vex.Flow.TextBracket.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (TextBracket.DEBUG)\n log('Vex.Flow.TextBracket', args);\n}\nexport var TextBracketPosition;\n(function (TextBracketPosition) {\n TextBracketPosition[TextBracketPosition[\"TOP\"] = 1] = \"TOP\";\n TextBracketPosition[TextBracketPosition[\"BOTTOM\"] = -1] = \"BOTTOM\";\n})(TextBracketPosition || (TextBracketPosition = {}));\nexport class TextBracket extends Element {\n constructor({ start, stop, text = '', superscript = '', position = TextBracketPosition.TOP }) {\n super();\n this.start = start;\n this.stop = stop;\n this.text = text;\n this.superscript = superscript;\n this.position = typeof position === 'string' ? TextBracket.PositionString[position] : position;\n this.line = 1;\n this.resetFont();\n this.render_options = {\n dashed: true,\n dash: [5],\n color: 'black',\n line_width: 1,\n show_bracket: true,\n bracket_height: 8,\n // In the BOTTOM position, the bracket line can extend\n // under the superscript.\n underline_superscript: true,\n };\n }\n static get CATEGORY() {\n return Category.TextBracket;\n }\n static get Position() {\n return TextBracketPosition;\n }\n static get PositionString() {\n return {\n top: TextBracketPosition.TOP,\n bottom: TextBracketPosition.BOTTOM,\n };\n }\n /**\n * @deprecated Use `TextBracket.Position` instead.\n */\n static get Positions() {\n L('Positions is deprecated, use TextBracketPosition instead.');\n return TextBracketPosition;\n }\n /**\n * @deprecated Use `TextBracket.PositionString` instead.\n */\n static get PositionsString() {\n L('PositionsString is deprecated, use PositionString instead.');\n return TextBracket.PositionString;\n }\n /**\n * Apply the text backet styling to the provided context.\n * @param ctx\n * @returns this\n */\n applyStyle(ctx) {\n ctx.setFont(this.font);\n const options = this.render_options;\n ctx.setStrokeStyle(options.color);\n ctx.setFillStyle(options.color);\n ctx.setLineWidth(options.line_width);\n return this;\n }\n // Set whether the bracket line should be `dashed`. You can also\n // optionally set the `dash` pattern by passing in an array of numbers\n setDashed(dashed, dash) {\n this.render_options.dashed = dashed;\n if (dash)\n this.render_options.dash = dash;\n return this;\n }\n // Set the rendering `context` for the octave bracket\n setLine(line) {\n this.line = line;\n return this;\n }\n // Draw the octave bracket on the rendering context\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n let y = 0;\n switch (this.position) {\n case TextBracketPosition.TOP:\n y = this.start.checkStave().getYForTopText(this.line);\n break;\n case TextBracketPosition.BOTTOM:\n y = this.start.checkStave().getYForBottomText(this.line + Tables.TEXT_HEIGHT_OFFSET_HACK);\n break;\n default:\n throw new RuntimeError('InvalidPosition', `The position ${this.position} is invalid.`);\n }\n // Get the preliminary start and stop coordintates for the bracket\n const start = { x: this.start.getAbsoluteX(), y };\n const stop = { x: this.stop.getAbsoluteX(), y };\n L('Rendering TextBracket: start:', start, 'stop:', stop, 'y:', y);\n const bracket_height = this.render_options.bracket_height * this.position;\n ctx.save();\n this.applyStyle(ctx);\n // Draw text\n ctx.fillText(this.text, start.x, start.y);\n // Get the width and height for the octave number\n const main_measure = ctx.measureText(this.text);\n const main_width = main_measure.width;\n const main_height = main_measure.height;\n // Calculate the y position for the super script\n const super_y = start.y - main_height / 2.5;\n // We called this.resetFont() in the constructor, so we know this.textFont is available.\n // eslint-disable-next-line\n const { family, size, weight, style } = this.textFont;\n // To draw the superscript, we scale the font size by 1/1.4.\n const smallerFontSize = Font.scaleSize(size, 0.714286);\n ctx.setFont(family, smallerFontSize, weight, style);\n ctx.fillText(this.superscript, start.x + main_width + 1, super_y);\n // Determine width and height of the superscript\n const super_measure = ctx.measureText(this.superscript);\n const super_width = super_measure.width;\n const super_height = super_measure.height;\n // Setup initial coordinates for the bracket line\n let start_x = start.x;\n let line_y = super_y;\n const end_x = stop.x + this.stop.getGlyph().getWidth();\n // Adjust x and y coordinates based on position\n if (this.position === TextBracketPosition.TOP) {\n start_x += main_width + super_width + 5;\n line_y -= super_height / 2.7;\n }\n else if (this.position === TextBracketPosition.BOTTOM) {\n line_y += super_height / 2.7;\n start_x += main_width + 2;\n if (!this.render_options.underline_superscript) {\n start_x += super_width;\n }\n }\n if (this.render_options.dashed) {\n // Main line\n Renderer.drawDashedLine(ctx, start_x, line_y, end_x, line_y, this.render_options.dash);\n // Ending Bracket\n if (this.render_options.show_bracket) {\n Renderer.drawDashedLine(ctx, end_x, line_y + 1 * this.position, end_x, line_y + bracket_height, this.render_options.dash);\n }\n }\n else {\n ctx.beginPath();\n ctx.moveTo(start_x, line_y);\n // Main line\n ctx.lineTo(end_x, line_y);\n if (this.render_options.show_bracket) {\n // Ending bracket\n ctx.lineTo(end_x, line_y + bracket_height);\n }\n ctx.stroke();\n ctx.closePath();\n }\n ctx.restore();\n }\n}\nTextBracket.DEBUG = false;\nTextBracket.TEXT_FONT = {\n family: Font.SERIF,\n size: 15,\n weight: FontWeight.NORMAL,\n style: FontStyle.ITALIC,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Category } from './typeguard';\nimport { defined, log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (TextDynamics.DEBUG)\n log('Vex.Flow.TextDynamics', args);\n}\n/**\n * `TextDynamics` renders traditional\n * text dynamics markings, **ie: p, f, sfz, rfz, ppp**\n *\n * You can render any dynamics string that contains a combination of\n * the following letters: P, M, F, Z, R, S\n */\nexport class TextDynamics extends Note {\n /**\n * Create the dynamics marking.\n *\n * A `TextDynamics` object inherits from `Note` so that it can be formatted\n * within a `Voice`.\n *\n * @param noteStruct an object that contains a `duration` property and a\n * `sequence` of letters that represents the letters to render.\n */\n constructor(noteStruct) {\n super(noteStruct);\n this.sequence = (noteStruct.text || '').toLowerCase();\n this.line = noteStruct.line || 0;\n this.glyphs = [];\n this.render_options = Object.assign(Object.assign({}, this.render_options), { glyph_font_size: 40 });\n L('New Dynamics Text: ', this.sequence);\n }\n static get CATEGORY() {\n return Category.TextDynamics;\n }\n /** The glyph data for each dynamics letter. */\n static get GLYPHS() {\n return {\n f: {\n code: 'dynamicForte',\n width: 12,\n },\n p: {\n code: 'dynamicPiano',\n width: 14,\n },\n m: {\n code: 'dynamicMezzo',\n width: 17,\n },\n s: {\n code: 'dynamicSforzando',\n width: 10,\n },\n z: {\n code: 'dynamicZ',\n width: 12,\n },\n r: {\n code: 'dynamicRinforzando',\n width: 12,\n },\n };\n }\n /** Set the Stave line on which the note should be placed. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Preformat the dynamics text. */\n preFormat() {\n let total_width = 0;\n // length of this.glyphs must be <=\n // length of this.sequence, so if we're formatted before\n // create new glyphs.\n this.glyphs = [];\n // Iterate through each letter\n this.sequence.split('').forEach((letter) => {\n // Get the glyph data for the letter\n const glyph_data = TextDynamics.GLYPHS[letter];\n if (!glyph_data)\n throw new RuntimeError('Invalid dynamics character: ' + letter);\n const size = defined(this.render_options.glyph_font_size);\n const glyph = new Glyph(glyph_data.code, size, { category: 'textNote' });\n // Add the glyph\n this.glyphs.push(glyph);\n total_width += glyph_data.width;\n });\n // Store the width of the text\n this.setWidth(total_width);\n this.preFormatted = true;\n return this;\n }\n /** Draw the dynamics text on the rendering context. */\n draw() {\n this.setRendered();\n const x = this.getAbsoluteX();\n const y = this.checkStave().getYForLine(this.line + -3);\n L('Rendering Dynamics: ', this.sequence);\n let letter_x = x;\n this.glyphs.forEach((glyph, index) => {\n const current_letter = this.sequence[index];\n glyph.render(this.checkContext(), letter_x, y);\n letter_x += TextDynamics.GLYPHS[current_letter].width;\n });\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.TextDynamics.DEBUG` to `true`. */\nTextDynamics.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2014\nimport { Note } from './note';\nimport { TimeSignature } from './timesignature';\nimport { Category } from './typeguard';\nexport class TimeSigNote extends Note {\n constructor(timeSpec, customPadding) {\n super({ duration: 'b' });\n const timeSignature = new TimeSignature(timeSpec, customPadding);\n this.timeSigInfo = timeSignature.getInfo();\n this.setWidth(this.timeSigInfo.glyph.getMetrics().width);\n // Note properties\n this.ignore_ticks = true;\n }\n static get CATEGORY() {\n return Category.TimeSigNote;\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n draw() {\n const stave = this.checkStave();\n const ctx = this.checkContext();\n this.setRendered();\n if (!this.timeSigInfo.glyph.getContext()) {\n this.timeSigInfo.glyph.setContext(ctx);\n }\n this.timeSigInfo.glyph.setStave(stave);\n this.timeSigInfo.glyph.setYShift(stave.getYForLine(2) - stave.getYForGlyphs());\n this.timeSigInfo.glyph.renderToStave(this.getAbsoluteX());\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Balazs Forian-Szabo\n// MIT License\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { log } from './util';\nimport { Vibrato } from './vibrato';\n// eslint-disable-next-line\nfunction L(...args) {\n if (VibratoBracket.DEBUG)\n log('Vex.Flow.VibratoBracket', args);\n}\n/** `VibratoBracket` renders vibrato effect between two notes. */\nexport class VibratoBracket extends Element {\n /**\n * Either the stop or start note must be set, or both of them.\n * An undefined value for the start or stop note indicates that the vibrato\n * is drawn from the beginning or until the end of the stave accordingly.\n */\n constructor(bracket_data) {\n super();\n if (bracket_data.start)\n this.start = bracket_data.start;\n if (bracket_data.stop)\n this.stop = bracket_data.stop;\n this.line = 1;\n this.render_options = {\n harsh: false,\n wave_height: 6,\n wave_width: 4,\n wave_girth: 2,\n vibrato_width: 0,\n };\n }\n static get CATEGORY() {\n return Category.VibratoBracket;\n }\n /** Set line position of the vibrato bracket. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Set harsh vibrato bracket. */\n setHarsh(harsh) {\n this.render_options.harsh = harsh;\n return this;\n }\n /** Draw the vibrato bracket on the rendering context. */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n const y = (this.start && this.start.checkStave().getYForTopText(this.line)) ||\n (this.stop && this.stop.checkStave().getYForTopText(this.line)) ||\n 0;\n // If start note is not set then vibrato will be drawn\n // from the beginning of the stave\n const start_x = (this.start && this.start.getAbsoluteX()) || (this.stop && this.stop.checkStave().getTieStartX()) || 0;\n // If stop note is not set then vibrato will be drawn\n // until the end of the stave\n const stop_x = (this.stop && this.stop.getAbsoluteX() - this.stop.getWidth() - 5) ||\n (this.start && this.start.checkStave().getTieEndX() - 10) ||\n 0;\n this.render_options.vibrato_width = stop_x - start_x;\n L('Rendering VibratoBracket: start_x:', start_x, 'stop_x:', stop_x, 'y:', y);\n Vibrato.renderVibrato(ctx, start_x, y, this.render_options);\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.VibratoBracket.DEBUG` to `true`. */\nVibratoBracket.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Mohit Cheppudira\n// MIT License\nimport { Accidental } from './accidental';\nimport { Annotation, AnnotationHorizontalJustify, AnnotationVerticalJustify } from './annotation';\nimport { Articulation } from './articulation';\nimport { BarNote } from './barnote';\nimport { Beam } from './beam';\nimport { ChordSymbol } from './chordsymbol';\nimport { ClefNote } from './clefnote';\nimport { Curve } from './curve';\nimport { EasyScore } from './easyscore';\nimport { Element } from './element';\nimport { Formatter } from './formatter';\nimport { FretHandFinger } from './frethandfinger';\nimport { GhostNote } from './ghostnote';\nimport { GlyphNote } from './glyphnote';\nimport { GraceNote } from './gracenote';\nimport { GraceNoteGroup } from './gracenotegroup';\nimport { KeySigNote } from './keysignote';\nimport { ModifierContext } from './modifiercontext';\nimport { MultiMeasureRest } from './multimeasurerest';\nimport { NoteSubGroup } from './notesubgroup';\nimport { PedalMarking } from './pedalmarking';\nimport { Renderer } from './renderer';\nimport { RepeatNote } from './repeatnote';\nimport { Stave } from './stave';\nimport { StaveConnector } from './staveconnector';\nimport { StaveLine } from './staveline';\nimport { StaveNote } from './stavenote';\nimport { StaveTie } from './stavetie';\nimport { StringNumber } from './stringnumber';\nimport { System } from './system';\nimport { TabNote } from './tabnote';\nimport { TabStave } from './tabstave';\nimport { TextBracket } from './textbracket';\nimport { TextDynamics } from './textdynamics';\nimport { TextNote } from './textnote';\nimport { TickContext } from './tickcontext';\nimport { TimeSigNote } from './timesignote';\nimport { Tuplet } from './tuplet';\nimport { defined, log, RuntimeError } from './util';\nimport { VibratoBracket } from './vibratobracket';\nimport { Voice } from './voice';\nimport { isHTMLCanvas } from './web';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Factory.DEBUG)\n log('Vex.Flow.Factory', args);\n}\n/**\n * Factory implements a high level API around VexFlow.\n */\nexport class Factory {\n /**\n * Example:\n *\n * Create an SVG renderer and attach it to the DIV element named \"boo\" to render using 1200 and 600\n *\n * `const vf: Factory = new Vex.Flow.Factory({renderer: { elementId: 'boo', width: 1200, height: 600 }});`\n */\n constructor(options = {}) {\n L('New factory: ', options);\n this.options = {\n stave: {\n space: 10,\n },\n renderer: {\n elementId: '',\n width: 500,\n height: 200,\n background: '#FFF',\n },\n font: Factory.TEXT_FONT,\n };\n this.setOptions(options);\n }\n /**\n * Static simplified function to access constructor without providing FactoryOptions\n *\n * Example:\n *\n * Create an SVG renderer and attach it to the DIV element named \"boo\" to render using 1200 and 600\n *\n * `const vf: Factory = Vex.Flow.Factory.newFromElementId('boo', 1200, 600 );`\n */\n static newFromElementId(elementId, width = 500, height = 200) {\n return new Factory({ renderer: { elementId, width, height } });\n }\n reset() {\n this.renderQ = [];\n this.systems = [];\n this.staves = [];\n this.voices = [];\n this.stave = undefined; // current stave\n }\n setOptions(options) {\n this.options = Object.assign(Object.assign({}, this.options), options);\n this.initRenderer();\n this.reset();\n }\n initRenderer() {\n const { elementId, width, height, background } = this.options.renderer;\n if (elementId == null) {\n return;\n }\n if (elementId == '') {\n L(this);\n throw new RuntimeError('renderer.elementId not set in FactoryOptions');\n }\n let backend = this.options.renderer.backend;\n if (backend === undefined) {\n const elem = document.getElementById(elementId);\n // We use a custom type check here, because node-canvas mimics canvas,\n // but is not an instance of window.HTMLCanvasElement.\n // In fact, `window` might be undefined here.\n // See: https://www.npmjs.com/package/canvas\n if (isHTMLCanvas(elem)) {\n backend = Renderer.Backends.CANVAS;\n }\n else {\n backend = Renderer.Backends.SVG;\n }\n }\n this.context = Renderer.buildContext(elementId, backend, width, height, background);\n }\n getContext() {\n return this.context;\n }\n setContext(context) {\n this.context = context;\n return this;\n }\n getStave() {\n return this.stave;\n }\n getVoices() {\n return this.voices;\n }\n /** Return pixels from current stave spacing. */\n Stave(params) {\n const staveSpace = this.options.stave.space;\n const p = Object.assign({ x: 0, y: 0, width: this.options.renderer.width - staveSpace * 1.0, options: { spacing_between_lines_px: staveSpace * 1.0 } }, params);\n const stave = new Stave(p.x, p.y, p.width, p.options);\n this.staves.push(stave);\n stave.setContext(this.context);\n this.stave = stave;\n return stave;\n }\n TabStave(params) {\n const staveSpace = this.options.stave.space;\n const p = Object.assign({ x: 0, y: 0, width: this.options.renderer.width - staveSpace * 1.0, options: { spacing_between_lines_px: staveSpace * 1.3 } }, params);\n const stave = new TabStave(p.x, p.y, p.width, p.options);\n this.staves.push(stave);\n stave.setContext(this.context);\n this.stave = stave;\n return stave;\n }\n StaveNote(noteStruct) {\n const note = new StaveNote(noteStruct);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n GlyphNote(glyph, noteStruct, options) {\n const note = new GlyphNote(glyph, noteStruct, options);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n RepeatNote(type, noteStruct, options) {\n const note = new RepeatNote(type, noteStruct, options);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n GhostNote(noteStruct) {\n const ghostNote = new GhostNote(noteStruct);\n if (this.stave)\n ghostNote.setStave(this.stave);\n ghostNote.setContext(this.context);\n this.renderQ.push(ghostNote);\n return ghostNote;\n }\n TextNote(noteStruct) {\n const textNote = new TextNote(noteStruct);\n if (this.stave)\n textNote.setStave(this.stave);\n textNote.setContext(this.context);\n this.renderQ.push(textNote);\n return textNote;\n }\n BarNote(params = {}) {\n const barNote = new BarNote(params.type);\n if (this.stave)\n barNote.setStave(this.stave);\n barNote.setContext(this.context);\n this.renderQ.push(barNote);\n return barNote;\n }\n ClefNote(params) {\n const p = Object.assign({ type: 'treble', options: {\n size: 'default',\n annotation: undefined,\n } }, params);\n const clefNote = new ClefNote(p.type, p.options.size, p.options.annotation);\n if (this.stave)\n clefNote.setStave(this.stave);\n clefNote.setContext(this.context);\n this.renderQ.push(clefNote);\n return clefNote;\n }\n TimeSigNote(params) {\n const p = Object.assign({ time: '4/4' }, params);\n const timeSigNote = new TimeSigNote(p.time);\n if (this.stave)\n timeSigNote.setStave(this.stave);\n timeSigNote.setContext(this.context);\n this.renderQ.push(timeSigNote);\n return timeSigNote;\n }\n KeySigNote(params) {\n const keySigNote = new KeySigNote(params.key, params.cancelKey, params.alterKey);\n if (this.stave)\n keySigNote.setStave(this.stave);\n keySigNote.setContext(this.context);\n this.renderQ.push(keySigNote);\n return keySigNote;\n }\n TabNote(noteStruct) {\n const note = new TabNote(noteStruct);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n GraceNote(noteStruct) {\n const note = new GraceNote(noteStruct);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n return note;\n }\n GraceNoteGroup(params) {\n const group = new GraceNoteGroup(params.notes, params.slur);\n group.setContext(this.context);\n return group;\n }\n Accidental(params) {\n const accid = new Accidental(params.type);\n accid.setContext(this.context);\n return accid;\n }\n Annotation(params) {\n const p = Object.assign({ text: 'p', hJustify: AnnotationHorizontalJustify.CENTER, vJustify: AnnotationVerticalJustify.BOTTOM }, params);\n const annotation = new Annotation(p.text);\n annotation.setJustification(p.hJustify);\n annotation.setVerticalJustification(p.vJustify);\n annotation.setFont(p.font);\n annotation.setContext(this.context);\n return annotation;\n }\n ChordSymbol(params) {\n const p = Object.assign({ vJustify: 'top', hJustify: 'center', kerning: true, reportWidth: true }, params);\n const chordSymbol = new ChordSymbol();\n chordSymbol.setHorizontal(p.hJustify);\n chordSymbol.setVertical(p.vJustify);\n chordSymbol.setEnableKerning(p.kerning);\n chordSymbol.setReportWidth(p.reportWidth);\n // There is a default font based on the engraving font. Only set then\n // font if it is specific, else use the default\n if (typeof p.fontFamily === 'string' && typeof p.fontSize === 'number') {\n if (typeof p.fontWeight === 'string')\n chordSymbol.setFont(p.fontFamily, p.fontSize, p.fontWeight);\n else\n chordSymbol.setFont(p.fontFamily, p.fontSize, '');\n }\n else if (typeof p.fontSize === 'number') {\n chordSymbol.setFontSize(p.fontSize);\n }\n chordSymbol.setContext(this.context);\n return chordSymbol;\n }\n Articulation(params) {\n const p = Object.assign({ type: 'a.', position: 'above' }, params);\n const articulation = new Articulation(p.type);\n articulation.setPosition(p.position);\n articulation.setContext(this.context);\n return articulation;\n }\n TextDynamics(params) {\n const p = Object.assign({ text: 'p', duration: 'q', dots: 0, line: 0 }, params);\n const text = new TextDynamics({\n text: p.text,\n line: p.line,\n duration: p.duration,\n dots: p.dots,\n });\n if (this.stave)\n text.setStave(this.stave);\n text.setContext(this.context);\n this.renderQ.push(text);\n return text;\n }\n Fingering(params) {\n const p = Object.assign({ number: '0', position: 'left' }, params);\n const fingering = new FretHandFinger(p.number);\n fingering.setPosition(p.position);\n fingering.setContext(this.context);\n return fingering;\n }\n StringNumber(params) {\n const stringNumber = new StringNumber(params.number);\n stringNumber.setPosition(params.position);\n stringNumber.setContext(this.context);\n return stringNumber;\n }\n TickContext() {\n return new TickContext();\n }\n ModifierContext() {\n return new ModifierContext();\n }\n MultiMeasureRest(params) {\n const numMeasures = defined(params.number_of_measures, 'NoNumberOfMeasures');\n const multiMeasureRest = new MultiMeasureRest(numMeasures, params);\n multiMeasureRest.setContext(this.context);\n this.renderQ.push(multiMeasureRest);\n return multiMeasureRest;\n }\n Voice(params) {\n const p = Object.assign({ time: '4/4' }, params);\n const voice = new Voice(p.time, p.options);\n this.voices.push(voice);\n return voice;\n }\n StaveConnector(params) {\n const connector = new StaveConnector(params.top_stave, params.bottom_stave);\n connector.setType(params.type).setContext(this.context);\n this.renderQ.push(connector);\n return connector;\n }\n Formatter(options) {\n return new Formatter(options);\n }\n Tuplet(params) {\n const p = Object.assign({ notes: [], options: {} }, params);\n const tuplet = new Tuplet(p.notes, p.options).setContext(this.context);\n this.renderQ.push(tuplet);\n return tuplet;\n }\n Beam(params) {\n var _a, _b, _c;\n const beam = new Beam(params.notes, (_a = params.options) === null || _a === void 0 ? void 0 : _a.autoStem).setContext(this.context);\n beam.breakSecondaryAt((_c = (_b = params.options) === null || _b === void 0 ? void 0 : _b.secondaryBeamBreaks) !== null && _c !== void 0 ? _c : []);\n this.renderQ.push(beam);\n return beam;\n }\n Curve(params) {\n const curve = new Curve(params.from, params.to, params.options).setContext(this.context);\n this.renderQ.push(curve);\n return curve;\n }\n StaveTie(params) {\n var _a;\n const tie = new StaveTie({\n first_note: params.from,\n last_note: params.to,\n first_indices: params.first_indices,\n last_indices: params.last_indices,\n }, params.text);\n if ((_a = params.options) === null || _a === void 0 ? void 0 : _a.direction)\n tie.setDirection(params.options.direction);\n tie.setContext(this.context);\n this.renderQ.push(tie);\n return tie;\n }\n StaveLine(params) {\n var _a, _b;\n const line = new StaveLine({\n first_note: params.from,\n last_note: params.to,\n first_indices: params.first_indices,\n last_indices: params.last_indices,\n });\n if ((_a = params.options) === null || _a === void 0 ? void 0 : _a.text)\n line.setText(params.options.text);\n if ((_b = params.options) === null || _b === void 0 ? void 0 : _b.font)\n line.setFont(params.options.font);\n line.setContext(this.context);\n this.renderQ.push(line);\n return line;\n }\n VibratoBracket(params) {\n const vibratoBracket = new VibratoBracket({\n start: params.from,\n stop: params.to,\n });\n if (params.options.line)\n vibratoBracket.setLine(params.options.line);\n if (params.options.harsh)\n vibratoBracket.setHarsh(params.options.harsh);\n vibratoBracket.setContext(this.context);\n this.renderQ.push(vibratoBracket);\n return vibratoBracket;\n }\n TextBracket(params) {\n const textBracket = new TextBracket({\n start: params.from,\n stop: params.to,\n text: params.text,\n superscript: params.options.superscript,\n position: params.options.position,\n });\n if (params.options.line)\n textBracket.setLine(params.options.line);\n if (params.options.font)\n textBracket.setFont(params.options.font);\n textBracket.setContext(this.context);\n this.renderQ.push(textBracket);\n return textBracket;\n }\n System(params = {}) {\n params.factory = this;\n const system = new System(params).setContext(this.context);\n this.systems.push(system);\n return system;\n }\n /**\n * Creates EasyScore. Normally the first step after constructing a Factory. For example:\n * ```\n * const vf: Factory = new Vex.Flow.Factory({renderer: { elementId: 'boo', width: 1200, height: 600 }});\n * const score: EasyScore = vf.EasyScore();\n * ```\n * @param options.factory optional instance of Factory\n * @param options.builder instance of Builder\n * @param options.commitHooks function to call after a note element is created\n * @param options.throwOnError throw error in case of parsing error\n */\n EasyScore(options = {}) {\n options.factory = this;\n return new EasyScore(options);\n }\n PedalMarking(params) {\n const p = Object.assign({ notes: [], options: {\n style: 'mixed',\n } }, params);\n const pedal = new PedalMarking(p.notes);\n pedal.setType(PedalMarking.typeString[p.options.style]);\n pedal.setContext(this.context);\n this.renderQ.push(pedal);\n return pedal;\n }\n NoteSubGroup(params) {\n const p = Object.assign({ notes: [] }, params);\n const group = new NoteSubGroup(p.notes);\n group.setContext(this.context);\n return group;\n }\n /** Render the score. */\n draw() {\n const ctx = this.context;\n this.systems.forEach((s) => s.setContext(ctx).format());\n this.staves.forEach((s) => s.setContext(ctx).draw());\n this.voices.forEach((v) => v.setContext(ctx).draw());\n this.renderQ.forEach((e) => {\n if (!e.isRendered())\n e.setContext(ctx).draw();\n });\n this.systems.forEach((s) => s.setContext(ctx).draw());\n this.reset();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Factory.DEBUG` to `true`. */\nFactory.DEBUG = false;\n/** Default text font. */\nFactory.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// Author: Raffaele Viglianti, 2012 http://itisnotsound.wordpress.com/\n//\n// This class implements hairpins between notes.\n// Hairpins can be either crescendo or decrescendo.\nimport { Element } from './element';\nimport { Modifier } from './modifier';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StaveHairpin extends Element {\n /**\n * Create a new hairpin from the specified notes.\n *\n * @param {!Object} notes The notes to tie up.\n * Notes is a struct that has:\n *\n * {\n * first_note: Note,\n * last_note: Note,\n * }\n * @param {!Object} type The type of hairpin\n */\n constructor(notes, type) {\n super();\n this.setNotes(notes);\n this.hairpin = type;\n this.position = Modifier.Position.BELOW;\n this.render_options = {\n height: 10,\n y_shift: 0,\n left_shift_px: 0,\n right_shift_px: 0,\n right_shift_ticks: 0,\n left_shift_ticks: 0,\n };\n }\n static get CATEGORY() {\n return Category.StaveHairpin;\n }\n /* Helper function to convert ticks into pixels.\n * Requires a Formatter with voices joined and formatted (to\n * get pixels per tick)\n *\n * options is struct that has:\n *\n * {\n * height: px,\n * y_shift: px, // vertical offset\n * left_shift_ticks: 0, // left horizontal offset expressed in ticks\n * right_shift_ticks: 0 // right horizontal offset expressed in ticks\n * }\n *\n **/\n static FormatByTicksAndDraw(ctx, formatter, notes, type, position, options) {\n var _a, _b;\n const ppt = formatter.pixelsPerTick;\n if (ppt == null) {\n throw new RuntimeError('BadArguments', 'A valid Formatter must be provide to draw offsets by ticks.');\n }\n const l_shift_px = ppt * ((_a = options.left_shift_ticks) !== null && _a !== void 0 ? _a : 0);\n const r_shift_px = ppt * ((_b = options.right_shift_ticks) !== null && _b !== void 0 ? _b : 0);\n const hairpin_options = {\n height: options.height,\n y_shift: options.y_shift,\n left_shift_px: l_shift_px,\n right_shift_px: r_shift_px,\n right_shift_ticks: 0,\n left_shift_ticks: 0,\n };\n new StaveHairpin({\n first_note: notes.first_note,\n last_note: notes.last_note,\n }, type)\n .setContext(ctx)\n .setRenderOptions(hairpin_options)\n .setPosition(position)\n .draw();\n }\n setPosition(position) {\n if (position === Modifier.Position.ABOVE || position === Modifier.Position.BELOW) {\n this.position = position;\n }\n return this;\n }\n setRenderOptions(options) {\n if (options.height != null &&\n options.y_shift != null &&\n options.left_shift_px != null &&\n options.right_shift_px != null) {\n this.render_options = options;\n }\n return this;\n }\n /**\n * Set the notes to attach this hairpin to.\n *\n * @param {!Object} notes The start and end notes.\n */\n setNotes(notes) {\n if (!notes.first_note && !notes.last_note) {\n throw new RuntimeError('BadArguments', 'Hairpin needs to have either first_note or last_note set.');\n }\n this.notes = notes;\n this.first_note = notes.first_note;\n this.last_note = notes.last_note;\n return this;\n }\n renderHairpin(params) {\n const ctx = this.checkContext();\n let dis = this.render_options.y_shift + 20;\n let y_shift = params.first_y;\n if (this.position === Modifier.Position.ABOVE) {\n dis = -dis + 30;\n y_shift = params.first_y - params.staff_height;\n }\n const l_shift = this.render_options.left_shift_px;\n const r_shift = this.render_options.right_shift_px;\n ctx.beginPath();\n switch (this.hairpin) {\n case StaveHairpin.type.CRESC:\n ctx.moveTo(params.last_x + r_shift, y_shift + dis);\n ctx.lineTo(params.first_x + l_shift, y_shift + this.render_options.height / 2 + dis);\n ctx.lineTo(params.last_x + r_shift, y_shift + this.render_options.height + dis);\n break;\n case StaveHairpin.type.DECRESC:\n ctx.moveTo(params.first_x + l_shift, y_shift + dis);\n ctx.lineTo(params.last_x + r_shift, y_shift + this.render_options.height / 2 + dis);\n ctx.lineTo(params.first_x + l_shift, y_shift + this.render_options.height + dis);\n break;\n default:\n // Default is NONE, so nothing to draw\n break;\n }\n ctx.stroke();\n ctx.closePath();\n }\n draw() {\n this.checkContext();\n this.setRendered();\n const firstNote = this.first_note;\n const lastNote = this.last_note;\n if (!firstNote || !lastNote)\n throw new RuntimeError('NoNote', 'Notes required to draw');\n const start = firstNote.getModifierStartXY(this.position, 0);\n const end = lastNote.getModifierStartXY(this.position, 0);\n this.renderHairpin({\n first_x: start.x,\n last_x: end.x,\n first_y: firstNote.checkStave().getY() + firstNote.checkStave().getHeight(),\n last_y: lastNote.checkStave().getY() + lastNote.checkStave().getHeight(),\n staff_height: firstNote.checkStave().getHeight(),\n });\n }\n}\nStaveHairpin.type = {\n CRESC: 1,\n DECRESC: 2,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// This class implements varies types of ties between contiguous notes. The\n// ties include: regular ties, hammer ons, pull offs, and slides.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { TabTie } from './tabtie';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class TabSlide extends TabTie {\n /**\n * @param notes is a struct of the form:\n * {\n * first_note: Note,\n * last_note: Note,\n * first_indices: [n1, n2, n3],\n * last_indices: [n1, n2, n3]\n * }\n * @param notes.first_note the starting note of the slide\n * @param notes.last_note the ending note of the slide\n * @param notes.first_indices specifies which string + fret positions of the TabNote are used in this slide. zero indexed.\n * @param notes.last_indices currently unused. we assume it's the same as first_indices.\n *\n * @param direction TabSlide.SLIDE_UP or TabSlide.SLIDE_DOWN\n */\n constructor(notes, direction) {\n super(notes, 'sl.');\n // Determine the direction automatically if it is not provided.\n if (!direction) {\n let first_fret = notes.first_note.getPositions()[0].fret;\n if (typeof first_fret === 'string') {\n first_fret = parseInt(first_fret, 10);\n }\n let last_fret = notes.last_note.getPositions()[0].fret;\n if (typeof last_fret === 'string') {\n last_fret = parseInt(last_fret, 10);\n }\n // If either of the frets are 'X', parseInt() above will return NaN.\n // Choose TabSlide.SLIDE_UP by default.\n if (isNaN(first_fret) || isNaN(last_fret)) {\n direction = TabSlide.SLIDE_UP;\n }\n else {\n direction = first_fret > last_fret ? TabSlide.SLIDE_DOWN : TabSlide.SLIDE_UP;\n }\n }\n this.direction = direction;\n this.render_options.cp1 = 11;\n this.render_options.cp2 = 14;\n this.render_options.y_shift = 0.5;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.TabSlide;\n }\n static get SLIDE_UP() {\n return 1;\n }\n static get SLIDE_DOWN() {\n return -1;\n }\n static createSlideUp(notes) {\n return new TabSlide(notes, TabSlide.SLIDE_UP);\n }\n static createSlideDown(notes) {\n return new TabSlide(notes, TabSlide.SLIDE_DOWN);\n }\n renderTie(params) {\n if (params.first_ys.length === 0 || params.last_ys.length === 0) {\n throw new RuntimeError('BadArguments', 'No Y-values to render');\n }\n const ctx = this.checkContext();\n const first_x_px = params.first_x_px;\n const first_ys = params.first_ys;\n const last_x_px = params.last_x_px;\n const direction = params.direction;\n if (direction !== TabSlide.SLIDE_UP && direction !== TabSlide.SLIDE_DOWN) {\n throw new RuntimeError('BadSlide', 'Invalid slide direction');\n }\n // eslint-disable-next-line\n const first_indices = this.notes.first_indices;\n for (let i = 0; i < first_indices.length; ++i) {\n const slide_y = first_ys[first_indices[i]] + this.render_options.y_shift;\n if (isNaN(slide_y)) {\n throw new RuntimeError('BadArguments', 'Bad indices for slide rendering.');\n }\n ctx.beginPath();\n ctx.moveTo(first_x_px, slide_y + 3 * direction);\n ctx.lineTo(last_x_px, slide_y - 3 * direction);\n ctx.closePath();\n ctx.stroke();\n }\n this.setRendered();\n }\n}\nTabSlide.TEXT_FONT = {\n family: Font.SERIF,\n size: 10,\n weight: FontWeight.BOLD,\n style: FontStyle.ITALIC,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Tables } from './tables';\nimport { RuntimeError } from './util';\n/** `Tuning` implements varies types of tunings for tablature. */\nexport class Tuning {\n /**\n * Constructor.\n * @param tuningString tuning name (eg. 'dagdad') or comma separated note strings\n */\n constructor(tuningString = 'E/5,B/4,G/4,D/4,A/3,E/3,B/2,E/2') {\n this.tuningValues = [];\n // Default to standard tuning.\n this.setTuning(tuningString);\n }\n static get names() {\n return {\n standard: 'E/5,B/4,G/4,D/4,A/3,E/3',\n dagdad: 'D/5,A/4,G/4,D/4,A/3,D/3',\n dropd: 'E/5,B/4,G/4,D/4,A/3,D/3',\n eb: 'Eb/5,Bb/4,Gb/4,Db/4,Ab/3,Db/3',\n standardBanjo: 'D/5,B/4,G/4,D/4,G/5',\n };\n }\n /** Return the note number associated to the note string. */\n noteToInteger(noteString) {\n return Tables.keyProperties(noteString).int_value;\n }\n /**\n * Set tuning identified by tuning name (eg. 'dagdad')\n * @param tuningString tuning name (eg. 'dagdad') or comma separated note strings\n */\n setTuning(tuningString) {\n if (Tuning.names[tuningString]) {\n tuningString = Tuning.names[tuningString];\n }\n this.tuningValues = [];\n const keys = tuningString.split(/\\s*,\\s*/);\n if (keys.length === 0) {\n throw new RuntimeError('BadArguments', `Invalid tuning string: ${tuningString}`);\n }\n for (let i = 0; i < keys.length; ++i) {\n this.tuningValues[i] = this.noteToInteger(keys[i]);\n }\n }\n /** Return the note number associated with a tablature string. */\n getValueForString(stringNum) {\n const s = Number(stringNum);\n if (s < 1 || s > this.tuningValues.length) {\n throw new RuntimeError('BadArguments', `String number must be between 1 and ${this.tuningValues.length}:${stringNum}`);\n }\n return this.tuningValues[s - 1];\n }\n /** Return the note number associated with a tablature string and fret. */\n getValueForFret(fretNum, stringNum) {\n const stringValue = this.getValueForString(stringNum);\n const f = Number(fretNum);\n if (f < 0) {\n throw new RuntimeError('BadArguments', `Fret number must be 0 or higher: ${fretNum}`);\n }\n return stringValue + f;\n }\n /** Return the note string associated with tablature string and fret. */\n getNoteForFret(fretNum, stringNum) {\n const noteValue = this.getValueForFret(fretNum, stringNum);\n const octave = Math.floor(noteValue / 12);\n const value = noteValue % 12;\n return `${Tables.integerToNote(value)}/${octave}`;\n }\n}\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { Accidental } from './accidental';\nimport { Annotation } from './annotation';\nimport { Articulation } from './articulation';\nimport { BarNote } from './barnote';\nimport { Beam } from './beam';\nimport { Bend } from './bend';\nimport { BoundingBox } from './boundingbox';\nimport { BoundingBoxComputation } from './boundingboxcomputation';\nimport { CanvasContext } from './canvascontext';\nimport { ChordSymbol } from './chordsymbol';\nimport { Clef } from './clef';\nimport { ClefNote } from './clefnote';\nimport { Crescendo } from './crescendo';\nimport { Curve } from './curve';\nimport { Dot } from './dot';\nimport { EasyScore } from './easyscore';\nimport { Element } from './element';\nimport { Factory } from './factory';\nimport { Font } from './font';\nimport { Formatter } from './formatter';\nimport { Fraction } from './fraction';\nimport { FretHandFinger } from './frethandfinger';\nimport { GhostNote } from './ghostnote';\nimport { Glyph } from './glyph';\nimport { GlyphNote } from './glyphnote';\nimport { GraceNote } from './gracenote';\nimport { GraceNoteGroup } from './gracenotegroup';\nimport { GraceTabNote } from './gracetabnote';\nimport { KeyManager } from './keymanager';\nimport { KeySignature } from './keysignature';\nimport { KeySigNote } from './keysignote';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { ModifierContext } from './modifiercontext';\nimport { MultiMeasureRest } from './multimeasurerest';\nimport { Music } from './music';\nimport { Note } from './note';\nimport { NoteHead } from './notehead';\nimport { NoteSubGroup } from './notesubgroup';\nimport { Ornament } from './ornament';\nimport { Parenthesis } from './parenthesis';\nimport { Parser } from './parser';\nimport { PedalMarking } from './pedalmarking';\nimport { Registry } from './registry';\nimport { RenderContext } from './rendercontext';\nimport { Renderer } from './renderer';\nimport { RepeatNote } from './repeatnote';\nimport { Stave } from './stave';\nimport { Barline, BarlineType } from './stavebarline';\nimport { StaveConnector } from './staveconnector';\nimport { StaveHairpin } from './stavehairpin';\nimport { StaveLine } from './staveline';\nimport { StaveModifier } from './stavemodifier';\nimport { StaveNote } from './stavenote';\nimport { Repetition } from './staverepetition';\nimport { StaveTempo } from './stavetempo';\nimport { StaveText } from './stavetext';\nimport { StaveTie } from './stavetie';\nimport { Volta } from './stavevolta';\nimport { Stem } from './stem';\nimport { StringNumber } from './stringnumber';\nimport { Stroke } from './strokes';\nimport { SVGContext } from './svgcontext';\nimport { System } from './system';\nimport { Tables } from './tables';\nimport { TabNote } from './tabnote';\nimport { TabSlide } from './tabslide';\nimport { TabStave } from './tabstave';\nimport { TabTie } from './tabtie';\nimport { TextBracket } from './textbracket';\nimport { TextDynamics } from './textdynamics';\nimport { TextFormatter } from './textformatter';\nimport { TextNote } from './textnote';\nimport { TickContext } from './tickcontext';\nimport { TimeSignature } from './timesignature';\nimport { TimeSigNote } from './timesignote';\nimport { Tremolo } from './tremolo';\nimport { Tuning } from './tuning';\nimport { Tuplet } from './tuplet';\nimport { DATE, ID, VERSION } from './version';\nimport { Vibrato } from './vibrato';\nimport { VibratoBracket } from './vibratobracket';\nimport { Voice } from './voice';\nexport class Flow {\n static get BUILD() {\n return {\n /** version number. */\n VERSION: VERSION,\n /** git commit ID that this library was built from. */\n ID: ID,\n /** The date when this library was compiled. */\n DATE: DATE,\n };\n }\n static get Flow() {\n // This (circular reference) provides a handy shortcut for importing VexFlow via `require()`.\n // For example:\n // const Vex = require('vexflow');\n // const { Flow, Stave, StaveNote, Formatter, Renderer } = Vex.Flow;\n return Flow;\n }\n // ... more to come ...\n /**\n * Examples:\n * ```\n * Vex.Flow.setMusicFont('Petaluma');\n * Vex.Flow.setMusicFont('Bravura', 'Gonville');\n * ```\n *\n * **CASE 1**: You are using `vexflow.js`, which includes all music fonts (Bravura, Gonville, Petaluma, Custom).\n * In this case, calling this method is optional, since VexFlow already defaults to a music font stack of:\n * 'Bravura', 'Gonville', 'Custom'.\n *\n * **CASE 2**: You are using `vexflow-bravura.js` or `vexflow-petaluma.js` or `vexflow-gonville.js`,\n * which includes a single music font. Calling this method is unnecessary.\n *\n * **CASE 3**: You are using the light weight `vexflow-core.js` to take advantage of lazy loading for fonts.\n * In this case, the default music font stack is empty.\n * Example:\n * ```\n * await Vex.Flow.fetchMusicFont('Petaluma');\n * Vex.Flow.setMusicFont('Petaluma');\n * ... (do VexFlow stuff) ...\n * ```\n * See `demos/fonts/` for more examples.\n *\n * @returns an array of Font objects corresponding to the provided `fontNames`.\n */\n static setMusicFont(...fontNames) {\n // Convert the array of font names into an array of Font objects.\n const fonts = fontNames.map((fontName) => Font.load(fontName));\n Tables.MUSIC_FONT_STACK = fonts;\n Glyph.MUSIC_FONT_STACK = fonts.slice();\n Glyph.CURRENT_CACHE_KEY = fontNames.join(',');\n return fonts;\n }\n /**\n * Used with vexflow-core which supports dynamic font loading.\n */\n // eslint-disable-next-line\n static fetchMusicFont(fontName, fontModuleOrPath) {\n return __awaiter(this, void 0, void 0, function* () {\n // The default implementation does nothing.\n // See vexflow-core.ts for the implementation that vexflow-core.js uses.\n });\n }\n static getMusicFont() {\n const fonts = Tables.MUSIC_FONT_STACK;\n return fonts.map((font) => font.getName());\n }\n static get NOTATION_FONT_SCALE() {\n return Tables.NOTATION_FONT_SCALE;\n }\n static set NOTATION_FONT_SCALE(value) {\n Tables.NOTATION_FONT_SCALE = value;\n }\n static get TABLATURE_FONT_SCALE() {\n return Tables.TABLATURE_FONT_SCALE;\n }\n static set TABLATURE_FONT_SCALE(value) {\n Tables.TABLATURE_FONT_SCALE = value;\n }\n static get RESOLUTION() {\n return Tables.RESOLUTION;\n }\n static set RESOLUTION(value) {\n Tables.RESOLUTION = value;\n }\n static get SLASH_NOTEHEAD_WIDTH() {\n return Tables.SLASH_NOTEHEAD_WIDTH;\n }\n static set SLASH_NOTEHEAD_WIDTH(value) {\n Tables.SLASH_NOTEHEAD_WIDTH = value;\n }\n static get STAVE_LINE_DISTANCE() {\n return Tables.STAVE_LINE_DISTANCE;\n }\n static set STAVE_LINE_DISTANCE(value) {\n Tables.STAVE_LINE_DISTANCE = value;\n }\n static get STAVE_LINE_THICKNESS() {\n return Tables.STAVE_LINE_THICKNESS;\n }\n static set STAVE_LINE_THICKNESS(value) {\n Tables.STAVE_LINE_THICKNESS = value;\n }\n static get STEM_HEIGHT() {\n return Tables.STEM_HEIGHT;\n }\n static set STEM_HEIGHT(value) {\n Tables.STEM_HEIGHT = value;\n }\n static get STEM_WIDTH() {\n return Tables.STEM_WIDTH;\n }\n static set STEM_WIDTH(value) {\n Tables.STEM_WIDTH = value;\n }\n static get TIME4_4() {\n return Tables.TIME4_4;\n }\n static get accidentalMap() {\n return Tables.accidentalMap;\n }\n static get unicode() {\n return Tables.unicode;\n }\n static keySignature(spec) {\n return Tables.keySignature(spec);\n }\n static hasKeySignature(spec) {\n return Tables.hasKeySignature(spec);\n }\n static getKeySignatures() {\n return Tables.getKeySignatures();\n }\n static clefProperties(clef) {\n return Tables.clefProperties(clef);\n }\n // eslint-disable-next-line\n static keyProperties(key, clef, params) {\n return Tables.keyProperties(key, clef, params);\n }\n static durationToTicks(duration) {\n return Tables.durationToTicks(duration);\n }\n}\nFlow.Accidental = Accidental;\nFlow.Annotation = Annotation;\nFlow.Articulation = Articulation;\nFlow.Barline = Barline;\nFlow.BarNote = BarNote;\nFlow.Beam = Beam;\nFlow.Bend = Bend;\nFlow.BoundingBox = BoundingBox;\nFlow.BoundingBoxComputation = BoundingBoxComputation;\nFlow.CanvasContext = CanvasContext;\nFlow.ChordSymbol = ChordSymbol;\nFlow.Clef = Clef;\nFlow.ClefNote = ClefNote;\nFlow.Crescendo = Crescendo;\nFlow.Curve = Curve;\nFlow.Dot = Dot;\nFlow.EasyScore = EasyScore;\nFlow.Element = Element;\nFlow.Factory = Factory;\nFlow.Font = Font;\nFlow.Formatter = Formatter;\nFlow.Fraction = Fraction;\nFlow.FretHandFinger = FretHandFinger;\nFlow.GhostNote = GhostNote;\nFlow.Glyph = Glyph;\nFlow.GlyphNote = GlyphNote;\nFlow.GraceNote = GraceNote;\nFlow.GraceNoteGroup = GraceNoteGroup;\nFlow.GraceTabNote = GraceTabNote;\nFlow.KeyManager = KeyManager;\nFlow.KeySignature = KeySignature;\nFlow.KeySigNote = KeySigNote;\nFlow.Modifier = Modifier;\nFlow.ModifierContext = ModifierContext;\nFlow.MultiMeasureRest = MultiMeasureRest;\nFlow.Music = Music;\nFlow.Note = Note;\nFlow.NoteHead = NoteHead;\nFlow.NoteSubGroup = NoteSubGroup;\nFlow.Ornament = Ornament;\nFlow.Parenthesis = Parenthesis;\nFlow.Parser = Parser;\nFlow.PedalMarking = PedalMarking;\nFlow.Registry = Registry;\nFlow.RenderContext = RenderContext;\nFlow.Renderer = Renderer;\nFlow.RepeatNote = RepeatNote;\nFlow.Repetition = Repetition;\nFlow.Stave = Stave;\nFlow.StaveConnector = StaveConnector;\nFlow.StaveHairpin = StaveHairpin;\nFlow.StaveLine = StaveLine;\nFlow.StaveModifier = StaveModifier;\nFlow.StaveNote = StaveNote;\nFlow.StaveTempo = StaveTempo;\nFlow.StaveText = StaveText;\nFlow.StaveTie = StaveTie;\nFlow.Stem = Stem;\nFlow.StringNumber = StringNumber;\nFlow.Stroke = Stroke;\nFlow.SVGContext = SVGContext;\nFlow.System = System;\nFlow.TabNote = TabNote;\nFlow.TabSlide = TabSlide;\nFlow.TabStave = TabStave;\nFlow.TabTie = TabTie;\nFlow.TextBracket = TextBracket;\nFlow.TextDynamics = TextDynamics;\nFlow.TextFormatter = TextFormatter;\nFlow.TextNote = TextNote;\nFlow.TickContext = TickContext;\nFlow.TimeSignature = TimeSignature;\nFlow.TimeSigNote = TimeSigNote;\nFlow.Tremolo = Tremolo;\nFlow.Tuning = Tuning;\nFlow.Tuplet = Tuplet;\nFlow.Vibrato = Vibrato;\nFlow.VibratoBracket = VibratoBracket;\nFlow.Voice = Voice;\nFlow.Volta = Volta;\n// enums need to be exported too!\nFlow.BarlineType = BarlineType;\nFlow.ModifierPosition = ModifierPosition;\n","export const VERSION = '4.0.1-alpha.2';\nexport const ID = '0df10df6d1fab3a99f5aa306341a31c6e686d659';\nexport const DATE = '2022-02-02T09:30:30.784Z';\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Balazs Forian-Szabo\n//\n// ## Description\n//\n// A basic implementation of grace notes\n// to be rendered on a tab stave.\n//\n// See `tests/gracetabnote_tests.ts` for usage examples.\nimport { Font } from './font';\nimport { TabNote } from './tabnote';\nimport { Category } from './typeguard';\nexport class GraceTabNote extends TabNote {\n static get CATEGORY() {\n return Category.GraceTabNote;\n }\n constructor(noteStruct) {\n super(noteStruct, false);\n this.render_options = Object.assign(Object.assign({}, this.render_options), { \n // vertical shift from stave line\n y_shift: 0.3, \n // grace glyph scale\n scale: 0.6, \n // grace tablature font\n font: `7.5pt ${Font.SANS_SERIF}` });\n this.updateWidth();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This class implements diatonic key management.\nimport { Music } from './music';\nimport { RuntimeError } from './util';\nexport class KeyManager {\n constructor(key) {\n this.music = new Music();\n this.setKey(key);\n }\n setKey(key) {\n this.key = key;\n this.reset();\n return this;\n }\n getKey() {\n return this.key;\n }\n reset() {\n this.keyParts = this.music.getKeyParts(this.key);\n this.keyString = this.keyParts.root;\n if (this.keyParts.accidental)\n this.keyString += this.keyParts.accidental;\n const is_supported_type = Music.scaleTypes[this.keyParts.type];\n if (!is_supported_type) {\n throw new RuntimeError('BadArguments', `Unsupported key type: ${this.key}`);\n }\n this.scale = this.music.getScaleTones(this.music.getNoteValue(this.keyString), Music.scaleTypes[this.keyParts.type]);\n this.scaleMap = {};\n this.scaleMapByValue = {};\n this.originalScaleMapByValue = {};\n const noteLocation = Music.root_indices[this.keyParts.root];\n for (let i = 0; i < Music.roots.length; ++i) {\n const index = (noteLocation + i) % Music.roots.length;\n const rootName = Music.roots[index];\n const noteName = this.music.getRelativeNoteName(rootName, this.scale[i]);\n this.scaleMap[rootName] = noteName;\n this.scaleMapByValue[this.scale[i]] = noteName;\n this.originalScaleMapByValue[this.scale[i]] = noteName;\n }\n return this;\n }\n getAccidental(key) {\n const root = this.music.getKeyParts(key).root;\n const parts = this.music.getNoteParts(this.scaleMap[root]);\n return {\n note: this.scaleMap[root],\n accidental: parts.accidental,\n };\n }\n selectNote(note) {\n note = note.toLowerCase();\n const parts = this.music.getNoteParts(note);\n // First look for matching note in our altered scale\n const scaleNote = this.scaleMap[parts.root];\n const modparts = this.music.getNoteParts(scaleNote);\n if (scaleNote === note) {\n return {\n note: scaleNote,\n accidental: parts.accidental,\n change: false,\n };\n }\n // Then search for a note of equivalent value in our altered scale\n const valueNote = this.scaleMapByValue[this.music.getNoteValue(note)];\n if (valueNote != null) {\n return {\n note: valueNote,\n accidental: this.music.getNoteParts(valueNote).accidental,\n change: false,\n };\n }\n // Then search for a note of equivalent value in the original scale\n const originalValueNote = this.originalScaleMapByValue[this.music.getNoteValue(note)];\n if (originalValueNote != null) {\n this.scaleMap[modparts.root] = originalValueNote;\n delete this.scaleMapByValue[this.music.getNoteValue(scaleNote)];\n this.scaleMapByValue[this.music.getNoteValue(note)] = originalValueNote;\n return {\n note: originalValueNote,\n accidental: this.music.getNoteParts(originalValueNote).accidental,\n change: true,\n };\n }\n // Then try to unmodify a currently modified note.\n if (modparts.root === note) {\n delete this.scaleMapByValue[this.music.getNoteValue(this.scaleMap[parts.root])];\n this.scaleMapByValue[this.music.getNoteValue(modparts.root)] = modparts.root;\n this.scaleMap[modparts.root] = modparts.root;\n return {\n note: modparts.root,\n accidental: undefined,\n change: true,\n };\n }\n // Last resort -- shitshoot\n delete this.scaleMapByValue[this.music.getNoteValue(this.scaleMap[parts.root])];\n this.scaleMapByValue[this.music.getNoteValue(note)] = note;\n delete this.scaleMap[modparts.root];\n this.scaleMap[modparts.root] = note;\n return {\n note,\n accidental: parts.accidental,\n change: true,\n };\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Mike Corrigan \n// MIT License\nimport { Glyph } from './glyph';\nimport { GraceNote } from './gracenote';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category, isGraceNote } from './typeguard';\n/** Tremolo implements tremolo notation. */\nexport class Tremolo extends Modifier {\n /**\n * @param num number of bars\n */\n constructor(num) {\n super();\n this.num = num;\n this.position = Modifier.Position.CENTER;\n this.code = 'tremolo1';\n // big strokes scales initialised to 1 (no scale)\n this.y_spacing_scale = 1;\n this.extra_stroke_scale = 1;\n }\n static get CATEGORY() {\n return Category.Tremolo;\n }\n /** Draw the tremolo on the rendering context. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const stemDirection = note.getStemDirection();\n const start = note.getModifierStartXY(this.position, this.index);\n let x = start.x;\n const gn = isGraceNote(note);\n const scale = gn ? GraceNote.SCALE : 1;\n const category = `tremolo.${gn ? 'grace' : 'default'}`;\n const musicFont = Tables.currentMusicFont();\n let y_spacing = musicFont.lookupMetric(`${category}.spacing`) * stemDirection;\n // add y_spacing_scale for big strokes (#1258)\n y_spacing *= this.y_spacing_scale;\n const height = this.num * y_spacing;\n let y = note.getStemExtents().baseY - height;\n if (stemDirection < 0) {\n y += musicFont.lookupMetric(`${category}.offsetYStemDown`) * scale;\n }\n else {\n y += musicFont.lookupMetric(`${category}.offsetYStemUp`) * scale;\n }\n const fontScale = musicFont.lookupMetric(`${category}.point`);\n x += musicFont.lookupMetric(`${category}.offsetXStem${stemDirection === Stem.UP ? 'Up' : 'Down'}`);\n for (let i = 0; i < this.num; ++i) {\n Glyph.renderGlyph(ctx, x, y, fontScale, this.code, { category, scale: this.extra_stroke_scale });\n y += y_spacing;\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// Utility methods used by the rest of the VexFlow codebase.\nimport { Flow } from './flow';\nimport { log, RuntimeError } from './util';\nexport class Vex {\n // Users of `Vex.forEach(a, fn)` should use `Array.prototype.forEach()` instead.\n // static forEach(arr: T[], callbackFn: (value: T, index: number, array: T[]) => void) {\n // arr.forEach(callbackFn);\n // }\n /**\n * Take `arr` and return a new list consisting of the sorted, unique,\n * contents of arr. Does not modify `arr`.\n */\n // eslint-disable-next-line\n static sortAndUnique(arr, cmp, eq) {\n if (arr.length > 1) {\n const newArr = [];\n let last;\n arr.sort(cmp);\n for (let i = 0; i < arr.length; ++i) {\n if (i === 0 || !eq(arr[i], last)) {\n newArr.push(arr[i]);\n }\n last = arr[i];\n }\n return newArr;\n }\n else {\n return arr;\n }\n }\n /** Check if array `arr` contains `obj`. */\n // eslint-disable-next-line\n static contains(arr, obj) {\n let i = arr.length;\n while (i--) {\n if (arr[i] === obj) {\n return true;\n }\n }\n return false;\n }\n // Get the 2D Canvas context from DOM element `canvas_sel`.\n static getCanvasContext(canvasSelector) {\n if (!canvasSelector) {\n throw new RuntimeError('BadArgument', 'Invalid canvas selector: ' + canvasSelector);\n }\n const canvas = document.getElementById(canvasSelector);\n if (!(canvas && canvas.getContext)) {\n throw new RuntimeError('UnsupportedBrowserError', 'This browser does not support HTML5 Canvas');\n }\n return canvas.getContext('2d');\n }\n /** Benchmark. Run function `f` once and report time elapsed shifted by `s` milliseconds. */\n // eslint-disable-next-line\n static benchmark(s, f) {\n const start_time = new Date().getTime();\n f();\n const elapsed = new Date().getTime() - start_time;\n log(s, elapsed + 'ms');\n }\n // Get stack trace.\n static stackTrace() {\n const err = new Error();\n return err.stack;\n }\n}\nVex.Flow = Flow;\n","export const BravuraFont = {\n glyphs: {\n bracketTop: {\n x_min: 0,\n x_max: 469,\n y_min: 0,\n y_max: 295,\n ha: 295,\n o: 'm 0 0 l 180 0 b 674 390 410 43 616 150 b 675 405 675 396 675 400 b 664 425 675 416 671 422 b 628 405 651 425 635 415 b 157 179 613 389 432 199 l 12 179 b 0 168 3 179 0 177 z',\n },\n bracketBottom: {\n x_min: 0,\n x_max: 469,\n y_min: -295,\n y_max: 0,\n ha: 295,\n o: 'm 0 -168 b 12 -179 0 -177 3 -179 l 157 -179 b 628 -405 432 -199 613 -389 b 664 -425 635 -415 651 -425 b 675 -405 671 -422 675 -416 b 674 -390 675 -400 675 -396 b 180 0 616 -150 410 -43 l 0 0 z',\n },\n barlineTick: {\n x_min: 0,\n x_max: 36,\n y_min: 868,\n y_max: 1120,\n ha: 252,\n o: 'm 52 1250 l 52 1613 l 0 1613 l 0 1250 z',\n },\n breathMarkTick: {\n x_min: 0,\n x_max: 500,\n y_min: 0,\n y_max: 502,\n ha: 502,\n o: 'm 9 367 b 0 374 6 372 3 374 b 9 334 0 367 0 343 b 179 19 40 312 164 121 b 192 0 179 3 186 0 b 210 19 197 0 207 6 b 698 701 245 197 507 658 b 720 714 714 704 720 711 b 698 723 720 720 711 723 b 197 186 455 714 210 202 b 186 176 194 179 189 176 b 176 186 179 176 176 186 b 9 367 143 266 27 359 z',\n },\n segno: {\n x_min: 4,\n x_max: 550,\n y_min: -27,\n y_max: 759,\n ha: 786,\n o: 'm 194 958 b 217 939 203 958 213 955 l 220 929 b 325 805 230 890 252 805 b 425 901 384 805 425 840 b 413 969 425 923 420 946 b 220 1060 390 1035 294 1060 b 6 793 120 1060 6 936 b 29 687 6 759 13 723 b 295 449 75 582 284 454 b 304 438 301 446 304 444 b 295 415 304 432 301 425 b 78 22 285 395 78 22 b 73 3 75 16 73 9 b 114 -39 73 -20 91 -39 b 150 -17 128 -39 143 -30 b 377 395 150 -17 373 386 b 395 402 377 393 389 402 b 704 176 416 397 704 312 b 621 75 704 120 670 82 l 616 73 b 562 138 586 73 562 94 l 562 154 b 485 249 562 209 526 249 b 468 246 480 249 474 248 b 366 153 415 233 366 210 b 540 -12 366 65 455 -12 b 600 -1 559 -12 579 -9 b 792 251 716 37 792 131 b 789 292 792 264 791 278 b 523 588 768 451 540 579 b 498 611 505 598 498 603 b 501 619 498 613 500 616 b 732 1032 508 631 732 1032 b 737 1053 736 1040 737 1045 b 697 1093 737 1076 719 1093 b 661 1073 683 1093 668 1086 b 423 647 661 1073 432 660 b 410 635 419 639 416 635 b 396 639 406 635 402 636 b 128 792 383 644 166 727 b 108 868 120 808 108 838 b 186 958 108 907 125 948 z m 598 671 b 680 589 598 626 635 589 b 762 671 726 589 762 626 b 680 753 762 717 726 753 b 598 671 635 753 598 717 z m 202 380 b 120 462 202 425 166 462 b 37 380 75 462 37 425 b 120 298 37 334 75 298 b 202 380 166 298 202 334 z',\n },\n coda: {\n x_min: -4,\n x_max: 955,\n y_min: -158,\n y_max: 898,\n ha: 1056,\n o: 'm 1349 576 l 1178 576 b 729 1083 1164 847 962 1064 l 729 1269 b 694 1293 729 1287 713 1293 b 660 1269 675 1293 660 1287 l 660 1083 b 210 576 426 1064 226 848 l 20 576 b -6 541 0 576 -6 560 b 20 507 -6 523 0 507 l 210 507 b 660 0 226 238 426 19 l 660 -202 b 694 -228 660 -222 675 -228 b 729 -202 713 -228 729 -222 l 729 0 b 1178 507 962 19 1164 238 l 1349 507 b 1375 541 1369 507 1375 523 b 1349 576 1375 560 1369 576 z m 940 576 l 729 576 l 729 1002 b 940 576 930 985 940 809 z m 660 1002 l 660 576 l 455 576 b 660 1002 455 809 455 985 z m 455 507 l 660 507 l 660 69 b 455 507 474 91 456 285 z m 729 69 l 729 507 l 940 507 b 729 69 936 287 909 91 z',\n },\n gClef: {\n x_min: 0,\n x_max: 671,\n y_min: -658,\n y_max: 1098,\n ha: 1756,\n o: 'm 541 598 b 550 625 539 615 541 616 b 824 1174 706 770 824 953 b 730 1509 824 1299 789 1423 b 655 1581 708 1541 671 1581 b 562 1512 635 1581 590 1544 b 420 1064 455 1394 420 1214 b 441 828 420 981 431 887 b 428 793 444 811 445 808 b 0 125 220 622 0 416 b 524 -363 0 -125 171 -363 b 624 -354 557 -363 595 -360 b 645 -367 639 -351 642 -350 b 684 -657 662 -464 684 -589 b 455 -896 684 -870 540 -896 b 340 -854 377 -896 340 -873 b 386 -829 340 -844 353 -840 b 482 -694 431 -816 482 -778 b 344 -547 482 -615 432 -547 b 190 -713 248 -547 190 -624 b 464 -948 190 -806 246 -948 b 747 -660 560 -948 747 -904 b 706 -351 747 -577 721 -441 b 724 -327 703 -334 704 -336 b 966 16 870 -269 966 -147 b 619 363 966 200 831 363 b 577 389 582 363 582 363 z m 677 1358 b 763 1240 724 1358 763 1319 b 513 851 763 1080 626 950 b 494 863 503 842 497 844 b 485 995 488 900 485 949 b 677 1358 485 1220 589 1358 z m 520 377 b 498 343 524 350 524 351 b 289 63 372 300 289 186 b 455 -192 289 -66 357 -158 b 494 -200 467 -196 484 -200 b 511 -184 505 -200 511 -193 b 490 -166 511 -174 500 -170 b 386 -12 429 -140 386 -78 b 530 157 386 71 442 132 b 559 145 553 163 556 161 l 631 -284 b 611 -304 634 -300 632 -300 b 530 -311 588 -308 559 -311 b 115 29 278 -311 115 -171 b 249 363 115 114 130 228 b 469 567 336 459 402 513 b 490 562 484 579 487 577 z m 619 148 b 635 168 616 166 618 170 b 848 -66 752 158 848 60 b 713 -271 848 -157 793 -230 b 690 -262 696 -279 693 -279 z',\n },\n cClef: {\n x_min: 0,\n x_max: 699,\n y_min: -506,\n y_max: 506,\n ha: 1012,\n o: 'm 331 694 b 301 724 331 714 321 724 l 300 724 b 269 694 279 724 269 714 l 269 -694 b 300 -724 269 -714 279 -724 l 301 -724 b 331 -694 321 -724 331 -714 l 331 -63 b 344 -55 331 -52 338 -53 b 472 -265 382 -65 442 -102 b 500 -301 477 -288 485 -301 b 530 -262 516 -301 523 -287 b 684 -128 549 -199 582 -128 b 804 -409 778 -128 804 -220 b 651 -683 804 -598 770 -683 b 528 -644 631 -683 528 -674 b 567 -622 528 -636 552 -628 b 625 -528 596 -612 625 -583 b 527 -429 625 -465 583 -429 b 416 -547 465 -429 416 -471 b 667 -729 416 -638 495 -729 b 1007 -413 903 -729 1007 -563 b 706 -76 1007 -215 897 -76 b 618 -89 664 -76 636 -84 b 576 -88 603 -94 589 -96 b 524 0 556 -75 524 -29 b 576 88 524 29 556 75 b 618 89 589 96 603 94 b 706 76 636 84 664 76 b 1007 413 897 76 1007 215 b 667 729 1007 563 903 729 b 416 547 495 729 416 638 b 527 429 416 471 465 429 b 625 528 583 429 625 465 b 567 622 625 583 596 612 b 528 644 552 628 528 636 b 651 683 528 674 631 683 b 804 409 770 683 804 598 b 684 128 804 220 778 128 b 530 262 582 128 549 199 b 500 301 523 287 516 301 b 472 265 485 301 477 288 b 344 55 442 102 382 65 b 331 63 338 53 331 52 z m 30 724 b 0 694 10 724 0 714 l 0 -694 b 30 -724 0 -714 10 -724 l 154 -724 b 184 -694 174 -724 184 -714 l 184 694 b 154 724 184 714 174 724 z',\n },\n fClef: {\n x_min: -5,\n x_max: 684,\n y_min: -635,\n y_max: 262,\n ha: 897,\n o: 'm 363 377 b 0 56 112 377 0 194 b 177 -158 0 -59 60 -158 b 330 -6 268 -158 330 -95 b 192 144 330 86 262 144 b 120 134 153 144 138 134 b 96 160 101 134 96 145 b 330 323 96 217 183 323 b 549 -53 482 323 549 173 b 14 -871 549 -455 350 -680 b -7 -897 1 -878 -7 -886 b 12 -914 -7 -906 -1 -914 b 36 -907 19 -914 27 -912 b 765 -40 390 -734 765 -478 b 363 377 765 210 612 377 z m 906 259 b 827 180 861 259 827 225 b 906 101 827 135 861 101 b 985 180 950 101 985 135 b 906 259 985 225 950 259 z m 907 -102 b 829 -180 863 -102 829 -135 b 907 -258 829 -225 863 -258 b 985 -180 952 -258 985 -225 b 907 -102 985 -135 952 -102 z',\n },\n unpitchedPercussionClef1: {\n x_min: 0,\n x_max: 382,\n y_min: -250,\n y_max: 250,\n ha: 500,\n o: 'm 230 -338 l 230 338 b 210 360 230 350 222 360 l 20 360 b 0 338 9 360 0 350 l 0 -338 b 20 -360 0 -350 9 -360 l 210 -360 b 230 -338 222 -360 230 -350 z m 550 338 b 530 360 550 350 541 360 l 340 360 b 320 338 328 360 320 350 l 320 -338 b 340 -360 320 -350 328 -360 l 530 -360 b 550 -338 541 -360 550 -350 z',\n },\n '6stringTabClef': {\n x_min: -3,\n x_max: 408,\n y_min: -748,\n y_max: 764,\n ha: 1512,\n o: 'm 557 1024 l 557 1100 l 26 1100 l 26 1024 l 249 1024 l 249 422 l 336 422 l 336 1024 z m 588 -328 l 350 348 l 238 348 l -4 -328 l 88 -328 l 160 -125 l 420 -125 l 491 -328 z m 397 -52 l 181 -52 l 292 256 z m 544 -883 b 420 -719 544 -802 507 -752 b 514 -572 482 -690 514 -639 b 314 -399 514 -472 442 -399 l 39 -399 l 39 -1077 l 344 -1077 b 544 -883 467 -1077 544 -995 z m 428 -583 b 292 -691 428 -652 389 -691 l 125 -691 l 125 -475 l 292 -475 b 428 -583 389 -475 428 -514 z m 458 -884 b 337 -1001 458 -949 418 -1001 l 125 -1001 l 125 -768 l 337 -768 b 458 -884 418 -768 458 -818 z',\n },\n timeSig0: {\n x_min: 20,\n x_max: 450,\n y_min: -250,\n y_max: 251,\n ha: 501,\n o: 'm 648 0 b 338 361 648 200 510 361 b 29 0 167 361 29 200 b 338 -360 29 -199 167 -360 b 648 0 510 -360 648 -199 z m 338 317 b 446 10 397 317 446 180 b 338 -295 446 -158 397 -295 b 230 10 278 -295 230 -158 b 338 317 230 180 278 317 z',\n },\n timeSig1: {\n x_min: 20,\n x_max: 314,\n y_min: -250,\n y_max: 251,\n ha: 501,\n o: 'm 35 19 b 29 0 35 19 29 10 b 45 -20 29 -7 33 -16 b 58 -23 50 -22 56 -23 b 78 -10 72 -23 78 -10 b 156 117 78 -10 140 89 b 170 131 161 127 167 131 b 179 111 176 131 179 120 l 179 -261 b 115 -315 179 -294 145 -315 b 91 -337 105 -315 91 -320 b 122 -360 91 -353 104 -360 l 429 -360 b 452 -337 452 -360 452 -337 b 431 -315 452 -337 452 -315 b 384 -265 410 -315 384 -289 l 384 328 b 356 361 384 351 376 360 b 281 356 336 361 300 356 b 206 360 253 356 228 357 b 199 361 203 360 200 361 b 173 334 184 361 179 347 z',\n },\n timeSig2: {\n x_min: 20,\n x_max: 426,\n y_min: -257,\n y_max: 254,\n ha: 511,\n o: 'm 606 -131 b 589 -111 606 -114 599 -111 b 570 -127 577 -111 573 -117 l 569 -128 b 513 -192 554 -164 543 -192 b 488 -187 505 -192 498 -190 b 445 -171 469 -180 459 -179 b 289 -137 416 -160 348 -137 b 236 -145 271 -137 252 -140 b 422 -42 268 -94 390 -50 b 613 147 523 -14 613 27 b 330 366 613 300 464 366 b 69 275 229 366 140 357 b 29 170 45 245 29 209 b 42 108 29 150 33 130 b 160 29 63 63 108 29 b 261 156 248 29 261 120 b 161 275 261 242 161 246 b 275 330 164 295 190 330 b 405 192 403 330 405 233 b 193 -102 405 60 297 -39 b 33 -317 114 -153 58 -223 l 32 -321 b 69 -370 32 -340 48 -370 b 203 -282 101 -370 118 -282 b 410 -360 261 -282 282 -360 b 606 -131 472 -360 583 -354 z',\n },\n timeSig3: {\n x_min: 20,\n x_max: 401,\n y_min: -251,\n y_max: 249,\n ha: 500,\n o: 'm 307 357 b 301 357 305 357 304 357 l 291 359 b 285 359 289 359 287 359 b 37 200 161 359 37 276 b 154 84 37 153 65 89 l 161 84 b 256 177 225 84 256 130 l 256 189 b 209 248 252 242 216 245 b 180 268 202 251 180 248 l 180 274 b 240 310 183 298 228 310 b 374 199 363 310 374 233 l 374 189 b 199 36 374 82 289 40 b 164 12 184 35 164 27 b 200 -6 164 -6 189 -6 b 379 -137 366 -6 379 -118 b 269 -307 379 -289 301 -307 b 256 -305 264 -307 258 -305 b 216 -282 245 -304 217 -304 l 216 -275 b 249 -180 216 -243 248 -222 b 145 -76 249 -120 207 -76 b 130 -78 140 -76 135 -76 b 60 -115 105 -82 78 -96 b 29 -203 36 -137 29 -171 b 275 -361 32 -315 134 -359 l 288 -361 b 577 -161 431 -361 577 -288 l 577 -151 b 537 -50 575 -109 564 -82 b 503 -20 528 -39 517 -29 l 472 -3 l 425 10 b 410 17 418 12 413 12 b 409 24 409 20 409 22 b 415 37 409 30 410 36 b 459 50 431 42 446 43 b 547 181 517 78 547 115 b 307 357 547 314 367 353 z',\n },\n timeSig4: {\n x_min: 20,\n x_max: 450,\n y_min: -250,\n y_max: 251,\n ha: 501,\n o: 'm 521 -107 l 521 202 b 504 226 521 213 520 226 b 475 213 491 226 484 223 l 338 48 b 325 14 333 40 325 32 l 325 -107 l 131 -107 b 481 336 246 -9 477 318 l 482 340 b 461 361 482 353 472 361 b 363 359 448 361 389 359 b 261 361 337 359 272 361 b 228 334 248 361 228 357 b 43 -105 228 156 86 -45 l 35 -117 b 35 -118 35 -117 35 -118 l 33 -120 b 29 -137 30 -127 29 -132 b 58 -161 29 -151 40 -161 l 325 -161 l 325 -252 b 268 -302 325 -291 294 -302 b 235 -330 245 -302 235 -315 b 262 -360 235 -344 240 -360 l 569 -360 b 598 -330 583 -360 598 -350 b 566 -301 598 -310 580 -301 b 521 -246 552 -301 521 -292 l 521 -161 l 626 -161 b 648 -134 641 -161 648 -151 b 626 -107 648 -117 642 -107 z',\n },\n timeSig5: {\n x_min: 20,\n x_max: 383,\n y_min: -251,\n y_max: 246,\n ha: 497,\n o: 'm 109 85 b 117 179 109 85 115 166 b 138 197 118 190 125 197 l 144 197 b 285 184 158 194 226 184 b 492 323 485 184 492 300 b 472 353 492 341 488 353 b 295 340 454 353 341 340 b 101 354 249 340 125 351 b 66 330 75 354 68 341 l 50 10 l 50 7 b 79 -14 50 -12 65 -14 b 111 14 94 -14 95 -1 b 209 62 125 29 160 62 b 357 -125 258 62 357 35 b 235 -304 357 -284 272 -304 b 202 -300 223 -304 212 -304 b 184 -279 194 -295 186 -289 b 202 -259 184 -269 194 -264 b 256 -163 235 -239 256 -203 b 144 -50 256 -99 206 -50 b 30 -157 66 -50 35 -107 b 29 -183 29 -166 29 -174 b 284 -361 29 -302 107 -361 b 552 -125 456 -361 552 -255 b 314 112 552 6 445 112 b 122 71 230 112 168 98 b 115 69 120 69 117 69 b 109 79 109 69 109 75 z',\n },\n timeSig6: {\n x_min: 20,\n x_max: 414,\n y_min: -249,\n y_max: 251,\n ha: 500,\n o: 'm 439 120 b 554 229 500 120 554 167 b 553 245 554 235 554 239 b 348 361 539 337 426 361 b 85 209 239 360 137 307 b 29 4 53 148 29 72 l 29 -1 b 73 -200 30 -68 42 -143 b 324 -359 132 -307 203 -359 b 513 -307 389 -359 461 -348 b 596 -137 563 -266 596 -202 b 379 72 596 -24 490 72 b 248 22 333 72 285 55 b 239 19 245 19 242 19 b 226 53 230 19 226 30 b 346 327 230 320 315 327 b 393 305 374 327 393 320 b 357 251 393 285 366 268 b 347 209 350 238 347 223 b 369 150 347 187 354 166 b 439 120 379 131 420 120 z m 320 3 b 405 -158 366 3 405 -69 b 320 -320 405 -248 366 -320 b 236 -158 274 -320 236 -248 b 320 3 236 -69 274 3 z',\n },\n timeSig7: {\n x_min: 20,\n x_max: 421,\n y_min: -250,\n y_max: 249,\n ha: 499,\n o: 'm 606 294 b 582 351 606 333 606 351 b 552 336 580 351 557 346 b 485 236 541 318 521 236 b 262 359 449 236 382 359 b 137 307 179 359 157 325 b 98 281 117 288 108 282 b 60 315 86 281 68 301 b 43 325 58 321 50 325 b 29 308 36 325 29 321 l 29 71 b 45 48 29 71 30 48 b 66 76 56 48 60 60 b 164 196 81 112 99 196 b 374 88 222 196 291 88 b 446 118 415 88 435 109 b 459 124 451 121 456 124 b 469 111 465 124 468 120 b 272 -112 469 71 359 -10 b 173 -315 217 -176 173 -259 b 200 -360 173 -346 173 -360 b 294 -347 226 -360 258 -347 b 412 -360 330 -347 397 -360 b 435 -307 426 -360 435 -348 b 606 288 435 -66 606 140 z',\n },\n timeSig8: {\n x_min: 20,\n x_max: 416,\n y_min: -259,\n y_max: 259,\n ha: 518,\n o: 'm 481 52 b 567 204 533 85 567 132 b 317 373 567 351 356 373 b 36 176 150 373 36 297 b 161 -16 36 76 92 23 b 29 -190 86 -52 29 -99 b 301 -373 29 -315 158 -373 b 599 -117 445 -373 599 -311 b 481 52 599 -30 549 17 z m 406 85 b 168 240 291 125 168 150 b 314 331 168 301 251 331 b 482 207 360 331 482 308 b 406 85 482 150 454 112 z m 295 -325 b 111 -183 199 -325 111 -276 b 225 -48 111 -125 161 -72 b 436 -219 330 -94 436 -124 b 295 -325 436 -276 392 -325 z',\n },\n timeSig9: {\n x_min: 20,\n x_max: 414,\n y_min: -249,\n y_max: 251,\n ha: 500,\n o: 'm 186 -117 b 71 -226 125 -117 71 -164 b 72 -242 71 -232 71 -236 b 276 -359 86 -334 199 -359 b 540 -206 386 -357 488 -304 b 596 -1 572 -145 596 -69 l 596 4 b 552 203 595 71 583 145 b 301 361 492 310 422 361 b 112 310 236 361 164 351 b 29 140 62 269 29 204 b 246 -69 29 27 135 -69 b 377 -19 292 -69 340 -52 b 386 -16 380 -16 383 -16 b 399 -50 395 -16 399 -27 b 279 -324 395 -317 310 -324 b 232 -302 251 -324 232 -317 b 268 -248 232 -282 259 -265 b 278 -206 275 -235 278 -220 b 256 -147 278 -184 271 -163 b 186 -117 246 -128 204 -117 z m 305 0 b 220 161 259 0 220 72 b 305 323 220 251 259 323 b 389 161 351 323 389 251 b 305 0 389 72 351 0 z',\n },\n timeSigCommon: {\n x_min: 5,\n x_max: 424,\n y_min: -249,\n y_max: 251,\n ha: 500,\n o: 'm 336 361 b 7 -14 131 361 7 180 b 101 -262 7 -108 42 -190 b 321 -359 156 -328 235 -359 b 611 -88 573 -359 611 -130 b 589 -56 611 -56 595 -56 b 567 -82 577 -56 567 -58 b 363 -311 567 -268 409 -311 b 184 40 246 -311 184 -197 b 372 327 184 278 294 327 b 477 278 446 327 477 292 b 451 246 477 265 472 246 b 360 140 393 246 360 184 b 471 32 360 58 431 32 b 580 156 471 32 580 36 b 336 361 580 344 363 361 z',\n },\n timeSigCutCommon: {\n x_min: 0,\n x_max: 418,\n y_min: -359,\n y_max: 361,\n ha: 720,\n o: 'm 573 -58 b 559 -82 567 -58 559 -60 b 354 -310 559 -266 400 -310 b 317 -305 340 -310 328 -308 b 302 -284 311 -304 302 -295 l 302 287 b 338 323 302 297 328 321 b 363 324 347 324 356 324 b 468 275 436 324 468 289 b 442 243 468 264 464 243 b 351 137 384 243 351 181 b 462 30 351 56 422 30 b 572 154 462 30 572 35 b 318 357 572 295 441 357 b 302 390 310 359 302 383 l 302 495 b 276 520 302 507 292 520 b 252 495 265 520 252 507 l 252 369 b 235 346 252 359 238 346 l 196 331 b 0 -14 66 275 0 122 b 225 -346 0 -150 86 -310 b 252 -382 235 -350 252 -369 l 252 -492 b 276 -517 252 -505 265 -517 b 302 -492 292 -517 302 -505 l 302 -379 b 318 -359 302 -370 308 -363 b 602 -85 563 -354 602 -130 b 579 -58 600 -58 586 -58 z m 252 -235 b 243 -252 252 -248 248 -252 b 236 -248 240 -252 238 -251 b 177 37 197 -193 177 -96 b 232 259 177 147 200 215 b 236 262 233 262 235 262 b 252 239 243 262 252 251 z',\n },\n timeSigPlus: {\n x_min: -1,\n x_max: 499,\n y_min: -250,\n y_max: 250,\n ha: 500,\n o: 'm 432 53 b 413 79 420 53 413 65 l 413 340 b 392 360 413 350 405 360 l 325 360 b 305 340 312 360 305 350 l 305 79 b 284 53 305 66 292 53 l 19 53 b -1 33 9 53 -1 46 l -1 -33 b 19 -55 -1 -46 9 -55 l 284 -55 b 305 -75 298 -55 305 -68 l 305 -340 b 325 -360 305 -350 312 -360 l 392 -360 b 413 -340 405 -360 413 -350 l 413 -78 b 433 -55 413 -63 423 -55 l 698 -55 b 719 -33 708 -55 719 -46 l 719 33 b 698 53 719 46 708 53 z',\n },\n timeSigPlusSmall: {\n x_min: -1,\n x_max: 255,\n y_min: -133,\n y_max: 123,\n ha: 256,\n o: 'm 220 20 b 210 33 215 20 210 26 l 210 166 b 200 177 210 171 206 177 l 166 177 b 156 166 160 177 156 171 l 156 33 b 145 20 156 27 150 20 l 10 20 b -1 10 4 20 -1 16 l -1 -24 b 10 -35 -1 -30 4 -35 l 145 -35 b 156 -46 153 -35 156 -42 l 156 -180 b 166 -192 156 -186 160 -192 l 200 -192 b 210 -180 206 -192 210 -186 l 210 -48 b 222 -35 210 -39 216 -35 l 356 -35 b 367 -24 361 -35 367 -30 l 367 10 b 356 20 367 16 361 20 z',\n },\n timeSigMinus: {\n x_min: 0,\n x_max: 448,\n y_min: -35,\n y_max: 40,\n ha: 75,\n o: 'm 645 39 b 619 58 645 49 634 58 l 27 58 b 0 39 12 58 0 49 l 0 -32 b 27 -50 0 -42 12 -50 l 619 -50 b 645 -32 634 -50 645 -42 z',\n },\n timeSigParensRight: {\n x_min: 0,\n x_max: 184,\n y_min: -489,\n y_max: 491,\n ha: 980,\n o: 'm 0 -696 b 3 -704 0 -698 1 -704 b 7 -703 4 -704 6 -704 b 265 1 187 -530 265 -282 b 12 701 265 289 187 531 b 4 707 12 701 6 707 b 0 696 1 707 0 703 l 0 665 b 4 644 0 665 0 651 b 167 1 112 503 167 315 b 6 -641 167 -311 109 -497 b 0 -658 3 -644 0 -651 z',\n },\n timeSigParensRightSmall: {\n x_min: 0,\n x_max: 110,\n y_min: -251,\n y_max: 249,\n ha: 500,\n o: 'm 0 -356 b 3 -361 0 -357 1 -361 b 158 0 112 -272 158 -145 b 4 359 158 147 109 272 b 0 353 3 359 0 357 l 0 338 b 3 327 0 338 0 330 b 91 0 60 246 91 160 b 4 -328 91 -160 62 -249 b 0 -337 3 -330 0 -333 z',\n },\n timeSigParensLeft: {\n x_min: 0,\n x_max: 184,\n y_min: -489,\n y_max: 491,\n ha: 980,\n o: 'm 265 -658 b 259 -641 265 -651 262 -644 b 98 1 156 -497 98 -311 b 261 644 98 315 153 503 b 265 665 265 651 265 665 l 265 696 b 261 707 265 703 264 707 b 253 701 259 707 253 701 b 0 1 78 531 0 289 b 258 -703 0 -282 78 -530 b 262 -704 259 -704 261 -704 b 265 -696 264 -704 265 -698 z',\n },\n timeSigParensLeftSmall: {\n x_min: 0,\n x_max: 110,\n y_min: -251,\n y_max: 249,\n ha: 500,\n o: 'm 158 -337 b 154 -328 158 -333 156 -330 b 68 0 96 -249 68 -160 b 156 327 68 160 98 246 b 158 338 158 330 158 338 l 158 353 b 154 359 158 357 156 359 b 0 0 49 272 0 147 b 156 -361 0 -145 46 -272 b 158 -356 157 -361 158 -357 z',\n },\n noteheadDoubleWhole: {\n x_min: 0,\n x_max: 599,\n y_min: -155,\n y_max: 155,\n ha: 310,\n o: 'm 13 223 b 0 212 4 223 0 217 l 0 -213 b 13 -223 0 -219 4 -223 l 32 -223 b 45 -213 39 -223 45 -219 l 45 212 b 32 223 45 217 39 223 z m 96 223 b 82 212 88 223 82 217 l 82 -213 b 96 -223 82 -219 88 -223 l 114 -223 b 128 -213 121 -223 128 -219 l 128 212 b 114 223 128 217 121 223 z m 747 223 b 733 212 740 223 733 217 l 733 -213 b 747 -223 733 -219 740 -223 l 766 -223 b 780 -213 773 -223 780 -219 l 780 212 b 766 223 780 217 773 223 z m 829 223 b 815 212 824 223 815 217 l 815 -213 b 829 -223 815 -219 824 -223 l 848 -223 b 863 -213 857 -223 863 -219 l 863 212 b 848 223 863 217 857 223 z m 438 180 b 130 1 248 180 130 101 b 423 -180 130 -92 210 -180 b 733 1 657 -180 733 -98 b 438 180 733 104 572 180 z m 469 -145 b 331 -71 409 -145 369 -112 b 284 58 305 -37 284 12 b 400 147 284 131 333 147 b 577 -45 498 147 577 42 b 469 -145 577 -115 533 -145 z',\n },\n noteheadWhole: {\n x_min: 0,\n x_max: 422,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 311 180 b 0 3 120 180 0 101 b 297 -180 0 -94 82 -180 b 608 3 533 -180 608 -98 b 311 180 608 105 445 180 z m 160 91 b 274 148 176 141 229 148 b 452 -45 373 148 452 42 b 386 -141 452 -89 433 -130 b 341 -147 372 -145 356 -147 b 206 -72 289 -147 236 -112 b 156 56 177 -39 156 10 b 160 91 156 68 157 79 z',\n },\n noteheadHalf: {\n x_min: 0,\n x_max: 295,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 140 -180 b 425 60 377 -180 425 13 b 282 180 425 134 366 180 b 0 -60 68 180 0 14 b 140 -180 0 -137 60 -180 z m 108 -125 b 50 -92 78 -125 60 -109 b 42 -63 46 -84 42 -73 b 318 121 42 7 251 121 b 372 91 346 121 361 108 b 380 63 376 82 380 73 b 108 -125 380 1 177 -125 z',\n },\n noteheadBlack: {\n x_min: 0,\n x_max: 295,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 140 -180 b 425 60 268 -180 425 -62 b 285 180 425 134 367 180 b 0 -60 127 180 0 63 b 140 -180 0 -135 62 -180 z',\n },\n noteheadXWhole: {\n x_min: 0,\n x_max: 377,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 272 -95 l 364 -171 b 384 -180 370 -177 377 -180 l 511 -180 b 543 -148 528 -180 543 -164 b 531 -124 543 -140 539 -131 l 412 0 l 531 124 b 541 148 539 131 541 140 b 513 180 541 164 528 180 l 384 180 b 364 171 377 180 370 177 l 272 94 l 179 171 b 158 180 173 177 166 180 l 30 180 b 0 148 16 180 0 164 b 12 124 0 140 4 131 l 132 0 l 12 -124 b 1 -148 4 -131 1 -140 b 32 -180 1 -164 14 -180 l 158 -180 b 179 -171 166 -180 173 -177 z m 386 -141 l 272 -45 l 157 -141 l 88 -141 l 245 0 l 88 141 l 157 141 l 272 45 l 386 141 l 456 141 l 300 0 l 456 -141 z',\n },\n noteheadXHalf: {\n x_min: 0,\n x_max: 334,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 295 180 b 271 170 287 180 278 177 l 209 98 l 115 171 b 95 180 109 177 104 180 l 36 180 b 4 148 19 180 4 164 b 14 124 4 140 7 132 l 140 22 l 7 -127 b 0 -148 3 -131 0 -138 b 32 -180 0 -166 14 -180 l 184 -180 b 209 -170 193 -180 203 -177 l 271 -99 l 363 -171 b 384 -180 370 -176 377 -180 l 445 -180 b 478 -147 461 -180 478 -163 b 465 -125 478 -138 474 -131 l 341 -22 l 474 127 b 481 148 480 131 481 138 b 448 180 481 166 468 180 z m 36 148 l 95 148 l 233 33 l 334 148 l 410 148 l 274 -6 l 445 -148 l 384 -148 l 248 -35 l 147 -148 l 71 -148 l 206 4 z',\n },\n noteheadXBlack: {\n x_min: 0,\n x_max: 290,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 410 -143 l 239 0 l 410 144 b 418 160 415 147 418 154 b 399 180 418 171 408 180 b 389 177 396 180 392 179 l 207 26 l 29 177 b 17 180 26 179 22 180 b 0 161 7 180 0 170 b 7 144 0 156 3 148 l 179 0 l 7 -143 b 0 -158 1 -147 0 -153 b 19 -180 0 -170 7 -180 b 29 -176 23 -180 26 -179 l 207 -24 l 389 -176 b 399 -180 392 -179 396 -180 b 418 -160 410 -180 418 -168 b 410 -143 418 -153 415 -147 z',\n },\n noteheadCircleX: {\n x_min: 0,\n x_max: 249,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 179 180 b 0 0 81 180 0 99 b 179 -180 0 -99 81 -180 b 359 0 278 -180 359 -99 b 179 180 359 99 278 180 z m 261 112 l 180 30 l 98 112 b 179 138 121 128 148 138 b 261 112 210 138 238 128 z m 317 0 b 292 -82 317 -30 308 -59 l 209 1 l 291 84 b 317 0 307 60 317 30 z m 40 0 b 69 84 40 32 50 60 l 151 1 l 68 -84 b 40 0 49 -60 40 -30 z m 95 -111 l 180 -27 l 262 -111 b 179 -138 239 -128 210 -138 b 95 -111 148 -138 120 -128 z',\n },\n noteheadTriangleUpWhole: {\n x_min: 0,\n x_max: 319,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 445 -180 b 459 -166 454 -180 459 -173 b 458 -158 459 -163 458 -160 l 239 173 b 228 180 238 177 233 180 b 216 173 225 180 219 177 l 1 -158 b 0 -166 1 -160 0 -163 b 14 -180 0 -173 6 -180 z m 170 -137 b 145 -96 157 -137 145 -109 b 228 108 145 -17 197 56 b 310 -98 259 55 310 -17 b 288 -137 310 -111 301 -137 z',\n },\n noteheadTriangleUpHalf: {\n x_min: 0,\n x_max: 285,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 215 180 b 202 173 210 180 204 177 l 3 -157 b 0 -166 1 -160 0 -163 b 14 -180 0 -173 7 -180 l 396 -180 b 410 -166 406 -180 410 -173 b 409 -158 410 -163 410 -161 l 228 173 b 215 180 226 174 220 180 z m 246 -138 l 115 -138 l 232 76 l 297 -37 z',\n },\n noteheadTriangleUpBlack: {\n x_min: 0,\n x_max: 293,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 422 -180 l 207 180 l 0 -180 z',\n },\n noteheadDiamondWhole: {\n x_min: 0,\n x_max: 270,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 386 -23 b 389 -16 387 -20 389 -19 b 383 -7 389 -13 386 -9 l 130 179 b 122 180 128 180 125 180 b 115 177 120 180 117 180 l 3 23 b 0 17 1 20 0 19 b 4 7 0 16 3 10 l 258 -179 b 264 -180 261 -179 262 -180 b 272 -176 268 -180 271 -179 z m 66 40 b 62 48 65 42 62 45 l 109 111 b 112 112 109 112 111 112 b 118 111 115 112 117 111 l 320 -37 b 324 -46 323 -39 324 -42 b 275 -111 278 -111 276 -111 b 268 -108 272 -111 271 -109 z',\n },\n noteheadDiamondHalf: {\n x_min: 0,\n x_max: 251,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 359 -7 b 361 0 360 -6 361 -3 b 359 7 361 3 360 4 l 189 177 b 180 180 186 179 183 180 b 174 177 179 180 176 179 l 4 7 b 0 0 1 4 0 3 b 4 -7 0 -3 1 -6 l 174 -177 b 180 -180 176 -180 179 -180 b 189 -177 183 -180 186 -180 z m 266 26 b 138 -71 266 -12 176 -71 b 96 -50 121 -71 108 -63 b 88 -24 89 -43 88 -32 b 215 73 88 13 177 73 b 266 26 238 73 266 50 z',\n },\n noteheadDiamondBlack: {\n x_min: 0,\n x_max: 250,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 357 -6 b 360 1 359 -4 360 -1 b 357 9 360 4 359 7 l 189 177 b 180 180 187 179 184 180 b 171 177 177 180 173 179 l 3 9 b 0 1 0 6 0 4 b 4 -7 0 -1 1 -4 l 173 -177 b 180 -180 176 -180 177 -180 b 187 -177 181 -180 184 -180 z',\n },\n noteheadSquareWhite: {\n x_min: 0,\n x_max: 313,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 451 -180 l 451 180 l 0 180 l 0 -180 z m 40 -138 l 40 140 l 410 140 l 410 -138 z',\n },\n noteheadSquareBlack: {\n x_min: 0,\n x_max: 313,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 451 -180 l 451 180 l 0 180 l 0 -180 z',\n },\n noteheadParenthesis: {\n x_min: -73,\n x_max: 368,\n y_min: -180,\n y_max: 182,\n ha: 362,\n o: 'm 52 -249 b -30 -144 3 -212 -14 -190 b -52 4 -45 -102 -52 -56 b 52 252 -52 118 -36 179 l 46 262 b -105 3 -49 197 -105 124 b 45 -259 -105 -109 -48 -200 z m 382 -259 b 530 3 474 -202 530 -108 b 379 262 530 122 474 200 l 373 252 b 478 4 462 180 478 118 b 456 -144 478 -56 471 -102 b 373 -249 439 -190 422 -212 z',\n },\n noteheadParenthesisRight: {\n x_min: -36,\n x_max: 73,\n y_min: -181,\n y_max: 181,\n ha: 362,\n o: 'm -43 -261 b 105 1 49 -203 105 -109 b -46 261 105 121 49 199 l -52 251 b 53 3 37 179 53 117 b 32 -145 53 -58 46 -104 b -52 -251 14 -192 -3 -213 z',\n },\n noteheadParenthesisLeft: {\n x_min: 0,\n x_max: 109,\n y_min: -181,\n y_max: 181,\n ha: 362,\n o: 'm 157 -251 b 75 -145 108 -213 91 -192 b 53 3 60 -104 53 -58 b 157 251 53 117 69 177 l 151 261 b 0 1 56 196 0 122 b 150 -261 0 -111 58 -202 z',\n },\n augmentationDot: {\n x_min: 0,\n x_max: 100,\n y_min: -50,\n y_max: 50,\n ha: 100,\n o: 'm 144 0 b 72 72 144 40 112 72 b 0 0 32 72 0 40 b 72 -72 0 -40 32 -72 b 144 0 112 -72 144 -40 z',\n },\n tremolo1: {\n x_min: -150,\n x_max: 150,\n y_min: -93,\n y_max: 94,\n ha: 187,\n o: 'm 216 -45 l 216 135 l -216 46 l -216 -134 z',\n },\n flag8thUp: {\n x_min: 0,\n x_max: 264,\n y_min: -810.1921176545985,\n y_max: 9,\n ha: 819.1921176545985,\n o: 'm 343 -1138 b 380 -888 343 -1138 380 -1001 b 215 -395 380 -708 305 -539 b 58 -19 141 -281 81 -157 b 27 13 53 4 42 13 b 0 -9 12 13 0 9 l 0 -353 b 284 -688 95 -370 232 -566 b 318 -904 305 -737 318 -819 b 284 -1102 318 -969 308 -1037 b 279 -1123 281 -1110 279 -1117 b 302 -1165 279 -1146 294 -1159 b 343 -1138 311 -1171 336 -1162 z',\n },\n flag8thDown: {\n x_min: 0,\n x_max: 306,\n y_min: -14,\n y_max: 808,\n ha: 822,\n o: 'm 346 1094 b 376 897 366 1034 376 962 b 318 642 376 812 340 691 b 0 340 265 521 193 405 l 0 1 b 23 -20 0 -13 12 -20 b 58 12 36 -20 55 -12 b 262 387 82 148 189 274 b 441 881 353 530 441 701 b 400 1142 441 994 412 1096 b 377 1164 396 1158 387 1164 b 346 1094 356 1164 331 1136 z',\n },\n flag16thUp: {\n x_min: 0,\n x_max: 279,\n y_min: -813,\n y_max: 2,\n ha: 815,\n o: 'm 392 -1146 b 402 -988 397 -1139 402 -1057 l 402 -956 b 360 -783 402 -896 386 -837 b 359 -770 360 -779 359 -776 b 360 -760 359 -768 359 -765 b 396 -577 364 -752 396 -665 b 392 -526 396 -559 395 -543 b 236 -275 377 -428 340 -387 b 53 -16 158 -192 78 -168 b 24 3 50 0 33 3 b 0 -12 16 3 0 -1 l 0 -570 l 7 -570 b 298 -778 96 -573 199 -576 b 344 -992 331 -847 344 -917 b 333 -1120 344 -1034 340 -1077 b 331 -1133 331 -1126 331 -1129 b 363 -1171 331 -1152 343 -1171 b 392 -1146 373 -1171 383 -1165 z m 301 -661 b 223 -562 278 -625 253 -596 b 59 -331 156 -484 89 -449 b 58 -327 58 -330 58 -328 b 78 -312 58 -321 66 -312 l 89 -312 b 302 -464 177 -312 255 -393 b 341 -592 328 -501 341 -546 b 340 -621 341 -602 341 -611 b 330 -658 337 -632 337 -647 b 311 -667 328 -662 318 -667 b 301 -661 307 -667 304 -665 z',\n },\n flag16thDown: {\n x_min: 0,\n x_max: 290.8951581511223,\n y_min: -9,\n y_max: 812.0064,\n ha: 821.0064,\n o: 'm 346 1132 b 312 768 367 1011 367 880 b 7 559 213 566 96 562 l 0 559 l 0 1 b 24 -13 0 -6 10 -13 b 53 6 35 -13 50 -10 b 406 516 88 228 372 289 b 410 567 409 531 410 549 b 374 750 410 655 379 742 b 373 760 373 753 373 756 b 374 773 373 766 374 769 b 405 1138 426 881 428 1022 b 370 1169 397 1171 387 1169 b 346 1132 353 1168 341 1156 z m 325 657 b 344 647 333 657 343 652 b 354 611 351 636 351 622 b 356 582 356 600 356 590 b 317 454 356 534 343 491 b 89 302 269 383 177 302 l 78 302 b 58 317 66 302 58 310 b 59 321 58 318 58 320 b 238 552 89 439 170 472 b 315 651 268 585 292 613 b 325 657 318 655 321 657 z',\n },\n flag32ndUp: {\n x_min: 0,\n x_max: 261,\n y_min: -812,\n y_max: 149,\n ha: 961,\n o: 'm 374 -969 b 337 -806 372 -913 359 -858 b 336 -796 336 -804 336 -801 b 337 -788 336 -793 336 -791 b 370 -616 340 -778 370 -698 b 340 -482 370 -570 360 -524 b 369 -330 353 -445 369 -386 b 366 -289 369 -315 369 -302 b 220 -58 350 -202 317 -163 b 46 187 148 20 71 43 b 20 215 45 200 35 215 b 0 197 12 215 0 207 l 0 -609 l 7 -609 b 278 -802 91 -612 186 -615 b 323 -999 310 -865 323 -930 b 311 -1122 323 -1040 318 -1080 b 310 -1132 311 -1126 310 -1129 b 328 -1166 310 -1149 318 -1162 b 337 -1169 331 -1168 334 -1169 b 366 -1146 346 -1169 356 -1162 b 376 -1009 370 -1138 376 -1071 b 374 -969 376 -995 374 -982 z m 300 -261 b 321 -330 315 -289 321 -311 b 317 -360 321 -341 318 -350 b 300 -423 314 -374 307 -399 b 220 -334 279 -397 253 -370 b 56 -92 150 -256 79 -232 b 300 -261 135 -92 220 -127 z m 315 -657 b 308 -690 312 -668 312 -680 b 292 -698 307 -694 300 -698 b 282 -693 288 -698 284 -697 b 216 -608 261 -661 240 -636 l 209 -600 b 56 -390 147 -527 88 -495 b 73 -367 53 -380 60 -367 b 318 -622 189 -367 318 -505 b 315 -657 318 -634 317 -645 z',\n },\n flag32ndDown: {\n x_min: 0,\n x_max: 273,\n y_min: -172,\n y_max: 812,\n ha: 984,\n o: 'm 393 973 b 333 1169 393 1002 383 1169 b 324 1168 330 1169 327 1169 b 304 1130 314 1164 304 1149 b 305 1120 304 1128 305 1125 b 334 962 317 1056 334 1011 b 289 821 334 922 323 880 b 0 619 180 625 88 622 l 0 -229 b 20 -248 0 -242 9 -248 b 48 -219 35 -248 46 -232 b 229 36 72 -69 154 -46 b 380 278 330 145 364 186 b 383 320 383 291 383 305 b 351 484 383 382 364 445 b 384 629 374 526 384 580 b 356 780 384 704 361 766 b 356 783 356 782 356 783 l 351 791 b 356 804 351 796 353 799 l 361 814 b 393 958 380 850 387 865 z m 56 386 b 217 609 86 501 153 533 b 292 706 246 642 269 670 b 304 711 295 710 300 711 b 321 703 311 711 320 707 b 328 670 325 693 325 681 b 331 634 330 658 331 645 b 82 367 331 516 199 367 l 75 367 b 56 386 62 367 56 379 z m 330 350 b 334 320 331 340 334 331 b 311 248 334 301 328 278 b 59 72 229 109 141 72 b 56 76 56 73 56 75 b 229 331 81 226 154 249 b 310 423 264 369 289 397 b 330 350 318 396 325 366 z',\n },\n flag64thUp: {\n x_min: 0,\n x_max: 261,\n y_min: -812,\n y_max: 347,\n ha: 1159,\n o: 'm 374 -969 b 337 -806 372 -913 359 -858 b 336 -796 336 -804 336 -801 b 337 -788 336 -793 336 -791 b 370 -616 340 -778 370 -698 b 340 -482 370 -570 360 -524 b 369 -330 353 -445 369 -386 b 337 -203 369 -287 359 -242 b 369 -43 350 -167 369 -104 b 366 -4 369 -30 367 -17 b 220 228 350 84 317 122 b 46 472 148 305 71 328 b 20 500 45 485 32 500 b 0 482 10 500 0 492 l 0 -609 l 7 -609 b 278 -802 91 -612 186 -615 b 323 -999 310 -865 323 -930 b 311 -1122 323 -1040 318 -1080 b 310 -1132 311 -1126 310 -1129 b 328 -1166 310 -1149 318 -1162 b 337 -1169 331 -1168 334 -1169 b 366 -1146 346 -1169 356 -1162 b 376 -1009 370 -1138 376 -1071 b 374 -969 376 -995 374 -982 z m 300 24 b 321 -45 315 -4 321 -26 b 317 -75 321 -56 318 -65 l 298 -145 b 220 -58 278 -121 253 -94 b 58 187 148 20 82 43 b 56 193 58 189 58 192 b 300 24 138 193 220 157 z m 300 -261 b 321 -330 315 -289 321 -311 b 317 -360 321 -341 318 -350 b 300 -423 314 -374 307 -399 b 220 -334 279 -397 253 -370 b 56 -92 150 -256 79 -232 b 300 -261 135 -92 220 -127 z m 315 -657 b 308 -690 312 -668 312 -680 b 292 -698 307 -694 300 -698 b 282 -693 288 -698 284 -697 b 216 -608 261 -661 240 -636 l 209 -600 b 55 -386 147 -527 84 -497 b 73 -367 52 -376 63 -367 b 318 -622 189 -367 318 -505 b 315 -657 318 -634 317 -645 z',\n },\n flag64thDown: {\n x_min: 0,\n x_max: 273,\n y_min: -376,\n y_max: 812,\n ha: 1188,\n o: 'm 393 973 b 333 1169 393 1002 383 1169 b 324 1168 330 1169 327 1169 b 304 1130 314 1164 304 1149 b 305 1120 304 1128 305 1125 b 334 962 317 1056 334 1011 b 289 821 334 922 323 880 b 0 619 180 625 88 622 l 0 -523 b 20 -541 0 -534 9 -541 b 48 -513 35 -541 46 -526 b 229 -258 72 -363 154 -340 b 380 -16 330 -148 364 -108 b 384 27 383 -1 384 13 b 351 189 384 88 366 151 b 380 278 366 216 374 243 b 383 320 383 291 383 305 b 351 484 383 382 364 445 b 384 629 374 526 384 580 b 356 780 384 704 361 766 b 356 783 356 782 356 783 l 351 791 b 356 804 351 796 353 799 l 361 814 b 393 958 380 850 387 865 z m 56 386 b 217 609 86 501 153 533 b 292 706 246 642 269 670 b 304 711 295 710 300 711 b 321 703 311 711 320 707 b 328 670 325 693 325 681 b 331 634 330 658 331 645 b 82 367 331 516 199 367 l 75 367 b 56 386 62 367 56 379 z m 330 350 b 334 320 331 340 334 331 b 311 248 334 301 328 278 b 59 72 229 109 141 72 b 56 76 56 73 56 75 b 229 331 81 226 154 249 b 310 423 264 369 289 397 b 330 350 318 396 325 366 z m 330 56 b 334 26 331 46 334 37 b 311 -46 334 7 328 -16 b 56 -222 229 -184 137 -222 b 229 36 75 -86 145 -55 b 311 128 264 73 289 102 z',\n },\n flag128thUp: {\n x_min: 0,\n x_max: 261,\n y_min: -812,\n y_max: 533,\n ha: 1345,\n o: 'm 374 -969 b 337 -806 372 -913 359 -858 b 336 -796 336 -804 336 -801 b 337 -788 336 -793 336 -791 b 370 -616 340 -778 370 -698 b 340 -482 370 -570 360 -524 b 369 -330 353 -445 369 -386 b 337 -203 369 -287 359 -242 b 369 -43 350 -167 369 -104 b 366 -4 369 -30 367 -17 b 341 75 360 26 353 50 b 369 222 354 111 369 167 b 366 264 369 236 369 251 b 220 495 350 351 317 390 b 46 740 148 573 71 596 b 22 768 45 753 35 768 b 0 750 10 768 0 760 l 0 -609 l 7 -609 b 278 -802 91 -612 186 -615 b 323 -999 310 -865 323 -930 b 311 -1122 323 -1040 318 -1080 b 310 -1132 311 -1126 310 -1129 b 328 -1166 310 -1149 318 -1162 b 337 -1169 331 -1168 334 -1169 b 366 -1146 346 -1169 356 -1162 b 376 -1009 370 -1138 376 -1071 b 374 -969 376 -995 374 -982 z m 300 292 b 321 223 315 264 321 242 b 317 193 321 212 318 203 b 301 135 314 180 308 158 b 220 228 281 161 255 190 b 55 461 151 304 79 327 b 300 292 134 461 220 426 z m 300 24 b 321 -45 315 -4 321 -26 b 317 -75 321 -56 318 -65 l 298 -145 b 220 -58 278 -121 253 -94 b 56 187 148 20 81 43 b 55 193 56 189 56 192 b 300 24 137 193 220 157 z m 300 -261 b 321 -330 315 -289 321 -311 b 317 -360 321 -341 318 -350 b 300 -423 314 -374 307 -399 b 220 -334 279 -397 253 -370 b 56 -92 150 -256 79 -232 b 300 -261 135 -92 220 -127 z m 315 -657 b 308 -690 312 -668 312 -680 b 292 -698 307 -694 300 -698 b 282 -693 288 -698 284 -697 b 216 -608 261 -661 240 -636 l 209 -600 b 55 -386 147 -527 84 -497 b 73 -367 53 -376 62 -367 b 318 -622 189 -367 318 -505 b 315 -657 318 -634 317 -645 z',\n },\n flag128thDown: {\n x_min: 0,\n x_max: 273,\n y_min: -580,\n y_max: 812,\n ha: 1392,\n o: 'm 393 973 b 333 1169 393 1002 383 1169 b 324 1168 330 1169 327 1169 b 304 1130 314 1164 304 1149 b 305 1120 304 1128 305 1125 b 334 962 317 1056 334 1011 b 289 821 334 922 323 880 b 0 619 180 625 88 622 l 0 -816 b 20 -835 0 -828 7 -835 b 48 -806 33 -835 46 -819 b 229 -552 72 -657 154 -634 b 380 -310 330 -442 364 -402 b 384 -266 383 -295 384 -281 b 351 -105 384 -206 366 -143 b 384 27 372 -66 384 -16 b 351 189 384 88 366 151 b 380 278 366 216 374 243 b 383 320 383 291 383 305 b 351 484 383 382 364 445 b 384 629 374 526 384 580 b 356 780 384 704 361 766 b 356 783 356 782 356 783 l 351 791 b 356 804 351 796 353 799 l 361 814 b 393 958 380 850 387 865 z m 56 386 b 217 609 86 501 153 533 b 292 706 246 642 269 670 b 304 711 295 710 300 711 b 321 703 311 711 320 707 b 328 670 325 693 325 681 b 331 634 330 658 331 645 b 82 367 331 516 199 367 l 75 367 b 56 386 62 367 56 379 z m 330 350 b 334 320 331 340 334 331 b 311 248 334 301 328 278 b 59 72 229 109 141 72 b 56 76 56 73 56 75 b 229 331 81 226 154 249 b 310 423 264 369 289 397 b 330 350 318 396 325 366 z m 330 56 b 334 26 331 46 334 37 b 311 -46 334 7 328 -16 b 56 -222 229 -184 137 -222 b 229 36 75 -86 145 -55 b 311 128 264 73 289 102 z m 330 -238 b 334 -268 331 -248 334 -256 b 311 -340 334 -287 328 -310 b 56 -516 229 -478 137 -516 b 229 -258 75 -380 145 -348 b 311 -166 264 -220 289 -192 z',\n },\n accidentalFlat: {\n x_min: 0,\n x_max: 226,\n y_min: -175,\n y_max: 439,\n ha: 614,\n o: 'm 17 -245 b 30 -252 22 -251 26 -252 b 39 -249 35 -252 39 -249 b 153 -161 82 -225 117 -186 b 325 82 281 -72 325 16 b 196 220 325 164 262 216 b 117 196 171 220 137 209 b 85 176 108 189 92 176 b 78 177 82 176 81 176 b 62 202 68 181 62 192 b 72 608 63 233 72 579 b 45 632 72 624 59 632 b 0 592 24 632 1 618 b 17 -245 0 592 6 -230 z m 68 -117 b 63 27 68 -117 63 -30 b 66 73 63 50 65 68 b 167 144 76 102 134 144 b 226 60 209 144 226 96 b 98 -134 226 -17 160 -95 b 84 -138 92 -137 88 -138 b 68 -117 71 -138 68 -124 z',\n },\n accidentalNatural: {\n x_min: 0,\n x_max: 168,\n y_min: -335,\n y_max: 341,\n ha: 676,\n o: 'm 203 261 b 197 259 200 261 199 259 b 68 226 197 259 105 226 b 53 233 59 226 53 228 l 53 474 b 36 491 53 484 45 491 l 17 491 b 0 474 7 491 0 484 l 0 -268 b 13 -281 0 -276 4 -281 l 16 -279 b 22 -278 17 -279 20 -279 b 164 -235 42 -269 122 -235 b 189 -251 179 -235 189 -239 l 189 -465 b 206 -482 189 -475 196 -482 l 225 -482 b 242 -465 233 -482 242 -475 l 242 258 b 230 269 242 265 236 269 b 225 268 229 269 226 269 z m 53 56 b 176 114 53 76 141 114 b 189 107 184 114 189 112 l 189 -42 b 71 -101 189 -68 107 -101 b 53 -92 60 -101 53 -98 z',\n },\n accidentalSharp: {\n x_min: 0,\n x_max: 249,\n y_min: -348,\n y_max: 350,\n ha: 698,\n o: 'm 341 170 b 359 194 351 174 359 186 l 359 297 b 348 308 359 304 354 308 b 341 307 346 308 344 308 b 305 294 341 307 312 295 b 285 312 295 294 285 301 l 285 488 b 265 504 285 497 276 504 b 242 488 251 504 242 497 l 242 301 b 223 259 240 287 236 268 b 132 223 206 249 157 229 b 115 252 120 223 115 240 l 115 425 b 95 441 115 433 105 441 b 72 425 81 441 72 433 l 72 230 b 55 192 72 210 63 196 b 17 176 46 187 17 176 b 0 153 7 173 0 161 l 0 50 b 13 37 0 42 4 37 l 16 39 b 50 53 17 39 39 48 l 52 55 b 72 29 63 55 72 40 l 72 -114 b 56 -147 72 -130 65 -143 b 17 -163 48 -150 17 -163 b 0 -186 7 -166 0 -177 l 0 -288 b 13 -301 0 -297 4 -301 l 16 -300 b 50 -287 17 -300 37 -291 b 55 -285 52 -285 53 -285 b 72 -308 65 -285 72 -301 l 72 -485 b 91 -501 72 -494 81 -501 b 115 -485 105 -501 115 -494 l 115 -285 b 130 -253 115 -266 122 -256 l 217 -217 b 219 -217 217 -217 219 -217 l 222 -216 b 242 -242 235 -216 242 -233 l 242 -422 b 261 -438 242 -431 251 -438 b 285 -422 276 -438 285 -431 l 285 -217 b 301 -184 285 -206 291 -189 b 341 -168 311 -180 341 -168 b 359 -144 351 -164 359 -153 l 359 -42 b 348 -30 359 -35 354 -30 b 341 -32 346 -30 344 -30 l 304 -46 b 285 -20 295 -46 285 -37 l 285 114 b 304 156 285 124 292 151 z m 242 -65 b 132 -122 233 -94 166 -122 b 115 -115 124 -122 117 -120 b 111 -43 112 -109 111 -78 b 115 63 111 1 112 52 b 220 118 118 88 184 118 b 242 109 230 118 239 115 b 248 27 245 102 248 66 b 242 -65 248 -12 245 -52 z',\n },\n accidentalDoubleSharp: {\n x_min: 0,\n x_max: 247,\n y_min: -125,\n y_max: 127,\n ha: 252,\n o: 'm 274 -46 b 206 1 258 -37 206 -9 b 274 50 206 22 253 43 b 278 50 275 50 276 50 l 287 49 b 346 63 304 49 331 52 b 356 115 353 71 356 92 b 292 183 356 174 351 183 b 233 173 266 183 240 180 b 226 117 228 168 226 143 b 179 49 219 101 196 49 b 130 117 158 49 135 96 b 118 173 130 141 125 167 b 66 183 112 180 89 183 b 7 173 42 183 16 180 b 0 120 3 170 0 145 b 7 63 0 94 3 68 b 68 49 17 55 43 49 b 82 50 73 49 78 50 b 150 3 98 42 150 13 b 84 -46 150 -16 104 -39 l 69 -46 b 7 -56 43 -46 16 -49 b 0 -111 3 -60 0 -85 b 7 -166 0 -137 3 -163 b 65 -180 17 -174 40 -180 b 118 -166 86 -180 109 -176 b 130 -111 127 -158 130 -134 b 132 -105 130 -109 131 -107 b 177 -45 141 -85 158 -45 b 226 -111 196 -45 220 -91 b 233 -166 226 -137 228 -161 b 291 -180 243 -174 266 -180 b 356 -114 346 -180 356 -166 b 346 -56 356 -89 351 -63 b 288 -46 338 -49 312 -46 z',\n },\n accidentalDoubleFlat: {\n x_min: 0,\n x_max: 411,\n y_min: -175,\n y_max: 437,\n ha: 612,\n o: 'm 452 217 b 384 194 426 217 408 207 b 350 176 374 189 363 176 b 343 177 347 176 344 176 b 328 202 333 180 328 190 b 337 606 328 232 337 579 b 310 629 337 622 324 629 b 265 592 291 629 268 616 b 269 194 265 592 266 395 b 196 217 248 209 223 217 l 187 217 b 120 194 160 217 143 207 b 85 176 108 189 98 176 b 78 177 82 176 81 176 b 62 202 68 180 62 190 b 72 606 62 232 72 579 b 45 629 72 622 59 629 b 0 592 24 629 1 616 b 17 -245 0 592 7 -232 b 30 -252 22 -251 26 -252 b 39 -249 35 -252 39 -249 b 153 -161 84 -226 120 -186 b 274 -50 206 -124 246 -85 b 284 -245 276 -158 279 -240 b 295 -252 288 -251 292 -252 b 304 -249 300 -252 304 -249 b 416 -163 348 -226 383 -186 b 592 82 546 -72 592 16 b 461 217 592 163 528 216 z m 96 -134 b 84 -138 92 -137 86 -138 b 68 -115 72 -138 68 -124 b 63 26 68 -115 63 -30 b 66 72 63 49 65 66 b 168 144 75 101 134 144 b 226 59 212 144 226 95 b 96 -134 226 -22 161 -94 z m 361 -134 b 348 -138 356 -137 351 -138 b 333 -115 337 -138 333 -124 b 328 39 333 -115 328 -16 b 330 72 328 55 328 68 b 433 144 338 101 399 144 b 468 130 448 144 459 140 b 490 59 481 112 490 88 b 361 -134 490 -22 426 -94 z',\n },\n accidentalParensLeft: {\n x_min: 0,\n x_max: 141,\n y_min: -248,\n y_max: 247,\n ha: 495,\n o: 'm 203 331 l 203 351 b 202 356 203 354 203 356 b 0 0 60 281 0 140 b 199 -357 0 -144 60 -269 b 203 -354 200 -357 203 -356 l 203 -333 b 200 -327 203 -330 202 -328 b 86 0 118 -253 86 -160 b 200 324 86 158 120 251 b 203 331 202 325 203 327 z',\n },\n accidentalParensRight: {\n x_min: 0,\n x_max: 141,\n y_min: -248,\n y_max: 247,\n ha: 495,\n o: 'm 0 331 b 3 324 0 327 1 325 b 117 0 84 251 117 158 b 3 -327 117 -160 85 -253 b 0 -333 1 -328 0 -330 l 0 -354 b 4 -357 0 -356 3 -357 b 203 0 143 -269 203 -144 b 1 356 203 140 143 281 b 0 351 0 356 0 354 z',\n },\n accidentalQuarterToneFlatStein: {\n x_min: 1,\n x_max: 227,\n y_min: -175,\n y_max: 439,\n ha: 614,\n o: 'm 310 -245 b 327 592 321 -230 327 592 b 282 632 325 618 302 632 b 255 608 268 632 255 624 b 265 202 255 579 264 233 b 249 177 265 192 259 181 b 242 176 246 176 245 176 b 210 196 235 176 219 189 b 131 220 190 209 156 220 b 1 85 65 216 1 164 b 174 -161 1 16 46 -72 b 288 -249 210 -186 245 -225 b 297 -252 288 -249 292 -252 b 310 -245 301 -252 305 -251 z m 259 -117 b 243 -138 259 -124 256 -138 b 229 -134 239 -138 235 -137 b 101 60 167 -95 101 -17 b 160 144 101 96 118 144 b 261 73 193 144 251 102 b 264 27 262 68 264 50 b 259 -117 264 -30 259 -117 z',\n },\n accidentalThreeQuarterTonesFlatZimmermann: {\n x_min: 1,\n x_max: 466,\n y_min: -175,\n y_max: 439,\n ha: 614,\n o: 'm 363 -245 b 376 -252 367 -251 372 -252 b 384 -249 380 -252 384 -249 b 497 -161 428 -226 464 -186 b 671 84 625 -72 671 16 b 541 220 671 164 606 217 b 513 217 531 220 523 219 b 464 196 495 212 480 206 b 431 176 452 189 442 176 b 423 177 428 176 426 176 b 408 202 413 180 408 190 l 419 608 b 392 632 419 625 406 632 b 346 592 372 632 347 618 b 363 -245 346 592 351 -230 z m 289 -249 b 297 -252 289 -249 292 -252 b 310 -245 300 -252 305 -251 b 328 592 321 -230 328 592 b 282 631 327 618 302 631 b 255 608 268 631 255 624 l 266 202 b 251 177 266 190 261 180 b 243 176 248 176 246 176 b 210 196 232 176 222 189 b 164 216 196 204 180 210 l 163 217 b 132 220 151 219 143 220 b 1 84 65 217 1 163 b 177 -163 1 16 48 -72 b 289 -249 210 -186 245 -226 z m 262 72 b 265 26 264 66 265 49 b 261 -115 265 -30 261 -115 b 245 -138 261 -124 258 -138 b 230 -134 240 -138 236 -137 b 102 60 166 -92 102 -20 b 124 128 102 88 111 112 b 161 144 134 138 147 144 b 199 134 173 144 184 141 b 262 72 219 122 256 92 z m 413 -115 b 409 26 413 -115 409 -30 b 412 72 409 49 410 66 b 514 144 420 102 480 144 b 570 60 557 144 570 96 b 442 -134 570 -23 508 -91 b 429 -138 436 -137 433 -138 b 413 -115 418 -138 413 -124 z',\n },\n accidentalQuarterToneSharpStein: {\n x_min: 0,\n x_max: 179,\n y_min: -353,\n y_max: 307,\n ha: 660,\n o: 'm 258 240 b 246 252 258 248 252 252 b 240 251 245 252 242 252 b 168 225 240 251 171 225 b 150 253 156 225 150 240 l 150 426 b 130 442 150 435 141 442 b 105 418 108 442 105 429 l 105 230 b 91 193 105 219 101 202 b 17 161 65 183 42 171 b 0 138 9 158 0 147 l 0 36 b 13 23 0 27 4 23 l 16 24 b 86 53 17 24 73 49 l 88 55 b 107 30 98 55 107 42 l 107 -114 b 92 -145 107 -130 101 -143 l 17 -177 b 0 -200 9 -180 0 -192 l 0 -302 b 13 -315 0 -311 4 -315 l 16 -314 b 85 -285 17 -314 72 -291 b 105 -312 92 -282 105 -301 l 105 -492 b 125 -508 105 -501 114 -508 b 150 -484 147 -508 150 -498 l 150 -285 b 151 -274 150 -281 150 -278 b 164 -253 153 -265 158 -256 b 240 -225 176 -251 240 -225 b 258 -202 249 -222 258 -210 l 258 -99 b 245 -86 258 -91 253 -86 l 242 -88 b 240 -88 242 -88 240 -88 l 240 -86 b 168 -115 240 -86 174 -114 b 148 -91 158 -115 148 -107 l 148 43 b 167 85 148 55 156 81 b 240 114 180 91 240 114 b 258 138 249 118 258 128 z',\n },\n accidentalThreeQuarterTonesSharpStein: {\n x_min: 3,\n x_max: 317,\n y_min: -347,\n y_max: 369,\n ha: 716,\n o: 'm 456 324 b 448 336 456 330 454 336 b 393 317 445 336 400 320 b 389 315 392 315 390 315 b 383 325 386 315 383 318 l 383 508 b 360 531 383 528 379 531 b 337 508 341 531 337 527 l 337 318 b 325 291 337 300 334 294 b 268 268 320 288 287 276 b 253 281 256 268 253 274 l 253 464 b 230 487 253 484 249 487 b 207 464 212 487 207 482 l 207 264 b 194 240 207 253 204 245 l 132 217 b 131 217 132 217 132 217 l 130 216 b 118 229 122 216 118 220 l 118 420 b 95 444 118 439 114 444 b 72 420 76 444 72 439 l 72 212 b 60 190 72 197 68 193 l 16 173 b 4 161 9 170 4 167 l 4 50 b 13 39 4 45 9 39 b 58 55 16 39 46 49 b 63 56 60 56 62 56 b 72 42 71 56 72 50 l 72 -125 b 58 -150 72 -137 65 -147 l 16 -166 b 4 -177 9 -168 4 -171 l 4 -289 b 14 -301 4 -295 9 -301 b 53 -287 16 -301 40 -291 b 62 -285 56 -285 59 -285 b 72 -298 69 -285 72 -289 l 72 -477 b 95 -500 72 -495 76 -500 b 118 -477 114 -500 118 -495 l 118 -278 b 127 -259 118 -269 121 -261 l 196 -232 b 207 -243 204 -232 207 -235 l 207 -432 b 230 -455 207 -452 212 -455 b 253 -432 249 -455 253 -451 l 253 -228 b 268 -204 253 -216 259 -207 l 320 -186 b 328 -183 323 -184 325 -183 b 337 -194 334 -183 337 -187 l 337 -387 b 360 -410 337 -408 341 -410 b 383 -387 379 -410 383 -406 l 383 -174 b 395 -157 383 -166 390 -158 l 445 -138 b 456 -127 452 -135 456 -132 l 456 -14 b 448 -3 456 -10 454 -3 b 397 -22 445 -3 408 -17 l 396 -23 b 383 -6 387 -23 383 -16 l 383 163 b 392 181 383 173 384 179 b 445 202 397 183 445 202 b 456 213 452 203 456 207 z m 337 -45 b 266 -78 333 -56 287 -78 b 258 -75 262 -78 259 -76 b 253 19 255 -71 253 -27 b 258 130 253 69 255 122 b 333 163 264 141 315 163 b 337 161 334 163 337 161 b 341 78 340 157 341 120 b 337 -45 341 24 340 -37 z m 118 -127 b 114 -48 114 -121 114 -86 b 118 78 114 6 115 68 b 200 114 122 91 180 114 b 207 111 204 114 206 112 b 212 22 210 107 212 66 b 207 -94 212 -29 210 -85 b 127 -130 203 -108 148 -130 b 118 -127 122 -130 120 -128 z',\n },\n accidentalBuyukMucennebFlat: {\n x_min: 1,\n x_max: 287,\n y_min: -174,\n y_max: 438,\n ha: 612,\n o: 'm 379 452 b 370 464 379 458 377 464 b 164 389 366 464 170 392 b 156 396 163 389 156 393 b 157 436 157 409 157 428 b 167 452 157 445 161 449 b 366 526 173 455 366 526 b 379 540 374 528 379 534 l 379 611 b 370 622 379 616 377 622 b 170 550 366 622 174 552 b 160 557 163 550 160 554 b 161 608 160 585 161 602 b 134 631 161 624 148 631 b 89 590 114 631 91 616 l 89 528 b 81 517 89 526 88 518 b 16 491 76 514 16 491 b 1 480 6 490 1 485 l 1 406 b 13 395 1 400 4 395 l 14 396 b 79 419 16 396 72 415 b 89 412 86 419 89 415 b 91 376 89 399 89 386 b 82 359 91 364 89 361 b 16 331 76 356 16 331 b 1 321 6 331 1 328 l 1 248 b 13 236 1 242 4 236 b 79 262 16 236 71 258 b 92 251 89 262 92 256 b 107 -242 95 23 101 -236 b 120 -251 111 -249 115 -251 b 128 -248 124 -251 128 -248 b 240 -160 171 -225 207 -184 b 413 84 367 -71 413 16 b 284 220 413 166 350 216 b 207 196 259 220 229 209 b 170 176 196 190 184 176 l 168 177 b 151 203 157 181 151 192 b 153 269 151 210 151 236 b 163 292 153 275 153 289 b 366 367 173 297 366 367 b 379 383 374 370 379 376 z m 186 -132 b 173 -137 180 -135 176 -137 b 157 -114 161 -137 157 -122 b 153 35 157 -114 153 -22 b 154 73 153 53 153 68 b 219 135 160 92 197 124 b 255 144 232 141 243 144 b 292 130 269 144 282 140 b 314 62 305 114 314 91 b 186 -132 314 -17 251 -94 z',\n },\n accidentalBakiyeFlat: {\n x_min: -1,\n x_max: 286,\n y_min: -175,\n y_max: 439,\n ha: 614,\n o: 'm 377 454 b 369 467 377 458 376 467 b 363 465 367 467 364 467 b 161 390 363 465 167 393 b 153 399 154 390 153 395 b 157 608 154 494 157 593 b 130 632 157 624 144 632 b 86 592 111 632 88 618 b 88 377 86 592 86 501 b 76 356 88 373 88 360 l 12 331 b -1 320 3 330 -1 327 l -1 248 b 9 236 -1 242 1 236 b 81 264 12 236 78 261 b 89 258 86 264 89 261 b 104 -245 92 30 96 -236 b 115 -252 108 -251 112 -252 b 124 -249 120 -252 124 -249 b 239 -161 167 -226 203 -186 b 412 84 367 -72 412 17 b 282 220 412 166 348 216 b 255 216 274 220 264 219 b 203 196 238 212 222 206 b 171 177 193 189 177 177 b 163 179 168 177 166 177 b 147 202 153 181 147 192 b 147 216 147 204 147 209 l 150 262 b 150 276 150 269 150 275 b 158 291 150 287 154 289 b 363 370 163 292 363 370 b 377 384 373 373 377 379 z m 181 -134 b 167 -138 176 -137 171 -138 b 153 -117 156 -138 153 -125 b 148 27 153 -117 148 -30 b 151 73 148 50 150 68 b 255 144 161 105 219 144 b 312 62 298 144 312 99 b 181 -134 312 -19 249 -96 z',\n },\n accidentalKomaSharp: {\n x_min: 0,\n x_max: 229,\n y_min: -337,\n y_max: 322,\n ha: 659,\n o: 'm 312 151 b 330 176 323 156 330 166 l 330 278 b 320 289 330 285 327 289 b 312 288 318 289 315 289 b 200 246 312 288 203 248 b 181 275 187 246 181 264 l 181 448 b 163 464 181 456 173 464 b 138 441 140 464 138 452 l 138 253 b 122 215 137 240 132 225 b 17 177 92 203 45 177 b 0 153 7 173 0 163 l 0 50 b 10 39 0 43 4 39 b 17 40 13 39 14 39 l 128 81 b 138 52 138 81 138 63 l 138 -91 b 124 -124 138 -107 132 -120 b 17 -167 115 -127 17 -167 b 0 -192 7 -171 0 -181 l 0 -294 b 10 -305 0 -301 4 -305 b 17 -304 13 -305 14 -305 b 128 -261 17 -304 117 -264 l 130 -259 b 138 -276 137 -259 138 -268 l 138 -469 b 157 -485 138 -478 147 -485 b 181 -462 179 -485 181 -475 l 181 -262 b 183 -252 181 -258 181 -255 b 197 -232 186 -243 190 -235 b 312 -187 207 -228 312 -187 b 330 -163 323 -183 330 -173 l 330 -60 b 320 -49 330 -53 327 -49 b 312 -50 318 -49 315 -49 l 200 -94 b 193 -95 197 -95 194 -95 b 181 -68 183 -95 181 -85 l 181 66 b 200 108 181 92 189 104 z',\n },\n accidentalKucukMucennebSharp: {\n x_min: -1,\n x_max: 339,\n y_min: -338,\n y_max: 321,\n ha: 659,\n o: 'm 264 92 b 271 102 264 98 265 99 l 395 150 b 412 174 405 154 412 164 l 412 276 b 402 288 412 284 409 288 b 395 287 400 288 397 288 b 282 245 395 287 285 246 b 264 274 269 245 264 262 l 264 446 b 245 462 264 455 255 462 b 220 439 222 462 220 451 l 220 252 b 204 213 219 239 215 223 b 99 176 174 202 127 176 b 82 151 89 171 82 161 l 82 49 b 92 37 82 42 86 37 b 99 39 95 37 96 37 l 210 79 b 216 81 212 81 215 81 b 220 78 219 81 220 79 l 220 56 b 216 46 220 52 220 48 b 16 -29 210 45 16 -29 b -1 -45 4 -32 -1 -36 l -1 -138 b 12 -154 -1 -145 3 -154 l 215 -79 b 220 -84 219 -79 220 -81 l 220 -105 b 210 -122 220 -115 219 -120 b 99 -168 202 -127 99 -168 b 82 -193 89 -173 82 -183 l 82 -295 b 92 -307 82 -302 86 -307 b 99 -305 95 -307 96 -307 b 210 -262 99 -305 199 -265 l 212 -261 b 220 -278 219 -261 220 -269 l 220 -471 b 239 -487 220 -480 229 -487 b 264 -464 261 -487 264 -477 l 264 -264 b 265 -253 264 -259 264 -256 b 279 -233 268 -245 272 -236 b 395 -189 289 -229 395 -189 b 412 -164 405 -184 412 -174 l 412 -62 b 402 -50 412 -55 409 -50 b 395 -52 400 -50 397 -50 l 278 -96 b 264 -86 268 -96 264 -94 l 264 -68 b 269 -59 264 -62 265 -60 b 471 17 274 -58 471 17 b 488 36 484 22 488 27 l 488 127 b 475 144 488 134 487 144 l 472 141 b 471 141 472 141 471 141 l 471 143 b 272 68 471 143 282 71 l 269 66 b 264 71 264 66 264 69 z',\n },\n accidentalKoron: {\n x_min: 0,\n x_max: 300,\n y_min: -472,\n y_max: 157,\n ha: 629,\n o: 'm 432 -4 b 415 10 432 1 418 9 l 4 226 b 0 223 1 226 0 225 l 0 -672 b 7 -680 0 -677 3 -680 l 45 -680 b 52 -672 49 -680 52 -677 l 52 -193 l 415 -22 b 432 -4 418 -20 432 -13 z m 52 -137 l 52 144 l 327 -7 z',\n },\n accidentalSori: {\n x_min: 0,\n x_max: 421,\n y_min: -318,\n y_max: 328,\n ha: 646,\n o: 'm 606 10 b 589 23 606 16 592 22 l 382 109 l 382 465 b 374 472 382 469 379 472 l 337 472 b 330 465 333 472 330 469 l 330 132 l 183 194 l 183 425 b 176 432 183 429 180 432 l 138 432 b 131 425 134 432 131 429 l 131 216 l 3 269 b 0 265 0 269 0 266 l 0 223 b 3 213 0 216 0 215 l 131 160 l 131 -150 l 3 -203 b 0 -212 0 -204 0 -206 l 0 -255 b 3 -259 0 -258 1 -259 l 131 -204 l 131 -451 b 138 -458 131 -455 134 -458 l 176 -458 b 183 -451 180 -458 183 -455 l 183 -183 l 330 -120 l 330 -410 b 337 -418 330 -415 333 -418 l 374 -418 b 382 -410 379 -418 382 -415 l 382 -98 l 589 -9 b 606 10 592 -9 606 0 z m 183 -128 l 183 138 l 330 76 l 330 -66 z m 382 -45 l 382 55 l 501 6 z',\n },\n articAccentAbove: {\n x_min: 0,\n x_max: 339,\n y_min: 1,\n y_max: 245,\n ha: 244,\n o: 'm 469 151 b 488 177 488 156 488 166 b 469 203 488 189 488 197 l 37 350 b 24 353 32 351 26 353 b 3 333 12 353 7 344 b 0 318 1 327 0 323 b 20 298 0 311 4 304 b 346 187 20 298 331 193 b 356 177 353 186 356 181 b 344 167 356 173 353 170 b 20 58 328 163 20 58 b 0 36 4 50 0 43 b 3 23 0 32 1 27 b 23 1 7 13 13 1 b 29 3 24 1 27 1 z',\n },\n articAccentBelow: {\n x_min: 0,\n x_max: 339,\n y_min: -244,\n y_max: 0,\n ha: 244,\n o: 'm 469 -202 b 488 -176 488 -197 488 -187 b 469 -150 488 -164 488 -156 l 37 -3 b 24 0 32 -1 26 0 b 3 -20 12 0 7 -9 b 0 -35 1 -26 0 -30 b 20 -55 0 -42 4 -49 b 346 -166 20 -55 331 -160 b 356 -176 353 -167 356 -171 b 344 -186 356 -180 353 -183 b 20 -295 328 -190 20 -295 b 0 -317 4 -302 0 -310 b 3 -330 0 -321 1 -325 b 23 -351 7 -340 13 -351 b 29 -350 24 -351 27 -351 z',\n },\n articTenutoAbove: {\n x_min: -1,\n x_max: 338,\n y_min: 0,\n y_max: 48,\n ha: 48,\n o: 'm 452 0 b 487 35 485 0 487 16 b 452 69 487 53 487 69 l 33 69 b -1 35 -1 69 -1 53 b 33 0 -1 16 -1 0 z',\n },\n articTenutoBelow: {\n x_min: -1,\n x_max: 338,\n y_min: -48,\n y_max: 0,\n ha: 48,\n o: 'm 452 -69 b 487 -35 485 -69 487 -53 b 452 0 487 -16 487 0 l 33 0 b -1 -35 -1 0 -1 -16 b 33 -69 -1 -53 -1 -69 z',\n },\n articStaccatoAbove: {\n x_min: 0,\n x_max: 84,\n y_min: 0,\n y_max: 84,\n ha: 84,\n o: 'm 121 60 b 60 121 121 94 94 121 b 0 60 27 121 0 94 b 60 0 0 27 27 0 b 121 60 94 0 121 27 z',\n },\n articStaccatoBelow: {\n x_min: 0,\n x_max: 84,\n y_min: -84,\n y_max: 0,\n ha: 84,\n o: 'm 121 -60 b 60 0 121 -27 94 0 b 0 -60 27 0 0 -27 b 60 -121 0 -94 27 -121 b 121 -60 94 -121 121 -94 z',\n },\n articStaccatissimoAbove: {\n x_min: 1,\n x_max: 100,\n y_min: -2,\n y_max: 293,\n ha: 295,\n o: 'm 72 422 b 1 390 35 422 3 409 b 72 -3 1 369 39 -3 b 144 389 108 -3 144 356 b 72 422 144 410 111 422 z',\n },\n articStaccatissimoBelow: {\n x_min: 1,\n x_max: 100,\n y_min: -295,\n y_max: 0,\n ha: 295,\n o: 'm 72 -425 b 144 -392 111 -425 144 -413 b 72 0 144 -359 108 0 b 1 -393 39 0 1 -372 b 72 -425 3 -412 35 -425 z',\n },\n articMarcatoAbove: {\n x_min: -1,\n x_max: 235,\n y_min: -1,\n y_max: 253,\n ha: 254,\n o: 'm 181 356 b 167 364 177 361 173 364 b 153 356 157 364 153 356 l 0 23 b -1 16 -1 20 -1 19 b 9 0 -1 9 1 1 b 16 -1 10 -1 14 -1 b 32 9 22 -1 29 1 b 112 186 32 9 109 180 b 118 190 114 189 115 190 b 127 186 121 190 124 189 b 209 9 128 180 209 9 b 225 0 213 3 219 0 l 323 0 b 338 16 333 1 338 7 b 337 23 338 19 338 22 z',\n },\n articMarcatoBelow: {\n x_min: -1,\n x_max: 235,\n y_min: -254,\n y_max: 0,\n ha: 254,\n o: 'm 156 -357 b 170 -366 160 -363 164 -366 b 184 -357 180 -366 184 -357 l 337 -24 b 338 -17 338 -22 338 -20 b 328 -1 338 -10 336 -3 b 321 0 327 0 323 0 b 305 -10 315 0 308 -3 b 225 -187 305 -10 228 -181 b 219 -192 223 -190 222 -192 b 210 -187 216 -192 213 -190 b 128 -10 209 -181 128 -10 b 112 -1 124 -4 118 -1 l 14 -1 b -1 -17 4 -3 -1 -9 b 0 -24 -1 -20 -1 -23 z',\n },\n fermataAbove: {\n x_min: 3,\n x_max: 605,\n y_min: -3,\n y_max: 329,\n ha: 332,\n o: 'm 435 318 b 818 36 742 318 804 91 b 821 26 819 32 819 27 b 851 -4 831 6 837 -4 b 871 16 864 -4 871 1 b 870 30 871 20 871 24 b 438 474 780 471 480 474 b 6 30 392 474 94 471 b 4 14 4 24 4 19 b 23 -4 4 0 12 -4 b 52 26 36 -4 43 6 b 56 39 53 27 55 33 b 435 318 73 98 138 318 z m 516 75 b 436 153 516 117 480 153 b 359 75 395 153 359 117 b 436 -4 359 32 395 -4 b 516 75 480 -4 516 32 z',\n },\n fermataBelow: {\n x_min: 3,\n x_max: 605,\n y_min: -332,\n y_max: 0,\n ha: 332,\n o: 'm 435 -323 b 56 -43 138 -323 73 -102 b 52 -30 55 -37 53 -32 b 23 0 43 -10 36 0 b 4 -19 12 0 4 -4 b 6 -35 4 -23 4 -29 b 438 -478 94 -475 392 -478 b 870 -35 480 -478 780 -475 b 871 -20 871 -29 871 -24 b 851 0 871 -6 864 0 b 821 -30 837 0 831 -10 b 818 -40 819 -32 819 -36 b 435 -323 804 -95 742 -323 z m 516 -79 b 436 0 516 -36 480 0 b 359 -79 395 0 359 -36 b 436 -157 359 -121 395 -157 b 516 -79 480 -157 516 -121 z',\n },\n breathMarkComma: {\n x_min: 1,\n x_max: 152,\n y_min: 2,\n y_max: 251,\n ha: 249,\n o: 'm 104 361 b 1 271 42 361 1 321 b 82 190 1 222 35 190 b 122 160 118 190 122 160 b 125 144 124 154 125 150 b 102 88 125 124 115 105 b 37 32 78 56 40 35 b 26 17 32 29 26 26 l 27 16 b 37 3 29 6 33 3 b 181 102 85 3 158 66 b 219 239 210 147 219 197 l 219 249 b 104 361 219 317 170 361 z',\n },\n breathMarkUpbow: {\n x_min: 1,\n x_max: 249,\n y_min: 1,\n y_max: 495,\n ha: 494,\n o: 'm 181 1 b 206 22 193 1 203 10 l 359 683 l 359 688 b 338 713 359 700 351 710 l 333 713 b 308 694 321 713 311 706 l 180 140 l 53 694 b 27 713 49 706 39 713 l 22 713 b 1 690 10 710 1 700 b 3 683 1 687 1 685 l 154 22 b 181 1 157 10 167 1 z',\n },\n caesura: {\n x_min: 0,\n x_max: 384,\n y_min: -1,\n y_max: 532,\n ha: 533,\n o: 'm 40 -1 b 78 26 58 -1 72 9 l 321 713 b 323 726 323 717 323 721 b 282 766 323 747 304 766 b 245 739 265 766 251 756 l 3 52 b 0 37 1 48 0 42 b 27 1 0 22 10 7 b 40 -1 32 -1 36 -1 z m 308 26 l 552 713 b 553 726 553 717 553 721 b 513 766 553 747 534 766 b 475 739 495 766 481 756 l 232 52 b 230 39 230 48 230 43 b 258 1 230 23 240 7 b 271 -1 262 -1 266 -1 b 308 26 287 -1 302 9 z',\n },\n caesuraCurved: {\n x_min: 0,\n x_max: 373,\n y_min: 0,\n y_max: 530,\n ha: 530,\n o: 'm 491 763 b 445 719 468 763 446 744 b 252 98 432 507 340 295 l 226 39 b 223 27 225 35 223 32 b 252 0 223 13 233 0 b 276 16 262 0 272 6 b 537 716 386 230 537 478 b 491 763 537 742 518 763 z m 29 0 b 53 16 39 0 48 6 l 82 69 b 314 716 187 264 314 498 b 268 763 314 742 295 763 b 222 719 245 763 223 744 b 29 98 209 507 117 295 l 3 39 b 0 29 1 36 0 33 b 29 0 0 14 12 0 z',\n },\n restMaxima: {\n x_min: 0,\n x_max: 381,\n y_min: -249,\n y_max: 250,\n ha: 499,\n o: 'm 180 -330 l 180 331 b 156 360 180 356 170 360 l 23 360 b 0 331 10 360 0 356 l 0 -330 b 23 -359 0 -354 10 -359 l 156 -359 b 180 -330 170 -359 180 -354 z m 549 -330 l 549 331 b 524 360 549 356 539 360 l 392 360 b 369 331 379 360 369 356 l 369 -330 b 392 -359 369 -354 379 -359 l 524 -359 b 549 -330 539 -359 549 -354 z',\n },\n restDoubleWhole: {\n x_min: 0,\n x_max: 125,\n y_min: 0,\n y_max: 250,\n ha: 250,\n o: 'm 180 22 l 180 338 b 156 360 180 350 170 360 l 23 360 b 0 338 10 360 0 350 l 0 22 b 23 0 0 10 10 0 l 156 0 b 180 22 170 0 180 10 z',\n },\n restWhole: {\n x_min: 0,\n x_max: 282,\n y_min: -135,\n y_max: 9,\n ha: 144,\n o: 'm 406 -157 l 406 -24 b 369 13 406 -3 389 13 l 37 13 b 0 -24 16 13 0 -3 l 0 -157 b 37 -194 0 -177 16 -194 l 369 -194 b 406 -157 389 -194 406 -177 z',\n },\n restHalf: {\n x_min: 0,\n x_max: 282,\n y_min: -2,\n y_max: 142,\n ha: 144,\n o: 'm 406 35 l 406 167 b 369 204 406 189 389 204 l 37 204 b 0 167 16 204 0 189 l 0 35 b 37 -3 0 14 16 -3 l 369 -3 b 406 35 389 -3 406 14 z',\n },\n restQuarter: {\n x_min: 1,\n x_max: 270,\n y_min: -375,\n y_max: 373,\n ha: 748,\n o: 'm 112 -55 b 174 -141 135 -84 156 -111 b 183 -161 177 -147 183 -158 b 181 -167 183 -163 183 -166 b 166 -174 179 -173 173 -174 b 143 -170 160 -174 148 -171 b 137 -170 141 -170 138 -170 l 125 -166 b 1 -304 50 -166 1 -233 b 168 -527 1 -376 63 -446 b 206 -540 180 -536 194 -540 b 228 -531 216 -540 226 -537 b 230 -521 229 -527 230 -524 b 207 -487 230 -508 219 -497 b 170 -435 189 -487 173 -448 b 164 -397 166 -423 164 -410 b 255 -292 164 -338 194 -292 b 369 -317 297 -292 344 -308 l 370 -318 b 382 -320 376 -320 379 -320 b 389 -314 386 -320 389 -318 b 336 -232 389 -297 351 -249 b 236 -32 281 -166 236 -112 b 236 -27 236 -30 236 -29 l 238 -17 b 238 -13 238 -16 238 -14 b 333 199 243 71 295 140 b 338 220 337 206 338 213 b 333 248 338 235 333 248 b 95 526 333 248 120 501 b 69 537 88 533 78 537 b 40 507 55 537 40 527 b 46 484 40 500 42 492 b 134 291 52 468 134 395 b 48 108 134 238 112 176 b 27 66 33 94 27 78 b 42 32 27 46 42 32 z',\n },\n rest8th: {\n x_min: 0,\n x_max: 247,\n y_min: -251,\n y_max: 174,\n ha: 425,\n o: 'm 193 154 b 96 251 193 207 150 251 b 0 154 43 251 0 207 b 39 81 0 124 17 98 b 117 56 62 65 89 56 b 173 66 137 56 157 60 b 225 88 193 72 206 78 b 232 89 228 89 230 89 b 239 76 238 89 239 84 b 238 60 239 72 239 66 b 104 -343 233 39 130 -248 b 145 -361 104 -360 137 -361 b 196 -347 161 -361 181 -359 b 341 161 200 -344 341 161 b 356 217 347 187 354 210 b 338 240 356 232 341 239 b 323 235 336 240 331 240 b 193 140 312 226 240 140 z',\n },\n rest16th: {\n x_min: 0,\n x_max: 320,\n y_min: -500,\n y_max: 179,\n ha: 679,\n o: 'm 300 160 b 202 258 300 215 256 258 b 104 160 148 258 104 215 b 219 62 104 101 164 62 b 331 94 258 62 298 75 b 341 96 336 95 338 96 b 348 86 346 96 348 94 b 265 -173 348 63 275 -151 b 194 -217 253 -200 215 -217 b 196 -203 196 -212 196 -207 b 98 -105 196 -148 151 -105 b 0 -203 43 -105 0 -148 b 115 -301 0 -262 60 -301 b 223 -271 153 -301 190 -288 b 229 -279 226 -271 229 -274 l 228 -281 b 228 -282 228 -282 228 -282 l 91 -690 b 91 -691 91 -690 91 -691 l 89 -693 b 134 -720 89 -706 102 -720 b 189 -687 176 -720 183 -703 l 356 -138 b 420 81 393 -16 420 81 b 459 226 420 81 456 207 b 461 232 459 229 461 230 b 446 248 461 240 449 246 b 431 242 439 248 435 245 b 300 145 420 233 348 147 z',\n },\n rest32nd: {\n x_min: 0,\n x_max: 363,\n y_min: -500,\n y_max: 426,\n ha: 926,\n o: 'm 508 603 b 492 598 501 603 497 600 b 361 503 482 590 410 503 l 361 516 b 264 613 361 570 318 613 b 166 516 210 613 166 570 b 206 444 166 487 183 461 b 246 423 217 433 232 428 b 284 418 258 420 269 418 b 393 449 321 418 360 432 b 399 451 395 451 397 451 b 415 426 409 451 415 436 l 413 423 b 413 422 413 423 413 422 l 357 192 b 279 140 350 168 302 140 b 281 153 281 144 281 148 b 183 251 281 207 236 251 b 85 153 128 251 85 207 b 125 81 85 124 102 98 b 164 60 137 71 150 65 b 203 55 176 58 189 55 b 311 86 240 55 278 69 b 315 88 312 88 314 88 b 325 69 323 88 325 76 l 268 -167 b 194 -217 261 -197 216 -216 b 196 -203 196 -212 196 -207 b 98 -105 196 -148 153 -105 b 0 -203 45 -105 0 -148 b 115 -301 0 -262 60 -301 b 228 -269 154 -301 194 -288 b 232 -268 229 -268 230 -268 b 240 -276 236 -268 240 -272 b 138 -688 240 -282 141 -678 b 137 -697 137 -691 137 -694 b 176 -720 137 -708 145 -720 b 232 -690 222 -720 226 -706 b 484 436 236 -672 484 436 b 521 582 484 436 518 564 b 523 588 521 585 523 586 b 508 603 523 600 511 603 z',\n },\n rest64th: {\n x_min: 0,\n x_max: 423,\n y_min: -753,\n y_max: 430,\n ha: 1183,\n o: 'm 596 609 b 580 603 589 609 585 606 b 448 507 569 595 497 507 b 449 521 449 511 449 516 b 351 619 449 575 405 619 b 253 521 297 619 253 575 b 372 422 253 461 317 422 b 481 454 410 422 446 438 b 491 456 484 455 488 456 b 504 441 498 456 504 451 b 501 426 504 436 503 432 b 445 202 500 422 451 217 b 359 144 435 174 383 144 l 359 158 b 261 256 359 212 315 256 b 163 158 207 256 163 212 b 243 65 163 112 202 78 b 279 60 255 62 266 60 b 397 91 320 60 360 73 b 403 92 400 92 402 92 b 412 79 409 92 412 86 b 410 72 412 76 412 75 b 351 -161 408 59 356 -150 b 281 -212 340 -199 301 -212 l 281 -197 b 183 -99 281 -144 238 -99 b 85 -197 130 -99 85 -144 b 125 -271 85 -228 102 -253 b 166 -291 138 -279 151 -287 b 204 -297 177 -294 192 -297 b 262 -287 225 -297 245 -292 b 305 -265 282 -279 287 -274 b 310 -264 307 -264 308 -264 b 318 -284 317 -264 318 -275 b 317 -295 318 -288 317 -294 b 259 -524 315 -302 265 -508 b 194 -567 251 -554 213 -567 b 196 -554 196 -563 196 -559 b 98 -456 196 -500 153 -456 b 0 -554 45 -456 0 -500 b 40 -626 0 -583 17 -609 b 118 -652 60 -644 92 -652 b 210 -629 145 -652 186 -642 b 216 -628 213 -628 215 -628 b 228 -647 226 -628 228 -639 l 226 -651 b 226 -652 226 -651 226 -652 l 122 -1054 b 121 -1064 121 -1058 121 -1061 b 167 -1084 121 -1077 134 -1084 b 215 -1060 202 -1084 209 -1076 b 402 -278 217 -1047 229 -1021 b 436 -135 403 -278 431 -161 l 570 441 b 609 588 570 441 605 569 b 596 609 609 603 602 608 z',\n },\n rest128th: {\n x_min: 0,\n x_max: 485,\n y_min: -750,\n y_max: 689,\n ha: 1439,\n o: 'm 537 894 b 439 992 537 949 494 992 b 341 894 386 992 341 949 b 382 822 341 865 359 840 b 459 796 402 805 433 796 b 518 806 480 796 501 801 l 520 808 b 569 828 539 814 552 819 b 580 831 572 829 577 831 b 598 812 589 831 598 825 b 596 801 598 809 598 805 b 540 575 590 773 546 595 b 448 510 534 553 475 510 l 448 524 b 350 622 448 577 405 622 b 252 524 297 622 252 577 b 292 451 252 494 269 468 b 369 426 318 433 337 426 b 429 435 389 426 412 429 b 494 464 449 442 475 455 b 498 465 495 465 497 465 b 505 446 504 465 505 456 b 503 426 505 439 504 432 l 446 202 b 366 144 439 173 389 144 l 366 158 b 268 256 366 212 323 256 b 170 158 215 256 170 212 b 289 59 170 98 235 59 b 347 69 310 59 330 63 b 397 91 367 76 379 82 b 406 94 400 92 403 94 b 415 79 412 94 415 88 b 412 63 415 75 413 69 b 357 -157 408 42 364 -134 b 281 -212 346 -196 302 -212 b 282 -197 281 -207 282 -203 b 184 -99 282 -144 238 -99 b 86 -197 130 -99 86 -144 b 204 -297 86 -258 150 -297 b 262 -287 225 -297 245 -292 b 312 -265 282 -279 294 -274 b 318 -264 314 -264 317 -264 b 327 -275 324 -264 327 -269 b 266 -517 324 -287 278 -490 b 200 -569 248 -566 220 -567 l 196 -554 b 98 -456 196 -500 153 -456 b 0 -554 45 -456 0 -500 b 118 -652 0 -615 63 -652 b 177 -642 138 -652 160 -648 l 179 -641 b 229 -621 197 -635 210 -629 l 230 -619 b 239 -626 236 -619 239 -622 b 238 -632 239 -628 239 -631 b 131 -1057 235 -642 134 -1050 b 173 -1080 131 -1071 140 -1080 b 230 -1057 219 -1080 225 -1074 l 658 815 b 697 960 658 815 694 942 b 698 966 697 963 698 965 b 684 982 698 975 687 981 b 668 976 677 982 672 979 b 537 880 658 969 586 881 z',\n },\n dynamicPiano: {\n x_min: -89,\n x_max: 366,\n y_min: -142,\n y_max: 274,\n ha: 416,\n o: 'm 395 395 b 292 357 350 395 318 380 b 262 328 272 340 268 328 b 246 363 255 328 259 338 b 177 393 236 380 215 393 b 1 251 92 393 46 333 b -9 223 -6 238 -9 230 b 7 207 -9 213 -1 207 b 30 229 17 207 23 216 b 127 338 72 301 101 338 b 143 321 138 338 143 331 b 134 285 143 310 138 295 l -43 -154 b -65 -168 -48 -166 -50 -168 l -109 -168 b -128 -187 -122 -168 -128 -174 b -111 -204 -128 -199 -122 -204 l 167 -204 b 186 -186 180 -204 186 -199 b 168 -168 186 -174 180 -168 l 111 -168 b 98 -164 102 -168 98 -168 b 101 -154 98 -163 99 -158 l 166 7 b 179 24 168 14 171 24 b 213 -1 186 24 190 10 b 276 -14 233 -12 252 -14 b 527 266 415 -14 527 130 b 395 395 527 350 475 395 z m 356 341 b 389 288 380 341 389 320 b 243 35 389 217 312 35 b 207 81 219 35 207 50 b 235 180 207 111 219 140 l 264 251 b 356 341 284 300 321 341 z',\n },\n dynamicMezzo: {\n x_min: -20,\n x_max: 446,\n y_min: -10,\n y_max: 274,\n ha: 284,\n o: 'm 528 395 b 431 350 487 395 454 374 b 409 330 416 336 415 330 b 397 360 402 330 406 341 b 334 395 389 379 370 395 b 236 350 292 395 259 374 b 215 330 222 336 220 330 b 203 360 207 330 212 340 b 147 393 194 379 174 393 b -19 251 71 393 26 331 b -29 223 -26 238 -29 230 b -13 207 -29 213 -22 207 b 9 226 -3 207 1 215 b 107 338 52 300 81 338 b 122 321 118 338 122 331 b 114 285 122 310 118 295 l 9 24 b 4 9 6 17 4 13 b 20 0 4 3 9 0 l 91 0 b 114 17 104 0 108 3 l 207 251 b 287 323 225 292 255 323 b 308 302 304 323 308 314 b 294 249 308 285 302 269 b 203 24 294 248 292 248 b 199 9 200 17 199 13 b 215 0 199 3 203 0 l 285 0 b 308 17 298 0 302 3 l 402 251 b 481 323 419 292 449 323 b 503 302 498 323 503 314 b 413 43 503 252 413 104 b 478 -14 413 6 436 -14 b 629 102 533 -14 583 26 b 642 132 638 117 642 125 b 629 145 642 141 636 145 b 608 127 619 145 615 138 b 534 49 580 84 553 49 b 523 62 526 49 523 53 b 606 317 523 112 606 238 b 528 395 606 353 588 395 z',\n },\n dynamicForte: {\n x_min: -141,\n x_max: 364,\n y_min: -152,\n y_max: 444,\n ha: 596,\n o: 'm 23 380 b 0 357 7 380 0 373 b 22 336 0 343 7 336 l 105 336 b 117 330 114 336 117 336 b 114 315 117 327 115 323 l 23 0 b -101 -187 -17 -141 -43 -187 b -127 -174 -120 -187 -127 -181 b -92 -156 -127 -163 -114 -170 b -63 -102 -75 -144 -63 -125 b -128 -43 -63 -65 -89 -43 b -203 -122 -171 -43 -203 -78 b -95 -219 -203 -186 -156 -219 b 161 17 14 -219 82 -145 b 269 317 203 105 235 194 l 271 318 b 289 336 271 323 282 336 l 383 336 b 406 359 399 336 406 343 b 384 380 406 373 399 380 l 298 380 b 284 387 288 380 284 380 b 287 405 284 392 285 396 b 419 606 315 530 347 606 b 442 595 431 606 442 603 b 419 580 442 586 435 588 b 389 526 400 572 389 552 b 454 465 389 485 418 465 b 524 543 491 465 524 490 b 400 639 524 596 491 639 b 135 402 261 639 183 540 b 107 380 128 380 127 380 z',\n },\n dynamicRinforzando: {\n x_min: -20,\n x_max: 277,\n y_min: 0,\n y_max: 274,\n ha: 274,\n o: 'm 324 395 b 235 350 287 395 256 374 b 215 330 222 336 220 330 b 203 360 207 330 213 337 b 145 393 194 379 174 393 b -19 251 75 393 27 337 b -29 223 -26 238 -29 230 b -13 207 -29 213 -22 207 b 9 226 -3 207 3 215 b 107 338 52 301 81 338 b 122 321 118 338 122 331 b 114 285 122 310 118 295 l 9 24 b 4 9 6 17 4 13 b 20 0 4 3 9 0 l 91 0 b 114 17 104 0 108 3 l 207 251 b 304 351 226 298 272 351 b 318 343 312 351 318 348 b 287 285 318 330 287 325 b 338 239 287 256 308 239 b 399 318 373 239 399 268 b 324 395 399 360 377 395 z',\n },\n dynamicSforzando: {\n x_min: 0,\n x_max: 229,\n y_min: -10,\n y_max: 273,\n ha: 283,\n o: 'm 212 393 b 68 274 127 393 68 350 b 145 161 68 223 95 196 b 200 85 187 132 200 114 b 127 20 200 53 173 20 b 66 42 91 20 66 32 b 91 56 66 49 75 46 b 111 98 104 65 111 79 b 59 145 111 127 86 145 b 0 78 24 145 0 117 b 125 -14 0 30 49 -14 b 291 120 219 -14 291 36 b 220 232 291 160 276 190 b 151 314 168 271 151 287 b 213 361 151 337 168 361 b 258 346 238 361 258 356 b 240 333 258 340 251 340 b 226 298 232 325 226 314 b 276 252 226 269 248 252 b 330 307 311 252 330 279 b 212 393 330 360 285 393 z',\n },\n dynamicZ: {\n x_min: -30,\n x_max: 244,\n y_min: -10,\n y_max: 268,\n ha: 278,\n o: 'm 333 386 b 298 377 321 386 314 382 b 239 370 282 373 259 370 b 94 383 153 370 111 383 b 68 364 79 383 72 377 l 33 264 b 29 242 30 255 29 248 b 45 228 29 232 36 228 b 66 249 55 228 60 236 l 81 279 b 96 297 85 288 88 297 b 168 292 102 297 127 292 b 223 302 194 292 215 302 b 196 269 229 302 197 271 l -26 45 b -43 16 -37 33 -43 27 b -24 -1 -43 6 -36 -1 b 4 16 -12 -1 -3 10 b 39 30 16 24 27 30 b 179 -14 79 30 108 -14 b 297 102 259 -14 297 43 b 245 166 297 147 271 166 b 197 115 219 166 197 145 b 236 72 197 88 216 72 b 259 79 251 72 255 79 b 264 75 262 79 264 78 b 258 60 264 72 261 66 b 229 45 252 50 242 45 b 117 95 186 45 173 95 b 85 86 98 95 89 86 b 102 111 85 86 95 104 l 333 338 b 351 370 344 350 351 359 b 333 386 351 380 343 386 z',\n },\n ornamentTrill: {\n x_min: 0,\n x_max: 521,\n y_min: -10,\n y_max: 390,\n ha: 400,\n o: 'm 383 562 b 364 557 377 562 369 559 l 294 534 b 269 511 281 530 275 526 l 217 384 b 206 367 212 370 210 367 b 179 380 200 367 192 374 b 118 393 158 389 140 393 b 0 292 50 393 0 353 b 95 210 0 248 30 210 b 140 213 112 210 131 213 b 144 209 143 213 144 212 b 140 194 144 206 143 202 l 124 156 b 96 58 108 117 96 88 b 179 -14 96 17 124 -14 b 325 153 253 -14 325 46 b 307 251 325 187 320 219 b 302 265 304 258 302 261 b 334 294 302 274 311 281 l 343 298 b 455 348 393 328 428 348 b 474 327 468 348 474 344 b 465 285 474 312 469 295 l 360 24 b 356 9 357 17 356 13 b 372 0 356 3 360 0 l 442 0 b 465 17 455 0 459 3 l 559 251 b 655 351 577 298 624 351 b 670 343 664 351 670 348 b 638 285 670 330 638 325 b 690 239 638 256 660 239 b 750 318 724 239 750 268 b 675 395 750 360 729 395 b 586 350 638 395 608 374 b 566 330 573 336 572 330 b 553 361 559 330 564 340 b 490 393 543 380 521 393 b 347 348 432 393 377 364 b 312 333 328 338 320 333 b 308 337 310 333 308 334 b 315 359 308 343 312 351 l 387 537 b 392 553 390 544 392 549 b 383 562 392 559 389 562 z m 118 360 b 192 325 134 360 192 347 b 186 307 192 321 189 314 l 180 292 b 148 265 173 274 167 269 b 98 258 130 261 112 258 b 39 301 50 258 39 281 b 118 360 39 327 60 360 z m 272 240 b 292 151 285 240 292 164 b 212 30 292 88 253 30 b 196 48 200 30 196 37 b 207 92 196 59 202 78 b 264 230 207 94 209 94 b 272 240 266 238 268 240 z',\n },\n ornamentTurn: {\n x_min: 0,\n x_max: 460,\n y_min: 0,\n y_max: 218,\n ha: 218,\n o: 'm 534 314 b 454 251 490 314 454 294 b 505 199 454 219 475 199 b 579 232 547 199 549 232 b 626 164 603 232 626 202 b 533 72 626 102 583 72 b 377 180 487 72 439 111 b 150 312 307 258 243 312 b 0 148 55 312 0 240 b 128 0 0 45 66 0 b 209 63 173 0 209 20 b 157 115 209 95 187 115 b 84 82 115 115 114 82 b 36 150 59 82 36 112 b 130 242 36 212 79 242 b 285 134 176 242 223 203 b 513 1 356 56 419 1 b 662 166 608 1 662 73 b 534 314 662 269 596 314 z',\n },\n ornamentTurnSlash: {\n x_min: 0,\n x_max: 460,\n y_min: -90,\n y_max: 306,\n ha: 396,\n o: 'm 333 441 b 310 418 315 441 310 433 l 310 274 b 302 252 310 258 308 252 b 261 278 294 252 287 262 b 150 311 228 298 192 311 b 0 147 55 311 0 239 b 128 -1 0 43 66 -1 b 209 62 173 -1 209 19 b 157 114 209 94 187 114 b 84 81 115 114 114 81 b 36 148 59 81 36 111 b 130 240 36 210 79 240 b 285 128 176 240 222 197 b 307 79 304 108 307 105 l 307 -107 b 330 -130 307 -122 312 -130 b 353 -107 347 -130 353 -122 l 353 37 b 360 59 353 53 353 59 b 402 33 369 59 376 49 b 513 0 435 13 471 0 b 662 164 608 0 662 72 b 534 312 662 268 596 312 b 454 249 490 312 454 292 b 505 197 454 217 475 197 b 579 230 547 197 549 230 b 626 163 603 230 626 200 b 533 71 626 101 583 71 b 377 183 487 71 441 114 b 356 232 359 203 356 206 l 356 418 b 333 441 356 433 350 441 z',\n },\n ornamentMordent: {\n x_min: 1,\n x_max: 729,\n y_min: -73,\n y_max: 319,\n ha: 392,\n o: 'm 546 265 l 546 459 l 501 459 l 501 216 l 459 167 b 439 167 454 160 445 160 b 302 327 387 228 310 317 b 258 353 291 338 282 351 b 226 340 245 353 238 348 l 20 107 b 1 73 12 98 1 84 b 30 59 1 65 9 59 b 88 94 53 59 73 79 b 144 143 107 109 124 127 b 176 161 158 154 168 161 b 197 144 183 161 189 156 l 323 10 b 351 0 328 3 340 0 b 377 9 361 0 372 3 b 498 114 392 17 475 94 l 498 -105 l 544 -105 l 544 153 b 562 160 550 157 556 160 b 585 144 569 160 576 156 b 710 10 590 135 697 24 b 737 0 716 3 727 0 b 765 9 749 0 759 3 b 1030 295 776 17 1011 274 l 1032 300 b 1050 328 1041 308 1050 318 b 1012 353 1050 343 1024 353 b 986 343 1002 353 994 348 b 854 190 971 330 871 206 b 828 176 842 180 835 176 b 802 190 818 176 809 183 b 681 333 791 202 696 320 b 645 353 668 344 657 353 b 613 340 634 353 626 350 b 580 304 600 330 590 315 z',\n },\n ornamentShortTrill: {\n x_min: 0,\n x_max: 725,\n y_min: 0,\n y_max: 245,\n ha: 245,\n o: 'm 429 167 l 301 325 b 256 353 291 338 282 350 b 225 340 246 353 238 350 b 16 105 158 268 88 186 b 0 72 9 96 0 86 b 29 58 0 63 7 58 b 71 76 42 58 55 62 l 158 154 b 174 160 163 158 168 160 b 197 143 181 160 187 154 b 321 10 203 135 310 24 b 350 0 327 3 338 0 b 377 7 361 0 372 3 l 533 148 b 554 160 543 158 550 160 b 577 143 562 160 566 156 b 703 10 585 135 690 24 b 732 0 708 3 720 0 b 759 7 743 0 753 3 b 1024 294 769 16 1005 272 b 1044 327 1032 305 1044 321 b 1005 353 1044 341 1018 353 b 979 343 996 353 988 348 b 848 189 963 330 864 204 b 821 174 837 179 828 174 b 796 189 811 174 804 181 b 674 331 783 202 688 318 b 641 351 662 343 651 351 b 606 340 628 351 619 350 b 573 304 593 328 583 315 b 444 167 533 259 491 213 b 429 167 439 161 433 161 z',\n },\n ornamentTremblement: {\n x_min: 1,\n x_max: 985,\n y_min: 0,\n y_max: 244,\n ha: 244,\n o: 'm 678 325 b 634 351 667 338 657 350 b 602 338 621 351 613 348 l 448 167 b 439 167 446 164 441 164 l 302 325 b 258 351 291 338 281 350 b 228 338 245 351 238 348 b 193 304 215 328 204 315 l 19 107 b 1 72 13 96 1 76 b 30 58 1 63 9 58 b 89 92 52 58 73 78 l 144 141 b 148 144 145 143 147 143 b 176 160 160 153 170 160 b 199 143 183 160 189 154 b 324 10 204 134 311 23 b 351 0 330 3 340 0 b 379 7 363 0 373 3 l 530 148 b 552 160 536 154 546 160 b 575 143 559 160 564 154 b 698 10 580 134 687 23 b 727 0 704 3 716 0 b 755 7 739 0 749 3 l 907 147 b 930 160 922 158 923 160 b 952 143 937 160 943 154 l 1077 10 b 1107 0 1084 3 1096 0 b 1133 7 1117 0 1128 3 b 1398 294 1143 16 1380 272 b 1418 327 1407 305 1418 321 b 1381 351 1418 343 1394 351 b 1354 341 1371 351 1362 348 b 1223 189 1338 328 1238 204 b 1195 174 1211 179 1202 174 b 1171 189 1185 174 1178 181 b 1048 331 1158 200 1063 318 b 1012 351 1035 343 1024 351 b 981 338 1002 351 994 350 b 948 304 968 328 958 315 b 827 166 907 258 865 212 b 815 166 824 163 818 163 b 678 325 760 226 732 264 z',\n },\n ornamentPrecompAppoggTrill: {\n x_min: 0,\n x_max: 1119,\n y_min: 0,\n y_max: 481,\n ha: 481,\n o: 'm 1015 163 b 873 328 963 223 880 318 b 828 354 860 344 847 353 b 796 341 816 354 809 351 b 763 305 783 331 773 317 b 642 168 721 261 681 215 b 636 163 641 167 639 164 b 494 328 585 223 501 318 b 449 354 481 344 468 353 b 418 341 438 354 431 351 b 384 305 405 331 395 317 b 264 168 343 261 302 215 l 242 144 b 144 88 232 124 171 88 b 79 197 81 88 79 189 l 79 648 b 60 693 79 683 71 693 b 52 691 58 693 55 693 b 0 616 3 672 0 625 l 0 207 b 121 0 0 40 68 0 b 249 68 168 0 232 53 b 279 94 262 75 271 86 b 336 144 298 111 315 128 b 367 163 350 156 360 163 b 389 145 374 163 380 157 b 514 12 395 137 501 26 b 543 1 520 4 531 1 b 569 9 553 1 563 4 b 636 73 576 14 605 43 l 658 94 b 714 144 677 111 694 128 b 746 163 729 156 739 163 b 768 145 753 163 759 157 b 893 12 773 137 880 26 b 922 1 899 4 910 1 b 948 9 932 1 942 4 l 1012 71 b 1037 94 1022 78 1030 86 b 1092 144 1054 111 1073 128 b 1123 161 1106 156 1115 161 b 1146 145 1130 161 1136 157 b 1270 12 1152 137 1259 26 b 1299 1 1276 4 1287 1 b 1326 9 1310 1 1320 4 b 1591 297 1336 19 1572 275 b 1611 328 1600 307 1611 320 b 1574 354 1611 343 1585 354 b 1548 344 1565 354 1555 350 b 1416 192 1532 331 1431 206 b 1388 177 1404 181 1395 177 b 1365 190 1380 177 1371 184 b 1243 333 1352 203 1256 321 b 1205 354 1228 346 1217 354 b 1174 341 1195 354 1187 351 b 1140 305 1161 330 1152 317 z',\n },\n ornamentPrecompSlideTrillDAnglebert: {\n x_min: 2,\n x_max: 1150,\n y_min: -367,\n y_max: 245,\n ha: 612,\n o: 'm 1058 160 b 916 327 1007 220 923 317 b 871 353 903 343 890 351 b 840 340 860 353 852 350 b 806 304 827 330 816 315 b 685 167 765 259 724 213 l 680 160 l 615 235 b 419 344 582 275 523 344 b 3 -144 258 344 3 26 b 4 -168 3 -153 3 -160 b 246 -482 24 -315 99 -422 b 458 -528 340 -521 410 -528 b 514 -526 485 -528 504 -526 b 552 -508 531 -526 552 -517 b 514 -497 552 -503 541 -498 l 503 -497 b 194 -390 432 -494 298 -488 b 69 -151 194 -390 69 -279 b 184 96 69 -60 128 27 b 328 183 202 118 258 183 b 477 96 413 183 454 118 b 559 10 510 62 552 19 b 588 0 566 3 576 0 b 613 7 598 0 609 3 b 723 112 622 14 681 73 b 789 161 733 122 776 161 b 811 144 796 161 802 156 b 936 10 816 135 923 24 b 965 0 942 3 953 0 b 991 7 975 0 985 3 b 1051 66 996 12 1022 37 b 1081 92 1063 73 1073 84 b 1136 143 1099 109 1117 127 b 1168 160 1151 154 1159 160 b 1191 144 1175 160 1181 156 b 1315 10 1197 135 1303 24 b 1344 0 1320 3 1332 0 b 1371 7 1355 0 1365 3 b 1636 295 1381 17 1617 274 b 1656 327 1644 305 1656 318 b 1619 353 1656 341 1630 353 b 1593 343 1610 353 1600 348 b 1460 190 1577 330 1476 204 b 1433 176 1449 180 1440 176 b 1410 189 1424 176 1416 183 b 1287 331 1397 202 1300 320 b 1250 353 1273 344 1261 353 b 1218 340 1240 353 1231 350 b 1185 304 1205 328 1197 315 z',\n },\n ornamentPrecompSlideTrillBach: {\n x_min: 0,\n x_max: 1048,\n y_min: -367,\n y_max: 331,\n ha: 698,\n o: 'm 1038 477 l 979 477 l 979 238 l 912 160 b 769 327 858 220 775 317 b 724 353 756 343 743 351 b 693 340 713 353 706 350 b 660 304 680 330 670 315 b 539 167 618 259 577 213 b 533 161 536 166 534 163 b 390 327 480 220 396 317 b 346 353 377 343 364 351 l 340 353 b 308 340 330 353 321 350 b 275 304 295 330 285 315 b 117 122 220 243 168 186 b 0 -144 68 62 0 -48 b 1 -168 0 -153 0 -160 b 243 -482 22 -315 96 -422 b 455 -528 337 -521 408 -528 b 511 -526 482 -528 501 -526 b 549 -508 528 -526 549 -517 b 511 -497 549 -503 539 -498 l 500 -497 b 192 -390 429 -494 295 -488 b 68 -177 192 -390 84 -298 b 66 -151 66 -168 66 -160 b 189 105 66 -58 127 35 b 232 143 203 118 216 131 b 264 161 246 154 256 161 b 285 144 271 161 276 156 b 410 10 291 135 397 24 b 439 0 416 3 428 0 b 465 7 449 0 459 3 l 531 72 b 554 92 540 78 547 86 b 611 143 573 109 590 127 b 642 161 625 154 635 161 b 664 144 649 161 655 156 b 789 10 670 135 776 24 b 818 0 795 3 806 0 b 844 7 828 0 838 3 b 904 66 850 12 876 37 b 935 92 916 73 924 84 b 979 134 949 107 963 121 l 979 -88 l 1037 -88 l 1037 151 l 1044 144 b 1168 10 1050 135 1156 24 b 1197 0 1174 3 1185 0 b 1224 7 1208 0 1218 3 b 1489 295 1234 17 1470 274 b 1509 327 1498 305 1509 318 b 1472 353 1509 341 1483 353 b 1446 343 1463 353 1453 348 b 1313 190 1430 330 1329 204 b 1286 176 1302 180 1293 176 b 1263 189 1277 176 1269 183 b 1140 331 1250 202 1153 320 b 1103 353 1126 344 1115 353 b 1071 340 1093 353 1084 350 b 1038 304 1058 328 1050 315 z',\n },\n ornamentPrecompTrillSuffixDandrieu: {\n x_min: 0,\n x_max: 949,\n y_min: 0,\n y_max: 381,\n ha: 381,\n o: 'm 1367 314 b 1250 521 1367 419 1318 482 b 1107 549 1211 537 1145 549 b 1083 546 1096 549 1087 549 b 1066 528 1071 540 1066 534 b 1079 520 1066 524 1070 520 b 1323 351 1187 517 1323 487 b 1201 171 1323 269 1260 219 b 1194 166 1201 171 1198 168 b 1056 327 1142 226 1063 317 b 1011 353 1043 343 1030 351 b 979 340 999 353 992 350 b 946 304 966 330 956 315 b 825 167 904 259 864 213 l 821 161 b 678 327 768 222 685 317 b 634 353 665 343 652 351 b 602 340 622 353 615 350 b 569 304 589 330 579 315 b 448 167 527 259 487 213 l 444 161 b 301 327 390 222 308 317 b 256 353 288 343 275 351 b 225 340 245 353 238 350 b 192 304 212 330 202 315 b 71 167 150 259 109 213 b 17 105 52 147 36 127 b 0 73 10 98 0 84 b 29 58 0 65 7 58 b 86 92 56 59 72 79 b 143 143 105 109 122 127 b 174 161 157 154 167 161 b 196 144 181 161 187 156 b 321 10 202 135 308 24 b 350 0 327 3 338 0 b 376 7 360 0 370 3 b 485 112 384 14 444 73 b 552 161 495 122 539 161 b 573 144 559 161 564 156 b 698 10 579 135 685 24 b 727 0 704 3 716 0 b 753 7 737 0 747 3 b 863 112 762 14 821 73 b 929 161 873 122 916 161 b 950 144 936 161 942 156 b 1076 10 956 135 1063 24 b 1104 0 1081 3 1093 0 b 1130 7 1115 0 1125 3 b 1236 108 1139 14 1195 69 b 1367 314 1297 160 1367 233 z',\n },\n ornamentPrecompDoubleCadenceUpperPrefix: {\n x_min: 0,\n x_max: 1278,\n y_min: 0,\n y_max: 247,\n ha: 247,\n o: 'm 1801 356 b 1776 346 1793 356 1783 351 b 1642 192 1760 333 1659 206 b 1614 177 1630 181 1621 177 b 1591 190 1606 177 1597 184 b 1469 334 1578 203 1482 323 b 1430 356 1453 347 1441 356 b 1398 343 1420 356 1411 353 b 1365 307 1385 331 1377 318 l 1240 164 b 1097 330 1187 226 1104 320 b 1053 356 1084 346 1071 354 b 1021 343 1041 356 1034 353 b 988 307 1008 333 998 318 b 865 168 946 262 904 216 l 861 163 b 717 330 808 223 724 320 b 672 356 704 346 691 354 b 641 343 661 356 654 353 b 608 307 628 333 618 318 b 485 168 566 262 524 216 l 455 134 b 284 46 409 88 351 46 b 16 285 148 46 32 265 b 3 295 9 292 4 295 b 0 291 1 295 0 292 b 1 285 0 288 1 285 b 308 0 42 190 157 0 b 530 120 415 1 482 63 b 559 144 539 128 549 137 b 590 163 573 156 583 163 b 612 145 598 163 603 157 b 739 10 618 137 724 24 b 768 0 744 3 756 0 b 793 7 778 0 788 3 b 903 114 802 14 861 75 l 939 144 b 971 163 953 156 963 163 b 992 145 978 163 984 157 b 1119 10 998 137 1106 24 b 1148 0 1125 3 1136 0 b 1174 7 1158 0 1168 3 b 1284 114 1182 14 1241 75 b 1316 144 1282 115 1312 141 b 1348 161 1331 156 1339 161 b 1371 145 1355 161 1361 157 b 1496 10 1377 137 1485 24 b 1525 0 1502 3 1513 0 b 1552 7 1536 0 1547 3 b 1819 298 1562 17 1800 276 b 1840 330 1829 308 1840 320 b 1832 344 1840 334 1837 340 b 1801 356 1820 351 1810 356 z',\n },\n ornamentPrecompDoubleCadenceUpperPrefixTurn: {\n x_min: 0,\n x_max: 1277,\n y_min: -62,\n y_max: 333,\n ha: 395,\n o: 'm 1273 202 l 1273 480 l 1230 480 l 1230 174 l 1097 328 b 1053 354 1084 344 1071 353 b 1021 341 1041 354 1034 351 b 988 305 1008 331 998 317 b 865 167 945 261 904 215 l 861 161 b 717 328 808 222 724 318 b 672 354 704 344 691 353 b 641 341 661 354 654 351 b 608 305 628 331 618 317 b 485 167 564 261 524 215 b 455 132 474 156 465 144 b 284 45 410 88 350 45 b 14 284 148 45 30 264 b 3 294 9 291 4 294 b 0 289 1 294 0 291 b 1 284 0 287 1 284 b 308 -1 42 189 157 -1 b 530 118 415 0 481 62 b 557 143 539 127 547 135 b 590 161 572 154 582 161 b 612 144 598 161 603 156 b 737 9 618 135 724 24 b 768 -1 743 1 755 -1 b 793 6 778 -1 788 1 b 903 112 802 13 861 73 l 937 143 b 971 161 953 154 963 161 b 992 144 978 161 984 156 b 1117 9 998 135 1104 24 b 1148 -1 1123 1 1136 -1 b 1174 6 1158 -1 1168 1 l 1230 60 l 1230 -89 l 1273 -89 l 1273 102 l 1283 112 b 1348 160 1295 125 1332 160 b 1371 144 1355 160 1361 156 b 1496 9 1377 135 1483 24 b 1525 -1 1502 1 1513 -1 b 1552 6 1536 -1 1547 1 b 1819 297 1562 16 1800 275 b 1839 328 1827 307 1839 320 b 1801 354 1839 343 1813 354 b 1776 344 1793 354 1783 350 b 1642 190 1760 331 1657 206 b 1614 176 1630 180 1621 176 b 1591 189 1606 176 1597 183 b 1467 333 1578 203 1480 321 b 1430 354 1453 346 1441 354 b 1398 341 1420 354 1411 351 b 1365 305 1385 330 1377 317 z',\n },\n ornamentPrecompTrillLowerSuffix: {\n x_min: 0,\n x_max: 859,\n y_min: -222,\n y_max: 246,\n ha: 468,\n o: 'm 1164 217 b 1031 351 1138 259 1063 351 b 1011 337 1020 351 1024 347 b 828 167 952 291 886 217 l 824 164 b 683 328 772 225 690 318 b 638 354 670 344 657 353 b 606 341 626 354 619 351 b 573 305 593 331 583 317 b 451 167 530 261 490 215 l 446 161 b 302 328 393 222 310 318 b 258 354 289 344 276 353 b 226 341 246 354 239 351 b 193 305 213 331 203 317 b 71 167 150 261 109 215 b 17 105 52 147 36 127 b 0 73 10 98 0 84 b 29 58 0 65 7 58 b 86 92 56 59 72 79 b 143 143 105 109 122 127 b 176 161 157 154 168 161 b 197 144 183 161 189 156 b 323 9 203 135 310 23 b 353 -1 328 1 340 -1 b 379 6 363 -1 373 1 b 488 112 387 13 446 73 l 523 143 b 556 161 539 154 549 161 b 577 144 563 161 569 156 b 703 9 583 135 690 23 b 733 -1 708 1 721 -1 b 759 6 743 -1 753 1 b 868 112 768 13 827 73 b 955 183 878 122 943 183 b 1081 107 965 183 1031 153 b 1156 -89 1128 63 1156 6 l 1156 -102 b 948 -297 1156 -204 1048 -297 b 806 -271 904 -297 850 -282 l 792 -266 b 801 -288 792 -268 795 -282 b 948 -320 809 -297 880 -320 b 1237 -50 1092 -320 1237 -199 b 1164 217 1237 75 1218 122 z',\n },\n brassScoop: {\n x_min: 1,\n x_max: 320,\n y_min: -373,\n y_max: 13,\n ha: 386,\n o: 'm 35 -537 b 461 -12 194 -518 461 -289 b 438 19 461 13 451 19 b 410 -9 425 19 413 9 b 35 -425 357 -366 92 -403 b 1 -482 13 -433 1 -438 l 1 -505 b 26 -537 1 -526 3 -537 z',\n },\n brassDoitMedium: {\n x_min: 0,\n x_max: 489,\n y_min: -40,\n y_max: 346,\n ha: 386,\n o: 'm 33 -58 b 704 468 255 -58 683 186 b 681 498 704 494 693 498 b 654 471 668 498 658 488 b 33 55 550 118 91 76 b 0 -3 12 46 0 42 l 0 -26 b 24 -58 0 -46 1 -58 z',\n },\n brassFallLipShort: {\n x_min: 1,\n x_max: 293,\n y_min: -345,\n y_max: 42,\n ha: 387,\n o: 'm 22 60 b 1 35 4 60 1 52 l 1 6 b 26 -50 3 -40 10 -43 b 32 -52 27 -50 30 -50 b 376 -469 85 -73 327 -111 b 400 -497 379 -487 387 -497 b 422 -467 412 -497 422 -491 b 32 60 422 -187 177 40 z',\n },\n brassLiftMedium: {\n x_min: 0,\n x_max: 811,\n y_min: 0,\n y_max: 852,\n ha: 852,\n o: 'm 1138 1220 b 1135 1225 1135 1223 1135 1224 b 1129 1227 1133 1227 1130 1227 b 1117 1207 1122 1227 1117 1212 l 1117 1201 b 1109 1164 1117 1187 1117 1172 b 1100 1156 1107 1161 1104 1158 b 959 1104 1058 1128 995 1140 b 929 1032 936 1081 929 1056 b 932 1007 929 1024 930 1015 b 923 976 932 995 930 985 l 914 971 b 773 919 873 942 809 955 b 743 847 750 896 743 870 b 746 821 743 838 744 829 b 737 791 746 809 744 799 l 729 783 b 588 733 687 756 624 769 b 557 661 564 710 557 684 b 560 635 557 652 559 644 b 552 605 560 624 559 612 l 543 598 b 402 547 501 570 438 583 b 372 475 379 524 372 498 b 374 449 372 467 373 458 b 366 419 374 438 373 426 l 357 412 b 216 361 315 384 252 397 b 186 289 193 338 186 312 b 189 264 186 281 187 272 b 180 233 189 252 187 240 b 171 226 177 232 174 229 b 30 176 130 199 66 212 b 0 104 7 153 0 128 b 33 0 0 88 14 0 b 49 17 40 0 49 10 b 71 63 52 35 56 49 b 212 115 102 95 154 59 b 239 186 230 134 239 160 b 236 210 239 194 238 202 b 256 249 239 225 243 236 b 397 301 288 281 340 245 b 425 372 416 320 425 346 b 422 396 425 380 423 387 b 442 435 425 410 429 422 b 583 487 474 467 526 431 b 611 557 602 505 611 531 b 608 582 611 566 609 573 b 628 621 611 596 615 608 b 769 672 660 652 711 618 b 796 743 788 691 796 717 b 793 768 796 752 795 759 b 814 806 796 782 801 793 b 955 858 845 838 897 804 b 982 929 973 877 982 903 b 979 953 982 937 981 945 b 999 992 982 968 986 979 b 1140 1045 1031 1024 1083 989 b 1168 1116 1161 1066 1168 1090 b 1138 1220 1168 1162 1145 1207 z',\n },\n brassFallRoughMedium: {\n x_min: 0,\n x_max: 811,\n y_min: 0,\n y_max: 852,\n ha: 852,\n o: 'm 30 1220 b 0 1116 23 1207 0 1162 b 27 1045 0 1090 7 1066 b 168 992 85 989 137 1024 b 189 953 181 979 186 968 b 186 929 187 945 186 937 b 213 858 186 903 194 877 b 354 806 271 804 323 838 b 374 768 367 793 372 782 b 372 743 373 759 372 752 b 399 672 372 717 380 691 b 540 621 456 618 508 652 b 560 582 553 608 557 596 b 557 557 559 573 557 566 b 585 487 557 531 566 505 b 726 435 642 431 694 467 b 746 396 739 422 743 410 b 743 372 744 387 743 380 b 770 301 743 346 752 320 b 912 249 828 245 880 281 b 932 210 924 236 929 225 b 929 186 930 202 929 194 b 956 115 929 160 937 134 b 1097 63 1014 59 1066 95 b 1119 17 1112 49 1116 35 b 1135 0 1119 10 1128 0 b 1168 104 1153 0 1168 91 b 1138 176 1168 128 1161 153 b 996 226 1102 212 1038 199 b 988 233 994 229 991 232 b 979 264 981 240 979 252 b 982 289 981 272 982 281 b 952 361 982 312 975 338 b 811 412 916 397 852 384 l 802 419 b 793 449 795 426 793 438 b 796 475 795 458 796 467 b 766 547 796 498 789 524 b 625 598 730 583 667 570 l 616 605 b 608 635 609 612 608 624 b 611 661 609 644 611 652 b 580 733 611 684 603 710 b 439 783 544 769 481 756 l 431 791 b 422 821 423 799 422 809 b 425 847 423 829 425 838 b 395 919 425 870 418 896 b 253 971 359 955 295 942 l 245 976 b 236 1007 238 985 236 995 b 239 1032 238 1015 239 1024 b 209 1104 239 1056 232 1081 b 68 1156 173 1140 109 1128 b 59 1164 63 1158 60 1161 b 50 1201 50 1172 50 1187 l 50 1207 b 39 1227 50 1212 46 1227 b 33 1225 37 1227 35 1227 b 30 1220 33 1224 33 1223 z',\n },\n brassBend: {\n x_min: 0,\n x_max: 392,\n y_min: 0,\n y_max: 282,\n ha: 282,\n o: 'm 282 0 b 552 72 369 0 456 23 b 564 92 560 75 564 84 l 564 383 b 541 406 564 395 554 406 b 518 383 528 406 518 395 l 518 107 b 282 46 435 65 357 46 b 46 107 207 46 130 65 l 46 383 b 23 406 46 395 36 406 b 0 383 10 406 0 395 l 0 92 b 13 72 0 84 4 75 b 282 0 108 23 196 0 z',\n },\n brassMuteClosed: {\n x_min: 0,\n x_max: 272,\n y_min: 0,\n y_max: 272,\n ha: 272,\n o: 'm 392 219 l 219 219 l 219 392 l 173 392 l 173 219 l 0 219 l 0 173 l 173 173 l 173 0 l 219 0 l 219 173 l 392 173 z',\n },\n brassMuteOpen: {\n x_min: 0,\n x_max: 304,\n y_min: 0,\n y_max: 304,\n ha: 304,\n o: 'm 219 0 b 438 219 340 0 438 98 b 219 438 438 340 340 438 b 0 219 98 438 0 340 b 219 0 0 98 98 0 z m 219 392 b 392 219 314 392 392 314 b 219 46 392 124 314 46 b 46 219 124 46 46 124 b 219 392 46 314 124 392 z',\n },\n brassFlip: {\n x_min: 0,\n x_max: 379,\n y_min: 0,\n y_max: 282,\n ha: 282,\n o: 'm 523 0 b 541 9 530 0 536 3 b 546 22 544 13 546 17 b 536 42 546 29 541 36 l 36 402 b 23 406 33 405 27 406 b 0 383 12 406 0 395 l 0 23 b 23 0 0 10 10 0 b 46 23 36 0 46 10 l 46 337 l 508 4 b 523 0 513 1 517 0 z',\n },\n brassJazzTurn: {\n x_min: 0,\n x_max: 620,\n y_min: 0,\n y_max: 245,\n ha: 245,\n o: 'm 792 190 b 765 176 780 179 772 176 b 740 190 755 176 747 183 b 629 325 727 202 644 312 b 593 347 616 338 605 347 b 562 334 583 346 575 344 b 528 298 549 323 539 310 l 406 176 b 389 168 406 176 399 168 b 374 176 384 168 379 170 b 245 325 360 192 245 325 b 200 353 232 343 219 351 b 168 340 190 353 181 350 l 17 156 b 0 121 10 147 0 132 b 16 107 0 114 4 108 b 84 143 26 107 76 137 b 118 160 92 150 108 160 b 141 143 125 160 131 154 b 265 10 147 135 253 24 b 294 0 271 3 282 0 b 321 7 305 0 315 3 b 498 160 321 7 478 158 b 521 143 505 160 513 154 b 647 10 528 135 635 24 b 675 0 652 3 664 0 b 703 7 687 0 697 3 b 874 186 713 16 855 164 b 893 220 881 196 893 212 b 873 245 890 235 883 243 b 796 194 847 245 815 213 z',\n },\n brassSmear: {\n x_min: 1,\n x_max: 306,\n y_min: 0,\n y_max: 170,\n ha: 170,\n o: 'm 193 79 b 308 0 219 50 264 0 b 439 117 396 0 438 102 b 439 120 439 118 439 118 l 441 125 b 441 128 441 127 441 127 b 433 141 441 135 439 141 b 416 130 429 141 423 137 b 343 94 390 107 370 94 b 269 153 315 94 294 121 l 265 158 b 144 245 239 190 180 245 b 6 134 62 245 10 143 b 1 114 3 125 1 118 b 7 107 1 108 4 107 b 36 122 13 107 22 112 b 92 151 55 137 65 151 b 183 89 125 151 161 112 b 189 84 184 88 187 86 z',\n },\n stringsDownBow: {\n x_min: 0,\n x_max: 312,\n y_min: 0,\n y_max: 318,\n ha: 318,\n o: 'm 37 458 b 0 420 17 458 0 441 l 0 17 b 17 0 0 7 9 0 l 37 0 b 55 17 46 0 55 7 l 55 253 b 225 278 55 269 140 278 b 395 253 310 278 395 269 l 395 17 b 413 0 395 7 403 0 l 432 0 b 449 17 441 0 449 7 l 449 420 b 412 458 449 441 432 458 z',\n },\n stringsUpBow: {\n x_min: 1,\n x_max: 249,\n y_min: 1,\n y_max: 495,\n ha: 494,\n o: 'm 181 1 b 206 22 193 1 203 10 l 359 683 l 359 688 b 338 713 359 700 351 710 l 333 713 b 308 694 321 713 311 706 l 180 140 l 53 694 b 27 713 49 706 39 713 l 22 713 b 1 690 10 710 1 700 b 3 683 1 687 1 685 l 154 22 b 181 1 157 10 167 1 z',\n },\n stringsHarmonic: {\n x_min: 0,\n x_max: 200,\n y_min: 0,\n y_max: 200,\n ha: 200,\n o: 'm 288 144 b 144 288 288 225 223 288 b 0 144 65 288 0 225 b 144 0 0 65 65 0 b 288 144 223 0 288 65 z m 144 249 b 249 144 203 249 249 203 b 144 39 249 86 203 39 b 39 144 86 39 39 86 b 144 249 39 203 86 249 z',\n },\n pluckedSnapPizzicatoAbove: {\n x_min: 0,\n x_max: 200,\n y_min: 0,\n y_max: 300,\n ha: 300,\n o: 'm 0 144 b 144 0 0 63 65 0 b 288 144 223 0 288 63 b 167 285 288 215 235 275 l 167 432 l 121 432 l 121 285 b 0 144 52 275 0 215 z m 121 246 l 121 144 l 167 144 l 167 246 b 249 144 213 236 249 193 b 144 39 249 85 202 39 b 39 144 85 39 39 85 b 121 246 39 193 73 236 z',\n },\n pluckedSnapPizzicatoBelow: {\n x_min: 0,\n x_max: 200,\n y_min: 0,\n y_max: 300,\n ha: 300,\n o: 'm 288 288 b 144 432 288 369 223 432 b 0 288 65 432 0 369 b 121 145 0 216 52 157 l 121 0 l 167 0 l 167 145 b 288 288 235 157 288 216 z m 167 186 l 167 288 l 121 288 l 121 186 b 39 288 75 196 39 238 b 144 393 39 347 86 393 b 249 288 203 393 249 347 b 167 186 249 238 215 196 z',\n },\n pluckedLeftHandPizzicato: {\n x_min: 0,\n x_max: 272,\n y_min: 0,\n y_max: 272,\n ha: 272,\n o: 'm 392 219 l 219 219 l 219 392 l 173 392 l 173 219 l 0 219 l 0 173 l 173 173 l 173 0 l 219 0 l 219 173 l 392 173 z',\n },\n keyboardPedalPed: {\n x_min: 0,\n x_max: 1019,\n y_min: -8,\n y_max: 555,\n ha: 563,\n o: 'm 413 799 b 179 749 327 798 261 789 b 0 517 107 713 0 632 b 122 376 0 454 37 376 b 240 540 189 376 240 452 b 225 586 240 579 233 586 b 204 549 213 586 212 573 b 138 480 199 527 181 480 b 85 549 96 480 85 517 l 85 554 b 353 762 89 690 230 762 b 373 752 364 762 373 760 b 351 708 373 740 360 723 b 274 546 330 675 274 585 b 353 416 274 508 333 444 b 412 304 372 390 412 351 b 382 228 412 275 403 256 b 334 190 363 202 361 200 b 147 29 271 167 147 88 b 196 -12 147 4 171 -12 b 343 108 239 -12 279 33 l 363 132 b 387 150 370 141 376 150 b 543 -4 445 150 467 -4 b 631 42 567 -4 586 0 l 668 78 b 685 89 674 84 680 89 b 696 75 688 89 690 86 b 809 -9 717 29 753 -9 b 946 66 854 -9 894 13 b 988 107 971 92 981 107 b 1002 89 994 107 996 99 b 1152 -4 1030 36 1077 -4 b 1329 248 1238 -4 1329 82 b 792 717 1329 556 1047 665 b 766 720 785 719 775 720 b 747 703 752 720 747 711 b 780 680 747 693 756 685 b 1223 222 1028 621 1223 504 b 1152 39 1223 122 1205 39 b 1073 229 1104 39 1073 132 b 1132 423 1073 314 1086 377 b 1142 442 1140 432 1142 436 b 1126 458 1142 451 1136 458 b 1093 446 1119 458 1109 455 b 975 216 1022 408 975 337 l 975 190 b 943 121 975 160 972 150 b 852 69 899 76 877 69 b 776 148 816 69 786 117 b 773 163 775 154 773 158 b 786 177 773 167 776 170 l 801 187 b 937 366 867 235 937 284 b 844 454 937 422 900 454 b 665 217 711 454 665 331 b 671 153 665 197 667 176 l 671 147 b 662 134 671 143 670 140 b 605 111 639 118 625 111 b 521 160 572 111 546 135 b 451 203 497 184 474 197 b 426 212 435 207 426 206 b 436 230 426 216 429 220 b 510 389 464 269 510 340 b 429 521 510 435 480 462 b 369 629 387 570 369 599 b 402 720 369 648 384 691 b 462 763 425 759 446 763 b 611 624 540 763 611 704 b 564 575 611 592 590 575 b 501 602 540 575 520 582 b 474 622 492 611 487 622 b 459 603 465 622 459 615 b 603 471 459 570 510 471 b 711 588 670 471 711 524 b 422 799 711 742 554 799 z m 815 403 b 848 343 838 403 848 383 b 780 226 848 295 824 261 b 765 217 773 220 768 217 b 759 228 762 217 759 220 b 756 282 757 245 756 262 b 815 403 756 346 772 403 z m 1405 124 b 1344 62 1369 124 1344 98 b 1405 0 1344 26 1369 0 b 1467 62 1441 0 1467 26 b 1405 124 1467 98 1441 124 z',\n },\n keyboardPedalUp: {\n x_min: 0,\n x_max: 450,\n y_min: 0,\n y_max: 450,\n ha: 450,\n o: 'm 582 396 b 516 367 554 396 533 384 b 465 340 495 347 487 340 l 458 340 b 412 377 432 340 412 348 b 432 409 412 387 419 396 l 438 415 b 490 429 451 428 464 429 b 575 501 534 429 575 452 b 501 575 575 541 541 575 b 429 490 452 575 429 534 b 415 438 429 464 428 451 l 409 432 b 377 412 396 419 387 412 b 340 458 348 412 340 432 l 340 465 b 367 516 340 487 347 495 b 396 582 384 533 396 554 b 324 648 396 625 363 648 b 252 582 285 648 252 625 b 281 516 252 554 264 533 b 308 465 301 495 308 487 l 308 458 b 271 412 308 432 300 412 b 239 432 261 412 252 419 l 233 438 b 219 490 220 451 219 464 b 147 575 219 534 196 575 b 73 501 107 575 73 541 b 158 429 73 452 114 429 b 210 415 184 429 197 428 l 216 409 b 236 377 229 396 236 387 b 190 340 236 348 216 340 l 183 340 b 132 367 161 340 153 347 b 66 396 115 384 94 396 b 0 324 23 396 0 363 b 66 252 0 285 23 252 b 132 281 94 252 115 264 b 183 308 153 301 161 308 l 190 308 b 236 271 216 308 236 300 b 216 239 236 261 229 252 l 210 233 b 158 219 197 220 184 219 b 73 147 114 219 73 196 b 147 73 73 107 107 73 b 219 158 196 73 219 114 b 233 210 219 184 220 197 l 239 216 b 271 236 252 229 261 236 b 308 190 300 236 308 216 l 308 183 b 281 132 308 161 301 153 b 252 66 264 115 252 94 b 324 0 252 23 285 0 b 396 66 363 0 396 23 b 367 132 396 94 384 115 b 340 183 347 153 340 161 l 340 190 b 377 236 340 216 348 236 b 409 216 387 236 396 229 l 415 210 b 429 158 428 197 429 184 b 501 73 429 114 452 73 b 575 147 541 73 575 107 b 490 219 575 196 534 219 b 438 233 464 219 451 220 l 432 239 b 412 271 419 252 412 261 b 458 308 412 300 432 308 l 465 308 b 516 281 487 308 495 301 b 582 252 533 264 554 252 b 648 324 625 252 648 285 b 582 396 648 363 625 396 z m 324 271 b 271 324 291 271 271 291 b 324 377 271 357 291 377 b 377 324 357 377 377 357 b 324 271 377 291 357 271 z',\n },\n pictChokeCymbal: {\n x_min: 1,\n x_max: 152,\n y_min: 2,\n y_max: 251,\n ha: 249,\n o: 'm 104 361 b 1 271 42 361 1 321 b 82 190 1 222 35 190 b 122 160 118 190 122 160 b 125 144 124 154 125 150 b 102 88 125 124 115 105 b 37 32 78 56 40 35 b 26 17 32 29 26 26 l 27 16 b 37 3 29 6 33 3 b 181 102 85 3 158 66 b 219 239 210 147 219 197 l 219 249 b 104 361 219 317 170 361 z',\n },\n wiggleArpeggiatoUp: {\n x_min: -33,\n x_max: 292,\n y_min: 0,\n y_max: 119,\n ha: 119,\n o: 'm 130 171 b -39 68 16 171 -14 91 b -48 53 -45 62 -48 58 b -29 42 -48 46 -39 42 b -10 46 -23 42 -16 43 b 56 63 12 56 29 63 b 248 0 121 63 135 0 b 419 127 361 0 410 104 b 420 132 420 130 420 131 b 412 140 420 137 416 140 b 386 130 403 140 392 134 b 334 107 367 117 353 107 b 318 108 330 107 324 107 b 240 138 289 112 265 128 b 130 171 209 153 168 171 z',\n },\n arrowheadBlackUp: {\n x_min: 0,\n x_max: 228,\n y_min: 0,\n y_max: 299,\n ha: 299,\n o: 'm 166 431 b 0 20 111 274 0 30 b 16 0 0 12 6 0 l 17 1 b 166 50 43 16 160 50 b 310 1 171 50 289 13 l 311 0 b 328 20 321 0 328 12 b 166 431 328 30 220 274 z',\n },\n arrowheadBlackDown: {\n x_min: 0,\n x_max: 228,\n y_min: 0,\n y_max: 299,\n ha: 299,\n o: 'm 166 0 b 328 410 220 157 328 400 b 311 431 328 419 321 431 l 310 429 b 166 380 289 418 171 380 b 17 429 160 380 43 415 l 16 431 b 0 410 6 431 0 419 b 166 0 0 400 111 157 z',\n },\n arpeggiatoUp: {\n x_min: 1,\n x_max: 229,\n y_min: 7,\n y_max: 1511,\n ha: 1504,\n o: 'm 219 1848 l 330 1848 l 164 2176 l 1 1848 l 121 1848 b 92 1778 115 1822 101 1800 l 89 1773 b 59 1668 75 1741 59 1702 b 96 1555 59 1614 76 1580 b 99 1551 98 1554 99 1551 l 102 1547 b 124 1496 115 1531 124 1515 b 122 1482 124 1492 124 1488 b 92 1404 118 1453 102 1428 b 59 1293 78 1372 59 1332 b 105 1172 59 1234 81 1198 b 124 1120 118 1155 124 1143 l 122 1113 b 122 1110 122 1113 122 1112 b 92 1032 118 1081 102 1057 b 59 922 78 1001 59 960 b 115 792 59 855 86 816 b 124 760 121 782 124 773 b 122 744 124 756 124 750 b 92 667 118 716 102 693 b 59 556 78 635 59 595 b 108 433 59 495 82 458 b 124 389 117 420 124 408 b 122 374 124 384 124 379 b 92 298 118 346 102 323 l 89 292 b 59 186 75 261 59 222 b 163 19 59 73 140 42 b 177 10 168 13 173 10 b 189 29 184 10 189 19 b 184 48 189 35 187 42 b 167 114 174 69 167 85 b 230 305 167 179 229 193 b 181 423 230 357 209 396 b 167 484 173 442 167 458 b 230 675 167 547 229 563 b 179 796 230 729 206 769 b 167 850 171 812 167 827 b 230 1040 167 913 229 929 b 183 1158 230 1092 209 1130 b 167 1220 173 1178 167 1194 b 230 1411 167 1284 229 1300 b 186 1526 230 1462 210 1499 b 167 1594 176 1529 167 1584 b 230 1786 167 1659 229 1673 b 219 1848 230 1809 226 1829 z',\n },\n arpeggiatoDown: {\n x_min: 1,\n x_max: 229,\n y_min: -4,\n y_max: 1500,\n ha: 1504,\n o: 'm 219 323 b 230 384 226 341 230 361 b 167 576 229 497 167 511 b 186 644 167 586 176 641 b 230 759 210 671 230 708 b 167 950 229 870 167 886 b 183 1012 167 976 173 992 b 230 1130 209 1040 230 1079 b 167 1320 229 1241 167 1257 b 179 1374 167 1344 171 1358 b 230 1495 206 1401 230 1441 b 167 1686 229 1607 167 1623 b 181 1747 167 1712 173 1728 b 230 1865 209 1774 230 1813 b 167 2056 229 1977 167 1992 b 184 2123 167 2085 174 2101 b 189 2141 187 2128 189 2136 b 177 2160 189 2151 184 2160 b 163 2151 173 2160 168 2157 b 59 1984 140 2128 59 2097 b 89 1878 59 1948 75 1909 l 92 1872 b 122 1796 102 1848 118 1824 b 124 1781 124 1791 124 1786 b 108 1737 124 1763 117 1750 b 59 1614 82 1712 59 1675 b 92 1503 59 1575 78 1535 b 122 1426 102 1477 118 1454 b 124 1410 124 1420 124 1414 b 115 1378 124 1397 121 1388 b 59 1248 86 1354 59 1315 b 92 1138 59 1210 78 1169 b 122 1060 102 1113 118 1089 b 122 1057 122 1058 122 1058 l 124 1050 b 105 998 124 1027 118 1015 b 59 877 81 972 59 936 b 92 766 59 838 78 798 b 122 688 102 742 118 717 b 124 674 124 683 124 678 b 102 624 124 655 115 639 l 99 619 b 96 615 99 619 98 616 b 59 503 76 590 59 556 b 89 397 59 468 75 429 l 92 392 b 121 323 101 370 115 348 l 1 323 l 164 -6 l 330 323 z',\n },\n repeat1Bar: {\n x_min: 0,\n x_max: 532,\n y_min: -250,\n y_max: 279,\n ha: 529,\n o: 'm 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z m 89 288 b 0 197 40 288 0 248 b 89 108 0 148 40 108 b 180 197 140 108 180 148 b 89 288 180 248 140 288 z m 675 -71 b 586 -161 626 -71 586 -111 b 675 -251 586 -210 626 -251 b 766 -161 726 -251 766 -210 b 675 -71 766 -111 726 -71 z',\n },\n repeat2Bars: {\n x_min: 0,\n x_max: 762,\n y_min: -250,\n y_max: 279,\n ha: 529,\n o: 'm 1090 380 b 1097 395 1094 386 1097 390 b 1089 402 1097 399 1094 402 l 936 402 b 910 380 927 402 920 393 l 336 -340 b 331 -350 333 -343 331 -347 b 343 -360 331 -356 336 -360 l 485 -360 b 516 -340 498 -360 508 -348 z m 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z m 89 288 b 0 197 40 288 0 248 b 89 108 0 148 40 108 b 180 197 140 108 180 148 b 89 288 180 248 140 288 z m 1007 -71 b 917 -161 958 -71 917 -111 b 1007 -251 917 -210 958 -251 b 1097 -161 1057 -251 1097 -210 b 1007 -71 1097 -111 1057 -71 z',\n },\n repeat4Bars: {\n x_min: 0,\n x_max: 1232,\n y_min: -250,\n y_max: 279,\n ha: 529,\n o: 'm 1767 380 b 1774 395 1771 386 1774 390 b 1765 402 1774 399 1771 402 l 1613 402 b 1587 380 1604 402 1597 393 l 1012 -340 b 1008 -350 1009 -343 1008 -347 b 1020 -360 1008 -356 1012 -360 l 1162 -360 b 1192 -340 1175 -360 1185 -348 z m 1436 380 b 1443 395 1440 386 1443 390 b 1434 402 1443 399 1440 402 l 1282 402 b 1256 380 1273 402 1266 393 l 681 -340 b 677 -350 678 -343 677 -347 b 688 -360 677 -356 681 -360 l 831 -360 b 861 -340 844 -360 854 -348 z m 1090 380 b 1097 395 1094 386 1097 390 b 1089 402 1097 399 1094 402 l 936 402 b 910 380 927 402 920 393 l 336 -340 b 331 -350 333 -343 331 -347 b 343 -360 331 -356 336 -360 l 485 -360 b 516 -340 498 -360 508 -348 z m 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z m 89 288 b 0 197 40 288 0 248 b 89 108 0 148 40 108 b 180 197 140 108 180 148 b 89 288 180 248 140 288 z m 1683 -71 b 1594 -161 1634 -71 1594 -111 b 1683 -251 1594 -210 1634 -251 b 1774 -161 1734 -251 1774 -210 b 1683 -71 1774 -111 1734 -71 z',\n },\n repeatBarSlash: {\n x_min: 0,\n x_max: 532,\n y_min: -250,\n y_max: 279,\n ha: 529,\n o: 'm 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z',\n },\n csymDiminished: {\n x_min: 0,\n x_max: 473,\n y_min: 0,\n y_max: 473,\n ha: 473,\n o: 'm 341 681 b 0 341 153 681 0 530 b 341 0 0 153 153 0 b 681 341 530 0 681 153 b 341 681 681 530 530 681 z m 341 618 b 618 341 495 618 618 495 b 341 63 618 189 494 63 b 63 341 187 63 63 187 b 341 618 63 494 189 618 z',\n },\n csymHalfDiminished: {\n x_min: -16,\n x_max: 488,\n y_min: -15,\n y_max: 489,\n ha: 504,\n o: 'm 703 660 l 658 704 l 557 603 b 340 681 498 652 422 681 b -1 341 151 681 -1 530 b 78 124 -1 259 29 183 l -23 23 l 22 -22 l 122 79 b 340 0 181 30 258 0 b 680 341 528 0 680 153 b 602 559 680 423 651 500 z m 62 341 b 340 618 62 494 187 618 b 513 559 403 618 464 598 l 122 168 b 62 341 84 217 62 278 z m 616 341 b 340 63 616 189 492 63 b 167 124 276 63 216 85 l 557 514 b 616 341 596 465 616 405 z',\n },\n csymAugmented: {\n x_min: 0,\n x_max: 395,\n y_min: 1,\n y_max: 396,\n ha: 395,\n o: 'm 569 318 l 317 318 l 317 570 l 253 570 l 253 318 l 0 318 l 0 255 l 253 255 l 253 1 l 317 1 l 317 255 l 569 255 z',\n },\n csymMajorSeventh: {\n x_min: 0,\n x_max: 558,\n y_min: 1,\n y_max: 477,\n ha: 476,\n o: 'm 402 687 l 0 1 l 804 1 z m 402 562 l 693 65 l 111 65 z',\n },\n csymMinor: {\n x_min: 0,\n x_max: 325,\n y_min: 216,\n y_max: 260,\n ha: 44,\n o: 'm 468 374 l 0 374 l 0 311 l 468 311 z',\n },\n csymParensLeftTall: {\n x_min: 1,\n x_max: 185,\n y_min: 0,\n y_max: 997,\n ha: 997,\n o: 'm 266 48 b 261 65 266 55 264 62 b 92 719 157 212 92 400 b 262 1371 92 1037 154 1228 b 266 1394 266 1378 266 1394 l 266 1424 b 264 1436 266 1431 266 1436 b 259 1434 262 1436 259 1434 b 1 719 84 1261 1 1011 b 259 1 1 429 79 177 b 264 0 261 0 262 0 b 266 9 265 0 266 6 z',\n },\n csymParensRightTall: {\n x_min: -20,\n x_max: 164,\n y_min: 0,\n y_max: 997,\n ha: 997,\n o: 'm -29 9 b -26 0 -29 6 -27 0 b -22 1 -24 0 -23 0 b 236 719 158 177 236 429 b -22 1434 236 1011 154 1261 b -26 1436 -22 1434 -24 1436 b -29 1424 -29 1436 -29 1431 l -29 1394 b -24 1371 -29 1394 -29 1378 b 145 719 84 1228 145 1037 b -23 65 145 400 81 212 b -29 48 -26 62 -29 55 z',\n },\n csymBracketLeftTall: {\n x_min: 0,\n x_max: 155,\n y_min: 0,\n y_max: 1000,\n ha: 1000,\n o: 'm 217 0 b 223 9 220 0 223 4 l 223 37 b 217 46 223 42 220 46 l 92 46 l 92 1394 l 217 1394 b 223 1403 220 1394 223 1398 l 223 1431 b 217 1440 223 1436 220 1440 l 6 1440 b 0 1436 3 1440 0 1439 l 0 4 b 6 0 0 1 3 0 z',\n },\n csymBracketRightTall: {\n x_min: 1,\n x_max: 156,\n y_min: 0,\n y_max: 1000,\n ha: 1000,\n o: 'm 219 0 b 225 4 222 0 225 1 l 225 1436 b 219 1440 225 1439 222 1440 l 7 1440 b 1 1431 4 1440 1 1436 l 1 1403 b 7 1394 1 1398 4 1394 l 132 1394 l 132 46 l 7 46 b 1 37 4 46 1 42 l 1 9 b 7 0 1 4 4 0 z',\n },\n csymParensLeftVeryTall: {\n x_min: 0,\n x_max: 122,\n y_min: 0,\n y_max: 993,\n ha: 993,\n o: 'm 176 32 b 171 49 176 39 174 46 b 60 716 104 194 60 399 b 173 1382 60 1032 101 1241 b 176 1405 176 1390 176 1405 l 176 1427 b 173 1430 176 1428 174 1430 b 0 716 40 1297 0 978 b 170 3 0 428 50 179 b 171 0 170 1 170 0 b 176 6 173 0 176 4 z',\n },\n csymParensRightVeryTall: {\n x_min: -15,\n x_max: 107,\n y_min: 0,\n y_max: 993,\n ha: 993,\n o: 'm -22 6 b -17 0 -22 4 -19 0 b -16 3 -16 0 -16 1 b 154 716 104 179 154 428 b -19 1430 154 978 114 1297 b -22 1427 -20 1430 -22 1428 l -22 1405 b -19 1382 -22 1405 -22 1390 b 94 716 53 1241 94 1032 b -17 49 94 399 50 194 b -22 32 -20 46 -22 39 z',\n },\n csymDiagonalArrangementSlash: {\n x_min: 0,\n x_max: 999,\n y_min: 0,\n y_max: 1000,\n ha: 1000,\n o: 'm 1439 1380 l 1377 1440 l 0 60 l 62 0 z',\n },\n accSagittal5v7KleismaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -35 b 135 -112 68 -86 99 -112 b 225 68 194 -112 225 -53 l 180 68 b 144 -4 180 20 168 -4 b 122 0 138 -4 131 -3 b 23 248 86 14 52 96 l 0 248 z',\n },\n accSagittal5v7KleismaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 b 122 0 52 -96 86 -14 b 144 4 131 3 138 4 b 180 -68 168 4 180 -20 l 225 -68 b 135 112 225 53 194 112 b 45 35 99 112 68 86 l 45 517 l 0 517 z',\n },\n accSagittal5CommaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 225 -517 l 225 248 l 203 248 l 0 -112 l 0 -284 l 180 33 l 180 -517 z',\n },\n accSagittal5CommaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 180 517 l 180 -33 l 0 284 l 0 112 l 203 -248 l 225 -248 l 225 517 z',\n },\n accSagittal7CommaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 248 l 0 -517 l 45 -517 l 45 112 l 89 112 b 180 -68 150 112 180 53 l 180 -248 l 225 -248 l 225 68 b 135 248 225 187 194 248 z',\n },\n accSagittal7CommaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 135 -248 b 225 -68 194 -248 225 -187 l 225 248 l 180 248 l 180 68 b 89 -112 180 -53 150 -112 l 45 -112 l 45 517 l 0 517 l 0 -248 z',\n },\n accSagittal25SmallDiesisUp: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -157 l 0 -259 l 315 -89 l 315 -517 l 360 -517 l 360 248 l 337 248 l 0 68 l 0 -33 l 315 135 l 315 10 z',\n },\n accSagittal25SmallDiesisDown: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 315 -10 l 315 -135 l 0 33 l 0 -68 l 337 -248 l 360 -248 l 360 517 l 315 517 l 315 89 l 0 259 l 0 157 z',\n },\n accSagittal35MediumDiesisUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -284 l 180 33 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -68 330 112 360 53 l 360 -248 l 405 -248 l 405 68 b 315 248 405 187 374 248 l 203 248 l 0 -112 z',\n },\n accSagittal35MediumDiesisDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 203 -248 l 315 -248 b 405 -68 374 -248 405 -187 l 405 248 l 360 248 l 360 68 b 271 -112 360 -53 330 -112 l 225 -112 l 225 517 l 180 517 l 180 -33 l 0 284 z',\n },\n accSagittal11MediumDiesisUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 225 53 l 225 -517 l 271 -517 l 271 53 l 495 -248 l 495 -89 l 248 248 l 0 -89 l 0 -248 z',\n },\n accSagittal11MediumDiesisDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 248 l 0 89 l 248 -248 l 495 89 l 495 248 l 271 -53 l 271 517 l 225 517 l 225 -53 z',\n },\n accSagittal11LargeDiesisUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 112 l 315 112 b 449 -68 405 112 449 53 l 449 -248 l 495 -248 l 495 68 b 360 248 495 187 449 248 l 135 248 b 0 68 45 248 0 187 z',\n },\n accSagittal11LargeDiesisDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 360 -248 b 495 -68 449 -248 495 -187 l 495 248 l 449 248 l 449 68 b 315 -112 449 -53 405 -112 l 271 -112 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittal35LargeDiesisUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 248 -248 l 540 112 l 540 274 l 271 -58 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittal35LargeDiesisDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 248 -248 l 540 112 l 540 274 l 269 -58 l 269 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittalSharp25SDown: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 112 -112 0 -53 36 -112 l 135 -112 l 135 -517 l 180 -517 l 180 -89 b 248 26 206 -65 229 -27 b 315 -89 264 -27 287 -65 l 315 -517 l 360 -517 l 360 -112 l 383 -112 b 495 68 458 -112 495 -53 l 449 68 b 399 -4 449 20 433 -4 b 248 248 297 -4 261 171 b 122 0 216 96 176 14 b 94 -4 112 -3 102 -4 b 45 68 60 -4 45 20 z',\n },\n accSagittalFlat25SUp: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 94 4 45 -20 60 4 b 122 0 102 4 112 3 b 248 -248 176 -14 216 -96 b 399 4 261 -171 297 4 b 449 -68 433 4 449 -20 l 495 -68 b 383 112 495 53 458 112 l 360 112 l 360 517 l 315 517 l 315 89 b 248 -26 287 65 264 27 b 180 89 229 27 206 65 l 180 517 l 135 517 l 135 112 l 112 112 b 0 -68 36 112 0 53 z',\n },\n accSagittalSharp7CDown: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 112 l 89 112 b 180 104 124 112 154 109 l 180 -517 l 225 -517 l 225 89 b 315 -68 285 60 315 9 l 315 -248 l 360 -248 l 360 68 b 135 248 360 187 285 248 l 0 248 z',\n },\n accSagittalFlat7CUp: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 135 -248 b 360 -68 285 -248 360 -187 l 360 248 l 315 248 l 315 68 b 225 -89 315 -9 285 -60 l 225 517 l 180 517 l 180 -104 b 89 -112 154 -109 124 -112 l 45 -112 l 45 517 l 0 517 z',\n },\n accSagittalSharp5CDown: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -517 l 45 71 l 180 -56 l 180 -517 l 225 -517 l 225 -98 l 405 -268 l 405 -112 l 23 248 l 0 248 l 0 -517 z',\n },\n accSagittalFlat5CUp: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 517 l 0 -248 l 23 -248 l 405 112 l 405 268 l 225 98 l 225 517 l 180 517 l 180 56 l 45 -71 l 45 517 z',\n },\n accSagittalSharp5v7kDown: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -276 l 135 -82 l 135 -517 l 180 -517 l 180 -17 l 271 112 l 315 112 l 315 -517 l 360 -517 l 360 107 b 449 -68 420 89 449 30 l 449 -248 l 495 -248 l 495 68 b 360 248 495 189 449 248 l 248 248 z',\n },\n accSagittalFlat5v7kUp: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 248 -248 l 360 -248 b 495 -68 449 -248 495 -189 l 495 248 l 449 248 l 449 68 b 360 -107 449 -30 420 -89 l 360 517 l 315 517 l 315 -112 l 271 -112 l 180 17 l 180 517 l 135 517 l 135 82 l 0 276 l 0 112 z',\n },\n accSagittalSharp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 180 -53 l 180 -517 l 225 -517 l 225 0 l 292 85 l 360 0 l 360 -517 l 405 -517 l 405 -53 l 585 -274 l 585 -112 l 292 248 l 0 -112 l 0 -274 z',\n },\n accSagittalFlat: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 274 l 0 112 l 292 -248 l 585 112 l 585 274 l 405 53 l 405 517 l 360 517 l 360 0 l 292 -85 l 225 0 l 225 517 l 180 517 l 180 53 z',\n },\n accSagittalSharp5v7kUp: {\n x_min: 0,\n x_max: 312,\n y_min: -361,\n y_max: 172,\n ha: 533,\n o: 'm 45 -517 l 45 -10 b 135 -92 68 -48 98 -75 l 135 -520 l 180 -520 l 180 -108 b 248 -115 203 -112 225 -115 b 271 -112 256 -115 264 -115 l 271 -517 l 315 -517 l 315 -107 b 449 68 405 -89 449 -30 l 405 68 b 297 -4 405 19 369 -4 b 23 248 131 -4 56 85 l 0 248 l 0 -517 z',\n },\n accSagittalFlat5v7kDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 361,\n ha: 533,\n o: 'm 0 517 l 0 -248 l 23 -248 b 297 4 56 -85 131 4 b 405 -68 369 4 405 -19 l 449 -68 b 315 107 449 30 405 89 l 315 517 l 271 517 l 271 112 b 248 115 264 115 256 115 b 180 108 225 115 203 112 l 180 520 l 135 520 l 135 92 b 45 10 98 75 68 48 l 45 517 z',\n },\n accSagittalSharp5CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -266 l 135 -153 l 135 -517 l 180 -517 l 180 -115 l 271 -39 l 271 -517 l 315 -517 l 315 0 l 405 75 l 405 -517 l 449 -517 l 449 248 l 428 248 l 0 -112 z',\n },\n accSagittalFlat5CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 428 -248 l 449 -248 l 449 517 l 405 517 l 405 -75 l 315 0 l 315 517 l 271 517 l 271 39 l 180 115 l 180 517 l 135 517 l 135 153 l 0 266 z',\n },\n accSagittalSharp7CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 112 l 135 112 l 135 -517 l 180 -517 l 180 108 b 271 89 213 105 243 99 l 271 -517 l 315 -517 l 315 73 b 405 -68 374 45 405 -3 l 405 -248 l 449 -248 l 449 68 b 135 248 449 187 346 248 l 0 248 z',\n },\n accSagittalFlat7CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 135 -248 b 449 -68 346 -248 449 -187 l 449 248 l 405 248 l 405 68 b 315 -73 405 3 374 -45 l 315 517 l 271 517 l 271 -89 b 180 -108 243 -99 213 -105 l 180 517 l 135 517 l 135 -112 l 45 -112 l 45 517 l 0 517 z',\n },\n accSagittalSharp25SUp: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -30 l 495 143 l 495 14 l 0 -157 l 0 -255 l 225 -177 l 225 -517 l 271 -517 l 271 -161 l 360 -130 l 360 -517 l 405 -517 l 405 -115 l 495 -84 l 495 -517 l 540 -517 l 540 248 l 517 248 l 0 68 z',\n },\n accSagittalFlat25SDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 l 517 -248 l 540 -248 l 540 517 l 495 517 l 495 84 l 405 115 l 405 517 l 360 517 l 360 130 l 271 161 l 271 517 l 225 517 l 225 177 l 0 255 l 0 157 l 495 -14 l 495 -143 l 0 30 z',\n },\n accSagittalSharp35MUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -274 l 135 -108 l 135 -517 l 180 -517 l 180 -53 l 271 58 l 271 -517 l 315 -517 l 315 112 l 360 112 b 405 109 376 112 390 112 l 405 -517 l 449 -517 l 449 96 b 540 -68 510 72 540 17 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 z',\n },\n accSagittalFlat35MDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 292 -248 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 449 -96 540 -17 510 -72 l 449 517 l 405 517 l 405 -109 b 360 -112 390 -112 376 -112 l 315 -112 l 315 517 l 271 517 l 271 -58 l 180 53 l 180 517 l 135 517 l 135 108 l 0 274 l 0 112 z',\n },\n accSagittalSharp11MUp: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -271 l 180 -79 l 180 -517 l 225 -517 l 225 -30 l 315 65 l 315 -517 l 360 -517 l 360 65 l 449 -30 l 449 -517 l 495 -517 l 495 -79 l 675 -271 l 675 -112 l 337 248 z',\n },\n accSagittalFlat11MDown: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 337 -248 l 675 112 l 675 271 l 495 79 l 495 517 l 449 517 l 449 30 l 360 -65 l 360 517 l 315 517 l 315 -65 l 225 30 l 225 517 l 180 517 l 180 79 l 0 271 l 0 112 z',\n },\n accSagittalSharp11LUp: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 112 l 449 112 l 449 -517 l 495 -517 l 495 104 b 631 -68 585 82 631 26 l 631 -248 l 675 -248 l 675 68 b 449 248 675 187 600 248 l 225 248 b 0 68 75 248 0 187 z',\n },\n accSagittalFlat11LDown: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 449 -248 b 675 -68 600 -248 675 -187 l 675 248 l 631 248 l 631 68 b 495 -104 631 -26 585 -82 l 495 517 l 449 517 l 449 -112 l 360 -112 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z',\n },\n accSagittalSharp35LUp: {\n x_min: 0,\n x_max: 500,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 71 l 452 -17 l 452 -517 l 495 -517 l 495 -56 l 720 -268 l 720 -112 l 337 248 l 225 248 b 0 68 75 248 0 187 z',\n },\n accSagittalFlat35LDown: {\n x_min: 0,\n x_max: 500,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 337 -248 l 720 112 l 720 268 l 495 56 l 495 517 l 452 517 l 452 17 l 360 -71 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z',\n },\n accSagittalDoubleSharp25SDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 135 -112 0 -53 45 -112 b 243 -62 180 -112 215 -95 l 89 -503 l 143 -517 l 292 -82 l 445 -517 l 495 -503 l 343 -62 b 449 -112 372 -95 408 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 315 148 b 112 -4 274 148 236 -4 b 45 68 68 -4 45 20 z',\n },\n accSagittalDoubleFlat25SUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 112 4 45 -20 68 4 b 292 -248 236 4 274 -148 b 475 4 315 -148 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 b 343 62 408 112 372 95 l 495 503 l 445 517 l 292 82 l 143 517 l 89 503 l 243 62 b 135 112 215 95 180 112 b 0 -68 45 112 0 53 z',\n },\n accSagittalDoubleSharp7CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -503 l 52 -517 l 203 -82 l 354 -517 l 405 -503 l 230 0 l 271 108 b 495 -68 420 92 495 35 l 495 -248 l 540 -248 l 540 68 b 225 248 540 187 435 248 l 89 248 l 89 112 l 135 112 l 174 0 z m 213 112 l 203 82 l 192 112 z',\n },\n accSagittalDoubleFlat7CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 174 0 l 135 -112 l 89 -112 l 89 -248 l 225 -248 b 540 -68 435 -248 540 -187 l 540 248 l 495 248 l 495 68 b 271 -108 495 -35 420 -92 l 230 0 l 405 503 l 354 517 l 203 82 l 52 517 l 0 503 z m 192 -112 l 203 -82 l 213 -112 z',\n },\n accSagittalDoubleSharp5CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 405 -503 l 230 0 l 232 4 l 585 -264 l 585 -112 l 112 248 l 89 248 l 89 112 l 151 68 l 174 0 l 0 -503 l 52 -517 l 203 -82 l 354 -517 z',\n },\n accSagittalDoubleFlat5CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 354 517 l 203 82 l 52 517 l 0 503 l 174 0 l 151 -68 l 89 -112 l 89 -248 l 112 -248 l 585 112 l 585 264 l 232 -4 l 230 0 l 405 503 z',\n },\n accSagittalDoubleSharp5v7kDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -274 l 252 35 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 360 112 b 540 -68 480 112 540 53 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 l 0 -112 z',\n },\n accSagittalDoubleFlat5v7kUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 292 -248 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 360 -112 540 -53 480 -112 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 252 -35 l 0 274 z',\n },\n accSagittalDoubleSharp: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 540 -503 l 366 0 l 380 45 l 675 -271 l 675 -112 l 337 248 l 0 -112 l 0 -271 l 295 45 l 310 0 l 135 -503 l 186 -517 l 337 -82 l 488 -517 z',\n },\n accSagittalDoubleFlat: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 488 517 l 337 82 l 186 517 l 135 503 l 310 0 l 295 -45 l 0 271 l 0 112 l 337 -248 l 675 112 l 675 271 l 380 -45 l 366 0 l 540 503 z',\n },\n accSagittal7v11KleismaUp: {\n x_min: 0,\n x_max: 219,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 68 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 -45 b 248 -112 200 -89 225 -112 b 315 68 292 -112 315 -53 l 271 68 b 248 -4 271 20 264 -4 b 236 0 245 -4 240 -3 b 157 248 213 14 187 96 b 78 0 127 96 101 14 b 65 -4 73 -3 68 -4 b 45 68 50 -4 45 20 l 0 68 b 68 -112 0 -53 23 -112 z',\n },\n accSagittal7v11KleismaDown: {\n x_min: 0,\n x_max: 219,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 68 112 b 0 -68 23 112 0 53 l 45 -68 b 65 4 45 -20 50 4 b 78 0 68 4 73 3 b 157 -248 101 -14 127 -96 b 236 0 187 -96 213 -14 b 248 4 240 3 245 4 b 271 -68 264 4 271 -20 l 315 -68 b 248 112 315 53 292 112 b 180 45 225 112 200 89 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 z',\n },\n accSagittal17CommaUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 -40 b 315 -118 248 -92 279 -118 b 405 62 374 -118 405 -59 l 360 62 b 324 -10 360 14 348 -10 b 302 -6 318 -10 311 -9 b 206 217 268 9 235 84 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z',\n },\n accSagittal17CommaDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 206 -217 b 302 6 235 -84 268 -9 b 324 10 311 9 318 10 b 360 -62 348 10 360 -14 l 405 -62 b 315 118 405 59 374 118 b 225 40 279 118 248 92 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z',\n },\n accSagittal55CommaUp: {\n x_min: 0,\n x_max: 219,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 248 l 0 -517 l 45 -517 l 45 58 l 315 -274 l 315 -112 l 23 248 z',\n },\n accSagittal55CommaDown: {\n x_min: 0,\n x_max: 219,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 23 -248 l 315 112 l 315 274 l 45 -58 l 45 517 l 0 517 l 0 -248 z',\n },\n accSagittal7v11CommaUp: {\n x_min: 0,\n x_max: 188,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 248 l 135 248 b 0 68 45 248 0 187 z',\n },\n accSagittal7v11CommaDown: {\n x_min: 0,\n x_max: 188,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 271 -248 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittal5v11SmallDiesisUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 73 l 0 -248 l 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 -40 b 360 -118 295 -92 325 -118 b 449 62 420 -118 449 -59 l 405 62 b 369 -10 405 14 393 -10 b 348 -6 363 -10 356 -9 b 251 217 312 9 279 84 l 248 248 l 135 248 b 0 73 45 248 0 189 z',\n },\n accSagittal5v11SmallDiesisDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -73 b 135 -248 0 -189 45 -248 l 248 -248 l 251 -217 b 348 6 279 -84 312 -9 b 369 10 356 9 363 10 b 405 -62 393 10 405 -14 l 449 -62 b 360 118 449 59 420 118 b 271 40 325 118 295 92 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittalSharp5v11SDown: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 112 -23 45 -84 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 b 242 37 203 -23 225 -3 b 315 -89 262 -23 285 -63 l 315 -517 l 360 -517 l 360 -112 l 383 -112 b 495 68 458 -112 495 -53 l 449 68 b 399 -4 449 20 433 -4 b 248 248 297 -4 261 171 b 157 68 222 127 192 68 l 89 68 b 0 -203 30 68 0 -23 z',\n },\n accSagittalFlat5v11SUp: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 89 -68 0 23 30 -68 l 157 -68 b 248 -248 192 -68 222 -127 b 399 4 261 -171 297 4 b 449 -68 433 4 449 -20 l 495 -68 b 383 112 495 53 458 112 l 360 112 l 360 517 l 315 517 l 315 89 b 242 -37 285 63 262 23 b 180 23 225 3 203 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 84 z',\n },\n accSagittalSharp7v11CDown: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 89 -112 l 89 -517 l 135 -517 l 135 -95 b 206 37 163 -73 187 -30 b 271 -23 225 -3 248 -23 l 271 -517 l 315 -517 l 315 -23 l 383 -23 b 449 -203 428 -23 449 -84 l 495 -203 b 405 68 495 -23 465 68 l 292 68 b 203 248 258 68 228 127 b 101 0 173 98 138 16 b 81 -3 94 0 86 -3 b 45 68 56 -3 45 20 l 0 68 b 89 -112 0 -52 30 -112 z',\n },\n accSagittalFlat7v11CUp: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 112 b 0 -68 30 112 0 52 l 45 -68 b 81 3 45 -20 56 3 b 101 0 86 3 94 0 b 203 -248 138 -16 173 -98 b 292 -68 228 -127 258 -68 l 405 -68 b 495 203 465 -68 495 23 l 449 203 b 383 23 449 84 428 23 l 315 23 l 315 517 l 271 517 l 271 23 b 206 -37 248 23 225 3 b 135 95 187 30 163 73 l 135 517 l 89 517 z',\n },\n accSagittalSharp55CDown: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -271 l 135 -125 l 135 -517 l 180 -517 l 180 -78 l 315 65 l 315 -517 l 360 -517 l 360 248 l 337 248 l 0 -112 z',\n },\n accSagittalFlat55CUp: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 337 -248 l 360 -248 l 360 517 l 315 517 l 315 -65 l 180 78 l 180 517 l 135 517 l 135 125 l 0 271 z',\n },\n accSagittalSharp17CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -248 l 45 -68 b 180 109 45 36 89 95 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -89 292 13 321 -55 l 360 -517 l 405 -517 l 405 -112 l 428 -112 b 540 68 504 -112 540 -53 l 495 68 b 445 -4 495 20 480 -4 b 292 248 343 -4 307 171 l 180 248 b 0 68 60 248 0 187 l 0 -248 z',\n },\n accSagittalFlat17CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 248 l 0 -68 b 180 -248 0 -187 60 -248 l 292 -248 b 445 4 307 -171 343 4 b 495 -68 480 4 495 -20 l 540 -68 b 428 112 540 53 504 112 l 405 112 l 405 517 l 360 517 l 360 89 b 271 -112 321 55 292 -13 l 225 -112 l 225 517 l 180 517 l 180 -109 b 45 68 89 -95 45 -36 l 45 248 z',\n },\n accSagittalSharp7v11kDown: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -32 l 405 138 l 405 13 l 0 -157 l 0 -256 l 225 -161 l 225 -517 l 271 -517 l 271 -144 l 405 -86 l 405 -517 l 449 -517 l 449 248 l 428 248 l 0 68 z',\n },\n accSagittalFlat7v11kUp: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 l 428 -248 l 449 -248 l 449 517 l 405 517 l 405 86 l 271 144 l 271 517 l 225 517 l 225 161 l 0 256 l 0 157 l 405 -13 l 405 -138 l 0 32 z',\n },\n accSagittalSharp7v11kUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 135 -112 l 135 -517 l 180 -517 l 180 -105 b 271 -23 217 -94 248 -65 l 271 -517 l 315 -517 l 315 -23 b 405 -105 337 -65 369 -94 l 405 -517 l 449 -517 l 449 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 315 148 b 112 -4 274 148 236 -4 b 45 68 68 -4 45 20 l 0 68 b 135 -112 0 -53 45 -112 z',\n },\n accSagittalFlat7v11kDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 135 112 b 0 -68 45 112 0 53 l 45 -68 b 112 4 45 -20 68 4 b 292 -248 236 4 274 -148 b 475 4 315 -148 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 l 449 517 l 405 517 l 405 105 b 315 23 369 94 337 65 l 315 517 l 271 517 l 271 23 b 180 105 248 65 217 94 l 180 517 l 135 517 z',\n },\n accSagittalSharp17CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 203 -23 b 271 14 229 -23 251 -10 l 271 -517 l 315 -517 l 315 -23 b 405 -105 337 -65 369 -94 l 405 -517 l 449 -517 l 449 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 312 150 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalFlat17CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 b 475 4 312 -150 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 l 449 517 l 405 517 l 405 105 b 315 23 369 94 337 65 l 315 517 l 271 517 l 271 -14 b 203 23 251 10 229 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalSharp55CUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -517 l 45 78 l 135 10 l 135 -517 l 180 -517 l 180 -23 l 271 -92 l 271 -517 l 315 -517 l 315 -127 l 495 -264 l 495 -112 l 23 248 l 0 248 l 0 -517 z',\n },\n accSagittalFlat55CDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 517 l 0 -248 l 23 -248 l 495 112 l 495 264 l 315 127 l 315 517 l 271 517 l 271 92 l 180 23 l 180 517 l 135 517 l 135 -10 l 45 -78 l 45 517 z',\n },\n accSagittalSharp7v11CUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 86 45 6 89 58 l 180 -517 l 225 -517 l 225 98 b 315 109 252 104 282 108 l 315 -517 l 360 -517 l 360 112 l 449 112 l 449 -517 l 495 -517 l 495 248 l 360 248 b 0 68 121 248 0 189 z',\n },\n accSagittalFlat7v11CDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 360 -248 0 -189 121 -248 l 495 -248 l 495 517 l 449 517 l 449 -112 l 360 -112 l 360 517 l 315 517 l 315 -109 b 225 -98 282 -108 252 -104 l 225 517 l 180 517 l 180 -86 b 45 68 89 -58 45 -6 l 45 248 l 0 248 z',\n },\n accSagittalSharp5v11SUp: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 -23 b 449 -105 383 -65 415 -94 l 449 -517 l 495 -517 l 495 -112 b 631 68 585 -112 631 -53 l 585 68 b 520 -4 585 20 563 -4 b 337 248 396 -4 360 150 l 225 248 b 0 68 76 248 0 187 z',\n },\n accSagittalFlat5v11SDown: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 225 -248 0 -187 76 -248 l 337 -248 b 520 4 360 -150 396 4 b 585 -68 563 4 585 -20 l 631 -68 b 495 112 631 53 585 112 l 495 517 l 449 517 l 449 105 b 360 23 415 94 383 65 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z',\n },\n accSagittalDoubleSharp5v11SDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 203 -23 b 262 4 225 -23 245 -13 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 341 -60 b 449 -112 370 -95 405 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 312 150 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalDoubleFlat5v11SUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 b 475 4 312 -150 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 b 341 60 405 112 370 95 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 262 -4 b 203 23 245 13 225 23 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalDoubleSharp7v11CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 112 -112 b 193 -73 143 -112 170 -99 l 45 -501 l 95 -517 l 248 -81 l 397 -517 l 449 -503 l 275 0 l 278 4 b 337 -23 295 -13 315 -23 l 405 -23 b 495 -203 465 -23 495 -84 l 540 -203 b 428 68 540 -23 503 68 l 360 68 b 248 248 310 68 271 127 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 112 -112 0 -52 36 -112 z',\n },\n accSagittalDoubleFlat7v11CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 112 112 b 0 -68 36 112 0 52 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 b 360 -68 271 -127 310 -68 l 428 -68 b 540 203 503 -68 540 23 l 495 203 b 405 23 495 84 465 23 l 337 23 b 278 -4 315 23 295 13 l 275 0 l 449 503 l 397 517 l 248 81 l 95 517 l 45 501 l 193 73 b 112 112 170 99 143 112 z',\n },\n accSagittalDoubleSharp55CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 428 248 l 0 -112 l 0 -266 l 307 -7 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 366 0 l 386 59 l 449 112 l 449 248 z',\n },\n accSagittalDoubleFlat55CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 449 -248 l 449 -112 l 386 -59 l 366 0 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 307 7 l 0 266 l 0 112 l 428 -248 z',\n },\n accSagittalDoubleSharp17CDown: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -248 l 45 -68 b 271 112 45 53 120 112 l 310 0 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 387 -62 b 495 -112 416 -95 452 -112 b 631 68 585 -112 631 -53 l 585 68 b 520 -4 585 20 563 -4 b 337 248 396 -4 360 150 l 225 248 b 0 68 76 248 0 187 l 0 -248 z',\n },\n accSagittalDoubleFlat17CUp: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 248 l 0 -68 b 225 -248 0 -187 76 -248 l 337 -248 b 520 4 360 -150 396 4 b 585 -68 563 4 585 -20 l 631 -68 b 495 112 631 53 585 112 b 387 62 452 112 416 95 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 310 0 l 271 -112 b 45 68 120 -112 45 -53 l 45 248 z',\n },\n accSagittalDoubleSharp7v11kDown: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -30 l 366 96 l 399 0 l 392 -23 l 0 -157 l 0 -255 l 353 -135 l 225 -503 l 276 -517 l 428 -82 l 579 -517 l 631 -503 l 455 0 l 507 145 l 540 157 l 540 248 l 517 248 z m 416 115 l 442 124 l 428 82 z',\n },\n accSagittalDoubleFlat7v11kUp: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 517 -248 l 540 -248 l 540 -157 l 507 -145 l 455 0 l 631 503 l 579 517 l 428 82 l 276 517 l 225 503 l 353 135 l 0 255 l 0 157 l 392 23 l 399 0 l 366 -96 l 0 30 l 0 -68 z m 428 -82 l 442 -124 l 416 -115 z',\n },\n accSagittal23CommaUp: {\n x_min: 0,\n x_max: 188,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -4 b 68 -23 53 -17 60 -23 l 180 -23 b 225 -203 210 -23 225 -82 l 271 -203 b 206 68 271 -23 248 68 l 89 68 b 23 248 71 68 48 127 l 0 248 z',\n },\n accSagittal23CommaDown: {\n x_min: 0,\n x_max: 188,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 b 89 -68 48 -127 71 -68 l 206 -68 b 271 203 248 -68 271 23 l 225 203 b 180 23 225 82 210 23 l 68 23 b 45 4 60 23 53 17 l 45 517 l 0 517 z',\n },\n accSagittal5v19CommaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -284 l 180 33 l 180 -517 l 225 -517 l 225 248 l 203 248 b 86 112 151 157 112 112 b 45 157 59 112 45 127 l 0 157 b 76 23 0 72 26 27 l 0 -112 z',\n },\n accSagittal5v19CommaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 76 -23 b 0 -157 26 -27 0 -72 l 45 -157 b 86 -112 45 -127 59 -112 b 203 -248 112 -112 151 -157 l 225 -248 l 225 517 l 180 517 l 180 -33 l 0 284 z',\n },\n accSagittal5v23SmallDiesisUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -284 l 180 33 l 180 -517 l 225 -517 l 225 -4 b 248 -23 233 -17 240 -23 l 360 -23 b 405 -203 390 -23 405 -82 l 449 -203 b 386 68 449 -23 428 68 l 271 68 b 203 248 251 68 228 127 l 0 -112 z',\n },\n accSagittal5v23SmallDiesisDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 203 -248 b 271 -68 228 -127 251 -68 l 386 -68 b 449 203 428 -68 449 23 l 405 203 b 360 23 405 82 390 23 l 248 23 b 225 4 240 23 233 17 l 225 517 l 180 517 l 180 -33 l 0 284 z',\n },\n accSagittalSharp5v23SDown: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 6 b 89 -23 59 -13 73 -23 l 180 -23 l 180 -517 l 225 -517 l 225 -23 l 292 -23 b 360 -203 337 -23 360 -84 l 405 -203 b 315 68 405 -23 374 68 l 112 68 b 23 248 78 68 48 127 l 0 248 z',\n },\n accSagittalFlat5v23SUp: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 b 112 -68 48 -127 78 -68 l 315 -68 b 405 203 374 -68 405 23 l 360 203 b 292 23 360 84 337 23 l 225 23 l 225 517 l 180 517 l 180 23 l 89 23 b 45 -6 73 23 59 13 l 45 517 l 0 517 z',\n },\n accSagittalSharp5v19CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 89 -112 0 -52 30 -112 l 89 -517 l 135 -517 l 135 -95 b 225 112 173 -65 203 4 l 271 112 l 271 -517 l 315 -517 l 315 107 b 405 -68 374 89 405 30 l 405 -248 l 449 -248 l 449 68 b 315 248 449 189 405 248 l 203 248 b 101 0 173 98 138 16 b 81 -3 94 0 86 -3 b 45 68 56 -3 45 23 z',\n },\n accSagittalFlat5v19CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 81 3 45 -23 56 3 b 101 0 86 3 94 0 b 203 -248 138 -16 173 -98 l 315 -248 b 449 -68 405 -248 449 -189 l 449 248 l 405 248 l 405 68 b 315 -107 405 -30 374 -89 l 315 517 l 271 517 l 271 -112 l 225 -112 b 135 95 203 -4 173 65 l 135 517 l 89 517 l 89 112 b 0 -68 30 112 0 52 z',\n },\n accSagittalSharp23CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 135 -82 l 135 -517 l 180 -517 l 180 -17 l 239 68 b 315 -23 261 7 287 -23 l 315 -517 l 360 -517 l 360 -23 l 428 -23 b 495 -203 472 -23 495 -84 l 540 -203 b 449 68 540 -23 510 68 l 337 68 b 248 248 302 68 271 127 l 0 -112 l 0 -276 z',\n },\n accSagittalFlat23CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 276 l 0 112 l 248 -248 b 337 -68 271 -127 302 -68 l 449 -68 b 540 203 510 -68 540 23 l 495 203 b 428 23 495 84 472 23 l 360 23 l 360 517 l 315 517 l 315 23 b 239 -68 287 23 261 -7 l 180 17 l 180 517 l 135 517 l 135 82 z',\n },\n accSagittalSharp23CUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 14 b 112 -23 63 -10 86 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 l 271 -517 l 315 -517 l 315 -23 l 360 -23 b 449 -203 420 -23 449 -84 l 495 -203 b 383 68 495 -23 458 68 l 135 68 b 23 248 85 68 48 127 l 0 248 z',\n },\n accSagittalFlat23CDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 b 135 -68 48 -127 85 -68 l 383 -68 b 495 203 458 -68 495 23 l 449 203 b 360 23 449 84 420 23 l 315 23 l 315 517 l 271 517 l 271 23 l 180 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 -14 86 23 63 10 l 45 517 l 0 517 z',\n },\n accSagittalSharp5v19CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -266 l 135 -153 l 135 -517 l 180 -517 l 180 -115 l 271 -39 l 271 -517 l 315 -517 l 315 0 l 405 75 l 405 -517 l 449 -517 l 449 248 l 428 248 b 130 68 285 127 186 68 b 45 157 73 68 45 98 l 0 157 b 112 -20 0 53 37 -6 z',\n },\n accSagittalFlat5v19CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 112 20 b 0 -157 37 6 0 -53 l 45 -157 b 130 -68 45 -98 73 -68 b 428 -248 186 -68 285 -127 l 449 -248 l 449 517 l 405 517 l 405 -75 l 315 0 l 315 517 l 271 517 l 271 39 l 180 115 l 180 517 l 135 517 l 135 153 l 0 266 l 0 112 z',\n },\n accSagittalSharp5v23SUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 135 -108 l 135 -517 l 180 -517 l 180 -53 l 271 58 l 271 -517 l 315 -517 l 315 14 b 383 -23 334 -10 357 -23 l 405 -23 l 405 -517 l 449 -517 l 449 -23 b 540 -203 510 -23 540 -84 l 585 -203 b 472 68 585 -23 547 68 l 405 68 b 292 248 356 68 318 127 l 0 -112 l 0 -274 z',\n },\n accSagittalFlat5v23SDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 274 l 0 112 l 292 -248 b 405 -68 318 -127 356 -68 l 472 -68 b 585 203 547 -68 585 23 l 540 203 b 449 23 540 84 510 23 l 449 517 l 405 517 l 405 23 l 383 23 b 315 -14 357 23 334 10 l 315 517 l 271 517 l 271 -58 l 180 53 l 180 517 l 135 517 l 135 108 z',\n },\n accSagittalDoubleSharp5v23SDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 52 -517 l 203 -81 l 354 -517 l 405 -503 l 239 -23 l 449 -23 b 540 -203 510 -23 540 -84 l 585 -203 b 472 68 585 -23 547 68 l 225 68 b 112 248 176 68 138 127 l 89 248 l 89 112 b 170 -14 109 45 135 0 l 0 -501 z',\n },\n accSagittalDoubleFlat5v23SUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 501 l 170 14 b 89 -112 135 0 109 -45 l 89 -248 l 112 -248 b 225 -68 138 -127 176 -68 l 472 -68 b 585 203 547 -68 585 23 l 540 203 b 449 23 540 84 510 23 l 239 23 l 405 503 l 354 517 l 203 81 l 52 517 z',\n },\n accSagittalDoubleSharp5v19CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 112 -112 0 -52 36 -112 b 193 -73 143 -112 170 -99 l 45 -501 l 95 -517 l 248 -81 l 397 -517 l 449 -501 l 275 0 l 315 112 b 495 -68 435 112 495 53 l 495 -248 l 540 -248 l 540 68 b 360 248 540 189 480 248 l 248 248 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 z',\n },\n accSagittalDoubleFlat5v19CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 l 360 -248 b 540 -68 480 -248 540 -189 l 540 248 l 495 248 l 495 68 b 315 -112 495 -53 435 -112 l 275 0 l 449 501 l 397 517 l 248 81 l 95 517 l 45 501 l 193 73 b 112 112 170 99 143 112 b 0 -68 36 112 0 52 z',\n },\n accSagittalDoubleSharp23CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 252 35 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 323 4 b 383 -23 340 -13 360 -23 l 449 -23 b 540 -203 510 -23 540 -84 l 585 -203 b 472 68 585 -23 547 68 l 405 68 b 292 248 356 68 318 127 l 0 -112 l 0 -274 z',\n },\n accSagittalDoubleFlat23CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 274 l 0 112 l 292 -248 b 405 -68 318 -127 356 -68 l 472 -68 b 585 203 547 -68 585 23 l 540 203 b 449 23 540 84 510 23 l 383 23 b 323 -4 360 23 340 13 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 252 -35 z',\n },\n accSagittal19SchismaUp: {\n x_min: 0,\n x_max: 125,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 68 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 248 l 157 248 b 79 0 127 98 101 16 b 68 -3 73 0 68 -3 b 45 68 52 -3 45 20 l 0 68 b 68 -112 0 -52 23 -112 z',\n },\n accSagittal19SchismaDown: {\n x_min: 0,\n x_max: 125,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 68 112 b 0 -68 23 112 0 52 l 45 -68 b 68 3 45 -20 52 3 b 79 0 68 3 73 0 b 157 -248 101 -16 127 -98 l 180 -248 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 z',\n },\n accSagittal17KleismaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 248 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z',\n },\n accSagittal17KleismaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 225 -248 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z',\n },\n accSagittal143CommaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -203 l 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 248 l 203 248 b 135 68 177 127 154 68 l 105 68 b 45 157 65 68 45 98 l 0 157 b 23 20 0 95 7 50 b 0 -203 7 -23 0 -98 z',\n },\n accSagittal143CommaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 23 -20 0 98 7 23 b 0 -157 7 -50 0 -95 l 45 -157 b 105 -68 45 -98 65 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 225 -248 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z',\n },\n accSagittal11v49CommaUp: {\n x_min: 0,\n x_max: 188,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -292 b 89 -157 45 -203 60 -157 l 203 -157 b 225 -143 210 -157 217 -153 l 225 -517 l 271 -517 l 271 248 l 248 248 b 180 157 233 187 210 157 l 68 157 b 0 -68 23 157 0 82 l 45 -68 b 89 68 45 23 60 68 l 203 68 b 225 84 209 68 216 72 l 225 -36 b 180 -68 213 -58 199 -68 l 68 -68 b 0 -292 23 -68 0 -143 z',\n },\n accSagittal11v49CommaDown: {\n x_min: 0,\n x_max: 188,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 292 b 68 68 0 143 23 68 l 180 68 b 225 36 199 68 213 58 l 225 -84 b 203 -68 216 -72 209 -68 l 89 -68 b 45 68 60 -68 45 -23 l 0 68 b 68 -157 0 -82 23 -157 l 180 -157 b 248 -248 210 -157 233 -187 l 271 -248 l 271 517 l 225 517 l 225 143 b 203 157 217 153 210 157 l 89 157 b 45 292 60 157 45 203 z',\n },\n accSagittal19CommaUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 68 -112 0 -52 23 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 -4 b 203 -23 187 -17 196 -23 l 315 -23 b 360 -203 346 -23 360 -82 l 405 -203 b 341 68 405 -23 383 68 l 225 68 b 157 248 206 68 183 127 b 79 0 127 98 101 16 b 68 -3 73 0 68 -3 b 45 68 52 -3 45 20 z',\n },\n accSagittal19CommaDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 68 3 45 -20 52 3 b 79 0 68 3 73 0 b 157 -248 101 -16 127 -98 b 225 -68 183 -127 206 -68 l 341 -68 b 405 203 383 -68 405 23 l 360 203 b 315 23 360 82 346 23 l 203 23 b 180 4 196 23 187 17 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 b 0 -68 23 112 0 52 z',\n },\n accSagittal7v19CommaUp: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 68 -112 0 -52 23 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 112 l 225 112 b 315 -68 285 112 315 53 l 315 -248 l 360 -248 l 360 68 b 271 248 360 187 330 248 l 157 248 b 79 0 127 98 101 16 b 68 -3 73 0 68 -3 b 45 68 52 -3 45 20 z',\n },\n accSagittal7v19CommaDown: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 68 3 45 -20 52 3 b 79 0 68 3 73 0 b 157 -248 101 -16 127 -98 l 271 -248 b 360 -68 330 -248 360 -187 l 360 248 l 315 248 l 315 68 b 225 -112 315 -53 285 -112 l 180 -112 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 b 0 -68 23 112 0 52 z',\n },\n accSagittal49SmallDiesisUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -203 l 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -68 330 112 360 53 l 360 -248 l 405 -248 l 405 68 b 315 248 405 187 374 248 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z',\n },\n accSagittal49SmallDiesisDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 315 -248 b 405 -68 374 -248 405 -187 l 405 248 l 360 248 l 360 68 b 271 -112 360 -53 330 -112 l 225 -112 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z',\n },\n accSagittal23SmallDiesisUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 58 l 495 -274 l 495 -112 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z',\n },\n accSagittal23SmallDiesisDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 495 112 l 495 274 l 225 -58 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z',\n },\n accSagittal5v13MediumDiesisUp: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -259 l 315 -89 l 315 -517 l 360 -517 l 360 248 l 337 248 b 128 180 253 203 184 180 b 45 248 73 180 45 203 l 0 248 b 52 95 0 170 17 120 l 0 68 l 0 -33 l 315 135 l 315 10 l 0 -157 z',\n },\n accSagittal5v13MediumDiesisDown: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 157 l 315 -10 l 315 -135 l 0 33 l 0 -68 l 52 -95 b 0 -248 17 -120 0 -170 l 45 -248 b 128 -180 45 -203 73 -180 b 337 -248 184 -180 253 -203 l 360 -248 l 360 517 l 315 517 l 315 89 l 0 259 z',\n },\n accSagittal11v19MediumDiesisUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 -4 b 292 -23 278 -17 285 -23 l 405 -23 b 449 -203 435 -23 449 -82 l 495 -203 b 431 68 495 -23 472 68 l 315 68 b 248 248 295 68 271 127 l 135 248 b 0 68 45 248 0 187 l 0 -248 z',\n },\n accSagittal11v19MediumDiesisDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 248 l 0 -68 b 135 -248 0 -187 45 -248 l 248 -248 b 315 -68 271 -127 295 -68 l 431 -68 b 495 203 472 -68 495 23 l 449 203 b 405 23 449 82 435 23 l 292 23 b 271 4 285 23 278 17 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 z',\n },\n accSagittal49MediumDiesisUp: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -68 l 0 -248 l 45 -248 l 315 -94 l 315 -517 l 360 -517 l 360 248 l 225 248 b 0 -68 75 248 0 143 z m 45 -68 b 225 112 45 53 105 112 l 315 112 l 315 10 l 45 -145 z',\n },\n accSagittal49MediumDiesisDown: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 68 b 225 -248 0 -143 75 -248 l 360 -248 l 360 517 l 315 517 l 315 94 l 45 248 l 0 248 z m 45 145 l 315 -10 l 315 -112 l 225 -112 b 45 68 105 -112 45 -53 z',\n },\n accSagittal5v49MediumDiesisUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -89 l 0 -248 l 225 53 l 225 -517 l 271 -517 l 271 53 l 495 -248 l 495 -89 l 248 248 b 89 89 170 143 118 89 b 45 157 60 89 45 112 l 0 157 b 68 3 0 68 23 16 z',\n },\n accSagittal5v49MediumDiesisDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 68 -3 b 0 -157 23 -16 0 -68 l 45 -157 b 89 -89 45 -112 60 -89 b 248 -248 118 -89 170 -143 l 495 89 l 495 248 l 271 -53 l 271 517 l 225 517 l 225 -53 l 0 248 l 0 89 z',\n },\n accSagittal49LargeDiesisUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -89 l 360 -248 l 405 -248 l 405 -68 b 180 248 405 143 330 248 l 0 248 z m 45 12 l 45 112 l 180 112 b 360 -68 300 112 360 53 l 360 -147 z',\n },\n accSagittal49LargeDiesisDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 180 -248 b 405 68 330 -248 405 -143 l 405 248 l 360 248 l 45 89 l 45 517 l 0 517 z m 360 147 l 360 68 b 180 -112 360 -53 300 -112 l 45 -112 l 45 -12 z',\n },\n accSagittal11v19LargeDiesisUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -86 l 449 -256 l 449 -157 l 45 13 l 45 138 l 449 -30 l 449 68 l 23 248 l 0 248 z',\n },\n accSagittal11v19LargeDiesisDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 l 449 -68 l 449 30 l 45 -138 l 45 -13 l 449 157 l 449 256 l 45 86 l 45 517 l 0 517 z',\n },\n accSagittal5v13LargeDiesisUp: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 89 -112 0 -52 30 -112 b 180 -35 125 -112 157 -86 l 180 -517 l 225 -517 l 225 -86 l 631 -256 l 631 -157 l 225 13 l 225 138 l 631 -30 l 631 68 l 203 248 b 101 0 173 98 138 16 b 81 -3 94 0 86 -3 b 45 68 56 -3 45 20 z',\n },\n accSagittal5v13LargeDiesisDown: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 81 3 45 -20 56 3 b 101 0 86 3 94 0 b 203 -248 138 -16 173 -98 l 631 -68 l 631 30 l 225 -138 l 225 -13 l 631 157 l 631 256 l 225 86 l 225 517 l 180 517 l 180 35 b 89 112 157 86 125 112 b 0 -68 30 112 0 52 z',\n },\n accSagittalSharp23SDown: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -203 l 45 -203 b 112 -23 45 -84 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 b 315 6 287 -23 301 -13 l 315 -517 l 360 -517 l 360 248 l 337 248 b 248 68 312 127 282 68 l 194 68 b 89 157 125 68 89 98 l 45 157 b 60 59 45 118 50 85 b 0 -203 20 30 0 -56 z',\n },\n accSagittalFlat23SUp: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 60 -59 0 56 20 -30 b 45 -157 50 -85 45 -118 l 89 -157 b 194 -68 89 -98 125 -68 l 248 -68 b 337 -248 282 -68 312 -127 l 360 -248 l 360 517 l 315 517 l 315 -6 b 271 23 301 13 287 23 l 180 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 84 z',\n },\n accSagittalSharp49SDown: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -292 l 45 -292 b 112 -157 45 -203 68 -157 l 135 -157 l 135 -517 l 180 -517 l 180 -157 l 271 -157 b 315 -135 285 -157 300 -150 l 315 -517 l 360 -517 l 360 248 l 337 248 b 248 157 323 187 292 157 l 89 157 b 0 -68 30 157 0 82 l 45 -68 b 112 68 45 23 68 68 l 271 68 b 315 89 284 68 300 75 l 315 -32 b 248 -68 298 -56 275 -68 l 89 -68 b 0 -292 29 -68 0 -143 z',\n },\n accSagittalFlat49SUp: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 292 b 89 68 0 143 29 68 l 248 68 b 315 32 275 68 298 56 l 315 -89 b 271 -68 300 -75 284 -68 l 112 -68 b 45 68 68 -68 45 -23 l 0 68 b 89 -157 0 -82 30 -157 l 248 -157 b 337 -248 292 -157 323 -187 l 360 -248 l 360 517 l 315 517 l 315 135 b 271 157 300 150 285 157 l 180 157 l 180 517 l 135 517 l 135 157 l 112 157 b 45 292 68 157 45 203 z',\n },\n accSagittalSharp7v19CDown: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -271 l 135 -125 l 135 -517 l 180 -517 l 180 -78 l 315 65 l 315 -517 l 360 -517 l 360 248 l 337 248 b 118 89 239 143 166 89 b 45 157 68 89 45 112 l 0 157 b 89 -20 0 53 29 -6 z',\n },\n accSagittalFlat7v19CUp: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 20 b 0 -157 29 6 0 -53 l 45 -157 b 118 -89 45 -112 68 -89 b 337 -248 166 -89 239 -143 l 360 -248 l 360 517 l 315 517 l 315 -65 l 180 78 l 180 517 l 135 517 l 135 125 l 0 271 l 0 112 z',\n },\n accSagittalSharp19CDown: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 180 96 45 17 89 72 l 180 -517 l 225 -517 l 225 107 b 315 112 252 112 282 112 l 360 112 l 360 -517 l 405 -517 l 405 248 l 271 248 b 0 68 89 248 0 187 z',\n },\n accSagittalFlat19CUp: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 271 -248 0 -187 89 -248 l 405 -248 l 405 517 l 360 517 l 360 -112 l 315 -112 b 225 -107 282 -112 252 -112 l 225 517 l 180 517 l 180 -96 b 45 68 89 -72 45 -17 l 45 248 l 0 248 z',\n },\n accSagittalSharp11v49CDown: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 112 -23 45 -82 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 b 271 112 215 -23 245 23 l 315 112 l 315 -517 l 360 -517 l 360 107 b 449 -68 420 89 449 30 l 449 -248 l 495 -248 l 495 68 b 360 248 495 189 449 248 l 248 248 b 157 68 222 128 192 68 l 89 68 b 0 -203 30 68 0 -23 z',\n },\n accSagittalFlat11v49CUp: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 89 -68 0 23 30 -68 l 157 -68 b 248 -248 192 -68 222 -128 l 360 -248 b 495 -68 449 -248 495 -189 l 495 248 l 449 248 l 449 68 b 360 -107 449 -30 420 -89 l 360 517 l 315 517 l 315 -112 l 271 -112 b 180 23 245 -23 215 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 82 z',\n },\n accSagittalSharp143CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 112 -23 45 -84 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 b 259 76 210 -23 236 10 l 315 17 l 315 -517 l 360 -517 l 360 -30 l 585 -271 l 585 -112 l 248 248 b 157 68 222 127 192 68 l 89 68 b 0 -203 30 68 0 -23 z',\n },\n accSagittalFlat143CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 89 -68 0 23 30 -68 l 157 -68 b 248 -248 192 -68 222 -127 l 585 112 l 585 271 l 360 30 l 360 517 l 315 517 l 315 -17 l 259 -76 b 180 23 236 -10 210 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 84 z',\n },\n accSagittalSharp17kDown: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -157 l 0 -256 l 225 -161 l 225 -517 l 271 -517 l 271 -144 l 405 -86 l 405 -517 l 449 -517 l 449 248 l 428 248 b 145 171 305 196 210 171 b 45 248 78 171 45 196 l 0 248 b 79 101 0 170 26 121 l 0 68 l 0 -32 l 405 138 l 405 13 z',\n },\n accSagittalFlat17kUp: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 405 -13 l 405 -138 l 0 32 l 0 -68 l 79 -101 b 0 -248 26 -121 0 -170 l 45 -248 b 145 -171 45 -196 78 -171 b 428 -248 210 -171 305 -196 l 449 -248 l 449 517 l 405 517 l 405 86 l 271 144 l 271 517 l 225 517 l 225 161 l 0 256 l 0 157 z',\n },\n accSagittalSharp19sDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 180 109 45 36 89 95 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -23 295 23 325 -23 l 360 -517 l 405 -517 l 405 -23 l 472 -23 b 540 -203 517 -23 540 -84 l 585 -203 b 495 68 585 -23 554 68 l 383 68 b 292 248 348 68 318 127 l 180 248 b 0 68 60 248 0 187 z',\n },\n accSagittalFlat19sUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 180 -248 0 -187 60 -248 l 292 -248 b 383 -68 318 -127 348 -68 l 495 -68 b 585 203 554 -68 585 23 l 540 203 b 472 23 540 84 517 23 l 405 23 l 405 517 l 360 517 l 360 23 b 271 -112 325 23 295 -23 l 225 -112 l 225 517 l 180 517 l 180 -109 b 45 68 89 -95 45 -36 l 45 248 l 0 248 z',\n },\n accSagittalSharp19sUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 89 -96 l 89 -517 l 135 -517 l 135 -108 b 180 -112 148 -112 163 -112 b 225 -108 196 -112 210 -112 l 225 -517 l 271 -517 l 271 -94 b 360 -12 305 -78 337 -50 l 360 -517 l 405 -517 l 405 248 l 383 248 b 190 0 353 98 288 16 b 138 -3 171 0 153 -3 b 45 68 75 -3 45 20 l 0 68 b 89 -96 0 -17 30 -72 z',\n },\n accSagittalFlat19sDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 96 b 0 -68 30 72 0 17 l 45 -68 b 138 3 45 -20 75 3 b 190 0 153 3 171 0 b 383 -248 288 -16 353 -98 l 405 -248 l 405 517 l 360 517 l 360 12 b 271 94 337 50 305 78 l 271 517 l 225 517 l 225 108 b 180 112 210 112 196 112 b 135 108 163 112 148 112 l 135 517 l 89 517 z',\n },\n accSagittalSharp17kUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 l 271 -517 l 315 -517 l 315 -23 l 337 -23 b 405 14 363 -23 386 -10 l 405 -517 l 449 -517 l 449 248 l 428 248 b 315 68 402 127 364 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalFlat17kDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 315 -68 b 428 -248 364 -68 402 -127 l 449 -248 l 449 517 l 405 517 l 405 -14 b 337 23 386 10 363 23 l 315 23 l 315 517 l 271 517 l 271 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalSharp143CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 l 271 -517 l 315 -517 l 315 -23 l 337 -23 b 405 14 363 -23 386 -10 l 405 -517 l 449 -517 l 449 248 l 428 248 b 315 68 402 127 364 68 l 240 68 b 89 157 140 68 89 98 l 45 157 b 68 53 45 115 52 81 b 0 -203 23 23 0 -63 z',\n },\n accSagittalFlat143CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -53 0 63 23 -23 b 45 -157 52 -81 45 -115 l 89 -157 b 240 -68 89 -98 140 -68 l 315 -68 b 428 -248 364 -68 402 -127 l 449 -248 l 449 517 l 405 517 l 405 -14 b 337 23 386 10 363 23 l 315 23 l 315 517 l 271 517 l 271 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalSharp11v49CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -68 b 135 68 45 23 76 68 l 337 68 b 405 95 363 68 386 76 l 405 -27 b 315 -68 386 -55 356 -68 l 112 -68 b 0 -292 37 -68 0 -143 l 45 -292 b 135 -157 45 -203 75 -157 l 135 -517 l 180 -517 l 180 -157 l 271 -157 l 271 -517 l 315 -517 l 315 -157 l 337 -157 b 405 -130 360 -157 383 -148 l 405 -517 l 449 -517 l 449 248 l 428 248 b 315 157 413 187 376 157 l 112 157 b 0 -68 37 157 0 82 z',\n },\n accSagittalFlat11v49CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 68 b 112 -157 0 -82 37 -157 l 315 -157 b 428 -248 376 -157 413 -187 l 449 -248 l 449 517 l 405 517 l 405 130 b 337 157 383 148 360 157 l 315 157 l 315 517 l 271 517 l 271 157 l 180 157 l 180 517 l 135 517 l 135 157 b 45 292 75 157 45 203 l 0 292 b 112 68 0 143 37 68 l 315 68 b 405 27 356 68 386 55 l 405 -95 b 337 -68 386 -76 363 -68 l 135 -68 b 45 68 76 -68 45 -23 z',\n },\n accSagittalSharp19CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 89 -109 l 89 -517 l 135 -517 l 135 -109 b 225 -27 170 -102 200 -75 l 225 -517 l 271 -517 l 271 14 b 337 -23 289 -10 311 -23 l 360 -23 l 360 -517 l 405 -517 l 405 -23 b 495 -203 465 -23 495 -82 l 540 -203 b 428 68 540 -23 503 68 l 360 68 b 248 248 310 68 271 128 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 89 -109 0 -39 30 -98 z',\n },\n accSagittalFlat19CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 109 b 0 -68 30 98 0 39 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 b 360 -68 271 -128 310 -68 l 428 -68 b 540 203 503 -68 540 23 l 495 203 b 405 23 495 82 465 23 l 405 517 l 360 517 l 360 23 l 337 23 b 271 -14 311 23 289 10 l 271 517 l 225 517 l 225 27 b 135 109 200 75 170 102 l 135 517 l 89 517 z',\n },\n accSagittalSharp7v19CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 89 -109 l 89 -517 l 135 -517 l 135 -109 b 225 -27 170 -102 200 -75 l 225 -517 l 271 -517 l 271 112 l 315 112 b 360 109 331 112 346 112 l 360 -517 l 405 -517 l 405 98 b 495 -68 465 73 495 19 l 495 -248 l 540 -248 l 540 68 b 360 248 540 189 480 248 l 248 248 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 89 -109 0 -39 30 -98 z',\n },\n accSagittalFlat7v19CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 109 b 0 -68 30 98 0 39 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 l 360 -248 b 540 -68 480 -248 540 -189 l 540 248 l 495 248 l 495 68 b 405 -98 495 -19 465 -73 l 405 517 l 360 517 l 360 -109 b 315 -112 346 -112 331 -112 l 271 -112 l 271 517 l 225 517 l 225 27 b 135 109 200 75 170 102 l 135 517 l 89 517 z',\n },\n accSagittalSharp49SUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 203 -23 b 271 14 229 -23 251 -10 l 271 -517 l 315 -517 l 315 112 l 360 112 b 405 109 376 112 390 112 l 405 -517 l 449 -517 l 449 96 b 540 -68 510 72 540 17 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalFlat49SDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 449 -96 540 -17 510 -72 l 449 517 l 405 517 l 405 -109 b 360 -112 390 -112 376 -112 l 315 -112 l 315 517 l 271 517 l 271 -14 b 203 23 251 10 229 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalSharp23SUp: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 203 -23 b 271 14 229 -23 251 -10 l 271 -517 l 315 -517 l 315 71 l 405 -14 l 405 -517 l 449 -517 l 449 -56 l 675 -268 l 675 -112 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalFlat23SDown: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 675 112 l 675 268 l 449 56 l 449 517 l 405 517 l 405 14 l 315 -71 l 315 517 l 271 517 l 271 -14 b 203 23 251 10 229 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalSharp5v13MUp: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 495 141 l 495 14 l 0 -157 l 0 -256 l 225 -180 l 225 -517 l 271 -517 l 271 -161 l 360 -130 l 360 -517 l 405 -517 l 405 -115 l 495 -84 l 495 -517 l 540 -517 l 540 248 l 517 248 b 167 168 366 194 248 168 b 45 248 85 168 45 194 l 0 248 b 95 99 0 170 30 120 l 0 68 l 0 -30 z',\n },\n accSagittalFlat5v13MDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 30 l 0 -68 l 95 -99 b 0 -248 30 -120 0 -170 l 45 -248 b 167 -168 45 -194 85 -168 b 517 -248 248 -168 366 -194 l 540 -248 l 540 517 l 495 517 l 495 84 l 405 115 l 405 517 l 360 517 l 360 130 l 271 161 l 271 517 l 225 517 l 225 180 l 0 256 l 0 157 l 495 -14 l 495 -141 z',\n },\n accSagittalSharp11v19MUp: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 14 b 428 -23 379 -10 402 -23 l 449 -23 l 449 -517 l 495 -517 l 495 -23 b 585 -203 554 -23 585 -84 l 631 -203 b 517 68 631 -23 593 68 l 449 68 b 337 248 400 68 363 127 l 225 248 b 0 68 75 248 0 187 z',\n },\n accSagittalFlat11v19MDown: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 337 -248 b 449 -68 363 -127 400 -68 l 517 -68 b 631 203 593 -68 631 23 l 585 203 b 495 23 585 84 554 23 l 495 517 l 449 517 l 449 23 l 428 23 b 360 -14 402 23 379 10 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z',\n },\n accSagittalSharp49MUp: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 225 -180 l 225 -517 l 271 -517 l 271 -166 l 360 -132 l 360 -517 l 405 -517 l 405 -117 l 495 -84 l 495 -517 l 540 -517 l 540 248 l 360 248 b 0 -68 120 248 0 143 z m 45 -145 l 45 -68 b 360 112 45 53 150 112 l 495 112 l 495 14 z',\n },\n accSagittalFlat49MDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 68 b 360 -248 0 -143 120 -248 l 540 -248 l 540 517 l 495 517 l 495 84 l 405 117 l 405 517 l 360 517 l 360 132 l 271 166 l 271 517 l 225 517 l 225 180 l 45 248 l 0 248 z m 495 -14 l 495 -112 l 360 -112 b 45 68 150 -112 45 -53 l 45 145 z',\n },\n accSagittalSharp5v49MUp: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -271 l 180 -79 l 180 -517 l 225 -517 l 225 -30 l 315 65 l 315 -517 l 360 -517 l 360 65 l 449 -30 l 449 -517 l 495 -517 l 495 -79 l 675 -271 l 675 -112 l 337 248 b 118 89 239 143 166 89 b 45 157 68 89 45 112 l 0 157 b 107 0 0 62 36 10 l 0 -112 z',\n },\n accSagittalFlat5v49MDown: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 107 0 b 0 -157 36 -10 0 -62 l 45 -157 b 118 -89 45 -112 68 -89 b 337 -248 166 -89 239 -143 l 675 112 l 675 271 l 495 79 l 495 517 l 449 517 l 449 30 l 360 -65 l 360 517 l 315 517 l 315 -65 l 225 30 l 225 517 l 180 517 l 180 79 l 0 271 z',\n },\n accSagittalSharp49LUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -82 l 135 -112 l 135 -517 l 180 -517 l 180 -127 l 271 -157 l 271 -517 l 315 -517 l 315 -173 l 540 -248 l 585 -248 l 585 -68 b 180 248 585 143 449 248 l 0 248 z m 45 112 l 180 112 b 540 -68 420 112 540 53 l 540 -145 l 45 16 z',\n },\n accSagittalFlat49LDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 180 -248 b 585 68 449 -248 585 -143 l 585 248 l 540 248 l 315 173 l 315 517 l 271 517 l 271 157 l 180 127 l 180 517 l 135 517 l 135 112 l 45 82 l 45 517 l 0 517 z m 45 -16 l 540 145 l 540 68 b 180 -112 540 -53 420 -112 l 45 -112 z',\n },\n accSagittalSharp11v19LUp: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -81 l 135 -108 l 135 -517 l 180 -517 l 180 -121 l 271 -148 l 271 -517 l 315 -517 l 315 -161 l 631 -255 l 631 -157 l 45 16 l 45 144 l 631 -30 l 631 68 l 23 248 l 0 248 z',\n },\n accSagittalFlat11v19LDown: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 l 631 -68 l 631 30 l 45 -144 l 45 -16 l 631 157 l 631 255 l 315 161 l 315 517 l 271 517 l 271 148 l 180 121 l 180 517 l 135 517 l 135 108 l 45 81 l 45 517 l 0 517 z',\n },\n accSagittalSharp5v13LUp: {\n x_min: 0,\n x_max: 500,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 89 -109 l 89 -517 l 135 -517 l 135 -109 b 225 -27 170 -102 200 -75 l 225 -517 l 271 -517 l 271 -85 l 360 -120 l 360 -517 l 405 -517 l 405 -135 l 720 -256 l 720 -157 l 271 14 l 271 141 l 720 -30 l 720 68 l 248 248 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 89 -109 0 -39 30 -98 z',\n },\n accSagittalFlat5v13LDown: {\n x_min: 0,\n x_max: 500,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 109 b 0 -68 30 98 0 39 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 l 720 -68 l 720 30 l 271 -141 l 271 -14 l 720 157 l 720 256 l 405 135 l 405 517 l 360 517 l 360 120 l 271 85 l 271 517 l 225 517 l 225 27 b 135 109 200 75 170 102 l 135 517 l 89 517 z',\n },\n accSagittalDoubleSharp23SDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -203 l 45 -203 b 135 -23 45 -82 76 -23 l 301 -23 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 370 -14 b 449 112 423 10 449 53 l 449 248 l 428 248 b 315 68 402 127 364 68 l 240 68 b 89 157 140 68 89 98 l 45 157 b 68 53 45 115 52 81 b 0 -203 23 23 0 -63 z',\n },\n accSagittalDoubleFlat23SUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -53 0 63 23 -23 b 45 -157 52 -81 45 -115 l 89 -157 b 240 -68 89 -98 140 -68 l 315 -68 b 428 -248 364 -68 402 -127 l 449 -248 l 449 -112 b 370 14 449 -53 423 -10 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 301 23 l 135 23 b 45 203 76 23 45 82 z',\n },\n accSagittalDoubleSharp49SDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -292 l 45 -292 b 112 -157 45 -203 68 -157 l 256 -157 l 135 -503 l 187 -517 l 337 -82 l 490 -517 l 540 -503 l 366 0 l 396 89 b 449 157 416 102 435 125 l 449 248 l 428 248 b 315 157 413 187 376 157 l 112 157 b 0 -68 39 157 0 82 l 45 -68 b 135 68 45 23 76 68 l 287 68 l 311 0 l 288 -68 l 89 -68 b 0 -292 32 -68 0 -144 z',\n },\n accSagittalDoubleFlat49SUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 292 b 89 68 0 144 32 68 l 288 68 l 311 0 l 287 -68 l 135 -68 b 45 68 76 -68 45 -23 l 0 68 b 112 -157 0 -82 39 -157 l 315 -157 b 428 -248 376 -157 413 -187 l 449 -248 l 449 -157 b 396 -89 435 -125 416 -102 l 366 0 l 540 503 l 490 517 l 337 82 l 187 517 l 135 503 l 256 157 l 112 157 b 45 292 68 157 45 203 z',\n },\n accSagittalDoubleSharp7v19CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -266 l 307 -7 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 366 0 l 386 59 l 449 112 l 449 248 l 428 248 b 130 68 285 127 186 68 b 45 157 73 68 45 98 l 0 157 b 112 -20 0 53 37 -6 z',\n },\n accSagittalDoubleFlat7v19CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 112 20 b 0 -157 37 6 0 -53 l 45 -157 b 130 -68 45 -98 73 -68 b 428 -248 186 -68 285 -127 l 449 -248 l 449 -112 l 386 -59 l 366 0 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 307 7 l 0 266 l 0 112 z',\n },\n accSagittalDoubleSharp19CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 315 109 45 36 135 95 l 354 0 l 180 -503 l 232 -517 l 383 -82 l 534 -517 l 585 -503 l 410 0 l 449 112 l 495 112 l 495 248 l 360 248 b 0 68 120 248 0 187 z m 372 112 l 393 112 l 383 82 z',\n },\n accSagittalDoubleFlat19CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 360 -248 0 -187 120 -248 l 495 -248 l 495 -112 l 449 -112 l 410 0 l 585 503 l 534 517 l 383 82 l 232 517 l 180 503 l 354 0 l 315 -109 b 45 68 135 -95 45 -36 l 45 248 l 0 248 z m 383 -82 l 393 -112 l 372 -112 z',\n },\n accSagittalDoubleSharp11v49CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 203 -23 b 262 4 225 -23 245 -13 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 360 112 b 540 -68 480 112 540 53 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalDoubleFlat11v49CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 360 -112 540 -53 480 -112 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 262 -4 b 203 23 245 13 225 23 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalDoubleSharp143CDown: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 203 -23 b 262 4 225 -23 245 -13 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 337 49 l 675 -268 l 675 -112 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalDoubleFlat143CUp: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 675 112 l 675 268 l 337 -49 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 262 -4 b 203 23 245 13 225 23 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalDoubleSharp17kDown: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 248 b 95 101 0 170 30 121 l 0 68 l 0 -30 l 364 96 l 399 0 l 390 -23 l 0 -157 l 0 -255 l 353 -135 l 225 -503 l 275 -517 l 428 -82 l 577 -517 l 631 -503 l 455 0 l 507 145 l 540 157 l 540 248 l 517 248 b 167 168 366 194 248 168 b 45 248 85 168 45 194 z m 416 115 l 442 124 l 428 82 z',\n },\n accSagittalDoubleFlat17kUp: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -248 b 167 -168 45 -194 85 -168 b 517 -248 248 -168 366 -194 l 540 -248 l 540 -157 l 507 -145 l 455 0 l 631 503 l 577 517 l 428 82 l 275 517 l 225 503 l 353 135 l 0 255 l 0 157 l 390 23 l 399 0 l 364 -96 l 0 30 l 0 -68 l 95 -101 b 0 -248 30 -121 0 -170 z m 428 -82 l 442 -124 l 416 -115 z',\n },\n accSagittalDoubleSharp19sDown: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 271 112 45 53 120 112 l 310 0 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 366 0 l 367 4 b 428 -23 386 -13 405 -23 l 495 -23 b 585 -203 554 -23 585 -84 l 631 -203 b 517 68 631 -23 593 68 l 449 68 b 337 248 400 68 363 127 l 225 248 b 0 68 75 248 0 187 z',\n },\n accSagittalDoubleFlat19sUp: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 337 -248 b 449 -68 363 -127 400 -68 l 517 -68 b 631 203 593 -68 631 23 l 585 203 b 495 23 585 84 554 23 l 428 23 b 367 -4 405 23 386 13 l 366 0 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 310 0 l 271 -112 b 45 68 120 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittalShaftUp: {\n x_min: 0,\n x_max: 31,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 112 l 0 -517 l 45 -517 l 45 112 l 23 248 z',\n },\n accSagittalShaftDown: {\n x_min: 0,\n x_max: 31,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 23 -248 l 45 -112 l 45 517 l 0 517 l 0 -112 z',\n },\n accSagittalAcute: {\n x_min: 0,\n x_max: 125,\n y_min: -62,\n y_max: 125,\n ha: 187,\n o: 'm 0 0 l 0 -89 l 180 89 l 180 180 z',\n },\n accSagittalGrave: {\n x_min: 0,\n x_max: 125,\n y_min: -125,\n y_max: 62,\n ha: 187,\n o: 'm 180 -180 l 180 -89 l 0 89 l 0 0 z',\n },\n accSagittal1MinaUp: {\n x_min: -7,\n x_max: 124,\n y_min: 16,\n y_max: 106.31676725154982,\n ha: 90.31676725154982,\n o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 134 150 179 112 163 135 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z',\n },\n accSagittal1MinaDown: {\n x_min: -7,\n x_max: 124,\n y_min: -106.31676725154983,\n y_max: -16,\n ha: 90.31676725154983,\n o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 179 -23 163 -135 179 -112 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z',\n },\n accSagittal2MinasUp: {\n x_min: -7,\n x_max: 218,\n y_min: 16,\n y_max: 106.31676725154982,\n ha: 90.31676725154982,\n o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 207 65 179 23 200 55 b 252 107 223 86 240 107 b 271 23 264 107 272 86 l 314 23 b 269 150 314 112 298 135 b 203 130 252 158 220 150 b 173 92 190 115 181 104 b 134 150 167 127 154 140 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z',\n },\n accSagittal2MinasDown: {\n x_min: -7,\n x_max: 218,\n y_min: -106.31676725154983,\n y_max: -16,\n ha: 90.31676725154983,\n o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 173 -92 154 -140 167 -127 b 203 -130 181 -104 190 -115 b 269 -150 220 -150 252 -158 b 314 -23 298 -135 314 -112 l 271 -23 b 252 -107 272 -86 264 -107 b 207 -65 240 -107 223 -86 b 179 -23 200 -55 179 -23 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z',\n },\n accSagittal1TinaUp: {\n x_min: 0,\n x_max: 93,\n y_min: 16,\n y_max: 107,\n ha: 91,\n o: 'm 134 154 l 91 154 b 81 76 91 101 91 86 b 0 68 73 69 48 68 l 0 23 b 134 154 122 23 134 36 z',\n },\n accSagittal1TinaDown: {\n x_min: 0,\n x_max: 93,\n y_min: -107,\n y_max: -16,\n ha: 91,\n o: 'm 134 -154 b 0 -23 134 -36 122 -23 l 0 -68 b 81 -76 48 -68 73 -69 b 91 -154 91 -86 91 -101 z',\n },\n accSagittal2TinasUp: {\n x_min: 0,\n x_max: 94,\n y_min: 16,\n y_max: 107,\n ha: 91,\n o: 'm 135 68 b 89 154 94 68 89 124 l 46 154 b 36 92 45 131 42 105 b 0 68 32 82 23 68 l 0 23 b 68 63 29 23 53 40 b 135 23 84 39 104 23 z',\n },\n accSagittal2TinasDown: {\n x_min: 0,\n x_max: 94,\n y_min: -107,\n y_max: -16,\n ha: 91,\n o: 'm 135 -23 b 68 -63 104 -23 84 -39 b 0 -23 53 -40 29 -23 l 0 -68 b 36 -92 23 -68 32 -82 b 46 -154 42 -105 45 -131 l 89 -154 b 135 -68 89 -124 94 -68 z',\n },\n accSagittal3TinasUp: {\n x_min: -7,\n x_max: 124,\n y_min: 16,\n y_max: 106.31676725154982,\n ha: 90.31676725154982,\n o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 134 150 179 112 163 135 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z',\n },\n accSagittal3TinasDown: {\n x_min: -7,\n x_max: 124,\n y_min: -106.31676725154983,\n y_max: -16,\n ha: 90.31676725154983,\n o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 179 -23 163 -135 179 -112 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z',\n },\n accSagittal4TinasUp: {\n x_min: 0,\n x_max: 187,\n y_min: 16,\n y_max: 106.69999999999997,\n ha: 90.69999999999997,\n o: 'm 0 68 l 0 23 b 143 45 105 23 124 26 b 203 107 153 55 183 107 b 226 23 216 107 226 86 l 269 23 b 225 150 269 112 253 135 b 160 132 207 158 181 153 b 115 81 138 112 124 88 b 0 68 104 71 94 68 z',\n },\n accSagittal4TinasDown: {\n x_min: 0,\n x_max: 187,\n y_min: -106.69999999999999,\n y_max: -16,\n ha: 90.69999999999999,\n o: 'm 0 -68 b 115 -81 94 -68 104 -71 b 160 -132 124 -88 138 -112 b 225 -150 181 -153 207 -158 b 269 -23 253 -135 269 -112 l 226 -23 b 203 -107 226 -86 216 -107 b 143 -45 183 -107 153 -55 b 0 -23 124 -26 105 -23 z',\n },\n accSagittal5TinasUp: {\n x_min: 0,\n x_max: 218,\n y_min: 16,\n y_max: 107,\n ha: 91,\n o: 'm 135 23 b 187 45 156 23 168 26 b 249 107 197 55 228 107 b 271 23 262 107 271 86 l 314 23 b 269 150 314 112 298 135 b 204 132 252 158 226 153 b 160 81 183 112 168 88 b 135 68 148 71 147 68 b 89 154 94 68 89 124 l 46 154 b 36 92 45 131 42 105 b 0 68 32 82 23 68 l 0 23 b 68 63 29 23 53 40 b 135 23 84 39 104 23 z',\n },\n accSagittal5TinasDown: {\n x_min: 0,\n x_max: 218,\n y_min: -107,\n y_max: -16,\n ha: 91,\n o: 'm 135 -23 b 68 -63 104 -23 84 -39 b 0 -23 53 -40 29 -23 l 0 -68 b 36 -92 23 -68 32 -82 b 46 -154 42 -105 45 -131 l 89 -154 b 135 -68 89 -124 94 -68 b 160 -81 147 -68 148 -71 b 204 -132 168 -88 183 -112 b 269 -150 226 -153 252 -158 b 314 -23 298 -135 314 -112 l 271 -23 b 249 -107 271 -86 262 -107 b 187 -45 228 -107 197 -55 b 135 -23 168 -26 156 -23 z',\n },\n accSagittal6TinasUp: {\n x_min: -7,\n x_max: 218,\n y_min: 16,\n y_max: 106.31676725154982,\n ha: 90.31676725154982,\n o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 207 65 179 23 200 55 b 252 107 223 86 240 107 b 271 23 264 107 272 86 l 314 23 b 269 150 314 112 298 135 b 203 130 252 158 220 150 b 173 92 190 115 181 104 b 134 150 167 127 154 140 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z',\n },\n accSagittal6TinasDown: {\n x_min: -7,\n x_max: 218,\n y_min: -106.31676725154983,\n y_max: -16,\n ha: 90.31676725154983,\n o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 173 -92 154 -140 167 -127 b 203 -130 181 -104 190 -115 b 269 -150 220 -150 252 -158 b 314 -23 298 -135 314 -112 l 271 -23 b 252 -107 272 -86 264 -107 b 207 -65 240 -107 223 -86 b 179 -23 200 -55 179 -23 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z',\n },\n accSagittal7TinasUp: {\n x_min: 0,\n x_max: 281,\n y_min: 16,\n y_max: 106.69999999999997,\n ha: 90.69999999999997,\n o: 'm 0 68 l 0 23 b 143 45 105 23 124 26 b 203 107 153 55 183 107 b 226 23 216 107 226 86 l 269 23 b 298 65 269 23 291 55 b 343 107 314 86 331 107 b 361 23 354 107 363 86 l 405 23 b 360 150 405 112 389 135 b 294 130 343 158 311 150 b 264 92 281 115 272 104 b 225 150 258 127 245 140 b 160 132 207 158 181 153 b 115 81 138 112 124 88 b 0 68 104 71 94 68 z',\n },\n accSagittal7TinasDown: {\n x_min: 0,\n x_max: 281,\n y_min: -106.69999999999999,\n y_max: -16,\n ha: 90.69999999999999,\n o: 'm 0 -68 b 115 -81 94 -68 104 -71 b 160 -132 124 -88 138 -112 b 225 -150 181 -153 207 -158 b 264 -92 245 -140 258 -127 b 294 -130 272 -104 281 -115 b 360 -150 311 -150 343 -158 b 405 -23 389 -135 405 -112 l 361 -23 b 343 -107 363 -86 354 -107 b 298 -65 331 -107 314 -86 b 269 -23 291 -55 269 -23 l 226 -23 b 203 -107 226 -86 216 -107 b 143 -45 183 -107 153 -55 b 0 -23 124 -26 105 -23 z',\n },\n accSagittal8TinasUp: {\n x_min: 0,\n x_max: 312,\n y_min: 16,\n y_max: 107,\n ha: 91,\n o: 'm 135 23 b 187 45 156 23 168 26 b 249 107 197 55 228 107 b 271 23 262 107 271 86 l 314 23 b 343 65 314 23 336 55 b 387 107 359 86 376 107 b 406 23 399 107 408 86 l 449 23 b 405 150 449 112 433 135 b 338 130 387 158 356 150 b 308 92 325 115 317 104 b 269 150 302 127 289 140 b 204 132 252 158 226 153 b 160 81 183 112 168 88 b 135 68 148 71 147 68 b 89 154 94 68 89 124 l 46 154 b 36 92 45 131 42 105 b 0 68 32 82 23 68 l 0 23 b 68 63 29 23 53 40 b 135 23 84 39 104 23 z',\n },\n accSagittal8TinasDown: {\n x_min: 0,\n x_max: 312,\n y_min: -107,\n y_max: -16,\n ha: 91,\n o: 'm 135 -23 b 68 -63 104 -23 84 -39 b 0 -23 53 -40 29 -23 l 0 -68 b 36 -92 23 -68 32 -82 b 46 -154 42 -105 45 -131 l 89 -154 b 135 -68 89 -124 94 -68 b 160 -81 147 -68 148 -71 b 204 -132 168 -88 183 -112 b 269 -150 226 -153 252 -158 b 308 -92 289 -140 302 -127 b 338 -130 317 -104 325 -115 b 405 -150 356 -150 387 -158 b 449 -23 433 -135 449 -112 l 406 -23 b 387 -107 408 -86 399 -107 b 343 -65 376 -107 359 -86 b 314 -23 336 -55 314 -23 l 271 -23 b 249 -107 271 -86 262 -107 b 187 -45 228 -107 197 -55 b 135 -23 168 -26 156 -23 z',\n },\n accSagittal9TinasUp: {\n x_min: -7,\n x_max: 312,\n y_min: 16,\n y_max: 106.31676725154982,\n ha: 90.31676725154982,\n o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 207 65 179 23 200 55 b 252 107 223 86 240 107 b 271 23 264 107 272 86 l 314 23 b 343 65 314 23 336 55 b 387 107 359 86 376 107 b 406 23 399 107 408 86 l 449 23 b 405 150 449 112 433 135 b 338 130 387 158 356 150 b 308 92 325 115 317 104 b 269 150 302 127 289 140 b 203 130 252 158 220 150 b 173 92 190 115 181 104 b 134 150 167 127 154 140 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z',\n },\n accSagittal9TinasDown: {\n x_min: -7,\n x_max: 312,\n y_min: -106.31676725154983,\n y_max: -16,\n ha: 90.31676725154983,\n o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 173 -92 154 -140 167 -127 b 203 -130 181 -104 190 -115 b 269 -150 220 -150 252 -158 b 308 -92 289 -140 302 -127 b 338 -130 317 -104 325 -115 b 405 -150 356 -150 387 -158 b 449 -23 433 -135 449 -112 l 406 -23 b 387 -107 408 -86 399 -107 b 343 -65 376 -107 359 -86 b 314 -23 336 -55 314 -23 l 271 -23 b 252 -107 272 -86 264 -107 b 207 -65 240 -107 223 -86 b 179 -23 200 -55 179 -23 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z',\n },\n accSagittalFractionalTinaUp: {\n x_min: -3,\n x_max: 35,\n y_min: 73,\n y_max: 111,\n ha: 38,\n o: 'm -4 132 b 23 105 -4 118 9 105 b 50 132 37 105 50 118 b 23 160 50 147 37 160 b -4 132 9 160 -4 147 z',\n },\n accSagittalFractionalTinaDown: {\n x_min: -3,\n x_max: 35,\n y_min: -111,\n y_max: -73,\n ha: 38,\n o: 'm -4 -132 b 23 -160 -4 -147 9 -160 b 50 -132 37 -160 50 -147 b 23 -105 50 -118 37 -105 b -4 -132 9 -105 -4 -118 z',\n },\n accidentalNarrowReversedFlat: {\n x_min: 0,\n x_max: 164,\n y_min: -194,\n y_max: 421,\n ha: 615,\n o: 'm 236 -279 l 236 606 l 192 606 l 192 179 b 85 243 150 222 114 243 b 0 84 23 243 0 134 b 112 -158 0 3 37 -78 z m 192 112 l 192 -163 l 135 -98 b 82 40 101 -50 82 -3 b 138 144 82 73 96 144 b 192 112 153 144 170 132 z',\n },\n accidentalNarrowReversedFlatAndFlat: {\n x_min: 0,\n x_max: 414,\n y_min: -194,\n y_max: 421,\n ha: 615,\n o: 'm 281 606 l 281 -268 l 438 -158 b 596 84 547 -82 596 3 b 475 243 596 154 556 243 b 325 179 435 243 384 222 l 325 606 z m 235 -279 l 235 606 l 190 606 l 190 179 b 85 243 148 222 114 243 b 12 158 52 243 27 215 b 0 84 3 134 0 108 b 112 -158 0 3 37 -78 z m 325 111 b 410 144 359 132 386 144 b 498 36 462 144 498 84 b 413 -107 498 -9 469 -58 l 325 -173 z m 192 112 l 192 -163 l 135 -98 b 81 40 99 -50 81 -3 b 91 94 81 59 84 76 b 137 144 102 127 118 144 b 192 112 153 144 170 132 z',\n },\n accidentalWilsonPlus: {\n x_min: 0,\n x_max: 281,\n y_min: -203,\n y_max: 203,\n ha: 406,\n o: 'm 405 268 l 225 98 l 225 292 l 180 292 l 180 56 l 0 -112 l 0 -268 l 180 -98 l 180 -292 l 225 -292 l 225 -56 l 405 112 z',\n },\n accidentalWilsonMinus: {\n x_min: 0,\n x_max: 281,\n y_min: -186,\n y_max: 186,\n ha: 372,\n o: 'm 0 112 l 405 -268 l 405 -112 l 0 268 z',\n },\n },\n fontFamily: 'Bravura',\n resolution: 1000,\n generatedOn: '2021-12-06T21:04:30.234Z',\n};\n","/**\n * The Bravura font was created by Daniel Spreadbury @ Steinberg.\n * https://github.com/steinbergmedia/bravura/\n */\nexport const BravuraMetrics = {\n name: 'Bravura',\n smufl: true,\n stave: {\n padding: 12,\n endPaddingMax: 10,\n endPaddingMin: 5,\n unalignedNotePadding: 10,\n },\n accidental: {\n noteheadAccidentalPadding: 1,\n leftPadding: 2,\n accidentalSpacing: 3,\n },\n clef: {\n default: {\n point: 32,\n width: 26,\n },\n small: {\n point: 26,\n width: 20,\n },\n annotations: {\n '8va': {\n smuflCode: 'timeSig8',\n default: {\n point: 18,\n treble: {\n line: -1.4,\n shiftX: 12,\n },\n },\n small: {\n point: 16,\n treble: {\n line: -0.2,\n shiftX: 8,\n },\n },\n },\n '8vb': {\n smuflCode: 'timeSig8',\n default: {\n point: 18,\n treble: {\n line: 6,\n shiftX: 10,\n },\n bass: {\n line: 3.5,\n shiftX: 1,\n },\n },\n small: {\n point: 16,\n treble: {\n line: 5.3,\n shiftX: 6,\n },\n bass: {\n line: 3.1,\n shiftX: 0.5,\n },\n },\n },\n },\n // These may no longer be necessary\n lineCount: {\n '8': { point: 55, shiftY: 14 },\n '7': { point: 47, shiftY: 8 },\n '6': { point: 32, shiftY: 1 },\n '5': { point: 30, shiftY: -6 },\n '4': { point: 23, shiftY: -12 },\n },\n },\n parenthesis: {\n default: {\n point: 39,\n width: 7,\n },\n gracenote: {\n point: (39 * 3) / 5,\n width: 3,\n },\n },\n pedalMarking: {\n up: {\n point: 40,\n },\n down: {\n point: 34,\n },\n },\n // These are for numeric digits, such as in time signatures\n digits: {\n // used by timesig\n shiftLine: -1,\n point: 34,\n // used by tuplets\n tupletPoint: 22,\n shiftY: -6,\n },\n articulation: {\n articStaccatissimoAbove: {\n padding: 2,\n },\n articStaccatissimoBelow: {\n padding: 2,\n },\n },\n tremolo: {\n default: {\n point: 25,\n spacing: 5,\n offsetYStemUp: -5,\n offsetYStemDown: 5,\n offsetXStemUp: 11,\n offsetXStemDown: 1,\n },\n grace: {\n point: 18,\n spacing: 4,\n offsetYStemUp: -5,\n offsetYStemDown: 5,\n offsetXStemUp: 7,\n offsetXStemDown: 1,\n },\n },\n staveRepetition: {\n default: {\n offsetY: 25,\n offsetSymbol: 12,\n spacing: 5,\n },\n },\n // noteHead: {\n // },\n stem: {\n heightAdjustmentForFlag: -3,\n // These are stem (Y) offsets to the note heads. To shift the\n // noteheads (x-position) themselves, see glyphs.notehead.custom.\n noteHead: {\n noteheadTriangleUpHalf: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpBlack: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpWhole: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadXHalf: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXBlack: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXWhole: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadHalf: {\n offsetYBaseStemUp: -2.55,\n offsetYBaseStemDown: 2.65,\n },\n noteheadBlack: {\n offsetYBaseStemUp: -2,\n offsetYBaseStemDown: 2,\n },\n noteheadSquareWhite: {\n offsetYBaseStemDown: -5,\n offsetYBaseStemUp: 5,\n },\n },\n },\n // Values under here are used by the Glyph class to reposition and rescale\n // glyphs based on their category. This should be the first stop for\n // custom font glyph repositioning.\n //\n // The glyph loader first looks up a specific set of settings based on the\n // glyph code, and if not found, uses the defaults from the category. See\n // glyphs.textNote for an example of this.\n //\n // Details in Glyph.lookupFontMetrics.\n glyphs: {\n coda: {\n point: 20,\n shiftX: -7,\n shiftY: 8,\n },\n segno: {\n shiftX: -7,\n },\n flag: {\n shiftX: -0.75,\n tabStem: {\n shiftX: -1.75,\n },\n staveTempo: {\n shiftX: -1,\n },\n },\n clef: {\n gClef: {\n default: { scale: 1.1, shiftY: 1 },\n small: { shiftY: 1.5 },\n },\n fClef: {\n default: { shiftY: -0.5 },\n },\n },\n ornament: {\n ornamentTurn: {\n scale: 1.2,\n },\n ornamentTurnSlash: {\n scale: 1.2,\n },\n },\n stringNumber: {\n verticalPadding: 8,\n stemPadding: 2,\n leftPadding: 5,\n rightPadding: 6,\n },\n stroke: {\n arrowheadBlackDown: {\n straight: {\n shiftX: -4.5,\n },\n wiggly: {\n shiftX: -1,\n shiftY: 1,\n },\n },\n arrowheadBlackUp: {\n straight: {\n shiftX: -0.85,\n },\n wiggly: {\n shiftX: -1,\n shiftY: 1,\n },\n },\n },\n textNote: {\n point: 34,\n breathMarkTick: {\n point: 36,\n shiftY: 9,\n },\n breathMarkComma: {\n point: 36,\n },\n segno: {\n point: 30,\n shiftX: -7,\n shiftY: 8,\n },\n coda: {\n point: 20,\n shiftX: -7,\n shiftY: 8,\n },\n ornamentTrill: {\n shiftX: -8,\n shiftY: 8,\n },\n ornamentTurn: {\n point: 42,\n },\n ornamentTurnSlash: {\n point: 42,\n },\n ornamentMordent: {\n shiftX: -8,\n },\n ornamentShortTrill: {\n shiftX: -8,\n },\n },\n noteHead: {\n minPadding: 2,\n standard: {\n restQuarterStemUp: {\n point: 35,\n },\n restQuarterStemDown: {\n point: 35,\n },\n },\n custom: {\n noteheadCircleXStemUp: {\n shiftX: 1.5,\n },\n noteheadCircleXStemDown: {\n shiftX: 0.25,\n },\n noteheadDiamondHalfStemUp: {\n shiftX: 1.5,\n },\n noteheadDiamondBlackStemUp: {\n shiftX: 1.5,\n },\n noteheadDiamondWholeStemUp: {\n shiftX: 1,\n },\n noteheadXHalfStemUp: {\n shiftX: -2,\n },\n noteheadXHalfStemDown: {\n shiftX: 1,\n },\n noteheadXWholeStemUp: {\n shiftX: -4,\n },\n noteheadXWholeStemDown: {\n shiftX: 1,\n },\n noteheadSquareWhiteStemDown: {\n shiftX: 0.25,\n },\n noteheadSquareWhiteStemUp: {\n shiftX: -0.75,\n },\n noteheadSquareBlackStemUp: {\n shiftX: -0.75,\n },\n noteheadTriangleUpWholeStemUp: {\n shiftX: -0.75,\n },\n },\n },\n chordSymbol: {\n global: {\n superscriptOffset: -400,\n subscriptOffset: 300,\n kerningOffset: -250,\n lowerKerningText: ['D', 'F', 'P', 'T', 'V', 'Y'],\n upperKerningText: ['A', 'L'],\n spacing: 100,\n superSubRatio: 0.66,\n },\n csymDiminished: {\n scale: 0.8,\n leftSideBearing: -32,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymHalfDiminished: {\n scale: 0.8,\n leftSideBearing: -32,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymAugmented: {\n scale: 1,\n leftSideBearing: 0,\n advanceWidth: 530,\n yOffset: 0,\n },\n csymParensLeftTall: {\n scale: 0.8,\n leftSideBearing: -20,\n advanceWidth: 184,\n yOffset: 250,\n },\n csymParensRightTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 189,\n yOffset: 250,\n },\n csymBracketLeftTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 328,\n yOffset: 0,\n },\n csymBracketRightTall: {\n scale: 0.8,\n leftSideBearing: 1,\n advanceWidth: 600,\n yOffset: 0,\n },\n csymParensLeftVeryTall: {\n scale: 0.9,\n leftSideBearing: 50,\n advanceWidth: 121,\n yOffset: 350,\n },\n csymParensRightVeryTall: {\n scale: 0.9,\n leftSideBearing: 0,\n advanceWidth: 111,\n yOffset: 350,\n },\n csymDiagonalArrangementSlash: {\n scale: 0.6,\n leftSideBearing: -1,\n advanceWidth: 990,\n yOffset: 0,\n },\n csymMinor: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 482,\n yOffset: 0,\n },\n csymMajorSeventh: {\n scale: 0.9,\n leftSideBearing: 200,\n yOffset: 0,\n advanceWidth: 600,\n },\n accidentalSharp: {\n scale: 0.75,\n leftSideBearing: 20,\n advanceWidth: 250,\n yOffset: -302,\n },\n accidentalFlat: {\n scale: 0.9,\n leftSideBearing: -20,\n advanceWidth: 226,\n yOffset: -184,\n },\n },\n jazzOrnaments: {\n brassScoop: {\n scale: 1.0,\n xOffset: -12,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 10,\n },\n brassDoitMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 15,\n },\n brassFallLipShort: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassLiftMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 5,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassFallRoughMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 28,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassBend: {\n scale: 1.0,\n xOffset: 2,\n yOffset: -8,\n stemUpYOffset: 25,\n reportedWidth: 5,\n },\n brassMuteClosed: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -8,\n stemUpYOffset: 25,\n reportedWidth: 5,\n },\n brassMuteOpen: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -7,\n stemUpYOffset: 25,\n reportedWidth: 5,\n },\n brassFlip: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassJazzTurn: {\n scale: 1.0,\n xOffset: 6,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassSmear: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n },\n tuplet: {\n noteHeadOffset: 20,\n stemOffset: 10,\n bottomLine: 4,\n topModifierOffset: 15,\n },\n },\n};\n","export const CustomFont = {\n resolution: 1000,\n fontFamily: 'VexFlowCustom',\n glyphs: {\n noteheadSquareWhite: {\n x_min: 0,\n x_max: 430.75,\n ha: 386,\n o: 'm 0 200 l 0 -200 l 430 -200 l 430 200 l 0 200 l 50 150 l 380 150 l 380 -150 l 50 -150 l 50 150 ',\n },\n noteheadSquareBlack: {\n x_min: 0,\n x_max: 430.75,\n ha: 386,\n o: 'm 0 200 l 0 -200 l 430 -200 l 430 200 l 0 200 ',\n },\n accidentalBuyukMucennebFlat: {\n x_min: -171.5,\n x_max: 251.8125,\n ha: 257,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 553 20 616 20 614 b 20 491 20 503 20 491 l 20 491 b 153 535 47 501 149 535 b 174 514 167 535 174 524 b 164 496 174 508 171 501 b 92 470 164 495 132 484 l 20 445 l 20 390 b 20 363 20 378 20 370 b 20 333 20 340 20 333 l 20 333 b 153 377 47 344 149 377 b 174 356 167 377 174 367 b 164 338 174 349 171 342 b 92 312 164 338 132 326 l 20 288 l 20 219 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 30 -21 -212 -21 -212 b -21 273 -21 163 -21 273 b -84 252 -21 273 -50 263 b -152 230 -133 234 -145 230 b -157 231 -155 230 -156 231 b -171 252 -166 234 -171 244 b -160 270 -171 259 -167 266 b -27 316 -159 270 -93 294 l -21 319 l -21 374 b -21 431 -21 406 -21 431 b -84 409 -21 431 -50 421 b -152 388 -133 392 -145 388 b -157 390 -155 388 -156 388 b -171 409 -166 392 -171 401 b -160 428 -171 417 -167 424 b -27 474 -159 428 -93 451 l -21 476 l -21 546 b -20 620 -21 614 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ',\n },\n accidentalBakiyeFlat: {\n x_min: -176.9375,\n x_max: 251.8125,\n ha: 257,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 503 20 616 20 614 b 20 391 20 442 20 391 b 84 424 20 391 49 406 l 147 456 l 152 456 b 153 456 153 456 153 456 b 175 435 166 456 175 446 b 172 427 175 433 174 430 b 92 380 170 420 172 421 l 20 342 l 20 245 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 54 -21 -212 -21 -212 b -21 322 -21 201 -21 322 b -85 290 -21 322 -50 308 l -148 256 l -153 256 b -155 256 -155 256 -155 256 b -176 277 -167 256 -176 266 b -174 285 -176 280 -175 283 b -93 333 -171 294 -174 292 l -21 370 l -21 494 b -20 620 -21 616 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ',\n },\n accidentalKucukMucennebSharp: {\n x_min: -1.359375,\n x_max: 255.890625,\n ha: 261,\n o: 'm 118 514 b 127 517 121 517 122 517 b 147 505 136 517 142 513 l 148 502 l 148 403 b 148 306 148 351 148 306 b 174 315 149 306 160 310 l 200 324 l 205 323 b 223 312 213 323 220 319 l 225 308 l 225 260 b 225 245 225 255 225 249 b 220 204 225 208 224 209 b 179 188 216 199 215 199 l 148 177 l 148 124 l 148 70 l 189 84 b 236 98 219 94 230 98 b 247 94 240 98 243 97 b 255 52 254 88 255 87 b 255 33 255 47 255 40 l 254 -12 l 253 -15 b 249 -22 253 -18 250 -20 l 245 -24 l 196 -41 l 148 -58 l 148 -108 b 148 -158 148 -136 148 -158 b 174 -148 148 -158 160 -154 b 204 -140 198 -140 200 -140 l 204 -140 b 224 -152 213 -140 221 -145 b 225 -201 224 -155 225 -177 b 224 -254 225 -226 224 -251 b 157 -284 220 -262 220 -262 l 148 -288 l 148 -395 l 148 -503 l 147 -506 b 127 -519 142 -514 134 -519 b 107 -506 119 -519 111 -514 l 106 -503 l 106 -403 b 106 -303 106 -316 106 -303 b 104 -303 104 -303 104 -303 b 88 -310 104 -303 96 -306 l 63 -319 b 51 -322 59 -320 55 -322 b 36 -315 46 -322 40 -319 b 31 -273 32 -309 31 -312 b 31 -258 31 -269 31 -263 l 31 -210 l 34 -206 b 40 -198 35 -204 38 -199 b 74 -186 42 -197 57 -191 l 106 -173 l 106 -123 b 106 -97 106 -112 106 -104 b 106 -72 106 -76 106 -72 b 104 -72 106 -72 106 -72 b 20 -99 89 -79 23 -99 b 0 -84 10 -99 2 -93 b -1 -37 0 -81 -1 -59 b 0 11 -1 -15 0 9 b 58 40 4 22 2 22 l 106 56 l 106 109 b 106 123 106 115 106 119 b 106 162 106 147 106 162 b 81 155 106 162 93 159 b 50 147 65 149 55 147 b 36 152 43 147 40 148 b 31 194 32 158 31 156 b 31 209 31 198 31 204 l 31 256 l 34 260 b 76 281 38 269 38 269 l 106 292 l 106 396 l 106 502 l 107 505 b 118 514 110 509 114 513 ',\n },\n accidentalKoron: {\n x_min: -20,\n x_max: 320,\n ha: 257,\n o: 'm -8 200 b -8 210 8 200 16 200 l 20 148 -199 l 23 -615 b 0 -629 9 -629 6 -629 l -21 -612 l -21 -201 l -21 216 l -20 200 m 16 200 l 310 0 l 240 0 l 16 140 l 16 -120 l 240 0 l 310 0 l 16 -200 ',\n },\n accidentalSori: {\n x_min: -10.890625,\n x_max: 299.4375,\n ha: 294,\n o: 'm 44 174 b 51 174 47 174 49 174 b 68 173 55 174 61 174 l 287 112 l 551 40 b 615 20 617 22 609 23 b 626 0 622 16 626 8 b 615 -22 626 -9 622 -18 b 613 -23 613 -23 613 -23 b 613 -23 613 -23 613 -23 b 287 -113 613 -24 597 -29 l 68 -174 b 53 -176 61 -176 57 -176 b 39 -172 47 -176 43 -174 b 27 -151 31 -167 27 -159 b 39 -129 27 -141 31 -133 b 230 -74 43 -124 20 -131 l 370 -36 l 468 -9 b 498 0 484 -4 498 -1 b 468 8 498 0 484 2 l 370 34 l 230 73 b 40 126 28 129 43 124 b 27 149 31 131 27 140 b 44 174 27 161 34 170 m 205 110 l 205 300 b 205 330 245 330 245 300 l 245 300 l 245 -300 b 245 -330 205 -330 205 -300 l 205 -300 l 205 110 l 345 90 m 345 90 l 345 330 b 345 360 385 360 385 330 l 385 330 l 385 -270 b 385 -300 345 -300 345 -270 l 345 -270 l 345 90 ',\n },\n vexAccidentalMicrotonal2: {\n x_min: -1.359375,\n x_max: 386.5625,\n ha: 394,\n o: 'm 249 535 b 257 537 251 537 253 537 b 276 524 266 537 273 533 l 277 521 l 279 419 l 279 316 l 304 323 b 337 328 319 326 330 328 b 353 316 347 328 349 324 b 355 266 355 315 355 290 b 353 215 355 241 355 217 b 319 198 349 206 347 205 b 279 187 284 190 279 188 b 279 156 279 187 279 174 b 279 136 279 151 279 144 l 279 84 l 289 87 l 330 98 b 367 105 352 102 362 105 b 378 101 372 105 375 104 b 386 61 385 95 386 94 b 386 40 386 55 386 48 l 386 -5 l 385 -8 b 374 -19 383 -12 378 -18 b 291 -40 372 -19 347 -26 b 279 -43 284 -41 279 -43 b 279 -83 279 -43 279 -59 b 279 -95 279 -87 279 -91 l 279 -145 l 304 -140 b 337 -133 321 -136 330 -133 b 349 -140 343 -133 347 -136 b 355 -181 355 -145 355 -142 l 355 -197 l 355 -210 b 349 -252 355 -249 355 -247 b 300 -269 345 -258 347 -258 b 280 -274 291 -272 281 -273 l 279 -274 l 277 -378 l 277 -483 l 276 -487 b 257 -499 273 -495 265 -499 b 238 -487 249 -499 242 -495 l 236 -483 l 236 -384 l 236 -285 l 235 -285 l 212 -291 l 170 -301 b 148 -308 159 -305 148 -306 b 147 -415 147 -308 147 -313 l 147 -523 l 145 -526 b 126 -538 141 -534 133 -538 b 106 -526 118 -538 110 -534 l 104 -523 l 104 -420 b 103 -317 104 -326 104 -317 b 103 -317 103 -317 103 -317 b 50 -330 92 -322 54 -330 b 31 -317 42 -330 35 -326 b 29 -267 29 -315 29 -315 l 29 -219 l 32 -216 b 92 -192 36 -206 36 -206 l 104 -190 l 104 -138 b 103 -87 104 -91 104 -87 b 103 -87 103 -87 103 -87 b 88 -91 103 -87 96 -88 l 49 -101 b 17 -106 32 -105 23 -106 b 6 -102 13 -106 10 -105 b -1 -62 0 -97 -1 -95 b 0 -41 -1 -56 0 -49 l 0 4 l 1 6 b 10 16 2 11 6 15 b 91 37 12 18 38 24 l 104 41 l 104 93 b 103 144 104 140 104 144 b 103 144 103 144 103 144 b 50 131 92 141 54 131 b 31 144 42 131 35 137 b 29 195 29 147 29 148 l 29 242 l 32 245 b 92 269 36 255 36 255 l 104 273 l 104 377 l 104 481 l 106 485 b 126 498 110 492 118 498 b 134 495 129 498 132 496 b 145 485 138 494 142 489 l 147 481 l 147 383 l 147 283 l 152 284 b 190 294 155 285 171 290 l 230 303 l 236 305 l 236 413 l 236 521 l 238 524 b 249 535 240 528 243 533 m 236 126 b 235 177 236 154 236 177 l 235 177 b 213 172 235 177 225 174 l 170 161 b 147 155 157 158 147 155 b 147 124 147 155 147 142 b 147 102 147 117 147 111 l 147 52 l 153 54 l 228 72 l 236 74 l 236 126 m 236 -105 b 235 -54 236 -65 236 -54 l 235 -54 b 231 -55 235 -54 234 -54 b 172 -69 227 -55 204 -62 l 149 -76 l 147 -76 l 147 -127 l 147 -179 l 152 -177 b 190 -167 155 -177 171 -173 l 230 -158 l 236 -156 l 236 -105 ',\n },\n vexAccidentalMicrotonal3: {\n x_min: 0,\n x_max: 430.75,\n ha: 360,\n o: 'm -146 537 b -138 538 -143 538 -141 538 b -118 525 -129 538 -121 533 b -117 390 -117 522 -117 521 b -115 259 -117 268 -117 259 b -115 259 -115 259 -115 259 b -59 272 -104 263 -62 272 b -39 259 -50 272 -42 267 b -37 209 -38 257 -37 233 b -39 159 -37 185 -38 162 b -85 138 -43 149 -44 149 l -117 131 l -117 21 b -115 -88 -117 -80 -117 -88 b -115 -88 -115 -88 -115 -88 b -59 -75 -104 -84 -62 -75 b -44 -81 -52 -75 -48 -77 b -38 -124 -38 -87 -38 -85 b -38 -138 -38 -124 -38 -138 b -38 -152 -38 -138 -38 -152 b -44 -195 -38 -191 -38 -190 b -85 -209 -48 -200 -48 -200 l -117 -217 l -117 -349 b -118 -486 -117 -481 -117 -482 b -138 -499 -121 -494 -129 -499 b -153 -493 -143 -499 -149 -497 b -159 -415 -158 -487 -159 -496 b -159 -355 -159 -398 -159 -379 b -159 -227 -159 -284 -159 -227 b -205 -238 -159 -227 -180 -232 b -250 -249 -230 -244 -250 -249 b -251 -386 -251 -249 -251 -311 b -252 -525 -251 -521 -251 -522 b -272 -538 -255 -534 -264 -538 b -287 -532 -277 -538 -283 -536 b -293 -452 -292 -527 -293 -536 b -293 -391 -293 -436 -293 -415 b -294 -260 -293 -269 -293 -260 b -294 -260 -294 -260 -294 -260 b -348 -272 -306 -264 -345 -272 b -368 -259 -357 -272 -365 -267 b -369 -209 -369 -257 -369 -233 b -368 -159 -369 -185 -369 -162 b -323 -139 -364 -149 -362 -148 l -293 -131 l -293 -22 b -294 87 -293 80 -293 87 b -294 87 -294 87 -294 87 b -348 75 -306 84 -345 75 b -368 88 -357 75 -365 80 b -369 138 -369 91 -369 114 b -368 188 -369 162 -369 186 b -323 209 -364 198 -362 199 l -293 216 l -293 349 b -292 486 -293 481 -293 482 b -272 499 -288 494 -280 499 b -257 493 -266 499 -261 497 b -251 414 -251 487 -251 496 b -251 354 -251 398 -251 378 b -251 226 -251 284 -251 226 b -205 238 -250 226 -230 231 b -159 249 -180 244 -159 249 b -159 385 -159 249 -159 310 b -157 525 -159 521 -159 522 b -146 537 -156 530 -151 535 z m -159 11 b -159 120 -159 98 -159 120 l -159 120 b -175 116 -160 120 -167 119 b -221 105 -184 114 -204 109 l -251 98 l -251 -12 b -251 -121 -251 -72 -251 -121 b -205 -110 -250 -121 -230 -116 b -159 -99 -180 -104 -159 -99 b -159 11 -159 -99 -159 -49 z m 89 517 b 97 519 92 518 94 519 b 117 505 106 519 114 513 b 119 376 119 502 119 501 l 119 249 l 145 258 b 176 267 169 266 172 267 b 177 267 176 267 177 267 b 196 255 186 267 192 263 l 197 252 l 197 205 b 197 181 197 195 197 187 b 193 149 197 153 197 153 b 152 131 190 144 187 143 l 119 120 l 119 10 b 119 -100 119 -62 119 -100 b 145 -91 120 -100 131 -96 b 173 -82 159 -86 171 -82 b 176 -81 174 -81 175 -81 b 196 -94 185 -81 193 -87 b 198 -151 197 -97 198 -125 b 197 -194 198 -172 197 -192 b 153 -218 193 -203 192 -204 l 119 -230 l 119 -367 l 118 -504 l 117 -507 b 97 -519 113 -514 105 -519 b 82 -512 92 -519 87 -517 b 76 -434 77 -507 76 -516 b 76 -374 76 -418 76 -398 b 76 -245 76 -303 76 -245 b 52 -254 76 -245 65 -249 b 19 -263 34 -260 25 -263 b 6 -257 13 -263 10 -261 b 0 -214 0 -251 0 -253 b 0 -200 0 -210 0 -205 b 0 -188 0 -196 0 -192 b 6 -143 0 -147 0 -149 b 46 -126 10 -139 10 -139 l 76 -115 l 76 -5 b 76 106 76 56 76 106 b 51 98 76 106 64 102 b 18 89 34 92 25 89 b 6 95 13 89 10 91 b 0 139 0 101 0 99 b 0 153 0 143 0 148 b 0 179 0 163 0 172 b 44 225 0 215 3 211 l 76 236 l 76 369 b 78 505 76 501 76 502 b 89 517 80 510 85 515 z ',\n },\n vexAccidentalMicrotonal4: {\n x_min: 0,\n x_max: 430.75,\n ha: 360,\n o: 'm 283 633 b 291 634 286 634 289 634 b 311 621 300 634 308 629 b 313 505 313 618 313 617 b 313 393 313 443 313 393 b 378 425 313 393 343 407 l 443 458 l 448 458 b 449 458 449 458 449 458 b 471 437 462 458 471 448 b 469 429 471 434 470 432 b 387 382 466 421 469 423 l 313 344 l 313 247 l 313 150 l 315 152 b 433 201 353 184 394 201 b 479 193 448 201 464 198 b 549 86 524 177 549 135 b 526 1 549 59 541 29 b 395 -143 504 -39 475 -71 b 316 -214 351 -182 341 -191 b 292 -229 302 -228 300 -229 b 272 -216 283 -229 275 -224 b 271 55 271 -212 271 -212 b 270 323 271 203 270 323 b 205 291 270 323 241 308 l 140 258 l 135 258 b 134 258 135 258 134 258 b 112 279 121 258 112 267 b 114 287 112 281 113 284 b 196 334 117 295 114 293 l 271 371 l 271 495 b 272 621 271 617 271 618 b 283 633 274 626 279 631 z m 404 133 b 391 134 400 134 395 134 b 384 134 388 134 386 134 b 318 88 358 130 335 114 l 313 81 l 313 -37 l 313 -156 l 316 -152 b 439 83 391 -71 439 22 l 439 84 b 404 133 439 115 430 128 z m -8 633 l -8 633 b 0 634 -6 634 -3 634 b 20 621 8 634 17 629 b 21 384 21 618 21 617 l 21 150 l 24 152 b 141 201 62 184 102 201 b 187 193 157 201 172 198 b 257 86 232 177 257 135 b 234 1 257 59 250 29 b 103 -143 212 -39 183 -71 b 24 -214 60 -182 49 -191 b 0 -229 10 -228 8 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 203 l -21 618 l -20 621 b -8 633 -18 626 -13 631 z m 113 133 l 113 133 b 99 134 109 134 103 134 b 93 134 97 134 94 134 b 26 88 66 130 43 114 l 21 81 l 21 -37 l 21 -156 l 25 -152 b 148 83 99 -71 148 22 l 148 84 b 113 133 148 115 138 128 z ',\n },\n vexNoteHeadRectBlack: {\n x_min: 0,\n x_max: 430.75,\n ha: 360,\n o: 'm 0 150 l 0 -150 l 430 -150 l 430 150 l 0 150 ',\n },\n vexNoteHeadRectWhite: {\n x_min: 0,\n x_max: 430.75,\n ha: 360,\n o: 'm 0 150 l 0 -150 l 430 -150 l 430 150 l 0 150 l 50 100 l 380 100 l 380 -100 l 50 -100 l 50 100',\n },\n },\n};\n","export const CustomMetrics = {\n name: 'VexFlowCustom',\n smufl: false,\n glyphs: {},\n};\n","export const PetalumaScriptFont = {\n spacing: 50,\n glyphs: {\n ' ': {\n x_min: 0,\n x_max: 250,\n y_min: 0,\n y_max: 500,\n ha: 500,\n leftSideBearing: 0,\n advanceWidth: 250,\n },\n '0': {\n x_min: 33,\n x_max: 534,\n y_min: -13,\n y_max: 751,\n ha: 764,\n leftSideBearing: 33,\n advanceWidth: 570,\n },\n '1': {\n x_min: 48,\n x_max: 235,\n y_min: -17,\n y_max: 734,\n ha: 751,\n leftSideBearing: 48,\n advanceWidth: 286,\n },\n '2': {\n x_min: 56,\n x_max: 571,\n y_min: -19,\n y_max: 741,\n ha: 760,\n leftSideBearing: 56,\n advanceWidth: 626,\n },\n '3': {\n x_min: 50,\n x_max: 528,\n y_min: -7,\n y_max: 731,\n ha: 738,\n leftSideBearing: 50,\n advanceWidth: 589,\n },\n '4': {\n x_min: 38,\n x_max: 564,\n y_min: -13,\n y_max: 743,\n ha: 756,\n leftSideBearing: 38,\n advanceWidth: 614,\n },\n '5': {\n x_min: 42,\n x_max: 601,\n y_min: -34,\n y_max: 743,\n ha: 777,\n leftSideBearing: 42,\n advanceWidth: 648,\n },\n '6': {\n x_min: 47,\n x_max: 606,\n y_min: -16,\n y_max: 743,\n ha: 759,\n leftSideBearing: 47,\n advanceWidth: 667,\n },\n '7': {\n x_min: 47,\n x_max: 567,\n y_min: 5,\n y_max: 739,\n ha: 734,\n leftSideBearing: 0,\n advanceWidth: 615,\n },\n '8': {\n x_min: 40,\n x_max: 541,\n y_min: -15,\n y_max: 752,\n ha: 767,\n leftSideBearing: 40,\n advanceWidth: 585,\n },\n '9': {\n x_min: 40,\n x_max: 537,\n y_min: -52,\n y_max: 736,\n ha: 788,\n leftSideBearing: 40,\n advanceWidth: 592,\n },\n '!': {\n x_min: 49,\n x_max: 180,\n y_min: -7,\n y_max: 761,\n ha: 768,\n leftSideBearing: 49,\n advanceWidth: 230,\n },\n '\"': {\n x_min: 39,\n x_max: 304,\n y_min: 596,\n y_max: 804,\n ha: 208,\n leftSideBearing: 39,\n advanceWidth: 353,\n },\n '#': {\n x_min: 33,\n x_max: 599,\n y_min: -8,\n y_max: 765,\n ha: 773,\n leftSideBearing: 33,\n advanceWidth: 648,\n },\n $: {\n x_min: 53,\n x_max: 495,\n y_min: -111,\n y_max: 823,\n ha: 934,\n leftSideBearing: 53,\n advanceWidth: 560,\n },\n '%': {\n x_min: 35,\n x_max: 656,\n y_min: -128,\n y_max: 808,\n ha: 936,\n leftSideBearing: 35,\n advanceWidth: 711,\n },\n '&': {\n x_min: 53,\n x_max: 441,\n y_min: -3,\n y_max: 753,\n ha: 756,\n leftSideBearing: 53,\n advanceWidth: 500,\n },\n \"'\": {\n x_min: 43,\n x_max: 161,\n y_min: 590,\n y_max: 811,\n ha: 221,\n leftSideBearing: 43,\n advanceWidth: 217,\n },\n '(': {\n x_min: 41,\n x_max: 311,\n y_min: -36,\n y_max: 845,\n ha: 881,\n leftSideBearing: 41,\n advanceWidth: 308,\n },\n ')': {\n x_min: -8,\n x_max: 257,\n y_min: -21,\n y_max: 852,\n ha: 873,\n leftSideBearing: -8,\n advanceWidth: 280,\n },\n '*': {\n x_min: 59,\n x_max: 539,\n y_min: 175,\n y_max: 589,\n ha: 414,\n leftSideBearing: 59,\n advanceWidth: 601,\n },\n '+': {\n x_min: 33,\n x_max: 361,\n y_min: 180,\n y_max: 587,\n ha: 407,\n leftSideBearing: 33,\n advanceWidth: 400,\n },\n ',': {\n x_min: 15,\n x_max: 176,\n y_min: -129,\n y_max: 92,\n ha: 221,\n leftSideBearing: 15,\n advanceWidth: 205,\n },\n '-': {\n x_min: 40,\n x_max: 380,\n y_min: 317,\n y_max: 452,\n ha: 135,\n leftSideBearing: 40,\n advanceWidth: 422,\n },\n '.': {\n x_min: 48,\n x_max: 185,\n y_min: -56,\n y_max: 84,\n ha: 140,\n leftSideBearing: 48,\n advanceWidth: 227,\n },\n '/': {\n x_min: -58,\n x_max: 654,\n y_min: -122,\n y_max: 844,\n ha: 966,\n leftSideBearing: -58,\n advanceWidth: 626,\n },\n ':': {\n x_min: 65,\n x_max: 225,\n y_min: 97,\n y_max: 536,\n ha: 439,\n leftSideBearing: 65,\n advanceWidth: 302,\n },\n ';': {\n x_min: 13,\n x_max: 295,\n y_min: -139,\n y_max: 536,\n ha: 675,\n leftSideBearing: 13,\n advanceWidth: 334,\n },\n '<': {\n x_min: 28,\n x_max: 438,\n y_min: -1,\n y_max: 607,\n ha: 608,\n leftSideBearing: 28,\n advanceWidth: 475,\n },\n '=': {\n x_min: 40,\n x_max: 383,\n y_min: 199.9598640852289,\n y_max: 541,\n ha: 341.0401359147711,\n leftSideBearing: 40,\n advanceWidth: 422,\n },\n '>': {\n x_min: 35,\n x_max: 421,\n y_min: 28,\n y_max: 632,\n ha: 604,\n leftSideBearing: 35,\n advanceWidth: 466,\n },\n '?': {\n x_min: 45,\n x_max: 548,\n y_min: -17,\n y_max: 767,\n ha: 784,\n leftSideBearing: 45,\n advanceWidth: 592,\n },\n '@': {\n x_min: 51,\n x_max: 730,\n y_min: -78,\n y_max: 753,\n ha: 831,\n leftSideBearing: 51,\n advanceWidth: 781,\n },\n A: {\n x_min: 37,\n x_max: 554,\n y_min: -4,\n y_max: 746,\n ha: 750,\n leftSideBearing: 37,\n advanceWidth: 617,\n },\n B: {\n x_min: 37,\n x_max: 532,\n y_min: 3,\n y_max: 783,\n ha: 780,\n leftSideBearing: 37,\n advanceWidth: 579,\n },\n C: {\n x_min: 37,\n x_max: 583,\n y_min: -3,\n y_max: 775,\n ha: 778,\n leftSideBearing: 37,\n advanceWidth: 623,\n },\n D: {\n x_min: 50,\n x_max: 530,\n y_min: -15,\n y_max: 749,\n ha: 764,\n leftSideBearing: 50,\n advanceWidth: 579,\n },\n E: {\n x_min: 45,\n x_max: 531,\n y_min: -1,\n y_max: 743,\n ha: 744,\n leftSideBearing: 45,\n advanceWidth: 585,\n },\n F: {\n x_min: 45,\n x_max: 459,\n y_min: 23,\n y_max: 727,\n ha: 704,\n leftSideBearing: 45,\n advanceWidth: 510,\n },\n G: {\n x_min: 31,\n x_max: 577,\n y_min: -8,\n y_max: 733,\n ha: 741,\n leftSideBearing: 31,\n advanceWidth: 611,\n },\n H: {\n x_min: 37,\n x_max: 493,\n y_min: -22,\n y_max: 758,\n ha: 780,\n leftSideBearing: 37,\n advanceWidth: 535,\n },\n I: {\n x_min: 47,\n x_max: 501,\n y_min: -3,\n y_max: 731,\n ha: 734,\n leftSideBearing: 47,\n advanceWidth: 541,\n },\n J: {\n x_min: 33,\n x_max: 531,\n y_min: -23,\n y_max: 725,\n ha: 748,\n leftSideBearing: 33,\n advanceWidth: 573,\n },\n K: {\n x_min: 43,\n x_max: 505,\n y_min: -10,\n y_max: 740,\n ha: 750,\n leftSideBearing: 43,\n advanceWidth: 560,\n },\n L: {\n x_min: 49,\n x_max: 457,\n y_min: -2,\n y_max: 746,\n ha: 748,\n leftSideBearing: 49,\n advanceWidth: 510,\n },\n M: {\n x_min: 35,\n x_max: 699,\n y_min: 1,\n y_max: 744,\n ha: 743,\n leftSideBearing: 35,\n advanceWidth: 743,\n },\n N: {\n x_min: 34,\n x_max: 533,\n y_min: -17,\n y_max: 761,\n ha: 778,\n leftSideBearing: 34,\n advanceWidth: 579,\n },\n O: {\n x_min: 41,\n x_max: 608,\n y_min: -5,\n y_max: 735,\n ha: 740,\n leftSideBearing: 41,\n advanceWidth: 667,\n },\n P: {\n x_min: 53,\n x_max: 451,\n y_min: -18,\n y_max: 735,\n ha: 753,\n leftSideBearing: 53,\n advanceWidth: 497,\n },\n Q: {\n x_min: 40,\n x_max: 599,\n y_min: -67,\n y_max: 744,\n ha: 811,\n leftSideBearing: 40,\n advanceWidth: 648,\n },\n R: {\n x_min: 39,\n x_max: 487,\n y_min: 16,\n y_max: 735,\n ha: 719,\n leftSideBearing: 39,\n advanceWidth: 535,\n },\n S: {\n x_min: 35,\n x_max: 552,\n y_min: -47,\n y_max: 708,\n ha: 755,\n leftSideBearing: 35,\n advanceWidth: 604,\n },\n T: {\n x_min: 26,\n x_max: 656,\n y_min: -13,\n y_max: 718,\n ha: 731,\n leftSideBearing: 26,\n advanceWidth: 705,\n },\n U: {\n x_min: 41,\n x_max: 518,\n y_min: -20,\n y_max: 748,\n ha: 768,\n leftSideBearing: 41,\n advanceWidth: 567,\n },\n V: {\n x_min: 47,\n x_max: 509,\n y_min: -26,\n y_max: 744,\n ha: 770,\n leftSideBearing: 47,\n advanceWidth: 567,\n },\n W: {\n x_min: 44,\n x_max: 789,\n y_min: -35,\n y_max: 720,\n ha: 755,\n leftSideBearing: 44,\n advanceWidth: 833,\n },\n X: {\n x_min: 63,\n x_max: 635,\n y_min: -10,\n y_max: 745,\n ha: 755,\n leftSideBearing: 63,\n advanceWidth: 680,\n },\n Y: {\n x_min: 43,\n x_max: 503,\n y_min: -21,\n y_max: 734,\n ha: 755,\n leftSideBearing: 43,\n advanceWidth: 541,\n },\n Z: {\n x_min: 42,\n x_max: 584,\n y_min: -10,\n y_max: 739,\n ha: 749,\n leftSideBearing: 42,\n advanceWidth: 629,\n },\n '[': {\n x_min: 46,\n x_max: 346,\n y_min: -150,\n y_max: 884,\n ha: 1034,\n leftSideBearing: 46,\n advanceWidth: 291,\n },\n '\\\\': {\n x_min: 20,\n x_max: 616,\n y_min: -100,\n y_max: 797,\n ha: 897,\n leftSideBearing: 20,\n advanceWidth: 645,\n },\n ']': {\n x_min: -76,\n x_max: 226,\n y_min: -150,\n y_max: 881,\n ha: 1031,\n leftSideBearing: -76,\n advanceWidth: 297,\n },\n '^': {\n x_min: 43,\n x_max: 437,\n y_min: 517,\n y_max: 812,\n ha: 295,\n leftSideBearing: 43,\n advanceWidth: 478,\n },\n _: {\n x_min: 29,\n x_max: 563,\n y_min: -110,\n y_max: -1,\n ha: 109,\n leftSideBearing: 29,\n advanceWidth: 598,\n },\n '`': {\n x_min: 54,\n x_max: 321,\n y_min: 540,\n y_max: 747,\n ha: 207,\n leftSideBearing: 54,\n advanceWidth: 368,\n },\n a: {\n x_min: 20,\n x_max: 447,\n y_min: -17,\n y_max: 495,\n ha: 512,\n leftSideBearing: 20,\n advanceWidth: 494,\n },\n b: {\n x_min: 37,\n x_max: 466,\n y_min: -27,\n y_max: 770,\n ha: 797,\n leftSideBearing: 37,\n advanceWidth: 510,\n },\n c: {\n x_min: 35,\n x_max: 456,\n y_min: -9,\n y_max: 507,\n ha: 516,\n leftSideBearing: 35,\n advanceWidth: 460,\n },\n d: {\n x_min: 45,\n x_max: 520,\n y_min: -15,\n y_max: 764,\n ha: 779,\n leftSideBearing: 45,\n advanceWidth: 560,\n },\n e: {\n x_min: 33,\n x_max: 370,\n y_min: -5,\n y_max: 501,\n ha: 506,\n leftSideBearing: 33,\n advanceWidth: 397,\n },\n f: {\n x_min: 35,\n x_max: 411,\n y_min: -13,\n y_max: 695,\n ha: 708,\n leftSideBearing: 35,\n advanceWidth: 453,\n },\n g: {\n x_min: 33,\n x_max: 551,\n y_min: -257,\n y_max: 505,\n ha: 762,\n leftSideBearing: 33,\n advanceWidth: 611,\n },\n h: {\n x_min: 32,\n x_max: 458,\n y_min: -29,\n y_max: 743,\n ha: 772,\n leftSideBearing: 32,\n advanceWidth: 491,\n },\n i: {\n x_min: 45,\n x_max: 167,\n y_min: -13,\n y_max: 631,\n ha: 644,\n leftSideBearing: 45,\n advanceWidth: 220,\n },\n j: {\n x_min: -127,\n x_max: 261,\n y_min: -231,\n y_max: 601,\n ha: 832,\n leftSideBearing: -127,\n advanceWidth: 308,\n },\n k: {\n x_min: 39,\n x_max: 443,\n y_min: -3,\n y_max: 700,\n ha: 703,\n leftSideBearing: 39,\n advanceWidth: 497,\n },\n l: {\n x_min: 58,\n x_max: 168,\n y_min: -8,\n y_max: 686,\n ha: 694,\n leftSideBearing: 58,\n advanceWidth: 227,\n },\n m: {\n x_min: 39,\n x_max: 688,\n y_min: -14,\n y_max: 501,\n ha: 515,\n leftSideBearing: 39,\n advanceWidth: 718,\n },\n n: {\n x_min: 45,\n x_max: 491,\n y_min: -32,\n y_max: 512,\n ha: 544,\n leftSideBearing: 45,\n advanceWidth: 541,\n },\n o: {\n x_min: 41,\n x_max: 424,\n y_min: -12,\n y_max: 493,\n ha: 505,\n leftSideBearing: 41,\n advanceWidth: 447,\n },\n p: {\n x_min: 25,\n x_max: 529,\n y_min: -260,\n y_max: 500,\n ha: 760,\n leftSideBearing: 25,\n advanceWidth: 573,\n },\n q: {\n x_min: 53,\n x_max: 603,\n y_min: -235,\n y_max: 514,\n ha: 749,\n leftSideBearing: 53,\n advanceWidth: 623,\n },\n r: {\n x_min: 32,\n x_max: 407,\n y_min: -7,\n y_max: 492,\n ha: 499,\n leftSideBearing: 32,\n advanceWidth: 460,\n },\n s: {\n x_min: 49,\n x_max: 416,\n y_min: -12,\n y_max: 519,\n ha: 531,\n leftSideBearing: 49,\n advanceWidth: 460,\n },\n t: {\n x_min: 32,\n x_max: 442,\n y_min: -5,\n y_max: 684,\n ha: 689,\n leftSideBearing: 32,\n advanceWidth: 469,\n },\n u: {\n x_min: 41,\n x_max: 487,\n y_min: -5,\n y_max: 507,\n ha: 512,\n leftSideBearing: 41,\n advanceWidth: 510,\n },\n v: {\n x_min: 16,\n x_max: 441,\n y_min: -20,\n y_max: 542,\n ha: 562,\n leftSideBearing: 16,\n advanceWidth: 456,\n },\n w: {\n x_min: 39,\n x_max: 639,\n y_min: -22,\n y_max: 505,\n ha: 527,\n leftSideBearing: 39,\n advanceWidth: 661,\n },\n x: {\n x_min: 15,\n x_max: 505,\n y_min: -39,\n y_max: 539,\n ha: 578,\n leftSideBearing: 15,\n advanceWidth: 541,\n },\n y: {\n x_min: -98,\n x_max: 501,\n y_min: -242,\n y_max: 511,\n ha: 753,\n leftSideBearing: -98,\n advanceWidth: 548,\n },\n z: {\n x_min: 27,\n x_max: 479,\n y_min: -3,\n y_max: 494,\n ha: 497,\n leftSideBearing: 27,\n advanceWidth: 494,\n },\n '{': {\n x_min: 0,\n x_max: 0,\n y_min: 0,\n y_max: 0,\n ha: 0,\n leftSideBearing: 0,\n advanceWidth: 308,\n },\n '|': {\n x_min: 0,\n x_max: 0,\n y_min: 0,\n y_max: 0,\n ha: 0,\n leftSideBearing: 0,\n advanceWidth: 308,\n },\n '}': {\n x_min: 0,\n x_max: 0,\n y_min: 0,\n y_max: 0,\n ha: 0,\n leftSideBearing: 0,\n advanceWidth: 308,\n },\n '~': {\n x_min: 0,\n x_max: 0,\n y_min: 0,\n y_max: 0,\n ha: 0,\n leftSideBearing: 0,\n advanceWidth: 308,\n },\n },\n fontFamily: 'PetalumaScript',\n resolution: 1000,\n generatedOn: '2020-06-14T18:33:25.407Z',\n};\n","export const RobotoSlabFont = {\n spacing: 50,\n glyphs: {\n ' ': {\n x_min: 0,\n x_max: 509,\n y_min: 0,\n y_max: 2000,\n ha: 2000,\n leftSideBearing: 0,\n advanceWidth: 509,\n },\n '0': {\n x_min: 121,\n x_max: 1048,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 121,\n advanceWidth: 1168,\n },\n '1': {\n x_min: 117,\n x_max: 767,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 117,\n advanceWidth: 844,\n },\n '2': {\n x_min: 75.8474576645637,\n x_max: 1040,\n y_min: 0,\n y_max: 1477,\n ha: 1477,\n leftSideBearing: 75,\n advanceWidth: 1131,\n },\n '3': {\n x_min: 74.85365853658536,\n x_max: 994,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 74,\n advanceWidth: 1106,\n },\n '4': {\n x_min: 63,\n x_max: 1114,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 63,\n advanceWidth: 1187,\n },\n '5': {\n x_min: 96.8448275474953,\n x_max: 982,\n y_min: -21,\n y_max: 1456,\n ha: 1477,\n leftSideBearing: 96,\n advanceWidth: 1081,\n },\n '6': {\n x_min: 121,\n x_max: 1067,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 121,\n advanceWidth: 1144,\n },\n '7': {\n x_min: 76,\n x_max: 1060,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: -30,\n advanceWidth: 1128,\n },\n '8': {\n x_min: 92,\n x_max: 1039,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 92,\n advanceWidth: 1131,\n },\n '9': {\n x_min: 84,\n x_max: 1026,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 84,\n advanceWidth: 1154,\n },\n '!': {\n x_min: 143,\n x_max: 340,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 143,\n advanceWidth: 483,\n },\n '\"': {\n x_min: 166,\n x_max: 634,\n y_min: 1055,\n y_max: 1560,\n ha: 505,\n leftSideBearing: 166,\n advanceWidth: 770,\n },\n '#': {\n x_min: 63,\n x_max: 1179,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 63,\n advanceWidth: 1246,\n },\n $: {\n x_min: 81.92156915727656,\n x_max: 1012,\n y_min: -208,\n y_max: 1693,\n ha: 1901,\n leftSideBearing: 81,\n advanceWidth: 1110,\n },\n '%': {\n x_min: 77,\n x_max: 1384,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 77,\n advanceWidth: 1460,\n },\n '&': {\n x_min: 74,\n x_max: 1242,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 74,\n advanceWidth: 1289,\n },\n \"'\": {\n x_min: 166,\n x_max: 324,\n y_min: 1055,\n y_max: 1560,\n ha: 505,\n leftSideBearing: 166,\n advanceWidth: 460,\n },\n '(': {\n x_min: 114,\n x_max: 650,\n y_min: -463,\n y_max: 1636,\n ha: 2099,\n leftSideBearing: 114,\n advanceWidth: 662,\n },\n ')': {\n x_min: 11,\n x_max: 547,\n y_min: -463,\n y_max: 1636,\n ha: 2099,\n leftSideBearing: 11,\n advanceWidth: 654,\n },\n '*': {\n x_min: 66,\n x_max: 893,\n y_min: 607,\n y_max: 1456,\n ha: 849,\n leftSideBearing: 66,\n advanceWidth: 958,\n },\n '+': {\n x_min: 73,\n x_max: 1071,\n y_min: 146,\n y_max: 1206,\n ha: 1060,\n leftSideBearing: 73,\n advanceWidth: 1145,\n },\n ',': {\n x_min: 23,\n x_max: 315,\n y_min: -311,\n y_max: 221,\n ha: 532,\n leftSideBearing: 23,\n advanceWidth: 404,\n },\n '-': {\n x_min: 154,\n x_max: 643,\n y_min: 538,\n y_max: 692,\n ha: 154,\n leftSideBearing: 154,\n advanceWidth: 797,\n },\n '.': {\n x_min: 145,\n x_max: 342,\n y_min: 0,\n y_max: 202,\n ha: 202,\n leftSideBearing: 145,\n advanceWidth: 493,\n },\n '/': {\n x_min: 0,\n x_max: 774,\n y_min: -125,\n y_max: 1456,\n ha: 1581,\n leftSideBearing: 0,\n advanceWidth: 824,\n },\n ':': {\n x_min: 145,\n x_max: 342,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 145,\n advanceWidth: 419,\n },\n ';': {\n x_min: 53,\n x_max: 345,\n y_min: -311,\n y_max: 1082,\n ha: 1393,\n leftSideBearing: 53,\n advanceWidth: 424,\n },\n '<': {\n x_min: 76,\n x_max: 892,\n y_min: 107,\n y_max: 1013,\n ha: 906,\n leftSideBearing: 76,\n advanceWidth: 1017,\n },\n '=': {\n x_min: 147,\n x_max: 981,\n y_min: 407,\n y_max: 987,\n ha: 580,\n leftSideBearing: 147,\n advanceWidth: 1127,\n },\n '>': {\n x_min: 125,\n x_max: 980,\n y_min: 87,\n y_max: 993,\n ha: 906,\n leftSideBearing: 125,\n advanceWidth: 1060,\n },\n '?': {\n x_min: 65.92660602419838,\n x_max: 890,\n y_min: 0,\n y_max: 1477,\n ha: 1477,\n leftSideBearing: 65,\n advanceWidth: 953,\n },\n '@': {\n x_min: 84.3592218305664,\n x_max: 1705.2346925277395,\n y_min: -453,\n y_max: 1431,\n ha: 1884,\n leftSideBearing: 84,\n advanceWidth: 1821,\n },\n A: {\n x_min: 70,\n x_max: 1463,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 70,\n advanceWidth: 1533,\n },\n B: {\n x_min: 81,\n x_max: 1253,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1322,\n },\n C: {\n x_min: 80,\n x_max: 1174,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 80,\n advanceWidth: 1290,\n },\n D: {\n x_min: 81,\n x_max: 1291,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1356,\n },\n E: {\n x_min: 81,\n x_max: 1190,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1306,\n },\n F: {\n x_min: 81,\n x_max: 1176,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1256,\n },\n G: {\n x_min: 80,\n x_max: 1226,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 80,\n advanceWidth: 1346,\n },\n H: {\n x_min: 81,\n x_max: 1497,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1578,\n },\n I: {\n x_min: 81,\n x_max: 604,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 685,\n },\n J: {\n x_min: 60,\n x_max: 1100,\n y_min: -21,\n y_max: 1456,\n ha: 1477,\n leftSideBearing: 60,\n advanceWidth: 1169,\n },\n K: {\n x_min: 81,\n x_max: 1427,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1501,\n },\n L: {\n x_min: 81,\n x_max: 1130,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1210,\n },\n M: {\n x_min: 94,\n x_max: 1888,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 94,\n advanceWidth: 1982,\n },\n N: {\n x_min: 83,\n x_max: 1509,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 83,\n advanceWidth: 1592,\n },\n O: {\n x_min: 70,\n x_max: 1281,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 70,\n advanceWidth: 1351,\n },\n P: {\n x_min: 81,\n x_max: 1242,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1297,\n },\n Q: {\n x_min: 70,\n x_max: 1348,\n y_min: -245,\n y_max: 1477,\n ha: 1722,\n leftSideBearing: 70,\n advanceWidth: 1376,\n },\n R: {\n x_min: 81,\n x_max: 1285,\n y_min: 0,\n y_max: 1455,\n ha: 1455,\n leftSideBearing: 81,\n advanceWidth: 1385,\n },\n S: {\n x_min: 115,\n x_max: 1116,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 115,\n advanceWidth: 1206,\n },\n T: {\n x_min: 96,\n x_max: 1306,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 96,\n advanceWidth: 1406,\n },\n U: {\n x_min: 70,\n x_max: 1452,\n y_min: -21,\n y_max: 1456,\n ha: 1477,\n leftSideBearing: 70,\n advanceWidth: 1522,\n },\n V: {\n x_min: 65,\n x_max: 1443,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 65,\n advanceWidth: 1508,\n },\n W: {\n x_min: 72,\n x_max: 2057,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 72,\n advanceWidth: 2129,\n },\n X: {\n x_min: 80,\n x_max: 1449,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 80,\n advanceWidth: 1529,\n },\n Y: {\n x_min: 65,\n x_max: 1396,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 65,\n advanceWidth: 1461,\n },\n Z: {\n x_min: 90,\n x_max: 1107,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 90,\n advanceWidth: 1197,\n },\n '[': {\n x_min: 157,\n x_max: 541,\n y_min: -312,\n y_max: 1664,\n ha: 1976,\n leftSideBearing: 157,\n advanceWidth: 573,\n },\n '\\\\': {\n x_min: 36,\n x_max: 830,\n y_min: -125,\n y_max: 1456,\n ha: 1581,\n leftSideBearing: 36,\n advanceWidth: 841,\n },\n ']': {\n x_min: 23,\n x_max: 408,\n y_min: -312,\n y_max: 1664,\n ha: 1976,\n leftSideBearing: 23,\n advanceWidth: 552,\n },\n '^': {\n x_min: 71,\n x_max: 802,\n y_min: 729,\n y_max: 1456,\n ha: 727,\n leftSideBearing: 71,\n advanceWidth: 864,\n },\n _: {\n x_min: 119,\n x_max: 1041,\n y_min: -154,\n y_max: 0,\n ha: 154,\n leftSideBearing: 119,\n advanceWidth: 1168,\n },\n '`': {\n x_min: 40,\n x_max: 456,\n y_min: 1288,\n y_max: 1560,\n ha: 272,\n leftSideBearing: 40,\n advanceWidth: 496,\n },\n a: {\n x_min: 79,\n x_max: 1053,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 79,\n advanceWidth: 1132,\n },\n b: {\n x_min: -16,\n x_max: 1071,\n y_min: -21,\n y_max: 1560,\n ha: 1581,\n leftSideBearing: -16,\n advanceWidth: 1145,\n },\n c: {\n x_min: 78,\n x_max: 988,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 78,\n advanceWidth: 1067,\n },\n d: {\n x_min: 78,\n x_max: 1156,\n y_min: -21,\n y_max: 1560,\n ha: 1581,\n leftSideBearing: 78,\n advanceWidth: 1218,\n },\n e: {\n x_min: 74,\n x_max: 980,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 74,\n advanceWidth: 1059,\n },\n f: {\n x_min: 64,\n x_max: 731,\n y_min: 0,\n y_max: 1581,\n ha: 1581,\n leftSideBearing: 64,\n advanceWidth: 725,\n },\n g: {\n x_min: 78,\n x_max: 1133,\n y_min: -437,\n y_max: 1102,\n ha: 1539,\n leftSideBearing: 78,\n advanceWidth: 1157,\n },\n h: {\n x_min: 49,\n x_max: 1255,\n y_min: 0,\n y_max: 1560,\n ha: 1560,\n leftSideBearing: 49,\n advanceWidth: 1315,\n },\n i: {\n x_min: 67,\n x_max: 590,\n y_min: 0,\n y_max: 1560,\n ha: 1560,\n leftSideBearing: 67,\n advanceWidth: 652,\n },\n j: {\n x_min: -56,\n x_max: 381,\n y_min: -437,\n y_max: 1560,\n ha: 1997,\n leftSideBearing: -56,\n advanceWidth: 525,\n },\n k: {\n x_min: 64,\n x_max: 1248,\n y_min: 0,\n y_max: 1560,\n ha: 1560,\n leftSideBearing: 64,\n advanceWidth: 1287,\n },\n l: {\n x_min: 64,\n x_max: 587,\n y_min: 0,\n y_max: 1560,\n ha: 1560,\n leftSideBearing: 64,\n advanceWidth: 653,\n },\n m: {\n x_min: 74,\n x_max: 1905,\n y_min: 0,\n y_max: 1102,\n ha: 1102,\n leftSideBearing: 74,\n advanceWidth: 1977,\n },\n n: {\n x_min: 74,\n x_max: 1278,\n y_min: 0,\n y_max: 1102,\n ha: 1102,\n leftSideBearing: 74,\n advanceWidth: 1343,\n },\n o: {\n x_min: 78,\n x_max: 1046,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 78,\n advanceWidth: 1124,\n },\n p: {\n x_min: 34,\n x_max: 1119,\n y_min: -416,\n y_max: 1102,\n ha: 1518,\n leftSideBearing: 34,\n advanceWidth: 1197,\n },\n q: {\n x_min: 78,\n x_max: 1135,\n y_min: -416,\n y_max: 1102,\n ha: 1518,\n leftSideBearing: 78,\n advanceWidth: 1139,\n },\n r: {\n x_min: 72,\n x_max: 808,\n y_min: 0,\n y_max: 1102,\n ha: 1102,\n leftSideBearing: 72,\n advanceWidth: 854,\n },\n s: {\n x_min: 104,\n x_max: 933,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 104,\n advanceWidth: 1022,\n },\n t: {\n x_min: 24,\n x_max: 678,\n y_min: -17,\n y_max: 1343,\n ha: 1360,\n leftSideBearing: 24,\n advanceWidth: 730,\n },\n u: {\n x_min: 52,\n x_max: 1181,\n y_min: -21,\n y_max: 1082,\n ha: 1103,\n leftSideBearing: 52,\n advanceWidth: 1245,\n },\n v: {\n x_min: 26,\n x_max: 1176,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 26,\n advanceWidth: 1206,\n },\n w: {\n x_min: 52,\n x_max: 1777,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 52,\n advanceWidth: 1823,\n },\n x: {\n x_min: 42,\n x_max: 1163,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 42,\n advanceWidth: 1203,\n },\n y: {\n x_min: 24,\n x_max: 1172,\n y_min: -437,\n y_max: 1082,\n ha: 1519,\n leftSideBearing: 24,\n advanceWidth: 1192,\n },\n z: {\n x_min: 88,\n x_max: 960,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 88,\n advanceWidth: 1032,\n },\n '{': {\n x_min: 63,\n x_max: 671,\n y_min: -364,\n y_max: 1597,\n ha: 1961,\n leftSideBearing: 63,\n advanceWidth: 701,\n },\n '|': {\n x_min: 150,\n x_max: 307,\n y_min: -270,\n y_max: 1456,\n ha: 1726,\n leftSideBearing: 150,\n advanceWidth: 451,\n },\n '}': {\n x_min: 27,\n x_max: 635,\n y_min: -364,\n y_max: 1597,\n ha: 1961,\n leftSideBearing: 27,\n advanceWidth: 701,\n },\n '~': {\n x_min: 121,\n x_max: 1257,\n y_min: 401,\n y_max: 803,\n ha: 402,\n leftSideBearing: 121,\n advanceWidth: 1386,\n },\n },\n fontFamily: 'Roboto Slab',\n resolution: 2048,\n generatedOn: '2020-06-15T19:12:58.120Z',\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// If you are adding a new music engraving font, search for instances of ADD_MUSIC_FONT throughout the code base.\n// To compile your new font into vexflow.js, take a look at src/fonts/load_all.ts\n// You can export a font module which can be dynamically loaded by vexflow-core.js (see: Gruntfile.js).\n// ADD_MUSIC_FONT\n// To add a new music engraving font XXX, make a copy of this file and name it load_xxx.ts.\n// Then you will need to generate xxx_glyphs.ts and xxx_metrics.ts.\n// xxx_glyphs.ts is created by tools/fonts/fontgen_smufl.js\n// xxx_metrics.ts is created by hand. You could copy bravura_metrics.ts and modify/remove/add entries where necessary.\nimport { Font } from '../font';\nimport { BravuraFont } from './bravura_glyphs';\nimport { BravuraMetrics } from './bravura_metrics';\nexport function loadBravura() {\n Font.load('Bravura', BravuraFont, BravuraMetrics);\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from '../font';\nimport { CustomFont } from './custom_glyphs';\nimport { CustomMetrics } from './custom_metrics';\nexport function loadCustom() {\n Font.load('Custom', CustomFont, CustomMetrics);\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// vexflow-bravura.ts is the entry point for vexflow-bravura.js.\n// This version bundles the Bravura music engraving font.\nimport { Vex } from '../src/vex';\nimport { Flow } from '../src/flow';\nimport { loadBravura } from '../src/fonts/load_bravura';\nimport { loadCustom } from '../src/fonts/load_custom';\nimport { loadTextFonts } from '../src/fonts/textfonts';\nloadBravura();\nloadCustom();\nFlow.setMusicFont('Bravura', 'Custom');\nloadTextFonts();\nexport * from '../src/index';\nexport default Vex;\n// ADD_MUSIC_FONT\n// To make a vexflow-xxx.js build that ONLY loads your new music font, copy this file and name it vexflow-xxx.ts.\n// Replace these lines:\n// import { loadXXX } from '../src/fonts/load_xxx';\n// loadXXX();\n// Flow.setMusicFont('XXX', 'Custom');\n// Feel free to remove references to Custom if you are not using those glyphs.\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from '../font';\nimport { TextFormatter } from '../textformatter';\nimport { PetalumaScriptFont } from './petalumascript_glyphs';\nimport { RobotoSlabFont } from './robotoslab_glyphs';\nexport function loadTextFonts() {\n // Roboto Slab\n {\n const fontData = RobotoSlabFont;\n const { fontFamily, resolution, glyphs } = fontData;\n Font.load(fontFamily, fontData);\n // Previously we used 'H', but it isn't actually the tallest or the widest.\n // Interestingly, the lowercase 'b' is the tallest glyph.\n const maxSizeGlyph = 'b';\n TextFormatter.registerInfo({\n family: fontFamily,\n resolution,\n glyphs,\n maxSizeGlyph,\n monospaced: false,\n bold: false,\n italic: false,\n superscriptOffset: 0.66,\n subscriptOffset: 0.66,\n serifs: true,\n description: 'Text font to pair with the Bravura / Gonville music fonts.',\n });\n }\n // PetalumaScript\n {\n const fontData = PetalumaScriptFont;\n const { fontFamily, resolution, glyphs } = fontData;\n Font.load(fontFamily, fontData);\n // M is wider, but H is taller. :-)\n // Lowercase b is also taller in this font.\n const maxSizeGlyph = 'b';\n TextFormatter.registerInfo({\n family: fontFamily,\n resolution,\n glyphs,\n maxSizeGlyph,\n monospaced: false,\n bold: false,\n italic: false,\n superscriptOffset: 0.66,\n subscriptOffset: 0.66,\n serifs: false,\n description: 'Text font to pair with the Petaluma music font.',\n });\n }\n}\n"],"names":["root","factory","exports","module","define","amd","window","globalThis","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","g","Function","e","obj","prop","prototype","hasOwnProperty","call","isCategory","category","checkAncestors","constructorFcn","constructor","CATEGORY","getPrototypeOf","isBarline","Category","Barline","isGraceNote","GraceNote","isNote","Note","isStaveNote","StaveNote","isStemmableNote","StemmableNote","isTabNote","TabNote","RuntimeError","Error","code","message","super","globalObject","self","defined","x","undefined","log","block","args","line","Array","slice","join","console","warn","err","stack","midLine","a","b","mid_line","n","parseInt","prefix","text","normalizeAngle","Math","PI","Fraction","numerator","denominator","set","static","Number","isNaN","t","GCD","length","LCM","shift","LCMM","value","simplify","u","d","gcd","add","param1","param2","otherNumerator","otherDenominator","getNumeratorAndDenominator","lcm","subtract","multiply","divide","equals","compare","__staticFractionA","copy","__staticFractionB","greaterThan","greaterThanEquals","lessThan","lessThanEquals","clone","other","quotient","floor","remainder","makeAbs","abs","toString","toSimplifiedString","__staticFractionTmp","toMixedString","s","q","f","parse","str","i","split","BoundingBox","y","w","h","that","getX","getY","getW","getH","setX","setY","setW","setH","move","mergeWith","boundingBox","new_x","new_y","new_w","max","new_h","BoundingBoxComputation","x1","NaN","y1","x2","y2","getX1","getY1","width","height","addPoint","addX","addY","addQuadraticCurve","p0x","p0y","p1x","p1y","p2x","p2y","p01x","denom","it","p01y","addBezierCurve","p3x","p3y","p0","p1","p2","p3","pow","c","b2ac","t1","sqrt","t2","FontWeight","FontStyle","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","rejected","result","done","then","apply","fontParser","Fonts","Font","fontName","name","fontSize","SIZE","_a","scaleToPxFrom","pt","parseFloat","unit","replace","toLowerCase","size","weight","style","fromCSSString","family","SANS_SERIF","NORMAL","cssFontShorthand","document","createElement","font","fontFamily","fontWeight","fontStyle","fontInfo","st","trim","wt","sz","scaleFactor","parsedWeight","ITALIC","woffURL","includeWoff2","fontFace","FontFace","load","fonts","host","WEB_FONT_HOST","files","WEB_FONT_FILES","fontPath","loadWebFont","data","metrics","setData","setMetrics","getName","getData","getMetrics","hasData","getResolution","resolution","getGlyphs","glyphs","lookupMetric","defaultValue","keyParts","currObj","SERIF","px","em","in","mm","cm","PetalumaScript","Index","id","type","class","Registry","index","defaultRegistry","registry","clear","setIndexValue","elem","updateIndex","oldValue","getElementById","getAttribute","register","setAttribute","onRegister","_b","getElementsByAttribute","attribute","index_attr","index_attr_val","keys","map","k","getElementsByType","getElementsByClass","className","onUpdate","info","includes","Element","attrs","newID","el","getCategory","classes","rendered","getDefaultRegistry","ID","setStyle","getStyle","applyStyle","context","save","shadowColor","setShadowColor","shadowBlur","setShadowBlur","fillStyle","setFillStyle","strokeStyle","setStrokeStyle","lineWidth","setLineWidth","restoreStyle","restore","drawWithStyle","checkContext","draw","hasClass","addClass","removeClass","isRendered","setRendered","getAttributes","oldID","getBoundingBox","getContext","setContext","setFont","toCSSString","textFont","defaultTextFont","TEXT_FONT","fontIsObject","fontIsString","fontIsUndefined","sizeWeightStyleAreUndefined","assign","validate","getFont","resetFont","setFontSize","getFontSize","fontSizeInPoints","convertSizeToPointValue","fontSizeInPixels","convertSizeToPixelValue","OutlineCode","ModifierPosition","GlyphCacheEntry","fontStack","point","Glyph","loadMetrics","bbox","getOutlineBoundingBox","outline","scale","x_shift","y_shift","lookupFontMetric","GlyphOutline","originX","originY","nextX","nextY","parts","push","MOVE","LINE","QUADRATIC","BEZIER","options","topGlyphs","botGlyphs","originShift","setOptions","reset","glyph","lookupGlyph","x_min","x_max","ha","cached_outline","ctx","x_pos","y_pos","cache","lookup","customScale","renderOutline","go","beginPath","moveTo","lineTo","quadraticCurveTo","bezierCurveTo","fill","bboxComp","penX","penY","getCode","setPoint","setStave","stave","setXShift","setYShift","checkMetrics","metricsScale","setOriginX","xShift","setOriginY","yShift","setOrigin","render","xPos","yPos","checkStave","renderToStave","getYForGlyphs","Map","entries","CURRENT_CACHE_KEY","entry","MUSIC_FONT_STACK","Modifier","text_line","position","Position","LEFT","spacingFromNextModifier","PositionString","center","CENTER","above","ABOVE","below","BELOW","left","right","RIGHT","getWidth","setWidth","getNote","note","checkAttachedNote","setNote","getIndex","checkIndex","setIndex","getModifierContext","modifierContext","checkModifierContext","setModifierContext","getPosition","setPosition","setTextLine","setSpacingFromNextModifier","getSpacingFromNextModifier","getXShift","alignSubNotesWithNote","subNotes","tickContext","getTickContext","getStave","subNoteXOffset","modLeftPx","modRightPx","forEach","subNote","subTickContext","setXOffset","Music","NUM_TONES","canonical_notes","roots","root_values","root_indices","diatonic_intervals","diatonic_accidentals","unison","accidental","m2","M2","m3","M3","p4","dim5","p5","m6","M6","b7","M7","octave","intervals","b2","min2","S","H","maj2","T","W","b3","min3","maj3","b5","aug4","b6","aug5","maj6","m7","min7","dom7","maj7","scales","major","minor","ionian","dorian","phyrgian","lydian","mixolydian","aeolian","locrian","scaleTypes","M","m","accidentals","noteValues","root_index","int_val","cn","cb","cbb","dn","db","dbb","en","eb","ebb","fn","fb","fbb","gn","gb","gbb","an","ab","abb","bn","bb","bbb","isValidNoteValue","isValidIntervalValue","interval","getNoteParts","noteString","match","exec","getKeyParts","keyString","getNoteValue","getIntervalValue","intervalString","getCanonicalNoteName","noteValue","getCanonicalIntervalName","intervalValue","getRelativeNoteValue","direction","sum","getRelativeNoteName","rootValue","multiplier","reverse_interval","relativeNoteName","getScaleTones","tones","nextNote","getIntervalBetween","note1","note2","difference","createScaleMap","keySignature","keySigParts","scaleName","keySigString","noteLocation","scaleMap","rootName","noteName","RESOLUTION","durations","durationAliases","keySignatures","C","num","Am","F","acc","Dm","Bb","Gm","Eb","Cm","Ab","Fm","Db","Bbm","Gb","Ebm","Cb","Abm","G","Em","D","Bm","A","E","B","clefs","treble","line_shift","bass","tenor","alto","soprano","percussion","subbass","french","notesInfo","CN","CB","CBB","DN","DB","DBB","EN","EB","EBB","FN","FB","FBB","GN","GB","GBB","AN","AB","ABB","BN","BB","BBB","R","rest","X","shift_right","customNoteHeads","D0","D1","D2","D3","T0","T1","T2","T3","X0","X1","X2","X3","S1","S2","R1","R2","parenRightPaddingAdjustment","bs","bss","bbs","ashs","afhf","accSagittal5v7KleismaUp","accSagittal5v7KleismaDown","accSagittal5CommaUp","accSagittal5CommaDown","accSagittal7CommaUp","accSagittal7CommaDown","accSagittal25SmallDiesisUp","accSagittal25SmallDiesisDown","accSagittal35MediumDiesisUp","accSagittal35MediumDiesisDown","accSagittal11MediumDiesisUp","accSagittal11MediumDiesisDown","accSagittal11LargeDiesisUp","accSagittal11LargeDiesisDown","accSagittal35LargeDiesisUp","accSagittal35LargeDiesisDown","accSagittalSharp25SDown","accSagittalFlat25SUp","accSagittalSharp7CDown","accSagittalFlat7CUp","accSagittalSharp5CDown","accSagittalFlat5CUp","accSagittalSharp5v7kDown","accSagittalFlat5v7kUp","accSagittalSharp","accSagittalFlat","accSagittalSharp5v7kUp","accSagittalFlat5v7kDown","accSagittalSharp5CUp","accSagittalFlat5CDown","accSagittalSharp7CUp","accSagittalFlat7CDown","accSagittalSharp25SUp","accSagittalFlat25SDown","accSagittalSharp35MUp","accSagittalFlat35MDown","accSagittalSharp11MUp","accSagittalFlat11MDown","accSagittalSharp11LUp","accSagittalFlat11LDown","accSagittalSharp35LUp","accSagittalFlat35LDown","accSagittalDoubleSharp25SDown","accSagittalDoubleFlat25SUp","accSagittalDoubleSharp7CDown","accSagittalDoubleFlat7CUp","accSagittalDoubleSharp5CDown","accSagittalDoubleFlat5CUp","accSagittalDoubleSharp5v7kDown","accSagittalDoubleFlat5v7kUp","accSagittalDoubleSharp","accSagittalDoubleFlat","accSagittal7v11KleismaUp","accSagittal7v11KleismaDown","accSagittal17CommaUp","accSagittal17CommaDown","accSagittal55CommaUp","accSagittal55CommaDown","accSagittal7v11CommaUp","accSagittal7v11CommaDown","accSagittal5v11SmallDiesisUp","accSagittal5v11SmallDiesisDown","accSagittalSharp5v11SDown","accSagittalFlat5v11SUp","accSagittalSharp7v11CDown","accSagittalFlat7v11CUp","accSagittalSharp55CDown","accSagittalFlat55CUp","accSagittalSharp17CDown","accSagittalFlat17CUp","accSagittalSharp7v11kDown","accSagittalFlat7v11kUp","accSagittalSharp7v11kUp","accSagittalFlat7v11kDown","accSagittalSharp17CUp","accSagittalFlat17CDown","accSagittalSharp55CUp","accSagittalFlat55CDown","accSagittalSharp7v11CUp","accSagittalFlat7v11CDown","accSagittalSharp5v11SUp","accSagittalFlat5v11SDown","accSagittalDoubleSharp5v11SDown","accSagittalDoubleFlat5v11SUp","accSagittalDoubleSharp7v11CDown","accSagittalDoubleFlat7v11CUp","accSagittalDoubleSharp55CDown","accSagittalDoubleFlat55CUp","accSagittalDoubleSharp17CDown","accSagittalDoubleFlat17CUp","accSagittalDoubleSharp7v11kDown","accSagittalDoubleFlat7v11kUp","accSagittal23CommaUp","accSagittal23CommaDown","accSagittal5v19CommaUp","accSagittal5v19CommaDown","accSagittal5v23SmallDiesisUp","accSagittal5v23SmallDiesisDown","accSagittalSharp5v23SDown","accSagittalFlat5v23SUp","accSagittalSharp5v19CDown","accSagittalFlat5v19CUp","accSagittalSharp23CDown","accSagittalFlat23CUp","accSagittalSharp23CUp","accSagittalFlat23CDown","accSagittalSharp5v19CUp","accSagittalFlat5v19CDown","accSagittalSharp5v23SUp","accSagittalFlat5v23SDown","accSagittalDoubleSharp5v23SDown","accSagittalDoubleFlat5v23SUp","accSagittalDoubleSharp5v19CDown","accSagittalDoubleFlat5v19CUp","accSagittalDoubleSharp23CDown","accSagittalDoubleFlat23CUp","accSagittal19SchismaUp","accSagittal19SchismaDown","accSagittal17KleismaUp","accSagittal17KleismaDown","accSagittal143CommaUp","accSagittal143CommaDown","accSagittal11v49CommaUp","accSagittal11v49CommaDown","accSagittal19CommaUp","accSagittal19CommaDown","accSagittal7v19CommaUp","accSagittal7v19CommaDown","accSagittal49SmallDiesisUp","accSagittal49SmallDiesisDown","accSagittal23SmallDiesisUp","accSagittal23SmallDiesisDown","accSagittal5v13MediumDiesisUp","accSagittal5v13MediumDiesisDown","accSagittal11v19MediumDiesisUp","accSagittal11v19MediumDiesisDown","accSagittal49MediumDiesisUp","accSagittal49MediumDiesisDown","accSagittal5v49MediumDiesisUp","accSagittal5v49MediumDiesisDown","accSagittal49LargeDiesisUp","accSagittal49LargeDiesisDown","accSagittal11v19LargeDiesisUp","accSagittal11v19LargeDiesisDown","accSagittal5v13LargeDiesisUp","accSagittal5v13LargeDiesisDown","accSagittalSharp23SDown","accSagittalFlat23SUp","accSagittalSharp49SDown","accSagittalFlat49SUp","accSagittalSharp7v19CDown","accSagittalFlat7v19CUp","accSagittalSharp19CDown","accSagittalFlat19CUp","accSagittalSharp11v49CDown","accSagittalFlat11v49CUp","accSagittalSharp143CDown","accSagittalFlat143CUp","accSagittalSharp17kDown","accSagittalFlat17kUp","accSagittalSharp19sDown","accSagittalFlat19sUp","accSagittalSharp19sUp","accSagittalFlat19sDown","accSagittalSharp17kUp","accSagittalFlat17kDown","accSagittalSharp143CUp","accSagittalFlat143CDown","accSagittalSharp11v49CUp","accSagittalFlat11v49CDown","accSagittalSharp19CUp","accSagittalFlat19CDown","accSagittalSharp7v19CUp","accSagittalFlat7v19CDown","accSagittalSharp49SUp","accSagittalFlat49SDown","accSagittalSharp23SUp","accSagittalFlat23SDown","accSagittalSharp5v13MUp","accSagittalFlat5v13MDown","accSagittalSharp11v19MUp","accSagittalFlat11v19MDown","accSagittalSharp49MUp","accSagittalFlat49MDown","accSagittalSharp5v49MUp","accSagittalFlat5v49MDown","accSagittalSharp49LUp","accSagittalFlat49LDown","accSagittalSharp11v19LUp","accSagittalFlat11v19LDown","accSagittalSharp5v13LUp","accSagittalFlat5v13LDown","accSagittalDoubleSharp23SDown","accSagittalDoubleFlat23SUp","accSagittalDoubleSharp49SDown","accSagittalDoubleFlat49SUp","accSagittalDoubleSharp7v19CDown","accSagittalDoubleFlat7v19CUp","accSagittalDoubleSharp19CDown","accSagittalDoubleFlat19CUp","accSagittalDoubleSharp11v49CDown","accSagittalDoubleFlat11v49CUp","accSagittalDoubleSharp143CDown","accSagittalDoubleFlat143CUp","accSagittalDoubleSharp17kDown","accSagittalDoubleFlat17kUp","accSagittalDoubleSharp19sDown","accSagittalDoubleFlat19sUp","accSagittalShaftUp","accSagittalShaftDown","accSagittalAcute","accSagittalGrave","accSagittal1MinaUp","accSagittal1MinaDown","accSagittal2MinasUp","accSagittal2MinasDown","accSagittal1TinaUp","accSagittal1TinaDown","accSagittal2TinasUp","accSagittal2TinasDown","accSagittal3TinasUp","accSagittal3TinasDown","accSagittal4TinasUp","accSagittal4TinasDown","accSagittal5TinasUp","accSagittal5TinasDown","accSagittal6TinasUp","accSagittal6TinasDown","accSagittal7TinasUp","accSagittal7TinasDown","accSagittal8TinasUp","accSagittal8TinasDown","accSagittal9TinasUp","accSagittal9TinasDown","accSagittalFractionalTinaUp","accSagittalFractionalTinaDown","accidentalNarrowReversedFlat","accidentalNarrowReversedFlatAndFlat","accidentalWilsonPlus","accidentalWilsonMinus","articulations","between_lines","av","aboveCode","belowCode","ao","ah","am","ornaments","mordent","mordent_inverted","turn","turn_inverted","tr","upprall","downprall","prallup","pralldown","upmordent","downmordent","lineprall","prallprall","scoop","doit","fall","doitLong","fallLong","bend","plungerClosed","plungerOpen","flip","jazzTurn","smear","Tables","clef","keyOctaveGlyph","params","octave_shift","pieces","toUpperCase","clefProperties","stroke","int_value","customNoteHeadProps","glyphName","displaced","integer","fret","shift_y","glyphMetrics","TABLATURE_FONT_SCALE","textWidth","artic","spec","keySpec","notes","acc_list","duration","durationNumber","sanitizeDuration","durationToFraction","ticks","durationCodes","glyphTypeProperties","customGlyphTypeProperties","code_head","common","NOTATION_FONT_SCALE","STEM_WIDTH","STEM_HEIGHT","STAVE_LINE_THICKNESS","SLASH_NOTEHEAD_WIDTH","STAVE_LINE_DISTANCE","TEXT_HEIGHT_OFFSET_HACK","accidentalMap","accidentalColumnsTable","second_on_bottom","spaced_out_tetrachord","spaced_out_pentachord","very_spaced_out_pentachord","spaced_out_hexachord","very_spaced_out_hexachord","unicode","sharp","String","fromCharCode","flat","natural","triangle","degrees","circle","validTypes","r","TIME4_4","num_beats","beat_value","stem","stem_offset","flag","dot_shiftY","line_above","line_below","beam_count","stem_beam_extension","code_flag_upstem","code_flag_downstem","L","Accidental","DEBUG","render_options","font_scale","parenLeftPadding","parenRightPadding","accidentalCodes","cautionary","state","musicFont","currentMusicFont","noteheadAccidentalPadding","leftShift","left_shift","accidentalSpacing","additionalPadding","accList","prevNote","shiftL","props","getKeyProps","getLeftDisplacedHeadPx","lineSpace","getSpacingBetweenLines","getYForLine","accLine","round","sort","lineList","previousLine","accShift","flatLine","dblSharpLine","numAcc","column","totalColumns","noFurtherConflicts","groupStart","groupEnd","checkCollision","getGroupLine","getGroupLines","indexes","lineDifference","indexA","indexB","item","notColliding","indexPairs","every","line1","line2","groupLength","groupMember","endCase","patternLength","collisionDetected","columnWidths","columnXOffsets","totalShift","accCount","lastAccOnLine","clearance","clearanceRequired","collision","voices","tickPositions","tickNoteMap","voice","tickPosition","getTickables","shouldIgnoreTicks","notesAtPosition","getTicks","music","scaleMapKey","tickPos","tickables","modifiedPitches","processNote","isRest","staveNote","keyIndex","accidentalString","pitch","sameAccidental","previouslyModified","indexOf","getModifiers","modifier","splice","addModifier","GraceNoteGroup","getGraceNotes","fontScale","parenLeft","parenRight","parenWidth","setAsCautionary","start","getModifierStartXY","accX","accY","Stem","stem_up_y_offset","stem_down_y_offset","stem_up_y_base_offset","stem_down_y_base_offset","x_begin","x_end","y_top","y_bottom","stem_extension","stem_direction","hide","isStemlet","stemletHeight","renderHeightAdjustment","UP","DOWN","WIDTH","HEIGHT","setNoteHeadXBounds","setDirection","setExtension","ext","getExtension","setYBounds","getHeight","y_offset","getExtents","isStemUp","ys","stemHeight","innerMostNoteheadY","min","outerMostNoteheadY","topY","baseY","setVisibility","isVisible","setStemlet","adjustHeightForFlag","adjustHeightForBeam","stem_x","stem_y","y_base_offset","stemletYOffset","TextFormatter","textWidthCache","formatterInfo","serifs","monospaced","italic","bold","superscriptOffset","subscriptOffset","maxSizeGlyph","cacheKey","updateParams","registeredFonts","requestedFont","candidates","requestedFamilies","requestedFamily","startsWith","formatter","values","isBold","isItalic","perfectMatch","find","partialMatch","fontSizeInPt","overwrite","updateCacheKey","BOLD","getGlyphMetrics","character","maxHeight","getWidthForCharacterInEm","advanceWidth","getWidthForTextInEm","cachedWidths","getWidthForTextInPx","AnnotationHorizontalJustify","AnnotationVerticalJustify","Annotation","horizontalJustification","verticalJustification","TOP","annotations","annotation","textFormatter","create","verticalSpaceNeeded","stemDirection","hasStem","getStemDirection","lines","draw_stem","getStem","getNoteType","getNumLines","VerticalJustify","noteLine","getLineNumber","leastString","top_text_line","BOTTOM","greatestString","curBottom","right_shift","setVerticalJustification","just","VerticalJustifyString","getJustification","setJustification","HorizontalJustifyString","classString","openGroup","text_width","measureText","text_height","getStemX","stem_ext","spacing","has_stem","checkStem","getYs","reduce","yt","getYForTopText","getYForBottomText","getTopLineTopY","extents","getStemExtents","fillText","closeGroup","HorizontalJustify","centerStem","CENTER_STEM","top","bottom","roundToNearestHalf","mathFn","isWithinLines","getRoundingFunction","ceil","isStaveOrGraceNote","Articulation","getIncrement","articulation","increment","curTop","maxWidth","articWidth","builder","articNameToCode","staccato","tenuto","accent","articString","getFactory","articulationCodes","textLine","canSitBetweenLines","staffSpace","isTab","shouldSitOutsideStaff","initialOffset","isOnStemTip","getInitialOffset","padding","stemTipY","stemBaseY","getTopY","INITIAL_OFFSET","getBottomY","offsetDirection","articLine","snappedLine","snapLineToStaff","RenderContext","setRawFont","Tickable","_preFormatted","_postFormatted","intrinsicTicks","tickMultiplier","modifiers","tupletStack","align_center","center_x_shift","ignore_ticks","formatterMetrics","freedom","iterations","space","used","mean","deviation","setIgnoreTicks","checkTickContext","getFormatterMetrics","getCenterXShift","isCenterAligned","setCenterXShift","centerXShift","setCenterAlignment","getVoice","setVoice","getTuplet","tuplet","getTupletStack","resetTuplet","noteCount","notesOccupied","getNoteCount","getNotesOccupied","applyTickMultiplier","pop","setTuplet","addToModifierContext","mc","addMember","setTickContext","tc","preFormat","preFormatted","postFormat","postFormatted","getIntrinsicTicks","setIntrinsicTicks","getTickMultiplier","setDuration","getAbsoluteX","noteStruct","parsedNoteStruct","parseNoteStruct","JSON","stringify","keyProps","noteType","customTypes","duration_override","getGlyphProps","customGlyphs","playNote","leftDisplacedHeadPx","rightDisplacedHeadPx","annotation_spacing","glyph_font_scale","stroke_px","xStart","xPre1","xAbs","xPost1","notePx","xPost2","xEnd","xFreedomRight","xWidth","color","yy","arc","closePath","drawDot","spaceDeviation","durationString","dots","durationProps","parseDuration","durationToTicks","currentTicks","getPlayNote","setPlayNote","addStroke","setYs","getRightDisplacedHeadPx","setLeftDisplacedHeadPx","setRightDisplacedHeadPx","isTopNote","getLineForRest","getGlyph","getGlyphWidth","getDuration","isDotted","getModifiersByType","getBeam","beam","checkBeam","hasBeam","setBeam","signature","getMembers","getRightParenthesisPx","getLeftParenthesisPx","getFirstDotPx","getState","glyphWidth","glyphPx","getNoteStartX","getTieRightX","tieStartX","getTieLeftX","tieEndX","getKeys","StaveModifierPosition","BarlineType","ChordSymbolHorizontalJustify","ChordSymbolVerticalJustify","SymbolTypes","SymbolModifiers","VoiceMode","StaveModifier","placeGlyphOnLine","customShift","getPadding","setPadding","setLayoutMetrics","layoutMetrics","getLayoutMetrics","thickness","TYPE","widths","SINGLE","DOUBLE","END","REPEAT_BEGIN","REPEAT_END","REPEAT_BOTH","NONE","paddings","layoutMetricsMap","xMin","xMax","paddingLeft","paddingRight","BEGIN","setType","typeString","single","double","end","repeatBegin","repeatEnd","repeatBoth","none","getType","drawVerticalBar","drawVerticalEndBar","drawRepeatBar","double_bar","staveCtx","botY","getBottomLineBottomY","fillRect","begin","dot_x","dot_radius","dot_y","BarNote","barline","Bend","release","phrase","tap","line_width","line_style","bend_width","release_width","updateWidth","bends","last_width","stringPos","setTap","getText","getTextHeight","totalWidth","additional_width","draw_width","lowestY","bend_height","annotation_y","renderBend","cp_x","cp_y","renderRelease","renderArrowHead","yBase","renderText","render_x","last_bend","last_bend_draw_width","last_drawn_width","ChordSymbol","symbolBlocks","horizontal","vertical","useKerning","reportWidth","superSubRatio","global","NO_TEXT_FORMAT","val","noFormat","glyphCode","engravingFontResolution","spacingBetweenBlocks","metric","getMetricForGlyph","yOffset","leftSideBearing","kerningOffset","chordSymbol","lowerKerningText","upperKerningText","symbolModifier","SUPERSCRIPT","SUBSCRIPT","symbols","nonSuperWidth","reportedWidths","symbol","fontAdj","scaleSize","glyphAdj","lineSpaces","vAlign","j","sup","isSuperscript","sub","isSubscript","superSubScale","adj","symbolType","GLYPH","superSubFontSize","getWidthForGlyph","getYShiftForGlyph","getXShiftForGlyph","TEXT","getYOffsetForText","over","prev","setEnableKerning","updateKerningAdjustments","updateOverBarAdjustments","getVertical","getReportWidth","setReportWidth","barIndex","findIndex","xoff","yoff","symIndex","accum","getKerningAdjustment","currSymbol","prevSymbol","adjustment","preKernUpper","preKernLower","some","xx","kerningOffsetPixels","getSymbolBlock","_c","symbolBlock","glyphArgs","glyphPoints","addSymbolBlock","parameters","addText","addTextSuperscript","addTextSubscript","addGlyphSuperscript","addGlyph","addGlyphOrText","char","addLine","setVertical","vj","setHorizontal","hj","getHorizontal","yMax","y_max","stem_base","isSuper","isSub","curY","smallerFontSize","diminished","dim","halfDiminished","augmented","majorSeventh","leftParen","rightParen","leftBracket","rightBracket","leftParenTall","rightParenTall","symbolTypes","symbolModifiers","Dot","radius","all","dot","setDotShiftY","dot_list","max_shift_map","note_id","dot_shift","x_width","last_line","last_note","prev_dotted_space","half_shiftY","forceFlagRight","FretHandFinger","finger","x_offset","nums","nums_list","prev_note","shiftLeft","shiftRight","pos","textHeight","shiftR","numShiftL","numShiftR","xWidthL","xWidthR","lastLine","lastNote","num_shift","numWidth","fingerings","fingeringString","number","Fingering","fingering","setFretHandFinger","getFretHandFinger","setOffsetX","setOffsetY","StaveTie","setNotes","cp1","cp2","text_shift_x","first_x_shift","last_x_shift","tie_spacing","first_note","first_indices","last_indices","isPartial","renderTie","first_ys","last_ys","last_x_px","first_x_px","first_y_px","last_y_px","top_cp_y","bottom_cp_y","center_x","getTieStartX","getTieEndX","TabTie","Voice","time","voiceTime","resolutionMultiplier","mode","STRICT","ticksUsed","largestTickWidth","softmaxFactor","totalTicks","smallestTickCount","Mode","getTotalTicks","getTicksUsed","getLargestTickWidth","getSmallestTickCount","getMode","setMode","getResolutionMultiplier","getActualResolution","tickable","setStrict","strict","SOFT","isComplete","FULL","setSoftmaxFactor","factor","reCalculateExpTicksUsed","expTicksUsed","softmax","tickValue","v","exp","addTickable","addTickables","grace_notes","show_slur","slur","slur_y_shift","beams","gracenote_groups","group_list","gracenote_group","is_stavenote","formatWidth","group_shift","Formatter","joinVoices","format","getMinTotalWidth","beamNotes","Beam","beam_width","partial_beam_length","graceNote","TieClass","NoteSubGroup","groups","group","TickContext","tickID","currentTick","maxTicks","maxTickable","minTicks","minTickable","xBase","xOffset","tickablesByVoice","totalLeftPx","totalRightPx","tContexts","tContext","contexts","getTickID","getXBase","setXBase","getXOffset","getMaxTicks","getMinTicks","getMaxTickable","getMinTickable","getTickableForVoice","voiceIndex","getTickablesByVoice","getCenterAlignedTickables","filter","getCurrentTick","setCurrentTick","tick","Ornament","delayed","accidentalLowerPadding","accidentalUpperPadding","ornament","ornamentCodes","adjustForStemDirection","reportedWidth","stemUpYOffset","ornamentAlignWithNoteHead","ornamentNoteTransition","ornamentRelease","ornamentAttack","ornamentArticulation","jazzOrnaments","setDelayed","setUpperAccidental","accid","accidentalUpper","setLowerAccidental","accidentalLower","stemDir","stemExtents","isPlacedOnNoteheadSide","lineSpacing","glyphYBetweenLines","glyphX","glyphY","delayXShift","startX","nextContext","getNextContext","Parenthesis","parentheses","x_widthL","x_widthR","parenthesis","renderGlyph","NoteHead","custom_glyph","stem_up_x_offset","stem_down_x_offset","note_type","glyph_code","custom_glyph_code","slashed","isDisplaced","getLine","setLine","displacementStemAdjustment","fontShift","displacedFontShift","half_spacing","min_y","getYForNote","head_x","categorySuffix","staveSpace","durationToNumber","breve_lines","drawSlashNoteHead","setStem","buildStem","buildFlag","hasFlag","flagCode","getBaseCustomNoteHeadGlyph","getStemLength","getStemExtension","getBeamCount","getStemMinimumLength","setStemDirection","offsets","offsetYBaseStemUp","offsetYTopStemUp","offsetYBaseStemDown","offsetYTopStemDown","getCenterGlyphX","stem_extension_override","setStemLength","drawStem","stemOptions","shiftRestVertical","dir","delta","maxLine","minLine","setKeyLine","getKeyLine","ledgerLineStyle","use_default_head_x","_noteHeads","LEDGER_LINE_OFFSET","calculateKeyProps","auto_stem","autoStem","STEM_UP","STEM_DOWN","minNoteheadPadding","notesList","minL","stemMax","stemMin","maxL","isrest","voice_shift","getVoiceShiftWidth","is_displaced","noteU","noteM","noteL","voiceXShift","centerRest","noteHeadStyles","noteHead","buildNoteHeads","noteHeadStyle","head","calcNoteDisplacements","lineDiff","noteProps","notehead","calculateOptimalStemDirection","keyProperties","minY","maxY","halfLineSpacing","frac","resultLine","thisLine","isChord","getNoteHeadBounds","setNoteDisplaced","getRightShift","restLine","isInnerNoteIndex","setStemStyle","getStemStyle","setLedgerLineStyle","getLedgerLineStyle","setFlagStyle","flagStyle","getFlagStyle","setKeyStyle","noteHeadPadding","shouldDrawFlag","nonDisplacedX","displacedX","highestDisplacedLine","lowestDisplacedLine","yTop","Infinity","yBottom","highestLine","lowestLine","highestNonDisplacedLine","lowestNonDisplacedLine","displaced_x","non_displaced_x","highest_line","lowest_line","highest_displaced_line","lowest_displaced_line","highest_non_displaced_line","lowest_non_displaced_line","getNoteHeadBeginX","getNoteHeadEndX","noteHeads","note_heads","drawLedgerLines","doubleWidth","min_x","drawLedgerLine","normal","ledgerWidth","getDefaultLedgerLineStyle","drawModifiers","noteheadStyle","hasNoBeam","drawFlag","noteStemHeight","flagX","extension","flagY","pointerBBox","drawNoteHeads","super_stem_extension","mid_line_distance","lines_over_octave_from_mid_line","spacing_between_lines","xBegin","shouldRenderStem","stemX","isHTMLCanvas","element","HTMLCanvasElement","toDataURL","CanvasContext","context2D","canvas","CANVAS_BROWSER_SIZE_LIMIT","limit","clearRect","cls","child","setBackgroundFillStyle","blur","getTransform","setLineCap","capType","lineCap","setLineDash","dash","resize","devicePixelRatio","sanitizeCanvasDims","rect","cp1x","cp1y","cp2x","cp2y","cpx","cpy","startAngle","endAngle","counterclockwise","fontBoundingBoxAscent","fontBoundingBoxDescent","actualBoundingBoxAscent","actualBoundingBoxDescent","ATTRIBUTES_TO_IGNORE","path","SVG_NS","TWO_PI","SVGContext","backgroundFillStyle","fontCSSString","svg","appendChild","parent","pen","defaultFontAttributes","attributes","shadow_attributes","state_stack","svgElementType","createElementNS","lineDash","applyAttributes","visibleWidth","visibleHeight","setViewBox","viewBox_or_minX","viewBoxString","attrNamesToIgnore","nodeName","attrName","setAttributeNS","lastChild","removeChild","rectangle","x0","cos","y0","sin","large","sweep","getShadowStyle","sa","measureTextCache","txt","textContent","savedState","fontAttributes","RendererBackends","RendererLineEndType","Justification","VoltaType","measureImpl","getBBox","Renderer","arg0","arg1","backend","maybeElement","Backends","CANVAS","SVG","HTMLDivElement","isHTMLDiv","elementId","background","renderer","lastContext","buildContext","fromX","fromY","toX","toY","dashPattern","dx","dy","angle","atan2","idx","dashLength","nx","ny","LineEndType","StringNumber","string_number","dashed","leg","stringNumber","shift_left","glyphLine","num_shiftR","num_width","setLineEndType","setStringNumber","setLastNote","setDashed","stemPadding","verticalPadding","leftPadding","rightPadding","len","pattern","drawDashedLine","Stroke","all_voices","strokes","strokeList","string","getPositions","strokeShift","addEndNote","note_end","line_space","arrow","arrow_shift_x","arrow_y","text_y","Type","BRUSH_DOWN","BRUSH_UP","ROLL_DOWN","RASQUEDO_DOWN","ROLL_UP","RASQUEDO_UP","ARPEGGIO_DIRECTIONLESS","strokeLine","Vibrato","harsh","vibrato_width","wave_height","wave_width","wave_girth","setVibratoWidth","vibratos","vibrato","setHarsh","vx","vy","renderVibrato","opts","num_waves","ModifierContext","members","formatted","member","getLeftShift","Clef","types","tab","attachment","numLines","shiftY","KeySignature","cancelKeySpec","alterKeySpec","setKeySig","glyphFontScale","xPositions","paddingForced","convertToGlyph","nextAcc","accGlyphData","extraWidth","xPosition","cancelKey","convertToCancelAccList","cancel_accList","different_types","naturals","cancelled","concat","addToStave","convertAccLines","customLines","offset","alterKey","convertToAlterAccList","firstAccidentalType","cancelAccList","getEndClef","getClef","Repetition","symbol_type","setShiftX","setShiftY","CODA_RIGHT","drawCodaFixed","CODA_LEFT","drawSymbolText","SEGNO_LEFT","drawSignoFixed","SEGNO_RIGHT","DC","DC_AL_CODA","DC_AL_FINE","DS","DS_AL_CODA","DS_AL_FINE","FINE","TO_CODA","draw_coda","text_x","symbol_x","modifierWidth","getVerticalBarWidth","StaveSection","section","shift_x","setStaveSection","textMeasurements","StaveTempo","tempo","setTempo","bpm","stem_height","TextNote","superscript","subscript","smooth","justification","struct","GLYPHS","segno","mordent_upper","mordent_lower","p","z","coda","pedal_open","pedal_close","caesura_straight","caesura_curved","breath","StaveText","setStaveText","setText","getBottomLineY","Volta","volta","top_y","vert_height","BEGIN_END","TimeSignatureGlyph","timeSignature","topDigits","botDigits","topWidth","timeSigType","topGlyph","botWidth","botGlyph","topStartX","botStartX","start_x","topLine","bottomLine","TimeSignature","timeSpec","customPadding","validate_args","fontLineShift","parseTimeSpec","numbers","test","assertIsValidTimeSig","makeTimeSignatureGlyph","getInfo","setTimeSig","SORT_ORDER_BEG_MODIFIERS","SORT_ORDER_END_MODIFIERS","Stave","end_x","measure","endClef","vertical_bar_width","num_lines","fill_style","left_bar","right_bar","spacing_between_lines_px","space_above_staff_ln","space_below_staff_ln","top_text_position","bottom_text_position","line_config","bounds","defaultLedgerLineStyle","resetLines","addEndModifier","defaultPadding","setDefaultLedgerLineStyle","visible","setNoteStartX","begBarline","getNoteEndX","setNumLines","mod","setMeasure","getModifierXShift","setRepetitionType","setVoltaType","number_t","setSection","staveSection","headroom","getLineForY","setBegBarType","setEndBarType","setClef","clefSpec","addClef","setEndClef","setKeySignature","addKeySignature","setEndKeySignature","setTimeSignature","timeSignatures","addTimeSignature","setEndTimeSignature","addEndClef","addEndTimeSignature","addTrebleGlyph","noPosition","noCategory","sortByCategory","items","order","temp","endBarline","begModifiers","endModifiers","lastBarlineIdx","getConfigForLines","setConfigForLine","line_number","setConfigForLines","lines_configuration","drawBoldDoubleLine","topX","StaveConnector","BOLD_DOUBLE_LEFT","BOLD_DOUBLE_RIGHT","variableWidth","top_stave","bottom_stave","texts","SINGLE_RIGHT","content","THIN_DOUBLE","attachment_height","SINGLE_LEFT","BRACE","x3","y3","cpx1","cpy1","cpx2","cpy2","cpx3","cpy3","cpx4","cpy4","cpx5","cpy5","cpx6","cpy6","cpx7","cpy7","cpx8","cpy8","BRACKET","singleRight","singleLeft","brace","bracket","boldDoubleLeft","boldDoubleRight","thinDouble","sumArray","arr","createContexts","makeContext","addToContext","tickToContextMap","tickList","integerTicks","newContext","array","list","getRestLineForNextNoteGroup","currRestLine","currNoteIndex","nextRestLine","noteIndex","formatterOptions","globalSoftmax","maxIterations","justifyWidth","totalCost","durationStats","minTotalWidth","hasMinTotalWidth","tickContexts","modifierContexts","contextGaps","total","gaps","lossHistory","paddingBetween","accumulator","stavePadding","gap","toFixed","auto_beam","align_rests","applyAndGetBeams","formatToStave","tabstave","tabnotes","autobeam","notevoice","tabvoice","alignAllNotes","alignTuplets","currTickable","prevTickable","alignRests","AlignRestsToNotes","preCalculateMinTotalWidth","unalignedPadding","unalignedCtxCount","wsum","dsum","createTickContexts","contextList","contextMap","wavg","wvar","ll","wpads","davg","dvar","dpads","padmax","unalignedPad","createModifierContexts","contextArray","renderingContext","voicesParam","evaluate","firstContext","calculateIdealDistances","adjustedJustifyWidth","backTickable","prevContext","backVoices","matchingVoices","maxNegativeShiftPx","expectedDistance","thisTickable","insideLeftEdge","backMetrics","insideRightEdge","fromTickable","fromTickablePx","shiftToIdealDistances","idealDistances","centerX","spaceAccum","contextX","ideal","errorPx","negativeShiftPx","configMinPadding","configMaxPadding","targetWidth","distances","actualWidth","minDistance","mdCalc","di","calcMinDistance","paddingMax","maxX","prevTick","prevMetrics","currMetrics","leftNoteEdge","rightNote","rightMetrics","stats","count","updateStats","totalDeviation","tune","alpha","current","cost","postFormatContexts","optionsParam","TupletLocation","Tuplet","numerator_glyphs","denom_glyphs","num_notes","beats_occupied","beatsOccupiedDeprecationWarning","notes_occupied","bracketed","ratioed","setTupletLocation","location","LOCATION_TOP","resolveGlyphs","attach","LOCATION_BOTTOM","NESTING_OFFSET","detach","setBracketed","setRatioed","getNotes","getBeatsOccupied","setBeatsOccupied","beats","setNotesOccupied","unshift","getNestedTupletCount","maxTupletCount","countTuplets","minTupletCount","tupletCount","getYPosition","nested_tuplet_y_offset","topModifierOffset","modLines","modY","noteHeadOffset","stemOffset","lineCheck","nn","bottom_y","addGlyphWidth","notation_start_x","colon_x","colon_radius","calculateStemDirection","lineSum","keyProp","BEAM_LEFT","BEAM_BOTH","slope","stem_weight","memo","break_on_indices","max_slope","min_slope","slope_iterations","slope_cost","show_stemlets","stemlet_extension","flat_beams","min_flat_beam_offset","time_sig","beatTotal","beatValue","generateBeams","config","tickGroups","unprocessedNotes","currentTickGroup","noteGroups","currentGroup","nextTickGroup","nextGroup","currentGroupTotalTicks","unprocessedNote","ticksPerGroup","vf_notes","unbeamable","createGroups","sanitizedGroups","tempGroup","isFirstOrLast","breaksOnEachRest","beam_rests","breaksOnFirstOrLastRest","beam_middle_only","breakOnStemChange","maintain_stem_directions","prevDirection","isUnbeamableDuration","sanitizeGroups","findFirstNote","applyStemDirection","beamedNoteGroups","beamable","allTuplets","uniqueTuplets","noteTuplet","getTuplets","secondary_breaks","secondary_break_ticks","flat_beam_offset","beamCount","breakSecondaryAt","indices","getSlopeY","calculateSlope","firstNote","initialSlope","firstStemTipY","firstStemX","getStemSlope","minCost","MAX_VALUE","bestSlope","totalStemExtension","yShiftTemp","adjustedStemTipY","diff","idealSlope","calculateFlatSlope","extremeY","extremeBeamCount","currentExtreme","extremeTest","newOffset","getBeamYToDraw","beamY","applyStemExtensions","beamedStemTipY","preBeamExtension","beamExtension","totalBeamWidth","lookupBeamDirection","prev_tick","next_tick","lookup_duration","prev_note_gets_beam","next_note_gets_beam","note_gets_beam","getBeamLines","tick_of_duration","beam_started","beam_lines","current_beam","previous_should_break","tick_tally","should_break","next_note","beam_alone","beam_direction","last_beam","drawStems","drawBeamLines","valid_beam_durations","beamThickness","beamLines","beam_line","startBeamX","startBeamY","lastBeamX","lastBeamY","ClefNote","clef_obj","abs_x","Crescendo","extend_left","extend_right","decrescendo","setHeight","setDecrescendo","decresc","tick_context","next_context","begin_x","half_height","reverse","renderHairpin","CurvePosition","Curve","from","to","NEAR_HEAD","position_end","invert","cps","nearHead","nearTop","NEAR_TOP","renderCurve","first_x","first_y","last_x","last_y","cp0x","cp0y","cp_spacing","end_metric","Parser","flattenMatches","matchedString","results","grammar","errorPos","expect","matchFail","returnPos","matchSuccess","matchToken","token","noSpace","regexp","RegExp","success","incrementPos","expectOne","rule","maybe","allMatches","oneMatch","localPos","or","gotOne","numMatches","expectOneOrMore","more","expectZeroOrMore","ruleFunc","bind","oneOrMore","zeroOrMore","matches","run","EasyScore","EasyScoreGrammar","PIECE","PIECES","EOL","CHORDORNOTE","PARAMS","commitPiece","COMMA","DURATION","DOTS","OPTS","CHORD","SINGLENOTE","LPAREN","NOTES","RPAREN","addChord","NOTE","NOTENAME","ACCIDENTAL","OCTAVE","addSingleNote","MICROTONES","ACCIDENTALS","DOT","setNoteDots","SLASH","MAYBESLASH","TYPES","setNoteType","DURATIONS","setNoteDuration","LBRACKET","KEYVAL","KEYVALS","RBRACKET","KEY","EQUALS","VAL","addNoteOption","SVAL","DVAL","Piece","chord","Builder","commitHooks","elements","rollingDuration","resetPiece","getElements","addCommitHook","commitHook","piece","addNote","standardAccidentals","notePiece","GhostNote","buildAndAttach","setId","commaSeparatedRegex","setClass","defaults","easyScoreHook","throwOnError","parser","ERROR_MSG","parameter","GlyphNote","ignoreTicks","setGlyph","SCALE","slash","ret","staveNoteScale","getStaveNoteScale","offsetScale","slashBBox","calcBeamedNotesSlashBBox","noteHeadBounds","defaultOffsetY","slashStemOffset","slashBeamOffset","protrusions","beam_slope","scaleX","beam_angle","atan","iPointOnBeam","slash_angle","protrusion_stem_dx","protrusion_stem_dy","protrusion_beam_dx","protrusion_beam_dy","stem0X","stemY","KeySigNote","semibreve_rest","MultiMeasureRest","number_of_measures","xs","hasPaddingLeft","hasPaddingRight","hasLineThickness","hasSymbolSpacing","padding_left","padding_right","line_thickness","symbol_spacing","use_symbols","show_number","number_line","number_glyph_point","serif_thickness","semibreve_rest_glyph_scale","getXs","drawLine","spacingBetweenLines","lineThicknessHalf","serifThickness","bot","leftIndented","rightIndented","lineTop","lineBottom","drawSymbols","n4","n2","n1","get_semibreve_rest","rest_scale","rest_width","yMiddle","timeSig","drawPedalGlyph","glyph_data","PedalMarking","custom_depress_text","custom_release_text","bracket_height","text_margin_right","bracket_line_width","pedal","MIXED","setCustomText","depress","drawBracketed","prev_x","prev_y","is_pedal_depressed","next_is_same","prev_is_same","drawText","pedal_depress","pedal_release","mixed","CODES","RepeatNote","drawArrowHead","StaveLine","line_dash","rounded_end","draw_start_arrow","draw_end_arrow","arrowhead_length","arrowhead_angle","text_position_vertical","TextVerticalPosition","text_justification","TextJustification","applyLineStyle","applyFontStyle","drawArrowLine","pt1","pt2","both_arrows","distance","ratio","end_y","start_y","line_angle","angle1","angle2","top_x","bottom_x","start_position","end_position","first_index","last_index","upwards_slope","notehead_width","vertical_position","System","spaceBetweenStaves","autoWidth","noJustification","debugFormatter","formatIterations","noPadding","details","formatOptions","addConnector","connector","addStave","staveOptions","spaceAbove","spaceBelow","debugNoteMetrics","options_details","allVoices","debugNoteMetricsYs","part","lastY","plotDebugging","plotMetrics","positions","ghost","draw_dots","draw_stem_through_stave","setGhost","tabToGlyph","getStemY","stemDownLine","stemStartLine","flag_x","flag_y","flag_code","drawStemThrough","stemThrough","stemLines","unused_strings","up_stem","down_stem","line_spacing","total_lines","stem_lines","strings","containsLastString","containsFirstString","line_ys","isTopBound","isBottomBound","getPartialStemLines","strings_used","stem_through","getUnusedStringGroups","drawPositions","tab_x","render_stem","TabStave","addTabGlyph","TextBracket","TextBracketPosition","stop","show_bracket","underline_superscript","Positions","PositionsString","main_measure","main_width","main_height","super_y","super_measure","super_width","super_height","line_y","TextDynamics","sequence","glyph_font_size","total_width","letter","letter_x","current_letter","TimeSigNote","timeSigInfo","VibratoBracket","bracket_data","stop_x","Factory","renderQ","systems","staves","initRenderer","getVoices","ghostNote","textNote","barNote","clefNote","timeSigNote","keySigNote","hJustify","vJustify","kerning","numMeasures","multiMeasureRest","secondaryBeamBreaks","curve","tie","vibratoBracket","textBracket","system","StaveHairpin","hairpin","left_shift_px","right_shift_px","right_shift_ticks","left_shift_ticks","ppt","pixelsPerTick","l_shift_px","r_shift_px","hairpin_options","setRenderOptions","dis","staff_height","l_shift","r_shift","CRESC","DECRESC","TabSlide","first_fret","last_fret","SLIDE_UP","SLIDE_DOWN","slide_y","Tuning","tuningString","tuningValues","setTuning","names","standard","dagdad","dropd","standardBanjo","noteToInteger","getValueForString","stringNum","getValueForFret","fretNum","stringValue","getNoteForFret","integerToNote","Flow","BUILD","VERSION","DATE","fontNames","fontModuleOrPath","hasKeySignature","getKeySignatures","GraceTabNote","KeyManager","setKey","getKey","scaleMapByValue","originalScaleMapByValue","getAccidental","selectNote","scaleNote","modparts","change","valueNote","originalValueNote","Tremolo","y_spacing_scale","extra_stroke_scale","y_spacing","cmp","eq","newArr","last","canvasSelector","start_time","Date","getTime","BravuraFont","bracketTop","y_min","bracketBottom","barlineTick","breathMarkTick","gClef","cClef","fClef","unpitchedPercussionClef1","timeSig0","timeSig1","timeSig2","timeSig3","timeSig4","timeSig5","timeSig6","timeSig7","timeSig8","timeSig9","timeSigCommon","timeSigCutCommon","timeSigPlus","timeSigPlusSmall","timeSigMinus","timeSigParensRight","timeSigParensRightSmall","timeSigParensLeft","timeSigParensLeftSmall","noteheadDoubleWhole","noteheadWhole","noteheadHalf","noteheadBlack","noteheadXWhole","noteheadXHalf","noteheadXBlack","noteheadCircleX","noteheadTriangleUpWhole","noteheadTriangleUpHalf","noteheadTriangleUpBlack","noteheadDiamondWhole","noteheadDiamondHalf","noteheadDiamondBlack","noteheadSquareWhite","noteheadSquareBlack","noteheadParenthesis","noteheadParenthesisRight","noteheadParenthesisLeft","augmentationDot","tremolo1","flag8thUp","flag8thDown","flag16thUp","flag16thDown","flag32ndUp","flag32ndDown","flag64thUp","flag64thDown","flag128thUp","flag128thDown","accidentalFlat","accidentalNatural","accidentalSharp","accidentalDoubleSharp","accidentalDoubleFlat","accidentalParensLeft","accidentalParensRight","accidentalQuarterToneFlatStein","accidentalThreeQuarterTonesFlatZimmermann","accidentalQuarterToneSharpStein","accidentalThreeQuarterTonesSharpStein","accidentalBuyukMucennebFlat","accidentalBakiyeFlat","accidentalKomaSharp","accidentalKucukMucennebSharp","accidentalKoron","accidentalSori","articAccentAbove","articAccentBelow","articTenutoAbove","articTenutoBelow","articStaccatoAbove","articStaccatoBelow","articStaccatissimoAbove","articStaccatissimoBelow","articMarcatoAbove","articMarcatoBelow","fermataAbove","fermataBelow","breathMarkComma","breathMarkUpbow","caesura","caesuraCurved","restMaxima","restDoubleWhole","restWhole","restHalf","restQuarter","rest8th","rest16th","rest32nd","rest64th","rest128th","dynamicPiano","dynamicMezzo","dynamicForte","dynamicRinforzando","dynamicSforzando","dynamicZ","ornamentTrill","ornamentTurn","ornamentTurnSlash","ornamentMordent","ornamentShortTrill","ornamentTremblement","ornamentPrecompAppoggTrill","ornamentPrecompSlideTrillDAnglebert","ornamentPrecompSlideTrillBach","ornamentPrecompTrillSuffixDandrieu","ornamentPrecompDoubleCadenceUpperPrefix","ornamentPrecompDoubleCadenceUpperPrefixTurn","ornamentPrecompTrillLowerSuffix","brassScoop","brassDoitMedium","brassFallLipShort","brassLiftMedium","brassFallRoughMedium","brassBend","brassMuteClosed","brassMuteOpen","brassFlip","brassJazzTurn","brassSmear","stringsDownBow","stringsUpBow","stringsHarmonic","pluckedSnapPizzicatoAbove","pluckedSnapPizzicatoBelow","pluckedLeftHandPizzicato","keyboardPedalPed","keyboardPedalUp","pictChokeCymbal","wiggleArpeggiatoUp","arrowheadBlackUp","arrowheadBlackDown","arpeggiatoUp","arpeggiatoDown","repeat1Bar","repeat2Bars","repeat4Bars","repeatBarSlash","csymDiminished","csymHalfDiminished","csymAugmented","csymMajorSeventh","csymMinor","csymParensLeftTall","csymParensRightTall","csymBracketLeftTall","csymBracketRightTall","csymParensLeftVeryTall","csymParensRightVeryTall","csymDiagonalArrangementSlash","generatedOn","BravuraMetrics","smufl","endPaddingMax","endPaddingMin","unalignedNotePadding","default","small","smuflCode","shiftX","lineCount","gracenote","pedalMarking","up","down","digits","shiftLine","tupletPoint","tremolo","offsetYStemUp","offsetYStemDown","offsetXStemUp","offsetXStemDown","grace","staveRepetition","offsetY","offsetSymbol","heightAdjustmentForFlag","tabStem","staveTempo","straight","wiggly","minPadding","restQuarterStemUp","restQuarterStemDown","custom","noteheadCircleXStemUp","noteheadCircleXStemDown","noteheadDiamondHalfStemUp","noteheadDiamondBlackStemUp","noteheadDiamondWholeStemUp","noteheadXHalfStemUp","noteheadXHalfStemDown","noteheadXWholeStemUp","noteheadXWholeStemDown","noteheadSquareWhiteStemDown","noteheadSquareWhiteStemUp","noteheadSquareBlackStemUp","noteheadTriangleUpWholeStemUp","CustomFont","vexAccidentalMicrotonal2","vexAccidentalMicrotonal3","vexAccidentalMicrotonal4","vexNoteHeadRectBlack","vexNoteHeadRectWhite","CustomMetrics","PetalumaScriptFont","$","I","J","K","N","O","Q","U","V","Y","Z","_","l","RobotoSlabFont","setMusicFont","fontData","registerInfo","description","loadTextFonts"],"sourceRoot":""} \ No newline at end of file diff --git a/build/cjs/vexflow-core.js b/build/cjs/vexflow-core.js new file mode 100644 index 0000000000..aae175c440 --- /dev/null +++ b/build/cjs/vexflow-core.js @@ -0,0 +1,7 @@ +/*! + * VexFlow 4.0.1-alpha.2 2022-02-02T09:30:30.784Z 0df10df6d1fab3a99f5aa306341a31c6e686d659 + * Copyright (c) 2010 Mohit Muthanna Cheppudira + * https://www.vexflow.com https://github.com/0xfe/vexflow + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.Vex=e():t.Vex=e()}("undefined"!=typeof window?window:"undefined"!=typeof globalThis?globalThis:this,(function(){return(()=>{"use strict";var t={d:(e,i)=>{for(var s in i)t.o(i,s)&&!t.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:i[s]})}};t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),t.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var e={};function i(t,e,i=!0){if("object"!=typeof t||null===t)return!1;let s=t.constructor;if(i){for(;null!==t;){if(s=t.constructor,"CATEGORY"in s&&s.CATEGORY===e)return!0;t=Object.getPrototypeOf(t)}return!1}return"CATEGORY"in s&&s.CATEGORY===e}t.d(e,{default:()=>Ci});const s=t=>i(t,c.Barline),n=t=>i(t,c.GraceNote),a=t=>i(t,c.Note),o=t=>i(t,c.StaveNote),r=t=>i(t,c.StemmableNote),h=t=>i(t,c.TabNote);var c;!function(t){t.Accidental="Accidental",t.Annotation="Annotation",t.Articulation="Articulation",t.Barline="Barline",t.BarNote="BarNote",t.Beam="Beam",t.Bend="Bend",t.ChordSymbol="ChordSymbol",t.Clef="Clef",t.ClefNote="ClefNote",t.Crescendo="Crescendo",t.Curve="Curve",t.Dot="Dot",t.Element="Element",t.Fraction="Fraction",t.FretHandFinger="FretHandFinger",t.GhostNote="GhostNote",t.Glyph="Glyph",t.GlyphNote="GlyphNote",t.GraceNote="GraceNote",t.GraceNoteGroup="GraceNoteGroup",t.GraceTabNote="GraceTabNote",t.KeySignature="KeySignature",t.KeySigNote="KeySigNote",t.Modifier="Modifier",t.MultiMeasureRest="MultiMeasureRest",t.Note="Note",t.NoteHead="NoteHead",t.NoteSubGroup="NoteSubGroup",t.Ornament="Ornament",t.Parenthesis="Parenthesis",t.PedalMarking="PedalMarking",t.RenderContext="RenderContext",t.RepeatNote="RepeatNote",t.Repetition="Repetition",t.Stave="Stave",t.StaveConnector="StaveConnector",t.StaveHairpin="StaveHairpin",t.StaveLine="StaveLine",t.StaveModifier="StaveModifier",t.StaveNote="StaveNote",t.StaveSection="StaveSection",t.StaveTempo="StaveTempo",t.StaveText="StaveText",t.StaveTie="StaveTie",t.Stem="Stem",t.StemmableNote="StemmableNote",t.StringNumber="StringNumber",t.Stroke="Stroke",t.System="System",t.TabNote="TabNote",t.TabSlide="TabSlide",t.TabStave="TabStave",t.TabTie="TabTie",t.TextBracket="TextBracket",t.TextDynamics="TextDynamics",t.TextNote="TextNote",t.Tickable="Tickable",t.TimeSignature="TimeSignature",t.TimeSigNote="TimeSigNote",t.Tremolo="Tremolo",t.Tuplet="Tuplet",t.Vibrato="Vibrato",t.VibratoBracket="VibratoBracket",t.Voice="Voice",t.Volta="Volta"}(c||(c={}));class d extends Error{constructor(t,e=""){super("[RuntimeError] "+t+": "+e),this.code=t}}function l(){return"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==t.g?t.g:Function("return this")()}function g(t,e="undefined",i=""){if(void 0===t)throw new d(e,i);return t}function u(t,...e){if(!e)return;const i=Array.prototype.slice.call(e).join(" ");l().console.log(t+": "+i)}function p(...t){const e=t.join(" "),i=new Error;l().console.log("Warning: ",e,i.stack)}function m(t,e){let i=e+(t-e)/2;var s,n;return i%2>0&&(i=((s=10*i)%(n=5)>=n/2?parseInt(""+s/n,10)*n+n:parseInt(""+s/n,10)*n)/10),i}function f(t){return`vf-${t}`}function _(t){return(t%=2*Math.PI)<0&&(t+=2*Math.PI),t}class x{constructor(t,e){this.numerator=1,this.denominator=1,this.set(t,e)}static get CATEGORY(){return c.Fraction}static GCD(t,e){if("number"!=typeof t||Number.isNaN(t)||"number"!=typeof e||Number.isNaN(e))throw new d("BadArgument",`Invalid numbers: ${t}, ${e}`);let i;for(;0!==e;)i=e,e=t%e,t=i;return t}static LCM(t,e){return t*e/x.GCD(t,e)}static LCMM(t){return 0===t.length?0:1===t.length?t[0]:2===t.length?x.LCM(t[0],t[1]):x.LCM(t.shift(),x.LCMM(t))}set(t=1,e=1){return this.numerator=t,this.denominator=e,this}value(){return this.numerator/this.denominator}simplify(){let t=this.numerator,e=this.denominator;const i=x.GCD(t,e);return t/=i,e/=i,e<0&&(e=-e,t=-t),this.set(t,e)}add(t=0,e=1){const[i,s]=S(t,e),n=x.LCM(this.denominator,s),a=n/this.denominator,o=n/s,r=this.numerator*a+i*o;return this.set(r,n)}subtract(t=0,e=1){const[i,s]=S(t,e),n=x.LCM(this.denominator,s),a=n/this.denominator,o=n/s,r=this.numerator*a-i*o;return this.set(r,n)}multiply(t=1,e=1){const[i,s]=S(t,e);return this.set(this.numerator*i,this.denominator*s)}divide(t=1,e=1){const[i,s]=S(t,e);return this.set(this.numerator*s,this.denominator*i)}equals(t){const e=x.__staticFractionA.copy(t).simplify(),i=x.__staticFractionB.copy(this).simplify();return e.numerator===i.numerator&&e.denominator===i.denominator}greaterThan(t){const e=x.__staticFractionB.copy(this);return e.subtract(t),e.numerator>0}greaterThanEquals(t){const e=x.__staticFractionB.copy(this);return e.subtract(t),e.numerator>=0}lessThan(t){return!this.greaterThanEquals(t)}lessThanEquals(t){return!this.greaterThan(t)}clone(){return new x(this.numerator,this.denominator)}copy(t){return"number"==typeof t?this.set(t,1):this.set(t.numerator,t.denominator)}quotient(){return Math.floor(this.numerator/this.denominator)}remainder(){return this.numerator%this.denominator}makeAbs(){return this.denominator=Math.abs(this.denominator),this.numerator=Math.abs(this.numerator),this}toString(){return`${this.numerator}/${this.denominator}`}toSimplifiedString(){return x.__staticFractionTmp.copy(this).simplify().toString()}toMixedString(){let t="";const e=this.quotient(),i=x.__staticFractionTmp.copy(this);return e<0&&i.makeAbs(),0!==e?(t+=e,0!==i.numerator&&(t+=` ${i.toSimplifiedString()}`)):t=0===i.numerator?"0":i.toSimplifiedString(),t}parse(t){const e=t.split("/"),i=parseInt(e[0],10),s=e[1]?parseInt(e[1],10):1;return this.set(i,s)}}function S(t,e=1){return"number"==typeof t?[t,e]:[t.numerator,t.denominator]}x.__staticFractionA=new x,x.__staticFractionB=new x,x.__staticFractionTmp=new x;class y{constructor(t,e,i,s){this.x=t,this.y=e,this.w=i,this.h=s}static copy(t){return new y(t.x,t.y,t.w,t.h)}getX(){return this.x}getY(){return this.y}getW(){return this.w}getH(){return this.h}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setW(t){return this.w=t,this}setH(t){return this.h=t,this}move(t,e){return this.x+=t,this.y+=e,this}clone(){return y.copy(this)}mergeWith(t){const e=t,i=this.xthis.x2)&&(this.x2=t),(isNaN(this.y1)||ethis.y2)&&(this.y2=e)}addX(t){this.addPoint(t,this.y1)}addY(t){this.addPoint(this.x1,t)}addQuadraticCurve(t,e,i,s,n,a){this.addPoint(t,e),this.addPoint(n,a);const o=i-t;let r=o-(n-i);if(0!=r){const e=o/r;if(e>0&&e<1){const s=1-e;this.addX(s*s*t+2*s*e*i+e*e*n)}}const h=s-e;if(r=h-(a-s),0!=r){const t=h/r;if(t>0&&t<1){const i=1-t;this.addY(i*i*e+2*i*t*s+t*t*a)}}}addBezierCurve(t,e,i,s,n,a,o,r){const h=[t,e],c=[i,s],d=[n,a],l=[o,r];let g;this.addPoint(h[0],h[1]),this.addPoint(l[0],l[1]);const u=(t,e)=>Math.pow(1-t,3)*h[e]+3*Math.pow(1-t,2)*t*c[e]+3*(1-t)*Math.pow(t,2)*d[e]+Math.pow(t,3)*l[e];for(g=0;g<=1;g++){const t=6*h[g]-12*c[g]+6*d[g],e=-3*h[g]+9*c[g]-9*d[g]+3*l[g],i=3*c[g]-3*h[g];if(0===e){if(0===t)continue;const e=-i/t;0=600;{const e=parseInt(t,10);return isNaN(e)?"bold"===t.toLowerCase():e>=600}}return!1}static isItalic(t){return!!t&&t.toLowerCase()===w.ITALIC}static loadWebFont(t,e,i=!0){return v(this,void 0,void 0,(function*(){const s=new FontFace(t,(i?`url(${e}2) format('woff2'), `:"")+`url(${e}) format('woff')`);return yield s.load(),document.fonts.add(s),s}))}static loadWebFonts(){return v(this,void 0,void 0,(function*(){const t=k.WEB_FONT_HOST,e=k.WEB_FONT_FILES;for(const i in e){const s=e[i];k.loadWebFont(i,t+s)}}))}static loadTextFonts(){}static load(t,e,i){let s=C[t];return s||(s=new k(t),C[t]=s),e&&s.setData(e),i&&s.setMetrics(i),s}getName(){return this.name}getData(){return g(this.data,"FontError","Missing font data")}getMetrics(){return g(this.metrics,"FontError","Missing metrics")}setData(t){this.data=t}setMetrics(t){this.metrics=t}hasData(){return void 0!==this.data}getResolution(){return this.getData().resolution}getGlyphs(){return this.getData().glyphs}lookupMetric(t,e){const i=t.split(".");let s=this.getMetrics();for(let t=0;tt[e]))}}return[]}getElementsByType(t){return this.getElementsByAttribute("type",t)}getElementsByClass(t){return this.getElementsByAttribute("class",t)}onUpdate(t){return["id","type","class"].includes(t.name)&&this.updateIndex(t),this}}class A{constructor(){var t;this.attrs={id:A.newID(),el:void 0,type:this.getCategory(),classes:{}},this.rendered=!1,null===(t=N.getDefaultRegistry())||void 0===t||t.register(this)}static get CATEGORY(){return c.Element}static newID(){return"auto"+A.ID++}getCategory(){return this.constructor.CATEGORY}setStyle(t){return this.style=t,this}getStyle(){return this.style}applyStyle(t=this.context,e=this.getStyle()){return e&&t?(t.save(),e.shadowColor&&t.setShadowColor(e.shadowColor),e.shadowBlur&&t.setShadowBlur(e.shadowBlur),e.fillStyle&&t.setFillStyle(e.fillStyle),e.strokeStyle&&t.setStrokeStyle(e.strokeStyle),e.lineWidth&&t.setLineWidth(e.lineWidth),this):this}restoreStyle(t=this.context,e=this.getStyle()){return e&&t?(t.restore(),this):this}drawWithStyle(){this.checkContext(),this.applyStyle(),this.draw(),this.restoreStyle()}hasClass(t){return!0===this.attrs.classes[t]}addClass(t){var e;return this.attrs.classes[t]=!0,null===(e=this.registry)||void 0===e||e.onUpdate({id:this.attrs.id,name:"class",value:t,oldValue:void 0}),this}removeClass(t){var e;return delete this.attrs.classes[t],null===(e=this.registry)||void 0===e||e.onUpdate({id:this.attrs.id,name:"class",value:void 0,oldValue:t}),this}onRegister(t){return this.registry=t,this}isRendered(){return this.rendered}setRendered(t=!0){return this.rendered=t,this}getAttributes(){return this.attrs}getAttribute(t){return this.attrs[t]}setAttribute(t,e){var i;const s=this.attrs.id,n=this.attrs[t];return this.attrs[t]=e,null===(i=this.registry)||void 0===i||i.onUpdate({id:s,name:t,value:e,oldValue:n}),this}getBoundingBox(){return this.boundingBox}getContext(){return this.context}setContext(t){return this.context=t,this}checkContext(){return g(this.context,"NoContext","No rendering context attached to instance.")}set font(t){this.setFont(t)}get font(){return k.toCSSString(this.textFont)}setFont(t,e,i,s){const n=this.constructor.TEXT_FONT,a="object"==typeof t,o="string"==typeof t,r=void 0===t,h=void 0===e&&void 0===i&&void 0===s;return this.textFont=a?Object.assign(Object.assign({},n),t):o&&h?k.fromCSSString(t):r&&h?Object.assign({},n):k.validate(null!=t?t:n.family,null!=e?e:n.size,null!=i?i:n.weight,null!=s?s:n.style),this}getFont(){return this.textFont||this.resetFont(),k.toCSSString(this.textFont)}resetFont(){this.setFont()}get fontInfo(){return this.textFont||this.resetFont(),Object.assign({},this.textFont)}set fontInfo(t){this.setFont(t)}setFontSize(t){const e=this.fontInfo;return this.setFont(e.family,t,e.weight,e.style),this}getFontSize(){return this.fontSize}set fontSize(t){this.setFontSize(t)}get fontSize(){let t=this.fontInfo.size;return"number"==typeof t&&(t=`${t}pt`),t}get fontSizeInPoints(){return k.convertSizeToPointValue(this.fontSize)}get fontSizeInPixels(){return k.convertSizeToPixelValue(this.fontSize)}get fontStyle(){return this.fontInfo.style}set fontStyle(t){const e=this.fontInfo;this.setFont(e.family,e.size,e.weight,t)}get fontWeight(){return this.fontInfo.weight+""}set fontWeight(t){const e=this.fontInfo;this.setFont(e.family,e.size,t,e.style)}}var F,P;A.ID=1e3,A.TEXT_FONT={family:k.SANS_SERIF,size:k.SIZE,weight:b.NORMAL,style:w.NORMAL},function(t){t[t.MOVE=0]="MOVE",t[t.LINE=1]="LINE",t[t.QUADRATIC=2]="QUADRATIC",t[t.BEZIER=3]="BEZIER"}(F||(F={}));class B{constructor(t,e,i){this.point=-1,this.metrics=R.loadMetrics(t,e,i),this.bbox=R.getOutlineBoundingBox(this.metrics.outline,this.metrics.scale,this.metrics.x_shift,this.metrics.y_shift),i&&(this.point=R.lookupFontMetric(this.metrics.font,i,e,"point",-1))}}class M{constructor(t,e,i,s){this.outline=t,this.originX=e,this.originY=i,this.scale=s,this.i=0}done(){return this.i>=this.outline.length}next(){return this.outline[this.i++]}nextX(){return this.originX+this.outline[this.i++]*this.scale}nextY(){return this.originY-this.outline[this.i++]*this.scale}static parse(t){const e=[],i=t.split(" ");let s=0;for(;s{const e=t.getTickContext();n&&t.setStave(n),e.setXOffset(a)}))}}class L{static get NUM_TONES(){return this.canonical_notes.length}static get roots(){return["c","d","e","f","g","a","b"]}static get root_values(){return[0,2,4,5,7,9,11]}static get root_indices(){return{c:0,d:1,e:2,f:3,g:4,a:5,b:6}}static get canonical_notes(){return["c","c#","d","d#","e","f","f#","g","g#","a","a#","b"]}static get diatonic_intervals(){return["unison","m2","M2","m3","M3","p4","dim5","p5","m6","M6","b7","M7","octave"]}static get diatonic_accidentals(){return{unison:{note:0,accidental:0},m2:{note:1,accidental:-1},M2:{note:1,accidental:0},m3:{note:2,accidental:-1},M3:{note:2,accidental:0},p4:{note:3,accidental:0},dim5:{note:4,accidental:-1},p5:{note:4,accidental:0},m6:{note:5,accidental:-1},M6:{note:5,accidental:0},b7:{note:6,accidental:-1},M7:{note:6,accidental:0},octave:{note:7,accidental:0}}}static get intervals(){return{u:0,unison:0,m2:1,b2:1,min2:1,S:1,H:1,2:2,M2:2,maj2:2,T:2,W:2,m3:3,b3:3,min3:3,M3:4,3:4,maj3:4,4:5,p4:5,"#4":6,b5:6,aug4:6,dim5:6,5:7,p5:7,"#5":8,b6:8,aug5:8,6:9,M6:9,maj6:9,b7:10,m7:10,min7:10,dom7:10,M7:11,maj7:11,8:12,octave:12}}static get scales(){return{major:[2,2,1,2,2,2,1],minor:[2,1,2,2,1,2,2],ionian:[2,2,1,2,2,2,1],dorian:[2,1,2,2,2,1,2],phyrgian:[1,2,2,2,1,2,2],lydian:[2,2,2,1,2,2,1],mixolydian:[2,2,1,2,2,1,2],aeolian:[2,1,2,2,1,2,2],locrian:[1,2,2,1,2,2,2]}}static get scaleTypes(){return{M:L.scales.major,m:L.scales.minor}}static get accidentals(){return["bb","b","n","#","##"]}static get noteValues(){return{c:{root_index:0,int_val:0},cn:{root_index:0,int_val:0},"c#":{root_index:0,int_val:1},"c##":{root_index:0,int_val:2},cb:{root_index:0,int_val:11},cbb:{root_index:0,int_val:10},d:{root_index:1,int_val:2},dn:{root_index:1,int_val:2},"d#":{root_index:1,int_val:3},"d##":{root_index:1,int_val:4},db:{root_index:1,int_val:1},dbb:{root_index:1,int_val:0},e:{root_index:2,int_val:4},en:{root_index:2,int_val:4},"e#":{root_index:2,int_val:5},"e##":{root_index:2,int_val:6},eb:{root_index:2,int_val:3},ebb:{root_index:2,int_val:2},f:{root_index:3,int_val:5},fn:{root_index:3,int_val:5},"f#":{root_index:3,int_val:6},"f##":{root_index:3,int_val:7},fb:{root_index:3,int_val:4},fbb:{root_index:3,int_val:3},g:{root_index:4,int_val:7},gn:{root_index:4,int_val:7},"g#":{root_index:4,int_val:8},"g##":{root_index:4,int_val:9},gb:{root_index:4,int_val:6},gbb:{root_index:4,int_val:5},a:{root_index:5,int_val:9},an:{root_index:5,int_val:9},"a#":{root_index:5,int_val:10},"a##":{root_index:5,int_val:11},ab:{root_index:5,int_val:8},abb:{root_index:5,int_val:7},b:{root_index:6,int_val:11},bn:{root_index:6,int_val:11},"b#":{root_index:6,int_val:0},"b##":{root_index:6,int_val:1},bb:{root_index:6,int_val:10},bbb:{root_index:6,int_val:9}}}isValidNoteValue(t){return t>=0&&t=0&&t3)throw new d("BadArguments","Invalid note name: "+t);const e=t.toLowerCase(),i=/^([cdefgab])(b|bb|n|#|##)?$/.exec(e);if(null!==i){return{root:i[1],accidental:i[2]}}throw new d("BadArguments","Invalid note name: "+t)}getKeyParts(t){if(!t||t.length<1)throw new d("BadArguments","Invalid key: "+t);const e=t.toLowerCase(),i=/^([cdefgab])(b|#)?(mel|harm|m|M)?$/.exec(e);if(null!==i){const t=i[1],e=i[2];let s=i[3];return s||(s="M"),{root:t,accidental:e,type:s}}throw new d("BadArguments",`Invalid key: ${t}`)}getNoteValue(t){const e=L.noteValues[t];if(void 0===e)throw new d("BadArguments",`Invalid note name: ${t}`);return e.int_val}getIntervalValue(t){const e=L.intervals[t];if(void 0===e)throw new d("BadArguments",`Invalid interval name: ${t}`);return e}getCanonicalNoteName(t){if(!this.isValidNoteValue(t))throw new d("BadArguments",`Invalid note value: ${t}`);return L.canonical_notes[t]}getCanonicalIntervalName(t){if(!this.isValidIntervalValue(t))throw new d("BadArguments",`Invalid interval value: ${t}`);return L.diatonic_intervals[t]}getRelativeNoteValue(t,e,i=1){if(1!==i&&-1!==i)throw new d("BadArguments",`Invalid direction: ${i}`);let s=(t+i*e)%L.NUM_TONES;return s<0&&(s+=L.NUM_TONES),s}getRelativeNoteName(t,e){const i=this.getNoteParts(t),s=this.getNoteValue(i.root);let n=e-s;if(Math.abs(n)>L.NUM_TONES-3){let i=1;n>0&&(i=-1);const a=(e+1+(s+1))%L.NUM_TONES*i;if(Math.abs(a)>2)throw new d("BadArguments",`Notes not related: ${t}, ${e})`);n=a}if(Math.abs(n)>2)throw new d("BadArguments",`Notes not related: ${t}, ${e})`);let a=i.root;if(n>0)for(let t=1;t<=n;++t)a+="#";else if(n<0)for(let t=-1;t>=n;--t)a+="b";return a}getScaleTones(t,e){const i=[t];let s=t;for(let n=0;n":{aboveCode:"articAccentAbove",belowCode:"articAccentBelow",between_lines:!0},"a-":{aboveCode:"articTenutoAbove",belowCode:"articTenutoBelow",between_lines:!0},"a^":{aboveCode:"articMarcatoAbove",belowCode:"articMarcatoBelow",between_lines:!1},"a+":{code:"pluckedLeftHandPizzicato",between_lines:!1},ao:{aboveCode:"pluckedSnapPizzicatoAbove",belowCode:"pluckedSnapPizzicatoBelow",between_lines:!1},ah:{code:"stringsHarmonic",between_lines:!1},"a@":{aboveCode:"fermataAbove",belowCode:"fermataBelow",between_lines:!1},"a@a":{code:"fermataAbove",between_lines:!1},"a@u":{code:"fermataBelow",between_lines:!1},"a|":{code:"stringsUpBow",between_lines:!1},am:{code:"stringsDownBow",between_lines:!1},"a,":{code:"pictChokeCymbal",between_lines:!1}},z={mordent:{code:"ornamentShortTrill"},mordent_inverted:{code:"ornamentMordent"},turn:{code:"ornamentTurn"},turn_inverted:{code:"ornamentTurnSlash"},tr:{code:"ornamentTrill"},upprall:{code:"ornamentPrecompSlideTrillDAnglebert"},downprall:{code:"ornamentPrecompDoubleCadenceUpperPrefix"},prallup:{code:"ornamentPrecompTrillSuffixDandrieu"},pralldown:{code:"ornamentPrecompTrillLowerSuffix"},upmordent:{code:"ornamentPrecompSlideTrillBach"},downmordent:{code:"ornamentPrecompDoubleCadenceUpperPrefixTurn"},lineprall:{code:"ornamentPrecompAppoggTrill"},prallprall:{code:"ornamentTremblement"},scoop:{code:"brassScoop"},doit:{code:"brassDoitMedium"},fall:{code:"brassFallLipShort"},doitLong:{code:"brassLiftMedium"},fallLong:{code:"brassFallRoughMedium"},bend:{code:"brassBend"},plungerClosed:{code:"brassMuteClosed"},plungerOpen:{code:"brassMuteOpen"},flip:{code:"brassFlip"},jazzTurn:{code:"brassJazzTurn"},smear:{code:"brassSmear"}};class K{static currentMusicFont(){if(0===K.MUSIC_FONT_STACK.length)throw new d("NoFonts","The font stack is empty. See: await Flow.fetchMusicFont(...); Flow.setMusicFont(...).");return K.MUSIC_FONT_STACK[0]}static clefProperties(t){if(!t||!(t in Y))throw new d("BadArgument","Invalid clef: "+t);return Y[t]}static keyProperties(t,e="treble",i){let s={octave_shift:0};"object"==typeof i&&(s=Object.assign(Object.assign({},s),i));const n=t.split("/");if(n.length<2)throw new d("BadArguments",`First argument must be note/octave or note/octave/glyph-code: ${t}`);const a=n[0].toUpperCase(),o=j[a];if(!o)throw new d("BadArguments","Invalid key name: "+a);o.octave&&(n[1]=o.octave.toString());let r=parseInt(n[1],10);r+=-1*s.octave_shift;let h=(7*r-28+o.index)/2;h+=K.clefProperties(e).line_shift;let c=0;h<=0&&2*h%2==0&&(c=1),h>=6&&2*h%2==0&&(c=-1);const l=void 0!==o.int_val?12*r+o.int_val:void 0,g=o.code,u=o.shift_right;let p={};if(n.length>2&&n[2]){const t=n[2].toUpperCase();p=H[t]||{}}return Object.assign({key:a,octave:r,line:h,int_value:l,accidental:o.accidental,code:g,stroke:c,shift_right:u,displaced:!1},p)}static integerToNote(t){if(void 0===t||t<0||t>11)throw new d("BadArguments",`integerToNote() requires an integer in the range [0, 11]: ${t}`);const e={0:"C",1:"C#",2:"D",3:"D#",4:"E",5:"F",6:"F#",7:"G",8:"G#",9:"A",10:"A#",11:"B"}[t];if(!e)throw new d("BadArguments",`Unknown note value for integer: ${t}`);return e}static tabToGlyph(t,e=1){let i,s=0,n=0;if("X"===t.toUpperCase()){const t=new R("accidentalDoubleSharp",K.TABLATURE_FONT_SCALE).getMetrics();if(i="accidentalDoubleSharp",null==t.width||null==t.height)throw new d("InvalidMetrics","Width and height required");s=t.width,n=-t.height/2}else s=K.textWidth(t);return{text:t,code:i,getWidth:()=>s*e,shift_y:n}}static textWidth(t){return 7*t.toString().length}static articulationCodes(t){return V[t]}static accidentalCodes(t){return X[t]}static ornamentCodes(t){return z[t]}static keySignature(t){const e=U[t];if(!e)throw new d("BadKeySignature",`Bad key signature spec: '${t}'`);if(!e.acc)return[];const i={b:[2,.5,2.5,1,3,1.5,3.5],"#":[0,1.5,-.5,1,2.5,.5,2]}[e.acc],s=[];for(let t=0;tR.getWidth(n,t)}),s)}}K.STEM_WIDTH=1.5,K.STEM_HEIGHT=35,K.STAVE_LINE_THICKNESS=1,K.RESOLUTION=I,K.MUSIC_FONT_STACK=[],K.NOTATION_FONT_SCALE=39,K.TABLATURE_FONT_SCALE=39,K.SLASH_NOTEHEAD_WIDTH=15,K.STAVE_LINE_DISTANCE=10,K.TEXT_HEIGHT_OFFSET_HACK=1,K.accidentalMap=X,K.accidentalColumnsTable={1:{a:[1],b:[1]},2:{a:[1,2]},3:{a:[1,3,2],b:[1,2,1],second_on_bottom:[1,2,3]},4:{a:[1,3,4,2],b:[1,2,3,1],spaced_out_tetrachord:[1,2,1,2]},5:{a:[1,3,5,4,2],b:[1,2,4,3,1],spaced_out_pentachord:[1,2,3,2,1],very_spaced_out_pentachord:[1,2,1,2,1]},6:{a:[1,3,5,6,4,2],b:[1,2,4,5,3,1],spaced_out_hexachord:[1,3,2,1,3,2],very_spaced_out_hexachord:[1,2,1,2,1,2]}},K.unicode={sharp:String.fromCharCode(9839),flat:String.fromCharCode(9837),natural:String.fromCharCode(9838),triangle:String.fromCharCode(9651),"o-with-slash":String.fromCharCode(248),degrees:String.fromCharCode(176),circle:String.fromCharCode(9675)},K.validTypes={n:{name:"note"},r:{name:"rest"},h:{name:"harmonic"},m:{name:"muted"},s:{name:"slash"},g:{name:"ghost"}},K.TIME4_4={num_beats:4,beat_value:4,resolution:I};const $={"1/2":{common:{stem:!1,stem_offset:0,flag:!1,dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadDoubleWhole"},h:{code_head:"unpitchedPercussionClef1"},m:{code_head:"vexNoteHeadMutedBreve",stem_offset:0},r:{code_head:"restDoubleWhole",rest:!0,position:"B/5",dot_shiftY:.5},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadDoubleWhole"}}},1:{common:{stem:!1,stem_offset:0,flag:!1,dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadWhole"},h:{code_head:"noteheadDiamondWhole"},m:{code_head:"noteheadXWhole",stem_offset:-3},r:{code_head:"restWhole",rest:!0,position:"D/5",dot_shiftY:.5},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadWhole"}}},2:{common:{stem:!0,stem_offset:0,flag:!1,dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadHalf"},h:{code_head:"noteheadDiamondHalf"},m:{code_head:"noteheadXHalf",stem_offset:-3},r:{code_head:"restHalf",stem:!1,rest:!0,position:"B/4",dot_shiftY:-.5},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadHalf"}}},4:{common:{stem:!0,stem_offset:0,flag:!1,dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"restQuarter",stem:!1,rest:!0,position:"B/4",dot_shiftY:-.5,line_above:1.5,line_below:1.5},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}},8:{common:{stem:!0,stem_offset:0,flag:!0,beam_count:1,stem_beam_extension:0,code_flag_upstem:"flag8thUp",code_flag_downstem:"flag8thDown",dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"rest8th",stem:!1,flag:!1,rest:!0,position:"B/4",dot_shiftY:-.5,line_above:1,line_below:1},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}},16:{common:{beam_count:2,stem_beam_extension:0,stem:!0,stem_offset:0,flag:!0,code_flag_upstem:"flag16thUp",code_flag_downstem:"flag16thDown",dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"rest16th",stem:!1,flag:!1,rest:!0,position:"B/4",dot_shiftY:-.5,line_above:1,line_below:2},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}},32:{common:{beam_count:3,stem_beam_extension:7.5,stem:!0,stem_offset:0,flag:!0,code_flag_upstem:"flag32ndUp",code_flag_downstem:"flag32ndDown",dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"rest32nd",stem:!1,flag:!1,rest:!0,position:"B/4",dot_shiftY:-1.5,line_above:2,line_below:2},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}},64:{common:{beam_count:4,stem_beam_extension:15,stem:!0,stem_offset:0,flag:!0,code_flag_upstem:"flag64thUp",code_flag_downstem:"flag64thDown",dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"rest64th",stem:!1,flag:!1,rest:!0,position:"B/4",dot_shiftY:-1.5,line_above:2,line_below:3},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}},128:{common:{beam_count:5,stem_beam_extension:22.5,stem:!0,stem_offset:0,flag:!0,code_flag_upstem:"flag128thUp",code_flag_downstem:"flag128thDown",dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"rest128th",stem:!1,flag:!1,rest:!0,position:"B/4",dot_shiftY:-2.5,line_above:3,line_below:3},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}}};function q(...t){J.DEBUG&&u("Vex.Flow.Accidental",t)}class J extends O{constructor(t){super(),q("New accidental: ",t),this.type=t,this.position=O.Position.LEFT,this.render_options={font_scale:38,parenLeftPadding:2,parenRightPadding:2},this.accidental=K.accidentalCodes(this.type),g(this.accidental,"ArgumentError",`Unknown accidental type: ${t}`),this.cautionary=!1,this.reset()}static get CATEGORY(){return c.Accidental}static format(t,e){if(!t||0===t.length)return;const i=K.currentMusicFont(),s=i.lookupMetric("accidental.noteheadAccidentalPadding"),n=e.left_shift+s,a=i.lookupMetric("accidental.accidentalSpacing"),o=i.lookupMetric("accidental.leftPadding"),r=[];let h,c=0;for(let e=0;ee.line-t.line));const d=[];let l,g=0;for(let t=0;tg?e.shift:g,l=e.line}let u=0;for(let t=0;td[i+t],a=t=>t.map(n),o=(t,e)=>{const[i,s]=a([t,e]).map((t=>t.line));return i-s},r=(...t)=>t.map(a).every((([t,e])=>!this.checkCollision(t,e))),h=s-i+1;let c,l,g=this.checkCollision(d[i],d[s])?"a":"b";switch(h){case 3:"a"===g&&.5===o(1,2)&&.5!==o(0,1)&&(g="second_on_bottom");break;case 4:r([0,2],[1,3])&&(g="spaced_out_tetrachord");break;case 5:"b"===g&&r([1,3])&&(g="spaced_out_pentachord",r([0,2],[2,4])&&(g="very_spaced_out_pentachord"));break;case 6:r([0,3],[1,4],[2,5])&&(g="spaced_out_hexachord"),r([0,2],[2,4],[1,3],[3,5])&&(g="very_spaced_out_hexachord")}if(h>=7){let e=2,i=!0;for(;!0===i;){i=!1;for(let t=0;t+el?u:l}else for(c=t;c<=s;c++)l=K.accidentalColumnsTable[h][g][c-t],d[c].column=l,u=u>l?u:l;t=s}const p=[],m=[];for(let t=0;t<=u;t++)p[t]=0,m[t]=0;p[0]=g+n,m[0]=g+n,d.forEach((t=>{t.width>p[t.column]&&(p[t.column]=t.width)}));for(let t=1;t{let e=0;const i=_+t.numAcc;for(;_0?(s=e.flatLine||e.dblSharpLine?2.5:3,t.dblSharpLine&&(i-=.5)):(s=t.flatLine||t.dblSharpLine?2.5:3,e.dblSharpLine&&(i-=.5));const n=Math.abs(i){const e=new x(0,1);t.getTickables().forEach((t=>{if(t.shouldIgnoreTicks())return;const i=n[e.value()];i?i.push(t):(s.push(e.value()),n[e.value()]=[t]),e.add(t.getTicks())}))}));const a=new L;e||(e="C");const r=a.createScaleMap(e),h={};s.forEach((t=>{const e=n[t],s=[],d=t=>{if(!o(t)||t.isRest()||t.shouldIgnoreTicks())return;const e=t;e.keys.forEach(((t,n)=>{const o=a.getNoteParts(t.split("/")[0]),d=t.split("/")[1],l=o.accidental||"n",g=o.root+l;h[o.root+d]||(h[o.root+d]=r[o.root]);const u=h[o.root+d]===g,p=s.indexOf(t)>-1;if(e.getModifiers().forEach(((t,s)=>{i(t,c.Accidental)&&t.type==l&&t.getIndex()==n&&e.getModifiers().splice(s,1)})),!u||u&&p){h[o.root+d]=g;const i=new J(l);e.addModifier(i,n),s.push(t)}})),e.getModifiers().forEach((t=>{i(t,c.GraceNoteGroup)&&t.getGraceNotes().forEach(d)}))};e.forEach(d)}))}reset(){const t=this.render_options.font_scale;this.glyph=new R(this.accidental.code,t),this.glyph.setOriginX(1),this.cautionary&&(this.parenLeft=new R(K.accidentalCodes("{").code,t),this.parenRight=new R(K.accidentalCodes("}").code,t),this.parenLeft.setOriginX(1),this.parenRight.setOriginX(1))}getWidth(){if(this.cautionary){const t=g(this.parenLeft),e=g(this.parenRight),i=t.getMetrics().width+e.getMetrics().width+this.render_options.parenLeftPadding+this.render_options.parenRightPadding;return this.glyph.getMetrics().width+i}return this.glyph.getMetrics().width}setNote(t){return g(t,"ArgumentError",`Bad note value: ${t}`),this.note=t,n(t)&&(this.render_options.font_scale=25,this.reset()),this}setAsCautionary(){return this.cautionary=!0,this.render_options.font_scale=28,this.reset(),this}draw(){const{type:t,position:e,index:i,cautionary:s,x_shift:n,y_shift:a,glyph:o,render_options:{parenLeftPadding:r,parenRightPadding:h}}=this,c=this.checkContext(),d=this.checkAttachedNote();this.setRendered();const l=d.getModifierStartXY(e,i);let u=l.x+n;const p=l.y+a;if(q("Rendering: ",t,u,p),s){const t=g(this.parenLeft),e=g(this.parenRight);e.render(c,u,p),u-=e.getMetrics().width,u-=h,u-=this.accidental.parenRightPaddingAdjustment,o.render(c,u,p),u-=o.getMetrics().width,u-=r,t.render(c,u,p)}else o.render(c,u,p)}}J.DEBUG=!1;class Q extends A{constructor(t){super(),this.stem_up_y_offset=0,this.stem_down_y_offset=0,this.stem_up_y_base_offset=0,this.stem_down_y_base_offset=0,this.x_begin=(null==t?void 0:t.x_begin)||0,this.x_end=(null==t?void 0:t.x_end)||0,this.y_top=(null==t?void 0:t.y_top)||0,this.y_bottom=(null==t?void 0:t.y_bottom)||0,this.stem_extension=(null==t?void 0:t.stem_extension)||0,this.stem_direction=(null==t?void 0:t.stem_direction)||0,this.hide=(null==t?void 0:t.hide)||!1,this.isStemlet=(null==t?void 0:t.isStemlet)||!1,this.stemletHeight=(null==t?void 0:t.stemletHeight)||0,this.renderHeightAdjustment=0,this.setOptions(t)}static get CATEGORY(){return c.Stem}static get UP(){return 1}static get DOWN(){return-1}static get WIDTH(){return K.STEM_WIDTH}static get HEIGHT(){return K.STEM_HEIGHT}setOptions(t){this.stem_up_y_offset=(null==t?void 0:t.stem_up_y_offset)||0,this.stem_down_y_offset=(null==t?void 0:t.stem_down_y_offset)||0,this.stem_up_y_base_offset=(null==t?void 0:t.stem_up_y_base_offset)||0,this.stem_down_y_base_offset=(null==t?void 0:t.stem_down_y_base_offset)||0}setNoteHeadXBounds(t,e){return this.x_begin=t,this.x_end=e,this}setDirection(t){this.stem_direction=t}setExtension(t){this.stem_extension=t}getExtension(){return this.stem_extension}setYBounds(t,e){this.y_top=t,this.y_bottom=e}getHeight(){const t=this.stem_direction===Q.UP?this.stem_up_y_offset:this.stem_down_y_offset;return(this.y_bottom-this.y_top+(Q.HEIGHT-t+this.stem_extension))*this.stem_direction}getBoundingBox(){throw new d("NotImplemented","getBoundingBox() not implemented.")}getExtents(){const t=this.stem_direction===Q.UP,e=[this.y_top,this.y_bottom],i=Q.HEIGHT+this.stem_extension,s=(t?Math.min:Math.max)(...e),n=(t?Math.max:Math.min)(...e);return{topY:s+i*-this.stem_direction,baseY:n}}setVisibility(t){return this.hide=!t,this}setStemlet(t,e){return this.isStemlet=t,this.stemletHeight=e,this}adjustHeightForFlag(){this.renderHeightAdjustment=K.currentMusicFont().lookupMetric("stem.heightAdjustmentForFlag",-3)}adjustHeightForBeam(){this.renderHeightAdjustment=-Q.WIDTH/2}draw(){if(this.setRendered(),this.hide)return;const t=this.checkContext();let e,i;const s=this.stem_direction;let n=0;s===Q.DOWN?(e=this.x_begin,i=this.y_top+this.stem_down_y_offset,n=this.stem_down_y_base_offset):(e=this.x_end,i=this.y_bottom-this.stem_up_y_offset,n=this.stem_up_y_base_offset);const a=this.getHeight();!function(...t){Q.DEBUG&&u("Vex.Flow.Stem",t)}("Rendering stem - ","Top Y: ",this.y_top,"Bottom Y: ",this.y_bottom);const o=this.isStemlet?a-this.stemletHeight*this.stem_direction:0;t.save(),this.applyStyle(t),t.beginPath(),t.setLineWidth(Q.WIDTH),t.moveTo(e,i-o+n),t.lineTo(e,i-a-this.renderHeightAdjustment*s),t.stroke(),this.restoreStyle(t),t.restore()}}function Z(...t){it.DEBUG&&u("Vex.Flow.TextFormatter",t)}Q.DEBUG=!1;const tt={},et={};class it{constructor(t){this.family="",this.size=14,this.resolution=1e3,this.glyphs={},this.serifs=!1,this.monospaced=!1,this.italic=!1,this.bold=!1,this.superscriptOffset=0,this.subscriptOffset=0,this.maxSizeGlyph="H",this.cacheKey="",this.updateParams(t)}static getFontFamilies(){const t=[];for(const e in et){const i=et[e];t.push(Object.assign({},i))}return t}static create(t={}){Z("create: ",t),t.family||(t.family=k.SANS_SERIF);const e=[],i=t.family.split(/\s*,\s*/);for(const t of i){for(const i in et)i.startsWith(t)&&e.push(et[i]);if(e.length>0)break}let s;if(0===e.length)s=new it(Object.values(et)[0]);else if(1===e.length)s=new it(e[0]);else{const i=k.isBold(t.weight),n=k.isItalic(t.style),a=e.find((t=>t.bold===i&&t.italic===n));if(a)s=new it(a);else{const t=e.find((t=>t.italic===n||t.bold===i));s=new it(t||e[0])}}const n=t.size;if(void 0!==n){const t=k.convertSizeToPointValue(n);s.setFontSize(t)}return s}static getInfo(t){return et[t]}static registerInfo(t,e=!1){Z("registerInfo: ",t,e);const i=t.family;(void 0===et[i]||e)&&(et[i]=t)}updateParams(t){t.family&&(this.family=t.family),t.resolution&&(this.resolution=t.resolution),t.glyphs&&(this.glyphs=t.glyphs),t.serifs&&(this.serifs=t.serifs),t.monospaced&&(this.monospaced=t.monospaced),t.italic&&(this.italic=t.italic),t.bold&&(this.bold=t.bold),t.maxSizeGlyph&&(this.maxSizeGlyph=t.maxSizeGlyph),t.superscriptOffset&&(this.superscriptOffset=t.superscriptOffset),t.subscriptOffset&&(this.subscriptOffset=t.subscriptOffset),this.updateCacheKey()}updateCacheKey(){const t=this.family.replace(/\s+/g,"_"),e=this.size,i=this.bold?b.BOLD:b.NORMAL,s=this.italic?w.ITALIC:w.NORMAL;this.cacheKey=`${t}%${e}%${i}%${s}`}getGlyphMetrics(t){return this.glyphs[t]?this.glyphs[t]:this.glyphs[this.maxSizeGlyph]}get maxHeight(){return this.getGlyphMetrics(this.maxSizeGlyph).ha/this.resolution*this.fontSizeInPixels}getWidthForCharacterInEm(t){var e;const i=this.getGlyphMetrics(t);if(i){return(null!==(e=i.advanceWidth)&&void 0!==e?e:0)/this.resolution}return.65}getWidthForTextInEm(t){const e=this.cacheKey;let i=tt[e];void 0===i&&(i={},tt[e]=i);let s=i[t];if(void 0===s){s=0;for(let e=0;et>e?t:e)),c+=(this.text_line+1)*K.STAVE_LINE_DISTANCE+r,g&&i===Q.DOWN&&(c=Math.max(c,d.topY+r+l*this.text_line))}else if(this.verticalJustification===nt.CENTER){const t=e.getYForTopText(this.text_line)-1;c=t+(p.getYForBottomText(this.text_line)-t)/2+r/2}else if(this.verticalJustification===nt.TOP)c=e.getYs()[0]-(this.text_line+1)*K.STAVE_LINE_DISTANCE,g&&i===Q.UP&&(l=d.topY=1}function dt(t,e){return ct(t,e)?e===ot?Math.ceil:Math.floor:Math.round}const lt=t=>o(t)||n(t);class gt extends O{constructor(t){super(),this.type=t,this.position=rt,this.render_options={font_scale:38},this.reset()}static get CATEGORY(){return c.Articulation}static format(t,e){if(!t||0===t.length)return!1;const i=(t,e,i)=>ht(dt(e,i),g(t.glyph.getMetrics().height)/10+.5);t.forEach((t=>{const s=t.checkAttachedNote();let n=5;const a=s.hasStem()?s.getStemDirection():Q.UP;let o=0;if(r(s)){const t=s.getStem();t&&(o=Math.abs(t.getHeight())/K.STAVE_LINE_DISTANCE)}const h=s.getStave();if(h&&(n=h.getNumLines()),t.getPosition()===ot){let r=s.getLineNumber(!0);a===Q.UP&&(r+=o);let h=i(t,e.top_text_line,ot);const c=r+e.top_text_line+.5;!t.articulation.between_lines&&ct.getWidth())).reduce(((t,e)=>Math.max(e,t)));return e.left_shift+=s/2,e.right_shift+=s/2,!0}static easyScoreHook({articulations:t},e,i){if(!t)return;const s={staccato:"a.",tenuto:"a-",accent:"a>"};t.split(",").map((t=>t.trim().split("."))).map((([t,e])=>{const n={type:s[t]};return e&&(n.position=O.PositionString[e]),i.getFactory().Articulation(n)})).map((t=>e.addModifier(t,0)))}reset(){this.articulation=K.articulationCodes(this.type);const t=g(this.articulation,"ArgumentError",`Articulation not found: ${this.type}`),e=(this.position===ot?t.aboveCode:t.belowCode)||t.code;this.glyph=new R(null!=e?e:"",this.render_options.font_scale),this.setWidth(g(this.glyph.getMetrics().width))}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=this.checkIndex(),{position:s,glyph:n,text_line:a}=this,o=this.articulation.between_lines,r=e.checkStave(),c=r.getSpacingBetweenLines(),l=h(e),{x:g}=e.getModifierStartXY(s,i),p=!o||l,m=function(t,e){const i=e===ot&&t.getStemDirection()===Q.UP||e===rt&&t.getStemDirection()===Q.DOWN;return lt(t)?t.hasStem()&&i?.5:1:t.hasStem()&&i?1:0}(e,s),f=K.currentMusicFont().lookupMetric(`articulation.${n.getCode()}.padding`,0);let _={[ot]:()=>{n.setOrigin(.5,1);const t=function(t,e){const i=t.getStemDirection(),{topY:s,baseY:n}=t.getStemExtents();if(lt(t))return t.hasStem()?i===Q.UP?s:n:Math.min(...t.getYs());if(h(t))return t.hasStem()&&i===Q.UP?s:t.checkStave().getYForTopText(e);throw new d("UnknownCategory","Only can get the top and bottom ys of stavenotes and tabnotes")}(e,a)-(a+m)*c;return p?Math.min(r.getYForTopText(gt.INITIAL_OFFSET),t):t},[rt]:()=>{n.setOrigin(.5,0);const t=function(t,e){const i=t.getStemDirection(),{topY:s,baseY:n}=t.getStemExtents();if(lt(t))return t.hasStem()?i===Q.UP?n:s:Math.max(...t.getYs());if(h(t))return t.hasStem()?i===Q.UP?t.checkStave().getYForBottomText(e):s:t.checkStave().getYForBottomText(e);throw new d("UnknownCategory","Only can get the top and bottom ys of stavenotes and tabnotes")}(e,a)+(a+m)*c;return p?Math.max(r.getYForBottomText(gt.INITIAL_OFFSET),t):t}}[s]();if(!l){const t=s===ot?-1:1,a=e.getKeyProps()[i].line,r=(e.getYs()[i]-_)/c+Number(a),h=function(t,e,i,s){const n=ht(dt(e,i),e);if(t&&ct(n,i)&&n%1==0)return n+.5*-s;return n}(o,r,s,t);ct(h,s)&&n.setOrigin(.5,.5),_+=Math.abs(h-r)*c*t+f*t}!function(...t){gt.DEBUG&&u("Vex.Flow.Articulation",t)}(`Rendering articulation at (x: ${g}, y: ${_})`),n.render(t,g,_)}}gt.DEBUG=!1,gt.INITIAL_OFFSET=-.5;class ut{static get CATEGORY(){return c.RenderContext}set font(t){this.setFont(t)}get font(){return this.getFont()}setRawFont(t){return this.setFont(t),this}}class pt extends A{constructor(){super(),this._preFormatted=!1,this._postFormatted=!1,this.ticks=new x(0,1),this.intrinsicTicks=0,this.tickMultiplier=new x(1,1),this.width=0,this.x_shift=0,this.modifiers=[],this.tupletStack=[],this.align_center=!1,this.center_x_shift=0,this.ignore_ticks=!1,this.formatterMetrics={freedom:{left:0,right:0},duration:"",iterations:0,space:{used:0,mean:0,deviation:0}}}static get CATEGORY(){return c.Tickable}reset(){return this}getTicks(){return this.ticks}shouldIgnoreTicks(){return this.ignore_ticks}setIgnoreTicks(t){return this.ignore_ticks=t,this}setWidth(t){this.width=t}getWidth(){if(!this._preFormatted)throw new d("UnformattedNote","Can't call GetWidth on an unformatted note.");return this.width+(this.modifierContext?this.modifierContext.getWidth():0)}setXShift(t){return this.x_shift=t,this}getXShift(){return this.x_shift}getX(){return this.checkTickContext("Can't getX() without a TickContext.").getX()+this.x_shift}getFormatterMetrics(){return this.formatterMetrics}getCenterXShift(){return this.isCenterAligned()?this.center_x_shift:0}setCenterXShift(t){return this.center_x_shift=t,this}isCenterAligned(){return this.align_center}setCenterAlignment(t){return this.align_center=t,this}getVoice(){return g(this.voice,"NoVoice","Tickable has no voice.")}setVoice(t){this.voice=t}getTuplet(){return this.tuplet}getTupletStack(){return this.tupletStack}resetTuplet(t){let e,i;if(t){const s=this.tupletStack.indexOf(t);return-1!==s&&(this.tupletStack.splice(s,1),e=t.getNoteCount(),i=t.getNotesOccupied(),this.applyTickMultiplier(e,i)),this}for(;this.tupletStack.length;)e=(t=this.tupletStack.pop()).getNoteCount(),i=t.getNotesOccupied(),this.applyTickMultiplier(e,i);return this}setTuplet(t){if(t){this.tupletStack.push(t);const e=t.getNoteCount(),i=t.getNotesOccupied();this.applyTickMultiplier(i,e)}return this.tuplet=t,this}addToModifierContext(t){this.modifierContext=t;for(let t=0;tK.getGlyphProps(this.duration,t))),this.playNote=void 0,this.ignore_ticks=!1,this.width=0,this.leftDisplacedHeadPx=0,this.rightDisplacedHeadPx=0,this.x_shift=0,this.ys=[],t.align_center&&this.setCenterAlignment(t.align_center),this.render_options={annotation_spacing:5,glyph_font_scale:1,stroke_px:1,scale:1,font:"",y_shift:0}}static get CATEGORY(){return c.Note}static plotMetrics(t,e,i){const s=e.getMetrics(),n=e.getAbsoluteX()-s.modLeftPx-s.leftDisplacedHeadPx,a=e.getAbsoluteX()-s.leftDisplacedHeadPx,o=e.getAbsoluteX(),r=e.getAbsoluteX()+s.notePx,h=e.getAbsoluteX()+s.notePx+s.rightDisplacedHeadPx,c=e.getAbsoluteX()+s.notePx+s.rightDisplacedHeadPx+s.modRightPx,d=c+(e.getFormatterMetrics().freedom.right||0),l=c-n;t.save(),t.setFont(k.SANS_SERIF,8),t.fillText(Math.round(l)+"px",n+e.getXShift(),i);const g=i+7;function u(i,s,n,a=g){t.beginPath(),t.setStrokeStyle(n),t.setFillStyle(n),t.setLineWidth(3),t.moveTo(i+e.getXShift(),a),t.lineTo(s+e.getXShift(),a),t.stroke()}u(n,a,"red"),u(a,o,"#999"),u(o,r,"green"),u(r,h,"#999"),u(h,c,"red"),u(c,d,"#DD0"),u(n-e.getXShift(),n,"#BBB"),function(t,e,i,s="#F55"){t.save(),t.setFillStyle(s),t.beginPath(),t.arc(e,i,3,0,2*Math.PI,!0),t.closePath(),t.fill(),t.restore()}(t,o+e.getXShift(),g,"blue");const p=e.getFormatterMetrics();if(p.iterations>0){const s=p.space.deviation,n=s>=0?"+":"";t.setFillStyle("red"),t.fillText(n+Math.round(s),o+e.getXShift(),i-10)}t.restore()}static parseDuration(t){if(!t)return;const e=/(\d*\/?\d+|[a-z])(d*)([nrhms]|$)/.exec(t);if(!e)return;return{duration:e[1],dots:e[2].length,type:e[3]||"n"}}static parseNoteStruct(t){const e=mt.parseDuration(t.duration);if(!e)return;let i=t.type;if(i&&!K.validTypes[i])return;const s=[];i||(i=e.type||"n",void 0!==t.keys&&t.keys.forEach(((t,e)=>{const n=t.split("/");s[e]=n&&3===n.length?n[2]:i})));let n=K.durationToTicks(e.duration);if(!n)return;const a=t.dots?t.dots:e.dots;if("number"!=typeof a)return;let o=n;for(let t=0;t0}hasStem(){return!1}getNoteType(){return this.noteType}getBeam(){return this.beam}checkBeam(){return g(this.beam,"NoBeam","No beam attached to instance")}hasBeam(){return null!=this.beam}setBeam(t){return this.beam=t,this}addModifier(t,e=0){const i="Note.addModifier(modifier: Modifier, index: number=0)";if("string"==typeof e&&(e=parseInt(e),console.warn(i+" expected a number for `index`, but received a string.")),"object"!=typeof t||"number"!=typeof e)throw new d("WrongParams","Incorrect call signature. Use "+i+" instead.");return t.setNote(this),t.setIndex(e),super.addModifier(t),this}getModifiersByType(t){return this.checkModifierContext().getMembers(t)}getModifierStartXY(t,e,i){if(!this.preFormatted)throw new d("UnformattedNote","Can't call GetModifierStartXY on an unformatted note");return{x:this.getAbsoluteX(),y:this.ys[0]}}getRightParenthesisPx(t){return this.getKeyProps()[t].displaced?this.getRightDisplacedHeadPx():0}getLeftParenthesisPx(t){return this.getKeyProps()[t].displaced?this.getLeftDisplacedHeadPx():0}getFirstDotPx(){let t=this.getRightDisplacedHeadPx();return 0!==this.checkModifierContext().getMembers("Parenthesis").length&&(t+=K.currentMusicFont().lookupMetric("parenthesis.default.width")),t}getMetrics(){if(!this.preFormatted)throw new d("UnformattedNote","Can't call getMetrics on an unformatted note.");const t=this.modifierContext?this.modifierContext.getState().left_shift:0,e=this.modifierContext?this.modifierContext.getState().right_shift:0,i=this.getWidth();return{width:i,glyphWidth:this.getGlyphWidth(),notePx:i-t-e-this.leftDisplacedHeadPx-this.rightDisplacedHeadPx,modLeftPx:t,modRightPx:e,leftDisplacedHeadPx:this.leftDisplacedHeadPx,rightDisplacedHeadPx:this.rightDisplacedHeadPx,glyphPx:0}}getAbsoluteX(){let t=this.checkTickContext("Can't getAbsoluteX() without a TickContext.").getX();return this.stave&&(t+=this.stave.getNoteStartX()+K.currentMusicFont().lookupMetric("stave.padding")),this.isCenterAligned()&&(t+=this.getCenterXShift()),t}getStemDirection(){throw new d("NoStem","No stem attached to this note.")}getStemExtents(){throw new d("NoStem","No stem attached to this note.")}getTieRightX(){let t=this.getAbsoluteX();return t+=this.glyph.getWidth()/2,t+=-this.width/2+this.width+2,t}getTieLeftX(){let t=this.getAbsoluteX();return t+=this.glyph.getWidth()/2,t-=this.width/2+2,t}getKeys(){return this.keys}getKeyProps(){return this.keyProps}}var ft,_t,xt,St,yt,Tt,bt;!function(t){t[t.CENTER=0]="CENTER",t[t.LEFT=1]="LEFT",t[t.RIGHT=2]="RIGHT",t[t.ABOVE=3]="ABOVE",t[t.BELOW=4]="BELOW",t[t.BEGIN=5]="BEGIN",t[t.END=6]="END"}(ft||(ft={}));class wt extends A{constructor(){super(),this.width=0,this.x=0,this.padding=10,this.position=ft.ABOVE}static get CATEGORY(){return c.StaveModifier}static get Position(){return ft}getPosition(){return this.position}setPosition(t){return this.position=t,this}getStave(){return this.stave}checkStave(){return g(this.stave,"NoStave","No stave attached to instance.")}setStave(t){return this.stave=t,this}getWidth(){return this.width}setWidth(t){return this.width=t,this}getX(){return this.x}setX(t){return this.x=t,this}placeGlyphOnLine(t,e,i,s=0){t.setYShift(e.getYForLine(null!=i?i:0)-e.getYForGlyphs()+s)}getPadding(t){return void 0!==t&&t<2?0:this.padding}setPadding(t){return this.padding=t,this}setLayoutMetrics(t){return this.layoutMetrics=t,this}getLayoutMetrics(){return this.layoutMetrics}draw(...t){}}!function(t){t[t.SINGLE=1]="SINGLE",t[t.DOUBLE=2]="DOUBLE",t[t.END=3]="END",t[t.REPEAT_BEGIN=4]="REPEAT_BEGIN",t[t.REPEAT_END=5]="REPEAT_END",t[t.REPEAT_BOTH=6]="REPEAT_BOTH",t[t.NONE=7]="NONE"}(_t||(_t={}));class vt extends wt{constructor(t){super(),this.thickness=K.STAVE_LINE_THICKNESS;const e=_t;this.widths={},this.widths[e.SINGLE]=5,this.widths[e.DOUBLE]=5,this.widths[e.END]=5,this.widths[e.REPEAT_BEGIN]=5,this.widths[e.REPEAT_END]=5,this.widths[e.REPEAT_BOTH]=5,this.widths[e.NONE]=5,this.paddings={},this.paddings[e.SINGLE]=0,this.paddings[e.DOUBLE]=0,this.paddings[e.END]=0,this.paddings[e.REPEAT_BEGIN]=15,this.paddings[e.REPEAT_END]=15,this.paddings[e.REPEAT_BOTH]=15,this.paddings[e.NONE]=0,this.layoutMetricsMap={},this.layoutMetricsMap[e.SINGLE]={xMin:0,xMax:1,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.DOUBLE]={xMin:-3,xMax:1,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.END]={xMin:-5,xMax:1,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.REPEAT_END]={xMin:-10,xMax:1,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.REPEAT_BEGIN]={xMin:-2,xMax:10,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.REPEAT_BOTH]={xMin:-10,xMax:10,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.NONE]={xMin:0,xMax:0,paddingLeft:5,paddingRight:5},this.setPosition(ft.BEGIN),this.setType(t)}static get CATEGORY(){return c.Barline}static get type(){return _t}static get typeString(){return{single:_t.SINGLE,double:_t.DOUBLE,end:_t.END,repeatBegin:_t.REPEAT_BEGIN,repeatEnd:_t.REPEAT_END,repeatBoth:_t.REPEAT_BOTH,none:_t.NONE}}getType(){return this.type}setType(t){return this.type="string"==typeof t?vt.typeString[t]:t,this.setWidth(this.widths[this.type]),this.setPadding(this.paddings[this.type]),this.setLayoutMetrics(this.layoutMetricsMap[this.type]),this}draw(t){switch(t.checkContext(),this.setRendered(),this.type){case _t.SINGLE:this.drawVerticalBar(t,this.x,!1);break;case _t.DOUBLE:this.drawVerticalBar(t,this.x,!0);break;case _t.END:this.drawVerticalEndBar(t,this.x);break;case _t.REPEAT_BEGIN:this.drawRepeatBar(t,this.x,!0),t.getX()!==this.x&&this.drawVerticalBar(t,t.getX());break;case _t.REPEAT_END:this.drawRepeatBar(t,this.x,!1);break;case _t.REPEAT_BOTH:this.drawRepeatBar(t,this.x,!1),this.drawRepeatBar(t,this.x,!0)}}drawVerticalBar(t,e,i){const s=t.checkContext(),n=t.getTopLineTopY(),a=t.getBottomLineBottomY();i&&s.fillRect(e-3,n,1,a-n),s.fillRect(e,n,1,a-n)}drawVerticalEndBar(t,e){const i=t.checkContext(),s=t.getTopLineTopY(),n=t.getBottomLineBottomY();i.fillRect(e-5,s,1,n-s),i.fillRect(e-2,s,3,n-s)}drawRepeatBar(t,e,i){const s=t.checkContext(),n=t.getTopLineTopY(),a=t.getBottomLineBottomY();let o=3;i||(o=-5),s.fillRect(e+o,n,1,a-n),s.fillRect(e-2,n,3,a-n);i?o+=4:o-=4;const r=e+o+1;let h=(t.getNumLines()-1)*t.getSpacingBetweenLines();h=h/2-t.getSpacingBetweenLines()/2;let c=n+h+1;s.beginPath(),s.arc(r,c,2,0,2*Math.PI,!1),s.fill(),c+=t.getSpacingBetweenLines(),s.beginPath(),s.arc(r,c,2,0,2*Math.PI,!1),s.fill()}}class Et extends mt{constructor(t=_t.SINGLE){super({duration:"b"}),this.metrics={widths:{}};const e=_t;this.metrics.widths={[e.SINGLE]:8,[e.DOUBLE]:12,[e.END]:15,[e.REPEAT_BEGIN]:14,[e.REPEAT_END]:14,[e.REPEAT_BOTH]:18,[e.NONE]:0},this.ignore_ticks=!0,this.setType(t)}static get CATEGORY(){return c.BarNote}getType(){return this.type}setType(t){return this.type="string"==typeof t?vt.typeString[t]:t,this.setWidth(this.metrics.widths[this.type]),this}addToModifierContext(t){return this}preFormat(){return this.preFormatted=!0,this}draw(){const t=this.checkContext();!function(...t){Et.DEBUG&&u("Vex.Flow.BarNote",t)}("Rendering bar line at: ",this.getAbsoluteX()),this.style&&this.applyStyle(t);const e=new vt(this.type);e.setX(this.getAbsoluteX()),e.draw(this.checkStave()),this.style&&this.restoreStyle(t),this.setRendered()}}Et.DEBUG=!1;class Ct extends O{constructor(t,e=!1,i){super(),this.text=t,this.x_shift=0,this.release=e,this.tap="",this.resetFont(),this.render_options={line_width:1.5,line_style:"#777777",bend_width:8,release_width:8},i?this.phrase=i:(this.phrase=[{type:Ct.UP,text:this.text}],this.release&&this.phrase.push({type:Ct.DOWN,text:""})),this.updateWidth()}static get CATEGORY(){return c.Bend}static get UP(){return 0}static get DOWN(){return 1}static format(t,e){if(!t||0===t.length)return!1;let i=0;for(let s=0;st{const a=t+s,o=i;e.save(),e.beginPath(),e.setLineWidth(this.render_options.line_width),e.setStrokeStyle(this.render_options.line_style),e.setFillStyle(this.render_options.line_style),e.moveTo(t,i),e.quadraticCurveTo(a,o,t+s,n),e.stroke(),e.restore()},l=(t,i,s,n)=>{e.save(),e.beginPath(),e.setLineWidth(this.render_options.line_width),e.setStrokeStyle(this.render_options.line_style),e.setFillStyle(this.render_options.line_style),e.moveTo(t,n),e.quadraticCurveTo(t+s,n,t+s,i),e.stroke(),e.restore()},g=(t,i,s)=>{const n=i+4*s;e.beginPath(),e.moveTo(t,i),e.lineTo(t-4,n),e.lineTo(t+4,n),e.closePath(),e.fill()},u=(t,i)=>{e.save(),e.setFont(this.textFont);const s=t-e.measureText(i).width/2;e.fillText(i,s,h),e.restore()};let p,m=0,f=0;if(null===(t=this.tap)||void 0===t?void 0:t.length){u(i.getModifierStartXY(O.Position.CENTER,this.index).x,this.tap)}for(let t=0;t0){const e=o.symbolBlocks[t-1];Dt.isSuperscript(e)||(n=s)}a&&n>0&&(d=!0,e.xShift=e.xShift+(n-s),s=n,n=0,o.setEnableKerning(!1)),i||a||(n=0),e.vAlign=d,s+=e.width}o.updateKerningAdjustments(),o.updateOverBarAdjustments(),o.getVertical()===St.TOP?(o.setTextLine(e.top_text_line),e.top_text_line+=c):(o.setTextLine(e.text_line+1),e.text_line+=c+1),o.getReportWidth()?a.push(s):a.push(0)}return s=a.reduce(((t,e)=>t+e),0),e.left_shift+=s/2,e.right_shift+=s/2,!0}static get TEXT_FONT(){let t="Roboto Slab, Times, serif";return"Petaluma"===K.currentMusicFont().getName()&&(t="PetalumaScript, Arial, sans-serif"),{family:t,size:12,weight:b.NORMAL,style:w.NORMAL}}get superscriptOffset(){return Dt.superscriptOffset*this.textFormatter.fontSizeInPixels}get subscriptOffset(){return Dt.subscriptOffset*this.textFormatter.fontSizeInPixels}setReportWidth(t){return this.reportWidth=t,this}getReportWidth(){return this.reportWidth}updateOverBarAdjustments(){const t=this.symbolBlocks.findIndex((({symbolType:t,glyph:e})=>t===yt.GLYPH&&void 0!==e&&"csymDiagonalArrangementSlash"===e.code));if(t<0)return;const e=this.symbolBlocks[t].width/4,i=.25*this.textFormatter.fontSizeInPixels;let s=0;for(;s0?this.symbolBlocks[t-1]:void 0;let s=0;e.symbolType===yt.GLYPH&&void 0!==e.glyph&&e.glyph.code===Dt.glyphs.over.code&&(s+=e.glyph.metrics.x_shift),void 0!==i&&i.symbolType===yt.GLYPH&&void 0!==i.glyph&&i.glyph.code===Dt.glyphs.over.code&&(s+=i.glyph.metrics.x_shift);let n=!1,a=!1;void 0!==i&&i.symbolType===yt.TEXT&&(n=Dt.upperKerningText.some((t=>t===i.text[i.text.length-1])),a=Dt.lowerKerningText.some((t=>t===i.text[i.text.length-1])));const o=Dt.kerningOffset*this.textFormatter.fontSizeInPixels;return n&&e.symbolModifier===Tt.SUPERSCRIPT&&(s+=o),a&&e.symbolType===yt.TEXT&&(e.text[0]>="a"&&e.text[0]<="z"&&(s+=o/2),Dt.upperKerningText.some((t=>t===(null==i?void 0:i.text[i.text.length-1])))&&(s+=o/2)),s}getSymbolBlock(t={}){var e,i,s;const n=null!==(e=t.symbolType)&&void 0!==e?e:yt.TEXT,a={text:null!==(i=t.text)&&void 0!==i?i:"",symbolType:n,symbolModifier:null!==(s=t.symbolModifier)&&void 0!==s?s:Tt.NONE,xShift:0,yShift:0,vAlign:!1,width:0};if(n===yt.GLYPH&&"string"==typeof t.glyph){const e=Dt.glyphs[t.glyph],i=20;a.glyph=new R(e.code,i,{category:"chordSymbol"})}else n===yt.TEXT?a.width=this.textFormatter.getWidthForTextInEm(a.text):n===yt.LINE&&(a.width=t.width);return a}addSymbolBlock(t){return this.symbolBlocks.push(this.getSymbolBlock(t)),this}addText(t,e={}){const i=yt.TEXT;return this.addSymbolBlock(Object.assign(Object.assign({},e),{text:t,symbolType:i}))}addTextSuperscript(t){const e=yt.TEXT,i=Tt.SUPERSCRIPT;return this.addSymbolBlock({text:t,symbolType:e,symbolModifier:i})}addTextSubscript(t){const e=yt.TEXT,i=Tt.SUBSCRIPT;return this.addSymbolBlock({text:t,symbolType:e,symbolModifier:i})}addGlyphSuperscript(t){const e=yt.GLYPH,i=Tt.SUPERSCRIPT;return this.addSymbolBlock({glyph:t,symbolType:e,symbolModifier:i})}addGlyph(t,e={}){const i=yt.GLYPH;return this.addSymbolBlock(Object.assign(Object.assign({},e),{glyph:t,symbolType:i}))}addGlyphOrText(t,e={}){let i="";for(let s=0;s0&&(this.addText(i,e),i=""),this.addGlyph(n,e)):i+=n}return i.length>0&&this.addText(i,e),this}addLine(t,e={}){const i=yt.LINE;return this.addSymbolBlock(Object.assign(Object.assign({},e),{symbolType:i,width:t}))}setFont(t,e,i,s){return super.setFont(t,e,i,s),this.textFormatter=it.create(this.textFont),this}setEnableKerning(t){return this.useKerning=t,this}setVertical(t){return this.vertical="string"==typeof t?Dt.VerticalJustifyString[t]:t,this}getVertical(){return this.vertical}setHorizontal(t){return this.horizontal="string"==typeof t?Dt.HorizontalJustifyString[t]:t,this}getHorizontal(){return this.horizontal}getWidth(){let t=0;return this.symbolBlocks.forEach((e=>{t+=e.vAlign?0:e.width})),t}getYOffsetForText(t){var e;let i=0,s=0;for(s=0;s0?i/n*-1:0}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered(),t.save();const i=Object.keys(this.getAttribute("classes")).join(" ");t.openGroup(i,this.getAttribute("id"));const s=e.getModifierStartXY(O.Position.ABOVE,this.index);let n;t.setFont(this.textFont);const a=e.hasStem(),o=e.checkStave();if(this.vertical===St.BOTTOM){if(n=o.getYForBottomText(this.text_line+K.TEXT_HEIGHT_OFFSET_HACK),a){const t=e.checkStem().getExtents(),i=o.getSpacingBetweenLines(),s=1===e.getStemDirection()?t.baseY:t.topY;n=Math.max(n,s+i*(this.text_line+2))}}else if(n=Math.min(o.getYForTopText(this.text_line),e.getYs()[0]-10),a){const t=e.checkStem().getExtents(),i=o.getSpacingBetweenLines();n=Math.min(n,t.topY-5-i*this.text_line)}let r=s.x;r=this.horizontal===xt.LEFT?s.x:this.horizontal===xt.RIGHT?s.x+this.getWidth():this.horizontal===xt.CENTER?s.x-this.getWidth()/2:e.getStemX()-this.getWidth()/2,kt("Rendering ChordSymbol: ",this.textFormatter,r,n),this.symbolBlocks.forEach((e=>{const i=Dt.isSuperscript(e),s=Dt.isSubscript(e);let a=n;if(kt("shift was ",e.xShift,e.yShift),kt("curY pre sub ",a),i&&(a+=this.superscriptOffset),s&&(a+=this.subscriptOffset),kt("curY sup/sub ",a),e.symbolType===yt.TEXT){if((i||s)&&(t.save(),this.textFont)){const{family:e,size:i,weight:s,style:n}=this.textFont,a=k.scaleSize(i,Dt.superSubRatio);t.setFont(e,a,s,n)}kt("Rendering Text: ",e.text,r+e.xShift,a+e.yShift),t.fillText(e.text,r+e.xShift,a+e.yShift),(i||s)&&t.restore()}else e.symbolType===yt.GLYPH&&e.glyph?(a+=e.yShift,kt("Rendering Glyph: ",e.glyph.code,r+e.xShift,a),e.glyph.render(t,r+e.xShift,a)):e.symbolType===yt.LINE&&(kt("Rendering Line : ",e.width,r,a),t.beginPath(),t.setLineWidth(1),t.moveTo(r,n),t.lineTo(r+e.width,a),t.stroke());r+=e.width,e.vAlign&&(r+=e.xShift)})),t.closeGroup(),t.restore()}}Dt.DEBUG=!1,Dt.HorizontalJustify=xt,Dt.HorizontalJustifyString={left:xt.LEFT,right:xt.RIGHT,center:xt.CENTER,centerStem:xt.CENTER_STEM},Dt.VerticalJustify=St,Dt.VerticalJustifyString={top:St.TOP,above:St.TOP,below:St.BOTTOM,bottom:St.BOTTOM},Dt.glyphs={diminished:{code:"csymDiminished"},dim:{code:"csymDiminished"},halfDiminished:{code:"csymHalfDiminished"},"+":{code:"csymAugmented"},augmented:{code:"csymAugmented"},majorSeventh:{code:"csymMajorSeventh"},minor:{code:"csymMinor"},"-":{code:"csymMinor"},"(":{code:"csymParensLeftTall"},leftParen:{code:"csymParensLeftTall"},")":{code:"csymParensRightTall"},rightParen:{code:"csymParensRightTall"},leftBracket:{code:"csymBracketLeftTall"},rightBracket:{code:"csymBracketRightTall"},leftParenTall:{code:"csymParensLeftVeryTall"},rightParenTall:{code:"csymParensRightVeryTall"},"/":{code:"csymDiagonalArrangementSlash"},over:{code:"csymDiagonalArrangementSlash"},"#":{code:"accidentalSharp"},b:{code:"accidentalFlat"}},Dt.symbolTypes=yt,Dt.symbolModifiers=Tt,Dt.noFormat=!1;class Nt extends O{constructor(){super(),this.position=O.Position.RIGHT,this.radius=2,this.setWidth(5),this.dot_shiftY=0}static get CATEGORY(){return c.Dot}static getDots(t){return t.getModifiersByType(Nt.CATEGORY)}static buildAndAttach(t,e){for(const i of t)if(null==e?void 0:e.all)for(let t=0;te.line-t.line));let a=i,r=0,c=null,l=null,g=null,u=0;for(let t=0;tr?a:r,c=h,l=i}return e.right_shift+=r,!0}setNote(t){return this.note=t,n(t)&&(this.radius*=.5,this.setWidth(3)),this}setDotShiftY(t){return this.dot_shiftY=t,this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.checkStave().getSpacingBetweenLines(),s=e.getModifierStartXY(this.position,this.index,{forceFlagRight:!0});h(e)&&(s.y=e.getStemExtents().baseY);const n=s.x+this.x_shift+this.width-this.radius,a=s.y+this.y_shift+this.dot_shiftY*i;t.beginPath(),t.arc(n,a,this.radius,0,2*Math.PI,!1),t.fill()}}class At extends O{constructor(t){super(),this.finger=t,this.width=7,this.position=O.Position.LEFT,this.x_shift=0,this.y_shift=0,this.x_offset=0,this.y_offset=0,this.resetFont()}static get CATEGORY(){return c.FretHandFinger}static format(t,e){const{left_shift:i,right_shift:s}=e;if(!t||0===t.length)return!1;const n=[];let a=null,o=0,r=0;for(let h=0;he.line-t.line));let h=0,c=0,d=0,l=0,g=null,u=null;for(let t=0;td?e:d):o===O.Position.RIGHT&&(p.setXShift(c),e=r+x,l=e>l?e:l),g=m,u=a}return e.left_shift+=d,e.right_shift+=l,!0}static easyScoreHook({fingerings:t}={},e,i){null==t||t.split(",").map((t=>{const e=t.trim().split("."),s={number:e[0]};return e[1]&&(s.position=e[1]),i.getFactory().Fingering(s)})).map(((t,i)=>e.addModifier(t,i)))}setFretHandFinger(t){return this.finger=t,this}getFretHandFinger(){return this.finger}setOffsetX(t){return this.x_offset=t,this}setOffsetY(t){return this.y_offset=t,this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.getModifierStartXY(this.position,this.index);let s=i.x+this.x_shift+this.x_offset,n=i.y+this.y_shift+this.y_offset+5;switch(this.position){case O.Position.ABOVE:s-=4,n-=12;break;case O.Position.BELOW:s-=2,n+=10;break;case O.Position.LEFT:s-=this.width;break;case O.Position.RIGHT:s+=1;break;default:throw new d("InvalidPosition",`The position ${this.position} does not exist`)}t.save(),t.setFont(this.textFont),t.fillText(""+this.finger,s,n),t.restore()}}At.TEXT_FONT={family:k.SANS_SERIF,size:9,weight:b.BOLD,style:w.NORMAL};class Ft extends A{constructor(t,e){super(),this.setNotes(t),this.text=e,this.render_options={cp1:8,cp2:12,text_shift_x:0,first_x_shift:0,last_x_shift:0,y_shift:7,tie_spacing:0},this.resetFont()}static get CATEGORY(){return c.StaveTie}setDirection(t){return this.direction=t,this}setNotes(t){if(!t.first_note&&!t.last_note)throw new d("BadArguments","Tie needs to have either first_note or last_note set.");if(t.first_indices||(t.first_indices=[0]),t.last_indices||(t.last_indices=[0]),t.first_indices.length!==t.last_indices.length)throw new d("BadArguments","Tied notes must have same number of indices.");return this.notes=t,this}isPartial(){return!this.notes.first_note||!this.notes.last_note}renderTie(t){if(0===t.first_ys.length||0===t.last_ys.length)throw new d("BadArguments","No Y-values to render");const e=this.checkContext();let i=this.render_options.cp1,s=this.render_options.cp2;Math.abs(t.last_x_px-t.first_x_px)<10&&(i=2,s=8);const n=this.render_options.first_x_shift,a=this.render_options.last_x_shift,o=this.render_options.y_shift*t.direction,r=this.notes.first_indices,h=this.notes.last_indices;for(let c=0;cMath.pow(this.options.softmaxFactor,e.getTicks().value()/t))).reduce(((t,e)=>t+e),0),this.expTicksUsed}softmax(t){this.expTicksUsed||(this.expTicksUsed=this.reCalculateExpTicksUsed());const e=this.ticksUsed.value();return(t=>Math.pow(this.options.softmaxFactor,t/e))(t)/this.expTicksUsed}addTickable(t){if(!t.shouldIgnoreTicks()){const e=t.getTicks();if(this.ticksUsed.add(e),this.expTicksUsed=0,(this.mode===bt.STRICT||this.mode===bt.FULL)&&this.ticksUsed.greaterThan(this.totalTicks))throw this.ticksUsed.subtract(e),new d("BadArgument","Too many ticks.");e.lessThan(this.smallestTickCount)&&(this.smallestTickCount=e.clone()),this.resolutionMultiplier=this.ticksUsed.denominator,this.totalTicks.add(0,this.ticksUsed.denominator)}return this.tickables.push(t),t.setVoice(this),this}addTickables(t){for(let e=0;e{e.getStave()||e.setStave(t)})),this.preFormatted=!0,this}checkStave(){return g(this.stave,"NoStave","No stave attached to instance.")}draw(t=this.checkContext(),e){let i;e=null!=e?e:this.stave,this.setRendered();for(let s=0;s1){const e=new Ne(t);e.render_options.beam_width=3,e.render_options.partial_beam_length=4,this.beams.push(e)}return this}setWidth(t){return this.width=t,this}getWidth(){return this.width}getGraceNotes(){return this.grace_notes}draw(){const t=this.checkContext(),e=this.checkAttachedNote();if(this.setRendered(),function(...t){Mt.DEBUG&&u("Vex.Flow.GraceNoteGroup",t)}("Drawing grace note group for:",e),this.alignSubNotesWithNote(this.getGraceNotes(),e),this.grace_notes.forEach((e=>e.setContext(t).draw())),this.beams.forEach((e=>e.setContext(t).draw())),this.show_slur){const i=o(e),s=i?Ft:Pt;this.slur=new s({last_note:this.grace_notes[0],first_note:e,first_indices:[0],last_indices:[0]}),this.slur.render_options.cp2=12,this.slur.render_options.y_shift=(i?7:5)+this.render_options.slur_y_shift,this.slur.setContext(t).draw()}}}Mt.DEBUG=!1;class Rt extends O{constructor(t){super(),this.preFormatted=!1,this.position=O.Position.LEFT,this.subNotes=t,this.subNotes.forEach((t=>{t.setIgnoreTicks(!1)})),this.width=0,this.formatter=new we,this.voice=new Bt({num_beats:4,beat_value:4,resolution:K.RESOLUTION}).setStrict(!1),this.voice.addTickables(this.subNotes)}static get CATEGORY(){return c.NoteSubGroup}static format(t,e){if(!t||0===t.length)return!1;let i=0;for(let e=0;ee.setContext(t).drawWithStyle()))}}class Ot{constructor(t){this.preFormatted=!1,this.postFormatted=!1,this.tickID=t&&t.tickID?t.tickID:0,this.currentTick=new x(0,1),this.maxTicks=new x(0,1),this.maxTickable=void 0,this.minTicks=void 0,this.minTickable=void 0,this.padding=1,this.x=0,this.xBase=0,this.xOffset=0,this.tickables=[],this.tickablesByVoice={},this.notePx=0,this.glyphPx=0,this.leftDisplacedHeadPx=0,this.rightDisplacedHeadPx=0,this.modLeftPx=0,this.modRightPx=0,this.totalLeftPx=0,this.totalRightPx=0,this.tContexts=[],this.width=0,this.formatterMetrics={freedom:{left:0,right:0}}}static getNextContext(t){const e=t.tContexts,i=e.indexOf(t);if(i+1t.isCenterAligned()))}getMetrics(){const{width:t,glyphPx:e,notePx:i,leftDisplacedHeadPx:s,rightDisplacedHeadPx:n,modLeftPx:a,modRightPx:o,totalLeftPx:r,totalRightPx:h}=this;return{width:t,glyphPx:e,notePx:i,leftDisplacedHeadPx:s,rightDisplacedHeadPx:n,modLeftPx:a,modRightPx:o,totalLeftPx:r,totalRightPx:h}}getCurrentTick(){return this.currentTick}setCurrentTick(t){this.currentTick=t,this.preFormatted=!1}addTickable(t,e){if(!t)throw new d("BadArgument","Invalid tickable added.");if(!t.shouldIgnoreTicks()){const e=t.getTicks();e.greaterThan(this.maxTicks)&&(this.maxTicks=e.clone(),this.maxTickable=t),(null==this.minTicks||e.lessThan(this.minTicks))&&(this.minTicks=e.clone(),this.minTickable=t)}return t.setTickContext(this),this.tickables.push(t),this.tickablesByVoice[e||0]=t,this.preFormatted=!1,this}preFormat(){if(this.preFormatted)return this;for(let t=0;t=0,!this.ornament)throw new d("ArgumentError",`Ornament not found: '${this.type}'`);this.x_shift=e?e.xOffset:0,this.y_shift=e?e.yOffset:0,this.glyph=new R(this.ornament.code,this.render_options.font_scale,{category:`ornament.${this.ornament.code}`}),Lt.ornamentNoteTransition.indexOf(this.type)>=0&&(this.delayed=!0),e||this.glyph.setOrigin(.5,1)}static get CATEGORY(){return c.Ornament}static format(t,e){if(!t||0===t.length)return!1;let i=0,s=e.right_shift,n=e.left_shift,a=0;for(let o=0;o=0&&(r.x_shift+=s+2),Lt.ornamentAttack.indexOf(r.type)>=0&&(r.x_shift-=n+2),r.reportedWidth&&r.x_shift<0?n+=r.reportedWidth:r.reportedWidth&&r.x_shift>0?s+=r.reportedWidth:i=Math.max(r.getWidth(),i),Lt.ornamentArticulation.indexOf(r.type)>=0){g(r.note,"NoAttachedNote").getLineNumber()>=3||r.getPosition()===O.Position.ABOVE?(e.top_text_line+=h,r.y_shift+=a,a-=r.glyph.bbox.getH()):(e.text_line+=h,r.y_shift+=a,a+=r.glyph.bbox.getH())}else r.getPosition()===O.Position.ABOVE?(r.setTextLine(e.top_text_line),e.top_text_line+=h):(r.setTextLine(e.text_line),e.text_line+=h)}return e.left_shift=n+i/2,e.right_shift=s+i/2,!0}static get ornamentNoteTransition(){return["flip","jazzTurn","smear"]}static get ornamentAttack(){return["scoop"]}static get ornamentAlignWithNoteHead(){return["doit","fall","fallLong","doitLong","bend","plungerClosed","plungerOpen","scoop"]}static get ornamentRelease(){return["doit","fall","fallLong","doitLong","jazzTurn","smear","flip"]}static get ornamentArticulation(){return["bend","plungerClosed","plungerOpen"]}getMetrics(){return K.currentMusicFont().getMetrics().glyphs.jazzOrnaments[this.ornament.code]}setDelayed(t){return this.delayed=t,this}setUpperAccidental(t){const e=this.render_options.font_scale/1.3;return this.accidentalUpper=new R(K.accidentalCodes(t).code,e),this.accidentalUpper.setOrigin(.5,1),this}setLowerAccidental(t){const e=this.render_options.font_scale/1.3;return this.accidentalLower=new R(K.accidentalCodes(t).code,e),this.accidentalLower.setOrigin(.5,1),this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.getStemDirection(),s=e.checkStave(),n=Object.keys(this.getAttribute("classes")).join(" ");t.openGroup(n,this.getAttribute("id"));const a=e.checkStem().getExtents();let o=i===Q.DOWN?a.baseY:a.topY;h(e)&&(e.hasStem()?i===Q.DOWN&&(o=s.getYForTopText(this.text_line)):o=s.getYForTopText(this.text_line));const r=i===Q.DOWN,c=s.getSpacingBetweenLines();let d=1;!r&&e.hasBeam()&&(d+=.5);const l=o-c*(this.text_line+d),g=e.getModifierStartXY(this.position,this.index);let p=g.x,m=this.ornamentAlignWithNoteHead?g.y:Math.min(s.getYForTopText(this.text_line),l);if(m+=this.y_shift,this.delayed){let t=0;const i=p-(s.getX()-10);if(void 0!==this.delayXShift)t=this.delayXShift;else{t+=this.glyph.getMetrics().width/2;const n=Ot.getNextContext(e.getTickContext());t+=n?.5*(n.getX()-i):.5*(s.getX()+s.getWidth()-i),this.delayXShift=t}p+=t}!function(...t){Lt.DEBUG&&u("Vex.Flow.Ornament",t)}("Rendering ornament: ",this.ornament,p,m),this.accidentalLower&&(this.accidentalLower.render(t,p,m),m-=this.accidentalLower.getMetrics().height,m-=this.render_options.accidentalLowerPadding),this.stemUpYOffset&&e.hasStem()&&1===e.getStemDirection()&&(m+=this.stemUpYOffset),e.getLineNumber()<5&&Lt.ornamentNoteTransition.indexOf(this.type)>=0&&(m=e.checkStave().getBoundingBox().getY()+40),this.glyph.render(t,p+this.x_shift,m),this.accidentalUpper&&(m-=this.glyph.getMetrics().height+this.render_options.accidentalUpperPadding,this.accidentalUpper.render(t,p,m)),t.closeGroup()}}Lt.DEBUG=!1;class It extends O{constructor(t){super(),this.position=null!=t?t:O.Position.LEFT,this.point=K.currentMusicFont().lookupMetric("parenthesis.default.point"),this.setWidth(K.currentMusicFont().lookupMetric("parenthesis.default.width"))}static get CATEGORY(){return c.Parenthesis}static buildAndAttach(t){for(const e of t)for(let t=0;th+n.width?s:h+n.width),o===P.LEFT&&(h=a.getLeftParenthesisPx(r),i=i>h+n.width?i:h+n.width),n.setXShift(h)}return e.left_shift+=i,e.right_shift+=s,!0}setNote(t){return this.note=t,this.point=K.currentMusicFont().lookupMetric("parenthesis.default.point"),this.setWidth(K.currentMusicFont().lookupMetric("parenthesis.default.width")),n(t)&&(this.point=K.currentMusicFont().lookupMetric("parenthesis.gracenote.point"),this.setWidth(K.currentMusicFont().lookupMetric("parenthesis.gracenote.width"))),this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.getModifierStartXY(this.position,this.index,{forceFlagRight:!0}),s=i.x+this.x_shift,n=i.y+this.y_shift;this.position==O.Position.RIGHT?R.renderGlyph(t,s+1,n,this.point,"noteheadParenthesisRight",{category:"noteHead.standard.noteheadParenthesisRight"}):this.position==O.Position.LEFT&&R.renderGlyph(t,s-2,n,this.point,"noteheadParenthesisLeft",{category:"noteHead.standard.noteheadParenthesisLeft"})}}class Wt extends mt{constructor(t){super(t),this.custom_glyph=!1,this.stem_up_x_offset=0,this.stem_down_x_offset=0,this.index=t.index,this.x=t.x||0,this.y=t.y||0,t.note_type&&(this.noteType=t.note_type),this.displaced=t.displaced||!1,this.stem_direction=t.stem_direction||Q.UP,this.line=t.line||0,this.glyph=K.getGlyphProps(this.duration,this.noteType),g(this.glyph,"BadArguments",`No glyph found for duration '${this.duration}' and type '${this.noteType}'`),this.glyph_code=this.glyph.code_head,this.x_shift=t.x_shift||0,t.custom_glyph_code&&(this.custom_glyph=!0,this.glyph_code=t.custom_glyph_code,this.stem_up_x_offset=t.stem_up_x_offset||0,this.stem_down_x_offset=t.stem_down_x_offset||0),this.style=t.style,this.slashed=t.slashed||!1,this.render_options=Object.assign(Object.assign({},this.render_options),{glyph_font_scale:t.glyph_font_scale||K.NOTATION_FONT_SCALE}),this.setWidth(this.glyph.getWidth(this.render_options.glyph_font_scale))}static get CATEGORY(){return c.NoteHead}getWidth(){return this.width}isDisplaced(){return!0===this.displaced}getGlyph(){return this.glyph}setX(t){return this.x=t,this}getY(){return this.y}setY(t){return this.y=t,this}getLine(){return this.line}setLine(t){return this.line=t,this}getAbsoluteX(){const t=this.preFormatted?super.getAbsoluteX():this.x,e=Q.WIDTH/2,i=K.currentMusicFont(),s=i.lookupMetric("notehead.shiftX",0)*this.stem_direction,n=i.lookupMetric("noteHead.displaced.shiftX",0)*this.stem_direction;return t+s+(this.displaced?(this.width-e)*this.stem_direction+n:0)}getBoundingBox(){if(!this.preFormatted)throw new d("UnformattedNote","Can't call getBoundingBox on an unformatted note.");const t=this.checkStave().getSpacingBetweenLines(),e=t/2,i=this.y-e;return new y(this.getAbsoluteX(),i,this.width,t)}setStave(t){const e=this.getLine();return this.stave=t,this.stave&&(this.setY(this.stave.getYForNote(e)),this.setContext(this.stave.getContext())),this}preFormat(){if(this.preFormatted)return this;const t=this.getWidth()+this.leftDisplacedHeadPx+this.rightDisplacedHeadPx;return this.setWidth(t),this.preFormatted=!0,this}draw(){const t=this.checkContext();this.setRendered();let e=this.getAbsoluteX();this.custom_glyph&&(e+=this.stem_direction===Q.UP?this.stem_up_x_offset:this.stem_down_x_offset);const i=this.y;!function(...t){Wt.DEBUG&&u("Vex.Flow.NoteHead",t)}("Drawing note head '",this.noteType,this.duration,"' at",e,i);const s=this.stem_direction,n=this.render_options.glyph_font_scale;this.style&&this.applyStyle(t);const a=`${this.glyph_code}Stem${s===Q.UP?"Up":"Down"}`;if("s"===this.noteType){const n=this.checkStave().getSpacingBetweenLines();!function(t,e,i,s,n,a){const o=K.SLASH_NOTEHEAD_WIDTH;t.save(),t.setLineWidth(K.STEM_WIDTH);let r=!1;if(K.durationToNumber(e)>2&&(r=!0),r||(i-=K.STEM_WIDTH/2*n),t.beginPath(),t.moveTo(i,s+a),t.lineTo(i,s+1),t.lineTo(i+o,s-a),t.lineTo(i+o,s),t.lineTo(i,s+a),t.closePath(),r?t.fill():t.stroke(),K.durationToFraction(e).equals(.5)){const e=[-3,-1,o+1,o+3];for(let n=0;n2?i[1]:void 0;let o=s>2?i[2]:i[1];2===s&&-1===n.stemDirection&&1===o.stemDirection&&(n=i[1],o=i[0]);const r=Math.max(n.voice_shift,o.voice_shift);let h=0;if(2===s){const t=n.stemDirection===o.stemDirection?0:.5;return n.minLine<=o.maxLine+t&&(n.isrest?Ut(n,0,1):o.isrest?Ut(o,0,-1):n.stemDirection===o.stemDirection?(h=r+2,n.note.setXShift(h)):(h=r+2,o.note.setXShift(h))),e.right_shift+=h,!0}if(!a)throw new d("InvalidState","noteM not defined.");if(a.isrest&&!n.isrest&&!o.isrest&&(n.minLine<=a.maxLine||a.minLine<=o.maxLine)){return a.maxLine-a.minLinet.postFormat())),!0)}reset(){super.reset();const t=this._noteHeads.map((t=>t.getStyle()));this.buildNoteHeads(),this._noteHeads.forEach(((e,i)=>{const s=t[i];s&&e.setStyle(s)}));const e=this.stave;return e&&this._noteHeads.forEach((t=>t.setStave(e))),this.calcNoteDisplacements(),this}setBeam(t){return this.beam=t,this.calcNoteDisplacements(),this.stem&&this.stem.setExtension(this.getStemExtension()),this}buildStem(){return this.setStem(new Q({hide:!!this.isRest()})),this}buildNoteHeads(){this._noteHeads=[];const t=this.getStemDirection(),e=this.getKeys();let i,s,n,a,o,r=!1;t===Q.UP?(n=0,a=e.length,o=1):(n=e.length-1,a=-1,o=-1);for(let e=n;e!==a;e+=o){const n=this.keyProps[e],a=n.line;void 0===i?i=a:(s=Math.abs(i-a),0===s||.5===s?r=!r:(r=!1,this.use_default_head_x=!0)),i=a;const o=new Wt({duration:this.duration,note_type:this.noteType,displaced:r,stem_direction:t,custom_glyph_code:n.code,glyph_font_scale:this.render_options.glyph_font_scale,x_shift:n.shift_right,stem_up_x_offset:n.stem_up_x_offset,stem_down_x_offset:n.stem_down_x_offset,line:n.line});this._noteHeads[e]=o}}autoStem(){this.setStemDirection(this.calculateOptimalStemDirection())}calculateOptimalStemDirection(){this.minLine=this.keyProps[0].line,this.maxLine=this.keyProps[this.keyProps.length-1].line;return(this.minLine+this.maxLine)/2<3?Q.UP:Q.DOWN}calculateKeyProps(){let t;for(let e=0;e0&&(this.keyProps[e-1].displaced=!0)),t=a,this.keyProps.push(n)}t=void 0,this.keyProps.forEach((e=>{t&&e.linet.line-e.line))}getBoundingBox(){var t,e;if(!this.preFormatted)throw new d("UnformattedNote","Can't call getBoundingBox on an unformatted note.");const{width:i,modLeftPx:s,leftDisplacedHeadPx:n}=this.getMetrics(),a=this.getAbsoluteX()-s-n;let o=0,r=0;const h=(null!==(e=null===(t=this.getStave())||void 0===t?void 0:t.getSpacingBetweenLines())&&void 0!==e?e:0)/2,c=2*h;if(this.isRest()){const t=this.ys[0],e=K.durationToFraction(this.duration);e.equals(1)||e.equals(2)?(o=t-h,r=t+h):(o=t-this.glyph.line_above*c,r=t+this.glyph.line_below*c)}else if(this.glyph.stem){const t=this.getStemExtents();t.baseY+=h*this.getStemDirection(),o=Math.min(t.topY,t.baseY),r=Math.max(t.topY,t.baseY)}else{o=0,r=0;for(let t=0;te&&(e=s):s1}hasStem(){return this.glyph.stem}hasFlag(){return super.hasFlag()&&!this.isRest()}getStemX(){return"r"===this.noteType?this.getCenterGlyphX():super.getStemX()+(this.stem_direction?Q.WIDTH/(2*-this.stem_direction):0)}getYForTopText(t){const e=this.getStemExtents();return Math.min(this.checkStave().getYForTopText(t),e.topY-this.render_options.annotation_spacing*(t+1))}getYForBottomText(t){const e=this.getStemExtents();return Math.max(this.checkStave().getYForTopText(t),e.baseY+this.render_options.annotation_spacing*t)}setStave(t){super.setStave(t);const e=this._noteHeads.map((e=>(e.setStave(t),e.getY())));if(this.setYs(e),this.stem){const{y_top:t,y_bottom:e}=this.getNoteHeadBounds();this.stem.setYBounds(t,e)}return this}isDisplaced(){return this.displaced}setNoteDisplaced(t){return this.displaced=t,this}getTieRightX(){let t=this.getAbsoluteX();return t+=this.getGlyphWidth()+this.x_shift+this.rightDisplacedHeadPx,this.modifierContext&&(t+=this.modifierContext.getRightShift()),t}getTieLeftX(){let t=this.getAbsoluteX();return t+=this.x_shift-this.leftDisplacedHeadPx,t}getLineForRest(){let t=this.keyProps[0].line;if(this.keyProps.length>1){const e=this.keyProps[this.keyProps.length-1].line;t=m(Math.max(t,e),Math.min(t,e))}return t}getModifierStartXY(t,e,i={}){var s,n;if(!this.preFormatted)throw new d("UnformattedNote","Can't call GetModifierStartXY on an unformatted note");if(0===this.ys.length)throw new d("NoYValues","No Y-Values calculated for this note.");const{ABOVE:a,BELOW:o,LEFT:r,RIGHT:h}=O.Position;let c=0;return t===r?c=-2:t===h?(c=this.getGlyphWidth()+this.x_shift+2,this.stem_direction===Q.UP&&this.hasFlag()&&(i.forceFlagRight||((t,e)=>e===(t.getStemDirection()===Q.UP?t.keyProps.length-1:0))(this,e))&&(c+=null!==(n=null===(s=null==this?void 0:this.flag)||void 0===s?void 0:s.getMetrics().width)&&void 0!==n?n:0)):t!==o&&t!==a||(c=this.getGlyphWidth()/2),{x:this.getAbsoluteX()+c,y:this.ys[e]}}setStyle(t){var e;return super.setStyle(t),this._noteHeads.forEach((e=>e.setStyle(t))),null===(e=this.stem)||void 0===e||e.setStyle(t),this}setStemStyle(t){const e=this.getStem();return null==e||e.setStyle(t),this}getStemStyle(){var t;return null===(t=this.stem)||void 0===t?void 0:t.getStyle()}setLedgerLineStyle(t){this.ledgerLineStyle=t}getLedgerLineStyle(){return this.ledgerLineStyle}setFlagStyle(t){this.flagStyle=t}getFlagStyle(){return this.flagStyle}setKeyStyle(t,e){return this._noteHeads[t].setStyle(e),this}setKeyLine(t,e){return this.keyProps[t].line=e,this.reset(),this}getKeyLine(t){return this.keyProps[t].line}getVoiceShiftWidth(){return this.getGlyphWidth()*(this.displaced?2:1)}calcNoteDisplacements(){this.setLeftDisplacedHeadPx(this.displaced&&this.stem_direction===Q.DOWN?this.getGlyphWidth():0),this.setRightDisplacedHeadPx(!this.hasFlag()&&this.displaced&&this.stem_direction===Q.UP?this.getGlyphWidth():0)}preFormat(){if(this.preFormatted)return;let t=0;this.modifierContext&&(this.modifierContext.preFormat(),0===this.modifierContext.getWidth()&&(t=Yt.minNoteheadPadding));let e=this.getGlyphWidth()+this.leftDisplacedHeadPx+this.rightDisplacedHeadPx+t;this.shouldDrawFlag()&&this.stem_direction===Q.UP&&(e+=this.getGlyphWidth()),this.setWidth(e),this.preFormatted=!0}getNoteHeadBounds(){let t,e,i,s,n=1/0,a=-1/0,o=this.checkStave().getNumLines(),r=1,h=o,c=r;return this._noteHeads.forEach((d=>{const l=d.getLine(),g=d.getY();n=Math.min(g,n),a=Math.max(g,a),void 0===e&&d.isDisplaced()&&(e=d.getAbsoluteX()),void 0!==t||d.isDisplaced()||(t=d.getAbsoluteX()),o=Math.max(l,o),r=Math.min(l,r),d.isDisplaced()?(i=void 0===i?l:Math.max(l,i),s=void 0===s?l:Math.min(l,s)):(h=Math.max(l,h),c=Math.min(l,c))}),this),{y_top:n,y_bottom:a,displaced_x:e,non_displaced_x:t,highest_line:o,lowest_line:r,highest_displaced_line:i,lowest_displaced_line:s,highest_non_displaced_line:h,lowest_non_displaced_line:c}}getNoteHeadBeginX(){return this.getAbsoluteX()+this.x_shift}getNoteHeadEndX(){return this.getNoteHeadBeginX()+this.getGlyphWidth()}get noteHeads(){return this._noteHeads.slice()}get note_heads(){return console.warn("StaveNote.note_heads is deprecated. Use StaveNote.noteHeads instead.","This accessor will be removed in VexFlow 5.0."),this.noteHeads}drawLedgerLines(){const t=this.checkStave(),{glyph:e,render_options:{stroke_px:i}}=this,s=this.checkContext(),n=e.getWidth()+2*i,a=2*(e.getWidth()+i)-Q.WIDTH/2;if(this.isRest())return;if(!s)throw new d("NoCanvasContext","Can't draw without a canvas context.");const{highest_line:o,lowest_line:r,highest_displaced_line:h,highest_non_displaced_line:c,lowest_displaced_line:l,lowest_non_displaced_line:g,displaced_x:u,non_displaced_x:p}=this.getNoteHeadBounds();if(o<6&&r>0)return;const m=Math.min(null!=u?u:0,null!=p?p:0),f=(t,e,o)=>{let r;r=o&&e?m-i:e?(null!=p?p:0)-i:(null!=u?u:0)-i;const h=e&&o?a:n;s.beginPath(),s.moveTo(r,t),s.lineTo(r+h,t),s.stroke()},_=Object.assign(Object.assign({},t.getDefaultLedgerLineStyle()),this.getLedgerLineStyle());this.applyStyle(s,_);for(let e=6;e<=o;++e){const i=void 0!==p&&e<=c,s=void 0!==h&&e<=h;f(t.getYForNote(e),i,s)}for(let e=0;e>=r;--e){const i=void 0!==p&&e>=g,s=void 0!==l&&e>=l;f(t.getYForNote(e),i,s)}this.restoreStyle(s,_)}drawModifiers(){const t=this.checkContext();t.openGroup("modifiers");for(let e=0;e{t.openGroup("notehead",void 0,{pointerBBox:!0}),e.setContext(t).draw(),t.closeGroup()}))}drawStem(t){var e;const i=this.checkContext();t&&this.setStem(new Q(t)),this.shouldDrawFlag()&&this.stem&&this.stem.adjustHeightForFlag(),i.openGroup("stem",void 0,{pointerBBox:!0}),null===(e=this.stem)||void 0===e||e.setContext(i).draw(),i.closeGroup()}getStemExtension(){const t=super.getStemExtension();if(!this.glyph.stem)return t;const e=this.getStemDirection();if(e!==this.calculateOptimalStemDirection())return t;let i;i=e===Q.UP?3-this.maxLine:this.minLine-3;const s=i-3.5;if(s<=0)return t;const n=this.getStave();let a=10;return null!=n&&(a=n.getSpacingBetweenLines()),t+s*a}draw(){var t;if(0===this.ys.length)throw new d("NoYValues","Can't draw note without Y values.");const e=this.checkContext(),i=this.getNoteHeadBeginX(),s=this.hasStem()&&!this.beam;this._noteHeads.forEach((t=>t.setX(i)));const n=this.getStemX();null===(t=this.stem)||void 0===t||t.setNoteHeadXBounds(n,n),function(...t){Yt.DEBUG&&u("Vex.Flow.StaveNote",t)}("Rendering ",this.isChord()?"chord :":"note :",this.keys),this.applyStyle(),this.setAttribute("el",e.openGroup("stavenote",this.getAttribute("id"))),this.drawLedgerLines(),e.openGroup("note",void 0,{pointerBBox:!0}),s&&this.drawStem(),this.drawNoteHeads(),this.drawFlag(),e.closeGroup(),this.drawModifiers(),e.closeGroup(),this.restoreStyle(),this.setRendered()}}function jt(t){if(!t)return!1;const e=l();return"function"==typeof e.HTMLCanvasElement&&t instanceof e.HTMLCanvasElement||"function"==typeof t.getContext&&"function"==typeof t.toDataURL}Yt.DEBUG=!1;class Ht extends ut{constructor(t){super(),this.textHeight=0,this.context2D=t,t.canvas?this.canvas=t.canvas:this.canvas={width:Ht.WIDTH,height:Ht.HEIGHT}}static get WIDTH(){return 600}static get HEIGHT(){return 400}static get CANVAS_BROWSER_SIZE_LIMIT(){return 32767}static sanitizeCanvasDims(t,e){const i=this.CANVAS_BROWSER_SIZE_LIMIT;return Math.max(t,e)>i&&(p("Canvas dimensions exceed browser limit. Cropping to "+i),t>i&&(t=i),e>i&&(e=i)),[t,e]}clear(){this.context2D.clearRect(0,0,this.canvas.width,this.canvas.height)}openGroup(t,e,i){}closeGroup(){}add(t){}setFillStyle(t){return this.context2D.fillStyle=t,this}setBackgroundFillStyle(t){return this}setStrokeStyle(t){return this.context2D.strokeStyle=t,this}setShadowColor(t){return this.context2D.shadowColor=t,this}setShadowBlur(t){const e=this.context2D.getTransform(),i=Math.sqrt(e.a*e.a+e.b*e.b+e.c*e.c+e.d*e.d);return this.context2D.shadowBlur=i*t,this}setLineWidth(t){return this.context2D.lineWidth=t,this}setLineCap(t){return this.context2D.lineCap=t,this}setLineDash(t){return this.context2D.setLineDash(t),this}scale(t,e){return this.context2D.scale(t,e),this}resize(t,e){const i=this.context2D.canvas,s=l().devicePixelRatio||1;return[t,e]=Ht.sanitizeCanvasDims(t*s,e*s),t=t/s|0,e=e/s|0,i.width=t*s,i.height=e*s,jt(i)&&(i.style.width=t+"px",i.style.height=e+"px"),this.scale(s,s)}rect(t,e,i,s){return this.context2D.rect(t,e,i,s),this}fillRect(t,e,i,s){return this.context2D.fillRect(t,e,i,s),this}clearRect(t,e,i,s){return this.context2D.clearRect(t,e,i,s),this}beginPath(){return this.context2D.beginPath(),this}moveTo(t,e){return this.context2D.moveTo(t,e),this}lineTo(t,e){return this.context2D.lineTo(t,e),this}bezierCurveTo(t,e,i,s,n,a){return this.context2D.bezierCurveTo(t,e,i,s,n,a),this}quadraticCurveTo(t,e,i,s){return this.context2D.quadraticCurveTo(t,e,i,s),this}arc(t,e,i,s,n,a){return this.context2D.arc(t,e,i,s,n,a),this}fill(){return this.context2D.fill(),this}stroke(){return this.context2D.stroke(),this}closePath(){return this.context2D.closePath(),this}measureText(t){const e=this.context2D.measureText(t);let i=0,s=0;return e.fontBoundingBoxAscent?(i=-e.fontBoundingBoxAscent,s=e.fontBoundingBoxDescent+e.fontBoundingBoxAscent):(i=-e.actualBoundingBoxAscent,s=e.actualBoundingBoxDescent+e.actualBoundingBoxAscent),{x:0,y:i,width:e.width,height:s}}fillText(t,e,i){return this.context2D.fillText(t,e,i),this}save(){return this.context2D.save(),this}restore(){return this.context2D.restore(),this}set fillStyle(t){this.context2D.fillStyle=t}get fillStyle(){return this.context2D.fillStyle}set strokeStyle(t){this.context2D.strokeStyle=t}get strokeStyle(){return this.context2D.strokeStyle}setFont(t,e,i,s){const n=k.validate(t,e,i,s);return this.context2D.font=k.toCSSString(n),this.textHeight=k.convertSizeToPixelValue(n.size),this}getFont(){return this.context2D.font}}const Xt={path:{x:!0,y:!0,width:!0,height:!0,"font-family":!0,"font-weight":!0,"font-style":!0,"font-size":!0},rect:{"font-family":!0,"font-weight":!0,"font-style":!0,"font-size":!0},text:{width:!0,height:!0}},Vt="http://www.w3.org/2000/svg",zt=2*Math.PI;class Kt extends ut{constructor(t){super(),this.width=0,this.height=0,this.backgroundFillStyle="white",this.fontCSSString="",this.element=t;const e=this.create("svg");this.element.appendChild(e),this.svg=e,this.parent=this.svg,this.groups=[this.svg],this.path="",this.pen={x:NaN,y:NaN},this.lineWidth=1;const i={"font-family":k.SANS_SERIF,"font-size":k.SIZE+"pt","font-weight":b.NORMAL,"font-style":w.NORMAL};this.state=Object.assign({scale:{x:1,y:1}},i),this.attributes=Object.assign({"stroke-width":.3,"stroke-dasharray":"none",fill:"black",stroke:"black"},i),this.shadow_attributes={width:0,color:"black"},this.state_stack=[]}create(t){return document.createElementNS(Vt,t)}openGroup(t,e,i){const s=this.create("g");return this.groups.push(s),this.parent.appendChild(s),this.parent=s,t&&s.setAttribute("class",f(t)),e&&s.setAttribute("id",f(e)),i&&i.pointerBBox&&s.setAttribute("pointer-events","bounding-box"),s}closeGroup(){this.groups.pop(),this.parent=this.groups[this.groups.length-1]}add(t){this.parent.appendChild(t)}setFillStyle(t){return this.attributes.fill=t,this}setBackgroundFillStyle(t){return this.backgroundFillStyle=t,this}setStrokeStyle(t){return this.attributes.stroke=t,this}setShadowColor(t){return this.shadow_attributes.color=t,this}setShadowBlur(t){return this.shadow_attributes.width=t,this}setLineWidth(t){return this.attributes["stroke-width"]=t,this.lineWidth=t,this}setLineDash(t){if("[object Array]"===Object.prototype.toString.call(t))return this.attributes["stroke-dasharray"]=t.join(","),this;throw new d("ArgumentError","lineDash must be an array of integers.")}setLineCap(t){return this.attributes["stroke-linecap"]=t,this}resize(t,e){this.width=t,this.height=e,this.element.style.width=t.toString(),this.svg.style.width=t.toString(),this.svg.style.height=e.toString();const i={width:t,height:e};return this.applyAttributes(this.svg,i),this.scale(this.state.scale.x,this.state.scale.y),this}scale(t,e){this.state.scale={x:t,y:e};const i=this.width/t,s=this.height/e;return this.setViewBox(0,0,i,s),this}setViewBox(t,e,i,s){if("string"==typeof t)this.svg.setAttribute("viewBox",t);else{const n=t+" "+e+" "+i+" "+s;this.svg.setAttribute("viewBox",n)}}applyAttributes(t,e){const i=Xt[t.nodeName];for(const s in e)i&&i[s]||t.setAttributeNS(null,s,e[s]);return t}clear(){for(;this.svg.lastChild;)this.svg.removeChild(this.svg.lastChild);this.scale(this.state.scale.x,this.state.scale.y)}rect(t,e,i,s,n){s<0&&(e+=s,s*=-1);const a=this.create("rect");return n=null!=n?n:{fill:"none","stroke-width":this.lineWidth,stroke:"black"},this.applyAttributes(a,Object.assign({x:t,y:e,width:i,height:s},n)),this.add(a),this}fillRect(t,e,i,s){const n={fill:this.attributes.fill};return this.rect(t,e,i,s,n),this}clearRect(t,e,i,s){return this.rect(t,e,i,s,{"stroke-width":0,fill:this.backgroundFillStyle}),this}beginPath(){return this.path="",this.pen.x=NaN,this.pen.y=NaN,this}moveTo(t,e){return this.path+="M"+t+" "+e,this.pen.x=t,this.pen.y=e,this}lineTo(t,e){return this.path+="L"+t+" "+e,this.pen.x=t,this.pen.y=e,this}bezierCurveTo(t,e,i,s,n,a){return this.path+="C"+t+" "+e+","+i+" "+s+","+n+" "+a,this.pen.x=n,this.pen.y=a,this}quadraticCurveTo(t,e,i,s){return this.path+="Q"+t+" "+e+","+i+" "+s,this.pen.x=i,this.pen.y=s,this}arc(t,e,i,s,n,a){const o=t+i*Math.cos(s),r=e+i*Math.sin(s);if(!a&&n-s>=zt||a&&s-n>=zt){const n=t+i*Math.cos(s+Math.PI),a=e+i*Math.sin(s+Math.PI);this.path+=`M${o} ${r} A${i} ${i} 0 0 0 ${n} ${a} `,this.path+=`A${i} ${i} 0 0 0 ${o} ${r}`,this.pen.x=o,this.pen.y=r}else{const h=t+i*Math.cos(n),c=e+i*Math.sin(n);let d;s=_(s),n=_(n),d=Math.abs(n-s)n&&(d=!d);const l=!a;this.path+=`M${o} ${r} A${i} ${i} 0 ${+d} ${+l} ${h} ${c}`,this.pen.x=h,this.pen.y=c}return this}closePath(){return this.path+="Z",this}getShadowStyle(){const t=this.shadow_attributes;return`filter: drop-shadow(0 0 ${t.width/1.5}px ${t.color})`}fill(t){const e=this.create("path");return void 0===t&&(t=Object.assign(Object.assign({},this.attributes),{stroke:"none"})),t.d=this.path,this.shadow_attributes.width>0&&(t.style=this.getShadowStyle()),this.applyAttributes(e,t),this.add(e),this}stroke(){const t=this.create("path"),e=Object.assign(Object.assign({},this.attributes),{fill:"none","stroke-width":this.lineWidth,d:this.path});return this.shadow_attributes.width>0&&(e.style=this.getShadowStyle()),this.applyAttributes(t,e),this.add(t),this}measureText(t){return Kt.measureTextCache.lookup(t,this.svg,this.attributes)}fillText(t,e,i){if(!t||t.length<=0)return this;const s=Object.assign(Object.assign({},this.attributes),{stroke:"none",x:e,y:i}),n=this.create("text");return n.textContent=t,this.applyAttributes(n,s),this.add(n),this}save(){return this.state_stack.push({state:{"font-family":this.state["font-family"],"font-weight":this.state["font-weight"],"font-style":this.state["font-style"],"font-size":this.state["font-size"],scale:this.state.scale},attributes:{"font-family":this.attributes["font-family"],"font-weight":this.attributes["font-weight"],"font-style":this.attributes["font-style"],"font-size":this.attributes["font-size"],fill:this.attributes.fill,stroke:this.attributes.stroke,"stroke-width":this.attributes["stroke-width"],"stroke-dasharray":this.attributes["stroke-dasharray"]},shadow_attributes:{width:this.shadow_attributes.width,color:this.shadow_attributes.color},lineWidth:this.lineWidth}),this}restore(){const t=this.state_stack.pop();if(t){const e=t;this.state["font-family"]=e.state["font-family"],this.state["font-weight"]=e.state["font-weight"],this.state["font-style"]=e.state["font-style"],this.state["font-size"]=e.state["font-size"],this.state.scale=e.state.scale,this.attributes["font-family"]=e.attributes["font-family"],this.attributes["font-weight"]=e.attributes["font-weight"],this.attributes["font-style"]=e.attributes["font-style"],this.attributes["font-size"]=e.attributes["font-size"],this.attributes.fill=e.attributes.fill,this.attributes.stroke=e.attributes.stroke,this.attributes["stroke-width"]=e.attributes["stroke-width"],this.attributes["stroke-dasharray"]=e.attributes["stroke-dasharray"],this.shadow_attributes.width=e.shadow_attributes.width,this.shadow_attributes.color=e.shadow_attributes.color,this.lineWidth=e.lineWidth}return this}set fillStyle(t){this.setFillStyle(t)}get fillStyle(){return this.attributes.fill}set strokeStyle(t){this.setStrokeStyle(t)}get strokeStyle(){return this.attributes.stroke}setFont(t,e,i,s){const n=k.validate(t,e,i,s);this.fontCSSString=k.toCSSString(n);const a={"font-family":n.family,"font-size":n.size,"font-weight":n.weight,"font-style":n.style};return this.attributes=Object.assign(Object.assign({},this.attributes),a),this.state=Object.assign(Object.assign({},this.state),a),this}getFont(){return this.fontCSSString}}var $t,qt,Jt,Qt;Kt.measureTextCache=new class{constructor(){this.cache={}}lookup(t,e,i){let s=this.cache[t];void 0===s&&(s={},this.cache[t]=s);const n=`${i["font-family"]}%${i["font-size"]}%${i["font-weight"]}%${i["font-style"]}`;let a=s[n];return void 0===a&&(a=this.measureImpl(t,e,i),s[n]=a),a}measureImpl(t,e,i){let s=this.txt;s||(s=document.createElementNS(Vt,"text"),this.txt=s),s.textContent=t,s.setAttributeNS(null,"font-family",i["font-family"]),s.setAttributeNS(null,"font-size",i["font-size"]),s.setAttributeNS(null,"font-style",i["font-style"]),s.setAttributeNS(null,"font-weight",i["font-weight"]),e.appendChild(s);const n=s.getBBox();return e.removeChild(s),{x:n.x,y:n.y,width:n.width,height:n.height}}},function(t){t[t.CANVAS=1]="CANVAS",t[t.SVG=2]="SVG"}($t||($t={})),function(t){t[t.NONE=1]="NONE",t[t.UP=2]="UP",t[t.DOWN=3]="DOWN"}(qt||(qt={}));class Zt{constructor(t,e){if(i(t,c.RenderContext))this.ctx=t;else{if(void 0===e)throw new d("InvalidArgument","Missing backend argument");const i=e;let s;if("string"==typeof t){const e=document.getElementById(t);if(!e)throw new d("BadElementId",`Can't find element with ID "${e}"`);s=e}else s=t;if(i===Zt.Backends.CANVAS){if(!jt(s))throw new d("BadElement","CANVAS context requires an HTMLCanvasElement.");const t=s.getContext("2d");if(!t)throw new d("BadElement","Can't get canvas context");this.ctx=new Ht(t)}else{if(i!==Zt.Backends.SVG)throw new d("InvalidBackend",`No support for backend: ${i}`);if(!function(t){if(!t)return!1;const e=l();return"function"==typeof e.HTMLDivElement&&t instanceof e.HTMLDivElement||"function"==typeof t.appendChild&&"object"==typeof t.style}(s))throw new d("BadElement","SVG context requires an HTMLDivElement.");this.ctx=new Kt(s)}}}static buildContext(t,e,i,s,n="#FFF"){const a=new Zt(t,e);i&&s&&a.resize(i,s);const o=a.getContext();return o.setBackgroundFillStyle(n),Zt.lastContext=o,o}static getCanvasContext(t,e,i,s){return Zt.buildContext(t,Zt.Backends.CANVAS,e,i,s)}static getSVGContext(t,e,i,s){return Zt.buildContext(t,Zt.Backends.SVG,e,i,s)}static drawDashedLine(t,e,i,s,n,a){t.beginPath();const o=s-e,r=n-i,h=Math.atan2(r,o);let c=e,d=i;t.moveTo(e,i);let l=0,g=!0;for(;!(o<0?c<=s:c>=s)||!(r<0?d<=n:d>=n);){const e=a[l++%a.length],i=c+Math.cos(h)*e;c=o<0?Math.max(s,i):Math.min(s,i);const u=d+Math.sin(h)*e;d=r<0?Math.max(n,u):Math.min(n,u),g?t.lineTo(c,d):t.moveTo(c,d),g=!g}t.closePath(),t.stroke()}resize(t,e){return this.ctx.resize(t,e),this}getContext(){return this.ctx}}Zt.Backends=$t,Zt.LineEndType=qt,Zt.lastContext=void 0;class te extends O{constructor(t){super(),this.string_number=t,this.setWidth(20),this.position=O.Position.ABOVE,this.x_shift=0,this.y_shift=0,this.text_line=0,this.stem_offset=0,this.x_offset=0,this.y_offset=0,this.dashed=!0,this.leg=Zt.LineEndType.NONE,this.radius=8,this.resetFont()}static get CATEGORY(){return c.StringNumber}static get metrics(){return K.currentMusicFont().getMetrics().glyphs.stringNumber}static format(t,e){const i=e.left_shift,s=e.right_shift;if(!t||0===t.length)return!1;const n=[];let a=null,r=0,h=0;for(let c=0;ce.line-t.line));let c=0,l=0,g=0,u=null,p=null;for(let t=0;tl?e:l):o===O.Position.RIGHT&&(h.setXShift(c),e+=f,g=e>g?e:g),u=d,p=a}return e.left_shift+=l,e.right_shift+=g,!0}setLineEndType(t){return t>=Zt.LineEndType.NONE&&t<=Zt.LineEndType.DOWN&&(this.leg=t),this}setStringNumber(t){return this.string_number=t,this}setOffsetX(t){return this.x_offset=t,this}setOffsetY(t){return this.y_offset=t,this}setLastNote(t){return this.last_note=t,this}setDashed(t){return this.dashed=t,this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.getModifierStartXY(this.position,this.index),s=e.hasStem()?e.getStemDirection():Q.UP;let n=i.x+this.x_shift+this.x_offset,a={};e.hasStem()&&(a=e.checkStem().getExtents());let o=i.y+this.y_shift+this.y_offset;switch(this.position){case O.Position.ABOVE:o=e.getYs().reduce(((t,e)=>tt>e?t:e)),e.hasStem()&&s==Q.DOWN&&(o=a.topY-te.metrics.stemPadding),o+=this.radius+te.metrics.verticalPadding+this.text_line*K.STAVE_LINE_DISTANCE;break;case O.Position.LEFT:n-=this.radius/2+te.metrics.leftPadding;break;case O.Position.RIGHT:n+=this.radius/2+te.metrics.rightPadding;break;default:throw new d("InvalidPosition",`The position ${this.position} is invalid`)}t.save(),t.beginPath(),t.arc(n,o,this.radius,0,2*Math.PI,!1),t.setLineWidth(1.5),t.stroke(),t.setFont(this.textFont);const h=n-t.measureText(this.string_number).width/2;t.fillText(""+this.string_number,h,o+4.5);const c=this.last_note;if(r(c)){const i=c.getStemX()-e.getX()+5;let s,a;switch(t.setStrokeStyle("#000000"),t.setLineCap("round"),t.setLineWidth(.6),this.dashed?Zt.drawDashedLine(t,n+10,o,n+i,o,[3,3]):Zt.drawDashedLine(t,n+10,o,n+i,o,[3,0]),this.leg){case Zt.LineEndType.UP:s=-10,a=this.dashed?[3,3]:[3,0],Zt.drawDashedLine(t,n+i,o,n+i,o+s,a);break;case Zt.LineEndType.DOWN:s=10,a=this.dashed?[3,3]:[3,0],Zt.drawDashedLine(t,n+i,o,n+i,o+s,a)}}t.restore()}}te.TEXT_FONT={family:k.SANS_SERIF,size:k.SIZE,weight:b.BOLD,style:w.NORMAL};class ee extends O{constructor(t,e){super(),this.options=Object.assign({all_voices:!0},e),this.all_voices=this.options.all_voices,this.type=t,this.position=O.Position.LEFT,this.render_options={font_scale:38},this.resetFont(),this.setXShift(0),this.setWidth(10)}static get CATEGORY(){return c.Stroke}static format(t,e){const i=e.left_shift;if(!t||0===t.length)return!1;const s=t.map((t=>{const e=t.getNote(),i=t.checkIndex();if(o(e)){const{line:s}=e.getKeyProps()[i];return{line:s,shift:e.getLeftDisplacedHeadPx(),stroke:t}}if(h(e)){const{str:s}=e.getPositions()[i];return{line:s,shift:0,stroke:t}}throw new d("Internal","Unexpected instance.")})),n=i,a=s.reduce(((t,{stroke:e,shift:i})=>(e.setXShift(n+i),Math.max(e.getWidth()+0,t))),0);return e.left_shift+=a,!0}getPosition(){return this.position}addEndNote(t){return this.note_end=t,this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.getModifierStartXY(this.position,this.index);let s=e.getYs(),n=i.y,r=i.y;const h=i.x-5,c=e.checkStave().getSpacingBetweenLines(),l=this.checkModifierContext().getMembers(e.getCategory());for(let t=0;t0){s-=o.map((t=>t.getTextHeight())).reduce(((t,e)=>t>e?t:e))/K.STAVE_LINE_DISTANCE+1}else e.top_text_line+=1;for(let e=0;e=t.line?i.above:i.below}}this.placeGlyphOnLine(s,this.checkStave(),t.line),this.glyphs.push(s);const a=this.xPositions[this.xPositions.length-1],o=s.getMetrics().width+n;this.xPositions.push(a+o),this.width+=o}cancelKey(t){return this.formatted=!1,this.cancelKeySpec=t,this}convertToCancelAccList(t){const e=K.keySignature(t),i=this.accList.length>0&&e.length>0&&e[0].type!==this.accList[0].type,s=i?e.length:e.length-this.accList.length;if(s<1)return;const n=[];for(let t=0;t0?e[0].type:void 0;let s;if(this.cancelKeySpec&&(s=this.convertToCancelAccList(this.cancelKeySpec)),this.alterKeySpec&&this.convertToAlterAccList(this.alterKeySpec),this.accList.length>0){const n=(this.position===ft.END?t.getEndClef():t.getClef())||t.getClef();s&&this.convertAccLines(n,s.type,s.accList),this.convertAccLines(n,i,e);for(let t=0;t0?"PlusSmall":"Plus";break;case"(":s=i.length>0?"ParensLeftSmall":"ParensLeft";break;case")":s=i.length>0?"ParensRightSmall":"ParensRight"}const n=new R("timeSig"+s,this.timeSignature.point);this.topGlyphs.push(n),r+=null!==(o=n.getMetrics().width)&&void 0!==o?o:0}let h=0;for(let t=0;t0?e.getYForLine(this.timeSignature.topLine):(e.getYForLine(this.timeSignature.topLine)+e.getYForLine(this.timeSignature.bottomLine))/2;for(let t=0;t{const e=t.split("/");if(2!==e.length&&"+"!==e[0]&&"-"!==e[0])throw new d("BadTimeSignature",`Invalid time spec: ${t}. Must be in the form "/"`);e.forEach((e=>{if(0==/^[0-9+\-()]+$/.test(e))throw new d("BadTimeSignature",`Invalid time spec: ${t}. Must contain valid signatures.`)}))})(t);const s=t.split("/");return{num:!0,glyph:this.makeTimeSignatureGlyph(null!==(e=s[0])&&void 0!==e?e:"",null!==(i=s[1])&&void 0!==i?i:"")}}makeTimeSignatureGlyph(t,e){return new ue(this,t,e,"timeSig0",this.point)}getInfo(){return this.info}setTimeSig(t){return this.info=this.parseTimeSpec(t),this}draw(){const t=this.checkStave(),e=t.checkContext();this.setRendered(),e.openGroup("timesignature",this.getAttribute("id")),this.info.glyph.setStave(t),this.info.glyph.setContext(e),this.placeGlyphOnLine(this.info.glyph,t,this.info.line),this.info.glyph.renderToStave(this.x),e.closeGroup()}}const me={[vt.CATEGORY]:0,[ae.CATEGORY]:1,[oe.CATEGORY]:2,[pe.CATEGORY]:3},fe={[pe.CATEGORY]:0,[oe.CATEGORY]:1,[vt.CATEGORY]:2,[ae.CATEGORY]:3};class _e extends A{constructor(t,e,i,s){super(),this.height=0,this.x=t,this.y=e,this.width=i,this.formatted=!1,this.start_x=t+5,this.end_x=t+i,this.modifiers=[],this.measure=0,this.clef="treble",this.endClef=void 0,this.resetFont(),this.options=Object.assign({vertical_bar_width:10,num_lines:5,fill_style:"#999999",left_bar:!0,right_bar:!0,spacing_between_lines_px:K.STAVE_LINE_DISTANCE,space_above_staff_ln:4,space_below_staff_ln:4,top_text_position:1,bottom_text_position:4,line_config:[]},s),this.bounds={x:this.x,y:this.y,w:this.width,h:0},this.defaultLedgerLineStyle={strokeStyle:"#444",lineWidth:1.4},this.resetLines(),this.addModifier(new vt(this.options.left_bar?_t.SINGLE:_t.NONE)),this.addEndModifier(new vt(this.options.right_bar?_t.SINGLE:_t.NONE))}static get CATEGORY(){return c.Stave}static get defaultPadding(){const t=K.currentMusicFont();return t.lookupMetric("stave.padding")+t.lookupMetric("stave.endPaddingMax")}static get rightPadding(){return K.currentMusicFont().lookupMetric("stave.endPaddingMax")}setDefaultLedgerLineStyle(t){this.defaultLedgerLineStyle=t}getDefaultLedgerLineStyle(){return Object.assign(Object.assign({},this.getStyle()),this.defaultLedgerLineStyle)}space(t){return this.options.spacing_between_lines_px*t}resetLines(){this.options.line_config=[];for(let t=0;ti.getWidth()&&(e-=i.getWidth()),e}setRepetitionType(t,e=0){return this.modifiers.push(new re(t,this.x,e)),this}setVoltaType(t,e,i){return this.modifiers.push(new ge(t,e,this.x,i)),this}setSection(t,e,i=0,s){const n=new he(t,this.x+i,e);return s&&n.setFontSize(s),this.modifiers.push(n),this}setTempo(t,e){return this.modifiers.push(new ce(t,this.x,e)),this}setText(t,e,i={}){return this.modifiers.push(new le(t,e,i)),this}getHeight(){return this.height}getSpacingBetweenLines(){return this.options.spacing_between_lines_px}getBoundingBox(){return new y(this.x,this.y,this.width,this.getBottomY()-this.y)}getBottomY(){const t=this.options,e=t.spacing_between_lines_px;return this.getYForLine(t.num_lines)+t.space_below_staff_ln*e}getBottomLineY(){return this.getYForLine(this.options.num_lines)}getYForLine(t){const e=this.options,i=e.spacing_between_lines_px,s=e.space_above_staff_ln;return this.y+t*i+s*i}getLineForY(t){const e=this.options,i=e.spacing_between_lines_px,s=e.space_above_staff_ln;return(t-this.y)/i-s}getYForTopText(t=0){return this.getYForLine(-t-this.options.top_text_position)}getYForBottomText(t=0){return this.getYForLine(this.options.bottom_text_position+t)}getYForNote(t){const e=this.options,i=e.spacing_between_lines_px,s=e.space_above_staff_ln;return this.y+s*i+5*i-t*i}getYForGlyphs(){return this.getYForLine(3)}addModifier(t,e){return void 0!==e&&t.setPosition(e),t.setStave(this),this.formatted=!1,this.modifiers.push(t),this}addEndModifier(t){return this.addModifier(t,ft.END),this}setBegBarType(t){const{SINGLE:e,REPEAT_BEGIN:i,NONE:s}=_t;return t!==e&&t!==i&&t!==s||(this.modifiers[0].setType(t),this.formatted=!1),this}setEndBarType(t){return t!==_t.REPEAT_BEGIN&&(this.modifiers[1].setType(t),this.formatted=!1),this}setClef(t,e,i,s){void 0===s&&(s=ft.BEGIN),s===ft.END?this.endClef=t:this.clef=t;const n=this.getModifiers(s,ae.CATEGORY);return 0===n.length?this.addClef(t,e,i,s):n[0].setType(t,e,i),this}getClef(){return this.clef}setEndClef(t,e,i){return this.setClef(t,e,i,ft.END),this}getEndClef(){return this.endClef}setKeySignature(t,e,i){void 0===i&&(i=ft.BEGIN);const s=this.getModifiers(i,oe.CATEGORY);return 0===s.length?this.addKeySignature(t,e,i):s[0].setKeySig(t,e),this}setEndKeySignature(t,e){return this.setKeySignature(t,e,ft.END),this}setTimeSignature(t,e,i){void 0===i&&(i=ft.BEGIN);const s=this.getModifiers(i,pe.CATEGORY);return 0===s.length?this.addTimeSignature(t,e,i):s[0].setTimeSig(t),this}setEndTimeSignature(t,e){return this.setTimeSignature(t,e,ft.END),this}addKeySignature(t,e,i){return void 0===i&&(i=ft.BEGIN),this.addModifier(new oe(t,e).setPosition(i),i),this}addClef(t,e,i,s){return void 0===s||s===ft.BEGIN?this.clef=t:s===ft.END&&(this.endClef=t),this.addModifier(new ae(t,e,i),s),this}addEndClef(t,e,i){return this.addClef(t,e,i,ft.END),this}addTimeSignature(t,e,i){return this.addModifier(new pe(t,e),i),this}addEndTimeSignature(t,e){return this.addTimeSignature(t,e,ft.END),this}addTrebleGlyph(){return this.addClef("treble"),this}getModifiers(t,e){const i=void 0===t,s=void 0===e;return i&&s?this.modifiers:i?this.modifiers.filter((t=>e===t.getCategory())):s?this.modifiers.filter((e=>t===e.getPosition())):this.modifiers.filter((i=>t===i.getPosition()&&e===i.getCategory()))}sortByCategory(t,e){for(let i=t.length-1;i>=0;i--)for(let s=0;se[t[s+1].getCategory()]){const e=t[s];t[s]=t[s+1],t[s+1]=e}}format(){const t=this.modifiers[0],e=this.modifiers[1],i=this.getModifiers(ft.BEGIN),n=this.getModifiers(ft.END);let a,o,r;this.sortByCategory(i,me),this.sortByCategory(n,fe),i.length>1&&t.getType()===_t.REPEAT_BEGIN&&(i.push(i.splice(0,1)[0]),i.splice(0,0,new vt(_t.SINGLE))),n.indexOf(e)>0&&n.splice(0,0,new vt(_t.NONE));let h=0,c=this.x;for(let t=0;t0){t.save(),t.setFont(this.textFont);const e=t.measureText(""+this.measure).width;n=this.getYForTopText(0)+3,t.fillText(""+this.measure,this.x-e/2,n),t.restore()}return t.closeGroup(),this}getVerticalBarWidth(){return this.options.vertical_bar_width}getConfigForLines(){return this.options.line_config}setConfigForLine(t,e){if(t>=this.options.num_lines||t<0)throw new d("StaveConfigError","The line number must be within the range of the number of lines in the Stave.");if(void 0===e.visible)throw new d("StaveConfigError","The line configuration object is missing the 'visible' property.");if("boolean"!=typeof e.visible)throw new d("StaveConfigError","The line configuration objects 'visible' property must be true or false.");return this.options.line_config[t]=e,this}setConfigForLines(t){if(t.length!==this.options.num_lines)throw new d("StaveConfigError","The length of the lines configuration array must match the number of lines in the Stave");for(const e in t)null==t[e].visible&&(t[e]=this.options.line_config[e]),this.options.line_config[e]=Object.assign(Object.assign({},this.options.line_config[e]),t[e]);return this.options.line_config=t,this}}function xe(t,e,i,s,n){if(e!==Se.type.BOLD_DOUBLE_LEFT&&e!==Se.type.BOLD_DOUBLE_RIGHT)throw new d("InvalidConnector","A REPEAT_BEGIN or REPEAT_END type must be provided.");let a=3,o=3.5;e===Se.type.BOLD_DOUBLE_RIGHT&&(a=-5,o=3),t.fillRect(i+a,s,1,n-s),t.fillRect(i-2,s,o,n-s)}_e.TEXT_FONT={family:k.SANS_SERIF,size:8,weight:b.NORMAL,style:w.NORMAL};class Se extends A{constructor(t,e){super(),this.thickness=K.STAVE_LINE_THICKNESS,this.width=3,this.top_stave=t,this.bottom_stave=e,this.type=Se.type.DOUBLE,this.resetFont(),this.x_shift=0,this.texts=[]}static get CATEGORY(){return c.StaveConnector}setType(t){return(t="string"==typeof t?Se.typeString[t]:t)>=Se.type.SINGLE_RIGHT&&t<=Se.type.NONE&&(this.type=t),this}setText(t,e={}){return this.texts.push({content:t,options:Object.assign({shift_x:0,shift_y:0},e)}),this}setXShift(t){if("number"!=typeof t)throw new d("InvalidType","x_shift must be a Number");return this.x_shift=t,this}getXShift(){return this.x_shift}draw(){const t=this.checkContext();this.setRendered();let e=this.top_stave.getYForLine(0),i=this.bottom_stave.getYForLine(this.bottom_stave.getNumLines()-1)+this.thickness,s=this.width,n=this.top_stave.getX();(this.type===Se.type.SINGLE_RIGHT||this.type===Se.type.BOLD_DOUBLE_RIGHT||this.type===Se.type.THIN_DOUBLE)&&(n=this.top_stave.getX()+this.top_stave.getWidth());let a=i-e;switch(this.type){case Se.type.SINGLE:case Se.type.SINGLE_LEFT:case Se.type.SINGLE_RIGHT:s=1;break;case Se.type.DOUBLE:n-=this.width+2,e-=this.thickness,a+=.5;break;case Se.type.BRACE:{s=12;const n=this.top_stave.getX()-2+this.x_shift,o=e,r=n,h=i,c=n-s,d=o+a/2,l=c-.9*s,g=o+.2*a,u=n+1.1*s,p=d-.135*a,m=u,f=d+.135*a,_=l,x=h-.2*a,S=c-s,y=x,T=n+.4*s,b=d+.135*a,w=T,v=d-.135*a,E=S,C=g;t.beginPath(),t.moveTo(n,o),t.bezierCurveTo(l,g,u,p,c,d),t.bezierCurveTo(m,f,_,x,r,h),t.bezierCurveTo(S,y,T,b,c,d),t.bezierCurveTo(w,v,E,C,n,o),t.fill(),t.stroke();break}case Se.type.BRACKET:e-=6,i+=6,a=i-e,R.renderGlyph(t,n-5,e,40,"bracketTop"),R.renderGlyph(t,n-5,i,40,"bracketBottom"),n-=this.width+2;break;case Se.type.BOLD_DOUBLE_LEFT:xe(t,this.type,n+this.x_shift,e,i-this.thickness);break;case Se.type.BOLD_DOUBLE_RIGHT:xe(t,this.type,n,e,i-this.thickness);break;case Se.type.THIN_DOUBLE:s=1,a-=this.thickness;break;case Se.type.NONE:break;default:throw new d("InvalidType",`The provided StaveConnector.type (${this.type}) is invalid.`)}this.type!==Se.type.BRACE&&this.type!==Se.type.BOLD_DOUBLE_LEFT&&this.type!==Se.type.BOLD_DOUBLE_RIGHT&&this.type!==Se.type.NONE&&t.fillRect(n,e,s,a),this.type===Se.type.THIN_DOUBLE&&t.fillRect(n-3,e,s,a),t.save(),t.setLineWidth(2),t.setFont(this.textFont);for(let e=0;et.reduce(((t,e)=>t+e),0);function Te(t,e,i){const s=we.getResolutionMultiplier(t),n={},a=[],o=[];return t.forEach(((t,r)=>{const h=new x(0,s);t.getTickables().forEach((t=>{const s=h.numerator;if(!n[s]){const t=e({tickID:s});o.push(t),n[s]=t,a.push(s)}i(t,n[s],r),h.add(t.getTicks())}))})),{map:n,array:o,list:a.sort(((t,e)=>t-e)),resolutionMultiplier:s}}function be(t,e,i,s){let n=e;for(let e=i+1;e{e.addToModifierContext(new ne);const s=(new Ot).addTickable(e).preFormat(),n=s.getMetrics();return s.setX(t+n.totalLeftPx),t+s.getWidth()+n.totalRightPx+i}),e)}static plotDebugging(t,e,i,s,n,a){const o=i+(a=Object.assign({stavePadding:K.currentMusicFont().lookupMetric("stave.padding")},a)).stavePadding,r=e.contextGaps;t.save(),t.setFont(k.SANS_SERIF,8),r.gaps.forEach((e=>{var i,a,r;i=o+e.x1,a=o+e.x2,r="rgba(100,200,100,0.4)",t.beginPath(),t.setStrokeStyle(r),t.setFillStyle(r),t.setLineWidth(1),t.fillRect(i,s,Math.max(a-i,0),n-s),t.setFillStyle("green"),t.fillText(Math.round(e.x2-e.x1).toString(),o+e.x1,n+12)})),t.setFillStyle("red"),t.fillText(`Loss: ${(e.totalCost||0).toFixed(2)} Shift: ${(e.totalShift||0).toFixed(2)} Gap: ${r.total.toFixed(2)}`,o-20,n+27),t.restore()}static FormatAndDraw(t,e,i,s){let n={auto_beam:!1,align_rests:!1};"object"==typeof s?n=Object.assign(Object.assign({},n),s):"boolean"==typeof s&&(n.auto_beam=s);const a=new Bt(K.TIME4_4).setMode(Bt.Mode.SOFT).addTickables(i),o=n.auto_beam?Ne.applyAndGetBeams(a):[];return(new we).joinVoices([a]).formatToStave([a],e,{align_rests:n.align_rests,stave:e}),a.setStave(e).draw(t,e),o.forEach((e=>e.setContext(t).draw())),a.getBoundingBox()}static FormatAndDrawTab(t,e,i,s,n,a,o){let r={auto_beam:a,align_rests:!1};"object"==typeof o?r=Object.assign(Object.assign({},r),o):"boolean"==typeof o&&(r.auto_beam=o);const h=new Bt(K.TIME4_4).setMode(Bt.Mode.SOFT).addTickables(n),c=new Bt(K.TIME4_4).setMode(Bt.Mode.SOFT).addTickables(s),d=r.auto_beam?Ne.applyAndGetBeams(h):[];(new we).joinVoices([h]).joinVoices([c]).formatToStave([h,c],i,{align_rests:r.align_rests}),h.draw(t,i),c.draw(t,e),d.forEach((e=>e.setContext(t).draw())),new Se(i,e).setContext(t).draw()}static AlignRestsToNotes(t,e,i){t.forEach(((s,n)=>{if(o(s)&&s.isRest()){if(s.getTuplet()&&!i)return;const a=s.getGlyph().position.toUpperCase();if("R/4"!==a&&"B/4"!==a)return;if(e||s.getBeam()){const e=s.getKeyProps()[0];if(0===n)e.line=be(t,e.line,n,!1);else if(n>0&&nwe.AlignRestsToNotes(t.getTickables(),e)))}preCalculateMinTotalWidth(t){const e=K.currentMusicFont().lookupMetric("stave.unalignedNotePadding");let i=0,s=0,n=0;const a=[],o=[];if(this.hasMinTotalWidth)return this.minTotalWidth;if(!this.tickContexts){if(!t)throw new d("BadArgument","'voices' required to run preCalculateMinTotalWidth");this.createTickContexts(t)}const{list:r,map:h}=this.tickContexts;this.minTotalWidth=0,r.forEach((e=>{const r=h[e];r.preFormat(),r.getTickables().length{s+=t.getMetrics().width,n+=t.getTicks().value(),a.push(t.getMetrics().width),o.push(t.getTicks().value())}));const c=r.getWidth();this.minTotalWidth+=c})),this.hasMinTotalWidth=!0;const c=s>0?s/a.length:1/a.length,l=ye(a.map((t=>Math.pow(t-c,2)))),g=Math.pow(l/a.length,.5)/c,u=n/o.length,p=ye(o.map((t=>Math.pow(t-u,2)))),m=Math.pow(p/o.length,.5)/u,f=Math.max(m,g)*r.length*e,_=e*i;return this.minTotalWidth+Math.max(_,f)}getMinTotalWidth(){if(!this.hasMinTotalWidth)throw new d("NoMinTotalWidth","Call 'preCalculateMinTotalWidth' or 'preFormat' before calling 'getMinTotalWidth'");return this.minTotalWidth}static getResolutionMultiplier(t){if(!t||!t.length)throw new d("BadArgument","No voices to format");const e=t[0].getTotalTicks();return t.reduce(((t,i)=>{if(!i.getTotalTicks().equals(e))throw new d("TickMismatch","Voices should have same total note duration in ticks.");if(i.getMode()===Bt.Mode.STRICT&&!i.isComplete())throw new d("IncompleteVoice","Voice does not have enough notes.");return Math.max(t,x.LCM(t,i.getResolutionMultiplier()))}),1)}createModifierContexts(t){const e=Te(t,(()=>new ne),((t,e)=>t.addToModifierContext(e)));return this.modifierContexts=e,e}createTickContexts(t){const e=Te(t,(t=>new Ot(t)),((t,e,i)=>e.addTickable(t,i)));this.tickContexts=e;const i=this.tickContexts.array;return i.forEach((t=>{t.tContexts=i})),e}preFormat(t=0,e,i,s){const n=this.tickContexts;if(!n)throw new d("NoTickContexts","preFormat requires TickContexts");const{list:a,map:o}=n;this.lossHistory=[],i&&s&&i.forEach((t=>t.setStave(s).preFormat()));let r=0,h=0;this.minTotalWidth=0;let c=0;a.forEach((t=>{const e=o[t];e.preFormat();const i=e.getWidth();this.minTotalWidth+=i;const s=e.getMaxTicks().value();c+=s;const n=e.getMetrics();r=r+h+n.totalLeftPx,e.setX(r),h=i-n.totalLeftPx}));const{globalSoftmax:l,softmaxFactor:u,maxIterations:p}=this.formatterOptions,m=ye(a.map((t=>Math.pow(u,o[t].getMaxTicks().value()/c))));if(this.minTotalWidth=r+h,this.hasMinTotalWidth=!0,t<=0)return this.evaluate();const f=o[a[0]],_=o[a[a.length-1]];function x(t){return a.map(((e,i)=>{const s=o[e],n=s.getTickablesByVoice();let r;if(i>0){const e=o[a[i-1]];for(let h=i-1;h>=0;h--){const i=o[a[h]].getTickablesByVoice(),d=[];if(Object.keys(n).forEach((t=>{i[t]&&d.push(t)})),d.length>0){let a=0,o=1/0,h=0;if(d.forEach((t=>{const e=i[t].getTicks().value();e>a&&(r=i[t],a=e);const s=n[t],h=s.getX()-(s.getMetrics().modLeftPx+s.getMetrics().leftDisplacedHeadPx),c=i[t].getMetrics(),d=i[t].getX()+c.notePx+c.modRightPx+c.rightDisplacedHeadPx;o=Math.min(o,h-d)})),o=Math.min(o,s.getX()-(e.getX()+.05*t)),l){const e=c;h=Math.pow(u,a/e)/m*t}else void 0!==r&&(h=r.getVoice().softmax(a)*t);return{expectedDistance:h,maxNegativeShiftPx:o,fromTickable:r}}}}return{expectedDistance:0,fromTickablePx:0,maxNegativeShiftPx:0}}))}function S(t){const e=y/2;let i=0;return a.forEach(((s,n)=>{const a=o[s];if(n>0){const e=a.getX(),s=t[n],o=g(s.fromTickable).getX()+s.expectedDistance-(e+i);let r=0;o>0?i+=o:o<0&&(r=Math.min(s.maxNegativeShiftPx,Math.abs(o)),i+=-r),a.setX(e+i)}a.getCenterAlignedTickables().forEach((t=>{t.setCenterXShift(e-a.getX())}))})),_.getX()-f.getX()}const y=t-_.getMetrics().notePx-_.getMetrics().totalRightPx-f.getMetrics().totalLeftPx,T=K.currentMusicFont(),b=T.lookupMetric("stave.endPaddingMin"),w=T.lookupMetric("stave.endPaddingMax");let v=y;const E=x(v);let C=S(E);const k=((t,e)=>{let i=t/2;if(e.length>1)for(let t=1;tN&&A>0||C+D1;)v-=C-N,C=S(x(v)),A--;return this.justifyWidth=t,this.evaluate()}evaluate(){if(!this.tickContexts)return 0;const t=this.tickContexts,e=this.justifyWidth;this.contextGaps={total:0,gaps:[]},t.list.forEach(((e,i)=>{if(0===i)return;const s=t.list[i-1],n=t.map[s],a=t.map[e],o=n.getMetrics(),r=a.getMetrics(),h=n.getX()+o.notePx+o.totalRightPx,c=a.getX()-r.totalLeftPx,d=c-h;this.contextGaps.total+=d,this.contextGaps.gaps.push({x1:h,x2:c}),a.getFormatterMetrics().freedom.left=d,n.getFormatterMetrics().freedom.right=d})),this.durationStats={};const i=this.durationStats;this.voices.forEach((t=>{t.getTickables().forEach(((t,s,n)=>{const a=t.getTicks().clone().simplify().toString(),o=t.getMetrics(),r=t.getFormatterMetrics(),h=t.getX()+o.notePx+o.modRightPx+o.rightDisplacedHeadPx;let c=0;if(s{t.getTickables().forEach((t=>{const e=t.getTicks().clone().simplify().toString(),n=t.getFormatterMetrics();n.space.mean=i[e].mean,n.duration=e,n.iterations+=1,n.space.deviation=n.space.used-n.space.mean,s+=Math.pow(n.space.deviation,2)}))})),this.totalCost=Math.sqrt(s),this.lossHistory.push(this.totalCost),this.totalCost}tune(t){var e;const i=this.tickContexts;if(!i)return 0;const s=null!==(e=null==t?void 0:t.alpha)&&void 0!==e?e:.5;let n=0;return this.totalShift=0,i.list.forEach(((t,e,a)=>{const o=i.map[t],r=e>0?i.map[a[e-1]]:void 0,h=et.getFormatterMetrics().space.deviation)));c>0?n=-Math.min(o.getFormatterMetrics().freedom.right,Math.abs(c)):c<0&&(n=h?Math.min(h.getFormatterMetrics().freedom.right,Math.abs(c)):0),n*=s,this.totalShift+=n})),this.evaluate()}postFormat(){const t=t=>t.list.forEach((e=>t.map[e].postFormat()));return this.modifierContexts&&t(this.modifierContexts),this.tickContexts&&t(this.tickContexts),this}joinVoices(t){return this.createModifierContexts(t),this.hasMinTotalWidth=!1,this}format(t,e,i){const s=Object.assign({align_rests:!1},i);this.voices=t;const n=this.formatterOptions.softmaxFactor;return n&&this.voices.forEach((t=>t.setSoftmaxFactor(n))),this.alignRests(t,s.align_rests),this.createTickContexts(t),this.preFormat(e,s.context,t,s.stave),s.stave&&this.postFormat(),this}formatToStave(t,e,i){const s=Object.assign({context:e.getContext()},i),n=e.getNoteEndX()-e.getNoteStartX()-_e.defaultPadding;return function(...t){we.DEBUG&&u("Vex.Flow.Formatter",t)}("Formatting voices to width: ",n),this.format(t,n,s)}getTickContext(t){var e;return null===(e=this.tickContexts)||void 0===e?void 0:e.map[t]}}var ve;we.DEBUG=!1,function(t){t[t.BOTTOM=-1]="BOTTOM",t[t.TOP=1]="TOP"}(ve||(ve={}));class Ee extends A{constructor(t,e={}){if(super(),this.numerator_glyphs=[],this.denom_glyphs=[],!t||!t.length)throw new d("BadArguments","No notes provided for tuplet.");this.options=e,this.notes=t,this.num_notes=null!=this.options.num_notes?this.options.num_notes:t.length,this.options.beats_occupied&&this.beatsOccupiedDeprecationWarning(),this.notes_occupied=this.options.notes_occupied||this.options.beats_occupied||2,null!=this.options.bracketed?this.bracketed=this.options.bracketed:this.bracketed=t.some((t=>!t.hasBeam())),this.ratioed=null!=this.options.ratioed?this.options.ratioed:Math.abs(this.notes_occupied-this.num_notes)>1,this.point=K.currentMusicFont().lookupMetric("digits.tupletPoint"),this.y_pos=16,this.x_pos=100,this.width=200,this.setTupletLocation(this.options.location||Ee.LOCATION_TOP),we.AlignRestsToNotes(t,!0,!0),this.resolveGlyphs(),this.attach()}static get CATEGORY(){return c.Tuplet}static get LOCATION_TOP(){return ve.TOP}static get LOCATION_BOTTOM(){return ve.BOTTOM}static get NESTING_OFFSET(){return 15}static get metrics(){return K.currentMusicFont().getMetrics().glyphs.tuplet}attach(){for(let t=0;t=1;)this.numerator_glyphs.unshift(new R("timeSig"+t%10,this.point)),t=parseInt((t/10).toString(),10);for(this.denom_glyphs=[],t=this.notes_occupied;t>=1;)this.denom_glyphs.unshift(new R("timeSig"+t%10,this.point)),t=parseInt((t/10).toString(),10)}getNestedTupletCount(){const t=this.location,e=this.notes[0];let i=n(e,t),s=n(e,t);function n(t,e){return t.getTupletStack().filter((t=>t.location===e)).length}return this.notes.forEach((e=>{const a=n(e,t);i=a>i?a:i,s=a0&&(s=Math.min(a,s))}}}else{let t=Ee.metrics.bottomLine;this.notes.forEach((e=>{const i=e.getModifierContext();i&&(t=Math.max(t,i.getState().text_line+1))})),s=i.checkStave().getYForLine(t)+Ee.metrics.noteHeadOffset;for(let t=0;ts&&(s=e)}}return s+t+e}draw(){const t=this.checkContext();this.setRendered();const e=this.notes[0],i=this.notes[this.notes.length-1];this.bracketed?(this.x_pos=e.getTieLeftX()-5,this.width=i.getTieRightX()-this.x_pos+5):(this.x_pos=e.getStemX(),this.width=i.getStemX()-this.x_pos),this.y_pos=this.getYPosition();const s=(t,e)=>t+g(e.getMetrics().width);let n=this.numerator_glyphs.reduce(s,0);this.ratioed&&(n=this.denom_glyphs.reduce(s,n),n+=.32*this.point);const a=this.x_pos+this.width/2-n/2;if(this.bracketed){const e=this.width/2-n/2-5;e>0&&(t.fillRect(this.x_pos,this.y_pos,e,1),t.fillRect(this.x_pos+this.width/2+n/2+5,this.y_pos,e,1),t.fillRect(this.x_pos,this.y_pos+(this.location===Ee.LOCATION_BOTTOM?1:0),1,10*this.location),t.fillRect(this.x_pos+this.width,this.y_pos+(this.location===Ee.LOCATION_BOTTOM?1:0),1,10*this.location))}const o=K.currentMusicFont().lookupMetric("digits.shiftY",0);let r=0;if(this.numerator_glyphs.forEach((e=>{e.render(t,a+r,this.y_pos+this.point/3-2+o),r+=g(e.getMetrics().width)})),this.ratioed){const e=a+r+.16*this.point,i=.06*this.point;t.beginPath(),t.arc(e,this.y_pos-.08*this.point,i,0,2*Math.PI,!0),t.closePath(),t.fill(),t.beginPath(),t.arc(e,this.y_pos+.12*this.point,i,0,2*Math.PI,!0),t.closePath(),t.fill(),r+=.32*this.point,this.denom_glyphs.forEach((e=>{e.render(t,a+r,this.y_pos+this.point/3-2+o),r+=g(e.getMetrics().width)}))}}}function Ce(t){let e=0;return t.forEach((t=>{t.keyProps&&t.keyProps.forEach((t=>{e+=t.line-3}))})),e>=0?Q.DOWN:Q.UP}const ke="L",De="B";class Ne extends A{constructor(t,e=!1){if(super(),this.slope=0,this.y_shift=0,!t||0===t.length)throw new d("BadArguments","No notes provided for beam.");if(1===t.length)throw new d("BadArguments","Too few notes for beam.");if(this.ticks=t[0].getIntrinsicTicks(),this.ticks>=K.durationToTicks("4"))throw new d("BadArguments","Beams can only be applied to notes shorter than a quarter note.");let i,s;for(this.stem_direction=Q.UP,i=0;it+e.getStemDirection()),0);n=e>-1?Q.UP:Q.DOWN}for(i=0;i(new x).parse(t)));{const e=parseInt(t.split("/")[0],10),i=parseInt(t.split("/")[1],10);if(e%3==0)return[new x(3,i)];if(i>4)return[new x(2,i)];if(i<=4)return[new x(1,i)]}return[new x(1,4)]}static applyAndGetBeams(t,e,i){return Ne.generateBeams(t.getTickables(),{groups:i,stem_direction:e})}static generateBeams(t,e={}){e.groups&&e.groups.length||(e.groups=[new x(2,8)]);const i=e.groups.map((t=>{if(!t.multiply)throw new d("InvalidBeamGroups","The beam groups must be an array of Vex.Flow.Fractions");return t.clone().multiply(K.RESOLUTION,1)})),s=t;let n=0,a=[],o=[];function r(){i.length-1>n?n+=1:n=0}!function(){let t=[],e=new x(0,1);s.forEach((s=>{if(t=[],s.shouldIgnoreTicks())return a.push(o),void(o=t);o.push(s);const h=i[n].clone(),c=(d=o,d.reduce(((t,e)=>e.getTicks().clone().add(t)),new x(0,1))).add(e);var d;const l=K.durationToNumber(s.getDuration())<8;if(l&&s.getTuplet()&&(h.numerator*=2),c.greaterThan(h)){if(!l){const e=o.pop();e&&t.push(e)}a.push(o);do{e=c.subtract(i[n]),r()}while(e.greaterThanEquals(i[n]));o=t}else c.equals(h)&&(a.push(o),e=new x(0,1),o=t,r())})),o.length>0&&a.push(o)}(),function(){const t=[];a.forEach((i=>{let s=[];i.forEach(((i,n,a)=>{const o=0===n||n===a.length-1,r=a[n-1],h=!e.beam_rests&&i.isRest(),c=e.beam_rests&&e.beam_middle_only&&i.isRest()&&o;let d=!1;if(e.maintain_stem_directions&&r&&!i.isRest()&&!r.isRest()){const t=r.getStemDirection();d=i.getStemDirection()!==t}const l=parseInt(i.getDuration(),10)<8;h||c||d||l?(s.length>0&&t.push(s),s=d?[i]:[]):s.push(i)})),s.length>0&&t.push(s)})),a=t}(),a.forEach((t=>{let i;if(e.maintain_stem_directions){const e=function(t){for(let e=0;e{t.setStemDirection(e)}))}(t,i)}));const h=a.filter((t=>{if(t.length>1){let e=!0;return t.forEach((t=>{t.getIntrinsicTicks()>=K.durationToTicks("4")&&(e=!1)})),e}return!1})),c=function(){const t=[];return a.forEach((e=>{let i;e.forEach((e=>{const s=e.getTuplet();s&&i!==s&&(i=s,t.push(i))}))})),t}(),l=[];return h.forEach((t=>{const i=new Ne(t);e.show_stemlets&&(i.render_options.show_stemlets=!0),e.secondary_breaks&&(i.render_options.secondary_break_ticks=K.durationToTicks(e.secondary_breaks)),!0===e.flat_beams&&(i.render_options.flat_beams=!0,i.render_options.flat_beam_offset=e.flat_beam_offset),l.push(i)})),c.forEach((t=>{const e=t.notes[0].stem_direction===Q.DOWN?ve.BOTTOM:ve.TOP;t.setTupletLocation(e);let i=!1;for(let e=0;et.getGlyph().beam_count)).reduce(((t,e)=>e>t?e:t))}breakSecondaryAt(t){return this.break_on_indices=t,this}getSlopeY(t,e,i,s){return i+(t-e)*s}calculateSlope(){const{notes:t,stem_direction:e,render_options:{max_slope:i,min_slope:s,slope_iterations:n,slope_cost:a}}=this,o=t[0],r=function(t,e){const i=t.getStemExtents().topY,s=t.getStemX();return(e.getStemExtents().topY-i)/(e.getStemX()-s)}(o,t[t.length-1]),h=(i-s)/n;let c=Number.MAX_VALUE,d=0,l=0;for(let n=s;n<=i;n+=h){let i=0,s=0;for(let a=1;an)&&(h=n,o=Math.min(...s.getYs()),r=s.getBeamCount())}let c=a/t.length;const d=s+r*(1.5*i),l=o+d*-e;e===Q.DOWN&&cl&&(c=o-d),n?(e===Q.DOWN&&c>n||e===Q.UP&&c=8&&(d=-1!==this.break_on_indices.indexOf(h),this.render_options.secondary_break_ticks&&r>=this.render_options.secondary_break_ticks&&(r=0,d=!0));const l=c.getIntrinsicTicks(){const i=e.getStem();i&&i.setContext(t).draw()}),this)}drawBeamLines(t){const e=["4","8","16","32","64"],i=this.notes[0];let s=this.getBeamYToDraw();const n=i.getStemX(),a=this.render_options.beam_width*this.stem_direction;for(let i=0;i0||!0===e;return!e||n>0||(this.pos=s),o?this.matchSuccess():this.matchFail(s),{success:o,results:i,numMatches:n}}expectZeroOrMore(t){return this.expectOneOrMore(t,!0)}expect(t){if(Me("Evaluating rule function:",t),!t)throw new d("Invalid rule function");let e;const i=t.bind(this.grammar)();if(i.token)e=this.matchToken(i.token,!0===i.noSpace),e.success&&(this.pos+=e.incrementPos);else{if(!i.expect)throw Me(i),new d("Bad grammar! No `token` or `expect` property "+i);e=i.oneOrMore?this.expectOneOrMore(i):i.zeroOrMore?this.expectZeroOrMore(i):this.expectOne(i)}const s=[];return e.matches=s,e.results&&e.results.forEach((t=>s.push(Re(t)))),i.run&&e.success&&i.run({matches:s}),e}}function Le(...t){He.DEBUG&&u("Vex.Flow.EasyScore",t)}Oe.DEBUG=!1;class Ie{constructor(t){this.builder=t}begin(){return this.LINE}LINE(){return{expect:[this.PIECE,this.PIECES,this.EOL]}}PIECE(){return{expect:[this.CHORDORNOTE,this.PARAMS],run:()=>this.builder.commitPiece()}}PIECES(){return{expect:[this.COMMA,this.PIECE],zeroOrMore:!0}}PARAMS(){return{expect:[this.DURATION,this.TYPE,this.DOTS,this.OPTS]}}CHORDORNOTE(){return{expect:[this.CHORD,this.SINGLENOTE],or:!0}}CHORD(){return{expect:[this.LPAREN,this.NOTES,this.RPAREN],run:t=>this.builder.addChord(t.matches[1])}}NOTES(){return{expect:[this.NOTE],oneOrMore:!0}}NOTE(){return{expect:[this.NOTENAME,this.ACCIDENTAL,this.OCTAVE]}}SINGLENOTE(){return{expect:[this.NOTENAME,this.ACCIDENTAL,this.OCTAVE],run:t=>{const e=t;this.builder.addSingleNote(e.matches[0],e.matches[1],e.matches[2])}}}ACCIDENTAL(){return{expect:[this.MICROTONES,this.ACCIDENTALS],maybe:!0,or:!0}}DOTS(){return{expect:[this.DOT],zeroOrMore:!0,run:t=>this.builder.setNoteDots(t.matches)}}TYPE(){return{expect:[this.SLASH,this.MAYBESLASH,this.TYPES],maybe:!0,run:t=>this.builder.setNoteType(t.matches[2])}}DURATION(){return{expect:[this.SLASH,this.DURATIONS],maybe:!0,run:t=>this.builder.setNoteDuration(t.matches[1])}}OPTS(){return{expect:[this.LBRACKET,this.KEYVAL,this.KEYVALS,this.RBRACKET],maybe:!0}}KEYVALS(){return{expect:[this.COMMA,this.KEYVAL],zeroOrMore:!0}}KEYVAL(){return{expect:[this.KEY,this.EQUALS,this.VAL],run:t=>this.builder.addNoteOption(t.matches[0],t.matches[2].slice(1,-1))}}VAL(){return{expect:[this.SVAL,this.DVAL],or:!0}}KEY(){return{token:"[a-zA-Z][a-zA-Z0-9]*"}}DVAL(){return{token:'["][^"]*["]'}}SVAL(){return{token:"['][^']*[']"}}NOTENAME(){return{token:"[a-gA-G]"}}OCTAVE(){return{token:"[0-9]+"}}ACCIDENTALS(){return{token:"bb|b|##|#|n"}}MICROTONES(){return{token:"bbs|bss|bs|db|d|\\+\\+-|\\+-|\\+\\+|\\+|k|o"}}DURATIONS(){return{token:"[0-9whq]+"}}TYPES(){return{token:"[rRsSmMhHgG]"}}LPAREN(){return{token:"[(]"}}RPAREN(){return{token:"[)]"}}COMMA(){return{token:"[,]"}}DOT(){return{token:"[.]"}}SLASH(){return{token:"[/]"}}MAYBESLASH(){return{token:"[/]?"}}EQUALS(){return{token:"[=]"}}LBRACKET(){return{token:"\\["}}RBRACKET(){return{token:"\\]"}}EOL(){return{token:"$"}}}class We{constructor(t){this.chord=[],this.dots=0,this.options={},this.duration=t}}class Ge{constructor(t){this.commitHooks=[],this.factory=t,this.reset()}reset(t){this.options=Object.assign({stem:"auto",clef:"treble"},t),this.elements={notes:[],accidentals:[]},this.rollingDuration="8",this.resetPiece()}getFactory(){return this.factory}getElements(){return this.elements}addCommitHook(t){this.commitHooks.push(t)}resetPiece(){Le("resetPiece"),this.piece=new We(this.rollingDuration)}setNoteDots(t){Le("setNoteDots:",t),t&&(this.piece.dots=t.length)}setNoteDuration(t){Le("setNoteDuration:",t),this.rollingDuration=this.piece.duration=t||this.rollingDuration}setNoteType(t){Le("setNoteType:",t),t&&(this.piece.type=t)}addNoteOption(t,e){Le("addNoteOption: key:",t,"value:",e),this.piece.options[t]=e}addNote(t,e,i){Le("addNote:",t,e,i),this.piece.chord.push({key:t,accid:e,octave:i})}addSingleNote(t,e,i){Le("addSingleNote:",t,e,i),this.addNote(t,e,i)}addChord(t){Le("startChord"),"object"!=typeof t[0]?this.addSingleNote(t[0]):t.forEach((t=>{t&&this.addNote(...t)})),Le("endChord")}commitPiece(){Le("commitPiece");const{factory:t}=this;if(!t)return;const e=Object.assign(Object.assign({},this.options),this.piece.options),i=g(e.stem,"BadArguments","options.stem is not defined").toLowerCase(),s=g(e.clef,"BadArguments","options.clef is not defined").toLowerCase(),{chord:n,duration:a,dots:o,type:r}=this.piece,h=L.accidentals,c=n.map((t=>{var e;return t.key+(h.includes(null!==(e=t.accid)&&void 0!==e?e:"")?t.accid:"")+"/"+t.octave})),d="auto"===i,l="g"==(null==r?void 0:r.toLowerCase())?t.GhostNote({duration:a,dots:o}):t.StaveNote({keys:c,duration:a,dots:o,type:r,clef:s,auto_stem:d});d||l.setStemDirection("up"===i?Q.UP:Q.DOWN);const u=[];n.forEach(((e,i)=>{const s=e.accid;if("string"==typeof s){const e=t.Accidental({type:s});l.addModifier(e,i),u.push(e)}else u.push(void 0)}));for(let t=0;tt(e,l,this))),this.elements.notes.push(l),this.elements.accidentals.push(u),this.resetPiece()}}function Ue(t,e){void 0!==t.id&&e.setAttribute("id",t.id)}const Ye=/\s*,\s*/;function je(t,e){void 0!==t.class&&t.class.split(Ye).forEach((t=>e.addClass(t)))}class He{constructor(t={}){this.defaults={clef:"treble",time:"4/4",stem:"auto"},this.setOptions(t)}set(t){return this.defaults=Object.assign(Object.assign({},this.defaults),t),this}setOptions(t){var e,i;const s=t.factory,n=null!==(e=t.builder)&&void 0!==e?e:new Ge(s);return this.options=Object.assign(Object.assign({commitHooks:[Ue,je,gt.easyScoreHook,At.easyScoreHook],throwOnError:!1},t),{factory:s,builder:n}),this.factory=s,this.builder=n,this.grammar=new Ie(this.builder),this.parser=new Oe(this.grammar),null===(i=this.options.commitHooks)||void 0===i||i.forEach((t=>this.addCommitHook(t))),this}setContext(t){return this.factory.setContext(t),this}parse(t,e={}){this.builder.reset(e);const i=this.parser.parse(t);if(!i.success&&this.options.throwOnError)throw Le(i),new d("Error parsing line: "+t);return i}beam(t,e){return this.factory.Beam({notes:t,options:e}),t}tuplet(t,e){return this.factory.Tuplet({notes:t,options:e}),t}notes(t,e={}){return e=Object.assign({clef:this.defaults.clef,stem:this.defaults.stem},e),this.parse(t,e),this.builder.getElements().notes}voice(t,e={}){return e=Object.assign({time:this.defaults.time},e),this.factory.Voice(e).addTickables(t)}addCommitHook(t){this.builder.addCommitHook(t)}}He.DEBUG=!1;const Xe="Ghost note must have valid initialization data to identify duration.";class Ve extends Gt{static get CATEGORY(){return c.GhostNote}constructor(t){if(!t)throw new d("BadArguments",Xe);let e;if("string"==typeof t)e={duration:t};else{if("object"!=typeof t)throw new d("BadArguments",Xe);e=t}super(e),this.setWidth(0)}isRest(){return!0}setStave(t){return super.setStave(t),this}addToModifierContext(t){return this}preFormat(){return this.preFormatted=!0,this}draw(){this.setRendered();for(let t=0;t=Ze.type.TEXT&&t<=Ze.type.MIXED&&(this.type=t),this}setCustomText(t,e){return this.custom_depress_text=t||"",this.custom_release_text=e||"",this}setLine(t){return this.line=t,this}drawBracketed(){const t=this.checkContext();let e,i,s=!1;this.notes.forEach(((n,a,o)=>{s=!s;const r=n.getAbsoluteX(),h=n.checkStave().getYForBottomText(this.line+3);if(r{e=!e;const s=i.checkStave(),n=i.getAbsoluteX(),a=s.getYForBottomText(this.line+3),o=K.currentMusicFont().lookupMetric(`pedalMarking.${e?"down":"up"}.point`);let r=0;e?this.custom_depress_text?(r=t.measureText(this.custom_depress_text).width,t.fillText(this.custom_depress_text,n-r/2,a)):Qe("pedal_depress",t,n,a,o):this.custom_release_text?(r=t.measureText(this.custom_release_text).width,t.fillText(this.custom_release_text,n-r/2,a)):Qe("pedal_release",t,n,a,o)}))}draw(){const t=this.checkContext();this.setRendered(),t.save(),t.setStrokeStyle(this.render_options.color),t.setFillStyle(this.render_options.color),t.setFont(this.textFont),function(...t){Ze.DEBUG&&u("Vex.Flow.PedalMarking",t)}("Rendering Pedal Marking"),this.type===Ze.type.BRACKET||this.type===Ze.type.MIXED?(t.setLineWidth(this.render_options.bracket_line_width),this.drawBracketed()):this.type===Ze.type.TEXT&&this.drawText(),t.restore()}}Ze.DEBUG=!1,Ze.TEXT_FONT={family:k.SERIF,size:12,weight:b.BOLD,style:w.ITALIC},Ze.GLYPHS={pedal_depress:{code:"keyboardPedalPed",x_shift:-10,y_shift:0},pedal_release:{code:"keyboardPedalUp",x_shift:-2,y_shift:3}},Ze.type={TEXT:1,BRACKET:2,MIXED:3},Ze.typeString={text:Ze.type.TEXT,bracket:Ze.type.BRACKET,mixed:Ze.type.MIXED};const ti={1:"repeat1Bar",2:"repeat2Bars",4:"repeat4Bars",slash:"repeatBarSlash"};class ei extends ze{static get CATEGORY(){return c.RepeatNote}constructor(t,e,i){super(void 0,Object.assign({duration:"q",align_center:"slash"!==t},e),i);const s=new R(ti[t]||"repeat1Bar",K.currentMusicFont().lookupMetric("repeatNote.point",40),{category:"repeatNote"});this.setGlyph(s)}}function ii(t,e,i,s,n,a,o){t.beginPath(),t.moveTo(e,i),t.lineTo(s,n),t.lineTo(a,o),t.lineTo(e,i),t.closePath(),t.fill()}class si extends A{constructor(t){super(),this.setNotes(t),this.text="",this.resetFont(),this.render_options={padding_left:4,padding_right:3,line_width:1,line_dash:void 0,rounded_end:!0,color:void 0,draw_start_arrow:!1,draw_end_arrow:!1,arrowhead_length:10,arrowhead_angle:Math.PI/8,text_position_vertical:si.TextVerticalPosition.TOP,text_justification:si.TextJustification.CENTER}}static get CATEGORY(){return c.StaveLine}setText(t){return this.text=t,this}setNotes(t){if(!t.first_note&&!t.last_note)throw new d("BadArguments","Notes needs to have either first_note or last_note set.");if(t.first_indices||(t.first_indices=[0]),t.last_indices||(t.last_indices=[0]),t.first_indices.length!==t.last_indices.length)throw new d("BadArguments","Connected notes must have same number of indices.");return this.notes=t,this.first_note=t.first_note,this.first_indices=t.first_indices,this.last_note=t.last_note,this.last_indices=t.last_indices,this}applyLineStyle(){const t=this.checkContext(),e=this.render_options;e.line_dash&&t.setLineDash(e.line_dash),e.line_width&&t.setLineWidth(e.line_width),e.rounded_end?t.setLineCap("round"):t.setLineCap("square")}applyFontStyle(){const t=this.checkContext();t.setFont(this.textFont);const e=this.render_options.color;e&&(t.setStrokeStyle(e),t.setFillStyle(e))}drawArrowLine(t,e,i){const s=this.render_options.draw_start_arrow&&this.render_options.draw_end_arrow,n=e.x,a=e.y,o=i.x,r=i.y,h=Math.sqrt((o-n)*(o-n)+(r-a)*(r-a)),c=(h-this.render_options.arrowhead_length/3)/h;let d,l,g,u;this.render_options.draw_end_arrow||s?(d=Math.round(n+(o-n)*c),l=Math.round(a+(r-a)*c)):(d=o,l=r),this.render_options.draw_start_arrow||s?(g=n+(o-n)*(1-c),u=a+(r-a)*(1-c)):(g=n,u=a),this.render_options.color&&(t.setStrokeStyle(this.render_options.color),t.setFillStyle(this.render_options.color)),t.beginPath(),t.moveTo(g,u),t.lineTo(d,l),t.stroke(),t.closePath();const p=Math.atan2(r-a,o-n),m=Math.abs(this.render_options.arrowhead_length/Math.cos(this.render_options.arrowhead_angle));let f,_,x,S,y,T;(this.render_options.draw_end_arrow||s)&&(f=p+Math.PI+this.render_options.arrowhead_angle,x=o+Math.cos(f)*m,S=r+Math.sin(f)*m,_=p+Math.PI-this.render_options.arrowhead_angle,y=o+Math.cos(_)*m,T=r+Math.sin(_)*m,ii(t,x,S,o,r,y,T)),(this.render_options.draw_start_arrow||s)&&(f=p+this.render_options.arrowhead_angle,x=n+Math.cos(f)*m,S=a+Math.sin(f)*m,_=p-this.render_options.arrowhead_angle,y=n+Math.cos(_)*m,T=a+Math.sin(_)*m,ii(t,x,S,n,a,y,T))}draw(){const t=this.checkContext();this.setRendered();const e=this.first_note,i=this.last_note,s=this.render_options;t.save(),this.applyLineStyle();let n={x:0,y:0},a={x:0,y:0};this.first_indices.forEach(((o,r)=>{const h=this.last_indices[r];n=e.getModifierStartXY(2,o),a=i.getModifierStartXY(1,h);const c=n.y>a.y;n.x+=e.getMetrics().modRightPx+s.padding_left,a.x-=i.getMetrics().modLeftPx+s.padding_right;const d=e.getGlyph().getWidth();e.getKeyProps()[o].displaced&&1===e.getStemDirection()&&(n.x+=d+s.padding_left);i.getKeyProps()[h].displaced&&-1===i.getStemDirection()&&(a.x-=d+s.padding_right),n.y+=c?-3:1,a.y+=c?2:0,this.drawArrowLine(t,n,a)})),t.restore();const o=t.measureText(this.text).width,r=s.text_justification;let h=0;if(r===si.TextJustification.LEFT)h=n.x;else if(r===si.TextJustification.CENTER){h=(a.x-n.x)/2+n.x-o/2}else r===si.TextJustification.RIGHT&&(h=a.x-o);let c=0;const d=s.text_position_vertical;return d===si.TextVerticalPosition.TOP?c=e.checkStave().getYForTopText():d===si.TextVerticalPosition.BOTTOM&&(c=e.checkStave().getYForBottomText(K.TEXT_HEIGHT_OFFSET_HACK)),t.save(),this.applyFontStyle(),t.fillText(this.text,h,c),t.restore(),this}}si.TEXT_FONT=Object.assign({},A.TEXT_FONT),si.TextVerticalPosition={TOP:1,BOTTOM:2},si.TextJustification={LEFT:1,CENTER:2,RIGHT:3};class ni extends A{constructor(t={}){super(),this.setOptions(t),this.parts=[]}static get CATEGORY(){return c.System}setOptions(t={}){if(!t.factory)throw new d("NoFactory","System.setOptions(options) requires a factory.");this.factory=t.factory,this.options=Object.assign(Object.assign({factory:this.factory,x:10,y:10,width:500,spaceBetweenStaves:12,autoWidth:!1,noJustification:!1,debugFormatter:!1,formatIterations:0,noPadding:!1},t),{details:Object.assign({alpha:.5},t.details),formatOptions:Object.assign({},t.formatOptions)}),!1===this.options.noJustification&&void 0===t.width&&(this.options.autoWidth=!0)}setContext(t){return super.setContext(t),this.factory.setContext(t),this}addConnector(t="double"){return this.connector=this.factory.StaveConnector({top_stave:this.parts[0].stave,bottom_stave:this.parts[this.parts.length-1].stave,type:t}),this.connector}addStave(t){var e;const i=Object.assign({left_bar:!1},t.options),s=null!==(e=t.stave)&&void 0!==e?e:this.factory.Stave({x:this.options.x,y:this.options.y,width:this.options.width,options:i}),n=Object.assign(Object.assign({stave:s,spaceAbove:0,spaceBelow:0,debugNoteMetrics:!1,noJustification:!1},t),{options:i}),a=this.getContext();return n.voices.forEach((t=>t.setContext(a).setStave(s).getTickables().forEach((t=>t.setStave(s))))),this.parts.push(n),s}format(){const t=this.options.details;let e=0;const i=new we(t);this.formatter=i;let s=this.options.y,n=0,a=[];const o=[];this.parts.forEach((t=>{s+=t.stave.space(t.spaceAbove),t.stave.setY(s),this.options.autoWidth?t.voices.forEach((t=>{i.joinVoices([t])})):i.joinVoices(t.voices),s+=t.stave.space(t.spaceBelow),s+=t.stave.space(this.options.spaceBetweenStaves),t.debugNoteMetrics&&(o.push({y:s,voice:t.voices[0]}),s+=15),a=a.concat(t.voices),n=Math.max(n,t.stave.getNoteStartX())})),this.parts.forEach((t=>t.stave.setNoteStartX(n))),this.options.autoWidth?(e=i.preCalculateMinTotalWidth(a),this.parts.forEach((t=>{t.stave.setWidth(e+_e.rightPadding+(n-this.options.x))}))):e=this.options.noPadding?this.options.width-this.options.x:this.options.width-(n-this.options.x)-_e.defaultPadding,i.format(a,this.options.noJustification?0:e,this.options.formatOptions);for(let e=0;e{e.voice.getTickables().forEach((i=>mt.plotMetrics(t,i,e.y)))}))}}class ai extends Gt{constructor(t,e=!1){super(t),this.glyphs=[],this.greatestString=()=>this.positions.map((t=>t.str)).reduce(((t,e)=>t>e?t:e)),this.leastString=()=>this.positions.map((t=>t.str)).reduce(((t,e)=>tthis.width}setStave(t){super.setStave(t);const e=t.getContext();if(this.setContext(e),e){this.width=0;for(let t=0;ti.width),this.width=Math.max(i.getWidth(),this.width)}this.glyph.getWidth=()=>this.width}const i=this.positions.map((({str:e})=>t.getYForLine(Number(e)-1)));return this.setYs(i),this.stem&&this.stem.setYBounds(this.getStemY(),this.getStemY()),this}getPositions(){return this.positions}getModifierStartXY(t,e){if(!this.preFormatted)throw new d("UnformattedNote","Can't call GetModifierStartXY on an unformatted note");if(0===this.ys.length)throw new d("NoYValues","No Y-Values calculated for this note.");let i=0;if(t===O.Position.LEFT)i=-2;else if(t===O.Position.RIGHT)i=this.width+2;else if(t===O.Position.BELOW||t===O.Position.ABOVE){i=this.glyph.getWidth()/2}return{x:this.getAbsoluteX()+i,y:this.ys[e]}}getLineForRest(){return Number(this.positions[0].str)}preFormat(){this.preFormatted||(this.modifierContext&&this.modifierContext.preFormat(),this.preFormatted=!0)}getStemX(){return this.getCenterGlyphX()}getStemY(){const t=this.checkStave().getNumLines()-.5,e=Q.UP===this.stem_direction?-.5:t;return this.checkStave().getYForLine(e)}getStemExtents(){return this.checkStem().getExtents()}drawFlag(){const{beam:t,glyph:e,stem_direction:i,render_options:{draw_stem:s,glyph_font_scale:n}}=this,a=this.checkContext(),o=null==t&&s;if(e.flag&&o){const t=this.getStemX()+1,s=this.getStemY()-this.checkStem().getHeight(),o=i===Q.DOWN?e.code_flag_downstem:e.code_flag_upstem;R.renderGlyph(a,t,s,n,o,{category:"flag.tabStem"})}}drawModifiers(){this.modifiers.forEach((t=>{i(t,c.Dot)&&!this.render_options.draw_dots||(t.setContext(this.getContext()),t.drawWithStyle())}))}drawStemThrough(){const t=this.getStemX(),e=this.getStemY(),i=this.checkContext(),s=this.render_options.draw_stem,n=this.render_options.draw_stem_through_stave;if(s&&n){const s=function(t,e,i,s){const n=1!==s,a=-1!==s,o=i.getSpacingBetweenLines(),r=i.getNumLines(),h=[];return e.forEach((e=>{const c=e.indexOf(r)>-1,d=e.indexOf(1)>-1;if(n&&d||a&&c)return;1===e.length&&e.push(e[0]);const l=[];e.forEach(((e,n,a)=>{const h=1===e,c=e===r;let d=i.getYForLine(e-1);0!==n||h?n!==a.length-1||c||(d+=o/2-1):d-=o/2-1,l.push(d),1===s&&h?l.push(t-2):-1===s&&c&&l.push(t+2)})),h.push(l.sort(((t,e)=>t-e)))})),h}(e,function(t,e){const i=[];let s=[];for(let n=1;n<=t;n++)e.indexOf(n)>-1?(i.push(s),s=[]):s.push(n);return s.length>0&&i.push(s),i}(this.checkStave().getNumLines(),this.positions.map((t=>Number(t.str)))),this.checkStave(),this.getStemDirection());i.save(),i.setLineWidth(Q.WIDTH),s.forEach((e=>{0!==e.length&&(i.beginPath(),i.moveTo(t,e[0]),i.lineTo(t,e[e.length-1]),i.stroke(),i.closePath())})),i.restore()}}drawPositions(){const t=this.checkContext(),e=this.getAbsoluteX(),i=this.ys;for(let s=0;s{const i=li.GLYPHS[e];if(!i)throw new d("Invalid dynamics character: "+e);const s=g(this.render_options.glyph_font_size),n=new R(i.code,s,{category:"textNote"});this.glyphs.push(n),t+=i.width})),this.setWidth(t),this.preFormatted=!0,this}draw(){this.setRendered();const t=this.getAbsoluteX(),e=this.checkStave().getYForLine(this.line+-3);di("Rendering Dynamics: ",this.sequence);let i=t;this.glyphs.forEach(((t,s)=>{const n=this.sequence[s];t.render(this.checkContext(),i,e),i+=li.GLYPHS[n].width}))}}li.DEBUG=!1;class gi extends mt{constructor(t,e){super({duration:"b"});const i=new pe(t,e);this.timeSigInfo=i.getInfo(),this.setWidth(this.timeSigInfo.glyph.getMetrics().width),this.ignore_ticks=!0}static get CATEGORY(){return c.TimeSigNote}addToModifierContext(t){return this}preFormat(){return this.preFormatted=!0,this}draw(){const t=this.checkStave(),e=this.checkContext();this.setRendered(),this.timeSigInfo.glyph.getContext()||this.timeSigInfo.glyph.setContext(e),this.timeSigInfo.glyph.setStave(t),this.timeSigInfo.glyph.setYShift(t.getYForLine(2)-t.getYForGlyphs()),this.timeSigInfo.glyph.renderToStave(this.getAbsoluteX())}}class ui extends A{constructor(t){super(),t.start&&(this.start=t.start),t.stop&&(this.stop=t.stop),this.line=1,this.render_options={harsh:!1,wave_height:6,wave_width:4,wave_girth:2,vibrato_width:0}}static get CATEGORY(){return c.VibratoBracket}setLine(t){return this.line=t,this}setHarsh(t){return this.render_options.harsh=t,this}draw(){const t=this.checkContext();this.setRendered();const e=this.start&&this.start.checkStave().getYForTopText(this.line)||this.stop&&this.stop.checkStave().getYForTopText(this.line)||0,i=this.start&&this.start.getAbsoluteX()||this.stop&&this.stop.checkStave().getTieStartX()||0,s=this.stop&&this.stop.getAbsoluteX()-this.stop.getWidth()-5||this.start&&this.start.checkStave().getTieEndX()-10||0;this.render_options.vibrato_width=s-i,function(...t){ui.DEBUG&&u("Vex.Flow.VibratoBracket",t)}("Rendering VibratoBracket: start_x:",i,"stop_x:",s,"y:",e),ie.renderVibrato(t,i,e,this.render_options)}}function pi(...t){mi.DEBUG&&u("Vex.Flow.Factory",t)}ui.DEBUG=!1;class mi{constructor(t={}){pi("New factory: ",t),this.options={stave:{space:10},renderer:{elementId:"",width:500,height:200,background:"#FFF"},font:mi.TEXT_FONT},this.setOptions(t)}static newFromElementId(t,e=500,i=200){return new mi({renderer:{elementId:t,width:e,height:i}})}reset(){this.renderQ=[],this.systems=[],this.staves=[],this.voices=[],this.stave=void 0}setOptions(t){this.options=Object.assign(Object.assign({},this.options),t),this.initRenderer(),this.reset()}initRenderer(){const{elementId:t,width:e,height:i,background:s}=this.options.renderer;if(null==t)return;if(""==t)throw pi(this),new d("renderer.elementId not set in FactoryOptions");let n=this.options.renderer.backend;if(void 0===n){n=jt(document.getElementById(t))?Zt.Backends.CANVAS:Zt.Backends.SVG}this.context=Zt.buildContext(t,n,e,i,s)}getContext(){return this.context}setContext(t){return this.context=t,this}getStave(){return this.stave}getVoices(){return this.voices}Stave(t){const e=this.options.stave.space,i=Object.assign({x:0,y:0,width:this.options.renderer.width-1*e,options:{spacing_between_lines_px:1*e}},t),s=new _e(i.x,i.y,i.width,i.options);return this.staves.push(s),s.setContext(this.context),this.stave=s,s}TabStave(t){const e=this.options.stave.space,i=Object.assign({x:0,y:0,width:this.options.renderer.width-1*e,options:{spacing_between_lines_px:1.3*e}},t),s=new oi(i.x,i.y,i.width,i.options);return this.staves.push(s),s.setContext(this.context),this.stave=s,s}StaveNote(t){const e=new Yt(t);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}GlyphNote(t,e,i){const s=new ze(t,e,i);return this.stave&&s.setStave(this.stave),s.setContext(this.context),this.renderQ.push(s),s}RepeatNote(t,e,i){const s=new ei(t,e,i);return this.stave&&s.setStave(this.stave),s.setContext(this.context),this.renderQ.push(s),s}GhostNote(t){const e=new Ve(t);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}TextNote(t){const e=new de(t);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}BarNote(t={}){const e=new Et(t.type);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}ClefNote(t){const e=Object.assign({type:"treble",options:{size:"default",annotation:void 0}},t),i=new Ae(e.type,e.options.size,e.options.annotation);return this.stave&&i.setStave(this.stave),i.setContext(this.context),this.renderQ.push(i),i}TimeSigNote(t){const e=Object.assign({time:"4/4"},t),i=new gi(e.time);return this.stave&&i.setStave(this.stave),i.setContext(this.context),this.renderQ.push(i),i}KeySigNote(t){const e=new $e(t.key,t.cancelKey,t.alterKey);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}TabNote(t){const e=new ai(t);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}GraceNote(t){const e=new Ke(t);return this.stave&&e.setStave(this.stave),e.setContext(this.context),e}GraceNoteGroup(t){const e=new Mt(t.notes,t.slur);return e.setContext(this.context),e}Accidental(t){const e=new J(t.type);return e.setContext(this.context),e}Annotation(t){const e=Object.assign({text:"p",hJustify:st.CENTER,vJustify:nt.BOTTOM},t),i=new at(e.text);return i.setJustification(e.hJustify),i.setVerticalJustification(e.vJustify),i.setFont(e.font),i.setContext(this.context),i}ChordSymbol(t){const e=Object.assign({vJustify:"top",hJustify:"center",kerning:!0,reportWidth:!0},t),i=new Dt;return i.setHorizontal(e.hJustify),i.setVertical(e.vJustify),i.setEnableKerning(e.kerning),i.setReportWidth(e.reportWidth),"string"==typeof e.fontFamily&&"number"==typeof e.fontSize?"string"==typeof e.fontWeight?i.setFont(e.fontFamily,e.fontSize,e.fontWeight):i.setFont(e.fontFamily,e.fontSize,""):"number"==typeof e.fontSize&&i.setFontSize(e.fontSize),i.setContext(this.context),i}Articulation(t){const e=Object.assign({type:"a.",position:"above"},t),i=new gt(e.type);return i.setPosition(e.position),i.setContext(this.context),i}TextDynamics(t){const e=Object.assign({text:"p",duration:"q",dots:0,line:0},t),i=new li({text:e.text,line:e.line,duration:e.duration,dots:e.dots});return this.stave&&i.setStave(this.stave),i.setContext(this.context),this.renderQ.push(i),i}Fingering(t){const e=Object.assign({number:"0",position:"left"},t),i=new At(e.number);return i.setPosition(e.position),i.setContext(this.context),i}StringNumber(t){const e=new te(t.number);return e.setPosition(t.position),e.setContext(this.context),e}TickContext(){return new Ot}ModifierContext(){return new ne}MultiMeasureRest(t){const e=g(t.number_of_measures,"NoNumberOfMeasures"),i=new Je(e,t);return i.setContext(this.context),this.renderQ.push(i),i}Voice(t){const e=Object.assign({time:"4/4"},t),i=new Bt(e.time,e.options);return this.voices.push(i),i}StaveConnector(t){const e=new Se(t.top_stave,t.bottom_stave);return e.setType(t.type).setContext(this.context),this.renderQ.push(e),e}Formatter(t){return new we(t)}Tuplet(t){const e=Object.assign({notes:[],options:{}},t),i=new Ee(e.notes,e.options).setContext(this.context);return this.renderQ.push(i),i}Beam(t){var e,i,s;const n=new Ne(t.notes,null===(e=t.options)||void 0===e?void 0:e.autoStem).setContext(this.context);return n.breakSecondaryAt(null!==(s=null===(i=t.options)||void 0===i?void 0:i.secondaryBeamBreaks)&&void 0!==s?s:[]),this.renderQ.push(n),n}Curve(t){const e=new Be(t.from,t.to,t.options).setContext(this.context);return this.renderQ.push(e),e}StaveTie(t){var e;const i=new Ft({first_note:t.from,last_note:t.to,first_indices:t.first_indices,last_indices:t.last_indices},t.text);return(null===(e=t.options)||void 0===e?void 0:e.direction)&&i.setDirection(t.options.direction),i.setContext(this.context),this.renderQ.push(i),i}StaveLine(t){var e,i;const s=new si({first_note:t.from,last_note:t.to,first_indices:t.first_indices,last_indices:t.last_indices});return(null===(e=t.options)||void 0===e?void 0:e.text)&&s.setText(t.options.text),(null===(i=t.options)||void 0===i?void 0:i.font)&&s.setFont(t.options.font),s.setContext(this.context),this.renderQ.push(s),s}VibratoBracket(t){const e=new ui({start:t.from,stop:t.to});return t.options.line&&e.setLine(t.options.line),t.options.harsh&&e.setHarsh(t.options.harsh),e.setContext(this.context),this.renderQ.push(e),e}TextBracket(t){const e=new ci({start:t.from,stop:t.to,text:t.text,superscript:t.options.superscript,position:t.options.position});return t.options.line&&e.setLine(t.options.line),t.options.font&&e.setFont(t.options.font),e.setContext(this.context),this.renderQ.push(e),e}System(t={}){t.factory=this;const e=new ni(t).setContext(this.context);return this.systems.push(e),e}EasyScore(t={}){return t.factory=this,new He(t)}PedalMarking(t){const e=Object.assign({notes:[],options:{style:"mixed"}},t),i=new Ze(e.notes);return i.setType(Ze.typeString[e.options.style]),i.setContext(this.context),this.renderQ.push(i),i}NoteSubGroup(t){const e=Object.assign({notes:[]},t),i=new Rt(e.notes);return i.setContext(this.context),i}draw(){const t=this.context;this.systems.forEach((e=>e.setContext(t).format())),this.staves.forEach((e=>e.setContext(t).draw())),this.voices.forEach((e=>e.setContext(t).draw())),this.renderQ.forEach((e=>{e.isRendered()||e.setContext(t).draw()})),this.systems.forEach((e=>e.setContext(t).draw())),this.reset()}}mi.DEBUG=!1,mi.TEXT_FONT=Object.assign({},A.TEXT_FONT);class fi extends A{constructor(t,e){super(),this.setNotes(t),this.hairpin=e,this.position=O.Position.BELOW,this.render_options={height:10,y_shift:0,left_shift_px:0,right_shift_px:0,right_shift_ticks:0,left_shift_ticks:0}}static get CATEGORY(){return c.StaveHairpin}static FormatByTicksAndDraw(t,e,i,s,n,a){var o,r;const h=e.pixelsPerTick;if(null==h)throw new d("BadArguments","A valid Formatter must be provide to draw offsets by ticks.");const c=h*(null!==(o=a.left_shift_ticks)&&void 0!==o?o:0),l=h*(null!==(r=a.right_shift_ticks)&&void 0!==r?r:0),g={height:a.height,y_shift:a.y_shift,left_shift_px:c,right_shift_px:l,right_shift_ticks:0,left_shift_ticks:0};new fi({first_note:i.first_note,last_note:i.last_note},s).setContext(t).setRenderOptions(g).setPosition(n).draw()}setPosition(t){return t!==O.Position.ABOVE&&t!==O.Position.BELOW||(this.position=t),this}setRenderOptions(t){return null!=t.height&&null!=t.y_shift&&null!=t.left_shift_px&&null!=t.right_shift_px&&(this.render_options=t),this}setNotes(t){if(!t.first_note&&!t.last_note)throw new d("BadArguments","Hairpin needs to have either first_note or last_note set.");return this.notes=t,this.first_note=t.first_note,this.last_note=t.last_note,this}renderHairpin(t){const e=this.checkContext();let i=this.render_options.y_shift+20,s=t.first_y;this.position===O.Position.ABOVE&&(i=30-i,s=t.first_y-t.staff_height);const n=this.render_options.left_shift_px,a=this.render_options.right_shift_px;switch(e.beginPath(),this.hairpin){case fi.type.CRESC:e.moveTo(t.last_x+a,s+i),e.lineTo(t.first_x+n,s+this.render_options.height/2+i),e.lineTo(t.last_x+a,s+this.render_options.height+i);break;case fi.type.DECRESC:e.moveTo(t.first_x+n,s+i),e.lineTo(t.last_x+a,s+this.render_options.height/2+i),e.lineTo(t.first_x+n,s+this.render_options.height+i)}e.stroke(),e.closePath()}draw(){this.checkContext(),this.setRendered();const t=this.first_note,e=this.last_note;if(!t||!e)throw new d("NoNote","Notes required to draw");const i=t.getModifierStartXY(this.position,0),s=e.getModifierStartXY(this.position,0);this.renderHairpin({first_x:i.x,last_x:s.x,first_y:t.checkStave().getY()+t.checkStave().getHeight(),last_y:e.checkStave().getY()+e.checkStave().getHeight(),staff_height:t.checkStave().getHeight()})}}fi.type={CRESC:1,DECRESC:2};class _i extends Pt{constructor(t,e){if(super(t,"sl."),!e){let i=t.first_note.getPositions()[0].fret;"string"==typeof i&&(i=parseInt(i,10));let s=t.last_note.getPositions()[0].fret;"string"==typeof s&&(s=parseInt(s,10)),e=isNaN(i)||isNaN(s)?_i.SLIDE_UP:i>s?_i.SLIDE_DOWN:_i.SLIDE_UP}this.direction=e,this.render_options.cp1=11,this.render_options.cp2=14,this.render_options.y_shift=.5,this.resetFont()}static get CATEGORY(){return c.TabSlide}static get SLIDE_UP(){return 1}static get SLIDE_DOWN(){return-1}static createSlideUp(t){return new _i(t,_i.SLIDE_UP)}static createSlideDown(t){return new _i(t,_i.SLIDE_DOWN)}renderTie(t){if(0===t.first_ys.length||0===t.last_ys.length)throw new d("BadArguments","No Y-values to render");const e=this.checkContext(),i=t.first_x_px,s=t.first_ys,n=t.last_x_px,a=t.direction;if(a!==_i.SLIDE_UP&&a!==_i.SLIDE_DOWN)throw new d("BadSlide","Invalid slide direction");const o=this.notes.first_indices;for(let t=0;tthis.tuningValues.length)throw new d("BadArguments",`String number must be between 1 and ${this.tuningValues.length}:${t}`);return this.tuningValues[e-1]}getValueForFret(t,e){const i=this.getValueForString(e),s=Number(t);if(s<0)throw new d("BadArguments",`Fret number must be 0 or higher: ${t}`);return i+s}getNoteForFret(t,e){const i=this.getValueForFret(t,e),s=Math.floor(i/12),n=i%12;return`${K.integerToNote(n)}/${s}`}}var Si=function(t,e,i,s){return new(i||(i=Promise))((function(n,a){function o(t){try{h(s.next(t))}catch(t){a(t)}}function r(t){try{h(s.throw(t))}catch(t){a(t)}}function h(t){var e;t.done?n(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(o,r)}h((s=s.apply(t,e||[])).next())}))};class yi{static get BUILD(){return{VERSION:"4.0.1-alpha.2",ID:"0df10df6d1fab3a99f5aa306341a31c6e686d659",DATE:"2022-02-02T09:30:30.784Z"}}static get Flow(){return yi}static setMusicFont(...t){const e=t.map((t=>k.load(t)));return K.MUSIC_FONT_STACK=e,R.MUSIC_FONT_STACK=e.slice(),R.CURRENT_CACHE_KEY=t.join(","),e}static fetchMusicFont(t,e){return Si(this,void 0,void 0,(function*(){}))}static getMusicFont(){return K.MUSIC_FONT_STACK.map((t=>t.getName()))}static get NOTATION_FONT_SCALE(){return K.NOTATION_FONT_SCALE}static set NOTATION_FONT_SCALE(t){K.NOTATION_FONT_SCALE=t}static get TABLATURE_FONT_SCALE(){return K.TABLATURE_FONT_SCALE}static set TABLATURE_FONT_SCALE(t){K.TABLATURE_FONT_SCALE=t}static get RESOLUTION(){return K.RESOLUTION}static set RESOLUTION(t){K.RESOLUTION=t}static get SLASH_NOTEHEAD_WIDTH(){return K.SLASH_NOTEHEAD_WIDTH}static set SLASH_NOTEHEAD_WIDTH(t){K.SLASH_NOTEHEAD_WIDTH=t}static get STAVE_LINE_DISTANCE(){return K.STAVE_LINE_DISTANCE}static set STAVE_LINE_DISTANCE(t){K.STAVE_LINE_DISTANCE=t}static get STAVE_LINE_THICKNESS(){return K.STAVE_LINE_THICKNESS}static set STAVE_LINE_THICKNESS(t){K.STAVE_LINE_THICKNESS=t}static get STEM_HEIGHT(){return K.STEM_HEIGHT}static set STEM_HEIGHT(t){K.STEM_HEIGHT=t}static get STEM_WIDTH(){return K.STEM_WIDTH}static set STEM_WIDTH(t){K.STEM_WIDTH=t}static get TIME4_4(){return K.TIME4_4}static get accidentalMap(){return K.accidentalMap}static get unicode(){return K.unicode}static keySignature(t){return K.keySignature(t)}static hasKeySignature(t){return K.hasKeySignature(t)}static getKeySignatures(){return K.getKeySignatures()}static clefProperties(t){return K.clefProperties(t)}static keyProperties(t,e,i){return K.keyProperties(t,e,i)}static durationToTicks(t){return K.durationToTicks(t)}}yi.Accidental=J,yi.Annotation=at,yi.Articulation=gt,yi.Barline=vt,yi.BarNote=Et,yi.Beam=Ne,yi.Bend=Ct,yi.BoundingBox=y,yi.BoundingBoxComputation=T,yi.CanvasContext=Ht,yi.ChordSymbol=Dt,yi.Clef=ae,yi.ClefNote=Ae,yi.Crescendo=Fe,yi.Curve=Be,yi.Dot=Nt,yi.EasyScore=He,yi.Element=A,yi.Factory=mi,yi.Font=k,yi.Formatter=we,yi.Fraction=x,yi.FretHandFinger=At,yi.GhostNote=Ve,yi.Glyph=R,yi.GlyphNote=ze,yi.GraceNote=Ke,yi.GraceNoteGroup=Mt,yi.GraceTabNote=class extends ai{static get CATEGORY(){return c.GraceTabNote}constructor(t){super(t,!1),this.render_options=Object.assign(Object.assign({},this.render_options),{y_shift:.3,scale:.6,font:`7.5pt ${k.SANS_SERIF}`}),this.updateWidth()}},yi.KeyManager=class{constructor(t){this.music=new L,this.setKey(t)}setKey(t){return this.key=t,this.reset(),this}getKey(){return this.key}reset(){this.keyParts=this.music.getKeyParts(this.key),this.keyString=this.keyParts.root,this.keyParts.accidental&&(this.keyString+=this.keyParts.accidental);if(!L.scaleTypes[this.keyParts.type])throw new d("BadArguments",`Unsupported key type: ${this.key}`);this.scale=this.music.getScaleTones(this.music.getNoteValue(this.keyString),L.scaleTypes[this.keyParts.type]),this.scaleMap={},this.scaleMapByValue={},this.originalScaleMapByValue={};const t=L.root_indices[this.keyParts.root];for(let e=0;e1){const s=[];let n;t.sort(e);for(let e=0;e":{x_min:35,x_max:421,y_min:28,y_max:632,ha:604,leftSideBearing:35,advanceWidth:466},"?":{x_min:45,x_max:548,y_min:-17,y_max:767,ha:784,leftSideBearing:45,advanceWidth:592},"@":{x_min:51,x_max:730,y_min:-78,y_max:753,ha:831,leftSideBearing:51,advanceWidth:781},A:{x_min:37,x_max:554,y_min:-4,y_max:746,ha:750,leftSideBearing:37,advanceWidth:617},B:{x_min:37,x_max:532,y_min:3,y_max:783,ha:780,leftSideBearing:37,advanceWidth:579},C:{x_min:37,x_max:583,y_min:-3,y_max:775,ha:778,leftSideBearing:37,advanceWidth:623},D:{x_min:50,x_max:530,y_min:-15,y_max:749,ha:764,leftSideBearing:50,advanceWidth:579},E:{x_min:45,x_max:531,y_min:-1,y_max:743,ha:744,leftSideBearing:45,advanceWidth:585},F:{x_min:45,x_max:459,y_min:23,y_max:727,ha:704,leftSideBearing:45,advanceWidth:510},G:{x_min:31,x_max:577,y_min:-8,y_max:733,ha:741,leftSideBearing:31,advanceWidth:611},H:{x_min:37,x_max:493,y_min:-22,y_max:758,ha:780,leftSideBearing:37,advanceWidth:535},I:{x_min:47,x_max:501,y_min:-3,y_max:731,ha:734,leftSideBearing:47,advanceWidth:541},J:{x_min:33,x_max:531,y_min:-23,y_max:725,ha:748,leftSideBearing:33,advanceWidth:573},K:{x_min:43,x_max:505,y_min:-10,y_max:740,ha:750,leftSideBearing:43,advanceWidth:560},L:{x_min:49,x_max:457,y_min:-2,y_max:746,ha:748,leftSideBearing:49,advanceWidth:510},M:{x_min:35,x_max:699,y_min:1,y_max:744,ha:743,leftSideBearing:35,advanceWidth:743},N:{x_min:34,x_max:533,y_min:-17,y_max:761,ha:778,leftSideBearing:34,advanceWidth:579},O:{x_min:41,x_max:608,y_min:-5,y_max:735,ha:740,leftSideBearing:41,advanceWidth:667},P:{x_min:53,x_max:451,y_min:-18,y_max:735,ha:753,leftSideBearing:53,advanceWidth:497},Q:{x_min:40,x_max:599,y_min:-67,y_max:744,ha:811,leftSideBearing:40,advanceWidth:648},R:{x_min:39,x_max:487,y_min:16,y_max:735,ha:719,leftSideBearing:39,advanceWidth:535},S:{x_min:35,x_max:552,y_min:-47,y_max:708,ha:755,leftSideBearing:35,advanceWidth:604},T:{x_min:26,x_max:656,y_min:-13,y_max:718,ha:731,leftSideBearing:26,advanceWidth:705},U:{x_min:41,x_max:518,y_min:-20,y_max:748,ha:768,leftSideBearing:41,advanceWidth:567},V:{x_min:47,x_max:509,y_min:-26,y_max:744,ha:770,leftSideBearing:47,advanceWidth:567},W:{x_min:44,x_max:789,y_min:-35,y_max:720,ha:755,leftSideBearing:44,advanceWidth:833},X:{x_min:63,x_max:635,y_min:-10,y_max:745,ha:755,leftSideBearing:63,advanceWidth:680},Y:{x_min:43,x_max:503,y_min:-21,y_max:734,ha:755,leftSideBearing:43,advanceWidth:541},Z:{x_min:42,x_max:584,y_min:-10,y_max:739,ha:749,leftSideBearing:42,advanceWidth:629},"[":{x_min:46,x_max:346,y_min:-150,y_max:884,ha:1034,leftSideBearing:46,advanceWidth:291},"\\":{x_min:20,x_max:616,y_min:-100,y_max:797,ha:897,leftSideBearing:20,advanceWidth:645},"]":{x_min:-76,x_max:226,y_min:-150,y_max:881,ha:1031,leftSideBearing:-76,advanceWidth:297},"^":{x_min:43,x_max:437,y_min:517,y_max:812,ha:295,leftSideBearing:43,advanceWidth:478},_:{x_min:29,x_max:563,y_min:-110,y_max:-1,ha:109,leftSideBearing:29,advanceWidth:598},"`":{x_min:54,x_max:321,y_min:540,y_max:747,ha:207,leftSideBearing:54,advanceWidth:368},a:{x_min:20,x_max:447,y_min:-17,y_max:495,ha:512,leftSideBearing:20,advanceWidth:494},b:{x_min:37,x_max:466,y_min:-27,y_max:770,ha:797,leftSideBearing:37,advanceWidth:510},c:{x_min:35,x_max:456,y_min:-9,y_max:507,ha:516,leftSideBearing:35,advanceWidth:460},d:{x_min:45,x_max:520,y_min:-15,y_max:764,ha:779,leftSideBearing:45,advanceWidth:560},e:{x_min:33,x_max:370,y_min:-5,y_max:501,ha:506,leftSideBearing:33,advanceWidth:397},f:{x_min:35,x_max:411,y_min:-13,y_max:695,ha:708,leftSideBearing:35,advanceWidth:453},g:{x_min:33,x_max:551,y_min:-257,y_max:505,ha:762,leftSideBearing:33,advanceWidth:611},h:{x_min:32,x_max:458,y_min:-29,y_max:743,ha:772,leftSideBearing:32,advanceWidth:491},i:{x_min:45,x_max:167,y_min:-13,y_max:631,ha:644,leftSideBearing:45,advanceWidth:220},j:{x_min:-127,x_max:261,y_min:-231,y_max:601,ha:832,leftSideBearing:-127,advanceWidth:308},k:{x_min:39,x_max:443,y_min:-3,y_max:700,ha:703,leftSideBearing:39,advanceWidth:497},l:{x_min:58,x_max:168,y_min:-8,y_max:686,ha:694,leftSideBearing:58,advanceWidth:227},m:{x_min:39,x_max:688,y_min:-14,y_max:501,ha:515,leftSideBearing:39,advanceWidth:718},n:{x_min:45,x_max:491,y_min:-32,y_max:512,ha:544,leftSideBearing:45,advanceWidth:541},o:{x_min:41,x_max:424,y_min:-12,y_max:493,ha:505,leftSideBearing:41,advanceWidth:447},p:{x_min:25,x_max:529,y_min:-260,y_max:500,ha:760,leftSideBearing:25,advanceWidth:573},q:{x_min:53,x_max:603,y_min:-235,y_max:514,ha:749,leftSideBearing:53,advanceWidth:623},r:{x_min:32,x_max:407,y_min:-7,y_max:492,ha:499,leftSideBearing:32,advanceWidth:460},s:{x_min:49,x_max:416,y_min:-12,y_max:519,ha:531,leftSideBearing:49,advanceWidth:460},t:{x_min:32,x_max:442,y_min:-5,y_max:684,ha:689,leftSideBearing:32,advanceWidth:469},u:{x_min:41,x_max:487,y_min:-5,y_max:507,ha:512,leftSideBearing:41,advanceWidth:510},v:{x_min:16,x_max:441,y_min:-20,y_max:542,ha:562,leftSideBearing:16,advanceWidth:456},w:{x_min:39,x_max:639,y_min:-22,y_max:505,ha:527,leftSideBearing:39,advanceWidth:661},x:{x_min:15,x_max:505,y_min:-39,y_max:539,ha:578,leftSideBearing:15,advanceWidth:541},y:{x_min:-98,x_max:501,y_min:-242,y_max:511,ha:753,leftSideBearing:-98,advanceWidth:548},z:{x_min:27,x_max:479,y_min:-3,y_max:494,ha:497,leftSideBearing:27,advanceWidth:494},"{":{x_min:0,x_max:0,y_min:0,y_max:0,ha:0,leftSideBearing:0,advanceWidth:308},"|":{x_min:0,x_max:0,y_min:0,y_max:0,ha:0,leftSideBearing:0,advanceWidth:308},"}":{x_min:0,x_max:0,y_min:0,y_max:0,ha:0,leftSideBearing:0,advanceWidth:308},"~":{x_min:0,x_max:0,y_min:0,y_max:0,ha:0,leftSideBearing:0,advanceWidth:308}},fontFamily:"PetalumaScript",resolution:1e3,generatedOn:"2020-06-14T18:33:25.407Z"},wi={spacing:50,glyphs:{" ":{x_min:0,x_max:509,y_min:0,y_max:2e3,ha:2e3,leftSideBearing:0,advanceWidth:509},0:{x_min:121,x_max:1048,y_min:-21,y_max:1477,ha:1498,leftSideBearing:121,advanceWidth:1168},1:{x_min:117,x_max:767,y_min:0,y_max:1456,ha:1456,leftSideBearing:117,advanceWidth:844},2:{x_min:75.8474576645637,x_max:1040,y_min:0,y_max:1477,ha:1477,leftSideBearing:75,advanceWidth:1131},3:{x_min:74.85365853658536,x_max:994,y_min:-21,y_max:1477,ha:1498,leftSideBearing:74,advanceWidth:1106},4:{x_min:63,x_max:1114,y_min:0,y_max:1456,ha:1456,leftSideBearing:63,advanceWidth:1187},5:{x_min:96.8448275474953,x_max:982,y_min:-21,y_max:1456,ha:1477,leftSideBearing:96,advanceWidth:1081},6:{x_min:121,x_max:1067,y_min:-21,y_max:1477,ha:1498,leftSideBearing:121,advanceWidth:1144},7:{x_min:76,x_max:1060,y_min:0,y_max:1456,ha:1456,leftSideBearing:-30,advanceWidth:1128},8:{x_min:92,x_max:1039,y_min:-21,y_max:1477,ha:1498,leftSideBearing:92,advanceWidth:1131},9:{x_min:84,x_max:1026,y_min:-21,y_max:1477,ha:1498,leftSideBearing:84,advanceWidth:1154},"!":{x_min:143,x_max:340,y_min:0,y_max:1456,ha:1456,leftSideBearing:143,advanceWidth:483},'"':{x_min:166,x_max:634,y_min:1055,y_max:1560,ha:505,leftSideBearing:166,advanceWidth:770},"#":{x_min:63,x_max:1179,y_min:0,y_max:1456,ha:1456,leftSideBearing:63,advanceWidth:1246},$:{x_min:81.92156915727656,x_max:1012,y_min:-208,y_max:1693,ha:1901,leftSideBearing:81,advanceWidth:1110},"%":{x_min:77,x_max:1384,y_min:-21,y_max:1477,ha:1498,leftSideBearing:77,advanceWidth:1460},"&":{x_min:74,x_max:1242,y_min:-21,y_max:1477,ha:1498,leftSideBearing:74,advanceWidth:1289},"'":{x_min:166,x_max:324,y_min:1055,y_max:1560,ha:505,leftSideBearing:166,advanceWidth:460},"(":{x_min:114,x_max:650,y_min:-463,y_max:1636,ha:2099,leftSideBearing:114,advanceWidth:662},")":{x_min:11,x_max:547,y_min:-463,y_max:1636,ha:2099,leftSideBearing:11,advanceWidth:654},"*":{x_min:66,x_max:893,y_min:607,y_max:1456,ha:849,leftSideBearing:66,advanceWidth:958},"+":{x_min:73,x_max:1071,y_min:146,y_max:1206,ha:1060,leftSideBearing:73,advanceWidth:1145},",":{x_min:23,x_max:315,y_min:-311,y_max:221,ha:532,leftSideBearing:23,advanceWidth:404},"-":{x_min:154,x_max:643,y_min:538,y_max:692,ha:154,leftSideBearing:154,advanceWidth:797},".":{x_min:145,x_max:342,y_min:0,y_max:202,ha:202,leftSideBearing:145,advanceWidth:493},"/":{x_min:0,x_max:774,y_min:-125,y_max:1456,ha:1581,leftSideBearing:0,advanceWidth:824},":":{x_min:145,x_max:342,y_min:0,y_max:1082,ha:1082,leftSideBearing:145,advanceWidth:419},";":{x_min:53,x_max:345,y_min:-311,y_max:1082,ha:1393,leftSideBearing:53,advanceWidth:424},"<":{x_min:76,x_max:892,y_min:107,y_max:1013,ha:906,leftSideBearing:76,advanceWidth:1017},"=":{x_min:147,x_max:981,y_min:407,y_max:987,ha:580,leftSideBearing:147,advanceWidth:1127},">":{x_min:125,x_max:980,y_min:87,y_max:993,ha:906,leftSideBearing:125,advanceWidth:1060},"?":{x_min:65.92660602419838,x_max:890,y_min:0,y_max:1477,ha:1477,leftSideBearing:65,advanceWidth:953},"@":{x_min:84.3592218305664,x_max:1705.2346925277395,y_min:-453,y_max:1431,ha:1884,leftSideBearing:84,advanceWidth:1821},A:{x_min:70,x_max:1463,y_min:0,y_max:1456,ha:1456,leftSideBearing:70,advanceWidth:1533},B:{x_min:81,x_max:1253,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1322},C:{x_min:80,x_max:1174,y_min:-21,y_max:1477,ha:1498,leftSideBearing:80,advanceWidth:1290},D:{x_min:81,x_max:1291,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1356},E:{x_min:81,x_max:1190,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1306},F:{x_min:81,x_max:1176,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1256},G:{x_min:80,x_max:1226,y_min:-21,y_max:1477,ha:1498,leftSideBearing:80,advanceWidth:1346},H:{x_min:81,x_max:1497,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1578},I:{x_min:81,x_max:604,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:685},J:{x_min:60,x_max:1100,y_min:-21,y_max:1456,ha:1477,leftSideBearing:60,advanceWidth:1169},K:{x_min:81,x_max:1427,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1501},L:{x_min:81,x_max:1130,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1210},M:{x_min:94,x_max:1888,y_min:0,y_max:1456,ha:1456,leftSideBearing:94,advanceWidth:1982},N:{x_min:83,x_max:1509,y_min:0,y_max:1456,ha:1456,leftSideBearing:83,advanceWidth:1592},O:{x_min:70,x_max:1281,y_min:-21,y_max:1477,ha:1498,leftSideBearing:70,advanceWidth:1351},P:{x_min:81,x_max:1242,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1297},Q:{x_min:70,x_max:1348,y_min:-245,y_max:1477,ha:1722,leftSideBearing:70,advanceWidth:1376},R:{x_min:81,x_max:1285,y_min:0,y_max:1455,ha:1455,leftSideBearing:81,advanceWidth:1385},S:{x_min:115,x_max:1116,y_min:-21,y_max:1477,ha:1498,leftSideBearing:115,advanceWidth:1206},T:{x_min:96,x_max:1306,y_min:0,y_max:1456,ha:1456,leftSideBearing:96,advanceWidth:1406},U:{x_min:70,x_max:1452,y_min:-21,y_max:1456,ha:1477,leftSideBearing:70,advanceWidth:1522},V:{x_min:65,x_max:1443,y_min:0,y_max:1456,ha:1456,leftSideBearing:65,advanceWidth:1508},W:{x_min:72,x_max:2057,y_min:0,y_max:1456,ha:1456,leftSideBearing:72,advanceWidth:2129},X:{x_min:80,x_max:1449,y_min:0,y_max:1456,ha:1456,leftSideBearing:80,advanceWidth:1529},Y:{x_min:65,x_max:1396,y_min:0,y_max:1456,ha:1456,leftSideBearing:65,advanceWidth:1461},Z:{x_min:90,x_max:1107,y_min:0,y_max:1456,ha:1456,leftSideBearing:90,advanceWidth:1197},"[":{x_min:157,x_max:541,y_min:-312,y_max:1664,ha:1976,leftSideBearing:157,advanceWidth:573},"\\":{x_min:36,x_max:830,y_min:-125,y_max:1456,ha:1581,leftSideBearing:36,advanceWidth:841},"]":{x_min:23,x_max:408,y_min:-312,y_max:1664,ha:1976,leftSideBearing:23,advanceWidth:552},"^":{x_min:71,x_max:802,y_min:729,y_max:1456,ha:727,leftSideBearing:71,advanceWidth:864},_:{x_min:119,x_max:1041,y_min:-154,y_max:0,ha:154,leftSideBearing:119,advanceWidth:1168},"`":{x_min:40,x_max:456,y_min:1288,y_max:1560,ha:272,leftSideBearing:40,advanceWidth:496},a:{x_min:79,x_max:1053,y_min:-21,y_max:1102,ha:1123,leftSideBearing:79,advanceWidth:1132},b:{x_min:-16,x_max:1071,y_min:-21,y_max:1560,ha:1581,leftSideBearing:-16,advanceWidth:1145},c:{x_min:78,x_max:988,y_min:-21,y_max:1102,ha:1123,leftSideBearing:78,advanceWidth:1067},d:{x_min:78,x_max:1156,y_min:-21,y_max:1560,ha:1581,leftSideBearing:78,advanceWidth:1218},e:{x_min:74,x_max:980,y_min:-21,y_max:1102,ha:1123,leftSideBearing:74,advanceWidth:1059},f:{x_min:64,x_max:731,y_min:0,y_max:1581,ha:1581,leftSideBearing:64,advanceWidth:725},g:{x_min:78,x_max:1133,y_min:-437,y_max:1102,ha:1539,leftSideBearing:78,advanceWidth:1157},h:{x_min:49,x_max:1255,y_min:0,y_max:1560,ha:1560,leftSideBearing:49,advanceWidth:1315},i:{x_min:67,x_max:590,y_min:0,y_max:1560,ha:1560,leftSideBearing:67,advanceWidth:652},j:{x_min:-56,x_max:381,y_min:-437,y_max:1560,ha:1997,leftSideBearing:-56,advanceWidth:525},k:{x_min:64,x_max:1248,y_min:0,y_max:1560,ha:1560,leftSideBearing:64,advanceWidth:1287},l:{x_min:64,x_max:587,y_min:0,y_max:1560,ha:1560,leftSideBearing:64,advanceWidth:653},m:{x_min:74,x_max:1905,y_min:0,y_max:1102,ha:1102,leftSideBearing:74,advanceWidth:1977},n:{x_min:74,x_max:1278,y_min:0,y_max:1102,ha:1102,leftSideBearing:74,advanceWidth:1343},o:{x_min:78,x_max:1046,y_min:-21,y_max:1102,ha:1123,leftSideBearing:78,advanceWidth:1124},p:{x_min:34,x_max:1119,y_min:-416,y_max:1102,ha:1518,leftSideBearing:34,advanceWidth:1197},q:{x_min:78,x_max:1135,y_min:-416,y_max:1102,ha:1518,leftSideBearing:78,advanceWidth:1139},r:{x_min:72,x_max:808,y_min:0,y_max:1102,ha:1102,leftSideBearing:72,advanceWidth:854},s:{x_min:104,x_max:933,y_min:-21,y_max:1102,ha:1123,leftSideBearing:104,advanceWidth:1022},t:{x_min:24,x_max:678,y_min:-17,y_max:1343,ha:1360,leftSideBearing:24,advanceWidth:730},u:{x_min:52,x_max:1181,y_min:-21,y_max:1082,ha:1103,leftSideBearing:52,advanceWidth:1245},v:{x_min:26,x_max:1176,y_min:0,y_max:1082,ha:1082,leftSideBearing:26,advanceWidth:1206},w:{x_min:52,x_max:1777,y_min:0,y_max:1082,ha:1082,leftSideBearing:52,advanceWidth:1823},x:{x_min:42,x_max:1163,y_min:0,y_max:1082,ha:1082,leftSideBearing:42,advanceWidth:1203},y:{x_min:24,x_max:1172,y_min:-437,y_max:1082,ha:1519,leftSideBearing:24,advanceWidth:1192},z:{x_min:88,x_max:960,y_min:0,y_max:1082,ha:1082,leftSideBearing:88,advanceWidth:1032},"{":{x_min:63,x_max:671,y_min:-364,y_max:1597,ha:1961,leftSideBearing:63,advanceWidth:701},"|":{x_min:150,x_max:307,y_min:-270,y_max:1456,ha:1726,leftSideBearing:150,advanceWidth:451},"}":{x_min:27,x_max:635,y_min:-364,y_max:1597,ha:1961,leftSideBearing:27,advanceWidth:701},"~":{x_min:121,x_max:1257,y_min:401,y_max:803,ha:402,leftSideBearing:121,advanceWidth:1386}},fontFamily:"Roboto Slab",resolution:2048,generatedOn:"2020-06-15T19:12:58.120Z"};var vi=function(t,e,i,s){return new(i||(i=Promise))((function(n,a){function o(t){try{h(s.next(t))}catch(t){a(t)}}function r(t){try{h(s.throw(t))}catch(t){a(t)}}function h(t){var e;t.done?n(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(o,r)}h((s=s.apply(t,e||[])).next())}))};const Ei={Bravura:"./vexflow-font-bravura.js",Gonville:"./vexflow-font-gonville.js",Petaluma:"./vexflow-font-petaluma.js",Custom:"./vexflow-font-custom.js"};yi.fetchMusicFont=(t,e)=>vi(void 0,void 0,void 0,(function*(){const i=k.load(t);if(i.hasData())return;if(!e){if(!(t in Ei))throw new d("UnknownFont",`Music font ${t} does not exist.`);e=Ei[t]}let s;if("string"==typeof e){const i=yield import(e),n=l().VexFlowFont;s=void 0!==n&&void 0!==n[t]?n[t]:i.Font}else s=e;i.setData(s.data),i.setMetrics(s.metrics)})),function(){{const t=wi,{fontFamily:e,resolution:i,glyphs:s}=t;k.load(e,t);const n="b";it.registerInfo({family:e,resolution:i,glyphs:s,maxSizeGlyph:n,monospaced:!1,bold:!1,italic:!1,superscriptOffset:.66,subscriptOffset:.66,serifs:!0,description:"Text font to pair with the Bravura / Gonville music fonts."})}{const t=bi,{fontFamily:e,resolution:i,glyphs:s}=t;k.load(e,t);const n="b";it.registerInfo({family:e,resolution:i,glyphs:s,maxSizeGlyph:n,monospaced:!1,bold:!1,italic:!1,superscriptOffset:.66,subscriptOffset:.66,serifs:!1,description:"Text font to pair with the Petaluma music font."})}}();const Ci=Ti;return e=e.default})()})); +//# sourceMappingURL=vexflow-core.js.map \ No newline at end of file diff --git a/build/cjs/vexflow-core.js.map b/build/cjs/vexflow-core.js.map new file mode 100644 index 0000000000..777c972a15 --- /dev/null +++ b/build/cjs/vexflow-core.js.map @@ -0,0 +1 @@ +{"version":3,"file":"vexflow-core.js","mappings":"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","sources":["webpack://Vex/webpack/universalModuleDefinition","webpack://Vex/webpack/bootstrap","webpack://Vex/webpack/runtime/define property getters","webpack://Vex/webpack/runtime/global","webpack://Vex/webpack/runtime/hasOwnProperty shorthand","webpack://Vex/./src/typeguard.ts","webpack://Vex/./src/util.ts","webpack://Vex/./src/fraction.ts","webpack://Vex/./src/boundingbox.ts","webpack://Vex/./src/boundingboxcomputation.ts","webpack://Vex/./src/font.ts","webpack://Vex/./src/registry.ts","webpack://Vex/./src/element.ts","webpack://Vex/./src/glyph.ts","webpack://Vex/./src/modifier.ts","webpack://Vex/./src/music.ts","webpack://Vex/./src/tables.ts","webpack://Vex/./src/accidental.ts","webpack://Vex/./src/stem.ts","webpack://Vex/./src/textformatter.ts","webpack://Vex/./src/annotation.ts","webpack://Vex/./src/articulation.ts","webpack://Vex/./src/rendercontext.ts","webpack://Vex/./src/tickable.ts","webpack://Vex/./src/note.ts","webpack://Vex/./src/stavemodifier.ts","webpack://Vex/./src/stavebarline.ts","webpack://Vex/./src/chordsymbol.ts","webpack://Vex/./src/voice.ts","webpack://Vex/./src/barnote.ts","webpack://Vex/./src/bend.ts","webpack://Vex/./src/dot.ts","webpack://Vex/./src/frethandfinger.ts","webpack://Vex/./src/stavetie.ts","webpack://Vex/./src/tabtie.ts","webpack://Vex/./src/gracenotegroup.ts","webpack://Vex/./src/notesubgroup.ts","webpack://Vex/./src/tickcontext.ts","webpack://Vex/./src/ornament.ts","webpack://Vex/./src/parenthesis.ts","webpack://Vex/./src/notehead.ts","webpack://Vex/./src/stemmablenote.ts","webpack://Vex/./src/stavenote.ts","webpack://Vex/./src/web.ts","webpack://Vex/./src/canvascontext.ts","webpack://Vex/./src/svgcontext.ts","webpack://Vex/./src/renderer.ts","webpack://Vex/./src/textnote.ts","webpack://Vex/./src/stavevolta.ts","webpack://Vex/./src/stringnumber.ts","webpack://Vex/./src/strokes.ts","webpack://Vex/./src/vibrato.ts","webpack://Vex/./src/modifiercontext.ts","webpack://Vex/./src/clef.ts","webpack://Vex/./src/keysignature.ts","webpack://Vex/./src/staverepetition.ts","webpack://Vex/./src/stavesection.ts","webpack://Vex/./src/stavetempo.ts","webpack://Vex/./src/stavetext.ts","webpack://Vex/./src/timesigglyph.ts","webpack://Vex/./src/timesignature.ts","webpack://Vex/./src/stave.ts","webpack://Vex/./src/staveconnector.ts","webpack://Vex/./src/formatter.ts","webpack://Vex/./src/tuplet.ts","webpack://Vex/./src/beam.ts","webpack://Vex/./src/clefnote.ts","webpack://Vex/./src/crescendo.ts","webpack://Vex/./src/curve.ts","webpack://Vex/./src/parser.ts","webpack://Vex/./src/easyscore.ts","webpack://Vex/./src/ghostnote.ts","webpack://Vex/./src/glyphnote.ts","webpack://Vex/./src/gracenote.ts","webpack://Vex/./src/keysignote.ts","webpack://Vex/./src/multimeasurerest.ts","webpack://Vex/./src/pedalmarking.ts","webpack://Vex/./src/repeatnote.ts","webpack://Vex/./src/staveline.ts","webpack://Vex/./src/system.ts","webpack://Vex/./src/tabnote.ts","webpack://Vex/./src/tabstave.ts","webpack://Vex/./src/textbracket.ts","webpack://Vex/./src/textdynamics.ts","webpack://Vex/./src/timesignote.ts","webpack://Vex/./src/vibratobracket.ts","webpack://Vex/./src/factory.ts","webpack://Vex/./src/stavehairpin.ts","webpack://Vex/./src/tabslide.ts","webpack://Vex/./src/tuning.ts","webpack://Vex/./src/flow.ts","webpack://Vex/./src/version.ts","webpack://Vex/./src/gracetabnote.ts","webpack://Vex/./src/keymanager.ts","webpack://Vex/./src/tremolo.ts","webpack://Vex/./src/vex.ts","webpack://Vex/./src/fonts/petalumascript_glyphs.ts","webpack://Vex/./src/fonts/robotoslab_glyphs.ts","webpack://Vex/./entry/vexflow-core.ts","webpack://Vex/./src/fonts/textfonts.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Vex\"] = factory();\n\telse\n\t\troot[\"Vex\"] = factory();\n})((typeof window !== 'undefined' ? window : typeof globalThis !== 'undefined' ? globalThis : this), function() {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Ron B. Yeh\n// MIT License\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * Use instead of `instanceof` as a more flexible type guard.\n * @param obj check if this object's CATEGORY matches the provided category.\n * @param category a string representing a category of VexFlow objects.\n * @param checkAncestors defaults to `true`, so we walk up the prototype chain to look for a matching `CATEGORY`.\n * If `false`, we do not check the superclass or other ancestors.\n * @returns true if `obj` has a static `CATEGORY` property that matches `category`.\n */\nexport function isCategory(obj, category, checkAncestors = true) {\n // obj is undefined, a number, a primitive string, or null.\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n // `obj.constructor` is a reference to the constructor function that created the `obj` instance.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor\n let constructorFcn = obj.constructor;\n // Check if the object's static .CATEGORY matches the provided category.\n if (checkAncestors) {\n // Walk up the prototype chain to look for a matching obj.constructor.CATEGORY.\n while (obj !== null) {\n constructorFcn = obj.constructor;\n if ('CATEGORY' in constructorFcn && constructorFcn.CATEGORY === category) {\n return true;\n }\n obj = Object.getPrototypeOf(obj);\n }\n return false;\n }\n else {\n // Do not walk up the prototype chain. Just check this particular object's static .CATEGORY string.\n return 'CATEGORY' in constructorFcn && constructorFcn.CATEGORY === category;\n }\n}\nexport const isAccidental = (obj) => isCategory(obj, Category.Accidental);\nexport const isAnnotation = (obj) => isCategory(obj, Category.Annotation);\nexport const isBarline = (obj) => isCategory(obj, Category.Barline);\nexport const isDot = (obj) => isCategory(obj, Category.Dot);\nexport const isGraceNote = (obj) => isCategory(obj, Category.GraceNote);\nexport const isGraceNoteGroup = (obj) => isCategory(obj, Category.GraceNoteGroup);\nexport const isNote = (obj) => isCategory(obj, Category.Note);\nexport const isRenderContext = (obj) => isCategory(obj, Category.RenderContext);\nexport const isStaveNote = (obj) => isCategory(obj, Category.StaveNote);\nexport const isStemmableNote = (obj) => isCategory(obj, Category.StemmableNote);\nexport const isTabNote = (obj) => isCategory(obj, Category.TabNote);\n// 'const' enums are erased by the TypeScript compiler. The string values are inlined at all the use sites.\n// See: https://www.typescriptlang.org/docs/handbook/enums.html#const-enums\nexport var Category;\n(function (Category) {\n Category[\"Accidental\"] = \"Accidental\";\n Category[\"Annotation\"] = \"Annotation\";\n Category[\"Articulation\"] = \"Articulation\";\n Category[\"Barline\"] = \"Barline\";\n Category[\"BarNote\"] = \"BarNote\";\n Category[\"Beam\"] = \"Beam\";\n Category[\"Bend\"] = \"Bend\";\n Category[\"ChordSymbol\"] = \"ChordSymbol\";\n Category[\"Clef\"] = \"Clef\";\n Category[\"ClefNote\"] = \"ClefNote\";\n Category[\"Crescendo\"] = \"Crescendo\";\n Category[\"Curve\"] = \"Curve\";\n Category[\"Dot\"] = \"Dot\";\n Category[\"Element\"] = \"Element\";\n Category[\"Fraction\"] = \"Fraction\";\n Category[\"FretHandFinger\"] = \"FretHandFinger\";\n Category[\"GhostNote\"] = \"GhostNote\";\n Category[\"Glyph\"] = \"Glyph\";\n Category[\"GlyphNote\"] = \"GlyphNote\";\n Category[\"GraceNote\"] = \"GraceNote\";\n Category[\"GraceNoteGroup\"] = \"GraceNoteGroup\";\n Category[\"GraceTabNote\"] = \"GraceTabNote\";\n Category[\"KeySignature\"] = \"KeySignature\";\n Category[\"KeySigNote\"] = \"KeySigNote\";\n Category[\"Modifier\"] = \"Modifier\";\n Category[\"MultiMeasureRest\"] = \"MultiMeasureRest\";\n Category[\"Note\"] = \"Note\";\n Category[\"NoteHead\"] = \"NoteHead\";\n Category[\"NoteSubGroup\"] = \"NoteSubGroup\";\n Category[\"Ornament\"] = \"Ornament\";\n Category[\"Parenthesis\"] = \"Parenthesis\";\n Category[\"PedalMarking\"] = \"PedalMarking\";\n Category[\"RenderContext\"] = \"RenderContext\";\n Category[\"RepeatNote\"] = \"RepeatNote\";\n Category[\"Repetition\"] = \"Repetition\";\n Category[\"Stave\"] = \"Stave\";\n Category[\"StaveConnector\"] = \"StaveConnector\";\n Category[\"StaveHairpin\"] = \"StaveHairpin\";\n Category[\"StaveLine\"] = \"StaveLine\";\n Category[\"StaveModifier\"] = \"StaveModifier\";\n Category[\"StaveNote\"] = \"StaveNote\";\n Category[\"StaveSection\"] = \"StaveSection\";\n Category[\"StaveTempo\"] = \"StaveTempo\";\n Category[\"StaveText\"] = \"StaveText\";\n Category[\"StaveTie\"] = \"StaveTie\";\n Category[\"Stem\"] = \"Stem\";\n Category[\"StemmableNote\"] = \"StemmableNote\";\n Category[\"StringNumber\"] = \"StringNumber\";\n Category[\"Stroke\"] = \"Stroke\";\n Category[\"System\"] = \"System\";\n Category[\"TabNote\"] = \"TabNote\";\n Category[\"TabSlide\"] = \"TabSlide\";\n Category[\"TabStave\"] = \"TabStave\";\n Category[\"TabTie\"] = \"TabTie\";\n Category[\"TextBracket\"] = \"TextBracket\";\n Category[\"TextDynamics\"] = \"TextDynamics\";\n Category[\"TextNote\"] = \"TextNote\";\n Category[\"Tickable\"] = \"Tickable\";\n Category[\"TimeSignature\"] = \"TimeSignature\";\n Category[\"TimeSigNote\"] = \"TimeSigNote\";\n Category[\"Tremolo\"] = \"Tremolo\";\n Category[\"Tuplet\"] = \"Tuplet\";\n Category[\"Vibrato\"] = \"Vibrato\";\n Category[\"VibratoBracket\"] = \"VibratoBracket\";\n Category[\"Voice\"] = \"Voice\";\n Category[\"Volta\"] = \"Volta\";\n})(Category || (Category = {}));\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// Note: Keep this module free of imports to reduce the chance of circular dependencies.\n/** `RuntimeError` will be thrown by VexFlow classes in case of error. */\nexport class RuntimeError extends Error {\n constructor(code, message = '') {\n super('[RuntimeError] ' + code + ': ' + message);\n this.code = code;\n }\n}\n/** VexFlow can be used outside of the browser (e.g., Node) where `window` may not be defined. */\n// eslint-disable-next-line\nexport function globalObject() {\n if (typeof globalThis !== 'undefined') {\n return globalThis;\n }\n if (typeof self !== 'undefined') {\n return self;\n }\n if (typeof window !== 'undefined') {\n return window;\n }\n if (typeof global !== 'undefined') {\n return global;\n }\n return Function('return this')();\n}\n/**\n * Check that `x` is of type `T` and not `undefined`.\n * If `x` is `undefined`, throw a RuntimeError with the optionally provided error code and message.\n */\nexport function defined(x, code = 'undefined', message = '') {\n if (x === undefined) {\n throw new RuntimeError(code, message);\n }\n return x;\n}\n/** Default log function sends all arguments to console. */\n// eslint-disable-next-line\nexport function log(block, ...args) {\n if (!args)\n return;\n const line = Array.prototype.slice.call(args).join(' ');\n globalObject().console.log(block + ': ' + line);\n}\n/** Dump warning to console. */\n// eslint-disable-next-line\nexport function warn(...args) {\n const line = args.join(' ');\n const err = new Error();\n globalObject().console.log('Warning: ', line, err.stack);\n}\n/** Round number to nearest fractional value (`.5`, `.25`, etc.) */\nfunction roundN(x, n) {\n return x % n >= n / 2 ? parseInt(`${x / n}`, 10) * n + n : parseInt(`${x / n}`, 10) * n;\n}\n/** Locate the mid point between stave lines. Returns a fractional line if a space. */\nexport function midLine(a, b) {\n let mid_line = b + (a - b) / 2;\n if (mid_line % 2 > 0) {\n mid_line = roundN(mid_line * 10, 5) / 10;\n }\n return mid_line;\n}\n/**\n * Used by various classes (e.g., SVGContext) to provide a\n * unique prefix to element names (or other keys in shared namespaces).\n */\nexport function prefix(text) {\n return `vf-${text}`;\n}\n/**\n * Convert an arbitrary angle in radians to the equivalent one in the range [0, pi).\n */\nexport function normalizeAngle(a) {\n a = a % (2 * Math.PI);\n if (a < 0) {\n a += 2 * Math.PI;\n }\n return a;\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Author: Joshua Koo / @zz85\n// Author: @incompleteopus\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\n/** Fraction represents a rational number. */\nexport class Fraction {\n /** Set the numerator and denominator. */\n constructor(numerator, denominator) {\n this.numerator = 1;\n this.denominator = 1;\n this.set(numerator, denominator);\n }\n static get CATEGORY() {\n return Category.Fraction;\n }\n /**\n * GCD: Greatest common divisor using the Euclidean algorithm.\n * Note: GCD(0, 0) => 0 and GCD(0, n) => n.\n */\n static GCD(a, b) {\n if (typeof a !== 'number' || Number.isNaN(a) || typeof b !== 'number' || Number.isNaN(b)) {\n throw new RuntimeError('BadArgument', `Invalid numbers: ${a}, ${b}`);\n }\n let t;\n while (b !== 0) {\n t = b;\n b = a % b;\n a = t;\n }\n return a;\n }\n /** LCM: Lowest common multiple. */\n static LCM(a, b) {\n return (a * b) / Fraction.GCD(a, b);\n }\n /** Lowest common multiple for more than two numbers. */\n static LCMM(args) {\n if (args.length === 0) {\n return 0;\n }\n else if (args.length === 1) {\n return args[0];\n }\n else if (args.length === 2) {\n return Fraction.LCM(args[0], args[1]);\n }\n else {\n // args.shift() removes the first number.\n // LCM the first number with the rest of the numbers.\n return Fraction.LCM(args.shift(), Fraction.LCMM(args));\n }\n }\n /** Set the numerator and denominator. */\n set(numerator = 1, denominator = 1) {\n this.numerator = numerator;\n this.denominator = denominator;\n return this;\n }\n /** Return the value of the fraction. */\n value() {\n return this.numerator / this.denominator;\n }\n /** Simplify numerator and denominator using GCD. */\n simplify() {\n let u = this.numerator;\n let d = this.denominator;\n const gcd = Fraction.GCD(u, d);\n u /= gcd;\n d /= gcd;\n if (d < 0) {\n d = -d;\n u = -u;\n }\n return this.set(u, d);\n }\n /** Add value of another fraction. */\n add(param1 = 0, param2 = 1) {\n const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2);\n const lcm = Fraction.LCM(this.denominator, otherDenominator);\n const a = lcm / this.denominator;\n const b = lcm / otherDenominator;\n const u = this.numerator * a + otherNumerator * b;\n return this.set(u, lcm);\n }\n /** Substract value of another fraction. */\n subtract(param1 = 0, param2 = 1) {\n const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2);\n const lcm = Fraction.LCM(this.denominator, otherDenominator);\n const a = lcm / this.denominator;\n const b = lcm / otherDenominator;\n const u = this.numerator * a - otherNumerator * b;\n return this.set(u, lcm);\n }\n /** Multiply by value of another fraction. */\n multiply(param1 = 1, param2 = 1) {\n const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2);\n return this.set(this.numerator * otherNumerator, this.denominator * otherDenominator);\n }\n /** Divide by value of another Fraction. */\n divide(param1 = 1, param2 = 1) {\n const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2);\n return this.set(this.numerator * otherDenominator, this.denominator * otherNumerator);\n }\n /** Simplify both sides and check if they are equal. */\n equals(compare) {\n const a = Fraction.__staticFractionA.copy(compare).simplify();\n const b = Fraction.__staticFractionB.copy(this).simplify();\n return a.numerator === b.numerator && a.denominator === b.denominator;\n }\n /** Greater than operator. */\n greaterThan(compare) {\n const a = Fraction.__staticFractionB.copy(this);\n a.subtract(compare);\n return a.numerator > 0;\n }\n /** Greater than or equals operator. */\n greaterThanEquals(compare) {\n const a = Fraction.__staticFractionB.copy(this);\n a.subtract(compare);\n return a.numerator >= 0;\n }\n /** Less than operator. */\n lessThan(compare) {\n return !this.greaterThanEquals(compare);\n }\n /** Less than or equals operator. */\n lessThanEquals(compare) {\n return !this.greaterThan(compare);\n }\n /** Return a new copy with current values. */\n clone() {\n return new Fraction(this.numerator, this.denominator);\n }\n /** Copy value of another fraction. */\n copy(other) {\n if (typeof other === 'number') {\n return this.set(other, 1);\n }\n else {\n return this.set(other.numerator, other.denominator);\n }\n }\n /** Return the integer component (eg. 5/2 => 2). */\n quotient() {\n return Math.floor(this.numerator / this.denominator);\n }\n /** Return the remainder component (eg. 5/2 => 1). */\n remainder() {\n return this.numerator % this.denominator;\n }\n /** Calculate absolute value. */\n makeAbs() {\n this.denominator = Math.abs(this.denominator);\n this.numerator = Math.abs(this.numerator);\n return this;\n }\n /** Return a raw string representation (eg. \"5/2\"). */\n toString() {\n return `${this.numerator}/${this.denominator}`;\n }\n /** Return a simplified string respresentation. */\n toSimplifiedString() {\n return Fraction.__staticFractionTmp.copy(this).simplify().toString();\n }\n /** Return string representation in mixed form. */\n toMixedString() {\n let s = '';\n const q = this.quotient();\n const f = Fraction.__staticFractionTmp.copy(this);\n if (q < 0) {\n f.makeAbs();\n }\n if (q !== 0) {\n s += q;\n if (f.numerator !== 0) {\n s += ` ${f.toSimplifiedString()}`;\n }\n }\n else if (f.numerator === 0) {\n s = '0';\n }\n else {\n s = f.toSimplifiedString();\n }\n return s;\n }\n /** Parse a fraction string. */\n parse(str) {\n const i = str.split('/');\n const n = parseInt(i[0], 10);\n const d = i[1] ? parseInt(i[1], 10) : 1;\n return this.set(n, d);\n }\n}\n// Cached objects for comparisons.\nFraction.__staticFractionA = new Fraction();\nFraction.__staticFractionB = new Fraction();\nFraction.__staticFractionTmp = new Fraction();\n/** Helper function to extract the numerator and denominator from another fraction. */\nfunction getNumeratorAndDenominator(n, d = 1) {\n if (typeof n === 'number') {\n // Both params are numbers, so we return them as [numerator, denominator].\n return [n, d];\n }\n else {\n // First param is a Fraction object. We ignore the second param.\n return [n.numerator, n.denominator];\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nexport class BoundingBox {\n constructor(x, y, w, h) {\n this.x = x;\n this.y = y;\n this.w = w;\n this.h = h;\n }\n /**\n * Create a new copy.\n */\n static copy(that) {\n return new BoundingBox(that.x, that.y, that.w, that.h);\n }\n /** Get x position. */\n getX() {\n return this.x;\n }\n /** Get y position. */\n getY() {\n return this.y;\n }\n /** Get width. */\n getW() {\n return this.w;\n }\n /** Get height. */\n getH() {\n return this.h;\n }\n /** Set x position. */\n setX(x) {\n this.x = x;\n return this;\n }\n /** Set y position. */\n setY(y) {\n this.y = y;\n return this;\n }\n /** Set width. */\n setW(w) {\n this.w = w;\n return this;\n }\n /** Set height. */\n setH(h) {\n this.h = h;\n return this;\n }\n /** Move to position. */\n move(x, y) {\n this.x += x;\n this.y += y;\n return this;\n }\n /** Clone. */\n clone() {\n return BoundingBox.copy(this);\n }\n /**\n * Merge my box with given box. Creates a bigger bounding box unless\n * the given box is contained in this one.\n */\n mergeWith(boundingBox) {\n const that = boundingBox;\n const new_x = this.x < that.x ? this.x : that.x;\n const new_y = this.y < that.y ? this.y : that.y;\n const new_w = Math.max(this.x + this.w, that.x + that.w) - new_x;\n const new_h = Math.max(this.y + this.h, that.y + that.h) - new_y;\n this.x = new_x;\n this.y = new_y;\n this.w = new_w;\n this.h = new_h;\n return this;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n/**\n * BoundingBoxComputation computes metrics for a bounding box by continuously\n * taking canvas path commands.\n *\n * Warning: This class is merely a crutch to get bounding box information without\n * explicit metadata. This is likely to get deprecated following SMuFL support.\n *\n * based on: https://github.com/canvg/canvg/blob/master/src/BoundingBox.ts (MIT License)\n */\nexport class BoundingBoxComputation {\n constructor() {\n this.x1 = Number.NaN;\n this.y1 = Number.NaN;\n this.x2 = Number.NaN;\n this.y2 = Number.NaN;\n }\n /** Get calculated X1. */\n getX1() {\n return this.x1;\n }\n /** Get calculated Y1. */\n getY1() {\n return this.y1;\n }\n /** Get calculated width. */\n width() {\n return this.x2 - this.x1;\n }\n /** Get calculated height. */\n height() {\n return this.y2 - this.y1;\n }\n /** Add point to BoundingBox. */\n addPoint(x, y) {\n if (isNaN(this.x1) || x < this.x1)\n this.x1 = x;\n if (isNaN(this.x2) || x > this.x2)\n this.x2 = x;\n if (isNaN(this.y1) || y < this.y1)\n this.y1 = y;\n if (isNaN(this.y2) || y > this.y2)\n this.y2 = y;\n }\n /** Add X to BoundingBox. */\n addX(x) {\n this.addPoint(x, this.y1);\n }\n /** Add Y to BoundingBox. */\n addY(y) {\n this.addPoint(this.x1, y);\n }\n /** Add quadratic curve to BoundingBox. */\n addQuadraticCurve(p0x, p0y, p1x, p1y, p2x, p2y) {\n this.addPoint(p0x, p0y);\n this.addPoint(p2x, p2y);\n const p01x = p1x - p0x;\n const p12x = p2x - p1x;\n let denom = p01x - p12x;\n if (denom != 0) {\n const t = p01x / denom;\n if (t > 0 && t < 1) {\n const it = 1 - t;\n this.addX(it * it * p0x + 2 * it * t * p1x + t * t * p2x);\n }\n }\n const p01y = p1y - p0y;\n const p12y = p2y - p1y;\n denom = p01y - p12y;\n if (denom != 0) {\n const t = p01y / denom;\n if (t > 0 && t < 1) {\n const it = 1 - t;\n this.addY(it * it * p0y + 2 * it * t * p1y + t * t * p2y);\n }\n }\n }\n /** Add bezier curve to BoundingBox. */\n addBezierCurve(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) {\n // from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html\n const p0 = [p0x, p0y];\n const p1 = [p1x, p1y];\n const p2 = [p2x, p2y];\n const p3 = [p3x, p3y];\n let i;\n this.addPoint(p0[0], p0[1]);\n this.addPoint(p3[0], p3[1]);\n const f = (t, i) => Math.pow(1 - t, 3) * p0[i] +\n 3 * Math.pow(1 - t, 2) * t * p1[i] +\n 3 * (1 - t) * Math.pow(t, 2) * p2[i] +\n Math.pow(t, 3) * p3[i];\n for (i = 0; i <= 1; i++) {\n const b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i];\n const a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i];\n const c = 3 * p1[i] - 3 * p0[i];\n if (a === 0) {\n if (b === 0)\n continue;\n const t = -c / b;\n if (0 < t && t < 1) {\n if (i === 0)\n this.addX(f(t, i));\n if (i === 1)\n this.addY(f(t, i));\n }\n continue;\n }\n const b2ac = Math.pow(b, 2) - 4 * c * a;\n if (b2ac < 0)\n continue;\n const t1 = (-b + Math.sqrt(b2ac)) / (2 * a);\n if (0 < t1 && t1 < 1) {\n if (i === 0)\n this.addX(f(t1, i));\n if (i === 1)\n this.addY(f(t1, i));\n }\n const t2 = (-b - Math.sqrt(b2ac)) / (2 * a);\n if (0 < t2 && t2 < 1) {\n if (i === 0)\n this.addX(f(t2, i));\n if (i === 1)\n this.addY(f(t2, i));\n }\n }\n }\n}\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { defined } from './util';\nexport var FontWeight;\n(function (FontWeight) {\n FontWeight[\"NORMAL\"] = \"normal\";\n FontWeight[\"BOLD\"] = \"bold\";\n})(FontWeight || (FontWeight = {}));\nexport var FontStyle;\n(function (FontStyle) {\n FontStyle[\"NORMAL\"] = \"normal\";\n FontStyle[\"ITALIC\"] = \"italic\";\n})(FontStyle || (FontStyle = {}));\n// Internal element for parsing CSS font shorthand strings.\nlet fontParser;\nconst Fonts = {};\nexport class Font {\n /**\n * Use `Font.load(fontName)` to get a Font object.\n * Do not call this constructor directly.\n */\n constructor(fontName) {\n this.name = fontName;\n }\n /**\n * @param fontSize a font size to convert. Can be specified as a CSS length string (e.g., '16pt', '1em')\n * or as a number (the unit is assumed to be 'pt'). See `Font.scaleToPxFrom` for the supported\n * units (e.g., pt, em, %).\n * @returns the number of pixels that is equivalent to `fontSize`\n */\n static convertSizeToPixelValue(fontSize = Font.SIZE) {\n var _a;\n if (typeof fontSize === 'number') {\n // Assume the numeric fontSize is specified in pt.\n return fontSize * Font.scaleToPxFrom.pt;\n }\n else {\n const value = parseFloat(fontSize);\n if (isNaN(value)) {\n return 0;\n }\n const unit = fontSize.replace(/[\\d.\\s]/g, '').toLowerCase(); // Extract the unit by removing all numbers, dots, spaces.\n const conversionFactor = (_a = Font.scaleToPxFrom[unit]) !== null && _a !== void 0 ? _a : 1;\n return value * conversionFactor;\n }\n }\n /**\n * @param fontSize a font size to convert. Can be specified as a CSS length string (e.g., '16pt', '1em')\n * or as a number (the unit is assumed to be 'pt'). See `Font.scaleToPxFrom` for the supported\n * units (e.g., pt, em, %).\n * @returns the number of points that is equivalent to `fontSize`\n */\n static convertSizeToPointValue(fontSize = Font.SIZE) {\n var _a;\n if (typeof fontSize === 'number') {\n // Assume the numeric fontSize is specified in pt.\n return fontSize;\n }\n else {\n const value = parseFloat(fontSize);\n if (isNaN(value)) {\n return 0;\n }\n const unit = fontSize.replace(/[\\d.\\s]/g, '').toLowerCase(); // Extract the unit by removing all numbers, dots, spaces.\n const conversionFactor = ((_a = Font.scaleToPxFrom[unit]) !== null && _a !== void 0 ? _a : 1) / Font.scaleToPxFrom.pt;\n return value * conversionFactor;\n }\n }\n /**\n * @param f\n * @param size\n * @param weight\n * @param style\n * @returns the `size` field will include the units (e.g., '12pt', '16px').\n */\n static validate(f, size, weight, style) {\n // If f is a string but all other arguments are undefined, we assume that\n // f is CSS font shorthand (e.g., 'italic bold 10pt Arial').\n if (typeof f === 'string' && size === undefined && weight === undefined && style === undefined) {\n return Font.fromCSSString(f);\n }\n let family;\n if (typeof f === 'object') {\n // f is a FontInfo object, so we extract its fields.\n family = f.family;\n size = f.size;\n weight = f.weight;\n style = f.style;\n }\n else {\n // f is a string representing the font family name or undefined.\n family = f;\n }\n family = family !== null && family !== void 0 ? family : Font.SANS_SERIF;\n size = size !== null && size !== void 0 ? size : Font.SIZE + 'pt';\n weight = weight !== null && weight !== void 0 ? weight : FontWeight.NORMAL;\n style = style !== null && style !== void 0 ? style : FontStyle.NORMAL;\n if (weight === '') {\n weight = FontWeight.NORMAL;\n }\n if (style === '') {\n style = FontStyle.NORMAL;\n }\n // If size is a number, we assume the unit is `pt`.\n if (typeof size === 'number') {\n size = `${size}pt`;\n }\n // If weight is a number (e.g., 900), turn it into a string representation of that number.\n if (typeof weight === 'number') {\n weight = weight.toString();\n }\n // At this point, `family`, `size`, `weight`, and `style` are all strings.\n return { family, size, weight, style };\n }\n /**\n * @param cssFontShorthand a string formatted as CSS font shorthand (e.g., 'italic bold 15pt Arial').\n */\n static fromCSSString(cssFontShorthand) {\n // Let the browser parse this string for us.\n // First, create a span element.\n // Then, set its style.font and extract it back out.\n if (!fontParser) {\n fontParser = document.createElement('span');\n }\n fontParser.style.font = cssFontShorthand;\n const { fontFamily, fontSize, fontWeight, fontStyle } = fontParser.style;\n return { family: fontFamily, size: fontSize, weight: fontWeight, style: fontStyle };\n }\n /**\n * @returns a CSS font shorthand string of the form `italic bold 16pt Arial`.\n */\n static toCSSString(fontInfo) {\n var _a;\n if (!fontInfo) {\n return '';\n }\n let style;\n const st = fontInfo.style;\n if (st === FontStyle.NORMAL || st === '' || st === undefined) {\n style = ''; // no space! Omit the style section.\n }\n else {\n style = st.trim() + ' ';\n }\n let weight;\n const wt = fontInfo.weight;\n if (wt === FontWeight.NORMAL || wt === '' || wt === undefined) {\n weight = ''; // no space! Omit the weight section.\n }\n else if (typeof wt === 'number') {\n weight = wt + ' ';\n }\n else {\n weight = wt.trim() + ' ';\n }\n let size;\n const sz = fontInfo.size;\n if (sz === undefined) {\n size = Font.SIZE + 'pt ';\n }\n else if (typeof sz === 'number') {\n size = sz + 'pt ';\n }\n else {\n // size is already a string.\n size = sz.trim() + ' ';\n }\n const family = (_a = fontInfo.family) !== null && _a !== void 0 ? _a : Font.SANS_SERIF;\n return `${style}${weight}${size}${family}`;\n }\n /**\n * @param fontSize a number representing a font size, or a string font size with units.\n * @param scaleFactor multiply the size by this factor.\n * @returns size * scaleFactor (e.g., 16pt * 3 = 48pt, 8px * 0.5 = 4px, 24 * 2 = 48).\n * If the fontSize argument was a number, the return value will be a number.\n * If the fontSize argument was a string, the return value will be a string.\n */\n static scaleSize(fontSize, scaleFactor) {\n if (typeof fontSize === 'number') {\n return (fontSize * scaleFactor);\n }\n else {\n const value = parseFloat(fontSize);\n const unit = fontSize.replace(/[\\d.\\s]/g, ''); // Remove all numbers, dots, spaces.\n return `${value * scaleFactor}${unit}`;\n }\n }\n /**\n * @param weight a string (e.g., 'bold') or a number (e.g., 600 / semi-bold in the OpenType spec).\n * @returns true if the font weight indicates bold.\n */\n static isBold(weight) {\n if (!weight) {\n return false;\n }\n else if (typeof weight === 'number') {\n return weight >= 600;\n }\n else {\n // a string can be 'bold' or '700'\n const parsedWeight = parseInt(weight, 10);\n if (isNaN(parsedWeight)) {\n return weight.toLowerCase() === 'bold';\n }\n else {\n return parsedWeight >= 600;\n }\n }\n }\n /**\n * @param style\n * @returns true if the font style indicates 'italic'.\n */\n static isItalic(style) {\n if (!style) {\n return false;\n }\n else {\n return style.toLowerCase() === FontStyle.ITALIC;\n }\n }\n /**\n * @param fontName\n * @param woffURL The absolute or relative URL to the woff file.\n * @param includeWoff2 If true, we assume that a woff2 file is in\n * the same folder as the woff file, and will append a `2` to the url.\n */\n // Support distributions of the typescript compiler that do not yet include the FontFace API declarations.\n // eslint-disable-next-line\n // @ts-ignore\n static loadWebFont(fontName, woffURL, includeWoff2 = true) {\n return __awaiter(this, void 0, void 0, function* () {\n const woff2URL = includeWoff2 ? `url(${woffURL}2) format('woff2'), ` : '';\n const woff1URL = `url(${woffURL}) format('woff')`;\n const woffURLs = woff2URL + woff1URL;\n // eslint-disable-next-line\n // @ts-ignore\n const fontFace = new FontFace(fontName, woffURLs);\n yield fontFace.load();\n // eslint-disable-next-line\n // @ts-ignore\n document.fonts.add(fontFace);\n return fontFace;\n });\n }\n /**\n * Load the web fonts that are used by ChordSymbol. For example, `flow.html` calls:\n * `await Vex.Flow.Font.loadWebFonts();`\n * Alternatively, you may load web fonts with a stylesheet link (e.g., from Google Fonts),\n * and a @font-face { font-family: ... } rule in your CSS.\n * If you do not load either of these fonts, ChordSymbol will fall back to Times or Arial,\n * depending on the current music engraving font.\n *\n * You can customize `Font.WEB_FONT_HOST` and `Font.WEB_FONT_FILES` to load different fonts\n * for your app.\n */\n static loadWebFonts() {\n return __awaiter(this, void 0, void 0, function* () {\n const host = Font.WEB_FONT_HOST;\n const files = Font.WEB_FONT_FILES;\n for (const fontName in files) {\n const fontPath = files[fontName];\n Font.loadWebFont(fontName, host + fontPath);\n }\n });\n }\n static loadTextFonts() {\n //\n }\n /**\n * @param fontName\n * @param data optionally set the Font object's `.data` property.\n * This is usually done when setting up a font for the first time.\n * @param metrics optionally set the Font object's `.metrics` property.\n * This is usually done when setting up a font for the first time.\n * @returns a Font object with the given `fontName`.\n * Reuse an existing Font object if a matching one is found.\n */\n static load(fontName, data, metrics) {\n let font = Fonts[fontName];\n if (!font) {\n font = new Font(fontName);\n Fonts[fontName] = font;\n }\n if (data) {\n font.setData(data);\n }\n if (metrics) {\n font.setMetrics(metrics);\n }\n return font;\n }\n getName() {\n return this.name;\n }\n getData() {\n return defined(this.data, 'FontError', 'Missing font data');\n }\n getMetrics() {\n return defined(this.metrics, 'FontError', 'Missing metrics');\n }\n setData(data) {\n this.data = data;\n }\n setMetrics(metrics) {\n this.metrics = metrics;\n }\n hasData() {\n return this.data !== undefined;\n }\n getResolution() {\n return this.getData().resolution;\n }\n getGlyphs() {\n return this.getData().glyphs;\n }\n /**\n * Use the provided key to look up a value in this font's metrics file (e.g., bravura_metrics.ts, petaluma_metrics.ts).\n * @param key is a string separated by periods (e.g., stave.endPaddingMax, clef.lineCount.'5'.shiftY).\n * @param defaultValue is returned if the lookup fails.\n * @returns the retrieved value (or `defaultValue` if the lookup fails).\n */\n // eslint-disable-next-line\n lookupMetric(key, defaultValue) {\n const keyParts = key.split('.');\n // Start with the top level font metrics object, and keep looking deeper into the object (via each part of the period-delimited key).\n let currObj = this.getMetrics();\n for (let i = 0; i < keyParts.length; i++) {\n const keyPart = keyParts[i];\n const value = currObj[keyPart];\n if (value === undefined) {\n // If the key lookup fails, we fall back to the defaultValue.\n return defaultValue;\n }\n // The most recent lookup succeeded, so we drill deeper into the object.\n currObj = value;\n }\n // After checking every part of the key (i.e., the loop completed), return the most recently retrieved value.\n return currObj;\n }\n /** For debugging. */\n toString() {\n return '[' + this.name + ' Font]';\n }\n}\n//////////////////////////////////////////////////////////////////////////////////////////////////\n// STATIC MEMBERS\n/** Default sans-serif font family. */\nFont.SANS_SERIF = 'Arial, sans-serif';\n/** Default serif font family. */\nFont.SERIF = 'Times New Roman, serif';\n/** Default font size in `pt`. */\nFont.SIZE = 10;\n// CSS Font Sizes: 36pt == 48px == 3em == 300% == 0.5in\n/** Given a length (for units: pt, px, em, %, in, mm, cm) what is the scale factor to convert it to px? */\nFont.scaleToPxFrom = {\n pt: 4 / 3,\n px: 1,\n em: 16,\n '%': 4 / 25,\n in: 96,\n mm: 96 / 25.4,\n cm: 96 / 2.54,\n};\n/**\n * Customize this field to specify a different CDN for delivering web fonts.\n * Alternative: https://cdn.jsdelivr.net/npm/vexflow-fonts@1.0.3/\n * Or you can use your own host.\n */\nFont.WEB_FONT_HOST = 'https://unpkg.com/vexflow-fonts@1.0.3/';\n/**\n * These font files will be loaded from the CDN specified by `Font.WEB_FONT_HOST` when\n * `await Font.loadWebFonts()` is called. Customize this field to specify a different\n * set of fonts to load. See: `Font.loadWebFonts()`.\n */\nFont.WEB_FONT_FILES = {\n 'Roboto Slab': 'robotoslab/RobotoSlab-Medium_2.001.woff',\n PetalumaScript: 'petaluma/PetalumaScript_1.10_FS.woff',\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Mohit Cheppudira\n//\n// ## Description\n//\n// This file implements a registry for VexFlow elements. It allows users\n// to track, query, and manage some subset of generated elements, and\n// dynamically get and set attributes.\n//\n// There are two ways to register with a registry:\n//\n// 1) Explicitly call `registry.register(elem:Element, id?:string)`, or,\n// 2) Call `Registry.enableDefaultRegistry(registry)` when ready, and all future\n// elements will automatically register with it.\n//\n// Once an element is registered, selected attributes are tracked and indexed by\n// the registry. This allows fast look up of elements by attributes like id, type,\n// and class.\nimport { RuntimeError } from './util';\n// Indexes are represented as maps of maps of maps. This allows\n// for both multi-labeling (e.g., an element can have multiple classes)\n// and efficient lookup.\nclass Index {\n constructor() {\n this.id = {};\n this.type = {};\n this.class = {};\n }\n}\nexport class Registry {\n constructor() {\n this.index = new Index();\n }\n static getDefaultRegistry() {\n return Registry.defaultRegistry;\n }\n // If you call `enableDefaultRegistry`, any new elements will auto-register with\n // the provided registry as soon as they're constructed.\n static enableDefaultRegistry(registry) {\n Registry.defaultRegistry = registry;\n }\n static disableDefaultRegistry() {\n Registry.defaultRegistry = undefined;\n }\n clear() {\n this.index = new Index();\n return this;\n }\n setIndexValue(name, value, id, elem) {\n const index = this.index;\n if (!index[name][value]) {\n index[name][value] = {};\n }\n index[name][value][id] = elem;\n }\n // Updates the indexes for element 'id'. If an element's attribute changes\n // from A -> B, make sure to remove the element from A.\n updateIndex({ id, name, value, oldValue }) {\n const elem = this.getElementById(id);\n if (oldValue !== undefined && this.index[name][oldValue]) {\n delete this.index[name][oldValue][id];\n }\n if (value && elem) {\n this.setIndexValue(name, value, elem.getAttribute('id'), elem);\n }\n }\n /**\n * Register element `elem` with this registry.\n * This adds the element to its index and watches it for attribute changes.\n * @param elem\n * @param id\n * @returns this\n */\n register(elem, id) {\n id = id || elem.getAttribute('id');\n if (!id) {\n throw new RuntimeError(\"Can't add element without `id` attribute to registry\");\n }\n // Manually add id to index, then update other indexes.\n elem.setAttribute('id', id);\n this.setIndexValue('id', id, id, elem);\n this.updateIndex({ id, name: 'type', value: elem.getAttribute('type'), oldValue: undefined });\n elem.onRegister(this);\n return this;\n }\n getElementById(id) {\n var _a, _b;\n return (_b = (_a = this.index.id) === null || _a === void 0 ? void 0 : _a[id]) === null || _b === void 0 ? void 0 : _b[id]; // return undefined if the id is not found.\n }\n getElementsByAttribute(attribute, value) {\n const index_attr = this.index[attribute];\n if (index_attr) {\n const index_attr_val = index_attr[value];\n if (index_attr_val) {\n const keys = Object.keys(index_attr_val);\n return keys.map((k) => index_attr_val[k]);\n }\n }\n return [];\n }\n getElementsByType(type) {\n return this.getElementsByAttribute('type', type);\n }\n getElementsByClass(className) {\n return this.getElementsByAttribute('class', className);\n }\n // This is called by the element when an attribute value changes. If an indexed\n // attribute changes, then update the local index.\n onUpdate(info) {\n const allowedNames = ['id', 'type', 'class'];\n if (allowedNames.includes(info.name)) {\n this.updateIndex(info);\n }\n return this;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Mohit Cheppudira\n// MIT License\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Registry } from './registry';\nimport { Category } from './typeguard';\nimport { defined } from './util';\n/**\n * Element implements a generic base class for VexFlow, with implementations\n * of general functions and properties that can be inherited by all VexFlow elements.\n */\nexport class Element {\n constructor() {\n var _a;\n this.attrs = {\n id: Element.newID(),\n el: undefined,\n type: this.getCategory(),\n classes: {},\n };\n this.rendered = false;\n // If a default registry exist, then register with it right away.\n (_a = Registry.getDefaultRegistry()) === null || _a === void 0 ? void 0 : _a.register(this);\n }\n static get CATEGORY() {\n return Category.Element;\n }\n static newID() {\n return `auto${Element.ID++}`;\n }\n /** Get element category string. */\n getCategory() {\n return this.constructor.CATEGORY;\n }\n /**\n * Set the element style used to render.\n *\n * Example:\n * ```typescript\n * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' });\n * element.draw();\n * ```\n * Note: If the element draws additional sub-elements (ie.: Modifiers in a Stave),\n * the style can be applied to all of them by means of the context:\n * ```typescript\n * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' });\n * element.getContext().setFillStyle('red');\n * element.getContext().setStrokeStyle('red');\n * element.draw();\n * ```\n * or using drawWithStyle:\n * ```typescript\n * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' });\n * element.drawWithStyle();\n * ```\n */\n setStyle(style) {\n this.style = style;\n return this;\n }\n /** Get the element style used for rendering. */\n getStyle() {\n return this.style;\n }\n /** Apply the element style to `context`. */\n applyStyle(context = this.context, style = this.getStyle()) {\n if (!style)\n return this;\n if (!context)\n return this;\n context.save();\n if (style.shadowColor)\n context.setShadowColor(style.shadowColor);\n if (style.shadowBlur)\n context.setShadowBlur(style.shadowBlur);\n if (style.fillStyle)\n context.setFillStyle(style.fillStyle);\n if (style.strokeStyle)\n context.setStrokeStyle(style.strokeStyle);\n if (style.lineWidth)\n context.setLineWidth(style.lineWidth);\n return this;\n }\n /** Restore the style of `context`. */\n restoreStyle(context = this.context, style = this.getStyle()) {\n if (!style)\n return this;\n if (!context)\n return this;\n context.restore();\n return this;\n }\n /**\n * Draw the element and all its sub-elements (ie.: Modifiers in a Stave)\n * with the element style.\n */\n drawWithStyle() {\n this.checkContext();\n this.applyStyle();\n this.draw();\n this.restoreStyle();\n }\n /** Check if it has a class label (An element can have multiple class labels). */\n hasClass(className) {\n return this.attrs.classes[className] === true;\n }\n /** Add a class label (An element can have multiple class labels). */\n addClass(className) {\n var _a;\n this.attrs.classes[className] = true;\n (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({\n id: this.attrs.id,\n name: 'class',\n value: className,\n oldValue: undefined,\n });\n return this;\n }\n /** Remove a class label (An element can have multiple class labels). */\n removeClass(className) {\n var _a;\n delete this.attrs.classes[className];\n (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({\n id: this.attrs.id,\n name: 'class',\n value: undefined,\n oldValue: className,\n });\n return this;\n }\n /** Call back from registry after the element is registered. */\n onRegister(registry) {\n this.registry = registry;\n return this;\n }\n /** Return the rendered status. */\n isRendered() {\n return this.rendered;\n }\n /** Set the rendered status. */\n setRendered(rendered = true) {\n this.rendered = rendered;\n return this;\n }\n /** Return the element attributes. */\n getAttributes() {\n return this.attrs;\n }\n /** Return an attribute. */\n // eslint-disable-next-line\n getAttribute(name) {\n return this.attrs[name];\n }\n /** Set an attribute. */\n // eslint-disable-next-line\n setAttribute(name, value) {\n var _a;\n const oldID = this.attrs.id;\n const oldValue = this.attrs[name];\n this.attrs[name] = value;\n // Register with old id to support id changes.\n (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({ id: oldID, name, value, oldValue });\n return this;\n }\n /** Get the boundingBox. */\n getBoundingBox() {\n return this.boundingBox;\n }\n /** Return the context. */\n getContext() {\n return this.context;\n }\n /** Set the context. */\n setContext(context) {\n this.context = context;\n return this;\n }\n /** Validate and return the context. */\n checkContext() {\n return defined(this.context, 'NoContext', 'No rendering context attached to instance.');\n }\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // Font Handling\n /**\n * Provide a CSS compatible font string (e.g., 'bold 16px Arial').\n */\n set font(f) {\n this.setFont(f);\n }\n /** Returns the CSS compatible font string. */\n get font() {\n return Font.toCSSString(this.textFont);\n }\n /**\n * Set the element's font family, size, weight, style (e.g., `Arial`, `10pt`, `bold`, `italic`).\n * @param font is 1) a `FontInfo` object or\n * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or\n * 3) a string representing the font family (at least one of `size`, `weight`, or `style` must also be provided).\n * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt').\n * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900).\n * @param style is a string (e.g., 'italic', 'normal').\n * If no arguments are provided, then the font is set to the default font.\n * Each Element subclass may specify its own default by overriding the static `TEXT_FONT` property.\n */\n setFont(font, size, weight, style) {\n // Allow subclasses to override `TEXT_FONT`.\n const defaultTextFont = this.constructor.TEXT_FONT;\n const fontIsObject = typeof font === 'object';\n const fontIsString = typeof font === 'string';\n const fontIsUndefined = font === undefined;\n const sizeWeightStyleAreUndefined = size === undefined && weight === undefined && style === undefined;\n if (fontIsObject) {\n // `font` is case 1) a FontInfo object\n this.textFont = Object.assign(Object.assign({}, defaultTextFont), font);\n }\n else if (fontIsString && sizeWeightStyleAreUndefined) {\n // `font` is case 2) CSS font shorthand.\n this.textFont = Font.fromCSSString(font);\n }\n else if (fontIsUndefined && sizeWeightStyleAreUndefined) {\n // All arguments are undefined. Do not check for `arguments.length === 0`,\n // which fails on the edge case: `setFont(undefined)`.\n // TODO: See if we can remove this case entirely without introducing a visual diff.\n // The else case below seems like it should be equivalent to this case.\n this.textFont = Object.assign({}, defaultTextFont);\n }\n else {\n // `font` is case 3) a font family string (e.g., 'Times New Roman').\n // The other parameters represent the size, weight, and style.\n // It is okay for `font` to be undefined while one or more of the other arguments is provided.\n // Following CSS conventions, unspecified params are reset to the default.\n this.textFont = Font.validate(font !== null && font !== void 0 ? font : defaultTextFont.family, size !== null && size !== void 0 ? size : defaultTextFont.size, weight !== null && weight !== void 0 ? weight : defaultTextFont.weight, style !== null && style !== void 0 ? style : defaultTextFont.style);\n }\n return this;\n }\n getFont() {\n if (!this.textFont) {\n this.resetFont();\n }\n return Font.toCSSString(this.textFont);\n }\n /**\n * Reset the text font to the style indicated by the static `TEXT_FONT` property.\n * Subclasses can call this to initialize `textFont` for the first time.\n */\n resetFont() {\n this.setFont();\n }\n /** Return a copy of the current FontInfo object. */\n get fontInfo() {\n if (!this.textFont) {\n this.resetFont();\n }\n // We can cast to Required here, because\n // we just called resetFont() above to ensure this.textFont is set.\n return Object.assign({}, this.textFont);\n }\n set fontInfo(fontInfo) {\n this.setFont(fontInfo);\n }\n /** Change the font size, while keeping everything else the same. */\n setFontSize(size) {\n const fontInfo = this.fontInfo;\n this.setFont(fontInfo.family, size, fontInfo.weight, fontInfo.style);\n return this;\n }\n /**\n * @returns a CSS font-size string (e.g., '18pt', '12px', '1em').\n * See Element.fontSizeInPixels or Element.fontSizeInPoints if you need to get a number for calculation purposes.\n */\n getFontSize() {\n return this.fontSize;\n }\n /**\n * The size is 1) a string of the form '10pt' or '16px', compatible with the CSS font-size property.\n * or 2) a number, which is interpreted as a point size (i.e. 12 == '12pt').\n */\n set fontSize(size) {\n this.setFontSize(size);\n }\n /**\n * @returns a CSS font-size string (e.g., '18pt', '12px', '1em').\n */\n get fontSize() {\n let size = this.fontInfo.size;\n if (typeof size === 'number') {\n size = `${size}pt`;\n }\n return size;\n }\n /**\n * @returns the font size in `pt`.\n */\n get fontSizeInPoints() {\n return Font.convertSizeToPointValue(this.fontSize);\n }\n /**\n * @returns the font size in `px`.\n */\n get fontSizeInPixels() {\n return Font.convertSizeToPixelValue(this.fontSize);\n }\n /**\n * @returns a CSS font-style string (e.g., 'italic').\n */\n get fontStyle() {\n return this.fontInfo.style;\n }\n set fontStyle(style) {\n const fontInfo = this.fontInfo;\n this.setFont(fontInfo.family, fontInfo.size, fontInfo.weight, style);\n }\n /**\n * @returns a CSS font-weight string (e.g., 'bold').\n * As in CSS, font-weight is always returned as a string, even if it was set as a number.\n */\n get fontWeight() {\n return this.fontInfo.weight + '';\n }\n set fontWeight(weight) {\n const fontInfo = this.fontInfo;\n this.setFont(fontInfo.family, fontInfo.size, weight, fontInfo.style);\n }\n}\nElement.ID = 1000;\n/**\n * Default font for text. This is not related to music engraving. Instead, see `Flow.setMusicFont(...fontNames)`\n * to customize the font for musical symbols placed on the score.\n */\nElement.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: Font.SIZE,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { BoundingBox } from './boundingbox';\nimport { BoundingBoxComputation } from './boundingboxcomputation';\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nexport var OutlineCode;\n(function (OutlineCode) {\n OutlineCode[OutlineCode[\"MOVE\"] = 0] = \"MOVE\";\n OutlineCode[OutlineCode[\"LINE\"] = 1] = \"LINE\";\n OutlineCode[OutlineCode[\"QUADRATIC\"] = 2] = \"QUADRATIC\";\n OutlineCode[OutlineCode[\"BEZIER\"] = 3] = \"BEZIER\";\n})(OutlineCode || (OutlineCode = {}));\nclass GlyphCacheEntry {\n constructor(fontStack, code, category) {\n this.point = -1;\n this.metrics = Glyph.loadMetrics(fontStack, code, category);\n this.bbox = Glyph.getOutlineBoundingBox(this.metrics.outline, this.metrics.scale, this.metrics.x_shift, this.metrics.y_shift);\n if (category) {\n this.point = Glyph.lookupFontMetric(this.metrics.font, category, code, 'point', -1);\n }\n }\n}\nclass GlyphCache {\n constructor() {\n this.cache = new Map();\n }\n lookup(code, category) {\n let entries = this.cache.get(Glyph.CURRENT_CACHE_KEY);\n if (entries === undefined) {\n entries = {};\n this.cache.set(Glyph.CURRENT_CACHE_KEY, entries);\n }\n const key = category ? `${code}%${category}` : code;\n let entry = entries[key];\n if (entry === undefined) {\n entry = new GlyphCacheEntry(Glyph.MUSIC_FONT_STACK, code, category);\n entries[key] = entry;\n }\n return entry;\n }\n}\nclass GlyphOutline {\n constructor(outline, originX, originY, scale) {\n this.outline = outline;\n this.originX = originX;\n this.originY = originY;\n this.scale = scale;\n this.i = 0;\n // Automatically assign private properties: this.outline, this.originX, this.originY, and this.scale.\n }\n done() {\n return this.i >= this.outline.length;\n }\n next() {\n return this.outline[this.i++];\n }\n nextX() {\n return this.originX + this.outline[this.i++] * this.scale;\n }\n nextY() {\n return this.originY - this.outline[this.i++] * this.scale;\n }\n static parse(str) {\n const result = [];\n const parts = str.split(' ');\n let i = 0;\n while (i < parts.length) {\n switch (parts[i++]) {\n case 'm':\n result.push(OutlineCode.MOVE, parseInt(parts[i++]), parseInt(parts[i++]));\n break;\n case 'l':\n result.push(OutlineCode.LINE, parseInt(parts[i++]), parseInt(parts[i++]));\n break;\n case 'q':\n result.push(OutlineCode.QUADRATIC, parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]));\n break;\n case 'b':\n result.push(OutlineCode.BEZIER, parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]));\n break;\n }\n }\n return result;\n }\n}\nexport class Glyph extends Element {\n /**\n * @param code\n * @param point\n * @param options\n */\n constructor(code, point, options) {\n super();\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // INSTANCE MEMBERS\n this.bbox = new BoundingBox(0, 0, 0, 0);\n this.topGlyphs = [];\n this.botGlyphs = [];\n this.options = {};\n this.scale = 1;\n this.code = code;\n this.point = point;\n this.originShift = { x: 0, y: 0 };\n this.x_shift = 0;\n this.y_shift = 0;\n if (options) {\n this.setOptions(options);\n }\n else {\n this.reset();\n }\n }\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // STATIC MEMBERS\n static get CATEGORY() {\n return Category.Glyph;\n }\n /**\n * Pass a key of the form `glyphs.{category}.{code}.{key}` to Font.lookupMetric(). If the initial lookup fails,\n * try again with the path `glyphs.{category}.{key}`. If the second lookup fails, return the defaultValue.\n *\n * @param font\n * @param category any metric path under 'glyphs', so 'stem.up' could resolve to glyphs.stem.up.shiftX, glyphs.stem.up.shiftY, etc.\n * @param code\n * @param key\n * @param defaultValue\n */\n static lookupFontMetric(font, category, code, key, defaultValue) {\n let value = font.lookupMetric(`glyphs.${category}.${code}.${key}`, undefined);\n if (value === undefined) {\n // The first lookup failed, so we omit .${code} and try again (with a defaultValue this time).\n value = font.lookupMetric(`glyphs.${category}.${key}`, defaultValue);\n }\n return value;\n }\n static lookupGlyph(fontStack, code) {\n defined(fontStack, 'BadFontStack', 'Font stack is misconfigured');\n let glyph;\n let font;\n for (let i = 0; i < fontStack.length; i++) {\n font = fontStack[i];\n glyph = font.getGlyphs()[code];\n if (glyph)\n return { glyph, font };\n }\n throw new RuntimeError('BadGlyph', `Glyph ${code} does not exist in font.`);\n }\n static loadMetrics(fontStack, code, category) {\n const { glyph, font } = Glyph.lookupGlyph(fontStack, code);\n if (!glyph.o)\n throw new RuntimeError('BadGlyph', `Glyph ${code} has no outline defined.`);\n let x_shift = 0;\n let y_shift = 0;\n let scale = 1;\n if (category && font) {\n x_shift = Glyph.lookupFontMetric(font, category, code, 'shiftX', 0);\n y_shift = Glyph.lookupFontMetric(font, category, code, 'shiftY', 0);\n scale = Glyph.lookupFontMetric(font, category, code, 'scale', 1);\n }\n const x_min = glyph.x_min;\n const x_max = glyph.x_max;\n const ha = glyph.ha;\n if (!glyph.cached_outline) {\n glyph.cached_outline = GlyphOutline.parse(glyph.o);\n }\n return {\n x_min,\n x_max,\n x_shift,\n y_shift,\n scale,\n ha,\n outline: glyph.cached_outline,\n font,\n width: x_max - x_min,\n height: ha,\n };\n }\n /**\n * Renders glyphs from the default font stack.\n *\n * @param ctx Canvas or SVG context\n * @param x_pos x coordinate\n * @param y_pos y coordinate\n * @param point the point size of the font\n * @param code the glyph code in font.getGlyphs()\n * @param options\n * @returns\n */\n static renderGlyph(ctx, x_pos, y_pos, point, code, options) {\n var _a;\n const data = Glyph.cache.lookup(code, options === null || options === void 0 ? void 0 : options.category);\n const metrics = data.metrics;\n if (data.point != -1) {\n point = data.point;\n }\n const customScale = (_a = options === null || options === void 0 ? void 0 : options.scale) !== null && _a !== void 0 ? _a : 1;\n const scale = ((point * 72.0) / (metrics.font.getResolution() * 100.0)) * metrics.scale * customScale;\n Glyph.renderOutline(ctx, metrics.outline, scale, x_pos + metrics.x_shift * customScale, y_pos + metrics.y_shift * customScale);\n return metrics;\n }\n static renderOutline(ctx, outline, scale, x_pos, y_pos) {\n const go = new GlyphOutline(outline, x_pos, y_pos, scale);\n ctx.beginPath();\n let x, y;\n while (!go.done()) {\n switch (go.next()) {\n case OutlineCode.MOVE:\n ctx.moveTo(go.nextX(), go.nextY());\n break;\n case OutlineCode.LINE:\n ctx.lineTo(go.nextX(), go.nextY());\n break;\n case OutlineCode.QUADRATIC:\n x = go.nextX();\n y = go.nextY();\n ctx.quadraticCurveTo(go.nextX(), go.nextY(), x, y);\n break;\n case OutlineCode.BEZIER:\n x = go.nextX();\n y = go.nextY();\n ctx.bezierCurveTo(go.nextX(), go.nextY(), go.nextX(), go.nextY(), x, y);\n break;\n }\n }\n ctx.fill();\n }\n static getOutlineBoundingBox(outline, scale, x_pos, y_pos) {\n const go = new GlyphOutline(outline, x_pos, y_pos, scale);\n const bboxComp = new BoundingBoxComputation();\n // (penX, penY) hold the pen position: the start of each stroke.\n let penX = x_pos;\n let penY = y_pos;\n let x, y;\n while (!go.done()) {\n switch (go.next()) {\n case OutlineCode.MOVE:\n // Note that we don't add any points to the bounding box until a srroke is actually drawn.\n penX = go.nextX();\n penY = go.nextY();\n break;\n case OutlineCode.LINE:\n bboxComp.addPoint(penX, penY);\n penX = go.nextX();\n penY = go.nextY();\n bboxComp.addPoint(penX, penY);\n break;\n case OutlineCode.QUADRATIC:\n x = go.nextX();\n y = go.nextY();\n bboxComp.addQuadraticCurve(penX, penY, go.nextX(), go.nextY(), x, y);\n penX = x;\n penY = y;\n break;\n case OutlineCode.BEZIER:\n x = go.nextX();\n y = go.nextY();\n bboxComp.addBezierCurve(penX, penY, go.nextX(), go.nextY(), go.nextX(), go.nextY(), x, y);\n penX = x;\n penY = y;\n break;\n }\n }\n return new BoundingBox(bboxComp.getX1(), bboxComp.getY1(), bboxComp.width(), bboxComp.height());\n }\n static getWidth(code, point, category) {\n const data = Glyph.cache.lookup(code, category);\n if (data.point != -1) {\n point = data.point;\n }\n const scale = (point * 72) / (data.metrics.font.getResolution() * 100);\n return data.bbox.getW() * scale;\n }\n // eslint-disable-next-line\n draw(...args) {\n // DO NOTHING.\n }\n getCode() {\n return this.code;\n }\n // eslint-disable-next-line\n setOptions(options) {\n this.options = Object.assign(Object.assign({}, this.options), options);\n this.reset();\n }\n setPoint(point) {\n this.point = point;\n return this;\n }\n setStave(stave) {\n this.stave = stave;\n return this;\n }\n setXShift(x_shift) {\n this.x_shift = x_shift;\n return this;\n }\n setYShift(y_shift) {\n this.y_shift = y_shift;\n return this;\n }\n reset() {\n const data = Glyph.cache.lookup(this.code, this.options.category);\n this.metrics = data.metrics;\n // Override point from metrics file\n if (data.point != -1) {\n this.point = data.point;\n }\n this.scale = (this.point * 72) / (this.metrics.font.getResolution() * 100);\n this.bbox = new BoundingBox(data.bbox.getX() * this.scale, data.bbox.getY() * this.scale, data.bbox.getW() * this.scale, data.bbox.getH() * this.scale);\n }\n checkMetrics() {\n return defined(this.metrics, 'BadGlyph', `Glyph ${this.code} is not initialized.`);\n }\n getMetrics() {\n const metrics = this.checkMetrics();\n const metricsScale = metrics.scale;\n return {\n x_min: metrics.x_min * this.scale * metricsScale,\n x_max: metrics.x_max * this.scale * metricsScale,\n width: this.bbox.getW(),\n height: this.bbox.getH(),\n scale: this.scale * metricsScale,\n x_shift: metrics.x_shift,\n y_shift: metrics.y_shift,\n outline: metrics.outline,\n font: metrics.font,\n ha: metrics.ha,\n };\n }\n setOriginX(x) {\n const { bbox } = this;\n const originX = Math.abs(bbox.getX() / bbox.getW());\n const xShift = (x - originX) * bbox.getW();\n this.originShift.x = -xShift;\n }\n setOriginY(y) {\n const { bbox } = this;\n const originY = Math.abs(bbox.getY() / bbox.getH());\n const yShift = (y - originY) * bbox.getH();\n this.originShift.y = -yShift;\n }\n setOrigin(x, y) {\n this.setOriginX(x);\n this.setOriginY(y);\n }\n render(ctx, x, y) {\n const metrics = this.checkMetrics();\n const outline = metrics.outline;\n const scale = this.scale * metrics.scale;\n this.setRendered();\n this.applyStyle(ctx);\n const xPos = x + this.originShift.x + metrics.x_shift;\n const yPos = y + this.originShift.y + metrics.y_shift;\n Glyph.renderOutline(ctx, outline, scale, xPos, yPos);\n this.restoreStyle(ctx);\n }\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n renderToStave(x) {\n const context = this.checkContext();\n const metrics = this.checkMetrics();\n const stave = this.checkStave();\n const outline = metrics.outline;\n const scale = this.scale * metrics.scale;\n this.setRendered();\n this.applyStyle();\n const xPos = x + this.x_shift + metrics.x_shift;\n const yPos = stave.getYForGlyphs() + this.y_shift + metrics.y_shift;\n Glyph.renderOutline(context, outline, scale, xPos, yPos);\n this.restoreStyle();\n }\n}\nGlyph.cache = new GlyphCache();\n// The current cache key for GlyphCache above.\n// Computed when Flow.setMusicFont(...) is called.\n// It is set to a comma separated list of font names.\nGlyph.CURRENT_CACHE_KEY = '';\n// Used by the GlyphCache above.\n// Set when Flow.setMusicFont(...) is called.\nGlyph.MUSIC_FONT_STACK = [];\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nexport var ModifierPosition;\n(function (ModifierPosition) {\n ModifierPosition[ModifierPosition[\"CENTER\"] = 0] = \"CENTER\";\n ModifierPosition[ModifierPosition[\"LEFT\"] = 1] = \"LEFT\";\n ModifierPosition[ModifierPosition[\"RIGHT\"] = 2] = \"RIGHT\";\n ModifierPosition[ModifierPosition[\"ABOVE\"] = 3] = \"ABOVE\";\n ModifierPosition[ModifierPosition[\"BELOW\"] = 4] = \"BELOW\";\n})(ModifierPosition || (ModifierPosition = {}));\n// To enable logging for this class. Set `Vex.Flow.Modifier.DEBUG` to `true`.\n// function L(...args) { if (Modifier.DEBUG) log('Vex.Flow.Modifier', args); }\n/**\n * `Modifier` is an abstract interface for notational elements that modify\n * a `Note`. Examples of modifiers are `Accidental`, `Annotation`, `Stroke`, etc.\n *\n * For a `Modifier` instance to be positioned correctly, it must be part of\n * a `ModifierContext`. All modifiers in the same context are rendered relative to\n * one another.\n *\n * Typically, all modifiers to a note are part of the same `ModifierContext` instance. Also,\n * in multi-voice staves, all modifiers to notes on the same `tick` are part of the same\n * `ModifierContext`. This ensures that multiple voices don't trample all over each other.\n */\nexport class Modifier extends Element {\n constructor() {\n super();\n this.width = 0;\n // The `text_line` is reserved space above or below a stave.\n this.text_line = 0;\n this.position = Modifier.Position.LEFT;\n this.x_shift = 0;\n this.y_shift = 0;\n this.spacingFromNextModifier = 0;\n }\n /**\n * Modifiers category string. Every modifier has a different category.\n * The `ModifierContext` uses this to determine the type and order of the modifiers.\n */\n static get CATEGORY() {\n return Category.Modifier;\n }\n /** Modifiers can be positioned almost anywhere, relative to a note. */\n static get Position() {\n return ModifierPosition;\n }\n static get PositionString() {\n return {\n center: ModifierPosition.CENTER,\n above: ModifierPosition.ABOVE,\n below: ModifierPosition.BELOW,\n left: ModifierPosition.LEFT,\n right: ModifierPosition.RIGHT,\n };\n }\n /** Called when position changes. */\n reset() {\n // DO NOTHING.\n }\n /** Get modifier widths. */\n getWidth() {\n return this.width;\n }\n /** Set modifier widths. */\n setWidth(width) {\n this.width = width;\n return this;\n }\n /** Get attached note (`StaveNote`, `TabNote`, etc.) */\n getNote() {\n return defined(this.note, 'NoNote', 'Modifier has no note.');\n }\n /**\n * Used in draw() to check and get the attached note (`StaveNote`, `TabNote`, etc.).\n * Also verifies that the index is valid.\n */\n checkAttachedNote() {\n const category = this.getCategory();\n defined(this.index, 'NoIndex', `Can't draw ${category} without an index.`);\n return defined(this.note, 'NoNote', `Can't draw ${category} without a note.`);\n }\n /**\n * Set attached note.\n * @param note (`StaveNote`, `TabNote`, etc.)\n */\n setNote(note) {\n this.note = note;\n return this;\n }\n /** Get note index, which is a specific note in a chord. */\n getIndex() {\n return this.index;\n }\n /** Check and get note index, which is a specific note in a chord. */\n checkIndex() {\n return defined(this.index, 'NoIndex', 'Modifier has an invalid index.');\n }\n /** Set note index, which is a specific note in a chord. */\n setIndex(index) {\n this.index = index;\n return this;\n }\n /** Get `ModifierContext`. */\n getModifierContext() {\n return this.modifierContext;\n }\n /** Check and get `ModifierContext`. */\n checkModifierContext() {\n return defined(this.modifierContext, 'NoModifierContext', 'Modifier Context Required');\n }\n /** Every modifier must be part of a `ModifierContext`. */\n setModifierContext(c) {\n this.modifierContext = c;\n return this;\n }\n /** Get position. */\n getPosition() {\n return this.position;\n }\n /**\n * Set position.\n * @param position CENTER | LEFT | RIGHT | ABOVE | BELOW\n */\n setPosition(position) {\n this.position = typeof position === 'string' ? Modifier.PositionString[position] : position;\n this.reset();\n return this;\n }\n /** Set the `text_line` for the modifier. */\n setTextLine(line) {\n this.text_line = line;\n return this;\n }\n /** Shift modifier down `y` pixels. Negative values shift up. */\n setYShift(y) {\n this.y_shift = y;\n return this;\n }\n /** Set spacing from next modifier. */\n setSpacingFromNextModifier(x) {\n this.spacingFromNextModifier = x;\n }\n /** Get spacing from next modifier. */\n getSpacingFromNextModifier() {\n return this.spacingFromNextModifier;\n }\n /**\n * Shift modifier `x` pixels in the direction of the modifier. Negative values\n * shift reverse.\n */\n setXShift(x) {\n this.x_shift = 0;\n if (this.position === Modifier.Position.LEFT) {\n this.x_shift -= x;\n }\n else {\n this.x_shift += x;\n }\n return this;\n }\n /** Get shift modifier `x` */\n getXShift() {\n return this.x_shift;\n }\n /** Render the modifier onto the canvas. */\n draw() {\n this.checkContext();\n throw new RuntimeError('NotImplemented', 'draw() not implemented for this modifier.');\n }\n // aligns sub notes of NoteSubGroup (or GraceNoteGroup) to the main note with correct x-offset\n alignSubNotesWithNote(subNotes, note) {\n // Shift over the tick contexts of each note\n const tickContext = note.getTickContext();\n const metrics = tickContext.getMetrics();\n const stave = note.getStave();\n const subNoteXOffset = tickContext.getX() - metrics.modLeftPx - metrics.modRightPx + this.getSpacingFromNextModifier();\n subNotes.forEach((subNote) => {\n const subTickContext = subNote.getTickContext();\n if (stave)\n subNote.setStave(stave);\n subTickContext.setXOffset(subNoteXOffset); // don't touch baseX to avoid shift each render\n });\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { RuntimeError } from './util';\n/** Music implements some standard music theory routines. */\nexport class Music {\n /** Number of an canonical notes (12). */\n static get NUM_TONES() {\n return this.canonical_notes.length;\n }\n /** Names of root notes ('c', 'd',...) */\n static get roots() {\n return ['c', 'd', 'e', 'f', 'g', 'a', 'b'];\n }\n /** Values of the root notes.*/\n static get root_values() {\n return [0, 2, 4, 5, 7, 9, 11];\n }\n /** Indices of the root notes.*/\n static get root_indices() {\n return {\n c: 0,\n d: 1,\n e: 2,\n f: 3,\n g: 4,\n a: 5,\n b: 6,\n };\n }\n /** Names of canonical notes ('c', 'c#', 'd',...). */\n static get canonical_notes() {\n return ['c', 'c#', 'd', 'd#', 'e', 'f', 'f#', 'g', 'g#', 'a', 'a#', 'b'];\n }\n /** Names of diatonic intervals ('unison', 'm2', 'M2',...). */\n static get diatonic_intervals() {\n return ['unison', 'm2', 'M2', 'm3', 'M3', 'p4', 'dim5', 'p5', 'm6', 'M6', 'b7', 'M7', 'octave'];\n }\n /** NoteAccidental associated to diatonic intervals. */\n static get diatonic_accidentals() {\n return {\n unison: { note: 0, accidental: 0 },\n m2: { note: 1, accidental: -1 },\n M2: { note: 1, accidental: 0 },\n m3: { note: 2, accidental: -1 },\n M3: { note: 2, accidental: 0 },\n p4: { note: 3, accidental: 0 },\n dim5: { note: 4, accidental: -1 },\n p5: { note: 4, accidental: 0 },\n m6: { note: 5, accidental: -1 },\n M6: { note: 5, accidental: 0 },\n b7: { note: 6, accidental: -1 },\n M7: { note: 6, accidental: 0 },\n octave: { note: 7, accidental: 0 },\n };\n }\n /** Semitones shift associated to intervals .*/\n static get intervals() {\n return {\n u: 0,\n unison: 0,\n m2: 1,\n b2: 1,\n min2: 1,\n S: 1,\n H: 1,\n 2: 2,\n M2: 2,\n maj2: 2,\n T: 2,\n W: 2,\n m3: 3,\n b3: 3,\n min3: 3,\n M3: 4,\n 3: 4,\n maj3: 4,\n 4: 5,\n p4: 5,\n '#4': 6,\n b5: 6,\n aug4: 6,\n dim5: 6,\n 5: 7,\n p5: 7,\n '#5': 8,\n b6: 8,\n aug5: 8,\n 6: 9,\n M6: 9,\n maj6: 9,\n b7: 10,\n m7: 10,\n min7: 10,\n dom7: 10,\n M7: 11,\n maj7: 11,\n 8: 12,\n octave: 12,\n };\n }\n /** Semitones shifts associated with scales. */\n static get scales() {\n return {\n major: [2, 2, 1, 2, 2, 2, 1],\n minor: [2, 1, 2, 2, 1, 2, 2],\n ionian: [2, 2, 1, 2, 2, 2, 1],\n dorian: [2, 1, 2, 2, 2, 1, 2],\n phyrgian: [1, 2, 2, 2, 1, 2, 2],\n lydian: [2, 2, 2, 1, 2, 2, 1],\n mixolydian: [2, 2, 1, 2, 2, 1, 2],\n aeolian: [2, 1, 2, 2, 1, 2, 2],\n locrian: [1, 2, 2, 1, 2, 2, 2],\n };\n }\n /** Scales associated with m (minor) and M (major). */\n static get scaleTypes() {\n return {\n M: Music.scales.major,\n m: Music.scales.minor,\n };\n }\n /** Accidentals abbreviations. */\n static get accidentals() {\n return ['bb', 'b', 'n', '#', '##'];\n }\n /** Note values. */\n static get noteValues() {\n return {\n c: { root_index: 0, int_val: 0 },\n cn: { root_index: 0, int_val: 0 },\n 'c#': { root_index: 0, int_val: 1 },\n 'c##': { root_index: 0, int_val: 2 },\n cb: { root_index: 0, int_val: 11 },\n cbb: { root_index: 0, int_val: 10 },\n d: { root_index: 1, int_val: 2 },\n dn: { root_index: 1, int_val: 2 },\n 'd#': { root_index: 1, int_val: 3 },\n 'd##': { root_index: 1, int_val: 4 },\n db: { root_index: 1, int_val: 1 },\n dbb: { root_index: 1, int_val: 0 },\n e: { root_index: 2, int_val: 4 },\n en: { root_index: 2, int_val: 4 },\n 'e#': { root_index: 2, int_val: 5 },\n 'e##': { root_index: 2, int_val: 6 },\n eb: { root_index: 2, int_val: 3 },\n ebb: { root_index: 2, int_val: 2 },\n f: { root_index: 3, int_val: 5 },\n fn: { root_index: 3, int_val: 5 },\n 'f#': { root_index: 3, int_val: 6 },\n 'f##': { root_index: 3, int_val: 7 },\n fb: { root_index: 3, int_val: 4 },\n fbb: { root_index: 3, int_val: 3 },\n g: { root_index: 4, int_val: 7 },\n gn: { root_index: 4, int_val: 7 },\n 'g#': { root_index: 4, int_val: 8 },\n 'g##': { root_index: 4, int_val: 9 },\n gb: { root_index: 4, int_val: 6 },\n gbb: { root_index: 4, int_val: 5 },\n a: { root_index: 5, int_val: 9 },\n an: { root_index: 5, int_val: 9 },\n 'a#': { root_index: 5, int_val: 10 },\n 'a##': { root_index: 5, int_val: 11 },\n ab: { root_index: 5, int_val: 8 },\n abb: { root_index: 5, int_val: 7 },\n b: { root_index: 6, int_val: 11 },\n bn: { root_index: 6, int_val: 11 },\n 'b#': { root_index: 6, int_val: 0 },\n 'b##': { root_index: 6, int_val: 1 },\n bb: { root_index: 6, int_val: 10 },\n bbb: { root_index: 6, int_val: 9 },\n };\n }\n isValidNoteValue(note) {\n return note >= 0 && note < Music.canonical_notes.length;\n }\n isValidIntervalValue(interval) {\n return interval >= 0 && interval < Music.diatonic_intervals.length;\n }\n /** Return root and accidental associated to a note. */\n getNoteParts(noteString) {\n if (!noteString || noteString.length < 1) {\n throw new RuntimeError('BadArguments', 'Invalid note name: ' + noteString);\n }\n if (noteString.length > 3) {\n throw new RuntimeError('BadArguments', 'Invalid note name: ' + noteString);\n }\n const note = noteString.toLowerCase();\n const regex = /^([cdefgab])(b|bb|n|#|##)?$/;\n const match = regex.exec(note);\n if (match !== null) {\n const root = match[1];\n const accidental = match[2];\n return {\n root,\n accidental,\n };\n }\n else {\n throw new RuntimeError('BadArguments', 'Invalid note name: ' + noteString);\n }\n }\n /** Return root, accidental and type associated to a key. */\n getKeyParts(keyString) {\n if (!keyString || keyString.length < 1) {\n throw new RuntimeError('BadArguments', 'Invalid key: ' + keyString);\n }\n const key = keyString.toLowerCase();\n // Support Major, Minor, Melodic Minor, and Harmonic Minor key types.\n const regex = /^([cdefgab])(b|#)?(mel|harm|m|M)?$/;\n const match = regex.exec(key);\n if (match !== null) {\n const root = match[1];\n const accidental = match[2];\n let type = match[3];\n // Unspecified type implies major\n if (!type)\n type = 'M';\n return {\n root,\n accidental,\n type,\n };\n }\n else {\n throw new RuntimeError('BadArguments', `Invalid key: ${keyString}`);\n }\n }\n /** Note value associated to a note name. */\n getNoteValue(noteString) {\n const value = Music.noteValues[noteString];\n if (value === undefined) {\n throw new RuntimeError('BadArguments', `Invalid note name: ${noteString}`);\n }\n return value.int_val;\n }\n /** Interval value associated to an interval name. */\n getIntervalValue(intervalString) {\n const value = Music.intervals[intervalString];\n if (value === undefined) {\n throw new RuntimeError('BadArguments', `Invalid interval name: ${intervalString}`);\n }\n return value;\n }\n /** Canonical note name associated to a value. */\n getCanonicalNoteName(noteValue) {\n if (!this.isValidNoteValue(noteValue)) {\n throw new RuntimeError('BadArguments', `Invalid note value: ${noteValue}`);\n }\n return Music.canonical_notes[noteValue];\n }\n /** Interval name associated to a value. */\n getCanonicalIntervalName(intervalValue) {\n if (!this.isValidIntervalValue(intervalValue)) {\n throw new RuntimeError('BadArguments', `Invalid interval value: ${intervalValue}`);\n }\n return Music.diatonic_intervals[intervalValue];\n }\n /**\n * Given a note, interval, and interval direction, produce the relative note.\n */\n getRelativeNoteValue(noteValue, intervalValue, direction = 1) {\n if (direction !== 1 && direction !== -1) {\n throw new RuntimeError('BadArguments', `Invalid direction: ${direction}`);\n }\n let sum = (noteValue + direction * intervalValue) % Music.NUM_TONES;\n if (sum < 0)\n sum += Music.NUM_TONES;\n return sum;\n }\n /**\n * Given a root and note value, produce the relative note name.\n */\n getRelativeNoteName(root, noteValue) {\n const parts = this.getNoteParts(root);\n const rootValue = this.getNoteValue(parts.root);\n let interval = noteValue - rootValue;\n if (Math.abs(interval) > Music.NUM_TONES - 3) {\n let multiplier = 1;\n if (interval > 0)\n multiplier = -1;\n // Possibly wrap around. (Add +1 for modulo operator)\n const reverse_interval = ((noteValue + 1 + (rootValue + 1)) % Music.NUM_TONES) * multiplier;\n if (Math.abs(reverse_interval) > 2) {\n throw new RuntimeError('BadArguments', `Notes not related: ${root}, ${noteValue})`);\n }\n else {\n interval = reverse_interval;\n }\n }\n if (Math.abs(interval) > 2) {\n throw new RuntimeError('BadArguments', `Notes not related: ${root}, ${noteValue})`);\n }\n let relativeNoteName = parts.root;\n if (interval > 0) {\n for (let i = 1; i <= interval; ++i) {\n relativeNoteName += '#';\n }\n }\n else if (interval < 0) {\n for (let i = -1; i >= interval; --i) {\n relativeNoteName += 'b';\n }\n }\n return relativeNoteName;\n }\n /**\n * Return scale tones, given intervals. Each successive interval is\n * relative to the previous one, e.g., Major Scale:\n *\n * TTSTTTS = [2,2,1,2,2,2,1]\n *\n * When used with key = 0, returns C scale (which is isomorphic to\n * interval list).\n */\n getScaleTones(key, intervals) {\n const tones = [key];\n let nextNote = key;\n for (let i = 0; i < intervals.length; i++) {\n nextNote = this.getRelativeNoteValue(nextNote, intervals[i]);\n if (nextNote !== key)\n tones.push(nextNote);\n }\n return tones;\n }\n /**\n * Return the interval of a note, given a diatonic scale.\n * e.g., given the scale C, and the note E, returns M3.\n */\n getIntervalBetween(note1, note2, direction = 1) {\n if (direction !== 1 && direction !== -1) {\n throw new RuntimeError('BadArguments', `Invalid direction: ${direction}`);\n }\n if (!this.isValidNoteValue(note1) || !this.isValidNoteValue(note2)) {\n throw new RuntimeError('BadArguments', `Invalid notes: ${note1}, ${note2}`);\n }\n let difference = direction === 1 ? note2 - note1 : note1 - note2;\n if (difference < 0)\n difference += Music.NUM_TONES;\n return difference;\n }\n /**\n * Create a scale map that represents the pitch state for a\n * `keySignature`. For example, passing a `G` to `keySignature` would\n * return a scale map with every note naturalized except for `F` which\n * has an `F#` state.\n */\n createScaleMap(keySignature) {\n const keySigParts = this.getKeyParts(keySignature);\n if (!keySigParts.type)\n throw new RuntimeError('BadArguments', 'Unsupported key type: undefined');\n const scaleName = Music.scaleTypes[keySigParts.type];\n let keySigString = keySigParts.root;\n if (keySigParts.accidental)\n keySigString += keySigParts.accidental;\n if (!scaleName)\n throw new RuntimeError('BadArguments', 'Unsupported key type: ' + keySignature);\n const scale = this.getScaleTones(this.getNoteValue(keySigString), scaleName);\n const noteLocation = Music.root_indices[keySigParts.root];\n const scaleMap = {};\n for (let i = 0; i < Music.roots.length; ++i) {\n const index = (noteLocation + i) % Music.roots.length;\n const rootName = Music.roots[index];\n let noteName = this.getRelativeNoteName(rootName, scale[i]);\n if (noteName.length === 1) {\n noteName += 'n';\n }\n scaleMap[rootName] = noteName;\n }\n return scaleMap;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { Fraction } from './fraction';\nimport { Glyph } from './glyph';\nimport { RuntimeError } from './util';\nconst RESOLUTION = 16384;\n/**\n * Map duration numbers to 'ticks', the unit of duration used throughout VexFlow.\n * For example, a quarter note is 4, so it maps to RESOLUTION / 4 = 4096 ticks.\n */\nconst durations = {\n '1/2': RESOLUTION * 2,\n 1: RESOLUTION / 1,\n 2: RESOLUTION / 2,\n 4: RESOLUTION / 4,\n 8: RESOLUTION / 8,\n 16: RESOLUTION / 16,\n 32: RESOLUTION / 32,\n 64: RESOLUTION / 64,\n 128: RESOLUTION / 128,\n 256: RESOLUTION / 256,\n};\nconst durationAliases = {\n w: '1',\n h: '2',\n q: '4',\n // This is the default duration used to render bars (BarNote). Bars no longer\n // consume ticks, so this should be a no-op.\n // TODO(0xfe): This needs to be cleaned up.\n b: '256',\n};\nconst keySignatures = {\n C: { num: 0 },\n Am: { num: 0 },\n F: { acc: 'b', num: 1 },\n Dm: { acc: 'b', num: 1 },\n Bb: { acc: 'b', num: 2 },\n Gm: { acc: 'b', num: 2 },\n Eb: { acc: 'b', num: 3 },\n Cm: { acc: 'b', num: 3 },\n Ab: { acc: 'b', num: 4 },\n Fm: { acc: 'b', num: 4 },\n Db: { acc: 'b', num: 5 },\n Bbm: { acc: 'b', num: 5 },\n Gb: { acc: 'b', num: 6 },\n Ebm: { acc: 'b', num: 6 },\n Cb: { acc: 'b', num: 7 },\n Abm: { acc: 'b', num: 7 },\n G: { acc: '#', num: 1 },\n Em: { acc: '#', num: 1 },\n D: { acc: '#', num: 2 },\n Bm: { acc: '#', num: 2 },\n A: { acc: '#', num: 3 },\n 'F#m': { acc: '#', num: 3 },\n E: { acc: '#', num: 4 },\n 'C#m': { acc: '#', num: 4 },\n B: { acc: '#', num: 5 },\n 'G#m': { acc: '#', num: 5 },\n 'F#': { acc: '#', num: 6 },\n 'D#m': { acc: '#', num: 6 },\n 'C#': { acc: '#', num: 7 },\n 'A#m': { acc: '#', num: 7 },\n};\nconst clefs = {\n treble: { line_shift: 0 },\n bass: { line_shift: 6 },\n tenor: { line_shift: 4 },\n alto: { line_shift: 3 },\n soprano: { line_shift: 1 },\n percussion: { line_shift: 0 },\n 'mezzo-soprano': { line_shift: 2 },\n 'baritone-c': { line_shift: 5 },\n 'baritone-f': { line_shift: 5 },\n subbass: { line_shift: 7 },\n french: { line_shift: -1 },\n};\nconst notesInfo = {\n C: { index: 0, int_val: 0 },\n CN: { index: 0, int_val: 0, accidental: 'n' },\n 'C#': { index: 0, int_val: 1, accidental: '#' },\n 'C##': { index: 0, int_val: 2, accidental: '##' },\n CB: { index: 0, int_val: 11, accidental: 'b' },\n CBB: { index: 0, int_val: 10, accidental: 'bb' },\n D: { index: 1, int_val: 2 },\n DN: { index: 1, int_val: 2, accidental: 'n' },\n 'D#': { index: 1, int_val: 3, accidental: '#' },\n 'D##': { index: 1, int_val: 4, accidental: '##' },\n DB: { index: 1, int_val: 1, accidental: 'b' },\n DBB: { index: 1, int_val: 0, accidental: 'bb' },\n E: { index: 2, int_val: 4 },\n EN: { index: 2, int_val: 4, accidental: 'n' },\n 'E#': { index: 2, int_val: 5, accidental: '#' },\n 'E##': { index: 2, int_val: 6, accidental: '##' },\n EB: { index: 2, int_val: 3, accidental: 'b' },\n EBB: { index: 2, int_val: 2, accidental: 'bb' },\n F: { index: 3, int_val: 5 },\n FN: { index: 3, int_val: 5, accidental: 'n' },\n 'F#': { index: 3, int_val: 6, accidental: '#' },\n 'F##': { index: 3, int_val: 7, accidental: '##' },\n FB: { index: 3, int_val: 4, accidental: 'b' },\n FBB: { index: 3, int_val: 3, accidental: 'bb' },\n G: { index: 4, int_val: 7 },\n GN: { index: 4, int_val: 7, accidental: 'n' },\n 'G#': { index: 4, int_val: 8, accidental: '#' },\n 'G##': { index: 4, int_val: 9, accidental: '##' },\n GB: { index: 4, int_val: 6, accidental: 'b' },\n GBB: { index: 4, int_val: 5, accidental: 'bb' },\n A: { index: 5, int_val: 9 },\n AN: { index: 5, int_val: 9, accidental: 'n' },\n 'A#': { index: 5, int_val: 10, accidental: '#' },\n 'A##': { index: 5, int_val: 11, accidental: '##' },\n AB: { index: 5, int_val: 8, accidental: 'b' },\n ABB: { index: 5, int_val: 7, accidental: 'bb' },\n B: { index: 6, int_val: 11 },\n BN: { index: 6, int_val: 11, accidental: 'n' },\n 'B#': { index: 6, int_val: 12, accidental: '#' },\n 'B##': { index: 6, int_val: 13, accidental: '##' },\n BB: { index: 6, int_val: 10, accidental: 'b' },\n BBB: { index: 6, int_val: 9, accidental: 'bb' },\n R: { index: 6, rest: true },\n X: {\n index: 6,\n accidental: '',\n octave: 4,\n code: 'noteheadXBlack',\n shift_right: 5.5,\n },\n};\nconst validNoteTypes = {\n n: { name: 'note' },\n r: { name: 'rest' },\n h: { name: 'harmonic' },\n m: { name: 'muted' },\n s: { name: 'slash' },\n g: { name: 'ghost' },\n};\nconst customNoteHeads = {\n /* Diamond */\n D0: { code: 'noteheadDiamondWhole' },\n D1: { code: 'noteheadDiamondHalf' },\n D2: { code: 'noteheadDiamondBlack' },\n D3: { code: 'noteheadDiamondBlack' },\n /* Triangle */\n T0: { code: 'noteheadTriangleUpWhole' },\n T1: { code: 'noteheadTriangleUpHalf' },\n T2: { code: 'noteheadTriangleUpBlack' },\n T3: { code: 'noteheadTriangleUpBlack' },\n /* Cross */\n X0: { code: 'noteheadXWhole' },\n X1: { code: 'noteheadXHalf' },\n X2: { code: 'noteheadXBlack' },\n X3: { code: 'noteheadCircleX' },\n /* Square */\n S1: { code: 'noteheadSquareWhite' },\n S2: { code: 'noteheadSquareBlack' },\n /* Rectangle */\n R1: { code: 'vexNoteHeadRectWhite' },\n R2: { code: 'vexNoteHeadRectBlack' }, // no smufl code\n};\nconst accidentals = {\n '#': { code: 'accidentalSharp', parenRightPaddingAdjustment: -1 },\n '##': { code: 'accidentalDoubleSharp', parenRightPaddingAdjustment: -1 },\n b: { code: 'accidentalFlat', parenRightPaddingAdjustment: -2 },\n bb: { code: 'accidentalDoubleFlat', parenRightPaddingAdjustment: -2 },\n n: { code: 'accidentalNatural', parenRightPaddingAdjustment: -1 },\n '{': { code: 'accidentalParensLeft', parenRightPaddingAdjustment: -1 },\n '}': { code: 'accidentalParensRight', parenRightPaddingAdjustment: -1 },\n db: { code: 'accidentalThreeQuarterTonesFlatZimmermann', parenRightPaddingAdjustment: -1 },\n d: { code: 'accidentalQuarterToneFlatStein', parenRightPaddingAdjustment: 0 },\n '++': { code: 'accidentalThreeQuarterTonesSharpStein', parenRightPaddingAdjustment: -1 },\n '+': { code: 'accidentalQuarterToneSharpStein', parenRightPaddingAdjustment: -1 },\n '+-': { code: 'accidentalKucukMucennebSharp', parenRightPaddingAdjustment: -1 },\n bs: { code: 'accidentalBakiyeFlat', parenRightPaddingAdjustment: -1 },\n bss: { code: 'accidentalBuyukMucennebFlat', parenRightPaddingAdjustment: -1 },\n o: { code: 'accidentalSori', parenRightPaddingAdjustment: -1 },\n k: { code: 'accidentalKoron', parenRightPaddingAdjustment: -1 },\n bbs: { code: 'vexAccidentalMicrotonal1', parenRightPaddingAdjustment: -1 },\n '++-': { code: 'vexAccidentalMicrotonal2', parenRightPaddingAdjustment: -1 },\n ashs: { code: 'vexAccidentalMicrotonal3', parenRightPaddingAdjustment: -1 },\n afhf: { code: 'vexAccidentalMicrotonal4', parenRightPaddingAdjustment: -1 },\n accSagittal5v7KleismaUp: { code: 'accSagittal5v7KleismaUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v7KleismaDown: { code: 'accSagittal5v7KleismaDown', parenRightPaddingAdjustment: -1 },\n accSagittal5CommaUp: { code: 'accSagittal5CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal5CommaDown: { code: 'accSagittal5CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal7CommaUp: { code: 'accSagittal7CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal7CommaDown: { code: 'accSagittal7CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal25SmallDiesisUp: { code: 'accSagittal25SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal25SmallDiesisDown: { code: 'accSagittal25SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal35MediumDiesisUp: { code: 'accSagittal35MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal35MediumDiesisDown: { code: 'accSagittal35MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal11MediumDiesisUp: { code: 'accSagittal11MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal11MediumDiesisDown: { code: 'accSagittal11MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal11LargeDiesisUp: { code: 'accSagittal11LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal11LargeDiesisDown: { code: 'accSagittal11LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal35LargeDiesisUp: { code: 'accSagittal35LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal35LargeDiesisDown: { code: 'accSagittal35LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp25SDown: { code: 'accSagittalSharp25SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat25SUp: { code: 'accSagittalFlat25SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7CDown: { code: 'accSagittalSharp7CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7CUp: { code: 'accSagittalFlat7CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5CDown: { code: 'accSagittalSharp5CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5CUp: { code: 'accSagittalFlat5CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v7kDown: { code: 'accSagittalSharp5v7kDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v7kUp: { code: 'accSagittalFlat5v7kUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp: { code: 'accSagittalSharp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat: { code: 'accSagittalFlat', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v7kUp: { code: 'accSagittalSharp5v7kUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v7kDown: { code: 'accSagittalFlat5v7kDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5CUp: { code: 'accSagittalSharp5CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5CDown: { code: 'accSagittalFlat5CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7CUp: { code: 'accSagittalSharp7CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7CDown: { code: 'accSagittalFlat7CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp25SUp: { code: 'accSagittalSharp25SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat25SDown: { code: 'accSagittalFlat25SDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp35MUp: { code: 'accSagittalSharp35MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat35MDown: { code: 'accSagittalFlat35MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11MUp: { code: 'accSagittalSharp11MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11MDown: { code: 'accSagittalFlat11MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11LUp: { code: 'accSagittalSharp11LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11LDown: { code: 'accSagittalFlat11LDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp35LUp: { code: 'accSagittalSharp35LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat35LDown: { code: 'accSagittalFlat35LDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp25SDown: { code: 'accSagittalDoubleSharp25SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat25SUp: { code: 'accSagittalDoubleFlat25SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp7CDown: { code: 'accSagittalDoubleSharp7CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat7CUp: { code: 'accSagittalDoubleFlat7CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5CDown: { code: 'accSagittalDoubleSharp5CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5CUp: { code: 'accSagittalDoubleFlat5CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5v7kDown: { code: 'accSagittalDoubleSharp5v7kDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5v7kUp: { code: 'accSagittalDoubleFlat5v7kUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp: { code: 'accSagittalDoubleSharp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat: { code: 'accSagittalDoubleFlat', parenRightPaddingAdjustment: -1 },\n accSagittal7v11KleismaUp: { code: 'accSagittal7v11KleismaUp', parenRightPaddingAdjustment: -1 },\n accSagittal7v11KleismaDown: { code: 'accSagittal7v11KleismaDown', parenRightPaddingAdjustment: -1 },\n accSagittal17CommaUp: { code: 'accSagittal17CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal17CommaDown: { code: 'accSagittal17CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal55CommaUp: { code: 'accSagittal55CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal55CommaDown: { code: 'accSagittal55CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal7v11CommaUp: { code: 'accSagittal7v11CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal7v11CommaDown: { code: 'accSagittal7v11CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v11SmallDiesisUp: { code: 'accSagittal5v11SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v11SmallDiesisDown: { code: 'accSagittal5v11SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v11SDown: { code: 'accSagittalSharp5v11SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v11SUp: { code: 'accSagittalFlat5v11SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v11CDown: { code: 'accSagittalSharp7v11CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v11CUp: { code: 'accSagittalFlat7v11CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp55CDown: { code: 'accSagittalSharp55CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat55CUp: { code: 'accSagittalFlat55CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp17CDown: { code: 'accSagittalSharp17CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat17CUp: { code: 'accSagittalFlat17CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v11kDown: { code: 'accSagittalSharp7v11kDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v11kUp: { code: 'accSagittalFlat7v11kUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v11kUp: { code: 'accSagittalSharp7v11kUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v11kDown: { code: 'accSagittalFlat7v11kDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp17CUp: { code: 'accSagittalSharp17CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat17CDown: { code: 'accSagittalFlat17CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp55CUp: { code: 'accSagittalSharp55CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat55CDown: { code: 'accSagittalFlat55CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v11CUp: { code: 'accSagittalSharp7v11CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v11CDown: { code: 'accSagittalFlat7v11CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v11SUp: { code: 'accSagittalSharp5v11SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v11SDown: { code: 'accSagittalFlat5v11SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5v11SDown: { code: 'accSagittalDoubleSharp5v11SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5v11SUp: { code: 'accSagittalDoubleFlat5v11SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp7v11CDown: { code: 'accSagittalDoubleSharp7v11CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat7v11CUp: { code: 'accSagittalDoubleFlat7v11CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp55CDown: { code: 'accSagittalDoubleSharp55CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat55CUp: { code: 'accSagittalDoubleFlat55CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp17CDown: { code: 'accSagittalDoubleSharp17CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat17CUp: { code: 'accSagittalDoubleFlat17CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp7v11kDown: { code: 'accSagittalDoubleSharp7v11kDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat7v11kUp: { code: 'accSagittalDoubleFlat7v11kUp', parenRightPaddingAdjustment: -1 },\n accSagittal23CommaUp: { code: 'accSagittal23CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal23CommaDown: { code: 'accSagittal23CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v19CommaUp: { code: 'accSagittal5v19CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v19CommaDown: { code: 'accSagittal5v19CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v23SmallDiesisUp: { code: 'accSagittal5v23SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v23SmallDiesisDown: { code: 'accSagittal5v23SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v23SDown: { code: 'accSagittalSharp5v23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v23SUp: { code: 'accSagittalFlat5v23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v19CDown: { code: 'accSagittalSharp5v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v19CUp: { code: 'accSagittalFlat5v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp23CDown: { code: 'accSagittalSharp23CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat23CUp: { code: 'accSagittalFlat23CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp23CUp: { code: 'accSagittalSharp23CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat23CDown: { code: 'accSagittalFlat23CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v19CUp: { code: 'accSagittalSharp5v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v19CDown: { code: 'accSagittalFlat5v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v23SUp: { code: 'accSagittalSharp5v23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v23SDown: { code: 'accSagittalFlat5v23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5v23SDown: { code: 'accSagittalDoubleSharp5v23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5v23SUp: { code: 'accSagittalDoubleFlat5v23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5v19CDown: { code: 'accSagittalDoubleSharp5v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5v19CUp: { code: 'accSagittalDoubleFlat5v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp23CDown: { code: 'accSagittalDoubleSharp23CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat23CUp: { code: 'accSagittalDoubleFlat23CUp', parenRightPaddingAdjustment: -1 },\n accSagittal19SchismaUp: { code: 'accSagittal19SchismaUp', parenRightPaddingAdjustment: -1 },\n accSagittal19SchismaDown: { code: 'accSagittal19SchismaDown', parenRightPaddingAdjustment: -1 },\n accSagittal17KleismaUp: { code: 'accSagittal17KleismaUp', parenRightPaddingAdjustment: -1 },\n accSagittal17KleismaDown: { code: 'accSagittal17KleismaDown', parenRightPaddingAdjustment: -1 },\n accSagittal143CommaUp: { code: 'accSagittal143CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal143CommaDown: { code: 'accSagittal143CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal11v49CommaUp: { code: 'accSagittal11v49CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal11v49CommaDown: { code: 'accSagittal11v49CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal19CommaUp: { code: 'accSagittal19CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal19CommaDown: { code: 'accSagittal19CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal7v19CommaUp: { code: 'accSagittal7v19CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal7v19CommaDown: { code: 'accSagittal7v19CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal49SmallDiesisUp: { code: 'accSagittal49SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal49SmallDiesisDown: { code: 'accSagittal49SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal23SmallDiesisUp: { code: 'accSagittal23SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal23SmallDiesisDown: { code: 'accSagittal23SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v13MediumDiesisUp: { code: 'accSagittal5v13MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v13MediumDiesisDown: { code: 'accSagittal5v13MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal11v19MediumDiesisUp: { code: 'accSagittal11v19MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal11v19MediumDiesisDown: { code: 'accSagittal11v19MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal49MediumDiesisUp: { code: 'accSagittal49MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal49MediumDiesisDown: { code: 'accSagittal49MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v49MediumDiesisUp: { code: 'accSagittal5v49MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v49MediumDiesisDown: { code: 'accSagittal5v49MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal49LargeDiesisUp: { code: 'accSagittal49LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal49LargeDiesisDown: { code: 'accSagittal49LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal11v19LargeDiesisUp: { code: 'accSagittal11v19LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal11v19LargeDiesisDown: { code: 'accSagittal11v19LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v13LargeDiesisUp: { code: 'accSagittal5v13LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v13LargeDiesisDown: { code: 'accSagittal5v13LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp23SDown: { code: 'accSagittalSharp23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat23SUp: { code: 'accSagittalFlat23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp49SDown: { code: 'accSagittalSharp49SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat49SUp: { code: 'accSagittalFlat49SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v19CDown: { code: 'accSagittalSharp7v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v19CUp: { code: 'accSagittalFlat7v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp19CDown: { code: 'accSagittalSharp19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat19CUp: { code: 'accSagittalFlat19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11v49CDown: { code: 'accSagittalSharp11v49CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11v49CUp: { code: 'accSagittalFlat11v49CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp143CDown: { code: 'accSagittalSharp143CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat143CUp: { code: 'accSagittalFlat143CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp17kDown: { code: 'accSagittalSharp17kDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat17kUp: { code: 'accSagittalFlat17kUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp19sDown: { code: 'accSagittalSharp19sDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat19sUp: { code: 'accSagittalFlat19sUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp19sUp: { code: 'accSagittalSharp19sUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat19sDown: { code: 'accSagittalFlat19sDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp17kUp: { code: 'accSagittalSharp17kUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat17kDown: { code: 'accSagittalFlat17kDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp143CUp: { code: 'accSagittalSharp143CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat143CDown: { code: 'accSagittalFlat143CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11v49CUp: { code: 'accSagittalSharp11v49CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11v49CDown: { code: 'accSagittalFlat11v49CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp19CUp: { code: 'accSagittalSharp19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat19CDown: { code: 'accSagittalFlat19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v19CUp: { code: 'accSagittalSharp7v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v19CDown: { code: 'accSagittalFlat7v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp49SUp: { code: 'accSagittalSharp49SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat49SDown: { code: 'accSagittalFlat49SDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp23SUp: { code: 'accSagittalSharp23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat23SDown: { code: 'accSagittalFlat23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v13MUp: { code: 'accSagittalSharp5v13MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v13MDown: { code: 'accSagittalFlat5v13MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11v19MUp: { code: 'accSagittalSharp11v19MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11v19MDown: { code: 'accSagittalFlat11v19MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp49MUp: { code: 'accSagittalSharp49MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat49MDown: { code: 'accSagittalFlat49MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v49MUp: { code: 'accSagittalSharp5v49MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v49MDown: { code: 'accSagittalFlat5v49MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp49LUp: { code: 'accSagittalSharp49LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat49LDown: { code: 'accSagittalFlat49LDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11v19LUp: { code: 'accSagittalSharp11v19LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11v19LDown: { code: 'accSagittalFlat11v19LDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v13LUp: { code: 'accSagittalSharp5v13LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v13LDown: { code: 'accSagittalFlat5v13LDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp23SDown: { code: 'accSagittalDoubleSharp23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat23SUp: { code: 'accSagittalDoubleFlat23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp49SDown: { code: 'accSagittalDoubleSharp49SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat49SUp: { code: 'accSagittalDoubleFlat49SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp7v19CDown: { code: 'accSagittalDoubleSharp7v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat7v19CUp: { code: 'accSagittalDoubleFlat7v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp19CDown: { code: 'accSagittalDoubleSharp19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat19CUp: { code: 'accSagittalDoubleFlat19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp11v49CDown: { code: 'accSagittalDoubleSharp11v49CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat11v49CUp: { code: 'accSagittalDoubleFlat11v49CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp143CDown: { code: 'accSagittalDoubleSharp143CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat143CUp: { code: 'accSagittalDoubleFlat143CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp17kDown: { code: 'accSagittalDoubleSharp17kDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat17kUp: { code: 'accSagittalDoubleFlat17kUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp19sDown: { code: 'accSagittalDoubleSharp19sDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat19sUp: { code: 'accSagittalDoubleFlat19sUp', parenRightPaddingAdjustment: -1 },\n accSagittalShaftUp: { code: 'accSagittalShaftUp', parenRightPaddingAdjustment: -1 },\n accSagittalShaftDown: { code: 'accSagittalShaftDown', parenRightPaddingAdjustment: -1 },\n accSagittalAcute: { code: 'accSagittalAcute', parenRightPaddingAdjustment: -1 },\n accSagittalGrave: { code: 'accSagittalGrave', parenRightPaddingAdjustment: -1 },\n accSagittal1MinaUp: { code: 'accSagittal1MinaUp', parenRightPaddingAdjustment: -1 },\n accSagittal1MinaDown: { code: 'accSagittal1MinaDown', parenRightPaddingAdjustment: -1 },\n accSagittal2MinasUp: { code: 'accSagittal2MinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal2MinasDown: { code: 'accSagittal2MinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal1TinaUp: { code: 'accSagittal1TinaUp', parenRightPaddingAdjustment: -1 },\n accSagittal1TinaDown: { code: 'accSagittal1TinaDown', parenRightPaddingAdjustment: -1 },\n accSagittal2TinasUp: { code: 'accSagittal2TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal2TinasDown: { code: 'accSagittal2TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal3TinasUp: { code: 'accSagittal3TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal3TinasDown: { code: 'accSagittal3TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal4TinasUp: { code: 'accSagittal4TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal4TinasDown: { code: 'accSagittal4TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal5TinasUp: { code: 'accSagittal5TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal5TinasDown: { code: 'accSagittal5TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal6TinasUp: { code: 'accSagittal6TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal6TinasDown: { code: 'accSagittal6TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal7TinasUp: { code: 'accSagittal7TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal7TinasDown: { code: 'accSagittal7TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal8TinasUp: { code: 'accSagittal8TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal8TinasDown: { code: 'accSagittal8TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal9TinasUp: { code: 'accSagittal9TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal9TinasDown: { code: 'accSagittal9TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittalFractionalTinaUp: { code: 'accSagittalFractionalTinaUp', parenRightPaddingAdjustment: -1 },\n accSagittalFractionalTinaDown: { code: 'accSagittalFractionalTinaDown', parenRightPaddingAdjustment: -1 },\n accidentalNarrowReversedFlat: { code: 'accidentalNarrowReversedFlat', parenRightPaddingAdjustment: -1 },\n accidentalNarrowReversedFlatAndFlat: {\n code: 'accidentalNarrowReversedFlatAndFlat',\n parenRightPaddingAdjustment: -1,\n },\n accidentalWilsonPlus: { code: 'accidentalWilsonPlus', parenRightPaddingAdjustment: -1 },\n accidentalWilsonMinus: { code: 'accidentalWilsonMinus', parenRightPaddingAdjustment: -1 },\n};\n// Helps determine the layout of accidentals.\nconst accidentalColumns = {\n 1: {\n a: [1],\n b: [1],\n },\n 2: {\n a: [1, 2],\n },\n 3: {\n a: [1, 3, 2],\n b: [1, 2, 1],\n second_on_bottom: [1, 2, 3],\n },\n 4: {\n a: [1, 3, 4, 2],\n b: [1, 2, 3, 1],\n spaced_out_tetrachord: [1, 2, 1, 2],\n },\n 5: {\n a: [1, 3, 5, 4, 2],\n b: [1, 2, 4, 3, 1],\n spaced_out_pentachord: [1, 2, 3, 2, 1],\n very_spaced_out_pentachord: [1, 2, 1, 2, 1],\n },\n 6: {\n a: [1, 3, 5, 6, 4, 2],\n b: [1, 2, 4, 5, 3, 1],\n spaced_out_hexachord: [1, 3, 2, 1, 3, 2],\n very_spaced_out_hexachord: [1, 2, 1, 2, 1, 2],\n },\n};\nconst articulations = {\n 'a.': { code: 'augmentationDot', between_lines: true },\n av: {\n aboveCode: 'articStaccatissimoAbove',\n belowCode: 'articStaccatissimoBelow',\n between_lines: true,\n },\n 'a>': {\n aboveCode: 'articAccentAbove',\n belowCode: 'articAccentBelow',\n between_lines: true,\n },\n 'a-': {\n aboveCode: 'articTenutoAbove',\n belowCode: 'articTenutoBelow',\n between_lines: true,\n },\n 'a^': {\n aboveCode: 'articMarcatoAbove',\n belowCode: 'articMarcatoBelow',\n between_lines: false,\n },\n 'a+': { code: 'pluckedLeftHandPizzicato', between_lines: false },\n ao: {\n aboveCode: 'pluckedSnapPizzicatoAbove',\n belowCode: 'pluckedSnapPizzicatoBelow',\n between_lines: false,\n },\n ah: { code: 'stringsHarmonic', between_lines: false },\n 'a@': { aboveCode: 'fermataAbove', belowCode: 'fermataBelow', between_lines: false },\n 'a@a': { code: 'fermataAbove', between_lines: false },\n 'a@u': { code: 'fermataBelow', between_lines: false },\n 'a|': { code: 'stringsUpBow', between_lines: false },\n am: { code: 'stringsDownBow', between_lines: false },\n 'a,': { code: 'pictChokeCymbal', between_lines: false }, // Choked\n};\nconst ornaments = {\n mordent: { code: 'ornamentShortTrill' },\n mordent_inverted: { code: 'ornamentMordent' },\n turn: { code: 'ornamentTurn' },\n turn_inverted: { code: 'ornamentTurnSlash' },\n tr: { code: 'ornamentTrill' },\n upprall: { code: 'ornamentPrecompSlideTrillDAnglebert' },\n downprall: { code: 'ornamentPrecompDoubleCadenceUpperPrefix' },\n prallup: { code: 'ornamentPrecompTrillSuffixDandrieu' },\n pralldown: { code: 'ornamentPrecompTrillLowerSuffix' },\n upmordent: { code: 'ornamentPrecompSlideTrillBach' },\n downmordent: { code: 'ornamentPrecompDoubleCadenceUpperPrefixTurn' },\n lineprall: { code: 'ornamentPrecompAppoggTrill' },\n prallprall: { code: 'ornamentTremblement' },\n scoop: { code: 'brassScoop' },\n doit: { code: 'brassDoitMedium' },\n fall: { code: 'brassFallLipShort' },\n doitLong: { code: 'brassLiftMedium' },\n fallLong: { code: 'brassFallRoughMedium' },\n bend: { code: 'brassBend' },\n plungerClosed: { code: 'brassMuteClosed' },\n plungerOpen: { code: 'brassMuteOpen' },\n flip: { code: 'brassFlip' },\n jazzTurn: { code: 'brassJazzTurn' },\n smear: { code: 'brassSmear' },\n};\nexport class Tables {\n /**\n * @returns the `Font` object at the head of the music font stack.\n */\n static currentMusicFont() {\n if (Tables.MUSIC_FONT_STACK.length === 0) {\n throw new RuntimeError('NoFonts', 'The font stack is empty. See: await Flow.fetchMusicFont(...); Flow.setMusicFont(...).');\n }\n else {\n return Tables.MUSIC_FONT_STACK[0];\n }\n }\n static clefProperties(clef) {\n if (!clef || !(clef in clefs))\n throw new RuntimeError('BadArgument', 'Invalid clef: ' + clef);\n return clefs[clef];\n }\n /**\n * @param keyOctaveGlyph a string in the format \"key/octave\" (e.g., \"c/5\") or \"key/octave/custom-note-head-code\" (e.g., \"g/5/t3\").\n * @param clef\n * @param params a struct with one option, `octave_shift` for clef ottavation (0 = default; 1 = 8va; -1 = 8vb, etc.).\n * @returns properties for the specified note.\n */\n // eslint-disable-next-line\n static keyProperties(keyOctaveGlyph, clef = 'treble', params) {\n let options = { octave_shift: 0 };\n if (typeof params === 'object') {\n options = Object.assign(Object.assign({}, options), params);\n }\n const pieces = keyOctaveGlyph.split('/');\n if (pieces.length < 2) {\n throw new RuntimeError('BadArguments', `First argument must be note/octave or note/octave/glyph-code: ${keyOctaveGlyph}`);\n }\n const key = pieces[0].toUpperCase();\n const value = notesInfo[key];\n if (!value)\n throw new RuntimeError('BadArguments', 'Invalid key name: ' + key);\n if (value.octave)\n pieces[1] = value.octave.toString();\n let octave = parseInt(pieces[1], 10);\n // Octave_shift is the shift to compensate for clef 8va/8vb.\n octave += -1 * options.octave_shift;\n const baseIndex = octave * 7 - 4 * 7;\n let line = (baseIndex + value.index) / 2;\n line += Tables.clefProperties(clef).line_shift;\n let stroke = 0;\n if (line <= 0 && (line * 2) % 2 === 0)\n stroke = 1; // stroke up\n if (line >= 6 && (line * 2) % 2 === 0)\n stroke = -1; // stroke down\n // Integer value for note arithmetic.\n const int_value = typeof value.int_val !== 'undefined' ? octave * 12 + value.int_val : undefined;\n // If the user specified a glyph, overwrite the glyph code.\n const code = value.code;\n const shift_right = value.shift_right;\n let customNoteHeadProps = {};\n if (pieces.length > 2 && pieces[2]) {\n const glyphName = pieces[2].toUpperCase();\n customNoteHeadProps = customNoteHeads[glyphName] || {};\n }\n return Object.assign({ key,\n octave,\n line,\n int_value, accidental: value.accidental, code,\n stroke,\n shift_right, displaced: false }, customNoteHeadProps);\n }\n static integerToNote(integer) {\n if (typeof integer === 'undefined' || integer < 0 || integer > 11) {\n throw new RuntimeError('BadArguments', `integerToNote() requires an integer in the range [0, 11]: ${integer}`);\n }\n const table = {\n 0: 'C',\n 1: 'C#',\n 2: 'D',\n 3: 'D#',\n 4: 'E',\n 5: 'F',\n 6: 'F#',\n 7: 'G',\n 8: 'G#',\n 9: 'A',\n 10: 'A#',\n 11: 'B',\n };\n const noteValue = table[integer];\n if (!noteValue) {\n throw new RuntimeError('BadArguments', `Unknown note value for integer: ${integer}`);\n }\n return noteValue;\n }\n static tabToGlyph(fret, scale = 1.0) {\n let glyph = undefined;\n let width = 0;\n let shift_y = 0;\n if (fret.toUpperCase() === 'X') {\n const glyphMetrics = new Glyph('accidentalDoubleSharp', Tables.TABLATURE_FONT_SCALE).getMetrics();\n glyph = 'accidentalDoubleSharp';\n if (glyphMetrics.width == undefined || glyphMetrics.height == undefined)\n throw new RuntimeError('InvalidMetrics', 'Width and height required');\n width = glyphMetrics.width;\n shift_y = -glyphMetrics.height / 2;\n }\n else {\n width = Tables.textWidth(fret);\n }\n return {\n text: fret,\n code: glyph,\n getWidth: () => width * scale,\n shift_y,\n };\n }\n // Used by annotation.ts and bend.ts. Clearly this implementation only works for the default font size.\n // TODO: The actual width depends on the font family, size, weight, style.\n static textWidth(text) {\n return 7 * text.toString().length;\n }\n static articulationCodes(artic) {\n return articulations[artic];\n }\n static accidentalCodes(acc) {\n return accidentals[acc];\n }\n static ornamentCodes(acc) {\n return ornaments[acc];\n }\n static keySignature(spec) {\n const keySpec = keySignatures[spec];\n if (!keySpec) {\n throw new RuntimeError('BadKeySignature', `Bad key signature spec: '${spec}'`);\n }\n if (!keySpec.acc) {\n return [];\n }\n const accidentalList = {\n b: [2, 0.5, 2.5, 1, 3, 1.5, 3.5],\n '#': [0, 1.5, -0.5, 1, 2.5, 0.5, 2],\n };\n const notes = accidentalList[keySpec.acc];\n const acc_list = [];\n for (let i = 0; i < keySpec.num; ++i) {\n const line = notes[i];\n acc_list.push({ type: keySpec.acc, line });\n }\n return acc_list;\n }\n static getKeySignatures() {\n return keySignatures;\n }\n static hasKeySignature(spec) {\n return spec in keySignatures;\n }\n /**\n * Convert duration aliases to the number based duration.\n * If the input isn't an alias, simply return the input.\n * @param duration\n * @returns Example: 'q' -> '4', '8' -> '8'\n */\n static sanitizeDuration(duration) {\n const durationNumber = durationAliases[duration];\n if (durationNumber !== undefined) {\n duration = durationNumber;\n }\n if (durations[duration] === undefined) {\n throw new RuntimeError('BadArguments', `The provided duration is not valid: ${duration}`);\n }\n return duration;\n }\n /** Convert the `duration` to a fraction. */\n static durationToFraction(duration) {\n return new Fraction().parse(Tables.sanitizeDuration(duration));\n }\n /** Convert the `duration` to a number. */\n static durationToNumber(duration) {\n return Tables.durationToFraction(duration).value();\n }\n /* Convert the `duration` to total ticks. */\n static durationToTicks(duration) {\n duration = Tables.sanitizeDuration(duration);\n const ticks = durations[duration];\n if (ticks === undefined) {\n throw new RuntimeError('InvalidDuration');\n }\n return ticks;\n }\n // Return a glyph given duration and type. The type can be a custom glyph code from customNoteHeads.\n // The default type is a regular note ('n').\n // eslint-disable-next-line\n static getGlyphProps(duration, type = 'n') {\n duration = Tables.sanitizeDuration(duration);\n // Lookup duration for default glyph head code\n const code = durationCodes[duration];\n if (code === undefined) {\n return undefined;\n }\n // Get glyph properties for 'type' from duration string (note, rest, harmonic, muted, slash)\n let glyphTypeProperties = code.type[type];\n // If this isn't a standard type, then lookup the custom note head map.\n if (glyphTypeProperties === undefined) {\n // Try and get it from the custom list of note heads\n const customGlyphTypeProperties = customNoteHeads[type.toUpperCase()];\n // If not, then return with nothing.\n if (customGlyphTypeProperties === undefined) {\n return undefined;\n }\n // Otherwise set it as the code_head value\n glyphTypeProperties = Object.assign({ code_head: customGlyphTypeProperties.code }, customGlyphTypeProperties);\n }\n const code_head = glyphTypeProperties.code_head;\n // The default implementation of getWidth() calls Glyph.getWidth(code_head, scale).\n // This can be overridden by an individual glyph type (see slash noteheads below: Tables.SLASH_NOTEHEAD_WIDTH).\n const getWidth = (scale = Tables.NOTATION_FONT_SCALE) => Glyph.getWidth(code_head, scale);\n // Merge duration props for 'duration' with the note head properties.\n return Object.assign(Object.assign(Object.assign({}, code.common), { getWidth: getWidth }), glyphTypeProperties);\n }\n}\nTables.STEM_WIDTH = 1.5;\nTables.STEM_HEIGHT = 35;\nTables.STAVE_LINE_THICKNESS = 1;\nTables.RESOLUTION = RESOLUTION;\n/**\n * Customize this by calling Flow.setMusicFont(...fontNames);\n */\nTables.MUSIC_FONT_STACK = [];\nTables.NOTATION_FONT_SCALE = 39;\nTables.TABLATURE_FONT_SCALE = 39;\nTables.SLASH_NOTEHEAD_WIDTH = 15;\nTables.STAVE_LINE_DISTANCE = 10;\n// HACK:\n// Since text origins are positioned at the baseline, we must\n// compensate for the ascender of the text. Of course, 1 staff space is\n// a very poor approximation.\n//\n// This will be deprecated in the future. This is a temporary solution until\n// we have more robust text metrics.\nTables.TEXT_HEIGHT_OFFSET_HACK = 1;\nTables.accidentalMap = accidentals;\nTables.accidentalColumnsTable = accidentalColumns;\nTables.unicode = {\n // ♯ accidental sharp\n sharp: String.fromCharCode(0x266f),\n // ♭ accidental flat\n flat: String.fromCharCode(0x266d),\n // ♮ accidental natural\n natural: String.fromCharCode(0x266e),\n // △ major seventh\n triangle: String.fromCharCode(0x25b3),\n // ø half-diminished\n 'o-with-slash': String.fromCharCode(0x00f8),\n // ° diminished\n degrees: String.fromCharCode(0x00b0),\n // ○ diminished\n circle: String.fromCharCode(0x25cb),\n};\n/* The list of valid note types. Used by note.ts during parseNoteStruct(). */\nTables.validTypes = validNoteTypes;\n// Default time signature.\nTables.TIME4_4 = {\n num_beats: 4,\n beat_value: 4,\n resolution: RESOLUTION,\n};\n// 1/2, 1, 2, 4, 8, 16, 32, 64, 128\n// NOTE: There is no 256 here! However, there are other mentions of 256 in this file.\n// For example, in durations has a 256 key, and sanitizeDuration() can return 256.\n// The sanitizeDuration() bit may need to be removed by 0xfe.\n// eslint-disable-next-line\nconst durationCodes = {\n '1/2': {\n common: {\n stem: false,\n stem_offset: 0,\n flag: false,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Breve note\n code_head: 'noteheadDoubleWhole',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDoubleWhole', scale);\n // },\n },\n h: {\n // Breve note harmonic\n code_head: 'unpitchedPercussionClef1',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('unpitchedPercussionClef1', scale);\n // },\n },\n m: {\n // Breve note muted\n code_head: 'vexNoteHeadMutedBreve',\n stem_offset: 0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('vexNoteHeadMutedBreve', scale);\n // },\n },\n r: {\n // Breve rest\n code_head: 'restDoubleWhole',\n rest: true,\n position: 'B/5',\n dot_shiftY: 0.5,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('restDoubleWhole', scale);\n // },\n },\n s: {\n // Breve note slash -\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadDoubleWhole',\n },\n },\n },\n 1: {\n common: {\n stem: false,\n stem_offset: 0,\n flag: false,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Whole note\n code_head: 'noteheadWhole',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadWhole', scale);\n // },\n },\n h: {\n // Whole note harmonic\n code_head: 'noteheadDiamondWhole',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondWhole', scale);\n // },\n },\n m: {\n // Whole note muted\n code_head: 'noteheadXWhole',\n stem_offset: -3,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXWhole', scale);\n // },\n },\n r: {\n // Whole rest\n code_head: 'restWhole',\n rest: true,\n position: 'D/5',\n dot_shiftY: 0.5,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('restWhole', scale);\n // },\n },\n s: {\n // Whole note slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadWhole',\n },\n },\n },\n 2: {\n common: {\n stem: true,\n stem_offset: 0,\n flag: false,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Half note\n code_head: 'noteheadHalf',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadHalf', scale);\n // },\n },\n h: {\n // Half note harmonic\n code_head: 'noteheadDiamondHalf',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondHalf', scale);\n // },\n },\n m: {\n // Half note muted\n code_head: 'noteheadXHalf',\n stem_offset: -3,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXHalf', scale);\n // },\n },\n r: {\n // Half rest\n code_head: 'restHalf',\n stem: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('restHalf', scale);\n // },\n },\n s: {\n // Half note slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadHalf',\n },\n },\n },\n 4: {\n common: {\n stem: true,\n stem_offset: 0,\n flag: false,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Quarter note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Quarter harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Quarter muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Quarter rest\n code_head: 'restQuarter',\n stem: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n line_above: 1.5,\n line_below: 1.5,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('restQuarter', scale);\n // },\n },\n s: {\n // Quarter slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 8: {\n common: {\n stem: true,\n stem_offset: 0,\n flag: true,\n beam_count: 1,\n stem_beam_extension: 0,\n code_flag_upstem: 'flag8thUp',\n code_flag_downstem: 'flag8thDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Eighth note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Eighth note harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Eighth note muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Eighth rest\n code_head: 'rest8th',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n line_above: 1.0,\n line_below: 1.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest8th', scale);\n // },\n },\n s: {\n // Eighth slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 16: {\n common: {\n beam_count: 2,\n stem_beam_extension: 0,\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'flag16thUp',\n code_flag_downstem: 'flag16thDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Sixteenth note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Sixteenth note harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Sixteenth note muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Sixteenth rest\n code_head: 'rest16th',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n line_above: 1.0,\n line_below: 2.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest16th', scale);\n // },\n },\n s: {\n // Sixteenth slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 32: {\n common: {\n beam_count: 3,\n stem_beam_extension: 7.5,\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'flag32ndUp',\n code_flag_downstem: 'flag32ndDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Thirty-second note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Thirty-second harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Thirty-second muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Thirty-second rest\n code_head: 'rest32nd',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -1.5,\n line_above: 2.0,\n line_below: 2.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest32nd', scale);\n // },\n },\n s: {\n // Thirty-second slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 64: {\n common: {\n beam_count: 4,\n stem_beam_extension: 15,\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'flag64thUp',\n code_flag_downstem: 'flag64thDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Sixty-fourth note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Sixty-fourth harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Sixty-fourth muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Sixty-fourth rest\n code_head: 'rest64th',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -1.5,\n line_above: 2.0,\n line_below: 3.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest64th', scale);\n // },\n },\n s: {\n // Sixty-fourth slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 128: {\n common: {\n beam_count: 5,\n stem_beam_extension: 22.5,\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'flag128thUp',\n code_flag_downstem: 'flag128thDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Hundred-twenty-eight note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Hundred-twenty-eight harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Hundred-twenty-eight muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Hundred-twenty-eight rest\n code_head: 'rest128th',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -2.5,\n line_above: 3.0,\n line_below: 3.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest128th', scale);\n // },\n },\n s: {\n // Hundred-twenty-eight slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// @author Mohit Cheppudira\n// @author Greg Ristow (modifications)\nimport { Fraction } from './fraction';\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Music } from './music';\nimport { Tables } from './tables';\nimport { Category, isAccidental, isGraceNote, isGraceNoteGroup, isStaveNote } from './typeguard';\nimport { defined, log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Accidental.DEBUG)\n log('Vex.Flow.Accidental', args);\n}\n/**\n * An `Accidental` inherits from `Modifier`, and is formatted within a\n * `ModifierContext`. Accidentals are modifiers that can be attached to\n * notes. Support is included for both western and microtonal accidentals.\n *\n * See `tests/accidental_tests.ts` for usage examples.\n */\nexport class Accidental extends Modifier {\n /**\n * Create accidental.\n * @param type value from `Vex.Flow.accidentalCodes.accidentals` table in `tables.ts`.\n * For example: `#`, `##`, `b`, `n`, etc.\n */\n constructor(type) {\n super();\n L('New accidental: ', type);\n this.type = type;\n this.position = Modifier.Position.LEFT;\n this.render_options = {\n // Font size for glyphs\n font_scale: 38,\n // Padding between accidental and parentheses on each side\n parenLeftPadding: 2,\n parenRightPadding: 2,\n };\n this.accidental = Tables.accidentalCodes(this.type);\n defined(this.accidental, 'ArgumentError', `Unknown accidental type: ${type}`);\n // Cautionary accidentals have parentheses around them\n this.cautionary = false;\n this.reset();\n }\n /** Accidentals category string. */\n static get CATEGORY() {\n return Category.Accidental;\n }\n /** Arrange accidentals inside a ModifierContext. */\n static format(accidentals, state) {\n // If there are no accidentals, no need to format their positions.\n if (!accidentals || accidentals.length === 0)\n return;\n const musicFont = Tables.currentMusicFont();\n const noteheadAccidentalPadding = musicFont.lookupMetric('accidental.noteheadAccidentalPadding');\n const leftShift = state.left_shift + noteheadAccidentalPadding;\n const accidentalSpacing = musicFont.lookupMetric('accidental.accidentalSpacing');\n const additionalPadding = musicFont.lookupMetric('accidental.leftPadding'); // padding to the left of all accidentals\n const accList = [];\n let prevNote = undefined;\n let shiftL = 0;\n // First determine the accidentals' Y positions from the note.keys\n for (let i = 0; i < accidentals.length; ++i) {\n const acc = accidentals[i];\n const note = acc.getNote();\n const stave = note.getStave();\n const index = acc.checkIndex();\n const props = note.getKeyProps()[index];\n if (note !== prevNote) {\n // Iterate through all notes to get the displaced pixels\n for (let n = 0; n < note.keys.length; ++n) {\n shiftL = Math.max(note.getLeftDisplacedHeadPx(), shiftL);\n }\n prevNote = note;\n }\n if (stave) {\n const lineSpace = stave.getSpacingBetweenLines();\n const y = stave.getYForLine(props.line);\n const accLine = Math.round((y / lineSpace) * 2) / 2;\n accList.push({ y, line: accLine, shift: shiftL, acc, lineSpace });\n }\n else {\n accList.push({ line: props.line, shift: shiftL, acc });\n }\n }\n // Sort accidentals by line number.\n accList.sort((a, b) => b.line - a.line);\n // FIXME: Confusing name. Each object in this array has a property called `line`.\n // So if this is a list of lines, you end up with: `line.line` which is very awkward.\n const lineList = [];\n // amount by which all accidentals must be shifted right or left for\n // stem flipping, notehead shifting concerns.\n let accShift = 0;\n let previousLine = undefined;\n // Create an array of unique line numbers (lineList) from accList\n for (let i = 0; i < accList.length; i++) {\n const acc = accList[i];\n // if this is the first line, or a new line, add a lineList\n if (previousLine === undefined || previousLine !== acc.line) {\n lineList.push({\n line: acc.line,\n flatLine: true,\n dblSharpLine: true,\n numAcc: 0,\n width: 0,\n column: 0,\n });\n }\n // if this accidental is not a flat, the accidental needs 3.0 lines lower\n // clearance instead of 2.5 lines for b or bb.\n // FIXME: Naming could use work. acc.acc is very awkward\n if (acc.acc.type !== 'b' && acc.acc.type !== 'bb') {\n lineList[lineList.length - 1].flatLine = false;\n }\n // if this accidental is not a double sharp, the accidental needs 3.0 lines above\n if (acc.acc.type !== '##') {\n lineList[lineList.length - 1].dblSharpLine = false;\n }\n // Track how many accidentals are on this line:\n lineList[lineList.length - 1].numAcc++;\n // Track the total x_offset needed for this line which will be needed\n // for formatting lines w/ multiple accidentals:\n // width = accidental width + universal spacing between accidentals\n lineList[lineList.length - 1].width += acc.acc.getWidth() + accidentalSpacing;\n // if this accShift is larger, use it to keep first column accidentals in the same line\n accShift = acc.shift > accShift ? acc.shift : accShift;\n previousLine = acc.line;\n }\n // ### Place Accidentals in Columns\n //\n // Default to a classic triangular layout (middle accidental farthest left),\n // but follow exceptions as outlined in G. Read's _Music Notation_ and\n // Elaine Gould's _Behind Bars_.\n //\n // Additionally, this implements different vertical collision rules for\n // flats (only need 2.5 lines clearance below) and double sharps (only\n // need 2.5 lines of clearance above or below).\n //\n // Classic layouts and exception patterns are found in the 'tables.js'\n // in 'Tables.accidentalColumnsTable'\n //\n // Beyond 6 vertical accidentals, default to the parallel ascending lines approach,\n // using as few columns as possible for the verticle structure.\n //\n // TODO (?): Allow column to be specified for an accidental at run-time?\n let totalColumns = 0;\n // establish the boundaries for a group of notes with clashing accidentals:\n for (let i = 0; i < lineList.length; i++) {\n let noFurtherConflicts = false;\n const groupStart = i;\n let groupEnd = i;\n while (groupEnd + 1 < lineList.length && !noFurtherConflicts) {\n // if this note conflicts with the next:\n if (this.checkCollision(lineList[groupEnd], lineList[groupEnd + 1])) {\n // include the next note in the group:\n groupEnd++;\n }\n else {\n noFurtherConflicts = true;\n }\n }\n // Gets an a line from the `lineList`, relative to the current group\n const getGroupLine = (index) => lineList[groupStart + index];\n const getGroupLines = (indexes) => indexes.map(getGroupLine);\n const lineDifference = (indexA, indexB) => {\n const [a, b] = getGroupLines([indexA, indexB]).map((item) => item.line);\n return a - b;\n };\n const notColliding = (...indexPairs) => indexPairs.map(getGroupLines).every(([line1, line2]) => !this.checkCollision(line1, line2));\n // Set columns for the lines in this group:\n const groupLength = groupEnd - groupStart + 1;\n // Set the accidental column for each line of the group\n let endCase = this.checkCollision(lineList[groupStart], lineList[groupEnd]) ? 'a' : 'b';\n switch (groupLength) {\n case 3:\n if (endCase === 'a' && lineDifference(1, 2) === 0.5 && lineDifference(0, 1) !== 0.5) {\n endCase = 'second_on_bottom';\n }\n break;\n case 4:\n if (notColliding([0, 2], [1, 3])) {\n endCase = 'spaced_out_tetrachord';\n }\n break;\n case 5:\n if (endCase === 'b' && notColliding([1, 3])) {\n endCase = 'spaced_out_pentachord';\n if (notColliding([0, 2], [2, 4])) {\n endCase = 'very_spaced_out_pentachord';\n }\n }\n break;\n case 6:\n if (notColliding([0, 3], [1, 4], [2, 5])) {\n endCase = 'spaced_out_hexachord';\n }\n if (notColliding([0, 2], [2, 4], [1, 3], [3, 5])) {\n endCase = 'very_spaced_out_hexachord';\n }\n break;\n default:\n break;\n }\n let groupMember;\n let column;\n // If the group contains seven members or more, use ascending parallel lines\n // of accidentals, using as few columns as possible while avoiding collisions.\n if (groupLength >= 7) {\n // First, determine how many columns to use:\n let patternLength = 2;\n let collisionDetected = true;\n while (collisionDetected === true) {\n collisionDetected = false;\n for (let line = 0; line + patternLength < lineList.length; line++) {\n if (this.checkCollision(lineList[line], lineList[line + patternLength])) {\n collisionDetected = true;\n patternLength++;\n break;\n }\n }\n }\n // Then, assign a column to each line of accidentals\n for (groupMember = i; groupMember <= groupEnd; groupMember++) {\n column = ((groupMember - i) % patternLength) + 1;\n lineList[groupMember].column = column;\n totalColumns = totalColumns > column ? totalColumns : column;\n }\n }\n else {\n // If the group contains fewer than seven members, use the layouts from\n // the Tables.accidentalColumnsTable (See: tables.ts).\n for (groupMember = i; groupMember <= groupEnd; groupMember++) {\n column = Tables.accidentalColumnsTable[groupLength][endCase][groupMember - i];\n lineList[groupMember].column = column;\n totalColumns = totalColumns > column ? totalColumns : column;\n }\n }\n // Increment i to the last note that was set, so that if a lower set of notes\n // does not conflict at all with this group, it can have its own classic shape.\n i = groupEnd;\n }\n // ### Convert Columns to x_offsets\n //\n // This keeps columns aligned, even if they have different accidentals within them\n // which sometimes results in a larger x_offset than is an accidental might need\n // to preserve the symmetry of the accidental shape.\n //\n // Neither A.C. Vinci nor G. Read address this, and it typically only happens in\n // music with complex chord clusters.\n //\n // TODO (?): Optionally allow closer compression of accidentals, instead of forcing\n // parallel columns.\n // track each column's max width, which will be used as initial shift of later columns:\n const columnWidths = [];\n const columnXOffsets = [];\n for (let i = 0; i <= totalColumns; i++) {\n columnWidths[i] = 0;\n columnXOffsets[i] = 0;\n }\n columnWidths[0] = accShift + leftShift;\n columnXOffsets[0] = accShift + leftShift;\n // Fill columnWidths with widest needed x-space;\n // this is what keeps the columns parallel.\n lineList.forEach((line) => {\n if (line.width > columnWidths[line.column])\n columnWidths[line.column] = line.width;\n });\n for (let i = 1; i < columnWidths.length; i++) {\n // this column's offset = this column's width + previous column's offset\n columnXOffsets[i] = columnWidths[i] + columnXOffsets[i - 1];\n }\n const totalShift = columnXOffsets[columnXOffsets.length - 1];\n // Set the xShift for each accidental according to column offsets:\n let accCount = 0;\n lineList.forEach((line) => {\n let lineWidth = 0;\n const lastAccOnLine = accCount + line.numAcc;\n // handle all of the accidentals on a given line:\n for (accCount; accCount < lastAccOnLine; accCount++) {\n const xShift = columnXOffsets[line.column - 1] + lineWidth;\n accList[accCount].acc.setXShift(xShift);\n // keep track of the width of accidentals we've added so far, so that when\n // we loop, we add space for them.\n lineWidth += accList[accCount].acc.getWidth() + accidentalSpacing;\n L('Line, accCount, shift: ', line.line, accCount, xShift);\n }\n });\n // update the overall layout with the full width of the accidental shapes:\n state.left_shift += totalShift + additionalPadding;\n }\n /** Helper function to determine whether two lines of accidentals collide vertically */\n static checkCollision(line1, line2) {\n let clearance = line2.line - line1.line;\n let clearanceRequired = 3;\n // But less clearance is required for certain accidentals: b, bb and ##.\n if (clearance > 0) {\n // then line 2 is on top\n clearanceRequired = line2.flatLine || line2.dblSharpLine ? 2.5 : 3.0;\n if (line1.dblSharpLine)\n clearance -= 0.5;\n }\n else {\n // line 1 is on top\n clearanceRequired = line1.flatLine || line1.dblSharpLine ? 2.5 : 3.0;\n if (line2.dblSharpLine)\n clearance -= 0.5;\n }\n const collision = Math.abs(clearance) < clearanceRequired;\n L('Line_1, Line_2, Collision: ', line1.line, line2.line, collision);\n return collision;\n }\n /**\n * Use this method to automatically apply accidentals to a set of `voices`.\n * The accidentals will be remembered between all the voices provided.\n * Optionally, you can also provide an initial `keySignature`.\n */\n static applyAccidentals(voices, keySignature) {\n const tickPositions = [];\n const tickNoteMap = {};\n // Sort the tickables in each voice by their tick position in the voice.\n voices.forEach((voice) => {\n const tickPosition = new Fraction(0, 1);\n const tickable = voice.getTickables();\n tickable.forEach((t) => {\n if (t.shouldIgnoreTicks())\n return;\n const notesAtPosition = tickNoteMap[tickPosition.value()];\n if (!notesAtPosition) {\n tickPositions.push(tickPosition.value());\n tickNoteMap[tickPosition.value()] = [t];\n }\n else {\n notesAtPosition.push(t);\n }\n tickPosition.add(t.getTicks());\n });\n });\n const music = new Music();\n // Default key signature is C major.\n if (!keySignature)\n keySignature = 'C';\n // Get the scale map, which represents the current state of each pitch.\n const scaleMapKey = music.createScaleMap(keySignature);\n const scaleMap = {};\n tickPositions.forEach((tickPos) => {\n const tickables = tickNoteMap[tickPos];\n // Array to store all pitches that modified accidental states\n // at this tick position\n const modifiedPitches = [];\n const processNote = (t) => {\n // Only StaveNote implements .addModifier(), which is used below.\n if (!isStaveNote(t) || t.isRest() || t.shouldIgnoreTicks()) {\n return;\n }\n // Go through each key and determine if an accidental should be applied.\n const staveNote = t;\n staveNote.keys.forEach((keyString, keyIndex) => {\n const key = music.getNoteParts(keyString.split('/')[0]);\n const octave = keyString.split('/')[1];\n // Force a natural for every key without an accidental\n const accidentalString = key.accidental || 'n';\n const pitch = key.root + accidentalString;\n // Determine if the current pitch has the same accidental\n // as the scale state\n if (!scaleMap[key.root + octave])\n scaleMap[key.root + octave] = scaleMapKey[key.root];\n const sameAccidental = scaleMap[key.root + octave] === pitch;\n // Determine if an identical pitch in the chord already\n // modified the accidental state\n const previouslyModified = modifiedPitches.indexOf(keyString) > -1;\n // Remove accidentals\n staveNote.getModifiers().forEach((modifier, index) => {\n if (isAccidental(modifier) && modifier.type == accidentalString && modifier.getIndex() == keyIndex) {\n staveNote.getModifiers().splice(index, 1);\n }\n });\n // Add the accidental to the StaveNote\n if (!sameAccidental || (sameAccidental && previouslyModified)) {\n // Modify the scale map so that the root pitch has an\n // updated state\n scaleMap[key.root + octave] = pitch;\n // Create the accidental\n const accidental = new Accidental(accidentalString);\n // Attach the accidental to the StaveNote\n staveNote.addModifier(accidental, keyIndex);\n // Add the pitch to list of pitches that modified accidentals\n modifiedPitches.push(keyString);\n }\n });\n // process grace notes\n staveNote.getModifiers().forEach((modifier) => {\n if (isGraceNoteGroup(modifier)) {\n modifier.getGraceNotes().forEach(processNote);\n }\n });\n };\n tickables.forEach(processNote);\n });\n }\n reset() {\n const fontScale = this.render_options.font_scale;\n this.glyph = new Glyph(this.accidental.code, fontScale);\n this.glyph.setOriginX(1.0);\n if (this.cautionary) {\n this.parenLeft = new Glyph(Tables.accidentalCodes('{').code, fontScale);\n this.parenRight = new Glyph(Tables.accidentalCodes('}').code, fontScale);\n this.parenLeft.setOriginX(1.0);\n this.parenRight.setOriginX(1.0);\n }\n }\n /** Get width in pixels. */\n getWidth() {\n if (this.cautionary) {\n const parenLeft = defined(this.parenLeft);\n const parenRight = defined(this.parenRight);\n const parenWidth = parenLeft.getMetrics().width +\n parenRight.getMetrics().width +\n this.render_options.parenLeftPadding +\n this.render_options.parenRightPadding;\n return this.glyph.getMetrics().width + parenWidth;\n }\n else {\n return this.glyph.getMetrics().width;\n }\n }\n /** Attach this accidental to `note`, which must be a `StaveNote`. */\n setNote(note) {\n defined(note, 'ArgumentError', `Bad note value: ${note}`);\n this.note = note;\n // Accidentals attached to grace notes are rendered smaller.\n if (isGraceNote(note)) {\n this.render_options.font_scale = 25;\n this.reset();\n }\n return this;\n }\n /** If called, draws parenthesis around accidental. */\n setAsCautionary() {\n this.cautionary = true;\n this.render_options.font_scale = 28;\n this.reset();\n return this;\n }\n /** Render accidental onto canvas. */\n draw() {\n const { type, position, index, cautionary, x_shift, y_shift, glyph, render_options: { parenLeftPadding, parenRightPadding }, } = this;\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n // Figure out the start `x` and `y` coordinates for note and index.\n const start = note.getModifierStartXY(position, index);\n let accX = start.x + x_shift;\n const accY = start.y + y_shift;\n L('Rendering: ', type, accX, accY);\n if (!cautionary) {\n glyph.render(ctx, accX, accY);\n }\n else {\n const parenLeft = defined(this.parenLeft);\n const parenRight = defined(this.parenRight);\n // Render the accidental in parentheses.\n parenRight.render(ctx, accX, accY);\n accX -= parenRight.getMetrics().width;\n accX -= parenRightPadding;\n accX -= this.accidental.parenRightPaddingAdjustment;\n glyph.render(ctx, accX, accY);\n accX -= glyph.getMetrics().width;\n accX -= parenLeftPadding;\n parenLeft.render(ctx, accX, accY);\n }\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Accidental.DEBUG` to `true`. */\nAccidental.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This file implements the `Stem` object. Generally this object is handled\n// by its parent `StemmableNote`.\nimport { Element } from './element';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Stem.DEBUG)\n log('Vex.Flow.Stem', args);\n}\nexport class Stem extends Element {\n constructor(options) {\n super();\n this.stem_up_y_offset = 0;\n this.stem_down_y_offset = 0;\n this.stem_up_y_base_offset = 0;\n this.stem_down_y_base_offset = 0;\n // Default notehead x bounds\n this.x_begin = (options === null || options === void 0 ? void 0 : options.x_begin) || 0;\n this.x_end = (options === null || options === void 0 ? void 0 : options.x_end) || 0;\n // Y bounds for top/bottom most notehead\n this.y_top = (options === null || options === void 0 ? void 0 : options.y_top) || 0;\n this.y_bottom = (options === null || options === void 0 ? void 0 : options.y_bottom) || 0;\n // Stem top extension\n this.stem_extension = (options === null || options === void 0 ? void 0 : options.stem_extension) || 0;\n // Direction of the stem\n this.stem_direction = (options === null || options === void 0 ? void 0 : options.stem_direction) || 0;\n // Flag to override all draw calls\n this.hide = (options === null || options === void 0 ? void 0 : options.hide) || false;\n this.isStemlet = (options === null || options === void 0 ? void 0 : options.isStemlet) || false;\n this.stemletHeight = (options === null || options === void 0 ? void 0 : options.stemletHeight) || 0;\n // Use to adjust the rendered height without affecting\n // the results of `.getExtents()`\n this.renderHeightAdjustment = 0;\n this.setOptions(options);\n }\n static get CATEGORY() {\n return Category.Stem;\n }\n // Stem directions\n static get UP() {\n return 1;\n }\n static get DOWN() {\n return -1;\n }\n // Theme\n static get WIDTH() {\n return Tables.STEM_WIDTH;\n }\n static get HEIGHT() {\n return Tables.STEM_HEIGHT;\n }\n setOptions(options) {\n // Changing where the stem meets the head\n this.stem_up_y_offset = (options === null || options === void 0 ? void 0 : options.stem_up_y_offset) || 0;\n this.stem_down_y_offset = (options === null || options === void 0 ? void 0 : options.stem_down_y_offset) || 0;\n this.stem_up_y_base_offset = (options === null || options === void 0 ? void 0 : options.stem_up_y_base_offset) || 0;\n this.stem_down_y_base_offset = (options === null || options === void 0 ? void 0 : options.stem_down_y_base_offset) || 0;\n }\n // Set the x bounds for the default notehead\n setNoteHeadXBounds(x_begin, x_end) {\n this.x_begin = x_begin;\n this.x_end = x_end;\n return this;\n }\n // Set the direction of the stem in relation to the noteheads\n setDirection(direction) {\n this.stem_direction = direction;\n }\n // Set the extension for the stem, generally for flags or beams\n setExtension(ext) {\n this.stem_extension = ext;\n }\n getExtension() {\n return this.stem_extension;\n }\n // The the y bounds for the top and bottom noteheads\n setYBounds(y_top, y_bottom) {\n this.y_top = y_top;\n this.y_bottom = y_bottom;\n }\n // Gets the entire height for the stem\n getHeight() {\n const y_offset = this.stem_direction === Stem.UP ? this.stem_up_y_offset : this.stem_down_y_offset;\n const unsigned_height = this.y_bottom - this.y_top + (Stem.HEIGHT - y_offset + this.stem_extension); // parentheses just for grouping.\n return unsigned_height * this.stem_direction;\n }\n getBoundingBox() {\n throw new RuntimeError('NotImplemented', 'getBoundingBox() not implemented.');\n }\n // Get the y coordinates for the very base of the stem to the top of\n // the extension\n getExtents() {\n const isStemUp = this.stem_direction === Stem.UP;\n const ys = [this.y_top, this.y_bottom];\n const stemHeight = Stem.HEIGHT + this.stem_extension;\n const innerMostNoteheadY = (isStemUp ? Math.min : Math.max)(...ys);\n const outerMostNoteheadY = (isStemUp ? Math.max : Math.min)(...ys);\n const stemTipY = innerMostNoteheadY + stemHeight * -this.stem_direction;\n return { topY: stemTipY, baseY: outerMostNoteheadY };\n }\n setVisibility(isVisible) {\n this.hide = !isVisible;\n return this;\n }\n setStemlet(isStemlet, stemletHeight) {\n this.isStemlet = isStemlet;\n this.stemletHeight = stemletHeight;\n return this;\n }\n adjustHeightForFlag() {\n this.renderHeightAdjustment = Tables.currentMusicFont().lookupMetric('stem.heightAdjustmentForFlag', -3);\n }\n adjustHeightForBeam() {\n this.renderHeightAdjustment = -Stem.WIDTH / 2;\n }\n // Render the stem onto the canvas\n draw() {\n this.setRendered();\n if (this.hide)\n return;\n const ctx = this.checkContext();\n let stem_x;\n let stem_y;\n const stem_direction = this.stem_direction;\n let y_base_offset = 0;\n if (stem_direction === Stem.DOWN) {\n // Down stems are rendered to the left of the head.\n stem_x = this.x_begin;\n stem_y = this.y_top + this.stem_down_y_offset;\n y_base_offset = this.stem_down_y_base_offset;\n }\n else {\n // Up stems are rendered to the right of the head.\n stem_x = this.x_end;\n stem_y = this.y_bottom - this.stem_up_y_offset;\n y_base_offset = this.stem_up_y_base_offset;\n }\n const stemHeight = this.getHeight();\n L('Rendering stem - ', 'Top Y: ', this.y_top, 'Bottom Y: ', this.y_bottom);\n // The offset from the stem's base which is required fo satisfy the stemlet height\n const stemletYOffset = this.isStemlet ? stemHeight - this.stemletHeight * this.stem_direction : 0;\n // Draw the stem\n ctx.save();\n this.applyStyle(ctx);\n ctx.beginPath();\n ctx.setLineWidth(Stem.WIDTH);\n ctx.moveTo(stem_x, stem_y - stemletYOffset + y_base_offset);\n ctx.lineTo(stem_x, stem_y - stemHeight - this.renderHeightAdjustment * stem_direction);\n ctx.stroke();\n this.restoreStyle(ctx);\n ctx.restore();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Stem.DEBUG` to `true`. */\nStem.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font, FontStyle, FontWeight } from './font';\nimport { log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (TextFormatter.DEBUG)\n log('Vex.Flow.TextFormatter', args);\n}\n/**\n * Text widths are stored in a cache, so we don't have to recompute widths\n * for the same font + string combination.\n *\n * The cache is first keyed by the font information. The key is of the form:\n * `${family}-${size}-${weight}-${style}`\n * The second level key is the specific text to be measured.\n *\n * The stored value is the measured width in `em` units.\n * textWidth == textWidthCache[cacheKey][textToMeasure]\n */\nconst textWidthCache = {};\n/**\n * Applications may register additional fonts via `TextFormatter.registerInfo(info)`.\n * The metrics for those fonts will be made available to the application.\n */\nconst registry = {};\nexport class TextFormatter {\n /**\n * Use `TextFormatter.create(...)` to build an instance from information previously\n * registered via `TextFormatter.registerInfo(info)`.\n */\n constructor(formatterInfo) {\n /** Font family. */\n this.family = '';\n /** Specified in `pt` units. */\n this.size = 14;\n /** Font metrics are extracted at 1000 upem (units per em). */\n this.resolution = 1000;\n /**\n * For text formatting, we do not require glyph outlines, but instead rely on glyph\n * bounding box metrics such as:\n * ```\n * {\n * x_min: 48,\n * x_max: 235,\n * y_min: -17,\n * y_max: 734,\n * ha: 751,\n * leftSideBearing: 48,\n * advanceWidth: 286,\n * }\n * ```\n */\n this.glyphs = {};\n this.serifs = false;\n this.monospaced = false;\n this.italic = false;\n this.bold = false;\n this.superscriptOffset = 0;\n this.subscriptOffset = 0;\n this.maxSizeGlyph = 'H';\n // This is an internal key used to index the `textWidthCache`.\n this.cacheKey = '';\n this.updateParams(formatterInfo);\n }\n /**\n * Return all registered font families.\n */\n static getFontFamilies() {\n const registeredFonts = [];\n for (const fontFamily in registry) {\n const formatterInfo = registry[fontFamily];\n registeredFonts.push(Object.assign({}, formatterInfo));\n }\n return registeredFonts;\n }\n /**\n * Call `TextFormatter.registerInfo(info)` to register font information before using this method.\n *\n * This method creates a formatter for the font that most closely matches the requested font.\n * We compare font family, bold, and italic attributes.\n * This method will return a fallback formatter if there are no matches.\n */\n static create(requestedFont = {}) {\n L('create: ', requestedFont);\n if (!requestedFont.family) {\n requestedFont.family = Font.SANS_SERIF;\n }\n // TODO: One potential (small) optimization is to cache the TextFormatter object\n // returned for each font info. We would probably want to clear the cache if\n // the registry is ever updated.\n const candidates = [];\n // The incoming font family is a string of comma-separated font family names.\n // (e.g., `PetalumaScript, Arial, sans-serif`).\n const requestedFamilies = requestedFont.family.split(/\\s*,\\s*/);\n for (const requestedFamily of requestedFamilies) {\n for (const fontFamily in registry) {\n // Support cases where the registry contains 'Roboto Slab Medium',\n // but the requestedFont.family is 'Roboto Slab'.\n if (fontFamily.startsWith(requestedFamily)) {\n candidates.push(registry[fontFamily]);\n }\n }\n if (candidates.length > 0) {\n break;\n }\n }\n let formatter;\n if (candidates.length === 0) {\n // No match, so return a fallback text formatter.\n formatter = new TextFormatter(Object.values(registry)[0]);\n }\n else if (candidates.length === 1) {\n formatter = new TextFormatter(candidates[0]);\n }\n else {\n const bold = Font.isBold(requestedFont.weight);\n const italic = Font.isItalic(requestedFont.style);\n const perfectMatch = candidates.find((f) => f.bold === bold && f.italic === italic);\n if (perfectMatch) {\n formatter = new TextFormatter(perfectMatch);\n }\n else {\n const partialMatch = candidates.find((f) => f.italic === italic || f.bold === bold);\n if (partialMatch) {\n formatter = new TextFormatter(partialMatch);\n }\n else {\n formatter = new TextFormatter(candidates[0]);\n }\n }\n }\n const fontSize = requestedFont.size;\n if (typeof fontSize !== 'undefined') {\n const fontSizeInPt = Font.convertSizeToPointValue(fontSize);\n formatter.setFontSize(fontSizeInPt);\n }\n return formatter;\n }\n /**\n * @param fontFamily used as a key to the font registry.\n * @returns the same info object that was passed in via `TextFormatter.registerInfo(info)`\n */\n static getInfo(fontFamily) {\n return registry[fontFamily];\n }\n /**\n * Apps may register their own fonts and metrics, and those metrics\n * will be available to the app for formatting.\n *\n * Metrics can be generated from a font file using fontgen_text.js in the tools/fonts directory.\n * @param info\n * @param overwrite\n */\n static registerInfo(info, overwrite = false) {\n L('registerInfo: ', info, overwrite);\n const fontFamily = info.family;\n const currFontInfo = registry[fontFamily];\n if (currFontInfo === undefined || overwrite) {\n registry[fontFamily] = info;\n }\n }\n updateParams(params) {\n if (params.family)\n this.family = params.family;\n if (params.resolution)\n this.resolution = params.resolution;\n if (params.glyphs)\n this.glyphs = params.glyphs;\n if (params.serifs)\n this.serifs = params.serifs;\n if (params.monospaced)\n this.monospaced = params.monospaced;\n if (params.italic)\n this.italic = params.italic;\n if (params.bold)\n this.bold = params.bold;\n if (params.maxSizeGlyph)\n this.maxSizeGlyph = params.maxSizeGlyph;\n if (params.superscriptOffset)\n this.superscriptOffset = params.superscriptOffset;\n if (params.subscriptOffset)\n this.subscriptOffset = params.subscriptOffset;\n this.updateCacheKey();\n }\n /** Create a hash with the current font data, so we can cache computed widths. */\n updateCacheKey() {\n const family = this.family.replace(/\\s+/g, '_');\n const size = this.size;\n const weight = this.bold ? FontWeight.BOLD : FontWeight.NORMAL;\n const style = this.italic ? FontStyle.ITALIC : FontStyle.NORMAL;\n // Use the same key format as SVGContext.\n this.cacheKey = `${family}%${size}%${weight}%${style}`;\n }\n /**\n * The glyphs table is indexed by the character (e.g., 'C', '@').\n * See: robotoslab_glyphs.ts & petalumascript_glyphs.ts.\n */\n getGlyphMetrics(character) {\n if (this.glyphs[character]) {\n return this.glyphs[character];\n }\n else {\n return this.glyphs[this.maxSizeGlyph];\n }\n }\n get maxHeight() {\n const metrics = this.getGlyphMetrics(this.maxSizeGlyph);\n return (metrics.ha / this.resolution) * this.fontSizeInPixels;\n }\n /**\n * Retrieve the character's advanceWidth as a fraction of an `em` unit.\n * For the space character ' ' as defined in the:\n * petalumascript_glyphs.ts: 250 advanceWidth in the 1000 unitsPerEm font returns 0.25.\n * robotoslab_glyphs.ts: 509 advanceWidth in the 2048 unitsPerEm font returns 0.2485.\n */\n getWidthForCharacterInEm(c) {\n var _a;\n const metrics = this.getGlyphMetrics(c);\n if (!metrics) {\n // An arbitrary number, close to the `em` width of the '#' and '5' characters in PetalumaScript.\n return 0.65;\n }\n else {\n const advanceWidth = (_a = metrics.advanceWidth) !== null && _a !== void 0 ? _a : 0;\n return advanceWidth / this.resolution;\n }\n }\n /**\n * Retrieve the total width of `text` in `em` units.\n */\n getWidthForTextInEm(text) {\n const key = this.cacheKey;\n // Get the cache for this specific font family, size, weight, style combination.\n // The cache contains previously computed widths for different `text` strings.\n let cachedWidths = textWidthCache[key];\n if (cachedWidths === undefined) {\n cachedWidths = {};\n textWidthCache[key] = cachedWidths;\n }\n let width = cachedWidths[text];\n if (width === undefined) {\n width = 0;\n for (let i = 0; i < text.length; ++i) {\n width += this.getWidthForCharacterInEm(text[i]);\n }\n cachedWidths[text] = width;\n }\n return width;\n }\n /** The width of the text (in `em`) is scaled by the font size (in `px`). */\n getWidthForTextInPx(text) {\n return this.getWidthForTextInEm(text) * this.fontSizeInPixels;\n }\n /**\n * @param size in pt.\n */\n setFontSize(size) {\n this.size = size;\n // The width cache key depends on the current font size.\n this.updateCacheKey();\n return this;\n }\n /** `this.size` is specified in points. Convert to pixels. */\n get fontSizeInPixels() {\n return this.size * Font.scaleToPxFrom.pt;\n }\n getResolution() {\n return this.resolution;\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.TextFormatter.DEBUG` to `true`. */\nTextFormatter.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { TextFormatter } from './textformatter';\nimport { Category, isStemmableNote, isTabNote } from './typeguard';\nimport { log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Annotation.DEBUG)\n log('Vex.Flow.Annotation', args);\n}\nexport var AnnotationHorizontalJustify;\n(function (AnnotationHorizontalJustify) {\n AnnotationHorizontalJustify[AnnotationHorizontalJustify[\"LEFT\"] = 1] = \"LEFT\";\n AnnotationHorizontalJustify[AnnotationHorizontalJustify[\"CENTER\"] = 2] = \"CENTER\";\n AnnotationHorizontalJustify[AnnotationHorizontalJustify[\"RIGHT\"] = 3] = \"RIGHT\";\n AnnotationHorizontalJustify[AnnotationHorizontalJustify[\"CENTER_STEM\"] = 4] = \"CENTER_STEM\";\n})(AnnotationHorizontalJustify || (AnnotationHorizontalJustify = {}));\nexport var AnnotationVerticalJustify;\n(function (AnnotationVerticalJustify) {\n AnnotationVerticalJustify[AnnotationVerticalJustify[\"TOP\"] = 1] = \"TOP\";\n AnnotationVerticalJustify[AnnotationVerticalJustify[\"CENTER\"] = 2] = \"CENTER\";\n AnnotationVerticalJustify[AnnotationVerticalJustify[\"BOTTOM\"] = 3] = \"BOTTOM\";\n AnnotationVerticalJustify[AnnotationVerticalJustify[\"CENTER_STEM\"] = 4] = \"CENTER_STEM\";\n})(AnnotationVerticalJustify || (AnnotationVerticalJustify = {}));\n/**\n * Annotations are modifiers that can be attached to\n * notes.\n *\n * See `tests/annotation_tests.ts` for usage examples.\n */\nexport class Annotation extends Modifier {\n /**\n * Annotations inherit from `Modifier` and is positioned correctly when\n * in a `ModifierContext`.\n * Create a new `Annotation` with the string `text`.\n */\n constructor(text) {\n super();\n this.text = text;\n this.horizontalJustification = AnnotationHorizontalJustify.CENTER;\n // warning: the default in the constructor is TOP, but in the factory the default is BOTTOM.\n // this is to support legacy application that may expect this.\n this.verticalJustification = AnnotationVerticalJustify.TOP;\n this.resetFont();\n // The default width is calculated from the text.\n this.setWidth(Tables.textWidth(text));\n }\n /** Annotations category string. */\n static get CATEGORY() {\n return Category.Annotation;\n }\n /** Arrange annotations within a `ModifierContext` */\n static format(annotations, state) {\n if (!annotations || annotations.length === 0)\n return false;\n let width = 0;\n for (let i = 0; i < annotations.length; ++i) {\n const annotation = annotations[i];\n const textFormatter = TextFormatter.create(annotation.textFont);\n // Text height is expressed in fractional stave spaces.\n const textLines = (5 + textFormatter.maxHeight) / Tables.STAVE_LINE_DISTANCE;\n let verticalSpaceNeeded = textLines;\n const note = annotation.checkAttachedNote();\n const stave = note.getStave();\n const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP;\n let stemHeight = 0;\n let lines = 5;\n if (isTabNote(note)) {\n if (note.render_options.draw_stem) {\n const stem = note.getStem();\n if (stem) {\n stemHeight = Math.abs(stem.getHeight()) / Tables.STAVE_LINE_DISTANCE;\n }\n }\n else {\n stemHeight = 0;\n }\n }\n else if (isStemmableNote(note)) {\n const stem = note.getStem();\n if (stem && note.getNoteType() === 'n') {\n stemHeight = Math.abs(stem.getHeight()) / Tables.STAVE_LINE_DISTANCE;\n }\n }\n if (stave) {\n lines = stave.getNumLines();\n }\n // Get the text width from the font metrics.\n const textWidth = textFormatter.getWidthForTextInPx(annotation.text);\n width = Math.max(width, textWidth);\n if (annotation.verticalJustification === this.VerticalJustify.TOP) {\n let noteLine = note.getLineNumber(true);\n if (isTabNote(note)) {\n noteLine = lines - (note.leastString() - 0.5);\n }\n if (stemDirection === Stem.UP) {\n noteLine += stemHeight;\n }\n const curTop = noteLine + state.top_text_line + 0.5;\n if (curTop < lines) {\n annotation.setTextLine(lines - noteLine);\n verticalSpaceNeeded += lines - noteLine;\n state.top_text_line = verticalSpaceNeeded;\n }\n else {\n annotation.setTextLine(state.top_text_line);\n state.top_text_line += verticalSpaceNeeded;\n }\n }\n else if (annotation.verticalJustification === this.VerticalJustify.BOTTOM) {\n let noteLine = lines - note.getLineNumber();\n if (isTabNote(note)) {\n noteLine = note.greatestString() - 1;\n }\n if (stemDirection === Stem.DOWN) {\n noteLine += stemHeight;\n }\n const curBottom = noteLine + state.text_line + 1;\n if (curBottom < lines) {\n annotation.setTextLine(lines - curBottom);\n verticalSpaceNeeded += lines - curBottom;\n state.text_line = verticalSpaceNeeded;\n }\n else {\n annotation.setTextLine(state.text_line);\n state.text_line += verticalSpaceNeeded;\n }\n }\n else {\n annotation.setTextLine(state.text_line);\n }\n }\n state.left_shift += width / 2;\n state.right_shift += width / 2;\n return true;\n }\n /**\n * Set vertical position of text (above or below stave).\n * @param just value in `AnnotationVerticalJustify`.\n */\n setVerticalJustification(just) {\n this.verticalJustification = typeof just === 'string' ? Annotation.VerticalJustifyString[just] : just;\n return this;\n }\n /**\n * Get horizontal justification.\n */\n getJustification() {\n return this.horizontalJustification;\n }\n /**\n * Set horizontal justification.\n * @param justification value in `Annotation.Justify`.\n */\n setJustification(just) {\n this.horizontalJustification = typeof just === 'string' ? Annotation.HorizontalJustifyString[just] : just;\n return this;\n }\n /** Render text beside the note. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP;\n const textFormatter = TextFormatter.create(this.textFont);\n const start = note.getModifierStartXY(ModifierPosition.ABOVE, this.index);\n this.setRendered();\n // We're changing context parameters. Save current state.\n ctx.save();\n const classString = Object.keys(this.getAttribute('classes')).join(' ');\n ctx.openGroup(classString, this.getAttribute('id'));\n ctx.setFont(this.textFont);\n const text_width = ctx.measureText(this.text).width;\n const text_height = textFormatter.maxHeight + 2;\n let x;\n let y;\n if (this.horizontalJustification === AnnotationHorizontalJustify.LEFT) {\n x = start.x;\n }\n else if (this.horizontalJustification === AnnotationHorizontalJustify.RIGHT) {\n x = start.x - text_width;\n }\n else if (this.horizontalJustification === AnnotationHorizontalJustify.CENTER) {\n x = start.x - text_width / 2;\n } /* CENTER_STEM */\n else {\n x = note.getStemX() - text_width / 2;\n }\n let stem_ext = {};\n let spacing = 0;\n const has_stem = note.hasStem();\n const stave = note.checkStave();\n // The position of the text varies based on whether or not the note\n // has a stem.\n if (has_stem) {\n stem_ext = note.checkStem().getExtents();\n spacing = stave.getSpacingBetweenLines();\n }\n if (this.verticalJustification === AnnotationVerticalJustify.BOTTOM) {\n // Use the largest (lowest) Y value\n const ys = note.getYs();\n y = ys.reduce((a, b) => (a > b ? a : b));\n y += (this.text_line + 1) * Tables.STAVE_LINE_DISTANCE + text_height;\n if (has_stem && stemDirection === Stem.DOWN) {\n y = Math.max(y, stem_ext.topY + text_height + spacing * this.text_line);\n }\n }\n else if (this.verticalJustification === AnnotationVerticalJustify.CENTER) {\n const yt = note.getYForTopText(this.text_line) - 1;\n const yb = stave.getYForBottomText(this.text_line);\n y = yt + (yb - yt) / 2 + text_height / 2;\n }\n else if (this.verticalJustification === AnnotationVerticalJustify.TOP) {\n y = note.getYs()[0] - (this.text_line + 1) * Tables.STAVE_LINE_DISTANCE;\n if (has_stem && stemDirection === Stem.UP) {\n // If the stem is above the stave already, go with default line width vs. actual\n // since the lines between don't really matter.\n spacing = stem_ext.topY < stave.getTopLineTopY() ? Tables.STAVE_LINE_DISTANCE : spacing;\n y = Math.min(y, stem_ext.topY - spacing * (this.text_line + 1));\n }\n } /* CENTER_STEM */\n else {\n const extents = note.getStemExtents();\n y = extents.topY + (extents.baseY - extents.topY) / 2 + text_height / 2;\n }\n L('Rendering annotation: ', this.text, x, y);\n ctx.fillText(this.text, x, y);\n ctx.closeGroup();\n ctx.restore();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Annotation.DEBUG` to `true`. */\nAnnotation.DEBUG = false;\nAnnotation.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n/** Text annotations can be positioned and justified relative to the note. */\nAnnotation.HorizontalJustify = AnnotationHorizontalJustify;\nAnnotation.HorizontalJustifyString = {\n left: AnnotationHorizontalJustify.LEFT,\n right: AnnotationHorizontalJustify.RIGHT,\n center: AnnotationHorizontalJustify.CENTER,\n centerStem: AnnotationHorizontalJustify.CENTER_STEM,\n};\nAnnotation.VerticalJustify = AnnotationVerticalJustify;\nAnnotation.VerticalJustifyString = {\n above: AnnotationVerticalJustify.TOP,\n top: AnnotationVerticalJustify.TOP,\n below: AnnotationVerticalJustify.BOTTOM,\n bottom: AnnotationVerticalJustify.BOTTOM,\n center: AnnotationVerticalJustify.CENTER,\n centerStem: AnnotationVerticalJustify.CENTER_STEM,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Larry Kuhns.\n// MIT License\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category, isGraceNote, isStaveNote, isStemmableNote, isTabNote } from './typeguard';\nimport { defined, log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Articulation.DEBUG)\n log('Vex.Flow.Articulation', args);\n}\nconst { ABOVE, BELOW } = Modifier.Position;\nfunction roundToNearestHalf(mathFn, value) {\n return mathFn(value / 0.5) * 0.5;\n}\n// This includes both staff and ledger lines\nfunction isWithinLines(line, position) {\n return position === ABOVE ? line <= 5 : line >= 1;\n}\nfunction getRoundingFunction(line, position) {\n if (isWithinLines(line, position)) {\n if (position === ABOVE) {\n return Math.ceil;\n }\n else {\n return Math.floor;\n }\n }\n else {\n return Math.round;\n }\n}\nfunction snapLineToStaff(canSitBetweenLines, line, position, offsetDirection) {\n // Initially, snap to nearest staff line or space\n const snappedLine = roundToNearestHalf(getRoundingFunction(line, position), line);\n const canSnapToStaffSpace = canSitBetweenLines && isWithinLines(snappedLine, position);\n const onStaffLine = snappedLine % 1 === 0;\n if (canSnapToStaffSpace && onStaffLine) {\n const HALF_STAFF_SPACE = 0.5;\n return snappedLine + HALF_STAFF_SPACE * -offsetDirection;\n }\n else {\n return snappedLine;\n }\n}\n// Helper function for checking if a Note object is either a StaveNote or a GraceNote.\nconst isStaveOrGraceNote = (note) => isStaveNote(note) || isGraceNote(note);\nfunction getTopY(note, textLine) {\n const stemDirection = note.getStemDirection();\n const { topY: stemTipY, baseY: stemBaseY } = note.getStemExtents();\n if (isStaveOrGraceNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return stemTipY;\n }\n else {\n return stemBaseY;\n }\n }\n else {\n return Math.min(...note.getYs());\n }\n }\n else if (isTabNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return stemTipY;\n }\n else {\n return note.checkStave().getYForTopText(textLine);\n }\n }\n else {\n return note.checkStave().getYForTopText(textLine);\n }\n }\n else {\n throw new RuntimeError('UnknownCategory', 'Only can get the top and bottom ys of stavenotes and tabnotes');\n }\n}\nfunction getBottomY(note, textLine) {\n const stemDirection = note.getStemDirection();\n const { topY: stemTipY, baseY: stemBaseY } = note.getStemExtents();\n if (isStaveOrGraceNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return stemBaseY;\n }\n else {\n return stemTipY;\n }\n }\n else {\n return Math.max(...note.getYs());\n }\n }\n else if (isTabNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return note.checkStave().getYForBottomText(textLine);\n }\n else {\n return stemTipY;\n }\n }\n else {\n return note.checkStave().getYForBottomText(textLine);\n }\n }\n else {\n throw new RuntimeError('UnknownCategory', 'Only can get the top and bottom ys of stavenotes and tabnotes');\n }\n}\n/**\n * Get the initial offset of the articulation from the y value of the starting position.\n * This is required because the top/bottom text positions already have spacing applied to\n * provide a \"visually pleasant\" default position. However the y values provided from\n * the stavenote's top/bottom do *not* have any pre-applied spacing. This function\n * normalizes this asymmetry.\n * @param note\n * @param position\n * @returns\n */\nfunction getInitialOffset(note, position) {\n const isOnStemTip = (position === ABOVE && note.getStemDirection() === Stem.UP) ||\n (position === BELOW && note.getStemDirection() === Stem.DOWN);\n if (isStaveOrGraceNote(note)) {\n if (note.hasStem() && isOnStemTip) {\n return 0.5;\n }\n else {\n // this amount is larger than the stem-tip offset because we start from\n // the center of the notehead\n return 1;\n }\n }\n else {\n if (note.hasStem() && isOnStemTip) {\n return 1;\n }\n else {\n return 0;\n }\n }\n}\n/**\n * Articulations and Accents are modifiers that can be\n * attached to notes. The complete list of articulations is available in\n * `tables.ts` under `Vex.Flow.articulationCodes`.\n *\n * See `tests/articulation_tests.ts` for usage examples.\n */\nexport class Articulation extends Modifier {\n /**\n * Create a new articulation.\n * @param type entry in `Vex.Flow.articulationCodes` in `tables.ts`\n */\n constructor(type) {\n super();\n this.type = type;\n this.position = BELOW;\n this.render_options = {\n font_scale: 38,\n };\n this.reset();\n }\n /** Articulations category string. */\n static get CATEGORY() {\n return Category.Articulation;\n }\n /**\n * FIXME:\n * Most of the complex formatting logic (ie: snapping to space) is\n * actually done in .render(). But that logic belongs in this method.\n *\n * Unfortunately, this isn't possible because, by this point, stem lengths\n * have not yet been finalized. Finalized stem lengths are required to determine the\n * initial position of any stem-side articulation.\n *\n * This indicates that all objects should have their stave set before being\n * formatted. It can't be an optional if you want accurate vertical positioning.\n * Consistently positioned articulations that play nice with other modifiers\n * won't be possible until we stop relying on render-time formatting.\n *\n * Ideally, when this function has completed, the vertical articulation positions\n * should be ready to render without further adjustment. But the current state\n * is far from this ideal.\n */\n static format(articulations, state) {\n if (!articulations || articulations.length === 0)\n return false;\n const margin = 0.5;\n const getIncrement = (articulation, line, position) => roundToNearestHalf(getRoundingFunction(line, position), defined(articulation.glyph.getMetrics().height) / 10 + margin);\n articulations.forEach((articulation) => {\n const note = articulation.checkAttachedNote();\n let lines = 5;\n const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP;\n let stemHeight = 0;\n // Decide if we need to consider beam direction in placement.\n if (isStemmableNote(note)) {\n const stem = note.getStem();\n if (stem) {\n stemHeight = Math.abs(stem.getHeight()) / Tables.STAVE_LINE_DISTANCE;\n }\n }\n const stave = note.getStave();\n if (stave) {\n lines = stave.getNumLines();\n }\n if (articulation.getPosition() === ABOVE) {\n let noteLine = note.getLineNumber(true);\n if (stemDirection === Stem.UP) {\n noteLine += stemHeight;\n }\n let increment = getIncrement(articulation, state.top_text_line, ABOVE);\n const curTop = noteLine + state.top_text_line + 0.5;\n // If articulation must be above stave, add lines between note and stave top\n if (!articulation.articulation.between_lines && curTop < lines) {\n increment += lines - curTop;\n }\n articulation.setTextLine(state.top_text_line);\n state.top_text_line += increment;\n }\n else if (articulation.getPosition() === BELOW) {\n let noteLine = Math.max(lines - note.getLineNumber(), 0);\n if (stemDirection === Stem.DOWN) {\n noteLine += stemHeight;\n }\n let increment = getIncrement(articulation, state.text_line, BELOW);\n const curBottom = noteLine + state.text_line + 0.5;\n // if articulation must be below stave, add lines from note to stave bottom\n if (!articulation.articulation.between_lines && curBottom < lines) {\n increment += lines - curBottom;\n }\n articulation.setTextLine(state.text_line);\n state.text_line += increment;\n }\n });\n const width = articulations\n .map((articulation) => articulation.getWidth())\n .reduce((maxWidth, articWidth) => Math.max(articWidth, maxWidth));\n state.left_shift += width / 2;\n state.right_shift += width / 2;\n return true;\n }\n static easyScoreHook({ articulations }, note, builder) {\n if (!articulations)\n return;\n const articNameToCode = {\n staccato: 'a.',\n tenuto: 'a-',\n accent: 'a>',\n };\n articulations\n .split(',')\n .map((articString) => articString.trim().split('.'))\n .map(([name, position]) => {\n const artic = { type: articNameToCode[name] };\n if (position)\n artic.position = Modifier.PositionString[position];\n return builder.getFactory().Articulation(artic);\n })\n .map((artic) => note.addModifier(artic, 0));\n }\n reset() {\n this.articulation = Tables.articulationCodes(this.type);\n const articulation = defined(this.articulation, 'ArgumentError', `Articulation not found: ${this.type}`);\n const code = (this.position === ABOVE ? articulation.aboveCode : articulation.belowCode) || articulation.code;\n this.glyph = new Glyph(code !== null && code !== void 0 ? code : '', this.render_options.font_scale);\n this.setWidth(defined(this.glyph.getMetrics().width));\n }\n /** Render articulation in position next to note. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const index = this.checkIndex();\n const { position, glyph, text_line: textLine } = this;\n const canSitBetweenLines = this.articulation.between_lines;\n const stave = note.checkStave();\n const staffSpace = stave.getSpacingBetweenLines();\n const isTab = isTabNote(note);\n // Articulations are centered over/under the note head.\n const { x } = note.getModifierStartXY(position, index);\n const shouldSitOutsideStaff = !canSitBetweenLines || isTab;\n const initialOffset = getInitialOffset(note, position);\n const padding = Tables.currentMusicFont().lookupMetric(`articulation.${glyph.getCode()}.padding`, 0);\n let y = {\n [ABOVE]: () => {\n glyph.setOrigin(0.5, 1);\n const y = getTopY(note, textLine) - (textLine + initialOffset) * staffSpace;\n return shouldSitOutsideStaff ? Math.min(stave.getYForTopText(Articulation.INITIAL_OFFSET), y) : y;\n },\n [BELOW]: () => {\n glyph.setOrigin(0.5, 0);\n const y = getBottomY(note, textLine) + (textLine + initialOffset) * staffSpace;\n return shouldSitOutsideStaff ? Math.max(stave.getYForBottomText(Articulation.INITIAL_OFFSET), y) : y;\n },\n }[position]();\n if (!isTab) {\n const offsetDirection = position === ABOVE ? -1 : +1;\n const noteLine = note.getKeyProps()[index].line;\n const distanceFromNote = (note.getYs()[index] - y) / staffSpace;\n const articLine = distanceFromNote + Number(noteLine);\n const snappedLine = snapLineToStaff(canSitBetweenLines, articLine, position, offsetDirection);\n if (isWithinLines(snappedLine, position))\n glyph.setOrigin(0.5, 0.5);\n y += Math.abs(snappedLine - articLine) * staffSpace * offsetDirection + padding * offsetDirection;\n }\n L(`Rendering articulation at (x: ${x}, y: ${y})`);\n glyph.render(ctx, x, y);\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Articulation.DEBUG` to `true`. */\nArticulation.DEBUG = false;\nArticulation.INITIAL_OFFSET = -0.5;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2021.\n// MIT License\nimport { Category } from './typeguard';\nexport class RenderContext {\n static get CATEGORY() {\n return Category.RenderContext;\n }\n set font(f) {\n this.setFont(f);\n }\n get font() {\n return this.getFont();\n }\n /**\n * This is kept for backwards compatibility with 3.0.9.\n * @deprecated use `setFont(...)` instead since it now supports CSS font shorthand.\n */\n setRawFont(f) {\n this.setFont(f);\n return this;\n }\n}\n/**\n * Draw a tiny dot marker on the specified context. A great debugging aid.\n * @param ctx context\n * @param x dot x coordinate\n * @param y dot y coordinate\n * @param color\n */\nexport function drawDot(ctx, x, y, color = '#F55') {\n ctx.save();\n ctx.setFillStyle(color);\n // draw a circle\n ctx.beginPath();\n ctx.arc(x, y, 3, 0, Math.PI * 2, true);\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Fraction } from './fraction';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\n/**\n * Tickable represents a element that sit on a score and\n * has a duration, i.e., Tickables occupy space in the musical rendering dimension.\n */\nexport class Tickable extends Element {\n constructor() {\n super();\n this._preFormatted = false;\n this._postFormatted = false;\n // These properties represent the duration of\n // this tickable element.\n this.ticks = new Fraction(0, 1); // Fractional value of ticks\n this.intrinsicTicks = 0; // Floating point value of ticks\n this.tickMultiplier = new Fraction(1, 1);\n // Formatter metrics\n this.width = 0;\n this.x_shift = 0; // Shift from tick context\n this.modifiers = [];\n this.tupletStack = [];\n this.align_center = false;\n this.center_x_shift = 0; // Shift from tick context if center aligned\n // This flag tells the formatter to ignore this tickable during\n // formatting and justification. It is set by tickables such as BarNote.\n this.ignore_ticks = false;\n // This is a space for an external formatting class or function to maintain\n // metrics.\n this.formatterMetrics = {\n // The freedom of a tickable is the distance it can move without colliding\n // with neighboring elements. A formatter can set these values during its\n // formatting pass, which a different formatter can then use to fine tune.\n freedom: { left: 0, right: 0 },\n // The simplified rational duration of this tick as a string. It can be\n // used as an index to a map or hashtable.\n duration: '',\n // The number of formatting iterations undergone.\n iterations: 0,\n // The space in pixels allocated by this formatter, along with the mean space\n // for tickables of this duration, and the deviation from the mean.\n space: {\n used: 0,\n mean: 0,\n deviation: 0,\n },\n };\n }\n static get CATEGORY() {\n return Category.Tickable;\n }\n /** Reset the Tickable, this function will be overloaded. */\n reset() {\n return this;\n }\n /** Return the ticks. */\n getTicks() {\n return this.ticks;\n }\n /** Check if it ignores the ticks. */\n shouldIgnoreTicks() {\n return this.ignore_ticks;\n }\n /** Ignore the ticks. */\n setIgnoreTicks(flag) {\n this.ignore_ticks = flag;\n return this;\n }\n /** Set width of note. Used by the formatter for positioning. */\n setWidth(width) {\n this.width = width;\n }\n /** Get width of note. Used by the formatter for positioning. */\n getWidth() {\n if (!this._preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call GetWidth on an unformatted note.\");\n }\n return this.width + (this.modifierContext ? this.modifierContext.getWidth() : 0);\n }\n /** Displace note by `x` pixels. Used by the formatter. */\n setXShift(x) {\n this.x_shift = x;\n return this;\n }\n /** Get the `x` displaced pixels of the note. */\n getXShift() {\n return this.x_shift;\n }\n /** Get `x` position of this tick context. */\n getX() {\n const tickContext = this.checkTickContext(`Can't getX() without a TickContext.`);\n return tickContext.getX() + this.x_shift;\n }\n /** Return the formatterMetrics. */\n getFormatterMetrics() {\n return this.formatterMetrics;\n }\n /** Return the center `x` shift. */\n getCenterXShift() {\n if (this.isCenterAligned()) {\n return this.center_x_shift;\n }\n return 0;\n }\n /** Set the center `x` shift. */\n setCenterXShift(centerXShift) {\n this.center_x_shift = centerXShift;\n return this;\n }\n // Check if tickable is center aligned. */\n isCenterAligned() {\n return this.align_center;\n }\n // Set/unset center alignment. */\n setCenterAlignment(align_center) {\n this.align_center = align_center;\n return this;\n }\n /**\n * Return the associated voice. Every tickable must be associated with a voice.\n * This allows formatters and preFormatter to associate them with the right modifierContexts.\n */\n getVoice() {\n return defined(this.voice, 'NoVoice', 'Tickable has no voice.');\n }\n /** Set the associated voice. */\n setVoice(voice) {\n this.voice = voice;\n }\n /** Get the tuplet. */\n getTuplet() {\n return this.tuplet;\n }\n /** Return the intrinsic ticks. */\n getTupletStack() {\n return this.tupletStack;\n }\n /**\n * Reset the specific Tuplet if this is not provided, all tuplets are reset.\n * Remove any prior tuplets from the tick calculation and\n * reset the intrinsic tick value.\n */\n resetTuplet(tuplet) {\n let noteCount;\n let notesOccupied;\n if (tuplet) {\n const i = this.tupletStack.indexOf(tuplet);\n if (i !== -1) {\n this.tupletStack.splice(i, 1);\n noteCount = tuplet.getNoteCount();\n notesOccupied = tuplet.getNotesOccupied();\n // Revert old multiplier by inverting numerator & denom.:\n this.applyTickMultiplier(noteCount, notesOccupied);\n }\n return this;\n }\n while (this.tupletStack.length) {\n tuplet = this.tupletStack.pop();\n noteCount = tuplet.getNoteCount();\n notesOccupied = tuplet.getNotesOccupied();\n // Revert old multiplier by inverting numerator & denom.:\n this.applyTickMultiplier(noteCount, notesOccupied);\n }\n return this;\n }\n /** Attach to new tuplet. */\n setTuplet(tuplet) {\n if (tuplet) {\n this.tupletStack.push(tuplet);\n const noteCount = tuplet.getNoteCount();\n const notesOccupied = tuplet.getNotesOccupied();\n this.applyTickMultiplier(notesOccupied, noteCount);\n }\n this.tuplet = tuplet;\n return this;\n }\n /**\n * Add self to the provided ModifierContext `mc`.\n * If this tickable has modifiers, set modifierContext.\n * @returns this\n */\n addToModifierContext(mc) {\n this.modifierContext = mc;\n for (let i = 0; i < this.modifiers.length; ++i) {\n this.modifierContext.addMember(this.modifiers[i]);\n }\n this.modifierContext.addMember(this);\n this._preFormatted = false;\n return this;\n }\n /**\n * Optional, if tickable has modifiers, associate a Modifier.\n * @param mod the modifier\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n addModifier(modifier, index = 0) {\n this.modifiers.push(modifier);\n this._preFormatted = false;\n return this;\n }\n /** Get the list of associated modifiers. */\n getModifiers() {\n return this.modifiers;\n }\n /** Set the Tick Context. */\n setTickContext(tc) {\n this.tickContext = tc;\n this._preFormatted = false;\n }\n checkTickContext(message = 'Tickable has no tick context.') {\n return defined(this.tickContext, 'NoTickContext', message);\n }\n /** Preformat the Tickable. */\n preFormat() {\n if (this._preFormatted)\n return;\n this.width = 0;\n if (this.modifierContext) {\n this.modifierContext.preFormat();\n this.width += this.modifierContext.getWidth();\n }\n }\n /** Set preformatted status. */\n set preFormatted(value) {\n this._preFormatted = value;\n }\n get preFormatted() {\n return this._preFormatted;\n }\n /** Postformat the Tickable. */\n postFormat() {\n if (this._postFormatted)\n return this;\n this._postFormatted = true;\n return this;\n }\n /** Set postformatted status. */\n set postFormatted(value) {\n this._postFormatted = value;\n }\n get postFormatted() {\n return this._postFormatted;\n }\n /** Return the intrinsic ticks. */\n getIntrinsicTicks() {\n return this.intrinsicTicks;\n }\n /** Set the intrinsic ticks. */\n setIntrinsicTicks(intrinsicTicks) {\n this.intrinsicTicks = intrinsicTicks;\n this.ticks = this.tickMultiplier.clone().multiply(this.intrinsicTicks);\n }\n /** Get the tick multiplier. */\n getTickMultiplier() {\n return this.tickMultiplier;\n }\n /** Apply a tick multiplier. */\n applyTickMultiplier(numerator, denominator) {\n this.tickMultiplier.multiply(numerator, denominator);\n this.ticks = this.tickMultiplier.clone().multiply(this.intrinsicTicks);\n }\n /** Set the duration. */\n setDuration(duration) {\n const ticks = duration.numerator * (Tables.RESOLUTION / duration.denominator);\n this.ticks = this.tickMultiplier.clone().multiply(ticks);\n this.intrinsicTicks = this.ticks.value();\n }\n getAbsoluteX() {\n const tickContext = this.checkTickContext(`Can't getAbsoluteX() without a TickContext.`);\n return tickContext.getX();\n }\n /** Attach this note to a modifier context. */\n setModifierContext(mc) {\n this.modifierContext = mc;\n return this;\n }\n /** Get `ModifierContext`. */\n getModifierContext() {\n return this.modifierContext;\n }\n /** Check and get `ModifierContext`. */\n checkModifierContext() {\n return defined(this.modifierContext, 'NoModifierContext', 'No modifier context attached to this tickable.');\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from './font';\nimport { drawDot } from './rendercontext';\nimport { Tables } from './tables';\nimport { Tickable } from './tickable';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\n/**\n * Note implements an abstract interface for notes and chords that\n * are rendered on a stave. Notes have some common properties: All of them\n * have a value (e.g., pitch, fret, etc.) and a duration (quarter, half, etc.)\n *\n * Some notes have stems, heads, dots, etc. Most notational elements that\n * surround a note are called *modifiers*, and every note has an associated\n * array of them. All notes also have a rendering context and belong to a stave.\n */\nexport class Note extends Tickable {\n /**\n * Every note is a tickable, i.e., it can be mutated by the `Formatter` class for\n * positioning and layout.\n *\n * @param noteStruct To create a new note you need to provide a `noteStruct`.\n */\n constructor(noteStruct) {\n super();\n if (!noteStruct) {\n throw new RuntimeError('BadArguments', 'Note must have valid initialization data to identify duration and type.');\n }\n /** Parses `noteStruct` and get note properties. */\n const parsedNoteStruct = Note.parseNoteStruct(noteStruct);\n if (!parsedNoteStruct) {\n throw new RuntimeError('BadArguments', `Invalid note initialization object: ${JSON.stringify(noteStruct)}`);\n }\n // Set note properties from parameters.\n this.keys = noteStruct.keys || [];\n // per-pitch properties\n this.keyProps = [];\n this.duration = parsedNoteStruct.duration;\n this.noteType = parsedNoteStruct.type;\n this.customTypes = parsedNoteStruct.customTypes;\n if (noteStruct.duration_override) {\n // Custom duration\n this.setDuration(noteStruct.duration_override);\n }\n else {\n // Default duration\n this.setIntrinsicTicks(parsedNoteStruct.ticks);\n }\n this.modifiers = [];\n // Get the glyph code for this note from the font.\n this.glyph = Tables.getGlyphProps(this.duration, this.noteType);\n this.customGlyphs = this.customTypes.map((t) => Tables.getGlyphProps(this.duration, t));\n // Note to play for audio players.\n this.playNote = undefined;\n // Positioning contexts used by the Formatter.\n this.ignore_ticks = false;\n // Positioning variables\n this.width = 0; // Width in pixels calculated after preFormat\n this.leftDisplacedHeadPx = 0; // Extra room on left for displaced note head\n this.rightDisplacedHeadPx = 0; // Extra room on right for displaced note head\n this.x_shift = 0; // X shift from tick context X\n this.ys = []; // list of y coordinates for each note\n // we need to hold on to these for ties and beams.\n if (noteStruct.align_center) {\n this.setCenterAlignment(noteStruct.align_center);\n }\n // The render surface.\n this.render_options = {\n annotation_spacing: 5,\n glyph_font_scale: 1,\n stroke_px: 1,\n scale: 1,\n font: '',\n y_shift: 0,\n };\n }\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // STATIC MEMBERS\n static get CATEGORY() {\n return Category.Note;\n }\n /** Debug helper. Displays various note metrics for the given note. */\n static plotMetrics(ctx, note, yPos) {\n const metrics = note.getMetrics();\n const xStart = note.getAbsoluteX() - metrics.modLeftPx - metrics.leftDisplacedHeadPx;\n const xPre1 = note.getAbsoluteX() - metrics.leftDisplacedHeadPx;\n const xAbs = note.getAbsoluteX();\n const xPost1 = note.getAbsoluteX() + metrics.notePx;\n const xPost2 = note.getAbsoluteX() + metrics.notePx + metrics.rightDisplacedHeadPx;\n const xEnd = note.getAbsoluteX() + metrics.notePx + metrics.rightDisplacedHeadPx + metrics.modRightPx;\n const xFreedomRight = xEnd + (note.getFormatterMetrics().freedom.right || 0);\n const xWidth = xEnd - xStart;\n ctx.save();\n ctx.setFont(Font.SANS_SERIF, 8);\n ctx.fillText(Math.round(xWidth) + 'px', xStart + note.getXShift(), yPos);\n const y = yPos + 7;\n function stroke(x1, x2, color, yy = y) {\n ctx.beginPath();\n ctx.setStrokeStyle(color);\n ctx.setFillStyle(color);\n ctx.setLineWidth(3);\n ctx.moveTo(x1 + note.getXShift(), yy);\n ctx.lineTo(x2 + note.getXShift(), yy);\n ctx.stroke();\n }\n stroke(xStart, xPre1, 'red');\n stroke(xPre1, xAbs, '#999');\n stroke(xAbs, xPost1, 'green');\n stroke(xPost1, xPost2, '#999');\n stroke(xPost2, xEnd, 'red');\n stroke(xEnd, xFreedomRight, '#DD0');\n stroke(xStart - note.getXShift(), xStart, '#BBB'); // Shift\n drawDot(ctx, xAbs + note.getXShift(), y, 'blue');\n const formatterMetrics = note.getFormatterMetrics();\n if (formatterMetrics.iterations > 0) {\n const spaceDeviation = formatterMetrics.space.deviation;\n const prefix = spaceDeviation >= 0 ? '+' : '';\n ctx.setFillStyle('red');\n ctx.fillText(prefix + Math.round(spaceDeviation), xAbs + note.getXShift(), yPos - 10);\n }\n ctx.restore();\n }\n static parseDuration(durationString) {\n if (!durationString) {\n return undefined;\n }\n const regexp = /(\\d*\\/?\\d+|[a-z])(d*)([nrhms]|$)/;\n const result = regexp.exec(durationString);\n if (!result) {\n return undefined;\n }\n const duration = result[1];\n const dots = result[2].length;\n const type = result[3] || 'n';\n return { duration, dots, type };\n }\n static parseNoteStruct(noteStruct) {\n // Preserve backwards-compatibility\n const durationProps = Note.parseDuration(noteStruct.duration);\n if (!durationProps) {\n return undefined;\n }\n // If specified type is invalid, return undefined.\n let type = noteStruct.type;\n if (type && !Tables.validTypes[type]) {\n return undefined;\n }\n // If no type specified, check duration or custom types\n const customTypes = [];\n if (!type) {\n type = durationProps.type || 'n';\n // If we have keys, try and check if we've got a custom glyph\n if (noteStruct.keys !== undefined) {\n noteStruct.keys.forEach((k, i) => {\n const result = k.split('/');\n // We have a custom glyph specified after the note eg. /X2\n customTypes[i] = (result && result.length === 3 ? result[2] : type);\n });\n }\n }\n // Calculate the tick duration of the note\n let ticks = Tables.durationToTicks(durationProps.duration);\n if (!ticks) {\n return undefined;\n }\n // Are there any dots?\n const dots = noteStruct.dots ? noteStruct.dots : durationProps.dots;\n if (typeof dots !== 'number') {\n return undefined;\n }\n // Add ticks as necessary depending on the numbr of dots\n let currentTicks = ticks;\n for (let i = 0; i < dots; i++) {\n if (currentTicks <= 1)\n return undefined;\n currentTicks = currentTicks / 2;\n ticks += currentTicks;\n }\n return {\n duration: durationProps.duration,\n type,\n customTypes,\n dots,\n ticks,\n };\n }\n /**\n * Get the play note, which is arbitrary data that can be used by an\n * audio player.\n */\n getPlayNote() {\n return this.playNote;\n }\n /**\n * Set the play note, which is arbitrary data that can be used by an\n * audio player.\n */\n setPlayNote(note) {\n this.playNote = note;\n return this;\n }\n /**\n * @returns true if this note is a type of rest.\n *\n * Rests don't have pitches, but take up space in the score.\n * Subclasses should override this default implementation.\n */\n isRest() {\n return false;\n }\n /** Add stroke. */\n addStroke(index, stroke) {\n stroke.setNote(this);\n stroke.setIndex(index);\n this.modifiers.push(stroke);\n this.preFormatted = false;\n return this;\n }\n /** Get the target stave. */\n getStave() {\n return this.stave;\n }\n /** Check and get the target stave. */\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n /** Set the target stave. */\n setStave(stave) {\n this.stave = stave;\n this.setYs([stave.getYForLine(0)]); // Update Y values if the stave is changed.\n this.setContext(this.stave.getContext());\n return this;\n }\n /** Get spacing to the left of the notes. */\n getLeftDisplacedHeadPx() {\n return this.leftDisplacedHeadPx;\n }\n /** Get spacing to the right of the notes. */\n getRightDisplacedHeadPx() {\n return this.rightDisplacedHeadPx;\n }\n /** Set spacing to the left of the notes. */\n setLeftDisplacedHeadPx(x) {\n this.leftDisplacedHeadPx = x;\n return this;\n }\n /** Set spacing to the right of the notes. */\n setRightDisplacedHeadPx(x) {\n this.rightDisplacedHeadPx = x;\n return this;\n }\n /** True if this note has no duration (e.g., bar notes, spacers, etc.). */\n shouldIgnoreTicks() {\n return this.ignore_ticks;\n }\n /** Get the stave line number for the note. */\n // eslint-disable-next-line\n getLineNumber(isTopNote) {\n return 0;\n }\n /** Get the stave line number for rest. */\n getLineForRest() {\n return 0;\n }\n /** Get the glyph associated with this note. */\n // eslint-disable-next-line\n getGlyph() {\n return this.glyph;\n }\n /** Get the glyph width. */\n getGlyphWidth() {\n // TODO: FIXME (multiple potential values for this.glyph)\n if (this.glyph) {\n if (this.glyph.getMetrics) {\n return this.glyph.getMetrics().width;\n }\n else if (this.glyph.getWidth) {\n return this.glyph.getWidth(this.render_options.glyph_font_scale);\n }\n }\n return 0;\n }\n /**\n * Set Y positions for this note. Each Y value is associated with\n * an individual pitch/key within the note/chord.\n */\n setYs(ys) {\n this.ys = ys;\n return this;\n }\n /**\n * Get Y positions for this note. Each Y value is associated with\n * an individual pitch/key within the note/chord.\n */\n getYs() {\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', 'No Y-values calculated for this note.');\n }\n return this.ys;\n }\n /**\n * Get the Y position of the space above the stave onto which text can\n * be rendered.\n */\n getYForTopText(text_line) {\n return this.checkStave().getYForTopText(text_line);\n }\n /** Return the voice that this note belongs in. */\n getVoice() {\n if (!this.voice)\n throw new RuntimeError('NoVoice', 'Note has no voice.');\n return this.voice;\n }\n /** Attach this note to `voice`. */\n setVoice(voice) {\n this.voice = voice;\n this.preFormatted = false;\n return this;\n }\n /** Get the `TickContext` for this note. */\n getTickContext() {\n return this.checkTickContext();\n }\n /** Set the `TickContext` for this note. */\n setTickContext(tc) {\n this.tickContext = tc;\n this.preFormatted = false;\n return this;\n }\n /** Accessor to duration. */\n getDuration() {\n return this.duration;\n }\n /** Accessor to isDotted. */\n isDotted() {\n return this.getModifiersByType('Dot').length > 0;\n }\n /** Accessor to hasStem. */\n hasStem() {\n return false;\n }\n /** Accessor to note type. */\n getNoteType() {\n return this.noteType;\n }\n /** Get the beam. */\n getBeam() {\n return this.beam;\n }\n /** Check and get the beam. */\n checkBeam() {\n return defined(this.beam, 'NoBeam', 'No beam attached to instance');\n }\n /** Check it has a beam. */\n hasBeam() {\n return this.beam != undefined;\n }\n /** Set the beam. */\n setBeam(beam) {\n this.beam = beam;\n return this;\n }\n /**\n * Attach a modifier to this note.\n * @param modifier the Modifier to add.\n * @param index of the key to modify.\n * @returns this\n */\n addModifier(modifier, index = 0) {\n const signature = 'Note.addModifier(modifier: Modifier, index: number=0)';\n // Backwards compatibility with 3.0.9.\n if (typeof index === 'string') {\n index = parseInt(index);\n // eslint-disable-next-line\n console.warn(signature + ' expected a number for `index`, but received a string.');\n }\n // Some versions of VexFlow had the two parameters reversed.\n // Check here and throw an error if the argument types are not correct.\n if (typeof modifier !== 'object' || typeof index !== 'number') {\n throw new RuntimeError('WrongParams', 'Incorrect call signature. Use ' + signature + ' instead.');\n }\n modifier.setNote(this);\n modifier.setIndex(index);\n super.addModifier(modifier);\n return this;\n }\n // Get all modifiers of a specific type in the `ModifierContext`\n getModifiersByType(type) {\n return this.checkModifierContext().getMembers(type);\n }\n /** Get the coordinates for where modifiers begin. */\n // eslint-disable-next-line\n getModifierStartXY(position, index, options) {\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call GetModifierStartXY on an unformatted note\");\n }\n return {\n x: this.getAbsoluteX(),\n y: this.ys[0],\n };\n }\n getRightParenthesisPx(index) {\n const props = this.getKeyProps()[index];\n return props.displaced ? this.getRightDisplacedHeadPx() : 0;\n }\n getLeftParenthesisPx(index) {\n const props = this.getKeyProps()[index];\n return props.displaced ? this.getLeftDisplacedHeadPx() : 0;\n }\n getFirstDotPx() {\n let px = this.getRightDisplacedHeadPx();\n if (this.checkModifierContext().getMembers('Parenthesis').length !== 0)\n px += Tables.currentMusicFont().lookupMetric('parenthesis.default.width');\n return px;\n }\n /** Get the metrics for this note. */\n getMetrics() {\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call getMetrics on an unformatted note.\");\n }\n const modLeftPx = this.modifierContext ? this.modifierContext.getState().left_shift : 0;\n const modRightPx = this.modifierContext ? this.modifierContext.getState().right_shift : 0;\n const width = this.getWidth();\n const glyphWidth = this.getGlyphWidth();\n const notePx = width -\n modLeftPx - // subtract left modifiers\n modRightPx - // subtract right modifiers\n this.leftDisplacedHeadPx - // subtract left displaced head\n this.rightDisplacedHeadPx; // subtract right displaced head\n // NOTE: If you change this, remember to update MockTickable.getMetrics() in the tests/ directory.\n return {\n width,\n glyphWidth,\n notePx,\n // Modifier spacing.\n modLeftPx,\n modRightPx,\n // Displaced note head on left or right.\n leftDisplacedHeadPx: this.leftDisplacedHeadPx,\n rightDisplacedHeadPx: this.rightDisplacedHeadPx,\n glyphPx: 0,\n };\n }\n /**\n * Get the absolute `X` position of this note's tick context. This\n * excludes x_shift, so you'll need to factor it in if you're\n * looking for the post-formatted x-position.\n */\n getAbsoluteX() {\n const tickContext = this.checkTickContext(`Can't getAbsoluteX() without a TickContext.`);\n // Position note to left edge of tick context.\n let x = tickContext.getX();\n if (this.stave) {\n x += this.stave.getNoteStartX() + Tables.currentMusicFont().lookupMetric('stave.padding');\n }\n if (this.isCenterAligned()) {\n x += this.getCenterXShift();\n }\n return x;\n }\n /** Get the direction of the stem. */\n getStemDirection() {\n throw new RuntimeError('NoStem', 'No stem attached to this note.');\n }\n /** Get the top and bottom `y` values of the stem. */\n getStemExtents() {\n throw new RuntimeError('NoStem', 'No stem attached to this note.');\n }\n /** Get the `x` coordinate to the right of the note. */\n getTieRightX() {\n let tieStartX = this.getAbsoluteX();\n const note_glyph_width = this.glyph.getWidth();\n tieStartX += note_glyph_width / 2;\n tieStartX += -this.width / 2 + this.width + 2;\n return tieStartX;\n }\n /** Get the `x` coordinate to the left of the note. */\n getTieLeftX() {\n let tieEndX = this.getAbsoluteX();\n const note_glyph_width = this.glyph.getWidth();\n tieEndX += note_glyph_width / 2;\n tieEndX -= this.width / 2 + 2;\n return tieEndX;\n }\n // Get the pitches in the note\n getKeys() {\n return this.keys;\n }\n // Get the properties for all the keys in the note\n getKeyProps() {\n return this.keyProps;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// A base class for stave modifiers (e.g. clefs, key signatures)\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { defined } from './util';\nexport var StaveModifierPosition;\n(function (StaveModifierPosition) {\n StaveModifierPosition[StaveModifierPosition[\"CENTER\"] = 0] = \"CENTER\";\n StaveModifierPosition[StaveModifierPosition[\"LEFT\"] = 1] = \"LEFT\";\n StaveModifierPosition[StaveModifierPosition[\"RIGHT\"] = 2] = \"RIGHT\";\n StaveModifierPosition[StaveModifierPosition[\"ABOVE\"] = 3] = \"ABOVE\";\n StaveModifierPosition[StaveModifierPosition[\"BELOW\"] = 4] = \"BELOW\";\n StaveModifierPosition[StaveModifierPosition[\"BEGIN\"] = 5] = \"BEGIN\";\n StaveModifierPosition[StaveModifierPosition[\"END\"] = 6] = \"END\";\n})(StaveModifierPosition || (StaveModifierPosition = {}));\nexport class StaveModifier extends Element {\n constructor() {\n super();\n this.width = 0;\n this.x = 0;\n this.padding = 10;\n this.position = StaveModifierPosition.ABOVE;\n }\n static get CATEGORY() {\n return Category.StaveModifier;\n }\n static get Position() {\n return StaveModifierPosition;\n }\n getPosition() {\n return this.position;\n }\n setPosition(position) {\n this.position = position;\n return this;\n }\n getStave() {\n return this.stave;\n }\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n setStave(stave) {\n this.stave = stave;\n return this;\n }\n getWidth() {\n return this.width;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n getX() {\n return this.x;\n }\n setX(x) {\n this.x = x;\n return this;\n }\n placeGlyphOnLine(glyph, stave, line, customShift = 0) {\n glyph.setYShift(stave.getYForLine(line !== null && line !== void 0 ? line : 0) - stave.getYForGlyphs() + customShift);\n }\n getPadding(index) {\n return index !== undefined && index < 2 ? 0 : this.padding;\n }\n setPadding(padding) {\n this.padding = padding;\n return this;\n }\n setLayoutMetrics(layoutMetrics) {\n this.layoutMetrics = layoutMetrics;\n return this;\n }\n getLayoutMetrics() {\n return this.layoutMetrics;\n }\n // eslint-disable-next-line\n draw(...args) {\n // DO NOTHING.\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// Author Larry Kuhns 2011\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nexport var BarlineType;\n(function (BarlineType) {\n BarlineType[BarlineType[\"SINGLE\"] = 1] = \"SINGLE\";\n BarlineType[BarlineType[\"DOUBLE\"] = 2] = \"DOUBLE\";\n BarlineType[BarlineType[\"END\"] = 3] = \"END\";\n BarlineType[BarlineType[\"REPEAT_BEGIN\"] = 4] = \"REPEAT_BEGIN\";\n BarlineType[BarlineType[\"REPEAT_END\"] = 5] = \"REPEAT_END\";\n BarlineType[BarlineType[\"REPEAT_BOTH\"] = 6] = \"REPEAT_BOTH\";\n BarlineType[BarlineType[\"NONE\"] = 7] = \"NONE\";\n})(BarlineType || (BarlineType = {}));\nexport class Barline extends StaveModifier {\n constructor(type) {\n super();\n this.thickness = Tables.STAVE_LINE_THICKNESS;\n const TYPE = BarlineType;\n this.widths = {};\n this.widths[TYPE.SINGLE] = 5;\n this.widths[TYPE.DOUBLE] = 5;\n this.widths[TYPE.END] = 5;\n this.widths[TYPE.REPEAT_BEGIN] = 5;\n this.widths[TYPE.REPEAT_END] = 5;\n this.widths[TYPE.REPEAT_BOTH] = 5;\n this.widths[TYPE.NONE] = 5;\n this.paddings = {};\n this.paddings[TYPE.SINGLE] = 0;\n this.paddings[TYPE.DOUBLE] = 0;\n this.paddings[TYPE.END] = 0;\n this.paddings[TYPE.REPEAT_BEGIN] = 15;\n this.paddings[TYPE.REPEAT_END] = 15;\n this.paddings[TYPE.REPEAT_BOTH] = 15;\n this.paddings[TYPE.NONE] = 0;\n this.layoutMetricsMap = {};\n this.layoutMetricsMap[TYPE.SINGLE] = {\n xMin: 0,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.DOUBLE] = {\n xMin: -3,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.END] = {\n xMin: -5,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.REPEAT_END] = {\n xMin: -10,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.REPEAT_BEGIN] = {\n xMin: -2,\n xMax: 10,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.REPEAT_BOTH] = {\n xMin: -10,\n xMax: 10,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.NONE] = {\n xMin: 0,\n xMax: 0,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.setPosition(StaveModifierPosition.BEGIN);\n this.setType(type);\n }\n static get CATEGORY() {\n return Category.Barline;\n }\n static get type() {\n return BarlineType;\n }\n static get typeString() {\n return {\n single: BarlineType.SINGLE,\n double: BarlineType.DOUBLE,\n end: BarlineType.END,\n repeatBegin: BarlineType.REPEAT_BEGIN,\n repeatEnd: BarlineType.REPEAT_END,\n repeatBoth: BarlineType.REPEAT_BOTH,\n none: BarlineType.NONE,\n };\n }\n getType() {\n return this.type;\n }\n setType(type) {\n this.type = typeof type === 'string' ? Barline.typeString[type] : type;\n this.setWidth(this.widths[this.type]);\n this.setPadding(this.paddings[this.type]);\n this.setLayoutMetrics(this.layoutMetricsMap[this.type]);\n return this;\n }\n // Draw barlines\n draw(stave) {\n stave.checkContext();\n this.setRendered();\n switch (this.type) {\n case BarlineType.SINGLE:\n this.drawVerticalBar(stave, this.x, false);\n break;\n case BarlineType.DOUBLE:\n this.drawVerticalBar(stave, this.x, true);\n break;\n case BarlineType.END:\n this.drawVerticalEndBar(stave, this.x);\n break;\n case BarlineType.REPEAT_BEGIN:\n // If the barline is shifted over (in front of clef/time/key)\n // Draw vertical bar at the beginning.\n this.drawRepeatBar(stave, this.x, true);\n if (stave.getX() !== this.x) {\n this.drawVerticalBar(stave, stave.getX());\n }\n break;\n case BarlineType.REPEAT_END:\n this.drawRepeatBar(stave, this.x, false);\n break;\n case BarlineType.REPEAT_BOTH:\n this.drawRepeatBar(stave, this.x, false);\n this.drawRepeatBar(stave, this.x, true);\n break;\n default:\n // Default is NONE, so nothing to draw\n break;\n }\n }\n drawVerticalBar(stave, x, double_bar) {\n const staveCtx = stave.checkContext();\n const topY = stave.getTopLineTopY();\n const botY = stave.getBottomLineBottomY();\n if (double_bar) {\n staveCtx.fillRect(x - 3, topY, 1, botY - topY);\n }\n staveCtx.fillRect(x, topY, 1, botY - topY);\n }\n drawVerticalEndBar(stave, x) {\n const staveCtx = stave.checkContext();\n const topY = stave.getTopLineTopY();\n const botY = stave.getBottomLineBottomY();\n staveCtx.fillRect(x - 5, topY, 1, botY - topY);\n staveCtx.fillRect(x - 2, topY, 3, botY - topY);\n }\n drawRepeatBar(stave, x, begin) {\n const staveCtx = stave.checkContext();\n const topY = stave.getTopLineTopY();\n const botY = stave.getBottomLineBottomY();\n let x_shift = 3;\n if (!begin) {\n x_shift = -5;\n }\n staveCtx.fillRect(x + x_shift, topY, 1, botY - topY);\n staveCtx.fillRect(x - 2, topY, 3, botY - topY);\n const dot_radius = 2;\n // Shift dots left or right\n if (begin) {\n x_shift += 4;\n }\n else {\n x_shift -= 4;\n }\n const dot_x = x + x_shift + dot_radius / 2;\n // calculate the y offset based on number of stave lines\n let y_offset = (stave.getNumLines() - 1) * stave.getSpacingBetweenLines();\n y_offset = y_offset / 2 - stave.getSpacingBetweenLines() / 2;\n let dot_y = topY + y_offset + dot_radius / 2;\n // draw the top repeat dot\n staveCtx.beginPath();\n staveCtx.arc(dot_x, dot_y, dot_radius, 0, Math.PI * 2, false);\n staveCtx.fill();\n // draw the bottom repeat dot\n dot_y += stave.getSpacingBetweenLines();\n staveCtx.beginPath();\n staveCtx.arc(dot_x, dot_y, dot_radius, 0, Math.PI * 2, false);\n staveCtx.fill();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// Author: Aaron (@AaronDavidNewman)\n//\n// This implements chord symbols above/below a chord.\n// Chord symbols are modifiers that can be attached to notes.\n// They can contain multiple 'blocks' which represent text or\n// glyphs with various positioning options.\n//\n// See `tests/chordsymbol_tests.ts` for usage examples.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Tables } from './tables';\nimport { TextFormatter } from './textformatter';\nimport { Category } from './typeguard';\nimport { log } from './util';\n// To enable logging for this class. Set `Vex.Flow.ChordSymbol.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (ChordSymbol.DEBUG)\n log('Vex.Flow.ChordSymbol', args);\n}\nexport var ChordSymbolHorizontalJustify;\n(function (ChordSymbolHorizontalJustify) {\n ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify[\"LEFT\"] = 1] = \"LEFT\";\n ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify[\"CENTER\"] = 2] = \"CENTER\";\n ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify[\"RIGHT\"] = 3] = \"RIGHT\";\n ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify[\"CENTER_STEM\"] = 4] = \"CENTER_STEM\";\n})(ChordSymbolHorizontalJustify || (ChordSymbolHorizontalJustify = {}));\nexport var ChordSymbolVerticalJustify;\n(function (ChordSymbolVerticalJustify) {\n ChordSymbolVerticalJustify[ChordSymbolVerticalJustify[\"TOP\"] = 1] = \"TOP\";\n ChordSymbolVerticalJustify[ChordSymbolVerticalJustify[\"BOTTOM\"] = 2] = \"BOTTOM\";\n})(ChordSymbolVerticalJustify || (ChordSymbolVerticalJustify = {}));\nexport var SymbolTypes;\n(function (SymbolTypes) {\n SymbolTypes[SymbolTypes[\"GLYPH\"] = 1] = \"GLYPH\";\n SymbolTypes[SymbolTypes[\"TEXT\"] = 2] = \"TEXT\";\n SymbolTypes[SymbolTypes[\"LINE\"] = 3] = \"LINE\";\n})(SymbolTypes || (SymbolTypes = {}));\nexport var SymbolModifiers;\n(function (SymbolModifiers) {\n SymbolModifiers[SymbolModifiers[\"NONE\"] = 1] = \"NONE\";\n SymbolModifiers[SymbolModifiers[\"SUBSCRIPT\"] = 2] = \"SUBSCRIPT\";\n SymbolModifiers[SymbolModifiers[\"SUPERSCRIPT\"] = 3] = \"SUPERSCRIPT\";\n})(SymbolModifiers || (SymbolModifiers = {}));\n/**\n * ChordSymbol is a modifier that creates a chord symbol above/below a chord.\n * As a modifier, it is attached to an existing note.\n */\nexport class ChordSymbol extends Modifier {\n constructor() {\n super();\n this.symbolBlocks = [];\n this.horizontal = ChordSymbolHorizontalJustify.LEFT;\n this.vertical = ChordSymbolVerticalJustify.TOP;\n this.useKerning = true;\n this.reportWidth = true;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.ChordSymbol;\n }\n static get superSubRatio() {\n return ChordSymbol.metrics.global.superSubRatio;\n }\n /** Currently unused: Globally turn off text formatting, if the built-in formatting does not work for your font. */\n static set NO_TEXT_FORMAT(val) {\n ChordSymbol.noFormat = val;\n }\n static get NO_TEXT_FORMAT() {\n return ChordSymbol.noFormat;\n }\n // eslint-disable-next-line\n static getMetricForGlyph(glyphCode) {\n if (ChordSymbol.metrics[glyphCode]) {\n return ChordSymbol.metrics[glyphCode];\n }\n return undefined;\n }\n static get engravingFontResolution() {\n return Tables.currentMusicFont().getResolution();\n }\n static get spacingBetweenBlocks() {\n return ChordSymbol.metrics.global.spacing / ChordSymbol.engravingFontResolution;\n }\n static getWidthForGlyph(glyph) {\n const metric = ChordSymbol.getMetricForGlyph(glyph.code);\n if (!metric) {\n return 0.65; // probably should do something here.\n }\n return metric.advanceWidth / ChordSymbol.engravingFontResolution;\n }\n static getYShiftForGlyph(glyph) {\n const metric = ChordSymbol.getMetricForGlyph(glyph.code);\n if (!metric) {\n return 0;\n }\n return metric.yOffset / ChordSymbol.engravingFontResolution;\n }\n static getXShiftForGlyph(glyph) {\n const metric = ChordSymbol.getMetricForGlyph(glyph.code);\n if (!metric) {\n return 0;\n }\n return (-1 * metric.leftSideBearing) / ChordSymbol.engravingFontResolution;\n }\n static get superscriptOffset() {\n return ChordSymbol.metrics.global.superscriptOffset / ChordSymbol.engravingFontResolution;\n }\n static get subscriptOffset() {\n return ChordSymbol.metrics.global.subscriptOffset / ChordSymbol.engravingFontResolution;\n }\n static get kerningOffset() {\n return ChordSymbol.metrics.global.kerningOffset / ChordSymbol.engravingFontResolution;\n }\n // eslint-disable-next-line\n static get metrics() {\n return Tables.currentMusicFont().getMetrics().glyphs.chordSymbol;\n }\n static get lowerKerningText() {\n // For example, see: `bravura_metrics.ts`\n // BravuraMetrics.glyphs.chordSymbol.global.lowerKerningText, which returns an array of letters.\n // ['D', 'F', 'P', 'T', 'V', 'Y']\n return ChordSymbol.metrics.global.lowerKerningText;\n }\n static get upperKerningText() {\n return ChordSymbol.metrics.global.upperKerningText;\n }\n static isSuperscript(block) {\n return block.symbolModifier !== undefined && block.symbolModifier === SymbolModifiers.SUPERSCRIPT;\n }\n static isSubscript(block) {\n return block.symbolModifier !== undefined && block.symbolModifier === SymbolModifiers.SUBSCRIPT;\n }\n /**\n * Estimate the width of the whole chord symbol, based on the sum of the widths of the individual blocks.\n * Estimate how many lines above/below the staff we need.\n */\n static format(symbols, state) {\n var _a;\n if (!symbols || symbols.length === 0)\n return false;\n let width = 0;\n let nonSuperWidth = 0;\n const reportedWidths = [];\n for (const symbol of symbols) {\n const fontSize = Font.convertSizeToPointValue((_a = symbol.textFont) === null || _a === void 0 ? void 0 : _a.size);\n const fontAdj = Font.scaleSize(fontSize, 0.05);\n const glyphAdj = fontAdj * 2;\n let lineSpaces = 1;\n let vAlign = false;\n for (let j = 0; j < symbol.symbolBlocks.length; ++j) {\n const block = symbol.symbolBlocks[j];\n const sup = ChordSymbol.isSuperscript(block);\n const sub = ChordSymbol.isSubscript(block);\n const superSubScale = sup || sub ? ChordSymbol.superSubRatio : 1;\n const adj = block.symbolType === SymbolTypes.GLYPH ? glyphAdj * superSubScale : fontAdj * superSubScale;\n // If there are super/subscripts, they extend beyond the line so\n // assume they take up 2 lines\n if (sup || sub) {\n lineSpaces = 2;\n }\n // If there is a symbol-specific offset, add it but consider font\n // size since font and glyphs will be interspersed.\n const fontSize = symbol.textFormatter.fontSizeInPixels;\n const superSubFontSize = fontSize * superSubScale;\n if (block.symbolType === SymbolTypes.GLYPH && block.glyph !== undefined) {\n block.width = ChordSymbol.getWidthForGlyph(block.glyph) * superSubFontSize;\n block.yShift += ChordSymbol.getYShiftForGlyph(block.glyph) * superSubFontSize;\n block.xShift += ChordSymbol.getXShiftForGlyph(block.glyph) * superSubFontSize;\n block.glyph.scale = block.glyph.scale * adj;\n }\n else if (block.symbolType === SymbolTypes.TEXT) {\n block.width = block.width * superSubFontSize;\n block.yShift += symbol.getYOffsetForText(block.text) * adj;\n }\n if (block.symbolType === SymbolTypes.GLYPH &&\n block.glyph !== undefined &&\n block.glyph.code === ChordSymbol.glyphs.over.code) {\n lineSpaces = 2;\n }\n block.width += ChordSymbol.spacingBetweenBlocks * fontSize * superSubScale;\n // If a subscript immediately follows a superscript block, try to\n // overlay them.\n if (sup && j > 0) {\n const prev = symbol.symbolBlocks[j - 1];\n if (!ChordSymbol.isSuperscript(prev)) {\n nonSuperWidth = width;\n }\n }\n if (sub && nonSuperWidth > 0) {\n vAlign = true;\n // slide the symbol over so it lines up with superscript\n block.xShift = block.xShift + (nonSuperWidth - width);\n width = nonSuperWidth;\n nonSuperWidth = 0;\n // If we have vertically lined up, turn kerning off.\n symbol.setEnableKerning(false);\n }\n if (!sup && !sub) {\n nonSuperWidth = 0;\n }\n block.vAlign = vAlign;\n width += block.width;\n }\n // make kerning adjustments after computing super/subscripts\n symbol.updateKerningAdjustments();\n symbol.updateOverBarAdjustments();\n if (symbol.getVertical() === ChordSymbolVerticalJustify.TOP) {\n symbol.setTextLine(state.top_text_line);\n state.top_text_line += lineSpaces;\n }\n else {\n symbol.setTextLine(state.text_line + 1);\n state.text_line += lineSpaces + 1;\n }\n if (symbol.getReportWidth()) {\n reportedWidths.push(width);\n }\n else {\n reportedWidths.push(0);\n }\n }\n width = reportedWidths.reduce((a, b) => a + b, 0);\n state.left_shift += width / 2;\n state.right_shift += width / 2;\n return true;\n }\n /**\n * Default text font.\n * Choose a font family that works well with the current music engraving font.\n * @override `Element.TEXT_FONT`.\n */\n static get TEXT_FONT() {\n let family = 'Roboto Slab, Times, serif';\n if (Tables.currentMusicFont().getName() === 'Petaluma') {\n // Fixes Issue #1180\n family = 'PetalumaScript, Arial, sans-serif';\n }\n return {\n family,\n size: 12,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n };\n }\n /**\n * The offset is specified in `em`. Scale this value by the font size in pixels.\n */\n get superscriptOffset() {\n return ChordSymbol.superscriptOffset * this.textFormatter.fontSizeInPixels;\n }\n get subscriptOffset() {\n return ChordSymbol.subscriptOffset * this.textFormatter.fontSizeInPixels;\n }\n setReportWidth(value) {\n this.reportWidth = value;\n return this;\n }\n getReportWidth() {\n return this.reportWidth;\n }\n updateOverBarAdjustments() {\n const barIndex = this.symbolBlocks.findIndex(({ symbolType, glyph }) => symbolType === SymbolTypes.GLYPH && glyph !== undefined && glyph.code === 'csymDiagonalArrangementSlash');\n if (barIndex < 0) {\n return;\n }\n const bar = this.symbolBlocks[barIndex];\n const xoff = bar.width / 4;\n const yoff = 0.25 * this.textFormatter.fontSizeInPixels;\n let symIndex = 0;\n for (symIndex === 0; symIndex < barIndex; ++symIndex) {\n const symbol = this.symbolBlocks[symIndex];\n symbol.xShift = symbol.xShift + xoff;\n symbol.yShift = symbol.yShift - yoff;\n }\n for (symIndex = barIndex + 1; symIndex < this.symbolBlocks.length; ++symIndex) {\n const symbol = this.symbolBlocks[symIndex];\n symbol.xShift = symbol.xShift - xoff;\n symbol.yShift = symbol.yShift + yoff;\n }\n }\n updateKerningAdjustments() {\n let accum = 0;\n for (let j = 0; j < this.symbolBlocks.length; ++j) {\n const symbol = this.symbolBlocks[j];\n accum += this.getKerningAdjustment(j);\n symbol.xShift += accum;\n }\n }\n /** Do some basic kerning so that letter chords like 'A' don't have the extensions hanging off to the right. */\n getKerningAdjustment(j) {\n if (!this.useKerning) {\n return 0;\n }\n const currSymbol = this.symbolBlocks[j];\n const prevSymbol = j > 0 ? this.symbolBlocks[j - 1] : undefined;\n let adjustment = 0;\n // Move things into the '/' over bar\n if (currSymbol.symbolType === SymbolTypes.GLYPH &&\n currSymbol.glyph !== undefined &&\n currSymbol.glyph.code === ChordSymbol.glyphs.over.code) {\n adjustment += currSymbol.glyph.metrics.x_shift;\n }\n if (prevSymbol !== undefined &&\n prevSymbol.symbolType === SymbolTypes.GLYPH &&\n prevSymbol.glyph !== undefined &&\n prevSymbol.glyph.code === ChordSymbol.glyphs.over.code) {\n adjustment += prevSymbol.glyph.metrics.x_shift;\n }\n // For superscripts that follow a letter without much top part, move it to the left slightly\n let preKernUpper = false;\n let preKernLower = false;\n if (prevSymbol !== undefined && prevSymbol.symbolType === SymbolTypes.TEXT) {\n preKernUpper = ChordSymbol.upperKerningText.some((xx) => xx === prevSymbol.text[prevSymbol.text.length - 1]);\n preKernLower = ChordSymbol.lowerKerningText.some((xx) => xx === prevSymbol.text[prevSymbol.text.length - 1]);\n }\n const kerningOffsetPixels = ChordSymbol.kerningOffset * this.textFormatter.fontSizeInPixels;\n // TODO: adjust kern for font size.\n // Where should this constant live?\n if (preKernUpper && currSymbol.symbolModifier === SymbolModifiers.SUPERSCRIPT) {\n adjustment += kerningOffsetPixels;\n }\n if (preKernLower && currSymbol.symbolType === SymbolTypes.TEXT) {\n if (currSymbol.text[0] >= 'a' && currSymbol.text[0] <= 'z') {\n adjustment += kerningOffsetPixels / 2;\n }\n if (ChordSymbol.upperKerningText.some((xx) => xx === (prevSymbol === null || prevSymbol === void 0 ? void 0 : prevSymbol.text[prevSymbol.text.length - 1]))) {\n adjustment += kerningOffsetPixels / 2;\n }\n }\n return adjustment;\n }\n /**\n * ChordSymbol allows multiple blocks so we can mix glyphs and font text.\n * Each block can have its own vertical orientation.\n */\n // eslint-disable-next-line\n getSymbolBlock(params = {}) {\n var _a, _b, _c;\n const symbolType = (_a = params.symbolType) !== null && _a !== void 0 ? _a : SymbolTypes.TEXT;\n const symbolBlock = {\n text: (_b = params.text) !== null && _b !== void 0 ? _b : '',\n symbolType,\n symbolModifier: (_c = params.symbolModifier) !== null && _c !== void 0 ? _c : SymbolModifiers.NONE,\n xShift: 0,\n yShift: 0,\n vAlign: false,\n width: 0,\n };\n // Note: symbol widths are resolution and font-independent.\n // We convert to pixel values when we know what the font is.\n if (symbolType === SymbolTypes.GLYPH && typeof params.glyph === 'string') {\n const glyphArgs = ChordSymbol.glyphs[params.glyph];\n const glyphPoints = 20;\n symbolBlock.glyph = new Glyph(glyphArgs.code, glyphPoints, { category: 'chordSymbol' });\n // Beware: glyph.metrics is not the same as glyph.getMetrics() !\n // rv.glyph.point = rv.glyph.point * rv.glyph.metrics.scale;\n // rv.width = rv.glyph.getMetrics().width;\n // don't set yShift here, b/c we need to do it at formatting time after the font is set.\n }\n else if (symbolType === SymbolTypes.TEXT) {\n symbolBlock.width = this.textFormatter.getWidthForTextInEm(symbolBlock.text);\n }\n else if (symbolType === SymbolTypes.LINE) {\n symbolBlock.width = params.width;\n }\n return symbolBlock;\n }\n /** Add a symbol to this chord, could be text, glyph or line. */\n // eslint-disable-next-line\n addSymbolBlock(parameters) {\n this.symbolBlocks.push(this.getSymbolBlock(parameters));\n return this;\n }\n // ### Convenience functions for creating different types of chord symbol parts.\n /** Add a text block. */\n // eslint-disable-next-line\n addText(text, parameters = {}) {\n const symbolType = SymbolTypes.TEXT;\n return this.addSymbolBlock(Object.assign(Object.assign({}, parameters), { text, symbolType }));\n }\n /** Add a text block with superscript modifier. */\n addTextSuperscript(text) {\n const symbolType = SymbolTypes.TEXT;\n const symbolModifier = SymbolModifiers.SUPERSCRIPT;\n return this.addSymbolBlock({ text, symbolType, symbolModifier });\n }\n /** Add a text block with subscript modifier. */\n addTextSubscript(text) {\n const symbolType = SymbolTypes.TEXT;\n const symbolModifier = SymbolModifiers.SUBSCRIPT;\n return this.addSymbolBlock({ text, symbolType, symbolModifier });\n }\n /** Add a glyph block with superscript modifier. */\n addGlyphSuperscript(glyph) {\n const symbolType = SymbolTypes.GLYPH;\n const symbolModifier = SymbolModifiers.SUPERSCRIPT;\n return this.addSymbolBlock({ glyph, symbolType, symbolModifier });\n }\n /** Add a glyph block. */\n // eslint-disable-next-line\n addGlyph(glyph, params = {}) {\n const symbolType = SymbolTypes.GLYPH;\n return this.addSymbolBlock(Object.assign(Object.assign({}, params), { glyph, symbolType }));\n }\n /**\n * Add a glyph for each character in 'text'. If the glyph is not available, use text from the font.\n * e.g. `addGlyphOrText('(+5#11)')` will use text for the '5' and '11', and glyphs for everything else.\n */\n // eslint-disable-next-line\n addGlyphOrText(text, params = {}) {\n let str = '';\n for (let i = 0; i < text.length; ++i) {\n const char = text[i];\n if (ChordSymbol.glyphs[char]) {\n if (str.length > 0) {\n this.addText(str, params);\n str = '';\n }\n this.addGlyph(char, params);\n }\n else {\n // Collect consecutive characters with no glyphs.\n str += char;\n }\n }\n if (str.length > 0) {\n this.addText(str, params);\n }\n return this;\n }\n /** Add a line of the given width, used as a continuation of the previous symbol in analysis, or lyrics, etc. */\n // eslint-disable-next-line\n addLine(width, params = {}) {\n const symbolType = SymbolTypes.LINE;\n return this.addSymbolBlock(Object.assign(Object.assign({}, params), { symbolType, width }));\n }\n /**\n * Set the chord symbol's font family, size, weight, style (e.g., `Arial`, `10pt`, `bold`, `italic`).\n *\n * @param f is 1) a `FontInfo` object or\n * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or\n * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided).\n * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt').\n * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900).\n * @param style is a string (e.g., 'italic', 'normal').\n *\n * @override See: Element.\n */\n setFont(f, size, weight, style) {\n super.setFont(f, size, weight, style);\n this.textFormatter = TextFormatter.create(this.textFont);\n return this;\n }\n setEnableKerning(val) {\n this.useKerning = val;\n return this;\n }\n /** Set vertical position of text (above or below stave). */\n setVertical(vj) {\n this.vertical = typeof vj === 'string' ? ChordSymbol.VerticalJustifyString[vj] : vj;\n return this;\n }\n getVertical() {\n return this.vertical;\n }\n /** Set horizontal justification. */\n setHorizontal(hj) {\n this.horizontal = typeof hj === 'string' ? ChordSymbol.HorizontalJustifyString[hj] : hj;\n return this;\n }\n getHorizontal() {\n return this.horizontal;\n }\n getWidth() {\n let width = 0;\n this.symbolBlocks.forEach((symbol) => {\n width += symbol.vAlign ? 0 : symbol.width;\n });\n return width;\n }\n getYOffsetForText(text) {\n var _a;\n let acc = 0;\n let i = 0;\n for (i = 0; i < text.length; ++i) {\n const metrics = this.textFormatter.getGlyphMetrics(text[i]);\n if (metrics) {\n const yMax = (_a = metrics.y_max) !== null && _a !== void 0 ? _a : 0;\n acc = yMax < acc ? yMax : acc;\n }\n }\n const resolution = this.textFormatter.getResolution();\n return i > 0 ? -1 * (acc / resolution) : 0;\n }\n /** Render text and glyphs above/below the note. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n // We're changing context parameters. Save current state.\n ctx.save();\n const classString = Object.keys(this.getAttribute('classes')).join(' ');\n ctx.openGroup(classString, this.getAttribute('id'));\n const start = note.getModifierStartXY(Modifier.Position.ABOVE, this.index);\n ctx.setFont(this.textFont);\n let y;\n // The position of the text varies based on whether or not the note\n // has a stem.\n const hasStem = note.hasStem();\n const stave = note.checkStave();\n if (this.vertical === ChordSymbolVerticalJustify.BOTTOM) {\n // HACK: We need to compensate for the text's height since its origin is bottom-right.\n y = stave.getYForBottomText(this.text_line + Tables.TEXT_HEIGHT_OFFSET_HACK);\n if (hasStem) {\n const stem_ext = note.checkStem().getExtents();\n const spacing = stave.getSpacingBetweenLines();\n const stem_base = note.getStemDirection() === 1 ? stem_ext.baseY : stem_ext.topY;\n y = Math.max(y, stem_base + spacing * (this.text_line + 2));\n }\n }\n else {\n // (this.vertical === VerticalJustify.TOP)\n y = Math.min(stave.getYForTopText(this.text_line), note.getYs()[0] - 10);\n if (hasStem) {\n const stem_ext = note.checkStem().getExtents();\n const spacing = stave.getSpacingBetweenLines();\n y = Math.min(y, stem_ext.topY - 5 - spacing * this.text_line);\n }\n }\n let x = start.x;\n if (this.horizontal === ChordSymbolHorizontalJustify.LEFT) {\n x = start.x;\n }\n else if (this.horizontal === ChordSymbolHorizontalJustify.RIGHT) {\n x = start.x + this.getWidth();\n }\n else if (this.horizontal === ChordSymbolHorizontalJustify.CENTER) {\n x = start.x - this.getWidth() / 2;\n }\n else {\n // HorizontalJustify.CENTER_STEM\n x = note.getStemX() - this.getWidth() / 2;\n }\n L('Rendering ChordSymbol: ', this.textFormatter, x, y);\n this.symbolBlocks.forEach((symbol) => {\n const isSuper = ChordSymbol.isSuperscript(symbol);\n const isSub = ChordSymbol.isSubscript(symbol);\n let curY = y;\n L('shift was ', symbol.xShift, symbol.yShift);\n L('curY pre sub ', curY);\n if (isSuper) {\n curY += this.superscriptOffset;\n }\n if (isSub) {\n curY += this.subscriptOffset;\n }\n L('curY sup/sub ', curY);\n if (symbol.symbolType === SymbolTypes.TEXT) {\n if (isSuper || isSub) {\n ctx.save();\n if (this.textFont) {\n const { family, size, weight, style } = this.textFont;\n const smallerFontSize = Font.scaleSize(size, ChordSymbol.superSubRatio);\n ctx.setFont(family, smallerFontSize, weight, style);\n }\n }\n // TODO???\n // We estimate the text width, fill it in with the empirical value so the formatting is even.\n // const textDim = ctx.measureText(symbol.text);\n // symbol.width = textDim.width;\n L('Rendering Text: ', symbol.text, x + symbol.xShift, curY + symbol.yShift);\n ctx.fillText(symbol.text, x + symbol.xShift, curY + symbol.yShift);\n if (isSuper || isSub) {\n ctx.restore();\n }\n }\n else if (symbol.symbolType === SymbolTypes.GLYPH && symbol.glyph) {\n curY += symbol.yShift;\n L('Rendering Glyph: ', symbol.glyph.code, x + symbol.xShift, curY);\n symbol.glyph.render(ctx, x + symbol.xShift, curY);\n }\n else if (symbol.symbolType === SymbolTypes.LINE) {\n L('Rendering Line : ', symbol.width, x, curY);\n ctx.beginPath();\n ctx.setLineWidth(1); // ?\n ctx.moveTo(x, y);\n ctx.lineTo(x + symbol.width, curY);\n ctx.stroke();\n }\n x += symbol.width;\n if (symbol.vAlign) {\n x += symbol.xShift;\n }\n });\n ctx.closeGroup();\n ctx.restore();\n }\n}\nChordSymbol.DEBUG = false;\n// Chord symbols can be positioned and justified relative to the note.\nChordSymbol.HorizontalJustify = ChordSymbolHorizontalJustify;\nChordSymbol.HorizontalJustifyString = {\n left: ChordSymbolHorizontalJustify.LEFT,\n right: ChordSymbolHorizontalJustify.RIGHT,\n center: ChordSymbolHorizontalJustify.CENTER,\n centerStem: ChordSymbolHorizontalJustify.CENTER_STEM,\n};\nChordSymbol.VerticalJustify = ChordSymbolVerticalJustify;\nChordSymbol.VerticalJustifyString = {\n top: ChordSymbolVerticalJustify.TOP,\n above: ChordSymbolVerticalJustify.TOP,\n below: ChordSymbolVerticalJustify.BOTTOM,\n bottom: ChordSymbolVerticalJustify.BOTTOM,\n};\n// Glyph data\nChordSymbol.glyphs = {\n diminished: {\n code: 'csymDiminished',\n },\n dim: {\n code: 'csymDiminished',\n },\n halfDiminished: {\n code: 'csymHalfDiminished',\n },\n '+': {\n code: 'csymAugmented',\n },\n augmented: {\n code: 'csymAugmented',\n },\n majorSeventh: {\n code: 'csymMajorSeventh',\n },\n minor: {\n code: 'csymMinor',\n },\n '-': {\n code: 'csymMinor',\n },\n '(': {\n code: 'csymParensLeftTall',\n },\n leftParen: {\n code: 'csymParensLeftTall',\n },\n ')': {\n code: 'csymParensRightTall',\n },\n rightParen: {\n code: 'csymParensRightTall',\n },\n leftBracket: {\n code: 'csymBracketLeftTall',\n },\n rightBracket: {\n code: 'csymBracketRightTall',\n },\n leftParenTall: {\n code: 'csymParensLeftVeryTall',\n },\n rightParenTall: {\n code: 'csymParensRightVeryTall',\n },\n '/': {\n code: 'csymDiagonalArrangementSlash',\n },\n over: {\n code: 'csymDiagonalArrangementSlash',\n },\n '#': {\n code: 'accidentalSharp',\n },\n b: {\n code: 'accidentalFlat',\n },\n};\nChordSymbol.symbolTypes = SymbolTypes;\nChordSymbol.symbolModifiers = SymbolModifiers;\n/** Currently unused. */\nChordSymbol.noFormat = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Fraction } from './fraction';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nexport var VoiceMode;\n(function (VoiceMode) {\n VoiceMode[VoiceMode[\"STRICT\"] = 1] = \"STRICT\";\n VoiceMode[VoiceMode[\"SOFT\"] = 2] = \"SOFT\";\n VoiceMode[VoiceMode[\"FULL\"] = 3] = \"FULL\";\n})(VoiceMode || (VoiceMode = {}));\n/**\n * `Voice` is mainly a container object to group `Tickables` for formatting.\n */\nexport class Voice extends Element {\n constructor(time, options) {\n super();\n this.resolutionMultiplier = 1;\n this.mode = VoiceMode.STRICT;\n this.preFormatted = false;\n this.ticksUsed = new Fraction(0, 1);\n this.largestTickWidth = 0;\n this.tickables = [];\n this.options = Object.assign({ softmaxFactor: 100 }, options);\n // Convert the `time` string into a VoiceTime object if necessary.\n let voiceTime;\n if (typeof time === 'string') {\n // Time signature shortcut: \"4/4\", \"3/8\", etc.\n const match = time.match(/(\\d+)\\/(\\d+)/);\n if (match) {\n voiceTime = {\n num_beats: parseInt(match[1]),\n beat_value: parseInt(match[2]),\n };\n }\n }\n else {\n voiceTime = time;\n }\n // Default time signature is 4/4.\n this.time = Object.assign({ num_beats: 4, beat_value: 4, resolution: Tables.RESOLUTION }, voiceTime);\n // Recalculate total ticks.\n this.totalTicks = new Fraction(this.time.num_beats * (this.time.resolution / this.time.beat_value), 1);\n this.smallestTickCount = this.totalTicks.clone();\n }\n static get CATEGORY() {\n return Category.Voice;\n }\n /**\n * Modes allow the addition of ticks in three different ways:\n * - STRICT: This is the default. Ticks must fill the voice.\n * - SOFT: Ticks can be added without restrictions.\n * - FULL: Ticks do not need to fill the voice, but can't exceed the maximum tick length.\n */\n static get Mode() {\n return VoiceMode;\n }\n /** Get the total ticks in the voice. */\n getTotalTicks() {\n return this.totalTicks;\n }\n /** Get the total ticks used in the voice by all the tickables. */\n getTicksUsed() {\n return this.ticksUsed;\n }\n /** Get the largest width of all the tickables. */\n getLargestTickWidth() {\n return this.largestTickWidth;\n }\n /** Get the tick count for the shortest tickable */\n getSmallestTickCount() {\n return this.smallestTickCount;\n }\n /** Get the tickables in the voice. */\n getTickables() {\n return this.tickables;\n }\n /** Get the voice mode. */\n getMode() {\n return this.mode;\n }\n /**\n * Set the voice mode.\n * @param mode value from `VoiceMode`\n */\n setMode(mode) {\n this.mode = mode;\n return this;\n }\n /** Get the resolution multiplier for the voice. */\n getResolutionMultiplier() {\n return this.resolutionMultiplier;\n }\n /** Get the actual tick resolution for the voice. */\n getActualResolution() {\n return this.resolutionMultiplier * this.time.resolution;\n }\n /** Set the voice's stave. */\n setStave(stave) {\n this.stave = stave;\n // Reset the bounding box so we can reformat.\n this.boundingBox = undefined;\n return this;\n }\n getStave() {\n return this.stave;\n }\n /** Get the bounding box for the voice. */\n getBoundingBox() {\n if (!this.boundingBox) {\n const stave = this.checkStave();\n let boundingBox = undefined;\n for (let i = 0; i < this.tickables.length; ++i) {\n const tickable = this.tickables[i];\n tickable.setStave(stave);\n const bb = tickable.getBoundingBox();\n if (bb) {\n boundingBox = boundingBox ? boundingBox.mergeWith(bb) : bb;\n }\n }\n this.boundingBox = boundingBox;\n }\n return this.boundingBox;\n }\n /** Set the voice mode to strict or soft. */\n setStrict(strict) {\n this.mode = strict ? VoiceMode.STRICT : VoiceMode.SOFT;\n return this;\n }\n /** Determine if the voice is complete according to the voice mode. */\n isComplete() {\n if (this.mode === VoiceMode.STRICT || this.mode === VoiceMode.FULL) {\n return this.ticksUsed.equals(this.totalTicks);\n }\n else {\n return true;\n }\n }\n /**\n * We use softmax to layout the tickables proportional to the exponent of\n * their duration. The softmax factor is used to determine the 'linearness' of\n * the layout.\n *\n * The softmax of all the tickables in this voice should sum to 1.\n */\n setSoftmaxFactor(factor) {\n this.options.softmaxFactor = factor;\n return this;\n }\n /**\n * Calculate the sum of the exponents of all the ticks in this voice to use\n * as the denominator of softmax.\n */\n reCalculateExpTicksUsed() {\n const totalTicks = this.ticksUsed.value();\n const exp = (tickable) => Math.pow(this.options.softmaxFactor, tickable.getTicks().value() / totalTicks);\n this.expTicksUsed = this.tickables.map(exp).reduce((a, b) => a + b, 0);\n return this.expTicksUsed;\n }\n /** Get the softmax-scaled value of a tick duration. 'tickValue' is a number. */\n softmax(tickValue) {\n if (!this.expTicksUsed) {\n this.expTicksUsed = this.reCalculateExpTicksUsed();\n }\n const totalTicks = this.ticksUsed.value();\n const exp = (v) => Math.pow(this.options.softmaxFactor, v / totalTicks);\n const sm = exp(tickValue) / this.expTicksUsed;\n return sm;\n }\n /** Add a tickable to the voice. */\n addTickable(tickable) {\n if (!tickable.shouldIgnoreTicks()) {\n const ticks = tickable.getTicks();\n // Update the total ticks for this line.\n this.ticksUsed.add(ticks);\n this.expTicksUsed = 0; // reset\n if ((this.mode === VoiceMode.STRICT || this.mode === VoiceMode.FULL) &&\n this.ticksUsed.greaterThan(this.totalTicks)) {\n this.ticksUsed.subtract(ticks);\n throw new RuntimeError('BadArgument', 'Too many ticks.');\n }\n // Track the smallest tickable for formatting.\n if (ticks.lessThan(this.smallestTickCount)) {\n this.smallestTickCount = ticks.clone();\n }\n this.resolutionMultiplier = this.ticksUsed.denominator;\n // Expand total ticks using denominator from ticks used.\n this.totalTicks.add(0, this.ticksUsed.denominator);\n }\n // Add the tickable to the line.\n this.tickables.push(tickable);\n tickable.setVoice(this);\n return this;\n }\n /** Add an array of tickables to the voice. */\n addTickables(tickables) {\n for (let i = 0; i < tickables.length; ++i) {\n this.addTickable(tickables[i]);\n }\n return this;\n }\n /** Preformat the voice by applying the voice's stave to each note. */\n preFormat() {\n if (this.preFormatted)\n return this;\n const stave = this.checkStave();\n this.tickables.forEach((tickable) => {\n if (!tickable.getStave()) {\n tickable.setStave(stave);\n }\n });\n this.preFormatted = true;\n return this;\n }\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n /**\n * Render the voice onto the canvas `context` and an optional `stave`.\n * If `stave` is omitted, it is expected that the notes have staves\n * already set.\n *\n * This method also calculates the voice's boundingBox while drawing\n * the notes. Note the similarities with this.getBoundingBox().\n */\n draw(context = this.checkContext(), stave) {\n stave = stave !== null && stave !== void 0 ? stave : this.stave;\n this.setRendered();\n let boundingBox = undefined;\n for (let i = 0; i < this.tickables.length; ++i) {\n const tickable = this.tickables[i];\n // Set the stave if provided.\n if (stave) {\n tickable.setStave(stave);\n }\n defined(tickable.getStave(), 'MissingStave', 'The voice cannot draw tickables without staves.');\n const bb = tickable.getBoundingBox();\n if (bb) {\n boundingBox = boundingBox ? boundingBox.mergeWith(bb) : bb;\n }\n tickable.setContext(context);\n tickable.drawWithStyle();\n }\n this.boundingBox = boundingBox;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Note } from './note';\nimport { Barline, BarlineType } from './stavebarline';\nimport { Category } from './typeguard';\nimport { log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (BarNote.DEBUG)\n log('Vex.Flow.BarNote', args);\n}\n/**\n * A `BarNote` is used to render bar lines (from `barline.ts`). `BarNote`s can\n * be added to a voice and rendered in the middle of a stave. Since it has no\n * duration, it consumes no `tick`s, and is dealt with appropriately by the formatter.\n *\n * See `tests/barnote_tests.ts` for usage examples.\n */\nexport class BarNote extends Note {\n constructor(type = BarlineType.SINGLE) {\n super({ duration: 'b' });\n this.metrics = {\n widths: {},\n };\n const TYPE = BarlineType;\n this.metrics.widths = {\n [TYPE.SINGLE]: 8,\n [TYPE.DOUBLE]: 12,\n [TYPE.END]: 15,\n [TYPE.REPEAT_BEGIN]: 14,\n [TYPE.REPEAT_END]: 14,\n [TYPE.REPEAT_BOTH]: 18,\n [TYPE.NONE]: 0,\n };\n // Tell the formatter that bar notes have no duration.\n this.ignore_ticks = true;\n this.setType(type);\n }\n static get CATEGORY() {\n return Category.BarNote;\n }\n /** Get the type of bar note.*/\n getType() {\n return this.type;\n }\n /** Set the type of bar note. */\n setType(type) {\n this.type = typeof type === 'string' ? Barline.typeString[type] : type;\n // Set width to width of relevant `Barline`.\n this.setWidth(this.metrics.widths[this.type]);\n return this;\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n /** Overridden to ignore. */\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n /** Render note to stave. */\n draw() {\n const ctx = this.checkContext();\n L('Rendering bar line at: ', this.getAbsoluteX());\n if (this.style)\n this.applyStyle(ctx);\n const barline = new Barline(this.type);\n barline.setX(this.getAbsoluteX());\n barline.draw(this.checkStave());\n if (this.style)\n this.restoreStyle(ctx);\n this.setRendered();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.BarNote.DEBUG` to `true`. */\nBarNote.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Modifier } from './modifier';\nimport { TextFormatter } from './textformatter';\nimport { Category, isTabNote } from './typeguard';\nimport { RuntimeError } from './util';\n/** Bend implements tablature bends. */\nexport class Bend extends Modifier {\n /**\n * Example of a phrase:\n * ```\n * [{\n * type: UP,\n * text: \"whole\"\n * width: 8;\n * },\n * {\n * type: DOWN,\n * text: \"whole\"\n * width: 8;\n * },\n * {\n * type: UP,\n * text: \"half\"\n * width: 8;\n * },\n * {\n * type: UP,\n * text: \"whole\"\n * width: 8;\n * },\n * {\n * type: DOWN,\n * text: \"1 1/2\"\n * width: 8;\n * }]\n * ```\n * @param text text for bend (\"Full\", \"Half\", etc.) (DEPRECATED)\n * @param release if true, render a release. (DEPRECATED)\n * @param phrase if set, ignore \"text\" and \"release\", and use the more sophisticated phrase specified\n */\n constructor(text, release = false, phrase) {\n super();\n this.text = text;\n this.x_shift = 0;\n this.release = release;\n this.tap = '';\n this.resetFont();\n this.render_options = {\n line_width: 1.5,\n line_style: '#777777',\n bend_width: 8,\n release_width: 8,\n };\n if (phrase) {\n this.phrase = phrase;\n }\n else {\n // Backward compatibility\n this.phrase = [{ type: Bend.UP, text: this.text }];\n if (this.release)\n this.phrase.push({ type: Bend.DOWN, text: '' });\n }\n this.updateWidth();\n }\n static get CATEGORY() {\n return Category.Bend;\n }\n static get UP() {\n return 0;\n }\n static get DOWN() {\n return 1;\n }\n // Arrange bends in `ModifierContext`\n static format(bends, state) {\n if (!bends || bends.length === 0)\n return false;\n let last_width = 0;\n // Format Bends\n for (let i = 0; i < bends.length; ++i) {\n const bend = bends[i];\n const note = bend.checkAttachedNote();\n if (isTabNote(note)) {\n const stringPos = note.leastString() - 1;\n if (state.top_text_line < stringPos) {\n state.top_text_line = stringPos;\n }\n }\n bend.setXShift(last_width);\n last_width = bend.getWidth();\n bend.setTextLine(state.top_text_line);\n }\n state.right_shift += last_width;\n state.top_text_line += 1;\n return true;\n }\n /** Set horizontal shift in pixels. */\n setXShift(value) {\n this.x_shift = value;\n this.updateWidth();\n return this;\n }\n setTap(value) {\n this.tap = value;\n return this;\n }\n /** Get text provided in the constructor. */\n getText() {\n return this.text;\n }\n getTextHeight() {\n const textFormatter = TextFormatter.create(this.textFont);\n return textFormatter.maxHeight;\n }\n /** Recalculate width. */\n updateWidth() {\n const textFormatter = TextFormatter.create(this.textFont);\n const measureText = (text) => {\n return textFormatter.getWidthForTextInPx(text);\n };\n let totalWidth = 0;\n for (let i = 0; i < this.phrase.length; ++i) {\n const bend = this.phrase[i];\n if (bend.width !== undefined) {\n totalWidth += bend.width;\n }\n else {\n const additional_width = bend.type === Bend.UP ? this.render_options.bend_width : this.render_options.release_width;\n bend.width = Math.max(additional_width, measureText(bend.text)) + 3;\n bend.draw_width = bend.width / 2;\n totalWidth += bend.width;\n }\n }\n this.setWidth(totalWidth + this.x_shift);\n return this;\n }\n /** Draw the bend on the rendering context. */\n draw() {\n var _a;\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(Modifier.Position.RIGHT, this.index);\n start.x += 3;\n start.y += 0.5;\n const x_shift = this.x_shift;\n const stave = note.checkStave();\n const spacing = stave.getSpacingBetweenLines();\n const lowestY = note.getYs().reduce((a, b) => (a < b ? a : b));\n // this.text_line is relative to top string in the group.\n const bend_height = start.y - ((this.text_line + 1) * spacing + start.y - lowestY) + 3;\n const annotation_y = start.y - ((this.text_line + 1) * spacing + start.y - lowestY) - 1;\n const renderBend = (x, y, width, height) => {\n const cp_x = x + width;\n const cp_y = y;\n ctx.save();\n ctx.beginPath();\n ctx.setLineWidth(this.render_options.line_width);\n ctx.setStrokeStyle(this.render_options.line_style);\n ctx.setFillStyle(this.render_options.line_style);\n ctx.moveTo(x, y);\n ctx.quadraticCurveTo(cp_x, cp_y, x + width, height);\n ctx.stroke();\n ctx.restore();\n };\n const renderRelease = (x, y, width, height) => {\n ctx.save();\n ctx.beginPath();\n ctx.setLineWidth(this.render_options.line_width);\n ctx.setStrokeStyle(this.render_options.line_style);\n ctx.setFillStyle(this.render_options.line_style);\n ctx.moveTo(x, height);\n ctx.quadraticCurveTo(x + width, height, x + width, y);\n ctx.stroke();\n ctx.restore();\n };\n const renderArrowHead = (x, y, direction) => {\n const width = 4;\n const yBase = y + width * direction;\n ctx.beginPath();\n ctx.moveTo(x, y); // tip of the arrow\n ctx.lineTo(x - width, yBase);\n ctx.lineTo(x + width, yBase);\n ctx.closePath();\n ctx.fill();\n };\n const renderText = (x, text) => {\n ctx.save();\n ctx.setFont(this.textFont);\n const render_x = x - ctx.measureText(text).width / 2;\n ctx.fillText(text, render_x, annotation_y);\n ctx.restore();\n };\n let last_bend = undefined;\n let last_bend_draw_width = 0;\n let last_drawn_width = 0;\n if ((_a = this.tap) === null || _a === void 0 ? void 0 : _a.length) {\n const tapStart = note.getModifierStartXY(Modifier.Position.CENTER, this.index);\n renderText(tapStart.x, this.tap);\n }\n for (let i = 0; i < this.phrase.length; ++i) {\n const bend = this.phrase[i];\n if (!bend.draw_width)\n bend.draw_width = 0;\n if (i === 0)\n bend.draw_width += x_shift;\n last_drawn_width = bend.draw_width + last_bend_draw_width - (i === 1 ? x_shift : 0);\n if (bend.type === Bend.UP) {\n if (last_bend && last_bend.type === Bend.UP) {\n renderArrowHead(start.x, bend_height, +1);\n }\n renderBend(start.x, start.y, last_drawn_width, bend_height);\n }\n if (bend.type === Bend.DOWN) {\n if (last_bend && last_bend.type === Bend.UP) {\n renderRelease(start.x, start.y, last_drawn_width, bend_height);\n }\n if (last_bend && last_bend.type === Bend.DOWN) {\n renderArrowHead(start.x, start.y, -1);\n renderRelease(start.x, start.y, last_drawn_width, bend_height);\n }\n if (!last_bend) {\n last_drawn_width = bend.draw_width;\n renderRelease(start.x, start.y, last_drawn_width, bend_height);\n }\n }\n renderText(start.x + last_drawn_width, bend.text);\n last_bend = bend;\n last_bend_draw_width = bend.draw_width;\n last_bend.x = start.x;\n start.x += last_drawn_width;\n }\n if (!last_bend || last_bend.x == undefined) {\n throw new RuntimeError('NoLastBendForBend', 'Internal error.');\n }\n // Final arrowhead and text\n if (last_bend.type === Bend.UP) {\n renderArrowHead(last_bend.x + last_drawn_width, bend_height, +1);\n }\n else if (last_bend.type === Bend.DOWN) {\n renderArrowHead(last_bend.x + last_drawn_width, start.y, -1);\n }\n }\n}\n/** Default text font. */\nBend.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n//\n// This class implements dot modifiers for notes.\nimport { Modifier } from './modifier';\nimport { Category, isGraceNote, isStaveNote, isTabNote } from './typeguard';\nimport { RuntimeError } from './util';\nexport class Dot extends Modifier {\n constructor() {\n super();\n this.position = Modifier.Position.RIGHT;\n this.radius = 2;\n this.setWidth(5);\n this.dot_shiftY = 0;\n }\n static get CATEGORY() {\n return Category.Dot;\n }\n /** Returns the dots associated to a Note. */\n static getDots(note) {\n return note.getModifiersByType(Dot.CATEGORY);\n }\n /** Add a dot on the specified keys to the notes. */\n static buildAndAttach(notes, options) {\n for (const note of notes) {\n if (options === null || options === void 0 ? void 0 : options.all) {\n for (let i = 0; i < note.keys.length; i++) {\n const dot = new Dot();\n dot.setDotShiftY(note.glyph.dot_shiftY);\n note.addModifier(dot, i);\n }\n }\n else if ((options === null || options === void 0 ? void 0 : options.index) != undefined) {\n const dot = new Dot();\n dot.setDotShiftY(note.glyph.dot_shiftY);\n note.addModifier(dot, options === null || options === void 0 ? void 0 : options.index);\n }\n else {\n const dot = new Dot();\n dot.setDotShiftY(note.glyph.dot_shiftY);\n note.addModifier(dot, 0);\n }\n }\n }\n // Arrange dots inside a ModifierContext.\n static format(dots, state) {\n const right_shift = state.right_shift;\n const dot_spacing = 1;\n if (!dots || dots.length === 0)\n return false;\n const dot_list = [];\n const max_shift_map = {};\n for (let i = 0; i < dots.length; ++i) {\n const dot = dots[i];\n const note = dot.getNote();\n let props;\n let shift;\n if (isStaveNote(note)) {\n const index = dot.checkIndex();\n props = note.getKeyProps()[index];\n // consider right displaced head with no previous modifier\n shift = note.getFirstDotPx();\n }\n else if (isTabNote(note)) {\n props = { line: 0.5 }; // Shim key props for dot placement\n shift = right_shift;\n }\n else {\n // note object is not StaveNote or TabNote.\n throw new RuntimeError('Internal', 'Unexpected instance.');\n }\n const note_id = note.getAttribute('id');\n dot_list.push({ line: props.line, note, note_id, dot });\n max_shift_map[note_id] = Math.max(max_shift_map[note_id] || shift, shift);\n }\n // Sort dots by line number.\n dot_list.sort((a, b) => b.line - a.line);\n let dot_shift = right_shift;\n let x_width = 0;\n let last_line = null;\n let last_note = null;\n let prev_dotted_space = null;\n let half_shiftY = 0;\n for (let i = 0; i < dot_list.length; ++i) {\n const { dot, note, note_id, line } = dot_list[i];\n // Reset the position of the dot every line.\n if (line !== last_line || note !== last_note) {\n dot_shift = max_shift_map[note_id];\n }\n if (!note.isRest() && line !== last_line) {\n if (Math.abs(line % 1) === 0.5) {\n // note is on a space, so no dot shift\n half_shiftY = 0;\n }\n else {\n // note is on a line, so shift dot to space above the line\n half_shiftY = 0.5;\n if (last_note != null && !last_note.isRest() && last_line != null && last_line - line === 0.5) {\n // previous note on a space, so shift dot to space below the line\n half_shiftY = -0.5;\n }\n else if (line + half_shiftY === prev_dotted_space) {\n // previous space is dotted, so shift dot to space below the line\n half_shiftY = -0.5;\n }\n }\n }\n // convert half_shiftY to a multiplier for dots.draw()\n if (note.isRest()) {\n dot.dot_shiftY += -half_shiftY;\n }\n else {\n dot.dot_shiftY = -half_shiftY;\n }\n prev_dotted_space = line + half_shiftY;\n dot.setXShift(dot_shift);\n dot_shift += dot.getWidth() + dot_spacing; // spacing\n x_width = dot_shift > x_width ? dot_shift : x_width;\n last_line = line;\n last_note = note;\n }\n // Update state.\n state.right_shift += x_width;\n return true;\n }\n setNote(note) {\n this.note = note;\n if (isGraceNote(note)) {\n this.radius *= 0.5;\n this.setWidth(3);\n }\n return this;\n }\n setDotShiftY(y) {\n this.dot_shiftY = y;\n return this;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const stave = note.checkStave();\n const lineSpace = stave.getSpacingBetweenLines();\n const start = note.getModifierStartXY(this.position, this.index, { forceFlagRight: true });\n // Set the starting y coordinate to the base of the stem for TabNotes.\n if (isTabNote(note)) {\n start.y = note.getStemExtents().baseY;\n }\n const x = start.x + this.x_shift + this.width - this.radius;\n const y = start.y + this.y_shift + this.dot_shiftY * lineSpace;\n ctx.beginPath();\n ctx.arc(x, y, this.radius, 0, Math.PI * 2, false);\n ctx.fill();\n }\n}\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n// Author Larry Kuhns 2013\n// Class to draws string numbers into the notation.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { Tables } from './tables';\nimport { TextFormatter } from './textformatter';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class FretHandFinger extends Modifier {\n constructor(finger) {\n super();\n this.finger = finger;\n this.width = 7;\n this.position = Modifier.Position.LEFT; // Default position above stem or note head\n this.x_shift = 0;\n this.y_shift = 0;\n this.x_offset = 0; // Horizontal offset from default\n this.y_offset = 0; // Vertical offset from default\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.FretHandFinger;\n }\n // Arrange fingerings inside a ModifierContext.\n static format(nums, state) {\n const { left_shift, right_shift } = state;\n const num_spacing = 1;\n if (!nums || nums.length === 0)\n return false;\n const nums_list = [];\n let prev_note = null;\n let shiftLeft = 0;\n let shiftRight = 0;\n for (let i = 0; i < nums.length; ++i) {\n const num = nums[i];\n const note = num.getNote();\n const pos = num.getPosition();\n const index = num.checkIndex();\n const props = note.getKeyProps()[index];\n const textFormatter = TextFormatter.create(num.textFont);\n const textHeight = textFormatter.maxHeight;\n if (num.position === ModifierPosition.ABOVE) {\n state.top_text_line += textHeight / Tables.STAVE_LINE_DISTANCE + 0.5;\n }\n if (num.position === ModifierPosition.BELOW) {\n state.text_line += textHeight / Tables.STAVE_LINE_DISTANCE + 0.5;\n }\n if (note !== prev_note) {\n for (let n = 0; n < note.keys.length; ++n) {\n if (left_shift === 0) {\n shiftLeft = Math.max(note.getLeftDisplacedHeadPx(), shiftLeft);\n }\n if (right_shift === 0) {\n shiftRight = Math.max(note.getRightDisplacedHeadPx(), shiftRight);\n }\n }\n prev_note = note;\n }\n nums_list.push({\n note,\n num,\n pos,\n line: props.line,\n shiftL: shiftLeft,\n shiftR: shiftRight,\n });\n }\n // Sort fingernumbers by line number.\n nums_list.sort((a, b) => b.line - a.line);\n let numShiftL = 0;\n let numShiftR = 0;\n let xWidthL = 0;\n let xWidthR = 0;\n let lastLine = null;\n let lastNote = null;\n for (let i = 0; i < nums_list.length; ++i) {\n let num_shift = 0;\n const { note, pos, num, line, shiftL, shiftR } = nums_list[i];\n // Reset the position of the string number every line.\n if (line !== lastLine || note !== lastNote) {\n numShiftL = left_shift + shiftL;\n numShiftR = right_shift + shiftR;\n }\n const numWidth = num.getWidth() + num_spacing;\n if (pos === Modifier.Position.LEFT) {\n num.setXShift(left_shift + numShiftL);\n num_shift = left_shift + numWidth; // spacing\n xWidthL = num_shift > xWidthL ? num_shift : xWidthL;\n }\n else if (pos === Modifier.Position.RIGHT) {\n num.setXShift(numShiftR);\n num_shift = shiftRight + numWidth; // spacing\n xWidthR = num_shift > xWidthR ? num_shift : xWidthR;\n }\n lastLine = line;\n lastNote = note;\n }\n state.left_shift += xWidthL;\n state.right_shift += xWidthR;\n return true;\n }\n static easyScoreHook({ fingerings } = {}, note, builder) {\n fingerings === null || fingerings === void 0 ? void 0 : fingerings.split(',').map((fingeringString) => {\n const split = fingeringString.trim().split('.');\n const params = { number: split[0] };\n if (split[1])\n params.position = split[1];\n return builder.getFactory().Fingering(params);\n }).map((fingering, index) => note.addModifier(fingering, index));\n }\n setFretHandFinger(finger) {\n this.finger = finger;\n return this;\n }\n getFretHandFinger() {\n return this.finger;\n }\n setOffsetX(x) {\n this.x_offset = x;\n return this;\n }\n setOffsetY(y) {\n this.y_offset = y;\n return this;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(this.position, this.index);\n let dot_x = start.x + this.x_shift + this.x_offset;\n let dot_y = start.y + this.y_shift + this.y_offset + 5;\n switch (this.position) {\n case Modifier.Position.ABOVE:\n dot_x -= 4;\n dot_y -= 12;\n break;\n case Modifier.Position.BELOW:\n dot_x -= 2;\n dot_y += 10;\n break;\n case Modifier.Position.LEFT:\n dot_x -= this.width;\n break;\n case Modifier.Position.RIGHT:\n dot_x += 1;\n break;\n default:\n throw new RuntimeError('InvalidPosition', `The position ${this.position} does not exist`);\n }\n ctx.save();\n ctx.setFont(this.textFont);\n ctx.fillText('' + this.finger, dot_x, dot_y);\n ctx.restore();\n }\n}\nFretHandFinger.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 9,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// This class implements varies types of ties between contiguous notes. The\n// ties include: regular ties, hammer ons, pull offs, and slides.\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StaveTie extends Element {\n /**\n * @param notes is a struct that has:\n *\n * {\n * first_note: Note,\n * last_note: Note,\n * first_indices: [n1, n2, n3],\n * last_indices: [n1, n2, n3]\n * }\n *\n * @param text\n */\n constructor(notes, text) {\n super();\n this.setNotes(notes);\n this.text = text;\n this.render_options = {\n cp1: 8,\n cp2: 12,\n text_shift_x: 0,\n first_x_shift: 0,\n last_x_shift: 0,\n y_shift: 7,\n tie_spacing: 0,\n };\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StaveTie;\n }\n setDirection(direction) {\n this.direction = direction;\n return this;\n }\n /**\n * Set the notes to attach this tie to.\n *\n * @param {!Object} notes The notes to tie up.\n */\n setNotes(notes) {\n if (!notes.first_note && !notes.last_note) {\n throw new RuntimeError('BadArguments', 'Tie needs to have either first_note or last_note set.');\n }\n if (!notes.first_indices) {\n notes.first_indices = [0];\n }\n if (!notes.last_indices) {\n notes.last_indices = [0];\n }\n if (notes.first_indices.length !== notes.last_indices.length) {\n throw new RuntimeError('BadArguments', 'Tied notes must have same number of indices.');\n }\n this.notes = notes;\n return this;\n }\n /**\n * @return {boolean} Returns true if this is a partial bar.\n */\n isPartial() {\n return !this.notes.first_note || !this.notes.last_note;\n }\n renderTie(params) {\n if (params.first_ys.length === 0 || params.last_ys.length === 0) {\n throw new RuntimeError('BadArguments', 'No Y-values to render');\n }\n const ctx = this.checkContext();\n let cp1 = this.render_options.cp1;\n let cp2 = this.render_options.cp2;\n if (Math.abs(params.last_x_px - params.first_x_px) < 10) {\n cp1 = 2;\n cp2 = 8;\n }\n const first_x_shift = this.render_options.first_x_shift;\n const last_x_shift = this.render_options.last_x_shift;\n const y_shift = this.render_options.y_shift * params.direction;\n // setNotes(...) verified that first_indices and last_indices are not undefined.\n // As a result, we use the ! non-null assertion operator here.\n // eslint-disable-next-line\n const first_indices = this.notes.first_indices;\n // eslint-disable-next-line\n const last_indices = this.notes.last_indices;\n for (let i = 0; i < first_indices.length; ++i) {\n const cp_x = (params.last_x_px + last_x_shift + (params.first_x_px + first_x_shift)) / 2;\n const first_y_px = params.first_ys[first_indices[i]] + y_shift;\n const last_y_px = params.last_ys[last_indices[i]] + y_shift;\n if (isNaN(first_y_px) || isNaN(last_y_px)) {\n throw new RuntimeError('BadArguments', 'Bad indices for tie rendering.');\n }\n const top_cp_y = (first_y_px + last_y_px) / 2 + cp1 * params.direction;\n const bottom_cp_y = (first_y_px + last_y_px) / 2 + cp2 * params.direction;\n ctx.beginPath();\n ctx.moveTo(params.first_x_px + first_x_shift, first_y_px);\n ctx.quadraticCurveTo(cp_x, top_cp_y, params.last_x_px + last_x_shift, last_y_px);\n ctx.quadraticCurveTo(cp_x, bottom_cp_y, params.first_x_px + first_x_shift, first_y_px);\n ctx.closePath();\n ctx.fill();\n }\n }\n renderText(first_x_px, last_x_px) {\n var _a, _b, _c;\n if (!this.text)\n return;\n const ctx = this.checkContext();\n let center_x = (first_x_px + last_x_px) / 2;\n center_x -= ctx.measureText(this.text).width / 2;\n const stave = (_b = (_a = this.notes.first_note) === null || _a === void 0 ? void 0 : _a.checkStave()) !== null && _b !== void 0 ? _b : (_c = this.notes.last_note) === null || _c === void 0 ? void 0 : _c.checkStave();\n if (stave) {\n ctx.save();\n ctx.setFont(this.textFont);\n ctx.fillText(this.text, center_x + this.render_options.text_shift_x, stave.getYForTopText() - 1);\n ctx.restore();\n }\n }\n draw() {\n this.checkContext();\n this.setRendered();\n const first_note = this.notes.first_note;\n const last_note = this.notes.last_note;\n // Provide some default values so the compiler doesn't complain.\n let first_x_px = 0;\n let last_x_px = 0;\n let first_ys = [0];\n let last_ys = [0];\n let stem_direction = 0;\n if (first_note) {\n first_x_px = first_note.getTieRightX() + this.render_options.tie_spacing;\n stem_direction = first_note.getStemDirection();\n first_ys = first_note.getYs();\n }\n else if (last_note) {\n const stave = last_note.checkStave();\n first_x_px = stave.getTieStartX();\n first_ys = last_note.getYs();\n this.notes.first_indices = this.notes.last_indices;\n }\n if (last_note) {\n last_x_px = last_note.getTieLeftX() + this.render_options.tie_spacing;\n stem_direction = last_note.getStemDirection();\n last_ys = last_note.getYs();\n }\n else if (first_note) {\n const stave = first_note.checkStave();\n last_x_px = stave.getTieEndX();\n last_ys = first_note.getYs();\n this.notes.last_indices = this.notes.first_indices;\n }\n if (this.direction) {\n stem_direction = this.direction;\n }\n this.renderTie({\n first_x_px,\n last_x_px,\n first_ys,\n last_ys,\n direction: stem_direction,\n });\n this.renderText(first_x_px, last_x_px);\n return true;\n }\n}\n/** Default text font. */\nStaveTie.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n","// / [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This class implements varies types of ties between contiguous notes. The\n// ties include: regular ties, hammer ons, pull offs, and slides.\nimport { StaveTie } from './stavetie';\nimport { Category } from './typeguard';\nexport class TabTie extends StaveTie {\n static get CATEGORY() {\n return Category.TabTie;\n }\n static createHammeron(notes) {\n return new TabTie(notes, 'H');\n }\n static createPulloff(notes) {\n return new TabTie(notes, 'P');\n }\n /**\n * @param notes is a struct that has:\n * {\n * first_note: Note,\n * last_note: Note,\n * first_indices: [n1, n2, n3],\n * last_indices: [n1, n2, n3]\n * }\n *\n * @param text\n */\n constructor(notes, text) {\n super(notes, text);\n this.render_options.cp1 = 9;\n this.render_options.cp2 = 11;\n this.render_options.y_shift = 3;\n this.direction = -1; // Tab tie's are always face up.\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements `GraceNoteGroup` which is used to format and\n// render grace notes.\nimport { Beam } from './beam';\nimport { Formatter } from './formatter';\nimport { Modifier } from './modifier';\nimport { StaveTie } from './stavetie';\nimport { Tables } from './tables';\nimport { TabTie } from './tabtie';\nimport { Category, isStaveNote } from './typeguard';\nimport { log } from './util';\nimport { Voice } from './voice';\n// To enable logging for this class. Set `GraceNoteGroup.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (GraceNoteGroup.DEBUG)\n log('Vex.Flow.GraceNoteGroup', args);\n}\n/** GraceNoteGroup is used to format and render grace notes. */\nexport class GraceNoteGroup extends Modifier {\n //** `GraceNoteGroup` inherits from `Modifier` and is placed inside a `ModifierContext`. */\n constructor(grace_notes, show_slur) {\n super();\n this.preFormatted = false;\n this.position = Modifier.Position.LEFT;\n this.grace_notes = grace_notes;\n this.width = 0;\n this.show_slur = show_slur;\n this.slur = undefined;\n this.voice = new Voice({\n num_beats: 4,\n beat_value: 4,\n resolution: Tables.RESOLUTION,\n }).setStrict(false);\n this.render_options = {\n slur_y_shift: 0,\n };\n this.beams = [];\n this.voice.addTickables(this.grace_notes);\n return this;\n }\n static get CATEGORY() {\n return Category.GraceNoteGroup;\n }\n /** Arranges groups inside a `ModifierContext`. */\n static format(gracenote_groups, state) {\n const group_spacing_stave = 4;\n const group_spacing_tab = 0;\n if (!gracenote_groups || gracenote_groups.length === 0)\n return false;\n const group_list = [];\n let prev_note = null;\n let shiftL = 0;\n for (let i = 0; i < gracenote_groups.length; ++i) {\n const gracenote_group = gracenote_groups[i];\n const note = gracenote_group.getNote();\n const is_stavenote = isStaveNote(note);\n const spacing = is_stavenote ? group_spacing_stave : group_spacing_tab;\n if (is_stavenote && note !== prev_note) {\n // Iterate through all notes to get the displaced pixels\n for (let n = 0; n < note.keys.length; ++n) {\n shiftL = Math.max(note.getLeftDisplacedHeadPx(), shiftL);\n }\n prev_note = note;\n }\n group_list.push({ shift: shiftL, gracenote_group, spacing });\n }\n // If first note left shift in case it is displaced\n let group_shift = group_list[0].shift;\n let formatWidth;\n for (let i = 0; i < group_list.length; ++i) {\n const gracenote_group = group_list[i].gracenote_group;\n gracenote_group.preFormat();\n formatWidth = gracenote_group.getWidth() + group_list[i].spacing;\n group_shift = Math.max(formatWidth, group_shift);\n }\n for (let i = 0; i < group_list.length; ++i) {\n const gracenote_group = group_list[i].gracenote_group;\n formatWidth = gracenote_group.getWidth() + group_list[i].spacing;\n gracenote_group.setSpacingFromNextModifier(group_shift - Math.min(formatWidth, group_shift));\n }\n state.left_shift += group_shift;\n return true;\n }\n preFormat() {\n if (this.preFormatted)\n return;\n if (!this.formatter) {\n this.formatter = new Formatter();\n }\n this.formatter.joinVoices([this.voice]).format([this.voice], 0, {});\n this.setWidth(this.formatter.getMinTotalWidth());\n this.preFormatted = true;\n }\n beamNotes(grace_notes) {\n grace_notes = grace_notes || this.grace_notes;\n if (grace_notes.length > 1) {\n const beam = new Beam(grace_notes);\n beam.render_options.beam_width = 3;\n beam.render_options.partial_beam_length = 4;\n this.beams.push(beam);\n }\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n getWidth() {\n return this.width;\n }\n getGraceNotes() {\n return this.grace_notes;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n L('Drawing grace note group for:', note);\n this.alignSubNotesWithNote(this.getGraceNotes(), note); // Modifier function\n // Draw grace notes.\n this.grace_notes.forEach((graceNote) => graceNote.setContext(ctx).draw());\n // Draw beams.\n this.beams.forEach((beam) => beam.setContext(ctx).draw());\n if (this.show_slur) {\n // Create and draw slur.\n const is_stavenote = isStaveNote(note);\n const TieClass = is_stavenote ? StaveTie : TabTie;\n this.slur = new TieClass({\n last_note: this.grace_notes[0],\n first_note: note,\n first_indices: [0],\n last_indices: [0],\n });\n this.slur.render_options.cp2 = 12;\n this.slur.render_options.y_shift = (is_stavenote ? 7 : 5) + this.render_options.slur_y_shift;\n this.slur.setContext(ctx).draw();\n }\n }\n}\nGraceNoteGroup.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2016\n//\n// ## Description\n//\n// This file implements `NoteSubGroup` which is used to format and\n// render notes as a `Modifier`\n// ex) ClefNote, TimeSigNote and BarNote.\nimport { Formatter } from './formatter';\nimport { Modifier } from './modifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { Voice } from './voice';\nexport class NoteSubGroup extends Modifier {\n constructor(subNotes) {\n super();\n this.preFormatted = false;\n this.position = Modifier.Position.LEFT;\n this.subNotes = subNotes;\n this.subNotes.forEach((subNote) => {\n subNote.setIgnoreTicks(false);\n });\n this.width = 0;\n this.formatter = new Formatter();\n this.voice = new Voice({\n num_beats: 4,\n beat_value: 4,\n resolution: Tables.RESOLUTION,\n }).setStrict(false);\n this.voice.addTickables(this.subNotes);\n }\n static get CATEGORY() {\n return Category.NoteSubGroup;\n }\n // Arrange groups inside a `ModifierContext`\n static format(groups, state) {\n if (!groups || groups.length === 0)\n return false;\n let width = 0;\n for (let i = 0; i < groups.length; ++i) {\n const group = groups[i];\n group.preFormat();\n width += group.getWidth();\n }\n state.left_shift += width;\n return true;\n }\n preFormat() {\n if (this.preFormatted)\n return;\n this.formatter.joinVoices([this.voice]).format([this.voice], 0);\n this.setWidth(this.formatter.getMinTotalWidth());\n this.preFormatted = true;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n getWidth() {\n return this.width;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n this.alignSubNotesWithNote(this.subNotes, note); // Modifier function\n this.subNotes.forEach((subNote) => subNote.setContext(ctx).drawWithStyle());\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// A formatter for abstract tickable objects, such as notes, chords,\n// tabs, etc.\nimport { Fraction } from './fraction';\nimport { RuntimeError } from './util';\n/**\n * TickContext formats abstract tickable objects, such as notes, chords, tabs, etc.\n */\nexport class TickContext {\n constructor(options) {\n this.preFormatted = false;\n this.postFormatted = false;\n this.tickID = options && options.tickID ? options.tickID : 0;\n this.currentTick = new Fraction(0, 1);\n this.maxTicks = new Fraction(0, 1);\n this.maxTickable = undefined; // Biggest tickable\n this.minTicks = undefined; // this can remian null if all tickables have ignore_ticks\n this.minTickable = undefined;\n this.padding = 1; // padding on each side (width += padding * 2)\n this.x = 0;\n this.xBase = 0; // base x position without xOffset\n this.xOffset = 0; // xBase and xOffset are an alternative way to describe x (x = xB + xO)\n this.tickables = []; // Notes, tabs, chords, lyrics.\n this.tickablesByVoice = {}; // Tickables indexed by voice number\n // Formatting metrics\n this.notePx = 0; // width of widest note in this context\n this.glyphPx = 0; // width of glyph (note head)\n this.leftDisplacedHeadPx = 0; // Extra left pixels for displaced notes\n this.rightDisplacedHeadPx = 0; // Extra right pixels for displaced notes\n this.modLeftPx = 0; // Left modifier pixels\n this.modRightPx = 0; // Right modifier pixels\n this.totalLeftPx = 0; // Total left pixels\n this.totalRightPx = 0; // Total right pixels\n this.tContexts = []; // Parent array of tick contexts\n this.width = 0;\n this.formatterMetrics = {\n // The freedom of a tickcontext is the distance it can move without colliding\n // with neighboring elements. A formatter can set these values during its\n // formatting pass, which a different formatter can then use to fine tune.\n freedom: { left: 0, right: 0 },\n };\n }\n static getNextContext(tContext) {\n const contexts = tContext.tContexts;\n const index = contexts.indexOf(tContext);\n if (index + 1 < contexts.length)\n return contexts[index + 1];\n }\n getTickID() {\n return this.tickID;\n }\n getX() {\n return this.x;\n }\n setX(x) {\n this.x = x;\n this.xBase = x;\n this.xOffset = 0;\n return this;\n }\n getXBase() {\n return this.xBase;\n } // use of xBase and xOffset is optional, avoids offset creep\n setXBase(xBase) {\n this.xBase = xBase;\n this.x = xBase + this.xOffset;\n }\n getXOffset() {\n return this.xOffset;\n }\n setXOffset(xOffset) {\n this.xOffset = xOffset;\n this.x = this.xBase + xOffset;\n }\n getWidth() {\n return this.width + this.padding * 2;\n }\n setPadding(padding) {\n this.padding = padding;\n return this;\n }\n getMaxTicks() {\n return this.maxTicks;\n }\n getMinTicks() {\n return this.minTicks;\n }\n getMaxTickable() {\n return this.maxTickable;\n }\n getMinTickable() {\n return this.minTickable;\n }\n getTickables() {\n return this.tickables;\n }\n /**\n * Introduced on 2020-04-17 as getTickablesForVoice(voiceIndex).\n * https://github.com/0xfe/vexflow/blame/dc97b0cc5bb93171c0038638c34362dc958222ca/src/tickcontext.js#L63\n * Renamed on 2021-08-05 to getTickableForVoice(voiceIndex). Method renamed to singular, since it returns one Tickable.\n */\n getTickableForVoice(voiceIndex) {\n return this.tickablesByVoice[voiceIndex];\n }\n getTickablesByVoice() {\n return this.tickablesByVoice;\n }\n getCenterAlignedTickables() {\n return this.tickables.filter((tickable) => tickable.isCenterAligned());\n }\n /** Gets widths context, note and left/right modifiers for formatting. */\n getMetrics() {\n const { width, glyphPx, notePx, leftDisplacedHeadPx, rightDisplacedHeadPx, modLeftPx, modRightPx, totalLeftPx, totalRightPx, } = this;\n return {\n width,\n glyphPx,\n notePx,\n leftDisplacedHeadPx,\n rightDisplacedHeadPx,\n modLeftPx,\n modRightPx,\n totalLeftPx,\n totalRightPx,\n };\n }\n getCurrentTick() {\n return this.currentTick;\n }\n setCurrentTick(tick) {\n this.currentTick = tick;\n this.preFormatted = false;\n }\n addTickable(tickable, voiceIndex) {\n if (!tickable) {\n throw new RuntimeError('BadArgument', 'Invalid tickable added.');\n }\n if (!tickable.shouldIgnoreTicks()) {\n const ticks = tickable.getTicks();\n if (ticks.greaterThan(this.maxTicks)) {\n this.maxTicks = ticks.clone();\n this.maxTickable = tickable;\n }\n if (this.minTicks == null) {\n this.minTicks = ticks.clone();\n this.minTickable = tickable;\n }\n else if (ticks.lessThan(this.minTicks)) {\n this.minTicks = ticks.clone();\n this.minTickable = tickable;\n }\n }\n tickable.setTickContext(this);\n this.tickables.push(tickable);\n this.tickablesByVoice[voiceIndex || 0] = tickable;\n this.preFormatted = false;\n return this;\n }\n preFormat() {\n if (this.preFormatted)\n return this;\n for (let i = 0; i < this.tickables.length; ++i) {\n const tickable = this.tickables[i];\n tickable.preFormat();\n const metrics = tickable.getMetrics();\n // Maintain max displaced head pixels from all tickables in the context\n this.leftDisplacedHeadPx = Math.max(this.leftDisplacedHeadPx, metrics.leftDisplacedHeadPx);\n this.rightDisplacedHeadPx = Math.max(this.rightDisplacedHeadPx, metrics.rightDisplacedHeadPx);\n // Maintain the widest note for all tickables in the context\n this.notePx = Math.max(this.notePx, metrics.notePx);\n // Maintain the widest note head\n this.glyphPx = Math.max(this.glyphPx, metrics.glyphWidth || 0);\n // Total modifier shift\n this.modLeftPx = Math.max(this.modLeftPx, metrics.modLeftPx);\n this.modRightPx = Math.max(this.modRightPx, metrics.modRightPx);\n // Total shift\n this.totalLeftPx = Math.max(this.totalLeftPx, metrics.modLeftPx + metrics.leftDisplacedHeadPx);\n this.totalRightPx = Math.max(this.totalRightPx, metrics.modRightPx + metrics.rightDisplacedHeadPx);\n // Recalculate the tick context total width\n this.width = this.notePx + this.totalLeftPx + this.totalRightPx;\n }\n return this;\n }\n postFormat() {\n if (this.postFormatted)\n return this;\n this.postFormatted = true;\n return this;\n }\n getFormatterMetrics() {\n return this.formatterMetrics;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Cyril Silverman\n// MIT License\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { TickContext } from './tickcontext';\nimport { Category, isTabNote } from './typeguard';\nimport { defined, log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Ornament.DEBUG)\n log('Vex.Flow.Ornament', args);\n}\n/**\n * Ornament implements ornaments as modifiers that can be\n * attached to notes. The complete list of ornaments is available in\n * `tables.ts` under `Vex.Flow.ornamentCodes`.\n *\n * See `tests/ornament_tests.ts` for usage examples.\n */\nexport class Ornament extends Modifier {\n /**\n * Create a new ornament of type `type`, which is an entry in\n * `Vex.Flow.ornamentCodes` in `tables.ts`.\n */\n constructor(type) {\n super();\n this.type = type;\n this.delayed = false;\n this.render_options = {\n font_scale: 38,\n accidentalLowerPadding: 3,\n accidentalUpperPadding: 3,\n };\n this.ornament = Tables.ornamentCodes(this.type);\n // new ornaments have their origin at the origin, and have more specific\n // metrics. Legacy ornaments do some\n // x scaling, and have hard-coded metrics\n const metrics = this.getMetrics();\n // some jazz ornaments are above or below depending on stem direction.\n this.adjustForStemDirection = false;\n // some jazz ornaments like falls are supposed to overlap with future bars\n // and so we report a different width than they actually take up.\n this.reportedWidth = metrics && metrics.reportedWidth ? metrics.reportedWidth : 0;\n this.stemUpYOffset = metrics && metrics.stemUpYOffset ? metrics.stemUpYOffset : 0;\n this.ornamentAlignWithNoteHead = Ornament.ornamentAlignWithNoteHead.indexOf(this.type) >= 0;\n if (!this.ornament) {\n throw new RuntimeError('ArgumentError', `Ornament not found: '${this.type}'`);\n }\n this.x_shift = metrics ? metrics.xOffset : 0;\n this.y_shift = metrics ? metrics.yOffset : 0;\n this.glyph = new Glyph(this.ornament.code, this.render_options.font_scale, {\n category: `ornament.${this.ornament.code}`,\n });\n // Is this a jazz ornament that goes between this note and the next note.\n if (Ornament.ornamentNoteTransition.indexOf(this.type) >= 0) {\n this.delayed = true;\n }\n // Legacy ornaments need this. I don't know why, but horizontal spacing issues\n // happen if I don't set it.\n if (!metrics) {\n this.glyph.setOrigin(0.5, 1.0); // FIXME: SMuFL won't require a vertical origin shift\n }\n }\n /** Ornaments category string. */\n static get CATEGORY() {\n return Category.Ornament;\n }\n /** Arrange ornaments inside `ModifierContext` */\n static format(ornaments, state) {\n if (!ornaments || ornaments.length === 0)\n return false;\n let width = 0; // width is used by ornaments, which are always centered on the note head\n let right_shift = state.right_shift; // jazz ornaments calculate r/l shift separately\n let left_shift = state.left_shift;\n let yOffset = 0;\n for (let i = 0; i < ornaments.length; ++i) {\n const ornament = ornaments[i];\n const increment = 2;\n if (Ornament.ornamentRelease.indexOf(ornament.type) >= 0) {\n ornament.x_shift += right_shift + 2;\n }\n if (Ornament.ornamentAttack.indexOf(ornament.type) >= 0) {\n ornament.x_shift -= left_shift + 2;\n }\n if (ornament.reportedWidth && ornament.x_shift < 0) {\n left_shift += ornament.reportedWidth;\n }\n else if (ornament.reportedWidth && ornament.x_shift > 0) {\n right_shift += ornament.reportedWidth;\n }\n else {\n width = Math.max(ornament.getWidth(), width);\n }\n // articulations above/below the line can be stacked.\n if (Ornament.ornamentArticulation.indexOf(ornament.type) >= 0) {\n // Unfortunately we don't know the stem direction. So we base it\n // on the line number, but also allow it to be overridden.\n const ornamentNote = defined(ornament.note, 'NoAttachedNote');\n if (ornamentNote.getLineNumber() >= 3 || ornament.getPosition() === Modifier.Position.ABOVE) {\n state.top_text_line += increment;\n ornament.y_shift += yOffset;\n yOffset -= ornament.glyph.bbox.getH();\n }\n else {\n state.text_line += increment;\n ornament.y_shift += yOffset;\n yOffset += ornament.glyph.bbox.getH();\n }\n }\n else {\n if (ornament.getPosition() === Modifier.Position.ABOVE) {\n ornament.setTextLine(state.top_text_line);\n state.top_text_line += increment;\n }\n else {\n ornament.setTextLine(state.text_line);\n state.text_line += increment;\n }\n }\n }\n // Note: 'legit' ornaments don't consider other modifiers when calculating their\n // X position, but jazz ornaments sometimes need to.\n state.left_shift = left_shift + width / 2;\n state.right_shift = right_shift + width / 2;\n return true;\n }\n /**\n * ornamentNoteTransition means the jazz ornament represents an effect from one note to another,\n * these are generally on the top of the staff.\n */\n static get ornamentNoteTransition() {\n return ['flip', 'jazzTurn', 'smear'];\n }\n /**\n * ornamentAttack indicates something that happens in the attach, placed before the note and\n * any accidentals\n */\n static get ornamentAttack() {\n return ['scoop'];\n }\n /**\n * The ornament is aligned based on the note head, but without regard to whether the\n * stem goes up or down.\n */\n static get ornamentAlignWithNoteHead() {\n return ['doit', 'fall', 'fallLong', 'doitLong', 'bend', 'plungerClosed', 'plungerOpen', 'scoop'];\n }\n /**\n * An ornament that happens on the release of the note, generally placed after the\n * note and overlapping the next beat/measure..\n */\n static get ornamentRelease() {\n return ['doit', 'fall', 'fallLong', 'doitLong', 'jazzTurn', 'smear', 'flip'];\n }\n /** ornamentArticulation goes above/below the note based on space availablity */\n static get ornamentArticulation() {\n return ['bend', 'plungerClosed', 'plungerOpen'];\n }\n /**\n * Legacy ornaments have hard-coded metrics. If additional ornament types are\n * added, get their metrics here.\n */\n // eslint-disable-next-line\n getMetrics() {\n return Tables.currentMusicFont().getMetrics().glyphs.jazzOrnaments[this.ornament.code];\n }\n /** Set whether the ornament is to be delayed. */\n setDelayed(delayed) {\n this.delayed = delayed;\n return this;\n }\n /** Set the upper accidental for the ornament. */\n setUpperAccidental(accid) {\n const scale = this.render_options.font_scale / 1.3;\n this.accidentalUpper = new Glyph(Tables.accidentalCodes(accid).code, scale);\n this.accidentalUpper.setOrigin(0.5, 1.0);\n return this;\n }\n /** Set the lower accidental for the ornament. */\n setLowerAccidental(accid) {\n const scale = this.render_options.font_scale / 1.3;\n this.accidentalLower = new Glyph(Tables.accidentalCodes(accid).code, scale);\n this.accidentalLower.setOrigin(0.5, 1.0);\n return this;\n }\n /** Render ornament in position next to note. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const stemDir = note.getStemDirection();\n const stave = note.checkStave();\n const classString = Object.keys(this.getAttribute('classes')).join(' ');\n ctx.openGroup(classString, this.getAttribute('id'));\n // Get stem extents\n const stemExtents = note.checkStem().getExtents();\n let y = stemDir === Stem.DOWN ? stemExtents.baseY : stemExtents.topY;\n // TabNotes don't have stems attached to them. Tab stems are rendered outside the stave.\n if (isTabNote(note)) {\n if (note.hasStem()) {\n if (stemDir === Stem.DOWN) {\n y = stave.getYForTopText(this.text_line);\n }\n }\n else {\n // Without a stem\n y = stave.getYForTopText(this.text_line);\n }\n }\n const isPlacedOnNoteheadSide = stemDir === Stem.DOWN;\n const spacing = stave.getSpacingBetweenLines();\n let lineSpacing = 1;\n // Beamed stems are longer than quarter note stems, adjust accordingly\n if (!isPlacedOnNoteheadSide && note.hasBeam()) {\n lineSpacing += 0.5;\n }\n const totalSpacing = spacing * (this.text_line + lineSpacing);\n const glyphYBetweenLines = y - totalSpacing;\n // Get initial coordinates for the modifier position\n const start = note.getModifierStartXY(this.position, this.index);\n let glyphX = start.x;\n // If the ornament is aligned with the note head, don't consider the stave y\n // but use the 'natural' modifier y\n let glyphY = this.ornamentAlignWithNoteHead\n ? start.y\n : Math.min(stave.getYForTopText(this.text_line), glyphYBetweenLines);\n glyphY += this.y_shift;\n // Ajdust x position if ornament is delayed\n if (this.delayed) {\n let delayXShift = 0;\n const startX = glyphX - (stave.getX() - 10);\n if (this.delayXShift !== undefined) {\n delayXShift = this.delayXShift;\n }\n else {\n delayXShift += this.glyph.getMetrics().width / 2;\n const nextContext = TickContext.getNextContext(note.getTickContext());\n if (nextContext) {\n delayXShift += (nextContext.getX() - startX) * 0.5;\n }\n else {\n delayXShift += (stave.getX() + stave.getWidth() - startX) * 0.5;\n }\n this.delayXShift = delayXShift;\n }\n glyphX += delayXShift;\n }\n L('Rendering ornament: ', this.ornament, glyphX, glyphY);\n if (this.accidentalLower) {\n this.accidentalLower.render(ctx, glyphX, glyphY);\n glyphY -= this.accidentalLower.getMetrics().height;\n glyphY -= this.render_options.accidentalLowerPadding;\n }\n if (this.stemUpYOffset && note.hasStem() && note.getStemDirection() === 1) {\n glyphY += this.stemUpYOffset;\n }\n if (note.getLineNumber() < 5 && Ornament.ornamentNoteTransition.indexOf(this.type) >= 0) {\n glyphY = note.checkStave().getBoundingBox().getY() + 40;\n }\n this.glyph.render(ctx, glyphX + this.x_shift, glyphY);\n if (this.accidentalUpper) {\n glyphY -= this.glyph.getMetrics().height + this.render_options.accidentalUpperPadding;\n this.accidentalUpper.render(ctx, glyphX, glyphY);\n }\n ctx.closeGroup();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Ornament.DEBUG` to `true`. */\nOrnament.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Rodrigo Vilar\n// MIT License\nimport { Glyph } from './glyph';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { Tables } from './tables';\nimport { Category, isGraceNote } from './typeguard';\n/** Parenthesis implements parenthesis modifiers for notes. */\nexport class Parenthesis extends Modifier {\n /**\n * Constructor\n *\n * @param position Modifier.Position.LEFT (default) or Modifier.Position.RIGHT\n */\n constructor(position) {\n super();\n this.position = position !== null && position !== void 0 ? position : Modifier.Position.LEFT;\n this.point = Tables.currentMusicFont().lookupMetric('parenthesis.default.point');\n this.setWidth(Tables.currentMusicFont().lookupMetric('parenthesis.default.width'));\n }\n static get CATEGORY() {\n return Category.Parenthesis;\n }\n /** Add parentheses to the notes. */\n static buildAndAttach(notes) {\n for (const note of notes) {\n for (let i = 0; i < note.keys.length; i++) {\n note.addModifier(new Parenthesis(ModifierPosition.LEFT), i);\n note.addModifier(new Parenthesis(ModifierPosition.RIGHT), i);\n }\n }\n }\n /** Arrange parentheses inside a ModifierContext. */\n static format(parentheses, state) {\n if (!parentheses || parentheses.length === 0)\n return false;\n let x_widthL = 0;\n let x_widthR = 0;\n for (let i = 0; i < parentheses.length; ++i) {\n const parenthesis = parentheses[i];\n const note = parenthesis.getNote();\n const pos = parenthesis.getPosition();\n const index = parenthesis.checkIndex();\n let shift = 0;\n if (pos === ModifierPosition.RIGHT) {\n shift = note.getRightParenthesisPx(index);\n x_widthR = x_widthR > shift + parenthesis.width ? x_widthR : shift + parenthesis.width;\n }\n if (pos === ModifierPosition.LEFT) {\n shift = note.getLeftParenthesisPx(index);\n x_widthL = x_widthL > shift + parenthesis.width ? x_widthL : shift + parenthesis.width;\n }\n parenthesis.setXShift(shift);\n }\n state.left_shift += x_widthL;\n state.right_shift += x_widthR;\n return true;\n }\n /** Set the associated note. */\n setNote(note) {\n this.note = note;\n this.point = Tables.currentMusicFont().lookupMetric('parenthesis.default.point');\n this.setWidth(Tables.currentMusicFont().lookupMetric('parenthesis.default.width'));\n if (isGraceNote(note)) {\n this.point = Tables.currentMusicFont().lookupMetric('parenthesis.gracenote.point');\n this.setWidth(Tables.currentMusicFont().lookupMetric('parenthesis.gracenote.width'));\n }\n return this;\n }\n /** Render the parenthesis. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(this.position, this.index, { forceFlagRight: true });\n const x = start.x + this.x_shift;\n const y = start.y + this.y_shift;\n if (this.position == Modifier.Position.RIGHT) {\n Glyph.renderGlyph(ctx, x + 1, y, this.point, 'noteheadParenthesisRight', {\n category: `noteHead.standard.noteheadParenthesisRight`,\n });\n }\n else if (this.position == Modifier.Position.LEFT) {\n Glyph.renderGlyph(ctx, x - 2, y, this.point, 'noteheadParenthesisLeft', {\n category: `noteHead.standard.noteheadParenthesisLeft`,\n });\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { BoundingBox } from './boundingbox';\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (NoteHead.DEBUG)\n log('Vex.Flow.NoteHead', args);\n}\n/**\n * Draw slashnote head manually. No glyph exists for this.\n * @param ctx the Canvas context\n * @param duration the duration of the note. ex: \"4\"\n * @param x the x coordinate to draw at\n * @param y the y coordinate to draw at\n * @param stem_direction the direction of the stem\n */\nfunction drawSlashNoteHead(ctx, duration, x, y, stem_direction, staveSpace) {\n const width = Tables.SLASH_NOTEHEAD_WIDTH;\n ctx.save();\n ctx.setLineWidth(Tables.STEM_WIDTH);\n let fill = false;\n if (Tables.durationToNumber(duration) > 2) {\n fill = true;\n }\n if (!fill)\n x -= (Tables.STEM_WIDTH / 2) * stem_direction;\n ctx.beginPath();\n ctx.moveTo(x, y + staveSpace);\n ctx.lineTo(x, y + 1);\n ctx.lineTo(x + width, y - staveSpace);\n ctx.lineTo(x + width, y);\n ctx.lineTo(x, y + staveSpace);\n ctx.closePath();\n if (fill) {\n ctx.fill();\n }\n else {\n ctx.stroke();\n }\n if (Tables.durationToFraction(duration).equals(0.5)) {\n const breve_lines = [-3, -1, width + 1, width + 3];\n for (let i = 0; i < breve_lines.length; i++) {\n ctx.beginPath();\n ctx.moveTo(x + breve_lines[i], y - 10);\n ctx.lineTo(x + breve_lines[i], y + 11);\n ctx.stroke();\n }\n }\n ctx.restore();\n}\n/**\n * `NoteHeads` are typically not manipulated\n * directly, but used internally in `StaveNote`.\n *\n * See `tests/notehead_tests.ts` for usage examples.\n */\nexport class NoteHead extends Note {\n constructor(noteStruct) {\n super(noteStruct);\n this.custom_glyph = false;\n this.stem_up_x_offset = 0;\n this.stem_down_x_offset = 0;\n this.index = noteStruct.index;\n this.x = noteStruct.x || 0;\n this.y = noteStruct.y || 0;\n if (noteStruct.note_type)\n this.noteType = noteStruct.note_type;\n this.displaced = noteStruct.displaced || false;\n this.stem_direction = noteStruct.stem_direction || Stem.UP;\n this.line = noteStruct.line || 0;\n // Get glyph code based on duration and note type. This could be\n // regular notes, rests, or other custom codes.\n this.glyph = Tables.getGlyphProps(this.duration, this.noteType);\n defined(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`);\n this.glyph_code = this.glyph.code_head;\n this.x_shift = noteStruct.x_shift || 0;\n if (noteStruct.custom_glyph_code) {\n this.custom_glyph = true;\n this.glyph_code = noteStruct.custom_glyph_code;\n this.stem_up_x_offset = noteStruct.stem_up_x_offset || 0;\n this.stem_down_x_offset = noteStruct.stem_down_x_offset || 0;\n }\n this.style = noteStruct.style;\n this.slashed = noteStruct.slashed || false;\n this.render_options = Object.assign(Object.assign({}, this.render_options), { \n // font size for note heads\n glyph_font_scale: noteStruct.glyph_font_scale || Tables.NOTATION_FONT_SCALE });\n this.setWidth(this.glyph.getWidth(this.render_options.glyph_font_scale));\n }\n static get CATEGORY() {\n return Category.NoteHead;\n }\n /** Get the width of the notehead. */\n getWidth() {\n return this.width;\n }\n /** Determine if the notehead is displaced. */\n isDisplaced() {\n return this.displaced === true;\n }\n /** Get the glyph data. */\n getGlyph() {\n return this.glyph;\n }\n /** Set the X coordinate. */\n setX(x) {\n this.x = x;\n return this;\n }\n /** Get the Y coordinate. */\n getY() {\n return this.y;\n }\n /** Set the Y coordinate. */\n setY(y) {\n this.y = y;\n return this;\n }\n /** Get the stave line the notehead is placed on. */\n getLine() {\n return this.line;\n }\n /** Set the stave line the notehead is placed on. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Get the canvas `x` coordinate position of the notehead. */\n getAbsoluteX() {\n // If the note has not been preformatted, then get the static x value\n // Otherwise, it's been formatted and we should use it's x value relative\n // to its tick context\n const x = !this.preFormatted ? this.x : super.getAbsoluteX();\n // For a more natural displaced notehead, we adjust the displacement amount\n // by half the stem width in order to maintain a slight overlap with the stem\n const displacementStemAdjustment = Stem.WIDTH / 2;\n const musicFont = Tables.currentMusicFont();\n const fontShift = musicFont.lookupMetric('notehead.shiftX', 0) * this.stem_direction;\n const displacedFontShift = musicFont.lookupMetric('noteHead.displaced.shiftX', 0) * this.stem_direction;\n return (x +\n fontShift +\n (this.displaced ? (this.width - displacementStemAdjustment) * this.stem_direction + displacedFontShift : 0));\n }\n /** Get the `BoundingBox` for the `NoteHead`. */\n getBoundingBox() {\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call getBoundingBox on an unformatted note.\");\n }\n const spacing = this.checkStave().getSpacingBetweenLines();\n const half_spacing = spacing / 2;\n const min_y = this.y - half_spacing;\n return new BoundingBox(this.getAbsoluteX(), min_y, this.width, spacing);\n }\n /** Set notehead to a provided `stave`. */\n setStave(stave) {\n const line = this.getLine();\n this.stave = stave;\n if (this.stave) {\n this.setY(this.stave.getYForNote(line));\n this.setContext(this.stave.getContext());\n }\n return this;\n }\n /** Pre-render formatting. */\n preFormat() {\n if (this.preFormatted)\n return this;\n const width = this.getWidth() + this.leftDisplacedHeadPx + this.rightDisplacedHeadPx;\n this.setWidth(width);\n this.preFormatted = true;\n return this;\n }\n /** Draw the notehead. */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n let head_x = this.getAbsoluteX();\n if (this.custom_glyph) {\n // head_x += this.x_shift;\n head_x += this.stem_direction === Stem.UP ? this.stem_up_x_offset : this.stem_down_x_offset;\n }\n const y = this.y;\n L(\"Drawing note head '\", this.noteType, this.duration, \"' at\", head_x, y);\n // Begin and end positions for head.\n const stem_direction = this.stem_direction;\n const glyph_font_scale = this.render_options.glyph_font_scale;\n if (this.style) {\n this.applyStyle(ctx);\n }\n const categorySuffix = `${this.glyph_code}Stem${stem_direction === Stem.UP ? 'Up' : 'Down'}`;\n if (this.noteType === 's') {\n const staveSpace = this.checkStave().getSpacingBetweenLines();\n drawSlashNoteHead(ctx, this.duration, head_x, y, stem_direction, staveSpace);\n }\n else {\n Glyph.renderGlyph(ctx, head_x, y, glyph_font_scale, this.glyph_code, {\n category: this.custom_glyph ? `noteHead.custom.${categorySuffix}` : `noteHead.standard.${categorySuffix}`,\n });\n }\n if (this.style) {\n this.restoreStyle(ctx);\n }\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.NoteHead.DEBUG` to `true`. */\nNoteHead.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// `StemmableNote` is an abstract interface for notes with optional stems.\n// Examples of stemmable notes are `StaveNote` and `TabNote`\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StemmableNote extends Note {\n constructor(noteStruct) {\n super(noteStruct);\n }\n static get CATEGORY() {\n return Category.StemmableNote;\n }\n // Get and set the note's `Stem`\n getStem() {\n return this.stem;\n }\n checkStem() {\n if (!this.stem) {\n throw new RuntimeError('NoStem', 'No stem attached to instance');\n }\n return this.stem;\n }\n setStem(stem) {\n this.stem = stem;\n return this;\n }\n // Builds and sets a new stem\n buildStem() {\n const stem = new Stem();\n this.setStem(stem);\n return this;\n }\n buildFlag(category = 'flag') {\n const { glyph } = this;\n if (this.hasFlag()) {\n const flagCode = this.getStemDirection() === Stem.DOWN ? glyph.code_flag_downstem : glyph.code_flag_upstem;\n this.flag = new Glyph(flagCode, this.render_options.glyph_font_scale, { category });\n }\n }\n // Get the custom glyph associated with the outer note head on the base of the stem.\n getBaseCustomNoteHeadGlyph() {\n if (this.getStemDirection() === Stem.DOWN) {\n return this.customGlyphs[this.customGlyphs.length - 1];\n }\n else {\n return this.customGlyphs[0];\n }\n }\n // Get the full length of stem\n getStemLength() {\n return Stem.HEIGHT + this.getStemExtension();\n }\n // Get the number of beams for this duration\n getBeamCount() {\n const glyph = this.getGlyph();\n if (glyph) {\n return glyph.beam_count;\n }\n else {\n return 0;\n }\n }\n // Get the minimum length of stem\n getStemMinimumLength() {\n const frac = Tables.durationToFraction(this.duration);\n let length = frac.value() <= 1 ? 0 : 20;\n // if note is flagged, cannot shorten beam\n switch (this.duration) {\n case '8':\n if (this.beam == undefined)\n length = 35;\n break;\n case '16':\n length = this.beam == undefined ? 35 : 25;\n break;\n case '32':\n length = this.beam == undefined ? 45 : 35;\n break;\n case '64':\n length = this.beam == undefined ? 50 : 40;\n break;\n case '128':\n length = this.beam == undefined ? 55 : 45;\n break;\n default:\n break;\n }\n return length;\n }\n // Get/set the direction of the stem\n getStemDirection() {\n if (!this.stem_direction)\n throw new RuntimeError('NoStem', 'No stem attached to this note.');\n return this.stem_direction;\n }\n setStemDirection(direction) {\n if (!direction)\n direction = Stem.UP;\n if (direction !== Stem.UP && direction !== Stem.DOWN) {\n throw new RuntimeError('BadArgument', `Invalid stem direction: ${direction}`);\n }\n this.stem_direction = direction;\n // Reset and reformat everything. Flag has to be built before calling getStemExtension.\n this.reset();\n if (this.hasFlag()) {\n this.buildFlag();\n }\n this.beam = undefined;\n if (this.stem) {\n this.stem.setDirection(direction);\n this.stem.setExtension(this.getStemExtension());\n // Lookup the base custom notehead (closest to the base of the stem) to extend or shorten\n // the stem appropriately. If there's no custom note head, lookup the standard notehead.\n const glyph = this.getBaseCustomNoteHeadGlyph() || this.getGlyph();\n // Get the font-specific customizations for the note heads.\n const offsets = Tables.currentMusicFont().lookupMetric(`stem.noteHead.${glyph.code_head}`, {\n offsetYBaseStemUp: 0,\n offsetYTopStemUp: 0,\n offsetYBaseStemDown: 0,\n offsetYTopStemDown: 0,\n });\n // Configure the stem to use these offsets.\n this.stem.setOptions({\n stem_up_y_offset: offsets.offsetYTopStemUp,\n stem_down_y_offset: offsets.offsetYTopStemDown,\n stem_up_y_base_offset: offsets.offsetYBaseStemUp,\n stem_down_y_base_offset: offsets.offsetYBaseStemDown, // glyph.stem_down_y_base_offset,\n });\n }\n if (this.preFormatted) {\n this.preFormat();\n }\n return this;\n }\n // Get the `x` coordinate of the stem\n getStemX() {\n const x_begin = this.getAbsoluteX() + this.x_shift;\n const x_end = this.getAbsoluteX() + this.x_shift + this.getGlyphWidth();\n const stem_x = this.stem_direction === Stem.DOWN ? x_begin : x_end;\n return stem_x;\n }\n // Get the `x` coordinate for the center of the glyph.\n // Used for `TabNote` stems and stemlets over rests\n getCenterGlyphX() {\n return this.getAbsoluteX() + this.x_shift + this.getGlyphWidth() / 2;\n }\n // Get the stem extension for the current duration\n getStemExtension() {\n const glyph = this.getGlyph();\n if (this.stem_extension_override != undefined) {\n return this.stem_extension_override;\n }\n // Use stem_beam_extension with beams\n if (this.beam) {\n return glyph.stem_beam_extension;\n }\n const flagCode = this.getStemDirection() === Stem.DOWN ? this.glyph.code_flag_downstem : this.glyph.code_flag_upstem;\n return Math.abs(Tables.currentMusicFont().lookupMetric(`glyphs.flag.${flagCode}.shiftY`, 0));\n }\n // Set the stem length to a specific. Will override the default length.\n setStemLength(height) {\n this.stem_extension_override = height - Stem.HEIGHT;\n return this;\n }\n // Get the top and bottom `y` values of the stem.\n getStemExtents() {\n if (!this.stem)\n throw new RuntimeError('NoStem', 'No stem attached to this note.');\n return this.stem.getExtents();\n }\n /** Gets the `y` value for the top modifiers at a specific `textLine`. */\n getYForTopText(textLine) {\n const stave = this.checkStave();\n if (this.hasStem()) {\n const extents = this.getStemExtents();\n if (!extents)\n throw new RuntimeError('InvalidState', 'Stem does not have extents.');\n return Math.min(stave.getYForTopText(textLine), extents.topY - this.render_options.annotation_spacing * (textLine + 1));\n }\n else {\n return stave.getYForTopText(textLine);\n }\n }\n /** Gets the `y` value for the bottom modifiers at a specific `textLine`. */\n getYForBottomText(textLine) {\n const stave = this.checkStave();\n if (this.hasStem()) {\n const extents = this.getStemExtents();\n if (!extents)\n throw new RuntimeError('InvalidState', 'Stem does not have extents.');\n return Math.max(stave.getYForTopText(textLine), extents.baseY + this.render_options.annotation_spacing * textLine);\n }\n else {\n return stave.getYForBottomText(textLine);\n }\n }\n hasFlag() {\n return Tables.getGlyphProps(this.duration).flag && !this.beam;\n }\n /** Post formats the note. */\n postFormat() {\n var _a;\n (_a = this.beam) === null || _a === void 0 ? void 0 : _a.postFormat();\n this.postFormatted = true;\n return this;\n }\n /** Renders the stem onto the canvas. */\n drawStem(stemOptions) {\n var _a;\n this.checkContext();\n this.setRendered();\n this.setStem(new Stem(stemOptions));\n (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setContext(this.getContext()).draw();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// This file implements notes for standard notation. This consists of one or\n// more `NoteHeads`, an optional stem, and an optional flag.\n//\n// Throughout these comments, a \"note\" refers to the entire `StaveNote`,\n// and a \"key\" refers to a specific pitch/notehead within a note.\n//\n// See `tests/stavenote_tests.ts` for usage examples.\nimport { BoundingBox } from './boundingbox';\nimport { Modifier } from './modifier';\nimport { NoteHead } from './notehead';\nimport { Stem } from './stem';\nimport { StemmableNote } from './stemmablenote';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, log, midLine, RuntimeError, warn } from './util';\nfunction showDeprecationWarningForNoteHeads() {\n // eslint-disable-next-line\n console.warn('StaveNote.note_heads is deprecated. Use StaveNote.noteHeads instead.', 'This accessor will be removed in VexFlow 5.0.');\n}\n// To enable logging for this class. Set `Vex.Flow.StaveNote.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (StaveNote.DEBUG)\n log('Vex.Flow.StaveNote', args);\n}\nconst isInnerNoteIndex = (note, index) => index === (note.getStemDirection() === Stem.UP ? note.keyProps.length - 1 : 0);\n// Helper methods for rest positioning in ModifierContext.\nfunction shiftRestVertical(rest, note, dir) {\n const delta = dir;\n rest.line += delta;\n rest.maxLine += delta;\n rest.minLine += delta;\n rest.note.setKeyLine(0, rest.note.getKeyLine(0) + delta);\n}\n// Called from formatNotes :: center a rest between two notes\nfunction centerRest(rest, noteU, noteL) {\n const delta = rest.line - midLine(noteU.minLine, noteL.maxLine);\n rest.note.setKeyLine(0, rest.note.getKeyLine(0) - delta);\n rest.line -= delta;\n rest.maxLine -= delta;\n rest.minLine -= delta;\n}\nexport class StaveNote extends StemmableNote {\n constructor(noteStruct) {\n var _a, _b, _c;\n super(noteStruct);\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // INSTANCE MEMBERS\n this.minLine = 0;\n this.maxLine = 0;\n this.ledgerLineStyle = {};\n this.clef = (_a = noteStruct.clef) !== null && _a !== void 0 ? _a : 'treble';\n this.octave_shift = (_b = noteStruct.octave_shift) !== null && _b !== void 0 ? _b : 0;\n // Pull note rendering properties.\n this.glyph = Tables.getGlyphProps(this.duration, this.noteType);\n defined(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`);\n // if true, displace note to right\n this.displaced = false;\n this.dot_shiftY = 0;\n // for displaced ledger lines\n this.use_default_head_x = false;\n // Drawing\n this._noteHeads = [];\n this.modifiers = [];\n this.render_options = Object.assign(Object.assign({}, this.render_options), { \n // font size for note heads and rests\n glyph_font_scale: noteStruct.glyph_font_scale || Tables.NOTATION_FONT_SCALE, \n // number of stroke px to the left and right of head\n stroke_px: noteStruct.stroke_px || StaveNote.LEDGER_LINE_OFFSET });\n this.calculateKeyProps();\n this.buildStem();\n // Set the stem direction\n if (noteStruct.auto_stem) {\n this.autoStem();\n }\n else {\n this.setStemDirection((_c = noteStruct.stem_direction) !== null && _c !== void 0 ? _c : Stem.UP);\n }\n this.reset();\n this.buildFlag();\n }\n static get CATEGORY() {\n return Category.StaveNote;\n }\n /**\n * @deprecated Use Stem.UP.\n */\n static get STEM_UP() {\n return Stem.UP;\n }\n /**\n * @deprecated Use Stem.DOWN.\n */\n static get STEM_DOWN() {\n return Stem.DOWN;\n }\n static get LEDGER_LINE_OFFSET() {\n return 3;\n }\n static get minNoteheadPadding() {\n const musicFont = Tables.currentMusicFont();\n return musicFont.lookupMetric('glyphs.noteHead.minPadding');\n }\n /** Format notes inside a ModifierContext. */\n static format(notes, state) {\n if (!notes || notes.length < 2)\n return false;\n const notesList = [];\n for (let i = 0; i < notes.length; i++) {\n const props = notes[i].getKeyProps();\n const line = props[0].line;\n let minL = props[props.length - 1].line;\n const stemDirection = notes[i].getStemDirection();\n const stemMax = notes[i].getStemLength() / 10;\n const stemMin = notes[i].getStemMinimumLength() / 10;\n let maxL;\n if (notes[i].isRest()) {\n maxL = line + notes[i].glyph.line_above;\n minL = line - notes[i].glyph.line_below;\n }\n else {\n maxL = stemDirection === 1 ? props[props.length - 1].line + stemMax : props[props.length - 1].line;\n minL = stemDirection === 1 ? props[0].line : props[0].line - stemMax;\n }\n notesList.push({\n line: props[0].line,\n maxLine: maxL,\n minLine: minL,\n isrest: notes[i].isRest(),\n stemDirection: stemDirection,\n stemMax,\n stemMin,\n voice_shift: notes[i].getVoiceShiftWidth(),\n is_displaced: notes[i].isDisplaced(),\n note: notes[i],\n });\n }\n const voices = notesList.length;\n let noteU = notesList[0];\n const noteM = voices > 2 ? notesList[1] : undefined;\n let noteL = voices > 2 ? notesList[2] : notesList[1];\n // for two voice backward compatibility, ensure upper voice is stems up\n // for three voices, the voices must be in order (upper, middle, lower)\n if (voices === 2 && noteU.stemDirection === -1 && noteL.stemDirection === 1) {\n noteU = notesList[1];\n noteL = notesList[0];\n }\n const voiceXShift = Math.max(noteU.voice_shift, noteL.voice_shift);\n let xShift = 0;\n // Test for two voice note intersection\n if (voices === 2) {\n const lineSpacing = noteU.stemDirection === noteL.stemDirection ? 0.0 : 0.5;\n if (noteU.minLine <= noteL.maxLine + lineSpacing) {\n if (noteU.isrest) {\n // shift rest up\n shiftRestVertical(noteU, noteL, 1);\n }\n else if (noteL.isrest) {\n // shift rest down\n shiftRestVertical(noteL, noteU, -1);\n }\n else if (noteU.stemDirection === noteL.stemDirection) {\n // upper voice is middle voice, so shift it right\n xShift = voiceXShift + 2;\n noteU.note.setXShift(xShift);\n }\n else {\n // shift lower voice right\n xShift = voiceXShift + 2;\n noteL.note.setXShift(xShift);\n }\n }\n // format complete\n state.right_shift += xShift;\n return true;\n }\n if (!noteM)\n throw new RuntimeError('InvalidState', 'noteM not defined.');\n // For three voices, test if rests can be repositioned\n //\n // Special case 1 :: middle voice rest between two notes\n //\n if (noteM.isrest && !noteU.isrest && !noteL.isrest) {\n if (noteU.minLine <= noteM.maxLine || noteM.minLine <= noteL.maxLine) {\n const restHeight = noteM.maxLine - noteM.minLine;\n const space = noteU.minLine - noteL.maxLine;\n if (restHeight < space) {\n // center middle voice rest between the upper and lower voices\n centerRest(noteM, noteU, noteL);\n }\n else {\n xShift = voiceXShift + 2; // shift middle rest right\n noteM.note.setXShift(xShift);\n if (noteL.note.hasBeam() === false) {\n noteL.stemDirection = -1;\n noteL.note.setStemDirection(-1);\n }\n if (noteU.minLine <= noteL.maxLine && noteU.note.hasBeam() === false) {\n noteU.stemDirection = 1;\n noteU.note.setStemDirection(1);\n }\n }\n // format complete\n state.right_shift += xShift;\n return true;\n }\n }\n // Special case 2 :: all voices are rests\n if (noteU.isrest && noteM.isrest && noteL.isrest) {\n // Shift upper voice rest up\n shiftRestVertical(noteU, noteM, 1);\n // Shift lower voice rest down\n shiftRestVertical(noteL, noteM, -1);\n // format complete\n state.right_shift += xShift;\n return true;\n }\n // Test if any other rests can be repositioned\n if (noteM.isrest && noteU.isrest && noteM.minLine <= noteL.maxLine) {\n // Shift middle voice rest up\n shiftRestVertical(noteM, noteL, 1);\n }\n if (noteM.isrest && noteL.isrest && noteU.minLine <= noteM.maxLine) {\n // Shift middle voice rest down\n shiftRestVertical(noteM, noteU, -1);\n }\n if (noteU.isrest && noteU.minLine <= noteM.maxLine) {\n // shift upper voice rest up;\n shiftRestVertical(noteU, noteM, 1);\n }\n if (noteL.isrest && noteM.minLine <= noteL.maxLine) {\n // shift lower voice rest down\n shiftRestVertical(noteL, noteM, -1);\n }\n // If middle voice intersects upper or lower voice\n if (noteU.minLine <= noteM.maxLine + 0.5 || noteM.minLine <= noteL.maxLine) {\n // shift middle note right\n xShift = voiceXShift + 2;\n noteM.note.setXShift(xShift);\n if (noteL.note.hasBeam() === false) {\n noteL.stemDirection = -1;\n noteL.note.setStemDirection(-1);\n }\n if (noteU.minLine <= noteL.maxLine && noteU.note.hasBeam() === false) {\n noteU.stemDirection = 1;\n noteU.note.setStemDirection(1);\n }\n }\n state.right_shift += xShift;\n return true;\n }\n static postFormat(notes) {\n if (!notes)\n return false;\n notes.forEach((note) => note.postFormat());\n return true;\n }\n reset() {\n super.reset();\n // Save prior noteHead styles & reapply them after making new noteheads.\n const noteHeadStyles = this._noteHeads.map((noteHead) => noteHead.getStyle());\n this.buildNoteHeads();\n this._noteHeads.forEach((noteHead, index) => {\n const noteHeadStyle = noteHeadStyles[index];\n if (noteHeadStyle)\n noteHead.setStyle(noteHeadStyle);\n });\n const stave = this.stave;\n if (stave) {\n this._noteHeads.forEach((head) => head.setStave(stave));\n }\n this.calcNoteDisplacements();\n return this;\n }\n setBeam(beam) {\n this.beam = beam;\n this.calcNoteDisplacements();\n // Update stem extension is a beam is assigned.\n if (this.stem) {\n this.stem.setExtension(this.getStemExtension());\n }\n return this;\n }\n // Builds a `Stem` for the note\n buildStem() {\n this.setStem(new Stem({ hide: !!this.isRest() }));\n return this;\n }\n // Builds a `NoteHead` for each key in the note\n buildNoteHeads() {\n this._noteHeads = [];\n const stemDirection = this.getStemDirection();\n const keys = this.getKeys();\n let lastLine = undefined;\n let lineDiff = undefined;\n let displaced = false;\n // Draw notes from bottom to top.\n // For down-stem notes, we draw from top to bottom.\n let start;\n let end;\n let step;\n if (stemDirection === Stem.UP) {\n start = 0;\n end = keys.length;\n step = 1;\n }\n else {\n start = keys.length - 1;\n end = -1;\n step = -1;\n }\n for (let i = start; i !== end; i += step) {\n const noteProps = this.keyProps[i];\n const line = noteProps.line;\n // Keep track of last line with a note head, so that consecutive heads\n // are correctly displaced.\n if (lastLine === undefined) {\n lastLine = line;\n }\n else {\n lineDiff = Math.abs(lastLine - line);\n if (lineDiff === 0 || lineDiff === 0.5) {\n displaced = !displaced;\n }\n else {\n displaced = false;\n this.use_default_head_x = true;\n }\n }\n lastLine = line;\n const notehead = new NoteHead({\n duration: this.duration,\n note_type: this.noteType,\n displaced,\n stem_direction: stemDirection,\n custom_glyph_code: noteProps.code,\n glyph_font_scale: this.render_options.glyph_font_scale,\n x_shift: noteProps.shift_right,\n stem_up_x_offset: noteProps.stem_up_x_offset,\n stem_down_x_offset: noteProps.stem_down_x_offset,\n line: noteProps.line,\n });\n this._noteHeads[i] = notehead;\n }\n }\n // Automatically sets the stem direction based on the keys in the note\n autoStem() {\n this.setStemDirection(this.calculateOptimalStemDirection());\n }\n calculateOptimalStemDirection() {\n // Figure out optimal stem direction based on given notes\n this.minLine = this.keyProps[0].line;\n this.maxLine = this.keyProps[this.keyProps.length - 1].line;\n const MIDDLE_LINE = 3;\n const decider = (this.minLine + this.maxLine) / 2;\n const stemDirection = decider < MIDDLE_LINE ? Stem.UP : Stem.DOWN;\n return stemDirection;\n }\n // Calculates and stores the properties for each key in the note\n calculateKeyProps() {\n let lastLine;\n for (let i = 0; i < this.keys.length; ++i) {\n const key = this.keys[i];\n // All rests use the same position on the line.\n // if (this.glyph.rest) key = this.glyph.position;\n if (this.glyph.rest)\n this.glyph.position = key;\n const options = { octave_shift: this.octave_shift || 0 };\n const props = Tables.keyProperties(key, this.clef, options);\n if (!props) {\n throw new RuntimeError('BadArguments', `Invalid key for note properties: ${key}`);\n }\n // Override line placement for default rests\n if (props.key === 'R') {\n if (this.duration === '1' || this.duration === 'w') {\n props.line = 4;\n }\n else {\n props.line = 3;\n }\n }\n // Calculate displacement of this note\n const line = props.line;\n if (lastLine == undefined) {\n lastLine = line;\n }\n else {\n if (Math.abs(lastLine - line) === 0.5) {\n this.displaced = true;\n props.displaced = true;\n // Have to mark the previous note as\n // displaced as well, for modifier placement\n if (this.keyProps.length > 0) {\n this.keyProps[i - 1].displaced = true;\n }\n }\n }\n lastLine = line;\n this.keyProps.push(props);\n }\n // Sort the notes from lowest line to highest line\n lastLine = undefined;\n this.keyProps.forEach((key) => {\n if (lastLine && key.line < lastLine) {\n warn('Unsorted keys in note will be sorted. ' + 'See https://github.com/0xfe/vexflow/issues/104 for details.');\n }\n lastLine = key.line;\n });\n this.keyProps.sort((a, b) => a.line - b.line);\n }\n // Get the `BoundingBox` for the entire note\n getBoundingBox() {\n var _a, _b;\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call getBoundingBox on an unformatted note.\");\n }\n const { width: w, modLeftPx, leftDisplacedHeadPx } = this.getMetrics();\n const x = this.getAbsoluteX() - modLeftPx - leftDisplacedHeadPx;\n let minY = 0;\n let maxY = 0;\n const halfLineSpacing = ((_b = (_a = this.getStave()) === null || _a === void 0 ? void 0 : _a.getSpacingBetweenLines()) !== null && _b !== void 0 ? _b : 0) / 2;\n const lineSpacing = halfLineSpacing * 2;\n if (this.isRest()) {\n const y = this.ys[0];\n const frac = Tables.durationToFraction(this.duration);\n if (frac.equals(1) || frac.equals(2)) {\n minY = y - halfLineSpacing;\n maxY = y + halfLineSpacing;\n }\n else {\n minY = y - this.glyph.line_above * lineSpacing;\n maxY = y + this.glyph.line_below * lineSpacing;\n }\n }\n else if (this.glyph.stem) {\n const ys = this.getStemExtents();\n ys.baseY += halfLineSpacing * this.getStemDirection();\n minY = Math.min(ys.topY, ys.baseY);\n maxY = Math.max(ys.topY, ys.baseY);\n }\n else {\n minY = 0;\n maxY = 0;\n for (let i = 0; i < this.ys.length; ++i) {\n const yy = this.ys[i];\n if (i === 0) {\n minY = yy;\n maxY = yy;\n }\n else {\n minY = Math.min(yy, minY);\n maxY = Math.max(yy, maxY);\n }\n }\n minY -= halfLineSpacing;\n maxY += halfLineSpacing;\n }\n return new BoundingBox(x, minY, w, maxY - minY);\n }\n // Gets the line number of the bottom note in the chord.\n // If `isTopNote` is `true` then get the top note's line number instead\n getLineNumber(isTopNote) {\n if (!this.keyProps.length) {\n throw new RuntimeError('NoKeyProps', \"Can't get bottom note line, because note is not initialized properly.\");\n }\n let resultLine = this.keyProps[0].line;\n // No precondition assumed for sortedness of keyProps array\n for (let i = 0; i < this.keyProps.length; i++) {\n const thisLine = this.keyProps[i].line;\n if (isTopNote) {\n if (thisLine > resultLine)\n resultLine = thisLine;\n }\n else {\n if (thisLine < resultLine)\n resultLine = thisLine;\n }\n }\n return resultLine;\n }\n /**\n * @returns true if this note is a type of rest. Rests don't have pitches, but take up space in the score.\n */\n isRest() {\n return this.glyph.rest;\n }\n // Determine if the current note is a chord\n isChord() {\n return !this.isRest() && this.keys.length > 1;\n }\n // Determine if the `StaveNote` has a stem\n hasStem() {\n return this.glyph.stem;\n }\n hasFlag() {\n return super.hasFlag() && !this.isRest();\n }\n getStemX() {\n if (this.noteType === 'r') {\n return this.getCenterGlyphX();\n }\n else {\n // We adjust the origin of the stem because we want the stem left-aligned\n // with the notehead if stemmed-down, and right-aligned if stemmed-up\n return super.getStemX() + (this.stem_direction ? Stem.WIDTH / (2 * -this.stem_direction) : 0);\n }\n }\n // Get the `y` coordinate for text placed on the top/bottom of a\n // note at a desired `text_line`\n getYForTopText(textLine) {\n const extents = this.getStemExtents();\n return Math.min(this.checkStave().getYForTopText(textLine), extents.topY - this.render_options.annotation_spacing * (textLine + 1));\n }\n getYForBottomText(textLine) {\n const extents = this.getStemExtents();\n return Math.max(this.checkStave().getYForTopText(textLine), extents.baseY + this.render_options.annotation_spacing * textLine);\n }\n // Sets the current note to the provided `stave`. This applies\n // `y` values to the `NoteHeads`.\n setStave(stave) {\n super.setStave(stave);\n const ys = this._noteHeads.map((notehead) => {\n notehead.setStave(stave);\n return notehead.getY();\n });\n this.setYs(ys);\n if (this.stem) {\n const { y_top, y_bottom } = this.getNoteHeadBounds();\n this.stem.setYBounds(y_top, y_bottom);\n }\n return this;\n }\n // Check if note is shifted to the right\n isDisplaced() {\n return this.displaced;\n }\n // Sets whether shift note to the right. `displaced` is a `boolean`\n setNoteDisplaced(displaced) {\n this.displaced = displaced;\n return this;\n }\n // Get the starting `x` coordinate for a `StaveTie`\n getTieRightX() {\n let tieStartX = this.getAbsoluteX();\n tieStartX += this.getGlyphWidth() + this.x_shift + this.rightDisplacedHeadPx;\n if (this.modifierContext)\n tieStartX += this.modifierContext.getRightShift();\n return tieStartX;\n }\n // Get the ending `x` coordinate for a `StaveTie`\n getTieLeftX() {\n let tieEndX = this.getAbsoluteX();\n tieEndX += this.x_shift - this.leftDisplacedHeadPx;\n return tieEndX;\n }\n // Get the stave line on which to place a rest\n getLineForRest() {\n let restLine = this.keyProps[0].line;\n if (this.keyProps.length > 1) {\n const lastLine = this.keyProps[this.keyProps.length - 1].line;\n const top = Math.max(restLine, lastLine);\n const bot = Math.min(restLine, lastLine);\n restLine = midLine(top, bot);\n }\n return restLine;\n }\n // Get the default `x` and `y` coordinates for the provided `position`\n // and key `index`\n getModifierStartXY(position, index, options = {}) {\n var _a, _b;\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call GetModifierStartXY on an unformatted note\");\n }\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', 'No Y-Values calculated for this note.');\n }\n const { ABOVE, BELOW, LEFT, RIGHT } = Modifier.Position;\n let x = 0;\n if (position === LEFT) {\n // FIXME: Left modifier padding, move to font file\n x = -1 * 2;\n }\n else if (position === RIGHT) {\n // FIXME: Right modifier padding, move to font file\n x = this.getGlyphWidth() + this.x_shift + 2;\n if (this.stem_direction === Stem.UP &&\n this.hasFlag() &&\n (options.forceFlagRight || isInnerNoteIndex(this, index))) {\n x += (_b = (_a = this === null || this === void 0 ? void 0 : this.flag) === null || _a === void 0 ? void 0 : _a.getMetrics().width) !== null && _b !== void 0 ? _b : 0;\n }\n }\n else if (position === BELOW || position === ABOVE) {\n x = this.getGlyphWidth() / 2;\n }\n return {\n x: this.getAbsoluteX() + x,\n y: this.ys[index],\n };\n }\n // Sets the style of the complete StaveNote, including all keys\n // and the stem.\n setStyle(style) {\n var _a;\n super.setStyle(style);\n this._noteHeads.forEach((notehead) => notehead.setStyle(style));\n (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setStyle(style);\n return this;\n }\n setStemStyle(style) {\n const stem = this.getStem();\n stem === null || stem === void 0 ? void 0 : stem.setStyle(style);\n return this;\n }\n getStemStyle() {\n var _a;\n return (_a = this.stem) === null || _a === void 0 ? void 0 : _a.getStyle();\n }\n setLedgerLineStyle(style) {\n this.ledgerLineStyle = style;\n }\n getLedgerLineStyle() {\n return this.ledgerLineStyle;\n }\n setFlagStyle(style) {\n this.flagStyle = style;\n }\n getFlagStyle() {\n return this.flagStyle;\n }\n // Sets the notehead at `index` to the provided coloring `style`.\n //\n // `style` is an `object` with the following properties: `shadowColor`,\n // `shadowBlur`, `fillStyle`, `strokeStyle`\n setKeyStyle(index, style) {\n this._noteHeads[index].setStyle(style);\n return this;\n }\n setKeyLine(index, line) {\n this.keyProps[index].line = line;\n this.reset();\n return this;\n }\n getKeyLine(index) {\n return this.keyProps[index].line;\n }\n // Get the width of the note if it is displaced. Used for `Voice`\n // formatting\n getVoiceShiftWidth() {\n // TODO: may need to accomodate for dot here.\n return this.getGlyphWidth() * (this.displaced ? 2 : 1);\n }\n // Calculates and sets the extra pixels to the left or right\n // if the note is displaced.\n calcNoteDisplacements() {\n this.setLeftDisplacedHeadPx(this.displaced && this.stem_direction === Stem.DOWN ? this.getGlyphWidth() : 0);\n // For upstems with flags, the extra space is unnecessary, since it's taken\n // up by the flag.\n this.setRightDisplacedHeadPx(!this.hasFlag() && this.displaced && this.stem_direction === Stem.UP ? this.getGlyphWidth() : 0);\n }\n // Pre-render formatting\n preFormat() {\n if (this.preFormatted)\n return;\n let noteHeadPadding = 0;\n if (this.modifierContext) {\n this.modifierContext.preFormat();\n // If there are no modifiers on this note, make sure there is adequate padding\n // between the notes.\n if (this.modifierContext.getWidth() === 0) {\n noteHeadPadding = StaveNote.minNoteheadPadding;\n }\n }\n let width = this.getGlyphWidth() + this.leftDisplacedHeadPx + this.rightDisplacedHeadPx + noteHeadPadding;\n // For upward flagged notes, the width of the flag needs to be added\n if (this.shouldDrawFlag() && this.stem_direction === Stem.UP) {\n width += this.getGlyphWidth();\n // TODO: Add flag width as a separate metric\n }\n this.setWidth(width);\n this.preFormatted = true;\n }\n /**\n * @typedef {Object} noteHeadBounds\n * @property {number} y_top the highest notehead bound\n * @property {number} y_bottom the lowest notehead bound\n * @property {number|Null} displaced_x the starting x for displaced noteheads\n * @property {number|Null} non_displaced_x the starting x for non-displaced noteheads\n * @property {number} highest_line the highest notehead line in traditional music line\n * numbering (bottom line = 1, top line = 5)\n * @property {number} lowest_line the lowest notehead line\n * @property {number|false} highest_displaced_line the highest staff line number\n * for a displaced notehead\n * @property {number|false} lowest_displaced_line\n * @property {number} highest_non_displaced_line\n * @property {number} lowest_non_displaced_line\n */\n /**\n * Get the staff line and y value for the highest & lowest noteheads\n * @returns {noteHeadBounds}\n */\n getNoteHeadBounds() {\n // Top and bottom Y values for stem.\n let yTop = +Infinity;\n let yBottom = -Infinity;\n let nonDisplacedX;\n let displacedX;\n let highestLine = this.checkStave().getNumLines();\n let lowestLine = 1;\n let highestDisplacedLine;\n let lowestDisplacedLine;\n let highestNonDisplacedLine = highestLine;\n let lowestNonDisplacedLine = lowestLine;\n this._noteHeads.forEach((notehead) => {\n const line = notehead.getLine();\n const y = notehead.getY();\n yTop = Math.min(y, yTop);\n yBottom = Math.max(y, yBottom);\n if (displacedX === undefined && notehead.isDisplaced()) {\n displacedX = notehead.getAbsoluteX();\n }\n if (nonDisplacedX === undefined && !notehead.isDisplaced()) {\n nonDisplacedX = notehead.getAbsoluteX();\n }\n highestLine = Math.max(line, highestLine);\n lowestLine = Math.min(line, lowestLine);\n if (notehead.isDisplaced()) {\n highestDisplacedLine = highestDisplacedLine === undefined ? line : Math.max(line, highestDisplacedLine);\n lowestDisplacedLine = lowestDisplacedLine === undefined ? line : Math.min(line, lowestDisplacedLine);\n }\n else {\n highestNonDisplacedLine = Math.max(line, highestNonDisplacedLine);\n lowestNonDisplacedLine = Math.min(line, lowestNonDisplacedLine);\n }\n }, this);\n return {\n y_top: yTop,\n y_bottom: yBottom,\n displaced_x: displacedX,\n non_displaced_x: nonDisplacedX,\n highest_line: highestLine,\n lowest_line: lowestLine,\n highest_displaced_line: highestDisplacedLine,\n lowest_displaced_line: lowestDisplacedLine,\n highest_non_displaced_line: highestNonDisplacedLine,\n lowest_non_displaced_line: lowestNonDisplacedLine,\n };\n }\n // Get the starting `x` coordinate for the noteheads\n getNoteHeadBeginX() {\n return this.getAbsoluteX() + this.x_shift;\n }\n // Get the ending `x` coordinate for the noteheads\n getNoteHeadEndX() {\n const xBegin = this.getNoteHeadBeginX();\n return xBegin + this.getGlyphWidth();\n }\n get noteHeads() {\n return this._noteHeads.slice();\n }\n /** @deprecated use StaveNote.noteHeads instead. */\n get note_heads() {\n showDeprecationWarningForNoteHeads();\n return this.noteHeads;\n }\n // Draw the ledger lines between the stave and the highest/lowest keys\n drawLedgerLines() {\n const stave = this.checkStave();\n const { glyph, render_options: { stroke_px }, } = this;\n const ctx = this.checkContext();\n const width = glyph.getWidth() + stroke_px * 2;\n const doubleWidth = 2 * (glyph.getWidth() + stroke_px) - Stem.WIDTH / 2;\n if (this.isRest())\n return;\n if (!ctx) {\n throw new RuntimeError('NoCanvasContext', \"Can't draw without a canvas context.\");\n }\n const { highest_line, lowest_line, highest_displaced_line, highest_non_displaced_line, lowest_displaced_line, lowest_non_displaced_line, displaced_x, non_displaced_x, } = this.getNoteHeadBounds();\n // Early out if there are no ledger lines to draw.\n if (highest_line < 6 && lowest_line > 0)\n return;\n const min_x = Math.min(displaced_x !== null && displaced_x !== void 0 ? displaced_x : 0, non_displaced_x !== null && non_displaced_x !== void 0 ? non_displaced_x : 0);\n const drawLedgerLine = (y, normal, displaced) => {\n let x;\n if (displaced && normal)\n x = min_x - stroke_px;\n else if (normal)\n x = (non_displaced_x !== null && non_displaced_x !== void 0 ? non_displaced_x : 0) - stroke_px;\n else\n x = (displaced_x !== null && displaced_x !== void 0 ? displaced_x : 0) - stroke_px;\n const ledgerWidth = normal && displaced ? doubleWidth : width;\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(x + ledgerWidth, y);\n ctx.stroke();\n };\n const style = Object.assign(Object.assign({}, stave.getDefaultLedgerLineStyle()), this.getLedgerLineStyle());\n this.applyStyle(ctx, style);\n // Draw ledger lines below the staff:\n for (let line = 6; line <= highest_line; ++line) {\n const normal = non_displaced_x !== undefined && line <= highest_non_displaced_line;\n const displaced = highest_displaced_line !== undefined && line <= highest_displaced_line;\n drawLedgerLine(stave.getYForNote(line), normal, displaced);\n }\n // Draw ledger lines above the staff:\n for (let line = 0; line >= lowest_line; --line) {\n const normal = non_displaced_x !== undefined && line >= lowest_non_displaced_line;\n const displaced = lowest_displaced_line !== undefined && line >= lowest_displaced_line;\n drawLedgerLine(stave.getYForNote(line), normal, displaced);\n }\n this.restoreStyle(ctx, style);\n }\n // Draw all key modifiers\n drawModifiers() {\n const ctx = this.checkContext();\n ctx.openGroup('modifiers');\n for (let i = 0; i < this.modifiers.length; i++) {\n const modifier = this.modifiers[i];\n const index = modifier.checkIndex();\n const notehead = this._noteHeads[index];\n const noteheadStyle = notehead.getStyle();\n notehead.applyStyle(ctx, noteheadStyle);\n modifier.setContext(ctx);\n modifier.drawWithStyle();\n notehead.restoreStyle(ctx, noteheadStyle);\n }\n ctx.closeGroup();\n }\n shouldDrawFlag() {\n const hasStem = this.stem !== undefined;\n const hasFlag = this.glyph.flag; // specified in tables.js\n const hasNoBeam = this.beam === undefined;\n return hasStem && hasFlag && hasNoBeam;\n }\n // Draw the flag for the note\n drawFlag() {\n var _a;\n const ctx = this.checkContext();\n if (!ctx) {\n throw new RuntimeError('NoCanvasContext', \"Can't draw without a canvas context.\");\n }\n if (this.shouldDrawFlag()) {\n const { y_top, y_bottom } = this.getNoteHeadBounds();\n // eslint-disable-next-line\n const noteStemHeight = this.stem.getHeight();\n const flagX = this.getStemX();\n // FIXME: What's with the magic +/- 2\n // ANSWER: a corner of the note stem pokes out beyond the tip of the flag.\n // The extra +/- 2 pushes the flag glyph outward so it covers the stem entirely.\n // Alternatively, we could shorten the stem.\n const extension = this.flag !== undefined ? this.flag.checkMetrics().y_shift : 0;\n const flagY = this.getStemDirection() === Stem.DOWN\n ? // Down stems are below the note head and have flags on the right.\n y_top - noteStemHeight + 2 - extension\n : // Up stems are above the note head and have flags on the right.\n y_bottom - noteStemHeight - 2 - extension;\n // Draw the Flag\n ctx.openGroup('flag', undefined, { pointerBBox: true });\n this.applyStyle(ctx, this.getFlagStyle());\n (_a = this.flag) === null || _a === void 0 ? void 0 : _a.render(ctx, flagX, flagY);\n this.restoreStyle(ctx, this.getFlagStyle());\n ctx.closeGroup();\n }\n }\n // Draw the NoteHeads\n drawNoteHeads() {\n const ctx = this.checkContext();\n this._noteHeads.forEach((notehead) => {\n ctx.openGroup('notehead', undefined, { pointerBBox: true });\n notehead.setContext(ctx).draw();\n ctx.closeGroup();\n });\n }\n drawStem(stemOptions) {\n var _a;\n // GCR TODO: I can't find any context in which this is called with the stemStruct\n // argument in the codebase or tests. Nor can I find a case where super.drawStem\n // is called at all. Perhaps these should be removed?\n const ctx = this.checkContext();\n if (stemOptions) {\n this.setStem(new Stem(stemOptions));\n }\n // If we will render a flag, we shorten the stem so that the tip\n // does not poke through the flag.\n if (this.shouldDrawFlag() && this.stem) {\n this.stem.adjustHeightForFlag();\n }\n ctx.openGroup('stem', undefined, { pointerBBox: true });\n (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setContext(ctx).draw();\n ctx.closeGroup();\n }\n /**\n * Override stemmablenote stem extension to adjust for distance from middle line.\n */\n getStemExtension() {\n const super_stem_extension = super.getStemExtension();\n if (!this.glyph.stem) {\n return super_stem_extension;\n }\n const stem_direction = this.getStemDirection();\n if (stem_direction !== this.calculateOptimalStemDirection()) {\n return super_stem_extension; // no adjustment for manually set stem direction.\n }\n let mid_line_distance;\n const MIDDLE_LINE = 3;\n if (stem_direction === Stem.UP) {\n // Note that the use of maxLine here instead of minLine might\n // seem counterintuitive, but in the case of (say) treble clef\n // chord(F2, E4) stem up, we do not want to extend the stem because\n // of F2, when a normal octave-length stem above E4 is fine.\n //\n // maxLine and minLine are set in calculateOptimalStemDirection() so\n // will be known.\n mid_line_distance = MIDDLE_LINE - this.maxLine;\n }\n else {\n mid_line_distance = this.minLine - MIDDLE_LINE;\n }\n // how many lines more than an octave is the relevant notehead?\n const lines_over_octave_from_mid_line = mid_line_distance - 3.5;\n if (lines_over_octave_from_mid_line <= 0) {\n return super_stem_extension;\n }\n const stave = this.getStave();\n let spacing_between_lines = 10;\n if (stave != undefined) {\n spacing_between_lines = stave.getSpacingBetweenLines();\n }\n return super_stem_extension + lines_over_octave_from_mid_line * spacing_between_lines;\n }\n // Draws all the `StaveNote` parts. This is the main drawing method.\n draw() {\n var _a;\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', \"Can't draw note without Y values.\");\n }\n const ctx = this.checkContext();\n const xBegin = this.getNoteHeadBeginX();\n const shouldRenderStem = this.hasStem() && !this.beam;\n // Format note head x positions\n this._noteHeads.forEach((notehead) => notehead.setX(xBegin));\n // Format stem x positions\n const stemX = this.getStemX();\n (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setNoteHeadXBounds(stemX, stemX);\n L('Rendering ', this.isChord() ? 'chord :' : 'note :', this.keys);\n // Apply the overall style -- may be contradicted by local settings:\n this.applyStyle();\n this.setAttribute('el', ctx.openGroup('stavenote', this.getAttribute('id')));\n this.drawLedgerLines();\n ctx.openGroup('note', undefined, { pointerBBox: true });\n if (shouldRenderStem)\n this.drawStem();\n this.drawNoteHeads();\n this.drawFlag();\n ctx.closeGroup();\n this.drawModifiers();\n ctx.closeGroup();\n this.restoreStyle();\n this.setRendered();\n }\n}\nStaveNote.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Ron B. Yeh\n// MIT License\n//\n// Utilities for working with Web APIs.\n// See: https://developer.mozilla.org/en-US/docs/Web/API\nimport { globalObject } from './util';\n// eslint-disable-next-line\nexport function isHTMLCanvas(element) {\n if (!element)\n return false;\n const global = globalObject();\n return (\n // It's either an instance of the HTMLCanvasElement class,\n (typeof global.HTMLCanvasElement === 'function' && element instanceof global.HTMLCanvasElement) ||\n // OR it's pretending to be a element. Good enough!\n // Do not rely on .tagName, because node-canvas doesn't provide a tagName.\n (typeof element.getContext === 'function' && typeof element.toDataURL === 'function'));\n}\n// eslint-disable-next-line\nexport function isHTMLDiv(element) {\n if (!element)\n return false;\n const global = globalObject();\n return (\n // It's either an instance of the HTMLDivElement class.\n (typeof global.HTMLDivElement === 'function' && element instanceof global.HTMLDivElement) ||\n // OR it's pretending to be a
. See: svgcontext.ts.\n (typeof element.appendChild === 'function' && typeof element.style === 'object'));\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from './font';\nimport { RenderContext } from './rendercontext';\nimport { globalObject, warn } from './util';\nimport { isHTMLCanvas } from './web';\n/**\n * A rendering context for the Canvas backend. This class serves as a proxy for the\n * underlying CanvasRenderingContext2D object, part of the browser's API.\n */\nexport class CanvasContext extends RenderContext {\n constructor(context) {\n super();\n /** Height of one line of text (in pixels). */\n this.textHeight = 0;\n this.context2D = context;\n if (!context.canvas) {\n this.canvas = {\n width: CanvasContext.WIDTH,\n height: CanvasContext.HEIGHT,\n };\n }\n else {\n this.canvas = context.canvas;\n }\n }\n static get WIDTH() {\n return 600;\n }\n static get HEIGHT() {\n return 400;\n }\n static get CANVAS_BROWSER_SIZE_LIMIT() {\n return 32767; // Chrome/Firefox. Could be determined more precisely by npm module canvas-size.\n }\n /**\n * Ensure that width and height do not exceed the browser limit.\n * @returns array of [width, height] clamped to the browser limit.\n */\n static sanitizeCanvasDims(width, height) {\n const limit = this.CANVAS_BROWSER_SIZE_LIMIT;\n if (Math.max(width, height) > limit) {\n warn('Canvas dimensions exceed browser limit. Cropping to ' + limit);\n if (width > limit) {\n width = limit;\n }\n if (height > limit) {\n height = limit;\n }\n }\n return [width, height];\n }\n /**\n * Set all pixels to transparent black rgba(0,0,0,0).\n */\n clear() {\n this.context2D.clearRect(0, 0, this.canvas.width, this.canvas.height);\n }\n // eslint-disable-next-line\n openGroup(cls, id, attrs) {\n // Containers not implemented.\n }\n closeGroup() {\n // Containers not implemented.\n }\n // eslint-disable-next-line\n add(child) {\n // Containers not implemented.\n }\n setFillStyle(style) {\n this.context2D.fillStyle = style;\n return this;\n }\n /** CanvasContext ignores `setBackgroundFillStyle()`. */\n // eslint-disable-next-line\n setBackgroundFillStyle(style) {\n // DO NOTHING\n return this;\n }\n setStrokeStyle(style) {\n this.context2D.strokeStyle = style;\n return this;\n }\n setShadowColor(color) {\n this.context2D.shadowColor = color;\n return this;\n }\n setShadowBlur(blur) {\n // CanvasRenderingContext2D does not scale the shadow blur by the current\n // transform, so we have to do it manually. We assume uniform scaling\n // (though allow for rotation) because the blur can only be scaled\n // uniformly anyway.\n const t = this.context2D.getTransform();\n const scale = Math.sqrt(t.a * t.a + t.b * t.b + t.c * t.c + t.d * t.d);\n this.context2D.shadowBlur = scale * blur;\n return this;\n }\n setLineWidth(width) {\n this.context2D.lineWidth = width;\n return this;\n }\n setLineCap(capType) {\n this.context2D.lineCap = capType;\n return this;\n }\n setLineDash(dash) {\n this.context2D.setLineDash(dash);\n return this;\n }\n scale(x, y) {\n this.context2D.scale(x, y);\n return this;\n }\n resize(width, height) {\n const canvas = this.context2D.canvas;\n const devicePixelRatio = globalObject().devicePixelRatio || 1;\n // Scale the canvas size by the device pixel ratio clamping to the maximum supported size.\n [width, height] = CanvasContext.sanitizeCanvasDims(width * devicePixelRatio, height * devicePixelRatio);\n // Divide back down by the pixel ratio and convert to integers.\n width = (width / devicePixelRatio) | 0;\n height = (height / devicePixelRatio) | 0;\n canvas.width = width * devicePixelRatio;\n canvas.height = height * devicePixelRatio;\n // The canvas could be an instance of either HTMLCanvasElement or an OffscreenCanvas.\n // Only HTMLCanvasElement has a style attribute.\n if (isHTMLCanvas(canvas)) {\n canvas.style.width = width + 'px';\n canvas.style.height = height + 'px';\n }\n return this.scale(devicePixelRatio, devicePixelRatio);\n }\n rect(x, y, width, height) {\n this.context2D.rect(x, y, width, height);\n return this;\n }\n fillRect(x, y, width, height) {\n this.context2D.fillRect(x, y, width, height);\n return this;\n }\n /**\n * Set the pixels in a rectangular area to transparent black rgba(0,0,0,0).\n */\n clearRect(x, y, width, height) {\n this.context2D.clearRect(x, y, width, height);\n return this;\n }\n beginPath() {\n this.context2D.beginPath();\n return this;\n }\n moveTo(x, y) {\n this.context2D.moveTo(x, y);\n return this;\n }\n lineTo(x, y) {\n this.context2D.lineTo(x, y);\n return this;\n }\n bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) {\n this.context2D.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);\n return this;\n }\n quadraticCurveTo(cpx, cpy, x, y) {\n this.context2D.quadraticCurveTo(cpx, cpy, x, y);\n return this;\n }\n arc(x, y, radius, startAngle, endAngle, counterclockwise) {\n this.context2D.arc(x, y, radius, startAngle, endAngle, counterclockwise);\n return this;\n }\n fill() {\n this.context2D.fill();\n return this;\n }\n stroke() {\n this.context2D.stroke();\n return this;\n }\n closePath() {\n this.context2D.closePath();\n return this;\n }\n measureText(text) {\n const metrics = this.context2D.measureText(text);\n let y = 0;\n let height = 0;\n if (metrics.fontBoundingBoxAscent) {\n y = -metrics.fontBoundingBoxAscent;\n height = metrics.fontBoundingBoxDescent + metrics.fontBoundingBoxAscent;\n }\n else {\n y = -metrics.actualBoundingBoxAscent;\n height = metrics.actualBoundingBoxDescent + metrics.actualBoundingBoxAscent;\n }\n // Return x, y, width & height in the same manner as svg getBBox\n return {\n x: 0,\n y: y,\n width: metrics.width,\n height: height,\n };\n }\n fillText(text, x, y) {\n this.context2D.fillText(text, x, y);\n return this;\n }\n save() {\n this.context2D.save();\n return this;\n }\n restore() {\n this.context2D.restore();\n return this;\n }\n set fillStyle(style) {\n this.context2D.fillStyle = style;\n }\n get fillStyle() {\n return this.context2D.fillStyle;\n }\n set strokeStyle(style) {\n this.context2D.strokeStyle = style;\n }\n get strokeStyle() {\n return this.context2D.strokeStyle;\n }\n /**\n * @param f is 1) a `FontInfo` object or\n * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or\n * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided).\n * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt').\n * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900).\n * @param style is a string (e.g., 'italic', 'normal').\n */\n setFont(f, size, weight, style) {\n const fontInfo = Font.validate(f, size, weight, style);\n this.context2D.font = Font.toCSSString(fontInfo);\n this.textHeight = Font.convertSizeToPixelValue(fontInfo.size);\n return this;\n }\n /** Return a string of the form `'italic bold 15pt Arial'` */\n getFont() {\n return this.context2D.font;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// @author Gregory Ristow (2015)\nimport { Font, FontStyle, FontWeight } from './font';\nimport { RenderContext } from './rendercontext';\nimport { normalizeAngle, prefix, RuntimeError } from './util';\n/** For a particular element type (e.g., rect), we will not apply certain presentation attributes. */\nconst ATTRIBUTES_TO_IGNORE = {\n path: {\n x: true,\n y: true,\n width: true,\n height: true,\n 'font-family': true,\n 'font-weight': true,\n 'font-style': true,\n 'font-size': true,\n },\n rect: {\n 'font-family': true,\n 'font-weight': true,\n 'font-style': true,\n 'font-size': true,\n },\n text: {\n width: true,\n height: true,\n },\n};\n/** Create the SVG in the SVG namespace. */\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst TWO_PI = 2 * Math.PI;\nclass MeasureTextCache {\n constructor() {\n // The cache is keyed first by the text string, then by the font attributes\n // joined together.\n this.cache = {};\n }\n lookup(text, svg, attributes) {\n let entries = this.cache[text];\n if (entries === undefined) {\n entries = {};\n this.cache[text] = entries;\n }\n const family = attributes['font-family'];\n const size = attributes['font-size'];\n const weight = attributes['font-weight'];\n const style = attributes['font-style'];\n const key = `${family}%${size}%${weight}%${style}`;\n let entry = entries[key];\n if (entry === undefined) {\n entry = this.measureImpl(text, svg, attributes);\n entries[key] = entry;\n }\n return entry;\n }\n measureImpl(text, svg, attributes) {\n let txt = this.txt;\n if (!txt) {\n // Create the SVG text element that will be used to measure text in the event\n // of a cache miss.\n txt = document.createElementNS(SVG_NS, 'text');\n this.txt = txt;\n }\n txt.textContent = text;\n txt.setAttributeNS(null, 'font-family', attributes['font-family']);\n txt.setAttributeNS(null, 'font-size', attributes['font-size']);\n txt.setAttributeNS(null, 'font-style', attributes['font-style']);\n txt.setAttributeNS(null, 'font-weight', attributes['font-weight']);\n svg.appendChild(txt);\n const bbox = txt.getBBox();\n svg.removeChild(txt);\n return { x: bbox.x, y: bbox.y, width: bbox.width, height: bbox.height };\n }\n}\n/**\n * SVG rendering context with an API similar to CanvasRenderingContext2D.\n */\nexport class SVGContext extends RenderContext {\n constructor(element) {\n super();\n this.width = 0;\n this.height = 0;\n this.backgroundFillStyle = 'white';\n /** Formatted as CSS font shorthand (e.g., 'italic bold 12pt Arial') */\n this.fontCSSString = '';\n this.element = element;\n // Create a SVG element and add it to the container element.\n const svg = this.create('svg');\n this.element.appendChild(svg);\n this.svg = svg;\n this.parent = this.svg;\n this.groups = [this.svg];\n this.path = '';\n this.pen = { x: NaN, y: NaN };\n this.lineWidth = 1.0;\n const defaultFontAttributes = {\n 'font-family': Font.SANS_SERIF,\n 'font-size': Font.SIZE + 'pt',\n 'font-weight': FontWeight.NORMAL,\n 'font-style': FontStyle.NORMAL,\n };\n this.state = Object.assign({ scale: { x: 1, y: 1 } }, defaultFontAttributes);\n this.attributes = Object.assign({ 'stroke-width': 0.3, 'stroke-dasharray': 'none', fill: 'black', stroke: 'black' }, defaultFontAttributes);\n this.shadow_attributes = {\n width: 0,\n color: 'black',\n };\n this.state_stack = [];\n }\n create(svgElementType) {\n return document.createElementNS(SVG_NS, svgElementType);\n }\n // Allow grouping elements in containers for interactivity.\n openGroup(cls, id, attrs) {\n const group = this.create('g');\n this.groups.push(group);\n this.parent.appendChild(group);\n this.parent = group;\n if (cls)\n group.setAttribute('class', prefix(cls));\n if (id)\n group.setAttribute('id', prefix(id));\n if (attrs && attrs.pointerBBox) {\n group.setAttribute('pointer-events', 'bounding-box');\n }\n return group;\n }\n closeGroup() {\n this.groups.pop();\n this.parent = this.groups[this.groups.length - 1];\n }\n add(elem) {\n this.parent.appendChild(elem);\n }\n setFillStyle(style) {\n this.attributes.fill = style;\n return this;\n }\n /**\n * Used to set the fill color for `clearRect()`. This allows us to simulate\n * cutting a \"hole\" into the SVG drawing.\n */\n setBackgroundFillStyle(style) {\n this.backgroundFillStyle = style;\n return this;\n }\n setStrokeStyle(style) {\n this.attributes.stroke = style;\n return this;\n }\n setShadowColor(color) {\n this.shadow_attributes.color = color;\n return this;\n }\n /**\n * @param blur A non-negative float specifying the level of shadow blur, where 0\n * represents no blur and larger numbers represent increasingly more blur.\n * @returns this\n */\n setShadowBlur(blur) {\n this.shadow_attributes.width = blur;\n return this;\n }\n /**\n * @param width\n * @returns this\n */\n setLineWidth(width) {\n this.attributes['stroke-width'] = width;\n this.lineWidth = width;\n return this;\n }\n /**\n * @param lineDash an array of integers in the form of [dash, space, dash, space, etc...]\n * @returns this\n *\n * See: [SVG `stroke-dasharray` attribute](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray)\n */\n setLineDash(lineDash) {\n if (Object.prototype.toString.call(lineDash) === '[object Array]') {\n this.attributes['stroke-dasharray'] = lineDash.join(',');\n return this;\n }\n else {\n throw new RuntimeError('ArgumentError', 'lineDash must be an array of integers.');\n }\n }\n /**\n * @param capType\n * @returns this\n */\n setLineCap(capType) {\n this.attributes['stroke-linecap'] = capType;\n return this;\n }\n // ### Sizing & Scaling Methods:\n // TODO (GCR): See note at scale() -- separate our internal\n // conception of pixel-based width/height from the style.width\n // and style.height properties eventually to allow users to\n // apply responsive sizing attributes to the SVG.\n resize(width, height) {\n this.width = width;\n this.height = height;\n this.element.style.width = width.toString();\n this.svg.style.width = width.toString();\n this.svg.style.height = height.toString();\n const attributes = {\n width,\n height,\n };\n this.applyAttributes(this.svg, attributes);\n this.scale(this.state.scale.x, this.state.scale.y);\n return this;\n }\n scale(x, y) {\n // uses viewBox to scale\n // TODO (GCR): we may at some point want to distinguish the\n // style.width / style.height properties that are applied to\n // the SVG object from our internal conception of the SVG\n // width/height. This would allow us to create automatically\n // scaling SVG's that filled their containers, for instance.\n //\n // As this isn't implemented in Canvas contexts,\n // I've left as is for now, but in using the viewBox to\n // handle internal scaling, am trying to make it possible\n // for us to eventually move in that direction.\n this.state.scale = { x, y };\n const visibleWidth = this.width / x;\n const visibleHeight = this.height / y;\n this.setViewBox(0, 0, visibleWidth, visibleHeight);\n return this;\n }\n /**\n * 1 arg: string in the \"x y w h\" format\n * 4 args: x:number, y:number, w:number, h:number\n */\n setViewBox(viewBox_or_minX, minY, width, height) {\n if (typeof viewBox_or_minX === 'string') {\n this.svg.setAttribute('viewBox', viewBox_or_minX);\n }\n else {\n const viewBoxString = viewBox_or_minX + ' ' + minY + ' ' + width + ' ' + height;\n this.svg.setAttribute('viewBox', viewBoxString);\n }\n }\n // ### Drawing helper methods:\n applyAttributes(element, attributes) {\n const attrNamesToIgnore = ATTRIBUTES_TO_IGNORE[element.nodeName];\n for (const attrName in attributes) {\n if (attrNamesToIgnore && attrNamesToIgnore[attrName]) {\n continue;\n }\n element.setAttributeNS(null, attrName, attributes[attrName]);\n }\n return element;\n }\n // ### Shape & Path Methods:\n clear() {\n // Clear the SVG by removing all inner children.\n // (This approach is usually slightly more efficient\n // than removing the old SVG & adding a new one to\n // the container element, since it does not cause the\n // container to resize twice. Also, the resize\n // triggered by removing the entire SVG can trigger\n // a touchcancel event when the element resizes away\n // from a touch point.)\n while (this.svg.lastChild) {\n this.svg.removeChild(this.svg.lastChild);\n }\n // Replace the viewbox attribute we just removed.\n this.scale(this.state.scale.x, this.state.scale.y);\n }\n // ## Rectangles:\n rect(x, y, width, height, attributes) {\n // Avoid invalid negative height attributes by flipping the rectangle on its head:\n if (height < 0) {\n y += height;\n height *= -1;\n }\n const rectangle = this.create('rect');\n attributes = attributes !== null && attributes !== void 0 ? attributes : { fill: 'none', 'stroke-width': this.lineWidth, stroke: 'black' };\n this.applyAttributes(rectangle, Object.assign({ x, y, width, height }, attributes));\n this.add(rectangle);\n return this;\n }\n fillRect(x, y, width, height) {\n const attributes = { fill: this.attributes.fill };\n this.rect(x, y, width, height, attributes);\n return this;\n }\n clearRect(x, y, width, height) {\n // Currently this fills a rect with the backgroundFillStyle, rather\n // than \"cut a hole\" into the existing shapes.\n //\n // Since tabNote seems to be the only module that makes use of this\n // it may be worth creating a separate tabStave that would\n // draw lines around locations of tablature fingering.\n this.rect(x, y, width, height, { 'stroke-width': 0, fill: this.backgroundFillStyle });\n return this;\n }\n // ## Paths:\n beginPath() {\n this.path = '';\n this.pen.x = NaN;\n this.pen.y = NaN;\n return this;\n }\n moveTo(x, y) {\n this.path += 'M' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n lineTo(x, y) {\n this.path += 'L' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n bezierCurveTo(x1, y1, x2, y2, x, y) {\n this.path += 'C' + x1 + ' ' + y1 + ',' + x2 + ' ' + y2 + ',' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n quadraticCurveTo(x1, y1, x, y) {\n this.path += 'Q' + x1 + ' ' + y1 + ',' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n arc(x, y, radius, startAngle, endAngle, counterclockwise) {\n const x0 = x + radius * Math.cos(startAngle);\n const y0 = y + radius * Math.sin(startAngle);\n // Handle the edge case where arc length is greater than or equal to\n // the circle's circumference:\n // https://html.spec.whatwg.org/multipage/canvas.html#ellipse-method-steps\n if ((!counterclockwise && endAngle - startAngle >= TWO_PI) ||\n (counterclockwise && startAngle - endAngle >= TWO_PI)) {\n const x1 = x + radius * Math.cos(startAngle + Math.PI);\n const y1 = y + radius * Math.sin(startAngle + Math.PI);\n // There's no way to specify a completely circular arc in SVG so we have to\n // use two semi-circular arcs.\n this.path += `M${x0} ${y0} A${radius} ${radius} 0 0 0 ${x1} ${y1} `;\n this.path += `A${radius} ${radius} 0 0 0 ${x0} ${y0}`;\n this.pen.x = x0;\n this.pen.y = y0;\n }\n else {\n const x1 = x + radius * Math.cos(endAngle);\n const y1 = y + radius * Math.sin(endAngle);\n startAngle = normalizeAngle(startAngle);\n endAngle = normalizeAngle(endAngle);\n let large;\n if (Math.abs(endAngle - startAngle) < Math.PI) {\n large = counterclockwise;\n }\n else {\n large = !counterclockwise;\n }\n if (startAngle > endAngle) {\n large = !large;\n }\n const sweep = !counterclockwise;\n this.path += `M${x0} ${y0} A${radius} ${radius} 0 ${+large} ${+sweep} ${x1} ${y1}`;\n this.pen.x = x1;\n this.pen.y = y1;\n }\n return this;\n }\n closePath() {\n this.path += 'Z';\n return this;\n }\n getShadowStyle() {\n const sa = this.shadow_attributes;\n // A CSS drop-shadow filter blur looks different than a canvas shadowBlur\n // of the same radius, so we scale the drop-shadow radius here to make it\n // look close to the canvas shadow.\n return `filter: drop-shadow(0 0 ${sa.width / 1.5}px ${sa.color})`;\n }\n fill(attributes) {\n const path = this.create('path');\n if (typeof attributes === 'undefined') {\n attributes = Object.assign(Object.assign({}, this.attributes), { stroke: 'none' });\n }\n attributes.d = this.path;\n if (this.shadow_attributes.width > 0) {\n attributes.style = this.getShadowStyle();\n }\n this.applyAttributes(path, attributes);\n this.add(path);\n return this;\n }\n stroke() {\n const path = this.create('path');\n const attributes = Object.assign(Object.assign({}, this.attributes), { fill: 'none', 'stroke-width': this.lineWidth, d: this.path });\n if (this.shadow_attributes.width > 0) {\n attributes.style = this.getShadowStyle();\n }\n this.applyAttributes(path, attributes);\n this.add(path);\n return this;\n }\n // ## Text Methods:\n measureText(text) {\n return SVGContext.measureTextCache.lookup(text, this.svg, this.attributes);\n }\n fillText(text, x, y) {\n if (!text || text.length <= 0) {\n return this;\n }\n const attributes = Object.assign(Object.assign({}, this.attributes), { stroke: 'none', x,\n y });\n const txt = this.create('text');\n txt.textContent = text;\n this.applyAttributes(txt, attributes);\n this.add(txt);\n return this;\n }\n // TODO: State should be deep-copied.\n save() {\n this.state_stack.push({\n state: {\n 'font-family': this.state['font-family'],\n 'font-weight': this.state['font-weight'],\n 'font-style': this.state['font-style'],\n 'font-size': this.state['font-size'],\n scale: this.state.scale,\n },\n attributes: {\n 'font-family': this.attributes['font-family'],\n 'font-weight': this.attributes['font-weight'],\n 'font-style': this.attributes['font-style'],\n 'font-size': this.attributes['font-size'],\n fill: this.attributes.fill,\n stroke: this.attributes.stroke,\n 'stroke-width': this.attributes['stroke-width'],\n 'stroke-dasharray': this.attributes['stroke-dasharray'],\n },\n shadow_attributes: {\n width: this.shadow_attributes.width,\n color: this.shadow_attributes.color,\n },\n lineWidth: this.lineWidth,\n });\n return this;\n }\n // TODO: State should be deep-restored.\n restore() {\n const savedState = this.state_stack.pop();\n if (savedState) {\n const state = savedState;\n this.state['font-family'] = state.state['font-family'];\n this.state['font-weight'] = state.state['font-weight'];\n this.state['font-style'] = state.state['font-style'];\n this.state['font-size'] = state.state['font-size'];\n this.state.scale = state.state.scale;\n this.attributes['font-family'] = state.attributes['font-family'];\n this.attributes['font-weight'] = state.attributes['font-weight'];\n this.attributes['font-style'] = state.attributes['font-style'];\n this.attributes['font-size'] = state.attributes['font-size'];\n this.attributes.fill = state.attributes.fill;\n this.attributes.stroke = state.attributes.stroke;\n this.attributes['stroke-width'] = state.attributes['stroke-width'];\n this.attributes['stroke-dasharray'] = state.attributes['stroke-dasharray'];\n this.shadow_attributes.width = state.shadow_attributes.width;\n this.shadow_attributes.color = state.shadow_attributes.color;\n this.lineWidth = state.lineWidth;\n }\n return this;\n }\n set fillStyle(style) {\n this.setFillStyle(style);\n }\n get fillStyle() {\n return this.attributes.fill;\n }\n set strokeStyle(style) {\n this.setStrokeStyle(style);\n }\n get strokeStyle() {\n return this.attributes.stroke;\n }\n /**\n * @param f is 1) a `FontInfo` object or\n * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or\n * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided).\n * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt').\n * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900). It is inserted\n * into the font-weight attribute (e.g., font-weight=\"bold\")\n * @param style is a string (e.g., 'italic', 'normal') that is inserted into the\n * font-style attribute (e.g., font-style=\"italic\")\n */\n setFont(f, size, weight, style) {\n const fontInfo = Font.validate(f, size, weight, style);\n this.fontCSSString = Font.toCSSString(fontInfo);\n const fontAttributes = {\n 'font-family': fontInfo.family,\n 'font-size': fontInfo.size,\n 'font-weight': fontInfo.weight,\n 'font-style': fontInfo.style,\n };\n this.attributes = Object.assign(Object.assign({}, this.attributes), fontAttributes);\n this.state = Object.assign(Object.assign({}, this.state), fontAttributes);\n return this;\n }\n /** Return a string of the form `'italic bold 15pt Arial'` */\n getFont() {\n return this.fontCSSString;\n }\n}\nSVGContext.measureTextCache = new MeasureTextCache();\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { CanvasContext } from './canvascontext';\nimport { SVGContext } from './svgcontext';\nimport { isRenderContext } from './typeguard';\nimport { RuntimeError } from './util';\nimport { isHTMLCanvas, isHTMLDiv } from './web';\nexport var RendererBackends;\n(function (RendererBackends) {\n RendererBackends[RendererBackends[\"CANVAS\"] = 1] = \"CANVAS\";\n RendererBackends[RendererBackends[\"SVG\"] = 2] = \"SVG\";\n})(RendererBackends || (RendererBackends = {}));\n// End of line types\nexport var RendererLineEndType;\n(function (RendererLineEndType) {\n RendererLineEndType[RendererLineEndType[\"NONE\"] = 1] = \"NONE\";\n RendererLineEndType[RendererLineEndType[\"UP\"] = 2] = \"UP\";\n RendererLineEndType[RendererLineEndType[\"DOWN\"] = 3] = \"DOWN\";\n})(RendererLineEndType || (RendererLineEndType = {}));\n/**\n * Support Canvas & SVG rendering contexts.\n */\nexport class Renderer {\n constructor(arg0, arg1) {\n if (isRenderContext(arg0)) {\n // The user has provided what looks like a RenderContext, let's just use it.\n this.ctx = arg0;\n }\n else {\n if (arg1 === undefined) {\n // The backend must be specified if the render context isn't directly provided.\n throw new RuntimeError('InvalidArgument', 'Missing backend argument');\n }\n const backend = arg1;\n let element;\n if (typeof arg0 == 'string') {\n const maybeElement = document.getElementById(arg0);\n if (!maybeElement) {\n throw new RuntimeError('BadElementId', `Can't find element with ID \"${maybeElement}\"`);\n }\n element = maybeElement;\n }\n else {\n element = arg0;\n }\n // Verify backend and create context\n if (backend === Renderer.Backends.CANVAS) {\n if (!isHTMLCanvas(element)) {\n throw new RuntimeError('BadElement', 'CANVAS context requires an HTMLCanvasElement.');\n }\n const context = element.getContext('2d');\n if (!context) {\n throw new RuntimeError('BadElement', \"Can't get canvas context\");\n }\n this.ctx = new CanvasContext(context);\n }\n else if (backend === Renderer.Backends.SVG) {\n if (!isHTMLDiv(element)) {\n throw new RuntimeError('BadElement', 'SVG context requires an HTMLDivElement.');\n }\n this.ctx = new SVGContext(element);\n }\n else {\n throw new RuntimeError('InvalidBackend', `No support for backend: ${backend}`);\n }\n }\n }\n static buildContext(elementId, backend, width, height, background = '#FFF') {\n const renderer = new Renderer(elementId, backend);\n if (width && height) {\n renderer.resize(width, height);\n }\n const ctx = renderer.getContext();\n ctx.setBackgroundFillStyle(background);\n Renderer.lastContext = ctx;\n return ctx;\n }\n static getCanvasContext(elementId, width, height, background) {\n return Renderer.buildContext(elementId, Renderer.Backends.CANVAS, width, height, background);\n }\n static getSVGContext(elementId, width, height, background) {\n return Renderer.buildContext(elementId, Renderer.Backends.SVG, width, height, background);\n }\n // Draw a dashed line (horizontal, vertical or diagonal\n // dashPattern = [3,3] draws a 3 pixel dash followed by a three pixel space.\n // setting the second number to 0 draws a solid line.\n static drawDashedLine(context, fromX, fromY, toX, toY, dashPattern) {\n context.beginPath();\n const dx = toX - fromX;\n const dy = toY - fromY;\n const angle = Math.atan2(dy, dx);\n let x = fromX;\n let y = fromY;\n context.moveTo(fromX, fromY);\n let idx = 0;\n let draw = true;\n while (!((dx < 0 ? x <= toX : x >= toX) && (dy < 0 ? y <= toY : y >= toY))) {\n const dashLength = dashPattern[idx++ % dashPattern.length];\n const nx = x + Math.cos(angle) * dashLength;\n x = dx < 0 ? Math.max(toX, nx) : Math.min(toX, nx);\n const ny = y + Math.sin(angle) * dashLength;\n y = dy < 0 ? Math.max(toY, ny) : Math.min(toY, ny);\n if (draw) {\n context.lineTo(x, y);\n }\n else {\n context.moveTo(x, y);\n }\n draw = !draw;\n }\n context.closePath();\n context.stroke();\n }\n resize(width, height) {\n this.ctx.resize(width, height);\n return this;\n }\n getContext() {\n return this.ctx;\n }\n}\nRenderer.Backends = RendererBackends;\nRenderer.LineEndType = RendererLineEndType;\n// Used by vexflow_test_helpers.ts\n// Should this be private?\n// Can we do this in a cleaner way?\nRenderer.lastContext = undefined;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport var Justification;\n(function (Justification) {\n Justification[Justification[\"LEFT\"] = 1] = \"LEFT\";\n Justification[Justification[\"CENTER\"] = 2] = \"CENTER\";\n Justification[Justification[\"RIGHT\"] = 3] = \"RIGHT\";\n})(Justification || (Justification = {}));\n/**\n * `TextNote` is a notation element that is positioned in time. Generally\n * meant for objects that sit above/below the staff and inline with each other.\n * `TextNote` has to be assigned to a `Stave` before rendering by means of `setStave`.\n * Examples of this would be such as dynamics, lyrics, chord changes, etc.\n */\nexport class TextNote extends Note {\n constructor(noteStruct) {\n super(noteStruct);\n this.text = noteStruct.text || '';\n this.superscript = noteStruct.superscript;\n this.subscript = noteStruct.subscript;\n this.setFont(noteStruct.font);\n this.line = noteStruct.line || 0;\n this.smooth = noteStruct.smooth || false;\n this.ignore_ticks = noteStruct.ignore_ticks || false;\n this.justification = Justification.LEFT;\n // Determine and set initial note width. Note that the text width is\n // an approximation and isn't very accurate. The only way to accurately\n // measure the length of text is with `CanvasRenderingContext2D.measureText()`.\n if (noteStruct.glyph) {\n const struct = TextNote.GLYPHS[noteStruct.glyph];\n if (!struct)\n throw new RuntimeError('Invalid glyph type: ' + noteStruct.glyph);\n this.glyph = new Glyph(struct.code, 40, { category: 'textNote' });\n this.setWidth(this.glyph.getMetrics().width);\n }\n else {\n this.glyph = undefined;\n }\n }\n static get CATEGORY() {\n return Category.TextNote;\n }\n static get Justification() {\n return Justification;\n }\n /** Glyph data. */\n static get GLYPHS() {\n return {\n segno: {\n code: 'segno',\n },\n tr: {\n code: 'ornamentTrill',\n },\n mordent: {\n code: 'ornamentMordent',\n },\n mordent_upper: {\n code: 'ornamentShortTrill',\n },\n mordent_lower: {\n code: 'ornamentMordent',\n },\n f: {\n code: 'dynamicForte',\n },\n p: {\n code: 'dynamicPiano',\n },\n m: {\n code: 'dynamicMezzo',\n },\n s: {\n code: 'dynamicSforzando',\n },\n z: {\n code: 'dynamicZ',\n },\n coda: {\n code: 'coda',\n },\n pedal_open: {\n code: 'keyboardPedalPed',\n },\n pedal_close: {\n code: 'keyboardPedalUp',\n },\n caesura_straight: {\n code: 'caesura',\n },\n caesura_curved: {\n code: 'caesuraCurved',\n },\n breath: {\n code: 'breathMarkComma',\n },\n tick: {\n code: 'breathMarkTick',\n },\n turn: {\n code: 'ornamentTurn',\n },\n turn_inverted: {\n code: 'ornamentTurnSlash',\n },\n };\n }\n /** Set the horizontal justification of the TextNote. */\n setJustification(just) {\n this.justification = just;\n return this;\n }\n /** Set the Stave line on which the note should be placed. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Pre-render formatting. */\n preFormat() {\n if (this.preFormatted)\n return;\n const tickContext = this.checkTickContext(`Can't preformat without a TickContext.`);\n if (this.smooth) {\n this.setWidth(0);\n }\n else {\n if (this.glyph) {\n // Width already set.\n }\n else {\n const ctx = this.checkContext();\n ctx.setFont(this.textFont);\n this.setWidth(ctx.measureText(this.text).width);\n }\n }\n if (this.justification === Justification.CENTER) {\n this.leftDisplacedHeadPx = this.width / 2;\n }\n else if (this.justification === Justification.RIGHT) {\n this.leftDisplacedHeadPx = this.width;\n }\n // We reposition to the center of the note head\n this.rightDisplacedHeadPx = tickContext.getMetrics().glyphPx / 2;\n this.preFormatted = true;\n }\n /**\n * Renders the TextNote.\n * `TextNote` has to be assigned to a `Stave` before rendering by means of `setStave`.\n */\n draw() {\n const ctx = this.checkContext();\n const stave = this.checkStave();\n const tickContext = this.checkTickContext(`Can't draw without a TickContext.`);\n this.setRendered();\n // Reposition to center of note head\n let x = this.getAbsoluteX() + tickContext.getMetrics().glyphPx / 2;\n // Align based on tick-context width.\n const width = this.getWidth();\n if (this.justification === Justification.CENTER) {\n x -= width / 2;\n }\n else if (this.justification === Justification.RIGHT) {\n x -= width;\n }\n let y;\n if (this.glyph) {\n y = stave.getYForLine(this.line + -3);\n this.glyph.render(ctx, x, y);\n }\n else {\n y = stave.getYForLine(this.line + -3);\n this.applyStyle(ctx);\n ctx.setFont(this.textFont);\n ctx.fillText(this.text, x, y);\n const height = ctx.measureText(this.text).height;\n // We called this.setFont(...) in the constructor, so we know this.textFont is available.\n // eslint-disable-next-line\n const { family, size, weight, style } = this.textFont;\n // Scale the font size by 1/1.3.\n const smallerFontSize = Font.scaleSize(size, 0.769231);\n if (this.superscript) {\n ctx.setFont(family, smallerFontSize, weight, style);\n ctx.fillText(this.superscript, x + this.width + 2, y - height / 2.2);\n }\n if (this.subscript) {\n ctx.setFont(family, smallerFontSize, weight, style);\n ctx.fillText(this.subscript, x + this.width + 2, y + height / 2.2 - 1);\n }\n this.restoreStyle(ctx);\n }\n }\n}\nTextNote.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 12,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Larry Kuhns 2011\nimport { Font, FontStyle, FontWeight } from './font';\nimport { StaveModifier } from './stavemodifier';\nimport { Category } from './typeguard';\nexport var VoltaType;\n(function (VoltaType) {\n VoltaType[VoltaType[\"NONE\"] = 1] = \"NONE\";\n VoltaType[VoltaType[\"BEGIN\"] = 2] = \"BEGIN\";\n VoltaType[VoltaType[\"MID\"] = 3] = \"MID\";\n VoltaType[VoltaType[\"END\"] = 4] = \"END\";\n VoltaType[VoltaType[\"BEGIN_END\"] = 5] = \"BEGIN_END\";\n})(VoltaType || (VoltaType = {}));\nexport class Volta extends StaveModifier {\n constructor(type, number, x, y_shift) {\n super();\n this.volta = type;\n this.x = x;\n this.y_shift = y_shift;\n this.number = number;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.Volta;\n }\n static get type() {\n return VoltaType;\n }\n setShiftY(y) {\n this.y_shift = y;\n return this;\n }\n draw(stave, x) {\n const ctx = stave.checkContext();\n this.setRendered();\n let width = stave.getWidth() - x; // don't include x (offset) for width\n const top_y = stave.getYForTopText(stave.getNumLines()) + this.y_shift;\n const vert_height = 1.5 * stave.getSpacingBetweenLines();\n switch (this.volta) {\n case VoltaType.BEGIN:\n ctx.fillRect(this.x + x, top_y, 1, vert_height);\n break;\n case VoltaType.END:\n width -= 5;\n ctx.fillRect(this.x + x + width, top_y, 1, vert_height);\n break;\n case VoltaType.BEGIN_END:\n width -= 3;\n ctx.fillRect(this.x + x, top_y, 1, vert_height);\n ctx.fillRect(this.x + x + width, top_y, 1, vert_height);\n break;\n default:\n break;\n }\n // If the beginning of a volta, draw measure number\n if (this.volta === VoltaType.BEGIN || this.volta === VoltaType.BEGIN_END) {\n ctx.save();\n ctx.setFont(this.textFont);\n ctx.fillText(this.number, this.x + x + 5, top_y + 15);\n ctx.restore();\n }\n ctx.fillRect(this.x + x, top_y, width, 1);\n return this;\n }\n}\nVolta.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 9,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Larry Kuhns\n//\n// This file implements the `StringNumber` class which renders string\n// number annotations beside notes.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { Renderer } from './renderer';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category, isStaveNote, isStemmableNote } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StringNumber extends Modifier {\n constructor(number) {\n super();\n this.string_number = number;\n this.setWidth(20); // ???\n this.position = Modifier.Position.ABOVE; // Default position above stem or note head\n this.x_shift = 0;\n this.y_shift = 0;\n this.text_line = 0;\n this.stem_offset = 0;\n this.x_offset = 0; // Horizontal offset from default\n this.y_offset = 0; // Vertical offset from default\n this.dashed = true; // true - draw dashed extension false - no extension\n this.leg = Renderer.LineEndType.NONE; // draw upward/downward leg at the of extension line\n this.radius = 8;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StringNumber;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static get metrics() {\n return Tables.currentMusicFont().getMetrics().glyphs.stringNumber;\n }\n // ## Static Methods\n // Arrange string numbers inside a `ModifierContext`\n static format(nums, state) {\n const left_shift = state.left_shift;\n const right_shift = state.right_shift;\n const num_spacing = 1;\n if (!nums || nums.length === 0)\n return false;\n const nums_list = [];\n let prev_note = null;\n let shift_left = 0;\n let shift_right = 0;\n const modLines = 0;\n for (let i = 0; i < nums.length; ++i) {\n const num = nums[i];\n const note = num.getNote();\n const pos = num.getPosition();\n if (!isStaveNote(note)) {\n throw new RuntimeError('NoStaveNote');\n }\n const index = num.checkIndex();\n const props = note.getKeyProps()[index];\n const mc = note.getModifierContext();\n const verticalSpaceNeeded = (num.radius * 2) / Tables.STAVE_LINE_DISTANCE + 0.5;\n if (mc) {\n if (pos === ModifierPosition.ABOVE) {\n num.text_line = mc.getState().top_text_line;\n state.top_text_line += verticalSpaceNeeded;\n }\n else if (pos === ModifierPosition.BELOW) {\n num.text_line = mc.getState().text_line;\n state.text_line += verticalSpaceNeeded;\n }\n }\n if (note !== prev_note) {\n for (let n = 0; n < note.keys.length; ++n) {\n if (left_shift === 0) {\n shift_left = Math.max(note.getLeftDisplacedHeadPx(), shift_left);\n }\n if (right_shift === 0) {\n shift_right = Math.max(note.getRightDisplacedHeadPx(), shift_right);\n }\n }\n prev_note = note;\n }\n const glyphLine = modLines === 0 ? props.line : modLines;\n nums_list.push({\n pos,\n note,\n num,\n line: glyphLine,\n shiftL: shift_left,\n shiftR: shift_right,\n });\n }\n // Sort string numbers by line number.\n nums_list.sort((a, b) => b.line - a.line);\n let num_shiftR = 0;\n let x_widthL = 0;\n let x_widthR = 0;\n let last_line = null;\n let last_note = null;\n for (let i = 0; i < nums_list.length; ++i) {\n let num_shift = 0;\n const note = nums_list[i].note;\n const pos = nums_list[i].pos;\n const num = nums_list[i].num;\n const line = nums_list[i].line;\n const shiftR = nums_list[i].shiftR;\n // Reset the position of the string number every line.\n if (line !== last_line || note !== last_note) {\n num_shiftR = right_shift + shiftR;\n }\n const num_width = num.getWidth() + num_spacing;\n if (pos === Modifier.Position.LEFT) {\n num.setXShift(left_shift);\n num_shift = shift_left + num_width; // spacing\n x_widthL = num_shift > x_widthL ? num_shift : x_widthL;\n }\n else if (pos === Modifier.Position.RIGHT) {\n num.setXShift(num_shiftR);\n num_shift += num_width; // spacing\n x_widthR = num_shift > x_widthR ? num_shift : x_widthR;\n }\n last_line = line;\n last_note = note;\n }\n state.left_shift += x_widthL;\n state.right_shift += x_widthR;\n return true;\n }\n setLineEndType(leg) {\n if (leg >= Renderer.LineEndType.NONE && leg <= Renderer.LineEndType.DOWN) {\n this.leg = leg;\n }\n return this;\n }\n setStringNumber(number) {\n this.string_number = number;\n return this;\n }\n setOffsetX(x) {\n this.x_offset = x;\n return this;\n }\n setOffsetY(y) {\n this.y_offset = y;\n return this;\n }\n setLastNote(note) {\n this.last_note = note;\n return this;\n }\n setDashed(dashed) {\n this.dashed = dashed;\n return this;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(this.position, this.index);\n const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP;\n let dot_x = start.x + this.x_shift + this.x_offset;\n let stem_ext = {};\n if (note.hasStem()) {\n stem_ext = note.checkStem().getExtents();\n }\n let dot_y = start.y + this.y_shift + this.y_offset;\n switch (this.position) {\n case Modifier.Position.ABOVE:\n {\n const ys = note.getYs();\n dot_y = ys.reduce((a, b) => (a < b ? a : b));\n if (note.hasStem() && stemDirection == Stem.UP) {\n dot_y = stem_ext.topY + StringNumber.metrics.stemPadding;\n }\n dot_y -= this.radius + StringNumber.metrics.verticalPadding + this.text_line * Tables.STAVE_LINE_DISTANCE;\n }\n break;\n case Modifier.Position.BELOW:\n {\n const ys = note.getYs();\n dot_y = ys.reduce((a, b) => (a > b ? a : b));\n if (note.hasStem() && stemDirection == Stem.DOWN) {\n dot_y = stem_ext.topY - StringNumber.metrics.stemPadding;\n }\n dot_y += this.radius + StringNumber.metrics.verticalPadding + this.text_line * Tables.STAVE_LINE_DISTANCE;\n }\n break;\n case Modifier.Position.LEFT:\n dot_x -= this.radius / 2 + StringNumber.metrics.leftPadding;\n break;\n case Modifier.Position.RIGHT:\n dot_x += this.radius / 2 + StringNumber.metrics.rightPadding;\n break;\n default:\n throw new RuntimeError('InvalidPosition', `The position ${this.position} is invalid`);\n }\n ctx.save();\n ctx.beginPath();\n ctx.arc(dot_x, dot_y, this.radius, 0, Math.PI * 2, false);\n ctx.setLineWidth(1.5);\n ctx.stroke();\n ctx.setFont(this.textFont);\n const x = dot_x - ctx.measureText(this.string_number).width / 2;\n ctx.fillText('' + this.string_number, x, dot_y + 4.5);\n const lastNote = this.last_note;\n if (isStemmableNote(lastNote)) {\n // Only StemmableNote objects have getStemX().\n const end = lastNote.getStemX() - note.getX() + 5;\n ctx.setStrokeStyle('#000000');\n ctx.setLineCap('round');\n ctx.setLineWidth(0.6);\n if (this.dashed) {\n Renderer.drawDashedLine(ctx, dot_x + 10, dot_y, dot_x + end, dot_y, [3, 3]);\n }\n else {\n Renderer.drawDashedLine(ctx, dot_x + 10, dot_y, dot_x + end, dot_y, [3, 0]);\n }\n let len;\n let pattern;\n switch (this.leg) {\n case Renderer.LineEndType.UP:\n len = -10;\n pattern = this.dashed ? [3, 3] : [3, 0];\n Renderer.drawDashedLine(ctx, dot_x + end, dot_y, dot_x + end, dot_y + len, pattern);\n break;\n case Renderer.LineEndType.DOWN:\n len = 10;\n pattern = this.dashed ? [3, 3] : [3, 0];\n Renderer.drawDashedLine(ctx, dot_x + end, dot_y, dot_x + end, dot_y + len, pattern);\n break;\n default:\n break;\n }\n }\n ctx.restore();\n }\n}\nStringNumber.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: Font.SIZE,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Larry Kuhns\n//\n// This file implements the `Stroke` class which renders chord strokes\n// that can be arpeggiated, brushed, rasquedo, etc.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Category, isNote, isStaveNote, isTabNote } from './typeguard';\nimport { RuntimeError } from './util';\nexport class Stroke extends Modifier {\n constructor(type, options) {\n super();\n this.options = Object.assign({ all_voices: true }, options);\n // multi voice - span stroke across all voices if true\n this.all_voices = this.options.all_voices;\n // multi voice - end note of stroke, set in draw()\n this.type = type;\n this.position = Modifier.Position.LEFT;\n this.render_options = {\n font_scale: 38,\n };\n this.resetFont();\n this.setXShift(0);\n this.setWidth(10);\n }\n static get CATEGORY() {\n return Category.Stroke;\n }\n // Arrange strokes inside `ModifierContext`\n static format(strokes, state) {\n const left_shift = state.left_shift;\n const stroke_spacing = 0;\n if (!strokes || strokes.length === 0)\n return false;\n const strokeList = strokes.map((stroke) => {\n const note = stroke.getNote();\n const index = stroke.checkIndex();\n if (isStaveNote(note)) {\n // Only StaveNote objects have getKeyProps().\n const { line } = note.getKeyProps()[index];\n const shift = note.getLeftDisplacedHeadPx();\n return { line, shift, stroke };\n }\n else if (isTabNote(note)) {\n // Only TabNote objects have getPositions().\n const { str: string } = note.getPositions()[index];\n return { line: string, shift: 0, stroke };\n }\n else {\n throw new RuntimeError('Internal', 'Unexpected instance.');\n }\n });\n const strokeShift = left_shift;\n // There can only be one stroke .. if more than one, they overlay each other\n const xShift = strokeList.reduce((xShift, { stroke, shift }) => {\n stroke.setXShift(strokeShift + shift);\n return Math.max(stroke.getWidth() + stroke_spacing, xShift);\n }, 0);\n state.left_shift += xShift;\n return true;\n }\n getPosition() {\n return this.position;\n }\n addEndNote(note) {\n this.note_end = note;\n return this;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(this.position, this.index);\n let ys = note.getYs();\n let topY = start.y;\n let botY = start.y;\n const x = start.x - 5;\n const line_space = note.checkStave().getSpacingBetweenLines();\n const notes = this.checkModifierContext().getMembers(note.getCategory());\n for (let i = 0; i < notes.length; i++) {\n const note = notes[i];\n if (isNote(note)) {\n // Only Note objects have getYs().\n // note is an instance of either StaveNote or TabNote.\n ys = note.getYs();\n for (let n = 0; n < ys.length; n++) {\n if (this.note === notes[i] || this.all_voices) {\n topY = Math.min(topY, ys[n]);\n botY = Math.max(botY, ys[n]);\n }\n }\n }\n }\n let arrow = '';\n let arrow_shift_x = 0;\n let arrow_y = 0;\n let text_shift_x = 0;\n let text_y = 0;\n switch (this.type) {\n case Stroke.Type.BRUSH_DOWN:\n arrow = 'arrowheadBlackUp';\n arrow_shift_x = -3;\n arrow_y = topY - line_space / 2 + 10;\n botY += line_space / 2;\n break;\n case Stroke.Type.BRUSH_UP:\n arrow = 'arrowheadBlackDown';\n arrow_shift_x = 0.5;\n arrow_y = botY + line_space / 2;\n topY -= line_space / 2;\n break;\n case Stroke.Type.ROLL_DOWN:\n case Stroke.Type.RASQUEDO_DOWN:\n arrow = 'arrowheadBlackUp';\n arrow_shift_x = -3;\n text_shift_x = this.x_shift + arrow_shift_x - 2;\n if (isStaveNote(note)) {\n topY += 1.5 * line_space;\n if ((botY - topY) % 2 !== 0) {\n botY += 0.5 * line_space;\n }\n else {\n botY += line_space;\n }\n arrow_y = topY - line_space;\n text_y = botY + line_space + 2;\n }\n else {\n topY += 1.5 * line_space;\n botY += line_space;\n arrow_y = topY - 0.75 * line_space;\n text_y = botY + 0.25 * line_space;\n }\n break;\n case Stroke.Type.ROLL_UP:\n case Stroke.Type.RASQUEDO_UP:\n arrow = 'arrowheadBlackDown';\n arrow_shift_x = -4;\n text_shift_x = this.x_shift + arrow_shift_x - 1;\n if (isStaveNote(note)) {\n arrow_y = line_space / 2;\n topY += 0.5 * line_space;\n if ((botY - topY) % 2 === 0) {\n botY += line_space / 2;\n }\n arrow_y = botY + 0.5 * line_space;\n text_y = topY - 1.25 * line_space;\n }\n else {\n topY += 0.25 * line_space;\n botY += 0.5 * line_space;\n arrow_y = botY + 0.25 * line_space;\n text_y = topY - line_space;\n }\n break;\n case Stroke.Type.ARPEGGIO_DIRECTIONLESS:\n topY += 0.5 * line_space;\n botY += line_space; // * 0.5 can lead to slight underlap instead of overlap sometimes\n break;\n default:\n throw new RuntimeError('InvalidType', `The stroke type ${this.type} does not exist`);\n }\n let strokeLine = 'straight';\n // Draw the stroke\n if (this.type === Stroke.Type.BRUSH_DOWN || this.type === Stroke.Type.BRUSH_UP) {\n ctx.fillRect(x + this.x_shift, topY, 1, botY - topY);\n }\n else {\n strokeLine = 'wiggly';\n if (isStaveNote(note)) {\n for (let i = topY; i <= botY; i += line_space) {\n Glyph.renderGlyph(ctx, x + this.x_shift - 4, i, this.render_options.font_scale, 'vexWiggleArpeggioUp');\n }\n }\n else {\n let i;\n for (i = topY; i <= botY; i += 10) {\n Glyph.renderGlyph(ctx, x + this.x_shift - 4, i, this.render_options.font_scale, 'vexWiggleArpeggioUp');\n }\n if (this.type === Stroke.Type.RASQUEDO_DOWN) {\n text_y = i + 0.25 * line_space;\n }\n }\n }\n if (this.type === Stroke.Type.ARPEGGIO_DIRECTIONLESS) {\n return; // skip drawing arrow heads or text\n }\n // Draw the arrow head\n Glyph.renderGlyph(ctx, x + this.x_shift + arrow_shift_x, arrow_y, this.render_options.font_scale, arrow, {\n category: `stroke.${arrow}.${strokeLine}`,\n });\n // Draw the rasquedo \"R\"\n if (this.type === Stroke.Type.RASQUEDO_DOWN || this.type === Stroke.Type.RASQUEDO_UP) {\n ctx.save();\n ctx.setFont(this.textFont);\n ctx.fillText('R', x + text_shift_x, text_y);\n ctx.restore();\n }\n }\n}\nStroke.Type = {\n BRUSH_DOWN: 1,\n BRUSH_UP: 2,\n ROLL_DOWN: 3,\n ROLL_UP: 4,\n RASQUEDO_DOWN: 5,\n RASQUEDO_UP: 6,\n ARPEGGIO_DIRECTIONLESS: 7, // Arpeggiated chord without upwards or downwards arrow\n};\nStroke.TEXT_FONT = {\n family: Font.SERIF,\n size: Font.SIZE,\n weight: FontWeight.BOLD,\n style: FontStyle.ITALIC,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Bend } from './bend';\nimport { Modifier } from './modifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\n/** `Vibrato` implements diverse vibratos. */\nexport class Vibrato extends Modifier {\n constructor() {\n super();\n this.position = Modifier.Position.RIGHT;\n this.render_options = {\n harsh: false,\n vibrato_width: 20,\n wave_height: 6,\n wave_width: 4,\n wave_girth: 2,\n };\n this.setVibratoWidth(this.render_options.vibrato_width);\n }\n static get CATEGORY() {\n return Category.Vibrato;\n }\n /** Arrange vibratos inside a `ModifierContext`. */\n static format(vibratos, state, context) {\n if (!vibratos || vibratos.length === 0)\n return false;\n // Vibratos are always on top.\n let text_line = state.top_text_line;\n let width = 0;\n let shift = state.right_shift - 7;\n // If there's a bend, drop the text line\n const bends = context.getMembers(Bend.CATEGORY);\n if (bends && bends.length > 0) {\n const bendHeight = bends.map((bb) => bb.getTextHeight()).reduce((a, b) => (a > b ? a : b)) / Tables.STAVE_LINE_DISTANCE;\n text_line = text_line - (bendHeight + 1);\n }\n else {\n state.top_text_line += 1;\n }\n // Format Vibratos\n for (let i = 0; i < vibratos.length; ++i) {\n const vibrato = vibratos[i];\n vibrato.setXShift(shift);\n vibrato.setTextLine(text_line);\n width += vibrato.getWidth();\n shift += width;\n }\n state.right_shift += width;\n return true;\n }\n /** Set harsh vibrato. */\n setHarsh(harsh) {\n this.render_options.harsh = harsh;\n return this;\n }\n /** Set vibrato width in pixels. */\n setVibratoWidth(width) {\n this.render_options.vibrato_width = width;\n this.setWidth(width);\n return this;\n }\n /** Draw the vibrato on the rendering context. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(Modifier.Position.RIGHT, this.index);\n const vx = start.x + this.x_shift;\n const vy = note.getYForTopText(this.text_line) + 2;\n Vibrato.renderVibrato(ctx, vx, vy, this.render_options);\n }\n /**\n * Static rendering method that can be called from\n * other classes (e.g. VibratoBracket).\n */\n static renderVibrato(ctx, x, y, opts) {\n const { harsh, vibrato_width, wave_width, wave_girth, wave_height } = opts;\n const num_waves = vibrato_width / wave_width;\n ctx.beginPath();\n let i;\n if (harsh) {\n ctx.moveTo(x, y + wave_girth + 1);\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.lineTo(x + wave_width, y - wave_height / 2);\n x += wave_width;\n ctx.lineTo(x + wave_width, y + wave_height / 2);\n x += wave_width;\n }\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.lineTo(x - wave_width, y - wave_height / 2 + wave_girth + 1);\n x -= wave_width;\n ctx.lineTo(x - wave_width, y + wave_height / 2 + wave_girth + 1);\n x -= wave_width;\n }\n ctx.fill();\n }\n else {\n ctx.moveTo(x, y + wave_girth);\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.quadraticCurveTo(x + wave_width / 2, y - wave_height / 2, x + wave_width, y);\n x += wave_width;\n ctx.quadraticCurveTo(x + wave_width / 2, y + wave_height / 2, x + wave_width, y);\n x += wave_width;\n }\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.quadraticCurveTo(x - wave_width / 2, y + wave_height / 2 + wave_girth, x - wave_width, y + wave_girth);\n x -= wave_width;\n ctx.quadraticCurveTo(x - wave_width / 2, y - wave_height / 2 + wave_girth, x - wave_width, y + wave_girth);\n x -= wave_width;\n }\n ctx.fill();\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This class implements various types of members to notes (e.g. bends,\n// fingering positions etc.)\nimport { Accidental } from './accidental';\nimport { Annotation } from './annotation';\nimport { Articulation } from './articulation';\nimport { Bend } from './bend';\nimport { ChordSymbol } from './chordsymbol';\nimport { Dot } from './dot';\nimport { FretHandFinger } from './frethandfinger';\nimport { GraceNoteGroup } from './gracenotegroup';\nimport { NoteSubGroup } from './notesubgroup';\nimport { Ornament } from './ornament';\nimport { Parenthesis } from './parenthesis';\nimport { StaveNote } from './stavenote';\nimport { StringNumber } from './stringnumber';\nimport { Stroke } from './strokes';\nimport { Category } from './typeguard';\nimport { log, RuntimeError } from './util';\nimport { Vibrato } from './vibrato';\n// To enable logging for this class. Set `Vex.Flow.ModifierContext.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (ModifierContext.DEBUG)\n log('Vex.Flow.ModifierContext', args);\n}\nexport class ModifierContext {\n constructor() {\n // Formatting data.\n this.state = {\n left_shift: 0,\n right_shift: 0,\n text_line: 0,\n top_text_line: 0,\n };\n // Current members\n this.members = {};\n this.preFormatted = false;\n this.postFormatted = false;\n this.formatted = false;\n this.width = 0;\n this.spacing = 0;\n }\n addModifier(member) {\n L('addModifier is deprecated, use addMember instead.');\n return this.addMember(member);\n }\n /**\n * this.members maps CATEGORY strings to arrays of Tickable | Modifier | StaveNote | TabNote.\n * Here we add a new member to this.members, and create a new array if needed.\n * @param member\n * @returns this\n */\n addMember(member) {\n const category = member.getCategory();\n if (!this.members[category]) {\n this.members[category] = [];\n }\n this.members[category].push(member);\n member.setModifierContext(this);\n this.preFormatted = false;\n return this;\n }\n /**\n * @deprecated\n */\n getModifiers(category) {\n L('getModifiers is deprecated, use getMembers instead.');\n return this.getMembers(category);\n }\n getMembers(category) {\n var _a;\n return (_a = this.members[category]) !== null && _a !== void 0 ? _a : [];\n }\n getWidth() {\n return this.width;\n }\n getLeftShift() {\n return this.state.left_shift;\n }\n getRightShift() {\n return this.state.right_shift;\n }\n getState() {\n return this.state;\n }\n getMetrics() {\n if (!this.formatted) {\n throw new RuntimeError('UnformattedMember', 'Unformatted member has no metrics.');\n }\n return {\n width: this.state.left_shift + this.state.right_shift + this.spacing,\n spacing: this.spacing,\n };\n }\n preFormat() {\n if (this.preFormatted)\n return;\n L('Preformatting ModifierContext');\n const state = this.state;\n const members = this.members;\n // The ordering below determines when different members are formatted and rendered.\n StaveNote.format(members[Category.StaveNote], state);\n Parenthesis.format(members[Category.Parenthesis], state);\n Dot.format(members[Category.Dot], state);\n FretHandFinger.format(members[Category.FretHandFinger], state);\n Accidental.format(members[Category.Accidental], state);\n Stroke.format(members[Category.Stroke], state);\n GraceNoteGroup.format(members[Category.GraceNoteGroup], state);\n NoteSubGroup.format(members[Category.NoteSubGroup], state);\n StringNumber.format(members[Category.StringNumber], state);\n Articulation.format(members[Category.Articulation], state);\n Ornament.format(members[Category.Ornament], state);\n Annotation.format(members[Category.Annotation], state);\n ChordSymbol.format(members[Category.ChordSymbol], state);\n Bend.format(members[Category.Bend], state);\n Vibrato.format(members[Category.Vibrato], state, this);\n // Update width of this member context\n this.width = state.left_shift + state.right_shift;\n this.preFormatted = true;\n }\n postFormat() {\n if (this.postFormatted)\n return;\n L('Postformatting ModifierContext');\n // If post-formatting is required for an element, add more lines below.\n StaveNote.postFormat(this.getMembers(Category.StaveNote));\n }\n}\nModifierContext.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna Cheppudira 2013.\n// Co-author: Benjamin W. Bohl\n// MIT License\nimport { Glyph } from './glyph';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Clef.DEBUG)\n log('Vex.Flow.Clef', args);\n}\n/**\n * Clef implements various types of clefs that can be rendered on a stave.\n *\n * See `tests/clef_tests.ts` for usage examples.\n */\nexport class Clef extends StaveModifier {\n /** Create a new clef. */\n constructor(type, size, annotation) {\n super();\n /**\n * The attribute `clef` must be a key from\n * `Clef.types`\n */\n this.clef = Clef.types['treble'];\n this.setPosition(StaveModifierPosition.BEGIN);\n this.setType(type, size, annotation);\n this.setWidth(Tables.currentMusicFont().lookupMetric(`clef.${this.size}.width`));\n L('Creating clef:', type);\n }\n static get CATEGORY() {\n return Category.Clef;\n }\n /**\n * Every clef name is associated with a glyph code from the font file\n * and a default stave line number.\n */\n static get types() {\n return {\n treble: {\n code: 'gClef',\n line: 3,\n point: 0,\n },\n bass: {\n code: 'fClef',\n line: 1,\n point: 0,\n },\n alto: {\n code: 'cClef',\n line: 2,\n point: 0,\n },\n tenor: {\n code: 'cClef',\n line: 1,\n point: 0,\n },\n percussion: {\n code: 'restMaxima',\n line: 2,\n point: 0,\n },\n soprano: {\n code: 'cClef',\n line: 4,\n point: 0,\n },\n 'mezzo-soprano': {\n code: 'cClef',\n line: 3,\n point: 0,\n },\n 'baritone-c': {\n code: 'cClef',\n line: 0,\n point: 0,\n },\n 'baritone-f': {\n code: 'fClef',\n line: 2,\n point: 0,\n },\n subbass: {\n code: 'fClef',\n line: 0,\n point: 0,\n },\n french: {\n code: 'gClef',\n line: 4,\n point: 0,\n },\n tab: {\n code: '6stringTabClef',\n point: 0,\n },\n };\n }\n /** Set clef type, size and annotation. */\n setType(type, size, annotation) {\n this.type = type;\n this.clef = Clef.types[type];\n if (size === undefined) {\n this.size = 'default';\n }\n else {\n this.size = size;\n }\n const musicFont = Tables.currentMusicFont();\n this.clef.point = musicFont.lookupMetric(`clef.${this.size}.point`, 0);\n this.glyph = new Glyph(this.clef.code, this.clef.point, {\n category: `clef.${this.clef.code}.${this.size}`,\n });\n // If an annotation, such as 8va, is specified, add it to the Clef object.\n if (annotation !== undefined) {\n const code = musicFont.lookupMetric(`clef.annotations.${annotation}.smuflCode`);\n const point = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.point`);\n const line = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.${this.type}.line`);\n const x_shift = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.${this.type}.shiftX`);\n this.annotation = { code, point, line, x_shift };\n this.attachment = new Glyph(this.annotation.code, this.annotation.point);\n this.attachment.metrics.x_max = 0;\n this.attachment.setXShift(this.annotation.x_shift);\n }\n else {\n this.annotation = undefined;\n }\n return this;\n }\n /** Get clef width. */\n getWidth() {\n if (this.type === 'tab') {\n defined(this.stave, 'ClefError', \"Can't get width without stave.\");\n }\n return this.width;\n }\n /** Set associated stave. */\n setStave(stave) {\n this.stave = stave;\n if (this.type === 'tab') {\n const glyph = defined(this.glyph, 'ClefError', \"Can't set stave without glyph.\");\n const numLines = this.stave.getNumLines();\n const musicFont = Tables.currentMusicFont();\n const point = musicFont.lookupMetric(`clef.lineCount.${numLines}.point`);\n const shiftY = musicFont.lookupMetric(`clef.lineCount.${numLines}.shiftY`);\n glyph.setPoint(point);\n glyph.setYShift(shiftY);\n }\n return this;\n }\n /** Render clef. */\n draw() {\n const glyph = defined(this.glyph, 'ClefError', \"Can't draw clef without glyph.\");\n const stave = this.checkStave();\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.openGroup('clef', this.getAttribute('id'));\n glyph.setStave(stave);\n glyph.setContext(ctx);\n if (this.clef.line !== undefined) {\n this.placeGlyphOnLine(glyph, stave, this.clef.line);\n }\n glyph.renderToStave(this.x);\n if (this.annotation !== undefined && this.attachment !== undefined) {\n this.placeGlyphOnLine(this.attachment, stave, this.annotation.line);\n this.attachment.setStave(stave);\n this.attachment.setContext(ctx);\n this.attachment.renderToStave(this.x);\n }\n ctx.closeGroup();\n }\n}\n/** To enable logging for this class, set `Vex.Flow.Clef.DEBUG` to `true`. */\nClef.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Cyril Silverman\n//\n// ## Description\n//\n// This file implements key signatures. A key signature sits on a stave\n// and indicates the notes with implicit accidentals.\nimport { Glyph } from './glyph';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined } from './util';\nexport class KeySignature extends StaveModifier {\n // Create a new Key Signature based on a `key_spec`\n constructor(keySpec, cancelKeySpec, alterKeySpec) {\n super();\n this.accList = [];\n this.setKeySig(keySpec, cancelKeySpec, alterKeySpec);\n this.setPosition(StaveModifierPosition.BEGIN);\n this.glyphFontScale = 38; // TODO(0xFE): Should this match StaveNote?\n this.glyphs = [];\n this.xPositions = []; // relative to this.x\n this.paddingForced = false;\n }\n static get CATEGORY() {\n return Category.KeySignature;\n }\n // Add an accidental glyph to the `KeySignature` instance which represents\n // the provided `acc`. If `nextAcc` is also provided, the appropriate\n // spacing will be included in the glyph's position\n convertToGlyph(acc, nextAcc) {\n const accGlyphData = Tables.accidentalCodes(acc.type);\n const glyph = new Glyph(accGlyphData.code, this.glyphFontScale);\n // Determine spacing between current accidental and the next accidental\n let extraWidth = 1;\n if (acc.type === 'n' && nextAcc) {\n const spacing = KeySignature.accidentalSpacing[nextAcc.type];\n if (spacing) {\n const isAbove = nextAcc.line >= acc.line;\n extraWidth = isAbove ? spacing.above : spacing.below;\n }\n }\n // Place the glyph on the stave\n this.placeGlyphOnLine(glyph, this.checkStave(), acc.line);\n this.glyphs.push(glyph);\n const xPosition = this.xPositions[this.xPositions.length - 1];\n const glyphWidth = glyph.getMetrics().width + extraWidth;\n // Store the next accidental's x position\n this.xPositions.push(xPosition + glyphWidth);\n // Expand size of key signature\n this.width += glyphWidth;\n }\n // Cancel out a key signature provided in the `spec` parameter. This will\n // place appropriate natural accidentals before the key signature.\n cancelKey(spec) {\n this.formatted = false;\n this.cancelKeySpec = spec;\n return this;\n }\n convertToCancelAccList(spec) {\n // Get the accidental list for the cancelled key signature\n const cancel_accList = Tables.keySignature(spec);\n // If the cancelled key has a different accidental type, ie: # vs b\n const different_types = this.accList.length > 0 && cancel_accList.length > 0 && cancel_accList[0].type !== this.accList[0].type;\n // Determine how many naturals needed to add\n const naturals = different_types ? cancel_accList.length : cancel_accList.length - this.accList.length;\n // Return if no naturals needed\n if (naturals < 1)\n return undefined;\n // Get the line position for each natural\n const cancelled = [];\n for (let i = 0; i < naturals; i++) {\n let index = i;\n if (!different_types) {\n index = cancel_accList.length - naturals + i;\n }\n const acc = cancel_accList[index];\n cancelled.push({ type: 'n', line: acc.line });\n }\n // Combine naturals with main accidental list for the key signature\n this.accList = cancelled.concat(this.accList);\n return {\n accList: cancelled,\n type: cancel_accList[0].type,\n };\n }\n // Deprecated\n addToStave(stave) {\n this.paddingForced = true;\n stave.addModifier(this);\n return this;\n }\n // Apply the accidental staff line placement based on the `clef` and\n // the accidental `type` for the key signature ('# or 'b').\n convertAccLines(clef, type, accList = this.accList) {\n let offset = 0.0; // if clef === \"treble\"\n let customLines; // when clef doesn't follow treble key sig shape\n switch (clef) {\n // Treble & Subbass both have offsets of 0, so are not included.\n case 'soprano':\n if (type === '#')\n customLines = [2.5, 0.5, 2, 0, 1.5, -0.5, 1];\n else\n offset = -1;\n break;\n case 'mezzo-soprano':\n if (type === 'b')\n customLines = [0, 2, 0.5, 2.5, 1, 3, 1.5];\n else\n offset = 1.5;\n break;\n case 'alto':\n offset = 0.5;\n break;\n case 'tenor':\n if (type === '#')\n customLines = [3, 1, 2.5, 0.5, 2, 0, 1.5];\n else\n offset = -0.5;\n break;\n case 'baritone-f':\n case 'baritone-c':\n if (type === 'b')\n customLines = [0.5, 2.5, 1, 3, 1.5, 3.5, 2];\n else\n offset = 2;\n break;\n case 'bass':\n case 'french':\n offset = 1;\n break;\n default:\n break;\n }\n // If there's a special case, assign those lines/spaces:\n let i;\n if (typeof customLines !== 'undefined') {\n for (i = 0; i < accList.length; ++i) {\n accList[i].line = customLines[i];\n }\n }\n else if (offset !== 0) {\n for (i = 0; i < accList.length; ++i) {\n accList[i].line += offset;\n }\n }\n }\n getPadding(index) {\n if (!this.formatted)\n this.format();\n return this.glyphs.length === 0 || (!this.paddingForced && index < 2) ? 0 : this.padding;\n }\n getWidth() {\n if (!this.formatted)\n this.format();\n return this.width;\n }\n setKeySig(keySpec, cancelKeySpec, alterKeySpec) {\n this.formatted = false;\n this.keySpec = keySpec;\n this.cancelKeySpec = cancelKeySpec;\n this.alterKeySpec = alterKeySpec;\n return this;\n }\n // Alter the accidentals of a key spec one by one.\n // Each alteration is a new accidental that replaces the\n // original accidental (or the canceled one).\n alterKey(alterKeySpec) {\n this.formatted = false;\n this.alterKeySpec = alterKeySpec;\n return this;\n }\n convertToAlterAccList(alterKeySpec) {\n const max = Math.min(alterKeySpec.length, this.accList.length);\n for (let i = 0; i < max; ++i) {\n if (alterKeySpec[i]) {\n this.accList[i].type = alterKeySpec[i];\n }\n }\n }\n format() {\n const stave = this.checkStave();\n this.width = 0;\n this.glyphs = [];\n this.xPositions = [0]; // initialize with initial x position\n this.accList = Tables.keySignature(defined(this.keySpec));\n const accList = this.accList;\n const firstAccidentalType = accList.length > 0 ? accList[0].type : undefined;\n let cancelAccList;\n if (this.cancelKeySpec) {\n cancelAccList = this.convertToCancelAccList(this.cancelKeySpec);\n }\n if (this.alterKeySpec) {\n this.convertToAlterAccList(this.alterKeySpec);\n }\n if (this.accList.length > 0) {\n const clef = (this.position === StaveModifierPosition.END ? stave.getEndClef() : stave.getClef()) || stave.getClef();\n if (cancelAccList) {\n this.convertAccLines(clef, cancelAccList.type, cancelAccList.accList);\n }\n this.convertAccLines(clef, firstAccidentalType, accList);\n for (let i = 0; i < this.accList.length; ++i) {\n this.convertToGlyph(this.accList[i], this.accList[i + 1]);\n }\n }\n this.formatted = true;\n }\n draw() {\n const stave = this.checkStave();\n const ctx = stave.checkContext();\n if (!this.formatted)\n this.format();\n this.setRendered();\n ctx.openGroup('keysignature', this.getAttribute('id'));\n for (let i = 0; i < this.glyphs.length; i++) {\n const glyph = this.glyphs[i];\n const x = this.x + this.xPositions[i];\n glyph.setStave(stave);\n glyph.setContext(ctx);\n glyph.renderToStave(x);\n }\n ctx.closeGroup();\n }\n}\n// Space between natural and following accidental depending\n// on vertical position\nKeySignature.accidentalSpacing = {\n '#': {\n above: 6,\n below: 4,\n },\n b: {\n above: 4,\n below: 7,\n },\n n: {\n above: 4,\n below: 1,\n },\n '##': {\n above: 6,\n below: 4,\n },\n bb: {\n above: 4,\n below: 7,\n },\n db: {\n above: 4,\n below: 7,\n },\n d: {\n above: 4,\n below: 7,\n },\n bbs: {\n above: 4,\n below: 7,\n },\n '++': {\n above: 6,\n below: 4,\n },\n '+': {\n above: 6,\n below: 4,\n },\n '+-': {\n above: 6,\n below: 4,\n },\n '++-': {\n above: 6,\n below: 4,\n },\n bs: {\n above: 4,\n below: 10,\n },\n bss: {\n above: 4,\n below: 10,\n },\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Larry Kuhns 2011\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { StaveModifier } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nexport class Repetition extends StaveModifier {\n constructor(type, x, y_shift) {\n super();\n this.symbol_type = type;\n this.x = x;\n this.x_shift = 0;\n this.y_shift = y_shift;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.Repetition;\n }\n setShiftX(x) {\n this.x_shift = x;\n return this;\n }\n setShiftY(y) {\n this.y_shift = y;\n return this;\n }\n draw(stave, x) {\n this.setRendered();\n switch (this.symbol_type) {\n case Repetition.type.CODA_RIGHT:\n this.drawCodaFixed(stave, x + stave.getWidth());\n break;\n case Repetition.type.CODA_LEFT:\n this.drawSymbolText(stave, x, 'Coda', true);\n break;\n case Repetition.type.SEGNO_LEFT:\n this.drawSignoFixed(stave, x);\n break;\n case Repetition.type.SEGNO_RIGHT:\n this.drawSignoFixed(stave, x + stave.getWidth());\n break;\n case Repetition.type.DC:\n this.drawSymbolText(stave, x, 'D.C.', false);\n break;\n case Repetition.type.DC_AL_CODA:\n this.drawSymbolText(stave, x, 'D.C. al', true);\n break;\n case Repetition.type.DC_AL_FINE:\n this.drawSymbolText(stave, x, 'D.C. al Fine', false);\n break;\n case Repetition.type.DS:\n this.drawSymbolText(stave, x, 'D.S.', false);\n break;\n case Repetition.type.DS_AL_CODA:\n this.drawSymbolText(stave, x, 'D.S. al', true);\n break;\n case Repetition.type.DS_AL_FINE:\n this.drawSymbolText(stave, x, 'D.S. al Fine', false);\n break;\n case Repetition.type.FINE:\n this.drawSymbolText(stave, x, 'Fine', false);\n break;\n case Repetition.type.TO_CODA:\n this.drawSymbolText(stave, x, 'To', true);\n break;\n default:\n break;\n }\n return this;\n }\n drawCodaFixed(stave, x) {\n const y = stave.getYForTopText(stave.getNumLines()) + this.y_shift;\n Glyph.renderGlyph(stave.checkContext(), this.x + x + this.x_shift, y + Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY'), 40, 'coda', { category: 'coda' });\n return this;\n }\n drawSignoFixed(stave, x) {\n const y = stave.getYForTopText(stave.getNumLines()) + this.y_shift;\n Glyph.renderGlyph(stave.checkContext(), this.x + x + this.x_shift, y + Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY'), 30, 'segno', { category: 'segno' });\n return this;\n }\n drawSymbolText(stave, x, text, draw_coda) {\n const ctx = stave.checkContext();\n ctx.save();\n ctx.setFont(this.textFont);\n let text_x = 0;\n let symbol_x = 0;\n const modifierWidth = stave.getNoteStartX() - this.x;\n switch (this.symbol_type) {\n // To the left with symbol\n case Repetition.type.CODA_LEFT:\n // Offset Coda text to right of stave beginning\n text_x = this.x + stave.getVerticalBarWidth();\n symbol_x =\n text_x +\n ctx.measureText(text).width +\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol');\n break;\n // To the right without symbol\n case Repetition.type.DC:\n case Repetition.type.DC_AL_FINE:\n case Repetition.type.DS:\n case Repetition.type.DS_AL_FINE:\n case Repetition.type.FINE:\n text_x =\n this.x +\n x +\n this.x_shift +\n stave.getWidth() -\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.spacing') -\n modifierWidth -\n ctx.measureText(text).width;\n break;\n // To the right with symbol\n default:\n text_x =\n this.x +\n x +\n this.x_shift +\n stave.getWidth() -\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.spacing') -\n modifierWidth -\n ctx.measureText(text).width -\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol');\n symbol_x =\n text_x +\n ctx.measureText(text).width +\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol');\n break;\n }\n const y = stave.getYForTopText(stave.getNumLines()) +\n this.y_shift +\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY');\n if (draw_coda) {\n Glyph.renderGlyph(ctx, symbol_x, y, 40, 'coda', { category: 'coda' });\n }\n ctx.fillText(text, text_x, y + 5);\n ctx.restore();\n return this;\n }\n}\nRepetition.TEXT_FONT = {\n family: Font.SERIF,\n size: 12,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\nRepetition.type = {\n NONE: 1,\n CODA_LEFT: 2,\n CODA_RIGHT: 3,\n SEGNO_LEFT: 4,\n SEGNO_RIGHT: 5,\n DC: 6,\n DC_AL_CODA: 7,\n DC_AL_FINE: 8,\n DS: 9,\n DS_AL_CODA: 10,\n DS_AL_FINE: 11,\n FINE: 12,\n TO_CODA: 13, // To Coda at end of stave\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Larry Kuhns 2011\nimport { Font, FontStyle, FontWeight } from './font';\nimport { StaveModifier } from './stavemodifier';\nimport { Category } from './typeguard';\nexport class StaveSection extends StaveModifier {\n constructor(section, x, shift_y) {\n super();\n this.setWidth(16);\n this.section = section;\n this.x = x;\n this.shift_x = 0;\n this.shift_y = shift_y;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StaveSection;\n }\n setStaveSection(section) {\n this.section = section;\n return this;\n }\n setShiftX(x) {\n this.shift_x = x;\n return this;\n }\n setShiftY(y) {\n this.shift_y = y;\n return this;\n }\n draw(stave, shift_x) {\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.save();\n ctx.setLineWidth(2);\n ctx.setFont(this.textFont);\n const paddingX = 2;\n const paddingY = 2;\n const rectWidth = 2;\n const textMeasurements = ctx.measureText(this.section);\n const textWidth = textMeasurements.width;\n const textHeight = textMeasurements.height;\n const width = textWidth + 2 * paddingX; // add left & right padding\n const height = textHeight + 2 * paddingY; // add top & bottom padding\n // Seems to be a good default y\n const y = stave.getYForTopText(2) + this.shift_y;\n const x = this.x + shift_x;\n ctx.beginPath();\n ctx.setLineWidth(rectWidth);\n ctx.rect(x, y + textMeasurements.y - paddingY, width, height);\n ctx.stroke();\n ctx.fillText(this.section, x + paddingX, y);\n ctx.restore();\n return this;\n }\n}\nStaveSection.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 10,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Radosaw Eichler 2012\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nexport class StaveTempo extends StaveModifier {\n constructor(tempo, x, shift_y) {\n super();\n /** Font size for note. */\n this.render_options = { glyph_font_scale: 30 };\n this.tempo = tempo;\n this.position = StaveModifierPosition.ABOVE;\n this.x = x;\n this.shift_x = 10;\n this.shift_y = shift_y;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StaveTempo;\n }\n setTempo(tempo) {\n this.tempo = tempo;\n return this;\n }\n setShiftX(x) {\n this.shift_x = x;\n return this;\n }\n setShiftY(y) {\n this.shift_y = y;\n return this;\n }\n draw(stave, shift_x) {\n const ctx = stave.checkContext();\n this.setRendered();\n const options = this.render_options;\n // FIXME: What does the '38' mean? Why 38? Is that supposed to\n // be the default font size for standard notation?\n const scale = options.glyph_font_scale / 38;\n const name = this.tempo.name;\n const duration = this.tempo.duration;\n const dots = this.tempo.dots || 0;\n const bpm = this.tempo.bpm;\n let x = this.x + this.shift_x + shift_x;\n const y = stave.getYForTopText(1) + this.shift_y;\n ctx.save();\n if (name) {\n ctx.setFont(this.textFont);\n ctx.fillText(name, x, y);\n x += ctx.measureText(name).width;\n }\n if (duration && bpm) {\n // Override the weight and style.\n ctx.setFont(Object.assign(Object.assign({}, this.textFont), { weight: 'normal', style: 'normal' }));\n if (name) {\n x += ctx.measureText(' ').width;\n ctx.fillText('(', x, y);\n x += ctx.measureText('(').width;\n }\n const code = Tables.getGlyphProps(duration);\n x += 3 * scale;\n Glyph.renderGlyph(ctx, x, y, options.glyph_font_scale, code.code_head);\n x += code.getWidth() * scale;\n // Draw stem and flags\n if (code.stem) {\n let stem_height = 30;\n if (code.beam_count)\n stem_height += 3 * (code.beam_count - 1);\n stem_height *= scale;\n const y_top = y - stem_height;\n ctx.fillRect(x - scale, y_top, scale, stem_height);\n if (code.flag) {\n Glyph.renderGlyph(ctx, x, y_top, options.glyph_font_scale, code.code_flag_upstem, {\n category: 'flag.staveTempo',\n });\n if (!dots)\n x += 6 * scale;\n }\n }\n // Draw dot\n for (let i = 0; i < dots; i++) {\n x += 6 * scale;\n ctx.beginPath();\n ctx.arc(x, y + 2 * scale, 2 * scale, 0, Math.PI * 2, false);\n ctx.fill();\n }\n ctx.fillText(' = ' + bpm + (name ? ')' : ''), x + 3 * scale, y);\n }\n ctx.restore();\n return this;\n }\n}\nStaveTempo.TEXT_FONT = {\n family: Font.SERIF,\n size: 14,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2014\nimport { Font, FontStyle, FontWeight } from './font';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Justification, TextNote } from './textnote';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StaveText extends StaveModifier {\n constructor(text, position, options = {}) {\n super();\n this.setWidth(16);\n this.text = text;\n this.position = position;\n this.options = Object.assign({ shift_x: 0, shift_y: 0, justification: TextNote.Justification.CENTER }, options);\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StaveText;\n }\n setStaveText(text) {\n this.text = text;\n return this;\n }\n setShiftX(x) {\n this.shift_x = x;\n return this;\n }\n setShiftY(y) {\n this.shift_y = y;\n return this;\n }\n setText(text) {\n this.text = text;\n return this;\n }\n draw(stave) {\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.save();\n ctx.setLineWidth(2);\n ctx.setFont(this.textFont);\n const text_width = ctx.measureText('' + this.text).width;\n let x;\n let y;\n switch (this.position) {\n case StaveModifierPosition.LEFT:\n case StaveModifierPosition.RIGHT:\n y = (stave.getYForLine(0) + stave.getBottomLineY()) / 2 + this.options.shift_y;\n if (this.position === StaveModifierPosition.LEFT) {\n x = stave.getX() - text_width - 24 + this.options.shift_x;\n }\n else {\n x = stave.getX() + stave.getWidth() + 24 + this.options.shift_x;\n }\n break;\n case StaveModifierPosition.ABOVE:\n case StaveModifierPosition.BELOW:\n x = stave.getX() + this.options.shift_x;\n if (this.options.justification === Justification.CENTER) {\n x += stave.getWidth() / 2 - text_width / 2;\n }\n else if (this.options.justification === Justification.RIGHT) {\n x += stave.getWidth() - text_width;\n }\n if (this.position === StaveModifierPosition.ABOVE) {\n y = stave.getYForTopText(2) + this.options.shift_y;\n }\n else {\n y = stave.getYForBottomText(2) + this.options.shift_y;\n }\n break;\n default:\n throw new RuntimeError('InvalidPosition', 'Value Must be in Modifier.Position.');\n }\n ctx.fillText('' + this.text, x, y + 4);\n ctx.restore();\n return this;\n }\n}\nStaveText.TEXT_FONT = {\n family: Font.SERIF,\n size: 16,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// Renders time signatures glyphs for staffs\n// This class is used by TimeSignature to render the associated glyphs\nimport { Glyph } from './glyph';\nimport { defined } from './util';\nexport class TimeSignatureGlyph extends Glyph {\n constructor(timeSignature, topDigits, botDigits, code, point, options) {\n var _a;\n super(code, point, options);\n this.timeSignature = timeSignature;\n this.topGlyphs = [];\n this.botGlyphs = [];\n let topWidth = 0;\n for (let i = 0; i < topDigits.length; ++i) {\n let timeSigType = topDigits[i];\n switch (topDigits[i]) {\n case '-':\n timeSigType = 'Minus';\n break;\n case '+':\n timeSigType = botDigits.length > 0 ? 'PlusSmall' : 'Plus';\n break;\n case '(':\n timeSigType = botDigits.length > 0 ? 'ParensLeftSmall' : 'ParensLeft';\n break;\n case ')':\n timeSigType = botDigits.length > 0 ? 'ParensRightSmall' : 'ParensRight';\n break;\n }\n const topGlyph = new Glyph('timeSig' + timeSigType, this.timeSignature.point);\n this.topGlyphs.push(topGlyph);\n topWidth += (_a = topGlyph.getMetrics().width) !== null && _a !== void 0 ? _a : 0;\n }\n let botWidth = 0;\n for (let i = 0; i < botDigits.length; ++i) {\n let timeSigType = botDigits[i];\n switch (botDigits[i]) {\n case '+':\n timeSigType = 'PlusSmall';\n break;\n case '(':\n timeSigType = 'ParensLeftSmall';\n break;\n case ')':\n timeSigType = 'ParensRightSmall';\n break;\n }\n const botGlyph = new Glyph('timeSig' + timeSigType, this.timeSignature.point);\n this.botGlyphs.push(botGlyph);\n botWidth += defined(botGlyph.getMetrics().width);\n }\n this.width = Math.max(topWidth, botWidth);\n this.xMin = this.getMetrics().x_min;\n this.topStartX = (this.width - topWidth) / 2.0;\n this.botStartX = (this.width - botWidth) / 2.0;\n this.reset();\n }\n getMetrics() {\n return {\n x_min: this.xMin,\n x_max: this.xMin + this.width,\n width: this.width,\n };\n }\n renderToStave(x) {\n const stave = this.checkStave();\n const ctx = this.checkContext();\n let start_x = x + this.topStartX;\n let y = 0;\n if (this.botGlyphs.length > 0)\n y = stave.getYForLine(this.timeSignature.topLine);\n else\n y = (stave.getYForLine(this.timeSignature.topLine) + stave.getYForLine(this.timeSignature.bottomLine)) / 2;\n for (let i = 0; i < this.topGlyphs.length; ++i) {\n const glyph = this.topGlyphs[i];\n Glyph.renderOutline(ctx, glyph.getMetrics().outline, this.scale, start_x + this.x_shift, y);\n start_x += defined(glyph.getMetrics().width);\n }\n start_x = x + this.botStartX;\n y = stave.getYForLine(this.timeSignature.bottomLine);\n for (let i = 0; i < this.botGlyphs.length; ++i) {\n const glyph = this.botGlyphs[i];\n this.timeSignature.placeGlyphOnLine(glyph, stave, 0);\n Glyph.renderOutline(ctx, glyph.getMetrics().outline, this.scale, start_x + glyph.getMetrics().x_shift, y);\n start_x += defined(glyph.getMetrics().width);\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// Implements time signatures glyphs for staffs\n// See tables.js for the internal time signatures\n// representation\nimport { Glyph } from './glyph';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { TimeSignatureGlyph } from './timesigglyph';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nconst assertIsValidTimeSig = (timeSpec) => {\n const numbers = timeSpec.split('/');\n if (numbers.length !== 2 && numbers[0] !== '+' && numbers[0] !== '-') {\n throw new RuntimeError('BadTimeSignature', `Invalid time spec: ${timeSpec}. Must be in the form \"/\"`);\n }\n numbers.forEach((number) => {\n // Characters consisting in number 0..9, '+', '-', '(' or ')'\n if (/^[0-9+\\-()]+$/.test(number) == false) {\n throw new RuntimeError('BadTimeSignature', `Invalid time spec: ${timeSpec}. Must contain valid signatures.`);\n }\n });\n};\nexport class TimeSignature extends StaveModifier {\n constructor(timeSpec = '4/4', customPadding = 15, validate_args = true) {\n super();\n this.validate_args = validate_args;\n const padding = customPadding;\n const musicFont = Tables.currentMusicFont();\n this.point = musicFont.lookupMetric('digits.point');\n const fontLineShift = musicFont.lookupMetric('digits.shiftLine', 0);\n this.topLine = 2 + fontLineShift;\n this.bottomLine = 4 + fontLineShift;\n this.setPosition(StaveModifierPosition.BEGIN);\n this.info = this.parseTimeSpec(timeSpec);\n this.setWidth(defined(this.info.glyph.getMetrics().width));\n this.setPadding(padding);\n }\n static get CATEGORY() {\n return Category.TimeSignature;\n }\n static get glyphs() {\n return {\n C: {\n code: 'timeSigCommon',\n point: 40,\n line: 2,\n },\n 'C|': {\n code: 'timeSigCutCommon',\n point: 40,\n line: 2,\n },\n };\n }\n parseTimeSpec(timeSpec) {\n var _a, _b;\n if (timeSpec === 'C' || timeSpec === 'C|') {\n const { line, code, point } = TimeSignature.glyphs[timeSpec];\n return {\n line,\n num: false,\n glyph: new Glyph(code, point),\n };\n }\n if (this.validate_args) {\n assertIsValidTimeSig(timeSpec);\n }\n const parts = timeSpec.split('/');\n return {\n num: true,\n glyph: this.makeTimeSignatureGlyph((_a = parts[0]) !== null && _a !== void 0 ? _a : '', (_b = parts[1]) !== null && _b !== void 0 ? _b : ''),\n };\n }\n makeTimeSignatureGlyph(topDigits, botDigits) {\n return new TimeSignatureGlyph(this, topDigits, botDigits, 'timeSig0', this.point);\n }\n getInfo() {\n return this.info;\n }\n setTimeSig(timeSpec) {\n this.info = this.parseTimeSpec(timeSpec);\n return this;\n }\n draw() {\n const stave = this.checkStave();\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.openGroup('timesignature', this.getAttribute('id'));\n this.info.glyph.setStave(stave);\n this.info.glyph.setContext(ctx);\n this.placeGlyphOnLine(this.info.glyph, stave, this.info.line);\n this.info.glyph.renderToStave(this.x);\n ctx.closeGroup();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { BoundingBox } from './boundingbox';\nimport { Clef } from './clef';\nimport { Element } from './element';\nimport { Font, FontStyle, FontWeight } from './font';\nimport { KeySignature } from './keysignature';\nimport { Barline, BarlineType } from './stavebarline';\nimport { StaveModifierPosition } from './stavemodifier';\nimport { Repetition } from './staverepetition';\nimport { StaveSection } from './stavesection';\nimport { StaveTempo } from './stavetempo';\nimport { StaveText } from './stavetext';\nimport { Volta } from './stavevolta';\nimport { Tables } from './tables';\nimport { TimeSignature } from './timesignature';\nimport { Category, isBarline } from './typeguard';\nimport { RuntimeError } from './util';\n// Used by Stave.format() to sort the modifiers at the beginning and end of a stave.\n// The keys (computed property names) match the CATEGORY property in the\n// Barline, Clef, KeySignature, TimeSignature classes.\nconst SORT_ORDER_BEG_MODIFIERS = {\n [Barline.CATEGORY]: 0,\n [Clef.CATEGORY]: 1,\n [KeySignature.CATEGORY]: 2,\n [TimeSignature.CATEGORY]: 3,\n};\nconst SORT_ORDER_END_MODIFIERS = {\n [TimeSignature.CATEGORY]: 0,\n [KeySignature.CATEGORY]: 1,\n [Barline.CATEGORY]: 2,\n [Clef.CATEGORY]: 3,\n};\nexport class Stave extends Element {\n constructor(x, y, width, options) {\n super();\n // Initialized by the constructor via this.resetLines().\n this.height = 0;\n this.x = x;\n this.y = y;\n this.width = width;\n this.formatted = false;\n this.start_x = x + 5;\n this.end_x = x + width;\n this.modifiers = []; // stave modifiers (clef, key, time, barlines, coda, segno, etc.)\n this.measure = 0;\n this.clef = 'treble';\n this.endClef = undefined;\n this.resetFont();\n this.options = Object.assign({ vertical_bar_width: 10, num_lines: 5, fill_style: '#999999', left_bar: true, right_bar: true, spacing_between_lines_px: Tables.STAVE_LINE_DISTANCE, space_above_staff_ln: 4, space_below_staff_ln: 4, top_text_position: 1, bottom_text_position: 4, line_config: [] }, options);\n this.bounds = { x: this.x, y: this.y, w: this.width, h: 0 };\n this.defaultLedgerLineStyle = { strokeStyle: '#444', lineWidth: 1.4 };\n this.resetLines();\n // beg bar\n this.addModifier(new Barline(this.options.left_bar ? BarlineType.SINGLE : BarlineType.NONE));\n // end bar\n this.addEndModifier(new Barline(this.options.right_bar ? BarlineType.SINGLE : BarlineType.NONE));\n }\n static get CATEGORY() {\n return Category.Stave;\n }\n // This is the sum of the padding that normally goes on left + right of a stave during\n // drawing. Used to size staves correctly with content width.\n static get defaultPadding() {\n const musicFont = Tables.currentMusicFont();\n return musicFont.lookupMetric('stave.padding') + musicFont.lookupMetric('stave.endPaddingMax');\n }\n // Right padding, used by system if startX is already determined.\n static get rightPadding() {\n const musicFont = Tables.currentMusicFont();\n return musicFont.lookupMetric('stave.endPaddingMax');\n }\n /** Set default style for ledger lines. */\n setDefaultLedgerLineStyle(style) {\n this.defaultLedgerLineStyle = style;\n }\n /** Get default style for ledger lines. */\n getDefaultLedgerLineStyle() {\n return Object.assign(Object.assign({}, this.getStyle()), this.defaultLedgerLineStyle);\n }\n space(spacing) {\n return this.options.spacing_between_lines_px * spacing;\n }\n resetLines() {\n this.options.line_config = [];\n for (let i = 0; i < this.options.num_lines; i++) {\n this.options.line_config.push({ visible: true });\n }\n this.height = (this.options.num_lines + this.options.space_above_staff_ln) * this.options.spacing_between_lines_px;\n this.options.bottom_text_position = this.options.num_lines;\n }\n setNoteStartX(x) {\n if (!this.formatted)\n this.format();\n this.start_x = x;\n const begBarline = this.modifiers[0];\n begBarline.setX(this.start_x - begBarline.getWidth());\n return this;\n }\n getNoteStartX() {\n if (!this.formatted)\n this.format();\n return this.start_x;\n }\n getNoteEndX() {\n if (!this.formatted)\n this.format();\n return this.end_x;\n }\n getTieStartX() {\n return this.start_x;\n }\n getTieEndX() {\n return this.end_x;\n }\n getX() {\n return this.x;\n }\n getNumLines() {\n return this.options.num_lines;\n }\n setNumLines(n) {\n this.options.num_lines = n;\n this.resetLines();\n return this;\n }\n setY(y) {\n this.y = y;\n return this;\n }\n getY() {\n return this.y;\n }\n getTopLineTopY() {\n return this.getYForLine(0) - Tables.STAVE_LINE_THICKNESS / 2;\n }\n getBottomLineBottomY() {\n return this.getYForLine(this.getNumLines() - 1) + Tables.STAVE_LINE_THICKNESS / 2;\n }\n setX(x) {\n const shift = x - this.x;\n this.formatted = false;\n this.x = x;\n this.start_x += shift;\n this.end_x += shift;\n for (let i = 0; i < this.modifiers.length; i++) {\n const mod = this.modifiers[i];\n mod.setX(mod.getX() + shift);\n }\n return this;\n }\n setWidth(width) {\n this.formatted = false;\n this.width = width;\n this.end_x = this.x + width;\n // reset the x position of the end barline (TODO(0xfe): This makes no sense)\n // this.modifiers[1].setX(this.end_x);\n return this;\n }\n getWidth() {\n return this.width;\n }\n getStyle() {\n return Object.assign({ fillStyle: this.options.fill_style, strokeStyle: this.options.fill_style, lineWidth: Tables.STAVE_LINE_THICKNESS }, this.style);\n }\n setMeasure(measure) {\n this.measure = measure;\n return this;\n }\n /**\n * Gets the pixels to shift from the beginning of the stave\n * following the modifier at the provided index\n * @param {Number} index The index from which to determine the shift\n * @return {Number} The amount of pixels shifted\n */\n getModifierXShift(index = 0) {\n if (typeof index !== 'number') {\n throw new RuntimeError('InvalidIndex', 'Must be of number type');\n }\n if (!this.formatted)\n this.format();\n if (this.getModifiers(StaveModifierPosition.BEGIN).length === 1) {\n return 0;\n }\n // for right position modifiers zero shift seems correct, see 'Volta + Modifier Measure Test'\n if (this.modifiers[index].getPosition() === StaveModifierPosition.RIGHT) {\n return 0;\n }\n let start_x = this.start_x - this.x;\n const begBarline = this.modifiers[0];\n if (begBarline.getType() === BarlineType.REPEAT_BEGIN && start_x > begBarline.getWidth()) {\n start_x -= begBarline.getWidth();\n }\n return start_x;\n }\n /** Coda & Segno Symbol functions */\n setRepetitionType(type, yShift = 0) {\n this.modifiers.push(new Repetition(type, this.x, yShift));\n return this;\n }\n // Volta functions\n setVoltaType(type, number_t, y) {\n this.modifiers.push(new Volta(type, number_t, this.x, y));\n return this;\n }\n // Section functions\n setSection(section, y, xOffset = 0, fontSize) {\n const staveSection = new StaveSection(section, this.x + xOffset, y);\n if (fontSize)\n staveSection.setFontSize(fontSize);\n this.modifiers.push(staveSection);\n return this;\n }\n // Tempo functions\n setTempo(tempo, y) {\n this.modifiers.push(new StaveTempo(tempo, this.x, y));\n return this;\n }\n // Text functions\n setText(text, position, options = {}) {\n this.modifiers.push(new StaveText(text, position, options));\n return this;\n }\n getHeight() {\n return this.height;\n }\n getSpacingBetweenLines() {\n return this.options.spacing_between_lines_px;\n }\n getBoundingBox() {\n return new BoundingBox(this.x, this.y, this.width, this.getBottomY() - this.y);\n }\n getBottomY() {\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const score_bottom = this.getYForLine(options.num_lines) + options.space_below_staff_ln * spacing;\n return score_bottom;\n }\n getBottomLineY() {\n return this.getYForLine(this.options.num_lines);\n }\n // This returns\n /** @returns the y for the *center* of a staff line */\n getYForLine(line) {\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const headroom = options.space_above_staff_ln;\n const y = this.y + line * spacing + headroom * spacing;\n return y;\n }\n getLineForY(y) {\n // Does the reverse of getYForLine - somewhat dumb and just calls\n // getYForLine until the right value is reaches\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const headroom = options.space_above_staff_ln;\n return (y - this.y) / spacing - headroom;\n }\n getYForTopText(line = 0) {\n return this.getYForLine(-line - this.options.top_text_position);\n }\n getYForBottomText(line = 0) {\n return this.getYForLine(this.options.bottom_text_position + line);\n }\n getYForNote(line) {\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const headroom = options.space_above_staff_ln;\n return this.y + headroom * spacing + 5 * spacing - line * spacing;\n }\n getYForGlyphs() {\n return this.getYForLine(3);\n }\n // This method adds a stave modifier to the stave. Note that the first two\n // modifiers (BarLines) are automatically added upon construction.\n addModifier(modifier, position) {\n if (position !== undefined) {\n modifier.setPosition(position);\n }\n modifier.setStave(this);\n this.formatted = false;\n this.modifiers.push(modifier);\n return this;\n }\n addEndModifier(modifier) {\n this.addModifier(modifier, StaveModifierPosition.END);\n return this;\n }\n // Bar Line functions\n setBegBarType(type) {\n // Only valid bar types at beginning of stave is none, single or begin repeat\n const { SINGLE, REPEAT_BEGIN, NONE } = BarlineType;\n if (type === SINGLE || type === REPEAT_BEGIN || type === NONE) {\n this.modifiers[0].setType(type);\n this.formatted = false;\n }\n return this;\n }\n setEndBarType(type) {\n // Repeat end not valid at end of stave\n if (type !== BarlineType.REPEAT_BEGIN) {\n this.modifiers[1].setType(type);\n this.formatted = false;\n }\n return this;\n }\n setClef(clefSpec, size, annotation, position) {\n if (position === undefined) {\n position = StaveModifierPosition.BEGIN;\n }\n if (position === StaveModifierPosition.END) {\n this.endClef = clefSpec;\n }\n else {\n this.clef = clefSpec;\n }\n const clefs = this.getModifiers(position, Clef.CATEGORY);\n if (clefs.length === 0) {\n this.addClef(clefSpec, size, annotation, position);\n }\n else {\n clefs[0].setType(clefSpec, size, annotation);\n }\n return this;\n }\n getClef() {\n return this.clef;\n }\n setEndClef(clefSpec, size, annotation) {\n this.setClef(clefSpec, size, annotation, StaveModifierPosition.END);\n return this;\n }\n getEndClef() {\n return this.endClef;\n }\n setKeySignature(keySpec, cancelKeySpec, position) {\n if (position === undefined) {\n position = StaveModifierPosition.BEGIN;\n }\n const keySignatures = this.getModifiers(position, KeySignature.CATEGORY);\n if (keySignatures.length === 0) {\n this.addKeySignature(keySpec, cancelKeySpec, position);\n }\n else {\n keySignatures[0].setKeySig(keySpec, cancelKeySpec);\n }\n return this;\n }\n setEndKeySignature(keySpec, cancelKeySpec) {\n this.setKeySignature(keySpec, cancelKeySpec, StaveModifierPosition.END);\n return this;\n }\n setTimeSignature(timeSpec, customPadding, position) {\n if (position === undefined) {\n position = StaveModifierPosition.BEGIN;\n }\n const timeSignatures = this.getModifiers(position, TimeSignature.CATEGORY);\n if (timeSignatures.length === 0) {\n this.addTimeSignature(timeSpec, customPadding, position);\n }\n else {\n timeSignatures[0].setTimeSig(timeSpec);\n }\n return this;\n }\n setEndTimeSignature(timeSpec, customPadding) {\n this.setTimeSignature(timeSpec, customPadding, StaveModifierPosition.END);\n return this;\n }\n /**\n * Add a key signature to the stave.\n *\n * Example:\n * `stave.addKeySignature('Db');`\n * @param keySpec new key specification `[A-G][b|#]?`\n * @param cancelKeySpec\n * @param position\n * @returns\n */\n addKeySignature(keySpec, cancelKeySpec, position) {\n if (position === undefined) {\n position = StaveModifierPosition.BEGIN;\n }\n this.addModifier(new KeySignature(keySpec, cancelKeySpec).setPosition(position), position);\n return this;\n }\n /**\n * Add a clef to the stave.\n *\n * Example:\n *\n * stave.addClef('treble')\n * @param clef clef (treble|bass|...) see {@link Clef.types}\n * @param size\n * @param annotation\n * @param position\n * @returns\n */\n addClef(clef, size, annotation, position) {\n if (position === undefined || position === StaveModifierPosition.BEGIN) {\n this.clef = clef;\n }\n else if (position === StaveModifierPosition.END) {\n this.endClef = clef;\n }\n this.addModifier(new Clef(clef, size, annotation), position);\n return this;\n }\n addEndClef(clef, size, annotation) {\n this.addClef(clef, size, annotation, StaveModifierPosition.END);\n return this;\n }\n /**\n * Add a time signature to the stave\n *\n * Example:\n *\n * `stave.addTimeSignature('4/4');`\n * @param timeSpec time signature specification `(C\\||C|\\d\\/\\d)`\n * @param customPadding\n * @param position\n * @returns\n */\n addTimeSignature(timeSpec, customPadding, position) {\n this.addModifier(new TimeSignature(timeSpec, customPadding), position);\n return this;\n }\n addEndTimeSignature(timeSpec, customPadding) {\n this.addTimeSignature(timeSpec, customPadding, StaveModifierPosition.END);\n return this;\n }\n // Deprecated\n addTrebleGlyph() {\n this.addClef('treble');\n return this;\n }\n /**\n * @param position\n * @param category\n * @returns array of StaveModifiers that match the provided position and category.\n */\n getModifiers(position, category) {\n const noPosition = position === undefined;\n const noCategory = category === undefined;\n if (noPosition && noCategory) {\n return this.modifiers;\n }\n else if (noPosition) {\n // A category was provided.\n return this.modifiers.filter((m) => category === m.getCategory());\n }\n else if (noCategory) {\n // A position was provided.\n return this.modifiers.filter((m) => position === m.getPosition());\n }\n else {\n // Both position and category were provided!\n return this.modifiers.filter((m) => position === m.getPosition() && category === m.getCategory());\n }\n }\n /**\n * Use the modifier's `getCategory()` as a key for the `order` array.\n * The retrieved value is used to sort modifiers from left to right (0 to to 3).\n */\n sortByCategory(items, order) {\n for (let i = items.length - 1; i >= 0; i--) {\n for (let j = 0; j < i; j++) {\n if (order[items[j].getCategory()] > order[items[j + 1].getCategory()]) {\n const temp = items[j];\n items[j] = items[j + 1];\n items[j + 1] = temp;\n }\n }\n }\n }\n format() {\n const begBarline = this.modifiers[0];\n const endBarline = this.modifiers[1];\n const begModifiers = this.getModifiers(StaveModifierPosition.BEGIN);\n const endModifiers = this.getModifiers(StaveModifierPosition.END);\n this.sortByCategory(begModifiers, SORT_ORDER_BEG_MODIFIERS);\n this.sortByCategory(endModifiers, SORT_ORDER_END_MODIFIERS);\n if (begModifiers.length > 1 && begBarline.getType() === BarlineType.REPEAT_BEGIN) {\n begModifiers.push(begModifiers.splice(0, 1)[0]);\n begModifiers.splice(0, 0, new Barline(BarlineType.SINGLE));\n }\n if (endModifiers.indexOf(endBarline) > 0) {\n endModifiers.splice(0, 0, new Barline(BarlineType.NONE));\n }\n let width;\n let padding;\n let modifier;\n let offset = 0;\n let x = this.x;\n for (let i = 0; i < begModifiers.length; i++) {\n modifier = begModifiers[i];\n padding = modifier.getPadding(i + offset);\n width = modifier.getWidth();\n x += padding;\n modifier.setX(x);\n x += width;\n if (padding + width === 0)\n offset--;\n }\n this.start_x = x;\n x = this.x + this.width;\n const widths = {\n left: 0,\n right: 0,\n paddingRight: 0,\n paddingLeft: 0,\n };\n let lastBarlineIdx = 0;\n for (let i = 0; i < endModifiers.length; i++) {\n modifier = endModifiers[i];\n lastBarlineIdx = isBarline(modifier) ? i : lastBarlineIdx;\n widths.right = 0;\n widths.left = 0;\n widths.paddingRight = 0;\n widths.paddingLeft = 0;\n const layoutMetrics = modifier.getLayoutMetrics();\n if (layoutMetrics) {\n if (i !== 0) {\n widths.right = layoutMetrics.xMax || 0;\n widths.paddingRight = layoutMetrics.paddingRight || 0;\n }\n widths.left = -layoutMetrics.xMin || 0;\n widths.paddingLeft = layoutMetrics.paddingLeft || 0;\n if (i === endModifiers.length - 1) {\n widths.paddingLeft = 0;\n }\n }\n else {\n widths.paddingRight = modifier.getPadding(i - lastBarlineIdx);\n if (i !== 0) {\n widths.right = modifier.getWidth();\n }\n if (i === 0) {\n widths.left = modifier.getWidth();\n }\n }\n x -= widths.paddingRight;\n x -= widths.right;\n modifier.setX(x);\n x -= widths.left;\n x -= widths.paddingLeft;\n }\n this.end_x = endModifiers.length === 1 ? this.x + this.width : x;\n this.formatted = true;\n }\n /**\n * All drawing functions below need the context to be set.\n */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n ctx.openGroup('stave', this.getAttribute('id'));\n if (!this.formatted)\n this.format();\n const num_lines = this.options.num_lines;\n const width = this.width;\n const x = this.x;\n let y;\n // Render lines\n for (let line = 0; line < num_lines; line++) {\n y = this.getYForLine(line);\n this.applyStyle();\n if (this.options.line_config[line].visible) {\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(x + width, y);\n ctx.stroke();\n }\n this.restoreStyle();\n }\n // Draw the modifiers (bar lines, coda, segno, repeat brackets, etc.)\n for (let i = 0; i < this.modifiers.length; i++) {\n const modifier = this.modifiers[i];\n // Only draw modifier if it has a draw function\n if (typeof modifier.draw === 'function') {\n modifier.applyStyle(ctx);\n modifier.draw(this, this.getModifierXShift(i));\n modifier.restoreStyle(ctx);\n }\n }\n // Render measure numbers\n if (this.measure > 0) {\n ctx.save();\n ctx.setFont(this.textFont);\n const textWidth = ctx.measureText('' + this.measure).width;\n y = this.getYForTopText(0) + 3;\n ctx.fillText('' + this.measure, this.x - textWidth / 2, y);\n ctx.restore();\n }\n ctx.closeGroup();\n return this;\n }\n getVerticalBarWidth() {\n return this.options.vertical_bar_width;\n }\n /**\n * Get the current configuration for the Stave.\n * @return {Array} An array of configuration objects.\n */\n getConfigForLines() {\n return this.options.line_config;\n }\n /**\n * Configure properties of the lines in the Stave\n * @param line_number The index of the line to configure.\n * @param line_config An configuration object for the specified line.\n * @throws RuntimeError \"StaveConfigError\" When the specified line number is out of\n * range of the number of lines specified in the constructor.\n */\n setConfigForLine(line_number, line_config) {\n if (line_number >= this.options.num_lines || line_number < 0) {\n throw new RuntimeError('StaveConfigError', 'The line number must be within the range of the number of lines in the Stave.');\n }\n if (line_config.visible === undefined) {\n throw new RuntimeError('StaveConfigError', \"The line configuration object is missing the 'visible' property.\");\n }\n if (typeof line_config.visible !== 'boolean') {\n throw new RuntimeError('StaveConfigError', \"The line configuration objects 'visible' property must be true or false.\");\n }\n this.options.line_config[line_number] = line_config;\n return this;\n }\n /**\n * Set the staff line configuration array for all of the lines at once.\n * @param lines_configuration An array of line configuration objects. These objects\n * are of the same format as the single one passed in to setLineConfiguration().\n * The caller can set null for any line config entry if it is desired that the default be used\n * @throws RuntimeError \"StaveConfigError\" When the lines_configuration array does not have\n * exactly the same number of elements as the num_lines configuration object set in\n * the constructor.\n */\n setConfigForLines(lines_configuration) {\n if (lines_configuration.length !== this.options.num_lines) {\n throw new RuntimeError('StaveConfigError', 'The length of the lines configuration array must match the number of lines in the Stave');\n }\n // Make sure the defaults are present in case an incomplete set of\n // configuration options were supplied.\n // eslint-disable-next-line\n for (const line_config in lines_configuration) {\n // Allow '{}' to be used if the caller just wants the default for a particular node.\n if (lines_configuration[line_config].visible == undefined) {\n lines_configuration[line_config] = this.options.line_config[line_config];\n }\n this.options.line_config[line_config] = Object.assign(Object.assign({}, this.options.line_config[line_config]), lines_configuration[line_config]);\n }\n this.options.line_config = lines_configuration;\n return this;\n }\n}\nStave.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 8,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nfunction drawBoldDoubleLine(ctx, type, topX, topY, botY) {\n if (type !== StaveConnector.type.BOLD_DOUBLE_LEFT && type !== StaveConnector.type.BOLD_DOUBLE_RIGHT) {\n throw new RuntimeError('InvalidConnector', 'A REPEAT_BEGIN or REPEAT_END type must be provided.');\n }\n let x_shift = 3;\n let variableWidth = 3.5; // Width for avoiding anti-aliasing width issues\n const thickLineOffset = 2; // For aesthetics\n if (type === StaveConnector.type.BOLD_DOUBLE_RIGHT) {\n x_shift = -5; // Flips the side of the thin line\n variableWidth = 3;\n }\n // Thin line\n ctx.fillRect(topX + x_shift, topY, 1, botY - topY);\n // Thick line\n ctx.fillRect(topX - thickLineOffset, topY, variableWidth, botY - topY);\n}\n/** StaveConnector implements the connector lines between staves of a system. */\nexport class StaveConnector extends Element {\n constructor(top_stave, bottom_stave) {\n super();\n this.thickness = Tables.STAVE_LINE_THICKNESS;\n this.width = 3;\n this.top_stave = top_stave;\n this.bottom_stave = bottom_stave;\n this.type = StaveConnector.type.DOUBLE;\n this.resetFont();\n // 1. Offset Bold Double Left to align with offset Repeat Begin bars\n // 2. Offset BRACE type not to overlap with another StaveConnector\n this.x_shift = 0;\n this.texts = [];\n }\n static get CATEGORY() {\n return Category.StaveConnector;\n }\n /**\n * Set type.\n * @param type see {@link StaveConnector.type} & {@link StaveConnector.typeString}\n */\n setType(type) {\n type = typeof type === 'string' ? StaveConnector.typeString[type] : type;\n if (type >= StaveConnector.type.SINGLE_RIGHT && type <= StaveConnector.type.NONE) {\n this.type = type;\n }\n return this;\n }\n /** Set optional associated Text. */\n setText(text, options = {}) {\n this.texts.push({\n content: text,\n options: Object.assign({ shift_x: 0, shift_y: 0 }, options),\n });\n return this;\n }\n setXShift(x_shift) {\n if (typeof x_shift !== 'number') {\n throw new RuntimeError('InvalidType', 'x_shift must be a Number');\n }\n this.x_shift = x_shift;\n return this;\n }\n getXShift() {\n return this.x_shift;\n }\n /** Render connector and associated text. */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n let topY = this.top_stave.getYForLine(0);\n let botY = this.bottom_stave.getYForLine(this.bottom_stave.getNumLines() - 1) + this.thickness;\n let width = this.width;\n let topX = this.top_stave.getX();\n const isRightSidedConnector = this.type === StaveConnector.type.SINGLE_RIGHT ||\n this.type === StaveConnector.type.BOLD_DOUBLE_RIGHT ||\n this.type === StaveConnector.type.THIN_DOUBLE;\n if (isRightSidedConnector) {\n topX = this.top_stave.getX() + this.top_stave.getWidth();\n }\n let attachment_height = botY - topY;\n switch (this.type) {\n case StaveConnector.type.SINGLE:\n width = 1;\n break;\n case StaveConnector.type.SINGLE_LEFT:\n width = 1;\n break;\n case StaveConnector.type.SINGLE_RIGHT:\n width = 1;\n break;\n case StaveConnector.type.DOUBLE:\n topX -= this.width + 2;\n topY -= this.thickness;\n attachment_height += 0.5;\n break;\n case StaveConnector.type.BRACE: {\n width = 12;\n // May need additional code to draw brace\n const x1 = this.top_stave.getX() - 2 + this.x_shift;\n const y1 = topY;\n const x3 = x1;\n const y3 = botY;\n const x2 = x1 - width;\n const y2 = y1 + attachment_height / 2.0;\n const cpx1 = x2 - 0.9 * width;\n const cpy1 = y1 + 0.2 * attachment_height;\n const cpx2 = x1 + 1.1 * width;\n const cpy2 = y2 - 0.135 * attachment_height;\n const cpx3 = cpx2;\n const cpy3 = y2 + 0.135 * attachment_height;\n const cpx4 = cpx1;\n const cpy4 = y3 - 0.2 * attachment_height;\n const cpx5 = x2 - width;\n const cpy5 = cpy4;\n const cpx6 = x1 + 0.4 * width;\n const cpy6 = y2 + 0.135 * attachment_height;\n const cpx7 = cpx6;\n const cpy7 = y2 - 0.135 * attachment_height;\n const cpx8 = cpx5;\n const cpy8 = cpy1;\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, x2, y2);\n ctx.bezierCurveTo(cpx3, cpy3, cpx4, cpy4, x3, y3);\n ctx.bezierCurveTo(cpx5, cpy5, cpx6, cpy6, x2, y2);\n ctx.bezierCurveTo(cpx7, cpy7, cpx8, cpy8, x1, y1);\n ctx.fill();\n ctx.stroke();\n break;\n }\n case StaveConnector.type.BRACKET:\n topY -= 6;\n botY += 6;\n attachment_height = botY - topY;\n Glyph.renderGlyph(ctx, topX - 5, topY, 40, 'bracketTop');\n Glyph.renderGlyph(ctx, topX - 5, botY, 40, 'bracketBottom');\n topX -= this.width + 2;\n break;\n case StaveConnector.type.BOLD_DOUBLE_LEFT:\n drawBoldDoubleLine(ctx, this.type, topX + this.x_shift, topY, botY - this.thickness);\n break;\n case StaveConnector.type.BOLD_DOUBLE_RIGHT:\n drawBoldDoubleLine(ctx, this.type, topX, topY, botY - this.thickness);\n break;\n case StaveConnector.type.THIN_DOUBLE:\n width = 1;\n attachment_height -= this.thickness;\n break;\n case StaveConnector.type.NONE:\n break;\n default:\n throw new RuntimeError('InvalidType', `The provided StaveConnector.type (${this.type}) is invalid.`);\n }\n if (this.type !== StaveConnector.type.BRACE &&\n this.type !== StaveConnector.type.BOLD_DOUBLE_LEFT &&\n this.type !== StaveConnector.type.BOLD_DOUBLE_RIGHT &&\n this.type !== StaveConnector.type.NONE) {\n ctx.fillRect(topX, topY, width, attachment_height);\n }\n // If the connector is a thin double barline, draw the paralell line\n if (this.type === StaveConnector.type.THIN_DOUBLE) {\n ctx.fillRect(topX - 3, topY, width, attachment_height);\n }\n ctx.save();\n ctx.setLineWidth(2);\n ctx.setFont(this.textFont);\n // Add stave connector text\n for (let i = 0; i < this.texts.length; i++) {\n const text = this.texts[i];\n const text_width = ctx.measureText('' + text.content).width;\n const x = this.top_stave.getX() - text_width - 24 + text.options.shift_x;\n const y = (this.top_stave.getYForLine(0) + this.bottom_stave.getBottomLineY()) / 2 + text.options.shift_y;\n ctx.fillText('' + text.content, x, y + 4);\n }\n ctx.restore();\n }\n}\nStaveConnector.TEXT_FONT = {\n family: Font.SERIF,\n size: 16,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n/**\n * SINGLE_LEFT and SINGLE are the same value for compatibility\n * with older versions of vexflow which didn't have right sided\n * stave connectors.\n */\nStaveConnector.type = {\n SINGLE_RIGHT: 0,\n SINGLE_LEFT: 1,\n SINGLE: 1,\n DOUBLE: 2,\n BRACE: 3,\n BRACKET: 4,\n BOLD_DOUBLE_LEFT: 5,\n BOLD_DOUBLE_RIGHT: 6,\n THIN_DOUBLE: 7,\n NONE: 8,\n};\n/**\n * Connector type:\n * * \"singleRight\"\n * * \"singleLeft\"\n * * \"single\"\n * * \"double\"\n * * \"brace\"\n * * \"bracket\"\n * * \"boldDoubleLeft\"\n * * \"boldDoubleRight\"\n * * \"thinDouble\"\n * * \"none\"\n */\nStaveConnector.typeString = {\n singleRight: StaveConnector.type.SINGLE_RIGHT,\n singleLeft: StaveConnector.type.SINGLE_LEFT,\n single: StaveConnector.type.SINGLE,\n double: StaveConnector.type.DOUBLE,\n brace: StaveConnector.type.BRACE,\n bracket: StaveConnector.type.BRACKET,\n boldDoubleLeft: StaveConnector.type.BOLD_DOUBLE_LEFT,\n boldDoubleRight: StaveConnector.type.BOLD_DOUBLE_RIGHT,\n thinDouble: StaveConnector.type.THIN_DOUBLE,\n none: StaveConnector.type.NONE,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Beam } from './beam';\nimport { Font } from './font';\nimport { Fraction } from './fraction';\nimport { ModifierContext } from './modifiercontext';\nimport { Stave } from './stave';\nimport { StaveConnector } from './staveconnector';\nimport { Tables } from './tables';\nimport { TickContext } from './tickcontext';\nimport { isNote, isStaveNote } from './typeguard';\nimport { defined, log, midLine, RuntimeError } from './util';\nimport { Voice } from './voice';\n// Helper function\nconst sumArray = (arr) => arr.reduce((a, b) => a + b, 0);\n/**\n * Create `Alignment`s for each tick in `voices`. Also calculate the\n * total number of ticks in voices.\n */\nfunction createContexts(voices, makeContext, addToContext) {\n const resolutionMultiplier = Formatter.getResolutionMultiplier(voices);\n // Initialize tick maps.\n const tickToContextMap = {};\n const tickList = [];\n const contexts = [];\n // For each voice, extract notes and create a context for every\n // new tick that hasn't been seen before.\n voices.forEach((voice, voiceIndex) => {\n // Use resolution multiplier as denominator so that no additional expansion\n // of fractional tick values is needed.\n const ticksUsed = new Fraction(0, resolutionMultiplier);\n voice.getTickables().forEach((tickable) => {\n const integerTicks = ticksUsed.numerator;\n // If we have no tick context for this tick, create one.\n if (!tickToContextMap[integerTicks]) {\n const newContext = makeContext({ tickID: integerTicks });\n contexts.push(newContext);\n tickToContextMap[integerTicks] = newContext;\n // Maintain a list of unique integerTicks.\n tickList.push(integerTicks);\n }\n // Add this tickable to the TickContext.\n addToContext(tickable, tickToContextMap[integerTicks], voiceIndex);\n ticksUsed.add(tickable.getTicks());\n });\n });\n return {\n map: tickToContextMap,\n array: contexts,\n list: tickList.sort((a, b) => a - b),\n resolutionMultiplier,\n };\n}\n// eslint-disable-next-line\nfunction L(...args) {\n if (Formatter.DEBUG)\n log('Vex.Flow.Formatter', args);\n}\n/**\n * Get the rest line number of the next non-rest note(s).\n * @param notes array of Notes\n * @param currRestLine\n * @param currNoteIndex current note index\n * @param compare if true, return the midpoint between the current rest line and the next rest line\n * @returns a line number, which determines the vertical position of a rest.\n */\nfunction getRestLineForNextNoteGroup(notes, currRestLine, currNoteIndex, compare) {\n // If no valid next note group, nextRestLine is same as current.\n let nextRestLine = currRestLine;\n // Start with the next note and keep going until we find a valid non-rest note group.\n for (let noteIndex = currNoteIndex + 1; noteIndex < notes.length; noteIndex++) {\n const note = notes[noteIndex];\n if (isNote(note) && !note.isRest() && !note.shouldIgnoreTicks()) {\n nextRestLine = note.getLineForRest();\n break;\n }\n }\n // Locate the mid point between two lines.\n if (compare && currRestLine !== nextRestLine) {\n const top = Math.max(currRestLine, nextRestLine);\n const bot = Math.min(currRestLine, nextRestLine);\n nextRestLine = midLine(top, bot);\n }\n return nextRestLine;\n}\n/**\n * Format implements the formatting and layout algorithms that are used\n * to position notes in a voice. The algorithm can align multiple voices both\n * within a stave, and across multiple staves.\n *\n * To do this, the formatter breaks up voices into a grid of rational-valued\n * `ticks`, to which each note is assigned. Then, minimum widths are assigned\n * to each tick based on the widths of the notes and modifiers in that tick. This\n * establishes the smallest amount of space required for each tick.\n *\n * Finally, the formatter distributes the left over space proportionally to\n * all the ticks, setting the `x` values of the notes in each tick.\n *\n * See `tests/formatter_tests.ts` for usage examples. The helper functions included\n * here (`FormatAndDraw`, `FormatAndDrawTab`) also serve as useful usage examples.\n */\nexport class Formatter {\n constructor(options) {\n this.formatterOptions = Object.assign({ globalSoftmax: false, softmaxFactor: 100, maxIterations: 5 }, options);\n this.justifyWidth = 0;\n this.totalCost = 0;\n this.totalShift = 0;\n this.durationStats = {};\n // Minimum width required to render all the notes in the voices.\n this.minTotalWidth = 0;\n // This is set to `true` after `minTotalWidth` is calculated.\n this.hasMinTotalWidth = false;\n // Arrays of tick and modifier contexts.\n this.tickContexts = undefined;\n this.modifierContexts = undefined;\n // Gaps between contexts, for free movement of notes post\n // formatting.\n this.contextGaps = {\n total: 0,\n gaps: [],\n };\n this.voices = [];\n this.lossHistory = [];\n }\n /**\n * Helper function to layout \"notes\" one after the other without\n * regard for proportions. Useful for tests and debugging.\n */\n static SimpleFormat(notes, x = 0, { paddingBetween = 10 } = {}) {\n notes.reduce((accumulator, note) => {\n note.addToModifierContext(new ModifierContext());\n const tick = new TickContext().addTickable(note).preFormat();\n const metrics = tick.getMetrics();\n tick.setX(accumulator + metrics.totalLeftPx);\n return accumulator + tick.getWidth() + metrics.totalRightPx + paddingBetween;\n }, x);\n }\n /** Helper function to plot formatter debug info. */\n static plotDebugging(ctx, formatter, xPos, y1, y2, options) {\n options = Object.assign({ stavePadding: Tables.currentMusicFont().lookupMetric('stave.padding') }, options);\n const x = xPos + options.stavePadding;\n const contextGaps = formatter.contextGaps;\n function stroke(x1, x2, color) {\n ctx.beginPath();\n ctx.setStrokeStyle(color);\n ctx.setFillStyle(color);\n ctx.setLineWidth(1);\n ctx.fillRect(x1, y1, Math.max(x2 - x1, 0), y2 - y1);\n }\n ctx.save();\n ctx.setFont(Font.SANS_SERIF, 8);\n contextGaps.gaps.forEach((gap) => {\n stroke(x + gap.x1, x + gap.x2, 'rgba(100,200,100,0.4)');\n ctx.setFillStyle('green');\n ctx.fillText(Math.round(gap.x2 - gap.x1).toString(), x + gap.x1, y2 + 12);\n });\n ctx.setFillStyle('red');\n ctx.fillText(`Loss: ${(formatter.totalCost || 0).toFixed(2)} Shift: ${(formatter.totalShift || 0).toFixed(2)} Gap: ${contextGaps.total.toFixed(2)}`, x - 20, y2 + 27);\n ctx.restore();\n }\n /**\n * Helper function to format and draw a single voice. Returns a bounding\n * box for the notation.\n * @param ctx the rendering context\n * @param stave the stave to which to draw (`Stave` or `TabStave`)\n * @param notes array of `Note` instances (`Note`, `TextNote`, `TabNote`, etc.)\n * @param params one of below:\n * * Setting `autobeam` only `(context, stave, notes, true)` or\n * `(ctx, stave, notes, {autobeam: true})`\n * * Setting `align_rests` a struct is needed `(context, stave, notes, {align_rests: true})`\n * * Setting both a struct is needed `(context, stave, notes, {\n * autobeam: true, align_rests: true})`\n * * `autobeam` automatically generates beams for the notes.\n * * `align_rests` aligns rests with nearby notes.\n */\n static FormatAndDraw(ctx, stave, notes, params) {\n let options = {\n auto_beam: false,\n align_rests: false,\n };\n if (typeof params === 'object') {\n options = Object.assign(Object.assign({}, options), params);\n }\n else if (typeof params === 'boolean') {\n options.auto_beam = params;\n }\n // Start by creating a voice and adding all the notes to it.\n const voice = new Voice(Tables.TIME4_4).setMode(Voice.Mode.SOFT).addTickables(notes);\n // Then create beams, if requested.\n const beams = options.auto_beam ? Beam.applyAndGetBeams(voice) : [];\n // Instantiate a `Formatter` and format the notes.\n new Formatter()\n .joinVoices([voice]) // , { align_rests: options.align_rests })\n .formatToStave([voice], stave, { align_rests: options.align_rests, stave });\n // Render the voice and beams to the stave.\n voice.setStave(stave).draw(ctx, stave);\n beams.forEach((beam) => beam.setContext(ctx).draw());\n // Return the bounding box of the voice.\n return voice.getBoundingBox();\n }\n /**\n * Helper function to format and draw aligned tab and stave notes in two\n * separate staves.\n * @param ctx the rendering context\n * @param tabstave a `TabStave` instance on which to render `TabNote`s.\n * @param stave a `Stave` instance on which to render `Note`s.\n * @param notes array of `Note` instances for the stave (`Note`, `BarNote`, etc.)\n * @param tabnotes array of `Note` instances for the tab stave (`TabNote`, `BarNote`, etc.)\n * @param autobeam automatically generate beams.\n * @param params a configuration object:\n * * `autobeam` automatically generates beams for the notes.\n * * `align_rests` aligns rests with nearby notes.\n */\n static FormatAndDrawTab(ctx, tabstave, stave, tabnotes, notes, autobeam, params) {\n let opts = {\n auto_beam: autobeam,\n align_rests: false,\n };\n if (typeof params === 'object') {\n opts = Object.assign(Object.assign({}, opts), params);\n }\n else if (typeof params === 'boolean') {\n opts.auto_beam = params;\n }\n // Create a `4/4` voice for `notes`.\n const notevoice = new Voice(Tables.TIME4_4).setMode(Voice.Mode.SOFT).addTickables(notes);\n // Create a `4/4` voice for `tabnotes`.\n const tabvoice = new Voice(Tables.TIME4_4).setMode(Voice.Mode.SOFT).addTickables(tabnotes);\n // Then create beams, if requested.\n const beams = opts.auto_beam ? Beam.applyAndGetBeams(notevoice) : [];\n // Instantiate a `Formatter` and align tab and stave notes.\n new Formatter()\n .joinVoices([notevoice]) // , { align_rests: opts.align_rests })\n .joinVoices([tabvoice])\n .formatToStave([notevoice, tabvoice], stave, { align_rests: opts.align_rests });\n // Render voices and beams to staves.\n notevoice.draw(ctx, stave);\n tabvoice.draw(ctx, tabstave);\n beams.forEach((beam) => beam.setContext(ctx).draw());\n // Draw a connector between tab and note staves.\n new StaveConnector(stave, tabstave).setContext(ctx).draw();\n }\n /**\n * Automatically set the vertical position of rests based on previous/next note positions.\n * @param tickables an array of Tickables.\n * @param alignAllNotes If `false`, only align rests that are within a group of beamed notes.\n * @param alignTuplets If `false`, ignores tuplets.\n */\n static AlignRestsToNotes(tickables, alignAllNotes, alignTuplets) {\n tickables.forEach((currTickable, index) => {\n if (isStaveNote(currTickable) && currTickable.isRest()) {\n if (currTickable.getTuplet() && !alignTuplets) {\n return;\n }\n // If activated rests not on default can be rendered as specified.\n const position = currTickable.getGlyph().position.toUpperCase();\n if (position !== 'R/4' && position !== 'B/4') {\n return;\n }\n if (alignAllNotes || currTickable.getBeam()) {\n // Align rests with previous/next notes.\n const props = currTickable.getKeyProps()[0];\n if (index === 0) {\n props.line = getRestLineForNextNoteGroup(tickables, props.line, index, false);\n }\n else if (index > 0 && index < tickables.length) {\n // If previous tickable is a rest, use its line number.\n const prevTickable = tickables[index - 1];\n if (isStaveNote(prevTickable)) {\n if (prevTickable.isRest()) {\n props.line = prevTickable.getKeyProps()[0].line;\n }\n else {\n const restLine = prevTickable.getLineForRest();\n // Get the rest line for next valid non-rest note group.\n props.line = getRestLineForNextNoteGroup(tickables, restLine, index, true);\n }\n }\n }\n currTickable.setKeyLine(0, props.line);\n }\n }\n });\n }\n /**\n * Find all the rests in each of the `voices` and align them to neighboring notes.\n *\n * @param voices\n * @param alignAllNotes If `false`, only align rests within beamed groups of notes. If `true`, align all rests.\n */\n alignRests(voices, alignAllNotes) {\n if (!voices || !voices.length) {\n throw new RuntimeError('BadArgument', 'No voices to format rests');\n }\n voices.forEach((voice) => Formatter.AlignRestsToNotes(voice.getTickables(), alignAllNotes));\n }\n /**\n * Estimate the width required to render 'voices'. This is done by:\n * 1. Sum the widths of all the tick contexts\n * 2. Estimate the padding.\n * The latter is done by calculating the padding 3 different ways, and taking the\n * greatest value:\n * 1. the padding required for unaligned notes in different voices\n * 2. the padding based on the stddev of the tickable widths\n * 3. the padding based on the stddev of the tickable durations.\n *\n * The last 2 quantities estimate a 'width entropy', where notes might need more\n * room than the proportional formatting gives them. A measure of all same duration\n * and width will need no extra padding, and all these quantities will be\n * zero in that case.\n *\n * @param voices the voices that contain the notes\n * @returns the estimated width in pixels\n */\n preCalculateMinTotalWidth(voices) {\n const unalignedPadding = Tables.currentMusicFont().lookupMetric('stave.unalignedNotePadding');\n // Calculate additional padding based on 3 methods:\n // 1) unaligned beats in voices, 2) variance of width, 3) variance of durations\n let unalignedCtxCount = 0;\n let wsum = 0;\n let dsum = 0;\n const widths = [];\n const durations = [];\n // Cache results.\n if (this.hasMinTotalWidth)\n return this.minTotalWidth;\n // Create tick contexts if not already created.\n if (!this.tickContexts) {\n if (!voices) {\n throw new RuntimeError('BadArgument', \"'voices' required to run preCalculateMinTotalWidth\");\n }\n this.createTickContexts(voices);\n }\n // eslint-disable-next-line\n const { list: contextList, map: contextMap } = this.tickContexts;\n this.minTotalWidth = 0;\n // Go through each tick context and calculate total width,\n // and also accumulate values used in padding hints\n contextList.forEach((tick) => {\n const context = contextMap[tick];\n context.preFormat();\n // If this TC doesn't have all the voices on it, it's unaligned.\n // so increment the unaligned padding accumulator\n if (context.getTickables().length < voices.length) {\n unalignedCtxCount += 1;\n }\n // Calculate the 'width entropy' over all the Tickables.\n context.getTickables().forEach((t) => {\n wsum += t.getMetrics().width;\n dsum += t.getTicks().value();\n widths.push(t.getMetrics().width);\n durations.push(t.getTicks().value());\n });\n const width = context.getWidth();\n this.minTotalWidth += width;\n });\n this.hasMinTotalWidth = true;\n // normalized (0-1) STDDEV of widths/durations gives us padding hints.\n const wavg = wsum > 0 ? wsum / widths.length : 1 / widths.length;\n const wvar = sumArray(widths.map((ll) => Math.pow(ll - wavg, 2)));\n const wpads = Math.pow(wvar / widths.length, 0.5) / wavg;\n const davg = dsum / durations.length;\n const dvar = sumArray(durations.map((ll) => Math.pow(ll - davg, 2)));\n const dpads = Math.pow(dvar / durations.length, 0.5) / davg;\n // Find max of 3 methods pad the width with that\n const padmax = Math.max(dpads, wpads) * contextList.length * unalignedPadding;\n const unalignedPad = unalignedPadding * unalignedCtxCount;\n return this.minTotalWidth + Math.max(unalignedPad, padmax);\n }\n /**\n * Get minimum width required to render all voices. Either `format` or\n * `preCalculateMinTotalWidth` must be called before this method.\n */\n getMinTotalWidth() {\n if (!this.hasMinTotalWidth) {\n throw new RuntimeError('NoMinTotalWidth', \"Call 'preCalculateMinTotalWidth' or 'preFormat' before calling 'getMinTotalWidth'\");\n }\n return this.minTotalWidth;\n }\n /** Calculate the resolution multiplier for `voices`. */\n static getResolutionMultiplier(voices) {\n if (!voices || !voices.length) {\n throw new RuntimeError('BadArgument', 'No voices to format');\n }\n const totalTicks = voices[0].getTotalTicks();\n const resolutionMultiplier = voices.reduce((accumulator, voice) => {\n if (!voice.getTotalTicks().equals(totalTicks)) {\n throw new RuntimeError('TickMismatch', 'Voices should have same total note duration in ticks.');\n }\n if (voice.getMode() === Voice.Mode.STRICT && !voice.isComplete()) {\n throw new RuntimeError('IncompleteVoice', 'Voice does not have enough notes.');\n }\n return Math.max(accumulator, Fraction.LCM(accumulator, voice.getResolutionMultiplier()));\n }, 1);\n return resolutionMultiplier;\n }\n /** Create a `ModifierContext` for each tick in `voices`. */\n createModifierContexts(voices) {\n const fn = (tickable, context) => tickable.addToModifierContext(context);\n const contexts = createContexts(voices, () => new ModifierContext(), fn);\n this.modifierContexts = contexts;\n return contexts;\n }\n /**\n * Create a `TickContext` for each tick in `voices`. Also calculate the\n * total number of ticks in voices.\n */\n createTickContexts(voices) {\n const fn = (tickable, context, voiceIndex) => context.addTickable(tickable, voiceIndex);\n const contexts = createContexts(voices, (tick) => new TickContext(tick), fn);\n this.tickContexts = contexts;\n const contextArray = this.tickContexts.array;\n contextArray.forEach((context) => {\n context.tContexts = contextArray;\n });\n return contexts;\n }\n /**\n * This is the core formatter logic. Format voices and justify them\n * to `justifyWidth` pixels. `renderingContext` is required to justify elements\n * that can't retreive widths without a canvas. This method sets the `x` positions\n * of all the tickables/notes in the formatter.\n */\n preFormat(justifyWidth = 0, renderingContext, voicesParam, stave) {\n // Initialize context maps.\n const contexts = this.tickContexts;\n if (!contexts) {\n throw new RuntimeError('NoTickContexts', 'preFormat requires TickContexts');\n }\n const { list: contextList, map: contextMap } = contexts;\n // Reset loss history for evaluator.\n this.lossHistory = [];\n // If voices and a stave were provided, set the Stave for each voice\n // and preFormat to apply Y values to the notes;\n if (voicesParam && stave) {\n voicesParam.forEach((voice) => voice.setStave(stave).preFormat());\n }\n // Now distribute the ticks to each tick context, and assign them their\n // own X positions.\n let x = 0;\n let shift = 0;\n this.minTotalWidth = 0;\n let totalTicks = 0;\n // Pass 1: Give each note maximum width requested by context.\n contextList.forEach((tick) => {\n const context = contextMap[tick];\n // Make sure that all tickables in this context have calculated their\n // space requirements.\n context.preFormat();\n const width = context.getWidth();\n this.minTotalWidth += width;\n const maxTicks = context.getMaxTicks().value();\n totalTicks += maxTicks;\n const metrics = context.getMetrics();\n x = x + shift + metrics.totalLeftPx;\n context.setX(x);\n // Calculate shift for the next tick.\n shift = width - metrics.totalLeftPx;\n });\n // Use softmax based on all notes across all staves. (options.globalSoftmax)\n const { globalSoftmax, softmaxFactor, maxIterations } = this.formatterOptions;\n const exp = (tick) => Math.pow(softmaxFactor, (contextMap[tick].getMaxTicks().value() / totalTicks));\n const expTicksUsed = sumArray(contextList.map(exp));\n this.minTotalWidth = x + shift;\n this.hasMinTotalWidth = true;\n // No justification needed. End formatting.\n if (justifyWidth <= 0)\n return this.evaluate();\n // Start justification. Subtract the right extra pixels of the final context because the formatter\n // justifies based on the context's X position, which is the left-most part of the note head.\n const firstContext = contextMap[contextList[0]];\n const lastContext = contextMap[contextList[contextList.length - 1]];\n // Calculate the \"distance error\" between the tick contexts. The expected distance is the spacing proportional to\n // the softmax of the ticks.\n function calculateIdealDistances(adjustedJustifyWidth) {\n const distances = contextList.map((tick, i) => {\n const context = contextMap[tick];\n const voices = context.getTickablesByVoice();\n let backTickable;\n if (i > 0) {\n const prevContext = contextMap[contextList[i - 1]];\n // Go through each tickable and search backwards for another tickable\n // in the same voice. If found, use that duration (ticks) to calculate\n // the expected distance.\n for (let j = i - 1; j >= 0; j--) {\n const backTick = contextMap[contextList[j]];\n const backVoices = backTick.getTickablesByVoice();\n // Look for matching voices between tick contexts.\n const matchingVoices = [];\n Object.keys(voices).forEach((v) => {\n if (backVoices[v]) {\n matchingVoices.push(v);\n }\n });\n if (matchingVoices.length > 0) {\n // Found matching voices, get largest duration\n let maxTicks = 0;\n let maxNegativeShiftPx = Infinity;\n let expectedDistance = 0;\n matchingVoices.forEach((v) => {\n const ticks = backVoices[v].getTicks().value();\n if (ticks > maxTicks) {\n backTickable = backVoices[v];\n maxTicks = ticks;\n }\n // Calculate the limits of the shift based on modifiers, etc.\n const thisTickable = voices[v];\n const insideLeftEdge = thisTickable.getX() -\n (thisTickable.getMetrics().modLeftPx + thisTickable.getMetrics().leftDisplacedHeadPx);\n const backMetrics = backVoices[v].getMetrics();\n const insideRightEdge = backVoices[v].getX() + backMetrics.notePx + backMetrics.modRightPx + backMetrics.rightDisplacedHeadPx;\n // Don't allow shifting if notes in the same voice can collide\n maxNegativeShiftPx = Math.min(maxNegativeShiftPx, insideLeftEdge - insideRightEdge);\n });\n // Don't shift further left than the notehead of the last context. Actually, stay at most 5% to the right\n // so that two different tick contexts don't align across staves.\n maxNegativeShiftPx = Math.min(maxNegativeShiftPx, context.getX() - (prevContext.getX() + adjustedJustifyWidth * 0.05));\n // Calculate the expected distance of the current context from the last matching tickable. The\n // distance is scaled down by the softmax for the voice.\n if (globalSoftmax) {\n const t = totalTicks;\n expectedDistance = (Math.pow(softmaxFactor, (maxTicks / t)) / expTicksUsed) * adjustedJustifyWidth;\n }\n else if (typeof backTickable !== 'undefined') {\n expectedDistance = backTickable.getVoice().softmax(maxTicks) * adjustedJustifyWidth;\n }\n return {\n expectedDistance,\n maxNegativeShiftPx,\n fromTickable: backTickable,\n };\n }\n }\n }\n return { expectedDistance: 0, fromTickablePx: 0, maxNegativeShiftPx: 0 };\n });\n return distances;\n }\n function shiftToIdealDistances(idealDistances) {\n // Distribute ticks to the contexts based on the calculated distance error.\n const centerX = adjustedJustifyWidth / 2;\n let spaceAccum = 0;\n contextList.forEach((tick, index) => {\n const context = contextMap[tick];\n if (index > 0) {\n const contextX = context.getX();\n const ideal = idealDistances[index];\n const errorPx = defined(ideal.fromTickable).getX() + ideal.expectedDistance - (contextX + spaceAccum);\n let negativeShiftPx = 0;\n if (errorPx > 0) {\n spaceAccum += errorPx;\n }\n else if (errorPx < 0) {\n negativeShiftPx = Math.min(ideal.maxNegativeShiftPx, Math.abs(errorPx));\n spaceAccum += -negativeShiftPx;\n }\n context.setX(contextX + spaceAccum);\n }\n // Move center aligned tickables to middle\n context.getCenterAlignedTickables().forEach((tickable) => {\n tickable.setCenterXShift(centerX - context.getX());\n });\n });\n return lastContext.getX() - firstContext.getX();\n }\n const adjustedJustifyWidth = justifyWidth -\n lastContext.getMetrics().notePx -\n lastContext.getMetrics().totalRightPx -\n firstContext.getMetrics().totalLeftPx;\n const musicFont = Tables.currentMusicFont();\n const configMinPadding = musicFont.lookupMetric('stave.endPaddingMin');\n const configMaxPadding = musicFont.lookupMetric('stave.endPaddingMax');\n let targetWidth = adjustedJustifyWidth;\n const distances = calculateIdealDistances(targetWidth);\n let actualWidth = shiftToIdealDistances(distances);\n // Calculate right justification by finding max of (configured value, min distance between tickables)\n // so measures with lots of white space use it evenly, and crowded measures use at least the configured\n // space.\n const calcMinDistance = (targetWidth, distances) => {\n let mdCalc = targetWidth / 2;\n if (distances.length > 1) {\n for (let di = 1; di < distances.length; ++di) {\n mdCalc = Math.min(distances[di].expectedDistance / 2, mdCalc);\n }\n }\n return mdCalc;\n };\n const minDistance = calcMinDistance(targetWidth, distances);\n // Just one context. Done formatting.\n if (contextList.length === 1)\n return 0;\n // right justify to either the configured padding, or the min distance between notes, whichever is greatest.\n // This * 2 keeps the existing formatting unless there is 'a lot' of extra whitespace, which won't break\n // existing visual regression tests.\n const paddingMax = configMaxPadding * 2 < minDistance ? minDistance : configMaxPadding;\n const paddingMin = paddingMax - (configMaxPadding - configMinPadding);\n const maxX = adjustedJustifyWidth - paddingMin;\n let iterations = maxIterations;\n // Adjust justification width until the right margin is as close as possible to the calculated padding,\n // without going over\n while ((actualWidth > maxX && iterations > 0) || (actualWidth + paddingMax < maxX && iterations > 1)) {\n targetWidth -= actualWidth - maxX;\n actualWidth = shiftToIdealDistances(calculateIdealDistances(targetWidth));\n iterations--;\n }\n this.justifyWidth = justifyWidth;\n return this.evaluate();\n }\n /** Calculate the total cost of this formatting decision. */\n evaluate() {\n if (!this.tickContexts)\n return 0;\n const contexts = this.tickContexts;\n const justifyWidth = this.justifyWidth;\n // Calculate available slack per tick context. This works out how much freedom\n // to move a context has in either direction, without affecting other notes.\n this.contextGaps = { total: 0, gaps: [] };\n contexts.list.forEach((tick, index) => {\n if (index === 0)\n return;\n const prevTick = contexts.list[index - 1];\n const prevContext = contexts.map[prevTick];\n const context = contexts.map[tick];\n const prevMetrics = prevContext.getMetrics();\n const currMetrics = context.getMetrics();\n // Calculate X position of right edge of previous note\n const insideRightEdge = prevContext.getX() + prevMetrics.notePx + prevMetrics.totalRightPx;\n // Calculate X position of left edge of current note\n const insideLeftEdge = context.getX() - currMetrics.totalLeftPx;\n const gap = insideLeftEdge - insideRightEdge;\n this.contextGaps.total += gap;\n this.contextGaps.gaps.push({ x1: insideRightEdge, x2: insideLeftEdge });\n // Tell the tick contexts how much they can reposition themselves.\n context.getFormatterMetrics().freedom.left = gap;\n prevContext.getFormatterMetrics().freedom.right = gap;\n });\n // Calculate mean distance in each voice for each duration type, then calculate\n // how far each note is from the mean.\n this.durationStats = {};\n const durationStats = this.durationStats;\n function updateStats(duration, space) {\n const stats = durationStats[duration];\n if (stats === undefined) {\n durationStats[duration] = { mean: space, count: 1 };\n }\n else {\n stats.count += 1;\n stats.mean = (stats.mean + space) / 2;\n }\n }\n this.voices.forEach((voice) => {\n voice.getTickables().forEach((note, i, notes) => {\n const duration = note.getTicks().clone().simplify().toString();\n const metrics = note.getMetrics();\n const formatterMetrics = note.getFormatterMetrics();\n const leftNoteEdge = note.getX() + metrics.notePx + metrics.modRightPx + metrics.rightDisplacedHeadPx;\n let space = 0;\n if (i < notes.length - 1) {\n const rightNote = notes[i + 1];\n const rightMetrics = rightNote.getMetrics();\n const rightNoteEdge = rightNote.getX() - rightMetrics.modLeftPx - rightMetrics.leftDisplacedHeadPx;\n space = rightNoteEdge - leftNoteEdge;\n formatterMetrics.space.used = rightNote.getX() - note.getX();\n rightNote.getFormatterMetrics().freedom.left = space;\n }\n else {\n space = justifyWidth - leftNoteEdge;\n formatterMetrics.space.used = justifyWidth - note.getX();\n }\n formatterMetrics.freedom.right = space;\n updateStats(duration, formatterMetrics.space.used);\n });\n });\n // Calculate how much each note deviates from the mean. Loss function is square\n // root of the sum of squared deviations.\n let totalDeviation = 0;\n this.voices.forEach((voice) => {\n voice.getTickables().forEach((note) => {\n const duration = note.getTicks().clone().simplify().toString();\n const metrics = note.getFormatterMetrics();\n metrics.space.mean = durationStats[duration].mean;\n metrics.duration = duration;\n metrics.iterations += 1;\n metrics.space.deviation = metrics.space.used - metrics.space.mean;\n totalDeviation += Math.pow(metrics.space.deviation, 2);\n });\n });\n this.totalCost = Math.sqrt(totalDeviation);\n this.lossHistory.push(this.totalCost);\n return this.totalCost;\n }\n /**\n * Run a single iteration of rejustification. At a high level, this method calculates\n * the overall \"loss\" (or cost) of this layout, and repositions tickcontexts in an\n * attempt to reduce the cost. You can call this method multiple times until it finds\n * and oscillates around a global minimum.\n * @param alpha the \"learning rate\" for the formatter. It determines how much of a shift\n * the formatter should make based on its cost function.\n */\n tune(options) {\n var _a;\n const contexts = this.tickContexts;\n if (!contexts) {\n return 0;\n }\n const alpha = (_a = options === null || options === void 0 ? void 0 : options.alpha) !== null && _a !== void 0 ? _a : 0.5;\n // Move `current` tickcontext by `shift` pixels, and adjust the freedom\n // on adjacent tickcontexts.\n function move(current, shift, prev, next) {\n current.setX(current.getX() + shift);\n current.getFormatterMetrics().freedom.left += shift;\n current.getFormatterMetrics().freedom.right -= shift;\n if (prev)\n prev.getFormatterMetrics().freedom.right += shift;\n if (next)\n next.getFormatterMetrics().freedom.left -= shift;\n }\n let shift = 0;\n this.totalShift = 0;\n contexts.list.forEach((tick, index, list) => {\n const context = contexts.map[tick];\n const prevContext = index > 0 ? contexts.map[list[index - 1]] : undefined;\n const nextContext = index < list.length - 1 ? contexts.map[list[index + 1]] : undefined;\n move(context, shift, prevContext, nextContext);\n const cost = -sumArray(context.getTickables().map((t) => t.getFormatterMetrics().space.deviation));\n if (cost > 0) {\n shift = -Math.min(context.getFormatterMetrics().freedom.right, Math.abs(cost));\n }\n else if (cost < 0) {\n if (nextContext) {\n shift = Math.min(nextContext.getFormatterMetrics().freedom.right, Math.abs(cost));\n }\n else {\n shift = 0;\n }\n }\n shift *= alpha;\n this.totalShift += shift;\n });\n return this.evaluate();\n }\n /**\n * This is the top-level call for all formatting logic completed\n * after `x` *and* `y` values have been computed for the notes\n * in the voices.\n */\n postFormat() {\n const postFormatContexts = (contexts) => contexts.list.forEach((tick) => contexts.map[tick].postFormat());\n if (this.modifierContexts)\n postFormatContexts(this.modifierContexts);\n if (this.tickContexts)\n postFormatContexts(this.tickContexts);\n return this;\n }\n /**\n * Take all `voices` and create `ModifierContext`s out of them. This tells\n * the formatters that the voices belong on a single stave.\n */\n joinVoices(voices) {\n this.createModifierContexts(voices);\n this.hasMinTotalWidth = false;\n return this;\n }\n /**\n * Align rests in voices, justify the contexts, and position the notes\n * so voices are aligned and ready to render onto the stave. This method\n * mutates the `x` positions of all tickables in `voices`.\n *\n * Voices are full justified to fit in `justifyWidth` pixels.\n *\n * Set `options.context` to the rendering context. Set `options.align_rests`\n * to true to enable rest alignment.\n */\n format(voices, justifyWidth, options) {\n const opts = Object.assign({ align_rests: false }, options);\n this.voices = voices;\n const softmaxFactor = this.formatterOptions.softmaxFactor;\n if (softmaxFactor) {\n this.voices.forEach((v) => v.setSoftmaxFactor(softmaxFactor));\n }\n this.alignRests(voices, opts.align_rests);\n this.createTickContexts(voices);\n this.preFormat(justifyWidth, opts.context, voices, opts.stave);\n // Only postFormat if a stave was supplied for y value formatting\n if (opts.stave)\n this.postFormat();\n return this;\n }\n // This method is just like `format` except that the `justifyWidth` is inferred from the `stave`.\n formatToStave(voices, stave, optionsParam) {\n const options = Object.assign({ context: stave.getContext() }, optionsParam);\n // eslint-disable-next-line\n const justifyWidth = stave.getNoteEndX() - stave.getNoteStartX() - Stave.defaultPadding;\n L('Formatting voices to width: ', justifyWidth);\n return this.format(voices, justifyWidth, options);\n }\n getTickContext(tick) {\n var _a;\n return (_a = this.tickContexts) === null || _a === void 0 ? void 0 : _a.map[tick];\n }\n}\n// To enable logging for this class. Set `Vex.Flow.Formatter.DEBUG` to `true`.\nFormatter.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n/**\n * ## Description\n *\n * Create a new tuplet from the specified notes. The notes must\n * be part of the same voice. If they are of different rhythmic\n * values, then options.num_notes must be set.\n *\n * @constructor\n * @param {Array.} A set of notes: staveNotes,\n * notes, etc... any class that inherits stemmableNote at some\n * point in its prototype chain.\n * @param options: object {\n *\n * num_notes: fit this many notes into...\n * notes_occupied: ...the space of this many notes\n *\n * Together, these two properties make up the tuplet ratio\n * in the form of num_notes : notes_occupied.\n * num_notes defaults to the number of notes passed in, so\n * it is important that if you omit this property, all of\n * the notes passed should be of the same note value.\n * notes_occupied defaults to 2 -- so you should almost\n * certainly pass this parameter for anything other than\n * a basic triplet.\n *\n * location:\n * default 1, which is above the notes: ┌─── 3 ───┐\n * -1 is below the notes └─── 3 ───┘\n *\n * bracketed: boolean, draw a bracket around the tuplet number\n * when true: ┌─── 3 ───┐ when false: 3\n * defaults to true if notes are not beamed, false otherwise\n *\n * ratioed: boolean\n * when true: ┌─── 7:8 ───┐, when false: ┌─── 7 ───┐\n * defaults to true if the difference between num_notes and\n * notes_occupied is greater than 1.\n *\n * y_offset: int, default 0\n * manually offset a tuplet, for instance to avoid collisions\n * with articulations, etc...\n * }\n */\nimport { Element } from './element';\nimport { Formatter } from './formatter';\nimport { Glyph } from './glyph';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nexport var TupletLocation;\n(function (TupletLocation) {\n TupletLocation[TupletLocation[\"BOTTOM\"] = -1] = \"BOTTOM\";\n TupletLocation[TupletLocation[\"TOP\"] = 1] = \"TOP\";\n})(TupletLocation || (TupletLocation = {}));\nexport class Tuplet extends Element {\n constructor(notes, options = {}) {\n super();\n this.numerator_glyphs = [];\n this.denom_glyphs = [];\n if (!notes || !notes.length) {\n throw new RuntimeError('BadArguments', 'No notes provided for tuplet.');\n }\n this.options = options;\n this.notes = notes;\n this.num_notes = this.options.num_notes != undefined ? this.options.num_notes : notes.length;\n // We accept beats_occupied, but warn that it's deprecated:\n // the preferred property name is now notes_occupied.\n if (this.options.beats_occupied) {\n this.beatsOccupiedDeprecationWarning();\n }\n this.notes_occupied = this.options.notes_occupied || this.options.beats_occupied || 2;\n if (this.options.bracketed != undefined) {\n this.bracketed = this.options.bracketed;\n }\n else {\n this.bracketed = notes.some((note) => !note.hasBeam());\n }\n this.ratioed =\n this.options.ratioed != undefined ? this.options.ratioed : Math.abs(this.notes_occupied - this.num_notes) > 1;\n this.point = Tables.currentMusicFont().lookupMetric('digits.tupletPoint');\n this.y_pos = 16;\n this.x_pos = 100;\n this.width = 200;\n this.setTupletLocation(this.options.location || Tuplet.LOCATION_TOP);\n Formatter.AlignRestsToNotes(notes, true, true);\n this.resolveGlyphs();\n this.attach();\n }\n static get CATEGORY() {\n return Category.Tuplet;\n }\n static get LOCATION_TOP() {\n return TupletLocation.TOP;\n }\n static get LOCATION_BOTTOM() {\n return TupletLocation.BOTTOM;\n }\n static get NESTING_OFFSET() {\n return 15;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static get metrics() {\n return Tables.currentMusicFont().getMetrics().glyphs.tuplet;\n }\n attach() {\n for (let i = 0; i < this.notes.length; i++) {\n const note = this.notes[i];\n note.setTuplet(this);\n }\n }\n detach() {\n for (let i = 0; i < this.notes.length; i++) {\n const note = this.notes[i];\n note.resetTuplet(this);\n }\n }\n /**\n * Set whether or not the bracket is drawn.\n */\n setBracketed(bracketed) {\n this.bracketed = !!bracketed;\n return this;\n }\n /**\n * Set whether or not the ratio is shown.\n */\n setRatioed(ratioed) {\n this.ratioed = !!ratioed;\n return this;\n }\n /**\n * Set the tuplet indicator to be displayed either on the top or bottom of the stave.\n */\n setTupletLocation(location) {\n if (location !== Tuplet.LOCATION_TOP && location !== Tuplet.LOCATION_BOTTOM) {\n // eslint-disable-next-line\n console.warn(`Invalid tuplet location [${location}]. Using Tuplet.LOCATION_TOP.`);\n location = Tuplet.LOCATION_TOP;\n }\n this.location = location;\n return this;\n }\n getNotes() {\n return this.notes;\n }\n getNoteCount() {\n return this.num_notes;\n }\n beatsOccupiedDeprecationWarning() {\n // eslint-disable-next-line\n console.warn('beats_occupied has been deprecated as an option for tuplets. Please use notes_occupied instead.', 'Calls to getBeatsOccupied / setBeatsOccupied should now be routed to getNotesOccupied / setNotesOccupied.', 'The old methods will be removed in VexFlow 5.0.');\n }\n getBeatsOccupied() {\n this.beatsOccupiedDeprecationWarning();\n return this.getNotesOccupied();\n }\n setBeatsOccupied(beats) {\n this.beatsOccupiedDeprecationWarning();\n return this.setNotesOccupied(beats);\n }\n getNotesOccupied() {\n return this.notes_occupied;\n }\n setNotesOccupied(notes) {\n this.detach();\n this.notes_occupied = notes;\n this.resolveGlyphs();\n this.attach();\n }\n resolveGlyphs() {\n this.numerator_glyphs = [];\n let n = this.num_notes;\n while (n >= 1) {\n this.numerator_glyphs.unshift(new Glyph('timeSig' + (n % 10), this.point));\n n = parseInt((n / 10).toString(), 10);\n }\n this.denom_glyphs = [];\n n = this.notes_occupied;\n while (n >= 1) {\n this.denom_glyphs.unshift(new Glyph('timeSig' + (n % 10), this.point));\n n = parseInt((n / 10).toString(), 10);\n }\n }\n // determine how many tuplets are nested within this tuplet\n // on the same side (above/below), to calculate a y\n // offset for this tuplet:\n getNestedTupletCount() {\n const location = this.location;\n const first_note = this.notes[0];\n let maxTupletCount = countTuplets(first_note, location);\n let minTupletCount = countTuplets(first_note, location);\n // Count the tuplets that are on the same side (above/below)\n // as this tuplet:\n function countTuplets(note, location) {\n return note.getTupletStack().filter((tuplet) => tuplet.location === location).length;\n }\n this.notes.forEach((note) => {\n const tupletCount = countTuplets(note, location);\n maxTupletCount = tupletCount > maxTupletCount ? tupletCount : maxTupletCount;\n minTupletCount = tupletCount < minTupletCount ? tupletCount : minTupletCount;\n });\n return maxTupletCount - minTupletCount;\n }\n // determine the y position of the tuplet:\n getYPosition() {\n // offset the tuplet for any nested tuplets between\n // it and the notes:\n const nested_tuplet_y_offset = this.getNestedTupletCount() * Tuplet.NESTING_OFFSET * -this.location;\n // offset the tuplet for any manual y_offset:\n const y_offset = this.options.y_offset || 0;\n // now iterate through the notes and find our highest\n // or lowest locations, to form a base y_pos\n const first_note = this.notes[0];\n let y_pos;\n if (this.location === Tuplet.LOCATION_TOP) {\n y_pos = first_note.checkStave().getYForLine(0) - Tuplet.metrics.topModifierOffset;\n // check modifiers above note to see if they will collide with tuplet beam\n for (let i = 0; i < this.notes.length; ++i) {\n const note = this.notes[i];\n let modLines = 0;\n const mc = note.getModifierContext();\n if (mc) {\n modLines = Math.max(modLines, mc.getState().top_text_line);\n }\n const modY = note.getYForTopText(modLines) - Tuplet.metrics.noteHeadOffset;\n if (note.hasStem() || note.isRest()) {\n const top_y = note.getStemDirection() === Stem.UP\n ? note.getStemExtents().topY - Tuplet.metrics.stemOffset\n : note.getStemExtents().baseY - Tuplet.metrics.noteHeadOffset;\n y_pos = Math.min(top_y, y_pos);\n if (modLines > 0) {\n y_pos = Math.min(modY, y_pos);\n }\n }\n }\n }\n else {\n let lineCheck = Tuplet.metrics.bottomLine; // tuplet default on line 4\n // check modifiers below note to see if they will collide with tuplet beam\n this.notes.forEach((nn) => {\n const mc = nn.getModifierContext();\n if (mc) {\n lineCheck = Math.max(lineCheck, mc.getState().text_line + 1);\n }\n });\n y_pos = first_note.checkStave().getYForLine(lineCheck) + Tuplet.metrics.noteHeadOffset;\n for (let i = 0; i < this.notes.length; ++i) {\n if (this.notes[i].hasStem() || this.notes[i].isRest()) {\n const bottom_y = this.notes[i].getStemDirection() === Stem.UP\n ? this.notes[i].getStemExtents().baseY + Tuplet.metrics.noteHeadOffset\n : this.notes[i].getStemExtents().topY + Tuplet.metrics.stemOffset;\n if (bottom_y > y_pos) {\n y_pos = bottom_y;\n }\n }\n }\n }\n return y_pos + nested_tuplet_y_offset + y_offset;\n }\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n // determine x value of left bound of tuplet\n const first_note = this.notes[0];\n const last_note = this.notes[this.notes.length - 1];\n if (!this.bracketed) {\n this.x_pos = first_note.getStemX();\n this.width = last_note.getStemX() - this.x_pos;\n }\n else {\n this.x_pos = first_note.getTieLeftX() - 5;\n this.width = last_note.getTieRightX() - this.x_pos + 5;\n }\n // determine y value for tuplet\n this.y_pos = this.getYPosition();\n const addGlyphWidth = (width, glyph) => width + defined(glyph.getMetrics().width);\n // calculate total width of tuplet notation\n let width = this.numerator_glyphs.reduce(addGlyphWidth, 0);\n if (this.ratioed) {\n width = this.denom_glyphs.reduce(addGlyphWidth, width);\n width += this.point * 0.32;\n }\n const notation_center_x = this.x_pos + this.width / 2;\n const notation_start_x = notation_center_x - width / 2;\n // draw bracket if the tuplet is not beamed\n if (this.bracketed) {\n const line_width = this.width / 2 - width / 2 - 5;\n // only draw the bracket if it has positive length\n if (line_width > 0) {\n ctx.fillRect(this.x_pos, this.y_pos, line_width, 1);\n ctx.fillRect(this.x_pos + this.width / 2 + width / 2 + 5, this.y_pos, line_width, 1);\n ctx.fillRect(this.x_pos, this.y_pos + (this.location === Tuplet.LOCATION_BOTTOM ? 1 : 0), 1, this.location * 10);\n ctx.fillRect(this.x_pos + this.width, this.y_pos + (this.location === Tuplet.LOCATION_BOTTOM ? 1 : 0), 1, this.location * 10);\n }\n }\n // draw numerator glyphs\n const shiftY = Tables.currentMusicFont().lookupMetric('digits.shiftY', 0);\n let x_offset = 0;\n this.numerator_glyphs.forEach((glyph) => {\n glyph.render(ctx, notation_start_x + x_offset, this.y_pos + this.point / 3 - 2 + shiftY);\n x_offset += defined(glyph.getMetrics().width);\n });\n // display colon and denominator if the ratio is to be shown\n if (this.ratioed) {\n const colon_x = notation_start_x + x_offset + this.point * 0.16;\n const colon_radius = this.point * 0.06;\n ctx.beginPath();\n ctx.arc(colon_x, this.y_pos - this.point * 0.08, colon_radius, 0, Math.PI * 2, true);\n ctx.closePath();\n ctx.fill();\n ctx.beginPath();\n ctx.arc(colon_x, this.y_pos + this.point * 0.12, colon_radius, 0, Math.PI * 2, true);\n ctx.closePath();\n ctx.fill();\n x_offset += this.point * 0.32;\n this.denom_glyphs.forEach((glyph) => {\n glyph.render(ctx, notation_start_x + x_offset, this.y_pos + this.point / 3 - 2 + shiftY);\n x_offset += defined(glyph.getMetrics().width);\n });\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Fraction } from './fraction';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { TupletLocation } from './tuplet';\nimport { Category, isStaveNote, isTabNote } from './typeguard';\nimport { RuntimeError } from './util';\nfunction calculateStemDirection(notes) {\n let lineSum = 0;\n notes.forEach((note) => {\n if (note.keyProps) {\n note.keyProps.forEach((keyProp) => {\n lineSum += keyProp.line - 3;\n });\n }\n });\n if (lineSum >= 0) {\n return Stem.DOWN;\n }\n return Stem.UP;\n}\nfunction getStemSlope(firstNote, lastNote) {\n const firstStemTipY = firstNote.getStemExtents().topY;\n const firstStemX = firstNote.getStemX();\n const lastStemTipY = lastNote.getStemExtents().topY;\n const lastStemX = lastNote.getStemX();\n return (lastStemTipY - firstStemTipY) / (lastStemX - firstStemX);\n}\nconst BEAM_LEFT = 'L';\nconst BEAM_RIGHT = 'R';\nconst BEAM_BOTH = 'B';\n/** `Beams` span over a set of `StemmableNotes`. */\nexport class Beam extends Element {\n constructor(notes, auto_stem = false) {\n super();\n this.slope = 0;\n this.y_shift = 0;\n if (!notes || notes.length === 0) {\n throw new RuntimeError('BadArguments', 'No notes provided for beam.');\n }\n if (notes.length === 1) {\n throw new RuntimeError('BadArguments', 'Too few notes for beam.');\n }\n // Validate beam line, direction and ticks.\n this.ticks = notes[0].getIntrinsicTicks();\n if (this.ticks >= Tables.durationToTicks('4')) {\n throw new RuntimeError('BadArguments', 'Beams can only be applied to notes shorter than a quarter note.');\n }\n let i; // shared iterator\n let note;\n this.stem_direction = Stem.UP;\n for (i = 0; i < notes.length; ++i) {\n note = notes[i];\n if (note.hasStem()) {\n this.stem_direction = note.getStemDirection();\n break;\n }\n }\n let stem_direction = this.stem_direction;\n // Figure out optimal stem direction based on given notes\n if (auto_stem && isStaveNote(notes[0])) {\n stem_direction = calculateStemDirection(notes);\n }\n else if (auto_stem && isTabNote(notes[0])) {\n // Auto Stem TabNotes\n const stem_weight = notes.reduce((memo, note) => memo + note.getStemDirection(), 0);\n stem_direction = stem_weight > -1 ? Stem.UP : Stem.DOWN;\n }\n // Apply stem directions and attach beam to notes\n for (i = 0; i < notes.length; ++i) {\n note = notes[i];\n if (auto_stem) {\n note.setStemDirection(stem_direction);\n this.stem_direction = stem_direction;\n }\n note.setBeam(this);\n }\n this.postFormatted = false;\n this.notes = notes;\n this.beam_count = this.getBeamCount();\n this.break_on_indices = [];\n this.render_options = {\n beam_width: 5,\n max_slope: 0.25,\n min_slope: -0.25,\n slope_iterations: 20,\n slope_cost: 100,\n show_stemlets: false,\n stemlet_extension: 7,\n partial_beam_length: 10,\n flat_beams: false,\n min_flat_beam_offset: 15,\n };\n }\n static get CATEGORY() {\n return Category.Beam;\n }\n /** Get the direction of the beam */\n getStemDirection() {\n return this.stem_direction;\n }\n /**\n * Get the default beam groups for a provided time signature.\n * Attempt to guess if the time signature is not found in table.\n * Currently this is fairly naive.\n */\n static getDefaultBeamGroups(time_sig) {\n if (!time_sig || time_sig === 'c') {\n time_sig = '4/4';\n }\n const defaults = {\n '1/2': ['1/2'],\n '2/2': ['1/2'],\n '3/2': ['1/2'],\n '4/2': ['1/2'],\n '1/4': ['1/4'],\n '2/4': ['1/4'],\n '3/4': ['1/4'],\n '4/4': ['1/4'],\n '1/8': ['1/8'],\n '2/8': ['2/8'],\n '3/8': ['3/8'],\n '4/8': ['2/8'],\n '1/16': ['1/16'],\n '2/16': ['2/16'],\n '3/16': ['3/16'],\n '4/16': ['2/16'],\n };\n const groups = defaults[time_sig];\n if (groups === undefined) {\n // If no beam groups found, naively determine\n // the beam groupings from the time signature\n const beatTotal = parseInt(time_sig.split('/')[0], 10);\n const beatValue = parseInt(time_sig.split('/')[1], 10);\n const tripleMeter = beatTotal % 3 === 0;\n if (tripleMeter) {\n return [new Fraction(3, beatValue)];\n }\n else if (beatValue > 4) {\n return [new Fraction(2, beatValue)];\n }\n else if (beatValue <= 4) {\n return [new Fraction(1, beatValue)];\n }\n }\n else {\n return groups.map((group) => new Fraction().parse(group));\n }\n return [new Fraction(1, 4)];\n }\n /**\n * A helper function to automatically build basic beams for a voice. For more\n * complex auto-beaming use `Beam.generateBeams()`.\n * @param voice the voice to generate the beams for\n * @param stem_direction a stem direction to apply to the entire voice\n * @param groups an array of `Fraction` representing beat groupings for the beam\n */\n static applyAndGetBeams(voice, stem_direction, groups) {\n return Beam.generateBeams(voice.getTickables(), { groups, stem_direction });\n }\n /**\n * A helper function to autimatically build beams for a voice with\n * configuration options.\n *\n * Example configuration object:\n *\n * ```\n * config = {\n * groups: [new Vex.Flow.Fraction(2, 8)],\n * stem_direction: -1,\n * beam_rests: true,\n * beam_middle_only: true,\n * show_stemlets: false\n * };\n * ```\n * @param notes an array of notes to create the beams for\n * @param config the configuration object\n * @param config.stem_direction set to apply the same direction to all notes\n * @param config.beam_rests set to `true` to include rests in the beams\n * @param config.beam_middle_only set to `true` to only beam rests in the middle of the beat\n * @param config.show_stemlets set to `true` to draw stemlets for rests\n * @param config.maintain_stem_directions set to `true` to not apply new stem directions\n * @param config.groups array of `Fractions` that represent the beat structure to beam the notes\n *\n */\n static generateBeams(notes, config = {}) {\n if (!config.groups || !config.groups.length) {\n config.groups = [new Fraction(2, 8)];\n }\n // Convert beam groups to tick amounts\n const tickGroups = config.groups.map((group) => {\n if (!group.multiply) {\n throw new RuntimeError('InvalidBeamGroups', 'The beam groups must be an array of Vex.Flow.Fractions');\n }\n return group.clone().multiply(Tables.RESOLUTION, 1);\n });\n const unprocessedNotes = notes;\n let currentTickGroup = 0;\n let noteGroups = [];\n let currentGroup = [];\n function getTotalTicks(vf_notes) {\n return vf_notes.reduce((memo, note) => note.getTicks().clone().add(memo), new Fraction(0, 1));\n }\n function nextTickGroup() {\n if (tickGroups.length - 1 > currentTickGroup) {\n currentTickGroup += 1;\n }\n else {\n currentTickGroup = 0;\n }\n }\n function createGroups() {\n let nextGroup = [];\n // number of ticks in current group\n let currentGroupTotalTicks = new Fraction(0, 1);\n unprocessedNotes.forEach((unprocessedNote) => {\n nextGroup = [];\n if (unprocessedNote.shouldIgnoreTicks()) {\n noteGroups.push(currentGroup);\n currentGroup = nextGroup;\n return; // Ignore untickables (like bar notes)\n }\n currentGroup.push(unprocessedNote);\n const ticksPerGroup = tickGroups[currentTickGroup].clone();\n const totalTicks = getTotalTicks(currentGroup).add(currentGroupTotalTicks);\n // Double the amount of ticks in a group, if it's an unbeamable tuplet\n const unbeamable = Tables.durationToNumber(unprocessedNote.getDuration()) < 8;\n if (unbeamable && unprocessedNote.getTuplet()) {\n ticksPerGroup.numerator *= 2;\n }\n // If the note that was just added overflows the group tick total\n if (totalTicks.greaterThan(ticksPerGroup)) {\n // If the overflow note can be beamed, start the next group\n // with it. Unbeamable notes leave the group overflowed.\n if (!unbeamable) {\n const note = currentGroup.pop();\n if (note)\n nextGroup.push(note);\n }\n noteGroups.push(currentGroup);\n // We have overflown, so we're going to next tick group. As we might have\n // overflown by more than 1 group, we need to go forward as many times as\n // needed, decreasing currentGroupTotalTicks by as many ticks as there are\n // in current groups as we go forward.\n do {\n currentGroupTotalTicks = totalTicks.subtract(tickGroups[currentTickGroup]);\n nextTickGroup();\n } while (currentGroupTotalTicks.greaterThanEquals(tickGroups[currentTickGroup]));\n currentGroup = nextGroup;\n }\n else if (totalTicks.equals(ticksPerGroup)) {\n noteGroups.push(currentGroup);\n currentGroupTotalTicks = new Fraction(0, 1);\n currentGroup = nextGroup;\n nextTickGroup();\n }\n });\n // Adds any remainder notes beam\n if (currentGroup.length > 0) {\n noteGroups.push(currentGroup);\n }\n }\n function getBeamGroups() {\n return noteGroups.filter((group) => {\n if (group.length > 1) {\n let beamable = true;\n group.forEach((note) => {\n if (note.getIntrinsicTicks() >= Tables.durationToTicks('4')) {\n beamable = false;\n }\n });\n return beamable;\n }\n return false;\n });\n }\n // Splits up groups by Rest\n function sanitizeGroups() {\n const sanitizedGroups = [];\n noteGroups.forEach((group) => {\n let tempGroup = [];\n group.forEach((note, index, group) => {\n const isFirstOrLast = index === 0 || index === group.length - 1;\n const prevNote = group[index - 1];\n const breaksOnEachRest = !config.beam_rests && note.isRest();\n const breaksOnFirstOrLastRest = config.beam_rests && config.beam_middle_only && note.isRest() && isFirstOrLast;\n let breakOnStemChange = false;\n if (config.maintain_stem_directions && prevNote && !note.isRest() && !prevNote.isRest()) {\n const prevDirection = prevNote.getStemDirection();\n const currentDirection = note.getStemDirection();\n breakOnStemChange = currentDirection !== prevDirection;\n }\n const isUnbeamableDuration = parseInt(note.getDuration(), 10) < 8;\n // Determine if the group should be broken at this note\n const shouldBreak = breaksOnEachRest || breaksOnFirstOrLastRest || breakOnStemChange || isUnbeamableDuration;\n if (shouldBreak) {\n // Add current group\n if (tempGroup.length > 0) {\n sanitizedGroups.push(tempGroup);\n }\n // Start a new group. Include the current note if the group\n // was broken up by stem direction, as that note needs to start\n // the next group of notes\n tempGroup = breakOnStemChange ? [note] : [];\n }\n else {\n // Add note to group\n tempGroup.push(note);\n }\n });\n // If there is a remaining group, add it as well\n if (tempGroup.length > 0) {\n sanitizedGroups.push(tempGroup);\n }\n });\n noteGroups = sanitizedGroups;\n }\n function formatStems() {\n noteGroups.forEach((group) => {\n let stemDirection;\n if (config.maintain_stem_directions) {\n const note = findFirstNote(group);\n stemDirection = note ? note.getStemDirection() : Stem.UP;\n }\n else {\n if (config.stem_direction) {\n stemDirection = config.stem_direction;\n }\n else {\n stemDirection = calculateStemDirection(group);\n }\n }\n applyStemDirection(group, stemDirection);\n });\n }\n function findFirstNote(group) {\n for (let i = 0; i < group.length; i++) {\n const note = group[i];\n if (!note.isRest()) {\n return note;\n }\n }\n return false;\n }\n function applyStemDirection(group, direction) {\n group.forEach((note) => {\n note.setStemDirection(direction);\n });\n }\n // Get all of the tuplets in all of the note groups\n function getTuplets() {\n const uniqueTuplets = [];\n // Go through all of the note groups and inspect for tuplets\n noteGroups.forEach((group) => {\n let tuplet;\n group.forEach((note) => {\n const noteTuplet = note.getTuplet();\n if (noteTuplet && tuplet !== noteTuplet) {\n tuplet = noteTuplet;\n uniqueTuplets.push(tuplet);\n }\n });\n });\n return uniqueTuplets;\n }\n // Using closures to store the variables throughout the various functions\n // IMO Keeps it this process lot cleaner - but not super consistent with\n // the rest of the API's style - Silverwolf90 (Cyril)\n createGroups();\n sanitizeGroups();\n formatStems();\n // Get the notes to be beamed\n const beamedNoteGroups = getBeamGroups();\n // Get the tuplets in order to format them accurately\n const allTuplets = getTuplets();\n // Create a Vex.Flow.Beam from each group of notes to be beamed\n const beams = [];\n beamedNoteGroups.forEach((group) => {\n const beam = new Beam(group);\n if (config.show_stemlets) {\n beam.render_options.show_stemlets = true;\n }\n if (config.secondary_breaks) {\n beam.render_options.secondary_break_ticks = Tables.durationToTicks(config.secondary_breaks);\n }\n if (config.flat_beams === true) {\n beam.render_options.flat_beams = true;\n beam.render_options.flat_beam_offset = config.flat_beam_offset;\n }\n beams.push(beam);\n });\n // Reformat tuplets\n allTuplets.forEach((tuplet) => {\n // Set the tuplet location based on the stem direction\n const direction = tuplet.notes[0].stem_direction === Stem.DOWN ? TupletLocation.BOTTOM : TupletLocation.TOP;\n tuplet.setTupletLocation(direction);\n // If any of the notes in the tuplet are not beamed, draw a bracket.\n let bracketed = false;\n for (let i = 0; i < tuplet.notes.length; i++) {\n const note = tuplet.notes[i];\n if (!note.hasBeam()) {\n bracketed = true;\n break;\n }\n }\n tuplet.setBracketed(bracketed);\n });\n return beams;\n }\n /** Get the notes in this beam. */\n getNotes() {\n return this.notes;\n }\n /** Get the max number of beams in the set of notes. */\n getBeamCount() {\n const beamCounts = this.notes.map((note) => note.getGlyph().beam_count);\n const maxBeamCount = beamCounts.reduce((max, beamCount) => (beamCount > max ? beamCount : max));\n return maxBeamCount;\n }\n /** Set which note `indices` to break the secondary beam at. */\n breakSecondaryAt(indices) {\n this.break_on_indices = indices;\n return this;\n }\n /** Return the y coordinate for linear function. */\n getSlopeY(x, first_x_px, first_y_px, slope) {\n return first_y_px + (x - first_x_px) * slope;\n }\n /** Calculate the best possible slope for the provided notes. */\n calculateSlope() {\n const { notes, stem_direction: stemDirection, render_options: { max_slope, min_slope, slope_iterations, slope_cost }, } = this;\n const firstNote = notes[0];\n const initialSlope = getStemSlope(firstNote, notes[notes.length - 1]);\n const increment = (max_slope - min_slope) / slope_iterations;\n let minCost = Number.MAX_VALUE;\n let bestSlope = 0;\n let yShift = 0;\n // iterate through slope values to find best weighted fit\n for (let slope = min_slope; slope <= max_slope; slope += increment) {\n let totalStemExtension = 0;\n let yShiftTemp = 0;\n // iterate through notes, calculating y shift and stem extension\n for (let i = 1; i < notes.length; ++i) {\n const note = notes[i];\n if (note.hasStem() || note.isRest()) {\n const adjustedStemTipY = this.getSlopeY(note.getStemX(), firstNote.getStemX(), firstNote.getStemExtents().topY, slope) + yShiftTemp;\n const stemTipY = note.getStemExtents().topY;\n // beam needs to be shifted up to accommodate note\n if (stemTipY * stemDirection < adjustedStemTipY * stemDirection) {\n const diff = Math.abs(stemTipY - adjustedStemTipY);\n yShiftTemp += diff * -stemDirection;\n totalStemExtension += diff * i;\n }\n else {\n // beam overshoots note, account for the difference\n totalStemExtension += (stemTipY - adjustedStemTipY) * stemDirection;\n }\n }\n }\n // most engraving books suggest aiming for a slope about half the angle of the\n // difference between the first and last notes' stem length;\n const idealSlope = initialSlope / 2;\n const distanceFromIdeal = Math.abs(idealSlope - slope);\n // This tries to align most beams to something closer to the idealSlope, but\n // doesn't go crazy. To disable, set this.render_options.slope_cost = 0\n const cost = slope_cost * distanceFromIdeal + Math.abs(totalStemExtension);\n // update state when a more ideal slope is found\n if (cost < minCost) {\n minCost = cost;\n bestSlope = slope;\n yShift = yShiftTemp;\n }\n }\n this.slope = bestSlope;\n this.y_shift = yShift;\n }\n /** Calculate a slope and y-shift for flat beams. */\n calculateFlatSlope() {\n const { notes, stem_direction, render_options: { beam_width, min_flat_beam_offset, flat_beam_offset }, } = this;\n // If a flat beam offset has not yet been supplied or calculated,\n // generate one based on the notes in this particular note group\n let total = 0;\n let extremeY = 0; // Store the highest or lowest note here\n let extremeBeamCount = 0; // The beam count of the extreme note\n let currentExtreme = 0;\n for (let i = 0; i < notes.length; i++) {\n // Total up all of the offsets so we can average them out later\n const note = notes[i];\n const stemTipY = note.getStemExtents().topY;\n total += stemTipY;\n // Store the highest (stems-up) or lowest (stems-down) note so the\n // offset can be adjusted in case the average isn't enough\n if (stem_direction === Stem.DOWN && currentExtreme < stemTipY) {\n currentExtreme = stemTipY;\n extremeY = Math.max(...note.getYs());\n extremeBeamCount = note.getBeamCount();\n }\n else if (stem_direction === Stem.UP && (currentExtreme === 0 || currentExtreme > stemTipY)) {\n currentExtreme = stemTipY;\n extremeY = Math.min(...note.getYs());\n extremeBeamCount = note.getBeamCount();\n }\n }\n // Average the offsets to try and come up with a reasonable one that\n // works for all of the notes in the beam group.\n let offset = total / notes.length;\n // In case the average isn't long enough, add or subtract some more\n // based on the highest or lowest note (again, based on the stem\n // direction). This also takes into account the added height due to\n // the width of the beams.\n const beamWidth = beam_width * 1.5;\n const extremeTest = min_flat_beam_offset + extremeBeamCount * beamWidth;\n const newOffset = extremeY + extremeTest * -stem_direction;\n if (stem_direction === Stem.DOWN && offset < newOffset) {\n offset = extremeY + extremeTest;\n }\n else if (stem_direction === Stem.UP && offset > newOffset) {\n offset = extremeY - extremeTest;\n }\n if (!flat_beam_offset) {\n // Set the offset for the group based on the calculations above.\n this.render_options.flat_beam_offset = offset;\n }\n else if (stem_direction === Stem.DOWN && offset > flat_beam_offset) {\n this.render_options.flat_beam_offset = offset;\n }\n else if (stem_direction === Stem.UP && offset < flat_beam_offset) {\n this.render_options.flat_beam_offset = offset;\n }\n // for flat beams, the slope and y_shift are simply 0\n this.slope = 0;\n this.y_shift = 0;\n }\n /** Return the Beam y offset. */\n getBeamYToDraw() {\n const firstNote = this.notes[0];\n const firstStemTipY = firstNote.getStemExtents().topY;\n let beamY = firstStemTipY;\n // For flat beams, set the first and last Y to the offset, rather than\n // using the note's stem extents.\n if (this.render_options.flat_beams && this.render_options.flat_beam_offset) {\n beamY = this.render_options.flat_beam_offset;\n }\n return beamY;\n }\n /**\n * Create new stems for the notes in the beam, so that each stem\n * extends into the beams.\n */\n applyStemExtensions() {\n const { notes, slope, y_shift, stem_direction, beam_count, render_options: { show_stemlets, stemlet_extension, beam_width }, } = this;\n const firstNote = notes[0];\n const firstStemTipY = this.getBeamYToDraw();\n const firstStemX = firstNote.getStemX();\n for (let i = 0; i < notes.length; ++i) {\n const note = notes[i];\n const stem = note.getStem();\n if (stem) {\n const stemX = note.getStemX();\n const { topY: stemTipY } = note.getStemExtents();\n const beamedStemTipY = this.getSlopeY(stemX, firstStemX, firstStemTipY, slope) + y_shift;\n const preBeamExtension = stem.getExtension();\n const beamExtension = stem_direction === Stem.UP ? stemTipY - beamedStemTipY : beamedStemTipY - stemTipY;\n stem.setExtension(preBeamExtension + beamExtension);\n stem.adjustHeightForBeam();\n if (note.isRest() && show_stemlets) {\n const beamWidth = beam_width;\n const totalBeamWidth = (beam_count - 1) * beamWidth * 1.5 + beamWidth;\n stem.setVisibility(true).setStemlet(true, totalBeamWidth + stemlet_extension);\n }\n }\n }\n }\n /** Return upper level beam direction. */\n lookupBeamDirection(duration, prev_tick, tick, next_tick) {\n if (duration === '4') {\n return BEAM_LEFT;\n }\n const lookup_duration = `${Tables.durationToNumber(duration) / 2}`;\n const prev_note_gets_beam = prev_tick < Tables.durationToTicks(lookup_duration);\n const next_note_gets_beam = next_tick < Tables.durationToTicks(lookup_duration);\n const note_gets_beam = tick < Tables.durationToTicks(lookup_duration);\n if (prev_note_gets_beam && next_note_gets_beam && note_gets_beam) {\n return BEAM_BOTH;\n }\n else if (prev_note_gets_beam && !next_note_gets_beam && note_gets_beam) {\n return BEAM_LEFT;\n }\n else if (!prev_note_gets_beam && next_note_gets_beam && note_gets_beam) {\n return BEAM_RIGHT;\n }\n return this.lookupBeamDirection(lookup_duration, prev_tick, tick, next_tick);\n }\n /** Get the x coordinates for the beam lines of specific `duration`. */\n getBeamLines(duration) {\n const tick_of_duration = Tables.durationToTicks(duration);\n let beam_started = false;\n const beam_lines = [];\n let current_beam = undefined;\n const partial_beam_length = this.render_options.partial_beam_length;\n let previous_should_break = false;\n let tick_tally = 0;\n for (let i = 0; i < this.notes.length; ++i) {\n const note = this.notes[i];\n // See if we need to break secondary beams on this note.\n const ticks = note.getTicks().value();\n tick_tally += ticks;\n let should_break = false;\n // 8th note beams are always drawn.\n if (parseInt(duration, 10) >= 8) {\n // First, check to see if any indices were set up through breakSecondaryAt()\n should_break = this.break_on_indices.indexOf(i) !== -1;\n // If the secondary breaks were auto-configured in the render options,\n // handle that as well.\n if (this.render_options.secondary_break_ticks && tick_tally >= this.render_options.secondary_break_ticks) {\n tick_tally = 0;\n should_break = true;\n }\n }\n const note_gets_beam = note.getIntrinsicTicks() < tick_of_duration;\n const stem_x = note.getStemX() - Stem.WIDTH / 2;\n // Check to see if the next note in the group will get a beam at this\n // level. This will help to inform the partial beam logic below.\n const prev_note = this.notes[i - 1];\n const next_note = this.notes[i + 1];\n const next_note_gets_beam = next_note && next_note.getIntrinsicTicks() < tick_of_duration;\n const prev_note_gets_beam = prev_note && prev_note.getIntrinsicTicks() < tick_of_duration;\n const beam_alone = prev_note && next_note && note_gets_beam && !prev_note_gets_beam && !next_note_gets_beam;\n // const beam_alone = note_gets_beam && !prev_note_gets_beam && !next_note_gets_beam;\n if (note_gets_beam) {\n // This note gets a beam at the current level\n if (beam_started) {\n // We're currently in the middle of a beam. Just continue it on to\n // the stem X of the current note.\n current_beam = beam_lines[beam_lines.length - 1];\n current_beam.end = stem_x;\n // If a secondary beam break is set up, end the beam right now.\n if (should_break) {\n beam_started = false;\n if (next_note && !next_note_gets_beam && current_beam.end === undefined) {\n // This note gets a beam,.but the next one does not. This means\n // we need a partial pointing right.\n current_beam.end = current_beam.start - partial_beam_length;\n }\n }\n }\n else {\n // No beam started yet. Start a new one.\n current_beam = { start: stem_x, end: undefined };\n beam_started = true;\n if (beam_alone) {\n // previous and next beam exists and does not get a beam but current gets it.\n const prev_tick = prev_note.getIntrinsicTicks();\n const next_tick = next_note.getIntrinsicTicks();\n const tick = note.getIntrinsicTicks();\n const beam_direction = this.lookupBeamDirection(duration, prev_tick, tick, next_tick);\n if ([BEAM_LEFT, BEAM_BOTH].includes(beam_direction)) {\n current_beam.end = current_beam.start - partial_beam_length;\n }\n else {\n current_beam.end = current_beam.start + partial_beam_length;\n }\n }\n else if (!next_note_gets_beam) {\n // The next note doesn't get a beam. Draw a partial.\n if ((previous_should_break || i === 0) && next_note) {\n // This is the first note (but not the last one), or it is\n // following a secondary break. Draw a partial to the right.\n current_beam.end = current_beam.start + partial_beam_length;\n }\n else {\n // By default, draw a partial to the left.\n current_beam.end = current_beam.start - partial_beam_length;\n }\n }\n else if (should_break) {\n // This note should have a secondary break after it. Even though\n // we just started a beam, it needs to end immediately.\n current_beam.end = current_beam.start - partial_beam_length;\n beam_started = false;\n }\n beam_lines.push(current_beam);\n }\n }\n else {\n // The current note does not get a beam.\n beam_started = false;\n }\n // Store the secondary break flag to inform the partial beam logic in\n // the next iteration of the loop.\n previous_should_break = should_break;\n }\n // Add a partial beam pointing left if this is the last note in the group\n const last_beam = beam_lines[beam_lines.length - 1];\n if (last_beam && last_beam.end === undefined) {\n last_beam.end = last_beam.start - partial_beam_length;\n }\n return beam_lines;\n }\n /** Render the stems for each note. */\n drawStems(ctx) {\n this.notes.forEach((note) => {\n const stem = note.getStem();\n if (stem) {\n stem.setContext(ctx).draw();\n }\n }, this);\n }\n // Render the beam lines\n drawBeamLines(ctx) {\n const valid_beam_durations = ['4', '8', '16', '32', '64'];\n const firstNote = this.notes[0];\n let beamY = this.getBeamYToDraw();\n const firstStemX = firstNote.getStemX();\n const beamThickness = this.render_options.beam_width * this.stem_direction;\n // Draw the beams.\n for (let i = 0; i < valid_beam_durations.length; ++i) {\n const duration = valid_beam_durations[i];\n const beamLines = this.getBeamLines(duration);\n for (let j = 0; j < beamLines.length; ++j) {\n const beam_line = beamLines[j];\n const startBeamX = beam_line.start;\n const startBeamY = this.getSlopeY(startBeamX, firstStemX, beamY, this.slope);\n const lastBeamX = beam_line.end;\n if (lastBeamX) {\n const lastBeamY = this.getSlopeY(lastBeamX, firstStemX, beamY, this.slope);\n ctx.beginPath();\n ctx.moveTo(startBeamX, startBeamY);\n ctx.lineTo(startBeamX, startBeamY + beamThickness);\n ctx.lineTo(lastBeamX + 1, lastBeamY + beamThickness);\n ctx.lineTo(lastBeamX + 1, lastBeamY);\n ctx.closePath();\n ctx.fill();\n }\n else {\n throw new RuntimeError('NoLastBeamX', 'lastBeamX undefined.');\n }\n }\n beamY += beamThickness * 1.5;\n }\n }\n /** Pre-format the beam. */\n preFormat() {\n return this;\n }\n /**\n * Post-format the beam. This can only be called after\n * the notes in the beam have both `x` and `y` values. ie: they've\n * been formatted and have staves.\n */\n postFormat() {\n if (this.postFormatted)\n return;\n // Calculate a smart slope if we're not forcing the beams to be flat.\n if (isTabNote(this.notes[0]) || this.render_options.flat_beams) {\n this.calculateFlatSlope();\n }\n else {\n this.calculateSlope();\n }\n this.applyStemExtensions();\n this.postFormatted = true;\n }\n /** Render the beam to the canvas context */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n if (this.unbeamable)\n return;\n if (!this.postFormatted) {\n this.postFormat();\n }\n this.drawStems(ctx);\n this.applyStyle();\n this.drawBeamLines(ctx);\n this.restoreStyle();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2014\n// MIT License\nimport { Clef } from './clef';\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Category } from './typeguard';\n/** ClefNote implements clef annotations in measures. */\nexport class ClefNote extends Note {\n constructor(type, size, annotation) {\n super({ duration: 'b' });\n this.type = type;\n this.clef_obj = new Clef(type, size, annotation);\n this.clef = this.clef_obj.clef;\n this.glyph = new Glyph(this.clef.code, this.clef.point);\n this.setWidth(this.glyph.getMetrics().width);\n // Note properties\n this.ignore_ticks = true;\n }\n static get CATEGORY() {\n return Category.ClefNote;\n }\n /** Set clef type, size and annotation. */\n setType(type, size, annotation) {\n this.type = type;\n this.clef_obj = new Clef(type, size, annotation);\n this.clef = this.clef_obj.clef;\n this.glyph = new Glyph(this.clef.code, this.clef.point);\n this.setWidth(this.glyph.getMetrics().width);\n return this;\n }\n /** Get associated clef. */\n getClef() {\n return this.clef;\n }\n /** Set associated context. */\n setContext(context) {\n super.setContext(context);\n this.glyph.setContext(this.getContext());\n return this;\n }\n /** Get bounding box. */\n getBoundingBox() {\n return super.getBoundingBox();\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n /** Render clef note. */\n draw() {\n var _a;\n const stave = this.checkStave();\n if (!this.glyph.getContext()) {\n this.glyph.setContext(this.getContext());\n }\n this.setRendered();\n const abs_x = this.getAbsoluteX();\n this.glyph.setStave(stave);\n this.glyph.setYShift(stave.getYForLine((_a = this.clef.line) !== null && _a !== void 0 ? _a : 0) - stave.getYForGlyphs());\n this.glyph.renderToStave(abs_x);\n // If the Vex.Flow.Clef has an annotation, such as 8va, draw it.\n if (this.clef_obj.annotation !== undefined) {\n const attachment = new Glyph(this.clef_obj.annotation.code, this.clef_obj.annotation.point);\n if (!attachment.getContext()) {\n attachment.setContext(this.getContext());\n }\n attachment.setStave(stave);\n attachment.setYShift(stave.getYForLine(this.clef_obj.annotation.line) - stave.getYForGlyphs());\n attachment.setXShift(this.clef_obj.annotation.x_shift);\n attachment.renderToStave(abs_x);\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// This file implements the `Crescendo` object which draws crescendos and\n// decrescendo dynamics markings. A `Crescendo` is initialized with a\n// duration and formatted as part of a `Voice` like any other `Note`\n// type in VexFlow. This object would most likely be formatted in a Voice\n// with `TextNotes` - which are used to represent other dynamics markings.\nimport { Note } from './note';\nimport { TickContext } from './tickcontext';\nimport { Category } from './typeguard';\nimport { log } from './util';\n// To enable logging for this class. Set `Vex.Flow.Crescendo.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (Crescendo.DEBUG)\n log('Vex.Flow.Crescendo', args);\n}\n// Private helper to draw the hairpin\nfunction renderHairpin(ctx, params) {\n const begin_x = params.begin_x;\n const end_x = params.end_x;\n const y = params.y;\n const half_height = params.height / 2;\n ctx.beginPath();\n if (params.reverse) {\n ctx.moveTo(begin_x, y - half_height);\n ctx.lineTo(end_x, y);\n ctx.lineTo(begin_x, y + half_height);\n }\n else {\n ctx.moveTo(end_x, y - half_height);\n ctx.lineTo(begin_x, y);\n ctx.lineTo(end_x, y + half_height);\n }\n ctx.stroke();\n ctx.closePath();\n}\nexport class Crescendo extends Note {\n // Initialize the crescendo's properties\n constructor(noteStruct) {\n super(noteStruct);\n this.options = {\n // Extensions to the length of the crescendo on either side\n extend_left: 0,\n extend_right: 0,\n // Vertical shift\n y_shift: 0,\n };\n // Whether the object is a decrescendo\n this.decrescendo = false;\n // The staff line to be placed on\n this.line = noteStruct.line || 0;\n // The height at the open end of the cresc/decresc\n this.height = 15;\n }\n /** Crescendo category string. */\n static get CATEGORY() {\n return Category.Crescendo;\n }\n // Set the line to center the element on\n setLine(line) {\n this.line = line;\n return this;\n }\n // Set the full height at the open end\n setHeight(height) {\n this.height = height;\n return this;\n }\n // Set whether the sign should be a descresendo by passing a bool\n // to `decresc`\n setDecrescendo(decresc) {\n this.decrescendo = decresc;\n return this;\n }\n // Preformat the note\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n // Render the Crescendo object onto the canvas\n draw() {\n const ctx = this.checkContext();\n const stave = this.checkStave();\n this.setRendered();\n const tick_context = this.getTickContext();\n const next_context = TickContext.getNextContext(tick_context);\n const begin_x = this.getAbsoluteX();\n const end_x = next_context ? next_context.getX() : stave.getX() + stave.getWidth();\n const y = stave.getYForLine(this.line + -3) + 1;\n L('Drawing ', this.decrescendo ? 'decrescendo ' : 'crescendo ', this.height, 'x', begin_x - end_x);\n renderHairpin(ctx, {\n begin_x: begin_x - this.options.extend_left,\n end_x: end_x + this.options.extend_right,\n y: y + this.options.y_shift,\n height: this.height,\n reverse: this.decrescendo,\n });\n }\n}\nCrescendo.DEBUG = false;\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n//\n// This class implements curves (for slurs)\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport var CurvePosition;\n(function (CurvePosition) {\n CurvePosition[CurvePosition[\"NEAR_HEAD\"] = 1] = \"NEAR_HEAD\";\n CurvePosition[CurvePosition[\"NEAR_TOP\"] = 2] = \"NEAR_TOP\";\n})(CurvePosition || (CurvePosition = {}));\nexport class Curve extends Element {\n // from: Start note\n // to: End note\n // options:\n // cps: List of control points\n // x_shift: pixels to shift\n // y_shift: pixels to shift\n constructor(from, to, options) {\n super();\n this.render_options = Object.assign({ thickness: 2, x_shift: 0, y_shift: 10, position: CurvePosition.NEAR_HEAD, position_end: CurvePosition.NEAR_HEAD, invert: false, cps: [\n { x: 0, y: 10 },\n { x: 0, y: 10 },\n ] }, options);\n this.from = from;\n this.to = to;\n }\n static get CATEGORY() {\n return Category.Curve;\n }\n static get Position() {\n return CurvePosition;\n }\n static get PositionString() {\n return {\n nearHead: CurvePosition.NEAR_HEAD,\n nearTop: CurvePosition.NEAR_TOP,\n };\n }\n setNotes(from, to) {\n if (!from && !to) {\n throw new RuntimeError('BadArguments', 'Curve needs to have either `from` or `to` set.');\n }\n this.from = from;\n this.to = to;\n return this;\n }\n /**\n * @return {boolean} Returns true if this is a partial bar.\n */\n isPartial() {\n return !this.from || !this.to;\n }\n renderCurve(params) {\n const ctx = this.checkContext();\n const x_shift = this.render_options.x_shift;\n const y_shift = this.render_options.y_shift * params.direction;\n const first_x = params.first_x + x_shift;\n const first_y = params.first_y + y_shift;\n const last_x = params.last_x - x_shift;\n const last_y = params.last_y + y_shift;\n const thickness = this.render_options.thickness;\n const cps = this.render_options.cps;\n const { x: cp0x, y: cp0y } = cps[0];\n const { x: cp1x, y: cp1y } = cps[1];\n const cp_spacing = (last_x - first_x) / (cps.length + 2);\n ctx.beginPath();\n ctx.moveTo(first_x, first_y);\n ctx.bezierCurveTo(first_x + cp_spacing + cp0x, first_y + cp0y * params.direction, last_x - cp_spacing + cp1x, last_y + cp1y * params.direction, last_x, last_y);\n ctx.bezierCurveTo(last_x - cp_spacing + cp1x, last_y + (cp1y + thickness) * params.direction, first_x + cp_spacing + cp0x, first_y + (cp0y + thickness) * params.direction, first_x, first_y);\n ctx.stroke();\n ctx.closePath();\n ctx.fill();\n }\n draw() {\n this.checkContext();\n this.setRendered();\n const first_note = this.from;\n const last_note = this.to;\n let first_x;\n let last_x;\n let first_y;\n let last_y;\n let stem_direction = 0;\n let metric = 'baseY';\n let end_metric = 'baseY';\n function getPosition(position) {\n return typeof position === 'string' ? Curve.PositionString[position] : position;\n }\n const position = getPosition(this.render_options.position);\n const position_end = getPosition(this.render_options.position_end);\n if (position === CurvePosition.NEAR_TOP) {\n metric = 'topY';\n end_metric = 'topY';\n }\n if (position_end === CurvePosition.NEAR_HEAD) {\n end_metric = 'baseY';\n }\n else if (position_end === CurvePosition.NEAR_TOP) {\n end_metric = 'topY';\n }\n if (first_note) {\n first_x = first_note.getTieRightX();\n stem_direction = first_note.getStemDirection();\n first_y = first_note.getStemExtents()[metric];\n }\n else {\n const stave = last_note.checkStave();\n first_x = stave.getTieStartX();\n first_y = last_note.getStemExtents()[metric];\n }\n if (last_note) {\n last_x = last_note.getTieLeftX();\n stem_direction = last_note.getStemDirection();\n last_y = last_note.getStemExtents()[end_metric];\n }\n else {\n const stave = first_note.checkStave();\n last_x = stave.getTieEndX();\n last_y = first_note.getStemExtents()[end_metric];\n }\n this.renderCurve({\n first_x,\n last_x,\n first_y,\n last_y,\n direction: stem_direction * (this.render_options.invert === true ? -1 : 1),\n });\n return true;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// A generic text parsing class for VexFlow.\nimport { log, RuntimeError } from './util';\n// To enable logging for this class. Set `Vex.Flow.Parser.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (Parser.DEBUG)\n log('Vex.Flow.Parser', args);\n}\nconst NO_ERROR_POS = -1;\n// Converts parser results into an easy to reference list that can be\n// used in triggers. This function returns:\n// - nested array in which the leaf elements are string or null\n// - string (including empty strings)\n// - null\nfunction flattenMatches(r) {\n if ('matchedString' in r)\n return r.matchedString; // string\n if ('results' in r)\n return flattenMatches(r.results);\n const results = r;\n if (results.length === 1)\n return flattenMatches(results[0]);\n if (results.length === 0)\n return null;\n return results.map(flattenMatches); // nested array\n}\n// This is the base parser class. Given an arbitrary context-free grammar, it\n// can parse any line and execute code when specific rules are met (e.g.,\n// when a string is terminated.)\nexport class Parser {\n // For an example of a simple grammar, take a look at tests/parser_tests.ts or\n // the EasyScore grammar in easyscore.ts.\n constructor(grammar) {\n this.grammar = grammar;\n this.line = '';\n this.pos = 0;\n this.errorPos = NO_ERROR_POS;\n }\n // Parse `line` using current grammar. Returns `{success: true}` if the\n // line parsed correctly, otherwise returns `{success: false, errorPos: N}`\n // where `errorPos` is the location of the error in the string.\n parse(line) {\n this.line = line;\n this.pos = 0;\n this.errorPos = NO_ERROR_POS;\n const result = this.expect(this.grammar.begin());\n result.errorPos = this.errorPos;\n return result;\n }\n matchFail(returnPos) {\n if (this.errorPos === NO_ERROR_POS)\n this.errorPos = this.pos;\n this.pos = returnPos;\n }\n matchSuccess() {\n this.errorPos = NO_ERROR_POS;\n }\n // Look for `token` in this.line[this.pos], and return success\n // if one is found. `token` is specified as a regular expression.\n matchToken(token, noSpace = false) {\n const regexp = noSpace ? new RegExp('^((' + token + '))') : new RegExp('^((' + token + ')\\\\s*)');\n const workingLine = this.line.slice(this.pos);\n const result = workingLine.match(regexp);\n if (result !== null) {\n return {\n success: true,\n matchedString: result[2],\n incrementPos: result[1].length,\n pos: this.pos,\n };\n }\n else {\n return { success: false, pos: this.pos };\n }\n }\n // Execute rule to match a sequence of tokens (or rules). If `maybe` is\n // set, then return success even if the token is not found, but reset\n // the position before exiting.\n // TODO: expectOne(...) is never called with the `maybe` parameter.\n expectOne(rule, maybe = false) {\n const results = [];\n const pos = this.pos;\n let allMatches = true;\n let oneMatch = false;\n maybe = maybe === true || rule.maybe === true;\n // Execute all sub rules in sequence.\n if (rule.expect) {\n for (const next of rule.expect) {\n const localPos = this.pos;\n const result = this.expect(next);\n // If `rule.or` is set, then return success if any one\n // of the subrules match, else all subrules must match.\n if (result.success) {\n results.push(result);\n oneMatch = true;\n if (rule.or)\n break;\n }\n else {\n allMatches = false;\n if (!rule.or) {\n this.pos = localPos;\n break;\n }\n }\n }\n }\n const gotOne = (rule.or && oneMatch) || allMatches;\n const success = gotOne || maybe === true;\n const numMatches = gotOne ? 1 : 0;\n if (maybe && !gotOne)\n this.pos = pos;\n if (success) {\n this.matchSuccess();\n }\n else {\n this.matchFail(pos);\n }\n return { success, results, numMatches };\n }\n // Try to match multiple (one or more) instances of the rule. If `maybe` is set,\n // then a failed match is also a success (but the position is reset).\n expectOneOrMore(rule, maybe = false) {\n const results = [];\n const pos = this.pos;\n let numMatches = 0;\n let more = true;\n do {\n const result = this.expectOne(rule);\n if (result.success && result.results) {\n numMatches++;\n results.push(result.results);\n }\n else {\n more = false;\n }\n } while (more);\n const success = numMatches > 0 || maybe === true;\n if (maybe && !(numMatches > 0))\n this.pos = pos;\n if (success) {\n this.matchSuccess();\n }\n else {\n this.matchFail(pos);\n }\n return { success, results, numMatches };\n }\n // Match zero or more instances of `rule`. Offloads to `expectOneOrMore`.\n expectZeroOrMore(rule) {\n return this.expectOneOrMore(rule, true);\n }\n // Execute the rule produced by the provided `rules` function. This\n // offloads to one of the above matchers and consolidates the results. It is also\n // responsible for executing any code triggered by the rule (in `rule.run`.)\n expect(ruleFunc) {\n L('Evaluating rule function:', ruleFunc);\n if (!ruleFunc) {\n throw new RuntimeError('Invalid rule function');\n }\n let result;\n // Get rule from Grammar class.\n // expect(...) handles both lexing & parsing:\n // - lexer rules produce tokens.\n // - parser rules produce expressions which may trigger code via the\n // { run: () => ... } trigger functions in easyscore.ts.\n // These functions build the VexFlow objects that are displayed on screen.\n const rule = ruleFunc.bind(this.grammar)();\n if (rule.token) {\n // A lexer rule has a `token` property.\n // Base case: parse the regex and throw an error if the\n // line doesn't match.\n result = this.matchToken(rule.token, rule.noSpace === true);\n if (result.success) {\n // Token match! Update position and throw away parsed portion\n // of string.\n this.pos += result.incrementPos;\n }\n }\n else if (rule.expect) {\n // A parser rule has an `expect` property.\n if (rule.oneOrMore) {\n result = this.expectOneOrMore(rule);\n }\n else if (rule.zeroOrMore) {\n result = this.expectZeroOrMore(rule);\n }\n else {\n result = this.expectOne(rule);\n }\n }\n else {\n L(rule);\n throw new RuntimeError('Bad grammar! No `token` or `expect` property ' + rule);\n }\n // If there's a trigger attached to this rule, then run it.\n // Make the matches accessible through `state.matches` in the\n // `run: (state) => ...` trigger.\n const matches = [];\n result.matches = matches;\n if (result.results) {\n result.results.forEach((r) => matches.push(flattenMatches(r)));\n }\n if (rule.run && result.success) {\n rule.run({ matches });\n }\n return result;\n }\n}\nParser.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Articulation } from './articulation';\nimport { Dot } from './dot';\nimport { FretHandFinger } from './frethandfinger';\nimport { Music } from './music';\nimport { Parser } from './parser';\nimport { Stem } from './stem';\nimport { defined, log, RuntimeError } from './util';\n// To enable logging for this class. Set `Vex.Flow.EasyScore.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (EasyScore.DEBUG)\n log('Vex.Flow.EasyScore', args);\n}\nexport class EasyScoreGrammar {\n constructor(builder) {\n this.builder = builder;\n }\n begin() {\n return this.LINE;\n }\n LINE() {\n return {\n expect: [this.PIECE, this.PIECES, this.EOL],\n };\n }\n PIECE() {\n return {\n expect: [this.CHORDORNOTE, this.PARAMS],\n run: () => this.builder.commitPiece(),\n };\n }\n PIECES() {\n return {\n expect: [this.COMMA, this.PIECE],\n zeroOrMore: true,\n };\n }\n PARAMS() {\n return {\n expect: [this.DURATION, this.TYPE, this.DOTS, this.OPTS],\n };\n }\n CHORDORNOTE() {\n return {\n expect: [this.CHORD, this.SINGLENOTE],\n or: true,\n };\n }\n CHORD() {\n return {\n expect: [this.LPAREN, this.NOTES, this.RPAREN],\n // eslint-disable-next-line\n run: (state) => this.builder.addChord(state.matches[1]),\n };\n }\n NOTES() {\n return {\n expect: [this.NOTE],\n oneOrMore: true,\n };\n }\n NOTE() {\n return {\n expect: [this.NOTENAME, this.ACCIDENTAL, this.OCTAVE],\n };\n }\n SINGLENOTE() {\n return {\n expect: [this.NOTENAME, this.ACCIDENTAL, this.OCTAVE],\n run: (state) => {\n // eslint-disable-next-line\n const s = state;\n this.builder.addSingleNote(s.matches[0], s.matches[1], s.matches[2]);\n },\n };\n }\n ACCIDENTAL() {\n return {\n expect: [this.MICROTONES, this.ACCIDENTALS],\n maybe: true,\n or: true,\n };\n }\n DOTS() {\n return {\n expect: [this.DOT],\n zeroOrMore: true,\n // eslint-disable-next-line\n run: (state) => this.builder.setNoteDots(state.matches),\n };\n }\n TYPE() {\n return {\n expect: [this.SLASH, this.MAYBESLASH, this.TYPES],\n maybe: true,\n // eslint-disable-next-line\n run: (state) => this.builder.setNoteType(state.matches[2]),\n };\n }\n DURATION() {\n return {\n expect: [this.SLASH, this.DURATIONS],\n maybe: true,\n // eslint-disable-next-line\n run: (state) => this.builder.setNoteDuration(state.matches[1]),\n };\n }\n OPTS() {\n return {\n expect: [this.LBRACKET, this.KEYVAL, this.KEYVALS, this.RBRACKET],\n maybe: true,\n };\n }\n KEYVALS() {\n return {\n expect: [this.COMMA, this.KEYVAL],\n zeroOrMore: true,\n };\n }\n KEYVAL() {\n const unquote = (str) => str.slice(1, -1);\n return {\n expect: [this.KEY, this.EQUALS, this.VAL],\n // eslint-disable-next-line\n run: (state) => this.builder.addNoteOption(state.matches[0], unquote(state.matches[2])),\n };\n }\n VAL() {\n return {\n expect: [this.SVAL, this.DVAL],\n or: true,\n };\n }\n KEY() {\n return { token: '[a-zA-Z][a-zA-Z0-9]*' };\n }\n DVAL() {\n return { token: '[\"][^\"]*[\"]' };\n }\n SVAL() {\n return { token: \"['][^']*[']\" };\n }\n NOTENAME() {\n return { token: '[a-gA-G]' };\n }\n OCTAVE() {\n return { token: '[0-9]+' };\n }\n ACCIDENTALS() {\n return { token: 'bb|b|##|#|n' };\n }\n MICROTONES() {\n return { token: 'bbs|bss|bs|db|d|\\\\+\\\\+-|\\\\+-|\\\\+\\\\+|\\\\+|k|o' };\n }\n DURATIONS() {\n return { token: '[0-9whq]+' };\n }\n TYPES() {\n return { token: '[rRsSmMhHgG]' };\n }\n LPAREN() {\n return { token: '[(]' };\n }\n RPAREN() {\n return { token: '[)]' };\n }\n COMMA() {\n return { token: '[,]' };\n }\n DOT() {\n return { token: '[.]' };\n }\n SLASH() {\n return { token: '[/]' };\n }\n MAYBESLASH() {\n return { token: '[/]?' };\n }\n EQUALS() {\n return { token: '[=]' };\n }\n LBRACKET() {\n return { token: '\\\\[' };\n }\n RBRACKET() {\n return { token: '\\\\]' };\n }\n EOL() {\n return { token: '$' };\n }\n}\nexport class Piece {\n constructor(duration) {\n this.chord = [];\n this.dots = 0;\n this.options = {};\n this.duration = duration;\n }\n}\nexport class Builder {\n constructor(factory) {\n this.commitHooks = [];\n this.factory = factory;\n this.reset();\n }\n reset(options) {\n this.options = Object.assign({ stem: 'auto', clef: 'treble' }, options);\n this.elements = { notes: [], accidentals: [] };\n this.rollingDuration = '8';\n this.resetPiece();\n }\n getFactory() {\n return this.factory;\n }\n getElements() {\n return this.elements;\n }\n addCommitHook(commitHook) {\n this.commitHooks.push(commitHook);\n }\n resetPiece() {\n L('resetPiece');\n this.piece = new Piece(this.rollingDuration);\n }\n setNoteDots(dots) {\n L('setNoteDots:', dots);\n if (dots)\n this.piece.dots = dots.length;\n }\n setNoteDuration(duration) {\n L('setNoteDuration:', duration);\n this.rollingDuration = this.piece.duration = duration || this.rollingDuration;\n }\n setNoteType(type) {\n L('setNoteType:', type);\n if (type)\n this.piece.type = type;\n }\n addNoteOption(key, value) {\n L('addNoteOption: key:', key, 'value:', value);\n this.piece.options[key] = value;\n }\n addNote(key, accid, octave) {\n L('addNote:', key, accid, octave);\n this.piece.chord.push({\n key: key,\n accid,\n octave,\n });\n }\n addSingleNote(key, accid, octave) {\n L('addSingleNote:', key, accid, octave);\n this.addNote(key, accid, octave);\n }\n // notes is an array with 3 entries\n addChord(notes) {\n L('startChord');\n if (typeof notes[0] !== 'object') {\n this.addSingleNote(notes[0]);\n }\n else {\n notes.forEach((n) => {\n if (n)\n this.addNote(...n); // n => [string, string | null, string]\n });\n }\n L('endChord');\n }\n commitPiece() {\n L('commitPiece');\n const { factory } = this;\n if (!factory)\n return;\n const options = Object.assign(Object.assign({}, this.options), this.piece.options);\n // reset() sets this.options.stem & this.options.clef but we check to make sure nothing has changed.\n // e.g., auto | up | down\n const stem = defined(options.stem, 'BadArguments', 'options.stem is not defined').toLowerCase();\n // e.g., treble | bass\n const clef = defined(options.clef, 'BadArguments', 'options.clef is not defined').toLowerCase();\n const { chord, duration, dots, type } = this.piece;\n // Create a string[] that will be assigned to the .keys property of the StaveNote.\n // Each string in the array represents a note pitch and is of the form: {NoteName}{Accidental}/{Octave}\n // Only standard accidentals are included in the .keys property. Microtonal accidentals are not included.\n const standardAccidentals = Music.accidentals;\n const keys = chord.map((notePiece) => {\n var _a;\n return notePiece.key +\n (standardAccidentals.includes((_a = notePiece.accid) !== null && _a !== void 0 ? _a : '') ? notePiece.accid : '') +\n '/' +\n notePiece.octave;\n });\n const auto_stem = stem === 'auto'; // StaveNoteStruct expects the underscore & lowercase.\n // Build a GhostNote or StaveNote using the information we gathered.\n const note = (type === null || type === void 0 ? void 0 : type.toLowerCase()) == 'g'\n ? factory.GhostNote({ duration, dots })\n : factory.StaveNote({ keys, duration, dots, type, clef, auto_stem });\n if (!auto_stem)\n note.setStemDirection(stem === 'up' ? Stem.UP : Stem.DOWN);\n // Attach accidentals.\n const accidentals = [];\n chord.forEach((notePiece, index) => {\n const accid = notePiece.accid;\n if (typeof accid === 'string') {\n const accidental = factory.Accidental({ type: accid });\n note.addModifier(accidental, index);\n accidentals.push(accidental);\n }\n else {\n accidentals.push(undefined);\n }\n });\n // Attach dots.\n for (let i = 0; i < dots; i++)\n Dot.buildAndAttach([note], { all: true });\n this.commitHooks.forEach((commitHook) => commitHook(options, note, this));\n this.elements.notes.push(note);\n this.elements.accidentals.push(accidentals);\n this.resetPiece();\n }\n}\n/**\n * Commit hook used by EasyScore.setOptions().\n */\nfunction setId(options, note) {\n if (options.id === undefined)\n return;\n note.setAttribute('id', options.id);\n}\n// Used by setClass() below.\nconst commaSeparatedRegex = /\\s*,\\s*/;\n/**\n * Commit hook used by EasyScore.setOptions().\n */\nfunction setClass(options, note) {\n if (options.class === undefined)\n return;\n options.class.split(commaSeparatedRegex).forEach((className) => note.addClass(className));\n}\n/**\n * EasyScore implements a parser for a simple language to generate VexFlow objects.\n */\nexport class EasyScore {\n constructor(options = {}) {\n this.defaults = {\n clef: 'treble',\n time: '4/4',\n stem: 'auto',\n };\n this.setOptions(options);\n }\n /**\n * Set the score defaults.\n * clef must be set appropriately to avoid errors when adding Staves.\n * @param defaults.clef default clef ( treble | bass ...) see {@link Clef.types}\n * @param defaults.time default time signature ( 4/4 | 9/8 ...)\n * @param defaults.stem default stem arrangement (auto | up | down)\n * @returns this\n */\n set(defaults) {\n this.defaults = Object.assign(Object.assign({}, this.defaults), defaults);\n return this;\n }\n /**\n * @param options.factory is required.\n * @returns this\n */\n setOptions(options) {\n var _a, _b;\n // eslint-disable-next-line\n const factory = options.factory; // ! operator, because options.factory was set in Factory.EasyScore().\n const builder = (_a = options.builder) !== null && _a !== void 0 ? _a : new Builder(factory);\n this.options = Object.assign(Object.assign({ commitHooks: [setId, setClass, Articulation.easyScoreHook, FretHandFinger.easyScoreHook], throwOnError: false }, options), { factory,\n builder });\n this.factory = factory;\n this.builder = builder;\n this.grammar = new EasyScoreGrammar(this.builder);\n this.parser = new Parser(this.grammar);\n (_b = this.options.commitHooks) === null || _b === void 0 ? void 0 : _b.forEach((commitHook) => this.addCommitHook(commitHook));\n return this;\n }\n setContext(context) {\n this.factory.setContext(context);\n return this;\n }\n parse(line, options = {}) {\n this.builder.reset(options);\n const result = this.parser.parse(line);\n if (!result.success && this.options.throwOnError) {\n L(result);\n throw new RuntimeError('Error parsing line: ' + line);\n }\n return result;\n }\n beam(notes, options) {\n this.factory.Beam({ notes, options });\n return notes;\n }\n tuplet(notes, options) {\n this.factory.Tuplet({ notes, options });\n return notes;\n }\n notes(line, options = {}) {\n options = Object.assign({ clef: this.defaults.clef, stem: this.defaults.stem }, options);\n this.parse(line, options);\n return this.builder.getElements().notes;\n }\n voice(notes, options = {}) {\n options = Object.assign({ time: this.defaults.time }, options);\n return this.factory.Voice(options).addTickables(notes);\n }\n addCommitHook(commitHook) {\n this.builder.addCommitHook(commitHook);\n }\n}\nEasyScore.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\nimport { StemmableNote } from './stemmablenote';\nimport { Category, isAnnotation } from './typeguard';\nimport { RuntimeError } from './util';\nconst ERROR_MSG = 'Ghost note must have valid initialization data to identify duration.';\nexport class GhostNote extends StemmableNote {\n static get CATEGORY() {\n return Category.GhostNote;\n }\n constructor(parameter) {\n if (!parameter) {\n throw new RuntimeError('BadArguments', ERROR_MSG);\n }\n let noteStruct;\n if (typeof parameter === 'string') {\n // Preserve backwards-compatibility\n noteStruct = { duration: parameter };\n }\n else if (typeof parameter === 'object') {\n noteStruct = parameter;\n }\n else {\n throw new RuntimeError('BadArguments', ERROR_MSG);\n }\n super(noteStruct);\n // Note properties\n this.setWidth(0);\n }\n /**\n * @returns true if this note is a type of rest. Rests don't have pitches, but take up space in the score.\n */\n isRest() {\n return true;\n }\n setStave(stave) {\n super.setStave(stave);\n return this;\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n draw() {\n // Draw Annotations\n this.setRendered();\n for (let i = 0; i < this.modifiers.length; ++i) {\n const modifier = this.modifiers[i];\n if (isAnnotation(modifier)) {\n modifier.setContext(this.getContext());\n modifier.drawWithStyle();\n }\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { Note } from './note';\nimport { Category } from './typeguard';\nexport class GlyphNote extends Note {\n constructor(glyph, noteStruct, options) {\n super(noteStruct);\n this.options = Object.assign({ ignoreTicks: false, line: 2 }, options);\n // Note properties\n this.ignore_ticks = this.options.ignoreTicks;\n if (glyph) {\n this.setGlyph(glyph);\n }\n }\n static get CATEGORY() {\n return Category.GlyphNote;\n }\n setGlyph(glyph) {\n this.glyph = glyph;\n this.setWidth(this.glyph.getMetrics().width);\n return this;\n }\n getBoundingBox() {\n return this.glyph.getBoundingBox();\n }\n preFormat() {\n if (!this.preFormatted && this.modifierContext) {\n this.modifierContext.preFormat();\n }\n this.preFormatted = true;\n return this;\n }\n drawModifiers() {\n const ctx = this.checkContext();\n ctx.openGroup('modifiers');\n for (let i = 0; i < this.modifiers.length; i++) {\n const modifier = this.modifiers[i];\n modifier.setContext(ctx);\n modifier.drawWithStyle();\n }\n ctx.closeGroup();\n }\n draw() {\n const stave = this.checkStave();\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.openGroup('glyphNote', this.getAttribute('id'));\n // Context is set when setStave is called on Note\n const glyph = this.glyph;\n if (!glyph.getContext()) {\n glyph.setContext(ctx);\n }\n glyph.setStave(stave);\n glyph.setYShift(stave.getYForLine(this.options.line) - stave.getYForGlyphs());\n const x = this.isCenterAligned() ? this.getAbsoluteX() - this.getWidth() / 2 : this.getAbsoluteX();\n glyph.renderToStave(x);\n this.drawModifiers();\n ctx.closeGroup();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { StaveNote } from './stavenote';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class GraceNote extends StaveNote {\n constructor(noteStruct) {\n super(Object.assign({ glyph_font_scale: Tables.NOTATION_FONT_SCALE * GraceNote.SCALE, stroke_px: GraceNote.LEDGER_LINE_OFFSET }, noteStruct));\n this.slash = noteStruct.slash || false;\n this.slur = true;\n this.buildNoteHeads();\n this.width = 3;\n }\n static get CATEGORY() {\n return Category.GraceNote;\n }\n static get LEDGER_LINE_OFFSET() {\n return 2;\n }\n static get SCALE() {\n return 0.66;\n }\n getStemExtension() {\n if (this.stem_extension_override) {\n return this.stem_extension_override;\n }\n const glyph = this.getGlyph();\n if (glyph) {\n let ret = super.getStemExtension();\n if (glyph.stem) {\n const staveNoteScale = this.getStaveNoteScale();\n ret = (Stem.HEIGHT + ret) * staveNoteScale - Stem.HEIGHT;\n }\n return ret;\n }\n return 0;\n }\n // FIXME: move this to more basic class.\n getStaveNoteScale() {\n return this.render_options.glyph_font_scale / Tables.NOTATION_FONT_SCALE;\n }\n draw() {\n super.draw();\n this.setRendered();\n const stem = this.stem;\n if (this.slash && stem) {\n const staveNoteScale = this.getStaveNoteScale();\n // some magic numbers are based on the staveNoteScale 0.66.\n const offsetScale = staveNoteScale / 0.66;\n let slashBBox = undefined;\n const beam = this.beam;\n if (beam) {\n // FIXME: should render slash after beam?\n if (!beam.postFormatted) {\n beam.postFormat();\n }\n slashBBox = this.calcBeamedNotesSlashBBox(8 * offsetScale, 8 * offsetScale, {\n stem: 6 * offsetScale,\n beam: 5 * offsetScale,\n });\n }\n else {\n const stem_direction = this.getStemDirection();\n const noteHeadBounds = this.getNoteHeadBounds();\n const noteStemHeight = stem.getHeight();\n let x = this.getAbsoluteX();\n let y = stem_direction === Stem.DOWN\n ? noteHeadBounds.y_top - noteStemHeight\n : noteHeadBounds.y_bottom - noteStemHeight;\n let defaultOffsetY = Tables.STEM_HEIGHT;\n defaultOffsetY -= defaultOffsetY / 2.8;\n y += defaultOffsetY * staveNoteScale * stem_direction;\n const offsets = stem_direction === Stem.UP\n ? {\n x1: 1,\n y1: 0,\n x2: 13,\n y2: -9,\n }\n : {\n x1: -4,\n y1: 1,\n x2: 13,\n y2: 9,\n };\n x += offsets.x1 * offsetScale;\n y += offsets.y1 * offsetScale;\n slashBBox = {\n x1: x,\n y1: y,\n x2: x + offsets.x2 * offsetScale,\n y2: y + offsets.y2 * offsetScale,\n };\n }\n // FIXME: avoid staff lines, ledger lines or others.\n const ctx = this.checkContext();\n ctx.save();\n ctx.setLineWidth(1 * offsetScale); // FIXME: use more appropriate value.\n ctx.beginPath();\n ctx.moveTo(slashBBox.x1, slashBBox.y1);\n ctx.lineTo(slashBBox.x2, slashBBox.y2);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n }\n }\n calcBeamedNotesSlashBBox(slashStemOffset, slashBeamOffset, protrusions) {\n const beam = this.beam;\n if (!beam)\n throw new RuntimeError('NoBeam', \"Can't calculate without a beam.\");\n const beam_slope = beam.slope;\n const isBeamEndNote = beam.notes[beam.notes.length - 1] === this;\n const scaleX = isBeamEndNote ? -1 : 1;\n const beam_angle = Math.atan(beam_slope * scaleX);\n // slash line intersecting point on beam.\n const iPointOnBeam = {\n dx: Math.cos(beam_angle) * slashBeamOffset,\n dy: Math.sin(beam_angle) * slashBeamOffset,\n };\n slashStemOffset *= this.getStemDirection();\n const slash_angle = Math.atan((iPointOnBeam.dy - slashStemOffset) / iPointOnBeam.dx);\n const protrusion_stem_dx = Math.cos(slash_angle) * protrusions.stem * scaleX;\n const protrusion_stem_dy = Math.sin(slash_angle) * protrusions.stem;\n const protrusion_beam_dx = Math.cos(slash_angle) * protrusions.beam * scaleX;\n const protrusion_beam_dy = Math.sin(slash_angle) * protrusions.beam;\n const stemX = this.getStemX();\n const stem0X = beam.notes[0].getStemX();\n const stemY = beam.getBeamYToDraw() + (stemX - stem0X) * beam_slope;\n const ret = {\n x1: stemX - protrusion_stem_dx,\n y1: stemY + slashStemOffset - protrusion_stem_dy,\n x2: stemX + iPointOnBeam.dx * scaleX + protrusion_beam_dx,\n y2: stemY + iPointOnBeam.dy + protrusion_beam_dy,\n };\n return ret;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Mark Meeus 2019\nimport { KeySignature } from './keysignature';\nimport { Note } from './note';\nimport { Category } from './typeguard';\nexport class KeySigNote extends Note {\n constructor(keySpec, cancelKeySpec, alterKeySpec) {\n super({ duration: 'b' });\n this.keySignature = new KeySignature(keySpec, cancelKeySpec, alterKeySpec);\n // Note properties\n this.ignore_ticks = true;\n }\n static get CATEGORY() {\n return Category.KeySigNote;\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n preFormat() {\n this.preFormatted = true;\n this.keySignature.setStave(this.checkStave());\n this.setWidth(this.keySignature.getWidth());\n return this;\n }\n draw() {\n const ctx = this.checkStave().checkContext();\n this.setRendered();\n this.keySignature.setX(this.getAbsoluteX());\n this.keySignature.setContext(ctx);\n this.keySignature.draw();\n }\n}\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n//\n// This class implements multiple measure rests.\nimport { Element } from './element';\nimport { Glyph } from './glyph';\nimport { NoteHead } from './notehead';\nimport { StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { TimeSignature } from './timesignature';\nimport { Category, isBarline } from './typeguard';\nimport { defined } from './util';\nlet semibreve_rest;\nfunction get_semibreve_rest() {\n if (!semibreve_rest) {\n const noteHead = new NoteHead({ duration: 'w', note_type: 'r' });\n semibreve_rest = {\n glyph_font_scale: noteHead.render_options.glyph_font_scale,\n glyph_code: noteHead.glyph_code,\n width: noteHead.getWidth(),\n };\n }\n return semibreve_rest;\n}\nexport class MultiMeasureRest extends Element {\n /**\n *\n * @param number_of_measures Number of measures.\n * @param options The options object.\n */\n constructor(number_of_measures, options) {\n super();\n this.xs = { left: NaN, right: NaN };\n this.hasPaddingLeft = false;\n this.hasPaddingRight = false;\n this.hasLineThickness = false;\n this.hasSymbolSpacing = false;\n this.number_of_measures = number_of_measures;\n // Keep track of whether these four options were provided.\n this.hasPaddingLeft = typeof options.padding_left === 'number';\n this.hasPaddingRight = typeof options.padding_right === 'number';\n this.hasLineThickness = typeof options.line_thickness === 'number';\n this.hasSymbolSpacing = typeof options.symbol_spacing === 'number';\n const musicFont = Tables.currentMusicFont();\n this.render_options = Object.assign({ use_symbols: false, show_number: true, number_line: -0.5, number_glyph_point: musicFont.lookupMetric('digits.point'), line: 2, spacing_between_lines_px: Tables.STAVE_LINE_DISTANCE, serif_thickness: 2, semibreve_rest_glyph_scale: Tables.NOTATION_FONT_SCALE, padding_left: 0, padding_right: 0, line_thickness: 5, symbol_spacing: 0 }, options);\n const fontLineShift = musicFont.lookupMetric('digits.shiftLine', 0);\n this.render_options.number_line += fontLineShift;\n }\n static get CATEGORY() {\n return Category.MultiMeasureRest;\n }\n getXs() {\n return this.xs;\n }\n setStave(stave) {\n this.stave = stave;\n return this;\n }\n getStave() {\n return this.stave;\n }\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n drawLine(stave, ctx, left, right, spacingBetweenLines) {\n const options = this.render_options;\n const y = stave.getYForLine(options.line);\n const padding = (right - left) * 0.1;\n left += padding;\n right -= padding;\n let lineThicknessHalf;\n if (this.hasLineThickness) {\n lineThicknessHalf = options.line_thickness * 0.5;\n }\n else {\n lineThicknessHalf = spacingBetweenLines * 0.25;\n }\n const serifThickness = options.serif_thickness;\n const top = y - spacingBetweenLines;\n const bot = y + spacingBetweenLines;\n const leftIndented = left + serifThickness;\n const rightIndented = right - serifThickness;\n const lineTop = y - lineThicknessHalf;\n const lineBottom = y + lineThicknessHalf;\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(left, top);\n ctx.lineTo(leftIndented, top);\n ctx.lineTo(leftIndented, lineTop);\n ctx.lineTo(rightIndented, lineTop);\n ctx.lineTo(rightIndented, top);\n ctx.lineTo(right, top);\n ctx.lineTo(right, bot);\n ctx.lineTo(rightIndented, bot);\n ctx.lineTo(rightIndented, lineBottom);\n ctx.lineTo(leftIndented, lineBottom);\n ctx.lineTo(leftIndented, bot);\n ctx.lineTo(left, bot);\n ctx.closePath();\n ctx.fill();\n }\n drawSymbols(stave, ctx, left, right, spacingBetweenLines) {\n const n4 = Math.floor(this.number_of_measures / 4);\n const n = this.number_of_measures % 4;\n const n2 = Math.floor(n / 2);\n const n1 = n % 2;\n const options = this.render_options;\n // FIXME: TODO: invalidate semibreve_rest at the appropriate time\n // (e.g., if the system font settings are changed).\n semibreve_rest = undefined;\n const rest = get_semibreve_rest();\n const rest_scale = options.semibreve_rest_glyph_scale;\n const rest_width = rest.width * (rest_scale / rest.glyph_font_scale);\n const glyphs = {\n 2: {\n width: rest_width * 0.5,\n height: spacingBetweenLines,\n },\n 1: {\n width: rest_width,\n },\n };\n /* 10: normal spacingBetweenLines */\n const spacing = this.hasSymbolSpacing ? options.symbol_spacing : 10;\n const width = n4 * glyphs[2].width + n2 * glyphs[2].width + n1 * glyphs[1].width + (n4 + n2 + n1 - 1) * spacing;\n let x = left + (right - left) * 0.5 - width * 0.5;\n const line = options.line;\n const yTop = stave.getYForLine(line - 1);\n const yMiddle = stave.getYForLine(line);\n const yBottom = stave.getYForLine(line + 1);\n ctx.save();\n ctx.setStrokeStyle('none');\n ctx.setLineWidth(0);\n for (let i = 0; i < n4; ++i) {\n ctx.fillRect(x, yMiddle - glyphs[2].height, glyphs[2].width, glyphs[2].height);\n ctx.fillRect(x, yBottom - glyphs[2].height, glyphs[2].width, glyphs[2].height);\n x += glyphs[2].width + spacing;\n }\n for (let i = 0; i < n2; ++i) {\n ctx.fillRect(x, yMiddle - glyphs[2].height, glyphs[2].width, glyphs[2].height);\n x += glyphs[2].width + spacing;\n }\n for (let i = 0; i < n1; ++i) {\n Glyph.renderGlyph(ctx, x, yTop, rest_scale, rest.glyph_code);\n x += glyphs[1].width + spacing;\n }\n ctx.restore();\n }\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n const stave = this.checkStave();\n let left = stave.getNoteStartX();\n let right = stave.getNoteEndX();\n // FIXME: getNoteStartX() returns x + 5(barline width)\n // getNoteEndX() returns x + width(no barline width)\n // See Stave constructor. How do we fix this?\n // Here, we subtract the barline width.\n const begModifiers = stave.getModifiers(StaveModifierPosition.BEGIN);\n if (begModifiers.length === 1 && isBarline(begModifiers[0])) {\n left -= begModifiers[0].getWidth();\n }\n const options = this.render_options;\n if (this.hasPaddingLeft) {\n left = stave.getX() + options.padding_left;\n }\n if (this.hasPaddingRight) {\n right = stave.getX() + stave.getWidth() - options.padding_right;\n }\n this.xs.left = left;\n this.xs.right = right;\n const spacingBetweenLines = options.spacing_between_lines_px;\n if (options.use_symbols) {\n this.drawSymbols(stave, ctx, left, right, spacingBetweenLines);\n }\n else {\n this.drawLine(stave, ctx, left, right, spacingBetweenLines);\n }\n if (options.show_number) {\n const timeSpec = '/' + this.number_of_measures;\n const timeSig = new TimeSignature(timeSpec, 0, false);\n timeSig.point = options.number_glyph_point;\n timeSig.setTimeSig(timeSpec);\n timeSig.setStave(stave);\n timeSig.setX(left + (right - left) * 0.5 - timeSig.getInfo().glyph.getMetrics().width * 0.5);\n timeSig.bottomLine = options.number_line;\n timeSig.setContext(ctx).draw();\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (PedalMarking.DEBUG)\n log('Vex.Flow.PedalMarking', args);\n}\n/**\n * Draws a pedal glyph with the provided `name` on a rendering `context`\n * at the coordinates `x` and `y. Takes into account the glyph data\n * coordinate shifts.\n */\nfunction drawPedalGlyph(name, context, x, y, point) {\n const glyph_data = PedalMarking.GLYPHS[name];\n const glyph = new Glyph(glyph_data.code, point, { category: 'pedalMarking' });\n glyph.render(context, x + glyph_data.x_shift, y + glyph_data.y_shift);\n}\n/**\n * PedalMarking implements different types of pedal markings. These notation\n * elements indicate to the performer when to depress and release the a pedal.\n *\n * In order to create \"Sostenuto\", and \"una corda\" markings, you must set\n * custom text for the release/depress pedal markings.\n */\nexport class PedalMarking extends Element {\n constructor(notes) {\n super();\n this.notes = notes;\n this.type = PedalMarking.type.TEXT;\n this.line = 0;\n // Custom text for the release/depress markings\n this.custom_depress_text = '';\n this.custom_release_text = '';\n this.resetFont();\n this.render_options = {\n bracket_height: 10,\n text_margin_right: 6,\n bracket_line_width: 1,\n color: 'black',\n };\n }\n static get CATEGORY() {\n return Category.PedalMarking;\n }\n /**\n * Create a sustain pedal marking. Returns the defaults PedalMarking.\n * Which uses the traditional \"Ped\" and \"*\"\" markings.\n */\n static createSustain(notes) {\n const pedal = new PedalMarking(notes);\n return pedal;\n }\n /** Create a sostenuto pedal marking */\n static createSostenuto(notes) {\n const pedal = new PedalMarking(notes);\n pedal.setType(PedalMarking.type.MIXED);\n pedal.setCustomText('Sost. Ped.');\n return pedal;\n }\n /** Create an una corda pedal marking */\n static createUnaCorda(notes) {\n const pedal = new PedalMarking(notes);\n pedal.setType(PedalMarking.type.TEXT);\n pedal.setCustomText('una corda', 'tre corda');\n return pedal;\n }\n /** Set pedal type. */\n setType(type) {\n type = typeof type === 'string' ? PedalMarking.typeString[type] : type;\n if (type >= PedalMarking.type.TEXT && type <= PedalMarking.type.MIXED) {\n this.type = type;\n }\n return this;\n }\n /**\n * Set custom text for the `depress`/`release` pedal markings. No text is\n * set if the parameter is falsy.\n */\n setCustomText(depress, release) {\n this.custom_depress_text = depress || '';\n this.custom_release_text = release || '';\n return this;\n }\n /** Set the staff line to render the markings on. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Draw the bracket based pedal markings. */\n drawBracketed() {\n const ctx = this.checkContext();\n let is_pedal_depressed = false;\n let prev_x;\n let prev_y;\n // Iterate through each note\n this.notes.forEach((note, index, notes) => {\n // Each note triggers the opposite pedal action\n is_pedal_depressed = !is_pedal_depressed;\n // Get the initial coordinates for the note\n const x = note.getAbsoluteX();\n const y = note.checkStave().getYForBottomText(this.line + 3);\n // Throw if current note is positioned before the previous note\n if (x < prev_x) {\n throw new RuntimeError('InvalidConfiguration', 'The notes provided must be in order of ascending x positions');\n }\n // Determine if the previous or next note are the same\n // as the current note. We need to keep track of this for\n // when adjustments are made for the release+depress action\n const next_is_same = notes[index + 1] === note;\n const prev_is_same = notes[index - 1] === note;\n let x_shift = 0;\n const point = Tables.currentMusicFont().lookupMetric(`pedalMarking.${is_pedal_depressed ? 'down' : 'up'}.point`);\n if (is_pedal_depressed) {\n // Adjustment for release+depress\n x_shift = prev_is_same ? 5 : 0;\n if (this.type === PedalMarking.type.MIXED && !prev_is_same) {\n // For MIXED style, start with text instead of bracket\n if (this.custom_depress_text) {\n // If we have custom text, use instead of the default \"Ped\" glyph\n const text_width = ctx.measureText(this.custom_depress_text).width;\n ctx.fillText(this.custom_depress_text, x - text_width / 2, y);\n x_shift = text_width / 2 + this.render_options.text_margin_right;\n }\n else {\n // Render the Ped glyph in position\n drawPedalGlyph('pedal_depress', ctx, x, y, point);\n x_shift = 20 + this.render_options.text_margin_right;\n }\n }\n else {\n // Draw start bracket\n ctx.beginPath();\n ctx.moveTo(x, y - this.render_options.bracket_height);\n ctx.lineTo(x + x_shift, y);\n ctx.stroke();\n ctx.closePath();\n }\n }\n else {\n // Adjustment for release+depress\n x_shift = next_is_same ? -5 : 0;\n // Draw end bracket\n ctx.beginPath();\n ctx.moveTo(prev_x, prev_y);\n ctx.lineTo(x + x_shift, y);\n ctx.lineTo(x, y - this.render_options.bracket_height);\n ctx.stroke();\n ctx.closePath();\n }\n // Store previous coordinates\n prev_x = x + x_shift;\n prev_y = y;\n });\n }\n /**\n * Draw the text based pedal markings. This defaults to the traditional\n * \"Ped\" and \"*\"\" symbols if no custom text has been provided.\n */\n drawText() {\n const ctx = this.checkContext();\n let is_pedal_depressed = false;\n // Iterate through each note, placing glyphs or custom text accordingly\n this.notes.forEach((note) => {\n is_pedal_depressed = !is_pedal_depressed;\n const stave = note.checkStave();\n const x = note.getAbsoluteX();\n const y = stave.getYForBottomText(this.line + 3);\n const point = Tables.currentMusicFont().lookupMetric(`pedalMarking.${is_pedal_depressed ? 'down' : 'up'}.point`);\n let text_width = 0;\n if (is_pedal_depressed) {\n if (this.custom_depress_text) {\n text_width = ctx.measureText(this.custom_depress_text).width;\n ctx.fillText(this.custom_depress_text, x - text_width / 2, y);\n }\n else {\n drawPedalGlyph('pedal_depress', ctx, x, y, point);\n }\n }\n else {\n if (this.custom_release_text) {\n text_width = ctx.measureText(this.custom_release_text).width;\n ctx.fillText(this.custom_release_text, x - text_width / 2, y);\n }\n else {\n drawPedalGlyph('pedal_release', ctx, x, y, point);\n }\n }\n });\n }\n /** Render the pedal marking in position on the rendering context. */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n ctx.save();\n ctx.setStrokeStyle(this.render_options.color);\n ctx.setFillStyle(this.render_options.color);\n ctx.setFont(this.textFont);\n L('Rendering Pedal Marking');\n if (this.type === PedalMarking.type.BRACKET || this.type === PedalMarking.type.MIXED) {\n ctx.setLineWidth(this.render_options.bracket_line_width);\n this.drawBracketed();\n }\n else if (this.type === PedalMarking.type.TEXT) {\n this.drawText();\n }\n ctx.restore();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.PedalMarking.DEBUG` to `true`. */\nPedalMarking.DEBUG = false;\nPedalMarking.TEXT_FONT = {\n family: Font.SERIF,\n size: 12,\n weight: FontWeight.BOLD,\n style: FontStyle.ITALIC,\n};\n/** Glyph data */\nPedalMarking.GLYPHS = {\n pedal_depress: {\n code: 'keyboardPedalPed',\n x_shift: -10,\n y_shift: 0,\n },\n pedal_release: {\n code: 'keyboardPedalUp',\n x_shift: -2,\n y_shift: 3,\n },\n};\n/** Pedal type as number. */\nPedalMarking.type = {\n TEXT: 1,\n BRACKET: 2,\n MIXED: 3,\n};\n/** Pedal type as string. */\nPedalMarking.typeString = {\n text: PedalMarking.type.TEXT,\n bracket: PedalMarking.type.BRACKET,\n mixed: PedalMarking.type.MIXED,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { Glyph } from './glyph';\nimport { GlyphNote } from './glyphnote';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\n// Map `type` to SMuFL glyph code.\nconst CODES = {\n '1': 'repeat1Bar',\n '2': 'repeat2Bars',\n '4': 'repeat4Bars',\n slash: 'repeatBarSlash',\n};\nexport class RepeatNote extends GlyphNote {\n static get CATEGORY() {\n return Category.RepeatNote;\n }\n constructor(type, noteStruct, options) {\n super(undefined, Object.assign({ duration: 'q', align_center: type !== 'slash' }, noteStruct), options);\n const glyphCode = CODES[type] || 'repeat1Bar';\n const glyph = new Glyph(glyphCode, Tables.currentMusicFont().lookupMetric('repeatNote.point', 40), {\n category: 'repeatNote',\n });\n this.setGlyph(glyph);\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements `StaveLine` which are simply lines that connect\n// two notes. This object is highly configurable, see the `render_options`.\n// A simple line is often used for notating glissando articulations, but you\n// can format a `StaveLine` with arrows or colors for more pedagogical\n// purposes, such as diagrams.\nimport { Element } from './element';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\n// Attribution: Arrow rendering implementations based off of\n// Patrick Horgan's article, \"Drawing lines and arcs with\n// arrow heads on HTML5 Canvas\"\n//\n// Draw an arrow head that connects between 3 coordinates.\nfunction drawArrowHead(ctx, x0, y0, x1, y1, x2, y2) {\n // all cases do this.\n ctx.beginPath();\n ctx.moveTo(x0, y0);\n ctx.lineTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.lineTo(x0, y0);\n ctx.closePath();\n ctx.fill();\n}\nexport class StaveLine extends Element {\n // Initialize the StaveLine with the given `notes`.\n //\n // `notes` is a struct that has:\n //\n // ```\n // {\n // first_note: Note,\n // last_note: Note,\n // first_indices: [n1, n2, n3],\n // last_indices: [n1, n2, n3]\n // }\n // ```\n constructor(notes) {\n super();\n this.setNotes(notes);\n this.text = '';\n this.resetFont();\n this.render_options = {\n // Space to add to the left or the right\n padding_left: 4,\n padding_right: 3,\n // The width of the line in pixels\n line_width: 1,\n // An array of line/space lengths. (TODO/QUESTION: Is this supported in SVG?).\n line_dash: undefined,\n // Can draw rounded line end, instead of a square. (TODO/QUESTION: Is this supported in SVG?).\n rounded_end: true,\n // The color of the line and arrowheads\n color: undefined,\n // Flags to draw arrows on each end of the line\n draw_start_arrow: false,\n draw_end_arrow: false,\n // The length of the arrowhead sides\n arrowhead_length: 10,\n // The angle of the arrowhead\n arrowhead_angle: Math.PI / 8,\n // The position of the text\n text_position_vertical: StaveLine.TextVerticalPosition.TOP,\n text_justification: StaveLine.TextJustification.CENTER,\n };\n }\n static get CATEGORY() {\n return Category.StaveLine;\n }\n // The the annotation for the `StaveLine`\n setText(text) {\n this.text = text;\n return this;\n }\n // Set the notes for the `StaveLine`\n setNotes(notes) {\n if (!notes.first_note && !notes.last_note) {\n throw new RuntimeError('BadArguments', 'Notes needs to have either first_note or last_note set.');\n }\n if (!notes.first_indices)\n notes.first_indices = [0];\n if (!notes.last_indices)\n notes.last_indices = [0];\n if (notes.first_indices.length !== notes.last_indices.length) {\n throw new RuntimeError('BadArguments', 'Connected notes must have same number of indices.');\n }\n this.notes = notes;\n this.first_note = notes.first_note;\n this.first_indices = notes.first_indices;\n this.last_note = notes.last_note;\n this.last_indices = notes.last_indices;\n return this;\n }\n // Apply the style of the `StaveLine` to the context\n applyLineStyle() {\n const ctx = this.checkContext();\n const render_options = this.render_options;\n if (render_options.line_dash) {\n ctx.setLineDash(render_options.line_dash);\n }\n if (render_options.line_width) {\n ctx.setLineWidth(render_options.line_width);\n }\n if (render_options.rounded_end) {\n ctx.setLineCap('round');\n }\n else {\n ctx.setLineCap('square');\n }\n }\n // Apply the text styling to the context\n applyFontStyle() {\n const ctx = this.checkContext();\n ctx.setFont(this.textFont);\n const render_options = this.render_options;\n const color = render_options.color;\n if (color) {\n ctx.setStrokeStyle(color);\n ctx.setFillStyle(color);\n }\n }\n // Helper function to draw a line with arrow heads\n drawArrowLine(ctx, pt1, pt2) {\n const both_arrows = this.render_options.draw_start_arrow && this.render_options.draw_end_arrow;\n const x1 = pt1.x;\n const y1 = pt1.y;\n const x2 = pt2.x;\n const y2 = pt2.y;\n // For ends with arrow we actually want to stop before we get to the arrow\n // so that wide lines won't put a flat end on the arrow.\n const distance = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));\n const ratio = (distance - this.render_options.arrowhead_length / 3) / distance;\n let end_x;\n let end_y;\n let start_x;\n let start_y;\n if (this.render_options.draw_end_arrow || both_arrows) {\n end_x = Math.round(x1 + (x2 - x1) * ratio);\n end_y = Math.round(y1 + (y2 - y1) * ratio);\n }\n else {\n end_x = x2;\n end_y = y2;\n }\n if (this.render_options.draw_start_arrow || both_arrows) {\n start_x = x1 + (x2 - x1) * (1 - ratio);\n start_y = y1 + (y2 - y1) * (1 - ratio);\n }\n else {\n start_x = x1;\n start_y = y1;\n }\n if (this.render_options.color) {\n ctx.setStrokeStyle(this.render_options.color);\n ctx.setFillStyle(this.render_options.color);\n }\n // Draw the shaft of the arrow\n ctx.beginPath();\n ctx.moveTo(start_x, start_y);\n ctx.lineTo(end_x, end_y);\n ctx.stroke();\n ctx.closePath();\n // calculate the angle of the line\n const line_angle = Math.atan2(y2 - y1, x2 - x1);\n // h is the line length of a side of the arrow head\n const h = Math.abs(this.render_options.arrowhead_length / Math.cos(this.render_options.arrowhead_angle));\n let angle1;\n let angle2;\n let top_x;\n let top_y;\n let bottom_x;\n let bottom_y;\n if (this.render_options.draw_end_arrow || both_arrows) {\n angle1 = line_angle + Math.PI + this.render_options.arrowhead_angle;\n top_x = x2 + Math.cos(angle1) * h;\n top_y = y2 + Math.sin(angle1) * h;\n angle2 = line_angle + Math.PI - this.render_options.arrowhead_angle;\n bottom_x = x2 + Math.cos(angle2) * h;\n bottom_y = y2 + Math.sin(angle2) * h;\n drawArrowHead(ctx, top_x, top_y, x2, y2, bottom_x, bottom_y);\n }\n if (this.render_options.draw_start_arrow || both_arrows) {\n angle1 = line_angle + this.render_options.arrowhead_angle;\n top_x = x1 + Math.cos(angle1) * h;\n top_y = y1 + Math.sin(angle1) * h;\n angle2 = line_angle - this.render_options.arrowhead_angle;\n bottom_x = x1 + Math.cos(angle2) * h;\n bottom_y = y1 + Math.sin(angle2) * h;\n drawArrowHead(ctx, top_x, top_y, x1, y1, bottom_x, bottom_y);\n }\n }\n // Renders the `StaveLine` on the context\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n const first_note = this.first_note;\n const last_note = this.last_note;\n const render_options = this.render_options;\n ctx.save();\n this.applyLineStyle();\n // Cycle through each set of indices and draw lines\n let start_position = { x: 0, y: 0 };\n let end_position = { x: 0, y: 0 };\n this.first_indices.forEach((first_index, i) => {\n const last_index = this.last_indices[i];\n // Get initial coordinates for the start/end of the line\n start_position = first_note.getModifierStartXY(2, first_index);\n end_position = last_note.getModifierStartXY(1, last_index);\n const upwards_slope = start_position.y > end_position.y;\n // Adjust `x` coordinates for modifiers\n start_position.x += first_note.getMetrics().modRightPx + render_options.padding_left;\n end_position.x -= last_note.getMetrics().modLeftPx + render_options.padding_right;\n // Adjust first `x` coordinates for displacements\n const notehead_width = first_note.getGlyph().getWidth();\n const first_displaced = first_note.getKeyProps()[first_index].displaced;\n if (first_displaced && first_note.getStemDirection() === 1) {\n start_position.x += notehead_width + render_options.padding_left;\n }\n // Adjust last `x` coordinates for displacements\n const last_displaced = last_note.getKeyProps()[last_index].displaced;\n if (last_displaced && last_note.getStemDirection() === -1) {\n end_position.x -= notehead_width + render_options.padding_right;\n }\n // Adjust y position better if it's not coming from the center of the note\n start_position.y += upwards_slope ? -3 : 1;\n end_position.y += upwards_slope ? 2 : 0;\n this.drawArrowLine(ctx, start_position, end_position);\n });\n ctx.restore();\n // Determine the x coordinate where to start the text\n const text_width = ctx.measureText(this.text).width;\n const justification = render_options.text_justification;\n let x = 0;\n if (justification === StaveLine.TextJustification.LEFT) {\n x = start_position.x;\n }\n else if (justification === StaveLine.TextJustification.CENTER) {\n const delta_x = end_position.x - start_position.x;\n const center_x = delta_x / 2 + start_position.x;\n x = center_x - text_width / 2;\n }\n else if (justification === StaveLine.TextJustification.RIGHT) {\n x = end_position.x - text_width;\n }\n // Determine the y value to start the text\n let y = 0;\n const vertical_position = render_options.text_position_vertical;\n if (vertical_position === StaveLine.TextVerticalPosition.TOP) {\n y = first_note.checkStave().getYForTopText();\n }\n else if (vertical_position === StaveLine.TextVerticalPosition.BOTTOM) {\n y = first_note.checkStave().getYForBottomText(Tables.TEXT_HEIGHT_OFFSET_HACK);\n }\n // Draw the text\n ctx.save();\n this.applyFontStyle();\n ctx.fillText(this.text, x, y);\n ctx.restore();\n return this;\n }\n}\n/** Default text font. */\nStaveLine.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n// Text Positioning\nStaveLine.TextVerticalPosition = {\n TOP: 1,\n BOTTOM: 2,\n};\nStaveLine.TextJustification = {\n LEFT: 1,\n CENTER: 2,\n RIGHT: 3,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { BoundingBox } from './boundingbox';\nimport { Element } from './element';\nimport { Formatter } from './formatter';\nimport { Note } from './note';\nimport { Stave } from './stave';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\n/**\n * System implements a musical system, which is a collection of staves,\n * each which can have one or more voices. All voices across all staves in\n * the system are formatted together.\n */\nexport class System extends Element {\n constructor(params = {}) {\n super();\n this.setOptions(params);\n this.parts = [];\n }\n static get CATEGORY() {\n return Category.System;\n }\n /** Set formatting options. */\n setOptions(options = {}) {\n if (!options.factory) {\n throw new RuntimeError('NoFactory', 'System.setOptions(options) requires a factory.');\n }\n this.factory = options.factory;\n this.options = Object.assign(Object.assign({ factory: this.factory, x: 10, y: 10, width: 500, spaceBetweenStaves: 12, autoWidth: false, noJustification: false, debugFormatter: false, formatIterations: 0, noPadding: false }, options), { details: Object.assign({ alpha: 0.5 }, options.details), formatOptions: Object.assign({}, options.formatOptions) });\n if (this.options.noJustification === false && typeof options.width === 'undefined') {\n this.options.autoWidth = true;\n }\n }\n /** Set associated context. */\n setContext(context) {\n super.setContext(context);\n this.factory.setContext(context);\n return this;\n }\n /**\n * Add connector between staves.\n * @param type see {@link StaveConnector.typeString}\n */\n addConnector(type = 'double') {\n this.connector = this.factory.StaveConnector({\n top_stave: this.parts[0].stave,\n bottom_stave: this.parts[this.parts.length - 1].stave,\n type,\n });\n return this.connector;\n }\n /**\n * Add a stave to the system.\n *\n * Example (one voice):\n *\n * `system.addStave({voices: [score.voice(score.notes('C#5/q, B4, A4, G#4'))]});`\n *\n * Example (two voices):\n *\n * `system.addStave({voices: [`\n * `score.voice(score.notes('C#5/q, B4, A4, G#4', {stem: 'up'})),`\n * `score.voice(score.notes('C#4/h, C#4', {stem: 'down'}))`\n * `]});`\n */\n addStave(params) {\n var _a;\n const staveOptions = Object.assign({ left_bar: false }, params.options);\n const stave = (_a = params.stave) !== null && _a !== void 0 ? _a : this.factory.Stave({ x: this.options.x, y: this.options.y, width: this.options.width, options: staveOptions });\n const p = Object.assign(Object.assign({ stave, \n /* voices: [], */\n spaceAbove: 0, spaceBelow: 0, debugNoteMetrics: false, noJustification: false }, params), { options: staveOptions });\n const ctx = this.getContext();\n p.voices.forEach((voice) => voice\n .setContext(ctx)\n .setStave(stave)\n .getTickables()\n .forEach((tickable) => tickable.setStave(stave)));\n this.parts.push(p);\n return stave;\n }\n /** Format the system. */\n format() {\n const options_details = this.options.details;\n let justifyWidth = 0;\n const formatter = new Formatter(options_details);\n this.formatter = formatter;\n let y = this.options.y;\n let startX = 0;\n let allVoices = [];\n const debugNoteMetricsYs = [];\n // Join the voices for each stave.\n this.parts.forEach((part) => {\n y = y + part.stave.space(part.spaceAbove);\n part.stave.setY(y);\n if (this.options.autoWidth) {\n part.voices.forEach((voice) => {\n formatter.joinVoices([voice]);\n });\n }\n else {\n formatter.joinVoices(part.voices);\n }\n y = y + part.stave.space(part.spaceBelow);\n y = y + part.stave.space(this.options.spaceBetweenStaves);\n if (part.debugNoteMetrics) {\n debugNoteMetricsYs.push({ y, voice: part.voices[0] });\n y += 15;\n }\n allVoices = allVoices.concat(part.voices);\n startX = Math.max(startX, part.stave.getNoteStartX());\n });\n // Update the start position of all staves.\n this.parts.forEach((part) => part.stave.setNoteStartX(startX));\n if (this.options.autoWidth) {\n justifyWidth = formatter.preCalculateMinTotalWidth(allVoices);\n this.parts.forEach((part) => {\n part.stave.setWidth(justifyWidth + Stave.rightPadding + (startX - this.options.x));\n });\n }\n else {\n justifyWidth = this.options.noPadding\n ? this.options.width - this.options.x\n : this.options.width - (startX - this.options.x) - Stave.defaultPadding;\n }\n formatter.format(allVoices, this.options.noJustification ? 0 : justifyWidth, this.options.formatOptions);\n for (let i = 0; i < this.options.formatIterations; i++) {\n formatter.tune(options_details);\n }\n this.startX = startX;\n this.debugNoteMetricsYs = debugNoteMetricsYs;\n this.lastY = y;\n this.boundingBox = new BoundingBox(this.options.x, this.options.y, this.options.width, this.lastY - this.options.y);\n }\n /** Render the system. */\n draw() {\n // Render debugging information, if requested.\n const ctx = this.checkContext();\n if (!this.formatter || !this.startX || !this.lastY || !this.debugNoteMetricsYs) {\n throw new RuntimeError('NoFormatter', 'format() must be called before draw()');\n }\n this.setRendered();\n if (this.options.debugFormatter) {\n Formatter.plotDebugging(ctx, this.formatter, this.startX, this.options.y, this.lastY);\n }\n this.debugNoteMetricsYs.forEach((d) => {\n d.voice.getTickables().forEach((tickable) => Note.plotMetrics(ctx, tickable, d.y));\n });\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// The file implements notes for Tablature notation. This consists of one or\n// more fret positions, and can either be drawn with or without stems.\n//\n// See `tests/tabnote_tests.ts` for usage examples.\nimport { Font } from './font';\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { StemmableNote } from './stemmablenote';\nimport { Tables } from './tables';\nimport { Category, isDot } from './typeguard';\nimport { defined, RuntimeError } from './util';\n// Gets the unused strings grouped together if consecutive.\n//\n// Parameters:\n// * num_lines - The number of lines\n// * strings_used - An array of numbers representing which strings have fret positions\nfunction getUnusedStringGroups(num_lines, strings_used) {\n const stem_through = [];\n let group = [];\n for (let string = 1; string <= num_lines; string++) {\n const is_used = strings_used.indexOf(string) > -1;\n if (!is_used) {\n group.push(string);\n }\n else {\n stem_through.push(group);\n group = [];\n }\n }\n if (group.length > 0)\n stem_through.push(group);\n return stem_through;\n}\n// Gets groups of points that outline the partial stem lines\n// between fret positions\n//\n// Parameters:\n// * stem_Y - The `y` coordinate the stem is located on\n// * unused_strings - An array of groups of unused strings\n// * stave - The stave to use for reference\n// * stem_direction - The direction of the stem\nfunction getPartialStemLines(stem_y, unused_strings, stave, stem_direction) {\n const up_stem = stem_direction !== 1;\n const down_stem = stem_direction !== -1;\n const line_spacing = stave.getSpacingBetweenLines();\n const total_lines = stave.getNumLines();\n const stem_lines = [];\n unused_strings.forEach((strings) => {\n const containsLastString = strings.indexOf(total_lines) > -1;\n const containsFirstString = strings.indexOf(1) > -1;\n if ((up_stem && containsFirstString) || (down_stem && containsLastString)) {\n return;\n }\n // If there's only one string in the group, push a duplicate value.\n // We do this because we need 2 strings to convert into upper/lower y\n // values.\n if (strings.length === 1) {\n strings.push(strings[0]);\n }\n const line_ys = [];\n // Iterate through each group string and store it's y position\n strings.forEach((string, index, strings) => {\n const isTopBound = string === 1;\n const isBottomBound = string === total_lines;\n // Get the y value for the appropriate staff line,\n // we adjust for a 0 index array, since string numbers are index 1\n let y = stave.getYForLine(string - 1);\n // Unless the string is the first or last, add padding to each side\n // of the line\n if (index === 0 && !isTopBound) {\n y -= line_spacing / 2 - 1;\n }\n else if (index === strings.length - 1 && !isBottomBound) {\n y += line_spacing / 2 - 1;\n }\n // Store the y value\n line_ys.push(y);\n // Store a subsequent y value connecting this group to the main\n // stem above/below the stave if it's the top/bottom string\n if (stem_direction === 1 && isTopBound) {\n line_ys.push(stem_y - 2);\n }\n else if (stem_direction === -1 && isBottomBound) {\n line_ys.push(stem_y + 2);\n }\n });\n // Add the sorted y values to the\n stem_lines.push(line_ys.sort((a, b) => a - b));\n });\n return stem_lines;\n}\nexport class TabNote extends StemmableNote {\n // Initialize the TabNote with a `noteStruct` full of properties\n // and whether to `draw_stem` when rendering the note\n constructor(noteStruct, draw_stem = false) {\n super(noteStruct);\n this.glyphs = [];\n // Return the number of the greatest string, which is the string lowest on the display\n this.greatestString = () => {\n return this.positions.map((x) => x.str).reduce((a, b) => (a > b ? a : b));\n };\n // Return the number of the least string, which is the string highest on the display\n this.leastString = () => {\n return this.positions.map((x) => x.str).reduce((a, b) => (a < b ? a : b));\n };\n this.ghost = false; // Renders parenthesis around notes\n // Note properties\n // The fret positions in the note. An array of `{ str: X, fret: X }`\n this.positions = noteStruct.positions || [];\n // Render Options\n this.render_options = Object.assign(Object.assign({}, this.render_options), { \n // font size for note heads and rests\n glyph_font_scale: Tables.TABLATURE_FONT_SCALE, \n // Flag to draw a stem\n draw_stem, \n // Flag to draw dot modifiers\n draw_dots: draw_stem, \n // Flag to extend the main stem through the stave and fret positions\n draw_stem_through_stave: false, \n // vertical shift from stave line\n y_shift: 0, \n // normal glyph scale\n scale: 1.0, \n // default tablature font\n font: `${Font.SIZE}pt ${Font.SANS_SERIF}` });\n this.glyph = Tables.getGlyphProps(this.duration, this.noteType);\n defined(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`);\n this.buildStem();\n if (noteStruct.stem_direction) {\n this.setStemDirection(noteStruct.stem_direction);\n }\n else {\n this.setStemDirection(Stem.UP);\n }\n // Renders parenthesis around notes\n this.ghost = false;\n this.updateWidth();\n }\n static get CATEGORY() {\n return Category.TabNote;\n }\n reset() {\n super.reset();\n if (this.stave)\n this.setStave(this.stave);\n return this;\n }\n // Set as ghost `TabNote`, surrounds the fret positions with parenthesis.\n // Often used for indicating frets that are being bent to\n setGhost(ghost) {\n this.ghost = ghost;\n this.updateWidth();\n return this;\n }\n // Determine if the note has a stem\n hasStem() {\n if (this.render_options.draw_stem)\n return true;\n return false;\n }\n // Get the default stem extension for the note\n getStemExtension() {\n if (this.stem_extension_override != null) {\n return this.stem_extension_override;\n }\n if (this.flag) {\n return this.getStemDirection() === 1 ? -this.flag.checkMetrics().y_shift : this.flag.checkMetrics().y_shift;\n }\n return 0;\n }\n // Calculate and store the width of the note\n updateWidth() {\n this.glyphs = [];\n this.width = 0;\n for (let i = 0; i < this.positions.length; ++i) {\n let fret = this.positions[i].fret;\n if (this.ghost)\n fret = '(' + fret + ')';\n const glyph = Tables.tabToGlyph(fret.toString(), this.render_options.scale);\n this.glyphs.push(glyph);\n this.width = Math.max(glyph.getWidth(), this.width);\n }\n // For some reason we associate a notehead glyph with a TabNote, and this\n // glyph is used for certain width calculations. Of course, this is totally\n // incorrect since a notehead is a poor approximation for the dimensions of\n // a fret number which can have multiple digits. As a result, we must\n // overwrite getWidth() to return the correct width\n this.glyph.getWidth = () => this.width;\n }\n // Set the `stave` to the note\n setStave(stave) {\n super.setStave(stave);\n const ctx = stave.getContext();\n this.setContext(ctx);\n // Calculate the fret number width based on font used\n if (ctx) {\n this.width = 0;\n for (let i = 0; i < this.glyphs.length; ++i) {\n const glyph = this.glyphs[i];\n const text = '' + glyph.text;\n if (text.toUpperCase() !== 'X') {\n ctx.save();\n ctx.setFont(this.render_options.font);\n glyph.width = ctx.measureText(text).width;\n ctx.restore();\n glyph.getWidth = () => glyph.width;\n }\n this.width = Math.max(glyph.getWidth(), this.width);\n }\n this.glyph.getWidth = () => this.width;\n }\n // we subtract 1 from `line` because getYForLine expects a 0-based index,\n // while the position.str is a 1-based index\n const ys = this.positions.map(({ str: line }) => stave.getYForLine(Number(line) - 1));\n this.setYs(ys);\n if (this.stem) {\n this.stem.setYBounds(this.getStemY(), this.getStemY());\n }\n return this;\n }\n // Get the fret positions for the note\n getPositions() {\n return this.positions;\n }\n // Get the default `x` and `y` coordinates for a modifier at a specific\n // `position` at a fret position `index`\n getModifierStartXY(position, index) {\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call GetModifierStartXY on an unformatted note\");\n }\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', 'No Y-Values calculated for this note.');\n }\n let x = 0;\n if (position === Modifier.Position.LEFT) {\n x = -1 * 2; // FIXME: modifier padding, move to font file\n }\n else if (position === Modifier.Position.RIGHT) {\n x = this.width + 2; // FIXME: modifier padding, move to font file\n }\n else if (position === Modifier.Position.BELOW || position === Modifier.Position.ABOVE) {\n const note_glyph_width = this.glyph.getWidth();\n x = note_glyph_width / 2;\n }\n return {\n x: this.getAbsoluteX() + x,\n y: this.ys[index],\n };\n }\n // Get the default line for rest\n getLineForRest() {\n return Number(this.positions[0].str);\n }\n // Pre-render formatting\n preFormat() {\n if (this.preFormatted)\n return;\n if (this.modifierContext)\n this.modifierContext.preFormat();\n // width is already set during init()\n this.preFormatted = true;\n }\n // Get the x position for the stem\n getStemX() {\n return this.getCenterGlyphX();\n }\n // Get the y position for the stem\n getStemY() {\n const num_lines = this.checkStave().getNumLines();\n // The decimal staff line amounts provide optimal spacing between the\n // fret number and the stem\n const stemUpLine = -0.5;\n const stemDownLine = num_lines - 0.5;\n const stemStartLine = Stem.UP === this.stem_direction ? stemUpLine : stemDownLine;\n return this.checkStave().getYForLine(stemStartLine);\n }\n // Get the stem extents for the tabnote\n getStemExtents() {\n return this.checkStem().getExtents();\n }\n // Draw the fal onto the context\n drawFlag() {\n const { beam, glyph, stem_direction, render_options: { draw_stem, glyph_font_scale }, } = this;\n const context = this.checkContext();\n const shouldDrawFlag = beam == undefined && draw_stem;\n // Now it's the flag's turn.\n if (glyph.flag && shouldDrawFlag) {\n const flag_x = this.getStemX() + 1;\n const flag_y = this.getStemY() - this.checkStem().getHeight();\n const flag_code = stem_direction === Stem.DOWN\n ? glyph.code_flag_downstem // Down stems have flags on the left.\n : glyph.code_flag_upstem;\n // Draw the Flag\n Glyph.renderGlyph(context, flag_x, flag_y, glyph_font_scale, flag_code, { category: 'flag.tabStem' });\n }\n }\n // Render the modifiers onto the context.\n drawModifiers() {\n this.modifiers.forEach((modifier) => {\n // Only draw the dots if enabled.\n if (isDot(modifier) && !this.render_options.draw_dots) {\n return;\n }\n modifier.setContext(this.getContext());\n modifier.drawWithStyle();\n });\n }\n // Render the stem extension through the fret positions\n drawStemThrough() {\n const stemX = this.getStemX();\n const stemY = this.getStemY();\n const ctx = this.checkContext();\n const drawStem = this.render_options.draw_stem;\n const stemThrough = this.render_options.draw_stem_through_stave;\n if (drawStem && stemThrough) {\n const numLines = this.checkStave().getNumLines();\n const stringsUsed = this.positions.map((position) => Number(position.str));\n const unusedStrings = getUnusedStringGroups(numLines, stringsUsed);\n const stemLines = getPartialStemLines(stemY, unusedStrings, this.checkStave(), this.getStemDirection());\n ctx.save();\n ctx.setLineWidth(Stem.WIDTH);\n stemLines.forEach((bounds) => {\n if (bounds.length === 0)\n return;\n ctx.beginPath();\n ctx.moveTo(stemX, bounds[0]);\n ctx.lineTo(stemX, bounds[bounds.length - 1]);\n ctx.stroke();\n ctx.closePath();\n });\n ctx.restore();\n }\n }\n // Render the fret positions onto the context\n drawPositions() {\n const ctx = this.checkContext();\n const x = this.getAbsoluteX();\n const ys = this.ys;\n for (let i = 0; i < this.positions.length; ++i) {\n const y = ys[i] + this.render_options.y_shift;\n const glyph = this.glyphs[i];\n // Center the fret text beneath the notation note head\n const note_glyph_width = this.glyph.getWidth();\n const tab_x = x + note_glyph_width / 2 - glyph.getWidth() / 2;\n // FIXME: Magic numbers.\n ctx.clearRect(tab_x - 2, y - 3, glyph.getWidth() + 4, 6);\n if (glyph.code) {\n Glyph.renderGlyph(ctx, tab_x, y, this.render_options.glyph_font_scale * this.render_options.scale, glyph.code);\n }\n else {\n ctx.save();\n ctx.setFont(this.render_options.font);\n const text = glyph.text.toString();\n ctx.fillText(text, tab_x, y + 5 * this.render_options.scale);\n ctx.restore();\n }\n }\n }\n // The main rendering function for the entire note.\n draw() {\n const ctx = this.checkContext();\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', \"Can't draw note without Y values.\");\n }\n this.setRendered();\n const render_stem = this.beam == undefined && this.render_options.draw_stem;\n ctx.openGroup('tabnote', undefined, { pointerBBox: true });\n this.drawPositions();\n this.drawStemThrough();\n if (this.stem && render_stem) {\n const stem_x = this.getStemX();\n this.stem.setNoteHeadXBounds(stem_x, stem_x);\n ctx.openGroup('stem', undefined, { pointerBBox: true });\n this.stem.setContext(ctx).draw();\n ctx.closeGroup();\n }\n this.drawFlag();\n this.drawModifiers();\n ctx.closeGroup();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { Stave } from './stave';\nimport { Category } from './typeguard';\nexport class TabStave extends Stave {\n static get CATEGORY() {\n return Category.TabStave;\n }\n constructor(x, y, width, options) {\n const tab_options = Object.assign({ spacing_between_lines_px: 13, num_lines: 6, top_text_position: 1 }, options);\n super(x, y, width, tab_options);\n }\n getYForGlyphs() {\n return this.getYForLine(2.5);\n }\n // Deprecated\n addTabGlyph() {\n this.addClef('tab');\n return this;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Cyril Silverman\n//\n// This file implements `TextBrackets` which extend between two notes.\n// The octave transposition markings (8va, 8vb, 15va, 15vb) can be created\n// using this class.\nimport { Element } from './element';\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Renderer } from './renderer';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { log, RuntimeError } from './util';\n// To enable logging for this class. Set `Vex.Flow.TextBracket.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (TextBracket.DEBUG)\n log('Vex.Flow.TextBracket', args);\n}\nexport var TextBracketPosition;\n(function (TextBracketPosition) {\n TextBracketPosition[TextBracketPosition[\"TOP\"] = 1] = \"TOP\";\n TextBracketPosition[TextBracketPosition[\"BOTTOM\"] = -1] = \"BOTTOM\";\n})(TextBracketPosition || (TextBracketPosition = {}));\nexport class TextBracket extends Element {\n constructor({ start, stop, text = '', superscript = '', position = TextBracketPosition.TOP }) {\n super();\n this.start = start;\n this.stop = stop;\n this.text = text;\n this.superscript = superscript;\n this.position = typeof position === 'string' ? TextBracket.PositionString[position] : position;\n this.line = 1;\n this.resetFont();\n this.render_options = {\n dashed: true,\n dash: [5],\n color: 'black',\n line_width: 1,\n show_bracket: true,\n bracket_height: 8,\n // In the BOTTOM position, the bracket line can extend\n // under the superscript.\n underline_superscript: true,\n };\n }\n static get CATEGORY() {\n return Category.TextBracket;\n }\n static get Position() {\n return TextBracketPosition;\n }\n static get PositionString() {\n return {\n top: TextBracketPosition.TOP,\n bottom: TextBracketPosition.BOTTOM,\n };\n }\n /**\n * @deprecated Use `TextBracket.Position` instead.\n */\n static get Positions() {\n L('Positions is deprecated, use TextBracketPosition instead.');\n return TextBracketPosition;\n }\n /**\n * @deprecated Use `TextBracket.PositionString` instead.\n */\n static get PositionsString() {\n L('PositionsString is deprecated, use PositionString instead.');\n return TextBracket.PositionString;\n }\n /**\n * Apply the text backet styling to the provided context.\n * @param ctx\n * @returns this\n */\n applyStyle(ctx) {\n ctx.setFont(this.font);\n const options = this.render_options;\n ctx.setStrokeStyle(options.color);\n ctx.setFillStyle(options.color);\n ctx.setLineWidth(options.line_width);\n return this;\n }\n // Set whether the bracket line should be `dashed`. You can also\n // optionally set the `dash` pattern by passing in an array of numbers\n setDashed(dashed, dash) {\n this.render_options.dashed = dashed;\n if (dash)\n this.render_options.dash = dash;\n return this;\n }\n // Set the rendering `context` for the octave bracket\n setLine(line) {\n this.line = line;\n return this;\n }\n // Draw the octave bracket on the rendering context\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n let y = 0;\n switch (this.position) {\n case TextBracketPosition.TOP:\n y = this.start.checkStave().getYForTopText(this.line);\n break;\n case TextBracketPosition.BOTTOM:\n y = this.start.checkStave().getYForBottomText(this.line + Tables.TEXT_HEIGHT_OFFSET_HACK);\n break;\n default:\n throw new RuntimeError('InvalidPosition', `The position ${this.position} is invalid.`);\n }\n // Get the preliminary start and stop coordintates for the bracket\n const start = { x: this.start.getAbsoluteX(), y };\n const stop = { x: this.stop.getAbsoluteX(), y };\n L('Rendering TextBracket: start:', start, 'stop:', stop, 'y:', y);\n const bracket_height = this.render_options.bracket_height * this.position;\n ctx.save();\n this.applyStyle(ctx);\n // Draw text\n ctx.fillText(this.text, start.x, start.y);\n // Get the width and height for the octave number\n const main_measure = ctx.measureText(this.text);\n const main_width = main_measure.width;\n const main_height = main_measure.height;\n // Calculate the y position for the super script\n const super_y = start.y - main_height / 2.5;\n // We called this.resetFont() in the constructor, so we know this.textFont is available.\n // eslint-disable-next-line\n const { family, size, weight, style } = this.textFont;\n // To draw the superscript, we scale the font size by 1/1.4.\n const smallerFontSize = Font.scaleSize(size, 0.714286);\n ctx.setFont(family, smallerFontSize, weight, style);\n ctx.fillText(this.superscript, start.x + main_width + 1, super_y);\n // Determine width and height of the superscript\n const super_measure = ctx.measureText(this.superscript);\n const super_width = super_measure.width;\n const super_height = super_measure.height;\n // Setup initial coordinates for the bracket line\n let start_x = start.x;\n let line_y = super_y;\n const end_x = stop.x + this.stop.getGlyph().getWidth();\n // Adjust x and y coordinates based on position\n if (this.position === TextBracketPosition.TOP) {\n start_x += main_width + super_width + 5;\n line_y -= super_height / 2.7;\n }\n else if (this.position === TextBracketPosition.BOTTOM) {\n line_y += super_height / 2.7;\n start_x += main_width + 2;\n if (!this.render_options.underline_superscript) {\n start_x += super_width;\n }\n }\n if (this.render_options.dashed) {\n // Main line\n Renderer.drawDashedLine(ctx, start_x, line_y, end_x, line_y, this.render_options.dash);\n // Ending Bracket\n if (this.render_options.show_bracket) {\n Renderer.drawDashedLine(ctx, end_x, line_y + 1 * this.position, end_x, line_y + bracket_height, this.render_options.dash);\n }\n }\n else {\n ctx.beginPath();\n ctx.moveTo(start_x, line_y);\n // Main line\n ctx.lineTo(end_x, line_y);\n if (this.render_options.show_bracket) {\n // Ending bracket\n ctx.lineTo(end_x, line_y + bracket_height);\n }\n ctx.stroke();\n ctx.closePath();\n }\n ctx.restore();\n }\n}\nTextBracket.DEBUG = false;\nTextBracket.TEXT_FONT = {\n family: Font.SERIF,\n size: 15,\n weight: FontWeight.NORMAL,\n style: FontStyle.ITALIC,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Category } from './typeguard';\nimport { defined, log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (TextDynamics.DEBUG)\n log('Vex.Flow.TextDynamics', args);\n}\n/**\n * `TextDynamics` renders traditional\n * text dynamics markings, **ie: p, f, sfz, rfz, ppp**\n *\n * You can render any dynamics string that contains a combination of\n * the following letters: P, M, F, Z, R, S\n */\nexport class TextDynamics extends Note {\n /**\n * Create the dynamics marking.\n *\n * A `TextDynamics` object inherits from `Note` so that it can be formatted\n * within a `Voice`.\n *\n * @param noteStruct an object that contains a `duration` property and a\n * `sequence` of letters that represents the letters to render.\n */\n constructor(noteStruct) {\n super(noteStruct);\n this.sequence = (noteStruct.text || '').toLowerCase();\n this.line = noteStruct.line || 0;\n this.glyphs = [];\n this.render_options = Object.assign(Object.assign({}, this.render_options), { glyph_font_size: 40 });\n L('New Dynamics Text: ', this.sequence);\n }\n static get CATEGORY() {\n return Category.TextDynamics;\n }\n /** The glyph data for each dynamics letter. */\n static get GLYPHS() {\n return {\n f: {\n code: 'dynamicForte',\n width: 12,\n },\n p: {\n code: 'dynamicPiano',\n width: 14,\n },\n m: {\n code: 'dynamicMezzo',\n width: 17,\n },\n s: {\n code: 'dynamicSforzando',\n width: 10,\n },\n z: {\n code: 'dynamicZ',\n width: 12,\n },\n r: {\n code: 'dynamicRinforzando',\n width: 12,\n },\n };\n }\n /** Set the Stave line on which the note should be placed. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Preformat the dynamics text. */\n preFormat() {\n let total_width = 0;\n // length of this.glyphs must be <=\n // length of this.sequence, so if we're formatted before\n // create new glyphs.\n this.glyphs = [];\n // Iterate through each letter\n this.sequence.split('').forEach((letter) => {\n // Get the glyph data for the letter\n const glyph_data = TextDynamics.GLYPHS[letter];\n if (!glyph_data)\n throw new RuntimeError('Invalid dynamics character: ' + letter);\n const size = defined(this.render_options.glyph_font_size);\n const glyph = new Glyph(glyph_data.code, size, { category: 'textNote' });\n // Add the glyph\n this.glyphs.push(glyph);\n total_width += glyph_data.width;\n });\n // Store the width of the text\n this.setWidth(total_width);\n this.preFormatted = true;\n return this;\n }\n /** Draw the dynamics text on the rendering context. */\n draw() {\n this.setRendered();\n const x = this.getAbsoluteX();\n const y = this.checkStave().getYForLine(this.line + -3);\n L('Rendering Dynamics: ', this.sequence);\n let letter_x = x;\n this.glyphs.forEach((glyph, index) => {\n const current_letter = this.sequence[index];\n glyph.render(this.checkContext(), letter_x, y);\n letter_x += TextDynamics.GLYPHS[current_letter].width;\n });\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.TextDynamics.DEBUG` to `true`. */\nTextDynamics.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2014\nimport { Note } from './note';\nimport { TimeSignature } from './timesignature';\nimport { Category } from './typeguard';\nexport class TimeSigNote extends Note {\n constructor(timeSpec, customPadding) {\n super({ duration: 'b' });\n const timeSignature = new TimeSignature(timeSpec, customPadding);\n this.timeSigInfo = timeSignature.getInfo();\n this.setWidth(this.timeSigInfo.glyph.getMetrics().width);\n // Note properties\n this.ignore_ticks = true;\n }\n static get CATEGORY() {\n return Category.TimeSigNote;\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n draw() {\n const stave = this.checkStave();\n const ctx = this.checkContext();\n this.setRendered();\n if (!this.timeSigInfo.glyph.getContext()) {\n this.timeSigInfo.glyph.setContext(ctx);\n }\n this.timeSigInfo.glyph.setStave(stave);\n this.timeSigInfo.glyph.setYShift(stave.getYForLine(2) - stave.getYForGlyphs());\n this.timeSigInfo.glyph.renderToStave(this.getAbsoluteX());\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Balazs Forian-Szabo\n// MIT License\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { log } from './util';\nimport { Vibrato } from './vibrato';\n// eslint-disable-next-line\nfunction L(...args) {\n if (VibratoBracket.DEBUG)\n log('Vex.Flow.VibratoBracket', args);\n}\n/** `VibratoBracket` renders vibrato effect between two notes. */\nexport class VibratoBracket extends Element {\n /**\n * Either the stop or start note must be set, or both of them.\n * An undefined value for the start or stop note indicates that the vibrato\n * is drawn from the beginning or until the end of the stave accordingly.\n */\n constructor(bracket_data) {\n super();\n if (bracket_data.start)\n this.start = bracket_data.start;\n if (bracket_data.stop)\n this.stop = bracket_data.stop;\n this.line = 1;\n this.render_options = {\n harsh: false,\n wave_height: 6,\n wave_width: 4,\n wave_girth: 2,\n vibrato_width: 0,\n };\n }\n static get CATEGORY() {\n return Category.VibratoBracket;\n }\n /** Set line position of the vibrato bracket. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Set harsh vibrato bracket. */\n setHarsh(harsh) {\n this.render_options.harsh = harsh;\n return this;\n }\n /** Draw the vibrato bracket on the rendering context. */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n const y = (this.start && this.start.checkStave().getYForTopText(this.line)) ||\n (this.stop && this.stop.checkStave().getYForTopText(this.line)) ||\n 0;\n // If start note is not set then vibrato will be drawn\n // from the beginning of the stave\n const start_x = (this.start && this.start.getAbsoluteX()) || (this.stop && this.stop.checkStave().getTieStartX()) || 0;\n // If stop note is not set then vibrato will be drawn\n // until the end of the stave\n const stop_x = (this.stop && this.stop.getAbsoluteX() - this.stop.getWidth() - 5) ||\n (this.start && this.start.checkStave().getTieEndX() - 10) ||\n 0;\n this.render_options.vibrato_width = stop_x - start_x;\n L('Rendering VibratoBracket: start_x:', start_x, 'stop_x:', stop_x, 'y:', y);\n Vibrato.renderVibrato(ctx, start_x, y, this.render_options);\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.VibratoBracket.DEBUG` to `true`. */\nVibratoBracket.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Mohit Cheppudira\n// MIT License\nimport { Accidental } from './accidental';\nimport { Annotation, AnnotationHorizontalJustify, AnnotationVerticalJustify } from './annotation';\nimport { Articulation } from './articulation';\nimport { BarNote } from './barnote';\nimport { Beam } from './beam';\nimport { ChordSymbol } from './chordsymbol';\nimport { ClefNote } from './clefnote';\nimport { Curve } from './curve';\nimport { EasyScore } from './easyscore';\nimport { Element } from './element';\nimport { Formatter } from './formatter';\nimport { FretHandFinger } from './frethandfinger';\nimport { GhostNote } from './ghostnote';\nimport { GlyphNote } from './glyphnote';\nimport { GraceNote } from './gracenote';\nimport { GraceNoteGroup } from './gracenotegroup';\nimport { KeySigNote } from './keysignote';\nimport { ModifierContext } from './modifiercontext';\nimport { MultiMeasureRest } from './multimeasurerest';\nimport { NoteSubGroup } from './notesubgroup';\nimport { PedalMarking } from './pedalmarking';\nimport { Renderer } from './renderer';\nimport { RepeatNote } from './repeatnote';\nimport { Stave } from './stave';\nimport { StaveConnector } from './staveconnector';\nimport { StaveLine } from './staveline';\nimport { StaveNote } from './stavenote';\nimport { StaveTie } from './stavetie';\nimport { StringNumber } from './stringnumber';\nimport { System } from './system';\nimport { TabNote } from './tabnote';\nimport { TabStave } from './tabstave';\nimport { TextBracket } from './textbracket';\nimport { TextDynamics } from './textdynamics';\nimport { TextNote } from './textnote';\nimport { TickContext } from './tickcontext';\nimport { TimeSigNote } from './timesignote';\nimport { Tuplet } from './tuplet';\nimport { defined, log, RuntimeError } from './util';\nimport { VibratoBracket } from './vibratobracket';\nimport { Voice } from './voice';\nimport { isHTMLCanvas } from './web';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Factory.DEBUG)\n log('Vex.Flow.Factory', args);\n}\n/**\n * Factory implements a high level API around VexFlow.\n */\nexport class Factory {\n /**\n * Example:\n *\n * Create an SVG renderer and attach it to the DIV element named \"boo\" to render using 1200 and 600\n *\n * `const vf: Factory = new Vex.Flow.Factory({renderer: { elementId: 'boo', width: 1200, height: 600 }});`\n */\n constructor(options = {}) {\n L('New factory: ', options);\n this.options = {\n stave: {\n space: 10,\n },\n renderer: {\n elementId: '',\n width: 500,\n height: 200,\n background: '#FFF',\n },\n font: Factory.TEXT_FONT,\n };\n this.setOptions(options);\n }\n /**\n * Static simplified function to access constructor without providing FactoryOptions\n *\n * Example:\n *\n * Create an SVG renderer and attach it to the DIV element named \"boo\" to render using 1200 and 600\n *\n * `const vf: Factory = Vex.Flow.Factory.newFromElementId('boo', 1200, 600 );`\n */\n static newFromElementId(elementId, width = 500, height = 200) {\n return new Factory({ renderer: { elementId, width, height } });\n }\n reset() {\n this.renderQ = [];\n this.systems = [];\n this.staves = [];\n this.voices = [];\n this.stave = undefined; // current stave\n }\n setOptions(options) {\n this.options = Object.assign(Object.assign({}, this.options), options);\n this.initRenderer();\n this.reset();\n }\n initRenderer() {\n const { elementId, width, height, background } = this.options.renderer;\n if (elementId == null) {\n return;\n }\n if (elementId == '') {\n L(this);\n throw new RuntimeError('renderer.elementId not set in FactoryOptions');\n }\n let backend = this.options.renderer.backend;\n if (backend === undefined) {\n const elem = document.getElementById(elementId);\n // We use a custom type check here, because node-canvas mimics canvas,\n // but is not an instance of window.HTMLCanvasElement.\n // In fact, `window` might be undefined here.\n // See: https://www.npmjs.com/package/canvas\n if (isHTMLCanvas(elem)) {\n backend = Renderer.Backends.CANVAS;\n }\n else {\n backend = Renderer.Backends.SVG;\n }\n }\n this.context = Renderer.buildContext(elementId, backend, width, height, background);\n }\n getContext() {\n return this.context;\n }\n setContext(context) {\n this.context = context;\n return this;\n }\n getStave() {\n return this.stave;\n }\n getVoices() {\n return this.voices;\n }\n /** Return pixels from current stave spacing. */\n Stave(params) {\n const staveSpace = this.options.stave.space;\n const p = Object.assign({ x: 0, y: 0, width: this.options.renderer.width - staveSpace * 1.0, options: { spacing_between_lines_px: staveSpace * 1.0 } }, params);\n const stave = new Stave(p.x, p.y, p.width, p.options);\n this.staves.push(stave);\n stave.setContext(this.context);\n this.stave = stave;\n return stave;\n }\n TabStave(params) {\n const staveSpace = this.options.stave.space;\n const p = Object.assign({ x: 0, y: 0, width: this.options.renderer.width - staveSpace * 1.0, options: { spacing_between_lines_px: staveSpace * 1.3 } }, params);\n const stave = new TabStave(p.x, p.y, p.width, p.options);\n this.staves.push(stave);\n stave.setContext(this.context);\n this.stave = stave;\n return stave;\n }\n StaveNote(noteStruct) {\n const note = new StaveNote(noteStruct);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n GlyphNote(glyph, noteStruct, options) {\n const note = new GlyphNote(glyph, noteStruct, options);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n RepeatNote(type, noteStruct, options) {\n const note = new RepeatNote(type, noteStruct, options);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n GhostNote(noteStruct) {\n const ghostNote = new GhostNote(noteStruct);\n if (this.stave)\n ghostNote.setStave(this.stave);\n ghostNote.setContext(this.context);\n this.renderQ.push(ghostNote);\n return ghostNote;\n }\n TextNote(noteStruct) {\n const textNote = new TextNote(noteStruct);\n if (this.stave)\n textNote.setStave(this.stave);\n textNote.setContext(this.context);\n this.renderQ.push(textNote);\n return textNote;\n }\n BarNote(params = {}) {\n const barNote = new BarNote(params.type);\n if (this.stave)\n barNote.setStave(this.stave);\n barNote.setContext(this.context);\n this.renderQ.push(barNote);\n return barNote;\n }\n ClefNote(params) {\n const p = Object.assign({ type: 'treble', options: {\n size: 'default',\n annotation: undefined,\n } }, params);\n const clefNote = new ClefNote(p.type, p.options.size, p.options.annotation);\n if (this.stave)\n clefNote.setStave(this.stave);\n clefNote.setContext(this.context);\n this.renderQ.push(clefNote);\n return clefNote;\n }\n TimeSigNote(params) {\n const p = Object.assign({ time: '4/4' }, params);\n const timeSigNote = new TimeSigNote(p.time);\n if (this.stave)\n timeSigNote.setStave(this.stave);\n timeSigNote.setContext(this.context);\n this.renderQ.push(timeSigNote);\n return timeSigNote;\n }\n KeySigNote(params) {\n const keySigNote = new KeySigNote(params.key, params.cancelKey, params.alterKey);\n if (this.stave)\n keySigNote.setStave(this.stave);\n keySigNote.setContext(this.context);\n this.renderQ.push(keySigNote);\n return keySigNote;\n }\n TabNote(noteStruct) {\n const note = new TabNote(noteStruct);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n GraceNote(noteStruct) {\n const note = new GraceNote(noteStruct);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n return note;\n }\n GraceNoteGroup(params) {\n const group = new GraceNoteGroup(params.notes, params.slur);\n group.setContext(this.context);\n return group;\n }\n Accidental(params) {\n const accid = new Accidental(params.type);\n accid.setContext(this.context);\n return accid;\n }\n Annotation(params) {\n const p = Object.assign({ text: 'p', hJustify: AnnotationHorizontalJustify.CENTER, vJustify: AnnotationVerticalJustify.BOTTOM }, params);\n const annotation = new Annotation(p.text);\n annotation.setJustification(p.hJustify);\n annotation.setVerticalJustification(p.vJustify);\n annotation.setFont(p.font);\n annotation.setContext(this.context);\n return annotation;\n }\n ChordSymbol(params) {\n const p = Object.assign({ vJustify: 'top', hJustify: 'center', kerning: true, reportWidth: true }, params);\n const chordSymbol = new ChordSymbol();\n chordSymbol.setHorizontal(p.hJustify);\n chordSymbol.setVertical(p.vJustify);\n chordSymbol.setEnableKerning(p.kerning);\n chordSymbol.setReportWidth(p.reportWidth);\n // There is a default font based on the engraving font. Only set then\n // font if it is specific, else use the default\n if (typeof p.fontFamily === 'string' && typeof p.fontSize === 'number') {\n if (typeof p.fontWeight === 'string')\n chordSymbol.setFont(p.fontFamily, p.fontSize, p.fontWeight);\n else\n chordSymbol.setFont(p.fontFamily, p.fontSize, '');\n }\n else if (typeof p.fontSize === 'number') {\n chordSymbol.setFontSize(p.fontSize);\n }\n chordSymbol.setContext(this.context);\n return chordSymbol;\n }\n Articulation(params) {\n const p = Object.assign({ type: 'a.', position: 'above' }, params);\n const articulation = new Articulation(p.type);\n articulation.setPosition(p.position);\n articulation.setContext(this.context);\n return articulation;\n }\n TextDynamics(params) {\n const p = Object.assign({ text: 'p', duration: 'q', dots: 0, line: 0 }, params);\n const text = new TextDynamics({\n text: p.text,\n line: p.line,\n duration: p.duration,\n dots: p.dots,\n });\n if (this.stave)\n text.setStave(this.stave);\n text.setContext(this.context);\n this.renderQ.push(text);\n return text;\n }\n Fingering(params) {\n const p = Object.assign({ number: '0', position: 'left' }, params);\n const fingering = new FretHandFinger(p.number);\n fingering.setPosition(p.position);\n fingering.setContext(this.context);\n return fingering;\n }\n StringNumber(params) {\n const stringNumber = new StringNumber(params.number);\n stringNumber.setPosition(params.position);\n stringNumber.setContext(this.context);\n return stringNumber;\n }\n TickContext() {\n return new TickContext();\n }\n ModifierContext() {\n return new ModifierContext();\n }\n MultiMeasureRest(params) {\n const numMeasures = defined(params.number_of_measures, 'NoNumberOfMeasures');\n const multiMeasureRest = new MultiMeasureRest(numMeasures, params);\n multiMeasureRest.setContext(this.context);\n this.renderQ.push(multiMeasureRest);\n return multiMeasureRest;\n }\n Voice(params) {\n const p = Object.assign({ time: '4/4' }, params);\n const voice = new Voice(p.time, p.options);\n this.voices.push(voice);\n return voice;\n }\n StaveConnector(params) {\n const connector = new StaveConnector(params.top_stave, params.bottom_stave);\n connector.setType(params.type).setContext(this.context);\n this.renderQ.push(connector);\n return connector;\n }\n Formatter(options) {\n return new Formatter(options);\n }\n Tuplet(params) {\n const p = Object.assign({ notes: [], options: {} }, params);\n const tuplet = new Tuplet(p.notes, p.options).setContext(this.context);\n this.renderQ.push(tuplet);\n return tuplet;\n }\n Beam(params) {\n var _a, _b, _c;\n const beam = new Beam(params.notes, (_a = params.options) === null || _a === void 0 ? void 0 : _a.autoStem).setContext(this.context);\n beam.breakSecondaryAt((_c = (_b = params.options) === null || _b === void 0 ? void 0 : _b.secondaryBeamBreaks) !== null && _c !== void 0 ? _c : []);\n this.renderQ.push(beam);\n return beam;\n }\n Curve(params) {\n const curve = new Curve(params.from, params.to, params.options).setContext(this.context);\n this.renderQ.push(curve);\n return curve;\n }\n StaveTie(params) {\n var _a;\n const tie = new StaveTie({\n first_note: params.from,\n last_note: params.to,\n first_indices: params.first_indices,\n last_indices: params.last_indices,\n }, params.text);\n if ((_a = params.options) === null || _a === void 0 ? void 0 : _a.direction)\n tie.setDirection(params.options.direction);\n tie.setContext(this.context);\n this.renderQ.push(tie);\n return tie;\n }\n StaveLine(params) {\n var _a, _b;\n const line = new StaveLine({\n first_note: params.from,\n last_note: params.to,\n first_indices: params.first_indices,\n last_indices: params.last_indices,\n });\n if ((_a = params.options) === null || _a === void 0 ? void 0 : _a.text)\n line.setText(params.options.text);\n if ((_b = params.options) === null || _b === void 0 ? void 0 : _b.font)\n line.setFont(params.options.font);\n line.setContext(this.context);\n this.renderQ.push(line);\n return line;\n }\n VibratoBracket(params) {\n const vibratoBracket = new VibratoBracket({\n start: params.from,\n stop: params.to,\n });\n if (params.options.line)\n vibratoBracket.setLine(params.options.line);\n if (params.options.harsh)\n vibratoBracket.setHarsh(params.options.harsh);\n vibratoBracket.setContext(this.context);\n this.renderQ.push(vibratoBracket);\n return vibratoBracket;\n }\n TextBracket(params) {\n const textBracket = new TextBracket({\n start: params.from,\n stop: params.to,\n text: params.text,\n superscript: params.options.superscript,\n position: params.options.position,\n });\n if (params.options.line)\n textBracket.setLine(params.options.line);\n if (params.options.font)\n textBracket.setFont(params.options.font);\n textBracket.setContext(this.context);\n this.renderQ.push(textBracket);\n return textBracket;\n }\n System(params = {}) {\n params.factory = this;\n const system = new System(params).setContext(this.context);\n this.systems.push(system);\n return system;\n }\n /**\n * Creates EasyScore. Normally the first step after constructing a Factory. For example:\n * ```\n * const vf: Factory = new Vex.Flow.Factory({renderer: { elementId: 'boo', width: 1200, height: 600 }});\n * const score: EasyScore = vf.EasyScore();\n * ```\n * @param options.factory optional instance of Factory\n * @param options.builder instance of Builder\n * @param options.commitHooks function to call after a note element is created\n * @param options.throwOnError throw error in case of parsing error\n */\n EasyScore(options = {}) {\n options.factory = this;\n return new EasyScore(options);\n }\n PedalMarking(params) {\n const p = Object.assign({ notes: [], options: {\n style: 'mixed',\n } }, params);\n const pedal = new PedalMarking(p.notes);\n pedal.setType(PedalMarking.typeString[p.options.style]);\n pedal.setContext(this.context);\n this.renderQ.push(pedal);\n return pedal;\n }\n NoteSubGroup(params) {\n const p = Object.assign({ notes: [] }, params);\n const group = new NoteSubGroup(p.notes);\n group.setContext(this.context);\n return group;\n }\n /** Render the score. */\n draw() {\n const ctx = this.context;\n this.systems.forEach((s) => s.setContext(ctx).format());\n this.staves.forEach((s) => s.setContext(ctx).draw());\n this.voices.forEach((v) => v.setContext(ctx).draw());\n this.renderQ.forEach((e) => {\n if (!e.isRendered())\n e.setContext(ctx).draw();\n });\n this.systems.forEach((s) => s.setContext(ctx).draw());\n this.reset();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Factory.DEBUG` to `true`. */\nFactory.DEBUG = false;\n/** Default text font. */\nFactory.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// Author: Raffaele Viglianti, 2012 http://itisnotsound.wordpress.com/\n//\n// This class implements hairpins between notes.\n// Hairpins can be either crescendo or decrescendo.\nimport { Element } from './element';\nimport { Modifier } from './modifier';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StaveHairpin extends Element {\n /**\n * Create a new hairpin from the specified notes.\n *\n * @param {!Object} notes The notes to tie up.\n * Notes is a struct that has:\n *\n * {\n * first_note: Note,\n * last_note: Note,\n * }\n * @param {!Object} type The type of hairpin\n */\n constructor(notes, type) {\n super();\n this.setNotes(notes);\n this.hairpin = type;\n this.position = Modifier.Position.BELOW;\n this.render_options = {\n height: 10,\n y_shift: 0,\n left_shift_px: 0,\n right_shift_px: 0,\n right_shift_ticks: 0,\n left_shift_ticks: 0,\n };\n }\n static get CATEGORY() {\n return Category.StaveHairpin;\n }\n /* Helper function to convert ticks into pixels.\n * Requires a Formatter with voices joined and formatted (to\n * get pixels per tick)\n *\n * options is struct that has:\n *\n * {\n * height: px,\n * y_shift: px, // vertical offset\n * left_shift_ticks: 0, // left horizontal offset expressed in ticks\n * right_shift_ticks: 0 // right horizontal offset expressed in ticks\n * }\n *\n **/\n static FormatByTicksAndDraw(ctx, formatter, notes, type, position, options) {\n var _a, _b;\n const ppt = formatter.pixelsPerTick;\n if (ppt == null) {\n throw new RuntimeError('BadArguments', 'A valid Formatter must be provide to draw offsets by ticks.');\n }\n const l_shift_px = ppt * ((_a = options.left_shift_ticks) !== null && _a !== void 0 ? _a : 0);\n const r_shift_px = ppt * ((_b = options.right_shift_ticks) !== null && _b !== void 0 ? _b : 0);\n const hairpin_options = {\n height: options.height,\n y_shift: options.y_shift,\n left_shift_px: l_shift_px,\n right_shift_px: r_shift_px,\n right_shift_ticks: 0,\n left_shift_ticks: 0,\n };\n new StaveHairpin({\n first_note: notes.first_note,\n last_note: notes.last_note,\n }, type)\n .setContext(ctx)\n .setRenderOptions(hairpin_options)\n .setPosition(position)\n .draw();\n }\n setPosition(position) {\n if (position === Modifier.Position.ABOVE || position === Modifier.Position.BELOW) {\n this.position = position;\n }\n return this;\n }\n setRenderOptions(options) {\n if (options.height != null &&\n options.y_shift != null &&\n options.left_shift_px != null &&\n options.right_shift_px != null) {\n this.render_options = options;\n }\n return this;\n }\n /**\n * Set the notes to attach this hairpin to.\n *\n * @param {!Object} notes The start and end notes.\n */\n setNotes(notes) {\n if (!notes.first_note && !notes.last_note) {\n throw new RuntimeError('BadArguments', 'Hairpin needs to have either first_note or last_note set.');\n }\n this.notes = notes;\n this.first_note = notes.first_note;\n this.last_note = notes.last_note;\n return this;\n }\n renderHairpin(params) {\n const ctx = this.checkContext();\n let dis = this.render_options.y_shift + 20;\n let y_shift = params.first_y;\n if (this.position === Modifier.Position.ABOVE) {\n dis = -dis + 30;\n y_shift = params.first_y - params.staff_height;\n }\n const l_shift = this.render_options.left_shift_px;\n const r_shift = this.render_options.right_shift_px;\n ctx.beginPath();\n switch (this.hairpin) {\n case StaveHairpin.type.CRESC:\n ctx.moveTo(params.last_x + r_shift, y_shift + dis);\n ctx.lineTo(params.first_x + l_shift, y_shift + this.render_options.height / 2 + dis);\n ctx.lineTo(params.last_x + r_shift, y_shift + this.render_options.height + dis);\n break;\n case StaveHairpin.type.DECRESC:\n ctx.moveTo(params.first_x + l_shift, y_shift + dis);\n ctx.lineTo(params.last_x + r_shift, y_shift + this.render_options.height / 2 + dis);\n ctx.lineTo(params.first_x + l_shift, y_shift + this.render_options.height + dis);\n break;\n default:\n // Default is NONE, so nothing to draw\n break;\n }\n ctx.stroke();\n ctx.closePath();\n }\n draw() {\n this.checkContext();\n this.setRendered();\n const firstNote = this.first_note;\n const lastNote = this.last_note;\n if (!firstNote || !lastNote)\n throw new RuntimeError('NoNote', 'Notes required to draw');\n const start = firstNote.getModifierStartXY(this.position, 0);\n const end = lastNote.getModifierStartXY(this.position, 0);\n this.renderHairpin({\n first_x: start.x,\n last_x: end.x,\n first_y: firstNote.checkStave().getY() + firstNote.checkStave().getHeight(),\n last_y: lastNote.checkStave().getY() + lastNote.checkStave().getHeight(),\n staff_height: firstNote.checkStave().getHeight(),\n });\n }\n}\nStaveHairpin.type = {\n CRESC: 1,\n DECRESC: 2,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// This class implements varies types of ties between contiguous notes. The\n// ties include: regular ties, hammer ons, pull offs, and slides.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { TabTie } from './tabtie';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class TabSlide extends TabTie {\n /**\n * @param notes is a struct of the form:\n * {\n * first_note: Note,\n * last_note: Note,\n * first_indices: [n1, n2, n3],\n * last_indices: [n1, n2, n3]\n * }\n * @param notes.first_note the starting note of the slide\n * @param notes.last_note the ending note of the slide\n * @param notes.first_indices specifies which string + fret positions of the TabNote are used in this slide. zero indexed.\n * @param notes.last_indices currently unused. we assume it's the same as first_indices.\n *\n * @param direction TabSlide.SLIDE_UP or TabSlide.SLIDE_DOWN\n */\n constructor(notes, direction) {\n super(notes, 'sl.');\n // Determine the direction automatically if it is not provided.\n if (!direction) {\n let first_fret = notes.first_note.getPositions()[0].fret;\n if (typeof first_fret === 'string') {\n first_fret = parseInt(first_fret, 10);\n }\n let last_fret = notes.last_note.getPositions()[0].fret;\n if (typeof last_fret === 'string') {\n last_fret = parseInt(last_fret, 10);\n }\n // If either of the frets are 'X', parseInt() above will return NaN.\n // Choose TabSlide.SLIDE_UP by default.\n if (isNaN(first_fret) || isNaN(last_fret)) {\n direction = TabSlide.SLIDE_UP;\n }\n else {\n direction = first_fret > last_fret ? TabSlide.SLIDE_DOWN : TabSlide.SLIDE_UP;\n }\n }\n this.direction = direction;\n this.render_options.cp1 = 11;\n this.render_options.cp2 = 14;\n this.render_options.y_shift = 0.5;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.TabSlide;\n }\n static get SLIDE_UP() {\n return 1;\n }\n static get SLIDE_DOWN() {\n return -1;\n }\n static createSlideUp(notes) {\n return new TabSlide(notes, TabSlide.SLIDE_UP);\n }\n static createSlideDown(notes) {\n return new TabSlide(notes, TabSlide.SLIDE_DOWN);\n }\n renderTie(params) {\n if (params.first_ys.length === 0 || params.last_ys.length === 0) {\n throw new RuntimeError('BadArguments', 'No Y-values to render');\n }\n const ctx = this.checkContext();\n const first_x_px = params.first_x_px;\n const first_ys = params.first_ys;\n const last_x_px = params.last_x_px;\n const direction = params.direction;\n if (direction !== TabSlide.SLIDE_UP && direction !== TabSlide.SLIDE_DOWN) {\n throw new RuntimeError('BadSlide', 'Invalid slide direction');\n }\n // eslint-disable-next-line\n const first_indices = this.notes.first_indices;\n for (let i = 0; i < first_indices.length; ++i) {\n const slide_y = first_ys[first_indices[i]] + this.render_options.y_shift;\n if (isNaN(slide_y)) {\n throw new RuntimeError('BadArguments', 'Bad indices for slide rendering.');\n }\n ctx.beginPath();\n ctx.moveTo(first_x_px, slide_y + 3 * direction);\n ctx.lineTo(last_x_px, slide_y - 3 * direction);\n ctx.closePath();\n ctx.stroke();\n }\n this.setRendered();\n }\n}\nTabSlide.TEXT_FONT = {\n family: Font.SERIF,\n size: 10,\n weight: FontWeight.BOLD,\n style: FontStyle.ITALIC,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Tables } from './tables';\nimport { RuntimeError } from './util';\n/** `Tuning` implements varies types of tunings for tablature. */\nexport class Tuning {\n /**\n * Constructor.\n * @param tuningString tuning name (eg. 'dagdad') or comma separated note strings\n */\n constructor(tuningString = 'E/5,B/4,G/4,D/4,A/3,E/3,B/2,E/2') {\n this.tuningValues = [];\n // Default to standard tuning.\n this.setTuning(tuningString);\n }\n static get names() {\n return {\n standard: 'E/5,B/4,G/4,D/4,A/3,E/3',\n dagdad: 'D/5,A/4,G/4,D/4,A/3,D/3',\n dropd: 'E/5,B/4,G/4,D/4,A/3,D/3',\n eb: 'Eb/5,Bb/4,Gb/4,Db/4,Ab/3,Db/3',\n standardBanjo: 'D/5,B/4,G/4,D/4,G/5',\n };\n }\n /** Return the note number associated to the note string. */\n noteToInteger(noteString) {\n return Tables.keyProperties(noteString).int_value;\n }\n /**\n * Set tuning identified by tuning name (eg. 'dagdad')\n * @param tuningString tuning name (eg. 'dagdad') or comma separated note strings\n */\n setTuning(tuningString) {\n if (Tuning.names[tuningString]) {\n tuningString = Tuning.names[tuningString];\n }\n this.tuningValues = [];\n const keys = tuningString.split(/\\s*,\\s*/);\n if (keys.length === 0) {\n throw new RuntimeError('BadArguments', `Invalid tuning string: ${tuningString}`);\n }\n for (let i = 0; i < keys.length; ++i) {\n this.tuningValues[i] = this.noteToInteger(keys[i]);\n }\n }\n /** Return the note number associated with a tablature string. */\n getValueForString(stringNum) {\n const s = Number(stringNum);\n if (s < 1 || s > this.tuningValues.length) {\n throw new RuntimeError('BadArguments', `String number must be between 1 and ${this.tuningValues.length}:${stringNum}`);\n }\n return this.tuningValues[s - 1];\n }\n /** Return the note number associated with a tablature string and fret. */\n getValueForFret(fretNum, stringNum) {\n const stringValue = this.getValueForString(stringNum);\n const f = Number(fretNum);\n if (f < 0) {\n throw new RuntimeError('BadArguments', `Fret number must be 0 or higher: ${fretNum}`);\n }\n return stringValue + f;\n }\n /** Return the note string associated with tablature string and fret. */\n getNoteForFret(fretNum, stringNum) {\n const noteValue = this.getValueForFret(fretNum, stringNum);\n const octave = Math.floor(noteValue / 12);\n const value = noteValue % 12;\n return `${Tables.integerToNote(value)}/${octave}`;\n }\n}\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { Accidental } from './accidental';\nimport { Annotation } from './annotation';\nimport { Articulation } from './articulation';\nimport { BarNote } from './barnote';\nimport { Beam } from './beam';\nimport { Bend } from './bend';\nimport { BoundingBox } from './boundingbox';\nimport { BoundingBoxComputation } from './boundingboxcomputation';\nimport { CanvasContext } from './canvascontext';\nimport { ChordSymbol } from './chordsymbol';\nimport { Clef } from './clef';\nimport { ClefNote } from './clefnote';\nimport { Crescendo } from './crescendo';\nimport { Curve } from './curve';\nimport { Dot } from './dot';\nimport { EasyScore } from './easyscore';\nimport { Element } from './element';\nimport { Factory } from './factory';\nimport { Font } from './font';\nimport { Formatter } from './formatter';\nimport { Fraction } from './fraction';\nimport { FretHandFinger } from './frethandfinger';\nimport { GhostNote } from './ghostnote';\nimport { Glyph } from './glyph';\nimport { GlyphNote } from './glyphnote';\nimport { GraceNote } from './gracenote';\nimport { GraceNoteGroup } from './gracenotegroup';\nimport { GraceTabNote } from './gracetabnote';\nimport { KeyManager } from './keymanager';\nimport { KeySignature } from './keysignature';\nimport { KeySigNote } from './keysignote';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { ModifierContext } from './modifiercontext';\nimport { MultiMeasureRest } from './multimeasurerest';\nimport { Music } from './music';\nimport { Note } from './note';\nimport { NoteHead } from './notehead';\nimport { NoteSubGroup } from './notesubgroup';\nimport { Ornament } from './ornament';\nimport { Parenthesis } from './parenthesis';\nimport { Parser } from './parser';\nimport { PedalMarking } from './pedalmarking';\nimport { Registry } from './registry';\nimport { RenderContext } from './rendercontext';\nimport { Renderer } from './renderer';\nimport { RepeatNote } from './repeatnote';\nimport { Stave } from './stave';\nimport { Barline, BarlineType } from './stavebarline';\nimport { StaveConnector } from './staveconnector';\nimport { StaveHairpin } from './stavehairpin';\nimport { StaveLine } from './staveline';\nimport { StaveModifier } from './stavemodifier';\nimport { StaveNote } from './stavenote';\nimport { Repetition } from './staverepetition';\nimport { StaveTempo } from './stavetempo';\nimport { StaveText } from './stavetext';\nimport { StaveTie } from './stavetie';\nimport { Volta } from './stavevolta';\nimport { Stem } from './stem';\nimport { StringNumber } from './stringnumber';\nimport { Stroke } from './strokes';\nimport { SVGContext } from './svgcontext';\nimport { System } from './system';\nimport { Tables } from './tables';\nimport { TabNote } from './tabnote';\nimport { TabSlide } from './tabslide';\nimport { TabStave } from './tabstave';\nimport { TabTie } from './tabtie';\nimport { TextBracket } from './textbracket';\nimport { TextDynamics } from './textdynamics';\nimport { TextFormatter } from './textformatter';\nimport { TextNote } from './textnote';\nimport { TickContext } from './tickcontext';\nimport { TimeSignature } from './timesignature';\nimport { TimeSigNote } from './timesignote';\nimport { Tremolo } from './tremolo';\nimport { Tuning } from './tuning';\nimport { Tuplet } from './tuplet';\nimport { DATE, ID, VERSION } from './version';\nimport { Vibrato } from './vibrato';\nimport { VibratoBracket } from './vibratobracket';\nimport { Voice } from './voice';\nexport class Flow {\n static get BUILD() {\n return {\n /** version number. */\n VERSION: VERSION,\n /** git commit ID that this library was built from. */\n ID: ID,\n /** The date when this library was compiled. */\n DATE: DATE,\n };\n }\n static get Flow() {\n // This (circular reference) provides a handy shortcut for importing VexFlow via `require()`.\n // For example:\n // const Vex = require('vexflow');\n // const { Flow, Stave, StaveNote, Formatter, Renderer } = Vex.Flow;\n return Flow;\n }\n // ... more to come ...\n /**\n * Examples:\n * ```\n * Vex.Flow.setMusicFont('Petaluma');\n * Vex.Flow.setMusicFont('Bravura', 'Gonville');\n * ```\n *\n * **CASE 1**: You are using `vexflow.js`, which includes all music fonts (Bravura, Gonville, Petaluma, Custom).\n * In this case, calling this method is optional, since VexFlow already defaults to a music font stack of:\n * 'Bravura', 'Gonville', 'Custom'.\n *\n * **CASE 2**: You are using `vexflow-bravura.js` or `vexflow-petaluma.js` or `vexflow-gonville.js`,\n * which includes a single music font. Calling this method is unnecessary.\n *\n * **CASE 3**: You are using the light weight `vexflow-core.js` to take advantage of lazy loading for fonts.\n * In this case, the default music font stack is empty.\n * Example:\n * ```\n * await Vex.Flow.fetchMusicFont('Petaluma');\n * Vex.Flow.setMusicFont('Petaluma');\n * ... (do VexFlow stuff) ...\n * ```\n * See `demos/fonts/` for more examples.\n *\n * @returns an array of Font objects corresponding to the provided `fontNames`.\n */\n static setMusicFont(...fontNames) {\n // Convert the array of font names into an array of Font objects.\n const fonts = fontNames.map((fontName) => Font.load(fontName));\n Tables.MUSIC_FONT_STACK = fonts;\n Glyph.MUSIC_FONT_STACK = fonts.slice();\n Glyph.CURRENT_CACHE_KEY = fontNames.join(',');\n return fonts;\n }\n /**\n * Used with vexflow-core which supports dynamic font loading.\n */\n // eslint-disable-next-line\n static fetchMusicFont(fontName, fontModuleOrPath) {\n return __awaiter(this, void 0, void 0, function* () {\n // The default implementation does nothing.\n // See vexflow-core.ts for the implementation that vexflow-core.js uses.\n });\n }\n static getMusicFont() {\n const fonts = Tables.MUSIC_FONT_STACK;\n return fonts.map((font) => font.getName());\n }\n static get NOTATION_FONT_SCALE() {\n return Tables.NOTATION_FONT_SCALE;\n }\n static set NOTATION_FONT_SCALE(value) {\n Tables.NOTATION_FONT_SCALE = value;\n }\n static get TABLATURE_FONT_SCALE() {\n return Tables.TABLATURE_FONT_SCALE;\n }\n static set TABLATURE_FONT_SCALE(value) {\n Tables.TABLATURE_FONT_SCALE = value;\n }\n static get RESOLUTION() {\n return Tables.RESOLUTION;\n }\n static set RESOLUTION(value) {\n Tables.RESOLUTION = value;\n }\n static get SLASH_NOTEHEAD_WIDTH() {\n return Tables.SLASH_NOTEHEAD_WIDTH;\n }\n static set SLASH_NOTEHEAD_WIDTH(value) {\n Tables.SLASH_NOTEHEAD_WIDTH = value;\n }\n static get STAVE_LINE_DISTANCE() {\n return Tables.STAVE_LINE_DISTANCE;\n }\n static set STAVE_LINE_DISTANCE(value) {\n Tables.STAVE_LINE_DISTANCE = value;\n }\n static get STAVE_LINE_THICKNESS() {\n return Tables.STAVE_LINE_THICKNESS;\n }\n static set STAVE_LINE_THICKNESS(value) {\n Tables.STAVE_LINE_THICKNESS = value;\n }\n static get STEM_HEIGHT() {\n return Tables.STEM_HEIGHT;\n }\n static set STEM_HEIGHT(value) {\n Tables.STEM_HEIGHT = value;\n }\n static get STEM_WIDTH() {\n return Tables.STEM_WIDTH;\n }\n static set STEM_WIDTH(value) {\n Tables.STEM_WIDTH = value;\n }\n static get TIME4_4() {\n return Tables.TIME4_4;\n }\n static get accidentalMap() {\n return Tables.accidentalMap;\n }\n static get unicode() {\n return Tables.unicode;\n }\n static keySignature(spec) {\n return Tables.keySignature(spec);\n }\n static hasKeySignature(spec) {\n return Tables.hasKeySignature(spec);\n }\n static getKeySignatures() {\n return Tables.getKeySignatures();\n }\n static clefProperties(clef) {\n return Tables.clefProperties(clef);\n }\n // eslint-disable-next-line\n static keyProperties(key, clef, params) {\n return Tables.keyProperties(key, clef, params);\n }\n static durationToTicks(duration) {\n return Tables.durationToTicks(duration);\n }\n}\nFlow.Accidental = Accidental;\nFlow.Annotation = Annotation;\nFlow.Articulation = Articulation;\nFlow.Barline = Barline;\nFlow.BarNote = BarNote;\nFlow.Beam = Beam;\nFlow.Bend = Bend;\nFlow.BoundingBox = BoundingBox;\nFlow.BoundingBoxComputation = BoundingBoxComputation;\nFlow.CanvasContext = CanvasContext;\nFlow.ChordSymbol = ChordSymbol;\nFlow.Clef = Clef;\nFlow.ClefNote = ClefNote;\nFlow.Crescendo = Crescendo;\nFlow.Curve = Curve;\nFlow.Dot = Dot;\nFlow.EasyScore = EasyScore;\nFlow.Element = Element;\nFlow.Factory = Factory;\nFlow.Font = Font;\nFlow.Formatter = Formatter;\nFlow.Fraction = Fraction;\nFlow.FretHandFinger = FretHandFinger;\nFlow.GhostNote = GhostNote;\nFlow.Glyph = Glyph;\nFlow.GlyphNote = GlyphNote;\nFlow.GraceNote = GraceNote;\nFlow.GraceNoteGroup = GraceNoteGroup;\nFlow.GraceTabNote = GraceTabNote;\nFlow.KeyManager = KeyManager;\nFlow.KeySignature = KeySignature;\nFlow.KeySigNote = KeySigNote;\nFlow.Modifier = Modifier;\nFlow.ModifierContext = ModifierContext;\nFlow.MultiMeasureRest = MultiMeasureRest;\nFlow.Music = Music;\nFlow.Note = Note;\nFlow.NoteHead = NoteHead;\nFlow.NoteSubGroup = NoteSubGroup;\nFlow.Ornament = Ornament;\nFlow.Parenthesis = Parenthesis;\nFlow.Parser = Parser;\nFlow.PedalMarking = PedalMarking;\nFlow.Registry = Registry;\nFlow.RenderContext = RenderContext;\nFlow.Renderer = Renderer;\nFlow.RepeatNote = RepeatNote;\nFlow.Repetition = Repetition;\nFlow.Stave = Stave;\nFlow.StaveConnector = StaveConnector;\nFlow.StaveHairpin = StaveHairpin;\nFlow.StaveLine = StaveLine;\nFlow.StaveModifier = StaveModifier;\nFlow.StaveNote = StaveNote;\nFlow.StaveTempo = StaveTempo;\nFlow.StaveText = StaveText;\nFlow.StaveTie = StaveTie;\nFlow.Stem = Stem;\nFlow.StringNumber = StringNumber;\nFlow.Stroke = Stroke;\nFlow.SVGContext = SVGContext;\nFlow.System = System;\nFlow.TabNote = TabNote;\nFlow.TabSlide = TabSlide;\nFlow.TabStave = TabStave;\nFlow.TabTie = TabTie;\nFlow.TextBracket = TextBracket;\nFlow.TextDynamics = TextDynamics;\nFlow.TextFormatter = TextFormatter;\nFlow.TextNote = TextNote;\nFlow.TickContext = TickContext;\nFlow.TimeSignature = TimeSignature;\nFlow.TimeSigNote = TimeSigNote;\nFlow.Tremolo = Tremolo;\nFlow.Tuning = Tuning;\nFlow.Tuplet = Tuplet;\nFlow.Vibrato = Vibrato;\nFlow.VibratoBracket = VibratoBracket;\nFlow.Voice = Voice;\nFlow.Volta = Volta;\n// enums need to be exported too!\nFlow.BarlineType = BarlineType;\nFlow.ModifierPosition = ModifierPosition;\n","export const VERSION = '4.0.1-alpha.2';\nexport const ID = '0df10df6d1fab3a99f5aa306341a31c6e686d659';\nexport const DATE = '2022-02-02T09:30:30.784Z';\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Balazs Forian-Szabo\n//\n// ## Description\n//\n// A basic implementation of grace notes\n// to be rendered on a tab stave.\n//\n// See `tests/gracetabnote_tests.ts` for usage examples.\nimport { Font } from './font';\nimport { TabNote } from './tabnote';\nimport { Category } from './typeguard';\nexport class GraceTabNote extends TabNote {\n static get CATEGORY() {\n return Category.GraceTabNote;\n }\n constructor(noteStruct) {\n super(noteStruct, false);\n this.render_options = Object.assign(Object.assign({}, this.render_options), { \n // vertical shift from stave line\n y_shift: 0.3, \n // grace glyph scale\n scale: 0.6, \n // grace tablature font\n font: `7.5pt ${Font.SANS_SERIF}` });\n this.updateWidth();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This class implements diatonic key management.\nimport { Music } from './music';\nimport { RuntimeError } from './util';\nexport class KeyManager {\n constructor(key) {\n this.music = new Music();\n this.setKey(key);\n }\n setKey(key) {\n this.key = key;\n this.reset();\n return this;\n }\n getKey() {\n return this.key;\n }\n reset() {\n this.keyParts = this.music.getKeyParts(this.key);\n this.keyString = this.keyParts.root;\n if (this.keyParts.accidental)\n this.keyString += this.keyParts.accidental;\n const is_supported_type = Music.scaleTypes[this.keyParts.type];\n if (!is_supported_type) {\n throw new RuntimeError('BadArguments', `Unsupported key type: ${this.key}`);\n }\n this.scale = this.music.getScaleTones(this.music.getNoteValue(this.keyString), Music.scaleTypes[this.keyParts.type]);\n this.scaleMap = {};\n this.scaleMapByValue = {};\n this.originalScaleMapByValue = {};\n const noteLocation = Music.root_indices[this.keyParts.root];\n for (let i = 0; i < Music.roots.length; ++i) {\n const index = (noteLocation + i) % Music.roots.length;\n const rootName = Music.roots[index];\n const noteName = this.music.getRelativeNoteName(rootName, this.scale[i]);\n this.scaleMap[rootName] = noteName;\n this.scaleMapByValue[this.scale[i]] = noteName;\n this.originalScaleMapByValue[this.scale[i]] = noteName;\n }\n return this;\n }\n getAccidental(key) {\n const root = this.music.getKeyParts(key).root;\n const parts = this.music.getNoteParts(this.scaleMap[root]);\n return {\n note: this.scaleMap[root],\n accidental: parts.accidental,\n };\n }\n selectNote(note) {\n note = note.toLowerCase();\n const parts = this.music.getNoteParts(note);\n // First look for matching note in our altered scale\n const scaleNote = this.scaleMap[parts.root];\n const modparts = this.music.getNoteParts(scaleNote);\n if (scaleNote === note) {\n return {\n note: scaleNote,\n accidental: parts.accidental,\n change: false,\n };\n }\n // Then search for a note of equivalent value in our altered scale\n const valueNote = this.scaleMapByValue[this.music.getNoteValue(note)];\n if (valueNote != null) {\n return {\n note: valueNote,\n accidental: this.music.getNoteParts(valueNote).accidental,\n change: false,\n };\n }\n // Then search for a note of equivalent value in the original scale\n const originalValueNote = this.originalScaleMapByValue[this.music.getNoteValue(note)];\n if (originalValueNote != null) {\n this.scaleMap[modparts.root] = originalValueNote;\n delete this.scaleMapByValue[this.music.getNoteValue(scaleNote)];\n this.scaleMapByValue[this.music.getNoteValue(note)] = originalValueNote;\n return {\n note: originalValueNote,\n accidental: this.music.getNoteParts(originalValueNote).accidental,\n change: true,\n };\n }\n // Then try to unmodify a currently modified note.\n if (modparts.root === note) {\n delete this.scaleMapByValue[this.music.getNoteValue(this.scaleMap[parts.root])];\n this.scaleMapByValue[this.music.getNoteValue(modparts.root)] = modparts.root;\n this.scaleMap[modparts.root] = modparts.root;\n return {\n note: modparts.root,\n accidental: undefined,\n change: true,\n };\n }\n // Last resort -- shitshoot\n delete this.scaleMapByValue[this.music.getNoteValue(this.scaleMap[parts.root])];\n this.scaleMapByValue[this.music.getNoteValue(note)] = note;\n delete this.scaleMap[modparts.root];\n this.scaleMap[modparts.root] = note;\n return {\n note,\n accidental: parts.accidental,\n change: true,\n };\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Mike Corrigan \n// MIT License\nimport { Glyph } from './glyph';\nimport { GraceNote } from './gracenote';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category, isGraceNote } from './typeguard';\n/** Tremolo implements tremolo notation. */\nexport class Tremolo extends Modifier {\n /**\n * @param num number of bars\n */\n constructor(num) {\n super();\n this.num = num;\n this.position = Modifier.Position.CENTER;\n this.code = 'tremolo1';\n // big strokes scales initialised to 1 (no scale)\n this.y_spacing_scale = 1;\n this.extra_stroke_scale = 1;\n }\n static get CATEGORY() {\n return Category.Tremolo;\n }\n /** Draw the tremolo on the rendering context. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const stemDirection = note.getStemDirection();\n const start = note.getModifierStartXY(this.position, this.index);\n let x = start.x;\n const gn = isGraceNote(note);\n const scale = gn ? GraceNote.SCALE : 1;\n const category = `tremolo.${gn ? 'grace' : 'default'}`;\n const musicFont = Tables.currentMusicFont();\n let y_spacing = musicFont.lookupMetric(`${category}.spacing`) * stemDirection;\n // add y_spacing_scale for big strokes (#1258)\n y_spacing *= this.y_spacing_scale;\n const height = this.num * y_spacing;\n let y = note.getStemExtents().baseY - height;\n if (stemDirection < 0) {\n y += musicFont.lookupMetric(`${category}.offsetYStemDown`) * scale;\n }\n else {\n y += musicFont.lookupMetric(`${category}.offsetYStemUp`) * scale;\n }\n const fontScale = musicFont.lookupMetric(`${category}.point`);\n x += musicFont.lookupMetric(`${category}.offsetXStem${stemDirection === Stem.UP ? 'Up' : 'Down'}`);\n for (let i = 0; i < this.num; ++i) {\n Glyph.renderGlyph(ctx, x, y, fontScale, this.code, { category, scale: this.extra_stroke_scale });\n y += y_spacing;\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// Utility methods used by the rest of the VexFlow codebase.\nimport { Flow } from './flow';\nimport { log, RuntimeError } from './util';\nexport class Vex {\n // Users of `Vex.forEach(a, fn)` should use `Array.prototype.forEach()` instead.\n // static forEach(arr: T[], callbackFn: (value: T, index: number, array: T[]) => void) {\n // arr.forEach(callbackFn);\n // }\n /**\n * Take `arr` and return a new list consisting of the sorted, unique,\n * contents of arr. Does not modify `arr`.\n */\n // eslint-disable-next-line\n static sortAndUnique(arr, cmp, eq) {\n if (arr.length > 1) {\n const newArr = [];\n let last;\n arr.sort(cmp);\n for (let i = 0; i < arr.length; ++i) {\n if (i === 0 || !eq(arr[i], last)) {\n newArr.push(arr[i]);\n }\n last = arr[i];\n }\n return newArr;\n }\n else {\n return arr;\n }\n }\n /** Check if array `arr` contains `obj`. */\n // eslint-disable-next-line\n static contains(arr, obj) {\n let i = arr.length;\n while (i--) {\n if (arr[i] === obj) {\n return true;\n }\n }\n return false;\n }\n // Get the 2D Canvas context from DOM element `canvas_sel`.\n static getCanvasContext(canvasSelector) {\n if (!canvasSelector) {\n throw new RuntimeError('BadArgument', 'Invalid canvas selector: ' + canvasSelector);\n }\n const canvas = document.getElementById(canvasSelector);\n if (!(canvas && canvas.getContext)) {\n throw new RuntimeError('UnsupportedBrowserError', 'This browser does not support HTML5 Canvas');\n }\n return canvas.getContext('2d');\n }\n /** Benchmark. Run function `f` once and report time elapsed shifted by `s` milliseconds. */\n // eslint-disable-next-line\n static benchmark(s, f) {\n const start_time = new Date().getTime();\n f();\n const elapsed = new Date().getTime() - start_time;\n log(s, elapsed + 'ms');\n }\n // Get stack trace.\n static stackTrace() {\n const err = new Error();\n return err.stack;\n }\n}\nVex.Flow = Flow;\n","export const PetalumaScriptFont = {\n spacing: 50,\n glyphs: {\n ' ': {\n x_min: 0,\n x_max: 250,\n y_min: 0,\n y_max: 500,\n ha: 500,\n leftSideBearing: 0,\n advanceWidth: 250,\n },\n '0': {\n x_min: 33,\n x_max: 534,\n y_min: -13,\n y_max: 751,\n ha: 764,\n leftSideBearing: 33,\n advanceWidth: 570,\n },\n '1': {\n x_min: 48,\n x_max: 235,\n y_min: -17,\n y_max: 734,\n ha: 751,\n leftSideBearing: 48,\n advanceWidth: 286,\n },\n '2': {\n x_min: 56,\n x_max: 571,\n y_min: -19,\n y_max: 741,\n ha: 760,\n leftSideBearing: 56,\n advanceWidth: 626,\n },\n '3': {\n x_min: 50,\n x_max: 528,\n y_min: -7,\n y_max: 731,\n ha: 738,\n leftSideBearing: 50,\n advanceWidth: 589,\n },\n '4': {\n x_min: 38,\n x_max: 564,\n y_min: -13,\n y_max: 743,\n ha: 756,\n leftSideBearing: 38,\n advanceWidth: 614,\n },\n '5': {\n x_min: 42,\n x_max: 601,\n y_min: -34,\n y_max: 743,\n ha: 777,\n leftSideBearing: 42,\n advanceWidth: 648,\n },\n '6': {\n x_min: 47,\n x_max: 606,\n y_min: -16,\n y_max: 743,\n ha: 759,\n leftSideBearing: 47,\n advanceWidth: 667,\n },\n '7': {\n x_min: 47,\n x_max: 567,\n y_min: 5,\n y_max: 739,\n ha: 734,\n leftSideBearing: 0,\n advanceWidth: 615,\n },\n '8': {\n x_min: 40,\n x_max: 541,\n y_min: -15,\n y_max: 752,\n ha: 767,\n leftSideBearing: 40,\n advanceWidth: 585,\n },\n '9': {\n x_min: 40,\n x_max: 537,\n y_min: -52,\n y_max: 736,\n ha: 788,\n leftSideBearing: 40,\n advanceWidth: 592,\n },\n '!': {\n x_min: 49,\n x_max: 180,\n y_min: -7,\n y_max: 761,\n ha: 768,\n leftSideBearing: 49,\n advanceWidth: 230,\n },\n '\"': {\n x_min: 39,\n x_max: 304,\n y_min: 596,\n y_max: 804,\n ha: 208,\n leftSideBearing: 39,\n advanceWidth: 353,\n },\n '#': {\n x_min: 33,\n x_max: 599,\n y_min: -8,\n y_max: 765,\n ha: 773,\n leftSideBearing: 33,\n advanceWidth: 648,\n },\n $: {\n x_min: 53,\n x_max: 495,\n y_min: -111,\n y_max: 823,\n ha: 934,\n leftSideBearing: 53,\n advanceWidth: 560,\n },\n '%': {\n x_min: 35,\n x_max: 656,\n y_min: -128,\n y_max: 808,\n ha: 936,\n leftSideBearing: 35,\n advanceWidth: 711,\n },\n '&': {\n x_min: 53,\n x_max: 441,\n y_min: -3,\n y_max: 753,\n ha: 756,\n leftSideBearing: 53,\n advanceWidth: 500,\n },\n \"'\": {\n x_min: 43,\n x_max: 161,\n y_min: 590,\n y_max: 811,\n ha: 221,\n leftSideBearing: 43,\n advanceWidth: 217,\n },\n '(': {\n x_min: 41,\n x_max: 311,\n y_min: -36,\n y_max: 845,\n ha: 881,\n leftSideBearing: 41,\n advanceWidth: 308,\n },\n ')': {\n x_min: -8,\n x_max: 257,\n y_min: -21,\n y_max: 852,\n ha: 873,\n leftSideBearing: -8,\n advanceWidth: 280,\n },\n '*': {\n x_min: 59,\n x_max: 539,\n y_min: 175,\n y_max: 589,\n ha: 414,\n leftSideBearing: 59,\n advanceWidth: 601,\n },\n '+': {\n x_min: 33,\n x_max: 361,\n y_min: 180,\n y_max: 587,\n ha: 407,\n leftSideBearing: 33,\n advanceWidth: 400,\n },\n ',': {\n x_min: 15,\n x_max: 176,\n y_min: -129,\n y_max: 92,\n ha: 221,\n leftSideBearing: 15,\n advanceWidth: 205,\n },\n '-': {\n x_min: 40,\n x_max: 380,\n y_min: 317,\n y_max: 452,\n ha: 135,\n leftSideBearing: 40,\n advanceWidth: 422,\n },\n '.': {\n x_min: 48,\n x_max: 185,\n y_min: -56,\n y_max: 84,\n ha: 140,\n leftSideBearing: 48,\n advanceWidth: 227,\n },\n '/': {\n x_min: -58,\n x_max: 654,\n y_min: -122,\n y_max: 844,\n ha: 966,\n leftSideBearing: -58,\n advanceWidth: 626,\n },\n ':': {\n x_min: 65,\n x_max: 225,\n y_min: 97,\n y_max: 536,\n ha: 439,\n leftSideBearing: 65,\n advanceWidth: 302,\n },\n ';': {\n x_min: 13,\n x_max: 295,\n y_min: -139,\n y_max: 536,\n ha: 675,\n leftSideBearing: 13,\n advanceWidth: 334,\n },\n '<': {\n x_min: 28,\n x_max: 438,\n y_min: -1,\n y_max: 607,\n ha: 608,\n leftSideBearing: 28,\n advanceWidth: 475,\n },\n '=': {\n x_min: 40,\n x_max: 383,\n y_min: 199.9598640852289,\n y_max: 541,\n ha: 341.0401359147711,\n leftSideBearing: 40,\n advanceWidth: 422,\n },\n '>': {\n x_min: 35,\n x_max: 421,\n y_min: 28,\n y_max: 632,\n ha: 604,\n leftSideBearing: 35,\n advanceWidth: 466,\n },\n '?': {\n x_min: 45,\n x_max: 548,\n y_min: -17,\n y_max: 767,\n ha: 784,\n leftSideBearing: 45,\n advanceWidth: 592,\n },\n '@': {\n x_min: 51,\n x_max: 730,\n y_min: -78,\n y_max: 753,\n ha: 831,\n leftSideBearing: 51,\n advanceWidth: 781,\n },\n A: {\n x_min: 37,\n x_max: 554,\n y_min: -4,\n y_max: 746,\n ha: 750,\n leftSideBearing: 37,\n advanceWidth: 617,\n },\n B: {\n x_min: 37,\n x_max: 532,\n y_min: 3,\n y_max: 783,\n ha: 780,\n leftSideBearing: 37,\n advanceWidth: 579,\n },\n C: {\n x_min: 37,\n x_max: 583,\n y_min: -3,\n y_max: 775,\n ha: 778,\n leftSideBearing: 37,\n advanceWidth: 623,\n },\n D: {\n x_min: 50,\n x_max: 530,\n y_min: -15,\n y_max: 749,\n ha: 764,\n leftSideBearing: 50,\n advanceWidth: 579,\n },\n E: {\n x_min: 45,\n x_max: 531,\n y_min: -1,\n y_max: 743,\n ha: 744,\n leftSideBearing: 45,\n advanceWidth: 585,\n },\n F: {\n x_min: 45,\n x_max: 459,\n y_min: 23,\n y_max: 727,\n ha: 704,\n leftSideBearing: 45,\n advanceWidth: 510,\n },\n G: {\n x_min: 31,\n x_max: 577,\n y_min: -8,\n y_max: 733,\n ha: 741,\n leftSideBearing: 31,\n advanceWidth: 611,\n },\n H: {\n x_min: 37,\n x_max: 493,\n y_min: -22,\n y_max: 758,\n ha: 780,\n leftSideBearing: 37,\n advanceWidth: 535,\n },\n I: {\n x_min: 47,\n x_max: 501,\n y_min: -3,\n y_max: 731,\n ha: 734,\n leftSideBearing: 47,\n advanceWidth: 541,\n },\n J: {\n x_min: 33,\n x_max: 531,\n y_min: -23,\n y_max: 725,\n ha: 748,\n leftSideBearing: 33,\n advanceWidth: 573,\n },\n K: {\n x_min: 43,\n x_max: 505,\n y_min: -10,\n y_max: 740,\n ha: 750,\n leftSideBearing: 43,\n advanceWidth: 560,\n },\n L: {\n x_min: 49,\n x_max: 457,\n y_min: -2,\n y_max: 746,\n ha: 748,\n leftSideBearing: 49,\n advanceWidth: 510,\n },\n M: {\n x_min: 35,\n x_max: 699,\n y_min: 1,\n y_max: 744,\n ha: 743,\n leftSideBearing: 35,\n advanceWidth: 743,\n },\n N: {\n x_min: 34,\n x_max: 533,\n y_min: -17,\n y_max: 761,\n ha: 778,\n leftSideBearing: 34,\n advanceWidth: 579,\n },\n O: {\n x_min: 41,\n x_max: 608,\n y_min: -5,\n y_max: 735,\n ha: 740,\n leftSideBearing: 41,\n advanceWidth: 667,\n },\n P: {\n x_min: 53,\n x_max: 451,\n y_min: -18,\n y_max: 735,\n ha: 753,\n leftSideBearing: 53,\n advanceWidth: 497,\n },\n Q: {\n x_min: 40,\n x_max: 599,\n y_min: -67,\n y_max: 744,\n ha: 811,\n leftSideBearing: 40,\n advanceWidth: 648,\n },\n R: {\n x_min: 39,\n x_max: 487,\n y_min: 16,\n y_max: 735,\n ha: 719,\n leftSideBearing: 39,\n advanceWidth: 535,\n },\n S: {\n x_min: 35,\n x_max: 552,\n y_min: -47,\n y_max: 708,\n ha: 755,\n leftSideBearing: 35,\n advanceWidth: 604,\n },\n T: {\n x_min: 26,\n x_max: 656,\n y_min: -13,\n y_max: 718,\n ha: 731,\n leftSideBearing: 26,\n advanceWidth: 705,\n },\n U: {\n x_min: 41,\n x_max: 518,\n y_min: -20,\n y_max: 748,\n ha: 768,\n leftSideBearing: 41,\n advanceWidth: 567,\n },\n V: {\n x_min: 47,\n x_max: 509,\n y_min: -26,\n y_max: 744,\n ha: 770,\n leftSideBearing: 47,\n advanceWidth: 567,\n },\n W: {\n x_min: 44,\n x_max: 789,\n y_min: -35,\n y_max: 720,\n ha: 755,\n leftSideBearing: 44,\n advanceWidth: 833,\n },\n X: {\n x_min: 63,\n x_max: 635,\n y_min: -10,\n y_max: 745,\n ha: 755,\n leftSideBearing: 63,\n advanceWidth: 680,\n },\n Y: {\n x_min: 43,\n x_max: 503,\n y_min: -21,\n y_max: 734,\n ha: 755,\n leftSideBearing: 43,\n advanceWidth: 541,\n },\n Z: {\n x_min: 42,\n x_max: 584,\n y_min: -10,\n y_max: 739,\n ha: 749,\n leftSideBearing: 42,\n advanceWidth: 629,\n },\n '[': {\n x_min: 46,\n x_max: 346,\n y_min: -150,\n y_max: 884,\n ha: 1034,\n leftSideBearing: 46,\n advanceWidth: 291,\n },\n '\\\\': {\n x_min: 20,\n x_max: 616,\n y_min: -100,\n y_max: 797,\n ha: 897,\n leftSideBearing: 20,\n advanceWidth: 645,\n },\n ']': {\n x_min: -76,\n x_max: 226,\n y_min: -150,\n y_max: 881,\n ha: 1031,\n leftSideBearing: -76,\n advanceWidth: 297,\n },\n '^': {\n x_min: 43,\n x_max: 437,\n y_min: 517,\n y_max: 812,\n ha: 295,\n leftSideBearing: 43,\n advanceWidth: 478,\n },\n _: {\n x_min: 29,\n x_max: 563,\n y_min: -110,\n y_max: -1,\n ha: 109,\n leftSideBearing: 29,\n advanceWidth: 598,\n },\n '`': {\n x_min: 54,\n x_max: 321,\n y_min: 540,\n y_max: 747,\n ha: 207,\n leftSideBearing: 54,\n advanceWidth: 368,\n },\n a: {\n x_min: 20,\n x_max: 447,\n y_min: -17,\n y_max: 495,\n ha: 512,\n leftSideBearing: 20,\n advanceWidth: 494,\n },\n b: {\n x_min: 37,\n x_max: 466,\n y_min: -27,\n y_max: 770,\n ha: 797,\n leftSideBearing: 37,\n advanceWidth: 510,\n },\n c: {\n x_min: 35,\n x_max: 456,\n y_min: -9,\n y_max: 507,\n ha: 516,\n leftSideBearing: 35,\n advanceWidth: 460,\n },\n d: {\n x_min: 45,\n x_max: 520,\n y_min: -15,\n y_max: 764,\n ha: 779,\n leftSideBearing: 45,\n advanceWidth: 560,\n },\n e: {\n x_min: 33,\n x_max: 370,\n y_min: -5,\n y_max: 501,\n ha: 506,\n leftSideBearing: 33,\n advanceWidth: 397,\n },\n f: {\n x_min: 35,\n x_max: 411,\n y_min: -13,\n y_max: 695,\n ha: 708,\n leftSideBearing: 35,\n advanceWidth: 453,\n },\n g: {\n x_min: 33,\n x_max: 551,\n y_min: -257,\n y_max: 505,\n ha: 762,\n leftSideBearing: 33,\n advanceWidth: 611,\n },\n h: {\n x_min: 32,\n x_max: 458,\n y_min: -29,\n y_max: 743,\n ha: 772,\n leftSideBearing: 32,\n advanceWidth: 491,\n },\n i: {\n x_min: 45,\n x_max: 167,\n y_min: -13,\n y_max: 631,\n ha: 644,\n leftSideBearing: 45,\n advanceWidth: 220,\n },\n j: {\n x_min: -127,\n x_max: 261,\n y_min: -231,\n y_max: 601,\n ha: 832,\n leftSideBearing: -127,\n advanceWidth: 308,\n },\n k: {\n x_min: 39,\n x_max: 443,\n y_min: -3,\n y_max: 700,\n ha: 703,\n leftSideBearing: 39,\n advanceWidth: 497,\n },\n l: {\n x_min: 58,\n x_max: 168,\n y_min: -8,\n y_max: 686,\n ha: 694,\n leftSideBearing: 58,\n advanceWidth: 227,\n },\n m: {\n x_min: 39,\n x_max: 688,\n y_min: -14,\n y_max: 501,\n ha: 515,\n leftSideBearing: 39,\n advanceWidth: 718,\n },\n n: {\n x_min: 45,\n x_max: 491,\n y_min: -32,\n y_max: 512,\n ha: 544,\n leftSideBearing: 45,\n advanceWidth: 541,\n },\n o: {\n x_min: 41,\n x_max: 424,\n y_min: -12,\n y_max: 493,\n ha: 505,\n leftSideBearing: 41,\n advanceWidth: 447,\n },\n p: {\n x_min: 25,\n x_max: 529,\n y_min: -260,\n y_max: 500,\n ha: 760,\n leftSideBearing: 25,\n advanceWidth: 573,\n },\n q: {\n x_min: 53,\n x_max: 603,\n y_min: -235,\n y_max: 514,\n ha: 749,\n leftSideBearing: 53,\n advanceWidth: 623,\n },\n r: {\n x_min: 32,\n x_max: 407,\n y_min: -7,\n y_max: 492,\n ha: 499,\n leftSideBearing: 32,\n advanceWidth: 460,\n },\n s: {\n x_min: 49,\n x_max: 416,\n y_min: -12,\n y_max: 519,\n ha: 531,\n leftSideBearing: 49,\n advanceWidth: 460,\n },\n t: {\n x_min: 32,\n x_max: 442,\n y_min: -5,\n y_max: 684,\n ha: 689,\n leftSideBearing: 32,\n advanceWidth: 469,\n },\n u: {\n x_min: 41,\n x_max: 487,\n y_min: -5,\n y_max: 507,\n ha: 512,\n leftSideBearing: 41,\n advanceWidth: 510,\n },\n v: {\n x_min: 16,\n x_max: 441,\n y_min: -20,\n y_max: 542,\n ha: 562,\n leftSideBearing: 16,\n advanceWidth: 456,\n },\n w: {\n x_min: 39,\n x_max: 639,\n y_min: -22,\n y_max: 505,\n ha: 527,\n leftSideBearing: 39,\n advanceWidth: 661,\n },\n x: {\n x_min: 15,\n x_max: 505,\n y_min: -39,\n y_max: 539,\n ha: 578,\n leftSideBearing: 15,\n advanceWidth: 541,\n },\n y: {\n x_min: -98,\n x_max: 501,\n y_min: -242,\n y_max: 511,\n ha: 753,\n leftSideBearing: -98,\n advanceWidth: 548,\n },\n z: {\n x_min: 27,\n x_max: 479,\n y_min: -3,\n y_max: 494,\n ha: 497,\n leftSideBearing: 27,\n advanceWidth: 494,\n },\n '{': {\n x_min: 0,\n x_max: 0,\n y_min: 0,\n y_max: 0,\n ha: 0,\n leftSideBearing: 0,\n advanceWidth: 308,\n },\n '|': {\n x_min: 0,\n x_max: 0,\n y_min: 0,\n y_max: 0,\n ha: 0,\n leftSideBearing: 0,\n advanceWidth: 308,\n },\n '}': {\n x_min: 0,\n x_max: 0,\n y_min: 0,\n y_max: 0,\n ha: 0,\n leftSideBearing: 0,\n advanceWidth: 308,\n },\n '~': {\n x_min: 0,\n x_max: 0,\n y_min: 0,\n y_max: 0,\n ha: 0,\n leftSideBearing: 0,\n advanceWidth: 308,\n },\n },\n fontFamily: 'PetalumaScript',\n resolution: 1000,\n generatedOn: '2020-06-14T18:33:25.407Z',\n};\n","export const RobotoSlabFont = {\n spacing: 50,\n glyphs: {\n ' ': {\n x_min: 0,\n x_max: 509,\n y_min: 0,\n y_max: 2000,\n ha: 2000,\n leftSideBearing: 0,\n advanceWidth: 509,\n },\n '0': {\n x_min: 121,\n x_max: 1048,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 121,\n advanceWidth: 1168,\n },\n '1': {\n x_min: 117,\n x_max: 767,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 117,\n advanceWidth: 844,\n },\n '2': {\n x_min: 75.8474576645637,\n x_max: 1040,\n y_min: 0,\n y_max: 1477,\n ha: 1477,\n leftSideBearing: 75,\n advanceWidth: 1131,\n },\n '3': {\n x_min: 74.85365853658536,\n x_max: 994,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 74,\n advanceWidth: 1106,\n },\n '4': {\n x_min: 63,\n x_max: 1114,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 63,\n advanceWidth: 1187,\n },\n '5': {\n x_min: 96.8448275474953,\n x_max: 982,\n y_min: -21,\n y_max: 1456,\n ha: 1477,\n leftSideBearing: 96,\n advanceWidth: 1081,\n },\n '6': {\n x_min: 121,\n x_max: 1067,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 121,\n advanceWidth: 1144,\n },\n '7': {\n x_min: 76,\n x_max: 1060,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: -30,\n advanceWidth: 1128,\n },\n '8': {\n x_min: 92,\n x_max: 1039,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 92,\n advanceWidth: 1131,\n },\n '9': {\n x_min: 84,\n x_max: 1026,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 84,\n advanceWidth: 1154,\n },\n '!': {\n x_min: 143,\n x_max: 340,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 143,\n advanceWidth: 483,\n },\n '\"': {\n x_min: 166,\n x_max: 634,\n y_min: 1055,\n y_max: 1560,\n ha: 505,\n leftSideBearing: 166,\n advanceWidth: 770,\n },\n '#': {\n x_min: 63,\n x_max: 1179,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 63,\n advanceWidth: 1246,\n },\n $: {\n x_min: 81.92156915727656,\n x_max: 1012,\n y_min: -208,\n y_max: 1693,\n ha: 1901,\n leftSideBearing: 81,\n advanceWidth: 1110,\n },\n '%': {\n x_min: 77,\n x_max: 1384,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 77,\n advanceWidth: 1460,\n },\n '&': {\n x_min: 74,\n x_max: 1242,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 74,\n advanceWidth: 1289,\n },\n \"'\": {\n x_min: 166,\n x_max: 324,\n y_min: 1055,\n y_max: 1560,\n ha: 505,\n leftSideBearing: 166,\n advanceWidth: 460,\n },\n '(': {\n x_min: 114,\n x_max: 650,\n y_min: -463,\n y_max: 1636,\n ha: 2099,\n leftSideBearing: 114,\n advanceWidth: 662,\n },\n ')': {\n x_min: 11,\n x_max: 547,\n y_min: -463,\n y_max: 1636,\n ha: 2099,\n leftSideBearing: 11,\n advanceWidth: 654,\n },\n '*': {\n x_min: 66,\n x_max: 893,\n y_min: 607,\n y_max: 1456,\n ha: 849,\n leftSideBearing: 66,\n advanceWidth: 958,\n },\n '+': {\n x_min: 73,\n x_max: 1071,\n y_min: 146,\n y_max: 1206,\n ha: 1060,\n leftSideBearing: 73,\n advanceWidth: 1145,\n },\n ',': {\n x_min: 23,\n x_max: 315,\n y_min: -311,\n y_max: 221,\n ha: 532,\n leftSideBearing: 23,\n advanceWidth: 404,\n },\n '-': {\n x_min: 154,\n x_max: 643,\n y_min: 538,\n y_max: 692,\n ha: 154,\n leftSideBearing: 154,\n advanceWidth: 797,\n },\n '.': {\n x_min: 145,\n x_max: 342,\n y_min: 0,\n y_max: 202,\n ha: 202,\n leftSideBearing: 145,\n advanceWidth: 493,\n },\n '/': {\n x_min: 0,\n x_max: 774,\n y_min: -125,\n y_max: 1456,\n ha: 1581,\n leftSideBearing: 0,\n advanceWidth: 824,\n },\n ':': {\n x_min: 145,\n x_max: 342,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 145,\n advanceWidth: 419,\n },\n ';': {\n x_min: 53,\n x_max: 345,\n y_min: -311,\n y_max: 1082,\n ha: 1393,\n leftSideBearing: 53,\n advanceWidth: 424,\n },\n '<': {\n x_min: 76,\n x_max: 892,\n y_min: 107,\n y_max: 1013,\n ha: 906,\n leftSideBearing: 76,\n advanceWidth: 1017,\n },\n '=': {\n x_min: 147,\n x_max: 981,\n y_min: 407,\n y_max: 987,\n ha: 580,\n leftSideBearing: 147,\n advanceWidth: 1127,\n },\n '>': {\n x_min: 125,\n x_max: 980,\n y_min: 87,\n y_max: 993,\n ha: 906,\n leftSideBearing: 125,\n advanceWidth: 1060,\n },\n '?': {\n x_min: 65.92660602419838,\n x_max: 890,\n y_min: 0,\n y_max: 1477,\n ha: 1477,\n leftSideBearing: 65,\n advanceWidth: 953,\n },\n '@': {\n x_min: 84.3592218305664,\n x_max: 1705.2346925277395,\n y_min: -453,\n y_max: 1431,\n ha: 1884,\n leftSideBearing: 84,\n advanceWidth: 1821,\n },\n A: {\n x_min: 70,\n x_max: 1463,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 70,\n advanceWidth: 1533,\n },\n B: {\n x_min: 81,\n x_max: 1253,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1322,\n },\n C: {\n x_min: 80,\n x_max: 1174,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 80,\n advanceWidth: 1290,\n },\n D: {\n x_min: 81,\n x_max: 1291,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1356,\n },\n E: {\n x_min: 81,\n x_max: 1190,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1306,\n },\n F: {\n x_min: 81,\n x_max: 1176,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1256,\n },\n G: {\n x_min: 80,\n x_max: 1226,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 80,\n advanceWidth: 1346,\n },\n H: {\n x_min: 81,\n x_max: 1497,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1578,\n },\n I: {\n x_min: 81,\n x_max: 604,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 685,\n },\n J: {\n x_min: 60,\n x_max: 1100,\n y_min: -21,\n y_max: 1456,\n ha: 1477,\n leftSideBearing: 60,\n advanceWidth: 1169,\n },\n K: {\n x_min: 81,\n x_max: 1427,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1501,\n },\n L: {\n x_min: 81,\n x_max: 1130,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1210,\n },\n M: {\n x_min: 94,\n x_max: 1888,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 94,\n advanceWidth: 1982,\n },\n N: {\n x_min: 83,\n x_max: 1509,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 83,\n advanceWidth: 1592,\n },\n O: {\n x_min: 70,\n x_max: 1281,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 70,\n advanceWidth: 1351,\n },\n P: {\n x_min: 81,\n x_max: 1242,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1297,\n },\n Q: {\n x_min: 70,\n x_max: 1348,\n y_min: -245,\n y_max: 1477,\n ha: 1722,\n leftSideBearing: 70,\n advanceWidth: 1376,\n },\n R: {\n x_min: 81,\n x_max: 1285,\n y_min: 0,\n y_max: 1455,\n ha: 1455,\n leftSideBearing: 81,\n advanceWidth: 1385,\n },\n S: {\n x_min: 115,\n x_max: 1116,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 115,\n advanceWidth: 1206,\n },\n T: {\n x_min: 96,\n x_max: 1306,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 96,\n advanceWidth: 1406,\n },\n U: {\n x_min: 70,\n x_max: 1452,\n y_min: -21,\n y_max: 1456,\n ha: 1477,\n leftSideBearing: 70,\n advanceWidth: 1522,\n },\n V: {\n x_min: 65,\n x_max: 1443,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 65,\n advanceWidth: 1508,\n },\n W: {\n x_min: 72,\n x_max: 2057,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 72,\n advanceWidth: 2129,\n },\n X: {\n x_min: 80,\n x_max: 1449,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 80,\n advanceWidth: 1529,\n },\n Y: {\n x_min: 65,\n x_max: 1396,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 65,\n advanceWidth: 1461,\n },\n Z: {\n x_min: 90,\n x_max: 1107,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 90,\n advanceWidth: 1197,\n },\n '[': {\n x_min: 157,\n x_max: 541,\n y_min: -312,\n y_max: 1664,\n ha: 1976,\n leftSideBearing: 157,\n advanceWidth: 573,\n },\n '\\\\': {\n x_min: 36,\n x_max: 830,\n y_min: -125,\n y_max: 1456,\n ha: 1581,\n leftSideBearing: 36,\n advanceWidth: 841,\n },\n ']': {\n x_min: 23,\n x_max: 408,\n y_min: -312,\n y_max: 1664,\n ha: 1976,\n leftSideBearing: 23,\n advanceWidth: 552,\n },\n '^': {\n x_min: 71,\n x_max: 802,\n y_min: 729,\n y_max: 1456,\n ha: 727,\n leftSideBearing: 71,\n advanceWidth: 864,\n },\n _: {\n x_min: 119,\n x_max: 1041,\n y_min: -154,\n y_max: 0,\n ha: 154,\n leftSideBearing: 119,\n advanceWidth: 1168,\n },\n '`': {\n x_min: 40,\n x_max: 456,\n y_min: 1288,\n y_max: 1560,\n ha: 272,\n leftSideBearing: 40,\n advanceWidth: 496,\n },\n a: {\n x_min: 79,\n x_max: 1053,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 79,\n advanceWidth: 1132,\n },\n b: {\n x_min: -16,\n x_max: 1071,\n y_min: -21,\n y_max: 1560,\n ha: 1581,\n leftSideBearing: -16,\n advanceWidth: 1145,\n },\n c: {\n x_min: 78,\n x_max: 988,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 78,\n advanceWidth: 1067,\n },\n d: {\n x_min: 78,\n x_max: 1156,\n y_min: -21,\n y_max: 1560,\n ha: 1581,\n leftSideBearing: 78,\n advanceWidth: 1218,\n },\n e: {\n x_min: 74,\n x_max: 980,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 74,\n advanceWidth: 1059,\n },\n f: {\n x_min: 64,\n x_max: 731,\n y_min: 0,\n y_max: 1581,\n ha: 1581,\n leftSideBearing: 64,\n advanceWidth: 725,\n },\n g: {\n x_min: 78,\n x_max: 1133,\n y_min: -437,\n y_max: 1102,\n ha: 1539,\n leftSideBearing: 78,\n advanceWidth: 1157,\n },\n h: {\n x_min: 49,\n x_max: 1255,\n y_min: 0,\n y_max: 1560,\n ha: 1560,\n leftSideBearing: 49,\n advanceWidth: 1315,\n },\n i: {\n x_min: 67,\n x_max: 590,\n y_min: 0,\n y_max: 1560,\n ha: 1560,\n leftSideBearing: 67,\n advanceWidth: 652,\n },\n j: {\n x_min: -56,\n x_max: 381,\n y_min: -437,\n y_max: 1560,\n ha: 1997,\n leftSideBearing: -56,\n advanceWidth: 525,\n },\n k: {\n x_min: 64,\n x_max: 1248,\n y_min: 0,\n y_max: 1560,\n ha: 1560,\n leftSideBearing: 64,\n advanceWidth: 1287,\n },\n l: {\n x_min: 64,\n x_max: 587,\n y_min: 0,\n y_max: 1560,\n ha: 1560,\n leftSideBearing: 64,\n advanceWidth: 653,\n },\n m: {\n x_min: 74,\n x_max: 1905,\n y_min: 0,\n y_max: 1102,\n ha: 1102,\n leftSideBearing: 74,\n advanceWidth: 1977,\n },\n n: {\n x_min: 74,\n x_max: 1278,\n y_min: 0,\n y_max: 1102,\n ha: 1102,\n leftSideBearing: 74,\n advanceWidth: 1343,\n },\n o: {\n x_min: 78,\n x_max: 1046,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 78,\n advanceWidth: 1124,\n },\n p: {\n x_min: 34,\n x_max: 1119,\n y_min: -416,\n y_max: 1102,\n ha: 1518,\n leftSideBearing: 34,\n advanceWidth: 1197,\n },\n q: {\n x_min: 78,\n x_max: 1135,\n y_min: -416,\n y_max: 1102,\n ha: 1518,\n leftSideBearing: 78,\n advanceWidth: 1139,\n },\n r: {\n x_min: 72,\n x_max: 808,\n y_min: 0,\n y_max: 1102,\n ha: 1102,\n leftSideBearing: 72,\n advanceWidth: 854,\n },\n s: {\n x_min: 104,\n x_max: 933,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 104,\n advanceWidth: 1022,\n },\n t: {\n x_min: 24,\n x_max: 678,\n y_min: -17,\n y_max: 1343,\n ha: 1360,\n leftSideBearing: 24,\n advanceWidth: 730,\n },\n u: {\n x_min: 52,\n x_max: 1181,\n y_min: -21,\n y_max: 1082,\n ha: 1103,\n leftSideBearing: 52,\n advanceWidth: 1245,\n },\n v: {\n x_min: 26,\n x_max: 1176,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 26,\n advanceWidth: 1206,\n },\n w: {\n x_min: 52,\n x_max: 1777,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 52,\n advanceWidth: 1823,\n },\n x: {\n x_min: 42,\n x_max: 1163,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 42,\n advanceWidth: 1203,\n },\n y: {\n x_min: 24,\n x_max: 1172,\n y_min: -437,\n y_max: 1082,\n ha: 1519,\n leftSideBearing: 24,\n advanceWidth: 1192,\n },\n z: {\n x_min: 88,\n x_max: 960,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 88,\n advanceWidth: 1032,\n },\n '{': {\n x_min: 63,\n x_max: 671,\n y_min: -364,\n y_max: 1597,\n ha: 1961,\n leftSideBearing: 63,\n advanceWidth: 701,\n },\n '|': {\n x_min: 150,\n x_max: 307,\n y_min: -270,\n y_max: 1456,\n ha: 1726,\n leftSideBearing: 150,\n advanceWidth: 451,\n },\n '}': {\n x_min: 27,\n x_max: 635,\n y_min: -364,\n y_max: 1597,\n ha: 1961,\n leftSideBearing: 27,\n advanceWidth: 701,\n },\n '~': {\n x_min: 121,\n x_max: 1257,\n y_min: 401,\n y_max: 803,\n ha: 402,\n leftSideBearing: 121,\n advanceWidth: 1386,\n },\n },\n fontFamily: 'Roboto Slab',\n resolution: 2048,\n generatedOn: '2020-06-15T19:12:58.120Z',\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// @author Ron B. Yeh\n//\n// A smaller initial bundle that supports dynamic importing of music engraving fonts.\n//\n// vexflow-core.ts is the entry point for output file vexflow-core.js.\n// It does not preload / bundle any music fonts by default.\n// All music fonts will be loaded dynamically via: `Flow.fetchMusicFont(fontName)`\n// Remember to call `Flow.setMusicFont(fontName)` after fetching the font module.\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { Vex } from '../src/vex';\nimport { Flow } from '../src/flow';\nimport { Font } from '../src/font';\nimport { loadTextFonts } from '../src/fonts/textfonts';\nimport { globalObject, RuntimeError } from '../src/util';\nconst fontModules = {\n Bravura: './vexflow-font-bravura.js',\n Gonville: './vexflow-font-gonville.js',\n Petaluma: './vexflow-font-petaluma.js',\n Custom: './vexflow-font-custom.js',\n};\n/**\n * @param fontName the name of the music font to load.\n * @param fontModuleOrPath Either a font module object (containing a .data and .metrics properties) or a path to a font module.\n * The font module is assumed to be in the same directory as the vexflow-core.js entry point.\n *\n * This replaces the default empty implementation in flow.ts.\n */\nFlow.fetchMusicFont = (fontName, fontModuleOrPath) => __awaiter(void 0, void 0, void 0, function* () {\n const font = Font.load(fontName);\n // If the font has already been loaded before we do nothing.\n if (font.hasData()) {\n return;\n }\n if (!fontModuleOrPath) {\n // Determine the font module path.\n if (fontName in fontModules) {\n fontModuleOrPath = fontModules[fontName];\n }\n else {\n throw new RuntimeError('UnknownFont', `Music font ${fontName} does not exist.`);\n }\n }\n let fontModule;\n if (typeof fontModuleOrPath === 'string') {\n const module = yield import(/* webpackIgnore: true */ fontModuleOrPath);\n const g = globalObject();\n const VexFlowFont = g['VexFlowFont'];\n if (typeof VexFlowFont !== 'undefined' && typeof VexFlowFont[fontName] !== 'undefined') {\n // CJS font modules will set a global variable named: VexFlowFont.Bravura | VexFlowFont.Gonville | VexFlowFont.Petaluma | etc.\n fontModule = VexFlowFont[fontName];\n }\n else {\n // ESM font modules will export an object named \"Font\" with properties named \"data\" and \"metrics\".\n // See vexflow-font-bravura.ts for an example.\n fontModule = module.Font;\n }\n }\n else {\n fontModule = fontModuleOrPath;\n }\n font.setData(fontModule.data);\n font.setMetrics(fontModule.metrics);\n});\n// Load the two text fonts that ChordSymbol & Annotation use.\nloadTextFonts();\nexport * from '../src/index';\nexport default Vex;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from '../font';\nimport { TextFormatter } from '../textformatter';\nimport { PetalumaScriptFont } from './petalumascript_glyphs';\nimport { RobotoSlabFont } from './robotoslab_glyphs';\nexport function loadTextFonts() {\n // Roboto Slab\n {\n const fontData = RobotoSlabFont;\n const { fontFamily, resolution, glyphs } = fontData;\n Font.load(fontFamily, fontData);\n // Previously we used 'H', but it isn't actually the tallest or the widest.\n // Interestingly, the lowercase 'b' is the tallest glyph.\n const maxSizeGlyph = 'b';\n TextFormatter.registerInfo({\n family: fontFamily,\n resolution,\n glyphs,\n maxSizeGlyph,\n monospaced: false,\n bold: false,\n italic: false,\n superscriptOffset: 0.66,\n subscriptOffset: 0.66,\n serifs: true,\n description: 'Text font to pair with the Bravura / Gonville music fonts.',\n });\n }\n // PetalumaScript\n {\n const fontData = PetalumaScriptFont;\n const { fontFamily, resolution, glyphs } = fontData;\n Font.load(fontFamily, fontData);\n // M is wider, but H is taller. :-)\n // Lowercase b is also taller in this font.\n const maxSizeGlyph = 'b';\n TextFormatter.registerInfo({\n family: fontFamily,\n resolution,\n glyphs,\n maxSizeGlyph,\n monospaced: false,\n bold: false,\n italic: false,\n superscriptOffset: 0.66,\n subscriptOffset: 0.66,\n serifs: false,\n description: 'Text font to pair with the Petaluma music font.',\n });\n }\n}\n"],"names":["root","factory","exports","module","define","amd","window","globalThis","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","g","Function","e","obj","prop","prototype","hasOwnProperty","call","isCategory","category","checkAncestors","constructorFcn","constructor","CATEGORY","getPrototypeOf","isBarline","Category","Barline","isGraceNote","GraceNote","isNote","Note","isStaveNote","StaveNote","isStemmableNote","StemmableNote","isTabNote","TabNote","RuntimeError","Error","code","message","super","globalObject","self","defined","x","undefined","log","block","args","line","Array","slice","join","console","warn","err","stack","midLine","a","b","mid_line","n","parseInt","prefix","text","normalizeAngle","Math","PI","Fraction","numerator","denominator","set","static","Number","isNaN","t","GCD","length","LCM","shift","LCMM","value","simplify","u","d","gcd","add","param1","param2","otherNumerator","otherDenominator","getNumeratorAndDenominator","lcm","subtract","multiply","divide","equals","compare","__staticFractionA","copy","__staticFractionB","greaterThan","greaterThanEquals","lessThan","lessThanEquals","clone","other","quotient","floor","remainder","makeAbs","abs","toString","toSimplifiedString","__staticFractionTmp","toMixedString","s","q","f","parse","str","i","split","BoundingBox","y","w","h","that","getX","getY","getW","getH","setX","setY","setW","setH","move","mergeWith","boundingBox","new_x","new_y","new_w","max","new_h","BoundingBoxComputation","x1","NaN","y1","x2","y2","getX1","getY1","width","height","addPoint","addX","addY","addQuadraticCurve","p0x","p0y","p1x","p1y","p2x","p2y","p01x","denom","it","p01y","addBezierCurve","p3x","p3y","p0","p1","p2","p3","pow","c","b2ac","t1","sqrt","t2","FontWeight","FontStyle","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","rejected","result","done","then","apply","fontParser","Fonts","Font","fontName","name","fontSize","SIZE","_a","scaleToPxFrom","pt","parseFloat","unit","replace","toLowerCase","size","weight","style","fromCSSString","family","SANS_SERIF","NORMAL","cssFontShorthand","document","createElement","font","fontFamily","fontWeight","fontStyle","fontInfo","st","trim","wt","sz","scaleFactor","parsedWeight","ITALIC","woffURL","includeWoff2","fontFace","FontFace","load","fonts","host","WEB_FONT_HOST","files","WEB_FONT_FILES","fontPath","loadWebFont","data","metrics","setData","setMetrics","getName","getData","getMetrics","hasData","getResolution","resolution","getGlyphs","glyphs","lookupMetric","defaultValue","keyParts","currObj","SERIF","px","em","in","mm","cm","PetalumaScript","Index","id","type","class","Registry","index","defaultRegistry","registry","clear","setIndexValue","elem","updateIndex","oldValue","getElementById","getAttribute","register","setAttribute","onRegister","_b","getElementsByAttribute","attribute","index_attr","index_attr_val","keys","map","k","getElementsByType","getElementsByClass","className","onUpdate","info","includes","Element","attrs","newID","el","getCategory","classes","rendered","getDefaultRegistry","ID","setStyle","getStyle","applyStyle","context","save","shadowColor","setShadowColor","shadowBlur","setShadowBlur","fillStyle","setFillStyle","strokeStyle","setStrokeStyle","lineWidth","setLineWidth","restoreStyle","restore","drawWithStyle","checkContext","draw","hasClass","addClass","removeClass","isRendered","setRendered","getAttributes","oldID","getBoundingBox","getContext","setContext","setFont","toCSSString","textFont","defaultTextFont","TEXT_FONT","fontIsObject","fontIsString","fontIsUndefined","sizeWeightStyleAreUndefined","assign","validate","getFont","resetFont","setFontSize","getFontSize","fontSizeInPoints","convertSizeToPointValue","fontSizeInPixels","convertSizeToPixelValue","OutlineCode","ModifierPosition","GlyphCacheEntry","fontStack","point","Glyph","loadMetrics","bbox","getOutlineBoundingBox","outline","scale","x_shift","y_shift","lookupFontMetric","GlyphOutline","originX","originY","nextX","nextY","parts","push","MOVE","LINE","QUADRATIC","BEZIER","options","topGlyphs","botGlyphs","originShift","setOptions","reset","glyph","lookupGlyph","x_min","x_max","ha","cached_outline","ctx","x_pos","y_pos","cache","lookup","customScale","renderOutline","go","beginPath","moveTo","lineTo","quadraticCurveTo","bezierCurveTo","fill","bboxComp","penX","penY","getCode","setPoint","setStave","stave","setXShift","setYShift","checkMetrics","metricsScale","setOriginX","xShift","setOriginY","yShift","setOrigin","render","xPos","yPos","checkStave","renderToStave","getYForGlyphs","Map","entries","CURRENT_CACHE_KEY","entry","MUSIC_FONT_STACK","Modifier","text_line","position","Position","LEFT","spacingFromNextModifier","PositionString","center","CENTER","above","ABOVE","below","BELOW","left","right","RIGHT","getWidth","setWidth","getNote","note","checkAttachedNote","setNote","getIndex","checkIndex","setIndex","getModifierContext","modifierContext","checkModifierContext","setModifierContext","getPosition","setPosition","setTextLine","setSpacingFromNextModifier","getSpacingFromNextModifier","getXShift","alignSubNotesWithNote","subNotes","tickContext","getTickContext","getStave","subNoteXOffset","modLeftPx","modRightPx","forEach","subNote","subTickContext","setXOffset","Music","NUM_TONES","canonical_notes","roots","root_values","root_indices","diatonic_intervals","diatonic_accidentals","unison","accidental","m2","M2","m3","M3","p4","dim5","p5","m6","M6","b7","M7","octave","intervals","b2","min2","S","H","maj2","T","W","b3","min3","maj3","b5","aug4","b6","aug5","maj6","m7","min7","dom7","maj7","scales","major","minor","ionian","dorian","phyrgian","lydian","mixolydian","aeolian","locrian","scaleTypes","M","m","accidentals","noteValues","root_index","int_val","cn","cb","cbb","dn","db","dbb","en","eb","ebb","fn","fb","fbb","gn","gb","gbb","an","ab","abb","bn","bb","bbb","isValidNoteValue","isValidIntervalValue","interval","getNoteParts","noteString","match","exec","getKeyParts","keyString","getNoteValue","getIntervalValue","intervalString","getCanonicalNoteName","noteValue","getCanonicalIntervalName","intervalValue","getRelativeNoteValue","direction","sum","getRelativeNoteName","rootValue","multiplier","reverse_interval","relativeNoteName","getScaleTones","tones","nextNote","getIntervalBetween","note1","note2","difference","createScaleMap","keySignature","keySigParts","scaleName","keySigString","noteLocation","scaleMap","rootName","noteName","RESOLUTION","durations","durationAliases","keySignatures","C","num","Am","F","acc","Dm","Bb","Gm","Eb","Cm","Ab","Fm","Db","Bbm","Gb","Ebm","Cb","Abm","G","Em","D","Bm","A","E","B","clefs","treble","line_shift","bass","tenor","alto","soprano","percussion","subbass","french","notesInfo","CN","CB","CBB","DN","DB","DBB","EN","EB","EBB","FN","FB","FBB","GN","GB","GBB","AN","AB","ABB","BN","BB","BBB","R","rest","X","shift_right","customNoteHeads","D0","D1","D2","D3","T0","T1","T2","T3","X0","X1","X2","X3","S1","S2","R1","R2","parenRightPaddingAdjustment","bs","bss","bbs","ashs","afhf","accSagittal5v7KleismaUp","accSagittal5v7KleismaDown","accSagittal5CommaUp","accSagittal5CommaDown","accSagittal7CommaUp","accSagittal7CommaDown","accSagittal25SmallDiesisUp","accSagittal25SmallDiesisDown","accSagittal35MediumDiesisUp","accSagittal35MediumDiesisDown","accSagittal11MediumDiesisUp","accSagittal11MediumDiesisDown","accSagittal11LargeDiesisUp","accSagittal11LargeDiesisDown","accSagittal35LargeDiesisUp","accSagittal35LargeDiesisDown","accSagittalSharp25SDown","accSagittalFlat25SUp","accSagittalSharp7CDown","accSagittalFlat7CUp","accSagittalSharp5CDown","accSagittalFlat5CUp","accSagittalSharp5v7kDown","accSagittalFlat5v7kUp","accSagittalSharp","accSagittalFlat","accSagittalSharp5v7kUp","accSagittalFlat5v7kDown","accSagittalSharp5CUp","accSagittalFlat5CDown","accSagittalSharp7CUp","accSagittalFlat7CDown","accSagittalSharp25SUp","accSagittalFlat25SDown","accSagittalSharp35MUp","accSagittalFlat35MDown","accSagittalSharp11MUp","accSagittalFlat11MDown","accSagittalSharp11LUp","accSagittalFlat11LDown","accSagittalSharp35LUp","accSagittalFlat35LDown","accSagittalDoubleSharp25SDown","accSagittalDoubleFlat25SUp","accSagittalDoubleSharp7CDown","accSagittalDoubleFlat7CUp","accSagittalDoubleSharp5CDown","accSagittalDoubleFlat5CUp","accSagittalDoubleSharp5v7kDown","accSagittalDoubleFlat5v7kUp","accSagittalDoubleSharp","accSagittalDoubleFlat","accSagittal7v11KleismaUp","accSagittal7v11KleismaDown","accSagittal17CommaUp","accSagittal17CommaDown","accSagittal55CommaUp","accSagittal55CommaDown","accSagittal7v11CommaUp","accSagittal7v11CommaDown","accSagittal5v11SmallDiesisUp","accSagittal5v11SmallDiesisDown","accSagittalSharp5v11SDown","accSagittalFlat5v11SUp","accSagittalSharp7v11CDown","accSagittalFlat7v11CUp","accSagittalSharp55CDown","accSagittalFlat55CUp","accSagittalSharp17CDown","accSagittalFlat17CUp","accSagittalSharp7v11kDown","accSagittalFlat7v11kUp","accSagittalSharp7v11kUp","accSagittalFlat7v11kDown","accSagittalSharp17CUp","accSagittalFlat17CDown","accSagittalSharp55CUp","accSagittalFlat55CDown","accSagittalSharp7v11CUp","accSagittalFlat7v11CDown","accSagittalSharp5v11SUp","accSagittalFlat5v11SDown","accSagittalDoubleSharp5v11SDown","accSagittalDoubleFlat5v11SUp","accSagittalDoubleSharp7v11CDown","accSagittalDoubleFlat7v11CUp","accSagittalDoubleSharp55CDown","accSagittalDoubleFlat55CUp","accSagittalDoubleSharp17CDown","accSagittalDoubleFlat17CUp","accSagittalDoubleSharp7v11kDown","accSagittalDoubleFlat7v11kUp","accSagittal23CommaUp","accSagittal23CommaDown","accSagittal5v19CommaUp","accSagittal5v19CommaDown","accSagittal5v23SmallDiesisUp","accSagittal5v23SmallDiesisDown","accSagittalSharp5v23SDown","accSagittalFlat5v23SUp","accSagittalSharp5v19CDown","accSagittalFlat5v19CUp","accSagittalSharp23CDown","accSagittalFlat23CUp","accSagittalSharp23CUp","accSagittalFlat23CDown","accSagittalSharp5v19CUp","accSagittalFlat5v19CDown","accSagittalSharp5v23SUp","accSagittalFlat5v23SDown","accSagittalDoubleSharp5v23SDown","accSagittalDoubleFlat5v23SUp","accSagittalDoubleSharp5v19CDown","accSagittalDoubleFlat5v19CUp","accSagittalDoubleSharp23CDown","accSagittalDoubleFlat23CUp","accSagittal19SchismaUp","accSagittal19SchismaDown","accSagittal17KleismaUp","accSagittal17KleismaDown","accSagittal143CommaUp","accSagittal143CommaDown","accSagittal11v49CommaUp","accSagittal11v49CommaDown","accSagittal19CommaUp","accSagittal19CommaDown","accSagittal7v19CommaUp","accSagittal7v19CommaDown","accSagittal49SmallDiesisUp","accSagittal49SmallDiesisDown","accSagittal23SmallDiesisUp","accSagittal23SmallDiesisDown","accSagittal5v13MediumDiesisUp","accSagittal5v13MediumDiesisDown","accSagittal11v19MediumDiesisUp","accSagittal11v19MediumDiesisDown","accSagittal49MediumDiesisUp","accSagittal49MediumDiesisDown","accSagittal5v49MediumDiesisUp","accSagittal5v49MediumDiesisDown","accSagittal49LargeDiesisUp","accSagittal49LargeDiesisDown","accSagittal11v19LargeDiesisUp","accSagittal11v19LargeDiesisDown","accSagittal5v13LargeDiesisUp","accSagittal5v13LargeDiesisDown","accSagittalSharp23SDown","accSagittalFlat23SUp","accSagittalSharp49SDown","accSagittalFlat49SUp","accSagittalSharp7v19CDown","accSagittalFlat7v19CUp","accSagittalSharp19CDown","accSagittalFlat19CUp","accSagittalSharp11v49CDown","accSagittalFlat11v49CUp","accSagittalSharp143CDown","accSagittalFlat143CUp","accSagittalSharp17kDown","accSagittalFlat17kUp","accSagittalSharp19sDown","accSagittalFlat19sUp","accSagittalSharp19sUp","accSagittalFlat19sDown","accSagittalSharp17kUp","accSagittalFlat17kDown","accSagittalSharp143CUp","accSagittalFlat143CDown","accSagittalSharp11v49CUp","accSagittalFlat11v49CDown","accSagittalSharp19CUp","accSagittalFlat19CDown","accSagittalSharp7v19CUp","accSagittalFlat7v19CDown","accSagittalSharp49SUp","accSagittalFlat49SDown","accSagittalSharp23SUp","accSagittalFlat23SDown","accSagittalSharp5v13MUp","accSagittalFlat5v13MDown","accSagittalSharp11v19MUp","accSagittalFlat11v19MDown","accSagittalSharp49MUp","accSagittalFlat49MDown","accSagittalSharp5v49MUp","accSagittalFlat5v49MDown","accSagittalSharp49LUp","accSagittalFlat49LDown","accSagittalSharp11v19LUp","accSagittalFlat11v19LDown","accSagittalSharp5v13LUp","accSagittalFlat5v13LDown","accSagittalDoubleSharp23SDown","accSagittalDoubleFlat23SUp","accSagittalDoubleSharp49SDown","accSagittalDoubleFlat49SUp","accSagittalDoubleSharp7v19CDown","accSagittalDoubleFlat7v19CUp","accSagittalDoubleSharp19CDown","accSagittalDoubleFlat19CUp","accSagittalDoubleSharp11v49CDown","accSagittalDoubleFlat11v49CUp","accSagittalDoubleSharp143CDown","accSagittalDoubleFlat143CUp","accSagittalDoubleSharp17kDown","accSagittalDoubleFlat17kUp","accSagittalDoubleSharp19sDown","accSagittalDoubleFlat19sUp","accSagittalShaftUp","accSagittalShaftDown","accSagittalAcute","accSagittalGrave","accSagittal1MinaUp","accSagittal1MinaDown","accSagittal2MinasUp","accSagittal2MinasDown","accSagittal1TinaUp","accSagittal1TinaDown","accSagittal2TinasUp","accSagittal2TinasDown","accSagittal3TinasUp","accSagittal3TinasDown","accSagittal4TinasUp","accSagittal4TinasDown","accSagittal5TinasUp","accSagittal5TinasDown","accSagittal6TinasUp","accSagittal6TinasDown","accSagittal7TinasUp","accSagittal7TinasDown","accSagittal8TinasUp","accSagittal8TinasDown","accSagittal9TinasUp","accSagittal9TinasDown","accSagittalFractionalTinaUp","accSagittalFractionalTinaDown","accidentalNarrowReversedFlat","accidentalNarrowReversedFlatAndFlat","accidentalWilsonPlus","accidentalWilsonMinus","articulations","between_lines","av","aboveCode","belowCode","ao","ah","am","ornaments","mordent","mordent_inverted","turn","turn_inverted","tr","upprall","downprall","prallup","pralldown","upmordent","downmordent","lineprall","prallprall","scoop","doit","fall","doitLong","fallLong","bend","plungerClosed","plungerOpen","flip","jazzTurn","smear","Tables","clef","keyOctaveGlyph","params","octave_shift","pieces","toUpperCase","clefProperties","stroke","int_value","customNoteHeadProps","glyphName","displaced","integer","fret","shift_y","glyphMetrics","TABLATURE_FONT_SCALE","textWidth","artic","spec","keySpec","notes","acc_list","duration","durationNumber","sanitizeDuration","durationToFraction","ticks","durationCodes","glyphTypeProperties","customGlyphTypeProperties","code_head","common","NOTATION_FONT_SCALE","STEM_WIDTH","STEM_HEIGHT","STAVE_LINE_THICKNESS","SLASH_NOTEHEAD_WIDTH","STAVE_LINE_DISTANCE","TEXT_HEIGHT_OFFSET_HACK","accidentalMap","accidentalColumnsTable","second_on_bottom","spaced_out_tetrachord","spaced_out_pentachord","very_spaced_out_pentachord","spaced_out_hexachord","very_spaced_out_hexachord","unicode","sharp","String","fromCharCode","flat","natural","triangle","degrees","circle","validTypes","r","TIME4_4","num_beats","beat_value","stem","stem_offset","flag","dot_shiftY","line_above","line_below","beam_count","stem_beam_extension","code_flag_upstem","code_flag_downstem","L","Accidental","DEBUG","render_options","font_scale","parenLeftPadding","parenRightPadding","accidentalCodes","cautionary","state","musicFont","currentMusicFont","noteheadAccidentalPadding","leftShift","left_shift","accidentalSpacing","additionalPadding","accList","prevNote","shiftL","props","getKeyProps","getLeftDisplacedHeadPx","lineSpace","getSpacingBetweenLines","getYForLine","accLine","round","sort","lineList","previousLine","accShift","flatLine","dblSharpLine","numAcc","column","totalColumns","noFurtherConflicts","groupStart","groupEnd","checkCollision","getGroupLine","getGroupLines","indexes","lineDifference","indexA","indexB","item","notColliding","indexPairs","every","line1","line2","groupLength","groupMember","endCase","patternLength","collisionDetected","columnWidths","columnXOffsets","totalShift","accCount","lastAccOnLine","clearance","clearanceRequired","collision","voices","tickPositions","tickNoteMap","voice","tickPosition","getTickables","shouldIgnoreTicks","notesAtPosition","getTicks","music","scaleMapKey","tickPos","tickables","modifiedPitches","processNote","isRest","staveNote","keyIndex","accidentalString","pitch","sameAccidental","previouslyModified","indexOf","getModifiers","modifier","splice","addModifier","GraceNoteGroup","getGraceNotes","fontScale","parenLeft","parenRight","parenWidth","setAsCautionary","start","getModifierStartXY","accX","accY","Stem","stem_up_y_offset","stem_down_y_offset","stem_up_y_base_offset","stem_down_y_base_offset","x_begin","x_end","y_top","y_bottom","stem_extension","stem_direction","hide","isStemlet","stemletHeight","renderHeightAdjustment","UP","DOWN","WIDTH","HEIGHT","setNoteHeadXBounds","setDirection","setExtension","ext","getExtension","setYBounds","getHeight","y_offset","getExtents","isStemUp","ys","stemHeight","innerMostNoteheadY","min","outerMostNoteheadY","topY","baseY","setVisibility","isVisible","setStemlet","adjustHeightForFlag","adjustHeightForBeam","stem_x","stem_y","y_base_offset","stemletYOffset","TextFormatter","textWidthCache","formatterInfo","serifs","monospaced","italic","bold","superscriptOffset","subscriptOffset","maxSizeGlyph","cacheKey","updateParams","registeredFonts","requestedFont","candidates","requestedFamilies","requestedFamily","startsWith","formatter","values","isBold","isItalic","perfectMatch","find","partialMatch","fontSizeInPt","overwrite","updateCacheKey","BOLD","getGlyphMetrics","character","maxHeight","getWidthForCharacterInEm","advanceWidth","getWidthForTextInEm","cachedWidths","getWidthForTextInPx","AnnotationHorizontalJustify","AnnotationVerticalJustify","Annotation","horizontalJustification","verticalJustification","TOP","annotations","annotation","textFormatter","create","verticalSpaceNeeded","stemDirection","hasStem","getStemDirection","lines","draw_stem","getStem","getNoteType","getNumLines","VerticalJustify","noteLine","getLineNumber","leastString","top_text_line","BOTTOM","greatestString","curBottom","right_shift","setVerticalJustification","just","VerticalJustifyString","getJustification","setJustification","HorizontalJustifyString","classString","openGroup","text_width","measureText","text_height","getStemX","stem_ext","spacing","has_stem","checkStem","getYs","reduce","yt","getYForTopText","getYForBottomText","getTopLineTopY","extents","getStemExtents","fillText","closeGroup","HorizontalJustify","centerStem","CENTER_STEM","top","bottom","roundToNearestHalf","mathFn","isWithinLines","getRoundingFunction","ceil","isStaveOrGraceNote","Articulation","getIncrement","articulation","increment","curTop","maxWidth","articWidth","builder","articNameToCode","staccato","tenuto","accent","articString","getFactory","articulationCodes","textLine","canSitBetweenLines","staffSpace","isTab","shouldSitOutsideStaff","initialOffset","isOnStemTip","getInitialOffset","padding","stemTipY","stemBaseY","getTopY","INITIAL_OFFSET","getBottomY","offsetDirection","articLine","snappedLine","snapLineToStaff","RenderContext","setRawFont","Tickable","_preFormatted","_postFormatted","intrinsicTicks","tickMultiplier","modifiers","tupletStack","align_center","center_x_shift","ignore_ticks","formatterMetrics","freedom","iterations","space","used","mean","deviation","setIgnoreTicks","checkTickContext","getFormatterMetrics","getCenterXShift","isCenterAligned","setCenterXShift","centerXShift","setCenterAlignment","getVoice","setVoice","getTuplet","tuplet","getTupletStack","resetTuplet","noteCount","notesOccupied","getNoteCount","getNotesOccupied","applyTickMultiplier","pop","setTuplet","addToModifierContext","mc","addMember","setTickContext","tc","preFormat","preFormatted","postFormat","postFormatted","getIntrinsicTicks","setIntrinsicTicks","getTickMultiplier","setDuration","getAbsoluteX","noteStruct","parsedNoteStruct","parseNoteStruct","JSON","stringify","keyProps","noteType","customTypes","duration_override","getGlyphProps","customGlyphs","playNote","leftDisplacedHeadPx","rightDisplacedHeadPx","annotation_spacing","glyph_font_scale","stroke_px","xStart","xPre1","xAbs","xPost1","notePx","xPost2","xEnd","xFreedomRight","xWidth","color","yy","arc","closePath","drawDot","spaceDeviation","durationString","dots","durationProps","parseDuration","durationToTicks","currentTicks","getPlayNote","setPlayNote","addStroke","setYs","getRightDisplacedHeadPx","setLeftDisplacedHeadPx","setRightDisplacedHeadPx","isTopNote","getLineForRest","getGlyph","getGlyphWidth","getDuration","isDotted","getModifiersByType","getBeam","beam","checkBeam","hasBeam","setBeam","signature","getMembers","getRightParenthesisPx","getLeftParenthesisPx","getFirstDotPx","getState","glyphWidth","glyphPx","getNoteStartX","getTieRightX","tieStartX","getTieLeftX","tieEndX","getKeys","StaveModifierPosition","BarlineType","ChordSymbolHorizontalJustify","ChordSymbolVerticalJustify","SymbolTypes","SymbolModifiers","VoiceMode","StaveModifier","placeGlyphOnLine","customShift","getPadding","setPadding","setLayoutMetrics","layoutMetrics","getLayoutMetrics","thickness","TYPE","widths","SINGLE","DOUBLE","END","REPEAT_BEGIN","REPEAT_END","REPEAT_BOTH","NONE","paddings","layoutMetricsMap","xMin","xMax","paddingLeft","paddingRight","BEGIN","setType","typeString","single","double","end","repeatBegin","repeatEnd","repeatBoth","none","getType","drawVerticalBar","drawVerticalEndBar","drawRepeatBar","double_bar","staveCtx","botY","getBottomLineBottomY","fillRect","begin","dot_x","dot_radius","dot_y","BarNote","barline","Bend","release","phrase","tap","line_width","line_style","bend_width","release_width","updateWidth","bends","last_width","stringPos","setTap","getText","getTextHeight","totalWidth","additional_width","draw_width","lowestY","bend_height","annotation_y","renderBend","cp_x","cp_y","renderRelease","renderArrowHead","yBase","renderText","render_x","last_bend","last_bend_draw_width","last_drawn_width","ChordSymbol","symbolBlocks","horizontal","vertical","useKerning","reportWidth","superSubRatio","global","NO_TEXT_FORMAT","val","noFormat","glyphCode","engravingFontResolution","spacingBetweenBlocks","metric","getMetricForGlyph","yOffset","leftSideBearing","kerningOffset","chordSymbol","lowerKerningText","upperKerningText","symbolModifier","SUPERSCRIPT","SUBSCRIPT","symbols","nonSuperWidth","reportedWidths","symbol","fontAdj","scaleSize","glyphAdj","lineSpaces","vAlign","j","sup","isSuperscript","sub","isSubscript","superSubScale","adj","symbolType","GLYPH","superSubFontSize","getWidthForGlyph","getYShiftForGlyph","getXShiftForGlyph","TEXT","getYOffsetForText","over","prev","setEnableKerning","updateKerningAdjustments","updateOverBarAdjustments","getVertical","getReportWidth","setReportWidth","barIndex","findIndex","xoff","yoff","symIndex","accum","getKerningAdjustment","currSymbol","prevSymbol","adjustment","preKernUpper","preKernLower","some","xx","kerningOffsetPixels","getSymbolBlock","_c","symbolBlock","glyphArgs","glyphPoints","addSymbolBlock","parameters","addText","addTextSuperscript","addTextSubscript","addGlyphSuperscript","addGlyph","addGlyphOrText","char","addLine","setVertical","vj","setHorizontal","hj","getHorizontal","yMax","y_max","stem_base","isSuper","isSub","curY","smallerFontSize","diminished","dim","halfDiminished","augmented","majorSeventh","leftParen","rightParen","leftBracket","rightBracket","leftParenTall","rightParenTall","symbolTypes","symbolModifiers","Dot","radius","all","dot","setDotShiftY","dot_list","max_shift_map","note_id","dot_shift","x_width","last_line","last_note","prev_dotted_space","half_shiftY","forceFlagRight","FretHandFinger","finger","x_offset","nums","nums_list","prev_note","shiftLeft","shiftRight","pos","textHeight","shiftR","numShiftL","numShiftR","xWidthL","xWidthR","lastLine","lastNote","num_shift","numWidth","fingerings","fingeringString","number","Fingering","fingering","setFretHandFinger","getFretHandFinger","setOffsetX","setOffsetY","StaveTie","setNotes","cp1","cp2","text_shift_x","first_x_shift","last_x_shift","tie_spacing","first_note","first_indices","last_indices","isPartial","renderTie","first_ys","last_ys","last_x_px","first_x_px","first_y_px","last_y_px","top_cp_y","bottom_cp_y","center_x","getTieStartX","getTieEndX","TabTie","Voice","time","voiceTime","resolutionMultiplier","mode","STRICT","ticksUsed","largestTickWidth","softmaxFactor","totalTicks","smallestTickCount","Mode","getTotalTicks","getTicksUsed","getLargestTickWidth","getSmallestTickCount","getMode","setMode","getResolutionMultiplier","getActualResolution","tickable","setStrict","strict","SOFT","isComplete","FULL","setSoftmaxFactor","factor","reCalculateExpTicksUsed","expTicksUsed","softmax","tickValue","v","exp","addTickable","addTickables","grace_notes","show_slur","slur","slur_y_shift","beams","gracenote_groups","group_list","gracenote_group","is_stavenote","formatWidth","group_shift","Formatter","joinVoices","format","getMinTotalWidth","beamNotes","Beam","beam_width","partial_beam_length","graceNote","TieClass","NoteSubGroup","groups","group","TickContext","tickID","currentTick","maxTicks","maxTickable","minTicks","minTickable","xBase","xOffset","tickablesByVoice","totalLeftPx","totalRightPx","tContexts","tContext","contexts","getTickID","getXBase","setXBase","getXOffset","getMaxTicks","getMinTicks","getMaxTickable","getMinTickable","getTickableForVoice","voiceIndex","getTickablesByVoice","getCenterAlignedTickables","filter","getCurrentTick","setCurrentTick","tick","Ornament","delayed","accidentalLowerPadding","accidentalUpperPadding","ornament","ornamentCodes","adjustForStemDirection","reportedWidth","stemUpYOffset","ornamentAlignWithNoteHead","ornamentNoteTransition","ornamentRelease","ornamentAttack","ornamentArticulation","jazzOrnaments","setDelayed","setUpperAccidental","accid","accidentalUpper","setLowerAccidental","accidentalLower","stemDir","stemExtents","isPlacedOnNoteheadSide","lineSpacing","glyphYBetweenLines","glyphX","glyphY","delayXShift","startX","nextContext","getNextContext","Parenthesis","parentheses","x_widthL","x_widthR","parenthesis","renderGlyph","NoteHead","custom_glyph","stem_up_x_offset","stem_down_x_offset","note_type","glyph_code","custom_glyph_code","slashed","isDisplaced","getLine","setLine","displacementStemAdjustment","fontShift","displacedFontShift","half_spacing","min_y","getYForNote","head_x","categorySuffix","staveSpace","durationToNumber","breve_lines","drawSlashNoteHead","setStem","buildStem","buildFlag","hasFlag","flagCode","getBaseCustomNoteHeadGlyph","getStemLength","getStemExtension","getBeamCount","getStemMinimumLength","setStemDirection","offsets","offsetYBaseStemUp","offsetYTopStemUp","offsetYBaseStemDown","offsetYTopStemDown","getCenterGlyphX","stem_extension_override","setStemLength","drawStem","stemOptions","shiftRestVertical","dir","delta","maxLine","minLine","setKeyLine","getKeyLine","ledgerLineStyle","use_default_head_x","_noteHeads","LEDGER_LINE_OFFSET","calculateKeyProps","auto_stem","autoStem","STEM_UP","STEM_DOWN","minNoteheadPadding","notesList","minL","stemMax","stemMin","maxL","isrest","voice_shift","getVoiceShiftWidth","is_displaced","noteU","noteM","noteL","voiceXShift","centerRest","noteHeadStyles","noteHead","buildNoteHeads","noteHeadStyle","head","calcNoteDisplacements","lineDiff","noteProps","notehead","calculateOptimalStemDirection","keyProperties","minY","maxY","halfLineSpacing","frac","resultLine","thisLine","isChord","getNoteHeadBounds","setNoteDisplaced","getRightShift","restLine","isInnerNoteIndex","setStemStyle","getStemStyle","setLedgerLineStyle","getLedgerLineStyle","setFlagStyle","flagStyle","getFlagStyle","setKeyStyle","noteHeadPadding","shouldDrawFlag","nonDisplacedX","displacedX","highestDisplacedLine","lowestDisplacedLine","yTop","Infinity","yBottom","highestLine","lowestLine","highestNonDisplacedLine","lowestNonDisplacedLine","displaced_x","non_displaced_x","highest_line","lowest_line","highest_displaced_line","lowest_displaced_line","highest_non_displaced_line","lowest_non_displaced_line","getNoteHeadBeginX","getNoteHeadEndX","noteHeads","note_heads","drawLedgerLines","doubleWidth","min_x","drawLedgerLine","normal","ledgerWidth","getDefaultLedgerLineStyle","drawModifiers","noteheadStyle","hasNoBeam","drawFlag","noteStemHeight","flagX","extension","flagY","pointerBBox","drawNoteHeads","super_stem_extension","mid_line_distance","lines_over_octave_from_mid_line","spacing_between_lines","xBegin","shouldRenderStem","stemX","isHTMLCanvas","element","HTMLCanvasElement","toDataURL","CanvasContext","context2D","canvas","CANVAS_BROWSER_SIZE_LIMIT","limit","clearRect","cls","child","setBackgroundFillStyle","blur","getTransform","setLineCap","capType","lineCap","setLineDash","dash","resize","devicePixelRatio","sanitizeCanvasDims","rect","cp1x","cp1y","cp2x","cp2y","cpx","cpy","startAngle","endAngle","counterclockwise","fontBoundingBoxAscent","fontBoundingBoxDescent","actualBoundingBoxAscent","actualBoundingBoxDescent","ATTRIBUTES_TO_IGNORE","path","SVG_NS","TWO_PI","SVGContext","backgroundFillStyle","fontCSSString","svg","appendChild","parent","pen","defaultFontAttributes","attributes","shadow_attributes","state_stack","svgElementType","createElementNS","lineDash","applyAttributes","visibleWidth","visibleHeight","setViewBox","viewBox_or_minX","viewBoxString","attrNamesToIgnore","nodeName","attrName","setAttributeNS","lastChild","removeChild","rectangle","x0","cos","y0","sin","large","sweep","getShadowStyle","sa","measureTextCache","txt","textContent","savedState","fontAttributes","RendererBackends","RendererLineEndType","Justification","VoltaType","measureImpl","getBBox","Renderer","arg0","arg1","backend","maybeElement","Backends","CANVAS","SVG","HTMLDivElement","isHTMLDiv","elementId","background","renderer","lastContext","buildContext","fromX","fromY","toX","toY","dashPattern","dx","dy","angle","atan2","idx","dashLength","nx","ny","LineEndType","StringNumber","string_number","dashed","leg","stringNumber","shift_left","glyphLine","num_shiftR","num_width","setLineEndType","setStringNumber","setLastNote","setDashed","stemPadding","verticalPadding","leftPadding","rightPadding","len","pattern","drawDashedLine","Stroke","all_voices","strokes","strokeList","string","getPositions","strokeShift","addEndNote","note_end","line_space","arrow","arrow_shift_x","arrow_y","text_y","Type","BRUSH_DOWN","BRUSH_UP","ROLL_DOWN","RASQUEDO_DOWN","ROLL_UP","RASQUEDO_UP","ARPEGGIO_DIRECTIONLESS","strokeLine","Vibrato","harsh","vibrato_width","wave_height","wave_width","wave_girth","setVibratoWidth","vibratos","vibrato","setHarsh","vx","vy","renderVibrato","opts","num_waves","ModifierContext","members","formatted","member","getLeftShift","Clef","types","tab","attachment","numLines","shiftY","KeySignature","cancelKeySpec","alterKeySpec","setKeySig","glyphFontScale","xPositions","paddingForced","convertToGlyph","nextAcc","accGlyphData","extraWidth","xPosition","cancelKey","convertToCancelAccList","cancel_accList","different_types","naturals","cancelled","concat","addToStave","convertAccLines","customLines","offset","alterKey","convertToAlterAccList","firstAccidentalType","cancelAccList","getEndClef","getClef","Repetition","symbol_type","setShiftX","setShiftY","CODA_RIGHT","drawCodaFixed","CODA_LEFT","drawSymbolText","SEGNO_LEFT","drawSignoFixed","SEGNO_RIGHT","DC","DC_AL_CODA","DC_AL_FINE","DS","DS_AL_CODA","DS_AL_FINE","FINE","TO_CODA","draw_coda","text_x","symbol_x","modifierWidth","getVerticalBarWidth","StaveSection","section","shift_x","setStaveSection","textMeasurements","StaveTempo","tempo","setTempo","bpm","stem_height","TextNote","superscript","subscript","smooth","justification","struct","GLYPHS","segno","mordent_upper","mordent_lower","p","z","coda","pedal_open","pedal_close","caesura_straight","caesura_curved","breath","StaveText","setStaveText","setText","getBottomLineY","Volta","volta","top_y","vert_height","BEGIN_END","TimeSignatureGlyph","timeSignature","topDigits","botDigits","topWidth","timeSigType","topGlyph","botWidth","botGlyph","topStartX","botStartX","start_x","topLine","bottomLine","TimeSignature","timeSpec","customPadding","validate_args","fontLineShift","parseTimeSpec","numbers","test","assertIsValidTimeSig","makeTimeSignatureGlyph","getInfo","setTimeSig","SORT_ORDER_BEG_MODIFIERS","SORT_ORDER_END_MODIFIERS","Stave","end_x","measure","endClef","vertical_bar_width","num_lines","fill_style","left_bar","right_bar","spacing_between_lines_px","space_above_staff_ln","space_below_staff_ln","top_text_position","bottom_text_position","line_config","bounds","defaultLedgerLineStyle","resetLines","addEndModifier","defaultPadding","setDefaultLedgerLineStyle","visible","setNoteStartX","begBarline","getNoteEndX","setNumLines","mod","setMeasure","getModifierXShift","setRepetitionType","setVoltaType","number_t","setSection","staveSection","headroom","getLineForY","setBegBarType","setEndBarType","setClef","clefSpec","addClef","setEndClef","setKeySignature","addKeySignature","setEndKeySignature","setTimeSignature","timeSignatures","addTimeSignature","setEndTimeSignature","addEndClef","addEndTimeSignature","addTrebleGlyph","noPosition","noCategory","sortByCategory","items","order","temp","endBarline","begModifiers","endModifiers","lastBarlineIdx","getConfigForLines","setConfigForLine","line_number","setConfigForLines","lines_configuration","drawBoldDoubleLine","topX","StaveConnector","BOLD_DOUBLE_LEFT","BOLD_DOUBLE_RIGHT","variableWidth","top_stave","bottom_stave","texts","SINGLE_RIGHT","content","THIN_DOUBLE","attachment_height","SINGLE_LEFT","BRACE","x3","y3","cpx1","cpy1","cpx2","cpy2","cpx3","cpy3","cpx4","cpy4","cpx5","cpy5","cpx6","cpy6","cpx7","cpy7","cpx8","cpy8","BRACKET","singleRight","singleLeft","brace","bracket","boldDoubleLeft","boldDoubleRight","thinDouble","sumArray","arr","createContexts","makeContext","addToContext","tickToContextMap","tickList","integerTicks","newContext","array","list","getRestLineForNextNoteGroup","currRestLine","currNoteIndex","nextRestLine","noteIndex","formatterOptions","globalSoftmax","maxIterations","justifyWidth","totalCost","durationStats","minTotalWidth","hasMinTotalWidth","tickContexts","modifierContexts","contextGaps","total","gaps","lossHistory","paddingBetween","accumulator","stavePadding","gap","toFixed","auto_beam","align_rests","applyAndGetBeams","formatToStave","tabstave","tabnotes","autobeam","notevoice","tabvoice","alignAllNotes","alignTuplets","currTickable","prevTickable","alignRests","AlignRestsToNotes","preCalculateMinTotalWidth","unalignedPadding","unalignedCtxCount","wsum","dsum","createTickContexts","contextList","contextMap","wavg","wvar","ll","wpads","davg","dvar","dpads","padmax","unalignedPad","createModifierContexts","contextArray","renderingContext","voicesParam","evaluate","firstContext","calculateIdealDistances","adjustedJustifyWidth","backTickable","prevContext","backVoices","matchingVoices","maxNegativeShiftPx","expectedDistance","thisTickable","insideLeftEdge","backMetrics","insideRightEdge","fromTickable","fromTickablePx","shiftToIdealDistances","idealDistances","centerX","spaceAccum","contextX","ideal","errorPx","negativeShiftPx","configMinPadding","configMaxPadding","targetWidth","distances","actualWidth","minDistance","mdCalc","di","calcMinDistance","paddingMax","maxX","prevTick","prevMetrics","currMetrics","leftNoteEdge","rightNote","rightMetrics","stats","count","updateStats","totalDeviation","tune","alpha","current","cost","postFormatContexts","optionsParam","TupletLocation","Tuplet","numerator_glyphs","denom_glyphs","num_notes","beats_occupied","beatsOccupiedDeprecationWarning","notes_occupied","bracketed","ratioed","setTupletLocation","location","LOCATION_TOP","resolveGlyphs","attach","LOCATION_BOTTOM","NESTING_OFFSET","detach","setBracketed","setRatioed","getNotes","getBeatsOccupied","setBeatsOccupied","beats","setNotesOccupied","unshift","getNestedTupletCount","maxTupletCount","countTuplets","minTupletCount","tupletCount","getYPosition","nested_tuplet_y_offset","topModifierOffset","modLines","modY","noteHeadOffset","stemOffset","lineCheck","nn","bottom_y","addGlyphWidth","notation_start_x","colon_x","colon_radius","calculateStemDirection","lineSum","keyProp","BEAM_LEFT","BEAM_BOTH","slope","stem_weight","memo","break_on_indices","max_slope","min_slope","slope_iterations","slope_cost","show_stemlets","stemlet_extension","flat_beams","min_flat_beam_offset","time_sig","beatTotal","beatValue","generateBeams","config","tickGroups","unprocessedNotes","currentTickGroup","noteGroups","currentGroup","nextTickGroup","nextGroup","currentGroupTotalTicks","unprocessedNote","ticksPerGroup","vf_notes","unbeamable","createGroups","sanitizedGroups","tempGroup","isFirstOrLast","breaksOnEachRest","beam_rests","breaksOnFirstOrLastRest","beam_middle_only","breakOnStemChange","maintain_stem_directions","prevDirection","isUnbeamableDuration","sanitizeGroups","findFirstNote","applyStemDirection","beamedNoteGroups","beamable","allTuplets","uniqueTuplets","noteTuplet","getTuplets","secondary_breaks","secondary_break_ticks","flat_beam_offset","beamCount","breakSecondaryAt","indices","getSlopeY","calculateSlope","firstNote","initialSlope","firstStemTipY","firstStemX","getStemSlope","minCost","MAX_VALUE","bestSlope","totalStemExtension","yShiftTemp","adjustedStemTipY","diff","idealSlope","calculateFlatSlope","extremeY","extremeBeamCount","currentExtreme","extremeTest","newOffset","getBeamYToDraw","beamY","applyStemExtensions","beamedStemTipY","preBeamExtension","beamExtension","totalBeamWidth","lookupBeamDirection","prev_tick","next_tick","lookup_duration","prev_note_gets_beam","next_note_gets_beam","note_gets_beam","getBeamLines","tick_of_duration","beam_started","beam_lines","current_beam","previous_should_break","tick_tally","should_break","next_note","beam_alone","beam_direction","last_beam","drawStems","drawBeamLines","valid_beam_durations","beamThickness","beamLines","beam_line","startBeamX","startBeamY","lastBeamX","lastBeamY","ClefNote","clef_obj","abs_x","Crescendo","extend_left","extend_right","decrescendo","setHeight","setDecrescendo","decresc","tick_context","next_context","begin_x","half_height","reverse","renderHairpin","CurvePosition","Curve","from","to","NEAR_HEAD","position_end","invert","cps","nearHead","nearTop","NEAR_TOP","renderCurve","first_x","first_y","last_x","last_y","cp0x","cp0y","cp_spacing","end_metric","Parser","flattenMatches","matchedString","results","grammar","errorPos","expect","matchFail","returnPos","matchSuccess","matchToken","token","noSpace","regexp","RegExp","success","incrementPos","expectOne","rule","maybe","allMatches","oneMatch","localPos","or","gotOne","numMatches","expectOneOrMore","more","expectZeroOrMore","ruleFunc","bind","oneOrMore","zeroOrMore","matches","run","EasyScore","EasyScoreGrammar","PIECE","PIECES","EOL","CHORDORNOTE","PARAMS","commitPiece","COMMA","DURATION","DOTS","OPTS","CHORD","SINGLENOTE","LPAREN","NOTES","RPAREN","addChord","NOTE","NOTENAME","ACCIDENTAL","OCTAVE","addSingleNote","MICROTONES","ACCIDENTALS","DOT","setNoteDots","SLASH","MAYBESLASH","TYPES","setNoteType","DURATIONS","setNoteDuration","LBRACKET","KEYVAL","KEYVALS","RBRACKET","KEY","EQUALS","VAL","addNoteOption","SVAL","DVAL","Piece","chord","Builder","commitHooks","elements","rollingDuration","resetPiece","getElements","addCommitHook","commitHook","piece","addNote","standardAccidentals","notePiece","GhostNote","buildAndAttach","setId","commaSeparatedRegex","setClass","defaults","easyScoreHook","throwOnError","parser","ERROR_MSG","parameter","GlyphNote","ignoreTicks","setGlyph","SCALE","slash","ret","staveNoteScale","getStaveNoteScale","offsetScale","slashBBox","calcBeamedNotesSlashBBox","noteHeadBounds","defaultOffsetY","slashStemOffset","slashBeamOffset","protrusions","beam_slope","scaleX","beam_angle","atan","iPointOnBeam","slash_angle","protrusion_stem_dx","protrusion_stem_dy","protrusion_beam_dx","protrusion_beam_dy","stem0X","stemY","KeySigNote","semibreve_rest","MultiMeasureRest","number_of_measures","xs","hasPaddingLeft","hasPaddingRight","hasLineThickness","hasSymbolSpacing","padding_left","padding_right","line_thickness","symbol_spacing","use_symbols","show_number","number_line","number_glyph_point","serif_thickness","semibreve_rest_glyph_scale","getXs","drawLine","spacingBetweenLines","lineThicknessHalf","serifThickness","bot","leftIndented","rightIndented","lineTop","lineBottom","drawSymbols","n4","n2","n1","get_semibreve_rest","rest_scale","rest_width","yMiddle","timeSig","drawPedalGlyph","glyph_data","PedalMarking","custom_depress_text","custom_release_text","bracket_height","text_margin_right","bracket_line_width","pedal","MIXED","setCustomText","depress","drawBracketed","prev_x","prev_y","is_pedal_depressed","next_is_same","prev_is_same","drawText","pedal_depress","pedal_release","mixed","CODES","RepeatNote","drawArrowHead","StaveLine","line_dash","rounded_end","draw_start_arrow","draw_end_arrow","arrowhead_length","arrowhead_angle","text_position_vertical","TextVerticalPosition","text_justification","TextJustification","applyLineStyle","applyFontStyle","drawArrowLine","pt1","pt2","both_arrows","distance","ratio","end_y","start_y","line_angle","angle1","angle2","top_x","bottom_x","start_position","end_position","first_index","last_index","upwards_slope","notehead_width","vertical_position","System","spaceBetweenStaves","autoWidth","noJustification","debugFormatter","formatIterations","noPadding","details","formatOptions","addConnector","connector","addStave","staveOptions","spaceAbove","spaceBelow","debugNoteMetrics","options_details","allVoices","debugNoteMetricsYs","part","lastY","plotDebugging","plotMetrics","positions","ghost","draw_dots","draw_stem_through_stave","setGhost","tabToGlyph","getStemY","stemDownLine","stemStartLine","flag_x","flag_y","flag_code","drawStemThrough","stemThrough","stemLines","unused_strings","up_stem","down_stem","line_spacing","total_lines","stem_lines","strings","containsLastString","containsFirstString","line_ys","isTopBound","isBottomBound","getPartialStemLines","strings_used","stem_through","getUnusedStringGroups","drawPositions","tab_x","render_stem","TabStave","addTabGlyph","TextBracket","TextBracketPosition","stop","show_bracket","underline_superscript","Positions","PositionsString","main_measure","main_width","main_height","super_y","super_measure","super_width","super_height","line_y","TextDynamics","sequence","glyph_font_size","total_width","letter","letter_x","current_letter","TimeSigNote","timeSigInfo","VibratoBracket","bracket_data","stop_x","Factory","renderQ","systems","staves","initRenderer","getVoices","ghostNote","textNote","barNote","clefNote","timeSigNote","keySigNote","hJustify","vJustify","kerning","numMeasures","multiMeasureRest","secondaryBeamBreaks","curve","tie","vibratoBracket","textBracket","system","StaveHairpin","hairpin","left_shift_px","right_shift_px","right_shift_ticks","left_shift_ticks","ppt","pixelsPerTick","l_shift_px","r_shift_px","hairpin_options","setRenderOptions","dis","staff_height","l_shift","r_shift","CRESC","DECRESC","TabSlide","first_fret","last_fret","SLIDE_UP","SLIDE_DOWN","slide_y","Tuning","tuningString","tuningValues","setTuning","names","standard","dagdad","dropd","standardBanjo","noteToInteger","getValueForString","stringNum","getValueForFret","fretNum","stringValue","getNoteForFret","integerToNote","Flow","BUILD","VERSION","DATE","fontNames","fontModuleOrPath","hasKeySignature","getKeySignatures","GraceTabNote","KeyManager","setKey","getKey","scaleMapByValue","originalScaleMapByValue","getAccidental","selectNote","scaleNote","modparts","change","valueNote","originalValueNote","Tremolo","y_spacing_scale","extra_stroke_scale","y_spacing","cmp","eq","newArr","last","canvasSelector","start_time","Date","getTime","PetalumaScriptFont","y_min","$","I","J","K","N","O","Q","U","V","Y","Z","_","l","generatedOn","RobotoSlabFont","fontModules","Bravura","Gonville","Petaluma","Custom","fetchMusicFont","fontModule","import","VexFlowFont","fontData","registerInfo","description","loadTextFonts"],"sourceRoot":""} \ No newline at end of file diff --git a/build/cjs/vexflow-debug-with-tests.js b/build/cjs/vexflow-debug-with-tests.js new file mode 100644 index 0000000000..51cc9aef7c --- /dev/null +++ b/build/cjs/vexflow-debug-with-tests.js @@ -0,0 +1,49444 @@ +/*! + * VexFlow 4.0.1-alpha.2 2022-02-02T09:30:30.784Z 0df10df6d1fab3a99f5aa306341a31c6e686d659 + * Copyright (c) 2010 Mohit Muthanna Cheppudira + * https://www.vexflow.com https://github.com/0xfe/vexflow + */ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["Vex"] = factory(); + else + root["Vex"] = factory(); +})((typeof window !== 'undefined' ? window : typeof globalThis !== 'undefined' ? globalThis : this), function() { +return /******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ "./src/version.ts": +/*!************************!*\ + !*** ./src/version.ts ***! + \************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "VERSION": () => (/* binding */ VERSION), +/* harmony export */ "ID": () => (/* binding */ ID), +/* harmony export */ "DATE": () => (/* binding */ DATE) +/* harmony export */ }); +const VERSION = '4.0.1-alpha.2'; +const ID = '0df10df6d1fab3a99f5aa306341a31c6e686d659'; +const DATE = '2022-02-02T09:30:30.784Z'; + + +/***/ }), + +/***/ "./entry/vexflow.ts": +/*!**************************!*\ + !*** ./entry/vexflow.ts ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Accidental": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Accidental), +/* harmony export */ "Annotation": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Annotation), +/* harmony export */ "AnnotationHorizontalJustify": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.AnnotationHorizontalJustify), +/* harmony export */ "AnnotationVerticalJustify": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.AnnotationVerticalJustify), +/* harmony export */ "Articulation": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Articulation), +/* harmony export */ "BarNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.BarNote), +/* harmony export */ "Barline": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Barline), +/* harmony export */ "BarlineType": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.BarlineType), +/* harmony export */ "Beam": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Beam), +/* harmony export */ "Bend": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Bend), +/* harmony export */ "BoundingBox": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.BoundingBox), +/* harmony export */ "BoundingBoxComputation": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.BoundingBoxComputation), +/* harmony export */ "Builder": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Builder), +/* harmony export */ "CanvasContext": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.CanvasContext), +/* harmony export */ "Category": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Category), +/* harmony export */ "ChordSymbol": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.ChordSymbol), +/* harmony export */ "ChordSymbolHorizontalJustify": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.ChordSymbolHorizontalJustify), +/* harmony export */ "ChordSymbolVerticalJustify": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.ChordSymbolVerticalJustify), +/* harmony export */ "Clef": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Clef), +/* harmony export */ "ClefNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.ClefNote), +/* harmony export */ "Crescendo": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Crescendo), +/* harmony export */ "Curve": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Curve), +/* harmony export */ "CurvePosition": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.CurvePosition), +/* harmony export */ "Dot": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Dot), +/* harmony export */ "EasyScore": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.EasyScore), +/* harmony export */ "EasyScoreGrammar": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.EasyScoreGrammar), +/* harmony export */ "Element": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Element), +/* harmony export */ "Factory": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Factory), +/* harmony export */ "Flow": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Flow), +/* harmony export */ "Font": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Font), +/* harmony export */ "FontStyle": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.FontStyle), +/* harmony export */ "FontWeight": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.FontWeight), +/* harmony export */ "Formatter": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Formatter), +/* harmony export */ "Fraction": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Fraction), +/* harmony export */ "FretHandFinger": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.FretHandFinger), +/* harmony export */ "GhostNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.GhostNote), +/* harmony export */ "Glyph": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Glyph), +/* harmony export */ "GlyphNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.GlyphNote), +/* harmony export */ "GraceNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.GraceNote), +/* harmony export */ "GraceNoteGroup": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.GraceNoteGroup), +/* harmony export */ "GraceTabNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.GraceTabNote), +/* harmony export */ "Justification": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Justification), +/* harmony export */ "KeyManager": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.KeyManager), +/* harmony export */ "KeySigNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.KeySigNote), +/* harmony export */ "KeySignature": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.KeySignature), +/* harmony export */ "Modifier": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Modifier), +/* harmony export */ "ModifierContext": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.ModifierContext), +/* harmony export */ "ModifierPosition": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.ModifierPosition), +/* harmony export */ "MultiMeasureRest": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.MultiMeasureRest), +/* harmony export */ "Music": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Music), +/* harmony export */ "Note": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Note), +/* harmony export */ "NoteHead": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.NoteHead), +/* harmony export */ "NoteSubGroup": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.NoteSubGroup), +/* harmony export */ "Ornament": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Ornament), +/* harmony export */ "OutlineCode": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.OutlineCode), +/* harmony export */ "Parenthesis": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Parenthesis), +/* harmony export */ "Parser": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Parser), +/* harmony export */ "PedalMarking": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.PedalMarking), +/* harmony export */ "Piece": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Piece), +/* harmony export */ "Registry": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Registry), +/* harmony export */ "RenderContext": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.RenderContext), +/* harmony export */ "Renderer": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Renderer), +/* harmony export */ "RendererBackends": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.RendererBackends), +/* harmony export */ "RendererLineEndType": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.RendererLineEndType), +/* harmony export */ "RepeatNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.RepeatNote), +/* harmony export */ "Repetition": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Repetition), +/* harmony export */ "RuntimeError": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.RuntimeError), +/* harmony export */ "SVGContext": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.SVGContext), +/* harmony export */ "Stave": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Stave), +/* harmony export */ "StaveConnector": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.StaveConnector), +/* harmony export */ "StaveHairpin": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.StaveHairpin), +/* harmony export */ "StaveLine": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.StaveLine), +/* harmony export */ "StaveModifier": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.StaveModifier), +/* harmony export */ "StaveModifierPosition": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.StaveModifierPosition), +/* harmony export */ "StaveNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.StaveNote), +/* harmony export */ "StaveSection": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.StaveSection), +/* harmony export */ "StaveTempo": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.StaveTempo), +/* harmony export */ "StaveText": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.StaveText), +/* harmony export */ "StaveTie": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.StaveTie), +/* harmony export */ "Stem": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Stem), +/* harmony export */ "StemmableNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.StemmableNote), +/* harmony export */ "StringNumber": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.StringNumber), +/* harmony export */ "Stroke": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Stroke), +/* harmony export */ "SymbolModifiers": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.SymbolModifiers), +/* harmony export */ "SymbolTypes": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.SymbolTypes), +/* harmony export */ "System": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.System), +/* harmony export */ "TabNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.TabNote), +/* harmony export */ "TabSlide": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.TabSlide), +/* harmony export */ "TabStave": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.TabStave), +/* harmony export */ "TabTie": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.TabTie), +/* harmony export */ "TextBracket": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.TextBracket), +/* harmony export */ "TextBracketPosition": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.TextBracketPosition), +/* harmony export */ "TextDynamics": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.TextDynamics), +/* harmony export */ "TextFormatter": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.TextFormatter), +/* harmony export */ "TextNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.TextNote), +/* harmony export */ "TickContext": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.TickContext), +/* harmony export */ "Tickable": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Tickable), +/* harmony export */ "TimeSigNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.TimeSigNote), +/* harmony export */ "TimeSignature": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.TimeSignature), +/* harmony export */ "TimeSignatureGlyph": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.TimeSignatureGlyph), +/* harmony export */ "Tremolo": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Tremolo), +/* harmony export */ "Tuning": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Tuning), +/* harmony export */ "Tuplet": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Tuplet), +/* harmony export */ "TupletLocation": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.TupletLocation), +/* harmony export */ "Vex": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Vex), +/* harmony export */ "Vibrato": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Vibrato), +/* harmony export */ "VibratoBracket": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.VibratoBracket), +/* harmony export */ "Voice": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Voice), +/* harmony export */ "VoiceMode": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.VoiceMode), +/* harmony export */ "Volta": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Volta), +/* harmony export */ "VoltaType": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.VoltaType), +/* harmony export */ "defined": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.defined), +/* harmony export */ "drawDot": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.drawDot), +/* harmony export */ "globalObject": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.globalObject), +/* harmony export */ "isAccidental": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.isAccidental), +/* harmony export */ "isAnnotation": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.isAnnotation), +/* harmony export */ "isBarline": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.isBarline), +/* harmony export */ "isCategory": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.isCategory), +/* harmony export */ "isDot": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.isDot), +/* harmony export */ "isGraceNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.isGraceNote), +/* harmony export */ "isGraceNoteGroup": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.isGraceNoteGroup), +/* harmony export */ "isHTMLCanvas": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.isHTMLCanvas), +/* harmony export */ "isHTMLDiv": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.isHTMLDiv), +/* harmony export */ "isNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.isNote), +/* harmony export */ "isRenderContext": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.isRenderContext), +/* harmony export */ "isStaveNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.isStaveNote), +/* harmony export */ "isStemmableNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.isStemmableNote), +/* harmony export */ "isTabNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.isTabNote), +/* harmony export */ "log": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.log), +/* harmony export */ "midLine": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.midLine), +/* harmony export */ "normalizeAngle": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.normalizeAngle), +/* harmony export */ "prefix": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.prefix), +/* harmony export */ "warn": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.warn), +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _src_vex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/vex */ "./src/vex.ts"); +/* harmony import */ var _src_flow__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/flow */ "./src/flow.ts"); +/* harmony import */ var _src_fonts_load_all__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/fonts/load_all */ "./src/fonts/load_all.ts"); +/* harmony import */ var _src_fonts_textfonts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/fonts/textfonts */ "./src/fonts/textfonts.ts"); +/* harmony import */ var _src_index__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/index */ "./src/index.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// vexflow.ts is the entry point for the build output file vexflow.js. +// It statically bundles all the music engraving fonts, and sets the music font stack to: +// Flow.setMusicFont('Bravura', 'Gonville', 'Custom'); +// The webpack config inside Gruntfile.js sets the mode to 'production' to produce a minified build. + + + + +(0,_src_fonts_load_all__WEBPACK_IMPORTED_MODULE_2__.loadAllMusicFonts)(); +_src_flow__WEBPACK_IMPORTED_MODULE_1__.Flow.setMusicFont('Bravura', 'Gonville', 'Custom'); +(0,_src_fonts_textfonts__WEBPACK_IMPORTED_MODULE_3__.loadTextFonts)(); + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_src_vex__WEBPACK_IMPORTED_MODULE_0__.Vex); + + +/***/ }), + +/***/ "./src/accidental.ts": +/*!***************************!*\ + !*** ./src/accidental.ts ***! + \***************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Accidental": () => (/* binding */ Accidental) +/* harmony export */ }); +/* harmony import */ var _fraction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./fraction */ "./src/fraction.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _music__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./music */ "./src/music.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// @author Mohit Cheppudira +// @author Greg Ristow (modifications) + + + + + + + +// eslint-disable-next-line +function L(...args) { + if (Accidental.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_6__.log)('Vex.Flow.Accidental', args); +} +/** + * An `Accidental` inherits from `Modifier`, and is formatted within a + * `ModifierContext`. Accidentals are modifiers that can be attached to + * notes. Support is included for both western and microtonal accidentals. + * + * See `tests/accidental_tests.ts` for usage examples. + */ +class Accidental extends _modifier__WEBPACK_IMPORTED_MODULE_2__.Modifier { + /** + * Create accidental. + * @param type value from `Vex.Flow.accidentalCodes.accidentals` table in `tables.ts`. + * For example: `#`, `##`, `b`, `n`, etc. + */ + constructor(type) { + super(); + L('New accidental: ', type); + this.type = type; + this.position = _modifier__WEBPACK_IMPORTED_MODULE_2__.Modifier.Position.LEFT; + this.render_options = { + // Font size for glyphs + font_scale: 38, + // Padding between accidental and parentheses on each side + parenLeftPadding: 2, + parenRightPadding: 2, + }; + this.accidental = _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.accidentalCodes(this.type); + (0,_util__WEBPACK_IMPORTED_MODULE_6__.defined)(this.accidental, 'ArgumentError', `Unknown accidental type: ${type}`); + // Cautionary accidentals have parentheses around them + this.cautionary = false; + this.reset(); + } + /** Accidentals category string. */ + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_5__.Category.Accidental; + } + /** Arrange accidentals inside a ModifierContext. */ + static format(accidentals, state) { + // If there are no accidentals, no need to format their positions. + if (!accidentals || accidentals.length === 0) + return; + const musicFont = _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.currentMusicFont(); + const noteheadAccidentalPadding = musicFont.lookupMetric('accidental.noteheadAccidentalPadding'); + const leftShift = state.left_shift + noteheadAccidentalPadding; + const accidentalSpacing = musicFont.lookupMetric('accidental.accidentalSpacing'); + const additionalPadding = musicFont.lookupMetric('accidental.leftPadding'); // padding to the left of all accidentals + const accList = []; + let prevNote = undefined; + let shiftL = 0; + // First determine the accidentals' Y positions from the note.keys + for (let i = 0; i < accidentals.length; ++i) { + const acc = accidentals[i]; + const note = acc.getNote(); + const stave = note.getStave(); + const index = acc.checkIndex(); + const props = note.getKeyProps()[index]; + if (note !== prevNote) { + // Iterate through all notes to get the displaced pixels + for (let n = 0; n < note.keys.length; ++n) { + shiftL = Math.max(note.getLeftDisplacedHeadPx(), shiftL); + } + prevNote = note; + } + if (stave) { + const lineSpace = stave.getSpacingBetweenLines(); + const y = stave.getYForLine(props.line); + const accLine = Math.round((y / lineSpace) * 2) / 2; + accList.push({ y, line: accLine, shift: shiftL, acc, lineSpace }); + } + else { + accList.push({ line: props.line, shift: shiftL, acc }); + } + } + // Sort accidentals by line number. + accList.sort((a, b) => b.line - a.line); + // FIXME: Confusing name. Each object in this array has a property called `line`. + // So if this is a list of lines, you end up with: `line.line` which is very awkward. + const lineList = []; + // amount by which all accidentals must be shifted right or left for + // stem flipping, notehead shifting concerns. + let accShift = 0; + let previousLine = undefined; + // Create an array of unique line numbers (lineList) from accList + for (let i = 0; i < accList.length; i++) { + const acc = accList[i]; + // if this is the first line, or a new line, add a lineList + if (previousLine === undefined || previousLine !== acc.line) { + lineList.push({ + line: acc.line, + flatLine: true, + dblSharpLine: true, + numAcc: 0, + width: 0, + column: 0, + }); + } + // if this accidental is not a flat, the accidental needs 3.0 lines lower + // clearance instead of 2.5 lines for b or bb. + // FIXME: Naming could use work. acc.acc is very awkward + if (acc.acc.type !== 'b' && acc.acc.type !== 'bb') { + lineList[lineList.length - 1].flatLine = false; + } + // if this accidental is not a double sharp, the accidental needs 3.0 lines above + if (acc.acc.type !== '##') { + lineList[lineList.length - 1].dblSharpLine = false; + } + // Track how many accidentals are on this line: + lineList[lineList.length - 1].numAcc++; + // Track the total x_offset needed for this line which will be needed + // for formatting lines w/ multiple accidentals: + // width = accidental width + universal spacing between accidentals + lineList[lineList.length - 1].width += acc.acc.getWidth() + accidentalSpacing; + // if this accShift is larger, use it to keep first column accidentals in the same line + accShift = acc.shift > accShift ? acc.shift : accShift; + previousLine = acc.line; + } + // ### Place Accidentals in Columns + // + // Default to a classic triangular layout (middle accidental farthest left), + // but follow exceptions as outlined in G. Read's _Music Notation_ and + // Elaine Gould's _Behind Bars_. + // + // Additionally, this implements different vertical collision rules for + // flats (only need 2.5 lines clearance below) and double sharps (only + // need 2.5 lines of clearance above or below). + // + // Classic layouts and exception patterns are found in the 'tables.js' + // in 'Tables.accidentalColumnsTable' + // + // Beyond 6 vertical accidentals, default to the parallel ascending lines approach, + // using as few columns as possible for the verticle structure. + // + // TODO (?): Allow column to be specified for an accidental at run-time? + let totalColumns = 0; + // establish the boundaries for a group of notes with clashing accidentals: + for (let i = 0; i < lineList.length; i++) { + let noFurtherConflicts = false; + const groupStart = i; + let groupEnd = i; + while (groupEnd + 1 < lineList.length && !noFurtherConflicts) { + // if this note conflicts with the next: + if (this.checkCollision(lineList[groupEnd], lineList[groupEnd + 1])) { + // include the next note in the group: + groupEnd++; + } + else { + noFurtherConflicts = true; + } + } + // Gets an a line from the `lineList`, relative to the current group + const getGroupLine = (index) => lineList[groupStart + index]; + const getGroupLines = (indexes) => indexes.map(getGroupLine); + const lineDifference = (indexA, indexB) => { + const [a, b] = getGroupLines([indexA, indexB]).map((item) => item.line); + return a - b; + }; + const notColliding = (...indexPairs) => indexPairs.map(getGroupLines).every(([line1, line2]) => !this.checkCollision(line1, line2)); + // Set columns for the lines in this group: + const groupLength = groupEnd - groupStart + 1; + // Set the accidental column for each line of the group + let endCase = this.checkCollision(lineList[groupStart], lineList[groupEnd]) ? 'a' : 'b'; + switch (groupLength) { + case 3: + if (endCase === 'a' && lineDifference(1, 2) === 0.5 && lineDifference(0, 1) !== 0.5) { + endCase = 'second_on_bottom'; + } + break; + case 4: + if (notColliding([0, 2], [1, 3])) { + endCase = 'spaced_out_tetrachord'; + } + break; + case 5: + if (endCase === 'b' && notColliding([1, 3])) { + endCase = 'spaced_out_pentachord'; + if (notColliding([0, 2], [2, 4])) { + endCase = 'very_spaced_out_pentachord'; + } + } + break; + case 6: + if (notColliding([0, 3], [1, 4], [2, 5])) { + endCase = 'spaced_out_hexachord'; + } + if (notColliding([0, 2], [2, 4], [1, 3], [3, 5])) { + endCase = 'very_spaced_out_hexachord'; + } + break; + default: + break; + } + let groupMember; + let column; + // If the group contains seven members or more, use ascending parallel lines + // of accidentals, using as few columns as possible while avoiding collisions. + if (groupLength >= 7) { + // First, determine how many columns to use: + let patternLength = 2; + let collisionDetected = true; + while (collisionDetected === true) { + collisionDetected = false; + for (let line = 0; line + patternLength < lineList.length; line++) { + if (this.checkCollision(lineList[line], lineList[line + patternLength])) { + collisionDetected = true; + patternLength++; + break; + } + } + } + // Then, assign a column to each line of accidentals + for (groupMember = i; groupMember <= groupEnd; groupMember++) { + column = ((groupMember - i) % patternLength) + 1; + lineList[groupMember].column = column; + totalColumns = totalColumns > column ? totalColumns : column; + } + } + else { + // If the group contains fewer than seven members, use the layouts from + // the Tables.accidentalColumnsTable (See: tables.ts). + for (groupMember = i; groupMember <= groupEnd; groupMember++) { + column = _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.accidentalColumnsTable[groupLength][endCase][groupMember - i]; + lineList[groupMember].column = column; + totalColumns = totalColumns > column ? totalColumns : column; + } + } + // Increment i to the last note that was set, so that if a lower set of notes + // does not conflict at all with this group, it can have its own classic shape. + i = groupEnd; + } + // ### Convert Columns to x_offsets + // + // This keeps columns aligned, even if they have different accidentals within them + // which sometimes results in a larger x_offset than is an accidental might need + // to preserve the symmetry of the accidental shape. + // + // Neither A.C. Vinci nor G. Read address this, and it typically only happens in + // music with complex chord clusters. + // + // TODO (?): Optionally allow closer compression of accidentals, instead of forcing + // parallel columns. + // track each column's max width, which will be used as initial shift of later columns: + const columnWidths = []; + const columnXOffsets = []; + for (let i = 0; i <= totalColumns; i++) { + columnWidths[i] = 0; + columnXOffsets[i] = 0; + } + columnWidths[0] = accShift + leftShift; + columnXOffsets[0] = accShift + leftShift; + // Fill columnWidths with widest needed x-space; + // this is what keeps the columns parallel. + lineList.forEach((line) => { + if (line.width > columnWidths[line.column]) + columnWidths[line.column] = line.width; + }); + for (let i = 1; i < columnWidths.length; i++) { + // this column's offset = this column's width + previous column's offset + columnXOffsets[i] = columnWidths[i] + columnXOffsets[i - 1]; + } + const totalShift = columnXOffsets[columnXOffsets.length - 1]; + // Set the xShift for each accidental according to column offsets: + let accCount = 0; + lineList.forEach((line) => { + let lineWidth = 0; + const lastAccOnLine = accCount + line.numAcc; + // handle all of the accidentals on a given line: + for (accCount; accCount < lastAccOnLine; accCount++) { + const xShift = columnXOffsets[line.column - 1] + lineWidth; + accList[accCount].acc.setXShift(xShift); + // keep track of the width of accidentals we've added so far, so that when + // we loop, we add space for them. + lineWidth += accList[accCount].acc.getWidth() + accidentalSpacing; + L('Line, accCount, shift: ', line.line, accCount, xShift); + } + }); + // update the overall layout with the full width of the accidental shapes: + state.left_shift += totalShift + additionalPadding; + } + /** Helper function to determine whether two lines of accidentals collide vertically */ + static checkCollision(line1, line2) { + let clearance = line2.line - line1.line; + let clearanceRequired = 3; + // But less clearance is required for certain accidentals: b, bb and ##. + if (clearance > 0) { + // then line 2 is on top + clearanceRequired = line2.flatLine || line2.dblSharpLine ? 2.5 : 3.0; + if (line1.dblSharpLine) + clearance -= 0.5; + } + else { + // line 1 is on top + clearanceRequired = line1.flatLine || line1.dblSharpLine ? 2.5 : 3.0; + if (line2.dblSharpLine) + clearance -= 0.5; + } + const collision = Math.abs(clearance) < clearanceRequired; + L('Line_1, Line_2, Collision: ', line1.line, line2.line, collision); + return collision; + } + /** + * Use this method to automatically apply accidentals to a set of `voices`. + * The accidentals will be remembered between all the voices provided. + * Optionally, you can also provide an initial `keySignature`. + */ + static applyAccidentals(voices, keySignature) { + const tickPositions = []; + const tickNoteMap = {}; + // Sort the tickables in each voice by their tick position in the voice. + voices.forEach((voice) => { + const tickPosition = new _fraction__WEBPACK_IMPORTED_MODULE_0__.Fraction(0, 1); + const tickable = voice.getTickables(); + tickable.forEach((t) => { + if (t.shouldIgnoreTicks()) + return; + const notesAtPosition = tickNoteMap[tickPosition.value()]; + if (!notesAtPosition) { + tickPositions.push(tickPosition.value()); + tickNoteMap[tickPosition.value()] = [t]; + } + else { + notesAtPosition.push(t); + } + tickPosition.add(t.getTicks()); + }); + }); + const music = new _music__WEBPACK_IMPORTED_MODULE_3__.Music(); + // Default key signature is C major. + if (!keySignature) + keySignature = 'C'; + // Get the scale map, which represents the current state of each pitch. + const scaleMapKey = music.createScaleMap(keySignature); + const scaleMap = {}; + tickPositions.forEach((tickPos) => { + const tickables = tickNoteMap[tickPos]; + // Array to store all pitches that modified accidental states + // at this tick position + const modifiedPitches = []; + const processNote = (t) => { + // Only StaveNote implements .addModifier(), which is used below. + if (!(0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isStaveNote)(t) || t.isRest() || t.shouldIgnoreTicks()) { + return; + } + // Go through each key and determine if an accidental should be applied. + const staveNote = t; + staveNote.keys.forEach((keyString, keyIndex) => { + const key = music.getNoteParts(keyString.split('/')[0]); + const octave = keyString.split('/')[1]; + // Force a natural for every key without an accidental + const accidentalString = key.accidental || 'n'; + const pitch = key.root + accidentalString; + // Determine if the current pitch has the same accidental + // as the scale state + if (!scaleMap[key.root + octave]) + scaleMap[key.root + octave] = scaleMapKey[key.root]; + const sameAccidental = scaleMap[key.root + octave] === pitch; + // Determine if an identical pitch in the chord already + // modified the accidental state + const previouslyModified = modifiedPitches.indexOf(keyString) > -1; + // Remove accidentals + staveNote.getModifiers().forEach((modifier, index) => { + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isAccidental)(modifier) && modifier.type == accidentalString && modifier.getIndex() == keyIndex) { + staveNote.getModifiers().splice(index, 1); + } + }); + // Add the accidental to the StaveNote + if (!sameAccidental || (sameAccidental && previouslyModified)) { + // Modify the scale map so that the root pitch has an + // updated state + scaleMap[key.root + octave] = pitch; + // Create the accidental + const accidental = new Accidental(accidentalString); + // Attach the accidental to the StaveNote + staveNote.addModifier(accidental, keyIndex); + // Add the pitch to list of pitches that modified accidentals + modifiedPitches.push(keyString); + } + }); + // process grace notes + staveNote.getModifiers().forEach((modifier) => { + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isGraceNoteGroup)(modifier)) { + modifier.getGraceNotes().forEach(processNote); + } + }); + }; + tickables.forEach(processNote); + }); + } + reset() { + const fontScale = this.render_options.font_scale; + this.glyph = new _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph(this.accidental.code, fontScale); + this.glyph.setOriginX(1.0); + if (this.cautionary) { + this.parenLeft = new _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph(_tables__WEBPACK_IMPORTED_MODULE_4__.Tables.accidentalCodes('{').code, fontScale); + this.parenRight = new _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph(_tables__WEBPACK_IMPORTED_MODULE_4__.Tables.accidentalCodes('}').code, fontScale); + this.parenLeft.setOriginX(1.0); + this.parenRight.setOriginX(1.0); + } + } + /** Get width in pixels. */ + getWidth() { + if (this.cautionary) { + const parenLeft = (0,_util__WEBPACK_IMPORTED_MODULE_6__.defined)(this.parenLeft); + const parenRight = (0,_util__WEBPACK_IMPORTED_MODULE_6__.defined)(this.parenRight); + const parenWidth = parenLeft.getMetrics().width + + parenRight.getMetrics().width + + this.render_options.parenLeftPadding + + this.render_options.parenRightPadding; + return this.glyph.getMetrics().width + parenWidth; + } + else { + return this.glyph.getMetrics().width; + } + } + /** Attach this accidental to `note`, which must be a `StaveNote`. */ + setNote(note) { + (0,_util__WEBPACK_IMPORTED_MODULE_6__.defined)(note, 'ArgumentError', `Bad note value: ${note}`); + this.note = note; + // Accidentals attached to grace notes are rendered smaller. + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isGraceNote)(note)) { + this.render_options.font_scale = 25; + this.reset(); + } + return this; + } + /** If called, draws parenthesis around accidental. */ + setAsCautionary() { + this.cautionary = true; + this.render_options.font_scale = 28; + this.reset(); + return this; + } + /** Render accidental onto canvas. */ + draw() { + const { type, position, index, cautionary, x_shift, y_shift, glyph, render_options: { parenLeftPadding, parenRightPadding }, } = this; + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + // Figure out the start `x` and `y` coordinates for note and index. + const start = note.getModifierStartXY(position, index); + let accX = start.x + x_shift; + const accY = start.y + y_shift; + L('Rendering: ', type, accX, accY); + if (!cautionary) { + glyph.render(ctx, accX, accY); + } + else { + const parenLeft = (0,_util__WEBPACK_IMPORTED_MODULE_6__.defined)(this.parenLeft); + const parenRight = (0,_util__WEBPACK_IMPORTED_MODULE_6__.defined)(this.parenRight); + // Render the accidental in parentheses. + parenRight.render(ctx, accX, accY); + accX -= parenRight.getMetrics().width; + accX -= parenRightPadding; + accX -= this.accidental.parenRightPaddingAdjustment; + glyph.render(ctx, accX, accY); + accX -= glyph.getMetrics().width; + accX -= parenLeftPadding; + parenLeft.render(ctx, accX, accY); + } + } +} +/** To enable logging for this class. Set `Vex.Flow.Accidental.DEBUG` to `true`. */ +Accidental.DEBUG = false; + + +/***/ }), + +/***/ "./src/annotation.ts": +/*!***************************!*\ + !*** ./src/annotation.ts ***! + \***************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "AnnotationHorizontalJustify": () => (/* binding */ AnnotationHorizontalJustify), +/* harmony export */ "AnnotationVerticalJustify": () => (/* binding */ AnnotationVerticalJustify), +/* harmony export */ "Annotation": () => (/* binding */ Annotation) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _textformatter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./textformatter */ "./src/textformatter.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + + + +// eslint-disable-next-line +function L(...args) { + if (Annotation.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_6__.log)('Vex.Flow.Annotation', args); +} +var AnnotationHorizontalJustify; +(function (AnnotationHorizontalJustify) { + AnnotationHorizontalJustify[AnnotationHorizontalJustify["LEFT"] = 1] = "LEFT"; + AnnotationHorizontalJustify[AnnotationHorizontalJustify["CENTER"] = 2] = "CENTER"; + AnnotationHorizontalJustify[AnnotationHorizontalJustify["RIGHT"] = 3] = "RIGHT"; + AnnotationHorizontalJustify[AnnotationHorizontalJustify["CENTER_STEM"] = 4] = "CENTER_STEM"; +})(AnnotationHorizontalJustify || (AnnotationHorizontalJustify = {})); +var AnnotationVerticalJustify; +(function (AnnotationVerticalJustify) { + AnnotationVerticalJustify[AnnotationVerticalJustify["TOP"] = 1] = "TOP"; + AnnotationVerticalJustify[AnnotationVerticalJustify["CENTER"] = 2] = "CENTER"; + AnnotationVerticalJustify[AnnotationVerticalJustify["BOTTOM"] = 3] = "BOTTOM"; + AnnotationVerticalJustify[AnnotationVerticalJustify["CENTER_STEM"] = 4] = "CENTER_STEM"; +})(AnnotationVerticalJustify || (AnnotationVerticalJustify = {})); +/** + * Annotations are modifiers that can be attached to + * notes. + * + * See `tests/annotation_tests.ts` for usage examples. + */ +class Annotation extends _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier { + /** + * Annotations inherit from `Modifier` and is positioned correctly when + * in a `ModifierContext`. + * Create a new `Annotation` with the string `text`. + */ + constructor(text) { + super(); + this.text = text; + this.horizontalJustification = AnnotationHorizontalJustify.CENTER; + // warning: the default in the constructor is TOP, but in the factory the default is BOTTOM. + // this is to support legacy application that may expect this. + this.verticalJustification = AnnotationVerticalJustify.TOP; + this.resetFont(); + // The default width is calculated from the text. + this.setWidth(_tables__WEBPACK_IMPORTED_MODULE_3__.Tables.textWidth(text)); + } + /** Annotations category string. */ + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_5__.Category.Annotation; + } + /** Arrange annotations within a `ModifierContext` */ + static format(annotations, state) { + if (!annotations || annotations.length === 0) + return false; + let width = 0; + for (let i = 0; i < annotations.length; ++i) { + const annotation = annotations[i]; + const textFormatter = _textformatter__WEBPACK_IMPORTED_MODULE_4__.TextFormatter.create(annotation.textFont); + // Text height is expressed in fractional stave spaces. + const textLines = (5 + textFormatter.maxHeight) / _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.STAVE_LINE_DISTANCE; + let verticalSpaceNeeded = textLines; + const note = annotation.checkAttachedNote(); + const stave = note.getStave(); + const stemDirection = note.hasStem() ? note.getStemDirection() : _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP; + let stemHeight = 0; + let lines = 5; + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isTabNote)(note)) { + if (note.render_options.draw_stem) { + const stem = note.getStem(); + if (stem) { + stemHeight = Math.abs(stem.getHeight()) / _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.STAVE_LINE_DISTANCE; + } + } + else { + stemHeight = 0; + } + } + else if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isStemmableNote)(note)) { + const stem = note.getStem(); + if (stem && note.getNoteType() === 'n') { + stemHeight = Math.abs(stem.getHeight()) / _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.STAVE_LINE_DISTANCE; + } + } + if (stave) { + lines = stave.getNumLines(); + } + // Get the text width from the font metrics. + const textWidth = textFormatter.getWidthForTextInPx(annotation.text); + width = Math.max(width, textWidth); + if (annotation.verticalJustification === this.VerticalJustify.TOP) { + let noteLine = note.getLineNumber(true); + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isTabNote)(note)) { + noteLine = lines - (note.leastString() - 0.5); + } + if (stemDirection === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP) { + noteLine += stemHeight; + } + const curTop = noteLine + state.top_text_line + 0.5; + if (curTop < lines) { + annotation.setTextLine(lines - noteLine); + verticalSpaceNeeded += lines - noteLine; + state.top_text_line = verticalSpaceNeeded; + } + else { + annotation.setTextLine(state.top_text_line); + state.top_text_line += verticalSpaceNeeded; + } + } + else if (annotation.verticalJustification === this.VerticalJustify.BOTTOM) { + let noteLine = lines - note.getLineNumber(); + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isTabNote)(note)) { + noteLine = note.greatestString() - 1; + } + if (stemDirection === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN) { + noteLine += stemHeight; + } + const curBottom = noteLine + state.text_line + 1; + if (curBottom < lines) { + annotation.setTextLine(lines - curBottom); + verticalSpaceNeeded += lines - curBottom; + state.text_line = verticalSpaceNeeded; + } + else { + annotation.setTextLine(state.text_line); + state.text_line += verticalSpaceNeeded; + } + } + else { + annotation.setTextLine(state.text_line); + } + } + state.left_shift += width / 2; + state.right_shift += width / 2; + return true; + } + /** + * Set vertical position of text (above or below stave). + * @param just value in `AnnotationVerticalJustify`. + */ + setVerticalJustification(just) { + this.verticalJustification = typeof just === 'string' ? Annotation.VerticalJustifyString[just] : just; + return this; + } + /** + * Get horizontal justification. + */ + getJustification() { + return this.horizontalJustification; + } + /** + * Set horizontal justification. + * @param justification value in `Annotation.Justify`. + */ + setJustification(just) { + this.horizontalJustification = typeof just === 'string' ? Annotation.HorizontalJustifyString[just] : just; + return this; + } + /** Render text beside the note. */ + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + const stemDirection = note.hasStem() ? note.getStemDirection() : _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP; + const textFormatter = _textformatter__WEBPACK_IMPORTED_MODULE_4__.TextFormatter.create(this.textFont); + const start = note.getModifierStartXY(_modifier__WEBPACK_IMPORTED_MODULE_1__.ModifierPosition.ABOVE, this.index); + this.setRendered(); + // We're changing context parameters. Save current state. + ctx.save(); + const classString = Object.keys(this.getAttribute('classes')).join(' '); + ctx.openGroup(classString, this.getAttribute('id')); + ctx.setFont(this.textFont); + const text_width = ctx.measureText(this.text).width; + const text_height = textFormatter.maxHeight + 2; + let x; + let y; + if (this.horizontalJustification === AnnotationHorizontalJustify.LEFT) { + x = start.x; + } + else if (this.horizontalJustification === AnnotationHorizontalJustify.RIGHT) { + x = start.x - text_width; + } + else if (this.horizontalJustification === AnnotationHorizontalJustify.CENTER) { + x = start.x - text_width / 2; + } /* CENTER_STEM */ + else { + x = note.getStemX() - text_width / 2; + } + let stem_ext = {}; + let spacing = 0; + const has_stem = note.hasStem(); + const stave = note.checkStave(); + // The position of the text varies based on whether or not the note + // has a stem. + if (has_stem) { + stem_ext = note.checkStem().getExtents(); + spacing = stave.getSpacingBetweenLines(); + } + if (this.verticalJustification === AnnotationVerticalJustify.BOTTOM) { + // Use the largest (lowest) Y value + const ys = note.getYs(); + y = ys.reduce((a, b) => (a > b ? a : b)); + y += (this.text_line + 1) * _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.STAVE_LINE_DISTANCE + text_height; + if (has_stem && stemDirection === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN) { + y = Math.max(y, stem_ext.topY + text_height + spacing * this.text_line); + } + } + else if (this.verticalJustification === AnnotationVerticalJustify.CENTER) { + const yt = note.getYForTopText(this.text_line) - 1; + const yb = stave.getYForBottomText(this.text_line); + y = yt + (yb - yt) / 2 + text_height / 2; + } + else if (this.verticalJustification === AnnotationVerticalJustify.TOP) { + y = note.getYs()[0] - (this.text_line + 1) * _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.STAVE_LINE_DISTANCE; + if (has_stem && stemDirection === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP) { + // If the stem is above the stave already, go with default line width vs. actual + // since the lines between don't really matter. + spacing = stem_ext.topY < stave.getTopLineTopY() ? _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.STAVE_LINE_DISTANCE : spacing; + y = Math.min(y, stem_ext.topY - spacing * (this.text_line + 1)); + } + } /* CENTER_STEM */ + else { + const extents = note.getStemExtents(); + y = extents.topY + (extents.baseY - extents.topY) / 2 + text_height / 2; + } + L('Rendering annotation: ', this.text, x, y); + ctx.fillText(this.text, x, y); + ctx.closeGroup(); + ctx.restore(); + } +} +/** To enable logging for this class. Set `Vex.Flow.Annotation.DEBUG` to `true`. */ +Annotation.DEBUG = false; +Annotation.TEXT_FONT = Object.assign({}, _element__WEBPACK_IMPORTED_MODULE_0__.Element.TEXT_FONT); +/** Text annotations can be positioned and justified relative to the note. */ +Annotation.HorizontalJustify = AnnotationHorizontalJustify; +Annotation.HorizontalJustifyString = { + left: AnnotationHorizontalJustify.LEFT, + right: AnnotationHorizontalJustify.RIGHT, + center: AnnotationHorizontalJustify.CENTER, + centerStem: AnnotationHorizontalJustify.CENTER_STEM, +}; +Annotation.VerticalJustify = AnnotationVerticalJustify; +Annotation.VerticalJustifyString = { + above: AnnotationVerticalJustify.TOP, + top: AnnotationVerticalJustify.TOP, + below: AnnotationVerticalJustify.BOTTOM, + bottom: AnnotationVerticalJustify.BOTTOM, + center: AnnotationVerticalJustify.CENTER, + centerStem: AnnotationVerticalJustify.CENTER_STEM, +}; + + +/***/ }), + +/***/ "./src/articulation.ts": +/*!*****************************!*\ + !*** ./src/articulation.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Articulation": () => (/* binding */ Articulation) +/* harmony export */ }); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author: Larry Kuhns. +// MIT License + + + + + + +// eslint-disable-next-line +function L(...args) { + if (Articulation.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_5__.log)('Vex.Flow.Articulation', args); +} +const { ABOVE, BELOW } = _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position; +function roundToNearestHalf(mathFn, value) { + return mathFn(value / 0.5) * 0.5; +} +// This includes both staff and ledger lines +function isWithinLines(line, position) { + return position === ABOVE ? line <= 5 : line >= 1; +} +function getRoundingFunction(line, position) { + if (isWithinLines(line, position)) { + if (position === ABOVE) { + return Math.ceil; + } + else { + return Math.floor; + } + } + else { + return Math.round; + } +} +function snapLineToStaff(canSitBetweenLines, line, position, offsetDirection) { + // Initially, snap to nearest staff line or space + const snappedLine = roundToNearestHalf(getRoundingFunction(line, position), line); + const canSnapToStaffSpace = canSitBetweenLines && isWithinLines(snappedLine, position); + const onStaffLine = snappedLine % 1 === 0; + if (canSnapToStaffSpace && onStaffLine) { + const HALF_STAFF_SPACE = 0.5; + return snappedLine + HALF_STAFF_SPACE * -offsetDirection; + } + else { + return snappedLine; + } +} +// Helper function for checking if a Note object is either a StaveNote or a GraceNote. +const isStaveOrGraceNote = (note) => (0,_typeguard__WEBPACK_IMPORTED_MODULE_4__.isStaveNote)(note) || (0,_typeguard__WEBPACK_IMPORTED_MODULE_4__.isGraceNote)(note); +function getTopY(note, textLine) { + const stemDirection = note.getStemDirection(); + const { topY: stemTipY, baseY: stemBaseY } = note.getStemExtents(); + if (isStaveOrGraceNote(note)) { + if (note.hasStem()) { + if (stemDirection === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP) { + return stemTipY; + } + else { + return stemBaseY; + } + } + else { + return Math.min(...note.getYs()); + } + } + else if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_4__.isTabNote)(note)) { + if (note.hasStem()) { + if (stemDirection === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP) { + return stemTipY; + } + else { + return note.checkStave().getYForTopText(textLine); + } + } + else { + return note.checkStave().getYForTopText(textLine); + } + } + else { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('UnknownCategory', 'Only can get the top and bottom ys of stavenotes and tabnotes'); + } +} +function getBottomY(note, textLine) { + const stemDirection = note.getStemDirection(); + const { topY: stemTipY, baseY: stemBaseY } = note.getStemExtents(); + if (isStaveOrGraceNote(note)) { + if (note.hasStem()) { + if (stemDirection === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP) { + return stemBaseY; + } + else { + return stemTipY; + } + } + else { + return Math.max(...note.getYs()); + } + } + else if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_4__.isTabNote)(note)) { + if (note.hasStem()) { + if (stemDirection === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP) { + return note.checkStave().getYForBottomText(textLine); + } + else { + return stemTipY; + } + } + else { + return note.checkStave().getYForBottomText(textLine); + } + } + else { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('UnknownCategory', 'Only can get the top and bottom ys of stavenotes and tabnotes'); + } +} +/** + * Get the initial offset of the articulation from the y value of the starting position. + * This is required because the top/bottom text positions already have spacing applied to + * provide a "visually pleasant" default position. However the y values provided from + * the stavenote's top/bottom do *not* have any pre-applied spacing. This function + * normalizes this asymmetry. + * @param note + * @param position + * @returns + */ +function getInitialOffset(note, position) { + const isOnStemTip = (position === ABOVE && note.getStemDirection() === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP) || + (position === BELOW && note.getStemDirection() === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN); + if (isStaveOrGraceNote(note)) { + if (note.hasStem() && isOnStemTip) { + return 0.5; + } + else { + // this amount is larger than the stem-tip offset because we start from + // the center of the notehead + return 1; + } + } + else { + if (note.hasStem() && isOnStemTip) { + return 1; + } + else { + return 0; + } + } +} +/** + * Articulations and Accents are modifiers that can be + * attached to notes. The complete list of articulations is available in + * `tables.ts` under `Vex.Flow.articulationCodes`. + * + * See `tests/articulation_tests.ts` for usage examples. + */ +class Articulation extends _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier { + /** + * Create a new articulation. + * @param type entry in `Vex.Flow.articulationCodes` in `tables.ts` + */ + constructor(type) { + super(); + this.type = type; + this.position = BELOW; + this.render_options = { + font_scale: 38, + }; + this.reset(); + } + /** Articulations category string. */ + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_4__.Category.Articulation; + } + /** + * FIXME: + * Most of the complex formatting logic (ie: snapping to space) is + * actually done in .render(). But that logic belongs in this method. + * + * Unfortunately, this isn't possible because, by this point, stem lengths + * have not yet been finalized. Finalized stem lengths are required to determine the + * initial position of any stem-side articulation. + * + * This indicates that all objects should have their stave set before being + * formatted. It can't be an optional if you want accurate vertical positioning. + * Consistently positioned articulations that play nice with other modifiers + * won't be possible until we stop relying on render-time formatting. + * + * Ideally, when this function has completed, the vertical articulation positions + * should be ready to render without further adjustment. But the current state + * is far from this ideal. + */ + static format(articulations, state) { + if (!articulations || articulations.length === 0) + return false; + const margin = 0.5; + const getIncrement = (articulation, line, position) => roundToNearestHalf(getRoundingFunction(line, position), (0,_util__WEBPACK_IMPORTED_MODULE_5__.defined)(articulation.glyph.getMetrics().height) / 10 + margin); + articulations.forEach((articulation) => { + const note = articulation.checkAttachedNote(); + let lines = 5; + const stemDirection = note.hasStem() ? note.getStemDirection() : _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP; + let stemHeight = 0; + // Decide if we need to consider beam direction in placement. + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_4__.isStemmableNote)(note)) { + const stem = note.getStem(); + if (stem) { + stemHeight = Math.abs(stem.getHeight()) / _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.STAVE_LINE_DISTANCE; + } + } + const stave = note.getStave(); + if (stave) { + lines = stave.getNumLines(); + } + if (articulation.getPosition() === ABOVE) { + let noteLine = note.getLineNumber(true); + if (stemDirection === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP) { + noteLine += stemHeight; + } + let increment = getIncrement(articulation, state.top_text_line, ABOVE); + const curTop = noteLine + state.top_text_line + 0.5; + // If articulation must be above stave, add lines between note and stave top + if (!articulation.articulation.between_lines && curTop < lines) { + increment += lines - curTop; + } + articulation.setTextLine(state.top_text_line); + state.top_text_line += increment; + } + else if (articulation.getPosition() === BELOW) { + let noteLine = Math.max(lines - note.getLineNumber(), 0); + if (stemDirection === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN) { + noteLine += stemHeight; + } + let increment = getIncrement(articulation, state.text_line, BELOW); + const curBottom = noteLine + state.text_line + 0.5; + // if articulation must be below stave, add lines from note to stave bottom + if (!articulation.articulation.between_lines && curBottom < lines) { + increment += lines - curBottom; + } + articulation.setTextLine(state.text_line); + state.text_line += increment; + } + }); + const width = articulations + .map((articulation) => articulation.getWidth()) + .reduce((maxWidth, articWidth) => Math.max(articWidth, maxWidth)); + state.left_shift += width / 2; + state.right_shift += width / 2; + return true; + } + static easyScoreHook({ articulations }, note, builder) { + if (!articulations) + return; + const articNameToCode = { + staccato: 'a.', + tenuto: 'a-', + accent: 'a>', + }; + articulations + .split(',') + .map((articString) => articString.trim().split('.')) + .map(([name, position]) => { + const artic = { type: articNameToCode[name] }; + if (position) + artic.position = _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.PositionString[position]; + return builder.getFactory().Articulation(artic); + }) + .map((artic) => note.addModifier(artic, 0)); + } + reset() { + this.articulation = _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.articulationCodes(this.type); + const articulation = (0,_util__WEBPACK_IMPORTED_MODULE_5__.defined)(this.articulation, 'ArgumentError', `Articulation not found: ${this.type}`); + const code = (this.position === ABOVE ? articulation.aboveCode : articulation.belowCode) || articulation.code; + this.glyph = new _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph(code !== null && code !== void 0 ? code : '', this.render_options.font_scale); + this.setWidth((0,_util__WEBPACK_IMPORTED_MODULE_5__.defined)(this.glyph.getMetrics().width)); + } + /** Render articulation in position next to note. */ + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const index = this.checkIndex(); + const { position, glyph, text_line: textLine } = this; + const canSitBetweenLines = this.articulation.between_lines; + const stave = note.checkStave(); + const staffSpace = stave.getSpacingBetweenLines(); + const isTab = (0,_typeguard__WEBPACK_IMPORTED_MODULE_4__.isTabNote)(note); + // Articulations are centered over/under the note head. + const { x } = note.getModifierStartXY(position, index); + const shouldSitOutsideStaff = !canSitBetweenLines || isTab; + const initialOffset = getInitialOffset(note, position); + const padding = _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().lookupMetric(`articulation.${glyph.getCode()}.padding`, 0); + let y = { + [ABOVE]: () => { + glyph.setOrigin(0.5, 1); + const y = getTopY(note, textLine) - (textLine + initialOffset) * staffSpace; + return shouldSitOutsideStaff ? Math.min(stave.getYForTopText(Articulation.INITIAL_OFFSET), y) : y; + }, + [BELOW]: () => { + glyph.setOrigin(0.5, 0); + const y = getBottomY(note, textLine) + (textLine + initialOffset) * staffSpace; + return shouldSitOutsideStaff ? Math.max(stave.getYForBottomText(Articulation.INITIAL_OFFSET), y) : y; + }, + }[position](); + if (!isTab) { + const offsetDirection = position === ABOVE ? -1 : +1; + const noteLine = note.getKeyProps()[index].line; + const distanceFromNote = (note.getYs()[index] - y) / staffSpace; + const articLine = distanceFromNote + Number(noteLine); + const snappedLine = snapLineToStaff(canSitBetweenLines, articLine, position, offsetDirection); + if (isWithinLines(snappedLine, position)) + glyph.setOrigin(0.5, 0.5); + y += Math.abs(snappedLine - articLine) * staffSpace * offsetDirection + padding * offsetDirection; + } + L(`Rendering articulation at (x: ${x}, y: ${y})`); + glyph.render(ctx, x, y); + } +} +/** To enable logging for this class. Set `Vex.Flow.Articulation.DEBUG` to `true`. */ +Articulation.DEBUG = false; +Articulation.INITIAL_OFFSET = -0.5; + + +/***/ }), + +/***/ "./src/barnote.ts": +/*!************************!*\ + !*** ./src/barnote.ts ***! + \************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "BarNote": () => (/* binding */ BarNote) +/* harmony export */ }); +/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./note */ "./src/note.ts"); +/* harmony import */ var _stavebarline__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stavebarline */ "./src/stavebarline.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + +// eslint-disable-next-line +function L(...args) { + if (BarNote.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_3__.log)('Vex.Flow.BarNote', args); +} +/** + * A `BarNote` is used to render bar lines (from `barline.ts`). `BarNote`s can + * be added to a voice and rendered in the middle of a stave. Since it has no + * duration, it consumes no `tick`s, and is dealt with appropriately by the formatter. + * + * See `tests/barnote_tests.ts` for usage examples. + */ +class BarNote extends _note__WEBPACK_IMPORTED_MODULE_0__.Note { + constructor(type = _stavebarline__WEBPACK_IMPORTED_MODULE_1__.BarlineType.SINGLE) { + super({ duration: 'b' }); + this.metrics = { + widths: {}, + }; + const TYPE = _stavebarline__WEBPACK_IMPORTED_MODULE_1__.BarlineType; + this.metrics.widths = { + [TYPE.SINGLE]: 8, + [TYPE.DOUBLE]: 12, + [TYPE.END]: 15, + [TYPE.REPEAT_BEGIN]: 14, + [TYPE.REPEAT_END]: 14, + [TYPE.REPEAT_BOTH]: 18, + [TYPE.NONE]: 0, + }; + // Tell the formatter that bar notes have no duration. + this.ignore_ticks = true; + this.setType(type); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_2__.Category.BarNote; + } + /** Get the type of bar note.*/ + getType() { + return this.type; + } + /** Set the type of bar note. */ + setType(type) { + this.type = typeof type === 'string' ? _stavebarline__WEBPACK_IMPORTED_MODULE_1__.Barline.typeString[type] : type; + // Set width to width of relevant `Barline`. + this.setWidth(this.metrics.widths[this.type]); + return this; + } + /* Overridden to ignore */ + // eslint-disable-next-line + addToModifierContext(mc) { + // DO NOTHING. + return this; + } + /** Overridden to ignore. */ + preFormat() { + this.preFormatted = true; + return this; + } + /** Render note to stave. */ + draw() { + const ctx = this.checkContext(); + L('Rendering bar line at: ', this.getAbsoluteX()); + if (this.style) + this.applyStyle(ctx); + const barline = new _stavebarline__WEBPACK_IMPORTED_MODULE_1__.Barline(this.type); + barline.setX(this.getAbsoluteX()); + barline.draw(this.checkStave()); + if (this.style) + this.restoreStyle(ctx); + this.setRendered(); + } +} +/** To enable logging for this class. Set `Vex.Flow.BarNote.DEBUG` to `true`. */ +BarNote.DEBUG = false; + + +/***/ }), + +/***/ "./src/beam.ts": +/*!*********************!*\ + !*** ./src/beam.ts ***! + \*********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Beam": () => (/* binding */ Beam) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _fraction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./fraction */ "./src/fraction.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _tuplet__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tuplet */ "./src/tuplet.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + + + +function calculateStemDirection(notes) { + let lineSum = 0; + notes.forEach((note) => { + if (note.keyProps) { + note.keyProps.forEach((keyProp) => { + lineSum += keyProp.line - 3; + }); + } + }); + if (lineSum >= 0) { + return _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN; + } + return _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP; +} +function getStemSlope(firstNote, lastNote) { + const firstStemTipY = firstNote.getStemExtents().topY; + const firstStemX = firstNote.getStemX(); + const lastStemTipY = lastNote.getStemExtents().topY; + const lastStemX = lastNote.getStemX(); + return (lastStemTipY - firstStemTipY) / (lastStemX - firstStemX); +} +const BEAM_LEFT = 'L'; +const BEAM_RIGHT = 'R'; +const BEAM_BOTH = 'B'; +/** `Beams` span over a set of `StemmableNotes`. */ +class Beam extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + constructor(notes, auto_stem = false) { + super(); + this.slope = 0; + this.y_shift = 0; + if (!notes || notes.length === 0) { + throw new _util__WEBPACK_IMPORTED_MODULE_6__.RuntimeError('BadArguments', 'No notes provided for beam.'); + } + if (notes.length === 1) { + throw new _util__WEBPACK_IMPORTED_MODULE_6__.RuntimeError('BadArguments', 'Too few notes for beam.'); + } + // Validate beam line, direction and ticks. + this.ticks = notes[0].getIntrinsicTicks(); + if (this.ticks >= _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.durationToTicks('4')) { + throw new _util__WEBPACK_IMPORTED_MODULE_6__.RuntimeError('BadArguments', 'Beams can only be applied to notes shorter than a quarter note.'); + } + let i; // shared iterator + let note; + this.stem_direction = _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP; + for (i = 0; i < notes.length; ++i) { + note = notes[i]; + if (note.hasStem()) { + this.stem_direction = note.getStemDirection(); + break; + } + } + let stem_direction = this.stem_direction; + // Figure out optimal stem direction based on given notes + if (auto_stem && (0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isStaveNote)(notes[0])) { + stem_direction = calculateStemDirection(notes); + } + else if (auto_stem && (0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isTabNote)(notes[0])) { + // Auto Stem TabNotes + const stem_weight = notes.reduce((memo, note) => memo + note.getStemDirection(), 0); + stem_direction = stem_weight > -1 ? _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP : _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN; + } + // Apply stem directions and attach beam to notes + for (i = 0; i < notes.length; ++i) { + note = notes[i]; + if (auto_stem) { + note.setStemDirection(stem_direction); + this.stem_direction = stem_direction; + } + note.setBeam(this); + } + this.postFormatted = false; + this.notes = notes; + this.beam_count = this.getBeamCount(); + this.break_on_indices = []; + this.render_options = { + beam_width: 5, + max_slope: 0.25, + min_slope: -0.25, + slope_iterations: 20, + slope_cost: 100, + show_stemlets: false, + stemlet_extension: 7, + partial_beam_length: 10, + flat_beams: false, + min_flat_beam_offset: 15, + }; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_5__.Category.Beam; + } + /** Get the direction of the beam */ + getStemDirection() { + return this.stem_direction; + } + /** + * Get the default beam groups for a provided time signature. + * Attempt to guess if the time signature is not found in table. + * Currently this is fairly naive. + */ + static getDefaultBeamGroups(time_sig) { + if (!time_sig || time_sig === 'c') { + time_sig = '4/4'; + } + const defaults = { + '1/2': ['1/2'], + '2/2': ['1/2'], + '3/2': ['1/2'], + '4/2': ['1/2'], + '1/4': ['1/4'], + '2/4': ['1/4'], + '3/4': ['1/4'], + '4/4': ['1/4'], + '1/8': ['1/8'], + '2/8': ['2/8'], + '3/8': ['3/8'], + '4/8': ['2/8'], + '1/16': ['1/16'], + '2/16': ['2/16'], + '3/16': ['3/16'], + '4/16': ['2/16'], + }; + const groups = defaults[time_sig]; + if (groups === undefined) { + // If no beam groups found, naively determine + // the beam groupings from the time signature + const beatTotal = parseInt(time_sig.split('/')[0], 10); + const beatValue = parseInt(time_sig.split('/')[1], 10); + const tripleMeter = beatTotal % 3 === 0; + if (tripleMeter) { + return [new _fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(3, beatValue)]; + } + else if (beatValue > 4) { + return [new _fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(2, beatValue)]; + } + else if (beatValue <= 4) { + return [new _fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(1, beatValue)]; + } + } + else { + return groups.map((group) => new _fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction().parse(group)); + } + return [new _fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(1, 4)]; + } + /** + * A helper function to automatically build basic beams for a voice. For more + * complex auto-beaming use `Beam.generateBeams()`. + * @param voice the voice to generate the beams for + * @param stem_direction a stem direction to apply to the entire voice + * @param groups an array of `Fraction` representing beat groupings for the beam + */ + static applyAndGetBeams(voice, stem_direction, groups) { + return Beam.generateBeams(voice.getTickables(), { groups, stem_direction }); + } + /** + * A helper function to autimatically build beams for a voice with + * configuration options. + * + * Example configuration object: + * + * ``` + * config = { + * groups: [new Vex.Flow.Fraction(2, 8)], + * stem_direction: -1, + * beam_rests: true, + * beam_middle_only: true, + * show_stemlets: false + * }; + * ``` + * @param notes an array of notes to create the beams for + * @param config the configuration object + * @param config.stem_direction set to apply the same direction to all notes + * @param config.beam_rests set to `true` to include rests in the beams + * @param config.beam_middle_only set to `true` to only beam rests in the middle of the beat + * @param config.show_stemlets set to `true` to draw stemlets for rests + * @param config.maintain_stem_directions set to `true` to not apply new stem directions + * @param config.groups array of `Fractions` that represent the beat structure to beam the notes + * + */ + static generateBeams(notes, config = {}) { + if (!config.groups || !config.groups.length) { + config.groups = [new _fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(2, 8)]; + } + // Convert beam groups to tick amounts + const tickGroups = config.groups.map((group) => { + if (!group.multiply) { + throw new _util__WEBPACK_IMPORTED_MODULE_6__.RuntimeError('InvalidBeamGroups', 'The beam groups must be an array of Vex.Flow.Fractions'); + } + return group.clone().multiply(_tables__WEBPACK_IMPORTED_MODULE_3__.Tables.RESOLUTION, 1); + }); + const unprocessedNotes = notes; + let currentTickGroup = 0; + let noteGroups = []; + let currentGroup = []; + function getTotalTicks(vf_notes) { + return vf_notes.reduce((memo, note) => note.getTicks().clone().add(memo), new _fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(0, 1)); + } + function nextTickGroup() { + if (tickGroups.length - 1 > currentTickGroup) { + currentTickGroup += 1; + } + else { + currentTickGroup = 0; + } + } + function createGroups() { + let nextGroup = []; + // number of ticks in current group + let currentGroupTotalTicks = new _fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(0, 1); + unprocessedNotes.forEach((unprocessedNote) => { + nextGroup = []; + if (unprocessedNote.shouldIgnoreTicks()) { + noteGroups.push(currentGroup); + currentGroup = nextGroup; + return; // Ignore untickables (like bar notes) + } + currentGroup.push(unprocessedNote); + const ticksPerGroup = tickGroups[currentTickGroup].clone(); + const totalTicks = getTotalTicks(currentGroup).add(currentGroupTotalTicks); + // Double the amount of ticks in a group, if it's an unbeamable tuplet + const unbeamable = _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.durationToNumber(unprocessedNote.getDuration()) < 8; + if (unbeamable && unprocessedNote.getTuplet()) { + ticksPerGroup.numerator *= 2; + } + // If the note that was just added overflows the group tick total + if (totalTicks.greaterThan(ticksPerGroup)) { + // If the overflow note can be beamed, start the next group + // with it. Unbeamable notes leave the group overflowed. + if (!unbeamable) { + const note = currentGroup.pop(); + if (note) + nextGroup.push(note); + } + noteGroups.push(currentGroup); + // We have overflown, so we're going to next tick group. As we might have + // overflown by more than 1 group, we need to go forward as many times as + // needed, decreasing currentGroupTotalTicks by as many ticks as there are + // in current groups as we go forward. + do { + currentGroupTotalTicks = totalTicks.subtract(tickGroups[currentTickGroup]); + nextTickGroup(); + } while (currentGroupTotalTicks.greaterThanEquals(tickGroups[currentTickGroup])); + currentGroup = nextGroup; + } + else if (totalTicks.equals(ticksPerGroup)) { + noteGroups.push(currentGroup); + currentGroupTotalTicks = new _fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(0, 1); + currentGroup = nextGroup; + nextTickGroup(); + } + }); + // Adds any remainder notes beam + if (currentGroup.length > 0) { + noteGroups.push(currentGroup); + } + } + function getBeamGroups() { + return noteGroups.filter((group) => { + if (group.length > 1) { + let beamable = true; + group.forEach((note) => { + if (note.getIntrinsicTicks() >= _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.durationToTicks('4')) { + beamable = false; + } + }); + return beamable; + } + return false; + }); + } + // Splits up groups by Rest + function sanitizeGroups() { + const sanitizedGroups = []; + noteGroups.forEach((group) => { + let tempGroup = []; + group.forEach((note, index, group) => { + const isFirstOrLast = index === 0 || index === group.length - 1; + const prevNote = group[index - 1]; + const breaksOnEachRest = !config.beam_rests && note.isRest(); + const breaksOnFirstOrLastRest = config.beam_rests && config.beam_middle_only && note.isRest() && isFirstOrLast; + let breakOnStemChange = false; + if (config.maintain_stem_directions && prevNote && !note.isRest() && !prevNote.isRest()) { + const prevDirection = prevNote.getStemDirection(); + const currentDirection = note.getStemDirection(); + breakOnStemChange = currentDirection !== prevDirection; + } + const isUnbeamableDuration = parseInt(note.getDuration(), 10) < 8; + // Determine if the group should be broken at this note + const shouldBreak = breaksOnEachRest || breaksOnFirstOrLastRest || breakOnStemChange || isUnbeamableDuration; + if (shouldBreak) { + // Add current group + if (tempGroup.length > 0) { + sanitizedGroups.push(tempGroup); + } + // Start a new group. Include the current note if the group + // was broken up by stem direction, as that note needs to start + // the next group of notes + tempGroup = breakOnStemChange ? [note] : []; + } + else { + // Add note to group + tempGroup.push(note); + } + }); + // If there is a remaining group, add it as well + if (tempGroup.length > 0) { + sanitizedGroups.push(tempGroup); + } + }); + noteGroups = sanitizedGroups; + } + function formatStems() { + noteGroups.forEach((group) => { + let stemDirection; + if (config.maintain_stem_directions) { + const note = findFirstNote(group); + stemDirection = note ? note.getStemDirection() : _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP; + } + else { + if (config.stem_direction) { + stemDirection = config.stem_direction; + } + else { + stemDirection = calculateStemDirection(group); + } + } + applyStemDirection(group, stemDirection); + }); + } + function findFirstNote(group) { + for (let i = 0; i < group.length; i++) { + const note = group[i]; + if (!note.isRest()) { + return note; + } + } + return false; + } + function applyStemDirection(group, direction) { + group.forEach((note) => { + note.setStemDirection(direction); + }); + } + // Get all of the tuplets in all of the note groups + function getTuplets() { + const uniqueTuplets = []; + // Go through all of the note groups and inspect for tuplets + noteGroups.forEach((group) => { + let tuplet; + group.forEach((note) => { + const noteTuplet = note.getTuplet(); + if (noteTuplet && tuplet !== noteTuplet) { + tuplet = noteTuplet; + uniqueTuplets.push(tuplet); + } + }); + }); + return uniqueTuplets; + } + // Using closures to store the variables throughout the various functions + // IMO Keeps it this process lot cleaner - but not super consistent with + // the rest of the API's style - Silverwolf90 (Cyril) + createGroups(); + sanitizeGroups(); + formatStems(); + // Get the notes to be beamed + const beamedNoteGroups = getBeamGroups(); + // Get the tuplets in order to format them accurately + const allTuplets = getTuplets(); + // Create a Vex.Flow.Beam from each group of notes to be beamed + const beams = []; + beamedNoteGroups.forEach((group) => { + const beam = new Beam(group); + if (config.show_stemlets) { + beam.render_options.show_stemlets = true; + } + if (config.secondary_breaks) { + beam.render_options.secondary_break_ticks = _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.durationToTicks(config.secondary_breaks); + } + if (config.flat_beams === true) { + beam.render_options.flat_beams = true; + beam.render_options.flat_beam_offset = config.flat_beam_offset; + } + beams.push(beam); + }); + // Reformat tuplets + allTuplets.forEach((tuplet) => { + // Set the tuplet location based on the stem direction + const direction = tuplet.notes[0].stem_direction === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN ? _tuplet__WEBPACK_IMPORTED_MODULE_4__.TupletLocation.BOTTOM : _tuplet__WEBPACK_IMPORTED_MODULE_4__.TupletLocation.TOP; + tuplet.setTupletLocation(direction); + // If any of the notes in the tuplet are not beamed, draw a bracket. + let bracketed = false; + for (let i = 0; i < tuplet.notes.length; i++) { + const note = tuplet.notes[i]; + if (!note.hasBeam()) { + bracketed = true; + break; + } + } + tuplet.setBracketed(bracketed); + }); + return beams; + } + /** Get the notes in this beam. */ + getNotes() { + return this.notes; + } + /** Get the max number of beams in the set of notes. */ + getBeamCount() { + const beamCounts = this.notes.map((note) => note.getGlyph().beam_count); + const maxBeamCount = beamCounts.reduce((max, beamCount) => (beamCount > max ? beamCount : max)); + return maxBeamCount; + } + /** Set which note `indices` to break the secondary beam at. */ + breakSecondaryAt(indices) { + this.break_on_indices = indices; + return this; + } + /** Return the y coordinate for linear function. */ + getSlopeY(x, first_x_px, first_y_px, slope) { + return first_y_px + (x - first_x_px) * slope; + } + /** Calculate the best possible slope for the provided notes. */ + calculateSlope() { + const { notes, stem_direction: stemDirection, render_options: { max_slope, min_slope, slope_iterations, slope_cost }, } = this; + const firstNote = notes[0]; + const initialSlope = getStemSlope(firstNote, notes[notes.length - 1]); + const increment = (max_slope - min_slope) / slope_iterations; + let minCost = Number.MAX_VALUE; + let bestSlope = 0; + let yShift = 0; + // iterate through slope values to find best weighted fit + for (let slope = min_slope; slope <= max_slope; slope += increment) { + let totalStemExtension = 0; + let yShiftTemp = 0; + // iterate through notes, calculating y shift and stem extension + for (let i = 1; i < notes.length; ++i) { + const note = notes[i]; + if (note.hasStem() || note.isRest()) { + const adjustedStemTipY = this.getSlopeY(note.getStemX(), firstNote.getStemX(), firstNote.getStemExtents().topY, slope) + yShiftTemp; + const stemTipY = note.getStemExtents().topY; + // beam needs to be shifted up to accommodate note + if (stemTipY * stemDirection < adjustedStemTipY * stemDirection) { + const diff = Math.abs(stemTipY - adjustedStemTipY); + yShiftTemp += diff * -stemDirection; + totalStemExtension += diff * i; + } + else { + // beam overshoots note, account for the difference + totalStemExtension += (stemTipY - adjustedStemTipY) * stemDirection; + } + } + } + // most engraving books suggest aiming for a slope about half the angle of the + // difference between the first and last notes' stem length; + const idealSlope = initialSlope / 2; + const distanceFromIdeal = Math.abs(idealSlope - slope); + // This tries to align most beams to something closer to the idealSlope, but + // doesn't go crazy. To disable, set this.render_options.slope_cost = 0 + const cost = slope_cost * distanceFromIdeal + Math.abs(totalStemExtension); + // update state when a more ideal slope is found + if (cost < minCost) { + minCost = cost; + bestSlope = slope; + yShift = yShiftTemp; + } + } + this.slope = bestSlope; + this.y_shift = yShift; + } + /** Calculate a slope and y-shift for flat beams. */ + calculateFlatSlope() { + const { notes, stem_direction, render_options: { beam_width, min_flat_beam_offset, flat_beam_offset }, } = this; + // If a flat beam offset has not yet been supplied or calculated, + // generate one based on the notes in this particular note group + let total = 0; + let extremeY = 0; // Store the highest or lowest note here + let extremeBeamCount = 0; // The beam count of the extreme note + let currentExtreme = 0; + for (let i = 0; i < notes.length; i++) { + // Total up all of the offsets so we can average them out later + const note = notes[i]; + const stemTipY = note.getStemExtents().topY; + total += stemTipY; + // Store the highest (stems-up) or lowest (stems-down) note so the + // offset can be adjusted in case the average isn't enough + if (stem_direction === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN && currentExtreme < stemTipY) { + currentExtreme = stemTipY; + extremeY = Math.max(...note.getYs()); + extremeBeamCount = note.getBeamCount(); + } + else if (stem_direction === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP && (currentExtreme === 0 || currentExtreme > stemTipY)) { + currentExtreme = stemTipY; + extremeY = Math.min(...note.getYs()); + extremeBeamCount = note.getBeamCount(); + } + } + // Average the offsets to try and come up with a reasonable one that + // works for all of the notes in the beam group. + let offset = total / notes.length; + // In case the average isn't long enough, add or subtract some more + // based on the highest or lowest note (again, based on the stem + // direction). This also takes into account the added height due to + // the width of the beams. + const beamWidth = beam_width * 1.5; + const extremeTest = min_flat_beam_offset + extremeBeamCount * beamWidth; + const newOffset = extremeY + extremeTest * -stem_direction; + if (stem_direction === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN && offset < newOffset) { + offset = extremeY + extremeTest; + } + else if (stem_direction === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP && offset > newOffset) { + offset = extremeY - extremeTest; + } + if (!flat_beam_offset) { + // Set the offset for the group based on the calculations above. + this.render_options.flat_beam_offset = offset; + } + else if (stem_direction === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN && offset > flat_beam_offset) { + this.render_options.flat_beam_offset = offset; + } + else if (stem_direction === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP && offset < flat_beam_offset) { + this.render_options.flat_beam_offset = offset; + } + // for flat beams, the slope and y_shift are simply 0 + this.slope = 0; + this.y_shift = 0; + } + /** Return the Beam y offset. */ + getBeamYToDraw() { + const firstNote = this.notes[0]; + const firstStemTipY = firstNote.getStemExtents().topY; + let beamY = firstStemTipY; + // For flat beams, set the first and last Y to the offset, rather than + // using the note's stem extents. + if (this.render_options.flat_beams && this.render_options.flat_beam_offset) { + beamY = this.render_options.flat_beam_offset; + } + return beamY; + } + /** + * Create new stems for the notes in the beam, so that each stem + * extends into the beams. + */ + applyStemExtensions() { + const { notes, slope, y_shift, stem_direction, beam_count, render_options: { show_stemlets, stemlet_extension, beam_width }, } = this; + const firstNote = notes[0]; + const firstStemTipY = this.getBeamYToDraw(); + const firstStemX = firstNote.getStemX(); + for (let i = 0; i < notes.length; ++i) { + const note = notes[i]; + const stem = note.getStem(); + if (stem) { + const stemX = note.getStemX(); + const { topY: stemTipY } = note.getStemExtents(); + const beamedStemTipY = this.getSlopeY(stemX, firstStemX, firstStemTipY, slope) + y_shift; + const preBeamExtension = stem.getExtension(); + const beamExtension = stem_direction === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP ? stemTipY - beamedStemTipY : beamedStemTipY - stemTipY; + stem.setExtension(preBeamExtension + beamExtension); + stem.adjustHeightForBeam(); + if (note.isRest() && show_stemlets) { + const beamWidth = beam_width; + const totalBeamWidth = (beam_count - 1) * beamWidth * 1.5 + beamWidth; + stem.setVisibility(true).setStemlet(true, totalBeamWidth + stemlet_extension); + } + } + } + } + /** Return upper level beam direction. */ + lookupBeamDirection(duration, prev_tick, tick, next_tick) { + if (duration === '4') { + return BEAM_LEFT; + } + const lookup_duration = `${_tables__WEBPACK_IMPORTED_MODULE_3__.Tables.durationToNumber(duration) / 2}`; + const prev_note_gets_beam = prev_tick < _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.durationToTicks(lookup_duration); + const next_note_gets_beam = next_tick < _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.durationToTicks(lookup_duration); + const note_gets_beam = tick < _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.durationToTicks(lookup_duration); + if (prev_note_gets_beam && next_note_gets_beam && note_gets_beam) { + return BEAM_BOTH; + } + else if (prev_note_gets_beam && !next_note_gets_beam && note_gets_beam) { + return BEAM_LEFT; + } + else if (!prev_note_gets_beam && next_note_gets_beam && note_gets_beam) { + return BEAM_RIGHT; + } + return this.lookupBeamDirection(lookup_duration, prev_tick, tick, next_tick); + } + /** Get the x coordinates for the beam lines of specific `duration`. */ + getBeamLines(duration) { + const tick_of_duration = _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.durationToTicks(duration); + let beam_started = false; + const beam_lines = []; + let current_beam = undefined; + const partial_beam_length = this.render_options.partial_beam_length; + let previous_should_break = false; + let tick_tally = 0; + for (let i = 0; i < this.notes.length; ++i) { + const note = this.notes[i]; + // See if we need to break secondary beams on this note. + const ticks = note.getTicks().value(); + tick_tally += ticks; + let should_break = false; + // 8th note beams are always drawn. + if (parseInt(duration, 10) >= 8) { + // First, check to see if any indices were set up through breakSecondaryAt() + should_break = this.break_on_indices.indexOf(i) !== -1; + // If the secondary breaks were auto-configured in the render options, + // handle that as well. + if (this.render_options.secondary_break_ticks && tick_tally >= this.render_options.secondary_break_ticks) { + tick_tally = 0; + should_break = true; + } + } + const note_gets_beam = note.getIntrinsicTicks() < tick_of_duration; + const stem_x = note.getStemX() - _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.WIDTH / 2; + // Check to see if the next note in the group will get a beam at this + // level. This will help to inform the partial beam logic below. + const prev_note = this.notes[i - 1]; + const next_note = this.notes[i + 1]; + const next_note_gets_beam = next_note && next_note.getIntrinsicTicks() < tick_of_duration; + const prev_note_gets_beam = prev_note && prev_note.getIntrinsicTicks() < tick_of_duration; + const beam_alone = prev_note && next_note && note_gets_beam && !prev_note_gets_beam && !next_note_gets_beam; + // const beam_alone = note_gets_beam && !prev_note_gets_beam && !next_note_gets_beam; + if (note_gets_beam) { + // This note gets a beam at the current level + if (beam_started) { + // We're currently in the middle of a beam. Just continue it on to + // the stem X of the current note. + current_beam = beam_lines[beam_lines.length - 1]; + current_beam.end = stem_x; + // If a secondary beam break is set up, end the beam right now. + if (should_break) { + beam_started = false; + if (next_note && !next_note_gets_beam && current_beam.end === undefined) { + // This note gets a beam,.but the next one does not. This means + // we need a partial pointing right. + current_beam.end = current_beam.start - partial_beam_length; + } + } + } + else { + // No beam started yet. Start a new one. + current_beam = { start: stem_x, end: undefined }; + beam_started = true; + if (beam_alone) { + // previous and next beam exists and does not get a beam but current gets it. + const prev_tick = prev_note.getIntrinsicTicks(); + const next_tick = next_note.getIntrinsicTicks(); + const tick = note.getIntrinsicTicks(); + const beam_direction = this.lookupBeamDirection(duration, prev_tick, tick, next_tick); + if ([BEAM_LEFT, BEAM_BOTH].includes(beam_direction)) { + current_beam.end = current_beam.start - partial_beam_length; + } + else { + current_beam.end = current_beam.start + partial_beam_length; + } + } + else if (!next_note_gets_beam) { + // The next note doesn't get a beam. Draw a partial. + if ((previous_should_break || i === 0) && next_note) { + // This is the first note (but not the last one), or it is + // following a secondary break. Draw a partial to the right. + current_beam.end = current_beam.start + partial_beam_length; + } + else { + // By default, draw a partial to the left. + current_beam.end = current_beam.start - partial_beam_length; + } + } + else if (should_break) { + // This note should have a secondary break after it. Even though + // we just started a beam, it needs to end immediately. + current_beam.end = current_beam.start - partial_beam_length; + beam_started = false; + } + beam_lines.push(current_beam); + } + } + else { + // The current note does not get a beam. + beam_started = false; + } + // Store the secondary break flag to inform the partial beam logic in + // the next iteration of the loop. + previous_should_break = should_break; + } + // Add a partial beam pointing left if this is the last note in the group + const last_beam = beam_lines[beam_lines.length - 1]; + if (last_beam && last_beam.end === undefined) { + last_beam.end = last_beam.start - partial_beam_length; + } + return beam_lines; + } + /** Render the stems for each note. */ + drawStems(ctx) { + this.notes.forEach((note) => { + const stem = note.getStem(); + if (stem) { + stem.setContext(ctx).draw(); + } + }, this); + } + // Render the beam lines + drawBeamLines(ctx) { + const valid_beam_durations = ['4', '8', '16', '32', '64']; + const firstNote = this.notes[0]; + let beamY = this.getBeamYToDraw(); + const firstStemX = firstNote.getStemX(); + const beamThickness = this.render_options.beam_width * this.stem_direction; + // Draw the beams. + for (let i = 0; i < valid_beam_durations.length; ++i) { + const duration = valid_beam_durations[i]; + const beamLines = this.getBeamLines(duration); + for (let j = 0; j < beamLines.length; ++j) { + const beam_line = beamLines[j]; + const startBeamX = beam_line.start; + const startBeamY = this.getSlopeY(startBeamX, firstStemX, beamY, this.slope); + const lastBeamX = beam_line.end; + if (lastBeamX) { + const lastBeamY = this.getSlopeY(lastBeamX, firstStemX, beamY, this.slope); + ctx.beginPath(); + ctx.moveTo(startBeamX, startBeamY); + ctx.lineTo(startBeamX, startBeamY + beamThickness); + ctx.lineTo(lastBeamX + 1, lastBeamY + beamThickness); + ctx.lineTo(lastBeamX + 1, lastBeamY); + ctx.closePath(); + ctx.fill(); + } + else { + throw new _util__WEBPACK_IMPORTED_MODULE_6__.RuntimeError('NoLastBeamX', 'lastBeamX undefined.'); + } + } + beamY += beamThickness * 1.5; + } + } + /** Pre-format the beam. */ + preFormat() { + return this; + } + /** + * Post-format the beam. This can only be called after + * the notes in the beam have both `x` and `y` values. ie: they've + * been formatted and have staves. + */ + postFormat() { + if (this.postFormatted) + return; + // Calculate a smart slope if we're not forcing the beams to be flat. + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isTabNote)(this.notes[0]) || this.render_options.flat_beams) { + this.calculateFlatSlope(); + } + else { + this.calculateSlope(); + } + this.applyStemExtensions(); + this.postFormatted = true; + } + /** Render the beam to the canvas context */ + draw() { + const ctx = this.checkContext(); + this.setRendered(); + if (this.unbeamable) + return; + if (!this.postFormatted) { + this.postFormat(); + } + this.drawStems(ctx); + this.applyStyle(); + this.drawBeamLines(ctx); + this.restoreStyle(); + } +} + + +/***/ }), + +/***/ "./src/bend.ts": +/*!*********************!*\ + !*** ./src/bend.ts ***! + \*********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Bend": () => (/* binding */ Bend) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _textformatter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./textformatter */ "./src/textformatter.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + +/** Bend implements tablature bends. */ +class Bend extends _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier { + /** + * Example of a phrase: + * ``` + * [{ + * type: UP, + * text: "whole" + * width: 8; + * }, + * { + * type: DOWN, + * text: "whole" + * width: 8; + * }, + * { + * type: UP, + * text: "half" + * width: 8; + * }, + * { + * type: UP, + * text: "whole" + * width: 8; + * }, + * { + * type: DOWN, + * text: "1 1/2" + * width: 8; + * }] + * ``` + * @param text text for bend ("Full", "Half", etc.) (DEPRECATED) + * @param release if true, render a release. (DEPRECATED) + * @param phrase if set, ignore "text" and "release", and use the more sophisticated phrase specified + */ + constructor(text, release = false, phrase) { + super(); + this.text = text; + this.x_shift = 0; + this.release = release; + this.tap = ''; + this.resetFont(); + this.render_options = { + line_width: 1.5, + line_style: '#777777', + bend_width: 8, + release_width: 8, + }; + if (phrase) { + this.phrase = phrase; + } + else { + // Backward compatibility + this.phrase = [{ type: Bend.UP, text: this.text }]; + if (this.release) + this.phrase.push({ type: Bend.DOWN, text: '' }); + } + this.updateWidth(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.Bend; + } + static get UP() { + return 0; + } + static get DOWN() { + return 1; + } + // Arrange bends in `ModifierContext` + static format(bends, state) { + if (!bends || bends.length === 0) + return false; + let last_width = 0; + // Format Bends + for (let i = 0; i < bends.length; ++i) { + const bend = bends[i]; + const note = bend.checkAttachedNote(); + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_3__.isTabNote)(note)) { + const stringPos = note.leastString() - 1; + if (state.top_text_line < stringPos) { + state.top_text_line = stringPos; + } + } + bend.setXShift(last_width); + last_width = bend.getWidth(); + bend.setTextLine(state.top_text_line); + } + state.right_shift += last_width; + state.top_text_line += 1; + return true; + } + /** Set horizontal shift in pixels. */ + setXShift(value) { + this.x_shift = value; + this.updateWidth(); + return this; + } + setTap(value) { + this.tap = value; + return this; + } + /** Get text provided in the constructor. */ + getText() { + return this.text; + } + getTextHeight() { + const textFormatter = _textformatter__WEBPACK_IMPORTED_MODULE_2__.TextFormatter.create(this.textFont); + return textFormatter.maxHeight; + } + /** Recalculate width. */ + updateWidth() { + const textFormatter = _textformatter__WEBPACK_IMPORTED_MODULE_2__.TextFormatter.create(this.textFont); + const measureText = (text) => { + return textFormatter.getWidthForTextInPx(text); + }; + let totalWidth = 0; + for (let i = 0; i < this.phrase.length; ++i) { + const bend = this.phrase[i]; + if (bend.width !== undefined) { + totalWidth += bend.width; + } + else { + const additional_width = bend.type === Bend.UP ? this.render_options.bend_width : this.render_options.release_width; + bend.width = Math.max(additional_width, measureText(bend.text)) + 3; + bend.draw_width = bend.width / 2; + totalWidth += bend.width; + } + } + this.setWidth(totalWidth + this.x_shift); + return this; + } + /** Draw the bend on the rendering context. */ + draw() { + var _a; + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const start = note.getModifierStartXY(_modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.RIGHT, this.index); + start.x += 3; + start.y += 0.5; + const x_shift = this.x_shift; + const stave = note.checkStave(); + const spacing = stave.getSpacingBetweenLines(); + const lowestY = note.getYs().reduce((a, b) => (a < b ? a : b)); + // this.text_line is relative to top string in the group. + const bend_height = start.y - ((this.text_line + 1) * spacing + start.y - lowestY) + 3; + const annotation_y = start.y - ((this.text_line + 1) * spacing + start.y - lowestY) - 1; + const renderBend = (x, y, width, height) => { + const cp_x = x + width; + const cp_y = y; + ctx.save(); + ctx.beginPath(); + ctx.setLineWidth(this.render_options.line_width); + ctx.setStrokeStyle(this.render_options.line_style); + ctx.setFillStyle(this.render_options.line_style); + ctx.moveTo(x, y); + ctx.quadraticCurveTo(cp_x, cp_y, x + width, height); + ctx.stroke(); + ctx.restore(); + }; + const renderRelease = (x, y, width, height) => { + ctx.save(); + ctx.beginPath(); + ctx.setLineWidth(this.render_options.line_width); + ctx.setStrokeStyle(this.render_options.line_style); + ctx.setFillStyle(this.render_options.line_style); + ctx.moveTo(x, height); + ctx.quadraticCurveTo(x + width, height, x + width, y); + ctx.stroke(); + ctx.restore(); + }; + const renderArrowHead = (x, y, direction) => { + const width = 4; + const yBase = y + width * direction; + ctx.beginPath(); + ctx.moveTo(x, y); // tip of the arrow + ctx.lineTo(x - width, yBase); + ctx.lineTo(x + width, yBase); + ctx.closePath(); + ctx.fill(); + }; + const renderText = (x, text) => { + ctx.save(); + ctx.setFont(this.textFont); + const render_x = x - ctx.measureText(text).width / 2; + ctx.fillText(text, render_x, annotation_y); + ctx.restore(); + }; + let last_bend = undefined; + let last_bend_draw_width = 0; + let last_drawn_width = 0; + if ((_a = this.tap) === null || _a === void 0 ? void 0 : _a.length) { + const tapStart = note.getModifierStartXY(_modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.CENTER, this.index); + renderText(tapStart.x, this.tap); + } + for (let i = 0; i < this.phrase.length; ++i) { + const bend = this.phrase[i]; + if (!bend.draw_width) + bend.draw_width = 0; + if (i === 0) + bend.draw_width += x_shift; + last_drawn_width = bend.draw_width + last_bend_draw_width - (i === 1 ? x_shift : 0); + if (bend.type === Bend.UP) { + if (last_bend && last_bend.type === Bend.UP) { + renderArrowHead(start.x, bend_height, +1); + } + renderBend(start.x, start.y, last_drawn_width, bend_height); + } + if (bend.type === Bend.DOWN) { + if (last_bend && last_bend.type === Bend.UP) { + renderRelease(start.x, start.y, last_drawn_width, bend_height); + } + if (last_bend && last_bend.type === Bend.DOWN) { + renderArrowHead(start.x, start.y, -1); + renderRelease(start.x, start.y, last_drawn_width, bend_height); + } + if (!last_bend) { + last_drawn_width = bend.draw_width; + renderRelease(start.x, start.y, last_drawn_width, bend_height); + } + } + renderText(start.x + last_drawn_width, bend.text); + last_bend = bend; + last_bend_draw_width = bend.draw_width; + last_bend.x = start.x; + start.x += last_drawn_width; + } + if (!last_bend || last_bend.x == undefined) { + throw new _util__WEBPACK_IMPORTED_MODULE_4__.RuntimeError('NoLastBendForBend', 'Internal error.'); + } + // Final arrowhead and text + if (last_bend.type === Bend.UP) { + renderArrowHead(last_bend.x + last_drawn_width, bend_height, +1); + } + else if (last_bend.type === Bend.DOWN) { + renderArrowHead(last_bend.x + last_drawn_width, start.y, -1); + } + } +} +/** Default text font. */ +Bend.TEXT_FONT = Object.assign({}, _element__WEBPACK_IMPORTED_MODULE_0__.Element.TEXT_FONT); + + +/***/ }), + +/***/ "./src/boundingbox.ts": +/*!****************************!*\ + !*** ./src/boundingbox.ts ***! + \****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "BoundingBox": () => (/* binding */ BoundingBox) +/* harmony export */ }); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +class BoundingBox { + constructor(x, y, w, h) { + this.x = x; + this.y = y; + this.w = w; + this.h = h; + } + /** + * Create a new copy. + */ + static copy(that) { + return new BoundingBox(that.x, that.y, that.w, that.h); + } + /** Get x position. */ + getX() { + return this.x; + } + /** Get y position. */ + getY() { + return this.y; + } + /** Get width. */ + getW() { + return this.w; + } + /** Get height. */ + getH() { + return this.h; + } + /** Set x position. */ + setX(x) { + this.x = x; + return this; + } + /** Set y position. */ + setY(y) { + this.y = y; + return this; + } + /** Set width. */ + setW(w) { + this.w = w; + return this; + } + /** Set height. */ + setH(h) { + this.h = h; + return this; + } + /** Move to position. */ + move(x, y) { + this.x += x; + this.y += y; + return this; + } + /** Clone. */ + clone() { + return BoundingBox.copy(this); + } + /** + * Merge my box with given box. Creates a bigger bounding box unless + * the given box is contained in this one. + */ + mergeWith(boundingBox) { + const that = boundingBox; + const new_x = this.x < that.x ? this.x : that.x; + const new_y = this.y < that.y ? this.y : that.y; + const new_w = Math.max(this.x + this.w, that.x + that.w) - new_x; + const new_h = Math.max(this.y + this.h, that.y + that.h) - new_y; + this.x = new_x; + this.y = new_y; + this.w = new_w; + this.h = new_h; + return this; + } +} + + +/***/ }), + +/***/ "./src/boundingboxcomputation.ts": +/*!***************************************!*\ + !*** ./src/boundingboxcomputation.ts ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "BoundingBoxComputation": () => (/* binding */ BoundingBoxComputation) +/* harmony export */ }); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +/** + * BoundingBoxComputation computes metrics for a bounding box by continuously + * taking canvas path commands. + * + * Warning: This class is merely a crutch to get bounding box information without + * explicit metadata. This is likely to get deprecated following SMuFL support. + * + * based on: https://github.com/canvg/canvg/blob/master/src/BoundingBox.ts (MIT License) + */ +class BoundingBoxComputation { + constructor() { + this.x1 = Number.NaN; + this.y1 = Number.NaN; + this.x2 = Number.NaN; + this.y2 = Number.NaN; + } + /** Get calculated X1. */ + getX1() { + return this.x1; + } + /** Get calculated Y1. */ + getY1() { + return this.y1; + } + /** Get calculated width. */ + width() { + return this.x2 - this.x1; + } + /** Get calculated height. */ + height() { + return this.y2 - this.y1; + } + /** Add point to BoundingBox. */ + addPoint(x, y) { + if (isNaN(this.x1) || x < this.x1) + this.x1 = x; + if (isNaN(this.x2) || x > this.x2) + this.x2 = x; + if (isNaN(this.y1) || y < this.y1) + this.y1 = y; + if (isNaN(this.y2) || y > this.y2) + this.y2 = y; + } + /** Add X to BoundingBox. */ + addX(x) { + this.addPoint(x, this.y1); + } + /** Add Y to BoundingBox. */ + addY(y) { + this.addPoint(this.x1, y); + } + /** Add quadratic curve to BoundingBox. */ + addQuadraticCurve(p0x, p0y, p1x, p1y, p2x, p2y) { + this.addPoint(p0x, p0y); + this.addPoint(p2x, p2y); + const p01x = p1x - p0x; + const p12x = p2x - p1x; + let denom = p01x - p12x; + if (denom != 0) { + const t = p01x / denom; + if (t > 0 && t < 1) { + const it = 1 - t; + this.addX(it * it * p0x + 2 * it * t * p1x + t * t * p2x); + } + } + const p01y = p1y - p0y; + const p12y = p2y - p1y; + denom = p01y - p12y; + if (denom != 0) { + const t = p01y / denom; + if (t > 0 && t < 1) { + const it = 1 - t; + this.addY(it * it * p0y + 2 * it * t * p1y + t * t * p2y); + } + } + } + /** Add bezier curve to BoundingBox. */ + addBezierCurve(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) { + // from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html + const p0 = [p0x, p0y]; + const p1 = [p1x, p1y]; + const p2 = [p2x, p2y]; + const p3 = [p3x, p3y]; + let i; + this.addPoint(p0[0], p0[1]); + this.addPoint(p3[0], p3[1]); + const f = (t, i) => Math.pow(1 - t, 3) * p0[i] + + 3 * Math.pow(1 - t, 2) * t * p1[i] + + 3 * (1 - t) * Math.pow(t, 2) * p2[i] + + Math.pow(t, 3) * p3[i]; + for (i = 0; i <= 1; i++) { + const b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i]; + const a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i]; + const c = 3 * p1[i] - 3 * p0[i]; + if (a === 0) { + if (b === 0) + continue; + const t = -c / b; + if (0 < t && t < 1) { + if (i === 0) + this.addX(f(t, i)); + if (i === 1) + this.addY(f(t, i)); + } + continue; + } + const b2ac = Math.pow(b, 2) - 4 * c * a; + if (b2ac < 0) + continue; + const t1 = (-b + Math.sqrt(b2ac)) / (2 * a); + if (0 < t1 && t1 < 1) { + if (i === 0) + this.addX(f(t1, i)); + if (i === 1) + this.addY(f(t1, i)); + } + const t2 = (-b - Math.sqrt(b2ac)) / (2 * a); + if (0 < t2 && t2 < 1) { + if (i === 0) + this.addX(f(t2, i)); + if (i === 1) + this.addY(f(t2, i)); + } + } + } +} + + +/***/ }), + +/***/ "./src/canvascontext.ts": +/*!******************************!*\ + !*** ./src/canvascontext.ts ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "CanvasContext": () => (/* binding */ CanvasContext) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _rendercontext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./rendercontext */ "./src/rendercontext.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +/* harmony import */ var _web__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./web */ "./src/web.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + +/** + * A rendering context for the Canvas backend. This class serves as a proxy for the + * underlying CanvasRenderingContext2D object, part of the browser's API. + */ +class CanvasContext extends _rendercontext__WEBPACK_IMPORTED_MODULE_1__.RenderContext { + constructor(context) { + super(); + /** Height of one line of text (in pixels). */ + this.textHeight = 0; + this.context2D = context; + if (!context.canvas) { + this.canvas = { + width: CanvasContext.WIDTH, + height: CanvasContext.HEIGHT, + }; + } + else { + this.canvas = context.canvas; + } + } + static get WIDTH() { + return 600; + } + static get HEIGHT() { + return 400; + } + static get CANVAS_BROWSER_SIZE_LIMIT() { + return 32767; // Chrome/Firefox. Could be determined more precisely by npm module canvas-size. + } + /** + * Ensure that width and height do not exceed the browser limit. + * @returns array of [width, height] clamped to the browser limit. + */ + static sanitizeCanvasDims(width, height) { + const limit = this.CANVAS_BROWSER_SIZE_LIMIT; + if (Math.max(width, height) > limit) { + (0,_util__WEBPACK_IMPORTED_MODULE_2__.warn)('Canvas dimensions exceed browser limit. Cropping to ' + limit); + if (width > limit) { + width = limit; + } + if (height > limit) { + height = limit; + } + } + return [width, height]; + } + /** + * Set all pixels to transparent black rgba(0,0,0,0). + */ + clear() { + this.context2D.clearRect(0, 0, this.canvas.width, this.canvas.height); + } + // eslint-disable-next-line + openGroup(cls, id, attrs) { + // Containers not implemented. + } + closeGroup() { + // Containers not implemented. + } + // eslint-disable-next-line + add(child) { + // Containers not implemented. + } + setFillStyle(style) { + this.context2D.fillStyle = style; + return this; + } + /** CanvasContext ignores `setBackgroundFillStyle()`. */ + // eslint-disable-next-line + setBackgroundFillStyle(style) { + // DO NOTHING + return this; + } + setStrokeStyle(style) { + this.context2D.strokeStyle = style; + return this; + } + setShadowColor(color) { + this.context2D.shadowColor = color; + return this; + } + setShadowBlur(blur) { + // CanvasRenderingContext2D does not scale the shadow blur by the current + // transform, so we have to do it manually. We assume uniform scaling + // (though allow for rotation) because the blur can only be scaled + // uniformly anyway. + const t = this.context2D.getTransform(); + const scale = Math.sqrt(t.a * t.a + t.b * t.b + t.c * t.c + t.d * t.d); + this.context2D.shadowBlur = scale * blur; + return this; + } + setLineWidth(width) { + this.context2D.lineWidth = width; + return this; + } + setLineCap(capType) { + this.context2D.lineCap = capType; + return this; + } + setLineDash(dash) { + this.context2D.setLineDash(dash); + return this; + } + scale(x, y) { + this.context2D.scale(x, y); + return this; + } + resize(width, height) { + const canvas = this.context2D.canvas; + const devicePixelRatio = (0,_util__WEBPACK_IMPORTED_MODULE_2__.globalObject)().devicePixelRatio || 1; + // Scale the canvas size by the device pixel ratio clamping to the maximum supported size. + [width, height] = CanvasContext.sanitizeCanvasDims(width * devicePixelRatio, height * devicePixelRatio); + // Divide back down by the pixel ratio and convert to integers. + width = (width / devicePixelRatio) | 0; + height = (height / devicePixelRatio) | 0; + canvas.width = width * devicePixelRatio; + canvas.height = height * devicePixelRatio; + // The canvas could be an instance of either HTMLCanvasElement or an OffscreenCanvas. + // Only HTMLCanvasElement has a style attribute. + if ((0,_web__WEBPACK_IMPORTED_MODULE_3__.isHTMLCanvas)(canvas)) { + canvas.style.width = width + 'px'; + canvas.style.height = height + 'px'; + } + return this.scale(devicePixelRatio, devicePixelRatio); + } + rect(x, y, width, height) { + this.context2D.rect(x, y, width, height); + return this; + } + fillRect(x, y, width, height) { + this.context2D.fillRect(x, y, width, height); + return this; + } + /** + * Set the pixels in a rectangular area to transparent black rgba(0,0,0,0). + */ + clearRect(x, y, width, height) { + this.context2D.clearRect(x, y, width, height); + return this; + } + beginPath() { + this.context2D.beginPath(); + return this; + } + moveTo(x, y) { + this.context2D.moveTo(x, y); + return this; + } + lineTo(x, y) { + this.context2D.lineTo(x, y); + return this; + } + bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) { + this.context2D.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y); + return this; + } + quadraticCurveTo(cpx, cpy, x, y) { + this.context2D.quadraticCurveTo(cpx, cpy, x, y); + return this; + } + arc(x, y, radius, startAngle, endAngle, counterclockwise) { + this.context2D.arc(x, y, radius, startAngle, endAngle, counterclockwise); + return this; + } + fill() { + this.context2D.fill(); + return this; + } + stroke() { + this.context2D.stroke(); + return this; + } + closePath() { + this.context2D.closePath(); + return this; + } + measureText(text) { + const metrics = this.context2D.measureText(text); + let y = 0; + let height = 0; + if (metrics.fontBoundingBoxAscent) { + y = -metrics.fontBoundingBoxAscent; + height = metrics.fontBoundingBoxDescent + metrics.fontBoundingBoxAscent; + } + else { + y = -metrics.actualBoundingBoxAscent; + height = metrics.actualBoundingBoxDescent + metrics.actualBoundingBoxAscent; + } + // Return x, y, width & height in the same manner as svg getBBox + return { + x: 0, + y: y, + width: metrics.width, + height: height, + }; + } + fillText(text, x, y) { + this.context2D.fillText(text, x, y); + return this; + } + save() { + this.context2D.save(); + return this; + } + restore() { + this.context2D.restore(); + return this; + } + set fillStyle(style) { + this.context2D.fillStyle = style; + } + get fillStyle() { + return this.context2D.fillStyle; + } + set strokeStyle(style) { + this.context2D.strokeStyle = style; + } + get strokeStyle() { + return this.context2D.strokeStyle; + } + /** + * @param f is 1) a `FontInfo` object or + * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or + * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided). + * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt'). + * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900). + * @param style is a string (e.g., 'italic', 'normal'). + */ + setFont(f, size, weight, style) { + const fontInfo = _font__WEBPACK_IMPORTED_MODULE_0__.Font.validate(f, size, weight, style); + this.context2D.font = _font__WEBPACK_IMPORTED_MODULE_0__.Font.toCSSString(fontInfo); + this.textHeight = _font__WEBPACK_IMPORTED_MODULE_0__.Font.convertSizeToPixelValue(fontInfo.size); + return this; + } + /** Return a string of the form `'italic bold 15pt Arial'` */ + getFont() { + return this.context2D.font; + } +} + + +/***/ }), + +/***/ "./src/chordsymbol.ts": +/*!****************************!*\ + !*** ./src/chordsymbol.ts ***! + \****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ChordSymbolHorizontalJustify": () => (/* binding */ ChordSymbolHorizontalJustify), +/* harmony export */ "ChordSymbolVerticalJustify": () => (/* binding */ ChordSymbolVerticalJustify), +/* harmony export */ "SymbolTypes": () => (/* binding */ SymbolTypes), +/* harmony export */ "SymbolModifiers": () => (/* binding */ SymbolModifiers), +/* harmony export */ "ChordSymbol": () => (/* binding */ ChordSymbol) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _textformatter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./textformatter */ "./src/textformatter.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// Author: Aaron (@AaronDavidNewman) +// +// This implements chord symbols above/below a chord. +// Chord symbols are modifiers that can be attached to notes. +// They can contain multiple 'blocks' which represent text or +// glyphs with various positioning options. +// +// See `tests/chordsymbol_tests.ts` for usage examples. + + + + + + + +// To enable logging for this class. Set `Vex.Flow.ChordSymbol.DEBUG` to `true`. +// eslint-disable-next-line +function L(...args) { + if (ChordSymbol.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_6__.log)('Vex.Flow.ChordSymbol', args); +} +var ChordSymbolHorizontalJustify; +(function (ChordSymbolHorizontalJustify) { + ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify["LEFT"] = 1] = "LEFT"; + ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify["CENTER"] = 2] = "CENTER"; + ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify["RIGHT"] = 3] = "RIGHT"; + ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify["CENTER_STEM"] = 4] = "CENTER_STEM"; +})(ChordSymbolHorizontalJustify || (ChordSymbolHorizontalJustify = {})); +var ChordSymbolVerticalJustify; +(function (ChordSymbolVerticalJustify) { + ChordSymbolVerticalJustify[ChordSymbolVerticalJustify["TOP"] = 1] = "TOP"; + ChordSymbolVerticalJustify[ChordSymbolVerticalJustify["BOTTOM"] = 2] = "BOTTOM"; +})(ChordSymbolVerticalJustify || (ChordSymbolVerticalJustify = {})); +var SymbolTypes; +(function (SymbolTypes) { + SymbolTypes[SymbolTypes["GLYPH"] = 1] = "GLYPH"; + SymbolTypes[SymbolTypes["TEXT"] = 2] = "TEXT"; + SymbolTypes[SymbolTypes["LINE"] = 3] = "LINE"; +})(SymbolTypes || (SymbolTypes = {})); +var SymbolModifiers; +(function (SymbolModifiers) { + SymbolModifiers[SymbolModifiers["NONE"] = 1] = "NONE"; + SymbolModifiers[SymbolModifiers["SUBSCRIPT"] = 2] = "SUBSCRIPT"; + SymbolModifiers[SymbolModifiers["SUPERSCRIPT"] = 3] = "SUPERSCRIPT"; +})(SymbolModifiers || (SymbolModifiers = {})); +/** + * ChordSymbol is a modifier that creates a chord symbol above/below a chord. + * As a modifier, it is attached to an existing note. + */ +class ChordSymbol extends _modifier__WEBPACK_IMPORTED_MODULE_2__.Modifier { + constructor() { + super(); + this.symbolBlocks = []; + this.horizontal = ChordSymbolHorizontalJustify.LEFT; + this.vertical = ChordSymbolVerticalJustify.TOP; + this.useKerning = true; + this.reportWidth = true; + this.resetFont(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_5__.Category.ChordSymbol; + } + static get superSubRatio() { + return ChordSymbol.metrics.global.superSubRatio; + } + /** Currently unused: Globally turn off text formatting, if the built-in formatting does not work for your font. */ + static set NO_TEXT_FORMAT(val) { + ChordSymbol.noFormat = val; + } + static get NO_TEXT_FORMAT() { + return ChordSymbol.noFormat; + } + // eslint-disable-next-line + static getMetricForGlyph(glyphCode) { + if (ChordSymbol.metrics[glyphCode]) { + return ChordSymbol.metrics[glyphCode]; + } + return undefined; + } + static get engravingFontResolution() { + return _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().getResolution(); + } + static get spacingBetweenBlocks() { + return ChordSymbol.metrics.global.spacing / ChordSymbol.engravingFontResolution; + } + static getWidthForGlyph(glyph) { + const metric = ChordSymbol.getMetricForGlyph(glyph.code); + if (!metric) { + return 0.65; // probably should do something here. + } + return metric.advanceWidth / ChordSymbol.engravingFontResolution; + } + static getYShiftForGlyph(glyph) { + const metric = ChordSymbol.getMetricForGlyph(glyph.code); + if (!metric) { + return 0; + } + return metric.yOffset / ChordSymbol.engravingFontResolution; + } + static getXShiftForGlyph(glyph) { + const metric = ChordSymbol.getMetricForGlyph(glyph.code); + if (!metric) { + return 0; + } + return (-1 * metric.leftSideBearing) / ChordSymbol.engravingFontResolution; + } + static get superscriptOffset() { + return ChordSymbol.metrics.global.superscriptOffset / ChordSymbol.engravingFontResolution; + } + static get subscriptOffset() { + return ChordSymbol.metrics.global.subscriptOffset / ChordSymbol.engravingFontResolution; + } + static get kerningOffset() { + return ChordSymbol.metrics.global.kerningOffset / ChordSymbol.engravingFontResolution; + } + // eslint-disable-next-line + static get metrics() { + return _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().getMetrics().glyphs.chordSymbol; + } + static get lowerKerningText() { + // For example, see: `bravura_metrics.ts` + // BravuraMetrics.glyphs.chordSymbol.global.lowerKerningText, which returns an array of letters. + // ['D', 'F', 'P', 'T', 'V', 'Y'] + return ChordSymbol.metrics.global.lowerKerningText; + } + static get upperKerningText() { + return ChordSymbol.metrics.global.upperKerningText; + } + static isSuperscript(block) { + return block.symbolModifier !== undefined && block.symbolModifier === SymbolModifiers.SUPERSCRIPT; + } + static isSubscript(block) { + return block.symbolModifier !== undefined && block.symbolModifier === SymbolModifiers.SUBSCRIPT; + } + /** + * Estimate the width of the whole chord symbol, based on the sum of the widths of the individual blocks. + * Estimate how many lines above/below the staff we need. + */ + static format(symbols, state) { + var _a; + if (!symbols || symbols.length === 0) + return false; + let width = 0; + let nonSuperWidth = 0; + const reportedWidths = []; + for (const symbol of symbols) { + const fontSize = _font__WEBPACK_IMPORTED_MODULE_0__.Font.convertSizeToPointValue((_a = symbol.textFont) === null || _a === void 0 ? void 0 : _a.size); + const fontAdj = _font__WEBPACK_IMPORTED_MODULE_0__.Font.scaleSize(fontSize, 0.05); + const glyphAdj = fontAdj * 2; + let lineSpaces = 1; + let vAlign = false; + for (let j = 0; j < symbol.symbolBlocks.length; ++j) { + const block = symbol.symbolBlocks[j]; + const sup = ChordSymbol.isSuperscript(block); + const sub = ChordSymbol.isSubscript(block); + const superSubScale = sup || sub ? ChordSymbol.superSubRatio : 1; + const adj = block.symbolType === SymbolTypes.GLYPH ? glyphAdj * superSubScale : fontAdj * superSubScale; + // If there are super/subscripts, they extend beyond the line so + // assume they take up 2 lines + if (sup || sub) { + lineSpaces = 2; + } + // If there is a symbol-specific offset, add it but consider font + // size since font and glyphs will be interspersed. + const fontSize = symbol.textFormatter.fontSizeInPixels; + const superSubFontSize = fontSize * superSubScale; + if (block.symbolType === SymbolTypes.GLYPH && block.glyph !== undefined) { + block.width = ChordSymbol.getWidthForGlyph(block.glyph) * superSubFontSize; + block.yShift += ChordSymbol.getYShiftForGlyph(block.glyph) * superSubFontSize; + block.xShift += ChordSymbol.getXShiftForGlyph(block.glyph) * superSubFontSize; + block.glyph.scale = block.glyph.scale * adj; + } + else if (block.symbolType === SymbolTypes.TEXT) { + block.width = block.width * superSubFontSize; + block.yShift += symbol.getYOffsetForText(block.text) * adj; + } + if (block.symbolType === SymbolTypes.GLYPH && + block.glyph !== undefined && + block.glyph.code === ChordSymbol.glyphs.over.code) { + lineSpaces = 2; + } + block.width += ChordSymbol.spacingBetweenBlocks * fontSize * superSubScale; + // If a subscript immediately follows a superscript block, try to + // overlay them. + if (sup && j > 0) { + const prev = symbol.symbolBlocks[j - 1]; + if (!ChordSymbol.isSuperscript(prev)) { + nonSuperWidth = width; + } + } + if (sub && nonSuperWidth > 0) { + vAlign = true; + // slide the symbol over so it lines up with superscript + block.xShift = block.xShift + (nonSuperWidth - width); + width = nonSuperWidth; + nonSuperWidth = 0; + // If we have vertically lined up, turn kerning off. + symbol.setEnableKerning(false); + } + if (!sup && !sub) { + nonSuperWidth = 0; + } + block.vAlign = vAlign; + width += block.width; + } + // make kerning adjustments after computing super/subscripts + symbol.updateKerningAdjustments(); + symbol.updateOverBarAdjustments(); + if (symbol.getVertical() === ChordSymbolVerticalJustify.TOP) { + symbol.setTextLine(state.top_text_line); + state.top_text_line += lineSpaces; + } + else { + symbol.setTextLine(state.text_line + 1); + state.text_line += lineSpaces + 1; + } + if (symbol.getReportWidth()) { + reportedWidths.push(width); + } + else { + reportedWidths.push(0); + } + } + width = reportedWidths.reduce((a, b) => a + b, 0); + state.left_shift += width / 2; + state.right_shift += width / 2; + return true; + } + /** + * Default text font. + * Choose a font family that works well with the current music engraving font. + * @override `Element.TEXT_FONT`. + */ + static get TEXT_FONT() { + let family = 'Roboto Slab, Times, serif'; + if (_tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().getName() === 'Petaluma') { + // Fixes Issue #1180 + family = 'PetalumaScript, Arial, sans-serif'; + } + return { + family, + size: 12, + weight: _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.NORMAL, + style: _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.NORMAL, + }; + } + /** + * The offset is specified in `em`. Scale this value by the font size in pixels. + */ + get superscriptOffset() { + return ChordSymbol.superscriptOffset * this.textFormatter.fontSizeInPixels; + } + get subscriptOffset() { + return ChordSymbol.subscriptOffset * this.textFormatter.fontSizeInPixels; + } + setReportWidth(value) { + this.reportWidth = value; + return this; + } + getReportWidth() { + return this.reportWidth; + } + updateOverBarAdjustments() { + const barIndex = this.symbolBlocks.findIndex(({ symbolType, glyph }) => symbolType === SymbolTypes.GLYPH && glyph !== undefined && glyph.code === 'csymDiagonalArrangementSlash'); + if (barIndex < 0) { + return; + } + const bar = this.symbolBlocks[barIndex]; + const xoff = bar.width / 4; + const yoff = 0.25 * this.textFormatter.fontSizeInPixels; + let symIndex = 0; + for (symIndex === 0; symIndex < barIndex; ++symIndex) { + const symbol = this.symbolBlocks[symIndex]; + symbol.xShift = symbol.xShift + xoff; + symbol.yShift = symbol.yShift - yoff; + } + for (symIndex = barIndex + 1; symIndex < this.symbolBlocks.length; ++symIndex) { + const symbol = this.symbolBlocks[symIndex]; + symbol.xShift = symbol.xShift - xoff; + symbol.yShift = symbol.yShift + yoff; + } + } + updateKerningAdjustments() { + let accum = 0; + for (let j = 0; j < this.symbolBlocks.length; ++j) { + const symbol = this.symbolBlocks[j]; + accum += this.getKerningAdjustment(j); + symbol.xShift += accum; + } + } + /** Do some basic kerning so that letter chords like 'A' don't have the extensions hanging off to the right. */ + getKerningAdjustment(j) { + if (!this.useKerning) { + return 0; + } + const currSymbol = this.symbolBlocks[j]; + const prevSymbol = j > 0 ? this.symbolBlocks[j - 1] : undefined; + let adjustment = 0; + // Move things into the '/' over bar + if (currSymbol.symbolType === SymbolTypes.GLYPH && + currSymbol.glyph !== undefined && + currSymbol.glyph.code === ChordSymbol.glyphs.over.code) { + adjustment += currSymbol.glyph.metrics.x_shift; + } + if (prevSymbol !== undefined && + prevSymbol.symbolType === SymbolTypes.GLYPH && + prevSymbol.glyph !== undefined && + prevSymbol.glyph.code === ChordSymbol.glyphs.over.code) { + adjustment += prevSymbol.glyph.metrics.x_shift; + } + // For superscripts that follow a letter without much top part, move it to the left slightly + let preKernUpper = false; + let preKernLower = false; + if (prevSymbol !== undefined && prevSymbol.symbolType === SymbolTypes.TEXT) { + preKernUpper = ChordSymbol.upperKerningText.some((xx) => xx === prevSymbol.text[prevSymbol.text.length - 1]); + preKernLower = ChordSymbol.lowerKerningText.some((xx) => xx === prevSymbol.text[prevSymbol.text.length - 1]); + } + const kerningOffsetPixels = ChordSymbol.kerningOffset * this.textFormatter.fontSizeInPixels; + // TODO: adjust kern for font size. + // Where should this constant live? + if (preKernUpper && currSymbol.symbolModifier === SymbolModifiers.SUPERSCRIPT) { + adjustment += kerningOffsetPixels; + } + if (preKernLower && currSymbol.symbolType === SymbolTypes.TEXT) { + if (currSymbol.text[0] >= 'a' && currSymbol.text[0] <= 'z') { + adjustment += kerningOffsetPixels / 2; + } + if (ChordSymbol.upperKerningText.some((xx) => xx === (prevSymbol === null || prevSymbol === void 0 ? void 0 : prevSymbol.text[prevSymbol.text.length - 1]))) { + adjustment += kerningOffsetPixels / 2; + } + } + return adjustment; + } + /** + * ChordSymbol allows multiple blocks so we can mix glyphs and font text. + * Each block can have its own vertical orientation. + */ + // eslint-disable-next-line + getSymbolBlock(params = {}) { + var _a, _b, _c; + const symbolType = (_a = params.symbolType) !== null && _a !== void 0 ? _a : SymbolTypes.TEXT; + const symbolBlock = { + text: (_b = params.text) !== null && _b !== void 0 ? _b : '', + symbolType, + symbolModifier: (_c = params.symbolModifier) !== null && _c !== void 0 ? _c : SymbolModifiers.NONE, + xShift: 0, + yShift: 0, + vAlign: false, + width: 0, + }; + // Note: symbol widths are resolution and font-independent. + // We convert to pixel values when we know what the font is. + if (symbolType === SymbolTypes.GLYPH && typeof params.glyph === 'string') { + const glyphArgs = ChordSymbol.glyphs[params.glyph]; + const glyphPoints = 20; + symbolBlock.glyph = new _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph(glyphArgs.code, glyphPoints, { category: 'chordSymbol' }); + // Beware: glyph.metrics is not the same as glyph.getMetrics() ! + // rv.glyph.point = rv.glyph.point * rv.glyph.metrics.scale; + // rv.width = rv.glyph.getMetrics().width; + // don't set yShift here, b/c we need to do it at formatting time after the font is set. + } + else if (symbolType === SymbolTypes.TEXT) { + symbolBlock.width = this.textFormatter.getWidthForTextInEm(symbolBlock.text); + } + else if (symbolType === SymbolTypes.LINE) { + symbolBlock.width = params.width; + } + return symbolBlock; + } + /** Add a symbol to this chord, could be text, glyph or line. */ + // eslint-disable-next-line + addSymbolBlock(parameters) { + this.symbolBlocks.push(this.getSymbolBlock(parameters)); + return this; + } + // ### Convenience functions for creating different types of chord symbol parts. + /** Add a text block. */ + // eslint-disable-next-line + addText(text, parameters = {}) { + const symbolType = SymbolTypes.TEXT; + return this.addSymbolBlock(Object.assign(Object.assign({}, parameters), { text, symbolType })); + } + /** Add a text block with superscript modifier. */ + addTextSuperscript(text) { + const symbolType = SymbolTypes.TEXT; + const symbolModifier = SymbolModifiers.SUPERSCRIPT; + return this.addSymbolBlock({ text, symbolType, symbolModifier }); + } + /** Add a text block with subscript modifier. */ + addTextSubscript(text) { + const symbolType = SymbolTypes.TEXT; + const symbolModifier = SymbolModifiers.SUBSCRIPT; + return this.addSymbolBlock({ text, symbolType, symbolModifier }); + } + /** Add a glyph block with superscript modifier. */ + addGlyphSuperscript(glyph) { + const symbolType = SymbolTypes.GLYPH; + const symbolModifier = SymbolModifiers.SUPERSCRIPT; + return this.addSymbolBlock({ glyph, symbolType, symbolModifier }); + } + /** Add a glyph block. */ + // eslint-disable-next-line + addGlyph(glyph, params = {}) { + const symbolType = SymbolTypes.GLYPH; + return this.addSymbolBlock(Object.assign(Object.assign({}, params), { glyph, symbolType })); + } + /** + * Add a glyph for each character in 'text'. If the glyph is not available, use text from the font. + * e.g. `addGlyphOrText('(+5#11)')` will use text for the '5' and '11', and glyphs for everything else. + */ + // eslint-disable-next-line + addGlyphOrText(text, params = {}) { + let str = ''; + for (let i = 0; i < text.length; ++i) { + const char = text[i]; + if (ChordSymbol.glyphs[char]) { + if (str.length > 0) { + this.addText(str, params); + str = ''; + } + this.addGlyph(char, params); + } + else { + // Collect consecutive characters with no glyphs. + str += char; + } + } + if (str.length > 0) { + this.addText(str, params); + } + return this; + } + /** Add a line of the given width, used as a continuation of the previous symbol in analysis, or lyrics, etc. */ + // eslint-disable-next-line + addLine(width, params = {}) { + const symbolType = SymbolTypes.LINE; + return this.addSymbolBlock(Object.assign(Object.assign({}, params), { symbolType, width })); + } + /** + * Set the chord symbol's font family, size, weight, style (e.g., `Arial`, `10pt`, `bold`, `italic`). + * + * @param f is 1) a `FontInfo` object or + * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or + * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided). + * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt'). + * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900). + * @param style is a string (e.g., 'italic', 'normal'). + * + * @override See: Element. + */ + setFont(f, size, weight, style) { + super.setFont(f, size, weight, style); + this.textFormatter = _textformatter__WEBPACK_IMPORTED_MODULE_4__.TextFormatter.create(this.textFont); + return this; + } + setEnableKerning(val) { + this.useKerning = val; + return this; + } + /** Set vertical position of text (above or below stave). */ + setVertical(vj) { + this.vertical = typeof vj === 'string' ? ChordSymbol.VerticalJustifyString[vj] : vj; + return this; + } + getVertical() { + return this.vertical; + } + /** Set horizontal justification. */ + setHorizontal(hj) { + this.horizontal = typeof hj === 'string' ? ChordSymbol.HorizontalJustifyString[hj] : hj; + return this; + } + getHorizontal() { + return this.horizontal; + } + getWidth() { + let width = 0; + this.symbolBlocks.forEach((symbol) => { + width += symbol.vAlign ? 0 : symbol.width; + }); + return width; + } + getYOffsetForText(text) { + var _a; + let acc = 0; + let i = 0; + for (i = 0; i < text.length; ++i) { + const metrics = this.textFormatter.getGlyphMetrics(text[i]); + if (metrics) { + const yMax = (_a = metrics.y_max) !== null && _a !== void 0 ? _a : 0; + acc = yMax < acc ? yMax : acc; + } + } + const resolution = this.textFormatter.getResolution(); + return i > 0 ? -1 * (acc / resolution) : 0; + } + /** Render text and glyphs above/below the note. */ + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + // We're changing context parameters. Save current state. + ctx.save(); + const classString = Object.keys(this.getAttribute('classes')).join(' '); + ctx.openGroup(classString, this.getAttribute('id')); + const start = note.getModifierStartXY(_modifier__WEBPACK_IMPORTED_MODULE_2__.Modifier.Position.ABOVE, this.index); + ctx.setFont(this.textFont); + let y; + // The position of the text varies based on whether or not the note + // has a stem. + const hasStem = note.hasStem(); + const stave = note.checkStave(); + if (this.vertical === ChordSymbolVerticalJustify.BOTTOM) { + // HACK: We need to compensate for the text's height since its origin is bottom-right. + y = stave.getYForBottomText(this.text_line + _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.TEXT_HEIGHT_OFFSET_HACK); + if (hasStem) { + const stem_ext = note.checkStem().getExtents(); + const spacing = stave.getSpacingBetweenLines(); + const stem_base = note.getStemDirection() === 1 ? stem_ext.baseY : stem_ext.topY; + y = Math.max(y, stem_base + spacing * (this.text_line + 2)); + } + } + else { + // (this.vertical === VerticalJustify.TOP) + y = Math.min(stave.getYForTopText(this.text_line), note.getYs()[0] - 10); + if (hasStem) { + const stem_ext = note.checkStem().getExtents(); + const spacing = stave.getSpacingBetweenLines(); + y = Math.min(y, stem_ext.topY - 5 - spacing * this.text_line); + } + } + let x = start.x; + if (this.horizontal === ChordSymbolHorizontalJustify.LEFT) { + x = start.x; + } + else if (this.horizontal === ChordSymbolHorizontalJustify.RIGHT) { + x = start.x + this.getWidth(); + } + else if (this.horizontal === ChordSymbolHorizontalJustify.CENTER) { + x = start.x - this.getWidth() / 2; + } + else { + // HorizontalJustify.CENTER_STEM + x = note.getStemX() - this.getWidth() / 2; + } + L('Rendering ChordSymbol: ', this.textFormatter, x, y); + this.symbolBlocks.forEach((symbol) => { + const isSuper = ChordSymbol.isSuperscript(symbol); + const isSub = ChordSymbol.isSubscript(symbol); + let curY = y; + L('shift was ', symbol.xShift, symbol.yShift); + L('curY pre sub ', curY); + if (isSuper) { + curY += this.superscriptOffset; + } + if (isSub) { + curY += this.subscriptOffset; + } + L('curY sup/sub ', curY); + if (symbol.symbolType === SymbolTypes.TEXT) { + if (isSuper || isSub) { + ctx.save(); + if (this.textFont) { + const { family, size, weight, style } = this.textFont; + const smallerFontSize = _font__WEBPACK_IMPORTED_MODULE_0__.Font.scaleSize(size, ChordSymbol.superSubRatio); + ctx.setFont(family, smallerFontSize, weight, style); + } + } + // TODO??? + // We estimate the text width, fill it in with the empirical value so the formatting is even. + // const textDim = ctx.measureText(symbol.text); + // symbol.width = textDim.width; + L('Rendering Text: ', symbol.text, x + symbol.xShift, curY + symbol.yShift); + ctx.fillText(symbol.text, x + symbol.xShift, curY + symbol.yShift); + if (isSuper || isSub) { + ctx.restore(); + } + } + else if (symbol.symbolType === SymbolTypes.GLYPH && symbol.glyph) { + curY += symbol.yShift; + L('Rendering Glyph: ', symbol.glyph.code, x + symbol.xShift, curY); + symbol.glyph.render(ctx, x + symbol.xShift, curY); + } + else if (symbol.symbolType === SymbolTypes.LINE) { + L('Rendering Line : ', symbol.width, x, curY); + ctx.beginPath(); + ctx.setLineWidth(1); // ? + ctx.moveTo(x, y); + ctx.lineTo(x + symbol.width, curY); + ctx.stroke(); + } + x += symbol.width; + if (symbol.vAlign) { + x += symbol.xShift; + } + }); + ctx.closeGroup(); + ctx.restore(); + } +} +ChordSymbol.DEBUG = false; +// Chord symbols can be positioned and justified relative to the note. +ChordSymbol.HorizontalJustify = ChordSymbolHorizontalJustify; +ChordSymbol.HorizontalJustifyString = { + left: ChordSymbolHorizontalJustify.LEFT, + right: ChordSymbolHorizontalJustify.RIGHT, + center: ChordSymbolHorizontalJustify.CENTER, + centerStem: ChordSymbolHorizontalJustify.CENTER_STEM, +}; +ChordSymbol.VerticalJustify = ChordSymbolVerticalJustify; +ChordSymbol.VerticalJustifyString = { + top: ChordSymbolVerticalJustify.TOP, + above: ChordSymbolVerticalJustify.TOP, + below: ChordSymbolVerticalJustify.BOTTOM, + bottom: ChordSymbolVerticalJustify.BOTTOM, +}; +// Glyph data +ChordSymbol.glyphs = { + diminished: { + code: 'csymDiminished', + }, + dim: { + code: 'csymDiminished', + }, + halfDiminished: { + code: 'csymHalfDiminished', + }, + '+': { + code: 'csymAugmented', + }, + augmented: { + code: 'csymAugmented', + }, + majorSeventh: { + code: 'csymMajorSeventh', + }, + minor: { + code: 'csymMinor', + }, + '-': { + code: 'csymMinor', + }, + '(': { + code: 'csymParensLeftTall', + }, + leftParen: { + code: 'csymParensLeftTall', + }, + ')': { + code: 'csymParensRightTall', + }, + rightParen: { + code: 'csymParensRightTall', + }, + leftBracket: { + code: 'csymBracketLeftTall', + }, + rightBracket: { + code: 'csymBracketRightTall', + }, + leftParenTall: { + code: 'csymParensLeftVeryTall', + }, + rightParenTall: { + code: 'csymParensRightVeryTall', + }, + '/': { + code: 'csymDiagonalArrangementSlash', + }, + over: { + code: 'csymDiagonalArrangementSlash', + }, + '#': { + code: 'accidentalSharp', + }, + b: { + code: 'accidentalFlat', + }, +}; +ChordSymbol.symbolTypes = SymbolTypes; +ChordSymbol.symbolModifiers = SymbolModifiers; +/** Currently unused. */ +ChordSymbol.noFormat = false; + + +/***/ }), + +/***/ "./src/clef.ts": +/*!*********************!*\ + !*** ./src/clef.ts ***! + \*********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Clef": () => (/* binding */ Clef) +/* harmony export */ }); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _stavemodifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stavemodifier */ "./src/stavemodifier.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna Cheppudira 2013. +// Co-author: Benjamin W. Bohl +// MIT License + + + + + +// eslint-disable-next-line +function L(...args) { + if (Clef.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_4__.log)('Vex.Flow.Clef', args); +} +/** + * Clef implements various types of clefs that can be rendered on a stave. + * + * See `tests/clef_tests.ts` for usage examples. + */ +class Clef extends _stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifier { + /** Create a new clef. */ + constructor(type, size, annotation) { + super(); + /** + * The attribute `clef` must be a key from + * `Clef.types` + */ + this.clef = Clef.types['treble']; + this.setPosition(_stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifierPosition.BEGIN); + this.setType(type, size, annotation); + this.setWidth(_tables__WEBPACK_IMPORTED_MODULE_2__.Tables.currentMusicFont().lookupMetric(`clef.${this.size}.width`)); + L('Creating clef:', type); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.Clef; + } + /** + * Every clef name is associated with a glyph code from the font file + * and a default stave line number. + */ + static get types() { + return { + treble: { + code: 'gClef', + line: 3, + point: 0, + }, + bass: { + code: 'fClef', + line: 1, + point: 0, + }, + alto: { + code: 'cClef', + line: 2, + point: 0, + }, + tenor: { + code: 'cClef', + line: 1, + point: 0, + }, + percussion: { + code: 'restMaxima', + line: 2, + point: 0, + }, + soprano: { + code: 'cClef', + line: 4, + point: 0, + }, + 'mezzo-soprano': { + code: 'cClef', + line: 3, + point: 0, + }, + 'baritone-c': { + code: 'cClef', + line: 0, + point: 0, + }, + 'baritone-f': { + code: 'fClef', + line: 2, + point: 0, + }, + subbass: { + code: 'fClef', + line: 0, + point: 0, + }, + french: { + code: 'gClef', + line: 4, + point: 0, + }, + tab: { + code: '6stringTabClef', + point: 0, + }, + }; + } + /** Set clef type, size and annotation. */ + setType(type, size, annotation) { + this.type = type; + this.clef = Clef.types[type]; + if (size === undefined) { + this.size = 'default'; + } + else { + this.size = size; + } + const musicFont = _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.currentMusicFont(); + this.clef.point = musicFont.lookupMetric(`clef.${this.size}.point`, 0); + this.glyph = new _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph(this.clef.code, this.clef.point, { + category: `clef.${this.clef.code}.${this.size}`, + }); + // If an annotation, such as 8va, is specified, add it to the Clef object. + if (annotation !== undefined) { + const code = musicFont.lookupMetric(`clef.annotations.${annotation}.smuflCode`); + const point = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.point`); + const line = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.${this.type}.line`); + const x_shift = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.${this.type}.shiftX`); + this.annotation = { code, point, line, x_shift }; + this.attachment = new _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph(this.annotation.code, this.annotation.point); + this.attachment.metrics.x_max = 0; + this.attachment.setXShift(this.annotation.x_shift); + } + else { + this.annotation = undefined; + } + return this; + } + /** Get clef width. */ + getWidth() { + if (this.type === 'tab') { + (0,_util__WEBPACK_IMPORTED_MODULE_4__.defined)(this.stave, 'ClefError', "Can't get width without stave."); + } + return this.width; + } + /** Set associated stave. */ + setStave(stave) { + this.stave = stave; + if (this.type === 'tab') { + const glyph = (0,_util__WEBPACK_IMPORTED_MODULE_4__.defined)(this.glyph, 'ClefError', "Can't set stave without glyph."); + const numLines = this.stave.getNumLines(); + const musicFont = _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.currentMusicFont(); + const point = musicFont.lookupMetric(`clef.lineCount.${numLines}.point`); + const shiftY = musicFont.lookupMetric(`clef.lineCount.${numLines}.shiftY`); + glyph.setPoint(point); + glyph.setYShift(shiftY); + } + return this; + } + /** Render clef. */ + draw() { + const glyph = (0,_util__WEBPACK_IMPORTED_MODULE_4__.defined)(this.glyph, 'ClefError', "Can't draw clef without glyph."); + const stave = this.checkStave(); + const ctx = stave.checkContext(); + this.setRendered(); + ctx.openGroup('clef', this.getAttribute('id')); + glyph.setStave(stave); + glyph.setContext(ctx); + if (this.clef.line !== undefined) { + this.placeGlyphOnLine(glyph, stave, this.clef.line); + } + glyph.renderToStave(this.x); + if (this.annotation !== undefined && this.attachment !== undefined) { + this.placeGlyphOnLine(this.attachment, stave, this.annotation.line); + this.attachment.setStave(stave); + this.attachment.setContext(ctx); + this.attachment.renderToStave(this.x); + } + ctx.closeGroup(); + } +} +/** To enable logging for this class, set `Vex.Flow.Clef.DEBUG` to `true`. */ +Clef.DEBUG = false; + + +/***/ }), + +/***/ "./src/clefnote.ts": +/*!*************************!*\ + !*** ./src/clefnote.ts ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ClefNote": () => (/* binding */ ClefNote) +/* harmony export */ }); +/* harmony import */ var _clef__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./clef */ "./src/clef.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./note */ "./src/note.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author Taehoon Moon 2014 +// MIT License + + + + +/** ClefNote implements clef annotations in measures. */ +class ClefNote extends _note__WEBPACK_IMPORTED_MODULE_2__.Note { + constructor(type, size, annotation) { + super({ duration: 'b' }); + this.type = type; + this.clef_obj = new _clef__WEBPACK_IMPORTED_MODULE_0__.Clef(type, size, annotation); + this.clef = this.clef_obj.clef; + this.glyph = new _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph(this.clef.code, this.clef.point); + this.setWidth(this.glyph.getMetrics().width); + // Note properties + this.ignore_ticks = true; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.ClefNote; + } + /** Set clef type, size and annotation. */ + setType(type, size, annotation) { + this.type = type; + this.clef_obj = new _clef__WEBPACK_IMPORTED_MODULE_0__.Clef(type, size, annotation); + this.clef = this.clef_obj.clef; + this.glyph = new _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph(this.clef.code, this.clef.point); + this.setWidth(this.glyph.getMetrics().width); + return this; + } + /** Get associated clef. */ + getClef() { + return this.clef; + } + /** Set associated context. */ + setContext(context) { + super.setContext(context); + this.glyph.setContext(this.getContext()); + return this; + } + /** Get bounding box. */ + getBoundingBox() { + return super.getBoundingBox(); + } + /* Overridden to ignore */ + // eslint-disable-next-line + addToModifierContext(mc) { + // DO NOTHING. + return this; + } + preFormat() { + this.preFormatted = true; + return this; + } + /** Render clef note. */ + draw() { + var _a; + const stave = this.checkStave(); + if (!this.glyph.getContext()) { + this.glyph.setContext(this.getContext()); + } + this.setRendered(); + const abs_x = this.getAbsoluteX(); + this.glyph.setStave(stave); + this.glyph.setYShift(stave.getYForLine((_a = this.clef.line) !== null && _a !== void 0 ? _a : 0) - stave.getYForGlyphs()); + this.glyph.renderToStave(abs_x); + // If the Vex.Flow.Clef has an annotation, such as 8va, draw it. + if (this.clef_obj.annotation !== undefined) { + const attachment = new _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph(this.clef_obj.annotation.code, this.clef_obj.annotation.point); + if (!attachment.getContext()) { + attachment.setContext(this.getContext()); + } + attachment.setStave(stave); + attachment.setYShift(stave.getYForLine(this.clef_obj.annotation.line) - stave.getYForGlyphs()); + attachment.setXShift(this.clef_obj.annotation.x_shift); + attachment.renderToStave(abs_x); + } + } +} + + +/***/ }), + +/***/ "./src/crescendo.ts": +/*!**************************!*\ + !*** ./src/crescendo.ts ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Crescendo": () => (/* binding */ Crescendo) +/* harmony export */ }); +/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./note */ "./src/note.ts"); +/* harmony import */ var _tickcontext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tickcontext */ "./src/tickcontext.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// This file implements the `Crescendo` object which draws crescendos and +// decrescendo dynamics markings. A `Crescendo` is initialized with a +// duration and formatted as part of a `Voice` like any other `Note` +// type in VexFlow. This object would most likely be formatted in a Voice +// with `TextNotes` - which are used to represent other dynamics markings. + + + + +// To enable logging for this class. Set `Vex.Flow.Crescendo.DEBUG` to `true`. +// eslint-disable-next-line +function L(...args) { + if (Crescendo.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_3__.log)('Vex.Flow.Crescendo', args); +} +// Private helper to draw the hairpin +function renderHairpin(ctx, params) { + const begin_x = params.begin_x; + const end_x = params.end_x; + const y = params.y; + const half_height = params.height / 2; + ctx.beginPath(); + if (params.reverse) { + ctx.moveTo(begin_x, y - half_height); + ctx.lineTo(end_x, y); + ctx.lineTo(begin_x, y + half_height); + } + else { + ctx.moveTo(end_x, y - half_height); + ctx.lineTo(begin_x, y); + ctx.lineTo(end_x, y + half_height); + } + ctx.stroke(); + ctx.closePath(); +} +class Crescendo extends _note__WEBPACK_IMPORTED_MODULE_0__.Note { + // Initialize the crescendo's properties + constructor(noteStruct) { + super(noteStruct); + this.options = { + // Extensions to the length of the crescendo on either side + extend_left: 0, + extend_right: 0, + // Vertical shift + y_shift: 0, + }; + // Whether the object is a decrescendo + this.decrescendo = false; + // The staff line to be placed on + this.line = noteStruct.line || 0; + // The height at the open end of the cresc/decresc + this.height = 15; + } + /** Crescendo category string. */ + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_2__.Category.Crescendo; + } + // Set the line to center the element on + setLine(line) { + this.line = line; + return this; + } + // Set the full height at the open end + setHeight(height) { + this.height = height; + return this; + } + // Set whether the sign should be a descresendo by passing a bool + // to `decresc` + setDecrescendo(decresc) { + this.decrescendo = decresc; + return this; + } + // Preformat the note + preFormat() { + this.preFormatted = true; + return this; + } + // Render the Crescendo object onto the canvas + draw() { + const ctx = this.checkContext(); + const stave = this.checkStave(); + this.setRendered(); + const tick_context = this.getTickContext(); + const next_context = _tickcontext__WEBPACK_IMPORTED_MODULE_1__.TickContext.getNextContext(tick_context); + const begin_x = this.getAbsoluteX(); + const end_x = next_context ? next_context.getX() : stave.getX() + stave.getWidth(); + const y = stave.getYForLine(this.line + -3) + 1; + L('Drawing ', this.decrescendo ? 'decrescendo ' : 'crescendo ', this.height, 'x', begin_x - end_x); + renderHairpin(ctx, { + begin_x: begin_x - this.options.extend_left, + end_x: end_x + this.options.extend_right, + y: y + this.options.y_shift, + height: this.height, + reverse: this.decrescendo, + }); + } +} +Crescendo.DEBUG = false; + + +/***/ }), + +/***/ "./src/curve.ts": +/*!**********************!*\ + !*** ./src/curve.ts ***! + \**********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "CurvePosition": () => (/* binding */ CurvePosition), +/* harmony export */ "Curve": () => (/* binding */ Curve) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// VexFlow - Music Engraving for HTML5 +// Copyright Mohit Muthanna 2010 +// +// This class implements curves (for slurs) + + + +var CurvePosition; +(function (CurvePosition) { + CurvePosition[CurvePosition["NEAR_HEAD"] = 1] = "NEAR_HEAD"; + CurvePosition[CurvePosition["NEAR_TOP"] = 2] = "NEAR_TOP"; +})(CurvePosition || (CurvePosition = {})); +class Curve extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + // from: Start note + // to: End note + // options: + // cps: List of control points + // x_shift: pixels to shift + // y_shift: pixels to shift + constructor(from, to, options) { + super(); + this.render_options = Object.assign({ thickness: 2, x_shift: 0, y_shift: 10, position: CurvePosition.NEAR_HEAD, position_end: CurvePosition.NEAR_HEAD, invert: false, cps: [ + { x: 0, y: 10 }, + { x: 0, y: 10 }, + ] }, options); + this.from = from; + this.to = to; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_1__.Category.Curve; + } + static get Position() { + return CurvePosition; + } + static get PositionString() { + return { + nearHead: CurvePosition.NEAR_HEAD, + nearTop: CurvePosition.NEAR_TOP, + }; + } + setNotes(from, to) { + if (!from && !to) { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('BadArguments', 'Curve needs to have either `from` or `to` set.'); + } + this.from = from; + this.to = to; + return this; + } + /** + * @return {boolean} Returns true if this is a partial bar. + */ + isPartial() { + return !this.from || !this.to; + } + renderCurve(params) { + const ctx = this.checkContext(); + const x_shift = this.render_options.x_shift; + const y_shift = this.render_options.y_shift * params.direction; + const first_x = params.first_x + x_shift; + const first_y = params.first_y + y_shift; + const last_x = params.last_x - x_shift; + const last_y = params.last_y + y_shift; + const thickness = this.render_options.thickness; + const cps = this.render_options.cps; + const { x: cp0x, y: cp0y } = cps[0]; + const { x: cp1x, y: cp1y } = cps[1]; + const cp_spacing = (last_x - first_x) / (cps.length + 2); + ctx.beginPath(); + ctx.moveTo(first_x, first_y); + ctx.bezierCurveTo(first_x + cp_spacing + cp0x, first_y + cp0y * params.direction, last_x - cp_spacing + cp1x, last_y + cp1y * params.direction, last_x, last_y); + ctx.bezierCurveTo(last_x - cp_spacing + cp1x, last_y + (cp1y + thickness) * params.direction, first_x + cp_spacing + cp0x, first_y + (cp0y + thickness) * params.direction, first_x, first_y); + ctx.stroke(); + ctx.closePath(); + ctx.fill(); + } + draw() { + this.checkContext(); + this.setRendered(); + const first_note = this.from; + const last_note = this.to; + let first_x; + let last_x; + let first_y; + let last_y; + let stem_direction = 0; + let metric = 'baseY'; + let end_metric = 'baseY'; + function getPosition(position) { + return typeof position === 'string' ? Curve.PositionString[position] : position; + } + const position = getPosition(this.render_options.position); + const position_end = getPosition(this.render_options.position_end); + if (position === CurvePosition.NEAR_TOP) { + metric = 'topY'; + end_metric = 'topY'; + } + if (position_end === CurvePosition.NEAR_HEAD) { + end_metric = 'baseY'; + } + else if (position_end === CurvePosition.NEAR_TOP) { + end_metric = 'topY'; + } + if (first_note) { + first_x = first_note.getTieRightX(); + stem_direction = first_note.getStemDirection(); + first_y = first_note.getStemExtents()[metric]; + } + else { + const stave = last_note.checkStave(); + first_x = stave.getTieStartX(); + first_y = last_note.getStemExtents()[metric]; + } + if (last_note) { + last_x = last_note.getTieLeftX(); + stem_direction = last_note.getStemDirection(); + last_y = last_note.getStemExtents()[end_metric]; + } + else { + const stave = first_note.checkStave(); + last_x = stave.getTieEndX(); + last_y = first_note.getStemExtents()[end_metric]; + } + this.renderCurve({ + first_x, + last_x, + first_y, + last_y, + direction: stem_direction * (this.render_options.invert === true ? -1 : 1), + }); + return true; + } +} + + +/***/ }), + +/***/ "./src/dot.ts": +/*!********************!*\ + !*** ./src/dot.ts ***! + \********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Dot": () => (/* binding */ Dot) +/* harmony export */ }); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// VexFlow - Music Engraving for HTML5 +// Copyright Mohit Muthanna 2010 +// +// This class implements dot modifiers for notes. + + + +class Dot extends _modifier__WEBPACK_IMPORTED_MODULE_0__.Modifier { + constructor() { + super(); + this.position = _modifier__WEBPACK_IMPORTED_MODULE_0__.Modifier.Position.RIGHT; + this.radius = 2; + this.setWidth(5); + this.dot_shiftY = 0; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_1__.Category.Dot; + } + /** Returns the dots associated to a Note. */ + static getDots(note) { + return note.getModifiersByType(Dot.CATEGORY); + } + /** Add a dot on the specified keys to the notes. */ + static buildAndAttach(notes, options) { + for (const note of notes) { + if (options === null || options === void 0 ? void 0 : options.all) { + for (let i = 0; i < note.keys.length; i++) { + const dot = new Dot(); + dot.setDotShiftY(note.glyph.dot_shiftY); + note.addModifier(dot, i); + } + } + else if ((options === null || options === void 0 ? void 0 : options.index) != undefined) { + const dot = new Dot(); + dot.setDotShiftY(note.glyph.dot_shiftY); + note.addModifier(dot, options === null || options === void 0 ? void 0 : options.index); + } + else { + const dot = new Dot(); + dot.setDotShiftY(note.glyph.dot_shiftY); + note.addModifier(dot, 0); + } + } + } + // Arrange dots inside a ModifierContext. + static format(dots, state) { + const right_shift = state.right_shift; + const dot_spacing = 1; + if (!dots || dots.length === 0) + return false; + const dot_list = []; + const max_shift_map = {}; + for (let i = 0; i < dots.length; ++i) { + const dot = dots[i]; + const note = dot.getNote(); + let props; + let shift; + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_1__.isStaveNote)(note)) { + const index = dot.checkIndex(); + props = note.getKeyProps()[index]; + // consider right displaced head with no previous modifier + shift = note.getFirstDotPx(); + } + else if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_1__.isTabNote)(note)) { + props = { line: 0.5 }; // Shim key props for dot placement + shift = right_shift; + } + else { + // note object is not StaveNote or TabNote. + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('Internal', 'Unexpected instance.'); + } + const note_id = note.getAttribute('id'); + dot_list.push({ line: props.line, note, note_id, dot }); + max_shift_map[note_id] = Math.max(max_shift_map[note_id] || shift, shift); + } + // Sort dots by line number. + dot_list.sort((a, b) => b.line - a.line); + let dot_shift = right_shift; + let x_width = 0; + let last_line = null; + let last_note = null; + let prev_dotted_space = null; + let half_shiftY = 0; + for (let i = 0; i < dot_list.length; ++i) { + const { dot, note, note_id, line } = dot_list[i]; + // Reset the position of the dot every line. + if (line !== last_line || note !== last_note) { + dot_shift = max_shift_map[note_id]; + } + if (!note.isRest() && line !== last_line) { + if (Math.abs(line % 1) === 0.5) { + // note is on a space, so no dot shift + half_shiftY = 0; + } + else { + // note is on a line, so shift dot to space above the line + half_shiftY = 0.5; + if (last_note != null && !last_note.isRest() && last_line != null && last_line - line === 0.5) { + // previous note on a space, so shift dot to space below the line + half_shiftY = -0.5; + } + else if (line + half_shiftY === prev_dotted_space) { + // previous space is dotted, so shift dot to space below the line + half_shiftY = -0.5; + } + } + } + // convert half_shiftY to a multiplier for dots.draw() + if (note.isRest()) { + dot.dot_shiftY += -half_shiftY; + } + else { + dot.dot_shiftY = -half_shiftY; + } + prev_dotted_space = line + half_shiftY; + dot.setXShift(dot_shift); + dot_shift += dot.getWidth() + dot_spacing; // spacing + x_width = dot_shift > x_width ? dot_shift : x_width; + last_line = line; + last_note = note; + } + // Update state. + state.right_shift += x_width; + return true; + } + setNote(note) { + this.note = note; + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_1__.isGraceNote)(note)) { + this.radius *= 0.5; + this.setWidth(3); + } + return this; + } + setDotShiftY(y) { + this.dot_shiftY = y; + return this; + } + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const stave = note.checkStave(); + const lineSpace = stave.getSpacingBetweenLines(); + const start = note.getModifierStartXY(this.position, this.index, { forceFlagRight: true }); + // Set the starting y coordinate to the base of the stem for TabNotes. + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_1__.isTabNote)(note)) { + start.y = note.getStemExtents().baseY; + } + const x = start.x + this.x_shift + this.width - this.radius; + const y = start.y + this.y_shift + this.dot_shiftY * lineSpace; + ctx.beginPath(); + ctx.arc(x, y, this.radius, 0, Math.PI * 2, false); + ctx.fill(); + } +} + + +/***/ }), + +/***/ "./src/easyscore.ts": +/*!**************************!*\ + !*** ./src/easyscore.ts ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "EasyScoreGrammar": () => (/* binding */ EasyScoreGrammar), +/* harmony export */ "Piece": () => (/* binding */ Piece), +/* harmony export */ "Builder": () => (/* binding */ Builder), +/* harmony export */ "EasyScore": () => (/* binding */ EasyScore) +/* harmony export */ }); +/* harmony import */ var _articulation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./articulation */ "./src/articulation.ts"); +/* harmony import */ var _dot__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./dot */ "./src/dot.ts"); +/* harmony import */ var _frethandfinger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./frethandfinger */ "./src/frethandfinger.ts"); +/* harmony import */ var _music__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./music */ "./src/music.ts"); +/* harmony import */ var _parser__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./parser */ "./src/parser.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + + + +// To enable logging for this class. Set `Vex.Flow.EasyScore.DEBUG` to `true`. +// eslint-disable-next-line +function L(...args) { + if (EasyScore.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_6__.log)('Vex.Flow.EasyScore', args); +} +class EasyScoreGrammar { + constructor(builder) { + this.builder = builder; + } + begin() { + return this.LINE; + } + LINE() { + return { + expect: [this.PIECE, this.PIECES, this.EOL], + }; + } + PIECE() { + return { + expect: [this.CHORDORNOTE, this.PARAMS], + run: () => this.builder.commitPiece(), + }; + } + PIECES() { + return { + expect: [this.COMMA, this.PIECE], + zeroOrMore: true, + }; + } + PARAMS() { + return { + expect: [this.DURATION, this.TYPE, this.DOTS, this.OPTS], + }; + } + CHORDORNOTE() { + return { + expect: [this.CHORD, this.SINGLENOTE], + or: true, + }; + } + CHORD() { + return { + expect: [this.LPAREN, this.NOTES, this.RPAREN], + // eslint-disable-next-line + run: (state) => this.builder.addChord(state.matches[1]), + }; + } + NOTES() { + return { + expect: [this.NOTE], + oneOrMore: true, + }; + } + NOTE() { + return { + expect: [this.NOTENAME, this.ACCIDENTAL, this.OCTAVE], + }; + } + SINGLENOTE() { + return { + expect: [this.NOTENAME, this.ACCIDENTAL, this.OCTAVE], + run: (state) => { + // eslint-disable-next-line + const s = state; + this.builder.addSingleNote(s.matches[0], s.matches[1], s.matches[2]); + }, + }; + } + ACCIDENTAL() { + return { + expect: [this.MICROTONES, this.ACCIDENTALS], + maybe: true, + or: true, + }; + } + DOTS() { + return { + expect: [this.DOT], + zeroOrMore: true, + // eslint-disable-next-line + run: (state) => this.builder.setNoteDots(state.matches), + }; + } + TYPE() { + return { + expect: [this.SLASH, this.MAYBESLASH, this.TYPES], + maybe: true, + // eslint-disable-next-line + run: (state) => this.builder.setNoteType(state.matches[2]), + }; + } + DURATION() { + return { + expect: [this.SLASH, this.DURATIONS], + maybe: true, + // eslint-disable-next-line + run: (state) => this.builder.setNoteDuration(state.matches[1]), + }; + } + OPTS() { + return { + expect: [this.LBRACKET, this.KEYVAL, this.KEYVALS, this.RBRACKET], + maybe: true, + }; + } + KEYVALS() { + return { + expect: [this.COMMA, this.KEYVAL], + zeroOrMore: true, + }; + } + KEYVAL() { + const unquote = (str) => str.slice(1, -1); + return { + expect: [this.KEY, this.EQUALS, this.VAL], + // eslint-disable-next-line + run: (state) => this.builder.addNoteOption(state.matches[0], unquote(state.matches[2])), + }; + } + VAL() { + return { + expect: [this.SVAL, this.DVAL], + or: true, + }; + } + KEY() { + return { token: '[a-zA-Z][a-zA-Z0-9]*' }; + } + DVAL() { + return { token: '["][^"]*["]' }; + } + SVAL() { + return { token: "['][^']*[']" }; + } + NOTENAME() { + return { token: '[a-gA-G]' }; + } + OCTAVE() { + return { token: '[0-9]+' }; + } + ACCIDENTALS() { + return { token: 'bb|b|##|#|n' }; + } + MICROTONES() { + return { token: 'bbs|bss|bs|db|d|\\+\\+-|\\+-|\\+\\+|\\+|k|o' }; + } + DURATIONS() { + return { token: '[0-9whq]+' }; + } + TYPES() { + return { token: '[rRsSmMhHgG]' }; + } + LPAREN() { + return { token: '[(]' }; + } + RPAREN() { + return { token: '[)]' }; + } + COMMA() { + return { token: '[,]' }; + } + DOT() { + return { token: '[.]' }; + } + SLASH() { + return { token: '[/]' }; + } + MAYBESLASH() { + return { token: '[/]?' }; + } + EQUALS() { + return { token: '[=]' }; + } + LBRACKET() { + return { token: '\\[' }; + } + RBRACKET() { + return { token: '\\]' }; + } + EOL() { + return { token: '$' }; + } +} +class Piece { + constructor(duration) { + this.chord = []; + this.dots = 0; + this.options = {}; + this.duration = duration; + } +} +class Builder { + constructor(factory) { + this.commitHooks = []; + this.factory = factory; + this.reset(); + } + reset(options) { + this.options = Object.assign({ stem: 'auto', clef: 'treble' }, options); + this.elements = { notes: [], accidentals: [] }; + this.rollingDuration = '8'; + this.resetPiece(); + } + getFactory() { + return this.factory; + } + getElements() { + return this.elements; + } + addCommitHook(commitHook) { + this.commitHooks.push(commitHook); + } + resetPiece() { + L('resetPiece'); + this.piece = new Piece(this.rollingDuration); + } + setNoteDots(dots) { + L('setNoteDots:', dots); + if (dots) + this.piece.dots = dots.length; + } + setNoteDuration(duration) { + L('setNoteDuration:', duration); + this.rollingDuration = this.piece.duration = duration || this.rollingDuration; + } + setNoteType(type) { + L('setNoteType:', type); + if (type) + this.piece.type = type; + } + addNoteOption(key, value) { + L('addNoteOption: key:', key, 'value:', value); + this.piece.options[key] = value; + } + addNote(key, accid, octave) { + L('addNote:', key, accid, octave); + this.piece.chord.push({ + key: key, + accid, + octave, + }); + } + addSingleNote(key, accid, octave) { + L('addSingleNote:', key, accid, octave); + this.addNote(key, accid, octave); + } + // notes is an array with 3 entries + addChord(notes) { + L('startChord'); + if (typeof notes[0] !== 'object') { + this.addSingleNote(notes[0]); + } + else { + notes.forEach((n) => { + if (n) + this.addNote(...n); // n => [string, string | null, string] + }); + } + L('endChord'); + } + commitPiece() { + L('commitPiece'); + const { factory } = this; + if (!factory) + return; + const options = Object.assign(Object.assign({}, this.options), this.piece.options); + // reset() sets this.options.stem & this.options.clef but we check to make sure nothing has changed. + // e.g., auto | up | down + const stem = (0,_util__WEBPACK_IMPORTED_MODULE_6__.defined)(options.stem, 'BadArguments', 'options.stem is not defined').toLowerCase(); + // e.g., treble | bass + const clef = (0,_util__WEBPACK_IMPORTED_MODULE_6__.defined)(options.clef, 'BadArguments', 'options.clef is not defined').toLowerCase(); + const { chord, duration, dots, type } = this.piece; + // Create a string[] that will be assigned to the .keys property of the StaveNote. + // Each string in the array represents a note pitch and is of the form: {NoteName}{Accidental}/{Octave} + // Only standard accidentals are included in the .keys property. Microtonal accidentals are not included. + const standardAccidentals = _music__WEBPACK_IMPORTED_MODULE_3__.Music.accidentals; + const keys = chord.map((notePiece) => { + var _a; + return notePiece.key + + (standardAccidentals.includes((_a = notePiece.accid) !== null && _a !== void 0 ? _a : '') ? notePiece.accid : '') + + '/' + + notePiece.octave; + }); + const auto_stem = stem === 'auto'; // StaveNoteStruct expects the underscore & lowercase. + // Build a GhostNote or StaveNote using the information we gathered. + const note = (type === null || type === void 0 ? void 0 : type.toLowerCase()) == 'g' + ? factory.GhostNote({ duration, dots }) + : factory.StaveNote({ keys, duration, dots, type, clef, auto_stem }); + if (!auto_stem) + note.setStemDirection(stem === 'up' ? _stem__WEBPACK_IMPORTED_MODULE_5__.Stem.UP : _stem__WEBPACK_IMPORTED_MODULE_5__.Stem.DOWN); + // Attach accidentals. + const accidentals = []; + chord.forEach((notePiece, index) => { + const accid = notePiece.accid; + if (typeof accid === 'string') { + const accidental = factory.Accidental({ type: accid }); + note.addModifier(accidental, index); + accidentals.push(accidental); + } + else { + accidentals.push(undefined); + } + }); + // Attach dots. + for (let i = 0; i < dots; i++) + _dot__WEBPACK_IMPORTED_MODULE_1__.Dot.buildAndAttach([note], { all: true }); + this.commitHooks.forEach((commitHook) => commitHook(options, note, this)); + this.elements.notes.push(note); + this.elements.accidentals.push(accidentals); + this.resetPiece(); + } +} +/** + * Commit hook used by EasyScore.setOptions(). + */ +function setId(options, note) { + if (options.id === undefined) + return; + note.setAttribute('id', options.id); +} +// Used by setClass() below. +const commaSeparatedRegex = /\s*,\s*/; +/** + * Commit hook used by EasyScore.setOptions(). + */ +function setClass(options, note) { + if (options.class === undefined) + return; + options.class.split(commaSeparatedRegex).forEach((className) => note.addClass(className)); +} +/** + * EasyScore implements a parser for a simple language to generate VexFlow objects. + */ +class EasyScore { + constructor(options = {}) { + this.defaults = { + clef: 'treble', + time: '4/4', + stem: 'auto', + }; + this.setOptions(options); + } + /** + * Set the score defaults. + * clef must be set appropriately to avoid errors when adding Staves. + * @param defaults.clef default clef ( treble | bass ...) see {@link Clef.types} + * @param defaults.time default time signature ( 4/4 | 9/8 ...) + * @param defaults.stem default stem arrangement (auto | up | down) + * @returns this + */ + set(defaults) { + this.defaults = Object.assign(Object.assign({}, this.defaults), defaults); + return this; + } + /** + * @param options.factory is required. + * @returns this + */ + setOptions(options) { + var _a, _b; + // eslint-disable-next-line + const factory = options.factory; // ! operator, because options.factory was set in Factory.EasyScore(). + const builder = (_a = options.builder) !== null && _a !== void 0 ? _a : new Builder(factory); + this.options = Object.assign(Object.assign({ commitHooks: [setId, setClass, _articulation__WEBPACK_IMPORTED_MODULE_0__.Articulation.easyScoreHook, _frethandfinger__WEBPACK_IMPORTED_MODULE_2__.FretHandFinger.easyScoreHook], throwOnError: false }, options), { factory, + builder }); + this.factory = factory; + this.builder = builder; + this.grammar = new EasyScoreGrammar(this.builder); + this.parser = new _parser__WEBPACK_IMPORTED_MODULE_4__.Parser(this.grammar); + (_b = this.options.commitHooks) === null || _b === void 0 ? void 0 : _b.forEach((commitHook) => this.addCommitHook(commitHook)); + return this; + } + setContext(context) { + this.factory.setContext(context); + return this; + } + parse(line, options = {}) { + this.builder.reset(options); + const result = this.parser.parse(line); + if (!result.success && this.options.throwOnError) { + L(result); + throw new _util__WEBPACK_IMPORTED_MODULE_6__.RuntimeError('Error parsing line: ' + line); + } + return result; + } + beam(notes, options) { + this.factory.Beam({ notes, options }); + return notes; + } + tuplet(notes, options) { + this.factory.Tuplet({ notes, options }); + return notes; + } + notes(line, options = {}) { + options = Object.assign({ clef: this.defaults.clef, stem: this.defaults.stem }, options); + this.parse(line, options); + return this.builder.getElements().notes; + } + voice(notes, options = {}) { + options = Object.assign({ time: this.defaults.time }, options); + return this.factory.Voice(options).addTickables(notes); + } + addCommitHook(commitHook) { + this.builder.addCommitHook(commitHook); + } +} +EasyScore.DEBUG = false; + + +/***/ }), + +/***/ "./src/element.ts": +/*!************************!*\ + !*** ./src/element.ts ***! + \************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Element": () => (/* binding */ Element) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _registry__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./registry */ "./src/registry.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// @author Mohit Cheppudira +// MIT License + + + + +/** + * Element implements a generic base class for VexFlow, with implementations + * of general functions and properties that can be inherited by all VexFlow elements. + */ +class Element { + constructor() { + var _a; + this.attrs = { + id: Element.newID(), + el: undefined, + type: this.getCategory(), + classes: {}, + }; + this.rendered = false; + // If a default registry exist, then register with it right away. + (_a = _registry__WEBPACK_IMPORTED_MODULE_1__.Registry.getDefaultRegistry()) === null || _a === void 0 ? void 0 : _a.register(this); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_2__.Category.Element; + } + static newID() { + return `auto${Element.ID++}`; + } + /** Get element category string. */ + getCategory() { + return this.constructor.CATEGORY; + } + /** + * Set the element style used to render. + * + * Example: + * ```typescript + * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' }); + * element.draw(); + * ``` + * Note: If the element draws additional sub-elements (ie.: Modifiers in a Stave), + * the style can be applied to all of them by means of the context: + * ```typescript + * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' }); + * element.getContext().setFillStyle('red'); + * element.getContext().setStrokeStyle('red'); + * element.draw(); + * ``` + * or using drawWithStyle: + * ```typescript + * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' }); + * element.drawWithStyle(); + * ``` + */ + setStyle(style) { + this.style = style; + return this; + } + /** Get the element style used for rendering. */ + getStyle() { + return this.style; + } + /** Apply the element style to `context`. */ + applyStyle(context = this.context, style = this.getStyle()) { + if (!style) + return this; + if (!context) + return this; + context.save(); + if (style.shadowColor) + context.setShadowColor(style.shadowColor); + if (style.shadowBlur) + context.setShadowBlur(style.shadowBlur); + if (style.fillStyle) + context.setFillStyle(style.fillStyle); + if (style.strokeStyle) + context.setStrokeStyle(style.strokeStyle); + if (style.lineWidth) + context.setLineWidth(style.lineWidth); + return this; + } + /** Restore the style of `context`. */ + restoreStyle(context = this.context, style = this.getStyle()) { + if (!style) + return this; + if (!context) + return this; + context.restore(); + return this; + } + /** + * Draw the element and all its sub-elements (ie.: Modifiers in a Stave) + * with the element style. + */ + drawWithStyle() { + this.checkContext(); + this.applyStyle(); + this.draw(); + this.restoreStyle(); + } + /** Check if it has a class label (An element can have multiple class labels). */ + hasClass(className) { + return this.attrs.classes[className] === true; + } + /** Add a class label (An element can have multiple class labels). */ + addClass(className) { + var _a; + this.attrs.classes[className] = true; + (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({ + id: this.attrs.id, + name: 'class', + value: className, + oldValue: undefined, + }); + return this; + } + /** Remove a class label (An element can have multiple class labels). */ + removeClass(className) { + var _a; + delete this.attrs.classes[className]; + (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({ + id: this.attrs.id, + name: 'class', + value: undefined, + oldValue: className, + }); + return this; + } + /** Call back from registry after the element is registered. */ + onRegister(registry) { + this.registry = registry; + return this; + } + /** Return the rendered status. */ + isRendered() { + return this.rendered; + } + /** Set the rendered status. */ + setRendered(rendered = true) { + this.rendered = rendered; + return this; + } + /** Return the element attributes. */ + getAttributes() { + return this.attrs; + } + /** Return an attribute. */ + // eslint-disable-next-line + getAttribute(name) { + return this.attrs[name]; + } + /** Set an attribute. */ + // eslint-disable-next-line + setAttribute(name, value) { + var _a; + const oldID = this.attrs.id; + const oldValue = this.attrs[name]; + this.attrs[name] = value; + // Register with old id to support id changes. + (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({ id: oldID, name, value, oldValue }); + return this; + } + /** Get the boundingBox. */ + getBoundingBox() { + return this.boundingBox; + } + /** Return the context. */ + getContext() { + return this.context; + } + /** Set the context. */ + setContext(context) { + this.context = context; + return this; + } + /** Validate and return the context. */ + checkContext() { + return (0,_util__WEBPACK_IMPORTED_MODULE_3__.defined)(this.context, 'NoContext', 'No rendering context attached to instance.'); + } + ////////////////////////////////////////////////////////////////////////////////////////////////// + // Font Handling + /** + * Provide a CSS compatible font string (e.g., 'bold 16px Arial'). + */ + set font(f) { + this.setFont(f); + } + /** Returns the CSS compatible font string. */ + get font() { + return _font__WEBPACK_IMPORTED_MODULE_0__.Font.toCSSString(this.textFont); + } + /** + * Set the element's font family, size, weight, style (e.g., `Arial`, `10pt`, `bold`, `italic`). + * @param font is 1) a `FontInfo` object or + * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or + * 3) a string representing the font family (at least one of `size`, `weight`, or `style` must also be provided). + * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt'). + * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900). + * @param style is a string (e.g., 'italic', 'normal'). + * If no arguments are provided, then the font is set to the default font. + * Each Element subclass may specify its own default by overriding the static `TEXT_FONT` property. + */ + setFont(font, size, weight, style) { + // Allow subclasses to override `TEXT_FONT`. + const defaultTextFont = this.constructor.TEXT_FONT; + const fontIsObject = typeof font === 'object'; + const fontIsString = typeof font === 'string'; + const fontIsUndefined = font === undefined; + const sizeWeightStyleAreUndefined = size === undefined && weight === undefined && style === undefined; + if (fontIsObject) { + // `font` is case 1) a FontInfo object + this.textFont = Object.assign(Object.assign({}, defaultTextFont), font); + } + else if (fontIsString && sizeWeightStyleAreUndefined) { + // `font` is case 2) CSS font shorthand. + this.textFont = _font__WEBPACK_IMPORTED_MODULE_0__.Font.fromCSSString(font); + } + else if (fontIsUndefined && sizeWeightStyleAreUndefined) { + // All arguments are undefined. Do not check for `arguments.length === 0`, + // which fails on the edge case: `setFont(undefined)`. + // TODO: See if we can remove this case entirely without introducing a visual diff. + // The else case below seems like it should be equivalent to this case. + this.textFont = Object.assign({}, defaultTextFont); + } + else { + // `font` is case 3) a font family string (e.g., 'Times New Roman'). + // The other parameters represent the size, weight, and style. + // It is okay for `font` to be undefined while one or more of the other arguments is provided. + // Following CSS conventions, unspecified params are reset to the default. + this.textFont = _font__WEBPACK_IMPORTED_MODULE_0__.Font.validate(font !== null && font !== void 0 ? font : defaultTextFont.family, size !== null && size !== void 0 ? size : defaultTextFont.size, weight !== null && weight !== void 0 ? weight : defaultTextFont.weight, style !== null && style !== void 0 ? style : defaultTextFont.style); + } + return this; + } + getFont() { + if (!this.textFont) { + this.resetFont(); + } + return _font__WEBPACK_IMPORTED_MODULE_0__.Font.toCSSString(this.textFont); + } + /** + * Reset the text font to the style indicated by the static `TEXT_FONT` property. + * Subclasses can call this to initialize `textFont` for the first time. + */ + resetFont() { + this.setFont(); + } + /** Return a copy of the current FontInfo object. */ + get fontInfo() { + if (!this.textFont) { + this.resetFont(); + } + // We can cast to Required here, because + // we just called resetFont() above to ensure this.textFont is set. + return Object.assign({}, this.textFont); + } + set fontInfo(fontInfo) { + this.setFont(fontInfo); + } + /** Change the font size, while keeping everything else the same. */ + setFontSize(size) { + const fontInfo = this.fontInfo; + this.setFont(fontInfo.family, size, fontInfo.weight, fontInfo.style); + return this; + } + /** + * @returns a CSS font-size string (e.g., '18pt', '12px', '1em'). + * See Element.fontSizeInPixels or Element.fontSizeInPoints if you need to get a number for calculation purposes. + */ + getFontSize() { + return this.fontSize; + } + /** + * The size is 1) a string of the form '10pt' or '16px', compatible with the CSS font-size property. + * or 2) a number, which is interpreted as a point size (i.e. 12 == '12pt'). + */ + set fontSize(size) { + this.setFontSize(size); + } + /** + * @returns a CSS font-size string (e.g., '18pt', '12px', '1em'). + */ + get fontSize() { + let size = this.fontInfo.size; + if (typeof size === 'number') { + size = `${size}pt`; + } + return size; + } + /** + * @returns the font size in `pt`. + */ + get fontSizeInPoints() { + return _font__WEBPACK_IMPORTED_MODULE_0__.Font.convertSizeToPointValue(this.fontSize); + } + /** + * @returns the font size in `px`. + */ + get fontSizeInPixels() { + return _font__WEBPACK_IMPORTED_MODULE_0__.Font.convertSizeToPixelValue(this.fontSize); + } + /** + * @returns a CSS font-style string (e.g., 'italic'). + */ + get fontStyle() { + return this.fontInfo.style; + } + set fontStyle(style) { + const fontInfo = this.fontInfo; + this.setFont(fontInfo.family, fontInfo.size, fontInfo.weight, style); + } + /** + * @returns a CSS font-weight string (e.g., 'bold'). + * As in CSS, font-weight is always returned as a string, even if it was set as a number. + */ + get fontWeight() { + return this.fontInfo.weight + ''; + } + set fontWeight(weight) { + const fontInfo = this.fontInfo; + this.setFont(fontInfo.family, fontInfo.size, weight, fontInfo.style); + } +} +Element.ID = 1000; +/** + * Default font for text. This is not related to music engraving. Instead, see `Flow.setMusicFont(...fontNames)` + * to customize the font for musical symbols placed on the score. + */ +Element.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_0__.Font.SANS_SERIF, + size: _font__WEBPACK_IMPORTED_MODULE_0__.Font.SIZE, + weight: _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.NORMAL, + style: _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.NORMAL, +}; + + +/***/ }), + +/***/ "./src/factory.ts": +/*!************************!*\ + !*** ./src/factory.ts ***! + \************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Factory": () => (/* binding */ Factory) +/* harmony export */ }); +/* harmony import */ var _accidental__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./accidental */ "./src/accidental.ts"); +/* harmony import */ var _annotation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./annotation */ "./src/annotation.ts"); +/* harmony import */ var _articulation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./articulation */ "./src/articulation.ts"); +/* harmony import */ var _barnote__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./barnote */ "./src/barnote.ts"); +/* harmony import */ var _beam__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./beam */ "./src/beam.ts"); +/* harmony import */ var _chordsymbol__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./chordsymbol */ "./src/chordsymbol.ts"); +/* harmony import */ var _clefnote__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./clefnote */ "./src/clefnote.ts"); +/* harmony import */ var _curve__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./curve */ "./src/curve.ts"); +/* harmony import */ var _easyscore__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./easyscore */ "./src/easyscore.ts"); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _formatter__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./formatter */ "./src/formatter.ts"); +/* harmony import */ var _frethandfinger__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./frethandfinger */ "./src/frethandfinger.ts"); +/* harmony import */ var _ghostnote__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./ghostnote */ "./src/ghostnote.ts"); +/* harmony import */ var _glyphnote__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./glyphnote */ "./src/glyphnote.ts"); +/* harmony import */ var _gracenote__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./gracenote */ "./src/gracenote.ts"); +/* harmony import */ var _gracenotegroup__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./gracenotegroup */ "./src/gracenotegroup.ts"); +/* harmony import */ var _keysignote__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./keysignote */ "./src/keysignote.ts"); +/* harmony import */ var _modifiercontext__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./modifiercontext */ "./src/modifiercontext.ts"); +/* harmony import */ var _multimeasurerest__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./multimeasurerest */ "./src/multimeasurerest.ts"); +/* harmony import */ var _notesubgroup__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./notesubgroup */ "./src/notesubgroup.ts"); +/* harmony import */ var _pedalmarking__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./pedalmarking */ "./src/pedalmarking.ts"); +/* harmony import */ var _renderer__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./renderer */ "./src/renderer.ts"); +/* harmony import */ var _repeatnote__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./repeatnote */ "./src/repeatnote.ts"); +/* harmony import */ var _stave__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./stave */ "./src/stave.ts"); +/* harmony import */ var _staveconnector__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./staveconnector */ "./src/staveconnector.ts"); +/* harmony import */ var _staveline__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./staveline */ "./src/staveline.ts"); +/* harmony import */ var _stavenote__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./stavenote */ "./src/stavenote.ts"); +/* harmony import */ var _stavetie__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./stavetie */ "./src/stavetie.ts"); +/* harmony import */ var _stringnumber__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./stringnumber */ "./src/stringnumber.ts"); +/* harmony import */ var _system__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./system */ "./src/system.ts"); +/* harmony import */ var _tabnote__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./tabnote */ "./src/tabnote.ts"); +/* harmony import */ var _tabstave__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./tabstave */ "./src/tabstave.ts"); +/* harmony import */ var _textbracket__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./textbracket */ "./src/textbracket.ts"); +/* harmony import */ var _textdynamics__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./textdynamics */ "./src/textdynamics.ts"); +/* harmony import */ var _textnote__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./textnote */ "./src/textnote.ts"); +/* harmony import */ var _tickcontext__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./tickcontext */ "./src/tickcontext.ts"); +/* harmony import */ var _timesignote__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./timesignote */ "./src/timesignote.ts"); +/* harmony import */ var _tuplet__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./tuplet */ "./src/tuplet.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +/* harmony import */ var _vibratobracket__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./vibratobracket */ "./src/vibratobracket.ts"); +/* harmony import */ var _voice__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./voice */ "./src/voice.ts"); +/* harmony import */ var _web__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./web */ "./src/web.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// @author Mohit Cheppudira +// MIT License + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// eslint-disable-next-line +function L(...args) { + if (Factory.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_38__.log)('Vex.Flow.Factory', args); +} +/** + * Factory implements a high level API around VexFlow. + */ +class Factory { + /** + * Example: + * + * Create an SVG renderer and attach it to the DIV element named "boo" to render using 1200 and 600 + * + * `const vf: Factory = new Vex.Flow.Factory({renderer: { elementId: 'boo', width: 1200, height: 600 }});` + */ + constructor(options = {}) { + L('New factory: ', options); + this.options = { + stave: { + space: 10, + }, + renderer: { + elementId: '', + width: 500, + height: 200, + background: '#FFF', + }, + font: Factory.TEXT_FONT, + }; + this.setOptions(options); + } + /** + * Static simplified function to access constructor without providing FactoryOptions + * + * Example: + * + * Create an SVG renderer and attach it to the DIV element named "boo" to render using 1200 and 600 + * + * `const vf: Factory = Vex.Flow.Factory.newFromElementId('boo', 1200, 600 );` + */ + static newFromElementId(elementId, width = 500, height = 200) { + return new Factory({ renderer: { elementId, width, height } }); + } + reset() { + this.renderQ = []; + this.systems = []; + this.staves = []; + this.voices = []; + this.stave = undefined; // current stave + } + setOptions(options) { + this.options = Object.assign(Object.assign({}, this.options), options); + this.initRenderer(); + this.reset(); + } + initRenderer() { + const { elementId, width, height, background } = this.options.renderer; + if (elementId == null) { + return; + } + if (elementId == '') { + L(this); + throw new _util__WEBPACK_IMPORTED_MODULE_38__.RuntimeError('renderer.elementId not set in FactoryOptions'); + } + let backend = this.options.renderer.backend; + if (backend === undefined) { + const elem = document.getElementById(elementId); + // We use a custom type check here, because node-canvas mimics canvas, + // but is not an instance of window.HTMLCanvasElement. + // In fact, `window` might be undefined here. + // See: https://www.npmjs.com/package/canvas + if ((0,_web__WEBPACK_IMPORTED_MODULE_41__.isHTMLCanvas)(elem)) { + backend = _renderer__WEBPACK_IMPORTED_MODULE_21__.Renderer.Backends.CANVAS; + } + else { + backend = _renderer__WEBPACK_IMPORTED_MODULE_21__.Renderer.Backends.SVG; + } + } + this.context = _renderer__WEBPACK_IMPORTED_MODULE_21__.Renderer.buildContext(elementId, backend, width, height, background); + } + getContext() { + return this.context; + } + setContext(context) { + this.context = context; + return this; + } + getStave() { + return this.stave; + } + getVoices() { + return this.voices; + } + /** Return pixels from current stave spacing. */ + Stave(params) { + const staveSpace = this.options.stave.space; + const p = Object.assign({ x: 0, y: 0, width: this.options.renderer.width - staveSpace * 1.0, options: { spacing_between_lines_px: staveSpace * 1.0 } }, params); + const stave = new _stave__WEBPACK_IMPORTED_MODULE_23__.Stave(p.x, p.y, p.width, p.options); + this.staves.push(stave); + stave.setContext(this.context); + this.stave = stave; + return stave; + } + TabStave(params) { + const staveSpace = this.options.stave.space; + const p = Object.assign({ x: 0, y: 0, width: this.options.renderer.width - staveSpace * 1.0, options: { spacing_between_lines_px: staveSpace * 1.3 } }, params); + const stave = new _tabstave__WEBPACK_IMPORTED_MODULE_31__.TabStave(p.x, p.y, p.width, p.options); + this.staves.push(stave); + stave.setContext(this.context); + this.stave = stave; + return stave; + } + StaveNote(noteStruct) { + const note = new _stavenote__WEBPACK_IMPORTED_MODULE_26__.StaveNote(noteStruct); + if (this.stave) + note.setStave(this.stave); + note.setContext(this.context); + this.renderQ.push(note); + return note; + } + GlyphNote(glyph, noteStruct, options) { + const note = new _glyphnote__WEBPACK_IMPORTED_MODULE_13__.GlyphNote(glyph, noteStruct, options); + if (this.stave) + note.setStave(this.stave); + note.setContext(this.context); + this.renderQ.push(note); + return note; + } + RepeatNote(type, noteStruct, options) { + const note = new _repeatnote__WEBPACK_IMPORTED_MODULE_22__.RepeatNote(type, noteStruct, options); + if (this.stave) + note.setStave(this.stave); + note.setContext(this.context); + this.renderQ.push(note); + return note; + } + GhostNote(noteStruct) { + const ghostNote = new _ghostnote__WEBPACK_IMPORTED_MODULE_12__.GhostNote(noteStruct); + if (this.stave) + ghostNote.setStave(this.stave); + ghostNote.setContext(this.context); + this.renderQ.push(ghostNote); + return ghostNote; + } + TextNote(noteStruct) { + const textNote = new _textnote__WEBPACK_IMPORTED_MODULE_34__.TextNote(noteStruct); + if (this.stave) + textNote.setStave(this.stave); + textNote.setContext(this.context); + this.renderQ.push(textNote); + return textNote; + } + BarNote(params = {}) { + const barNote = new _barnote__WEBPACK_IMPORTED_MODULE_3__.BarNote(params.type); + if (this.stave) + barNote.setStave(this.stave); + barNote.setContext(this.context); + this.renderQ.push(barNote); + return barNote; + } + ClefNote(params) { + const p = Object.assign({ type: 'treble', options: { + size: 'default', + annotation: undefined, + } }, params); + const clefNote = new _clefnote__WEBPACK_IMPORTED_MODULE_6__.ClefNote(p.type, p.options.size, p.options.annotation); + if (this.stave) + clefNote.setStave(this.stave); + clefNote.setContext(this.context); + this.renderQ.push(clefNote); + return clefNote; + } + TimeSigNote(params) { + const p = Object.assign({ time: '4/4' }, params); + const timeSigNote = new _timesignote__WEBPACK_IMPORTED_MODULE_36__.TimeSigNote(p.time); + if (this.stave) + timeSigNote.setStave(this.stave); + timeSigNote.setContext(this.context); + this.renderQ.push(timeSigNote); + return timeSigNote; + } + KeySigNote(params) { + const keySigNote = new _keysignote__WEBPACK_IMPORTED_MODULE_16__.KeySigNote(params.key, params.cancelKey, params.alterKey); + if (this.stave) + keySigNote.setStave(this.stave); + keySigNote.setContext(this.context); + this.renderQ.push(keySigNote); + return keySigNote; + } + TabNote(noteStruct) { + const note = new _tabnote__WEBPACK_IMPORTED_MODULE_30__.TabNote(noteStruct); + if (this.stave) + note.setStave(this.stave); + note.setContext(this.context); + this.renderQ.push(note); + return note; + } + GraceNote(noteStruct) { + const note = new _gracenote__WEBPACK_IMPORTED_MODULE_14__.GraceNote(noteStruct); + if (this.stave) + note.setStave(this.stave); + note.setContext(this.context); + return note; + } + GraceNoteGroup(params) { + const group = new _gracenotegroup__WEBPACK_IMPORTED_MODULE_15__.GraceNoteGroup(params.notes, params.slur); + group.setContext(this.context); + return group; + } + Accidental(params) { + const accid = new _accidental__WEBPACK_IMPORTED_MODULE_0__.Accidental(params.type); + accid.setContext(this.context); + return accid; + } + Annotation(params) { + const p = Object.assign({ text: 'p', hJustify: _annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationHorizontalJustify.CENTER, vJustify: _annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.BOTTOM }, params); + const annotation = new _annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation(p.text); + annotation.setJustification(p.hJustify); + annotation.setVerticalJustification(p.vJustify); + annotation.setFont(p.font); + annotation.setContext(this.context); + return annotation; + } + ChordSymbol(params) { + const p = Object.assign({ vJustify: 'top', hJustify: 'center', kerning: true, reportWidth: true }, params); + const chordSymbol = new _chordsymbol__WEBPACK_IMPORTED_MODULE_5__.ChordSymbol(); + chordSymbol.setHorizontal(p.hJustify); + chordSymbol.setVertical(p.vJustify); + chordSymbol.setEnableKerning(p.kerning); + chordSymbol.setReportWidth(p.reportWidth); + // There is a default font based on the engraving font. Only set then + // font if it is specific, else use the default + if (typeof p.fontFamily === 'string' && typeof p.fontSize === 'number') { + if (typeof p.fontWeight === 'string') + chordSymbol.setFont(p.fontFamily, p.fontSize, p.fontWeight); + else + chordSymbol.setFont(p.fontFamily, p.fontSize, ''); + } + else if (typeof p.fontSize === 'number') { + chordSymbol.setFontSize(p.fontSize); + } + chordSymbol.setContext(this.context); + return chordSymbol; + } + Articulation(params) { + const p = Object.assign({ type: 'a.', position: 'above' }, params); + const articulation = new _articulation__WEBPACK_IMPORTED_MODULE_2__.Articulation(p.type); + articulation.setPosition(p.position); + articulation.setContext(this.context); + return articulation; + } + TextDynamics(params) { + const p = Object.assign({ text: 'p', duration: 'q', dots: 0, line: 0 }, params); + const text = new _textdynamics__WEBPACK_IMPORTED_MODULE_33__.TextDynamics({ + text: p.text, + line: p.line, + duration: p.duration, + dots: p.dots, + }); + if (this.stave) + text.setStave(this.stave); + text.setContext(this.context); + this.renderQ.push(text); + return text; + } + Fingering(params) { + const p = Object.assign({ number: '0', position: 'left' }, params); + const fingering = new _frethandfinger__WEBPACK_IMPORTED_MODULE_11__.FretHandFinger(p.number); + fingering.setPosition(p.position); + fingering.setContext(this.context); + return fingering; + } + StringNumber(params) { + const stringNumber = new _stringnumber__WEBPACK_IMPORTED_MODULE_28__.StringNumber(params.number); + stringNumber.setPosition(params.position); + stringNumber.setContext(this.context); + return stringNumber; + } + TickContext() { + return new _tickcontext__WEBPACK_IMPORTED_MODULE_35__.TickContext(); + } + ModifierContext() { + return new _modifiercontext__WEBPACK_IMPORTED_MODULE_17__.ModifierContext(); + } + MultiMeasureRest(params) { + const numMeasures = (0,_util__WEBPACK_IMPORTED_MODULE_38__.defined)(params.number_of_measures, 'NoNumberOfMeasures'); + const multiMeasureRest = new _multimeasurerest__WEBPACK_IMPORTED_MODULE_18__.MultiMeasureRest(numMeasures, params); + multiMeasureRest.setContext(this.context); + this.renderQ.push(multiMeasureRest); + return multiMeasureRest; + } + Voice(params) { + const p = Object.assign({ time: '4/4' }, params); + const voice = new _voice__WEBPACK_IMPORTED_MODULE_40__.Voice(p.time, p.options); + this.voices.push(voice); + return voice; + } + StaveConnector(params) { + const connector = new _staveconnector__WEBPACK_IMPORTED_MODULE_24__.StaveConnector(params.top_stave, params.bottom_stave); + connector.setType(params.type).setContext(this.context); + this.renderQ.push(connector); + return connector; + } + Formatter(options) { + return new _formatter__WEBPACK_IMPORTED_MODULE_10__.Formatter(options); + } + Tuplet(params) { + const p = Object.assign({ notes: [], options: {} }, params); + const tuplet = new _tuplet__WEBPACK_IMPORTED_MODULE_37__.Tuplet(p.notes, p.options).setContext(this.context); + this.renderQ.push(tuplet); + return tuplet; + } + Beam(params) { + var _a, _b, _c; + const beam = new _beam__WEBPACK_IMPORTED_MODULE_4__.Beam(params.notes, (_a = params.options) === null || _a === void 0 ? void 0 : _a.autoStem).setContext(this.context); + beam.breakSecondaryAt((_c = (_b = params.options) === null || _b === void 0 ? void 0 : _b.secondaryBeamBreaks) !== null && _c !== void 0 ? _c : []); + this.renderQ.push(beam); + return beam; + } + Curve(params) { + const curve = new _curve__WEBPACK_IMPORTED_MODULE_7__.Curve(params.from, params.to, params.options).setContext(this.context); + this.renderQ.push(curve); + return curve; + } + StaveTie(params) { + var _a; + const tie = new _stavetie__WEBPACK_IMPORTED_MODULE_27__.StaveTie({ + first_note: params.from, + last_note: params.to, + first_indices: params.first_indices, + last_indices: params.last_indices, + }, params.text); + if ((_a = params.options) === null || _a === void 0 ? void 0 : _a.direction) + tie.setDirection(params.options.direction); + tie.setContext(this.context); + this.renderQ.push(tie); + return tie; + } + StaveLine(params) { + var _a, _b; + const line = new _staveline__WEBPACK_IMPORTED_MODULE_25__.StaveLine({ + first_note: params.from, + last_note: params.to, + first_indices: params.first_indices, + last_indices: params.last_indices, + }); + if ((_a = params.options) === null || _a === void 0 ? void 0 : _a.text) + line.setText(params.options.text); + if ((_b = params.options) === null || _b === void 0 ? void 0 : _b.font) + line.setFont(params.options.font); + line.setContext(this.context); + this.renderQ.push(line); + return line; + } + VibratoBracket(params) { + const vibratoBracket = new _vibratobracket__WEBPACK_IMPORTED_MODULE_39__.VibratoBracket({ + start: params.from, + stop: params.to, + }); + if (params.options.line) + vibratoBracket.setLine(params.options.line); + if (params.options.harsh) + vibratoBracket.setHarsh(params.options.harsh); + vibratoBracket.setContext(this.context); + this.renderQ.push(vibratoBracket); + return vibratoBracket; + } + TextBracket(params) { + const textBracket = new _textbracket__WEBPACK_IMPORTED_MODULE_32__.TextBracket({ + start: params.from, + stop: params.to, + text: params.text, + superscript: params.options.superscript, + position: params.options.position, + }); + if (params.options.line) + textBracket.setLine(params.options.line); + if (params.options.font) + textBracket.setFont(params.options.font); + textBracket.setContext(this.context); + this.renderQ.push(textBracket); + return textBracket; + } + System(params = {}) { + params.factory = this; + const system = new _system__WEBPACK_IMPORTED_MODULE_29__.System(params).setContext(this.context); + this.systems.push(system); + return system; + } + /** + * Creates EasyScore. Normally the first step after constructing a Factory. For example: + * ``` + * const vf: Factory = new Vex.Flow.Factory({renderer: { elementId: 'boo', width: 1200, height: 600 }}); + * const score: EasyScore = vf.EasyScore(); + * ``` + * @param options.factory optional instance of Factory + * @param options.builder instance of Builder + * @param options.commitHooks function to call after a note element is created + * @param options.throwOnError throw error in case of parsing error + */ + EasyScore(options = {}) { + options.factory = this; + return new _easyscore__WEBPACK_IMPORTED_MODULE_8__.EasyScore(options); + } + PedalMarking(params) { + const p = Object.assign({ notes: [], options: { + style: 'mixed', + } }, params); + const pedal = new _pedalmarking__WEBPACK_IMPORTED_MODULE_20__.PedalMarking(p.notes); + pedal.setType(_pedalmarking__WEBPACK_IMPORTED_MODULE_20__.PedalMarking.typeString[p.options.style]); + pedal.setContext(this.context); + this.renderQ.push(pedal); + return pedal; + } + NoteSubGroup(params) { + const p = Object.assign({ notes: [] }, params); + const group = new _notesubgroup__WEBPACK_IMPORTED_MODULE_19__.NoteSubGroup(p.notes); + group.setContext(this.context); + return group; + } + /** Render the score. */ + draw() { + const ctx = this.context; + this.systems.forEach((s) => s.setContext(ctx).format()); + this.staves.forEach((s) => s.setContext(ctx).draw()); + this.voices.forEach((v) => v.setContext(ctx).draw()); + this.renderQ.forEach((e) => { + if (!e.isRendered()) + e.setContext(ctx).draw(); + }); + this.systems.forEach((s) => s.setContext(ctx).draw()); + this.reset(); + } +} +/** To enable logging for this class. Set `Vex.Flow.Factory.DEBUG` to `true`. */ +Factory.DEBUG = false; +/** Default text font. */ +Factory.TEXT_FONT = Object.assign({}, _element__WEBPACK_IMPORTED_MODULE_9__.Element.TEXT_FONT); + + +/***/ }), + +/***/ "./src/flow.ts": +/*!*********************!*\ + !*** ./src/flow.ts ***! + \*********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Flow": () => (/* binding */ Flow) +/* harmony export */ }); +/* harmony import */ var _accidental__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./accidental */ "./src/accidental.ts"); +/* harmony import */ var _annotation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./annotation */ "./src/annotation.ts"); +/* harmony import */ var _articulation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./articulation */ "./src/articulation.ts"); +/* harmony import */ var _barnote__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./barnote */ "./src/barnote.ts"); +/* harmony import */ var _beam__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./beam */ "./src/beam.ts"); +/* harmony import */ var _bend__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./bend */ "./src/bend.ts"); +/* harmony import */ var _boundingbox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./boundingbox */ "./src/boundingbox.ts"); +/* harmony import */ var _boundingboxcomputation__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./boundingboxcomputation */ "./src/boundingboxcomputation.ts"); +/* harmony import */ var _canvascontext__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./canvascontext */ "./src/canvascontext.ts"); +/* harmony import */ var _chordsymbol__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./chordsymbol */ "./src/chordsymbol.ts"); +/* harmony import */ var _clef__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./clef */ "./src/clef.ts"); +/* harmony import */ var _clefnote__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./clefnote */ "./src/clefnote.ts"); +/* harmony import */ var _crescendo__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./crescendo */ "./src/crescendo.ts"); +/* harmony import */ var _curve__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./curve */ "./src/curve.ts"); +/* harmony import */ var _dot__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./dot */ "./src/dot.ts"); +/* harmony import */ var _easyscore__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./easyscore */ "./src/easyscore.ts"); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _factory__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./factory */ "./src/factory.ts"); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _formatter__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./formatter */ "./src/formatter.ts"); +/* harmony import */ var _fraction__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./fraction */ "./src/fraction.ts"); +/* harmony import */ var _frethandfinger__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./frethandfinger */ "./src/frethandfinger.ts"); +/* harmony import */ var _ghostnote__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./ghostnote */ "./src/ghostnote.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _glyphnote__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./glyphnote */ "./src/glyphnote.ts"); +/* harmony import */ var _gracenote__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./gracenote */ "./src/gracenote.ts"); +/* harmony import */ var _gracenotegroup__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./gracenotegroup */ "./src/gracenotegroup.ts"); +/* harmony import */ var _gracetabnote__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./gracetabnote */ "./src/gracetabnote.ts"); +/* harmony import */ var _keymanager__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./keymanager */ "./src/keymanager.ts"); +/* harmony import */ var _keysignature__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./keysignature */ "./src/keysignature.ts"); +/* harmony import */ var _keysignote__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./keysignote */ "./src/keysignote.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _modifiercontext__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./modifiercontext */ "./src/modifiercontext.ts"); +/* harmony import */ var _multimeasurerest__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./multimeasurerest */ "./src/multimeasurerest.ts"); +/* harmony import */ var _music__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./music */ "./src/music.ts"); +/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./note */ "./src/note.ts"); +/* harmony import */ var _notehead__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./notehead */ "./src/notehead.ts"); +/* harmony import */ var _notesubgroup__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./notesubgroup */ "./src/notesubgroup.ts"); +/* harmony import */ var _ornament__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./ornament */ "./src/ornament.ts"); +/* harmony import */ var _parenthesis__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./parenthesis */ "./src/parenthesis.ts"); +/* harmony import */ var _parser__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./parser */ "./src/parser.ts"); +/* harmony import */ var _pedalmarking__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./pedalmarking */ "./src/pedalmarking.ts"); +/* harmony import */ var _registry__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./registry */ "./src/registry.ts"); +/* harmony import */ var _rendercontext__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./rendercontext */ "./src/rendercontext.ts"); +/* harmony import */ var _renderer__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ./renderer */ "./src/renderer.ts"); +/* harmony import */ var _repeatnote__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ./repeatnote */ "./src/repeatnote.ts"); +/* harmony import */ var _stave__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ./stave */ "./src/stave.ts"); +/* harmony import */ var _stavebarline__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ./stavebarline */ "./src/stavebarline.ts"); +/* harmony import */ var _staveconnector__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ./staveconnector */ "./src/staveconnector.ts"); +/* harmony import */ var _stavehairpin__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ./stavehairpin */ "./src/stavehairpin.ts"); +/* harmony import */ var _staveline__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! ./staveline */ "./src/staveline.ts"); +/* harmony import */ var _stavemodifier__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! ./stavemodifier */ "./src/stavemodifier.ts"); +/* harmony import */ var _stavenote__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! ./stavenote */ "./src/stavenote.ts"); +/* harmony import */ var _staverepetition__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! ./staverepetition */ "./src/staverepetition.ts"); +/* harmony import */ var _stavetempo__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! ./stavetempo */ "./src/stavetempo.ts"); +/* harmony import */ var _stavetext__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! ./stavetext */ "./src/stavetext.ts"); +/* harmony import */ var _stavetie__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! ./stavetie */ "./src/stavetie.ts"); +/* harmony import */ var _stavevolta__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! ./stavevolta */ "./src/stavevolta.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _stringnumber__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! ./stringnumber */ "./src/stringnumber.ts"); +/* harmony import */ var _strokes__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(/*! ./strokes */ "./src/strokes.ts"); +/* harmony import */ var _svgcontext__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(/*! ./svgcontext */ "./src/svgcontext.ts"); +/* harmony import */ var _system__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(/*! ./system */ "./src/system.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _tabnote__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(/*! ./tabnote */ "./src/tabnote.ts"); +/* harmony import */ var _tabslide__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(/*! ./tabslide */ "./src/tabslide.ts"); +/* harmony import */ var _tabstave__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(/*! ./tabstave */ "./src/tabstave.ts"); +/* harmony import */ var _tabtie__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(/*! ./tabtie */ "./src/tabtie.ts"); +/* harmony import */ var _textbracket__WEBPACK_IMPORTED_MODULE_68__ = __webpack_require__(/*! ./textbracket */ "./src/textbracket.ts"); +/* harmony import */ var _textdynamics__WEBPACK_IMPORTED_MODULE_69__ = __webpack_require__(/*! ./textdynamics */ "./src/textdynamics.ts"); +/* harmony import */ var _textformatter__WEBPACK_IMPORTED_MODULE_70__ = __webpack_require__(/*! ./textformatter */ "./src/textformatter.ts"); +/* harmony import */ var _textnote__WEBPACK_IMPORTED_MODULE_71__ = __webpack_require__(/*! ./textnote */ "./src/textnote.ts"); +/* harmony import */ var _tickcontext__WEBPACK_IMPORTED_MODULE_72__ = __webpack_require__(/*! ./tickcontext */ "./src/tickcontext.ts"); +/* harmony import */ var _timesignature__WEBPACK_IMPORTED_MODULE_73__ = __webpack_require__(/*! ./timesignature */ "./src/timesignature.ts"); +/* harmony import */ var _timesignote__WEBPACK_IMPORTED_MODULE_74__ = __webpack_require__(/*! ./timesignote */ "./src/timesignote.ts"); +/* harmony import */ var _tremolo__WEBPACK_IMPORTED_MODULE_75__ = __webpack_require__(/*! ./tremolo */ "./src/tremolo.ts"); +/* harmony import */ var _tuning__WEBPACK_IMPORTED_MODULE_76__ = __webpack_require__(/*! ./tuning */ "./src/tuning.ts"); +/* harmony import */ var _tuplet__WEBPACK_IMPORTED_MODULE_77__ = __webpack_require__(/*! ./tuplet */ "./src/tuplet.ts"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_78__ = __webpack_require__(/*! ./version */ "./src/version.ts"); +/* harmony import */ var _vibrato__WEBPACK_IMPORTED_MODULE_79__ = __webpack_require__(/*! ./vibrato */ "./src/vibrato.ts"); +/* harmony import */ var _vibratobracket__WEBPACK_IMPORTED_MODULE_80__ = __webpack_require__(/*! ./vibratobracket */ "./src/vibratobracket.ts"); +/* harmony import */ var _voice__WEBPACK_IMPORTED_MODULE_81__ = __webpack_require__(/*! ./voice */ "./src/voice.ts"); +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +class Flow { + static get BUILD() { + return { + /** version number. */ + VERSION: _version__WEBPACK_IMPORTED_MODULE_78__.VERSION, + /** git commit ID that this library was built from. */ + ID: _version__WEBPACK_IMPORTED_MODULE_78__.ID, + /** The date when this library was compiled. */ + DATE: _version__WEBPACK_IMPORTED_MODULE_78__.DATE, + }; + } + static get Flow() { + // This (circular reference) provides a handy shortcut for importing VexFlow via `require()`. + // For example: + // const Vex = require('vexflow'); + // const { Flow, Stave, StaveNote, Formatter, Renderer } = Vex.Flow; + return Flow; + } + // ... more to come ... + /** + * Examples: + * ``` + * Vex.Flow.setMusicFont('Petaluma'); + * Vex.Flow.setMusicFont('Bravura', 'Gonville'); + * ``` + * + * **CASE 1**: You are using `vexflow.js`, which includes all music fonts (Bravura, Gonville, Petaluma, Custom). + * In this case, calling this method is optional, since VexFlow already defaults to a music font stack of: + * 'Bravura', 'Gonville', 'Custom'. + * + * **CASE 2**: You are using `vexflow-bravura.js` or `vexflow-petaluma.js` or `vexflow-gonville.js`, + * which includes a single music font. Calling this method is unnecessary. + * + * **CASE 3**: You are using the light weight `vexflow-core.js` to take advantage of lazy loading for fonts. + * In this case, the default music font stack is empty. + * Example: + * ``` + * await Vex.Flow.fetchMusicFont('Petaluma'); + * Vex.Flow.setMusicFont('Petaluma'); + * ... (do VexFlow stuff) ... + * ``` + * See `demos/fonts/` for more examples. + * + * @returns an array of Font objects corresponding to the provided `fontNames`. + */ + static setMusicFont(...fontNames) { + // Convert the array of font names into an array of Font objects. + const fonts = fontNames.map((fontName) => _font__WEBPACK_IMPORTED_MODULE_18__.Font.load(fontName)); + _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.MUSIC_FONT_STACK = fonts; + _glyph__WEBPACK_IMPORTED_MODULE_23__.Glyph.MUSIC_FONT_STACK = fonts.slice(); + _glyph__WEBPACK_IMPORTED_MODULE_23__.Glyph.CURRENT_CACHE_KEY = fontNames.join(','); + return fonts; + } + /** + * Used with vexflow-core which supports dynamic font loading. + */ + // eslint-disable-next-line + static fetchMusicFont(fontName, fontModuleOrPath) { + return __awaiter(this, void 0, void 0, function* () { + // The default implementation does nothing. + // See vexflow-core.ts for the implementation that vexflow-core.js uses. + }); + } + static getMusicFont() { + const fonts = _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.MUSIC_FONT_STACK; + return fonts.map((font) => font.getName()); + } + static get NOTATION_FONT_SCALE() { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.NOTATION_FONT_SCALE; + } + static set NOTATION_FONT_SCALE(value) { + _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.NOTATION_FONT_SCALE = value; + } + static get TABLATURE_FONT_SCALE() { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.TABLATURE_FONT_SCALE; + } + static set TABLATURE_FONT_SCALE(value) { + _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.TABLATURE_FONT_SCALE = value; + } + static get RESOLUTION() { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.RESOLUTION; + } + static set RESOLUTION(value) { + _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.RESOLUTION = value; + } + static get SLASH_NOTEHEAD_WIDTH() { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.SLASH_NOTEHEAD_WIDTH; + } + static set SLASH_NOTEHEAD_WIDTH(value) { + _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.SLASH_NOTEHEAD_WIDTH = value; + } + static get STAVE_LINE_DISTANCE() { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.STAVE_LINE_DISTANCE; + } + static set STAVE_LINE_DISTANCE(value) { + _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.STAVE_LINE_DISTANCE = value; + } + static get STAVE_LINE_THICKNESS() { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.STAVE_LINE_THICKNESS; + } + static set STAVE_LINE_THICKNESS(value) { + _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.STAVE_LINE_THICKNESS = value; + } + static get STEM_HEIGHT() { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.STEM_HEIGHT; + } + static set STEM_HEIGHT(value) { + _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.STEM_HEIGHT = value; + } + static get STEM_WIDTH() { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.STEM_WIDTH; + } + static set STEM_WIDTH(value) { + _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.STEM_WIDTH = value; + } + static get TIME4_4() { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.TIME4_4; + } + static get accidentalMap() { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.accidentalMap; + } + static get unicode() { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.unicode; + } + static keySignature(spec) { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.keySignature(spec); + } + static hasKeySignature(spec) { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.hasKeySignature(spec); + } + static getKeySignatures() { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.getKeySignatures(); + } + static clefProperties(clef) { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.clefProperties(clef); + } + // eslint-disable-next-line + static keyProperties(key, clef, params) { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.keyProperties(key, clef, params); + } + static durationToTicks(duration) { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.durationToTicks(duration); + } +} +Flow.Accidental = _accidental__WEBPACK_IMPORTED_MODULE_0__.Accidental; +Flow.Annotation = _annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation; +Flow.Articulation = _articulation__WEBPACK_IMPORTED_MODULE_2__.Articulation; +Flow.Barline = _stavebarline__WEBPACK_IMPORTED_MODULE_47__.Barline; +Flow.BarNote = _barnote__WEBPACK_IMPORTED_MODULE_3__.BarNote; +Flow.Beam = _beam__WEBPACK_IMPORTED_MODULE_4__.Beam; +Flow.Bend = _bend__WEBPACK_IMPORTED_MODULE_5__.Bend; +Flow.BoundingBox = _boundingbox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox; +Flow.BoundingBoxComputation = _boundingboxcomputation__WEBPACK_IMPORTED_MODULE_7__.BoundingBoxComputation; +Flow.CanvasContext = _canvascontext__WEBPACK_IMPORTED_MODULE_8__.CanvasContext; +Flow.ChordSymbol = _chordsymbol__WEBPACK_IMPORTED_MODULE_9__.ChordSymbol; +Flow.Clef = _clef__WEBPACK_IMPORTED_MODULE_10__.Clef; +Flow.ClefNote = _clefnote__WEBPACK_IMPORTED_MODULE_11__.ClefNote; +Flow.Crescendo = _crescendo__WEBPACK_IMPORTED_MODULE_12__.Crescendo; +Flow.Curve = _curve__WEBPACK_IMPORTED_MODULE_13__.Curve; +Flow.Dot = _dot__WEBPACK_IMPORTED_MODULE_14__.Dot; +Flow.EasyScore = _easyscore__WEBPACK_IMPORTED_MODULE_15__.EasyScore; +Flow.Element = _element__WEBPACK_IMPORTED_MODULE_16__.Element; +Flow.Factory = _factory__WEBPACK_IMPORTED_MODULE_17__.Factory; +Flow.Font = _font__WEBPACK_IMPORTED_MODULE_18__.Font; +Flow.Formatter = _formatter__WEBPACK_IMPORTED_MODULE_19__.Formatter; +Flow.Fraction = _fraction__WEBPACK_IMPORTED_MODULE_20__.Fraction; +Flow.FretHandFinger = _frethandfinger__WEBPACK_IMPORTED_MODULE_21__.FretHandFinger; +Flow.GhostNote = _ghostnote__WEBPACK_IMPORTED_MODULE_22__.GhostNote; +Flow.Glyph = _glyph__WEBPACK_IMPORTED_MODULE_23__.Glyph; +Flow.GlyphNote = _glyphnote__WEBPACK_IMPORTED_MODULE_24__.GlyphNote; +Flow.GraceNote = _gracenote__WEBPACK_IMPORTED_MODULE_25__.GraceNote; +Flow.GraceNoteGroup = _gracenotegroup__WEBPACK_IMPORTED_MODULE_26__.GraceNoteGroup; +Flow.GraceTabNote = _gracetabnote__WEBPACK_IMPORTED_MODULE_27__.GraceTabNote; +Flow.KeyManager = _keymanager__WEBPACK_IMPORTED_MODULE_28__.KeyManager; +Flow.KeySignature = _keysignature__WEBPACK_IMPORTED_MODULE_29__.KeySignature; +Flow.KeySigNote = _keysignote__WEBPACK_IMPORTED_MODULE_30__.KeySigNote; +Flow.Modifier = _modifier__WEBPACK_IMPORTED_MODULE_31__.Modifier; +Flow.ModifierContext = _modifiercontext__WEBPACK_IMPORTED_MODULE_32__.ModifierContext; +Flow.MultiMeasureRest = _multimeasurerest__WEBPACK_IMPORTED_MODULE_33__.MultiMeasureRest; +Flow.Music = _music__WEBPACK_IMPORTED_MODULE_34__.Music; +Flow.Note = _note__WEBPACK_IMPORTED_MODULE_35__.Note; +Flow.NoteHead = _notehead__WEBPACK_IMPORTED_MODULE_36__.NoteHead; +Flow.NoteSubGroup = _notesubgroup__WEBPACK_IMPORTED_MODULE_37__.NoteSubGroup; +Flow.Ornament = _ornament__WEBPACK_IMPORTED_MODULE_38__.Ornament; +Flow.Parenthesis = _parenthesis__WEBPACK_IMPORTED_MODULE_39__.Parenthesis; +Flow.Parser = _parser__WEBPACK_IMPORTED_MODULE_40__.Parser; +Flow.PedalMarking = _pedalmarking__WEBPACK_IMPORTED_MODULE_41__.PedalMarking; +Flow.Registry = _registry__WEBPACK_IMPORTED_MODULE_42__.Registry; +Flow.RenderContext = _rendercontext__WEBPACK_IMPORTED_MODULE_43__.RenderContext; +Flow.Renderer = _renderer__WEBPACK_IMPORTED_MODULE_44__.Renderer; +Flow.RepeatNote = _repeatnote__WEBPACK_IMPORTED_MODULE_45__.RepeatNote; +Flow.Repetition = _staverepetition__WEBPACK_IMPORTED_MODULE_53__.Repetition; +Flow.Stave = _stave__WEBPACK_IMPORTED_MODULE_46__.Stave; +Flow.StaveConnector = _staveconnector__WEBPACK_IMPORTED_MODULE_48__.StaveConnector; +Flow.StaveHairpin = _stavehairpin__WEBPACK_IMPORTED_MODULE_49__.StaveHairpin; +Flow.StaveLine = _staveline__WEBPACK_IMPORTED_MODULE_50__.StaveLine; +Flow.StaveModifier = _stavemodifier__WEBPACK_IMPORTED_MODULE_51__.StaveModifier; +Flow.StaveNote = _stavenote__WEBPACK_IMPORTED_MODULE_52__.StaveNote; +Flow.StaveTempo = _stavetempo__WEBPACK_IMPORTED_MODULE_54__.StaveTempo; +Flow.StaveText = _stavetext__WEBPACK_IMPORTED_MODULE_55__.StaveText; +Flow.StaveTie = _stavetie__WEBPACK_IMPORTED_MODULE_56__.StaveTie; +Flow.Stem = _stem__WEBPACK_IMPORTED_MODULE_58__.Stem; +Flow.StringNumber = _stringnumber__WEBPACK_IMPORTED_MODULE_59__.StringNumber; +Flow.Stroke = _strokes__WEBPACK_IMPORTED_MODULE_60__.Stroke; +Flow.SVGContext = _svgcontext__WEBPACK_IMPORTED_MODULE_61__.SVGContext; +Flow.System = _system__WEBPACK_IMPORTED_MODULE_62__.System; +Flow.TabNote = _tabnote__WEBPACK_IMPORTED_MODULE_64__.TabNote; +Flow.TabSlide = _tabslide__WEBPACK_IMPORTED_MODULE_65__.TabSlide; +Flow.TabStave = _tabstave__WEBPACK_IMPORTED_MODULE_66__.TabStave; +Flow.TabTie = _tabtie__WEBPACK_IMPORTED_MODULE_67__.TabTie; +Flow.TextBracket = _textbracket__WEBPACK_IMPORTED_MODULE_68__.TextBracket; +Flow.TextDynamics = _textdynamics__WEBPACK_IMPORTED_MODULE_69__.TextDynamics; +Flow.TextFormatter = _textformatter__WEBPACK_IMPORTED_MODULE_70__.TextFormatter; +Flow.TextNote = _textnote__WEBPACK_IMPORTED_MODULE_71__.TextNote; +Flow.TickContext = _tickcontext__WEBPACK_IMPORTED_MODULE_72__.TickContext; +Flow.TimeSignature = _timesignature__WEBPACK_IMPORTED_MODULE_73__.TimeSignature; +Flow.TimeSigNote = _timesignote__WEBPACK_IMPORTED_MODULE_74__.TimeSigNote; +Flow.Tremolo = _tremolo__WEBPACK_IMPORTED_MODULE_75__.Tremolo; +Flow.Tuning = _tuning__WEBPACK_IMPORTED_MODULE_76__.Tuning; +Flow.Tuplet = _tuplet__WEBPACK_IMPORTED_MODULE_77__.Tuplet; +Flow.Vibrato = _vibrato__WEBPACK_IMPORTED_MODULE_79__.Vibrato; +Flow.VibratoBracket = _vibratobracket__WEBPACK_IMPORTED_MODULE_80__.VibratoBracket; +Flow.Voice = _voice__WEBPACK_IMPORTED_MODULE_81__.Voice; +Flow.Volta = _stavevolta__WEBPACK_IMPORTED_MODULE_57__.Volta; +// enums need to be exported too! +Flow.BarlineType = _stavebarline__WEBPACK_IMPORTED_MODULE_47__.BarlineType; +Flow.ModifierPosition = _modifier__WEBPACK_IMPORTED_MODULE_31__.ModifierPosition; + + +/***/ }), + +/***/ "./src/font.ts": +/*!*********************!*\ + !*** ./src/font.ts ***! + \*********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "FontWeight": () => (/* binding */ FontWeight), +/* harmony export */ "FontStyle": () => (/* binding */ FontStyle), +/* harmony export */ "Font": () => (/* binding */ Font) +/* harmony export */ }); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; + +var FontWeight; +(function (FontWeight) { + FontWeight["NORMAL"] = "normal"; + FontWeight["BOLD"] = "bold"; +})(FontWeight || (FontWeight = {})); +var FontStyle; +(function (FontStyle) { + FontStyle["NORMAL"] = "normal"; + FontStyle["ITALIC"] = "italic"; +})(FontStyle || (FontStyle = {})); +// Internal element for parsing CSS font shorthand strings. +let fontParser; +const Fonts = {}; +class Font { + /** + * Use `Font.load(fontName)` to get a Font object. + * Do not call this constructor directly. + */ + constructor(fontName) { + this.name = fontName; + } + /** + * @param fontSize a font size to convert. Can be specified as a CSS length string (e.g., '16pt', '1em') + * or as a number (the unit is assumed to be 'pt'). See `Font.scaleToPxFrom` for the supported + * units (e.g., pt, em, %). + * @returns the number of pixels that is equivalent to `fontSize` + */ + static convertSizeToPixelValue(fontSize = Font.SIZE) { + var _a; + if (typeof fontSize === 'number') { + // Assume the numeric fontSize is specified in pt. + return fontSize * Font.scaleToPxFrom.pt; + } + else { + const value = parseFloat(fontSize); + if (isNaN(value)) { + return 0; + } + const unit = fontSize.replace(/[\d.\s]/g, '').toLowerCase(); // Extract the unit by removing all numbers, dots, spaces. + const conversionFactor = (_a = Font.scaleToPxFrom[unit]) !== null && _a !== void 0 ? _a : 1; + return value * conversionFactor; + } + } + /** + * @param fontSize a font size to convert. Can be specified as a CSS length string (e.g., '16pt', '1em') + * or as a number (the unit is assumed to be 'pt'). See `Font.scaleToPxFrom` for the supported + * units (e.g., pt, em, %). + * @returns the number of points that is equivalent to `fontSize` + */ + static convertSizeToPointValue(fontSize = Font.SIZE) { + var _a; + if (typeof fontSize === 'number') { + // Assume the numeric fontSize is specified in pt. + return fontSize; + } + else { + const value = parseFloat(fontSize); + if (isNaN(value)) { + return 0; + } + const unit = fontSize.replace(/[\d.\s]/g, '').toLowerCase(); // Extract the unit by removing all numbers, dots, spaces. + const conversionFactor = ((_a = Font.scaleToPxFrom[unit]) !== null && _a !== void 0 ? _a : 1) / Font.scaleToPxFrom.pt; + return value * conversionFactor; + } + } + /** + * @param f + * @param size + * @param weight + * @param style + * @returns the `size` field will include the units (e.g., '12pt', '16px'). + */ + static validate(f, size, weight, style) { + // If f is a string but all other arguments are undefined, we assume that + // f is CSS font shorthand (e.g., 'italic bold 10pt Arial'). + if (typeof f === 'string' && size === undefined && weight === undefined && style === undefined) { + return Font.fromCSSString(f); + } + let family; + if (typeof f === 'object') { + // f is a FontInfo object, so we extract its fields. + family = f.family; + size = f.size; + weight = f.weight; + style = f.style; + } + else { + // f is a string representing the font family name or undefined. + family = f; + } + family = family !== null && family !== void 0 ? family : Font.SANS_SERIF; + size = size !== null && size !== void 0 ? size : Font.SIZE + 'pt'; + weight = weight !== null && weight !== void 0 ? weight : FontWeight.NORMAL; + style = style !== null && style !== void 0 ? style : FontStyle.NORMAL; + if (weight === '') { + weight = FontWeight.NORMAL; + } + if (style === '') { + style = FontStyle.NORMAL; + } + // If size is a number, we assume the unit is `pt`. + if (typeof size === 'number') { + size = `${size}pt`; + } + // If weight is a number (e.g., 900), turn it into a string representation of that number. + if (typeof weight === 'number') { + weight = weight.toString(); + } + // At this point, `family`, `size`, `weight`, and `style` are all strings. + return { family, size, weight, style }; + } + /** + * @param cssFontShorthand a string formatted as CSS font shorthand (e.g., 'italic bold 15pt Arial'). + */ + static fromCSSString(cssFontShorthand) { + // Let the browser parse this string for us. + // First, create a span element. + // Then, set its style.font and extract it back out. + if (!fontParser) { + fontParser = document.createElement('span'); + } + fontParser.style.font = cssFontShorthand; + const { fontFamily, fontSize, fontWeight, fontStyle } = fontParser.style; + return { family: fontFamily, size: fontSize, weight: fontWeight, style: fontStyle }; + } + /** + * @returns a CSS font shorthand string of the form `italic bold 16pt Arial`. + */ + static toCSSString(fontInfo) { + var _a; + if (!fontInfo) { + return ''; + } + let style; + const st = fontInfo.style; + if (st === FontStyle.NORMAL || st === '' || st === undefined) { + style = ''; // no space! Omit the style section. + } + else { + style = st.trim() + ' '; + } + let weight; + const wt = fontInfo.weight; + if (wt === FontWeight.NORMAL || wt === '' || wt === undefined) { + weight = ''; // no space! Omit the weight section. + } + else if (typeof wt === 'number') { + weight = wt + ' '; + } + else { + weight = wt.trim() + ' '; + } + let size; + const sz = fontInfo.size; + if (sz === undefined) { + size = Font.SIZE + 'pt '; + } + else if (typeof sz === 'number') { + size = sz + 'pt '; + } + else { + // size is already a string. + size = sz.trim() + ' '; + } + const family = (_a = fontInfo.family) !== null && _a !== void 0 ? _a : Font.SANS_SERIF; + return `${style}${weight}${size}${family}`; + } + /** + * @param fontSize a number representing a font size, or a string font size with units. + * @param scaleFactor multiply the size by this factor. + * @returns size * scaleFactor (e.g., 16pt * 3 = 48pt, 8px * 0.5 = 4px, 24 * 2 = 48). + * If the fontSize argument was a number, the return value will be a number. + * If the fontSize argument was a string, the return value will be a string. + */ + static scaleSize(fontSize, scaleFactor) { + if (typeof fontSize === 'number') { + return (fontSize * scaleFactor); + } + else { + const value = parseFloat(fontSize); + const unit = fontSize.replace(/[\d.\s]/g, ''); // Remove all numbers, dots, spaces. + return `${value * scaleFactor}${unit}`; + } + } + /** + * @param weight a string (e.g., 'bold') or a number (e.g., 600 / semi-bold in the OpenType spec). + * @returns true if the font weight indicates bold. + */ + static isBold(weight) { + if (!weight) { + return false; + } + else if (typeof weight === 'number') { + return weight >= 600; + } + else { + // a string can be 'bold' or '700' + const parsedWeight = parseInt(weight, 10); + if (isNaN(parsedWeight)) { + return weight.toLowerCase() === 'bold'; + } + else { + return parsedWeight >= 600; + } + } + } + /** + * @param style + * @returns true if the font style indicates 'italic'. + */ + static isItalic(style) { + if (!style) { + return false; + } + else { + return style.toLowerCase() === FontStyle.ITALIC; + } + } + /** + * @param fontName + * @param woffURL The absolute or relative URL to the woff file. + * @param includeWoff2 If true, we assume that a woff2 file is in + * the same folder as the woff file, and will append a `2` to the url. + */ + // Support distributions of the typescript compiler that do not yet include the FontFace API declarations. + // eslint-disable-next-line + // @ts-ignore + static loadWebFont(fontName, woffURL, includeWoff2 = true) { + return __awaiter(this, void 0, void 0, function* () { + const woff2URL = includeWoff2 ? `url(${woffURL}2) format('woff2'), ` : ''; + const woff1URL = `url(${woffURL}) format('woff')`; + const woffURLs = woff2URL + woff1URL; + // eslint-disable-next-line + // @ts-ignore + const fontFace = new FontFace(fontName, woffURLs); + yield fontFace.load(); + // eslint-disable-next-line + // @ts-ignore + document.fonts.add(fontFace); + return fontFace; + }); + } + /** + * Load the web fonts that are used by ChordSymbol. For example, `flow.html` calls: + * `await Vex.Flow.Font.loadWebFonts();` + * Alternatively, you may load web fonts with a stylesheet link (e.g., from Google Fonts), + * and a @font-face { font-family: ... } rule in your CSS. + * If you do not load either of these fonts, ChordSymbol will fall back to Times or Arial, + * depending on the current music engraving font. + * + * You can customize `Font.WEB_FONT_HOST` and `Font.WEB_FONT_FILES` to load different fonts + * for your app. + */ + static loadWebFonts() { + return __awaiter(this, void 0, void 0, function* () { + const host = Font.WEB_FONT_HOST; + const files = Font.WEB_FONT_FILES; + for (const fontName in files) { + const fontPath = files[fontName]; + Font.loadWebFont(fontName, host + fontPath); + } + }); + } + static loadTextFonts() { + // + } + /** + * @param fontName + * @param data optionally set the Font object's `.data` property. + * This is usually done when setting up a font for the first time. + * @param metrics optionally set the Font object's `.metrics` property. + * This is usually done when setting up a font for the first time. + * @returns a Font object with the given `fontName`. + * Reuse an existing Font object if a matching one is found. + */ + static load(fontName, data, metrics) { + let font = Fonts[fontName]; + if (!font) { + font = new Font(fontName); + Fonts[fontName] = font; + } + if (data) { + font.setData(data); + } + if (metrics) { + font.setMetrics(metrics); + } + return font; + } + getName() { + return this.name; + } + getData() { + return (0,_util__WEBPACK_IMPORTED_MODULE_0__.defined)(this.data, 'FontError', 'Missing font data'); + } + getMetrics() { + return (0,_util__WEBPACK_IMPORTED_MODULE_0__.defined)(this.metrics, 'FontError', 'Missing metrics'); + } + setData(data) { + this.data = data; + } + setMetrics(metrics) { + this.metrics = metrics; + } + hasData() { + return this.data !== undefined; + } + getResolution() { + return this.getData().resolution; + } + getGlyphs() { + return this.getData().glyphs; + } + /** + * Use the provided key to look up a value in this font's metrics file (e.g., bravura_metrics.ts, petaluma_metrics.ts). + * @param key is a string separated by periods (e.g., stave.endPaddingMax, clef.lineCount.'5'.shiftY). + * @param defaultValue is returned if the lookup fails. + * @returns the retrieved value (or `defaultValue` if the lookup fails). + */ + // eslint-disable-next-line + lookupMetric(key, defaultValue) { + const keyParts = key.split('.'); + // Start with the top level font metrics object, and keep looking deeper into the object (via each part of the period-delimited key). + let currObj = this.getMetrics(); + for (let i = 0; i < keyParts.length; i++) { + const keyPart = keyParts[i]; + const value = currObj[keyPart]; + if (value === undefined) { + // If the key lookup fails, we fall back to the defaultValue. + return defaultValue; + } + // The most recent lookup succeeded, so we drill deeper into the object. + currObj = value; + } + // After checking every part of the key (i.e., the loop completed), return the most recently retrieved value. + return currObj; + } + /** For debugging. */ + toString() { + return '[' + this.name + ' Font]'; + } +} +////////////////////////////////////////////////////////////////////////////////////////////////// +// STATIC MEMBERS +/** Default sans-serif font family. */ +Font.SANS_SERIF = 'Arial, sans-serif'; +/** Default serif font family. */ +Font.SERIF = 'Times New Roman, serif'; +/** Default font size in `pt`. */ +Font.SIZE = 10; +// CSS Font Sizes: 36pt == 48px == 3em == 300% == 0.5in +/** Given a length (for units: pt, px, em, %, in, mm, cm) what is the scale factor to convert it to px? */ +Font.scaleToPxFrom = { + pt: 4 / 3, + px: 1, + em: 16, + '%': 4 / 25, + in: 96, + mm: 96 / 25.4, + cm: 96 / 2.54, +}; +/** + * Customize this field to specify a different CDN for delivering web fonts. + * Alternative: https://cdn.jsdelivr.net/npm/vexflow-fonts@1.0.3/ + * Or you can use your own host. + */ +Font.WEB_FONT_HOST = 'https://unpkg.com/vexflow-fonts@1.0.3/'; +/** + * These font files will be loaded from the CDN specified by `Font.WEB_FONT_HOST` when + * `await Font.loadWebFonts()` is called. Customize this field to specify a different + * set of fonts to load. See: `Font.loadWebFonts()`. + */ +Font.WEB_FONT_FILES = { + 'Roboto Slab': 'robotoslab/RobotoSlab-Medium_2.001.woff', + PetalumaScript: 'petaluma/PetalumaScript_1.10_FS.woff', +}; + + +/***/ }), + +/***/ "./src/fonts/bravura_glyphs.ts": +/*!*************************************!*\ + !*** ./src/fonts/bravura_glyphs.ts ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "BravuraFont": () => (/* binding */ BravuraFont) +/* harmony export */ }); +const BravuraFont = { + glyphs: { + bracketTop: { + x_min: 0, + x_max: 469, + y_min: 0, + y_max: 295, + ha: 295, + o: 'm 0 0 l 180 0 b 674 390 410 43 616 150 b 675 405 675 396 675 400 b 664 425 675 416 671 422 b 628 405 651 425 635 415 b 157 179 613 389 432 199 l 12 179 b 0 168 3 179 0 177 z', + }, + bracketBottom: { + x_min: 0, + x_max: 469, + y_min: -295, + y_max: 0, + ha: 295, + o: 'm 0 -168 b 12 -179 0 -177 3 -179 l 157 -179 b 628 -405 432 -199 613 -389 b 664 -425 635 -415 651 -425 b 675 -405 671 -422 675 -416 b 674 -390 675 -400 675 -396 b 180 0 616 -150 410 -43 l 0 0 z', + }, + barlineTick: { + x_min: 0, + x_max: 36, + y_min: 868, + y_max: 1120, + ha: 252, + o: 'm 52 1250 l 52 1613 l 0 1613 l 0 1250 z', + }, + breathMarkTick: { + x_min: 0, + x_max: 500, + y_min: 0, + y_max: 502, + ha: 502, + o: 'm 9 367 b 0 374 6 372 3 374 b 9 334 0 367 0 343 b 179 19 40 312 164 121 b 192 0 179 3 186 0 b 210 19 197 0 207 6 b 698 701 245 197 507 658 b 720 714 714 704 720 711 b 698 723 720 720 711 723 b 197 186 455 714 210 202 b 186 176 194 179 189 176 b 176 186 179 176 176 186 b 9 367 143 266 27 359 z', + }, + segno: { + x_min: 4, + x_max: 550, + y_min: -27, + y_max: 759, + ha: 786, + o: 'm 194 958 b 217 939 203 958 213 955 l 220 929 b 325 805 230 890 252 805 b 425 901 384 805 425 840 b 413 969 425 923 420 946 b 220 1060 390 1035 294 1060 b 6 793 120 1060 6 936 b 29 687 6 759 13 723 b 295 449 75 582 284 454 b 304 438 301 446 304 444 b 295 415 304 432 301 425 b 78 22 285 395 78 22 b 73 3 75 16 73 9 b 114 -39 73 -20 91 -39 b 150 -17 128 -39 143 -30 b 377 395 150 -17 373 386 b 395 402 377 393 389 402 b 704 176 416 397 704 312 b 621 75 704 120 670 82 l 616 73 b 562 138 586 73 562 94 l 562 154 b 485 249 562 209 526 249 b 468 246 480 249 474 248 b 366 153 415 233 366 210 b 540 -12 366 65 455 -12 b 600 -1 559 -12 579 -9 b 792 251 716 37 792 131 b 789 292 792 264 791 278 b 523 588 768 451 540 579 b 498 611 505 598 498 603 b 501 619 498 613 500 616 b 732 1032 508 631 732 1032 b 737 1053 736 1040 737 1045 b 697 1093 737 1076 719 1093 b 661 1073 683 1093 668 1086 b 423 647 661 1073 432 660 b 410 635 419 639 416 635 b 396 639 406 635 402 636 b 128 792 383 644 166 727 b 108 868 120 808 108 838 b 186 958 108 907 125 948 z m 598 671 b 680 589 598 626 635 589 b 762 671 726 589 762 626 b 680 753 762 717 726 753 b 598 671 635 753 598 717 z m 202 380 b 120 462 202 425 166 462 b 37 380 75 462 37 425 b 120 298 37 334 75 298 b 202 380 166 298 202 334 z', + }, + coda: { + x_min: -4, + x_max: 955, + y_min: -158, + y_max: 898, + ha: 1056, + o: 'm 1349 576 l 1178 576 b 729 1083 1164 847 962 1064 l 729 1269 b 694 1293 729 1287 713 1293 b 660 1269 675 1293 660 1287 l 660 1083 b 210 576 426 1064 226 848 l 20 576 b -6 541 0 576 -6 560 b 20 507 -6 523 0 507 l 210 507 b 660 0 226 238 426 19 l 660 -202 b 694 -228 660 -222 675 -228 b 729 -202 713 -228 729 -222 l 729 0 b 1178 507 962 19 1164 238 l 1349 507 b 1375 541 1369 507 1375 523 b 1349 576 1375 560 1369 576 z m 940 576 l 729 576 l 729 1002 b 940 576 930 985 940 809 z m 660 1002 l 660 576 l 455 576 b 660 1002 455 809 455 985 z m 455 507 l 660 507 l 660 69 b 455 507 474 91 456 285 z m 729 69 l 729 507 l 940 507 b 729 69 936 287 909 91 z', + }, + gClef: { + x_min: 0, + x_max: 671, + y_min: -658, + y_max: 1098, + ha: 1756, + o: 'm 541 598 b 550 625 539 615 541 616 b 824 1174 706 770 824 953 b 730 1509 824 1299 789 1423 b 655 1581 708 1541 671 1581 b 562 1512 635 1581 590 1544 b 420 1064 455 1394 420 1214 b 441 828 420 981 431 887 b 428 793 444 811 445 808 b 0 125 220 622 0 416 b 524 -363 0 -125 171 -363 b 624 -354 557 -363 595 -360 b 645 -367 639 -351 642 -350 b 684 -657 662 -464 684 -589 b 455 -896 684 -870 540 -896 b 340 -854 377 -896 340 -873 b 386 -829 340 -844 353 -840 b 482 -694 431 -816 482 -778 b 344 -547 482 -615 432 -547 b 190 -713 248 -547 190 -624 b 464 -948 190 -806 246 -948 b 747 -660 560 -948 747 -904 b 706 -351 747 -577 721 -441 b 724 -327 703 -334 704 -336 b 966 16 870 -269 966 -147 b 619 363 966 200 831 363 b 577 389 582 363 582 363 z m 677 1358 b 763 1240 724 1358 763 1319 b 513 851 763 1080 626 950 b 494 863 503 842 497 844 b 485 995 488 900 485 949 b 677 1358 485 1220 589 1358 z m 520 377 b 498 343 524 350 524 351 b 289 63 372 300 289 186 b 455 -192 289 -66 357 -158 b 494 -200 467 -196 484 -200 b 511 -184 505 -200 511 -193 b 490 -166 511 -174 500 -170 b 386 -12 429 -140 386 -78 b 530 157 386 71 442 132 b 559 145 553 163 556 161 l 631 -284 b 611 -304 634 -300 632 -300 b 530 -311 588 -308 559 -311 b 115 29 278 -311 115 -171 b 249 363 115 114 130 228 b 469 567 336 459 402 513 b 490 562 484 579 487 577 z m 619 148 b 635 168 616 166 618 170 b 848 -66 752 158 848 60 b 713 -271 848 -157 793 -230 b 690 -262 696 -279 693 -279 z', + }, + cClef: { + x_min: 0, + x_max: 699, + y_min: -506, + y_max: 506, + ha: 1012, + o: 'm 331 694 b 301 724 331 714 321 724 l 300 724 b 269 694 279 724 269 714 l 269 -694 b 300 -724 269 -714 279 -724 l 301 -724 b 331 -694 321 -724 331 -714 l 331 -63 b 344 -55 331 -52 338 -53 b 472 -265 382 -65 442 -102 b 500 -301 477 -288 485 -301 b 530 -262 516 -301 523 -287 b 684 -128 549 -199 582 -128 b 804 -409 778 -128 804 -220 b 651 -683 804 -598 770 -683 b 528 -644 631 -683 528 -674 b 567 -622 528 -636 552 -628 b 625 -528 596 -612 625 -583 b 527 -429 625 -465 583 -429 b 416 -547 465 -429 416 -471 b 667 -729 416 -638 495 -729 b 1007 -413 903 -729 1007 -563 b 706 -76 1007 -215 897 -76 b 618 -89 664 -76 636 -84 b 576 -88 603 -94 589 -96 b 524 0 556 -75 524 -29 b 576 88 524 29 556 75 b 618 89 589 96 603 94 b 706 76 636 84 664 76 b 1007 413 897 76 1007 215 b 667 729 1007 563 903 729 b 416 547 495 729 416 638 b 527 429 416 471 465 429 b 625 528 583 429 625 465 b 567 622 625 583 596 612 b 528 644 552 628 528 636 b 651 683 528 674 631 683 b 804 409 770 683 804 598 b 684 128 804 220 778 128 b 530 262 582 128 549 199 b 500 301 523 287 516 301 b 472 265 485 301 477 288 b 344 55 442 102 382 65 b 331 63 338 53 331 52 z m 30 724 b 0 694 10 724 0 714 l 0 -694 b 30 -724 0 -714 10 -724 l 154 -724 b 184 -694 174 -724 184 -714 l 184 694 b 154 724 184 714 174 724 z', + }, + fClef: { + x_min: -5, + x_max: 684, + y_min: -635, + y_max: 262, + ha: 897, + o: 'm 363 377 b 0 56 112 377 0 194 b 177 -158 0 -59 60 -158 b 330 -6 268 -158 330 -95 b 192 144 330 86 262 144 b 120 134 153 144 138 134 b 96 160 101 134 96 145 b 330 323 96 217 183 323 b 549 -53 482 323 549 173 b 14 -871 549 -455 350 -680 b -7 -897 1 -878 -7 -886 b 12 -914 -7 -906 -1 -914 b 36 -907 19 -914 27 -912 b 765 -40 390 -734 765 -478 b 363 377 765 210 612 377 z m 906 259 b 827 180 861 259 827 225 b 906 101 827 135 861 101 b 985 180 950 101 985 135 b 906 259 985 225 950 259 z m 907 -102 b 829 -180 863 -102 829 -135 b 907 -258 829 -225 863 -258 b 985 -180 952 -258 985 -225 b 907 -102 985 -135 952 -102 z', + }, + unpitchedPercussionClef1: { + x_min: 0, + x_max: 382, + y_min: -250, + y_max: 250, + ha: 500, + o: 'm 230 -338 l 230 338 b 210 360 230 350 222 360 l 20 360 b 0 338 9 360 0 350 l 0 -338 b 20 -360 0 -350 9 -360 l 210 -360 b 230 -338 222 -360 230 -350 z m 550 338 b 530 360 550 350 541 360 l 340 360 b 320 338 328 360 320 350 l 320 -338 b 340 -360 320 -350 328 -360 l 530 -360 b 550 -338 541 -360 550 -350 z', + }, + '6stringTabClef': { + x_min: -3, + x_max: 408, + y_min: -748, + y_max: 764, + ha: 1512, + o: 'm 557 1024 l 557 1100 l 26 1100 l 26 1024 l 249 1024 l 249 422 l 336 422 l 336 1024 z m 588 -328 l 350 348 l 238 348 l -4 -328 l 88 -328 l 160 -125 l 420 -125 l 491 -328 z m 397 -52 l 181 -52 l 292 256 z m 544 -883 b 420 -719 544 -802 507 -752 b 514 -572 482 -690 514 -639 b 314 -399 514 -472 442 -399 l 39 -399 l 39 -1077 l 344 -1077 b 544 -883 467 -1077 544 -995 z m 428 -583 b 292 -691 428 -652 389 -691 l 125 -691 l 125 -475 l 292 -475 b 428 -583 389 -475 428 -514 z m 458 -884 b 337 -1001 458 -949 418 -1001 l 125 -1001 l 125 -768 l 337 -768 b 458 -884 418 -768 458 -818 z', + }, + timeSig0: { + x_min: 20, + x_max: 450, + y_min: -250, + y_max: 251, + ha: 501, + o: 'm 648 0 b 338 361 648 200 510 361 b 29 0 167 361 29 200 b 338 -360 29 -199 167 -360 b 648 0 510 -360 648 -199 z m 338 317 b 446 10 397 317 446 180 b 338 -295 446 -158 397 -295 b 230 10 278 -295 230 -158 b 338 317 230 180 278 317 z', + }, + timeSig1: { + x_min: 20, + x_max: 314, + y_min: -250, + y_max: 251, + ha: 501, + o: 'm 35 19 b 29 0 35 19 29 10 b 45 -20 29 -7 33 -16 b 58 -23 50 -22 56 -23 b 78 -10 72 -23 78 -10 b 156 117 78 -10 140 89 b 170 131 161 127 167 131 b 179 111 176 131 179 120 l 179 -261 b 115 -315 179 -294 145 -315 b 91 -337 105 -315 91 -320 b 122 -360 91 -353 104 -360 l 429 -360 b 452 -337 452 -360 452 -337 b 431 -315 452 -337 452 -315 b 384 -265 410 -315 384 -289 l 384 328 b 356 361 384 351 376 360 b 281 356 336 361 300 356 b 206 360 253 356 228 357 b 199 361 203 360 200 361 b 173 334 184 361 179 347 z', + }, + timeSig2: { + x_min: 20, + x_max: 426, + y_min: -257, + y_max: 254, + ha: 511, + o: 'm 606 -131 b 589 -111 606 -114 599 -111 b 570 -127 577 -111 573 -117 l 569 -128 b 513 -192 554 -164 543 -192 b 488 -187 505 -192 498 -190 b 445 -171 469 -180 459 -179 b 289 -137 416 -160 348 -137 b 236 -145 271 -137 252 -140 b 422 -42 268 -94 390 -50 b 613 147 523 -14 613 27 b 330 366 613 300 464 366 b 69 275 229 366 140 357 b 29 170 45 245 29 209 b 42 108 29 150 33 130 b 160 29 63 63 108 29 b 261 156 248 29 261 120 b 161 275 261 242 161 246 b 275 330 164 295 190 330 b 405 192 403 330 405 233 b 193 -102 405 60 297 -39 b 33 -317 114 -153 58 -223 l 32 -321 b 69 -370 32 -340 48 -370 b 203 -282 101 -370 118 -282 b 410 -360 261 -282 282 -360 b 606 -131 472 -360 583 -354 z', + }, + timeSig3: { + x_min: 20, + x_max: 401, + y_min: -251, + y_max: 249, + ha: 500, + o: 'm 307 357 b 301 357 305 357 304 357 l 291 359 b 285 359 289 359 287 359 b 37 200 161 359 37 276 b 154 84 37 153 65 89 l 161 84 b 256 177 225 84 256 130 l 256 189 b 209 248 252 242 216 245 b 180 268 202 251 180 248 l 180 274 b 240 310 183 298 228 310 b 374 199 363 310 374 233 l 374 189 b 199 36 374 82 289 40 b 164 12 184 35 164 27 b 200 -6 164 -6 189 -6 b 379 -137 366 -6 379 -118 b 269 -307 379 -289 301 -307 b 256 -305 264 -307 258 -305 b 216 -282 245 -304 217 -304 l 216 -275 b 249 -180 216 -243 248 -222 b 145 -76 249 -120 207 -76 b 130 -78 140 -76 135 -76 b 60 -115 105 -82 78 -96 b 29 -203 36 -137 29 -171 b 275 -361 32 -315 134 -359 l 288 -361 b 577 -161 431 -361 577 -288 l 577 -151 b 537 -50 575 -109 564 -82 b 503 -20 528 -39 517 -29 l 472 -3 l 425 10 b 410 17 418 12 413 12 b 409 24 409 20 409 22 b 415 37 409 30 410 36 b 459 50 431 42 446 43 b 547 181 517 78 547 115 b 307 357 547 314 367 353 z', + }, + timeSig4: { + x_min: 20, + x_max: 450, + y_min: -250, + y_max: 251, + ha: 501, + o: 'm 521 -107 l 521 202 b 504 226 521 213 520 226 b 475 213 491 226 484 223 l 338 48 b 325 14 333 40 325 32 l 325 -107 l 131 -107 b 481 336 246 -9 477 318 l 482 340 b 461 361 482 353 472 361 b 363 359 448 361 389 359 b 261 361 337 359 272 361 b 228 334 248 361 228 357 b 43 -105 228 156 86 -45 l 35 -117 b 35 -118 35 -117 35 -118 l 33 -120 b 29 -137 30 -127 29 -132 b 58 -161 29 -151 40 -161 l 325 -161 l 325 -252 b 268 -302 325 -291 294 -302 b 235 -330 245 -302 235 -315 b 262 -360 235 -344 240 -360 l 569 -360 b 598 -330 583 -360 598 -350 b 566 -301 598 -310 580 -301 b 521 -246 552 -301 521 -292 l 521 -161 l 626 -161 b 648 -134 641 -161 648 -151 b 626 -107 648 -117 642 -107 z', + }, + timeSig5: { + x_min: 20, + x_max: 383, + y_min: -251, + y_max: 246, + ha: 497, + o: 'm 109 85 b 117 179 109 85 115 166 b 138 197 118 190 125 197 l 144 197 b 285 184 158 194 226 184 b 492 323 485 184 492 300 b 472 353 492 341 488 353 b 295 340 454 353 341 340 b 101 354 249 340 125 351 b 66 330 75 354 68 341 l 50 10 l 50 7 b 79 -14 50 -12 65 -14 b 111 14 94 -14 95 -1 b 209 62 125 29 160 62 b 357 -125 258 62 357 35 b 235 -304 357 -284 272 -304 b 202 -300 223 -304 212 -304 b 184 -279 194 -295 186 -289 b 202 -259 184 -269 194 -264 b 256 -163 235 -239 256 -203 b 144 -50 256 -99 206 -50 b 30 -157 66 -50 35 -107 b 29 -183 29 -166 29 -174 b 284 -361 29 -302 107 -361 b 552 -125 456 -361 552 -255 b 314 112 552 6 445 112 b 122 71 230 112 168 98 b 115 69 120 69 117 69 b 109 79 109 69 109 75 z', + }, + timeSig6: { + x_min: 20, + x_max: 414, + y_min: -249, + y_max: 251, + ha: 500, + o: 'm 439 120 b 554 229 500 120 554 167 b 553 245 554 235 554 239 b 348 361 539 337 426 361 b 85 209 239 360 137 307 b 29 4 53 148 29 72 l 29 -1 b 73 -200 30 -68 42 -143 b 324 -359 132 -307 203 -359 b 513 -307 389 -359 461 -348 b 596 -137 563 -266 596 -202 b 379 72 596 -24 490 72 b 248 22 333 72 285 55 b 239 19 245 19 242 19 b 226 53 230 19 226 30 b 346 327 230 320 315 327 b 393 305 374 327 393 320 b 357 251 393 285 366 268 b 347 209 350 238 347 223 b 369 150 347 187 354 166 b 439 120 379 131 420 120 z m 320 3 b 405 -158 366 3 405 -69 b 320 -320 405 -248 366 -320 b 236 -158 274 -320 236 -248 b 320 3 236 -69 274 3 z', + }, + timeSig7: { + x_min: 20, + x_max: 421, + y_min: -250, + y_max: 249, + ha: 499, + o: 'm 606 294 b 582 351 606 333 606 351 b 552 336 580 351 557 346 b 485 236 541 318 521 236 b 262 359 449 236 382 359 b 137 307 179 359 157 325 b 98 281 117 288 108 282 b 60 315 86 281 68 301 b 43 325 58 321 50 325 b 29 308 36 325 29 321 l 29 71 b 45 48 29 71 30 48 b 66 76 56 48 60 60 b 164 196 81 112 99 196 b 374 88 222 196 291 88 b 446 118 415 88 435 109 b 459 124 451 121 456 124 b 469 111 465 124 468 120 b 272 -112 469 71 359 -10 b 173 -315 217 -176 173 -259 b 200 -360 173 -346 173 -360 b 294 -347 226 -360 258 -347 b 412 -360 330 -347 397 -360 b 435 -307 426 -360 435 -348 b 606 288 435 -66 606 140 z', + }, + timeSig8: { + x_min: 20, + x_max: 416, + y_min: -259, + y_max: 259, + ha: 518, + o: 'm 481 52 b 567 204 533 85 567 132 b 317 373 567 351 356 373 b 36 176 150 373 36 297 b 161 -16 36 76 92 23 b 29 -190 86 -52 29 -99 b 301 -373 29 -315 158 -373 b 599 -117 445 -373 599 -311 b 481 52 599 -30 549 17 z m 406 85 b 168 240 291 125 168 150 b 314 331 168 301 251 331 b 482 207 360 331 482 308 b 406 85 482 150 454 112 z m 295 -325 b 111 -183 199 -325 111 -276 b 225 -48 111 -125 161 -72 b 436 -219 330 -94 436 -124 b 295 -325 436 -276 392 -325 z', + }, + timeSig9: { + x_min: 20, + x_max: 414, + y_min: -249, + y_max: 251, + ha: 500, + o: 'm 186 -117 b 71 -226 125 -117 71 -164 b 72 -242 71 -232 71 -236 b 276 -359 86 -334 199 -359 b 540 -206 386 -357 488 -304 b 596 -1 572 -145 596 -69 l 596 4 b 552 203 595 71 583 145 b 301 361 492 310 422 361 b 112 310 236 361 164 351 b 29 140 62 269 29 204 b 246 -69 29 27 135 -69 b 377 -19 292 -69 340 -52 b 386 -16 380 -16 383 -16 b 399 -50 395 -16 399 -27 b 279 -324 395 -317 310 -324 b 232 -302 251 -324 232 -317 b 268 -248 232 -282 259 -265 b 278 -206 275 -235 278 -220 b 256 -147 278 -184 271 -163 b 186 -117 246 -128 204 -117 z m 305 0 b 220 161 259 0 220 72 b 305 323 220 251 259 323 b 389 161 351 323 389 251 b 305 0 389 72 351 0 z', + }, + timeSigCommon: { + x_min: 5, + x_max: 424, + y_min: -249, + y_max: 251, + ha: 500, + o: 'm 336 361 b 7 -14 131 361 7 180 b 101 -262 7 -108 42 -190 b 321 -359 156 -328 235 -359 b 611 -88 573 -359 611 -130 b 589 -56 611 -56 595 -56 b 567 -82 577 -56 567 -58 b 363 -311 567 -268 409 -311 b 184 40 246 -311 184 -197 b 372 327 184 278 294 327 b 477 278 446 327 477 292 b 451 246 477 265 472 246 b 360 140 393 246 360 184 b 471 32 360 58 431 32 b 580 156 471 32 580 36 b 336 361 580 344 363 361 z', + }, + timeSigCutCommon: { + x_min: 0, + x_max: 418, + y_min: -359, + y_max: 361, + ha: 720, + o: 'm 573 -58 b 559 -82 567 -58 559 -60 b 354 -310 559 -266 400 -310 b 317 -305 340 -310 328 -308 b 302 -284 311 -304 302 -295 l 302 287 b 338 323 302 297 328 321 b 363 324 347 324 356 324 b 468 275 436 324 468 289 b 442 243 468 264 464 243 b 351 137 384 243 351 181 b 462 30 351 56 422 30 b 572 154 462 30 572 35 b 318 357 572 295 441 357 b 302 390 310 359 302 383 l 302 495 b 276 520 302 507 292 520 b 252 495 265 520 252 507 l 252 369 b 235 346 252 359 238 346 l 196 331 b 0 -14 66 275 0 122 b 225 -346 0 -150 86 -310 b 252 -382 235 -350 252 -369 l 252 -492 b 276 -517 252 -505 265 -517 b 302 -492 292 -517 302 -505 l 302 -379 b 318 -359 302 -370 308 -363 b 602 -85 563 -354 602 -130 b 579 -58 600 -58 586 -58 z m 252 -235 b 243 -252 252 -248 248 -252 b 236 -248 240 -252 238 -251 b 177 37 197 -193 177 -96 b 232 259 177 147 200 215 b 236 262 233 262 235 262 b 252 239 243 262 252 251 z', + }, + timeSigPlus: { + x_min: -1, + x_max: 499, + y_min: -250, + y_max: 250, + ha: 500, + o: 'm 432 53 b 413 79 420 53 413 65 l 413 340 b 392 360 413 350 405 360 l 325 360 b 305 340 312 360 305 350 l 305 79 b 284 53 305 66 292 53 l 19 53 b -1 33 9 53 -1 46 l -1 -33 b 19 -55 -1 -46 9 -55 l 284 -55 b 305 -75 298 -55 305 -68 l 305 -340 b 325 -360 305 -350 312 -360 l 392 -360 b 413 -340 405 -360 413 -350 l 413 -78 b 433 -55 413 -63 423 -55 l 698 -55 b 719 -33 708 -55 719 -46 l 719 33 b 698 53 719 46 708 53 z', + }, + timeSigPlusSmall: { + x_min: -1, + x_max: 255, + y_min: -133, + y_max: 123, + ha: 256, + o: 'm 220 20 b 210 33 215 20 210 26 l 210 166 b 200 177 210 171 206 177 l 166 177 b 156 166 160 177 156 171 l 156 33 b 145 20 156 27 150 20 l 10 20 b -1 10 4 20 -1 16 l -1 -24 b 10 -35 -1 -30 4 -35 l 145 -35 b 156 -46 153 -35 156 -42 l 156 -180 b 166 -192 156 -186 160 -192 l 200 -192 b 210 -180 206 -192 210 -186 l 210 -48 b 222 -35 210 -39 216 -35 l 356 -35 b 367 -24 361 -35 367 -30 l 367 10 b 356 20 367 16 361 20 z', + }, + timeSigMinus: { + x_min: 0, + x_max: 448, + y_min: -35, + y_max: 40, + ha: 75, + o: 'm 645 39 b 619 58 645 49 634 58 l 27 58 b 0 39 12 58 0 49 l 0 -32 b 27 -50 0 -42 12 -50 l 619 -50 b 645 -32 634 -50 645 -42 z', + }, + timeSigParensRight: { + x_min: 0, + x_max: 184, + y_min: -489, + y_max: 491, + ha: 980, + o: 'm 0 -696 b 3 -704 0 -698 1 -704 b 7 -703 4 -704 6 -704 b 265 1 187 -530 265 -282 b 12 701 265 289 187 531 b 4 707 12 701 6 707 b 0 696 1 707 0 703 l 0 665 b 4 644 0 665 0 651 b 167 1 112 503 167 315 b 6 -641 167 -311 109 -497 b 0 -658 3 -644 0 -651 z', + }, + timeSigParensRightSmall: { + x_min: 0, + x_max: 110, + y_min: -251, + y_max: 249, + ha: 500, + o: 'm 0 -356 b 3 -361 0 -357 1 -361 b 158 0 112 -272 158 -145 b 4 359 158 147 109 272 b 0 353 3 359 0 357 l 0 338 b 3 327 0 338 0 330 b 91 0 60 246 91 160 b 4 -328 91 -160 62 -249 b 0 -337 3 -330 0 -333 z', + }, + timeSigParensLeft: { + x_min: 0, + x_max: 184, + y_min: -489, + y_max: 491, + ha: 980, + o: 'm 265 -658 b 259 -641 265 -651 262 -644 b 98 1 156 -497 98 -311 b 261 644 98 315 153 503 b 265 665 265 651 265 665 l 265 696 b 261 707 265 703 264 707 b 253 701 259 707 253 701 b 0 1 78 531 0 289 b 258 -703 0 -282 78 -530 b 262 -704 259 -704 261 -704 b 265 -696 264 -704 265 -698 z', + }, + timeSigParensLeftSmall: { + x_min: 0, + x_max: 110, + y_min: -251, + y_max: 249, + ha: 500, + o: 'm 158 -337 b 154 -328 158 -333 156 -330 b 68 0 96 -249 68 -160 b 156 327 68 160 98 246 b 158 338 158 330 158 338 l 158 353 b 154 359 158 357 156 359 b 0 0 49 272 0 147 b 156 -361 0 -145 46 -272 b 158 -356 157 -361 158 -357 z', + }, + noteheadDoubleWhole: { + x_min: 0, + x_max: 599, + y_min: -155, + y_max: 155, + ha: 310, + o: 'm 13 223 b 0 212 4 223 0 217 l 0 -213 b 13 -223 0 -219 4 -223 l 32 -223 b 45 -213 39 -223 45 -219 l 45 212 b 32 223 45 217 39 223 z m 96 223 b 82 212 88 223 82 217 l 82 -213 b 96 -223 82 -219 88 -223 l 114 -223 b 128 -213 121 -223 128 -219 l 128 212 b 114 223 128 217 121 223 z m 747 223 b 733 212 740 223 733 217 l 733 -213 b 747 -223 733 -219 740 -223 l 766 -223 b 780 -213 773 -223 780 -219 l 780 212 b 766 223 780 217 773 223 z m 829 223 b 815 212 824 223 815 217 l 815 -213 b 829 -223 815 -219 824 -223 l 848 -223 b 863 -213 857 -223 863 -219 l 863 212 b 848 223 863 217 857 223 z m 438 180 b 130 1 248 180 130 101 b 423 -180 130 -92 210 -180 b 733 1 657 -180 733 -98 b 438 180 733 104 572 180 z m 469 -145 b 331 -71 409 -145 369 -112 b 284 58 305 -37 284 12 b 400 147 284 131 333 147 b 577 -45 498 147 577 42 b 469 -145 577 -115 533 -145 z', + }, + noteheadWhole: { + x_min: 0, + x_max: 422, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 311 180 b 0 3 120 180 0 101 b 297 -180 0 -94 82 -180 b 608 3 533 -180 608 -98 b 311 180 608 105 445 180 z m 160 91 b 274 148 176 141 229 148 b 452 -45 373 148 452 42 b 386 -141 452 -89 433 -130 b 341 -147 372 -145 356 -147 b 206 -72 289 -147 236 -112 b 156 56 177 -39 156 10 b 160 91 156 68 157 79 z', + }, + noteheadHalf: { + x_min: 0, + x_max: 295, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 140 -180 b 425 60 377 -180 425 13 b 282 180 425 134 366 180 b 0 -60 68 180 0 14 b 140 -180 0 -137 60 -180 z m 108 -125 b 50 -92 78 -125 60 -109 b 42 -63 46 -84 42 -73 b 318 121 42 7 251 121 b 372 91 346 121 361 108 b 380 63 376 82 380 73 b 108 -125 380 1 177 -125 z', + }, + noteheadBlack: { + x_min: 0, + x_max: 295, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 140 -180 b 425 60 268 -180 425 -62 b 285 180 425 134 367 180 b 0 -60 127 180 0 63 b 140 -180 0 -135 62 -180 z', + }, + noteheadXWhole: { + x_min: 0, + x_max: 377, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 272 -95 l 364 -171 b 384 -180 370 -177 377 -180 l 511 -180 b 543 -148 528 -180 543 -164 b 531 -124 543 -140 539 -131 l 412 0 l 531 124 b 541 148 539 131 541 140 b 513 180 541 164 528 180 l 384 180 b 364 171 377 180 370 177 l 272 94 l 179 171 b 158 180 173 177 166 180 l 30 180 b 0 148 16 180 0 164 b 12 124 0 140 4 131 l 132 0 l 12 -124 b 1 -148 4 -131 1 -140 b 32 -180 1 -164 14 -180 l 158 -180 b 179 -171 166 -180 173 -177 z m 386 -141 l 272 -45 l 157 -141 l 88 -141 l 245 0 l 88 141 l 157 141 l 272 45 l 386 141 l 456 141 l 300 0 l 456 -141 z', + }, + noteheadXHalf: { + x_min: 0, + x_max: 334, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 295 180 b 271 170 287 180 278 177 l 209 98 l 115 171 b 95 180 109 177 104 180 l 36 180 b 4 148 19 180 4 164 b 14 124 4 140 7 132 l 140 22 l 7 -127 b 0 -148 3 -131 0 -138 b 32 -180 0 -166 14 -180 l 184 -180 b 209 -170 193 -180 203 -177 l 271 -99 l 363 -171 b 384 -180 370 -176 377 -180 l 445 -180 b 478 -147 461 -180 478 -163 b 465 -125 478 -138 474 -131 l 341 -22 l 474 127 b 481 148 480 131 481 138 b 448 180 481 166 468 180 z m 36 148 l 95 148 l 233 33 l 334 148 l 410 148 l 274 -6 l 445 -148 l 384 -148 l 248 -35 l 147 -148 l 71 -148 l 206 4 z', + }, + noteheadXBlack: { + x_min: 0, + x_max: 290, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 410 -143 l 239 0 l 410 144 b 418 160 415 147 418 154 b 399 180 418 171 408 180 b 389 177 396 180 392 179 l 207 26 l 29 177 b 17 180 26 179 22 180 b 0 161 7 180 0 170 b 7 144 0 156 3 148 l 179 0 l 7 -143 b 0 -158 1 -147 0 -153 b 19 -180 0 -170 7 -180 b 29 -176 23 -180 26 -179 l 207 -24 l 389 -176 b 399 -180 392 -179 396 -180 b 418 -160 410 -180 418 -168 b 410 -143 418 -153 415 -147 z', + }, + noteheadCircleX: { + x_min: 0, + x_max: 249, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 179 180 b 0 0 81 180 0 99 b 179 -180 0 -99 81 -180 b 359 0 278 -180 359 -99 b 179 180 359 99 278 180 z m 261 112 l 180 30 l 98 112 b 179 138 121 128 148 138 b 261 112 210 138 238 128 z m 317 0 b 292 -82 317 -30 308 -59 l 209 1 l 291 84 b 317 0 307 60 317 30 z m 40 0 b 69 84 40 32 50 60 l 151 1 l 68 -84 b 40 0 49 -60 40 -30 z m 95 -111 l 180 -27 l 262 -111 b 179 -138 239 -128 210 -138 b 95 -111 148 -138 120 -128 z', + }, + noteheadTriangleUpWhole: { + x_min: 0, + x_max: 319, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 445 -180 b 459 -166 454 -180 459 -173 b 458 -158 459 -163 458 -160 l 239 173 b 228 180 238 177 233 180 b 216 173 225 180 219 177 l 1 -158 b 0 -166 1 -160 0 -163 b 14 -180 0 -173 6 -180 z m 170 -137 b 145 -96 157 -137 145 -109 b 228 108 145 -17 197 56 b 310 -98 259 55 310 -17 b 288 -137 310 -111 301 -137 z', + }, + noteheadTriangleUpHalf: { + x_min: 0, + x_max: 285, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 215 180 b 202 173 210 180 204 177 l 3 -157 b 0 -166 1 -160 0 -163 b 14 -180 0 -173 7 -180 l 396 -180 b 410 -166 406 -180 410 -173 b 409 -158 410 -163 410 -161 l 228 173 b 215 180 226 174 220 180 z m 246 -138 l 115 -138 l 232 76 l 297 -37 z', + }, + noteheadTriangleUpBlack: { + x_min: 0, + x_max: 293, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 422 -180 l 207 180 l 0 -180 z', + }, + noteheadDiamondWhole: { + x_min: 0, + x_max: 270, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 386 -23 b 389 -16 387 -20 389 -19 b 383 -7 389 -13 386 -9 l 130 179 b 122 180 128 180 125 180 b 115 177 120 180 117 180 l 3 23 b 0 17 1 20 0 19 b 4 7 0 16 3 10 l 258 -179 b 264 -180 261 -179 262 -180 b 272 -176 268 -180 271 -179 z m 66 40 b 62 48 65 42 62 45 l 109 111 b 112 112 109 112 111 112 b 118 111 115 112 117 111 l 320 -37 b 324 -46 323 -39 324 -42 b 275 -111 278 -111 276 -111 b 268 -108 272 -111 271 -109 z', + }, + noteheadDiamondHalf: { + x_min: 0, + x_max: 251, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 359 -7 b 361 0 360 -6 361 -3 b 359 7 361 3 360 4 l 189 177 b 180 180 186 179 183 180 b 174 177 179 180 176 179 l 4 7 b 0 0 1 4 0 3 b 4 -7 0 -3 1 -6 l 174 -177 b 180 -180 176 -180 179 -180 b 189 -177 183 -180 186 -180 z m 266 26 b 138 -71 266 -12 176 -71 b 96 -50 121 -71 108 -63 b 88 -24 89 -43 88 -32 b 215 73 88 13 177 73 b 266 26 238 73 266 50 z', + }, + noteheadDiamondBlack: { + x_min: 0, + x_max: 250, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 357 -6 b 360 1 359 -4 360 -1 b 357 9 360 4 359 7 l 189 177 b 180 180 187 179 184 180 b 171 177 177 180 173 179 l 3 9 b 0 1 0 6 0 4 b 4 -7 0 -1 1 -4 l 173 -177 b 180 -180 176 -180 177 -180 b 187 -177 181 -180 184 -180 z', + }, + noteheadSquareWhite: { + x_min: 0, + x_max: 313, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 451 -180 l 451 180 l 0 180 l 0 -180 z m 40 -138 l 40 140 l 410 140 l 410 -138 z', + }, + noteheadSquareBlack: { + x_min: 0, + x_max: 313, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 451 -180 l 451 180 l 0 180 l 0 -180 z', + }, + noteheadParenthesis: { + x_min: -73, + x_max: 368, + y_min: -180, + y_max: 182, + ha: 362, + o: 'm 52 -249 b -30 -144 3 -212 -14 -190 b -52 4 -45 -102 -52 -56 b 52 252 -52 118 -36 179 l 46 262 b -105 3 -49 197 -105 124 b 45 -259 -105 -109 -48 -200 z m 382 -259 b 530 3 474 -202 530 -108 b 379 262 530 122 474 200 l 373 252 b 478 4 462 180 478 118 b 456 -144 478 -56 471 -102 b 373 -249 439 -190 422 -212 z', + }, + noteheadParenthesisRight: { + x_min: -36, + x_max: 73, + y_min: -181, + y_max: 181, + ha: 362, + o: 'm -43 -261 b 105 1 49 -203 105 -109 b -46 261 105 121 49 199 l -52 251 b 53 3 37 179 53 117 b 32 -145 53 -58 46 -104 b -52 -251 14 -192 -3 -213 z', + }, + noteheadParenthesisLeft: { + x_min: 0, + x_max: 109, + y_min: -181, + y_max: 181, + ha: 362, + o: 'm 157 -251 b 75 -145 108 -213 91 -192 b 53 3 60 -104 53 -58 b 157 251 53 117 69 177 l 151 261 b 0 1 56 196 0 122 b 150 -261 0 -111 58 -202 z', + }, + augmentationDot: { + x_min: 0, + x_max: 100, + y_min: -50, + y_max: 50, + ha: 100, + o: 'm 144 0 b 72 72 144 40 112 72 b 0 0 32 72 0 40 b 72 -72 0 -40 32 -72 b 144 0 112 -72 144 -40 z', + }, + tremolo1: { + x_min: -150, + x_max: 150, + y_min: -93, + y_max: 94, + ha: 187, + o: 'm 216 -45 l 216 135 l -216 46 l -216 -134 z', + }, + flag8thUp: { + x_min: 0, + x_max: 264, + y_min: -810.1921176545985, + y_max: 9, + ha: 819.1921176545985, + o: 'm 343 -1138 b 380 -888 343 -1138 380 -1001 b 215 -395 380 -708 305 -539 b 58 -19 141 -281 81 -157 b 27 13 53 4 42 13 b 0 -9 12 13 0 9 l 0 -353 b 284 -688 95 -370 232 -566 b 318 -904 305 -737 318 -819 b 284 -1102 318 -969 308 -1037 b 279 -1123 281 -1110 279 -1117 b 302 -1165 279 -1146 294 -1159 b 343 -1138 311 -1171 336 -1162 z', + }, + flag8thDown: { + x_min: 0, + x_max: 306, + y_min: -14, + y_max: 808, + ha: 822, + o: 'm 346 1094 b 376 897 366 1034 376 962 b 318 642 376 812 340 691 b 0 340 265 521 193 405 l 0 1 b 23 -20 0 -13 12 -20 b 58 12 36 -20 55 -12 b 262 387 82 148 189 274 b 441 881 353 530 441 701 b 400 1142 441 994 412 1096 b 377 1164 396 1158 387 1164 b 346 1094 356 1164 331 1136 z', + }, + flag16thUp: { + x_min: 0, + x_max: 279, + y_min: -813, + y_max: 2, + ha: 815, + o: 'm 392 -1146 b 402 -988 397 -1139 402 -1057 l 402 -956 b 360 -783 402 -896 386 -837 b 359 -770 360 -779 359 -776 b 360 -760 359 -768 359 -765 b 396 -577 364 -752 396 -665 b 392 -526 396 -559 395 -543 b 236 -275 377 -428 340 -387 b 53 -16 158 -192 78 -168 b 24 3 50 0 33 3 b 0 -12 16 3 0 -1 l 0 -570 l 7 -570 b 298 -778 96 -573 199 -576 b 344 -992 331 -847 344 -917 b 333 -1120 344 -1034 340 -1077 b 331 -1133 331 -1126 331 -1129 b 363 -1171 331 -1152 343 -1171 b 392 -1146 373 -1171 383 -1165 z m 301 -661 b 223 -562 278 -625 253 -596 b 59 -331 156 -484 89 -449 b 58 -327 58 -330 58 -328 b 78 -312 58 -321 66 -312 l 89 -312 b 302 -464 177 -312 255 -393 b 341 -592 328 -501 341 -546 b 340 -621 341 -602 341 -611 b 330 -658 337 -632 337 -647 b 311 -667 328 -662 318 -667 b 301 -661 307 -667 304 -665 z', + }, + flag16thDown: { + x_min: 0, + x_max: 290.8951581511223, + y_min: -9, + y_max: 812.0064, + ha: 821.0064, + o: 'm 346 1132 b 312 768 367 1011 367 880 b 7 559 213 566 96 562 l 0 559 l 0 1 b 24 -13 0 -6 10 -13 b 53 6 35 -13 50 -10 b 406 516 88 228 372 289 b 410 567 409 531 410 549 b 374 750 410 655 379 742 b 373 760 373 753 373 756 b 374 773 373 766 374 769 b 405 1138 426 881 428 1022 b 370 1169 397 1171 387 1169 b 346 1132 353 1168 341 1156 z m 325 657 b 344 647 333 657 343 652 b 354 611 351 636 351 622 b 356 582 356 600 356 590 b 317 454 356 534 343 491 b 89 302 269 383 177 302 l 78 302 b 58 317 66 302 58 310 b 59 321 58 318 58 320 b 238 552 89 439 170 472 b 315 651 268 585 292 613 b 325 657 318 655 321 657 z', + }, + flag32ndUp: { + x_min: 0, + x_max: 261, + y_min: -812, + y_max: 149, + ha: 961, + o: 'm 374 -969 b 337 -806 372 -913 359 -858 b 336 -796 336 -804 336 -801 b 337 -788 336 -793 336 -791 b 370 -616 340 -778 370 -698 b 340 -482 370 -570 360 -524 b 369 -330 353 -445 369 -386 b 366 -289 369 -315 369 -302 b 220 -58 350 -202 317 -163 b 46 187 148 20 71 43 b 20 215 45 200 35 215 b 0 197 12 215 0 207 l 0 -609 l 7 -609 b 278 -802 91 -612 186 -615 b 323 -999 310 -865 323 -930 b 311 -1122 323 -1040 318 -1080 b 310 -1132 311 -1126 310 -1129 b 328 -1166 310 -1149 318 -1162 b 337 -1169 331 -1168 334 -1169 b 366 -1146 346 -1169 356 -1162 b 376 -1009 370 -1138 376 -1071 b 374 -969 376 -995 374 -982 z m 300 -261 b 321 -330 315 -289 321 -311 b 317 -360 321 -341 318 -350 b 300 -423 314 -374 307 -399 b 220 -334 279 -397 253 -370 b 56 -92 150 -256 79 -232 b 300 -261 135 -92 220 -127 z m 315 -657 b 308 -690 312 -668 312 -680 b 292 -698 307 -694 300 -698 b 282 -693 288 -698 284 -697 b 216 -608 261 -661 240 -636 l 209 -600 b 56 -390 147 -527 88 -495 b 73 -367 53 -380 60 -367 b 318 -622 189 -367 318 -505 b 315 -657 318 -634 317 -645 z', + }, + flag32ndDown: { + x_min: 0, + x_max: 273, + y_min: -172, + y_max: 812, + ha: 984, + o: 'm 393 973 b 333 1169 393 1002 383 1169 b 324 1168 330 1169 327 1169 b 304 1130 314 1164 304 1149 b 305 1120 304 1128 305 1125 b 334 962 317 1056 334 1011 b 289 821 334 922 323 880 b 0 619 180 625 88 622 l 0 -229 b 20 -248 0 -242 9 -248 b 48 -219 35 -248 46 -232 b 229 36 72 -69 154 -46 b 380 278 330 145 364 186 b 383 320 383 291 383 305 b 351 484 383 382 364 445 b 384 629 374 526 384 580 b 356 780 384 704 361 766 b 356 783 356 782 356 783 l 351 791 b 356 804 351 796 353 799 l 361 814 b 393 958 380 850 387 865 z m 56 386 b 217 609 86 501 153 533 b 292 706 246 642 269 670 b 304 711 295 710 300 711 b 321 703 311 711 320 707 b 328 670 325 693 325 681 b 331 634 330 658 331 645 b 82 367 331 516 199 367 l 75 367 b 56 386 62 367 56 379 z m 330 350 b 334 320 331 340 334 331 b 311 248 334 301 328 278 b 59 72 229 109 141 72 b 56 76 56 73 56 75 b 229 331 81 226 154 249 b 310 423 264 369 289 397 b 330 350 318 396 325 366 z', + }, + flag64thUp: { + x_min: 0, + x_max: 261, + y_min: -812, + y_max: 347, + ha: 1159, + o: 'm 374 -969 b 337 -806 372 -913 359 -858 b 336 -796 336 -804 336 -801 b 337 -788 336 -793 336 -791 b 370 -616 340 -778 370 -698 b 340 -482 370 -570 360 -524 b 369 -330 353 -445 369 -386 b 337 -203 369 -287 359 -242 b 369 -43 350 -167 369 -104 b 366 -4 369 -30 367 -17 b 220 228 350 84 317 122 b 46 472 148 305 71 328 b 20 500 45 485 32 500 b 0 482 10 500 0 492 l 0 -609 l 7 -609 b 278 -802 91 -612 186 -615 b 323 -999 310 -865 323 -930 b 311 -1122 323 -1040 318 -1080 b 310 -1132 311 -1126 310 -1129 b 328 -1166 310 -1149 318 -1162 b 337 -1169 331 -1168 334 -1169 b 366 -1146 346 -1169 356 -1162 b 376 -1009 370 -1138 376 -1071 b 374 -969 376 -995 374 -982 z m 300 24 b 321 -45 315 -4 321 -26 b 317 -75 321 -56 318 -65 l 298 -145 b 220 -58 278 -121 253 -94 b 58 187 148 20 82 43 b 56 193 58 189 58 192 b 300 24 138 193 220 157 z m 300 -261 b 321 -330 315 -289 321 -311 b 317 -360 321 -341 318 -350 b 300 -423 314 -374 307 -399 b 220 -334 279 -397 253 -370 b 56 -92 150 -256 79 -232 b 300 -261 135 -92 220 -127 z m 315 -657 b 308 -690 312 -668 312 -680 b 292 -698 307 -694 300 -698 b 282 -693 288 -698 284 -697 b 216 -608 261 -661 240 -636 l 209 -600 b 55 -386 147 -527 84 -497 b 73 -367 52 -376 63 -367 b 318 -622 189 -367 318 -505 b 315 -657 318 -634 317 -645 z', + }, + flag64thDown: { + x_min: 0, + x_max: 273, + y_min: -376, + y_max: 812, + ha: 1188, + o: 'm 393 973 b 333 1169 393 1002 383 1169 b 324 1168 330 1169 327 1169 b 304 1130 314 1164 304 1149 b 305 1120 304 1128 305 1125 b 334 962 317 1056 334 1011 b 289 821 334 922 323 880 b 0 619 180 625 88 622 l 0 -523 b 20 -541 0 -534 9 -541 b 48 -513 35 -541 46 -526 b 229 -258 72 -363 154 -340 b 380 -16 330 -148 364 -108 b 384 27 383 -1 384 13 b 351 189 384 88 366 151 b 380 278 366 216 374 243 b 383 320 383 291 383 305 b 351 484 383 382 364 445 b 384 629 374 526 384 580 b 356 780 384 704 361 766 b 356 783 356 782 356 783 l 351 791 b 356 804 351 796 353 799 l 361 814 b 393 958 380 850 387 865 z m 56 386 b 217 609 86 501 153 533 b 292 706 246 642 269 670 b 304 711 295 710 300 711 b 321 703 311 711 320 707 b 328 670 325 693 325 681 b 331 634 330 658 331 645 b 82 367 331 516 199 367 l 75 367 b 56 386 62 367 56 379 z m 330 350 b 334 320 331 340 334 331 b 311 248 334 301 328 278 b 59 72 229 109 141 72 b 56 76 56 73 56 75 b 229 331 81 226 154 249 b 310 423 264 369 289 397 b 330 350 318 396 325 366 z m 330 56 b 334 26 331 46 334 37 b 311 -46 334 7 328 -16 b 56 -222 229 -184 137 -222 b 229 36 75 -86 145 -55 b 311 128 264 73 289 102 z', + }, + flag128thUp: { + x_min: 0, + x_max: 261, + y_min: -812, + y_max: 533, + ha: 1345, + o: 'm 374 -969 b 337 -806 372 -913 359 -858 b 336 -796 336 -804 336 -801 b 337 -788 336 -793 336 -791 b 370 -616 340 -778 370 -698 b 340 -482 370 -570 360 -524 b 369 -330 353 -445 369 -386 b 337 -203 369 -287 359 -242 b 369 -43 350 -167 369 -104 b 366 -4 369 -30 367 -17 b 341 75 360 26 353 50 b 369 222 354 111 369 167 b 366 264 369 236 369 251 b 220 495 350 351 317 390 b 46 740 148 573 71 596 b 22 768 45 753 35 768 b 0 750 10 768 0 760 l 0 -609 l 7 -609 b 278 -802 91 -612 186 -615 b 323 -999 310 -865 323 -930 b 311 -1122 323 -1040 318 -1080 b 310 -1132 311 -1126 310 -1129 b 328 -1166 310 -1149 318 -1162 b 337 -1169 331 -1168 334 -1169 b 366 -1146 346 -1169 356 -1162 b 376 -1009 370 -1138 376 -1071 b 374 -969 376 -995 374 -982 z m 300 292 b 321 223 315 264 321 242 b 317 193 321 212 318 203 b 301 135 314 180 308 158 b 220 228 281 161 255 190 b 55 461 151 304 79 327 b 300 292 134 461 220 426 z m 300 24 b 321 -45 315 -4 321 -26 b 317 -75 321 -56 318 -65 l 298 -145 b 220 -58 278 -121 253 -94 b 56 187 148 20 81 43 b 55 193 56 189 56 192 b 300 24 137 193 220 157 z m 300 -261 b 321 -330 315 -289 321 -311 b 317 -360 321 -341 318 -350 b 300 -423 314 -374 307 -399 b 220 -334 279 -397 253 -370 b 56 -92 150 -256 79 -232 b 300 -261 135 -92 220 -127 z m 315 -657 b 308 -690 312 -668 312 -680 b 292 -698 307 -694 300 -698 b 282 -693 288 -698 284 -697 b 216 -608 261 -661 240 -636 l 209 -600 b 55 -386 147 -527 84 -497 b 73 -367 53 -376 62 -367 b 318 -622 189 -367 318 -505 b 315 -657 318 -634 317 -645 z', + }, + flag128thDown: { + x_min: 0, + x_max: 273, + y_min: -580, + y_max: 812, + ha: 1392, + o: 'm 393 973 b 333 1169 393 1002 383 1169 b 324 1168 330 1169 327 1169 b 304 1130 314 1164 304 1149 b 305 1120 304 1128 305 1125 b 334 962 317 1056 334 1011 b 289 821 334 922 323 880 b 0 619 180 625 88 622 l 0 -816 b 20 -835 0 -828 7 -835 b 48 -806 33 -835 46 -819 b 229 -552 72 -657 154 -634 b 380 -310 330 -442 364 -402 b 384 -266 383 -295 384 -281 b 351 -105 384 -206 366 -143 b 384 27 372 -66 384 -16 b 351 189 384 88 366 151 b 380 278 366 216 374 243 b 383 320 383 291 383 305 b 351 484 383 382 364 445 b 384 629 374 526 384 580 b 356 780 384 704 361 766 b 356 783 356 782 356 783 l 351 791 b 356 804 351 796 353 799 l 361 814 b 393 958 380 850 387 865 z m 56 386 b 217 609 86 501 153 533 b 292 706 246 642 269 670 b 304 711 295 710 300 711 b 321 703 311 711 320 707 b 328 670 325 693 325 681 b 331 634 330 658 331 645 b 82 367 331 516 199 367 l 75 367 b 56 386 62 367 56 379 z m 330 350 b 334 320 331 340 334 331 b 311 248 334 301 328 278 b 59 72 229 109 141 72 b 56 76 56 73 56 75 b 229 331 81 226 154 249 b 310 423 264 369 289 397 b 330 350 318 396 325 366 z m 330 56 b 334 26 331 46 334 37 b 311 -46 334 7 328 -16 b 56 -222 229 -184 137 -222 b 229 36 75 -86 145 -55 b 311 128 264 73 289 102 z m 330 -238 b 334 -268 331 -248 334 -256 b 311 -340 334 -287 328 -310 b 56 -516 229 -478 137 -516 b 229 -258 75 -380 145 -348 b 311 -166 264 -220 289 -192 z', + }, + accidentalFlat: { + x_min: 0, + x_max: 226, + y_min: -175, + y_max: 439, + ha: 614, + o: 'm 17 -245 b 30 -252 22 -251 26 -252 b 39 -249 35 -252 39 -249 b 153 -161 82 -225 117 -186 b 325 82 281 -72 325 16 b 196 220 325 164 262 216 b 117 196 171 220 137 209 b 85 176 108 189 92 176 b 78 177 82 176 81 176 b 62 202 68 181 62 192 b 72 608 63 233 72 579 b 45 632 72 624 59 632 b 0 592 24 632 1 618 b 17 -245 0 592 6 -230 z m 68 -117 b 63 27 68 -117 63 -30 b 66 73 63 50 65 68 b 167 144 76 102 134 144 b 226 60 209 144 226 96 b 98 -134 226 -17 160 -95 b 84 -138 92 -137 88 -138 b 68 -117 71 -138 68 -124 z', + }, + accidentalNatural: { + x_min: 0, + x_max: 168, + y_min: -335, + y_max: 341, + ha: 676, + o: 'm 203 261 b 197 259 200 261 199 259 b 68 226 197 259 105 226 b 53 233 59 226 53 228 l 53 474 b 36 491 53 484 45 491 l 17 491 b 0 474 7 491 0 484 l 0 -268 b 13 -281 0 -276 4 -281 l 16 -279 b 22 -278 17 -279 20 -279 b 164 -235 42 -269 122 -235 b 189 -251 179 -235 189 -239 l 189 -465 b 206 -482 189 -475 196 -482 l 225 -482 b 242 -465 233 -482 242 -475 l 242 258 b 230 269 242 265 236 269 b 225 268 229 269 226 269 z m 53 56 b 176 114 53 76 141 114 b 189 107 184 114 189 112 l 189 -42 b 71 -101 189 -68 107 -101 b 53 -92 60 -101 53 -98 z', + }, + accidentalSharp: { + x_min: 0, + x_max: 249, + y_min: -348, + y_max: 350, + ha: 698, + o: 'm 341 170 b 359 194 351 174 359 186 l 359 297 b 348 308 359 304 354 308 b 341 307 346 308 344 308 b 305 294 341 307 312 295 b 285 312 295 294 285 301 l 285 488 b 265 504 285 497 276 504 b 242 488 251 504 242 497 l 242 301 b 223 259 240 287 236 268 b 132 223 206 249 157 229 b 115 252 120 223 115 240 l 115 425 b 95 441 115 433 105 441 b 72 425 81 441 72 433 l 72 230 b 55 192 72 210 63 196 b 17 176 46 187 17 176 b 0 153 7 173 0 161 l 0 50 b 13 37 0 42 4 37 l 16 39 b 50 53 17 39 39 48 l 52 55 b 72 29 63 55 72 40 l 72 -114 b 56 -147 72 -130 65 -143 b 17 -163 48 -150 17 -163 b 0 -186 7 -166 0 -177 l 0 -288 b 13 -301 0 -297 4 -301 l 16 -300 b 50 -287 17 -300 37 -291 b 55 -285 52 -285 53 -285 b 72 -308 65 -285 72 -301 l 72 -485 b 91 -501 72 -494 81 -501 b 115 -485 105 -501 115 -494 l 115 -285 b 130 -253 115 -266 122 -256 l 217 -217 b 219 -217 217 -217 219 -217 l 222 -216 b 242 -242 235 -216 242 -233 l 242 -422 b 261 -438 242 -431 251 -438 b 285 -422 276 -438 285 -431 l 285 -217 b 301 -184 285 -206 291 -189 b 341 -168 311 -180 341 -168 b 359 -144 351 -164 359 -153 l 359 -42 b 348 -30 359 -35 354 -30 b 341 -32 346 -30 344 -30 l 304 -46 b 285 -20 295 -46 285 -37 l 285 114 b 304 156 285 124 292 151 z m 242 -65 b 132 -122 233 -94 166 -122 b 115 -115 124 -122 117 -120 b 111 -43 112 -109 111 -78 b 115 63 111 1 112 52 b 220 118 118 88 184 118 b 242 109 230 118 239 115 b 248 27 245 102 248 66 b 242 -65 248 -12 245 -52 z', + }, + accidentalDoubleSharp: { + x_min: 0, + x_max: 247, + y_min: -125, + y_max: 127, + ha: 252, + o: 'm 274 -46 b 206 1 258 -37 206 -9 b 274 50 206 22 253 43 b 278 50 275 50 276 50 l 287 49 b 346 63 304 49 331 52 b 356 115 353 71 356 92 b 292 183 356 174 351 183 b 233 173 266 183 240 180 b 226 117 228 168 226 143 b 179 49 219 101 196 49 b 130 117 158 49 135 96 b 118 173 130 141 125 167 b 66 183 112 180 89 183 b 7 173 42 183 16 180 b 0 120 3 170 0 145 b 7 63 0 94 3 68 b 68 49 17 55 43 49 b 82 50 73 49 78 50 b 150 3 98 42 150 13 b 84 -46 150 -16 104 -39 l 69 -46 b 7 -56 43 -46 16 -49 b 0 -111 3 -60 0 -85 b 7 -166 0 -137 3 -163 b 65 -180 17 -174 40 -180 b 118 -166 86 -180 109 -176 b 130 -111 127 -158 130 -134 b 132 -105 130 -109 131 -107 b 177 -45 141 -85 158 -45 b 226 -111 196 -45 220 -91 b 233 -166 226 -137 228 -161 b 291 -180 243 -174 266 -180 b 356 -114 346 -180 356 -166 b 346 -56 356 -89 351 -63 b 288 -46 338 -49 312 -46 z', + }, + accidentalDoubleFlat: { + x_min: 0, + x_max: 411, + y_min: -175, + y_max: 437, + ha: 612, + o: 'm 452 217 b 384 194 426 217 408 207 b 350 176 374 189 363 176 b 343 177 347 176 344 176 b 328 202 333 180 328 190 b 337 606 328 232 337 579 b 310 629 337 622 324 629 b 265 592 291 629 268 616 b 269 194 265 592 266 395 b 196 217 248 209 223 217 l 187 217 b 120 194 160 217 143 207 b 85 176 108 189 98 176 b 78 177 82 176 81 176 b 62 202 68 180 62 190 b 72 606 62 232 72 579 b 45 629 72 622 59 629 b 0 592 24 629 1 616 b 17 -245 0 592 7 -232 b 30 -252 22 -251 26 -252 b 39 -249 35 -252 39 -249 b 153 -161 84 -226 120 -186 b 274 -50 206 -124 246 -85 b 284 -245 276 -158 279 -240 b 295 -252 288 -251 292 -252 b 304 -249 300 -252 304 -249 b 416 -163 348 -226 383 -186 b 592 82 546 -72 592 16 b 461 217 592 163 528 216 z m 96 -134 b 84 -138 92 -137 86 -138 b 68 -115 72 -138 68 -124 b 63 26 68 -115 63 -30 b 66 72 63 49 65 66 b 168 144 75 101 134 144 b 226 59 212 144 226 95 b 96 -134 226 -22 161 -94 z m 361 -134 b 348 -138 356 -137 351 -138 b 333 -115 337 -138 333 -124 b 328 39 333 -115 328 -16 b 330 72 328 55 328 68 b 433 144 338 101 399 144 b 468 130 448 144 459 140 b 490 59 481 112 490 88 b 361 -134 490 -22 426 -94 z', + }, + accidentalParensLeft: { + x_min: 0, + x_max: 141, + y_min: -248, + y_max: 247, + ha: 495, + o: 'm 203 331 l 203 351 b 202 356 203 354 203 356 b 0 0 60 281 0 140 b 199 -357 0 -144 60 -269 b 203 -354 200 -357 203 -356 l 203 -333 b 200 -327 203 -330 202 -328 b 86 0 118 -253 86 -160 b 200 324 86 158 120 251 b 203 331 202 325 203 327 z', + }, + accidentalParensRight: { + x_min: 0, + x_max: 141, + y_min: -248, + y_max: 247, + ha: 495, + o: 'm 0 331 b 3 324 0 327 1 325 b 117 0 84 251 117 158 b 3 -327 117 -160 85 -253 b 0 -333 1 -328 0 -330 l 0 -354 b 4 -357 0 -356 3 -357 b 203 0 143 -269 203 -144 b 1 356 203 140 143 281 b 0 351 0 356 0 354 z', + }, + accidentalQuarterToneFlatStein: { + x_min: 1, + x_max: 227, + y_min: -175, + y_max: 439, + ha: 614, + o: 'm 310 -245 b 327 592 321 -230 327 592 b 282 632 325 618 302 632 b 255 608 268 632 255 624 b 265 202 255 579 264 233 b 249 177 265 192 259 181 b 242 176 246 176 245 176 b 210 196 235 176 219 189 b 131 220 190 209 156 220 b 1 85 65 216 1 164 b 174 -161 1 16 46 -72 b 288 -249 210 -186 245 -225 b 297 -252 288 -249 292 -252 b 310 -245 301 -252 305 -251 z m 259 -117 b 243 -138 259 -124 256 -138 b 229 -134 239 -138 235 -137 b 101 60 167 -95 101 -17 b 160 144 101 96 118 144 b 261 73 193 144 251 102 b 264 27 262 68 264 50 b 259 -117 264 -30 259 -117 z', + }, + accidentalThreeQuarterTonesFlatZimmermann: { + x_min: 1, + x_max: 466, + y_min: -175, + y_max: 439, + ha: 614, + o: 'm 363 -245 b 376 -252 367 -251 372 -252 b 384 -249 380 -252 384 -249 b 497 -161 428 -226 464 -186 b 671 84 625 -72 671 16 b 541 220 671 164 606 217 b 513 217 531 220 523 219 b 464 196 495 212 480 206 b 431 176 452 189 442 176 b 423 177 428 176 426 176 b 408 202 413 180 408 190 l 419 608 b 392 632 419 625 406 632 b 346 592 372 632 347 618 b 363 -245 346 592 351 -230 z m 289 -249 b 297 -252 289 -249 292 -252 b 310 -245 300 -252 305 -251 b 328 592 321 -230 328 592 b 282 631 327 618 302 631 b 255 608 268 631 255 624 l 266 202 b 251 177 266 190 261 180 b 243 176 248 176 246 176 b 210 196 232 176 222 189 b 164 216 196 204 180 210 l 163 217 b 132 220 151 219 143 220 b 1 84 65 217 1 163 b 177 -163 1 16 48 -72 b 289 -249 210 -186 245 -226 z m 262 72 b 265 26 264 66 265 49 b 261 -115 265 -30 261 -115 b 245 -138 261 -124 258 -138 b 230 -134 240 -138 236 -137 b 102 60 166 -92 102 -20 b 124 128 102 88 111 112 b 161 144 134 138 147 144 b 199 134 173 144 184 141 b 262 72 219 122 256 92 z m 413 -115 b 409 26 413 -115 409 -30 b 412 72 409 49 410 66 b 514 144 420 102 480 144 b 570 60 557 144 570 96 b 442 -134 570 -23 508 -91 b 429 -138 436 -137 433 -138 b 413 -115 418 -138 413 -124 z', + }, + accidentalQuarterToneSharpStein: { + x_min: 0, + x_max: 179, + y_min: -353, + y_max: 307, + ha: 660, + o: 'm 258 240 b 246 252 258 248 252 252 b 240 251 245 252 242 252 b 168 225 240 251 171 225 b 150 253 156 225 150 240 l 150 426 b 130 442 150 435 141 442 b 105 418 108 442 105 429 l 105 230 b 91 193 105 219 101 202 b 17 161 65 183 42 171 b 0 138 9 158 0 147 l 0 36 b 13 23 0 27 4 23 l 16 24 b 86 53 17 24 73 49 l 88 55 b 107 30 98 55 107 42 l 107 -114 b 92 -145 107 -130 101 -143 l 17 -177 b 0 -200 9 -180 0 -192 l 0 -302 b 13 -315 0 -311 4 -315 l 16 -314 b 85 -285 17 -314 72 -291 b 105 -312 92 -282 105 -301 l 105 -492 b 125 -508 105 -501 114 -508 b 150 -484 147 -508 150 -498 l 150 -285 b 151 -274 150 -281 150 -278 b 164 -253 153 -265 158 -256 b 240 -225 176 -251 240 -225 b 258 -202 249 -222 258 -210 l 258 -99 b 245 -86 258 -91 253 -86 l 242 -88 b 240 -88 242 -88 240 -88 l 240 -86 b 168 -115 240 -86 174 -114 b 148 -91 158 -115 148 -107 l 148 43 b 167 85 148 55 156 81 b 240 114 180 91 240 114 b 258 138 249 118 258 128 z', + }, + accidentalThreeQuarterTonesSharpStein: { + x_min: 3, + x_max: 317, + y_min: -347, + y_max: 369, + ha: 716, + o: 'm 456 324 b 448 336 456 330 454 336 b 393 317 445 336 400 320 b 389 315 392 315 390 315 b 383 325 386 315 383 318 l 383 508 b 360 531 383 528 379 531 b 337 508 341 531 337 527 l 337 318 b 325 291 337 300 334 294 b 268 268 320 288 287 276 b 253 281 256 268 253 274 l 253 464 b 230 487 253 484 249 487 b 207 464 212 487 207 482 l 207 264 b 194 240 207 253 204 245 l 132 217 b 131 217 132 217 132 217 l 130 216 b 118 229 122 216 118 220 l 118 420 b 95 444 118 439 114 444 b 72 420 76 444 72 439 l 72 212 b 60 190 72 197 68 193 l 16 173 b 4 161 9 170 4 167 l 4 50 b 13 39 4 45 9 39 b 58 55 16 39 46 49 b 63 56 60 56 62 56 b 72 42 71 56 72 50 l 72 -125 b 58 -150 72 -137 65 -147 l 16 -166 b 4 -177 9 -168 4 -171 l 4 -289 b 14 -301 4 -295 9 -301 b 53 -287 16 -301 40 -291 b 62 -285 56 -285 59 -285 b 72 -298 69 -285 72 -289 l 72 -477 b 95 -500 72 -495 76 -500 b 118 -477 114 -500 118 -495 l 118 -278 b 127 -259 118 -269 121 -261 l 196 -232 b 207 -243 204 -232 207 -235 l 207 -432 b 230 -455 207 -452 212 -455 b 253 -432 249 -455 253 -451 l 253 -228 b 268 -204 253 -216 259 -207 l 320 -186 b 328 -183 323 -184 325 -183 b 337 -194 334 -183 337 -187 l 337 -387 b 360 -410 337 -408 341 -410 b 383 -387 379 -410 383 -406 l 383 -174 b 395 -157 383 -166 390 -158 l 445 -138 b 456 -127 452 -135 456 -132 l 456 -14 b 448 -3 456 -10 454 -3 b 397 -22 445 -3 408 -17 l 396 -23 b 383 -6 387 -23 383 -16 l 383 163 b 392 181 383 173 384 179 b 445 202 397 183 445 202 b 456 213 452 203 456 207 z m 337 -45 b 266 -78 333 -56 287 -78 b 258 -75 262 -78 259 -76 b 253 19 255 -71 253 -27 b 258 130 253 69 255 122 b 333 163 264 141 315 163 b 337 161 334 163 337 161 b 341 78 340 157 341 120 b 337 -45 341 24 340 -37 z m 118 -127 b 114 -48 114 -121 114 -86 b 118 78 114 6 115 68 b 200 114 122 91 180 114 b 207 111 204 114 206 112 b 212 22 210 107 212 66 b 207 -94 212 -29 210 -85 b 127 -130 203 -108 148 -130 b 118 -127 122 -130 120 -128 z', + }, + accidentalBuyukMucennebFlat: { + x_min: 1, + x_max: 287, + y_min: -174, + y_max: 438, + ha: 612, + o: 'm 379 452 b 370 464 379 458 377 464 b 164 389 366 464 170 392 b 156 396 163 389 156 393 b 157 436 157 409 157 428 b 167 452 157 445 161 449 b 366 526 173 455 366 526 b 379 540 374 528 379 534 l 379 611 b 370 622 379 616 377 622 b 170 550 366 622 174 552 b 160 557 163 550 160 554 b 161 608 160 585 161 602 b 134 631 161 624 148 631 b 89 590 114 631 91 616 l 89 528 b 81 517 89 526 88 518 b 16 491 76 514 16 491 b 1 480 6 490 1 485 l 1 406 b 13 395 1 400 4 395 l 14 396 b 79 419 16 396 72 415 b 89 412 86 419 89 415 b 91 376 89 399 89 386 b 82 359 91 364 89 361 b 16 331 76 356 16 331 b 1 321 6 331 1 328 l 1 248 b 13 236 1 242 4 236 b 79 262 16 236 71 258 b 92 251 89 262 92 256 b 107 -242 95 23 101 -236 b 120 -251 111 -249 115 -251 b 128 -248 124 -251 128 -248 b 240 -160 171 -225 207 -184 b 413 84 367 -71 413 16 b 284 220 413 166 350 216 b 207 196 259 220 229 209 b 170 176 196 190 184 176 l 168 177 b 151 203 157 181 151 192 b 153 269 151 210 151 236 b 163 292 153 275 153 289 b 366 367 173 297 366 367 b 379 383 374 370 379 376 z m 186 -132 b 173 -137 180 -135 176 -137 b 157 -114 161 -137 157 -122 b 153 35 157 -114 153 -22 b 154 73 153 53 153 68 b 219 135 160 92 197 124 b 255 144 232 141 243 144 b 292 130 269 144 282 140 b 314 62 305 114 314 91 b 186 -132 314 -17 251 -94 z', + }, + accidentalBakiyeFlat: { + x_min: -1, + x_max: 286, + y_min: -175, + y_max: 439, + ha: 614, + o: 'm 377 454 b 369 467 377 458 376 467 b 363 465 367 467 364 467 b 161 390 363 465 167 393 b 153 399 154 390 153 395 b 157 608 154 494 157 593 b 130 632 157 624 144 632 b 86 592 111 632 88 618 b 88 377 86 592 86 501 b 76 356 88 373 88 360 l 12 331 b -1 320 3 330 -1 327 l -1 248 b 9 236 -1 242 1 236 b 81 264 12 236 78 261 b 89 258 86 264 89 261 b 104 -245 92 30 96 -236 b 115 -252 108 -251 112 -252 b 124 -249 120 -252 124 -249 b 239 -161 167 -226 203 -186 b 412 84 367 -72 412 17 b 282 220 412 166 348 216 b 255 216 274 220 264 219 b 203 196 238 212 222 206 b 171 177 193 189 177 177 b 163 179 168 177 166 177 b 147 202 153 181 147 192 b 147 216 147 204 147 209 l 150 262 b 150 276 150 269 150 275 b 158 291 150 287 154 289 b 363 370 163 292 363 370 b 377 384 373 373 377 379 z m 181 -134 b 167 -138 176 -137 171 -138 b 153 -117 156 -138 153 -125 b 148 27 153 -117 148 -30 b 151 73 148 50 150 68 b 255 144 161 105 219 144 b 312 62 298 144 312 99 b 181 -134 312 -19 249 -96 z', + }, + accidentalKomaSharp: { + x_min: 0, + x_max: 229, + y_min: -337, + y_max: 322, + ha: 659, + o: 'm 312 151 b 330 176 323 156 330 166 l 330 278 b 320 289 330 285 327 289 b 312 288 318 289 315 289 b 200 246 312 288 203 248 b 181 275 187 246 181 264 l 181 448 b 163 464 181 456 173 464 b 138 441 140 464 138 452 l 138 253 b 122 215 137 240 132 225 b 17 177 92 203 45 177 b 0 153 7 173 0 163 l 0 50 b 10 39 0 43 4 39 b 17 40 13 39 14 39 l 128 81 b 138 52 138 81 138 63 l 138 -91 b 124 -124 138 -107 132 -120 b 17 -167 115 -127 17 -167 b 0 -192 7 -171 0 -181 l 0 -294 b 10 -305 0 -301 4 -305 b 17 -304 13 -305 14 -305 b 128 -261 17 -304 117 -264 l 130 -259 b 138 -276 137 -259 138 -268 l 138 -469 b 157 -485 138 -478 147 -485 b 181 -462 179 -485 181 -475 l 181 -262 b 183 -252 181 -258 181 -255 b 197 -232 186 -243 190 -235 b 312 -187 207 -228 312 -187 b 330 -163 323 -183 330 -173 l 330 -60 b 320 -49 330 -53 327 -49 b 312 -50 318 -49 315 -49 l 200 -94 b 193 -95 197 -95 194 -95 b 181 -68 183 -95 181 -85 l 181 66 b 200 108 181 92 189 104 z', + }, + accidentalKucukMucennebSharp: { + x_min: -1, + x_max: 339, + y_min: -338, + y_max: 321, + ha: 659, + o: 'm 264 92 b 271 102 264 98 265 99 l 395 150 b 412 174 405 154 412 164 l 412 276 b 402 288 412 284 409 288 b 395 287 400 288 397 288 b 282 245 395 287 285 246 b 264 274 269 245 264 262 l 264 446 b 245 462 264 455 255 462 b 220 439 222 462 220 451 l 220 252 b 204 213 219 239 215 223 b 99 176 174 202 127 176 b 82 151 89 171 82 161 l 82 49 b 92 37 82 42 86 37 b 99 39 95 37 96 37 l 210 79 b 216 81 212 81 215 81 b 220 78 219 81 220 79 l 220 56 b 216 46 220 52 220 48 b 16 -29 210 45 16 -29 b -1 -45 4 -32 -1 -36 l -1 -138 b 12 -154 -1 -145 3 -154 l 215 -79 b 220 -84 219 -79 220 -81 l 220 -105 b 210 -122 220 -115 219 -120 b 99 -168 202 -127 99 -168 b 82 -193 89 -173 82 -183 l 82 -295 b 92 -307 82 -302 86 -307 b 99 -305 95 -307 96 -307 b 210 -262 99 -305 199 -265 l 212 -261 b 220 -278 219 -261 220 -269 l 220 -471 b 239 -487 220 -480 229 -487 b 264 -464 261 -487 264 -477 l 264 -264 b 265 -253 264 -259 264 -256 b 279 -233 268 -245 272 -236 b 395 -189 289 -229 395 -189 b 412 -164 405 -184 412 -174 l 412 -62 b 402 -50 412 -55 409 -50 b 395 -52 400 -50 397 -50 l 278 -96 b 264 -86 268 -96 264 -94 l 264 -68 b 269 -59 264 -62 265 -60 b 471 17 274 -58 471 17 b 488 36 484 22 488 27 l 488 127 b 475 144 488 134 487 144 l 472 141 b 471 141 472 141 471 141 l 471 143 b 272 68 471 143 282 71 l 269 66 b 264 71 264 66 264 69 z', + }, + accidentalKoron: { + x_min: 0, + x_max: 300, + y_min: -472, + y_max: 157, + ha: 629, + o: 'm 432 -4 b 415 10 432 1 418 9 l 4 226 b 0 223 1 226 0 225 l 0 -672 b 7 -680 0 -677 3 -680 l 45 -680 b 52 -672 49 -680 52 -677 l 52 -193 l 415 -22 b 432 -4 418 -20 432 -13 z m 52 -137 l 52 144 l 327 -7 z', + }, + accidentalSori: { + x_min: 0, + x_max: 421, + y_min: -318, + y_max: 328, + ha: 646, + o: 'm 606 10 b 589 23 606 16 592 22 l 382 109 l 382 465 b 374 472 382 469 379 472 l 337 472 b 330 465 333 472 330 469 l 330 132 l 183 194 l 183 425 b 176 432 183 429 180 432 l 138 432 b 131 425 134 432 131 429 l 131 216 l 3 269 b 0 265 0 269 0 266 l 0 223 b 3 213 0 216 0 215 l 131 160 l 131 -150 l 3 -203 b 0 -212 0 -204 0 -206 l 0 -255 b 3 -259 0 -258 1 -259 l 131 -204 l 131 -451 b 138 -458 131 -455 134 -458 l 176 -458 b 183 -451 180 -458 183 -455 l 183 -183 l 330 -120 l 330 -410 b 337 -418 330 -415 333 -418 l 374 -418 b 382 -410 379 -418 382 -415 l 382 -98 l 589 -9 b 606 10 592 -9 606 0 z m 183 -128 l 183 138 l 330 76 l 330 -66 z m 382 -45 l 382 55 l 501 6 z', + }, + articAccentAbove: { + x_min: 0, + x_max: 339, + y_min: 1, + y_max: 245, + ha: 244, + o: 'm 469 151 b 488 177 488 156 488 166 b 469 203 488 189 488 197 l 37 350 b 24 353 32 351 26 353 b 3 333 12 353 7 344 b 0 318 1 327 0 323 b 20 298 0 311 4 304 b 346 187 20 298 331 193 b 356 177 353 186 356 181 b 344 167 356 173 353 170 b 20 58 328 163 20 58 b 0 36 4 50 0 43 b 3 23 0 32 1 27 b 23 1 7 13 13 1 b 29 3 24 1 27 1 z', + }, + articAccentBelow: { + x_min: 0, + x_max: 339, + y_min: -244, + y_max: 0, + ha: 244, + o: 'm 469 -202 b 488 -176 488 -197 488 -187 b 469 -150 488 -164 488 -156 l 37 -3 b 24 0 32 -1 26 0 b 3 -20 12 0 7 -9 b 0 -35 1 -26 0 -30 b 20 -55 0 -42 4 -49 b 346 -166 20 -55 331 -160 b 356 -176 353 -167 356 -171 b 344 -186 356 -180 353 -183 b 20 -295 328 -190 20 -295 b 0 -317 4 -302 0 -310 b 3 -330 0 -321 1 -325 b 23 -351 7 -340 13 -351 b 29 -350 24 -351 27 -351 z', + }, + articTenutoAbove: { + x_min: -1, + x_max: 338, + y_min: 0, + y_max: 48, + ha: 48, + o: 'm 452 0 b 487 35 485 0 487 16 b 452 69 487 53 487 69 l 33 69 b -1 35 -1 69 -1 53 b 33 0 -1 16 -1 0 z', + }, + articTenutoBelow: { + x_min: -1, + x_max: 338, + y_min: -48, + y_max: 0, + ha: 48, + o: 'm 452 -69 b 487 -35 485 -69 487 -53 b 452 0 487 -16 487 0 l 33 0 b -1 -35 -1 0 -1 -16 b 33 -69 -1 -53 -1 -69 z', + }, + articStaccatoAbove: { + x_min: 0, + x_max: 84, + y_min: 0, + y_max: 84, + ha: 84, + o: 'm 121 60 b 60 121 121 94 94 121 b 0 60 27 121 0 94 b 60 0 0 27 27 0 b 121 60 94 0 121 27 z', + }, + articStaccatoBelow: { + x_min: 0, + x_max: 84, + y_min: -84, + y_max: 0, + ha: 84, + o: 'm 121 -60 b 60 0 121 -27 94 0 b 0 -60 27 0 0 -27 b 60 -121 0 -94 27 -121 b 121 -60 94 -121 121 -94 z', + }, + articStaccatissimoAbove: { + x_min: 1, + x_max: 100, + y_min: -2, + y_max: 293, + ha: 295, + o: 'm 72 422 b 1 390 35 422 3 409 b 72 -3 1 369 39 -3 b 144 389 108 -3 144 356 b 72 422 144 410 111 422 z', + }, + articStaccatissimoBelow: { + x_min: 1, + x_max: 100, + y_min: -295, + y_max: 0, + ha: 295, + o: 'm 72 -425 b 144 -392 111 -425 144 -413 b 72 0 144 -359 108 0 b 1 -393 39 0 1 -372 b 72 -425 3 -412 35 -425 z', + }, + articMarcatoAbove: { + x_min: -1, + x_max: 235, + y_min: -1, + y_max: 253, + ha: 254, + o: 'm 181 356 b 167 364 177 361 173 364 b 153 356 157 364 153 356 l 0 23 b -1 16 -1 20 -1 19 b 9 0 -1 9 1 1 b 16 -1 10 -1 14 -1 b 32 9 22 -1 29 1 b 112 186 32 9 109 180 b 118 190 114 189 115 190 b 127 186 121 190 124 189 b 209 9 128 180 209 9 b 225 0 213 3 219 0 l 323 0 b 338 16 333 1 338 7 b 337 23 338 19 338 22 z', + }, + articMarcatoBelow: { + x_min: -1, + x_max: 235, + y_min: -254, + y_max: 0, + ha: 254, + o: 'm 156 -357 b 170 -366 160 -363 164 -366 b 184 -357 180 -366 184 -357 l 337 -24 b 338 -17 338 -22 338 -20 b 328 -1 338 -10 336 -3 b 321 0 327 0 323 0 b 305 -10 315 0 308 -3 b 225 -187 305 -10 228 -181 b 219 -192 223 -190 222 -192 b 210 -187 216 -192 213 -190 b 128 -10 209 -181 128 -10 b 112 -1 124 -4 118 -1 l 14 -1 b -1 -17 4 -3 -1 -9 b 0 -24 -1 -20 -1 -23 z', + }, + fermataAbove: { + x_min: 3, + x_max: 605, + y_min: -3, + y_max: 329, + ha: 332, + o: 'm 435 318 b 818 36 742 318 804 91 b 821 26 819 32 819 27 b 851 -4 831 6 837 -4 b 871 16 864 -4 871 1 b 870 30 871 20 871 24 b 438 474 780 471 480 474 b 6 30 392 474 94 471 b 4 14 4 24 4 19 b 23 -4 4 0 12 -4 b 52 26 36 -4 43 6 b 56 39 53 27 55 33 b 435 318 73 98 138 318 z m 516 75 b 436 153 516 117 480 153 b 359 75 395 153 359 117 b 436 -4 359 32 395 -4 b 516 75 480 -4 516 32 z', + }, + fermataBelow: { + x_min: 3, + x_max: 605, + y_min: -332, + y_max: 0, + ha: 332, + o: 'm 435 -323 b 56 -43 138 -323 73 -102 b 52 -30 55 -37 53 -32 b 23 0 43 -10 36 0 b 4 -19 12 0 4 -4 b 6 -35 4 -23 4 -29 b 438 -478 94 -475 392 -478 b 870 -35 480 -478 780 -475 b 871 -20 871 -29 871 -24 b 851 0 871 -6 864 0 b 821 -30 837 0 831 -10 b 818 -40 819 -32 819 -36 b 435 -323 804 -95 742 -323 z m 516 -79 b 436 0 516 -36 480 0 b 359 -79 395 0 359 -36 b 436 -157 359 -121 395 -157 b 516 -79 480 -157 516 -121 z', + }, + breathMarkComma: { + x_min: 1, + x_max: 152, + y_min: 2, + y_max: 251, + ha: 249, + o: 'm 104 361 b 1 271 42 361 1 321 b 82 190 1 222 35 190 b 122 160 118 190 122 160 b 125 144 124 154 125 150 b 102 88 125 124 115 105 b 37 32 78 56 40 35 b 26 17 32 29 26 26 l 27 16 b 37 3 29 6 33 3 b 181 102 85 3 158 66 b 219 239 210 147 219 197 l 219 249 b 104 361 219 317 170 361 z', + }, + breathMarkUpbow: { + x_min: 1, + x_max: 249, + y_min: 1, + y_max: 495, + ha: 494, + o: 'm 181 1 b 206 22 193 1 203 10 l 359 683 l 359 688 b 338 713 359 700 351 710 l 333 713 b 308 694 321 713 311 706 l 180 140 l 53 694 b 27 713 49 706 39 713 l 22 713 b 1 690 10 710 1 700 b 3 683 1 687 1 685 l 154 22 b 181 1 157 10 167 1 z', + }, + caesura: { + x_min: 0, + x_max: 384, + y_min: -1, + y_max: 532, + ha: 533, + o: 'm 40 -1 b 78 26 58 -1 72 9 l 321 713 b 323 726 323 717 323 721 b 282 766 323 747 304 766 b 245 739 265 766 251 756 l 3 52 b 0 37 1 48 0 42 b 27 1 0 22 10 7 b 40 -1 32 -1 36 -1 z m 308 26 l 552 713 b 553 726 553 717 553 721 b 513 766 553 747 534 766 b 475 739 495 766 481 756 l 232 52 b 230 39 230 48 230 43 b 258 1 230 23 240 7 b 271 -1 262 -1 266 -1 b 308 26 287 -1 302 9 z', + }, + caesuraCurved: { + x_min: 0, + x_max: 373, + y_min: 0, + y_max: 530, + ha: 530, + o: 'm 491 763 b 445 719 468 763 446 744 b 252 98 432 507 340 295 l 226 39 b 223 27 225 35 223 32 b 252 0 223 13 233 0 b 276 16 262 0 272 6 b 537 716 386 230 537 478 b 491 763 537 742 518 763 z m 29 0 b 53 16 39 0 48 6 l 82 69 b 314 716 187 264 314 498 b 268 763 314 742 295 763 b 222 719 245 763 223 744 b 29 98 209 507 117 295 l 3 39 b 0 29 1 36 0 33 b 29 0 0 14 12 0 z', + }, + restMaxima: { + x_min: 0, + x_max: 381, + y_min: -249, + y_max: 250, + ha: 499, + o: 'm 180 -330 l 180 331 b 156 360 180 356 170 360 l 23 360 b 0 331 10 360 0 356 l 0 -330 b 23 -359 0 -354 10 -359 l 156 -359 b 180 -330 170 -359 180 -354 z m 549 -330 l 549 331 b 524 360 549 356 539 360 l 392 360 b 369 331 379 360 369 356 l 369 -330 b 392 -359 369 -354 379 -359 l 524 -359 b 549 -330 539 -359 549 -354 z', + }, + restDoubleWhole: { + x_min: 0, + x_max: 125, + y_min: 0, + y_max: 250, + ha: 250, + o: 'm 180 22 l 180 338 b 156 360 180 350 170 360 l 23 360 b 0 338 10 360 0 350 l 0 22 b 23 0 0 10 10 0 l 156 0 b 180 22 170 0 180 10 z', + }, + restWhole: { + x_min: 0, + x_max: 282, + y_min: -135, + y_max: 9, + ha: 144, + o: 'm 406 -157 l 406 -24 b 369 13 406 -3 389 13 l 37 13 b 0 -24 16 13 0 -3 l 0 -157 b 37 -194 0 -177 16 -194 l 369 -194 b 406 -157 389 -194 406 -177 z', + }, + restHalf: { + x_min: 0, + x_max: 282, + y_min: -2, + y_max: 142, + ha: 144, + o: 'm 406 35 l 406 167 b 369 204 406 189 389 204 l 37 204 b 0 167 16 204 0 189 l 0 35 b 37 -3 0 14 16 -3 l 369 -3 b 406 35 389 -3 406 14 z', + }, + restQuarter: { + x_min: 1, + x_max: 270, + y_min: -375, + y_max: 373, + ha: 748, + o: 'm 112 -55 b 174 -141 135 -84 156 -111 b 183 -161 177 -147 183 -158 b 181 -167 183 -163 183 -166 b 166 -174 179 -173 173 -174 b 143 -170 160 -174 148 -171 b 137 -170 141 -170 138 -170 l 125 -166 b 1 -304 50 -166 1 -233 b 168 -527 1 -376 63 -446 b 206 -540 180 -536 194 -540 b 228 -531 216 -540 226 -537 b 230 -521 229 -527 230 -524 b 207 -487 230 -508 219 -497 b 170 -435 189 -487 173 -448 b 164 -397 166 -423 164 -410 b 255 -292 164 -338 194 -292 b 369 -317 297 -292 344 -308 l 370 -318 b 382 -320 376 -320 379 -320 b 389 -314 386 -320 389 -318 b 336 -232 389 -297 351 -249 b 236 -32 281 -166 236 -112 b 236 -27 236 -30 236 -29 l 238 -17 b 238 -13 238 -16 238 -14 b 333 199 243 71 295 140 b 338 220 337 206 338 213 b 333 248 338 235 333 248 b 95 526 333 248 120 501 b 69 537 88 533 78 537 b 40 507 55 537 40 527 b 46 484 40 500 42 492 b 134 291 52 468 134 395 b 48 108 134 238 112 176 b 27 66 33 94 27 78 b 42 32 27 46 42 32 z', + }, + rest8th: { + x_min: 0, + x_max: 247, + y_min: -251, + y_max: 174, + ha: 425, + o: 'm 193 154 b 96 251 193 207 150 251 b 0 154 43 251 0 207 b 39 81 0 124 17 98 b 117 56 62 65 89 56 b 173 66 137 56 157 60 b 225 88 193 72 206 78 b 232 89 228 89 230 89 b 239 76 238 89 239 84 b 238 60 239 72 239 66 b 104 -343 233 39 130 -248 b 145 -361 104 -360 137 -361 b 196 -347 161 -361 181 -359 b 341 161 200 -344 341 161 b 356 217 347 187 354 210 b 338 240 356 232 341 239 b 323 235 336 240 331 240 b 193 140 312 226 240 140 z', + }, + rest16th: { + x_min: 0, + x_max: 320, + y_min: -500, + y_max: 179, + ha: 679, + o: 'm 300 160 b 202 258 300 215 256 258 b 104 160 148 258 104 215 b 219 62 104 101 164 62 b 331 94 258 62 298 75 b 341 96 336 95 338 96 b 348 86 346 96 348 94 b 265 -173 348 63 275 -151 b 194 -217 253 -200 215 -217 b 196 -203 196 -212 196 -207 b 98 -105 196 -148 151 -105 b 0 -203 43 -105 0 -148 b 115 -301 0 -262 60 -301 b 223 -271 153 -301 190 -288 b 229 -279 226 -271 229 -274 l 228 -281 b 228 -282 228 -282 228 -282 l 91 -690 b 91 -691 91 -690 91 -691 l 89 -693 b 134 -720 89 -706 102 -720 b 189 -687 176 -720 183 -703 l 356 -138 b 420 81 393 -16 420 81 b 459 226 420 81 456 207 b 461 232 459 229 461 230 b 446 248 461 240 449 246 b 431 242 439 248 435 245 b 300 145 420 233 348 147 z', + }, + rest32nd: { + x_min: 0, + x_max: 363, + y_min: -500, + y_max: 426, + ha: 926, + o: 'm 508 603 b 492 598 501 603 497 600 b 361 503 482 590 410 503 l 361 516 b 264 613 361 570 318 613 b 166 516 210 613 166 570 b 206 444 166 487 183 461 b 246 423 217 433 232 428 b 284 418 258 420 269 418 b 393 449 321 418 360 432 b 399 451 395 451 397 451 b 415 426 409 451 415 436 l 413 423 b 413 422 413 423 413 422 l 357 192 b 279 140 350 168 302 140 b 281 153 281 144 281 148 b 183 251 281 207 236 251 b 85 153 128 251 85 207 b 125 81 85 124 102 98 b 164 60 137 71 150 65 b 203 55 176 58 189 55 b 311 86 240 55 278 69 b 315 88 312 88 314 88 b 325 69 323 88 325 76 l 268 -167 b 194 -217 261 -197 216 -216 b 196 -203 196 -212 196 -207 b 98 -105 196 -148 153 -105 b 0 -203 45 -105 0 -148 b 115 -301 0 -262 60 -301 b 228 -269 154 -301 194 -288 b 232 -268 229 -268 230 -268 b 240 -276 236 -268 240 -272 b 138 -688 240 -282 141 -678 b 137 -697 137 -691 137 -694 b 176 -720 137 -708 145 -720 b 232 -690 222 -720 226 -706 b 484 436 236 -672 484 436 b 521 582 484 436 518 564 b 523 588 521 585 523 586 b 508 603 523 600 511 603 z', + }, + rest64th: { + x_min: 0, + x_max: 423, + y_min: -753, + y_max: 430, + ha: 1183, + o: 'm 596 609 b 580 603 589 609 585 606 b 448 507 569 595 497 507 b 449 521 449 511 449 516 b 351 619 449 575 405 619 b 253 521 297 619 253 575 b 372 422 253 461 317 422 b 481 454 410 422 446 438 b 491 456 484 455 488 456 b 504 441 498 456 504 451 b 501 426 504 436 503 432 b 445 202 500 422 451 217 b 359 144 435 174 383 144 l 359 158 b 261 256 359 212 315 256 b 163 158 207 256 163 212 b 243 65 163 112 202 78 b 279 60 255 62 266 60 b 397 91 320 60 360 73 b 403 92 400 92 402 92 b 412 79 409 92 412 86 b 410 72 412 76 412 75 b 351 -161 408 59 356 -150 b 281 -212 340 -199 301 -212 l 281 -197 b 183 -99 281 -144 238 -99 b 85 -197 130 -99 85 -144 b 125 -271 85 -228 102 -253 b 166 -291 138 -279 151 -287 b 204 -297 177 -294 192 -297 b 262 -287 225 -297 245 -292 b 305 -265 282 -279 287 -274 b 310 -264 307 -264 308 -264 b 318 -284 317 -264 318 -275 b 317 -295 318 -288 317 -294 b 259 -524 315 -302 265 -508 b 194 -567 251 -554 213 -567 b 196 -554 196 -563 196 -559 b 98 -456 196 -500 153 -456 b 0 -554 45 -456 0 -500 b 40 -626 0 -583 17 -609 b 118 -652 60 -644 92 -652 b 210 -629 145 -652 186 -642 b 216 -628 213 -628 215 -628 b 228 -647 226 -628 228 -639 l 226 -651 b 226 -652 226 -651 226 -652 l 122 -1054 b 121 -1064 121 -1058 121 -1061 b 167 -1084 121 -1077 134 -1084 b 215 -1060 202 -1084 209 -1076 b 402 -278 217 -1047 229 -1021 b 436 -135 403 -278 431 -161 l 570 441 b 609 588 570 441 605 569 b 596 609 609 603 602 608 z', + }, + rest128th: { + x_min: 0, + x_max: 485, + y_min: -750, + y_max: 689, + ha: 1439, + o: 'm 537 894 b 439 992 537 949 494 992 b 341 894 386 992 341 949 b 382 822 341 865 359 840 b 459 796 402 805 433 796 b 518 806 480 796 501 801 l 520 808 b 569 828 539 814 552 819 b 580 831 572 829 577 831 b 598 812 589 831 598 825 b 596 801 598 809 598 805 b 540 575 590 773 546 595 b 448 510 534 553 475 510 l 448 524 b 350 622 448 577 405 622 b 252 524 297 622 252 577 b 292 451 252 494 269 468 b 369 426 318 433 337 426 b 429 435 389 426 412 429 b 494 464 449 442 475 455 b 498 465 495 465 497 465 b 505 446 504 465 505 456 b 503 426 505 439 504 432 l 446 202 b 366 144 439 173 389 144 l 366 158 b 268 256 366 212 323 256 b 170 158 215 256 170 212 b 289 59 170 98 235 59 b 347 69 310 59 330 63 b 397 91 367 76 379 82 b 406 94 400 92 403 94 b 415 79 412 94 415 88 b 412 63 415 75 413 69 b 357 -157 408 42 364 -134 b 281 -212 346 -196 302 -212 b 282 -197 281 -207 282 -203 b 184 -99 282 -144 238 -99 b 86 -197 130 -99 86 -144 b 204 -297 86 -258 150 -297 b 262 -287 225 -297 245 -292 b 312 -265 282 -279 294 -274 b 318 -264 314 -264 317 -264 b 327 -275 324 -264 327 -269 b 266 -517 324 -287 278 -490 b 200 -569 248 -566 220 -567 l 196 -554 b 98 -456 196 -500 153 -456 b 0 -554 45 -456 0 -500 b 118 -652 0 -615 63 -652 b 177 -642 138 -652 160 -648 l 179 -641 b 229 -621 197 -635 210 -629 l 230 -619 b 239 -626 236 -619 239 -622 b 238 -632 239 -628 239 -631 b 131 -1057 235 -642 134 -1050 b 173 -1080 131 -1071 140 -1080 b 230 -1057 219 -1080 225 -1074 l 658 815 b 697 960 658 815 694 942 b 698 966 697 963 698 965 b 684 982 698 975 687 981 b 668 976 677 982 672 979 b 537 880 658 969 586 881 z', + }, + dynamicPiano: { + x_min: -89, + x_max: 366, + y_min: -142, + y_max: 274, + ha: 416, + o: 'm 395 395 b 292 357 350 395 318 380 b 262 328 272 340 268 328 b 246 363 255 328 259 338 b 177 393 236 380 215 393 b 1 251 92 393 46 333 b -9 223 -6 238 -9 230 b 7 207 -9 213 -1 207 b 30 229 17 207 23 216 b 127 338 72 301 101 338 b 143 321 138 338 143 331 b 134 285 143 310 138 295 l -43 -154 b -65 -168 -48 -166 -50 -168 l -109 -168 b -128 -187 -122 -168 -128 -174 b -111 -204 -128 -199 -122 -204 l 167 -204 b 186 -186 180 -204 186 -199 b 168 -168 186 -174 180 -168 l 111 -168 b 98 -164 102 -168 98 -168 b 101 -154 98 -163 99 -158 l 166 7 b 179 24 168 14 171 24 b 213 -1 186 24 190 10 b 276 -14 233 -12 252 -14 b 527 266 415 -14 527 130 b 395 395 527 350 475 395 z m 356 341 b 389 288 380 341 389 320 b 243 35 389 217 312 35 b 207 81 219 35 207 50 b 235 180 207 111 219 140 l 264 251 b 356 341 284 300 321 341 z', + }, + dynamicMezzo: { + x_min: -20, + x_max: 446, + y_min: -10, + y_max: 274, + ha: 284, + o: 'm 528 395 b 431 350 487 395 454 374 b 409 330 416 336 415 330 b 397 360 402 330 406 341 b 334 395 389 379 370 395 b 236 350 292 395 259 374 b 215 330 222 336 220 330 b 203 360 207 330 212 340 b 147 393 194 379 174 393 b -19 251 71 393 26 331 b -29 223 -26 238 -29 230 b -13 207 -29 213 -22 207 b 9 226 -3 207 1 215 b 107 338 52 300 81 338 b 122 321 118 338 122 331 b 114 285 122 310 118 295 l 9 24 b 4 9 6 17 4 13 b 20 0 4 3 9 0 l 91 0 b 114 17 104 0 108 3 l 207 251 b 287 323 225 292 255 323 b 308 302 304 323 308 314 b 294 249 308 285 302 269 b 203 24 294 248 292 248 b 199 9 200 17 199 13 b 215 0 199 3 203 0 l 285 0 b 308 17 298 0 302 3 l 402 251 b 481 323 419 292 449 323 b 503 302 498 323 503 314 b 413 43 503 252 413 104 b 478 -14 413 6 436 -14 b 629 102 533 -14 583 26 b 642 132 638 117 642 125 b 629 145 642 141 636 145 b 608 127 619 145 615 138 b 534 49 580 84 553 49 b 523 62 526 49 523 53 b 606 317 523 112 606 238 b 528 395 606 353 588 395 z', + }, + dynamicForte: { + x_min: -141, + x_max: 364, + y_min: -152, + y_max: 444, + ha: 596, + o: 'm 23 380 b 0 357 7 380 0 373 b 22 336 0 343 7 336 l 105 336 b 117 330 114 336 117 336 b 114 315 117 327 115 323 l 23 0 b -101 -187 -17 -141 -43 -187 b -127 -174 -120 -187 -127 -181 b -92 -156 -127 -163 -114 -170 b -63 -102 -75 -144 -63 -125 b -128 -43 -63 -65 -89 -43 b -203 -122 -171 -43 -203 -78 b -95 -219 -203 -186 -156 -219 b 161 17 14 -219 82 -145 b 269 317 203 105 235 194 l 271 318 b 289 336 271 323 282 336 l 383 336 b 406 359 399 336 406 343 b 384 380 406 373 399 380 l 298 380 b 284 387 288 380 284 380 b 287 405 284 392 285 396 b 419 606 315 530 347 606 b 442 595 431 606 442 603 b 419 580 442 586 435 588 b 389 526 400 572 389 552 b 454 465 389 485 418 465 b 524 543 491 465 524 490 b 400 639 524 596 491 639 b 135 402 261 639 183 540 b 107 380 128 380 127 380 z', + }, + dynamicRinforzando: { + x_min: -20, + x_max: 277, + y_min: 0, + y_max: 274, + ha: 274, + o: 'm 324 395 b 235 350 287 395 256 374 b 215 330 222 336 220 330 b 203 360 207 330 213 337 b 145 393 194 379 174 393 b -19 251 75 393 27 337 b -29 223 -26 238 -29 230 b -13 207 -29 213 -22 207 b 9 226 -3 207 3 215 b 107 338 52 301 81 338 b 122 321 118 338 122 331 b 114 285 122 310 118 295 l 9 24 b 4 9 6 17 4 13 b 20 0 4 3 9 0 l 91 0 b 114 17 104 0 108 3 l 207 251 b 304 351 226 298 272 351 b 318 343 312 351 318 348 b 287 285 318 330 287 325 b 338 239 287 256 308 239 b 399 318 373 239 399 268 b 324 395 399 360 377 395 z', + }, + dynamicSforzando: { + x_min: 0, + x_max: 229, + y_min: -10, + y_max: 273, + ha: 283, + o: 'm 212 393 b 68 274 127 393 68 350 b 145 161 68 223 95 196 b 200 85 187 132 200 114 b 127 20 200 53 173 20 b 66 42 91 20 66 32 b 91 56 66 49 75 46 b 111 98 104 65 111 79 b 59 145 111 127 86 145 b 0 78 24 145 0 117 b 125 -14 0 30 49 -14 b 291 120 219 -14 291 36 b 220 232 291 160 276 190 b 151 314 168 271 151 287 b 213 361 151 337 168 361 b 258 346 238 361 258 356 b 240 333 258 340 251 340 b 226 298 232 325 226 314 b 276 252 226 269 248 252 b 330 307 311 252 330 279 b 212 393 330 360 285 393 z', + }, + dynamicZ: { + x_min: -30, + x_max: 244, + y_min: -10, + y_max: 268, + ha: 278, + o: 'm 333 386 b 298 377 321 386 314 382 b 239 370 282 373 259 370 b 94 383 153 370 111 383 b 68 364 79 383 72 377 l 33 264 b 29 242 30 255 29 248 b 45 228 29 232 36 228 b 66 249 55 228 60 236 l 81 279 b 96 297 85 288 88 297 b 168 292 102 297 127 292 b 223 302 194 292 215 302 b 196 269 229 302 197 271 l -26 45 b -43 16 -37 33 -43 27 b -24 -1 -43 6 -36 -1 b 4 16 -12 -1 -3 10 b 39 30 16 24 27 30 b 179 -14 79 30 108 -14 b 297 102 259 -14 297 43 b 245 166 297 147 271 166 b 197 115 219 166 197 145 b 236 72 197 88 216 72 b 259 79 251 72 255 79 b 264 75 262 79 264 78 b 258 60 264 72 261 66 b 229 45 252 50 242 45 b 117 95 186 45 173 95 b 85 86 98 95 89 86 b 102 111 85 86 95 104 l 333 338 b 351 370 344 350 351 359 b 333 386 351 380 343 386 z', + }, + ornamentTrill: { + x_min: 0, + x_max: 521, + y_min: -10, + y_max: 390, + ha: 400, + o: 'm 383 562 b 364 557 377 562 369 559 l 294 534 b 269 511 281 530 275 526 l 217 384 b 206 367 212 370 210 367 b 179 380 200 367 192 374 b 118 393 158 389 140 393 b 0 292 50 393 0 353 b 95 210 0 248 30 210 b 140 213 112 210 131 213 b 144 209 143 213 144 212 b 140 194 144 206 143 202 l 124 156 b 96 58 108 117 96 88 b 179 -14 96 17 124 -14 b 325 153 253 -14 325 46 b 307 251 325 187 320 219 b 302 265 304 258 302 261 b 334 294 302 274 311 281 l 343 298 b 455 348 393 328 428 348 b 474 327 468 348 474 344 b 465 285 474 312 469 295 l 360 24 b 356 9 357 17 356 13 b 372 0 356 3 360 0 l 442 0 b 465 17 455 0 459 3 l 559 251 b 655 351 577 298 624 351 b 670 343 664 351 670 348 b 638 285 670 330 638 325 b 690 239 638 256 660 239 b 750 318 724 239 750 268 b 675 395 750 360 729 395 b 586 350 638 395 608 374 b 566 330 573 336 572 330 b 553 361 559 330 564 340 b 490 393 543 380 521 393 b 347 348 432 393 377 364 b 312 333 328 338 320 333 b 308 337 310 333 308 334 b 315 359 308 343 312 351 l 387 537 b 392 553 390 544 392 549 b 383 562 392 559 389 562 z m 118 360 b 192 325 134 360 192 347 b 186 307 192 321 189 314 l 180 292 b 148 265 173 274 167 269 b 98 258 130 261 112 258 b 39 301 50 258 39 281 b 118 360 39 327 60 360 z m 272 240 b 292 151 285 240 292 164 b 212 30 292 88 253 30 b 196 48 200 30 196 37 b 207 92 196 59 202 78 b 264 230 207 94 209 94 b 272 240 266 238 268 240 z', + }, + ornamentTurn: { + x_min: 0, + x_max: 460, + y_min: 0, + y_max: 218, + ha: 218, + o: 'm 534 314 b 454 251 490 314 454 294 b 505 199 454 219 475 199 b 579 232 547 199 549 232 b 626 164 603 232 626 202 b 533 72 626 102 583 72 b 377 180 487 72 439 111 b 150 312 307 258 243 312 b 0 148 55 312 0 240 b 128 0 0 45 66 0 b 209 63 173 0 209 20 b 157 115 209 95 187 115 b 84 82 115 115 114 82 b 36 150 59 82 36 112 b 130 242 36 212 79 242 b 285 134 176 242 223 203 b 513 1 356 56 419 1 b 662 166 608 1 662 73 b 534 314 662 269 596 314 z', + }, + ornamentTurnSlash: { + x_min: 0, + x_max: 460, + y_min: -90, + y_max: 306, + ha: 396, + o: 'm 333 441 b 310 418 315 441 310 433 l 310 274 b 302 252 310 258 308 252 b 261 278 294 252 287 262 b 150 311 228 298 192 311 b 0 147 55 311 0 239 b 128 -1 0 43 66 -1 b 209 62 173 -1 209 19 b 157 114 209 94 187 114 b 84 81 115 114 114 81 b 36 148 59 81 36 111 b 130 240 36 210 79 240 b 285 128 176 240 222 197 b 307 79 304 108 307 105 l 307 -107 b 330 -130 307 -122 312 -130 b 353 -107 347 -130 353 -122 l 353 37 b 360 59 353 53 353 59 b 402 33 369 59 376 49 b 513 0 435 13 471 0 b 662 164 608 0 662 72 b 534 312 662 268 596 312 b 454 249 490 312 454 292 b 505 197 454 217 475 197 b 579 230 547 197 549 230 b 626 163 603 230 626 200 b 533 71 626 101 583 71 b 377 183 487 71 441 114 b 356 232 359 203 356 206 l 356 418 b 333 441 356 433 350 441 z', + }, + ornamentMordent: { + x_min: 1, + x_max: 729, + y_min: -73, + y_max: 319, + ha: 392, + o: 'm 546 265 l 546 459 l 501 459 l 501 216 l 459 167 b 439 167 454 160 445 160 b 302 327 387 228 310 317 b 258 353 291 338 282 351 b 226 340 245 353 238 348 l 20 107 b 1 73 12 98 1 84 b 30 59 1 65 9 59 b 88 94 53 59 73 79 b 144 143 107 109 124 127 b 176 161 158 154 168 161 b 197 144 183 161 189 156 l 323 10 b 351 0 328 3 340 0 b 377 9 361 0 372 3 b 498 114 392 17 475 94 l 498 -105 l 544 -105 l 544 153 b 562 160 550 157 556 160 b 585 144 569 160 576 156 b 710 10 590 135 697 24 b 737 0 716 3 727 0 b 765 9 749 0 759 3 b 1030 295 776 17 1011 274 l 1032 300 b 1050 328 1041 308 1050 318 b 1012 353 1050 343 1024 353 b 986 343 1002 353 994 348 b 854 190 971 330 871 206 b 828 176 842 180 835 176 b 802 190 818 176 809 183 b 681 333 791 202 696 320 b 645 353 668 344 657 353 b 613 340 634 353 626 350 b 580 304 600 330 590 315 z', + }, + ornamentShortTrill: { + x_min: 0, + x_max: 725, + y_min: 0, + y_max: 245, + ha: 245, + o: 'm 429 167 l 301 325 b 256 353 291 338 282 350 b 225 340 246 353 238 350 b 16 105 158 268 88 186 b 0 72 9 96 0 86 b 29 58 0 63 7 58 b 71 76 42 58 55 62 l 158 154 b 174 160 163 158 168 160 b 197 143 181 160 187 154 b 321 10 203 135 310 24 b 350 0 327 3 338 0 b 377 7 361 0 372 3 l 533 148 b 554 160 543 158 550 160 b 577 143 562 160 566 156 b 703 10 585 135 690 24 b 732 0 708 3 720 0 b 759 7 743 0 753 3 b 1024 294 769 16 1005 272 b 1044 327 1032 305 1044 321 b 1005 353 1044 341 1018 353 b 979 343 996 353 988 348 b 848 189 963 330 864 204 b 821 174 837 179 828 174 b 796 189 811 174 804 181 b 674 331 783 202 688 318 b 641 351 662 343 651 351 b 606 340 628 351 619 350 b 573 304 593 328 583 315 b 444 167 533 259 491 213 b 429 167 439 161 433 161 z', + }, + ornamentTremblement: { + x_min: 1, + x_max: 985, + y_min: 0, + y_max: 244, + ha: 244, + o: 'm 678 325 b 634 351 667 338 657 350 b 602 338 621 351 613 348 l 448 167 b 439 167 446 164 441 164 l 302 325 b 258 351 291 338 281 350 b 228 338 245 351 238 348 b 193 304 215 328 204 315 l 19 107 b 1 72 13 96 1 76 b 30 58 1 63 9 58 b 89 92 52 58 73 78 l 144 141 b 148 144 145 143 147 143 b 176 160 160 153 170 160 b 199 143 183 160 189 154 b 324 10 204 134 311 23 b 351 0 330 3 340 0 b 379 7 363 0 373 3 l 530 148 b 552 160 536 154 546 160 b 575 143 559 160 564 154 b 698 10 580 134 687 23 b 727 0 704 3 716 0 b 755 7 739 0 749 3 l 907 147 b 930 160 922 158 923 160 b 952 143 937 160 943 154 l 1077 10 b 1107 0 1084 3 1096 0 b 1133 7 1117 0 1128 3 b 1398 294 1143 16 1380 272 b 1418 327 1407 305 1418 321 b 1381 351 1418 343 1394 351 b 1354 341 1371 351 1362 348 b 1223 189 1338 328 1238 204 b 1195 174 1211 179 1202 174 b 1171 189 1185 174 1178 181 b 1048 331 1158 200 1063 318 b 1012 351 1035 343 1024 351 b 981 338 1002 351 994 350 b 948 304 968 328 958 315 b 827 166 907 258 865 212 b 815 166 824 163 818 163 b 678 325 760 226 732 264 z', + }, + ornamentPrecompAppoggTrill: { + x_min: 0, + x_max: 1119, + y_min: 0, + y_max: 481, + ha: 481, + o: 'm 1015 163 b 873 328 963 223 880 318 b 828 354 860 344 847 353 b 796 341 816 354 809 351 b 763 305 783 331 773 317 b 642 168 721 261 681 215 b 636 163 641 167 639 164 b 494 328 585 223 501 318 b 449 354 481 344 468 353 b 418 341 438 354 431 351 b 384 305 405 331 395 317 b 264 168 343 261 302 215 l 242 144 b 144 88 232 124 171 88 b 79 197 81 88 79 189 l 79 648 b 60 693 79 683 71 693 b 52 691 58 693 55 693 b 0 616 3 672 0 625 l 0 207 b 121 0 0 40 68 0 b 249 68 168 0 232 53 b 279 94 262 75 271 86 b 336 144 298 111 315 128 b 367 163 350 156 360 163 b 389 145 374 163 380 157 b 514 12 395 137 501 26 b 543 1 520 4 531 1 b 569 9 553 1 563 4 b 636 73 576 14 605 43 l 658 94 b 714 144 677 111 694 128 b 746 163 729 156 739 163 b 768 145 753 163 759 157 b 893 12 773 137 880 26 b 922 1 899 4 910 1 b 948 9 932 1 942 4 l 1012 71 b 1037 94 1022 78 1030 86 b 1092 144 1054 111 1073 128 b 1123 161 1106 156 1115 161 b 1146 145 1130 161 1136 157 b 1270 12 1152 137 1259 26 b 1299 1 1276 4 1287 1 b 1326 9 1310 1 1320 4 b 1591 297 1336 19 1572 275 b 1611 328 1600 307 1611 320 b 1574 354 1611 343 1585 354 b 1548 344 1565 354 1555 350 b 1416 192 1532 331 1431 206 b 1388 177 1404 181 1395 177 b 1365 190 1380 177 1371 184 b 1243 333 1352 203 1256 321 b 1205 354 1228 346 1217 354 b 1174 341 1195 354 1187 351 b 1140 305 1161 330 1152 317 z', + }, + ornamentPrecompSlideTrillDAnglebert: { + x_min: 2, + x_max: 1150, + y_min: -367, + y_max: 245, + ha: 612, + o: 'm 1058 160 b 916 327 1007 220 923 317 b 871 353 903 343 890 351 b 840 340 860 353 852 350 b 806 304 827 330 816 315 b 685 167 765 259 724 213 l 680 160 l 615 235 b 419 344 582 275 523 344 b 3 -144 258 344 3 26 b 4 -168 3 -153 3 -160 b 246 -482 24 -315 99 -422 b 458 -528 340 -521 410 -528 b 514 -526 485 -528 504 -526 b 552 -508 531 -526 552 -517 b 514 -497 552 -503 541 -498 l 503 -497 b 194 -390 432 -494 298 -488 b 69 -151 194 -390 69 -279 b 184 96 69 -60 128 27 b 328 183 202 118 258 183 b 477 96 413 183 454 118 b 559 10 510 62 552 19 b 588 0 566 3 576 0 b 613 7 598 0 609 3 b 723 112 622 14 681 73 b 789 161 733 122 776 161 b 811 144 796 161 802 156 b 936 10 816 135 923 24 b 965 0 942 3 953 0 b 991 7 975 0 985 3 b 1051 66 996 12 1022 37 b 1081 92 1063 73 1073 84 b 1136 143 1099 109 1117 127 b 1168 160 1151 154 1159 160 b 1191 144 1175 160 1181 156 b 1315 10 1197 135 1303 24 b 1344 0 1320 3 1332 0 b 1371 7 1355 0 1365 3 b 1636 295 1381 17 1617 274 b 1656 327 1644 305 1656 318 b 1619 353 1656 341 1630 353 b 1593 343 1610 353 1600 348 b 1460 190 1577 330 1476 204 b 1433 176 1449 180 1440 176 b 1410 189 1424 176 1416 183 b 1287 331 1397 202 1300 320 b 1250 353 1273 344 1261 353 b 1218 340 1240 353 1231 350 b 1185 304 1205 328 1197 315 z', + }, + ornamentPrecompSlideTrillBach: { + x_min: 0, + x_max: 1048, + y_min: -367, + y_max: 331, + ha: 698, + o: 'm 1038 477 l 979 477 l 979 238 l 912 160 b 769 327 858 220 775 317 b 724 353 756 343 743 351 b 693 340 713 353 706 350 b 660 304 680 330 670 315 b 539 167 618 259 577 213 b 533 161 536 166 534 163 b 390 327 480 220 396 317 b 346 353 377 343 364 351 l 340 353 b 308 340 330 353 321 350 b 275 304 295 330 285 315 b 117 122 220 243 168 186 b 0 -144 68 62 0 -48 b 1 -168 0 -153 0 -160 b 243 -482 22 -315 96 -422 b 455 -528 337 -521 408 -528 b 511 -526 482 -528 501 -526 b 549 -508 528 -526 549 -517 b 511 -497 549 -503 539 -498 l 500 -497 b 192 -390 429 -494 295 -488 b 68 -177 192 -390 84 -298 b 66 -151 66 -168 66 -160 b 189 105 66 -58 127 35 b 232 143 203 118 216 131 b 264 161 246 154 256 161 b 285 144 271 161 276 156 b 410 10 291 135 397 24 b 439 0 416 3 428 0 b 465 7 449 0 459 3 l 531 72 b 554 92 540 78 547 86 b 611 143 573 109 590 127 b 642 161 625 154 635 161 b 664 144 649 161 655 156 b 789 10 670 135 776 24 b 818 0 795 3 806 0 b 844 7 828 0 838 3 b 904 66 850 12 876 37 b 935 92 916 73 924 84 b 979 134 949 107 963 121 l 979 -88 l 1037 -88 l 1037 151 l 1044 144 b 1168 10 1050 135 1156 24 b 1197 0 1174 3 1185 0 b 1224 7 1208 0 1218 3 b 1489 295 1234 17 1470 274 b 1509 327 1498 305 1509 318 b 1472 353 1509 341 1483 353 b 1446 343 1463 353 1453 348 b 1313 190 1430 330 1329 204 b 1286 176 1302 180 1293 176 b 1263 189 1277 176 1269 183 b 1140 331 1250 202 1153 320 b 1103 353 1126 344 1115 353 b 1071 340 1093 353 1084 350 b 1038 304 1058 328 1050 315 z', + }, + ornamentPrecompTrillSuffixDandrieu: { + x_min: 0, + x_max: 949, + y_min: 0, + y_max: 381, + ha: 381, + o: 'm 1367 314 b 1250 521 1367 419 1318 482 b 1107 549 1211 537 1145 549 b 1083 546 1096 549 1087 549 b 1066 528 1071 540 1066 534 b 1079 520 1066 524 1070 520 b 1323 351 1187 517 1323 487 b 1201 171 1323 269 1260 219 b 1194 166 1201 171 1198 168 b 1056 327 1142 226 1063 317 b 1011 353 1043 343 1030 351 b 979 340 999 353 992 350 b 946 304 966 330 956 315 b 825 167 904 259 864 213 l 821 161 b 678 327 768 222 685 317 b 634 353 665 343 652 351 b 602 340 622 353 615 350 b 569 304 589 330 579 315 b 448 167 527 259 487 213 l 444 161 b 301 327 390 222 308 317 b 256 353 288 343 275 351 b 225 340 245 353 238 350 b 192 304 212 330 202 315 b 71 167 150 259 109 213 b 17 105 52 147 36 127 b 0 73 10 98 0 84 b 29 58 0 65 7 58 b 86 92 56 59 72 79 b 143 143 105 109 122 127 b 174 161 157 154 167 161 b 196 144 181 161 187 156 b 321 10 202 135 308 24 b 350 0 327 3 338 0 b 376 7 360 0 370 3 b 485 112 384 14 444 73 b 552 161 495 122 539 161 b 573 144 559 161 564 156 b 698 10 579 135 685 24 b 727 0 704 3 716 0 b 753 7 737 0 747 3 b 863 112 762 14 821 73 b 929 161 873 122 916 161 b 950 144 936 161 942 156 b 1076 10 956 135 1063 24 b 1104 0 1081 3 1093 0 b 1130 7 1115 0 1125 3 b 1236 108 1139 14 1195 69 b 1367 314 1297 160 1367 233 z', + }, + ornamentPrecompDoubleCadenceUpperPrefix: { + x_min: 0, + x_max: 1278, + y_min: 0, + y_max: 247, + ha: 247, + o: 'm 1801 356 b 1776 346 1793 356 1783 351 b 1642 192 1760 333 1659 206 b 1614 177 1630 181 1621 177 b 1591 190 1606 177 1597 184 b 1469 334 1578 203 1482 323 b 1430 356 1453 347 1441 356 b 1398 343 1420 356 1411 353 b 1365 307 1385 331 1377 318 l 1240 164 b 1097 330 1187 226 1104 320 b 1053 356 1084 346 1071 354 b 1021 343 1041 356 1034 353 b 988 307 1008 333 998 318 b 865 168 946 262 904 216 l 861 163 b 717 330 808 223 724 320 b 672 356 704 346 691 354 b 641 343 661 356 654 353 b 608 307 628 333 618 318 b 485 168 566 262 524 216 l 455 134 b 284 46 409 88 351 46 b 16 285 148 46 32 265 b 3 295 9 292 4 295 b 0 291 1 295 0 292 b 1 285 0 288 1 285 b 308 0 42 190 157 0 b 530 120 415 1 482 63 b 559 144 539 128 549 137 b 590 163 573 156 583 163 b 612 145 598 163 603 157 b 739 10 618 137 724 24 b 768 0 744 3 756 0 b 793 7 778 0 788 3 b 903 114 802 14 861 75 l 939 144 b 971 163 953 156 963 163 b 992 145 978 163 984 157 b 1119 10 998 137 1106 24 b 1148 0 1125 3 1136 0 b 1174 7 1158 0 1168 3 b 1284 114 1182 14 1241 75 b 1316 144 1282 115 1312 141 b 1348 161 1331 156 1339 161 b 1371 145 1355 161 1361 157 b 1496 10 1377 137 1485 24 b 1525 0 1502 3 1513 0 b 1552 7 1536 0 1547 3 b 1819 298 1562 17 1800 276 b 1840 330 1829 308 1840 320 b 1832 344 1840 334 1837 340 b 1801 356 1820 351 1810 356 z', + }, + ornamentPrecompDoubleCadenceUpperPrefixTurn: { + x_min: 0, + x_max: 1277, + y_min: -62, + y_max: 333, + ha: 395, + o: 'm 1273 202 l 1273 480 l 1230 480 l 1230 174 l 1097 328 b 1053 354 1084 344 1071 353 b 1021 341 1041 354 1034 351 b 988 305 1008 331 998 317 b 865 167 945 261 904 215 l 861 161 b 717 328 808 222 724 318 b 672 354 704 344 691 353 b 641 341 661 354 654 351 b 608 305 628 331 618 317 b 485 167 564 261 524 215 b 455 132 474 156 465 144 b 284 45 410 88 350 45 b 14 284 148 45 30 264 b 3 294 9 291 4 294 b 0 289 1 294 0 291 b 1 284 0 287 1 284 b 308 -1 42 189 157 -1 b 530 118 415 0 481 62 b 557 143 539 127 547 135 b 590 161 572 154 582 161 b 612 144 598 161 603 156 b 737 9 618 135 724 24 b 768 -1 743 1 755 -1 b 793 6 778 -1 788 1 b 903 112 802 13 861 73 l 937 143 b 971 161 953 154 963 161 b 992 144 978 161 984 156 b 1117 9 998 135 1104 24 b 1148 -1 1123 1 1136 -1 b 1174 6 1158 -1 1168 1 l 1230 60 l 1230 -89 l 1273 -89 l 1273 102 l 1283 112 b 1348 160 1295 125 1332 160 b 1371 144 1355 160 1361 156 b 1496 9 1377 135 1483 24 b 1525 -1 1502 1 1513 -1 b 1552 6 1536 -1 1547 1 b 1819 297 1562 16 1800 275 b 1839 328 1827 307 1839 320 b 1801 354 1839 343 1813 354 b 1776 344 1793 354 1783 350 b 1642 190 1760 331 1657 206 b 1614 176 1630 180 1621 176 b 1591 189 1606 176 1597 183 b 1467 333 1578 203 1480 321 b 1430 354 1453 346 1441 354 b 1398 341 1420 354 1411 351 b 1365 305 1385 330 1377 317 z', + }, + ornamentPrecompTrillLowerSuffix: { + x_min: 0, + x_max: 859, + y_min: -222, + y_max: 246, + ha: 468, + o: 'm 1164 217 b 1031 351 1138 259 1063 351 b 1011 337 1020 351 1024 347 b 828 167 952 291 886 217 l 824 164 b 683 328 772 225 690 318 b 638 354 670 344 657 353 b 606 341 626 354 619 351 b 573 305 593 331 583 317 b 451 167 530 261 490 215 l 446 161 b 302 328 393 222 310 318 b 258 354 289 344 276 353 b 226 341 246 354 239 351 b 193 305 213 331 203 317 b 71 167 150 261 109 215 b 17 105 52 147 36 127 b 0 73 10 98 0 84 b 29 58 0 65 7 58 b 86 92 56 59 72 79 b 143 143 105 109 122 127 b 176 161 157 154 168 161 b 197 144 183 161 189 156 b 323 9 203 135 310 23 b 353 -1 328 1 340 -1 b 379 6 363 -1 373 1 b 488 112 387 13 446 73 l 523 143 b 556 161 539 154 549 161 b 577 144 563 161 569 156 b 703 9 583 135 690 23 b 733 -1 708 1 721 -1 b 759 6 743 -1 753 1 b 868 112 768 13 827 73 b 955 183 878 122 943 183 b 1081 107 965 183 1031 153 b 1156 -89 1128 63 1156 6 l 1156 -102 b 948 -297 1156 -204 1048 -297 b 806 -271 904 -297 850 -282 l 792 -266 b 801 -288 792 -268 795 -282 b 948 -320 809 -297 880 -320 b 1237 -50 1092 -320 1237 -199 b 1164 217 1237 75 1218 122 z', + }, + brassScoop: { + x_min: 1, + x_max: 320, + y_min: -373, + y_max: 13, + ha: 386, + o: 'm 35 -537 b 461 -12 194 -518 461 -289 b 438 19 461 13 451 19 b 410 -9 425 19 413 9 b 35 -425 357 -366 92 -403 b 1 -482 13 -433 1 -438 l 1 -505 b 26 -537 1 -526 3 -537 z', + }, + brassDoitMedium: { + x_min: 0, + x_max: 489, + y_min: -40, + y_max: 346, + ha: 386, + o: 'm 33 -58 b 704 468 255 -58 683 186 b 681 498 704 494 693 498 b 654 471 668 498 658 488 b 33 55 550 118 91 76 b 0 -3 12 46 0 42 l 0 -26 b 24 -58 0 -46 1 -58 z', + }, + brassFallLipShort: { + x_min: 1, + x_max: 293, + y_min: -345, + y_max: 42, + ha: 387, + o: 'm 22 60 b 1 35 4 60 1 52 l 1 6 b 26 -50 3 -40 10 -43 b 32 -52 27 -50 30 -50 b 376 -469 85 -73 327 -111 b 400 -497 379 -487 387 -497 b 422 -467 412 -497 422 -491 b 32 60 422 -187 177 40 z', + }, + brassLiftMedium: { + x_min: 0, + x_max: 811, + y_min: 0, + y_max: 852, + ha: 852, + o: 'm 1138 1220 b 1135 1225 1135 1223 1135 1224 b 1129 1227 1133 1227 1130 1227 b 1117 1207 1122 1227 1117 1212 l 1117 1201 b 1109 1164 1117 1187 1117 1172 b 1100 1156 1107 1161 1104 1158 b 959 1104 1058 1128 995 1140 b 929 1032 936 1081 929 1056 b 932 1007 929 1024 930 1015 b 923 976 932 995 930 985 l 914 971 b 773 919 873 942 809 955 b 743 847 750 896 743 870 b 746 821 743 838 744 829 b 737 791 746 809 744 799 l 729 783 b 588 733 687 756 624 769 b 557 661 564 710 557 684 b 560 635 557 652 559 644 b 552 605 560 624 559 612 l 543 598 b 402 547 501 570 438 583 b 372 475 379 524 372 498 b 374 449 372 467 373 458 b 366 419 374 438 373 426 l 357 412 b 216 361 315 384 252 397 b 186 289 193 338 186 312 b 189 264 186 281 187 272 b 180 233 189 252 187 240 b 171 226 177 232 174 229 b 30 176 130 199 66 212 b 0 104 7 153 0 128 b 33 0 0 88 14 0 b 49 17 40 0 49 10 b 71 63 52 35 56 49 b 212 115 102 95 154 59 b 239 186 230 134 239 160 b 236 210 239 194 238 202 b 256 249 239 225 243 236 b 397 301 288 281 340 245 b 425 372 416 320 425 346 b 422 396 425 380 423 387 b 442 435 425 410 429 422 b 583 487 474 467 526 431 b 611 557 602 505 611 531 b 608 582 611 566 609 573 b 628 621 611 596 615 608 b 769 672 660 652 711 618 b 796 743 788 691 796 717 b 793 768 796 752 795 759 b 814 806 796 782 801 793 b 955 858 845 838 897 804 b 982 929 973 877 982 903 b 979 953 982 937 981 945 b 999 992 982 968 986 979 b 1140 1045 1031 1024 1083 989 b 1168 1116 1161 1066 1168 1090 b 1138 1220 1168 1162 1145 1207 z', + }, + brassFallRoughMedium: { + x_min: 0, + x_max: 811, + y_min: 0, + y_max: 852, + ha: 852, + o: 'm 30 1220 b 0 1116 23 1207 0 1162 b 27 1045 0 1090 7 1066 b 168 992 85 989 137 1024 b 189 953 181 979 186 968 b 186 929 187 945 186 937 b 213 858 186 903 194 877 b 354 806 271 804 323 838 b 374 768 367 793 372 782 b 372 743 373 759 372 752 b 399 672 372 717 380 691 b 540 621 456 618 508 652 b 560 582 553 608 557 596 b 557 557 559 573 557 566 b 585 487 557 531 566 505 b 726 435 642 431 694 467 b 746 396 739 422 743 410 b 743 372 744 387 743 380 b 770 301 743 346 752 320 b 912 249 828 245 880 281 b 932 210 924 236 929 225 b 929 186 930 202 929 194 b 956 115 929 160 937 134 b 1097 63 1014 59 1066 95 b 1119 17 1112 49 1116 35 b 1135 0 1119 10 1128 0 b 1168 104 1153 0 1168 91 b 1138 176 1168 128 1161 153 b 996 226 1102 212 1038 199 b 988 233 994 229 991 232 b 979 264 981 240 979 252 b 982 289 981 272 982 281 b 952 361 982 312 975 338 b 811 412 916 397 852 384 l 802 419 b 793 449 795 426 793 438 b 796 475 795 458 796 467 b 766 547 796 498 789 524 b 625 598 730 583 667 570 l 616 605 b 608 635 609 612 608 624 b 611 661 609 644 611 652 b 580 733 611 684 603 710 b 439 783 544 769 481 756 l 431 791 b 422 821 423 799 422 809 b 425 847 423 829 425 838 b 395 919 425 870 418 896 b 253 971 359 955 295 942 l 245 976 b 236 1007 238 985 236 995 b 239 1032 238 1015 239 1024 b 209 1104 239 1056 232 1081 b 68 1156 173 1140 109 1128 b 59 1164 63 1158 60 1161 b 50 1201 50 1172 50 1187 l 50 1207 b 39 1227 50 1212 46 1227 b 33 1225 37 1227 35 1227 b 30 1220 33 1224 33 1223 z', + }, + brassBend: { + x_min: 0, + x_max: 392, + y_min: 0, + y_max: 282, + ha: 282, + o: 'm 282 0 b 552 72 369 0 456 23 b 564 92 560 75 564 84 l 564 383 b 541 406 564 395 554 406 b 518 383 528 406 518 395 l 518 107 b 282 46 435 65 357 46 b 46 107 207 46 130 65 l 46 383 b 23 406 46 395 36 406 b 0 383 10 406 0 395 l 0 92 b 13 72 0 84 4 75 b 282 0 108 23 196 0 z', + }, + brassMuteClosed: { + x_min: 0, + x_max: 272, + y_min: 0, + y_max: 272, + ha: 272, + o: 'm 392 219 l 219 219 l 219 392 l 173 392 l 173 219 l 0 219 l 0 173 l 173 173 l 173 0 l 219 0 l 219 173 l 392 173 z', + }, + brassMuteOpen: { + x_min: 0, + x_max: 304, + y_min: 0, + y_max: 304, + ha: 304, + o: 'm 219 0 b 438 219 340 0 438 98 b 219 438 438 340 340 438 b 0 219 98 438 0 340 b 219 0 0 98 98 0 z m 219 392 b 392 219 314 392 392 314 b 219 46 392 124 314 46 b 46 219 124 46 46 124 b 219 392 46 314 124 392 z', + }, + brassFlip: { + x_min: 0, + x_max: 379, + y_min: 0, + y_max: 282, + ha: 282, + o: 'm 523 0 b 541 9 530 0 536 3 b 546 22 544 13 546 17 b 536 42 546 29 541 36 l 36 402 b 23 406 33 405 27 406 b 0 383 12 406 0 395 l 0 23 b 23 0 0 10 10 0 b 46 23 36 0 46 10 l 46 337 l 508 4 b 523 0 513 1 517 0 z', + }, + brassJazzTurn: { + x_min: 0, + x_max: 620, + y_min: 0, + y_max: 245, + ha: 245, + o: 'm 792 190 b 765 176 780 179 772 176 b 740 190 755 176 747 183 b 629 325 727 202 644 312 b 593 347 616 338 605 347 b 562 334 583 346 575 344 b 528 298 549 323 539 310 l 406 176 b 389 168 406 176 399 168 b 374 176 384 168 379 170 b 245 325 360 192 245 325 b 200 353 232 343 219 351 b 168 340 190 353 181 350 l 17 156 b 0 121 10 147 0 132 b 16 107 0 114 4 108 b 84 143 26 107 76 137 b 118 160 92 150 108 160 b 141 143 125 160 131 154 b 265 10 147 135 253 24 b 294 0 271 3 282 0 b 321 7 305 0 315 3 b 498 160 321 7 478 158 b 521 143 505 160 513 154 b 647 10 528 135 635 24 b 675 0 652 3 664 0 b 703 7 687 0 697 3 b 874 186 713 16 855 164 b 893 220 881 196 893 212 b 873 245 890 235 883 243 b 796 194 847 245 815 213 z', + }, + brassSmear: { + x_min: 1, + x_max: 306, + y_min: 0, + y_max: 170, + ha: 170, + o: 'm 193 79 b 308 0 219 50 264 0 b 439 117 396 0 438 102 b 439 120 439 118 439 118 l 441 125 b 441 128 441 127 441 127 b 433 141 441 135 439 141 b 416 130 429 141 423 137 b 343 94 390 107 370 94 b 269 153 315 94 294 121 l 265 158 b 144 245 239 190 180 245 b 6 134 62 245 10 143 b 1 114 3 125 1 118 b 7 107 1 108 4 107 b 36 122 13 107 22 112 b 92 151 55 137 65 151 b 183 89 125 151 161 112 b 189 84 184 88 187 86 z', + }, + stringsDownBow: { + x_min: 0, + x_max: 312, + y_min: 0, + y_max: 318, + ha: 318, + o: 'm 37 458 b 0 420 17 458 0 441 l 0 17 b 17 0 0 7 9 0 l 37 0 b 55 17 46 0 55 7 l 55 253 b 225 278 55 269 140 278 b 395 253 310 278 395 269 l 395 17 b 413 0 395 7 403 0 l 432 0 b 449 17 441 0 449 7 l 449 420 b 412 458 449 441 432 458 z', + }, + stringsUpBow: { + x_min: 1, + x_max: 249, + y_min: 1, + y_max: 495, + ha: 494, + o: 'm 181 1 b 206 22 193 1 203 10 l 359 683 l 359 688 b 338 713 359 700 351 710 l 333 713 b 308 694 321 713 311 706 l 180 140 l 53 694 b 27 713 49 706 39 713 l 22 713 b 1 690 10 710 1 700 b 3 683 1 687 1 685 l 154 22 b 181 1 157 10 167 1 z', + }, + stringsHarmonic: { + x_min: 0, + x_max: 200, + y_min: 0, + y_max: 200, + ha: 200, + o: 'm 288 144 b 144 288 288 225 223 288 b 0 144 65 288 0 225 b 144 0 0 65 65 0 b 288 144 223 0 288 65 z m 144 249 b 249 144 203 249 249 203 b 144 39 249 86 203 39 b 39 144 86 39 39 86 b 144 249 39 203 86 249 z', + }, + pluckedSnapPizzicatoAbove: { + x_min: 0, + x_max: 200, + y_min: 0, + y_max: 300, + ha: 300, + o: 'm 0 144 b 144 0 0 63 65 0 b 288 144 223 0 288 63 b 167 285 288 215 235 275 l 167 432 l 121 432 l 121 285 b 0 144 52 275 0 215 z m 121 246 l 121 144 l 167 144 l 167 246 b 249 144 213 236 249 193 b 144 39 249 85 202 39 b 39 144 85 39 39 85 b 121 246 39 193 73 236 z', + }, + pluckedSnapPizzicatoBelow: { + x_min: 0, + x_max: 200, + y_min: 0, + y_max: 300, + ha: 300, + o: 'm 288 288 b 144 432 288 369 223 432 b 0 288 65 432 0 369 b 121 145 0 216 52 157 l 121 0 l 167 0 l 167 145 b 288 288 235 157 288 216 z m 167 186 l 167 288 l 121 288 l 121 186 b 39 288 75 196 39 238 b 144 393 39 347 86 393 b 249 288 203 393 249 347 b 167 186 249 238 215 196 z', + }, + pluckedLeftHandPizzicato: { + x_min: 0, + x_max: 272, + y_min: 0, + y_max: 272, + ha: 272, + o: 'm 392 219 l 219 219 l 219 392 l 173 392 l 173 219 l 0 219 l 0 173 l 173 173 l 173 0 l 219 0 l 219 173 l 392 173 z', + }, + keyboardPedalPed: { + x_min: 0, + x_max: 1019, + y_min: -8, + y_max: 555, + ha: 563, + o: 'm 413 799 b 179 749 327 798 261 789 b 0 517 107 713 0 632 b 122 376 0 454 37 376 b 240 540 189 376 240 452 b 225 586 240 579 233 586 b 204 549 213 586 212 573 b 138 480 199 527 181 480 b 85 549 96 480 85 517 l 85 554 b 353 762 89 690 230 762 b 373 752 364 762 373 760 b 351 708 373 740 360 723 b 274 546 330 675 274 585 b 353 416 274 508 333 444 b 412 304 372 390 412 351 b 382 228 412 275 403 256 b 334 190 363 202 361 200 b 147 29 271 167 147 88 b 196 -12 147 4 171 -12 b 343 108 239 -12 279 33 l 363 132 b 387 150 370 141 376 150 b 543 -4 445 150 467 -4 b 631 42 567 -4 586 0 l 668 78 b 685 89 674 84 680 89 b 696 75 688 89 690 86 b 809 -9 717 29 753 -9 b 946 66 854 -9 894 13 b 988 107 971 92 981 107 b 1002 89 994 107 996 99 b 1152 -4 1030 36 1077 -4 b 1329 248 1238 -4 1329 82 b 792 717 1329 556 1047 665 b 766 720 785 719 775 720 b 747 703 752 720 747 711 b 780 680 747 693 756 685 b 1223 222 1028 621 1223 504 b 1152 39 1223 122 1205 39 b 1073 229 1104 39 1073 132 b 1132 423 1073 314 1086 377 b 1142 442 1140 432 1142 436 b 1126 458 1142 451 1136 458 b 1093 446 1119 458 1109 455 b 975 216 1022 408 975 337 l 975 190 b 943 121 975 160 972 150 b 852 69 899 76 877 69 b 776 148 816 69 786 117 b 773 163 775 154 773 158 b 786 177 773 167 776 170 l 801 187 b 937 366 867 235 937 284 b 844 454 937 422 900 454 b 665 217 711 454 665 331 b 671 153 665 197 667 176 l 671 147 b 662 134 671 143 670 140 b 605 111 639 118 625 111 b 521 160 572 111 546 135 b 451 203 497 184 474 197 b 426 212 435 207 426 206 b 436 230 426 216 429 220 b 510 389 464 269 510 340 b 429 521 510 435 480 462 b 369 629 387 570 369 599 b 402 720 369 648 384 691 b 462 763 425 759 446 763 b 611 624 540 763 611 704 b 564 575 611 592 590 575 b 501 602 540 575 520 582 b 474 622 492 611 487 622 b 459 603 465 622 459 615 b 603 471 459 570 510 471 b 711 588 670 471 711 524 b 422 799 711 742 554 799 z m 815 403 b 848 343 838 403 848 383 b 780 226 848 295 824 261 b 765 217 773 220 768 217 b 759 228 762 217 759 220 b 756 282 757 245 756 262 b 815 403 756 346 772 403 z m 1405 124 b 1344 62 1369 124 1344 98 b 1405 0 1344 26 1369 0 b 1467 62 1441 0 1467 26 b 1405 124 1467 98 1441 124 z', + }, + keyboardPedalUp: { + x_min: 0, + x_max: 450, + y_min: 0, + y_max: 450, + ha: 450, + o: 'm 582 396 b 516 367 554 396 533 384 b 465 340 495 347 487 340 l 458 340 b 412 377 432 340 412 348 b 432 409 412 387 419 396 l 438 415 b 490 429 451 428 464 429 b 575 501 534 429 575 452 b 501 575 575 541 541 575 b 429 490 452 575 429 534 b 415 438 429 464 428 451 l 409 432 b 377 412 396 419 387 412 b 340 458 348 412 340 432 l 340 465 b 367 516 340 487 347 495 b 396 582 384 533 396 554 b 324 648 396 625 363 648 b 252 582 285 648 252 625 b 281 516 252 554 264 533 b 308 465 301 495 308 487 l 308 458 b 271 412 308 432 300 412 b 239 432 261 412 252 419 l 233 438 b 219 490 220 451 219 464 b 147 575 219 534 196 575 b 73 501 107 575 73 541 b 158 429 73 452 114 429 b 210 415 184 429 197 428 l 216 409 b 236 377 229 396 236 387 b 190 340 236 348 216 340 l 183 340 b 132 367 161 340 153 347 b 66 396 115 384 94 396 b 0 324 23 396 0 363 b 66 252 0 285 23 252 b 132 281 94 252 115 264 b 183 308 153 301 161 308 l 190 308 b 236 271 216 308 236 300 b 216 239 236 261 229 252 l 210 233 b 158 219 197 220 184 219 b 73 147 114 219 73 196 b 147 73 73 107 107 73 b 219 158 196 73 219 114 b 233 210 219 184 220 197 l 239 216 b 271 236 252 229 261 236 b 308 190 300 236 308 216 l 308 183 b 281 132 308 161 301 153 b 252 66 264 115 252 94 b 324 0 252 23 285 0 b 396 66 363 0 396 23 b 367 132 396 94 384 115 b 340 183 347 153 340 161 l 340 190 b 377 236 340 216 348 236 b 409 216 387 236 396 229 l 415 210 b 429 158 428 197 429 184 b 501 73 429 114 452 73 b 575 147 541 73 575 107 b 490 219 575 196 534 219 b 438 233 464 219 451 220 l 432 239 b 412 271 419 252 412 261 b 458 308 412 300 432 308 l 465 308 b 516 281 487 308 495 301 b 582 252 533 264 554 252 b 648 324 625 252 648 285 b 582 396 648 363 625 396 z m 324 271 b 271 324 291 271 271 291 b 324 377 271 357 291 377 b 377 324 357 377 377 357 b 324 271 377 291 357 271 z', + }, + pictChokeCymbal: { + x_min: 1, + x_max: 152, + y_min: 2, + y_max: 251, + ha: 249, + o: 'm 104 361 b 1 271 42 361 1 321 b 82 190 1 222 35 190 b 122 160 118 190 122 160 b 125 144 124 154 125 150 b 102 88 125 124 115 105 b 37 32 78 56 40 35 b 26 17 32 29 26 26 l 27 16 b 37 3 29 6 33 3 b 181 102 85 3 158 66 b 219 239 210 147 219 197 l 219 249 b 104 361 219 317 170 361 z', + }, + wiggleArpeggiatoUp: { + x_min: -33, + x_max: 292, + y_min: 0, + y_max: 119, + ha: 119, + o: 'm 130 171 b -39 68 16 171 -14 91 b -48 53 -45 62 -48 58 b -29 42 -48 46 -39 42 b -10 46 -23 42 -16 43 b 56 63 12 56 29 63 b 248 0 121 63 135 0 b 419 127 361 0 410 104 b 420 132 420 130 420 131 b 412 140 420 137 416 140 b 386 130 403 140 392 134 b 334 107 367 117 353 107 b 318 108 330 107 324 107 b 240 138 289 112 265 128 b 130 171 209 153 168 171 z', + }, + arrowheadBlackUp: { + x_min: 0, + x_max: 228, + y_min: 0, + y_max: 299, + ha: 299, + o: 'm 166 431 b 0 20 111 274 0 30 b 16 0 0 12 6 0 l 17 1 b 166 50 43 16 160 50 b 310 1 171 50 289 13 l 311 0 b 328 20 321 0 328 12 b 166 431 328 30 220 274 z', + }, + arrowheadBlackDown: { + x_min: 0, + x_max: 228, + y_min: 0, + y_max: 299, + ha: 299, + o: 'm 166 0 b 328 410 220 157 328 400 b 311 431 328 419 321 431 l 310 429 b 166 380 289 418 171 380 b 17 429 160 380 43 415 l 16 431 b 0 410 6 431 0 419 b 166 0 0 400 111 157 z', + }, + arpeggiatoUp: { + x_min: 1, + x_max: 229, + y_min: 7, + y_max: 1511, + ha: 1504, + o: 'm 219 1848 l 330 1848 l 164 2176 l 1 1848 l 121 1848 b 92 1778 115 1822 101 1800 l 89 1773 b 59 1668 75 1741 59 1702 b 96 1555 59 1614 76 1580 b 99 1551 98 1554 99 1551 l 102 1547 b 124 1496 115 1531 124 1515 b 122 1482 124 1492 124 1488 b 92 1404 118 1453 102 1428 b 59 1293 78 1372 59 1332 b 105 1172 59 1234 81 1198 b 124 1120 118 1155 124 1143 l 122 1113 b 122 1110 122 1113 122 1112 b 92 1032 118 1081 102 1057 b 59 922 78 1001 59 960 b 115 792 59 855 86 816 b 124 760 121 782 124 773 b 122 744 124 756 124 750 b 92 667 118 716 102 693 b 59 556 78 635 59 595 b 108 433 59 495 82 458 b 124 389 117 420 124 408 b 122 374 124 384 124 379 b 92 298 118 346 102 323 l 89 292 b 59 186 75 261 59 222 b 163 19 59 73 140 42 b 177 10 168 13 173 10 b 189 29 184 10 189 19 b 184 48 189 35 187 42 b 167 114 174 69 167 85 b 230 305 167 179 229 193 b 181 423 230 357 209 396 b 167 484 173 442 167 458 b 230 675 167 547 229 563 b 179 796 230 729 206 769 b 167 850 171 812 167 827 b 230 1040 167 913 229 929 b 183 1158 230 1092 209 1130 b 167 1220 173 1178 167 1194 b 230 1411 167 1284 229 1300 b 186 1526 230 1462 210 1499 b 167 1594 176 1529 167 1584 b 230 1786 167 1659 229 1673 b 219 1848 230 1809 226 1829 z', + }, + arpeggiatoDown: { + x_min: 1, + x_max: 229, + y_min: -4, + y_max: 1500, + ha: 1504, + o: 'm 219 323 b 230 384 226 341 230 361 b 167 576 229 497 167 511 b 186 644 167 586 176 641 b 230 759 210 671 230 708 b 167 950 229 870 167 886 b 183 1012 167 976 173 992 b 230 1130 209 1040 230 1079 b 167 1320 229 1241 167 1257 b 179 1374 167 1344 171 1358 b 230 1495 206 1401 230 1441 b 167 1686 229 1607 167 1623 b 181 1747 167 1712 173 1728 b 230 1865 209 1774 230 1813 b 167 2056 229 1977 167 1992 b 184 2123 167 2085 174 2101 b 189 2141 187 2128 189 2136 b 177 2160 189 2151 184 2160 b 163 2151 173 2160 168 2157 b 59 1984 140 2128 59 2097 b 89 1878 59 1948 75 1909 l 92 1872 b 122 1796 102 1848 118 1824 b 124 1781 124 1791 124 1786 b 108 1737 124 1763 117 1750 b 59 1614 82 1712 59 1675 b 92 1503 59 1575 78 1535 b 122 1426 102 1477 118 1454 b 124 1410 124 1420 124 1414 b 115 1378 124 1397 121 1388 b 59 1248 86 1354 59 1315 b 92 1138 59 1210 78 1169 b 122 1060 102 1113 118 1089 b 122 1057 122 1058 122 1058 l 124 1050 b 105 998 124 1027 118 1015 b 59 877 81 972 59 936 b 92 766 59 838 78 798 b 122 688 102 742 118 717 b 124 674 124 683 124 678 b 102 624 124 655 115 639 l 99 619 b 96 615 99 619 98 616 b 59 503 76 590 59 556 b 89 397 59 468 75 429 l 92 392 b 121 323 101 370 115 348 l 1 323 l 164 -6 l 330 323 z', + }, + repeat1Bar: { + x_min: 0, + x_max: 532, + y_min: -250, + y_max: 279, + ha: 529, + o: 'm 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z m 89 288 b 0 197 40 288 0 248 b 89 108 0 148 40 108 b 180 197 140 108 180 148 b 89 288 180 248 140 288 z m 675 -71 b 586 -161 626 -71 586 -111 b 675 -251 586 -210 626 -251 b 766 -161 726 -251 766 -210 b 675 -71 766 -111 726 -71 z', + }, + repeat2Bars: { + x_min: 0, + x_max: 762, + y_min: -250, + y_max: 279, + ha: 529, + o: 'm 1090 380 b 1097 395 1094 386 1097 390 b 1089 402 1097 399 1094 402 l 936 402 b 910 380 927 402 920 393 l 336 -340 b 331 -350 333 -343 331 -347 b 343 -360 331 -356 336 -360 l 485 -360 b 516 -340 498 -360 508 -348 z m 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z m 89 288 b 0 197 40 288 0 248 b 89 108 0 148 40 108 b 180 197 140 108 180 148 b 89 288 180 248 140 288 z m 1007 -71 b 917 -161 958 -71 917 -111 b 1007 -251 917 -210 958 -251 b 1097 -161 1057 -251 1097 -210 b 1007 -71 1097 -111 1057 -71 z', + }, + repeat4Bars: { + x_min: 0, + x_max: 1232, + y_min: -250, + y_max: 279, + ha: 529, + o: 'm 1767 380 b 1774 395 1771 386 1774 390 b 1765 402 1774 399 1771 402 l 1613 402 b 1587 380 1604 402 1597 393 l 1012 -340 b 1008 -350 1009 -343 1008 -347 b 1020 -360 1008 -356 1012 -360 l 1162 -360 b 1192 -340 1175 -360 1185 -348 z m 1436 380 b 1443 395 1440 386 1443 390 b 1434 402 1443 399 1440 402 l 1282 402 b 1256 380 1273 402 1266 393 l 681 -340 b 677 -350 678 -343 677 -347 b 688 -360 677 -356 681 -360 l 831 -360 b 861 -340 844 -360 854 -348 z m 1090 380 b 1097 395 1094 386 1097 390 b 1089 402 1097 399 1094 402 l 936 402 b 910 380 927 402 920 393 l 336 -340 b 331 -350 333 -343 331 -347 b 343 -360 331 -356 336 -360 l 485 -360 b 516 -340 498 -360 508 -348 z m 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z m 89 288 b 0 197 40 288 0 248 b 89 108 0 148 40 108 b 180 197 140 108 180 148 b 89 288 180 248 140 288 z m 1683 -71 b 1594 -161 1634 -71 1594 -111 b 1683 -251 1594 -210 1634 -251 b 1774 -161 1734 -251 1774 -210 b 1683 -71 1774 -111 1734 -71 z', + }, + repeatBarSlash: { + x_min: 0, + x_max: 532, + y_min: -250, + y_max: 279, + ha: 529, + o: 'm 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z', + }, + csymDiminished: { + x_min: 0, + x_max: 473, + y_min: 0, + y_max: 473, + ha: 473, + o: 'm 341 681 b 0 341 153 681 0 530 b 341 0 0 153 153 0 b 681 341 530 0 681 153 b 341 681 681 530 530 681 z m 341 618 b 618 341 495 618 618 495 b 341 63 618 189 494 63 b 63 341 187 63 63 187 b 341 618 63 494 189 618 z', + }, + csymHalfDiminished: { + x_min: -16, + x_max: 488, + y_min: -15, + y_max: 489, + ha: 504, + o: 'm 703 660 l 658 704 l 557 603 b 340 681 498 652 422 681 b -1 341 151 681 -1 530 b 78 124 -1 259 29 183 l -23 23 l 22 -22 l 122 79 b 340 0 181 30 258 0 b 680 341 528 0 680 153 b 602 559 680 423 651 500 z m 62 341 b 340 618 62 494 187 618 b 513 559 403 618 464 598 l 122 168 b 62 341 84 217 62 278 z m 616 341 b 340 63 616 189 492 63 b 167 124 276 63 216 85 l 557 514 b 616 341 596 465 616 405 z', + }, + csymAugmented: { + x_min: 0, + x_max: 395, + y_min: 1, + y_max: 396, + ha: 395, + o: 'm 569 318 l 317 318 l 317 570 l 253 570 l 253 318 l 0 318 l 0 255 l 253 255 l 253 1 l 317 1 l 317 255 l 569 255 z', + }, + csymMajorSeventh: { + x_min: 0, + x_max: 558, + y_min: 1, + y_max: 477, + ha: 476, + o: 'm 402 687 l 0 1 l 804 1 z m 402 562 l 693 65 l 111 65 z', + }, + csymMinor: { + x_min: 0, + x_max: 325, + y_min: 216, + y_max: 260, + ha: 44, + o: 'm 468 374 l 0 374 l 0 311 l 468 311 z', + }, + csymParensLeftTall: { + x_min: 1, + x_max: 185, + y_min: 0, + y_max: 997, + ha: 997, + o: 'm 266 48 b 261 65 266 55 264 62 b 92 719 157 212 92 400 b 262 1371 92 1037 154 1228 b 266 1394 266 1378 266 1394 l 266 1424 b 264 1436 266 1431 266 1436 b 259 1434 262 1436 259 1434 b 1 719 84 1261 1 1011 b 259 1 1 429 79 177 b 264 0 261 0 262 0 b 266 9 265 0 266 6 z', + }, + csymParensRightTall: { + x_min: -20, + x_max: 164, + y_min: 0, + y_max: 997, + ha: 997, + o: 'm -29 9 b -26 0 -29 6 -27 0 b -22 1 -24 0 -23 0 b 236 719 158 177 236 429 b -22 1434 236 1011 154 1261 b -26 1436 -22 1434 -24 1436 b -29 1424 -29 1436 -29 1431 l -29 1394 b -24 1371 -29 1394 -29 1378 b 145 719 84 1228 145 1037 b -23 65 145 400 81 212 b -29 48 -26 62 -29 55 z', + }, + csymBracketLeftTall: { + x_min: 0, + x_max: 155, + y_min: 0, + y_max: 1000, + ha: 1000, + o: 'm 217 0 b 223 9 220 0 223 4 l 223 37 b 217 46 223 42 220 46 l 92 46 l 92 1394 l 217 1394 b 223 1403 220 1394 223 1398 l 223 1431 b 217 1440 223 1436 220 1440 l 6 1440 b 0 1436 3 1440 0 1439 l 0 4 b 6 0 0 1 3 0 z', + }, + csymBracketRightTall: { + x_min: 1, + x_max: 156, + y_min: 0, + y_max: 1000, + ha: 1000, + o: 'm 219 0 b 225 4 222 0 225 1 l 225 1436 b 219 1440 225 1439 222 1440 l 7 1440 b 1 1431 4 1440 1 1436 l 1 1403 b 7 1394 1 1398 4 1394 l 132 1394 l 132 46 l 7 46 b 1 37 4 46 1 42 l 1 9 b 7 0 1 4 4 0 z', + }, + csymParensLeftVeryTall: { + x_min: 0, + x_max: 122, + y_min: 0, + y_max: 993, + ha: 993, + o: 'm 176 32 b 171 49 176 39 174 46 b 60 716 104 194 60 399 b 173 1382 60 1032 101 1241 b 176 1405 176 1390 176 1405 l 176 1427 b 173 1430 176 1428 174 1430 b 0 716 40 1297 0 978 b 170 3 0 428 50 179 b 171 0 170 1 170 0 b 176 6 173 0 176 4 z', + }, + csymParensRightVeryTall: { + x_min: -15, + x_max: 107, + y_min: 0, + y_max: 993, + ha: 993, + o: 'm -22 6 b -17 0 -22 4 -19 0 b -16 3 -16 0 -16 1 b 154 716 104 179 154 428 b -19 1430 154 978 114 1297 b -22 1427 -20 1430 -22 1428 l -22 1405 b -19 1382 -22 1405 -22 1390 b 94 716 53 1241 94 1032 b -17 49 94 399 50 194 b -22 32 -20 46 -22 39 z', + }, + csymDiagonalArrangementSlash: { + x_min: 0, + x_max: 999, + y_min: 0, + y_max: 1000, + ha: 1000, + o: 'm 1439 1380 l 1377 1440 l 0 60 l 62 0 z', + }, + accSagittal5v7KleismaUp: { + x_min: 0, + x_max: 156, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 -35 b 135 -112 68 -86 99 -112 b 225 68 194 -112 225 -53 l 180 68 b 144 -4 180 20 168 -4 b 122 0 138 -4 131 -3 b 23 248 86 14 52 96 l 0 248 z', + }, + accSagittal5v7KleismaDown: { + x_min: 0, + x_max: 156, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 23 -248 b 122 0 52 -96 86 -14 b 144 4 131 3 138 4 b 180 -68 168 4 180 -20 l 225 -68 b 135 112 225 53 194 112 b 45 35 99 112 68 86 l 45 517 l 0 517 z', + }, + accSagittal5CommaUp: { + x_min: 0, + x_max: 156, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 225 -517 l 225 248 l 203 248 l 0 -112 l 0 -284 l 180 33 l 180 -517 z', + }, + accSagittal5CommaDown: { + x_min: 0, + x_max: 156, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 180 517 l 180 -33 l 0 284 l 0 112 l 203 -248 l 225 -248 l 225 517 z', + }, + accSagittal7CommaUp: { + x_min: 0, + x_max: 156, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 248 l 0 -517 l 45 -517 l 45 112 l 89 112 b 180 -68 150 112 180 53 l 180 -248 l 225 -248 l 225 68 b 135 248 225 187 194 248 z', + }, + accSagittal7CommaDown: { + x_min: 0, + x_max: 156, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 135 -248 b 225 -68 194 -248 225 -187 l 225 248 l 180 248 l 180 68 b 89 -112 180 -53 150 -112 l 45 -112 l 45 517 l 0 517 l 0 -248 z', + }, + accSagittal25SmallDiesisUp: { + x_min: 0, + x_max: 250, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -157 l 0 -259 l 315 -89 l 315 -517 l 360 -517 l 360 248 l 337 248 l 0 68 l 0 -33 l 315 135 l 315 10 z', + }, + accSagittal25SmallDiesisDown: { + x_min: 0, + x_max: 250, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 315 -10 l 315 -135 l 0 33 l 0 -68 l 337 -248 l 360 -248 l 360 517 l 315 517 l 315 89 l 0 259 l 0 157 z', + }, + accSagittal35MediumDiesisUp: { + x_min: 0, + x_max: 281, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -284 l 180 33 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -68 330 112 360 53 l 360 -248 l 405 -248 l 405 68 b 315 248 405 187 374 248 l 203 248 l 0 -112 z', + }, + accSagittal35MediumDiesisDown: { + x_min: 0, + x_max: 281, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 112 l 203 -248 l 315 -248 b 405 -68 374 -248 405 -187 l 405 248 l 360 248 l 360 68 b 271 -112 360 -53 330 -112 l 225 -112 l 225 517 l 180 517 l 180 -33 l 0 284 z', + }, + accSagittal11MediumDiesisUp: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 225 53 l 225 -517 l 271 -517 l 271 53 l 495 -248 l 495 -89 l 248 248 l 0 -89 l 0 -248 z', + }, + accSagittal11MediumDiesisDown: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 248 l 0 89 l 248 -248 l 495 89 l 495 248 l 271 -53 l 271 517 l 225 517 l 225 -53 z', + }, + accSagittal11LargeDiesisUp: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 112 l 315 112 b 449 -68 405 112 449 53 l 449 -248 l 495 -248 l 495 68 b 360 248 495 187 449 248 l 135 248 b 0 68 45 248 0 187 z', + }, + accSagittal11LargeDiesisDown: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 360 -248 b 495 -68 449 -248 495 -187 l 495 248 l 449 248 l 449 68 b 315 -112 449 -53 405 -112 l 271 -112 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z', + }, + accSagittal35LargeDiesisUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 248 -248 l 540 112 l 540 274 l 271 -58 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z', + }, + accSagittal35LargeDiesisDown: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 248 -248 l 540 112 l 540 274 l 269 -58 l 269 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z', + }, + accSagittalSharp25SDown: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 b 112 -112 0 -53 36 -112 l 135 -112 l 135 -517 l 180 -517 l 180 -89 b 248 26 206 -65 229 -27 b 315 -89 264 -27 287 -65 l 315 -517 l 360 -517 l 360 -112 l 383 -112 b 495 68 458 -112 495 -53 l 449 68 b 399 -4 449 20 433 -4 b 248 248 297 -4 261 171 b 122 0 216 96 176 14 b 94 -4 112 -3 102 -4 b 45 68 60 -4 45 20 z', + }, + accSagittalFlat25SUp: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 45 -68 b 94 4 45 -20 60 4 b 122 0 102 4 112 3 b 248 -248 176 -14 216 -96 b 399 4 261 -171 297 4 b 449 -68 433 4 449 -20 l 495 -68 b 383 112 495 53 458 112 l 360 112 l 360 517 l 315 517 l 315 89 b 248 -26 287 65 264 27 b 180 89 229 27 206 65 l 180 517 l 135 517 l 135 112 l 112 112 b 0 -68 36 112 0 53 z', + }, + accSagittalSharp7CDown: { + x_min: 0, + x_max: 250, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 112 l 89 112 b 180 104 124 112 154 109 l 180 -517 l 225 -517 l 225 89 b 315 -68 285 60 315 9 l 315 -248 l 360 -248 l 360 68 b 135 248 360 187 285 248 l 0 248 z', + }, + accSagittalFlat7CUp: { + x_min: 0, + x_max: 250, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 135 -248 b 360 -68 285 -248 360 -187 l 360 248 l 315 248 l 315 68 b 225 -89 315 -9 285 -60 l 225 517 l 180 517 l 180 -104 b 89 -112 154 -109 124 -112 l 45 -112 l 45 517 l 0 517 z', + }, + accSagittalSharp5CDown: { + x_min: 0, + x_max: 281, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -517 l 45 71 l 180 -56 l 180 -517 l 225 -517 l 225 -98 l 405 -268 l 405 -112 l 23 248 l 0 248 l 0 -517 z', + }, + accSagittalFlat5CUp: { + x_min: 0, + x_max: 281, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 517 l 0 -248 l 23 -248 l 405 112 l 405 268 l 225 98 l 225 517 l 180 517 l 180 56 l 45 -71 l 45 517 z', + }, + accSagittalSharp5v7kDown: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -112 l 0 -276 l 135 -82 l 135 -517 l 180 -517 l 180 -17 l 271 112 l 315 112 l 315 -517 l 360 -517 l 360 107 b 449 -68 420 89 449 30 l 449 -248 l 495 -248 l 495 68 b 360 248 495 189 449 248 l 248 248 z', + }, + accSagittalFlat5v7kUp: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 248 -248 l 360 -248 b 495 -68 449 -248 495 -189 l 495 248 l 449 248 l 449 68 b 360 -107 449 -30 420 -89 l 360 517 l 315 517 l 315 -112 l 271 -112 l 180 17 l 180 517 l 135 517 l 135 82 l 0 276 l 0 112 z', + }, + accSagittalSharp: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 180 -53 l 180 -517 l 225 -517 l 225 0 l 292 85 l 360 0 l 360 -517 l 405 -517 l 405 -53 l 585 -274 l 585 -112 l 292 248 l 0 -112 l 0 -274 z', + }, + accSagittalFlat: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 274 l 0 112 l 292 -248 l 585 112 l 585 274 l 405 53 l 405 517 l 360 517 l 360 0 l 292 -85 l 225 0 l 225 517 l 180 517 l 180 53 z', + }, + accSagittalSharp5v7kUp: { + x_min: 0, + x_max: 312, + y_min: -361, + y_max: 172, + ha: 533, + o: 'm 45 -517 l 45 -10 b 135 -92 68 -48 98 -75 l 135 -520 l 180 -520 l 180 -108 b 248 -115 203 -112 225 -115 b 271 -112 256 -115 264 -115 l 271 -517 l 315 -517 l 315 -107 b 449 68 405 -89 449 -30 l 405 68 b 297 -4 405 19 369 -4 b 23 248 131 -4 56 85 l 0 248 l 0 -517 z', + }, + accSagittalFlat5v7kDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 361, + ha: 533, + o: 'm 0 517 l 0 -248 l 23 -248 b 297 4 56 -85 131 4 b 405 -68 369 4 405 -19 l 449 -68 b 315 107 449 30 405 89 l 315 517 l 271 517 l 271 112 b 248 115 264 115 256 115 b 180 108 225 115 203 112 l 180 520 l 135 520 l 135 92 b 45 10 98 75 68 48 l 45 517 z', + }, + accSagittalSharp5CUp: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -266 l 135 -153 l 135 -517 l 180 -517 l 180 -115 l 271 -39 l 271 -517 l 315 -517 l 315 0 l 405 75 l 405 -517 l 449 -517 l 449 248 l 428 248 l 0 -112 z', + }, + accSagittalFlat5CDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 112 l 428 -248 l 449 -248 l 449 517 l 405 517 l 405 -75 l 315 0 l 315 517 l 271 517 l 271 39 l 180 115 l 180 517 l 135 517 l 135 153 l 0 266 z', + }, + accSagittalSharp7CUp: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 112 l 135 112 l 135 -517 l 180 -517 l 180 108 b 271 89 213 105 243 99 l 271 -517 l 315 -517 l 315 73 b 405 -68 374 45 405 -3 l 405 -248 l 449 -248 l 449 68 b 135 248 449 187 346 248 l 0 248 z', + }, + accSagittalFlat7CDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 135 -248 b 449 -68 346 -248 449 -187 l 449 248 l 405 248 l 405 68 b 315 -73 405 3 374 -45 l 315 517 l 271 517 l 271 -89 b 180 -108 243 -99 213 -105 l 180 517 l 135 517 l 135 -112 l 45 -112 l 45 517 l 0 517 z', + }, + accSagittalSharp25SUp: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -30 l 495 143 l 495 14 l 0 -157 l 0 -255 l 225 -177 l 225 -517 l 271 -517 l 271 -161 l 360 -130 l 360 -517 l 405 -517 l 405 -115 l 495 -84 l 495 -517 l 540 -517 l 540 248 l 517 248 l 0 68 z', + }, + accSagittalFlat25SDown: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 l 517 -248 l 540 -248 l 540 517 l 495 517 l 495 84 l 405 115 l 405 517 l 360 517 l 360 130 l 271 161 l 271 517 l 225 517 l 225 177 l 0 255 l 0 157 l 495 -14 l 495 -143 l 0 30 z', + }, + accSagittalSharp35MUp: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -112 l 0 -274 l 135 -108 l 135 -517 l 180 -517 l 180 -53 l 271 58 l 271 -517 l 315 -517 l 315 112 l 360 112 b 405 109 376 112 390 112 l 405 -517 l 449 -517 l 449 96 b 540 -68 510 72 540 17 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 z', + }, + accSagittalFlat35MDown: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 292 -248 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 449 -96 540 -17 510 -72 l 449 517 l 405 517 l 405 -109 b 360 -112 390 -112 376 -112 l 315 -112 l 315 517 l 271 517 l 271 -58 l 180 53 l 180 517 l 135 517 l 135 108 l 0 274 l 0 112 z', + }, + accSagittalSharp11MUp: { + x_min: 0, + x_max: 469, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -112 l 0 -271 l 180 -79 l 180 -517 l 225 -517 l 225 -30 l 315 65 l 315 -517 l 360 -517 l 360 65 l 449 -30 l 449 -517 l 495 -517 l 495 -79 l 675 -271 l 675 -112 l 337 248 z', + }, + accSagittalFlat11MDown: { + x_min: 0, + x_max: 469, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 337 -248 l 675 112 l 675 271 l 495 79 l 495 517 l 449 517 l 449 30 l 360 -65 l 360 517 l 315 517 l 315 -65 l 225 30 l 225 517 l 180 517 l 180 79 l 0 271 l 0 112 z', + }, + accSagittalSharp11LUp: { + x_min: 0, + x_max: 469, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 112 l 449 112 l 449 -517 l 495 -517 l 495 104 b 631 -68 585 82 631 26 l 631 -248 l 675 -248 l 675 68 b 449 248 675 187 600 248 l 225 248 b 0 68 75 248 0 187 z', + }, + accSagittalFlat11LDown: { + x_min: 0, + x_max: 469, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 449 -248 b 675 -68 600 -248 675 -187 l 675 248 l 631 248 l 631 68 b 495 -104 631 -26 585 -82 l 495 517 l 449 517 l 449 -112 l 360 -112 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z', + }, + accSagittalSharp35LUp: { + x_min: 0, + x_max: 500, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 71 l 452 -17 l 452 -517 l 495 -517 l 495 -56 l 720 -268 l 720 -112 l 337 248 l 225 248 b 0 68 75 248 0 187 z', + }, + accSagittalFlat35LDown: { + x_min: 0, + x_max: 500, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 337 -248 l 720 112 l 720 268 l 495 56 l 495 517 l 452 517 l 452 17 l 360 -71 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z', + }, + accSagittalDoubleSharp25SDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 b 135 -112 0 -53 45 -112 b 243 -62 180 -112 215 -95 l 89 -503 l 143 -517 l 292 -82 l 445 -517 l 495 -503 l 343 -62 b 449 -112 372 -95 408 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 315 148 b 112 -4 274 148 236 -4 b 45 68 68 -4 45 20 z', + }, + accSagittalDoubleFlat25SUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 45 -68 b 112 4 45 -20 68 4 b 292 -248 236 4 274 -148 b 475 4 315 -148 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 b 343 62 408 112 372 95 l 495 503 l 445 517 l 292 82 l 143 517 l 89 503 l 243 62 b 135 112 215 95 180 112 b 0 -68 45 112 0 53 z', + }, + accSagittalDoubleSharp7CDown: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -503 l 52 -517 l 203 -82 l 354 -517 l 405 -503 l 230 0 l 271 108 b 495 -68 420 92 495 35 l 495 -248 l 540 -248 l 540 68 b 225 248 540 187 435 248 l 89 248 l 89 112 l 135 112 l 174 0 z m 213 112 l 203 82 l 192 112 z', + }, + accSagittalDoubleFlat7CUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 174 0 l 135 -112 l 89 -112 l 89 -248 l 225 -248 b 540 -68 435 -248 540 -187 l 540 248 l 495 248 l 495 68 b 271 -108 495 -35 420 -92 l 230 0 l 405 503 l 354 517 l 203 82 l 52 517 l 0 503 z m 192 -112 l 203 -82 l 213 -112 z', + }, + accSagittalDoubleSharp5CDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 405 -503 l 230 0 l 232 4 l 585 -264 l 585 -112 l 112 248 l 89 248 l 89 112 l 151 68 l 174 0 l 0 -503 l 52 -517 l 203 -82 l 354 -517 z', + }, + accSagittalDoubleFlat5CUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 354 517 l 203 82 l 52 517 l 0 503 l 174 0 l 151 -68 l 89 -112 l 89 -248 l 112 -248 l 585 112 l 585 264 l 232 -4 l 230 0 l 405 503 z', + }, + accSagittalDoubleSharp5v7kDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -274 l 252 35 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 360 112 b 540 -68 480 112 540 53 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 l 0 -112 z', + }, + accSagittalDoubleFlat5v7kUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 112 l 292 -248 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 360 -112 540 -53 480 -112 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 252 -35 l 0 274 z', + }, + accSagittalDoubleSharp: { + x_min: 0, + x_max: 469, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 540 -503 l 366 0 l 380 45 l 675 -271 l 675 -112 l 337 248 l 0 -112 l 0 -271 l 295 45 l 310 0 l 135 -503 l 186 -517 l 337 -82 l 488 -517 z', + }, + accSagittalDoubleFlat: { + x_min: 0, + x_max: 469, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 488 517 l 337 82 l 186 517 l 135 503 l 310 0 l 295 -45 l 0 271 l 0 112 l 337 -248 l 675 112 l 675 271 l 380 -45 l 366 0 l 540 503 z', + }, + accSagittal7v11KleismaUp: { + x_min: 0, + x_max: 219, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 68 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 -45 b 248 -112 200 -89 225 -112 b 315 68 292 -112 315 -53 l 271 68 b 248 -4 271 20 264 -4 b 236 0 245 -4 240 -3 b 157 248 213 14 187 96 b 78 0 127 96 101 14 b 65 -4 73 -3 68 -4 b 45 68 50 -4 45 20 l 0 68 b 68 -112 0 -53 23 -112 z', + }, + accSagittal7v11KleismaDown: { + x_min: 0, + x_max: 219, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 68 112 b 0 -68 23 112 0 53 l 45 -68 b 65 4 45 -20 50 4 b 78 0 68 4 73 3 b 157 -248 101 -14 127 -96 b 236 0 187 -96 213 -14 b 248 4 240 3 245 4 b 271 -68 264 4 271 -20 l 315 -68 b 248 112 315 53 292 112 b 180 45 225 112 200 89 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 z', + }, + accSagittal17CommaUp: { + x_min: 0, + x_max: 281, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 -40 b 315 -118 248 -92 279 -118 b 405 62 374 -118 405 -59 l 360 62 b 324 -10 360 14 348 -10 b 302 -6 318 -10 311 -9 b 206 217 268 9 235 84 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z', + }, + accSagittal17CommaDown: { + x_min: 0, + x_max: 281, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 206 -217 b 302 6 235 -84 268 -9 b 324 10 311 9 318 10 b 360 -62 348 10 360 -14 l 405 -62 b 315 118 405 59 374 118 b 225 40 279 118 248 92 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z', + }, + accSagittal55CommaUp: { + x_min: 0, + x_max: 219, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 248 l 0 -517 l 45 -517 l 45 58 l 315 -274 l 315 -112 l 23 248 z', + }, + accSagittal55CommaDown: { + x_min: 0, + x_max: 219, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 23 -248 l 315 112 l 315 274 l 45 -58 l 45 517 l 0 517 l 0 -248 z', + }, + accSagittal7v11CommaUp: { + x_min: 0, + x_max: 188, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -248 l 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 248 l 135 248 b 0 68 45 248 0 187 z', + }, + accSagittal7v11CommaDown: { + x_min: 0, + x_max: 188, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 271 -248 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z', + }, + accSagittal5v11SmallDiesisUp: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 73 l 0 -248 l 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 -40 b 360 -118 295 -92 325 -118 b 449 62 420 -118 449 -59 l 405 62 b 369 -10 405 14 393 -10 b 348 -6 363 -10 356 -9 b 251 217 312 9 279 84 l 248 248 l 135 248 b 0 73 45 248 0 189 z', + }, + accSagittal5v11SmallDiesisDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -73 b 135 -248 0 -189 45 -248 l 248 -248 l 251 -217 b 348 6 279 -84 312 -9 b 369 10 356 9 363 10 b 405 -62 393 10 405 -14 l 449 -62 b 360 118 449 59 420 118 b 271 40 325 118 295 92 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z', + }, + accSagittalSharp5v11SDown: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 112 -23 45 -84 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 b 242 37 203 -23 225 -3 b 315 -89 262 -23 285 -63 l 315 -517 l 360 -517 l 360 -112 l 383 -112 b 495 68 458 -112 495 -53 l 449 68 b 399 -4 449 20 433 -4 b 248 248 297 -4 261 171 b 157 68 222 127 192 68 l 89 68 b 0 -203 30 68 0 -23 z', + }, + accSagittalFlat5v11SUp: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 89 -68 0 23 30 -68 l 157 -68 b 248 -248 192 -68 222 -127 b 399 4 261 -171 297 4 b 449 -68 433 4 449 -20 l 495 -68 b 383 112 495 53 458 112 l 360 112 l 360 517 l 315 517 l 315 89 b 242 -37 285 63 262 23 b 180 23 225 3 203 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 84 z', + }, + accSagittalSharp7v11CDown: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 89 -112 l 89 -517 l 135 -517 l 135 -95 b 206 37 163 -73 187 -30 b 271 -23 225 -3 248 -23 l 271 -517 l 315 -517 l 315 -23 l 383 -23 b 449 -203 428 -23 449 -84 l 495 -203 b 405 68 495 -23 465 68 l 292 68 b 203 248 258 68 228 127 b 101 0 173 98 138 16 b 81 -3 94 0 86 -3 b 45 68 56 -3 45 20 l 0 68 b 89 -112 0 -52 30 -112 z', + }, + accSagittalFlat7v11CUp: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 89 112 b 0 -68 30 112 0 52 l 45 -68 b 81 3 45 -20 56 3 b 101 0 86 3 94 0 b 203 -248 138 -16 173 -98 b 292 -68 228 -127 258 -68 l 405 -68 b 495 203 465 -68 495 23 l 449 203 b 383 23 449 84 428 23 l 315 23 l 315 517 l 271 517 l 271 23 b 206 -37 248 23 225 3 b 135 95 187 30 163 73 l 135 517 l 89 517 z', + }, + accSagittalSharp55CDown: { + x_min: 0, + x_max: 250, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -271 l 135 -125 l 135 -517 l 180 -517 l 180 -78 l 315 65 l 315 -517 l 360 -517 l 360 248 l 337 248 l 0 -112 z', + }, + accSagittalFlat55CUp: { + x_min: 0, + x_max: 250, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 112 l 337 -248 l 360 -248 l 360 517 l 315 517 l 315 -65 l 180 78 l 180 517 l 135 517 l 135 125 l 0 271 z', + }, + accSagittalSharp17CDown: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -248 l 45 -68 b 180 109 45 36 89 95 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -89 292 13 321 -55 l 360 -517 l 405 -517 l 405 -112 l 428 -112 b 540 68 504 -112 540 -53 l 495 68 b 445 -4 495 20 480 -4 b 292 248 343 -4 307 171 l 180 248 b 0 68 60 248 0 187 l 0 -248 z', + }, + accSagittalFlat17CUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 248 l 0 -68 b 180 -248 0 -187 60 -248 l 292 -248 b 445 4 307 -171 343 4 b 495 -68 480 4 495 -20 l 540 -68 b 428 112 540 53 504 112 l 405 112 l 405 517 l 360 517 l 360 89 b 271 -112 321 55 292 -13 l 225 -112 l 225 517 l 180 517 l 180 -109 b 45 68 89 -95 45 -36 l 45 248 z', + }, + accSagittalSharp7v11kDown: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -32 l 405 138 l 405 13 l 0 -157 l 0 -256 l 225 -161 l 225 -517 l 271 -517 l 271 -144 l 405 -86 l 405 -517 l 449 -517 l 449 248 l 428 248 l 0 68 z', + }, + accSagittalFlat7v11kUp: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 l 428 -248 l 449 -248 l 449 517 l 405 517 l 405 86 l 271 144 l 271 517 l 225 517 l 225 161 l 0 256 l 0 157 l 405 -13 l 405 -138 l 0 32 z', + }, + accSagittalSharp7v11kUp: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 135 -112 l 135 -517 l 180 -517 l 180 -105 b 271 -23 217 -94 248 -65 l 271 -517 l 315 -517 l 315 -23 b 405 -105 337 -65 369 -94 l 405 -517 l 449 -517 l 449 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 315 148 b 112 -4 274 148 236 -4 b 45 68 68 -4 45 20 l 0 68 b 135 -112 0 -53 45 -112 z', + }, + accSagittalFlat7v11kDown: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 135 112 b 0 -68 45 112 0 53 l 45 -68 b 112 4 45 -20 68 4 b 292 -248 236 4 274 -148 b 475 4 315 -148 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 l 449 517 l 405 517 l 405 105 b 315 23 369 94 337 65 l 315 517 l 271 517 l 271 23 b 180 105 248 65 217 94 l 180 517 l 135 517 z', + }, + accSagittalSharp17CUp: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 203 -23 b 271 14 229 -23 251 -10 l 271 -517 l 315 -517 l 315 -23 b 405 -105 337 -65 369 -94 l 405 -517 l 449 -517 l 449 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 312 150 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z', + }, + accSagittalFlat17CDown: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 b 475 4 312 -150 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 l 449 517 l 405 517 l 405 105 b 315 23 369 94 337 65 l 315 517 l 271 517 l 271 -14 b 203 23 251 10 229 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z', + }, + accSagittalSharp55CUp: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -517 l 45 78 l 135 10 l 135 -517 l 180 -517 l 180 -23 l 271 -92 l 271 -517 l 315 -517 l 315 -127 l 495 -264 l 495 -112 l 23 248 l 0 248 l 0 -517 z', + }, + accSagittalFlat55CDown: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 517 l 0 -248 l 23 -248 l 495 112 l 495 264 l 315 127 l 315 517 l 271 517 l 271 92 l 180 23 l 180 517 l 135 517 l 135 -10 l 45 -78 l 45 517 z', + }, + accSagittalSharp7v11CUp: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 86 45 6 89 58 l 180 -517 l 225 -517 l 225 98 b 315 109 252 104 282 108 l 315 -517 l 360 -517 l 360 112 l 449 112 l 449 -517 l 495 -517 l 495 248 l 360 248 b 0 68 121 248 0 189 z', + }, + accSagittalFlat7v11CDown: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 360 -248 0 -189 121 -248 l 495 -248 l 495 517 l 449 517 l 449 -112 l 360 -112 l 360 517 l 315 517 l 315 -109 b 225 -98 282 -108 252 -104 l 225 517 l 180 517 l 180 -86 b 45 68 89 -58 45 -6 l 45 248 l 0 248 z', + }, + accSagittalSharp5v11SUp: { + x_min: 0, + x_max: 438, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 -23 b 449 -105 383 -65 415 -94 l 449 -517 l 495 -517 l 495 -112 b 631 68 585 -112 631 -53 l 585 68 b 520 -4 585 20 563 -4 b 337 248 396 -4 360 150 l 225 248 b 0 68 76 248 0 187 z', + }, + accSagittalFlat5v11SDown: { + x_min: 0, + x_max: 438, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 225 -248 0 -187 76 -248 l 337 -248 b 520 4 360 -150 396 4 b 585 -68 563 4 585 -20 l 631 -68 b 495 112 631 53 585 112 l 495 517 l 449 517 l 449 105 b 360 23 415 94 383 65 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z', + }, + accSagittalDoubleSharp5v11SDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 203 -23 b 262 4 225 -23 245 -13 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 341 -60 b 449 -112 370 -95 405 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 312 150 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z', + }, + accSagittalDoubleFlat5v11SUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 b 475 4 312 -150 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 b 341 60 405 112 370 95 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 262 -4 b 203 23 245 13 225 23 l 135 23 b 45 203 75 23 45 84 z', + }, + accSagittalDoubleSharp7v11CDown: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 112 -112 b 193 -73 143 -112 170 -99 l 45 -501 l 95 -517 l 248 -81 l 397 -517 l 449 -503 l 275 0 l 278 4 b 337 -23 295 -13 315 -23 l 405 -23 b 495 -203 465 -23 495 -84 l 540 -203 b 428 68 540 -23 503 68 l 360 68 b 248 248 310 68 271 127 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 112 -112 0 -52 36 -112 z', + }, + accSagittalDoubleFlat7v11CUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 112 112 b 0 -68 36 112 0 52 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 b 360 -68 271 -127 310 -68 l 428 -68 b 540 203 503 -68 540 23 l 495 203 b 405 23 495 84 465 23 l 337 23 b 278 -4 315 23 295 13 l 275 0 l 449 503 l 397 517 l 248 81 l 95 517 l 45 501 l 193 73 b 112 112 170 99 143 112 z', + }, + accSagittalDoubleSharp55CDown: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 428 248 l 0 -112 l 0 -266 l 307 -7 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 366 0 l 386 59 l 449 112 l 449 248 z', + }, + accSagittalDoubleFlat55CUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 449 -248 l 449 -112 l 386 -59 l 366 0 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 307 7 l 0 266 l 0 112 l 428 -248 z', + }, + accSagittalDoubleSharp17CDown: { + x_min: 0, + x_max: 438, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -248 l 45 -68 b 271 112 45 53 120 112 l 310 0 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 387 -62 b 495 -112 416 -95 452 -112 b 631 68 585 -112 631 -53 l 585 68 b 520 -4 585 20 563 -4 b 337 248 396 -4 360 150 l 225 248 b 0 68 76 248 0 187 l 0 -248 z', + }, + accSagittalDoubleFlat17CUp: { + x_min: 0, + x_max: 438, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 248 l 0 -68 b 225 -248 0 -187 76 -248 l 337 -248 b 520 4 360 -150 396 4 b 585 -68 563 4 585 -20 l 631 -68 b 495 112 631 53 585 112 b 387 62 452 112 416 95 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 310 0 l 271 -112 b 45 68 120 -112 45 -53 l 45 248 z', + }, + accSagittalDoubleSharp7v11kDown: { + x_min: 0, + x_max: 438, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 l 0 -30 l 366 96 l 399 0 l 392 -23 l 0 -157 l 0 -255 l 353 -135 l 225 -503 l 276 -517 l 428 -82 l 579 -517 l 631 -503 l 455 0 l 507 145 l 540 157 l 540 248 l 517 248 z m 416 115 l 442 124 l 428 82 z', + }, + accSagittalDoubleFlat7v11kUp: { + x_min: 0, + x_max: 438, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 517 -248 l 540 -248 l 540 -157 l 507 -145 l 455 0 l 631 503 l 579 517 l 428 82 l 276 517 l 225 503 l 353 135 l 0 255 l 0 157 l 392 23 l 399 0 l 366 -96 l 0 30 l 0 -68 z m 428 -82 l 442 -124 l 416 -115 z', + }, + accSagittal23CommaUp: { + x_min: 0, + x_max: 188, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 -4 b 68 -23 53 -17 60 -23 l 180 -23 b 225 -203 210 -23 225 -82 l 271 -203 b 206 68 271 -23 248 68 l 89 68 b 23 248 71 68 48 127 l 0 248 z', + }, + accSagittal23CommaDown: { + x_min: 0, + x_max: 188, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 23 -248 b 89 -68 48 -127 71 -68 l 206 -68 b 271 203 248 -68 271 23 l 225 203 b 180 23 225 82 210 23 l 68 23 b 45 4 60 23 53 17 l 45 517 l 0 517 z', + }, + accSagittal5v19CommaUp: { + x_min: 0, + x_max: 156, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -284 l 180 33 l 180 -517 l 225 -517 l 225 248 l 203 248 b 86 112 151 157 112 112 b 45 157 59 112 45 127 l 0 157 b 76 23 0 72 26 27 l 0 -112 z', + }, + accSagittal5v19CommaDown: { + x_min: 0, + x_max: 156, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 112 l 76 -23 b 0 -157 26 -27 0 -72 l 45 -157 b 86 -112 45 -127 59 -112 b 203 -248 112 -112 151 -157 l 225 -248 l 225 517 l 180 517 l 180 -33 l 0 284 z', + }, + accSagittal5v23SmallDiesisUp: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -284 l 180 33 l 180 -517 l 225 -517 l 225 -4 b 248 -23 233 -17 240 -23 l 360 -23 b 405 -203 390 -23 405 -82 l 449 -203 b 386 68 449 -23 428 68 l 271 68 b 203 248 251 68 228 127 l 0 -112 z', + }, + accSagittal5v23SmallDiesisDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 112 l 203 -248 b 271 -68 228 -127 251 -68 l 386 -68 b 449 203 428 -68 449 23 l 405 203 b 360 23 405 82 390 23 l 248 23 b 225 4 240 23 233 17 l 225 517 l 180 517 l 180 -33 l 0 284 z', + }, + accSagittalSharp5v23SDown: { + x_min: 0, + x_max: 281, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 6 b 89 -23 59 -13 73 -23 l 180 -23 l 180 -517 l 225 -517 l 225 -23 l 292 -23 b 360 -203 337 -23 360 -84 l 405 -203 b 315 68 405 -23 374 68 l 112 68 b 23 248 78 68 48 127 l 0 248 z', + }, + accSagittalFlat5v23SUp: { + x_min: 0, + x_max: 281, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 23 -248 b 112 -68 48 -127 78 -68 l 315 -68 b 405 203 374 -68 405 23 l 360 203 b 292 23 360 84 337 23 l 225 23 l 225 517 l 180 517 l 180 23 l 89 23 b 45 -6 73 23 59 13 l 45 517 l 0 517 z', + }, + accSagittalSharp5v19CDown: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 b 89 -112 0 -52 30 -112 l 89 -517 l 135 -517 l 135 -95 b 225 112 173 -65 203 4 l 271 112 l 271 -517 l 315 -517 l 315 107 b 405 -68 374 89 405 30 l 405 -248 l 449 -248 l 449 68 b 315 248 449 189 405 248 l 203 248 b 101 0 173 98 138 16 b 81 -3 94 0 86 -3 b 45 68 56 -3 45 23 z', + }, + accSagittalFlat5v19CUp: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 45 -68 b 81 3 45 -23 56 3 b 101 0 86 3 94 0 b 203 -248 138 -16 173 -98 l 315 -248 b 449 -68 405 -248 449 -189 l 449 248 l 405 248 l 405 68 b 315 -107 405 -30 374 -89 l 315 517 l 271 517 l 271 -112 l 225 -112 b 135 95 203 -4 173 65 l 135 517 l 89 517 l 89 112 b 0 -68 30 112 0 52 z', + }, + accSagittalSharp23CDown: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 135 -82 l 135 -517 l 180 -517 l 180 -17 l 239 68 b 315 -23 261 7 287 -23 l 315 -517 l 360 -517 l 360 -23 l 428 -23 b 495 -203 472 -23 495 -84 l 540 -203 b 449 68 540 -23 510 68 l 337 68 b 248 248 302 68 271 127 l 0 -112 l 0 -276 z', + }, + accSagittalFlat23CUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 276 l 0 112 l 248 -248 b 337 -68 271 -127 302 -68 l 449 -68 b 540 203 510 -68 540 23 l 495 203 b 428 23 495 84 472 23 l 360 23 l 360 517 l 315 517 l 315 23 b 239 -68 287 23 261 -7 l 180 17 l 180 517 l 135 517 l 135 82 z', + }, + accSagittalSharp23CUp: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 14 b 112 -23 63 -10 86 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 l 271 -517 l 315 -517 l 315 -23 l 360 -23 b 449 -203 420 -23 449 -84 l 495 -203 b 383 68 495 -23 458 68 l 135 68 b 23 248 85 68 48 127 l 0 248 z', + }, + accSagittalFlat23CDown: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 23 -248 b 135 -68 48 -127 85 -68 l 383 -68 b 495 203 458 -68 495 23 l 449 203 b 360 23 449 84 420 23 l 315 23 l 315 517 l 271 517 l 271 23 l 180 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 -14 86 23 63 10 l 45 517 l 0 517 z', + }, + accSagittalSharp5v19CUp: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -112 l 0 -266 l 135 -153 l 135 -517 l 180 -517 l 180 -115 l 271 -39 l 271 -517 l 315 -517 l 315 0 l 405 75 l 405 -517 l 449 -517 l 449 248 l 428 248 b 130 68 285 127 186 68 b 45 157 73 68 45 98 l 0 157 b 112 -20 0 53 37 -6 z', + }, + accSagittalFlat5v19CDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 112 20 b 0 -157 37 6 0 -53 l 45 -157 b 130 -68 45 -98 73 -68 b 428 -248 186 -68 285 -127 l 449 -248 l 449 517 l 405 517 l 405 -75 l 315 0 l 315 517 l 271 517 l 271 39 l 180 115 l 180 517 l 135 517 l 135 153 l 0 266 l 0 112 z', + }, + accSagittalSharp5v23SUp: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 135 -108 l 135 -517 l 180 -517 l 180 -53 l 271 58 l 271 -517 l 315 -517 l 315 14 b 383 -23 334 -10 357 -23 l 405 -23 l 405 -517 l 449 -517 l 449 -23 b 540 -203 510 -23 540 -84 l 585 -203 b 472 68 585 -23 547 68 l 405 68 b 292 248 356 68 318 127 l 0 -112 l 0 -274 z', + }, + accSagittalFlat5v23SDown: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 274 l 0 112 l 292 -248 b 405 -68 318 -127 356 -68 l 472 -68 b 585 203 547 -68 585 23 l 540 203 b 449 23 540 84 510 23 l 449 517 l 405 517 l 405 23 l 383 23 b 315 -14 357 23 334 10 l 315 517 l 271 517 l 271 -58 l 180 53 l 180 517 l 135 517 l 135 108 z', + }, + accSagittalDoubleSharp5v23SDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 52 -517 l 203 -81 l 354 -517 l 405 -503 l 239 -23 l 449 -23 b 540 -203 510 -23 540 -84 l 585 -203 b 472 68 585 -23 547 68 l 225 68 b 112 248 176 68 138 127 l 89 248 l 89 112 b 170 -14 109 45 135 0 l 0 -501 z', + }, + accSagittalDoubleFlat5v23SUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 501 l 170 14 b 89 -112 135 0 109 -45 l 89 -248 l 112 -248 b 225 -68 138 -127 176 -68 l 472 -68 b 585 203 547 -68 585 23 l 540 203 b 449 23 540 84 510 23 l 239 23 l 405 503 l 354 517 l 203 81 l 52 517 z', + }, + accSagittalDoubleSharp5v19CDown: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 b 112 -112 0 -52 36 -112 b 193 -73 143 -112 170 -99 l 45 -501 l 95 -517 l 248 -81 l 397 -517 l 449 -501 l 275 0 l 315 112 b 495 -68 435 112 495 53 l 495 -248 l 540 -248 l 540 68 b 360 248 540 189 480 248 l 248 248 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 z', + }, + accSagittalDoubleFlat5v19CUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 l 360 -248 b 540 -68 480 -248 540 -189 l 540 248 l 495 248 l 495 68 b 315 -112 495 -53 435 -112 l 275 0 l 449 501 l 397 517 l 248 81 l 95 517 l 45 501 l 193 73 b 112 112 170 99 143 112 b 0 -68 36 112 0 52 z', + }, + accSagittalDoubleSharp23CDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 252 35 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 323 4 b 383 -23 340 -13 360 -23 l 449 -23 b 540 -203 510 -23 540 -84 l 585 -203 b 472 68 585 -23 547 68 l 405 68 b 292 248 356 68 318 127 l 0 -112 l 0 -274 z', + }, + accSagittalDoubleFlat23CUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 274 l 0 112 l 292 -248 b 405 -68 318 -127 356 -68 l 472 -68 b 585 203 547 -68 585 23 l 540 203 b 449 23 540 84 510 23 l 383 23 b 323 -4 360 23 340 13 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 252 -35 z', + }, + accSagittal19SchismaUp: { + x_min: 0, + x_max: 125, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 68 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 248 l 157 248 b 79 0 127 98 101 16 b 68 -3 73 0 68 -3 b 45 68 52 -3 45 20 l 0 68 b 68 -112 0 -52 23 -112 z', + }, + accSagittal19SchismaDown: { + x_min: 0, + x_max: 125, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 68 112 b 0 -68 23 112 0 52 l 45 -68 b 68 3 45 -20 52 3 b 79 0 68 3 73 0 b 157 -248 101 -16 127 -98 l 180 -248 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 z', + }, + accSagittal17KleismaUp: { + x_min: 0, + x_max: 156, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 248 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z', + }, + accSagittal17KleismaDown: { + x_min: 0, + x_max: 156, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 225 -248 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z', + }, + accSagittal143CommaUp: { + x_min: 0, + x_max: 156, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -203 l 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 248 l 203 248 b 135 68 177 127 154 68 l 105 68 b 45 157 65 68 45 98 l 0 157 b 23 20 0 95 7 50 b 0 -203 7 -23 0 -98 z', + }, + accSagittal143CommaDown: { + x_min: 0, + x_max: 156, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 23 -20 0 98 7 23 b 0 -157 7 -50 0 -95 l 45 -157 b 105 -68 45 -98 65 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 225 -248 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z', + }, + accSagittal11v49CommaUp: { + x_min: 0, + x_max: 188, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -292 b 89 -157 45 -203 60 -157 l 203 -157 b 225 -143 210 -157 217 -153 l 225 -517 l 271 -517 l 271 248 l 248 248 b 180 157 233 187 210 157 l 68 157 b 0 -68 23 157 0 82 l 45 -68 b 89 68 45 23 60 68 l 203 68 b 225 84 209 68 216 72 l 225 -36 b 180 -68 213 -58 199 -68 l 68 -68 b 0 -292 23 -68 0 -143 z', + }, + accSagittal11v49CommaDown: { + x_min: 0, + x_max: 188, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 292 b 68 68 0 143 23 68 l 180 68 b 225 36 199 68 213 58 l 225 -84 b 203 -68 216 -72 209 -68 l 89 -68 b 45 68 60 -68 45 -23 l 0 68 b 68 -157 0 -82 23 -157 l 180 -157 b 248 -248 210 -157 233 -187 l 271 -248 l 271 517 l 225 517 l 225 143 b 203 157 217 153 210 157 l 89 157 b 45 292 60 157 45 203 z', + }, + accSagittal19CommaUp: { + x_min: 0, + x_max: 281, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 b 68 -112 0 -52 23 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 -4 b 203 -23 187 -17 196 -23 l 315 -23 b 360 -203 346 -23 360 -82 l 405 -203 b 341 68 405 -23 383 68 l 225 68 b 157 248 206 68 183 127 b 79 0 127 98 101 16 b 68 -3 73 0 68 -3 b 45 68 52 -3 45 20 z', + }, + accSagittal19CommaDown: { + x_min: 0, + x_max: 281, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 45 -68 b 68 3 45 -20 52 3 b 79 0 68 3 73 0 b 157 -248 101 -16 127 -98 b 225 -68 183 -127 206 -68 l 341 -68 b 405 203 383 -68 405 23 l 360 203 b 315 23 360 82 346 23 l 203 23 b 180 4 196 23 187 17 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 b 0 -68 23 112 0 52 z', + }, + accSagittal7v19CommaUp: { + x_min: 0, + x_max: 250, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 b 68 -112 0 -52 23 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 112 l 225 112 b 315 -68 285 112 315 53 l 315 -248 l 360 -248 l 360 68 b 271 248 360 187 330 248 l 157 248 b 79 0 127 98 101 16 b 68 -3 73 0 68 -3 b 45 68 52 -3 45 20 z', + }, + accSagittal7v19CommaDown: { + x_min: 0, + x_max: 250, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 45 -68 b 68 3 45 -20 52 3 b 79 0 68 3 73 0 b 157 -248 101 -16 127 -98 l 271 -248 b 360 -68 330 -248 360 -187 l 360 248 l 315 248 l 315 68 b 225 -112 315 -53 285 -112 l 180 -112 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 b 0 -68 23 112 0 52 z', + }, + accSagittal49SmallDiesisUp: { + x_min: 0, + x_max: 281, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -203 l 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -68 330 112 360 53 l 360 -248 l 405 -248 l 405 68 b 315 248 405 187 374 248 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z', + }, + accSagittal49SmallDiesisDown: { + x_min: 0, + x_max: 281, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 315 -248 b 405 -68 374 -248 405 -187 l 405 248 l 360 248 l 360 68 b 271 -112 360 -53 330 -112 l 225 -112 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z', + }, + accSagittal23SmallDiesisUp: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 58 l 495 -274 l 495 -112 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z', + }, + accSagittal23SmallDiesisDown: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 495 112 l 495 274 l 225 -58 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z', + }, + accSagittal5v13MediumDiesisUp: { + x_min: 0, + x_max: 250, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -259 l 315 -89 l 315 -517 l 360 -517 l 360 248 l 337 248 b 128 180 253 203 184 180 b 45 248 73 180 45 203 l 0 248 b 52 95 0 170 17 120 l 0 68 l 0 -33 l 315 135 l 315 10 l 0 -157 z', + }, + accSagittal5v13MediumDiesisDown: { + x_min: 0, + x_max: 250, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 157 l 315 -10 l 315 -135 l 0 33 l 0 -68 l 52 -95 b 0 -248 17 -120 0 -170 l 45 -248 b 128 -180 45 -203 73 -180 b 337 -248 184 -180 253 -203 l 360 -248 l 360 517 l 315 517 l 315 89 l 0 259 z', + }, + accSagittal11v19MediumDiesisUp: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 -4 b 292 -23 278 -17 285 -23 l 405 -23 b 449 -203 435 -23 449 -82 l 495 -203 b 431 68 495 -23 472 68 l 315 68 b 248 248 295 68 271 127 l 135 248 b 0 68 45 248 0 187 l 0 -248 z', + }, + accSagittal11v19MediumDiesisDown: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 248 l 0 -68 b 135 -248 0 -187 45 -248 l 248 -248 b 315 -68 271 -127 295 -68 l 431 -68 b 495 203 472 -68 495 23 l 449 203 b 405 23 449 82 435 23 l 292 23 b 271 4 285 23 278 17 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 z', + }, + accSagittal49MediumDiesisUp: { + x_min: 0, + x_max: 250, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -68 l 0 -248 l 45 -248 l 315 -94 l 315 -517 l 360 -517 l 360 248 l 225 248 b 0 -68 75 248 0 143 z m 45 -68 b 225 112 45 53 105 112 l 315 112 l 315 10 l 45 -145 z', + }, + accSagittal49MediumDiesisDown: { + x_min: 0, + x_max: 250, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 68 b 225 -248 0 -143 75 -248 l 360 -248 l 360 517 l 315 517 l 315 94 l 45 248 l 0 248 z m 45 145 l 315 -10 l 315 -112 l 225 -112 b 45 68 105 -112 45 -53 z', + }, + accSagittal5v49MediumDiesisUp: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -89 l 0 -248 l 225 53 l 225 -517 l 271 -517 l 271 53 l 495 -248 l 495 -89 l 248 248 b 89 89 170 143 118 89 b 45 157 60 89 45 112 l 0 157 b 68 3 0 68 23 16 z', + }, + accSagittal5v49MediumDiesisDown: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 68 -3 b 0 -157 23 -16 0 -68 l 45 -157 b 89 -89 45 -112 60 -89 b 248 -248 118 -89 170 -143 l 495 89 l 495 248 l 271 -53 l 271 517 l 225 517 l 225 -53 l 0 248 l 0 89 z', + }, + accSagittal49LargeDiesisUp: { + x_min: 0, + x_max: 281, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 -89 l 360 -248 l 405 -248 l 405 -68 b 180 248 405 143 330 248 l 0 248 z m 45 12 l 45 112 l 180 112 b 360 -68 300 112 360 53 l 360 -147 z', + }, + accSagittal49LargeDiesisDown: { + x_min: 0, + x_max: 281, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 180 -248 b 405 68 330 -248 405 -143 l 405 248 l 360 248 l 45 89 l 45 517 l 0 517 z m 360 147 l 360 68 b 180 -112 360 -53 300 -112 l 45 -112 l 45 -12 z', + }, + accSagittal11v19LargeDiesisUp: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 -86 l 449 -256 l 449 -157 l 45 13 l 45 138 l 449 -30 l 449 68 l 23 248 l 0 248 z', + }, + accSagittal11v19LargeDiesisDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 23 -248 l 449 -68 l 449 30 l 45 -138 l 45 -13 l 449 157 l 449 256 l 45 86 l 45 517 l 0 517 z', + }, + accSagittal5v13LargeDiesisUp: { + x_min: 0, + x_max: 438, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 b 89 -112 0 -52 30 -112 b 180 -35 125 -112 157 -86 l 180 -517 l 225 -517 l 225 -86 l 631 -256 l 631 -157 l 225 13 l 225 138 l 631 -30 l 631 68 l 203 248 b 101 0 173 98 138 16 b 81 -3 94 0 86 -3 b 45 68 56 -3 45 20 z', + }, + accSagittal5v13LargeDiesisDown: { + x_min: 0, + x_max: 438, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 45 -68 b 81 3 45 -20 56 3 b 101 0 86 3 94 0 b 203 -248 138 -16 173 -98 l 631 -68 l 631 30 l 225 -138 l 225 -13 l 631 157 l 631 256 l 225 86 l 225 517 l 180 517 l 180 35 b 89 112 157 86 125 112 b 0 -68 30 112 0 52 z', + }, + accSagittalSharp23SDown: { + x_min: 0, + x_max: 250, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -203 l 45 -203 b 112 -23 45 -84 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 b 315 6 287 -23 301 -13 l 315 -517 l 360 -517 l 360 248 l 337 248 b 248 68 312 127 282 68 l 194 68 b 89 157 125 68 89 98 l 45 157 b 60 59 45 118 50 85 b 0 -203 20 30 0 -56 z', + }, + accSagittalFlat23SUp: { + x_min: 0, + x_max: 250, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 60 -59 0 56 20 -30 b 45 -157 50 -85 45 -118 l 89 -157 b 194 -68 89 -98 125 -68 l 248 -68 b 337 -248 282 -68 312 -127 l 360 -248 l 360 517 l 315 517 l 315 -6 b 271 23 301 13 287 23 l 180 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 84 z', + }, + accSagittalSharp49SDown: { + x_min: 0, + x_max: 250, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -292 l 45 -292 b 112 -157 45 -203 68 -157 l 135 -157 l 135 -517 l 180 -517 l 180 -157 l 271 -157 b 315 -135 285 -157 300 -150 l 315 -517 l 360 -517 l 360 248 l 337 248 b 248 157 323 187 292 157 l 89 157 b 0 -68 30 157 0 82 l 45 -68 b 112 68 45 23 68 68 l 271 68 b 315 89 284 68 300 75 l 315 -32 b 248 -68 298 -56 275 -68 l 89 -68 b 0 -292 29 -68 0 -143 z', + }, + accSagittalFlat49SUp: { + x_min: 0, + x_max: 250, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 292 b 89 68 0 143 29 68 l 248 68 b 315 32 275 68 298 56 l 315 -89 b 271 -68 300 -75 284 -68 l 112 -68 b 45 68 68 -68 45 -23 l 0 68 b 89 -157 0 -82 30 -157 l 248 -157 b 337 -248 292 -157 323 -187 l 360 -248 l 360 517 l 315 517 l 315 135 b 271 157 300 150 285 157 l 180 157 l 180 517 l 135 517 l 135 157 l 112 157 b 45 292 68 157 45 203 z', + }, + accSagittalSharp7v19CDown: { + x_min: 0, + x_max: 250, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -112 l 0 -271 l 135 -125 l 135 -517 l 180 -517 l 180 -78 l 315 65 l 315 -517 l 360 -517 l 360 248 l 337 248 b 118 89 239 143 166 89 b 45 157 68 89 45 112 l 0 157 b 89 -20 0 53 29 -6 z', + }, + accSagittalFlat7v19CUp: { + x_min: 0, + x_max: 250, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 89 20 b 0 -157 29 6 0 -53 l 45 -157 b 118 -89 45 -112 68 -89 b 337 -248 166 -89 239 -143 l 360 -248 l 360 517 l 315 517 l 315 -65 l 180 78 l 180 517 l 135 517 l 135 125 l 0 271 l 0 112 z', + }, + accSagittalSharp19CDown: { + x_min: 0, + x_max: 281, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -248 l 45 -248 l 45 -68 b 180 96 45 17 89 72 l 180 -517 l 225 -517 l 225 107 b 315 112 252 112 282 112 l 360 112 l 360 -517 l 405 -517 l 405 248 l 271 248 b 0 68 89 248 0 187 z', + }, + accSagittalFlat19CUp: { + x_min: 0, + x_max: 281, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 271 -248 0 -187 89 -248 l 405 -248 l 405 517 l 360 517 l 360 -112 l 315 -112 b 225 -107 282 -112 252 -112 l 225 517 l 180 517 l 180 -96 b 45 68 89 -72 45 -17 l 45 248 l 0 248 z', + }, + accSagittalSharp11v49CDown: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 112 -23 45 -82 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 b 271 112 215 -23 245 23 l 315 112 l 315 -517 l 360 -517 l 360 107 b 449 -68 420 89 449 30 l 449 -248 l 495 -248 l 495 68 b 360 248 495 189 449 248 l 248 248 b 157 68 222 128 192 68 l 89 68 b 0 -203 30 68 0 -23 z', + }, + accSagittalFlat11v49CUp: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 89 -68 0 23 30 -68 l 157 -68 b 248 -248 192 -68 222 -128 l 360 -248 b 495 -68 449 -248 495 -189 l 495 248 l 449 248 l 449 68 b 360 -107 449 -30 420 -89 l 360 517 l 315 517 l 315 -112 l 271 -112 b 180 23 245 -23 215 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 82 z', + }, + accSagittalSharp143CDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 112 -23 45 -84 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 b 259 76 210 -23 236 10 l 315 17 l 315 -517 l 360 -517 l 360 -30 l 585 -271 l 585 -112 l 248 248 b 157 68 222 127 192 68 l 89 68 b 0 -203 30 68 0 -23 z', + }, + accSagittalFlat143CUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 89 -68 0 23 30 -68 l 157 -68 b 248 -248 192 -68 222 -127 l 585 112 l 585 271 l 360 30 l 360 517 l 315 517 l 315 -17 l 259 -76 b 180 23 236 -10 210 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 84 z', + }, + accSagittalSharp17kDown: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -157 l 0 -256 l 225 -161 l 225 -517 l 271 -517 l 271 -144 l 405 -86 l 405 -517 l 449 -517 l 449 248 l 428 248 b 145 171 305 196 210 171 b 45 248 78 171 45 196 l 0 248 b 79 101 0 170 26 121 l 0 68 l 0 -32 l 405 138 l 405 13 z', + }, + accSagittalFlat17kUp: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 405 -13 l 405 -138 l 0 32 l 0 -68 l 79 -101 b 0 -248 26 -121 0 -170 l 45 -248 b 145 -171 45 -196 78 -171 b 428 -248 210 -171 305 -196 l 449 -248 l 449 517 l 405 517 l 405 86 l 271 144 l 271 517 l 225 517 l 225 161 l 0 256 l 0 157 z', + }, + accSagittalSharp19sDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -248 l 45 -248 l 45 -68 b 180 109 45 36 89 95 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -23 295 23 325 -23 l 360 -517 l 405 -517 l 405 -23 l 472 -23 b 540 -203 517 -23 540 -84 l 585 -203 b 495 68 585 -23 554 68 l 383 68 b 292 248 348 68 318 127 l 180 248 b 0 68 60 248 0 187 z', + }, + accSagittalFlat19sUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 180 -248 0 -187 60 -248 l 292 -248 b 383 -68 318 -127 348 -68 l 495 -68 b 585 203 554 -68 585 23 l 540 203 b 472 23 540 84 517 23 l 405 23 l 405 517 l 360 517 l 360 23 b 271 -112 325 23 295 -23 l 225 -112 l 225 517 l 180 517 l 180 -109 b 45 68 89 -95 45 -36 l 45 248 l 0 248 z', + }, + accSagittalSharp19sUp: { + x_min: 0, + x_max: 281, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 89 -96 l 89 -517 l 135 -517 l 135 -108 b 180 -112 148 -112 163 -112 b 225 -108 196 -112 210 -112 l 225 -517 l 271 -517 l 271 -94 b 360 -12 305 -78 337 -50 l 360 -517 l 405 -517 l 405 248 l 383 248 b 190 0 353 98 288 16 b 138 -3 171 0 153 -3 b 45 68 75 -3 45 20 l 0 68 b 89 -96 0 -17 30 -72 z', + }, + accSagittalFlat19sDown: { + x_min: 0, + x_max: 281, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 89 96 b 0 -68 30 72 0 17 l 45 -68 b 138 3 45 -20 75 3 b 190 0 153 3 171 0 b 383 -248 288 -16 353 -98 l 405 -248 l 405 517 l 360 517 l 360 12 b 271 94 337 50 305 78 l 271 517 l 225 517 l 225 108 b 180 112 210 112 196 112 b 135 108 163 112 148 112 l 135 517 l 89 517 z', + }, + accSagittalSharp17kUp: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 l 271 -517 l 315 -517 l 315 -23 l 337 -23 b 405 14 363 -23 386 -10 l 405 -517 l 449 -517 l 449 248 l 428 248 b 315 68 402 127 364 68 l 112 68 b 0 -203 37 68 0 -23 z', + }, + accSagittalFlat17kDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 112 -68 0 23 37 -68 l 315 -68 b 428 -248 364 -68 402 -127 l 449 -248 l 449 517 l 405 517 l 405 -14 b 337 23 386 10 363 23 l 315 23 l 315 517 l 271 517 l 271 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z', + }, + accSagittalSharp143CUp: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 l 271 -517 l 315 -517 l 315 -23 l 337 -23 b 405 14 363 -23 386 -10 l 405 -517 l 449 -517 l 449 248 l 428 248 b 315 68 402 127 364 68 l 240 68 b 89 157 140 68 89 98 l 45 157 b 68 53 45 115 52 81 b 0 -203 23 23 0 -63 z', + }, + accSagittalFlat143CDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 68 -53 0 63 23 -23 b 45 -157 52 -81 45 -115 l 89 -157 b 240 -68 89 -98 140 -68 l 315 -68 b 428 -248 364 -68 402 -127 l 449 -248 l 449 517 l 405 517 l 405 -14 b 337 23 386 10 363 23 l 315 23 l 315 517 l 271 517 l 271 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z', + }, + accSagittalSharp11v49CUp: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -68 b 135 68 45 23 76 68 l 337 68 b 405 95 363 68 386 76 l 405 -27 b 315 -68 386 -55 356 -68 l 112 -68 b 0 -292 37 -68 0 -143 l 45 -292 b 135 -157 45 -203 75 -157 l 135 -517 l 180 -517 l 180 -157 l 271 -157 l 271 -517 l 315 -517 l 315 -157 l 337 -157 b 405 -130 360 -157 383 -148 l 405 -517 l 449 -517 l 449 248 l 428 248 b 315 157 413 187 376 157 l 112 157 b 0 -68 37 157 0 82 z', + }, + accSagittalFlat11v49CDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 68 b 112 -157 0 -82 37 -157 l 315 -157 b 428 -248 376 -157 413 -187 l 449 -248 l 449 517 l 405 517 l 405 130 b 337 157 383 148 360 157 l 315 157 l 315 517 l 271 517 l 271 157 l 180 157 l 180 517 l 135 517 l 135 157 b 45 292 75 157 45 203 l 0 292 b 112 68 0 143 37 68 l 315 68 b 405 27 356 68 386 55 l 405 -95 b 337 -68 386 -76 363 -68 l 135 -68 b 45 68 76 -68 45 -23 z', + }, + accSagittalSharp19CUp: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 89 -109 l 89 -517 l 135 -517 l 135 -109 b 225 -27 170 -102 200 -75 l 225 -517 l 271 -517 l 271 14 b 337 -23 289 -10 311 -23 l 360 -23 l 360 -517 l 405 -517 l 405 -23 b 495 -203 465 -23 495 -82 l 540 -203 b 428 68 540 -23 503 68 l 360 68 b 248 248 310 68 271 128 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 89 -109 0 -39 30 -98 z', + }, + accSagittalFlat19CDown: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 89 109 b 0 -68 30 98 0 39 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 b 360 -68 271 -128 310 -68 l 428 -68 b 540 203 503 -68 540 23 l 495 203 b 405 23 495 82 465 23 l 405 517 l 360 517 l 360 23 l 337 23 b 271 -14 311 23 289 10 l 271 517 l 225 517 l 225 27 b 135 109 200 75 170 102 l 135 517 l 89 517 z', + }, + accSagittalSharp7v19CUp: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 89 -109 l 89 -517 l 135 -517 l 135 -109 b 225 -27 170 -102 200 -75 l 225 -517 l 271 -517 l 271 112 l 315 112 b 360 109 331 112 346 112 l 360 -517 l 405 -517 l 405 98 b 495 -68 465 73 495 19 l 495 -248 l 540 -248 l 540 68 b 360 248 540 189 480 248 l 248 248 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 89 -109 0 -39 30 -98 z', + }, + accSagittalFlat7v19CDown: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 89 109 b 0 -68 30 98 0 39 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 l 360 -248 b 540 -68 480 -248 540 -189 l 540 248 l 495 248 l 495 68 b 405 -98 495 -19 465 -73 l 405 517 l 360 517 l 360 -109 b 315 -112 346 -112 331 -112 l 271 -112 l 271 517 l 225 517 l 225 27 b 135 109 200 75 170 102 l 135 517 l 89 517 z', + }, + accSagittalSharp49SUp: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 203 -23 b 271 14 229 -23 251 -10 l 271 -517 l 315 -517 l 315 112 l 360 112 b 405 109 376 112 390 112 l 405 -517 l 449 -517 l 449 96 b 540 -68 510 72 540 17 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z', + }, + accSagittalFlat49SDown: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 449 -96 540 -17 510 -72 l 449 517 l 405 517 l 405 -109 b 360 -112 390 -112 376 -112 l 315 -112 l 315 517 l 271 517 l 271 -14 b 203 23 251 10 229 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z', + }, + accSagittalSharp23SUp: { + x_min: 0, + x_max: 469, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 203 -23 b 271 14 229 -23 251 -10 l 271 -517 l 315 -517 l 315 71 l 405 -14 l 405 -517 l 449 -517 l 449 -56 l 675 -268 l 675 -112 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z', + }, + accSagittalFlat23SDown: { + x_min: 0, + x_max: 469, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 675 112 l 675 268 l 449 56 l 449 517 l 405 517 l 405 14 l 315 -71 l 315 517 l 271 517 l 271 -14 b 203 23 251 10 229 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z', + }, + accSagittalSharp5v13MUp: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 495 141 l 495 14 l 0 -157 l 0 -256 l 225 -180 l 225 -517 l 271 -517 l 271 -161 l 360 -130 l 360 -517 l 405 -517 l 405 -115 l 495 -84 l 495 -517 l 540 -517 l 540 248 l 517 248 b 167 168 366 194 248 168 b 45 248 85 168 45 194 l 0 248 b 95 99 0 170 30 120 l 0 68 l 0 -30 z', + }, + accSagittalFlat5v13MDown: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 30 l 0 -68 l 95 -99 b 0 -248 30 -120 0 -170 l 45 -248 b 167 -168 45 -194 85 -168 b 517 -248 248 -168 366 -194 l 540 -248 l 540 517 l 495 517 l 495 84 l 405 115 l 405 517 l 360 517 l 360 130 l 271 161 l 271 517 l 225 517 l 225 180 l 0 256 l 0 157 l 495 -14 l 495 -141 z', + }, + accSagittalSharp11v19MUp: { + x_min: 0, + x_max: 438, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 14 b 428 -23 379 -10 402 -23 l 449 -23 l 449 -517 l 495 -517 l 495 -23 b 585 -203 554 -23 585 -84 l 631 -203 b 517 68 631 -23 593 68 l 449 68 b 337 248 400 68 363 127 l 225 248 b 0 68 75 248 0 187 z', + }, + accSagittalFlat11v19MDown: { + x_min: 0, + x_max: 438, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 337 -248 b 449 -68 363 -127 400 -68 l 517 -68 b 631 203 593 -68 631 23 l 585 203 b 495 23 585 84 554 23 l 495 517 l 449 517 l 449 23 l 428 23 b 360 -14 402 23 379 10 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z', + }, + accSagittalSharp49MUp: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -248 l 45 -248 l 225 -180 l 225 -517 l 271 -517 l 271 -166 l 360 -132 l 360 -517 l 405 -517 l 405 -117 l 495 -84 l 495 -517 l 540 -517 l 540 248 l 360 248 b 0 -68 120 248 0 143 z m 45 -145 l 45 -68 b 360 112 45 53 150 112 l 495 112 l 495 14 z', + }, + accSagittalFlat49MDown: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 68 b 360 -248 0 -143 120 -248 l 540 -248 l 540 517 l 495 517 l 495 84 l 405 117 l 405 517 l 360 517 l 360 132 l 271 166 l 271 517 l 225 517 l 225 180 l 45 248 l 0 248 z m 495 -14 l 495 -112 l 360 -112 b 45 68 150 -112 45 -53 l 45 145 z', + }, + accSagittalSharp5v49MUp: { + x_min: 0, + x_max: 469, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -271 l 180 -79 l 180 -517 l 225 -517 l 225 -30 l 315 65 l 315 -517 l 360 -517 l 360 65 l 449 -30 l 449 -517 l 495 -517 l 495 -79 l 675 -271 l 675 -112 l 337 248 b 118 89 239 143 166 89 b 45 157 68 89 45 112 l 0 157 b 107 0 0 62 36 10 l 0 -112 z', + }, + accSagittalFlat5v49MDown: { + x_min: 0, + x_max: 469, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 112 l 107 0 b 0 -157 36 -10 0 -62 l 45 -157 b 118 -89 45 -112 68 -89 b 337 -248 166 -89 239 -143 l 675 112 l 675 271 l 495 79 l 495 517 l 449 517 l 449 30 l 360 -65 l 360 517 l 315 517 l 315 -65 l 225 30 l 225 517 l 180 517 l 180 79 l 0 271 z', + }, + accSagittalSharp49LUp: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 -82 l 135 -112 l 135 -517 l 180 -517 l 180 -127 l 271 -157 l 271 -517 l 315 -517 l 315 -173 l 540 -248 l 585 -248 l 585 -68 b 180 248 585 143 449 248 l 0 248 z m 45 112 l 180 112 b 540 -68 420 112 540 53 l 540 -145 l 45 16 z', + }, + accSagittalFlat49LDown: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 180 -248 b 585 68 449 -248 585 -143 l 585 248 l 540 248 l 315 173 l 315 517 l 271 517 l 271 157 l 180 127 l 180 517 l 135 517 l 135 112 l 45 82 l 45 517 l 0 517 z m 45 -16 l 540 145 l 540 68 b 180 -112 540 -53 420 -112 l 45 -112 z', + }, + accSagittalSharp11v19LUp: { + x_min: 0, + x_max: 438, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 -81 l 135 -108 l 135 -517 l 180 -517 l 180 -121 l 271 -148 l 271 -517 l 315 -517 l 315 -161 l 631 -255 l 631 -157 l 45 16 l 45 144 l 631 -30 l 631 68 l 23 248 l 0 248 z', + }, + accSagittalFlat11v19LDown: { + x_min: 0, + x_max: 438, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 23 -248 l 631 -68 l 631 30 l 45 -144 l 45 -16 l 631 157 l 631 255 l 315 161 l 315 517 l 271 517 l 271 148 l 180 121 l 180 517 l 135 517 l 135 108 l 45 81 l 45 517 l 0 517 z', + }, + accSagittalSharp5v13LUp: { + x_min: 0, + x_max: 500, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 89 -109 l 89 -517 l 135 -517 l 135 -109 b 225 -27 170 -102 200 -75 l 225 -517 l 271 -517 l 271 -85 l 360 -120 l 360 -517 l 405 -517 l 405 -135 l 720 -256 l 720 -157 l 271 14 l 271 141 l 720 -30 l 720 68 l 248 248 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 89 -109 0 -39 30 -98 z', + }, + accSagittalFlat5v13LDown: { + x_min: 0, + x_max: 500, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 89 109 b 0 -68 30 98 0 39 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 l 720 -68 l 720 30 l 271 -141 l 271 -14 l 720 157 l 720 256 l 405 135 l 405 517 l 360 517 l 360 120 l 271 85 l 271 517 l 225 517 l 225 27 b 135 109 200 75 170 102 l 135 517 l 89 517 z', + }, + accSagittalDoubleSharp23SDown: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -203 l 45 -203 b 135 -23 45 -82 76 -23 l 301 -23 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 370 -14 b 449 112 423 10 449 53 l 449 248 l 428 248 b 315 68 402 127 364 68 l 240 68 b 89 157 140 68 89 98 l 45 157 b 68 53 45 115 52 81 b 0 -203 23 23 0 -63 z', + }, + accSagittalDoubleFlat23SUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 68 -53 0 63 23 -23 b 45 -157 52 -81 45 -115 l 89 -157 b 240 -68 89 -98 140 -68 l 315 -68 b 428 -248 364 -68 402 -127 l 449 -248 l 449 -112 b 370 14 449 -53 423 -10 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 301 23 l 135 23 b 45 203 76 23 45 82 z', + }, + accSagittalDoubleSharp49SDown: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -292 l 45 -292 b 112 -157 45 -203 68 -157 l 256 -157 l 135 -503 l 187 -517 l 337 -82 l 490 -517 l 540 -503 l 366 0 l 396 89 b 449 157 416 102 435 125 l 449 248 l 428 248 b 315 157 413 187 376 157 l 112 157 b 0 -68 39 157 0 82 l 45 -68 b 135 68 45 23 76 68 l 287 68 l 311 0 l 288 -68 l 89 -68 b 0 -292 32 -68 0 -144 z', + }, + accSagittalDoubleFlat49SUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 292 b 89 68 0 144 32 68 l 288 68 l 311 0 l 287 -68 l 135 -68 b 45 68 76 -68 45 -23 l 0 68 b 112 -157 0 -82 39 -157 l 315 -157 b 428 -248 376 -157 413 -187 l 449 -248 l 449 -157 b 396 -89 435 -125 416 -102 l 366 0 l 540 503 l 490 517 l 337 82 l 187 517 l 135 503 l 256 157 l 112 157 b 45 292 68 157 45 203 z', + }, + accSagittalDoubleSharp7v19CDown: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -112 l 0 -266 l 307 -7 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 366 0 l 386 59 l 449 112 l 449 248 l 428 248 b 130 68 285 127 186 68 b 45 157 73 68 45 98 l 0 157 b 112 -20 0 53 37 -6 z', + }, + accSagittalDoubleFlat7v19CUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 112 20 b 0 -157 37 6 0 -53 l 45 -157 b 130 -68 45 -98 73 -68 b 428 -248 186 -68 285 -127 l 449 -248 l 449 -112 l 386 -59 l 366 0 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 307 7 l 0 266 l 0 112 z', + }, + accSagittalDoubleSharp19CDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 315 109 45 36 135 95 l 354 0 l 180 -503 l 232 -517 l 383 -82 l 534 -517 l 585 -503 l 410 0 l 449 112 l 495 112 l 495 248 l 360 248 b 0 68 120 248 0 187 z m 372 112 l 393 112 l 383 82 z', + }, + accSagittalDoubleFlat19CUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 360 -248 0 -187 120 -248 l 495 -248 l 495 -112 l 449 -112 l 410 0 l 585 503 l 534 517 l 383 82 l 232 517 l 180 503 l 354 0 l 315 -109 b 45 68 135 -95 45 -36 l 45 248 l 0 248 z m 383 -82 l 393 -112 l 372 -112 z', + }, + accSagittalDoubleSharp11v49CDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 203 -23 b 262 4 225 -23 245 -13 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 360 112 b 540 -68 480 112 540 53 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z', + }, + accSagittalDoubleFlat11v49CUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 360 -112 540 -53 480 -112 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 262 -4 b 203 23 245 13 225 23 l 135 23 b 45 203 75 23 45 84 z', + }, + accSagittalDoubleSharp143CDown: { + x_min: 0, + x_max: 469, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 203 -23 b 262 4 225 -23 245 -13 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 337 49 l 675 -268 l 675 -112 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z', + }, + accSagittalDoubleFlat143CUp: { + x_min: 0, + x_max: 469, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 675 112 l 675 268 l 337 -49 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 262 -4 b 203 23 245 13 225 23 l 135 23 b 45 203 75 23 45 84 z', + }, + accSagittalDoubleSharp17kDown: { + x_min: 0, + x_max: 438, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 248 b 95 101 0 170 30 121 l 0 68 l 0 -30 l 364 96 l 399 0 l 390 -23 l 0 -157 l 0 -255 l 353 -135 l 225 -503 l 275 -517 l 428 -82 l 577 -517 l 631 -503 l 455 0 l 507 145 l 540 157 l 540 248 l 517 248 b 167 168 366 194 248 168 b 45 248 85 168 45 194 z m 416 115 l 442 124 l 428 82 z', + }, + accSagittalDoubleFlat17kUp: { + x_min: 0, + x_max: 438, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 45 -248 b 167 -168 45 -194 85 -168 b 517 -248 248 -168 366 -194 l 540 -248 l 540 -157 l 507 -145 l 455 0 l 631 503 l 577 517 l 428 82 l 275 517 l 225 503 l 353 135 l 0 255 l 0 157 l 390 23 l 399 0 l 364 -96 l 0 30 l 0 -68 l 95 -101 b 0 -248 30 -121 0 -170 z m 428 -82 l 442 -124 l 416 -115 z', + }, + accSagittalDoubleSharp19sDown: { + x_min: 0, + x_max: 438, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -248 l 45 -248 l 45 -68 b 271 112 45 53 120 112 l 310 0 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 366 0 l 367 4 b 428 -23 386 -13 405 -23 l 495 -23 b 585 -203 554 -23 585 -84 l 631 -203 b 517 68 631 -23 593 68 l 449 68 b 337 248 400 68 363 127 l 225 248 b 0 68 75 248 0 187 z', + }, + accSagittalDoubleFlat19sUp: { + x_min: 0, + x_max: 438, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 337 -248 b 449 -68 363 -127 400 -68 l 517 -68 b 631 203 593 -68 631 23 l 585 203 b 495 23 585 84 554 23 l 428 23 b 367 -4 405 23 386 13 l 366 0 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 310 0 l 271 -112 b 45 68 120 -112 45 -53 l 45 248 l 0 248 z', + }, + accSagittalShaftUp: { + x_min: 0, + x_max: 31, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 112 l 0 -517 l 45 -517 l 45 112 l 23 248 z', + }, + accSagittalShaftDown: { + x_min: 0, + x_max: 31, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 23 -248 l 45 -112 l 45 517 l 0 517 l 0 -112 z', + }, + accSagittalAcute: { + x_min: 0, + x_max: 125, + y_min: -62, + y_max: 125, + ha: 187, + o: 'm 0 0 l 0 -89 l 180 89 l 180 180 z', + }, + accSagittalGrave: { + x_min: 0, + x_max: 125, + y_min: -125, + y_max: 62, + ha: 187, + o: 'm 180 -180 l 180 -89 l 0 89 l 0 0 z', + }, + accSagittal1MinaUp: { + x_min: -7, + x_max: 124, + y_min: 16, + y_max: 106.31676725154982, + ha: 90.31676725154982, + o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 134 150 179 112 163 135 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z', + }, + accSagittal1MinaDown: { + x_min: -7, + x_max: 124, + y_min: -106.31676725154983, + y_max: -16, + ha: 90.31676725154983, + o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 179 -23 163 -135 179 -112 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z', + }, + accSagittal2MinasUp: { + x_min: -7, + x_max: 218, + y_min: 16, + y_max: 106.31676725154982, + ha: 90.31676725154982, + o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 207 65 179 23 200 55 b 252 107 223 86 240 107 b 271 23 264 107 272 86 l 314 23 b 269 150 314 112 298 135 b 203 130 252 158 220 150 b 173 92 190 115 181 104 b 134 150 167 127 154 140 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z', + }, + accSagittal2MinasDown: { + x_min: -7, + x_max: 218, + y_min: -106.31676725154983, + y_max: -16, + ha: 90.31676725154983, + o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 173 -92 154 -140 167 -127 b 203 -130 181 -104 190 -115 b 269 -150 220 -150 252 -158 b 314 -23 298 -135 314 -112 l 271 -23 b 252 -107 272 -86 264 -107 b 207 -65 240 -107 223 -86 b 179 -23 200 -55 179 -23 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z', + }, + accSagittal1TinaUp: { + x_min: 0, + x_max: 93, + y_min: 16, + y_max: 107, + ha: 91, + o: 'm 134 154 l 91 154 b 81 76 91 101 91 86 b 0 68 73 69 48 68 l 0 23 b 134 154 122 23 134 36 z', + }, + accSagittal1TinaDown: { + x_min: 0, + x_max: 93, + y_min: -107, + y_max: -16, + ha: 91, + o: 'm 134 -154 b 0 -23 134 -36 122 -23 l 0 -68 b 81 -76 48 -68 73 -69 b 91 -154 91 -86 91 -101 z', + }, + accSagittal2TinasUp: { + x_min: 0, + x_max: 94, + y_min: 16, + y_max: 107, + ha: 91, + o: 'm 135 68 b 89 154 94 68 89 124 l 46 154 b 36 92 45 131 42 105 b 0 68 32 82 23 68 l 0 23 b 68 63 29 23 53 40 b 135 23 84 39 104 23 z', + }, + accSagittal2TinasDown: { + x_min: 0, + x_max: 94, + y_min: -107, + y_max: -16, + ha: 91, + o: 'm 135 -23 b 68 -63 104 -23 84 -39 b 0 -23 53 -40 29 -23 l 0 -68 b 36 -92 23 -68 32 -82 b 46 -154 42 -105 45 -131 l 89 -154 b 135 -68 89 -124 94 -68 z', + }, + accSagittal3TinasUp: { + x_min: -7, + x_max: 124, + y_min: 16, + y_max: 106.31676725154982, + ha: 90.31676725154982, + o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 134 150 179 112 163 135 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z', + }, + accSagittal3TinasDown: { + x_min: -7, + x_max: 124, + y_min: -106.31676725154983, + y_max: -16, + ha: 90.31676725154983, + o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 179 -23 163 -135 179 -112 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z', + }, + accSagittal4TinasUp: { + x_min: 0, + x_max: 187, + y_min: 16, + y_max: 106.69999999999997, + ha: 90.69999999999997, + o: 'm 0 68 l 0 23 b 143 45 105 23 124 26 b 203 107 153 55 183 107 b 226 23 216 107 226 86 l 269 23 b 225 150 269 112 253 135 b 160 132 207 158 181 153 b 115 81 138 112 124 88 b 0 68 104 71 94 68 z', + }, + accSagittal4TinasDown: { + x_min: 0, + x_max: 187, + y_min: -106.69999999999999, + y_max: -16, + ha: 90.69999999999999, + o: 'm 0 -68 b 115 -81 94 -68 104 -71 b 160 -132 124 -88 138 -112 b 225 -150 181 -153 207 -158 b 269 -23 253 -135 269 -112 l 226 -23 b 203 -107 226 -86 216 -107 b 143 -45 183 -107 153 -55 b 0 -23 124 -26 105 -23 z', + }, + accSagittal5TinasUp: { + x_min: 0, + x_max: 218, + y_min: 16, + y_max: 107, + ha: 91, + o: 'm 135 23 b 187 45 156 23 168 26 b 249 107 197 55 228 107 b 271 23 262 107 271 86 l 314 23 b 269 150 314 112 298 135 b 204 132 252 158 226 153 b 160 81 183 112 168 88 b 135 68 148 71 147 68 b 89 154 94 68 89 124 l 46 154 b 36 92 45 131 42 105 b 0 68 32 82 23 68 l 0 23 b 68 63 29 23 53 40 b 135 23 84 39 104 23 z', + }, + accSagittal5TinasDown: { + x_min: 0, + x_max: 218, + y_min: -107, + y_max: -16, + ha: 91, + o: 'm 135 -23 b 68 -63 104 -23 84 -39 b 0 -23 53 -40 29 -23 l 0 -68 b 36 -92 23 -68 32 -82 b 46 -154 42 -105 45 -131 l 89 -154 b 135 -68 89 -124 94 -68 b 160 -81 147 -68 148 -71 b 204 -132 168 -88 183 -112 b 269 -150 226 -153 252 -158 b 314 -23 298 -135 314 -112 l 271 -23 b 249 -107 271 -86 262 -107 b 187 -45 228 -107 197 -55 b 135 -23 168 -26 156 -23 z', + }, + accSagittal6TinasUp: { + x_min: -7, + x_max: 218, + y_min: 16, + y_max: 106.31676725154982, + ha: 90.31676725154982, + o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 207 65 179 23 200 55 b 252 107 223 86 240 107 b 271 23 264 107 272 86 l 314 23 b 269 150 314 112 298 135 b 203 130 252 158 220 150 b 173 92 190 115 181 104 b 134 150 167 127 154 140 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z', + }, + accSagittal6TinasDown: { + x_min: -7, + x_max: 218, + y_min: -106.31676725154983, + y_max: -16, + ha: 90.31676725154983, + o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 173 -92 154 -140 167 -127 b 203 -130 181 -104 190 -115 b 269 -150 220 -150 252 -158 b 314 -23 298 -135 314 -112 l 271 -23 b 252 -107 272 -86 264 -107 b 207 -65 240 -107 223 -86 b 179 -23 200 -55 179 -23 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z', + }, + accSagittal7TinasUp: { + x_min: 0, + x_max: 281, + y_min: 16, + y_max: 106.69999999999997, + ha: 90.69999999999997, + o: 'm 0 68 l 0 23 b 143 45 105 23 124 26 b 203 107 153 55 183 107 b 226 23 216 107 226 86 l 269 23 b 298 65 269 23 291 55 b 343 107 314 86 331 107 b 361 23 354 107 363 86 l 405 23 b 360 150 405 112 389 135 b 294 130 343 158 311 150 b 264 92 281 115 272 104 b 225 150 258 127 245 140 b 160 132 207 158 181 153 b 115 81 138 112 124 88 b 0 68 104 71 94 68 z', + }, + accSagittal7TinasDown: { + x_min: 0, + x_max: 281, + y_min: -106.69999999999999, + y_max: -16, + ha: 90.69999999999999, + o: 'm 0 -68 b 115 -81 94 -68 104 -71 b 160 -132 124 -88 138 -112 b 225 -150 181 -153 207 -158 b 264 -92 245 -140 258 -127 b 294 -130 272 -104 281 -115 b 360 -150 311 -150 343 -158 b 405 -23 389 -135 405 -112 l 361 -23 b 343 -107 363 -86 354 -107 b 298 -65 331 -107 314 -86 b 269 -23 291 -55 269 -23 l 226 -23 b 203 -107 226 -86 216 -107 b 143 -45 183 -107 153 -55 b 0 -23 124 -26 105 -23 z', + }, + accSagittal8TinasUp: { + x_min: 0, + x_max: 312, + y_min: 16, + y_max: 107, + ha: 91, + o: 'm 135 23 b 187 45 156 23 168 26 b 249 107 197 55 228 107 b 271 23 262 107 271 86 l 314 23 b 343 65 314 23 336 55 b 387 107 359 86 376 107 b 406 23 399 107 408 86 l 449 23 b 405 150 449 112 433 135 b 338 130 387 158 356 150 b 308 92 325 115 317 104 b 269 150 302 127 289 140 b 204 132 252 158 226 153 b 160 81 183 112 168 88 b 135 68 148 71 147 68 b 89 154 94 68 89 124 l 46 154 b 36 92 45 131 42 105 b 0 68 32 82 23 68 l 0 23 b 68 63 29 23 53 40 b 135 23 84 39 104 23 z', + }, + accSagittal8TinasDown: { + x_min: 0, + x_max: 312, + y_min: -107, + y_max: -16, + ha: 91, + o: 'm 135 -23 b 68 -63 104 -23 84 -39 b 0 -23 53 -40 29 -23 l 0 -68 b 36 -92 23 -68 32 -82 b 46 -154 42 -105 45 -131 l 89 -154 b 135 -68 89 -124 94 -68 b 160 -81 147 -68 148 -71 b 204 -132 168 -88 183 -112 b 269 -150 226 -153 252 -158 b 308 -92 289 -140 302 -127 b 338 -130 317 -104 325 -115 b 405 -150 356 -150 387 -158 b 449 -23 433 -135 449 -112 l 406 -23 b 387 -107 408 -86 399 -107 b 343 -65 376 -107 359 -86 b 314 -23 336 -55 314 -23 l 271 -23 b 249 -107 271 -86 262 -107 b 187 -45 228 -107 197 -55 b 135 -23 168 -26 156 -23 z', + }, + accSagittal9TinasUp: { + x_min: -7, + x_max: 312, + y_min: 16, + y_max: 106.31676725154982, + ha: 90.31676725154982, + o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 207 65 179 23 200 55 b 252 107 223 86 240 107 b 271 23 264 107 272 86 l 314 23 b 343 65 314 23 336 55 b 387 107 359 86 376 107 b 406 23 399 107 408 86 l 449 23 b 405 150 449 112 433 135 b 338 130 387 158 356 150 b 308 92 325 115 317 104 b 269 150 302 127 289 140 b 203 130 252 158 220 150 b 173 92 190 115 181 104 b 134 150 167 127 154 140 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z', + }, + accSagittal9TinasDown: { + x_min: -7, + x_max: 312, + y_min: -106.31676725154983, + y_max: -16, + ha: 90.31676725154983, + o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 173 -92 154 -140 167 -127 b 203 -130 181 -104 190 -115 b 269 -150 220 -150 252 -158 b 308 -92 289 -140 302 -127 b 338 -130 317 -104 325 -115 b 405 -150 356 -150 387 -158 b 449 -23 433 -135 449 -112 l 406 -23 b 387 -107 408 -86 399 -107 b 343 -65 376 -107 359 -86 b 314 -23 336 -55 314 -23 l 271 -23 b 252 -107 272 -86 264 -107 b 207 -65 240 -107 223 -86 b 179 -23 200 -55 179 -23 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z', + }, + accSagittalFractionalTinaUp: { + x_min: -3, + x_max: 35, + y_min: 73, + y_max: 111, + ha: 38, + o: 'm -4 132 b 23 105 -4 118 9 105 b 50 132 37 105 50 118 b 23 160 50 147 37 160 b -4 132 9 160 -4 147 z', + }, + accSagittalFractionalTinaDown: { + x_min: -3, + x_max: 35, + y_min: -111, + y_max: -73, + ha: 38, + o: 'm -4 -132 b 23 -160 -4 -147 9 -160 b 50 -132 37 -160 50 -147 b 23 -105 50 -118 37 -105 b -4 -132 9 -105 -4 -118 z', + }, + accidentalNarrowReversedFlat: { + x_min: 0, + x_max: 164, + y_min: -194, + y_max: 421, + ha: 615, + o: 'm 236 -279 l 236 606 l 192 606 l 192 179 b 85 243 150 222 114 243 b 0 84 23 243 0 134 b 112 -158 0 3 37 -78 z m 192 112 l 192 -163 l 135 -98 b 82 40 101 -50 82 -3 b 138 144 82 73 96 144 b 192 112 153 144 170 132 z', + }, + accidentalNarrowReversedFlatAndFlat: { + x_min: 0, + x_max: 414, + y_min: -194, + y_max: 421, + ha: 615, + o: 'm 281 606 l 281 -268 l 438 -158 b 596 84 547 -82 596 3 b 475 243 596 154 556 243 b 325 179 435 243 384 222 l 325 606 z m 235 -279 l 235 606 l 190 606 l 190 179 b 85 243 148 222 114 243 b 12 158 52 243 27 215 b 0 84 3 134 0 108 b 112 -158 0 3 37 -78 z m 325 111 b 410 144 359 132 386 144 b 498 36 462 144 498 84 b 413 -107 498 -9 469 -58 l 325 -173 z m 192 112 l 192 -163 l 135 -98 b 81 40 99 -50 81 -3 b 91 94 81 59 84 76 b 137 144 102 127 118 144 b 192 112 153 144 170 132 z', + }, + accidentalWilsonPlus: { + x_min: 0, + x_max: 281, + y_min: -203, + y_max: 203, + ha: 406, + o: 'm 405 268 l 225 98 l 225 292 l 180 292 l 180 56 l 0 -112 l 0 -268 l 180 -98 l 180 -292 l 225 -292 l 225 -56 l 405 112 z', + }, + accidentalWilsonMinus: { + x_min: 0, + x_max: 281, + y_min: -186, + y_max: 186, + ha: 372, + o: 'm 0 112 l 405 -268 l 405 -112 l 0 268 z', + }, + }, + fontFamily: 'Bravura', + resolution: 1000, + generatedOn: '2021-12-06T21:04:30.234Z', +}; + + +/***/ }), + +/***/ "./src/fonts/bravura_metrics.ts": +/*!**************************************!*\ + !*** ./src/fonts/bravura_metrics.ts ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "BravuraMetrics": () => (/* binding */ BravuraMetrics) +/* harmony export */ }); +/** + * The Bravura font was created by Daniel Spreadbury @ Steinberg. + * https://github.com/steinbergmedia/bravura/ + */ +const BravuraMetrics = { + name: 'Bravura', + smufl: true, + stave: { + padding: 12, + endPaddingMax: 10, + endPaddingMin: 5, + unalignedNotePadding: 10, + }, + accidental: { + noteheadAccidentalPadding: 1, + leftPadding: 2, + accidentalSpacing: 3, + }, + clef: { + default: { + point: 32, + width: 26, + }, + small: { + point: 26, + width: 20, + }, + annotations: { + '8va': { + smuflCode: 'timeSig8', + default: { + point: 18, + treble: { + line: -1.4, + shiftX: 12, + }, + }, + small: { + point: 16, + treble: { + line: -0.2, + shiftX: 8, + }, + }, + }, + '8vb': { + smuflCode: 'timeSig8', + default: { + point: 18, + treble: { + line: 6, + shiftX: 10, + }, + bass: { + line: 3.5, + shiftX: 1, + }, + }, + small: { + point: 16, + treble: { + line: 5.3, + shiftX: 6, + }, + bass: { + line: 3.1, + shiftX: 0.5, + }, + }, + }, + }, + // These may no longer be necessary + lineCount: { + '8': { point: 55, shiftY: 14 }, + '7': { point: 47, shiftY: 8 }, + '6': { point: 32, shiftY: 1 }, + '5': { point: 30, shiftY: -6 }, + '4': { point: 23, shiftY: -12 }, + }, + }, + parenthesis: { + default: { + point: 39, + width: 7, + }, + gracenote: { + point: (39 * 3) / 5, + width: 3, + }, + }, + pedalMarking: { + up: { + point: 40, + }, + down: { + point: 34, + }, + }, + // These are for numeric digits, such as in time signatures + digits: { + // used by timesig + shiftLine: -1, + point: 34, + // used by tuplets + tupletPoint: 22, + shiftY: -6, + }, + articulation: { + articStaccatissimoAbove: { + padding: 2, + }, + articStaccatissimoBelow: { + padding: 2, + }, + }, + tremolo: { + default: { + point: 25, + spacing: 5, + offsetYStemUp: -5, + offsetYStemDown: 5, + offsetXStemUp: 11, + offsetXStemDown: 1, + }, + grace: { + point: 18, + spacing: 4, + offsetYStemUp: -5, + offsetYStemDown: 5, + offsetXStemUp: 7, + offsetXStemDown: 1, + }, + }, + staveRepetition: { + default: { + offsetY: 25, + offsetSymbol: 12, + spacing: 5, + }, + }, + // noteHead: { + // }, + stem: { + heightAdjustmentForFlag: -3, + // These are stem (Y) offsets to the note heads. To shift the + // noteheads (x-position) themselves, see glyphs.notehead.custom. + noteHead: { + noteheadTriangleUpHalf: { + offsetYBaseStemUp: 5, + offsetYBaseStemDown: 4, + }, + noteheadTriangleUpBlack: { + offsetYBaseStemUp: 5, + offsetYBaseStemDown: 4, + }, + noteheadTriangleUpWhole: { + offsetYBaseStemUp: 5, + offsetYBaseStemDown: 4, + }, + noteheadXHalf: { + offsetYBaseStemUp: -4, + offsetYBaseStemDown: 4, + }, + noteheadXBlack: { + offsetYBaseStemUp: -4, + offsetYBaseStemDown: 4, + }, + noteheadXWhole: { + offsetYBaseStemUp: -4, + offsetYBaseStemDown: 4, + }, + noteheadHalf: { + offsetYBaseStemUp: -2.55, + offsetYBaseStemDown: 2.65, + }, + noteheadBlack: { + offsetYBaseStemUp: -2, + offsetYBaseStemDown: 2, + }, + noteheadSquareWhite: { + offsetYBaseStemDown: -5, + offsetYBaseStemUp: 5, + }, + }, + }, + // Values under here are used by the Glyph class to reposition and rescale + // glyphs based on their category. This should be the first stop for + // custom font glyph repositioning. + // + // The glyph loader first looks up a specific set of settings based on the + // glyph code, and if not found, uses the defaults from the category. See + // glyphs.textNote for an example of this. + // + // Details in Glyph.lookupFontMetrics. + glyphs: { + coda: { + point: 20, + shiftX: -7, + shiftY: 8, + }, + segno: { + shiftX: -7, + }, + flag: { + shiftX: -0.75, + tabStem: { + shiftX: -1.75, + }, + staveTempo: { + shiftX: -1, + }, + }, + clef: { + gClef: { + default: { scale: 1.1, shiftY: 1 }, + small: { shiftY: 1.5 }, + }, + fClef: { + default: { shiftY: -0.5 }, + }, + }, + ornament: { + ornamentTurn: { + scale: 1.2, + }, + ornamentTurnSlash: { + scale: 1.2, + }, + }, + stringNumber: { + verticalPadding: 8, + stemPadding: 2, + leftPadding: 5, + rightPadding: 6, + }, + stroke: { + arrowheadBlackDown: { + straight: { + shiftX: -4.5, + }, + wiggly: { + shiftX: -1, + shiftY: 1, + }, + }, + arrowheadBlackUp: { + straight: { + shiftX: -0.85, + }, + wiggly: { + shiftX: -1, + shiftY: 1, + }, + }, + }, + textNote: { + point: 34, + breathMarkTick: { + point: 36, + shiftY: 9, + }, + breathMarkComma: { + point: 36, + }, + segno: { + point: 30, + shiftX: -7, + shiftY: 8, + }, + coda: { + point: 20, + shiftX: -7, + shiftY: 8, + }, + ornamentTrill: { + shiftX: -8, + shiftY: 8, + }, + ornamentTurn: { + point: 42, + }, + ornamentTurnSlash: { + point: 42, + }, + ornamentMordent: { + shiftX: -8, + }, + ornamentShortTrill: { + shiftX: -8, + }, + }, + noteHead: { + minPadding: 2, + standard: { + restQuarterStemUp: { + point: 35, + }, + restQuarterStemDown: { + point: 35, + }, + }, + custom: { + noteheadCircleXStemUp: { + shiftX: 1.5, + }, + noteheadCircleXStemDown: { + shiftX: 0.25, + }, + noteheadDiamondHalfStemUp: { + shiftX: 1.5, + }, + noteheadDiamondBlackStemUp: { + shiftX: 1.5, + }, + noteheadDiamondWholeStemUp: { + shiftX: 1, + }, + noteheadXHalfStemUp: { + shiftX: -2, + }, + noteheadXHalfStemDown: { + shiftX: 1, + }, + noteheadXWholeStemUp: { + shiftX: -4, + }, + noteheadXWholeStemDown: { + shiftX: 1, + }, + noteheadSquareWhiteStemDown: { + shiftX: 0.25, + }, + noteheadSquareWhiteStemUp: { + shiftX: -0.75, + }, + noteheadSquareBlackStemUp: { + shiftX: -0.75, + }, + noteheadTriangleUpWholeStemUp: { + shiftX: -0.75, + }, + }, + }, + chordSymbol: { + global: { + superscriptOffset: -400, + subscriptOffset: 300, + kerningOffset: -250, + lowerKerningText: ['D', 'F', 'P', 'T', 'V', 'Y'], + upperKerningText: ['A', 'L'], + spacing: 100, + superSubRatio: 0.66, + }, + csymDiminished: { + scale: 0.8, + leftSideBearing: -32, + advanceWidth: 506, + yOffset: 0, + }, + csymHalfDiminished: { + scale: 0.8, + leftSideBearing: -32, + advanceWidth: 506, + yOffset: 0, + }, + csymAugmented: { + scale: 1, + leftSideBearing: 0, + advanceWidth: 530, + yOffset: 0, + }, + csymParensLeftTall: { + scale: 0.8, + leftSideBearing: -20, + advanceWidth: 184, + yOffset: 250, + }, + csymParensRightTall: { + scale: 0.8, + leftSideBearing: 0, + advanceWidth: 189, + yOffset: 250, + }, + csymBracketLeftTall: { + scale: 0.8, + leftSideBearing: 0, + advanceWidth: 328, + yOffset: 0, + }, + csymBracketRightTall: { + scale: 0.8, + leftSideBearing: 1, + advanceWidth: 600, + yOffset: 0, + }, + csymParensLeftVeryTall: { + scale: 0.9, + leftSideBearing: 50, + advanceWidth: 121, + yOffset: 350, + }, + csymParensRightVeryTall: { + scale: 0.9, + leftSideBearing: 0, + advanceWidth: 111, + yOffset: 350, + }, + csymDiagonalArrangementSlash: { + scale: 0.6, + leftSideBearing: -1, + advanceWidth: 990, + yOffset: 0, + }, + csymMinor: { + scale: 0.8, + leftSideBearing: 0, + advanceWidth: 482, + yOffset: 0, + }, + csymMajorSeventh: { + scale: 0.9, + leftSideBearing: 200, + yOffset: 0, + advanceWidth: 600, + }, + accidentalSharp: { + scale: 0.75, + leftSideBearing: 20, + advanceWidth: 250, + yOffset: -302, + }, + accidentalFlat: { + scale: 0.9, + leftSideBearing: -20, + advanceWidth: 226, + yOffset: -184, + }, + }, + jazzOrnaments: { + brassScoop: { + scale: 1.0, + xOffset: -12, + yOffset: 0, + stemUpYOffset: 0, + reportedWidth: 10, + }, + brassDoitMedium: { + scale: 1.0, + xOffset: 16, + yOffset: 0, + stemUpYOffset: 0, + reportedWidth: 15, + }, + brassFallLipShort: { + scale: 1.0, + xOffset: 16, + yOffset: 0, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassLiftMedium: { + scale: 1.0, + xOffset: 16, + yOffset: 5, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassFallRoughMedium: { + scale: 1.0, + xOffset: 16, + yOffset: 28, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassBend: { + scale: 1.0, + xOffset: 2, + yOffset: -8, + stemUpYOffset: 25, + reportedWidth: 5, + }, + brassMuteClosed: { + scale: 1.0, + xOffset: 3, + yOffset: -8, + stemUpYOffset: 25, + reportedWidth: 5, + }, + brassMuteOpen: { + scale: 1.0, + xOffset: 3, + yOffset: -7, + stemUpYOffset: 25, + reportedWidth: 5, + }, + brassFlip: { + scale: 1.0, + xOffset: 10, + yOffset: -4, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassJazzTurn: { + scale: 1.0, + xOffset: 6, + yOffset: -4, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassSmear: { + scale: 1.0, + xOffset: 10, + yOffset: -4, + stemUpYOffset: 0, + reportedWidth: 5, + }, + }, + tuplet: { + noteHeadOffset: 20, + stemOffset: 10, + bottomLine: 4, + topModifierOffset: 15, + }, + }, +}; + + +/***/ }), + +/***/ "./src/fonts/custom_glyphs.ts": +/*!************************************!*\ + !*** ./src/fonts/custom_glyphs.ts ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "CustomFont": () => (/* binding */ CustomFont) +/* harmony export */ }); +const CustomFont = { + resolution: 1000, + fontFamily: 'VexFlowCustom', + glyphs: { + noteheadSquareWhite: { + x_min: 0, + x_max: 430.75, + ha: 386, + o: 'm 0 200 l 0 -200 l 430 -200 l 430 200 l 0 200 l 50 150 l 380 150 l 380 -150 l 50 -150 l 50 150 ', + }, + noteheadSquareBlack: { + x_min: 0, + x_max: 430.75, + ha: 386, + o: 'm 0 200 l 0 -200 l 430 -200 l 430 200 l 0 200 ', + }, + accidentalBuyukMucennebFlat: { + x_min: -171.5, + x_max: 251.8125, + ha: 257, + o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 553 20 616 20 614 b 20 491 20 503 20 491 l 20 491 b 153 535 47 501 149 535 b 174 514 167 535 174 524 b 164 496 174 508 171 501 b 92 470 164 495 132 484 l 20 445 l 20 390 b 20 363 20 378 20 370 b 20 333 20 340 20 333 l 20 333 b 153 377 47 344 149 377 b 174 356 167 377 174 367 b 164 338 174 349 171 342 b 92 312 164 338 132 326 l 20 288 l 20 219 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 30 -21 -212 -21 -212 b -21 273 -21 163 -21 273 b -84 252 -21 273 -50 263 b -152 230 -133 234 -145 230 b -157 231 -155 230 -156 231 b -171 252 -166 234 -171 244 b -160 270 -171 259 -167 266 b -27 316 -159 270 -93 294 l -21 319 l -21 374 b -21 431 -21 406 -21 431 b -84 409 -21 431 -50 421 b -152 388 -133 392 -145 388 b -157 390 -155 388 -156 388 b -171 409 -166 392 -171 401 b -160 428 -171 417 -167 424 b -27 474 -159 428 -93 451 l -21 476 l -21 546 b -20 620 -21 614 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ', + }, + accidentalBakiyeFlat: { + x_min: -176.9375, + x_max: 251.8125, + ha: 257, + o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 503 20 616 20 614 b 20 391 20 442 20 391 b 84 424 20 391 49 406 l 147 456 l 152 456 b 153 456 153 456 153 456 b 175 435 166 456 175 446 b 172 427 175 433 174 430 b 92 380 170 420 172 421 l 20 342 l 20 245 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 54 -21 -212 -21 -212 b -21 322 -21 201 -21 322 b -85 290 -21 322 -50 308 l -148 256 l -153 256 b -155 256 -155 256 -155 256 b -176 277 -167 256 -176 266 b -174 285 -176 280 -175 283 b -93 333 -171 294 -174 292 l -21 370 l -21 494 b -20 620 -21 616 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ', + }, + accidentalKucukMucennebSharp: { + x_min: -1.359375, + x_max: 255.890625, + ha: 261, + o: 'm 118 514 b 127 517 121 517 122 517 b 147 505 136 517 142 513 l 148 502 l 148 403 b 148 306 148 351 148 306 b 174 315 149 306 160 310 l 200 324 l 205 323 b 223 312 213 323 220 319 l 225 308 l 225 260 b 225 245 225 255 225 249 b 220 204 225 208 224 209 b 179 188 216 199 215 199 l 148 177 l 148 124 l 148 70 l 189 84 b 236 98 219 94 230 98 b 247 94 240 98 243 97 b 255 52 254 88 255 87 b 255 33 255 47 255 40 l 254 -12 l 253 -15 b 249 -22 253 -18 250 -20 l 245 -24 l 196 -41 l 148 -58 l 148 -108 b 148 -158 148 -136 148 -158 b 174 -148 148 -158 160 -154 b 204 -140 198 -140 200 -140 l 204 -140 b 224 -152 213 -140 221 -145 b 225 -201 224 -155 225 -177 b 224 -254 225 -226 224 -251 b 157 -284 220 -262 220 -262 l 148 -288 l 148 -395 l 148 -503 l 147 -506 b 127 -519 142 -514 134 -519 b 107 -506 119 -519 111 -514 l 106 -503 l 106 -403 b 106 -303 106 -316 106 -303 b 104 -303 104 -303 104 -303 b 88 -310 104 -303 96 -306 l 63 -319 b 51 -322 59 -320 55 -322 b 36 -315 46 -322 40 -319 b 31 -273 32 -309 31 -312 b 31 -258 31 -269 31 -263 l 31 -210 l 34 -206 b 40 -198 35 -204 38 -199 b 74 -186 42 -197 57 -191 l 106 -173 l 106 -123 b 106 -97 106 -112 106 -104 b 106 -72 106 -76 106 -72 b 104 -72 106 -72 106 -72 b 20 -99 89 -79 23 -99 b 0 -84 10 -99 2 -93 b -1 -37 0 -81 -1 -59 b 0 11 -1 -15 0 9 b 58 40 4 22 2 22 l 106 56 l 106 109 b 106 123 106 115 106 119 b 106 162 106 147 106 162 b 81 155 106 162 93 159 b 50 147 65 149 55 147 b 36 152 43 147 40 148 b 31 194 32 158 31 156 b 31 209 31 198 31 204 l 31 256 l 34 260 b 76 281 38 269 38 269 l 106 292 l 106 396 l 106 502 l 107 505 b 118 514 110 509 114 513 ', + }, + accidentalKoron: { + x_min: -20, + x_max: 320, + ha: 257, + o: 'm -8 200 b -8 210 8 200 16 200 l 20 148 -199 l 23 -615 b 0 -629 9 -629 6 -629 l -21 -612 l -21 -201 l -21 216 l -20 200 m 16 200 l 310 0 l 240 0 l 16 140 l 16 -120 l 240 0 l 310 0 l 16 -200 ', + }, + accidentalSori: { + x_min: -10.890625, + x_max: 299.4375, + ha: 294, + o: 'm 44 174 b 51 174 47 174 49 174 b 68 173 55 174 61 174 l 287 112 l 551 40 b 615 20 617 22 609 23 b 626 0 622 16 626 8 b 615 -22 626 -9 622 -18 b 613 -23 613 -23 613 -23 b 613 -23 613 -23 613 -23 b 287 -113 613 -24 597 -29 l 68 -174 b 53 -176 61 -176 57 -176 b 39 -172 47 -176 43 -174 b 27 -151 31 -167 27 -159 b 39 -129 27 -141 31 -133 b 230 -74 43 -124 20 -131 l 370 -36 l 468 -9 b 498 0 484 -4 498 -1 b 468 8 498 0 484 2 l 370 34 l 230 73 b 40 126 28 129 43 124 b 27 149 31 131 27 140 b 44 174 27 161 34 170 m 205 110 l 205 300 b 205 330 245 330 245 300 l 245 300 l 245 -300 b 245 -330 205 -330 205 -300 l 205 -300 l 205 110 l 345 90 m 345 90 l 345 330 b 345 360 385 360 385 330 l 385 330 l 385 -270 b 385 -300 345 -300 345 -270 l 345 -270 l 345 90 ', + }, + vexAccidentalMicrotonal2: { + x_min: -1.359375, + x_max: 386.5625, + ha: 394, + o: 'm 249 535 b 257 537 251 537 253 537 b 276 524 266 537 273 533 l 277 521 l 279 419 l 279 316 l 304 323 b 337 328 319 326 330 328 b 353 316 347 328 349 324 b 355 266 355 315 355 290 b 353 215 355 241 355 217 b 319 198 349 206 347 205 b 279 187 284 190 279 188 b 279 156 279 187 279 174 b 279 136 279 151 279 144 l 279 84 l 289 87 l 330 98 b 367 105 352 102 362 105 b 378 101 372 105 375 104 b 386 61 385 95 386 94 b 386 40 386 55 386 48 l 386 -5 l 385 -8 b 374 -19 383 -12 378 -18 b 291 -40 372 -19 347 -26 b 279 -43 284 -41 279 -43 b 279 -83 279 -43 279 -59 b 279 -95 279 -87 279 -91 l 279 -145 l 304 -140 b 337 -133 321 -136 330 -133 b 349 -140 343 -133 347 -136 b 355 -181 355 -145 355 -142 l 355 -197 l 355 -210 b 349 -252 355 -249 355 -247 b 300 -269 345 -258 347 -258 b 280 -274 291 -272 281 -273 l 279 -274 l 277 -378 l 277 -483 l 276 -487 b 257 -499 273 -495 265 -499 b 238 -487 249 -499 242 -495 l 236 -483 l 236 -384 l 236 -285 l 235 -285 l 212 -291 l 170 -301 b 148 -308 159 -305 148 -306 b 147 -415 147 -308 147 -313 l 147 -523 l 145 -526 b 126 -538 141 -534 133 -538 b 106 -526 118 -538 110 -534 l 104 -523 l 104 -420 b 103 -317 104 -326 104 -317 b 103 -317 103 -317 103 -317 b 50 -330 92 -322 54 -330 b 31 -317 42 -330 35 -326 b 29 -267 29 -315 29 -315 l 29 -219 l 32 -216 b 92 -192 36 -206 36 -206 l 104 -190 l 104 -138 b 103 -87 104 -91 104 -87 b 103 -87 103 -87 103 -87 b 88 -91 103 -87 96 -88 l 49 -101 b 17 -106 32 -105 23 -106 b 6 -102 13 -106 10 -105 b -1 -62 0 -97 -1 -95 b 0 -41 -1 -56 0 -49 l 0 4 l 1 6 b 10 16 2 11 6 15 b 91 37 12 18 38 24 l 104 41 l 104 93 b 103 144 104 140 104 144 b 103 144 103 144 103 144 b 50 131 92 141 54 131 b 31 144 42 131 35 137 b 29 195 29 147 29 148 l 29 242 l 32 245 b 92 269 36 255 36 255 l 104 273 l 104 377 l 104 481 l 106 485 b 126 498 110 492 118 498 b 134 495 129 498 132 496 b 145 485 138 494 142 489 l 147 481 l 147 383 l 147 283 l 152 284 b 190 294 155 285 171 290 l 230 303 l 236 305 l 236 413 l 236 521 l 238 524 b 249 535 240 528 243 533 m 236 126 b 235 177 236 154 236 177 l 235 177 b 213 172 235 177 225 174 l 170 161 b 147 155 157 158 147 155 b 147 124 147 155 147 142 b 147 102 147 117 147 111 l 147 52 l 153 54 l 228 72 l 236 74 l 236 126 m 236 -105 b 235 -54 236 -65 236 -54 l 235 -54 b 231 -55 235 -54 234 -54 b 172 -69 227 -55 204 -62 l 149 -76 l 147 -76 l 147 -127 l 147 -179 l 152 -177 b 190 -167 155 -177 171 -173 l 230 -158 l 236 -156 l 236 -105 ', + }, + vexAccidentalMicrotonal3: { + x_min: 0, + x_max: 430.75, + ha: 360, + o: 'm -146 537 b -138 538 -143 538 -141 538 b -118 525 -129 538 -121 533 b -117 390 -117 522 -117 521 b -115 259 -117 268 -117 259 b -115 259 -115 259 -115 259 b -59 272 -104 263 -62 272 b -39 259 -50 272 -42 267 b -37 209 -38 257 -37 233 b -39 159 -37 185 -38 162 b -85 138 -43 149 -44 149 l -117 131 l -117 21 b -115 -88 -117 -80 -117 -88 b -115 -88 -115 -88 -115 -88 b -59 -75 -104 -84 -62 -75 b -44 -81 -52 -75 -48 -77 b -38 -124 -38 -87 -38 -85 b -38 -138 -38 -124 -38 -138 b -38 -152 -38 -138 -38 -152 b -44 -195 -38 -191 -38 -190 b -85 -209 -48 -200 -48 -200 l -117 -217 l -117 -349 b -118 -486 -117 -481 -117 -482 b -138 -499 -121 -494 -129 -499 b -153 -493 -143 -499 -149 -497 b -159 -415 -158 -487 -159 -496 b -159 -355 -159 -398 -159 -379 b -159 -227 -159 -284 -159 -227 b -205 -238 -159 -227 -180 -232 b -250 -249 -230 -244 -250 -249 b -251 -386 -251 -249 -251 -311 b -252 -525 -251 -521 -251 -522 b -272 -538 -255 -534 -264 -538 b -287 -532 -277 -538 -283 -536 b -293 -452 -292 -527 -293 -536 b -293 -391 -293 -436 -293 -415 b -294 -260 -293 -269 -293 -260 b -294 -260 -294 -260 -294 -260 b -348 -272 -306 -264 -345 -272 b -368 -259 -357 -272 -365 -267 b -369 -209 -369 -257 -369 -233 b -368 -159 -369 -185 -369 -162 b -323 -139 -364 -149 -362 -148 l -293 -131 l -293 -22 b -294 87 -293 80 -293 87 b -294 87 -294 87 -294 87 b -348 75 -306 84 -345 75 b -368 88 -357 75 -365 80 b -369 138 -369 91 -369 114 b -368 188 -369 162 -369 186 b -323 209 -364 198 -362 199 l -293 216 l -293 349 b -292 486 -293 481 -293 482 b -272 499 -288 494 -280 499 b -257 493 -266 499 -261 497 b -251 414 -251 487 -251 496 b -251 354 -251 398 -251 378 b -251 226 -251 284 -251 226 b -205 238 -250 226 -230 231 b -159 249 -180 244 -159 249 b -159 385 -159 249 -159 310 b -157 525 -159 521 -159 522 b -146 537 -156 530 -151 535 z m -159 11 b -159 120 -159 98 -159 120 l -159 120 b -175 116 -160 120 -167 119 b -221 105 -184 114 -204 109 l -251 98 l -251 -12 b -251 -121 -251 -72 -251 -121 b -205 -110 -250 -121 -230 -116 b -159 -99 -180 -104 -159 -99 b -159 11 -159 -99 -159 -49 z m 89 517 b 97 519 92 518 94 519 b 117 505 106 519 114 513 b 119 376 119 502 119 501 l 119 249 l 145 258 b 176 267 169 266 172 267 b 177 267 176 267 177 267 b 196 255 186 267 192 263 l 197 252 l 197 205 b 197 181 197 195 197 187 b 193 149 197 153 197 153 b 152 131 190 144 187 143 l 119 120 l 119 10 b 119 -100 119 -62 119 -100 b 145 -91 120 -100 131 -96 b 173 -82 159 -86 171 -82 b 176 -81 174 -81 175 -81 b 196 -94 185 -81 193 -87 b 198 -151 197 -97 198 -125 b 197 -194 198 -172 197 -192 b 153 -218 193 -203 192 -204 l 119 -230 l 119 -367 l 118 -504 l 117 -507 b 97 -519 113 -514 105 -519 b 82 -512 92 -519 87 -517 b 76 -434 77 -507 76 -516 b 76 -374 76 -418 76 -398 b 76 -245 76 -303 76 -245 b 52 -254 76 -245 65 -249 b 19 -263 34 -260 25 -263 b 6 -257 13 -263 10 -261 b 0 -214 0 -251 0 -253 b 0 -200 0 -210 0 -205 b 0 -188 0 -196 0 -192 b 6 -143 0 -147 0 -149 b 46 -126 10 -139 10 -139 l 76 -115 l 76 -5 b 76 106 76 56 76 106 b 51 98 76 106 64 102 b 18 89 34 92 25 89 b 6 95 13 89 10 91 b 0 139 0 101 0 99 b 0 153 0 143 0 148 b 0 179 0 163 0 172 b 44 225 0 215 3 211 l 76 236 l 76 369 b 78 505 76 501 76 502 b 89 517 80 510 85 515 z ', + }, + vexAccidentalMicrotonal4: { + x_min: 0, + x_max: 430.75, + ha: 360, + o: 'm 283 633 b 291 634 286 634 289 634 b 311 621 300 634 308 629 b 313 505 313 618 313 617 b 313 393 313 443 313 393 b 378 425 313 393 343 407 l 443 458 l 448 458 b 449 458 449 458 449 458 b 471 437 462 458 471 448 b 469 429 471 434 470 432 b 387 382 466 421 469 423 l 313 344 l 313 247 l 313 150 l 315 152 b 433 201 353 184 394 201 b 479 193 448 201 464 198 b 549 86 524 177 549 135 b 526 1 549 59 541 29 b 395 -143 504 -39 475 -71 b 316 -214 351 -182 341 -191 b 292 -229 302 -228 300 -229 b 272 -216 283 -229 275 -224 b 271 55 271 -212 271 -212 b 270 323 271 203 270 323 b 205 291 270 323 241 308 l 140 258 l 135 258 b 134 258 135 258 134 258 b 112 279 121 258 112 267 b 114 287 112 281 113 284 b 196 334 117 295 114 293 l 271 371 l 271 495 b 272 621 271 617 271 618 b 283 633 274 626 279 631 z m 404 133 b 391 134 400 134 395 134 b 384 134 388 134 386 134 b 318 88 358 130 335 114 l 313 81 l 313 -37 l 313 -156 l 316 -152 b 439 83 391 -71 439 22 l 439 84 b 404 133 439 115 430 128 z m -8 633 l -8 633 b 0 634 -6 634 -3 634 b 20 621 8 634 17 629 b 21 384 21 618 21 617 l 21 150 l 24 152 b 141 201 62 184 102 201 b 187 193 157 201 172 198 b 257 86 232 177 257 135 b 234 1 257 59 250 29 b 103 -143 212 -39 183 -71 b 24 -214 60 -182 49 -191 b 0 -229 10 -228 8 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 203 l -21 618 l -20 621 b -8 633 -18 626 -13 631 z m 113 133 l 113 133 b 99 134 109 134 103 134 b 93 134 97 134 94 134 b 26 88 66 130 43 114 l 21 81 l 21 -37 l 21 -156 l 25 -152 b 148 83 99 -71 148 22 l 148 84 b 113 133 148 115 138 128 z ', + }, + vexNoteHeadRectBlack: { + x_min: 0, + x_max: 430.75, + ha: 360, + o: 'm 0 150 l 0 -150 l 430 -150 l 430 150 l 0 150 ', + }, + vexNoteHeadRectWhite: { + x_min: 0, + x_max: 430.75, + ha: 360, + o: 'm 0 150 l 0 -150 l 430 -150 l 430 150 l 0 150 l 50 100 l 380 100 l 380 -100 l 50 -100 l 50 100', + }, + }, +}; + + +/***/ }), + +/***/ "./src/fonts/custom_metrics.ts": +/*!*************************************!*\ + !*** ./src/fonts/custom_metrics.ts ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "CustomMetrics": () => (/* binding */ CustomMetrics) +/* harmony export */ }); +const CustomMetrics = { + name: 'VexFlowCustom', + smufl: false, + glyphs: {}, +}; + + +/***/ }), + +/***/ "./src/fonts/gonville_glyphs.ts": +/*!**************************************!*\ + !*** ./src/fonts/gonville_glyphs.ts ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "GonvilleFont": () => (/* binding */ GonvilleFont) +/* harmony export */ }); +const GonvilleFont = { + glyphs: { + bracketTop: { + x_min: 0, + x_max: 559.421875, + ha: 571, + o: 'm 544 204 b 548 204 545 204 547 204 b 559 194 555 204 559 199 b 559 190 559 192 559 191 b 530 156 559 188 556 184 b 462 86 510 134 481 104 b 453 76 458 81 454 77 l 446 70 l 441 65 b 434 59 439 63 436 61 l 427 54 b 409 37 426 51 416 44 b 392 23 398 29 394 26 b 387 19 389 22 387 20 b 379 13 386 19 383 16 l 371 8 l 367 5 l 359 -1 l 337 -16 b 285 -48 319 -29 298 -41 l 279 -52 b 186 -95 255 -66 210 -87 l 175 -99 b 23 -129 127 -117 68 -129 b 17 -129 20 -129 19 -129 b 1 -123 2 -129 2 -129 b 0 -49 0 -122 0 -83 b 0 4 0 -22 0 1 b 27 11 2 9 4 9 b 185 31 78 12 145 20 b 198 34 186 31 193 33 b 314 73 234 44 277 58 b 349 88 328 79 340 84 b 353 90 352 90 353 90 b 363 94 353 90 357 93 b 371 98 367 97 371 98 b 428 129 372 98 413 120 b 461 148 441 136 454 144 b 468 151 464 149 466 151 b 472 154 469 152 470 154 b 481 161 473 155 477 158 b 525 190 490 166 518 186 l 534 197 b 540 201 536 198 539 199 b 544 204 541 202 544 204 ', + }, + bracketBottom: { + x_min: 0, + x_max: 559.421875, + ha: 571, + o: 'm 5 127 b 14 127 6 127 9 127 b 51 126 25 127 43 127 b 175 98 93 122 138 112 l 186 94 b 279 51 210 86 255 65 b 285 47 280 51 283 48 b 319 27 291 44 311 31 l 326 22 b 359 0 332 19 352 4 l 367 -6 b 371 -9 368 -6 370 -8 l 379 -15 b 387 -22 383 -18 386 -20 l 398 -30 l 411 -40 l 417 -47 l 427 -55 l 434 -61 b 441 -66 436 -62 439 -65 l 446 -72 l 453 -77 l 462 -87 b 558 -188 490 -113 549 -176 b 559 -195 559 -191 559 -194 b 548 -205 559 -201 555 -205 b 541 -204 547 -205 544 -205 b 534 -198 539 -201 536 -199 l 525 -191 b 481 -162 518 -187 490 -167 b 472 -155 477 -159 472 -156 b 468 -152 470 -155 469 -154 b 461 -149 466 -152 464 -151 b 428 -130 454 -145 441 -137 b 371 -99 413 -122 372 -99 b 363 -95 371 -99 367 -98 b 353 -91 357 -94 353 -91 b 348 -90 353 -91 352 -91 b 332 -81 343 -87 341 -86 b 27 -12 230 -37 127 -13 b 0 -5 4 -11 2 -11 b 0 58 0 -2 0 27 b 0 122 0 88 0 120 b 5 127 1 124 4 126 ', + }, + barlineTick: { + x_min: -80.3125, + x_max: 78.9375, + ha: 81, + o: 'm 63 191 b 69 192 65 192 66 192 b 77 188 72 192 76 191 b 78 183 78 187 78 186 b 74 158 78 179 77 172 l 66 115 b 9 -161 49 30 10 -158 b -10 -187 6 -172 -1 -181 b -34 -194 -17 -191 -25 -194 b -80 -147 -58 -194 -80 -174 b -80 -141 -80 -144 -80 -142 b 9 70 -80 -134 -73 -117 l 49 163 b 63 191 59 188 61 190 ', + }, + breathMarkTick: { + x_min: -80.3125, + x_max: 78.9375, + ha: 81, + o: 'm 63 191 b 69 192 65 192 66 192 b 77 188 72 192 76 191 b 78 183 78 187 78 186 b 74 158 78 179 77 172 l 66 115 b 9 -161 49 30 10 -158 b -10 -187 6 -172 -1 -181 b -34 -194 -17 -191 -25 -194 b -80 -147 -58 -194 -80 -174 b -80 -141 -80 -144 -80 -142 b 9 70 -80 -134 -73 -117 l 49 163 b 63 191 59 188 61 190 ', + }, + segno: { + x_min: -330.75, + x_max: 329.390625, + ha: 336, + o: 'm -133 483 b -117 484 -127 484 -122 484 b 31 373 -51 484 9 440 b 35 348 34 365 35 356 b -25 285 35 313 10 285 b -87 331 -55 285 -76 302 b -167 402 -100 376 -133 402 b -191 398 -175 402 -183 401 b -227 341 -215 388 -227 369 b -225 320 -227 334 -227 327 b -13 74 -209 230 -125 133 b 6 65 -4 70 5 66 l 9 63 l 10 65 b 117 231 12 68 40 112 l 189 341 l 242 424 b 268 460 262 456 264 458 b 283 464 273 463 277 464 b 308 438 296 464 308 453 l 308 437 b 287 396 308 430 308 428 l 95 98 l 59 43 l 58 41 l 65 37 b 253 -156 151 -8 217 -77 b 281 -285 272 -199 281 -244 b 148 -481 281 -381 231 -463 b 115 -485 137 -484 126 -485 b -32 -376 51 -485 -9 -442 b -36 -349 -35 -366 -36 -358 b 25 -287 -36 -315 -12 -287 b 85 -333 54 -287 74 -302 b 166 -403 99 -377 133 -403 b 190 -399 174 -403 182 -402 b 225 -342 215 -390 225 -370 b 224 -322 225 -335 225 -328 b 12 -76 208 -231 125 -134 b -8 -66 2 -72 -6 -68 l -10 -65 l -12 -66 b -118 -231 -13 -68 -42 -113 l -190 -342 l -243 -426 b -269 -462 -264 -458 -265 -458 b -284 -466 -274 -464 -279 -466 b -310 -440 -298 -466 -310 -455 l -310 -438 b -288 -398 -310 -430 -308 -430 l -96 -99 l -59 -44 l -59 -43 l -66 -38 b -281 284 -198 33 -281 158 l -281 284 b -133 483 -281 392 -220 474 m 254 177 b 266 179 258 177 262 179 b 319 149 287 179 307 167 b 329 115 326 140 329 127 b 319 79 329 102 326 90 b 268 51 307 61 287 51 b 221 72 250 51 234 58 b 205 115 210 84 205 99 b 254 177 205 142 223 170 m -281 -54 b -269 -52 -277 -52 -273 -52 b -223 -73 -253 -52 -235 -59 b -206 -116 -212 -84 -206 -101 b -216 -151 -206 -129 -209 -141 b -269 -179 -228 -170 -249 -179 b -314 -159 -285 -179 -302 -173 b -330 -116 -325 -147 -330 -131 b -281 -54 -330 -88 -313 -61 ', + }, + coda: { + x_min: -311.6875, + x_max: 310.328125, + ha: 317, + o: 'm -9 388 b -2 390 -8 390 -5 390 b 5 388 1 390 4 390 b 19 378 10 387 16 383 b 23 333 23 371 23 371 b 24 298 23 299 24 298 b 81 276 34 298 65 285 b 213 91 145 240 190 177 b 224 24 217 76 224 36 b 257 24 224 24 235 24 b 299 19 292 24 292 24 b 310 -1 306 15 310 6 b 299 -23 310 -11 306 -19 b 257 -27 292 -27 292 -27 b 224 -29 235 -27 224 -29 b 213 -95 224 -40 217 -80 b 81 -280 190 -181 145 -244 b 24 -301 65 -290 34 -301 b 23 -335 24 -301 23 -303 l 23 -340 b 17 -381 23 -374 23 -374 b -1 -391 13 -388 5 -391 b -21 -381 -9 -391 -17 -388 b -27 -340 -27 -374 -27 -374 l -27 -335 b -28 -301 -27 -303 -27 -301 b -85 -280 -38 -301 -69 -290 b -217 -95 -149 -244 -194 -181 b -228 -29 -221 -80 -228 -40 b -259 -27 -228 -29 -238 -27 b -300 -23 -294 -27 -294 -27 b -311 -2 -307 -19 -311 -11 b -294 23 -311 8 -304 19 b -259 24 -291 23 -284 24 b -228 24 -239 24 -228 24 b -217 91 -228 36 -221 76 b -85 276 -194 177 -149 240 b -28 298 -69 285 -38 298 b -27 333 -27 298 -27 299 b -27 371 -27 362 -27 369 b -9 388 -24 378 -17 385 m -27 136 b -28 247 -27 197 -28 247 b -61 216 -31 247 -53 226 b -123 33 -95 172 -121 98 l -125 24 l -76 24 l -27 24 l -27 136 m 29 242 b 24 247 27 245 24 247 b 23 136 24 247 23 197 l 23 24 l 72 24 l 121 24 l 119 33 b 29 242 115 116 77 206 m -27 -140 l -27 -27 l -76 -27 l -125 -27 l -123 -36 b -61 -220 -121 -102 -95 -176 b -28 -251 -53 -230 -31 -251 b -27 -140 -28 -251 -27 -201 m 119 -36 l 121 -27 l 72 -27 l 23 -27 l 23 -140 b 24 -251 23 -201 24 -251 b 57 -220 27 -251 49 -230 b 119 -36 91 -176 117 -102 ', + }, + gClef: { + x_min: -1.359375, + x_max: 847.96875, + ha: 865, + o: 'm 488 1499 b 495 1500 490 1500 492 1500 b 541 1465 507 1500 521 1490 b 679 1078 622 1372 679 1210 b 677 1050 679 1068 677 1060 b 477 642 668 893 604 764 l 443 609 l 431 596 l 431 592 l 438 562 l 449 508 l 460 458 b 481 355 475 390 481 355 b 481 355 481 355 481 355 b 490 356 481 355 485 355 b 528 358 495 356 511 358 b 558 356 540 358 552 356 b 839 95 699 338 808 237 b 847 22 845 72 847 47 b 631 -303 847 -113 766 -242 b 620 -309 623 -308 620 -309 l 620 -310 b 631 -359 620 -310 626 -333 l 646 -435 l 660 -496 b 672 -588 668 -535 672 -563 b 664 -653 672 -610 669 -630 b 383 -875 630 -792 509 -875 b 201 -810 321 -875 257 -855 b 129 -680 151 -768 129 -730 b 274 -530 129 -592 200 -530 b 351 -553 300 -530 326 -538 b 412 -669 393 -582 412 -626 b 287 -805 412 -735 366 -800 l 279 -805 l 285 -809 b 383 -830 318 -823 351 -830 b 586 -718 464 -830 540 -789 b 626 -584 612 -678 626 -631 b 619 -528 626 -566 623 -548 b 612 -495 619 -526 616 -510 b 577 -324 590 -387 577 -324 b 577 -324 577 -324 577 -324 b 568 -326 575 -324 571 -324 b 528 -334 558 -328 537 -333 b 465 -338 506 -337 485 -338 b 24 -11 269 -338 87 -206 b -1 145 8 41 -1 93 b 96 442 -1 249 32 351 b 322 714 166 541 236 626 l 352 745 l 345 782 l 332 843 l 315 921 b 303 984 310 950 304 978 b 295 1082 298 1017 295 1049 b 413 1426 295 1208 336 1329 b 488 1499 436 1456 477 1496 m 549 1301 b 541 1301 547 1301 544 1301 b 411 1207 500 1301 447 1263 b 355 1004 374 1152 355 1079 b 359 942 355 984 356 963 b 371 881 362 927 363 917 l 385 818 b 392 782 389 799 392 784 l 392 782 b 434 828 393 782 424 816 b 607 1165 534 941 594 1060 b 608 1193 608 1175 608 1183 b 597 1270 608 1224 604 1254 b 549 1301 589 1286 571 1299 m 398 528 b 393 555 396 542 393 553 b 392 555 393 555 393 555 b 317 470 390 555 347 505 b 190 298 266 408 212 334 b 127 70 148 227 127 148 b 155 -77 127 19 137 -30 b 468 -303 209 -216 333 -303 b 519 -299 484 -303 502 -302 b 568 -284 541 -295 568 -287 l 568 -284 b 563 -263 568 -284 566 -274 l 534 -120 l 511 -13 l 496 61 l 480 133 b 469 187 472 176 469 187 b 468 188 469 187 469 188 b 416 162 462 188 430 172 b 337 13 364 126 337 69 b 413 -124 337 -40 363 -93 b 428 -144 424 -131 428 -137 b 428 -149 428 -145 428 -148 b 409 -166 426 -161 419 -166 b 394 -162 405 -166 400 -165 b 240 77 302 -122 240 -27 l 240 77 b 430 342 240 197 315 301 l 436 344 l 426 394 l 398 528 m 548 194 b 526 195 540 195 532 195 b 519 195 524 195 521 195 l 514 195 l 518 177 l 539 79 l 552 15 l 566 -48 l 594 -187 l 605 -240 b 612 -266 609 -254 611 -266 b 612 -266 612 -266 612 -266 b 641 -248 613 -266 630 -256 b 744 -98 692 -212 730 -156 b 751 -40 749 -79 751 -59 b 548 194 751 76 665 181 ', + }, + cClef: { + x_min: 0, + x_max: 873.828125, + ha: 892, + o: 'm 0 0 l 0 703 l 81 703 l 164 703 l 164 0 l 164 -705 l 81 -705 l 0 -705 l 0 0 m 225 0 l 225 703 l 246 703 l 268 703 l 268 366 l 268 30 l 274 36 b 314 79 284 44 302 63 b 413 302 357 137 392 213 b 432 327 419 324 421 327 b 449 306 443 327 447 322 b 611 115 457 195 529 115 b 651 122 624 115 638 117 b 728 316 705 140 724 188 b 729 388 728 342 729 366 b 671 635 729 533 711 602 b 581 662 649 652 616 662 b 477 637 545 662 510 653 l 475 635 l 477 634 b 503 627 488 632 495 631 b 545 556 532 612 545 584 b 491 480 545 524 526 491 b 465 474 481 476 473 474 b 379 563 417 474 379 516 b 389 602 379 576 382 588 b 541 691 409 641 479 681 b 582 694 555 692 568 694 b 865 462 714 694 834 598 b 873 392 871 440 873 416 b 865 317 873 367 871 341 b 639 84 839 194 748 101 b 612 83 630 83 620 83 b 511 116 577 83 543 94 b 504 120 509 119 506 120 b 504 120 504 120 504 120 b 469 59 504 120 488 93 l 432 -1 l 469 -61 b 504 -122 488 -94 504 -122 b 504 -122 504 -122 504 -122 b 511 -117 506 -122 509 -120 b 612 -84 543 -95 577 -84 b 665 -91 630 -84 647 -87 b 869 -338 771 -122 850 -216 b 873 -392 872 -356 873 -374 b 798 -595 873 -469 847 -539 b 581 -695 741 -662 660 -695 b 406 -626 517 -695 454 -671 b 381 -563 389 -607 381 -585 b 465 -477 381 -519 413 -477 b 545 -559 514 -477 545 -519 b 503 -628 545 -587 532 -613 b 477 -635 495 -632 488 -634 l 475 -637 l 477 -638 b 581 -663 510 -655 545 -663 b 671 -637 616 -663 649 -653 b 729 -391 711 -603 729 -534 b 728 -317 729 -367 728 -344 b 623 -117 722 -173 698 -124 b 611 -116 619 -116 615 -116 b 449 -308 528 -116 457 -198 b 432 -328 447 -323 443 -328 b 413 -303 421 -328 419 -326 b 314 -80 392 -215 357 -138 b 274 -37 302 -65 284 -45 l 268 -31 l 268 -367 l 268 -705 l 246 -705 l 225 -705 l 225 0 ', + }, + fClef: { + x_min: -1.359375, + x_max: 899.703125, + ha: 918, + o: 'm 307 349 b 332 351 315 351 323 351 b 443 340 367 351 408 347 b 741 47 607 306 720 195 b 744 0 743 31 744 16 b 660 -303 744 -90 713 -206 b 28 -755 534 -531 304 -695 b 14 -756 23 -755 19 -756 b -1 -741 4 -756 -1 -750 b 21 -720 -1 -731 1 -728 b 567 -56 337 -601 548 -344 b 568 -11 568 -41 568 -24 b 442 285 568 129 525 233 b 325 319 406 308 367 319 b 93 177 232 319 137 266 b 84 154 91 170 84 155 b 84 154 84 154 84 154 b 88 156 84 154 85 155 b 159 177 110 170 134 177 b 257 134 194 177 231 162 b 294 41 281 108 294 73 b 171 -97 294 -24 246 -90 b 156 -98 166 -97 161 -98 b 6 74 73 -98 6 -22 b 6 80 6 76 6 79 b 307 349 10 223 141 340 m 839 215 b 845 216 841 216 842 216 b 862 213 852 216 860 215 b 899 163 887 206 899 184 b 872 117 899 145 890 127 b 847 111 865 112 856 111 b 808 130 833 111 818 117 b 796 162 800 140 796 151 b 839 215 796 187 812 212 m 839 -112 b 845 -112 841 -112 842 -112 b 862 -115 852 -112 860 -113 b 899 -165 887 -122 899 -144 b 872 -210 899 -183 890 -201 b 847 -217 865 -215 856 -217 b 808 -198 833 -217 818 -210 b 796 -165 800 -188 796 -177 b 839 -112 796 -140 812 -116 ', + }, + unpitchedPercussionClef1: { + x_min: 0, + x_max: 464.140625, + ha: 474, + o: 'm 0 0 l 0 347 l 76 347 l 153 347 l 153 0 l 153 -348 l 76 -348 l 0 -348 l 0 0 m 308 -1 l 308 347 l 386 347 l 464 347 l 464 -1 l 464 -348 l 386 -348 l 308 -348 l 308 -1 ', + }, + '6stringTabClef': { + x_min: -1.359375, + x_max: 680.5625, + ha: 694, + o: 'm 597 1042 b 604 1042 600 1042 602 1042 b 642 1002 627 1042 642 1022 b 619 966 642 988 635 974 b 439 927 574 942 503 927 l 426 927 l 426 921 b 430 838 428 893 430 866 b 345 480 430 696 398 560 b 179 391 307 423 249 391 b 156 392 171 391 164 392 b 138 394 149 394 142 394 b 103 434 115 396 103 416 b 129 471 103 451 111 466 b 141 474 133 473 137 474 b 172 459 153 474 164 469 b 181 455 175 456 176 455 b 187 456 182 455 185 455 b 253 520 212 460 234 483 b 315 836 294 605 315 714 b 311 928 315 867 314 898 b 302 945 310 943 311 942 b 245 953 283 950 262 953 b 130 891 193 953 149 931 b 84 860 119 870 102 860 b 36 905 61 860 39 877 b 36 910 36 907 36 909 b 80 970 36 931 50 949 b 249 1017 125 1000 187 1017 b 322 1009 273 1017 299 1014 l 341 1003 b 436 991 372 995 406 991 b 577 1031 495 991 545 1004 b 597 1042 583 1038 590 1041 m 416 360 b 424 360 419 360 421 360 b 481 309 454 360 479 338 b 503 145 484 280 495 199 b 585 -185 525 16 555 -106 b 630 -245 596 -213 613 -237 l 634 -247 l 638 -245 b 647 -244 641 -245 645 -244 b 680 -278 666 -244 680 -262 b 664 -308 680 -290 675 -301 b 638 -312 658 -310 650 -312 b 613 -309 631 -312 623 -310 b 477 -201 555 -303 502 -260 b 417 -2 460 -159 434 -72 b 416 5 417 1 416 5 b 416 5 416 5 416 5 b 411 -5 415 5 413 0 b 359 -97 397 -33 377 -70 b 353 -106 355 -102 353 -105 b 359 -112 353 -108 355 -109 b 409 -130 375 -123 390 -129 b 426 -134 420 -130 421 -131 b 431 -147 428 -137 431 -141 b 420 -162 431 -152 427 -159 b 382 -169 409 -166 396 -169 b 323 -155 363 -169 341 -165 l 317 -152 l 314 -155 b 62 -303 240 -240 148 -295 b 36 -305 55 -305 44 -305 b 23 -303 29 -305 24 -305 b -1 -273 6 -299 -1 -287 b 31 -240 -1 -256 10 -240 b 36 -240 32 -240 34 -240 b 42 -241 38 -241 39 -241 b 134 -204 63 -241 99 -226 b 367 288 265 -115 357 81 b 375 330 368 313 370 320 b 416 360 383 347 400 358 m 360 -359 b 379 -359 363 -359 371 -359 b 424 -360 396 -359 416 -359 b 646 -502 536 -373 624 -430 b 649 -527 649 -510 649 -519 b 530 -673 649 -578 604 -635 l 521 -677 l 529 -681 b 653 -811 592 -714 637 -762 b 660 -853 658 -827 660 -839 b 645 -911 660 -873 656 -892 b 426 -1021 608 -981 519 -1021 b 283 -989 377 -1021 328 -1011 b 235 -949 249 -972 239 -964 b 234 -936 234 -946 234 -941 b 234 -928 234 -934 234 -931 l 235 -925 l 234 -927 l 225 -934 b 87 -982 186 -966 138 -982 b 80 -982 85 -982 83 -982 b 55 -981 70 -981 58 -981 b 17 -943 32 -981 17 -964 b 54 -904 17 -921 35 -904 b 78 -914 62 -904 72 -909 l 83 -918 l 88 -918 b 190 -831 122 -918 166 -881 b 269 -506 242 -727 269 -612 b 268 -462 269 -492 269 -477 b 266 -449 266 -458 266 -452 b 265 -444 266 -445 266 -444 b 257 -446 264 -444 261 -445 b 132 -545 196 -470 152 -505 b 88 -573 122 -563 104 -573 b 39 -523 63 -573 39 -553 b 63 -476 39 -505 44 -494 b 360 -359 136 -408 235 -369 m 419 -424 b 393 -423 411 -423 406 -423 l 375 -423 l 377 -426 b 379 -439 377 -427 378 -434 b 383 -510 382 -463 383 -487 b 314 -811 383 -609 360 -710 b 266 -893 296 -850 285 -870 b 264 -898 265 -896 264 -898 l 264 -898 b 264 -898 264 -898 264 -898 b 268 -898 264 -898 266 -898 b 273 -898 270 -898 272 -898 b 300 -909 283 -898 291 -900 b 426 -957 340 -941 385 -957 b 476 -949 443 -957 460 -954 b 547 -853 522 -931 547 -893 b 485 -745 547 -816 526 -775 b 397 -707 460 -727 432 -714 b 366 -675 375 -703 366 -692 b 396 -642 366 -657 377 -645 b 530 -557 455 -637 511 -601 b 536 -527 534 -548 536 -537 b 419 -424 536 -480 490 -437 ', + }, + timeSig0: { + x_min: 0, + x_max: 514.5, + ha: 525, + o: 'm 236 648 b 246 648 238 648 242 648 b 288 646 261 648 283 648 b 472 513 364 634 428 587 b 514 347 502 464 514 413 b 462 163 514 272 499 217 b 257 44 409 83 333 44 b 50 163 181 44 103 83 b 0 347 14 217 0 272 b 40 513 0 413 12 464 b 236 648 87 591 155 638 m 277 614 b 253 616 273 616 261 616 b 242 616 247 616 243 616 b 170 499 193 609 181 589 b 159 348 163 446 159 398 b 166 222 159 308 161 266 b 201 91 174 138 183 106 b 257 76 215 81 235 76 b 311 91 277 76 299 81 b 347 222 330 106 338 138 b 353 348 352 266 353 308 b 344 499 353 398 351 446 b 277 614 333 587 322 606 m 257 -1 l 258 -1 l 255 -1 l 257 -1 m 257 673 l 258 673 l 255 673 l 257 673 ', + }, + timeSig1: { + x_min: -1.359375, + x_max: 344.359375, + ha: 351, + o: 'm 126 637 l 129 638 l 198 638 l 266 638 l 269 635 b 274 631 272 634 273 632 l 277 627 l 277 395 b 279 156 277 230 277 161 b 329 88 281 123 295 106 b 344 69 341 81 344 79 b 337 55 344 62 343 59 l 333 54 l 197 54 l 61 54 l 58 55 b 50 69 53 59 50 62 b 65 88 50 79 53 81 b 80 97 72 91 74 93 b 117 156 103 113 112 129 b 117 345 117 161 117 222 l 117 528 l 100 503 l 38 406 b 14 383 24 384 23 383 b -1 398 5 383 -1 390 b 4 415 -1 403 1 409 b 16 437 5 416 10 426 l 72 539 l 100 596 b 121 632 119 631 119 631 b 126 637 122 634 125 635 m 171 -1 l 172 -1 l 170 -1 l 171 -1 m 171 673 l 172 673 l 170 673 l 171 673 ', + }, + timeSig2: { + x_min: -1.359375, + x_max: 458.6875, + ha: 468, + o: 'm 197 648 b 216 648 201 648 208 648 b 258 646 232 648 253 648 b 419 546 333 637 393 599 b 432 489 428 528 432 509 b 356 342 432 440 405 384 b 235 278 322 313 288 295 b 69 170 166 256 107 217 b 69 169 69 170 69 169 b 69 169 69 169 69 169 b 74 173 69 169 72 170 b 209 222 112 204 163 222 b 310 195 247 222 274 215 b 371 179 332 184 352 179 b 396 181 379 179 387 179 b 428 202 409 184 423 194 b 442 212 431 209 436 212 b 458 197 450 212 458 206 b 441 148 458 190 449 165 b 299 44 409 84 353 44 b 288 45 295 44 292 44 b 250 61 274 45 268 49 b 122 99 212 86 164 99 b 73 91 104 99 88 97 b 28 63 53 84 34 72 b 14 54 25 56 20 54 b 1 62 9 54 4 56 l -1 65 l -1 79 b 0 99 -1 91 0 95 b 2 113 1 102 2 108 b 164 309 20 197 81 272 b 285 470 232 341 277 398 b 287 487 287 476 287 481 b 171 595 287 551 239 595 b 155 595 166 595 160 595 b 142 592 145 594 142 594 b 145 589 142 592 142 591 b 179 527 168 576 179 551 b 132 455 179 496 163 467 b 104 451 122 452 112 451 b 27 530 62 451 27 487 b 29 555 27 538 27 546 b 197 648 44 601 115 639 m 228 -1 l 230 -1 l 227 -1 l 228 -1 m 228 673 l 230 673 l 227 673 l 228 673 ', + }, + timeSig3: { + x_min: -1.359375, + x_max: 409.6875, + ha: 418, + o: 'm 174 648 b 191 648 176 648 183 648 b 225 648 204 648 220 648 b 402 523 317 638 389 588 b 404 503 404 517 404 510 b 402 484 404 495 404 488 b 264 373 389 437 334 394 b 257 370 259 371 257 371 b 257 370 257 370 257 370 b 264 369 258 370 261 369 b 409 202 359 334 409 267 b 318 72 409 152 381 104 b 200 43 281 52 240 43 b 23 113 134 43 69 68 b 0 169 6 129 0 149 b 77 249 0 210 29 249 l 77 249 b 152 174 125 249 152 212 b 103 102 152 145 137 116 b 103 102 103 102 103 102 b 147 94 103 101 132 95 b 153 94 149 94 151 94 b 265 206 219 94 265 141 b 264 226 265 213 265 219 b 147 355 253 299 204 353 b 126 371 133 356 126 362 b 147 388 126 383 132 388 b 254 474 196 391 238 424 b 259 502 258 484 259 494 b 182 592 259 544 228 582 b 156 595 175 595 166 595 b 115 592 142 595 129 594 l 111 591 l 115 588 b 152 524 141 574 152 549 b 92 449 152 491 130 458 b 76 448 87 448 81 448 b -1 530 32 448 -1 488 b 20 581 -1 548 5 566 b 174 648 55 619 108 641 m 204 -1 l 205 -1 l 202 -1 l 204 -1 m 204 673 l 205 673 l 202 673 l 204 673 ', + }, + timeSig4: { + x_min: 0, + x_max: 468.21875, + ha: 478, + o: 'm 174 637 b 232 638 175 638 189 638 b 277 638 245 638 259 638 l 378 638 l 381 635 b 389 623 386 632 389 627 b 382 609 389 617 386 613 b 366 589 381 606 372 598 l 313 528 l 245 451 l 209 410 l 155 348 l 84 267 b 59 240 72 252 59 240 b 59 240 59 240 59 240 b 151 238 59 238 68 238 l 242 238 l 242 303 b 243 371 242 369 242 370 b 289 426 245 374 254 385 l 303 441 l 317 456 l 338 483 l 360 506 l 371 520 b 386 527 375 526 381 527 b 400 519 392 527 397 524 b 401 440 401 516 401 514 b 401 377 401 423 401 402 l 401 238 l 426 238 b 453 237 449 238 450 238 b 465 217 461 234 465 226 b 460 202 465 212 464 206 b 426 197 454 197 453 197 l 401 197 l 401 180 b 451 88 402 129 412 109 b 468 69 465 81 468 79 b 461 55 468 62 466 59 l 458 54 l 321 54 l 185 54 l 182 55 b 175 69 176 59 175 62 b 191 88 175 79 176 81 b 240 180 230 109 240 129 l 240 197 l 125 197 b 73 195 104 195 87 195 b 8 197 10 195 9 197 b 0 212 2 199 0 205 b 0 212 0 212 0 212 b 20 242 0 219 0 219 b 163 610 104 344 163 492 b 174 637 163 628 166 634 m 234 -1 l 235 -1 l 232 -1 l 234 -1 m 234 673 l 235 673 l 232 673 l 234 673 ', + }, + timeSig5: { + x_min: 0, + x_max: 409.6875, + ha: 418, + o: 'm 47 637 b 53 638 49 638 50 638 b 69 634 55 638 61 637 b 210 610 114 619 161 610 b 363 634 259 610 311 619 b 382 638 372 637 378 638 b 392 634 386 638 389 637 b 397 623 396 630 397 627 b 393 610 397 620 396 616 b 298 505 368 552 338 520 b 212 494 277 498 246 494 b 65 517 163 494 106 502 b 61 517 62 517 61 517 b 61 517 61 517 61 517 b 51 408 61 517 51 412 b 51 408 51 408 51 408 b 51 408 51 408 51 408 b 61 412 53 408 55 409 b 125 434 80 421 103 430 b 185 441 145 440 166 441 b 409 244 310 441 409 353 b 401 191 409 227 406 209 b 197 43 375 105 287 43 b 159 47 183 43 171 44 b 23 123 112 56 61 86 b 0 180 6 140 0 159 b 76 260 0 220 31 260 b 92 259 81 260 87 259 b 152 183 132 251 152 216 b 100 112 152 152 134 122 b 95 111 98 112 95 111 b 95 111 95 111 95 111 b 129 98 95 109 119 101 b 148 97 136 97 141 97 b 264 235 206 97 261 158 b 265 248 265 240 265 244 b 210 398 265 312 243 373 b 179 408 201 406 194 408 b 174 408 178 408 176 408 b 53 369 130 408 88 394 b 34 359 39 359 38 359 b 17 374 24 359 17 365 b 39 628 17 384 38 625 b 47 637 40 631 43 635 m 204 -1 l 205 -1 l 202 -1 l 204 -1 m 204 673 l 205 673 l 202 673 l 204 673 ', + }, + timeSig6: { + x_min: 0, + x_max: 475.03125, + ha: 485, + o: 'm 255 648 b 274 648 259 648 266 648 b 314 646 288 648 307 648 b 450 555 374 637 438 594 b 454 530 453 546 454 538 b 375 451 454 485 416 451 b 328 467 359 451 343 455 b 300 526 310 483 300 503 b 352 598 300 557 319 589 b 356 599 355 598 356 599 b 352 602 356 599 355 601 b 288 616 330 612 308 616 b 210 584 257 616 230 605 b 164 433 189 559 174 508 b 160 374 163 415 160 381 b 160 374 160 374 160 374 b 160 374 160 374 160 374 b 168 377 160 374 164 376 b 258 395 200 390 228 395 b 366 367 294 395 328 387 b 475 223 436 333 475 283 b 472 197 475 215 473 206 b 349 65 462 141 419 95 b 259 43 317 51 288 43 b 167 69 230 43 200 52 b 4 290 80 113 20 195 b 0 349 1 309 0 328 b 20 467 0 391 6 433 b 255 648 58 563 155 637 m 269 363 b 257 363 265 363 261 363 b 210 345 236 363 220 356 b 186 226 196 324 186 272 b 187 198 186 216 186 206 b 213 95 191 151 202 112 b 257 76 221 83 238 76 b 270 77 261 76 266 76 b 321 156 299 81 310 99 b 329 229 326 183 329 206 b 321 301 329 252 326 274 b 269 363 311 342 298 359 m 236 -1 l 238 -1 l 235 -1 l 236 -1 m 236 673 l 238 673 l 235 673 l 236 673 ', + }, + timeSig7: { + x_min: 0, + x_max: 442.359375, + ha: 451, + o: 'm 147 648 b 166 649 153 649 160 649 b 313 598 217 649 273 630 b 340 587 323 588 328 587 l 341 587 b 412 628 367 587 390 601 b 427 638 416 635 421 638 b 439 632 431 638 435 637 b 442 623 441 630 442 628 b 430 569 442 616 439 603 b 352 369 408 492 377 410 b 300 259 325 324 313 298 b 273 84 283 205 273 140 b 265 55 273 65 272 59 l 261 54 l 181 54 l 99 54 l 96 55 b 91 61 95 56 92 59 l 89 63 l 89 77 b 147 263 89 133 111 202 b 261 401 176 313 212 355 b 378 541 315 449 349 489 l 382 548 l 375 544 b 240 495 333 512 285 495 b 129 535 198 495 160 509 b 84 560 108 552 95 560 b 76 559 81 560 78 560 b 31 487 59 555 43 530 b 14 470 27 473 24 470 b 1 477 8 470 4 471 l 0 480 l 0 553 l 0 627 l 1 630 b 16 638 4 635 9 638 b 23 635 17 638 20 637 b 49 626 36 626 39 626 b 96 638 59 626 80 630 b 104 639 99 638 102 639 b 117 644 107 641 112 642 b 147 648 125 645 137 648 m 220 -1 l 221 -1 l 219 -1 l 220 -1 m 220 673 l 221 673 l 219 673 l 220 673 ', + }, + timeSig8: { + x_min: 0, + x_max: 488.640625, + ha: 499, + o: 'm 217 648 b 245 649 225 648 235 649 b 453 516 343 649 430 595 b 458 478 455 503 458 491 b 412 370 458 440 441 398 b 411 369 412 369 411 369 b 415 365 411 367 412 367 b 488 231 462 331 488 281 b 472 165 488 208 483 186 b 243 43 434 86 338 43 b 63 104 178 43 112 62 b 0 233 20 140 0 186 b 73 365 0 283 24 331 l 77 369 l 72 374 b 29 476 42 406 29 441 b 217 648 29 557 103 635 m 258 605 b 242 606 253 605 247 606 b 157 552 198 606 157 580 b 160 541 157 548 159 544 b 319 413 176 503 242 452 l 337 403 l 338 406 b 359 476 352 428 359 452 b 258 605 359 537 318 595 m 138 326 b 130 330 134 328 130 330 b 130 330 130 330 130 330 b 107 305 127 330 112 313 b 84 231 91 281 84 256 b 243 86 84 156 151 86 b 249 87 245 86 246 87 b 347 156 303 88 347 120 b 344 172 347 162 345 167 b 156 319 325 227 257 281 b 138 326 151 322 144 324 m 243 -1 l 245 -1 l 242 -1 l 243 -1 m 243 673 l 245 673 l 242 673 l 243 673 ', + }, + timeSig9: { + x_min: 0, + x_max: 475.03125, + ha: 485, + o: 'm 191 646 b 212 649 198 648 205 649 b 255 644 227 649 243 646 b 458 448 348 616 428 539 b 475 342 469 415 475 378 b 460 244 475 308 469 274 b 193 44 421 124 303 44 b 91 69 157 44 122 51 b 19 161 43 97 19 126 b 21 181 19 167 20 174 b 98 241 32 220 65 241 b 170 186 129 241 160 223 b 172 166 171 179 172 173 b 121 94 172 134 152 102 b 117 93 118 94 117 93 b 121 90 117 93 118 91 b 185 76 142 80 164 76 b 270 119 220 76 251 91 b 308 259 287 145 300 194 b 313 317 310 277 313 310 b 313 317 313 317 313 317 b 313 317 313 317 313 317 b 304 315 313 317 308 316 b 216 295 273 302 245 295 b 145 308 193 295 170 299 b 19 398 88 327 42 360 b 0 469 5 420 0 444 b 24 551 0 496 8 526 b 191 646 54 596 125 637 m 227 614 b 215 616 224 616 220 616 b 202 614 210 616 206 616 b 152 535 174 610 163 592 b 144 463 147 509 144 485 b 152 391 144 440 147 417 b 216 328 163 344 179 328 b 280 391 253 328 269 344 b 288 463 285 417 288 440 b 280 535 288 485 285 509 b 227 614 269 594 258 610 m 236 -1 l 238 -1 l 235 -1 l 236 -1 m 236 673 l 238 673 l 235 673 l 236 673 ', + }, + timeSigCommon: { + x_min: -1.359375, + x_max: 556.6875, + ha: 568, + o: 'm 294 322 b 318 323 299 322 308 323 b 360 320 334 323 352 322 b 526 217 430 310 490 273 b 543 166 537 202 543 184 b 447 70 543 117 503 70 b 445 70 447 70 446 70 b 359 159 394 72 359 113 b 368 201 359 173 362 187 b 442 245 382 229 412 245 b 455 244 446 245 451 245 b 460 244 458 244 460 244 b 460 244 460 244 460 244 b 454 248 460 244 458 245 b 325 291 417 276 372 291 b 285 287 313 291 299 290 b 144 -2 183 269 144 190 b 281 -290 144 -208 179 -280 b 304 -291 289 -291 298 -291 b 524 -105 412 -291 506 -212 b 541 -84 526 -88 530 -84 b 556 -101 551 -84 556 -90 b 549 -138 556 -111 553 -122 b 334 -322 521 -237 435 -310 b 302 -324 323 -323 313 -324 b 13 -101 172 -324 54 -234 b -1 -1 4 -68 -1 -34 b 294 322 -1 161 121 303 ', + }, + timeSigCutCommon: { + x_min: 0, + x_max: 556.6875, + ha: 568, + o: 'm 289 545 b 298 546 292 545 295 546 b 318 533 306 546 315 541 b 319 428 319 530 319 528 l 319 327 l 334 327 b 526 223 412 326 485 285 b 543 172 537 206 543 190 b 447 76 543 122 503 76 b 445 76 446 76 446 76 b 359 165 394 77 359 119 b 368 205 359 179 362 192 b 441 251 382 233 412 251 b 455 249 446 251 451 251 b 460 248 458 249 460 248 b 460 248 460 248 460 248 b 454 254 460 249 458 251 b 334 295 419 280 378 294 l 319 295 l 319 4 l 319 -287 l 321 -285 b 328 -285 322 -285 325 -285 b 524 -99 424 -277 507 -198 b 541 -79 526 -84 530 -79 b 556 -97 551 -79 556 -84 b 548 -133 556 -105 553 -117 b 334 -317 521 -233 434 -306 b 322 -319 329 -317 323 -317 l 319 -319 l 319 -424 b 319 -471 319 -444 319 -459 b 313 -541 319 -544 318 -535 b 298 -548 308 -545 303 -548 b 279 -534 289 -548 281 -542 b 277 -424 277 -531 277 -530 l 277 -317 l 273 -317 b 13 -95 153 -305 51 -217 b 0 2 4 -62 0 -29 b 182 295 0 126 66 238 b 274 324 210 309 249 320 l 277 324 l 277 427 b 279 533 277 528 277 530 b 289 545 281 538 285 542 m 277 2 b 277 291 277 161 277 291 b 268 288 277 291 273 290 b 144 1 179 265 144 184 b 276 -284 144 -199 175 -267 l 277 -285 l 277 2 ', + }, + timeSigPlus: { + x_min: 0, + x_max: 319.859375, + ha: 326, + o: 'm 149 508 b 159 509 152 509 155 509 b 186 494 170 509 181 503 b 190 440 190 487 190 488 l 190 430 l 190 377 l 242 377 l 251 377 b 303 373 298 377 296 377 b 319 345 314 367 319 356 b 304 319 319 335 314 324 b 250 315 296 315 299 315 l 242 315 l 190 315 l 190 262 l 190 252 b 186 198 190 204 190 205 b 159 183 179 188 170 183 b 132 198 148 183 138 188 b 127 252 127 205 127 204 l 127 262 l 127 315 l 76 315 l 68 315 b 14 319 20 315 21 315 b 0 347 4 324 0 335 b 14 373 0 356 4 367 b 68 377 21 377 20 377 l 76 377 l 127 377 l 127 430 l 127 440 b 132 494 127 488 127 487 b 149 508 136 501 142 505 ', + }, + timeSigPlusSmall: { + x_min: 0, + x_max: 319.859375, + ha: 326, + o: 'm 149 508 b 159 509 152 509 155 509 b 186 494 170 509 181 503 b 190 440 190 487 190 488 l 190 430 l 190 377 l 242 377 l 251 377 b 303 373 298 377 296 377 b 319 345 314 367 319 356 b 304 319 319 335 314 324 b 250 315 296 315 299 315 l 242 315 l 190 315 l 190 262 l 190 252 b 186 198 190 204 190 205 b 159 183 179 188 170 183 b 132 198 148 183 138 188 b 127 252 127 205 127 204 l 127 262 l 127 315 l 76 315 l 68 315 b 14 319 20 315 21 315 b 0 347 4 324 0 335 b 14 373 0 356 4 367 b 68 377 21 377 20 377 l 76 377 l 127 377 l 127 430 l 127 440 b 132 494 127 488 127 487 b 149 508 136 501 142 505 ', + }, + timeSigMinus: { + x_min: 0, + x_max: 318.5, + ha: 325, + o: 'm 20 376 b 167 377 23 377 96 377 b 296 376 231 377 294 377 b 318 347 311 371 318 359 b 296 316 318 333 311 320 b 159 315 294 315 227 315 b 21 316 91 315 24 315 b 0 345 6 320 0 333 b 20 376 0 359 6 371 ', + }, + timeSigParensRight: { + x_min: 25.859375, + x_max: 164.6875, + ha: 168, + o: 'm 34 369 b 40 370 35 370 38 370 b 59 353 49 370 50 367 b 164 40 122 254 155 158 b 164 0 164 33 164 16 b 164 -40 164 -16 164 -34 b 59 -353 155 -158 122 -254 b 40 -371 53 -366 47 -371 b 34 -370 38 -371 36 -370 b 25 -358 28 -367 25 -363 b 31 -337 25 -352 27 -347 b 92 0 72 -234 92 -117 b 31 335 92 116 72 233 b 25 356 27 345 25 352 b 34 369 25 363 28 366 ', + }, + timeSigParensRightSmall: { + x_min: 25.859375, + x_max: 164.6875, + ha: 168, + o: 'm 34 369 b 40 370 35 370 38 370 b 59 353 49 370 50 367 b 164 40 122 254 155 158 b 164 0 164 33 164 16 b 164 -40 164 -16 164 -34 b 59 -353 155 -158 122 -254 b 40 -371 53 -366 47 -371 b 34 -370 38 -371 36 -370 b 25 -358 28 -367 25 -363 b 31 -337 25 -352 27 -347 b 92 0 72 -234 92 -117 b 31 335 92 116 72 233 b 25 356 27 345 25 352 b 34 369 25 363 28 366 ', + }, + timeSigParensLeft: { + x_min: -166.0625, + x_max: -25.859375, + ha: 0, + o: 'm -49 369 b -42 370 -46 369 -44 370 b -27 360 -36 370 -29 366 b -25 355 -27 359 -25 358 b -32 335 -25 351 -28 347 b -92 52 -66 248 -87 159 b -93 -1 -93 43 -93 20 b -92 -54 -93 -23 -93 -45 b -32 -337 -85 -162 -66 -251 b -25 -355 -27 -349 -25 -352 b -42 -371 -25 -365 -32 -371 b -61 -353 -50 -371 -51 -369 b -163 -63 -119 -262 -153 -165 b -166 -1 -166 -37 -166 -31 b -163 62 -166 30 -166 36 b -61 352 -153 163 -119 260 b -49 369 -54 365 -51 366 ', + }, + timeSigParensLeftSmall: { + x_min: -166.0625, + x_max: -25.859375, + ha: 0, + o: 'm -49 369 b -42 370 -46 369 -44 370 b -27 360 -36 370 -29 366 b -25 355 -27 359 -25 358 b -32 335 -25 351 -28 347 b -92 52 -66 248 -87 159 b -93 -1 -93 43 -93 20 b -92 -54 -93 -23 -93 -45 b -32 -337 -85 -162 -66 -251 b -25 -355 -27 -349 -25 -352 b -42 -371 -25 -365 -32 -371 b -61 -353 -50 -371 -51 -369 b -163 -63 -119 -262 -153 -165 b -166 -1 -166 -37 -166 -31 b -163 62 -166 30 -166 36 b -61 352 -153 163 -119 260 b -49 369 -54 365 -51 366 ', + }, + noteheadDoubleWhole: { + x_min: 0, + x_max: 902.421875, + ha: 921, + o: 'm 17 240 b 24 241 19 241 21 241 b 32 240 28 241 31 241 b 46 229 38 238 43 234 b 50 88 50 223 50 237 b 50 -1 50 63 50 34 b 50 -90 50 -36 50 -65 b 46 -231 50 -238 50 -224 b 25 -242 42 -238 34 -242 b 0 -224 14 -242 4 -235 b 0 2 0 -222 0 -108 b 0 223 0 112 0 220 b 17 240 2 230 9 237 m 110 240 b 118 241 111 241 114 241 b 126 240 121 241 123 241 b 142 223 133 237 140 230 b 144 123 144 220 144 205 b 144 29 144 45 144 29 b 144 29 144 29 144 29 b 393 183 166 106 264 167 b 450 186 412 184 431 186 b 756 29 600 186 732 120 b 756 29 756 29 756 29 b 758 123 758 29 758 45 b 760 227 758 226 758 223 b 784 241 766 237 774 241 b 804 229 792 241 800 237 b 809 88 808 223 809 237 l 809 -1 l 809 -90 b 804 -231 809 -238 808 -224 b 784 -242 800 -238 792 -242 b 762 -231 775 -242 766 -238 b 758 -124 756 -224 758 -231 b 756 -30 758 -47 758 -30 b 756 -30 756 -30 756 -30 b 509 -184 736 -108 637 -169 b 450 -187 488 -187 469 -187 b 144 -30 300 -187 168 -122 b 144 -30 144 -30 144 -30 b 144 -124 144 -30 144 -47 b 140 -231 144 -231 144 -224 b 118 -242 134 -238 126 -242 b 92 -224 107 -242 96 -235 b 92 2 92 -222 92 -108 b 92 223 92 112 92 220 b 110 240 95 230 102 237 m 432 161 b 413 162 426 162 420 162 b 313 41 351 162 313 109 b 347 -73 313 5 323 -34 b 487 -163 385 -133 439 -163 b 578 -97 526 -163 562 -142 b 588 -43 585 -80 588 -62 b 432 161 588 47 518 147 m 868 240 b 876 241 869 241 872 241 b 884 240 879 241 882 241 b 898 229 890 238 894 234 b 902 88 902 223 902 237 l 902 -1 l 902 -90 b 898 -231 902 -238 902 -224 b 876 -242 892 -238 884 -242 b 852 -224 865 -242 854 -235 b 850 2 850 -222 850 -108 b 852 223 850 112 850 220 b 868 240 853 230 860 237 ', + }, + noteheadWhole: { + x_min: 0, + x_max: 619.3125, + ha: 632, + o: 'm 274 184 b 307 186 285 186 296 186 b 616 22 465 186 597 116 b 619 -1 617 13 619 5 b 308 -187 619 -104 483 -187 b 0 -1 133 -187 0 -102 b 5 36 0 11 1 23 b 274 184 29 115 141 176 m 289 161 b 272 162 284 162 277 162 b 171 41 209 162 171 108 b 205 -73 171 5 182 -34 b 345 -163 243 -133 298 -163 b 436 -98 385 -163 420 -142 b 446 -43 443 -80 446 -62 b 289 161 446 47 377 147 ', + }, + noteheadHalf: { + x_min: 0, + x_max: 428.75, + ha: 438, + o: 'm 262 186 b 273 186 266 186 272 186 b 274 186 273 186 274 186 b 285 186 274 186 280 186 b 428 48 375 181 428 122 b 386 -68 428 12 416 -29 b 155 -187 329 -145 236 -187 b 12 -111 92 -187 38 -162 b 0 -51 4 -91 0 -72 b 262 186 0 58 122 179 m 366 131 b 352 134 362 133 357 134 b 219 81 321 134 269 115 b 47 -111 126 23 50 -62 b 47 -112 47 -111 47 -112 b 77 -136 47 -129 58 -136 b 264 -45 118 -136 194 -101 b 382 109 336 12 382 76 b 366 131 382 120 377 129 ', + }, + noteheadBlack: { + x_min: 0, + x_max: 428.75, + ha: 438, + o: 'm 262 186 b 273 186 266 186 272 186 b 274 186 273 186 274 186 b 285 186 274 186 280 186 b 428 48 375 181 428 122 b 386 -68 428 12 416 -29 b 155 -187 329 -145 236 -187 b 12 -111 92 -187 38 -162 b 0 -51 4 -91 0 -72 b 262 186 0 58 122 179 ', + }, + noteheadXWhole: { + x_min: 0, + x_max: 598.890625, + ha: 611, + o: 'm 62 181 b 77 183 66 183 72 183 b 91 181 83 183 88 183 b 202 131 100 180 106 177 l 299 87 l 394 131 b 517 183 499 181 502 183 b 519 183 517 183 518 183 b 598 104 567 183 598 144 b 577 49 598 84 592 65 b 518 15 567 38 563 37 b 484 0 499 6 484 0 b 518 -16 484 -1 499 -8 b 577 -51 563 -38 567 -40 b 598 -105 592 -66 598 -86 b 519 -184 598 -145 567 -184 b 517 -184 518 -184 517 -184 b 394 -133 502 -184 499 -183 l 299 -88 l 202 -133 b 81 -184 99 -183 95 -184 b 77 -184 80 -184 78 -184 b 0 -105 29 -184 0 -145 b 20 -51 0 -86 5 -66 b 80 -16 29 -40 34 -38 b 114 -1 98 -8 114 -1 b 80 15 114 0 98 6 b 20 49 34 37 29 38 b 0 104 6 65 0 84 b 62 181 0 140 23 174 m 88 134 b 74 136 85 134 80 136 b 68 134 72 136 69 136 b 46 104 54 130 46 117 b 55 81 46 95 49 88 b 149 34 59 76 53 80 b 224 -1 190 15 224 0 b 144 -38 224 -1 187 -18 b 54 -84 59 -79 58 -79 b 46 -105 49 -90 46 -98 b 76 -137 46 -122 58 -137 b 78 -137 77 -137 77 -137 b 194 -86 87 -137 76 -141 b 298 -36 250 -58 298 -36 b 298 -36 298 -36 298 -36 b 402 -84 299 -36 345 -58 b 518 -137 522 -141 510 -137 b 521 -137 519 -137 519 -137 b 551 -105 539 -137 551 -122 b 541 -83 551 -98 548 -90 b 447 -36 537 -77 544 -81 b 374 -1 406 -16 374 -1 b 447 34 374 0 406 15 b 541 81 544 80 537 76 b 551 104 548 88 551 97 b 521 136 551 120 539 136 b 518 136 519 136 519 136 b 517 136 518 136 517 136 l 517 136 b 402 83 511 136 511 136 b 298 34 345 56 299 34 b 298 34 298 34 298 34 b 194 84 298 34 250 56 b 88 134 137 111 89 133 ', + }, + noteheadXHalf: { + x_min: 0, + x_max: 406.96875, + ha: 415, + o: 'm 55 181 b 70 183 61 183 66 183 b 111 170 85 183 99 179 b 160 130 115 167 137 149 l 202 95 l 245 130 b 319 181 299 176 302 179 b 334 183 325 183 330 183 b 406 109 375 183 406 148 b 401 81 406 99 405 91 b 348 24 394 65 390 59 b 318 -1 332 11 318 0 b 348 -26 318 -1 332 -12 b 401 -83 390 -61 394 -66 b 406 -111 405 -93 406 -101 b 334 -184 406 -149 375 -184 b 319 -183 330 -184 325 -184 b 245 -131 302 -180 299 -177 l 202 -97 l 160 -131 b 85 -183 107 -177 103 -180 b 70 -184 80 -184 76 -184 b 0 -111 31 -184 0 -149 b 4 -83 0 -101 1 -93 b 58 -26 10 -66 16 -61 b 88 -1 74 -12 88 -1 b 58 24 88 0 74 11 b 10 69 23 54 17 59 b 0 109 2 81 0 95 b 55 181 0 142 21 173 m 83 133 b 72 136 78 136 76 136 b 57 131 66 136 61 134 b 46 109 49 126 46 117 b 50 93 46 104 47 98 b 107 45 51 91 77 70 b 160 0 137 20 160 0 b 107 -47 160 -1 137 -22 b 50 -94 77 -72 51 -93 b 46 -111 47 -99 46 -105 b 59 -134 46 -120 50 -130 b 72 -137 62 -136 68 -137 b 83 -136 76 -137 80 -136 b 144 -84 84 -134 107 -116 b 202 -36 176 -58 202 -36 b 261 -84 202 -36 230 -58 b 323 -136 299 -116 321 -134 b 334 -137 326 -136 330 -137 b 345 -134 338 -137 343 -136 b 360 -111 355 -130 360 -120 b 355 -94 360 -105 359 -99 b 299 -47 353 -93 329 -72 b 245 0 269 -22 245 -1 b 299 45 245 0 269 20 b 355 93 329 70 353 91 b 360 109 359 98 360 104 b 345 133 360 119 355 129 b 334 136 343 134 338 136 b 323 134 330 136 326 134 b 261 83 321 133 299 115 b 202 34 230 56 202 34 b 144 83 202 34 176 56 b 83 133 106 115 84 133 ', + }, + noteheadXBlack: { + x_min: 0, + x_max: 406.96875, + ha: 415, + o: 'm 21 183 b 28 183 24 183 25 183 b 42 181 34 183 39 183 b 127 108 47 179 47 179 b 202 41 168 72 202 41 b 279 108 204 41 238 72 b 357 177 321 145 356 176 b 375 183 363 181 370 183 b 406 151 392 183 406 169 b 404 137 406 147 405 141 b 322 62 401 131 398 129 b 251 0 284 27 251 0 b 322 -63 251 -1 284 -29 b 404 -138 398 -130 401 -133 b 406 -152 405 -142 406 -148 b 375 -184 406 -170 392 -184 b 357 -179 370 -184 363 -183 b 279 -109 356 -177 321 -147 b 202 -43 238 -73 204 -43 b 127 -109 202 -43 168 -73 b 49 -179 85 -147 50 -177 b 31 -184 43 -183 36 -184 b 0 -152 13 -184 0 -170 b 2 -138 0 -148 0 -142 b 83 -63 5 -133 8 -130 b 155 0 122 -29 155 -1 b 83 62 155 0 122 27 b 8 129 43 97 10 127 b 0 151 2 136 0 144 b 21 183 0 165 8 177 ', + }, + noteheadCircleX: { + x_min: 0, + x_max: 484.5625, + ha: 494, + o: 'm 228 245 b 239 247 234 247 239 247 b 243 247 240 247 242 247 b 303 238 257 247 287 242 b 484 -2 417 208 484 104 b 412 -177 484 -65 461 -127 b 243 -248 363 -226 303 -248 b 6 -63 138 -248 36 -180 b 0 -1 1 -41 0 -20 b 228 245 0 127 98 240 m 255 181 b 240 183 247 183 245 183 b 232 181 238 183 235 183 b 142 152 200 180 168 170 l 138 149 l 190 97 l 242 44 l 294 97 l 345 149 l 340 152 b 255 181 315 169 284 180 m 147 -54 l 197 -1 l 147 51 l 95 104 l 91 99 b 62 -1 72 70 62 34 b 66 -43 62 -15 63 -29 b 91 -101 72 -63 80 -84 l 95 -106 l 147 -54 m 393 99 b 389 104 390 102 389 104 b 337 51 389 104 366 80 l 285 -1 l 337 -54 l 389 -106 l 393 -101 b 421 -1 412 -72 421 -36 b 393 99 421 34 412 69 m 294 -98 b 242 -45 265 -69 242 -45 b 190 -98 242 -45 219 -69 l 138 -151 l 142 -154 b 242 -184 172 -174 206 -184 b 340 -154 276 -184 311 -174 l 345 -151 l 294 -98 ', + }, + noteheadTriangleUpWhole: { + x_min: 0, + x_max: 630.203125, + ha: 643, + o: 'm 308 204 b 314 205 310 205 313 205 b 326 201 319 205 323 204 b 355 154 328 199 338 180 b 401 83 362 142 392 95 l 409 72 b 431 41 412 66 424 49 b 619 -174 498 -51 570 -134 b 630 -192 626 -180 630 -186 b 626 -202 630 -195 628 -199 b 616 -206 623 -205 620 -206 b 552 -188 608 -206 592 -202 b 310 -155 488 -169 392 -155 b 268 -156 295 -155 281 -155 b 77 -188 197 -161 126 -173 b 13 -206 35 -202 20 -206 b 9 -206 12 -206 10 -206 b 0 -191 2 -202 0 -197 b 8 -176 0 -186 2 -180 b 204 49 58 -136 138 -43 l 220 72 l 227 83 b 295 188 245 108 281 166 b 308 204 299 197 304 202 m 315 147 b 314 147 315 147 314 147 b 314 147 314 147 314 147 b 306 129 314 145 310 138 l 296 105 b 281 72 292 97 284 77 l 274 56 b 181 -123 247 -4 212 -72 l 174 -134 l 176 -133 b 314 -123 215 -127 272 -123 b 451 -133 356 -123 413 -127 l 454 -134 l 449 -123 b 353 56 417 -72 381 -4 l 347 72 b 332 105 344 77 336 97 l 322 129 b 315 147 318 138 315 145 ', + }, + noteheadTriangleUpHalf: { + x_min: 0, + x_max: 438.28125, + ha: 447, + o: 'm 212 205 b 219 205 213 205 216 205 b 239 183 228 205 231 204 b 421 -163 298 40 363 -83 b 438 -191 434 -180 438 -186 b 436 -197 438 -192 438 -195 b 424 -206 434 -204 431 -206 b 406 -201 420 -206 415 -205 b 216 -156 347 -172 281 -156 b 23 -205 148 -156 80 -173 b 14 -206 20 -206 17 -206 b 0 -191 6 -206 0 -201 b 6 -176 0 -187 1 -183 b 202 192 63 -104 142 45 b 212 205 205 199 208 202 m 264 48 l 249 81 l 243 94 l 242 91 b 89 -126 208 36 137 -66 b 81 -138 85 -133 81 -138 b 81 -138 81 -138 81 -138 b 81 -138 81 -138 81 -138 b 95 -133 81 -138 87 -136 b 280 -94 156 -108 221 -94 b 334 -98 299 -94 317 -95 b 343 -99 338 -99 343 -99 b 343 -99 343 -99 343 -99 b 338 -94 343 -99 341 -97 b 264 48 318 -58 287 1 ', + }, + noteheadTriangleUpBlack: { + x_min: -1.359375, + x_max: 436.921875, + ha: 446, + o: 'm 213 205 b 217 205 215 205 216 205 b 234 194 224 205 234 199 b 236 187 234 194 235 190 l 245 167 l 261 129 l 270 106 b 355 -61 294 54 329 -13 b 420 -163 381 -105 402 -138 b 436 -188 435 -184 436 -184 b 436 -191 436 -190 436 -190 b 421 -206 436 -201 431 -206 l 421 -206 l 416 -206 l 405 -201 b 217 -158 347 -172 283 -158 b 31 -201 153 -158 88 -172 l 20 -206 l 14 -206 l 14 -206 b 0 -191 5 -206 0 -201 b -1 -188 0 -190 -1 -190 b 14 -163 -1 -186 0 -184 b 95 -34 36 -136 72 -77 b 166 106 119 8 148 68 l 175 129 l 183 148 l 200 188 b 213 205 205 199 208 202 ', + }, + noteheadDiamondWhole: { + x_min: 0, + x_max: 627.46875, + ha: 640, + o: 'm 306 190 b 314 191 308 191 311 191 b 326 184 318 191 322 190 l 336 173 b 510 52 377 127 442 80 b 515 49 513 51 515 49 b 611 16 537 40 579 24 b 627 0 624 13 627 9 b 607 -18 627 -11 624 -13 b 330 -181 490 -49 389 -109 b 314 -192 323 -190 319 -192 b 306 -191 311 -192 308 -192 b 294 -177 302 -188 302 -188 b 257 -140 287 -170 265 -148 b 19 -18 193 -84 114 -44 b 0 0 2 -13 0 -11 b 16 16 0 9 2 13 b 110 49 47 24 89 40 b 117 52 111 49 114 51 b 145 65 126 56 130 58 b 281 163 200 93 245 124 b 300 186 288 170 291 174 b 306 190 300 187 303 188 m 317 137 b 313 142 315 141 314 142 b 308 137 313 142 311 141 b 161 4 276 84 220 33 b 155 0 159 1 155 0 b 163 -4 155 0 159 -2 b 308 -138 220 -34 276 -84 b 313 -142 311 -141 313 -142 b 317 -138 314 -142 315 -141 b 464 -4 351 -84 406 -34 b 470 0 468 -2 470 0 b 464 4 470 0 468 1 b 317 137 406 33 351 84 ', + }, + noteheadDiamondHalf: { + x_min: 0, + x_max: 438.28125, + ha: 447, + o: 'm 212 190 b 219 191 213 191 216 191 b 236 176 225 191 228 190 b 419 18 277 105 341 49 b 436 5 431 13 434 11 b 438 -1 438 4 438 1 b 424 -16 438 -8 432 -13 b 356 -49 409 -20 379 -36 b 234 -180 306 -83 258 -133 b 219 -192 230 -188 224 -192 b 200 -176 213 -192 206 -187 b 9 -15 157 -102 89 -45 b 0 0 2 -12 0 -6 b 16 18 0 9 2 12 b 200 176 93 48 159 104 b 212 190 205 186 208 188 m 239 113 b 236 117 238 116 238 117 b 230 108 235 117 234 115 b 92 -15 196 58 140 8 b 88 -18 91 -16 88 -18 b 92 -20 88 -18 91 -19 b 198 -116 130 -43 166 -74 b 200 -117 200 -117 200 -117 b 201 -117 200 -117 201 -117 b 264 -43 212 -98 242 -62 b 345 15 288 -19 321 4 b 348 18 347 16 348 16 b 344 20 348 18 347 19 b 239 113 307 41 266 79 ', + }, + noteheadDiamondBlack: { + x_min: 0, + x_max: 432.828125, + ha: 442, + o: 'm 209 186 b 213 187 210 187 212 187 b 216 187 215 187 216 187 b 224 174 216 186 220 180 b 420 -1 269 105 338 43 b 432 -12 431 -8 432 -9 b 421 -23 432 -15 432 -16 b 228 -180 345 -70 264 -137 b 219 -188 221 -188 221 -188 l 219 -188 b 208 -177 215 -188 215 -188 b 10 1 163 -106 93 -44 b 0 11 0 6 0 8 b 10 22 0 13 0 15 b 202 179 87 69 167 136 b 209 186 206 183 209 186 ', + }, + augmentationDot: { + x_min: 0, + x_max: 133.390625, + ha: 136, + o: 'm 54 66 b 65 68 58 68 61 68 b 122 37 88 68 110 56 b 133 -1 130 26 133 12 b 104 -58 133 -23 123 -44 b 66 -69 92 -65 78 -69 b 10 -38 44 -69 23 -58 b 0 -1 2 -27 0 -13 b 54 66 0 30 20 61 ', + }, + tremolo1: { + x_min: -206.890625, + x_max: 428.75, + ha: 438, + o: 'm 389 -351 b 394 -351 390 -351 393 -351 b 428 -385 413 -351 428 -367 b 428 -394 428 -388 428 -391 b 394 -428 426 -406 421 -410 l 332 -473 l 269 -516 l 205 -560 l 141 -603 l 77 -648 l 13 -692 l -50 -737 l -114 -780 l -145 -802 b -171 -813 -157 -810 -163 -813 b -175 -813 -172 -813 -174 -813 b -206 -777 -194 -811 -206 -795 b -202 -760 -206 -771 -205 -766 b -87 -675 -197 -752 -206 -757 l -34 -639 l 83 -557 l 145 -514 l 209 -470 l 272 -427 b 389 -351 375 -356 381 -352 ', + }, + flag8thUp: { + x_min: -24.5, + x_max: 317.140625, + ha: 324, + o: 'm -24 -161 l -24 -5 l -20 -5 b 0 -24 -9 -5 -2 -12 b 171 -315 21 -124 84 -233 b 317 -660 268 -406 317 -531 b 187 -1014 317 -782 274 -909 b 161 -1034 172 -1034 171 -1034 b 141 -1013 149 -1034 141 -1025 b 152 -991 141 -1004 142 -1002 b 266 -682 228 -899 266 -788 b 174 -430 266 -588 236 -498 b -23 -317 136 -388 66 -348 b -24 -161 -23 -316 -24 -285 ', + }, + flag8thDown: { + x_min: -21.78125, + x_max: 367.5, + ha: 375, + o: 'm 230 1031 b 238 1032 232 1032 235 1032 b 259 1014 245 1032 251 1027 b 367 662 330 906 367 782 b 364 602 367 641 367 621 b 232 317 352 488 304 384 b 57 120 155 245 103 187 b -1 18 31 84 6 40 b -19 4 -4 11 -12 4 l -21 4 l -21 159 l -21 315 l -16 315 b 96 335 10 315 62 324 b 315 695 227 380 315 527 b 313 738 315 709 314 724 b 224 991 304 825 273 916 b 216 1013 219 999 216 1007 b 230 1031 216 1021 220 1028 ', + }, + flag16thUp: { + x_min: -24.5, + x_max: 317.140625, + ha: 324, + o: 'm -24 -147 l -24 -5 l -20 -5 b -1 -19 -12 -5 -4 -11 b 58 -123 6 -43 31 -86 b 196 -278 93 -173 134 -219 b 317 -570 274 -356 317 -460 b 294 -713 317 -617 308 -666 l 289 -724 l 294 -735 b 317 -873 308 -780 317 -827 b 235 -1132 317 -963 288 -1054 b 209 -1165 228 -1140 224 -1146 b 189 -1177 204 -1172 196 -1177 b 171 -1164 182 -1177 175 -1172 b 168 -1154 170 -1161 168 -1159 b 181 -1132 168 -1149 172 -1142 b 269 -891 238 -1064 269 -975 b 269 -881 269 -886 269 -884 b 262 -814 269 -857 265 -827 b 258 -800 261 -811 259 -806 b 142 -628 240 -731 198 -667 b -8 -589 112 -606 47 -589 b -20 -589 -13 -589 -19 -589 l -24 -589 l -24 -449 l -24 -308 l -20 -308 b -1 -322 -12 -308 -4 -313 b 58 -424 6 -345 31 -388 b 194 -580 93 -476 136 -523 b 259 -660 221 -606 245 -635 b 261 -663 259 -662 261 -663 b 264 -656 262 -663 262 -660 b 269 -587 268 -632 269 -610 b 264 -521 269 -566 268 -544 b 262 -512 264 -517 262 -513 b 258 -498 261 -509 259 -503 b 142 -326 240 -428 198 -365 b -8 -287 112 -303 47 -288 b -20 -287 -13 -287 -19 -287 l -24 -287 l -24 -147 ', + }, + flag16thDown: { + x_min: -21.78125, + x_max: 362.0625, + ha: 369, + o: 'm 302 1031 b 308 1032 304 1032 307 1032 b 330 1016 318 1032 325 1027 b 362 867 351 970 362 920 b 340 738 362 824 353 780 l 336 727 l 340 717 b 362 591 355 677 362 634 b 257 323 362 496 325 401 b 204 272 243 306 227 290 b 20 56 129 206 66 133 b -1 18 12 44 0 22 b -19 4 -4 9 -12 4 l -21 4 l -21 140 l -21 276 l -12 277 b 167 333 61 288 127 309 b 319 598 262 388 319 491 b 311 664 319 620 317 642 l 310 673 l 304 664 b 204 548 279 620 250 587 b 20 333 129 483 66 409 b -1 292 12 320 0 298 b -19 280 -4 285 -12 280 l -21 280 l -21 416 l -21 552 l -12 553 b 167 609 61 564 127 585 b 319 874 264 666 319 770 b 294 992 319 914 311 954 b 288 1011 288 1004 288 1007 b 302 1031 288 1021 294 1028 ', + }, + flag32ndUp: { + x_min: -24.5, + x_max: 315.78125, + ha: 322, + o: 'm -24 -145 l -24 -5 l -20 -5 b 1 -26 -10 -5 -6 -9 b 175 -241 31 -86 96 -166 b 314 -548 259 -323 304 -420 b 315 -589 315 -555 315 -571 b 314 -630 315 -606 315 -623 b 298 -730 311 -664 306 -699 l 295 -742 l 296 -748 b 314 -850 304 -778 311 -813 b 315 -892 315 -857 315 -874 b 314 -932 315 -909 315 -925 b 298 -1032 311 -967 306 -1002 l 295 -1045 l 296 -1050 b 314 -1153 304 -1081 311 -1115 b 315 -1193 315 -1160 315 -1177 b 314 -1235 315 -1211 315 -1228 b 217 -1526 306 -1338 270 -1444 b 201 -1533 213 -1532 208 -1533 b 182 -1522 193 -1533 185 -1529 b 179 -1514 181 -1518 179 -1517 b 189 -1489 179 -1508 182 -1501 b 266 -1217 240 -1403 266 -1308 b 262 -1156 266 -1196 265 -1177 b 110 -907 247 -1043 190 -950 b 0 -889 87 -895 50 -889 l -1 -889 l -24 -889 l -24 -749 l -24 -610 l -20 -610 b 1 -631 -10 -610 -6 -614 b 175 -846 31 -691 96 -771 b 259 -956 213 -884 236 -914 b 265 -966 262 -961 264 -966 b 265 -966 265 -966 265 -966 b 265 -953 265 -964 265 -959 b 266 -920 266 -943 266 -932 b 262 -853 266 -898 265 -873 b 110 -605 247 -741 190 -648 b 0 -587 87 -592 50 -587 l -1 -587 l -24 -587 l -24 -448 l -24 -308 l -20 -308 b 1 -328 -10 -308 -6 -312 b 175 -544 31 -388 96 -469 b 259 -655 213 -581 236 -612 b 265 -663 262 -659 264 -663 b 265 -663 265 -663 265 -663 b 265 -650 265 -663 265 -657 b 266 -617 266 -641 266 -630 b 262 -551 266 -595 265 -570 b 110 -303 247 -438 190 -345 b 0 -284 87 -290 50 -284 l -1 -284 l -24 -284 l -24 -145 ', + }, + flag32ndDown: { + x_min: -21.78125, + x_max: 366.140625, + ha: 374, + o: 'm 276 1378 b 284 1379 279 1379 281 1379 b 306 1360 292 1379 298 1374 b 352 1247 326 1326 343 1286 b 366 1139 362 1213 366 1175 b 347 1009 366 1093 359 1049 l 344 1002 l 347 992 b 352 971 348 986 351 977 b 366 863 362 936 366 899 b 347 732 366 818 359 773 l 344 725 l 347 716 b 352 695 348 710 351 700 b 366 588 362 659 366 623 b 223 262 366 464 314 345 b 189 233 212 252 212 252 b 35 76 126 183 73 129 b -1 16 20 56 2 27 b -19 4 -4 9 -12 4 l -21 4 l -21 137 l -21 270 l -17 270 b 186 344 59 281 134 308 b 319 606 270 399 319 499 b 317 650 319 620 319 635 l 315 659 l 314 655 b 223 537 288 607 258 570 b 189 509 212 528 212 528 b 35 352 126 459 73 405 b -1 292 20 333 2 303 b -19 280 -4 285 -12 280 l -21 280 l -21 413 l -21 546 l -17 546 b 186 620 59 557 134 584 b 319 882 270 675 319 775 b 317 925 319 896 319 911 l 315 935 l 314 931 b 223 813 288 884 258 846 b 189 785 212 805 212 805 b 35 628 126 735 73 681 b -1 569 20 609 2 580 b -19 556 -4 562 -12 556 l -21 556 l -21 689 l -21 823 l -17 823 b 202 907 68 835 152 867 b 319 1157 280 968 319 1061 b 270 1338 319 1218 303 1281 b 262 1358 264 1349 262 1353 b 262 1364 262 1360 262 1363 b 276 1378 265 1371 269 1376 ', + }, + flag64thUp: { + x_min: -24.5, + x_max: 314.421875, + ha: 321, + o: 'm -24 -145 l -24 -5 l -20 -5 b 0 -23 -9 -5 -2 -12 b 27 -87 4 -38 14 -66 b 138 -220 53 -136 88 -177 b 235 -328 179 -255 208 -288 b 314 -592 287 -409 314 -501 b 292 -732 314 -639 307 -687 l 289 -742 l 294 -756 b 314 -896 307 -802 314 -849 b 292 -1035 314 -943 307 -991 l 289 -1045 l 294 -1057 b 314 -1197 307 -1104 314 -1152 b 292 -1338 314 -1246 307 -1292 l 289 -1347 l 294 -1360 b 314 -1500 307 -1407 314 -1454 b 273 -1689 314 -1565 300 -1628 b 250 -1712 265 -1710 261 -1712 b 228 -1691 236 -1712 228 -1704 l 228 -1685 l 234 -1675 b 270 -1507 258 -1621 270 -1564 b 98 -1193 270 -1381 209 -1261 b 40 -1174 76 -1179 58 -1174 b -10 -1189 24 -1174 8 -1178 b -20 -1192 -14 -1192 -16 -1192 l -24 -1192 l -24 -1052 l -24 -913 l -20 -913 b 0 -931 -9 -913 -2 -920 b 27 -995 4 -946 14 -974 b 138 -1128 53 -1043 88 -1085 b 257 -1275 190 -1172 228 -1220 b 262 -1283 259 -1279 262 -1283 l 262 -1283 b 269 -1249 264 -1282 268 -1260 b 270 -1206 270 -1233 270 -1220 b 98 -891 270 -1075 206 -957 b 40 -871 76 -877 58 -871 b -10 -886 24 -871 8 -875 b -20 -889 -14 -889 -16 -889 l -24 -889 l -24 -749 l -24 -610 l -20 -610 b 0 -628 -9 -610 -2 -617 b 27 -692 4 -644 14 -671 b 138 -825 53 -741 88 -782 b 257 -973 190 -870 228 -917 b 262 -981 259 -977 262 -981 l 262 -981 b 269 -946 264 -979 268 -957 b 270 -903 270 -931 270 -917 b 98 -588 270 -774 206 -655 b 40 -569 76 -574 58 -569 b -10 -584 24 -569 8 -574 b -20 -587 -14 -587 -16 -587 l -24 -587 l -24 -448 l -24 -308 l -20 -308 b 0 -326 -9 -308 -2 -315 b 27 -390 4 -341 14 -369 b 138 -523 53 -438 88 -480 b 257 -670 190 -567 228 -614 b 262 -678 259 -674 262 -678 b 262 -678 262 -678 262 -678 b 269 -644 264 -677 268 -656 b 270 -601 270 -628 270 -614 b 98 -285 270 -471 206 -352 b 40 -266 76 -273 58 -266 b -10 -281 24 -266 8 -272 b -20 -284 -14 -284 -16 -284 l -24 -284 l -24 -145 ', + }, + flag64thDown: { + x_min: -21.78125, + x_max: 367.5, + ha: 375, + o: 'm 259 1553 b 265 1553 261 1553 264 1553 b 288 1540 272 1553 277 1550 b 367 1351 340 1493 367 1424 b 336 1221 367 1308 357 1263 l 332 1211 l 333 1208 b 367 1077 356 1170 367 1124 b 336 945 367 1032 357 986 l 332 935 l 333 932 b 367 800 356 893 367 848 b 336 669 367 756 357 710 l 332 659 l 333 656 b 367 523 356 617 367 571 b 345 412 367 485 360 446 b 231 273 322 356 284 310 b -1 19 121 195 27 93 b -17 4 -4 11 -10 5 l -21 4 l -21 134 l -21 265 l -17 265 b 133 291 20 265 96 278 b 318 537 245 328 318 433 b 307 603 318 559 315 582 b 303 614 304 612 304 614 b 298 609 302 614 300 613 b 231 549 281 589 258 567 b -1 295 121 471 27 369 b -17 280 -4 287 -10 281 l -21 280 l -21 410 l -21 541 l -17 541 b 133 567 20 541 96 555 b 318 813 245 605 318 709 b 307 880 318 835 315 859 b 303 891 304 888 304 891 b 298 885 302 891 300 888 b 231 825 281 866 258 843 b -1 571 121 748 27 645 b -17 556 -4 563 -10 557 l -21 556 l -21 687 l -21 817 l -17 817 b 133 843 20 817 96 830 b 318 1089 245 881 318 985 b 307 1156 318 1111 315 1134 b 303 1167 304 1164 304 1167 b 298 1161 302 1167 300 1164 b 231 1102 281 1140 258 1120 b -1 848 121 1024 27 921 b -17 832 -4 839 -10 834 l -21 832 l -21 963 l -21 1093 l -17 1093 b 114 1113 12 1093 78 1103 b 313 1314 215 1142 289 1218 b 318 1364 317 1331 318 1347 b 255 1511 318 1422 295 1478 b 243 1532 247 1519 243 1525 b 259 1553 243 1540 250 1550 ', + }, + flag128thUp: { + x_min: -24.5, + x_max: 313.0625, + ha: 319, + o: 'm -24 -133 l -24 -5 l -20 -5 b -1 -19 -12 -5 -4 -11 b 142 -213 13 -61 74 -144 b 258 -376 196 -269 230 -315 b 313 -605 295 -449 313 -528 b 292 -742 313 -652 306 -699 b 288 -752 289 -748 288 -752 b 288 -752 288 -752 288 -752 b 292 -764 289 -753 291 -757 b 313 -907 306 -811 313 -860 b 292 -1045 313 -954 306 -1002 b 288 -1054 289 -1050 288 -1054 b 288 -1054 288 -1054 288 -1054 b 292 -1067 289 -1054 291 -1060 b 313 -1210 306 -1113 313 -1161 b 292 -1346 313 -1257 306 -1304 b 288 -1357 289 -1353 288 -1357 b 288 -1357 288 -1357 288 -1357 b 292 -1368 289 -1357 291 -1363 b 313 -1512 306 -1415 313 -1464 b 292 -1648 313 -1560 306 -1605 b 288 -1660 289 -1654 288 -1660 b 288 -1660 288 -1660 288 -1660 b 292 -1671 289 -1660 291 -1665 b 313 -1814 306 -1719 313 -1766 b 250 -2040 313 -1897 291 -1977 b 232 -2062 238 -2057 236 -2059 b 221 -2065 230 -2063 225 -2065 b 200 -2045 210 -2065 201 -2057 b 200 -2043 200 -2044 200 -2044 b 208 -2026 200 -2037 202 -2034 b 269 -1826 249 -1966 269 -1897 b 153 -1544 269 -1726 230 -1625 b -9 -1472 115 -1506 58 -1481 b -21 -1471 -14 -1471 -19 -1471 l -24 -1471 l -24 -1343 l -24 -1215 l -20 -1215 b -1 -1229 -12 -1215 -4 -1221 b 142 -1424 13 -1270 74 -1353 b 257 -1582 196 -1478 228 -1524 b 264 -1594 261 -1589 264 -1594 l 264 -1594 b 265 -1582 264 -1594 264 -1589 b 270 -1525 268 -1562 270 -1544 b 153 -1243 270 -1424 228 -1321 b -9 -1170 115 -1203 58 -1178 b -21 -1168 -14 -1170 -19 -1168 l -24 -1168 l -24 -1041 l -24 -913 l -20 -913 b -1 -927 -12 -913 -4 -918 b 142 -1121 13 -967 74 -1050 b 257 -1281 196 -1175 228 -1221 b 264 -1292 261 -1286 264 -1292 l 264 -1292 b 265 -1279 264 -1292 264 -1286 b 270 -1222 268 -1261 270 -1242 b 153 -941 270 -1121 228 -1018 b -9 -867 115 -900 58 -875 b -21 -866 -14 -867 -19 -866 l -24 -866 l -24 -738 l -24 -610 l -20 -610 b -1 -624 -12 -610 -4 -616 b 142 -818 13 -664 74 -749 b 257 -978 196 -873 228 -918 b 264 -989 261 -984 264 -989 l 264 -989 b 265 -977 264 -989 264 -984 b 270 -920 268 -959 270 -939 b 153 -638 270 -818 228 -716 b -9 -564 115 -598 58 -573 b -21 -563 -14 -564 -19 -563 l -24 -563 l -24 -435 l -24 -308 l -20 -308 b -1 -322 -12 -308 -4 -313 b 142 -516 13 -363 74 -446 b 257 -675 196 -571 228 -616 b 264 -687 261 -681 264 -687 l 264 -687 b 265 -674 264 -687 264 -681 b 270 -617 268 -656 270 -637 b 153 -335 270 -516 228 -413 b -9 -262 115 -295 58 -270 b -21 -260 -14 -262 -19 -260 l -24 -260 l -24 -133 ', + }, + flag128thDown: { + x_min: -21.78125, + x_max: 367.5, + ha: 375, + o: 'm 276 1900 b 284 1901 279 1900 281 1901 b 306 1883 291 1901 298 1896 b 367 1686 347 1825 367 1757 b 343 1558 367 1643 359 1600 l 338 1549 l 343 1537 b 367 1411 359 1497 367 1454 b 343 1282 367 1367 359 1324 l 338 1272 l 343 1261 b 367 1135 359 1221 367 1178 b 343 1007 367 1090 359 1047 l 338 996 l 343 985 b 367 859 359 945 367 902 b 343 731 367 814 359 771 l 338 720 l 343 709 b 367 582 359 667 367 626 b 289 362 367 503 340 426 b 239 312 276 345 259 330 b 29 77 152 237 76 152 b -1 18 14 54 2 30 b -19 4 -4 11 -12 4 l -21 4 l -21 133 l -20 260 l -13 262 b 98 299 17 269 62 284 b 111 305 103 302 110 305 b 167 334 123 310 156 327 b 319 595 264 391 319 491 b 313 659 319 616 318 638 b 310 667 311 664 311 667 b 307 663 310 667 308 666 b 240 588 289 637 269 614 b 16 331 141 505 62 413 b -1 294 8 316 1 302 b -19 280 -4 287 -12 280 l -21 280 l -21 408 l -20 537 l -13 538 b 98 576 17 545 62 560 b 111 581 103 578 110 581 b 167 610 123 587 156 603 b 319 871 264 667 319 767 b 313 935 319 892 318 913 b 310 942 311 941 311 942 b 307 939 310 942 308 941 b 240 864 289 913 269 889 b 16 607 141 781 62 689 b -1 570 8 592 1 578 b -19 556 -4 563 -12 556 l -21 556 l -21 684 l -20 813 l -13 814 b 98 852 17 821 62 836 b 111 857 103 855 110 857 b 167 886 123 863 156 880 b 319 1147 264 943 319 1043 b 313 1211 319 1168 318 1189 b 310 1218 311 1217 311 1218 b 307 1215 310 1218 308 1217 b 240 1140 289 1188 269 1165 b 16 884 141 1057 62 966 b -1 846 8 868 1 855 b -19 832 -4 839 -12 832 l -21 832 l -21 960 l -20 1089 l -13 1090 b 98 1128 17 1097 62 1111 b 111 1134 103 1131 110 1134 b 167 1163 123 1139 156 1156 b 319 1424 264 1220 319 1320 b 313 1486 319 1444 318 1465 b 310 1494 311 1493 311 1494 b 307 1492 310 1494 308 1493 b 240 1417 289 1464 269 1442 b 16 1160 141 1333 62 1242 b -1 1121 8 1145 1 1131 b -19 1109 -4 1115 -12 1109 l -21 1109 l -21 1236 l -20 1365 l -13 1367 b 98 1404 17 1374 62 1388 b 111 1410 103 1407 110 1410 b 250 1508 172 1437 215 1467 b 319 1701 296 1564 319 1633 b 270 1859 319 1757 303 1814 b 262 1882 265 1868 262 1875 b 276 1900 262 1890 266 1896 ', + }, + accidentalFlat: { + x_min: -21.78125, + x_max: 251.8125, + ha: 257, + o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 383 20 616 20 616 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 201 l -21 616 l -20 620 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ', + }, + accidentalNatural: { + x_min: 0, + x_max: 239.5625, + ha: 244, + o: 'm 10 460 b 20 462 13 462 14 462 b 39 449 28 462 35 458 l 40 446 l 40 326 b 40 205 40 259 40 205 b 127 227 40 205 80 215 b 220 249 196 244 213 249 b 227 247 224 249 225 248 b 238 237 231 245 235 241 l 239 233 l 239 -106 l 239 -448 l 238 -451 b 219 -463 234 -459 225 -463 b 198 -451 210 -463 202 -459 l 197 -448 l 197 -324 b 197 -201 197 -248 197 -201 b 110 -223 196 -201 157 -210 b 17 -245 42 -240 24 -245 b 10 -242 13 -245 13 -244 b 0 -233 6 -241 2 -237 l 0 -230 l 0 108 l 0 446 l 0 449 b 10 460 2 453 6 458 m 197 22 b 197 70 197 41 197 58 b 196 116 197 113 197 116 l 196 116 b 118 97 196 116 160 106 l 40 77 l 40 -18 b 40 -112 40 -69 40 -112 l 119 -93 l 197 -73 l 197 22 ', + }, + accidentalSharp: { + x_min: 0, + x_max: 323.9375, + ha: 331, + o: 'm 217 535 b 225 537 220 537 221 537 b 245 524 235 537 242 533 l 246 521 l 247 390 l 247 258 l 273 265 b 306 270 288 269 299 270 b 322 259 315 270 319 267 b 323 208 323 256 323 233 b 322 158 323 184 323 159 b 288 140 318 148 315 147 b 247 130 254 131 247 130 b 247 65 247 130 247 104 b 247 20 247 51 247 36 l 247 -88 l 273 -81 b 306 -76 289 -77 299 -76 b 318 -81 311 -76 315 -77 b 323 -123 323 -87 323 -86 l 323 -138 l 323 -154 b 318 -195 323 -191 323 -190 b 269 -210 314 -199 315 -199 b 249 -216 259 -213 250 -216 l 247 -216 l 247 -349 l 246 -483 l 245 -487 b 225 -499 242 -495 234 -499 b 206 -487 219 -499 210 -495 l 205 -483 l 205 -355 l 205 -227 l 204 -227 l 181 -233 l 138 -244 b 117 -249 127 -247 117 -249 b 115 -385 115 -249 115 -256 l 115 -523 l 114 -526 b 95 -538 110 -534 102 -538 b 74 -526 87 -538 78 -534 l 73 -523 l 73 -391 b 72 -260 73 -269 73 -260 b 72 -260 72 -260 72 -260 b 19 -273 61 -263 23 -273 b 0 -260 10 -273 4 -267 b 0 -209 0 -256 0 -256 l 0 -162 l 1 -158 b 61 -134 5 -148 5 -148 l 73 -131 l 73 -22 b 72 86 73 79 73 86 b 72 86 72 86 72 86 b 19 74 61 83 23 74 b 0 86 10 74 4 79 b 0 137 0 90 0 90 l 0 184 l 1 188 b 61 212 5 198 5 198 l 73 215 l 73 348 l 73 481 l 74 485 b 95 498 78 492 87 498 b 103 495 98 498 100 496 b 114 485 107 494 111 489 l 115 481 l 115 353 l 115 226 l 121 226 b 159 235 123 227 141 231 l 198 247 l 205 248 l 205 384 l 205 521 l 206 524 b 217 535 209 528 212 533 m 205 9 b 205 119 205 70 205 119 l 205 119 b 182 113 204 119 194 116 l 138 102 b 117 97 127 99 117 97 b 115 -12 115 97 115 91 l 115 -122 l 121 -120 b 159 -111 123 -119 141 -115 l 198 -101 l 205 -98 l 205 9 ', + }, + accidentalDoubleSharp: { + x_min: 0, + x_max: 367.5, + ha: 375, + o: 'm 0 124 l 0 187 l 61 187 l 122 187 l 122 138 l 122 91 l 153 61 l 183 30 l 213 61 l 243 91 l 243 138 l 243 187 l 306 187 l 367 187 l 367 124 l 367 61 l 321 61 l 274 61 l 243 30 l 213 0 l 243 -31 l 274 -62 l 321 -62 l 367 -62 l 367 -124 l 367 -188 l 306 -188 l 243 -188 l 243 -140 l 243 -93 l 213 -62 l 183 -31 l 153 -62 l 122 -93 l 122 -140 l 122 -188 l 61 -188 l 0 -188 l 0 -124 l 0 -62 l 46 -62 l 92 -62 l 123 -31 l 153 0 l 123 30 l 92 61 l 46 61 l 0 61 l 0 124 ', + }, + accidentalDoubleFlat: { + x_min: -21.78125, + x_max: 483.1875, + ha: 493, + o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 383 20 616 20 616 l 20 148 l 21 151 b 140 199 59 183 102 199 b 206 179 164 199 187 192 l 210 176 l 210 396 l 210 617 l 212 621 b 231 632 216 628 223 632 b 250 620 239 632 247 628 b 251 383 251 616 251 616 l 251 148 l 254 151 b 370 199 291 183 332 199 b 415 191 385 199 400 197 b 483 84 458 176 483 134 b 461 0 483 58 476 29 b 332 -142 439 -40 411 -72 l 255 -215 b 231 -229 240 -229 239 -229 b 216 -223 224 -229 220 -227 b 210 -158 210 -217 210 -223 b 210 -120 210 -148 210 -136 l 210 -29 l 205 -34 b 100 -142 182 -65 159 -88 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 201 l -21 616 l -20 620 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 m 341 131 b 328 133 337 133 332 133 b 322 133 326 133 323 133 b 257 87 296 129 273 113 l 251 80 l 251 -37 l 251 -156 l 255 -152 b 375 81 328 -72 375 20 l 375 83 b 341 131 375 113 367 126 ', + }, + accidentalParensLeft: { + x_min: -166.0625, + x_max: -25.859375, + ha: 0, + o: 'm -49 369 b -42 370 -46 369 -44 370 b -27 360 -36 370 -29 366 b -25 355 -27 359 -25 358 b -32 335 -25 351 -28 347 b -92 52 -66 248 -87 159 b -93 -1 -93 43 -93 20 b -92 -54 -93 -23 -93 -45 b -32 -337 -85 -162 -66 -251 b -25 -355 -27 -349 -25 -352 b -42 -371 -25 -365 -32 -371 b -61 -353 -50 -371 -51 -369 b -163 -63 -119 -262 -153 -165 b -166 -1 -166 -37 -166 -31 b -163 62 -166 30 -166 36 b -61 352 -153 163 -119 260 b -49 369 -54 365 -51 366 ', + }, + accidentalParensRight: { + x_min: 25.859375, + x_max: 164.6875, + ha: 168, + o: 'm 34 369 b 40 370 35 370 38 370 b 59 353 49 370 50 367 b 164 40 122 254 155 158 b 164 0 164 33 164 16 b 164 -40 164 -16 164 -34 b 59 -353 155 -158 122 -254 b 40 -371 53 -366 47 -371 b 34 -370 38 -371 36 -370 b 25 -358 28 -367 25 -363 b 31 -337 25 -352 27 -347 b 92 0 72 -234 92 -117 b 31 335 92 116 72 233 b 25 356 27 345 25 352 b 34 369 25 363 28 366 ', + }, + accidentalQuarterToneFlatStein: { + x_min: 0, + x_max: 272.21875, + ha: 278, + o: 'm 243 631 b 250 632 246 632 249 632 b 270 620 259 632 268 628 l 272 616 l 272 201 l 272 -212 l 270 -216 b 251 -229 268 -224 259 -229 b 227 -215 243 -229 240 -229 l 151 -142 b 32 -16 81 -80 53 -49 b 0 84 9 18 0 52 b 111 199 0 149 42 199 b 137 197 119 199 127 198 b 228 151 168 191 197 177 l 231 148 l 231 383 b 232 620 231 616 231 616 b 243 631 234 624 238 630 m 168 131 b 152 133 163 133 157 133 b 107 102 130 133 111 120 b 106 86 107 97 106 91 b 111 41 106 73 108 56 b 227 -152 125 -13 171 -90 l 231 -156 l 231 -37 l 231 80 l 225 87 b 168 131 210 111 190 126 ', + }, + accidentalThreeQuarterTonesFlatZimmermann: { + x_min: 0, + x_max: 607.0625, + ha: 619, + o: 'm 243 631 b 250 632 246 632 249 632 b 270 620 259 632 268 628 l 272 616 l 272 201 l 272 -212 l 270 -216 b 251 -229 268 -224 259 -229 b 227 -215 243 -229 240 -229 l 151 -142 b 32 -16 81 -80 53 -49 b 0 84 9 18 0 52 b 111 199 0 149 42 199 b 137 197 119 199 127 198 b 228 151 168 191 197 177 l 231 148 l 231 383 b 232 620 231 616 231 616 b 243 631 234 624 238 630 m 168 131 b 152 133 163 133 157 133 b 107 102 130 133 111 120 b 106 86 107 97 106 91 b 111 41 106 73 108 56 b 227 -152 125 -13 171 -90 l 231 -156 l 231 -37 l 231 80 l 225 87 b 168 131 210 111 190 126 m 347 631 b 353 632 348 632 351 632 b 374 620 363 632 371 628 b 375 383 375 616 375 616 l 375 148 l 377 151 b 492 199 415 183 454 199 b 537 191 507 199 522 197 b 607 84 582 176 607 134 b 583 0 607 58 598 29 b 455 -142 562 -40 533 -72 l 378 -215 b 355 -229 364 -229 362 -229 b 334 -216 345 -229 337 -224 l 333 -212 l 333 201 l 333 616 l 334 620 b 347 631 337 624 341 630 m 465 131 b 451 133 461 133 455 133 b 445 133 449 133 446 133 b 379 87 419 129 396 113 l 375 80 l 375 -37 l 375 -156 l 378 -152 b 499 81 451 -72 499 20 l 499 83 b 465 131 499 113 490 126 ', + }, + accidentalQuarterToneSharpStein: { + x_min: 0, + x_max: 193.28125, + ha: 197, + o: 'm 85 514 b 95 517 88 517 89 517 b 114 505 103 517 110 513 l 115 502 l 115 376 b 115 249 115 306 115 249 b 141 258 117 249 127 252 l 167 266 l 172 266 b 190 254 181 265 187 262 l 193 251 l 193 202 l 193 188 b 187 147 193 149 191 152 b 147 130 183 142 182 141 l 115 119 l 115 9 b 115 -99 115 -51 115 -99 b 141 -91 115 -99 127 -95 b 171 -81 166 -81 167 -81 l 171 -81 b 191 -94 181 -81 189 -87 b 193 -142 191 -97 193 -120 b 191 -195 193 -167 191 -194 b 125 -227 187 -205 187 -204 l 115 -230 l 115 -366 l 115 -503 l 114 -506 b 95 -519 110 -514 102 -519 b 74 -506 87 -519 78 -514 l 73 -503 l 73 -374 b 73 -245 73 -260 73 -245 b 73 -245 73 -245 73 -245 b 55 -252 72 -245 63 -249 l 32 -260 b 19 -263 27 -262 23 -263 b 4 -256 13 -263 8 -260 b 0 -215 0 -251 0 -254 b 0 -199 0 -210 0 -206 l 0 -152 l 1 -149 b 8 -140 2 -145 5 -141 b 42 -127 9 -140 24 -133 l 73 -116 l 73 -5 b 73 23 73 4 73 15 b 73 105 73 70 73 105 b 49 97 73 105 61 101 b 17 88 32 91 23 88 b 4 95 10 88 8 91 b 0 137 0 101 0 98 b 0 151 0 141 0 145 l 0 199 l 1 202 b 43 224 5 212 5 212 l 73 234 l 73 367 l 73 502 l 74 505 b 85 514 77 509 81 513 ', + }, + accidentalThreeQuarterTonesSharpStein: { + x_min: -1.359375, + x_max: 455.96875, + ha: 465, + o: 'm 352 541 b 357 542 353 542 355 542 b 377 530 364 542 372 537 l 378 526 l 378 394 l 379 262 l 404 266 b 436 270 420 269 430 270 b 450 265 443 270 446 269 b 455 220 455 259 455 260 l 455 208 l 455 161 l 454 156 b 411 140 449 147 447 147 b 378 133 393 137 379 134 b 378 68 378 133 378 106 b 378 22 378 54 378 38 l 379 -87 l 404 -83 b 436 -79 420 -80 430 -79 b 450 -84 443 -79 446 -80 b 455 -129 455 -90 455 -88 l 455 -141 l 455 -188 l 454 -192 b 413 -209 449 -202 447 -202 b 382 -215 398 -212 383 -215 l 378 -215 l 378 -345 l 378 -380 b 375 -485 378 -484 378 -480 b 357 -494 371 -491 364 -494 b 340 -485 351 -494 344 -491 b 336 -383 337 -480 336 -484 l 336 -349 l 336 -223 l 334 -223 b 291 -231 334 -223 314 -227 l 247 -240 l 247 -371 l 246 -503 l 245 -506 b 225 -519 242 -514 234 -519 b 206 -506 219 -519 210 -514 l 205 -503 l 205 -376 l 205 -248 l 160 -256 l 115 -265 l 115 -396 l 115 -527 l 114 -531 b 95 -544 110 -539 102 -544 b 76 -531 87 -544 78 -539 l 73 -527 l 73 -399 b 73 -273 73 -330 73 -273 b 49 -277 73 -273 61 -274 b 17 -281 32 -280 24 -281 b 4 -276 10 -281 8 -280 b -1 -234 0 -269 -1 -272 b 0 -219 -1 -229 0 -224 l 0 -170 l 1 -167 b 10 -158 2 -163 6 -159 b 49 -149 13 -156 16 -155 l 73 -145 l 73 -34 b 73 76 73 26 73 76 b 49 72 73 76 61 74 b 17 68 32 69 24 68 b 4 73 10 68 8 69 b -1 115 0 80 -1 77 b 0 130 -1 120 0 124 l 0 179 l 1 181 b 10 191 2 186 6 190 b 49 199 13 192 16 194 l 73 204 l 73 338 b 73 374 73 352 73 365 b 77 483 73 484 73 477 b 95 492 81 489 88 492 b 111 483 100 492 107 489 b 115 378 115 477 115 483 l 115 342 b 117 212 115 223 115 212 b 204 229 117 212 200 227 l 205 229 l 205 365 l 205 502 l 206 505 b 225 517 210 513 219 517 b 245 505 234 517 242 513 l 246 502 l 247 369 l 247 237 l 249 237 b 336 254 253 238 336 254 b 337 390 336 254 337 302 l 337 526 l 338 530 b 352 541 341 535 347 539 m 336 15 b 336 126 336 102 336 126 l 336 126 b 291 117 336 126 315 122 l 247 109 l 247 -1 l 247 -112 l 249 -112 b 336 -95 253 -111 336 -95 b 336 15 336 -95 336 -56 m 205 -120 b 205 -55 205 -120 205 -93 b 205 -9 205 -41 205 -24 l 205 101 l 160 93 l 115 84 l 115 -26 b 115 -83 115 -49 115 -69 b 117 -137 115 -133 115 -137 b 205 -120 118 -137 204 -120 ', + }, + accidentalBuyukMucennebFlat: { + x_min: -171.5, + x_max: 251.8125, + ha: 257, + o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 553 20 616 20 614 b 20 491 20 503 20 491 l 20 491 b 153 535 47 501 149 535 b 174 514 167 535 174 524 b 164 496 174 508 171 501 b 92 470 164 495 132 484 l 20 445 l 20 390 b 20 363 20 378 20 370 b 20 333 20 340 20 333 l 20 333 b 153 377 47 344 149 377 b 174 356 167 377 174 367 b 164 338 174 349 171 342 b 92 312 164 338 132 326 l 20 288 l 20 219 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 30 -21 -212 -21 -212 b -21 273 -21 163 -21 273 b -84 252 -21 273 -50 263 b -152 230 -133 234 -145 230 b -157 231 -155 230 -156 231 b -171 252 -166 234 -171 244 b -160 270 -171 259 -167 266 b -27 316 -159 270 -93 294 l -21 319 l -21 374 b -21 431 -21 406 -21 431 b -84 409 -21 431 -50 421 b -152 388 -133 392 -145 388 b -157 390 -155 388 -156 388 b -171 409 -166 392 -171 401 b -160 428 -171 417 -167 424 b -27 474 -159 428 -93 451 l -21 476 l -21 546 b -20 620 -21 614 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ', + }, + accidentalBakiyeFlat: { + x_min: -176.9375, + x_max: 251.8125, + ha: 257, + o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 503 20 616 20 614 b 20 391 20 442 20 391 b 84 424 20 391 49 406 l 147 456 l 152 456 b 153 456 153 456 153 456 b 175 435 166 456 175 446 b 172 427 175 433 174 430 b 92 380 170 420 172 421 l 20 342 l 20 245 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 54 -21 -212 -21 -212 b -21 322 -21 201 -21 322 b -85 290 -21 322 -50 308 l -148 256 l -153 256 b -155 256 -155 256 -155 256 b -176 277 -167 256 -176 266 b -174 285 -176 280 -175 283 b -93 333 -171 294 -174 292 l -21 370 l -21 494 b -20 620 -21 616 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ', + }, + accidentalKomaSharp: { + x_min: -1.359375, + x_max: 455.96875, + ha: 465, + o: 'm 352 541 b 357 542 353 542 355 542 b 377 530 364 542 372 537 l 378 526 l 378 394 l 379 262 l 404 266 b 436 270 420 269 430 270 b 450 265 443 270 446 269 b 455 220 455 259 455 260 l 455 208 l 455 161 l 454 156 b 411 140 449 147 447 147 b 378 133 393 137 379 134 b 378 68 378 133 378 106 b 378 22 378 54 378 38 l 379 -87 l 404 -83 b 436 -79 420 -80 430 -79 b 450 -84 443 -79 446 -80 b 455 -129 455 -90 455 -88 l 455 -141 l 455 -188 l 454 -192 b 413 -209 449 -202 447 -202 b 382 -215 398 -212 383 -215 l 378 -215 l 378 -345 l 378 -380 b 375 -485 378 -484 378 -480 b 357 -494 371 -491 364 -494 b 340 -485 351 -494 344 -491 b 336 -383 337 -480 336 -484 l 336 -349 l 336 -223 l 334 -223 b 291 -231 334 -223 314 -227 l 247 -240 l 247 -371 l 246 -503 l 245 -506 b 225 -519 242 -514 234 -519 b 206 -506 219 -519 210 -514 l 205 -503 l 205 -376 l 205 -248 l 160 -256 l 115 -265 l 115 -396 l 115 -527 l 114 -531 b 95 -544 110 -539 102 -544 b 76 -531 87 -544 78 -539 l 73 -527 l 73 -399 b 73 -273 73 -330 73 -273 b 49 -277 73 -273 61 -274 b 17 -281 32 -280 24 -281 b 4 -276 10 -281 8 -280 b -1 -234 0 -269 -1 -272 b 0 -219 -1 -229 0 -224 l 0 -170 l 1 -167 b 10 -158 2 -163 6 -159 b 49 -149 13 -156 16 -155 l 73 -145 l 73 -34 b 73 76 73 26 73 76 b 49 72 73 76 61 74 b 17 68 32 69 24 68 b 4 73 10 68 8 69 b -1 115 0 80 -1 77 b 0 130 -1 120 0 124 l 0 179 l 1 181 b 10 191 2 186 6 190 b 49 199 13 192 16 194 l 73 204 l 73 338 b 73 374 73 352 73 365 b 77 483 73 484 73 477 b 95 492 81 489 88 492 b 111 483 100 492 107 489 b 115 378 115 477 115 483 l 115 342 b 117 212 115 223 115 212 b 204 229 117 212 200 227 l 205 229 l 205 365 l 205 502 l 206 505 b 225 517 210 513 219 517 b 245 505 234 517 242 513 l 246 502 l 247 369 l 247 237 l 249 237 b 336 254 253 238 336 254 b 337 390 336 254 337 302 l 337 526 l 338 530 b 352 541 341 535 347 539 m 336 15 b 336 126 336 102 336 126 l 336 126 b 291 117 336 126 315 122 l 247 109 l 247 -1 l 247 -112 l 249 -112 b 336 -95 253 -111 336 -95 b 336 15 336 -95 336 -56 m 205 -120 b 205 -55 205 -120 205 -93 b 205 -9 205 -41 205 -24 l 205 101 l 160 93 l 115 84 l 115 -26 b 115 -83 115 -49 115 -69 b 117 -137 115 -133 115 -137 b 205 -120 118 -137 204 -120 ', + }, + accidentalKucukMucennebSharp: { + x_min: -1.359375, + x_max: 255.890625, + ha: 261, + o: 'm 118 514 b 127 517 121 517 122 517 b 147 505 136 517 142 513 l 148 502 l 148 403 b 148 306 148 351 148 306 b 174 315 149 306 160 310 l 200 324 l 205 323 b 223 312 213 323 220 319 l 225 308 l 225 260 b 225 245 225 255 225 249 b 220 204 225 208 224 209 b 179 188 216 199 215 199 l 148 177 l 148 124 l 148 70 l 189 84 b 236 98 219 94 230 98 b 247 94 240 98 243 97 b 255 52 254 88 255 87 b 255 33 255 47 255 40 l 254 -12 l 253 -15 b 249 -22 253 -18 250 -20 l 245 -24 l 196 -41 l 148 -58 l 148 -108 b 148 -158 148 -136 148 -158 b 174 -148 148 -158 160 -154 b 204 -140 198 -140 200 -140 l 204 -140 b 224 -152 213 -140 221 -145 b 225 -201 224 -155 225 -177 b 224 -254 225 -226 224 -251 b 157 -284 220 -262 220 -262 l 148 -288 l 148 -395 l 148 -503 l 147 -506 b 127 -519 142 -514 134 -519 b 107 -506 119 -519 111 -514 l 106 -503 l 106 -403 b 106 -303 106 -316 106 -303 b 104 -303 104 -303 104 -303 b 88 -310 104 -303 96 -306 l 63 -319 b 51 -322 59 -320 55 -322 b 36 -315 46 -322 40 -319 b 31 -273 32 -309 31 -312 b 31 -258 31 -269 31 -263 l 31 -210 l 34 -206 b 40 -198 35 -204 38 -199 b 74 -186 42 -197 57 -191 l 106 -173 l 106 -123 b 106 -97 106 -112 106 -104 b 106 -72 106 -76 106 -72 b 104 -72 106 -72 106 -72 b 20 -99 89 -79 23 -99 b 0 -84 10 -99 2 -93 b -1 -37 0 -81 -1 -59 b 0 11 -1 -15 0 9 b 58 40 4 22 2 22 l 106 56 l 106 109 b 106 123 106 115 106 119 b 106 162 106 147 106 162 b 81 155 106 162 93 159 b 50 147 65 149 55 147 b 36 152 43 147 40 148 b 31 194 32 158 31 156 b 31 209 31 198 31 204 l 31 256 l 34 260 b 76 281 38 269 38 269 l 106 292 l 106 396 l 106 502 l 107 505 b 118 514 110 509 114 513 ', + }, + articAccentAbove: { + x_min: -348.4375, + x_max: 24.5, + ha: 25, + o: 'm -330 155 b -322 156 -329 156 -326 156 b -315 156 -319 156 -317 156 b -298 147 -311 155 -308 154 b -19 30 -224 98 -122 55 l 2 26 b 24 -1 17 22 24 13 b 2 -27 24 -15 17 -23 l -19 -31 b -298 -148 -122 -56 -224 -99 b -322 -158 -313 -158 -315 -158 b -348 -131 -338 -158 -348 -145 b -344 -117 -348 -127 -347 -122 b -328 -104 -341 -112 -338 -111 b -127 -8 -269 -65 -202 -33 b -106 0 -115 -4 -106 -1 b -127 6 -106 0 -115 2 b -328 102 -202 31 -269 63 b -344 116 -338 109 -341 111 b -348 130 -347 120 -348 124 b -330 155 -348 141 -341 152 ', + }, + articAccentBelow: { + x_min: -348.4375, + x_max: 24.5, + ha: 25, + o: 'm -330 155 b -322 156 -329 156 -326 156 b -315 156 -319 156 -317 156 b -298 147 -311 155 -308 154 b -19 30 -224 98 -122 55 l 2 26 b 24 -1 17 22 24 13 b 2 -27 24 -15 17 -23 l -19 -31 b -298 -148 -122 -56 -224 -99 b -322 -158 -313 -158 -315 -158 b -348 -131 -338 -158 -348 -145 b -344 -117 -348 -127 -347 -122 b -328 -104 -341 -112 -338 -111 b -127 -8 -269 -65 -202 -33 b -106 0 -115 -4 -106 -1 b -127 6 -106 0 -115 2 b -328 102 -202 31 -269 63 b -344 116 -338 109 -341 111 b -348 130 -347 120 -348 124 b -330 155 -348 141 -341 152 ', + }, + articTenutoAbove: { + x_min: 0, + x_max: 318.5, + ha: 325, + o: 'm 20 376 b 167 377 23 377 96 377 b 296 376 231 377 294 377 b 318 347 311 371 318 359 b 296 316 318 333 311 320 b 159 315 294 315 227 315 b 21 316 91 315 24 315 b 0 345 6 320 0 333 b 20 376 0 359 6 371 ', + }, + articTenutoBelow: { + x_min: 0, + x_max: 318.5, + ha: 325, + o: 'm 20 376 b 167 377 23 377 96 377 b 296 376 231 377 294 377 b 318 347 311 371 318 359 b 296 316 318 333 311 320 b 159 315 294 315 227 315 b 21 316 91 315 24 315 b 0 345 6 320 0 333 b 20 376 0 359 6 371 ', + }, + articStaccatoAbove: { + x_min: 0, + x_max: 133.390625, + ha: 136, + o: 'm 54 66 b 65 68 58 68 61 68 b 122 37 88 68 110 56 b 133 -1 130 26 133 12 b 104 -58 133 -23 123 -44 b 66 -69 92 -65 78 -69 b 10 -38 44 -69 23 -58 b 0 -1 2 -27 0 -13 b 54 66 0 30 20 61 ', + }, + articStaccatoBelow: { + x_min: 0, + x_max: 133.390625, + ha: 136, + o: 'm 54 66 b 65 68 58 68 61 68 b 122 37 88 68 110 56 b 133 -1 130 26 133 12 b 104 -58 133 -23 123 -44 b 66 -69 92 -65 78 -69 b 10 -38 44 -69 23 -58 b 0 -1 2 -27 0 -13 b 54 66 0 30 20 61 ', + }, + articStaccatissimoAbove: { + x_min: -73.5, + x_max: 72.140625, + ha: 74, + o: 'm -72 252 l -73 254 l 0 254 l 72 254 l 70 252 b 0 -1 70 248 0 -1 b -72 252 -1 -1 -72 248 ', + }, + articStaccatissimoBelow: { + x_min: -73.5, + x_max: 72.140625, + ha: 74, + o: 'm -72 252 l -73 254 l 0 254 l 72 254 l 70 252 b 0 -1 70 248 0 -1 b -72 252 -1 -1 -72 248 ', + }, + articMarcatoAbove: { + x_min: -149.71875, + x_max: 148.359375, + ha: 151, + o: 'm -8 -1 b -1 0 -5 -1 -4 0 b 16 -11 5 0 13 -4 b 83 -186 17 -12 47 -90 l 148 -358 l 148 -363 b 127 -385 148 -376 138 -385 b 112 -378 122 -385 118 -383 b 54 -226 110 -374 114 -385 b 0 -81 24 -147 0 -81 b -55 -226 -1 -81 -25 -147 b -114 -378 -115 -385 -111 -374 b -129 -385 -119 -383 -123 -385 b -149 -363 -140 -385 -149 -376 l -149 -358 l -84 -186 b -19 -11 -49 -90 -19 -12 b -8 -1 -17 -8 -12 -4 ', + }, + articMarcatoBelow: { + x_min: -149.71875, + x_max: 148.359375, + ha: 151, + o: 'm -8 -1 b -1 0 -5 -1 -4 0 b 16 -11 5 0 13 -4 b 83 -186 17 -12 47 -90 l 148 -358 l 148 -363 b 127 -385 148 -376 138 -385 b 112 -378 122 -385 118 -383 b 54 -226 110 -374 114 -385 b 0 -81 24 -147 0 -81 b -55 -226 -1 -81 -25 -147 b -114 -378 -115 -385 -111 -374 b -129 -385 -119 -383 -123 -385 b -149 -363 -140 -385 -149 -376 l -149 -358 l -84 -186 b -19 -11 -49 -90 -19 -12 b -8 -1 -17 -8 -12 -4 ', + }, + fermataAbove: { + x_min: -442.359375, + x_max: 441, + ha: 450, + o: 'm -31 487 b -1 488 -21 488 -10 488 b 434 104 216 488 397 330 b 441 27 438 79 441 47 b 439 12 441 20 439 15 b 419 0 435 4 427 0 b 404 5 413 0 408 1 b 398 30 400 11 398 13 b 0 351 390 213 213 351 b -59 348 -20 351 -39 349 b -400 30 -251 324 -393 191 b -405 5 -400 13 -401 11 b -420 0 -409 1 -415 0 b -441 12 -428 0 -436 4 b -442 27 -441 15 -442 20 b -435 104 -442 47 -439 79 b -31 487 -401 316 -235 474 m -13 131 b -1 133 -9 133 -5 133 b 51 105 19 133 39 123 b 61 70 58 95 61 83 b 51 34 61 58 58 45 b -1 6 39 16 19 6 b -46 27 -17 6 -34 13 b -62 69 -57 38 -62 54 b -13 131 -62 98 -44 124 ', + }, + fermataBelow: { + x_min: -441, + x_max: 439.640625, + ha: 449, + o: 'm -428 -2 b -421 0 -427 -1 -424 0 b -406 -6 -416 0 -409 -2 b -400 -31 -401 -12 -400 -15 b -1 -352 -392 -215 -215 -352 b 58 -349 19 -352 38 -351 b 398 -31 250 -326 392 -192 b 404 -6 398 -15 400 -12 b 419 -1 408 -2 413 -1 b 439 -13 427 -1 435 -5 b 439 -29 439 -16 439 -22 b 434 -105 439 -48 438 -80 b 0 -489 397 -333 213 -489 b -68 -484 -23 -489 -44 -488 b -441 -36 -280 -452 -436 -263 b -441 -30 -441 -34 -441 -31 b -428 -2 -441 -11 -439 -5 m -13 -9 b -1 -8 -9 -8 -5 -8 b 50 -36 19 -8 39 -19 b 61 -72 57 -47 61 -59 b 50 -106 61 -84 57 -97 b -1 -134 39 -124 19 -134 b -46 -115 -17 -134 -34 -129 b -62 -72 -57 -102 -62 -87 b -13 -9 -62 -44 -44 -16 ', + }, + breathMarkComma: { + x_min: -1.359375, + x_max: 193.28125, + ha: 197, + o: 'm 78 233 b 87 233 81 233 84 233 b 187 140 132 233 174 195 b 193 102 190 127 193 115 b 43 -113 193 22 136 -62 b 27 -119 36 -116 31 -119 b 19 -108 21 -119 19 -115 b 29 -97 19 -102 20 -101 b 102 13 73 -72 102 -27 b 92 51 102 26 98 40 l 91 54 l 84 54 b 8 104 53 54 21 74 b -1 142 1 116 -1 130 b 78 233 -1 187 31 227 ', + }, + breathMarkUpbow: { + x_min: -170.140625, + x_max: 168.78125, + ha: 172, + o: 'm -160 567 b -122 567 -159 567 -149 567 l -87 567 l -84 566 b -74 553 -78 563 -77 560 b -20 366 -73 551 -49 466 b 31 186 8 267 31 186 b 85 371 31 186 55 269 b 140 559 114 473 138 557 b 153 567 141 564 148 567 b 168 559 159 567 166 564 b 168 555 168 557 168 557 b 92 281 168 548 159 513 b 14 13 50 134 14 13 b 0 0 14 6 6 0 b -17 15 -8 0 -17 8 b -93 283 -17 15 -51 136 b -170 552 -166 533 -170 548 b -170 553 -170 552 -170 552 b -160 567 -170 560 -167 564 ', + }, + caesura: { + x_min: 0, + x_max: 622.03125, + ha: 635, + o: 'm 398 417 b 406 419 401 419 404 419 b 427 398 417 419 427 409 b 427 391 427 395 427 392 b 34 -274 424 385 38 -272 b 20 -280 29 -278 25 -280 b 0 -259 9 -280 0 -270 b 0 -252 0 -256 0 -254 b 393 413 2 -247 389 410 b 398 417 394 415 397 416 m 592 417 b 600 419 594 419 597 419 b 622 398 611 419 622 409 b 620 391 622 395 620 392 b 227 -274 617 385 231 -272 b 213 -280 223 -278 219 -280 b 193 -259 202 -280 193 -270 b 194 -252 193 -256 193 -254 b 586 413 196 -247 582 410 b 592 417 588 415 590 416 ', + }, + caesuraCurved: { + x_min: 0, + x_max: 503.609375, + ha: 514, + o: 'm 274 430 b 277 430 276 430 277 430 b 310 394 296 430 310 415 b 308 383 310 391 308 387 b 306 367 307 381 307 374 b 236 120 298 305 272 210 b 40 -273 189 -5 125 -134 b 20 -287 35 -283 27 -287 b 5 -281 14 -287 9 -285 b 0 -267 1 -277 0 -273 b 9 -242 0 -262 2 -255 b 246 395 137 -12 232 242 b 274 430 249 416 257 427 m 468 430 b 472 430 469 430 470 430 b 503 394 490 430 503 415 b 502 383 503 391 503 387 b 499 367 502 381 500 374 b 431 120 491 305 465 210 b 234 -273 382 -5 318 -134 b 213 -287 228 -283 220 -287 b 198 -281 208 -287 202 -285 b 193 -267 194 -277 193 -273 b 202 -242 193 -262 196 -255 b 439 395 330 -12 426 242 b 468 430 442 416 451 427 ', + }, + restMaxima: { + x_min: 0, + x_max: 464.140625, + ha: 474, + o: 'm 0 0 l 0 347 l 76 347 l 153 347 l 153 0 l 153 -348 l 76 -348 l 0 -348 l 0 0 m 308 -1 l 308 347 l 386 347 l 464 347 l 464 -1 l 464 -348 l 386 -348 l 308 -348 l 308 -1 ', + }, + restDoubleWhole: { + x_min: 0, + x_max: 386.5625, + ha: 394, + o: 'm 0 173 l 0 347 l 193 347 l 386 347 l 386 173 l 386 0 l 193 0 l 0 0 l 0 173 ', + }, + restWhole: { + x_min: 0, + x_max: 447.8125, + ha: 457, + o: 'm 0 -87 l 0 0 l 223 0 l 447 0 l 447 -87 l 447 -174 l 223 -174 l 0 -174 l 0 -87 ', + }, + restHalf: { + x_min: 0, + x_max: 447.8125, + ha: 457, + o: 'm 0 86 l 0 173 l 223 173 l 447 173 l 447 86 l 447 0 l 223 0 l 0 0 l 0 86 ', + }, + restQuarter: { + x_min: 0, + x_max: 300.8125, + ha: 307, + o: 'm 49 505 b 53 506 50 505 51 506 b 70 496 58 506 62 503 b 81 485 73 492 78 488 l 96 473 l 111 459 l 122 449 l 134 438 l 182 396 l 255 330 b 292 291 292 298 292 298 l 292 290 l 292 284 l 283 270 b 209 36 234 197 209 113 b 288 -170 209 -44 235 -119 b 299 -184 295 -179 299 -181 b 300 -191 300 -187 300 -188 b 285 -206 300 -199 294 -206 b 280 -206 283 -206 281 -206 b 247 -201 270 -202 259 -201 b 176 -222 223 -201 197 -208 b 114 -340 136 -249 114 -292 b 172 -471 114 -384 134 -433 b 185 -492 182 -481 185 -487 b 181 -502 185 -496 183 -499 b 171 -508 176 -505 174 -508 b 152 -498 166 -508 160 -503 b 0 -284 65 -428 12 -352 b 0 -260 0 -278 0 -270 b 1 -238 0 -252 0 -242 b 148 -140 16 -177 73 -140 b 209 -148 167 -140 189 -142 b 215 -149 212 -148 215 -149 b 215 -149 215 -149 215 -149 l 215 -149 b 201 -136 215 -148 209 -142 l 157 -97 l 96 -41 b 17 34 21 24 17 29 b 17 37 17 36 17 36 b 17 38 17 37 17 38 b 25 56 17 44 17 44 b 110 298 81 131 110 219 b 46 474 110 367 88 431 b 38 491 40 480 38 487 b 49 505 38 498 42 502 ', + }, + rest8th: { + x_min: 0, + x_max: 349.8125, + ha: 357, + o: 'm 88 302 b 103 303 93 302 98 303 b 202 224 149 303 191 270 b 205 199 204 216 205 208 b 178 129 205 173 196 147 l 175 126 l 182 127 b 307 249 236 142 284 190 b 313 259 308 254 311 258 b 329 267 317 265 323 267 b 349 247 340 267 349 259 b 201 -263 349 242 204 -258 b 182 -273 197 -270 190 -273 b 163 -260 174 -273 166 -269 b 161 -256 161 -259 161 -258 b 217 -59 161 -248 170 -220 b 272 129 247 43 272 127 b 272 129 272 129 272 129 b 264 122 272 129 268 126 b 140 80 227 94 183 80 b 36 115 102 80 65 91 b 0 194 10 136 0 165 b 88 302 0 244 32 292 ', + }, + rest16th: { + x_min: 0, + x_max: 450.53125, + ha: 460, + o: 'm 189 302 b 204 303 193 302 198 303 b 303 224 250 303 292 270 b 306 199 304 216 306 208 b 279 129 306 173 296 147 l 276 126 l 281 127 b 408 249 337 142 385 190 b 412 259 409 254 412 258 b 430 267 417 265 423 267 b 450 247 441 267 450 259 b 200 -605 450 242 204 -599 b 182 -616 197 -612 190 -616 b 163 -602 174 -616 166 -610 b 161 -598 161 -601 161 -601 b 217 -402 161 -589 170 -562 b 272 -213 247 -298 272 -213 b 272 -213 272 -213 272 -213 b 264 -219 272 -213 268 -216 b 140 -262 227 -247 182 -262 b 36 -226 102 -262 65 -249 b 0 -145 12 -206 0 -176 b 17 -84 0 -124 5 -104 b 103 -38 38 -54 70 -38 b 191 -91 137 -38 172 -56 b 205 -141 201 -106 205 -124 b 178 -212 205 -167 196 -194 l 175 -215 l 182 -213 b 307 -93 236 -198 284 -151 b 372 129 308 -88 372 127 b 372 129 372 129 372 129 b 364 122 372 129 368 126 b 240 80 328 94 283 80 b 137 115 202 80 166 91 b 99 194 111 136 99 165 b 189 302 99 244 133 292 ', + }, + rest32nd: { + x_min: 0, + x_max: 551.25, + ha: 563, + o: 'm 289 644 b 304 645 294 645 299 645 b 404 566 349 645 392 613 b 406 541 405 557 406 549 b 379 471 406 514 397 489 l 377 467 l 382 470 b 509 591 438 485 485 531 b 513 601 510 595 513 599 b 530 609 518 607 524 609 b 551 588 540 609 551 602 b 200 -605 551 584 204 -599 b 182 -616 197 -612 190 -616 b 163 -602 174 -616 166 -610 b 161 -598 161 -601 161 -601 b 217 -402 161 -589 170 -562 b 272 -213 247 -298 272 -213 b 272 -213 272 -213 272 -213 b 264 -219 272 -213 268 -216 b 140 -262 227 -247 182 -262 b 36 -226 102 -262 65 -249 b 0 -145 12 -206 0 -176 b 17 -84 0 -124 5 -104 b 103 -38 38 -54 70 -38 b 191 -91 137 -38 172 -56 b 205 -141 201 -106 205 -124 b 178 -212 205 -167 196 -194 l 175 -215 l 182 -213 b 307 -93 236 -198 284 -151 b 372 129 308 -88 372 127 b 372 129 372 129 372 129 b 364 122 372 129 368 126 b 240 80 328 94 283 80 b 137 115 202 80 166 91 b 99 195 112 136 99 165 b 118 256 99 217 106 238 b 204 303 138 287 171 303 b 292 249 238 303 273 285 b 306 199 302 234 306 217 b 279 129 306 173 296 148 l 276 126 l 281 127 b 408 248 336 142 385 190 b 473 470 409 254 473 469 b 473 470 473 470 473 470 b 465 464 473 470 469 467 b 341 421 428 435 383 421 b 236 458 303 421 266 433 b 200 537 212 478 200 508 b 289 644 200 585 234 635 ', + }, + rest64th: { + x_min: -1.359375, + x_max: 651.96875, + ha: 665, + o: 'm 389 644 b 405 645 394 645 400 645 b 504 566 450 645 492 613 b 507 541 506 557 507 549 b 480 471 507 514 498 489 l 477 467 l 483 470 b 609 591 539 485 586 531 b 613 601 611 595 613 599 b 631 609 619 607 624 609 b 651 588 641 609 651 602 b 200 -946 651 584 204 -941 b 182 -957 197 -953 190 -957 b 163 -945 174 -957 166 -953 b 161 -939 161 -942 161 -942 b 217 -743 161 -931 170 -904 b 272 -555 247 -639 272 -555 b 272 -555 272 -555 272 -555 b 264 -560 272 -555 268 -557 b 140 -603 227 -589 182 -603 b 36 -567 102 -603 65 -592 b -1 -487 12 -548 -1 -517 b 17 -427 -1 -466 5 -445 b 103 -380 38 -395 70 -380 b 191 -433 137 -380 172 -398 b 205 -484 201 -448 205 -466 b 178 -553 205 -509 196 -535 l 175 -557 l 182 -555 b 307 -435 236 -539 284 -494 b 372 -213 308 -430 372 -215 b 372 -213 372 -213 372 -213 b 364 -219 372 -213 368 -216 b 240 -262 328 -247 283 -262 b 137 -226 202 -262 166 -249 b 99 -145 112 -206 99 -176 b 118 -84 99 -124 106 -104 b 204 -38 138 -54 171 -38 b 292 -91 238 -38 273 -56 b 306 -141 302 -106 306 -124 b 279 -212 306 -167 296 -194 l 276 -215 l 281 -213 b 408 -93 336 -198 385 -151 b 473 129 409 -88 473 127 b 473 129 473 129 473 129 b 465 122 473 129 469 126 b 341 80 428 94 383 80 b 236 115 303 80 266 91 b 200 195 213 136 200 165 b 217 256 200 217 206 238 b 304 303 239 287 272 303 b 393 249 338 303 374 285 b 406 199 402 234 406 217 b 379 129 406 173 397 148 l 377 126 l 382 127 b 509 248 436 142 485 190 b 574 470 510 254 574 469 b 574 470 574 470 574 470 b 566 464 574 470 570 467 b 442 421 529 435 484 421 b 337 458 404 421 367 433 b 300 537 313 478 300 508 b 389 644 300 585 334 635 ', + }, + rest128th: { + x_min: -1.359375, + x_max: 752.703125, + ha: 768, + o: 'm 490 985 b 504 986 495 986 500 986 b 604 907 551 986 593 954 b 607 884 607 900 607 892 b 581 813 607 857 597 831 l 578 810 l 583 811 b 710 932 638 827 687 873 b 714 943 711 936 713 942 b 730 952 720 949 725 952 b 752 931 741 952 752 943 b 200 -946 752 927 204 -941 b 182 -957 197 -953 190 -957 b 163 -945 174 -957 166 -953 b 161 -939 161 -942 161 -942 b 217 -743 161 -931 170 -904 b 272 -555 247 -639 272 -555 b 272 -555 272 -555 272 -555 b 264 -560 272 -555 268 -557 b 140 -603 227 -589 182 -603 b 36 -567 102 -603 65 -592 b -1 -487 12 -548 -1 -517 b 17 -427 -1 -466 5 -445 b 103 -380 38 -395 70 -380 b 191 -433 137 -380 172 -398 b 205 -484 201 -448 205 -466 b 178 -553 205 -509 196 -535 l 175 -557 l 182 -555 b 307 -435 236 -539 284 -494 b 372 -213 308 -430 372 -215 b 372 -213 372 -213 372 -213 b 364 -219 372 -213 368 -216 b 240 -262 328 -247 283 -262 b 137 -226 202 -262 166 -249 b 99 -145 112 -206 99 -176 b 118 -84 99 -124 106 -104 b 204 -38 138 -54 171 -38 b 292 -91 238 -38 273 -56 b 306 -141 302 -106 306 -124 b 279 -212 306 -167 296 -194 l 276 -215 l 281 -213 b 408 -93 336 -198 385 -151 b 473 129 409 -88 473 127 b 473 129 473 129 473 129 b 465 122 473 129 469 126 b 341 80 428 94 383 80 b 236 115 303 80 266 91 b 200 195 213 136 200 165 b 217 256 200 217 206 238 b 304 303 239 287 272 303 b 393 249 338 303 374 285 b 406 199 402 234 406 217 b 379 129 406 173 397 148 l 377 126 l 382 127 b 509 248 436 142 485 190 b 574 470 510 254 574 469 b 574 470 574 470 574 470 b 566 464 574 470 570 467 b 442 421 529 435 484 421 b 337 458 404 421 367 433 b 300 538 314 477 300 508 b 318 598 300 559 306 580 b 404 645 340 630 372 645 b 494 592 439 645 475 627 b 507 541 502 577 507 559 b 480 471 507 516 498 489 l 477 467 l 483 470 b 608 589 537 485 586 531 b 675 811 611 595 675 810 b 675 811 675 811 675 811 b 666 806 675 811 671 809 b 543 763 628 777 585 763 b 438 799 504 763 468 775 b 401 878 412 820 401 849 b 490 985 401 928 434 977 ', + }, + dynamicPiano: { + x_min: -53.078125, + x_max: 513.140625, + ha: 485, + o: 'm 185 383 b 196 384 187 383 191 384 b 277 334 230 384 259 365 b 288 301 281 324 288 306 b 288 297 288 298 288 297 b 294 302 289 297 291 299 b 394 370 323 338 367 367 b 404 371 398 370 401 371 b 510 272 453 371 498 328 b 513 237 513 262 513 251 b 507 172 513 217 511 192 b 326 -34 487 59 412 -26 b 314 -36 322 -36 318 -36 b 274 -24 298 -36 283 -31 l 265 -16 b 224 44 246 -1 232 20 b 223 49 224 47 223 49 b 223 49 223 49 223 49 b 149 -197 221 48 149 -194 b 149 -198 149 -197 149 -198 b 170 -210 149 -202 155 -205 b 187 -215 174 -210 175 -212 b 204 -231 201 -219 204 -222 b 197 -245 204 -240 202 -242 l 194 -248 l 76 -248 l -42 -248 l -46 -245 b -53 -231 -51 -242 -53 -240 b -35 -215 -53 -222 -49 -217 b -13 -210 -21 -212 -20 -212 b -6 -208 -10 -209 -8 -208 b 0 -206 -6 -208 -2 -206 b 25 -188 13 -201 21 -195 b 163 280 28 -183 163 276 b 166 291 163 283 164 287 b 167 302 167 295 167 299 b 155 324 167 315 161 324 b 155 324 155 324 155 324 b 65 230 125 322 85 280 b 53 215 61 217 58 215 b 51 215 53 215 51 215 b 42 224 46 215 42 217 b 57 263 42 231 47 244 b 140 360 77 305 104 337 b 152 370 144 365 149 369 b 185 383 157 376 172 381 m 374 306 b 366 308 371 308 368 308 b 300 273 348 308 321 294 b 284 254 288 262 287 259 b 280 242 283 249 281 245 b 257 169 279 240 270 213 l 236 98 l 236 93 b 251 48 238 77 243 61 b 279 27 258 37 272 27 b 281 27 279 27 280 27 b 291 31 281 27 287 30 b 396 170 334 52 378 109 b 406 247 402 197 406 224 b 401 277 406 259 405 270 b 374 306 397 290 383 303 ', + }, + dynamicMezzo: { + x_min: 46.28125, + x_max: 669.671875, + ha: 563, + o: 'm 183 376 b 189 376 185 376 187 376 b 212 374 197 376 208 376 b 265 337 234 369 253 355 b 274 317 268 331 273 320 b 274 316 274 317 274 316 b 280 323 276 316 276 319 b 311 358 288 337 299 348 b 319 366 315 360 318 365 b 356 376 326 373 340 376 b 382 371 364 376 374 374 b 428 337 400 366 417 352 b 436 317 431 331 436 320 b 438 316 436 317 436 316 b 442 323 438 316 439 319 b 475 358 451 337 462 348 b 483 366 477 360 481 365 b 518 376 488 373 503 376 b 544 373 528 376 536 376 b 604 285 579 360 604 326 b 597 249 604 273 601 258 b 543 63 596 247 544 70 b 541 54 543 61 541 55 b 540 44 540 51 540 47 b 552 23 540 33 545 23 b 552 23 552 23 552 23 b 647 126 586 29 627 72 b 658 138 651 136 653 138 b 660 138 660 138 660 138 b 669 129 666 137 669 136 b 654 88 669 122 665 109 b 562 -12 631 43 602 9 l 549 -19 b 521 -27 540 -24 530 -27 b 447 30 490 -27 458 -4 b 443 58 445 38 443 48 b 450 93 443 72 446 84 b 504 278 453 97 504 272 b 507 288 506 283 506 287 b 509 298 507 292 509 295 b 491 326 509 310 502 320 b 487 327 490 327 488 327 b 479 324 484 327 483 326 b 441 270 462 316 443 288 b 435 249 441 265 436 254 b 398 127 434 248 419 195 b 362 4 379 61 362 5 b 328 -1 359 -1 362 -1 b 314 -1 323 -1 319 -1 b 302 -1 310 -1 306 -1 b 266 4 266 -1 269 -1 b 265 6 265 5 265 5 b 303 144 265 13 272 34 b 343 278 325 216 343 276 b 344 288 343 281 344 285 b 345 298 345 291 345 295 b 330 326 345 310 340 320 b 323 327 328 327 325 327 b 317 324 322 327 321 326 b 279 270 300 316 281 288 b 273 249 279 265 274 254 b 236 127 272 248 255 195 b 200 4 216 61 200 5 b 164 -1 197 -1 198 -1 b 151 -1 161 -1 156 -1 b 140 -1 147 -1 142 -1 b 103 4 104 -1 106 -1 b 103 6 103 5 103 5 b 141 144 103 13 108 34 b 181 278 161 216 179 276 b 182 288 181 281 181 285 b 183 298 182 291 183 295 b 168 324 183 310 178 320 b 160 327 166 326 163 327 b 141 320 156 327 151 324 b 69 230 112 305 85 272 b 57 215 65 217 62 215 b 55 215 57 215 55 215 b 46 224 49 215 46 217 b 59 260 46 231 50 242 b 151 363 81 306 112 341 b 161 369 155 365 160 367 b 183 376 166 371 174 374 ', + }, + dynamicForte: { + x_min: -118.421875, + x_max: 597.53125, + ha: 381, + o: 'm 460 574 b 464 574 461 574 462 574 b 488 574 470 574 481 574 b 500 573 491 574 498 574 b 594 503 543 570 588 538 b 597 488 596 498 597 494 b 528 417 597 449 564 417 b 502 423 519 417 510 419 b 465 481 477 434 465 458 b 488 528 465 499 472 516 b 490 530 490 530 490 530 b 490 530 490 530 490 530 b 468 517 488 530 475 523 b 349 340 419 485 377 420 b 347 330 348 334 347 330 b 383 328 347 328 363 328 b 428 326 423 328 424 328 b 442 302 438 320 442 312 b 430 281 442 294 438 285 b 385 276 424 277 426 276 l 377 276 l 332 276 l 330 269 b 178 -117 303 126 250 -9 b 1 -249 129 -194 69 -237 b -20 -251 -6 -251 -13 -251 b -114 -187 -65 -251 -100 -227 b -118 -156 -117 -177 -118 -166 b -51 -84 -118 -116 -91 -84 b -31 -87 -46 -84 -39 -86 b 16 -152 0 -95 16 -124 b -12 -205 16 -173 8 -194 b -16 -208 -14 -206 -16 -208 b -14 -208 -16 -208 -14 -208 b -9 -206 -14 -208 -12 -208 b 74 -124 23 -197 54 -166 b 172 224 98 -79 125 22 b 185 276 178 252 183 274 b 185 276 185 276 185 276 b 141 276 185 276 181 276 b 91 280 96 276 96 276 b 77 302 83 285 77 294 b 91 326 77 312 83 320 b 148 328 95 328 96 328 l 198 330 l 202 341 b 460 574 249 473 351 566 ', + }, + dynamicRinforzando: { + x_min: 78.9375, + x_max: 485.921875, + ha: 417, + o: 'm 362 378 b 378 380 367 380 372 380 b 472 348 415 380 453 367 b 485 315 481 338 485 327 b 462 273 485 298 477 281 b 439 267 454 269 446 267 b 398 290 424 267 409 274 b 344 319 385 309 364 319 b 281 269 315 319 289 301 b 279 262 280 266 279 262 b 276 256 279 260 277 258 b 274 249 276 254 274 251 b 238 127 273 248 257 192 b 201 4 217 61 201 5 b 166 -1 198 -1 200 -1 b 153 -1 163 -1 157 -1 b 141 -1 148 -1 144 -1 b 104 4 106 -1 107 -1 b 104 6 104 5 104 5 b 142 144 104 13 110 34 b 182 278 164 219 181 276 b 183 288 182 281 182 285 b 185 302 185 292 185 298 b 164 330 185 317 176 328 b 159 330 163 330 161 330 b 102 302 140 330 119 320 b 91 294 95 295 93 294 b 88 294 91 294 89 294 b 78 303 83 294 78 298 b 81 312 78 306 78 309 b 200 373 106 347 160 373 b 215 371 205 373 209 371 b 266 335 235 367 254 353 b 269 331 268 333 269 331 b 269 331 269 331 269 331 b 273 335 269 331 270 334 b 362 378 298 359 330 376 ', + }, + dynamicSforzando: { + x_min: 70.78125, + x_max: 378.390625, + ha: 315, + o: 'm 246 373 b 254 373 249 373 251 373 b 372 324 303 373 360 351 b 378 302 377 317 378 309 b 338 251 378 278 362 255 b 328 249 334 249 332 249 b 283 294 303 249 283 270 b 288 315 283 301 284 308 b 289 319 289 317 289 319 b 289 319 289 319 289 319 b 283 320 289 320 287 320 b 270 322 279 322 274 322 b 206 288 242 322 215 308 b 206 283 206 287 206 285 b 257 223 206 267 230 238 b 284 206 272 213 277 210 b 351 90 328 173 351 130 b 340 47 351 74 348 59 b 205 -30 314 -2 264 -30 b 182 -29 198 -30 190 -30 b 84 15 147 -24 103 -5 b 70 48 74 24 70 36 b 108 99 70 70 85 94 b 121 102 112 101 117 102 b 167 56 147 102 167 80 b 159 31 167 48 164 40 l 156 26 l 157 26 b 190 20 167 22 178 20 b 220 26 201 20 212 22 b 258 65 243 34 258 51 b 257 70 258 66 258 69 b 204 126 249 94 234 109 b 114 258 148 158 114 209 b 125 302 114 273 118 288 b 246 373 147 342 193 370 ', + }, + dynamicZ: { + x_min: 29.9375, + x_max: 420.578125, + ha: 371, + o: 'm 115 345 b 221 347 117 345 166 347 b 411 345 306 347 409 345 b 420 330 416 342 420 335 b 415 319 420 326 419 321 b 178 118 397 303 179 118 b 178 117 178 118 178 117 b 181 117 178 117 178 117 b 189 117 182 117 185 117 b 193 117 190 117 191 117 b 247 98 215 117 232 111 b 296 75 266 83 280 76 b 302 75 299 75 300 75 b 322 91 311 75 315 79 b 322 91 322 91 322 91 b 322 91 322 91 322 91 b 319 91 322 91 321 91 b 313 90 318 90 315 90 b 283 107 300 90 288 97 b 277 126 279 114 277 121 b 319 167 277 149 295 167 b 319 167 319 167 319 167 b 362 118 347 167 362 147 b 355 82 362 108 359 96 b 311 33 349 65 340 55 b 224 1 284 12 253 1 b 194 5 213 1 204 2 b 168 18 183 8 178 11 b 110 36 151 30 130 36 b 57 15 88 36 68 29 b 47 11 54 12 51 11 b 31 20 40 11 34 13 b 29 26 31 22 29 25 b 68 66 29 36 39 45 b 285 250 73 71 281 248 b 285 250 285 250 285 250 b 231 252 285 252 261 252 b 137 250 190 252 141 250 b 93 227 122 248 110 241 b 78 220 88 222 83 220 b 66 227 74 220 70 222 b 63 234 65 229 63 231 b 85 291 63 241 69 252 b 115 345 108 342 108 344 ', + }, + ornamentTrill: { + x_min: -340.28125, + x_max: 338.921875, + ha: 346, + o: 'm -32 520 b -29 521 -31 520 -31 521 b -23 519 -27 521 -24 520 b -20 513 -21 517 -20 516 b -21 506 -20 512 -20 509 b -31 474 -23 502 -27 488 l -53 402 l -66 352 l -68 349 l -57 349 b -32 351 -51 349 -40 351 b 123 370 19 352 74 359 b 137 371 127 370 133 371 b 170 356 152 371 164 366 b 171 355 170 355 170 355 b 216 366 174 355 183 358 b 280 378 268 377 266 377 b 287 378 283 378 284 378 b 332 349 307 378 322 369 b 338 319 336 341 338 330 b 332 301 338 310 336 302 b 242 280 329 299 246 280 b 242 280 242 280 242 280 b 235 288 236 280 235 283 b 235 292 235 290 235 291 b 236 302 236 297 236 299 b 220 337 236 316 230 330 l 216 340 l 210 335 b 159 276 189 322 172 301 b 118 149 152 265 156 274 b 81 34 84 36 85 36 b -8 13 78 33 -4 13 b -8 13 -8 13 -8 13 b -14 20 -12 15 -14 15 b -8 44 -14 24 -12 31 b -2 66 -5 55 -2 65 b -2 66 -2 66 -2 66 l -2 66 b -43 41 -2 66 -21 55 b -114 4 -98 8 -98 8 b -144 0 -123 0 -134 0 b -242 99 -197 0 -242 43 b -242 109 -242 102 -242 105 b -212 219 -240 122 -242 116 b -185 312 -197 270 -185 312 l -185 312 b -189 312 -185 312 -186 312 b -259 312 -200 312 -227 312 b -321 310 -291 312 -310 310 b -334 312 -330 310 -334 312 b -340 319 -338 313 -340 316 b -336 326 -340 322 -338 324 b -291 337 -334 326 -314 331 l -247 347 l -210 348 b -172 348 -190 348 -172 348 b -168 363 -172 348 -171 355 b -145 442 -151 424 -145 441 b -133 452 -144 444 -140 446 l -77 489 b -32 520 -53 506 -32 520 m 57 334 b 53 335 55 335 54 335 b 44 334 50 335 49 335 b -70 316 8 326 -28 320 b -78 309 -78 316 -78 316 b -108 202 -80 305 -88 274 b -141 81 -136 112 -141 93 b -140 74 -141 79 -141 77 b -117 49 -137 59 -127 49 b -107 52 -114 49 -110 51 b 16 127 -106 54 14 126 b 42 217 16 127 42 215 b 49 241 42 222 44 229 b 73 320 53 251 73 317 b 57 334 73 327 65 333 ', + }, + ornamentTurn: { + x_min: -423.3125, + x_max: 421.9375, + ha: 431, + o: 'm -262 197 b -247 197 -257 197 -253 197 b -118 162 -210 197 -163 184 b 40 45 -61 134 -13 98 b 277 -95 119 -33 200 -81 b 289 -97 281 -97 285 -97 b 378 0 332 -97 371 -55 b 378 11 378 4 378 6 b 302 83 378 55 345 83 b 242 66 283 83 262 77 b 208 56 231 59 219 56 b 148 120 175 56 148 81 b 201 186 148 151 164 172 b 261 198 220 194 240 198 b 420 45 341 198 411 136 b 421 22 421 37 421 29 b 245 -199 421 -93 338 -199 b 238 -198 243 -199 240 -199 b -44 -47 148 -194 50 -141 b -250 86 -114 22 -183 66 b -295 94 -270 91 -283 94 b -315 91 -302 94 -307 94 b -381 4 -356 81 -381 43 b -355 -56 -381 -18 -372 -40 b -298 -81 -338 -73 -319 -81 b -246 -68 -283 -81 -265 -77 b -212 -58 -234 -61 -223 -58 b -178 -69 -200 -58 -189 -62 b -151 -122 -160 -81 -151 -101 b -171 -167 -151 -138 -157 -155 b -239 -195 -185 -181 -213 -192 b -257 -197 -245 -197 -250 -197 b -423 -5 -352 -197 -423 -109 b -412 65 -423 16 -419 40 b -262 197 -389 137 -329 188 ', + }, + ornamentTurnSlash: { + x_min: -423.3125, + x_max: 421.9375, + ha: 431, + o: 'm -10 276 b -2 277 -8 277 -5 277 b 17 265 5 277 13 273 b 19 163 19 260 19 260 l 19 68 l 39 45 b 277 -95 122 -34 200 -81 b 289 -97 281 -97 285 -97 b 378 0 332 -97 371 -54 b 378 11 378 4 378 6 b 302 83 378 55 345 83 b 242 66 283 83 262 77 b 208 56 231 59 219 56 b 148 120 175 56 148 81 b 200 186 148 151 164 172 b 261 198 220 194 240 198 b 420 45 341 198 411 137 b 421 22 421 37 421 29 b 257 -198 421 -86 347 -188 b 242 -198 251 -198 247 -198 b 20 -105 181 -198 95 -163 l 19 -104 l 19 -183 b 19 -216 19 -195 19 -206 b 12 -273 19 -272 17 -267 b -2 -278 8 -277 2 -278 b -21 -266 -10 -278 -19 -274 b -23 -165 -23 -263 -23 -262 l -23 -69 l -44 -47 b -250 86 -117 23 -183 66 b -295 94 -270 93 -284 94 b -315 91 -302 94 -308 94 b -381 5 -356 81 -381 43 b -355 -56 -381 -16 -372 -40 b -299 -81 -338 -73 -319 -81 b -246 -68 -283 -81 -265 -77 b -212 -58 -234 -61 -223 -58 b -168 -77 -196 -58 -179 -65 b -151 -122 -156 -90 -151 -105 b -179 -174 -151 -141 -160 -162 b -239 -195 -194 -184 -217 -192 b -257 -197 -245 -195 -250 -197 b -423 -5 -349 -197 -423 -113 b -423 0 -423 -4 -423 -1 b -277 194 -420 97 -362 173 b -247 197 -268 197 -258 197 b -24 104 -185 197 -100 162 l -23 102 l -23 181 b -21 265 -23 260 -23 260 b -10 276 -20 269 -14 274 ', + }, + ornamentMordent: { + x_min: -402.890625, + x_max: 401.53125, + ha: 410, + o: 'm -10 273 b -4 274 -9 273 -6 274 b 16 262 4 274 12 269 b 17 158 17 259 17 259 l 17 56 l 62 112 b 117 174 110 172 110 172 b 122 174 118 174 119 174 b 132 173 125 174 129 173 b 295 11 134 172 171 134 l 307 -1 l 336 34 b 374 76 366 72 368 74 b 381 77 375 77 378 77 b 401 56 392 77 401 68 b 400 48 401 54 401 51 b 223 -172 397 41 230 -166 b 210 -176 220 -174 215 -176 b 201 -174 206 -176 204 -176 b 112 -87 198 -173 178 -152 b 27 0 65 -38 27 0 b 21 -6 27 0 24 -2 l 17 -12 l 17 -147 b 17 -210 17 -173 17 -194 b 10 -292 17 -297 16 -287 b -2 -299 6 -297 2 -299 b -21 -287 -10 -299 -19 -295 b -24 -174 -23 -284 -23 -284 l -24 -63 l -66 -117 b -121 -176 -110 -170 -114 -176 b -125 -176 -122 -176 -123 -176 b -296 -12 -134 -174 -125 -184 l -308 0 l -337 -34 b -375 -77 -367 -73 -370 -76 b -382 -79 -377 -79 -379 -79 b -402 -58 -393 -79 -402 -69 b -401 -49 -402 -55 -402 -52 b -224 170 -398 -43 -231 165 b -212 174 -221 173 -216 174 b -202 173 -208 174 -205 174 b -39 11 -200 172 -151 122 l -28 -1 l -25 1 l -24 4 l -24 130 b -23 260 -24 256 -24 258 b -10 273 -20 266 -16 270 ', + }, + ornamentShortTrill: { + x_min: -402.890625, + x_max: 401.53125, + ha: 410, + o: 'm -219 173 b -213 174 -217 174 -215 174 b -202 173 -209 174 -205 173 b -114 86 -200 172 -179 151 b -28 0 -66 37 -28 0 b 40 84 -28 0 2 37 b 117 174 111 173 110 172 b 122 174 118 174 119 174 b 132 173 125 174 129 173 b 295 11 134 172 171 134 l 307 -1 l 336 34 b 374 76 366 72 368 74 b 381 77 375 77 378 77 b 401 56 392 77 401 68 b 400 48 401 54 401 51 b 223 -172 397 41 230 -166 b 210 -176 220 -174 215 -176 b 201 -174 206 -176 204 -176 b 112 -87 198 -173 178 -152 b 27 0 65 -38 27 0 b -42 -86 27 0 -4 -38 b -118 -174 -112 -174 -111 -173 b -123 -176 -119 -176 -121 -176 b -133 -174 -126 -176 -130 -174 b -296 -12 -136 -173 -172 -137 l -308 0 l -337 -34 b -375 -77 -367 -73 -370 -76 b -382 -79 -377 -79 -379 -79 b -402 -58 -393 -79 -402 -69 b -401 -49 -402 -55 -402 -52 b -224 172 -398 -43 -228 167 b -219 173 -223 172 -220 173 ', + }, + ornamentTremblement: { + x_min: -571.671875, + x_max: 570.3125, + ha: 582, + o: 'm -386 173 b -381 174 -385 174 -383 174 b -370 173 -377 174 -372 173 b -281 86 -367 172 -347 151 b -196 0 -235 37 -196 0 b -126 84 -196 0 -164 37 b -50 174 -55 173 -57 172 b -44 174 -49 174 -47 174 b -35 173 -42 174 -38 173 b 53 86 -32 172 -12 151 b 138 0 100 37 138 0 b 208 84 140 0 170 37 b 284 174 279 173 277 172 b 289 174 285 174 288 174 b 299 173 294 174 298 173 b 462 11 303 172 338 134 l 475 -1 l 503 34 b 541 76 534 72 536 74 b 548 77 544 77 545 77 b 570 56 560 77 570 68 b 567 48 570 54 568 51 b 392 -172 564 41 397 -166 b 378 -176 387 -174 382 -176 b 368 -174 374 -176 371 -176 b 280 -87 367 -173 345 -152 b 194 0 234 -38 194 0 b 125 -86 194 0 163 -38 b 49 -174 54 -174 55 -173 b 43 -176 47 -176 46 -176 b 34 -174 40 -176 36 -174 b -54 -87 31 -173 10 -152 b -140 0 -102 -38 -140 0 b -209 -86 -141 0 -171 -38 b -285 -174 -280 -174 -279 -173 b -291 -176 -287 -176 -289 -176 b -300 -174 -295 -176 -299 -174 b -464 -12 -304 -173 -340 -137 l -476 0 l -504 -34 b -543 -77 -534 -73 -537 -76 b -549 -79 -545 -79 -547 -79 b -571 -58 -562 -79 -571 -69 b -568 -49 -571 -55 -570 -52 b -392 172 -566 -43 -396 167 b -386 173 -390 172 -387 173 ', + }, + ornamentPrecompAppoggTrill: { + x_min: -571.671875, + x_max: 570.3125, + ha: 582, + o: 'm -559 351 b -551 352 -556 352 -553 352 b -530 338 -543 352 -533 348 b -529 169 -530 337 -529 291 l -529 1 l -507 27 l -441 112 b -382 174 -394 169 -390 174 b -378 174 -381 174 -379 174 b -281 86 -370 174 -375 179 b -196 0 -234 37 -196 0 b -126 84 -196 0 -164 37 b -50 174 -55 173 -57 172 b -44 174 -49 174 -47 174 b -35 173 -42 174 -38 173 b 53 86 -32 172 -12 151 b 138 0 100 37 138 0 b 208 84 140 0 170 37 b 284 174 279 173 279 172 b 289 174 285 174 288 174 b 300 173 294 174 298 173 b 462 11 303 172 340 134 l 475 -1 l 503 34 b 541 76 534 72 536 74 b 548 77 544 77 545 77 b 570 56 560 77 570 68 b 567 48 570 54 568 51 b 392 -172 564 41 397 -166 b 378 -176 387 -174 382 -176 b 368 -174 375 -176 371 -176 b 280 -87 367 -173 347 -152 b 194 0 234 -38 194 0 b 126 -86 194 0 163 -38 b 49 -174 54 -174 55 -173 b 44 -176 47 -176 46 -176 b 34 -174 40 -176 36 -174 b -54 -87 31 -173 10 -152 b -140 0 -102 -38 -140 0 b -209 -86 -140 0 -171 -38 b -285 -174 -280 -174 -279 -173 b -291 -176 -287 -176 -288 -176 b -300 -174 -294 -176 -298 -174 b -464 -11 -303 -173 -374 -102 l -476 0 l -506 -37 b -539 -76 -528 -65 -537 -74 b -551 -80 -543 -79 -547 -80 b -570 -68 -558 -80 -566 -76 l -571 -65 l -571 136 b -570 340 -571 331 -571 337 b -559 351 -568 344 -564 348 ', + }, + ornamentPrecompSlideTrillDAnglebert: { + x_min: -590.71875, + x_max: 589.359375, + ha: 601, + o: 'm -367 173 b -362 174 -366 174 -364 174 b -351 173 -357 174 -353 173 b -262 86 -348 172 -328 151 b -176 0 -216 37 -176 0 b -107 84 -176 0 -145 37 b -31 174 -36 173 -38 172 b -25 174 -29 174 -28 174 b -16 173 -23 174 -19 173 b 72 86 -13 172 6 151 b 157 0 119 37 157 0 b 227 84 159 0 189 37 b 303 174 298 173 296 172 b 308 174 304 174 307 174 b 318 173 313 174 317 173 b 481 11 322 172 357 134 l 494 -1 l 522 34 b 560 76 553 72 555 74 b 567 77 563 77 564 77 b 589 56 579 77 589 68 b 586 48 589 54 588 51 b 411 -172 583 41 416 -166 b 397 -176 406 -174 401 -176 b 387 -174 393 -176 390 -176 b 299 -87 386 -173 366 -152 b 213 0 253 -38 213 0 b 144 -86 213 0 182 -38 b 68 -174 73 -174 74 -173 b 62 -176 66 -176 65 -176 b 53 -174 59 -176 55 -174 b -35 -87 50 -173 29 -152 b -121 0 -83 -38 -121 0 b -190 -86 -122 0 -152 -38 b -266 -174 -261 -174 -259 -173 b -272 -176 -268 -176 -270 -176 b -281 -174 -276 -176 -280 -174 b -371 -86 -284 -173 -304 -152 b -457 0 -417 -38 -457 0 l -457 0 b -477 -26 -457 0 -470 -16 b -548 -227 -524 -88 -548 -161 b -536 -303 -548 -254 -544 -280 b -533 -317 -534 -309 -533 -313 b -553 -338 -533 -330 -541 -338 b -577 -315 -566 -338 -571 -333 b -590 -227 -586 -287 -590 -258 b -518 -9 -590 -154 -564 -77 b -465 56 -509 2 -504 8 l -402 134 b -367 173 -375 169 -372 172 ', + }, + ornamentPrecompSlideTrillBach: { + x_min: -590.71875, + x_max: 589.359375, + ha: 601, + o: 'm 175 273 b 182 274 178 273 181 274 b 202 262 190 274 198 269 b 204 158 204 259 204 259 l 204 56 l 250 112 b 303 174 296 172 298 172 b 308 174 304 174 307 174 b 318 173 313 174 317 173 b 481 11 322 172 357 134 l 494 -1 l 522 34 b 560 76 553 72 555 74 b 567 77 563 77 564 77 b 589 56 579 77 589 68 b 586 48 589 54 588 51 b 411 -172 583 41 416 -166 b 397 -176 406 -174 401 -176 b 387 -174 393 -176 390 -176 b 299 -87 386 -173 366 -152 b 213 0 253 -38 213 0 b 208 -6 213 0 210 -2 l 204 -12 l 204 -147 b 204 -210 204 -173 204 -194 b 198 -292 204 -297 204 -287 b 183 -299 194 -297 189 -299 b 164 -287 175 -299 167 -295 b 163 -174 163 -284 163 -284 l 161 -63 l 119 -117 b 65 -176 76 -170 73 -176 b 61 -176 63 -176 62 -176 b -35 -87 51 -174 57 -180 b -121 0 -83 -38 -121 0 b -190 -86 -122 0 -152 -38 b -266 -174 -261 -174 -259 -173 b -272 -176 -268 -176 -270 -176 b -281 -174 -276 -176 -280 -174 b -371 -86 -284 -173 -304 -152 b -457 0 -417 -38 -457 0 l -457 0 b -477 -26 -457 0 -470 -16 b -548 -227 -524 -88 -548 -161 b -536 -303 -548 -254 -544 -280 b -533 -317 -534 -309 -533 -313 b -553 -338 -533 -330 -541 -338 b -577 -315 -566 -338 -571 -333 b -590 -227 -586 -287 -590 -258 b -518 -9 -590 -154 -564 -77 b -465 56 -509 2 -504 8 l -402 134 b -363 174 -374 170 -371 174 b -359 174 -362 174 -360 174 b -262 86 -351 174 -356 179 b -176 0 -216 37 -176 0 b -107 84 -176 0 -145 37 b -31 174 -36 173 -38 172 b -25 174 -29 174 -28 174 b -16 173 -23 174 -19 173 b 147 11 -13 172 35 123 l 157 -1 l 160 1 l 163 4 l 163 130 b 164 260 163 256 163 258 b 175 273 166 266 170 270 ', + }, + ornamentPrecompTrillSuffixDandrieu: { + x_min: -590.71875, + x_max: 589.359375, + ha: 601, + o: 'm 544 335 b 553 337 548 337 551 337 b 575 313 563 337 570 330 b 589 226 583 285 589 256 b 517 8 589 152 563 76 b 464 -58 507 -4 503 -9 l 401 -136 b 362 -176 372 -172 370 -176 b 357 -176 360 -176 359 -176 b 261 -87 349 -174 355 -180 b 175 0 215 -38 175 0 b 106 -86 175 0 144 -38 b 29 -174 35 -174 36 -173 b 24 -176 28 -176 27 -176 b 14 -174 21 -176 17 -174 b -73 -87 12 -173 -8 -152 b -159 0 -121 -38 -159 0 b -228 -86 -160 0 -190 -38 b -304 -174 -299 -174 -298 -173 b -310 -176 -306 -176 -308 -176 b -319 -174 -314 -176 -318 -174 b -483 -12 -323 -173 -359 -137 l -495 0 l -524 -34 b -562 -77 -553 -73 -556 -76 b -568 -79 -564 -79 -566 -79 b -590 -58 -581 -79 -590 -69 b -588 -49 -590 -55 -589 -52 b -412 170 -585 -43 -417 165 b -398 174 -408 173 -402 174 b -389 173 -394 174 -392 174 b -300 86 -387 172 -366 151 b -215 -1 -254 37 -215 -1 b -145 84 -215 -1 -183 37 b -69 173 -74 173 -76 172 b -63 174 -68 174 -66 174 b -54 173 -61 174 -57 173 b 34 86 -51 172 -31 151 b 119 -1 81 37 119 -1 b 189 84 121 -1 151 37 b 265 173 259 173 258 172 b 270 174 266 174 269 174 b 280 173 274 174 279 173 b 370 84 283 172 303 151 b 455 -1 416 37 455 -1 l 455 -1 b 476 24 455 -1 469 15 b 547 226 522 87 547 159 b 534 302 547 252 543 278 b 532 317 533 308 532 313 b 544 335 532 326 536 333 ', + }, + ornamentPrecompDoubleCadenceUpperPrefix: { + x_min: -597.53125, + x_max: 596.171875, + ha: 608, + o: 'm -533 324 b -525 327 -530 326 -528 327 b -504 305 -514 327 -504 317 b -504 305 -504 305 -504 305 b -513 284 -504 299 -504 299 b -556 112 -541 226 -556 167 b -545 33 -556 84 -552 58 b -524 -20 -541 15 -532 -9 l -522 -23 l -491 15 l -413 111 b -355 174 -367 169 -363 174 b -351 174 -353 174 -352 174 b -254 86 -343 174 -348 179 b -168 -1 -208 37 -168 -1 b -100 84 -168 -1 -137 37 b -23 173 -28 173 -29 172 b -19 174 -21 174 -20 174 b -8 173 -14 174 -10 173 b 80 86 -5 172 13 151 b 166 -1 127 37 166 -1 b 235 84 166 -1 197 37 b 311 173 306 173 304 172 b 317 174 313 174 314 174 b 326 173 319 174 323 173 b 490 11 329 172 366 134 l 502 -1 l 530 34 b 568 76 560 72 563 74 b 575 77 570 77 573 77 b 596 56 586 77 596 68 b 594 48 596 54 596 51 b 417 -172 592 41 424 -166 b 405 -176 415 -174 409 -176 b 396 -174 401 -176 398 -176 b 307 -87 393 -173 372 -152 b 221 -1 259 -38 221 -1 b 152 -86 221 -1 190 -38 b 76 -176 81 -174 83 -173 b 70 -176 74 -176 73 -176 b 61 -174 66 -176 62 -174 b -27 -87 58 -173 38 -152 b -114 -1 -74 -38 -112 -1 b -182 -86 -114 -1 -145 -38 b -258 -176 -253 -174 -253 -173 b -264 -176 -259 -176 -262 -176 b -274 -174 -268 -176 -272 -174 b -438 -11 -277 -173 -348 -102 l -449 0 l -479 -37 b -524 -80 -513 -80 -514 -80 l -524 -80 b -553 -52 -534 -80 -540 -74 b -597 109 -583 -8 -597 48 b -560 280 -597 165 -585 224 b -533 324 -548 310 -540 322 ', + }, + ornamentPrecompDoubleCadenceUpperPrefixTurn: { + x_min: -597.53125, + x_max: 596.171875, + ha: 608, + o: 'm -533 324 b -525 327 -530 326 -528 327 b -504 305 -514 327 -504 317 b -504 305 -504 305 -504 305 b -513 284 -504 299 -504 299 b -556 112 -541 226 -556 167 b -545 33 -556 84 -552 58 b -524 -20 -541 15 -532 -9 l -522 -23 l -491 15 l -413 111 b -355 174 -367 169 -363 174 b -351 174 -353 174 -352 174 b -254 86 -343 174 -348 179 b -168 -1 -208 37 -168 -1 b -100 84 -168 -1 -137 37 b -23 173 -28 173 -29 172 b -19 174 -21 174 -20 174 b -8 173 -14 174 -10 173 b 155 11 -5 172 43 123 l 166 -1 l 168 1 l 170 4 l 170 130 b 171 260 170 256 170 258 b 191 274 175 269 183 274 b 205 267 196 274 201 272 b 212 158 212 262 210 273 l 212 56 l 257 112 b 311 173 304 172 304 172 b 317 174 313 174 314 174 b 326 173 319 174 323 173 b 490 11 329 172 366 134 l 502 -1 l 530 34 b 568 76 560 72 563 74 b 575 77 570 77 573 77 b 596 56 586 77 596 68 b 594 48 596 54 596 51 b 417 -172 592 41 424 -166 b 405 -176 415 -174 409 -176 b 396 -174 401 -176 398 -176 b 307 -87 393 -173 372 -152 b 221 -1 259 -38 221 -1 b 216 -6 221 -1 219 -2 l 212 -12 l 212 -147 b 212 -210 212 -173 212 -194 b 205 -292 212 -297 210 -287 b 191 -299 201 -297 196 -299 b 172 -287 183 -299 175 -295 b 170 -174 171 -284 171 -284 l 170 -63 l 127 -117 b 73 -176 84 -170 80 -176 b 68 -176 72 -176 70 -176 b -27 -87 59 -174 65 -180 b -114 0 -74 -38 -112 0 b -182 -86 -114 0 -145 -38 b -258 -174 -253 -174 -253 -173 b -264 -176 -259 -176 -262 -176 b -274 -174 -268 -176 -272 -174 b -438 -11 -277 -173 -348 -102 l -449 0 l -479 -37 b -524 -80 -513 -80 -514 -80 l -524 -80 b -553 -52 -534 -80 -540 -74 b -597 109 -583 -8 -597 48 b -560 280 -597 165 -585 224 b -533 324 -548 310 -540 322 ', + }, + ornamentPrecompTrillLowerSuffix: { + x_min: -597.53125, + x_max: 596.171875, + ha: 608, + o: 'm -413 173 b -408 174 -412 174 -409 174 b -397 173 -404 174 -400 173 b -308 86 -394 172 -374 151 b -223 0 -261 37 -223 0 b -153 84 -223 0 -191 37 b -77 174 -83 173 -84 172 b -72 174 -76 174 -74 174 b -62 173 -68 174 -63 173 b 25 86 -59 172 -39 151 b 112 0 73 37 111 0 b 181 84 112 0 144 37 b 257 174 251 173 251 172 b 262 174 258 174 261 174 b 273 173 266 174 270 173 b 436 9 276 172 347 101 l 447 -1 l 477 36 b 522 79 511 79 513 79 l 522 79 b 552 51 533 79 539 73 b 596 -112 582 6 596 -51 b 567 -262 596 -161 586 -213 b 539 -322 558 -287 544 -316 b 524 -327 534 -326 529 -327 b 504 -315 515 -327 507 -323 b 503 -308 503 -312 503 -309 b 511 -285 503 -302 504 -297 b 555 -113 540 -227 555 -169 b 544 -34 555 -86 551 -59 b 522 19 540 -16 530 8 l 521 22 l 481 -26 l 405 -122 b 353 -176 366 -172 362 -176 b 349 -176 352 -176 351 -176 b 253 -87 341 -176 347 -180 b 167 0 206 -38 167 0 b 99 -86 167 0 136 -38 b 21 -174 27 -174 28 -173 b 17 -176 20 -176 19 -176 b 6 -174 13 -176 9 -174 b -81 -87 4 -173 -14 -152 b -167 0 -129 -38 -167 0 b -236 -86 -167 0 -198 -38 b -313 -174 -307 -174 -306 -173 b -318 -176 -314 -176 -315 -176 b -328 -174 -321 -176 -325 -174 b -491 -12 -330 -173 -367 -137 l -503 0 l -530 -34 b -570 -77 -562 -73 -564 -76 b -577 -79 -571 -79 -574 -79 b -597 -58 -588 -79 -597 -69 b -596 -49 -597 -55 -597 -52 b -417 172 -593 -43 -423 167 b -413 173 -417 172 -415 173 ', + }, + stringsDownBow: { + x_min: -149.71875, + x_max: 148.359375, + ha: 151, + o: 'm -9 215 b 0 217 -6 217 -4 217 b 19 205 8 217 14 213 b 20 142 20 202 20 201 l 20 84 l 23 84 b 144 -27 81 74 129 30 b 148 -66 147 -40 148 -54 b 36 -213 148 -134 103 -197 b 0 -219 24 -217 12 -219 b -145 -104 -68 -219 -129 -173 b -149 -68 -148 -91 -149 -79 b -24 84 -149 6 -98 74 l -21 84 l -21 142 b -19 205 -20 201 -20 202 b -9 215 -17 209 -13 213 m -21 -15 b -23 41 -21 37 -21 41 b -23 41 -23 41 -23 41 b -76 11 -35 40 -62 26 b -108 -65 -98 -11 -108 -38 b -1 -176 -108 -122 -65 -176 b 107 -65 63 -176 107 -122 b 74 11 107 -38 96 -11 b 20 41 61 26 32 41 b 20 -15 20 41 20 15 b 19 -74 20 -72 20 -72 b 0 -87 14 -83 6 -87 b -19 -74 -8 -87 -16 -83 b -21 -15 -20 -72 -20 -72 ', + }, + stringsUpBow: { + x_min: -149.71875, + x_max: 148.359375, + ha: 151, + o: 'm -137 381 b -130 383 -134 383 -133 383 b -111 371 -122 383 -114 378 b -55 224 -110 370 -85 305 b 0 80 -25 145 -1 80 b 54 224 0 80 24 145 b 112 377 114 384 110 373 b 127 384 118 381 122 384 b 148 362 138 384 148 374 l 148 356 l 83 183 b 16 9 47 88 17 11 b -1 0 12 2 5 0 b -14 5 -5 0 -10 1 b -84 183 -19 9 -13 -6 l -149 356 l -149 362 b -137 381 -149 371 -145 378 ', + }, + stringsHarmonic: { + x_min: -122.5, + x_max: 121.140625, + ha: 124, + o: 'm -16 145 b 0 147 -10 147 -5 147 b 121 -1 66 147 121 77 b 114 -49 121 -16 118 -33 b -1 -148 95 -112 47 -148 b -85 -106 -31 -148 -61 -134 b -122 -1 -110 -76 -122 -38 b -16 145 -122 68 -81 134 m 12 111 b 0 113 8 113 4 113 b -68 22 -29 113 -61 73 b -70 0 -69 15 -70 6 b -13 -113 -70 -49 -47 -98 b -1 -115 -9 -115 -5 -115 b 63 -40 24 -115 53 -83 b 68 -1 66 -27 68 -15 b 12 111 68 48 46 97 ', + }, + pluckedSnapPizzicatoAbove: { + x_min: -149.71875, + x_max: 148.359375, + ha: 151, + o: 'm -9 215 b 0 217 -6 217 -4 217 b 19 205 8 217 14 213 b 20 142 20 202 20 201 l 20 84 l 23 84 b 144 -27 81 74 129 30 b 148 -66 147 -40 148 -54 b 36 -213 148 -134 103 -197 b 0 -219 24 -217 12 -219 b -145 -104 -68 -219 -129 -173 b -149 -68 -148 -91 -149 -79 b -24 84 -149 6 -98 74 l -21 84 l -21 142 b -19 205 -20 201 -20 202 b -9 215 -17 209 -13 213 m -21 -15 b -23 41 -21 37 -21 41 b -23 41 -23 41 -23 41 b -76 11 -35 40 -62 26 b -108 -65 -98 -11 -108 -38 b -1 -176 -108 -122 -65 -176 b 107 -65 63 -176 107 -122 b 74 11 107 -38 96 -11 b 20 41 61 26 32 41 b 20 -15 20 41 20 15 b 19 -74 20 -72 20 -72 b 0 -87 14 -83 6 -87 b -19 -74 -8 -87 -16 -83 b -21 -15 -20 -72 -20 -72 ', + }, + pluckedSnapPizzicatoBelow: { + x_min: -149.71875, + x_max: 148.359375, + ha: 151, + o: 'm -9 215 b 0 217 -6 217 -4 217 b 19 205 8 217 14 213 b 20 142 20 202 20 201 l 20 84 l 23 84 b 144 -27 81 74 129 30 b 148 -66 147 -40 148 -54 b 36 -213 148 -134 103 -197 b 0 -219 24 -217 12 -219 b -145 -104 -68 -219 -129 -173 b -149 -68 -148 -91 -149 -79 b -24 84 -149 6 -98 74 l -21 84 l -21 142 b -19 205 -20 201 -20 202 b -9 215 -17 209 -13 213 m -21 -15 b -23 41 -21 37 -21 41 b -23 41 -23 41 -23 41 b -76 11 -35 40 -62 26 b -108 -65 -98 -11 -108 -38 b -1 -176 -108 -122 -65 -176 b 107 -65 63 -176 107 -122 b 74 11 107 -38 96 -11 b 20 41 61 26 32 41 b 20 -15 20 41 20 15 b 19 -74 20 -72 20 -72 b 0 -87 14 -83 6 -87 b -19 -74 -8 -87 -16 -83 b -21 -15 -20 -72 -20 -72 ', + }, + pluckedLeftHandPizzicato: { + x_min: 0, + x_max: 319.859375, + ha: 326, + o: 'm 149 508 b 159 509 152 509 155 509 b 186 494 170 509 181 503 b 190 440 190 487 190 488 l 190 430 l 190 377 l 242 377 l 251 377 b 303 373 298 377 296 377 b 319 345 314 367 319 356 b 304 319 319 335 314 324 b 250 315 296 315 299 315 l 242 315 l 190 315 l 190 262 l 190 252 b 186 198 190 204 190 205 b 159 183 179 188 170 183 b 132 198 148 183 138 188 b 127 252 127 205 127 204 l 127 262 l 127 315 l 76 315 l 68 315 b 14 319 20 315 21 315 b 0 347 4 324 0 335 b 14 373 0 356 4 367 b 68 377 21 377 20 377 l 76 377 l 127 377 l 127 430 l 127 440 b 132 494 127 488 127 487 b 149 508 136 501 142 505 ', + }, + keyboardPedalPed: { + x_min: -1.359375, + x_max: 1064.390625, + ha: 1086, + o: 'm 296 692 b 314 694 302 694 307 694 b 386 685 337 694 366 689 b 548 498 480 660 548 580 b 548 481 548 492 548 487 b 455 395 541 426 499 395 b 370 462 420 395 383 417 b 362 496 364 477 362 488 b 377 514 362 509 367 514 b 393 501 386 514 390 510 b 432 474 397 484 413 474 b 470 487 445 474 458 478 b 491 530 484 496 491 510 b 490 544 491 534 491 539 b 333 660 479 606 411 657 l 323 662 l 315 646 b 269 524 285 591 269 556 b 321 431 269 492 287 466 b 349 395 338 413 343 408 b 363 342 359 378 363 362 b 359 312 363 333 362 322 b 285 158 348 266 318 206 b 281 152 283 155 281 152 b 281 152 281 152 281 152 b 287 154 283 152 284 152 b 318 155 298 154 308 155 b 461 98 371 155 419 136 l 464 97 l 483 112 b 503 129 494 120 503 127 b 504 130 503 129 504 129 b 503 138 504 131 503 134 b 500 180 500 152 500 166 b 553 326 500 238 518 288 b 604 366 560 331 592 358 b 649 381 617 376 632 381 b 696 362 665 381 681 374 b 724 302 714 347 724 324 b 695 238 724 278 714 255 b 660 210 691 234 662 212 b 579 148 658 209 582 151 b 579 148 579 148 579 148 b 596 106 579 144 589 119 b 622 77 604 88 609 83 b 657 69 632 72 645 69 b 748 112 688 69 721 84 b 755 123 754 117 755 120 b 755 127 755 124 755 126 b 751 165 752 137 751 151 b 758 219 751 183 754 202 b 894 387 774 290 820 347 b 896 390 896 388 896 388 b 891 398 896 391 895 392 b 622 560 827 477 730 535 b 600 580 605 564 600 569 b 617 596 600 591 607 596 b 628 595 622 596 624 596 b 1057 248 846 552 1020 412 b 1064 191 1061 229 1064 209 b 922 0 1064 94 1005 9 b 902 -1 916 -1 909 -1 b 774 76 847 -1 800 26 b 769 83 770 81 770 83 b 769 81 769 83 769 83 b 627 -1 733 29 677 -1 b 548 27 597 -1 570 8 b 515 88 537 37 525 61 l 513 95 l 510 93 l 453 45 b 390 0 396 0 396 0 b 390 0 390 0 390 0 b 374 15 381 0 377 4 b 268 105 359 69 314 105 b 250 104 262 105 257 105 l 243 102 l 234 90 b 155 1 201 49 159 2 b 147 -1 152 0 149 -1 b 130 15 138 -1 130 6 b 132 20 130 18 132 19 b 136 31 133 22 134 27 b 220 131 149 74 178 109 b 231 137 225 134 230 136 b 302 278 280 202 302 244 b 265 335 302 299 295 309 b 209 442 234 363 213 402 b 209 455 209 446 209 451 b 279 648 209 502 232 564 l 285 659 l 283 659 b 176 627 238 653 210 645 b 57 477 111 594 66 538 b 55 459 55 471 55 464 b 72 409 55 437 61 415 b 93 403 78 405 87 403 b 152 467 123 403 151 431 b 168 488 153 483 157 488 b 185 462 181 488 185 483 l 185 460 b 137 344 183 409 168 369 b 78 322 119 328 98 322 b 13 360 50 322 25 335 b -1 426 4 380 -1 402 b 89 610 -1 488 32 559 b 296 692 147 659 210 685 m 926 348 b 921 353 924 351 922 353 b 914 348 920 353 918 351 b 823 167 857 306 823 237 b 828 124 823 154 826 138 b 890 31 837 79 862 40 b 896 31 892 31 894 31 b 956 104 916 31 940 59 b 970 191 965 129 970 159 b 966 241 970 208 969 224 b 926 348 959 277 945 313 m 627 326 b 619 326 624 326 622 326 b 598 316 611 326 604 323 b 568 215 579 288 568 255 b 568 208 568 213 568 210 b 571 183 570 195 570 184 l 571 183 b 594 201 571 183 582 191 l 634 231 b 660 259 653 247 656 248 b 664 278 662 266 664 272 b 627 326 664 299 649 320 ', + }, + keyboardPedalUp: { + x_min: -1.359375, + x_max: 592.078125, + ha: 604, + o: 'm 280 692 b 295 694 283 692 289 694 b 310 692 300 694 307 692 b 357 630 340 684 357 657 b 336 580 357 612 351 594 b 311 538 321 566 311 549 b 352 492 311 512 330 492 b 366 495 357 492 362 492 b 397 553 390 503 397 517 b 415 603 397 576 402 591 b 460 623 427 617 443 623 b 509 599 479 623 498 614 b 522 559 518 587 522 573 b 494 506 522 538 513 519 b 451 495 481 498 473 496 b 415 488 432 495 426 494 b 394 449 404 483 394 464 b 394 448 394 448 394 448 l 394 440 l 397 433 b 428 409 404 420 413 413 b 438 408 431 408 435 408 b 479 431 450 408 462 415 b 528 455 495 448 510 455 b 548 452 534 455 541 453 b 592 391 577 442 592 416 b 549 331 592 365 577 340 b 528 327 541 328 534 327 b 479 351 510 327 495 335 b 438 374 464 367 450 374 b 417 369 431 374 424 373 b 394 333 402 360 394 348 b 400 312 394 326 396 319 b 451 287 408 294 420 288 b 513 258 484 285 499 278 b 522 223 519 247 522 234 b 461 159 522 190 496 159 b 449 161 457 159 453 159 b 397 229 416 167 397 191 b 366 288 397 265 390 278 b 352 290 362 290 357 290 b 315 262 336 290 321 280 b 311 245 313 256 311 251 b 334 204 311 233 318 220 b 355 170 348 190 351 184 b 357 152 356 166 357 159 b 355 136 357 147 356 140 b 295 88 345 104 321 88 b 232 152 264 88 232 112 b 255 204 232 174 238 186 b 279 244 273 222 279 231 l 279 245 b 238 290 279 270 259 290 b 224 288 234 290 228 290 b 193 229 200 278 193 265 b 141 161 193 191 174 167 b 129 159 137 159 133 159 b 68 223 93 159 68 190 b 77 258 68 234 70 247 b 138 287 91 278 106 285 b 185 302 166 287 175 291 b 196 333 193 312 196 323 b 174 369 196 347 187 360 b 152 374 166 373 159 374 b 111 351 140 374 126 367 b 62 327 95 335 80 327 b 51 328 58 327 54 327 b -1 391 16 334 -1 363 b 53 455 -1 420 17 449 b 62 455 57 455 59 455 b 111 431 80 455 95 448 b 152 408 127 415 140 408 b 161 409 155 408 159 408 b 193 433 176 413 186 420 l 196 440 l 196 448 b 196 451 196 449 196 449 b 190 471 196 459 194 463 b 137 495 182 489 167 495 l 134 495 l 134 495 b 68 560 95 495 68 521 b 129 623 68 596 95 623 b 144 621 134 623 138 623 b 193 553 175 614 193 589 b 224 495 193 517 200 503 b 238 492 228 492 234 492 b 279 538 259 492 279 512 b 254 580 279 549 269 566 b 232 630 239 594 232 612 b 280 692 232 657 250 684 m 307 456 b 295 458 303 458 299 458 b 230 391 258 458 230 426 b 236 360 230 381 231 371 b 295 324 249 337 272 324 b 353 360 318 324 341 337 b 360 391 357 370 360 381 b 307 456 360 421 340 451 ', + }, + pictChokeCymbal: { + x_min: 0, + x_max: 227.3125, + ha: 232, + o: 'm 91 213 b 100 215 93 215 96 215 b 227 58 167 215 224 144 b 227 52 227 56 227 54 b 61 -201 227 -43 164 -138 b 29 -216 44 -212 36 -216 b 23 -210 27 -216 24 -213 b 21 -205 21 -208 21 -206 b 34 -192 21 -201 25 -197 b 122 -55 89 -161 122 -106 b 104 6 122 -33 117 -12 l 103 9 l 96 9 b 4 79 57 9 17 38 b 0 112 1 90 0 101 b 91 213 0 163 36 209 ', + }, + wiggleArpeggiatoUp: { + x_min: 58.53125, + x_max: 228.671875, + ha: 294, + o: 'm 138 371 b 142 373 140 371 141 373 b 178 342 149 373 156 366 b 228 251 217 297 228 278 b 228 244 228 248 228 247 b 176 147 227 212 212 184 b 123 73 152 122 132 93 b 121 62 122 70 121 66 b 145 13 121 48 129 31 b 153 -2 151 6 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 145 -11 b 129 -1 140 -11 136 -8 b 61 87 89 37 68 68 b 58 113 59 95 58 105 b 110 215 58 144 74 177 b 163 287 134 240 155 269 b 166 299 166 291 166 295 b 141 348 166 313 157 330 b 133 360 134 356 133 358 b 133 363 133 362 133 362 b 138 371 133 367 136 370 ', + }, + arrowheadBlackUp: { + x_min: -10.890625, + x_max: 299.4375, + ha: 294, + o: 'm 136 460 b 142 462 137 462 140 462 b 166 449 152 462 161 456 b 171 428 168 446 168 445 b 288 131 194 322 238 209 b 298 115 295 120 296 117 b 299 106 298 112 299 109 b 273 81 299 91 287 81 b 255 86 268 81 261 83 b 155 116 225 104 183 116 l 152 116 l 149 108 b 141 83 148 102 144 91 b 134 48 137 69 134 58 b 149 9 134 34 140 24 b 153 -1 152 5 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 147 -11 b 122 2 138 -11 133 -6 b 95 61 104 20 95 38 b 107 108 95 74 99 90 b 108 113 107 111 108 112 b 107 113 108 113 108 113 b 102 113 106 113 104 113 b 31 86 76 108 53 98 b 14 80 24 81 20 80 b -10 106 0 80 -10 91 b 0 131 -10 115 -9 116 b 115 430 49 209 91 317 b 136 460 119 451 123 456 ', + }, + arrowheadBlackDown: { + x_min: -10.890625, + x_max: 298.078125, + ha: 294, + o: 'm 138 473 b 142 474 140 473 141 474 b 164 459 148 474 153 470 b 191 402 183 442 191 423 b 181 353 191 388 187 371 b 178 349 179 352 178 349 b 179 348 178 348 179 348 b 185 349 181 348 182 348 b 255 376 210 355 234 363 b 272 381 264 381 266 381 b 298 355 287 381 298 370 b 288 330 298 348 298 345 b 171 34 238 254 194 141 b 166 13 168 16 168 16 b 144 1 161 5 152 1 b 121 15 134 1 125 5 b 115 33 119 18 117 24 b 0 330 91 145 49 252 b -10 355 -9 345 -10 348 b 13 381 -10 371 0 381 b 31 376 19 381 25 380 b 132 345 61 358 103 345 l 136 345 l 137 355 b 145 378 138 359 142 370 b 152 415 149 394 152 405 b 137 452 152 427 148 438 b 133 464 134 458 133 460 b 138 473 133 467 134 470 ', + }, + vexAccidentalMicrotonal1: { + x_min: -171.5, + x_max: 483.1875, + ha: 493, + o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 495 20 616 20 616 b 20 373 20 427 20 373 b 115 410 20 373 63 390 l 210 448 l 210 531 b 212 620 210 614 210 616 b 231 632 215 628 223 632 b 246 627 236 632 242 631 b 251 541 251 620 251 628 l 251 463 l 315 489 b 387 514 368 509 381 514 b 393 513 390 514 392 514 b 406 494 402 510 406 502 b 397 476 406 487 404 480 b 323 446 396 474 363 462 l 251 417 l 251 283 l 251 148 l 254 151 b 370 199 291 183 332 199 b 415 191 385 199 400 197 b 483 84 458 176 483 134 b 461 0 483 58 476 29 b 332 -142 439 -40 411 -72 l 255 -215 b 231 -229 240 -229 239 -229 b 216 -223 224 -229 220 -227 b 210 -158 210 -217 210 -223 b 210 -120 210 -148 210 -136 l 210 -29 l 205 -34 b 100 -142 182 -65 159 -88 l 23 -215 b -1 -229 9 -229 6 -229 b -19 -217 -9 -229 -16 -224 l -20 -215 l -21 48 l -21 310 l -83 287 b -152 262 -133 266 -145 262 b -157 263 -153 262 -155 262 b -171 283 -166 266 -171 274 b -161 301 -171 290 -167 297 b -91 328 -160 302 -129 315 l -21 356 l -21 487 l -20 617 l -19 621 b -8 631 -17 626 -12 630 m 210 288 b 210 401 210 351 210 401 b 114 365 209 401 167 384 l 20 327 l 20 238 l 20 148 l 21 151 b 140 199 59 183 102 199 b 206 180 164 199 187 192 l 209 177 b 209 177 209 177 209 177 b 210 288 210 177 210 199 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 m 341 131 b 328 133 337 133 332 133 b 322 133 326 133 323 133 b 257 87 296 129 273 113 l 251 80 l 251 -37 l 251 -156 l 255 -152 b 375 81 328 -72 375 20 l 375 83 b 341 131 375 113 367 126 ', + }, + vexAccidentalMicrotonal2: { + x_min: -1.359375, + x_max: 386.5625, + ha: 394, + o: 'm 249 535 b 257 537 251 537 253 537 b 276 524 266 537 273 533 l 277 521 l 279 419 l 279 316 l 304 323 b 337 328 319 326 330 328 b 353 316 347 328 349 324 b 355 266 355 315 355 290 b 353 215 355 241 355 217 b 319 198 349 206 347 205 b 279 187 284 190 279 188 b 279 156 279 187 279 174 b 279 136 279 151 279 144 l 279 84 l 289 87 l 330 98 b 367 105 352 102 362 105 b 378 101 372 105 375 104 b 386 61 385 95 386 94 b 386 40 386 55 386 48 l 386 -5 l 385 -8 b 374 -19 383 -12 378 -18 b 291 -40 372 -19 347 -26 b 279 -43 284 -41 279 -43 b 279 -83 279 -43 279 -59 b 279 -95 279 -87 279 -91 l 279 -145 l 304 -140 b 337 -133 321 -136 330 -133 b 349 -140 343 -133 347 -136 b 355 -181 355 -145 355 -142 l 355 -197 l 355 -210 b 349 -252 355 -249 355 -247 b 300 -269 345 -258 347 -258 b 280 -274 291 -272 281 -273 l 279 -274 l 277 -378 l 277 -483 l 276 -487 b 257 -499 273 -495 265 -499 b 238 -487 249 -499 242 -495 l 236 -483 l 236 -384 l 236 -285 l 235 -285 l 212 -291 l 170 -301 b 148 -308 159 -305 148 -306 b 147 -415 147 -308 147 -313 l 147 -523 l 145 -526 b 126 -538 141 -534 133 -538 b 106 -526 118 -538 110 -534 l 104 -523 l 104 -420 b 103 -317 104 -326 104 -317 b 103 -317 103 -317 103 -317 b 50 -330 92 -322 54 -330 b 31 -317 42 -330 35 -326 b 29 -267 29 -315 29 -315 l 29 -219 l 32 -216 b 92 -192 36 -206 36 -206 l 104 -190 l 104 -138 b 103 -87 104 -91 104 -87 b 103 -87 103 -87 103 -87 b 88 -91 103 -87 96 -88 l 49 -101 b 17 -106 32 -105 23 -106 b 6 -102 13 -106 10 -105 b -1 -62 0 -97 -1 -95 b 0 -41 -1 -56 0 -49 l 0 4 l 1 6 b 10 16 2 11 6 15 b 91 37 12 18 38 24 l 104 41 l 104 93 b 103 144 104 140 104 144 b 103 144 103 144 103 144 b 50 131 92 141 54 131 b 31 144 42 131 35 137 b 29 195 29 147 29 148 l 29 242 l 32 245 b 92 269 36 255 36 255 l 104 273 l 104 377 l 104 481 l 106 485 b 126 498 110 492 118 498 b 134 495 129 498 132 496 b 145 485 138 494 142 489 l 147 481 l 147 383 l 147 283 l 152 284 b 190 294 155 285 171 290 l 230 303 l 236 305 l 236 413 l 236 521 l 238 524 b 249 535 240 528 243 533 m 236 126 b 235 177 236 154 236 177 l 235 177 b 213 172 235 177 225 174 l 170 161 b 147 155 157 158 147 155 b 147 124 147 155 147 142 b 147 102 147 117 147 111 l 147 52 l 153 54 l 228 72 l 236 74 l 236 126 m 236 -105 b 235 -54 236 -65 236 -54 l 235 -54 b 231 -55 235 -54 234 -54 b 172 -69 227 -55 204 -62 l 149 -76 l 147 -76 l 147 -127 l 147 -179 l 152 -177 b 190 -167 155 -177 171 -173 l 230 -158 l 236 -156 l 236 -105 ', + }, + vexWiggleArpeggioUp: { + x_min: 58.53125, + x_max: 228.671875, + ha: 294, + o: 'm 138 371 b 142 373 140 371 141 373 b 178 342 149 373 156 366 b 228 251 217 297 228 278 b 228 244 228 248 228 247 b 176 147 227 212 212 184 b 123 73 152 122 132 93 b 121 62 122 70 121 66 b 145 13 121 48 129 31 b 153 -2 151 6 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 145 -11 b 129 -1 140 -11 136 -8 b 61 87 89 37 68 68 b 58 113 59 95 58 105 b 110 215 58 144 74 177 b 163 287 134 240 155 269 b 166 299 166 291 166 295 b 141 348 166 313 157 330 b 133 360 134 356 133 358 b 133 363 133 362 133 362 b 138 371 133 367 136 370 ', + }, + vexNoteHeadMutedBreve: { + x_min: 0, + x_max: 370.21875, + ha: 378, + o: 'm 0 0 l 0 277 l 61 277 l 122 277 l 122 0 l 122 -278 l 61 -278 l 0 -278 l 0 0 m 246 -1 l 246 277 l 308 277 l 370 277 l 370 -1 l 370 -278 l 308 -278 l 246 -278 l 246 -1 ', + }, + }, + cssFontWeight: 'normal', + ascender: 1903, + underlinePosition: -125, + cssFontStyle: 'normal', + boundingBox: { + yMin: -2065.375, + xMin: -695.53125, + yMax: 1901.578125, + xMax: 1159.671875, + }, + resolution: 1000, + original_font_information: { + postscript_name: 'Gonville-18', + version_string: 'Version 0.1.8904 ', + vendor_url: '', + full_font_name: 'Gonville-18', + font_family_name: 'Gonville-18', + copyright: 'No copyright is claimed on this font file.', + description: '', + trademark: '', + designer: '', + designer_url: '', + unique_font_identifier: 'FontForge 2.0 : Gonville-18 : 17-3-2010', + license_url: '', + license_description: '', + manufacturer_name: '', + font_sub_family_name: '18', + }, + descender: -2066, + fontFamily: 'Gonville-18', + lineHeight: 4093, + underlineThickness: 50, +}; + + +/***/ }), + +/***/ "./src/fonts/gonville_metrics.ts": +/*!***************************************!*\ + !*** ./src/fonts/gonville_metrics.ts ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "GonvilleMetrics": () => (/* binding */ GonvilleMetrics) +/* harmony export */ }); +/** + * The Gonville font was created by Simon Tatham. + * https://www.chiark.greenend.org.uk/~sgtatham/gonville/ + */ +const GonvilleMetrics = { + name: 'Gonville', + smufl: false, + stave: { + padding: 12, + endPaddingMax: 10, + endPaddingMin: 5, + unalignedNotePadding: 10, + }, + accidental: { + noteheadAccidentalPadding: 1, + leftPadding: 2, + accidentalSpacing: 3, + }, + clef: { + default: { + point: 40, + width: 26, + }, + small: { + point: 32, + width: 20, + }, + annotations: { + '8va': { + smuflCode: 'timeSig8', + default: { + point: 20, + treble: { + line: -1.2, + shiftX: 11, + }, + }, + small: { + point: 18, + treble: { + line: -0.4, + shiftX: 8, + }, + }, + }, + '8vb': { + smuflCode: 'timeSig8', + default: { + point: 20, + treble: { + line: 6.3, + shiftX: 10, + }, + bass: { + line: 4, + shiftX: 1, + }, + }, + small: { + point: 18, + treble: { + line: 5.8, + shiftX: 6, + }, + bass: { + line: 3.5, + shiftX: 0.5, + }, + }, + }, + }, + // May not need these anymore + lineCount: { + '8': { point: 55, shiftY: 14 }, + '7': { point: 47, shiftY: 8 }, + '6': { point: 40, shiftY: 1 }, + '5': { point: 30, shiftY: -6 }, + '4': { point: 23, shiftY: -12 }, + }, + }, + parenthesis: { + default: { + point: 39, + width: 7, + }, + gracenote: { + point: (39 * 3) / 5, + width: 3, + }, + }, + pedalMarking: { + up: { + point: 40, + }, + down: { + point: 40, + }, + }, + // These are for numeric digits, such as in time signatures + digits: { + point: 40, + tupletPoint: 28, + }, + // articulation: { + // }, + tremolo: { + default: { + point: 25, + spacing: 4, + offsetYStemUp: -7, + offsetYStemDown: 7, + offsetXStemUp: 9, + offsetXStemDown: -0.5, + }, + grace: { + point: 15, + spacing: 4, + offsetYStemUp: -7, + offsetYStemDown: 7, + offsetXStemUp: 6.5, + offsetXStemDown: -0.5, + }, + }, + staveRepetition: { + default: { + offsetY: 25, + offsetSymbol: 12, + spacing: 5, + }, + }, + // noteHead: { + // }, + stem: { + heightAdjustmentForFlag: -3, + // These are stem (Y) offsets to the note heads. To shift the + // noteheads (x-position) themselves, see glyphs.notehead.custom. + noteHead: { + noteheadTriangleUpHalf: { + offsetYBaseStemUp: 5, + offsetYBaseStemDown: 4, + }, + noteheadTriangleUpBlack: { + offsetYBaseStemUp: 5, + offsetYBaseStemDown: 4, + }, + noteheadTriangleUpWhole: { + offsetYBaseStemUp: 5, + offsetYBaseStemDown: 4, + }, + noteheadXHalf: { + offsetYBaseStemUp: -4, + offsetYBaseStemDown: 4, + }, + noteheadXBlack: { + offsetYBaseStemUp: -4, + offsetYBaseStemDown: 4, + }, + noteheadXWhole: { + offsetYBaseStemUp: -4, + offsetYBaseStemDown: 4, + }, + noteheadHalf: { + offsetYBaseStemUp: -1.5, + offsetYBaseStemDown: 1.5, + }, + noteheadBlack: { + offsetYBaseStemUp: -1.5, + offsetYBaseStemDown: 1.5, + }, + noteheadSquareWhite: { + offsetYBaseStemDown: -5, + offsetYBaseStemUp: 5, + }, + }, + }, + glyphs: { + flag: { + shiftX: -0.08, + flag8thDown: { + shiftX: -0.16, + }, + flag16thDown: { + shiftX: -0.16, + }, + flag32ndDown: { + shiftX: -0.16, + shiftY: 9, + }, + flag64thDown: { + shiftX: -0.16, + shiftY: 13, + }, + flag128thDown: { + shiftX: -0.16, + shiftY: 22, + }, + flag32ndUp: { + shiftY: -9, + }, + flag64thUp: { + shiftY: -13, + }, + flag128thUp: { + shiftY: -22, + }, + }, + stringNumber: { + verticalPadding: 8, + stemPadding: 2, + leftPadding: 5, + rightPadding: 6, + }, + textNote: { + point: 40, + default: {}, + ornamentTrill: { + shiftX: -5, + shiftY: 4, + }, + }, + noteHead: { + minPadding: 2, + custom: { + noteheadDiamondWholeStemUp: { + shiftX: -6, + }, + noteheadCircleXStemUp: { + shiftX: -1.5, + }, + noteheadXWholeStemUp: { + shiftX: -5, + }, + noteheadTriangleUpWholeStemUp: { + shiftX: -6, + }, + }, + }, + chordSymbol: { + global: { + superscriptOffset: -400, + subscriptOffset: 300, + kerningOffset: -250, + lowerKerningText: ['D', 'F', 'P', 'T', 'V', 'Y'], + upperKerningText: ['A', 'L'], + spacing: 100, + superSubRatio: 0.66, + }, + csymDiminished: { + scale: 0.8, + leftSideBearing: 0, + advanceWidth: 506, + yOffset: 0, + }, + csymHalfDiminished: { + scale: 0.8, + leftSideBearing: -32, + advanceWidth: 506, + yOffset: 0, + }, + csymAugmented: { + scale: 1, + leftSideBearing: 0, + advanceWidth: 530, + yOffset: 0, + }, + csymParensLeftTall: { + scale: 0.8, + leftSideBearing: 0, + advanceWidth: 155, + yOffset: 250, + }, + csymParensRightTall: { + scale: 0.8, + leftSideBearing: -40, + advanceWidth: 189, + yOffset: 250, + }, + csymBracketLeftTall: { + scale: 0.8, + leftSideBearing: 0, + advanceWidth: 328, + yOffset: 0, + }, + csymBracketRightTall: { + scale: 0.8, + leftSideBearing: 1, + advanceWidth: 600, + yOffset: 0, + }, + csymParensLeftVeryTall: { + scale: 0.9, + leftSideBearing: 0, + advanceWidth: 121, + yOffset: 350, + }, + csymParensRightVeryTall: { + scale: 0.9, + leftSideBearing: 50, + advanceWidth: 111, + yOffset: 350, + }, + csymDiagonalArrangementSlash: { + scale: 0.6, + leftSideBearing: -1, + advanceWidth: 990, + yOffset: 0, + }, + csymMinor: { + scale: 0.8, + leftSideBearing: 0, + advanceWidth: 482, + yOffset: 0, + }, + csymMajorSeventh: { + scale: 0.9, + leftSideBearing: 200, + yOffset: 0, + advanceWidth: 600, + }, + accidentalSharp: { + scale: 0.75, + leftSideBearing: 40, + advanceWidth: 250, + yOffset: -402, + }, + accidentalFlat: { + scale: 0.95, + leftSideBearing: -50, + advanceWidth: 208, + yOffset: -184, + }, + }, + jazzOrnaments: { + brassScoop: { + scale: 1.0, + xOffset: -12, + yOffset: 0, + stemUpYOffset: 0, + reportedWidth: 10, + }, + brassDoitMedium: { + scale: 1.0, + xOffset: 16, + yOffset: 0, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassFallLipShort: { + scale: 1.0, + xOffset: 17, + yOffset: 0, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassLiftMedium: { + scale: 1.0, + xOffset: 16, + yOffset: 5, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassFallRoughMedium: { + scale: 1.0, + xOffset: 16, + yOffset: 28, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassBend: { + scale: 1.0, + xOffset: 2, + yOffset: -8, + stemUpYOffset: 24, + reportedWidth: 5, + }, + brassMuteClosed: { + scale: 1.0, + xOffset: 3, + yOffset: -9, + stemUpYOffset: 24, + reportedWidth: 5, + }, + brassMuteOpen: { + scale: 1.0, + xOffset: 3, + yOffset: -7, + stemUpYOffset: 25, + reportedWidth: 5, + }, + brassFlip: { + scale: 1.0, + xOffset: 10, + yOffset: -4, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassJazzTurn: { + scale: 1.0, + xOffset: 6, + yOffset: -4, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassSmear: { + scale: 1.0, + xOffset: 10, + yOffset: -4, + stemUpYOffset: 0, + reportedWidth: 5, + }, + }, + tremolo: { + default: { + shiftY: -10, + }, + grace: { + shiftY: -5, + }, + }, + tuplet: { + noteHeadOffset: 20, + stemOffset: 10, + bottomLine: 4, + topModifierOffset: 15, + }, + }, +}; + + +/***/ }), + +/***/ "./src/fonts/load_all.ts": +/*!*******************************!*\ + !*** ./src/fonts/load_all.ts ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "loadAllMusicFonts": () => (/* binding */ loadAllMusicFonts) +/* harmony export */ }); +/* harmony import */ var _load_bravura__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./load_bravura */ "./src/fonts/load_bravura.ts"); +/* harmony import */ var _load_custom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./load_custom */ "./src/fonts/load_custom.ts"); +/* harmony import */ var _load_gonville__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./load_gonville */ "./src/fonts/load_gonville.ts"); +/* harmony import */ var _load_petaluma__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./load_petaluma */ "./src/fonts/load_petaluma.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// vexflow.js statically bundles & preloads all of our music engraving fonts. + + + + +// ADD_MUSIC_FONT +// import { loadXXX } from './load_xxx'; +// Populate our font "database" with all our music fonts. +function loadAllMusicFonts() { + (0,_load_bravura__WEBPACK_IMPORTED_MODULE_0__.loadBravura)(); + (0,_load_gonville__WEBPACK_IMPORTED_MODULE_2__.loadGonville)(); + (0,_load_petaluma__WEBPACK_IMPORTED_MODULE_3__.loadPetaluma)(); + (0,_load_custom__WEBPACK_IMPORTED_MODULE_1__.loadCustom)(); + // ADD_MUSIC_FONT + // loadXXX(); +} + + +/***/ }), + +/***/ "./src/fonts/load_bravura.ts": +/*!***********************************!*\ + !*** ./src/fonts/load_bravura.ts ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "loadBravura": () => (/* binding */ loadBravura) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../font */ "./src/font.ts"); +/* harmony import */ var _bravura_glyphs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./bravura_glyphs */ "./src/fonts/bravura_glyphs.ts"); +/* harmony import */ var _bravura_metrics__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./bravura_metrics */ "./src/fonts/bravura_metrics.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// If you are adding a new music engraving font, search for instances of ADD_MUSIC_FONT throughout the code base. +// To compile your new font into vexflow.js, take a look at src/fonts/load_all.ts +// You can export a font module which can be dynamically loaded by vexflow-core.js (see: Gruntfile.js). +// ADD_MUSIC_FONT +// To add a new music engraving font XXX, make a copy of this file and name it load_xxx.ts. +// Then you will need to generate xxx_glyphs.ts and xxx_metrics.ts. +// xxx_glyphs.ts is created by tools/fonts/fontgen_smufl.js +// xxx_metrics.ts is created by hand. You could copy bravura_metrics.ts and modify/remove/add entries where necessary. + + + +function loadBravura() { + _font__WEBPACK_IMPORTED_MODULE_0__.Font.load('Bravura', _bravura_glyphs__WEBPACK_IMPORTED_MODULE_1__.BravuraFont, _bravura_metrics__WEBPACK_IMPORTED_MODULE_2__.BravuraMetrics); +} + + +/***/ }), + +/***/ "./src/fonts/load_custom.ts": +/*!**********************************!*\ + !*** ./src/fonts/load_custom.ts ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "loadCustom": () => (/* binding */ loadCustom) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../font */ "./src/font.ts"); +/* harmony import */ var _custom_glyphs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./custom_glyphs */ "./src/fonts/custom_glyphs.ts"); +/* harmony import */ var _custom_metrics__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./custom_metrics */ "./src/fonts/custom_metrics.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + +function loadCustom() { + _font__WEBPACK_IMPORTED_MODULE_0__.Font.load('Custom', _custom_glyphs__WEBPACK_IMPORTED_MODULE_1__.CustomFont, _custom_metrics__WEBPACK_IMPORTED_MODULE_2__.CustomMetrics); +} + + +/***/ }), + +/***/ "./src/fonts/load_gonville.ts": +/*!************************************!*\ + !*** ./src/fonts/load_gonville.ts ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "loadGonville": () => (/* binding */ loadGonville) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../font */ "./src/font.ts"); +/* harmony import */ var _gonville_glyphs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./gonville_glyphs */ "./src/fonts/gonville_glyphs.ts"); +/* harmony import */ var _gonville_metrics__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./gonville_metrics */ "./src/fonts/gonville_metrics.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + +function loadGonville() { + _font__WEBPACK_IMPORTED_MODULE_0__.Font.load('Gonville', _gonville_glyphs__WEBPACK_IMPORTED_MODULE_1__.GonvilleFont, _gonville_metrics__WEBPACK_IMPORTED_MODULE_2__.GonvilleMetrics); +} + + +/***/ }), + +/***/ "./src/fonts/load_petaluma.ts": +/*!************************************!*\ + !*** ./src/fonts/load_petaluma.ts ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "loadPetaluma": () => (/* binding */ loadPetaluma) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../font */ "./src/font.ts"); +/* harmony import */ var _petaluma_glyphs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./petaluma_glyphs */ "./src/fonts/petaluma_glyphs.ts"); +/* harmony import */ var _petaluma_metrics__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./petaluma_metrics */ "./src/fonts/petaluma_metrics.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + +function loadPetaluma() { + _font__WEBPACK_IMPORTED_MODULE_0__.Font.load('Petaluma', _petaluma_glyphs__WEBPACK_IMPORTED_MODULE_1__.PetalumaFont, _petaluma_metrics__WEBPACK_IMPORTED_MODULE_2__.PetalumaMetrics); +} + + +/***/ }), + +/***/ "./src/fonts/petaluma_glyphs.ts": +/*!**************************************!*\ + !*** ./src/fonts/petaluma_glyphs.ts ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "PetalumaFont": () => (/* binding */ PetalumaFont) +/* harmony export */ }); +const PetalumaFont = { + glyphs: { + bracketTop: { + x_min: 0, + x_max: 508, + y_min: 0, + y_max: 370, + ha: 370, + o: 'm 22 0 b 122 0 55 1 89 0 l 157 0 b 713 376 425 0 622 137 b 732 467 724 406 732 436 b 726 514 732 482 730 498 b 711 533 723 528 719 533 b 693 526 707 533 700 530 b 674 498 683 520 678 508 b 635 406 662 467 652 435 b 310 164 560 281 458 193 b 154 151 258 154 206 151 b 39 154 117 151 78 154 b 1 120 17 154 4 145 b 0 84 0 108 0 96 b 0 20 0 63 1 40 b 22 0 0 4 7 0 z', + }, + bracketBottom: { + x_min: 0, + x_max: 496, + y_min: -393, + y_max: 0, + ha: 393, + o: 'm 696 -566 b 711 -539 713 -566 708 -549 b 714 -521 713 -533 714 -527 b 713 -508 714 -517 713 -513 b 661 -327 706 -445 688 -384 b 392 -42 603 -203 513 -109 b 206 0 331 -7 266 0 b 160 -1 190 0 174 -1 b 26 -1 107 -1 66 -3 b 0 -19 12 -1 0 -4 l 0 -23 b 3 -50 1 -32 3 -42 b 1 -86 3 -62 1 -73 b 4 -118 1 -96 1 -108 b 45 -151 10 -145 23 -154 b 180 -143 89 -144 135 -145 b 621 -419 392 -135 523 -236 b 662 -539 641 -456 655 -497 b 696 -566 667 -557 680 -566 z', + }, + barlineTick: { + x_min: 0, + x_max: 56.036101509664164, + y_min: 876.905249806889, + y_max: 1121.5430338167066, + ha: 244.63778400981766, + o: 'm 42 1263 b 66 1287 62 1261 66 1272 b 81 1583 65 1387 72 1485 b 35 1614 82 1610 53 1610 b 14 1591 17 1619 16 1604 b 0 1408 7 1525 0 1459 l 0 1292 b 42 1263 1 1263 23 1266 z', + }, + breathMarkTick: { + x_min: 0, + x_max: 568, + y_min: 0, + y_max: 621, + ha: 621, + o: 'm 258 0 b 278 39 276 0 274 24 b 279 56 279 45 279 50 l 279 73 b 278 117 279 88 278 102 b 281 148 278 127 279 138 b 536 600 312 330 387 487 b 744 719 600 651 670 690 b 815 779 775 730 808 740 b 818 824 818 793 818 808 b 815 868 818 838 818 852 b 796 894 814 881 808 894 b 779 888 791 894 786 893 b 719 864 760 878 739 871 b 372 602 580 806 459 724 b 229 252 298 498 251 383 b 220 268 225 262 222 264 b 209 302 217 279 213 291 b 75 527 181 387 143 467 b 16 563 58 543 39 573 b 0 539 3 557 0 549 b 12 492 0 524 9 507 b 56 400 19 459 22 425 b 163 269 104 367 138 323 b 238 36 197 194 216 115 b 258 0 242 22 243 0 z', + }, + segno: { + x_min: 0, + x_max: 798, + y_min: -65, + y_max: 806, + ha: 871, + o: 'm 16 -94 b 66 -69 39 -92 53 -85 b 177 59 102 -26 138 17 b 543 456 298 192 420 324 b 726 300 615 420 680 373 b 753 217 744 271 753 243 b 655 112 753 170 719 131 b 599 104 636 107 618 104 b 461 173 544 104 495 128 b 432 190 454 183 444 190 b 409 179 425 190 418 187 b 359 118 390 160 373 141 b 341 72 347 101 341 86 b 373 24 341 56 351 40 b 409 6 384 17 396 10 b 550 -13 454 -12 501 -14 b 599 -6 566 -12 583 -10 b 864 213 720 27 806 104 b 886 300 878 242 886 271 b 857 395 886 331 877 363 b 799 467 840 420 821 445 b 648 572 755 513 704 546 b 1110 1083 802 743 955 914 b 1140 1129 1123 1097 1136 1110 b 1149 1148 1142 1135 1149 1142 b 1145 1153 1149 1149 1148 1152 b 1123 1161 1139 1158 1130 1161 b 1109 1156 1119 1161 1113 1159 b 1089 1138 1102 1151 1094 1145 b 946 988 1040 1089 989 1041 b 595 602 834 855 711 732 l 590 598 l 549 615 b 432 793 462 647 432 723 b 534 888 432 851 474 888 b 671 834 588 888 631 864 b 710 818 684 824 696 818 b 724 821 714 818 719 819 b 809 883 757 834 788 852 b 816 901 814 890 816 896 b 802 923 816 910 812 916 b 706 984 770 945 742 971 b 593 1011 668 998 631 1011 b 516 991 567 1011 541 1005 b 333 799 433 949 380 876 b 302 693 312 765 302 729 b 330 589 302 658 311 624 b 469 488 360 533 415 511 b 485 482 475 487 480 485 b 266 249 412 405 338 327 b 121 88 217 196 170 141 b 9 -65 78 40 37 -7 b 0 -85 4 -72 0 -79 b 16 -94 0 -91 4 -94 z m 861 536 b 927 575 890 539 909 557 b 965 628 952 598 965 613 b 926 680 965 644 952 658 b 865 713 900 701 883 713 b 805 667 845 713 828 698 b 768 611 791 649 770 631 b 812 564 766 589 798 582 b 861 536 824 550 840 537 z m 251 350 b 363 436 285 348 353 403 b 354 456 366 448 360 452 b 271 518 327 477 298 497 b 243 528 261 526 252 528 b 210 513 232 528 222 523 b 157 454 190 494 176 472 b 141 428 147 444 141 436 b 158 406 141 420 147 413 b 216 361 180 393 197 376 b 245 350 225 356 235 350 z', + }, + coda: { + x_min: 0, + x_max: 1380, + y_min: -196, + y_max: 1037, + ha: 1233, + o: 'm 1028 -282 b 1057 -245 1045 -282 1053 -261 b 1060 -203 1060 -232 1060 -217 b 1063 9 1060 -132 1061 -62 b 1390 194 1192 22 1303 81 b 1531 543 1467 298 1512 415 b 1532 556 1531 547 1532 552 b 1904 559 1656 557 1780 559 b 1950 582 1920 559 1941 569 b 1987 674 1970 609 1987 638 b 1984 698 1987 681 1986 690 b 1950 700 1973 698 1961 700 l 1941 700 l 1545 696 b 1535 776 1545 723 1541 749 b 1103 1113 1477 996 1326 1107 b 1080 1115 1096 1115 1087 1115 b 1081 1322 1080 1184 1080 1253 b 1079 1467 1083 1371 1081 1418 b 1061 1493 1079 1476 1080 1493 l 1060 1493 b 1028 1467 1044 1490 1031 1485 b 1020 1403 1025 1446 1020 1424 b 1017 1110 1020 1305 1018 1208 l 962 1106 b 569 914 808 1087 671 1035 b 451 683 510 844 472 766 l 161 678 b 118 680 148 678 132 680 b 79 670 101 680 86 678 b 0 544 48 636 29 592 l 37 544 l 429 549 b 428 518 428 539 428 528 b 488 285 428 435 458 360 b 681 81 526 192 593 124 b 946 9 763 40 854 19 b 1008 6 966 7 988 6 b 1005 -137 1008 -42 1005 -89 b 1012 -243 1005 -173 1005 -209 b 1028 -282 1015 -258 1011 -282 z m 1074 690 b 1079 935 1077 772 1077 852 b 1326 855 1166 932 1250 909 b 1446 694 1385 814 1426 759 b 1269 693 1387 694 1328 693 b 1074 690 1204 693 1139 691 z m 577 684 b 766 874 618 763 678 828 b 989 932 837 912 913 923 b 1015 933 998 932 1007 933 b 1014 822 1015 896 1014 860 b 1011 688 1012 791 1012 743 z m 1067 184 b 1071 553 1070 307 1068 429 b 1439 556 1194 553 1316 554 b 1437 554 1439 554 1437 554 b 1341 337 1413 478 1387 402 b 1119 192 1286 261 1211 212 b 1067 184 1102 189 1084 186 z m 1008 180 b 660 264 886 181 770 212 b 524 471 570 305 524 374 b 528 524 524 488 526 505 l 533 549 b 792 552 619 550 706 550 b 1009 553 865 553 937 552 b 1008 180 1009 428 1008 288 z', + }, + gClef: { + x_min: 0, + x_max: 664, + y_min: -559, + y_max: 1009, + ha: 1568, + o: 'm 343 -805 b 366 -801 350 -805 357 -804 b 409 -773 383 -795 397 -786 b 582 -328 528 -648 577 -497 b 583 -294 582 -315 583 -294 b 612 -279 583 -294 603 -282 b 747 -197 660 -256 706 -230 b 949 143 857 -109 920 10 b 956 206 955 164 956 186 b 791 384 956 297 906 363 b 704 393 762 390 733 393 b 498 336 632 393 563 374 b 481 325 490 331 481 325 l 444 465 b 442 485 442 472 442 485 b 609 880 442 485 589 746 b 619 996 616 919 619 958 b 613 1084 619 1027 618 1056 b 534 1387 599 1188 560 1286 b 482 1453 527 1417 517 1453 b 422 1407 456 1453 438 1428 b 305 1063 348 1305 312 1188 b 304 1002 304 1043 304 1022 b 338 654 304 886 323 769 b 343 629 338 645 341 636 b 144 356 278 537 206 451 b 23 144 101 288 53 220 b 0 20 7 107 0 63 b 82 -210 0 -69 30 -160 b 207 -288 112 -239 160 -271 b 410 -328 274 -312 340 -328 b 474 -324 431 -328 452 -327 l 491 -321 b 491 -341 491 -321 492 -334 b 402 -585 475 -428 454 -513 b 294 -668 374 -622 348 -664 b 271 -693 278 -670 271 -680 b 274 -708 271 -698 272 -703 b 302 -775 282 -730 292 -753 b 343 -805 311 -795 325 -805 z m 400 717 b 382 922 389 786 382 854 b 481 1286 382 1047 408 1169 b 507 1125 498 1233 507 1179 b 500 1040 507 1097 504 1068 b 400 717 481 927 455 818 z m 252 -135 b 196 -121 232 -134 215 -127 b 117 -69 158 -108 127 -94 b 111 -32 112 -58 111 -45 b 117 19 111 -16 114 1 b 130 56 118 27 127 52 b 324 337 186 156 253 246 l 384 416 l 395 384 b 416 291 406 348 416 291 b 350 213 416 291 376 239 b 243 -42 278 143 243 55 b 251 -117 243 -66 246 -91 b 252 -135 252 -122 252 -127 z m 563 -91 b 510 168 552 3 530 78 b 513 192 508 179 508 186 b 624 202 550 199 586 202 b 730 192 660 202 694 199 b 850 141 773 183 816 176 b 858 134 852 138 855 135 b 595 -121 801 19 716 -68 l 569 -131 z m 410 -160 b 311 -147 360 -160 311 -147 b 307 -98 311 -147 307 -127 b 314 -33 307 -79 308 -56 b 429 131 328 36 377 85 b 441 138 433 135 438 138 b 449 122 446 138 448 132 b 490 -131 462 37 484 -46 b 490 -153 491 -140 490 -153 b 410 -160 490 -153 452 -163 z', + }, + cClef: { + x_min: 0, + x_max: 731, + y_min: -543, + y_max: 543, + ha: 1086, + o: 'm 131 -782 b 141 -755 138 -782 140 -773 b 147 -490 143 -667 145 -577 b 160 207 150 -258 153 -24 b 168 618 164 344 158 481 b 81 768 173 690 132 732 b 45 782 66 778 55 782 b 3 740 26 782 13 768 b 0 724 1 736 0 730 l 1 710 b 4 596 4 672 4 634 l 4 382 b 9 102 4 288 4 196 b 17 -301 13 -32 10 -166 l 17 -672 b 50 -736 17 -701 27 -720 b 109 -772 69 -749 91 -759 b 131 -782 120 -778 127 -782 z m 615 -770 b 881 -684 710 -770 801 -739 b 1020 -395 986 -612 1020 -510 b 1017 -334 1020 -374 1018 -354 b 769 -62 1007 -209 896 -75 b 746 -60 762 -60 755 -60 b 639 -73 710 -60 675 -69 b 524 -109 598 -79 560 -92 b 528 -36 526 -85 528 -60 b 527 -4 528 -26 528 -14 b 528 39 527 10 528 24 b 526 99 528 59 527 79 b 592 94 549 95 570 94 b 648 99 611 94 629 95 b 912 157 744 94 844 117 b 1053 377 1009 215 1053 284 b 1050 425 1053 393 1053 409 b 914 665 1037 521 986 602 b 717 753 855 717 791 753 b 626 734 688 753 658 747 l 462 665 b 347 500 374 628 347 580 b 350 449 347 484 348 468 b 392 419 353 428 367 416 b 492 438 425 425 459 428 b 541 498 524 448 541 468 b 540 514 541 503 541 508 b 537 546 537 524 537 536 b 573 639 537 580 550 611 b 606 657 582 649 593 657 l 609 657 b 716 622 647 652 684 647 b 834 372 801 556 834 469 b 831 323 834 356 832 338 b 743 187 825 266 795 217 b 710 176 732 180 720 176 b 694 179 704 176 700 177 b 527 223 638 193 582 206 b 495 229 516 228 505 229 b 454 220 481 229 468 225 b 395 189 432 213 415 200 b 363 180 384 186 374 181 b 348 168 356 179 348 176 b 340 161 343 167 340 164 b 347 150 340 157 343 154 b 356 147 348 148 353 147 b 364 92 361 130 363 111 b 369 -37 367 49 369 6 b 363 -154 369 -76 367 -115 b 357 -236 360 -183 357 -210 b 376 -264 357 -253 361 -259 b 456 -289 402 -284 429 -289 b 521 -282 478 -289 500 -285 b 549 -255 537 -279 546 -271 b 598 -177 556 -225 577 -202 b 622 -164 605 -168 613 -164 b 636 -167 626 -164 631 -166 b 749 -225 678 -177 714 -199 b 848 -405 814 -276 848 -337 b 824 -507 848 -436 840 -471 b 657 -657 792 -582 730 -625 b 608 -668 638 -664 622 -668 b 534 -602 572 -668 547 -645 b 513 -575 530 -589 523 -575 b 507 -576 510 -575 508 -575 b 478 -582 497 -580 488 -582 b 405 -570 454 -582 428 -570 b 389 -572 399 -570 395 -570 l 363 -572 b 321 -575 348 -572 333 -569 l 321 631 b 323 662 323 641 323 652 b 315 716 323 681 321 698 b 304 736 314 723 317 736 l 302 736 b 281 716 294 734 285 729 b 275 665 276 700 275 683 l 275 382 b 276 99 275 288 275 193 b 279 -170 278 10 276 -81 b 284 -399 282 -246 284 -323 b 282 -629 284 -475 282 -553 b 289 -721 282 -660 289 -690 b 300 -736 289 -727 291 -736 b 312 -724 307 -736 310 -730 b 321 -667 323 -706 321 -687 l 321 -632 l 328 -644 l 340 -657 b 510 -757 386 -707 445 -740 b 615 -770 546 -766 580 -770 z', + }, + fClef: { + x_min: 0, + x_max: 776, + y_min: -496, + y_max: 216, + ha: 712, + o: 'm 402 -706 b 804 -405 592 -678 716 -566 b 876 -53 861 -298 874 -183 b 868 33 876 -32 873 1 b 560 311 845 217 723 311 b 524 310 549 311 536 311 b 131 134 373 297 239 242 b 17 -29 84 86 37 39 b 9 -89 12 -50 9 -71 b 112 -238 9 -154 43 -206 b 124 -243 117 -239 120 -242 b 186 -261 145 -255 166 -261 b 268 -228 215 -261 242 -249 b 351 -59 325 -181 351 -124 b 343 10 351 -36 348 -13 b 340 36 341 19 340 27 b 409 105 340 75 363 102 b 441 107 420 107 431 107 b 624 36 510 107 573 86 b 744 -200 688 -27 724 -109 b 747 -230 747 -210 747 -222 b 717 -323 747 -264 736 -292 b 608 -445 688 -370 654 -410 b 307 -541 518 -513 415 -541 l 213 -541 b 39 -521 154 -541 96 -539 b 0 -552 17 -514 0 -531 b 1 -564 0 -556 0 -560 b 17 -611 6 -580 10 -596 b 101 -694 35 -648 50 -684 b 288 -714 164 -707 225 -714 b 402 -706 325 -714 363 -711 z m 1018 92 b 1080 118 1041 91 1068 96 b 1117 219 1099 150 1117 180 b 1113 252 1117 229 1116 240 b 1045 288 1102 297 1068 276 b 1017 262 1028 297 1024 274 b 984 124 989 220 996 170 b 1008 91 979 108 986 91 z m 972 -281 b 1070 -148 1024 -279 1070 -210 b 1025 -105 1070 -105 1045 -112 b 989 -127 1004 -96 998 -114 b 949 -249 963 -164 963 -209 b 969 -281 943 -265 949 -281 z', + }, + unpitchedPercussionClef1: { + x_min: 0, + x_max: 379.13761966945304, + y_min: -250, + y_max: 250, + ha: 500, + o: 'm 481 -360 b 507 -357 491 -360 500 -360 b 546 -295 541 -346 547 -325 b 536 79 543 -170 540 -46 b 523 311 533 157 534 235 b 475 359 518 340 508 359 b 425 360 459 359 442 360 b 400 359 416 360 409 360 b 337 294 348 353 340 347 l 337 -73 b 336 -264 337 -137 337 -200 b 343 -294 336 -274 338 -284 b 481 -360 359 -330 431 -360 z m 144 -341 b 207 -320 167 -341 189 -331 b 217 -301 215 -315 217 -308 b 210 -262 217 -289 210 -275 b 228 187 212 -112 209 37 b 228 287 228 220 229 253 b 174 353 228 336 222 343 b 120 359 157 357 138 359 b 48 357 96 359 72 356 b 17 323 29 357 19 344 b 7 120 16 255 9 187 b 6 -109 6 43 6 -33 l 6 -204 b 0 -251 6 -220 0 -235 b 3 -269 0 -256 0 -262 b 127 -340 24 -330 79 -328 b 144 -341 132 -341 138 -341 z', + }, + '6stringTabClef': { + x_min: 0, + x_max: 438, + y_min: -768, + y_max: 767, + ha: 1535, + o: 'm 369 438 b 374 439 370 438 372 438 b 384 462 383 444 384 452 l 384 474 b 390 697 386 547 390 622 b 373 1002 390 799 390 901 l 533 1002 b 560 1001 541 1004 552 1001 b 573 1007 567 1001 572 1002 b 546 1050 579 1025 559 1038 b 536 1056 543 1053 539 1053 b 324 1104 472 1102 397 1104 b 72 1090 238 1104 154 1099 b 55 1093 66 1090 60 1092 b 37 1073 46 1093 37 1089 b 60 1045 37 1061 48 1051 b 203 1001 105 1022 151 1001 b 233 1004 213 1001 223 1002 b 246 1005 238 1004 243 1005 b 272 975 264 1005 272 996 l 272 965 b 258 596 264 842 265 719 b 315 474 253 540 272 504 l 343 455 b 369 438 351 448 357 438 z m 114 -320 b 127 -304 120 -320 124 -315 b 171 -174 141 -261 158 -219 b 222 -135 179 -147 196 -137 b 426 -122 289 -131 359 -128 b 498 -164 462 -120 482 -127 b 628 -301 521 -226 575 -264 b 631 -288 631 -295 631 -291 b 628 -269 631 -281 629 -276 b 569 -134 616 -220 589 -179 b 408 225 514 -14 462 107 b 314 357 384 274 351 318 b 278 380 298 372 288 379 b 251 351 268 380 261 372 b 4 -209 156 171 75 -17 b 0 -228 1 -215 0 -222 b 19 -258 0 -240 7 -249 b 102 -314 45 -279 75 -294 b 114 -320 107 -318 111 -320 z m 425 6 b 360 20 403 17 382 20 b 274 14 331 20 302 14 l 246 14 l 340 206 b 425 6 369 137 395 75 z m 245 -1106 b 281 -1104 256 -1106 269 -1106 b 511 -888 400 -1094 511 -1035 b 454 -688 511 -814 504 -744 b 448 -678 449 -685 448 -681 b 454 -667 448 -675 449 -671 b 504 -497 503 -619 507 -559 b 324 -288 500 -383 436 -308 b 295 -287 314 -287 304 -287 l 282 -287 b 115 -330 223 -287 168 -307 b 94 -366 102 -336 94 -348 l 94 -370 b 96 -435 96 -392 96 -413 b 73 -858 89 -576 71 -717 b 78 -919 73 -878 78 -899 b 72 -950 78 -930 76 -940 b 63 -992 66 -965 63 -978 b 66 -1015 63 -999 65 -1008 b 173 -1104 84 -1106 84 -1106 b 245 -1106 197 -1104 220 -1104 z m 161 -622 b 147 -618 156 -622 151 -621 b 140 -600 141 -612 140 -606 b 144 -564 140 -589 144 -575 b 143 -554 144 -560 144 -557 l 143 -546 b 220 -451 144 -467 143 -465 b 278 -445 239 -446 259 -444 b 418 -497 328 -445 376 -461 b 429 -516 426 -504 429 -510 b 415 -533 429 -521 423 -527 b 219 -608 357 -579 287 -590 b 215 -609 217 -608 216 -609 b 161 -622 197 -609 177 -622 z m 154 -953 b 130 -933 135 -953 130 -948 l 130 -865 l 128 -865 b 135 -788 130 -838 124 -808 b 203 -769 145 -769 180 -776 b 259 -762 223 -765 242 -762 b 441 -852 330 -762 386 -805 b 449 -867 446 -858 449 -863 b 436 -884 449 -874 444 -878 b 318 -942 402 -914 363 -935 b 154 -953 264 -950 209 -953 z', + }, + timeSig0: { + x_min: 20, + x_max: 513, + y_min: -358.159536277652, + y_max: 359, + ha: 717.159536277652, + o: 'm 341 -516 b 420 -510 367 -516 395 -514 b 675 -338 533 -494 622 -448 b 737 -92 716 -256 734 -171 b 739 -35 739 -73 739 -53 b 680 305 739 86 720 207 b 400 517 622 449 537 517 b 337 514 380 517 359 517 b 289 507 321 511 305 513 b 91 317 192 477 127 412 b 29 9 50 212 29 108 b 217 -458 29 -157 88 -312 b 341 -516 251 -494 291 -518 z m 412 -452 b 359 -425 393 -452 376 -444 b 187 14 242 -301 179 -158 b 268 334 193 127 212 235 b 387 448 295 383 330 428 b 406 452 395 451 400 452 b 428 444 413 452 420 449 b 517 324 471 413 497 372 b 586 -29 560 222 586 86 b 556 -271 586 -112 585 -193 b 468 -422 536 -327 508 -377 b 412 -452 449 -442 431 -452 z', + }, + timeSig1: { + x_min: 20, + x_max: 283, + y_min: -364, + y_max: 366, + ha: 730, + o: 'm 264 -524 b 357 -510 297 -524 325 -516 b 374 -490 369 -508 374 -501 b 380 -438 376 -472 380 -455 l 406 246 b 408 301 408 265 408 282 b 400 445 408 348 405 396 b 288 527 395 491 338 527 b 253 520 276 527 264 526 b 240 508 249 517 245 513 b 49 409 192 445 127 413 b 29 396 33 408 29 403 b 32 380 29 392 30 386 b 59 363 36 366 49 364 b 164 348 95 356 130 348 b 222 357 183 348 203 351 b 238 361 228 360 233 360 b 252 334 248 361 252 353 b 243 59 252 242 249 150 b 219 -490 229 -124 233 -307 b 264 -524 217 -516 232 -524 z', + }, + timeSig2: { + x_min: 20, + x_max: 660.4636303241031, + y_min: -378.7201231608281, + y_max: 382, + ha: 760.720123160828, + o: 'm 99 -543 b 130 -533 111 -550 121 -540 b 255 -448 168 -501 213 -475 b 338 -425 282 -431 310 -425 b 392 -431 356 -425 374 -426 b 485 -462 423 -438 454 -451 b 648 -497 540 -482 595 -497 b 834 -441 711 -497 773 -480 b 950 -242 906 -395 958 -334 b 942 -210 950 -230 950 -215 b 912 -220 932 -204 920 -213 b 861 -264 894 -235 877 -248 b 775 -317 835 -289 808 -305 b 675 -334 742 -328 708 -334 b 510 -295 619 -334 563 -318 b 372 -264 465 -278 420 -264 b 305 -272 350 -264 328 -266 b 331 -242 318 -256 324 -249 b 490 -73 386 -187 438 -131 b 675 340 595 43 664 180 b 677 369 677 350 677 360 b 556 536 677 461 638 508 b 468 550 526 546 497 550 b 297 508 409 550 353 533 b 111 354 220 475 168 412 b 29 197 65 308 29 261 b 32 164 29 187 29 176 b 29 140 33 157 29 147 b 43 125 29 132 32 125 b 73 147 55 125 65 138 b 86 163 79 153 82 158 b 238 320 134 219 183 272 b 425 389 292 367 360 389 b 575 341 480 389 531 373 b 606 298 590 330 606 317 b 600 278 606 292 603 285 b 501 107 576 217 544 158 b 304 -104 439 33 372 -35 b 111 -356 230 -180 167 -265 b 84 -446 92 -386 84 -415 b 86 -481 84 -458 85 -469 b 88 -514 88 -491 88 -503 b 99 -543 89 -526 91 -537 z', + }, + timeSig3: { + x_min: 19.824321427094187, + x_max: 540, + y_min: -392, + y_max: 392, + ha: 784, + o: 'm 216 -540 b 354 -564 264 -556 310 -564 b 605 -465 445 -564 530 -530 b 729 -161 697 -383 729 -275 b 724 -82 729 -135 727 -108 b 589 95 716 -1 670 62 b 523 114 567 102 546 108 b 750 418 606 213 677 315 b 778 503 769 444 778 472 b 773 540 778 514 776 527 b 750 564 769 557 762 564 b 736 562 746 564 742 563 b 641 552 704 553 672 552 b 402 554 562 552 481 554 l 346 554 b 84 546 258 554 170 554 b 36 501 55 543 40 531 b 29 412 30 472 32 442 b 52 384 27 393 32 384 l 56 384 b 210 392 107 389 158 392 l 602 392 b 354 108 523 285 445 192 b 246 -65 300 58 246 12 b 252 -108 246 -78 248 -92 l 252 -111 b 264 -141 251 -122 251 -135 b 291 -132 274 -145 284 -140 b 425 -72 328 -95 377 -84 b 475 -65 442 -68 459 -65 b 592 -108 517 -65 557 -79 b 645 -179 615 -125 645 -147 b 642 -194 645 -184 644 -189 b 485 -376 616 -278 569 -344 b 361 -399 444 -392 402 -399 b 151 -340 289 -399 219 -376 b 88 -275 122 -323 98 -310 b 71 -249 86 -268 85 -249 b 63 -251 68 -249 66 -249 b 36 -288 48 -255 36 -266 b 55 -423 33 -336 45 -377 b 101 -482 60 -448 78 -468 b 216 -540 138 -504 174 -526 z', + }, + timeSig4: { + x_min: 20, + x_max: 633.0785282750762, + y_min: -489.59088556716864, + y_max: 491.18559127100053, + ha: 980.7764768381692, + o: 'm 608 -704 b 641 -684 622 -708 634 -696 b 667 -602 660 -660 662 -631 b 685 -190 683 -465 680 -327 l 685 -176 b 831 -127 736 -166 783 -148 b 912 0 901 -94 913 -76 b 886 53 912 36 904 52 b 848 40 877 53 864 49 l 838 36 b 687 -13 789 14 739 -3 b 681 177 687 50 684 114 b 672 338 678 230 677 285 b 654 373 671 350 672 373 b 622 340 636 373 624 361 b 615 262 621 314 613 288 b 619 -22 616 167 619 72 b 569 -22 602 -23 585 -23 b 305 -3 481 -16 395 -1 b 210 -9 274 -3 242 -4 b 301 163 242 52 268 108 b 513 552 377 288 459 412 b 536 652 526 585 536 618 b 533 683 536 662 534 672 b 520 707 531 691 531 707 b 487 693 508 708 494 704 b 474 668 482 684 477 677 b 384 490 454 603 418 547 b 253 281 343 419 295 351 b 73 -13 194 181 145 78 b 29 -108 50 -42 29 -72 b 37 -147 29 -121 32 -134 b 50 -186 43 -160 50 -173 b 68 -216 52 -207 56 -215 b 92 -207 73 -216 82 -213 b 288 -166 156 -180 220 -166 b 556 -186 377 -166 467 -180 b 586 -189 566 -187 576 -187 b 616 -186 596 -189 606 -189 b 606 -432 613 -268 612 -350 b 596 -625 603 -495 596 -559 b 598 -670 596 -641 596 -655 b 608 -704 598 -683 596 -700 z', + }, + timeSig5: { + x_min: 19.663871085403297, + x_max: 583, + y_min: -389, + y_max: 389, + ha: 778, + o: 'm 132 -536 b 249 -560 168 -553 209 -559 b 507 -462 351 -560 454 -514 b 677 -183 588 -384 642 -289 b 694 -85 688 -150 694 -117 b 540 138 694 12 642 94 b 422 173 501 154 462 167 b 400 187 408 174 400 177 b 405 202 400 190 402 196 b 428 284 416 228 426 255 b 469 312 431 307 442 312 b 757 372 569 312 662 343 b 840 490 821 392 840 432 b 812 560 840 540 834 560 b 763 546 801 560 785 556 b 757 543 762 546 759 544 b 465 484 665 505 570 484 b 396 484 452 484 425 487 b 353 454 377 482 366 474 b 281 300 323 405 304 351 b 245 164 262 255 245 212 b 246 144 245 158 246 151 b 233 63 249 115 243 89 b 225 35 228 50 225 40 b 264 14 225 22 236 19 b 445 -26 325 7 387 0 b 569 -151 501 -52 547 -89 b 575 -180 573 -161 575 -170 b 527 -275 575 -217 547 -245 b 347 -367 484 -334 419 -367 b 261 -351 318 -367 289 -363 b 95 -300 206 -333 154 -307 b 55 -321 73 -297 65 -302 b 29 -468 29 -367 40 -419 b 56 -505 26 -482 36 -500 b 132 -536 82 -514 108 -524 z', + }, + timeSig6: { + x_min: 20, + x_max: 565, + y_min: -363, + y_max: 363, + ha: 726, + o: 'm 390 -518 b 621 -458 469 -507 549 -494 b 814 -134 753 -390 814 -281 b 652 59 814 -16 750 58 b 580 48 629 59 606 55 b 233 -334 392 -9 276 -138 b 115 -228 181 -314 143 -278 b 98 -160 104 -206 98 -183 b 107 -109 98 -144 101 -127 b 167 37 124 -59 145 -12 b 508 340 236 189 347 292 b 575 353 530 347 553 353 b 648 327 600 353 625 346 b 665 320 654 321 661 320 b 687 336 674 320 681 325 b 703 405 697 359 703 382 b 684 472 703 429 697 451 b 593 523 664 504 631 521 b 576 521 588 523 582 523 b 297 403 472 508 380 465 b 115 177 217 344 164 264 b 29 -121 60 82 29 -17 b 53 -278 29 -173 36 -225 b 226 -497 82 -374 131 -454 b 347 -523 265 -514 305 -523 b 390 -518 361 -523 376 -521 z m 351 -357 b 312 -351 337 -356 320 -363 b 325 -315 304 -340 320 -327 b 543 -120 373 -222 448 -158 b 622 -104 570 -108 596 -102 b 717 -132 655 -104 687 -112 b 740 -167 732 -143 740 -153 b 730 -196 740 -176 737 -184 b 563 -321 690 -258 634 -300 b 359 -357 497 -341 428 -354 z', + }, + timeSig7: { + x_min: 20.3617407597707, + x_max: 592, + y_min: -345, + y_max: 345, + ha: 690, + o: 'm 253 -497 b 318 -485 276 -497 297 -487 b 366 -441 348 -482 360 -468 b 487 -104 390 -323 433 -210 b 835 403 580 82 701 246 b 852 436 847 416 852 428 b 815 467 852 451 840 461 b 762 474 798 471 779 474 b 674 445 732 474 701 465 b 603 410 652 431 628 420 b 383 360 533 379 459 360 b 200 435 315 360 249 382 b 88 494 168 469 131 485 b 66 497 81 495 73 497 b 33 484 52 497 39 492 b 50 436 22 469 39 451 b 295 310 114 360 199 324 b 406 301 331 304 369 301 b 593 324 468 301 530 308 b 585 307 589 314 588 310 b 265 -249 451 137 338 -46 b 207 -442 242 -312 223 -377 b 204 -462 206 -449 204 -456 b 253 -497 204 -487 220 -497 z', + }, + timeSig8: { + x_min: 20, + x_max: 504.15101530718516, + y_min: -428, + y_max: 428, + ha: 856, + o: 'm 265 -616 b 289 -615 274 -616 281 -616 b 710 -271 492 -592 657 -485 b 726 -148 721 -229 727 -187 b 585 108 726 -48 687 42 b 572 127 576 114 573 120 b 576 144 572 132 575 138 b 598 301 590 196 598 249 b 586 413 598 338 593 376 b 356 616 559 531 467 616 b 233 582 317 616 275 606 b 29 233 101 505 29 384 b 104 9 29 153 46 72 b 189 -48 127 -16 160 -27 b 92 -158 141 -73 114 -114 b 37 -343 63 -217 50 -279 b 33 -390 35 -359 33 -374 b 265 -616 33 -524 148 -616 z m 258 105 b 124 148 215 105 167 117 b 96 196 105 163 96 177 b 99 217 96 202 96 209 b 197 384 120 281 151 337 b 350 451 242 429 297 451 b 516 364 412 451 472 422 b 530 331 523 354 530 343 l 530 327 l 530 320 b 468 151 520 261 507 200 b 419 122 455 135 442 125 b 258 105 370 117 320 105 z m 328 -438 b 158 -276 233 -436 160 -359 b 166 -239 158 -264 161 -252 b 230 -157 176 -203 202 -179 b 367 -72 274 -125 320 -98 b 448 -49 396 -56 423 -49 b 562 -118 491 -49 528 -72 b 611 -251 590 -157 611 -199 b 569 -341 611 -288 595 -318 b 328 -438 500 -402 416 -432 z', + }, + timeSig9: { + x_min: 20, + x_max: 494, + y_min: -421, + y_max: 421, + ha: 842, + o: 'm 235 -606 b 361 -564 275 -606 318 -593 b 619 -229 487 -482 566 -366 b 706 127 664 -114 694 4 b 711 233 708 163 711 197 b 700 346 711 271 708 308 b 389 606 658 517 530 606 b 351 605 376 606 364 606 b 56 272 171 586 56 441 b 96 98 56 216 69 156 b 334 -53 144 -3 238 -53 b 544 36 408 -53 484 -24 b 652 176 586 78 622 124 b 631 71 645 141 639 105 b 467 -302 599 -63 562 -196 b 271 -442 412 -364 354 -422 b 225 -448 255 -446 239 -448 b 95 -305 148 -448 98 -395 b 89 -255 95 -288 94 -271 b 73 -233 86 -246 85 -233 b 52 -248 65 -233 56 -239 b 29 -317 42 -271 30 -291 b 49 -448 29 -361 40 -405 b 235 -606 69 -541 144 -606 z m 340 104 b 144 209 264 108 194 141 b 127 258 132 225 127 240 b 137 297 127 271 130 284 b 366 449 184 396 269 449 b 517 408 415 449 467 436 b 595 348 546 392 572 372 b 616 305 608 336 616 321 b 609 281 616 298 613 289 b 340 104 557 184 477 104 z', + }, + timeSigCommon: { + x_min: 20, + x_max: 585, + y_min: -298, + y_max: 294.49658092772603, + ha: 592.496580927726, + o: 'm 444 -405 b 829 -45 626 -346 740 -207 b 842 26 842 -23 842 1 b 821 58 842 39 841 58 b 795 40 811 58 802 48 b 765 3 785 29 773 16 b 469 -223 690 -104 596 -183 b 354 -242 431 -235 392 -242 b 180 -177 292 -242 235 -223 b 135 -99 154 -157 140 -131 b 132 -59 134 -85 132 -72 b 141 7 132 -37 135 -16 b 449 274 189 160 297 243 b 477 278 459 276 468 276 b 546 203 517 278 539 253 b 517 157 550 177 533 166 b 485 143 507 153 497 143 l 482 143 b 467 148 478 143 472 144 b 374 183 438 170 406 181 b 264 118 333 183 292 161 b 238 48 246 92 238 69 b 261 -9 238 29 245 10 b 383 -73 287 -39 337 -73 b 412 -68 392 -73 402 -72 b 631 164 526 -27 586 59 b 649 252 644 193 649 222 b 636 328 649 278 645 304 b 504 423 615 400 579 429 b 242 318 408 415 317 387 b 29 -158 104 190 29 33 b 30 -176 29 -164 29 -170 b 115 -364 42 -246 52 -315 b 307 -429 177 -410 240 -429 b 444 -405 351 -429 397 -420 z', + }, + timeSigCutCommon: { + x_min: 20, + x_max: 695, + y_min: -687.0379164869064, + y_max: 687, + ha: 1374.0379164869064, + o: 'm 564 -989 b 595 -945 585 -991 589 -963 l 599 -922 b 605 -628 600 -824 603 -726 l 609 -399 b 878 -251 706 -363 798 -320 b 996 -85 932 -204 976 -153 b 1001 -63 998 -78 1001 -71 b 989 -46 1001 -56 998 -49 b 978 -43 985 -45 982 -43 b 950 -59 968 -43 959 -49 b 733 -216 894 -132 815 -177 b 611 -259 694 -235 652 -249 b 616 -20 612 -179 615 -99 b 680 29 642 -7 665 9 b 698 43 685 36 690 40 b 870 251 792 82 840 160 b 877 294 874 265 877 279 b 818 410 877 338 855 382 b 683 458 779 442 730 448 b 625 468 664 462 644 465 l 625 514 b 638 958 626 662 636 811 b 626 989 638 979 635 989 b 603 981 621 989 613 986 b 422 840 534 945 481 888 b 412 805 412 832 413 818 b 426 713 410 773 420 743 b 445 678 429 690 435 678 b 474 691 452 678 461 683 b 563 755 503 710 530 732 b 564 724 564 740 564 733 b 559 469 563 639 560 554 b 462 454 526 469 494 464 b 112 143 302 399 199 281 b 33 -94 66 71 45 -10 b 29 -148 30 -112 29 -131 b 105 -351 29 -223 52 -291 b 359 -455 171 -426 258 -451 b 517 -431 409 -451 464 -446 l 539 -422 l 539 -477 b 533 -739 536 -563 539 -651 b 530 -824 531 -768 530 -795 b 546 -948 530 -865 533 -907 b 564 -989 552 -962 543 -989 z m 410 -288 b 193 -197 328 -288 253 -264 b 141 -60 160 -161 141 -108 b 157 6 141 -35 147 -12 b 259 158 189 58 217 112 b 438 291 311 215 364 266 b 528 305 468 301 498 305 b 554 304 537 305 546 304 b 553 212 554 274 554 242 b 426 115 498 199 446 164 b 416 68 419 99 416 84 b 425 12 416 49 420 30 b 474 -39 432 -17 448 -32 b 513 -43 487 -42 498 -43 b 547 -40 524 -43 536 -42 l 543 -272 b 461 -285 516 -278 488 -281 b 410 -288 444 -287 426 -288 z m 694 197 b 668 203 685 197 677 199 b 621 216 654 210 638 215 b 622 294 622 242 622 268 b 706 268 651 287 678 278 b 746 235 721 261 734 249 b 752 222 749 230 752 226 b 743 213 752 219 749 215 b 694 197 727 206 711 197 z', + }, + timeSigPlus: { + x_min: 0, + x_max: 661, + y_min: -358, + y_max: 358, + ha: 716, + o: 'm 605 -516 b 629 -490 624 -516 629 -507 b 628 -475 629 -485 628 -481 b 613 -131 624 -405 616 -174 b 612 -96 612 -114 612 -96 l 647 -98 b 897 -115 730 -99 814 -109 b 940 -89 919 -117 935 -109 b 952 -24 946 -69 952 -46 b 948 9 952 -14 950 -3 b 912 39 942 26 933 37 b 609 60 822 48 609 60 b 616 392 609 60 608 291 b 567 488 619 436 605 467 b 511 516 550 498 531 514 b 498 511 507 516 503 514 b 478 446 475 501 480 469 b 467 150 474 348 469 249 b 465 59 465 121 465 59 l 372 49 b 73 14 272 36 173 24 b 49 13 65 13 56 13 b 0 -33 9 13 0 6 b 60 -141 0 -117 6 -140 b 112 -135 73 -141 91 -140 b 413 -102 213 -125 314 -112 b 464 -98 441 -99 464 -98 l 464 -145 b 477 -456 464 -249 468 -353 b 526 -510 478 -488 491 -507 b 589 -513 546 -511 569 -510 b 605 -516 595 -514 600 -516 z', + }, + timeSigPlusSmall: { + x_min: 0, + x_max: 418, + y_min: -197, + y_max: 199, + ha: 396, + o: 'm 301 -284 b 330 -238 320 -284 324 -255 b 348 -46 350 -176 341 -111 b 374 -20 351 -27 356 -23 b 481 -17 409 -16 445 -17 b 566 -9 510 -17 537 -16 b 602 3 579 -7 602 -16 b 566 29 602 19 582 24 b 526 33 553 32 539 33 b 384 39 478 36 432 39 b 356 62 363 39 356 42 l 356 68 b 359 177 359 104 359 141 l 359 251 b 341 287 359 264 361 285 b 311 255 324 287 314 272 b 310 228 311 246 310 236 l 301 69 b 275 39 301 49 295 39 l 271 39 b 210 40 251 40 230 40 b 167 39 196 40 181 40 b 89 40 141 37 115 40 b 24 30 68 40 46 37 b 0 17 17 27 0 30 l 0 13 b 27 -17 3 0 7 -13 b 91 -22 49 -22 71 -22 b 153 -22 115 -22 137 -20 l 275 -22 b 295 -40 289 -22 295 -27 l 295 -48 b 288 -235 288 -109 287 -171 b 287 -264 288 -243 287 -253 b 301 -284 287 -275 289 -284 z', + }, + timeSigMinus: { + x_min: 0, + x_max: 662, + y_min: -54, + y_max: 55, + ha: 109, + o: 'm 39 -78 b 49 -76 42 -78 45 -76 b 452 -75 94 -75 272 -75 b 861 -76 632 -75 814 -76 b 953 -20 927 -79 953 -66 b 948 27 953 -7 950 9 b 946 37 948 30 948 35 b 896 79 940 63 929 79 b 471 78 827 78 648 78 l 42 78 b 0 37 14 78 0 69 b 23 -66 0 0 17 -32 b 39 -78 24 -75 32 -76 z', + }, + timeSigParensRight: { + x_min: 0, + x_max: 274.26483738379414, + y_min: -722.6326530612245, + y_max: 725, + ha: 1447.6326530612246, + o: 'm 37 -1038 b 69 -1031 48 -1044 59 -1038 b 88 -1015 76 -1027 82 -1021 b 164 -886 120 -976 147 -933 b 333 -351 233 -711 292 -534 b 395 118 366 -204 399 -59 b 389 245 392 144 392 194 b 120 996 369 521 265 766 b 68 1044 99 1030 84 1044 b 19 988 50 1044 36 1024 b 0 922 7 965 0 945 b 20 858 0 901 6 881 b 259 215 141 660 236 449 b 271 -1 266 143 271 71 b 252 -239 271 -82 265 -161 b 148 -667 228 -384 183 -524 b 39 -1009 120 -785 66 -893 b 33 -1031 37 -1017 33 -1024 b 37 -1038 33 -1034 35 -1037 z', + }, + timeSigParensRightSmall: { + x_min: 0, + x_max: 154.4025307335204, + y_min: -422, + y_max: 422, + ha: 844, + o: 'm 43 -608 b 60 -598 48 -608 53 -605 b 117 -511 82 -572 102 -543 b 222 23 193 -350 219 -177 b 213 166 225 55 216 109 b 115 531 206 294 174 416 b 45 603 99 562 76 588 b 30 608 39 606 35 608 b 10 598 23 608 17 603 b 0 546 3 590 0 570 b 23 451 0 507 9 458 b 102 351 66 429 84 390 b 167 42 150 252 167 148 b 163 -49 167 12 166 -19 b 35 -449 151 -192 121 -330 b 14 -504 22 -467 14 -485 b 17 -527 14 -511 16 -520 l 30 -590 b 43 -608 33 -603 37 -608 z', + }, + timeSigParensLeft: { + x_min: 0.5555555555555556, + x_max: 399.6216117372966, + y_min: -728, + y_max: 728, + ha: 1456, + o: 'm 562 -1048 b 573 -1043 566 -1048 570 -1047 b 553 -988 582 -1025 564 -1004 b 472 -884 527 -952 497 -920 b 210 -354 366 -717 275 -541 b 148 -6 170 -240 148 -124 b 160 148 148 45 153 96 b 315 678 189 331 242 508 b 431 901 350 755 380 834 b 459 950 451 926 461 939 b 435 995 459 962 451 972 b 364 1048 405 1034 383 1048 b 305 996 343 1048 325 1028 b 127 624 226 881 174 753 b 1 30 56 432 9 235 b 1 -32 1 9 0 -12 b 180 -629 13 -245 92 -438 b 363 -936 230 -739 298 -835 b 526 -1041 402 -995 448 -1041 b 562 -1048 537 -1040 552 -1048 z', + }, + timeSigParensLeftSmall: { + x_min: 0, + x_max: 173.45497224367904, + y_min: -405, + y_max: 404, + ha: 809, + o: 'm 197 -583 b 222 -553 212 -582 219 -566 b 229 -497 226 -534 229 -516 b 213 -425 229 -472 225 -448 b 102 -177 173 -344 132 -262 b 62 30 78 -111 58 -42 b 91 183 66 82 75 134 b 215 426 118 271 156 356 b 249 552 246 465 252 505 b 230 582 249 563 246 582 b 197 563 219 582 206 576 b 71 356 144 500 105 429 b 0 50 26 259 3 158 b 13 -112 4 -3 7 -58 b 176 -559 29 -275 105 -416 b 196 -583 180 -569 186 -583 z', + }, + noteheadDoubleWhole: { + x_min: -0.4444444444444444, + x_max: 614.1875, + y_min: -223.03296670127517, + y_max: 223, + ha: 446.0329667012752, + o: 'm 35 -321 b 62 -266 58 -318 58 -288 l 62 -194 b 63 50 62 -114 63 -32 b 60 189 63 96 63 143 b 43 300 59 226 60 265 b 29 321 40 308 39 321 l 26 321 b 0 292 13 318 0 310 b 0 248 0 278 -1 262 b 6 147 4 215 6 181 b 4 48 6 114 4 81 b 6 0 4 32 6 16 b 7 -36 7 -12 7 -24 l 7 -52 b 6 -156 7 -86 6 -121 b 19 -275 6 -196 9 -236 b 35 -321 23 -291 16 -323 z m 847 -314 b 871 -288 860 -315 867 -300 b 884 -187 881 -255 886 -222 b 876 115 878 -86 876 14 b 877 255 876 161 876 209 b 868 291 877 268 873 279 b 855 304 867 301 863 304 b 844 301 852 304 848 304 b 822 265 825 292 822 278 b 824 251 822 259 822 255 b 822 170 822 225 822 197 l 822 -20 b 835 -284 827 -86 825 -186 b 847 -314 837 -295 835 -311 z m 757 -291 b 793 -171 796 -255 792 -212 b 795 -49 795 -131 795 -91 b 786 207 795 36 791 121 b 779 240 786 217 783 229 b 766 258 776 246 776 258 b 762 256 765 258 763 256 b 739 236 752 253 740 252 b 733 177 737 216 732 197 b 737 20 737 125 739 73 l 737 -107 b 740 -202 737 -138 739 -170 b 757 -291 740 -230 743 -261 z m 128 -261 b 144 -251 135 -264 141 -256 b 158 -203 156 -236 157 -220 b 161 -137 161 -181 161 -158 b 157 30 161 -81 157 -26 b 158 76 157 45 157 60 l 158 101 b 156 225 158 141 158 183 b 137 253 156 235 154 253 l 134 253 b 109 222 120 251 109 242 b 104 91 108 179 104 134 b 108 -58 104 42 109 -9 b 107 -105 108 -73 108 -89 b 105 -127 107 -112 107 -120 b 118 -245 105 -167 114 -204 b 128 -261 118 -252 121 -259 z m 488 -242 b 693 -79 595 -249 685 -166 l 693 -55 b 690 0 693 -36 691 -17 b 540 187 684 84 621 164 b 449 200 508 196 480 200 b 210 104 363 200 282 163 b 186 56 196 92 186 76 b 207 -82 186 9 192 -37 b 300 -204 225 -132 248 -181 b 488 -242 356 -229 415 -240 z m 490 -88 b 449 -86 477 -88 464 -88 b 287 -56 399 -85 341 -78 b 258 -33 275 -52 258 -48 b 282 -7 258 -20 272 -13 b 458 43 340 23 399 43 b 580 14 497 43 537 35 b 618 -20 606 1 619 -9 b 592 -58 618 -30 609 -42 b 490 -88 562 -82 528 -88 z', + }, + noteheadWhole: { + x_min: 0, + x_max: 380.16649762501584, + y_min: -186.17102907059297, + y_max: 165, + ha: 351.17102907059297, + o: 'm 547 40 b 223 -268 543 -151 367 -259 b 102 -233 180 -271 143 -248 l 62 -216 b 0 -127 22 -197 0 -166 b 6 -91 0 -115 1 -104 b 122 141 33 -9 69 71 b 327 238 170 204 249 238 b 514 158 397 238 467 212 b 547 40 544 125 549 84 z m 248 -107 b 384 -63 295 -102 341 -88 b 426 -23 402 -53 415 -40 b 435 3 432 -14 435 -6 b 413 32 435 14 428 24 b 301 73 376 49 343 73 b 272 69 291 73 282 72 b 121 -35 207 53 157 20 b 111 -58 117 -42 111 -50 b 125 -75 111 -65 115 -71 b 248 -107 164 -89 202 -107 z', + }, + noteheadHalf: { + x_min: 0, + x_max: 334, + y_min: -174, + y_max: 175, + ha: 349, + o: 'm 480 56 b 167 -251 478 -115 331 -251 b 94 -242 143 -251 118 -248 b 9 -141 43 -229 20 -192 b 0 -68 3 -115 0 -91 b 284 249 0 95 127 200 b 304 252 289 251 297 252 b 481 78 374 252 481 170 b 480 56 481 71 481 63 z m 213 -102 b 399 6 274 -81 341 -48 b 402 17 400 7 402 13 b 399 27 402 22 400 26 b 311 94 373 53 353 88 b 292 95 305 95 300 95 b 130 27 230 95 181 55 b 69 -62 98 9 62 -29 b 161 -98 76 -98 128 -91 b 213 -102 174 -101 186 -101 z', + }, + noteheadBlack: { + x_min: 0, + x_max: 334.04644433966797, + y_min: -164, + y_max: 164, + ha: 328, + o: 'm 112 -233 b 141 -236 122 -235 131 -236 b 481 104 279 -236 485 -48 b 403 222 477 141 478 192 b 334 236 382 232 359 236 b 1 -59 180 236 13 59 b 0 -85 1 -68 0 -76 b 112 -233 0 -157 32 -215 z', + }, + noteheadXWhole: { + x_min: 0, + x_max: 506, + y_min: -143.0823320899293, + y_max: 144, + ha: 287.0823320899293, + o: 'm 53 -206 b 219 -163 117 -207 170 -196 b 314 -102 249 -141 282 -122 b 377 -63 334 -89 356 -76 b 514 -161 422 -96 468 -128 b 576 -196 534 -174 552 -196 b 589 -193 580 -196 585 -196 b 688 -174 625 -194 657 -181 b 711 -158 698 -171 711 -173 b 696 -143 711 -151 701 -147 b 503 -9 632 -98 567 -52 l 485 4 b 704 145 559 49 634 95 b 729 164 711 150 729 151 l 729 168 b 696 196 726 183 710 193 b 621 207 671 202 645 207 b 528 177 589 207 557 200 b 373 76 480 140 426 108 b 246 164 330 104 287 132 b 122 206 207 193 167 203 b 66 192 102 207 72 207 b 99 147 58 173 85 158 b 274 14 157 102 215 58 b 16 -164 184 -42 96 -98 b 0 -179 12 -168 0 -170 b 1 -183 0 -180 0 -183 b 26 -204 6 -193 12 -204 b 53 -206 37 -206 49 -206 z m 611 -177 b 376 -9 530 -118 452 -63 l 164 -143 b 104 -164 147 -154 130 -164 b 82 -161 96 -164 89 -164 b 230 -65 137 -125 183 -95 l 347 12 b 327 26 341 16 334 22 l 196 121 b 163 147 184 128 173 137 b 140 173 154 154 140 163 b 143 180 140 176 141 177 b 179 166 154 194 167 174 l 372 27 l 566 153 b 613 171 580 161 596 170 b 635 160 624 171 635 174 b 621 147 635 153 626 150 l 429 24 b 400 6 419 19 409 13 b 569 -117 456 -35 513 -75 b 611 -177 588 -130 608 -143 z', + }, + noteheadXHalf: { + x_min: 0, + x_max: 421, + y_min: -145.51844828189743, + y_max: 151, + ha: 296.51844828189746, + o: 'm 490 -209 b 539 -207 505 -207 521 -207 b 606 -209 560 -207 583 -209 b 598 -196 602 -203 600 -199 l 406 -19 l 540 130 b 547 144 546 135 547 140 b 536 156 547 148 543 153 b 488 192 518 166 503 176 b 416 217 471 209 444 217 b 323 180 380 217 344 204 l 264 115 b 239 138 256 122 248 131 b 33 197 180 196 108 200 b 3 186 23 197 6 193 b 19 154 -1 174 10 163 b 171 12 69 107 120 59 b 19 -157 120 -45 69 -101 b 0 -177 14 -163 0 -166 b 1 -181 0 -179 0 -180 b 39 -203 9 -197 22 -203 l 186 -203 b 197 -202 190 -202 193 -200 l 213 -202 b 262 -180 228 -202 246 -199 l 314 -122 b 490 -209 363 -170 412 -216 z m 435 -148 b 291 -30 379 -112 337 -69 l 213 -118 b 190 -137 207 -125 202 -137 b 145 -111 173 -130 154 -127 b 160 -79 137 -98 151 -88 b 238 16 184 -48 212 -16 b 141 99 204 43 173 72 l 124 117 b 115 132 121 121 115 127 b 118 137 115 134 117 137 b 141 132 127 147 135 138 l 253 36 b 347 150 285 75 315 112 b 370 164 354 160 363 163 b 403 145 382 164 393 156 b 416 127 412 140 416 132 b 405 102 416 118 412 111 l 307 -10 b 413 -105 343 -42 379 -73 b 435 -148 425 -115 436 -125 z', + }, + noteheadXBlack: { + x_min: 0, + x_max: 289, + y_min: -156, + y_max: 157, + ha: 313, + o: 'm 23 -225 b 69 -204 40 -223 56 -219 b 137 -131 92 -180 115 -157 l 209 -50 b 377 -197 264 -101 321 -148 b 403 -210 384 -203 393 -210 l 408 -210 b 416 -192 416 -207 416 -199 l 416 -186 b 403 -148 416 -171 413 -158 b 344 -81 384 -125 367 -101 b 252 -1 312 -55 282 -29 b 377 157 297 49 340 101 b 402 202 387 170 402 187 b 395 217 402 207 400 213 b 376 226 389 223 382 226 b 334 192 360 226 346 204 b 206 42 289 143 248 94 b 96 161 167 81 131 120 b 60 193 86 174 76 189 b 33 206 52 196 42 206 b 22 199 29 206 26 204 b 10 173 14 190 10 181 b 22 147 10 166 14 157 b 148 7 62 98 104 52 b 164 -7 154 1 158 -3 b 10 -189 111 -66 55 -122 b 0 -212 6 -197 0 -203 b 1 -217 0 -213 0 -216 b 23 -225 4 -226 14 -222 z', + }, + noteheadCircleX: { + x_min: 0, + x_max: 344, + y_min: -179, + y_max: 175.12551922594866, + ha: 354.12551922594866, + o: 'm 99 -210 b 236 -258 137 -242 186 -258 b 418 -183 305 -258 374 -230 b 495 33 475 -120 495 -48 b 494 66 495 45 494 55 b 302 252 487 183 405 256 b 181 243 262 249 222 248 b 46 171 128 236 79 219 b 0 19 14 127 0 73 b 99 -210 0 -68 35 -156 z m 245 42 l 124 156 b 200 176 145 166 170 173 b 337 183 245 181 291 184 b 377 176 351 183 364 180 b 245 42 333 131 288 86 z m 392 -99 l 285 3 l 400 121 b 418 154 409 131 418 140 b 465 50 448 130 465 94 b 405 -112 462 -17 439 -73 z m 89 -120 b 48 0 56 -82 48 -42 b 89 112 48 35 59 76 b 109 101 96 111 102 108 l 210 7 l 187 -17 b 89 -120 151 -53 125 -82 z m 176 -183 b 127 -163 158 -179 141 -171 l 252 -32 l 372 -144 b 233 -189 334 -173 285 -189 b 176 -183 215 -189 196 -187 z', + }, + noteheadTriangleUpWhole: { + x_min: 0, + x_max: 366, + y_min: -145, + y_max: 138, + ha: 283, + o: 'm 504 -209 b 527 -199 520 -209 527 -206 b 520 -180 527 -193 524 -187 b 459 -94 501 -151 480 -122 b 279 170 400 -6 341 82 b 242 199 266 190 253 199 b 206 167 230 199 219 189 b 10 -145 140 63 76 -42 b 0 -171 3 -156 0 -164 b 23 -200 0 -183 9 -192 b 55 -209 33 -206 45 -209 z m 202 -161 b 176 -137 183 -163 176 -156 b 187 -62 176 -111 179 -86 b 253 95 206 -10 228 42 b 337 -132 307 24 334 -49 b 311 -161 338 -153 334 -161 b 256 -160 294 -161 275 -160 b 202 -161 238 -160 220 -161 z', + }, + noteheadTriangleUpHalf: { + x_min: 0, + x_max: 341.0833130378007, + y_min: -159, + y_max: 159, + ha: 318, + o: 'm 458 -226 b 478 -229 462 -223 469 -229 b 490 -222 482 -229 487 -228 b 477 -184 495 -207 484 -196 b 281 176 410 -65 346 56 b 238 225 269 194 261 213 b 225 229 232 226 228 228 b 209 215 217 229 213 225 b 4 -153 141 92 73 -30 b 0 -170 1 -158 0 -164 b 12 -189 0 -177 4 -183 b 66 -215 27 -202 43 -213 b 458 -226 194 -217 323 -222 z m 151 -167 b 298 75 204 -89 240 -1 b 301 82 300 76 301 79 l 357 -22 b 344 -43 353 -27 350 -37 b 285 -163 317 -79 312 -127 b 278 -170 282 -166 279 -167 z', + }, + noteheadTriangleUpBlack: { + x_min: 0, + x_max: 346, + y_min: -149, + y_max: 149, + ha: 298, + o: 'm 481 -215 b 498 -209 487 -215 492 -215 b 482 -173 498 -194 488 -184 l 284 173 b 259 202 278 184 269 194 b 229 215 248 210 238 215 b 196 189 216 215 206 206 l 13 -150 b 3 -168 9 -156 6 -163 b 0 -180 1 -173 0 -177 b 12 -197 0 -187 4 -193 b 63 -213 29 -206 45 -213 b 481 -215 203 -213 343 -215 z', + }, + noteheadDiamondWhole: { + x_min: 0, + x_max: 271, + y_min: -132, + y_max: 132, + ha: 264, + o: 'm 230 -177 b 256 -190 240 -186 249 -190 b 281 -173 265 -190 272 -184 b 382 -29 314 -124 347 -76 b 390 -10 387 -22 390 -14 b 376 12 390 -3 386 4 b 173 177 308 66 240 121 b 144 190 166 183 160 190 b 98 153 127 186 112 170 b 13 40 69 115 42 76 b 0 13 4 29 0 20 b 22 -19 0 3 7 -9 b 230 -177 92 -69 163 -122 z m 279 -128 b 261 -122 274 -134 266 -127 l 66 30 b 56 45 59 35 56 39 b 62 56 56 48 59 52 b 122 122 91 101 105 122 b 194 76 138 122 158 107 l 320 -26 b 336 -50 325 -32 336 -35 b 279 -128 318 -75 300 -102 z', + }, + noteheadDiamondHalf: { + x_min: 0, + x_max: 295, + y_min: -148, + y_max: 148, + ha: 296, + o: 'm 228 -207 b 245 -213 235 -210 240 -213 b 264 -203 252 -213 258 -210 b 415 -46 314 -150 364 -98 b 425 -27 420 -40 425 -35 b 416 -10 425 -22 422 -16 b 217 200 350 60 284 131 b 194 213 212 207 204 213 b 170 196 181 213 177 203 b 14 33 118 143 68 86 b 0 7 4 23 0 16 b 17 -20 0 -1 6 -10 b 118 -114 52 -50 82 -85 b 228 -207 156 -144 184 -184 z m 209 -157 b 134 -69 177 -138 141 -115 b 130 -26 131 -55 130 -40 b 215 148 130 42 160 99 b 225 156 217 151 220 156 b 230 153 226 156 228 156 b 323 -26 276 104 321 55 b 298 -75 324 -42 315 -59 b 265 -109 287 -86 276 -99 b 209 -157 245 -125 228 -167 z', + }, + noteheadDiamondBlack: { + x_min: 0, + x_max: 310, + y_min: -146, + y_max: 146, + ha: 292, + o: 'm 266 -210 b 289 -194 278 -209 284 -200 b 406 -76 330 -156 367 -115 b 446 -23 433 -49 446 -36 b 412 29 446 -10 435 3 b 405 36 409 30 408 33 b 252 196 354 89 304 143 b 225 210 243 204 235 210 b 204 202 219 210 212 209 b 10 24 141 141 75 82 b 0 9 4 19 0 14 b 9 -6 0 4 3 0 l 232 -192 b 266 -210 242 -200 256 -204 z', + }, + noteheadSquareWhite: { + x_min: 0, + x_max: 350, + y_min: -131, + y_max: 131, + ha: 262, + o: 'm 468 -189 b 485 -187 474 -189 480 -189 b 500 -176 495 -187 500 -183 b 498 -168 500 -174 498 -171 b 497 -166 498 -167 497 -167 l 498 -164 b 504 -154 503 -163 504 -158 b 503 -138 504 -150 503 -144 l 503 -135 l 503 -94 b 492 66 500 -45 494 10 b 488 135 492 89 488 112 b 484 150 488 141 485 145 b 482 154 482 151 482 153 b 429 189 472 177 456 189 b 53 184 304 186 179 186 l 39 184 b 33 181 36 183 35 183 b 12 160 20 181 12 177 b 0 -109 9 71 4 -19 b 19 -137 0 -125 7 -134 b 23 -151 19 -141 20 -145 b 85 -187 37 -173 55 -187 b 468 -189 212 -187 340 -187 z m 246 -125 l 63 -125 b 66 -111 65 -122 66 -117 b 73 72 69 -50 71 10 l 73 130 b 88 128 78 128 82 128 b 148 130 108 130 128 130 b 271 128 190 130 230 128 l 271 130 l 420 130 b 428 20 425 92 425 56 l 436 -127 l 246 -127 z', + }, + noteheadSquareBlack: { + x_min: 0, + x_max: 342, + y_min: -129.98961937716263, + y_max: 132.44444444444446, + ha: 262.4340638216071, + o: 'm 217 190 b 439 186 304 190 372 190 b 467 180 448 184 458 183 b 492 145 484 176 492 167 b 490 -124 490 56 490 -33 b 488 -141 490 -130 488 -135 b 456 -170 488 -163 478 -168 b 118 -183 344 -176 230 -181 b 29 -184 89 -183 60 -192 b 0 -148 4 -180 0 -168 b 1 29 1 -89 1 -30 l 1 156 b 36 190 3 187 4 190 b 217 190 102 192 168 190 z', + }, + noteheadParenthesis: { + x_min: -70.190112022022, + x_max: 329, + y_min: -196, + y_max: 201, + ha: 397, + o: 'm 344 -279 b 382 -262 361 -288 370 -272 b 405 -233 390 -255 399 -245 b 474 9 455 -158 468 -73 b 416 228 474 78 448 174 b 364 282 403 249 387 271 b 344 289 359 285 350 288 b 331 279 338 289 333 287 b 325 248 328 269 325 258 b 338 225 325 238 328 229 b 412 138 379 207 396 174 b 445 1 433 92 445 45 b 346 -217 445 -81 410 -154 b 336 -252 340 -223 336 -238 b 344 -279 336 -265 338 -276 z m 19 -274 b 35 -282 24 -279 30 -281 b 49 -265 42 -282 46 -275 b 52 -243 50 -256 52 -249 b 36 -210 52 -230 49 -220 b -60 -59 -16 -173 -35 -114 b -73 9 -69 -39 -73 -16 b 33 223 -73 92 -24 189 b 50 265 43 229 50 249 b 33 288 50 278 46 289 b 4 272 23 288 14 275 b -9 261 0 269 -4 265 b -101 23 -58 193 -105 124 b -37 -206 -104 -52 -75 -130 b 19 -274 -23 -232 -6 -255 z', + }, + noteheadParenthesisRight: { + x_min: -30, + x_max: 82, + y_min: -199.08429092881173, + y_max: 206, + ha: 405.0842909288117, + o: 'm -17 -282 b 24 -264 -6 -297 12 -272 b 60 -219 40 -253 52 -236 b 117 1 96 -150 112 -75 b 118 16 118 6 118 12 b 109 73 118 36 112 55 b 4 279 99 154 68 226 b -23 297 -4 287 -13 297 b -37 289 -27 297 -32 294 b -43 266 -42 285 -43 276 b -32 225 -43 251 -37 229 b 84 -7 48 170 84 82 b 32 -184 84 -69 65 -132 b -10 -222 22 -200 4 -209 b -24 -258 -20 -232 -24 -245 b -17 -282 -24 -266 -22 -276 z', + }, + noteheadParenthesisLeft: { + x_min: 0, + x_max: 106, + y_min: -197, + y_max: 197, + ha: 394, + o: 'm 134 -284 b 138 -281 135 -284 137 -284 b 145 -268 144 -278 145 -274 l 144 -253 b 107 -180 138 -225 121 -204 b 42 13 71 -120 42 -56 b 49 73 42 32 43 52 b 137 210 62 128 95 171 b 153 255 147 219 153 239 b 145 278 153 265 151 274 b 130 284 140 281 135 284 b 98 259 117 284 108 268 b 0 37 35 203 1 131 b 118 -268 9 -69 53 -173 b 134 -284 121 -274 127 -284 z', + }, + augmentationDot: { + x_min: 0, + x_max: 96, + y_min: -57, + y_max: 57, + ha: 114, + o: 'm 13 -82 b 16 -81 14 -82 14 -82 b 105 -73 46 -76 75 -76 b 131 -48 121 -72 131 -60 b 138 26 134 -24 138 0 b 137 48 138 33 138 40 b 108 82 134 71 125 82 b 95 81 104 82 99 82 b 33 71 75 78 53 75 b 4 46 20 68 6 62 b 0 -66 1 9 0 -29 b 13 -82 0 -73 1 -82 z', + }, + tremolo1: { + x_min: -158, + x_max: 156.19381479578487, + y_min: -88, + y_max: 88, + ha: 176, + o: 'm -206 -127 b -194 -125 -203 -127 -199 -127 b 173 -36 -72 -94 50 -65 b 220 16 202 -29 215 -12 b 225 50 223 30 225 45 b 216 107 226 76 222 91 b 194 127 210 120 204 127 b 183 124 192 127 189 127 l -192 33 b -226 -9 -213 27 -222 14 b -228 -32 -226 -16 -228 -23 b -222 -108 -228 -58 -222 -82 b -206 -127 -222 -120 -217 -127 z', + }, + flag8thUp: { + x_min: 0, + x_max: 261, + y_min: -819, + y_max: 0, + ha: 819, + o: 'm 265 -1171 b 351 -1035 301 -1130 336 -1087 b 376 -867 369 -979 376 -923 b 367 -755 376 -829 373 -792 b 233 -422 350 -632 311 -520 b 131 -291 199 -379 166 -334 b 65 -125 91 -239 66 -192 b 62 -75 65 -112 62 -91 b 42 0 62 -49 52 -24 l 35 0 b 0 -63 6 -13 0 -36 l 0 -144 b 96 -445 0 -255 29 -356 b 177 -547 124 -478 150 -514 b 308 -831 246 -629 298 -721 b 317 -890 310 -851 317 -871 b 311 -919 317 -900 315 -910 b 256 -1005 297 -950 282 -984 b 228 -1068 233 -1024 228 -1045 b 230 -1106 228 -1080 229 -1093 b 240 -1162 232 -1125 239 -1143 b 251 -1179 242 -1174 246 -1179 b 265 -1171 255 -1179 259 -1176 z', + }, + flag8thDown: { + x_min: 0, + x_max: 261, + y_min: 0, + y_max: 819, + ha: 819, + o: 'm 265 1171 b 251 1179 259 1176 255 1179 b 240 1162 246 1179 242 1174 b 230 1106 239 1143 232 1125 b 228 1068 229 1093 228 1080 b 256 1005 228 1045 233 1024 b 311 919 282 984 297 950 b 317 890 315 910 317 900 b 308 831 317 871 310 851 b 177 547 298 721 246 629 b 96 445 150 514 124 478 b 0 144 29 356 0 255 l 0 63 b 35 0 0 36 6 13 l 42 0 b 62 75 52 24 62 49 b 59 117 62 91 59 104 b 131 291 60 183 91 239 b 233 422 166 334 199 379 b 367 755 311 520 350 632 b 376 867 373 792 376 829 b 351 1035 376 923 369 979 b 265 1171 336 1087 301 1130 z', + }, + flag16thUp: { + x_min: 0, + x_max: 327.1591498636094, + y_min: -819.3972596310256, + y_max: 0, + ha: 819.3972596310256, + o: 'm 415 -1179 b 435 -1168 423 -1182 429 -1174 b 451 -1138 442 -1159 446 -1149 b 465 -1020 464 -1102 467 -1064 b 461 -962 464 -1004 464 -984 b 471 -821 467 -916 472 -870 b 465 -721 472 -791 467 -756 b 415 -520 459 -651 441 -585 b 200 -245 370 -408 284 -327 b 96 -114 160 -206 118 -168 b 75 -24 84 -85 85 -53 b 59 0 72 -16 72 0 b 53 -1 58 0 56 -1 b 27 -32 40 -6 27 -10 b 29 -68 27 -43 29 -55 b 10 -79 20 -69 13 -72 b 1 -109 6 -89 1 -99 b 0 -170 0 -130 0 -148 b 35 -410 0 -252 12 -333 b 258 -793 76 -557 156 -681 b 409 -1158 350 -896 410 -1014 b 415 -1179 409 -1165 405 -1175 z m 413 -816 b 331 -681 392 -769 364 -723 b 145 -420 266 -596 189 -521 b 86 -281 125 -374 102 -330 b 156 -370 105 -312 128 -343 b 318 -539 210 -425 269 -478 b 413 -816 383 -621 420 -713 z', + }, + flag16thDown: { + x_min: 0, + x_max: 327.1591498636094, + y_min: 0, + y_max: 819, + ha: 819, + o: 'm 59 0 b 75 24 72 0 72 16 b 96 114 85 53 84 85 b 200 245 118 168 160 206 b 415 520 284 327 370 408 b 465 721 441 585 459 651 b 471 821 467 756 472 791 b 461 962 472 870 467 916 b 465 1020 464 984 464 1004 b 451 1138 467 1064 464 1102 b 435 1168 446 1149 442 1159 b 418 1179 431 1172 425 1179 l 415 1179 b 408 1169 409 1176 408 1174 b 409 1158 408 1165 409 1161 b 258 793 410 1014 350 896 b 35 410 156 681 76 557 b 0 170 12 333 0 252 l 0 88 b 29 7 0 71 6 23 b 59 0 33 4 58 0 z m 86 281 b 145 420 102 330 125 374 b 331 681 189 521 266 596 b 413 816 364 723 392 769 b 415 791 413 808 415 799 b 318 539 415 698 377 613 b 156 370 269 478 210 425 b 86 281 128 343 105 312 z', + }, + flag32ndUp: { + x_min: -0.19862981551275186, + x_max: 268.0942440943661, + y_min: -849.4710740978672, + y_max: 149.0769891455102, + ha: 998.5480632433774, + o: 'm 323 -1223 b 351 -1198 337 -1227 344 -1210 b 359 -1184 354 -1194 356 -1188 b 386 -999 377 -1122 387 -1060 b 341 -783 386 -927 372 -855 b 330 -736 334 -769 330 -753 b 333 -708 330 -727 330 -717 b 344 -621 340 -678 344 -649 b 341 -579 344 -608 343 -593 b 328 -500 338 -553 328 -526 b 331 -475 328 -491 328 -484 b 347 -370 343 -438 348 -402 b 151 27 348 -212 288 -56 b 53 176 98 59 50 102 b 45 197 53 183 48 192 b 33 215 40 203 40 216 l 30 215 b 6 194 22 212 9 209 b 0 120 3 170 -1 145 b 0 -43 4 65 0 13 b 0 -98 0 -60 1 -79 b 4 -276 0 -157 6 -216 b 7 -456 4 -337 7 -397 b 66 -638 7 -523 22 -585 b 158 -724 94 -671 127 -697 b 318 -1011 246 -801 295 -899 b 321 -1044 321 -1021 321 -1032 b 312 -1152 321 -1080 312 -1116 b 317 -1192 312 -1165 314 -1179 b 323 -1223 320 -1202 311 -1220 z m 285 -376 b 121 -180 249 -289 173 -245 b 91 -105 104 -158 92 -135 b 288 -354 181 -144 288 -269 b 285 -376 288 -363 287 -370 z m 275 -657 b 111 -492 226 -589 163 -547 b 65 -376 78 -456 66 -418 b 71 -323 65 -360 68 -341 b 275 -657 164 -418 265 -504 z', + }, + flag32ndDown: { + x_min: -2.800802874905624, + x_max: 268.09424409436605, + y_min: -169.07698914551014, + y_max: 829.4710740978672, + ha: 998.5480632433773, + o: 'm 323 1194 b 317 1164 311 1191 320 1174 b 312 1123 314 1151 312 1136 b 321 1015 312 1087 321 1051 b 318 982 321 1004 321 992 b 158 696 295 870 246 772 b 66 609 127 668 94 642 b 7 428 22 556 7 494 b 4 248 7 369 4 308 b -1 78 6 187 -10 137 b 0 14 0 59 0 32 l 0 -148 b 6 -223 0 -174 3 -199 b 30 -243 9 -238 22 -240 l 33 -243 b 45 -226 40 -245 40 -232 b 53 -204 48 -220 53 -212 b 151 -56 50 -131 98 -88 b 347 341 288 27 348 183 b 331 446 348 373 343 409 b 328 471 328 455 328 462 b 341 550 328 497 338 524 b 344 592 343 564 344 579 b 333 680 344 621 340 649 b 330 707 330 688 330 698 b 341 755 330 724 334 740 b 386 971 372 827 386 899 b 359 1155 387 1031 377 1093 b 351 1169 356 1159 354 1165 b 323 1194 344 1181 337 1198 z m 275 628 b 71 294 265 475 164 389 b 65 347 68 312 65 331 b 111 464 66 389 78 428 b 275 628 163 518 226 560 z m 285 347 b 288 325 287 341 288 334 b 91 76 288 240 181 115 b 121 151 92 107 104 130 b 285 347 173 216 249 261 z', + }, + flag64thUp: { + x_min: -4, + x_max: 282, + y_min: -823.5430338167067, + y_max: 347, + ha: 1170.5430338167066, + o: 'm 350 -1185 b 380 -1162 364 -1189 374 -1175 b 406 -1022 399 -1119 406 -1071 b 359 -798 406 -945 384 -871 b 348 -756 353 -785 348 -772 b 350 -744 348 -753 350 -749 b 363 -621 356 -704 363 -664 b 360 -580 363 -608 363 -593 b 359 -560 359 -573 359 -567 b 373 -490 359 -536 366 -513 b 393 -346 386 -444 393 -395 b 387 -269 393 -320 390 -294 b 348 -127 382 -219 348 -173 b 351 -104 348 -120 348 -111 b 353 -65 351 -91 353 -78 b 341 37 353 -26 348 6 b 226 215 323 108 278 164 b 86 336 181 258 127 288 b 62 395 72 353 62 370 b 42 481 62 423 55 454 b 27 500 37 488 36 500 b 24 498 26 500 26 500 b -1 480 14 497 1 492 b -6 444 -4 467 -6 455 l -6 435 b -1 341 -1 403 -1 372 l -1 266 b 6 156 -1 230 0 193 b 13 35 12 117 13 75 l 13 -35 b 14 -85 13 -52 14 -68 b 29 -276 19 -150 33 -213 b 20 -448 24 -334 20 -392 b 24 -534 20 -477 22 -505 b 114 -708 30 -605 59 -664 b 197 -780 143 -732 171 -755 b 344 -1153 301 -884 341 -1011 b 343 -1172 344 -1159 343 -1166 b 350 -1185 343 -1176 344 -1182 z m 287 -88 b 62 193 186 -17 79 48 b 229 52 121 144 174 98 b 289 -33 256 29 274 -3 b 295 -56 294 -42 295 -49 b 287 -88 295 -66 292 -76 z m 298 -410 b 118 -235 238 -351 176 -295 b 76 -88 82 -197 78 -147 b 268 -252 137 -153 203 -202 b 330 -360 304 -279 330 -315 b 323 -402 330 -373 327 -387 b 311 -418 318 -413 315 -418 b 298 -410 307 -418 302 -415 z m 300 -691 b 117 -508 243 -616 168 -575 b 82 -408 94 -480 82 -448 b 84 -379 82 -397 82 -387 b 259 -553 135 -451 206 -492 b 301 -667 287 -583 301 -619 b 300 -691 301 -674 301 -683 z', + }, + flag64thDown: { + x_min: -5, + x_max: 281, + y_min: -375, + y_max: 795.5430338167066, + ha: 1170.5430338167066, + o: 'm 348 1145 b 341 1132 343 1142 341 1136 b 343 1113 341 1126 343 1119 b 196 740 340 971 300 844 b 112 668 170 714 141 691 b 23 494 58 624 29 564 b 19 408 20 465 19 436 b 27 236 19 351 23 294 b 13 45 32 173 17 109 b 12 -6 13 27 12 12 l 12 -75 b 4 -196 12 -115 10 -157 b -3 -307 -1 -233 -3 -271 l -3 -382 b -7 -475 -3 -412 -3 -444 l -7 -484 b -3 -520 -7 -495 -6 -507 b 23 -539 0 -533 13 -537 b 26 -540 24 -540 24 -540 b 40 -521 35 -540 36 -528 b 60 -435 53 -494 60 -464 b 85 -376 60 -410 71 -393 b 225 -255 125 -328 180 -298 b 340 -78 276 -204 321 -148 b 351 24 347 -46 351 -14 b 350 63 351 37 350 50 b 347 86 347 71 347 79 b 386 229 347 132 380 179 b 392 305 389 253 392 279 b 372 449 392 354 384 403 b 357 520 364 472 357 495 b 359 540 357 527 357 533 b 361 580 361 553 361 567 b 348 704 361 624 354 664 b 347 716 348 708 347 713 b 357 757 347 732 351 744 b 405 982 383 831 405 904 b 379 1122 405 1031 397 1079 b 348 1145 373 1135 363 1149 z m 298 651 b 300 626 300 642 300 634 b 258 513 300 579 285 543 b 82 338 204 452 134 410 b 81 367 81 347 81 357 b 115 468 81 408 92 439 b 298 651 167 534 242 576 z m 297 370 b 310 377 301 374 305 377 b 321 361 314 377 317 373 b 328 320 325 347 328 333 b 266 212 328 275 302 239 b 75 48 202 161 135 112 b 117 194 76 107 81 157 b 297 370 174 255 236 311 z m 285 48 b 294 16 291 36 294 26 b 288 -7 294 9 292 1 b 228 -92 272 -37 255 -69 b 60 -233 173 -138 120 -184 b 285 48 78 -88 184 -23 z', + }, + flag128thUp: { + x_min: 0, + x_max: 252, + y_min: -804, + y_max: 530, + ha: 1334, + o: 'm 298 -1158 b 328 -1126 312 -1158 320 -1139 b 330 -1116 330 -1123 330 -1119 b 347 -996 343 -1076 347 -1037 b 328 -837 347 -943 338 -890 b 320 -778 324 -816 320 -798 b 330 -733 320 -763 323 -749 b 340 -665 338 -714 337 -688 b 341 -645 340 -660 341 -652 b 333 -534 341 -609 333 -572 b 343 -471 333 -513 334 -492 b 361 -366 356 -436 361 -402 b 331 -202 361 -311 348 -256 b 328 -187 330 -197 328 -193 b 331 -179 328 -184 328 -181 b 363 -55 353 -137 363 -96 b 337 79 363 -12 351 33 b 327 114 333 92 327 104 b 344 144 327 124 331 132 b 359 174 353 150 357 163 b 361 228 360 193 361 210 b 243 517 361 337 325 435 b 147 596 213 546 179 569 b 75 708 111 626 75 655 b 62 744 75 723 68 733 b 50 763 58 752 58 763 b 46 762 49 763 48 762 b 17 742 36 757 22 757 b 0 697 14 726 0 711 b 1 595 0 662 3 631 b 0 469 0 552 0 511 b 1 429 0 456 0 442 b 22 289 6 382 22 337 b 24 128 22 238 24 184 b 22 66 24 108 23 86 b 19 -19 20 37 19 10 b 20 -132 19 -56 20 -95 b 13 -276 20 -180 19 -229 b 9 -359 10 -304 9 -330 b 12 -487 9 -402 12 -445 b 56 -582 12 -526 29 -554 b 197 -742 107 -632 160 -681 b 288 -1100 265 -851 276 -976 b 288 -1122 288 -1107 287 -1115 b 287 -1145 289 -1129 287 -1138 b 298 -1158 287 -1153 288 -1158 z m 304 150 b 75 475 229 256 112 334 b 304 150 233 357 305 287 z m 271 -73 b 127 72 233 -14 179 26 b 81 167 96 98 81 127 b 84 194 81 176 82 184 b 271 -73 148 102 242 39 z m 279 -396 b 132 -223 233 -330 180 -279 b 81 -112 104 -192 81 -156 b 82 -91 81 -105 81 -98 b 279 -396 167 -125 269 -281 z m 249 -609 b 69 -357 197 -520 88 -471 b 249 -609 131 -441 229 -498 z', + }, + flag128thDown: { + x_min: -0.8888888888888888, + x_max: 252, + y_min: -580, + y_max: 754, + ha: 1334, + o: 'm 298 1086 b 287 1073 288 1086 287 1081 b 288 1050 287 1066 289 1057 b 288 1028 287 1043 288 1035 b 197 670 276 904 265 779 b 56 510 160 609 107 560 b 12 415 29 482 12 454 b 9 287 12 373 9 330 b 13 204 9 258 10 232 b 20 60 19 157 20 108 b 19 -53 20 23 19 -16 b 22 -138 19 -82 20 -109 b 24 -200 23 -158 24 -180 b 22 -361 24 -256 22 -310 b 1 -501 22 -409 6 -454 b 0 -541 0 -514 0 -528 b 0 -667 0 -583 -3 -624 b 0 -809 0 -675 -3 -791 b 46 -834 4 -825 36 -829 b 50 -835 48 -834 49 -835 b 62 -816 58 -835 58 -824 b 75 -780 68 -805 75 -795 b 147 -668 75 -727 111 -698 b 243 -589 179 -641 213 -618 b 361 -300 325 -507 361 -409 b 359 -246 361 -282 360 -265 b 344 -216 357 -235 353 -222 b 327 -186 331 -204 327 -196 b 337 -151 327 -176 333 -164 b 363 -17 351 -105 363 -60 b 331 107 363 24 353 65 b 328 115 328 109 328 112 b 331 130 328 121 330 125 b 361 294 348 184 361 239 b 343 399 361 330 356 364 b 333 462 334 420 333 441 b 341 573 333 500 341 537 b 340 593 341 580 340 588 b 330 661 337 616 338 642 b 320 706 323 677 320 691 b 328 765 320 726 324 744 b 347 924 338 818 347 871 b 330 1044 347 965 343 1004 b 328 1054 330 1047 330 1051 b 298 1086 320 1067 312 1086 z m 249 537 b 69 285 229 426 131 369 b 249 537 88 399 197 448 z m 279 324 b 82 19 269 209 167 53 b 81 40 81 26 81 33 b 132 151 81 84 104 120 b 279 324 180 207 233 258 z m 271 1 b 84 -266 242 -111 148 -174 b 81 -239 82 -256 81 -248 b 127 -144 81 -199 96 -170 b 271 1 179 -98 233 -58 z m 304 -222 b 75 -547 305 -359 233 -429 b 304 -222 112 -406 229 -328 z', + }, + accidentalFlat: { + x_min: 1, + x_max: 209, + y_min: -208, + y_max: 472, + ha: 680, + o: 'm 29 -300 b 46 -289 33 -300 39 -297 b 107 -243 65 -274 86 -258 b 301 127 233 -153 301 -30 b 298 186 301 147 301 166 b 190 297 291 256 251 297 b 147 289 177 297 163 294 b 86 265 127 284 107 274 l 85 264 l 85 301 b 91 465 85 356 88 410 b 94 559 91 497 94 527 b 84 651 94 589 91 621 b 66 680 81 661 81 680 l 65 680 b 37 645 49 678 37 665 b 33 523 36 605 32 563 l 33 478 b 26 223 33 393 29 308 b 1 -141 22 101 1 -19 b 17 -287 1 -189 4 -239 b 29 -300 20 -295 23 -300 z m 68 -105 b 76 12 71 -68 72 -29 b 81 107 79 43 81 75 l 86 109 b 171 135 114 121 141 135 b 204 128 181 135 193 132 b 238 92 228 120 239 108 b 230 63 238 84 236 75 b 68 -105 193 -10 132 -59 z', + }, + accidentalNatural: { + x_min: 0, + x_max: 213.5, + y_min: -456, + y_max: 462, + ha: 918, + o: 'm 255 -657 b 281 -624 271 -657 275 -636 b 285 -599 282 -615 285 -608 b 292 -300 288 -500 289 -400 b 289 -161 292 -253 289 -207 b 300 128 292 -65 297 32 b 304 168 300 128 302 150 l 304 173 l 305 190 l 305 199 l 307 225 b 304 259 307 229 310 246 b 272 298 297 274 302 305 b 63 266 204 279 134 272 b 72 514 68 348 72 432 b 71 595 72 541 72 567 b 56 665 71 619 66 642 b 17 579 9 651 17 608 b 3 144 19 433 7 289 b 0 -7 1 94 0 43 b 3 -134 0 -50 1 -92 b 7 -219 3 -163 7 -192 b 35 -251 7 -243 17 -251 b 49 -249 39 -251 43 -251 l 223 -223 l 230 -222 l 230 -359 b 223 -516 230 -410 223 -464 b 236 -619 223 -550 226 -585 b 255 -657 240 -634 236 -657 z m 58 -63 b 55 81 56 -14 53 33 l 56 99 b 85 99 65 99 75 98 b 232 108 134 104 183 107 l 240 109 l 236 66 b 232 -48 235 29 232 -10 b 58 -81 174 -63 115 -73 z', + }, + accidentalSharp: { + x_min: -22, + x_max: 390, + y_min: -384, + y_max: 383, + ha: 767, + o: 'm 202 -553 b 219 -526 213 -552 216 -536 b 226 -471 225 -507 226 -488 b 225 -425 226 -455 225 -441 b 226 -392 225 -415 225 -402 b 233 -305 229 -363 232 -334 l 297 -292 b 331 -469 300 -353 311 -412 b 347 -485 333 -477 338 -485 b 363 -469 356 -487 359 -477 b 374 -418 373 -454 374 -435 b 376 -382 376 -405 376 -393 b 372 -276 376 -347 373 -311 l 455 -259 b 550 -156 534 -243 544 -232 b 550 -109 550 -137 552 -124 b 526 -78 549 -91 541 -78 l 523 -78 b 507 -79 517 -78 513 -78 b 403 -101 474 -88 438 -95 l 379 -105 b 382 -42 380 -85 380 -63 b 384 96 383 4 384 50 b 503 131 425 107 464 118 b 549 173 524 138 543 150 b 562 249 554 199 562 223 b 554 294 562 264 560 279 b 536 315 549 308 544 315 l 533 315 b 517 312 528 315 523 315 b 382 266 472 294 428 279 l 377 344 b 359 531 374 406 372 469 b 348 552 356 539 357 552 l 347 552 l 343 552 b 315 528 331 549 317 544 l 315 501 b 320 249 315 416 318 333 l 243 232 b 239 361 243 275 242 318 b 226 425 238 383 238 403 b 199 359 194 409 199 382 b 193 223 196 312 194 268 b 72 202 153 215 112 209 b 4 118 13 192 4 183 b 10 66 0 102 12 84 b 33 29 7 39 14 30 b 48 32 37 29 42 30 b 187 55 95 39 141 46 l 183 -75 b 176 -145 181 -99 179 -122 b 16 -179 122 -156 69 -166 b -32 -232 -14 -186 -32 -197 b -17 -331 -32 -266 -19 -298 b -1 -356 -17 -347 -13 -354 b 12 -353 1 -356 6 -354 b 167 -320 63 -341 115 -331 b 166 -377 166 -338 166 -357 b 189 -526 166 -428 171 -477 b 202 -553 192 -536 189 -553 z m 240 -132 b 243 -37 242 -101 242 -69 b 245 65 245 -3 245 30 b 315 79 269 69 292 73 b 301 -120 308 13 305 -53 z', + }, + accidentalDoubleSharp: { + x_min: 0, + x_max: 287, + y_min: -159, + y_max: 159, + ha: 318, + o: 'm 84 -229 b 107 -216 91 -229 98 -225 b 200 -125 138 -186 167 -154 b 232 -95 212 -115 222 -105 b 347 -189 271 -125 310 -157 b 370 -200 356 -196 363 -200 b 396 -179 380 -200 389 -192 b 412 -102 410 -154 406 -125 b 377 -27 410 -69 400 -46 l 325 14 b 402 91 350 42 374 68 b 413 127 410 96 413 107 b 382 200 409 148 397 176 b 350 229 370 220 360 229 b 314 210 340 229 328 223 b 274 174 300 199 285 187 b 212 104 252 151 232 128 b 92 187 173 132 132 161 b 78 193 86 192 82 193 b 68 190 75 193 72 193 b 48 179 62 186 53 187 b 40 137 43 168 40 154 b 81 16 40 92 56 32 b 107 -3 89 10 98 4 b 14 -94 76 -32 45 -62 b 0 -124 6 -102 0 -114 b 12 -154 0 -134 3 -144 b 62 -215 26 -176 48 -193 b 84 -229 69 -225 76 -229 z', + }, + accidentalDoubleFlat: { + x_min: 0, + x_max: 359, + y_min: -220, + y_max: 446, + ha: 666, + o: 'm 43 -317 b 72 -301 55 -317 63 -310 b 160 -186 108 -268 134 -226 b 236 -60 186 -145 212 -102 b 233 -131 235 -85 233 -108 b 239 -220 233 -161 235 -190 b 259 -246 240 -233 239 -240 b 301 -228 284 -252 291 -238 b 465 -7 369 -163 416 -85 b 517 173 500 48 517 108 b 451 307 517 229 505 284 b 409 315 436 312 422 315 b 331 287 382 315 356 305 b 311 274 324 282 320 274 l 310 274 l 310 566 b 305 621 310 585 312 603 b 294 642 301 628 305 642 l 292 642 b 264 622 282 641 266 636 b 253 575 259 606 256 590 b 246 418 248 523 246 471 b 248 243 246 360 248 302 l 248 187 b 164 238 220 225 193 238 b 85 213 140 238 112 226 b 84 229 85 220 84 225 b 86 315 85 258 86 287 b 81 528 86 386 82 458 b 71 582 81 547 78 566 b 56 603 66 590 68 603 l 53 603 b 23 580 40 600 26 598 b 19 537 20 566 19 552 b 20 514 19 530 19 521 b 26 390 24 472 26 432 b 14 66 26 282 16 174 b 0 -168 13 -12 0 -91 b 12 -279 0 -206 3 -242 b 30 -314 16 -294 14 -308 b 43 -317 35 -317 39 -317 z m 301 -72 b 302 7 302 -45 302 -19 l 302 86 b 351 158 304 121 321 145 b 383 166 361 163 373 166 b 435 143 402 166 419 157 b 445 127 441 138 445 132 b 441 114 445 122 444 118 b 301 -72 397 49 354 -14 z m 75 -147 b 73 30 75 -86 75 -29 b 118 82 73 62 92 76 b 132 84 124 84 128 84 b 190 52 156 84 174 69 b 193 40 192 49 193 45 b 192 33 193 37 193 35 b 75 -147 157 -30 125 -95 z', + }, + accidentalParensLeft: { + x_min: 0, + x_max: 130.18934911242604, + y_min: -270, + y_max: 267.6082500723851, + ha: 537.6082500723851, + o: 'm 107 -389 b 127 -374 114 -389 120 -384 b 141 -347 132 -367 137 -357 b 151 -294 148 -330 151 -311 b 122 -207 151 -265 141 -236 b 63 -65 94 -164 72 -117 b 59 -10 60 -46 59 -27 b 145 223 59 78 94 153 b 187 354 176 262 189 305 b 177 384 187 364 190 380 b 143 373 166 387 153 383 b 124 354 137 367 130 361 b 0 -35 33 240 0 108 l 0 -92 b 85 -372 4 -193 27 -287 b 107 -389 92 -383 99 -389 z', + }, + accidentalParensRight: { + x_min: -0.4444444444444445, + x_max: 139, + y_min: -275, + y_max: 277, + ha: 552, + o: 'm 58 -396 b 96 -354 75 -396 85 -370 b 200 13 168 -238 200 -111 b 153 268 200 109 184 190 b 49 392 131 320 101 364 b 26 399 40 397 33 399 b 0 366 10 399 0 387 b 0 318 -1 350 0 334 l 0 291 b 27 238 -3 266 7 253 b 143 9 105 180 143 98 b 141 -20 143 -1 143 -10 b 63 -225 135 -92 108 -164 b 36 -307 45 -251 36 -278 b 40 -344 36 -320 37 -331 b 42 -356 42 -347 42 -351 b 58 -396 42 -374 37 -396 z', + }, + accidentalQuarterToneFlatStein: { + x_min: 0, + x_max: 208, + y_min: -240, + y_max: 440, + ha: 680, + o: 'm 272 -346 b 284 -333 278 -346 281 -341 b 300 -187 297 -285 300 -235 b 275 177 300 -65 279 55 b 268 432 272 262 268 347 l 268 477 b 264 599 269 517 265 559 b 236 634 264 619 252 632 l 235 634 b 217 605 220 634 220 615 b 207 513 210 575 207 543 b 210 419 207 481 210 451 b 216 255 213 364 216 310 l 216 217 l 215 219 b 154 243 194 228 174 238 b 111 251 138 248 124 251 b 3 140 50 251 10 210 b 0 81 0 120 0 101 b 194 -289 0 -76 68 -199 b 255 -336 215 -304 236 -320 b 272 -346 262 -343 268 -346 z m 233 -151 b 71 17 168 -105 108 -56 b 63 46 65 29 63 37 b 96 82 62 62 73 73 b 130 89 108 86 120 89 b 215 63 160 89 187 75 l 220 60 b 225 -35 220 29 222 -3 b 233 -151 229 -75 230 -114 z', + }, + accidentalThreeQuarterTonesFlatZimmermann: { + x_min: 0, + x_max: 422, + y_min: -240, + y_max: 440, + ha: 680, + o: 'm 272 -346 b 284 -333 278 -346 281 -341 b 300 -187 297 -285 300 -235 b 275 177 300 -65 279 55 b 268 432 272 262 268 347 l 268 477 b 264 599 269 517 265 559 b 236 634 264 619 252 632 l 235 634 b 217 605 220 634 220 615 b 207 513 210 575 207 543 b 210 419 207 481 210 451 b 216 255 213 364 216 310 l 216 217 l 215 219 b 154 243 194 228 174 238 b 111 251 138 248 124 251 b 3 140 50 251 10 210 b 0 81 0 120 0 101 b 194 -289 0 -76 68 -199 b 255 -336 215 -304 236 -320 b 272 -346 262 -343 268 -346 z m 336 -346 b 353 -336 340 -346 346 -343 b 413 -289 372 -320 393 -304 b 608 81 540 -199 608 -76 b 605 140 608 101 608 120 b 497 251 598 210 557 251 b 454 243 484 251 469 248 b 393 219 433 238 413 228 l 392 217 l 392 255 b 397 419 392 310 395 364 b 400 513 397 451 400 481 b 390 605 400 543 397 575 b 373 634 387 615 387 634 l 372 634 b 344 599 356 632 344 619 b 340 477 343 559 338 517 l 340 432 b 333 177 340 347 336 262 b 308 -187 328 55 308 -65 b 324 -333 308 -235 311 -285 b 336 -346 327 -341 330 -346 z m 233 -151 b 71 17 168 -105 108 -56 b 63 46 65 29 63 37 b 96 82 62 62 73 73 b 130 89 108 86 120 89 b 215 63 160 89 187 75 l 220 60 b 225 -35 220 29 222 -3 b 233 -151 229 -75 230 -114 z m 374 -151 b 383 -35 377 -114 379 -75 b 387 60 386 -3 387 29 l 393 63 b 478 89 420 75 448 89 b 511 82 488 89 500 86 b 544 46 534 73 546 62 b 537 17 544 37 543 29 b 374 -151 500 -56 439 -105 z', + }, + accidentalQuarterToneSharpStein: { + x_min: 0, + x_max: 300, + y_min: -338, + y_max: 351, + ha: 689, + o: 'm 194 -487 b 225 -432 215 -469 223 -452 b 238 -232 229 -366 236 -298 b 377 -199 285 -220 331 -209 b 418 -164 397 -193 410 -181 b 432 -88 428 -138 432 -114 b 412 -42 432 -55 428 -42 b 389 -46 406 -42 399 -43 l 235 -85 b 233 -20 235 -63 233 -42 b 233 105 232 22 233 63 b 312 121 259 111 285 117 b 406 226 390 134 400 145 b 373 284 409 268 402 284 b 344 281 364 284 356 282 b 232 258 307 276 269 266 b 230 308 232 275 232 291 b 210 505 229 374 232 441 b 183 471 189 501 184 490 b 180 406 181 449 180 428 b 184 246 180 353 184 300 b 48 222 140 236 94 228 b 0 168 6 216 0 209 b 7 86 1 141 4 114 b 27 66 9 73 13 66 l 35 66 b 184 94 85 66 135 84 b 187 -1 184 62 186 30 b 190 -96 189 -33 190 -65 l 112 -114 b 35 -213 27 -132 35 -132 b 33 -253 35 -226 35 -240 b 49 -276 33 -269 37 -276 b 62 -275 52 -276 56 -276 l 186 -245 l 186 -256 b 179 -387 180 -300 177 -343 b 194 -487 180 -419 179 -454 z', + }, + accidentalThreeQuarterTonesSharpStein: { + x_min: -23, + x_max: 388, + y_min: -373, + y_max: 445, + ha: 818, + o: 'm 114 -537 b 138 -475 137 -518 138 -495 b 147 -292 138 -413 144 -353 b 212 -278 168 -287 190 -282 b 243 -444 215 -333 225 -389 b 261 -467 248 -454 251 -465 b 281 -446 272 -469 276 -455 b 292 -347 292 -416 288 -384 b 288 -262 289 -320 288 -291 l 374 -245 b 376 -311 374 -266 374 -288 b 390 -456 379 -357 379 -405 b 416 -396 412 -436 415 -418 b 423 -287 420 -360 423 -323 b 422 -235 423 -269 423 -252 b 451 -229 432 -233 441 -232 b 547 -98 524 -215 547 -199 l 547 -89 b 521 -49 546 -59 540 -49 b 497 -52 516 -49 507 -49 b 418 -68 469 -56 444 -63 b 423 52 419 -29 422 12 b 426 140 425 81 425 109 b 495 160 449 145 472 153 b 552 219 526 170 546 189 b 559 279 557 240 553 262 b 530 341 559 324 552 341 b 490 331 520 341 507 338 b 432 311 471 324 452 318 b 449 552 436 392 442 471 b 452 588 451 563 452 575 b 446 622 452 599 451 611 b 436 641 444 629 448 641 b 418 628 428 641 420 636 b 409 602 413 621 410 611 b 386 297 396 501 390 399 b 297 274 356 288 327 281 b 291 403 295 317 294 360 b 274 550 288 452 284 501 b 259 569 271 564 265 569 b 240 559 253 569 248 563 b 230 537 232 554 230 546 l 230 488 b 233 369 230 448 232 409 b 236 261 236 333 238 297 b 156 245 210 255 183 251 b 154 396 154 295 154 346 b 150 416 154 403 153 410 b 140 438 145 423 150 438 l 138 438 b 118 413 128 436 118 428 b 112 354 118 393 114 374 b 109 238 109 315 109 276 b 49 226 89 233 69 230 b 3 163 16 222 3 202 b 7 91 3 138 9 114 b 29 62 7 69 13 62 b 39 63 32 62 35 63 b 104 73 60 66 82 71 b 101 -10 104 46 102 17 l 92 -132 l 10 -150 b -33 -204 -19 -157 -33 -170 b -19 -310 -32 -240 -19 -274 b -6 -324 -19 -321 -13 -324 b 6 -323 -1 -324 1 -324 b 82 -307 32 -317 58 -311 b 81 -376 82 -330 81 -353 b 114 -537 81 -431 94 -484 z m 294 -92 b 297 -37 295 -73 295 -56 b 300 49 300 -9 300 20 l 300 108 b 379 127 325 114 353 120 b 374 -76 376 59 374 -9 b 294 -92 347 -82 320 -86 z m 154 -120 b 157 20 154 -73 156 -26 b 158 82 158 40 158 62 b 230 95 183 86 206 89 b 225 0 229 63 226 32 b 217 -107 223 -35 220 -71 z', + }, + accidentalBuyukMucennebFlat: { + x_min: 1.8692317181955784, + x_max: 287, + y_min: -248, + y_max: 432.4720949426819, + ha: 680.4720949426819, + o: 'm 410 128 b 302 239 403 199 363 239 b 259 232 289 239 275 236 b 199 207 239 226 219 216 l 197 206 l 197 243 l 197 251 b 347 317 248 272 298 295 b 376 347 360 324 372 334 b 389 435 387 376 393 405 b 348 454 384 462 377 465 b 202 387 300 432 251 409 b 203 408 203 395 203 402 l 203 431 b 347 490 252 451 300 469 b 376 517 360 495 372 505 b 389 599 387 546 393 572 b 348 616 384 625 377 628 l 203 556 b 196 593 202 569 199 582 b 179 622 193 603 193 622 l 177 622 b 150 588 161 621 150 608 b 147 533 150 570 148 552 b 29 488 108 517 69 503 b 3 455 12 482 3 472 b 12 353 1 422 9 389 b 145 408 56 372 101 389 b 145 363 145 392 145 377 l 29 315 b 3 281 12 310 3 298 b 12 170 1 245 9 209 l 141 226 b 138 166 140 206 138 186 b 114 -199 134 43 115 -76 b 130 -344 114 -246 117 -297 b 141 -357 132 -353 135 -357 b 158 -347 145 -357 151 -354 b 219 -301 177 -331 199 -315 b 413 69 346 -210 413 -88 b 410 128 413 89 413 108 z m 350 35 b 343 6 350 26 348 17 b 180 -163 308 -69 245 -117 b 189 -46 183 -125 184 -86 b 193 49 192 -14 193 17 l 199 52 b 284 78 226 63 253 78 b 317 71 294 78 305 75 b 350 35 340 62 351 50 z', + }, + accidentalBakiyeFlat: { + x_min: 1.8692317181955784, + x_max: 287, + y_min: -236, + y_max: 444, + ha: 680, + o: 'm 141 -340 b 158 -330 145 -340 151 -337 b 219 -284 177 -314 199 -298 b 413 86 346 -193 413 -71 b 410 145 413 107 413 125 b 302 256 403 216 363 256 b 259 249 289 256 275 253 b 199 225 239 243 219 233 l 197 223 l 197 261 b 199 334 197 285 199 310 b 347 406 249 357 298 382 b 376 439 360 413 372 425 b 390 516 384 465 390 490 b 389 537 390 523 390 530 b 372 564 384 556 382 564 b 348 557 367 564 359 562 b 204 487 300 537 253 510 b 206 518 206 497 206 507 b 196 611 206 549 203 580 b 179 639 193 621 193 639 l 177 639 b 150 605 161 638 150 625 b 145 482 148 564 144 523 l 145 458 b 29 405 107 439 68 420 b 3 366 12 397 3 386 b 12 243 1 325 9 287 b 143 307 56 265 99 285 l 138 183 b 114 -181 134 60 114 -59 b 130 -327 114 -229 117 -279 b 141 -340 132 -336 135 -340 z m 180 -145 b 189 -29 183 -108 184 -69 b 193 66 192 3 193 35 l 199 69 b 284 95 226 81 253 95 b 317 88 294 95 305 92 b 350 52 340 79 351 68 b 343 23 350 43 348 35 b 180 -145 305 -50 245 -99 z', + }, + accidentalKomaSharp: { + x_min: 0, + x_max: 300, + y_min: -338, + y_max: 351, + ha: 689, + o: 'm 194 -487 b 225 -432 215 -469 223 -452 b 238 -232 229 -366 236 -298 b 377 -199 285 -220 331 -209 b 418 -164 397 -193 410 -181 b 432 -88 428 -138 432 -114 b 412 -42 432 -55 428 -42 b 389 -46 406 -42 399 -43 l 235 -85 b 233 -20 235 -63 233 -42 b 233 105 232 22 233 63 b 312 121 259 111 285 117 b 406 226 390 134 400 145 b 373 284 409 268 402 284 b 344 281 364 284 356 282 b 232 258 307 276 269 266 b 230 308 232 275 232 291 b 210 505 229 374 232 441 b 183 471 189 501 184 490 b 180 406 181 449 180 428 b 184 246 180 353 184 300 b 48 222 140 236 94 228 b 0 168 6 216 0 209 b 7 86 1 141 4 114 b 27 66 9 73 13 66 l 35 66 b 184 94 85 66 135 84 b 187 -1 184 62 186 30 b 190 -96 189 -33 190 -65 l 112 -114 b 35 -213 27 -132 35 -132 b 33 -253 35 -226 35 -240 b 49 -276 33 -269 37 -276 b 62 -275 52 -276 56 -276 l 186 -245 l 186 -256 b 179 -387 180 -300 177 -343 b 194 -487 180 -419 179 -454 z', + }, + accidentalKucukMucennebSharp: { + x_min: -0.15206251809627475, + x_max: 359, + y_min: -420, + y_max: 343, + ha: 763, + o: 'm 236 -605 b 262 -543 256 -583 261 -564 b 269 -423 268 -503 269 -464 b 266 -340 269 -396 268 -367 l 361 -318 b 405 -276 384 -312 399 -298 b 413 -189 412 -248 416 -219 b 395 -164 412 -171 409 -164 b 382 -166 392 -164 387 -164 b 264 -193 343 -176 304 -184 b 269 -102 265 -163 268 -132 b 454 -62 331 -89 392 -78 b 501 -23 477 -58 494 -45 b 517 62 511 6 517 33 b 487 112 517 95 513 112 b 471 111 482 112 477 112 b 274 66 406 95 340 81 b 276 138 275 91 276 114 b 350 154 301 144 325 148 b 402 203 377 160 396 176 b 412 284 408 230 412 258 b 392 311 412 302 406 311 b 372 308 386 311 379 310 b 287 291 343 301 314 297 l 295 405 b 298 441 297 416 298 428 b 292 475 298 452 297 464 b 282 494 289 482 294 494 b 264 481 274 494 266 490 b 255 455 259 474 256 464 b 239 282 248 397 243 340 b 148 268 209 278 179 274 b 62 164 62 252 62 253 l 62 132 b 79 108 60 117 65 108 l 86 108 l 230 130 b 229 92 230 118 229 105 b 228 56 228 79 228 68 b 66 20 173 43 120 32 b 0 -59 6 7 3 1 l 0 -138 b 14 -160 -1 -156 4 -160 b 27 -158 19 -160 23 -160 b 222 -112 92 -141 157 -127 b 220 -203 220 -143 220 -173 b 147 -217 196 -207 171 -213 b 89 -288 92 -228 89 -229 b 95 -347 85 -305 96 -325 b 112 -374 92 -366 98 -374 b 125 -373 117 -374 121 -374 l 220 -351 b 222 -458 220 -386 220 -422 b 236 -605 223 -504 225 -552 z', + }, + accidentalKoron: { + x_min: 0, + x_max: 303, + y_min: -462.4598053473055, + y_max: 180, + ha: 642.4598053473055, + o: 'm 59 -665 b 72 -649 69 -662 72 -657 b 69 -626 72 -642 69 -634 b 69 -622 69 -625 69 -624 l 69 -600 b 55 -156 60 -456 68 -311 b 86 -170 66 -166 76 -170 b 112 -163 95 -170 104 -166 b 390 -35 204 -120 298 -78 b 436 -1 409 -27 436 -27 b 396 46 436 22 413 33 l 382 55 b 46 243 271 121 157 179 b 12 259 29 253 17 259 b 0 219 1 259 0 248 b 3 -372 0 22 3 -176 b 6 -616 3 -454 6 -536 b 59 -665 6 -638 40 -671 z m 55 199 b 363 24 156 141 258 84 b 55 -118 259 -24 160 -69 z', + }, + accidentalSori: { + x_min: 0, + x_max: 434, + y_min: -295, + y_max: 325, + ha: 620, + o: 'm 194 -425 b 196 -409 194 -418 196 -413 b 194 -194 196 -337 196 -266 b 364 -127 251 -171 308 -150 b 361 -321 363 -192 364 -256 b 410 -387 360 -357 373 -377 b 413 -373 412 -382 413 -377 b 418 -114 418 -287 418 -200 l 418 -105 b 595 -35 477 -82 536 -59 b 625 0 612 -27 625 -22 b 593 48 624 23 618 39 l 419 117 b 423 370 419 202 423 285 b 426 403 423 382 426 393 b 418 436 426 415 425 426 b 384 468 409 449 399 468 b 369 448 370 468 369 459 b 369 436 369 444 369 441 l 369 428 l 369 423 b 367 138 369 328 367 233 l 353 143 l 192 207 l 192 367 b 173 406 192 383 184 396 b 151 422 167 413 160 422 b 144 420 148 422 147 422 b 137 403 138 416 137 410 l 137 392 l 137 229 b 33 271 102 243 68 256 b 13 276 26 274 19 276 b 0 262 6 276 0 272 b 35 199 1 239 0 212 l 138 160 b 140 -148 138 58 138 -45 b 56 -181 111 -158 84 -170 b 24 -215 35 -189 24 -199 b 29 -235 24 -220 26 -228 b 49 -253 35 -249 42 -253 b 78 -240 59 -253 69 -243 b 140 -216 98 -233 120 -225 l 140 -356 b 194 -425 140 -406 141 -406 z m 194 -125 b 193 138 194 -37 193 50 b 315 89 233 122 275 107 b 366 71 333 84 350 76 b 364 -58 366 27 366 -16 b 194 -125 308 -81 251 -104 z m 419 49 l 526 7 l 485 -10 l 419 -36 z', + }, + articAccentAbove: { + x_min: 0, + x_max: 425, + y_min: 0, + y_max: 326, + ha: 326, + o: 'm 27 1 b 78 12 46 0 62 6 b 347 112 168 45 253 91 b 521 184 409 128 459 167 b 608 259 557 194 589 220 b 612 274 611 265 612 271 b 598 292 612 281 608 287 b 477 347 559 312 518 331 b 176 465 374 384 275 425 b 156 469 168 468 161 469 b 125 456 145 469 137 465 b 53 370 96 432 78 399 b 45 353 48 363 45 357 b 68 333 45 344 52 337 b 360 225 166 298 262 261 b 192 154 302 203 249 171 b 13 36 120 132 53 105 b 0 13 9 29 0 22 l 0 9 b 16 0 3 1 10 0 l 26 0 b 27 1 27 0 27 0 z', + }, + articAccentBelow: { + x_min: 0, + x_max: 425, + y_min: -326, + y_max: 0, + ha: 326, + o: 'm 26 -469 l 27 -469 b 78 -458 46 -469 62 -464 b 347 -357 168 -426 253 -380 b 521 -285 409 -341 459 -302 b 608 -210 557 -276 589 -249 b 612 -196 611 -204 612 -200 b 598 -179 612 -189 608 -183 b 477 -122 559 -157 518 -138 b 176 -4 374 -85 275 -45 b 156 0 168 -1 161 0 b 125 -13 145 0 137 -4 b 53 -99 96 -37 78 -71 b 45 -117 48 -107 45 -112 b 68 -137 45 -125 52 -132 b 360 -245 166 -171 262 -209 b 192 -315 302 -266 249 -300 b 13 -433 120 -337 53 -366 b 0 -456 9 -442 0 -448 l 0 -461 b 16 -469 3 -468 10 -469 z', + }, + articTenutoAbove: { + x_min: 0.35192668236256364, + x_max: 471.1238660564107, + y_min: 0, + y_max: 56, + ha: 56, + o: 'm 137 0 b 197 1 156 0 179 1 b 409 6 268 1 338 6 b 482 4 432 6 459 6 b 556 0 508 3 534 0 b 651 10 588 0 621 3 b 678 27 662 12 678 10 b 654 59 680 45 672 53 b 511 75 606 73 560 73 b 255 81 426 78 341 81 b 160 79 222 81 193 79 l 36 79 b 1 71 24 78 7 85 b 19 32 -3 56 9 43 b 45 16 26 24 36 20 b 137 0 76 3 108 0 z', + }, + articTenutoBelow: { + x_min: 0.35192668236256364, + x_max: 471.1238660564107, + y_min: -59, + y_max: -3, + ha: 56, + o: 'm 137 -85 b 197 -84 156 -85 179 -84 b 409 -79 268 -84 338 -79 b 482 -81 432 -79 459 -79 b 556 -85 508 -82 534 -85 b 651 -75 588 -85 621 -82 b 678 -58 662 -73 678 -75 b 654 -26 680 -40 672 -32 b 511 -10 606 -12 560 -12 b 255 -4 426 -7 341 -4 b 160 -6 222 -4 193 -6 l 36 -6 b 1 -14 24 -7 7 0 b 19 -53 -3 -29 9 -42 b 45 -69 26 -60 36 -65 b 137 -85 76 -82 108 -85 z', + }, + articStaccatoAbove: { + x_min: 1.4151102965496913, + x_max: 112, + y_min: 0, + y_max: 156, + ha: 156, + o: 'm 98 0 b 132 23 109 0 122 7 b 161 112 150 50 161 79 b 158 148 161 124 161 137 b 125 186 154 167 131 167 b 63 225 117 215 85 216 b 23 197 45 222 30 219 b 3 91 12 163 12 127 b 19 66 0 79 4 69 b 65 27 40 62 53 46 b 98 0 76 9 88 0 z', + }, + articStaccatoBelow: { + x_min: 1.4151102965496913, + x_max: 112.08403222864916, + y_min: -156, + y_max: 0, + ha: 156, + o: 'm 132 -202 b 161 -112 151 -174 163 -145 b 158 -76 161 -101 161 -88 b 125 -39 153 -58 131 -58 b 63 0 115 -10 85 -9 b 23 -27 45 -3 30 -6 b 3 -134 12 -62 10 -98 b 19 -158 0 -145 4 -156 b 65 -197 40 -164 53 -179 b 98 -225 75 -216 88 -225 b 132 -202 109 -225 122 -217 z', + }, + articStaccatissimoAbove: { + x_min: 0, + x_max: 139, + y_min: 0, + y_max: 411, + ha: 411, + o: 'm 104 0 b 144 115 143 29 138 75 b 197 423 158 217 180 320 b 200 454 199 433 200 444 b 181 540 200 482 193 513 b 112 592 167 573 141 592 b 55 567 92 592 72 585 b 0 490 32 546 3 527 l 0 484 b 27 279 14 416 14 347 b 84 20 43 193 52 104 b 96 0 86 13 92 6 z', + }, + articStaccatissimoBelow: { + x_min: 0, + x_max: 139, + y_min: -411, + y_max: 0, + ha: 411, + o: 'm 88 -592 b 145 -567 108 -592 128 -585 b 200 -490 168 -546 197 -527 l 200 -484 b 173 -279 186 -416 186 -347 b 117 -20 157 -193 148 -104 b 104 0 114 -13 108 -6 l 96 0 b 56 -115 58 -29 62 -75 b 3 -423 42 -217 20 -320 b 0 -454 1 -433 0 -444 b 19 -540 0 -482 7 -513 b 88 -592 33 -573 59 -592 z', + }, + articMarcatoAbove: { + x_min: 0.04121419527862119, + x_max: 396, + y_min: 0, + y_max: 328.0000000000001, + ha: 328.0000000000001, + o: 'm 477 0 b 510 13 488 0 500 6 b 570 124 546 40 563 81 b 547 183 570 147 560 166 b 356 422 487 265 405 330 b 346 442 354 429 350 436 l 346 444 b 318 465 340 456 330 464 l 312 469 b 274 449 294 480 284 461 b 242 413 262 438 253 425 b 56 196 177 343 112 274 b 1 56 26 154 13 105 b 27 20 -4 35 9 20 b 42 23 32 20 37 20 b 84 53 59 29 72 39 b 255 269 141 125 193 200 b 275 229 262 255 266 242 b 448 14 324 151 390 86 b 477 0 456 4 467 0 z', + }, + articMarcatoBelow: { + x_min: 0, + x_max: 395.9587858047214, + y_min: -328.0000000000001, + y_max: 0, + ha: 328.0000000000001, + o: 'm 258 -469 b 297 -449 276 -480 287 -461 b 328 -413 308 -438 317 -425 b 514 -196 393 -343 458 -274 b 569 -56 544 -154 557 -105 b 543 -20 575 -35 562 -20 b 528 -23 539 -20 533 -20 b 487 -53 511 -29 498 -39 b 315 -269 429 -125 377 -200 b 295 -229 308 -255 304 -242 b 122 -14 246 -151 180 -86 b 94 0 114 -4 104 0 b 60 -13 82 0 71 -6 b 0 -124 24 -40 7 -81 b 23 -183 0 -147 10 -166 b 215 -422 84 -265 166 -330 b 225 -442 216 -429 220 -436 l 225 -444 b 252 -465 230 -456 240 -464 z', + }, + fermataAbove: { + x_min: -0.04550444040404433, + x_max: 472, + y_min: 2.015071727506986, + y_max: 454, + ha: 451.984928272493, + o: 'm 39 10 b 78 108 66 37 71 73 b 163 311 92 181 111 252 b 284 423 199 353 239 392 b 373 458 312 444 340 454 b 433 431 395 458 410 446 b 603 153 530 361 596 276 b 595 121 603 144 595 131 l 595 88 b 602 50 596 75 589 55 b 639 73 619 43 631 60 b 651 102 645 82 648 92 b 667 194 660 132 662 163 b 680 278 671 222 672 248 b 560 567 680 386 638 481 b 396 654 508 625 452 649 b 291 632 364 654 325 644 b 161 526 235 613 200 566 b 4 249 85 446 26 357 b 4 174 0 222 -3 196 b 10 19 4 124 4 69 b 29 4 12 6 16 0 b 39 10 35 4 33 4 z m 338 37 b 370 40 350 36 357 36 b 380 75 387 40 380 43 b 389 94 382 79 382 85 b 356 132 389 111 374 122 b 269 154 328 147 300 156 b 225 125 252 154 228 157 b 261 48 222 81 232 56 b 338 37 287 40 312 40 z', + }, + fermataBelow: { + x_min: -0.310835055998654, + x_max: 518.570567335755, + y_min: -430, + y_max: -0.9161449836506543, + ha: 429.08385501634933, + o: 'm 344 -615 b 500 -543 402 -602 452 -576 b 713 -253 605 -471 661 -364 b 746 -98 737 -204 750 -153 b 727 -59 744 -82 744 -59 b 688 -88 711 -59 694 -68 b 678 -109 687 -96 683 -102 b 562 -314 648 -183 611 -252 b 387 -439 516 -373 458 -416 b 328 -449 367 -446 347 -449 b 180 -386 274 -449 225 -423 b 69 -179 111 -330 69 -262 b 75 -121 69 -160 71 -141 b 84 -58 78 -101 84 -79 b 82 -39 84 -52 84 -45 b 68 -1 79 -26 82 -4 b 26 -32 49 0 33 -12 b 20 -52 24 -39 22 -45 b 0 -223 9 -107 -3 -161 b 141 -553 1 -348 27 -468 b 304 -619 192 -590 243 -619 b 344 -615 317 -619 330 -618 z m 415 -190 b 435 -157 429 -192 435 -184 b 308 -27 435 -86 379 -27 b 271 -46 287 -27 272 -35 b 269 -69 269 -55 269 -62 b 364 -183 269 -128 302 -170 z', + }, + breathMarkComma: { + x_min: 0, + x_max: 148, + y_min: 0, + y_max: 275, + ha: 275, + o: 'm 120 0 b 187 78 156 20 174 48 b 213 209 206 121 213 164 b 206 294 213 238 210 265 b 140 390 200 337 171 367 b 122 396 134 395 128 396 b 68 382 105 396 85 384 b 46 379 60 382 53 382 b 0 328 12 369 0 357 b 1 311 0 323 1 317 b 30 210 4 275 22 243 b 66 167 39 179 46 167 b 94 171 73 167 82 168 b 143 180 109 174 124 180 b 160 179 148 180 154 180 b 120 66 124 145 120 107 b 120 0 120 45 121 23 z', + }, + breathMarkUpbow: { + x_min: 0, + x_max: 254, + y_min: 0, + y_max: 595, + ha: 595, + o: 'm 233 0 b 256 48 251 14 253 30 b 272 183 264 92 265 138 b 311 455 289 274 295 364 b 350 716 327 541 341 628 b 366 815 354 749 366 782 b 359 857 366 829 363 842 b 327 815 334 852 330 832 b 302 674 315 769 310 721 b 248 357 288 567 269 462 b 225 226 240 314 242 268 b 210 251 212 232 213 243 b 69 721 163 408 117 564 b 32 835 58 760 53 801 b 20 851 29 841 27 851 b 14 850 19 851 16 851 b 0 828 6 847 0 838 l 0 825 b 12 765 1 804 7 785 b 194 125 73 552 132 338 b 233 0 206 84 213 42 z', + }, + caesura: { + x_min: 0, + x_max: 565.5831864753837, + y_min: -0.09016994374947417, + y_max: 562.4481112129314, + ha: 562.5382811566809, + o: 'm 0 76 b 49 122 24 92 37 107 b 444 613 180 287 305 455 b 528 770 484 660 518 708 b 531 792 530 778 531 785 b 524 808 531 799 530 805 b 490 792 513 815 498 802 b 390 683 456 756 420 721 b 48 262 275 543 164 400 b 0 76 0 207 7 145 z m 226 1 b 248 13 238 -4 243 7 l 353 137 b 759 638 490 302 632 464 b 814 805 795 688 819 740 b 779 786 796 805 788 796 b 628 609 724 732 678 668 b 310 242 523 485 416 363 b 217 69 265 190 217 140 b 222 30 217 58 219 45 b 222 23 222 29 220 26 b 220 12 222 20 220 16 b 226 1 220 7 222 3 z', + }, + caesuraCurved: { + x_min: 0, + x_max: 386, + y_min: -10, + y_max: 584, + ha: 594, + o: 'm 180 -14 b 246 14 213 -13 230 0 b 347 144 288 52 315 99 b 526 471 420 246 488 350 b 556 671 546 537 556 603 b 543 798 556 713 553 756 b 504 837 537 822 521 828 b 490 841 500 840 494 841 b 472 832 482 841 477 838 b 406 678 436 785 406 737 b 410 638 406 665 408 652 b 425 511 419 595 425 553 b 315 186 425 395 387 287 b 180 -14 271 122 228 58 z m 14 24 b 49 39 29 24 40 32 b 120 114 76 60 99 85 b 216 276 156 166 184 223 b 317 626 281 384 317 501 b 315 664 317 639 317 651 b 301 773 314 701 311 737 b 262 808 295 795 278 808 b 245 799 256 808 249 805 b 170 641 209 750 170 706 b 171 621 170 634 170 628 b 177 511 176 585 177 549 b 114 229 177 415 160 320 b 0 26 79 161 42 95 b 14 24 6 24 10 24 z', + }, + restMaxima: { + x_min: 0, + x_max: 366, + y_min: -255, + y_max: 255, + ha: 510, + o: 'm 397 -367 b 504 -343 436 -367 468 -347 b 518 -318 516 -341 518 -330 b 527 -30 518 -217 527 -117 b 526 33 527 -7 527 13 l 526 301 b 501 350 526 323 520 341 b 428 367 477 361 452 367 b 374 359 410 367 393 364 b 357 333 361 354 357 347 b 356 91 357 252 356 171 l 356 30 b 340 -307 357 -82 346 -194 b 397 -367 337 -354 350 -367 z m 46 -357 b 58 -356 49 -357 53 -357 b 154 -333 91 -351 121 -338 b 173 -305 168 -330 173 -320 l 173 302 b 132 356 173 330 157 348 b 68 364 112 363 89 364 b 3 304 19 363 1 348 l 3 4 l 0 4 b 1 -302 0 -98 0 -200 b 46 -357 1 -331 16 -357 z', + }, + restDoubleWhole: { + x_min: 0, + x_max: 122, + y_min: 0, + y_max: 249, + ha: 249, + o: 'm 43 0 b 58 1 48 0 52 0 b 124 20 81 6 102 17 b 176 96 173 27 176 58 b 173 220 174 138 173 179 b 176 304 173 248 176 276 b 140 353 176 331 163 346 b 95 359 125 356 111 359 b 32 346 73 359 52 354 b 0 315 20 340 0 337 b 1 243 0 291 1 268 l 1 174 l 4 174 l 4 48 b 43 0 4 16 17 0 z', + }, + restWhole: { + x_min: 0.8908513171538642, + x_max: 500, + y_min: -120, + y_max: 14, + ha: 134, + o: 'm 356 -173 l 356 -171 l 642 -171 b 719 -115 680 -171 717 -145 b 720 -82 719 -104 720 -92 b 711 -20 720 -60 719 -40 b 672 17 704 0 694 10 b 649 20 664 20 657 20 b 605 17 634 20 621 17 b 92 19 433 17 262 17 b 29 7 69 20 49 12 b 9 -17 12 4 9 -6 b 10 -43 9 -26 10 -35 b 1 -84 10 -58 3 -72 b 76 -173 0 -147 7 -173 z', + }, + restHalf: { + x_min: 0, + x_max: 518.3998530468286, + y_min: 0, + y_max: 162, + ha: 162, + o: 'm 98 0 l 556 0 b 665 1 592 0 629 0 b 746 82 720 3 743 29 b 736 174 749 114 740 144 b 670 232 729 215 708 232 b 570 229 636 232 603 229 b 356 233 498 229 426 233 l 73 233 b 0 179 19 233 0 220 b 1 154 0 171 0 164 b 6 95 4 135 6 115 b 98 0 3 27 29 0 z', + }, + restQuarter: { + x_min: -0.3784452492533808, + x_max: 263, + y_min: -415, + y_max: 415, + ha: 830, + o: 'm 151 -596 b 164 -563 163 -589 161 -575 b 160 -546 164 -557 161 -552 b 124 -396 148 -495 135 -446 b 122 -380 122 -390 122 -384 b 199 -255 122 -331 158 -272 b 228 -256 209 -249 217 -253 b 324 -346 274 -271 298 -310 b 353 -369 331 -356 341 -369 b 360 -367 356 -369 357 -369 b 379 -336 373 -361 379 -348 l 377 -325 b 344 -232 372 -292 366 -258 b 249 -58 301 -180 278 -117 b 242 -36 245 -49 242 -42 b 258 -7 242 -26 248 -17 b 328 78 284 20 311 45 b 354 158 344 104 354 131 b 337 216 354 177 350 196 b 213 435 294 288 249 359 b 115 575 189 487 158 536 b 78 598 105 585 92 598 b 59 592 72 598 66 596 b 39 562 45 583 39 572 b 53 527 39 550 45 539 b 168 344 98 469 125 402 b 187 307 181 328 187 317 b 153 269 187 294 176 284 b 62 213 122 252 91 235 b 40 180 48 203 40 192 b 46 158 40 173 43 166 b 99 65 60 125 79 95 b 183 -79 131 20 160 -29 b 156 -86 173 -88 164 -85 b 0 -261 58 -99 -7 -173 b 96 -557 10 -366 49 -464 b 124 -585 102 -569 109 -580 b 145 -598 132 -588 138 -598 b 151 -596 147 -598 150 -598 z', + }, + rest8th: { + x_min: 0, + x_max: 289, + y_min: -260, + y_max: 261, + ha: 521, + o: 'm 164 -374 b 212 -340 190 -373 203 -357 b 276 -190 238 -292 258 -242 b 410 285 333 -36 359 128 b 416 314 413 294 416 304 l 416 321 b 393 354 415 341 410 354 b 382 353 389 354 386 354 b 292 311 347 347 315 333 b 174 225 256 276 216 251 b 157 219 168 222 163 219 b 140 228 151 219 145 222 b 131 246 134 233 131 240 b 135 262 131 252 132 256 b 147 298 141 272 147 285 b 127 367 147 323 154 354 b 94 376 114 373 102 376 b 48 336 75 376 63 363 b 3 181 20 288 12 235 b 0 150 1 170 0 160 b 109 24 0 84 35 24 b 171 36 127 24 148 27 b 289 101 213 52 248 75 b 164 -374 256 -62 193 -213 z', + }, + rest16th: { + x_min: 0, + x_max: 333, + y_min: -328.283950617284, + y_max: 244, + ha: 572.2839506172841, + o: 'm 209 -471 b 246 -458 222 -477 236 -468 b 307 -338 279 -425 300 -384 b 324 -226 312 -301 317 -262 b 428 161 350 -94 386 35 b 480 318 445 215 480 259 b 467 347 480 331 477 341 b 445 351 461 350 454 351 b 408 337 432 351 419 347 b 402 333 405 336 403 334 b 223 215 344 294 294 245 b 236 259 229 233 235 246 b 238 276 238 265 238 271 b 212 338 238 302 226 334 b 193 341 206 340 199 341 b 86 289 156 341 104 317 b 59 180 66 255 59 217 b 156 27 59 76 92 27 b 236 46 179 27 204 35 b 338 101 271 59 298 82 b 289 -49 312 49 302 0 b 196 -122 276 -99 235 -107 b 176 -114 187 -127 176 -127 l 176 -111 b 157 -53 177 -88 164 -72 b 69 -9 141 -7 101 -16 b 17 -48 43 -3 29 -27 b 0 -127 4 -73 0 -99 b 6 -186 0 -147 1 -167 b 82 -294 17 -262 37 -294 b 160 -276 102 -294 128 -289 b 219 -242 181 -268 203 -259 b 236 -230 223 -236 229 -230 b 243 -232 239 -230 240 -230 b 235 -275 248 -246 239 -261 b 202 -456 220 -334 202 -395 b 209 -471 202 -462 203 -468 z', + }, + rest32nd: { + x_min: 0, + x_max: 347, + y_min: -497.5023916875033, + y_max: 483, + ha: 980.5023916875033, + o: 'm 177 -716 b 217 -690 194 -720 209 -704 b 233 -655 225 -680 230 -668 b 292 -390 253 -567 275 -480 b 361 -48 312 -275 336 -161 b 452 400 393 102 422 252 b 497 629 467 477 482 553 b 500 647 498 635 500 641 b 480 691 500 665 492 684 b 464 696 475 694 469 696 b 418 674 448 696 431 685 l 361 626 b 333 611 353 618 343 612 b 308 629 325 611 317 616 b 239 667 292 651 265 661 b 204 670 228 668 216 670 b 86 559 141 670 95 628 b 85 537 86 552 85 544 b 107 416 85 495 95 455 b 161 372 114 389 134 372 b 174 373 166 372 170 372 b 226 383 192 374 209 377 b 387 478 285 402 330 444 b 364 386 379 444 364 415 b 276 271 364 323 320 298 b 265 266 272 268 268 266 b 252 276 261 266 256 269 b 143 333 229 311 186 333 b 107 327 130 333 118 330 b 43 243 62 314 46 291 b 58 145 43 210 52 179 b 150 63 68 92 99 63 b 315 132 213 63 259 98 b 266 -58 297 63 281 4 b 207 -101 259 -91 230 -96 b 186 -66 186 -107 199 -75 b 180 -50 181 -63 183 -55 b 101 -3 160 -23 135 -3 b 9 -66 59 -3 20 -32 b 0 -118 3 -84 0 -101 b 10 -196 0 -144 6 -170 b 104 -287 20 -256 52 -287 b 137 -282 114 -287 125 -287 b 184 -269 151 -281 171 -269 b 196 -275 190 -269 193 -271 b 199 -287 197 -278 199 -282 b 184 -343 199 -304 189 -325 b 181 -348 184 -346 183 -347 b 134 -595 158 -429 131 -508 b 156 -677 134 -624 150 -648 b 177 -716 158 -693 160 -713 z', + }, + rest64th: { + x_min: 0, + x_max: 428, + y_min: -720, + y_max: 473.6797408388932, + ha: 1193.6797408388932, + o: 'm 200 -1037 b 229 -1012 215 -1037 222 -1025 b 238 -984 233 -1004 236 -994 b 282 -780 248 -914 265 -848 b 386 -369 317 -644 354 -507 b 491 104 422 -212 451 -53 b 600 541 528 249 550 399 b 616 629 611 570 616 599 b 600 680 616 648 615 671 b 550 665 586 687 566 677 b 480 618 527 649 501 635 b 464 611 474 613 468 611 b 448 622 458 611 454 615 b 366 662 425 651 397 662 b 331 658 354 662 343 661 b 242 572 285 647 253 619 b 236 528 239 557 236 543 b 266 400 236 484 251 442 b 325 373 274 377 301 373 b 436 409 366 373 403 383 l 494 452 b 474 360 485 416 474 389 b 383 248 474 297 435 269 b 320 328 377 288 351 310 b 276 341 305 337 291 341 b 186 269 235 341 194 311 b 181 230 183 256 181 243 b 187 153 181 204 186 179 b 279 63 192 86 233 63 b 304 65 288 63 295 63 b 416 115 344 72 379 92 b 387 -14 406 69 397 27 b 320 -95 380 -52 369 -86 b 318 -79 320 -89 320 -84 b 223 0 305 -29 271 0 b 122 -81 171 0 135 -30 b 118 -127 120 -96 118 -112 l 118 -196 b 137 -242 118 -215 125 -229 b 209 -275 157 -266 181 -275 b 249 -269 222 -275 235 -274 b 318 -248 272 -264 294 -255 b 281 -390 315 -301 292 -344 b 276 -400 279 -393 279 -397 b 259 -420 272 -408 266 -416 b 246 -429 255 -425 251 -429 b 233 -415 242 -429 238 -426 b 176 -359 225 -389 200 -372 b 121 -346 158 -348 140 -346 b 14 -408 73 -346 27 -370 b 0 -498 4 -438 0 -468 b 6 -564 0 -520 3 -543 b 91 -635 12 -611 45 -635 b 131 -629 104 -635 117 -634 b 223 -590 163 -622 190 -603 b 166 -824 203 -671 189 -747 b 148 -912 157 -852 148 -881 b 156 -955 148 -926 150 -940 b 177 -1008 161 -972 170 -991 b 200 -1037 181 -1020 183 -1037 z', + }, + rest128th: { + x_min: 0.6717818579024267, + x_max: 491, + y_min: -711, + y_max: 719, + ha: 1430, + o: 'm 233 -1015 b 271 -956 256 -1002 266 -981 l 314 -723 b 393 -350 337 -598 366 -474 b 543 312 442 -128 492 91 b 687 841 583 490 635 665 b 707 958 698 880 707 919 b 706 986 707 968 707 976 b 688 1025 704 999 704 1024 b 670 1027 683 1025 677 1027 b 629 1007 655 1027 639 1022 b 559 945 613 981 586 968 b 541 1004 553 968 559 991 b 456 1035 516 1024 488 1035 b 419 1030 444 1035 431 1034 b 344 953 379 1018 353 995 b 340 900 341 936 340 917 b 341 847 340 881 341 864 b 380 779 340 815 354 793 b 464 763 406 765 435 762 b 592 814 510 763 549 786 b 546 660 575 757 556 710 b 480 585 537 619 517 598 b 478 599 480 590 478 595 b 386 678 472 641 428 678 b 294 612 343 678 304 651 b 279 477 282 567 278 521 b 363 395 281 428 317 395 b 380 396 369 395 374 395 b 488 436 416 403 449 419 b 384 233 469 357 468 275 b 359 291 373 252 377 276 b 282 318 337 310 310 318 b 181 264 243 318 203 298 b 154 107 153 216 154 161 b 242 6 154 42 187 6 b 278 10 253 6 265 7 b 408 88 330 22 366 55 b 387 -1 400 56 393 27 b 301 -112 379 -55 354 -94 b 289 -65 297 -95 302 -79 b 219 -32 269 -42 245 -32 b 183 -37 207 -32 196 -35 b 112 -109 144 -46 121 -71 b 105 -219 104 -145 108 -183 b 186 -315 101 -276 134 -315 b 230 -307 199 -315 215 -312 b 324 -256 264 -295 292 -275 b 180 -491 323 -383 266 -471 b 183 -459 180 -480 180 -469 b 184 -442 184 -454 184 -448 l 184 -436 b 135 -369 184 -403 170 -383 b 102 -363 125 -364 114 -363 b 29 -399 73 -363 45 -376 b 1 -556 -4 -448 6 -503 b 109 -670 -4 -625 43 -670 b 140 -667 118 -670 130 -668 b 253 -616 180 -658 213 -638 b 238 -688 248 -644 242 -665 b 192 -959 220 -779 192 -867 b 193 -992 192 -971 192 -981 b 210 -1024 194 -1014 199 -1024 b 233 -1015 216 -1024 223 -1021 z', + }, + dynamicPiano: { + x_min: -49, + x_max: 326.5019318364244, + y_min: -142, + y_max: 515, + ha: 657, + o: 'm -56 -204 b -42 -202 -52 -204 -46 -203 b -19 -194 -35 -202 -26 -197 b 147 -138 35 -170 91 -151 b 249 -58 194 -127 223 -95 b 262 -29 255 -50 262 -39 b 258 -17 262 -24 261 -20 b 232 -7 252 -10 242 -7 b 210 -12 225 -7 217 -9 b 125 -40 184 -23 157 -30 b 183 140 153 19 171 79 b 251 167 207 144 230 153 b 469 518 383 262 480 382 b 357 687 472 626 420 687 b 315 678 344 687 330 684 b 204 600 279 664 240 634 b 210 704 206 635 209 670 b 215 721 212 710 215 716 b 206 733 215 727 212 730 b 180 742 197 736 189 742 b 164 734 176 742 170 740 b 1 575 108 684 36 645 b -7 557 -1 569 -7 563 b -6 553 -7 556 -7 554 b 7 547 -3 547 3 547 l 17 547 b 82 575 43 547 59 567 l 82 452 b 56 46 82 317 81 180 b 17 -66 49 7 46 -36 b -62 -173 -13 -99 -37 -135 b -71 -192 -66 -179 -71 -184 b -68 -199 -71 -193 -69 -196 b -56 -204 -65 -203 -60 -204 z m 196 258 b 197 266 197 261 197 264 b 200 510 200 347 199 429 b 233 543 210 521 222 533 b 281 560 249 554 266 560 b 340 503 310 560 333 540 b 344 461 343 488 344 474 b 321 323 344 413 333 369 b 268 272 315 300 295 281 b 196 258 245 265 220 261 z', + }, + dynamicMezzo: { + x_min: -18, + x_max: 559, + y_min: -50, + y_max: 365, + ha: 415, + o: 'm 43 -71 b 160 19 86 -71 143 -26 b 230 264 189 99 200 184 b 282 363 243 297 259 327 b 287 320 285 347 287 333 b 284 279 287 305 285 292 l 249 -12 b 275 -43 248 -29 245 -43 b 395 45 321 -43 389 3 b 462 271 406 124 436 197 b 523 387 475 310 490 348 l 523 346 b 504 130 521 274 513 202 b 501 81 501 114 501 98 b 510 3 501 55 504 29 b 580 -72 521 -48 543 -72 b 625 -63 593 -72 608 -69 b 789 50 690 -43 744 -3 b 805 72 795 56 805 63 b 798 85 805 76 802 81 b 778 94 792 91 785 94 b 755 85 770 94 763 91 l 693 40 b 675 33 685 36 680 33 b 658 52 668 33 662 39 b 645 144 651 82 645 112 b 658 448 641 246 660 346 b 606 507 658 485 638 507 b 583 504 599 507 592 505 b 495 446 547 497 521 471 b 420 373 471 423 448 399 b 413 458 418 406 418 432 b 361 507 408 490 386 507 b 320 491 347 507 333 501 b 160 307 256 444 207 382 l 160 337 b 174 488 160 387 174 438 b 156 521 174 501 173 513 b 137 526 148 524 143 526 b 109 513 127 526 118 520 b -16 399 66 477 23 439 b -26 383 -20 395 -26 389 l -26 379 b -14 370 -24 372 -20 370 b -6 372 -12 370 -9 372 b 19 376 4 374 12 376 b 36 359 32 376 36 370 b 30 330 36 350 35 341 l 30 323 b 9 -35 23 203 17 85 b 43 -71 6 -65 19 -71 z', + }, + dynamicForte: { + x_min: -144, + x_max: 311.30112136775, + y_min: -115.3876295915697, + y_max: 504, + ha: 619.3876295915697, + o: 'm -101 -166 b 173 76 7 -153 150 -30 b 206 344 192 164 202 253 b 268 338 226 343 246 341 b 384 395 317 333 353 361 b 397 419 393 405 397 412 b 367 442 397 429 387 436 b 350 444 361 444 356 444 b 206 455 302 449 255 454 l 206 474 b 202 540 204 495 202 518 b 209 593 202 557 203 576 b 236 624 215 613 225 624 b 265 612 245 624 253 619 b 308 552 287 596 302 577 b 336 533 312 534 323 533 b 448 611 366 533 444 583 b 399 696 452 648 423 671 b 382 706 395 700 387 703 b 308 726 357 720 333 726 b 207 684 272 726 239 711 b 60 455 135 622 60 560 l 10 455 b -23 448 -1 455 -13 454 b -102 372 -55 426 -76 397 b -109 357 -108 367 -109 361 b -95 347 -109 353 -105 348 b -63 346 -84 346 -73 346 b 0 344 -43 344 -22 344 l 63 344 b 53 186 63 291 59 239 b 23 0 46 124 42 60 b -35 -60 10 -42 -6 -60 b -73 -52 -45 -60 -58 -58 b -91 -48 -79 -49 -85 -48 b -109 -53 -96 -48 -102 -49 b -199 -124 -143 -72 -168 -99 b -207 -137 -203 -128 -207 -132 b -194 -148 -207 -141 -203 -145 b -101 -166 -164 -160 -132 -168 z', + }, + dynamicRinforzando: { + x_min: -75, + x_max: 322.0960720195126, + y_min: -90, + y_max: 325, + ha: 415, + o: 'm 23 -130 b 40 -125 27 -130 33 -128 b 128 -9 81 -114 125 -53 b 145 200 132 62 141 130 b 148 238 147 212 148 225 b 308 321 184 291 245 321 b 363 314 325 321 344 318 b 377 310 369 312 373 310 b 384 311 380 310 382 310 b 464 415 410 317 464 389 b 446 433 465 429 455 429 b 390 445 428 441 409 445 b 305 429 361 445 334 438 b 167 346 252 413 202 393 b 153 325 163 338 158 333 b 148 438 154 363 151 399 b 121 468 147 456 134 468 b 101 458 115 468 108 465 b -63 310 46 409 -16 367 b -108 240 -78 289 -98 271 b 32 330 -50 256 -13 297 b 37 304 37 320 37 312 l 37 292 b 10 -101 27 161 20 30 b 23 -130 9 -120 12 -130 z', + }, + dynamicSforzando: { + x_min: 0, + x_max: 296, + y_min: 0, + y_max: 379, + ha: 379, + o: 'm 151 0 b 174 1 160 0 166 0 b 392 158 272 14 346 71 b 405 207 400 174 405 190 b 359 287 405 236 389 265 b 261 325 328 308 294 315 b 168 413 216 340 181 366 b 166 426 167 418 166 423 b 176 438 166 432 167 436 b 199 441 183 441 190 441 b 310 393 238 441 295 422 b 334 370 317 376 325 370 b 363 386 343 370 353 379 b 422 445 386 402 408 420 b 426 458 425 449 426 454 b 422 469 426 462 425 465 b 274 546 395 518 333 546 b 161 503 232 546 190 531 b 86 405 132 472 108 439 b 71 347 75 387 71 367 b 112 256 71 312 85 279 b 209 215 141 232 176 226 b 284 168 238 206 266 197 b 300 131 291 157 300 144 b 298 120 300 127 298 122 b 278 107 294 109 285 108 b 262 108 271 107 266 108 l 259 108 b 114 157 200 107 156 125 b 96 181 104 163 96 170 l 96 184 b 102 202 96 190 102 196 b 96 209 102 204 101 207 b 63 194 82 215 72 204 b 7 109 42 168 26 138 b 0 86 3 101 0 94 b 13 60 0 78 4 68 b 151 0 53 23 101 0 z', + }, + dynamicZ: { + x_min: -42.73880183193087, + x_max: 331, + y_min: 0, + y_max: 328, + ha: 328, + o: 'm -45 0 b -6 16 -32 0 -17 10 b 3 20 -3 16 0 19 b 144 60 49 48 96 60 b 284 22 190 60 238 46 b 348 4 305 10 327 4 b 461 75 393 4 435 30 b 468 91 464 81 467 86 b 456 104 468 95 465 99 b 287 173 402 131 348 167 b 239 176 271 174 255 176 b 168 174 217 176 194 174 b 367 340 236 236 298 294 b 459 423 402 363 432 392 b 477 454 467 431 475 442 b 474 462 477 456 475 459 b 454 472 469 469 462 472 b 432 468 446 472 439 469 b 356 448 406 461 380 455 b 210 422 307 433 258 422 b 109 442 177 422 144 428 b 94 445 104 444 99 445 b 69 433 85 445 76 442 b 27 390 56 419 39 406 b -9 343 16 373 -17 357 b 63 311 3 320 36 314 l 78 311 b 132 307 95 308 114 307 b 240 314 168 307 203 311 l 193 271 b -37 50 117 196 19 145 b -59 7 -46 36 -69 20 b -45 0 -55 3 -50 0 z', + }, + ornamentTrill: { + x_min: 1, + x_max: 551, + y_min: -18, + y_max: 539, + ha: 557, + o: 'm 321 612 b 190 602 278 605 235 605 l 190 638 b 187 693 190 652 190 667 b 161 776 184 717 193 776 b 137 747 150 776 137 766 b 130 654 135 716 131 685 l 130 596 l 52 588 b 4 539 23 585 7 570 b 1 477 3 530 1 500 b 3 448 1 461 3 448 l 3 452 b 53 432 6 436 23 432 b 134 435 75 432 102 433 b 151 117 138 328 147 223 b 170 13 153 82 157 46 b 209 -26 179 -10 193 -26 b 222 -22 213 -26 217 -24 b 269 -17 233 -16 253 -27 b 343 135 325 19 346 66 b 343 158 343 147 344 147 b 323 192 341 171 337 187 b 291 176 311 194 300 184 l 264 148 b 229 131 261 145 238 131 b 212 170 209 131 213 154 b 194 438 203 259 199 348 l 272 442 b 284 452 276 441 279 441 b 305 462 287 461 295 462 l 312 462 b 346 477 325 462 340 464 b 366 560 357 503 366 531 b 321 612 366 598 356 618 z m 759 588 b 711 560 749 592 733 570 b 588 500 671 541 631 521 b 583 533 586 514 586 524 b 560 576 577 549 577 572 b 517 550 541 582 528 564 b 416 423 482 508 452 462 b 382 353 392 397 384 370 b 387 305 380 341 386 318 b 392 275 389 295 392 285 b 409 243 393 262 393 243 b 431 262 419 243 425 255 b 521 373 459 298 488 333 b 523 354 521 366 523 360 b 520 337 523 346 521 340 b 508 295 513 323 508 310 b 530 102 508 279 524 122 b 549 66 533 88 530 66 b 577 99 563 66 572 84 b 580 131 580 109 580 121 l 580 302 b 600 347 580 318 582 337 b 701 392 632 364 665 384 b 793 518 785 409 793 435 b 759 588 793 559 785 576 z', + }, + ornamentTurn: { + x_min: 0, + x_max: 574, + y_min: 0, + y_max: 312, + ha: 312, + o: 'm 651 0 b 816 132 727 0 796 46 b 827 223 822 163 827 193 b 808 340 827 262 821 301 b 665 449 785 408 729 449 b 636 446 655 449 647 448 b 589 384 600 441 586 422 l 602 300 b 611 285 603 291 605 285 b 621 288 613 285 616 287 b 655 295 632 294 644 295 b 711 284 674 295 693 289 b 773 209 740 275 773 232 b 697 156 773 184 734 160 b 664 154 685 154 675 154 b 579 168 635 154 608 158 b 455 242 533 186 495 213 b 261 400 387 291 331 354 b 160 432 225 422 190 432 b 20 328 98 432 49 392 b 0 229 6 295 0 262 b 30 71 0 176 14 122 b 144 3 43 29 96 3 b 168 6 153 3 160 4 b 248 122 233 20 248 39 b 246 147 248 124 248 135 b 226 177 243 164 239 177 b 206 170 220 177 215 174 b 144 154 186 158 166 154 b 79 170 122 154 101 160 b 53 202 62 179 53 189 b 60 228 53 209 55 217 b 161 281 81 261 120 281 b 183 279 168 281 176 281 b 325 190 243 269 284 229 b 572 16 402 124 475 53 b 651 0 598 6 625 0 z', + }, + ornamentTurnSlash: { + x_min: 0, + x_max: 574, + y_min: -106, + y_max: 405, + ha: 511, + o: 'm 441 -153 b 456 -60 455 -118 456 -89 b 455 81 455 -14 455 33 b 572 14 491 55 530 30 b 651 -1 598 4 625 -1 b 816 131 727 -1 796 45 b 827 222 822 161 827 192 b 808 338 827 261 821 300 b 665 448 785 406 729 448 b 636 445 655 448 647 446 b 589 383 600 439 586 420 l 602 298 b 611 284 603 289 605 284 b 621 287 613 284 616 285 b 655 294 632 292 644 294 b 711 282 674 294 693 288 b 773 207 740 274 773 230 b 697 154 773 183 734 158 b 664 153 685 153 675 153 b 579 167 635 153 608 157 b 455 240 533 183 495 212 b 454 242 455 240 455 242 l 454 337 b 452 488 454 386 452 439 b 433 570 452 517 451 546 b 425 583 431 575 431 583 l 422 583 b 403 566 415 582 408 573 b 402 546 400 560 402 553 l 397 287 b 261 399 353 325 310 366 b 160 431 225 420 190 431 b 20 327 98 431 48 390 b 0 228 6 294 0 261 b 30 69 0 174 14 121 b 144 1 43 27 96 1 b 168 4 153 1 160 3 b 248 121 233 19 248 37 b 246 145 248 122 248 134 b 226 176 243 163 239 176 b 206 168 220 176 215 173 b 144 153 186 157 166 153 b 79 168 122 153 101 158 b 53 200 62 177 53 187 b 60 226 53 207 55 216 b 161 279 79 259 120 279 b 183 278 168 279 176 279 b 325 189 243 266 282 226 b 395 130 348 168 372 148 b 393 71 393 109 393 89 b 441 -153 390 -6 402 -78 z', + }, + ornamentMordent: { + x_min: 0, + x_max: 700, + y_min: 0, + y_max: 497, + ha: 497, + o: 'm 513 0 b 528 39 526 14 527 27 b 531 72 531 50 531 60 b 528 138 531 94 528 117 l 528 347 b 552 359 537 354 544 359 b 579 338 560 359 569 353 b 674 217 609 297 639 255 b 719 190 690 200 704 190 b 759 215 732 190 744 197 b 940 395 815 279 877 337 b 1001 490 968 422 986 455 b 1008 513 1004 495 1008 505 b 1002 524 1008 517 1007 521 b 968 516 994 530 978 524 b 960 508 965 513 963 510 b 798 356 900 464 848 410 b 778 341 791 347 783 341 b 757 354 772 341 765 346 b 661 475 720 392 690 432 b 611 517 644 504 629 517 b 563 498 598 517 583 511 b 527 471 550 490 539 481 l 527 570 b 492 716 526 619 523 671 b 472 677 480 704 472 694 b 465 399 474 585 468 491 b 439 366 456 387 448 376 b 384 320 415 336 399 320 b 330 367 369 320 354 336 b 325 376 328 369 327 373 b 226 490 291 413 265 456 b 189 505 213 500 202 505 b 157 491 177 505 167 500 b 0 229 75 420 0 346 b 1 202 0 220 0 212 b 22 215 12 203 16 209 b 124 327 55 252 89 289 b 147 343 132 337 140 343 b 171 323 156 343 164 336 b 266 197 196 276 232 236 b 337 157 291 170 314 157 b 410 207 361 157 386 174 b 461 274 428 229 444 252 b 462 166 461 238 461 202 b 513 0 465 108 487 55 z', + }, + ornamentShortTrill: { + x_min: 0, + x_max: 747, + y_min: 0, + y_max: 243, + ha: 243, + o: 'm 379 0 b 428 14 395 0 410 4 b 474 56 445 26 461 39 b 552 157 500 89 526 122 b 566 168 556 163 560 168 b 575 157 569 168 572 166 b 664 36 592 107 628 72 b 733 1 685 13 710 1 b 802 35 757 1 780 13 b 1007 249 871 105 940 177 b 1067 324 1028 272 1054 295 b 1076 340 1068 330 1076 334 b 1073 346 1076 341 1076 343 b 1057 350 1068 348 1063 350 b 1047 347 1053 350 1050 350 b 1001 310 1031 336 1015 324 l 857 157 b 844 143 852 153 848 143 b 835 150 841 143 838 144 b 757 242 815 186 780 209 b 685 298 739 268 713 284 b 641 310 670 305 655 310 b 590 288 625 310 608 304 b 497 179 554 256 527 215 b 480 164 490 170 485 164 b 462 179 474 164 469 168 b 372 295 436 220 405 258 b 278 344 346 324 312 344 b 199 310 252 344 226 334 b 92 196 161 274 128 233 b 0 24 46 148 23 89 b 42 48 22 27 32 37 b 156 168 84 85 114 132 b 196 192 174 184 186 192 b 228 158 206 192 215 181 b 312 36 252 114 282 75 b 379 0 331 12 354 0 z', + }, + ornamentTremblement: { + x_min: 0, + x_max: 982.17691453624, + y_min: 0, + y_max: 224, + ha: 224, + o: 'm 0 0 b 63 36 30 12 48 23 b 157 124 94 66 125 94 b 177 135 164 131 170 135 b 196 122 183 135 189 131 b 268 40 217 94 245 68 b 323 6 288 16 304 6 b 369 20 336 6 350 10 b 412 53 384 29 399 40 b 501 145 442 84 472 114 b 523 158 508 154 516 158 b 543 145 528 158 536 154 b 641 45 576 112 608 78 b 698 17 658 27 677 17 b 729 23 708 17 719 20 b 804 65 756 32 780 46 b 904 154 837 95 871 124 b 920 163 910 160 916 163 b 936 153 924 163 930 160 b 1024 60 965 121 996 92 b 1112 13 1053 29 1080 13 b 1184 39 1135 13 1158 22 b 1359 194 1248 84 1305 138 b 1413 301 1388 223 1403 261 b 1404 323 1417 315 1413 323 b 1391 320 1400 323 1395 321 b 1344 294 1375 314 1358 307 b 1224 186 1305 258 1269 216 b 1194 173 1212 179 1202 173 b 1165 193 1184 173 1175 179 b 1096 271 1145 222 1122 248 b 1001 318 1061 302 1031 318 b 903 268 969 318 937 301 b 806 186 871 239 841 210 b 782 174 796 179 789 174 b 756 193 773 174 765 180 b 652 291 729 232 693 266 b 596 308 634 302 615 308 b 530 278 573 308 552 298 l 415 168 b 393 157 408 161 400 157 b 373 171 387 157 380 161 b 305 245 353 197 330 222 b 248 276 285 266 266 278 b 189 245 229 276 210 266 b 81 144 156 209 120 174 b 0 0 33 109 26 56 z', + }, + ornamentPrecompAppoggTrill: { + x_min: -0.11067192132025548, + x_max: 1066, + y_min: -50, + y_max: 533.1706452421108, + ha: 583.1706452421108, + o: 'm 187 -46 b 213 -14 197 -37 204 -26 b 285 151 251 36 266 94 b 304 189 294 177 297 189 b 337 168 311 189 320 181 b 458 33 386 131 415 76 b 495 12 472 19 484 12 b 531 40 508 12 518 22 b 580 168 557 79 569 124 b 622 235 592 213 603 235 b 683 194 636 235 655 222 b 838 26 737 140 791 86 b 919 -33 860 -1 881 -39 b 984 53 960 -27 971 19 b 1022 156 998 86 1008 122 b 1054 190 1032 179 1041 190 b 1089 167 1063 190 1074 183 b 1208 32 1129 122 1171 78 b 1244 10 1221 17 1231 10 b 1273 22 1253 10 1263 14 b 1496 206 1352 78 1427 137 b 1535 310 1526 236 1535 272 b 1531 359 1535 325 1534 343 b 1496 343 1515 360 1506 351 l 1309 192 b 1269 167 1289 176 1279 167 b 1234 199 1260 167 1251 177 b 1122 324 1200 243 1168 289 b 1074 344 1106 337 1089 344 b 1014 301 1051 344 1030 328 b 952 144 985 252 971 197 b 933 121 946 128 940 121 b 910 137 927 121 920 125 b 850 210 888 161 870 186 b 687 369 799 266 750 325 b 631 390 665 383 647 390 b 567 327 602 390 580 369 b 527 199 554 284 543 242 b 508 168 520 179 514 168 b 482 192 503 168 495 177 b 353 328 444 240 405 292 b 312 343 338 338 324 343 b 266 297 292 343 276 327 b 204 125 248 239 232 180 b 143 79 193 102 173 79 b 92 122 117 79 105 102 b 81 154 86 131 84 143 b 48 423 59 242 50 333 b 45 544 46 464 45 504 b 53 730 45 606 48 668 b 40 768 55 744 52 766 b 13 730 19 770 14 747 b 0 514 7 658 -1 586 b 26 122 3 383 6 252 b 75 -36 35 66 40 10 b 134 -72 92 -59 112 -72 b 187 -46 151 -72 170 -63 z', + }, + ornamentPrecompSlideTrillDAnglebert: { + x_min: 0, + x_max: 1088, + y_min: -380, + y_max: 252, + ha: 632, + o: 'm 560 -539 b 439 -481 527 -497 484 -485 b 354 -461 409 -478 380 -477 b 131 -154 236 -389 161 -285 b 124 -98 127 -135 124 -117 b 196 55 124 -40 148 10 b 308 99 230 86 268 99 b 399 81 337 99 367 92 b 514 22 441 66 477 43 b 619 -30 567 -9 590 -30 b 719 17 642 -30 670 -16 b 861 131 769 52 818 88 b 899 150 874 144 887 150 b 936 117 913 150 926 138 b 965 43 948 94 956 68 b 1007 -1 973 24 978 -1 b 1048 30 1025 -1 1037 16 b 1070 65 1057 40 1064 52 b 1110 148 1084 92 1096 121 b 1145 190 1120 164 1120 190 b 1191 153 1169 192 1179 168 b 1256 29 1218 115 1231 68 b 1292 1 1267 10 1277 1 b 1320 10 1300 1 1309 4 b 1369 48 1339 19 1355 33 b 1515 196 1418 96 1464 148 b 1567 343 1558 238 1567 287 b 1555 363 1565 357 1562 363 b 1539 356 1551 363 1547 360 b 1433 268 1502 330 1466 301 b 1335 171 1401 236 1374 199 b 1310 163 1325 166 1318 163 b 1286 183 1302 163 1293 168 b 1218 311 1264 226 1247 272 b 1164 351 1200 337 1182 351 b 1110 308 1146 351 1128 337 b 1031 176 1084 265 1058 219 b 1015 161 1025 166 1021 161 b 999 179 1009 161 1005 167 b 955 279 985 213 973 248 b 913 307 943 300 930 307 b 887 302 904 307 896 305 b 852 281 874 298 863 291 b 693 167 804 236 747 204 b 612 140 667 150 639 140 b 549 157 592 140 570 145 b 403 220 503 181 452 202 b 271 248 360 236 315 248 b 179 229 239 248 209 242 b 0 -29 65 180 0 85 b 9 -104 0 -53 3 -78 b 397 -526 56 -317 183 -464 b 505 -547 432 -536 468 -547 b 560 -539 524 -547 541 -544 z', + }, + ornamentPrecompSlideTrillBach: { + x_min: 0, + x_max: 1185, + y_min: -380, + y_max: 465, + ha: 845, + o: 'm 624 -544 b 642 -528 638 -543 642 -537 b 639 -514 642 -524 642 -520 b 590 -444 629 -487 609 -467 b 523 -413 573 -422 553 -410 b 498 -415 514 -415 507 -415 b 399 -389 464 -415 431 -405 b 89 -157 281 -330 176 -255 b 72 -117 78 -144 72 -131 b 73 -101 72 -111 72 -107 b 187 186 91 3 147 91 b 246 230 200 216 222 230 b 300 209 262 230 281 223 b 456 48 359 163 403 101 b 540 -10 494 10 518 -10 b 625 59 566 -10 589 13 b 690 148 648 88 668 118 b 711 167 697 160 704 167 b 733 153 719 167 724 163 b 844 14 769 105 808 60 b 903 -42 873 -23 886 -42 b 973 -1 919 -42 937 -27 b 1008 33 986 7 996 20 b 1048 81 1021 48 1035 65 b 1050 37 1048 66 1050 52 b 1047 -24 1050 17 1048 -3 b 1038 -275 1038 -108 1040 -192 l 1037 -289 b 1045 -302 1037 -295 1038 -301 b 1068 -284 1056 -304 1064 -292 b 1084 -242 1076 -271 1081 -256 b 1099 -109 1096 -199 1099 -154 b 1106 158 1099 -19 1106 71 b 1128 187 1113 167 1120 177 b 1168 223 1143 212 1155 223 b 1210 193 1179 223 1191 213 b 1220 183 1214 190 1215 186 b 1329 36 1261 138 1292 84 b 1374 7 1345 16 1358 7 b 1411 20 1384 7 1395 12 b 1479 84 1437 37 1459 59 b 1610 235 1521 135 1564 186 b 1706 403 1655 282 1695 334 b 1614 346 1663 400 1637 373 b 1464 170 1564 287 1515 228 b 1440 150 1453 156 1447 150 b 1414 173 1433 150 1426 158 b 1283 336 1371 228 1333 288 b 1220 366 1261 356 1240 366 b 1148 318 1194 366 1169 350 b 1103 255 1133 297 1119 275 b 1097 301 1102 271 1100 285 b 1099 334 1099 312 1099 324 b 1092 428 1099 367 1094 397 b 1071 647 1087 501 1079 575 b 1058 670 1071 657 1071 670 b 1035 648 1047 670 1038 661 b 1018 516 1024 605 1015 560 b 1041 203 1025 412 1037 307 b 1043 180 1041 196 1043 187 b 992 127 1027 161 1009 143 b 965 111 981 117 972 111 b 936 132 955 111 946 120 b 829 268 900 179 867 225 b 760 317 801 301 780 317 b 691 258 739 317 719 297 b 605 147 664 219 641 177 b 589 138 599 141 593 138 b 572 148 583 138 579 141 b 415 317 520 206 467 261 b 327 372 390 343 366 366 b 300 373 317 373 308 373 b 154 295 239 373 190 348 b 55 138 120 243 85 192 b 0 -53 22 79 0 13 b 160 -317 0 -156 49 -252 b 209 -354 177 -327 192 -343 b 510 -531 305 -419 397 -495 b 593 -547 537 -540 564 -547 b 624 -544 603 -547 613 -546 z', + }, + ornamentPrecompTrillSuffixDandrieu: { + x_min: 0, + x_max: 1003, + y_min: -20, + y_max: 521, + ha: 541, + o: 'm 791 -16 b 844 33 812 -3 829 14 b 981 271 900 107 937 190 b 994 288 984 278 985 288 b 1009 269 1004 288 1007 278 b 1077 112 1034 217 1051 163 b 1158 43 1103 62 1129 43 b 1231 69 1179 43 1204 55 b 1348 189 1280 98 1315 143 b 1444 451 1407 271 1444 357 b 1431 547 1444 482 1440 514 b 1188 750 1401 665 1299 750 b 1158 747 1178 750 1168 749 b 1079 684 1119 742 1089 727 b 1063 632 1076 665 1071 648 b 1056 609 1058 622 1056 615 b 1071 599 1056 602 1060 599 b 1086 600 1076 599 1080 600 b 1130 605 1102 603 1116 605 b 1244 569 1171 605 1210 595 b 1349 346 1322 511 1349 433 b 1348 312 1349 334 1349 324 b 1289 197 1345 266 1325 228 b 1238 174 1270 181 1253 174 b 1188 215 1220 174 1202 187 b 1145 308 1172 245 1159 276 b 1096 413 1129 343 1120 382 b 1053 438 1084 431 1068 438 b 1011 413 1038 438 1022 431 b 955 324 989 384 971 354 b 850 127 920 258 886 192 b 838 112 847 121 842 112 b 824 128 828 109 825 121 b 802 193 815 150 809 171 b 730 400 779 264 766 337 b 688 431 719 420 703 431 b 647 403 674 431 660 422 b 606 338 632 383 619 361 b 513 167 575 282 546 223 b 480 122 503 150 498 122 b 452 171 459 122 459 153 b 420 255 442 199 432 228 b 337 408 399 308 380 364 b 276 436 317 428 297 436 b 215 397 253 436 230 423 b 23 72 148 289 81 184 b 0 29 17 59 0 40 b 7 17 0 23 1 20 b 59 58 26 7 46 39 b 190 276 111 127 143 206 b 216 301 202 292 207 301 b 245 279 223 301 232 294 b 311 166 278 248 292 206 b 367 16 331 117 346 65 b 402 -19 377 -7 387 -19 b 438 -4 412 -19 423 -13 b 518 88 474 17 495 55 b 628 284 562 150 592 216 b 657 223 648 266 651 243 b 717 13 677 154 696 84 b 755 -29 726 -16 737 -29 b 791 -16 765 -29 776 -24 z', + }, + ornamentPrecompDoubleCadenceUpperPrefix: { + x_min: 0, + x_max: 1246, + y_min: -30, + y_max: 296.0302860502196, + ha: 326.0302860502196, + o: 'm 360 -43 b 559 59 445 -43 503 7 b 698 236 615 111 652 179 b 714 248 704 243 710 248 b 727 235 719 248 721 243 l 848 42 b 883 12 860 22 870 12 b 917 32 891 12 903 19 b 946 62 927 42 939 50 b 1037 192 972 108 1009 147 b 1057 210 1044 204 1051 210 b 1076 190 1063 210 1068 203 l 1176 12 b 1215 -19 1188 -9 1201 -19 b 1250 -6 1225 -19 1237 -14 b 1284 27 1264 3 1274 16 b 1380 190 1323 78 1351 135 b 1395 210 1384 197 1385 210 b 1413 190 1405 210 1410 197 b 1508 40 1436 134 1467 85 b 1564 3 1529 14 1547 3 b 1617 32 1580 3 1597 12 b 1767 238 1678 92 1719 167 b 1794 310 1781 259 1791 282 b 1752 294 1776 317 1764 304 b 1656 164 1711 258 1689 206 b 1629 144 1646 151 1637 144 b 1603 161 1620 144 1613 150 b 1502 315 1562 207 1525 258 b 1452 357 1490 344 1470 357 b 1397 320 1431 357 1411 344 b 1316 170 1368 271 1345 219 b 1280 127 1306 154 1303 127 b 1244 171 1256 127 1254 154 b 1145 337 1210 226 1179 282 b 1110 363 1135 354 1122 363 b 1070 338 1097 363 1084 354 b 1050 311 1063 330 1057 320 b 959 181 1017 271 992 223 b 939 167 950 173 945 167 b 920 184 933 167 927 173 b 818 343 887 238 852 291 b 759 395 795 377 778 395 b 701 344 742 395 724 377 b 698 338 700 341 700 340 b 544 154 652 272 605 207 b 412 98 501 117 458 98 b 304 130 377 98 341 108 b 95 373 204 187 144 275 b 58 426 85 393 82 428 b 19 366 26 426 26 389 b 0 307 13 346 0 327 b 4 287 0 300 1 294 b 174 36 49 194 91 102 b 360 -43 230 -9 289 -43 z', + }, + ornamentPrecompDoubleCadenceUpperPrefixTurn: { + x_min: 0, + x_max: 1226, + y_min: -237, + y_max: 436, + ha: 673, + o: 'm 1279 -341 b 1293 -252 1293 -307 1295 -278 b 1277 36 1287 -156 1282 -59 l 1273 118 b 1318 176 1289 137 1303 157 b 1349 203 1332 193 1342 203 b 1378 168 1359 203 1367 192 b 1456 35 1401 122 1428 78 b 1511 -12 1476 3 1493 -12 b 1568 23 1526 -12 1544 0 b 1597 53 1578 32 1588 42 b 1705 186 1629 101 1669 143 b 1761 284 1728 216 1751 246 b 1765 300 1763 288 1765 295 b 1763 307 1765 302 1765 305 b 1737 302 1754 311 1744 308 b 1718 287 1729 298 1725 292 b 1598 145 1673 245 1637 194 b 1578 130 1590 135 1584 130 b 1557 147 1571 130 1565 135 b 1447 321 1516 202 1488 265 b 1403 351 1433 341 1417 351 b 1358 323 1388 351 1372 341 b 1269 209 1329 285 1299 248 b 1254 521 1264 314 1259 418 b 1228 616 1253 554 1247 588 b 1218 628 1224 621 1223 628 l 1215 628 b 1201 613 1210 626 1202 619 b 1200 600 1200 609 1200 605 l 1200 586 b 1211 348 1204 507 1207 428 b 1217 166 1214 288 1215 226 b 1202 181 1212 168 1208 174 b 1094 334 1168 233 1130 284 b 1048 366 1079 356 1064 366 b 1004 331 1034 366 1018 354 b 904 154 969 275 930 220 b 873 202 887 171 880 187 b 778 356 845 256 819 311 b 737 379 763 372 750 379 b 698 353 724 379 711 370 l 621 232 b 415 114 570 154 495 114 b 302 138 377 114 340 121 b 73 400 187 192 117 284 b 55 420 69 415 62 420 b 42 410 50 420 45 416 b 0 292 23 373 0 334 b 4 262 0 282 1 272 b 168 39 32 168 92 99 b 359 -26 225 -6 292 -26 b 585 76 446 -26 530 10 b 668 202 616 115 641 160 b 693 228 680 219 687 228 b 720 203 700 228 707 219 b 801 63 752 160 775 111 b 844 7 812 42 818 7 b 910 66 877 6 894 39 b 923 94 916 75 919 85 b 995 219 945 137 968 179 b 1025 184 1009 210 1017 197 b 1119 56 1054 141 1087 98 b 1166 20 1138 32 1152 20 b 1215 50 1181 20 1195 30 b 1221 56 1217 52 1218 55 b 1228 -163 1223 -17 1225 -89 b 1279 -341 1231 -223 1251 -278 z', + }, + ornamentPrecompTrillLowerSuffix: { + x_min: 0, + x_max: 833, + y_min: -309, + y_max: 319, + ha: 628, + o: 'm 778 -444 b 801 -445 785 -444 793 -445 b 1037 -338 894 -445 969 -397 b 1200 37 1149 -240 1200 -109 b 1084 406 1200 171 1172 300 b 1024 444 1064 431 1043 444 b 960 390 999 444 978 426 b 841 163 923 314 886 236 b 812 128 832 150 827 128 b 786 167 796 130 793 153 b 660 418 744 251 716 341 b 599 459 639 445 619 459 b 541 410 577 459 557 444 b 439 197 507 340 474 269 b 422 179 435 190 435 179 b 338 393 392 251 379 328 b 275 439 320 423 298 439 b 212 396 253 439 230 425 b 71 219 170 333 128 268 b 0 45 17 173 16 112 b 68 98 32 62 50 78 b 194 264 112 150 153 209 b 230 292 209 282 219 292 b 264 261 240 292 251 282 b 274 242 268 255 269 248 b 346 46 304 179 325 112 b 376 10 351 32 354 10 b 412 35 392 10 403 22 b 452 107 429 56 441 82 b 541 291 481 168 511 230 b 556 307 547 302 552 307 b 573 295 562 307 567 302 b 624 217 595 272 611 246 b 721 1 657 145 685 72 b 755 -27 732 -19 742 -27 b 786 -16 765 -27 775 -24 b 857 73 819 7 840 39 b 952 256 887 134 920 194 b 978 289 963 279 969 289 b 1009 262 985 289 994 281 b 1030 235 1017 253 1024 245 b 1110 -4 1071 161 1099 81 b 1116 -68 1113 -26 1116 -48 b 1009 -243 1116 -140 1090 -200 b 848 -291 956 -272 901 -291 b 730 -261 809 -291 770 -282 b 696 -248 714 -252 703 -248 b 671 -284 684 -248 678 -258 l 662 -312 b 657 -357 658 -330 657 -344 b 744 -439 657 -403 683 -425 z', + }, + brassScoop: { + x_min: -0.4444444444444445, + x_max: 312, + y_min: -390, + y_max: 28, + ha: 418, + o: 'm 0 -562 b 393 -256 171 -504 307 -412 b 449 -39 431 -189 449 -115 b 448 -1 449 -26 449 -14 b 433 40 446 14 448 40 b 408 -3 410 40 412 14 b 396 -66 403 -23 402 -46 b 45 -397 346 -243 209 -337 b 0 -451 13 -409 1 -423 b 0 -562 -1 -485 0 -520 z', + }, + brassDoitMedium: { + x_min: -0.32815253965710617, + x_max: 476.21251177608565, + y_min: -50, + y_max: 333.1535583875376, + ha: 383.1535583875376, + o: 'm 16 -72 b 27 -71 19 -72 23 -72 b 215 -33 89 -56 153 -48 b 521 114 327 -7 435 35 b 685 432 615 199 691 295 b 670 480 684 449 688 475 b 642 441 654 482 648 456 b 403 183 599 321 513 240 b 79 89 301 130 192 105 b 0 -1 -12 76 0 76 b 0 -50 0 -17 1 -33 b 16 -72 0 -65 3 -72 z', + }, + brassFallLipShort: { + x_min: 0, + x_max: 298, + y_min: -344, + y_max: 65, + ha: 409, + o: 'm 396 -495 b 420 -461 412 -487 418 -474 b 429 -382 428 -435 429 -409 b 426 -330 429 -364 428 -347 b 285 -6 410 -209 356 -104 b 98 94 239 59 173 94 b 39 86 79 94 58 92 b 0 49 20 81 0 73 l 0 -52 b 10 -69 0 -62 1 -69 b 20 -68 13 -69 16 -69 b 88 -56 45 -59 66 -56 b 261 -160 156 -56 213 -95 b 396 -495 333 -259 382 -369 z', + }, + brassLiftMedium: { + x_min: 0, + x_max: 807, + y_min: 0, + y_max: 838, + ha: 838, + o: 'm 50 0 b 55 1 52 0 53 0 b 58 23 65 7 59 16 b 55 58 56 36 55 48 b 130 117 55 99 75 112 b 220 213 202 121 220 141 b 315 308 220 289 238 308 l 336 308 b 408 380 393 310 406 321 b 461 452 409 438 416 452 b 485 451 468 452 477 451 b 569 510 531 448 556 464 b 573 543 572 520 572 531 b 657 619 580 605 595 618 b 698 621 670 619 684 619 b 788 700 749 625 778 649 b 798 778 792 726 793 752 b 873 857 806 841 809 845 b 985 950 927 867 973 887 b 1084 1047 1002 1035 1004 1034 b 1162 1128 1133 1056 1162 1087 b 1146 1182 1162 1145 1158 1164 b 1125 1207 1140 1191 1136 1207 l 1122 1207 b 1110 1191 1113 1205 1110 1198 b 1112 1174 1110 1185 1112 1178 b 1048 1110 1109 1126 1096 1113 b 1028 1109 1043 1110 1035 1109 b 939 1022 969 1102 948 1081 b 845 922 929 949 917 936 b 746 812 773 909 753 886 b 744 780 744 802 744 791 b 635 681 737 700 717 683 b 524 583 553 680 536 665 b 439 510 514 520 503 510 b 357 431 377 510 360 492 l 357 406 b 314 364 356 379 343 364 b 238 361 288 364 264 364 b 173 300 202 357 180 334 b 167 245 168 281 167 262 b 105 174 166 192 157 180 b 75 171 95 173 85 171 b 6 112 30 166 14 153 b 0 73 1 98 0 85 b 37 10 0 45 13 26 b 50 0 42 7 46 0 z', + }, + brassFallRoughMedium: { + x_min: 0, + x_max: 791, + y_min: 0, + y_max: 819, + ha: 819, + o: 'm 1117 0 b 1139 101 1129 26 1139 71 b 1138 121 1139 109 1139 115 b 1084 193 1125 171 1110 193 b 1044 183 1073 193 1060 189 b 1022 177 1035 179 1028 177 b 1007 209 1012 177 1008 186 b 876 324 1004 292 959 330 b 799 317 850 321 825 320 b 759 354 772 314 755 320 b 760 373 760 360 760 366 b 759 392 760 379 760 384 b 681 477 753 451 730 477 b 654 474 672 477 664 475 b 606 467 638 471 622 468 b 586 465 599 465 592 465 b 564 481 570 465 564 469 b 569 505 564 487 566 495 b 575 553 572 521 575 537 b 572 585 575 564 573 575 b 481 665 560 657 539 668 b 412 665 458 664 435 665 b 382 690 392 667 382 672 b 383 700 382 693 383 696 b 386 773 387 724 387 749 b 297 858 382 828 351 857 b 229 861 274 858 251 858 b 190 897 207 863 193 871 b 163 1012 186 936 180 976 b 79 1084 145 1050 124 1084 b 66 1083 75 1084 71 1083 b 43 1096 49 1081 43 1087 b 48 1112 43 1100 45 1106 b 53 1130 52 1119 53 1125 b 39 1169 53 1145 45 1158 b 26 1179 36 1175 30 1179 b 16 1171 22 1179 17 1176 b 0 1103 10 1149 0 1126 b 9 1067 0 1092 1 1079 b 91 1021 26 1031 52 1018 b 145 978 122 1024 141 1011 b 156 913 147 956 151 935 b 291 795 170 831 210 795 b 346 768 337 795 346 796 b 344 743 346 760 344 753 b 343 716 344 733 343 724 b 455 600 343 651 390 602 b 505 605 471 599 490 605 b 528 598 514 605 523 603 b 536 579 534 592 536 586 b 524 523 536 562 526 541 b 523 505 524 517 523 511 b 621 405 523 442 560 405 b 639 406 626 405 634 406 b 677 413 652 408 664 410 b 701 416 687 415 696 416 b 721 392 716 416 721 410 b 720 373 721 386 720 380 b 831 255 714 301 759 252 b 897 261 854 255 876 261 b 926 262 909 261 919 262 b 969 197 963 262 965 252 b 971 184 969 193 971 189 b 1031 115 979 137 998 115 b 1071 122 1043 115 1056 118 b 1096 130 1079 125 1086 127 b 1087 59 1094 107 1087 82 b 1117 0 1087 37 1094 17 z', + }, + brassBend: { + x_min: 0, + x_max: 381, + y_min: 0, + y_max: 367, + ha: 367, + o: 'm 298 0 b 472 50 359 0 418 14 b 537 135 501 71 530 92 b 543 216 543 163 543 190 l 543 266 b 544 308 543 281 543 295 b 549 433 546 354 549 395 b 543 507 549 459 547 482 b 533 528 541 516 544 528 b 511 508 524 528 514 520 b 508 478 510 498 508 488 b 504 318 507 425 504 372 b 505 264 504 300 505 282 b 446 181 505 220 484 199 b 294 150 396 160 344 150 b 92 194 226 150 158 167 b 45 269 62 207 45 230 b 46 359 46 300 46 328 b 37 497 46 405 45 451 b 27 523 36 507 37 523 b 4 498 14 524 6 513 b 3 481 3 492 3 487 b 0 409 1 456 0 433 b 4 228 0 348 4 288 b 3 177 4 210 4 194 b 68 53 1 125 20 84 b 200 10 108 27 154 17 b 298 0 233 4 266 0 z', + }, + brassMuteClosed: { + x_min: 0, + x_max: 274, + y_min: 0, + y_max: 260, + ha: 260, + o: 'm 203 0 b 209 1 206 0 207 0 b 216 13 215 4 216 9 l 215 27 l 215 153 b 216 161 216 156 216 158 b 372 164 268 163 318 164 b 395 184 383 164 395 166 l 395 189 b 357 229 392 209 386 229 b 219 228 311 229 265 228 l 223 310 b 209 357 225 328 219 344 b 189 374 203 364 197 374 b 184 373 187 374 186 373 b 177 359 179 372 177 366 l 177 348 l 173 222 l 39 222 b 0 206 12 222 0 219 b 10 174 0 199 3 189 b 46 157 19 157 30 157 b 108 160 68 158 88 160 b 171 161 130 161 150 161 l 167 58 b 184 16 167 40 171 26 b 203 0 192 12 196 0 z', + }, + brassMuteOpen: { + x_min: 1, + x_max: 313.01193341111656, + y_min: 0, + y_max: 309, + ha: 309, + o: 'm 265 0 b 451 189 363 7 452 88 l 451 215 b 348 383 441 285 405 343 b 209 445 288 426 248 445 b 84 379 168 445 132 420 b 69 364 79 373 73 369 b 1 213 30 323 1 275 b 230 0 1 88 94 0 z m 210 62 b 128 73 181 62 154 66 b 40 171 71 91 42 125 b 52 226 40 187 45 206 b 197 374 79 295 130 344 b 228 382 207 380 217 382 b 300 361 252 382 276 370 b 374 308 328 350 353 331 b 410 223 397 284 410 253 b 393 163 410 202 405 181 b 210 62 354 91 288 63 z', + }, + brassFlip: { + x_min: 0, + x_max: 402, + y_min: 0, + y_max: 361, + ha: 361, + o: 'm 579 0 b 511 153 579 68 557 117 b 52 504 359 271 206 387 b 29 520 45 510 39 520 b 20 517 26 520 23 518 b 0 477 3 510 0 494 l 0 125 b 17 20 1 92 1 56 b 40 84 37 40 40 60 b 42 287 40 151 42 219 l 42 363 z', + }, + brassJazzTurn: { + x_min: 0, + x_max: 646, + y_min: 0, + y_max: 212, + ha: 212, + o: 'm 310 0 b 367 33 327 0 344 10 b 389 55 374 40 382 49 b 490 145 423 85 456 114 b 507 154 495 151 501 154 b 524 144 513 154 517 151 b 598 72 547 120 575 98 b 700 24 625 42 662 24 b 765 43 721 24 744 30 b 893 147 812 72 855 105 b 930 212 910 166 923 186 b 912 215 923 213 917 215 b 871 199 896 215 883 209 b 812 153 852 183 832 167 b 789 144 805 148 796 144 b 773 156 782 144 776 147 b 691 251 757 199 720 222 b 603 301 658 282 631 301 b 527 258 580 301 556 288 b 420 156 494 222 455 190 b 399 143 412 147 405 143 b 377 157 392 143 386 147 b 259 282 340 200 300 242 b 219 305 245 298 232 305 b 177 279 204 305 192 297 b 55 127 137 228 95 177 b 0 52 36 104 20 79 b 14 50 6 50 10 50 b 53 66 32 50 45 58 b 115 131 75 88 98 108 b 135 148 124 143 130 148 b 157 132 141 148 148 143 b 252 33 186 96 219 65 b 310 0 275 12 292 0 z', + }, + brassSmear: { + x_min: 0, + x_max: 334, + y_min: 0, + y_max: 151, + ha: 151, + o: 'm 321 0 b 475 125 390 0 436 43 b 481 143 478 131 481 137 b 475 154 481 147 480 151 b 449 148 468 158 458 154 b 395 132 432 137 413 132 b 343 140 377 132 360 137 b 229 194 301 148 266 173 b 168 217 206 209 186 217 b 109 192 148 217 130 209 b 0 26 59 148 32 89 b 59 63 32 29 45 48 b 98 84 72 78 84 84 b 130 73 108 84 118 81 b 213 26 157 58 183 37 b 321 0 255 9 289 0 z', + }, + stringsDownBow: { + x_min: 0, + x_max: 306, + y_min: -0.09607201951262866, + y_max: 366, + ha: 366.09607201951263, + o: 'm 405 0 b 425 17 413 -1 420 9 b 439 66 435 32 439 48 b 441 268 439 137 441 202 b 436 412 441 314 439 361 l 435 413 b 423 469 435 436 431 456 b 344 508 406 501 373 501 b 204 527 298 520 251 527 b 60 498 156 527 108 518 b 7 438 32 485 10 468 l 7 426 b 4 337 7 396 7 367 b 0 140 0 272 0 206 b 1 42 0 107 0 73 b 13 3 1 27 -3 4 b 40 39 29 3 35 24 b 42 53 42 43 40 49 b 49 141 48 84 49 112 b 48 215 49 167 48 192 b 49 252 48 228 48 240 l 49 312 b 130 343 72 331 99 340 b 206 347 156 346 180 347 b 372 314 262 347 318 338 l 390 307 l 390 245 b 390 138 392 212 390 176 b 397 23 390 101 392 62 b 405 0 399 14 393 1 z', + }, + stringsUpBow: { + x_min: 0, + x_max: 219.2842808242076, + y_min: 0, + y_max: 489, + ha: 489, + o: 'm 151 0 b 184 42 170 12 180 26 b 297 554 223 212 261 382 b 315 690 305 598 318 645 b 304 704 315 697 311 704 b 276 670 288 704 282 697 b 157 131 236 490 196 311 l 157 144 b 73 526 134 276 104 396 b 30 677 60 576 52 638 b 13 694 26 684 22 694 b 0 674 9 694 0 691 l 0 671 b 10 603 3 649 6 626 b 105 174 42 461 72 317 b 150 0 117 117 128 58 z', + }, + stringsHarmonic: { + x_min: 0, + x_max: 191, + y_min: 0, + y_max: 202, + ha: 202, + o: 'm 143 0 b 275 122 217 0 275 53 b 127 291 275 206 202 291 b 0 154 63 291 0 222 b 143 0 0 76 71 0 z m 122 68 b 43 105 89 66 59 75 b 39 124 40 111 39 117 b 79 199 39 148 56 180 b 145 226 101 216 122 226 b 199 210 163 226 180 220 b 235 150 223 196 235 173 b 203 92 235 128 225 107 b 122 68 181 76 150 68 z', + }, + pluckedSnapPizzicatoAbove: { + x_min: 0, + x_max: 201, + y_min: 0, + y_max: 325, + ha: 325, + o: 'm 171 0 b 289 99 240 0 289 45 b 258 183 289 130 274 156 b 174 269 236 217 203 240 l 174 408 b 174 429 174 415 176 422 b 131 468 168 451 153 468 b 117 451 120 468 117 461 b 118 429 117 444 118 435 b 115 307 117 389 115 347 b 0 166 59 295 0 223 b 171 0 0 85 89 0 z m 134 55 b 52 131 84 55 52 85 b 115 233 52 179 81 209 b 114 192 114 220 114 206 b 174 120 114 137 114 137 l 174 228 b 233 148 200 207 223 183 b 236 130 235 143 236 135 b 197 72 236 105 223 85 b 134 55 177 60 157 55 z', + }, + pluckedSnapPizzicatoBelow: { + x_min: 0, + x_max: 211, + y_min: 0, + y_max: 307, + ha: 307, + o: 'm 145 7 b 163 0 153 3 158 0 b 173 23 170 0 173 7 l 173 140 l 170 140 l 170 163 l 171 163 b 206 170 179 164 193 166 b 304 287 264 186 304 233 b 281 354 304 308 297 333 b 118 442 240 412 186 439 b 0 324 69 442 0 370 b 115 176 0 266 55 202 l 115 56 b 145 7 114 33 125 19 z m 115 220 b 62 256 92 223 73 230 b 53 292 56 269 53 281 b 78 344 53 311 60 328 b 168 384 105 372 135 384 b 213 376 183 384 199 382 b 253 321 239 366 253 346 b 246 291 253 311 251 301 b 170 226 230 256 203 236 l 170 258 b 148 305 171 278 163 292 b 128 315 143 310 135 315 l 124 315 b 115 301 117 314 115 308 z', + }, + pluckedLeftHandPizzicato: { + x_min: 0, + x_max: 271, + y_min: 0, + y_max: 284, + ha: 284, + o: 'm 213 0 b 223 14 222 0 223 7 b 222 35 223 22 222 29 l 222 176 b 373 170 272 174 323 170 b 390 180 382 170 390 171 l 390 184 b 347 232 386 207 382 232 b 219 238 307 233 266 235 l 219 364 b 171 409 219 395 193 409 b 156 393 160 409 156 402 b 158 370 156 384 158 376 l 158 240 b 16 239 115 240 66 239 b 0 226 7 239 0 238 l 0 223 b 50 179 1 203 29 179 b 158 177 86 179 122 179 l 158 63 b 161 29 158 52 158 40 b 213 0 166 -1 194 1 z', + }, + keyboardPedalPed: { + x_min: 0, + x_max: 944, + y_min: -13, + y_max: 550, + ha: 563, + o: 'm 22 0 b 109 78 53 0 105 46 l 144 333 b 163 376 147 347 140 372 b 364 465 238 390 301 426 b 454 599 416 497 454 540 b 452 618 454 605 454 612 b 320 770 442 694 396 747 b 248 779 295 778 272 779 b 193 778 229 779 212 779 b 160 780 181 778 167 775 b 137 792 153 789 144 791 b 109 789 128 792 118 789 b 7 719 59 789 48 737 b 23 708 16 714 20 708 b 36 710 29 710 33 710 b 53 684 52 710 53 698 l 53 674 b 43 386 53 577 53 482 b 20 164 36 312 30 238 b 1 30 14 120 7 75 b 0 19 0 26 0 22 b 22 0 0 9 4 0 z m 171 425 b 156 442 160 425 156 429 b 157 475 157 452 157 464 b 164 602 161 517 164 560 b 161 698 164 635 163 667 b 184 729 161 720 167 729 l 193 729 b 348 563 278 719 348 641 b 346 539 348 554 347 547 b 171 425 328 459 229 422 z m 979 6 b 1008 13 986 6 995 9 b 1081 101 1047 29 1079 46 b 1116 449 1087 217 1104 333 b 1143 654 1123 518 1133 586 b 1148 685 1145 664 1148 675 b 1140 704 1148 693 1146 700 b 1107 716 1130 713 1119 716 b 1056 706 1092 716 1073 710 b 1037 671 1035 703 1038 685 b 1004 439 1025 595 1014 517 b 986 419 1001 428 999 419 b 979 419 985 419 982 420 b 935 426 965 423 949 425 b 795 376 884 426 838 405 b 664 153 714 323 664 249 b 665 130 664 145 665 138 b 753 29 671 65 704 29 b 815 40 773 29 792 33 b 975 147 873 65 923 101 b 965 45 971 108 968 76 b 979 6 963 17 966 6 z m 393 -17 b 634 145 494 16 579 52 b 638 160 636 151 638 156 b 625 168 638 166 634 168 b 621 167 624 168 622 168 b 524 118 582 164 544 160 b 495 79 517 104 505 92 b 435 33 471 49 452 33 b 380 96 416 33 397 55 b 369 145 373 114 369 131 b 442 225 369 186 395 213 b 468 232 451 228 459 229 b 654 344 539 255 606 285 b 677 395 667 360 677 376 b 672 415 677 402 675 408 b 612 459 661 442 639 455 b 589 461 602 461 592 461 b 348 328 500 461 409 408 b 269 120 302 268 269 199 b 379 -19 269 45 318 -19 b 393 -17 383 -19 389 -19 z m 395 240 b 494 383 418 300 452 344 l 521 405 b 544 419 528 409 536 418 b 554 415 547 419 550 418 b 570 383 564 406 570 396 l 570 379 b 552 331 570 360 562 344 b 395 240 511 285 462 253 z m 827 89 b 792 111 815 89 804 96 b 766 204 775 131 766 158 b 845 360 772 256 799 314 b 871 372 854 369 863 372 b 897 366 880 372 888 369 b 978 279 942 353 963 320 b 976 259 981 272 981 265 b 858 104 942 203 909 147 b 827 89 847 94 837 89 z m 1282 12 b 1336 35 1303 14 1320 23 b 1359 71 1351 45 1359 58 b 1338 102 1359 82 1352 95 b 1254 130 1312 118 1284 130 b 1187 88 1223 130 1202 109 b 1178 65 1182 81 1178 72 b 1195 37 1178 55 1182 45 b 1282 12 1223 23 1253 19 z', + }, + keyboardPedalUp: { + x_min: 0, + x_max: 436.6015132318337, + y_min: 0, + y_max: 461, + ha: 461, + o: 'm 330 0 b 334 1 331 0 333 0 b 340 12 338 4 340 7 l 338 26 b 340 264 338 105 338 184 b 526 95 400 206 461 148 b 559 71 536 88 547 71 b 564 72 560 71 563 71 b 580 121 580 79 580 102 l 580 127 b 543 203 585 158 573 184 b 472 259 518 219 495 238 l 445 285 b 590 292 494 288 541 291 b 622 318 609 294 618 302 b 628 359 625 331 626 346 b 586 402 632 393 621 405 b 464 395 546 399 504 396 l 559 491 b 567 524 567 500 567 510 b 564 543 567 527 567 536 b 539 596 559 563 560 590 b 494 564 521 600 508 577 b 340 413 442 514 390 464 l 340 560 b 287 664 340 600 321 632 b 271 518 274 612 272 566 b 268 445 269 494 269 469 b 117 569 219 488 168 530 b 96 579 109 575 102 579 b 85 560 89 579 85 573 b 124 446 85 518 82 477 b 209 380 153 426 181 403 b 45 374 154 377 99 376 b 0 324 9 374 0 359 b 63 266 0 265 1 265 b 144 272 89 269 117 272 l 196 272 b 108 193 167 246 138 219 b 60 135 76 164 60 151 b 99 73 60 121 73 105 b 104 68 101 72 102 71 b 114 58 107 60 111 58 b 130 66 120 58 124 62 b 259 186 173 107 217 145 b 256 117 259 163 256 140 b 311 13 256 72 271 37 b 330 0 317 10 323 0 z', + }, + pictChokeCymbal: { + x_min: 1, + x_max: 147, + y_min: 0, + y_max: 242, + ha: 242, + o: 'm 79 4 b 207 158 153 32 192 88 b 212 200 210 173 212 187 b 143 336 212 253 187 298 b 98 348 131 344 115 348 b 4 295 60 348 16 327 b 1 276 1 289 1 282 b 9 249 1 266 3 258 b 121 183 35 206 72 183 b 156 186 132 183 144 183 b 26 53 134 115 91 73 b 7 39 13 49 7 45 b 19 20 7 33 12 27 b 59 0 30 9 43 0 b 79 4 65 0 72 1 z', + }, + wiggleArpeggiatoUp: { + x_min: -22, + x_max: 300, + y_min: 0, + y_max: 176, + ha: 176, + o: 'm 173 4 b 196 0 180 1 189 0 b 246 26 215 0 230 9 b 301 117 271 53 285 85 b 312 131 305 125 307 131 b 327 124 315 131 321 128 b 373 86 341 112 353 101 b 412 69 389 75 402 69 b 432 94 425 69 432 79 b 373 181 432 117 413 154 b 235 252 323 216 285 245 b 220 253 229 253 225 253 b 168 215 196 253 181 240 b 111 112 151 180 140 141 b 94 102 105 105 99 102 b 78 111 89 102 84 105 b 0 181 55 135 35 160 b -32 153 -20 194 -32 168 b 0 86 -32 124 -32 109 b 94 36 22 71 73 46 b 173 4 134 16 131 17 z', + }, + arpeggiatoUp: { + x_min: 0, + x_max: 262, + y_min: 0, + y_max: 1459, + ha: 1459, + o: 'm 190 0 b 160 63 187 29 170 45 b 145 108 150 81 145 95 b 183 163 145 128 157 145 b 300 246 222 190 262 216 b 347 318 333 272 347 295 b 301 393 347 341 331 364 b 258 413 289 403 272 408 b 145 449 220 425 183 436 b 117 464 135 452 120 452 b 140 491 115 477 128 484 b 294 593 192 526 243 557 b 330 647 318 611 330 626 b 314 693 330 660 324 675 b 262 736 302 714 285 729 b 170 763 230 744 200 753 b 122 783 153 768 125 768 b 160 831 120 804 143 818 b 288 922 202 861 246 890 b 333 999 318 945 333 972 b 266 1083 333 1032 310 1064 b 189 1115 240 1094 215 1103 b 122 1178 145 1133 122 1153 b 168 1250 122 1200 138 1223 l 180 1257 b 269 1333 210 1283 240 1306 b 305 1405 294 1356 305 1381 b 284 1469 305 1426 298 1447 b 228 1525 269 1492 251 1511 b 183 1600 197 1545 183 1571 b 190 1640 183 1613 184 1626 b 197 1670 193 1650 194 1660 b 272 1735 213 1719 230 1735 b 295 1734 279 1735 287 1735 b 323 1732 305 1732 314 1732 b 350 1731 333 1732 341 1732 b 377 1742 369 1729 377 1732 b 370 1761 377 1747 374 1754 l 301 1898 b 217 2066 274 1954 248 2012 b 186 2101 204 2089 196 2101 b 154 2069 177 2101 167 2091 b 12 1824 105 1987 59 1907 b 0 1787 4 1810 0 1797 b 59 1744 0 1761 20 1745 b 160 1738 92 1744 125 1740 b 145 1692 156 1721 151 1706 b 135 1633 138 1672 135 1652 b 184 1518 135 1591 151 1552 b 229 1475 199 1503 213 1488 b 259 1431 249 1456 259 1444 b 229 1388 259 1420 249 1407 b 151 1325 203 1365 177 1345 b 105 1279 134 1310 118 1296 b 73 1202 84 1251 73 1227 b 108 1123 73 1176 85 1152 b 255 1031 148 1077 199 1051 b 282 1014 274 1025 282 1021 b 262 991 282 1008 275 1001 b 151 914 226 963 189 939 b 79 851 125 896 99 877 b 63 809 69 837 63 824 b 79 769 63 796 68 783 b 202 697 111 729 154 710 b 266 670 225 690 266 688 b 210 622 266 648 232 635 b 82 534 167 593 120 570 b 55 491 63 518 55 505 b 79 448 55 478 63 465 b 255 361 127 395 192 380 b 288 343 269 359 288 357 b 266 312 288 331 275 320 b 144 223 229 278 184 253 b 85 134 104 193 85 166 b 118 53 85 111 96 85 b 190 0 135 29 160 14 z', + }, + arpeggiatoDown: { + x_min: 0, + x_max: 218, + y_min: 0, + y_max: 1440, + ha: 1440, + o: 'm 161 16 b 310 261 210 98 259 180 b 314 275 312 266 314 271 b 302 295 314 282 310 289 b 252 311 287 308 269 311 b 217 310 240 311 229 310 b 190 333 202 310 194 315 b 151 412 186 363 171 389 b 102 501 120 452 102 477 b 150 588 102 524 118 547 b 161 603 154 592 158 598 b 181 661 176 622 181 641 b 173 704 181 675 179 690 b 86 795 156 746 121 770 b 53 829 63 811 53 819 b 78 868 53 840 62 851 b 102 888 85 876 94 883 b 180 956 128 912 156 933 b 216 1028 204 979 216 1002 b 203 1081 216 1044 212 1061 b 115 1171 186 1123 148 1145 b 75 1221 88 1191 75 1207 b 114 1272 75 1237 88 1251 b 173 1308 132 1284 154 1296 b 226 1339 190 1318 209 1328 b 265 1405 253 1359 265 1380 b 258 1447 265 1418 264 1431 b 154 1541 242 1499 199 1521 b 109 1581 124 1555 109 1567 b 141 1627 109 1594 121 1608 b 204 1680 163 1646 184 1662 b 233 1742 223 1699 233 1719 b 226 1777 233 1752 230 1764 b 135 1862 210 1822 173 1840 b 104 1895 114 1875 104 1884 b 118 1930 104 1904 109 1914 b 192 2006 135 1961 161 1986 b 206 2029 203 2013 206 2022 b 192 2064 206 2040 197 2052 b 180 2074 187 2071 184 2074 b 156 2061 171 2074 163 2065 b 84 1983 125 2040 102 2013 b 65 1921 71 1961 65 1941 b 88 1853 65 1899 72 1876 b 171 1784 108 1820 138 1801 b 190 1764 184 1777 190 1770 b 174 1741 190 1757 184 1750 b 107 1683 153 1722 128 1704 b 68 1610 81 1659 68 1636 b 88 1548 68 1591 75 1571 b 177 1470 109 1512 141 1489 b 223 1431 209 1453 223 1443 b 179 1390 223 1420 209 1408 b 128 1361 163 1380 145 1371 b 71 1322 108 1348 88 1338 b 32 1253 45 1300 32 1277 b 48 1198 32 1236 37 1218 b 147 1090 71 1152 108 1120 b 174 1057 166 1076 174 1067 b 153 1022 174 1047 167 1037 b 109 982 140 1008 124 995 b 37 919 85 962 59 942 b 9 860 17 899 9 880 b 26 806 9 844 14 827 b 120 717 50 769 84 740 b 138 691 132 708 138 700 b 130 668 138 684 135 677 b 92 618 118 651 105 635 b 59 531 71 589 59 560 b 84 455 59 507 68 481 b 132 386 98 431 115 408 b 148 341 144 372 148 357 b 144 317 148 333 147 324 b 121 305 140 307 131 305 l 98 305 b 82 304 94 304 88 304 l 32 304 b 0 292 10 304 0 302 b 12 266 0 287 4 279 b 60 164 32 233 46 199 b 127 20 84 117 105 68 b 144 0 132 9 137 0 b 161 16 150 0 154 4 z', + }, + repeat1Bar: { + x_min: 0, + x_max: 599.1057280164835, + y_min: -250, + y_max: 175, + ha: 425, + o: 'm 216 98 b 255 75 236 84 246 75 b 291 104 265 75 274 85 b 323 147 304 117 327 125 b 289 215 323 168 314 184 b 238 252 269 239 253 252 b 187 222 222 252 207 242 b 173 206 183 216 177 212 b 157 170 163 194 157 183 b 174 138 157 160 161 150 b 216 98 189 127 200 109 z m 76 -334 b 181 -285 111 -315 148 -302 b 831 52 396 -168 613 -58 b 863 114 855 63 864 82 b 828 202 855 140 855 176 b 808 213 821 209 815 213 b 793 209 804 213 799 212 l 422 19 b 26 -179 291 -48 164 -124 b 0 -213 10 -186 0 -196 b 3 -232 0 -219 0 -225 b 52 -325 14 -265 37 -294 b 66 -337 55 -331 59 -337 b 76 -334 69 -337 72 -336 z m 769 -360 b 829 -264 779 -360 829 -284 b 769 -176 822 -232 799 -200 b 742 -163 760 -167 750 -163 b 716 -184 733 -163 723 -168 b 683 -228 708 -202 693 -213 b 672 -253 675 -236 672 -245 b 683 -281 672 -262 675 -271 b 752 -353 703 -308 732 -327 b 769 -360 756 -357 763 -360 z', + }, + repeat2Bars: { + x_min: 0.008571918423331715, + x_max: 775, + y_min: -246.92374029115243, + y_max: 362.82068246705313, + ha: 609.7444227582056, + o: 'm 909 412 b 873 351 906 384 893 367 b 436 50 729 249 585 147 l 91 -179 b 62 -174 76 -189 68 -183 b 12 -96 48 -147 24 -125 b 36 -16 -7 -53 -6 -43 b 220 104 96 24 158 65 b 819 507 425 232 624 369 b 881 495 852 530 861 528 b 909 412 899 469 900 439 z m 333 338 b 302 240 330 307 317 274 b 276 235 297 225 287 228 l 233 269 b 203 376 186 307 183 318 b 225 441 212 397 217 419 b 246 454 228 452 232 458 b 333 338 284 441 333 380 z m 1116 228 b 1067 158 1115 192 1092 174 b 910 59 1015 125 963 92 b 478 -240 762 -33 622 -140 b 311 -350 423 -279 366 -314 b 285 -344 298 -360 289 -356 b 239 -258 272 -314 251 -288 b 261 -196 228 -228 235 -210 b 517 -29 348 -144 436 -91 b 1030 321 681 98 861 202 b 1093 307 1060 343 1076 340 b 1116 228 1107 281 1109 252 z m 1070 -105 b 1020 -210 1057 -143 1038 -176 b 998 -210 1014 -219 1004 -215 l 924 -153 b 913 -88 899 -135 897 -112 b 949 -22 926 -66 939 -45 b 998 -7 960 6 976 9 b 1070 -105 1032 -32 1058 -63 z', + }, + repeat4Bars: { + x_min: 0, + x_max: 1374, + y_min: -304, + y_max: 304, + ha: 608, + o: 'm 78 -266 b 92 -258 82 -266 88 -264 b 114 -240 98 -251 107 -246 b 638 107 289 -125 467 -14 b 873 271 716 161 793 216 b 907 337 894 285 906 305 b 887 400 901 354 897 379 b 852 438 877 426 867 438 b 814 420 842 438 829 432 b 135 -33 592 262 366 111 b 12 -121 92 -60 48 -84 b 0 -144 4 -128 0 -135 b 4 -160 0 -148 1 -154 b 63 -255 17 -196 45 -223 b 78 -266 68 -262 72 -266 z m 291 148 b 325 223 302 148 308 170 b 333 256 328 235 330 246 b 264 363 330 305 298 336 b 242 373 255 369 248 373 b 220 347 232 373 225 364 b 202 288 216 327 213 305 b 190 252 193 275 190 262 b 222 200 190 232 202 215 b 291 148 264 170 279 148 z m 815 -367 b 829 -359 819 -367 824 -364 b 851 -343 835 -353 844 -347 b 1375 6 1027 -228 1205 -117 l 1610 170 b 1644 235 1632 184 1643 203 b 1626 300 1639 253 1634 276 b 1590 337 1614 325 1604 337 b 1551 320 1580 337 1567 330 b 873 -135 1329 161 1103 10 b 749 -222 829 -161 785 -184 b 737 -245 742 -230 737 -238 b 742 -261 737 -249 739 -255 b 802 -357 755 -297 782 -325 b 815 -367 805 -363 809 -367 z m 396 -360 b 408 -356 400 -360 403 -359 b 609 -223 471 -307 543 -269 b 896 -19 706 -156 795 -81 b 1164 154 985 37 1074 96 b 1214 223 1189 170 1211 187 b 1176 321 1204 253 1205 292 b 1159 330 1169 327 1165 330 b 1145 324 1155 330 1151 328 b 1048 258 1113 302 1081 278 b 357 -202 809 117 598 -65 b 333 -238 341 -212 333 -223 b 338 -262 333 -245 334 -253 b 384 -350 350 -294 372 -318 b 396 -360 386 -354 390 -360 z m 1162 -438 b 1174 -433 1166 -438 1169 -436 b 1374 -300 1237 -384 1309 -346 b 1660 -96 1470 -233 1561 -158 b 1930 76 1751 -39 1840 19 b 1979 147 1954 92 1977 109 b 1943 243 1968 177 1971 216 b 1924 253 1935 251 1930 253 b 1911 248 1920 253 1915 252 b 1814 181 1878 225 1848 202 b 1123 -279 1575 40 1364 -141 b 1099 -315 1106 -289 1099 -300 b 1103 -338 1099 -321 1100 -330 b 1149 -426 1115 -370 1138 -396 b 1162 -438 1151 -432 1156 -438 z m 1875 -295 b 1882 -291 1878 -295 1879 -294 b 1934 -189 1904 -258 1921 -223 b 1872 -96 1925 -147 1901 -120 b 1840 -78 1858 -84 1848 -78 b 1812 -109 1830 -78 1823 -88 l 1777 -173 b 1770 -199 1773 -181 1770 -190 b 1786 -230 1770 -210 1774 -220 b 1862 -289 1809 -253 1837 -269 b 1875 -295 1865 -292 1871 -295 z', + }, + repeatBarSlash: { + x_min: 0, + x_max: 630, + y_min: -225.19160170741762, + y_max: 265.12618221237005, + ha: 490.31778391978764, + o: 'm 78 -324 b 92 -314 82 -325 88 -321 b 114 -298 96 -307 107 -302 b 638 49 289 -183 467 -72 b 873 215 716 104 792 161 b 907 279 894 229 906 248 b 887 344 901 298 897 321 b 852 382 877 369 867 380 b 814 363 842 383 829 376 b 135 -91 603 192 364 55 b 12 -177 92 -118 45 -137 b 0 -202 4 -186 0 -192 b 4 -217 0 -206 1 -212 b 63 -312 17 -253 42 -284 b 78 -324 68 -318 72 -323 z', + }, + csymDiminished: { + x_min: 0, + x_max: 506, + y_min: -0.011036179317259481, + y_max: 500, + ha: 500.0110361793173, + o: 'm 397 0 b 729 265 576 -1 729 95 b 711 367 729 297 723 331 b 472 670 668 498 586 595 b 315 720 423 701 372 720 b 253 713 295 720 275 719 b 32 514 144 687 75 615 b 0 374 12 468 0 420 b 27 251 0 333 9 292 b 140 117 52 196 92 153 b 397 0 223 52 317 4 z m 340 95 b 132 314 233 84 122 216 b 324 589 145 438 200 539 b 415 611 360 603 389 611 b 544 505 469 611 505 576 b 590 392 564 471 583 432 b 596 343 593 374 596 359 b 340 95 596 210 485 96 z', + }, + csymHalfDiminished: { + x_min: -32, + x_max: 496, + y_min: -33, + y_max: 492, + ha: 525, + o: 'm -29 -48 b 0 -36 -19 -48 -9 -40 b 17 -20 7 -32 12 -24 b 134 94 56 19 95 56 b 372 0 207 43 282 0 b 455 13 397 0 426 4 b 677 258 556 45 671 141 b 678 289 677 268 678 278 b 593 539 678 380 654 467 b 592 541 593 540 592 540 l 684 632 b 713 678 700 647 711 665 b 714 691 714 684 714 688 b 707 704 714 698 711 701 b 691 708 701 707 696 708 b 660 691 680 708 670 701 l 552 585 b 478 634 530 606 507 624 b 361 684 438 648 397 661 b 301 703 341 697 320 703 b 226 677 275 703 251 693 b 27 449 140 618 72 543 b 0 324 9 410 -4 370 b 88 128 -1 243 30 177 b -30 -7 43 86 0 46 b -46 -33 -35 -16 -46 -24 b -42 -42 -46 -36 -45 -39 b -29 -48 -37 -46 -33 -48 z m 141 179 b 121 251 128 200 121 225 b 128 297 121 265 124 281 b 351 575 163 420 248 505 b 377 582 359 579 369 580 b 501 536 422 586 468 567 b 141 179 382 416 261 298 z m 281 105 b 179 137 240 105 206 117 b 210 168 189 147 200 157 l 537 487 b 547 455 541 477 544 467 b 556 370 552 426 556 397 b 429 154 556 274 503 207 b 281 105 384 122 336 105 z', + }, + csymAugmented: { + x_min: 0, + x_max: 530, + y_min: 0, + y_max: 539, + ha: 539, + o: 'm 380 0 b 393 14 384 4 390 9 b 397 46 397 24 397 36 l 397 333 b 736 327 511 331 624 330 b 763 343 755 327 763 333 b 755 361 763 348 760 354 b 635 431 726 402 688 431 l 390 431 l 390 485 b 386 606 392 526 386 566 b 392 664 386 625 387 645 b 395 690 393 672 395 681 b 376 753 395 711 389 734 b 357 776 372 762 369 776 b 350 775 354 776 353 776 b 327 740 337 769 327 759 b 327 621 328 700 327 661 b 330 438 328 559 328 498 l 29 438 b 4 431 20 438 7 442 b 0 413 3 425 0 419 b 7 399 0 408 1 403 b 131 338 45 369 85 340 b 331 334 199 336 265 334 b 333 163 333 276 333 220 b 366 13 333 109 348 63 b 380 0 367 7 374 4 z', + }, + csymMajorSeventh: { + x_min: 0, + x_max: 593.1050509327923, + y_min: 0, + y_max: 569, + ha: 569, + o: 'm 124 1 l 497 27 b 819 50 605 35 711 43 b 854 98 847 52 855 63 b 812 200 845 128 835 166 b 564 585 730 328 648 456 b 435 786 521 652 480 720 b 397 819 419 809 408 819 b 369 792 387 819 379 811 b 7 173 248 585 128 379 b 0 150 3 166 0 158 b 7 128 0 143 3 135 b 89 10 30 86 65 50 b 109 0 95 1 102 0 z m 163 147 b 153 153 158 147 156 148 b 164 179 147 163 158 170 b 426 644 251 334 338 488 b 442 660 432 655 436 660 b 458 645 446 660 452 655 b 727 220 547 503 636 361 b 736 202 732 213 736 206 b 714 190 736 196 730 192 b 179 148 537 177 359 163 b 163 147 174 150 168 147 z', + }, + csymMinor: { + x_min: 0, + x_max: 481.64484584675915, + y_min: 193, + y_max: 265.20435472429375, + ha: 72.20435472429375, + o: 'm 168 278 b 197 279 177 278 187 278 b 431 292 275 287 353 288 l 431 291 b 661 302 508 295 585 300 b 693 311 672 304 688 300 b 674 346 697 324 685 338 b 564 382 641 366 606 384 l 27 360 b 0 347 17 360 1 366 b 19 314 0 333 3 321 b 168 278 66 291 115 278 z', + }, + csymParensLeftTall: { + x_min: 0, + x_max: 185, + y_min: 0, + y_max: 1034, + ha: 1034, + o: 'm 215 0 b 226 17 223 1 223 10 b 229 37 229 24 229 32 b 220 81 229 52 225 66 b 167 203 206 124 181 160 b 86 616 124 338 89 474 b 82 765 85 665 82 716 b 91 886 82 805 84 845 b 245 1319 120 1038 171 1184 b 266 1397 259 1346 266 1371 b 259 1443 266 1411 264 1427 b 226 1489 253 1463 248 1489 b 193 1454 212 1489 203 1467 b 114 1292 158 1404 140 1346 b 0 806 40 1138 0 978 b 3 721 0 779 0 750 b 1 677 1 707 1 693 b 36 418 1 593 16 504 b 144 96 62 307 95 199 b 196 12 158 66 179 39 b 212 0 200 7 204 0 z', + }, + csymParensRightTall: { + x_min: -40, + x_max: 188.5411603861406, + y_min: 0.20204102886728756, + y_max: 1058, + ha: 1057.7979589711326, + o: 'm 30 1 b 63 14 42 -3 55 6 b 122 99 86 40 108 68 b 189 258 145 153 166 204 b 271 667 239 379 268 503 b 246 852 275 708 261 780 b 10 1495 197 1077 128 1295 b -14 1524 4 1505 1 1524 b -16 1522 -14 1524 -16 1524 b -46 1489 -33 1521 -43 1503 b -58 1417 -53 1464 -58 1440 b -36 1335 -58 1390 -52 1364 b 68 1138 0 1270 35 1204 b 163 883 108 1056 137 969 b 206 668 184 814 200 742 b 207 631 207 655 207 642 b 166 426 207 560 192 492 b 46 143 130 330 111 228 b 19 29 19 109 17 69 b 30 1 20 19 24 3 z', + }, + csymBracketLeftTall: { + x_min: 0, + x_max: 328, + y_min: 2, + y_max: 807, + ha: 805, + o: 'm 68 3 b 76 4 71 3 73 3 b 186 13 112 12 150 13 b 240 13 204 13 222 13 l 287 13 b 379 17 317 13 348 13 b 472 121 435 24 472 69 b 467 156 472 132 469 144 b 446 174 462 168 456 174 l 439 174 b 327 166 402 167 364 166 b 265 167 307 166 285 167 l 209 167 b 187 475 199 269 189 372 b 166 985 186 645 187 815 l 377 1002 b 415 1001 389 1002 402 1001 b 456 1027 432 1001 448 1005 b 472 1096 467 1048 472 1073 b 464 1146 472 1113 469 1130 b 439 1162 459 1161 452 1162 b 40 1129 305 1151 173 1139 b 1 1093 17 1128 1 1120 b 0 1009 0 1064 0 1037 b 13 975 0 991 3 981 b 30 670 23 873 30 772 b 29 608 30 649 29 628 l 29 563 b 56 88 29 405 49 246 b 53 22 55 66 55 43 b 68 3 53 12 56 3 z', + }, + csymBracketRightTall: { + x_min: 0.8519422934604696, + x_max: 306, + y_min: -0.17180889215212544, + y_max: 829.1037519824849, + ha: 829.2755608746371, + o: 'm 117 0 b 372 29 203 -3 287 20 l 373 29 b 406 32 383 30 395 30 b 436 60 428 33 432 43 b 441 109 439 76 441 92 b 433 200 441 140 436 170 b 409 696 422 366 409 530 b 416 887 409 763 416 831 b 415 920 416 899 415 910 l 415 1106 b 412 1135 415 1116 415 1126 l 412 1145 b 373 1189 413 1171 408 1192 b 321 1189 356 1189 338 1189 l 215 1189 l 215 1194 l 56 1194 b 6 1153 27 1195 10 1187 b 1 1064 3 1123 4 1093 b 22 1043 0 1050 6 1043 b 84 1044 42 1044 63 1044 b 264 1038 144 1044 203 1040 b 265 958 264 1011 265 985 b 262 845 265 920 264 883 b 259 710 259 801 259 755 b 279 243 259 554 271 399 b 285 170 281 219 284 194 b 95 151 222 161 158 156 b 29 81 27 147 27 147 l 29 73 b 105 0 33 0 33 0 z', + }, + csymParensLeftVeryTall: { + x_min: 0, + x_max: 116, + y_min: 0, + y_max: 934.1531437146923, + ha: 934.1531437146923, + o: 'm 128 0 b 147 17 137 0 144 9 b 167 102 160 45 167 73 b 158 154 167 120 164 137 b 117 307 141 204 130 256 b 63 698 84 435 71 567 b 62 788 62 729 62 757 b 69 916 62 829 63 873 b 109 1172 81 1001 94 1087 b 132 1320 118 1221 137 1269 b 124 1345 131 1329 134 1342 b 96 1332 114 1346 102 1341 b 71 1269 82 1313 75 1292 b 39 1104 59 1214 48 1159 b 0 742 19 988 0 871 b 10 559 3 688 6 624 b 58 226 16 446 33 336 b 112 20 73 157 94 89 b 128 0 115 13 118 0 z', + }, + csymParensRightVeryTall: { + x_min: -20, + x_max: 111.4332498248095, + y_min: -0.07657185734616112, + y_max: 1009, + ha: 1009.0765718573462, + o: 'm -3 0 b 20 22 9 -1 14 12 b 36 56 26 33 32 45 b 99 274 58 128 84 199 b 160 788 135 439 163 605 b 122 1181 164 912 145 1047 b 50 1431 108 1267 86 1351 b 36 1453 48 1439 46 1453 l 35 1453 l 30 1453 b 7 1423 17 1449 7 1440 b 27 1287 9 1377 10 1331 b 96 963 71 1184 85 1074 b 105 818 102 914 105 867 b 91 624 105 753 99 688 b -4 213 72 484 48 344 b -29 101 -19 174 -29 138 b -16 27 -29 76 -24 52 b -3 0 -13 17 -14 3 z', + }, + csymDiagonalArrangementSlash: { + x_min: -0.19862981551275186, + x_max: 990, + y_min: -26.946823529189132, + y_max: 1027.5514326488437, + ha: 1054.4982561780328, + o: 'm 14 -37 b 58 -9 35 -45 46 -22 b 392 333 170 105 279 217 l 765 711 b 1372 1329 968 916 1168 1125 b 1424 1439 1403 1359 1417 1397 b 1426 1457 1424 1444 1426 1450 b 1416 1477 1426 1466 1423 1475 b 1374 1462 1400 1485 1385 1473 b 1181 1269 1309 1397 1246 1331 b 736 831 1031 1122 884 979 b 356 452 609 704 485 576 b 32 132 246 347 143 236 b 0 50 7 109 1 84 b 6 9 -1 37 3 23 b 14 -37 10 -9 0 -32 z', + }, + accidentalNarrowReversedFlat: { + x_min: 0, + x_max: 208, + y_min: -231, + y_max: 449, + ha: 680, + o: 'm 272 -333 b 284 -320 278 -333 281 -328 b 300 -174 297 -272 300 -222 b 275 190 298 -52 279 68 b 268 445 272 275 268 360 l 268 490 b 264 612 269 530 265 572 b 236 647 264 632 252 645 l 235 647 b 217 618 220 647 220 628 b 207 526 210 588 207 556 b 210 432 207 494 210 464 b 216 268 213 377 215 323 l 216 230 l 215 232 b 154 256 194 240 174 251 b 111 264 138 261 124 264 b 3 153 50 264 10 223 b 0 94 0 132 0 114 b 194 -276 0 -63 68 -186 b 255 -323 215 -291 236 -307 b 272 -333 262 -330 268 -333 z m 233 -138 b 71 30 168 -92 105 -45 b 63 59 65 42 63 50 b 96 95 62 75 73 86 b 130 102 108 99 120 102 b 215 76 160 102 187 88 l 220 73 b 225 -22 220 42 222 10 b 233 -138 229 -62 230 -101 z', + }, + accidentalNarrowReversedFlatAndFlat: { + x_min: 0, + x_max: 335, + y_min: -231, + y_max: 449, + ha: 680, + o: 'm 151 490 b 148 612 151 530 150 572 b 132 647 148 632 141 645 b 122 618 124 647 124 628 b 117 526 118 588 117 556 b 118 432 117 494 118 464 b 121 268 120 377 121 323 l 121 232 b 86 256 109 240 98 251 b 62 264 78 261 69 264 b 1 153 29 264 6 223 b 0 94 0 132 0 114 b 109 -276 0 -63 37 -186 b 144 -323 121 -291 132 -307 b 153 -333 147 -330 151 -333 b 160 -320 157 -333 158 -328 b 168 -174 167 -272 168 -222 b 154 190 168 -52 157 68 b 151 445 153 275 151 360 z m 480 153 b 372 264 472 223 432 264 b 328 256 359 264 344 261 b 268 232 308 251 288 240 l 266 230 l 266 268 b 272 432 266 323 269 377 b 275 526 272 464 275 494 b 265 618 275 556 272 588 b 248 647 262 628 262 647 l 246 647 b 219 612 230 645 219 632 b 215 490 217 572 213 530 l 215 445 b 207 190 215 360 210 275 b 183 -174 203 68 183 -52 b 199 -320 183 -222 186 -272 b 210 -333 202 -328 204 -333 b 228 -323 215 -333 220 -330 b 288 -276 246 -307 268 -291 b 482 94 415 -186 482 -63 b 480 153 482 114 482 132 z m 40 30 b 36 59 36 42 36 50 b 55 95 35 75 42 86 b 73 102 60 99 68 102 b 121 76 89 102 105 88 l 124 73 b 127 -22 124 42 125 10 l 131 -138 b 40 30 95 -92 60 -43 z m 419 59 b 412 30 419 50 418 42 b 249 -138 374 -43 314 -92 b 258 -22 252 -101 253 -62 b 262 73 261 10 262 42 l 268 76 b 353 102 295 88 323 102 b 386 95 363 102 374 99 b 419 59 409 86 420 75 z', + }, + accidentalWilsonPlus: { + x_min: 0, + x_max: 298, + y_min: -218, + y_max: 218, + ha: 436, + o: 'm 232 -314 b 236 -301 236 -310 236 -305 l 236 -295 b 243 -52 239 -213 242 -132 l 369 62 b 429 200 413 101 425 147 b 416 243 429 216 428 236 b 383 225 406 251 393 232 l 377 220 b 246 98 336 177 291 138 b 249 242 248 145 246 193 b 225 304 251 265 242 287 b 209 314 220 308 215 314 b 204 312 207 314 206 312 b 196 292 196 310 196 300 b 193 184 194 256 194 220 b 187 48 192 140 190 94 b 46 -72 141 7 94 -32 b 0 -163 13 -98 0 -127 b 1 -187 0 -170 0 -179 b 10 -235 4 -203 6 -219 b 20 -255 12 -242 14 -251 b 36 -245 26 -259 30 -249 b 181 -109 85 -200 132 -154 b 176 -258 180 -158 176 -209 b 232 -314 176 -298 186 -307 z', + }, + accidentalWilsonMinus: { + x_min: 0, + x_max: 284.2093390143919, + y_min: -163, + y_max: 163, + ha: 326, + o: 'm 386 -232 b 409 -163 415 -222 408 -180 b 382 -69 410 -120 408 -89 b 32 228 264 30 141 118 b 17 235 26 233 22 235 b 3 219 9 235 3 228 b 0 157 3 199 0 179 b 29 69 0 125 6 95 b 323 -194 115 -29 222 -111 b 374 -235 338 -206 353 -235 b 386 -232 377 -235 382 -233 z', + }, + }, + fontFamily: 'Petaluma', + resolution: 1000, + generatedOn: '2021-12-06T21:04:23.441Z', +}; + + +/***/ }), + +/***/ "./src/fonts/petaluma_metrics.ts": +/*!***************************************!*\ + !*** ./src/fonts/petaluma_metrics.ts ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "PetalumaMetrics": () => (/* binding */ PetalumaMetrics) +/* harmony export */ }); +/** + * The Petaluma font was created by Steinberg Media. + * https://github.com/steinbergmedia/petaluma + */ +const PetalumaMetrics = { + name: 'Petaluma', + smufl: true, + stave: { + padding: 15, + endPaddingMax: 15, + endPaddingMin: 7, + unalignedNotePadding: 12, + }, + accidental: { + noteheadAccidentalPadding: 1, + leftPadding: 2, + accidentalSpacing: 3, + }, + clef: { + default: { + point: 32, + width: 26, + }, + small: { + point: 26, + width: 20, + }, + annotations: { + '8va': { + smuflCode: 'timeSig8', + default: { + point: 18, + treble: { + line: -1.4, + shiftX: 12, + }, + }, + small: { + point: 16, + treble: { + line: -0.2, + shiftX: 8, + }, + }, + }, + '8vb': { + smuflCode: 'timeSig8', + default: { + point: 18, + treble: { + line: 6, + shiftX: 10, + }, + bass: { + line: 3.5, + shiftX: 1, + }, + }, + small: { + point: 16, + treble: { + line: 5.3, + shiftX: 6, + }, + bass: { + line: 3.1, + shiftX: 0.5, + }, + }, + }, + }, + // These may no longer be necessary + lineCount: { + '8': { point: 55, shiftY: 14 }, + '7': { point: 47, shiftY: 8 }, + '6': { point: 32, shiftY: 1 }, + '5': { point: 30, shiftY: -6 }, + '4': { point: 23, shiftY: -12 }, + }, + }, + parenthesis: { + default: { + point: 39, + width: 7, + }, + gracenote: { + point: (39 * 3) / 5, + width: 3, + }, + }, + pedalMarking: { + up: { + point: 40, + }, + down: { + point: 34, + }, + }, + // These are for numeric digits, such as in time signatures + digits: { + // used by timesig + shiftLine: -1, + point: 22, + // used by tuplets + tupletPoint: 16, + shiftY: -2, + }, + articulation: { + articStaccatissimoAbove: { + padding: 2, + }, + articStaccatissimoBelow: { + padding: 2, + }, + }, + tremolo: { + default: { + point: 25, + spacing: 5, + offsetYStemUp: -5, + offsetYStemDown: 5, + offsetXStemUp: 13, + offsetXStemDown: 1, + }, + grace: { + point: 18, + spacing: 4, + offsetYStemUp: -5, + offsetYStemDown: 5, + offsetXStemUp: 8, + offsetXStemDown: 1, + }, + }, + staveRepetition: { + default: { + offsetY: 25, + offsetSymbol: 12, + spacing: 5, + }, + }, + noteHead: { + displaced: { + shiftX: -2, + }, + }, + stem: { + heightAdjustmentForFlag: -3, + // These are stem (Y) offsets to the note heads. To shift the + // noteheads (x-position) themselves, see glyphs.notehead.custom. + noteHead: { + noteheadTriangleUpHalf: { + offsetYBaseStemUp: 5, + offsetYBaseStemDown: 4, + }, + noteheadTriangleUpBlack: { + offsetYBaseStemUp: 5, + offsetYBaseStemDown: 4, + }, + noteheadTriangleUpWhole: { + offsetYBaseStemUp: 5, + offsetYBaseStemDown: 4, + }, + noteheadXHalf: { + offsetYBaseStemUp: -4, + offsetYBaseStemDown: 4, + }, + noteheadXBlack: { + offsetYBaseStemUp: -4, + offsetYBaseStemDown: 4, + }, + noteheadXWhole: { + offsetYBaseStemUp: -4, + offsetYBaseStemDown: 4, + }, + noteheadHalf: { + offsetYBaseStemDown: 1.8, + offsetYBaseStemUp: -1.8, + }, + noteheadBlack: { + offsetYBaseStemDown: 2, + offsetYBaseStemUp: -2, + }, + noteheadSquareWhite: { + offsetYBaseStemDown: -5, + offsetYBaseStemUp: 5, + }, + }, + }, + // Values under here are used by the Glyph class to reposition and rescale + // glyphs based on their category. This should be the first stop for + // custom font glyph repositioning. + // + // The glyph loader first looks up a specific set of settings based on the + // glyph code, and if not found, uses the defaults from the category. See + // glyphs.textNote for an example of this. + // + // Details in Glyph.lookupFontMetrics. + glyphs: { + coda: { + point: 20, + shiftX: -7, + shiftY: 8, + }, + segno: { + shiftX: -7, + }, + flag: { + shiftX: -0.77, + flag16thUp: { + shiftX: -0.75, + }, + flag32ndUp: { + shiftX: -0.85, + }, + flag64thUp: { + shiftX: -1.55, + }, + flag128thUp: { + shiftX: -1.3, + }, + flag16thDown: { + shiftX: -0.75, + }, + flag32ndDown: { + shiftX: -0.76, + }, + flag64thDown: { + shiftX: -1.5, + }, + flag128thDown: { + shiftX: -1.2, + }, + tabStem: { + shiftX: -1.75, + }, + staveTempo: { + shiftX: -1, + }, + }, + clef: { + gClef: { + default: { scale: 1.1, shiftY: 1 }, + small: { shiftY: 1.5 }, + }, + fClef: { + default: { shiftY: -0.5 }, + }, + }, + ornament: { + ornamentTurn: { + scale: 1.2, + }, + ornamentTurnSlash: { + scale: 1.2, + }, + }, + stringNumber: { + verticalPadding: 8, + stemPadding: 2, + leftPadding: 5, + rightPadding: 6, + }, + stroke: { + arrowheadBlackDown: { + straight: { + shiftX: -4.5, + }, + wiggly: { + shiftX: -1, + shiftY: 1, + }, + }, + arrowheadBlackUp: { + straight: { + shiftX: -0.85, + }, + wiggly: { + shiftX: -1, + shiftY: 1, + }, + }, + }, + textNote: { + point: 34, + breathMarkTick: { + point: 36, + shiftY: 9, + }, + breathMarkComma: { + point: 36, + }, + segno: { + point: 30, + shiftX: -7, + shiftY: 8, + }, + coda: { + point: 20, + shiftX: -7, + shiftY: 8, + }, + ornamentTrill: { + shiftX: -10, + shiftY: 8, + }, + ornamentMordent: { + shiftX: -8, + }, + ornamentShortTrill: { + shiftX: -8, + }, + }, + noteHead: { + minPadding: 2, + standard: { + noteheadBlackStemUp: { + shiftX: 0.5, + }, + noteheadHalfStemUp: { + shiftX: 0.725, + }, + noteheadWholeStemUp: { + shiftX: 1, + }, + }, + custom: { + noteheadCircleXStemUp: { + shiftX: -1, + }, + noteheadCircleXStemDown: { + shiftX: 0.25, + }, + noteheadDiamondHalfStemUp: { + shiftX: 1.5, + }, + noteheadDiamondBlackStemUp: { + shiftX: 1.5, + }, + noteheadDiamondWholeStemUp: { + shiftX: 1, + }, + noteheadXBlackStemUp: { + shiftX: 1, + }, + noteheadXHalfStemUp: { + shiftX: -3, + }, + noteheadXHalfStemDown: { + shiftX: 1, + }, + noteheadXWholeStemUp: { + shiftX: -7, + }, + noteheadXWholeStemDown: { + shiftX: 1, + }, + noteheadSquareWhiteStemDown: { + shiftX: 0.25, + }, + noteheadSquareWhiteStemUp: { + shiftX: -0.75, + }, + noteheadSquareBlackStemUp: { + shiftX: -0.75, + }, + noteheadTriangleUpWholeStemUp: { + shiftX: -0.75, + }, + }, + }, + chordSymbol: { + global: { + superscriptOffset: -400, + subscriptOffset: 300, + kerningOffset: -150, + lowerKerningText: ['D', 'F', 'P', 'T', 'V', 'Y'], + upperKerningText: ['L'], + spacing: 20, + superSubRatio: 0.73, + }, + csymDiminished: { + scale: 0.8, + leftSideBearing: -95, + advanceWidth: 506, + yOffset: 0, + }, + csymHalfDiminished: { + scale: 0.8, + leftSideBearing: -32, + advanceWidth: 506, + yOffset: 0, + }, + csymAugmented: { + scale: 1, + leftSideBearing: -25, + advanceWidth: 530, + yOffset: 0, + }, + csymParensLeftTall: { + scale: 0.8, + leftSideBearing: 0, + advanceWidth: 155, + yOffset: 150, + }, + csymParensRightTall: { + scale: 0.8, + leftSideBearing: 40, + advanceWidth: 189, + yOffset: 150, + }, + csymBracketLeftTall: { + scale: 0.8, + leftSideBearing: 0, + advanceWidth: 328, + yOffset: 0, + }, + csymBracketRightTall: { + scale: 0.8, + leftSideBearing: 1, + advanceWidth: 600, + yOffset: 0, + }, + csymParensLeftVeryTall: { + scale: 0.95, + leftSideBearing: 0, + advanceWidth: 210, + yOffset: 250, + }, + csymParensRightVeryTall: { + scale: 0.9, + leftSideBearing: -100, + advanceWidth: 111, + yOffset: 250, + }, + csymDiagonalArrangementSlash: { + scale: 0.6, + leftSideBearing: -1, + advanceWidth: 990, + yOffset: 0, + }, + csymMinor: { + scale: 0.7, + leftSideBearing: 0, + advanceWidth: 482, + yOffset: 0, + }, + csymMajorSeventh: { + scale: 0.8, + leftSideBearing: 100, + yOffset: 0, + advanceWidth: 600, + }, + accidentalSharp: { + scale: 0.7, + leftSideBearing: 0, + advanceWidth: 425, + yOffset: -422, + }, + accidentalFlat: { + scale: 0.8, + leftSideBearing: -10, + advanceWidth: 228, + yOffset: -284, + }, + }, + jazzOrnaments: { + brassScoop: { + scale: 1.0, + xOffset: -12, + yOffset: 0, + stemUpYOffset: 0, + reportedWidth: 10, + }, + brassDoitMedium: { + scale: 1.0, + xOffset: 16, + yOffset: 0, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassFallLipShort: { + scale: 1.0, + xOffset: 16, + yOffset: 0, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassLiftMedium: { + scale: 1.0, + xOffset: 16, + yOffset: 5, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassFallRoughMedium: { + scale: 1.0, + xOffset: 16, + yOffset: 26, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassBend: { + scale: 1.0, + xOffset: 3, + yOffset: -8, + stemUpYOffset: 28, + reportedWidth: 5, + }, + brassMuteClosed: { + scale: 1.0, + xOffset: 3, + yOffset: -8, + stemUpYOffset: 26, + reportedWidth: 5, + }, + brassMuteOpen: { + scale: 1.0, + xOffset: 4, + yOffset: -8, + stemUpYOffset: 27, + reportedWidth: 5, + }, + brassFlip: { + scale: 1.0, + xOffset: 10, + yOffset: -4, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassJazzTurn: { + scale: 1.0, + xOffset: 6, + yOffset: -4, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassSmear: { + scale: 1.0, + xOffset: 10, + yOffset: -4, + stemUpYOffset: 0, + reportedWidth: 5, + }, + }, + tuplet: { + noteHeadOffset: 20, + stemOffset: 10, + bottomLine: 4, + topModifierOffset: 20, + }, + }, +}; + + +/***/ }), + +/***/ "./src/fonts/petalumascript_glyphs.ts": +/*!********************************************!*\ + !*** ./src/fonts/petalumascript_glyphs.ts ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "PetalumaScriptFont": () => (/* binding */ PetalumaScriptFont) +/* harmony export */ }); +const PetalumaScriptFont = { + spacing: 50, + glyphs: { + ' ': { + x_min: 0, + x_max: 250, + y_min: 0, + y_max: 500, + ha: 500, + leftSideBearing: 0, + advanceWidth: 250, + }, + '0': { + x_min: 33, + x_max: 534, + y_min: -13, + y_max: 751, + ha: 764, + leftSideBearing: 33, + advanceWidth: 570, + }, + '1': { + x_min: 48, + x_max: 235, + y_min: -17, + y_max: 734, + ha: 751, + leftSideBearing: 48, + advanceWidth: 286, + }, + '2': { + x_min: 56, + x_max: 571, + y_min: -19, + y_max: 741, + ha: 760, + leftSideBearing: 56, + advanceWidth: 626, + }, + '3': { + x_min: 50, + x_max: 528, + y_min: -7, + y_max: 731, + ha: 738, + leftSideBearing: 50, + advanceWidth: 589, + }, + '4': { + x_min: 38, + x_max: 564, + y_min: -13, + y_max: 743, + ha: 756, + leftSideBearing: 38, + advanceWidth: 614, + }, + '5': { + x_min: 42, + x_max: 601, + y_min: -34, + y_max: 743, + ha: 777, + leftSideBearing: 42, + advanceWidth: 648, + }, + '6': { + x_min: 47, + x_max: 606, + y_min: -16, + y_max: 743, + ha: 759, + leftSideBearing: 47, + advanceWidth: 667, + }, + '7': { + x_min: 47, + x_max: 567, + y_min: 5, + y_max: 739, + ha: 734, + leftSideBearing: 0, + advanceWidth: 615, + }, + '8': { + x_min: 40, + x_max: 541, + y_min: -15, + y_max: 752, + ha: 767, + leftSideBearing: 40, + advanceWidth: 585, + }, + '9': { + x_min: 40, + x_max: 537, + y_min: -52, + y_max: 736, + ha: 788, + leftSideBearing: 40, + advanceWidth: 592, + }, + '!': { + x_min: 49, + x_max: 180, + y_min: -7, + y_max: 761, + ha: 768, + leftSideBearing: 49, + advanceWidth: 230, + }, + '"': { + x_min: 39, + x_max: 304, + y_min: 596, + y_max: 804, + ha: 208, + leftSideBearing: 39, + advanceWidth: 353, + }, + '#': { + x_min: 33, + x_max: 599, + y_min: -8, + y_max: 765, + ha: 773, + leftSideBearing: 33, + advanceWidth: 648, + }, + $: { + x_min: 53, + x_max: 495, + y_min: -111, + y_max: 823, + ha: 934, + leftSideBearing: 53, + advanceWidth: 560, + }, + '%': { + x_min: 35, + x_max: 656, + y_min: -128, + y_max: 808, + ha: 936, + leftSideBearing: 35, + advanceWidth: 711, + }, + '&': { + x_min: 53, + x_max: 441, + y_min: -3, + y_max: 753, + ha: 756, + leftSideBearing: 53, + advanceWidth: 500, + }, + "'": { + x_min: 43, + x_max: 161, + y_min: 590, + y_max: 811, + ha: 221, + leftSideBearing: 43, + advanceWidth: 217, + }, + '(': { + x_min: 41, + x_max: 311, + y_min: -36, + y_max: 845, + ha: 881, + leftSideBearing: 41, + advanceWidth: 308, + }, + ')': { + x_min: -8, + x_max: 257, + y_min: -21, + y_max: 852, + ha: 873, + leftSideBearing: -8, + advanceWidth: 280, + }, + '*': { + x_min: 59, + x_max: 539, + y_min: 175, + y_max: 589, + ha: 414, + leftSideBearing: 59, + advanceWidth: 601, + }, + '+': { + x_min: 33, + x_max: 361, + y_min: 180, + y_max: 587, + ha: 407, + leftSideBearing: 33, + advanceWidth: 400, + }, + ',': { + x_min: 15, + x_max: 176, + y_min: -129, + y_max: 92, + ha: 221, + leftSideBearing: 15, + advanceWidth: 205, + }, + '-': { + x_min: 40, + x_max: 380, + y_min: 317, + y_max: 452, + ha: 135, + leftSideBearing: 40, + advanceWidth: 422, + }, + '.': { + x_min: 48, + x_max: 185, + y_min: -56, + y_max: 84, + ha: 140, + leftSideBearing: 48, + advanceWidth: 227, + }, + '/': { + x_min: -58, + x_max: 654, + y_min: -122, + y_max: 844, + ha: 966, + leftSideBearing: -58, + advanceWidth: 626, + }, + ':': { + x_min: 65, + x_max: 225, + y_min: 97, + y_max: 536, + ha: 439, + leftSideBearing: 65, + advanceWidth: 302, + }, + ';': { + x_min: 13, + x_max: 295, + y_min: -139, + y_max: 536, + ha: 675, + leftSideBearing: 13, + advanceWidth: 334, + }, + '<': { + x_min: 28, + x_max: 438, + y_min: -1, + y_max: 607, + ha: 608, + leftSideBearing: 28, + advanceWidth: 475, + }, + '=': { + x_min: 40, + x_max: 383, + y_min: 199.9598640852289, + y_max: 541, + ha: 341.0401359147711, + leftSideBearing: 40, + advanceWidth: 422, + }, + '>': { + x_min: 35, + x_max: 421, + y_min: 28, + y_max: 632, + ha: 604, + leftSideBearing: 35, + advanceWidth: 466, + }, + '?': { + x_min: 45, + x_max: 548, + y_min: -17, + y_max: 767, + ha: 784, + leftSideBearing: 45, + advanceWidth: 592, + }, + '@': { + x_min: 51, + x_max: 730, + y_min: -78, + y_max: 753, + ha: 831, + leftSideBearing: 51, + advanceWidth: 781, + }, + A: { + x_min: 37, + x_max: 554, + y_min: -4, + y_max: 746, + ha: 750, + leftSideBearing: 37, + advanceWidth: 617, + }, + B: { + x_min: 37, + x_max: 532, + y_min: 3, + y_max: 783, + ha: 780, + leftSideBearing: 37, + advanceWidth: 579, + }, + C: { + x_min: 37, + x_max: 583, + y_min: -3, + y_max: 775, + ha: 778, + leftSideBearing: 37, + advanceWidth: 623, + }, + D: { + x_min: 50, + x_max: 530, + y_min: -15, + y_max: 749, + ha: 764, + leftSideBearing: 50, + advanceWidth: 579, + }, + E: { + x_min: 45, + x_max: 531, + y_min: -1, + y_max: 743, + ha: 744, + leftSideBearing: 45, + advanceWidth: 585, + }, + F: { + x_min: 45, + x_max: 459, + y_min: 23, + y_max: 727, + ha: 704, + leftSideBearing: 45, + advanceWidth: 510, + }, + G: { + x_min: 31, + x_max: 577, + y_min: -8, + y_max: 733, + ha: 741, + leftSideBearing: 31, + advanceWidth: 611, + }, + H: { + x_min: 37, + x_max: 493, + y_min: -22, + y_max: 758, + ha: 780, + leftSideBearing: 37, + advanceWidth: 535, + }, + I: { + x_min: 47, + x_max: 501, + y_min: -3, + y_max: 731, + ha: 734, + leftSideBearing: 47, + advanceWidth: 541, + }, + J: { + x_min: 33, + x_max: 531, + y_min: -23, + y_max: 725, + ha: 748, + leftSideBearing: 33, + advanceWidth: 573, + }, + K: { + x_min: 43, + x_max: 505, + y_min: -10, + y_max: 740, + ha: 750, + leftSideBearing: 43, + advanceWidth: 560, + }, + L: { + x_min: 49, + x_max: 457, + y_min: -2, + y_max: 746, + ha: 748, + leftSideBearing: 49, + advanceWidth: 510, + }, + M: { + x_min: 35, + x_max: 699, + y_min: 1, + y_max: 744, + ha: 743, + leftSideBearing: 35, + advanceWidth: 743, + }, + N: { + x_min: 34, + x_max: 533, + y_min: -17, + y_max: 761, + ha: 778, + leftSideBearing: 34, + advanceWidth: 579, + }, + O: { + x_min: 41, + x_max: 608, + y_min: -5, + y_max: 735, + ha: 740, + leftSideBearing: 41, + advanceWidth: 667, + }, + P: { + x_min: 53, + x_max: 451, + y_min: -18, + y_max: 735, + ha: 753, + leftSideBearing: 53, + advanceWidth: 497, + }, + Q: { + x_min: 40, + x_max: 599, + y_min: -67, + y_max: 744, + ha: 811, + leftSideBearing: 40, + advanceWidth: 648, + }, + R: { + x_min: 39, + x_max: 487, + y_min: 16, + y_max: 735, + ha: 719, + leftSideBearing: 39, + advanceWidth: 535, + }, + S: { + x_min: 35, + x_max: 552, + y_min: -47, + y_max: 708, + ha: 755, + leftSideBearing: 35, + advanceWidth: 604, + }, + T: { + x_min: 26, + x_max: 656, + y_min: -13, + y_max: 718, + ha: 731, + leftSideBearing: 26, + advanceWidth: 705, + }, + U: { + x_min: 41, + x_max: 518, + y_min: -20, + y_max: 748, + ha: 768, + leftSideBearing: 41, + advanceWidth: 567, + }, + V: { + x_min: 47, + x_max: 509, + y_min: -26, + y_max: 744, + ha: 770, + leftSideBearing: 47, + advanceWidth: 567, + }, + W: { + x_min: 44, + x_max: 789, + y_min: -35, + y_max: 720, + ha: 755, + leftSideBearing: 44, + advanceWidth: 833, + }, + X: { + x_min: 63, + x_max: 635, + y_min: -10, + y_max: 745, + ha: 755, + leftSideBearing: 63, + advanceWidth: 680, + }, + Y: { + x_min: 43, + x_max: 503, + y_min: -21, + y_max: 734, + ha: 755, + leftSideBearing: 43, + advanceWidth: 541, + }, + Z: { + x_min: 42, + x_max: 584, + y_min: -10, + y_max: 739, + ha: 749, + leftSideBearing: 42, + advanceWidth: 629, + }, + '[': { + x_min: 46, + x_max: 346, + y_min: -150, + y_max: 884, + ha: 1034, + leftSideBearing: 46, + advanceWidth: 291, + }, + '\\': { + x_min: 20, + x_max: 616, + y_min: -100, + y_max: 797, + ha: 897, + leftSideBearing: 20, + advanceWidth: 645, + }, + ']': { + x_min: -76, + x_max: 226, + y_min: -150, + y_max: 881, + ha: 1031, + leftSideBearing: -76, + advanceWidth: 297, + }, + '^': { + x_min: 43, + x_max: 437, + y_min: 517, + y_max: 812, + ha: 295, + leftSideBearing: 43, + advanceWidth: 478, + }, + _: { + x_min: 29, + x_max: 563, + y_min: -110, + y_max: -1, + ha: 109, + leftSideBearing: 29, + advanceWidth: 598, + }, + '`': { + x_min: 54, + x_max: 321, + y_min: 540, + y_max: 747, + ha: 207, + leftSideBearing: 54, + advanceWidth: 368, + }, + a: { + x_min: 20, + x_max: 447, + y_min: -17, + y_max: 495, + ha: 512, + leftSideBearing: 20, + advanceWidth: 494, + }, + b: { + x_min: 37, + x_max: 466, + y_min: -27, + y_max: 770, + ha: 797, + leftSideBearing: 37, + advanceWidth: 510, + }, + c: { + x_min: 35, + x_max: 456, + y_min: -9, + y_max: 507, + ha: 516, + leftSideBearing: 35, + advanceWidth: 460, + }, + d: { + x_min: 45, + x_max: 520, + y_min: -15, + y_max: 764, + ha: 779, + leftSideBearing: 45, + advanceWidth: 560, + }, + e: { + x_min: 33, + x_max: 370, + y_min: -5, + y_max: 501, + ha: 506, + leftSideBearing: 33, + advanceWidth: 397, + }, + f: { + x_min: 35, + x_max: 411, + y_min: -13, + y_max: 695, + ha: 708, + leftSideBearing: 35, + advanceWidth: 453, + }, + g: { + x_min: 33, + x_max: 551, + y_min: -257, + y_max: 505, + ha: 762, + leftSideBearing: 33, + advanceWidth: 611, + }, + h: { + x_min: 32, + x_max: 458, + y_min: -29, + y_max: 743, + ha: 772, + leftSideBearing: 32, + advanceWidth: 491, + }, + i: { + x_min: 45, + x_max: 167, + y_min: -13, + y_max: 631, + ha: 644, + leftSideBearing: 45, + advanceWidth: 220, + }, + j: { + x_min: -127, + x_max: 261, + y_min: -231, + y_max: 601, + ha: 832, + leftSideBearing: -127, + advanceWidth: 308, + }, + k: { + x_min: 39, + x_max: 443, + y_min: -3, + y_max: 700, + ha: 703, + leftSideBearing: 39, + advanceWidth: 497, + }, + l: { + x_min: 58, + x_max: 168, + y_min: -8, + y_max: 686, + ha: 694, + leftSideBearing: 58, + advanceWidth: 227, + }, + m: { + x_min: 39, + x_max: 688, + y_min: -14, + y_max: 501, + ha: 515, + leftSideBearing: 39, + advanceWidth: 718, + }, + n: { + x_min: 45, + x_max: 491, + y_min: -32, + y_max: 512, + ha: 544, + leftSideBearing: 45, + advanceWidth: 541, + }, + o: { + x_min: 41, + x_max: 424, + y_min: -12, + y_max: 493, + ha: 505, + leftSideBearing: 41, + advanceWidth: 447, + }, + p: { + x_min: 25, + x_max: 529, + y_min: -260, + y_max: 500, + ha: 760, + leftSideBearing: 25, + advanceWidth: 573, + }, + q: { + x_min: 53, + x_max: 603, + y_min: -235, + y_max: 514, + ha: 749, + leftSideBearing: 53, + advanceWidth: 623, + }, + r: { + x_min: 32, + x_max: 407, + y_min: -7, + y_max: 492, + ha: 499, + leftSideBearing: 32, + advanceWidth: 460, + }, + s: { + x_min: 49, + x_max: 416, + y_min: -12, + y_max: 519, + ha: 531, + leftSideBearing: 49, + advanceWidth: 460, + }, + t: { + x_min: 32, + x_max: 442, + y_min: -5, + y_max: 684, + ha: 689, + leftSideBearing: 32, + advanceWidth: 469, + }, + u: { + x_min: 41, + x_max: 487, + y_min: -5, + y_max: 507, + ha: 512, + leftSideBearing: 41, + advanceWidth: 510, + }, + v: { + x_min: 16, + x_max: 441, + y_min: -20, + y_max: 542, + ha: 562, + leftSideBearing: 16, + advanceWidth: 456, + }, + w: { + x_min: 39, + x_max: 639, + y_min: -22, + y_max: 505, + ha: 527, + leftSideBearing: 39, + advanceWidth: 661, + }, + x: { + x_min: 15, + x_max: 505, + y_min: -39, + y_max: 539, + ha: 578, + leftSideBearing: 15, + advanceWidth: 541, + }, + y: { + x_min: -98, + x_max: 501, + y_min: -242, + y_max: 511, + ha: 753, + leftSideBearing: -98, + advanceWidth: 548, + }, + z: { + x_min: 27, + x_max: 479, + y_min: -3, + y_max: 494, + ha: 497, + leftSideBearing: 27, + advanceWidth: 494, + }, + '{': { + x_min: 0, + x_max: 0, + y_min: 0, + y_max: 0, + ha: 0, + leftSideBearing: 0, + advanceWidth: 308, + }, + '|': { + x_min: 0, + x_max: 0, + y_min: 0, + y_max: 0, + ha: 0, + leftSideBearing: 0, + advanceWidth: 308, + }, + '}': { + x_min: 0, + x_max: 0, + y_min: 0, + y_max: 0, + ha: 0, + leftSideBearing: 0, + advanceWidth: 308, + }, + '~': { + x_min: 0, + x_max: 0, + y_min: 0, + y_max: 0, + ha: 0, + leftSideBearing: 0, + advanceWidth: 308, + }, + }, + fontFamily: 'PetalumaScript', + resolution: 1000, + generatedOn: '2020-06-14T18:33:25.407Z', +}; + + +/***/ }), + +/***/ "./src/fonts/robotoslab_glyphs.ts": +/*!****************************************!*\ + !*** ./src/fonts/robotoslab_glyphs.ts ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "RobotoSlabFont": () => (/* binding */ RobotoSlabFont) +/* harmony export */ }); +const RobotoSlabFont = { + spacing: 50, + glyphs: { + ' ': { + x_min: 0, + x_max: 509, + y_min: 0, + y_max: 2000, + ha: 2000, + leftSideBearing: 0, + advanceWidth: 509, + }, + '0': { + x_min: 121, + x_max: 1048, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 121, + advanceWidth: 1168, + }, + '1': { + x_min: 117, + x_max: 767, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 117, + advanceWidth: 844, + }, + '2': { + x_min: 75.8474576645637, + x_max: 1040, + y_min: 0, + y_max: 1477, + ha: 1477, + leftSideBearing: 75, + advanceWidth: 1131, + }, + '3': { + x_min: 74.85365853658536, + x_max: 994, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 74, + advanceWidth: 1106, + }, + '4': { + x_min: 63, + x_max: 1114, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 63, + advanceWidth: 1187, + }, + '5': { + x_min: 96.8448275474953, + x_max: 982, + y_min: -21, + y_max: 1456, + ha: 1477, + leftSideBearing: 96, + advanceWidth: 1081, + }, + '6': { + x_min: 121, + x_max: 1067, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 121, + advanceWidth: 1144, + }, + '7': { + x_min: 76, + x_max: 1060, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: -30, + advanceWidth: 1128, + }, + '8': { + x_min: 92, + x_max: 1039, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 92, + advanceWidth: 1131, + }, + '9': { + x_min: 84, + x_max: 1026, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 84, + advanceWidth: 1154, + }, + '!': { + x_min: 143, + x_max: 340, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 143, + advanceWidth: 483, + }, + '"': { + x_min: 166, + x_max: 634, + y_min: 1055, + y_max: 1560, + ha: 505, + leftSideBearing: 166, + advanceWidth: 770, + }, + '#': { + x_min: 63, + x_max: 1179, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 63, + advanceWidth: 1246, + }, + $: { + x_min: 81.92156915727656, + x_max: 1012, + y_min: -208, + y_max: 1693, + ha: 1901, + leftSideBearing: 81, + advanceWidth: 1110, + }, + '%': { + x_min: 77, + x_max: 1384, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 77, + advanceWidth: 1460, + }, + '&': { + x_min: 74, + x_max: 1242, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 74, + advanceWidth: 1289, + }, + "'": { + x_min: 166, + x_max: 324, + y_min: 1055, + y_max: 1560, + ha: 505, + leftSideBearing: 166, + advanceWidth: 460, + }, + '(': { + x_min: 114, + x_max: 650, + y_min: -463, + y_max: 1636, + ha: 2099, + leftSideBearing: 114, + advanceWidth: 662, + }, + ')': { + x_min: 11, + x_max: 547, + y_min: -463, + y_max: 1636, + ha: 2099, + leftSideBearing: 11, + advanceWidth: 654, + }, + '*': { + x_min: 66, + x_max: 893, + y_min: 607, + y_max: 1456, + ha: 849, + leftSideBearing: 66, + advanceWidth: 958, + }, + '+': { + x_min: 73, + x_max: 1071, + y_min: 146, + y_max: 1206, + ha: 1060, + leftSideBearing: 73, + advanceWidth: 1145, + }, + ',': { + x_min: 23, + x_max: 315, + y_min: -311, + y_max: 221, + ha: 532, + leftSideBearing: 23, + advanceWidth: 404, + }, + '-': { + x_min: 154, + x_max: 643, + y_min: 538, + y_max: 692, + ha: 154, + leftSideBearing: 154, + advanceWidth: 797, + }, + '.': { + x_min: 145, + x_max: 342, + y_min: 0, + y_max: 202, + ha: 202, + leftSideBearing: 145, + advanceWidth: 493, + }, + '/': { + x_min: 0, + x_max: 774, + y_min: -125, + y_max: 1456, + ha: 1581, + leftSideBearing: 0, + advanceWidth: 824, + }, + ':': { + x_min: 145, + x_max: 342, + y_min: 0, + y_max: 1082, + ha: 1082, + leftSideBearing: 145, + advanceWidth: 419, + }, + ';': { + x_min: 53, + x_max: 345, + y_min: -311, + y_max: 1082, + ha: 1393, + leftSideBearing: 53, + advanceWidth: 424, + }, + '<': { + x_min: 76, + x_max: 892, + y_min: 107, + y_max: 1013, + ha: 906, + leftSideBearing: 76, + advanceWidth: 1017, + }, + '=': { + x_min: 147, + x_max: 981, + y_min: 407, + y_max: 987, + ha: 580, + leftSideBearing: 147, + advanceWidth: 1127, + }, + '>': { + x_min: 125, + x_max: 980, + y_min: 87, + y_max: 993, + ha: 906, + leftSideBearing: 125, + advanceWidth: 1060, + }, + '?': { + x_min: 65.92660602419838, + x_max: 890, + y_min: 0, + y_max: 1477, + ha: 1477, + leftSideBearing: 65, + advanceWidth: 953, + }, + '@': { + x_min: 84.3592218305664, + x_max: 1705.2346925277395, + y_min: -453, + y_max: 1431, + ha: 1884, + leftSideBearing: 84, + advanceWidth: 1821, + }, + A: { + x_min: 70, + x_max: 1463, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 70, + advanceWidth: 1533, + }, + B: { + x_min: 81, + x_max: 1253, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 81, + advanceWidth: 1322, + }, + C: { + x_min: 80, + x_max: 1174, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 80, + advanceWidth: 1290, + }, + D: { + x_min: 81, + x_max: 1291, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 81, + advanceWidth: 1356, + }, + E: { + x_min: 81, + x_max: 1190, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 81, + advanceWidth: 1306, + }, + F: { + x_min: 81, + x_max: 1176, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 81, + advanceWidth: 1256, + }, + G: { + x_min: 80, + x_max: 1226, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 80, + advanceWidth: 1346, + }, + H: { + x_min: 81, + x_max: 1497, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 81, + advanceWidth: 1578, + }, + I: { + x_min: 81, + x_max: 604, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 81, + advanceWidth: 685, + }, + J: { + x_min: 60, + x_max: 1100, + y_min: -21, + y_max: 1456, + ha: 1477, + leftSideBearing: 60, + advanceWidth: 1169, + }, + K: { + x_min: 81, + x_max: 1427, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 81, + advanceWidth: 1501, + }, + L: { + x_min: 81, + x_max: 1130, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 81, + advanceWidth: 1210, + }, + M: { + x_min: 94, + x_max: 1888, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 94, + advanceWidth: 1982, + }, + N: { + x_min: 83, + x_max: 1509, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 83, + advanceWidth: 1592, + }, + O: { + x_min: 70, + x_max: 1281, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 70, + advanceWidth: 1351, + }, + P: { + x_min: 81, + x_max: 1242, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 81, + advanceWidth: 1297, + }, + Q: { + x_min: 70, + x_max: 1348, + y_min: -245, + y_max: 1477, + ha: 1722, + leftSideBearing: 70, + advanceWidth: 1376, + }, + R: { + x_min: 81, + x_max: 1285, + y_min: 0, + y_max: 1455, + ha: 1455, + leftSideBearing: 81, + advanceWidth: 1385, + }, + S: { + x_min: 115, + x_max: 1116, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 115, + advanceWidth: 1206, + }, + T: { + x_min: 96, + x_max: 1306, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 96, + advanceWidth: 1406, + }, + U: { + x_min: 70, + x_max: 1452, + y_min: -21, + y_max: 1456, + ha: 1477, + leftSideBearing: 70, + advanceWidth: 1522, + }, + V: { + x_min: 65, + x_max: 1443, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 65, + advanceWidth: 1508, + }, + W: { + x_min: 72, + x_max: 2057, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 72, + advanceWidth: 2129, + }, + X: { + x_min: 80, + x_max: 1449, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 80, + advanceWidth: 1529, + }, + Y: { + x_min: 65, + x_max: 1396, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 65, + advanceWidth: 1461, + }, + Z: { + x_min: 90, + x_max: 1107, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 90, + advanceWidth: 1197, + }, + '[': { + x_min: 157, + x_max: 541, + y_min: -312, + y_max: 1664, + ha: 1976, + leftSideBearing: 157, + advanceWidth: 573, + }, + '\\': { + x_min: 36, + x_max: 830, + y_min: -125, + y_max: 1456, + ha: 1581, + leftSideBearing: 36, + advanceWidth: 841, + }, + ']': { + x_min: 23, + x_max: 408, + y_min: -312, + y_max: 1664, + ha: 1976, + leftSideBearing: 23, + advanceWidth: 552, + }, + '^': { + x_min: 71, + x_max: 802, + y_min: 729, + y_max: 1456, + ha: 727, + leftSideBearing: 71, + advanceWidth: 864, + }, + _: { + x_min: 119, + x_max: 1041, + y_min: -154, + y_max: 0, + ha: 154, + leftSideBearing: 119, + advanceWidth: 1168, + }, + '`': { + x_min: 40, + x_max: 456, + y_min: 1288, + y_max: 1560, + ha: 272, + leftSideBearing: 40, + advanceWidth: 496, + }, + a: { + x_min: 79, + x_max: 1053, + y_min: -21, + y_max: 1102, + ha: 1123, + leftSideBearing: 79, + advanceWidth: 1132, + }, + b: { + x_min: -16, + x_max: 1071, + y_min: -21, + y_max: 1560, + ha: 1581, + leftSideBearing: -16, + advanceWidth: 1145, + }, + c: { + x_min: 78, + x_max: 988, + y_min: -21, + y_max: 1102, + ha: 1123, + leftSideBearing: 78, + advanceWidth: 1067, + }, + d: { + x_min: 78, + x_max: 1156, + y_min: -21, + y_max: 1560, + ha: 1581, + leftSideBearing: 78, + advanceWidth: 1218, + }, + e: { + x_min: 74, + x_max: 980, + y_min: -21, + y_max: 1102, + ha: 1123, + leftSideBearing: 74, + advanceWidth: 1059, + }, + f: { + x_min: 64, + x_max: 731, + y_min: 0, + y_max: 1581, + ha: 1581, + leftSideBearing: 64, + advanceWidth: 725, + }, + g: { + x_min: 78, + x_max: 1133, + y_min: -437, + y_max: 1102, + ha: 1539, + leftSideBearing: 78, + advanceWidth: 1157, + }, + h: { + x_min: 49, + x_max: 1255, + y_min: 0, + y_max: 1560, + ha: 1560, + leftSideBearing: 49, + advanceWidth: 1315, + }, + i: { + x_min: 67, + x_max: 590, + y_min: 0, + y_max: 1560, + ha: 1560, + leftSideBearing: 67, + advanceWidth: 652, + }, + j: { + x_min: -56, + x_max: 381, + y_min: -437, + y_max: 1560, + ha: 1997, + leftSideBearing: -56, + advanceWidth: 525, + }, + k: { + x_min: 64, + x_max: 1248, + y_min: 0, + y_max: 1560, + ha: 1560, + leftSideBearing: 64, + advanceWidth: 1287, + }, + l: { + x_min: 64, + x_max: 587, + y_min: 0, + y_max: 1560, + ha: 1560, + leftSideBearing: 64, + advanceWidth: 653, + }, + m: { + x_min: 74, + x_max: 1905, + y_min: 0, + y_max: 1102, + ha: 1102, + leftSideBearing: 74, + advanceWidth: 1977, + }, + n: { + x_min: 74, + x_max: 1278, + y_min: 0, + y_max: 1102, + ha: 1102, + leftSideBearing: 74, + advanceWidth: 1343, + }, + o: { + x_min: 78, + x_max: 1046, + y_min: -21, + y_max: 1102, + ha: 1123, + leftSideBearing: 78, + advanceWidth: 1124, + }, + p: { + x_min: 34, + x_max: 1119, + y_min: -416, + y_max: 1102, + ha: 1518, + leftSideBearing: 34, + advanceWidth: 1197, + }, + q: { + x_min: 78, + x_max: 1135, + y_min: -416, + y_max: 1102, + ha: 1518, + leftSideBearing: 78, + advanceWidth: 1139, + }, + r: { + x_min: 72, + x_max: 808, + y_min: 0, + y_max: 1102, + ha: 1102, + leftSideBearing: 72, + advanceWidth: 854, + }, + s: { + x_min: 104, + x_max: 933, + y_min: -21, + y_max: 1102, + ha: 1123, + leftSideBearing: 104, + advanceWidth: 1022, + }, + t: { + x_min: 24, + x_max: 678, + y_min: -17, + y_max: 1343, + ha: 1360, + leftSideBearing: 24, + advanceWidth: 730, + }, + u: { + x_min: 52, + x_max: 1181, + y_min: -21, + y_max: 1082, + ha: 1103, + leftSideBearing: 52, + advanceWidth: 1245, + }, + v: { + x_min: 26, + x_max: 1176, + y_min: 0, + y_max: 1082, + ha: 1082, + leftSideBearing: 26, + advanceWidth: 1206, + }, + w: { + x_min: 52, + x_max: 1777, + y_min: 0, + y_max: 1082, + ha: 1082, + leftSideBearing: 52, + advanceWidth: 1823, + }, + x: { + x_min: 42, + x_max: 1163, + y_min: 0, + y_max: 1082, + ha: 1082, + leftSideBearing: 42, + advanceWidth: 1203, + }, + y: { + x_min: 24, + x_max: 1172, + y_min: -437, + y_max: 1082, + ha: 1519, + leftSideBearing: 24, + advanceWidth: 1192, + }, + z: { + x_min: 88, + x_max: 960, + y_min: 0, + y_max: 1082, + ha: 1082, + leftSideBearing: 88, + advanceWidth: 1032, + }, + '{': { + x_min: 63, + x_max: 671, + y_min: -364, + y_max: 1597, + ha: 1961, + leftSideBearing: 63, + advanceWidth: 701, + }, + '|': { + x_min: 150, + x_max: 307, + y_min: -270, + y_max: 1456, + ha: 1726, + leftSideBearing: 150, + advanceWidth: 451, + }, + '}': { + x_min: 27, + x_max: 635, + y_min: -364, + y_max: 1597, + ha: 1961, + leftSideBearing: 27, + advanceWidth: 701, + }, + '~': { + x_min: 121, + x_max: 1257, + y_min: 401, + y_max: 803, + ha: 402, + leftSideBearing: 121, + advanceWidth: 1386, + }, + }, + fontFamily: 'Roboto Slab', + resolution: 2048, + generatedOn: '2020-06-15T19:12:58.120Z', +}; + + +/***/ }), + +/***/ "./src/fonts/textfonts.ts": +/*!********************************!*\ + !*** ./src/fonts/textfonts.ts ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "loadTextFonts": () => (/* binding */ loadTextFonts) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../font */ "./src/font.ts"); +/* harmony import */ var _textformatter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../textformatter */ "./src/textformatter.ts"); +/* harmony import */ var _petalumascript_glyphs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./petalumascript_glyphs */ "./src/fonts/petalumascript_glyphs.ts"); +/* harmony import */ var _robotoslab_glyphs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./robotoslab_glyphs */ "./src/fonts/robotoslab_glyphs.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + +function loadTextFonts() { + // Roboto Slab + { + const fontData = _robotoslab_glyphs__WEBPACK_IMPORTED_MODULE_3__.RobotoSlabFont; + const { fontFamily, resolution, glyphs } = fontData; + _font__WEBPACK_IMPORTED_MODULE_0__.Font.load(fontFamily, fontData); + // Previously we used 'H', but it isn't actually the tallest or the widest. + // Interestingly, the lowercase 'b' is the tallest glyph. + const maxSizeGlyph = 'b'; + _textformatter__WEBPACK_IMPORTED_MODULE_1__.TextFormatter.registerInfo({ + family: fontFamily, + resolution, + glyphs, + maxSizeGlyph, + monospaced: false, + bold: false, + italic: false, + superscriptOffset: 0.66, + subscriptOffset: 0.66, + serifs: true, + description: 'Text font to pair with the Bravura / Gonville music fonts.', + }); + } + // PetalumaScript + { + const fontData = _petalumascript_glyphs__WEBPACK_IMPORTED_MODULE_2__.PetalumaScriptFont; + const { fontFamily, resolution, glyphs } = fontData; + _font__WEBPACK_IMPORTED_MODULE_0__.Font.load(fontFamily, fontData); + // M is wider, but H is taller. :-) + // Lowercase b is also taller in this font. + const maxSizeGlyph = 'b'; + _textformatter__WEBPACK_IMPORTED_MODULE_1__.TextFormatter.registerInfo({ + family: fontFamily, + resolution, + glyphs, + maxSizeGlyph, + monospaced: false, + bold: false, + italic: false, + superscriptOffset: 0.66, + subscriptOffset: 0.66, + serifs: false, + description: 'Text font to pair with the Petaluma music font.', + }); + } +} + + +/***/ }), + +/***/ "./src/formatter.ts": +/*!**************************!*\ + !*** ./src/formatter.ts ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Formatter": () => (/* binding */ Formatter) +/* harmony export */ }); +/* harmony import */ var _beam__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./beam */ "./src/beam.ts"); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _fraction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./fraction */ "./src/fraction.ts"); +/* harmony import */ var _modifiercontext__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modifiercontext */ "./src/modifiercontext.ts"); +/* harmony import */ var _stave__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./stave */ "./src/stave.ts"); +/* harmony import */ var _staveconnector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./staveconnector */ "./src/staveconnector.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _tickcontext__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./tickcontext */ "./src/tickcontext.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +/* harmony import */ var _voice__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./voice */ "./src/voice.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + + + + + + + +// Helper function +const sumArray = (arr) => arr.reduce((a, b) => a + b, 0); +/** + * Create `Alignment`s for each tick in `voices`. Also calculate the + * total number of ticks in voices. + */ +function createContexts(voices, makeContext, addToContext) { + const resolutionMultiplier = Formatter.getResolutionMultiplier(voices); + // Initialize tick maps. + const tickToContextMap = {}; + const tickList = []; + const contexts = []; + // For each voice, extract notes and create a context for every + // new tick that hasn't been seen before. + voices.forEach((voice, voiceIndex) => { + // Use resolution multiplier as denominator so that no additional expansion + // of fractional tick values is needed. + const ticksUsed = new _fraction__WEBPACK_IMPORTED_MODULE_2__.Fraction(0, resolutionMultiplier); + voice.getTickables().forEach((tickable) => { + const integerTicks = ticksUsed.numerator; + // If we have no tick context for this tick, create one. + if (!tickToContextMap[integerTicks]) { + const newContext = makeContext({ tickID: integerTicks }); + contexts.push(newContext); + tickToContextMap[integerTicks] = newContext; + // Maintain a list of unique integerTicks. + tickList.push(integerTicks); + } + // Add this tickable to the TickContext. + addToContext(tickable, tickToContextMap[integerTicks], voiceIndex); + ticksUsed.add(tickable.getTicks()); + }); + }); + return { + map: tickToContextMap, + array: contexts, + list: tickList.sort((a, b) => a - b), + resolutionMultiplier, + }; +} +// eslint-disable-next-line +function L(...args) { + if (Formatter.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_9__.log)('Vex.Flow.Formatter', args); +} +/** + * Get the rest line number of the next non-rest note(s). + * @param notes array of Notes + * @param currRestLine + * @param currNoteIndex current note index + * @param compare if true, return the midpoint between the current rest line and the next rest line + * @returns a line number, which determines the vertical position of a rest. + */ +function getRestLineForNextNoteGroup(notes, currRestLine, currNoteIndex, compare) { + // If no valid next note group, nextRestLine is same as current. + let nextRestLine = currRestLine; + // Start with the next note and keep going until we find a valid non-rest note group. + for (let noteIndex = currNoteIndex + 1; noteIndex < notes.length; noteIndex++) { + const note = notes[noteIndex]; + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_8__.isNote)(note) && !note.isRest() && !note.shouldIgnoreTicks()) { + nextRestLine = note.getLineForRest(); + break; + } + } + // Locate the mid point between two lines. + if (compare && currRestLine !== nextRestLine) { + const top = Math.max(currRestLine, nextRestLine); + const bot = Math.min(currRestLine, nextRestLine); + nextRestLine = (0,_util__WEBPACK_IMPORTED_MODULE_9__.midLine)(top, bot); + } + return nextRestLine; +} +/** + * Format implements the formatting and layout algorithms that are used + * to position notes in a voice. The algorithm can align multiple voices both + * within a stave, and across multiple staves. + * + * To do this, the formatter breaks up voices into a grid of rational-valued + * `ticks`, to which each note is assigned. Then, minimum widths are assigned + * to each tick based on the widths of the notes and modifiers in that tick. This + * establishes the smallest amount of space required for each tick. + * + * Finally, the formatter distributes the left over space proportionally to + * all the ticks, setting the `x` values of the notes in each tick. + * + * See `tests/formatter_tests.ts` for usage examples. The helper functions included + * here (`FormatAndDraw`, `FormatAndDrawTab`) also serve as useful usage examples. + */ +class Formatter { + constructor(options) { + this.formatterOptions = Object.assign({ globalSoftmax: false, softmaxFactor: 100, maxIterations: 5 }, options); + this.justifyWidth = 0; + this.totalCost = 0; + this.totalShift = 0; + this.durationStats = {}; + // Minimum width required to render all the notes in the voices. + this.minTotalWidth = 0; + // This is set to `true` after `minTotalWidth` is calculated. + this.hasMinTotalWidth = false; + // Arrays of tick and modifier contexts. + this.tickContexts = undefined; + this.modifierContexts = undefined; + // Gaps between contexts, for free movement of notes post + // formatting. + this.contextGaps = { + total: 0, + gaps: [], + }; + this.voices = []; + this.lossHistory = []; + } + /** + * Helper function to layout "notes" one after the other without + * regard for proportions. Useful for tests and debugging. + */ + static SimpleFormat(notes, x = 0, { paddingBetween = 10 } = {}) { + notes.reduce((accumulator, note) => { + note.addToModifierContext(new _modifiercontext__WEBPACK_IMPORTED_MODULE_3__.ModifierContext()); + const tick = new _tickcontext__WEBPACK_IMPORTED_MODULE_7__.TickContext().addTickable(note).preFormat(); + const metrics = tick.getMetrics(); + tick.setX(accumulator + metrics.totalLeftPx); + return accumulator + tick.getWidth() + metrics.totalRightPx + paddingBetween; + }, x); + } + /** Helper function to plot formatter debug info. */ + static plotDebugging(ctx, formatter, xPos, y1, y2, options) { + options = Object.assign({ stavePadding: _tables__WEBPACK_IMPORTED_MODULE_6__.Tables.currentMusicFont().lookupMetric('stave.padding') }, options); + const x = xPos + options.stavePadding; + const contextGaps = formatter.contextGaps; + function stroke(x1, x2, color) { + ctx.beginPath(); + ctx.setStrokeStyle(color); + ctx.setFillStyle(color); + ctx.setLineWidth(1); + ctx.fillRect(x1, y1, Math.max(x2 - x1, 0), y2 - y1); + } + ctx.save(); + ctx.setFont(_font__WEBPACK_IMPORTED_MODULE_1__.Font.SANS_SERIF, 8); + contextGaps.gaps.forEach((gap) => { + stroke(x + gap.x1, x + gap.x2, 'rgba(100,200,100,0.4)'); + ctx.setFillStyle('green'); + ctx.fillText(Math.round(gap.x2 - gap.x1).toString(), x + gap.x1, y2 + 12); + }); + ctx.setFillStyle('red'); + ctx.fillText(`Loss: ${(formatter.totalCost || 0).toFixed(2)} Shift: ${(formatter.totalShift || 0).toFixed(2)} Gap: ${contextGaps.total.toFixed(2)}`, x - 20, y2 + 27); + ctx.restore(); + } + /** + * Helper function to format and draw a single voice. Returns a bounding + * box for the notation. + * @param ctx the rendering context + * @param stave the stave to which to draw (`Stave` or `TabStave`) + * @param notes array of `Note` instances (`Note`, `TextNote`, `TabNote`, etc.) + * @param params one of below: + * * Setting `autobeam` only `(context, stave, notes, true)` or + * `(ctx, stave, notes, {autobeam: true})` + * * Setting `align_rests` a struct is needed `(context, stave, notes, {align_rests: true})` + * * Setting both a struct is needed `(context, stave, notes, { + * autobeam: true, align_rests: true})` + * * `autobeam` automatically generates beams for the notes. + * * `align_rests` aligns rests with nearby notes. + */ + static FormatAndDraw(ctx, stave, notes, params) { + let options = { + auto_beam: false, + align_rests: false, + }; + if (typeof params === 'object') { + options = Object.assign(Object.assign({}, options), params); + } + else if (typeof params === 'boolean') { + options.auto_beam = params; + } + // Start by creating a voice and adding all the notes to it. + const voice = new _voice__WEBPACK_IMPORTED_MODULE_10__.Voice(_tables__WEBPACK_IMPORTED_MODULE_6__.Tables.TIME4_4).setMode(_voice__WEBPACK_IMPORTED_MODULE_10__.Voice.Mode.SOFT).addTickables(notes); + // Then create beams, if requested. + const beams = options.auto_beam ? _beam__WEBPACK_IMPORTED_MODULE_0__.Beam.applyAndGetBeams(voice) : []; + // Instantiate a `Formatter` and format the notes. + new Formatter() + .joinVoices([voice]) // , { align_rests: options.align_rests }) + .formatToStave([voice], stave, { align_rests: options.align_rests, stave }); + // Render the voice and beams to the stave. + voice.setStave(stave).draw(ctx, stave); + beams.forEach((beam) => beam.setContext(ctx).draw()); + // Return the bounding box of the voice. + return voice.getBoundingBox(); + } + /** + * Helper function to format and draw aligned tab and stave notes in two + * separate staves. + * @param ctx the rendering context + * @param tabstave a `TabStave` instance on which to render `TabNote`s. + * @param stave a `Stave` instance on which to render `Note`s. + * @param notes array of `Note` instances for the stave (`Note`, `BarNote`, etc.) + * @param tabnotes array of `Note` instances for the tab stave (`TabNote`, `BarNote`, etc.) + * @param autobeam automatically generate beams. + * @param params a configuration object: + * * `autobeam` automatically generates beams for the notes. + * * `align_rests` aligns rests with nearby notes. + */ + static FormatAndDrawTab(ctx, tabstave, stave, tabnotes, notes, autobeam, params) { + let opts = { + auto_beam: autobeam, + align_rests: false, + }; + if (typeof params === 'object') { + opts = Object.assign(Object.assign({}, opts), params); + } + else if (typeof params === 'boolean') { + opts.auto_beam = params; + } + // Create a `4/4` voice for `notes`. + const notevoice = new _voice__WEBPACK_IMPORTED_MODULE_10__.Voice(_tables__WEBPACK_IMPORTED_MODULE_6__.Tables.TIME4_4).setMode(_voice__WEBPACK_IMPORTED_MODULE_10__.Voice.Mode.SOFT).addTickables(notes); + // Create a `4/4` voice for `tabnotes`. + const tabvoice = new _voice__WEBPACK_IMPORTED_MODULE_10__.Voice(_tables__WEBPACK_IMPORTED_MODULE_6__.Tables.TIME4_4).setMode(_voice__WEBPACK_IMPORTED_MODULE_10__.Voice.Mode.SOFT).addTickables(tabnotes); + // Then create beams, if requested. + const beams = opts.auto_beam ? _beam__WEBPACK_IMPORTED_MODULE_0__.Beam.applyAndGetBeams(notevoice) : []; + // Instantiate a `Formatter` and align tab and stave notes. + new Formatter() + .joinVoices([notevoice]) // , { align_rests: opts.align_rests }) + .joinVoices([tabvoice]) + .formatToStave([notevoice, tabvoice], stave, { align_rests: opts.align_rests }); + // Render voices and beams to staves. + notevoice.draw(ctx, stave); + tabvoice.draw(ctx, tabstave); + beams.forEach((beam) => beam.setContext(ctx).draw()); + // Draw a connector between tab and note staves. + new _staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave, tabstave).setContext(ctx).draw(); + } + /** + * Automatically set the vertical position of rests based on previous/next note positions. + * @param tickables an array of Tickables. + * @param alignAllNotes If `false`, only align rests that are within a group of beamed notes. + * @param alignTuplets If `false`, ignores tuplets. + */ + static AlignRestsToNotes(tickables, alignAllNotes, alignTuplets) { + tickables.forEach((currTickable, index) => { + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_8__.isStaveNote)(currTickable) && currTickable.isRest()) { + if (currTickable.getTuplet() && !alignTuplets) { + return; + } + // If activated rests not on default can be rendered as specified. + const position = currTickable.getGlyph().position.toUpperCase(); + if (position !== 'R/4' && position !== 'B/4') { + return; + } + if (alignAllNotes || currTickable.getBeam()) { + // Align rests with previous/next notes. + const props = currTickable.getKeyProps()[0]; + if (index === 0) { + props.line = getRestLineForNextNoteGroup(tickables, props.line, index, false); + } + else if (index > 0 && index < tickables.length) { + // If previous tickable is a rest, use its line number. + const prevTickable = tickables[index - 1]; + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_8__.isStaveNote)(prevTickable)) { + if (prevTickable.isRest()) { + props.line = prevTickable.getKeyProps()[0].line; + } + else { + const restLine = prevTickable.getLineForRest(); + // Get the rest line for next valid non-rest note group. + props.line = getRestLineForNextNoteGroup(tickables, restLine, index, true); + } + } + } + currTickable.setKeyLine(0, props.line); + } + } + }); + } + /** + * Find all the rests in each of the `voices` and align them to neighboring notes. + * + * @param voices + * @param alignAllNotes If `false`, only align rests within beamed groups of notes. If `true`, align all rests. + */ + alignRests(voices, alignAllNotes) { + if (!voices || !voices.length) { + throw new _util__WEBPACK_IMPORTED_MODULE_9__.RuntimeError('BadArgument', 'No voices to format rests'); + } + voices.forEach((voice) => Formatter.AlignRestsToNotes(voice.getTickables(), alignAllNotes)); + } + /** + * Estimate the width required to render 'voices'. This is done by: + * 1. Sum the widths of all the tick contexts + * 2. Estimate the padding. + * The latter is done by calculating the padding 3 different ways, and taking the + * greatest value: + * 1. the padding required for unaligned notes in different voices + * 2. the padding based on the stddev of the tickable widths + * 3. the padding based on the stddev of the tickable durations. + * + * The last 2 quantities estimate a 'width entropy', where notes might need more + * room than the proportional formatting gives them. A measure of all same duration + * and width will need no extra padding, and all these quantities will be + * zero in that case. + * + * @param voices the voices that contain the notes + * @returns the estimated width in pixels + */ + preCalculateMinTotalWidth(voices) { + const unalignedPadding = _tables__WEBPACK_IMPORTED_MODULE_6__.Tables.currentMusicFont().lookupMetric('stave.unalignedNotePadding'); + // Calculate additional padding based on 3 methods: + // 1) unaligned beats in voices, 2) variance of width, 3) variance of durations + let unalignedCtxCount = 0; + let wsum = 0; + let dsum = 0; + const widths = []; + const durations = []; + // Cache results. + if (this.hasMinTotalWidth) + return this.minTotalWidth; + // Create tick contexts if not already created. + if (!this.tickContexts) { + if (!voices) { + throw new _util__WEBPACK_IMPORTED_MODULE_9__.RuntimeError('BadArgument', "'voices' required to run preCalculateMinTotalWidth"); + } + this.createTickContexts(voices); + } + // eslint-disable-next-line + const { list: contextList, map: contextMap } = this.tickContexts; + this.minTotalWidth = 0; + // Go through each tick context and calculate total width, + // and also accumulate values used in padding hints + contextList.forEach((tick) => { + const context = contextMap[tick]; + context.preFormat(); + // If this TC doesn't have all the voices on it, it's unaligned. + // so increment the unaligned padding accumulator + if (context.getTickables().length < voices.length) { + unalignedCtxCount += 1; + } + // Calculate the 'width entropy' over all the Tickables. + context.getTickables().forEach((t) => { + wsum += t.getMetrics().width; + dsum += t.getTicks().value(); + widths.push(t.getMetrics().width); + durations.push(t.getTicks().value()); + }); + const width = context.getWidth(); + this.minTotalWidth += width; + }); + this.hasMinTotalWidth = true; + // normalized (0-1) STDDEV of widths/durations gives us padding hints. + const wavg = wsum > 0 ? wsum / widths.length : 1 / widths.length; + const wvar = sumArray(widths.map((ll) => Math.pow(ll - wavg, 2))); + const wpads = Math.pow(wvar / widths.length, 0.5) / wavg; + const davg = dsum / durations.length; + const dvar = sumArray(durations.map((ll) => Math.pow(ll - davg, 2))); + const dpads = Math.pow(dvar / durations.length, 0.5) / davg; + // Find max of 3 methods pad the width with that + const padmax = Math.max(dpads, wpads) * contextList.length * unalignedPadding; + const unalignedPad = unalignedPadding * unalignedCtxCount; + return this.minTotalWidth + Math.max(unalignedPad, padmax); + } + /** + * Get minimum width required to render all voices. Either `format` or + * `preCalculateMinTotalWidth` must be called before this method. + */ + getMinTotalWidth() { + if (!this.hasMinTotalWidth) { + throw new _util__WEBPACK_IMPORTED_MODULE_9__.RuntimeError('NoMinTotalWidth', "Call 'preCalculateMinTotalWidth' or 'preFormat' before calling 'getMinTotalWidth'"); + } + return this.minTotalWidth; + } + /** Calculate the resolution multiplier for `voices`. */ + static getResolutionMultiplier(voices) { + if (!voices || !voices.length) { + throw new _util__WEBPACK_IMPORTED_MODULE_9__.RuntimeError('BadArgument', 'No voices to format'); + } + const totalTicks = voices[0].getTotalTicks(); + const resolutionMultiplier = voices.reduce((accumulator, voice) => { + if (!voice.getTotalTicks().equals(totalTicks)) { + throw new _util__WEBPACK_IMPORTED_MODULE_9__.RuntimeError('TickMismatch', 'Voices should have same total note duration in ticks.'); + } + if (voice.getMode() === _voice__WEBPACK_IMPORTED_MODULE_10__.Voice.Mode.STRICT && !voice.isComplete()) { + throw new _util__WEBPACK_IMPORTED_MODULE_9__.RuntimeError('IncompleteVoice', 'Voice does not have enough notes.'); + } + return Math.max(accumulator, _fraction__WEBPACK_IMPORTED_MODULE_2__.Fraction.LCM(accumulator, voice.getResolutionMultiplier())); + }, 1); + return resolutionMultiplier; + } + /** Create a `ModifierContext` for each tick in `voices`. */ + createModifierContexts(voices) { + const fn = (tickable, context) => tickable.addToModifierContext(context); + const contexts = createContexts(voices, () => new _modifiercontext__WEBPACK_IMPORTED_MODULE_3__.ModifierContext(), fn); + this.modifierContexts = contexts; + return contexts; + } + /** + * Create a `TickContext` for each tick in `voices`. Also calculate the + * total number of ticks in voices. + */ + createTickContexts(voices) { + const fn = (tickable, context, voiceIndex) => context.addTickable(tickable, voiceIndex); + const contexts = createContexts(voices, (tick) => new _tickcontext__WEBPACK_IMPORTED_MODULE_7__.TickContext(tick), fn); + this.tickContexts = contexts; + const contextArray = this.tickContexts.array; + contextArray.forEach((context) => { + context.tContexts = contextArray; + }); + return contexts; + } + /** + * This is the core formatter logic. Format voices and justify them + * to `justifyWidth` pixels. `renderingContext` is required to justify elements + * that can't retreive widths without a canvas. This method sets the `x` positions + * of all the tickables/notes in the formatter. + */ + preFormat(justifyWidth = 0, renderingContext, voicesParam, stave) { + // Initialize context maps. + const contexts = this.tickContexts; + if (!contexts) { + throw new _util__WEBPACK_IMPORTED_MODULE_9__.RuntimeError('NoTickContexts', 'preFormat requires TickContexts'); + } + const { list: contextList, map: contextMap } = contexts; + // Reset loss history for evaluator. + this.lossHistory = []; + // If voices and a stave were provided, set the Stave for each voice + // and preFormat to apply Y values to the notes; + if (voicesParam && stave) { + voicesParam.forEach((voice) => voice.setStave(stave).preFormat()); + } + // Now distribute the ticks to each tick context, and assign them their + // own X positions. + let x = 0; + let shift = 0; + this.minTotalWidth = 0; + let totalTicks = 0; + // Pass 1: Give each note maximum width requested by context. + contextList.forEach((tick) => { + const context = contextMap[tick]; + // Make sure that all tickables in this context have calculated their + // space requirements. + context.preFormat(); + const width = context.getWidth(); + this.minTotalWidth += width; + const maxTicks = context.getMaxTicks().value(); + totalTicks += maxTicks; + const metrics = context.getMetrics(); + x = x + shift + metrics.totalLeftPx; + context.setX(x); + // Calculate shift for the next tick. + shift = width - metrics.totalLeftPx; + }); + // Use softmax based on all notes across all staves. (options.globalSoftmax) + const { globalSoftmax, softmaxFactor, maxIterations } = this.formatterOptions; + const exp = (tick) => Math.pow(softmaxFactor, (contextMap[tick].getMaxTicks().value() / totalTicks)); + const expTicksUsed = sumArray(contextList.map(exp)); + this.minTotalWidth = x + shift; + this.hasMinTotalWidth = true; + // No justification needed. End formatting. + if (justifyWidth <= 0) + return this.evaluate(); + // Start justification. Subtract the right extra pixels of the final context because the formatter + // justifies based on the context's X position, which is the left-most part of the note head. + const firstContext = contextMap[contextList[0]]; + const lastContext = contextMap[contextList[contextList.length - 1]]; + // Calculate the "distance error" between the tick contexts. The expected distance is the spacing proportional to + // the softmax of the ticks. + function calculateIdealDistances(adjustedJustifyWidth) { + const distances = contextList.map((tick, i) => { + const context = contextMap[tick]; + const voices = context.getTickablesByVoice(); + let backTickable; + if (i > 0) { + const prevContext = contextMap[contextList[i - 1]]; + // Go through each tickable and search backwards for another tickable + // in the same voice. If found, use that duration (ticks) to calculate + // the expected distance. + for (let j = i - 1; j >= 0; j--) { + const backTick = contextMap[contextList[j]]; + const backVoices = backTick.getTickablesByVoice(); + // Look for matching voices between tick contexts. + const matchingVoices = []; + Object.keys(voices).forEach((v) => { + if (backVoices[v]) { + matchingVoices.push(v); + } + }); + if (matchingVoices.length > 0) { + // Found matching voices, get largest duration + let maxTicks = 0; + let maxNegativeShiftPx = Infinity; + let expectedDistance = 0; + matchingVoices.forEach((v) => { + const ticks = backVoices[v].getTicks().value(); + if (ticks > maxTicks) { + backTickable = backVoices[v]; + maxTicks = ticks; + } + // Calculate the limits of the shift based on modifiers, etc. + const thisTickable = voices[v]; + const insideLeftEdge = thisTickable.getX() - + (thisTickable.getMetrics().modLeftPx + thisTickable.getMetrics().leftDisplacedHeadPx); + const backMetrics = backVoices[v].getMetrics(); + const insideRightEdge = backVoices[v].getX() + backMetrics.notePx + backMetrics.modRightPx + backMetrics.rightDisplacedHeadPx; + // Don't allow shifting if notes in the same voice can collide + maxNegativeShiftPx = Math.min(maxNegativeShiftPx, insideLeftEdge - insideRightEdge); + }); + // Don't shift further left than the notehead of the last context. Actually, stay at most 5% to the right + // so that two different tick contexts don't align across staves. + maxNegativeShiftPx = Math.min(maxNegativeShiftPx, context.getX() - (prevContext.getX() + adjustedJustifyWidth * 0.05)); + // Calculate the expected distance of the current context from the last matching tickable. The + // distance is scaled down by the softmax for the voice. + if (globalSoftmax) { + const t = totalTicks; + expectedDistance = (Math.pow(softmaxFactor, (maxTicks / t)) / expTicksUsed) * adjustedJustifyWidth; + } + else if (typeof backTickable !== 'undefined') { + expectedDistance = backTickable.getVoice().softmax(maxTicks) * adjustedJustifyWidth; + } + return { + expectedDistance, + maxNegativeShiftPx, + fromTickable: backTickable, + }; + } + } + } + return { expectedDistance: 0, fromTickablePx: 0, maxNegativeShiftPx: 0 }; + }); + return distances; + } + function shiftToIdealDistances(idealDistances) { + // Distribute ticks to the contexts based on the calculated distance error. + const centerX = adjustedJustifyWidth / 2; + let spaceAccum = 0; + contextList.forEach((tick, index) => { + const context = contextMap[tick]; + if (index > 0) { + const contextX = context.getX(); + const ideal = idealDistances[index]; + const errorPx = (0,_util__WEBPACK_IMPORTED_MODULE_9__.defined)(ideal.fromTickable).getX() + ideal.expectedDistance - (contextX + spaceAccum); + let negativeShiftPx = 0; + if (errorPx > 0) { + spaceAccum += errorPx; + } + else if (errorPx < 0) { + negativeShiftPx = Math.min(ideal.maxNegativeShiftPx, Math.abs(errorPx)); + spaceAccum += -negativeShiftPx; + } + context.setX(contextX + spaceAccum); + } + // Move center aligned tickables to middle + context.getCenterAlignedTickables().forEach((tickable) => { + tickable.setCenterXShift(centerX - context.getX()); + }); + }); + return lastContext.getX() - firstContext.getX(); + } + const adjustedJustifyWidth = justifyWidth - + lastContext.getMetrics().notePx - + lastContext.getMetrics().totalRightPx - + firstContext.getMetrics().totalLeftPx; + const musicFont = _tables__WEBPACK_IMPORTED_MODULE_6__.Tables.currentMusicFont(); + const configMinPadding = musicFont.lookupMetric('stave.endPaddingMin'); + const configMaxPadding = musicFont.lookupMetric('stave.endPaddingMax'); + let targetWidth = adjustedJustifyWidth; + const distances = calculateIdealDistances(targetWidth); + let actualWidth = shiftToIdealDistances(distances); + // Calculate right justification by finding max of (configured value, min distance between tickables) + // so measures with lots of white space use it evenly, and crowded measures use at least the configured + // space. + const calcMinDistance = (targetWidth, distances) => { + let mdCalc = targetWidth / 2; + if (distances.length > 1) { + for (let di = 1; di < distances.length; ++di) { + mdCalc = Math.min(distances[di].expectedDistance / 2, mdCalc); + } + } + return mdCalc; + }; + const minDistance = calcMinDistance(targetWidth, distances); + // Just one context. Done formatting. + if (contextList.length === 1) + return 0; + // right justify to either the configured padding, or the min distance between notes, whichever is greatest. + // This * 2 keeps the existing formatting unless there is 'a lot' of extra whitespace, which won't break + // existing visual regression tests. + const paddingMax = configMaxPadding * 2 < minDistance ? minDistance : configMaxPadding; + const paddingMin = paddingMax - (configMaxPadding - configMinPadding); + const maxX = adjustedJustifyWidth - paddingMin; + let iterations = maxIterations; + // Adjust justification width until the right margin is as close as possible to the calculated padding, + // without going over + while ((actualWidth > maxX && iterations > 0) || (actualWidth + paddingMax < maxX && iterations > 1)) { + targetWidth -= actualWidth - maxX; + actualWidth = shiftToIdealDistances(calculateIdealDistances(targetWidth)); + iterations--; + } + this.justifyWidth = justifyWidth; + return this.evaluate(); + } + /** Calculate the total cost of this formatting decision. */ + evaluate() { + if (!this.tickContexts) + return 0; + const contexts = this.tickContexts; + const justifyWidth = this.justifyWidth; + // Calculate available slack per tick context. This works out how much freedom + // to move a context has in either direction, without affecting other notes. + this.contextGaps = { total: 0, gaps: [] }; + contexts.list.forEach((tick, index) => { + if (index === 0) + return; + const prevTick = contexts.list[index - 1]; + const prevContext = contexts.map[prevTick]; + const context = contexts.map[tick]; + const prevMetrics = prevContext.getMetrics(); + const currMetrics = context.getMetrics(); + // Calculate X position of right edge of previous note + const insideRightEdge = prevContext.getX() + prevMetrics.notePx + prevMetrics.totalRightPx; + // Calculate X position of left edge of current note + const insideLeftEdge = context.getX() - currMetrics.totalLeftPx; + const gap = insideLeftEdge - insideRightEdge; + this.contextGaps.total += gap; + this.contextGaps.gaps.push({ x1: insideRightEdge, x2: insideLeftEdge }); + // Tell the tick contexts how much they can reposition themselves. + context.getFormatterMetrics().freedom.left = gap; + prevContext.getFormatterMetrics().freedom.right = gap; + }); + // Calculate mean distance in each voice for each duration type, then calculate + // how far each note is from the mean. + this.durationStats = {}; + const durationStats = this.durationStats; + function updateStats(duration, space) { + const stats = durationStats[duration]; + if (stats === undefined) { + durationStats[duration] = { mean: space, count: 1 }; + } + else { + stats.count += 1; + stats.mean = (stats.mean + space) / 2; + } + } + this.voices.forEach((voice) => { + voice.getTickables().forEach((note, i, notes) => { + const duration = note.getTicks().clone().simplify().toString(); + const metrics = note.getMetrics(); + const formatterMetrics = note.getFormatterMetrics(); + const leftNoteEdge = note.getX() + metrics.notePx + metrics.modRightPx + metrics.rightDisplacedHeadPx; + let space = 0; + if (i < notes.length - 1) { + const rightNote = notes[i + 1]; + const rightMetrics = rightNote.getMetrics(); + const rightNoteEdge = rightNote.getX() - rightMetrics.modLeftPx - rightMetrics.leftDisplacedHeadPx; + space = rightNoteEdge - leftNoteEdge; + formatterMetrics.space.used = rightNote.getX() - note.getX(); + rightNote.getFormatterMetrics().freedom.left = space; + } + else { + space = justifyWidth - leftNoteEdge; + formatterMetrics.space.used = justifyWidth - note.getX(); + } + formatterMetrics.freedom.right = space; + updateStats(duration, formatterMetrics.space.used); + }); + }); + // Calculate how much each note deviates from the mean. Loss function is square + // root of the sum of squared deviations. + let totalDeviation = 0; + this.voices.forEach((voice) => { + voice.getTickables().forEach((note) => { + const duration = note.getTicks().clone().simplify().toString(); + const metrics = note.getFormatterMetrics(); + metrics.space.mean = durationStats[duration].mean; + metrics.duration = duration; + metrics.iterations += 1; + metrics.space.deviation = metrics.space.used - metrics.space.mean; + totalDeviation += Math.pow(metrics.space.deviation, 2); + }); + }); + this.totalCost = Math.sqrt(totalDeviation); + this.lossHistory.push(this.totalCost); + return this.totalCost; + } + /** + * Run a single iteration of rejustification. At a high level, this method calculates + * the overall "loss" (or cost) of this layout, and repositions tickcontexts in an + * attempt to reduce the cost. You can call this method multiple times until it finds + * and oscillates around a global minimum. + * @param alpha the "learning rate" for the formatter. It determines how much of a shift + * the formatter should make based on its cost function. + */ + tune(options) { + var _a; + const contexts = this.tickContexts; + if (!contexts) { + return 0; + } + const alpha = (_a = options === null || options === void 0 ? void 0 : options.alpha) !== null && _a !== void 0 ? _a : 0.5; + // Move `current` tickcontext by `shift` pixels, and adjust the freedom + // on adjacent tickcontexts. + function move(current, shift, prev, next) { + current.setX(current.getX() + shift); + current.getFormatterMetrics().freedom.left += shift; + current.getFormatterMetrics().freedom.right -= shift; + if (prev) + prev.getFormatterMetrics().freedom.right += shift; + if (next) + next.getFormatterMetrics().freedom.left -= shift; + } + let shift = 0; + this.totalShift = 0; + contexts.list.forEach((tick, index, list) => { + const context = contexts.map[tick]; + const prevContext = index > 0 ? contexts.map[list[index - 1]] : undefined; + const nextContext = index < list.length - 1 ? contexts.map[list[index + 1]] : undefined; + move(context, shift, prevContext, nextContext); + const cost = -sumArray(context.getTickables().map((t) => t.getFormatterMetrics().space.deviation)); + if (cost > 0) { + shift = -Math.min(context.getFormatterMetrics().freedom.right, Math.abs(cost)); + } + else if (cost < 0) { + if (nextContext) { + shift = Math.min(nextContext.getFormatterMetrics().freedom.right, Math.abs(cost)); + } + else { + shift = 0; + } + } + shift *= alpha; + this.totalShift += shift; + }); + return this.evaluate(); + } + /** + * This is the top-level call for all formatting logic completed + * after `x` *and* `y` values have been computed for the notes + * in the voices. + */ + postFormat() { + const postFormatContexts = (contexts) => contexts.list.forEach((tick) => contexts.map[tick].postFormat()); + if (this.modifierContexts) + postFormatContexts(this.modifierContexts); + if (this.tickContexts) + postFormatContexts(this.tickContexts); + return this; + } + /** + * Take all `voices` and create `ModifierContext`s out of them. This tells + * the formatters that the voices belong on a single stave. + */ + joinVoices(voices) { + this.createModifierContexts(voices); + this.hasMinTotalWidth = false; + return this; + } + /** + * Align rests in voices, justify the contexts, and position the notes + * so voices are aligned and ready to render onto the stave. This method + * mutates the `x` positions of all tickables in `voices`. + * + * Voices are full justified to fit in `justifyWidth` pixels. + * + * Set `options.context` to the rendering context. Set `options.align_rests` + * to true to enable rest alignment. + */ + format(voices, justifyWidth, options) { + const opts = Object.assign({ align_rests: false }, options); + this.voices = voices; + const softmaxFactor = this.formatterOptions.softmaxFactor; + if (softmaxFactor) { + this.voices.forEach((v) => v.setSoftmaxFactor(softmaxFactor)); + } + this.alignRests(voices, opts.align_rests); + this.createTickContexts(voices); + this.preFormat(justifyWidth, opts.context, voices, opts.stave); + // Only postFormat if a stave was supplied for y value formatting + if (opts.stave) + this.postFormat(); + return this; + } + // This method is just like `format` except that the `justifyWidth` is inferred from the `stave`. + formatToStave(voices, stave, optionsParam) { + const options = Object.assign({ context: stave.getContext() }, optionsParam); + // eslint-disable-next-line + const justifyWidth = stave.getNoteEndX() - stave.getNoteStartX() - _stave__WEBPACK_IMPORTED_MODULE_4__.Stave.defaultPadding; + L('Formatting voices to width: ', justifyWidth); + return this.format(voices, justifyWidth, options); + } + getTickContext(tick) { + var _a; + return (_a = this.tickContexts) === null || _a === void 0 ? void 0 : _a.map[tick]; + } +} +// To enable logging for this class. Set `Vex.Flow.Formatter.DEBUG` to `true`. +Formatter.DEBUG = false; + + +/***/ }), + +/***/ "./src/fraction.ts": +/*!*************************!*\ + !*** ./src/fraction.ts ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Fraction": () => (/* binding */ Fraction) +/* harmony export */ }); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Author: Joshua Koo / @zz85 +// Author: @incompleteopus + + +/** Fraction represents a rational number. */ +class Fraction { + /** Set the numerator and denominator. */ + constructor(numerator, denominator) { + this.numerator = 1; + this.denominator = 1; + this.set(numerator, denominator); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_0__.Category.Fraction; + } + /** + * GCD: Greatest common divisor using the Euclidean algorithm. + * Note: GCD(0, 0) => 0 and GCD(0, n) => n. + */ + static GCD(a, b) { + if (typeof a !== 'number' || Number.isNaN(a) || typeof b !== 'number' || Number.isNaN(b)) { + throw new _util__WEBPACK_IMPORTED_MODULE_1__.RuntimeError('BadArgument', `Invalid numbers: ${a}, ${b}`); + } + let t; + while (b !== 0) { + t = b; + b = a % b; + a = t; + } + return a; + } + /** LCM: Lowest common multiple. */ + static LCM(a, b) { + return (a * b) / Fraction.GCD(a, b); + } + /** Lowest common multiple for more than two numbers. */ + static LCMM(args) { + if (args.length === 0) { + return 0; + } + else if (args.length === 1) { + return args[0]; + } + else if (args.length === 2) { + return Fraction.LCM(args[0], args[1]); + } + else { + // args.shift() removes the first number. + // LCM the first number with the rest of the numbers. + return Fraction.LCM(args.shift(), Fraction.LCMM(args)); + } + } + /** Set the numerator and denominator. */ + set(numerator = 1, denominator = 1) { + this.numerator = numerator; + this.denominator = denominator; + return this; + } + /** Return the value of the fraction. */ + value() { + return this.numerator / this.denominator; + } + /** Simplify numerator and denominator using GCD. */ + simplify() { + let u = this.numerator; + let d = this.denominator; + const gcd = Fraction.GCD(u, d); + u /= gcd; + d /= gcd; + if (d < 0) { + d = -d; + u = -u; + } + return this.set(u, d); + } + /** Add value of another fraction. */ + add(param1 = 0, param2 = 1) { + const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2); + const lcm = Fraction.LCM(this.denominator, otherDenominator); + const a = lcm / this.denominator; + const b = lcm / otherDenominator; + const u = this.numerator * a + otherNumerator * b; + return this.set(u, lcm); + } + /** Substract value of another fraction. */ + subtract(param1 = 0, param2 = 1) { + const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2); + const lcm = Fraction.LCM(this.denominator, otherDenominator); + const a = lcm / this.denominator; + const b = lcm / otherDenominator; + const u = this.numerator * a - otherNumerator * b; + return this.set(u, lcm); + } + /** Multiply by value of another fraction. */ + multiply(param1 = 1, param2 = 1) { + const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2); + return this.set(this.numerator * otherNumerator, this.denominator * otherDenominator); + } + /** Divide by value of another Fraction. */ + divide(param1 = 1, param2 = 1) { + const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2); + return this.set(this.numerator * otherDenominator, this.denominator * otherNumerator); + } + /** Simplify both sides and check if they are equal. */ + equals(compare) { + const a = Fraction.__staticFractionA.copy(compare).simplify(); + const b = Fraction.__staticFractionB.copy(this).simplify(); + return a.numerator === b.numerator && a.denominator === b.denominator; + } + /** Greater than operator. */ + greaterThan(compare) { + const a = Fraction.__staticFractionB.copy(this); + a.subtract(compare); + return a.numerator > 0; + } + /** Greater than or equals operator. */ + greaterThanEquals(compare) { + const a = Fraction.__staticFractionB.copy(this); + a.subtract(compare); + return a.numerator >= 0; + } + /** Less than operator. */ + lessThan(compare) { + return !this.greaterThanEquals(compare); + } + /** Less than or equals operator. */ + lessThanEquals(compare) { + return !this.greaterThan(compare); + } + /** Return a new copy with current values. */ + clone() { + return new Fraction(this.numerator, this.denominator); + } + /** Copy value of another fraction. */ + copy(other) { + if (typeof other === 'number') { + return this.set(other, 1); + } + else { + return this.set(other.numerator, other.denominator); + } + } + /** Return the integer component (eg. 5/2 => 2). */ + quotient() { + return Math.floor(this.numerator / this.denominator); + } + /** Return the remainder component (eg. 5/2 => 1). */ + remainder() { + return this.numerator % this.denominator; + } + /** Calculate absolute value. */ + makeAbs() { + this.denominator = Math.abs(this.denominator); + this.numerator = Math.abs(this.numerator); + return this; + } + /** Return a raw string representation (eg. "5/2"). */ + toString() { + return `${this.numerator}/${this.denominator}`; + } + /** Return a simplified string respresentation. */ + toSimplifiedString() { + return Fraction.__staticFractionTmp.copy(this).simplify().toString(); + } + /** Return string representation in mixed form. */ + toMixedString() { + let s = ''; + const q = this.quotient(); + const f = Fraction.__staticFractionTmp.copy(this); + if (q < 0) { + f.makeAbs(); + } + if (q !== 0) { + s += q; + if (f.numerator !== 0) { + s += ` ${f.toSimplifiedString()}`; + } + } + else if (f.numerator === 0) { + s = '0'; + } + else { + s = f.toSimplifiedString(); + } + return s; + } + /** Parse a fraction string. */ + parse(str) { + const i = str.split('/'); + const n = parseInt(i[0], 10); + const d = i[1] ? parseInt(i[1], 10) : 1; + return this.set(n, d); + } +} +// Cached objects for comparisons. +Fraction.__staticFractionA = new Fraction(); +Fraction.__staticFractionB = new Fraction(); +Fraction.__staticFractionTmp = new Fraction(); +/** Helper function to extract the numerator and denominator from another fraction. */ +function getNumeratorAndDenominator(n, d = 1) { + if (typeof n === 'number') { + // Both params are numbers, so we return them as [numerator, denominator]. + return [n, d]; + } + else { + // First param is a Fraction object. We ignore the second param. + return [n.numerator, n.denominator]; + } +} + + +/***/ }), + +/***/ "./src/frethandfinger.ts": +/*!*******************************!*\ + !*** ./src/frethandfinger.ts ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "FretHandFinger": () => (/* binding */ FretHandFinger) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _textformatter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./textformatter */ "./src/textformatter.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// VexFlow - Music Engraving for HTML5 +// Copyright Mohit Muthanna 2010 +// Author Larry Kuhns 2013 +// Class to draws string numbers into the notation. + + + + + + +class FretHandFinger extends _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier { + constructor(finger) { + super(); + this.finger = finger; + this.width = 7; + this.position = _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.LEFT; // Default position above stem or note head + this.x_shift = 0; + this.y_shift = 0; + this.x_offset = 0; // Horizontal offset from default + this.y_offset = 0; // Vertical offset from default + this.resetFont(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_4__.Category.FretHandFinger; + } + // Arrange fingerings inside a ModifierContext. + static format(nums, state) { + const { left_shift, right_shift } = state; + const num_spacing = 1; + if (!nums || nums.length === 0) + return false; + const nums_list = []; + let prev_note = null; + let shiftLeft = 0; + let shiftRight = 0; + for (let i = 0; i < nums.length; ++i) { + const num = nums[i]; + const note = num.getNote(); + const pos = num.getPosition(); + const index = num.checkIndex(); + const props = note.getKeyProps()[index]; + const textFormatter = _textformatter__WEBPACK_IMPORTED_MODULE_3__.TextFormatter.create(num.textFont); + const textHeight = textFormatter.maxHeight; + if (num.position === _modifier__WEBPACK_IMPORTED_MODULE_1__.ModifierPosition.ABOVE) { + state.top_text_line += textHeight / _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.STAVE_LINE_DISTANCE + 0.5; + } + if (num.position === _modifier__WEBPACK_IMPORTED_MODULE_1__.ModifierPosition.BELOW) { + state.text_line += textHeight / _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.STAVE_LINE_DISTANCE + 0.5; + } + if (note !== prev_note) { + for (let n = 0; n < note.keys.length; ++n) { + if (left_shift === 0) { + shiftLeft = Math.max(note.getLeftDisplacedHeadPx(), shiftLeft); + } + if (right_shift === 0) { + shiftRight = Math.max(note.getRightDisplacedHeadPx(), shiftRight); + } + } + prev_note = note; + } + nums_list.push({ + note, + num, + pos, + line: props.line, + shiftL: shiftLeft, + shiftR: shiftRight, + }); + } + // Sort fingernumbers by line number. + nums_list.sort((a, b) => b.line - a.line); + let numShiftL = 0; + let numShiftR = 0; + let xWidthL = 0; + let xWidthR = 0; + let lastLine = null; + let lastNote = null; + for (let i = 0; i < nums_list.length; ++i) { + let num_shift = 0; + const { note, pos, num, line, shiftL, shiftR } = nums_list[i]; + // Reset the position of the string number every line. + if (line !== lastLine || note !== lastNote) { + numShiftL = left_shift + shiftL; + numShiftR = right_shift + shiftR; + } + const numWidth = num.getWidth() + num_spacing; + if (pos === _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.LEFT) { + num.setXShift(left_shift + numShiftL); + num_shift = left_shift + numWidth; // spacing + xWidthL = num_shift > xWidthL ? num_shift : xWidthL; + } + else if (pos === _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.RIGHT) { + num.setXShift(numShiftR); + num_shift = shiftRight + numWidth; // spacing + xWidthR = num_shift > xWidthR ? num_shift : xWidthR; + } + lastLine = line; + lastNote = note; + } + state.left_shift += xWidthL; + state.right_shift += xWidthR; + return true; + } + static easyScoreHook({ fingerings } = {}, note, builder) { + fingerings === null || fingerings === void 0 ? void 0 : fingerings.split(',').map((fingeringString) => { + const split = fingeringString.trim().split('.'); + const params = { number: split[0] }; + if (split[1]) + params.position = split[1]; + return builder.getFactory().Fingering(params); + }).map((fingering, index) => note.addModifier(fingering, index)); + } + setFretHandFinger(finger) { + this.finger = finger; + return this; + } + getFretHandFinger() { + return this.finger; + } + setOffsetX(x) { + this.x_offset = x; + return this; + } + setOffsetY(y) { + this.y_offset = y; + return this; + } + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const start = note.getModifierStartXY(this.position, this.index); + let dot_x = start.x + this.x_shift + this.x_offset; + let dot_y = start.y + this.y_shift + this.y_offset + 5; + switch (this.position) { + case _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.ABOVE: + dot_x -= 4; + dot_y -= 12; + break; + case _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.BELOW: + dot_x -= 2; + dot_y += 10; + break; + case _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.LEFT: + dot_x -= this.width; + break; + case _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.RIGHT: + dot_x += 1; + break; + default: + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('InvalidPosition', `The position ${this.position} does not exist`); + } + ctx.save(); + ctx.setFont(this.textFont); + ctx.fillText('' + this.finger, dot_x, dot_y); + ctx.restore(); + } +} +FretHandFinger.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_0__.Font.SANS_SERIF, + size: 9, + weight: _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.BOLD, + style: _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.NORMAL, +}; + + +/***/ }), + +/***/ "./src/ghostnote.ts": +/*!**************************!*\ + !*** ./src/ghostnote.ts ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "GhostNote": () => (/* binding */ GhostNote) +/* harmony export */ }); +/* harmony import */ var _stemmablenote__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./stemmablenote */ "./src/stemmablenote.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// ## Description + + + +const ERROR_MSG = 'Ghost note must have valid initialization data to identify duration.'; +class GhostNote extends _stemmablenote__WEBPACK_IMPORTED_MODULE_0__.StemmableNote { + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_1__.Category.GhostNote; + } + constructor(parameter) { + if (!parameter) { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('BadArguments', ERROR_MSG); + } + let noteStruct; + if (typeof parameter === 'string') { + // Preserve backwards-compatibility + noteStruct = { duration: parameter }; + } + else if (typeof parameter === 'object') { + noteStruct = parameter; + } + else { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('BadArguments', ERROR_MSG); + } + super(noteStruct); + // Note properties + this.setWidth(0); + } + /** + * @returns true if this note is a type of rest. Rests don't have pitches, but take up space in the score. + */ + isRest() { + return true; + } + setStave(stave) { + super.setStave(stave); + return this; + } + /* Overridden to ignore */ + // eslint-disable-next-line + addToModifierContext(mc) { + // DO NOTHING. + return this; + } + preFormat() { + this.preFormatted = true; + return this; + } + draw() { + // Draw Annotations + this.setRendered(); + for (let i = 0; i < this.modifiers.length; ++i) { + const modifier = this.modifiers[i]; + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_1__.isAnnotation)(modifier)) { + modifier.setContext(this.getContext()); + modifier.drawWithStyle(); + } + } + } +} + + +/***/ }), + +/***/ "./src/glyph.ts": +/*!**********************!*\ + !*** ./src/glyph.ts ***! + \**********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "OutlineCode": () => (/* binding */ OutlineCode), +/* harmony export */ "Glyph": () => (/* binding */ Glyph) +/* harmony export */ }); +/* harmony import */ var _boundingbox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./boundingbox */ "./src/boundingbox.ts"); +/* harmony import */ var _boundingboxcomputation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./boundingboxcomputation */ "./src/boundingboxcomputation.ts"); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + +var OutlineCode; +(function (OutlineCode) { + OutlineCode[OutlineCode["MOVE"] = 0] = "MOVE"; + OutlineCode[OutlineCode["LINE"] = 1] = "LINE"; + OutlineCode[OutlineCode["QUADRATIC"] = 2] = "QUADRATIC"; + OutlineCode[OutlineCode["BEZIER"] = 3] = "BEZIER"; +})(OutlineCode || (OutlineCode = {})); +class GlyphCacheEntry { + constructor(fontStack, code, category) { + this.point = -1; + this.metrics = Glyph.loadMetrics(fontStack, code, category); + this.bbox = Glyph.getOutlineBoundingBox(this.metrics.outline, this.metrics.scale, this.metrics.x_shift, this.metrics.y_shift); + if (category) { + this.point = Glyph.lookupFontMetric(this.metrics.font, category, code, 'point', -1); + } + } +} +class GlyphCache { + constructor() { + this.cache = new Map(); + } + lookup(code, category) { + let entries = this.cache.get(Glyph.CURRENT_CACHE_KEY); + if (entries === undefined) { + entries = {}; + this.cache.set(Glyph.CURRENT_CACHE_KEY, entries); + } + const key = category ? `${code}%${category}` : code; + let entry = entries[key]; + if (entry === undefined) { + entry = new GlyphCacheEntry(Glyph.MUSIC_FONT_STACK, code, category); + entries[key] = entry; + } + return entry; + } +} +class GlyphOutline { + constructor(outline, originX, originY, scale) { + this.outline = outline; + this.originX = originX; + this.originY = originY; + this.scale = scale; + this.i = 0; + // Automatically assign private properties: this.outline, this.originX, this.originY, and this.scale. + } + done() { + return this.i >= this.outline.length; + } + next() { + return this.outline[this.i++]; + } + nextX() { + return this.originX + this.outline[this.i++] * this.scale; + } + nextY() { + return this.originY - this.outline[this.i++] * this.scale; + } + static parse(str) { + const result = []; + const parts = str.split(' '); + let i = 0; + while (i < parts.length) { + switch (parts[i++]) { + case 'm': + result.push(OutlineCode.MOVE, parseInt(parts[i++]), parseInt(parts[i++])); + break; + case 'l': + result.push(OutlineCode.LINE, parseInt(parts[i++]), parseInt(parts[i++])); + break; + case 'q': + result.push(OutlineCode.QUADRATIC, parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++])); + break; + case 'b': + result.push(OutlineCode.BEZIER, parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++])); + break; + } + } + return result; + } +} +class Glyph extends _element__WEBPACK_IMPORTED_MODULE_2__.Element { + /** + * @param code + * @param point + * @param options + */ + constructor(code, point, options) { + super(); + ////////////////////////////////////////////////////////////////////////////////////////////////// + // INSTANCE MEMBERS + this.bbox = new _boundingbox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox(0, 0, 0, 0); + this.topGlyphs = []; + this.botGlyphs = []; + this.options = {}; + this.scale = 1; + this.code = code; + this.point = point; + this.originShift = { x: 0, y: 0 }; + this.x_shift = 0; + this.y_shift = 0; + if (options) { + this.setOptions(options); + } + else { + this.reset(); + } + } + ////////////////////////////////////////////////////////////////////////////////////////////////// + // STATIC MEMBERS + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.Glyph; + } + /** + * Pass a key of the form `glyphs.{category}.{code}.{key}` to Font.lookupMetric(). If the initial lookup fails, + * try again with the path `glyphs.{category}.{key}`. If the second lookup fails, return the defaultValue. + * + * @param font + * @param category any metric path under 'glyphs', so 'stem.up' could resolve to glyphs.stem.up.shiftX, glyphs.stem.up.shiftY, etc. + * @param code + * @param key + * @param defaultValue + */ + static lookupFontMetric(font, category, code, key, defaultValue) { + let value = font.lookupMetric(`glyphs.${category}.${code}.${key}`, undefined); + if (value === undefined) { + // The first lookup failed, so we omit .${code} and try again (with a defaultValue this time). + value = font.lookupMetric(`glyphs.${category}.${key}`, defaultValue); + } + return value; + } + static lookupGlyph(fontStack, code) { + (0,_util__WEBPACK_IMPORTED_MODULE_4__.defined)(fontStack, 'BadFontStack', 'Font stack is misconfigured'); + let glyph; + let font; + for (let i = 0; i < fontStack.length; i++) { + font = fontStack[i]; + glyph = font.getGlyphs()[code]; + if (glyph) + return { glyph, font }; + } + throw new _util__WEBPACK_IMPORTED_MODULE_4__.RuntimeError('BadGlyph', `Glyph ${code} does not exist in font.`); + } + static loadMetrics(fontStack, code, category) { + const { glyph, font } = Glyph.lookupGlyph(fontStack, code); + if (!glyph.o) + throw new _util__WEBPACK_IMPORTED_MODULE_4__.RuntimeError('BadGlyph', `Glyph ${code} has no outline defined.`); + let x_shift = 0; + let y_shift = 0; + let scale = 1; + if (category && font) { + x_shift = Glyph.lookupFontMetric(font, category, code, 'shiftX', 0); + y_shift = Glyph.lookupFontMetric(font, category, code, 'shiftY', 0); + scale = Glyph.lookupFontMetric(font, category, code, 'scale', 1); + } + const x_min = glyph.x_min; + const x_max = glyph.x_max; + const ha = glyph.ha; + if (!glyph.cached_outline) { + glyph.cached_outline = GlyphOutline.parse(glyph.o); + } + return { + x_min, + x_max, + x_shift, + y_shift, + scale, + ha, + outline: glyph.cached_outline, + font, + width: x_max - x_min, + height: ha, + }; + } + /** + * Renders glyphs from the default font stack. + * + * @param ctx Canvas or SVG context + * @param x_pos x coordinate + * @param y_pos y coordinate + * @param point the point size of the font + * @param code the glyph code in font.getGlyphs() + * @param options + * @returns + */ + static renderGlyph(ctx, x_pos, y_pos, point, code, options) { + var _a; + const data = Glyph.cache.lookup(code, options === null || options === void 0 ? void 0 : options.category); + const metrics = data.metrics; + if (data.point != -1) { + point = data.point; + } + const customScale = (_a = options === null || options === void 0 ? void 0 : options.scale) !== null && _a !== void 0 ? _a : 1; + const scale = ((point * 72.0) / (metrics.font.getResolution() * 100.0)) * metrics.scale * customScale; + Glyph.renderOutline(ctx, metrics.outline, scale, x_pos + metrics.x_shift * customScale, y_pos + metrics.y_shift * customScale); + return metrics; + } + static renderOutline(ctx, outline, scale, x_pos, y_pos) { + const go = new GlyphOutline(outline, x_pos, y_pos, scale); + ctx.beginPath(); + let x, y; + while (!go.done()) { + switch (go.next()) { + case OutlineCode.MOVE: + ctx.moveTo(go.nextX(), go.nextY()); + break; + case OutlineCode.LINE: + ctx.lineTo(go.nextX(), go.nextY()); + break; + case OutlineCode.QUADRATIC: + x = go.nextX(); + y = go.nextY(); + ctx.quadraticCurveTo(go.nextX(), go.nextY(), x, y); + break; + case OutlineCode.BEZIER: + x = go.nextX(); + y = go.nextY(); + ctx.bezierCurveTo(go.nextX(), go.nextY(), go.nextX(), go.nextY(), x, y); + break; + } + } + ctx.fill(); + } + static getOutlineBoundingBox(outline, scale, x_pos, y_pos) { + const go = new GlyphOutline(outline, x_pos, y_pos, scale); + const bboxComp = new _boundingboxcomputation__WEBPACK_IMPORTED_MODULE_1__.BoundingBoxComputation(); + // (penX, penY) hold the pen position: the start of each stroke. + let penX = x_pos; + let penY = y_pos; + let x, y; + while (!go.done()) { + switch (go.next()) { + case OutlineCode.MOVE: + // Note that we don't add any points to the bounding box until a srroke is actually drawn. + penX = go.nextX(); + penY = go.nextY(); + break; + case OutlineCode.LINE: + bboxComp.addPoint(penX, penY); + penX = go.nextX(); + penY = go.nextY(); + bboxComp.addPoint(penX, penY); + break; + case OutlineCode.QUADRATIC: + x = go.nextX(); + y = go.nextY(); + bboxComp.addQuadraticCurve(penX, penY, go.nextX(), go.nextY(), x, y); + penX = x; + penY = y; + break; + case OutlineCode.BEZIER: + x = go.nextX(); + y = go.nextY(); + bboxComp.addBezierCurve(penX, penY, go.nextX(), go.nextY(), go.nextX(), go.nextY(), x, y); + penX = x; + penY = y; + break; + } + } + return new _boundingbox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox(bboxComp.getX1(), bboxComp.getY1(), bboxComp.width(), bboxComp.height()); + } + static getWidth(code, point, category) { + const data = Glyph.cache.lookup(code, category); + if (data.point != -1) { + point = data.point; + } + const scale = (point * 72) / (data.metrics.font.getResolution() * 100); + return data.bbox.getW() * scale; + } + // eslint-disable-next-line + draw(...args) { + // DO NOTHING. + } + getCode() { + return this.code; + } + // eslint-disable-next-line + setOptions(options) { + this.options = Object.assign(Object.assign({}, this.options), options); + this.reset(); + } + setPoint(point) { + this.point = point; + return this; + } + setStave(stave) { + this.stave = stave; + return this; + } + setXShift(x_shift) { + this.x_shift = x_shift; + return this; + } + setYShift(y_shift) { + this.y_shift = y_shift; + return this; + } + reset() { + const data = Glyph.cache.lookup(this.code, this.options.category); + this.metrics = data.metrics; + // Override point from metrics file + if (data.point != -1) { + this.point = data.point; + } + this.scale = (this.point * 72) / (this.metrics.font.getResolution() * 100); + this.bbox = new _boundingbox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox(data.bbox.getX() * this.scale, data.bbox.getY() * this.scale, data.bbox.getW() * this.scale, data.bbox.getH() * this.scale); + } + checkMetrics() { + return (0,_util__WEBPACK_IMPORTED_MODULE_4__.defined)(this.metrics, 'BadGlyph', `Glyph ${this.code} is not initialized.`); + } + getMetrics() { + const metrics = this.checkMetrics(); + const metricsScale = metrics.scale; + return { + x_min: metrics.x_min * this.scale * metricsScale, + x_max: metrics.x_max * this.scale * metricsScale, + width: this.bbox.getW(), + height: this.bbox.getH(), + scale: this.scale * metricsScale, + x_shift: metrics.x_shift, + y_shift: metrics.y_shift, + outline: metrics.outline, + font: metrics.font, + ha: metrics.ha, + }; + } + setOriginX(x) { + const { bbox } = this; + const originX = Math.abs(bbox.getX() / bbox.getW()); + const xShift = (x - originX) * bbox.getW(); + this.originShift.x = -xShift; + } + setOriginY(y) { + const { bbox } = this; + const originY = Math.abs(bbox.getY() / bbox.getH()); + const yShift = (y - originY) * bbox.getH(); + this.originShift.y = -yShift; + } + setOrigin(x, y) { + this.setOriginX(x); + this.setOriginY(y); + } + render(ctx, x, y) { + const metrics = this.checkMetrics(); + const outline = metrics.outline; + const scale = this.scale * metrics.scale; + this.setRendered(); + this.applyStyle(ctx); + const xPos = x + this.originShift.x + metrics.x_shift; + const yPos = y + this.originShift.y + metrics.y_shift; + Glyph.renderOutline(ctx, outline, scale, xPos, yPos); + this.restoreStyle(ctx); + } + checkStave() { + return (0,_util__WEBPACK_IMPORTED_MODULE_4__.defined)(this.stave, 'NoStave', 'No stave attached to instance.'); + } + renderToStave(x) { + const context = this.checkContext(); + const metrics = this.checkMetrics(); + const stave = this.checkStave(); + const outline = metrics.outline; + const scale = this.scale * metrics.scale; + this.setRendered(); + this.applyStyle(); + const xPos = x + this.x_shift + metrics.x_shift; + const yPos = stave.getYForGlyphs() + this.y_shift + metrics.y_shift; + Glyph.renderOutline(context, outline, scale, xPos, yPos); + this.restoreStyle(); + } +} +Glyph.cache = new GlyphCache(); +// The current cache key for GlyphCache above. +// Computed when Flow.setMusicFont(...) is called. +// It is set to a comma separated list of font names. +Glyph.CURRENT_CACHE_KEY = ''; +// Used by the GlyphCache above. +// Set when Flow.setMusicFont(...) is called. +Glyph.MUSIC_FONT_STACK = []; + + +/***/ }), + +/***/ "./src/glyphnote.ts": +/*!**************************!*\ + !*** ./src/glyphnote.ts ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "GlyphNote": () => (/* binding */ GlyphNote) +/* harmony export */ }); +/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./note */ "./src/note.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. + + +class GlyphNote extends _note__WEBPACK_IMPORTED_MODULE_0__.Note { + constructor(glyph, noteStruct, options) { + super(noteStruct); + this.options = Object.assign({ ignoreTicks: false, line: 2 }, options); + // Note properties + this.ignore_ticks = this.options.ignoreTicks; + if (glyph) { + this.setGlyph(glyph); + } + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_1__.Category.GlyphNote; + } + setGlyph(glyph) { + this.glyph = glyph; + this.setWidth(this.glyph.getMetrics().width); + return this; + } + getBoundingBox() { + return this.glyph.getBoundingBox(); + } + preFormat() { + if (!this.preFormatted && this.modifierContext) { + this.modifierContext.preFormat(); + } + this.preFormatted = true; + return this; + } + drawModifiers() { + const ctx = this.checkContext(); + ctx.openGroup('modifiers'); + for (let i = 0; i < this.modifiers.length; i++) { + const modifier = this.modifiers[i]; + modifier.setContext(ctx); + modifier.drawWithStyle(); + } + ctx.closeGroup(); + } + draw() { + const stave = this.checkStave(); + const ctx = stave.checkContext(); + this.setRendered(); + ctx.openGroup('glyphNote', this.getAttribute('id')); + // Context is set when setStave is called on Note + const glyph = this.glyph; + if (!glyph.getContext()) { + glyph.setContext(ctx); + } + glyph.setStave(stave); + glyph.setYShift(stave.getYForLine(this.options.line) - stave.getYForGlyphs()); + const x = this.isCenterAligned() ? this.getAbsoluteX() - this.getWidth() / 2 : this.getAbsoluteX(); + glyph.renderToStave(x); + this.drawModifiers(); + ctx.closeGroup(); + } +} + + +/***/ }), + +/***/ "./src/gracenote.ts": +/*!**************************!*\ + !*** ./src/gracenote.ts ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "GraceNote": () => (/* binding */ GraceNote) +/* harmony export */ }); +/* harmony import */ var _stavenote__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./stavenote */ "./src/stavenote.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. + + + + + +class GraceNote extends _stavenote__WEBPACK_IMPORTED_MODULE_0__.StaveNote { + constructor(noteStruct) { + super(Object.assign({ glyph_font_scale: _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.NOTATION_FONT_SCALE * GraceNote.SCALE, stroke_px: GraceNote.LEDGER_LINE_OFFSET }, noteStruct)); + this.slash = noteStruct.slash || false; + this.slur = true; + this.buildNoteHeads(); + this.width = 3; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.GraceNote; + } + static get LEDGER_LINE_OFFSET() { + return 2; + } + static get SCALE() { + return 0.66; + } + getStemExtension() { + if (this.stem_extension_override) { + return this.stem_extension_override; + } + const glyph = this.getGlyph(); + if (glyph) { + let ret = super.getStemExtension(); + if (glyph.stem) { + const staveNoteScale = this.getStaveNoteScale(); + ret = (_stem__WEBPACK_IMPORTED_MODULE_1__.Stem.HEIGHT + ret) * staveNoteScale - _stem__WEBPACK_IMPORTED_MODULE_1__.Stem.HEIGHT; + } + return ret; + } + return 0; + } + // FIXME: move this to more basic class. + getStaveNoteScale() { + return this.render_options.glyph_font_scale / _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.NOTATION_FONT_SCALE; + } + draw() { + super.draw(); + this.setRendered(); + const stem = this.stem; + if (this.slash && stem) { + const staveNoteScale = this.getStaveNoteScale(); + // some magic numbers are based on the staveNoteScale 0.66. + const offsetScale = staveNoteScale / 0.66; + let slashBBox = undefined; + const beam = this.beam; + if (beam) { + // FIXME: should render slash after beam? + if (!beam.postFormatted) { + beam.postFormat(); + } + slashBBox = this.calcBeamedNotesSlashBBox(8 * offsetScale, 8 * offsetScale, { + stem: 6 * offsetScale, + beam: 5 * offsetScale, + }); + } + else { + const stem_direction = this.getStemDirection(); + const noteHeadBounds = this.getNoteHeadBounds(); + const noteStemHeight = stem.getHeight(); + let x = this.getAbsoluteX(); + let y = stem_direction === _stem__WEBPACK_IMPORTED_MODULE_1__.Stem.DOWN + ? noteHeadBounds.y_top - noteStemHeight + : noteHeadBounds.y_bottom - noteStemHeight; + let defaultOffsetY = _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.STEM_HEIGHT; + defaultOffsetY -= defaultOffsetY / 2.8; + y += defaultOffsetY * staveNoteScale * stem_direction; + const offsets = stem_direction === _stem__WEBPACK_IMPORTED_MODULE_1__.Stem.UP + ? { + x1: 1, + y1: 0, + x2: 13, + y2: -9, + } + : { + x1: -4, + y1: 1, + x2: 13, + y2: 9, + }; + x += offsets.x1 * offsetScale; + y += offsets.y1 * offsetScale; + slashBBox = { + x1: x, + y1: y, + x2: x + offsets.x2 * offsetScale, + y2: y + offsets.y2 * offsetScale, + }; + } + // FIXME: avoid staff lines, ledger lines or others. + const ctx = this.checkContext(); + ctx.save(); + ctx.setLineWidth(1 * offsetScale); // FIXME: use more appropriate value. + ctx.beginPath(); + ctx.moveTo(slashBBox.x1, slashBBox.y1); + ctx.lineTo(slashBBox.x2, slashBBox.y2); + ctx.closePath(); + ctx.stroke(); + ctx.restore(); + } + } + calcBeamedNotesSlashBBox(slashStemOffset, slashBeamOffset, protrusions) { + const beam = this.beam; + if (!beam) + throw new _util__WEBPACK_IMPORTED_MODULE_4__.RuntimeError('NoBeam', "Can't calculate without a beam."); + const beam_slope = beam.slope; + const isBeamEndNote = beam.notes[beam.notes.length - 1] === this; + const scaleX = isBeamEndNote ? -1 : 1; + const beam_angle = Math.atan(beam_slope * scaleX); + // slash line intersecting point on beam. + const iPointOnBeam = { + dx: Math.cos(beam_angle) * slashBeamOffset, + dy: Math.sin(beam_angle) * slashBeamOffset, + }; + slashStemOffset *= this.getStemDirection(); + const slash_angle = Math.atan((iPointOnBeam.dy - slashStemOffset) / iPointOnBeam.dx); + const protrusion_stem_dx = Math.cos(slash_angle) * protrusions.stem * scaleX; + const protrusion_stem_dy = Math.sin(slash_angle) * protrusions.stem; + const protrusion_beam_dx = Math.cos(slash_angle) * protrusions.beam * scaleX; + const protrusion_beam_dy = Math.sin(slash_angle) * protrusions.beam; + const stemX = this.getStemX(); + const stem0X = beam.notes[0].getStemX(); + const stemY = beam.getBeamYToDraw() + (stemX - stem0X) * beam_slope; + const ret = { + x1: stemX - protrusion_stem_dx, + y1: stemY + slashStemOffset - protrusion_stem_dy, + x2: stemX + iPointOnBeam.dx * scaleX + protrusion_beam_dx, + y2: stemY + iPointOnBeam.dy + protrusion_beam_dy, + }; + return ret; + } +} + + +/***/ }), + +/***/ "./src/gracenotegroup.ts": +/*!*******************************!*\ + !*** ./src/gracenotegroup.ts ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "GraceNoteGroup": () => (/* binding */ GraceNoteGroup) +/* harmony export */ }); +/* harmony import */ var _beam__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./beam */ "./src/beam.ts"); +/* harmony import */ var _formatter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./formatter */ "./src/formatter.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _stavetie__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./stavetie */ "./src/stavetie.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _tabtie__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tabtie */ "./src/tabtie.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +/* harmony import */ var _voice__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./voice */ "./src/voice.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// ## Description +// +// This file implements `GraceNoteGroup` which is used to format and +// render grace notes. + + + + + + + + + +// To enable logging for this class. Set `GraceNoteGroup.DEBUG` to `true`. +// eslint-disable-next-line +function L(...args) { + if (GraceNoteGroup.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_7__.log)('Vex.Flow.GraceNoteGroup', args); +} +/** GraceNoteGroup is used to format and render grace notes. */ +class GraceNoteGroup extends _modifier__WEBPACK_IMPORTED_MODULE_2__.Modifier { + //** `GraceNoteGroup` inherits from `Modifier` and is placed inside a `ModifierContext`. */ + constructor(grace_notes, show_slur) { + super(); + this.preFormatted = false; + this.position = _modifier__WEBPACK_IMPORTED_MODULE_2__.Modifier.Position.LEFT; + this.grace_notes = grace_notes; + this.width = 0; + this.show_slur = show_slur; + this.slur = undefined; + this.voice = new _voice__WEBPACK_IMPORTED_MODULE_8__.Voice({ + num_beats: 4, + beat_value: 4, + resolution: _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.RESOLUTION, + }).setStrict(false); + this.render_options = { + slur_y_shift: 0, + }; + this.beams = []; + this.voice.addTickables(this.grace_notes); + return this; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_6__.Category.GraceNoteGroup; + } + /** Arranges groups inside a `ModifierContext`. */ + static format(gracenote_groups, state) { + const group_spacing_stave = 4; + const group_spacing_tab = 0; + if (!gracenote_groups || gracenote_groups.length === 0) + return false; + const group_list = []; + let prev_note = null; + let shiftL = 0; + for (let i = 0; i < gracenote_groups.length; ++i) { + const gracenote_group = gracenote_groups[i]; + const note = gracenote_group.getNote(); + const is_stavenote = (0,_typeguard__WEBPACK_IMPORTED_MODULE_6__.isStaveNote)(note); + const spacing = is_stavenote ? group_spacing_stave : group_spacing_tab; + if (is_stavenote && note !== prev_note) { + // Iterate through all notes to get the displaced pixels + for (let n = 0; n < note.keys.length; ++n) { + shiftL = Math.max(note.getLeftDisplacedHeadPx(), shiftL); + } + prev_note = note; + } + group_list.push({ shift: shiftL, gracenote_group, spacing }); + } + // If first note left shift in case it is displaced + let group_shift = group_list[0].shift; + let formatWidth; + for (let i = 0; i < group_list.length; ++i) { + const gracenote_group = group_list[i].gracenote_group; + gracenote_group.preFormat(); + formatWidth = gracenote_group.getWidth() + group_list[i].spacing; + group_shift = Math.max(formatWidth, group_shift); + } + for (let i = 0; i < group_list.length; ++i) { + const gracenote_group = group_list[i].gracenote_group; + formatWidth = gracenote_group.getWidth() + group_list[i].spacing; + gracenote_group.setSpacingFromNextModifier(group_shift - Math.min(formatWidth, group_shift)); + } + state.left_shift += group_shift; + return true; + } + preFormat() { + if (this.preFormatted) + return; + if (!this.formatter) { + this.formatter = new _formatter__WEBPACK_IMPORTED_MODULE_1__.Formatter(); + } + this.formatter.joinVoices([this.voice]).format([this.voice], 0, {}); + this.setWidth(this.formatter.getMinTotalWidth()); + this.preFormatted = true; + } + beamNotes(grace_notes) { + grace_notes = grace_notes || this.grace_notes; + if (grace_notes.length > 1) { + const beam = new _beam__WEBPACK_IMPORTED_MODULE_0__.Beam(grace_notes); + beam.render_options.beam_width = 3; + beam.render_options.partial_beam_length = 4; + this.beams.push(beam); + } + return this; + } + setWidth(width) { + this.width = width; + return this; + } + getWidth() { + return this.width; + } + getGraceNotes() { + return this.grace_notes; + } + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + L('Drawing grace note group for:', note); + this.alignSubNotesWithNote(this.getGraceNotes(), note); // Modifier function + // Draw grace notes. + this.grace_notes.forEach((graceNote) => graceNote.setContext(ctx).draw()); + // Draw beams. + this.beams.forEach((beam) => beam.setContext(ctx).draw()); + if (this.show_slur) { + // Create and draw slur. + const is_stavenote = (0,_typeguard__WEBPACK_IMPORTED_MODULE_6__.isStaveNote)(note); + const TieClass = is_stavenote ? _stavetie__WEBPACK_IMPORTED_MODULE_3__.StaveTie : _tabtie__WEBPACK_IMPORTED_MODULE_5__.TabTie; + this.slur = new TieClass({ + last_note: this.grace_notes[0], + first_note: note, + first_indices: [0], + last_indices: [0], + }); + this.slur.render_options.cp2 = 12; + this.slur.render_options.y_shift = (is_stavenote ? 7 : 5) + this.render_options.slur_y_shift; + this.slur.setContext(ctx).draw(); + } + } +} +GraceNoteGroup.DEBUG = false; + + +/***/ }), + +/***/ "./src/gracetabnote.ts": +/*!*****************************!*\ + !*** ./src/gracetabnote.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "GraceTabNote": () => (/* binding */ GraceTabNote) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _tabnote__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tabnote */ "./src/tabnote.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// @author Balazs Forian-Szabo +// +// ## Description +// +// A basic implementation of grace notes +// to be rendered on a tab stave. +// +// See `tests/gracetabnote_tests.ts` for usage examples. + + + +class GraceTabNote extends _tabnote__WEBPACK_IMPORTED_MODULE_1__.TabNote { + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_2__.Category.GraceTabNote; + } + constructor(noteStruct) { + super(noteStruct, false); + this.render_options = Object.assign(Object.assign({}, this.render_options), { + // vertical shift from stave line + y_shift: 0.3, + // grace glyph scale + scale: 0.6, + // grace tablature font + font: `7.5pt ${_font__WEBPACK_IMPORTED_MODULE_0__.Font.SANS_SERIF}` }); + this.updateWidth(); + } +} + + +/***/ }), + +/***/ "./src/index.ts": +/*!**********************!*\ + !*** ./src/index.ts ***! + \**********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Accidental": () => (/* reexport safe */ _accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental), +/* harmony export */ "Annotation": () => (/* reexport safe */ _annotation__WEBPACK_IMPORTED_MODULE_2__.Annotation), +/* harmony export */ "AnnotationHorizontalJustify": () => (/* reexport safe */ _annotation__WEBPACK_IMPORTED_MODULE_2__.AnnotationHorizontalJustify), +/* harmony export */ "AnnotationVerticalJustify": () => (/* reexport safe */ _annotation__WEBPACK_IMPORTED_MODULE_2__.AnnotationVerticalJustify), +/* harmony export */ "Articulation": () => (/* reexport safe */ _articulation__WEBPACK_IMPORTED_MODULE_3__.Articulation), +/* harmony export */ "BarNote": () => (/* reexport safe */ _barnote__WEBPACK_IMPORTED_MODULE_4__.BarNote), +/* harmony export */ "Beam": () => (/* reexport safe */ _beam__WEBPACK_IMPORTED_MODULE_5__.Beam), +/* harmony export */ "Bend": () => (/* reexport safe */ _bend__WEBPACK_IMPORTED_MODULE_6__.Bend), +/* harmony export */ "BoundingBox": () => (/* reexport safe */ _boundingbox__WEBPACK_IMPORTED_MODULE_7__.BoundingBox), +/* harmony export */ "BoundingBoxComputation": () => (/* reexport safe */ _boundingboxcomputation__WEBPACK_IMPORTED_MODULE_8__.BoundingBoxComputation), +/* harmony export */ "CanvasContext": () => (/* reexport safe */ _canvascontext__WEBPACK_IMPORTED_MODULE_9__.CanvasContext), +/* harmony export */ "ChordSymbol": () => (/* reexport safe */ _chordsymbol__WEBPACK_IMPORTED_MODULE_10__.ChordSymbol), +/* harmony export */ "ChordSymbolHorizontalJustify": () => (/* reexport safe */ _chordsymbol__WEBPACK_IMPORTED_MODULE_10__.ChordSymbolHorizontalJustify), +/* harmony export */ "ChordSymbolVerticalJustify": () => (/* reexport safe */ _chordsymbol__WEBPACK_IMPORTED_MODULE_10__.ChordSymbolVerticalJustify), +/* harmony export */ "SymbolModifiers": () => (/* reexport safe */ _chordsymbol__WEBPACK_IMPORTED_MODULE_10__.SymbolModifiers), +/* harmony export */ "SymbolTypes": () => (/* reexport safe */ _chordsymbol__WEBPACK_IMPORTED_MODULE_10__.SymbolTypes), +/* harmony export */ "Clef": () => (/* reexport safe */ _clef__WEBPACK_IMPORTED_MODULE_11__.Clef), +/* harmony export */ "ClefNote": () => (/* reexport safe */ _clefnote__WEBPACK_IMPORTED_MODULE_12__.ClefNote), +/* harmony export */ "Crescendo": () => (/* reexport safe */ _crescendo__WEBPACK_IMPORTED_MODULE_13__.Crescendo), +/* harmony export */ "Curve": () => (/* reexport safe */ _curve__WEBPACK_IMPORTED_MODULE_14__.Curve), +/* harmony export */ "CurvePosition": () => (/* reexport safe */ _curve__WEBPACK_IMPORTED_MODULE_14__.CurvePosition), +/* harmony export */ "Dot": () => (/* reexport safe */ _dot__WEBPACK_IMPORTED_MODULE_15__.Dot), +/* harmony export */ "Builder": () => (/* reexport safe */ _easyscore__WEBPACK_IMPORTED_MODULE_16__.Builder), +/* harmony export */ "EasyScore": () => (/* reexport safe */ _easyscore__WEBPACK_IMPORTED_MODULE_16__.EasyScore), +/* harmony export */ "EasyScoreGrammar": () => (/* reexport safe */ _easyscore__WEBPACK_IMPORTED_MODULE_16__.EasyScoreGrammar), +/* harmony export */ "Piece": () => (/* reexport safe */ _easyscore__WEBPACK_IMPORTED_MODULE_16__.Piece), +/* harmony export */ "Element": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_17__.Element), +/* harmony export */ "Factory": () => (/* reexport safe */ _factory__WEBPACK_IMPORTED_MODULE_18__.Factory), +/* harmony export */ "Flow": () => (/* reexport safe */ _flow__WEBPACK_IMPORTED_MODULE_19__.Flow), +/* harmony export */ "Font": () => (/* reexport safe */ _font__WEBPACK_IMPORTED_MODULE_20__.Font), +/* harmony export */ "FontStyle": () => (/* reexport safe */ _font__WEBPACK_IMPORTED_MODULE_20__.FontStyle), +/* harmony export */ "FontWeight": () => (/* reexport safe */ _font__WEBPACK_IMPORTED_MODULE_20__.FontWeight), +/* harmony export */ "Formatter": () => (/* reexport safe */ _formatter__WEBPACK_IMPORTED_MODULE_21__.Formatter), +/* harmony export */ "Fraction": () => (/* reexport safe */ _fraction__WEBPACK_IMPORTED_MODULE_22__.Fraction), +/* harmony export */ "FretHandFinger": () => (/* reexport safe */ _frethandfinger__WEBPACK_IMPORTED_MODULE_23__.FretHandFinger), +/* harmony export */ "GhostNote": () => (/* reexport safe */ _ghostnote__WEBPACK_IMPORTED_MODULE_24__.GhostNote), +/* harmony export */ "Glyph": () => (/* reexport safe */ _glyph__WEBPACK_IMPORTED_MODULE_25__.Glyph), +/* harmony export */ "OutlineCode": () => (/* reexport safe */ _glyph__WEBPACK_IMPORTED_MODULE_25__.OutlineCode), +/* harmony export */ "GlyphNote": () => (/* reexport safe */ _glyphnote__WEBPACK_IMPORTED_MODULE_26__.GlyphNote), +/* harmony export */ "GraceNote": () => (/* reexport safe */ _gracenote__WEBPACK_IMPORTED_MODULE_27__.GraceNote), +/* harmony export */ "GraceNoteGroup": () => (/* reexport safe */ _gracenotegroup__WEBPACK_IMPORTED_MODULE_28__.GraceNoteGroup), +/* harmony export */ "GraceTabNote": () => (/* reexport safe */ _gracetabnote__WEBPACK_IMPORTED_MODULE_29__.GraceTabNote), +/* harmony export */ "KeyManager": () => (/* reexport safe */ _keymanager__WEBPACK_IMPORTED_MODULE_30__.KeyManager), +/* harmony export */ "KeySignature": () => (/* reexport safe */ _keysignature__WEBPACK_IMPORTED_MODULE_31__.KeySignature), +/* harmony export */ "KeySigNote": () => (/* reexport safe */ _keysignote__WEBPACK_IMPORTED_MODULE_32__.KeySigNote), +/* harmony export */ "Modifier": () => (/* reexport safe */ _modifier__WEBPACK_IMPORTED_MODULE_33__.Modifier), +/* harmony export */ "ModifierPosition": () => (/* reexport safe */ _modifier__WEBPACK_IMPORTED_MODULE_33__.ModifierPosition), +/* harmony export */ "ModifierContext": () => (/* reexport safe */ _modifiercontext__WEBPACK_IMPORTED_MODULE_34__.ModifierContext), +/* harmony export */ "MultiMeasureRest": () => (/* reexport safe */ _multimeasurerest__WEBPACK_IMPORTED_MODULE_35__.MultiMeasureRest), +/* harmony export */ "Music": () => (/* reexport safe */ _music__WEBPACK_IMPORTED_MODULE_36__.Music), +/* harmony export */ "Note": () => (/* reexport safe */ _note__WEBPACK_IMPORTED_MODULE_37__.Note), +/* harmony export */ "NoteHead": () => (/* reexport safe */ _notehead__WEBPACK_IMPORTED_MODULE_38__.NoteHead), +/* harmony export */ "NoteSubGroup": () => (/* reexport safe */ _notesubgroup__WEBPACK_IMPORTED_MODULE_39__.NoteSubGroup), +/* harmony export */ "Ornament": () => (/* reexport safe */ _ornament__WEBPACK_IMPORTED_MODULE_40__.Ornament), +/* harmony export */ "Parenthesis": () => (/* reexport safe */ _parenthesis__WEBPACK_IMPORTED_MODULE_41__.Parenthesis), +/* harmony export */ "Parser": () => (/* reexport safe */ _parser__WEBPACK_IMPORTED_MODULE_42__.Parser), +/* harmony export */ "PedalMarking": () => (/* reexport safe */ _pedalmarking__WEBPACK_IMPORTED_MODULE_43__.PedalMarking), +/* harmony export */ "Registry": () => (/* reexport safe */ _registry__WEBPACK_IMPORTED_MODULE_44__.Registry), +/* harmony export */ "RenderContext": () => (/* reexport safe */ _rendercontext__WEBPACK_IMPORTED_MODULE_45__.RenderContext), +/* harmony export */ "drawDot": () => (/* reexport safe */ _rendercontext__WEBPACK_IMPORTED_MODULE_45__.drawDot), +/* harmony export */ "Renderer": () => (/* reexport safe */ _renderer__WEBPACK_IMPORTED_MODULE_46__.Renderer), +/* harmony export */ "RendererBackends": () => (/* reexport safe */ _renderer__WEBPACK_IMPORTED_MODULE_46__.RendererBackends), +/* harmony export */ "RendererLineEndType": () => (/* reexport safe */ _renderer__WEBPACK_IMPORTED_MODULE_46__.RendererLineEndType), +/* harmony export */ "RepeatNote": () => (/* reexport safe */ _repeatnote__WEBPACK_IMPORTED_MODULE_47__.RepeatNote), +/* harmony export */ "Stave": () => (/* reexport safe */ _stave__WEBPACK_IMPORTED_MODULE_48__.Stave), +/* harmony export */ "Barline": () => (/* reexport safe */ _stavebarline__WEBPACK_IMPORTED_MODULE_49__.Barline), +/* harmony export */ "BarlineType": () => (/* reexport safe */ _stavebarline__WEBPACK_IMPORTED_MODULE_49__.BarlineType), +/* harmony export */ "StaveConnector": () => (/* reexport safe */ _staveconnector__WEBPACK_IMPORTED_MODULE_50__.StaveConnector), +/* harmony export */ "StaveHairpin": () => (/* reexport safe */ _stavehairpin__WEBPACK_IMPORTED_MODULE_51__.StaveHairpin), +/* harmony export */ "StaveLine": () => (/* reexport safe */ _staveline__WEBPACK_IMPORTED_MODULE_52__.StaveLine), +/* harmony export */ "StaveModifier": () => (/* reexport safe */ _stavemodifier__WEBPACK_IMPORTED_MODULE_53__.StaveModifier), +/* harmony export */ "StaveModifierPosition": () => (/* reexport safe */ _stavemodifier__WEBPACK_IMPORTED_MODULE_53__.StaveModifierPosition), +/* harmony export */ "StaveNote": () => (/* reexport safe */ _stavenote__WEBPACK_IMPORTED_MODULE_54__.StaveNote), +/* harmony export */ "Repetition": () => (/* reexport safe */ _staverepetition__WEBPACK_IMPORTED_MODULE_55__.Repetition), +/* harmony export */ "StaveSection": () => (/* reexport safe */ _stavesection__WEBPACK_IMPORTED_MODULE_56__.StaveSection), +/* harmony export */ "StaveTempo": () => (/* reexport safe */ _stavetempo__WEBPACK_IMPORTED_MODULE_57__.StaveTempo), +/* harmony export */ "StaveText": () => (/* reexport safe */ _stavetext__WEBPACK_IMPORTED_MODULE_58__.StaveText), +/* harmony export */ "StaveTie": () => (/* reexport safe */ _stavetie__WEBPACK_IMPORTED_MODULE_59__.StaveTie), +/* harmony export */ "Volta": () => (/* reexport safe */ _stavevolta__WEBPACK_IMPORTED_MODULE_60__.Volta), +/* harmony export */ "VoltaType": () => (/* reexport safe */ _stavevolta__WEBPACK_IMPORTED_MODULE_60__.VoltaType), +/* harmony export */ "Stem": () => (/* reexport safe */ _stem__WEBPACK_IMPORTED_MODULE_61__.Stem), +/* harmony export */ "StemmableNote": () => (/* reexport safe */ _stemmablenote__WEBPACK_IMPORTED_MODULE_62__.StemmableNote), +/* harmony export */ "StringNumber": () => (/* reexport safe */ _stringnumber__WEBPACK_IMPORTED_MODULE_63__.StringNumber), +/* harmony export */ "Stroke": () => (/* reexport safe */ _strokes__WEBPACK_IMPORTED_MODULE_64__.Stroke), +/* harmony export */ "SVGContext": () => (/* reexport safe */ _svgcontext__WEBPACK_IMPORTED_MODULE_65__.SVGContext), +/* harmony export */ "System": () => (/* reexport safe */ _system__WEBPACK_IMPORTED_MODULE_66__.System), +/* harmony export */ "TabNote": () => (/* reexport safe */ _tabnote__WEBPACK_IMPORTED_MODULE_67__.TabNote), +/* harmony export */ "TabSlide": () => (/* reexport safe */ _tabslide__WEBPACK_IMPORTED_MODULE_68__.TabSlide), +/* harmony export */ "TabStave": () => (/* reexport safe */ _tabstave__WEBPACK_IMPORTED_MODULE_69__.TabStave), +/* harmony export */ "TabTie": () => (/* reexport safe */ _tabtie__WEBPACK_IMPORTED_MODULE_70__.TabTie), +/* harmony export */ "TextBracket": () => (/* reexport safe */ _textbracket__WEBPACK_IMPORTED_MODULE_71__.TextBracket), +/* harmony export */ "TextBracketPosition": () => (/* reexport safe */ _textbracket__WEBPACK_IMPORTED_MODULE_71__.TextBracketPosition), +/* harmony export */ "TextDynamics": () => (/* reexport safe */ _textdynamics__WEBPACK_IMPORTED_MODULE_72__.TextDynamics), +/* harmony export */ "TextFormatter": () => (/* reexport safe */ _textformatter__WEBPACK_IMPORTED_MODULE_73__.TextFormatter), +/* harmony export */ "Justification": () => (/* reexport safe */ _textnote__WEBPACK_IMPORTED_MODULE_74__.Justification), +/* harmony export */ "TextNote": () => (/* reexport safe */ _textnote__WEBPACK_IMPORTED_MODULE_74__.TextNote), +/* harmony export */ "Tickable": () => (/* reexport safe */ _tickable__WEBPACK_IMPORTED_MODULE_75__.Tickable), +/* harmony export */ "TickContext": () => (/* reexport safe */ _tickcontext__WEBPACK_IMPORTED_MODULE_76__.TickContext), +/* harmony export */ "TimeSignatureGlyph": () => (/* reexport safe */ _timesigglyph__WEBPACK_IMPORTED_MODULE_77__.TimeSignatureGlyph), +/* harmony export */ "TimeSignature": () => (/* reexport safe */ _timesignature__WEBPACK_IMPORTED_MODULE_78__.TimeSignature), +/* harmony export */ "TimeSigNote": () => (/* reexport safe */ _timesignote__WEBPACK_IMPORTED_MODULE_79__.TimeSigNote), +/* harmony export */ "Tremolo": () => (/* reexport safe */ _tremolo__WEBPACK_IMPORTED_MODULE_80__.Tremolo), +/* harmony export */ "Tuning": () => (/* reexport safe */ _tuning__WEBPACK_IMPORTED_MODULE_81__.Tuning), +/* harmony export */ "Tuplet": () => (/* reexport safe */ _tuplet__WEBPACK_IMPORTED_MODULE_82__.Tuplet), +/* harmony export */ "TupletLocation": () => (/* reexport safe */ _tuplet__WEBPACK_IMPORTED_MODULE_82__.TupletLocation), +/* harmony export */ "Category": () => (/* reexport safe */ _typeguard__WEBPACK_IMPORTED_MODULE_83__.Category), +/* harmony export */ "isAccidental": () => (/* reexport safe */ _typeguard__WEBPACK_IMPORTED_MODULE_83__.isAccidental), +/* harmony export */ "isAnnotation": () => (/* reexport safe */ _typeguard__WEBPACK_IMPORTED_MODULE_83__.isAnnotation), +/* harmony export */ "isBarline": () => (/* reexport safe */ _typeguard__WEBPACK_IMPORTED_MODULE_83__.isBarline), +/* harmony export */ "isCategory": () => (/* reexport safe */ _typeguard__WEBPACK_IMPORTED_MODULE_83__.isCategory), +/* harmony export */ "isDot": () => (/* reexport safe */ _typeguard__WEBPACK_IMPORTED_MODULE_83__.isDot), +/* harmony export */ "isGraceNote": () => (/* reexport safe */ _typeguard__WEBPACK_IMPORTED_MODULE_83__.isGraceNote), +/* harmony export */ "isGraceNoteGroup": () => (/* reexport safe */ _typeguard__WEBPACK_IMPORTED_MODULE_83__.isGraceNoteGroup), +/* harmony export */ "isNote": () => (/* reexport safe */ _typeguard__WEBPACK_IMPORTED_MODULE_83__.isNote), +/* harmony export */ "isRenderContext": () => (/* reexport safe */ _typeguard__WEBPACK_IMPORTED_MODULE_83__.isRenderContext), +/* harmony export */ "isStaveNote": () => (/* reexport safe */ _typeguard__WEBPACK_IMPORTED_MODULE_83__.isStaveNote), +/* harmony export */ "isStemmableNote": () => (/* reexport safe */ _typeguard__WEBPACK_IMPORTED_MODULE_83__.isStemmableNote), +/* harmony export */ "isTabNote": () => (/* reexport safe */ _typeguard__WEBPACK_IMPORTED_MODULE_83__.isTabNote), +/* harmony export */ "RuntimeError": () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_84__.RuntimeError), +/* harmony export */ "defined": () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_84__.defined), +/* harmony export */ "globalObject": () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_84__.globalObject), +/* harmony export */ "log": () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_84__.log), +/* harmony export */ "midLine": () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_84__.midLine), +/* harmony export */ "normalizeAngle": () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_84__.normalizeAngle), +/* harmony export */ "prefix": () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_84__.prefix), +/* harmony export */ "warn": () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_84__.warn), +/* harmony export */ "Vibrato": () => (/* reexport safe */ _vibrato__WEBPACK_IMPORTED_MODULE_85__.Vibrato), +/* harmony export */ "VibratoBracket": () => (/* reexport safe */ _vibratobracket__WEBPACK_IMPORTED_MODULE_86__.VibratoBracket), +/* harmony export */ "Voice": () => (/* reexport safe */ _voice__WEBPACK_IMPORTED_MODULE_87__.Voice), +/* harmony export */ "VoiceMode": () => (/* reexport safe */ _voice__WEBPACK_IMPORTED_MODULE_87__.VoiceMode), +/* harmony export */ "isHTMLCanvas": () => (/* reexport safe */ _web__WEBPACK_IMPORTED_MODULE_88__.isHTMLCanvas), +/* harmony export */ "isHTMLDiv": () => (/* reexport safe */ _web__WEBPACK_IMPORTED_MODULE_88__.isHTMLDiv), +/* harmony export */ "Vex": () => (/* reexport safe */ _vex__WEBPACK_IMPORTED_MODULE_0__.Vex), +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _vex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vex */ "./src/vex.ts"); +/* harmony import */ var _accidental__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./accidental */ "./src/accidental.ts"); +/* harmony import */ var _annotation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./annotation */ "./src/annotation.ts"); +/* harmony import */ var _articulation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./articulation */ "./src/articulation.ts"); +/* harmony import */ var _barnote__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./barnote */ "./src/barnote.ts"); +/* harmony import */ var _beam__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./beam */ "./src/beam.ts"); +/* harmony import */ var _bend__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./bend */ "./src/bend.ts"); +/* harmony import */ var _boundingbox__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./boundingbox */ "./src/boundingbox.ts"); +/* harmony import */ var _boundingboxcomputation__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./boundingboxcomputation */ "./src/boundingboxcomputation.ts"); +/* harmony import */ var _canvascontext__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./canvascontext */ "./src/canvascontext.ts"); +/* harmony import */ var _chordsymbol__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./chordsymbol */ "./src/chordsymbol.ts"); +/* harmony import */ var _clef__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./clef */ "./src/clef.ts"); +/* harmony import */ var _clefnote__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./clefnote */ "./src/clefnote.ts"); +/* harmony import */ var _crescendo__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./crescendo */ "./src/crescendo.ts"); +/* harmony import */ var _curve__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./curve */ "./src/curve.ts"); +/* harmony import */ var _dot__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./dot */ "./src/dot.ts"); +/* harmony import */ var _easyscore__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./easyscore */ "./src/easyscore.ts"); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _factory__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./factory */ "./src/factory.ts"); +/* harmony import */ var _flow__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./flow */ "./src/flow.ts"); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _formatter__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./formatter */ "./src/formatter.ts"); +/* harmony import */ var _fraction__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./fraction */ "./src/fraction.ts"); +/* harmony import */ var _frethandfinger__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./frethandfinger */ "./src/frethandfinger.ts"); +/* harmony import */ var _ghostnote__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./ghostnote */ "./src/ghostnote.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _glyphnote__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./glyphnote */ "./src/glyphnote.ts"); +/* harmony import */ var _gracenote__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./gracenote */ "./src/gracenote.ts"); +/* harmony import */ var _gracenotegroup__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./gracenotegroup */ "./src/gracenotegroup.ts"); +/* harmony import */ var _gracetabnote__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./gracetabnote */ "./src/gracetabnote.ts"); +/* harmony import */ var _keymanager__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./keymanager */ "./src/keymanager.ts"); +/* harmony import */ var _keysignature__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./keysignature */ "./src/keysignature.ts"); +/* harmony import */ var _keysignote__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./keysignote */ "./src/keysignote.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _modifiercontext__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./modifiercontext */ "./src/modifiercontext.ts"); +/* harmony import */ var _multimeasurerest__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./multimeasurerest */ "./src/multimeasurerest.ts"); +/* harmony import */ var _music__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./music */ "./src/music.ts"); +/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./note */ "./src/note.ts"); +/* harmony import */ var _notehead__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./notehead */ "./src/notehead.ts"); +/* harmony import */ var _notesubgroup__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./notesubgroup */ "./src/notesubgroup.ts"); +/* harmony import */ var _ornament__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./ornament */ "./src/ornament.ts"); +/* harmony import */ var _parenthesis__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./parenthesis */ "./src/parenthesis.ts"); +/* harmony import */ var _parser__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./parser */ "./src/parser.ts"); +/* harmony import */ var _pedalmarking__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./pedalmarking */ "./src/pedalmarking.ts"); +/* harmony import */ var _registry__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ./registry */ "./src/registry.ts"); +/* harmony import */ var _rendercontext__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ./rendercontext */ "./src/rendercontext.ts"); +/* harmony import */ var _renderer__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ./renderer */ "./src/renderer.ts"); +/* harmony import */ var _repeatnote__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ./repeatnote */ "./src/repeatnote.ts"); +/* harmony import */ var _stave__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ./stave */ "./src/stave.ts"); +/* harmony import */ var _stavebarline__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ./stavebarline */ "./src/stavebarline.ts"); +/* harmony import */ var _staveconnector__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! ./staveconnector */ "./src/staveconnector.ts"); +/* harmony import */ var _stavehairpin__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! ./stavehairpin */ "./src/stavehairpin.ts"); +/* harmony import */ var _staveline__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! ./staveline */ "./src/staveline.ts"); +/* harmony import */ var _stavemodifier__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! ./stavemodifier */ "./src/stavemodifier.ts"); +/* harmony import */ var _stavenote__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! ./stavenote */ "./src/stavenote.ts"); +/* harmony import */ var _staverepetition__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! ./staverepetition */ "./src/staverepetition.ts"); +/* harmony import */ var _stavesection__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! ./stavesection */ "./src/stavesection.ts"); +/* harmony import */ var _stavetempo__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! ./stavetempo */ "./src/stavetempo.ts"); +/* harmony import */ var _stavetext__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! ./stavetext */ "./src/stavetext.ts"); +/* harmony import */ var _stavetie__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! ./stavetie */ "./src/stavetie.ts"); +/* harmony import */ var _stavevolta__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(/*! ./stavevolta */ "./src/stavevolta.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _stemmablenote__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(/*! ./stemmablenote */ "./src/stemmablenote.ts"); +/* harmony import */ var _stringnumber__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(/*! ./stringnumber */ "./src/stringnumber.ts"); +/* harmony import */ var _strokes__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(/*! ./strokes */ "./src/strokes.ts"); +/* harmony import */ var _svgcontext__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(/*! ./svgcontext */ "./src/svgcontext.ts"); +/* harmony import */ var _system__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(/*! ./system */ "./src/system.ts"); +/* harmony import */ var _tabnote__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(/*! ./tabnote */ "./src/tabnote.ts"); +/* harmony import */ var _tabslide__WEBPACK_IMPORTED_MODULE_68__ = __webpack_require__(/*! ./tabslide */ "./src/tabslide.ts"); +/* harmony import */ var _tabstave__WEBPACK_IMPORTED_MODULE_69__ = __webpack_require__(/*! ./tabstave */ "./src/tabstave.ts"); +/* harmony import */ var _tabtie__WEBPACK_IMPORTED_MODULE_70__ = __webpack_require__(/*! ./tabtie */ "./src/tabtie.ts"); +/* harmony import */ var _textbracket__WEBPACK_IMPORTED_MODULE_71__ = __webpack_require__(/*! ./textbracket */ "./src/textbracket.ts"); +/* harmony import */ var _textdynamics__WEBPACK_IMPORTED_MODULE_72__ = __webpack_require__(/*! ./textdynamics */ "./src/textdynamics.ts"); +/* harmony import */ var _textformatter__WEBPACK_IMPORTED_MODULE_73__ = __webpack_require__(/*! ./textformatter */ "./src/textformatter.ts"); +/* harmony import */ var _textnote__WEBPACK_IMPORTED_MODULE_74__ = __webpack_require__(/*! ./textnote */ "./src/textnote.ts"); +/* harmony import */ var _tickable__WEBPACK_IMPORTED_MODULE_75__ = __webpack_require__(/*! ./tickable */ "./src/tickable.ts"); +/* harmony import */ var _tickcontext__WEBPACK_IMPORTED_MODULE_76__ = __webpack_require__(/*! ./tickcontext */ "./src/tickcontext.ts"); +/* harmony import */ var _timesigglyph__WEBPACK_IMPORTED_MODULE_77__ = __webpack_require__(/*! ./timesigglyph */ "./src/timesigglyph.ts"); +/* harmony import */ var _timesignature__WEBPACK_IMPORTED_MODULE_78__ = __webpack_require__(/*! ./timesignature */ "./src/timesignature.ts"); +/* harmony import */ var _timesignote__WEBPACK_IMPORTED_MODULE_79__ = __webpack_require__(/*! ./timesignote */ "./src/timesignote.ts"); +/* harmony import */ var _tremolo__WEBPACK_IMPORTED_MODULE_80__ = __webpack_require__(/*! ./tremolo */ "./src/tremolo.ts"); +/* harmony import */ var _tuning__WEBPACK_IMPORTED_MODULE_81__ = __webpack_require__(/*! ./tuning */ "./src/tuning.ts"); +/* harmony import */ var _tuplet__WEBPACK_IMPORTED_MODULE_82__ = __webpack_require__(/*! ./tuplet */ "./src/tuplet.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_83__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_84__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +/* harmony import */ var _vibrato__WEBPACK_IMPORTED_MODULE_85__ = __webpack_require__(/*! ./vibrato */ "./src/vibrato.ts"); +/* harmony import */ var _vibratobracket__WEBPACK_IMPORTED_MODULE_86__ = __webpack_require__(/*! ./vibratobracket */ "./src/vibratobracket.ts"); +/* harmony import */ var _voice__WEBPACK_IMPORTED_MODULE_87__ = __webpack_require__(/*! ./voice */ "./src/voice.ts"); +/* harmony import */ var _web__WEBPACK_IMPORTED_MODULE_88__ = __webpack_require__(/*! ./web */ "./src/web.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + + + + + + + + + + + + + + + + + +// Do not export './fonts/*' because they are used by the entry/* files. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// Do not export './tables' because it is internal. Its public API is accessible via Vex.Flow.*. + + + + + + + + + + + + + + + + + + +// Do not export './version'. It is accessible via Vex.Flow.VERSION & Vex.Flow.BUILD. + + + + +// Export Vex as a named export AND as a default export, to support both ways of importing. + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_vex__WEBPACK_IMPORTED_MODULE_0__.Vex); + + +/***/ }), + +/***/ "./src/keymanager.ts": +/*!***************************!*\ + !*** ./src/keymanager.ts ***! + \***************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "KeyManager": () => (/* binding */ KeyManager) +/* harmony export */ }); +/* harmony import */ var _music__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./music */ "./src/music.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// ## Description +// +// This class implements diatonic key management. + + +class KeyManager { + constructor(key) { + this.music = new _music__WEBPACK_IMPORTED_MODULE_0__.Music(); + this.setKey(key); + } + setKey(key) { + this.key = key; + this.reset(); + return this; + } + getKey() { + return this.key; + } + reset() { + this.keyParts = this.music.getKeyParts(this.key); + this.keyString = this.keyParts.root; + if (this.keyParts.accidental) + this.keyString += this.keyParts.accidental; + const is_supported_type = _music__WEBPACK_IMPORTED_MODULE_0__.Music.scaleTypes[this.keyParts.type]; + if (!is_supported_type) { + throw new _util__WEBPACK_IMPORTED_MODULE_1__.RuntimeError('BadArguments', `Unsupported key type: ${this.key}`); + } + this.scale = this.music.getScaleTones(this.music.getNoteValue(this.keyString), _music__WEBPACK_IMPORTED_MODULE_0__.Music.scaleTypes[this.keyParts.type]); + this.scaleMap = {}; + this.scaleMapByValue = {}; + this.originalScaleMapByValue = {}; + const noteLocation = _music__WEBPACK_IMPORTED_MODULE_0__.Music.root_indices[this.keyParts.root]; + for (let i = 0; i < _music__WEBPACK_IMPORTED_MODULE_0__.Music.roots.length; ++i) { + const index = (noteLocation + i) % _music__WEBPACK_IMPORTED_MODULE_0__.Music.roots.length; + const rootName = _music__WEBPACK_IMPORTED_MODULE_0__.Music.roots[index]; + const noteName = this.music.getRelativeNoteName(rootName, this.scale[i]); + this.scaleMap[rootName] = noteName; + this.scaleMapByValue[this.scale[i]] = noteName; + this.originalScaleMapByValue[this.scale[i]] = noteName; + } + return this; + } + getAccidental(key) { + const root = this.music.getKeyParts(key).root; + const parts = this.music.getNoteParts(this.scaleMap[root]); + return { + note: this.scaleMap[root], + accidental: parts.accidental, + }; + } + selectNote(note) { + note = note.toLowerCase(); + const parts = this.music.getNoteParts(note); + // First look for matching note in our altered scale + const scaleNote = this.scaleMap[parts.root]; + const modparts = this.music.getNoteParts(scaleNote); + if (scaleNote === note) { + return { + note: scaleNote, + accidental: parts.accidental, + change: false, + }; + } + // Then search for a note of equivalent value in our altered scale + const valueNote = this.scaleMapByValue[this.music.getNoteValue(note)]; + if (valueNote != null) { + return { + note: valueNote, + accidental: this.music.getNoteParts(valueNote).accidental, + change: false, + }; + } + // Then search for a note of equivalent value in the original scale + const originalValueNote = this.originalScaleMapByValue[this.music.getNoteValue(note)]; + if (originalValueNote != null) { + this.scaleMap[modparts.root] = originalValueNote; + delete this.scaleMapByValue[this.music.getNoteValue(scaleNote)]; + this.scaleMapByValue[this.music.getNoteValue(note)] = originalValueNote; + return { + note: originalValueNote, + accidental: this.music.getNoteParts(originalValueNote).accidental, + change: true, + }; + } + // Then try to unmodify a currently modified note. + if (modparts.root === note) { + delete this.scaleMapByValue[this.music.getNoteValue(this.scaleMap[parts.root])]; + this.scaleMapByValue[this.music.getNoteValue(modparts.root)] = modparts.root; + this.scaleMap[modparts.root] = modparts.root; + return { + note: modparts.root, + accidental: undefined, + change: true, + }; + } + // Last resort -- shitshoot + delete this.scaleMapByValue[this.music.getNoteValue(this.scaleMap[parts.root])]; + this.scaleMapByValue[this.music.getNoteValue(note)] = note; + delete this.scaleMap[modparts.root]; + this.scaleMap[modparts.root] = note; + return { + note, + accidental: parts.accidental, + change: true, + }; + } +} + + +/***/ }), + +/***/ "./src/keysignature.ts": +/*!*****************************!*\ + !*** ./src/keysignature.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "KeySignature": () => (/* binding */ KeySignature) +/* harmony export */ }); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _stavemodifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stavemodifier */ "./src/stavemodifier.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author: Cyril Silverman +// +// ## Description +// +// This file implements key signatures. A key signature sits on a stave +// and indicates the notes with implicit accidentals. + + + + + +class KeySignature extends _stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifier { + // Create a new Key Signature based on a `key_spec` + constructor(keySpec, cancelKeySpec, alterKeySpec) { + super(); + this.accList = []; + this.setKeySig(keySpec, cancelKeySpec, alterKeySpec); + this.setPosition(_stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifierPosition.BEGIN); + this.glyphFontScale = 38; // TODO(0xFE): Should this match StaveNote? + this.glyphs = []; + this.xPositions = []; // relative to this.x + this.paddingForced = false; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.KeySignature; + } + // Add an accidental glyph to the `KeySignature` instance which represents + // the provided `acc`. If `nextAcc` is also provided, the appropriate + // spacing will be included in the glyph's position + convertToGlyph(acc, nextAcc) { + const accGlyphData = _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.accidentalCodes(acc.type); + const glyph = new _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph(accGlyphData.code, this.glyphFontScale); + // Determine spacing between current accidental and the next accidental + let extraWidth = 1; + if (acc.type === 'n' && nextAcc) { + const spacing = KeySignature.accidentalSpacing[nextAcc.type]; + if (spacing) { + const isAbove = nextAcc.line >= acc.line; + extraWidth = isAbove ? spacing.above : spacing.below; + } + } + // Place the glyph on the stave + this.placeGlyphOnLine(glyph, this.checkStave(), acc.line); + this.glyphs.push(glyph); + const xPosition = this.xPositions[this.xPositions.length - 1]; + const glyphWidth = glyph.getMetrics().width + extraWidth; + // Store the next accidental's x position + this.xPositions.push(xPosition + glyphWidth); + // Expand size of key signature + this.width += glyphWidth; + } + // Cancel out a key signature provided in the `spec` parameter. This will + // place appropriate natural accidentals before the key signature. + cancelKey(spec) { + this.formatted = false; + this.cancelKeySpec = spec; + return this; + } + convertToCancelAccList(spec) { + // Get the accidental list for the cancelled key signature + const cancel_accList = _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.keySignature(spec); + // If the cancelled key has a different accidental type, ie: # vs b + const different_types = this.accList.length > 0 && cancel_accList.length > 0 && cancel_accList[0].type !== this.accList[0].type; + // Determine how many naturals needed to add + const naturals = different_types ? cancel_accList.length : cancel_accList.length - this.accList.length; + // Return if no naturals needed + if (naturals < 1) + return undefined; + // Get the line position for each natural + const cancelled = []; + for (let i = 0; i < naturals; i++) { + let index = i; + if (!different_types) { + index = cancel_accList.length - naturals + i; + } + const acc = cancel_accList[index]; + cancelled.push({ type: 'n', line: acc.line }); + } + // Combine naturals with main accidental list for the key signature + this.accList = cancelled.concat(this.accList); + return { + accList: cancelled, + type: cancel_accList[0].type, + }; + } + // Deprecated + addToStave(stave) { + this.paddingForced = true; + stave.addModifier(this); + return this; + } + // Apply the accidental staff line placement based on the `clef` and + // the accidental `type` for the key signature ('# or 'b'). + convertAccLines(clef, type, accList = this.accList) { + let offset = 0.0; // if clef === "treble" + let customLines; // when clef doesn't follow treble key sig shape + switch (clef) { + // Treble & Subbass both have offsets of 0, so are not included. + case 'soprano': + if (type === '#') + customLines = [2.5, 0.5, 2, 0, 1.5, -0.5, 1]; + else + offset = -1; + break; + case 'mezzo-soprano': + if (type === 'b') + customLines = [0, 2, 0.5, 2.5, 1, 3, 1.5]; + else + offset = 1.5; + break; + case 'alto': + offset = 0.5; + break; + case 'tenor': + if (type === '#') + customLines = [3, 1, 2.5, 0.5, 2, 0, 1.5]; + else + offset = -0.5; + break; + case 'baritone-f': + case 'baritone-c': + if (type === 'b') + customLines = [0.5, 2.5, 1, 3, 1.5, 3.5, 2]; + else + offset = 2; + break; + case 'bass': + case 'french': + offset = 1; + break; + default: + break; + } + // If there's a special case, assign those lines/spaces: + let i; + if (typeof customLines !== 'undefined') { + for (i = 0; i < accList.length; ++i) { + accList[i].line = customLines[i]; + } + } + else if (offset !== 0) { + for (i = 0; i < accList.length; ++i) { + accList[i].line += offset; + } + } + } + getPadding(index) { + if (!this.formatted) + this.format(); + return this.glyphs.length === 0 || (!this.paddingForced && index < 2) ? 0 : this.padding; + } + getWidth() { + if (!this.formatted) + this.format(); + return this.width; + } + setKeySig(keySpec, cancelKeySpec, alterKeySpec) { + this.formatted = false; + this.keySpec = keySpec; + this.cancelKeySpec = cancelKeySpec; + this.alterKeySpec = alterKeySpec; + return this; + } + // Alter the accidentals of a key spec one by one. + // Each alteration is a new accidental that replaces the + // original accidental (or the canceled one). + alterKey(alterKeySpec) { + this.formatted = false; + this.alterKeySpec = alterKeySpec; + return this; + } + convertToAlterAccList(alterKeySpec) { + const max = Math.min(alterKeySpec.length, this.accList.length); + for (let i = 0; i < max; ++i) { + if (alterKeySpec[i]) { + this.accList[i].type = alterKeySpec[i]; + } + } + } + format() { + const stave = this.checkStave(); + this.width = 0; + this.glyphs = []; + this.xPositions = [0]; // initialize with initial x position + this.accList = _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.keySignature((0,_util__WEBPACK_IMPORTED_MODULE_4__.defined)(this.keySpec)); + const accList = this.accList; + const firstAccidentalType = accList.length > 0 ? accList[0].type : undefined; + let cancelAccList; + if (this.cancelKeySpec) { + cancelAccList = this.convertToCancelAccList(this.cancelKeySpec); + } + if (this.alterKeySpec) { + this.convertToAlterAccList(this.alterKeySpec); + } + if (this.accList.length > 0) { + const clef = (this.position === _stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifierPosition.END ? stave.getEndClef() : stave.getClef()) || stave.getClef(); + if (cancelAccList) { + this.convertAccLines(clef, cancelAccList.type, cancelAccList.accList); + } + this.convertAccLines(clef, firstAccidentalType, accList); + for (let i = 0; i < this.accList.length; ++i) { + this.convertToGlyph(this.accList[i], this.accList[i + 1]); + } + } + this.formatted = true; + } + draw() { + const stave = this.checkStave(); + const ctx = stave.checkContext(); + if (!this.formatted) + this.format(); + this.setRendered(); + ctx.openGroup('keysignature', this.getAttribute('id')); + for (let i = 0; i < this.glyphs.length; i++) { + const glyph = this.glyphs[i]; + const x = this.x + this.xPositions[i]; + glyph.setStave(stave); + glyph.setContext(ctx); + glyph.renderToStave(x); + } + ctx.closeGroup(); + } +} +// Space between natural and following accidental depending +// on vertical position +KeySignature.accidentalSpacing = { + '#': { + above: 6, + below: 4, + }, + b: { + above: 4, + below: 7, + }, + n: { + above: 4, + below: 1, + }, + '##': { + above: 6, + below: 4, + }, + bb: { + above: 4, + below: 7, + }, + db: { + above: 4, + below: 7, + }, + d: { + above: 4, + below: 7, + }, + bbs: { + above: 4, + below: 7, + }, + '++': { + above: 6, + below: 4, + }, + '+': { + above: 6, + below: 4, + }, + '+-': { + above: 6, + below: 4, + }, + '++-': { + above: 6, + below: 4, + }, + bs: { + above: 4, + below: 10, + }, + bss: { + above: 4, + below: 10, + }, +}; + + +/***/ }), + +/***/ "./src/keysignote.ts": +/*!***************************!*\ + !*** ./src/keysignote.ts ***! + \***************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "KeySigNote": () => (/* binding */ KeySigNote) +/* harmony export */ }); +/* harmony import */ var _keysignature__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./keysignature */ "./src/keysignature.ts"); +/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./note */ "./src/note.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author Mark Meeus 2019 + + + +class KeySigNote extends _note__WEBPACK_IMPORTED_MODULE_1__.Note { + constructor(keySpec, cancelKeySpec, alterKeySpec) { + super({ duration: 'b' }); + this.keySignature = new _keysignature__WEBPACK_IMPORTED_MODULE_0__.KeySignature(keySpec, cancelKeySpec, alterKeySpec); + // Note properties + this.ignore_ticks = true; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_2__.Category.KeySigNote; + } + /* Overridden to ignore */ + // eslint-disable-next-line + addToModifierContext(mc) { + // DO NOTHING. + return this; + } + preFormat() { + this.preFormatted = true; + this.keySignature.setStave(this.checkStave()); + this.setWidth(this.keySignature.getWidth()); + return this; + } + draw() { + const ctx = this.checkStave().checkContext(); + this.setRendered(); + this.keySignature.setX(this.getAbsoluteX()); + this.keySignature.setContext(ctx); + this.keySignature.draw(); + } +} + + +/***/ }), + +/***/ "./src/modifier.ts": +/*!*************************!*\ + !*** ./src/modifier.ts ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ModifierPosition": () => (/* binding */ ModifierPosition), +/* harmony export */ "Modifier": () => (/* binding */ Modifier) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + +var ModifierPosition; +(function (ModifierPosition) { + ModifierPosition[ModifierPosition["CENTER"] = 0] = "CENTER"; + ModifierPosition[ModifierPosition["LEFT"] = 1] = "LEFT"; + ModifierPosition[ModifierPosition["RIGHT"] = 2] = "RIGHT"; + ModifierPosition[ModifierPosition["ABOVE"] = 3] = "ABOVE"; + ModifierPosition[ModifierPosition["BELOW"] = 4] = "BELOW"; +})(ModifierPosition || (ModifierPosition = {})); +// To enable logging for this class. Set `Vex.Flow.Modifier.DEBUG` to `true`. +// function L(...args) { if (Modifier.DEBUG) log('Vex.Flow.Modifier', args); } +/** + * `Modifier` is an abstract interface for notational elements that modify + * a `Note`. Examples of modifiers are `Accidental`, `Annotation`, `Stroke`, etc. + * + * For a `Modifier` instance to be positioned correctly, it must be part of + * a `ModifierContext`. All modifiers in the same context are rendered relative to + * one another. + * + * Typically, all modifiers to a note are part of the same `ModifierContext` instance. Also, + * in multi-voice staves, all modifiers to notes on the same `tick` are part of the same + * `ModifierContext`. This ensures that multiple voices don't trample all over each other. + */ +class Modifier extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + constructor() { + super(); + this.width = 0; + // The `text_line` is reserved space above or below a stave. + this.text_line = 0; + this.position = Modifier.Position.LEFT; + this.x_shift = 0; + this.y_shift = 0; + this.spacingFromNextModifier = 0; + } + /** + * Modifiers category string. Every modifier has a different category. + * The `ModifierContext` uses this to determine the type and order of the modifiers. + */ + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_1__.Category.Modifier; + } + /** Modifiers can be positioned almost anywhere, relative to a note. */ + static get Position() { + return ModifierPosition; + } + static get PositionString() { + return { + center: ModifierPosition.CENTER, + above: ModifierPosition.ABOVE, + below: ModifierPosition.BELOW, + left: ModifierPosition.LEFT, + right: ModifierPosition.RIGHT, + }; + } + /** Called when position changes. */ + reset() { + // DO NOTHING. + } + /** Get modifier widths. */ + getWidth() { + return this.width; + } + /** Set modifier widths. */ + setWidth(width) { + this.width = width; + return this; + } + /** Get attached note (`StaveNote`, `TabNote`, etc.) */ + getNote() { + return (0,_util__WEBPACK_IMPORTED_MODULE_2__.defined)(this.note, 'NoNote', 'Modifier has no note.'); + } + /** + * Used in draw() to check and get the attached note (`StaveNote`, `TabNote`, etc.). + * Also verifies that the index is valid. + */ + checkAttachedNote() { + const category = this.getCategory(); + (0,_util__WEBPACK_IMPORTED_MODULE_2__.defined)(this.index, 'NoIndex', `Can't draw ${category} without an index.`); + return (0,_util__WEBPACK_IMPORTED_MODULE_2__.defined)(this.note, 'NoNote', `Can't draw ${category} without a note.`); + } + /** + * Set attached note. + * @param note (`StaveNote`, `TabNote`, etc.) + */ + setNote(note) { + this.note = note; + return this; + } + /** Get note index, which is a specific note in a chord. */ + getIndex() { + return this.index; + } + /** Check and get note index, which is a specific note in a chord. */ + checkIndex() { + return (0,_util__WEBPACK_IMPORTED_MODULE_2__.defined)(this.index, 'NoIndex', 'Modifier has an invalid index.'); + } + /** Set note index, which is a specific note in a chord. */ + setIndex(index) { + this.index = index; + return this; + } + /** Get `ModifierContext`. */ + getModifierContext() { + return this.modifierContext; + } + /** Check and get `ModifierContext`. */ + checkModifierContext() { + return (0,_util__WEBPACK_IMPORTED_MODULE_2__.defined)(this.modifierContext, 'NoModifierContext', 'Modifier Context Required'); + } + /** Every modifier must be part of a `ModifierContext`. */ + setModifierContext(c) { + this.modifierContext = c; + return this; + } + /** Get position. */ + getPosition() { + return this.position; + } + /** + * Set position. + * @param position CENTER | LEFT | RIGHT | ABOVE | BELOW + */ + setPosition(position) { + this.position = typeof position === 'string' ? Modifier.PositionString[position] : position; + this.reset(); + return this; + } + /** Set the `text_line` for the modifier. */ + setTextLine(line) { + this.text_line = line; + return this; + } + /** Shift modifier down `y` pixels. Negative values shift up. */ + setYShift(y) { + this.y_shift = y; + return this; + } + /** Set spacing from next modifier. */ + setSpacingFromNextModifier(x) { + this.spacingFromNextModifier = x; + } + /** Get spacing from next modifier. */ + getSpacingFromNextModifier() { + return this.spacingFromNextModifier; + } + /** + * Shift modifier `x` pixels in the direction of the modifier. Negative values + * shift reverse. + */ + setXShift(x) { + this.x_shift = 0; + if (this.position === Modifier.Position.LEFT) { + this.x_shift -= x; + } + else { + this.x_shift += x; + } + return this; + } + /** Get shift modifier `x` */ + getXShift() { + return this.x_shift; + } + /** Render the modifier onto the canvas. */ + draw() { + this.checkContext(); + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('NotImplemented', 'draw() not implemented for this modifier.'); + } + // aligns sub notes of NoteSubGroup (or GraceNoteGroup) to the main note with correct x-offset + alignSubNotesWithNote(subNotes, note) { + // Shift over the tick contexts of each note + const tickContext = note.getTickContext(); + const metrics = tickContext.getMetrics(); + const stave = note.getStave(); + const subNoteXOffset = tickContext.getX() - metrics.modLeftPx - metrics.modRightPx + this.getSpacingFromNextModifier(); + subNotes.forEach((subNote) => { + const subTickContext = subNote.getTickContext(); + if (stave) + subNote.setStave(stave); + subTickContext.setXOffset(subNoteXOffset); // don't touch baseX to avoid shift each render + }); + } +} + + +/***/ }), + +/***/ "./src/modifiercontext.ts": +/*!********************************!*\ + !*** ./src/modifiercontext.ts ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ModifierContext": () => (/* binding */ ModifierContext) +/* harmony export */ }); +/* harmony import */ var _accidental__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./accidental */ "./src/accidental.ts"); +/* harmony import */ var _annotation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./annotation */ "./src/annotation.ts"); +/* harmony import */ var _articulation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./articulation */ "./src/articulation.ts"); +/* harmony import */ var _bend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./bend */ "./src/bend.ts"); +/* harmony import */ var _chordsymbol__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./chordsymbol */ "./src/chordsymbol.ts"); +/* harmony import */ var _dot__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./dot */ "./src/dot.ts"); +/* harmony import */ var _frethandfinger__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./frethandfinger */ "./src/frethandfinger.ts"); +/* harmony import */ var _gracenotegroup__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./gracenotegroup */ "./src/gracenotegroup.ts"); +/* harmony import */ var _notesubgroup__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./notesubgroup */ "./src/notesubgroup.ts"); +/* harmony import */ var _ornament__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./ornament */ "./src/ornament.ts"); +/* harmony import */ var _parenthesis__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./parenthesis */ "./src/parenthesis.ts"); +/* harmony import */ var _stavenote__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./stavenote */ "./src/stavenote.ts"); +/* harmony import */ var _stringnumber__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./stringnumber */ "./src/stringnumber.ts"); +/* harmony import */ var _strokes__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./strokes */ "./src/strokes.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +/* harmony import */ var _vibrato__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./vibrato */ "./src/vibrato.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// ## Description +// +// This class implements various types of members to notes (e.g. bends, +// fingering positions etc.) + + + + + + + + + + + + + + + + + +// To enable logging for this class. Set `Vex.Flow.ModifierContext.DEBUG` to `true`. +// eslint-disable-next-line +function L(...args) { + if (ModifierContext.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_15__.log)('Vex.Flow.ModifierContext', args); +} +class ModifierContext { + constructor() { + // Formatting data. + this.state = { + left_shift: 0, + right_shift: 0, + text_line: 0, + top_text_line: 0, + }; + // Current members + this.members = {}; + this.preFormatted = false; + this.postFormatted = false; + this.formatted = false; + this.width = 0; + this.spacing = 0; + } + addModifier(member) { + L('addModifier is deprecated, use addMember instead.'); + return this.addMember(member); + } + /** + * this.members maps CATEGORY strings to arrays of Tickable | Modifier | StaveNote | TabNote. + * Here we add a new member to this.members, and create a new array if needed. + * @param member + * @returns this + */ + addMember(member) { + const category = member.getCategory(); + if (!this.members[category]) { + this.members[category] = []; + } + this.members[category].push(member); + member.setModifierContext(this); + this.preFormatted = false; + return this; + } + /** + * @deprecated + */ + getModifiers(category) { + L('getModifiers is deprecated, use getMembers instead.'); + return this.getMembers(category); + } + getMembers(category) { + var _a; + return (_a = this.members[category]) !== null && _a !== void 0 ? _a : []; + } + getWidth() { + return this.width; + } + getLeftShift() { + return this.state.left_shift; + } + getRightShift() { + return this.state.right_shift; + } + getState() { + return this.state; + } + getMetrics() { + if (!this.formatted) { + throw new _util__WEBPACK_IMPORTED_MODULE_15__.RuntimeError('UnformattedMember', 'Unformatted member has no metrics.'); + } + return { + width: this.state.left_shift + this.state.right_shift + this.spacing, + spacing: this.spacing, + }; + } + preFormat() { + if (this.preFormatted) + return; + L('Preformatting ModifierContext'); + const state = this.state; + const members = this.members; + // The ordering below determines when different members are formatted and rendered. + _stavenote__WEBPACK_IMPORTED_MODULE_11__.StaveNote.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.StaveNote], state); + _parenthesis__WEBPACK_IMPORTED_MODULE_10__.Parenthesis.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.Parenthesis], state); + _dot__WEBPACK_IMPORTED_MODULE_5__.Dot.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.Dot], state); + _frethandfinger__WEBPACK_IMPORTED_MODULE_6__.FretHandFinger.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.FretHandFinger], state); + _accidental__WEBPACK_IMPORTED_MODULE_0__.Accidental.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.Accidental], state); + _strokes__WEBPACK_IMPORTED_MODULE_13__.Stroke.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.Stroke], state); + _gracenotegroup__WEBPACK_IMPORTED_MODULE_7__.GraceNoteGroup.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.GraceNoteGroup], state); + _notesubgroup__WEBPACK_IMPORTED_MODULE_8__.NoteSubGroup.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.NoteSubGroup], state); + _stringnumber__WEBPACK_IMPORTED_MODULE_12__.StringNumber.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.StringNumber], state); + _articulation__WEBPACK_IMPORTED_MODULE_2__.Articulation.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.Articulation], state); + _ornament__WEBPACK_IMPORTED_MODULE_9__.Ornament.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.Ornament], state); + _annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.Annotation], state); + _chordsymbol__WEBPACK_IMPORTED_MODULE_4__.ChordSymbol.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.ChordSymbol], state); + _bend__WEBPACK_IMPORTED_MODULE_3__.Bend.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.Bend], state); + _vibrato__WEBPACK_IMPORTED_MODULE_16__.Vibrato.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.Vibrato], state, this); + // Update width of this member context + this.width = state.left_shift + state.right_shift; + this.preFormatted = true; + } + postFormat() { + if (this.postFormatted) + return; + L('Postformatting ModifierContext'); + // If post-formatting is required for an element, add more lines below. + _stavenote__WEBPACK_IMPORTED_MODULE_11__.StaveNote.postFormat(this.getMembers(_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.StaveNote)); + } +} +ModifierContext.DEBUG = false; + + +/***/ }), + +/***/ "./src/multimeasurerest.ts": +/*!*********************************!*\ + !*** ./src/multimeasurerest.ts ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "MultiMeasureRest": () => (/* binding */ MultiMeasureRest) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _notehead__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./notehead */ "./src/notehead.ts"); +/* harmony import */ var _stavemodifier__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./stavemodifier */ "./src/stavemodifier.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _timesignature__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./timesignature */ "./src/timesignature.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// VexFlow - Music Engraving for HTML5 +// Copyright Mohit Muthanna 2010 +// +// This class implements multiple measure rests. + + + + + + + + +let semibreve_rest; +function get_semibreve_rest() { + if (!semibreve_rest) { + const noteHead = new _notehead__WEBPACK_IMPORTED_MODULE_2__.NoteHead({ duration: 'w', note_type: 'r' }); + semibreve_rest = { + glyph_font_scale: noteHead.render_options.glyph_font_scale, + glyph_code: noteHead.glyph_code, + width: noteHead.getWidth(), + }; + } + return semibreve_rest; +} +class MultiMeasureRest extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + /** + * + * @param number_of_measures Number of measures. + * @param options The options object. + */ + constructor(number_of_measures, options) { + super(); + this.xs = { left: NaN, right: NaN }; + this.hasPaddingLeft = false; + this.hasPaddingRight = false; + this.hasLineThickness = false; + this.hasSymbolSpacing = false; + this.number_of_measures = number_of_measures; + // Keep track of whether these four options were provided. + this.hasPaddingLeft = typeof options.padding_left === 'number'; + this.hasPaddingRight = typeof options.padding_right === 'number'; + this.hasLineThickness = typeof options.line_thickness === 'number'; + this.hasSymbolSpacing = typeof options.symbol_spacing === 'number'; + const musicFont = _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.currentMusicFont(); + this.render_options = Object.assign({ use_symbols: false, show_number: true, number_line: -0.5, number_glyph_point: musicFont.lookupMetric('digits.point'), line: 2, spacing_between_lines_px: _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.STAVE_LINE_DISTANCE, serif_thickness: 2, semibreve_rest_glyph_scale: _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.NOTATION_FONT_SCALE, padding_left: 0, padding_right: 0, line_thickness: 5, symbol_spacing: 0 }, options); + const fontLineShift = musicFont.lookupMetric('digits.shiftLine', 0); + this.render_options.number_line += fontLineShift; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_6__.Category.MultiMeasureRest; + } + getXs() { + return this.xs; + } + setStave(stave) { + this.stave = stave; + return this; + } + getStave() { + return this.stave; + } + checkStave() { + return (0,_util__WEBPACK_IMPORTED_MODULE_7__.defined)(this.stave, 'NoStave', 'No stave attached to instance.'); + } + drawLine(stave, ctx, left, right, spacingBetweenLines) { + const options = this.render_options; + const y = stave.getYForLine(options.line); + const padding = (right - left) * 0.1; + left += padding; + right -= padding; + let lineThicknessHalf; + if (this.hasLineThickness) { + lineThicknessHalf = options.line_thickness * 0.5; + } + else { + lineThicknessHalf = spacingBetweenLines * 0.25; + } + const serifThickness = options.serif_thickness; + const top = y - spacingBetweenLines; + const bot = y + spacingBetweenLines; + const leftIndented = left + serifThickness; + const rightIndented = right - serifThickness; + const lineTop = y - lineThicknessHalf; + const lineBottom = y + lineThicknessHalf; + ctx.save(); + ctx.beginPath(); + ctx.moveTo(left, top); + ctx.lineTo(leftIndented, top); + ctx.lineTo(leftIndented, lineTop); + ctx.lineTo(rightIndented, lineTop); + ctx.lineTo(rightIndented, top); + ctx.lineTo(right, top); + ctx.lineTo(right, bot); + ctx.lineTo(rightIndented, bot); + ctx.lineTo(rightIndented, lineBottom); + ctx.lineTo(leftIndented, lineBottom); + ctx.lineTo(leftIndented, bot); + ctx.lineTo(left, bot); + ctx.closePath(); + ctx.fill(); + } + drawSymbols(stave, ctx, left, right, spacingBetweenLines) { + const n4 = Math.floor(this.number_of_measures / 4); + const n = this.number_of_measures % 4; + const n2 = Math.floor(n / 2); + const n1 = n % 2; + const options = this.render_options; + // FIXME: TODO: invalidate semibreve_rest at the appropriate time + // (e.g., if the system font settings are changed). + semibreve_rest = undefined; + const rest = get_semibreve_rest(); + const rest_scale = options.semibreve_rest_glyph_scale; + const rest_width = rest.width * (rest_scale / rest.glyph_font_scale); + const glyphs = { + 2: { + width: rest_width * 0.5, + height: spacingBetweenLines, + }, + 1: { + width: rest_width, + }, + }; + /* 10: normal spacingBetweenLines */ + const spacing = this.hasSymbolSpacing ? options.symbol_spacing : 10; + const width = n4 * glyphs[2].width + n2 * glyphs[2].width + n1 * glyphs[1].width + (n4 + n2 + n1 - 1) * spacing; + let x = left + (right - left) * 0.5 - width * 0.5; + const line = options.line; + const yTop = stave.getYForLine(line - 1); + const yMiddle = stave.getYForLine(line); + const yBottom = stave.getYForLine(line + 1); + ctx.save(); + ctx.setStrokeStyle('none'); + ctx.setLineWidth(0); + for (let i = 0; i < n4; ++i) { + ctx.fillRect(x, yMiddle - glyphs[2].height, glyphs[2].width, glyphs[2].height); + ctx.fillRect(x, yBottom - glyphs[2].height, glyphs[2].width, glyphs[2].height); + x += glyphs[2].width + spacing; + } + for (let i = 0; i < n2; ++i) { + ctx.fillRect(x, yMiddle - glyphs[2].height, glyphs[2].width, glyphs[2].height); + x += glyphs[2].width + spacing; + } + for (let i = 0; i < n1; ++i) { + _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.renderGlyph(ctx, x, yTop, rest_scale, rest.glyph_code); + x += glyphs[1].width + spacing; + } + ctx.restore(); + } + draw() { + const ctx = this.checkContext(); + this.setRendered(); + const stave = this.checkStave(); + let left = stave.getNoteStartX(); + let right = stave.getNoteEndX(); + // FIXME: getNoteStartX() returns x + 5(barline width) + // getNoteEndX() returns x + width(no barline width) + // See Stave constructor. How do we fix this? + // Here, we subtract the barline width. + const begModifiers = stave.getModifiers(_stavemodifier__WEBPACK_IMPORTED_MODULE_3__.StaveModifierPosition.BEGIN); + if (begModifiers.length === 1 && (0,_typeguard__WEBPACK_IMPORTED_MODULE_6__.isBarline)(begModifiers[0])) { + left -= begModifiers[0].getWidth(); + } + const options = this.render_options; + if (this.hasPaddingLeft) { + left = stave.getX() + options.padding_left; + } + if (this.hasPaddingRight) { + right = stave.getX() + stave.getWidth() - options.padding_right; + } + this.xs.left = left; + this.xs.right = right; + const spacingBetweenLines = options.spacing_between_lines_px; + if (options.use_symbols) { + this.drawSymbols(stave, ctx, left, right, spacingBetweenLines); + } + else { + this.drawLine(stave, ctx, left, right, spacingBetweenLines); + } + if (options.show_number) { + const timeSpec = '/' + this.number_of_measures; + const timeSig = new _timesignature__WEBPACK_IMPORTED_MODULE_5__.TimeSignature(timeSpec, 0, false); + timeSig.point = options.number_glyph_point; + timeSig.setTimeSig(timeSpec); + timeSig.setStave(stave); + timeSig.setX(left + (right - left) * 0.5 - timeSig.getInfo().glyph.getMetrics().width * 0.5); + timeSig.bottomLine = options.number_line; + timeSig.setContext(ctx).draw(); + } + } +} + + +/***/ }), + +/***/ "./src/music.ts": +/*!**********************!*\ + !*** ./src/music.ts ***! + \**********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Music": () => (/* binding */ Music) +/* harmony export */ }); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + +/** Music implements some standard music theory routines. */ +class Music { + /** Number of an canonical notes (12). */ + static get NUM_TONES() { + return this.canonical_notes.length; + } + /** Names of root notes ('c', 'd',...) */ + static get roots() { + return ['c', 'd', 'e', 'f', 'g', 'a', 'b']; + } + /** Values of the root notes.*/ + static get root_values() { + return [0, 2, 4, 5, 7, 9, 11]; + } + /** Indices of the root notes.*/ + static get root_indices() { + return { + c: 0, + d: 1, + e: 2, + f: 3, + g: 4, + a: 5, + b: 6, + }; + } + /** Names of canonical notes ('c', 'c#', 'd',...). */ + static get canonical_notes() { + return ['c', 'c#', 'd', 'd#', 'e', 'f', 'f#', 'g', 'g#', 'a', 'a#', 'b']; + } + /** Names of diatonic intervals ('unison', 'm2', 'M2',...). */ + static get diatonic_intervals() { + return ['unison', 'm2', 'M2', 'm3', 'M3', 'p4', 'dim5', 'p5', 'm6', 'M6', 'b7', 'M7', 'octave']; + } + /** NoteAccidental associated to diatonic intervals. */ + static get diatonic_accidentals() { + return { + unison: { note: 0, accidental: 0 }, + m2: { note: 1, accidental: -1 }, + M2: { note: 1, accidental: 0 }, + m3: { note: 2, accidental: -1 }, + M3: { note: 2, accidental: 0 }, + p4: { note: 3, accidental: 0 }, + dim5: { note: 4, accidental: -1 }, + p5: { note: 4, accidental: 0 }, + m6: { note: 5, accidental: -1 }, + M6: { note: 5, accidental: 0 }, + b7: { note: 6, accidental: -1 }, + M7: { note: 6, accidental: 0 }, + octave: { note: 7, accidental: 0 }, + }; + } + /** Semitones shift associated to intervals .*/ + static get intervals() { + return { + u: 0, + unison: 0, + m2: 1, + b2: 1, + min2: 1, + S: 1, + H: 1, + 2: 2, + M2: 2, + maj2: 2, + T: 2, + W: 2, + m3: 3, + b3: 3, + min3: 3, + M3: 4, + 3: 4, + maj3: 4, + 4: 5, + p4: 5, + '#4': 6, + b5: 6, + aug4: 6, + dim5: 6, + 5: 7, + p5: 7, + '#5': 8, + b6: 8, + aug5: 8, + 6: 9, + M6: 9, + maj6: 9, + b7: 10, + m7: 10, + min7: 10, + dom7: 10, + M7: 11, + maj7: 11, + 8: 12, + octave: 12, + }; + } + /** Semitones shifts associated with scales. */ + static get scales() { + return { + major: [2, 2, 1, 2, 2, 2, 1], + minor: [2, 1, 2, 2, 1, 2, 2], + ionian: [2, 2, 1, 2, 2, 2, 1], + dorian: [2, 1, 2, 2, 2, 1, 2], + phyrgian: [1, 2, 2, 2, 1, 2, 2], + lydian: [2, 2, 2, 1, 2, 2, 1], + mixolydian: [2, 2, 1, 2, 2, 1, 2], + aeolian: [2, 1, 2, 2, 1, 2, 2], + locrian: [1, 2, 2, 1, 2, 2, 2], + }; + } + /** Scales associated with m (minor) and M (major). */ + static get scaleTypes() { + return { + M: Music.scales.major, + m: Music.scales.minor, + }; + } + /** Accidentals abbreviations. */ + static get accidentals() { + return ['bb', 'b', 'n', '#', '##']; + } + /** Note values. */ + static get noteValues() { + return { + c: { root_index: 0, int_val: 0 }, + cn: { root_index: 0, int_val: 0 }, + 'c#': { root_index: 0, int_val: 1 }, + 'c##': { root_index: 0, int_val: 2 }, + cb: { root_index: 0, int_val: 11 }, + cbb: { root_index: 0, int_val: 10 }, + d: { root_index: 1, int_val: 2 }, + dn: { root_index: 1, int_val: 2 }, + 'd#': { root_index: 1, int_val: 3 }, + 'd##': { root_index: 1, int_val: 4 }, + db: { root_index: 1, int_val: 1 }, + dbb: { root_index: 1, int_val: 0 }, + e: { root_index: 2, int_val: 4 }, + en: { root_index: 2, int_val: 4 }, + 'e#': { root_index: 2, int_val: 5 }, + 'e##': { root_index: 2, int_val: 6 }, + eb: { root_index: 2, int_val: 3 }, + ebb: { root_index: 2, int_val: 2 }, + f: { root_index: 3, int_val: 5 }, + fn: { root_index: 3, int_val: 5 }, + 'f#': { root_index: 3, int_val: 6 }, + 'f##': { root_index: 3, int_val: 7 }, + fb: { root_index: 3, int_val: 4 }, + fbb: { root_index: 3, int_val: 3 }, + g: { root_index: 4, int_val: 7 }, + gn: { root_index: 4, int_val: 7 }, + 'g#': { root_index: 4, int_val: 8 }, + 'g##': { root_index: 4, int_val: 9 }, + gb: { root_index: 4, int_val: 6 }, + gbb: { root_index: 4, int_val: 5 }, + a: { root_index: 5, int_val: 9 }, + an: { root_index: 5, int_val: 9 }, + 'a#': { root_index: 5, int_val: 10 }, + 'a##': { root_index: 5, int_val: 11 }, + ab: { root_index: 5, int_val: 8 }, + abb: { root_index: 5, int_val: 7 }, + b: { root_index: 6, int_val: 11 }, + bn: { root_index: 6, int_val: 11 }, + 'b#': { root_index: 6, int_val: 0 }, + 'b##': { root_index: 6, int_val: 1 }, + bb: { root_index: 6, int_val: 10 }, + bbb: { root_index: 6, int_val: 9 }, + }; + } + isValidNoteValue(note) { + return note >= 0 && note < Music.canonical_notes.length; + } + isValidIntervalValue(interval) { + return interval >= 0 && interval < Music.diatonic_intervals.length; + } + /** Return root and accidental associated to a note. */ + getNoteParts(noteString) { + if (!noteString || noteString.length < 1) { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', 'Invalid note name: ' + noteString); + } + if (noteString.length > 3) { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', 'Invalid note name: ' + noteString); + } + const note = noteString.toLowerCase(); + const regex = /^([cdefgab])(b|bb|n|#|##)?$/; + const match = regex.exec(note); + if (match !== null) { + const root = match[1]; + const accidental = match[2]; + return { + root, + accidental, + }; + } + else { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', 'Invalid note name: ' + noteString); + } + } + /** Return root, accidental and type associated to a key. */ + getKeyParts(keyString) { + if (!keyString || keyString.length < 1) { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', 'Invalid key: ' + keyString); + } + const key = keyString.toLowerCase(); + // Support Major, Minor, Melodic Minor, and Harmonic Minor key types. + const regex = /^([cdefgab])(b|#)?(mel|harm|m|M)?$/; + const match = regex.exec(key); + if (match !== null) { + const root = match[1]; + const accidental = match[2]; + let type = match[3]; + // Unspecified type implies major + if (!type) + type = 'M'; + return { + root, + accidental, + type, + }; + } + else { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', `Invalid key: ${keyString}`); + } + } + /** Note value associated to a note name. */ + getNoteValue(noteString) { + const value = Music.noteValues[noteString]; + if (value === undefined) { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', `Invalid note name: ${noteString}`); + } + return value.int_val; + } + /** Interval value associated to an interval name. */ + getIntervalValue(intervalString) { + const value = Music.intervals[intervalString]; + if (value === undefined) { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', `Invalid interval name: ${intervalString}`); + } + return value; + } + /** Canonical note name associated to a value. */ + getCanonicalNoteName(noteValue) { + if (!this.isValidNoteValue(noteValue)) { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', `Invalid note value: ${noteValue}`); + } + return Music.canonical_notes[noteValue]; + } + /** Interval name associated to a value. */ + getCanonicalIntervalName(intervalValue) { + if (!this.isValidIntervalValue(intervalValue)) { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', `Invalid interval value: ${intervalValue}`); + } + return Music.diatonic_intervals[intervalValue]; + } + /** + * Given a note, interval, and interval direction, produce the relative note. + */ + getRelativeNoteValue(noteValue, intervalValue, direction = 1) { + if (direction !== 1 && direction !== -1) { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', `Invalid direction: ${direction}`); + } + let sum = (noteValue + direction * intervalValue) % Music.NUM_TONES; + if (sum < 0) + sum += Music.NUM_TONES; + return sum; + } + /** + * Given a root and note value, produce the relative note name. + */ + getRelativeNoteName(root, noteValue) { + const parts = this.getNoteParts(root); + const rootValue = this.getNoteValue(parts.root); + let interval = noteValue - rootValue; + if (Math.abs(interval) > Music.NUM_TONES - 3) { + let multiplier = 1; + if (interval > 0) + multiplier = -1; + // Possibly wrap around. (Add +1 for modulo operator) + const reverse_interval = ((noteValue + 1 + (rootValue + 1)) % Music.NUM_TONES) * multiplier; + if (Math.abs(reverse_interval) > 2) { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', `Notes not related: ${root}, ${noteValue})`); + } + else { + interval = reverse_interval; + } + } + if (Math.abs(interval) > 2) { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', `Notes not related: ${root}, ${noteValue})`); + } + let relativeNoteName = parts.root; + if (interval > 0) { + for (let i = 1; i <= interval; ++i) { + relativeNoteName += '#'; + } + } + else if (interval < 0) { + for (let i = -1; i >= interval; --i) { + relativeNoteName += 'b'; + } + } + return relativeNoteName; + } + /** + * Return scale tones, given intervals. Each successive interval is + * relative to the previous one, e.g., Major Scale: + * + * TTSTTTS = [2,2,1,2,2,2,1] + * + * When used with key = 0, returns C scale (which is isomorphic to + * interval list). + */ + getScaleTones(key, intervals) { + const tones = [key]; + let nextNote = key; + for (let i = 0; i < intervals.length; i++) { + nextNote = this.getRelativeNoteValue(nextNote, intervals[i]); + if (nextNote !== key) + tones.push(nextNote); + } + return tones; + } + /** + * Return the interval of a note, given a diatonic scale. + * e.g., given the scale C, and the note E, returns M3. + */ + getIntervalBetween(note1, note2, direction = 1) { + if (direction !== 1 && direction !== -1) { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', `Invalid direction: ${direction}`); + } + if (!this.isValidNoteValue(note1) || !this.isValidNoteValue(note2)) { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', `Invalid notes: ${note1}, ${note2}`); + } + let difference = direction === 1 ? note2 - note1 : note1 - note2; + if (difference < 0) + difference += Music.NUM_TONES; + return difference; + } + /** + * Create a scale map that represents the pitch state for a + * `keySignature`. For example, passing a `G` to `keySignature` would + * return a scale map with every note naturalized except for `F` which + * has an `F#` state. + */ + createScaleMap(keySignature) { + const keySigParts = this.getKeyParts(keySignature); + if (!keySigParts.type) + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', 'Unsupported key type: undefined'); + const scaleName = Music.scaleTypes[keySigParts.type]; + let keySigString = keySigParts.root; + if (keySigParts.accidental) + keySigString += keySigParts.accidental; + if (!scaleName) + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', 'Unsupported key type: ' + keySignature); + const scale = this.getScaleTones(this.getNoteValue(keySigString), scaleName); + const noteLocation = Music.root_indices[keySigParts.root]; + const scaleMap = {}; + for (let i = 0; i < Music.roots.length; ++i) { + const index = (noteLocation + i) % Music.roots.length; + const rootName = Music.roots[index]; + let noteName = this.getRelativeNoteName(rootName, scale[i]); + if (noteName.length === 1) { + noteName += 'n'; + } + scaleMap[rootName] = noteName; + } + return scaleMap; + } +} + + +/***/ }), + +/***/ "./src/note.ts": +/*!*********************!*\ + !*** ./src/note.ts ***! + \*********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Note": () => (/* binding */ Note) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _rendercontext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./rendercontext */ "./src/rendercontext.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _tickable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tickable */ "./src/tickable.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + + +/** + * Note implements an abstract interface for notes and chords that + * are rendered on a stave. Notes have some common properties: All of them + * have a value (e.g., pitch, fret, etc.) and a duration (quarter, half, etc.) + * + * Some notes have stems, heads, dots, etc. Most notational elements that + * surround a note are called *modifiers*, and every note has an associated + * array of them. All notes also have a rendering context and belong to a stave. + */ +class Note extends _tickable__WEBPACK_IMPORTED_MODULE_3__.Tickable { + /** + * Every note is a tickable, i.e., it can be mutated by the `Formatter` class for + * positioning and layout. + * + * @param noteStruct To create a new note you need to provide a `noteStruct`. + */ + constructor(noteStruct) { + super(); + if (!noteStruct) { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('BadArguments', 'Note must have valid initialization data to identify duration and type.'); + } + /** Parses `noteStruct` and get note properties. */ + const parsedNoteStruct = Note.parseNoteStruct(noteStruct); + if (!parsedNoteStruct) { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('BadArguments', `Invalid note initialization object: ${JSON.stringify(noteStruct)}`); + } + // Set note properties from parameters. + this.keys = noteStruct.keys || []; + // per-pitch properties + this.keyProps = []; + this.duration = parsedNoteStruct.duration; + this.noteType = parsedNoteStruct.type; + this.customTypes = parsedNoteStruct.customTypes; + if (noteStruct.duration_override) { + // Custom duration + this.setDuration(noteStruct.duration_override); + } + else { + // Default duration + this.setIntrinsicTicks(parsedNoteStruct.ticks); + } + this.modifiers = []; + // Get the glyph code for this note from the font. + this.glyph = _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.getGlyphProps(this.duration, this.noteType); + this.customGlyphs = this.customTypes.map((t) => _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.getGlyphProps(this.duration, t)); + // Note to play for audio players. + this.playNote = undefined; + // Positioning contexts used by the Formatter. + this.ignore_ticks = false; + // Positioning variables + this.width = 0; // Width in pixels calculated after preFormat + this.leftDisplacedHeadPx = 0; // Extra room on left for displaced note head + this.rightDisplacedHeadPx = 0; // Extra room on right for displaced note head + this.x_shift = 0; // X shift from tick context X + this.ys = []; // list of y coordinates for each note + // we need to hold on to these for ties and beams. + if (noteStruct.align_center) { + this.setCenterAlignment(noteStruct.align_center); + } + // The render surface. + this.render_options = { + annotation_spacing: 5, + glyph_font_scale: 1, + stroke_px: 1, + scale: 1, + font: '', + y_shift: 0, + }; + } + ////////////////////////////////////////////////////////////////////////////////////////////////// + // STATIC MEMBERS + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_4__.Category.Note; + } + /** Debug helper. Displays various note metrics for the given note. */ + static plotMetrics(ctx, note, yPos) { + const metrics = note.getMetrics(); + const xStart = note.getAbsoluteX() - metrics.modLeftPx - metrics.leftDisplacedHeadPx; + const xPre1 = note.getAbsoluteX() - metrics.leftDisplacedHeadPx; + const xAbs = note.getAbsoluteX(); + const xPost1 = note.getAbsoluteX() + metrics.notePx; + const xPost2 = note.getAbsoluteX() + metrics.notePx + metrics.rightDisplacedHeadPx; + const xEnd = note.getAbsoluteX() + metrics.notePx + metrics.rightDisplacedHeadPx + metrics.modRightPx; + const xFreedomRight = xEnd + (note.getFormatterMetrics().freedom.right || 0); + const xWidth = xEnd - xStart; + ctx.save(); + ctx.setFont(_font__WEBPACK_IMPORTED_MODULE_0__.Font.SANS_SERIF, 8); + ctx.fillText(Math.round(xWidth) + 'px', xStart + note.getXShift(), yPos); + const y = yPos + 7; + function stroke(x1, x2, color, yy = y) { + ctx.beginPath(); + ctx.setStrokeStyle(color); + ctx.setFillStyle(color); + ctx.setLineWidth(3); + ctx.moveTo(x1 + note.getXShift(), yy); + ctx.lineTo(x2 + note.getXShift(), yy); + ctx.stroke(); + } + stroke(xStart, xPre1, 'red'); + stroke(xPre1, xAbs, '#999'); + stroke(xAbs, xPost1, 'green'); + stroke(xPost1, xPost2, '#999'); + stroke(xPost2, xEnd, 'red'); + stroke(xEnd, xFreedomRight, '#DD0'); + stroke(xStart - note.getXShift(), xStart, '#BBB'); // Shift + (0,_rendercontext__WEBPACK_IMPORTED_MODULE_1__.drawDot)(ctx, xAbs + note.getXShift(), y, 'blue'); + const formatterMetrics = note.getFormatterMetrics(); + if (formatterMetrics.iterations > 0) { + const spaceDeviation = formatterMetrics.space.deviation; + const prefix = spaceDeviation >= 0 ? '+' : ''; + ctx.setFillStyle('red'); + ctx.fillText(prefix + Math.round(spaceDeviation), xAbs + note.getXShift(), yPos - 10); + } + ctx.restore(); + } + static parseDuration(durationString) { + if (!durationString) { + return undefined; + } + const regexp = /(\d*\/?\d+|[a-z])(d*)([nrhms]|$)/; + const result = regexp.exec(durationString); + if (!result) { + return undefined; + } + const duration = result[1]; + const dots = result[2].length; + const type = result[3] || 'n'; + return { duration, dots, type }; + } + static parseNoteStruct(noteStruct) { + // Preserve backwards-compatibility + const durationProps = Note.parseDuration(noteStruct.duration); + if (!durationProps) { + return undefined; + } + // If specified type is invalid, return undefined. + let type = noteStruct.type; + if (type && !_tables__WEBPACK_IMPORTED_MODULE_2__.Tables.validTypes[type]) { + return undefined; + } + // If no type specified, check duration or custom types + const customTypes = []; + if (!type) { + type = durationProps.type || 'n'; + // If we have keys, try and check if we've got a custom glyph + if (noteStruct.keys !== undefined) { + noteStruct.keys.forEach((k, i) => { + const result = k.split('/'); + // We have a custom glyph specified after the note eg. /X2 + customTypes[i] = (result && result.length === 3 ? result[2] : type); + }); + } + } + // Calculate the tick duration of the note + let ticks = _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.durationToTicks(durationProps.duration); + if (!ticks) { + return undefined; + } + // Are there any dots? + const dots = noteStruct.dots ? noteStruct.dots : durationProps.dots; + if (typeof dots !== 'number') { + return undefined; + } + // Add ticks as necessary depending on the numbr of dots + let currentTicks = ticks; + for (let i = 0; i < dots; i++) { + if (currentTicks <= 1) + return undefined; + currentTicks = currentTicks / 2; + ticks += currentTicks; + } + return { + duration: durationProps.duration, + type, + customTypes, + dots, + ticks, + }; + } + /** + * Get the play note, which is arbitrary data that can be used by an + * audio player. + */ + getPlayNote() { + return this.playNote; + } + /** + * Set the play note, which is arbitrary data that can be used by an + * audio player. + */ + setPlayNote(note) { + this.playNote = note; + return this; + } + /** + * @returns true if this note is a type of rest. + * + * Rests don't have pitches, but take up space in the score. + * Subclasses should override this default implementation. + */ + isRest() { + return false; + } + /** Add stroke. */ + addStroke(index, stroke) { + stroke.setNote(this); + stroke.setIndex(index); + this.modifiers.push(stroke); + this.preFormatted = false; + return this; + } + /** Get the target stave. */ + getStave() { + return this.stave; + } + /** Check and get the target stave. */ + checkStave() { + return (0,_util__WEBPACK_IMPORTED_MODULE_5__.defined)(this.stave, 'NoStave', 'No stave attached to instance.'); + } + /** Set the target stave. */ + setStave(stave) { + this.stave = stave; + this.setYs([stave.getYForLine(0)]); // Update Y values if the stave is changed. + this.setContext(this.stave.getContext()); + return this; + } + /** Get spacing to the left of the notes. */ + getLeftDisplacedHeadPx() { + return this.leftDisplacedHeadPx; + } + /** Get spacing to the right of the notes. */ + getRightDisplacedHeadPx() { + return this.rightDisplacedHeadPx; + } + /** Set spacing to the left of the notes. */ + setLeftDisplacedHeadPx(x) { + this.leftDisplacedHeadPx = x; + return this; + } + /** Set spacing to the right of the notes. */ + setRightDisplacedHeadPx(x) { + this.rightDisplacedHeadPx = x; + return this; + } + /** True if this note has no duration (e.g., bar notes, spacers, etc.). */ + shouldIgnoreTicks() { + return this.ignore_ticks; + } + /** Get the stave line number for the note. */ + // eslint-disable-next-line + getLineNumber(isTopNote) { + return 0; + } + /** Get the stave line number for rest. */ + getLineForRest() { + return 0; + } + /** Get the glyph associated with this note. */ + // eslint-disable-next-line + getGlyph() { + return this.glyph; + } + /** Get the glyph width. */ + getGlyphWidth() { + // TODO: FIXME (multiple potential values for this.glyph) + if (this.glyph) { + if (this.glyph.getMetrics) { + return this.glyph.getMetrics().width; + } + else if (this.glyph.getWidth) { + return this.glyph.getWidth(this.render_options.glyph_font_scale); + } + } + return 0; + } + /** + * Set Y positions for this note. Each Y value is associated with + * an individual pitch/key within the note/chord. + */ + setYs(ys) { + this.ys = ys; + return this; + } + /** + * Get Y positions for this note. Each Y value is associated with + * an individual pitch/key within the note/chord. + */ + getYs() { + if (this.ys.length === 0) { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('NoYValues', 'No Y-values calculated for this note.'); + } + return this.ys; + } + /** + * Get the Y position of the space above the stave onto which text can + * be rendered. + */ + getYForTopText(text_line) { + return this.checkStave().getYForTopText(text_line); + } + /** Return the voice that this note belongs in. */ + getVoice() { + if (!this.voice) + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('NoVoice', 'Note has no voice.'); + return this.voice; + } + /** Attach this note to `voice`. */ + setVoice(voice) { + this.voice = voice; + this.preFormatted = false; + return this; + } + /** Get the `TickContext` for this note. */ + getTickContext() { + return this.checkTickContext(); + } + /** Set the `TickContext` for this note. */ + setTickContext(tc) { + this.tickContext = tc; + this.preFormatted = false; + return this; + } + /** Accessor to duration. */ + getDuration() { + return this.duration; + } + /** Accessor to isDotted. */ + isDotted() { + return this.getModifiersByType('Dot').length > 0; + } + /** Accessor to hasStem. */ + hasStem() { + return false; + } + /** Accessor to note type. */ + getNoteType() { + return this.noteType; + } + /** Get the beam. */ + getBeam() { + return this.beam; + } + /** Check and get the beam. */ + checkBeam() { + return (0,_util__WEBPACK_IMPORTED_MODULE_5__.defined)(this.beam, 'NoBeam', 'No beam attached to instance'); + } + /** Check it has a beam. */ + hasBeam() { + return this.beam != undefined; + } + /** Set the beam. */ + setBeam(beam) { + this.beam = beam; + return this; + } + /** + * Attach a modifier to this note. + * @param modifier the Modifier to add. + * @param index of the key to modify. + * @returns this + */ + addModifier(modifier, index = 0) { + const signature = 'Note.addModifier(modifier: Modifier, index: number=0)'; + // Backwards compatibility with 3.0.9. + if (typeof index === 'string') { + index = parseInt(index); + // eslint-disable-next-line + console.warn(signature + ' expected a number for `index`, but received a string.'); + } + // Some versions of VexFlow had the two parameters reversed. + // Check here and throw an error if the argument types are not correct. + if (typeof modifier !== 'object' || typeof index !== 'number') { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('WrongParams', 'Incorrect call signature. Use ' + signature + ' instead.'); + } + modifier.setNote(this); + modifier.setIndex(index); + super.addModifier(modifier); + return this; + } + // Get all modifiers of a specific type in the `ModifierContext` + getModifiersByType(type) { + return this.checkModifierContext().getMembers(type); + } + /** Get the coordinates for where modifiers begin. */ + // eslint-disable-next-line + getModifierStartXY(position, index, options) { + if (!this.preFormatted) { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('UnformattedNote', "Can't call GetModifierStartXY on an unformatted note"); + } + return { + x: this.getAbsoluteX(), + y: this.ys[0], + }; + } + getRightParenthesisPx(index) { + const props = this.getKeyProps()[index]; + return props.displaced ? this.getRightDisplacedHeadPx() : 0; + } + getLeftParenthesisPx(index) { + const props = this.getKeyProps()[index]; + return props.displaced ? this.getLeftDisplacedHeadPx() : 0; + } + getFirstDotPx() { + let px = this.getRightDisplacedHeadPx(); + if (this.checkModifierContext().getMembers('Parenthesis').length !== 0) + px += _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.currentMusicFont().lookupMetric('parenthesis.default.width'); + return px; + } + /** Get the metrics for this note. */ + getMetrics() { + if (!this.preFormatted) { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('UnformattedNote', "Can't call getMetrics on an unformatted note."); + } + const modLeftPx = this.modifierContext ? this.modifierContext.getState().left_shift : 0; + const modRightPx = this.modifierContext ? this.modifierContext.getState().right_shift : 0; + const width = this.getWidth(); + const glyphWidth = this.getGlyphWidth(); + const notePx = width - + modLeftPx - // subtract left modifiers + modRightPx - // subtract right modifiers + this.leftDisplacedHeadPx - // subtract left displaced head + this.rightDisplacedHeadPx; // subtract right displaced head + // NOTE: If you change this, remember to update MockTickable.getMetrics() in the tests/ directory. + return { + width, + glyphWidth, + notePx, + // Modifier spacing. + modLeftPx, + modRightPx, + // Displaced note head on left or right. + leftDisplacedHeadPx: this.leftDisplacedHeadPx, + rightDisplacedHeadPx: this.rightDisplacedHeadPx, + glyphPx: 0, + }; + } + /** + * Get the absolute `X` position of this note's tick context. This + * excludes x_shift, so you'll need to factor it in if you're + * looking for the post-formatted x-position. + */ + getAbsoluteX() { + const tickContext = this.checkTickContext(`Can't getAbsoluteX() without a TickContext.`); + // Position note to left edge of tick context. + let x = tickContext.getX(); + if (this.stave) { + x += this.stave.getNoteStartX() + _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.currentMusicFont().lookupMetric('stave.padding'); + } + if (this.isCenterAligned()) { + x += this.getCenterXShift(); + } + return x; + } + /** Get the direction of the stem. */ + getStemDirection() { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('NoStem', 'No stem attached to this note.'); + } + /** Get the top and bottom `y` values of the stem. */ + getStemExtents() { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('NoStem', 'No stem attached to this note.'); + } + /** Get the `x` coordinate to the right of the note. */ + getTieRightX() { + let tieStartX = this.getAbsoluteX(); + const note_glyph_width = this.glyph.getWidth(); + tieStartX += note_glyph_width / 2; + tieStartX += -this.width / 2 + this.width + 2; + return tieStartX; + } + /** Get the `x` coordinate to the left of the note. */ + getTieLeftX() { + let tieEndX = this.getAbsoluteX(); + const note_glyph_width = this.glyph.getWidth(); + tieEndX += note_glyph_width / 2; + tieEndX -= this.width / 2 + 2; + return tieEndX; + } + // Get the pitches in the note + getKeys() { + return this.keys; + } + // Get the properties for all the keys in the note + getKeyProps() { + return this.keyProps; + } +} + + +/***/ }), + +/***/ "./src/notehead.ts": +/*!*************************!*\ + !*** ./src/notehead.ts ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "NoteHead": () => (/* binding */ NoteHead) +/* harmony export */ }); +/* harmony import */ var _boundingbox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./boundingbox */ "./src/boundingbox.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./note */ "./src/note.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + + + +// eslint-disable-next-line +function L(...args) { + if (NoteHead.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_6__.log)('Vex.Flow.NoteHead', args); +} +/** + * Draw slashnote head manually. No glyph exists for this. + * @param ctx the Canvas context + * @param duration the duration of the note. ex: "4" + * @param x the x coordinate to draw at + * @param y the y coordinate to draw at + * @param stem_direction the direction of the stem + */ +function drawSlashNoteHead(ctx, duration, x, y, stem_direction, staveSpace) { + const width = _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.SLASH_NOTEHEAD_WIDTH; + ctx.save(); + ctx.setLineWidth(_tables__WEBPACK_IMPORTED_MODULE_4__.Tables.STEM_WIDTH); + let fill = false; + if (_tables__WEBPACK_IMPORTED_MODULE_4__.Tables.durationToNumber(duration) > 2) { + fill = true; + } + if (!fill) + x -= (_tables__WEBPACK_IMPORTED_MODULE_4__.Tables.STEM_WIDTH / 2) * stem_direction; + ctx.beginPath(); + ctx.moveTo(x, y + staveSpace); + ctx.lineTo(x, y + 1); + ctx.lineTo(x + width, y - staveSpace); + ctx.lineTo(x + width, y); + ctx.lineTo(x, y + staveSpace); + ctx.closePath(); + if (fill) { + ctx.fill(); + } + else { + ctx.stroke(); + } + if (_tables__WEBPACK_IMPORTED_MODULE_4__.Tables.durationToFraction(duration).equals(0.5)) { + const breve_lines = [-3, -1, width + 1, width + 3]; + for (let i = 0; i < breve_lines.length; i++) { + ctx.beginPath(); + ctx.moveTo(x + breve_lines[i], y - 10); + ctx.lineTo(x + breve_lines[i], y + 11); + ctx.stroke(); + } + } + ctx.restore(); +} +/** + * `NoteHeads` are typically not manipulated + * directly, but used internally in `StaveNote`. + * + * See `tests/notehead_tests.ts` for usage examples. + */ +class NoteHead extends _note__WEBPACK_IMPORTED_MODULE_2__.Note { + constructor(noteStruct) { + super(noteStruct); + this.custom_glyph = false; + this.stem_up_x_offset = 0; + this.stem_down_x_offset = 0; + this.index = noteStruct.index; + this.x = noteStruct.x || 0; + this.y = noteStruct.y || 0; + if (noteStruct.note_type) + this.noteType = noteStruct.note_type; + this.displaced = noteStruct.displaced || false; + this.stem_direction = noteStruct.stem_direction || _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP; + this.line = noteStruct.line || 0; + // Get glyph code based on duration and note type. This could be + // regular notes, rests, or other custom codes. + this.glyph = _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.getGlyphProps(this.duration, this.noteType); + (0,_util__WEBPACK_IMPORTED_MODULE_6__.defined)(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`); + this.glyph_code = this.glyph.code_head; + this.x_shift = noteStruct.x_shift || 0; + if (noteStruct.custom_glyph_code) { + this.custom_glyph = true; + this.glyph_code = noteStruct.custom_glyph_code; + this.stem_up_x_offset = noteStruct.stem_up_x_offset || 0; + this.stem_down_x_offset = noteStruct.stem_down_x_offset || 0; + } + this.style = noteStruct.style; + this.slashed = noteStruct.slashed || false; + this.render_options = Object.assign(Object.assign({}, this.render_options), { + // font size for note heads + glyph_font_scale: noteStruct.glyph_font_scale || _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.NOTATION_FONT_SCALE }); + this.setWidth(this.glyph.getWidth(this.render_options.glyph_font_scale)); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_5__.Category.NoteHead; + } + /** Get the width of the notehead. */ + getWidth() { + return this.width; + } + /** Determine if the notehead is displaced. */ + isDisplaced() { + return this.displaced === true; + } + /** Get the glyph data. */ + getGlyph() { + return this.glyph; + } + /** Set the X coordinate. */ + setX(x) { + this.x = x; + return this; + } + /** Get the Y coordinate. */ + getY() { + return this.y; + } + /** Set the Y coordinate. */ + setY(y) { + this.y = y; + return this; + } + /** Get the stave line the notehead is placed on. */ + getLine() { + return this.line; + } + /** Set the stave line the notehead is placed on. */ + setLine(line) { + this.line = line; + return this; + } + /** Get the canvas `x` coordinate position of the notehead. */ + getAbsoluteX() { + // If the note has not been preformatted, then get the static x value + // Otherwise, it's been formatted and we should use it's x value relative + // to its tick context + const x = !this.preFormatted ? this.x : super.getAbsoluteX(); + // For a more natural displaced notehead, we adjust the displacement amount + // by half the stem width in order to maintain a slight overlap with the stem + const displacementStemAdjustment = _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.WIDTH / 2; + const musicFont = _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.currentMusicFont(); + const fontShift = musicFont.lookupMetric('notehead.shiftX', 0) * this.stem_direction; + const displacedFontShift = musicFont.lookupMetric('noteHead.displaced.shiftX', 0) * this.stem_direction; + return (x + + fontShift + + (this.displaced ? (this.width - displacementStemAdjustment) * this.stem_direction + displacedFontShift : 0)); + } + /** Get the `BoundingBox` for the `NoteHead`. */ + getBoundingBox() { + if (!this.preFormatted) { + throw new _util__WEBPACK_IMPORTED_MODULE_6__.RuntimeError('UnformattedNote', "Can't call getBoundingBox on an unformatted note."); + } + const spacing = this.checkStave().getSpacingBetweenLines(); + const half_spacing = spacing / 2; + const min_y = this.y - half_spacing; + return new _boundingbox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox(this.getAbsoluteX(), min_y, this.width, spacing); + } + /** Set notehead to a provided `stave`. */ + setStave(stave) { + const line = this.getLine(); + this.stave = stave; + if (this.stave) { + this.setY(this.stave.getYForNote(line)); + this.setContext(this.stave.getContext()); + } + return this; + } + /** Pre-render formatting. */ + preFormat() { + if (this.preFormatted) + return this; + const width = this.getWidth() + this.leftDisplacedHeadPx + this.rightDisplacedHeadPx; + this.setWidth(width); + this.preFormatted = true; + return this; + } + /** Draw the notehead. */ + draw() { + const ctx = this.checkContext(); + this.setRendered(); + let head_x = this.getAbsoluteX(); + if (this.custom_glyph) { + // head_x += this.x_shift; + head_x += this.stem_direction === _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP ? this.stem_up_x_offset : this.stem_down_x_offset; + } + const y = this.y; + L("Drawing note head '", this.noteType, this.duration, "' at", head_x, y); + // Begin and end positions for head. + const stem_direction = this.stem_direction; + const glyph_font_scale = this.render_options.glyph_font_scale; + if (this.style) { + this.applyStyle(ctx); + } + const categorySuffix = `${this.glyph_code}Stem${stem_direction === _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP ? 'Up' : 'Down'}`; + if (this.noteType === 's') { + const staveSpace = this.checkStave().getSpacingBetweenLines(); + drawSlashNoteHead(ctx, this.duration, head_x, y, stem_direction, staveSpace); + } + else { + _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.renderGlyph(ctx, head_x, y, glyph_font_scale, this.glyph_code, { + category: this.custom_glyph ? `noteHead.custom.${categorySuffix}` : `noteHead.standard.${categorySuffix}`, + }); + } + if (this.style) { + this.restoreStyle(ctx); + } + } +} +/** To enable logging for this class. Set `Vex.Flow.NoteHead.DEBUG` to `true`. */ +NoteHead.DEBUG = false; + + +/***/ }), + +/***/ "./src/notesubgroup.ts": +/*!*****************************!*\ + !*** ./src/notesubgroup.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "NoteSubGroup": () => (/* binding */ NoteSubGroup) +/* harmony export */ }); +/* harmony import */ var _formatter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./formatter */ "./src/formatter.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _voice__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./voice */ "./src/voice.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author Taehoon Moon 2016 +// +// ## Description +// +// This file implements `NoteSubGroup` which is used to format and +// render notes as a `Modifier` +// ex) ClefNote, TimeSigNote and BarNote. + + + + + +class NoteSubGroup extends _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier { + constructor(subNotes) { + super(); + this.preFormatted = false; + this.position = _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.LEFT; + this.subNotes = subNotes; + this.subNotes.forEach((subNote) => { + subNote.setIgnoreTicks(false); + }); + this.width = 0; + this.formatter = new _formatter__WEBPACK_IMPORTED_MODULE_0__.Formatter(); + this.voice = new _voice__WEBPACK_IMPORTED_MODULE_4__.Voice({ + num_beats: 4, + beat_value: 4, + resolution: _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.RESOLUTION, + }).setStrict(false); + this.voice.addTickables(this.subNotes); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.NoteSubGroup; + } + // Arrange groups inside a `ModifierContext` + static format(groups, state) { + if (!groups || groups.length === 0) + return false; + let width = 0; + for (let i = 0; i < groups.length; ++i) { + const group = groups[i]; + group.preFormat(); + width += group.getWidth(); + } + state.left_shift += width; + return true; + } + preFormat() { + if (this.preFormatted) + return; + this.formatter.joinVoices([this.voice]).format([this.voice], 0); + this.setWidth(this.formatter.getMinTotalWidth()); + this.preFormatted = true; + } + setWidth(width) { + this.width = width; + return this; + } + getWidth() { + return this.width; + } + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + this.alignSubNotesWithNote(this.subNotes, note); // Modifier function + this.subNotes.forEach((subNote) => subNote.setContext(ctx).drawWithStyle()); + } +} + + +/***/ }), + +/***/ "./src/ornament.ts": +/*!*************************!*\ + !*** ./src/ornament.ts ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Ornament": () => (/* binding */ Ornament) +/* harmony export */ }); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _tickcontext__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tickcontext */ "./src/tickcontext.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author: Cyril Silverman +// MIT License + + + + + + + +// eslint-disable-next-line +function L(...args) { + if (Ornament.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_6__.log)('Vex.Flow.Ornament', args); +} +/** + * Ornament implements ornaments as modifiers that can be + * attached to notes. The complete list of ornaments is available in + * `tables.ts` under `Vex.Flow.ornamentCodes`. + * + * See `tests/ornament_tests.ts` for usage examples. + */ +class Ornament extends _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier { + /** + * Create a new ornament of type `type`, which is an entry in + * `Vex.Flow.ornamentCodes` in `tables.ts`. + */ + constructor(type) { + super(); + this.type = type; + this.delayed = false; + this.render_options = { + font_scale: 38, + accidentalLowerPadding: 3, + accidentalUpperPadding: 3, + }; + this.ornament = _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.ornamentCodes(this.type); + // new ornaments have their origin at the origin, and have more specific + // metrics. Legacy ornaments do some + // x scaling, and have hard-coded metrics + const metrics = this.getMetrics(); + // some jazz ornaments are above or below depending on stem direction. + this.adjustForStemDirection = false; + // some jazz ornaments like falls are supposed to overlap with future bars + // and so we report a different width than they actually take up. + this.reportedWidth = metrics && metrics.reportedWidth ? metrics.reportedWidth : 0; + this.stemUpYOffset = metrics && metrics.stemUpYOffset ? metrics.stemUpYOffset : 0; + this.ornamentAlignWithNoteHead = Ornament.ornamentAlignWithNoteHead.indexOf(this.type) >= 0; + if (!this.ornament) { + throw new _util__WEBPACK_IMPORTED_MODULE_6__.RuntimeError('ArgumentError', `Ornament not found: '${this.type}'`); + } + this.x_shift = metrics ? metrics.xOffset : 0; + this.y_shift = metrics ? metrics.yOffset : 0; + this.glyph = new _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph(this.ornament.code, this.render_options.font_scale, { + category: `ornament.${this.ornament.code}`, + }); + // Is this a jazz ornament that goes between this note and the next note. + if (Ornament.ornamentNoteTransition.indexOf(this.type) >= 0) { + this.delayed = true; + } + // Legacy ornaments need this. I don't know why, but horizontal spacing issues + // happen if I don't set it. + if (!metrics) { + this.glyph.setOrigin(0.5, 1.0); // FIXME: SMuFL won't require a vertical origin shift + } + } + /** Ornaments category string. */ + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_5__.Category.Ornament; + } + /** Arrange ornaments inside `ModifierContext` */ + static format(ornaments, state) { + if (!ornaments || ornaments.length === 0) + return false; + let width = 0; // width is used by ornaments, which are always centered on the note head + let right_shift = state.right_shift; // jazz ornaments calculate r/l shift separately + let left_shift = state.left_shift; + let yOffset = 0; + for (let i = 0; i < ornaments.length; ++i) { + const ornament = ornaments[i]; + const increment = 2; + if (Ornament.ornamentRelease.indexOf(ornament.type) >= 0) { + ornament.x_shift += right_shift + 2; + } + if (Ornament.ornamentAttack.indexOf(ornament.type) >= 0) { + ornament.x_shift -= left_shift + 2; + } + if (ornament.reportedWidth && ornament.x_shift < 0) { + left_shift += ornament.reportedWidth; + } + else if (ornament.reportedWidth && ornament.x_shift > 0) { + right_shift += ornament.reportedWidth; + } + else { + width = Math.max(ornament.getWidth(), width); + } + // articulations above/below the line can be stacked. + if (Ornament.ornamentArticulation.indexOf(ornament.type) >= 0) { + // Unfortunately we don't know the stem direction. So we base it + // on the line number, but also allow it to be overridden. + const ornamentNote = (0,_util__WEBPACK_IMPORTED_MODULE_6__.defined)(ornament.note, 'NoAttachedNote'); + if (ornamentNote.getLineNumber() >= 3 || ornament.getPosition() === _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.ABOVE) { + state.top_text_line += increment; + ornament.y_shift += yOffset; + yOffset -= ornament.glyph.bbox.getH(); + } + else { + state.text_line += increment; + ornament.y_shift += yOffset; + yOffset += ornament.glyph.bbox.getH(); + } + } + else { + if (ornament.getPosition() === _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.ABOVE) { + ornament.setTextLine(state.top_text_line); + state.top_text_line += increment; + } + else { + ornament.setTextLine(state.text_line); + state.text_line += increment; + } + } + } + // Note: 'legit' ornaments don't consider other modifiers when calculating their + // X position, but jazz ornaments sometimes need to. + state.left_shift = left_shift + width / 2; + state.right_shift = right_shift + width / 2; + return true; + } + /** + * ornamentNoteTransition means the jazz ornament represents an effect from one note to another, + * these are generally on the top of the staff. + */ + static get ornamentNoteTransition() { + return ['flip', 'jazzTurn', 'smear']; + } + /** + * ornamentAttack indicates something that happens in the attach, placed before the note and + * any accidentals + */ + static get ornamentAttack() { + return ['scoop']; + } + /** + * The ornament is aligned based on the note head, but without regard to whether the + * stem goes up or down. + */ + static get ornamentAlignWithNoteHead() { + return ['doit', 'fall', 'fallLong', 'doitLong', 'bend', 'plungerClosed', 'plungerOpen', 'scoop']; + } + /** + * An ornament that happens on the release of the note, generally placed after the + * note and overlapping the next beat/measure.. + */ + static get ornamentRelease() { + return ['doit', 'fall', 'fallLong', 'doitLong', 'jazzTurn', 'smear', 'flip']; + } + /** ornamentArticulation goes above/below the note based on space availablity */ + static get ornamentArticulation() { + return ['bend', 'plungerClosed', 'plungerOpen']; + } + /** + * Legacy ornaments have hard-coded metrics. If additional ornament types are + * added, get their metrics here. + */ + // eslint-disable-next-line + getMetrics() { + return _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().getMetrics().glyphs.jazzOrnaments[this.ornament.code]; + } + /** Set whether the ornament is to be delayed. */ + setDelayed(delayed) { + this.delayed = delayed; + return this; + } + /** Set the upper accidental for the ornament. */ + setUpperAccidental(accid) { + const scale = this.render_options.font_scale / 1.3; + this.accidentalUpper = new _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph(_tables__WEBPACK_IMPORTED_MODULE_3__.Tables.accidentalCodes(accid).code, scale); + this.accidentalUpper.setOrigin(0.5, 1.0); + return this; + } + /** Set the lower accidental for the ornament. */ + setLowerAccidental(accid) { + const scale = this.render_options.font_scale / 1.3; + this.accidentalLower = new _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph(_tables__WEBPACK_IMPORTED_MODULE_3__.Tables.accidentalCodes(accid).code, scale); + this.accidentalLower.setOrigin(0.5, 1.0); + return this; + } + /** Render ornament in position next to note. */ + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const stemDir = note.getStemDirection(); + const stave = note.checkStave(); + const classString = Object.keys(this.getAttribute('classes')).join(' '); + ctx.openGroup(classString, this.getAttribute('id')); + // Get stem extents + const stemExtents = note.checkStem().getExtents(); + let y = stemDir === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN ? stemExtents.baseY : stemExtents.topY; + // TabNotes don't have stems attached to them. Tab stems are rendered outside the stave. + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isTabNote)(note)) { + if (note.hasStem()) { + if (stemDir === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN) { + y = stave.getYForTopText(this.text_line); + } + } + else { + // Without a stem + y = stave.getYForTopText(this.text_line); + } + } + const isPlacedOnNoteheadSide = stemDir === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN; + const spacing = stave.getSpacingBetweenLines(); + let lineSpacing = 1; + // Beamed stems are longer than quarter note stems, adjust accordingly + if (!isPlacedOnNoteheadSide && note.hasBeam()) { + lineSpacing += 0.5; + } + const totalSpacing = spacing * (this.text_line + lineSpacing); + const glyphYBetweenLines = y - totalSpacing; + // Get initial coordinates for the modifier position + const start = note.getModifierStartXY(this.position, this.index); + let glyphX = start.x; + // If the ornament is aligned with the note head, don't consider the stave y + // but use the 'natural' modifier y + let glyphY = this.ornamentAlignWithNoteHead + ? start.y + : Math.min(stave.getYForTopText(this.text_line), glyphYBetweenLines); + glyphY += this.y_shift; + // Ajdust x position if ornament is delayed + if (this.delayed) { + let delayXShift = 0; + const startX = glyphX - (stave.getX() - 10); + if (this.delayXShift !== undefined) { + delayXShift = this.delayXShift; + } + else { + delayXShift += this.glyph.getMetrics().width / 2; + const nextContext = _tickcontext__WEBPACK_IMPORTED_MODULE_4__.TickContext.getNextContext(note.getTickContext()); + if (nextContext) { + delayXShift += (nextContext.getX() - startX) * 0.5; + } + else { + delayXShift += (stave.getX() + stave.getWidth() - startX) * 0.5; + } + this.delayXShift = delayXShift; + } + glyphX += delayXShift; + } + L('Rendering ornament: ', this.ornament, glyphX, glyphY); + if (this.accidentalLower) { + this.accidentalLower.render(ctx, glyphX, glyphY); + glyphY -= this.accidentalLower.getMetrics().height; + glyphY -= this.render_options.accidentalLowerPadding; + } + if (this.stemUpYOffset && note.hasStem() && note.getStemDirection() === 1) { + glyphY += this.stemUpYOffset; + } + if (note.getLineNumber() < 5 && Ornament.ornamentNoteTransition.indexOf(this.type) >= 0) { + glyphY = note.checkStave().getBoundingBox().getY() + 40; + } + this.glyph.render(ctx, glyphX + this.x_shift, glyphY); + if (this.accidentalUpper) { + glyphY -= this.glyph.getMetrics().height + this.render_options.accidentalUpperPadding; + this.accidentalUpper.render(ctx, glyphX, glyphY); + } + ctx.closeGroup(); + } +} +/** To enable logging for this class. Set `Vex.Flow.Ornament.DEBUG` to `true`. */ +Ornament.DEBUG = false; + + +/***/ }), + +/***/ "./src/parenthesis.ts": +/*!****************************!*\ + !*** ./src/parenthesis.ts ***! + \****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Parenthesis": () => (/* binding */ Parenthesis) +/* harmony export */ }); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author: Rodrigo Vilar +// MIT License + + + + +/** Parenthesis implements parenthesis modifiers for notes. */ +class Parenthesis extends _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier { + /** + * Constructor + * + * @param position Modifier.Position.LEFT (default) or Modifier.Position.RIGHT + */ + constructor(position) { + super(); + this.position = position !== null && position !== void 0 ? position : _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.LEFT; + this.point = _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.currentMusicFont().lookupMetric('parenthesis.default.point'); + this.setWidth(_tables__WEBPACK_IMPORTED_MODULE_2__.Tables.currentMusicFont().lookupMetric('parenthesis.default.width')); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.Parenthesis; + } + /** Add parentheses to the notes. */ + static buildAndAttach(notes) { + for (const note of notes) { + for (let i = 0; i < note.keys.length; i++) { + note.addModifier(new Parenthesis(_modifier__WEBPACK_IMPORTED_MODULE_1__.ModifierPosition.LEFT), i); + note.addModifier(new Parenthesis(_modifier__WEBPACK_IMPORTED_MODULE_1__.ModifierPosition.RIGHT), i); + } + } + } + /** Arrange parentheses inside a ModifierContext. */ + static format(parentheses, state) { + if (!parentheses || parentheses.length === 0) + return false; + let x_widthL = 0; + let x_widthR = 0; + for (let i = 0; i < parentheses.length; ++i) { + const parenthesis = parentheses[i]; + const note = parenthesis.getNote(); + const pos = parenthesis.getPosition(); + const index = parenthesis.checkIndex(); + let shift = 0; + if (pos === _modifier__WEBPACK_IMPORTED_MODULE_1__.ModifierPosition.RIGHT) { + shift = note.getRightParenthesisPx(index); + x_widthR = x_widthR > shift + parenthesis.width ? x_widthR : shift + parenthesis.width; + } + if (pos === _modifier__WEBPACK_IMPORTED_MODULE_1__.ModifierPosition.LEFT) { + shift = note.getLeftParenthesisPx(index); + x_widthL = x_widthL > shift + parenthesis.width ? x_widthL : shift + parenthesis.width; + } + parenthesis.setXShift(shift); + } + state.left_shift += x_widthL; + state.right_shift += x_widthR; + return true; + } + /** Set the associated note. */ + setNote(note) { + this.note = note; + this.point = _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.currentMusicFont().lookupMetric('parenthesis.default.point'); + this.setWidth(_tables__WEBPACK_IMPORTED_MODULE_2__.Tables.currentMusicFont().lookupMetric('parenthesis.default.width')); + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_3__.isGraceNote)(note)) { + this.point = _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.currentMusicFont().lookupMetric('parenthesis.gracenote.point'); + this.setWidth(_tables__WEBPACK_IMPORTED_MODULE_2__.Tables.currentMusicFont().lookupMetric('parenthesis.gracenote.width')); + } + return this; + } + /** Render the parenthesis. */ + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const start = note.getModifierStartXY(this.position, this.index, { forceFlagRight: true }); + const x = start.x + this.x_shift; + const y = start.y + this.y_shift; + if (this.position == _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.RIGHT) { + _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph.renderGlyph(ctx, x + 1, y, this.point, 'noteheadParenthesisRight', { + category: `noteHead.standard.noteheadParenthesisRight`, + }); + } + else if (this.position == _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.LEFT) { + _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph.renderGlyph(ctx, x - 2, y, this.point, 'noteheadParenthesisLeft', { + category: `noteHead.standard.noteheadParenthesisLeft`, + }); + } + } +} + + +/***/ }), + +/***/ "./src/parser.ts": +/*!***********************!*\ + !*** ./src/parser.ts ***! + \***********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Parser": () => (/* binding */ Parser) +/* harmony export */ }); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// A generic text parsing class for VexFlow. + +// To enable logging for this class. Set `Vex.Flow.Parser.DEBUG` to `true`. +// eslint-disable-next-line +function L(...args) { + if (Parser.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_0__.log)('Vex.Flow.Parser', args); +} +const NO_ERROR_POS = -1; +// Converts parser results into an easy to reference list that can be +// used in triggers. This function returns: +// - nested array in which the leaf elements are string or null +// - string (including empty strings) +// - null +function flattenMatches(r) { + if ('matchedString' in r) + return r.matchedString; // string + if ('results' in r) + return flattenMatches(r.results); + const results = r; + if (results.length === 1) + return flattenMatches(results[0]); + if (results.length === 0) + return null; + return results.map(flattenMatches); // nested array +} +// This is the base parser class. Given an arbitrary context-free grammar, it +// can parse any line and execute code when specific rules are met (e.g., +// when a string is terminated.) +class Parser { + // For an example of a simple grammar, take a look at tests/parser_tests.ts or + // the EasyScore grammar in easyscore.ts. + constructor(grammar) { + this.grammar = grammar; + this.line = ''; + this.pos = 0; + this.errorPos = NO_ERROR_POS; + } + // Parse `line` using current grammar. Returns `{success: true}` if the + // line parsed correctly, otherwise returns `{success: false, errorPos: N}` + // where `errorPos` is the location of the error in the string. + parse(line) { + this.line = line; + this.pos = 0; + this.errorPos = NO_ERROR_POS; + const result = this.expect(this.grammar.begin()); + result.errorPos = this.errorPos; + return result; + } + matchFail(returnPos) { + if (this.errorPos === NO_ERROR_POS) + this.errorPos = this.pos; + this.pos = returnPos; + } + matchSuccess() { + this.errorPos = NO_ERROR_POS; + } + // Look for `token` in this.line[this.pos], and return success + // if one is found. `token` is specified as a regular expression. + matchToken(token, noSpace = false) { + const regexp = noSpace ? new RegExp('^((' + token + '))') : new RegExp('^((' + token + ')\\s*)'); + const workingLine = this.line.slice(this.pos); + const result = workingLine.match(regexp); + if (result !== null) { + return { + success: true, + matchedString: result[2], + incrementPos: result[1].length, + pos: this.pos, + }; + } + else { + return { success: false, pos: this.pos }; + } + } + // Execute rule to match a sequence of tokens (or rules). If `maybe` is + // set, then return success even if the token is not found, but reset + // the position before exiting. + // TODO: expectOne(...) is never called with the `maybe` parameter. + expectOne(rule, maybe = false) { + const results = []; + const pos = this.pos; + let allMatches = true; + let oneMatch = false; + maybe = maybe === true || rule.maybe === true; + // Execute all sub rules in sequence. + if (rule.expect) { + for (const next of rule.expect) { + const localPos = this.pos; + const result = this.expect(next); + // If `rule.or` is set, then return success if any one + // of the subrules match, else all subrules must match. + if (result.success) { + results.push(result); + oneMatch = true; + if (rule.or) + break; + } + else { + allMatches = false; + if (!rule.or) { + this.pos = localPos; + break; + } + } + } + } + const gotOne = (rule.or && oneMatch) || allMatches; + const success = gotOne || maybe === true; + const numMatches = gotOne ? 1 : 0; + if (maybe && !gotOne) + this.pos = pos; + if (success) { + this.matchSuccess(); + } + else { + this.matchFail(pos); + } + return { success, results, numMatches }; + } + // Try to match multiple (one or more) instances of the rule. If `maybe` is set, + // then a failed match is also a success (but the position is reset). + expectOneOrMore(rule, maybe = false) { + const results = []; + const pos = this.pos; + let numMatches = 0; + let more = true; + do { + const result = this.expectOne(rule); + if (result.success && result.results) { + numMatches++; + results.push(result.results); + } + else { + more = false; + } + } while (more); + const success = numMatches > 0 || maybe === true; + if (maybe && !(numMatches > 0)) + this.pos = pos; + if (success) { + this.matchSuccess(); + } + else { + this.matchFail(pos); + } + return { success, results, numMatches }; + } + // Match zero or more instances of `rule`. Offloads to `expectOneOrMore`. + expectZeroOrMore(rule) { + return this.expectOneOrMore(rule, true); + } + // Execute the rule produced by the provided `rules` function. This + // offloads to one of the above matchers and consolidates the results. It is also + // responsible for executing any code triggered by the rule (in `rule.run`.) + expect(ruleFunc) { + L('Evaluating rule function:', ruleFunc); + if (!ruleFunc) { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('Invalid rule function'); + } + let result; + // Get rule from Grammar class. + // expect(...) handles both lexing & parsing: + // - lexer rules produce tokens. + // - parser rules produce expressions which may trigger code via the + // { run: () => ... } trigger functions in easyscore.ts. + // These functions build the VexFlow objects that are displayed on screen. + const rule = ruleFunc.bind(this.grammar)(); + if (rule.token) { + // A lexer rule has a `token` property. + // Base case: parse the regex and throw an error if the + // line doesn't match. + result = this.matchToken(rule.token, rule.noSpace === true); + if (result.success) { + // Token match! Update position and throw away parsed portion + // of string. + this.pos += result.incrementPos; + } + } + else if (rule.expect) { + // A parser rule has an `expect` property. + if (rule.oneOrMore) { + result = this.expectOneOrMore(rule); + } + else if (rule.zeroOrMore) { + result = this.expectZeroOrMore(rule); + } + else { + result = this.expectOne(rule); + } + } + else { + L(rule); + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('Bad grammar! No `token` or `expect` property ' + rule); + } + // If there's a trigger attached to this rule, then run it. + // Make the matches accessible through `state.matches` in the + // `run: (state) => ...` trigger. + const matches = []; + result.matches = matches; + if (result.results) { + result.results.forEach((r) => matches.push(flattenMatches(r))); + } + if (rule.run && result.success) { + rule.run({ matches }); + } + return result; + } +} +Parser.DEBUG = false; + + +/***/ }), + +/***/ "./src/pedalmarking.ts": +/*!*****************************!*\ + !*** ./src/pedalmarking.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "PedalMarking": () => (/* binding */ PedalMarking) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + + +// eslint-disable-next-line +function L(...args) { + if (PedalMarking.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_5__.log)('Vex.Flow.PedalMarking', args); +} +/** + * Draws a pedal glyph with the provided `name` on a rendering `context` + * at the coordinates `x` and `y. Takes into account the glyph data + * coordinate shifts. + */ +function drawPedalGlyph(name, context, x, y, point) { + const glyph_data = PedalMarking.GLYPHS[name]; + const glyph = new _glyph__WEBPACK_IMPORTED_MODULE_2__.Glyph(glyph_data.code, point, { category: 'pedalMarking' }); + glyph.render(context, x + glyph_data.x_shift, y + glyph_data.y_shift); +} +/** + * PedalMarking implements different types of pedal markings. These notation + * elements indicate to the performer when to depress and release the a pedal. + * + * In order to create "Sostenuto", and "una corda" markings, you must set + * custom text for the release/depress pedal markings. + */ +class PedalMarking extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + constructor(notes) { + super(); + this.notes = notes; + this.type = PedalMarking.type.TEXT; + this.line = 0; + // Custom text for the release/depress markings + this.custom_depress_text = ''; + this.custom_release_text = ''; + this.resetFont(); + this.render_options = { + bracket_height: 10, + text_margin_right: 6, + bracket_line_width: 1, + color: 'black', + }; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_4__.Category.PedalMarking; + } + /** + * Create a sustain pedal marking. Returns the defaults PedalMarking. + * Which uses the traditional "Ped" and "*"" markings. + */ + static createSustain(notes) { + const pedal = new PedalMarking(notes); + return pedal; + } + /** Create a sostenuto pedal marking */ + static createSostenuto(notes) { + const pedal = new PedalMarking(notes); + pedal.setType(PedalMarking.type.MIXED); + pedal.setCustomText('Sost. Ped.'); + return pedal; + } + /** Create an una corda pedal marking */ + static createUnaCorda(notes) { + const pedal = new PedalMarking(notes); + pedal.setType(PedalMarking.type.TEXT); + pedal.setCustomText('una corda', 'tre corda'); + return pedal; + } + /** Set pedal type. */ + setType(type) { + type = typeof type === 'string' ? PedalMarking.typeString[type] : type; + if (type >= PedalMarking.type.TEXT && type <= PedalMarking.type.MIXED) { + this.type = type; + } + return this; + } + /** + * Set custom text for the `depress`/`release` pedal markings. No text is + * set if the parameter is falsy. + */ + setCustomText(depress, release) { + this.custom_depress_text = depress || ''; + this.custom_release_text = release || ''; + return this; + } + /** Set the staff line to render the markings on. */ + setLine(line) { + this.line = line; + return this; + } + /** Draw the bracket based pedal markings. */ + drawBracketed() { + const ctx = this.checkContext(); + let is_pedal_depressed = false; + let prev_x; + let prev_y; + // Iterate through each note + this.notes.forEach((note, index, notes) => { + // Each note triggers the opposite pedal action + is_pedal_depressed = !is_pedal_depressed; + // Get the initial coordinates for the note + const x = note.getAbsoluteX(); + const y = note.checkStave().getYForBottomText(this.line + 3); + // Throw if current note is positioned before the previous note + if (x < prev_x) { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('InvalidConfiguration', 'The notes provided must be in order of ascending x positions'); + } + // Determine if the previous or next note are the same + // as the current note. We need to keep track of this for + // when adjustments are made for the release+depress action + const next_is_same = notes[index + 1] === note; + const prev_is_same = notes[index - 1] === note; + let x_shift = 0; + const point = _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().lookupMetric(`pedalMarking.${is_pedal_depressed ? 'down' : 'up'}.point`); + if (is_pedal_depressed) { + // Adjustment for release+depress + x_shift = prev_is_same ? 5 : 0; + if (this.type === PedalMarking.type.MIXED && !prev_is_same) { + // For MIXED style, start with text instead of bracket + if (this.custom_depress_text) { + // If we have custom text, use instead of the default "Ped" glyph + const text_width = ctx.measureText(this.custom_depress_text).width; + ctx.fillText(this.custom_depress_text, x - text_width / 2, y); + x_shift = text_width / 2 + this.render_options.text_margin_right; + } + else { + // Render the Ped glyph in position + drawPedalGlyph('pedal_depress', ctx, x, y, point); + x_shift = 20 + this.render_options.text_margin_right; + } + } + else { + // Draw start bracket + ctx.beginPath(); + ctx.moveTo(x, y - this.render_options.bracket_height); + ctx.lineTo(x + x_shift, y); + ctx.stroke(); + ctx.closePath(); + } + } + else { + // Adjustment for release+depress + x_shift = next_is_same ? -5 : 0; + // Draw end bracket + ctx.beginPath(); + ctx.moveTo(prev_x, prev_y); + ctx.lineTo(x + x_shift, y); + ctx.lineTo(x, y - this.render_options.bracket_height); + ctx.stroke(); + ctx.closePath(); + } + // Store previous coordinates + prev_x = x + x_shift; + prev_y = y; + }); + } + /** + * Draw the text based pedal markings. This defaults to the traditional + * "Ped" and "*"" symbols if no custom text has been provided. + */ + drawText() { + const ctx = this.checkContext(); + let is_pedal_depressed = false; + // Iterate through each note, placing glyphs or custom text accordingly + this.notes.forEach((note) => { + is_pedal_depressed = !is_pedal_depressed; + const stave = note.checkStave(); + const x = note.getAbsoluteX(); + const y = stave.getYForBottomText(this.line + 3); + const point = _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().lookupMetric(`pedalMarking.${is_pedal_depressed ? 'down' : 'up'}.point`); + let text_width = 0; + if (is_pedal_depressed) { + if (this.custom_depress_text) { + text_width = ctx.measureText(this.custom_depress_text).width; + ctx.fillText(this.custom_depress_text, x - text_width / 2, y); + } + else { + drawPedalGlyph('pedal_depress', ctx, x, y, point); + } + } + else { + if (this.custom_release_text) { + text_width = ctx.measureText(this.custom_release_text).width; + ctx.fillText(this.custom_release_text, x - text_width / 2, y); + } + else { + drawPedalGlyph('pedal_release', ctx, x, y, point); + } + } + }); + } + /** Render the pedal marking in position on the rendering context. */ + draw() { + const ctx = this.checkContext(); + this.setRendered(); + ctx.save(); + ctx.setStrokeStyle(this.render_options.color); + ctx.setFillStyle(this.render_options.color); + ctx.setFont(this.textFont); + L('Rendering Pedal Marking'); + if (this.type === PedalMarking.type.BRACKET || this.type === PedalMarking.type.MIXED) { + ctx.setLineWidth(this.render_options.bracket_line_width); + this.drawBracketed(); + } + else if (this.type === PedalMarking.type.TEXT) { + this.drawText(); + } + ctx.restore(); + } +} +/** To enable logging for this class. Set `Vex.Flow.PedalMarking.DEBUG` to `true`. */ +PedalMarking.DEBUG = false; +PedalMarking.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_1__.Font.SERIF, + size: 12, + weight: _font__WEBPACK_IMPORTED_MODULE_1__.FontWeight.BOLD, + style: _font__WEBPACK_IMPORTED_MODULE_1__.FontStyle.ITALIC, +}; +/** Glyph data */ +PedalMarking.GLYPHS = { + pedal_depress: { + code: 'keyboardPedalPed', + x_shift: -10, + y_shift: 0, + }, + pedal_release: { + code: 'keyboardPedalUp', + x_shift: -2, + y_shift: 3, + }, +}; +/** Pedal type as number. */ +PedalMarking.type = { + TEXT: 1, + BRACKET: 2, + MIXED: 3, +}; +/** Pedal type as string. */ +PedalMarking.typeString = { + text: PedalMarking.type.TEXT, + bracket: PedalMarking.type.BRACKET, + mixed: PedalMarking.type.MIXED, +}; + + +/***/ }), + +/***/ "./src/registry.ts": +/*!*************************!*\ + !*** ./src/registry.ts ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Registry": () => (/* binding */ Registry) +/* harmony export */ }); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// @author Mohit Cheppudira +// +// ## Description +// +// This file implements a registry for VexFlow elements. It allows users +// to track, query, and manage some subset of generated elements, and +// dynamically get and set attributes. +// +// There are two ways to register with a registry: +// +// 1) Explicitly call `registry.register(elem:Element, id?:string)`, or, +// 2) Call `Registry.enableDefaultRegistry(registry)` when ready, and all future +// elements will automatically register with it. +// +// Once an element is registered, selected attributes are tracked and indexed by +// the registry. This allows fast look up of elements by attributes like id, type, +// and class. + +// Indexes are represented as maps of maps of maps. This allows +// for both multi-labeling (e.g., an element can have multiple classes) +// and efficient lookup. +class Index { + constructor() { + this.id = {}; + this.type = {}; + this.class = {}; + } +} +class Registry { + constructor() { + this.index = new Index(); + } + static getDefaultRegistry() { + return Registry.defaultRegistry; + } + // If you call `enableDefaultRegistry`, any new elements will auto-register with + // the provided registry as soon as they're constructed. + static enableDefaultRegistry(registry) { + Registry.defaultRegistry = registry; + } + static disableDefaultRegistry() { + Registry.defaultRegistry = undefined; + } + clear() { + this.index = new Index(); + return this; + } + setIndexValue(name, value, id, elem) { + const index = this.index; + if (!index[name][value]) { + index[name][value] = {}; + } + index[name][value][id] = elem; + } + // Updates the indexes for element 'id'. If an element's attribute changes + // from A -> B, make sure to remove the element from A. + updateIndex({ id, name, value, oldValue }) { + const elem = this.getElementById(id); + if (oldValue !== undefined && this.index[name][oldValue]) { + delete this.index[name][oldValue][id]; + } + if (value && elem) { + this.setIndexValue(name, value, elem.getAttribute('id'), elem); + } + } + /** + * Register element `elem` with this registry. + * This adds the element to its index and watches it for attribute changes. + * @param elem + * @param id + * @returns this + */ + register(elem, id) { + id = id || elem.getAttribute('id'); + if (!id) { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError("Can't add element without `id` attribute to registry"); + } + // Manually add id to index, then update other indexes. + elem.setAttribute('id', id); + this.setIndexValue('id', id, id, elem); + this.updateIndex({ id, name: 'type', value: elem.getAttribute('type'), oldValue: undefined }); + elem.onRegister(this); + return this; + } + getElementById(id) { + var _a, _b; + return (_b = (_a = this.index.id) === null || _a === void 0 ? void 0 : _a[id]) === null || _b === void 0 ? void 0 : _b[id]; // return undefined if the id is not found. + } + getElementsByAttribute(attribute, value) { + const index_attr = this.index[attribute]; + if (index_attr) { + const index_attr_val = index_attr[value]; + if (index_attr_val) { + const keys = Object.keys(index_attr_val); + return keys.map((k) => index_attr_val[k]); + } + } + return []; + } + getElementsByType(type) { + return this.getElementsByAttribute('type', type); + } + getElementsByClass(className) { + return this.getElementsByAttribute('class', className); + } + // This is called by the element when an attribute value changes. If an indexed + // attribute changes, then update the local index. + onUpdate(info) { + const allowedNames = ['id', 'type', 'class']; + if (allowedNames.includes(info.name)) { + this.updateIndex(info); + } + return this; + } +} + + +/***/ }), + +/***/ "./src/rendercontext.ts": +/*!******************************!*\ + !*** ./src/rendercontext.ts ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "RenderContext": () => (/* binding */ RenderContext), +/* harmony export */ "drawDot": () => (/* binding */ drawDot) +/* harmony export */ }); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2021. +// MIT License + +class RenderContext { + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_0__.Category.RenderContext; + } + set font(f) { + this.setFont(f); + } + get font() { + return this.getFont(); + } + /** + * This is kept for backwards compatibility with 3.0.9. + * @deprecated use `setFont(...)` instead since it now supports CSS font shorthand. + */ + setRawFont(f) { + this.setFont(f); + return this; + } +} +/** + * Draw a tiny dot marker on the specified context. A great debugging aid. + * @param ctx context + * @param x dot x coordinate + * @param y dot y coordinate + * @param color + */ +function drawDot(ctx, x, y, color = '#F55') { + ctx.save(); + ctx.setFillStyle(color); + // draw a circle + ctx.beginPath(); + ctx.arc(x, y, 3, 0, Math.PI * 2, true); + ctx.closePath(); + ctx.fill(); + ctx.restore(); +} + + +/***/ }), + +/***/ "./src/renderer.ts": +/*!*************************!*\ + !*** ./src/renderer.ts ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "RendererBackends": () => (/* binding */ RendererBackends), +/* harmony export */ "RendererLineEndType": () => (/* binding */ RendererLineEndType), +/* harmony export */ "Renderer": () => (/* binding */ Renderer) +/* harmony export */ }); +/* harmony import */ var _canvascontext__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./canvascontext */ "./src/canvascontext.ts"); +/* harmony import */ var _svgcontext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./svgcontext */ "./src/svgcontext.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +/* harmony import */ var _web__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./web */ "./src/web.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + +var RendererBackends; +(function (RendererBackends) { + RendererBackends[RendererBackends["CANVAS"] = 1] = "CANVAS"; + RendererBackends[RendererBackends["SVG"] = 2] = "SVG"; +})(RendererBackends || (RendererBackends = {})); +// End of line types +var RendererLineEndType; +(function (RendererLineEndType) { + RendererLineEndType[RendererLineEndType["NONE"] = 1] = "NONE"; + RendererLineEndType[RendererLineEndType["UP"] = 2] = "UP"; + RendererLineEndType[RendererLineEndType["DOWN"] = 3] = "DOWN"; +})(RendererLineEndType || (RendererLineEndType = {})); +/** + * Support Canvas & SVG rendering contexts. + */ +class Renderer { + constructor(arg0, arg1) { + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_2__.isRenderContext)(arg0)) { + // The user has provided what looks like a RenderContext, let's just use it. + this.ctx = arg0; + } + else { + if (arg1 === undefined) { + // The backend must be specified if the render context isn't directly provided. + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('InvalidArgument', 'Missing backend argument'); + } + const backend = arg1; + let element; + if (typeof arg0 == 'string') { + const maybeElement = document.getElementById(arg0); + if (!maybeElement) { + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('BadElementId', `Can't find element with ID "${maybeElement}"`); + } + element = maybeElement; + } + else { + element = arg0; + } + // Verify backend and create context + if (backend === Renderer.Backends.CANVAS) { + if (!(0,_web__WEBPACK_IMPORTED_MODULE_4__.isHTMLCanvas)(element)) { + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('BadElement', 'CANVAS context requires an HTMLCanvasElement.'); + } + const context = element.getContext('2d'); + if (!context) { + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('BadElement', "Can't get canvas context"); + } + this.ctx = new _canvascontext__WEBPACK_IMPORTED_MODULE_0__.CanvasContext(context); + } + else if (backend === Renderer.Backends.SVG) { + if (!(0,_web__WEBPACK_IMPORTED_MODULE_4__.isHTMLDiv)(element)) { + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('BadElement', 'SVG context requires an HTMLDivElement.'); + } + this.ctx = new _svgcontext__WEBPACK_IMPORTED_MODULE_1__.SVGContext(element); + } + else { + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('InvalidBackend', `No support for backend: ${backend}`); + } + } + } + static buildContext(elementId, backend, width, height, background = '#FFF') { + const renderer = new Renderer(elementId, backend); + if (width && height) { + renderer.resize(width, height); + } + const ctx = renderer.getContext(); + ctx.setBackgroundFillStyle(background); + Renderer.lastContext = ctx; + return ctx; + } + static getCanvasContext(elementId, width, height, background) { + return Renderer.buildContext(elementId, Renderer.Backends.CANVAS, width, height, background); + } + static getSVGContext(elementId, width, height, background) { + return Renderer.buildContext(elementId, Renderer.Backends.SVG, width, height, background); + } + // Draw a dashed line (horizontal, vertical or diagonal + // dashPattern = [3,3] draws a 3 pixel dash followed by a three pixel space. + // setting the second number to 0 draws a solid line. + static drawDashedLine(context, fromX, fromY, toX, toY, dashPattern) { + context.beginPath(); + const dx = toX - fromX; + const dy = toY - fromY; + const angle = Math.atan2(dy, dx); + let x = fromX; + let y = fromY; + context.moveTo(fromX, fromY); + let idx = 0; + let draw = true; + while (!((dx < 0 ? x <= toX : x >= toX) && (dy < 0 ? y <= toY : y >= toY))) { + const dashLength = dashPattern[idx++ % dashPattern.length]; + const nx = x + Math.cos(angle) * dashLength; + x = dx < 0 ? Math.max(toX, nx) : Math.min(toX, nx); + const ny = y + Math.sin(angle) * dashLength; + y = dy < 0 ? Math.max(toY, ny) : Math.min(toY, ny); + if (draw) { + context.lineTo(x, y); + } + else { + context.moveTo(x, y); + } + draw = !draw; + } + context.closePath(); + context.stroke(); + } + resize(width, height) { + this.ctx.resize(width, height); + return this; + } + getContext() { + return this.ctx; + } +} +Renderer.Backends = RendererBackends; +Renderer.LineEndType = RendererLineEndType; +// Used by vexflow_test_helpers.ts +// Should this be private? +// Can we do this in a cleaner way? +Renderer.lastContext = undefined; + + +/***/ }), + +/***/ "./src/repeatnote.ts": +/*!***************************!*\ + !*** ./src/repeatnote.ts ***! + \***************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "RepeatNote": () => (/* binding */ RepeatNote) +/* harmony export */ }); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _glyphnote__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./glyphnote */ "./src/glyphnote.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. + + + + +// Map `type` to SMuFL glyph code. +const CODES = { + '1': 'repeat1Bar', + '2': 'repeat2Bars', + '4': 'repeat4Bars', + slash: 'repeatBarSlash', +}; +class RepeatNote extends _glyphnote__WEBPACK_IMPORTED_MODULE_1__.GlyphNote { + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.RepeatNote; + } + constructor(type, noteStruct, options) { + super(undefined, Object.assign({ duration: 'q', align_center: type !== 'slash' }, noteStruct), options); + const glyphCode = CODES[type] || 'repeat1Bar'; + const glyph = new _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph(glyphCode, _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.currentMusicFont().lookupMetric('repeatNote.point', 40), { + category: 'repeatNote', + }); + this.setGlyph(glyph); + } +} + + +/***/ }), + +/***/ "./src/stave.ts": +/*!**********************!*\ + !*** ./src/stave.ts ***! + \**********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Stave": () => (/* binding */ Stave) +/* harmony export */ }); +/* harmony import */ var _boundingbox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./boundingbox */ "./src/boundingbox.ts"); +/* harmony import */ var _clef__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./clef */ "./src/clef.ts"); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _keysignature__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./keysignature */ "./src/keysignature.ts"); +/* harmony import */ var _stavebarline__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./stavebarline */ "./src/stavebarline.ts"); +/* harmony import */ var _stavemodifier__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./stavemodifier */ "./src/stavemodifier.ts"); +/* harmony import */ var _staverepetition__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./staverepetition */ "./src/staverepetition.ts"); +/* harmony import */ var _stavesection__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./stavesection */ "./src/stavesection.ts"); +/* harmony import */ var _stavetempo__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./stavetempo */ "./src/stavetempo.ts"); +/* harmony import */ var _stavetext__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./stavetext */ "./src/stavetext.ts"); +/* harmony import */ var _stavevolta__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./stavevolta */ "./src/stavevolta.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _timesignature__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./timesignature */ "./src/timesignature.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + + + + + + + + + + + + +// Used by Stave.format() to sort the modifiers at the beginning and end of a stave. +// The keys (computed property names) match the CATEGORY property in the +// Barline, Clef, KeySignature, TimeSignature classes. +const SORT_ORDER_BEG_MODIFIERS = { + [_stavebarline__WEBPACK_IMPORTED_MODULE_5__.Barline.CATEGORY]: 0, + [_clef__WEBPACK_IMPORTED_MODULE_1__.Clef.CATEGORY]: 1, + [_keysignature__WEBPACK_IMPORTED_MODULE_4__.KeySignature.CATEGORY]: 2, + [_timesignature__WEBPACK_IMPORTED_MODULE_13__.TimeSignature.CATEGORY]: 3, +}; +const SORT_ORDER_END_MODIFIERS = { + [_timesignature__WEBPACK_IMPORTED_MODULE_13__.TimeSignature.CATEGORY]: 0, + [_keysignature__WEBPACK_IMPORTED_MODULE_4__.KeySignature.CATEGORY]: 1, + [_stavebarline__WEBPACK_IMPORTED_MODULE_5__.Barline.CATEGORY]: 2, + [_clef__WEBPACK_IMPORTED_MODULE_1__.Clef.CATEGORY]: 3, +}; +class Stave extends _element__WEBPACK_IMPORTED_MODULE_2__.Element { + constructor(x, y, width, options) { + super(); + // Initialized by the constructor via this.resetLines(). + this.height = 0; + this.x = x; + this.y = y; + this.width = width; + this.formatted = false; + this.start_x = x + 5; + this.end_x = x + width; + this.modifiers = []; // stave modifiers (clef, key, time, barlines, coda, segno, etc.) + this.measure = 0; + this.clef = 'treble'; + this.endClef = undefined; + this.resetFont(); + this.options = Object.assign({ vertical_bar_width: 10, num_lines: 5, fill_style: '#999999', left_bar: true, right_bar: true, spacing_between_lines_px: _tables__WEBPACK_IMPORTED_MODULE_12__.Tables.STAVE_LINE_DISTANCE, space_above_staff_ln: 4, space_below_staff_ln: 4, top_text_position: 1, bottom_text_position: 4, line_config: [] }, options); + this.bounds = { x: this.x, y: this.y, w: this.width, h: 0 }; + this.defaultLedgerLineStyle = { strokeStyle: '#444', lineWidth: 1.4 }; + this.resetLines(); + // beg bar + this.addModifier(new _stavebarline__WEBPACK_IMPORTED_MODULE_5__.Barline(this.options.left_bar ? _stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.SINGLE : _stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.NONE)); + // end bar + this.addEndModifier(new _stavebarline__WEBPACK_IMPORTED_MODULE_5__.Barline(this.options.right_bar ? _stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.SINGLE : _stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.NONE)); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.Stave; + } + // This is the sum of the padding that normally goes on left + right of a stave during + // drawing. Used to size staves correctly with content width. + static get defaultPadding() { + const musicFont = _tables__WEBPACK_IMPORTED_MODULE_12__.Tables.currentMusicFont(); + return musicFont.lookupMetric('stave.padding') + musicFont.lookupMetric('stave.endPaddingMax'); + } + // Right padding, used by system if startX is already determined. + static get rightPadding() { + const musicFont = _tables__WEBPACK_IMPORTED_MODULE_12__.Tables.currentMusicFont(); + return musicFont.lookupMetric('stave.endPaddingMax'); + } + /** Set default style for ledger lines. */ + setDefaultLedgerLineStyle(style) { + this.defaultLedgerLineStyle = style; + } + /** Get default style for ledger lines. */ + getDefaultLedgerLineStyle() { + return Object.assign(Object.assign({}, this.getStyle()), this.defaultLedgerLineStyle); + } + space(spacing) { + return this.options.spacing_between_lines_px * spacing; + } + resetLines() { + this.options.line_config = []; + for (let i = 0; i < this.options.num_lines; i++) { + this.options.line_config.push({ visible: true }); + } + this.height = (this.options.num_lines + this.options.space_above_staff_ln) * this.options.spacing_between_lines_px; + this.options.bottom_text_position = this.options.num_lines; + } + setNoteStartX(x) { + if (!this.formatted) + this.format(); + this.start_x = x; + const begBarline = this.modifiers[0]; + begBarline.setX(this.start_x - begBarline.getWidth()); + return this; + } + getNoteStartX() { + if (!this.formatted) + this.format(); + return this.start_x; + } + getNoteEndX() { + if (!this.formatted) + this.format(); + return this.end_x; + } + getTieStartX() { + return this.start_x; + } + getTieEndX() { + return this.end_x; + } + getX() { + return this.x; + } + getNumLines() { + return this.options.num_lines; + } + setNumLines(n) { + this.options.num_lines = n; + this.resetLines(); + return this; + } + setY(y) { + this.y = y; + return this; + } + getY() { + return this.y; + } + getTopLineTopY() { + return this.getYForLine(0) - _tables__WEBPACK_IMPORTED_MODULE_12__.Tables.STAVE_LINE_THICKNESS / 2; + } + getBottomLineBottomY() { + return this.getYForLine(this.getNumLines() - 1) + _tables__WEBPACK_IMPORTED_MODULE_12__.Tables.STAVE_LINE_THICKNESS / 2; + } + setX(x) { + const shift = x - this.x; + this.formatted = false; + this.x = x; + this.start_x += shift; + this.end_x += shift; + for (let i = 0; i < this.modifiers.length; i++) { + const mod = this.modifiers[i]; + mod.setX(mod.getX() + shift); + } + return this; + } + setWidth(width) { + this.formatted = false; + this.width = width; + this.end_x = this.x + width; + // reset the x position of the end barline (TODO(0xfe): This makes no sense) + // this.modifiers[1].setX(this.end_x); + return this; + } + getWidth() { + return this.width; + } + getStyle() { + return Object.assign({ fillStyle: this.options.fill_style, strokeStyle: this.options.fill_style, lineWidth: _tables__WEBPACK_IMPORTED_MODULE_12__.Tables.STAVE_LINE_THICKNESS }, this.style); + } + setMeasure(measure) { + this.measure = measure; + return this; + } + /** + * Gets the pixels to shift from the beginning of the stave + * following the modifier at the provided index + * @param {Number} index The index from which to determine the shift + * @return {Number} The amount of pixels shifted + */ + getModifierXShift(index = 0) { + if (typeof index !== 'number') { + throw new _util__WEBPACK_IMPORTED_MODULE_15__.RuntimeError('InvalidIndex', 'Must be of number type'); + } + if (!this.formatted) + this.format(); + if (this.getModifiers(_stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.BEGIN).length === 1) { + return 0; + } + // for right position modifiers zero shift seems correct, see 'Volta + Modifier Measure Test' + if (this.modifiers[index].getPosition() === _stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.RIGHT) { + return 0; + } + let start_x = this.start_x - this.x; + const begBarline = this.modifiers[0]; + if (begBarline.getType() === _stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.REPEAT_BEGIN && start_x > begBarline.getWidth()) { + start_x -= begBarline.getWidth(); + } + return start_x; + } + /** Coda & Segno Symbol functions */ + setRepetitionType(type, yShift = 0) { + this.modifiers.push(new _staverepetition__WEBPACK_IMPORTED_MODULE_7__.Repetition(type, this.x, yShift)); + return this; + } + // Volta functions + setVoltaType(type, number_t, y) { + this.modifiers.push(new _stavevolta__WEBPACK_IMPORTED_MODULE_11__.Volta(type, number_t, this.x, y)); + return this; + } + // Section functions + setSection(section, y, xOffset = 0, fontSize) { + const staveSection = new _stavesection__WEBPACK_IMPORTED_MODULE_8__.StaveSection(section, this.x + xOffset, y); + if (fontSize) + staveSection.setFontSize(fontSize); + this.modifiers.push(staveSection); + return this; + } + // Tempo functions + setTempo(tempo, y) { + this.modifiers.push(new _stavetempo__WEBPACK_IMPORTED_MODULE_9__.StaveTempo(tempo, this.x, y)); + return this; + } + // Text functions + setText(text, position, options = {}) { + this.modifiers.push(new _stavetext__WEBPACK_IMPORTED_MODULE_10__.StaveText(text, position, options)); + return this; + } + getHeight() { + return this.height; + } + getSpacingBetweenLines() { + return this.options.spacing_between_lines_px; + } + getBoundingBox() { + return new _boundingbox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox(this.x, this.y, this.width, this.getBottomY() - this.y); + } + getBottomY() { + const options = this.options; + const spacing = options.spacing_between_lines_px; + const score_bottom = this.getYForLine(options.num_lines) + options.space_below_staff_ln * spacing; + return score_bottom; + } + getBottomLineY() { + return this.getYForLine(this.options.num_lines); + } + // This returns + /** @returns the y for the *center* of a staff line */ + getYForLine(line) { + const options = this.options; + const spacing = options.spacing_between_lines_px; + const headroom = options.space_above_staff_ln; + const y = this.y + line * spacing + headroom * spacing; + return y; + } + getLineForY(y) { + // Does the reverse of getYForLine - somewhat dumb and just calls + // getYForLine until the right value is reaches + const options = this.options; + const spacing = options.spacing_between_lines_px; + const headroom = options.space_above_staff_ln; + return (y - this.y) / spacing - headroom; + } + getYForTopText(line = 0) { + return this.getYForLine(-line - this.options.top_text_position); + } + getYForBottomText(line = 0) { + return this.getYForLine(this.options.bottom_text_position + line); + } + getYForNote(line) { + const options = this.options; + const spacing = options.spacing_between_lines_px; + const headroom = options.space_above_staff_ln; + return this.y + headroom * spacing + 5 * spacing - line * spacing; + } + getYForGlyphs() { + return this.getYForLine(3); + } + // This method adds a stave modifier to the stave. Note that the first two + // modifiers (BarLines) are automatically added upon construction. + addModifier(modifier, position) { + if (position !== undefined) { + modifier.setPosition(position); + } + modifier.setStave(this); + this.formatted = false; + this.modifiers.push(modifier); + return this; + } + addEndModifier(modifier) { + this.addModifier(modifier, _stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.END); + return this; + } + // Bar Line functions + setBegBarType(type) { + // Only valid bar types at beginning of stave is none, single or begin repeat + const { SINGLE, REPEAT_BEGIN, NONE } = _stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType; + if (type === SINGLE || type === REPEAT_BEGIN || type === NONE) { + this.modifiers[0].setType(type); + this.formatted = false; + } + return this; + } + setEndBarType(type) { + // Repeat end not valid at end of stave + if (type !== _stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.REPEAT_BEGIN) { + this.modifiers[1].setType(type); + this.formatted = false; + } + return this; + } + setClef(clefSpec, size, annotation, position) { + if (position === undefined) { + position = _stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.BEGIN; + } + if (position === _stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.END) { + this.endClef = clefSpec; + } + else { + this.clef = clefSpec; + } + const clefs = this.getModifiers(position, _clef__WEBPACK_IMPORTED_MODULE_1__.Clef.CATEGORY); + if (clefs.length === 0) { + this.addClef(clefSpec, size, annotation, position); + } + else { + clefs[0].setType(clefSpec, size, annotation); + } + return this; + } + getClef() { + return this.clef; + } + setEndClef(clefSpec, size, annotation) { + this.setClef(clefSpec, size, annotation, _stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.END); + return this; + } + getEndClef() { + return this.endClef; + } + setKeySignature(keySpec, cancelKeySpec, position) { + if (position === undefined) { + position = _stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.BEGIN; + } + const keySignatures = this.getModifiers(position, _keysignature__WEBPACK_IMPORTED_MODULE_4__.KeySignature.CATEGORY); + if (keySignatures.length === 0) { + this.addKeySignature(keySpec, cancelKeySpec, position); + } + else { + keySignatures[0].setKeySig(keySpec, cancelKeySpec); + } + return this; + } + setEndKeySignature(keySpec, cancelKeySpec) { + this.setKeySignature(keySpec, cancelKeySpec, _stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.END); + return this; + } + setTimeSignature(timeSpec, customPadding, position) { + if (position === undefined) { + position = _stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.BEGIN; + } + const timeSignatures = this.getModifiers(position, _timesignature__WEBPACK_IMPORTED_MODULE_13__.TimeSignature.CATEGORY); + if (timeSignatures.length === 0) { + this.addTimeSignature(timeSpec, customPadding, position); + } + else { + timeSignatures[0].setTimeSig(timeSpec); + } + return this; + } + setEndTimeSignature(timeSpec, customPadding) { + this.setTimeSignature(timeSpec, customPadding, _stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.END); + return this; + } + /** + * Add a key signature to the stave. + * + * Example: + * `stave.addKeySignature('Db');` + * @param keySpec new key specification `[A-G][b|#]?` + * @param cancelKeySpec + * @param position + * @returns + */ + addKeySignature(keySpec, cancelKeySpec, position) { + if (position === undefined) { + position = _stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.BEGIN; + } + this.addModifier(new _keysignature__WEBPACK_IMPORTED_MODULE_4__.KeySignature(keySpec, cancelKeySpec).setPosition(position), position); + return this; + } + /** + * Add a clef to the stave. + * + * Example: + * + * stave.addClef('treble') + * @param clef clef (treble|bass|...) see {@link Clef.types} + * @param size + * @param annotation + * @param position + * @returns + */ + addClef(clef, size, annotation, position) { + if (position === undefined || position === _stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.BEGIN) { + this.clef = clef; + } + else if (position === _stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.END) { + this.endClef = clef; + } + this.addModifier(new _clef__WEBPACK_IMPORTED_MODULE_1__.Clef(clef, size, annotation), position); + return this; + } + addEndClef(clef, size, annotation) { + this.addClef(clef, size, annotation, _stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.END); + return this; + } + /** + * Add a time signature to the stave + * + * Example: + * + * `stave.addTimeSignature('4/4');` + * @param timeSpec time signature specification `(C\||C|\d\/\d)` + * @param customPadding + * @param position + * @returns + */ + addTimeSignature(timeSpec, customPadding, position) { + this.addModifier(new _timesignature__WEBPACK_IMPORTED_MODULE_13__.TimeSignature(timeSpec, customPadding), position); + return this; + } + addEndTimeSignature(timeSpec, customPadding) { + this.addTimeSignature(timeSpec, customPadding, _stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.END); + return this; + } + // Deprecated + addTrebleGlyph() { + this.addClef('treble'); + return this; + } + /** + * @param position + * @param category + * @returns array of StaveModifiers that match the provided position and category. + */ + getModifiers(position, category) { + const noPosition = position === undefined; + const noCategory = category === undefined; + if (noPosition && noCategory) { + return this.modifiers; + } + else if (noPosition) { + // A category was provided. + return this.modifiers.filter((m) => category === m.getCategory()); + } + else if (noCategory) { + // A position was provided. + return this.modifiers.filter((m) => position === m.getPosition()); + } + else { + // Both position and category were provided! + return this.modifiers.filter((m) => position === m.getPosition() && category === m.getCategory()); + } + } + /** + * Use the modifier's `getCategory()` as a key for the `order` array. + * The retrieved value is used to sort modifiers from left to right (0 to to 3). + */ + sortByCategory(items, order) { + for (let i = items.length - 1; i >= 0; i--) { + for (let j = 0; j < i; j++) { + if (order[items[j].getCategory()] > order[items[j + 1].getCategory()]) { + const temp = items[j]; + items[j] = items[j + 1]; + items[j + 1] = temp; + } + } + } + } + format() { + const begBarline = this.modifiers[0]; + const endBarline = this.modifiers[1]; + const begModifiers = this.getModifiers(_stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.BEGIN); + const endModifiers = this.getModifiers(_stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.END); + this.sortByCategory(begModifiers, SORT_ORDER_BEG_MODIFIERS); + this.sortByCategory(endModifiers, SORT_ORDER_END_MODIFIERS); + if (begModifiers.length > 1 && begBarline.getType() === _stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.REPEAT_BEGIN) { + begModifiers.push(begModifiers.splice(0, 1)[0]); + begModifiers.splice(0, 0, new _stavebarline__WEBPACK_IMPORTED_MODULE_5__.Barline(_stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.SINGLE)); + } + if (endModifiers.indexOf(endBarline) > 0) { + endModifiers.splice(0, 0, new _stavebarline__WEBPACK_IMPORTED_MODULE_5__.Barline(_stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.NONE)); + } + let width; + let padding; + let modifier; + let offset = 0; + let x = this.x; + for (let i = 0; i < begModifiers.length; i++) { + modifier = begModifiers[i]; + padding = modifier.getPadding(i + offset); + width = modifier.getWidth(); + x += padding; + modifier.setX(x); + x += width; + if (padding + width === 0) + offset--; + } + this.start_x = x; + x = this.x + this.width; + const widths = { + left: 0, + right: 0, + paddingRight: 0, + paddingLeft: 0, + }; + let lastBarlineIdx = 0; + for (let i = 0; i < endModifiers.length; i++) { + modifier = endModifiers[i]; + lastBarlineIdx = (0,_typeguard__WEBPACK_IMPORTED_MODULE_14__.isBarline)(modifier) ? i : lastBarlineIdx; + widths.right = 0; + widths.left = 0; + widths.paddingRight = 0; + widths.paddingLeft = 0; + const layoutMetrics = modifier.getLayoutMetrics(); + if (layoutMetrics) { + if (i !== 0) { + widths.right = layoutMetrics.xMax || 0; + widths.paddingRight = layoutMetrics.paddingRight || 0; + } + widths.left = -layoutMetrics.xMin || 0; + widths.paddingLeft = layoutMetrics.paddingLeft || 0; + if (i === endModifiers.length - 1) { + widths.paddingLeft = 0; + } + } + else { + widths.paddingRight = modifier.getPadding(i - lastBarlineIdx); + if (i !== 0) { + widths.right = modifier.getWidth(); + } + if (i === 0) { + widths.left = modifier.getWidth(); + } + } + x -= widths.paddingRight; + x -= widths.right; + modifier.setX(x); + x -= widths.left; + x -= widths.paddingLeft; + } + this.end_x = endModifiers.length === 1 ? this.x + this.width : x; + this.formatted = true; + } + /** + * All drawing functions below need the context to be set. + */ + draw() { + const ctx = this.checkContext(); + this.setRendered(); + ctx.openGroup('stave', this.getAttribute('id')); + if (!this.formatted) + this.format(); + const num_lines = this.options.num_lines; + const width = this.width; + const x = this.x; + let y; + // Render lines + for (let line = 0; line < num_lines; line++) { + y = this.getYForLine(line); + this.applyStyle(); + if (this.options.line_config[line].visible) { + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.lineTo(x + width, y); + ctx.stroke(); + } + this.restoreStyle(); + } + // Draw the modifiers (bar lines, coda, segno, repeat brackets, etc.) + for (let i = 0; i < this.modifiers.length; i++) { + const modifier = this.modifiers[i]; + // Only draw modifier if it has a draw function + if (typeof modifier.draw === 'function') { + modifier.applyStyle(ctx); + modifier.draw(this, this.getModifierXShift(i)); + modifier.restoreStyle(ctx); + } + } + // Render measure numbers + if (this.measure > 0) { + ctx.save(); + ctx.setFont(this.textFont); + const textWidth = ctx.measureText('' + this.measure).width; + y = this.getYForTopText(0) + 3; + ctx.fillText('' + this.measure, this.x - textWidth / 2, y); + ctx.restore(); + } + ctx.closeGroup(); + return this; + } + getVerticalBarWidth() { + return this.options.vertical_bar_width; + } + /** + * Get the current configuration for the Stave. + * @return {Array} An array of configuration objects. + */ + getConfigForLines() { + return this.options.line_config; + } + /** + * Configure properties of the lines in the Stave + * @param line_number The index of the line to configure. + * @param line_config An configuration object for the specified line. + * @throws RuntimeError "StaveConfigError" When the specified line number is out of + * range of the number of lines specified in the constructor. + */ + setConfigForLine(line_number, line_config) { + if (line_number >= this.options.num_lines || line_number < 0) { + throw new _util__WEBPACK_IMPORTED_MODULE_15__.RuntimeError('StaveConfigError', 'The line number must be within the range of the number of lines in the Stave.'); + } + if (line_config.visible === undefined) { + throw new _util__WEBPACK_IMPORTED_MODULE_15__.RuntimeError('StaveConfigError', "The line configuration object is missing the 'visible' property."); + } + if (typeof line_config.visible !== 'boolean') { + throw new _util__WEBPACK_IMPORTED_MODULE_15__.RuntimeError('StaveConfigError', "The line configuration objects 'visible' property must be true or false."); + } + this.options.line_config[line_number] = line_config; + return this; + } + /** + * Set the staff line configuration array for all of the lines at once. + * @param lines_configuration An array of line configuration objects. These objects + * are of the same format as the single one passed in to setLineConfiguration(). + * The caller can set null for any line config entry if it is desired that the default be used + * @throws RuntimeError "StaveConfigError" When the lines_configuration array does not have + * exactly the same number of elements as the num_lines configuration object set in + * the constructor. + */ + setConfigForLines(lines_configuration) { + if (lines_configuration.length !== this.options.num_lines) { + throw new _util__WEBPACK_IMPORTED_MODULE_15__.RuntimeError('StaveConfigError', 'The length of the lines configuration array must match the number of lines in the Stave'); + } + // Make sure the defaults are present in case an incomplete set of + // configuration options were supplied. + // eslint-disable-next-line + for (const line_config in lines_configuration) { + // Allow '{}' to be used if the caller just wants the default for a particular node. + if (lines_configuration[line_config].visible == undefined) { + lines_configuration[line_config] = this.options.line_config[line_config]; + } + this.options.line_config[line_config] = Object.assign(Object.assign({}, this.options.line_config[line_config]), lines_configuration[line_config]); + } + this.options.line_config = lines_configuration; + return this; + } +} +Stave.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_3__.Font.SANS_SERIF, + size: 8, + weight: _font__WEBPACK_IMPORTED_MODULE_3__.FontWeight.NORMAL, + style: _font__WEBPACK_IMPORTED_MODULE_3__.FontStyle.NORMAL, +}; + + +/***/ }), + +/***/ "./src/stavebarline.ts": +/*!*****************************!*\ + !*** ./src/stavebarline.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "BarlineType": () => (/* binding */ BarlineType), +/* harmony export */ "Barline": () => (/* binding */ Barline) +/* harmony export */ }); +/* harmony import */ var _stavemodifier__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./stavemodifier */ "./src/stavemodifier.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// Author Larry Kuhns 2011 + + + +var BarlineType; +(function (BarlineType) { + BarlineType[BarlineType["SINGLE"] = 1] = "SINGLE"; + BarlineType[BarlineType["DOUBLE"] = 2] = "DOUBLE"; + BarlineType[BarlineType["END"] = 3] = "END"; + BarlineType[BarlineType["REPEAT_BEGIN"] = 4] = "REPEAT_BEGIN"; + BarlineType[BarlineType["REPEAT_END"] = 5] = "REPEAT_END"; + BarlineType[BarlineType["REPEAT_BOTH"] = 6] = "REPEAT_BOTH"; + BarlineType[BarlineType["NONE"] = 7] = "NONE"; +})(BarlineType || (BarlineType = {})); +class Barline extends _stavemodifier__WEBPACK_IMPORTED_MODULE_0__.StaveModifier { + constructor(type) { + super(); + this.thickness = _tables__WEBPACK_IMPORTED_MODULE_1__.Tables.STAVE_LINE_THICKNESS; + const TYPE = BarlineType; + this.widths = {}; + this.widths[TYPE.SINGLE] = 5; + this.widths[TYPE.DOUBLE] = 5; + this.widths[TYPE.END] = 5; + this.widths[TYPE.REPEAT_BEGIN] = 5; + this.widths[TYPE.REPEAT_END] = 5; + this.widths[TYPE.REPEAT_BOTH] = 5; + this.widths[TYPE.NONE] = 5; + this.paddings = {}; + this.paddings[TYPE.SINGLE] = 0; + this.paddings[TYPE.DOUBLE] = 0; + this.paddings[TYPE.END] = 0; + this.paddings[TYPE.REPEAT_BEGIN] = 15; + this.paddings[TYPE.REPEAT_END] = 15; + this.paddings[TYPE.REPEAT_BOTH] = 15; + this.paddings[TYPE.NONE] = 0; + this.layoutMetricsMap = {}; + this.layoutMetricsMap[TYPE.SINGLE] = { + xMin: 0, + xMax: 1, + paddingLeft: 5, + paddingRight: 5, + }; + this.layoutMetricsMap[TYPE.DOUBLE] = { + xMin: -3, + xMax: 1, + paddingLeft: 5, + paddingRight: 5, + }; + this.layoutMetricsMap[TYPE.END] = { + xMin: -5, + xMax: 1, + paddingLeft: 5, + paddingRight: 5, + }; + this.layoutMetricsMap[TYPE.REPEAT_END] = { + xMin: -10, + xMax: 1, + paddingLeft: 5, + paddingRight: 5, + }; + this.layoutMetricsMap[TYPE.REPEAT_BEGIN] = { + xMin: -2, + xMax: 10, + paddingLeft: 5, + paddingRight: 5, + }; + this.layoutMetricsMap[TYPE.REPEAT_BOTH] = { + xMin: -10, + xMax: 10, + paddingLeft: 5, + paddingRight: 5, + }; + this.layoutMetricsMap[TYPE.NONE] = { + xMin: 0, + xMax: 0, + paddingLeft: 5, + paddingRight: 5, + }; + this.setPosition(_stavemodifier__WEBPACK_IMPORTED_MODULE_0__.StaveModifierPosition.BEGIN); + this.setType(type); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_2__.Category.Barline; + } + static get type() { + return BarlineType; + } + static get typeString() { + return { + single: BarlineType.SINGLE, + double: BarlineType.DOUBLE, + end: BarlineType.END, + repeatBegin: BarlineType.REPEAT_BEGIN, + repeatEnd: BarlineType.REPEAT_END, + repeatBoth: BarlineType.REPEAT_BOTH, + none: BarlineType.NONE, + }; + } + getType() { + return this.type; + } + setType(type) { + this.type = typeof type === 'string' ? Barline.typeString[type] : type; + this.setWidth(this.widths[this.type]); + this.setPadding(this.paddings[this.type]); + this.setLayoutMetrics(this.layoutMetricsMap[this.type]); + return this; + } + // Draw barlines + draw(stave) { + stave.checkContext(); + this.setRendered(); + switch (this.type) { + case BarlineType.SINGLE: + this.drawVerticalBar(stave, this.x, false); + break; + case BarlineType.DOUBLE: + this.drawVerticalBar(stave, this.x, true); + break; + case BarlineType.END: + this.drawVerticalEndBar(stave, this.x); + break; + case BarlineType.REPEAT_BEGIN: + // If the barline is shifted over (in front of clef/time/key) + // Draw vertical bar at the beginning. + this.drawRepeatBar(stave, this.x, true); + if (stave.getX() !== this.x) { + this.drawVerticalBar(stave, stave.getX()); + } + break; + case BarlineType.REPEAT_END: + this.drawRepeatBar(stave, this.x, false); + break; + case BarlineType.REPEAT_BOTH: + this.drawRepeatBar(stave, this.x, false); + this.drawRepeatBar(stave, this.x, true); + break; + default: + // Default is NONE, so nothing to draw + break; + } + } + drawVerticalBar(stave, x, double_bar) { + const staveCtx = stave.checkContext(); + const topY = stave.getTopLineTopY(); + const botY = stave.getBottomLineBottomY(); + if (double_bar) { + staveCtx.fillRect(x - 3, topY, 1, botY - topY); + } + staveCtx.fillRect(x, topY, 1, botY - topY); + } + drawVerticalEndBar(stave, x) { + const staveCtx = stave.checkContext(); + const topY = stave.getTopLineTopY(); + const botY = stave.getBottomLineBottomY(); + staveCtx.fillRect(x - 5, topY, 1, botY - topY); + staveCtx.fillRect(x - 2, topY, 3, botY - topY); + } + drawRepeatBar(stave, x, begin) { + const staveCtx = stave.checkContext(); + const topY = stave.getTopLineTopY(); + const botY = stave.getBottomLineBottomY(); + let x_shift = 3; + if (!begin) { + x_shift = -5; + } + staveCtx.fillRect(x + x_shift, topY, 1, botY - topY); + staveCtx.fillRect(x - 2, topY, 3, botY - topY); + const dot_radius = 2; + // Shift dots left or right + if (begin) { + x_shift += 4; + } + else { + x_shift -= 4; + } + const dot_x = x + x_shift + dot_radius / 2; + // calculate the y offset based on number of stave lines + let y_offset = (stave.getNumLines() - 1) * stave.getSpacingBetweenLines(); + y_offset = y_offset / 2 - stave.getSpacingBetweenLines() / 2; + let dot_y = topY + y_offset + dot_radius / 2; + // draw the top repeat dot + staveCtx.beginPath(); + staveCtx.arc(dot_x, dot_y, dot_radius, 0, Math.PI * 2, false); + staveCtx.fill(); + // draw the bottom repeat dot + dot_y += stave.getSpacingBetweenLines(); + staveCtx.beginPath(); + staveCtx.arc(dot_x, dot_y, dot_radius, 0, Math.PI * 2, false); + staveCtx.fill(); + } +} + + +/***/ }), + +/***/ "./src/staveconnector.ts": +/*!*******************************!*\ + !*** ./src/staveconnector.ts ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StaveConnector": () => (/* binding */ StaveConnector) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + + +function drawBoldDoubleLine(ctx, type, topX, topY, botY) { + if (type !== StaveConnector.type.BOLD_DOUBLE_LEFT && type !== StaveConnector.type.BOLD_DOUBLE_RIGHT) { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('InvalidConnector', 'A REPEAT_BEGIN or REPEAT_END type must be provided.'); + } + let x_shift = 3; + let variableWidth = 3.5; // Width for avoiding anti-aliasing width issues + const thickLineOffset = 2; // For aesthetics + if (type === StaveConnector.type.BOLD_DOUBLE_RIGHT) { + x_shift = -5; // Flips the side of the thin line + variableWidth = 3; + } + // Thin line + ctx.fillRect(topX + x_shift, topY, 1, botY - topY); + // Thick line + ctx.fillRect(topX - thickLineOffset, topY, variableWidth, botY - topY); +} +/** StaveConnector implements the connector lines between staves of a system. */ +class StaveConnector extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + constructor(top_stave, bottom_stave) { + super(); + this.thickness = _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.STAVE_LINE_THICKNESS; + this.width = 3; + this.top_stave = top_stave; + this.bottom_stave = bottom_stave; + this.type = StaveConnector.type.DOUBLE; + this.resetFont(); + // 1. Offset Bold Double Left to align with offset Repeat Begin bars + // 2. Offset BRACE type not to overlap with another StaveConnector + this.x_shift = 0; + this.texts = []; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_4__.Category.StaveConnector; + } + /** + * Set type. + * @param type see {@link StaveConnector.type} & {@link StaveConnector.typeString} + */ + setType(type) { + type = typeof type === 'string' ? StaveConnector.typeString[type] : type; + if (type >= StaveConnector.type.SINGLE_RIGHT && type <= StaveConnector.type.NONE) { + this.type = type; + } + return this; + } + /** Set optional associated Text. */ + setText(text, options = {}) { + this.texts.push({ + content: text, + options: Object.assign({ shift_x: 0, shift_y: 0 }, options), + }); + return this; + } + setXShift(x_shift) { + if (typeof x_shift !== 'number') { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('InvalidType', 'x_shift must be a Number'); + } + this.x_shift = x_shift; + return this; + } + getXShift() { + return this.x_shift; + } + /** Render connector and associated text. */ + draw() { + const ctx = this.checkContext(); + this.setRendered(); + let topY = this.top_stave.getYForLine(0); + let botY = this.bottom_stave.getYForLine(this.bottom_stave.getNumLines() - 1) + this.thickness; + let width = this.width; + let topX = this.top_stave.getX(); + const isRightSidedConnector = this.type === StaveConnector.type.SINGLE_RIGHT || + this.type === StaveConnector.type.BOLD_DOUBLE_RIGHT || + this.type === StaveConnector.type.THIN_DOUBLE; + if (isRightSidedConnector) { + topX = this.top_stave.getX() + this.top_stave.getWidth(); + } + let attachment_height = botY - topY; + switch (this.type) { + case StaveConnector.type.SINGLE: + width = 1; + break; + case StaveConnector.type.SINGLE_LEFT: + width = 1; + break; + case StaveConnector.type.SINGLE_RIGHT: + width = 1; + break; + case StaveConnector.type.DOUBLE: + topX -= this.width + 2; + topY -= this.thickness; + attachment_height += 0.5; + break; + case StaveConnector.type.BRACE: { + width = 12; + // May need additional code to draw brace + const x1 = this.top_stave.getX() - 2 + this.x_shift; + const y1 = topY; + const x3 = x1; + const y3 = botY; + const x2 = x1 - width; + const y2 = y1 + attachment_height / 2.0; + const cpx1 = x2 - 0.9 * width; + const cpy1 = y1 + 0.2 * attachment_height; + const cpx2 = x1 + 1.1 * width; + const cpy2 = y2 - 0.135 * attachment_height; + const cpx3 = cpx2; + const cpy3 = y2 + 0.135 * attachment_height; + const cpx4 = cpx1; + const cpy4 = y3 - 0.2 * attachment_height; + const cpx5 = x2 - width; + const cpy5 = cpy4; + const cpx6 = x1 + 0.4 * width; + const cpy6 = y2 + 0.135 * attachment_height; + const cpx7 = cpx6; + const cpy7 = y2 - 0.135 * attachment_height; + const cpx8 = cpx5; + const cpy8 = cpy1; + ctx.beginPath(); + ctx.moveTo(x1, y1); + ctx.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, x2, y2); + ctx.bezierCurveTo(cpx3, cpy3, cpx4, cpy4, x3, y3); + ctx.bezierCurveTo(cpx5, cpy5, cpx6, cpy6, x2, y2); + ctx.bezierCurveTo(cpx7, cpy7, cpx8, cpy8, x1, y1); + ctx.fill(); + ctx.stroke(); + break; + } + case StaveConnector.type.BRACKET: + topY -= 6; + botY += 6; + attachment_height = botY - topY; + _glyph__WEBPACK_IMPORTED_MODULE_2__.Glyph.renderGlyph(ctx, topX - 5, topY, 40, 'bracketTop'); + _glyph__WEBPACK_IMPORTED_MODULE_2__.Glyph.renderGlyph(ctx, topX - 5, botY, 40, 'bracketBottom'); + topX -= this.width + 2; + break; + case StaveConnector.type.BOLD_DOUBLE_LEFT: + drawBoldDoubleLine(ctx, this.type, topX + this.x_shift, topY, botY - this.thickness); + break; + case StaveConnector.type.BOLD_DOUBLE_RIGHT: + drawBoldDoubleLine(ctx, this.type, topX, topY, botY - this.thickness); + break; + case StaveConnector.type.THIN_DOUBLE: + width = 1; + attachment_height -= this.thickness; + break; + case StaveConnector.type.NONE: + break; + default: + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('InvalidType', `The provided StaveConnector.type (${this.type}) is invalid.`); + } + if (this.type !== StaveConnector.type.BRACE && + this.type !== StaveConnector.type.BOLD_DOUBLE_LEFT && + this.type !== StaveConnector.type.BOLD_DOUBLE_RIGHT && + this.type !== StaveConnector.type.NONE) { + ctx.fillRect(topX, topY, width, attachment_height); + } + // If the connector is a thin double barline, draw the paralell line + if (this.type === StaveConnector.type.THIN_DOUBLE) { + ctx.fillRect(topX - 3, topY, width, attachment_height); + } + ctx.save(); + ctx.setLineWidth(2); + ctx.setFont(this.textFont); + // Add stave connector text + for (let i = 0; i < this.texts.length; i++) { + const text = this.texts[i]; + const text_width = ctx.measureText('' + text.content).width; + const x = this.top_stave.getX() - text_width - 24 + text.options.shift_x; + const y = (this.top_stave.getYForLine(0) + this.bottom_stave.getBottomLineY()) / 2 + text.options.shift_y; + ctx.fillText('' + text.content, x, y + 4); + } + ctx.restore(); + } +} +StaveConnector.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_1__.Font.SERIF, + size: 16, + weight: _font__WEBPACK_IMPORTED_MODULE_1__.FontWeight.NORMAL, + style: _font__WEBPACK_IMPORTED_MODULE_1__.FontStyle.NORMAL, +}; +/** + * SINGLE_LEFT and SINGLE are the same value for compatibility + * with older versions of vexflow which didn't have right sided + * stave connectors. + */ +StaveConnector.type = { + SINGLE_RIGHT: 0, + SINGLE_LEFT: 1, + SINGLE: 1, + DOUBLE: 2, + BRACE: 3, + BRACKET: 4, + BOLD_DOUBLE_LEFT: 5, + BOLD_DOUBLE_RIGHT: 6, + THIN_DOUBLE: 7, + NONE: 8, +}; +/** + * Connector type: + * * "singleRight" + * * "singleLeft" + * * "single" + * * "double" + * * "brace" + * * "bracket" + * * "boldDoubleLeft" + * * "boldDoubleRight" + * * "thinDouble" + * * "none" + */ +StaveConnector.typeString = { + singleRight: StaveConnector.type.SINGLE_RIGHT, + singleLeft: StaveConnector.type.SINGLE_LEFT, + single: StaveConnector.type.SINGLE, + double: StaveConnector.type.DOUBLE, + brace: StaveConnector.type.BRACE, + bracket: StaveConnector.type.BRACKET, + boldDoubleLeft: StaveConnector.type.BOLD_DOUBLE_LEFT, + boldDoubleRight: StaveConnector.type.BOLD_DOUBLE_RIGHT, + thinDouble: StaveConnector.type.THIN_DOUBLE, + none: StaveConnector.type.NONE, +}; + + +/***/ }), + +/***/ "./src/stavehairpin.ts": +/*!*****************************!*\ + !*** ./src/stavehairpin.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StaveHairpin": () => (/* binding */ StaveHairpin) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// ## Description +// Author: Raffaele Viglianti, 2012 http://itisnotsound.wordpress.com/ +// +// This class implements hairpins between notes. +// Hairpins can be either crescendo or decrescendo. + + + + +class StaveHairpin extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + /** + * Create a new hairpin from the specified notes. + * + * @param {!Object} notes The notes to tie up. + * Notes is a struct that has: + * + * { + * first_note: Note, + * last_note: Note, + * } + * @param {!Object} type The type of hairpin + */ + constructor(notes, type) { + super(); + this.setNotes(notes); + this.hairpin = type; + this.position = _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.BELOW; + this.render_options = { + height: 10, + y_shift: 0, + left_shift_px: 0, + right_shift_px: 0, + right_shift_ticks: 0, + left_shift_ticks: 0, + }; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_2__.Category.StaveHairpin; + } + /* Helper function to convert ticks into pixels. + * Requires a Formatter with voices joined and formatted (to + * get pixels per tick) + * + * options is struct that has: + * + * { + * height: px, + * y_shift: px, // vertical offset + * left_shift_ticks: 0, // left horizontal offset expressed in ticks + * right_shift_ticks: 0 // right horizontal offset expressed in ticks + * } + * + **/ + static FormatByTicksAndDraw(ctx, formatter, notes, type, position, options) { + var _a, _b; + const ppt = formatter.pixelsPerTick; + if (ppt == null) { + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('BadArguments', 'A valid Formatter must be provide to draw offsets by ticks.'); + } + const l_shift_px = ppt * ((_a = options.left_shift_ticks) !== null && _a !== void 0 ? _a : 0); + const r_shift_px = ppt * ((_b = options.right_shift_ticks) !== null && _b !== void 0 ? _b : 0); + const hairpin_options = { + height: options.height, + y_shift: options.y_shift, + left_shift_px: l_shift_px, + right_shift_px: r_shift_px, + right_shift_ticks: 0, + left_shift_ticks: 0, + }; + new StaveHairpin({ + first_note: notes.first_note, + last_note: notes.last_note, + }, type) + .setContext(ctx) + .setRenderOptions(hairpin_options) + .setPosition(position) + .draw(); + } + setPosition(position) { + if (position === _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.ABOVE || position === _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.BELOW) { + this.position = position; + } + return this; + } + setRenderOptions(options) { + if (options.height != null && + options.y_shift != null && + options.left_shift_px != null && + options.right_shift_px != null) { + this.render_options = options; + } + return this; + } + /** + * Set the notes to attach this hairpin to. + * + * @param {!Object} notes The start and end notes. + */ + setNotes(notes) { + if (!notes.first_note && !notes.last_note) { + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('BadArguments', 'Hairpin needs to have either first_note or last_note set.'); + } + this.notes = notes; + this.first_note = notes.first_note; + this.last_note = notes.last_note; + return this; + } + renderHairpin(params) { + const ctx = this.checkContext(); + let dis = this.render_options.y_shift + 20; + let y_shift = params.first_y; + if (this.position === _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.ABOVE) { + dis = -dis + 30; + y_shift = params.first_y - params.staff_height; + } + const l_shift = this.render_options.left_shift_px; + const r_shift = this.render_options.right_shift_px; + ctx.beginPath(); + switch (this.hairpin) { + case StaveHairpin.type.CRESC: + ctx.moveTo(params.last_x + r_shift, y_shift + dis); + ctx.lineTo(params.first_x + l_shift, y_shift + this.render_options.height / 2 + dis); + ctx.lineTo(params.last_x + r_shift, y_shift + this.render_options.height + dis); + break; + case StaveHairpin.type.DECRESC: + ctx.moveTo(params.first_x + l_shift, y_shift + dis); + ctx.lineTo(params.last_x + r_shift, y_shift + this.render_options.height / 2 + dis); + ctx.lineTo(params.first_x + l_shift, y_shift + this.render_options.height + dis); + break; + default: + // Default is NONE, so nothing to draw + break; + } + ctx.stroke(); + ctx.closePath(); + } + draw() { + this.checkContext(); + this.setRendered(); + const firstNote = this.first_note; + const lastNote = this.last_note; + if (!firstNote || !lastNote) + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('NoNote', 'Notes required to draw'); + const start = firstNote.getModifierStartXY(this.position, 0); + const end = lastNote.getModifierStartXY(this.position, 0); + this.renderHairpin({ + first_x: start.x, + last_x: end.x, + first_y: firstNote.checkStave().getY() + firstNote.checkStave().getHeight(), + last_y: lastNote.checkStave().getY() + lastNote.checkStave().getHeight(), + staff_height: firstNote.checkStave().getHeight(), + }); + } +} +StaveHairpin.type = { + CRESC: 1, + DECRESC: 2, +}; + + +/***/ }), + +/***/ "./src/staveline.ts": +/*!**************************!*\ + !*** ./src/staveline.ts ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StaveLine": () => (/* binding */ StaveLine) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// ## Description +// +// This file implements `StaveLine` which are simply lines that connect +// two notes. This object is highly configurable, see the `render_options`. +// A simple line is often used for notating glissando articulations, but you +// can format a `StaveLine` with arrows or colors for more pedagogical +// purposes, such as diagrams. + + + + +// Attribution: Arrow rendering implementations based off of +// Patrick Horgan's article, "Drawing lines and arcs with +// arrow heads on HTML5 Canvas" +// +// Draw an arrow head that connects between 3 coordinates. +function drawArrowHead(ctx, x0, y0, x1, y1, x2, y2) { + // all cases do this. + ctx.beginPath(); + ctx.moveTo(x0, y0); + ctx.lineTo(x1, y1); + ctx.lineTo(x2, y2); + ctx.lineTo(x0, y0); + ctx.closePath(); + ctx.fill(); +} +class StaveLine extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + // Initialize the StaveLine with the given `notes`. + // + // `notes` is a struct that has: + // + // ``` + // { + // first_note: Note, + // last_note: Note, + // first_indices: [n1, n2, n3], + // last_indices: [n1, n2, n3] + // } + // ``` + constructor(notes) { + super(); + this.setNotes(notes); + this.text = ''; + this.resetFont(); + this.render_options = { + // Space to add to the left or the right + padding_left: 4, + padding_right: 3, + // The width of the line in pixels + line_width: 1, + // An array of line/space lengths. (TODO/QUESTION: Is this supported in SVG?). + line_dash: undefined, + // Can draw rounded line end, instead of a square. (TODO/QUESTION: Is this supported in SVG?). + rounded_end: true, + // The color of the line and arrowheads + color: undefined, + // Flags to draw arrows on each end of the line + draw_start_arrow: false, + draw_end_arrow: false, + // The length of the arrowhead sides + arrowhead_length: 10, + // The angle of the arrowhead + arrowhead_angle: Math.PI / 8, + // The position of the text + text_position_vertical: StaveLine.TextVerticalPosition.TOP, + text_justification: StaveLine.TextJustification.CENTER, + }; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_2__.Category.StaveLine; + } + // The the annotation for the `StaveLine` + setText(text) { + this.text = text; + return this; + } + // Set the notes for the `StaveLine` + setNotes(notes) { + if (!notes.first_note && !notes.last_note) { + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('BadArguments', 'Notes needs to have either first_note or last_note set.'); + } + if (!notes.first_indices) + notes.first_indices = [0]; + if (!notes.last_indices) + notes.last_indices = [0]; + if (notes.first_indices.length !== notes.last_indices.length) { + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('BadArguments', 'Connected notes must have same number of indices.'); + } + this.notes = notes; + this.first_note = notes.first_note; + this.first_indices = notes.first_indices; + this.last_note = notes.last_note; + this.last_indices = notes.last_indices; + return this; + } + // Apply the style of the `StaveLine` to the context + applyLineStyle() { + const ctx = this.checkContext(); + const render_options = this.render_options; + if (render_options.line_dash) { + ctx.setLineDash(render_options.line_dash); + } + if (render_options.line_width) { + ctx.setLineWidth(render_options.line_width); + } + if (render_options.rounded_end) { + ctx.setLineCap('round'); + } + else { + ctx.setLineCap('square'); + } + } + // Apply the text styling to the context + applyFontStyle() { + const ctx = this.checkContext(); + ctx.setFont(this.textFont); + const render_options = this.render_options; + const color = render_options.color; + if (color) { + ctx.setStrokeStyle(color); + ctx.setFillStyle(color); + } + } + // Helper function to draw a line with arrow heads + drawArrowLine(ctx, pt1, pt2) { + const both_arrows = this.render_options.draw_start_arrow && this.render_options.draw_end_arrow; + const x1 = pt1.x; + const y1 = pt1.y; + const x2 = pt2.x; + const y2 = pt2.y; + // For ends with arrow we actually want to stop before we get to the arrow + // so that wide lines won't put a flat end on the arrow. + const distance = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); + const ratio = (distance - this.render_options.arrowhead_length / 3) / distance; + let end_x; + let end_y; + let start_x; + let start_y; + if (this.render_options.draw_end_arrow || both_arrows) { + end_x = Math.round(x1 + (x2 - x1) * ratio); + end_y = Math.round(y1 + (y2 - y1) * ratio); + } + else { + end_x = x2; + end_y = y2; + } + if (this.render_options.draw_start_arrow || both_arrows) { + start_x = x1 + (x2 - x1) * (1 - ratio); + start_y = y1 + (y2 - y1) * (1 - ratio); + } + else { + start_x = x1; + start_y = y1; + } + if (this.render_options.color) { + ctx.setStrokeStyle(this.render_options.color); + ctx.setFillStyle(this.render_options.color); + } + // Draw the shaft of the arrow + ctx.beginPath(); + ctx.moveTo(start_x, start_y); + ctx.lineTo(end_x, end_y); + ctx.stroke(); + ctx.closePath(); + // calculate the angle of the line + const line_angle = Math.atan2(y2 - y1, x2 - x1); + // h is the line length of a side of the arrow head + const h = Math.abs(this.render_options.arrowhead_length / Math.cos(this.render_options.arrowhead_angle)); + let angle1; + let angle2; + let top_x; + let top_y; + let bottom_x; + let bottom_y; + if (this.render_options.draw_end_arrow || both_arrows) { + angle1 = line_angle + Math.PI + this.render_options.arrowhead_angle; + top_x = x2 + Math.cos(angle1) * h; + top_y = y2 + Math.sin(angle1) * h; + angle2 = line_angle + Math.PI - this.render_options.arrowhead_angle; + bottom_x = x2 + Math.cos(angle2) * h; + bottom_y = y2 + Math.sin(angle2) * h; + drawArrowHead(ctx, top_x, top_y, x2, y2, bottom_x, bottom_y); + } + if (this.render_options.draw_start_arrow || both_arrows) { + angle1 = line_angle + this.render_options.arrowhead_angle; + top_x = x1 + Math.cos(angle1) * h; + top_y = y1 + Math.sin(angle1) * h; + angle2 = line_angle - this.render_options.arrowhead_angle; + bottom_x = x1 + Math.cos(angle2) * h; + bottom_y = y1 + Math.sin(angle2) * h; + drawArrowHead(ctx, top_x, top_y, x1, y1, bottom_x, bottom_y); + } + } + // Renders the `StaveLine` on the context + draw() { + const ctx = this.checkContext(); + this.setRendered(); + const first_note = this.first_note; + const last_note = this.last_note; + const render_options = this.render_options; + ctx.save(); + this.applyLineStyle(); + // Cycle through each set of indices and draw lines + let start_position = { x: 0, y: 0 }; + let end_position = { x: 0, y: 0 }; + this.first_indices.forEach((first_index, i) => { + const last_index = this.last_indices[i]; + // Get initial coordinates for the start/end of the line + start_position = first_note.getModifierStartXY(2, first_index); + end_position = last_note.getModifierStartXY(1, last_index); + const upwards_slope = start_position.y > end_position.y; + // Adjust `x` coordinates for modifiers + start_position.x += first_note.getMetrics().modRightPx + render_options.padding_left; + end_position.x -= last_note.getMetrics().modLeftPx + render_options.padding_right; + // Adjust first `x` coordinates for displacements + const notehead_width = first_note.getGlyph().getWidth(); + const first_displaced = first_note.getKeyProps()[first_index].displaced; + if (first_displaced && first_note.getStemDirection() === 1) { + start_position.x += notehead_width + render_options.padding_left; + } + // Adjust last `x` coordinates for displacements + const last_displaced = last_note.getKeyProps()[last_index].displaced; + if (last_displaced && last_note.getStemDirection() === -1) { + end_position.x -= notehead_width + render_options.padding_right; + } + // Adjust y position better if it's not coming from the center of the note + start_position.y += upwards_slope ? -3 : 1; + end_position.y += upwards_slope ? 2 : 0; + this.drawArrowLine(ctx, start_position, end_position); + }); + ctx.restore(); + // Determine the x coordinate where to start the text + const text_width = ctx.measureText(this.text).width; + const justification = render_options.text_justification; + let x = 0; + if (justification === StaveLine.TextJustification.LEFT) { + x = start_position.x; + } + else if (justification === StaveLine.TextJustification.CENTER) { + const delta_x = end_position.x - start_position.x; + const center_x = delta_x / 2 + start_position.x; + x = center_x - text_width / 2; + } + else if (justification === StaveLine.TextJustification.RIGHT) { + x = end_position.x - text_width; + } + // Determine the y value to start the text + let y = 0; + const vertical_position = render_options.text_position_vertical; + if (vertical_position === StaveLine.TextVerticalPosition.TOP) { + y = first_note.checkStave().getYForTopText(); + } + else if (vertical_position === StaveLine.TextVerticalPosition.BOTTOM) { + y = first_note.checkStave().getYForBottomText(_tables__WEBPACK_IMPORTED_MODULE_1__.Tables.TEXT_HEIGHT_OFFSET_HACK); + } + // Draw the text + ctx.save(); + this.applyFontStyle(); + ctx.fillText(this.text, x, y); + ctx.restore(); + return this; + } +} +/** Default text font. */ +StaveLine.TEXT_FONT = Object.assign({}, _element__WEBPACK_IMPORTED_MODULE_0__.Element.TEXT_FONT); +// Text Positioning +StaveLine.TextVerticalPosition = { + TOP: 1, + BOTTOM: 2, +}; +StaveLine.TextJustification = { + LEFT: 1, + CENTER: 2, + RIGHT: 3, +}; + + +/***/ }), + +/***/ "./src/stavemodifier.ts": +/*!******************************!*\ + !*** ./src/stavemodifier.ts ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StaveModifierPosition": () => (/* binding */ StaveModifierPosition), +/* harmony export */ "StaveModifier": () => (/* binding */ StaveModifier) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// ## Description +// A base class for stave modifiers (e.g. clefs, key signatures) + + + +var StaveModifierPosition; +(function (StaveModifierPosition) { + StaveModifierPosition[StaveModifierPosition["CENTER"] = 0] = "CENTER"; + StaveModifierPosition[StaveModifierPosition["LEFT"] = 1] = "LEFT"; + StaveModifierPosition[StaveModifierPosition["RIGHT"] = 2] = "RIGHT"; + StaveModifierPosition[StaveModifierPosition["ABOVE"] = 3] = "ABOVE"; + StaveModifierPosition[StaveModifierPosition["BELOW"] = 4] = "BELOW"; + StaveModifierPosition[StaveModifierPosition["BEGIN"] = 5] = "BEGIN"; + StaveModifierPosition[StaveModifierPosition["END"] = 6] = "END"; +})(StaveModifierPosition || (StaveModifierPosition = {})); +class StaveModifier extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + constructor() { + super(); + this.width = 0; + this.x = 0; + this.padding = 10; + this.position = StaveModifierPosition.ABOVE; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_1__.Category.StaveModifier; + } + static get Position() { + return StaveModifierPosition; + } + getPosition() { + return this.position; + } + setPosition(position) { + this.position = position; + return this; + } + getStave() { + return this.stave; + } + checkStave() { + return (0,_util__WEBPACK_IMPORTED_MODULE_2__.defined)(this.stave, 'NoStave', 'No stave attached to instance.'); + } + setStave(stave) { + this.stave = stave; + return this; + } + getWidth() { + return this.width; + } + setWidth(width) { + this.width = width; + return this; + } + getX() { + return this.x; + } + setX(x) { + this.x = x; + return this; + } + placeGlyphOnLine(glyph, stave, line, customShift = 0) { + glyph.setYShift(stave.getYForLine(line !== null && line !== void 0 ? line : 0) - stave.getYForGlyphs() + customShift); + } + getPadding(index) { + return index !== undefined && index < 2 ? 0 : this.padding; + } + setPadding(padding) { + this.padding = padding; + return this; + } + setLayoutMetrics(layoutMetrics) { + this.layoutMetrics = layoutMetrics; + return this; + } + getLayoutMetrics() { + return this.layoutMetrics; + } + // eslint-disable-next-line + draw(...args) { + // DO NOTHING. + } +} + + +/***/ }), + +/***/ "./src/stavenote.ts": +/*!**************************!*\ + !*** ./src/stavenote.ts ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StaveNote": () => (/* binding */ StaveNote) +/* harmony export */ }); +/* harmony import */ var _boundingbox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./boundingbox */ "./src/boundingbox.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _notehead__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./notehead */ "./src/notehead.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _stemmablenote__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./stemmablenote */ "./src/stemmablenote.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// This file implements notes for standard notation. This consists of one or +// more `NoteHeads`, an optional stem, and an optional flag. +// +// Throughout these comments, a "note" refers to the entire `StaveNote`, +// and a "key" refers to a specific pitch/notehead within a note. +// +// See `tests/stavenote_tests.ts` for usage examples. + + + + + + + + +function showDeprecationWarningForNoteHeads() { + // eslint-disable-next-line + console.warn('StaveNote.note_heads is deprecated. Use StaveNote.noteHeads instead.', 'This accessor will be removed in VexFlow 5.0.'); +} +// To enable logging for this class. Set `Vex.Flow.StaveNote.DEBUG` to `true`. +// eslint-disable-next-line +function L(...args) { + if (StaveNote.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_7__.log)('Vex.Flow.StaveNote', args); +} +const isInnerNoteIndex = (note, index) => index === (note.getStemDirection() === _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP ? note.keyProps.length - 1 : 0); +// Helper methods for rest positioning in ModifierContext. +function shiftRestVertical(rest, note, dir) { + const delta = dir; + rest.line += delta; + rest.maxLine += delta; + rest.minLine += delta; + rest.note.setKeyLine(0, rest.note.getKeyLine(0) + delta); +} +// Called from formatNotes :: center a rest between two notes +function centerRest(rest, noteU, noteL) { + const delta = rest.line - (0,_util__WEBPACK_IMPORTED_MODULE_7__.midLine)(noteU.minLine, noteL.maxLine); + rest.note.setKeyLine(0, rest.note.getKeyLine(0) - delta); + rest.line -= delta; + rest.maxLine -= delta; + rest.minLine -= delta; +} +class StaveNote extends _stemmablenote__WEBPACK_IMPORTED_MODULE_4__.StemmableNote { + constructor(noteStruct) { + var _a, _b, _c; + super(noteStruct); + ////////////////////////////////////////////////////////////////////////////////////////////////// + // INSTANCE MEMBERS + this.minLine = 0; + this.maxLine = 0; + this.ledgerLineStyle = {}; + this.clef = (_a = noteStruct.clef) !== null && _a !== void 0 ? _a : 'treble'; + this.octave_shift = (_b = noteStruct.octave_shift) !== null && _b !== void 0 ? _b : 0; + // Pull note rendering properties. + this.glyph = _tables__WEBPACK_IMPORTED_MODULE_5__.Tables.getGlyphProps(this.duration, this.noteType); + (0,_util__WEBPACK_IMPORTED_MODULE_7__.defined)(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`); + // if true, displace note to right + this.displaced = false; + this.dot_shiftY = 0; + // for displaced ledger lines + this.use_default_head_x = false; + // Drawing + this._noteHeads = []; + this.modifiers = []; + this.render_options = Object.assign(Object.assign({}, this.render_options), { + // font size for note heads and rests + glyph_font_scale: noteStruct.glyph_font_scale || _tables__WEBPACK_IMPORTED_MODULE_5__.Tables.NOTATION_FONT_SCALE, + // number of stroke px to the left and right of head + stroke_px: noteStruct.stroke_px || StaveNote.LEDGER_LINE_OFFSET }); + this.calculateKeyProps(); + this.buildStem(); + // Set the stem direction + if (noteStruct.auto_stem) { + this.autoStem(); + } + else { + this.setStemDirection((_c = noteStruct.stem_direction) !== null && _c !== void 0 ? _c : _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP); + } + this.reset(); + this.buildFlag(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_6__.Category.StaveNote; + } + /** + * @deprecated Use Stem.UP. + */ + static get STEM_UP() { + return _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP; + } + /** + * @deprecated Use Stem.DOWN. + */ + static get STEM_DOWN() { + return _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.DOWN; + } + static get LEDGER_LINE_OFFSET() { + return 3; + } + static get minNoteheadPadding() { + const musicFont = _tables__WEBPACK_IMPORTED_MODULE_5__.Tables.currentMusicFont(); + return musicFont.lookupMetric('glyphs.noteHead.minPadding'); + } + /** Format notes inside a ModifierContext. */ + static format(notes, state) { + if (!notes || notes.length < 2) + return false; + const notesList = []; + for (let i = 0; i < notes.length; i++) { + const props = notes[i].getKeyProps(); + const line = props[0].line; + let minL = props[props.length - 1].line; + const stemDirection = notes[i].getStemDirection(); + const stemMax = notes[i].getStemLength() / 10; + const stemMin = notes[i].getStemMinimumLength() / 10; + let maxL; + if (notes[i].isRest()) { + maxL = line + notes[i].glyph.line_above; + minL = line - notes[i].glyph.line_below; + } + else { + maxL = stemDirection === 1 ? props[props.length - 1].line + stemMax : props[props.length - 1].line; + minL = stemDirection === 1 ? props[0].line : props[0].line - stemMax; + } + notesList.push({ + line: props[0].line, + maxLine: maxL, + minLine: minL, + isrest: notes[i].isRest(), + stemDirection: stemDirection, + stemMax, + stemMin, + voice_shift: notes[i].getVoiceShiftWidth(), + is_displaced: notes[i].isDisplaced(), + note: notes[i], + }); + } + const voices = notesList.length; + let noteU = notesList[0]; + const noteM = voices > 2 ? notesList[1] : undefined; + let noteL = voices > 2 ? notesList[2] : notesList[1]; + // for two voice backward compatibility, ensure upper voice is stems up + // for three voices, the voices must be in order (upper, middle, lower) + if (voices === 2 && noteU.stemDirection === -1 && noteL.stemDirection === 1) { + noteU = notesList[1]; + noteL = notesList[0]; + } + const voiceXShift = Math.max(noteU.voice_shift, noteL.voice_shift); + let xShift = 0; + // Test for two voice note intersection + if (voices === 2) { + const lineSpacing = noteU.stemDirection === noteL.stemDirection ? 0.0 : 0.5; + if (noteU.minLine <= noteL.maxLine + lineSpacing) { + if (noteU.isrest) { + // shift rest up + shiftRestVertical(noteU, noteL, 1); + } + else if (noteL.isrest) { + // shift rest down + shiftRestVertical(noteL, noteU, -1); + } + else if (noteU.stemDirection === noteL.stemDirection) { + // upper voice is middle voice, so shift it right + xShift = voiceXShift + 2; + noteU.note.setXShift(xShift); + } + else { + // shift lower voice right + xShift = voiceXShift + 2; + noteL.note.setXShift(xShift); + } + } + // format complete + state.right_shift += xShift; + return true; + } + if (!noteM) + throw new _util__WEBPACK_IMPORTED_MODULE_7__.RuntimeError('InvalidState', 'noteM not defined.'); + // For three voices, test if rests can be repositioned + // + // Special case 1 :: middle voice rest between two notes + // + if (noteM.isrest && !noteU.isrest && !noteL.isrest) { + if (noteU.minLine <= noteM.maxLine || noteM.minLine <= noteL.maxLine) { + const restHeight = noteM.maxLine - noteM.minLine; + const space = noteU.minLine - noteL.maxLine; + if (restHeight < space) { + // center middle voice rest between the upper and lower voices + centerRest(noteM, noteU, noteL); + } + else { + xShift = voiceXShift + 2; // shift middle rest right + noteM.note.setXShift(xShift); + if (noteL.note.hasBeam() === false) { + noteL.stemDirection = -1; + noteL.note.setStemDirection(-1); + } + if (noteU.minLine <= noteL.maxLine && noteU.note.hasBeam() === false) { + noteU.stemDirection = 1; + noteU.note.setStemDirection(1); + } + } + // format complete + state.right_shift += xShift; + return true; + } + } + // Special case 2 :: all voices are rests + if (noteU.isrest && noteM.isrest && noteL.isrest) { + // Shift upper voice rest up + shiftRestVertical(noteU, noteM, 1); + // Shift lower voice rest down + shiftRestVertical(noteL, noteM, -1); + // format complete + state.right_shift += xShift; + return true; + } + // Test if any other rests can be repositioned + if (noteM.isrest && noteU.isrest && noteM.minLine <= noteL.maxLine) { + // Shift middle voice rest up + shiftRestVertical(noteM, noteL, 1); + } + if (noteM.isrest && noteL.isrest && noteU.minLine <= noteM.maxLine) { + // Shift middle voice rest down + shiftRestVertical(noteM, noteU, -1); + } + if (noteU.isrest && noteU.minLine <= noteM.maxLine) { + // shift upper voice rest up; + shiftRestVertical(noteU, noteM, 1); + } + if (noteL.isrest && noteM.minLine <= noteL.maxLine) { + // shift lower voice rest down + shiftRestVertical(noteL, noteM, -1); + } + // If middle voice intersects upper or lower voice + if (noteU.minLine <= noteM.maxLine + 0.5 || noteM.minLine <= noteL.maxLine) { + // shift middle note right + xShift = voiceXShift + 2; + noteM.note.setXShift(xShift); + if (noteL.note.hasBeam() === false) { + noteL.stemDirection = -1; + noteL.note.setStemDirection(-1); + } + if (noteU.minLine <= noteL.maxLine && noteU.note.hasBeam() === false) { + noteU.stemDirection = 1; + noteU.note.setStemDirection(1); + } + } + state.right_shift += xShift; + return true; + } + static postFormat(notes) { + if (!notes) + return false; + notes.forEach((note) => note.postFormat()); + return true; + } + reset() { + super.reset(); + // Save prior noteHead styles & reapply them after making new noteheads. + const noteHeadStyles = this._noteHeads.map((noteHead) => noteHead.getStyle()); + this.buildNoteHeads(); + this._noteHeads.forEach((noteHead, index) => { + const noteHeadStyle = noteHeadStyles[index]; + if (noteHeadStyle) + noteHead.setStyle(noteHeadStyle); + }); + const stave = this.stave; + if (stave) { + this._noteHeads.forEach((head) => head.setStave(stave)); + } + this.calcNoteDisplacements(); + return this; + } + setBeam(beam) { + this.beam = beam; + this.calcNoteDisplacements(); + // Update stem extension is a beam is assigned. + if (this.stem) { + this.stem.setExtension(this.getStemExtension()); + } + return this; + } + // Builds a `Stem` for the note + buildStem() { + this.setStem(new _stem__WEBPACK_IMPORTED_MODULE_3__.Stem({ hide: !!this.isRest() })); + return this; + } + // Builds a `NoteHead` for each key in the note + buildNoteHeads() { + this._noteHeads = []; + const stemDirection = this.getStemDirection(); + const keys = this.getKeys(); + let lastLine = undefined; + let lineDiff = undefined; + let displaced = false; + // Draw notes from bottom to top. + // For down-stem notes, we draw from top to bottom. + let start; + let end; + let step; + if (stemDirection === _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP) { + start = 0; + end = keys.length; + step = 1; + } + else { + start = keys.length - 1; + end = -1; + step = -1; + } + for (let i = start; i !== end; i += step) { + const noteProps = this.keyProps[i]; + const line = noteProps.line; + // Keep track of last line with a note head, so that consecutive heads + // are correctly displaced. + if (lastLine === undefined) { + lastLine = line; + } + else { + lineDiff = Math.abs(lastLine - line); + if (lineDiff === 0 || lineDiff === 0.5) { + displaced = !displaced; + } + else { + displaced = false; + this.use_default_head_x = true; + } + } + lastLine = line; + const notehead = new _notehead__WEBPACK_IMPORTED_MODULE_2__.NoteHead({ + duration: this.duration, + note_type: this.noteType, + displaced, + stem_direction: stemDirection, + custom_glyph_code: noteProps.code, + glyph_font_scale: this.render_options.glyph_font_scale, + x_shift: noteProps.shift_right, + stem_up_x_offset: noteProps.stem_up_x_offset, + stem_down_x_offset: noteProps.stem_down_x_offset, + line: noteProps.line, + }); + this._noteHeads[i] = notehead; + } + } + // Automatically sets the stem direction based on the keys in the note + autoStem() { + this.setStemDirection(this.calculateOptimalStemDirection()); + } + calculateOptimalStemDirection() { + // Figure out optimal stem direction based on given notes + this.minLine = this.keyProps[0].line; + this.maxLine = this.keyProps[this.keyProps.length - 1].line; + const MIDDLE_LINE = 3; + const decider = (this.minLine + this.maxLine) / 2; + const stemDirection = decider < MIDDLE_LINE ? _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP : _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.DOWN; + return stemDirection; + } + // Calculates and stores the properties for each key in the note + calculateKeyProps() { + let lastLine; + for (let i = 0; i < this.keys.length; ++i) { + const key = this.keys[i]; + // All rests use the same position on the line. + // if (this.glyph.rest) key = this.glyph.position; + if (this.glyph.rest) + this.glyph.position = key; + const options = { octave_shift: this.octave_shift || 0 }; + const props = _tables__WEBPACK_IMPORTED_MODULE_5__.Tables.keyProperties(key, this.clef, options); + if (!props) { + throw new _util__WEBPACK_IMPORTED_MODULE_7__.RuntimeError('BadArguments', `Invalid key for note properties: ${key}`); + } + // Override line placement for default rests + if (props.key === 'R') { + if (this.duration === '1' || this.duration === 'w') { + props.line = 4; + } + else { + props.line = 3; + } + } + // Calculate displacement of this note + const line = props.line; + if (lastLine == undefined) { + lastLine = line; + } + else { + if (Math.abs(lastLine - line) === 0.5) { + this.displaced = true; + props.displaced = true; + // Have to mark the previous note as + // displaced as well, for modifier placement + if (this.keyProps.length > 0) { + this.keyProps[i - 1].displaced = true; + } + } + } + lastLine = line; + this.keyProps.push(props); + } + // Sort the notes from lowest line to highest line + lastLine = undefined; + this.keyProps.forEach((key) => { + if (lastLine && key.line < lastLine) { + (0,_util__WEBPACK_IMPORTED_MODULE_7__.warn)('Unsorted keys in note will be sorted. ' + 'See https://github.com/0xfe/vexflow/issues/104 for details.'); + } + lastLine = key.line; + }); + this.keyProps.sort((a, b) => a.line - b.line); + } + // Get the `BoundingBox` for the entire note + getBoundingBox() { + var _a, _b; + if (!this.preFormatted) { + throw new _util__WEBPACK_IMPORTED_MODULE_7__.RuntimeError('UnformattedNote', "Can't call getBoundingBox on an unformatted note."); + } + const { width: w, modLeftPx, leftDisplacedHeadPx } = this.getMetrics(); + const x = this.getAbsoluteX() - modLeftPx - leftDisplacedHeadPx; + let minY = 0; + let maxY = 0; + const halfLineSpacing = ((_b = (_a = this.getStave()) === null || _a === void 0 ? void 0 : _a.getSpacingBetweenLines()) !== null && _b !== void 0 ? _b : 0) / 2; + const lineSpacing = halfLineSpacing * 2; + if (this.isRest()) { + const y = this.ys[0]; + const frac = _tables__WEBPACK_IMPORTED_MODULE_5__.Tables.durationToFraction(this.duration); + if (frac.equals(1) || frac.equals(2)) { + minY = y - halfLineSpacing; + maxY = y + halfLineSpacing; + } + else { + minY = y - this.glyph.line_above * lineSpacing; + maxY = y + this.glyph.line_below * lineSpacing; + } + } + else if (this.glyph.stem) { + const ys = this.getStemExtents(); + ys.baseY += halfLineSpacing * this.getStemDirection(); + minY = Math.min(ys.topY, ys.baseY); + maxY = Math.max(ys.topY, ys.baseY); + } + else { + minY = 0; + maxY = 0; + for (let i = 0; i < this.ys.length; ++i) { + const yy = this.ys[i]; + if (i === 0) { + minY = yy; + maxY = yy; + } + else { + minY = Math.min(yy, minY); + maxY = Math.max(yy, maxY); + } + } + minY -= halfLineSpacing; + maxY += halfLineSpacing; + } + return new _boundingbox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox(x, minY, w, maxY - minY); + } + // Gets the line number of the bottom note in the chord. + // If `isTopNote` is `true` then get the top note's line number instead + getLineNumber(isTopNote) { + if (!this.keyProps.length) { + throw new _util__WEBPACK_IMPORTED_MODULE_7__.RuntimeError('NoKeyProps', "Can't get bottom note line, because note is not initialized properly."); + } + let resultLine = this.keyProps[0].line; + // No precondition assumed for sortedness of keyProps array + for (let i = 0; i < this.keyProps.length; i++) { + const thisLine = this.keyProps[i].line; + if (isTopNote) { + if (thisLine > resultLine) + resultLine = thisLine; + } + else { + if (thisLine < resultLine) + resultLine = thisLine; + } + } + return resultLine; + } + /** + * @returns true if this note is a type of rest. Rests don't have pitches, but take up space in the score. + */ + isRest() { + return this.glyph.rest; + } + // Determine if the current note is a chord + isChord() { + return !this.isRest() && this.keys.length > 1; + } + // Determine if the `StaveNote` has a stem + hasStem() { + return this.glyph.stem; + } + hasFlag() { + return super.hasFlag() && !this.isRest(); + } + getStemX() { + if (this.noteType === 'r') { + return this.getCenterGlyphX(); + } + else { + // We adjust the origin of the stem because we want the stem left-aligned + // with the notehead if stemmed-down, and right-aligned if stemmed-up + return super.getStemX() + (this.stem_direction ? _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.WIDTH / (2 * -this.stem_direction) : 0); + } + } + // Get the `y` coordinate for text placed on the top/bottom of a + // note at a desired `text_line` + getYForTopText(textLine) { + const extents = this.getStemExtents(); + return Math.min(this.checkStave().getYForTopText(textLine), extents.topY - this.render_options.annotation_spacing * (textLine + 1)); + } + getYForBottomText(textLine) { + const extents = this.getStemExtents(); + return Math.max(this.checkStave().getYForTopText(textLine), extents.baseY + this.render_options.annotation_spacing * textLine); + } + // Sets the current note to the provided `stave`. This applies + // `y` values to the `NoteHeads`. + setStave(stave) { + super.setStave(stave); + const ys = this._noteHeads.map((notehead) => { + notehead.setStave(stave); + return notehead.getY(); + }); + this.setYs(ys); + if (this.stem) { + const { y_top, y_bottom } = this.getNoteHeadBounds(); + this.stem.setYBounds(y_top, y_bottom); + } + return this; + } + // Check if note is shifted to the right + isDisplaced() { + return this.displaced; + } + // Sets whether shift note to the right. `displaced` is a `boolean` + setNoteDisplaced(displaced) { + this.displaced = displaced; + return this; + } + // Get the starting `x` coordinate for a `StaveTie` + getTieRightX() { + let tieStartX = this.getAbsoluteX(); + tieStartX += this.getGlyphWidth() + this.x_shift + this.rightDisplacedHeadPx; + if (this.modifierContext) + tieStartX += this.modifierContext.getRightShift(); + return tieStartX; + } + // Get the ending `x` coordinate for a `StaveTie` + getTieLeftX() { + let tieEndX = this.getAbsoluteX(); + tieEndX += this.x_shift - this.leftDisplacedHeadPx; + return tieEndX; + } + // Get the stave line on which to place a rest + getLineForRest() { + let restLine = this.keyProps[0].line; + if (this.keyProps.length > 1) { + const lastLine = this.keyProps[this.keyProps.length - 1].line; + const top = Math.max(restLine, lastLine); + const bot = Math.min(restLine, lastLine); + restLine = (0,_util__WEBPACK_IMPORTED_MODULE_7__.midLine)(top, bot); + } + return restLine; + } + // Get the default `x` and `y` coordinates for the provided `position` + // and key `index` + getModifierStartXY(position, index, options = {}) { + var _a, _b; + if (!this.preFormatted) { + throw new _util__WEBPACK_IMPORTED_MODULE_7__.RuntimeError('UnformattedNote', "Can't call GetModifierStartXY on an unformatted note"); + } + if (this.ys.length === 0) { + throw new _util__WEBPACK_IMPORTED_MODULE_7__.RuntimeError('NoYValues', 'No Y-Values calculated for this note.'); + } + const { ABOVE, BELOW, LEFT, RIGHT } = _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position; + let x = 0; + if (position === LEFT) { + // FIXME: Left modifier padding, move to font file + x = -1 * 2; + } + else if (position === RIGHT) { + // FIXME: Right modifier padding, move to font file + x = this.getGlyphWidth() + this.x_shift + 2; + if (this.stem_direction === _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP && + this.hasFlag() && + (options.forceFlagRight || isInnerNoteIndex(this, index))) { + x += (_b = (_a = this === null || this === void 0 ? void 0 : this.flag) === null || _a === void 0 ? void 0 : _a.getMetrics().width) !== null && _b !== void 0 ? _b : 0; + } + } + else if (position === BELOW || position === ABOVE) { + x = this.getGlyphWidth() / 2; + } + return { + x: this.getAbsoluteX() + x, + y: this.ys[index], + }; + } + // Sets the style of the complete StaveNote, including all keys + // and the stem. + setStyle(style) { + var _a; + super.setStyle(style); + this._noteHeads.forEach((notehead) => notehead.setStyle(style)); + (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setStyle(style); + return this; + } + setStemStyle(style) { + const stem = this.getStem(); + stem === null || stem === void 0 ? void 0 : stem.setStyle(style); + return this; + } + getStemStyle() { + var _a; + return (_a = this.stem) === null || _a === void 0 ? void 0 : _a.getStyle(); + } + setLedgerLineStyle(style) { + this.ledgerLineStyle = style; + } + getLedgerLineStyle() { + return this.ledgerLineStyle; + } + setFlagStyle(style) { + this.flagStyle = style; + } + getFlagStyle() { + return this.flagStyle; + } + // Sets the notehead at `index` to the provided coloring `style`. + // + // `style` is an `object` with the following properties: `shadowColor`, + // `shadowBlur`, `fillStyle`, `strokeStyle` + setKeyStyle(index, style) { + this._noteHeads[index].setStyle(style); + return this; + } + setKeyLine(index, line) { + this.keyProps[index].line = line; + this.reset(); + return this; + } + getKeyLine(index) { + return this.keyProps[index].line; + } + // Get the width of the note if it is displaced. Used for `Voice` + // formatting + getVoiceShiftWidth() { + // TODO: may need to accomodate for dot here. + return this.getGlyphWidth() * (this.displaced ? 2 : 1); + } + // Calculates and sets the extra pixels to the left or right + // if the note is displaced. + calcNoteDisplacements() { + this.setLeftDisplacedHeadPx(this.displaced && this.stem_direction === _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.DOWN ? this.getGlyphWidth() : 0); + // For upstems with flags, the extra space is unnecessary, since it's taken + // up by the flag. + this.setRightDisplacedHeadPx(!this.hasFlag() && this.displaced && this.stem_direction === _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP ? this.getGlyphWidth() : 0); + } + // Pre-render formatting + preFormat() { + if (this.preFormatted) + return; + let noteHeadPadding = 0; + if (this.modifierContext) { + this.modifierContext.preFormat(); + // If there are no modifiers on this note, make sure there is adequate padding + // between the notes. + if (this.modifierContext.getWidth() === 0) { + noteHeadPadding = StaveNote.minNoteheadPadding; + } + } + let width = this.getGlyphWidth() + this.leftDisplacedHeadPx + this.rightDisplacedHeadPx + noteHeadPadding; + // For upward flagged notes, the width of the flag needs to be added + if (this.shouldDrawFlag() && this.stem_direction === _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP) { + width += this.getGlyphWidth(); + // TODO: Add flag width as a separate metric + } + this.setWidth(width); + this.preFormatted = true; + } + /** + * @typedef {Object} noteHeadBounds + * @property {number} y_top the highest notehead bound + * @property {number} y_bottom the lowest notehead bound + * @property {number|Null} displaced_x the starting x for displaced noteheads + * @property {number|Null} non_displaced_x the starting x for non-displaced noteheads + * @property {number} highest_line the highest notehead line in traditional music line + * numbering (bottom line = 1, top line = 5) + * @property {number} lowest_line the lowest notehead line + * @property {number|false} highest_displaced_line the highest staff line number + * for a displaced notehead + * @property {number|false} lowest_displaced_line + * @property {number} highest_non_displaced_line + * @property {number} lowest_non_displaced_line + */ + /** + * Get the staff line and y value for the highest & lowest noteheads + * @returns {noteHeadBounds} + */ + getNoteHeadBounds() { + // Top and bottom Y values for stem. + let yTop = +Infinity; + let yBottom = -Infinity; + let nonDisplacedX; + let displacedX; + let highestLine = this.checkStave().getNumLines(); + let lowestLine = 1; + let highestDisplacedLine; + let lowestDisplacedLine; + let highestNonDisplacedLine = highestLine; + let lowestNonDisplacedLine = lowestLine; + this._noteHeads.forEach((notehead) => { + const line = notehead.getLine(); + const y = notehead.getY(); + yTop = Math.min(y, yTop); + yBottom = Math.max(y, yBottom); + if (displacedX === undefined && notehead.isDisplaced()) { + displacedX = notehead.getAbsoluteX(); + } + if (nonDisplacedX === undefined && !notehead.isDisplaced()) { + nonDisplacedX = notehead.getAbsoluteX(); + } + highestLine = Math.max(line, highestLine); + lowestLine = Math.min(line, lowestLine); + if (notehead.isDisplaced()) { + highestDisplacedLine = highestDisplacedLine === undefined ? line : Math.max(line, highestDisplacedLine); + lowestDisplacedLine = lowestDisplacedLine === undefined ? line : Math.min(line, lowestDisplacedLine); + } + else { + highestNonDisplacedLine = Math.max(line, highestNonDisplacedLine); + lowestNonDisplacedLine = Math.min(line, lowestNonDisplacedLine); + } + }, this); + return { + y_top: yTop, + y_bottom: yBottom, + displaced_x: displacedX, + non_displaced_x: nonDisplacedX, + highest_line: highestLine, + lowest_line: lowestLine, + highest_displaced_line: highestDisplacedLine, + lowest_displaced_line: lowestDisplacedLine, + highest_non_displaced_line: highestNonDisplacedLine, + lowest_non_displaced_line: lowestNonDisplacedLine, + }; + } + // Get the starting `x` coordinate for the noteheads + getNoteHeadBeginX() { + return this.getAbsoluteX() + this.x_shift; + } + // Get the ending `x` coordinate for the noteheads + getNoteHeadEndX() { + const xBegin = this.getNoteHeadBeginX(); + return xBegin + this.getGlyphWidth(); + } + get noteHeads() { + return this._noteHeads.slice(); + } + /** @deprecated use StaveNote.noteHeads instead. */ + get note_heads() { + showDeprecationWarningForNoteHeads(); + return this.noteHeads; + } + // Draw the ledger lines between the stave and the highest/lowest keys + drawLedgerLines() { + const stave = this.checkStave(); + const { glyph, render_options: { stroke_px }, } = this; + const ctx = this.checkContext(); + const width = glyph.getWidth() + stroke_px * 2; + const doubleWidth = 2 * (glyph.getWidth() + stroke_px) - _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.WIDTH / 2; + if (this.isRest()) + return; + if (!ctx) { + throw new _util__WEBPACK_IMPORTED_MODULE_7__.RuntimeError('NoCanvasContext', "Can't draw without a canvas context."); + } + const { highest_line, lowest_line, highest_displaced_line, highest_non_displaced_line, lowest_displaced_line, lowest_non_displaced_line, displaced_x, non_displaced_x, } = this.getNoteHeadBounds(); + // Early out if there are no ledger lines to draw. + if (highest_line < 6 && lowest_line > 0) + return; + const min_x = Math.min(displaced_x !== null && displaced_x !== void 0 ? displaced_x : 0, non_displaced_x !== null && non_displaced_x !== void 0 ? non_displaced_x : 0); + const drawLedgerLine = (y, normal, displaced) => { + let x; + if (displaced && normal) + x = min_x - stroke_px; + else if (normal) + x = (non_displaced_x !== null && non_displaced_x !== void 0 ? non_displaced_x : 0) - stroke_px; + else + x = (displaced_x !== null && displaced_x !== void 0 ? displaced_x : 0) - stroke_px; + const ledgerWidth = normal && displaced ? doubleWidth : width; + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.lineTo(x + ledgerWidth, y); + ctx.stroke(); + }; + const style = Object.assign(Object.assign({}, stave.getDefaultLedgerLineStyle()), this.getLedgerLineStyle()); + this.applyStyle(ctx, style); + // Draw ledger lines below the staff: + for (let line = 6; line <= highest_line; ++line) { + const normal = non_displaced_x !== undefined && line <= highest_non_displaced_line; + const displaced = highest_displaced_line !== undefined && line <= highest_displaced_line; + drawLedgerLine(stave.getYForNote(line), normal, displaced); + } + // Draw ledger lines above the staff: + for (let line = 0; line >= lowest_line; --line) { + const normal = non_displaced_x !== undefined && line >= lowest_non_displaced_line; + const displaced = lowest_displaced_line !== undefined && line >= lowest_displaced_line; + drawLedgerLine(stave.getYForNote(line), normal, displaced); + } + this.restoreStyle(ctx, style); + } + // Draw all key modifiers + drawModifiers() { + const ctx = this.checkContext(); + ctx.openGroup('modifiers'); + for (let i = 0; i < this.modifiers.length; i++) { + const modifier = this.modifiers[i]; + const index = modifier.checkIndex(); + const notehead = this._noteHeads[index]; + const noteheadStyle = notehead.getStyle(); + notehead.applyStyle(ctx, noteheadStyle); + modifier.setContext(ctx); + modifier.drawWithStyle(); + notehead.restoreStyle(ctx, noteheadStyle); + } + ctx.closeGroup(); + } + shouldDrawFlag() { + const hasStem = this.stem !== undefined; + const hasFlag = this.glyph.flag; // specified in tables.js + const hasNoBeam = this.beam === undefined; + return hasStem && hasFlag && hasNoBeam; + } + // Draw the flag for the note + drawFlag() { + var _a; + const ctx = this.checkContext(); + if (!ctx) { + throw new _util__WEBPACK_IMPORTED_MODULE_7__.RuntimeError('NoCanvasContext', "Can't draw without a canvas context."); + } + if (this.shouldDrawFlag()) { + const { y_top, y_bottom } = this.getNoteHeadBounds(); + // eslint-disable-next-line + const noteStemHeight = this.stem.getHeight(); + const flagX = this.getStemX(); + // FIXME: What's with the magic +/- 2 + // ANSWER: a corner of the note stem pokes out beyond the tip of the flag. + // The extra +/- 2 pushes the flag glyph outward so it covers the stem entirely. + // Alternatively, we could shorten the stem. + const extension = this.flag !== undefined ? this.flag.checkMetrics().y_shift : 0; + const flagY = this.getStemDirection() === _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.DOWN + ? // Down stems are below the note head and have flags on the right. + y_top - noteStemHeight + 2 - extension + : // Up stems are above the note head and have flags on the right. + y_bottom - noteStemHeight - 2 - extension; + // Draw the Flag + ctx.openGroup('flag', undefined, { pointerBBox: true }); + this.applyStyle(ctx, this.getFlagStyle()); + (_a = this.flag) === null || _a === void 0 ? void 0 : _a.render(ctx, flagX, flagY); + this.restoreStyle(ctx, this.getFlagStyle()); + ctx.closeGroup(); + } + } + // Draw the NoteHeads + drawNoteHeads() { + const ctx = this.checkContext(); + this._noteHeads.forEach((notehead) => { + ctx.openGroup('notehead', undefined, { pointerBBox: true }); + notehead.setContext(ctx).draw(); + ctx.closeGroup(); + }); + } + drawStem(stemOptions) { + var _a; + // GCR TODO: I can't find any context in which this is called with the stemStruct + // argument in the codebase or tests. Nor can I find a case where super.drawStem + // is called at all. Perhaps these should be removed? + const ctx = this.checkContext(); + if (stemOptions) { + this.setStem(new _stem__WEBPACK_IMPORTED_MODULE_3__.Stem(stemOptions)); + } + // If we will render a flag, we shorten the stem so that the tip + // does not poke through the flag. + if (this.shouldDrawFlag() && this.stem) { + this.stem.adjustHeightForFlag(); + } + ctx.openGroup('stem', undefined, { pointerBBox: true }); + (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setContext(ctx).draw(); + ctx.closeGroup(); + } + /** + * Override stemmablenote stem extension to adjust for distance from middle line. + */ + getStemExtension() { + const super_stem_extension = super.getStemExtension(); + if (!this.glyph.stem) { + return super_stem_extension; + } + const stem_direction = this.getStemDirection(); + if (stem_direction !== this.calculateOptimalStemDirection()) { + return super_stem_extension; // no adjustment for manually set stem direction. + } + let mid_line_distance; + const MIDDLE_LINE = 3; + if (stem_direction === _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP) { + // Note that the use of maxLine here instead of minLine might + // seem counterintuitive, but in the case of (say) treble clef + // chord(F2, E4) stem up, we do not want to extend the stem because + // of F2, when a normal octave-length stem above E4 is fine. + // + // maxLine and minLine are set in calculateOptimalStemDirection() so + // will be known. + mid_line_distance = MIDDLE_LINE - this.maxLine; + } + else { + mid_line_distance = this.minLine - MIDDLE_LINE; + } + // how many lines more than an octave is the relevant notehead? + const lines_over_octave_from_mid_line = mid_line_distance - 3.5; + if (lines_over_octave_from_mid_line <= 0) { + return super_stem_extension; + } + const stave = this.getStave(); + let spacing_between_lines = 10; + if (stave != undefined) { + spacing_between_lines = stave.getSpacingBetweenLines(); + } + return super_stem_extension + lines_over_octave_from_mid_line * spacing_between_lines; + } + // Draws all the `StaveNote` parts. This is the main drawing method. + draw() { + var _a; + if (this.ys.length === 0) { + throw new _util__WEBPACK_IMPORTED_MODULE_7__.RuntimeError('NoYValues', "Can't draw note without Y values."); + } + const ctx = this.checkContext(); + const xBegin = this.getNoteHeadBeginX(); + const shouldRenderStem = this.hasStem() && !this.beam; + // Format note head x positions + this._noteHeads.forEach((notehead) => notehead.setX(xBegin)); + // Format stem x positions + const stemX = this.getStemX(); + (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setNoteHeadXBounds(stemX, stemX); + L('Rendering ', this.isChord() ? 'chord :' : 'note :', this.keys); + // Apply the overall style -- may be contradicted by local settings: + this.applyStyle(); + this.setAttribute('el', ctx.openGroup('stavenote', this.getAttribute('id'))); + this.drawLedgerLines(); + ctx.openGroup('note', undefined, { pointerBBox: true }); + if (shouldRenderStem) + this.drawStem(); + this.drawNoteHeads(); + this.drawFlag(); + ctx.closeGroup(); + this.drawModifiers(); + ctx.closeGroup(); + this.restoreStyle(); + this.setRendered(); + } +} +StaveNote.DEBUG = false; + + +/***/ }), + +/***/ "./src/staverepetition.ts": +/*!********************************!*\ + !*** ./src/staverepetition.ts ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Repetition": () => (/* binding */ Repetition) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _stavemodifier__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./stavemodifier */ "./src/stavemodifier.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author Larry Kuhns 2011 + + + + + +class Repetition extends _stavemodifier__WEBPACK_IMPORTED_MODULE_2__.StaveModifier { + constructor(type, x, y_shift) { + super(); + this.symbol_type = type; + this.x = x; + this.x_shift = 0; + this.y_shift = y_shift; + this.resetFont(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_4__.Category.Repetition; + } + setShiftX(x) { + this.x_shift = x; + return this; + } + setShiftY(y) { + this.y_shift = y; + return this; + } + draw(stave, x) { + this.setRendered(); + switch (this.symbol_type) { + case Repetition.type.CODA_RIGHT: + this.drawCodaFixed(stave, x + stave.getWidth()); + break; + case Repetition.type.CODA_LEFT: + this.drawSymbolText(stave, x, 'Coda', true); + break; + case Repetition.type.SEGNO_LEFT: + this.drawSignoFixed(stave, x); + break; + case Repetition.type.SEGNO_RIGHT: + this.drawSignoFixed(stave, x + stave.getWidth()); + break; + case Repetition.type.DC: + this.drawSymbolText(stave, x, 'D.C.', false); + break; + case Repetition.type.DC_AL_CODA: + this.drawSymbolText(stave, x, 'D.C. al', true); + break; + case Repetition.type.DC_AL_FINE: + this.drawSymbolText(stave, x, 'D.C. al Fine', false); + break; + case Repetition.type.DS: + this.drawSymbolText(stave, x, 'D.S.', false); + break; + case Repetition.type.DS_AL_CODA: + this.drawSymbolText(stave, x, 'D.S. al', true); + break; + case Repetition.type.DS_AL_FINE: + this.drawSymbolText(stave, x, 'D.S. al Fine', false); + break; + case Repetition.type.FINE: + this.drawSymbolText(stave, x, 'Fine', false); + break; + case Repetition.type.TO_CODA: + this.drawSymbolText(stave, x, 'To', true); + break; + default: + break; + } + return this; + } + drawCodaFixed(stave, x) { + const y = stave.getYForTopText(stave.getNumLines()) + this.y_shift; + _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.renderGlyph(stave.checkContext(), this.x + x + this.x_shift, y + _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY'), 40, 'coda', { category: 'coda' }); + return this; + } + drawSignoFixed(stave, x) { + const y = stave.getYForTopText(stave.getNumLines()) + this.y_shift; + _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.renderGlyph(stave.checkContext(), this.x + x + this.x_shift, y + _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY'), 30, 'segno', { category: 'segno' }); + return this; + } + drawSymbolText(stave, x, text, draw_coda) { + const ctx = stave.checkContext(); + ctx.save(); + ctx.setFont(this.textFont); + let text_x = 0; + let symbol_x = 0; + const modifierWidth = stave.getNoteStartX() - this.x; + switch (this.symbol_type) { + // To the left with symbol + case Repetition.type.CODA_LEFT: + // Offset Coda text to right of stave beginning + text_x = this.x + stave.getVerticalBarWidth(); + symbol_x = + text_x + + ctx.measureText(text).width + + _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol'); + break; + // To the right without symbol + case Repetition.type.DC: + case Repetition.type.DC_AL_FINE: + case Repetition.type.DS: + case Repetition.type.DS_AL_FINE: + case Repetition.type.FINE: + text_x = + this.x + + x + + this.x_shift + + stave.getWidth() - + _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().lookupMetric('staveRepetition.default.spacing') - + modifierWidth - + ctx.measureText(text).width; + break; + // To the right with symbol + default: + text_x = + this.x + + x + + this.x_shift + + stave.getWidth() - + _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().lookupMetric('staveRepetition.default.spacing') - + modifierWidth - + ctx.measureText(text).width - + _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol'); + symbol_x = + text_x + + ctx.measureText(text).width + + _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol'); + break; + } + const y = stave.getYForTopText(stave.getNumLines()) + + this.y_shift + + _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY'); + if (draw_coda) { + _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.renderGlyph(ctx, symbol_x, y, 40, 'coda', { category: 'coda' }); + } + ctx.fillText(text, text_x, y + 5); + ctx.restore(); + return this; + } +} +Repetition.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_0__.Font.SERIF, + size: 12, + weight: _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.BOLD, + style: _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.NORMAL, +}; +Repetition.type = { + NONE: 1, + CODA_LEFT: 2, + CODA_RIGHT: 3, + SEGNO_LEFT: 4, + SEGNO_RIGHT: 5, + DC: 6, + DC_AL_CODA: 7, + DC_AL_FINE: 8, + DS: 9, + DS_AL_CODA: 10, + DS_AL_FINE: 11, + FINE: 12, + TO_CODA: 13, // To Coda at end of stave +}; + + +/***/ }), + +/***/ "./src/stavesection.ts": +/*!*****************************!*\ + !*** ./src/stavesection.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StaveSection": () => (/* binding */ StaveSection) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _stavemodifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stavemodifier */ "./src/stavemodifier.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author Larry Kuhns 2011 + + + +class StaveSection extends _stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifier { + constructor(section, x, shift_y) { + super(); + this.setWidth(16); + this.section = section; + this.x = x; + this.shift_x = 0; + this.shift_y = shift_y; + this.resetFont(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_2__.Category.StaveSection; + } + setStaveSection(section) { + this.section = section; + return this; + } + setShiftX(x) { + this.shift_x = x; + return this; + } + setShiftY(y) { + this.shift_y = y; + return this; + } + draw(stave, shift_x) { + const ctx = stave.checkContext(); + this.setRendered(); + ctx.save(); + ctx.setLineWidth(2); + ctx.setFont(this.textFont); + const paddingX = 2; + const paddingY = 2; + const rectWidth = 2; + const textMeasurements = ctx.measureText(this.section); + const textWidth = textMeasurements.width; + const textHeight = textMeasurements.height; + const width = textWidth + 2 * paddingX; // add left & right padding + const height = textHeight + 2 * paddingY; // add top & bottom padding + // Seems to be a good default y + const y = stave.getYForTopText(2) + this.shift_y; + const x = this.x + shift_x; + ctx.beginPath(); + ctx.setLineWidth(rectWidth); + ctx.rect(x, y + textMeasurements.y - paddingY, width, height); + ctx.stroke(); + ctx.fillText(this.section, x + paddingX, y); + ctx.restore(); + return this; + } +} +StaveSection.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_0__.Font.SANS_SERIF, + size: 10, + weight: _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.BOLD, + style: _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.NORMAL, +}; + + +/***/ }), + +/***/ "./src/stavetempo.ts": +/*!***************************!*\ + !*** ./src/stavetempo.ts ***! + \***************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StaveTempo": () => (/* binding */ StaveTempo) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _stavemodifier__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./stavemodifier */ "./src/stavemodifier.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author Radosaw Eichler 2012 + + + + + +class StaveTempo extends _stavemodifier__WEBPACK_IMPORTED_MODULE_2__.StaveModifier { + constructor(tempo, x, shift_y) { + super(); + /** Font size for note. */ + this.render_options = { glyph_font_scale: 30 }; + this.tempo = tempo; + this.position = _stavemodifier__WEBPACK_IMPORTED_MODULE_2__.StaveModifierPosition.ABOVE; + this.x = x; + this.shift_x = 10; + this.shift_y = shift_y; + this.resetFont(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_4__.Category.StaveTempo; + } + setTempo(tempo) { + this.tempo = tempo; + return this; + } + setShiftX(x) { + this.shift_x = x; + return this; + } + setShiftY(y) { + this.shift_y = y; + return this; + } + draw(stave, shift_x) { + const ctx = stave.checkContext(); + this.setRendered(); + const options = this.render_options; + // FIXME: What does the '38' mean? Why 38? Is that supposed to + // be the default font size for standard notation? + const scale = options.glyph_font_scale / 38; + const name = this.tempo.name; + const duration = this.tempo.duration; + const dots = this.tempo.dots || 0; + const bpm = this.tempo.bpm; + let x = this.x + this.shift_x + shift_x; + const y = stave.getYForTopText(1) + this.shift_y; + ctx.save(); + if (name) { + ctx.setFont(this.textFont); + ctx.fillText(name, x, y); + x += ctx.measureText(name).width; + } + if (duration && bpm) { + // Override the weight and style. + ctx.setFont(Object.assign(Object.assign({}, this.textFont), { weight: 'normal', style: 'normal' })); + if (name) { + x += ctx.measureText(' ').width; + ctx.fillText('(', x, y); + x += ctx.measureText('(').width; + } + const code = _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.getGlyphProps(duration); + x += 3 * scale; + _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.renderGlyph(ctx, x, y, options.glyph_font_scale, code.code_head); + x += code.getWidth() * scale; + // Draw stem and flags + if (code.stem) { + let stem_height = 30; + if (code.beam_count) + stem_height += 3 * (code.beam_count - 1); + stem_height *= scale; + const y_top = y - stem_height; + ctx.fillRect(x - scale, y_top, scale, stem_height); + if (code.flag) { + _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.renderGlyph(ctx, x, y_top, options.glyph_font_scale, code.code_flag_upstem, { + category: 'flag.staveTempo', + }); + if (!dots) + x += 6 * scale; + } + } + // Draw dot + for (let i = 0; i < dots; i++) { + x += 6 * scale; + ctx.beginPath(); + ctx.arc(x, y + 2 * scale, 2 * scale, 0, Math.PI * 2, false); + ctx.fill(); + } + ctx.fillText(' = ' + bpm + (name ? ')' : ''), x + 3 * scale, y); + } + ctx.restore(); + return this; + } +} +StaveTempo.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_0__.Font.SERIF, + size: 14, + weight: _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.BOLD, + style: _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.NORMAL, +}; + + +/***/ }), + +/***/ "./src/stavetext.ts": +/*!**************************!*\ + !*** ./src/stavetext.ts ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StaveText": () => (/* binding */ StaveText) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _stavemodifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stavemodifier */ "./src/stavemodifier.ts"); +/* harmony import */ var _textnote__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./textnote */ "./src/textnote.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author Taehoon Moon 2014 + + + + + +class StaveText extends _stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifier { + constructor(text, position, options = {}) { + super(); + this.setWidth(16); + this.text = text; + this.position = position; + this.options = Object.assign({ shift_x: 0, shift_y: 0, justification: _textnote__WEBPACK_IMPORTED_MODULE_2__.TextNote.Justification.CENTER }, options); + this.resetFont(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.StaveText; + } + setStaveText(text) { + this.text = text; + return this; + } + setShiftX(x) { + this.shift_x = x; + return this; + } + setShiftY(y) { + this.shift_y = y; + return this; + } + setText(text) { + this.text = text; + return this; + } + draw(stave) { + const ctx = stave.checkContext(); + this.setRendered(); + ctx.save(); + ctx.setLineWidth(2); + ctx.setFont(this.textFont); + const text_width = ctx.measureText('' + this.text).width; + let x; + let y; + switch (this.position) { + case _stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifierPosition.LEFT: + case _stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifierPosition.RIGHT: + y = (stave.getYForLine(0) + stave.getBottomLineY()) / 2 + this.options.shift_y; + if (this.position === _stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifierPosition.LEFT) { + x = stave.getX() - text_width - 24 + this.options.shift_x; + } + else { + x = stave.getX() + stave.getWidth() + 24 + this.options.shift_x; + } + break; + case _stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifierPosition.ABOVE: + case _stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifierPosition.BELOW: + x = stave.getX() + this.options.shift_x; + if (this.options.justification === _textnote__WEBPACK_IMPORTED_MODULE_2__.Justification.CENTER) { + x += stave.getWidth() / 2 - text_width / 2; + } + else if (this.options.justification === _textnote__WEBPACK_IMPORTED_MODULE_2__.Justification.RIGHT) { + x += stave.getWidth() - text_width; + } + if (this.position === _stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifierPosition.ABOVE) { + y = stave.getYForTopText(2) + this.options.shift_y; + } + else { + y = stave.getYForBottomText(2) + this.options.shift_y; + } + break; + default: + throw new _util__WEBPACK_IMPORTED_MODULE_4__.RuntimeError('InvalidPosition', 'Value Must be in Modifier.Position.'); + } + ctx.fillText('' + this.text, x, y + 4); + ctx.restore(); + return this; + } +} +StaveText.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_0__.Font.SERIF, + size: 16, + weight: _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.NORMAL, + style: _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.NORMAL, +}; + + +/***/ }), + +/***/ "./src/stavetie.ts": +/*!*************************!*\ + !*** ./src/stavetie.ts ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StaveTie": () => (/* binding */ StaveTie) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// This class implements varies types of ties between contiguous notes. The +// ties include: regular ties, hammer ons, pull offs, and slides. + + + +class StaveTie extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + /** + * @param notes is a struct that has: + * + * { + * first_note: Note, + * last_note: Note, + * first_indices: [n1, n2, n3], + * last_indices: [n1, n2, n3] + * } + * + * @param text + */ + constructor(notes, text) { + super(); + this.setNotes(notes); + this.text = text; + this.render_options = { + cp1: 8, + cp2: 12, + text_shift_x: 0, + first_x_shift: 0, + last_x_shift: 0, + y_shift: 7, + tie_spacing: 0, + }; + this.resetFont(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_1__.Category.StaveTie; + } + setDirection(direction) { + this.direction = direction; + return this; + } + /** + * Set the notes to attach this tie to. + * + * @param {!Object} notes The notes to tie up. + */ + setNotes(notes) { + if (!notes.first_note && !notes.last_note) { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('BadArguments', 'Tie needs to have either first_note or last_note set.'); + } + if (!notes.first_indices) { + notes.first_indices = [0]; + } + if (!notes.last_indices) { + notes.last_indices = [0]; + } + if (notes.first_indices.length !== notes.last_indices.length) { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('BadArguments', 'Tied notes must have same number of indices.'); + } + this.notes = notes; + return this; + } + /** + * @return {boolean} Returns true if this is a partial bar. + */ + isPartial() { + return !this.notes.first_note || !this.notes.last_note; + } + renderTie(params) { + if (params.first_ys.length === 0 || params.last_ys.length === 0) { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('BadArguments', 'No Y-values to render'); + } + const ctx = this.checkContext(); + let cp1 = this.render_options.cp1; + let cp2 = this.render_options.cp2; + if (Math.abs(params.last_x_px - params.first_x_px) < 10) { + cp1 = 2; + cp2 = 8; + } + const first_x_shift = this.render_options.first_x_shift; + const last_x_shift = this.render_options.last_x_shift; + const y_shift = this.render_options.y_shift * params.direction; + // setNotes(...) verified that first_indices and last_indices are not undefined. + // As a result, we use the ! non-null assertion operator here. + // eslint-disable-next-line + const first_indices = this.notes.first_indices; + // eslint-disable-next-line + const last_indices = this.notes.last_indices; + for (let i = 0; i < first_indices.length; ++i) { + const cp_x = (params.last_x_px + last_x_shift + (params.first_x_px + first_x_shift)) / 2; + const first_y_px = params.first_ys[first_indices[i]] + y_shift; + const last_y_px = params.last_ys[last_indices[i]] + y_shift; + if (isNaN(first_y_px) || isNaN(last_y_px)) { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('BadArguments', 'Bad indices for tie rendering.'); + } + const top_cp_y = (first_y_px + last_y_px) / 2 + cp1 * params.direction; + const bottom_cp_y = (first_y_px + last_y_px) / 2 + cp2 * params.direction; + ctx.beginPath(); + ctx.moveTo(params.first_x_px + first_x_shift, first_y_px); + ctx.quadraticCurveTo(cp_x, top_cp_y, params.last_x_px + last_x_shift, last_y_px); + ctx.quadraticCurveTo(cp_x, bottom_cp_y, params.first_x_px + first_x_shift, first_y_px); + ctx.closePath(); + ctx.fill(); + } + } + renderText(first_x_px, last_x_px) { + var _a, _b, _c; + if (!this.text) + return; + const ctx = this.checkContext(); + let center_x = (first_x_px + last_x_px) / 2; + center_x -= ctx.measureText(this.text).width / 2; + const stave = (_b = (_a = this.notes.first_note) === null || _a === void 0 ? void 0 : _a.checkStave()) !== null && _b !== void 0 ? _b : (_c = this.notes.last_note) === null || _c === void 0 ? void 0 : _c.checkStave(); + if (stave) { + ctx.save(); + ctx.setFont(this.textFont); + ctx.fillText(this.text, center_x + this.render_options.text_shift_x, stave.getYForTopText() - 1); + ctx.restore(); + } + } + draw() { + this.checkContext(); + this.setRendered(); + const first_note = this.notes.first_note; + const last_note = this.notes.last_note; + // Provide some default values so the compiler doesn't complain. + let first_x_px = 0; + let last_x_px = 0; + let first_ys = [0]; + let last_ys = [0]; + let stem_direction = 0; + if (first_note) { + first_x_px = first_note.getTieRightX() + this.render_options.tie_spacing; + stem_direction = first_note.getStemDirection(); + first_ys = first_note.getYs(); + } + else if (last_note) { + const stave = last_note.checkStave(); + first_x_px = stave.getTieStartX(); + first_ys = last_note.getYs(); + this.notes.first_indices = this.notes.last_indices; + } + if (last_note) { + last_x_px = last_note.getTieLeftX() + this.render_options.tie_spacing; + stem_direction = last_note.getStemDirection(); + last_ys = last_note.getYs(); + } + else if (first_note) { + const stave = first_note.checkStave(); + last_x_px = stave.getTieEndX(); + last_ys = first_note.getYs(); + this.notes.last_indices = this.notes.first_indices; + } + if (this.direction) { + stem_direction = this.direction; + } + this.renderTie({ + first_x_px, + last_x_px, + first_ys, + last_ys, + direction: stem_direction, + }); + this.renderText(first_x_px, last_x_px); + return true; + } +} +/** Default text font. */ +StaveTie.TEXT_FONT = Object.assign({}, _element__WEBPACK_IMPORTED_MODULE_0__.Element.TEXT_FONT); + + +/***/ }), + +/***/ "./src/stavevolta.ts": +/*!***************************!*\ + !*** ./src/stavevolta.ts ***! + \***************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "VoltaType": () => (/* binding */ VoltaType), +/* harmony export */ "Volta": () => (/* binding */ Volta) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _stavemodifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stavemodifier */ "./src/stavemodifier.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author Larry Kuhns 2011 + + + +var VoltaType; +(function (VoltaType) { + VoltaType[VoltaType["NONE"] = 1] = "NONE"; + VoltaType[VoltaType["BEGIN"] = 2] = "BEGIN"; + VoltaType[VoltaType["MID"] = 3] = "MID"; + VoltaType[VoltaType["END"] = 4] = "END"; + VoltaType[VoltaType["BEGIN_END"] = 5] = "BEGIN_END"; +})(VoltaType || (VoltaType = {})); +class Volta extends _stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifier { + constructor(type, number, x, y_shift) { + super(); + this.volta = type; + this.x = x; + this.y_shift = y_shift; + this.number = number; + this.resetFont(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_2__.Category.Volta; + } + static get type() { + return VoltaType; + } + setShiftY(y) { + this.y_shift = y; + return this; + } + draw(stave, x) { + const ctx = stave.checkContext(); + this.setRendered(); + let width = stave.getWidth() - x; // don't include x (offset) for width + const top_y = stave.getYForTopText(stave.getNumLines()) + this.y_shift; + const vert_height = 1.5 * stave.getSpacingBetweenLines(); + switch (this.volta) { + case VoltaType.BEGIN: + ctx.fillRect(this.x + x, top_y, 1, vert_height); + break; + case VoltaType.END: + width -= 5; + ctx.fillRect(this.x + x + width, top_y, 1, vert_height); + break; + case VoltaType.BEGIN_END: + width -= 3; + ctx.fillRect(this.x + x, top_y, 1, vert_height); + ctx.fillRect(this.x + x + width, top_y, 1, vert_height); + break; + default: + break; + } + // If the beginning of a volta, draw measure number + if (this.volta === VoltaType.BEGIN || this.volta === VoltaType.BEGIN_END) { + ctx.save(); + ctx.setFont(this.textFont); + ctx.fillText(this.number, this.x + x + 5, top_y + 15); + ctx.restore(); + } + ctx.fillRect(this.x + x, top_y, width, 1); + return this; + } +} +Volta.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_0__.Font.SANS_SERIF, + size: 9, + weight: _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.BOLD, + style: _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.NORMAL, +}; + + +/***/ }), + +/***/ "./src/stem.ts": +/*!*********************!*\ + !*** ./src/stem.ts ***! + \*********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Stem": () => (/* binding */ Stem) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// ## Description +// This file implements the `Stem` object. Generally this object is handled +// by its parent `StemmableNote`. + + + + +// eslint-disable-next-line +function L(...args) { + if (Stem.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_3__.log)('Vex.Flow.Stem', args); +} +class Stem extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + constructor(options) { + super(); + this.stem_up_y_offset = 0; + this.stem_down_y_offset = 0; + this.stem_up_y_base_offset = 0; + this.stem_down_y_base_offset = 0; + // Default notehead x bounds + this.x_begin = (options === null || options === void 0 ? void 0 : options.x_begin) || 0; + this.x_end = (options === null || options === void 0 ? void 0 : options.x_end) || 0; + // Y bounds for top/bottom most notehead + this.y_top = (options === null || options === void 0 ? void 0 : options.y_top) || 0; + this.y_bottom = (options === null || options === void 0 ? void 0 : options.y_bottom) || 0; + // Stem top extension + this.stem_extension = (options === null || options === void 0 ? void 0 : options.stem_extension) || 0; + // Direction of the stem + this.stem_direction = (options === null || options === void 0 ? void 0 : options.stem_direction) || 0; + // Flag to override all draw calls + this.hide = (options === null || options === void 0 ? void 0 : options.hide) || false; + this.isStemlet = (options === null || options === void 0 ? void 0 : options.isStemlet) || false; + this.stemletHeight = (options === null || options === void 0 ? void 0 : options.stemletHeight) || 0; + // Use to adjust the rendered height without affecting + // the results of `.getExtents()` + this.renderHeightAdjustment = 0; + this.setOptions(options); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_2__.Category.Stem; + } + // Stem directions + static get UP() { + return 1; + } + static get DOWN() { + return -1; + } + // Theme + static get WIDTH() { + return _tables__WEBPACK_IMPORTED_MODULE_1__.Tables.STEM_WIDTH; + } + static get HEIGHT() { + return _tables__WEBPACK_IMPORTED_MODULE_1__.Tables.STEM_HEIGHT; + } + setOptions(options) { + // Changing where the stem meets the head + this.stem_up_y_offset = (options === null || options === void 0 ? void 0 : options.stem_up_y_offset) || 0; + this.stem_down_y_offset = (options === null || options === void 0 ? void 0 : options.stem_down_y_offset) || 0; + this.stem_up_y_base_offset = (options === null || options === void 0 ? void 0 : options.stem_up_y_base_offset) || 0; + this.stem_down_y_base_offset = (options === null || options === void 0 ? void 0 : options.stem_down_y_base_offset) || 0; + } + // Set the x bounds for the default notehead + setNoteHeadXBounds(x_begin, x_end) { + this.x_begin = x_begin; + this.x_end = x_end; + return this; + } + // Set the direction of the stem in relation to the noteheads + setDirection(direction) { + this.stem_direction = direction; + } + // Set the extension for the stem, generally for flags or beams + setExtension(ext) { + this.stem_extension = ext; + } + getExtension() { + return this.stem_extension; + } + // The the y bounds for the top and bottom noteheads + setYBounds(y_top, y_bottom) { + this.y_top = y_top; + this.y_bottom = y_bottom; + } + // Gets the entire height for the stem + getHeight() { + const y_offset = this.stem_direction === Stem.UP ? this.stem_up_y_offset : this.stem_down_y_offset; + const unsigned_height = this.y_bottom - this.y_top + (Stem.HEIGHT - y_offset + this.stem_extension); // parentheses just for grouping. + return unsigned_height * this.stem_direction; + } + getBoundingBox() { + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('NotImplemented', 'getBoundingBox() not implemented.'); + } + // Get the y coordinates for the very base of the stem to the top of + // the extension + getExtents() { + const isStemUp = this.stem_direction === Stem.UP; + const ys = [this.y_top, this.y_bottom]; + const stemHeight = Stem.HEIGHT + this.stem_extension; + const innerMostNoteheadY = (isStemUp ? Math.min : Math.max)(...ys); + const outerMostNoteheadY = (isStemUp ? Math.max : Math.min)(...ys); + const stemTipY = innerMostNoteheadY + stemHeight * -this.stem_direction; + return { topY: stemTipY, baseY: outerMostNoteheadY }; + } + setVisibility(isVisible) { + this.hide = !isVisible; + return this; + } + setStemlet(isStemlet, stemletHeight) { + this.isStemlet = isStemlet; + this.stemletHeight = stemletHeight; + return this; + } + adjustHeightForFlag() { + this.renderHeightAdjustment = _tables__WEBPACK_IMPORTED_MODULE_1__.Tables.currentMusicFont().lookupMetric('stem.heightAdjustmentForFlag', -3); + } + adjustHeightForBeam() { + this.renderHeightAdjustment = -Stem.WIDTH / 2; + } + // Render the stem onto the canvas + draw() { + this.setRendered(); + if (this.hide) + return; + const ctx = this.checkContext(); + let stem_x; + let stem_y; + const stem_direction = this.stem_direction; + let y_base_offset = 0; + if (stem_direction === Stem.DOWN) { + // Down stems are rendered to the left of the head. + stem_x = this.x_begin; + stem_y = this.y_top + this.stem_down_y_offset; + y_base_offset = this.stem_down_y_base_offset; + } + else { + // Up stems are rendered to the right of the head. + stem_x = this.x_end; + stem_y = this.y_bottom - this.stem_up_y_offset; + y_base_offset = this.stem_up_y_base_offset; + } + const stemHeight = this.getHeight(); + L('Rendering stem - ', 'Top Y: ', this.y_top, 'Bottom Y: ', this.y_bottom); + // The offset from the stem's base which is required fo satisfy the stemlet height + const stemletYOffset = this.isStemlet ? stemHeight - this.stemletHeight * this.stem_direction : 0; + // Draw the stem + ctx.save(); + this.applyStyle(ctx); + ctx.beginPath(); + ctx.setLineWidth(Stem.WIDTH); + ctx.moveTo(stem_x, stem_y - stemletYOffset + y_base_offset); + ctx.lineTo(stem_x, stem_y - stemHeight - this.renderHeightAdjustment * stem_direction); + ctx.stroke(); + this.restoreStyle(ctx); + ctx.restore(); + } +} +/** To enable logging for this class. Set `Vex.Flow.Stem.DEBUG` to `true`. */ +Stem.DEBUG = false; + + +/***/ }), + +/***/ "./src/stemmablenote.ts": +/*!******************************!*\ + !*** ./src/stemmablenote.ts ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StemmableNote": () => (/* binding */ StemmableNote) +/* harmony export */ }); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./note */ "./src/note.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// ## Description +// `StemmableNote` is an abstract interface for notes with optional stems. +// Examples of stemmable notes are `StaveNote` and `TabNote` + + + + + + +class StemmableNote extends _note__WEBPACK_IMPORTED_MODULE_1__.Note { + constructor(noteStruct) { + super(noteStruct); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_4__.Category.StemmableNote; + } + // Get and set the note's `Stem` + getStem() { + return this.stem; + } + checkStem() { + if (!this.stem) { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('NoStem', 'No stem attached to instance'); + } + return this.stem; + } + setStem(stem) { + this.stem = stem; + return this; + } + // Builds and sets a new stem + buildStem() { + const stem = new _stem__WEBPACK_IMPORTED_MODULE_2__.Stem(); + this.setStem(stem); + return this; + } + buildFlag(category = 'flag') { + const { glyph } = this; + if (this.hasFlag()) { + const flagCode = this.getStemDirection() === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN ? glyph.code_flag_downstem : glyph.code_flag_upstem; + this.flag = new _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph(flagCode, this.render_options.glyph_font_scale, { category }); + } + } + // Get the custom glyph associated with the outer note head on the base of the stem. + getBaseCustomNoteHeadGlyph() { + if (this.getStemDirection() === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN) { + return this.customGlyphs[this.customGlyphs.length - 1]; + } + else { + return this.customGlyphs[0]; + } + } + // Get the full length of stem + getStemLength() { + return _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.HEIGHT + this.getStemExtension(); + } + // Get the number of beams for this duration + getBeamCount() { + const glyph = this.getGlyph(); + if (glyph) { + return glyph.beam_count; + } + else { + return 0; + } + } + // Get the minimum length of stem + getStemMinimumLength() { + const frac = _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.durationToFraction(this.duration); + let length = frac.value() <= 1 ? 0 : 20; + // if note is flagged, cannot shorten beam + switch (this.duration) { + case '8': + if (this.beam == undefined) + length = 35; + break; + case '16': + length = this.beam == undefined ? 35 : 25; + break; + case '32': + length = this.beam == undefined ? 45 : 35; + break; + case '64': + length = this.beam == undefined ? 50 : 40; + break; + case '128': + length = this.beam == undefined ? 55 : 45; + break; + default: + break; + } + return length; + } + // Get/set the direction of the stem + getStemDirection() { + if (!this.stem_direction) + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('NoStem', 'No stem attached to this note.'); + return this.stem_direction; + } + setStemDirection(direction) { + if (!direction) + direction = _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP; + if (direction !== _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP && direction !== _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN) { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('BadArgument', `Invalid stem direction: ${direction}`); + } + this.stem_direction = direction; + // Reset and reformat everything. Flag has to be built before calling getStemExtension. + this.reset(); + if (this.hasFlag()) { + this.buildFlag(); + } + this.beam = undefined; + if (this.stem) { + this.stem.setDirection(direction); + this.stem.setExtension(this.getStemExtension()); + // Lookup the base custom notehead (closest to the base of the stem) to extend or shorten + // the stem appropriately. If there's no custom note head, lookup the standard notehead. + const glyph = this.getBaseCustomNoteHeadGlyph() || this.getGlyph(); + // Get the font-specific customizations for the note heads. + const offsets = _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().lookupMetric(`stem.noteHead.${glyph.code_head}`, { + offsetYBaseStemUp: 0, + offsetYTopStemUp: 0, + offsetYBaseStemDown: 0, + offsetYTopStemDown: 0, + }); + // Configure the stem to use these offsets. + this.stem.setOptions({ + stem_up_y_offset: offsets.offsetYTopStemUp, + stem_down_y_offset: offsets.offsetYTopStemDown, + stem_up_y_base_offset: offsets.offsetYBaseStemUp, + stem_down_y_base_offset: offsets.offsetYBaseStemDown, // glyph.stem_down_y_base_offset, + }); + } + if (this.preFormatted) { + this.preFormat(); + } + return this; + } + // Get the `x` coordinate of the stem + getStemX() { + const x_begin = this.getAbsoluteX() + this.x_shift; + const x_end = this.getAbsoluteX() + this.x_shift + this.getGlyphWidth(); + const stem_x = this.stem_direction === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN ? x_begin : x_end; + return stem_x; + } + // Get the `x` coordinate for the center of the glyph. + // Used for `TabNote` stems and stemlets over rests + getCenterGlyphX() { + return this.getAbsoluteX() + this.x_shift + this.getGlyphWidth() / 2; + } + // Get the stem extension for the current duration + getStemExtension() { + const glyph = this.getGlyph(); + if (this.stem_extension_override != undefined) { + return this.stem_extension_override; + } + // Use stem_beam_extension with beams + if (this.beam) { + return glyph.stem_beam_extension; + } + const flagCode = this.getStemDirection() === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN ? this.glyph.code_flag_downstem : this.glyph.code_flag_upstem; + return Math.abs(_tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().lookupMetric(`glyphs.flag.${flagCode}.shiftY`, 0)); + } + // Set the stem length to a specific. Will override the default length. + setStemLength(height) { + this.stem_extension_override = height - _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.HEIGHT; + return this; + } + // Get the top and bottom `y` values of the stem. + getStemExtents() { + if (!this.stem) + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('NoStem', 'No stem attached to this note.'); + return this.stem.getExtents(); + } + /** Gets the `y` value for the top modifiers at a specific `textLine`. */ + getYForTopText(textLine) { + const stave = this.checkStave(); + if (this.hasStem()) { + const extents = this.getStemExtents(); + if (!extents) + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('InvalidState', 'Stem does not have extents.'); + return Math.min(stave.getYForTopText(textLine), extents.topY - this.render_options.annotation_spacing * (textLine + 1)); + } + else { + return stave.getYForTopText(textLine); + } + } + /** Gets the `y` value for the bottom modifiers at a specific `textLine`. */ + getYForBottomText(textLine) { + const stave = this.checkStave(); + if (this.hasStem()) { + const extents = this.getStemExtents(); + if (!extents) + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('InvalidState', 'Stem does not have extents.'); + return Math.max(stave.getYForTopText(textLine), extents.baseY + this.render_options.annotation_spacing * textLine); + } + else { + return stave.getYForBottomText(textLine); + } + } + hasFlag() { + return _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.getGlyphProps(this.duration).flag && !this.beam; + } + /** Post formats the note. */ + postFormat() { + var _a; + (_a = this.beam) === null || _a === void 0 ? void 0 : _a.postFormat(); + this.postFormatted = true; + return this; + } + /** Renders the stem onto the canvas. */ + drawStem(stemOptions) { + var _a; + this.checkContext(); + this.setRendered(); + this.setStem(new _stem__WEBPACK_IMPORTED_MODULE_2__.Stem(stemOptions)); + (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setContext(this.getContext()).draw(); + } +} + + +/***/ }), + +/***/ "./src/stringnumber.ts": +/*!*****************************!*\ + !*** ./src/stringnumber.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StringNumber": () => (/* binding */ StringNumber) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _renderer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./renderer */ "./src/renderer.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author: Larry Kuhns +// +// This file implements the `StringNumber` class which renders string +// number annotations beside notes. + + + + + + + +class StringNumber extends _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier { + constructor(number) { + super(); + this.string_number = number; + this.setWidth(20); // ??? + this.position = _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.ABOVE; // Default position above stem or note head + this.x_shift = 0; + this.y_shift = 0; + this.text_line = 0; + this.stem_offset = 0; + this.x_offset = 0; // Horizontal offset from default + this.y_offset = 0; // Vertical offset from default + this.dashed = true; // true - draw dashed extension false - no extension + this.leg = _renderer__WEBPACK_IMPORTED_MODULE_2__.Renderer.LineEndType.NONE; // draw upward/downward leg at the of extension line + this.radius = 8; + this.resetFont(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_5__.Category.StringNumber; + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + static get metrics() { + return _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.currentMusicFont().getMetrics().glyphs.stringNumber; + } + // ## Static Methods + // Arrange string numbers inside a `ModifierContext` + static format(nums, state) { + const left_shift = state.left_shift; + const right_shift = state.right_shift; + const num_spacing = 1; + if (!nums || nums.length === 0) + return false; + const nums_list = []; + let prev_note = null; + let shift_left = 0; + let shift_right = 0; + const modLines = 0; + for (let i = 0; i < nums.length; ++i) { + const num = nums[i]; + const note = num.getNote(); + const pos = num.getPosition(); + if (!(0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isStaveNote)(note)) { + throw new _util__WEBPACK_IMPORTED_MODULE_6__.RuntimeError('NoStaveNote'); + } + const index = num.checkIndex(); + const props = note.getKeyProps()[index]; + const mc = note.getModifierContext(); + const verticalSpaceNeeded = (num.radius * 2) / _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.STAVE_LINE_DISTANCE + 0.5; + if (mc) { + if (pos === _modifier__WEBPACK_IMPORTED_MODULE_1__.ModifierPosition.ABOVE) { + num.text_line = mc.getState().top_text_line; + state.top_text_line += verticalSpaceNeeded; + } + else if (pos === _modifier__WEBPACK_IMPORTED_MODULE_1__.ModifierPosition.BELOW) { + num.text_line = mc.getState().text_line; + state.text_line += verticalSpaceNeeded; + } + } + if (note !== prev_note) { + for (let n = 0; n < note.keys.length; ++n) { + if (left_shift === 0) { + shift_left = Math.max(note.getLeftDisplacedHeadPx(), shift_left); + } + if (right_shift === 0) { + shift_right = Math.max(note.getRightDisplacedHeadPx(), shift_right); + } + } + prev_note = note; + } + const glyphLine = modLines === 0 ? props.line : modLines; + nums_list.push({ + pos, + note, + num, + line: glyphLine, + shiftL: shift_left, + shiftR: shift_right, + }); + } + // Sort string numbers by line number. + nums_list.sort((a, b) => b.line - a.line); + let num_shiftR = 0; + let x_widthL = 0; + let x_widthR = 0; + let last_line = null; + let last_note = null; + for (let i = 0; i < nums_list.length; ++i) { + let num_shift = 0; + const note = nums_list[i].note; + const pos = nums_list[i].pos; + const num = nums_list[i].num; + const line = nums_list[i].line; + const shiftR = nums_list[i].shiftR; + // Reset the position of the string number every line. + if (line !== last_line || note !== last_note) { + num_shiftR = right_shift + shiftR; + } + const num_width = num.getWidth() + num_spacing; + if (pos === _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.LEFT) { + num.setXShift(left_shift); + num_shift = shift_left + num_width; // spacing + x_widthL = num_shift > x_widthL ? num_shift : x_widthL; + } + else if (pos === _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.RIGHT) { + num.setXShift(num_shiftR); + num_shift += num_width; // spacing + x_widthR = num_shift > x_widthR ? num_shift : x_widthR; + } + last_line = line; + last_note = note; + } + state.left_shift += x_widthL; + state.right_shift += x_widthR; + return true; + } + setLineEndType(leg) { + if (leg >= _renderer__WEBPACK_IMPORTED_MODULE_2__.Renderer.LineEndType.NONE && leg <= _renderer__WEBPACK_IMPORTED_MODULE_2__.Renderer.LineEndType.DOWN) { + this.leg = leg; + } + return this; + } + setStringNumber(number) { + this.string_number = number; + return this; + } + setOffsetX(x) { + this.x_offset = x; + return this; + } + setOffsetY(y) { + this.y_offset = y; + return this; + } + setLastNote(note) { + this.last_note = note; + return this; + } + setDashed(dashed) { + this.dashed = dashed; + return this; + } + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const start = note.getModifierStartXY(this.position, this.index); + const stemDirection = note.hasStem() ? note.getStemDirection() : _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP; + let dot_x = start.x + this.x_shift + this.x_offset; + let stem_ext = {}; + if (note.hasStem()) { + stem_ext = note.checkStem().getExtents(); + } + let dot_y = start.y + this.y_shift + this.y_offset; + switch (this.position) { + case _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.ABOVE: + { + const ys = note.getYs(); + dot_y = ys.reduce((a, b) => (a < b ? a : b)); + if (note.hasStem() && stemDirection == _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP) { + dot_y = stem_ext.topY + StringNumber.metrics.stemPadding; + } + dot_y -= this.radius + StringNumber.metrics.verticalPadding + this.text_line * _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.STAVE_LINE_DISTANCE; + } + break; + case _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.BELOW: + { + const ys = note.getYs(); + dot_y = ys.reduce((a, b) => (a > b ? a : b)); + if (note.hasStem() && stemDirection == _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.DOWN) { + dot_y = stem_ext.topY - StringNumber.metrics.stemPadding; + } + dot_y += this.radius + StringNumber.metrics.verticalPadding + this.text_line * _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.STAVE_LINE_DISTANCE; + } + break; + case _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.LEFT: + dot_x -= this.radius / 2 + StringNumber.metrics.leftPadding; + break; + case _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.RIGHT: + dot_x += this.radius / 2 + StringNumber.metrics.rightPadding; + break; + default: + throw new _util__WEBPACK_IMPORTED_MODULE_6__.RuntimeError('InvalidPosition', `The position ${this.position} is invalid`); + } + ctx.save(); + ctx.beginPath(); + ctx.arc(dot_x, dot_y, this.radius, 0, Math.PI * 2, false); + ctx.setLineWidth(1.5); + ctx.stroke(); + ctx.setFont(this.textFont); + const x = dot_x - ctx.measureText(this.string_number).width / 2; + ctx.fillText('' + this.string_number, x, dot_y + 4.5); + const lastNote = this.last_note; + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isStemmableNote)(lastNote)) { + // Only StemmableNote objects have getStemX(). + const end = lastNote.getStemX() - note.getX() + 5; + ctx.setStrokeStyle('#000000'); + ctx.setLineCap('round'); + ctx.setLineWidth(0.6); + if (this.dashed) { + _renderer__WEBPACK_IMPORTED_MODULE_2__.Renderer.drawDashedLine(ctx, dot_x + 10, dot_y, dot_x + end, dot_y, [3, 3]); + } + else { + _renderer__WEBPACK_IMPORTED_MODULE_2__.Renderer.drawDashedLine(ctx, dot_x + 10, dot_y, dot_x + end, dot_y, [3, 0]); + } + let len; + let pattern; + switch (this.leg) { + case _renderer__WEBPACK_IMPORTED_MODULE_2__.Renderer.LineEndType.UP: + len = -10; + pattern = this.dashed ? [3, 3] : [3, 0]; + _renderer__WEBPACK_IMPORTED_MODULE_2__.Renderer.drawDashedLine(ctx, dot_x + end, dot_y, dot_x + end, dot_y + len, pattern); + break; + case _renderer__WEBPACK_IMPORTED_MODULE_2__.Renderer.LineEndType.DOWN: + len = 10; + pattern = this.dashed ? [3, 3] : [3, 0]; + _renderer__WEBPACK_IMPORTED_MODULE_2__.Renderer.drawDashedLine(ctx, dot_x + end, dot_y, dot_x + end, dot_y + len, pattern); + break; + default: + break; + } + } + ctx.restore(); + } +} +StringNumber.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_0__.Font.SANS_SERIF, + size: _font__WEBPACK_IMPORTED_MODULE_0__.Font.SIZE, + weight: _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.BOLD, + style: _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.NORMAL, +}; + + +/***/ }), + +/***/ "./src/strokes.ts": +/*!************************!*\ + !*** ./src/strokes.ts ***! + \************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Stroke": () => (/* binding */ Stroke) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author: Larry Kuhns +// +// This file implements the `Stroke` class which renders chord strokes +// that can be arpeggiated, brushed, rasquedo, etc. + + + + + +class Stroke extends _modifier__WEBPACK_IMPORTED_MODULE_2__.Modifier { + constructor(type, options) { + super(); + this.options = Object.assign({ all_voices: true }, options); + // multi voice - span stroke across all voices if true + this.all_voices = this.options.all_voices; + // multi voice - end note of stroke, set in draw() + this.type = type; + this.position = _modifier__WEBPACK_IMPORTED_MODULE_2__.Modifier.Position.LEFT; + this.render_options = { + font_scale: 38, + }; + this.resetFont(); + this.setXShift(0); + this.setWidth(10); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.Stroke; + } + // Arrange strokes inside `ModifierContext` + static format(strokes, state) { + const left_shift = state.left_shift; + const stroke_spacing = 0; + if (!strokes || strokes.length === 0) + return false; + const strokeList = strokes.map((stroke) => { + const note = stroke.getNote(); + const index = stroke.checkIndex(); + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_3__.isStaveNote)(note)) { + // Only StaveNote objects have getKeyProps(). + const { line } = note.getKeyProps()[index]; + const shift = note.getLeftDisplacedHeadPx(); + return { line, shift, stroke }; + } + else if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_3__.isTabNote)(note)) { + // Only TabNote objects have getPositions(). + const { str: string } = note.getPositions()[index]; + return { line: string, shift: 0, stroke }; + } + else { + throw new _util__WEBPACK_IMPORTED_MODULE_4__.RuntimeError('Internal', 'Unexpected instance.'); + } + }); + const strokeShift = left_shift; + // There can only be one stroke .. if more than one, they overlay each other + const xShift = strokeList.reduce((xShift, { stroke, shift }) => { + stroke.setXShift(strokeShift + shift); + return Math.max(stroke.getWidth() + stroke_spacing, xShift); + }, 0); + state.left_shift += xShift; + return true; + } + getPosition() { + return this.position; + } + addEndNote(note) { + this.note_end = note; + return this; + } + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const start = note.getModifierStartXY(this.position, this.index); + let ys = note.getYs(); + let topY = start.y; + let botY = start.y; + const x = start.x - 5; + const line_space = note.checkStave().getSpacingBetweenLines(); + const notes = this.checkModifierContext().getMembers(note.getCategory()); + for (let i = 0; i < notes.length; i++) { + const note = notes[i]; + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_3__.isNote)(note)) { + // Only Note objects have getYs(). + // note is an instance of either StaveNote or TabNote. + ys = note.getYs(); + for (let n = 0; n < ys.length; n++) { + if (this.note === notes[i] || this.all_voices) { + topY = Math.min(topY, ys[n]); + botY = Math.max(botY, ys[n]); + } + } + } + } + let arrow = ''; + let arrow_shift_x = 0; + let arrow_y = 0; + let text_shift_x = 0; + let text_y = 0; + switch (this.type) { + case Stroke.Type.BRUSH_DOWN: + arrow = 'arrowheadBlackUp'; + arrow_shift_x = -3; + arrow_y = topY - line_space / 2 + 10; + botY += line_space / 2; + break; + case Stroke.Type.BRUSH_UP: + arrow = 'arrowheadBlackDown'; + arrow_shift_x = 0.5; + arrow_y = botY + line_space / 2; + topY -= line_space / 2; + break; + case Stroke.Type.ROLL_DOWN: + case Stroke.Type.RASQUEDO_DOWN: + arrow = 'arrowheadBlackUp'; + arrow_shift_x = -3; + text_shift_x = this.x_shift + arrow_shift_x - 2; + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_3__.isStaveNote)(note)) { + topY += 1.5 * line_space; + if ((botY - topY) % 2 !== 0) { + botY += 0.5 * line_space; + } + else { + botY += line_space; + } + arrow_y = topY - line_space; + text_y = botY + line_space + 2; + } + else { + topY += 1.5 * line_space; + botY += line_space; + arrow_y = topY - 0.75 * line_space; + text_y = botY + 0.25 * line_space; + } + break; + case Stroke.Type.ROLL_UP: + case Stroke.Type.RASQUEDO_UP: + arrow = 'arrowheadBlackDown'; + arrow_shift_x = -4; + text_shift_x = this.x_shift + arrow_shift_x - 1; + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_3__.isStaveNote)(note)) { + arrow_y = line_space / 2; + topY += 0.5 * line_space; + if ((botY - topY) % 2 === 0) { + botY += line_space / 2; + } + arrow_y = botY + 0.5 * line_space; + text_y = topY - 1.25 * line_space; + } + else { + topY += 0.25 * line_space; + botY += 0.5 * line_space; + arrow_y = botY + 0.25 * line_space; + text_y = topY - line_space; + } + break; + case Stroke.Type.ARPEGGIO_DIRECTIONLESS: + topY += 0.5 * line_space; + botY += line_space; // * 0.5 can lead to slight underlap instead of overlap sometimes + break; + default: + throw new _util__WEBPACK_IMPORTED_MODULE_4__.RuntimeError('InvalidType', `The stroke type ${this.type} does not exist`); + } + let strokeLine = 'straight'; + // Draw the stroke + if (this.type === Stroke.Type.BRUSH_DOWN || this.type === Stroke.Type.BRUSH_UP) { + ctx.fillRect(x + this.x_shift, topY, 1, botY - topY); + } + else { + strokeLine = 'wiggly'; + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_3__.isStaveNote)(note)) { + for (let i = topY; i <= botY; i += line_space) { + _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.renderGlyph(ctx, x + this.x_shift - 4, i, this.render_options.font_scale, 'vexWiggleArpeggioUp'); + } + } + else { + let i; + for (i = topY; i <= botY; i += 10) { + _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.renderGlyph(ctx, x + this.x_shift - 4, i, this.render_options.font_scale, 'vexWiggleArpeggioUp'); + } + if (this.type === Stroke.Type.RASQUEDO_DOWN) { + text_y = i + 0.25 * line_space; + } + } + } + if (this.type === Stroke.Type.ARPEGGIO_DIRECTIONLESS) { + return; // skip drawing arrow heads or text + } + // Draw the arrow head + _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.renderGlyph(ctx, x + this.x_shift + arrow_shift_x, arrow_y, this.render_options.font_scale, arrow, { + category: `stroke.${arrow}.${strokeLine}`, + }); + // Draw the rasquedo "R" + if (this.type === Stroke.Type.RASQUEDO_DOWN || this.type === Stroke.Type.RASQUEDO_UP) { + ctx.save(); + ctx.setFont(this.textFont); + ctx.fillText('R', x + text_shift_x, text_y); + ctx.restore(); + } + } +} +Stroke.Type = { + BRUSH_DOWN: 1, + BRUSH_UP: 2, + ROLL_DOWN: 3, + ROLL_UP: 4, + RASQUEDO_DOWN: 5, + RASQUEDO_UP: 6, + ARPEGGIO_DIRECTIONLESS: 7, // Arpeggiated chord without upwards or downwards arrow +}; +Stroke.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_0__.Font.SERIF, + size: _font__WEBPACK_IMPORTED_MODULE_0__.Font.SIZE, + weight: _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.BOLD, + style: _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.ITALIC, +}; + + +/***/ }), + +/***/ "./src/svgcontext.ts": +/*!***************************!*\ + !*** ./src/svgcontext.ts ***! + \***************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "SVGContext": () => (/* binding */ SVGContext) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _rendercontext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./rendercontext */ "./src/rendercontext.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// @author Gregory Ristow (2015) + + + +/** For a particular element type (e.g., rect), we will not apply certain presentation attributes. */ +const ATTRIBUTES_TO_IGNORE = { + path: { + x: true, + y: true, + width: true, + height: true, + 'font-family': true, + 'font-weight': true, + 'font-style': true, + 'font-size': true, + }, + rect: { + 'font-family': true, + 'font-weight': true, + 'font-style': true, + 'font-size': true, + }, + text: { + width: true, + height: true, + }, +}; +/** Create the SVG in the SVG namespace. */ +const SVG_NS = 'http://www.w3.org/2000/svg'; +const TWO_PI = 2 * Math.PI; +class MeasureTextCache { + constructor() { + // The cache is keyed first by the text string, then by the font attributes + // joined together. + this.cache = {}; + } + lookup(text, svg, attributes) { + let entries = this.cache[text]; + if (entries === undefined) { + entries = {}; + this.cache[text] = entries; + } + const family = attributes['font-family']; + const size = attributes['font-size']; + const weight = attributes['font-weight']; + const style = attributes['font-style']; + const key = `${family}%${size}%${weight}%${style}`; + let entry = entries[key]; + if (entry === undefined) { + entry = this.measureImpl(text, svg, attributes); + entries[key] = entry; + } + return entry; + } + measureImpl(text, svg, attributes) { + let txt = this.txt; + if (!txt) { + // Create the SVG text element that will be used to measure text in the event + // of a cache miss. + txt = document.createElementNS(SVG_NS, 'text'); + this.txt = txt; + } + txt.textContent = text; + txt.setAttributeNS(null, 'font-family', attributes['font-family']); + txt.setAttributeNS(null, 'font-size', attributes['font-size']); + txt.setAttributeNS(null, 'font-style', attributes['font-style']); + txt.setAttributeNS(null, 'font-weight', attributes['font-weight']); + svg.appendChild(txt); + const bbox = txt.getBBox(); + svg.removeChild(txt); + return { x: bbox.x, y: bbox.y, width: bbox.width, height: bbox.height }; + } +} +/** + * SVG rendering context with an API similar to CanvasRenderingContext2D. + */ +class SVGContext extends _rendercontext__WEBPACK_IMPORTED_MODULE_1__.RenderContext { + constructor(element) { + super(); + this.width = 0; + this.height = 0; + this.backgroundFillStyle = 'white'; + /** Formatted as CSS font shorthand (e.g., 'italic bold 12pt Arial') */ + this.fontCSSString = ''; + this.element = element; + // Create a SVG element and add it to the container element. + const svg = this.create('svg'); + this.element.appendChild(svg); + this.svg = svg; + this.parent = this.svg; + this.groups = [this.svg]; + this.path = ''; + this.pen = { x: NaN, y: NaN }; + this.lineWidth = 1.0; + const defaultFontAttributes = { + 'font-family': _font__WEBPACK_IMPORTED_MODULE_0__.Font.SANS_SERIF, + 'font-size': _font__WEBPACK_IMPORTED_MODULE_0__.Font.SIZE + 'pt', + 'font-weight': _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.NORMAL, + 'font-style': _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.NORMAL, + }; + this.state = Object.assign({ scale: { x: 1, y: 1 } }, defaultFontAttributes); + this.attributes = Object.assign({ 'stroke-width': 0.3, 'stroke-dasharray': 'none', fill: 'black', stroke: 'black' }, defaultFontAttributes); + this.shadow_attributes = { + width: 0, + color: 'black', + }; + this.state_stack = []; + } + create(svgElementType) { + return document.createElementNS(SVG_NS, svgElementType); + } + // Allow grouping elements in containers for interactivity. + openGroup(cls, id, attrs) { + const group = this.create('g'); + this.groups.push(group); + this.parent.appendChild(group); + this.parent = group; + if (cls) + group.setAttribute('class', (0,_util__WEBPACK_IMPORTED_MODULE_2__.prefix)(cls)); + if (id) + group.setAttribute('id', (0,_util__WEBPACK_IMPORTED_MODULE_2__.prefix)(id)); + if (attrs && attrs.pointerBBox) { + group.setAttribute('pointer-events', 'bounding-box'); + } + return group; + } + closeGroup() { + this.groups.pop(); + this.parent = this.groups[this.groups.length - 1]; + } + add(elem) { + this.parent.appendChild(elem); + } + setFillStyle(style) { + this.attributes.fill = style; + return this; + } + /** + * Used to set the fill color for `clearRect()`. This allows us to simulate + * cutting a "hole" into the SVG drawing. + */ + setBackgroundFillStyle(style) { + this.backgroundFillStyle = style; + return this; + } + setStrokeStyle(style) { + this.attributes.stroke = style; + return this; + } + setShadowColor(color) { + this.shadow_attributes.color = color; + return this; + } + /** + * @param blur A non-negative float specifying the level of shadow blur, where 0 + * represents no blur and larger numbers represent increasingly more blur. + * @returns this + */ + setShadowBlur(blur) { + this.shadow_attributes.width = blur; + return this; + } + /** + * @param width + * @returns this + */ + setLineWidth(width) { + this.attributes['stroke-width'] = width; + this.lineWidth = width; + return this; + } + /** + * @param lineDash an array of integers in the form of [dash, space, dash, space, etc...] + * @returns this + * + * See: [SVG `stroke-dasharray` attribute](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray) + */ + setLineDash(lineDash) { + if (Object.prototype.toString.call(lineDash) === '[object Array]') { + this.attributes['stroke-dasharray'] = lineDash.join(','); + return this; + } + else { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('ArgumentError', 'lineDash must be an array of integers.'); + } + } + /** + * @param capType + * @returns this + */ + setLineCap(capType) { + this.attributes['stroke-linecap'] = capType; + return this; + } + // ### Sizing & Scaling Methods: + // TODO (GCR): See note at scale() -- separate our internal + // conception of pixel-based width/height from the style.width + // and style.height properties eventually to allow users to + // apply responsive sizing attributes to the SVG. + resize(width, height) { + this.width = width; + this.height = height; + this.element.style.width = width.toString(); + this.svg.style.width = width.toString(); + this.svg.style.height = height.toString(); + const attributes = { + width, + height, + }; + this.applyAttributes(this.svg, attributes); + this.scale(this.state.scale.x, this.state.scale.y); + return this; + } + scale(x, y) { + // uses viewBox to scale + // TODO (GCR): we may at some point want to distinguish the + // style.width / style.height properties that are applied to + // the SVG object from our internal conception of the SVG + // width/height. This would allow us to create automatically + // scaling SVG's that filled their containers, for instance. + // + // As this isn't implemented in Canvas contexts, + // I've left as is for now, but in using the viewBox to + // handle internal scaling, am trying to make it possible + // for us to eventually move in that direction. + this.state.scale = { x, y }; + const visibleWidth = this.width / x; + const visibleHeight = this.height / y; + this.setViewBox(0, 0, visibleWidth, visibleHeight); + return this; + } + /** + * 1 arg: string in the "x y w h" format + * 4 args: x:number, y:number, w:number, h:number + */ + setViewBox(viewBox_or_minX, minY, width, height) { + if (typeof viewBox_or_minX === 'string') { + this.svg.setAttribute('viewBox', viewBox_or_minX); + } + else { + const viewBoxString = viewBox_or_minX + ' ' + minY + ' ' + width + ' ' + height; + this.svg.setAttribute('viewBox', viewBoxString); + } + } + // ### Drawing helper methods: + applyAttributes(element, attributes) { + const attrNamesToIgnore = ATTRIBUTES_TO_IGNORE[element.nodeName]; + for (const attrName in attributes) { + if (attrNamesToIgnore && attrNamesToIgnore[attrName]) { + continue; + } + element.setAttributeNS(null, attrName, attributes[attrName]); + } + return element; + } + // ### Shape & Path Methods: + clear() { + // Clear the SVG by removing all inner children. + // (This approach is usually slightly more efficient + // than removing the old SVG & adding a new one to + // the container element, since it does not cause the + // container to resize twice. Also, the resize + // triggered by removing the entire SVG can trigger + // a touchcancel event when the element resizes away + // from a touch point.) + while (this.svg.lastChild) { + this.svg.removeChild(this.svg.lastChild); + } + // Replace the viewbox attribute we just removed. + this.scale(this.state.scale.x, this.state.scale.y); + } + // ## Rectangles: + rect(x, y, width, height, attributes) { + // Avoid invalid negative height attributes by flipping the rectangle on its head: + if (height < 0) { + y += height; + height *= -1; + } + const rectangle = this.create('rect'); + attributes = attributes !== null && attributes !== void 0 ? attributes : { fill: 'none', 'stroke-width': this.lineWidth, stroke: 'black' }; + this.applyAttributes(rectangle, Object.assign({ x, y, width, height }, attributes)); + this.add(rectangle); + return this; + } + fillRect(x, y, width, height) { + const attributes = { fill: this.attributes.fill }; + this.rect(x, y, width, height, attributes); + return this; + } + clearRect(x, y, width, height) { + // Currently this fills a rect with the backgroundFillStyle, rather + // than "cut a hole" into the existing shapes. + // + // Since tabNote seems to be the only module that makes use of this + // it may be worth creating a separate tabStave that would + // draw lines around locations of tablature fingering. + this.rect(x, y, width, height, { 'stroke-width': 0, fill: this.backgroundFillStyle }); + return this; + } + // ## Paths: + beginPath() { + this.path = ''; + this.pen.x = NaN; + this.pen.y = NaN; + return this; + } + moveTo(x, y) { + this.path += 'M' + x + ' ' + y; + this.pen.x = x; + this.pen.y = y; + return this; + } + lineTo(x, y) { + this.path += 'L' + x + ' ' + y; + this.pen.x = x; + this.pen.y = y; + return this; + } + bezierCurveTo(x1, y1, x2, y2, x, y) { + this.path += 'C' + x1 + ' ' + y1 + ',' + x2 + ' ' + y2 + ',' + x + ' ' + y; + this.pen.x = x; + this.pen.y = y; + return this; + } + quadraticCurveTo(x1, y1, x, y) { + this.path += 'Q' + x1 + ' ' + y1 + ',' + x + ' ' + y; + this.pen.x = x; + this.pen.y = y; + return this; + } + arc(x, y, radius, startAngle, endAngle, counterclockwise) { + const x0 = x + radius * Math.cos(startAngle); + const y0 = y + radius * Math.sin(startAngle); + // Handle the edge case where arc length is greater than or equal to + // the circle's circumference: + // https://html.spec.whatwg.org/multipage/canvas.html#ellipse-method-steps + if ((!counterclockwise && endAngle - startAngle >= TWO_PI) || + (counterclockwise && startAngle - endAngle >= TWO_PI)) { + const x1 = x + radius * Math.cos(startAngle + Math.PI); + const y1 = y + radius * Math.sin(startAngle + Math.PI); + // There's no way to specify a completely circular arc in SVG so we have to + // use two semi-circular arcs. + this.path += `M${x0} ${y0} A${radius} ${radius} 0 0 0 ${x1} ${y1} `; + this.path += `A${radius} ${radius} 0 0 0 ${x0} ${y0}`; + this.pen.x = x0; + this.pen.y = y0; + } + else { + const x1 = x + radius * Math.cos(endAngle); + const y1 = y + radius * Math.sin(endAngle); + startAngle = (0,_util__WEBPACK_IMPORTED_MODULE_2__.normalizeAngle)(startAngle); + endAngle = (0,_util__WEBPACK_IMPORTED_MODULE_2__.normalizeAngle)(endAngle); + let large; + if (Math.abs(endAngle - startAngle) < Math.PI) { + large = counterclockwise; + } + else { + large = !counterclockwise; + } + if (startAngle > endAngle) { + large = !large; + } + const sweep = !counterclockwise; + this.path += `M${x0} ${y0} A${radius} ${radius} 0 ${+large} ${+sweep} ${x1} ${y1}`; + this.pen.x = x1; + this.pen.y = y1; + } + return this; + } + closePath() { + this.path += 'Z'; + return this; + } + getShadowStyle() { + const sa = this.shadow_attributes; + // A CSS drop-shadow filter blur looks different than a canvas shadowBlur + // of the same radius, so we scale the drop-shadow radius here to make it + // look close to the canvas shadow. + return `filter: drop-shadow(0 0 ${sa.width / 1.5}px ${sa.color})`; + } + fill(attributes) { + const path = this.create('path'); + if (typeof attributes === 'undefined') { + attributes = Object.assign(Object.assign({}, this.attributes), { stroke: 'none' }); + } + attributes.d = this.path; + if (this.shadow_attributes.width > 0) { + attributes.style = this.getShadowStyle(); + } + this.applyAttributes(path, attributes); + this.add(path); + return this; + } + stroke() { + const path = this.create('path'); + const attributes = Object.assign(Object.assign({}, this.attributes), { fill: 'none', 'stroke-width': this.lineWidth, d: this.path }); + if (this.shadow_attributes.width > 0) { + attributes.style = this.getShadowStyle(); + } + this.applyAttributes(path, attributes); + this.add(path); + return this; + } + // ## Text Methods: + measureText(text) { + return SVGContext.measureTextCache.lookup(text, this.svg, this.attributes); + } + fillText(text, x, y) { + if (!text || text.length <= 0) { + return this; + } + const attributes = Object.assign(Object.assign({}, this.attributes), { stroke: 'none', x, + y }); + const txt = this.create('text'); + txt.textContent = text; + this.applyAttributes(txt, attributes); + this.add(txt); + return this; + } + // TODO: State should be deep-copied. + save() { + this.state_stack.push({ + state: { + 'font-family': this.state['font-family'], + 'font-weight': this.state['font-weight'], + 'font-style': this.state['font-style'], + 'font-size': this.state['font-size'], + scale: this.state.scale, + }, + attributes: { + 'font-family': this.attributes['font-family'], + 'font-weight': this.attributes['font-weight'], + 'font-style': this.attributes['font-style'], + 'font-size': this.attributes['font-size'], + fill: this.attributes.fill, + stroke: this.attributes.stroke, + 'stroke-width': this.attributes['stroke-width'], + 'stroke-dasharray': this.attributes['stroke-dasharray'], + }, + shadow_attributes: { + width: this.shadow_attributes.width, + color: this.shadow_attributes.color, + }, + lineWidth: this.lineWidth, + }); + return this; + } + // TODO: State should be deep-restored. + restore() { + const savedState = this.state_stack.pop(); + if (savedState) { + const state = savedState; + this.state['font-family'] = state.state['font-family']; + this.state['font-weight'] = state.state['font-weight']; + this.state['font-style'] = state.state['font-style']; + this.state['font-size'] = state.state['font-size']; + this.state.scale = state.state.scale; + this.attributes['font-family'] = state.attributes['font-family']; + this.attributes['font-weight'] = state.attributes['font-weight']; + this.attributes['font-style'] = state.attributes['font-style']; + this.attributes['font-size'] = state.attributes['font-size']; + this.attributes.fill = state.attributes.fill; + this.attributes.stroke = state.attributes.stroke; + this.attributes['stroke-width'] = state.attributes['stroke-width']; + this.attributes['stroke-dasharray'] = state.attributes['stroke-dasharray']; + this.shadow_attributes.width = state.shadow_attributes.width; + this.shadow_attributes.color = state.shadow_attributes.color; + this.lineWidth = state.lineWidth; + } + return this; + } + set fillStyle(style) { + this.setFillStyle(style); + } + get fillStyle() { + return this.attributes.fill; + } + set strokeStyle(style) { + this.setStrokeStyle(style); + } + get strokeStyle() { + return this.attributes.stroke; + } + /** + * @param f is 1) a `FontInfo` object or + * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or + * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided). + * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt'). + * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900). It is inserted + * into the font-weight attribute (e.g., font-weight="bold") + * @param style is a string (e.g., 'italic', 'normal') that is inserted into the + * font-style attribute (e.g., font-style="italic") + */ + setFont(f, size, weight, style) { + const fontInfo = _font__WEBPACK_IMPORTED_MODULE_0__.Font.validate(f, size, weight, style); + this.fontCSSString = _font__WEBPACK_IMPORTED_MODULE_0__.Font.toCSSString(fontInfo); + const fontAttributes = { + 'font-family': fontInfo.family, + 'font-size': fontInfo.size, + 'font-weight': fontInfo.weight, + 'font-style': fontInfo.style, + }; + this.attributes = Object.assign(Object.assign({}, this.attributes), fontAttributes); + this.state = Object.assign(Object.assign({}, this.state), fontAttributes); + return this; + } + /** Return a string of the form `'italic bold 15pt Arial'` */ + getFont() { + return this.fontCSSString; + } +} +SVGContext.measureTextCache = new MeasureTextCache(); + + +/***/ }), + +/***/ "./src/system.ts": +/*!***********************!*\ + !*** ./src/system.ts ***! + \***********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "System": () => (/* binding */ System) +/* harmony export */ }); +/* harmony import */ var _boundingbox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./boundingbox */ "./src/boundingbox.ts"); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _formatter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./formatter */ "./src/formatter.ts"); +/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./note */ "./src/note.ts"); +/* harmony import */ var _stave__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./stave */ "./src/stave.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + + + +/** + * System implements a musical system, which is a collection of staves, + * each which can have one or more voices. All voices across all staves in + * the system are formatted together. + */ +class System extends _element__WEBPACK_IMPORTED_MODULE_1__.Element { + constructor(params = {}) { + super(); + this.setOptions(params); + this.parts = []; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_5__.Category.System; + } + /** Set formatting options. */ + setOptions(options = {}) { + if (!options.factory) { + throw new _util__WEBPACK_IMPORTED_MODULE_6__.RuntimeError('NoFactory', 'System.setOptions(options) requires a factory.'); + } + this.factory = options.factory; + this.options = Object.assign(Object.assign({ factory: this.factory, x: 10, y: 10, width: 500, spaceBetweenStaves: 12, autoWidth: false, noJustification: false, debugFormatter: false, formatIterations: 0, noPadding: false }, options), { details: Object.assign({ alpha: 0.5 }, options.details), formatOptions: Object.assign({}, options.formatOptions) }); + if (this.options.noJustification === false && typeof options.width === 'undefined') { + this.options.autoWidth = true; + } + } + /** Set associated context. */ + setContext(context) { + super.setContext(context); + this.factory.setContext(context); + return this; + } + /** + * Add connector between staves. + * @param type see {@link StaveConnector.typeString} + */ + addConnector(type = 'double') { + this.connector = this.factory.StaveConnector({ + top_stave: this.parts[0].stave, + bottom_stave: this.parts[this.parts.length - 1].stave, + type, + }); + return this.connector; + } + /** + * Add a stave to the system. + * + * Example (one voice): + * + * `system.addStave({voices: [score.voice(score.notes('C#5/q, B4, A4, G#4'))]});` + * + * Example (two voices): + * + * `system.addStave({voices: [` + * `score.voice(score.notes('C#5/q, B4, A4, G#4', {stem: 'up'})),` + * `score.voice(score.notes('C#4/h, C#4', {stem: 'down'}))` + * `]});` + */ + addStave(params) { + var _a; + const staveOptions = Object.assign({ left_bar: false }, params.options); + const stave = (_a = params.stave) !== null && _a !== void 0 ? _a : this.factory.Stave({ x: this.options.x, y: this.options.y, width: this.options.width, options: staveOptions }); + const p = Object.assign(Object.assign({ stave, + /* voices: [], */ + spaceAbove: 0, spaceBelow: 0, debugNoteMetrics: false, noJustification: false }, params), { options: staveOptions }); + const ctx = this.getContext(); + p.voices.forEach((voice) => voice + .setContext(ctx) + .setStave(stave) + .getTickables() + .forEach((tickable) => tickable.setStave(stave))); + this.parts.push(p); + return stave; + } + /** Format the system. */ + format() { + const options_details = this.options.details; + let justifyWidth = 0; + const formatter = new _formatter__WEBPACK_IMPORTED_MODULE_2__.Formatter(options_details); + this.formatter = formatter; + let y = this.options.y; + let startX = 0; + let allVoices = []; + const debugNoteMetricsYs = []; + // Join the voices for each stave. + this.parts.forEach((part) => { + y = y + part.stave.space(part.spaceAbove); + part.stave.setY(y); + if (this.options.autoWidth) { + part.voices.forEach((voice) => { + formatter.joinVoices([voice]); + }); + } + else { + formatter.joinVoices(part.voices); + } + y = y + part.stave.space(part.spaceBelow); + y = y + part.stave.space(this.options.spaceBetweenStaves); + if (part.debugNoteMetrics) { + debugNoteMetricsYs.push({ y, voice: part.voices[0] }); + y += 15; + } + allVoices = allVoices.concat(part.voices); + startX = Math.max(startX, part.stave.getNoteStartX()); + }); + // Update the start position of all staves. + this.parts.forEach((part) => part.stave.setNoteStartX(startX)); + if (this.options.autoWidth) { + justifyWidth = formatter.preCalculateMinTotalWidth(allVoices); + this.parts.forEach((part) => { + part.stave.setWidth(justifyWidth + _stave__WEBPACK_IMPORTED_MODULE_4__.Stave.rightPadding + (startX - this.options.x)); + }); + } + else { + justifyWidth = this.options.noPadding + ? this.options.width - this.options.x + : this.options.width - (startX - this.options.x) - _stave__WEBPACK_IMPORTED_MODULE_4__.Stave.defaultPadding; + } + formatter.format(allVoices, this.options.noJustification ? 0 : justifyWidth, this.options.formatOptions); + for (let i = 0; i < this.options.formatIterations; i++) { + formatter.tune(options_details); + } + this.startX = startX; + this.debugNoteMetricsYs = debugNoteMetricsYs; + this.lastY = y; + this.boundingBox = new _boundingbox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox(this.options.x, this.options.y, this.options.width, this.lastY - this.options.y); + } + /** Render the system. */ + draw() { + // Render debugging information, if requested. + const ctx = this.checkContext(); + if (!this.formatter || !this.startX || !this.lastY || !this.debugNoteMetricsYs) { + throw new _util__WEBPACK_IMPORTED_MODULE_6__.RuntimeError('NoFormatter', 'format() must be called before draw()'); + } + this.setRendered(); + if (this.options.debugFormatter) { + _formatter__WEBPACK_IMPORTED_MODULE_2__.Formatter.plotDebugging(ctx, this.formatter, this.startX, this.options.y, this.lastY); + } + this.debugNoteMetricsYs.forEach((d) => { + d.voice.getTickables().forEach((tickable) => _note__WEBPACK_IMPORTED_MODULE_3__.Note.plotMetrics(ctx, tickable, d.y)); + }); + } +} + + +/***/ }), + +/***/ "./src/tables.ts": +/*!***********************!*\ + !*** ./src/tables.ts ***! + \***********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Tables": () => (/* binding */ Tables) +/* harmony export */ }); +/* harmony import */ var _fraction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./fraction */ "./src/fraction.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. + + + +const RESOLUTION = 16384; +/** + * Map duration numbers to 'ticks', the unit of duration used throughout VexFlow. + * For example, a quarter note is 4, so it maps to RESOLUTION / 4 = 4096 ticks. + */ +const durations = { + '1/2': RESOLUTION * 2, + 1: RESOLUTION / 1, + 2: RESOLUTION / 2, + 4: RESOLUTION / 4, + 8: RESOLUTION / 8, + 16: RESOLUTION / 16, + 32: RESOLUTION / 32, + 64: RESOLUTION / 64, + 128: RESOLUTION / 128, + 256: RESOLUTION / 256, +}; +const durationAliases = { + w: '1', + h: '2', + q: '4', + // This is the default duration used to render bars (BarNote). Bars no longer + // consume ticks, so this should be a no-op. + // TODO(0xfe): This needs to be cleaned up. + b: '256', +}; +const keySignatures = { + C: { num: 0 }, + Am: { num: 0 }, + F: { acc: 'b', num: 1 }, + Dm: { acc: 'b', num: 1 }, + Bb: { acc: 'b', num: 2 }, + Gm: { acc: 'b', num: 2 }, + Eb: { acc: 'b', num: 3 }, + Cm: { acc: 'b', num: 3 }, + Ab: { acc: 'b', num: 4 }, + Fm: { acc: 'b', num: 4 }, + Db: { acc: 'b', num: 5 }, + Bbm: { acc: 'b', num: 5 }, + Gb: { acc: 'b', num: 6 }, + Ebm: { acc: 'b', num: 6 }, + Cb: { acc: 'b', num: 7 }, + Abm: { acc: 'b', num: 7 }, + G: { acc: '#', num: 1 }, + Em: { acc: '#', num: 1 }, + D: { acc: '#', num: 2 }, + Bm: { acc: '#', num: 2 }, + A: { acc: '#', num: 3 }, + 'F#m': { acc: '#', num: 3 }, + E: { acc: '#', num: 4 }, + 'C#m': { acc: '#', num: 4 }, + B: { acc: '#', num: 5 }, + 'G#m': { acc: '#', num: 5 }, + 'F#': { acc: '#', num: 6 }, + 'D#m': { acc: '#', num: 6 }, + 'C#': { acc: '#', num: 7 }, + 'A#m': { acc: '#', num: 7 }, +}; +const clefs = { + treble: { line_shift: 0 }, + bass: { line_shift: 6 }, + tenor: { line_shift: 4 }, + alto: { line_shift: 3 }, + soprano: { line_shift: 1 }, + percussion: { line_shift: 0 }, + 'mezzo-soprano': { line_shift: 2 }, + 'baritone-c': { line_shift: 5 }, + 'baritone-f': { line_shift: 5 }, + subbass: { line_shift: 7 }, + french: { line_shift: -1 }, +}; +const notesInfo = { + C: { index: 0, int_val: 0 }, + CN: { index: 0, int_val: 0, accidental: 'n' }, + 'C#': { index: 0, int_val: 1, accidental: '#' }, + 'C##': { index: 0, int_val: 2, accidental: '##' }, + CB: { index: 0, int_val: 11, accidental: 'b' }, + CBB: { index: 0, int_val: 10, accidental: 'bb' }, + D: { index: 1, int_val: 2 }, + DN: { index: 1, int_val: 2, accidental: 'n' }, + 'D#': { index: 1, int_val: 3, accidental: '#' }, + 'D##': { index: 1, int_val: 4, accidental: '##' }, + DB: { index: 1, int_val: 1, accidental: 'b' }, + DBB: { index: 1, int_val: 0, accidental: 'bb' }, + E: { index: 2, int_val: 4 }, + EN: { index: 2, int_val: 4, accidental: 'n' }, + 'E#': { index: 2, int_val: 5, accidental: '#' }, + 'E##': { index: 2, int_val: 6, accidental: '##' }, + EB: { index: 2, int_val: 3, accidental: 'b' }, + EBB: { index: 2, int_val: 2, accidental: 'bb' }, + F: { index: 3, int_val: 5 }, + FN: { index: 3, int_val: 5, accidental: 'n' }, + 'F#': { index: 3, int_val: 6, accidental: '#' }, + 'F##': { index: 3, int_val: 7, accidental: '##' }, + FB: { index: 3, int_val: 4, accidental: 'b' }, + FBB: { index: 3, int_val: 3, accidental: 'bb' }, + G: { index: 4, int_val: 7 }, + GN: { index: 4, int_val: 7, accidental: 'n' }, + 'G#': { index: 4, int_val: 8, accidental: '#' }, + 'G##': { index: 4, int_val: 9, accidental: '##' }, + GB: { index: 4, int_val: 6, accidental: 'b' }, + GBB: { index: 4, int_val: 5, accidental: 'bb' }, + A: { index: 5, int_val: 9 }, + AN: { index: 5, int_val: 9, accidental: 'n' }, + 'A#': { index: 5, int_val: 10, accidental: '#' }, + 'A##': { index: 5, int_val: 11, accidental: '##' }, + AB: { index: 5, int_val: 8, accidental: 'b' }, + ABB: { index: 5, int_val: 7, accidental: 'bb' }, + B: { index: 6, int_val: 11 }, + BN: { index: 6, int_val: 11, accidental: 'n' }, + 'B#': { index: 6, int_val: 12, accidental: '#' }, + 'B##': { index: 6, int_val: 13, accidental: '##' }, + BB: { index: 6, int_val: 10, accidental: 'b' }, + BBB: { index: 6, int_val: 9, accidental: 'bb' }, + R: { index: 6, rest: true }, + X: { + index: 6, + accidental: '', + octave: 4, + code: 'noteheadXBlack', + shift_right: 5.5, + }, +}; +const validNoteTypes = { + n: { name: 'note' }, + r: { name: 'rest' }, + h: { name: 'harmonic' }, + m: { name: 'muted' }, + s: { name: 'slash' }, + g: { name: 'ghost' }, +}; +const customNoteHeads = { + /* Diamond */ + D0: { code: 'noteheadDiamondWhole' }, + D1: { code: 'noteheadDiamondHalf' }, + D2: { code: 'noteheadDiamondBlack' }, + D3: { code: 'noteheadDiamondBlack' }, + /* Triangle */ + T0: { code: 'noteheadTriangleUpWhole' }, + T1: { code: 'noteheadTriangleUpHalf' }, + T2: { code: 'noteheadTriangleUpBlack' }, + T3: { code: 'noteheadTriangleUpBlack' }, + /* Cross */ + X0: { code: 'noteheadXWhole' }, + X1: { code: 'noteheadXHalf' }, + X2: { code: 'noteheadXBlack' }, + X3: { code: 'noteheadCircleX' }, + /* Square */ + S1: { code: 'noteheadSquareWhite' }, + S2: { code: 'noteheadSquareBlack' }, + /* Rectangle */ + R1: { code: 'vexNoteHeadRectWhite' }, + R2: { code: 'vexNoteHeadRectBlack' }, // no smufl code +}; +const accidentals = { + '#': { code: 'accidentalSharp', parenRightPaddingAdjustment: -1 }, + '##': { code: 'accidentalDoubleSharp', parenRightPaddingAdjustment: -1 }, + b: { code: 'accidentalFlat', parenRightPaddingAdjustment: -2 }, + bb: { code: 'accidentalDoubleFlat', parenRightPaddingAdjustment: -2 }, + n: { code: 'accidentalNatural', parenRightPaddingAdjustment: -1 }, + '{': { code: 'accidentalParensLeft', parenRightPaddingAdjustment: -1 }, + '}': { code: 'accidentalParensRight', parenRightPaddingAdjustment: -1 }, + db: { code: 'accidentalThreeQuarterTonesFlatZimmermann', parenRightPaddingAdjustment: -1 }, + d: { code: 'accidentalQuarterToneFlatStein', parenRightPaddingAdjustment: 0 }, + '++': { code: 'accidentalThreeQuarterTonesSharpStein', parenRightPaddingAdjustment: -1 }, + '+': { code: 'accidentalQuarterToneSharpStein', parenRightPaddingAdjustment: -1 }, + '+-': { code: 'accidentalKucukMucennebSharp', parenRightPaddingAdjustment: -1 }, + bs: { code: 'accidentalBakiyeFlat', parenRightPaddingAdjustment: -1 }, + bss: { code: 'accidentalBuyukMucennebFlat', parenRightPaddingAdjustment: -1 }, + o: { code: 'accidentalSori', parenRightPaddingAdjustment: -1 }, + k: { code: 'accidentalKoron', parenRightPaddingAdjustment: -1 }, + bbs: { code: 'vexAccidentalMicrotonal1', parenRightPaddingAdjustment: -1 }, + '++-': { code: 'vexAccidentalMicrotonal2', parenRightPaddingAdjustment: -1 }, + ashs: { code: 'vexAccidentalMicrotonal3', parenRightPaddingAdjustment: -1 }, + afhf: { code: 'vexAccidentalMicrotonal4', parenRightPaddingAdjustment: -1 }, + accSagittal5v7KleismaUp: { code: 'accSagittal5v7KleismaUp', parenRightPaddingAdjustment: -1 }, + accSagittal5v7KleismaDown: { code: 'accSagittal5v7KleismaDown', parenRightPaddingAdjustment: -1 }, + accSagittal5CommaUp: { code: 'accSagittal5CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal5CommaDown: { code: 'accSagittal5CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal7CommaUp: { code: 'accSagittal7CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal7CommaDown: { code: 'accSagittal7CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal25SmallDiesisUp: { code: 'accSagittal25SmallDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal25SmallDiesisDown: { code: 'accSagittal25SmallDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal35MediumDiesisUp: { code: 'accSagittal35MediumDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal35MediumDiesisDown: { code: 'accSagittal35MediumDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal11MediumDiesisUp: { code: 'accSagittal11MediumDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal11MediumDiesisDown: { code: 'accSagittal11MediumDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal11LargeDiesisUp: { code: 'accSagittal11LargeDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal11LargeDiesisDown: { code: 'accSagittal11LargeDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal35LargeDiesisUp: { code: 'accSagittal35LargeDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal35LargeDiesisDown: { code: 'accSagittal35LargeDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp25SDown: { code: 'accSagittalSharp25SDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat25SUp: { code: 'accSagittalFlat25SUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp7CDown: { code: 'accSagittalSharp7CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat7CUp: { code: 'accSagittalFlat7CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5CDown: { code: 'accSagittalSharp5CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5CUp: { code: 'accSagittalFlat5CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v7kDown: { code: 'accSagittalSharp5v7kDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v7kUp: { code: 'accSagittalFlat5v7kUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp: { code: 'accSagittalSharp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat: { code: 'accSagittalFlat', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v7kUp: { code: 'accSagittalSharp5v7kUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v7kDown: { code: 'accSagittalFlat5v7kDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5CUp: { code: 'accSagittalSharp5CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5CDown: { code: 'accSagittalFlat5CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp7CUp: { code: 'accSagittalSharp7CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat7CDown: { code: 'accSagittalFlat7CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp25SUp: { code: 'accSagittalSharp25SUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat25SDown: { code: 'accSagittalFlat25SDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp35MUp: { code: 'accSagittalSharp35MUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat35MDown: { code: 'accSagittalFlat35MDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp11MUp: { code: 'accSagittalSharp11MUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat11MDown: { code: 'accSagittalFlat11MDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp11LUp: { code: 'accSagittalSharp11LUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat11LDown: { code: 'accSagittalFlat11LDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp35LUp: { code: 'accSagittalSharp35LUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat35LDown: { code: 'accSagittalFlat35LDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp25SDown: { code: 'accSagittalDoubleSharp25SDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat25SUp: { code: 'accSagittalDoubleFlat25SUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp7CDown: { code: 'accSagittalDoubleSharp7CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat7CUp: { code: 'accSagittalDoubleFlat7CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp5CDown: { code: 'accSagittalDoubleSharp5CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat5CUp: { code: 'accSagittalDoubleFlat5CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp5v7kDown: { code: 'accSagittalDoubleSharp5v7kDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat5v7kUp: { code: 'accSagittalDoubleFlat5v7kUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp: { code: 'accSagittalDoubleSharp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat: { code: 'accSagittalDoubleFlat', parenRightPaddingAdjustment: -1 }, + accSagittal7v11KleismaUp: { code: 'accSagittal7v11KleismaUp', parenRightPaddingAdjustment: -1 }, + accSagittal7v11KleismaDown: { code: 'accSagittal7v11KleismaDown', parenRightPaddingAdjustment: -1 }, + accSagittal17CommaUp: { code: 'accSagittal17CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal17CommaDown: { code: 'accSagittal17CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal55CommaUp: { code: 'accSagittal55CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal55CommaDown: { code: 'accSagittal55CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal7v11CommaUp: { code: 'accSagittal7v11CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal7v11CommaDown: { code: 'accSagittal7v11CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal5v11SmallDiesisUp: { code: 'accSagittal5v11SmallDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal5v11SmallDiesisDown: { code: 'accSagittal5v11SmallDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v11SDown: { code: 'accSagittalSharp5v11SDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v11SUp: { code: 'accSagittalFlat5v11SUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp7v11CDown: { code: 'accSagittalSharp7v11CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat7v11CUp: { code: 'accSagittalFlat7v11CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp55CDown: { code: 'accSagittalSharp55CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat55CUp: { code: 'accSagittalFlat55CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp17CDown: { code: 'accSagittalSharp17CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat17CUp: { code: 'accSagittalFlat17CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp7v11kDown: { code: 'accSagittalSharp7v11kDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat7v11kUp: { code: 'accSagittalFlat7v11kUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp7v11kUp: { code: 'accSagittalSharp7v11kUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat7v11kDown: { code: 'accSagittalFlat7v11kDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp17CUp: { code: 'accSagittalSharp17CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat17CDown: { code: 'accSagittalFlat17CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp55CUp: { code: 'accSagittalSharp55CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat55CDown: { code: 'accSagittalFlat55CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp7v11CUp: { code: 'accSagittalSharp7v11CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat7v11CDown: { code: 'accSagittalFlat7v11CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v11SUp: { code: 'accSagittalSharp5v11SUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v11SDown: { code: 'accSagittalFlat5v11SDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp5v11SDown: { code: 'accSagittalDoubleSharp5v11SDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat5v11SUp: { code: 'accSagittalDoubleFlat5v11SUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp7v11CDown: { code: 'accSagittalDoubleSharp7v11CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat7v11CUp: { code: 'accSagittalDoubleFlat7v11CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp55CDown: { code: 'accSagittalDoubleSharp55CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat55CUp: { code: 'accSagittalDoubleFlat55CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp17CDown: { code: 'accSagittalDoubleSharp17CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat17CUp: { code: 'accSagittalDoubleFlat17CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp7v11kDown: { code: 'accSagittalDoubleSharp7v11kDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat7v11kUp: { code: 'accSagittalDoubleFlat7v11kUp', parenRightPaddingAdjustment: -1 }, + accSagittal23CommaUp: { code: 'accSagittal23CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal23CommaDown: { code: 'accSagittal23CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal5v19CommaUp: { code: 'accSagittal5v19CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal5v19CommaDown: { code: 'accSagittal5v19CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal5v23SmallDiesisUp: { code: 'accSagittal5v23SmallDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal5v23SmallDiesisDown: { code: 'accSagittal5v23SmallDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v23SDown: { code: 'accSagittalSharp5v23SDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v23SUp: { code: 'accSagittalFlat5v23SUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v19CDown: { code: 'accSagittalSharp5v19CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v19CUp: { code: 'accSagittalFlat5v19CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp23CDown: { code: 'accSagittalSharp23CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat23CUp: { code: 'accSagittalFlat23CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp23CUp: { code: 'accSagittalSharp23CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat23CDown: { code: 'accSagittalFlat23CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v19CUp: { code: 'accSagittalSharp5v19CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v19CDown: { code: 'accSagittalFlat5v19CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v23SUp: { code: 'accSagittalSharp5v23SUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v23SDown: { code: 'accSagittalFlat5v23SDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp5v23SDown: { code: 'accSagittalDoubleSharp5v23SDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat5v23SUp: { code: 'accSagittalDoubleFlat5v23SUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp5v19CDown: { code: 'accSagittalDoubleSharp5v19CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat5v19CUp: { code: 'accSagittalDoubleFlat5v19CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp23CDown: { code: 'accSagittalDoubleSharp23CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat23CUp: { code: 'accSagittalDoubleFlat23CUp', parenRightPaddingAdjustment: -1 }, + accSagittal19SchismaUp: { code: 'accSagittal19SchismaUp', parenRightPaddingAdjustment: -1 }, + accSagittal19SchismaDown: { code: 'accSagittal19SchismaDown', parenRightPaddingAdjustment: -1 }, + accSagittal17KleismaUp: { code: 'accSagittal17KleismaUp', parenRightPaddingAdjustment: -1 }, + accSagittal17KleismaDown: { code: 'accSagittal17KleismaDown', parenRightPaddingAdjustment: -1 }, + accSagittal143CommaUp: { code: 'accSagittal143CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal143CommaDown: { code: 'accSagittal143CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal11v49CommaUp: { code: 'accSagittal11v49CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal11v49CommaDown: { code: 'accSagittal11v49CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal19CommaUp: { code: 'accSagittal19CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal19CommaDown: { code: 'accSagittal19CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal7v19CommaUp: { code: 'accSagittal7v19CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal7v19CommaDown: { code: 'accSagittal7v19CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal49SmallDiesisUp: { code: 'accSagittal49SmallDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal49SmallDiesisDown: { code: 'accSagittal49SmallDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal23SmallDiesisUp: { code: 'accSagittal23SmallDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal23SmallDiesisDown: { code: 'accSagittal23SmallDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal5v13MediumDiesisUp: { code: 'accSagittal5v13MediumDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal5v13MediumDiesisDown: { code: 'accSagittal5v13MediumDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal11v19MediumDiesisUp: { code: 'accSagittal11v19MediumDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal11v19MediumDiesisDown: { code: 'accSagittal11v19MediumDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal49MediumDiesisUp: { code: 'accSagittal49MediumDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal49MediumDiesisDown: { code: 'accSagittal49MediumDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal5v49MediumDiesisUp: { code: 'accSagittal5v49MediumDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal5v49MediumDiesisDown: { code: 'accSagittal5v49MediumDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal49LargeDiesisUp: { code: 'accSagittal49LargeDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal49LargeDiesisDown: { code: 'accSagittal49LargeDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal11v19LargeDiesisUp: { code: 'accSagittal11v19LargeDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal11v19LargeDiesisDown: { code: 'accSagittal11v19LargeDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal5v13LargeDiesisUp: { code: 'accSagittal5v13LargeDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal5v13LargeDiesisDown: { code: 'accSagittal5v13LargeDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp23SDown: { code: 'accSagittalSharp23SDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat23SUp: { code: 'accSagittalFlat23SUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp49SDown: { code: 'accSagittalSharp49SDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat49SUp: { code: 'accSagittalFlat49SUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp7v19CDown: { code: 'accSagittalSharp7v19CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat7v19CUp: { code: 'accSagittalFlat7v19CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp19CDown: { code: 'accSagittalSharp19CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat19CUp: { code: 'accSagittalFlat19CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp11v49CDown: { code: 'accSagittalSharp11v49CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat11v49CUp: { code: 'accSagittalFlat11v49CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp143CDown: { code: 'accSagittalSharp143CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat143CUp: { code: 'accSagittalFlat143CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp17kDown: { code: 'accSagittalSharp17kDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat17kUp: { code: 'accSagittalFlat17kUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp19sDown: { code: 'accSagittalSharp19sDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat19sUp: { code: 'accSagittalFlat19sUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp19sUp: { code: 'accSagittalSharp19sUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat19sDown: { code: 'accSagittalFlat19sDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp17kUp: { code: 'accSagittalSharp17kUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat17kDown: { code: 'accSagittalFlat17kDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp143CUp: { code: 'accSagittalSharp143CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat143CDown: { code: 'accSagittalFlat143CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp11v49CUp: { code: 'accSagittalSharp11v49CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat11v49CDown: { code: 'accSagittalFlat11v49CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp19CUp: { code: 'accSagittalSharp19CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat19CDown: { code: 'accSagittalFlat19CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp7v19CUp: { code: 'accSagittalSharp7v19CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat7v19CDown: { code: 'accSagittalFlat7v19CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp49SUp: { code: 'accSagittalSharp49SUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat49SDown: { code: 'accSagittalFlat49SDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp23SUp: { code: 'accSagittalSharp23SUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat23SDown: { code: 'accSagittalFlat23SDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v13MUp: { code: 'accSagittalSharp5v13MUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v13MDown: { code: 'accSagittalFlat5v13MDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp11v19MUp: { code: 'accSagittalSharp11v19MUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat11v19MDown: { code: 'accSagittalFlat11v19MDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp49MUp: { code: 'accSagittalSharp49MUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat49MDown: { code: 'accSagittalFlat49MDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v49MUp: { code: 'accSagittalSharp5v49MUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v49MDown: { code: 'accSagittalFlat5v49MDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp49LUp: { code: 'accSagittalSharp49LUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat49LDown: { code: 'accSagittalFlat49LDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp11v19LUp: { code: 'accSagittalSharp11v19LUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat11v19LDown: { code: 'accSagittalFlat11v19LDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v13LUp: { code: 'accSagittalSharp5v13LUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v13LDown: { code: 'accSagittalFlat5v13LDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp23SDown: { code: 'accSagittalDoubleSharp23SDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat23SUp: { code: 'accSagittalDoubleFlat23SUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp49SDown: { code: 'accSagittalDoubleSharp49SDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat49SUp: { code: 'accSagittalDoubleFlat49SUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp7v19CDown: { code: 'accSagittalDoubleSharp7v19CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat7v19CUp: { code: 'accSagittalDoubleFlat7v19CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp19CDown: { code: 'accSagittalDoubleSharp19CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat19CUp: { code: 'accSagittalDoubleFlat19CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp11v49CDown: { code: 'accSagittalDoubleSharp11v49CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat11v49CUp: { code: 'accSagittalDoubleFlat11v49CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp143CDown: { code: 'accSagittalDoubleSharp143CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat143CUp: { code: 'accSagittalDoubleFlat143CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp17kDown: { code: 'accSagittalDoubleSharp17kDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat17kUp: { code: 'accSagittalDoubleFlat17kUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp19sDown: { code: 'accSagittalDoubleSharp19sDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat19sUp: { code: 'accSagittalDoubleFlat19sUp', parenRightPaddingAdjustment: -1 }, + accSagittalShaftUp: { code: 'accSagittalShaftUp', parenRightPaddingAdjustment: -1 }, + accSagittalShaftDown: { code: 'accSagittalShaftDown', parenRightPaddingAdjustment: -1 }, + accSagittalAcute: { code: 'accSagittalAcute', parenRightPaddingAdjustment: -1 }, + accSagittalGrave: { code: 'accSagittalGrave', parenRightPaddingAdjustment: -1 }, + accSagittal1MinaUp: { code: 'accSagittal1MinaUp', parenRightPaddingAdjustment: -1 }, + accSagittal1MinaDown: { code: 'accSagittal1MinaDown', parenRightPaddingAdjustment: -1 }, + accSagittal2MinasUp: { code: 'accSagittal2MinasUp', parenRightPaddingAdjustment: -1 }, + accSagittal2MinasDown: { code: 'accSagittal2MinasDown', parenRightPaddingAdjustment: -1 }, + accSagittal1TinaUp: { code: 'accSagittal1TinaUp', parenRightPaddingAdjustment: -1 }, + accSagittal1TinaDown: { code: 'accSagittal1TinaDown', parenRightPaddingAdjustment: -1 }, + accSagittal2TinasUp: { code: 'accSagittal2TinasUp', parenRightPaddingAdjustment: -1 }, + accSagittal2TinasDown: { code: 'accSagittal2TinasDown', parenRightPaddingAdjustment: -1 }, + accSagittal3TinasUp: { code: 'accSagittal3TinasUp', parenRightPaddingAdjustment: -1 }, + accSagittal3TinasDown: { code: 'accSagittal3TinasDown', parenRightPaddingAdjustment: -1 }, + accSagittal4TinasUp: { code: 'accSagittal4TinasUp', parenRightPaddingAdjustment: -1 }, + accSagittal4TinasDown: { code: 'accSagittal4TinasDown', parenRightPaddingAdjustment: -1 }, + accSagittal5TinasUp: { code: 'accSagittal5TinasUp', parenRightPaddingAdjustment: -1 }, + accSagittal5TinasDown: { code: 'accSagittal5TinasDown', parenRightPaddingAdjustment: -1 }, + accSagittal6TinasUp: { code: 'accSagittal6TinasUp', parenRightPaddingAdjustment: -1 }, + accSagittal6TinasDown: { code: 'accSagittal6TinasDown', parenRightPaddingAdjustment: -1 }, + accSagittal7TinasUp: { code: 'accSagittal7TinasUp', parenRightPaddingAdjustment: -1 }, + accSagittal7TinasDown: { code: 'accSagittal7TinasDown', parenRightPaddingAdjustment: -1 }, + accSagittal8TinasUp: { code: 'accSagittal8TinasUp', parenRightPaddingAdjustment: -1 }, + accSagittal8TinasDown: { code: 'accSagittal8TinasDown', parenRightPaddingAdjustment: -1 }, + accSagittal9TinasUp: { code: 'accSagittal9TinasUp', parenRightPaddingAdjustment: -1 }, + accSagittal9TinasDown: { code: 'accSagittal9TinasDown', parenRightPaddingAdjustment: -1 }, + accSagittalFractionalTinaUp: { code: 'accSagittalFractionalTinaUp', parenRightPaddingAdjustment: -1 }, + accSagittalFractionalTinaDown: { code: 'accSagittalFractionalTinaDown', parenRightPaddingAdjustment: -1 }, + accidentalNarrowReversedFlat: { code: 'accidentalNarrowReversedFlat', parenRightPaddingAdjustment: -1 }, + accidentalNarrowReversedFlatAndFlat: { + code: 'accidentalNarrowReversedFlatAndFlat', + parenRightPaddingAdjustment: -1, + }, + accidentalWilsonPlus: { code: 'accidentalWilsonPlus', parenRightPaddingAdjustment: -1 }, + accidentalWilsonMinus: { code: 'accidentalWilsonMinus', parenRightPaddingAdjustment: -1 }, +}; +// Helps determine the layout of accidentals. +const accidentalColumns = { + 1: { + a: [1], + b: [1], + }, + 2: { + a: [1, 2], + }, + 3: { + a: [1, 3, 2], + b: [1, 2, 1], + second_on_bottom: [1, 2, 3], + }, + 4: { + a: [1, 3, 4, 2], + b: [1, 2, 3, 1], + spaced_out_tetrachord: [1, 2, 1, 2], + }, + 5: { + a: [1, 3, 5, 4, 2], + b: [1, 2, 4, 3, 1], + spaced_out_pentachord: [1, 2, 3, 2, 1], + very_spaced_out_pentachord: [1, 2, 1, 2, 1], + }, + 6: { + a: [1, 3, 5, 6, 4, 2], + b: [1, 2, 4, 5, 3, 1], + spaced_out_hexachord: [1, 3, 2, 1, 3, 2], + very_spaced_out_hexachord: [1, 2, 1, 2, 1, 2], + }, +}; +const articulations = { + 'a.': { code: 'augmentationDot', between_lines: true }, + av: { + aboveCode: 'articStaccatissimoAbove', + belowCode: 'articStaccatissimoBelow', + between_lines: true, + }, + 'a>': { + aboveCode: 'articAccentAbove', + belowCode: 'articAccentBelow', + between_lines: true, + }, + 'a-': { + aboveCode: 'articTenutoAbove', + belowCode: 'articTenutoBelow', + between_lines: true, + }, + 'a^': { + aboveCode: 'articMarcatoAbove', + belowCode: 'articMarcatoBelow', + between_lines: false, + }, + 'a+': { code: 'pluckedLeftHandPizzicato', between_lines: false }, + ao: { + aboveCode: 'pluckedSnapPizzicatoAbove', + belowCode: 'pluckedSnapPizzicatoBelow', + between_lines: false, + }, + ah: { code: 'stringsHarmonic', between_lines: false }, + 'a@': { aboveCode: 'fermataAbove', belowCode: 'fermataBelow', between_lines: false }, + 'a@a': { code: 'fermataAbove', between_lines: false }, + 'a@u': { code: 'fermataBelow', between_lines: false }, + 'a|': { code: 'stringsUpBow', between_lines: false }, + am: { code: 'stringsDownBow', between_lines: false }, + 'a,': { code: 'pictChokeCymbal', between_lines: false }, // Choked +}; +const ornaments = { + mordent: { code: 'ornamentShortTrill' }, + mordent_inverted: { code: 'ornamentMordent' }, + turn: { code: 'ornamentTurn' }, + turn_inverted: { code: 'ornamentTurnSlash' }, + tr: { code: 'ornamentTrill' }, + upprall: { code: 'ornamentPrecompSlideTrillDAnglebert' }, + downprall: { code: 'ornamentPrecompDoubleCadenceUpperPrefix' }, + prallup: { code: 'ornamentPrecompTrillSuffixDandrieu' }, + pralldown: { code: 'ornamentPrecompTrillLowerSuffix' }, + upmordent: { code: 'ornamentPrecompSlideTrillBach' }, + downmordent: { code: 'ornamentPrecompDoubleCadenceUpperPrefixTurn' }, + lineprall: { code: 'ornamentPrecompAppoggTrill' }, + prallprall: { code: 'ornamentTremblement' }, + scoop: { code: 'brassScoop' }, + doit: { code: 'brassDoitMedium' }, + fall: { code: 'brassFallLipShort' }, + doitLong: { code: 'brassLiftMedium' }, + fallLong: { code: 'brassFallRoughMedium' }, + bend: { code: 'brassBend' }, + plungerClosed: { code: 'brassMuteClosed' }, + plungerOpen: { code: 'brassMuteOpen' }, + flip: { code: 'brassFlip' }, + jazzTurn: { code: 'brassJazzTurn' }, + smear: { code: 'brassSmear' }, +}; +class Tables { + /** + * @returns the `Font` object at the head of the music font stack. + */ + static currentMusicFont() { + if (Tables.MUSIC_FONT_STACK.length === 0) { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('NoFonts', 'The font stack is empty. See: await Flow.fetchMusicFont(...); Flow.setMusicFont(...).'); + } + else { + return Tables.MUSIC_FONT_STACK[0]; + } + } + static clefProperties(clef) { + if (!clef || !(clef in clefs)) + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('BadArgument', 'Invalid clef: ' + clef); + return clefs[clef]; + } + /** + * @param keyOctaveGlyph a string in the format "key/octave" (e.g., "c/5") or "key/octave/custom-note-head-code" (e.g., "g/5/t3"). + * @param clef + * @param params a struct with one option, `octave_shift` for clef ottavation (0 = default; 1 = 8va; -1 = 8vb, etc.). + * @returns properties for the specified note. + */ + // eslint-disable-next-line + static keyProperties(keyOctaveGlyph, clef = 'treble', params) { + let options = { octave_shift: 0 }; + if (typeof params === 'object') { + options = Object.assign(Object.assign({}, options), params); + } + const pieces = keyOctaveGlyph.split('/'); + if (pieces.length < 2) { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('BadArguments', `First argument must be note/octave or note/octave/glyph-code: ${keyOctaveGlyph}`); + } + const key = pieces[0].toUpperCase(); + const value = notesInfo[key]; + if (!value) + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('BadArguments', 'Invalid key name: ' + key); + if (value.octave) + pieces[1] = value.octave.toString(); + let octave = parseInt(pieces[1], 10); + // Octave_shift is the shift to compensate for clef 8va/8vb. + octave += -1 * options.octave_shift; + const baseIndex = octave * 7 - 4 * 7; + let line = (baseIndex + value.index) / 2; + line += Tables.clefProperties(clef).line_shift; + let stroke = 0; + if (line <= 0 && (line * 2) % 2 === 0) + stroke = 1; // stroke up + if (line >= 6 && (line * 2) % 2 === 0) + stroke = -1; // stroke down + // Integer value for note arithmetic. + const int_value = typeof value.int_val !== 'undefined' ? octave * 12 + value.int_val : undefined; + // If the user specified a glyph, overwrite the glyph code. + const code = value.code; + const shift_right = value.shift_right; + let customNoteHeadProps = {}; + if (pieces.length > 2 && pieces[2]) { + const glyphName = pieces[2].toUpperCase(); + customNoteHeadProps = customNoteHeads[glyphName] || {}; + } + return Object.assign({ key, + octave, + line, + int_value, accidental: value.accidental, code, + stroke, + shift_right, displaced: false }, customNoteHeadProps); + } + static integerToNote(integer) { + if (typeof integer === 'undefined' || integer < 0 || integer > 11) { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('BadArguments', `integerToNote() requires an integer in the range [0, 11]: ${integer}`); + } + const table = { + 0: 'C', + 1: 'C#', + 2: 'D', + 3: 'D#', + 4: 'E', + 5: 'F', + 6: 'F#', + 7: 'G', + 8: 'G#', + 9: 'A', + 10: 'A#', + 11: 'B', + }; + const noteValue = table[integer]; + if (!noteValue) { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('BadArguments', `Unknown note value for integer: ${integer}`); + } + return noteValue; + } + static tabToGlyph(fret, scale = 1.0) { + let glyph = undefined; + let width = 0; + let shift_y = 0; + if (fret.toUpperCase() === 'X') { + const glyphMetrics = new _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph('accidentalDoubleSharp', Tables.TABLATURE_FONT_SCALE).getMetrics(); + glyph = 'accidentalDoubleSharp'; + if (glyphMetrics.width == undefined || glyphMetrics.height == undefined) + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('InvalidMetrics', 'Width and height required'); + width = glyphMetrics.width; + shift_y = -glyphMetrics.height / 2; + } + else { + width = Tables.textWidth(fret); + } + return { + text: fret, + code: glyph, + getWidth: () => width * scale, + shift_y, + }; + } + // Used by annotation.ts and bend.ts. Clearly this implementation only works for the default font size. + // TODO: The actual width depends on the font family, size, weight, style. + static textWidth(text) { + return 7 * text.toString().length; + } + static articulationCodes(artic) { + return articulations[artic]; + } + static accidentalCodes(acc) { + return accidentals[acc]; + } + static ornamentCodes(acc) { + return ornaments[acc]; + } + static keySignature(spec) { + const keySpec = keySignatures[spec]; + if (!keySpec) { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('BadKeySignature', `Bad key signature spec: '${spec}'`); + } + if (!keySpec.acc) { + return []; + } + const accidentalList = { + b: [2, 0.5, 2.5, 1, 3, 1.5, 3.5], + '#': [0, 1.5, -0.5, 1, 2.5, 0.5, 2], + }; + const notes = accidentalList[keySpec.acc]; + const acc_list = []; + for (let i = 0; i < keySpec.num; ++i) { + const line = notes[i]; + acc_list.push({ type: keySpec.acc, line }); + } + return acc_list; + } + static getKeySignatures() { + return keySignatures; + } + static hasKeySignature(spec) { + return spec in keySignatures; + } + /** + * Convert duration aliases to the number based duration. + * If the input isn't an alias, simply return the input. + * @param duration + * @returns Example: 'q' -> '4', '8' -> '8' + */ + static sanitizeDuration(duration) { + const durationNumber = durationAliases[duration]; + if (durationNumber !== undefined) { + duration = durationNumber; + } + if (durations[duration] === undefined) { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('BadArguments', `The provided duration is not valid: ${duration}`); + } + return duration; + } + /** Convert the `duration` to a fraction. */ + static durationToFraction(duration) { + return new _fraction__WEBPACK_IMPORTED_MODULE_0__.Fraction().parse(Tables.sanitizeDuration(duration)); + } + /** Convert the `duration` to a number. */ + static durationToNumber(duration) { + return Tables.durationToFraction(duration).value(); + } + /* Convert the `duration` to total ticks. */ + static durationToTicks(duration) { + duration = Tables.sanitizeDuration(duration); + const ticks = durations[duration]; + if (ticks === undefined) { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('InvalidDuration'); + } + return ticks; + } + // Return a glyph given duration and type. The type can be a custom glyph code from customNoteHeads. + // The default type is a regular note ('n'). + // eslint-disable-next-line + static getGlyphProps(duration, type = 'n') { + duration = Tables.sanitizeDuration(duration); + // Lookup duration for default glyph head code + const code = durationCodes[duration]; + if (code === undefined) { + return undefined; + } + // Get glyph properties for 'type' from duration string (note, rest, harmonic, muted, slash) + let glyphTypeProperties = code.type[type]; + // If this isn't a standard type, then lookup the custom note head map. + if (glyphTypeProperties === undefined) { + // Try and get it from the custom list of note heads + const customGlyphTypeProperties = customNoteHeads[type.toUpperCase()]; + // If not, then return with nothing. + if (customGlyphTypeProperties === undefined) { + return undefined; + } + // Otherwise set it as the code_head value + glyphTypeProperties = Object.assign({ code_head: customGlyphTypeProperties.code }, customGlyphTypeProperties); + } + const code_head = glyphTypeProperties.code_head; + // The default implementation of getWidth() calls Glyph.getWidth(code_head, scale). + // This can be overridden by an individual glyph type (see slash noteheads below: Tables.SLASH_NOTEHEAD_WIDTH). + const getWidth = (scale = Tables.NOTATION_FONT_SCALE) => _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.getWidth(code_head, scale); + // Merge duration props for 'duration' with the note head properties. + return Object.assign(Object.assign(Object.assign({}, code.common), { getWidth: getWidth }), glyphTypeProperties); + } +} +Tables.STEM_WIDTH = 1.5; +Tables.STEM_HEIGHT = 35; +Tables.STAVE_LINE_THICKNESS = 1; +Tables.RESOLUTION = RESOLUTION; +/** + * Customize this by calling Flow.setMusicFont(...fontNames); + */ +Tables.MUSIC_FONT_STACK = []; +Tables.NOTATION_FONT_SCALE = 39; +Tables.TABLATURE_FONT_SCALE = 39; +Tables.SLASH_NOTEHEAD_WIDTH = 15; +Tables.STAVE_LINE_DISTANCE = 10; +// HACK: +// Since text origins are positioned at the baseline, we must +// compensate for the ascender of the text. Of course, 1 staff space is +// a very poor approximation. +// +// This will be deprecated in the future. This is a temporary solution until +// we have more robust text metrics. +Tables.TEXT_HEIGHT_OFFSET_HACK = 1; +Tables.accidentalMap = accidentals; +Tables.accidentalColumnsTable = accidentalColumns; +Tables.unicode = { + // ♯ accidental sharp + sharp: String.fromCharCode(0x266f), + // ♭ accidental flat + flat: String.fromCharCode(0x266d), + // ♮ accidental natural + natural: String.fromCharCode(0x266e), + // △ major seventh + triangle: String.fromCharCode(0x25b3), + // ø half-diminished + 'o-with-slash': String.fromCharCode(0x00f8), + // ° diminished + degrees: String.fromCharCode(0x00b0), + // ○ diminished + circle: String.fromCharCode(0x25cb), +}; +/* The list of valid note types. Used by note.ts during parseNoteStruct(). */ +Tables.validTypes = validNoteTypes; +// Default time signature. +Tables.TIME4_4 = { + num_beats: 4, + beat_value: 4, + resolution: RESOLUTION, +}; +// 1/2, 1, 2, 4, 8, 16, 32, 64, 128 +// NOTE: There is no 256 here! However, there are other mentions of 256 in this file. +// For example, in durations has a 256 key, and sanitizeDuration() can return 256. +// The sanitizeDuration() bit may need to be removed by 0xfe. +// eslint-disable-next-line +const durationCodes = { + '1/2': { + common: { + stem: false, + stem_offset: 0, + flag: false, + dot_shiftY: 0, + line_above: 0, + line_below: 0, + }, + type: { + n: { + // Breve note + code_head: 'noteheadDoubleWhole', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadDoubleWhole', scale); + // }, + }, + h: { + // Breve note harmonic + code_head: 'unpitchedPercussionClef1', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('unpitchedPercussionClef1', scale); + // }, + }, + m: { + // Breve note muted + code_head: 'vexNoteHeadMutedBreve', + stem_offset: 0, + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('vexNoteHeadMutedBreve', scale); + // }, + }, + r: { + // Breve rest + code_head: 'restDoubleWhole', + rest: true, + position: 'B/5', + dot_shiftY: 0.5, + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('restDoubleWhole', scale); + // }, + }, + s: { + // Breve note slash - + // Drawn with canvas primitives + getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH, + position: 'B/4', + }, + g: { + // Ghostnote + code_head: 'noteheadDoubleWhole', + }, + }, + }, + 1: { + common: { + stem: false, + stem_offset: 0, + flag: false, + dot_shiftY: 0, + line_above: 0, + line_below: 0, + }, + type: { + n: { + // Whole note + code_head: 'noteheadWhole', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadWhole', scale); + // }, + }, + h: { + // Whole note harmonic + code_head: 'noteheadDiamondWhole', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadDiamondWhole', scale); + // }, + }, + m: { + // Whole note muted + code_head: 'noteheadXWhole', + stem_offset: -3, + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadXWhole', scale); + // }, + }, + r: { + // Whole rest + code_head: 'restWhole', + rest: true, + position: 'D/5', + dot_shiftY: 0.5, + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('restWhole', scale); + // }, + }, + s: { + // Whole note slash + // Drawn with canvas primitives + getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH, + position: 'B/4', + }, + g: { + // Ghostnote + code_head: 'noteheadWhole', + }, + }, + }, + 2: { + common: { + stem: true, + stem_offset: 0, + flag: false, + dot_shiftY: 0, + line_above: 0, + line_below: 0, + }, + type: { + n: { + // Half note + code_head: 'noteheadHalf', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadHalf', scale); + // }, + }, + h: { + // Half note harmonic + code_head: 'noteheadDiamondHalf', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadDiamondHalf', scale); + // }, + }, + m: { + // Half note muted + code_head: 'noteheadXHalf', + stem_offset: -3, + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadXHalf', scale); + // }, + }, + r: { + // Half rest + code_head: 'restHalf', + stem: false, + rest: true, + position: 'B/4', + dot_shiftY: -0.5, + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('restHalf', scale); + // }, + }, + s: { + // Half note slash + // Drawn with canvas primitives + getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH, + position: 'B/4', + }, + g: { + // Ghostnote + code_head: 'noteheadHalf', + }, + }, + }, + 4: { + common: { + stem: true, + stem_offset: 0, + flag: false, + dot_shiftY: 0, + line_above: 0, + line_below: 0, + }, + type: { + n: { + // Quarter note + code_head: 'noteheadBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadBlack', scale); + // }, + }, + h: { + // Quarter harmonic + code_head: 'noteheadDiamondBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadDiamondBlack', scale); + // }, + }, + m: { + // Quarter muted + code_head: 'noteheadXBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadXBlack', scale); + // }, + }, + r: { + // Quarter rest + code_head: 'restQuarter', + stem: false, + rest: true, + position: 'B/4', + dot_shiftY: -0.5, + line_above: 1.5, + line_below: 1.5, + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('restQuarter', scale); + // }, + }, + s: { + // Quarter slash + // Drawn with canvas primitives + getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH, + position: 'B/4', + }, + g: { + // Ghostnote + code_head: 'noteheadBlack', + }, + }, + }, + 8: { + common: { + stem: true, + stem_offset: 0, + flag: true, + beam_count: 1, + stem_beam_extension: 0, + code_flag_upstem: 'flag8thUp', + code_flag_downstem: 'flag8thDown', + dot_shiftY: 0, + line_above: 0, + line_below: 0, + }, + type: { + n: { + // Eighth note + code_head: 'noteheadBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadBlack', scale); + // }, + }, + h: { + // Eighth note harmonic + code_head: 'noteheadDiamondBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadDiamondBlack', scale); + // }, + }, + m: { + // Eighth note muted + code_head: 'noteheadXBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadXBlack', scale); + // }, + }, + r: { + // Eighth rest + code_head: 'rest8th', + stem: false, + flag: false, + rest: true, + position: 'B/4', + dot_shiftY: -0.5, + line_above: 1.0, + line_below: 1.0, + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('rest8th', scale); + // }, + }, + s: { + // Eighth slash + // Drawn with canvas primitives + getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH, + position: 'B/4', + }, + g: { + // Ghostnote + code_head: 'noteheadBlack', + }, + }, + }, + 16: { + common: { + beam_count: 2, + stem_beam_extension: 0, + stem: true, + stem_offset: 0, + flag: true, + code_flag_upstem: 'flag16thUp', + code_flag_downstem: 'flag16thDown', + dot_shiftY: 0, + line_above: 0, + line_below: 0, + }, + type: { + n: { + // Sixteenth note + code_head: 'noteheadBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadBlack', scale); + // }, + }, + h: { + // Sixteenth note harmonic + code_head: 'noteheadDiamondBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadDiamondBlack', scale); + // }, + }, + m: { + // Sixteenth note muted + code_head: 'noteheadXBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadXBlack', scale); + // }, + }, + r: { + // Sixteenth rest + code_head: 'rest16th', + stem: false, + flag: false, + rest: true, + position: 'B/4', + dot_shiftY: -0.5, + line_above: 1.0, + line_below: 2.0, + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('rest16th', scale); + // }, + }, + s: { + // Sixteenth slash + // Drawn with canvas primitives + getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH, + position: 'B/4', + }, + g: { + // Ghostnote + code_head: 'noteheadBlack', + }, + }, + }, + 32: { + common: { + beam_count: 3, + stem_beam_extension: 7.5, + stem: true, + stem_offset: 0, + flag: true, + code_flag_upstem: 'flag32ndUp', + code_flag_downstem: 'flag32ndDown', + dot_shiftY: 0, + line_above: 0, + line_below: 0, + }, + type: { + n: { + // Thirty-second note + code_head: 'noteheadBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadBlack', scale); + // }, + }, + h: { + // Thirty-second harmonic + code_head: 'noteheadDiamondBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadDiamondBlack', scale); + // }, + }, + m: { + // Thirty-second muted + code_head: 'noteheadXBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadXBlack', scale); + // }, + }, + r: { + // Thirty-second rest + code_head: 'rest32nd', + stem: false, + flag: false, + rest: true, + position: 'B/4', + dot_shiftY: -1.5, + line_above: 2.0, + line_below: 2.0, + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('rest32nd', scale); + // }, + }, + s: { + // Thirty-second slash + // Drawn with canvas primitives + getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH, + position: 'B/4', + }, + g: { + // Ghostnote + code_head: 'noteheadBlack', + }, + }, + }, + 64: { + common: { + beam_count: 4, + stem_beam_extension: 15, + stem: true, + stem_offset: 0, + flag: true, + code_flag_upstem: 'flag64thUp', + code_flag_downstem: 'flag64thDown', + dot_shiftY: 0, + line_above: 0, + line_below: 0, + }, + type: { + n: { + // Sixty-fourth note + code_head: 'noteheadBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadBlack', scale); + // }, + }, + h: { + // Sixty-fourth harmonic + code_head: 'noteheadDiamondBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadDiamondBlack', scale); + // }, + }, + m: { + // Sixty-fourth muted + code_head: 'noteheadXBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadXBlack', scale); + // }, + }, + r: { + // Sixty-fourth rest + code_head: 'rest64th', + stem: false, + flag: false, + rest: true, + position: 'B/4', + dot_shiftY: -1.5, + line_above: 2.0, + line_below: 3.0, + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('rest64th', scale); + // }, + }, + s: { + // Sixty-fourth slash + // Drawn with canvas primitives + getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH, + position: 'B/4', + }, + g: { + // Ghostnote + code_head: 'noteheadBlack', + }, + }, + }, + 128: { + common: { + beam_count: 5, + stem_beam_extension: 22.5, + stem: true, + stem_offset: 0, + flag: true, + code_flag_upstem: 'flag128thUp', + code_flag_downstem: 'flag128thDown', + dot_shiftY: 0, + line_above: 0, + line_below: 0, + }, + type: { + n: { + // Hundred-twenty-eight note + code_head: 'noteheadBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadBlack', scale); + // }, + }, + h: { + // Hundred-twenty-eight harmonic + code_head: 'noteheadDiamondBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadDiamondBlack', scale); + // }, + }, + m: { + // Hundred-twenty-eight muted + code_head: 'noteheadXBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadXBlack', scale); + // }, + }, + r: { + // Hundred-twenty-eight rest + code_head: 'rest128th', + stem: false, + flag: false, + rest: true, + position: 'B/4', + dot_shiftY: -2.5, + line_above: 3.0, + line_below: 3.0, + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('rest128th', scale); + // }, + }, + s: { + // Hundred-twenty-eight slash + // Drawn with canvas primitives + getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH, + position: 'B/4', + }, + g: { + // Ghostnote + code_head: 'noteheadBlack', + }, + }, + }, +}; + + +/***/ }), + +/***/ "./src/tabnote.ts": +/*!************************!*\ + !*** ./src/tabnote.ts ***! + \************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TabNote": () => (/* binding */ TabNote) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _stemmablenote__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./stemmablenote */ "./src/stemmablenote.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// ## Description +// +// The file implements notes for Tablature notation. This consists of one or +// more fret positions, and can either be drawn with or without stems. +// +// See `tests/tabnote_tests.ts` for usage examples. + + + + + + + + +// Gets the unused strings grouped together if consecutive. +// +// Parameters: +// * num_lines - The number of lines +// * strings_used - An array of numbers representing which strings have fret positions +function getUnusedStringGroups(num_lines, strings_used) { + const stem_through = []; + let group = []; + for (let string = 1; string <= num_lines; string++) { + const is_used = strings_used.indexOf(string) > -1; + if (!is_used) { + group.push(string); + } + else { + stem_through.push(group); + group = []; + } + } + if (group.length > 0) + stem_through.push(group); + return stem_through; +} +// Gets groups of points that outline the partial stem lines +// between fret positions +// +// Parameters: +// * stem_Y - The `y` coordinate the stem is located on +// * unused_strings - An array of groups of unused strings +// * stave - The stave to use for reference +// * stem_direction - The direction of the stem +function getPartialStemLines(stem_y, unused_strings, stave, stem_direction) { + const up_stem = stem_direction !== 1; + const down_stem = stem_direction !== -1; + const line_spacing = stave.getSpacingBetweenLines(); + const total_lines = stave.getNumLines(); + const stem_lines = []; + unused_strings.forEach((strings) => { + const containsLastString = strings.indexOf(total_lines) > -1; + const containsFirstString = strings.indexOf(1) > -1; + if ((up_stem && containsFirstString) || (down_stem && containsLastString)) { + return; + } + // If there's only one string in the group, push a duplicate value. + // We do this because we need 2 strings to convert into upper/lower y + // values. + if (strings.length === 1) { + strings.push(strings[0]); + } + const line_ys = []; + // Iterate through each group string and store it's y position + strings.forEach((string, index, strings) => { + const isTopBound = string === 1; + const isBottomBound = string === total_lines; + // Get the y value for the appropriate staff line, + // we adjust for a 0 index array, since string numbers are index 1 + let y = stave.getYForLine(string - 1); + // Unless the string is the first or last, add padding to each side + // of the line + if (index === 0 && !isTopBound) { + y -= line_spacing / 2 - 1; + } + else if (index === strings.length - 1 && !isBottomBound) { + y += line_spacing / 2 - 1; + } + // Store the y value + line_ys.push(y); + // Store a subsequent y value connecting this group to the main + // stem above/below the stave if it's the top/bottom string + if (stem_direction === 1 && isTopBound) { + line_ys.push(stem_y - 2); + } + else if (stem_direction === -1 && isBottomBound) { + line_ys.push(stem_y + 2); + } + }); + // Add the sorted y values to the + stem_lines.push(line_ys.sort((a, b) => a - b)); + }); + return stem_lines; +} +class TabNote extends _stemmablenote__WEBPACK_IMPORTED_MODULE_4__.StemmableNote { + // Initialize the TabNote with a `noteStruct` full of properties + // and whether to `draw_stem` when rendering the note + constructor(noteStruct, draw_stem = false) { + super(noteStruct); + this.glyphs = []; + // Return the number of the greatest string, which is the string lowest on the display + this.greatestString = () => { + return this.positions.map((x) => x.str).reduce((a, b) => (a > b ? a : b)); + }; + // Return the number of the least string, which is the string highest on the display + this.leastString = () => { + return this.positions.map((x) => x.str).reduce((a, b) => (a < b ? a : b)); + }; + this.ghost = false; // Renders parenthesis around notes + // Note properties + // The fret positions in the note. An array of `{ str: X, fret: X }` + this.positions = noteStruct.positions || []; + // Render Options + this.render_options = Object.assign(Object.assign({}, this.render_options), { + // font size for note heads and rests + glyph_font_scale: _tables__WEBPACK_IMPORTED_MODULE_5__.Tables.TABLATURE_FONT_SCALE, + // Flag to draw a stem + draw_stem, + // Flag to draw dot modifiers + draw_dots: draw_stem, + // Flag to extend the main stem through the stave and fret positions + draw_stem_through_stave: false, + // vertical shift from stave line + y_shift: 0, + // normal glyph scale + scale: 1.0, + // default tablature font + font: `${_font__WEBPACK_IMPORTED_MODULE_0__.Font.SIZE}pt ${_font__WEBPACK_IMPORTED_MODULE_0__.Font.SANS_SERIF}` }); + this.glyph = _tables__WEBPACK_IMPORTED_MODULE_5__.Tables.getGlyphProps(this.duration, this.noteType); + (0,_util__WEBPACK_IMPORTED_MODULE_7__.defined)(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`); + this.buildStem(); + if (noteStruct.stem_direction) { + this.setStemDirection(noteStruct.stem_direction); + } + else { + this.setStemDirection(_stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP); + } + // Renders parenthesis around notes + this.ghost = false; + this.updateWidth(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_6__.Category.TabNote; + } + reset() { + super.reset(); + if (this.stave) + this.setStave(this.stave); + return this; + } + // Set as ghost `TabNote`, surrounds the fret positions with parenthesis. + // Often used for indicating frets that are being bent to + setGhost(ghost) { + this.ghost = ghost; + this.updateWidth(); + return this; + } + // Determine if the note has a stem + hasStem() { + if (this.render_options.draw_stem) + return true; + return false; + } + // Get the default stem extension for the note + getStemExtension() { + if (this.stem_extension_override != null) { + return this.stem_extension_override; + } + if (this.flag) { + return this.getStemDirection() === 1 ? -this.flag.checkMetrics().y_shift : this.flag.checkMetrics().y_shift; + } + return 0; + } + // Calculate and store the width of the note + updateWidth() { + this.glyphs = []; + this.width = 0; + for (let i = 0; i < this.positions.length; ++i) { + let fret = this.positions[i].fret; + if (this.ghost) + fret = '(' + fret + ')'; + const glyph = _tables__WEBPACK_IMPORTED_MODULE_5__.Tables.tabToGlyph(fret.toString(), this.render_options.scale); + this.glyphs.push(glyph); + this.width = Math.max(glyph.getWidth(), this.width); + } + // For some reason we associate a notehead glyph with a TabNote, and this + // glyph is used for certain width calculations. Of course, this is totally + // incorrect since a notehead is a poor approximation for the dimensions of + // a fret number which can have multiple digits. As a result, we must + // overwrite getWidth() to return the correct width + this.glyph.getWidth = () => this.width; + } + // Set the `stave` to the note + setStave(stave) { + super.setStave(stave); + const ctx = stave.getContext(); + this.setContext(ctx); + // Calculate the fret number width based on font used + if (ctx) { + this.width = 0; + for (let i = 0; i < this.glyphs.length; ++i) { + const glyph = this.glyphs[i]; + const text = '' + glyph.text; + if (text.toUpperCase() !== 'X') { + ctx.save(); + ctx.setFont(this.render_options.font); + glyph.width = ctx.measureText(text).width; + ctx.restore(); + glyph.getWidth = () => glyph.width; + } + this.width = Math.max(glyph.getWidth(), this.width); + } + this.glyph.getWidth = () => this.width; + } + // we subtract 1 from `line` because getYForLine expects a 0-based index, + // while the position.str is a 1-based index + const ys = this.positions.map(({ str: line }) => stave.getYForLine(Number(line) - 1)); + this.setYs(ys); + if (this.stem) { + this.stem.setYBounds(this.getStemY(), this.getStemY()); + } + return this; + } + // Get the fret positions for the note + getPositions() { + return this.positions; + } + // Get the default `x` and `y` coordinates for a modifier at a specific + // `position` at a fret position `index` + getModifierStartXY(position, index) { + if (!this.preFormatted) { + throw new _util__WEBPACK_IMPORTED_MODULE_7__.RuntimeError('UnformattedNote', "Can't call GetModifierStartXY on an unformatted note"); + } + if (this.ys.length === 0) { + throw new _util__WEBPACK_IMPORTED_MODULE_7__.RuntimeError('NoYValues', 'No Y-Values calculated for this note.'); + } + let x = 0; + if (position === _modifier__WEBPACK_IMPORTED_MODULE_2__.Modifier.Position.LEFT) { + x = -1 * 2; // FIXME: modifier padding, move to font file + } + else if (position === _modifier__WEBPACK_IMPORTED_MODULE_2__.Modifier.Position.RIGHT) { + x = this.width + 2; // FIXME: modifier padding, move to font file + } + else if (position === _modifier__WEBPACK_IMPORTED_MODULE_2__.Modifier.Position.BELOW || position === _modifier__WEBPACK_IMPORTED_MODULE_2__.Modifier.Position.ABOVE) { + const note_glyph_width = this.glyph.getWidth(); + x = note_glyph_width / 2; + } + return { + x: this.getAbsoluteX() + x, + y: this.ys[index], + }; + } + // Get the default line for rest + getLineForRest() { + return Number(this.positions[0].str); + } + // Pre-render formatting + preFormat() { + if (this.preFormatted) + return; + if (this.modifierContext) + this.modifierContext.preFormat(); + // width is already set during init() + this.preFormatted = true; + } + // Get the x position for the stem + getStemX() { + return this.getCenterGlyphX(); + } + // Get the y position for the stem + getStemY() { + const num_lines = this.checkStave().getNumLines(); + // The decimal staff line amounts provide optimal spacing between the + // fret number and the stem + const stemUpLine = -0.5; + const stemDownLine = num_lines - 0.5; + const stemStartLine = _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP === this.stem_direction ? stemUpLine : stemDownLine; + return this.checkStave().getYForLine(stemStartLine); + } + // Get the stem extents for the tabnote + getStemExtents() { + return this.checkStem().getExtents(); + } + // Draw the fal onto the context + drawFlag() { + const { beam, glyph, stem_direction, render_options: { draw_stem, glyph_font_scale }, } = this; + const context = this.checkContext(); + const shouldDrawFlag = beam == undefined && draw_stem; + // Now it's the flag's turn. + if (glyph.flag && shouldDrawFlag) { + const flag_x = this.getStemX() + 1; + const flag_y = this.getStemY() - this.checkStem().getHeight(); + const flag_code = stem_direction === _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.DOWN + ? glyph.code_flag_downstem // Down stems have flags on the left. + : glyph.code_flag_upstem; + // Draw the Flag + _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.renderGlyph(context, flag_x, flag_y, glyph_font_scale, flag_code, { category: 'flag.tabStem' }); + } + } + // Render the modifiers onto the context. + drawModifiers() { + this.modifiers.forEach((modifier) => { + // Only draw the dots if enabled. + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_6__.isDot)(modifier) && !this.render_options.draw_dots) { + return; + } + modifier.setContext(this.getContext()); + modifier.drawWithStyle(); + }); + } + // Render the stem extension through the fret positions + drawStemThrough() { + const stemX = this.getStemX(); + const stemY = this.getStemY(); + const ctx = this.checkContext(); + const drawStem = this.render_options.draw_stem; + const stemThrough = this.render_options.draw_stem_through_stave; + if (drawStem && stemThrough) { + const numLines = this.checkStave().getNumLines(); + const stringsUsed = this.positions.map((position) => Number(position.str)); + const unusedStrings = getUnusedStringGroups(numLines, stringsUsed); + const stemLines = getPartialStemLines(stemY, unusedStrings, this.checkStave(), this.getStemDirection()); + ctx.save(); + ctx.setLineWidth(_stem__WEBPACK_IMPORTED_MODULE_3__.Stem.WIDTH); + stemLines.forEach((bounds) => { + if (bounds.length === 0) + return; + ctx.beginPath(); + ctx.moveTo(stemX, bounds[0]); + ctx.lineTo(stemX, bounds[bounds.length - 1]); + ctx.stroke(); + ctx.closePath(); + }); + ctx.restore(); + } + } + // Render the fret positions onto the context + drawPositions() { + const ctx = this.checkContext(); + const x = this.getAbsoluteX(); + const ys = this.ys; + for (let i = 0; i < this.positions.length; ++i) { + const y = ys[i] + this.render_options.y_shift; + const glyph = this.glyphs[i]; + // Center the fret text beneath the notation note head + const note_glyph_width = this.glyph.getWidth(); + const tab_x = x + note_glyph_width / 2 - glyph.getWidth() / 2; + // FIXME: Magic numbers. + ctx.clearRect(tab_x - 2, y - 3, glyph.getWidth() + 4, 6); + if (glyph.code) { + _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.renderGlyph(ctx, tab_x, y, this.render_options.glyph_font_scale * this.render_options.scale, glyph.code); + } + else { + ctx.save(); + ctx.setFont(this.render_options.font); + const text = glyph.text.toString(); + ctx.fillText(text, tab_x, y + 5 * this.render_options.scale); + ctx.restore(); + } + } + } + // The main rendering function for the entire note. + draw() { + const ctx = this.checkContext(); + if (this.ys.length === 0) { + throw new _util__WEBPACK_IMPORTED_MODULE_7__.RuntimeError('NoYValues', "Can't draw note without Y values."); + } + this.setRendered(); + const render_stem = this.beam == undefined && this.render_options.draw_stem; + ctx.openGroup('tabnote', undefined, { pointerBBox: true }); + this.drawPositions(); + this.drawStemThrough(); + if (this.stem && render_stem) { + const stem_x = this.getStemX(); + this.stem.setNoteHeadXBounds(stem_x, stem_x); + ctx.openGroup('stem', undefined, { pointerBBox: true }); + this.stem.setContext(ctx).draw(); + ctx.closeGroup(); + } + this.drawFlag(); + this.drawModifiers(); + ctx.closeGroup(); + } +} + + +/***/ }), + +/***/ "./src/tabslide.ts": +/*!*************************!*\ + !*** ./src/tabslide.ts ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TabSlide": () => (/* binding */ TabSlide) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _tabtie__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tabtie */ "./src/tabtie.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// This class implements varies types of ties between contiguous notes. The +// ties include: regular ties, hammer ons, pull offs, and slides. + + + + +class TabSlide extends _tabtie__WEBPACK_IMPORTED_MODULE_1__.TabTie { + /** + * @param notes is a struct of the form: + * { + * first_note: Note, + * last_note: Note, + * first_indices: [n1, n2, n3], + * last_indices: [n1, n2, n3] + * } + * @param notes.first_note the starting note of the slide + * @param notes.last_note the ending note of the slide + * @param notes.first_indices specifies which string + fret positions of the TabNote are used in this slide. zero indexed. + * @param notes.last_indices currently unused. we assume it's the same as first_indices. + * + * @param direction TabSlide.SLIDE_UP or TabSlide.SLIDE_DOWN + */ + constructor(notes, direction) { + super(notes, 'sl.'); + // Determine the direction automatically if it is not provided. + if (!direction) { + let first_fret = notes.first_note.getPositions()[0].fret; + if (typeof first_fret === 'string') { + first_fret = parseInt(first_fret, 10); + } + let last_fret = notes.last_note.getPositions()[0].fret; + if (typeof last_fret === 'string') { + last_fret = parseInt(last_fret, 10); + } + // If either of the frets are 'X', parseInt() above will return NaN. + // Choose TabSlide.SLIDE_UP by default. + if (isNaN(first_fret) || isNaN(last_fret)) { + direction = TabSlide.SLIDE_UP; + } + else { + direction = first_fret > last_fret ? TabSlide.SLIDE_DOWN : TabSlide.SLIDE_UP; + } + } + this.direction = direction; + this.render_options.cp1 = 11; + this.render_options.cp2 = 14; + this.render_options.y_shift = 0.5; + this.resetFont(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_2__.Category.TabSlide; + } + static get SLIDE_UP() { + return 1; + } + static get SLIDE_DOWN() { + return -1; + } + static createSlideUp(notes) { + return new TabSlide(notes, TabSlide.SLIDE_UP); + } + static createSlideDown(notes) { + return new TabSlide(notes, TabSlide.SLIDE_DOWN); + } + renderTie(params) { + if (params.first_ys.length === 0 || params.last_ys.length === 0) { + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('BadArguments', 'No Y-values to render'); + } + const ctx = this.checkContext(); + const first_x_px = params.first_x_px; + const first_ys = params.first_ys; + const last_x_px = params.last_x_px; + const direction = params.direction; + if (direction !== TabSlide.SLIDE_UP && direction !== TabSlide.SLIDE_DOWN) { + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('BadSlide', 'Invalid slide direction'); + } + // eslint-disable-next-line + const first_indices = this.notes.first_indices; + for (let i = 0; i < first_indices.length; ++i) { + const slide_y = first_ys[first_indices[i]] + this.render_options.y_shift; + if (isNaN(slide_y)) { + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('BadArguments', 'Bad indices for slide rendering.'); + } + ctx.beginPath(); + ctx.moveTo(first_x_px, slide_y + 3 * direction); + ctx.lineTo(last_x_px, slide_y - 3 * direction); + ctx.closePath(); + ctx.stroke(); + } + this.setRendered(); + } +} +TabSlide.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_0__.Font.SERIF, + size: 10, + weight: _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.BOLD, + style: _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.ITALIC, +}; + + +/***/ }), + +/***/ "./src/tabstave.ts": +/*!*************************!*\ + !*** ./src/tabstave.ts ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TabStave": () => (/* binding */ TabStave) +/* harmony export */ }); +/* harmony import */ var _stave__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./stave */ "./src/stave.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. + + +class TabStave extends _stave__WEBPACK_IMPORTED_MODULE_0__.Stave { + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_1__.Category.TabStave; + } + constructor(x, y, width, options) { + const tab_options = Object.assign({ spacing_between_lines_px: 13, num_lines: 6, top_text_position: 1 }, options); + super(x, y, width, tab_options); + } + getYForGlyphs() { + return this.getYForLine(2.5); + } + // Deprecated + addTabGlyph() { + this.addClef('tab'); + return this; + } +} + + +/***/ }), + +/***/ "./src/tabtie.ts": +/*!***********************!*\ + !*** ./src/tabtie.ts ***! + \***********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TabTie": () => (/* binding */ TabTie) +/* harmony export */ }); +/* harmony import */ var _stavetie__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./stavetie */ "./src/stavetie.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// / [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// ## Description +// This class implements varies types of ties between contiguous notes. The +// ties include: regular ties, hammer ons, pull offs, and slides. + + +class TabTie extends _stavetie__WEBPACK_IMPORTED_MODULE_0__.StaveTie { + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_1__.Category.TabTie; + } + static createHammeron(notes) { + return new TabTie(notes, 'H'); + } + static createPulloff(notes) { + return new TabTie(notes, 'P'); + } + /** + * @param notes is a struct that has: + * { + * first_note: Note, + * last_note: Note, + * first_indices: [n1, n2, n3], + * last_indices: [n1, n2, n3] + * } + * + * @param text + */ + constructor(notes, text) { + super(notes, text); + this.render_options.cp1 = 9; + this.render_options.cp2 = 11; + this.render_options.y_shift = 3; + this.direction = -1; // Tab tie's are always face up. + } +} + + +/***/ }), + +/***/ "./src/textbracket.ts": +/*!****************************!*\ + !*** ./src/textbracket.ts ***! + \****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TextBracketPosition": () => (/* binding */ TextBracketPosition), +/* harmony export */ "TextBracket": () => (/* binding */ TextBracket) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _renderer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./renderer */ "./src/renderer.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author: Cyril Silverman +// +// This file implements `TextBrackets` which extend between two notes. +// The octave transposition markings (8va, 8vb, 15va, 15vb) can be created +// using this class. + + + + + + +// To enable logging for this class. Set `Vex.Flow.TextBracket.DEBUG` to `true`. +// eslint-disable-next-line +function L(...args) { + if (TextBracket.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_5__.log)('Vex.Flow.TextBracket', args); +} +var TextBracketPosition; +(function (TextBracketPosition) { + TextBracketPosition[TextBracketPosition["TOP"] = 1] = "TOP"; + TextBracketPosition[TextBracketPosition["BOTTOM"] = -1] = "BOTTOM"; +})(TextBracketPosition || (TextBracketPosition = {})); +class TextBracket extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + constructor({ start, stop, text = '', superscript = '', position = TextBracketPosition.TOP }) { + super(); + this.start = start; + this.stop = stop; + this.text = text; + this.superscript = superscript; + this.position = typeof position === 'string' ? TextBracket.PositionString[position] : position; + this.line = 1; + this.resetFont(); + this.render_options = { + dashed: true, + dash: [5], + color: 'black', + line_width: 1, + show_bracket: true, + bracket_height: 8, + // In the BOTTOM position, the bracket line can extend + // under the superscript. + underline_superscript: true, + }; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_4__.Category.TextBracket; + } + static get Position() { + return TextBracketPosition; + } + static get PositionString() { + return { + top: TextBracketPosition.TOP, + bottom: TextBracketPosition.BOTTOM, + }; + } + /** + * @deprecated Use `TextBracket.Position` instead. + */ + static get Positions() { + L('Positions is deprecated, use TextBracketPosition instead.'); + return TextBracketPosition; + } + /** + * @deprecated Use `TextBracket.PositionString` instead. + */ + static get PositionsString() { + L('PositionsString is deprecated, use PositionString instead.'); + return TextBracket.PositionString; + } + /** + * Apply the text backet styling to the provided context. + * @param ctx + * @returns this + */ + applyStyle(ctx) { + ctx.setFont(this.font); + const options = this.render_options; + ctx.setStrokeStyle(options.color); + ctx.setFillStyle(options.color); + ctx.setLineWidth(options.line_width); + return this; + } + // Set whether the bracket line should be `dashed`. You can also + // optionally set the `dash` pattern by passing in an array of numbers + setDashed(dashed, dash) { + this.render_options.dashed = dashed; + if (dash) + this.render_options.dash = dash; + return this; + } + // Set the rendering `context` for the octave bracket + setLine(line) { + this.line = line; + return this; + } + // Draw the octave bracket on the rendering context + draw() { + const ctx = this.checkContext(); + this.setRendered(); + let y = 0; + switch (this.position) { + case TextBracketPosition.TOP: + y = this.start.checkStave().getYForTopText(this.line); + break; + case TextBracketPosition.BOTTOM: + y = this.start.checkStave().getYForBottomText(this.line + _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.TEXT_HEIGHT_OFFSET_HACK); + break; + default: + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('InvalidPosition', `The position ${this.position} is invalid.`); + } + // Get the preliminary start and stop coordintates for the bracket + const start = { x: this.start.getAbsoluteX(), y }; + const stop = { x: this.stop.getAbsoluteX(), y }; + L('Rendering TextBracket: start:', start, 'stop:', stop, 'y:', y); + const bracket_height = this.render_options.bracket_height * this.position; + ctx.save(); + this.applyStyle(ctx); + // Draw text + ctx.fillText(this.text, start.x, start.y); + // Get the width and height for the octave number + const main_measure = ctx.measureText(this.text); + const main_width = main_measure.width; + const main_height = main_measure.height; + // Calculate the y position for the super script + const super_y = start.y - main_height / 2.5; + // We called this.resetFont() in the constructor, so we know this.textFont is available. + // eslint-disable-next-line + const { family, size, weight, style } = this.textFont; + // To draw the superscript, we scale the font size by 1/1.4. + const smallerFontSize = _font__WEBPACK_IMPORTED_MODULE_1__.Font.scaleSize(size, 0.714286); + ctx.setFont(family, smallerFontSize, weight, style); + ctx.fillText(this.superscript, start.x + main_width + 1, super_y); + // Determine width and height of the superscript + const super_measure = ctx.measureText(this.superscript); + const super_width = super_measure.width; + const super_height = super_measure.height; + // Setup initial coordinates for the bracket line + let start_x = start.x; + let line_y = super_y; + const end_x = stop.x + this.stop.getGlyph().getWidth(); + // Adjust x and y coordinates based on position + if (this.position === TextBracketPosition.TOP) { + start_x += main_width + super_width + 5; + line_y -= super_height / 2.7; + } + else if (this.position === TextBracketPosition.BOTTOM) { + line_y += super_height / 2.7; + start_x += main_width + 2; + if (!this.render_options.underline_superscript) { + start_x += super_width; + } + } + if (this.render_options.dashed) { + // Main line + _renderer__WEBPACK_IMPORTED_MODULE_2__.Renderer.drawDashedLine(ctx, start_x, line_y, end_x, line_y, this.render_options.dash); + // Ending Bracket + if (this.render_options.show_bracket) { + _renderer__WEBPACK_IMPORTED_MODULE_2__.Renderer.drawDashedLine(ctx, end_x, line_y + 1 * this.position, end_x, line_y + bracket_height, this.render_options.dash); + } + } + else { + ctx.beginPath(); + ctx.moveTo(start_x, line_y); + // Main line + ctx.lineTo(end_x, line_y); + if (this.render_options.show_bracket) { + // Ending bracket + ctx.lineTo(end_x, line_y + bracket_height); + } + ctx.stroke(); + ctx.closePath(); + } + ctx.restore(); + } +} +TextBracket.DEBUG = false; +TextBracket.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_1__.Font.SERIF, + size: 15, + weight: _font__WEBPACK_IMPORTED_MODULE_1__.FontWeight.NORMAL, + style: _font__WEBPACK_IMPORTED_MODULE_1__.FontStyle.ITALIC, +}; + + +/***/ }), + +/***/ "./src/textdynamics.ts": +/*!*****************************!*\ + !*** ./src/textdynamics.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TextDynamics": () => (/* binding */ TextDynamics) +/* harmony export */ }); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./note */ "./src/note.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + +// eslint-disable-next-line +function L(...args) { + if (TextDynamics.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_3__.log)('Vex.Flow.TextDynamics', args); +} +/** + * `TextDynamics` renders traditional + * text dynamics markings, **ie: p, f, sfz, rfz, ppp** + * + * You can render any dynamics string that contains a combination of + * the following letters: P, M, F, Z, R, S + */ +class TextDynamics extends _note__WEBPACK_IMPORTED_MODULE_1__.Note { + /** + * Create the dynamics marking. + * + * A `TextDynamics` object inherits from `Note` so that it can be formatted + * within a `Voice`. + * + * @param noteStruct an object that contains a `duration` property and a + * `sequence` of letters that represents the letters to render. + */ + constructor(noteStruct) { + super(noteStruct); + this.sequence = (noteStruct.text || '').toLowerCase(); + this.line = noteStruct.line || 0; + this.glyphs = []; + this.render_options = Object.assign(Object.assign({}, this.render_options), { glyph_font_size: 40 }); + L('New Dynamics Text: ', this.sequence); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_2__.Category.TextDynamics; + } + /** The glyph data for each dynamics letter. */ + static get GLYPHS() { + return { + f: { + code: 'dynamicForte', + width: 12, + }, + p: { + code: 'dynamicPiano', + width: 14, + }, + m: { + code: 'dynamicMezzo', + width: 17, + }, + s: { + code: 'dynamicSforzando', + width: 10, + }, + z: { + code: 'dynamicZ', + width: 12, + }, + r: { + code: 'dynamicRinforzando', + width: 12, + }, + }; + } + /** Set the Stave line on which the note should be placed. */ + setLine(line) { + this.line = line; + return this; + } + /** Preformat the dynamics text. */ + preFormat() { + let total_width = 0; + // length of this.glyphs must be <= + // length of this.sequence, so if we're formatted before + // create new glyphs. + this.glyphs = []; + // Iterate through each letter + this.sequence.split('').forEach((letter) => { + // Get the glyph data for the letter + const glyph_data = TextDynamics.GLYPHS[letter]; + if (!glyph_data) + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('Invalid dynamics character: ' + letter); + const size = (0,_util__WEBPACK_IMPORTED_MODULE_3__.defined)(this.render_options.glyph_font_size); + const glyph = new _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph(glyph_data.code, size, { category: 'textNote' }); + // Add the glyph + this.glyphs.push(glyph); + total_width += glyph_data.width; + }); + // Store the width of the text + this.setWidth(total_width); + this.preFormatted = true; + return this; + } + /** Draw the dynamics text on the rendering context. */ + draw() { + this.setRendered(); + const x = this.getAbsoluteX(); + const y = this.checkStave().getYForLine(this.line + -3); + L('Rendering Dynamics: ', this.sequence); + let letter_x = x; + this.glyphs.forEach((glyph, index) => { + const current_letter = this.sequence[index]; + glyph.render(this.checkContext(), letter_x, y); + letter_x += TextDynamics.GLYPHS[current_letter].width; + }); + } +} +/** To enable logging for this class. Set `Vex.Flow.TextDynamics.DEBUG` to `true`. */ +TextDynamics.DEBUG = false; + + +/***/ }), + +/***/ "./src/textformatter.ts": +/*!******************************!*\ + !*** ./src/textformatter.ts ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TextFormatter": () => (/* binding */ TextFormatter) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + +// eslint-disable-next-line +function L(...args) { + if (TextFormatter.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_1__.log)('Vex.Flow.TextFormatter', args); +} +/** + * Text widths are stored in a cache, so we don't have to recompute widths + * for the same font + string combination. + * + * The cache is first keyed by the font information. The key is of the form: + * `${family}-${size}-${weight}-${style}` + * The second level key is the specific text to be measured. + * + * The stored value is the measured width in `em` units. + * textWidth == textWidthCache[cacheKey][textToMeasure] + */ +const textWidthCache = {}; +/** + * Applications may register additional fonts via `TextFormatter.registerInfo(info)`. + * The metrics for those fonts will be made available to the application. + */ +const registry = {}; +class TextFormatter { + /** + * Use `TextFormatter.create(...)` to build an instance from information previously + * registered via `TextFormatter.registerInfo(info)`. + */ + constructor(formatterInfo) { + /** Font family. */ + this.family = ''; + /** Specified in `pt` units. */ + this.size = 14; + /** Font metrics are extracted at 1000 upem (units per em). */ + this.resolution = 1000; + /** + * For text formatting, we do not require glyph outlines, but instead rely on glyph + * bounding box metrics such as: + * ``` + * { + * x_min: 48, + * x_max: 235, + * y_min: -17, + * y_max: 734, + * ha: 751, + * leftSideBearing: 48, + * advanceWidth: 286, + * } + * ``` + */ + this.glyphs = {}; + this.serifs = false; + this.monospaced = false; + this.italic = false; + this.bold = false; + this.superscriptOffset = 0; + this.subscriptOffset = 0; + this.maxSizeGlyph = 'H'; + // This is an internal key used to index the `textWidthCache`. + this.cacheKey = ''; + this.updateParams(formatterInfo); + } + /** + * Return all registered font families. + */ + static getFontFamilies() { + const registeredFonts = []; + for (const fontFamily in registry) { + const formatterInfo = registry[fontFamily]; + registeredFonts.push(Object.assign({}, formatterInfo)); + } + return registeredFonts; + } + /** + * Call `TextFormatter.registerInfo(info)` to register font information before using this method. + * + * This method creates a formatter for the font that most closely matches the requested font. + * We compare font family, bold, and italic attributes. + * This method will return a fallback formatter if there are no matches. + */ + static create(requestedFont = {}) { + L('create: ', requestedFont); + if (!requestedFont.family) { + requestedFont.family = _font__WEBPACK_IMPORTED_MODULE_0__.Font.SANS_SERIF; + } + // TODO: One potential (small) optimization is to cache the TextFormatter object + // returned for each font info. We would probably want to clear the cache if + // the registry is ever updated. + const candidates = []; + // The incoming font family is a string of comma-separated font family names. + // (e.g., `PetalumaScript, Arial, sans-serif`). + const requestedFamilies = requestedFont.family.split(/\s*,\s*/); + for (const requestedFamily of requestedFamilies) { + for (const fontFamily in registry) { + // Support cases where the registry contains 'Roboto Slab Medium', + // but the requestedFont.family is 'Roboto Slab'. + if (fontFamily.startsWith(requestedFamily)) { + candidates.push(registry[fontFamily]); + } + } + if (candidates.length > 0) { + break; + } + } + let formatter; + if (candidates.length === 0) { + // No match, so return a fallback text formatter. + formatter = new TextFormatter(Object.values(registry)[0]); + } + else if (candidates.length === 1) { + formatter = new TextFormatter(candidates[0]); + } + else { + const bold = _font__WEBPACK_IMPORTED_MODULE_0__.Font.isBold(requestedFont.weight); + const italic = _font__WEBPACK_IMPORTED_MODULE_0__.Font.isItalic(requestedFont.style); + const perfectMatch = candidates.find((f) => f.bold === bold && f.italic === italic); + if (perfectMatch) { + formatter = new TextFormatter(perfectMatch); + } + else { + const partialMatch = candidates.find((f) => f.italic === italic || f.bold === bold); + if (partialMatch) { + formatter = new TextFormatter(partialMatch); + } + else { + formatter = new TextFormatter(candidates[0]); + } + } + } + const fontSize = requestedFont.size; + if (typeof fontSize !== 'undefined') { + const fontSizeInPt = _font__WEBPACK_IMPORTED_MODULE_0__.Font.convertSizeToPointValue(fontSize); + formatter.setFontSize(fontSizeInPt); + } + return formatter; + } + /** + * @param fontFamily used as a key to the font registry. + * @returns the same info object that was passed in via `TextFormatter.registerInfo(info)` + */ + static getInfo(fontFamily) { + return registry[fontFamily]; + } + /** + * Apps may register their own fonts and metrics, and those metrics + * will be available to the app for formatting. + * + * Metrics can be generated from a font file using fontgen_text.js in the tools/fonts directory. + * @param info + * @param overwrite + */ + static registerInfo(info, overwrite = false) { + L('registerInfo: ', info, overwrite); + const fontFamily = info.family; + const currFontInfo = registry[fontFamily]; + if (currFontInfo === undefined || overwrite) { + registry[fontFamily] = info; + } + } + updateParams(params) { + if (params.family) + this.family = params.family; + if (params.resolution) + this.resolution = params.resolution; + if (params.glyphs) + this.glyphs = params.glyphs; + if (params.serifs) + this.serifs = params.serifs; + if (params.monospaced) + this.monospaced = params.monospaced; + if (params.italic) + this.italic = params.italic; + if (params.bold) + this.bold = params.bold; + if (params.maxSizeGlyph) + this.maxSizeGlyph = params.maxSizeGlyph; + if (params.superscriptOffset) + this.superscriptOffset = params.superscriptOffset; + if (params.subscriptOffset) + this.subscriptOffset = params.subscriptOffset; + this.updateCacheKey(); + } + /** Create a hash with the current font data, so we can cache computed widths. */ + updateCacheKey() { + const family = this.family.replace(/\s+/g, '_'); + const size = this.size; + const weight = this.bold ? _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.BOLD : _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.NORMAL; + const style = this.italic ? _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.ITALIC : _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.NORMAL; + // Use the same key format as SVGContext. + this.cacheKey = `${family}%${size}%${weight}%${style}`; + } + /** + * The glyphs table is indexed by the character (e.g., 'C', '@'). + * See: robotoslab_glyphs.ts & petalumascript_glyphs.ts. + */ + getGlyphMetrics(character) { + if (this.glyphs[character]) { + return this.glyphs[character]; + } + else { + return this.glyphs[this.maxSizeGlyph]; + } + } + get maxHeight() { + const metrics = this.getGlyphMetrics(this.maxSizeGlyph); + return (metrics.ha / this.resolution) * this.fontSizeInPixels; + } + /** + * Retrieve the character's advanceWidth as a fraction of an `em` unit. + * For the space character ' ' as defined in the: + * petalumascript_glyphs.ts: 250 advanceWidth in the 1000 unitsPerEm font returns 0.25. + * robotoslab_glyphs.ts: 509 advanceWidth in the 2048 unitsPerEm font returns 0.2485. + */ + getWidthForCharacterInEm(c) { + var _a; + const metrics = this.getGlyphMetrics(c); + if (!metrics) { + // An arbitrary number, close to the `em` width of the '#' and '5' characters in PetalumaScript. + return 0.65; + } + else { + const advanceWidth = (_a = metrics.advanceWidth) !== null && _a !== void 0 ? _a : 0; + return advanceWidth / this.resolution; + } + } + /** + * Retrieve the total width of `text` in `em` units. + */ + getWidthForTextInEm(text) { + const key = this.cacheKey; + // Get the cache for this specific font family, size, weight, style combination. + // The cache contains previously computed widths for different `text` strings. + let cachedWidths = textWidthCache[key]; + if (cachedWidths === undefined) { + cachedWidths = {}; + textWidthCache[key] = cachedWidths; + } + let width = cachedWidths[text]; + if (width === undefined) { + width = 0; + for (let i = 0; i < text.length; ++i) { + width += this.getWidthForCharacterInEm(text[i]); + } + cachedWidths[text] = width; + } + return width; + } + /** The width of the text (in `em`) is scaled by the font size (in `px`). */ + getWidthForTextInPx(text) { + return this.getWidthForTextInEm(text) * this.fontSizeInPixels; + } + /** + * @param size in pt. + */ + setFontSize(size) { + this.size = size; + // The width cache key depends on the current font size. + this.updateCacheKey(); + return this; + } + /** `this.size` is specified in points. Convert to pixels. */ + get fontSizeInPixels() { + return this.size * _font__WEBPACK_IMPORTED_MODULE_0__.Font.scaleToPxFrom.pt; + } + getResolution() { + return this.resolution; + } +} +/** To enable logging for this class. Set `Vex.Flow.TextFormatter.DEBUG` to `true`. */ +TextFormatter.DEBUG = false; + + +/***/ }), + +/***/ "./src/textnote.ts": +/*!*************************!*\ + !*** ./src/textnote.ts ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Justification": () => (/* binding */ Justification), +/* harmony export */ "TextNote": () => (/* binding */ TextNote) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./note */ "./src/note.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + +var Justification; +(function (Justification) { + Justification[Justification["LEFT"] = 1] = "LEFT"; + Justification[Justification["CENTER"] = 2] = "CENTER"; + Justification[Justification["RIGHT"] = 3] = "RIGHT"; +})(Justification || (Justification = {})); +/** + * `TextNote` is a notation element that is positioned in time. Generally + * meant for objects that sit above/below the staff and inline with each other. + * `TextNote` has to be assigned to a `Stave` before rendering by means of `setStave`. + * Examples of this would be such as dynamics, lyrics, chord changes, etc. + */ +class TextNote extends _note__WEBPACK_IMPORTED_MODULE_2__.Note { + constructor(noteStruct) { + super(noteStruct); + this.text = noteStruct.text || ''; + this.superscript = noteStruct.superscript; + this.subscript = noteStruct.subscript; + this.setFont(noteStruct.font); + this.line = noteStruct.line || 0; + this.smooth = noteStruct.smooth || false; + this.ignore_ticks = noteStruct.ignore_ticks || false; + this.justification = Justification.LEFT; + // Determine and set initial note width. Note that the text width is + // an approximation and isn't very accurate. The only way to accurately + // measure the length of text is with `CanvasRenderingContext2D.measureText()`. + if (noteStruct.glyph) { + const struct = TextNote.GLYPHS[noteStruct.glyph]; + if (!struct) + throw new _util__WEBPACK_IMPORTED_MODULE_4__.RuntimeError('Invalid glyph type: ' + noteStruct.glyph); + this.glyph = new _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph(struct.code, 40, { category: 'textNote' }); + this.setWidth(this.glyph.getMetrics().width); + } + else { + this.glyph = undefined; + } + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.TextNote; + } + static get Justification() { + return Justification; + } + /** Glyph data. */ + static get GLYPHS() { + return { + segno: { + code: 'segno', + }, + tr: { + code: 'ornamentTrill', + }, + mordent: { + code: 'ornamentMordent', + }, + mordent_upper: { + code: 'ornamentShortTrill', + }, + mordent_lower: { + code: 'ornamentMordent', + }, + f: { + code: 'dynamicForte', + }, + p: { + code: 'dynamicPiano', + }, + m: { + code: 'dynamicMezzo', + }, + s: { + code: 'dynamicSforzando', + }, + z: { + code: 'dynamicZ', + }, + coda: { + code: 'coda', + }, + pedal_open: { + code: 'keyboardPedalPed', + }, + pedal_close: { + code: 'keyboardPedalUp', + }, + caesura_straight: { + code: 'caesura', + }, + caesura_curved: { + code: 'caesuraCurved', + }, + breath: { + code: 'breathMarkComma', + }, + tick: { + code: 'breathMarkTick', + }, + turn: { + code: 'ornamentTurn', + }, + turn_inverted: { + code: 'ornamentTurnSlash', + }, + }; + } + /** Set the horizontal justification of the TextNote. */ + setJustification(just) { + this.justification = just; + return this; + } + /** Set the Stave line on which the note should be placed. */ + setLine(line) { + this.line = line; + return this; + } + /** Pre-render formatting. */ + preFormat() { + if (this.preFormatted) + return; + const tickContext = this.checkTickContext(`Can't preformat without a TickContext.`); + if (this.smooth) { + this.setWidth(0); + } + else { + if (this.glyph) { + // Width already set. + } + else { + const ctx = this.checkContext(); + ctx.setFont(this.textFont); + this.setWidth(ctx.measureText(this.text).width); + } + } + if (this.justification === Justification.CENTER) { + this.leftDisplacedHeadPx = this.width / 2; + } + else if (this.justification === Justification.RIGHT) { + this.leftDisplacedHeadPx = this.width; + } + // We reposition to the center of the note head + this.rightDisplacedHeadPx = tickContext.getMetrics().glyphPx / 2; + this.preFormatted = true; + } + /** + * Renders the TextNote. + * `TextNote` has to be assigned to a `Stave` before rendering by means of `setStave`. + */ + draw() { + const ctx = this.checkContext(); + const stave = this.checkStave(); + const tickContext = this.checkTickContext(`Can't draw without a TickContext.`); + this.setRendered(); + // Reposition to center of note head + let x = this.getAbsoluteX() + tickContext.getMetrics().glyphPx / 2; + // Align based on tick-context width. + const width = this.getWidth(); + if (this.justification === Justification.CENTER) { + x -= width / 2; + } + else if (this.justification === Justification.RIGHT) { + x -= width; + } + let y; + if (this.glyph) { + y = stave.getYForLine(this.line + -3); + this.glyph.render(ctx, x, y); + } + else { + y = stave.getYForLine(this.line + -3); + this.applyStyle(ctx); + ctx.setFont(this.textFont); + ctx.fillText(this.text, x, y); + const height = ctx.measureText(this.text).height; + // We called this.setFont(...) in the constructor, so we know this.textFont is available. + // eslint-disable-next-line + const { family, size, weight, style } = this.textFont; + // Scale the font size by 1/1.3. + const smallerFontSize = _font__WEBPACK_IMPORTED_MODULE_0__.Font.scaleSize(size, 0.769231); + if (this.superscript) { + ctx.setFont(family, smallerFontSize, weight, style); + ctx.fillText(this.superscript, x + this.width + 2, y - height / 2.2); + } + if (this.subscript) { + ctx.setFont(family, smallerFontSize, weight, style); + ctx.fillText(this.subscript, x + this.width + 2, y + height / 2.2 - 1); + } + this.restoreStyle(ctx); + } + } +} +TextNote.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_0__.Font.SANS_SERIF, + size: 12, + weight: _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.NORMAL, + style: _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.NORMAL, +}; + + +/***/ }), + +/***/ "./src/tickable.ts": +/*!*************************!*\ + !*** ./src/tickable.ts ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Tickable": () => (/* binding */ Tickable) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _fraction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./fraction */ "./src/fraction.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + +/** + * Tickable represents a element that sit on a score and + * has a duration, i.e., Tickables occupy space in the musical rendering dimension. + */ +class Tickable extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + constructor() { + super(); + this._preFormatted = false; + this._postFormatted = false; + // These properties represent the duration of + // this tickable element. + this.ticks = new _fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(0, 1); // Fractional value of ticks + this.intrinsicTicks = 0; // Floating point value of ticks + this.tickMultiplier = new _fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(1, 1); + // Formatter metrics + this.width = 0; + this.x_shift = 0; // Shift from tick context + this.modifiers = []; + this.tupletStack = []; + this.align_center = false; + this.center_x_shift = 0; // Shift from tick context if center aligned + // This flag tells the formatter to ignore this tickable during + // formatting and justification. It is set by tickables such as BarNote. + this.ignore_ticks = false; + // This is a space for an external formatting class or function to maintain + // metrics. + this.formatterMetrics = { + // The freedom of a tickable is the distance it can move without colliding + // with neighboring elements. A formatter can set these values during its + // formatting pass, which a different formatter can then use to fine tune. + freedom: { left: 0, right: 0 }, + // The simplified rational duration of this tick as a string. It can be + // used as an index to a map or hashtable. + duration: '', + // The number of formatting iterations undergone. + iterations: 0, + // The space in pixels allocated by this formatter, along with the mean space + // for tickables of this duration, and the deviation from the mean. + space: { + used: 0, + mean: 0, + deviation: 0, + }, + }; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.Tickable; + } + /** Reset the Tickable, this function will be overloaded. */ + reset() { + return this; + } + /** Return the ticks. */ + getTicks() { + return this.ticks; + } + /** Check if it ignores the ticks. */ + shouldIgnoreTicks() { + return this.ignore_ticks; + } + /** Ignore the ticks. */ + setIgnoreTicks(flag) { + this.ignore_ticks = flag; + return this; + } + /** Set width of note. Used by the formatter for positioning. */ + setWidth(width) { + this.width = width; + } + /** Get width of note. Used by the formatter for positioning. */ + getWidth() { + if (!this._preFormatted) { + throw new _util__WEBPACK_IMPORTED_MODULE_4__.RuntimeError('UnformattedNote', "Can't call GetWidth on an unformatted note."); + } + return this.width + (this.modifierContext ? this.modifierContext.getWidth() : 0); + } + /** Displace note by `x` pixels. Used by the formatter. */ + setXShift(x) { + this.x_shift = x; + return this; + } + /** Get the `x` displaced pixels of the note. */ + getXShift() { + return this.x_shift; + } + /** Get `x` position of this tick context. */ + getX() { + const tickContext = this.checkTickContext(`Can't getX() without a TickContext.`); + return tickContext.getX() + this.x_shift; + } + /** Return the formatterMetrics. */ + getFormatterMetrics() { + return this.formatterMetrics; + } + /** Return the center `x` shift. */ + getCenterXShift() { + if (this.isCenterAligned()) { + return this.center_x_shift; + } + return 0; + } + /** Set the center `x` shift. */ + setCenterXShift(centerXShift) { + this.center_x_shift = centerXShift; + return this; + } + // Check if tickable is center aligned. */ + isCenterAligned() { + return this.align_center; + } + // Set/unset center alignment. */ + setCenterAlignment(align_center) { + this.align_center = align_center; + return this; + } + /** + * Return the associated voice. Every tickable must be associated with a voice. + * This allows formatters and preFormatter to associate them with the right modifierContexts. + */ + getVoice() { + return (0,_util__WEBPACK_IMPORTED_MODULE_4__.defined)(this.voice, 'NoVoice', 'Tickable has no voice.'); + } + /** Set the associated voice. */ + setVoice(voice) { + this.voice = voice; + } + /** Get the tuplet. */ + getTuplet() { + return this.tuplet; + } + /** Return the intrinsic ticks. */ + getTupletStack() { + return this.tupletStack; + } + /** + * Reset the specific Tuplet if this is not provided, all tuplets are reset. + * Remove any prior tuplets from the tick calculation and + * reset the intrinsic tick value. + */ + resetTuplet(tuplet) { + let noteCount; + let notesOccupied; + if (tuplet) { + const i = this.tupletStack.indexOf(tuplet); + if (i !== -1) { + this.tupletStack.splice(i, 1); + noteCount = tuplet.getNoteCount(); + notesOccupied = tuplet.getNotesOccupied(); + // Revert old multiplier by inverting numerator & denom.: + this.applyTickMultiplier(noteCount, notesOccupied); + } + return this; + } + while (this.tupletStack.length) { + tuplet = this.tupletStack.pop(); + noteCount = tuplet.getNoteCount(); + notesOccupied = tuplet.getNotesOccupied(); + // Revert old multiplier by inverting numerator & denom.: + this.applyTickMultiplier(noteCount, notesOccupied); + } + return this; + } + /** Attach to new tuplet. */ + setTuplet(tuplet) { + if (tuplet) { + this.tupletStack.push(tuplet); + const noteCount = tuplet.getNoteCount(); + const notesOccupied = tuplet.getNotesOccupied(); + this.applyTickMultiplier(notesOccupied, noteCount); + } + this.tuplet = tuplet; + return this; + } + /** + * Add self to the provided ModifierContext `mc`. + * If this tickable has modifiers, set modifierContext. + * @returns this + */ + addToModifierContext(mc) { + this.modifierContext = mc; + for (let i = 0; i < this.modifiers.length; ++i) { + this.modifierContext.addMember(this.modifiers[i]); + } + this.modifierContext.addMember(this); + this._preFormatted = false; + return this; + } + /** + * Optional, if tickable has modifiers, associate a Modifier. + * @param mod the modifier + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + addModifier(modifier, index = 0) { + this.modifiers.push(modifier); + this._preFormatted = false; + return this; + } + /** Get the list of associated modifiers. */ + getModifiers() { + return this.modifiers; + } + /** Set the Tick Context. */ + setTickContext(tc) { + this.tickContext = tc; + this._preFormatted = false; + } + checkTickContext(message = 'Tickable has no tick context.') { + return (0,_util__WEBPACK_IMPORTED_MODULE_4__.defined)(this.tickContext, 'NoTickContext', message); + } + /** Preformat the Tickable. */ + preFormat() { + if (this._preFormatted) + return; + this.width = 0; + if (this.modifierContext) { + this.modifierContext.preFormat(); + this.width += this.modifierContext.getWidth(); + } + } + /** Set preformatted status. */ + set preFormatted(value) { + this._preFormatted = value; + } + get preFormatted() { + return this._preFormatted; + } + /** Postformat the Tickable. */ + postFormat() { + if (this._postFormatted) + return this; + this._postFormatted = true; + return this; + } + /** Set postformatted status. */ + set postFormatted(value) { + this._postFormatted = value; + } + get postFormatted() { + return this._postFormatted; + } + /** Return the intrinsic ticks. */ + getIntrinsicTicks() { + return this.intrinsicTicks; + } + /** Set the intrinsic ticks. */ + setIntrinsicTicks(intrinsicTicks) { + this.intrinsicTicks = intrinsicTicks; + this.ticks = this.tickMultiplier.clone().multiply(this.intrinsicTicks); + } + /** Get the tick multiplier. */ + getTickMultiplier() { + return this.tickMultiplier; + } + /** Apply a tick multiplier. */ + applyTickMultiplier(numerator, denominator) { + this.tickMultiplier.multiply(numerator, denominator); + this.ticks = this.tickMultiplier.clone().multiply(this.intrinsicTicks); + } + /** Set the duration. */ + setDuration(duration) { + const ticks = duration.numerator * (_tables__WEBPACK_IMPORTED_MODULE_2__.Tables.RESOLUTION / duration.denominator); + this.ticks = this.tickMultiplier.clone().multiply(ticks); + this.intrinsicTicks = this.ticks.value(); + } + getAbsoluteX() { + const tickContext = this.checkTickContext(`Can't getAbsoluteX() without a TickContext.`); + return tickContext.getX(); + } + /** Attach this note to a modifier context. */ + setModifierContext(mc) { + this.modifierContext = mc; + return this; + } + /** Get `ModifierContext`. */ + getModifierContext() { + return this.modifierContext; + } + /** Check and get `ModifierContext`. */ + checkModifierContext() { + return (0,_util__WEBPACK_IMPORTED_MODULE_4__.defined)(this.modifierContext, 'NoModifierContext', 'No modifier context attached to this tickable.'); + } +} + + +/***/ }), + +/***/ "./src/tickcontext.ts": +/*!****************************!*\ + !*** ./src/tickcontext.ts ***! + \****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TickContext": () => (/* binding */ TickContext) +/* harmony export */ }); +/* harmony import */ var _fraction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./fraction */ "./src/fraction.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// ## Description +// A formatter for abstract tickable objects, such as notes, chords, +// tabs, etc. + + +/** + * TickContext formats abstract tickable objects, such as notes, chords, tabs, etc. + */ +class TickContext { + constructor(options) { + this.preFormatted = false; + this.postFormatted = false; + this.tickID = options && options.tickID ? options.tickID : 0; + this.currentTick = new _fraction__WEBPACK_IMPORTED_MODULE_0__.Fraction(0, 1); + this.maxTicks = new _fraction__WEBPACK_IMPORTED_MODULE_0__.Fraction(0, 1); + this.maxTickable = undefined; // Biggest tickable + this.minTicks = undefined; // this can remian null if all tickables have ignore_ticks + this.minTickable = undefined; + this.padding = 1; // padding on each side (width += padding * 2) + this.x = 0; + this.xBase = 0; // base x position without xOffset + this.xOffset = 0; // xBase and xOffset are an alternative way to describe x (x = xB + xO) + this.tickables = []; // Notes, tabs, chords, lyrics. + this.tickablesByVoice = {}; // Tickables indexed by voice number + // Formatting metrics + this.notePx = 0; // width of widest note in this context + this.glyphPx = 0; // width of glyph (note head) + this.leftDisplacedHeadPx = 0; // Extra left pixels for displaced notes + this.rightDisplacedHeadPx = 0; // Extra right pixels for displaced notes + this.modLeftPx = 0; // Left modifier pixels + this.modRightPx = 0; // Right modifier pixels + this.totalLeftPx = 0; // Total left pixels + this.totalRightPx = 0; // Total right pixels + this.tContexts = []; // Parent array of tick contexts + this.width = 0; + this.formatterMetrics = { + // The freedom of a tickcontext is the distance it can move without colliding + // with neighboring elements. A formatter can set these values during its + // formatting pass, which a different formatter can then use to fine tune. + freedom: { left: 0, right: 0 }, + }; + } + static getNextContext(tContext) { + const contexts = tContext.tContexts; + const index = contexts.indexOf(tContext); + if (index + 1 < contexts.length) + return contexts[index + 1]; + } + getTickID() { + return this.tickID; + } + getX() { + return this.x; + } + setX(x) { + this.x = x; + this.xBase = x; + this.xOffset = 0; + return this; + } + getXBase() { + return this.xBase; + } // use of xBase and xOffset is optional, avoids offset creep + setXBase(xBase) { + this.xBase = xBase; + this.x = xBase + this.xOffset; + } + getXOffset() { + return this.xOffset; + } + setXOffset(xOffset) { + this.xOffset = xOffset; + this.x = this.xBase + xOffset; + } + getWidth() { + return this.width + this.padding * 2; + } + setPadding(padding) { + this.padding = padding; + return this; + } + getMaxTicks() { + return this.maxTicks; + } + getMinTicks() { + return this.minTicks; + } + getMaxTickable() { + return this.maxTickable; + } + getMinTickable() { + return this.minTickable; + } + getTickables() { + return this.tickables; + } + /** + * Introduced on 2020-04-17 as getTickablesForVoice(voiceIndex). + * https://github.com/0xfe/vexflow/blame/dc97b0cc5bb93171c0038638c34362dc958222ca/src/tickcontext.js#L63 + * Renamed on 2021-08-05 to getTickableForVoice(voiceIndex). Method renamed to singular, since it returns one Tickable. + */ + getTickableForVoice(voiceIndex) { + return this.tickablesByVoice[voiceIndex]; + } + getTickablesByVoice() { + return this.tickablesByVoice; + } + getCenterAlignedTickables() { + return this.tickables.filter((tickable) => tickable.isCenterAligned()); + } + /** Gets widths context, note and left/right modifiers for formatting. */ + getMetrics() { + const { width, glyphPx, notePx, leftDisplacedHeadPx, rightDisplacedHeadPx, modLeftPx, modRightPx, totalLeftPx, totalRightPx, } = this; + return { + width, + glyphPx, + notePx, + leftDisplacedHeadPx, + rightDisplacedHeadPx, + modLeftPx, + modRightPx, + totalLeftPx, + totalRightPx, + }; + } + getCurrentTick() { + return this.currentTick; + } + setCurrentTick(tick) { + this.currentTick = tick; + this.preFormatted = false; + } + addTickable(tickable, voiceIndex) { + if (!tickable) { + throw new _util__WEBPACK_IMPORTED_MODULE_1__.RuntimeError('BadArgument', 'Invalid tickable added.'); + } + if (!tickable.shouldIgnoreTicks()) { + const ticks = tickable.getTicks(); + if (ticks.greaterThan(this.maxTicks)) { + this.maxTicks = ticks.clone(); + this.maxTickable = tickable; + } + if (this.minTicks == null) { + this.minTicks = ticks.clone(); + this.minTickable = tickable; + } + else if (ticks.lessThan(this.minTicks)) { + this.minTicks = ticks.clone(); + this.minTickable = tickable; + } + } + tickable.setTickContext(this); + this.tickables.push(tickable); + this.tickablesByVoice[voiceIndex || 0] = tickable; + this.preFormatted = false; + return this; + } + preFormat() { + if (this.preFormatted) + return this; + for (let i = 0; i < this.tickables.length; ++i) { + const tickable = this.tickables[i]; + tickable.preFormat(); + const metrics = tickable.getMetrics(); + // Maintain max displaced head pixels from all tickables in the context + this.leftDisplacedHeadPx = Math.max(this.leftDisplacedHeadPx, metrics.leftDisplacedHeadPx); + this.rightDisplacedHeadPx = Math.max(this.rightDisplacedHeadPx, metrics.rightDisplacedHeadPx); + // Maintain the widest note for all tickables in the context + this.notePx = Math.max(this.notePx, metrics.notePx); + // Maintain the widest note head + this.glyphPx = Math.max(this.glyphPx, metrics.glyphWidth || 0); + // Total modifier shift + this.modLeftPx = Math.max(this.modLeftPx, metrics.modLeftPx); + this.modRightPx = Math.max(this.modRightPx, metrics.modRightPx); + // Total shift + this.totalLeftPx = Math.max(this.totalLeftPx, metrics.modLeftPx + metrics.leftDisplacedHeadPx); + this.totalRightPx = Math.max(this.totalRightPx, metrics.modRightPx + metrics.rightDisplacedHeadPx); + // Recalculate the tick context total width + this.width = this.notePx + this.totalLeftPx + this.totalRightPx; + } + return this; + } + postFormat() { + if (this.postFormatted) + return this; + this.postFormatted = true; + return this; + } + getFormatterMetrics() { + return this.formatterMetrics; + } +} + + +/***/ }), + +/***/ "./src/timesigglyph.ts": +/*!*****************************!*\ + !*** ./src/timesigglyph.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TimeSignatureGlyph": () => (/* binding */ TimeSignatureGlyph) +/* harmony export */ }); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// ## Description +// Renders time signatures glyphs for staffs +// This class is used by TimeSignature to render the associated glyphs + + +class TimeSignatureGlyph extends _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph { + constructor(timeSignature, topDigits, botDigits, code, point, options) { + var _a; + super(code, point, options); + this.timeSignature = timeSignature; + this.topGlyphs = []; + this.botGlyphs = []; + let topWidth = 0; + for (let i = 0; i < topDigits.length; ++i) { + let timeSigType = topDigits[i]; + switch (topDigits[i]) { + case '-': + timeSigType = 'Minus'; + break; + case '+': + timeSigType = botDigits.length > 0 ? 'PlusSmall' : 'Plus'; + break; + case '(': + timeSigType = botDigits.length > 0 ? 'ParensLeftSmall' : 'ParensLeft'; + break; + case ')': + timeSigType = botDigits.length > 0 ? 'ParensRightSmall' : 'ParensRight'; + break; + } + const topGlyph = new _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph('timeSig' + timeSigType, this.timeSignature.point); + this.topGlyphs.push(topGlyph); + topWidth += (_a = topGlyph.getMetrics().width) !== null && _a !== void 0 ? _a : 0; + } + let botWidth = 0; + for (let i = 0; i < botDigits.length; ++i) { + let timeSigType = botDigits[i]; + switch (botDigits[i]) { + case '+': + timeSigType = 'PlusSmall'; + break; + case '(': + timeSigType = 'ParensLeftSmall'; + break; + case ')': + timeSigType = 'ParensRightSmall'; + break; + } + const botGlyph = new _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph('timeSig' + timeSigType, this.timeSignature.point); + this.botGlyphs.push(botGlyph); + botWidth += (0,_util__WEBPACK_IMPORTED_MODULE_1__.defined)(botGlyph.getMetrics().width); + } + this.width = Math.max(topWidth, botWidth); + this.xMin = this.getMetrics().x_min; + this.topStartX = (this.width - topWidth) / 2.0; + this.botStartX = (this.width - botWidth) / 2.0; + this.reset(); + } + getMetrics() { + return { + x_min: this.xMin, + x_max: this.xMin + this.width, + width: this.width, + }; + } + renderToStave(x) { + const stave = this.checkStave(); + const ctx = this.checkContext(); + let start_x = x + this.topStartX; + let y = 0; + if (this.botGlyphs.length > 0) + y = stave.getYForLine(this.timeSignature.topLine); + else + y = (stave.getYForLine(this.timeSignature.topLine) + stave.getYForLine(this.timeSignature.bottomLine)) / 2; + for (let i = 0; i < this.topGlyphs.length; ++i) { + const glyph = this.topGlyphs[i]; + _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph.renderOutline(ctx, glyph.getMetrics().outline, this.scale, start_x + this.x_shift, y); + start_x += (0,_util__WEBPACK_IMPORTED_MODULE_1__.defined)(glyph.getMetrics().width); + } + start_x = x + this.botStartX; + y = stave.getYForLine(this.timeSignature.bottomLine); + for (let i = 0; i < this.botGlyphs.length; ++i) { + const glyph = this.botGlyphs[i]; + this.timeSignature.placeGlyphOnLine(glyph, stave, 0); + _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph.renderOutline(ctx, glyph.getMetrics().outline, this.scale, start_x + glyph.getMetrics().x_shift, y); + start_x += (0,_util__WEBPACK_IMPORTED_MODULE_1__.defined)(glyph.getMetrics().width); + } + } +} + + +/***/ }), + +/***/ "./src/timesignature.ts": +/*!******************************!*\ + !*** ./src/timesignature.ts ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TimeSignature": () => (/* binding */ TimeSignature) +/* harmony export */ }); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _stavemodifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stavemodifier */ "./src/stavemodifier.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _timesigglyph__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./timesigglyph */ "./src/timesigglyph.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// ## Description +// Implements time signatures glyphs for staffs +// See tables.js for the internal time signatures +// representation + + + + + + +const assertIsValidTimeSig = (timeSpec) => { + const numbers = timeSpec.split('/'); + if (numbers.length !== 2 && numbers[0] !== '+' && numbers[0] !== '-') { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('BadTimeSignature', `Invalid time spec: ${timeSpec}. Must be in the form "/"`); + } + numbers.forEach((number) => { + // Characters consisting in number 0..9, '+', '-', '(' or ')' + if (/^[0-9+\-()]+$/.test(number) == false) { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('BadTimeSignature', `Invalid time spec: ${timeSpec}. Must contain valid signatures.`); + } + }); +}; +class TimeSignature extends _stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifier { + constructor(timeSpec = '4/4', customPadding = 15, validate_args = true) { + super(); + this.validate_args = validate_args; + const padding = customPadding; + const musicFont = _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.currentMusicFont(); + this.point = musicFont.lookupMetric('digits.point'); + const fontLineShift = musicFont.lookupMetric('digits.shiftLine', 0); + this.topLine = 2 + fontLineShift; + this.bottomLine = 4 + fontLineShift; + this.setPosition(_stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifierPosition.BEGIN); + this.info = this.parseTimeSpec(timeSpec); + this.setWidth((0,_util__WEBPACK_IMPORTED_MODULE_5__.defined)(this.info.glyph.getMetrics().width)); + this.setPadding(padding); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_4__.Category.TimeSignature; + } + static get glyphs() { + return { + C: { + code: 'timeSigCommon', + point: 40, + line: 2, + }, + 'C|': { + code: 'timeSigCutCommon', + point: 40, + line: 2, + }, + }; + } + parseTimeSpec(timeSpec) { + var _a, _b; + if (timeSpec === 'C' || timeSpec === 'C|') { + const { line, code, point } = TimeSignature.glyphs[timeSpec]; + return { + line, + num: false, + glyph: new _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph(code, point), + }; + } + if (this.validate_args) { + assertIsValidTimeSig(timeSpec); + } + const parts = timeSpec.split('/'); + return { + num: true, + glyph: this.makeTimeSignatureGlyph((_a = parts[0]) !== null && _a !== void 0 ? _a : '', (_b = parts[1]) !== null && _b !== void 0 ? _b : ''), + }; + } + makeTimeSignatureGlyph(topDigits, botDigits) { + return new _timesigglyph__WEBPACK_IMPORTED_MODULE_3__.TimeSignatureGlyph(this, topDigits, botDigits, 'timeSig0', this.point); + } + getInfo() { + return this.info; + } + setTimeSig(timeSpec) { + this.info = this.parseTimeSpec(timeSpec); + return this; + } + draw() { + const stave = this.checkStave(); + const ctx = stave.checkContext(); + this.setRendered(); + ctx.openGroup('timesignature', this.getAttribute('id')); + this.info.glyph.setStave(stave); + this.info.glyph.setContext(ctx); + this.placeGlyphOnLine(this.info.glyph, stave, this.info.line); + this.info.glyph.renderToStave(this.x); + ctx.closeGroup(); + } +} + + +/***/ }), + +/***/ "./src/timesignote.ts": +/*!****************************!*\ + !*** ./src/timesignote.ts ***! + \****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TimeSigNote": () => (/* binding */ TimeSigNote) +/* harmony export */ }); +/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./note */ "./src/note.ts"); +/* harmony import */ var _timesignature__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./timesignature */ "./src/timesignature.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author Taehoon Moon 2014 + + + +class TimeSigNote extends _note__WEBPACK_IMPORTED_MODULE_0__.Note { + constructor(timeSpec, customPadding) { + super({ duration: 'b' }); + const timeSignature = new _timesignature__WEBPACK_IMPORTED_MODULE_1__.TimeSignature(timeSpec, customPadding); + this.timeSigInfo = timeSignature.getInfo(); + this.setWidth(this.timeSigInfo.glyph.getMetrics().width); + // Note properties + this.ignore_ticks = true; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_2__.Category.TimeSigNote; + } + /* Overridden to ignore */ + // eslint-disable-next-line + addToModifierContext(mc) { + // DO NOTHING. + return this; + } + preFormat() { + this.preFormatted = true; + return this; + } + draw() { + const stave = this.checkStave(); + const ctx = this.checkContext(); + this.setRendered(); + if (!this.timeSigInfo.glyph.getContext()) { + this.timeSigInfo.glyph.setContext(ctx); + } + this.timeSigInfo.glyph.setStave(stave); + this.timeSigInfo.glyph.setYShift(stave.getYForLine(2) - stave.getYForGlyphs()); + this.timeSigInfo.glyph.renderToStave(this.getAbsoluteX()); + } +} + + +/***/ }), + +/***/ "./src/tremolo.ts": +/*!************************!*\ + !*** ./src/tremolo.ts ***! + \************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Tremolo": () => (/* binding */ Tremolo) +/* harmony export */ }); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _gracenote__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./gracenote */ "./src/gracenote.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author: Mike Corrigan +// MIT License + + + + + + +/** Tremolo implements tremolo notation. */ +class Tremolo extends _modifier__WEBPACK_IMPORTED_MODULE_2__.Modifier { + /** + * @param num number of bars + */ + constructor(num) { + super(); + this.num = num; + this.position = _modifier__WEBPACK_IMPORTED_MODULE_2__.Modifier.Position.CENTER; + this.code = 'tremolo1'; + // big strokes scales initialised to 1 (no scale) + this.y_spacing_scale = 1; + this.extra_stroke_scale = 1; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_5__.Category.Tremolo; + } + /** Draw the tremolo on the rendering context. */ + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const stemDirection = note.getStemDirection(); + const start = note.getModifierStartXY(this.position, this.index); + let x = start.x; + const gn = (0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isGraceNote)(note); + const scale = gn ? _gracenote__WEBPACK_IMPORTED_MODULE_1__.GraceNote.SCALE : 1; + const category = `tremolo.${gn ? 'grace' : 'default'}`; + const musicFont = _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.currentMusicFont(); + let y_spacing = musicFont.lookupMetric(`${category}.spacing`) * stemDirection; + // add y_spacing_scale for big strokes (#1258) + y_spacing *= this.y_spacing_scale; + const height = this.num * y_spacing; + let y = note.getStemExtents().baseY - height; + if (stemDirection < 0) { + y += musicFont.lookupMetric(`${category}.offsetYStemDown`) * scale; + } + else { + y += musicFont.lookupMetric(`${category}.offsetYStemUp`) * scale; + } + const fontScale = musicFont.lookupMetric(`${category}.point`); + x += musicFont.lookupMetric(`${category}.offsetXStem${stemDirection === _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP ? 'Up' : 'Down'}`); + for (let i = 0; i < this.num; ++i) { + _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph.renderGlyph(ctx, x, y, fontScale, this.code, { category, scale: this.extra_stroke_scale }); + y += y_spacing; + } + } +} + + +/***/ }), + +/***/ "./src/tuning.ts": +/*!***********************!*\ + !*** ./src/tuning.ts ***! + \***********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Tuning": () => (/* binding */ Tuning) +/* harmony export */ }); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + +/** `Tuning` implements varies types of tunings for tablature. */ +class Tuning { + /** + * Constructor. + * @param tuningString tuning name (eg. 'dagdad') or comma separated note strings + */ + constructor(tuningString = 'E/5,B/4,G/4,D/4,A/3,E/3,B/2,E/2') { + this.tuningValues = []; + // Default to standard tuning. + this.setTuning(tuningString); + } + static get names() { + return { + standard: 'E/5,B/4,G/4,D/4,A/3,E/3', + dagdad: 'D/5,A/4,G/4,D/4,A/3,D/3', + dropd: 'E/5,B/4,G/4,D/4,A/3,D/3', + eb: 'Eb/5,Bb/4,Gb/4,Db/4,Ab/3,Db/3', + standardBanjo: 'D/5,B/4,G/4,D/4,G/5', + }; + } + /** Return the note number associated to the note string. */ + noteToInteger(noteString) { + return _tables__WEBPACK_IMPORTED_MODULE_0__.Tables.keyProperties(noteString).int_value; + } + /** + * Set tuning identified by tuning name (eg. 'dagdad') + * @param tuningString tuning name (eg. 'dagdad') or comma separated note strings + */ + setTuning(tuningString) { + if (Tuning.names[tuningString]) { + tuningString = Tuning.names[tuningString]; + } + this.tuningValues = []; + const keys = tuningString.split(/\s*,\s*/); + if (keys.length === 0) { + throw new _util__WEBPACK_IMPORTED_MODULE_1__.RuntimeError('BadArguments', `Invalid tuning string: ${tuningString}`); + } + for (let i = 0; i < keys.length; ++i) { + this.tuningValues[i] = this.noteToInteger(keys[i]); + } + } + /** Return the note number associated with a tablature string. */ + getValueForString(stringNum) { + const s = Number(stringNum); + if (s < 1 || s > this.tuningValues.length) { + throw new _util__WEBPACK_IMPORTED_MODULE_1__.RuntimeError('BadArguments', `String number must be between 1 and ${this.tuningValues.length}:${stringNum}`); + } + return this.tuningValues[s - 1]; + } + /** Return the note number associated with a tablature string and fret. */ + getValueForFret(fretNum, stringNum) { + const stringValue = this.getValueForString(stringNum); + const f = Number(fretNum); + if (f < 0) { + throw new _util__WEBPACK_IMPORTED_MODULE_1__.RuntimeError('BadArguments', `Fret number must be 0 or higher: ${fretNum}`); + } + return stringValue + f; + } + /** Return the note string associated with tablature string and fret. */ + getNoteForFret(fretNum, stringNum) { + const noteValue = this.getValueForFret(fretNum, stringNum); + const octave = Math.floor(noteValue / 12); + const value = noteValue % 12; + return `${_tables__WEBPACK_IMPORTED_MODULE_0__.Tables.integerToNote(value)}/${octave}`; + } +} + + +/***/ }), + +/***/ "./src/tuplet.ts": +/*!***********************!*\ + !*** ./src/tuplet.ts ***! + \***********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TupletLocation": () => (/* binding */ TupletLocation), +/* harmony export */ "Tuplet": () => (/* binding */ Tuplet) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _formatter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./formatter */ "./src/formatter.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +/** + * ## Description + * + * Create a new tuplet from the specified notes. The notes must + * be part of the same voice. If they are of different rhythmic + * values, then options.num_notes must be set. + * + * @constructor + * @param {Array.} A set of notes: staveNotes, + * notes, etc... any class that inherits stemmableNote at some + * point in its prototype chain. + * @param options: object { + * + * num_notes: fit this many notes into... + * notes_occupied: ...the space of this many notes + * + * Together, these two properties make up the tuplet ratio + * in the form of num_notes : notes_occupied. + * num_notes defaults to the number of notes passed in, so + * it is important that if you omit this property, all of + * the notes passed should be of the same note value. + * notes_occupied defaults to 2 -- so you should almost + * certainly pass this parameter for anything other than + * a basic triplet. + * + * location: + * default 1, which is above the notes: ┌─── 3 ───┐ + * -1 is below the notes └─── 3 ───┘ + * + * bracketed: boolean, draw a bracket around the tuplet number + * when true: ┌─── 3 ───┐ when false: 3 + * defaults to true if notes are not beamed, false otherwise + * + * ratioed: boolean + * when true: ┌─── 7:8 ───┐, when false: ┌─── 7 ───┐ + * defaults to true if the difference between num_notes and + * notes_occupied is greater than 1. + * + * y_offset: int, default 0 + * manually offset a tuplet, for instance to avoid collisions + * with articulations, etc... + * } + */ + + + + + + + +var TupletLocation; +(function (TupletLocation) { + TupletLocation[TupletLocation["BOTTOM"] = -1] = "BOTTOM"; + TupletLocation[TupletLocation["TOP"] = 1] = "TOP"; +})(TupletLocation || (TupletLocation = {})); +class Tuplet extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + constructor(notes, options = {}) { + super(); + this.numerator_glyphs = []; + this.denom_glyphs = []; + if (!notes || !notes.length) { + throw new _util__WEBPACK_IMPORTED_MODULE_6__.RuntimeError('BadArguments', 'No notes provided for tuplet.'); + } + this.options = options; + this.notes = notes; + this.num_notes = this.options.num_notes != undefined ? this.options.num_notes : notes.length; + // We accept beats_occupied, but warn that it's deprecated: + // the preferred property name is now notes_occupied. + if (this.options.beats_occupied) { + this.beatsOccupiedDeprecationWarning(); + } + this.notes_occupied = this.options.notes_occupied || this.options.beats_occupied || 2; + if (this.options.bracketed != undefined) { + this.bracketed = this.options.bracketed; + } + else { + this.bracketed = notes.some((note) => !note.hasBeam()); + } + this.ratioed = + this.options.ratioed != undefined ? this.options.ratioed : Math.abs(this.notes_occupied - this.num_notes) > 1; + this.point = _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.currentMusicFont().lookupMetric('digits.tupletPoint'); + this.y_pos = 16; + this.x_pos = 100; + this.width = 200; + this.setTupletLocation(this.options.location || Tuplet.LOCATION_TOP); + _formatter__WEBPACK_IMPORTED_MODULE_1__.Formatter.AlignRestsToNotes(notes, true, true); + this.resolveGlyphs(); + this.attach(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_5__.Category.Tuplet; + } + static get LOCATION_TOP() { + return TupletLocation.TOP; + } + static get LOCATION_BOTTOM() { + return TupletLocation.BOTTOM; + } + static get NESTING_OFFSET() { + return 15; + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + static get metrics() { + return _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.currentMusicFont().getMetrics().glyphs.tuplet; + } + attach() { + for (let i = 0; i < this.notes.length; i++) { + const note = this.notes[i]; + note.setTuplet(this); + } + } + detach() { + for (let i = 0; i < this.notes.length; i++) { + const note = this.notes[i]; + note.resetTuplet(this); + } + } + /** + * Set whether or not the bracket is drawn. + */ + setBracketed(bracketed) { + this.bracketed = !!bracketed; + return this; + } + /** + * Set whether or not the ratio is shown. + */ + setRatioed(ratioed) { + this.ratioed = !!ratioed; + return this; + } + /** + * Set the tuplet indicator to be displayed either on the top or bottom of the stave. + */ + setTupletLocation(location) { + if (location !== Tuplet.LOCATION_TOP && location !== Tuplet.LOCATION_BOTTOM) { + // eslint-disable-next-line + console.warn(`Invalid tuplet location [${location}]. Using Tuplet.LOCATION_TOP.`); + location = Tuplet.LOCATION_TOP; + } + this.location = location; + return this; + } + getNotes() { + return this.notes; + } + getNoteCount() { + return this.num_notes; + } + beatsOccupiedDeprecationWarning() { + // eslint-disable-next-line + console.warn('beats_occupied has been deprecated as an option for tuplets. Please use notes_occupied instead.', 'Calls to getBeatsOccupied / setBeatsOccupied should now be routed to getNotesOccupied / setNotesOccupied.', 'The old methods will be removed in VexFlow 5.0.'); + } + getBeatsOccupied() { + this.beatsOccupiedDeprecationWarning(); + return this.getNotesOccupied(); + } + setBeatsOccupied(beats) { + this.beatsOccupiedDeprecationWarning(); + return this.setNotesOccupied(beats); + } + getNotesOccupied() { + return this.notes_occupied; + } + setNotesOccupied(notes) { + this.detach(); + this.notes_occupied = notes; + this.resolveGlyphs(); + this.attach(); + } + resolveGlyphs() { + this.numerator_glyphs = []; + let n = this.num_notes; + while (n >= 1) { + this.numerator_glyphs.unshift(new _glyph__WEBPACK_IMPORTED_MODULE_2__.Glyph('timeSig' + (n % 10), this.point)); + n = parseInt((n / 10).toString(), 10); + } + this.denom_glyphs = []; + n = this.notes_occupied; + while (n >= 1) { + this.denom_glyphs.unshift(new _glyph__WEBPACK_IMPORTED_MODULE_2__.Glyph('timeSig' + (n % 10), this.point)); + n = parseInt((n / 10).toString(), 10); + } + } + // determine how many tuplets are nested within this tuplet + // on the same side (above/below), to calculate a y + // offset for this tuplet: + getNestedTupletCount() { + const location = this.location; + const first_note = this.notes[0]; + let maxTupletCount = countTuplets(first_note, location); + let minTupletCount = countTuplets(first_note, location); + // Count the tuplets that are on the same side (above/below) + // as this tuplet: + function countTuplets(note, location) { + return note.getTupletStack().filter((tuplet) => tuplet.location === location).length; + } + this.notes.forEach((note) => { + const tupletCount = countTuplets(note, location); + maxTupletCount = tupletCount > maxTupletCount ? tupletCount : maxTupletCount; + minTupletCount = tupletCount < minTupletCount ? tupletCount : minTupletCount; + }); + return maxTupletCount - minTupletCount; + } + // determine the y position of the tuplet: + getYPosition() { + // offset the tuplet for any nested tuplets between + // it and the notes: + const nested_tuplet_y_offset = this.getNestedTupletCount() * Tuplet.NESTING_OFFSET * -this.location; + // offset the tuplet for any manual y_offset: + const y_offset = this.options.y_offset || 0; + // now iterate through the notes and find our highest + // or lowest locations, to form a base y_pos + const first_note = this.notes[0]; + let y_pos; + if (this.location === Tuplet.LOCATION_TOP) { + y_pos = first_note.checkStave().getYForLine(0) - Tuplet.metrics.topModifierOffset; + // check modifiers above note to see if they will collide with tuplet beam + for (let i = 0; i < this.notes.length; ++i) { + const note = this.notes[i]; + let modLines = 0; + const mc = note.getModifierContext(); + if (mc) { + modLines = Math.max(modLines, mc.getState().top_text_line); + } + const modY = note.getYForTopText(modLines) - Tuplet.metrics.noteHeadOffset; + if (note.hasStem() || note.isRest()) { + const top_y = note.getStemDirection() === _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP + ? note.getStemExtents().topY - Tuplet.metrics.stemOffset + : note.getStemExtents().baseY - Tuplet.metrics.noteHeadOffset; + y_pos = Math.min(top_y, y_pos); + if (modLines > 0) { + y_pos = Math.min(modY, y_pos); + } + } + } + } + else { + let lineCheck = Tuplet.metrics.bottomLine; // tuplet default on line 4 + // check modifiers below note to see if they will collide with tuplet beam + this.notes.forEach((nn) => { + const mc = nn.getModifierContext(); + if (mc) { + lineCheck = Math.max(lineCheck, mc.getState().text_line + 1); + } + }); + y_pos = first_note.checkStave().getYForLine(lineCheck) + Tuplet.metrics.noteHeadOffset; + for (let i = 0; i < this.notes.length; ++i) { + if (this.notes[i].hasStem() || this.notes[i].isRest()) { + const bottom_y = this.notes[i].getStemDirection() === _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP + ? this.notes[i].getStemExtents().baseY + Tuplet.metrics.noteHeadOffset + : this.notes[i].getStemExtents().topY + Tuplet.metrics.stemOffset; + if (bottom_y > y_pos) { + y_pos = bottom_y; + } + } + } + } + return y_pos + nested_tuplet_y_offset + y_offset; + } + draw() { + const ctx = this.checkContext(); + this.setRendered(); + // determine x value of left bound of tuplet + const first_note = this.notes[0]; + const last_note = this.notes[this.notes.length - 1]; + if (!this.bracketed) { + this.x_pos = first_note.getStemX(); + this.width = last_note.getStemX() - this.x_pos; + } + else { + this.x_pos = first_note.getTieLeftX() - 5; + this.width = last_note.getTieRightX() - this.x_pos + 5; + } + // determine y value for tuplet + this.y_pos = this.getYPosition(); + const addGlyphWidth = (width, glyph) => width + (0,_util__WEBPACK_IMPORTED_MODULE_6__.defined)(glyph.getMetrics().width); + // calculate total width of tuplet notation + let width = this.numerator_glyphs.reduce(addGlyphWidth, 0); + if (this.ratioed) { + width = this.denom_glyphs.reduce(addGlyphWidth, width); + width += this.point * 0.32; + } + const notation_center_x = this.x_pos + this.width / 2; + const notation_start_x = notation_center_x - width / 2; + // draw bracket if the tuplet is not beamed + if (this.bracketed) { + const line_width = this.width / 2 - width / 2 - 5; + // only draw the bracket if it has positive length + if (line_width > 0) { + ctx.fillRect(this.x_pos, this.y_pos, line_width, 1); + ctx.fillRect(this.x_pos + this.width / 2 + width / 2 + 5, this.y_pos, line_width, 1); + ctx.fillRect(this.x_pos, this.y_pos + (this.location === Tuplet.LOCATION_BOTTOM ? 1 : 0), 1, this.location * 10); + ctx.fillRect(this.x_pos + this.width, this.y_pos + (this.location === Tuplet.LOCATION_BOTTOM ? 1 : 0), 1, this.location * 10); + } + } + // draw numerator glyphs + const shiftY = _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.currentMusicFont().lookupMetric('digits.shiftY', 0); + let x_offset = 0; + this.numerator_glyphs.forEach((glyph) => { + glyph.render(ctx, notation_start_x + x_offset, this.y_pos + this.point / 3 - 2 + shiftY); + x_offset += (0,_util__WEBPACK_IMPORTED_MODULE_6__.defined)(glyph.getMetrics().width); + }); + // display colon and denominator if the ratio is to be shown + if (this.ratioed) { + const colon_x = notation_start_x + x_offset + this.point * 0.16; + const colon_radius = this.point * 0.06; + ctx.beginPath(); + ctx.arc(colon_x, this.y_pos - this.point * 0.08, colon_radius, 0, Math.PI * 2, true); + ctx.closePath(); + ctx.fill(); + ctx.beginPath(); + ctx.arc(colon_x, this.y_pos + this.point * 0.12, colon_radius, 0, Math.PI * 2, true); + ctx.closePath(); + ctx.fill(); + x_offset += this.point * 0.32; + this.denom_glyphs.forEach((glyph) => { + glyph.render(ctx, notation_start_x + x_offset, this.y_pos + this.point / 3 - 2 + shiftY); + x_offset += (0,_util__WEBPACK_IMPORTED_MODULE_6__.defined)(glyph.getMetrics().width); + }); + } + } +} + + +/***/ }), + +/***/ "./src/typeguard.ts": +/*!**************************!*\ + !*** ./src/typeguard.ts ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "isCategory": () => (/* binding */ isCategory), +/* harmony export */ "isAccidental": () => (/* binding */ isAccidental), +/* harmony export */ "isAnnotation": () => (/* binding */ isAnnotation), +/* harmony export */ "isBarline": () => (/* binding */ isBarline), +/* harmony export */ "isDot": () => (/* binding */ isDot), +/* harmony export */ "isGraceNote": () => (/* binding */ isGraceNote), +/* harmony export */ "isGraceNoteGroup": () => (/* binding */ isGraceNoteGroup), +/* harmony export */ "isNote": () => (/* binding */ isNote), +/* harmony export */ "isRenderContext": () => (/* binding */ isRenderContext), +/* harmony export */ "isStaveNote": () => (/* binding */ isStaveNote), +/* harmony export */ "isStemmableNote": () => (/* binding */ isStemmableNote), +/* harmony export */ "isTabNote": () => (/* binding */ isTabNote), +/* harmony export */ "Category": () => (/* binding */ Category) +/* harmony export */ }); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author: Ron B. Yeh +// MIT License +/* eslint-disable @typescript-eslint/no-explicit-any */ +/** + * Use instead of `instanceof` as a more flexible type guard. + * @param obj check if this object's CATEGORY matches the provided category. + * @param category a string representing a category of VexFlow objects. + * @param checkAncestors defaults to `true`, so we walk up the prototype chain to look for a matching `CATEGORY`. + * If `false`, we do not check the superclass or other ancestors. + * @returns true if `obj` has a static `CATEGORY` property that matches `category`. + */ +function isCategory(obj, category, checkAncestors = true) { + // obj is undefined, a number, a primitive string, or null. + if (typeof obj !== 'object' || obj === null) { + return false; + } + // `obj.constructor` is a reference to the constructor function that created the `obj` instance. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor + let constructorFcn = obj.constructor; + // Check if the object's static .CATEGORY matches the provided category. + if (checkAncestors) { + // Walk up the prototype chain to look for a matching obj.constructor.CATEGORY. + while (obj !== null) { + constructorFcn = obj.constructor; + if ('CATEGORY' in constructorFcn && constructorFcn.CATEGORY === category) { + return true; + } + obj = Object.getPrototypeOf(obj); + } + return false; + } + else { + // Do not walk up the prototype chain. Just check this particular object's static .CATEGORY string. + return 'CATEGORY' in constructorFcn && constructorFcn.CATEGORY === category; + } +} +const isAccidental = (obj) => isCategory(obj, Category.Accidental); +const isAnnotation = (obj) => isCategory(obj, Category.Annotation); +const isBarline = (obj) => isCategory(obj, Category.Barline); +const isDot = (obj) => isCategory(obj, Category.Dot); +const isGraceNote = (obj) => isCategory(obj, Category.GraceNote); +const isGraceNoteGroup = (obj) => isCategory(obj, Category.GraceNoteGroup); +const isNote = (obj) => isCategory(obj, Category.Note); +const isRenderContext = (obj) => isCategory(obj, Category.RenderContext); +const isStaveNote = (obj) => isCategory(obj, Category.StaveNote); +const isStemmableNote = (obj) => isCategory(obj, Category.StemmableNote); +const isTabNote = (obj) => isCategory(obj, Category.TabNote); +// 'const' enums are erased by the TypeScript compiler. The string values are inlined at all the use sites. +// See: https://www.typescriptlang.org/docs/handbook/enums.html#const-enums +var Category; +(function (Category) { + Category["Accidental"] = "Accidental"; + Category["Annotation"] = "Annotation"; + Category["Articulation"] = "Articulation"; + Category["Barline"] = "Barline"; + Category["BarNote"] = "BarNote"; + Category["Beam"] = "Beam"; + Category["Bend"] = "Bend"; + Category["ChordSymbol"] = "ChordSymbol"; + Category["Clef"] = "Clef"; + Category["ClefNote"] = "ClefNote"; + Category["Crescendo"] = "Crescendo"; + Category["Curve"] = "Curve"; + Category["Dot"] = "Dot"; + Category["Element"] = "Element"; + Category["Fraction"] = "Fraction"; + Category["FretHandFinger"] = "FretHandFinger"; + Category["GhostNote"] = "GhostNote"; + Category["Glyph"] = "Glyph"; + Category["GlyphNote"] = "GlyphNote"; + Category["GraceNote"] = "GraceNote"; + Category["GraceNoteGroup"] = "GraceNoteGroup"; + Category["GraceTabNote"] = "GraceTabNote"; + Category["KeySignature"] = "KeySignature"; + Category["KeySigNote"] = "KeySigNote"; + Category["Modifier"] = "Modifier"; + Category["MultiMeasureRest"] = "MultiMeasureRest"; + Category["Note"] = "Note"; + Category["NoteHead"] = "NoteHead"; + Category["NoteSubGroup"] = "NoteSubGroup"; + Category["Ornament"] = "Ornament"; + Category["Parenthesis"] = "Parenthesis"; + Category["PedalMarking"] = "PedalMarking"; + Category["RenderContext"] = "RenderContext"; + Category["RepeatNote"] = "RepeatNote"; + Category["Repetition"] = "Repetition"; + Category["Stave"] = "Stave"; + Category["StaveConnector"] = "StaveConnector"; + Category["StaveHairpin"] = "StaveHairpin"; + Category["StaveLine"] = "StaveLine"; + Category["StaveModifier"] = "StaveModifier"; + Category["StaveNote"] = "StaveNote"; + Category["StaveSection"] = "StaveSection"; + Category["StaveTempo"] = "StaveTempo"; + Category["StaveText"] = "StaveText"; + Category["StaveTie"] = "StaveTie"; + Category["Stem"] = "Stem"; + Category["StemmableNote"] = "StemmableNote"; + Category["StringNumber"] = "StringNumber"; + Category["Stroke"] = "Stroke"; + Category["System"] = "System"; + Category["TabNote"] = "TabNote"; + Category["TabSlide"] = "TabSlide"; + Category["TabStave"] = "TabStave"; + Category["TabTie"] = "TabTie"; + Category["TextBracket"] = "TextBracket"; + Category["TextDynamics"] = "TextDynamics"; + Category["TextNote"] = "TextNote"; + Category["Tickable"] = "Tickable"; + Category["TimeSignature"] = "TimeSignature"; + Category["TimeSigNote"] = "TimeSigNote"; + Category["Tremolo"] = "Tremolo"; + Category["Tuplet"] = "Tuplet"; + Category["Vibrato"] = "Vibrato"; + Category["VibratoBracket"] = "VibratoBracket"; + Category["Voice"] = "Voice"; + Category["Volta"] = "Volta"; +})(Category || (Category = {})); + + +/***/ }), + +/***/ "./src/util.ts": +/*!*********************!*\ + !*** ./src/util.ts ***! + \*********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "RuntimeError": () => (/* binding */ RuntimeError), +/* harmony export */ "globalObject": () => (/* binding */ globalObject), +/* harmony export */ "defined": () => (/* binding */ defined), +/* harmony export */ "log": () => (/* binding */ log), +/* harmony export */ "warn": () => (/* binding */ warn), +/* harmony export */ "midLine": () => (/* binding */ midLine), +/* harmony export */ "prefix": () => (/* binding */ prefix), +/* harmony export */ "normalizeAngle": () => (/* binding */ normalizeAngle) +/* harmony export */ }); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// Note: Keep this module free of imports to reduce the chance of circular dependencies. +/** `RuntimeError` will be thrown by VexFlow classes in case of error. */ +class RuntimeError extends Error { + constructor(code, message = '') { + super('[RuntimeError] ' + code + ': ' + message); + this.code = code; + } +} +/** VexFlow can be used outside of the browser (e.g., Node) where `window` may not be defined. */ +// eslint-disable-next-line +function globalObject() { + if (typeof globalThis !== 'undefined') { + return globalThis; + } + if (typeof self !== 'undefined') { + return self; + } + if (typeof window !== 'undefined') { + return window; + } + if (typeof __webpack_require__.g !== 'undefined') { + return __webpack_require__.g; + } + return Function('return this')(); +} +/** + * Check that `x` is of type `T` and not `undefined`. + * If `x` is `undefined`, throw a RuntimeError with the optionally provided error code and message. + */ +function defined(x, code = 'undefined', message = '') { + if (x === undefined) { + throw new RuntimeError(code, message); + } + return x; +} +/** Default log function sends all arguments to console. */ +// eslint-disable-next-line +function log(block, ...args) { + if (!args) + return; + const line = Array.prototype.slice.call(args).join(' '); + globalObject().console.log(block + ': ' + line); +} +/** Dump warning to console. */ +// eslint-disable-next-line +function warn(...args) { + const line = args.join(' '); + const err = new Error(); + globalObject().console.log('Warning: ', line, err.stack); +} +/** Round number to nearest fractional value (`.5`, `.25`, etc.) */ +function roundN(x, n) { + return x % n >= n / 2 ? parseInt(`${x / n}`, 10) * n + n : parseInt(`${x / n}`, 10) * n; +} +/** Locate the mid point between stave lines. Returns a fractional line if a space. */ +function midLine(a, b) { + let mid_line = b + (a - b) / 2; + if (mid_line % 2 > 0) { + mid_line = roundN(mid_line * 10, 5) / 10; + } + return mid_line; +} +/** + * Used by various classes (e.g., SVGContext) to provide a + * unique prefix to element names (or other keys in shared namespaces). + */ +function prefix(text) { + return `vf-${text}`; +} +/** + * Convert an arbitrary angle in radians to the equivalent one in the range [0, pi). + */ +function normalizeAngle(a) { + a = a % (2 * Math.PI); + if (a < 0) { + a += 2 * Math.PI; + } + return a; +} + + +/***/ }), + +/***/ "./src/vex.ts": +/*!********************!*\ + !*** ./src/vex.ts ***! + \********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Vex": () => (/* binding */ Vex) +/* harmony export */ }); +/* harmony import */ var _flow__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./flow */ "./src/flow.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// Utility methods used by the rest of the VexFlow codebase. + + +class Vex { + // Users of `Vex.forEach(a, fn)` should use `Array.prototype.forEach()` instead. + // static forEach(arr: T[], callbackFn: (value: T, index: number, array: T[]) => void) { + // arr.forEach(callbackFn); + // } + /** + * Take `arr` and return a new list consisting of the sorted, unique, + * contents of arr. Does not modify `arr`. + */ + // eslint-disable-next-line + static sortAndUnique(arr, cmp, eq) { + if (arr.length > 1) { + const newArr = []; + let last; + arr.sort(cmp); + for (let i = 0; i < arr.length; ++i) { + if (i === 0 || !eq(arr[i], last)) { + newArr.push(arr[i]); + } + last = arr[i]; + } + return newArr; + } + else { + return arr; + } + } + /** Check if array `arr` contains `obj`. */ + // eslint-disable-next-line + static contains(arr, obj) { + let i = arr.length; + while (i--) { + if (arr[i] === obj) { + return true; + } + } + return false; + } + // Get the 2D Canvas context from DOM element `canvas_sel`. + static getCanvasContext(canvasSelector) { + if (!canvasSelector) { + throw new _util__WEBPACK_IMPORTED_MODULE_1__.RuntimeError('BadArgument', 'Invalid canvas selector: ' + canvasSelector); + } + const canvas = document.getElementById(canvasSelector); + if (!(canvas && canvas.getContext)) { + throw new _util__WEBPACK_IMPORTED_MODULE_1__.RuntimeError('UnsupportedBrowserError', 'This browser does not support HTML5 Canvas'); + } + return canvas.getContext('2d'); + } + /** Benchmark. Run function `f` once and report time elapsed shifted by `s` milliseconds. */ + // eslint-disable-next-line + static benchmark(s, f) { + const start_time = new Date().getTime(); + f(); + const elapsed = new Date().getTime() - start_time; + (0,_util__WEBPACK_IMPORTED_MODULE_1__.log)(s, elapsed + 'ms'); + } + // Get stack trace. + static stackTrace() { + const err = new Error(); + return err.stack; + } +} +Vex.Flow = _flow__WEBPACK_IMPORTED_MODULE_0__.Flow; + + +/***/ }), + +/***/ "./src/vibrato.ts": +/*!************************!*\ + !*** ./src/vibrato.ts ***! + \************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Vibrato": () => (/* binding */ Vibrato) +/* harmony export */ }); +/* harmony import */ var _bend__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./bend */ "./src/bend.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + +/** `Vibrato` implements diverse vibratos. */ +class Vibrato extends _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier { + constructor() { + super(); + this.position = _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.RIGHT; + this.render_options = { + harsh: false, + vibrato_width: 20, + wave_height: 6, + wave_width: 4, + wave_girth: 2, + }; + this.setVibratoWidth(this.render_options.vibrato_width); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.Vibrato; + } + /** Arrange vibratos inside a `ModifierContext`. */ + static format(vibratos, state, context) { + if (!vibratos || vibratos.length === 0) + return false; + // Vibratos are always on top. + let text_line = state.top_text_line; + let width = 0; + let shift = state.right_shift - 7; + // If there's a bend, drop the text line + const bends = context.getMembers(_bend__WEBPACK_IMPORTED_MODULE_0__.Bend.CATEGORY); + if (bends && bends.length > 0) { + const bendHeight = bends.map((bb) => bb.getTextHeight()).reduce((a, b) => (a > b ? a : b)) / _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.STAVE_LINE_DISTANCE; + text_line = text_line - (bendHeight + 1); + } + else { + state.top_text_line += 1; + } + // Format Vibratos + for (let i = 0; i < vibratos.length; ++i) { + const vibrato = vibratos[i]; + vibrato.setXShift(shift); + vibrato.setTextLine(text_line); + width += vibrato.getWidth(); + shift += width; + } + state.right_shift += width; + return true; + } + /** Set harsh vibrato. */ + setHarsh(harsh) { + this.render_options.harsh = harsh; + return this; + } + /** Set vibrato width in pixels. */ + setVibratoWidth(width) { + this.render_options.vibrato_width = width; + this.setWidth(width); + return this; + } + /** Draw the vibrato on the rendering context. */ + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const start = note.getModifierStartXY(_modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.RIGHT, this.index); + const vx = start.x + this.x_shift; + const vy = note.getYForTopText(this.text_line) + 2; + Vibrato.renderVibrato(ctx, vx, vy, this.render_options); + } + /** + * Static rendering method that can be called from + * other classes (e.g. VibratoBracket). + */ + static renderVibrato(ctx, x, y, opts) { + const { harsh, vibrato_width, wave_width, wave_girth, wave_height } = opts; + const num_waves = vibrato_width / wave_width; + ctx.beginPath(); + let i; + if (harsh) { + ctx.moveTo(x, y + wave_girth + 1); + for (i = 0; i < num_waves / 2; ++i) { + ctx.lineTo(x + wave_width, y - wave_height / 2); + x += wave_width; + ctx.lineTo(x + wave_width, y + wave_height / 2); + x += wave_width; + } + for (i = 0; i < num_waves / 2; ++i) { + ctx.lineTo(x - wave_width, y - wave_height / 2 + wave_girth + 1); + x -= wave_width; + ctx.lineTo(x - wave_width, y + wave_height / 2 + wave_girth + 1); + x -= wave_width; + } + ctx.fill(); + } + else { + ctx.moveTo(x, y + wave_girth); + for (i = 0; i < num_waves / 2; ++i) { + ctx.quadraticCurveTo(x + wave_width / 2, y - wave_height / 2, x + wave_width, y); + x += wave_width; + ctx.quadraticCurveTo(x + wave_width / 2, y + wave_height / 2, x + wave_width, y); + x += wave_width; + } + for (i = 0; i < num_waves / 2; ++i) { + ctx.quadraticCurveTo(x - wave_width / 2, y + wave_height / 2 + wave_girth, x - wave_width, y + wave_girth); + x -= wave_width; + ctx.quadraticCurveTo(x - wave_width / 2, y - wave_height / 2 + wave_girth, x - wave_width, y + wave_girth); + x -= wave_width; + } + ctx.fill(); + } + } +} + + +/***/ }), + +/***/ "./src/vibratobracket.ts": +/*!*******************************!*\ + !*** ./src/vibratobracket.ts ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "VibratoBracket": () => (/* binding */ VibratoBracket) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +/* harmony import */ var _vibrato__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./vibrato */ "./src/vibrato.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author: Balazs Forian-Szabo +// MIT License + + + + +// eslint-disable-next-line +function L(...args) { + if (VibratoBracket.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_2__.log)('Vex.Flow.VibratoBracket', args); +} +/** `VibratoBracket` renders vibrato effect between two notes. */ +class VibratoBracket extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + /** + * Either the stop or start note must be set, or both of them. + * An undefined value for the start or stop note indicates that the vibrato + * is drawn from the beginning or until the end of the stave accordingly. + */ + constructor(bracket_data) { + super(); + if (bracket_data.start) + this.start = bracket_data.start; + if (bracket_data.stop) + this.stop = bracket_data.stop; + this.line = 1; + this.render_options = { + harsh: false, + wave_height: 6, + wave_width: 4, + wave_girth: 2, + vibrato_width: 0, + }; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_1__.Category.VibratoBracket; + } + /** Set line position of the vibrato bracket. */ + setLine(line) { + this.line = line; + return this; + } + /** Set harsh vibrato bracket. */ + setHarsh(harsh) { + this.render_options.harsh = harsh; + return this; + } + /** Draw the vibrato bracket on the rendering context. */ + draw() { + const ctx = this.checkContext(); + this.setRendered(); + const y = (this.start && this.start.checkStave().getYForTopText(this.line)) || + (this.stop && this.stop.checkStave().getYForTopText(this.line)) || + 0; + // If start note is not set then vibrato will be drawn + // from the beginning of the stave + const start_x = (this.start && this.start.getAbsoluteX()) || (this.stop && this.stop.checkStave().getTieStartX()) || 0; + // If stop note is not set then vibrato will be drawn + // until the end of the stave + const stop_x = (this.stop && this.stop.getAbsoluteX() - this.stop.getWidth() - 5) || + (this.start && this.start.checkStave().getTieEndX() - 10) || + 0; + this.render_options.vibrato_width = stop_x - start_x; + L('Rendering VibratoBracket: start_x:', start_x, 'stop_x:', stop_x, 'y:', y); + _vibrato__WEBPACK_IMPORTED_MODULE_3__.Vibrato.renderVibrato(ctx, start_x, y, this.render_options); + } +} +/** To enable logging for this class. Set `Vex.Flow.VibratoBracket.DEBUG` to `true`. */ +VibratoBracket.DEBUG = false; + + +/***/ }), + +/***/ "./src/voice.ts": +/*!**********************!*\ + !*** ./src/voice.ts ***! + \**********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "VoiceMode": () => (/* binding */ VoiceMode), +/* harmony export */ "Voice": () => (/* binding */ Voice) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _fraction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./fraction */ "./src/fraction.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + +var VoiceMode; +(function (VoiceMode) { + VoiceMode[VoiceMode["STRICT"] = 1] = "STRICT"; + VoiceMode[VoiceMode["SOFT"] = 2] = "SOFT"; + VoiceMode[VoiceMode["FULL"] = 3] = "FULL"; +})(VoiceMode || (VoiceMode = {})); +/** + * `Voice` is mainly a container object to group `Tickables` for formatting. + */ +class Voice extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + constructor(time, options) { + super(); + this.resolutionMultiplier = 1; + this.mode = VoiceMode.STRICT; + this.preFormatted = false; + this.ticksUsed = new _fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(0, 1); + this.largestTickWidth = 0; + this.tickables = []; + this.options = Object.assign({ softmaxFactor: 100 }, options); + // Convert the `time` string into a VoiceTime object if necessary. + let voiceTime; + if (typeof time === 'string') { + // Time signature shortcut: "4/4", "3/8", etc. + const match = time.match(/(\d+)\/(\d+)/); + if (match) { + voiceTime = { + num_beats: parseInt(match[1]), + beat_value: parseInt(match[2]), + }; + } + } + else { + voiceTime = time; + } + // Default time signature is 4/4. + this.time = Object.assign({ num_beats: 4, beat_value: 4, resolution: _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.RESOLUTION }, voiceTime); + // Recalculate total ticks. + this.totalTicks = new _fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(this.time.num_beats * (this.time.resolution / this.time.beat_value), 1); + this.smallestTickCount = this.totalTicks.clone(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.Voice; + } + /** + * Modes allow the addition of ticks in three different ways: + * - STRICT: This is the default. Ticks must fill the voice. + * - SOFT: Ticks can be added without restrictions. + * - FULL: Ticks do not need to fill the voice, but can't exceed the maximum tick length. + */ + static get Mode() { + return VoiceMode; + } + /** Get the total ticks in the voice. */ + getTotalTicks() { + return this.totalTicks; + } + /** Get the total ticks used in the voice by all the tickables. */ + getTicksUsed() { + return this.ticksUsed; + } + /** Get the largest width of all the tickables. */ + getLargestTickWidth() { + return this.largestTickWidth; + } + /** Get the tick count for the shortest tickable */ + getSmallestTickCount() { + return this.smallestTickCount; + } + /** Get the tickables in the voice. */ + getTickables() { + return this.tickables; + } + /** Get the voice mode. */ + getMode() { + return this.mode; + } + /** + * Set the voice mode. + * @param mode value from `VoiceMode` + */ + setMode(mode) { + this.mode = mode; + return this; + } + /** Get the resolution multiplier for the voice. */ + getResolutionMultiplier() { + return this.resolutionMultiplier; + } + /** Get the actual tick resolution for the voice. */ + getActualResolution() { + return this.resolutionMultiplier * this.time.resolution; + } + /** Set the voice's stave. */ + setStave(stave) { + this.stave = stave; + // Reset the bounding box so we can reformat. + this.boundingBox = undefined; + return this; + } + getStave() { + return this.stave; + } + /** Get the bounding box for the voice. */ + getBoundingBox() { + if (!this.boundingBox) { + const stave = this.checkStave(); + let boundingBox = undefined; + for (let i = 0; i < this.tickables.length; ++i) { + const tickable = this.tickables[i]; + tickable.setStave(stave); + const bb = tickable.getBoundingBox(); + if (bb) { + boundingBox = boundingBox ? boundingBox.mergeWith(bb) : bb; + } + } + this.boundingBox = boundingBox; + } + return this.boundingBox; + } + /** Set the voice mode to strict or soft. */ + setStrict(strict) { + this.mode = strict ? VoiceMode.STRICT : VoiceMode.SOFT; + return this; + } + /** Determine if the voice is complete according to the voice mode. */ + isComplete() { + if (this.mode === VoiceMode.STRICT || this.mode === VoiceMode.FULL) { + return this.ticksUsed.equals(this.totalTicks); + } + else { + return true; + } + } + /** + * We use softmax to layout the tickables proportional to the exponent of + * their duration. The softmax factor is used to determine the 'linearness' of + * the layout. + * + * The softmax of all the tickables in this voice should sum to 1. + */ + setSoftmaxFactor(factor) { + this.options.softmaxFactor = factor; + return this; + } + /** + * Calculate the sum of the exponents of all the ticks in this voice to use + * as the denominator of softmax. + */ + reCalculateExpTicksUsed() { + const totalTicks = this.ticksUsed.value(); + const exp = (tickable) => Math.pow(this.options.softmaxFactor, tickable.getTicks().value() / totalTicks); + this.expTicksUsed = this.tickables.map(exp).reduce((a, b) => a + b, 0); + return this.expTicksUsed; + } + /** Get the softmax-scaled value of a tick duration. 'tickValue' is a number. */ + softmax(tickValue) { + if (!this.expTicksUsed) { + this.expTicksUsed = this.reCalculateExpTicksUsed(); + } + const totalTicks = this.ticksUsed.value(); + const exp = (v) => Math.pow(this.options.softmaxFactor, v / totalTicks); + const sm = exp(tickValue) / this.expTicksUsed; + return sm; + } + /** Add a tickable to the voice. */ + addTickable(tickable) { + if (!tickable.shouldIgnoreTicks()) { + const ticks = tickable.getTicks(); + // Update the total ticks for this line. + this.ticksUsed.add(ticks); + this.expTicksUsed = 0; // reset + if ((this.mode === VoiceMode.STRICT || this.mode === VoiceMode.FULL) && + this.ticksUsed.greaterThan(this.totalTicks)) { + this.ticksUsed.subtract(ticks); + throw new _util__WEBPACK_IMPORTED_MODULE_4__.RuntimeError('BadArgument', 'Too many ticks.'); + } + // Track the smallest tickable for formatting. + if (ticks.lessThan(this.smallestTickCount)) { + this.smallestTickCount = ticks.clone(); + } + this.resolutionMultiplier = this.ticksUsed.denominator; + // Expand total ticks using denominator from ticks used. + this.totalTicks.add(0, this.ticksUsed.denominator); + } + // Add the tickable to the line. + this.tickables.push(tickable); + tickable.setVoice(this); + return this; + } + /** Add an array of tickables to the voice. */ + addTickables(tickables) { + for (let i = 0; i < tickables.length; ++i) { + this.addTickable(tickables[i]); + } + return this; + } + /** Preformat the voice by applying the voice's stave to each note. */ + preFormat() { + if (this.preFormatted) + return this; + const stave = this.checkStave(); + this.tickables.forEach((tickable) => { + if (!tickable.getStave()) { + tickable.setStave(stave); + } + }); + this.preFormatted = true; + return this; + } + checkStave() { + return (0,_util__WEBPACK_IMPORTED_MODULE_4__.defined)(this.stave, 'NoStave', 'No stave attached to instance.'); + } + /** + * Render the voice onto the canvas `context` and an optional `stave`. + * If `stave` is omitted, it is expected that the notes have staves + * already set. + * + * This method also calculates the voice's boundingBox while drawing + * the notes. Note the similarities with this.getBoundingBox(). + */ + draw(context = this.checkContext(), stave) { + stave = stave !== null && stave !== void 0 ? stave : this.stave; + this.setRendered(); + let boundingBox = undefined; + for (let i = 0; i < this.tickables.length; ++i) { + const tickable = this.tickables[i]; + // Set the stave if provided. + if (stave) { + tickable.setStave(stave); + } + (0,_util__WEBPACK_IMPORTED_MODULE_4__.defined)(tickable.getStave(), 'MissingStave', 'The voice cannot draw tickables without staves.'); + const bb = tickable.getBoundingBox(); + if (bb) { + boundingBox = boundingBox ? boundingBox.mergeWith(bb) : bb; + } + tickable.setContext(context); + tickable.drawWithStyle(); + } + this.boundingBox = boundingBox; + } +} + + +/***/ }), + +/***/ "./src/web.ts": +/*!********************!*\ + !*** ./src/web.ts ***! + \********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "isHTMLCanvas": () => (/* binding */ isHTMLCanvas), +/* harmony export */ "isHTMLDiv": () => (/* binding */ isHTMLDiv) +/* harmony export */ }); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author: Ron B. Yeh +// MIT License +// +// Utilities for working with Web APIs. +// See: https://developer.mozilla.org/en-US/docs/Web/API + +// eslint-disable-next-line +function isHTMLCanvas(element) { + if (!element) + return false; + const global = (0,_util__WEBPACK_IMPORTED_MODULE_0__.globalObject)(); + return ( + // It's either an instance of the HTMLCanvasElement class, + (typeof global.HTMLCanvasElement === 'function' && element instanceof global.HTMLCanvasElement) || + // OR it's pretending to be a element. Good enough! + // Do not rely on .tagName, because node-canvas doesn't provide a tagName. + (typeof element.getContext === 'function' && typeof element.toDataURL === 'function')); +} +// eslint-disable-next-line +function isHTMLDiv(element) { + if (!element) + return false; + const global = (0,_util__WEBPACK_IMPORTED_MODULE_0__.globalObject)(); + return ( + // It's either an instance of the HTMLDivElement class. + (typeof global.HTMLDivElement === 'function' && element instanceof global.HTMLDivElement) || + // OR it's pretending to be a
. See: svgcontext.ts. + (typeof element.appendChild === 'function' && typeof element.style === 'object')); +} + + +/***/ }), + +/***/ "./tests/accidental_tests.ts": +/*!***********************************!*\ + !*** ./tests/accidental_tests.ts ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "AccidentalTests": () => (/* binding */ AccidentalTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_accidental__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/accidental */ "./src/accidental.ts"); +/* harmony import */ var _src_beam__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/beam */ "./src/beam.ts"); +/* harmony import */ var _src_dot__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/dot */ "./src/dot.ts"); +/* harmony import */ var _src_flow__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/flow */ "./src/flow.ts"); +/* harmony import */ var _src_formatter__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/formatter */ "./src/formatter.ts"); +/* harmony import */ var _src_modifiercontext__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/modifiercontext */ "./src/modifiercontext.ts"); +/* harmony import */ var _src_note__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/note */ "./src/note.ts"); +/* harmony import */ var _src_stave__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/stave */ "./src/stave.ts"); +/* harmony import */ var _src_stavenote__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/stavenote */ "./src/stavenote.ts"); +/* harmony import */ var _src_stem__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/stem */ "./src/stem.ts"); +/* harmony import */ var _src_tickcontext__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/tickcontext */ "./src/tickcontext.ts"); +/* harmony import */ var _src_timesignote__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../src/timesignote */ "./src/timesignote.ts"); +/* harmony import */ var _src_typeguard__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../src/typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _src_voice__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../src/voice */ "./src/voice.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Accidental Tests + + + + + + + + + + + + + + + +const AccidentalTests = { + Start() { + QUnit.module('Accidental'); + test('Automatic Accidentals - Simple Tests', autoAccidentalWorking); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Accidental Padding', formatAccidentalSpaces); + run('Basic', basic); + run('Stem Down', basicStemDown); + run('Cautionary Accidental', cautionary); + run('Accidental Arrangement Special Cases', specialCases); + run('Multi Voice', multiVoice); + run('Microtonal', microtonal); + run('Microtonal (Iranian)', microtonal_iranian); + run('Sagittal', sagittal); + run('Automatic Accidentals', automaticAccidentals0); + run('Automatic Accidentals - C major scale in Ab', automaticAccidentals1); + run('Automatic Accidentals - No Accidentals Necessary', automaticAccidentals2); + run('Automatic Accidentals - No Accidentals Necessary (EasyScore)', automaticAccidentals3); + run('Automatic Accidentals - Multi Voice Inline', automaticAccidentalsMultiVoiceInline); + run('Automatic Accidentals - Multi Voice Offset', automaticAccidentalsMultiVoiceOffset); + run('Automatic Accidentals - Key C, Single Octave', automaticAccidentalsCornerCases1); + run('Automatic Accidentals - Key C, Two Octaves', automaticAccidentalsCornerCases2); + run('Automatic Accidentals - Key C#, Single Octave', automaticAccidentalsCornerCases3); + run('Automatic Accidentals - Key C#, Two Octaves', automaticAccidentalsCornerCases4); + run('Factory API', factoryAPI); + }, +}; +// Check that at least one of the note's modifiers is an Accidental. +function hasAccidental(note) { + return note.getModifiers().some((modifier) => (0,_src_typeguard__WEBPACK_IMPORTED_MODULE_13__.isAccidental)(modifier)); +} +// Return a convenience function for building accidentals from a string. +function makeNewAccid(factory) { + return (type) => factory.Accidental({ type }); +} +/** + * + */ +function autoAccidentalWorking() { + const createStaveNote = (noteStruct) => new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote(noteStruct); + let notes = [ + { keys: ['bb/4'], duration: '4' }, + { keys: ['bb/4'], duration: '4' }, + { keys: ['g#/4'], duration: '4' }, + { keys: ['g/4'], duration: '4' }, + { keys: ['b/4'], duration: '4' }, + { keys: ['b/4'], duration: '4' }, + { keys: ['a#/4'], duration: '4' }, + { keys: ['g#/4'], duration: '4' }, + ].map(createStaveNote); + let voice = new _src_voice__WEBPACK_IMPORTED_MODULE_14__.Voice().setMode(_src_voice__WEBPACK_IMPORTED_MODULE_14__.Voice.Mode.SOFT).addTickables(notes); + // F Major (Bb) + _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental.applyAccidentals([voice], 'F'); + equal(hasAccidental(notes[0]), false, 'No flat because of key signature'); + equal(hasAccidental(notes[1]), false, 'No flat because of key signature'); + equal(hasAccidental(notes[2]), true, 'Added a sharp'); + equal(hasAccidental(notes[3]), true, 'Back to natural'); + equal(hasAccidental(notes[4]), true, 'Back to natural'); + equal(hasAccidental(notes[5]), false, 'Natural remembered'); + equal(hasAccidental(notes[6]), true, 'Added sharp'); + equal(hasAccidental(notes[7]), true, 'Added sharp'); + notes = [ + { keys: ['e#/4'], duration: '4' }, + { keys: ['cb/4'], duration: '4' }, + { keys: ['fb/4'], duration: '4' }, + { keys: ['b#/4'], duration: '4' }, + { keys: ['b#/4'], duration: '4' }, + { keys: ['cb/5'], duration: '4' }, + { keys: ['fb/5'], duration: '4' }, + { keys: ['e#/4'], duration: '4' }, + ].map(createStaveNote); + voice = new _src_voice__WEBPACK_IMPORTED_MODULE_14__.Voice().setMode(_src_voice__WEBPACK_IMPORTED_MODULE_14__.Voice.Mode.SOFT).addTickables(notes); + // A Major (F#,G#,C#) + _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental.applyAccidentals([voice], 'A'); + equal(hasAccidental(notes[0]), true, 'Added sharp'); + equal(hasAccidental(notes[1]), true, 'Added flat'); + equal(hasAccidental(notes[2]), true, 'Added flat'); + equal(hasAccidental(notes[3]), true, 'Added sharp'); + equal(hasAccidental(notes[4]), false, 'Sharp remembered'); + equal(hasAccidental(notes[5]), true, 'Added flat(different octave)'); + equal(hasAccidental(notes[6]), true, 'Added flat(different octave)'); + equal(hasAccidental(notes[7]), false, 'sharp remembered'); + notes = [ + { keys: ['c/4'], duration: '4' }, + { keys: ['cb/4'], duration: '4' }, + { keys: ['cb/4'], duration: '4' }, + { keys: ['c#/4'], duration: '4' }, + { keys: ['c#/4'], duration: '4' }, + { keys: ['cbb/4'], duration: '4' }, + { keys: ['cbb/4'], duration: '4' }, + { keys: ['c##/4'], duration: '4' }, + { keys: ['c##/4'], duration: '4' }, + { keys: ['c/4'], duration: '4' }, + { keys: ['c/4'], duration: '4' }, + ].map(createStaveNote); + voice = new _src_voice__WEBPACK_IMPORTED_MODULE_14__.Voice().setMode(_src_voice__WEBPACK_IMPORTED_MODULE_14__.Voice.Mode.SOFT).addTickables(notes); + // C Major (no sharps/flats) + _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental.applyAccidentals([voice], 'C'); + equal(hasAccidental(notes[0]), false, 'No accidental'); + equal(hasAccidental(notes[1]), true, 'Added flat'); + equal(hasAccidental(notes[2]), false, 'Flat remembered'); + equal(hasAccidental(notes[3]), true, 'Sharp added'); + equal(hasAccidental(notes[4]), false, 'Sharp remembered'); + equal(hasAccidental(notes[5]), true, 'Added doubled flat'); + equal(hasAccidental(notes[6]), false, 'Double flat remembered'); + equal(hasAccidental(notes[7]), true, 'Added double sharp'); + equal(hasAccidental(notes[8]), false, 'Double sharp rememberd'); + equal(hasAccidental(notes[9]), true, 'Added natural'); + equal(hasAccidental(notes[10]), false, 'Natural remembered'); +} +/** + * + */ +function formatAccidentalSpaces(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 750, 280); + const context = f.getContext(); + const softmaxFactor = 100; + // Create the notes + const notes = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ + keys: ['e##/5'], + duration: '8d', + }).addModifier(new _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental('##'), 0), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ + keys: ['b/4'], + duration: '16', + }).addModifier(new _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental('b'), 0), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ + keys: ['f/3'], + duration: '8', + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ + keys: ['a/3'], + duration: '16', + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ + keys: ['e/4', 'g/4'], + duration: '16', + }) + .addModifier(new _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental('bb'), 0) + .addModifier(new _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental('bb'), 1), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ + keys: ['d/4'], + duration: '16', + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ + keys: ['e/4', 'g/4'], + duration: '16', + }) + .addModifier(new _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental('#'), 0) + .addModifier(new _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental('#'), 1), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ + keys: ['g/4'], + duration: '32', + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ + keys: ['a/4'], + duration: '32', + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ + keys: ['g/4'], + duration: '16', + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ + keys: ['d/4'], + duration: 'q', + }), + ]; + _src_dot__WEBPACK_IMPORTED_MODULE_3__.Dot.buildAndAttach([notes[0]], { all: true }); + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_2__.Beam.generateBeams(notes); + const voice = new _src_voice__WEBPACK_IMPORTED_MODULE_14__.Voice({ + num_beats: 4, + beat_value: 4, + }); + voice.addTickables(notes); + const formatter = new _src_formatter__WEBPACK_IMPORTED_MODULE_5__.Formatter({ softmaxFactor }).joinVoices([voice]); + const width = formatter.preCalculateMinTotalWidth([voice]); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_8__.Stave(10, 40, width + 20); + stave.setContext(context).draw(); + formatter.format([voice], width); + voice.draw(context, stave); + beams.forEach((b) => b.setContext(context).draw()); + notes.forEach((note) => _src_note__WEBPACK_IMPORTED_MODULE_7__.Note.plotMetrics(context, note, 30)); + _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.plotLegendForNoteWidth(context, 300, 150); + ok(true); +} +function basic(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 700, 240); + const accid = makeNewAccid(f); + f.Stave({ x: 10, y: 10, width: 550 }); + const notes = [ + f + .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: '1' }) + .addModifier(accid('b'), 0) + .addModifier(accid('#'), 1), + f + .StaveNote({ keys: ['d/4', 'e/4', 'f/4', 'a/4', 'c/5', 'e/5', 'g/5'], duration: '2' }) + .addModifier(accid('##'), 0) + .addModifier(accid('n'), 1) + .addModifier(accid('bb'), 2) + .addModifier(accid('b'), 3) + .addModifier(accid('#'), 4) + .addModifier(accid('n'), 5) + .addModifier(accid('bb'), 6), + f + .StaveNote({ keys: ['f/4', 'g/4', 'a/4', 'b/4', 'c/5', 'e/5', 'g/5'], duration: '16' }) + .addModifier(accid('n'), 0) + .addModifier(accid('#'), 1) + .addModifier(accid('#'), 2) + .addModifier(accid('b'), 3) + .addModifier(accid('bb'), 4) + .addModifier(accid('##'), 5) + .addModifier(accid('#'), 6), + f + .StaveNote({ keys: ['a/3', 'c/4', 'e/4', 'b/4', 'd/5', 'g/5'], duration: '1' }) + .addModifier(accid('#'), 0) + .addModifier(accid('##').setAsCautionary(), 1) + .addModifier(accid('#').setAsCautionary(), 2) + .addModifier(accid('b'), 3) + .addModifier(accid('bb').setAsCautionary(), 4) + .addModifier(accid('b').setAsCautionary(), 5), + ]; + _src_formatter__WEBPACK_IMPORTED_MODULE_5__.Formatter.SimpleFormat(notes, 10, { paddingBetween: 45 }); + notes.forEach((note, index) => { + _src_note__WEBPACK_IMPORTED_MODULE_7__.Note.plotMetrics(f.getContext(), note, 140); + ok(note.getModifiersByType('Accidental').length > 0, 'Note ' + index + ' has accidentals'); + note.getModifiersByType('Accidental').forEach((accid, index) => { + ok(accid.getWidth() > 0, 'Accidental ' + index + ' has set width'); + }); + }); + f.draw(); + _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.plotLegendForNoteWidth(f.getContext(), 480, 140); + ok(true, 'Full Accidental'); +} +function cautionary(options) { + const staveCount = 12; + const scale = 0.85; + const staveWidth = 840; + let i = 0; + let j = 0; + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, staveWidth + 10, 175 * staveCount + 10); + f.getContext().scale(scale, scale); + const accids = Object.keys(_src_flow__WEBPACK_IMPORTED_MODULE_4__.Flow.accidentalMap).filter((accid) => accid !== '{' && accid !== '}'); + const mod = Math.round(accids.length / staveCount); + for (i = 0; i < staveCount; ++i) { + const stave = f.Stave({ x: 0, y: 10 + 200 * i, width: staveWidth / scale }); + const score = f.EasyScore(); + const rowMap = []; + for (j = 0; j < mod && j + i * staveCount < accids.length; ++j) { + rowMap.push(accids[j + i * staveCount]); + } + const notes = rowMap.map((accidType) => f + .StaveNote({ keys: ['a/4'], duration: '4', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_10__.Stem.UP }) + .addModifier(f.Accidental({ type: accidType }), 0)); + const voice = score.voice(notes, { time: rowMap.length + '/4' }); + voice.getTickables().forEach((tickable) => { + tickable + .getModifiers() + .filter((modifier) => modifier.getAttribute('type') === _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental.CATEGORY) + .forEach((accid) => accid.setAsCautionary()); + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + } + ok(true, 'Must successfully render cautionary accidentals'); +} +function specialCases(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 700, 240); + const accid = makeNewAccid(f); + f.Stave({ x: 10, y: 10, width: 550 }); + const notes = [ + f + .StaveNote({ keys: ['f/4', 'd/5'], duration: '1' }) + .addModifier(accid('#'), 0) + .addModifier(accid('b'), 1), + f + .StaveNote({ keys: ['c/4', 'g/4'], duration: '2' }) + .addModifier(accid('##'), 0) + .addModifier(accid('##'), 1), + f + .StaveNote({ keys: ['b/3', 'd/4', 'f/4'], duration: '16' }) + .addModifier(accid('#'), 0) + .addModifier(accid('#'), 1) + .addModifier(accid('##'), 2), + f + .StaveNote({ keys: ['g/4', 'a/4', 'c/5', 'e/5'], duration: '16' }) + .addModifier(accid('b'), 0) + .addModifier(accid('b'), 1) + .addModifier(accid('n'), 3), + f + .StaveNote({ keys: ['e/4', 'g/4', 'b/4', 'c/5'], duration: '4' }) + .addModifier(accid('b').setAsCautionary(), 0) + .addModifier(accid('b').setAsCautionary(), 1) + .addModifier(accid('bb'), 2) + .addModifier(accid('b'), 3), + f + .StaveNote({ keys: ['b/3', 'e/4', 'a/4', 'd/5', 'g/5'], duration: '8' }) + .addModifier(accid('bb'), 0) + .addModifier(accid('b').setAsCautionary(), 1) + .addModifier(accid('n').setAsCautionary(), 2) + .addModifier(accid('#'), 3) + .addModifier(accid('n').setAsCautionary(), 4), + ]; + _src_formatter__WEBPACK_IMPORTED_MODULE_5__.Formatter.SimpleFormat(notes, 0, { paddingBetween: 20 }); + notes.forEach((note, index) => { + _src_note__WEBPACK_IMPORTED_MODULE_7__.Note.plotMetrics(f.getContext(), note, 140); + ok(note.getModifiersByType('Accidental').length > 0, 'Note ' + index + ' has accidentals'); + note.getModifiersByType('Accidental').forEach((accid, index) => { + ok(accid.getWidth() > 0, 'Accidental ' + index + ' has set width'); + }); + }); + f.draw(); + _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.plotLegendForNoteWidth(f.getContext(), 480, 140); + ok(true, 'Full Accidental'); +} +function basicStemDown(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 700, 240); + const accid = makeNewAccid(f); + f.Stave({ x: 10, y: 10, width: 550 }); + const notes = [ + f + .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: 'w', stem_direction: -1 }) + .addModifier(accid('b'), 0) + .addModifier(accid('#'), 1), + f + .StaveNote({ keys: ['d/4', 'e/4', 'f/4', 'a/4', 'c/5', 'e/5', 'g/5'], duration: '2', stem_direction: -1 }) + .addModifier(accid('##'), 0) + .addModifier(accid('n'), 1) + .addModifier(accid('bb'), 2) + .addModifier(accid('b'), 3) + .addModifier(accid('#'), 4) + .addModifier(accid('n'), 5) + .addModifier(accid('bb'), 6), + f + .StaveNote({ keys: ['f/4', 'g/4', 'a/4', 'b/4', 'c/5', 'e/5', 'g/5'], duration: '16', stem_direction: -1 }) + .addModifier(accid('n'), 0) + .addModifier(accid('#'), 1) + .addModifier(accid('#'), 2) + .addModifier(accid('b'), 3) + .addModifier(accid('bb'), 4) + .addModifier(accid('##'), 5) + .addModifier(accid('#'), 6), + ]; + _src_formatter__WEBPACK_IMPORTED_MODULE_5__.Formatter.SimpleFormat(notes, 0, { paddingBetween: 30 }); + notes.forEach((note, noteIndex) => { + _src_note__WEBPACK_IMPORTED_MODULE_7__.Note.plotMetrics(f.getContext(), note, 140); + ok(note.getModifiersByType('Accidental').length > 0, 'Note ' + noteIndex + ' has accidentals'); + note.getModifiersByType('Accidental').forEach((accid, accidIndex) => { + ok(accid.getWidth() > 0, 'Accidental ' + accidIndex + ' has set width'); + }); + }); + f.draw(); + _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.plotLegendForNoteWidth(f.getContext(), 480, 140); + ok(true, 'Full Accidental'); +} +function multiVoice(options) { + // Helper function for visualizing + function showNotes(note1, note2, stave, ctx, x) { + const modifierContext = new _src_modifiercontext__WEBPACK_IMPORTED_MODULE_6__.ModifierContext(); + note1.addToModifierContext(modifierContext); + note2.addToModifierContext(modifierContext); + new _src_tickcontext__WEBPACK_IMPORTED_MODULE_11__.TickContext().addTickable(note1).addTickable(note2).preFormat().setX(x); + note1.setContext(ctx).draw(); + note2.setContext(ctx).draw(); + _src_note__WEBPACK_IMPORTED_MODULE_7__.Note.plotMetrics(ctx, note1, 180); + _src_note__WEBPACK_IMPORTED_MODULE_7__.Note.plotMetrics(ctx, note2, 15); + } + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 460, 250); + const accid = makeNewAccid(f); + const stave = f.Stave({ x: 10, y: 45, width: 420 }); + const ctx = f.getContext(); + stave.draw(); + let note1 = f + .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: '2', stem_direction: -1 }) + .addModifier(accid('b'), 0) + .addModifier(accid('n'), 1) + .addModifier(accid('#'), 2) + .setStave(stave); + let note2 = f + .StaveNote({ keys: ['d/5', 'a/5', 'b/5'], duration: '2', stem_direction: 1 }) + .addModifier(accid('b'), 0) + .addModifier(accid('bb'), 1) + .addModifier(accid('##'), 2) + .setStave(stave); + showNotes(note1, note2, stave, ctx, 60); + note1 = f + .StaveNote({ keys: ['c/4', 'e/4', 'c/5'], duration: '2', stem_direction: -1 }) + .addModifier(accid('b'), 0) + .addModifier(accid('n'), 1) + .addModifier(accid('#'), 2) + .setStave(stave); + note2 = f + .StaveNote({ keys: ['d/5', 'a/5', 'b/5'], duration: '4', stem_direction: 1 }) + .addModifier(accid('b'), 0) + .setStave(stave); + showNotes(note1, note2, stave, ctx, 150); + note1 = f + .StaveNote({ keys: ['d/4', 'c/5', 'd/5'], duration: '2', stem_direction: -1 }) + .addModifier(accid('b'), 0) + .addModifier(accid('n'), 1) + .addModifier(accid('#'), 2) + .setStave(stave); + note2 = f + .StaveNote({ keys: ['d/5', 'a/5', 'b/5'], duration: '4', stem_direction: 1 }) + .addModifier(accid('b'), 0) + .setStave(stave); + showNotes(note1, note2, stave, ctx, 250); + _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.plotLegendForNoteWidth(ctx, 350, 150); + ok(true, 'Full Accidental'); +} +function microtonal(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 700, 240); + const accid = makeNewAccid(f); + const ctx = f.getContext(); + f.Stave({ x: 10, y: 10, width: 650 }); + const notes = [ + f + .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: '1' }) + .addModifier(accid('db'), 0) + .addModifier(accid('d'), 1), + f + .StaveNote({ keys: ['d/4', 'e/4', 'f/4', 'a/4', 'c/5', 'e/5', 'g/5'], duration: '2' }) + .addModifier(accid('bbs'), 0) + .addModifier(accid('++'), 1) + .addModifier(accid('+'), 2) + .addModifier(accid('d'), 3) + .addModifier(accid('db'), 4) + .addModifier(accid('+'), 5) + .addModifier(accid('##'), 6), + f + .StaveNote({ keys: ['f/4', 'g/4', 'a/4', 'b/4', 'c/5', 'e/5', 'g/5'], duration: '16' }) + .addModifier(accid('++'), 0) + .addModifier(accid('bbs'), 1) + .addModifier(accid('+'), 2) + .addModifier(accid('b'), 3) + .addModifier(accid('db'), 4) + .addModifier(accid('##'), 5) + .addModifier(accid('#'), 6), + f + .StaveNote({ keys: ['a/3', 'c/4', 'e/4', 'b/4', 'd/5', 'g/5'], duration: '1' }) + .addModifier(accid('#'), 0) + .addModifier(accid('db').setAsCautionary(), 1) + .addModifier(accid('bbs').setAsCautionary(), 2) + .addModifier(accid('b'), 3) + .addModifier(accid('++').setAsCautionary(), 4) + .addModifier(accid('d').setAsCautionary(), 5), + f + .StaveNote({ keys: ['f/4', 'g/4', 'a/4', 'b/4', 'd/5', 'g/5'], duration: '16' }) + .addModifier(accid('++-'), 0) + .addModifier(accid('+-'), 1) + .addModifier(accid('bs'), 2) + .addModifier(accid('bss'), 3) + .addModifier(accid('afhf'), 4) + .addModifier(accid('ashs'), 5), + ]; + _src_formatter__WEBPACK_IMPORTED_MODULE_5__.Formatter.SimpleFormat(notes, 0, { paddingBetween: 35 }); + notes.forEach((note, index) => { + _src_note__WEBPACK_IMPORTED_MODULE_7__.Note.plotMetrics(f.getContext(), note, 140); + ok(note.getModifiersByType('Accidental').length > 0, 'Note ' + index + ' has accidentals'); + note.getModifiersByType('Accidental').forEach((accid, index) => { + ok(accid.getWidth() > 0, 'Accidental ' + index + ' has set width'); + }); + }); + f.draw(); + _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.plotLegendForNoteWidth(ctx, 580, 140); + ok(true, 'Microtonal Accidental'); +} +function microtonal_iranian(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 700, 240); + const accid = makeNewAccid(f); + const ctx = f.getContext(); + f.Stave({ x: 10, y: 10, width: 650 }); + const notes = [ + f + .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: '1' }) + .addModifier(accid('k'), 0) + .addModifier(accid('o'), 1), + f + .StaveNote({ keys: ['d/4', 'e/4', 'f/4', 'a/4', 'c/5', 'e/5', 'g/5'], duration: '2' }) + .addModifier(accid('b'), 0) + .addModifier(accid('k'), 1) + .addModifier(accid('n'), 2) + .addModifier(accid('o'), 3) + .addModifier(accid('#'), 4) + .addModifier(accid('bb'), 5) + .addModifier(accid('##'), 6), + f + .StaveNote({ keys: ['f/4', 'g/4', 'a/4', 'b/4', 'c/5', 'e/5', 'g/5'], duration: '16' }) + .addModifier(accid('o'), 0) + .addModifier(accid('k'), 1) + .addModifier(accid('n'), 2) + .addModifier(accid('b'), 3) + .addModifier(accid('bb'), 4) + .addModifier(accid('##'), 5) + .addModifier(accid('#'), 6), + f + .StaveNote({ keys: ['a/3', 'c/4', 'e/4', 'b/4', 'd/5', 'g/5'], duration: '1' }) + .addModifier(accid('#'), 0) + .addModifier(accid('o').setAsCautionary(), 1) + .addModifier(accid('n').setAsCautionary(), 2) + .addModifier(accid('b'), 3) + .addModifier(accid('k').setAsCautionary(), 4), + f + .StaveNote({ keys: ['f/4', 'g/4', 'a/4', 'b/4'], duration: '16' }) + .addModifier(accid('k'), 0) + .addModifier(accid('k'), 1) + .addModifier(accid('k'), 2) + .addModifier(accid('k'), 3), + ]; + _src_formatter__WEBPACK_IMPORTED_MODULE_5__.Formatter.SimpleFormat(notes, 0, { paddingBetween: 35 }); + notes.forEach((note, index) => { + _src_note__WEBPACK_IMPORTED_MODULE_7__.Note.plotMetrics(f.getContext(), note, 140); + ok(note.getModifiersByType('Accidental').length > 0, 'Note ' + index + ' has accidentals'); + note.getModifiersByType('Accidental').forEach((accid, index) => { + ok(accid.getWidth() > 0, 'Accidental ' + index + ' has set width'); + }); + }); + f.draw(); + _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.plotLegendForNoteWidth(ctx, 580, 140); + ok(true, 'Microtonal Accidental (Iranian)'); +} +function sagittal(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 700, 240); + const accid = makeNewAccid(f); + const ctx = f.getContext(); + f.Stave({ x: 10, y: 10, width: 650 }); + const notes = [ + f + .StaveNote({ keys: ['d/4', 'f/4', 'b/4', 'b/4'], duration: '4' }) + .addModifier(accid('accSagittal11MediumDiesisUp'), 1) + .addModifier(accid('accSagittal5CommaDown'), 2) + .addModifier(accid('b'), 3) + .addModifier(accid('accSagittal7CommaDown'), 3), + f + .StaveNote({ keys: ['d/4', 'f/4', 'a/4', 'b/4'], duration: '4' }) + .addModifier(accid('accSagittal35LargeDiesisDown'), 2), + f.StaveNote({ keys: ['c/4', 'e/4', 'g/4', 'c/5'], duration: '8' }).addModifier(accid('accSagittal5CommaDown'), 1), + f + .StaveNote({ keys: ['c/4', 'e/4', 'g/4', 'b/4'], duration: '8' }) + .addModifier(accid('b'), 1) + .addModifier(accid('accSagittal7CommaDown'), 1) + .addModifier(accid('accSagittal11LargeDiesisDown'), 3), + f + .StaveNote({ keys: ['d/4', 'f/4', 'b/4', 'b/4'], duration: '4' }) + .addModifier(accid('accSagittal11MediumDiesisUp'), 1) + .addModifier(accid('accSagittal5CommaDown'), 2) + .addModifier(accid('accSagittalFlat7CDown'), 3), + f + .StaveNote({ keys: ['d/4', 'f/4', 'a/4', 'b/4'], duration: '4' }) + .addModifier(accid('accSagittal35LargeDiesisDown'), 2), + f.StaveNote({ keys: ['c/4', 'e/4', 'g/4', 'c/5'], duration: '8' }).addModifier(accid('accSagittal5CommaDown'), 1), + f + .StaveNote({ keys: ['c/4', 'e/4', 'g/4', 'b/4'], duration: '8' }) + .addModifier(accid('accSagittalFlat7CDown'), 1) + .addModifier(accid('accSagittal11LargeDiesisDown'), 3), + ]; + f.StaveTie({ + from: notes[0], + to: notes[1], + first_indices: [0, 1], + last_indices: [0, 1], + }); + f.StaveTie({ + from: notes[0], + to: notes[1], + first_indices: [3], + last_indices: [3], + options: { + direction: _src_stem__WEBPACK_IMPORTED_MODULE_10__.Stem.DOWN, + }, + }); + f.StaveTie({ + from: notes[4], + to: notes[5], + first_indices: [0, 1], + last_indices: [0, 1], + }); + f.StaveTie({ + from: notes[4], + to: notes[5], + first_indices: [3], + last_indices: [3], + options: { + direction: _src_stem__WEBPACK_IMPORTED_MODULE_10__.Stem.DOWN, + }, + }); + f.Beam({ notes: notes.slice(2, 4) }); + f.Beam({ notes: notes.slice(6, 8) }); + _src_formatter__WEBPACK_IMPORTED_MODULE_5__.Formatter.SimpleFormat(notes); + notes.forEach((note, index) => { + _src_note__WEBPACK_IMPORTED_MODULE_7__.Note.plotMetrics(f.getContext(), note, 140); + ok(note.getModifiersByType('Accidental').length > 0, 'Note ' + index + ' has accidentals'); + note.getModifiersByType('Accidental').forEach((accid, index) => { + ok(accid.getWidth() > 0, 'Accidental ' + index + ' has set width'); + }); + }); + f.draw(); + _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.plotLegendForNoteWidth(ctx, 580, 140); + ok(true, 'Sagittal'); +} +function automaticAccidentals0(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 700, 200); + const stave = f.Stave(); + const notes = [ + { keys: ['c/4', 'c/5'], duration: '4' }, + { keys: ['c#/4', 'c#/5'], duration: '4' }, + { keys: ['c#/4', 'c#/5'], duration: '4' }, + { keys: ['c##/4', 'c##/5'], duration: '4' }, + { keys: ['c##/4', 'c##/5'], duration: '4' }, + { keys: ['c/4', 'c/5'], duration: '4' }, + { keys: ['cn/4', 'cn/5'], duration: '4' }, + { keys: ['cbb/4', 'cbb/5'], duration: '4' }, + { keys: ['cbb/4', 'cbb/5'], duration: '4' }, + { keys: ['cb/4', 'cb/5'], duration: '4' }, + { keys: ['cb/4', 'cb/5'], duration: '4' }, + { keys: ['c/4', 'c/5'], duration: '4' }, + ].map(f.StaveNote.bind(f)); + const gracenotes = [{ keys: ['d#/4'], duration: '16', slash: true }].map(f.GraceNote.bind(f)); + notes[0].addModifier(f.GraceNoteGroup({ notes: gracenotes }).beamNotes(), 0); + const voice = f + .Voice() + .setMode(_src_voice__WEBPACK_IMPORTED_MODULE_14__.Voice.Mode.SOFT) + .addTickable(new _src_timesignote__WEBPACK_IMPORTED_MODULE_12__.TimeSigNote('12/4').setStave(stave)) + .addTickables(notes); + _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental.applyAccidentals([voice], 'C'); + new _src_formatter__WEBPACK_IMPORTED_MODULE_5__.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true); +} +function automaticAccidentals1(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 700, 150); + const stave = f.Stave().addKeySignature('Ab'); + const notes = [ + { keys: ['c/4'], duration: '4' }, + { keys: ['d/4'], duration: '4' }, + { keys: ['e/4'], duration: '4' }, + { keys: ['f/4'], duration: '4' }, + { keys: ['g/4'], duration: '4' }, + { keys: ['a/4'], duration: '4' }, + { keys: ['b/4'], duration: '4' }, + { keys: ['c/5'], duration: '4' }, + ].map(f.StaveNote.bind(f)); + const voice = f.Voice().setMode(_src_voice__WEBPACK_IMPORTED_MODULE_14__.Voice.Mode.SOFT).addTickables(notes); + _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental.applyAccidentals([voice], 'Ab'); + new _src_formatter__WEBPACK_IMPORTED_MODULE_5__.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true); +} +function automaticAccidentals2(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 700, 150); + const stave = f.Stave().addKeySignature('A'); + const notes = [ + { keys: ['a/4'], duration: '4' }, + { keys: ['b/4'], duration: '4' }, + { keys: ['c#/5'], duration: '4' }, + { keys: ['d/5'], duration: '4' }, + { keys: ['e/5'], duration: '4' }, + { keys: ['f#/5'], duration: '4' }, + { keys: ['g#/5'], duration: '4' }, + { keys: ['a/5'], duration: '4' }, + ].map(f.StaveNote.bind(f)); + const voice = f.Voice().setMode(_src_voice__WEBPACK_IMPORTED_MODULE_14__.Voice.Mode.SOFT).addTickables(notes); + _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental.applyAccidentals([voice], 'A'); + new _src_formatter__WEBPACK_IMPORTED_MODULE_5__.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true); +} +function automaticAccidentals3(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 700, 150); + const stave = f.Stave().addKeySignature('A'); + const score = f.EasyScore(); + score.set({ time: '8/4' }); + const notes = score.notes('A4/q, B4/q, C#5/q, D5/q, E5/q,F#5/q, G#5/q, A5/q', { stem: 'UP' }); + const voice = f.Voice().setMode(_src_voice__WEBPACK_IMPORTED_MODULE_14__.Voice.Mode.SOFT).addTickables(notes); + _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental.applyAccidentals([voice], 'A'); + new _src_formatter__WEBPACK_IMPORTED_MODULE_5__.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true); +} +function automaticAccidentalsMultiVoiceInline(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 700, 150); + const stave = f.Stave().addKeySignature('Ab'); + const notes0 = [ + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['d/4'], duration: '4', stem_direction: -1 }, + { keys: ['e/4'], duration: '4', stem_direction: -1 }, + { keys: ['f/4'], duration: '4', stem_direction: -1 }, + { keys: ['g/4'], duration: '4', stem_direction: -1 }, + { keys: ['a/4'], duration: '4', stem_direction: -1 }, + { keys: ['b/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/5'], duration: '4', stem_direction: -1 }, + ].map(f.StaveNote.bind(f)); + const notes1 = [ + { keys: ['c/5'], duration: '4' }, + { keys: ['d/5'], duration: '4' }, + { keys: ['e/5'], duration: '4' }, + { keys: ['f/5'], duration: '4' }, + { keys: ['g/5'], duration: '4' }, + { keys: ['a/5'], duration: '4' }, + { keys: ['b/5'], duration: '4' }, + { keys: ['c/6'], duration: '4' }, + ].map(f.StaveNote.bind(f)); + const voice0 = f.Voice().setMode(_src_voice__WEBPACK_IMPORTED_MODULE_14__.Voice.Mode.SOFT).addTickables(notes0); + const voice1 = f.Voice().setMode(_src_voice__WEBPACK_IMPORTED_MODULE_14__.Voice.Mode.SOFT).addTickables(notes1); + // Ab Major + _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental.applyAccidentals([voice0, voice1], 'Ab'); + equal(hasAccidental(notes0[0]), false); + equal(hasAccidental(notes0[1]), true); + equal(hasAccidental(notes0[2]), true); + equal(hasAccidental(notes0[3]), false); + equal(hasAccidental(notes0[4]), false); + equal(hasAccidental(notes0[5]), true); + equal(hasAccidental(notes0[6]), true); + equal(hasAccidental(notes0[7]), false); + equal(hasAccidental(notes1[0]), false); + equal(hasAccidental(notes1[1]), true); + equal(hasAccidental(notes1[2]), true); + equal(hasAccidental(notes1[3]), false); + equal(hasAccidental(notes1[4]), false); + equal(hasAccidental(notes1[5]), true); + equal(hasAccidental(notes1[6]), true); + equal(hasAccidental(notes1[7]), false); + new _src_formatter__WEBPACK_IMPORTED_MODULE_5__.Formatter().joinVoices([voice0, voice1]).formatToStave([voice0, voice1], stave); + f.draw(); + ok(true); +} +function automaticAccidentalsMultiVoiceOffset(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 700, 150); + const stave = f.Stave().addKeySignature('Cb'); + const notes0 = [ + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['d/4'], duration: '4', stem_direction: -1 }, + { keys: ['e/4'], duration: '4', stem_direction: -1 }, + { keys: ['f/4'], duration: '4', stem_direction: -1 }, + { keys: ['g/4'], duration: '4', stem_direction: -1 }, + { keys: ['a/4'], duration: '4', stem_direction: -1 }, + { keys: ['b/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/5'], duration: '4', stem_direction: -1 }, + ].map(f.StaveNote.bind(f)); + const notes1 = [ + { keys: ['c/5'], duration: '8' }, + { keys: ['c/5'], duration: '4' }, + { keys: ['d/5'], duration: '4' }, + { keys: ['e/5'], duration: '4' }, + { keys: ['f/5'], duration: '4' }, + { keys: ['g/5'], duration: '4' }, + { keys: ['a/5'], duration: '4' }, + { keys: ['b/5'], duration: '4' }, + { keys: ['c/6'], duration: '4' }, + ].map(f.StaveNote.bind(f)); + const voice0 = f.Voice().setMode(_src_voice__WEBPACK_IMPORTED_MODULE_14__.Voice.Mode.SOFT).addTickables(notes0); + const voice1 = f.Voice().setMode(_src_voice__WEBPACK_IMPORTED_MODULE_14__.Voice.Mode.SOFT).addTickables(notes1); + // Cb Major (All flats) + _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental.applyAccidentals([voice0, voice1], 'Cb'); + equal(hasAccidental(notes0[0]), true); + equal(hasAccidental(notes0[1]), true); + equal(hasAccidental(notes0[2]), true); + equal(hasAccidental(notes0[3]), true); + equal(hasAccidental(notes0[4]), true); + equal(hasAccidental(notes0[5]), true); + equal(hasAccidental(notes0[6]), true); + equal(hasAccidental(notes0[7]), false, 'Natural Remembered'); + equal(hasAccidental(notes1[0]), true); + equal(hasAccidental(notes1[1]), false); + equal(hasAccidental(notes1[2]), true); + equal(hasAccidental(notes1[3]), true); + equal(hasAccidental(notes1[4]), true); + equal(hasAccidental(notes1[5]), true); + equal(hasAccidental(notes1[6]), true); + equal(hasAccidental(notes1[7]), true); + new _src_formatter__WEBPACK_IMPORTED_MODULE_5__.Formatter().joinVoices([voice0, voice1]).formatToStave([voice0, voice1], stave); + f.draw(); + ok(true); +} +function automaticAccidentalsCornerCases1(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 700, 150); + const stave = f.Stave().addKeySignature('C'); + const notes0 = [ + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c#/4'], duration: '4', stem_direction: -1 }, + { keys: ['c#/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['cb/4'], duration: '4', stem_direction: -1 }, + { keys: ['cb/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + ].map(f.StaveNote.bind(f)); + const voice0 = f.Voice().setMode(_src_voice__WEBPACK_IMPORTED_MODULE_14__.Voice.Mode.SOFT).addTickables(notes0); + _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental.applyAccidentals([voice0], 'C'); + equal(hasAccidental(notes0[0]), false); + equal(hasAccidental(notes0[1]), true); + equal(hasAccidental(notes0[2]), false); + equal(hasAccidental(notes0[3]), true); + equal(hasAccidental(notes0[4]), false); + equal(hasAccidental(notes0[5]), true); + equal(hasAccidental(notes0[6]), false); + equal(hasAccidental(notes0[7]), true); + equal(hasAccidental(notes0[8]), false); + new _src_formatter__WEBPACK_IMPORTED_MODULE_5__.Formatter().joinVoices([voice0]).formatToStave([voice0], stave); + f.draw(); + ok(true); +} +function automaticAccidentalsCornerCases2(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 700, 150); + const stave = f.Stave().addKeySignature('C'); + const notes0 = [ + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/5'], duration: '4', stem_direction: -1 }, + { keys: ['c#/4'], duration: '4', stem_direction: -1 }, + { keys: ['c#/5'], duration: '4', stem_direction: -1 }, + { keys: ['c#/4'], duration: '4', stem_direction: -1 }, + { keys: ['c#/5'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/5'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/5'], duration: '4', stem_direction: -1 }, + { keys: ['cb/4'], duration: '4', stem_direction: -1 }, + { keys: ['cb/5'], duration: '4', stem_direction: -1 }, + { keys: ['cb/4'], duration: '4', stem_direction: -1 }, + { keys: ['cb/5'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/5'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/5'], duration: '4', stem_direction: -1 }, + ].map(f.StaveNote.bind(f)); + const voice0 = f.Voice().setMode(_src_voice__WEBPACK_IMPORTED_MODULE_14__.Voice.Mode.SOFT).addTickables(notes0); + _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental.applyAccidentals([voice0], 'C'); + equal(hasAccidental(notes0[0]), false); + equal(hasAccidental(notes0[2]), true); + equal(hasAccidental(notes0[4]), false); + equal(hasAccidental(notes0[6]), true); + equal(hasAccidental(notes0[8]), false); + equal(hasAccidental(notes0[10]), true); + equal(hasAccidental(notes0[12]), false); + equal(hasAccidental(notes0[14]), true); + equal(hasAccidental(notes0[16]), false); + equal(hasAccidental(notes0[1]), false); + equal(hasAccidental(notes0[3]), true); + equal(hasAccidental(notes0[5]), false); + equal(hasAccidental(notes0[7]), true); + equal(hasAccidental(notes0[9]), false); + equal(hasAccidental(notes0[11]), true); + equal(hasAccidental(notes0[13]), false); + equal(hasAccidental(notes0[15]), true); + equal(hasAccidental(notes0[17]), false); + new _src_formatter__WEBPACK_IMPORTED_MODULE_5__.Formatter().joinVoices([voice0]).formatToStave([voice0], stave); + f.draw(); + ok(true); +} +function automaticAccidentalsCornerCases3(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 700, 150); + const stave = f.Stave().addKeySignature('C#'); + const notes0 = [ + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c#/4'], duration: '4', stem_direction: -1 }, + { keys: ['c#/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['cb/4'], duration: '4', stem_direction: -1 }, + { keys: ['cb/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + ].map(f.StaveNote.bind(f)); + const voice0 = f.Voice().setMode(_src_voice__WEBPACK_IMPORTED_MODULE_14__.Voice.Mode.SOFT).addTickables(notes0); + _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental.applyAccidentals([voice0], 'C#'); + equal(hasAccidental(notes0[0]), true); + equal(hasAccidental(notes0[1]), true); + equal(hasAccidental(notes0[2]), false); + equal(hasAccidental(notes0[3]), true); + equal(hasAccidental(notes0[4]), false); + equal(hasAccidental(notes0[5]), true); + equal(hasAccidental(notes0[6]), false); + equal(hasAccidental(notes0[7]), true); + equal(hasAccidental(notes0[8]), false); + new _src_formatter__WEBPACK_IMPORTED_MODULE_5__.Formatter().joinVoices([voice0]).formatToStave([voice0], stave); + f.draw(); + ok(true); +} +function automaticAccidentalsCornerCases4(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 700, 150); + const stave = f.Stave().addKeySignature('C#'); + const notes0 = [ + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/5'], duration: '4', stem_direction: -1 }, + { keys: ['c#/4'], duration: '4', stem_direction: -1 }, + { keys: ['c#/5'], duration: '4', stem_direction: -1 }, + { keys: ['c#/4'], duration: '4', stem_direction: -1 }, + { keys: ['c#/5'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/5'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/5'], duration: '4', stem_direction: -1 }, + { keys: ['cb/4'], duration: '4', stem_direction: -1 }, + { keys: ['cb/5'], duration: '4', stem_direction: -1 }, + { keys: ['cb/4'], duration: '4', stem_direction: -1 }, + { keys: ['cb/5'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/5'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/5'], duration: '4', stem_direction: -1 }, + ].map(f.StaveNote.bind(f)); + const voice0 = f.Voice().setMode(_src_voice__WEBPACK_IMPORTED_MODULE_14__.Voice.Mode.SOFT).addTickables(notes0); + _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental.applyAccidentals([voice0], 'C#'); + equal(hasAccidental(notes0[0]), true); + equal(hasAccidental(notes0[2]), true); + equal(hasAccidental(notes0[4]), false); + equal(hasAccidental(notes0[6]), true); + equal(hasAccidental(notes0[8]), false); + equal(hasAccidental(notes0[10]), true); + equal(hasAccidental(notes0[12]), false); + equal(hasAccidental(notes0[14]), true); + equal(hasAccidental(notes0[16]), false); + equal(hasAccidental(notes0[1]), true); + equal(hasAccidental(notes0[3]), true); + equal(hasAccidental(notes0[5]), false); + equal(hasAccidental(notes0[7]), true); + equal(hasAccidental(notes0[9]), false); + equal(hasAccidental(notes0[11]), true); + equal(hasAccidental(notes0[13]), false); + equal(hasAccidental(notes0[15]), true); + equal(hasAccidental(notes0[17]), false); + new _src_formatter__WEBPACK_IMPORTED_MODULE_5__.Formatter().joinVoices([voice0]).formatToStave([voice0], stave); + f.draw(); + ok(true); +} +function factoryAPI(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 700, 240); + f.Stave({ x: 10, y: 10, width: 550 }); + const accid = makeNewAccid(f); + const notes = [ + f + .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: 'w' }) + .addModifier(accid('b'), 0) + .addModifier(accid('#'), 1), + f + .StaveNote({ keys: ['d/4', 'e/4', 'f/4', 'a/4', 'c/5', 'e/5', 'g/5'], duration: 'h' }) + .addModifier(accid('##'), 0) + .addModifier(accid('n'), 1) + .addModifier(accid('bb'), 2) + .addModifier(accid('b'), 3) + .addModifier(accid('#'), 4) + .addModifier(accid('n'), 5) + .addModifier(accid('bb'), 6), + f + .StaveNote({ keys: ['f/4', 'g/4', 'a/4', 'b/4', 'c/5', 'e/5', 'g/5'], duration: '16' }) + .addModifier(accid('n'), 0) + .addModifier(accid('#'), 1) + .addModifier(accid('#'), 2) + .addModifier(accid('b'), 3) + .addModifier(accid('bb'), 4) + .addModifier(accid('##'), 5) + .addModifier(accid('#'), 6), + f + .StaveNote({ keys: ['a/3', 'c/4', 'e/4', 'b/4', 'd/5', 'g/5'], duration: 'w' }) + .addModifier(accid('#'), 0) + .addModifier(accid('##').setAsCautionary(), 1) + .addModifier(accid('#').setAsCautionary(), 2) + .addModifier(accid('b'), 3) + .addModifier(accid('bb').setAsCautionary(), 4) + .addModifier(accid('b').setAsCautionary(), 5), + ]; + _src_formatter__WEBPACK_IMPORTED_MODULE_5__.Formatter.SimpleFormat(notes); + notes.forEach((n, i) => { + ok(n.getModifiersByType('Accidental').length > 0, 'Note ' + i + ' has accidentals'); + n.getModifiersByType('Accidental').forEach((accid, i) => { + ok(accid.getWidth() > 0, 'Accidental ' + i + ' has set width'); + }); + }); + f.draw(); + ok(true, 'Factory API'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(AccidentalTests); + + + +/***/ }), + +/***/ "./tests/annotation_tests.ts": +/*!***********************************!*\ + !*** ./tests/annotation_tests.ts ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "AnnotationTests": () => (/* binding */ AnnotationTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_annotation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/annotation */ "./src/annotation.ts"); +/* harmony import */ var _src_articulation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/articulation */ "./src/articulation.ts"); +/* harmony import */ var _src_beam__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/beam */ "./src/beam.ts"); +/* harmony import */ var _src_bend__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/bend */ "./src/bend.ts"); +/* harmony import */ var _src_flow__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/flow */ "./src/flow.ts"); +/* harmony import */ var _src_font__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/font */ "./src/font.ts"); +/* harmony import */ var _src_formatter__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/formatter */ "./src/formatter.ts"); +/* harmony import */ var _src_modifier__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/modifier */ "./src/modifier.ts"); +/* harmony import */ var _src_registry__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/registry */ "./src/registry.ts"); +/* harmony import */ var _src_stave__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/stave */ "./src/stave.ts"); +/* harmony import */ var _src_stavenote__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/stavenote */ "./src/stavenote.ts"); +/* harmony import */ var _src_stem__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../src/stem */ "./src/stem.ts"); +/* harmony import */ var _src_tabnote__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../src/tabnote */ "./src/tabnote.ts"); +/* harmony import */ var _src_tabstave__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../src/tabstave */ "./src/tabstave.ts"); +/* harmony import */ var _src_vibrato__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../src/vibrato */ "./src/vibrato.ts"); +/* harmony import */ var _src_voice__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../src/voice */ "./src/voice.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Annotation Tests +// TODO: Formatter.FormatAndDraw(ctx, stave, notes, ???number???); +// Did a previous version of the API accept a number as the fourth argument? +// We removed the fourth argument from all of our test cases. + + + + + + + + + + + + + + + + + +const AnnotationTests = { + Start() { + QUnit.module('Annotation'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Placement', placement); + run('Lyrics', lyrics); + run('Simple Annotation', simple); + run('Standard Notation Annotation', standard); + run('Harmonics', harmonic); + run('Fingerpicking', picking); + run('Bottom Annotation', bottom); + run('Bottom Annotations with Beams', bottomWithBeam); + run('Test Justification Annotation Stem Up', justificationStemUp); + run('Test Justification Annotation Stem Down', justificationStemDown); + run('TabNote Annotations', tabNotes); + }, +}; +const FONT_SIZE = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.Font.size; +// Helper functions to create TabNote and StaveNote objects. +const tabNote = (noteStruct) => new _src_tabnote__WEBPACK_IMPORTED_MODULE_13__.TabNote(noteStruct); +const staveNote = (noteStruct) => new _src_stavenote__WEBPACK_IMPORTED_MODULE_11__.StaveNote(noteStruct); +/** + * Show lyrics using Annotation objects. + */ +function lyrics(options) { + let fontSize = FONT_SIZE; + let x = 10; + let width = 170; + let ratio = 1; + const registry = new _src_registry__WEBPACK_IMPORTED_MODULE_9__.Registry(); + _src_registry__WEBPACK_IMPORTED_MODULE_9__.Registry.enableDefaultRegistry(registry); + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 750, 260); + // Add three groups of staves. Each time we increase the fontSize by 2. + for (let i = 0; i < 3; ++i) { + const score = f.EasyScore(); + score.set({ time: '3/4' }); + const system = f.System({ width, x }); + system.addStave({ + voices: [ + score.voice(score.notes('(C4 F4)/2[id="n0"]').concat(score.beam(score.notes('(C4 A4)/8[id="n1"], (C#4 A4)/8[id="n2"]')))), + ], + }); + // Add lyrics under the first row. + ['hand,', 'and', 'me', 'pears', 'lead', 'the'].forEach((text, ix) => { + const verse = Math.floor(ix / 3); + const noteGroupID = 'n' + (ix % 3); + const noteGroup = registry.getElementById(noteGroupID); + const lyricsAnnotation = f.Annotation({ text }).setFont('Roboto Slab', fontSize); + lyricsAnnotation.setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_8__.ModifierPosition.BELOW); + noteGroup.addModifier(lyricsAnnotation, verse); + }); + // Second row doesn't have any lyrics. + system.addStave({ + voices: [score.voice(score.notes('(F4 D5)/2').concat(score.beam(score.notes('(F4 F5)/8, (F4 F5)/8'))))], + }); + f.draw(); + ratio = (fontSize + 2) / fontSize; + width = width * ratio; + x = x + width; + fontSize = fontSize + 2; + } + ok(true); +} +function simple(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 500, 240); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + ctx.font = '10pt Arial, sans-serif'; + const stave = new _src_tabstave__WEBPACK_IMPORTED_MODULE_14__.TabStave(10, 10, 450).addTabGlyph().setContext(ctx).draw(); + const notes = [ + tabNote({ + positions: [ + { str: 2, fret: 10 }, + { str: 4, fret: 9 }, + ], + duration: 'h', + }).addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation('T'), 0), + tabNote({ + positions: [{ str: 2, fret: 10 }], + duration: 'h', + }).addModifier(new _src_bend__WEBPACK_IMPORTED_MODULE_4__.Bend('Full').setTap('T'), 0), + ]; + _src_formatter__WEBPACK_IMPORTED_MODULE_7__.Formatter.FormatAndDraw(ctx, stave, notes); + ok(true, 'Simple Annotation'); +} +function standard(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 500, 240); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_10__.Stave(10, 10, 450).addClef('treble').setContext(ctx).draw(); + const annotation = (text) => new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation(text).setFont(_src_font__WEBPACK_IMPORTED_MODULE_6__.Font.SERIF, FONT_SIZE, 'normal', 'italic'); + const notes = [ + staveNote({ keys: ['c/4', 'e/4'], duration: 'h' }).addModifier(annotation('quiet'), 0), + staveNote({ keys: ['c/4', 'e/4', 'c/5'], duration: 'h' }).addModifier(annotation('Allegro'), 2), + ]; + _src_formatter__WEBPACK_IMPORTED_MODULE_7__.Formatter.FormatAndDraw(ctx, stave, notes); + ok(true, 'Standard Notation Annotation'); +} +function harmonic(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 500, 240); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + ctx.font = '10pt Arial'; + const stave = new _src_tabstave__WEBPACK_IMPORTED_MODULE_14__.TabStave(10, 10, 450).addTabGlyph().setContext(ctx).draw(); + const notes = [ + tabNote({ + positions: [ + { str: 2, fret: 12 }, + { str: 3, fret: 12 }, + ], + duration: 'h', + }).addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation('Harm.'), 0), + tabNote({ + positions: [{ str: 2, fret: 9 }], + duration: 'h', + }) + .addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation('(8va)').setFont(_src_font__WEBPACK_IMPORTED_MODULE_6__.Font.SERIF, FONT_SIZE, _src_font__WEBPACK_IMPORTED_MODULE_6__.FontWeight.NORMAL, _src_font__WEBPACK_IMPORTED_MODULE_6__.FontStyle.ITALIC), 0) + .addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation('A.H.'), 0), + ]; + _src_formatter__WEBPACK_IMPORTED_MODULE_7__.Formatter.FormatAndDraw(ctx, stave, notes); + ok(true, 'Simple Annotation'); +} +function picking(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 500, 240); + ctx.setFillStyle('#221'); + ctx.setStrokeStyle('#221'); + ctx.setFont(_src_font__WEBPACK_IMPORTED_MODULE_6__.Font.SANS_SERIF, FONT_SIZE); + const stave = new _src_tabstave__WEBPACK_IMPORTED_MODULE_14__.TabStave(10, 10, 450).addTabGlyph().setContext(ctx).draw(); + const annotation = (text) => new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation(text).setFont(_src_font__WEBPACK_IMPORTED_MODULE_6__.Font.SERIF, FONT_SIZE, _src_font__WEBPACK_IMPORTED_MODULE_6__.FontWeight.NORMAL, _src_font__WEBPACK_IMPORTED_MODULE_6__.FontStyle.ITALIC); + const notes = [ + tabNote({ + positions: [ + { str: 1, fret: 0 }, + { str: 2, fret: 1 }, + { str: 3, fret: 2 }, + { str: 4, fret: 2 }, + { str: 5, fret: 0 }, + ], + duration: 'h', + }).addModifier(new _src_vibrato__WEBPACK_IMPORTED_MODULE_15__.Vibrato().setVibratoWidth(40), 0), + tabNote({ + positions: [{ str: 6, fret: 9 }], + duration: '8', + }).addModifier(annotation('p').setVerticalJustification(_src_annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.TOP), 0), + tabNote({ + positions: [{ str: 3, fret: 9 }], + duration: '8', + }).addModifier(annotation('i').setVerticalJustification(_src_annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.TOP), 0), + tabNote({ + positions: [{ str: 2, fret: 9 }], + duration: '8', + }).addModifier(annotation('m').setVerticalJustification(_src_annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.TOP), 0), + tabNote({ + positions: [{ str: 1, fret: 9 }], + duration: '8', + }).addModifier(annotation('a').setVerticalJustification(_src_annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.TOP), 0), + ]; + _src_formatter__WEBPACK_IMPORTED_MODULE_7__.Formatter.FormatAndDraw(ctx, stave, notes); + ok(true, 'Fingerpicking'); +} +function placement(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 750, 300); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_10__.Stave(10, 50, 750).addClef('treble').setContext(ctx).draw(); + const annotation = (text, fontSize, vj) => new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation(text).setFont(_src_font__WEBPACK_IMPORTED_MODULE_6__.Font.SERIF, fontSize).setVerticalJustification(vj); + const notes = [ + staveNote({ keys: ['e/4'], duration: 'q', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_12__.Stem.DOWN }) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_2__.Articulation('a.').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_8__.ModifierPosition.ABOVE), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_2__.Articulation('a-').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_8__.ModifierPosition.ABOVE), 0) + .addModifier(annotation('v1', 10, _src_annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.TOP), 0) + .addModifier(annotation('v2', 10, _src_annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.TOP), 0), + staveNote({ keys: ['b/4'], duration: 'q', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_12__.Stem.DOWN }) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_2__.Articulation('a.').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_8__.ModifierPosition.ABOVE), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_2__.Articulation('a-').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_8__.ModifierPosition.ABOVE), 0) + .addModifier(annotation('v1', 10, _src_annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.TOP), 0) + .addModifier(annotation('v2', 10, _src_annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.TOP), 0), + staveNote({ keys: ['c/5'], duration: 'q', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_12__.Stem.DOWN }) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_2__.Articulation('a.').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_8__.ModifierPosition.ABOVE), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_2__.Articulation('a-').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_8__.ModifierPosition.ABOVE), 0) + .addModifier(annotation('v1', 10, _src_annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.TOP), 0) + .addModifier(annotation('v2', 10, _src_annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.TOP), 0), + staveNote({ keys: ['f/4'], duration: 'q' }) + .addModifier(annotation('v1', 14, _src_annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.TOP), 0) + .addModifier(annotation('v2', 14, _src_annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.TOP), 0), + staveNote({ keys: ['f/4'], duration: 'q', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_12__.Stem.DOWN }) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_2__.Articulation('am').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_8__.ModifierPosition.ABOVE), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_2__.Articulation('a.').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_8__.ModifierPosition.ABOVE), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_2__.Articulation('a-').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_8__.ModifierPosition.ABOVE), 0) + .addModifier(annotation('v1', 10, _src_annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.TOP), 0) + .addModifier(annotation('v2', 20, _src_annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.TOP), 0), + staveNote({ keys: ['f/5'], duration: 'q' }) + .addModifier(annotation('v1', 11, _src_annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.TOP), 0) + .addModifier(annotation('v2', 11, _src_annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.TOP), 0), + staveNote({ keys: ['f/5'], duration: 'q' }) + .addModifier(annotation('v1', 11, _src_annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.TOP), 0) + .addModifier(annotation('v2', 20, _src_annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.TOP), 0), + staveNote({ keys: ['f/4'], duration: 'q' }) + .addModifier(annotation('v1', 12, _src_annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.BOTTOM), 0) + .addModifier(annotation('v2', 12, _src_annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.BOTTOM), 0), + staveNote({ keys: ['f/5'], duration: 'q' }) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_2__.Articulation('a.').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_8__.ModifierPosition.BELOW), 0) + .addModifier(annotation('v1', 11, _src_annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.BOTTOM), 0) + .addModifier(annotation('v2', 20, _src_annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.BOTTOM), 0), + staveNote({ keys: ['f/5'], duration: 'q', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_12__.Stem.DOWN }) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_2__.Articulation('am').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_8__.ModifierPosition.BELOW), 0) + .addModifier(annotation('v1', 10, _src_annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.BOTTOM), 0) + .addModifier(annotation('v2', 20, _src_annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.BOTTOM), 0), + staveNote({ keys: ['f/4'], duration: 'q', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_12__.Stem.DOWN }) + .addModifier(annotation('v1', 10, _src_annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.BOTTOM), 0) + .addModifier(annotation('v2', 20, _src_annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.BOTTOM), 0), + staveNote({ keys: ['f/5'], duration: 'w' }) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_2__.Articulation('a@u').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_8__.ModifierPosition.BELOW), 0) + .addModifier(annotation('v1', 11, _src_annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.BOTTOM), 0) + .addModifier(annotation('v2', 16, _src_annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.BOTTOM), 0), + ]; + _src_formatter__WEBPACK_IMPORTED_MODULE_7__.Formatter.FormatAndDraw(ctx, stave, notes); + ok(true, ' Annotation Placement'); +} +function bottom(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 500, 240); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_10__.Stave(10, 10, 300).addClef('treble').setContext(ctx).draw(); + const annotation = (text) => new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation(text).setFont(_src_font__WEBPACK_IMPORTED_MODULE_6__.Font.SERIF, FONT_SIZE).setVerticalJustification(_src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation.VerticalJustify.BOTTOM); + const notes = [ + staveNote({ keys: ['f/4'], duration: 'w' }).addModifier(annotation('F'), 0), + staveNote({ keys: ['a/4'], duration: 'w' }).addModifier(annotation('A'), 0), + staveNote({ keys: ['c/5'], duration: 'w' }).addModifier(annotation('C'), 0), + staveNote({ keys: ['e/5'], duration: 'w' }).addModifier(annotation('E'), 0), + ]; + _src_formatter__WEBPACK_IMPORTED_MODULE_7__.Formatter.FormatAndDraw(ctx, stave, notes); + ok(true, 'Bottom Annotation'); +} +function bottomWithBeam(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 500, 240); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_10__.Stave(10, 10, 300).addClef('treble').setContext(ctx).draw(); + const notes = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_11__.StaveNote({ keys: ['a/3'], duration: '8' }).addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation('good').setVerticalJustification(_src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation.VerticalJustify.BOTTOM)), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_11__.StaveNote({ keys: ['g/3'], duration: '8' }).addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation('even').setVerticalJustification(_src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation.VerticalJustify.BOTTOM)), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_11__.StaveNote({ keys: ['c/4'], duration: '8' }).addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation('under').setVerticalJustification(_src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation.VerticalJustify.BOTTOM)), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_11__.StaveNote({ keys: ['d/4'], duration: '8' }).addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation('beam').setVerticalJustification(_src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation.VerticalJustify.BOTTOM)), + ]; + const beam = new _src_beam__WEBPACK_IMPORTED_MODULE_3__.Beam(notes.slice(1)); + _src_formatter__WEBPACK_IMPORTED_MODULE_7__.Formatter.FormatAndDraw(ctx, stave, notes); + beam.setContext(ctx).draw(); + ok(true, 'Bottom Annotation with Beams'); +} +function justificationStemUp(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 650, 950); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + const annotation = (text, hJustification, vJustification) => new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation(text) + .setFont(_src_font__WEBPACK_IMPORTED_MODULE_6__.Font.SANS_SERIF, FONT_SIZE) + .setJustification(hJustification) + .setVerticalJustification(vJustification); + for (let v = 1; v <= 4; ++v) { + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_10__.Stave(10, (v - 1) * 150 + 40, 400).addClef('treble').setContext(ctx).draw(); + const notes = [ + staveNote({ keys: ['c/3'], duration: 'q' }).addModifier(annotation('Text', 1, v), 0), + staveNote({ keys: ['c/4'], duration: 'q' }).addModifier(annotation('Text', 2, v), 0), + staveNote({ keys: ['c/5'], duration: 'q' }).addModifier(annotation('Text', 3, v), 0), + staveNote({ keys: ['c/6'], duration: 'q' }).addModifier(annotation('Text', 4, v), 0), + ]; + _src_formatter__WEBPACK_IMPORTED_MODULE_7__.Formatter.FormatAndDraw(ctx, stave, notes); + } + ok(true, 'Test Justification Annotation'); +} +function justificationStemDown(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 650, 1000); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + const annotation = (text, hJustification, vJustification) => new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation(text) + .setFont(_src_font__WEBPACK_IMPORTED_MODULE_6__.Font.SANS_SERIF, FONT_SIZE) + .setJustification(hJustification) + .setVerticalJustification(vJustification); + for (let v = 1; v <= 4; ++v) { + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_10__.Stave(10, (v - 1) * 150 + 40, 400).addClef('treble').setContext(ctx).draw(); + const notes = [ + staveNote({ keys: ['c/3'], duration: 'q', stem_direction: -1 }).addModifier(annotation('Text', 1, v), 0), + staveNote({ keys: ['c/4'], duration: 'q', stem_direction: -1 }).addModifier(annotation('Text', 2, v), 0), + staveNote({ keys: ['c/5'], duration: 'q', stem_direction: -1 }).addModifier(annotation('Text', 3, v), 0), + staveNote({ keys: ['c/6'], duration: 'q', stem_direction: -1 }).addModifier(annotation('Text', 4, v), 0), + ]; + _src_formatter__WEBPACK_IMPORTED_MODULE_7__.Formatter.FormatAndDraw(ctx, stave, notes); + } + ok(true, 'Test Justification Annotation'); +} +function tabNotes(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 600, 200); + ctx.font = '10pt Arial, sans-serif'; + const stave = new _src_tabstave__WEBPACK_IMPORTED_MODULE_14__.TabStave(10, 10, 550); + stave.setContext(ctx); + stave.draw(); + const specs = [ + { + positions: [ + { str: 3, fret: 6 }, + { str: 4, fret: 25 }, + ], + duration: '8', + }, + { + positions: [ + { str: 2, fret: 10 }, + { str: 5, fret: 12 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 3, fret: 5 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 3, fret: 5 }, + ], + duration: '8', + }, + ]; + const notes1 = specs.map((noteSpec) => { + const note = new _src_tabnote__WEBPACK_IMPORTED_MODULE_13__.TabNote(noteSpec); + note.render_options.draw_stem = true; + return note; + }); + const notes2 = specs.map((noteSpec) => { + const note = new _src_tabnote__WEBPACK_IMPORTED_MODULE_13__.TabNote(noteSpec); + note.render_options.draw_stem = true; + note.setStemDirection(-1); + return note; + }); + const notes3 = specs.map((noteSpec) => new _src_tabnote__WEBPACK_IMPORTED_MODULE_13__.TabNote(noteSpec)); + notes1[0].addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation('Text').setJustification(1).setVerticalJustification(1)); // U + notes1[1].addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation('Text').setJustification(2).setVerticalJustification(2)); // D + notes1[2].addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation('Text').setJustification(3).setVerticalJustification(3)); // U + notes1[3].addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation('Text').setJustification(4).setVerticalJustification(4)); // D + notes2[0].addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation('Text').setJustification(3).setVerticalJustification(1)); // U + notes2[1].addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation('Text').setJustification(3).setVerticalJustification(2)); // D + notes2[2].addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation('Text').setJustification(3).setVerticalJustification(3)); // U + notes2[3].addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation('Text').setJustification(3).setVerticalJustification(4)); // D + notes3[0].addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation('Text').setVerticalJustification(1)); // U + notes3[1].addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation('Text').setVerticalJustification(2)); // D + notes3[2].addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation('Text').setVerticalJustification(3)); // U + notes3[3].addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation('Text').setVerticalJustification(4)); // D + const voice = new _src_voice__WEBPACK_IMPORTED_MODULE_16__.Voice(_src_flow__WEBPACK_IMPORTED_MODULE_5__.Flow.TIME4_4).setMode(_src_voice__WEBPACK_IMPORTED_MODULE_16__.Voice.Mode.SOFT); + voice.addTickables(notes1); + voice.addTickables(notes2); + voice.addTickables(notes3); + // Alternatively, you could add all the notes in one big array with spread syntax. + // voice.addTickables([...notes1, ...notes2, ...notes3]); + new _src_formatter__WEBPACK_IMPORTED_MODULE_7__.Formatter().joinVoices([voice]).formatToStave([voice], stave, { stave }); + voice.draw(ctx, stave); + ok(true, 'TabNotes successfully drawn'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(AnnotationTests); + + + +/***/ }), + +/***/ "./tests/articulation_tests.ts": +/*!*************************************!*\ + !*** ./tests/articulation_tests.ts ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ArticulationTests": () => (/* binding */ ArticulationTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_articulation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/articulation */ "./src/articulation.ts"); +/* harmony import */ var _src_beam__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/beam */ "./src/beam.ts"); +/* harmony import */ var _src_flow__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/flow */ "./src/flow.ts"); +/* harmony import */ var _src_font__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/font */ "./src/font.ts"); +/* harmony import */ var _src_formatter__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/formatter */ "./src/formatter.ts"); +/* harmony import */ var _src_modifier__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/modifier */ "./src/modifier.ts"); +/* harmony import */ var _src_stave__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/stave */ "./src/stave.ts"); +/* harmony import */ var _src_stavebarline__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/stavebarline */ "./src/stavebarline.ts"); +/* harmony import */ var _src_stavenote__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/stavenote */ "./src/stavenote.ts"); +/* harmony import */ var _src_stem__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/stem */ "./src/stem.ts"); +/* harmony import */ var _src_tabnote__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/tabnote */ "./src/tabnote.ts"); +/* harmony import */ var _src_tabstave__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../src/tabstave */ "./src/tabstave.ts"); +/* harmony import */ var _src_voice__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../src/voice */ "./src/voice.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Articulation Tests + + + + + + + + + + + + + + +const ArticulationTests = { + Start() { + QUnit.module('Articulation'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Articulation - Vertical Placement', verticalPlacement); + run('Articulation - Staccato/Staccatissimo', drawArticulations, { sym1: 'a.', sym2: 'av' }); + run('Articulation - Accent/Tenuto', drawArticulations, { sym1: 'a>', sym2: 'a-' }); + run('Articulation - Marcato/L.H. Pizzicato', drawArticulations, { sym1: 'a^', sym2: 'a+' }); + run('Articulation - Snap Pizzicato/Fermata', drawArticulations, { sym1: 'ao', sym2: 'ao' }); + run('Articulation - Up-stroke/Down-Stroke', drawArticulations, { sym1: 'a|', sym2: 'am' }); + run('Articulation - Fermata Above/Below', drawFermata, { sym1: 'a@a', sym2: 'a@u' }); + run('Articulation - Inline/Multiple', drawArticulations2, { sym1: 'a.', sym2: 'a.' }); + run('TabNote Articulation', tabNotes, { sym1: 'a.', sym2: 'a.' }); + }, +}; +// Helper function for creating StaveNotes. +function drawArticulations(options) { + const sym1 = options.params.sym1; + const sym2 = options.params.sym2; + const width = 125 - _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave.defaultPadding; + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 675, 195); + const ctx = f.getContext(); + expect(0); + let x = 10; + const y = 30; + const score = f.EasyScore(); + const formatAndDrawToWidth = (x, y, width, notes, barline) => { + const voices = [score.voice(notes, { time: '4/4' })]; + const formatter = f.Formatter(); + voices.forEach((v) => formatter.joinVoices([v])); + const nwidth = Math.max(formatter.preCalculateMinTotalWidth(voices), width); + formatter.format(voices, nwidth); + const stave = f + .Stave({ x, y, width: nwidth + _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave.defaultPadding }) + .setEndBarType(barline) + .setContext(ctx) + .draw(); + voices.forEach((voice) => voice.draw(ctx, stave)); + return stave.getWidth(); + }; + // bar 1 + const notesBar1 = [ + f.StaveNote({ keys: ['a/3'], duration: 'q', stem_direction: 1 }), + f.StaveNote({ keys: ['a/4'], duration: 'q', stem_direction: 1 }), + f.StaveNote({ keys: ['c/4'], duration: 'q', stem_direction: 1 }), + f.StaveNote({ keys: ['a/4'], duration: 'q', stem_direction: 1 }), + ]; + notesBar1[0].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation(sym1).setPosition(4), 0); + notesBar1[1].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation(sym1).setPosition(4), 0); + notesBar1[2].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation(sym1).setPosition(3), 0); + notesBar1[3].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation(sym1).setPosition(3), 0); + // Helper function to justify and draw a 4/4 voice + x += formatAndDrawToWidth(x, y, width, notesBar1, _src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.Barline.type.NONE); + // bar 2 - juxtaposing second bar next to first bar + const notesBar2 = [ + f.StaveNote({ keys: ['c/5'], duration: 'q', stem_direction: -1 }), + f.StaveNote({ keys: ['a/5'], duration: 'q', stem_direction: -1 }), + f.StaveNote({ keys: ['c/5'], duration: 'q', stem_direction: -1 }), + f.StaveNote({ keys: ['a/5'], duration: 'q', stem_direction: -1 }), + ]; + notesBar2[0].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation(sym1).setPosition(3), 0); + notesBar2[1].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation(sym1).setPosition(3), 0); + notesBar2[2].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation(sym1).setPosition(4), 0); + notesBar2[3].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation(sym1).setPosition(4), 0); + // Helper function to justify and draw a 4/4 voice + x += formatAndDrawToWidth(x, y, width, notesBar2, _src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.Barline.type.DOUBLE); + // bar 3 - juxtaposing second bar next to first bar + const notesBar3 = [ + f.StaveNote({ keys: ['c/4'], duration: 'q', stem_direction: 1 }), + f.StaveNote({ keys: ['c/5'], duration: 'q', stem_direction: 1 }), + f.StaveNote({ keys: ['c/4'], duration: 'q', stem_direction: 1 }), + f.StaveNote({ keys: ['a/4'], duration: 'q', stem_direction: 1 }), + ]; + notesBar3[0].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation(sym2).setPosition(4), 0); + notesBar3[1].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation(sym2).setPosition(4), 0); + notesBar3[2].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation(sym2).setPosition(3), 0); + notesBar3[3].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation(sym2).setPosition(3), 0); + // Helper function to justify and draw a 4/4 voice + x += formatAndDrawToWidth(x, y, width, notesBar3, _src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.Barline.type.NONE); + // bar 4 - juxtaposing second bar next to first bar + const notesBar4 = [ + f.StaveNote({ keys: ['a/4'], duration: 'q', stem_direction: -1 }), + f.StaveNote({ keys: ['a/5'], duration: 'q', stem_direction: -1 }), + f.StaveNote({ keys: ['c/5'], duration: 'q', stem_direction: -1 }), + f.StaveNote({ keys: ['a/5'], duration: 'q', stem_direction: -1 }), + ]; + notesBar4[0].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation(sym2).setPosition(3), 0); + notesBar4[1].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation(sym2).setPosition(3), 0); + notesBar4[2].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation(sym2).setPosition(4), 0); + notesBar4[3].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation(sym2).setPosition(4), 0); + // Helper function to justify and draw a 4/4 voice + formatAndDrawToWidth(x, y, width, notesBar4, _src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.Barline.type.END); +} +function drawFermata(options) { + const sym1 = options.params.sym1; + const sym2 = options.params.sym2; + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 400, 195); + const ctx = f.getContext(); + const score = f.EasyScore(); + const width = 150 - _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave.defaultPadding; + let x = 50; + const y = 30; + const formatAndDrawToWidth = (x, y, width, notes, barline) => { + const voices = [score.voice(notes, { time: '4/4' })]; + const formatter = f.Formatter(); + voices.forEach((v) => formatter.joinVoices([v])); + const nwidth = Math.max(formatter.preCalculateMinTotalWidth(voices), width); + formatter.format(voices, nwidth); + const stave = f + .Stave({ x, y, width: nwidth + _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave.defaultPadding }) + .setEndBarType(barline) + .setContext(ctx) + .draw(); + voices.forEach((voice) => voice.draw(ctx, stave)); + return stave.getWidth(); + }; + expect(0); + const notesBar1 = [ + f.StaveNote({ keys: ['c/4'], duration: 'q', stem_direction: 1 }), + f.StaveNote({ keys: ['a/4'], duration: 'q', stem_direction: 1 }), + f.StaveNote({ keys: ['c/4'], duration: 'q', stem_direction: -1 }), + f.StaveNote({ keys: ['a/4'], duration: 'q', stem_direction: -1 }), + ]; + notesBar1[0].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation(sym1).setPosition(3), 0); + notesBar1[1].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation(sym1).setPosition(3), 0); + notesBar1[2].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation(sym2).setPosition(4), 0); + notesBar1[3].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation(sym2).setPosition(4), 0); + x += formatAndDrawToWidth(x, y, width, notesBar1, _src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.Barline.type.NONE); + // bar 2 - juxtaposing second bar next to first bar + const notesBar2 = [ + f.StaveNote({ keys: ['c/5'], duration: 'q', stem_direction: 1 }), + f.StaveNote({ keys: ['a/5'], duration: 'q', stem_direction: 1 }), + f.StaveNote({ keys: ['c/5'], duration: 'q', stem_direction: -1 }), + f.StaveNote({ keys: ['a/5'], duration: 'q', stem_direction: -1 }), + ]; + notesBar2[0].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation(sym1).setPosition(3), 0); + notesBar2[1].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation(sym1).setPosition(3), 0); + notesBar2[2].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation(sym2).setPosition(4), 0); + notesBar2[3].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation(sym2).setPosition(4), 0); + // Helper function to justify and draw a 4/4 voice + formatAndDrawToWidth(x, y, width, notesBar2, _src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.Barline.type.DOUBLE); +} +function verticalPlacement(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 750, 300); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + const staveNote = (noteStruct) => new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote(noteStruct); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(10, 50, 750).addClef('treble').setContext(ctx).draw(); + const notes = [ + staveNote({ keys: ['f/4'], duration: 'q' }) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a@u').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.BELOW), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a.').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.BELOW), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a-').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.BELOW), 0), + staveNote({ keys: ['g/4'], duration: 'q', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_10__.Stem.DOWN }) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a@u').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.BELOW), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a.').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.BELOW), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a-').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.BELOW), 0), + staveNote({ keys: ['c/5'], duration: 'q' }) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a@u').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.BELOW), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a.').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.BELOW), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a-').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.BELOW), 0), + staveNote({ keys: ['f/4'], duration: 'q' }) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a.').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.BELOW), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a-').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.BELOW), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a@u').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.BELOW), 0), + staveNote({ keys: ['g/4'], duration: 'q', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_10__.Stem.DOWN }) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a.').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.BELOW), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a-').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.BELOW), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a@u').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.BELOW), 0), + staveNote({ keys: ['c/5'], duration: 'q' }) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a.').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.BELOW), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a-').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.BELOW), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a@u').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.BELOW), 0), + staveNote({ keys: ['a/5'], duration: 'q', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_10__.Stem.DOWN }) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a@a').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.ABOVE), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a.').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.ABOVE), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a-').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.ABOVE), 0), + staveNote({ keys: ['f/5'], duration: 'q' }) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a@a').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.ABOVE), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a.').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.ABOVE), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a-').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.ABOVE), 0), + staveNote({ keys: ['b/4'], duration: 'q', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_10__.Stem.DOWN }) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a@a').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.ABOVE), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a.').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.ABOVE), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a-').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.ABOVE), 0), + staveNote({ keys: ['a/5'], duration: 'q', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_10__.Stem.DOWN }) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a.').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.ABOVE), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a-').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.ABOVE), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a@a').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.ABOVE), 0), + staveNote({ keys: ['f/5'], duration: 'q' }) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a.').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.ABOVE), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a-').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.ABOVE), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a@a').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.ABOVE), 0), + staveNote({ keys: ['b/4'], duration: 'q', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_10__.Stem.DOWN }) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a.').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.ABOVE), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a-').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.ABOVE), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a@a').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_6__.ModifierPosition.ABOVE), 0), + ]; + _src_formatter__WEBPACK_IMPORTED_MODULE_5__.Formatter.FormatAndDraw(ctx, stave, notes); + ok(true, ' Annotation Placement'); +} +function drawArticulations2(options) { + expect(0); + const scale = 0.8; + let x = 10; + const y = 30; + const width = 350 - _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave.defaultPadding; + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 1000, 195); + const ctx = f.getContext(); + ctx.scale(scale, scale); + const score = f.EasyScore(); + const formatAndDrawToWidth = (x, y, width, notes, barline, beams) => { + const voices = [score.voice(notes, { time: '4/4' })]; + const formatter = f.Formatter(); + voices.forEach((v) => formatter.joinVoices([v])); + const nwidth = Math.max(formatter.preCalculateMinTotalWidth(voices), width); + formatter.format(voices, nwidth); + const stave = f + .Stave({ x: x, y: y, width: nwidth + _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave.defaultPadding }) + .setEndBarType(barline) + .setContext(ctx) + .draw(); + voices.forEach((voice) => voice.draw(ctx, stave)); + beams.forEach((beam) => beam.setContext(ctx).draw()); + return stave.getWidth(); + }; + // Get the rendering context + // bar 1 + const notesBar1 = [ + f.StaveNote({ keys: ['c/4'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['d/4'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['e/4'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['f/4'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['g/4'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['a/4'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['b/4'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['c/5'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['d/5'], duration: '16', stem_direction: -1 }), + f.StaveNote({ keys: ['e/5'], duration: '16', stem_direction: -1 }), + f.StaveNote({ keys: ['f/5'], duration: '16', stem_direction: -1 }), + f.StaveNote({ keys: ['g/5'], duration: '16', stem_direction: -1 }), + f.StaveNote({ keys: ['a/5'], duration: '16', stem_direction: -1 }), + f.StaveNote({ keys: ['b/5'], duration: '16', stem_direction: -1 }), + f.StaveNote({ keys: ['c/6'], duration: '16', stem_direction: -1 }), + f.StaveNote({ keys: ['d/6'], duration: '16', stem_direction: -1 }), + ]; + let i; + for (i = 0; i < 16; i++) { + notesBar1[i].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a.').setPosition(4), 0); + notesBar1[i].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a>').setPosition(4), 0); + if (i === 15) { + notesBar1[i].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a@u').setPosition(4), 0); + } + } + const beam1 = new _src_beam__WEBPACK_IMPORTED_MODULE_2__.Beam(notesBar1.slice(0, 8)); + const beam2 = new _src_beam__WEBPACK_IMPORTED_MODULE_2__.Beam(notesBar1.slice(8, 16)); + x += formatAndDrawToWidth(x, y, width, notesBar1, _src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.Barline.type.NONE, [beam1, beam2]); + // Helper function to justify and draw a 4/4 voice + beam1.setContext(ctx).draw(); + beam2.setContext(ctx).draw(); + // bar 2 - juxtaposing second bar next to first bar + const notesBar2 = [ + f.StaveNote({ keys: ['f/3'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['g/3'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['a/3'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['b/3'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['c/4'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['d/4'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['e/4'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['f/4'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['g/4'], duration: '16', stem_direction: -1 }), + f.StaveNote({ keys: ['a/4'], duration: '16', stem_direction: -1 }), + f.StaveNote({ keys: ['b/4'], duration: '16', stem_direction: -1 }), + f.StaveNote({ keys: ['c/5'], duration: '16', stem_direction: -1 }), + f.StaveNote({ keys: ['d/5'], duration: '16', stem_direction: -1 }), + f.StaveNote({ keys: ['e/5'], duration: '16', stem_direction: -1 }), + f.StaveNote({ keys: ['f/5'], duration: '16', stem_direction: -1 }), + f.StaveNote({ keys: ['g/5'], duration: '16', stem_direction: -1 }), + ]; + for (i = 0; i < 16; i++) { + notesBar2[i].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a-').setPosition(3), 0); + notesBar2[i].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a^').setPosition(3), 0); + if (i === 15) { + notesBar2[i].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a@u').setPosition(4), 0); + } + } + const beam3 = new _src_beam__WEBPACK_IMPORTED_MODULE_2__.Beam(notesBar2.slice(0, 8)); + const beam4 = new _src_beam__WEBPACK_IMPORTED_MODULE_2__.Beam(notesBar2.slice(8, 16)); + x += formatAndDrawToWidth(x, y, width, notesBar2, _src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.Barline.type.NONE, [beam3, beam4]); + // bar 3 - juxtaposing second bar next to first bar + const notesBar3 = [f.StaveNote({ keys: ['c/4'], duration: 'w', stem_direction: 1 })]; + notesBar3[0].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a-').setPosition(3), 0); + notesBar3[0].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a>').setPosition(3), 0); + notesBar3[0].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a@a').setPosition(3), 0); + // Helper function to justify and draw a 4/4 voice + x += formatAndDrawToWidth(x, y, width, notesBar3, _src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.Barline.type.NONE, []); + // bar 4 - juxtaposing second bar next to first bar + const notesBar4 = [ + f.StaveNote({ keys: ['c/5'], duration: 'q', stem_direction: -1 }), + f.StaveNote({ keys: ['a/5'], duration: 'q', stem_direction: -1 }), + f.StaveNote({ keys: ['c/5'], duration: 'q', stem_direction: -1 }), + f.StaveNote({ keys: ['a/5'], duration: 'q', stem_direction: -1 }), + ]; + for (i = 0; i < 4; i++) { + let position1 = 3; + if (i > 1) { + position1 = 4; + } + notesBar4[i].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a-').setPosition(position1), 0); + } + // Helper function to justify and draw a 4/4 voice + formatAndDrawToWidth(x, y, width, notesBar4, _src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.Barline.type.END, []); +} +function tabNotes(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 600, 200); + ctx.font = '10pt ' + _src_font__WEBPACK_IMPORTED_MODULE_4__.Font.SANS_SERIF; + const stave = new _src_tabstave__WEBPACK_IMPORTED_MODULE_12__.TabStave(10, 10, 550); + stave.setContext(ctx); + stave.draw(); + const specs = [ + { + positions: [ + { str: 3, fret: 6 }, + { str: 4, fret: 25 }, + ], + duration: '8', + }, + { + positions: [ + { str: 2, fret: 10 }, + { str: 5, fret: 12 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 3, fret: 5 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 3, fret: 5 }, + ], + duration: '8', + }, + ]; + const notes1 = specs.map((noteSpec) => { + const tabNote = new _src_tabnote__WEBPACK_IMPORTED_MODULE_11__.TabNote(noteSpec); + tabNote.render_options.draw_stem = true; + return tabNote; + }); + const notes2 = specs.map((noteSpec) => { + const tabNote = new _src_tabnote__WEBPACK_IMPORTED_MODULE_11__.TabNote(noteSpec); + tabNote.render_options.draw_stem = true; + tabNote.setStemDirection(-1); + return tabNote; + }); + const notes3 = specs.map((noteSpec) => new _src_tabnote__WEBPACK_IMPORTED_MODULE_11__.TabNote(noteSpec)); + notes1[0].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a>').setPosition(3), 0); // U + notes1[1].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a>').setPosition(4), 0); // D + notes1[2].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a.').setPosition(3), 0); // U + notes1[3].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a.').setPosition(4), 0); // D + notes2[0].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a>').setPosition(3), 0); + notes2[1].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a>').setPosition(4), 0); + notes2[2].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a.').setPosition(3), 0); + notes2[3].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a.').setPosition(4), 0); + notes3[0].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a>').setPosition(3), 0); + notes3[1].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a>').setPosition(4), 0); + notes3[2].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a.').setPosition(3), 0); + notes3[3].addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation('a.').setPosition(4), 0); + const voice = new _src_voice__WEBPACK_IMPORTED_MODULE_13__.Voice(_src_flow__WEBPACK_IMPORTED_MODULE_3__.Flow.TIME4_4).setMode(_src_voice__WEBPACK_IMPORTED_MODULE_13__.Voice.Mode.SOFT); + voice.addTickables(notes1); + voice.addTickables(notes2); + voice.addTickables(notes3); + new _src_formatter__WEBPACK_IMPORTED_MODULE_5__.Formatter().joinVoices([voice]).formatToStave([voice], stave); + voice.draw(ctx, stave); + ok(true, 'TabNotes successfully drawn'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(ArticulationTests); + + + +/***/ }), + +/***/ "./tests/auto_beam_formatting_tests.ts": +/*!*********************************************!*\ + !*** ./tests/auto_beam_formatting_tests.ts ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "AutoBeamFormattingTests": () => (/* binding */ AutoBeamFormattingTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_beam__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/beam */ "./src/beam.ts"); +/* harmony import */ var _src_fraction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/fraction */ "./src/fraction.ts"); +/* harmony import */ var _src_stem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/stem */ "./src/stem.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Auto Beaming Tests +// TODO: Beam.generateBeams(voice.getTickables() as StemmableNote[], ...) requires a cast to StemmableNote[]. +// Is there a cleaner way to handle this? + + + + +const AutoBeamFormattingTests = { + Start() { + QUnit.module('Auto-Beaming'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Simple Auto Beaming', simpleAuto); + run('Auto Beaming With Overflow Group', simpleAutoWithOverflowGroup); + run('Even Group Stem Directions', evenGroupStemDirections); + run('Odd Group Stem Directions', oddGroupStemDirections); + run('Odd Beam Groups Auto Beaming', oddBeamGroups); + run('More Simple Auto Beaming 0', moreSimple0); + run('More Simple Auto Beaming 1', moreSimple1); + run('Beam Across All Rests', beamAcrossAllRests); + run('Beam Across All Rests with Stemlets', beamAcrossAllRestsWithStemlets); + run('Break Beams on Middle Rests Only', beamAcrossMiddleRests); + run('Break Beams on Rest', breakBeamsOnRests); + run('Maintain Stem Directions', maintainStemDirections); + run('Maintain Stem Directions - Beam Over Rests', maintainStemDirectionsBeamAcrossRests); + run('Beat group with unbeamable note - 2/2', groupWithUnbeamableNote); + run('Offset beat grouping - 6/8 ', groupWithUnbeamableNote1); + run('Odd Time - Guessing Default Beam Groups', autoOddBeamGroups); + run('Custom Beam Groups', customBeamGroups); + run('Simple Tuplet Auto Beaming', simpleTuplets); + run('More Simple Tuplet Auto Beaming', moreSimpleTuplets); + run('More Automatic Beaming', moreBeaming); + run('Automatic Beaming 4/4 with 3, 3, 2 Pattern', beamingWithSeveralGroups1); + run('Automatic Beaming 4/4 with 3, 3, 2 Pattern and Overflow', beamingWithSeveralGroupsOverflow); + run('Automatic Beaming 8/4 with 3, 2, 3 Pattern and 2 Overflows', beamingWithSeveralGroupsOverflow2); + run('Automatic Beaming 8/4 with 3, 2, 3 Pattern and 3 Overflows', beamingWithSeveralGroupsOverflow3); + run('Duration-Based Secondary Beam Breaks', secondaryBreaks1); + run('Duration-Based Secondary Beam Breaks 2', secondaryBreaks2); + run('Flat Beams Up', flatBeamsUp); + run('Flat Beams Down', flatBeamsDown); + run('Flat Beams Mixed Direction', flatBeamsMixed); + run('Flat Beams Up (uniform)', flatBeamsUpUniform); + run('Flat Beams Down (uniform)', flatBeamsDownUniform); + run('Flat Beams Up Bounds', flatBeamsUpBounds); + run('Flat Beams Down Bounds', flatBeamsDownBounds); + }, +}; +function simpleAuto(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('f5/8, e5, d5, c5/16, c5, d5/8, e5, f5, f5/32, f5, f5, f5'), { time: '4/4' }); + // Takes a voice and returns its auto beams. + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.applyAndGetBeams(voice); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beaming Applicator Test'); +} +function simpleAutoWithOverflowGroup(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + // Add a . after a note (e.g., f5/4.) to make it a dotted note. + const voice = score.voice(score.notes('f5/4., e5/8, d5/8, d5/16, c5/16, c5/16, c5/16, f5/16, f5/32, f5/32'), { + time: '4/4', + }); + // Takes a voice and returns its auto beams. + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.applyAndGetBeams(voice); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beaming Applicator Test'); +} +function evenGroupStemDirections(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('a4/8, b4, g4, c5, f4, d5, e4, e5, b4, b4, g4, d5'), { time: '6/4' }); + // Takes a voice and returns its auto beams. + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.applyAndGetBeams(voice); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + equal(beams[0].getStemDirection(), _src_stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP); + equal(beams[1].getStemDirection(), _src_stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP); + equal(beams[2].getStemDirection(), _src_stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP); + equal(beams[3].getStemDirection(), _src_stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP); + equal(beams[4].getStemDirection(), _src_stem__WEBPACK_IMPORTED_MODULE_3__.Stem.DOWN); + equal(beams[5].getStemDirection(), _src_stem__WEBPACK_IMPORTED_MODULE_3__.Stem.DOWN); + ok(true, 'Auto Beaming Applicator Test'); +} +function oddGroupStemDirections(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('g4/8, b4, d5, c5, f4, d5, e4, g5, g4, b4, g4, d5, a4, c5, a4'), { + time: '15/8', + }); + const groups = [new _src_fraction__WEBPACK_IMPORTED_MODULE_2__.Fraction(3, 8)]; + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.applyAndGetBeams(voice, undefined, groups); + equal(beams[0].getStemDirection(), _src_stem__WEBPACK_IMPORTED_MODULE_3__.Stem.DOWN, 'Notes are equidistant from middle line'); + equal(beams[1].getStemDirection(), _src_stem__WEBPACK_IMPORTED_MODULE_3__.Stem.DOWN); + equal(beams[2].getStemDirection(), _src_stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP); + equal(beams[3].getStemDirection(), _src_stem__WEBPACK_IMPORTED_MODULE_3__.Stem.DOWN, 'Notes are equidistant from middle line'); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beaming Applicator Test'); +} +function oddBeamGroups(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('f5, e5, d5, c5, c5, d5, e5, f5, f5, f4, f3, f5/16, f5'), { time: '6/4' }); + const groups = [new _src_fraction__WEBPACK_IMPORTED_MODULE_2__.Fraction(2, 8), new _src_fraction__WEBPACK_IMPORTED_MODULE_2__.Fraction(3, 8), new _src_fraction__WEBPACK_IMPORTED_MODULE_2__.Fraction(1, 8)]; + // Takes a voice and returns its auto beams. + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.applyAndGetBeams(voice, undefined, groups); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function moreSimple0(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('c4/8, g4, c5, g5, a5, c4, d4, a5'), { time: '4/4' }); + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.applyAndGetBeams(voice); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function moreSimple1(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('c5/16, g5, c5, c5/r, c5/r, (c4 e4 g4), d4, a5, c4, g4, c5, b4/r, (c4 e4), b4/r, b4/r, a4'), { time: '4/4' }); + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.applyAndGetBeams(voice); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function breakBeamsOnRests(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('c5/16, g5, c5, c5/r, c5/r, (c4 e4 g4), d4, a5, c4, g4, c5, b4/r, (c4 e4), b4/r, b4/r, a4'), { time: '4/4' }); + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.generateBeams(voice.getTickables(), { + beam_rests: false, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function beamAcrossAllRestsWithStemlets(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('c5/16, g5, c5, c5/r, c5/r, (c4 e4 g4), d4, a5, c4, g4, c5, b4/r, (c4 e4), b4/r, b4/r, a4'), { time: '4/4' }); + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.generateBeams(voice.getTickables(), { + beam_rests: true, + show_stemlets: true, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function beamAcrossAllRests(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('c5/16, g5, c5, c5/r, c5/r, (c4 e4 g4), d4, a5, c4, g4, c5, b4/r, (c4 e4), b4/r, b4/r, a4'), { time: '4/4' }); + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.generateBeams(voice.getTickables(), { + beam_rests: true, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function beamAcrossMiddleRests(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('c5/16, g5, c5, c5/r, c5/r, (c4 e4 g4), d4, a5, c4, g4, c5, b4/r, (c4 e4), b4/r, b4/r, a4'), { time: '4/4' }); + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.generateBeams(voice.getTickables(), { + beam_rests: true, + beam_middle_only: true, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function maintainStemDirections(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 450, 200); + const stave = f.Stave(); + const score = f.EasyScore(); + // EasyScore.notes(line, ...) ignores whitespace in the line string. + const voice = score.voice(score.notes([ + 'b4/16, b4, b4[stem="down"], b4/r', + 'b4/r, b4[stem="down"], b4, b4', + 'b4[stem="down"], b4[stem="down"], b4, b4/r', + 'b4/32, b4[stem="down"], b4[stem="down"], b4, b4/16/r, b4', + ].join(', '), { stem: 'up' }), { time: '4/4' }); + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.generateBeams(voice.getTickables(), { + beam_rests: false, + maintain_stem_directions: true, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function maintainStemDirectionsBeamAcrossRests(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 450, 200); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes([ + 'b4/16, b4, b4[stem="down"], b4/r', + 'b4/r, b4[stem="down"], b4, b4', + 'b4[stem="down"], b4[stem="down"], b4, b4/r', + 'b4/32, b4[stem="down"], b4[stem="down"], b4, b4/16/r, b4', + ].join(', '), { stem: 'up' }), { time: '4/4' }); + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.generateBeams(voice.getTickables(), { + beam_rests: true, + maintain_stem_directions: true, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function groupWithUnbeamableNote(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 450, 200); + const stave = f.Stave().addTimeSignature('2/4'); + const score = f.EasyScore(); + const voice = score.voice(score.notes('b4/16, b4, b4/4, b4/16, b4'), { time: '2/4' }); + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.generateBeams(voice.getTickables(), { + groups: [new _src_fraction__WEBPACK_IMPORTED_MODULE_2__.Fraction(2, 2)], + beam_rests: false, + maintain_stem_directions: true, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function groupWithUnbeamableNote1(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 450, 200); + const stave = f.Stave().addTimeSignature('6/8'); + const score = f.EasyScore(); + const voice = score.voice(score.notes('b4/4, b4/4, b4/8, b4/8'), { time: '6/8' }); + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.generateBeams(voice.getTickables(), { + groups: [new _src_fraction__WEBPACK_IMPORTED_MODULE_2__.Fraction(3, 8)], + beam_rests: false, + maintain_stem_directions: true, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function autoOddBeamGroups(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 450, 400); + const score = f.EasyScore(); + const stave1 = f.Stave({ y: 10 }).addTimeSignature('5/4'); + const voice1 = score.voice(score.notes('c5/8, g5, c5, b4, b4, c4, d4, a5, c4, g4'), { time: '5/4' }); + const stave2 = f.Stave({ y: 150 }).addTimeSignature('5/8'); + const voice2 = score.voice(score.notes('c5/8, g5, c5, b4, b4'), { time: '5/8' }); + const stave3 = f.Stave({ y: 290 }).addTimeSignature('13/16'); + const voice3 = score.voice(score.notes('c5/16, g5, c5, b4, b4, c5, g5, c5, b4, b4, c5, b4, b4'), { + time: '13/16', + }); + // Flatten the arrays into a single Beam[]. + const beams = [ + ..._src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.applyAndGetBeams(voice1, undefined, _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.getDefaultBeamGroups('5/4')), + ..._src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.applyAndGetBeams(voice2, undefined, _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.getDefaultBeamGroups('5/8')), + ..._src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.applyAndGetBeams(voice3, undefined, _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.getDefaultBeamGroups('13/16')), + ]; + f.Formatter().formatToStave([voice1], stave1).formatToStave([voice2], stave2).formatToStave([voice3], stave3); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function customBeamGroups(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 450, 400); + const score = f.EasyScore(); + const stave1 = f.Stave({ y: 10 }).addTimeSignature('5/4'); + const voice1 = score.voice(score.notes('c5/8, g5, c5, b4, b4, c4, d4, a5, c4, g4'), { time: '5/4' }); + const stave2 = f.Stave({ y: 150 }).addTimeSignature('5/8'); + const voice2 = score.voice(score.notes('c5/8, g5, c5, b4, b4'), { time: '5/8' }); + const stave3 = f.Stave({ y: 290 }).addTimeSignature('13/16'); + const voice3 = score.voice(score.notes('c5/16, g5, c5, b4, b4, c5, g5, c5, b4, b4, c5, b4, b4'), { time: '13/16' }); + const group1 = [new _src_fraction__WEBPACK_IMPORTED_MODULE_2__.Fraction(5, 8)]; + const group2 = [new _src_fraction__WEBPACK_IMPORTED_MODULE_2__.Fraction(3, 8), new _src_fraction__WEBPACK_IMPORTED_MODULE_2__.Fraction(2, 8)]; + const group3 = [new _src_fraction__WEBPACK_IMPORTED_MODULE_2__.Fraction(7, 16), new _src_fraction__WEBPACK_IMPORTED_MODULE_2__.Fraction(2, 16), new _src_fraction__WEBPACK_IMPORTED_MODULE_2__.Fraction(4, 16)]; + // Flatten the three Beam[] into a single Beam[]. + // Alternatively, you can use .reduce(concat) flatten arrays, where concat is defined as (a, b) => a.concat(b). + const beams = [ + ..._src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.applyAndGetBeams(voice1, undefined, group1), + ..._src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.applyAndGetBeams(voice2, undefined, group2), + ..._src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.applyAndGetBeams(voice3, undefined, group3), + ]; + f.Formatter().formatToStave([voice1], stave1).formatToStave([voice2], stave2).formatToStave([voice3], stave3); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +/** + * Helper function which uses Function.prototype.bind() to create shortcut methods. + * This can improve the readability of large blocks of EasyScore code. + */ +function createShortcuts(score) { + return { + notes: score.notes.bind(score), + tuplet: score.tuplet.bind(score), + }; +} +function simpleTuplets(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const { notes, tuplet } = createShortcuts(score); + const voice = score.voice([ + ...tuplet(notes('c4/8, g4, c5')), + ...notes('g5/8, a5'), + ...tuplet(notes('a5/16, (c5 e5), a5, d5, a5'), { ratioed: false, notes_occupied: 4 }), + ], { time: '3/4' }); + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.applyAndGetBeams(voice); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function moreSimpleTuplets(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const { notes, tuplet } = createShortcuts(score); + const voice = score.voice([...tuplet(notes('d4/4, g4, c5')), ...notes('g5/16, a5, a5, (c5 e5)')], { time: '3/4' }); + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.applyAndGetBeams(voice); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function moreBeaming(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('c4/8, g4/4, c5/8., g5/16, a5/4, a5/16, (c5 e5)/16, a5/8'), { time: '9/8' }); + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.applyAndGetBeams(voice, undefined, _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.getDefaultBeamGroups('9/8')); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function beamingWithSeveralGroups1(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('c4/8, g4/4, c5/8, g5, a5, a5, f5'), { time: '4/4' }); + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.applyAndGetBeams(voice, undefined, [new _src_fraction__WEBPACK_IMPORTED_MODULE_2__.Fraction(3, 8), new _src_fraction__WEBPACK_IMPORTED_MODULE_2__.Fraction(3, 8), new _src_fraction__WEBPACK_IMPORTED_MODULE_2__.Fraction(2, 8)]); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function beamingWithSeveralGroupsOverflow(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('c4/8, g4/4., c5/8, g5, a5, a5'), { time: '4/4' }); + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.applyAndGetBeams(voice, undefined, [new _src_fraction__WEBPACK_IMPORTED_MODULE_2__.Fraction(3, 8), new _src_fraction__WEBPACK_IMPORTED_MODULE_2__.Fraction(3, 8), new _src_fraction__WEBPACK_IMPORTED_MODULE_2__.Fraction(2, 8)]); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function beamingWithSeveralGroupsOverflow2(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('c4/16, g4/2, f4/16, c5/8, a4/16, c4/16, g4/8, b4, c5, g5, f5, e5, c5, a4/4'), { + time: '8/4', + }); + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.applyAndGetBeams(voice, undefined, [new _src_fraction__WEBPACK_IMPORTED_MODULE_2__.Fraction(3, 8), new _src_fraction__WEBPACK_IMPORTED_MODULE_2__.Fraction(2, 8), new _src_fraction__WEBPACK_IMPORTED_MODULE_2__.Fraction(3, 8)]); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function beamingWithSeveralGroupsOverflow3(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('c4/16, g4/1, f4/16, c5/8, g5, f5, e5, c5, a4/4'), { time: '8/4' }); + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.applyAndGetBeams(voice, undefined, [new _src_fraction__WEBPACK_IMPORTED_MODULE_2__.Fraction(3, 8), new _src_fraction__WEBPACK_IMPORTED_MODULE_2__.Fraction(2, 8), new _src_fraction__WEBPACK_IMPORTED_MODULE_2__.Fraction(3, 8)]); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function secondaryBreaks1(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes([ + 'f5/32, f5, f5, f5, f5/16., f5/32', + 'f5/16, f5/8, f5/16', + 'f5/32, f5/16., f5., f5/32', + 'f5/16., f5/32, f5, f5/16.', + ].join(','))); + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.generateBeams(voice.getTickables(), { secondary_breaks: '8' }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Duration-Based Secondary Breaks Test'); +} +function secondaryBreaks2(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const { notes, tuplet } = createShortcuts(score); + const voice = score.voice([ + tuplet(notes('e5/16, f5, f5')), + tuplet(notes('f5/16, f5, c5')), + notes('a4/16., f4/32'), + tuplet(notes('d4/16, d4, d4')), + tuplet(notes('a5/8, (e5 g5), a5')), + tuplet(notes('f5/16, f5, f5')), + tuplet(notes('f5/16, f5, a4')), + ].reduce(_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.concat)); + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.generateBeams(voice.getTickables(), { secondary_breaks: '8' }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Duration-Based Secondary Breaks Test'); +} +function flatBeamsUp(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave({ y: 40 }); + const score = f.EasyScore(); + const { notes, tuplet } = createShortcuts(score); + const voice = score.voice([ + tuplet(notes('c4/8, g4, f5')), + notes('d5/8'), + tuplet(notes('c5/16, (c4 e4 g4), f4')), + notes('d5/8, e5, c4, f5/32, f5, f5, f5'), + ].reduce(_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.concat)); + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.generateBeams(voice.getTickables(), { + flat_beams: true, + stem_direction: 1, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Flat Beams Up Test'); +} +function flatBeamsDown(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 450, 200); + const stave = f.Stave({ y: 40 }); + const score = f.EasyScore(); + const voice = score.voice(score.notes('c5/64, c5, c5, c5, c5, c5, c5, c5, a5/8, g5, (d4 f4 a4)/16, d4, d5/8, e5, g5, a6/32, a6, a6, g4/64, g4')); + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.generateBeams(voice.getTickables(), { + flat_beams: true, + stem_direction: -1, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Flat Beams Down Test'); +} +function flatBeamsMixed(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 450, 200); + const stave = f.Stave({ y: 40 }); + const score = f.EasyScore(); + const voice = score.voice(score.notes('c5/64, d5, e5, c5, f5, c5, a5, c5, a5/8, g5, (d4 f4 a4)/16, d4, d5/8, e5, c4, a4/32, a4, a4, g4/64, g4')); + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.generateBeams(voice.getTickables(), { flat_beams: true }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Flat Beams Mixed Direction Test'); +} +function flatBeamsUpUniform(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave({ y: 40 }); + const score = f.EasyScore(); + const { notes, tuplet } = createShortcuts(score); + const voice = score.voice([ + ...tuplet(notes('c4/8, g4, g5')), + ...notes('d5/8, c5/16, (c4 e4 g4), d5/8, e5, c4, f5/32, f5, f5, f5'), + ]); + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.generateBeams(voice.getTickables(), { + flat_beams: true, + flat_beam_offset: 50, + stem_direction: 1, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Flat Beams Up (uniform) Test'); +} +function flatBeamsDownUniform(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 450, 200); + const stave = f.Stave({ y: 40 }); + const score = f.EasyScore(); + const voice = score.voice(score.notes('c5/64, c5, c5, c5, c5, c5, c5, c5, a5/8, g5, (e4 g4 b4)/16, e5, d5/8, e5/8, g5/8, a6/32, a6, a6, g4/64, g4')); + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.generateBeams(voice.getTickables(), { + flat_beams: true, + flat_beam_offset: 155, + stem_direction: -1, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Flat Beams Down (uniform) Test'); +} +function flatBeamsUpBounds(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave({ y: 40 }); + const score = f.EasyScore(); + const { notes, tuplet } = createShortcuts(score); + const voice = score.voice([ + ...tuplet(notes('c4/8, g4/8, g5/8')), + ...notes('d5/8, c5/16, (c4 e4 g4)/16, d5/8, e5/8, c4/8, f5/32, f5/32, f5/32, f5/32'), + ]); + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.generateBeams(voice.getTickables(), { + flat_beams: true, + flat_beam_offset: 60, + stem_direction: 1, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Flat Beams Up (uniform) Test'); +} +function flatBeamsDownBounds(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 450, 200); + const stave = f.Stave({ y: 40 }); + const score = f.EasyScore(); + const voice = score.voice(score.notes([ + 'g5/8, a6/32, a6/32, a6/32, g4/64, g4/64', + 'c5/64, c5/64, c5/64, c5/64, c5/64, c5/64, c5/64, c5/64, a5/8', + 'g5/8, (e4 g4 b4)/16, e5/16', + 'd5/8, e5/8', + ].join(','), { stem: 'down' })); + const beams = _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.generateBeams(voice.getTickables(), { + flat_beams: true, + flat_beam_offset: 145, + stem_direction: -1, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Flat Beams Down (uniform) Test'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(AutoBeamFormattingTests); + + + +/***/ }), + +/***/ "./tests/bach_tests.ts": +/*!*****************************!*\ + !*** ./tests/bach_tests.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "BachDemoTests": () => (/* binding */ BachDemoTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/index */ "./src/index.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Bach Demo + + +const BachDemoTests = { + Start() { + QUnit.module('Bach Demo'); + _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests('Minuet 1', minuet1); + }, +}; +function minuet1(options) { + const registry = new _src_index__WEBPACK_IMPORTED_MODULE_1__.Registry(); + _src_index__WEBPACK_IMPORTED_MODULE_1__.Registry.enableDefaultRegistry(registry); + // Retrieve the element from the registry and cast to StaveNote, so we can call .addModifier( ) later. + const id = (id) => registry.getElementById(id); + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 1100, 900); + const score = f.EasyScore({ throwOnError: true }); + // Bind these three functions so the code looks cleaner. + // Instead of score.voice(...), just call voice(...). + const voice = score.voice.bind(score); + const notes = score.notes.bind(score); + const beam = score.beam.bind(score); + let x = 120; + let y = 80; + function appendSystem(width) { + const system = f.System({ x, y, width, spaceBetweenStaves: 10 }); + x += width; + return system; + } + score.set({ time: '3/4' }); + /* Measure 1 */ + let system = appendSystem(220); + system + .addStave({ + voices: [ + voice([notes('D5/q[id="m1a"]'), beam(notes('G4/8, A4, B4, C5', { stem: 'up' }))].reduce(_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.concat)), + voice([f.TextDynamics({ text: 'p', duration: 'h', dots: 1, line: 9 })]), + ], + }) + .addClef('treble') + .addKeySignature('G') + .addTimeSignature('3/4') + .setTempo({ name: 'Allegretto', duration: 'h', dots: 1, bpm: 66 }, -30); + system + .addStave({ voices: [voice(notes('(G3 B3 D4)/h, A3/q', { clef: 'bass' }))] }) + .addClef('bass') + .addKeySignature('G') + .addTimeSignature('3/4'); + system.addConnector('brace'); + system.addConnector('singleRight'); + system.addConnector('singleLeft'); + id('m1a').addModifier(f.Fingering({ number: '5' }), 0); + /* Measure 2 */ + system = appendSystem(150); + system.addStave({ voices: [voice(notes('D5/q[id="m2a"], G4[id="m2b"], G4[id="m2c"]'))] }); + system.addStave({ voices: [voice(notes('B3/h.', { clef: 'bass' }))] }); + system.addConnector('singleRight'); + id('m2a').addModifier(f.Articulation({ type: 'a.', position: 'above' }), 0); + id('m2b').addModifier(f.Articulation({ type: 'a.', position: 'below' }), 0); + id('m2c').addModifier(f.Articulation({ type: 'a.', position: 'below' }), 0); + f.Curve({ + from: id('m1a'), + to: id('m2a'), + options: { + cps: [ + { x: 0, y: 40 }, + { x: 0, y: 40 }, + ], + }, + }); + /* Measure 3 */ + system = appendSystem(150); + system.addStave({ + voices: [voice([notes('E5/q[id="m3a"]'), beam(notes('C5/8, D5, E5, F5', { stem: 'down' }))].reduce(_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.concat))], + }); + id('m3a').addModifier(f.Fingering({ number: '3', position: 'above' }), 0); + system.addStave({ voices: [voice(notes('C4/h.', { clef: 'bass' }))] }); + system.addConnector('singleRight'); + /* Measure 4 */ + system = appendSystem(150); + system.addStave({ voices: [voice(notes('G5/q[id="m4a"], G4[id="m4b"], G4[id="m4c"]'))] }); + system.addStave({ voices: [voice(notes('B3/h.', { clef: 'bass' }))] }); + system.addConnector('singleRight'); + id('m4a').addModifier(f.Articulation({ type: 'a.', position: 'above' }), 0); + id('m4b').addModifier(f.Articulation({ type: 'a.', position: 'below' }), 0); + id('m4c').addModifier(f.Articulation({ type: 'a.', position: 'below' }), 0); + f.Curve({ + from: id('m3a'), + to: id('m4a'), + options: { + cps: [ + { x: 0, y: 20 }, + { x: 0, y: 20 }, + ], + }, + }); + /* Measure 5 */ + system = appendSystem(150); + system.addStave({ + voices: [voice([notes('C5/q[id="m5a"]'), beam(notes('D5/8, C5, B4, A4', { stem: 'down' }))].reduce(_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.concat))], + }); + id('m5a').addModifier(f.Fingering({ number: '4', position: 'above' }), 0); + system.addStave({ voices: [voice(notes('A3/h.', { clef: 'bass' }))] }); + system.addConnector('singleRight'); + /* Measure 6 */ + system = appendSystem(150); + system.addStave({ + voices: [voice([notes('B4/q'), beam(notes('C5/8, B4, A4, G4[id="m6a"]', { stem: 'up' }))].reduce(_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.concat))], + }); + system.addStave({ voices: [voice(notes('G3/h.', { clef: 'bass' }))] }); + system.addConnector('singleRight'); + f.Curve({ + from: id('m5a'), + to: id('m6a'), + options: { + cps: [ + { x: 0, y: 20 }, + { x: 0, y: 20 }, + ], + invert: true, + position_end: 'nearTop', + y_shift: 20, + }, + }); + /* Measure 7 (New system) */ + x = 20; + y += 230; + system = appendSystem(220); + system + .addStave({ + voices: [ + voice([notes('F4/q[id="m7a"]'), beam(notes('G4/8[id="m7b"], A4, B4, G4', { stem: 'up' }))].reduce(_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.concat)), + ], + }) + .addClef('treble') + .addKeySignature('G'); + system + .addStave({ voices: [voice(notes('D4/q, B3[id="m7c"], G3', { clef: 'bass' }))] }) + .addClef('bass') + .addKeySignature('G'); + system.addConnector('brace'); + system.addConnector('singleRight'); + system.addConnector('singleLeft'); + id('m7a').addModifier(f.Fingering({ number: '2', position: 'below' }), 0); + id('m7b').addModifier(f.Fingering({ number: '1' }), 0); + id('m7c').addModifier(f.Fingering({ number: '3', position: 'above' }), 0); + /* Measure 8 */ + system = appendSystem(180); + const grace = f.GraceNote({ keys: ['d/3'], clef: 'bass', duration: '8', slash: true }); + system.addStave({ voices: [voice(notes('A4/h.[id="m8c"]'))] }); + system.addStave({ + voices: [ + score + .set({ clef: 'bass' }) + .voice([notes('D4/q[id="m8a"]'), beam(notes('D3/8, C4, B3[id="m8b"], A3', { stem: 'down' }))].reduce(_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.concat)), + ], + }); + system.addConnector('singleRight'); + id('m8b').addModifier(f.Fingering({ number: '1', position: 'above' }), 0); + id('m8c').addModifier(f.GraceNoteGroup({ notes: [grace] }), 0); + f.Curve({ + from: id('m7a'), + to: id('m8c'), + options: { + cps: [ + { x: 0, y: 20 }, + { x: 0, y: 20 }, + ], + invert: true, + position: 'nearTop', + position_end: 'nearTop', + }, + }); + f.StaveTie({ from: grace, to: id('m8c') }); + /* Measure 9 */ + system = appendSystem(180); + system.addStave({ + voices: [ + score + .set({ clef: 'treble' }) + .voice([notes('D5/q[id="m9a"]'), beam(notes('G4/8, A4, B4, C5', { stem: 'up' }))].reduce(_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.concat)), + ], + }); + system.addStave({ voices: [voice(notes('B3/h, A3/q', { clef: 'bass' }))] }); + system.addConnector('singleRight'); + id('m9a').addModifier(f.Fingering({ number: '5' }), 0); + /* Measure 10 */ + system = appendSystem(170); + system.addStave({ voices: [voice(notes('D5/q[id="m10a"], G4[id="m10b"], G4[id="m10c"]'))] }); + system.addStave({ voices: [voice(notes('G3/q[id="m10d"], B3, G3', { clef: 'bass' }))] }); + system.addConnector('singleRight'); + id('m10a').addModifier(f.Articulation({ type: 'a.', position: 'above' }), 0); + id('m10b').addModifier(f.Articulation({ type: 'a.', position: 'below' }), 0); + id('m10c').addModifier(f.Articulation({ type: 'a.', position: 'below' }), 0); + id('m10d').addModifier(f.Fingering({ number: '4' }), 0); + f.Curve({ + from: id('m9a'), + to: id('m10a'), + options: { + cps: [ + { x: 0, y: 40 }, + { x: 0, y: 40 }, + ], + }, + }); + /* Measure 11 */ + system = appendSystem(150); + system.addStave({ + voices: [voice([notes('E5/q[id="m11a"]'), beam(notes('C5/8, D5, E5, F5', { stem: 'down' }))].reduce(_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.concat))], + }); + id('m11a').addModifier(f.Fingering({ number: '3', position: 'above' }), 0); + system.addStave({ voices: [voice(notes('C4/h.', { clef: 'bass' }))] }); + system.addConnector('singleRight'); + /* Measure 12 */ + system = appendSystem(170); + system.addStave({ voices: [voice(notes('G5/q[id="m12a"], G4[id="m12b"], G4[id="m12c"]'))] }); + system.addStave({ + voices: [ + score + .set({ clef: 'bass' }) + .voice([notes('B3/q[id="m12d"]'), beam(notes('C4/8, B3, A3, G3[id="m12e"]', { stem: 'down' }))].reduce(_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.concat)), + ], + }); + system.addConnector('singleRight'); + id('m12a').addModifier(f.Articulation({ type: 'a.', position: 'above' }), 0); + id('m12b').addModifier(f.Articulation({ type: 'a.', position: 'below' }), 0); + id('m12c').addModifier(f.Articulation({ type: 'a.', position: 'below' }), 0); + id('m12d').addModifier(f.Fingering({ number: '2', position: 'above' }), 0); + id('m12e').addModifier(f.Fingering({ number: '4', position: 'above' }), 0); + f.Curve({ + from: id('m11a'), + to: id('m12a'), + options: { + cps: [ + { x: 0, y: 20 }, + { x: 0, y: 20 }, + ], + }, + }); + /* Measure 13 (New system) */ + x = 20; + y += 230; + system = appendSystem(220); + system + .addStave({ + voices: [ + score + .set({ clef: 'treble' }) + .voice([notes('c5/q[id="m13a"]'), beam(notes('d5/8, c5, b4, a4', { stem: 'down' }))].reduce(_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.concat)), + ], + }) + .addClef('treble') + .addKeySignature('G'); + system + .addStave({ voices: [voice(notes('a3/h[id="m13b"], f3/q[id="m13c"]', { clef: 'bass' }))] }) + .addClef('bass') + .addKeySignature('G'); + system.addConnector('brace'); + system.addConnector('singleRight'); + system.addConnector('singleLeft'); + id('m13a').addModifier(f.Fingering({ number: '4', position: 'above' }), 0); + id('m13b').addModifier(f.Fingering({ number: '1' }), 0); + id('m13c').addModifier(f.Fingering({ number: '3', position: 'above' }), 0); + /* Measure 14 */ + system = appendSystem(180); + system.addStave({ + voices: [ + score + .set({ clef: 'treble' }) + .voice([notes('B4/q'), beam(notes('C5/8, b4, a4, g4', { stem: 'up' }))].reduce(_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.concat)), + ], + }); + system.addStave({ voices: [voice(notes('g3/h[id="m14a"], b3/q[id="m14b"]', { clef: 'bass' }))] }); + system.addConnector('singleRight'); + id('m14a').addModifier(f.Fingering({ number: '2' }), 0); + id('m14b').addModifier(f.Fingering({ number: '1' }), 0); + /* Measure 15 */ + system = appendSystem(180); + system.addStave({ + voices: [ + score + .set({ clef: 'treble' }) + .voice([notes('a4/q'), beam(notes('b4/8, a4, g4, f4[id="m15a"]', { stem: 'up' }))].reduce(_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.concat)), + ], + }); + system.addStave({ voices: [voice(notes('c4/q[id="m15b"], d4, d3', { clef: 'bass' }))] }); + system.addConnector('singleRight'); + id('m15a').addModifier(f.Fingering({ number: '2' }), 0); + id('m15b').addModifier(f.Fingering({ number: '2' }), 0); + /* Measure 16 */ + system = appendSystem(130); + system + .addStave({ + voices: [score.set({ clef: 'treble' }).voice([notes('g4/h.[id="m16a"]')].reduce(_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.concat))], + }) + .setEndBarType(_src_index__WEBPACK_IMPORTED_MODULE_1__.BarlineType.REPEAT_END); + system + .addStave({ voices: [voice(notes('g3/h[id="m16b"], g2/q', { clef: 'bass' }))] }) + .setEndBarType(_src_index__WEBPACK_IMPORTED_MODULE_1__.BarlineType.REPEAT_END); + system.addConnector('boldDoubleRight'); + id('m16a').addModifier(f.Fingering({ number: '1' }), 0); + id('m16b').addModifier(f.Fingering({ number: '1' }), 0); + f.Curve({ + from: id('m13a'), + to: id('m16a'), + options: { + cps: [ + { x: 0, y: 50 }, + { x: 0, y: 20 }, + ], + invert: true, + position_end: 'nearTop', + }, + }); + /* Measure 17 */ + system = appendSystem(180); + system + .addStave({ + voices: [ + score + .set({ clef: 'treble' }) + .voice([notes('b5/q[id="m17a"]'), beam(notes('g5/8, a5, b5, g5', { stem: 'down' }))].reduce(_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.concat)), + voice([f.TextDynamics({ text: 'mf', duration: 'h', dots: 1, line: 10 })]), + ], + }) + .setBegBarType(_src_index__WEBPACK_IMPORTED_MODULE_1__.BarlineType.REPEAT_BEGIN); + system.addStave({ voices: [voice(notes('g3/h.', { clef: 'bass' }))] }).setBegBarType(_src_index__WEBPACK_IMPORTED_MODULE_1__.BarlineType.REPEAT_BEGIN); + system.addConnector('boldDoubleLeft'); + system.addConnector('singleRight'); + id('m17a').addModifier(f.Fingering({ number: '5', position: 'above' }), 0); + /* Measure 18 */ + system = appendSystem(180); + system.addStave({ + voices: [ + score + .set({ clef: 'treble' }) + .voice([notes('a5/q[id="m18a"]'), beam(notes('d5/8, e5, f5, d5[id="m18b"]', { stem: 'down' }))].reduce(_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.concat)), + ], + }); + system.addStave({ voices: [voice(notes('f3/h.', { clef: 'bass' }))] }); + system.addConnector('singleRight'); + id('m18a').addModifier(f.Fingering({ number: '4', position: 'above' }), 0); + f.Curve({ + from: id('m17a'), + to: id('m18b'), + options: { + cps: [ + { x: 0, y: 20 }, + { x: 0, y: 30 }, + ], + }, + }); + /* Done */ + f.draw(); + _src_index__WEBPACK_IMPORTED_MODULE_1__.Registry.disableDefaultRegistry(); + ok(true, 'Bach Minuet 1'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(BachDemoTests); + + + +/***/ }), + +/***/ "./tests/barline_tests.ts": +/*!********************************!*\ + !*** ./tests/barline_tests.ts ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "BarlineTests": () => (/* binding */ BarlineTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_stavebarline__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/stavebarline */ "./src/stavebarline.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Barline Tests + + +const BarlineTests = { + Start() { + QUnit.module('Barline'); + test('Enums', enums); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Simple BarNotes', simple); + run('Style BarNotes', style); + }, +}; +function enums() { + // VexFlow 4.0 renamed Barline.type => BarlineType. + // The old way still works, for backwards compatibility. + equal(_src_stavebarline__WEBPACK_IMPORTED_MODULE_1__.Barline.type, _src_stavebarline__WEBPACK_IMPORTED_MODULE_1__.BarlineType); + const a = _src_stavebarline__WEBPACK_IMPORTED_MODULE_1__.BarlineType.DOUBLE; + const b = _src_stavebarline__WEBPACK_IMPORTED_MODULE_1__.BarlineType.DOUBLE; + equal(a, b); +} +function simple(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 380, 160); + const stave = f.Stave(); + const notes = [ + f.StaveNote({ keys: ['d/4', 'e/4', 'f/4'], stem_direction: -1, duration: '2' }), + f.BarNote({ type: 'single' }), + f + .StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: '2' }) + .addModifier(f.Accidental({ type: 'n' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1), + ]; + const voice = f.Voice().addTickables(notes); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Simple Test'); +} +function style(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 380, 160); + const stave = f.Stave(); + const notes = [ + f.StaveNote({ keys: ['d/4', 'e/4', 'f/4'], stem_direction: -1, duration: '2' }), + f.BarNote({ type: 'single' }), + f + .StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: '2' }) + .addModifier(f.Accidental({ type: 'n' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1), + ]; + notes[1].setStyle({ shadowBlur: 15, shadowColor: 'blue', fillStyle: 'blue', strokeStyle: 'blue' }); + const voice = f.Voice().addTickables(notes); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Style'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(BarlineTests); + + + +/***/ }), + +/***/ "./tests/beam_tests.ts": +/*!*****************************!*\ + !*** ./tests/beam_tests.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "BeamTests": () => (/* binding */ BeamTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/index */ "./src/index.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Beam Tests +// TODO: Factory.Beam()'s 'notes' argument is a StemmableNote[], but we only have access to Tickable[]. + + +const BeamTests = { + Start() { + QUnit.module('Beam'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Simple Beam', simple); + run('Multi Beam', multi); + run('Sixteenth Beam', sixteenth); + run('Slopey Beam', slopey); + run('Auto-stemmed Beam', autoStem); + run('Mixed Beam 1', mixed); + run('Mixed Beam 2', mixed2); + run('Dotted Beam', dotted); + run('Partial Beam', partial); + run('Close Trade-offs Beam', tradeoffs); + run('Insane Beam', insane); + run('Lengthy Beam', lenghty); + run('Outlier Beam', outlier); + run('Break Secondary Beams', breakSecondaryBeams); + run('TabNote Beams Up', tabBeamsUp); + run('TabNote Beams Down', tabBeamsDown); + run('TabNote Auto Create Beams', autoTabBeams); + run('TabNote Beams Auto Stem', tabBeamsAutoStem); + run('Complex Beams with Annotations', complexWithAnnotation); + run('Complex Beams with Articulations', complexWithArticulation); + }, +}; +function simple(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const beam = score.beam.bind(score); + const notes = score.notes.bind(score); + const voice = score.voice([ + notes('(cb4 e#4 a4)/2'), + beam(notes('(cb4 e#4 a4)/8, (d4 f4 a4), (ebb4 g##4 b4), (f4 a4 c5)', { stem: 'up' })), + ].reduce(_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.concat), { time: '2/2' }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Simple Test'); +} +function multi(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice.bind(score); + const beam = score.beam.bind(score); + const notes = score.notes.bind(score); + const voices = [ + voice([beam(notes('f5/8, e5, d5, c5', { stem: 'up' })), beam(notes('c5, d5, e5, f5', { stem: 'up' }))].reduce(_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.concat)), + voice([beam(notes('f4/8, e4, d4, c4', { stem: 'down' })), beam(notes('c4/8, d4, e4, f4', { stem: 'down' }))].reduce(_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.concat)), + ]; + f.Formatter().joinVoices(voices).formatToStave(voices, stave); + f.draw(); + ok(true, 'Multi Test'); +} +function sixteenth(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice.bind(score); + const beam = score.beam.bind(score); + const notes = score.notes.bind(score); + const voices = [ + voice([ + beam(notes('f5/16, f5, d5, c5', { stem: 'up' })), + beam(notes('c5/16, d5, f5, e5', { stem: 'up' })), + notes('f5/2', { stem: 'up' }), + ].reduce(_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.concat)), + voice([ + beam(notes('f4/16, e4/16, d4/16, c4/16', { stem: 'down' })), + beam(notes('c4/16, d4/16, f4/16, e4/16', { stem: 'down' })), + notes('f4/2', { stem: 'down' }), + ].reduce(_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.concat)), + ]; + f.Formatter().joinVoices(voices).formatToStave(voices, stave); + f.draw(); + ok(true, 'Sixteenth Test'); +} +function breakSecondaryBeams(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 200); + const stave = f.Stave({ y: 20 }); + const score = f.EasyScore(); + const voice = score.voice.bind(score); + const beam = score.beam.bind(score); + const notes = score.notes.bind(score); + const voices = [ + voice([ + beam(notes('f5/16., f5/32, c5/16., d5/32, c5/16., d5/32', { stem: 'up' }), { secondaryBeamBreaks: [1, 3] }), + beam(notes('f5/16, e5, e5, e5, e5, e5', { stem: 'up' }), { secondaryBeamBreaks: [2] }), + ].reduce(_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.concat), { time: '3/4' }), + voice([ + beam(notes('f4/32, d4, e4, c4, d4, c4, f4, d4, e4, c4, c4, d4', { stem: 'down' }), { + secondaryBeamBreaks: [3, 7], + }), + beam(notes('d4/16, f4, d4, e4, e4, e4', { stem: 'down' }), { secondaryBeamBreaks: [3] }), + ].reduce(_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.concat), { time: '3/4' }), + ]; + f.Formatter().joinVoices(voices).formatToStave(voices, stave); + f.draw(); + ok(true, 'Breaking Secondary Beams Test'); +} +function slopey(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 350, 140); + const stave = f.Stave({ y: 20 }); + const score = f.EasyScore(); + const beam = score.beam.bind(score); + const notes = score.notes.bind(score); + const voice = score.voice([ + beam(notes('c4/8, f4/8, d5/8, g5/8', { stem: 'up' })), + beam(notes('d6/8, f5/8, d4/8, g3/8', { stem: 'up' })), + ].reduce(_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.concat)); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Slopey Test'); +} +function autoStem(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 350, 140); + const stave = f.Stave({ y: 20 }); + const score = f.EasyScore(); + const voice = score.voice(score.notes('a4/8, b4/8, g4/8, c5/8, f4/8, d5/8, e4/8, e5/8, b4/8, b4/8, g4/8, d5/8'), { + time: '6/4', + }); + const notes = voice.getTickables(); + const beams = [ + f.Beam({ notes: notes.slice(0, 2), options: { autoStem: true } }), + f.Beam({ notes: notes.slice(2, 4), options: { autoStem: true } }), + f.Beam({ notes: notes.slice(4, 6), options: { autoStem: true } }), + f.Beam({ notes: notes.slice(6, 8), options: { autoStem: true } }), + f.Beam({ notes: notes.slice(8, 10), options: { autoStem: true } }), + f.Beam({ notes: notes.slice(10, 12), options: { autoStem: true } }), + ]; + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + const UP = _src_index__WEBPACK_IMPORTED_MODULE_1__.Stem.UP; + const DOWN = _src_index__WEBPACK_IMPORTED_MODULE_1__.Stem.DOWN; + equal(beams[0].getStemDirection(), UP); + equal(beams[1].getStemDirection(), UP); + equal(beams[2].getStemDirection(), UP); + equal(beams[3].getStemDirection(), UP); + equal(beams[4].getStemDirection(), DOWN); + equal(beams[5].getStemDirection(), DOWN); + f.draw(); + ok(true, 'AutoStem Beam Test'); +} +function mixed(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 350, 140); + const stave = f.Stave({ y: 20 }); + const score = f.EasyScore(); + const voice1 = score.voice(score.notes('f5/8, d5/16, c5/16, c5/16, d5/16, e5/8, f5/8, d5/16, c5/16, c5/16, d5/16, e5/8', { stem: 'up' })); + const voice2 = score.voice(score.notes('f4/16, e4/8, d4/16, c4/16, d4/8, f4/16, f4/16, e4/8, d4/16, c4/16, d4/8, f4/16', { stem: 'down' })); + [ + [0, 4], + [4, 8], + [8, 12], + ].forEach((range) => f.Beam({ notes: voice1.getTickables().slice(range[0], range[1]) })); + [ + [0, 4], + [4, 8], + [8, 12], + ].forEach((range) => f.Beam({ notes: voice2.getTickables().slice(range[0], range[1]) })); + f.Formatter().joinVoices([voice1, voice2]).formatToStave([voice1, voice2], stave); + f.draw(); + ok(true, 'Multi Test'); +} +function mixed2(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 450, 180); + const stave = f.Stave({ y: 20 }); + const score = f.EasyScore(); + const voice = score.voice(score.notes('f5/32, d5/16, c5/32, c5/64, d5/128, e5/8, f5/16, d5/32, c5/64, c5/32, d5/16, e5/128', { + stem: 'up', + }), { time: '31/64' }); + const voice2 = score.voice(score.notes('f4/32, d4/16, c4/32, c4/64, d4/128, e4/8, f4/16, d4/32, c4/64, c4/32, d4/16, e4/128', { + stem: 'down', + }), { time: '31/64' }); + f.Beam({ notes: voice.getTickables().slice(0, 12) }); + f.Beam({ notes: voice2.getTickables().slice(0, 12) }); + f.Formatter().joinVoices([voice, voice2]).formatToStave([voice, voice2], stave); + f.draw(); + ok(true, 'Multi Test'); +} +function dotted(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('d4/8, b3/8., a3/16, a3/8, b3/8., c4/16, d4/8, b3/8, a3/8., a3/16, b3/8., c4/16', { stem: 'up' }), { time: '6/4' }); + const notes = voice.getTickables(); + f.Beam({ notes: notes.slice(0, 4) }); + f.Beam({ notes: notes.slice(4, 8) }); + f.Beam({ notes: notes.slice(8, 12) }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Dotted Test'); +} +function partial(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('d4/8, b3/32, c4/16., d4/16., e4/8, c4/64, c4/32, a3/8., b3/32., c4/8, e4/64, b3/16., b3/64, f4/8, e4/8, g4/64, e4/8'), { time: '89/64' }); + const notes = voice.getTickables(); + f.Beam({ notes: notes.slice(0, 3) }); + f.Beam({ notes: notes.slice(3, 9) }); + f.Beam({ notes: notes.slice(9, 13) }); + f.Beam({ notes: notes.slice(13, 17) }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Partial Test'); +} +function tradeoffs(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('a4/8, b4/8, c4/8, d4/8, g4/8, a4/8, b4/8, c4/8', { stem: 'up' })); + const notes = voice.getTickables(); + f.Beam({ notes: notes.slice(0, 4) }); + f.Beam({ notes: notes.slice(4, 8) }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Close Trade-offs Test'); +} +function insane(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 450, 180); + const stave = f.Stave({ y: 20 }); + const score = f.EasyScore(); + const voice = score.voice(score.notes('g4/8, g5/8, c4/8, b5/8, g4/8[stem="down"], a5[stem="down"], b4[stem="down"], c4/8', { stem: 'up' })); + const notes = voice.getTickables(); + f.Beam({ notes: notes.slice(0, 4) }); + f.Beam({ notes: notes.slice(4, 7) }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Insane Test'); +} +function lenghty(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 450, 180); + const stave = f.Stave({ y: 20 }); + const score = f.EasyScore(); + const voice = score.voice(score.beam(score.notes('g4/8, g4, g4, a4', { stem: 'up' })), { time: '2/4' }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Lengthy Test'); +} +function outlier(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 450, 180); + const stave = f.Stave({ y: 20 }); + const score = f.EasyScore(); + const voice = score.voice(score.notes([ + 'g4/8[stem="up"], f4[stem="up"], d5[stem="up"], e4[stem="up"]', + 'd5/8[stem="down"], d5[stem="down"], c5[stem="down"], d5[stem="down"]', + ].join())); + const notes = voice.getTickables(); + f.Beam({ notes: notes.slice(0, 4) }); + f.Beam({ notes: notes.slice(4, 8) }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave, { stave: stave }); + f.draw(); + ok(true, 'Outlier Test'); +} +function tabBeamsUp(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 200); + const stave = f.TabStave({ y: 20 }); + const specs = [ + { + positions: [ + { str: 3, fret: 6 }, + { str: 4, fret: 25 }, + ], + duration: '4', + }, + { + positions: [ + { str: 2, fret: 10 }, + { str: 5, fret: 12 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '16', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '32', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '64', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '128', + }, + { positions: [{ str: 3, fret: 6 }], duration: '8' }, + { positions: [{ str: 3, fret: 6 }], duration: '8' }, + { positions: [{ str: 3, fret: 6 }], duration: '8' }, + { positions: [{ str: 3, fret: 6 }], duration: '8' }, + ]; + const notes = specs.map((struct) => { + const tabNote = f.TabNote(struct); + tabNote.render_options.draw_stem = true; + return tabNote; + }); + f.Beam({ notes: notes.slice(1, 7) }); + f.Beam({ notes: notes.slice(8, 11) }); + f.Tuplet({ notes: notes.slice(8, 11), options: { ratioed: true } }); + const voice = f.Voice().setMode(_src_index__WEBPACK_IMPORTED_MODULE_1__.Voice.Mode.SOFT).addTickables(notes); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'All objects have been drawn'); +} +function tabBeamsDown(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 250); + const stave = f.TabStave({ options: { num_lines: 10 } }); + const specs = [ + { + stem_direction: -1, + positions: [ + { str: 3, fret: 6 }, + { str: 4, fret: 25 }, + ], + duration: '4', + }, + { + stem_direction: -1, + positions: [ + { str: 2, fret: 10 }, + { str: 5, fret: 12 }, + ], + duration: '8dd', + }, + { + stem_direction: -1, + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '8', + }, + { + stem_direction: -1, + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '16', + }, + { + stem_direction: -1, + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '32', + }, + { + stem_direction: -1, + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '64', + }, + { + stem_direction: -1, + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '128', + }, + { stem_direction: -1, positions: [{ str: 1, fret: 6 }], duration: '8' }, + { stem_direction: -1, positions: [{ str: 1, fret: 6 }], duration: '8' }, + { stem_direction: -1, positions: [{ str: 1, fret: 6 }], duration: '8' }, + { stem_direction: -1, positions: [{ str: 7, fret: 6 }], duration: '8' }, + { stem_direction: -1, positions: [{ str: 7, fret: 6 }], duration: '8' }, + { stem_direction: -1, positions: [{ str: 10, fret: 6 }], duration: '8' }, + { stem_direction: -1, positions: [{ str: 10, fret: 6 }], duration: '8' }, + ]; + const notes = specs.map((struct) => { + const tabNote = f.TabNote(struct); + tabNote.render_options.draw_stem = true; + tabNote.render_options.draw_dots = true; + return tabNote; + }); + _src_index__WEBPACK_IMPORTED_MODULE_1__.Dot.buildAndAttach([notes[1], notes[1]]); + f.Beam({ notes: notes.slice(1, 7) }); + f.Beam({ notes: notes.slice(8, 11) }); + f.Tuplet({ notes: notes.slice(8, 11), options: { location: -1 } }); + f.Tuplet({ notes: notes.slice(11, 14), options: { location: -1 } }); + const voice = f.Voice().setMode(_src_index__WEBPACK_IMPORTED_MODULE_1__.Voice.Mode.SOFT).addTickables(notes); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'All objects have been drawn'); +} +function autoTabBeams(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 200); + const stave = f.TabStave(); + const specs = [ + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '16', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '16', + }, + { positions: [{ str: 1, fret: 6 }], duration: '32' }, + { positions: [{ str: 1, fret: 6 }], duration: '32' }, + { positions: [{ str: 1, fret: 6 }], duration: '32' }, + { positions: [{ str: 6, fret: 6 }], duration: '32' }, + { positions: [{ str: 6, fret: 6 }], duration: '16' }, + { positions: [{ str: 6, fret: 6 }], duration: '16' }, + { positions: [{ str: 6, fret: 6 }], duration: '16' }, + { positions: [{ str: 6, fret: 6 }], duration: '16' }, + ]; + const notes = specs.map((struct) => { + const tabNote = f.TabNote(struct); + tabNote.render_options.draw_stem = true; + tabNote.render_options.draw_dots = true; + return tabNote; + }); + const voice = f.Voice().setMode(_src_index__WEBPACK_IMPORTED_MODULE_1__.Voice.Mode.SOFT).addTickables(notes); + const beams = _src_index__WEBPACK_IMPORTED_MODULE_1__.Beam.applyAndGetBeams(voice, -1); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'All objects have been drawn'); +} +// This tests makes sure the auto_stem functionality is works. +// TabNote stems within a beam group should end up normalized +function tabBeamsAutoStem(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 300); + const stave = f.TabStave(); + const specs = [ + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '8', + stem_direction: -1, + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '8', + stem_direction: 1, + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '16', + stem_direction: -1, + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '16', + stem_direction: 1, + }, + { positions: [{ str: 1, fret: 6 }], duration: '32', stem_direction: 1 }, + { positions: [{ str: 1, fret: 6 }], duration: '32', stem_direction: -1 }, + { positions: [{ str: 1, fret: 6 }], duration: '32', stem_direction: -1 }, + { positions: [{ str: 6, fret: 6 }], duration: '32', stem_direction: -1 }, + { positions: [{ str: 6, fret: 6 }], duration: '16', stem_direction: 1 }, + { positions: [{ str: 6, fret: 6 }], duration: '16', stem_direction: 1 }, + { positions: [{ str: 6, fret: 6 }], duration: '16', stem_direction: 1 }, + { positions: [{ str: 6, fret: 6 }], duration: '16', stem_direction: -1 }, + ]; + const notes = specs.map((struct) => { + const tabNote = f.TabNote(struct); + tabNote.render_options.draw_stem = true; + tabNote.render_options.draw_dots = true; + return tabNote; + }); + // Stems should format down + f.Beam({ notes: notes.slice(0, 8), options: { autoStem: true } }); + // Stems should format up + f.Beam({ notes: notes.slice(8, 12), options: { autoStem: true } }); + const voice = f.Voice().setMode(_src_index__WEBPACK_IMPORTED_MODULE_1__.Voice.Mode.SOFT).addTickables(notes); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'All objects have been drawn'); +} +function complexWithAnnotation(options) { + const factory = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 500, 200); + const stave = factory.Stave({ y: 40 }); + const s1 = [ + { keys: ['e/4'], duration: '128', stem_direction: 1 }, + { keys: ['d/4'], duration: '16', stem_direction: 1 }, + { keys: ['e/4'], duration: '8', stem_direction: 1 }, + { keys: ['c/4', 'g/4'], duration: '32', stem_direction: 1 }, + { keys: ['c/4'], duration: '32', stem_direction: 1 }, + { keys: ['c/4'], duration: '32', stem_direction: 1 }, + { keys: ['c/4'], duration: '32', stem_direction: 1 }, + ]; + const s2 = [ + { keys: ['e/5'], duration: '128', stem_direction: -1 }, + { keys: ['d/5'], duration: '16', stem_direction: -1 }, + { keys: ['e/5'], duration: '8', stem_direction: -1 }, + { keys: ['c/5', 'g/5'], duration: '32', stem_direction: -1 }, + { keys: ['c/5'], duration: '32', stem_direction: -1 }, + { keys: ['c/5'], duration: '32', stem_direction: -1 }, + { keys: ['c/5'], duration: '32', stem_direction: -1 }, + ]; + const font = { + family: _src_index__WEBPACK_IMPORTED_MODULE_1__.Font.SERIF, + size: 14, + weight: _src_index__WEBPACK_IMPORTED_MODULE_1__.FontWeight.BOLD, + style: _src_index__WEBPACK_IMPORTED_MODULE_1__.FontStyle.ITALIC, + }; + const notes1 = s1.map((struct) => factory + .StaveNote(struct) // + .addModifier(factory.Annotation({ text: '1', vJustify: _src_index__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.TOP, font }), 0)); + const notes2 = s2.map((struct) => factory + .StaveNote(struct) // + .addModifier(factory.Annotation({ text: '3', vJustify: _src_index__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.BOTTOM, font }), 0)); + factory.Beam({ notes: notes1 }); + factory.Beam({ notes: notes2 }); + const voice = factory.Voice().setMode(_src_index__WEBPACK_IMPORTED_MODULE_1__.Voice.Mode.SOFT).addTickables(notes1).addTickables(notes2); + factory.Formatter().joinVoices([voice]).formatToStave([voice], stave, { stave: stave }); + factory.draw(); + ok(true, 'Complex beam annotations'); +} +function complexWithArticulation(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 500, 200); + const stave = f.Stave({ y: 40 }); + const s1 = [ + { keys: ['e/4'], duration: '128', stem_direction: 1 }, + { keys: ['d/4'], duration: '16', stem_direction: 1 }, + { keys: ['e/4'], duration: '8', stem_direction: 1 }, + { keys: ['c/4', 'g/4'], duration: '32', stem_direction: 1 }, + { keys: ['c/4'], duration: '32', stem_direction: 1 }, + { keys: ['c/4'], duration: '32', stem_direction: 1 }, + { keys: ['c/4'], duration: '32', stem_direction: 1 }, + ]; + const s2 = [ + { keys: ['e/5'], duration: '128', stem_direction: -1 }, + { keys: ['d/5'], duration: '16', stem_direction: -1 }, + { keys: ['e/5'], duration: '8', stem_direction: -1 }, + { keys: ['c/5', 'g/5'], duration: '32', stem_direction: -1 }, + { keys: ['c/5'], duration: '32', stem_direction: -1 }, + { keys: ['c/5'], duration: '32', stem_direction: -1 }, + { keys: ['c/5'], duration: '32', stem_direction: -1 }, + ]; + const notes1 = s1.map((struct) => f.StaveNote(struct).addModifier(f.Articulation({ type: 'am', position: 'above' }), 0)); + const notes2 = s2.map((struct) => f.StaveNote(struct).addModifier(f.Articulation({ type: 'a>', position: 'below' }), 0)); + f.Beam({ notes: notes1 }); + f.Beam({ notes: notes2 }); + const voice = f.Voice().setMode(_src_index__WEBPACK_IMPORTED_MODULE_1__.Voice.Mode.SOFT).addTickables(notes1).addTickables(notes2); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave, { stave: stave }); + f.draw(); + ok(true, 'Complex beam articulations'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(BeamTests); + + + +/***/ }), + +/***/ "./tests/bend_tests.ts": +/*!*****************************!*\ + !*** ./tests/bend_tests.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "BendTests": () => (/* binding */ BendTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_bend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/bend */ "./src/bend.ts"); +/* harmony import */ var _src_font__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/font */ "./src/font.ts"); +/* harmony import */ var _src_formatter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/formatter */ "./src/formatter.ts"); +/* harmony import */ var _src_modifiercontext__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/modifiercontext */ "./src/modifiercontext.ts"); +/* harmony import */ var _src_note__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/note */ "./src/note.ts"); +/* harmony import */ var _src_tabnote__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/tabnote */ "./src/tabnote.ts"); +/* harmony import */ var _src_tabstave__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/tabstave */ "./src/tabstave.ts"); +/* harmony import */ var _src_tickcontext__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/tickcontext */ "./src/tickcontext.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Bend Tests + + + + + + + + + +const BendTests = { + Start() { + QUnit.module('Bend'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Double Bends', doubleBends); + run('Reverse Bends', reverseBends); + run('Bend Phrase', bendPhrase); + run('Double Bends With Release', doubleBendsWithRelease); + run('Whako Bend', whackoBends); + // TODO: Rename 'Whako Bend' => 'Whacko' + }, +}; +// Helper functions for creating TabNote and Bend objects. +const note = (noteStruct) => new _src_tabnote__WEBPACK_IMPORTED_MODULE_6__.TabNote(noteStruct); +const bendWithText = (text, release = false) => new _src_bend__WEBPACK_IMPORTED_MODULE_1__.Bend(text, release); +const bendWithPhrase = (phrase) => new _src_bend__WEBPACK_IMPORTED_MODULE_1__.Bend('', false, phrase); +/** + * Bend two strings at a time. + */ +function doubleBends(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 500, 240); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + ctx.font = '10pt Arial'; + const stave = new _src_tabstave__WEBPACK_IMPORTED_MODULE_7__.TabStave(10, 10, 450).addTabGlyph().setContext(ctx).draw(); + const notes = [ + note({ + positions: [ + { str: 2, fret: 10 }, + { str: 4, fret: 9 }, + ], + duration: 'q', + }) + .addModifier(bendWithText('Full'), 0) + .addModifier(bendWithText('1/2'), 1), + note({ + positions: [ + { str: 2, fret: 5 }, + { str: 3, fret: 5 }, + ], + duration: 'q', + }) + .addModifier(bendWithText('1/4'), 0) + .addModifier(bendWithText('1/4'), 1), + // This note is not visible because it is pushed off to the right by the ctx.scale(1.5, 1.5) at the top. + note({ + positions: [{ str: 4, fret: 7 }], + duration: 'h', + }), + ]; + _src_formatter__WEBPACK_IMPORTED_MODULE_3__.Formatter.FormatAndDraw(ctx, stave, notes); + notes.forEach((note) => _src_note__WEBPACK_IMPORTED_MODULE_5__.Note.plotMetrics(ctx, note, 140)); + ok(true, 'Double Bends'); +} +function doubleBendsWithRelease(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 550, 240); + ctx.scale(1.0, 1.0); + ctx.setBackgroundFillStyle('#FFF'); + ctx.setFont('Arial', _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.Font.size); + const stave = new _src_tabstave__WEBPACK_IMPORTED_MODULE_7__.TabStave(10, 10, 550).addTabGlyph().setContext(ctx).draw(); + const notes = [ + note({ + positions: [ + { str: 1, fret: 10 }, + { str: 4, fret: 9 }, + ], + duration: 'q', + }) + .addModifier(bendWithText('1/2', true), 0) + .addModifier(bendWithText('Full', true), 1), + note({ + positions: [ + { str: 2, fret: 5 }, + { str: 3, fret: 5 }, + { str: 4, fret: 5 }, + ], + duration: 'q', + }) + .addModifier(bendWithText('1/4', true), 0) + .addModifier(bendWithText('Monstrous', true), 1) + .addModifier(bendWithText('1/4', true), 2), + note({ + positions: [{ str: 4, fret: 7 }], + duration: 'q', + }), + note({ + positions: [{ str: 4, fret: 7 }], + duration: 'q', + }), + ]; + _src_formatter__WEBPACK_IMPORTED_MODULE_3__.Formatter.FormatAndDraw(ctx, stave, notes); + notes.forEach((note) => _src_note__WEBPACK_IMPORTED_MODULE_5__.Note.plotMetrics(ctx, note, 140)); + ok(true, 'Bend Release'); +} +/** + * Add the bend for note 1 before adding the bend for note 0, + * by swapping the two indexes in .addModifier(modifier, index). + * As a result, the bend curves intersect. + */ +function reverseBends(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 500, 240); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + ctx.setFont('10pt Arial'); + const stave = new _src_tabstave__WEBPACK_IMPORTED_MODULE_7__.TabStave(10, 10, 450).addTabGlyph().setContext(ctx).draw(); + const notes = [ + note({ + positions: [ + { str: 2, fret: 10 }, + { str: 4, fret: 9 }, + ], + duration: 'w', + }) + .addModifier(bendWithText('Full'), 1) + .addModifier(bendWithText('1/2'), 0), + note({ + positions: [ + { str: 2, fret: 5 }, + { str: 3, fret: 5 }, + ], + duration: 'w', + }) + .addModifier(bendWithText('1/4'), 1) + .addModifier(bendWithText('1/4'), 0), + note({ + positions: [{ str: 4, fret: 7 }], + duration: 'w', + }), + ]; + for (let i = 0; i < notes.length; ++i) { + const note = notes[i]; + const mc = new _src_modifiercontext__WEBPACK_IMPORTED_MODULE_4__.ModifierContext(); + note.addToModifierContext(mc); + const tickContext = new _src_tickcontext__WEBPACK_IMPORTED_MODULE_8__.TickContext(); + tickContext + .addTickable(note) + .preFormat() + .setX(75 * i); + note.setStave(stave).setContext(ctx).draw(); + _src_note__WEBPACK_IMPORTED_MODULE_5__.Note.plotMetrics(ctx, note, 140); + ok(true, 'Bend ' + i); + } +} +function bendPhrase(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 500, 240); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + ctx.font = _src_font__WEBPACK_IMPORTED_MODULE_2__.Font.SIZE + 'pt ' + _src_font__WEBPACK_IMPORTED_MODULE_2__.Font.SANS_SERIF; // Optionally use constants defined in Font. + const stave = new _src_tabstave__WEBPACK_IMPORTED_MODULE_7__.TabStave(10, 10, 450).addTabGlyph().setContext(ctx).draw(); + const phrase1 = [ + { type: _src_bend__WEBPACK_IMPORTED_MODULE_1__.Bend.UP, text: 'Full' }, + { type: _src_bend__WEBPACK_IMPORTED_MODULE_1__.Bend.DOWN, text: 'Monstrous' }, + { type: _src_bend__WEBPACK_IMPORTED_MODULE_1__.Bend.UP, text: '1/2' }, + { type: _src_bend__WEBPACK_IMPORTED_MODULE_1__.Bend.DOWN, text: '' }, + ]; + const bend1 = bendWithPhrase(phrase1).setContext(ctx); + const notes = [ + note({ + positions: [{ str: 2, fret: 10 }], + duration: 'w', + }).addModifier(bend1, 0), + ]; + for (let i = 0; i < notes.length; ++i) { + const note = notes[i]; + note.addToModifierContext(new _src_modifiercontext__WEBPACK_IMPORTED_MODULE_4__.ModifierContext()); + const tickContext = new _src_tickcontext__WEBPACK_IMPORTED_MODULE_8__.TickContext(); + tickContext + .addTickable(note) + .preFormat() + .setX(75 * i); + note.setStave(stave).setContext(ctx).draw(); + _src_note__WEBPACK_IMPORTED_MODULE_5__.Note.plotMetrics(ctx, note, 140); + ok(true, 'Bend ' + i); + } +} +function whackoBends(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 240); + ctx.scale(1.0, 1.0); + ctx.setBackgroundFillStyle('#FFF'); + ctx.setFont('Arial', _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.Font.size); + const stave = new _src_tabstave__WEBPACK_IMPORTED_MODULE_7__.TabStave(10, 10, 350).addTabGlyph().setContext(ctx).draw(); + const phrase1 = [ + { type: _src_bend__WEBPACK_IMPORTED_MODULE_1__.Bend.UP, text: 'Full' }, + { type: _src_bend__WEBPACK_IMPORTED_MODULE_1__.Bend.DOWN, text: '' }, + { type: _src_bend__WEBPACK_IMPORTED_MODULE_1__.Bend.UP, text: '1/2' }, + { type: _src_bend__WEBPACK_IMPORTED_MODULE_1__.Bend.DOWN, text: '' }, + ]; + const phrase2 = [ + { type: _src_bend__WEBPACK_IMPORTED_MODULE_1__.Bend.UP, text: 'Full' }, + { type: _src_bend__WEBPACK_IMPORTED_MODULE_1__.Bend.UP, text: 'Full' }, + { type: _src_bend__WEBPACK_IMPORTED_MODULE_1__.Bend.UP, text: '1/2' }, + { type: _src_bend__WEBPACK_IMPORTED_MODULE_1__.Bend.DOWN, text: '' }, + { type: _src_bend__WEBPACK_IMPORTED_MODULE_1__.Bend.DOWN, text: 'Full' }, + { type: _src_bend__WEBPACK_IMPORTED_MODULE_1__.Bend.DOWN, text: 'Full' }, + { type: _src_bend__WEBPACK_IMPORTED_MODULE_1__.Bend.UP, text: '1/2' }, + { type: _src_bend__WEBPACK_IMPORTED_MODULE_1__.Bend.DOWN, text: '' }, + ]; + const notes = [ + note({ + positions: [ + { str: 2, fret: 10 }, + { str: 3, fret: 9 }, + ], + duration: 'q', + }) + .addModifier(bendWithPhrase(phrase1), 0) + .addModifier(bendWithPhrase(phrase2), 1), + ]; + _src_formatter__WEBPACK_IMPORTED_MODULE_3__.Formatter.FormatAndDraw(ctx, stave, notes); + _src_note__WEBPACK_IMPORTED_MODULE_5__.Note.plotMetrics(ctx, notes[0], 140); + ok(true, 'Whacko Bend & Release'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(BendTests); + + + +/***/ }), + +/***/ "./tests/boundingbox_tests.ts": +/*!************************************!*\ + !*** ./tests/boundingbox_tests.ts ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "BoundingBoxTests": () => (/* binding */ BoundingBoxTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/index */ "./src/index.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Bounding Box Tests + + +const BoundingBoxTests = { + Start() { + QUnit.module('BoundingBox'); + test('Initialization Test', initialization); + test('Merging Text', merging); + }, +}; +function initialization() { + const bb = new _src_index__WEBPACK_IMPORTED_MODULE_1__.BoundingBox(4, 5, 6, 7); + equal(bb.getX(), 4, 'Bad X'); + equal(bb.getY(), 5, 'Bad Y'); + equal(bb.getW(), 6, 'Bad W'); + equal(bb.getH(), 7, 'Bad H'); + bb.setX(5); + equal(bb.getX(), 5, 'Bad X'); +} +function merging() { + const tests = [ + { + type: 'Intersection', + bb1: new _src_index__WEBPACK_IMPORTED_MODULE_1__.BoundingBox(10, 10, 10, 10), + bb2: new _src_index__WEBPACK_IMPORTED_MODULE_1__.BoundingBox(15, 20, 10, 10), + merged: new _src_index__WEBPACK_IMPORTED_MODULE_1__.BoundingBox(10, 10, 15, 20), + }, + { + type: '1 contains 2', + bb1: new _src_index__WEBPACK_IMPORTED_MODULE_1__.BoundingBox(10, 10, 30, 30), + bb2: new _src_index__WEBPACK_IMPORTED_MODULE_1__.BoundingBox(15, 15, 10, 10), + merged: new _src_index__WEBPACK_IMPORTED_MODULE_1__.BoundingBox(10, 10, 30, 30), + }, + { + type: '2 contains 1', + bb1: new _src_index__WEBPACK_IMPORTED_MODULE_1__.BoundingBox(15, 15, 10, 10), + bb2: new _src_index__WEBPACK_IMPORTED_MODULE_1__.BoundingBox(10, 10, 30, 30), + merged: new _src_index__WEBPACK_IMPORTED_MODULE_1__.BoundingBox(10, 10, 30, 30), + }, + ]; + tests.forEach((test) => { + const type = test.type; + const bb1 = test.bb1; + const bb2 = test.bb2; + const merged = test.merged; + bb1.mergeWith(bb2); + equal(bb1.getX(), merged.getX(), type + ' - Bad X'); + equal(bb1.getY(), merged.getY(), type + ' - Bad Y'); + equal(bb1.getW(), merged.getW(), type + ' - Bad W'); + equal(bb1.getH(), merged.getH(), type + ' - Bad H'); + }); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(BoundingBoxTests); + + + +/***/ }), + +/***/ "./tests/boundingboxcomputation_tests.ts": +/*!***********************************************!*\ + !*** ./tests/boundingboxcomputation_tests.ts ***! + \***********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "BoundingBoxComputationTests": () => (/* binding */ BoundingBoxComputationTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/index */ "./src/index.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// BoundingBoxComputation Tests + + +const BoundingBoxComputationTests = { + Start() { + QUnit.module('BoundingBoxComputation'); + test('Point Test', point); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + quadraticParams.forEach((params, index) => { + run(`Quadratic Test ${index}`, quadratic, params); + }); + cubicParams.forEach((params, index) => { + run(`Cubic Test ${index}`, cubic, params); + }); + }, +}; +function point() { + const bboxComp = new _src_index__WEBPACK_IMPORTED_MODULE_1__.BoundingBoxComputation(); + bboxComp.addPoint(2, 3); + equal(bboxComp.getX1(), 2, 'Bad X1'); + equal(bboxComp.getY1(), 3, 'Bad Y1'); + equal(bboxComp.width(), 0, 'Bad width'); + equal(bboxComp.height(), 0, 'Bad height'); + bboxComp.addPoint(-5, 7); + equal(bboxComp.getX1(), -5, 'Bad X1'); + equal(bboxComp.getY1(), 3, 'Bad Y1'); + equal(bboxComp.width(), 7, 'Bad width'); + equal(bboxComp.height(), 4, 'Bad height'); +} +/** + * Size the context to fit all the points and a small margin. + */ +function createContext(options) { + const points = options.params.points; + let w = points[0]; + let h = points[1]; + for (let i = 2; i < points.length; i += 2) { + w = Math.max(w, points[i]); + h = Math.max(h, points[i + 1]); + } + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, w + 20, h + 20); + const ctx = f.getContext(); + ctx.setLineCap('square'); + return ctx; +} +/** + * Draw a rectangle on the RenderContext. + */ +function rect(ctx, style, lineWidth, x, y, w, h) { + ctx.strokeStyle = style; + ctx.setLineWidth(lineWidth); + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.lineTo(x + w, y); + ctx.lineTo(x + w, y + h); + ctx.lineTo(x, y + h); + ctx.lineTo(x, y); + ctx.stroke(); +} +// Each test consists of the control points for a single curve and its expected bounding box. +const quadraticParams = [ + { + points: [10, 10, 100, 20, 110, 110], + box: [10, 10, 100, 100], + }, + { + points: [110, 10, 60, 110, 10, 20], + box: [10, 10, 100, 52.63], + }, + { + points: [10, 10, 30, 20, 50, 30], + box: [10, 10, 40, 20], + }, + { + points: [100, 30, 30, 110, 20, 30], + box: [20, 30, 80, 40], + }, +]; +/** + * + */ +function quadratic(options) { + const points = options.params.points; + const box = options.params.box; + const ctx = createContext(options); + const [x0, y0, x1, y1, x2, y2] = points; + // Draw expected bounding box. + let [bx, by, bw, bh] = box; + rect(ctx, '#0f0', 5, bx, by, bw, bh); + // Compute the bounding box. + const bboxComp = new _src_index__WEBPACK_IMPORTED_MODULE_1__.BoundingBoxComputation(); + bboxComp.addQuadraticCurve(x0, y0, x1, y1, x2, y2); + // Draw computed bounding box. + [bx, by, bw, bh] = [bboxComp.getX1(), bboxComp.getY1(), bboxComp.width(), bboxComp.height()]; + rect(ctx, '#00f', 3, bx, by, bw, bh); + // Regression test for a prior bug: compute the bounding box again, + // this time using the Glyph.getOutlineBoundingBox code path. + const o = [_src_index__WEBPACK_IMPORTED_MODULE_1__.OutlineCode.MOVE, x0, -y0, _src_index__WEBPACK_IMPORTED_MODULE_1__.OutlineCode.QUADRATIC, x2, -y2, x1, -y1]; + const bbox = _src_index__WEBPACK_IMPORTED_MODULE_1__.Glyph.getOutlineBoundingBox(o, 1, 0, 0); + rect(ctx, '#fa0', 1, bbox.getX(), bbox.getY(), bbox.getW(), bbox.getH()); + // Draw curve. + ctx.setLineWidth(1); + ctx.fillStyle = '#000'; + _src_index__WEBPACK_IMPORTED_MODULE_1__.Glyph.renderOutline(ctx, o, 1, 0, 0); + // Draw control points. + ctx.strokeStyle = '#f00'; + ctx.beginPath(); + ctx.moveTo(x0, y0); + ctx.lineTo(x1, y1); + ctx.lineTo(x2, y2); + ctx.stroke(); + // Check the expected and computed bounding boxes are close enough. + ok(Math.abs(bboxComp.getX1() - box[0]) < 0.01, `Bad X1: ${bboxComp.getX1()}`); + ok(Math.abs(bboxComp.getY1() - box[1]) < 0.01, `Bad Y1: ${bboxComp.getY1()}`); + ok(Math.abs(bboxComp.width() - box[2]) < 0.01, `Bad width: ${bboxComp.width()}`); + ok(Math.abs(bboxComp.height() - box[3]) < 0.01, `Bad height: ${bboxComp.height()}`); + ok(Math.abs(bbox.getX() - box[0]) < 0.01, `Bad X: ${bbox.getX()}`); + ok(Math.abs(bbox.getY() - box[1]) < 0.01, `Bad Y: ${bbox.getY()}`); + ok(Math.abs(bbox.getW() - box[2]) < 0.01, `Bad W: ${bbox.getW()}`); + ok(Math.abs(bbox.getH() - box[3]) < 0.01, `Bad H: ${bbox.getH()}`); +} +// Each test consists of the control points for a single curve and its expected bounding box. +const cubicParams = [ + { + points: [10, 10, 60, 20, 100, 60, 110, 110], + box: [10, 10, 100, 100], + }, + { + points: [10, 10, 35, 110, 85, 110, 110, 10], + box: [10, 10, 100, 75], + }, + { + points: [10, 110, 90, 10, 30, 10, 110, 110], + box: [10, 35, 100, 75], + }, + { + points: [10, 10, 110, 110, 110, 10, 10, 110], + box: [10, 10, 75, 100], + }, + { + points: [10, 10, 130, 110, -10, 110, 110, 10], + box: [10, 10, 100, 75], + }, + { + points: [50, 10, 10, 110, 110, 110, 74, 10], + box: [40.38, 10, 41.59, 75], + }, + { + points: [10, 30, 35, 60, 110, 110, 60, 10], + box: [10, 10, 66.82, 59.37], + }, + { + points: [210, 70, 10, 10, 190, 10, 120, 90], + box: [112.02, 27.23, 97.98, 62.77], + }, + { + points: [20, 10, 210, 90, 10, 90, 100, 38], + box: [20, 10, 85.33, 64.06], + }, + { + points: [60, 14, 10, 14, 90, 14, 70, 14], + box: [43.28, 14, 30.01, 0], + }, + { + points: [10, 60, 20, 100, 100, 20, 110, 60], + box: [10, 48.45, 100, 23.1], + }, +]; +function cubic(options) { + const points = options.params.points; + const box = options.params.box; + const ctx = createContext(options); + const [x0, y0, x1, y1, x2, y2, x3, y3] = points; + // Draw expected bounding box. + let [bx, by, bw, bh] = box; + rect(ctx, '#0f0', 5, bx, by, bw, bh); + // Compute the bounding box. + const bboxComp = new _src_index__WEBPACK_IMPORTED_MODULE_1__.BoundingBoxComputation(); + bboxComp.addBezierCurve(x0, y0, x1, y1, x2, y2, x3, y3); + // Draw computed bounding box. + [bx, by, bw, bh] = [bboxComp.getX1(), bboxComp.getY1(), bboxComp.width(), bboxComp.height()]; + rect(ctx, '#00f', 3, bx, by, bw, bh); + // Regression test for a prior bug: compute the bounding box again, + // this time using the Glyph.getOutlineBoundingBox code path. + const o = [_src_index__WEBPACK_IMPORTED_MODULE_1__.OutlineCode.MOVE, x0, -y0, _src_index__WEBPACK_IMPORTED_MODULE_1__.OutlineCode.BEZIER, x3, -y3, x1, -y1, x2, -y2]; + const bbox = _src_index__WEBPACK_IMPORTED_MODULE_1__.Glyph.getOutlineBoundingBox(o, 1, 0, 0); + rect(ctx, '#fa0', 1, bbox.getX(), bbox.getY(), bbox.getW(), bbox.getH()); + // Draw curve. + ctx.setLineWidth(1); + ctx.fillStyle = '#000'; + _src_index__WEBPACK_IMPORTED_MODULE_1__.Glyph.renderOutline(ctx, o, 1, 0, 0); + // Draw control points. + ctx.strokeStyle = '#f00'; + ctx.beginPath(); + ctx.moveTo(x0, y0); + ctx.lineTo(x1, y1); + ctx.lineTo(x2, y2); + ctx.lineTo(x3, y3); + ctx.stroke(); + // Check the expected and computed bounding boxes are close enough. + ok(Math.abs(bboxComp.getX1() - box[0]) < 0.01, `Bad X1: ${bboxComp.getX1()}`); + ok(Math.abs(bboxComp.getY1() - box[1]) < 0.01, `Bad Y1: ${bboxComp.getY1()}`); + ok(Math.abs(bboxComp.width() - box[2]) < 0.01, `Bad width: ${bboxComp.width()}`); + ok(Math.abs(bboxComp.height() - box[3]) < 0.01, `Bad height: ${bboxComp.height()}`); + ok(Math.abs(bbox.getX() - box[0]) < 0.01, `Bad X: ${bbox.getX()}`); + ok(Math.abs(bbox.getY() - box[1]) < 0.01, `Bad Y: ${bbox.getY()}`); + ok(Math.abs(bbox.getW() - box[2]) < 0.01, `Bad W: ${bbox.getW()}`); + ok(Math.abs(bbox.getH() - box[3]) < 0.01, `Bad H: ${bbox.getH()}`); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(BoundingBoxComputationTests); + + + +/***/ }), + +/***/ "./tests/chordsymbol_tests.ts": +/*!************************************!*\ + !*** ./tests/chordsymbol_tests.ts ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ChordSymbolTests": () => (/* binding */ ChordSymbolTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_accidental__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/accidental */ "./src/accidental.ts"); +/* harmony import */ var _src_chordsymbol__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/chordsymbol */ "./src/chordsymbol.ts"); +/* harmony import */ var _src_formatter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/formatter */ "./src/formatter.ts"); +/* harmony import */ var _src_stave__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/stave */ "./src/stave.ts"); +/* harmony import */ var _src_stavenote__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/stavenote */ "./src/stavenote.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// ChordSymbol Tests + + + + + + +const ChordSymbolTests = { + Start() { + QUnit.module('ChordSymbol'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Chord Symbol Font Size Tests', fontSize); + run('Chord Symbol Kerning Tests', kern); + run('Top Chord Symbols', top); + run('Top Chord Symbols Justified', topJustify); + run('Bottom Chord Symbols', bottom); + run('Bottom Stem Down Chord Symbols', bottomStemDown); + run('Double Bottom Chord Symbols', doubleBottom); + }, +}; +// Options for customizing addGlyphOrText() or addGlyph(). +const superscript = { symbolModifier: _src_chordsymbol__WEBPACK_IMPORTED_MODULE_2__.ChordSymbol.symbolModifiers.SUPERSCRIPT }; +const subscript = { symbolModifier: _src_chordsymbol__WEBPACK_IMPORTED_MODULE_2__.ChordSymbol.symbolModifiers.SUBSCRIPT }; +// Helper function for creating StaveNotes. +const note = (factory, keys, duration, chordSymbol) => factory.StaveNote({ keys, duration }).addModifier(chordSymbol, 0); +function fontSize(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 750, 580); + const ctx = f.getContext(); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + function draw(chords, y) { + const stave = f.Stave({ x: 10, y, width: 450 }).addClef('treble'); + const notes = [ + note(f, ['c/4'], 'q', chords[0]), + note(f, ['c/4'], 'q', chords[1]), + note(f, ['c/4'], 'q', chords[2]), + note(f, ['c/4'], 'q', chords[3]), + ]; + const score = f.EasyScore(); + const voice = score.voice(notes, { time: '4/4' }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + } + let chords = []; + chords.push(f + .ChordSymbol({ fontSize: 10 }) + .addText('F7') + .addGlyph('leftParenTall') + .addGlyphOrText('b9', superscript) + .addGlyphOrText('#11', subscript) + .addGlyph('rightParenTall') + .setReportWidth(false)); + chords.push(f + .ChordSymbol({ fontSize: 12 }) + .addText('F7') + .addGlyphOrText('b9', superscript) + .addGlyphOrText('#11', subscript) + .setReportWidth(false)); + chords.push(f + .ChordSymbol({ fontSize: 14 }) + .addText('F7') + .addGlyph('leftParenTall') + .addGlyphOrText('add 3', superscript) + .addGlyphOrText('omit 9', subscript) + .addGlyph('rightParenTall') + .setReportWidth(false)); + chords.push(f + .ChordSymbol({ fontSize: 16 }) + .addText('F7') + .addGlyph('leftParenTall') + .addGlyphOrText('b9', superscript) + .addGlyphOrText('#11', subscript) + .addGlyph('rightParenTall') + .setReportWidth(false)); + draw(chords, 40); + chords = []; + chords.push(f + .ChordSymbol({ fontSize: 10 }) + .setFontSize(10) + .addText('F7') + .addGlyphOrText('#11', superscript) + .addGlyphOrText('b9', subscript)); + chords.push(f.ChordSymbol({ fontSize: 12 }).addText('F7').addGlyphOrText('#11', superscript).addGlyphOrText('b9', subscript)); + chords.push(f.ChordSymbol({ fontSize: 14 }).addText('F7').addGlyphOrText('#11', superscript).addGlyphOrText('b9', subscript)); + chords.push(f + .ChordSymbol({ fontSize: 16 }) + .setFontSize(16) + .addText('F7') + .addGlyphOrText('#11', superscript) + .addGlyphOrText('b9', subscript)); + draw(chords, 140); + chords = [ + f.ChordSymbol({ fontSize: 10 }).addGlyphOrText('Ab').addGlyphOrText('7(#11b9)', superscript), + f.ChordSymbol({ fontSize: 14 }).addGlyphOrText('C#').addGlyphOrText('7(#11b9)', superscript), + f.ChordSymbol({ fontSize: 16 }).addGlyphOrText('Ab').addGlyphOrText('7(#11b9)', superscript), + f.ChordSymbol({ fontSize: 18 }).addGlyphOrText('C#').addGlyphOrText('7(#11b9)', superscript), + ]; + draw(chords, 240); + ok(true, 'Font Size Chord Symbol'); +} +function kern(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 650, 650); + const ctx = f.getContext(); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + function draw(chords, y) { + const stave = f.Stave({ x: 10, y, width: 450 }).addClef('treble').setContext(ctx).draw(); + const notes = [ + note(f, ['C/4'], 'q', chords[0]), + note(f, ['C/4'], 'q', chords[1]), + note(f, ['C/4'], 'q', chords[2]), + note(f, ['C/4'], 'q', chords[3]), + ]; + const score = f.EasyScore(); + const voice = score.voice(notes, { time: '4/4' }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + } + let chords = [ + f.ChordSymbol().addText('A').addGlyphSuperscript('dim').setReportWidth(false), + f.ChordSymbol({ kerning: false, reportWidth: false }).addText('A').addGlyphSuperscript('dim'), + f.ChordSymbol({ hJustify: 'left', reportWidth: false }).addText('C').addGlyph('halfDiminished', superscript), + f.ChordSymbol({ reportWidth: false }).addText('D').addGlyph('halfDiminished', superscript), + ]; + draw(chords, 10); + chords = [ + f.ChordSymbol().addText('A').addGlyphSuperscript('dim'), + f.ChordSymbol({ kerning: false }).addText('A').addGlyphSuperscript('dim'), + f.ChordSymbol().addText('A').addGlyphSuperscript('+').addTextSuperscript('5'), + f.ChordSymbol().addText('G').addGlyphSuperscript('+').addTextSuperscript('5'), + ]; + draw(chords, 110); + chords = [ + f.ChordSymbol().addText('A').addGlyph('-'), + f.ChordSymbol().addText('E').addGlyph('-'), + f.ChordSymbol().addText('A').addGlyphOrText('(#11)', superscript), + f.ChordSymbol().addText('E').addGlyphOrText('(#9)', superscript), + ]; + draw(chords, 210); + chords = [ + f.ChordSymbol().addGlyphOrText('F/B').addGlyphOrText('b', superscript), + f.ChordSymbol().addText('E').addGlyphOrText('V/V'), + f.ChordSymbol().addText('A').addGlyphOrText('(#11)', superscript), + f.ChordSymbol().addText('E').addGlyphOrText('(#9)', superscript), + ]; + draw(chords, 310); + ok(true, 'Chord Symbol Kerning Tests'); +} +function top(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 650, 650); + const ctx = f.getContext(); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + function draw(c1, c2, y) { + const stave = f.Stave({ x: 10, y, width: 450 }).addClef('treble').setContext(ctx).draw(); + const notes = [ + note(f, ['e/4', 'a/4', 'd/5'], 'h', c1).addModifier(new _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental('b'), 0), + note(f, ['c/4', 'e/4', 'b/4'], 'h', c2), + ]; + const score = f.EasyScore(); + const voice = score.voice(notes, { time: '4/4' }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + } + let chord1 = f + .ChordSymbol({ reportWidth: false }) + .addText('F7') + .setHorizontal('left') + .addGlyphOrText('(#11b9)', superscript); + let chord2 = f + .ChordSymbol({ reportWidth: false }) + .addText('C') + .setHorizontal('left') + .addGlyphSuperscript('majorSeventh'); + draw(chord1, chord2, 40); + chord1 = f + .ChordSymbol() + .addText('F7') + .addTextSuperscript('(') + .addGlyphOrText('#11b9', superscript) + .addTextSuperscript(')'); + chord2 = f.ChordSymbol().addText('C').setHorizontal('left').addTextSuperscript('Maj.'); + draw(chord1, chord2, 140); + chord1 = f + .ChordSymbol() + .addText('F7') + .setHorizontal('left') + .addGlyphOrText('#11', superscript) + .addGlyphOrText('b9', subscript); + chord2 = f.ChordSymbol().addText('C').addTextSuperscript('sus4'); + draw(chord1, chord2, 240); + ok(true, 'Top Chord Symbol'); +} +function topJustify(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 500, 680); + const ctx = f.getContext(); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + function draw(chord1, chord2, y) { + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(10, y, 450).addClef('treble').setContext(ctx).draw(); + const notes = [ + note(f, ['e/4', 'a/4', 'd/5'], 'h', chord1).addModifier(new _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental('b'), 0), + note(f, ['c/4', 'e/4', 'B/4'], 'h', chord2), + ]; + _src_formatter__WEBPACK_IMPORTED_MODULE_3__.Formatter.FormatAndDraw(ctx, stave, notes); + } + let chord1 = f.ChordSymbol().addText('F7').setHorizontal('left').addGlyphOrText('(#11b9)', superscript); + let chord2 = f.ChordSymbol({ hJustify: 'left' }).addText('C').addGlyphSuperscript('majorSeventh'); + draw(chord1, chord2, 40); + chord1 = f + .ChordSymbol({ hJustify: 'center' }) + .addText('F7') + .setHorizontal('left') + .addGlyphOrText('(#11b9)', superscript); + chord2 = f.ChordSymbol({ hJustify: 'center' }).addText('C').addTextSuperscript('Maj.'); + draw(chord1, chord2, 140); + chord1 = f + .ChordSymbol({ hJustify: 'right' }) + .addText('F7') + .setHorizontal('left') + .addGlyphOrText('#11', superscript) + .addGlyphOrText('b9', subscript); + chord2 = f.ChordSymbol({ hJustify: 'right' }).addText('C').addTextSuperscript('Maj.'); + draw(chord1, chord2, 240); + chord1 = f + .ChordSymbol({ hJustify: 'left' }) + .addText('F7') + .setHorizontal('left') + .addGlyphOrText('#11', superscript) + .addGlyphOrText('b9', subscript); + chord2 = f.ChordSymbol({ hJustify: 'centerStem' }).addText('C').addTextSuperscript('Maj.'); + draw(chord1, chord2, 340); + ok(true, 'Top Chord Justified'); +} +function bottom(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 230); + const ctx = f.getContext(); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + function draw(chords, y) { + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(10, y, 400).addClef('treble').setContext(ctx).draw(); + const notes = [ + note(f, ['c/4', 'f/4', 'a/4'], 'q', chords[0]), + note(f, ['c/4', 'e/4', 'b/4'], 'q', chords[1]).addModifier(new _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental('b'), 2), + note(f, ['c/4', 'e/4', 'g/4'], 'q', chords[2]), + note(f, ['c/4', 'f/4', 'a/4'], 'q', chords[3]).addModifier(new _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental('#'), 1), + ]; + _src_formatter__WEBPACK_IMPORTED_MODULE_3__.Formatter.FormatAndDraw(ctx, stave, notes); + } + const chords = [ + f.ChordSymbol({ vJustify: 'bottom' }).addText('I').addTextSuperscript('6').addTextSubscript('4'), + f.ChordSymbol({ vJustify: 'bottom' }).addGlyphOrText('V'), + f.ChordSymbol({ vJustify: 'bottom' }).addLine(12), + f.ChordSymbol({ vJustify: 'bottom' }).addGlyphOrText('V/V'), + ]; + draw(chords, 10); + ok(true, 'Bottom Chord Symbol'); +} +function bottomStemDown(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 330); + const ctx = f.getContext(); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + function draw(chords, y) { + // Helper function to create a StaveNote with a ChordSymbol and the stem pointing down. + const note = (keys, duration, chordSymbol) => new _src_stavenote__WEBPACK_IMPORTED_MODULE_5__.StaveNote({ keys, duration, stem_direction: -1 }).addModifier(chordSymbol, 0); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(10, y, 400).addClef('treble').setContext(ctx).draw(); + const notes = [ + note(['c/4', 'f/4', 'a/4'], 'q', chords[0]), + note(['c/4', 'e/4', 'b/4'], 'q', chords[1]).addModifier(new _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental('b'), 2), + note(['c/4', 'e/4', 'g/4'], 'q', chords[2]), + note(['c/4', 'f/4', 'a/4'], 'q', chords[3]).addModifier(new _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental('#'), 1), + ]; + _src_formatter__WEBPACK_IMPORTED_MODULE_3__.Formatter.FormatAndDraw(ctx, stave, notes); + } + const chords = [ + f.ChordSymbol({ vJustify: 'bottom' }).addGlyphOrText('F'), + f.ChordSymbol({ vJustify: 'bottom' }).addGlyphOrText('C7'), + f.ChordSymbol({ vJustify: 'bottom' }).addLine(12), + f.ChordSymbol({ vJustify: 'bottom' }).addText('A').addGlyphSuperscript('dim'), + ]; + draw(chords, 10); + ok(true, 'Bottom Stem Down Chord Symbol'); +} +function doubleBottom(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 260); + const ctx = f.getContext(); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + function draw(chords, chords2, y) { + // Helper function to create a StaveNote with two ChordSymbols attached. + const note = (keys, duration, chordSymbol1, chordSymbol2) => new _src_stavenote__WEBPACK_IMPORTED_MODULE_5__.StaveNote({ keys, duration }).addModifier(chordSymbol1, 0).addModifier(chordSymbol2, 0); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(10, y, 450).addClef('treble').setContext(ctx).draw(); + const notes = [ + note(['c/4', 'f/4', 'a/4'], 'q', chords[0], chords2[0]), + note(['c/4', 'e/4', 'b/4'], 'q', chords[1], chords2[1]).addModifier(new _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental('b'), 2), + note(['c/4', 'e/4', 'g/4'], 'q', chords[2], chords2[2]), + note(['c/4', 'f/4', 'a/4'], 'q', chords[3], chords2[3]).addModifier(new _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental('#'), 1), + ]; + _src_formatter__WEBPACK_IMPORTED_MODULE_3__.Formatter.FormatAndDraw(ctx, stave, notes); + } + const chords1 = [ + f.ChordSymbol({ vJustify: 'bottom' }).addText('I').addTextSuperscript('6').addTextSubscript('4'), + f.ChordSymbol({ vJustify: 'bottom' }).addGlyphOrText('V'), + f.ChordSymbol({ vJustify: 'bottom' }).addLine(12), + f.ChordSymbol({ vJustify: 'bottom' }).addGlyphOrText('V/V'), + ]; + const chords2 = [ + f.ChordSymbol({ vJustify: 'bottom' }).addText('T'), + f.ChordSymbol({ vJustify: 'bottom' }).addText('D'), + f.ChordSymbol({ vJustify: 'bottom' }).addText('D'), + f.ChordSymbol({ vJustify: 'bottom' }).addText('SD'), + ]; + draw(chords1, chords2, 10); + ok(true, '2 Bottom Chord Symbol'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(ChordSymbolTests); + + + +/***/ }), + +/***/ "./tests/clef_tests.ts": +/*!*****************************!*\ + !*** ./tests/clef_tests.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ClefTests": () => (/* binding */ ClefTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Clef Tests + +const ClefTests = { + Start() { + QUnit.module('Clef'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Clef Test', draw); + run('Clef End Test', drawEnd); + run('Small Clef Test', drawSmall); + run('Small Clef End Test', drawSmallEnd); + run('Clef Change Test', drawClefChange); + }, +}; +function draw(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 800, 120); + f.Stave() + .addClef('treble') + .addClef('treble', 'default', '8va') + .addClef('treble', 'default', '8vb') + .addClef('alto') + .addClef('tenor') + .addClef('soprano') + .addClef('bass') + .addClef('bass', 'default', '8vb') + .addClef('mezzo-soprano') + .addClef('baritone-c') + .addClef('baritone-f') + .addClef('subbass') + .addClef('percussion') + .addClef('french') + .addEndClef('treble'); + f.draw(); + ok(true, 'all pass'); +} +function drawEnd(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 800, 120); + f.Stave() + .addClef('bass') + .addEndClef('treble') + .addEndClef('treble', 'default', '8va') + .addEndClef('treble', 'default', '8vb') + .addEndClef('alto') + .addEndClef('tenor') + .addEndClef('soprano') + .addEndClef('bass') + .addEndClef('bass', 'default', '8vb') + .addEndClef('mezzo-soprano') + .addEndClef('baritone-c') + .addEndClef('baritone-f') + .addEndClef('subbass') + .addEndClef('percussion') + .addEndClef('french'); + f.draw(); + ok(true, 'all pass'); +} +function drawSmall(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 800, 120); + f.Stave() + .addClef('treble', 'small') + .addClef('treble', 'small', '8va') + .addClef('treble', 'small', '8vb') + .addClef('alto', 'small') + .addClef('tenor', 'small') + .addClef('soprano', 'small') + .addClef('bass', 'small') + .addClef('bass', 'small', '8vb') + .addClef('mezzo-soprano', 'small') + .addClef('baritone-c', 'small') + .addClef('baritone-f', 'small') + .addClef('subbass', 'small') + .addClef('percussion', 'small') + .addClef('french', 'small') + .addEndClef('treble', 'small'); + f.draw(); + ok(true, 'all pass'); +} +function drawSmallEnd(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 800, 120); + f.Stave() + .addClef('bass', 'small') + .addEndClef('treble', 'small') + .addEndClef('treble', 'small', '8va') + .addEndClef('treble', 'small', '8vb') + .addEndClef('alto', 'small') + .addEndClef('tenor', 'small') + .addEndClef('soprano', 'small') + .addEndClef('bass', 'small') + .addEndClef('bass', 'small', '8vb') + .addEndClef('mezzo-soprano', 'small') + .addEndClef('baritone-c', 'small') + .addEndClef('baritone-f', 'small') + .addEndClef('subbass', 'small') + .addEndClef('percussion', 'small') + .addEndClef('french', 'small'); + f.draw(); + ok(true, 'all pass'); +} +function drawClefChange(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 800, 180); + const stave = f.Stave().addClef('treble'); + const notes = [ + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'treble' }), + f.ClefNote({ type: 'alto', options: { size: 'small' } }), + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'alto' }), + f.ClefNote({ type: 'tenor', options: { size: 'small' } }), + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'tenor' }), + f.ClefNote({ type: 'soprano', options: { size: 'small' } }), + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'soprano' }), + f.ClefNote({ type: 'bass', options: { size: 'small' } }), + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'bass' }), + f.ClefNote({ type: 'mezzo-soprano', options: { size: 'small' } }), + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'mezzo-soprano' }), + f.ClefNote({ type: 'baritone-c', options: { size: 'small' } }), + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'baritone-c' }), + f.ClefNote({ type: 'baritone-f', options: { size: 'small' } }), + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'baritone-f' }), + f.ClefNote({ type: 'subbass', options: { size: 'small' } }), + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'subbass' }), + f.ClefNote({ type: 'french', options: { size: 'small' } }), + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'french' }), + f.ClefNote({ type: 'treble', options: { size: 'small', annotation: '8vb' } }), + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'treble', octave_shift: -1 }), + f.ClefNote({ type: 'treble', options: { size: 'small', annotation: '8va' } }), + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'treble', octave_shift: 1 }), + ]; + const voice = f.Voice({ time: '12/4' }).addTickables(notes); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'all pass'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(ClefTests); + + + +/***/ }), + +/***/ "./tests/curve_tests.ts": +/*!******************************!*\ + !*** ./tests/curve_tests.ts ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "CurveTests": () => (/* binding */ CurveTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_curve__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/curve */ "./src/curve.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Curve Tests + + +const CurveTests = { + Start() { + QUnit.module('Curve'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Simple Curve', simple); + run('Rounded Curve', rounded); + run('Thick Thin Curves', thickThin); + run('Top Curve', top); + }, +}; +/** + * Helper function. Each test case passes in a set of notes and + * a setupCurves() callback which uses Factory.Curve(...) to build the curves. + * Curves can be used to indicate slurs (legato articulation). + */ +function createTest(noteGroup1, noteGroup2, setupCurves) { + return (options) => { + const factory = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 350, 200); + const stave = factory.Stave({ y: 50 }); + const score = factory.EasyScore(); + // Use .reduce(concat) to flatten the two StaveNote[] into a single StaveNote[]. + const staveNotes = [ + score.beam(score.notes(...noteGroup1)), + score.beam(score.notes(...noteGroup2)), // group 2 + ].reduce(_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.concat); + setupCurves(factory, staveNotes); + const voices = [score.voice(staveNotes, { time: '4/4' })]; + factory.Formatter().joinVoices(voices).formatToStave(voices, stave); + factory.draw(); + ok('Simple Curve'); + }; +} +const simple = createTest(['c4/8, f5, d5, g5', { stem: 'up' }], // beamGroup1 +['d6/8, f5, d5, g5', { stem: 'down' }], // beamGroup2 +(f, notes) => { + f.Curve({ + from: notes[0], + to: notes[3], + options: { + cps: [ + { x: 0, y: 10 }, + { x: 0, y: 50 }, + ], + }, + }); + f.Curve({ + from: notes[4], + to: notes[7], + options: { + cps: [ + { x: 0, y: 10 }, + { x: 0, y: 20 }, + ], + }, + }); +}); +const rounded = createTest(['c5/8, f4, d4, g5', { stem: 'up' }], // beamGroup1 +['d5/8, d6, d6, g5', { stem: 'down' }], // beamGroup2 +(f, notes) => { + f.Curve({ + from: notes[0], + to: notes[3], + options: { + x_shift: -10, + y_shift: 30, + cps: [ + { x: 0, y: 20 }, + { x: 0, y: 50 }, + ], + }, + }); + f.Curve({ + from: notes[4], + to: notes[7], + options: { + cps: [ + { x: 0, y: 50 }, + { x: 0, y: 50 }, + ], + }, + }); +}); +const thickThin = createTest(['c5/8, f4, d4, g5', { stem: 'up' }], // beamGroup1 +['d5/8, d6, d6, g5', { stem: 'down' }], // beamGroup2 +(f, notes) => { + f.Curve({ + from: notes[0], + to: notes[3], + options: { + thickness: 10, + x_shift: -10, + y_shift: 30, + cps: [ + { x: 0, y: 20 }, + { x: 0, y: 50 }, + ], + }, + }); + f.Curve({ + from: notes[4], + to: notes[7], + options: { + thickness: 0, + cps: [ + { x: 0, y: 50 }, + { x: 0, y: 50 }, + ], + }, + }); +}); +const top = createTest(['c5/8, f4, d4, g5', { stem: 'up' }], // beamGroup1 +['d5/8, d6, d6, g5', { stem: 'down' }], // beamGroup2 +(f, notes) => { + f.Curve({ + from: notes[0], + to: notes[7], + options: { + x_shift: -3, + y_shift: 10, + position: _src_curve__WEBPACK_IMPORTED_MODULE_1__.CurvePosition.NEAR_TOP, + position_end: _src_curve__WEBPACK_IMPORTED_MODULE_1__.CurvePosition.NEAR_HEAD, + cps: [ + { x: 0, y: 20 }, + { x: 40, y: 80 }, + ], + }, + }); +}); +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(CurveTests); + + + +/***/ }), + +/***/ "./tests/dot_tests.ts": +/*!****************************!*\ + !*** ./tests/dot_tests.ts ***! + \****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "DotTests": () => (/* binding */ DotTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_beam__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/beam */ "./src/beam.ts"); +/* harmony import */ var _src_dot__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/dot */ "./src/dot.ts"); +/* harmony import */ var _src_formatter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/formatter */ "./src/formatter.ts"); +/* harmony import */ var _src_modifiercontext__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/modifiercontext */ "./src/modifiercontext.ts"); +/* harmony import */ var _src_note__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/note */ "./src/note.ts"); +/* harmony import */ var _src_stave__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/stave */ "./src/stave.ts"); +/* harmony import */ var _src_stavenote__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/stavenote */ "./src/stavenote.ts"); +/* harmony import */ var _src_tickcontext__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/tickcontext */ "./src/tickcontext.ts"); +/* harmony import */ var _src_voice__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/voice */ "./src/voice.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Dot Tests + + + + + + + + + + +const DotTests = { + Start() { + QUnit.module('Dot'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Basic', basic); + run('Multi Voice', multiVoice); + }, +}; +/** + * Helper function for the basic test case below. + */ +function showOneNote(note1, stave, ctx, x) { + const modifierContext = new _src_modifiercontext__WEBPACK_IMPORTED_MODULE_4__.ModifierContext(); + note1.setStave(stave).addToModifierContext(modifierContext); + new _src_tickcontext__WEBPACK_IMPORTED_MODULE_8__.TickContext().addTickable(note1).preFormat().setX(x); + note1.setContext(ctx).draw(); + _src_note__WEBPACK_IMPORTED_MODULE_5__.Note.plotMetrics(ctx, note1, 140); +} +function basic(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 1000, 240); + ctx.setFillStyle('#221'); + ctx.setStrokeStyle('#221'); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_6__.Stave(10, 10, 975); + stave.setContext(ctx); + stave.draw(); + const notes = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_7__.StaveNote({ keys: ['c/4', 'e/4', 'a/4', 'b/4'], duration: 'w' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_7__.StaveNote({ keys: ['a/4', 'b/4', 'c/5'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_7__.StaveNote({ keys: ['g/4', 'a/4', 'b/4'], duration: '4', stem_direction: -1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_7__.StaveNote({ keys: ['e/4', 'f/4', 'b/4', 'c/5'], duration: '4' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_7__.StaveNote({ + keys: ['g/4', 'a/4', 'd/5', 'e/5', 'g/5'], + duration: '4', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_7__.StaveNote({ keys: ['g/4', 'b/4', 'd/5', 'e/5'], duration: '4', stem_direction: -1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_7__.StaveNote({ keys: ['e/4', 'g/4', 'b/4', 'c/5'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_7__.StaveNote({ keys: ['d/4', 'e/4', 'f/4', 'a/4', 'c/5', 'e/5', 'g/5'], duration: '2' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_7__.StaveNote({ + keys: ['f/4', 'g/4', 'a/4', 'b/4', 'c/5', 'e/5', 'g/5'], + duration: '16', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_7__.StaveNote({ keys: ['f/4', 'g/4', 'a/4', 'b/4', 'c/5', 'e/5', 'g/5'], duration: '16', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_7__.StaveNote({ + keys: ['e/4', 'g/4', 'a/4', 'b/4', 'c/5', 'e/5', 'f/5'], + duration: '16', + stem_direction: 1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_7__.StaveNote({ + keys: ['e/4', 'g/4', 'a/4', 'b/4', 'c/5'], + duration: '16', + stem_direction: 1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_7__.StaveNote({ keys: ['e/4', 'a/4', 'b/4', 'c/5'], duration: '16', stem_direction: 1 }), + ]; + _src_dot__WEBPACK_IMPORTED_MODULE_2__.Dot.buildAndAttach(notes, { all: true }); + _src_dot__WEBPACK_IMPORTED_MODULE_2__.Dot.buildAndAttach([notes[7], notes[8], notes[9]], { all: true }); + _src_dot__WEBPACK_IMPORTED_MODULE_2__.Dot.buildAndAttach([notes[8], notes[9]], { all: true }); + const beam = new _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam(notes.slice(notes.length - 2)); + for (let i = 0; i < notes.length; i++) { + showOneNote(notes[i], stave, ctx, 30 + i * 65); + const dots = notes[i].getModifiersByType('Dot'); + ok(dots.length > 0, 'Note ' + i + ' has dots'); + for (let j = 0; j < dots.length; ++j) { + ok(dots[j].getWidth() > 0, 'Dot ' + j + ' has width set'); + } + } + beam.setContext(ctx).draw(); + _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.plotLegendForNoteWidth(ctx, 890, 140); + ok(true, 'Full Dot'); +} +function multiVoice(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 750, 300); + ctx.setFillStyle('#221'); + ctx.setStrokeStyle('#221'); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_6__.Stave(30, 45, 700).setContext(ctx).draw(); + const notes1 = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_7__.StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: '2', stem_direction: -1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_7__.StaveNote({ keys: ['c/4', 'e/4', 'c/5'], duration: '2', stem_direction: -1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_7__.StaveNote({ keys: ['d/4', 'c/5', 'd/5'], duration: '2', stem_direction: -1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_7__.StaveNote({ keys: ['d/4', 'c/5', 'd/5'], duration: '8', stem_direction: -1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_7__.StaveNote({ keys: ['d/4', 'c/5', 'd/5'], duration: '8', stem_direction: -1 }), + ]; + _src_dot__WEBPACK_IMPORTED_MODULE_2__.Dot.buildAndAttach([notes1[0], notes1[2], notes1[3], notes1[4]], { all: true }); + _src_dot__WEBPACK_IMPORTED_MODULE_2__.Dot.buildAndAttach([notes1[0], notes1[2], notes1[3], notes1[4]], { all: true }); + _src_dot__WEBPACK_IMPORTED_MODULE_2__.Dot.buildAndAttach([notes1[1]], { index: 0 }); + _src_dot__WEBPACK_IMPORTED_MODULE_2__.Dot.buildAndAttach([notes1[1]], { index: 0 }); + _src_dot__WEBPACK_IMPORTED_MODULE_2__.Dot.buildAndAttach([notes1[1]], { index: 1 }); + _src_dot__WEBPACK_IMPORTED_MODULE_2__.Dot.buildAndAttach([notes1[1]], { index: 1 }); + _src_dot__WEBPACK_IMPORTED_MODULE_2__.Dot.buildAndAttach([notes1[1]], { index: 2 }); + _src_dot__WEBPACK_IMPORTED_MODULE_2__.Dot.buildAndAttach([notes1[1]], { index: 2 }); + _src_dot__WEBPACK_IMPORTED_MODULE_2__.Dot.buildAndAttach([notes1[1]], { index: 2 }); + _src_dot__WEBPACK_IMPORTED_MODULE_2__.Dot.buildAndAttach([notes1[2], notes1[3], notes1[4]]); + const notes2 = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_7__.StaveNote({ keys: ['d/5', 'a/5', 'b/5'], duration: '2', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_7__.StaveNote({ keys: ['d/5', 'a/5', 'b/5'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_7__.StaveNote({ keys: ['d/5', 'a/5', 'b/5'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_7__.StaveNote({ keys: ['d/5', 'g/5', 'a/5', 'b/5'], duration: '8', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_7__.StaveNote({ keys: ['d/5', 'a/5', 'b/5'], duration: '8', stem_direction: 1 }), + ]; + _src_dot__WEBPACK_IMPORTED_MODULE_2__.Dot.buildAndAttach(notes2, { all: true }); + _src_dot__WEBPACK_IMPORTED_MODULE_2__.Dot.buildAndAttach([notes2[1]], { all: true }); + const voice1 = new _src_voice__WEBPACK_IMPORTED_MODULE_9__.Voice().setMode(_src_voice__WEBPACK_IMPORTED_MODULE_9__.Voice.Mode.SOFT).addTickables(notes1); + const voice2 = new _src_voice__WEBPACK_IMPORTED_MODULE_9__.Voice().setMode(_src_voice__WEBPACK_IMPORTED_MODULE_9__.Voice.Mode.SOFT).addTickables(notes2); + const formatter = new _src_formatter__WEBPACK_IMPORTED_MODULE_3__.Formatter().joinVoices([voice1, voice2]); + formatter.format([voice1, voice2], 700); + voice1.draw(ctx, stave); + voice2.draw(ctx, stave); + notes1.forEach((note) => _src_note__WEBPACK_IMPORTED_MODULE_5__.Note.plotMetrics(ctx, note, 190)); + notes2.forEach((note) => _src_note__WEBPACK_IMPORTED_MODULE_5__.Note.plotMetrics(ctx, note, 20)); + _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.plotLegendForNoteWidth(ctx, 620, 220); + ok(true, 'Full Dot'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(DotTests); + + + +/***/ }), + +/***/ "./tests/easyscore_tests.ts": +/*!**********************************!*\ + !*** ./tests/easyscore_tests.ts ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "EasyScoreTests": () => (/* binding */ EasyScoreTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_articulation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/articulation */ "./src/articulation.ts"); +/* harmony import */ var _src_easyscore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/easyscore */ "./src/easyscore.ts"); +/* harmony import */ var _src_frethandfinger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/frethandfinger */ "./src/frethandfinger.ts"); +/* harmony import */ var _src_modifier__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/modifier */ "./src/modifier.ts"); +/* harmony import */ var _src_parenthesis__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/parenthesis */ "./src/parenthesis.ts"); +/* harmony import */ var _src_staveconnector__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/staveconnector */ "./src/staveconnector.ts"); +/* harmony import */ var _src_stem__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/stem */ "./src/stem.ts"); +/* harmony import */ var _src_tuplet__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/tuplet */ "./src/tuplet.ts"); +// [VexFlow](https://vexflow.com/) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// EasyScore Tests + + + + + + + + + +const EasyScoreTests = { + Start() { + QUnit.module('EasyScore'); + test('Basic', basic); + test('Accidentals', accidentals); + test('Durations', durations); + test('Chords', chords); + test('Dots', dots); + test('Types', types); + test('Options', options); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Draw Basic', drawBasicTest); + run('Draw Basic Muted', drawBasicMutedTest); + run('Draw Basic Harmonic', drawBasicHarmonicTest); + run('Draw Basic Slash', drawBasicSlashTest); + run('Draw Ghostnote Basic', drawGhostBasicTest); + run('Draw Ghostnote Dotted', drawGhostDottedTest); + run('Draw Parenthesised', drawParenthesisedTest); + run('Draw Accidentals', drawAccidentalsTest); + run('Draw Beams', drawBeamsTest); + run('Draw Tuplets', drawTupletsTest); + run('Draw Dots', drawDotsTest); + run('Draw Options', drawOptionsTest); + run('Draw Fingerings', drawFingeringsTest); + run('Keys', keys); + }, +}; +/** + * Use Function.prototype.bind() to create shortcut methods. + * This can improve the readability of your EasyScore code. + */ +function createShortcuts(score) { + return { + voice: score.voice.bind(score), + notes: score.notes.bind(score), + beam: score.beam.bind(score), + tuplet: score.tuplet.bind(score), + }; +} +/** + * Test case verifies: + * - all strings in `mustPass` parse correctly + * - all strings in `mustFail` fail to parse (i.e., Result.success is `false`). + */ +function basic() { + const score = new _src_easyscore__WEBPACK_IMPORTED_MODULE_2__.EasyScore(); + const mustPass = ['c4', 'c#4', 'c4/r', 'c#5', 'c3/m', 'c3//m', 'c3//h', 'c3/s', 'c3//s', 'c3/g', 'c3//g']; + const mustFail = ['', '()', '7', '(c#4 e5 g6']; + mustPass.forEach((line) => equal(score.parse(line).success, true, line)); + mustFail.forEach((line) => equal(score.parse(line).success, false, line)); +} +function accidentals() { + const score = new _src_easyscore__WEBPACK_IMPORTED_MODULE_2__.EasyScore(); + const mustPass = [ + 'c3', + 'c##3, cb3', + 'Cn3', + 'f3//m', + '(c##3 cbb3 cn3), cb3', + 'cbbs7', + 'cbb7', + 'cbss7', + 'cbs7', + 'cb7', + 'cdb7', + 'cd7', + 'c##7', + 'c#7', + 'cn7', + 'c++-7', + 'c++7', + 'c+-7', + 'c+7', + '(cbs3 bbs3 dbs3), ebs3', + '(cd7 cbb3 cn3), cb3', + 'co7', + 'ck7', + ]; + const mustFail = [ + 'ct3', + 'cdbb7', + '(cq cbb3 cn3), cb3', + '(cdd7 cbb3 cn3), cb3', + 'cbbbs7', + 'cbbss7', + 'cbsss7', + 'csbs7', + 'cddb7', + 'cddbb7', + 'cdd7', + 'c##b7', + 'c#bs7', + 'cnb#7', + 'c+#+b-d7', + 'c+--7', + 'c++--7', + 'c+++7', + 'cbk7', + 'cok7', + 'cko7', + 'c#s7', + ]; + mustPass.forEach((line) => equal(score.parse(line).success, true, line)); + mustFail.forEach((line) => equal(score.parse(line).success, false, line)); +} +function durations() { + const score = new _src_easyscore__WEBPACK_IMPORTED_MODULE_2__.EasyScore(); + const mustPass = ['c3/4', 'c##3/w, cb3', 'c##3/w, cb3/q', 'c##3/q, cb3/32', '(c##3 cbb3 cn3), cb3']; + const mustFail = ['Cn3/]', '/', '(cq cbb3 cn3), cb3', '(cdd7 cbb3 cn3), cb3']; + mustPass.forEach((line) => equal(score.parse(line).success, true, line)); + mustFail.forEach((line) => equal(score.parse(line).success, false, line)); +} +function chords() { + const score = new _src_easyscore__WEBPACK_IMPORTED_MODULE_2__.EasyScore(); + const mustPass = [ + '(c5)', + '(c3 e0 g9)', + '(c##4 cbb4 cn4)/w, (c#5 cb2 a3)/32', + '(d##4 cbb4 cn4)/w/r, (c#5 cb2 a3)', + '(c##4 cbb4 cn4)/4, (c#5 cb2 a3)', + '(c##4 cbb4 cn4)/m, (c#5 cb2 a3)', + ]; + const mustFail = ['(c)']; + mustPass.forEach((line) => equal(score.parse(line).success, true, line)); + mustFail.forEach((line) => equal(score.parse(line).success, false, line)); +} +function dots() { + const score = new _src_easyscore__WEBPACK_IMPORTED_MODULE_2__.EasyScore(); + const mustPass = [ + 'c3/4.', + 'c##3/w.., cb3', + 'f##3/s, cb3/q...', + 'c##3/q, cb3/32', + '(c##3 cbb3 cn3)., cb3', + '(c5).', + '(c##4 cbb4 cn4)/w.., (c#5 cb2 a3)/32', + ]; + const mustFail = ['.', 'c.#', 'c#4./4']; + mustPass.forEach((line) => equal(score.parse(line).success, true, line)); + mustFail.forEach((line) => equal(score.parse(line).success, false, line)); +} +function types() { + const score = new _src_easyscore__WEBPACK_IMPORTED_MODULE_2__.EasyScore(); + const mustPass = ['c3/4/m.', 'c##3//r.., cb3', 'c##3/m.., cb3', 'c##3/r.., cb3', 'd##3/w/s, cb3/q...', 'Fb4']; + const mustFail = ['c4/q/U', '(c##4, cbb4 cn4)/w.., (c#5 cb2 a3)/32', 'z#3']; + mustPass.forEach((line) => equal(score.parse(line).success, true, line)); + mustFail.forEach((line) => equal(score.parse(line).success, false, line)); +} +function options() { + const score = new _src_easyscore__WEBPACK_IMPORTED_MODULE_2__.EasyScore(); + const mustPass = [ + 'c3/4.[foo="bar"]', + 'c##3/w.., cb3[id="blah"]', + 'c##3/q, cb3/32', + '(c##3 cbb3 cn3).[blah="bod4o"], cb3', + '(c5)[fooooo="booo"]', + 'c#5[id="foobar"]', + ]; + const mustFail = ['.[', 'f##3/w[], cb3/q...']; + mustPass.forEach((line) => equal(score.parse(line).success, true, line)); + mustFail.forEach((line) => equal(score.parse(line).success, false, line)); +} +function drawBasicTest(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 350); + const score = f.EasyScore(); + const system = f.System(); + const { voice, notes } = createShortcuts(score); + system + .addStave({ + voices: [ + voice(notes('(d4 e4 g4)/q, c4/q, c4/q/r, c4/q', { stem: 'down' })), + voice(notes('c#5/h., c5/q', { stem: 'up' })), + ], + }) + .addClef('treble'); + system + .addStave({ + voices: [voice(notes('c#3/q, cn3/q, bb3/q, d##3/q', { clef: 'bass' }))], + }) + .addClef('bass'); + system.addConnector().setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_6__.StaveConnector.type.BRACKET); + f.draw(); + expect(0); +} +function drawBasicMutedTest(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 350); + const score = f.EasyScore(); + const system = f.System(); + const { voice, notes } = createShortcuts(score); + system + .addStave({ + voices: [ + voice(notes('(d4 e4 g4)/q/m, c4/q/m, c4/q/r, c4/q/m', { stem: 'down' })), + voice(notes('c#5/h/m., c5/q/m', { stem: 'up' })), + ], + }) + .addClef('treble'); + system + .addStave({ + voices: [voice(notes('c#3/q/m, cn3/q/m, bb3/q/m, d##3/q/m', { clef: 'bass' }))], + }) + .addClef('bass'); + system.addConnector().setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_6__.StaveConnector.type.BRACKET); + f.draw(); + expect(0); +} +function drawBasicHarmonicTest(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 350); + const score = f.EasyScore(); + const system = f.System(); + const { voice, notes } = createShortcuts(score); + system + .addStave({ + voices: [ + voice(notes('(d4 e4 g4)/q/h, c4/q/h, c4/q/r, c4/q/h', { stem: 'down' })), + voice(notes('c#5/h/h., c5/q/h', { stem: 'up' })), + ], + }) + .addClef('treble'); + system + .addStave({ + voices: [voice(notes('c#3/q/h, cn3/q/h, bb3/q/h, d##3/q/h', { clef: 'bass' }))], + }) + .addClef('bass'); + system.addConnector().setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_6__.StaveConnector.type.BRACKET); + f.draw(); + expect(0); +} +function drawBasicSlashTest(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 350); + const score = f.EasyScore(); + const system = f.System(); + const { voice, notes } = createShortcuts(score); + system + .addStave({ + voices: [ + voice(notes('(d4 e4 g4)/q/s, c4/q/s, c4/q/r, c4/q/s', { stem: 'down' })), + voice(notes('c#5/h/s., c5/q/s', { stem: 'up' })), + ], + }) + .addClef('treble'); + system + .addStave({ + voices: [voice(notes('c#3/q/s, cn3/q/s, bb3/q/s, d##3/q/s', { clef: 'bass' }))], + }) + .addClef('bass'); + system.addConnector().setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_6__.StaveConnector.type.BRACKET); + f.draw(); + expect(0); +} +function drawGhostBasicTest(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 550); + const score = f.EasyScore(); + const system = f.System(); + system.addStave({ + voices: [ + score.voice([ + ...score.notes('f#5/4, f5, db5, c5', { stem: 'up' }), + ...score.beam(score.notes('c5/8, d5, fn5, e5', { stem: 'up' })), + ...score.beam(score.notes('d5, c5', { stem: 'up' })), + ], { time: '7/4' }), + score.voice(score.notes('c4/h/g, f4/4, c4/4/g, e4/4, c4/8/g, d##4/8, c4/8, c4/8', { stem: 'down' }), { + time: '7/4', + }), + ], + }); + f.draw(); + expect(0); +} +function drawGhostDottedTest(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 550); + const score = f.EasyScore(); + const system = f.System(); + system.addStave({ + voices: [ + score.voice([ + ...score.notes('c4/4/g., fbb5/8, d5/4', { stem: 'up' }), + ...score.beam(score.notes('c5/8, c#5/16, d5/16', { stem: 'up' })), + ...score.notes('c4/2/g.., fn5/8', { stem: 'up' }), + ], { time: '8/4' }), + score.voice([ + ...score.notes('f#4/4', { stem: 'down' }), + ...score.beam(score.notes('e4/8, d4/8', { stem: 'down' })), + ...score.notes('c4/4/g.., cb4/16, c#4/h, d4/4', { stem: 'down' }), + ...score.beam(score.notes('fn4/8, e4/8', { stem: 'down' })), + ], { time: '8/4' }), + ], + }); + f.draw(); + expect(0); +} +function drawParenthesisedTest(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 350); + const score = f.EasyScore(); + const system = f.System(); + const { voice, notes } = createShortcuts(score); + const notes1 = notes('(d4 e4 g4)/q, c4/q, c4/q/r, c4/q', { stem: 'down' }); + _src_parenthesis__WEBPACK_IMPORTED_MODULE_5__.Parenthesis.buildAndAttach([notes1[0], notes1[3]]); + const notes2 = notes('c#5/h., c5/q', { stem: 'down' }); + _src_parenthesis__WEBPACK_IMPORTED_MODULE_5__.Parenthesis.buildAndAttach([notes2[0], notes2[1]]); + system + .addStave({ + voices: [voice(notes1), voice(notes2)], + }) + .addClef('treble'); + const notes3 = notes('c#3/q, cn3/q, bb3/q, d##3/q', { stem: 'down' }); + _src_parenthesis__WEBPACK_IMPORTED_MODULE_5__.Parenthesis.buildAndAttach(notes3); + system + .addStave({ + voices: [voice(notes3)], + }) + .addClef('bass'); + system.addConnector().setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_6__.StaveConnector.type.BRACKET); + f.draw(); + expect(0); +} +function drawAccidentalsTest(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 350); + const score = f.EasyScore(); + const system = f.System(); + const { voice, notes } = createShortcuts(score); + system + .addStave({ + voices: [ + voice(notes('(cbbs4 ebb4 gbss4)/q, cbs4/q, cdb4/q/r, cd4/q', { stem: 'down' })), + voice(notes('c++-5/h., c++5/q', { stem: 'up' })), + ], + }) + .addClef('treble'); + system + .addStave({ + voices: [voice(notes('c+-3/q, c+3/q, bb3/q, d##3/q', { clef: 'bass' }))], + }) + .addClef('bass'); + system.addConnector().setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_6__.StaveConnector.type.BRACKET); + f.draw(); + expect(0); +} +function drawBeamsTest(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 250); + const score = f.EasyScore(); + const system = f.System(); + const { voice, notes, beam } = createShortcuts(score); + system + .addStave({ + voices: [ + voice(notes('(c4 e4 g4)/q, c4/q, c4/q/r, c4/q', { stem: 'down' })), + voice([...notes('c#5/h.', { stem: 'up' }), ...beam(notes('c5/8, c5/8', { stem: 'up' }))]), + ], + }) + .addClef('treble'); + f.draw(); + expect(0); +} +function drawTupletsTest(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 250); + const score = f.EasyScore(); + const system = f.System(); + const { voice, notes, tuplet, beam } = createShortcuts(score); + // Voice 1, with stems pointed down. + const v1_tuplet = tuplet(notes('(c4 e4 g4)/q, cbb4/q, c4/q', { stem: 'down' }), { + location: _src_tuplet__WEBPACK_IMPORTED_MODULE_8__.Tuplet.LOCATION_BOTTOM, + }); + const v1_halfNote = notes('c4/h', { stem: 'down' }); + const v1 = voice([...v1_tuplet, ...v1_halfNote]); + // Voice 2, with stems pointed up. + const v2_halfNote = notes('c#5/h.', { stem: 'up' }); + const v2_tuplet = tuplet(beam(notes('cb5/8, cn5/8, c5/8', { stem: 'up' }))); + const v2 = voice([...v2_halfNote, ...v2_tuplet]); + system.addStave({ voices: [v1, v2] }).addClef('treble'); + f.draw(); + expect(0); +} +function drawDotsTest(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 250); + const score = f.EasyScore(); + const system = f.System(); + const { voice, notes } = createShortcuts(score); + system + .addStave({ + voices: [voice(notes('(c4 e4 g4)/8., (c4 e4 g4)/8.., (c4 e4 g4)/8..., (c4 e4 g4)/8...., (c4 e4 g4)/16...'))], + }) + .addClef('treble'); + f.draw(); + expect(0); +} +function drawOptionsTest(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 500, 200); + const score = f.EasyScore(); + const system = f.System(); + const notes = score.notes('B4/h[id="foobar", class="red,bold", stem="up", articulations="staccato.below,tenuto"], B4/q[articulations="accent.above"], B4/q[stem="down"]'); + system.addStave({ voices: [score.voice(notes)] }); + f.draw(); + const note0 = notes[0]; + const note1 = notes[1]; + const note0_modifier0 = note0.getModifiers()[0]; + const note0_modifier1 = note0.getModifiers()[1]; + const note1_modifier0 = note1.getModifiers()[0]; + equal(note0.getAttribute('id'), 'foobar'); + ok(note0.hasClass('red')); + ok(note0.hasClass('bold')); + equal(note0_modifier0.getCategory(), _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation.CATEGORY); + equal(note0_modifier0.type, 'a.'); + equal(note0_modifier0.getPosition(), _src_modifier__WEBPACK_IMPORTED_MODULE_4__.Modifier.Position.BELOW); + equal(note0_modifier1.getCategory(), _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation.CATEGORY); + equal(note0_modifier1.type, 'a-'); + equal(note0_modifier1.getPosition(), _src_modifier__WEBPACK_IMPORTED_MODULE_4__.Modifier.Position.ABOVE); + equal(note0.getStemDirection(), _src_stem__WEBPACK_IMPORTED_MODULE_7__.Stem.UP); + equal(note1_modifier0.getCategory(), _src_articulation__WEBPACK_IMPORTED_MODULE_1__.Articulation.CATEGORY); + equal(note1_modifier0.type, 'a>'); + equal(note1_modifier0.getPosition(), _src_modifier__WEBPACK_IMPORTED_MODULE_4__.Modifier.Position.ABOVE); + equal(notes[2].getStemDirection(), _src_stem__WEBPACK_IMPORTED_MODULE_7__.Stem.DOWN); +} +function drawFingeringsTest(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 500, 200); + const score = f.EasyScore(); + const system = f.System(); + const notes = score.notes('C4/q[fingerings="1"], E4[fingerings="3.above"], G4[fingerings="5.below"], (C4 E4 G4)[fingerings="1,3,5"]'); + system.addStave({ voices: [score.voice(notes)] }); + f.draw(); + const note0_modifier0 = notes[0].getModifiers()[0]; + equal(note0_modifier0.getCategory(), _src_frethandfinger__WEBPACK_IMPORTED_MODULE_3__.FretHandFinger.CATEGORY); + equal(note0_modifier0.getFretHandFinger(), '1'); + equal(note0_modifier0.getPosition(), _src_modifier__WEBPACK_IMPORTED_MODULE_4__.Modifier.Position.LEFT); + const note1_modifier0 = notes[1].getModifiers()[0]; + equal(note1_modifier0.getCategory(), _src_frethandfinger__WEBPACK_IMPORTED_MODULE_3__.FretHandFinger.CATEGORY); + equal(note1_modifier0.getFretHandFinger(), '3'); + equal(note1_modifier0.getPosition(), _src_modifier__WEBPACK_IMPORTED_MODULE_4__.Modifier.Position.ABOVE); + const note2_modifier0 = notes[2].getModifiers()[0]; + equal(note2_modifier0.getCategory(), _src_frethandfinger__WEBPACK_IMPORTED_MODULE_3__.FretHandFinger.CATEGORY); + equal(note2_modifier0.getFretHandFinger(), '5'); + equal(note2_modifier0.getPosition(), _src_modifier__WEBPACK_IMPORTED_MODULE_4__.Modifier.Position.BELOW); + const note3_modifiers = notes[3].getModifiers(); + const note3_modifier0 = note3_modifiers[0]; + const note3_modifier1 = note3_modifiers[1]; + const note3_modifier2 = note3_modifiers[2]; + equal(note3_modifier0.getCategory(), _src_frethandfinger__WEBPACK_IMPORTED_MODULE_3__.FretHandFinger.CATEGORY); + equal(note3_modifier0.getFretHandFinger(), '1'); + equal(note3_modifier0.getPosition(), _src_modifier__WEBPACK_IMPORTED_MODULE_4__.Modifier.Position.LEFT); + equal(note3_modifier1.getCategory(), _src_frethandfinger__WEBPACK_IMPORTED_MODULE_3__.FretHandFinger.CATEGORY); + equal(note3_modifier1.getFretHandFinger(), '3'); + equal(note3_modifier1.getPosition(), _src_modifier__WEBPACK_IMPORTED_MODULE_4__.Modifier.Position.LEFT); + equal(note3_modifier2.getCategory(), _src_frethandfinger__WEBPACK_IMPORTED_MODULE_3__.FretHandFinger.CATEGORY); + equal(note3_modifier2.getFretHandFinger(), '5'); + equal(note3_modifier2.getPosition(), _src_modifier__WEBPACK_IMPORTED_MODULE_4__.Modifier.Position.LEFT); +} +function keys(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 500, 200); + const score = f.EasyScore(); + const notes = score.notes('c#3/q, c##3, cb3, cbb3, cn3, c3, cbbs3, cbss3, cbs3, cdb3, cd3, c++-3, c++3, c+-3, c+3, co3, ck3'); + equal(notes[0].keys, 'c#/3'); + equal(notes[1].keys, 'c##/3'); + equal(notes[2].keys, 'cb/3'); + equal(notes[3].keys, 'cbb/3'); + equal(notes[4].keys, 'cn/3'); + for (let i = 5; i < notes.length; i++) { + equal(notes[i].keys, 'c/3'); + } +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(EasyScoreTests); + + + +/***/ }), + +/***/ "./tests/factory_tests.ts": +/*!********************************!*\ + !*** ./tests/factory_tests.ts ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "FactoryTests": () => (/* binding */ FactoryTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_factory__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/factory */ "./src/factory.ts"); +/* harmony import */ var _src_stavebarline__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/stavebarline */ "./src/stavebarline.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Factory Tests + + + +const FactoryTests = { + Start() { + QUnit.module('Factory'); + test('Defaults', defaults); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Draw', draw); + run('Draw Tab (repeat barlines must be aligned)', drawTab); + }, +}; +function defaults() { + // Throws RuntimeError: 'HTML DOM element not set in Factory' + throws(() => new _src_factory__WEBPACK_IMPORTED_MODULE_1__.Factory({ renderer: { elementId: '', width: 700, height: 500 } }), 'Empty string for elementId throws an exception.'); + const factory = new _src_factory__WEBPACK_IMPORTED_MODULE_1__.Factory({ + renderer: { elementId: null, width: 700, height: 500 }, + }); + // eslint-disable-next-line + // @ts-ignore access a protected member for testing purposes. + const options = factory.options; + equal(options.renderer.width, 700); + equal(options.renderer.height, 500); + equal(options.renderer.elementId, null); + equal(options.stave.space, 10); +} +function draw(options) { + const f = _src_factory__WEBPACK_IMPORTED_MODULE_1__.Factory.newFromElementId(options.elementId); + f.Stave().setClef('treble'); + f.draw(); + expect(0); +} +function drawTab(options) { + const factory = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 500, 400); + const system = factory.System({ width: 500 }); + const stave = factory.Stave().setClef('treble').setKeySignature('C#').setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_2__.Barline.type.REPEAT_BEGIN); + const voices = [factory.Voice().addTickables([factory.GhostNote({ duration: 'w' })])]; + system.addStave({ stave, voices }); + const tabStave = factory.TabStave().setClef('tab').setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_2__.Barline.type.REPEAT_BEGIN); + const tabVoices = [factory.Voice().addTickables([factory.GhostNote({ duration: 'w' })])]; + system.addStave({ stave: tabStave, voices: tabVoices }); + factory.draw(); + equal(stave.getModifiers()[0].getX(), tabStave.getModifiers()[0].getX()); + expect(1); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(FactoryTests); + + + +/***/ }), + +/***/ "./tests/font_tests.ts": +/*!*****************************!*\ + !*** ./tests/font_tests.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "FontTests": () => (/* binding */ FontTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_accidental__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/accidental */ "./src/accidental.ts"); +/* harmony import */ var _src_bend__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/bend */ "./src/bend.ts"); +/* harmony import */ var _src_canvascontext__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/canvascontext */ "./src/canvascontext.ts"); +/* harmony import */ var _src_element__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/element */ "./src/element.ts"); +/* harmony import */ var _src_flow__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/flow */ "./src/flow.ts"); +/* harmony import */ var _src_font__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/font */ "./src/font.ts"); +/* harmony import */ var _src_pedalmarking__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/pedalmarking */ "./src/pedalmarking.ts"); +/* harmony import */ var _src_stavenote__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/stavenote */ "./src/stavenote.ts"); +/* harmony import */ var _src_textbracket__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/textbracket */ "./src/textbracket.ts"); +/* harmony import */ var _src_textnote__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/textnote */ "./src/textnote.ts"); +/* harmony import */ var _src_voice__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/voice */ "./src/voice.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Font Tests + + + + + + + + + + + + +const FontTests = { + Start() { + QUnit.module('Font'); + test('setFont', setFont); + test('Parsing', fontParsing); + test('Sizes', fontSizes); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Set Text Font to Georgia', setTextFontToGeorgia); + run('Set Music Font to Petaluma', setMusicFontToPetaluma); + }, +}; +/** + * Test out the setFont method in various classes. + */ +function setFont() { + // Create a CanvasCntext and call setFont on it. + const canvas = document.createElement('canvas'); + canvas.width = 800; + canvas.height = 400; + // Set the font and get the font to verify that it matches. + // NOTE: Safari has a bug where it does not return the font-weight! + // https://github.com/0xfe/vexflow/issues/1240#issuecomment-986504088 + const ctx = new _src_canvascontext__WEBPACK_IMPORTED_MODULE_3__.CanvasContext(canvas.getContext('2d')); + ctx.setFont('PetalumaScript', '100px', 'normal', 'italic'); + equal(ctx.font, 'italic 100px PetalumaScript'); + const voice = new _src_voice__WEBPACK_IMPORTED_MODULE_11__.Voice(); + // Many elements do not override the default Element.TEXT_FONT. + propEqual(voice.fontInfo, _src_element__WEBPACK_IMPORTED_MODULE_4__.Element.TEXT_FONT); + voice.setFont('bold 32pt Arial'); + const fontInfo = voice.fontInfo; + equal(fontInfo === null || fontInfo === void 0 ? void 0 : fontInfo.size, '32pt'); + const flat = new _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental('b'); + // eslint-disable-next-line + // @ts-ignore access a protected member for testing purposes. + equal(flat.textFont, undefined); // The internal instance variable .textFont is undefined by default. + // Add italic to the default font as defined in Element.TEXT_FONT (since Accidental does not override TEXT_FONT). + flat.setFont(undefined, undefined, undefined, _src_font__WEBPACK_IMPORTED_MODULE_6__.FontStyle.ITALIC); + equal(flat.getFont(), 'italic 10pt Arial, sans-serif'); + // Anything that is not set will be reset to the defaults. + flat.setFont(undefined, undefined, _src_font__WEBPACK_IMPORTED_MODULE_6__.FontWeight.BOLD, undefined); + equal(flat.getFont(), 'bold 10pt Arial, sans-serif'); + flat.setFont(undefined, undefined, _src_font__WEBPACK_IMPORTED_MODULE_6__.FontWeight.BOLD, _src_font__WEBPACK_IMPORTED_MODULE_6__.FontStyle.ITALIC); + equal(flat.getFont(), 'italic bold 10pt Arial, sans-serif'); + flat.setFont(undefined, undefined, _src_font__WEBPACK_IMPORTED_MODULE_6__.FontWeight.BOLD, 'oblique'); + equal(flat.getFont(), 'oblique bold 10pt Arial, sans-serif'); + // '' is equivalent to 'normal'. Neither will be included in the CSS font string. + flat.setFont(undefined, undefined, 'normal', ''); + equal(flat.getFont(), '10pt Arial, sans-serif'); +} +function fontParsing() { + const b = new _src_bend__WEBPACK_IMPORTED_MODULE_2__.Bend('1/2', true); + const bFont = b.fontInfo; + // Check the default font. + equal(bFont === null || bFont === void 0 ? void 0 : bFont.family, _src_font__WEBPACK_IMPORTED_MODULE_6__.Font.SANS_SERIF); + equal(bFont === null || bFont === void 0 ? void 0 : bFont.size, _src_font__WEBPACK_IMPORTED_MODULE_6__.Font.SIZE); + equal(bFont === null || bFont === void 0 ? void 0 : bFont.weight, _src_font__WEBPACK_IMPORTED_MODULE_6__.FontWeight.NORMAL); + equal(bFont === null || bFont === void 0 ? void 0 : bFont.style, _src_font__WEBPACK_IMPORTED_MODULE_6__.FontStyle.NORMAL); + const f1 = 'Roboto Slab, serif'; + const t = new _src_textnote__WEBPACK_IMPORTED_MODULE_10__.TextNote({ duration: '4', font: { family: f1 } }); + equal(f1, t.fontInfo.family); + const n1 = new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['e/5'], duration: '4' }); + const n2 = new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['c/5'], duration: '4' }); + const tb = new _src_textbracket__WEBPACK_IMPORTED_MODULE_9__.TextBracket({ start: n1, stop: n2 }); + const f2 = tb.fontInfo; + equal(f2 === null || f2 === void 0 ? void 0 : f2.size, 15); + equal(f2 === null || f2 === void 0 ? void 0 : f2.style, _src_font__WEBPACK_IMPORTED_MODULE_6__.FontStyle.ITALIC); + // The line-height /3 is currently ignored. + const f3 = _src_font__WEBPACK_IMPORTED_MODULE_6__.Font.fromCSSString(`bold 1.5em/3 "Lucida Sans Typewriter", "Lucida Console", Consolas, monospace`); + const f3SizeInPx = _src_font__WEBPACK_IMPORTED_MODULE_6__.Font.convertSizeToPixelValue(f3.size); + equal(f3SizeInPx, 24); +} +function fontSizes() { + { + const size = '17px'; + const sizeInEm = _src_font__WEBPACK_IMPORTED_MODULE_6__.Font.convertSizeToPixelValue(size) / _src_font__WEBPACK_IMPORTED_MODULE_6__.Font.scaleToPxFrom.em; + equal(sizeInEm, 1.0625); + } + { + const size = '2em'; + const sizeInPx = _src_font__WEBPACK_IMPORTED_MODULE_6__.Font.convertSizeToPixelValue(size); + equal(sizeInPx, 32); + } + { + const pedal = new _src_pedalmarking__WEBPACK_IMPORTED_MODULE_7__.PedalMarking([]); + equal(pedal.getFont(), 'italic bold 12pt Times New Roman, serif'); + equal(pedal.fontSizeInPoints, 12); + equal(pedal.fontSizeInPixels, 16); + const doubledSizePx = pedal.fontSizeInPixels * 2; // Double the font size. + equal(doubledSizePx, 32); + const doubledSizePt = _src_font__WEBPACK_IMPORTED_MODULE_6__.Font.scaleSize(pedal.fontSizeInPoints, 2); // Double the font size. + equal(doubledSizePt, 24); + equal(_src_font__WEBPACK_IMPORTED_MODULE_6__.Font.scaleSize('1.5em', 3), '4.5em'); + } +} +function setTextFontToGeorgia(options) { + const factory = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 400, 200); + const stave = factory.Stave({ y: 40 }); + const score = factory.EasyScore(); + const voice1 = score.voice([ + factory.StaveNote({ keys: ['c/4', 'e/4', 'a/4'], stem_direction: -1, duration: 'h' }), + factory.StaveNote({ keys: ['d/4', 'f/4'], stem_direction: -1, duration: 'q' }), + factory.StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: 'q' }), + ]); + const defaultFont = _src_textnote__WEBPACK_IMPORTED_MODULE_10__.TextNote.TEXT_FONT; + // Set the default before we instantiate TextNote objects with the factory. + _src_textnote__WEBPACK_IMPORTED_MODULE_10__.TextNote.TEXT_FONT = { + family: 'Georgia, Courier New, serif', + size: 14, + weight: 'bold', + style: 'italic', + }; + const voice2 = score.voice([ + factory + .TextNote({ text: 'Here are some fun lyrics...', duration: 'w' }) + .setJustification(_src_textnote__WEBPACK_IMPORTED_MODULE_10__.TextNote.Justification.LEFT), + ]); + const formatter = factory.Formatter(); + formatter.joinVoices([voice1, voice2]).formatToStave([voice1, voice2], stave); + factory.draw(); + // Restore the previous default, or else it will affect the rest of the tests. + _src_textnote__WEBPACK_IMPORTED_MODULE_10__.TextNote.TEXT_FONT = defaultFont; + ok(true); +} +function setMusicFontToPetaluma(options) { + _src_flow__WEBPACK_IMPORTED_MODULE_5__.Flow.setMusicFont('Petaluma'); + const factory = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 400, 200); + const stave = factory.Stave({ y: 40 }); + const score = factory.EasyScore(); + const voice = score.voice([ + factory.StaveNote({ keys: ['c/4', 'e/4', 'a/4'], stem_direction: -1, duration: 'h' }), + factory.StaveNote({ keys: ['d/4', 'f/4'], stem_direction: -1, duration: 'q' }), + factory.StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: 'q' }), + ]); + const formatter = factory.Formatter(); + formatter.joinVoices([voice]).formatToStave([voice], stave); + factory.draw(); + ok(true); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(FontTests); + + + +/***/ }), + +/***/ "./tests/formatter_tests.ts": +/*!**********************************!*\ + !*** ./tests/formatter_tests.ts ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "FormatterTests": () => (/* binding */ FormatterTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_accidental__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/accidental */ "./src/accidental.ts"); +/* harmony import */ var _src_annotation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/annotation */ "./src/annotation.ts"); +/* harmony import */ var _src_articulation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/articulation */ "./src/articulation.ts"); +/* harmony import */ var _src_beam__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/beam */ "./src/beam.ts"); +/* harmony import */ var _src_bend__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/bend */ "./src/bend.ts"); +/* harmony import */ var _src_dot__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/dot */ "./src/dot.ts"); +/* harmony import */ var _src_flow__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/flow */ "./src/flow.ts"); +/* harmony import */ var _src_font__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/font */ "./src/font.ts"); +/* harmony import */ var _src_formatter__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/formatter */ "./src/formatter.ts"); +/* harmony import */ var _src_frethandfinger__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/frethandfinger */ "./src/frethandfinger.ts"); +/* harmony import */ var _src_modifier__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/modifier */ "./src/modifier.ts"); +/* harmony import */ var _src_note__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../src/note */ "./src/note.ts"); +/* harmony import */ var _src_registry__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../src/registry */ "./src/registry.ts"); +/* harmony import */ var _src_stave__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../src/stave */ "./src/stave.ts"); +/* harmony import */ var _src_staveconnector__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../src/staveconnector */ "./src/staveconnector.ts"); +/* harmony import */ var _src_stavenote__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../src/stavenote */ "./src/stavenote.ts"); +/* harmony import */ var _src_stem__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../src/stem */ "./src/stem.ts"); +/* harmony import */ var _src_stringnumber__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../src/stringnumber */ "./src/stringnumber.ts"); +/* harmony import */ var _src_tables__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../src/tables */ "./src/tables.ts"); +/* harmony import */ var _src_tuplet__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../src/tuplet */ "./src/tuplet.ts"); +/* harmony import */ var _src_voice__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../src/voice */ "./src/voice.ts"); +/* harmony import */ var _mocks__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./mocks */ "./tests/mocks.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Formatter Tests + + + + + + + + + + + + + + + + + + + + + + + +const FormatterTests = { + Start() { + QUnit.module('Formatter'); + test('TickContext Building', buildTickContexts); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Whitespace and justify', rightJustify); + run('Notehead padding', noteHeadPadding); + run('Justification and alignment with accidentals', accidentalJustification); + run('Long measure taking full space', longMeasureProblems); + run('Vertical alignment - few unaligned beats', unalignedNoteDurations1); + run('Vertical alignment - many unaligned beats', unalignedNoteDurations2, { globalSoftmax: false }); + run('Vertical alignment - many unaligned beats (global softmax)', unalignedNoteDurations2, { globalSoftmax: true }); + run('Vertical alignment - many mixed elements', alignedMixedElements, { globalSoftmax: true }); + run('StaveNote - Justification', justifyStaveNotes); + run('Notes with Tab', notesWithTab); + run('Multiple Staves - Justified', multiStaves, { debug: true }); + run('Softmax', softMax); + run('Mixtime', mixTime); + run('Tight', tightNotes1); + run('Tight 2', tightNotes2); + run('Annotations', annotations); + run('Proportional Formatting - No Tuning', proportional, { debug: true, iterations: 0 }); + run('Proportional Formatting - No Justification', proportional, { justify: false, debug: true, iterations: 0 }); + run('Proportional Formatting (20 iterations)', proportional, { debug: true, iterations: 20, alpha: 0.5 }); + }, +}; +/** Calculate the glyph's width in the current music font. */ +// How is this different from Glyph.getWidth()? The numbers don't match up. +function getGlyphWidth(glyphName) { + // `38` seems to be the `font_scale` specified in many classes, such as + // Accidental, Articulation, Ornament, Strokes. Does this mean `38pt`??? + // + // However, tables.ts specifies: + // NOTATION_FONT_SCALE: 39, + // TABLATURE_FONT_SCALE: 39, + const musicFont = _src_tables__WEBPACK_IMPORTED_MODULE_19__.Tables.currentMusicFont(); + const glyph = musicFont.getGlyphs()[glyphName]; + const widthInEm = (glyph.x_max - glyph.x_min) / musicFont.getResolution(); + return widthInEm * 38 * _src_font__WEBPACK_IMPORTED_MODULE_8__.Font.scaleToPxFrom.pt; +} +function buildTickContexts() { + function createTickable(beat) { + return new _mocks__WEBPACK_IMPORTED_MODULE_22__.MockTickable().setTicks(beat); + } + const BEAT = (1 * _src_flow__WEBPACK_IMPORTED_MODULE_7__.Flow.RESOLUTION) / 4; + const tickables1 = [ + createTickable(BEAT).setWidth(10), + createTickable(BEAT * 2).setWidth(20), + createTickable(BEAT).setWidth(30), + ]; + const tickables2 = [ + createTickable(BEAT * 2).setWidth(10), + createTickable(BEAT).setWidth(20), + createTickable(BEAT).setWidth(30), + ]; + const voice1 = new _src_voice__WEBPACK_IMPORTED_MODULE_21__.Voice(_src_flow__WEBPACK_IMPORTED_MODULE_7__.Flow.TIME4_4); + const voice2 = new _src_voice__WEBPACK_IMPORTED_MODULE_21__.Voice(_src_flow__WEBPACK_IMPORTED_MODULE_7__.Flow.TIME4_4); + voice1.addTickables(tickables1); + voice2.addTickables(tickables2); + const formatter = new _src_formatter__WEBPACK_IMPORTED_MODULE_9__.Formatter(); + const tContexts = formatter.createTickContexts([voice1, voice2]); + equal(tContexts.list.length, 4, 'Voices should have four tick contexts'); + throws(() => formatter.getMinTotalWidth(), /NoMinTotalWidth/, 'Expected to throw exception'); + ok(formatter.preCalculateMinTotalWidth([voice1, voice2]), 'Successfully runs preCalculateMinTotalWidth'); + equal(formatter.getMinTotalWidth(), 88, 'Get minimum total width without passing voices'); + formatter.preFormat(); + equal(formatter.getMinTotalWidth(), 88, 'Minimum total width'); + equal(tickables1[0].getX(), tickables2[0].getX(), 'First notes of both voices have the same X'); + equal(tickables1[2].getX(), tickables2[2].getX(), 'Last notes of both voices have the same X'); + ok(tickables1[1].getX() < tickables2[1].getX(), 'Second note of voice 2 is to the right of the second note of voice 1'); +} +function rightJustify(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 1200, 300); + const getTickables = (time, n, duration) => { + const tickar = []; + let i = 0; + for (i = 0; i < n; ++i) { + tickar.push(new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['f/4'], duration })); + } + return new _src_voice__WEBPACK_IMPORTED_MODULE_21__.Voice(time).addTickables(tickar); + }; + const renderTest = (time, n, duration, x, width) => { + const formatter = f.Formatter(); + const stave = f.Stave({ x, y: 40, width }); + // stave.addClef('treble').addTimeSignature('4/4'); + const voice = getTickables(time, n, duration); + formatter.joinVoices([voice]).formatToStave([voice], stave); + stave.draw(); + voice.draw(f.getContext(), stave); + }; + renderTest({ num_beats: 4, beat_value: 4, resolution: 4 * 4096 }, 2, '2', 10, 300); + renderTest({ num_beats: 4, beat_value: 4, resolution: 4 * 4096 }, 1, 'w', 310, 300); + renderTest({ num_beats: 3, beat_value: 4, resolution: 4 * 4096 }, 3, '4', 610, 300); + renderTest({ num_beats: 3, beat_value: 4, resolution: 4 * 4096 }, 6, '8', 910, 300); + ok(true); +} +function noteHeadPadding(options) { + const registry = new _src_registry__WEBPACK_IMPORTED_MODULE_13__.Registry(); + _src_registry__WEBPACK_IMPORTED_MODULE_13__.Registry.enableDefaultRegistry(registry); + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 300); + const score = f.EasyScore(); + score.set({ time: '9/8' }); + const notes1 = score.notes('(d5 f5)/8,(c5 e5)/8,(d5 f5)/8,(c5 e5)/2.'); + const beams = [new _src_beam__WEBPACK_IMPORTED_MODULE_4__.Beam(notes1.slice(0, 3), true)]; + const voice1 = new _src_voice__WEBPACK_IMPORTED_MODULE_21__.Voice().setMode(_src_voice__WEBPACK_IMPORTED_MODULE_21__.Voice.Mode.SOFT); + const notes2 = score.notes('(g4 an4)/2.,(g4 a4)/4.', { clef: 'treble' }); + const voice2 = new _src_voice__WEBPACK_IMPORTED_MODULE_21__.Voice().setMode(_src_voice__WEBPACK_IMPORTED_MODULE_21__.Voice.Mode.SOFT); + voice2.addTickables(notes2); + voice1.addTickables(notes1); + const formatter = f.Formatter().joinVoices([voice1]).joinVoices([voice2]); + const width = formatter.preCalculateMinTotalWidth([voice1, voice2]); + formatter.format([voice1, voice2], width); + const staveWidth = width + _src_stave__WEBPACK_IMPORTED_MODULE_14__.Stave.defaultPadding; + const stave1 = f.Stave({ y: 50, width: staveWidth }); + const stave2 = f.Stave({ y: 150, width: staveWidth }); + stave1.draw(); + stave2.draw(); + voice1.draw(f.getContext(), stave1); + voice2.draw(f.getContext(), stave2); + beams.forEach((b) => b.setContext(f.getContext()).draw()); + ok(true); +} +function longMeasureProblems(options) { + const registry = new _src_registry__WEBPACK_IMPORTED_MODULE_13__.Registry(); + _src_registry__WEBPACK_IMPORTED_MODULE_13__.Registry.enableDefaultRegistry(registry); + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 1500, 300); + const score = f.EasyScore(); + score.set({ time: '4/4' }); + const notes1 = score.notes('b4/4,b4/8,b4/8,b4/4,b4/4,b4/2,b4/2,b4/4,b4/8,b4/8,b4/4,b4/4,b4/2,b4/2,b4/4,b4/8,b4/8,b4/4,b4/4,b4/2,b4/2,b4/4,b4/2,b4/8,b4/8'); + const voice1 = new _src_voice__WEBPACK_IMPORTED_MODULE_21__.Voice().setMode(_src_voice__WEBPACK_IMPORTED_MODULE_21__.Voice.Mode.SOFT); + const notes2 = score.notes('d3/4,(ab3 f4)/2,d3/4,ab3/4,d3/2,ab3/4,d3/4,ab3/2,d3/4,ab3/4,d3/2,ab3/4,d3/4,ab3/2,d3/4,ab3/4,d3/2,ab3/4,d4/4,d4/2,d4/4', { clef: 'bass' }); + const voice2 = new _src_voice__WEBPACK_IMPORTED_MODULE_21__.Voice().setMode(_src_voice__WEBPACK_IMPORTED_MODULE_21__.Voice.Mode.SOFT); + voice2.addTickables(notes2); + voice1.addTickables(notes1); + const formatter = f.Formatter().joinVoices([voice1]).joinVoices([voice2]); + const width = formatter.preCalculateMinTotalWidth([voice1, voice2]); + formatter.format([voice1, voice2], width); + const stave1 = f.Stave({ y: 50, width: width + _src_stave__WEBPACK_IMPORTED_MODULE_14__.Stave.defaultPadding }); + const stave2 = f.Stave({ y: 200, width: width + _src_stave__WEBPACK_IMPORTED_MODULE_14__.Stave.defaultPadding }); + stave1.draw(); + stave2.draw(); + voice1.draw(f.getContext(), stave1); + voice2.draw(f.getContext(), stave2); + ok(true); +} +function accidentalJustification(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 300); + const score = f.EasyScore(); + const notes11 = score.notes('a4/2, a4/4, a4/8, ab4/16, an4/16'); + const voice11 = score.voice(notes11, { time: '4/4' }); + const notes21 = score.notes('c4/2, d4/8, d4/8, e4/8, e4/8'); + const voice21 = score.voice(notes21, { time: '4/4' }); + let beams = _src_beam__WEBPACK_IMPORTED_MODULE_4__.Beam.generateBeams(notes11.slice(2)); + beams = beams.concat(beams, _src_beam__WEBPACK_IMPORTED_MODULE_4__.Beam.generateBeams(notes21.slice(1, 3))); + beams = beams.concat(_src_beam__WEBPACK_IMPORTED_MODULE_4__.Beam.generateBeams(notes21.slice(3))); + const formatter = f.Formatter({ softmaxFactor: 100 }).joinVoices([voice11]).joinVoices([voice21]); + const width = formatter.preCalculateMinTotalWidth([voice11, voice21]); + const stave11 = f.Stave({ y: 20, width: width + _src_stave__WEBPACK_IMPORTED_MODULE_14__.Stave.defaultPadding }); + const stave21 = f.Stave({ y: 130, width: width + _src_stave__WEBPACK_IMPORTED_MODULE_14__.Stave.defaultPadding }); + formatter.format([voice11, voice21], width); + const ctx = f.getContext(); + stave11.setContext(ctx).draw(); + stave21.setContext(ctx).draw(); + voice11.draw(ctx, stave11); + voice21.draw(ctx, stave21); + beams.forEach((b) => b.setContext(ctx).draw()); + ok(true); +} +function unalignedNoteDurations1(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 250); + const score = f.EasyScore(); + const notes11 = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['a/4'], duration: '8' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['b/4'], duration: '4' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['b/4'], duration: '8' }), + ]; + const notes21 = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['a/4'], duration: '16' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['b/4.'], duration: '4' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['a/4'], duration: '8d' }), + ]; + _src_dot__WEBPACK_IMPORTED_MODULE_6__.Dot.buildAndAttach([notes21[2]], { all: true }); + const ctx = f.getContext(); + const voice11 = score.voice(notes11, { time: '2/4' }).setMode(_src_voice__WEBPACK_IMPORTED_MODULE_21__.Voice.Mode.SOFT); + const voice21 = score.voice(notes21, { time: '2/4' }).setMode(_src_voice__WEBPACK_IMPORTED_MODULE_21__.Voice.Mode.SOFT); + const beams21 = _src_beam__WEBPACK_IMPORTED_MODULE_4__.Beam.generateBeams(notes21); + const beams11 = _src_beam__WEBPACK_IMPORTED_MODULE_4__.Beam.generateBeams(notes11); + const formatter = new _src_formatter__WEBPACK_IMPORTED_MODULE_9__.Formatter(); + formatter.joinVoices([voice11]); + formatter.joinVoices([voice21]); + const width = formatter.preCalculateMinTotalWidth([voice11, voice21]); + const stave11 = f.Stave({ y: 20, width: width + _src_stave__WEBPACK_IMPORTED_MODULE_14__.Stave.defaultPadding }); + const stave21 = f.Stave({ y: 130, width: width + _src_stave__WEBPACK_IMPORTED_MODULE_14__.Stave.defaultPadding }); + formatter.format([voice11, voice21], width); + stave11.setContext(ctx).draw(); + stave21.setContext(ctx).draw(); + voice11.draw(ctx, stave11); + voice21.draw(ctx, stave21); + beams21.forEach((b) => b.setContext(ctx).draw()); + beams11.forEach((b) => b.setContext(ctx).draw()); + ok(voice11.getTickables()[1].getX() > voice21.getTickables()[1].getX()); +} +function unalignedNoteDurations2(options) { + const notes1 = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['b/4'], duration: '8r' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['g/4'], duration: '16' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['c/5'], duration: '16' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['e/5'], duration: '16' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['g/4'], duration: '16' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['c/5'], duration: '16' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['e/5'], duration: '16' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['b/4'], duration: '8r' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['g/4'], duration: '16' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['c/5'], duration: '16' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['e/5'], duration: '16' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['g/4'], duration: '16' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['c/5'], duration: '16' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['e/5'], duration: '16' }), + ]; + const notes2 = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['a/4'], duration: '16r' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['e/4.'], duration: '8d' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['e/4'], duration: '4' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['a/4'], duration: '16r' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['e/4.'], duration: '8d' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['e/4'], duration: '4' }), + ]; + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 750, 280); + const context = f.getContext(); + const voice1 = new _src_voice__WEBPACK_IMPORTED_MODULE_21__.Voice({ num_beats: 4, beat_value: 4 }); + voice1.addTickables(notes1); + const voice2 = new _src_voice__WEBPACK_IMPORTED_MODULE_21__.Voice({ num_beats: 4, beat_value: 4 }); + voice2.addTickables(notes2); + const formatter = new _src_formatter__WEBPACK_IMPORTED_MODULE_9__.Formatter({ softmaxFactor: 100, globalSoftmax: options.params.globalSoftmax }); + formatter.joinVoices([voice1]); + formatter.joinVoices([voice2]); + const width = formatter.preCalculateMinTotalWidth([voice1, voice2]); + formatter.format([voice1, voice2], width); + const stave1 = new _src_stave__WEBPACK_IMPORTED_MODULE_14__.Stave(10, 40, width + _src_stave__WEBPACK_IMPORTED_MODULE_14__.Stave.defaultPadding); + const stave2 = new _src_stave__WEBPACK_IMPORTED_MODULE_14__.Stave(10, 100, width + _src_stave__WEBPACK_IMPORTED_MODULE_14__.Stave.defaultPadding); + stave1.setContext(context).draw(); + stave2.setContext(context).draw(); + voice1.draw(context, stave1); + voice2.draw(context, stave2); + ok(voice1.getTickables()[1].getX() > voice2.getTickables()[1].getX()); +} +function alignedMixedElements(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 800, 500); + const context = f.getContext(); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_14__.Stave(10, 200, 400); + const stave2 = new _src_stave__WEBPACK_IMPORTED_MODULE_14__.Stave(410, 200, 400); + const notes = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['c/5'], duration: '8' }) + .addModifier(new _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental('##'), 0) + .addModifier(new _src_frethandfinger__WEBPACK_IMPORTED_MODULE_10__.FretHandFinger('4').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_11__.ModifierPosition.BELOW), 0) + .addModifier(new _src_stringnumber__WEBPACK_IMPORTED_MODULE_18__.StringNumber('3').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_11__.ModifierPosition.BELOW), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_3__.Articulation('a.').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_11__.ModifierPosition.BELOW), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_3__.Articulation('a>').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_11__.ModifierPosition.BELOW), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_3__.Articulation('a^').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_11__.ModifierPosition.BELOW), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_3__.Articulation('am').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_11__.ModifierPosition.BELOW), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_3__.Articulation('a@u').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_11__.ModifierPosition.BELOW), 0) + .addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_2__.Annotation('yyyy').setVerticalJustification(_src_annotation__WEBPACK_IMPORTED_MODULE_2__.AnnotationVerticalJustify.BOTTOM), 0) + .addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_2__.Annotation('xxxx').setVerticalJustification(_src_annotation__WEBPACK_IMPORTED_MODULE_2__.AnnotationVerticalJustify.BOTTOM).setFont('sans-serif', 20), 0) + .addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_2__.Annotation('ttt').setVerticalJustification(_src_annotation__WEBPACK_IMPORTED_MODULE_2__.AnnotationVerticalJustify.BOTTOM).setFont('sans-serif', 20), 0), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['c/5'], duration: '8', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_17__.Stem.DOWN }) + .addModifier(new _src_stringnumber__WEBPACK_IMPORTED_MODULE_18__.StringNumber('3').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_11__.ModifierPosition.BELOW), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_3__.Articulation('a.').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_11__.ModifierPosition.BELOW), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_3__.Articulation('a>').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_11__.ModifierPosition.BELOW), 0), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['c/5'], duration: '8' }), + ]; + const notes2 = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['c/5'], duration: '8' }) + .addModifier(new _src_stringnumber__WEBPACK_IMPORTED_MODULE_18__.StringNumber('3').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_11__.ModifierPosition.ABOVE), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_3__.Articulation('a.').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_11__.ModifierPosition.ABOVE), 0) + .addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_2__.Annotation('yyyy').setVerticalJustification(_src_annotation__WEBPACK_IMPORTED_MODULE_2__.AnnotationVerticalJustify.TOP), 0), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['c/5'], duration: '8', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_17__.Stem.DOWN }) + .addModifier(new _src_frethandfinger__WEBPACK_IMPORTED_MODULE_10__.FretHandFinger('4').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_11__.ModifierPosition.ABOVE), 0) + .addModifier(new _src_stringnumber__WEBPACK_IMPORTED_MODULE_18__.StringNumber('3').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_11__.ModifierPosition.ABOVE), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_3__.Articulation('a.').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_11__.ModifierPosition.ABOVE), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_3__.Articulation('a>').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_11__.ModifierPosition.ABOVE), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_3__.Articulation('a^').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_11__.ModifierPosition.ABOVE), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_3__.Articulation('am').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_11__.ModifierPosition.ABOVE), 0) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_3__.Articulation('a@u').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_11__.ModifierPosition.ABOVE), 0) + .addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_2__.Annotation('yyyy').setVerticalJustification(_src_annotation__WEBPACK_IMPORTED_MODULE_2__.AnnotationVerticalJustify.TOP), 0) + .addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_2__.Annotation('xxxx').setVerticalJustification(_src_annotation__WEBPACK_IMPORTED_MODULE_2__.AnnotationVerticalJustify.TOP).setFont('sans-serif', 20), 0) + .addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_2__.Annotation('ttt').setVerticalJustification(_src_annotation__WEBPACK_IMPORTED_MODULE_2__.AnnotationVerticalJustify.TOP).setFont('sans-serif', 20), 0), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['c/5'], duration: '8' }), + ]; + const tuplet = new _src_tuplet__WEBPACK_IMPORTED_MODULE_20__.Tuplet(notes).setTupletLocation(-1); + const tuplet2 = new _src_tuplet__WEBPACK_IMPORTED_MODULE_20__.Tuplet(notes2).setTupletLocation(1); + _src_formatter__WEBPACK_IMPORTED_MODULE_9__.Formatter.FormatAndDraw(context, stave, notes); + _src_formatter__WEBPACK_IMPORTED_MODULE_9__.Formatter.FormatAndDraw(context, stave2, notes2); + stave.setContext(context).draw(); + stave2.setContext(context).draw(); + tuplet.setContext(context).draw(); + tuplet2.setContext(context).draw(); + ok(true); +} +function justifyStaveNotes(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 520, 280); + const ctx = f.getContext(); + const score = f.EasyScore(); + let y = 30; + function justifyToWidth(width) { + f.Stave({ y: y }).addClef('treble'); + const voices = [ + score.voice(score.notes('(cbb4 en4 a4)/2, (d4 e4 f4)/8, (d4 f4 a4)/8, (cn4 f#4 a4)/4', { stem: 'down' })), + score.voice(score.notes('(bb4 e#5 a5)/4, (d5 e5 f5)/2, (c##5 fb5 a5)/4', { stem: 'up' })), + ]; + f.Formatter() + .joinVoices(voices) + .format(voices, width - (_src_stave__WEBPACK_IMPORTED_MODULE_14__.Stave.defaultPadding + getGlyphWidth('gClef'))); + // Show the the width of notes via a horizontal line with red, green, yellow, blue, gray indicators. + voices[0].getTickables().forEach((note) => _src_note__WEBPACK_IMPORTED_MODULE_12__.Note.plotMetrics(ctx, note, y + 140)); // Bottom line. + voices[1].getTickables().forEach((note) => _src_note__WEBPACK_IMPORTED_MODULE_12__.Note.plotMetrics(ctx, note, y - 20)); // Top Line + y += 210; + } + justifyToWidth(520); + f.draw(); + ok(true); +} +function notesWithTab(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 420, 580); + const score = f.EasyScore(); + let y = 10; + function justifyToWidth(width) { + const stave = f.Stave({ y: y }).addClef('treble'); + const voice = score.voice(score.notes('d#4/2, (c4 d4)/8, d4/8, (c#4 e4 a4)/4', { stem: 'up' })); + y += 100; + f.TabStave({ y: y }).addTabGlyph().setNoteStartX(stave.getNoteStartX()); + const tabVoice = score.voice([ + f.TabNote({ positions: [{ str: 3, fret: 6 }], duration: '2' }).addModifier(new _src_bend__WEBPACK_IMPORTED_MODULE_5__.Bend('Full'), 0), + f + .TabNote({ + positions: [ + { str: 2, fret: 3 }, + { str: 3, fret: 5 }, + ], + duration: '8', + }) + .addModifier(new _src_bend__WEBPACK_IMPORTED_MODULE_5__.Bend('Unison'), 1), + f.TabNote({ positions: [{ str: 3, fret: 7 }], duration: '8' }), + f.TabNote({ + positions: [ + { str: 3, fret: 6 }, + { str: 4, fret: 7 }, + { str: 2, fret: 5 }, + ], + duration: '4', + }), + ]); + f.Formatter().joinVoices([voice]).joinVoices([tabVoice]).format([voice, tabVoice], width); + y += 150; + } + justifyToWidth(0); + justifyToWidth(300); + f.draw(); + ok(true); +} +function multiStaves(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 400); + const ctx = f.getContext(); + const score = f.EasyScore(); + ////////////////////////////////////////////////////////////////////////////////////////////////// + // Draw 3 Staves (one measure each). + const notes11 = score.notes('f4/4, d4/8, g4/4, eb4/8'); + const notes21 = score.notes('d4/8, d4, d4, d4, e4, eb4'); + const notes31 = score.notes('a5/8, a5, a5, a5, a5, a5', { stem: 'down' }); + let voices = [ + score.voice(notes11, { time: '6/8' }), + score.voice(notes21, { time: '6/8' }), + score.voice(notes31, { time: '6/8' }), + ]; + let formatter = f.Formatter(); + voices.forEach((v) => formatter.joinVoices([v])); + let width = formatter.preCalculateMinTotalWidth(voices); + formatter.format(voices, width); + let beams = [ + new _src_beam__WEBPACK_IMPORTED_MODULE_4__.Beam(notes21.slice(0, 3), true), + new _src_beam__WEBPACK_IMPORTED_MODULE_4__.Beam(notes21.slice(3, 6), true), + new _src_beam__WEBPACK_IMPORTED_MODULE_4__.Beam(notes31.slice(0, 3), true), + new _src_beam__WEBPACK_IMPORTED_MODULE_4__.Beam(notes31.slice(3, 6), true), + ]; + const staveYs = [20, 130, 250]; + let staveWidth = width + getGlyphWidth('gClef') + getGlyphWidth('timeSig8') + _src_stave__WEBPACK_IMPORTED_MODULE_14__.Stave.defaultPadding; + let staves = [ + f.Stave({ y: staveYs[0], width: staveWidth }).addClef('treble').addTimeSignature('6/8'), + f.Stave({ y: staveYs[1], width: staveWidth }).addClef('treble').addTimeSignature('6/8'), + f.Stave({ y: staveYs[2], width: staveWidth }).addClef('bass').addTimeSignature('6/8'), + ]; + f.StaveConnector({ + top_stave: staves[1], + bottom_stave: staves[2], + type: 'brace', + }); + for (let i = 0; i < staves.length; ++i) { + staves[i].setContext(ctx).draw(); + voices[i].draw(ctx, staves[i]); + } + beams.forEach((beam) => beam.setContext(ctx).draw()); + ////////////////////////////////////////////////////////////////////////////////////////////////// + // Draw 3 more staves (one measure each). + // These are adjacent to the first set of staves, representing the second measure of each stave. + const notes12 = score.notes('ab4/4, bb4/8, (cb5 eb5)/4[stem="down"], d5/8[stem="down"]'); + const notes22 = score.notes('(eb4 ab4)/4., (c4 eb4 ab4)/4, db5/8', { stem: 'up' }); + const notes32 = score.notes('a5/8, a5, a5, a5, a5, a5', { stem: 'down' }); + voices = [ + score.voice(notes12, { time: '6/8' }), + score.voice(notes22, { time: '6/8' }), + score.voice(notes32, { time: '6/8' }), + ]; + formatter = f.Formatter(); + voices.forEach((v) => formatter.joinVoices([v])); + width = formatter.preCalculateMinTotalWidth(voices); + const staveX = staves[0].getX() + staves[0].getWidth(); + staveWidth = width + _src_stave__WEBPACK_IMPORTED_MODULE_14__.Stave.defaultPadding; + staves = [ + f.Stave({ x: staveX, y: staveYs[0], width: staveWidth }), + f.Stave({ x: staveX, y: staveYs[1], width: staveWidth }), + f.Stave({ x: staveX, y: staveYs[2], width: staveWidth }), + ]; + formatter.format(voices, width); + beams = [ + // Add beams to each group of 3 notes. + new _src_beam__WEBPACK_IMPORTED_MODULE_4__.Beam(notes32.slice(0, 3), true), + new _src_beam__WEBPACK_IMPORTED_MODULE_4__.Beam(notes32.slice(3, 6), true), + ]; + for (let i = 0; i < staves.length; ++i) { + staves[i].setContext(ctx).draw(); + voices[i].draw(ctx, staves[i]); + voices[i].getTickables().forEach((note) => _src_note__WEBPACK_IMPORTED_MODULE_12__.Note.plotMetrics(ctx, note, staveYs[i] - 20)); + } + beams.forEach((beam) => beam.setContext(ctx).draw()); + ok(true); +} +function proportional(options) { + const debug = options.params.debug; + _src_registry__WEBPACK_IMPORTED_MODULE_13__.Registry.enableDefaultRegistry(new _src_registry__WEBPACK_IMPORTED_MODULE_13__.Registry()); + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 775, 750); + const system = f.System({ + x: 50, + autoWidth: true, + debugFormatter: debug, + noJustification: !(options.params.justify === undefined && true), + formatIterations: options.params.iterations, + details: { alpha: options.params.alpha }, + }); + const score = f.EasyScore(); + const voices = [ + score.notes('c5/8, c5'), + score.tuplet(score.notes('a4/8, a4, a4'), { notes_occupied: 2 }), + score.notes('c5/16, c5, c5, c5'), + score.tuplet(score.notes('a4/16, a4, a4, a4, a4'), { notes_occupied: 4 }), + score.tuplet(score.notes('a4/32, a4, a4, a4, a4, a4, a4'), { notes_occupied: 8 }), + ]; + const createVoice = (notes) => score.voice(notes, { time: '1/4' }); + const createStave = (voice) => system + .addStave({ voices: [voice], debugNoteMetrics: debug }) + .addClef('treble') + .addTimeSignature('1/4'); + voices.map(createVoice).forEach(createStave); + system.addConnector().setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_15__.StaveConnector.type.BRACKET); + f.draw(); + // Debugging: Show how many elements of each type we have added. + // const typeMap = Registry.getDefaultRegistry().index.type; + // const table = Object.keys(typeMap).map((typeName) => typeName + ': ' + Object.keys(typeMap[typeName]).length); + // console.log(table); + _src_registry__WEBPACK_IMPORTED_MODULE_13__.Registry.disableDefaultRegistry(); + ok(true); +} +function softMax(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 550, 500); + f.getContext().scale(0.8, 0.8); + function draw(y, factor) { + const score = f.EasyScore(); + const system = f.System({ + x: 100, + y, + details: { softmaxFactor: factor }, + autoWidth: true, + }); + system + .addStave({ + voices: [ + score.voice(score + .notes('C#5/h, a4/q') + .concat(score.beam(score.notes('Abb4/8, A4/8'))) + .concat(score.beam(score.notes('A4/16, A#4, A4, Ab4/32, A4'))), { time: '5/4' }), + ], + }) + .addClef('treble') + .addTimeSignature('5/4'); + f.draw(); + ok(true); + } + draw(50, 1); + draw(150, 2); + draw(250, 10); + draw(350, 20); + draw(450, 200); +} +function mixTime(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 400 + _src_stave__WEBPACK_IMPORTED_MODULE_14__.Stave.defaultPadding, 250); + f.getContext().scale(0.8, 0.8); + const score = f.EasyScore(); + const system = f.System({ + details: { softmaxFactor: 100 }, + autoWidth: true, + debugFormatter: true, + }); + system + .addStave({ + voices: [score.voice(score.notes('C#5/q, B4').concat(score.beam(score.notes('A4/8, E4, C4, D4'))))], + }) + .addClef('treble') + .addTimeSignature('4/4'); + system + .addStave({ + voices: [score.voice(score.notes('C#5/q, B4, B4').concat(score.tuplet(score.beam(score.notes('A4/8, E4, C4')))))], + }) + .addClef('treble') + .addTimeSignature('4/4'); + f.draw(); + ok(true); +} +function tightNotes1(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 440, 250); + f.getContext().scale(0.8, 0.8); + const score = f.EasyScore(); + const system = f.System({ + autoWidth: true, + debugFormatter: true, + details: { maxIterations: 10 }, + }); + system + .addStave({ + voices: [ + score.voice(score.beam(score.notes('B4/16, B4, B4, B4, B4, B4, B4, B4')).concat(score.notes('B4/q, B4'))), + ], + }) + .addClef('treble') + .addTimeSignature('4/4'); + system + .addStave({ + voices: [ + score.voice(score.notes('B4/q, B4').concat(score.beam(score.notes('B4/16, B4, B4, B4, B4, B4, B4, B4')))), + ], + }) + .addClef('treble') + .addTimeSignature('4/4'); + f.draw(); + ok(true); +} +function tightNotes2(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 440, 250); + f.getContext().scale(0.8, 0.8); + const score = f.EasyScore(); + const system = f.System({ + autoWidth: true, + debugFormatter: true, + }); + system + .addStave({ + voices: [ + score.voice(score.beam(score.notes('B4/16, B4, B4, B4, B4, B4, B4, B4')).concat(score.notes('B4/q, B4'))), + ], + }) + .addClef('treble') + .addTimeSignature('4/4'); + system + .addStave({ + voices: [score.voice(score.notes('B4/w'))], + }) + .addClef('treble') + .addTimeSignature('4/4'); + f.draw(); + ok(true); +} +function annotations(options) { + const pageWidth = 916; + const pageHeight = 600; + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, pageWidth, pageHeight); + const context = f.getContext(); + const lyrics1 = ['ipso', 'ipso-', 'ipso', 'ipso', 'ipsoz', 'ipso-', 'ipso', 'ipso', 'ipso', 'ip', 'ipso']; + const lyrics2 = ['ipso', 'ipso-', 'ipsoz', 'ipso', 'ipso', 'ipso-', 'ipso', 'ipso', 'ipso', 'ip', 'ipso']; + const smar = [ + { + sm: 5, + width: 550, + lyrics: lyrics1, + title: '550px,softMax:5', + }, + { + sm: 10, + width: 550, + lyrics: lyrics2, + title: '550px,softmax:10,different word order', + }, + { + sm: 5, + width: 550, + lyrics: lyrics2, + title: '550px,softmax:5', + }, + { + sm: 100, + width: 550, + lyrics: lyrics2, + title: '550px,softmax:100', + }, + ]; + const rowSize = 140; + const beats = 12; + const beatsPer = 8; + const beamGroup = 3; + const durations = ['8d', '16', '8', '8d', '16', '8', '8d', '16', '8', '4', '8']; + const beams = []; + let y = 40; + smar.forEach((sm) => { + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_14__.Stave(10, y, sm.width); + const notes = []; + let iii = 0; + context.fillText(sm.title, 100, y); + y += rowSize; + durations.forEach((dd) => { + const note = new _src_stavenote__WEBPACK_IMPORTED_MODULE_16__.StaveNote({ keys: ['b/4'], duration: dd }); + if (dd.indexOf('d') >= 0) { + _src_dot__WEBPACK_IMPORTED_MODULE_6__.Dot.buildAndAttach([note], { all: true }); + } + if (sm.lyrics.length > iii) { + note.addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_2__.Annotation(sm.lyrics[iii]) + .setVerticalJustification(_src_annotation__WEBPACK_IMPORTED_MODULE_2__.Annotation.VerticalJustify.BOTTOM) + .setFont(_src_font__WEBPACK_IMPORTED_MODULE_8__.Font.SERIF, 12, _src_font__WEBPACK_IMPORTED_MODULE_8__.FontWeight.NORMAL)); + } + notes.push(note); + iii += 1; + }); + notes.forEach((note) => { + if (note.getDuration().indexOf('d') >= 0) { + _src_dot__WEBPACK_IMPORTED_MODULE_6__.Dot.buildAndAttach([note], { all: true }); + } + }); + // Don't beam the last group + let notesToBeam = []; + notes.forEach((note) => { + if (note.getIntrinsicTicks() < 4096) { + notesToBeam.push(note); + if (notesToBeam.length >= beamGroup) { + beams.push(new _src_beam__WEBPACK_IMPORTED_MODULE_4__.Beam(notesToBeam)); + notesToBeam = []; + } + } + else { + notesToBeam = []; + } + }); + const voice1 = new _src_voice__WEBPACK_IMPORTED_MODULE_21__.Voice({ num_beats: beats, beat_value: beatsPer }).setMode(_src_voice__WEBPACK_IMPORTED_MODULE_21__.Voice.Mode.SOFT).addTickables(notes); + const fmt = new _src_formatter__WEBPACK_IMPORTED_MODULE_9__.Formatter({ softmaxFactor: sm.sm, maxIterations: 2 }).joinVoices([voice1]); + fmt.format([voice1], sm.width - 11); + stave.setContext(context).draw(); + voice1.draw(context, stave); + beams.forEach((b) => b.setContext(context).draw()); + }); + ok(true); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(FormatterTests); + + + +/***/ }), + +/***/ "./tests/fraction_tests.ts": +/*!*********************************!*\ + !*** ./tests/fraction_tests.ts ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "FractionTests": () => (/* binding */ FractionTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_fraction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/fraction */ "./src/fraction.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Fraction Tests + + +const FractionTests = { + Start() { + QUnit.module('Fraction'); + test('Basic', basic); + test('With Other Fractions', withOtherFractions); + }, +}; +function basic() { + const f_1_2 = new _src_fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(1, 2); + ok(f_1_2.equals(0.5), 'Fraction: 1/2 equals 0.5'); + ok(f_1_2.equals(new _src_fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(1, 2)), 'Fraction: 1/2 equals 1/2'); + ok(f_1_2.equals(new _src_fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(2, 4)), 'Fraction: 1/2 equals 2/4'); + notOk(f_1_2.greaterThan(1), 'Fraction: ! 1/2 > 1'); + ok(f_1_2.greaterThan(0.2), 'Fraction: 1/2 > 0.2'); + ok(f_1_2.greaterThanEquals(0.2), 'Fraction: 1/2 >= 0.2'); + ok(f_1_2.greaterThanEquals(0.5), 'Fraction: 1/2 >= 0.5'); + notOk(f_1_2.greaterThanEquals(1), 'Fraction: ! 1/2 >= 1'); + notOk(f_1_2.lessThan(0.5), 'Fraction: ! 1/2 < 0.5'); + ok(f_1_2.lessThan(1), 'Fraction: 1/2 < 1'); + ok(f_1_2.lessThanEquals(0.6), 'Fraction: 1/2 <= 0.6'); + ok(f_1_2.lessThanEquals(0.5), 'Fraction: 1/2 <= 0.5'); + notOk(f_1_2.lessThanEquals(0.4), 'Fraction: ! 1/2 <= 0.4'); + const f_05 = f_1_2.copy(0.5); + strictEqual(f_05, f_1_2, 'Fraction: f_05 === f_1_2'); + strictEqual(f_05.toString(), '0.5/1', 'Fraction: f_05.toString() === "0.5/1"'); + strictEqual(f_05.toSimplifiedString(), '1/2', 'Fraction: f_05.toSimplifiedString() === "1/2"'); + const tF_n = f_05.clone(); + notStrictEqual(tF_n, f_05, 'Fraction: tF_n !== f_05'); + notEqual(tF_n, f_05, 'Fraction: tF_n != f_05'); + deepEqual(tF_n, f_05, 'tF_n deepEqual f_05'); + notDeepEqual(tF_n, {}, 'tF_n notDeepEqual {}'); + tF_n.subtract(-0.5); + ok(tF_n.equals(1), 'Fraction: 0.5 -(-0.5) equals 1'); + tF_n.add(1); + ok(tF_n.equals(2), 'Fraction: 1 + 1 equals 2'); + tF_n.multiply(2); + ok(tF_n.equals(4), 'Fraction: 2 * 2 equals 4'); + tF_n.divide(2); + ok(tF_n.equals(2), 'Fraction: 4 / 2 equals 2'); + // Lowest common multiple. + equal(_src_fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction.LCMM([]), 0); + equal(_src_fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction.LCMM([17]), 17); + equal(_src_fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction.LCMM([2, 5]), 10); + equal(_src_fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction.LCMM([15, 3, 5]), 15); + equal(_src_fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction.LCMM([2, 4, 6]), 12); + equal(_src_fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction.LCMM([2, 3, 4, 5]), 60); + equal(_src_fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction.LCMM([12, 15, 10, 75]), 300); + // Greatest common divisor. + equal(_src_fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction.GCD(0, 0), 0); + equal(_src_fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction.GCD(0, 99), 99); + equal(_src_fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction.GCD(77, 0), 77); + equal(_src_fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction.GCD(42, 14), 14); + equal(_src_fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction.GCD(15, 10), 5); +} +function withOtherFractions() { + const f_1_2 = new _src_fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(1, 2); + const f_1_4 = new _src_fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(1, 4); + const f_1_8 = new _src_fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(1, 8); + const f_2 = new _src_fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(2, 1); + // IMPORTANT NOTE: Fraction methods modify the existing Fraction object. + // They do not return new objects. + // Use clone() if you don't want to modify the original object. + const a = f_1_2.clone().multiply(f_1_2); + ok(a.equals(f_1_4), '1/2 x 1/2 == 1/4'); + const b = f_1_2.clone().divide(f_1_4); + ok(b.equals(f_2), '1/2 / 1/4 == 2'); + const c = f_2.clone().subtract(f_1_2).subtract(f_1_2).subtract(f_1_4); // 3/4 + const d = f_1_8.clone().add(f_1_8).add(f_1_8).multiply(f_2); + ok(c.equals(d), '2-1/2-1/2-1/4 == (1/8+1/8+1/8)*(2/1)'); + equal(c.value(), 0.75, '3/4 == 0.75'); + const e = f_1_8.clone().add(f_1_4).add(f_1_8); + ok(e.equals(f_1_2), '1/8 + 1/4 + 1/8 == 1/2'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(FractionTests); + + + +/***/ }), + +/***/ "./tests/ghostnote_tests.ts": +/*!**********************************!*\ + !*** ./tests/ghostnote_tests.ts ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "GhostNoteTests": () => (/* binding */ GhostNoteTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// GhostNote Tests + +const GhostNoteTests = { + Start() { + QUnit.module('GhostNote'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('GhostNote Basic', basic); + run('GhostNote Dotted', dotted); + }, +}; +/** + * Helper function to set up the stave, easyscore, voice, and to format & draw. + */ +function createTest(addItems) { + return (options) => { + const factory = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 550); + const stave = factory.Stave(); + const score = factory.EasyScore(); + addItems(factory, score); + const voices = factory.getVoices(); + factory.Formatter().joinVoices(voices).formatToStave(voices, stave); + factory.draw(); + ok(true, 'all pass'); + }; +} +const basic = createTest((f, score) => { + // Top Voice + const voiceTop = score.voice(score.notes('f#5/4, f5, db5, c5, c5/8, d5, fn5, e5, d5, c5', { stem: 'up' }), { + time: '7/4', + }); + const notesTop = voiceTop.getTickables(); + f.Beam({ notes: notesTop.slice(4, 8) }); + f.Beam({ notes: notesTop.slice(8, 10) }); + // Bottom Voice + score.voice([ + f.GhostNote({ duration: '2' }), + f.StaveNote({ keys: ['f/4'], stem_direction: -1, duration: '4' }), + f.GhostNote({ duration: '4' }), + f.StaveNote({ keys: ['e/4'], stem_direction: -1, duration: '4' }), + f.GhostNote({ duration: '8' }), + f.StaveNote({ keys: ['d/4'], stem_direction: -1, duration: '8' }).addModifier(f.Accidental({ type: '##' }), 0), + f.StaveNote({ keys: ['c/4'], stem_direction: -1, duration: '8' }), + f.StaveNote({ keys: ['c/4'], stem_direction: -1, duration: '8' }), + ], { time: '7/4' }); +}); +/** + * A ghost note is invisible, but takes up space on the stave corresponding to its duration. + * '4d' is a dotted quarter note, equivalent to a quarter + eighth note. + */ +const dotted = createTest((f, score) => { + const voice1 = score.voice([ + f.GhostNote({ duration: '4d' }), + f.StaveNote({ duration: '8', keys: ['f/5'], stem_direction: 1 }), + f.StaveNote({ duration: '4', keys: ['d/5'], stem_direction: 1 }), + f.StaveNote({ duration: '8', keys: ['c/5'], stem_direction: 1 }), + f.StaveNote({ duration: '16', keys: ['c/5'], stem_direction: 1 }), + f.StaveNote({ duration: '16', keys: ['d/5'], stem_direction: 1 }), + f.GhostNote({ duration: '2dd' }), + f.StaveNote({ duration: '8', keys: ['f/5'], stem_direction: 1 }), + ], { time: '8/4' }); + const voice2 = score.voice([ + f.StaveNote({ duration: '4', keys: ['f/4'], stem_direction: -1 }), + f.StaveNote({ duration: '8', keys: ['e/4'], stem_direction: -1 }), + f.StaveNote({ duration: '8', keys: ['d/4'], stem_direction: -1 }), + f.GhostNote({ duration: '4dd' }), + f.StaveNote({ duration: '16', keys: ['c/4'], stem_direction: -1 }), + f.StaveNote({ duration: '2', keys: ['c/4'], stem_direction: -1 }), + f.StaveNote({ duration: '4', keys: ['d/4'], stem_direction: -1 }), + f.StaveNote({ duration: '8', keys: ['f/4'], stem_direction: -1 }), + f.StaveNote({ duration: '8', keys: ['e/4'], stem_direction: -1 }), + ], { time: '8/4' }); + const notes1 = voice1.getTickables(); + const notes2 = voice2.getTickables(); + const addAccidental = (note, type) => note.addModifier(f.Accidental({ type }), 0); + addAccidental(notes1[1], 'bb'); + addAccidental(notes1[4], '#'); + addAccidental(notes1[7], 'n'); + addAccidental(notes2[0], '#'); + addAccidental(notes2[4], 'b'); + addAccidental(notes2[5], '#'); + addAccidental(notes2[7], 'n'); + f.Beam({ notes: notes1.slice(3, 6) }); + f.Beam({ notes: notes2.slice(1, 3) }); + f.Beam({ notes: notes2.slice(7, 9) }); +}); +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(GhostNoteTests); + + + +/***/ }), + +/***/ "./tests/glyphnote_tests.ts": +/*!**********************************!*\ + !*** ./tests/glyphnote_tests.ts ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "GlyphNoteTests": () => (/* binding */ GlyphNoteTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_chordsymbol__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/chordsymbol */ "./src/chordsymbol.ts"); +/* harmony import */ var _src_glyph__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/glyph */ "./src/glyph.ts"); +/* harmony import */ var _src_registry__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/registry */ "./src/registry.ts"); +/* harmony import */ var _src_staveconnector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/staveconnector */ "./src/staveconnector.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// GlyphNote Tests + + + + + +const GlyphNoteTests = { + Start() { + QUnit.module('GlyphNote'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('GlyphNote with ChordSymbols', chordChanges, { debug: false, noPadding: false }); + run('GlyphNote Positioning', basic, { debug: false, noPadding: false }); + run('GlyphNote No Stave Padding', basic, { debug: true, noPadding: true }); + run('GlyphNote RepeatNote', repeatNote, { debug: false, noPadding: true }); + }, +}; +function chordChanges(options) { + _src_registry__WEBPACK_IMPORTED_MODULE_3__.Registry.enableDefaultRegistry(new _src_registry__WEBPACK_IMPORTED_MODULE_3__.Registry()); + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 300, 200); + const system = f.System({ + x: 50, + width: 250, + debugFormatter: options.params.debug, + noPadding: options.params.noPadding, + details: { alpha: options.params.alpha }, + }); + const score = f.EasyScore(); + const notes = [ + f.GlyphNote(new _src_glyph__WEBPACK_IMPORTED_MODULE_2__.Glyph('repeatBarSlash', 40), { duration: 'q' }), + f.GlyphNote(new _src_glyph__WEBPACK_IMPORTED_MODULE_2__.Glyph('repeatBarSlash', 40), { duration: 'q' }), + f.GlyphNote(new _src_glyph__WEBPACK_IMPORTED_MODULE_2__.Glyph('repeatBarSlash', 40), { duration: 'q' }), + f.GlyphNote(new _src_glyph__WEBPACK_IMPORTED_MODULE_2__.Glyph('repeatBarSlash', 40), { duration: 'q' }), + ]; + const chord1 = f + .ChordSymbol({ reportWidth: false }) + .addText('F7') + .setHorizontal('left') + .addGlyphOrText('(#11b9)', { symbolModifier: _src_chordsymbol__WEBPACK_IMPORTED_MODULE_1__.ChordSymbol.symbolModifiers.SUPERSCRIPT }); + const chord2 = f + .ChordSymbol() + .addText('F7') + .setHorizontal('left') + .addGlyphOrText('#11', { symbolModifier: _src_chordsymbol__WEBPACK_IMPORTED_MODULE_1__.ChordSymbol.symbolModifiers.SUPERSCRIPT }) + .addGlyphOrText('b9', { symbolModifier: _src_chordsymbol__WEBPACK_IMPORTED_MODULE_1__.ChordSymbol.symbolModifiers.SUBSCRIPT }); + notes[0].addModifier(chord1, 0); + notes[2].addModifier(chord2, 0); + const voice = score.voice(notes); + system.addStave({ voices: [voice], debugNoteMetrics: options.params.debug }); + system.addConnector().setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_4__.StaveConnector.type.BRACKET); + f.draw(); + _src_registry__WEBPACK_IMPORTED_MODULE_3__.Registry.disableDefaultRegistry(); + ok(true); +} +function basic(options) { + _src_registry__WEBPACK_IMPORTED_MODULE_3__.Registry.enableDefaultRegistry(new _src_registry__WEBPACK_IMPORTED_MODULE_3__.Registry()); + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 300, 400); + const system = f.System({ + x: 50, + width: 250, + debugFormatter: options.params.debug, + noPadding: options.params.noPadding, + details: { alpha: options.params.alpha }, + }); + const score = f.EasyScore(); + const newVoice = (notes) => score.voice(notes, { time: '1/4' }); + const newStave = (voice) => system.addStave({ voices: [voice], debugNoteMetrics: options.params.debug }); + const voices = [ + [f.GlyphNote(new _src_glyph__WEBPACK_IMPORTED_MODULE_2__.Glyph('repeat1Bar', 40), { duration: 'q' }, { line: 4 })], + [f.GlyphNote(new _src_glyph__WEBPACK_IMPORTED_MODULE_2__.Glyph('repeat2Bars', 40), { duration: 'q', align_center: true })], + [ + f.GlyphNote(new _src_glyph__WEBPACK_IMPORTED_MODULE_2__.Glyph('repeatBarSlash', 40), { duration: '16' }), + f.GlyphNote(new _src_glyph__WEBPACK_IMPORTED_MODULE_2__.Glyph('repeatBarSlash', 40), { duration: '16' }), + f.GlyphNote(new _src_glyph__WEBPACK_IMPORTED_MODULE_2__.Glyph('repeat4Bars', 40), { duration: '16' }), + f.GlyphNote(new _src_glyph__WEBPACK_IMPORTED_MODULE_2__.Glyph('repeatBarSlash', 40), { duration: '16' }), + ], + ]; + voices.map(newVoice).forEach(newStave); + system.addConnector().setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_4__.StaveConnector.type.BRACKET); + f.draw(); + _src_registry__WEBPACK_IMPORTED_MODULE_3__.Registry.disableDefaultRegistry(); + ok(true); +} +function repeatNote(options) { + _src_registry__WEBPACK_IMPORTED_MODULE_3__.Registry.enableDefaultRegistry(new _src_registry__WEBPACK_IMPORTED_MODULE_3__.Registry()); + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 300, 500); + const system = f.System({ + x: 50, + width: 250, + debugFormatter: options.params.debug, + noPadding: options.params.noPadding, + details: { alpha: options.params.alpha }, + }); + const score = f.EasyScore(); + const createVoice = (notes) => score.voice(notes, { time: '1/4' }); + const addStaveWithVoice = (voice) => system.addStave({ voices: [voice], debugNoteMetrics: options.params.debug }); + const voices = [ + [f.RepeatNote('1')], + [f.RepeatNote('2')], + [f.RepeatNote('4')], + [ + f.RepeatNote('slash', { duration: '16' }), + f.RepeatNote('slash', { duration: '16' }), + f.RepeatNote('slash', { duration: '16' }), + f.RepeatNote('slash', { duration: '16' }), + ], + ]; + voices.map(createVoice).forEach(addStaveWithVoice); + system.addConnector().setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_4__.StaveConnector.type.BRACKET); + f.draw(); + _src_registry__WEBPACK_IMPORTED_MODULE_3__.Registry.disableDefaultRegistry(); + ok(true); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(GlyphNoteTests); + + + +/***/ }), + +/***/ "./tests/gracenote_tests.ts": +/*!**********************************!*\ + !*** ./tests/gracenote_tests.ts ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "GraceNoteTests": () => (/* binding */ GraceNoteTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_dot__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/dot */ "./src/dot.ts"); +/* harmony import */ var _src_formatter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/formatter */ "./src/formatter.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// GraceNote Tests +// TODO: In the 'stem' test (aka Grace Note Stem › SVG + Petaluma in flow.html), the Petaluma note heads are not scaled down properly. + + + +const GraceNoteTests = { + Start() { + QUnit.module('Grace Notes'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Grace Note Basic', basic); + run('Grace Note Basic with Slurs', basicSlurred); + run('Grace Note Stem', stem); + run('Grace Note Stem with Beams 1', stemWithBeamed, { + keys1: ['g/4'], + stemDirection1: 1, + keys2: ['d/5'], + stemDirection2: -1, + }); + run('Grace Note Stem with Beams 2', stemWithBeamed, { + keys1: ['a/3'], + stemDirection1: 1, + keys2: ['a/5'], + stemDirection2: -1, + }); + run('Grace Note Stem with Beams 3', stemWithBeamed, { + keys1: ['c/4'], + stemDirection1: 1, + keys2: ['c/6'], + stemDirection2: -1, + }); + run('Grace Note Slash', slash); + run('Grace Note Slash with Beams', slashWithBeams); + run('Grace Notes Multiple Voices', multipleVoices); + run('Grace Notes Multiple Voices Multiple Draws', multipleVoicesMultipleDraws); + }, +}; +function basic(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 700, 130); + const stave = f.Stave({ x: 10, y: 10, width: 650 }); + const gracenotes = [ + { keys: ['e/4'], duration: '32' }, + { keys: ['f/4'], duration: '32' }, + { keys: ['g/4'], duration: '32' }, + { keys: ['a/4'], duration: '32' }, + ].map(f.GraceNote.bind(f)); + const gracenotes1 = [{ keys: ['b/4'], duration: '8', slash: false }].map(f.GraceNote.bind(f)); + const gracenotes2 = [{ keys: ['b/4'], duration: '8', slash: true }].map(f.GraceNote.bind(f)); + const gracenotes3 = [ + { keys: ['e/4'], duration: '8' }, + { keys: ['f/4'], duration: '16' }, + { keys: ['e/4', 'g/4'], duration: '8' }, + { keys: ['a/4'], duration: '32' }, + { keys: ['b/4'], duration: '32' }, + ].map(f.GraceNote.bind(f)); + const gracenotes4 = [ + { keys: ['g/4'], duration: '8' }, + { keys: ['g/4'], duration: '16' }, + { keys: ['g/4'], duration: '16' }, + ].map(f.GraceNote.bind(f)); + gracenotes[1].addModifier(f.Accidental({ type: '##' }), 0); + gracenotes3[3].addModifier(f.Accidental({ type: 'bb' }), 0); + _src_dot__WEBPACK_IMPORTED_MODULE_1__.Dot.buildAndAttach([gracenotes4[0]], { all: true }); + const notes = [ + f + .StaveNote({ keys: ['b/4'], duration: '4', auto_stem: true }) + .addModifier(f.GraceNoteGroup({ notes: gracenotes }).beamNotes(), 0), + f + .StaveNote({ keys: ['c/5'], duration: '4', auto_stem: true }) + .addModifier(f.Accidental({ type: '#' }), 0) + .addModifier(f.GraceNoteGroup({ notes: gracenotes1 }).beamNotes(), 0), + f + .StaveNote({ keys: ['c/5', 'd/5'], duration: '4', auto_stem: true }) + .addModifier(f.GraceNoteGroup({ notes: gracenotes2 }).beamNotes(), 0), + f + .StaveNote({ keys: ['a/4'], duration: '4', auto_stem: true }) + .addModifier(f.GraceNoteGroup({ notes: gracenotes3 }).beamNotes(), 0), + f + .StaveNote({ keys: ['a/4'], duration: '4', auto_stem: true }) + .addModifier(f.GraceNoteGroup({ notes: gracenotes4 }).beamNotes(), 0), + ]; + const voice = f.Voice().setStrict(false).addTickables(notes); + new _src_formatter__WEBPACK_IMPORTED_MODULE_2__.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'GraceNoteBasic'); +} +function basicSlurred(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 700, 130); + const stave = f.Stave({ x: 10, y: 10, width: 650 }); + const gracenotes0 = [ + { keys: ['e/4'], duration: '32' }, + { keys: ['f/4'], duration: '32' }, + { keys: ['g/4'], duration: '32' }, + { keys: ['a/4'], duration: '32' }, + ].map(f.GraceNote.bind(f)); + const gracenotes1 = [{ keys: ['b/4'], duration: '8', slash: false }].map(f.GraceNote.bind(f)); + const gracenotes2 = [{ keys: ['b/4'], duration: '8', slash: true }].map(f.GraceNote.bind(f)); + const gracenotes3 = [ + { keys: ['e/4'], duration: '8' }, + { keys: ['f/4'], duration: '16' }, + { keys: ['e/4', 'g/4'], duration: '8' }, + { keys: ['a/4'], duration: '32' }, + { keys: ['b/4'], duration: '32' }, + ].map(f.GraceNote.bind(f)); + const gracenotes4 = [ + { keys: ['a/4'], duration: '8' }, + { keys: ['a/4'], duration: '16' }, + { keys: ['a/4'], duration: '16' }, + ].map(f.GraceNote.bind(f)); + gracenotes0[1].addModifier(f.Accidental({ type: '#' }), 0); + gracenotes3[3].addModifier(f.Accidental({ type: 'b' }), 0); + gracenotes3[2].addModifier(f.Accidental({ type: 'n' }), 0); + _src_dot__WEBPACK_IMPORTED_MODULE_1__.Dot.buildAndAttach([gracenotes4[0]], { all: true }); + const notes = [ + f + .StaveNote({ keys: ['b/4'], duration: '4', auto_stem: true }) + .addModifier(f.GraceNoteGroup({ notes: gracenotes0, slur: true }).beamNotes(), 0), + f + .StaveNote({ keys: ['c/5'], duration: '4', auto_stem: true }) + .addModifier(f.Accidental({ type: '#' }), 0) + .addModifier(f.GraceNoteGroup({ notes: gracenotes1, slur: true }).beamNotes(), 0), + f + .StaveNote({ keys: ['c/5', 'd/5'], duration: '4', auto_stem: true }) + .addModifier(f.GraceNoteGroup({ notes: gracenotes2, slur: true }).beamNotes(), 0), + f + .StaveNote({ keys: ['a/4'], duration: '4', auto_stem: true }) + .addModifier(f.GraceNoteGroup({ notes: gracenotes3, slur: true }).beamNotes(), 0), + f + .StaveNote({ keys: ['a/4'], duration: '4', auto_stem: true }) + .addModifier(f.GraceNoteGroup({ notes: gracenotes4, slur: true }).beamNotes(), 0), + f.StaveNote({ keys: ['a/4'], duration: '4', auto_stem: true }), + ]; + const voice = f.Voice().setStrict(false).addTickables(notes); + new _src_formatter__WEBPACK_IMPORTED_MODULE_2__.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'GraceNoteBasic'); +} +/** + * Helper function for three tests below: stem, stemWithBeamed, slash. + */ +const createNoteForStemTest = (duration, noteBuilder, keys, stem_direction, slash = false) => { + const struct = { duration, slash }; + struct.stem_direction = stem_direction; + struct.keys = keys; + return noteBuilder(struct); +}; +// Used in three tests below. +const durationsForStemTest = ['8', '16', '32', '64', '128']; +function stem(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 700, 130); + const stave = f.Stave({ x: 10, y: 10, width: 650 }); + function createNotes(noteBuilder, keys, stem_direction) { + return durationsForStemTest.map((duration) => createNoteForStemTest(duration, noteBuilder, keys, stem_direction)); + } + function createNoteBlock(keys, stem_direction) { + const staveNotes = createNotes(f.StaveNote.bind(f), keys, stem_direction); + const gracenotes = createNotes(f.GraceNote.bind(f), keys, stem_direction); + // Add a bunch of GraceNotes in front of the first StaveNote. + staveNotes[0].addModifier(f.GraceNoteGroup({ notes: gracenotes }), 0); + return staveNotes; + } + const voice = f.Voice().setStrict(false); + voice.addTickables(createNoteBlock(['g/4'], 1)); + voice.addTickables(createNoteBlock(['d/5'], -1)); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'GraceNoteStem'); +} +function stemWithBeamed(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 700, 130); + const stave = f.Stave({ x: 10, y: 10, width: 650 }); + function createBeamedNotes(noteBuilder, keys, stem_direction, beams, isGrace = false, notesToBeam) { + const ret = []; + durationsForStemTest.map((duration) => { + const n0 = createNoteForStemTest(duration, noteBuilder, keys, stem_direction); + const n1 = createNoteForStemTest(duration, noteBuilder, keys, stem_direction); + ret.push(n0); + ret.push(n1); + if (notesToBeam) { + notesToBeam.push([n0, n1]); + } + if (!isGrace) { + beams.push(f.Beam({ notes: [n0, n1] })); + } + }); + return ret; + } + function createBeamedNoteBlock(keys, stem_direction, beams) { + const bnotes = createBeamedNotes(f.StaveNote.bind(f), keys, stem_direction, beams); + const notesToBeam = []; + const gracenotes = createBeamedNotes(f.GraceNote.bind(f), keys, stem_direction, beams, true, notesToBeam); + const graceNoteGroup = f.GraceNoteGroup({ notes: gracenotes }); + notesToBeam.map(graceNoteGroup.beamNotes.bind(graceNoteGroup)); + bnotes[0].addModifier(graceNoteGroup, 0); + return bnotes; + } + const beams = []; + const voice = f.Voice().setStrict(false); + voice.addTickables(createBeamedNoteBlock(options.params.keys1, options.params.stemDirection1, beams)); + voice.addTickables(createBeamedNoteBlock(options.params.keys2, options.params.stemDirection2, beams)); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'GraceNoteStem'); +} +function slash(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 700, 130); + const stave = f.Stave({ x: 10, y: 10, width: 650 }); + function createNotes(noteT, keys, stem_direction, slash) { + return durationsForStemTest.map((d) => createNoteForStemTest(d, noteT, keys, stem_direction, slash)); + } + function createNoteBlock(keys, stem_direction) { + const notes = [f.StaveNote({ keys: ['f/4'], stem_direction, duration: '16' })]; + let graceNotes = createNotes(f.GraceNote.bind(f), keys, stem_direction, true); + const duration = '8'; + const gns = [ + { keys: ['d/4', 'a/4'], stem_direction, duration, slash: true }, + { keys: ['d/4', 'a/4'], stem_direction, duration, slash: true }, + { keys: ['d/4', 'a/4'], stem_direction, duration, slash: true }, + { keys: ['e/4', 'a/4'], stem_direction, duration, slash: true }, + { keys: ['e/4', 'a/4'], stem_direction, duration, slash: true }, + { keys: ['b/4', 'f/5'], stem_direction, duration, slash: true }, + { keys: ['b/4', 'f/5'], stem_direction, duration, slash: true }, + { keys: ['b/4', 'f/5'], stem_direction, duration, slash: true }, + { keys: ['e/4', 'a/4'], stem_direction, duration, slash: true }, + ].map(f.GraceNote.bind(f)); + const notesToBeam = []; + notesToBeam.push([gns[0], gns[1], gns[2]]); + notesToBeam.push([gns[3], gns[4], gns[5]]); + notesToBeam.push([gns[6], gns[7], gns[8]]); + // Merge the two GraceNote[]. + graceNotes = graceNotes.concat(gns); + const graceNoteGroup = f.GraceNoteGroup({ notes: graceNotes }); + notesToBeam.forEach((notes) => graceNoteGroup.beamNotes(notes)); + notes[0].addModifier(graceNoteGroup, 0); + return notes; + } + const voice = f.Voice().setStrict(false); + voice.addTickables(createNoteBlock(['d/4', 'a/4'], 1)); + voice.addTickables(createNoteBlock(['d/4', 'a/4'], -1)); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'GraceNoteSlash'); +} +function slashWithBeams(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 800, 130); + const stave = f.Stave({ x: 10, y: 10, width: 750 }); + function createNoteBlock(keys, stem_direction) { + const notes = [f.StaveNote({ keys: ['f/4'], stem_direction, duration: '16' })]; + let allGraceNotes = []; + const graceNotesToBeam = []; + ['8', '16', '32', '64'].forEach(function (duration) { + const graceNotes = [ + { keys: ['d/4', 'a/4'], stem_direction, duration, slash: true }, + { keys: ['d/4', 'a/4'], stem_direction, duration, slash: false }, + { keys: ['e/4', 'a/4'], stem_direction, duration, slash: true }, + { keys: ['b/4', 'f/5'], stem_direction, duration, slash: false }, + { keys: ['b/4', 'f/5'], stem_direction, duration, slash: true }, + { keys: ['e/4', 'a/4'], stem_direction, duration, slash: false }, + ].map(f.GraceNote.bind(f)); + graceNotesToBeam.push([graceNotes[0], graceNotes[1]]); + graceNotesToBeam.push([graceNotes[2], graceNotes[3]]); + graceNotesToBeam.push([graceNotes[4], graceNotes[5]]); + allGraceNotes = allGraceNotes.concat(graceNotes); + }); + const graceNoteGroup = f.GraceNoteGroup({ notes: allGraceNotes }); + graceNotesToBeam.forEach((g) => graceNoteGroup.beamNotes(g)); + notes[0].addModifier(graceNoteGroup, 0); + return notes; + } + const voice = f.Voice().setStrict(false); + voice.addTickables(createNoteBlock(['d/4', 'a/4'], 1)); + voice.addTickables(createNoteBlock(['d/4', 'a/4'], -1)); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'GraceNoteSlashWithBeams'); +} +function multipleVoices(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 450, 140); + const stave = f.Stave({ x: 10, y: 10, width: 450 }); + const notes = [ + { keys: ['f/5'], stem_direction: 1, duration: '16' }, + { keys: ['f/5'], stem_direction: 1, duration: '16' }, + { keys: ['d/5'], stem_direction: 1, duration: '16' }, + { keys: ['c/5'], stem_direction: 1, duration: '16' }, + { keys: ['c/5'], stem_direction: 1, duration: '16' }, + { keys: ['d/5'], stem_direction: 1, duration: '16' }, + { keys: ['f/5'], stem_direction: 1, duration: '16' }, + { keys: ['e/5'], stem_direction: 1, duration: '16' }, + ].map(f.StaveNote.bind(f)); + const notes2 = [ + { keys: ['f/4'], stem_direction: -1, duration: '16' }, + { keys: ['e/4'], stem_direction: -1, duration: '16' }, + { keys: ['d/4'], stem_direction: -1, duration: '16' }, + { keys: ['c/4'], stem_direction: -1, duration: '16' }, + { keys: ['c/4'], stem_direction: -1, duration: '16' }, + { keys: ['d/4'], stem_direction: -1, duration: '16' }, + { keys: ['f/4'], stem_direction: -1, duration: '16' }, + { keys: ['e/4'], stem_direction: -1, duration: '16' }, + ].map(f.StaveNote.bind(f)); + const gracenotes1 = [{ keys: ['b/4'], stem_direction: 1, duration: '8', slash: true }].map(f.GraceNote.bind(f)); + const gracenotes2 = [{ keys: ['f/4'], stem_direction: -1, duration: '8', slash: true }].map(f.GraceNote.bind(f)); + const gracenotes3 = [ + { keys: ['f/4'], duration: '32', stem_direction: -1 }, + { keys: ['e/4'], duration: '32', stem_direction: -1 }, + ].map(f.GraceNote.bind(f)); + const gracenotes4 = [ + { keys: ['f/5'], duration: '32', stem_direction: 1 }, + { keys: ['e/5'], duration: '32', stem_direction: 1 }, + { keys: ['e/5'], duration: '8', stem_direction: 1 }, + ].map(f.GraceNote.bind(f)); + gracenotes2[0].setStemDirection(-1); + gracenotes2[0].addModifier(f.Accidental({ type: '#' }), 0); + notes[1].addModifier(f.GraceNoteGroup({ notes: gracenotes4 }).beamNotes(), 0); + notes[3].addModifier(f.GraceNoteGroup({ notes: gracenotes1 }), 0); + notes2[1].addModifier(f.GraceNoteGroup({ notes: gracenotes2 }).beamNotes(), 0); + notes2[5].addModifier(f.GraceNoteGroup({ notes: gracenotes3 }).beamNotes(), 0); + const voice = f.Voice().setStrict(false).addTickables(notes); + const voice2 = f.Voice().setStrict(false).addTickables(notes2); + f.Beam({ notes: notes.slice(0, 4) }); + f.Beam({ notes: notes.slice(4, 8) }); + f.Beam({ notes: notes2.slice(0, 4) }); + f.Beam({ notes: notes2.slice(4, 8) }); + f.Formatter().joinVoices([voice, voice2]).formatToStave([voice, voice2], stave); + f.draw(); + ok(true, 'Sixteenth Test'); +} +function multipleVoicesMultipleDraws(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 450, 140); + const stave = f.Stave({ x: 10, y: 10, width: 450 }); + const notes = [ + { keys: ['f/5'], stem_direction: 1, duration: '16' }, + { keys: ['f/5'], stem_direction: 1, duration: '16' }, + { keys: ['d/5'], stem_direction: 1, duration: '16' }, + { keys: ['c/5'], stem_direction: 1, duration: '16' }, + { keys: ['c/5'], stem_direction: 1, duration: '16' }, + { keys: ['d/5'], stem_direction: 1, duration: '16' }, + { keys: ['f/5'], stem_direction: 1, duration: '16' }, + { keys: ['e/5'], stem_direction: 1, duration: '16' }, + ].map(f.StaveNote.bind(f)); + const notes2 = [ + { keys: ['f/4'], stem_direction: -1, duration: '16' }, + { keys: ['e/4'], stem_direction: -1, duration: '16' }, + { keys: ['d/4'], stem_direction: -1, duration: '16' }, + { keys: ['c/4'], stem_direction: -1, duration: '16' }, + { keys: ['c/4'], stem_direction: -1, duration: '16' }, + { keys: ['d/4'], stem_direction: -1, duration: '16' }, + { keys: ['f/4'], stem_direction: -1, duration: '16' }, + { keys: ['e/4'], stem_direction: -1, duration: '16' }, + ].map(f.StaveNote.bind(f)); + const gracenotes1 = [{ keys: ['b/4'], stem_direction: 1, duration: '8', slash: true }].map(f.GraceNote.bind(f)); + const gracenotes2 = [{ keys: ['f/4'], stem_direction: -1, duration: '8', slash: true }].map(f.GraceNote.bind(f)); + const gracenotes3 = [ + { keys: ['f/4'], duration: '32', stem_direction: -1 }, + { keys: ['e/4'], duration: '32', stem_direction: -1 }, + ].map(f.GraceNote.bind(f)); + const gracenotes4 = [ + { keys: ['f/5'], duration: '32', stem_direction: 1 }, + { keys: ['e/5'], duration: '32', stem_direction: 1 }, + { keys: ['e/5'], duration: '8', stem_direction: 1 }, + ].map(f.GraceNote.bind(f)); + gracenotes2[0].setStemDirection(-1); + gracenotes2[0].addModifier(f.Accidental({ type: '#' }), 0); + notes[1].addModifier(f.GraceNoteGroup({ notes: gracenotes4 }).beamNotes(), 0); + notes[3].addModifier(f.GraceNoteGroup({ notes: gracenotes1 }), 0); + notes2[1].addModifier(f.GraceNoteGroup({ notes: gracenotes2 }).beamNotes(), 0); + notes2[5].addModifier(f.GraceNoteGroup({ notes: gracenotes3 }).beamNotes(), 0); + const voice = f.Voice().setStrict(false).addTickables(notes); + const voice2 = f.Voice().setStrict(false).addTickables(notes2); + f.Beam({ notes: notes.slice(0, 4) }); + f.Beam({ notes: notes.slice(4, 8) }); + f.Beam({ notes: notes2.slice(0, 4) }); + f.Beam({ notes: notes2.slice(4, 8) }); + f.Formatter().joinVoices([voice, voice2]).formatToStave([voice, voice2], stave); + f.draw(); + f.draw(); + ok(true, 'Seventeenth Test'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(GraceNoteTests); + + + +/***/ }), + +/***/ "./tests/gracetabnote_tests.ts": +/*!*************************************!*\ + !*** ./tests/gracetabnote_tests.ts ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "GraceTabNoteTests": () => (/* binding */ GraceTabNoteTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_flow__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/flow */ "./src/flow.ts"); +/* harmony import */ var _src_formatter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/formatter */ "./src/formatter.ts"); +/* harmony import */ var _src_gracenotegroup__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/gracenotegroup */ "./src/gracenotegroup.ts"); +/* harmony import */ var _src_gracetabnote__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/gracetabnote */ "./src/gracetabnote.ts"); +/* harmony import */ var _src_tabnote__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/tabnote */ "./src/tabnote.ts"); +/* harmony import */ var _src_tabstave__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/tabstave */ "./src/tabstave.ts"); +/* harmony import */ var _src_voice__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/voice */ "./src/voice.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// GraceTabNote Tests + + + + + + + + +const GraceTabNoteTests = { + Start() { + QUnit.module('Grace Tab Notes'); + // TODO: Rename tests below since it is redundant with the module name. + // Remove "Grace Tab Note " + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Grace Tab Note Simple', simple); + run('Grace Tab Note Slurred', slurred); + }, +}; +// Helper functions to create TabNote and GraceTabNote objects. +const tabNote = (noteStruct) => new _src_tabnote__WEBPACK_IMPORTED_MODULE_5__.TabNote(noteStruct); +const graceTabNote = (noteStruct) => new _src_gracetabnote__WEBPACK_IMPORTED_MODULE_4__.GraceTabNote(noteStruct); +/** + * Helper function to build a RenderContext and TabStave. + */ +function setupContext(opts, ctxBuilder) { + const context = ctxBuilder(opts.elementId, 350, 140); + const stave = new _src_tabstave__WEBPACK_IMPORTED_MODULE_6__.TabStave(10, 10, 350).addTabGlyph().setContext(context).draw(); + return { context, stave }; +} +function simple(options, contextBuilder) { + const { context, stave } = setupContext(options, contextBuilder); + const note0 = tabNote({ positions: [{ str: 4, fret: 6 }], duration: '4' }); + const note1 = tabNote({ positions: [{ str: 4, fret: 12 }], duration: '4' }); + const note2 = tabNote({ positions: [{ str: 4, fret: 10 }], duration: '4' }); + const note3 = tabNote({ positions: [{ str: 4, fret: 10 }], duration: '4' }); + const gracenote_group0 = [{ positions: [{ str: 4, fret: 'x' }], duration: '8' }]; + const gracenote_group1 = [ + { positions: [{ str: 4, fret: 9 }], duration: '16' }, + { positions: [{ str: 4, fret: 10 }], duration: '16' }, + ]; + const gracenote_group2 = [{ positions: [{ str: 4, fret: 9 }], duration: '8' }]; + const gracenote_group3 = [ + { positions: [{ str: 5, fret: 10 }], duration: '8' }, + { positions: [{ str: 4, fret: 9 }], duration: '8' }, + ]; + const gracenotes0 = gracenote_group0.map(graceTabNote); + const gracenotes1 = gracenote_group1.map(graceTabNote); + const gracenotes2 = gracenote_group2.map(graceTabNote); + gracenotes2[0].setGhost(true); + const gracenotes3 = gracenote_group3.map(graceTabNote); + note0.addModifier(new _src_gracenotegroup__WEBPACK_IMPORTED_MODULE_3__.GraceNoteGroup(gracenotes0), 0); + note1.addModifier(new _src_gracenotegroup__WEBPACK_IMPORTED_MODULE_3__.GraceNoteGroup(gracenotes1), 0); + note2.addModifier(new _src_gracenotegroup__WEBPACK_IMPORTED_MODULE_3__.GraceNoteGroup(gracenotes2), 0); + note3.addModifier(new _src_gracenotegroup__WEBPACK_IMPORTED_MODULE_3__.GraceNoteGroup(gracenotes3), 0); + const voice = new _src_voice__WEBPACK_IMPORTED_MODULE_7__.Voice(_src_flow__WEBPACK_IMPORTED_MODULE_1__.Flow.TIME4_4); + voice.addTickables([note0, note1, note2, note3]); + new _src_formatter__WEBPACK_IMPORTED_MODULE_2__.Formatter().joinVoices([voice]).format([voice], 250); + voice.draw(context, stave); + ok(true, 'Simple Test'); +} +function slurred(options, contextBuilder) { + const { context, stave } = setupContext(options, contextBuilder); + const note0 = tabNote({ positions: [{ str: 4, fret: 12 }], duration: 'h' }); + const note1 = tabNote({ positions: [{ str: 4, fret: 10 }], duration: 'h' }); + const gracenote_group0 = [ + { positions: [{ str: 4, fret: 9 }], duration: '8' }, + { positions: [{ str: 4, fret: 10 }], duration: '8' }, + ]; + const gracenote_group1 = [ + { positions: [{ str: 4, fret: 7 }], duration: '16' }, + { positions: [{ str: 4, fret: 8 }], duration: '16' }, + { positions: [{ str: 4, fret: 9 }], duration: '16' }, + ]; + const gracenotes0 = gracenote_group0.map(graceTabNote); + const gracenotes1 = gracenote_group1.map(graceTabNote); + note0.addModifier(new _src_gracenotegroup__WEBPACK_IMPORTED_MODULE_3__.GraceNoteGroup(gracenotes0, true), 0); + note1.addModifier(new _src_gracenotegroup__WEBPACK_IMPORTED_MODULE_3__.GraceNoteGroup(gracenotes1, true), 0); + const voice = new _src_voice__WEBPACK_IMPORTED_MODULE_7__.Voice(_src_flow__WEBPACK_IMPORTED_MODULE_1__.Flow.TIME4_4); + voice.addTickables([note0, note1]); + new _src_formatter__WEBPACK_IMPORTED_MODULE_2__.Formatter().joinVoices([voice]).format([voice], 200); + voice.draw(context, stave); + ok(true, 'Slurred Test'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(GraceTabNoteTests); + + + +/***/ }), + +/***/ "./tests/index.ts": +/*!************************!*\ + !*** ./tests/index.ts ***! + \************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "AccidentalTests": () => (/* reexport safe */ _accidental_tests__WEBPACK_IMPORTED_MODULE_0__.AccidentalTests), +/* harmony export */ "AnnotationTests": () => (/* reexport safe */ _annotation_tests__WEBPACK_IMPORTED_MODULE_1__.AnnotationTests), +/* harmony export */ "ArticulationTests": () => (/* reexport safe */ _articulation_tests__WEBPACK_IMPORTED_MODULE_2__.ArticulationTests), +/* harmony export */ "AutoBeamFormattingTests": () => (/* reexport safe */ _auto_beam_formatting_tests__WEBPACK_IMPORTED_MODULE_3__.AutoBeamFormattingTests), +/* harmony export */ "BachDemoTests": () => (/* reexport safe */ _bach_tests__WEBPACK_IMPORTED_MODULE_4__.BachDemoTests), +/* harmony export */ "BarlineTests": () => (/* reexport safe */ _barline_tests__WEBPACK_IMPORTED_MODULE_5__.BarlineTests), +/* harmony export */ "BeamTests": () => (/* reexport safe */ _beam_tests__WEBPACK_IMPORTED_MODULE_6__.BeamTests), +/* harmony export */ "BendTests": () => (/* reexport safe */ _bend_tests__WEBPACK_IMPORTED_MODULE_7__.BendTests), +/* harmony export */ "BoundingBoxTests": () => (/* reexport safe */ _boundingbox_tests__WEBPACK_IMPORTED_MODULE_8__.BoundingBoxTests), +/* harmony export */ "BoundingBoxComputationTests": () => (/* reexport safe */ _boundingboxcomputation_tests__WEBPACK_IMPORTED_MODULE_9__.BoundingBoxComputationTests), +/* harmony export */ "ChordSymbolTests": () => (/* reexport safe */ _chordsymbol_tests__WEBPACK_IMPORTED_MODULE_10__.ChordSymbolTests), +/* harmony export */ "ClefTests": () => (/* reexport safe */ _clef_tests__WEBPACK_IMPORTED_MODULE_11__.ClefTests), +/* harmony export */ "CurveTests": () => (/* reexport safe */ _curve_tests__WEBPACK_IMPORTED_MODULE_12__.CurveTests), +/* harmony export */ "DotTests": () => (/* reexport safe */ _dot_tests__WEBPACK_IMPORTED_MODULE_13__.DotTests), +/* harmony export */ "EasyScoreTests": () => (/* reexport safe */ _easyscore_tests__WEBPACK_IMPORTED_MODULE_14__.EasyScoreTests), +/* harmony export */ "FactoryTests": () => (/* reexport safe */ _factory_tests__WEBPACK_IMPORTED_MODULE_15__.FactoryTests), +/* harmony export */ "FontTests": () => (/* reexport safe */ _font_tests__WEBPACK_IMPORTED_MODULE_16__.FontTests), +/* harmony export */ "FormatterTests": () => (/* reexport safe */ _formatter_tests__WEBPACK_IMPORTED_MODULE_17__.FormatterTests), +/* harmony export */ "FractionTests": () => (/* reexport safe */ _fraction_tests__WEBPACK_IMPORTED_MODULE_18__.FractionTests), +/* harmony export */ "GhostNoteTests": () => (/* reexport safe */ _ghostnote_tests__WEBPACK_IMPORTED_MODULE_19__.GhostNoteTests), +/* harmony export */ "GlyphNoteTests": () => (/* reexport safe */ _glyphnote_tests__WEBPACK_IMPORTED_MODULE_20__.GlyphNoteTests), +/* harmony export */ "GraceNoteTests": () => (/* reexport safe */ _gracenote_tests__WEBPACK_IMPORTED_MODULE_21__.GraceNoteTests), +/* harmony export */ "GraceTabNoteTests": () => (/* reexport safe */ _gracetabnote_tests__WEBPACK_IMPORTED_MODULE_22__.GraceTabNoteTests), +/* harmony export */ "ClefKeySignatureTests": () => (/* reexport safe */ _key_clef_tests__WEBPACK_IMPORTED_MODULE_23__.ClefKeySignatureTests), +/* harmony export */ "KeyManagerTests": () => (/* reexport safe */ _keymanager_tests__WEBPACK_IMPORTED_MODULE_24__.KeyManagerTests), +/* harmony export */ "KeySignatureTests": () => (/* reexport safe */ _keysignature_tests__WEBPACK_IMPORTED_MODULE_25__.KeySignatureTests), +/* harmony export */ "ModifierContextTests": () => (/* reexport safe */ _modifier_tests__WEBPACK_IMPORTED_MODULE_26__.ModifierContextTests), +/* harmony export */ "MultiMeasureRestTests": () => (/* reexport safe */ _multimeasurerest_tests__WEBPACK_IMPORTED_MODULE_27__.MultiMeasureRestTests), +/* harmony export */ "MusicTests": () => (/* reexport safe */ _music_tests__WEBPACK_IMPORTED_MODULE_28__.MusicTests), +/* harmony export */ "NoteHeadTests": () => (/* reexport safe */ _notehead_tests__WEBPACK_IMPORTED_MODULE_29__.NoteHeadTests), +/* harmony export */ "NoteSubGroupTests": () => (/* reexport safe */ _notesubgroup_tests__WEBPACK_IMPORTED_MODULE_30__.NoteSubGroupTests), +/* harmony export */ "OffscreenCanvasTests": () => (/* reexport safe */ _offscreencanvas_tests__WEBPACK_IMPORTED_MODULE_31__.OffscreenCanvasTests), +/* harmony export */ "OrnamentTests": () => (/* reexport safe */ _ornament_tests__WEBPACK_IMPORTED_MODULE_32__.OrnamentTests), +/* harmony export */ "ParserTests": () => (/* reexport safe */ _parser_tests__WEBPACK_IMPORTED_MODULE_33__.ParserTests), +/* harmony export */ "PedalMarkingTests": () => (/* reexport safe */ _pedalmarking_tests__WEBPACK_IMPORTED_MODULE_34__.PedalMarkingTests), +/* harmony export */ "PercussionTests": () => (/* reexport safe */ _percussion_tests__WEBPACK_IMPORTED_MODULE_35__.PercussionTests), +/* harmony export */ "RegistryTests": () => (/* reexport safe */ _registry_tests__WEBPACK_IMPORTED_MODULE_36__.RegistryTests), +/* harmony export */ "RendererTests": () => (/* reexport safe */ _renderer_tests__WEBPACK_IMPORTED_MODULE_37__.RendererTests), +/* harmony export */ "RestsTests": () => (/* reexport safe */ _rests_tests__WEBPACK_IMPORTED_MODULE_38__.RestsTests), +/* harmony export */ "RhythmTests": () => (/* reexport safe */ _rhythm_tests__WEBPACK_IMPORTED_MODULE_39__.RhythmTests), +/* harmony export */ "StaveTests": () => (/* reexport safe */ _stave_tests__WEBPACK_IMPORTED_MODULE_40__.StaveTests), +/* harmony export */ "StaveConnectorTests": () => (/* reexport safe */ _staveconnector_tests__WEBPACK_IMPORTED_MODULE_41__.StaveConnectorTests), +/* harmony export */ "StaveHairpinTests": () => (/* reexport safe */ _stavehairpin_tests__WEBPACK_IMPORTED_MODULE_42__.StaveHairpinTests), +/* harmony export */ "StaveLineTests": () => (/* reexport safe */ _staveline_tests__WEBPACK_IMPORTED_MODULE_43__.StaveLineTests), +/* harmony export */ "StaveModifierTests": () => (/* reexport safe */ _stavemodifier_tests__WEBPACK_IMPORTED_MODULE_44__.StaveModifierTests), +/* harmony export */ "StaveNoteTests": () => (/* reexport safe */ _stavenote_tests__WEBPACK_IMPORTED_MODULE_45__.StaveNoteTests), +/* harmony export */ "StaveTieTests": () => (/* reexport safe */ _stavetie_tests__WEBPACK_IMPORTED_MODULE_46__.StaveTieTests), +/* harmony export */ "StringNumberTests": () => (/* reexport safe */ _stringnumber_tests__WEBPACK_IMPORTED_MODULE_47__.StringNumberTests), +/* harmony export */ "StrokesTests": () => (/* reexport safe */ _strokes_tests__WEBPACK_IMPORTED_MODULE_48__.StrokesTests), +/* harmony export */ "StyleTests": () => (/* reexport safe */ _style_tests__WEBPACK_IMPORTED_MODULE_49__.StyleTests), +/* harmony export */ "TabNoteTests": () => (/* reexport safe */ _tabnote_tests__WEBPACK_IMPORTED_MODULE_50__.TabNoteTests), +/* harmony export */ "TabSlideTests": () => (/* reexport safe */ _tabslide_tests__WEBPACK_IMPORTED_MODULE_51__.TabSlideTests), +/* harmony export */ "TabStaveTests": () => (/* reexport safe */ _tabstave_tests__WEBPACK_IMPORTED_MODULE_52__.TabStaveTests), +/* harmony export */ "TabTieTests": () => (/* reexport safe */ _tabtie_tests__WEBPACK_IMPORTED_MODULE_53__.TabTieTests), +/* harmony export */ "TextBracketTests": () => (/* reexport safe */ _textbracket_tests__WEBPACK_IMPORTED_MODULE_54__.TextBracketTests), +/* harmony export */ "TextFormatterTests": () => (/* reexport safe */ _textformatter_tests__WEBPACK_IMPORTED_MODULE_55__.TextFormatterTests), +/* harmony export */ "TextNoteTests": () => (/* reexport safe */ _textnote_tests__WEBPACK_IMPORTED_MODULE_56__.TextNoteTests), +/* harmony export */ "ThreeVoicesTests": () => (/* reexport safe */ _threevoice_tests__WEBPACK_IMPORTED_MODULE_57__.ThreeVoicesTests), +/* harmony export */ "TickContextTests": () => (/* reexport safe */ _tickcontext_tests__WEBPACK_IMPORTED_MODULE_58__.TickContextTests), +/* harmony export */ "TimeSignatureTests": () => (/* reexport safe */ _timesignature_tests__WEBPACK_IMPORTED_MODULE_59__.TimeSignatureTests), +/* harmony export */ "TremoloTests": () => (/* reexport safe */ _tremolo_tests__WEBPACK_IMPORTED_MODULE_60__.TremoloTests), +/* harmony export */ "TuningTests": () => (/* reexport safe */ _tuning_tests__WEBPACK_IMPORTED_MODULE_61__.TuningTests), +/* harmony export */ "TupletTests": () => (/* reexport safe */ _tuplet_tests__WEBPACK_IMPORTED_MODULE_62__.TupletTests), +/* harmony export */ "TypeGuardTests": () => (/* reexport safe */ _typeguard_tests__WEBPACK_IMPORTED_MODULE_63__.TypeGuardTests), +/* harmony export */ "VFPrefixTests": () => (/* reexport safe */ _vf_prefix_tests__WEBPACK_IMPORTED_MODULE_64__.VFPrefixTests), +/* harmony export */ "VibratoTests": () => (/* reexport safe */ _vibrato_tests__WEBPACK_IMPORTED_MODULE_65__.VibratoTests), +/* harmony export */ "VibratoBracketTests": () => (/* reexport safe */ _vibratobracket_tests__WEBPACK_IMPORTED_MODULE_66__.VibratoBracketTests), +/* harmony export */ "VoiceTests": () => (/* reexport safe */ _voice_tests__WEBPACK_IMPORTED_MODULE_67__.VoiceTests) +/* harmony export */ }); +/* harmony import */ var _accidental_tests__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./accidental_tests */ "./tests/accidental_tests.ts"); +/* harmony import */ var _annotation_tests__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./annotation_tests */ "./tests/annotation_tests.ts"); +/* harmony import */ var _articulation_tests__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./articulation_tests */ "./tests/articulation_tests.ts"); +/* harmony import */ var _auto_beam_formatting_tests__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./auto_beam_formatting_tests */ "./tests/auto_beam_formatting_tests.ts"); +/* harmony import */ var _bach_tests__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./bach_tests */ "./tests/bach_tests.ts"); +/* harmony import */ var _barline_tests__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./barline_tests */ "./tests/barline_tests.ts"); +/* harmony import */ var _beam_tests__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./beam_tests */ "./tests/beam_tests.ts"); +/* harmony import */ var _bend_tests__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./bend_tests */ "./tests/bend_tests.ts"); +/* harmony import */ var _boundingbox_tests__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./boundingbox_tests */ "./tests/boundingbox_tests.ts"); +/* harmony import */ var _boundingboxcomputation_tests__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./boundingboxcomputation_tests */ "./tests/boundingboxcomputation_tests.ts"); +/* harmony import */ var _chordsymbol_tests__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./chordsymbol_tests */ "./tests/chordsymbol_tests.ts"); +/* harmony import */ var _clef_tests__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./clef_tests */ "./tests/clef_tests.ts"); +/* harmony import */ var _curve_tests__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./curve_tests */ "./tests/curve_tests.ts"); +/* harmony import */ var _dot_tests__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./dot_tests */ "./tests/dot_tests.ts"); +/* harmony import */ var _easyscore_tests__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./easyscore_tests */ "./tests/easyscore_tests.ts"); +/* harmony import */ var _factory_tests__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./factory_tests */ "./tests/factory_tests.ts"); +/* harmony import */ var _font_tests__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./font_tests */ "./tests/font_tests.ts"); +/* harmony import */ var _formatter_tests__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./formatter_tests */ "./tests/formatter_tests.ts"); +/* harmony import */ var _fraction_tests__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./fraction_tests */ "./tests/fraction_tests.ts"); +/* harmony import */ var _ghostnote_tests__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./ghostnote_tests */ "./tests/ghostnote_tests.ts"); +/* harmony import */ var _glyphnote_tests__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./glyphnote_tests */ "./tests/glyphnote_tests.ts"); +/* harmony import */ var _gracenote_tests__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./gracenote_tests */ "./tests/gracenote_tests.ts"); +/* harmony import */ var _gracetabnote_tests__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./gracetabnote_tests */ "./tests/gracetabnote_tests.ts"); +/* harmony import */ var _key_clef_tests__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./key_clef_tests */ "./tests/key_clef_tests.ts"); +/* harmony import */ var _keymanager_tests__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./keymanager_tests */ "./tests/keymanager_tests.ts"); +/* harmony import */ var _keysignature_tests__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./keysignature_tests */ "./tests/keysignature_tests.ts"); +/* harmony import */ var _modifier_tests__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./modifier_tests */ "./tests/modifier_tests.ts"); +/* harmony import */ var _multimeasurerest_tests__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./multimeasurerest_tests */ "./tests/multimeasurerest_tests.ts"); +/* harmony import */ var _music_tests__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./music_tests */ "./tests/music_tests.ts"); +/* harmony import */ var _notehead_tests__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./notehead_tests */ "./tests/notehead_tests.ts"); +/* harmony import */ var _notesubgroup_tests__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./notesubgroup_tests */ "./tests/notesubgroup_tests.ts"); +/* harmony import */ var _offscreencanvas_tests__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./offscreencanvas_tests */ "./tests/offscreencanvas_tests.ts"); +/* harmony import */ var _ornament_tests__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./ornament_tests */ "./tests/ornament_tests.ts"); +/* harmony import */ var _parser_tests__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./parser_tests */ "./tests/parser_tests.ts"); +/* harmony import */ var _pedalmarking_tests__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./pedalmarking_tests */ "./tests/pedalmarking_tests.ts"); +/* harmony import */ var _percussion_tests__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./percussion_tests */ "./tests/percussion_tests.ts"); +/* harmony import */ var _registry_tests__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./registry_tests */ "./tests/registry_tests.ts"); +/* harmony import */ var _renderer_tests__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./renderer_tests */ "./tests/renderer_tests.ts"); +/* harmony import */ var _rests_tests__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./rests_tests */ "./tests/rests_tests.ts"); +/* harmony import */ var _rhythm_tests__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./rhythm_tests */ "./tests/rhythm_tests.ts"); +/* harmony import */ var _stave_tests__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./stave_tests */ "./tests/stave_tests.ts"); +/* harmony import */ var _staveconnector_tests__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./staveconnector_tests */ "./tests/staveconnector_tests.ts"); +/* harmony import */ var _stavehairpin_tests__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./stavehairpin_tests */ "./tests/stavehairpin_tests.ts"); +/* harmony import */ var _staveline_tests__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./staveline_tests */ "./tests/staveline_tests.ts"); +/* harmony import */ var _stavemodifier_tests__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ./stavemodifier_tests */ "./tests/stavemodifier_tests.ts"); +/* harmony import */ var _stavenote_tests__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ./stavenote_tests */ "./tests/stavenote_tests.ts"); +/* harmony import */ var _stavetie_tests__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ./stavetie_tests */ "./tests/stavetie_tests.ts"); +/* harmony import */ var _stringnumber_tests__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ./stringnumber_tests */ "./tests/stringnumber_tests.ts"); +/* harmony import */ var _strokes_tests__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ./strokes_tests */ "./tests/strokes_tests.ts"); +/* harmony import */ var _style_tests__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ./style_tests */ "./tests/style_tests.ts"); +/* harmony import */ var _tabnote_tests__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! ./tabnote_tests */ "./tests/tabnote_tests.ts"); +/* harmony import */ var _tabslide_tests__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! ./tabslide_tests */ "./tests/tabslide_tests.ts"); +/* harmony import */ var _tabstave_tests__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! ./tabstave_tests */ "./tests/tabstave_tests.ts"); +/* harmony import */ var _tabtie_tests__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! ./tabtie_tests */ "./tests/tabtie_tests.ts"); +/* harmony import */ var _textbracket_tests__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! ./textbracket_tests */ "./tests/textbracket_tests.ts"); +/* harmony import */ var _textformatter_tests__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! ./textformatter_tests */ "./tests/textformatter_tests.ts"); +/* harmony import */ var _textnote_tests__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! ./textnote_tests */ "./tests/textnote_tests.ts"); +/* harmony import */ var _threevoice_tests__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! ./threevoice_tests */ "./tests/threevoice_tests.ts"); +/* harmony import */ var _tickcontext_tests__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! ./tickcontext_tests */ "./tests/tickcontext_tests.ts"); +/* harmony import */ var _timesignature_tests__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! ./timesignature_tests */ "./tests/timesignature_tests.ts"); +/* harmony import */ var _tremolo_tests__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(/*! ./tremolo_tests */ "./tests/tremolo_tests.ts"); +/* harmony import */ var _tuning_tests__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(/*! ./tuning_tests */ "./tests/tuning_tests.ts"); +/* harmony import */ var _tuplet_tests__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(/*! ./tuplet_tests */ "./tests/tuplet_tests.ts"); +/* harmony import */ var _typeguard_tests__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(/*! ./typeguard_tests */ "./tests/typeguard_tests.ts"); +/* harmony import */ var _vf_prefix_tests__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(/*! ./vf_prefix_tests */ "./tests/vf_prefix_tests.ts"); +/* harmony import */ var _vibrato_tests__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(/*! ./vibrato_tests */ "./tests/vibrato_tests.ts"); +/* harmony import */ var _vibratobracket_tests__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(/*! ./vibratobracket_tests */ "./tests/vibratobracket_tests.ts"); +/* harmony import */ var _voice_tests__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(/*! ./voice_tests */ "./tests/voice_tests.ts"); +// vexflow-debug-with-tests.ts includes this module via: +// export * from '../../tests'; +// +// To add a new test module, add a new line: +// `export * from './xxxx_tests';` +// to this file that points to the new file `xxxx_tests.ts`. +// +// The test module needs to call VexFlowTests.register(...). +// For example, in annotation_tests.ts, the last two lines are: +// VexFlowTests.register(AnnotationTests); +// export { AnnotationTests }; +// +// In vexflow_test_helpers.ts: VexFlowTests.run() will run all registered tests. +// +// To iterate faster during development, you can comment out most of this file +// and focus on just testing the module(s) you are currently working on. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +/***/ }), + +/***/ "./tests/key_clef_tests.ts": +/*!*********************************!*\ + !*** ./tests/key_clef_tests.ts ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ClefKeySignatureTests": () => (/* binding */ ClefKeySignatureTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_glyph__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/glyph */ "./src/glyph.ts"); +/* harmony import */ var _src_keysignature__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/keysignature */ "./src/keysignature.ts"); +/* harmony import */ var _src_stave__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/stave */ "./src/stave.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Clef Key Signature Tests +// + + + + +const ClefKeySignatureTests = { + Start() { + QUnit.module('Clef Keys'); + // Removed an identical 'Key Parser Test'. See keysignature_tests.ts. + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Major Key Clef Test', keys, { majorKeys: true }); + run('Minor Key Clef Test', keys, { majorKeys: false }); + run('Stave Helper', staveHelper); + }, +}; +const fontWidths = () => { + const glyphScale = 39; // default font scale + const sharpWidth = _src_glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.getWidth('accidentalSharp', glyphScale) + 1; + const flatWidth = _src_glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.getWidth('accidentalFlat', glyphScale) + 1; + const ksPadding = 10; // hard-coded in keysignature.ts + const naturalWidth = _src_glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.getWidth('accidentalNatural', glyphScale) + 2; + const clefWidth = _src_glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.getWidth('gClef', glyphScale); // widest clef + return { sharpWidth, flatWidth, naturalWidth, clefWidth, ksPadding }; +}; +function keys(options, contextBuilder) { + const w = fontWidths(); + const accidentalCount = 28; // total number in all the keys + const sharpTestWidth = accidentalCount * w.sharpWidth + w.clefWidth + _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave.defaultPadding + 6 * w.ksPadding; + const flatTestWidth = accidentalCount * w.flatWidth + w.clefWidth + _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave.defaultPadding + 6 * w.ksPadding; + const clefs = [ + 'treble', + 'soprano', + 'mezzo-soprano', + 'alto', + 'tenor', + 'baritone-f', + 'baritone-c', + 'bass', + 'french', + 'subbass', + 'percussion', + ]; + const ctx = contextBuilder(options.elementId, Math.max(sharpTestWidth, flatTestWidth) + 100, 20 + 80 * 2 * clefs.length); + const staves = []; + const keys = options.params.majorKeys ? _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.MAJOR_KEYS : _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.MINOR_KEYS; + let i; + let flat; + let sharp; + let keySig; + const yOffsetForFlatStaves = 10 + 80 * clefs.length; + for (i = 0; i < clefs.length; i++) { + // Render all the sharps first, then all the flats: + staves[i] = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(10, 10 + 80 * i, flatTestWidth); + staves[i].addClef(clefs[i]); + staves[i + clefs.length] = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(10, yOffsetForFlatStaves + 10 + 80 * i, sharpTestWidth); + staves[i + clefs.length].addClef(clefs[i]); + for (flat = 0; flat < 8; flat++) { + keySig = new _src_keysignature__WEBPACK_IMPORTED_MODULE_2__.KeySignature(keys[flat]); + keySig.addToStave(staves[i]); + } + for (sharp = 8; sharp < keys.length; sharp++) { + keySig = new _src_keysignature__WEBPACK_IMPORTED_MODULE_2__.KeySignature(keys[sharp]); + keySig.addToStave(staves[i + clefs.length]); + } + staves[i].setContext(ctx); + staves[i].draw(); + staves[i + clefs.length].setContext(ctx); + staves[i + clefs.length].draw(); + } + ok(true, 'all pass'); +} +function staveHelper(options, contextBuilder) { + const w = fontWidths(); + const accidentalCount = 28; // total number in all the keys + const sharpTestWidth = accidentalCount * w.sharpWidth + w.clefWidth + _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave.defaultPadding + 7 * w.ksPadding; + const flatTestWidth = accidentalCount * w.flatWidth + w.clefWidth + _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave.defaultPadding + 7 * w.ksPadding; + const ctx = contextBuilder(options.elementId, Math.max(sharpTestWidth, flatTestWidth) + 100, 400); + const stave1 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(10, 10, flatTestWidth); + const stave2 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(10, 90, flatTestWidth); + const stave3 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(10, 170, sharpTestWidth); + const stave4 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(10, 260, sharpTestWidth); + const keys = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.MAJOR_KEYS; + stave1.addClef('treble'); + stave2.addClef('bass'); + stave3.addClef('alto'); + stave4.addClef('tenor'); + for (let n = 0; n < 8; ++n) { + stave1.addKeySignature(keys[n]); + stave2.addKeySignature(keys[n]); + } + for (let i = 8; i < keys.length; ++i) { + stave3.addKeySignature(keys[i]); + stave4.addKeySignature(keys[i]); + } + stave1.setContext(ctx); + stave1.draw(); + stave2.setContext(ctx); + stave2.draw(); + stave3.setContext(ctx); + stave3.draw(); + stave4.setContext(ctx); + stave4.draw(); + ok(true, 'all pass'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(ClefKeySignatureTests); + + + +/***/ }), + +/***/ "./tests/keymanager_tests.ts": +/*!***********************************!*\ + !*** ./tests/keymanager_tests.ts ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "KeyManagerTests": () => (/* binding */ KeyManagerTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/index */ "./src/index.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Music Key Management Tests +// +// TODO: KeyManager.getAccidental(key) specifies that the return value's .accidental property is string | undefined. +// However, we check it against null. + + +const KeyManagerTests = { + Start() { + QUnit.module('KeyManager'); + test('Valid Notes', works); + test('Select Notes', selectNotes); + }, +}; +function works() { + const manager = new _src_index__WEBPACK_IMPORTED_MODULE_1__.KeyManager('g'); + equal(manager.getAccidental('f').accidental, '#'); + manager.setKey('a'); + equal(manager.getAccidental('c').accidental, '#'); + equal(manager.getAccidental('a').accidental, null); + equal(manager.getAccidental('f').accidental, '#'); + manager.setKey('A'); + equal(manager.getAccidental('c').accidental, '#'); + equal(manager.getAccidental('a').accidental, null); + equal(manager.getAccidental('f').accidental, '#'); +} +function selectNotes() { + const manager = new _src_index__WEBPACK_IMPORTED_MODULE_1__.KeyManager('f'); + equal(manager.selectNote('bb').note, 'bb'); + equal(manager.selectNote('bb').accidental, 'b'); + equal(manager.selectNote('g').note, 'g'); + equal(manager.selectNote('g').accidental, null); + equal(manager.selectNote('b').note, 'b'); + equal(manager.selectNote('b').accidental, null); + equal(manager.selectNote('a#').note, 'bb'); + equal(manager.selectNote('g#').note, 'g#'); + // Changes have no effect? + equal(manager.selectNote('g#').note, 'g#'); + equal(manager.selectNote('bb').note, 'bb'); + equal(manager.selectNote('bb').accidental, 'b'); + equal(manager.selectNote('g').note, 'g'); + equal(manager.selectNote('g').accidental, null); + equal(manager.selectNote('b').note, 'b'); + equal(manager.selectNote('b').accidental, null); + equal(manager.selectNote('a#').note, 'bb'); + equal(manager.selectNote('g#').note, 'g#'); + // Changes should propagate + manager.reset(); + equal(manager.selectNote('g#').change, true); + equal(manager.selectNote('g#').change, false); + equal(manager.selectNote('g').change, true); + equal(manager.selectNote('g').change, false); + equal(manager.selectNote('g#').change, true); + manager.reset(); + let note = manager.selectNote('bb'); + equal(note.change, false); + equal(note.accidental, 'b'); + note = manager.selectNote('g'); + equal(note.change, false); + equal(note.accidental, null); + note = manager.selectNote('g#'); + equal(note.change, true); + equal(note.accidental, '#'); + note = manager.selectNote('g'); + equal(note.change, true); + equal(note.accidental, null); + note = manager.selectNote('g'); + equal(note.change, false); + equal(note.accidental, null); + note = manager.selectNote('g#'); + equal(note.change, true); + equal(note.accidental, '#'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(KeyManagerTests); + + + +/***/ }), + +/***/ "./tests/keysignature_tests.ts": +/*!*************************************!*\ + !*** ./tests/keysignature_tests.ts ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "KeySignatureTests": () => (/* binding */ KeySignatureTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_flow__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/flow */ "./src/flow.ts"); +/* harmony import */ var _src_glyph__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/glyph */ "./src/glyph.ts"); +/* harmony import */ var _src_keysignature__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/keysignature */ "./src/keysignature.ts"); +/* harmony import */ var _src_stave__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/stave */ "./src/stave.ts"); +/* harmony import */ var _src_stavebarline__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/stavebarline */ "./src/stavebarline.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Key Signature Tests +// + + + + + + +const KeySignatureTests = { + Start() { + QUnit.module('KeySignature'); + test('Key Parser Test', parser); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Major Key Test', majorKeys); + run('Minor Key Test', minorKeys); + run('Stave Helper', staveHelper); + run('Cancelled key test', majorKeysCanceled); + run('Cancelled key (for each clef) test', keysCanceledForEachClef); + run('Altered key test', majorKeysAltered); + run('End key with clef test', endKeyWithClef); + run('Key Signature Change test', changeKey); + }, +}; +const fontWidths = () => { + const glyphScale = 39; // default font scale + const sharpWidth = _src_glyph__WEBPACK_IMPORTED_MODULE_2__.Glyph.getWidth('accidentalSharp', glyphScale) + 1; + const flatWidth = _src_glyph__WEBPACK_IMPORTED_MODULE_2__.Glyph.getWidth('accidentalFlat', glyphScale) + 1; + const naturalWidth = _src_glyph__WEBPACK_IMPORTED_MODULE_2__.Glyph.getWidth('accidentalNatural', glyphScale) + 2; + const clefWidth = _src_glyph__WEBPACK_IMPORTED_MODULE_2__.Glyph.getWidth('gClef', glyphScale) * 2; // widest clef + return { sharpWidth, flatWidth, naturalWidth, clefWidth }; +}; +function parser() { + expect(11); + function catchError(spec) { + throws(() => _src_flow__WEBPACK_IMPORTED_MODULE_1__.Flow.keySignature(spec), /BadKeySignature/); + } + catchError('asdf'); + catchError('D!'); + catchError('E#'); + catchError('D#'); + catchError('#'); + catchError('b'); + catchError('Kb'); + catchError('Fb'); + catchError('Dbm'); + catchError('B#m'); + _src_flow__WEBPACK_IMPORTED_MODULE_1__.Flow.keySignature('B'); + _src_flow__WEBPACK_IMPORTED_MODULE_1__.Flow.keySignature('C'); + _src_flow__WEBPACK_IMPORTED_MODULE_1__.Flow.keySignature('Fm'); + _src_flow__WEBPACK_IMPORTED_MODULE_1__.Flow.keySignature('Ab'); + _src_flow__WEBPACK_IMPORTED_MODULE_1__.Flow.keySignature('Abm'); + _src_flow__WEBPACK_IMPORTED_MODULE_1__.Flow.keySignature('F#'); + _src_flow__WEBPACK_IMPORTED_MODULE_1__.Flow.keySignature('G#m'); + ok(true, 'all pass'); +} +function majorKeys(options, contextBuilder) { + const w = fontWidths(); + const accidentalCount = 28; // total number in all the keys + const casePadding = 10; // hard-coded in staveModifier + const testCases = 7; // all keys, but includes key of C + const sharpTestWidth = accidentalCount * w.sharpWidth + casePadding * testCases + _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave.defaultPadding; + const flatTestWidth = accidentalCount * w.flatWidth + casePadding * testCases + _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave.defaultPadding; + const ctx = contextBuilder(options.elementId, Math.max(sharpTestWidth, flatTestWidth) + 100, 240); + const stave1 = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(10, 10, flatTestWidth); + const stave2 = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(10, 90, sharpTestWidth); + const keys = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.MAJOR_KEYS; + let keySig = null; + for (let i = 0; i < 8; ++i) { + keySig = new _src_keysignature__WEBPACK_IMPORTED_MODULE_3__.KeySignature(keys[i]); + keySig.addToStave(stave1); + } + for (let n = 8; n < keys.length; ++n) { + keySig = new _src_keysignature__WEBPACK_IMPORTED_MODULE_3__.KeySignature(keys[n]); + keySig.addToStave(stave2); + } + stave1.setContext(ctx); + stave1.draw(); + stave2.setContext(ctx); + stave2.draw(); + ok(true, 'all pass'); +} +function majorKeysCanceled(options, contextBuilder) { + const scale = 0.9; + const w = fontWidths(); + const flatPadding = 18; + const sharpPadding = 20; + const flatTestCases = 8; + const sharpTestCases = 7; + // magic numbers are the numbers of that symbol that appear in the test case + const sharpTestWidth = 28 * w.sharpWidth + 21 * w.naturalWidth + sharpPadding * sharpTestCases + _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave.defaultPadding + w.clefWidth; + const flatTestWidth = 28 * w.flatWidth + 28 * w.naturalWidth + flatPadding * flatTestCases + _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave.defaultPadding + w.clefWidth; + const eFlatTestWidth = 28 * w.flatWidth + 32 * w.naturalWidth + flatPadding * flatTestCases + _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave.defaultPadding + w.clefWidth; + const eSharpTestWidth = 28 * w.sharpWidth + 28 * w.naturalWidth + sharpPadding * sharpTestCases + _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave.defaultPadding + w.clefWidth; + const maxWidth = Math.max(Math.max(sharpTestWidth, flatTestWidth, Math.max(eSharpTestWidth, eFlatTestWidth))); + const ctx = contextBuilder(options.elementId, maxWidth + 100, 500); + ctx.scale(scale, scale); + const stave1 = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(10, 10, flatTestWidth).addClef('treble'); + const stave2 = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(10, 90, sharpTestWidth).addClef('treble'); + const stave3 = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(10, 170, eFlatTestWidth).addClef('treble'); + const stave4 = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(10, 250, eSharpTestWidth).addClef('treble'); + const keys = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.MAJOR_KEYS; + let keySig = null; + let i; + let n; + for (i = 0; i < 8; ++i) { + keySig = new _src_keysignature__WEBPACK_IMPORTED_MODULE_3__.KeySignature(keys[i]); + keySig.cancelKey('Cb'); + keySig.setPadding(flatPadding); + keySig.addToStave(stave1); + } + for (n = 8; n < keys.length; ++n) { + keySig = new _src_keysignature__WEBPACK_IMPORTED_MODULE_3__.KeySignature(keys[n]); + keySig.cancelKey('C#'); + keySig.setPadding(sharpPadding); + keySig.addToStave(stave2); + } + for (i = 0; i < 8; ++i) { + keySig = new _src_keysignature__WEBPACK_IMPORTED_MODULE_3__.KeySignature(keys[i]); + keySig.cancelKey('E'); + keySig.setPadding(flatPadding); + keySig.addToStave(stave3); + } + for (n = 8; n < keys.length; ++n) { + keySig = new _src_keysignature__WEBPACK_IMPORTED_MODULE_3__.KeySignature(keys[n]); + keySig.cancelKey('Ab'); + keySig.setPadding(sharpPadding); + keySig.addToStave(stave4); + } + stave1.setContext(ctx); + stave1.draw(); + stave2.setContext(ctx); + stave2.draw(); + stave3.setContext(ctx); + stave3.draw(); + stave4.setContext(ctx); + stave4.draw(); + ok(true, 'all pass'); +} +function keysCanceledForEachClef(options, contextBuilder) { + const scale = 0.8; + const w = fontWidths(); + const keyPadding = 10; + const keys = ['C#', 'Cb']; + const flatsKey = [7, 14]; + const sharpsKey = [14, 7]; + const natsKey = [7, 7]; + const max = 21 * Math.max(w.sharpWidth, w.flatWidth) * 2 + keyPadding * 6 + _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave.defaultPadding + w.clefWidth; + const ctx = contextBuilder(options.elementId, max + 100, 380); + ctx.scale(scale, scale); + const x = 20; + let y = 20; + let tx = x; + ['bass', 'tenor', 'soprano', 'mezzo-soprano', 'baritone-f'].forEach(function (clef) { + keys.forEach((key, keyIx) => { + const cancelKey = keys[(keyIx + 1) % 2]; + const width = flatsKey[keyIx] * w.flatWidth + + natsKey[keyIx] * w.naturalWidth + + sharpsKey[keyIx] * w.sharpWidth + + keyPadding * 3 + + w.clefWidth + + _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave.defaultPadding; + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(tx, y, width); + stave.setClef(clef); + stave.addKeySignature(cancelKey); + stave.addKeySignature(key, cancelKey); + stave.addKeySignature(key); + stave.setContext(ctx).draw(); + tx += width; + }); + tx = x; + y += 80; + }); + ok(true, 'all pass'); +} +function majorKeysAltered(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 780, 500); + ctx.scale(0.9, 0.9); + const stave1 = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(10, 10, 750).addClef('treble'); + const stave2 = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(10, 90, 750).addClef('treble'); + const stave3 = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(10, 170, 750).addClef('treble'); + const stave4 = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(10, 250, 750).addClef('treble'); + const keys = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.MAJOR_KEYS; + let keySig = null; + let i; + let n; + for (i = 0; i < 8; ++i) { + keySig = new _src_keysignature__WEBPACK_IMPORTED_MODULE_3__.KeySignature(keys[i]); + keySig.alterKey(['bs', 'bs']); + keySig.setPadding(18); + keySig.addToStave(stave1); + } + for (n = 8; n < keys.length; ++n) { + keySig = new _src_keysignature__WEBPACK_IMPORTED_MODULE_3__.KeySignature(keys[n]); + keySig.alterKey(['+', '+', '+']); + keySig.setPadding(20); + keySig.addToStave(stave2); + } + for (i = 0; i < 8; ++i) { + keySig = new _src_keysignature__WEBPACK_IMPORTED_MODULE_3__.KeySignature(keys[i]); + keySig.alterKey(['n', 'bs', 'bb']); + keySig.setPadding(18); + keySig.addToStave(stave3); + } + for (n = 8; n < keys.length; ++n) { + keySig = new _src_keysignature__WEBPACK_IMPORTED_MODULE_3__.KeySignature(keys[n]); + keySig.alterKey(['++', '+', 'n', '+']); + keySig.setPadding(20); + keySig.addToStave(stave4); + } + stave1.setContext(ctx); + stave1.draw(); + stave2.setContext(ctx); + stave2.draw(); + stave3.setContext(ctx); + stave3.draw(); + stave4.setContext(ctx); + stave4.draw(); + ok(true, 'all pass'); +} +function minorKeys(options, contextBuilder) { + const accidentalCount = 28; // total number in all the keys + const w = fontWidths(); + const casePadding = 10; // hard-coded in staveModifier + const testCases = 7; // all keys, but includes key of C + const sharpTestWidth = accidentalCount * w.sharpWidth + casePadding * testCases + _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave.defaultPadding; + const flatTestWidth = accidentalCount * w.flatWidth + casePadding * testCases + _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave.defaultPadding; + const ctx = contextBuilder(options.elementId, Math.max(sharpTestWidth, flatTestWidth) + 100, 240); + const stave1 = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(10, 10, flatTestWidth); + const stave2 = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(10, 90, sharpTestWidth); + const keys = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.MINOR_KEYS; + let keySig = null; + for (let i = 0; i < 8; ++i) { + keySig = new _src_keysignature__WEBPACK_IMPORTED_MODULE_3__.KeySignature(keys[i]); + keySig.addToStave(stave1); + } + for (let n = 8; n < keys.length; ++n) { + keySig = new _src_keysignature__WEBPACK_IMPORTED_MODULE_3__.KeySignature(keys[n]); + keySig.addToStave(stave2); + } + stave1.setContext(ctx); + stave1.draw(); + stave2.setContext(ctx); + stave2.draw(); + ok(true, 'all pass'); +} +function endKeyWithClef(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 200); + ctx.scale(0.9, 0.9); + const stave1 = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(10, 10, 350); + stave1 + .setKeySignature('G') + .setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.REPEAT_BEGIN) + .setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.REPEAT_END) + .setClef('treble') + .addTimeSignature('4/4') + .setEndClef('bass') + .setEndKeySignature('Cb'); + const stave2 = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(10, 90, 350); + stave2.setKeySignature('Cb').setClef('bass').setEndClef('treble').setEndKeySignature('G'); + stave1.setContext(ctx).draw(); + stave2.setContext(ctx).draw(); + ok(true, 'all pass'); +} +function staveHelper(options, contextBuilder) { + const w = fontWidths(); + const accidentalCount = 28; // total number in all the keys + const casePadding = 10; // hard-coded in staveModifier + const testCases = 7; // all keys, but includes key of C + const sharpTestWidth = accidentalCount * w.sharpWidth + casePadding * testCases + _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave.defaultPadding; + const flatTestWidth = accidentalCount * w.flatWidth + casePadding * testCases + _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave.defaultPadding; + const ctx = contextBuilder(options.elementId, Math.max(sharpTestWidth, flatTestWidth) + 100, 240); + const stave1 = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(10, 10, flatTestWidth); + const stave2 = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(10, 90, sharpTestWidth); + const keys = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.MAJOR_KEYS; + for (let i = 0; i < 8; ++i) { + stave1.addKeySignature(keys[i]); + } + for (let n = 8; n < keys.length; ++n) { + stave2.addKeySignature(keys[n]); + } + stave1.setContext(ctx); + stave1.draw(); + stave2.setContext(ctx); + stave2.draw(); + ok(true, 'all pass'); +} +function changeKey(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 900); + // The previous code was buggy: f.Stave(10, 10, 800), even though Factory.Stave() only accepts 1 argument. + const stave = f.Stave({ x: 10, y: 10, width: 800 }).addClef('treble').addTimeSignature('C|'); + const voice = f + .Voice() + .setStrict(false) + .addTickables([ + f.KeySigNote({ key: 'Bb' }), + f.StaveNote({ keys: ['c/4'], duration: '1' }), + f.BarNote(), + f.KeySigNote({ key: 'D', cancelKey: 'Bb' }), + f.StaveNote({ keys: ['c/4'], duration: '1' }), + f.BarNote(), + f.KeySigNote({ key: 'Bb' }), + f.StaveNote({ keys: ['c/4'], duration: '1' }), + f.BarNote(), + f.KeySigNote({ key: 'D', alterKey: ['b', 'n'] }), + f.StaveNote({ keys: ['c/4'], duration: '1' }), + ]); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'all pass'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(KeySignatureTests); + + + +/***/ }), + +/***/ "./tests/mocks.ts": +/*!************************!*\ + !*** ./tests/mocks.ts ***! + \************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "MockTickable": () => (/* binding */ MockTickable) +/* harmony export */ }); +/* harmony import */ var _src_fraction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/fraction */ "./src/fraction.ts"); +/* harmony import */ var _src_tickable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/tickable */ "./src/tickable.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// TickContext Mocks + + +class MockTickable extends _src_tickable__WEBPACK_IMPORTED_MODULE_1__.Tickable { + constructor() { + super(...arguments); + this.ticks = new _src_fraction__WEBPACK_IMPORTED_MODULE_0__.Fraction(1, 1); + this.width = 0; + this.ignore_ticks = false; + } + init() { + // DO NOTHING. + } + getX() { + // eslint-disable-next-line + return this.tickContext.getX(); + } + getIntrinsicTicks() { + return this.ticks.value(); + } + getTicks() { + return this.ticks; + } + setTicks(t) { + this.ticks = new _src_fraction__WEBPACK_IMPORTED_MODULE_0__.Fraction(t, 1); + return this; + } + // Called by TickContext.preFormat(). + getMetrics() { + return { + width: 0, + glyphWidth: 0, + notePx: this.width, + modLeftPx: 0, + modRightPx: 0, + leftDisplacedHeadPx: 0, + rightDisplacedHeadPx: 0, + glyphPx: 0, + }; + } + getWidth() { + return this.width; + } + setWidth(w) { + this.width = w; + return this; + } + setVoice(v) { + this.voice = v; + return this; + } + setStave(stave) { + this.stave = stave; + return this; + } + getStave() { + return this.stave; + } + setTickContext(tc) { + this.tickContext = tc; + return this; + } + setIgnoreTicks(flag) { + this.ignore_ticks = flag; + return this; + } + shouldIgnoreTicks() { + return this.ignore_ticks; + } + preFormat() { + // DO NOTHING. + } + // eslint-disable-next-line + draw(...args) { + // DO NOTHING. + } +} + + + +/***/ }), + +/***/ "./tests/modifier_tests.ts": +/*!*********************************!*\ + !*** ./tests/modifier_tests.ts ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ModifierContextTests": () => (/* binding */ ModifierContextTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/index */ "./src/index.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// ModifierContext Tests + + +const ModifierContextTests = { + Start() { + QUnit.module('ModifierContext'); + test('Modifier Width Test', width); + test('Modifier Management', management); + }, +}; +function width() { + const mc = new _src_index__WEBPACK_IMPORTED_MODULE_1__.ModifierContext(); + equal(mc.getWidth(), 0, 'New modifier context has no width'); +} +function management() { + const mc = new _src_index__WEBPACK_IMPORTED_MODULE_1__.ModifierContext(); + const modifier1 = new _src_index__WEBPACK_IMPORTED_MODULE_1__.Modifier(); + const modifier2 = new _src_index__WEBPACK_IMPORTED_MODULE_1__.Modifier(); + mc.addMember(modifier1); + mc.addMember(modifier2); + const modifiers = mc.getMembers(_src_index__WEBPACK_IMPORTED_MODULE_1__.Modifier.CATEGORY); + equal(modifiers.length, 2, 'Added two modifiers'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(ModifierContextTests); + + + +/***/ }), + +/***/ "./tests/multimeasurerest_tests.ts": +/*!*****************************************!*\ + !*** ./tests/multimeasurerest_tests.ts ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "MultiMeasureRestTests": () => (/* binding */ MultiMeasureRestTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_flow__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/flow */ "./src/flow.ts"); +/* harmony import */ var _src_font__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/font */ "./src/font.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// MultiMeasureRest Tests + + + +const MultiMeasureRestTests = { + Start() { + QUnit.module('MultiMeasureRest'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Simple Test', simple); + run('Stave with modifiers Test', staveWithModifiers); + }, +}; +function simple(options) { + const width = 910; + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, width, 300); + const line_spacing_15px = { options: { spacing_between_lines_px: 15 } }; + // Each item below is an array that contains: + // item[0] => staveParams to adjust vertical spacing between lines + // item[1] => multiMeasureRestParams + // eslint-disable-next-line + const params = [ + [{}, { number_of_measures: 2, show_number: false }], + [{}, { number_of_measures: 2 }], + [{}, { number_of_measures: 2, line_thickness: 8, serif_thickness: 3 }], + [{}, { number_of_measures: 1, use_symbols: true }], + [{}, { number_of_measures: 2, use_symbols: true }], + [{}, { number_of_measures: 3, use_symbols: true }], + [{}, { number_of_measures: 4, use_symbols: true }], + [{}, { number_of_measures: 5, use_symbols: true }], + [{}, { number_of_measures: 6, use_symbols: true }], + [{}, { number_of_measures: 7, use_symbols: true }], + [{}, { number_of_measures: 8, use_symbols: true }], + [{}, { number_of_measures: 9, use_symbols: true }], + [{}, { number_of_measures: 10, use_symbols: true }], + [{}, { number_of_measures: 11, use_symbols: true }], + [{}, { number_of_measures: 11, use_symbols: false, padding_left: 20, padding_right: 20 }], + [{}, { number_of_measures: 11, use_symbols: true, symbol_spacing: 5 }], + [{}, { number_of_measures: 11, use_symbols: false, line: 3, number_line: 2 }], + [{}, { number_of_measures: 11, use_symbols: true, line: 3, number_line: 2 }], + [line_spacing_15px, { number_of_measures: 12 }], + [line_spacing_15px, { number_of_measures: 9, use_symbols: true }], + [line_spacing_15px, { number_of_measures: 12, spacing_between_lines_px: 15, number_glyph_point: 40 * 1.5 }], + [ + line_spacing_15px, + { + number_of_measures: 9, + spacing_between_lines_px: 15, + use_symbols: true, + number_glyph_point: 40 * 1.5, + }, + ], + [ + line_spacing_15px, + { + number_of_measures: 9, + spacing_between_lines_px: 15, + use_symbols: true, + number_glyph_point: 40 * 1.5, + semibreve_rest_glyph_scale: _src_flow__WEBPACK_IMPORTED_MODULE_1__.Flow.NOTATION_FONT_SCALE * 1.5, + }, + ], + ]; + const staveWidth = 100; + let x = 0; + let y = 0; + const mmRests = params.map((param) => { + if (x + staveWidth * 2 > width) { + x = 0; + y += 80; + } + const staveParams = param[0]; + const mmRestParams = param[1]; + staveParams.x = x; + staveParams.y = y; + staveParams.width = staveWidth; + x += staveWidth; + const stave = f.Stave(staveParams); + return f.MultiMeasureRest(mmRestParams).setStave(stave); + }); + f.draw(); + const xs = mmRests[0].getXs(); + // eslint-disable-next-line + const strY = mmRests[0].getStave().getYForLine(-0.5); + const str = 'TACET'; + const context = f.getContext(); + context.save(); + context.setFont(_src_font__WEBPACK_IMPORTED_MODULE_2__.Font.SERIF, 16, 'bold'); + const metrics = context.measureText(str); + context.fillText(str, xs.left + (xs.right - xs.left) * 0.5 - metrics.width * 0.5, strY); + context.restore(); + ok(true, 'Simple Test'); +} +function staveWithModifiers(options) { + const width = 910; + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, width, 200); + let x = 0; + let y = 0; + // eslint-disable-next-line + const params = [ + [{ clef: 'treble', params: { width: 150 } }, { number_of_measures: 5 }], + [{ clef: 'treble', keySig: 'G', params: { width: 150 } }, { number_of_measures: 5 }], + [{ clef: 'treble', timeSig: '4/4', keySig: 'G', params: { width: 150 } }, { number_of_measures: 5 }], + [{ clef: 'treble', endClef: 'bass', params: { width: 150 } }, { number_of_measures: 5 }], + [{ clef: 'treble', endKeySig: 'F', params: { width: 150 } }, { number_of_measures: 5 }], + [{ clef: 'treble', endTimeSig: '2/4', params: { width: 150 } }, { number_of_measures: 5 }], + [{ clef: 'treble', endClef: 'bass', endTimeSig: '2/4', params: { width: 150 } }, { number_of_measures: 5 }], + [ + { clef: 'treble', endClef: 'bass', endTimeSig: '2/4', params: { width: 150 } }, + { number_of_measures: 5, use_symbols: true }, + ], + ]; + params.forEach((param) => { + const staveOptions = param[0]; + // eslint-disable-next-line + const staveParams = staveOptions.params; + const mmrestParams = param[1]; + if (x + staveParams.width > width) { + x = 0; + y += 80; + } + staveParams.x = x; + x += staveParams.width; + staveParams.y = y; + const stave = f.Stave(staveParams); + if (staveOptions.clef) { + stave.addClef(staveOptions.clef); + } + if (staveOptions.timeSig) { + stave.addTimeSignature(staveOptions.timeSig); + } + if (staveOptions.keySig) { + stave.addKeySignature(staveOptions.keySig); + } + if (staveOptions.endClef) { + stave.addEndClef(staveOptions.endClef); + } + if (staveOptions.endKeySig) { + stave.setEndKeySignature(staveOptions.endKeySig); + } + if (staveOptions.endTimeSig) { + stave.setEndTimeSignature(staveOptions.endTimeSig); + } + return f.MultiMeasureRest(mmrestParams).setStave(stave); + }); + f.draw(); + ok(true, 'Stave with modifiers Test'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(MultiMeasureRestTests); + + + +/***/ }), + +/***/ "./tests/music_tests.ts": +/*!******************************!*\ + !*** ./tests/music_tests.ts ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "MusicTests": () => (/* binding */ MusicTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_keymanager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/keymanager */ "./src/keymanager.ts"); +/* harmony import */ var _src_music__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/music */ "./src/music.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Music Tests + + + +const MusicTests = { + Start() { + QUnit.module('MusicTests'); + test('Valid Notes', validNotes); + test('Valid Keys', validKeys); + test('Note Values', noteValue); + test('Interval Values', intervalValue); + test('Relative Notes', relativeNotes); + test('Relative Note Names', relativeNoteNames); + test('Canonical Notes', canonicalNotes); + test('Canonical Intervals', canonicalIntervals); + test('Scale Tones', scaleTones); + test('Scale Intervals', scaleIntervals); + }, +}; +function validNotes() { + expect(10); + const music = new _src_music__WEBPACK_IMPORTED_MODULE_2__.Music(); + let parts = music.getNoteParts('c'); + equal(parts.root, 'c'); + equal(parts.accidental, null); + // getNoteParts() converts its argument to lowercase. + parts = music.getNoteParts('C'); + equal(parts.root, 'c'); + equal(parts.accidental, null); + parts = music.getNoteParts('c#'); + equal(parts.root, 'c'); + equal(parts.accidental, '#'); + parts = music.getNoteParts('c##'); + equal(parts.root, 'c'); + equal(parts.accidental, '##'); + throws(() => music.getNoteParts('r'), /BadArguments/, 'Invalid note: r'); + throws(() => music.getNoteParts(''), /BadArguments/, "Invalid note: ''"); +} +function validKeys() { + expect(18); + const music = new _src_music__WEBPACK_IMPORTED_MODULE_2__.Music(); + let parts = music.getKeyParts('c'); + equal(parts.root, 'c'); + equal(parts.accidental, null); + equal(parts.type, 'M'); + parts = music.getKeyParts('d#'); + equal(parts.root, 'd'); + equal(parts.accidental, '#'); + equal(parts.type, 'M'); + parts = music.getKeyParts('fbm'); + equal(parts.root, 'f'); + equal(parts.accidental, 'b'); + equal(parts.type, 'm'); + parts = music.getKeyParts('c#mel'); + equal(parts.root, 'c'); + equal(parts.accidental, '#'); + equal(parts.type, 'mel'); + parts = music.getKeyParts('g#harm'); + equal(parts.root, 'g'); + equal(parts.accidental, '#'); + equal(parts.type, 'harm'); + throws(() => music.getKeyParts('r'), /BadArguments/, 'Invalid key: r'); + throws(() => music.getKeyParts(''), /BadArguments/, `Invalid key: ''`); + throws(() => music.getKeyParts('#m'), /BadArguments/, 'Invalid key: #m'); +} +function noteValue() { + expect(3); + const music = new _src_music__WEBPACK_IMPORTED_MODULE_2__.Music(); + let note = music.getNoteValue('c'); + equal(note, 0); + throws(() => music.getNoteValue('r'), /BadArguments/, 'Invalid note name'); + note = music.getNoteValue('f#'); + equal(note, 6); +} +function intervalValue() { + expect(2); + const music = new _src_music__WEBPACK_IMPORTED_MODULE_2__.Music(); + const value = music.getIntervalValue('b2'); + equal(value, 1); + throws(() => music.getIntervalValue('7'), /BadArguments/, 'Invalid interval name'); +} +function relativeNotes() { + expect(8); + const music = new _src_music__WEBPACK_IMPORTED_MODULE_2__.Music(); + let value = music.getRelativeNoteValue(music.getNoteValue('c'), music.getIntervalValue('b5')); + equal(value, 6); + throws(() => music.getRelativeNoteValue(music.getNoteValue('bc'), music.getIntervalValue('b2')), /BadArguments/, 'Invalid note'); + throws(() => music.getRelativeNoteValue(music.getNoteValue('b'), music.getIntervalValue('p3')), /BadArguments/, 'Invalid interval'); + // Direction + value = music.getRelativeNoteValue(music.getNoteValue('d'), music.getIntervalValue('2'), -1); + equal(value, 0); + throws(() => music.getRelativeNoteValue(music.getNoteValue('b'), music.getIntervalValue('p4'), 0), /BadArguments/, 'Invalid direction: 0'); + // Rollover + value = music.getRelativeNoteValue(music.getNoteValue('b'), music.getIntervalValue('b5')); + equal(value, 5); + // Reverse rollover + value = music.getRelativeNoteValue(music.getNoteValue('c'), music.getIntervalValue('b2'), -1); + equal(value, 11); + // Practical tests + value = music.getRelativeNoteValue(music.getNoteValue('g'), music.getIntervalValue('p5')); + equal(value, 2); +} +function relativeNoteNames() { + expect(9); + const music = new _src_music__WEBPACK_IMPORTED_MODULE_2__.Music(); + equal(music.getRelativeNoteName('b', music.getNoteValue('c#')), 'b##'); + equal(music.getRelativeNoteName('c', music.getNoteValue('c')), 'c'); + equal(music.getRelativeNoteName('c', music.getNoteValue('db')), 'c#'); + equal(music.getRelativeNoteName('c', music.getNoteValue('b')), 'cb'); + equal(music.getRelativeNoteName('c#', music.getNoteValue('db')), 'c#'); + equal(music.getRelativeNoteName('e', music.getNoteValue('f#')), 'e##'); + equal(music.getRelativeNoteName('e', music.getNoteValue('d#')), 'eb'); + equal(music.getRelativeNoteName('e', music.getNoteValue('fb')), 'e'); + throws(() => music.getRelativeNoteName('e', music.getNoteValue('g#')), /BadArguments/, 'Too far away. Notes not related.'); +} +function canonicalNotes() { + expect(3); + const music = new _src_music__WEBPACK_IMPORTED_MODULE_2__.Music(); + equal(music.getCanonicalNoteName(0), 'c'); + equal(music.getCanonicalNoteName(2), 'd'); + throws(() => music.getCanonicalNoteName(-1), /BadArguments/, 'Invalid note value'); +} +function canonicalIntervals() { + expect(3); + const music = new _src_music__WEBPACK_IMPORTED_MODULE_2__.Music(); + equal(music.getCanonicalIntervalName(0), 'unison'); + equal(music.getCanonicalIntervalName(2), 'M2'); + throws(() => music.getCanonicalIntervalName(-1), /BadArguments/, 'Invalid interval value'); +} +function scaleTones() { + expect(24); + // C Major + const music = new _src_music__WEBPACK_IMPORTED_MODULE_2__.Music(); + const manager = new _src_keymanager__WEBPACK_IMPORTED_MODULE_1__.KeyManager('CM'); + const c_major = music.getScaleTones(music.getNoteValue('c'), _src_music__WEBPACK_IMPORTED_MODULE_2__.Music.scales.major); + let values = ['c', 'd', 'e', 'f', 'g', 'a', 'b']; + equal(c_major.length, 7); + for (let i = 0; i < c_major.length; ++i) { + equal(music.getCanonicalNoteName(c_major[i]), values[i]); + } + // Dorian + const c_dorian = music.getScaleTones(music.getNoteValue('c'), _src_music__WEBPACK_IMPORTED_MODULE_2__.Music.scales.dorian); + values = ['c', 'd', 'eb', 'f', 'g', 'a', 'bb']; + let note = null; + equal(c_dorian.length, 7); + for (let i = 0; i < c_dorian.length; ++i) { + note = music.getCanonicalNoteName(c_dorian[i]); + equal(manager.selectNote(note).note, values[i]); + } + // Mixolydian + const c_mixolydian = music.getScaleTones(music.getNoteValue('c'), _src_music__WEBPACK_IMPORTED_MODULE_2__.Music.scales.mixolydian); + values = ['c', 'd', 'e', 'f', 'g', 'a', 'bb']; + equal(c_mixolydian.length, 7); + for (let i = 0; i < c_mixolydian.length; ++i) { + note = music.getCanonicalNoteName(c_mixolydian[i]); + equal(manager.selectNote(note).note, values[i]); + } +} +function scaleIntervals() { + expect(6); + const m = new _src_music__WEBPACK_IMPORTED_MODULE_2__.Music(); + equal(m.getCanonicalIntervalName(m.getIntervalBetween(m.getNoteValue('c'), m.getNoteValue('d'))), 'M2'); + equal(m.getCanonicalIntervalName(m.getIntervalBetween(m.getNoteValue('g'), m.getNoteValue('c'))), 'p4'); + equal(m.getCanonicalIntervalName(m.getIntervalBetween(m.getNoteValue('c'), m.getNoteValue('c'))), 'unison'); + equal(m.getCanonicalIntervalName(m.getIntervalBetween(m.getNoteValue('f'), m.getNoteValue('cb'))), 'dim5'); + // Forwards and backwards + equal(m.getCanonicalIntervalName(m.getIntervalBetween(m.getNoteValue('d'), m.getNoteValue('c'), 1)), 'b7'); + equal(m.getCanonicalIntervalName(m.getIntervalBetween(m.getNoteValue('d'), m.getNoteValue('c'), -1)), 'M2'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(MusicTests); + + + +/***/ }), + +/***/ "./tests/notehead_tests.ts": +/*!*********************************!*\ + !*** ./tests/notehead_tests.ts ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "NoteHeadTests": () => (/* binding */ NoteHeadTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_flow__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/flow */ "./src/flow.ts"); +/* harmony import */ var _src_formatter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/formatter */ "./src/formatter.ts"); +/* harmony import */ var _src_notehead__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/notehead */ "./src/notehead.ts"); +/* harmony import */ var _src_stave__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/stave */ "./src/stave.ts"); +/* harmony import */ var _src_stavenote__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/stavenote */ "./src/stavenote.ts"); +/* harmony import */ var _src_tickcontext__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/tickcontext */ "./src/tickcontext.ts"); +/* harmony import */ var _src_voice__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/voice */ "./src/voice.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// NoteHead Tests +// TODO: There is a bug in RenderContext.scale(). The CanvasContext works as expected. +// Each time you call scale(sx, sy), it multiplies the sx and sy by the currently stored scale. +// The SVGContext operates differently. It just sets the sx and sy as the new scale, instead of multiplying it. +// See: https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/scale + + + + + + + + +const NoteHeadTests = { + Start() { + QUnit.module('NoteHead'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Basic', basic); + run('Various Heads', variousHeads); + run('Drum Chord Heads', drumChordHeads); + run('Bounding Boxes', basicBoundingBoxes); + }, +}; +function setContextStyle(ctx) { + // TODO: scale() method in SVGContext and CanvasContext should work similarly! + // The final scale should be 1.8. + // ctx.scale(0.9, 0.9); + // ctx.scale(2.0, 2.0); + ctx.scale(1.8, 1.8); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + ctx.font = '10pt Arial'; +} +function basic(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 450, 250); + setContextStyle(ctx); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(10, 0, 250).addClef('treble'); + stave.setContext(ctx).draw(); + const formatter = new _src_formatter__WEBPACK_IMPORTED_MODULE_2__.Formatter(); + const voice = new _src_voice__WEBPACK_IMPORTED_MODULE_7__.Voice(_src_flow__WEBPACK_IMPORTED_MODULE_1__.Flow.TIME4_4).setStrict(false); + const note_head1 = new _src_notehead__WEBPACK_IMPORTED_MODULE_3__.NoteHead({ duration: '4', line: 3 }); + const note_head2 = new _src_notehead__WEBPACK_IMPORTED_MODULE_3__.NoteHead({ duration: '1', line: 2.5 }); + const note_head3 = new _src_notehead__WEBPACK_IMPORTED_MODULE_3__.NoteHead({ duration: '2', line: 0 }); + voice.addTickables([note_head1, note_head2, note_head3]); + formatter.joinVoices([voice]).formatToStave([voice], stave); + voice.draw(ctx, stave); + ok('Basic NoteHead test'); +} +/** + * Used by the next two test cases to draw a note. + */ +function showNote(noteStruct, stave, ctx, x) { + const note = new _src_stavenote__WEBPACK_IMPORTED_MODULE_5__.StaveNote(noteStruct).setStave(stave); + new _src_tickcontext__WEBPACK_IMPORTED_MODULE_6__.TickContext().addTickable(note).preFormat().setX(x); + note.setContext(ctx).draw(); + return note; +} +function variousHeads(options, contextBuilder) { + const notes = [ + { keys: ['g/5/d0'], duration: '4' }, + { keys: ['g/5/d1'], duration: '4' }, + { keys: ['g/5/d2'], duration: '4' }, + { keys: ['g/5/d3'], duration: '4' }, + { keys: ['x/'], duration: '1' }, + { keys: ['g/5/t0'], duration: '1' }, + { keys: ['g/5/t1'], duration: '4' }, + { keys: ['g/5/t2'], duration: '4' }, + { keys: ['g/5/t3'], duration: '4' }, + { keys: ['x/'], duration: '1' }, + { keys: ['g/5/x0'], duration: '1' }, + { keys: ['g/5/x1'], duration: '4' }, + { keys: ['g/5/x2'], duration: '4' }, + { keys: ['g/5/x3'], duration: '4' }, + { keys: ['x/'], duration: '1' }, + { keys: ['g/5/s1'], duration: '4' }, + { keys: ['g/5/s2'], duration: '4' }, + { keys: ['x/'], duration: '1' }, + { keys: ['g/5/r1'], duration: '4' }, + { keys: ['g/5/r2'], duration: '4' }, + ]; + const ctx = contextBuilder(options.elementId, notes.length * 25 + 100, 240); + // Draw two staves, one with up-stems and one with down-stems. + for (let staveNum = 0; staveNum < 2; ++staveNum) { + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(10, 10 + staveNum * 120, notes.length * 25 + 75) + .addClef('percussion') + .setContext(ctx) + .draw(); + for (let i = 0; i < notes.length; ++i) { + const note = notes[i]; + note.stem_direction = staveNum === 0 ? -1 : 1; + const staveNote = showNote(note, stave, ctx, (i + 1) * 25); + ok(staveNote.getX() > 0, 'Note ' + i + ' has X value'); + ok(staveNote.getYs().length > 0, 'Note ' + i + ' has Y values'); + } + } +} +function drumChordHeads(options, contextBuilder) { + const notes = [ + { keys: ['a/4/d0', 'g/5/x3'], duration: '4' }, + { keys: ['a/4/x3', 'g/5/d0'], duration: '4' }, + { keys: ['a/4/d1', 'g/5/x2'], duration: '4' }, + { keys: ['a/4/x2', 'g/5/d1'], duration: '4' }, + { keys: ['a/4/d2', 'g/5/x1'], duration: '4' }, + { keys: ['a/4/x1', 'g/5/d2'], duration: '4' }, + { keys: ['a/4/d3', 'g/5/x0'], duration: '4' }, + { keys: ['a/4/x0', 'g/5/d3'], duration: '4' }, + { keys: ['a/4', 'g/5/d0'], duration: '4' }, + { keys: ['a/4/x3', 'g/5'], duration: '4' }, + { keys: ['a/4/t0', 'g/5/s1'], duration: '4' }, + { keys: ['a/4/s1', 'g/5/t0'], duration: '4' }, + { keys: ['a/4/t1', 'g/5/s2'], duration: '4' }, + { keys: ['a/4/s2', 'g/5/t1'], duration: '4' }, + { keys: ['a/4/t2', 'g/5/r1'], duration: '4' }, + { keys: ['a/4/r1', 'g/5/t2'], duration: '4' }, + { keys: ['a/4/t3', 'g/5/r2'], duration: '4' }, + { keys: ['a/4/r2', 'g/5/t3'], duration: '4' }, + ]; + const ctx = contextBuilder(options.elementId, notes.length * 25 + 100, 240); + // Draw two staves, one with up-stems and one with down-stems. + for (let h = 0; h < 2; ++h) { + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(10, 10 + h * 120, notes.length * 25 + 75).addClef('percussion').setContext(ctx).draw(); + for (let i = 0; i < notes.length; ++i) { + const note = notes[i]; + note.stem_direction = h === 0 ? -1 : 1; + const staveNote = showNote(note, stave, ctx, (i + 1) * 25); + ok(staveNote.getX() > 0, 'Note ' + i + ' has X value'); + ok(staveNote.getYs().length > 0, 'Note ' + i + ' has Y values'); + } + } +} +function basicBoundingBoxes(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 450, 250); + setContextStyle(ctx); + // 250 is 450/1.8 + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(10, 0, 250).addClef('treble'); + stave.setContext(ctx).draw(); + const formatter = new _src_formatter__WEBPACK_IMPORTED_MODULE_2__.Formatter(); + const voice = new _src_voice__WEBPACK_IMPORTED_MODULE_7__.Voice(_src_flow__WEBPACK_IMPORTED_MODULE_1__.Flow.TIME4_4).setStrict(false); + const nh1 = new _src_notehead__WEBPACK_IMPORTED_MODULE_3__.NoteHead({ duration: '4', line: 3 }); + const nh2 = new _src_notehead__WEBPACK_IMPORTED_MODULE_3__.NoteHead({ duration: '2', line: 2.5 }); + const nh3 = new _src_notehead__WEBPACK_IMPORTED_MODULE_3__.NoteHead({ duration: '1', line: 0 }); + voice.addTickables([nh1, nh2, nh3]); + formatter.joinVoices([voice]).formatToStave([voice], stave); + voice.draw(ctx, stave); + for (const bb of [nh1.getBoundingBox(), nh2.getBoundingBox(), nh3.getBoundingBox()]) { + ctx.rect(bb.getX(), bb.getY(), bb.getW(), bb.getH()); + } + ctx.stroke(); + ok('NoteHead Bounding Boxes'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(NoteHeadTests); + + + +/***/ }), + +/***/ "./tests/notesubgroup_tests.ts": +/*!*************************************!*\ + !*** ./tests/notesubgroup_tests.ts ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "NoteSubGroupTests": () => (/* binding */ NoteSubGroupTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_barnote__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/barnote */ "./src/barnote.ts"); +/* harmony import */ var _src_note__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/note */ "./src/note.ts"); +/* harmony import */ var _src_stavebarline__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/stavebarline */ "./src/stavebarline.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// Author: Taehoon Moon 2016 +// +// NoteSubGroup Tests + + + + +const NoteSubGroupTests = { + Start() { + QUnit.module('NoteSubGroup'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Basic - ClefNote, TimeSigNote and BarNote', basic); + run('Multi Voice', multiVoiceSingleDraw); + run('Multi Voice Multiple Draws', multiVoiceDoubleDraw); + run('Multi Staff', multiStaff); + }, +}; +// Return three helper functions for creating StaveNotes, and adding Accidental & NoteSubGroup to those StaveNotes. +function createShortcuts(f) { + return { + createStaveNote: (noteStruct) => f.StaveNote(noteStruct), + addAccidental: (note, accid) => note.addModifier(f.Accidental({ type: accid }), 0), + addSubGroup: (note, subNotes) => note.addModifier(f.NoteSubGroup({ notes: subNotes }), 0), + }; +} +function basic(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 750, 200); + const ctx = f.getContext(); + const stave = f.Stave({ width: 600 }).addClef('treble'); + const { createStaveNote, addAccidental, addSubGroup } = createShortcuts(f); + const notes = [ + { keys: ['f/5'], stem_direction: -1, duration: '4' }, + { keys: ['d/4'], stem_direction: -1, duration: '4', clef: 'bass' }, + { keys: ['g/4'], stem_direction: -1, duration: '4', clef: 'alto' }, + { keys: ['a/4'], stem_direction: -1, duration: '4', clef: 'alto' }, + { keys: ['c/4'], stem_direction: -1, duration: '4', clef: 'tenor' }, + { keys: ['c/3'], stem_direction: +1, duration: '4', clef: 'tenor' }, + { keys: ['d/4'], stem_direction: -1, duration: '4', clef: 'tenor' }, + { keys: ['f/4'], stem_direction: -1, duration: '4', clef: 'tenor' }, + ].map(createStaveNote); + addAccidental(notes[1], '#'); + addAccidental(notes[2], 'n'); + addSubGroup(notes[1], [f.ClefNote({ type: 'bass', options: { size: 'small' } })]); + addSubGroup(notes[2], [f.ClefNote({ type: 'alto', options: { size: 'small' } })]); + addSubGroup(notes[4], [f.ClefNote({ type: 'tenor', options: { size: 'small' } }), new _src_barnote__WEBPACK_IMPORTED_MODULE_1__.BarNote()]); + addSubGroup(notes[5], [f.TimeSigNote({ time: '6/8' })]); + addSubGroup(notes[6], [new _src_barnote__WEBPACK_IMPORTED_MODULE_1__.BarNote(_src_stavebarline__WEBPACK_IMPORTED_MODULE_3__.BarlineType.REPEAT_BEGIN)]); + addAccidental(notes[4], 'b'); + addAccidental(notes[6], 'bb'); + const voice = f.Voice().setStrict(false).addTickables(notes); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + notes.forEach((note) => _src_note__WEBPACK_IMPORTED_MODULE_2__.Note.plotMetrics(ctx, note, 150)); + _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.plotLegendForNoteWidth(ctx, 620, 120); + ok(true, 'all pass'); +} +function multiVoiceSingleDraw(options) { + multiVoiceHelper(options, 1); +} +/** + * Call Factory.draw() twice. It should look identical to the multiVoice test case above. + */ +function multiVoiceDoubleDraw(options) { + multiVoiceHelper(options, 2); +} +/** + * Used by multiVoiceSingleDraw and multiVoiceDoubleDraw above. + */ +function multiVoiceHelper(options, numDraws) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 550, 200); + const ctx = f.getContext(); + const stave = f.Stave().addClef('treble'); + const { createStaveNote, addAccidental, addSubGroup } = createShortcuts(f); + const notes1 = [ + { keys: ['f/5'], stem_direction: 1, duration: '4' }, + { keys: ['d/4'], stem_direction: 1, duration: '4', clef: 'bass' }, + { keys: ['c/5'], stem_direction: 1, duration: '4', clef: 'alto' }, + { keys: ['c/5'], stem_direction: 1, duration: '4', clef: 'soprano' }, + ].map(createStaveNote); + const notes2 = [ + { keys: ['c/4'], stem_direction: -1, duration: '4' }, + { keys: ['c/3'], stem_direction: -1, duration: '4', clef: 'bass' }, + { keys: ['d/4'], stem_direction: -1, duration: '4', clef: 'alto' }, + { keys: ['f/4'], stem_direction: -1, duration: '4', clef: 'soprano' }, + ].map(createStaveNote); + addAccidental(notes1[1], '#'); + addSubGroup(notes1[1], [ + f.ClefNote({ type: 'bass', options: { size: 'small' } }), + new _src_barnote__WEBPACK_IMPORTED_MODULE_1__.BarNote(_src_stavebarline__WEBPACK_IMPORTED_MODULE_3__.BarlineType.REPEAT_BEGIN), + f.TimeSigNote({ time: '3/4' }), + ]); + addSubGroup(notes2[2], [ + f.ClefNote({ type: 'alto', options: { size: 'small' } }), + f.TimeSigNote({ time: '9/8' }), + new _src_barnote__WEBPACK_IMPORTED_MODULE_1__.BarNote(_src_stavebarline__WEBPACK_IMPORTED_MODULE_3__.BarlineType.DOUBLE), + ]); + addSubGroup(notes1[3], [f.ClefNote({ type: 'soprano', options: { size: 'small' } })]); + addAccidental(notes1[2], 'b'); + addAccidental(notes2[3], '#'); + const voices = [f.Voice().addTickables(notes1), f.Voice().addTickables(notes2)]; + f.Formatter().joinVoices(voices).formatToStave(voices, stave); + for (let i = 0; i < numDraws; i++) { + f.draw(); + } + notes1.forEach((note) => _src_note__WEBPACK_IMPORTED_MODULE_2__.Note.plotMetrics(ctx, note, 150)); + ok(true, 'all pass'); +} +function multiStaff(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 550, 400); + const { createStaveNote, addAccidental, addSubGroup } = createShortcuts(f); + const stave1 = f.Stave({ x: 15, y: 30, width: 500 }).setClef('treble'); + const notes1 = [ + { keys: ['f/5'], stem_direction: 1, duration: '4' }, + { keys: ['d/4'], stem_direction: 1, duration: '4', clef: 'bass' }, + { keys: ['c/5'], stem_direction: 1, duration: '4', clef: 'alto' }, + { keys: ['c/5'], stem_direction: 1, duration: '4', clef: 'soprano' }, + ].map(createStaveNote); + const notes2 = [ + { keys: ['c/4'], stem_direction: -1, duration: '4' }, + { keys: ['c/3'], stem_direction: -1, duration: '4', clef: 'bass' }, + { keys: ['d/4'], stem_direction: -1, duration: '4', clef: 'alto' }, + { keys: ['f/4'], stem_direction: -1, duration: '4', clef: 'soprano' }, + ].map(createStaveNote); + const stave2 = f.Stave({ x: 15, y: 150, width: 500 }).setClef('bass'); + const notes3 = [ + { keys: ['e/3'], duration: '8', stem_direction: -1, clef: 'bass' }, + { keys: ['g/4'], duration: '8', stem_direction: 1, clef: 'treble' }, + { keys: ['d/4'], duration: '8', stem_direction: 1, clef: 'treble' }, + { keys: ['f/4'], duration: '8', stem_direction: 1, clef: 'treble' }, + { keys: ['c/4'], duration: '8', stem_direction: 1, clef: 'treble' }, + { keys: ['g/3'], duration: '8', stem_direction: -1, clef: 'bass' }, + { keys: ['d/3'], duration: '8', stem_direction: -1, clef: 'bass' }, + { keys: ['f/3'], duration: '8', stem_direction: -1, clef: 'bass' }, + ].map(createStaveNote); + f.StaveConnector({ top_stave: stave1, bottom_stave: stave2, type: 'brace' }); + f.StaveConnector({ top_stave: stave1, bottom_stave: stave2, type: 'singleLeft' }); + f.StaveConnector({ top_stave: stave1, bottom_stave: stave2, type: 'singleRight' }); + f.Beam({ notes: notes3.slice(1, 4) }); + f.Beam({ notes: notes3.slice(5) }); + addAccidental(notes1[1], '#'); + addSubGroup(notes1[1], [f.ClefNote({ type: 'bass', options: { size: 'small' } }), f.TimeSigNote({ time: '3/4' })]); + addSubGroup(notes2[2], [f.ClefNote({ type: 'alto', options: { size: 'small' } }), f.TimeSigNote({ time: '9/8' })]); + addSubGroup(notes1[3], [f.ClefNote({ type: 'soprano', options: { size: 'small' } })]); + addSubGroup(notes3[1], [f.ClefNote({ type: 'treble', options: { size: 'small' } })]); + addSubGroup(notes3[5], [f.ClefNote({ type: 'bass', options: { size: 'small' } })]); + addAccidental(notes3[0], '#'); + addAccidental(notes3[3], 'b'); + addAccidental(notes3[5], '#'); + addAccidental(notes1[2], 'b'); + addAccidental(notes2[3], '#'); + const voice1 = f.Voice().addTickables(notes1); + const voice2 = f.Voice().addTickables(notes2); + const voice3 = f.Voice().addTickables(notes3); + f.Formatter().joinVoices([voice1, voice2]).joinVoices([voice3]).formatToStave([voice1, voice2, voice3], stave1); + f.draw(); + ok(true, 'all pass'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(NoteSubGroupTests); + + + +/***/ }), + +/***/ "./tests/offscreencanvas_tests.ts": +/*!****************************************!*\ + !*** ./tests/offscreencanvas_tests.ts ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "OffscreenCanvasTests": () => (/* binding */ OffscreenCanvasTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_canvascontext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/canvascontext */ "./src/canvascontext.ts"); +/* harmony import */ var _src_formatter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/formatter */ "./src/formatter.ts"); +/* harmony import */ var _src_stave__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/stave */ "./src/stave.ts"); +/* harmony import */ var _src_stavebarline__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/stavebarline */ "./src/stavebarline.ts"); +/* harmony import */ var _src_stavenote__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/stavenote */ "./src/stavenote.ts"); +/* harmony import */ var _src_util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2021. +// MIT License +// +// OffscreenCanvas Tests + + + + + + + +const OffscreenCanvasTests = { + Start() { + // At the time of writing, OffscreenCanvas is still an experimental technology. + if ((0,_src_util__WEBPACK_IMPORTED_MODULE_6__.globalObject)().OffscreenCanvas === undefined) { + return; + } + QUnit.module('OffscreenCanvas'); + test('Simple Test', simpleTest); + }, +}; +function simpleTest() { + // Create a CanvasContext from an OffscreenCanvas. + // eslint-disable-next-line + // @ts-ignore + const offscreenCanvas = new OffscreenCanvas(550, 200); + const offscreenCtx = offscreenCanvas.getContext('2d'); + if (offscreenCtx == null) { + throw new Error("Couldn't create offscreen context"); + } + const ctx = new _src_canvascontext__WEBPACK_IMPORTED_MODULE_1__.CanvasContext(offscreenCtx); + // Render to the OffscreenCavans. + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(10, 50, 200); + stave.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.END); + stave.addClef('treble').setContext(ctx).draw(); + const notes = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_5__.StaveNote({ keys: ['c/4'], duration: 'q' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_5__.StaveNote({ keys: ['d/4'], duration: 'q' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_5__.StaveNote({ keys: ['b/4'], duration: 'qr' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_5__.StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: 'q' }), + ]; + _src_formatter__WEBPACK_IMPORTED_MODULE_2__.Formatter.FormatAndDraw(ctx, stave, notes); + // Copy the contents of the OffscreenCanvas to an HTMLCanvasElement. + const imgBmp = offscreenCanvas.transferToImageBitmap(); + const canvas = document.createElement('canvas'); + canvas.width = offscreenCanvas.width; + canvas.height = offscreenCanvas.height; + const canvasCtx = canvas.getContext('2d'); + if (canvasCtx == null) { + throw new Error("Couldn't create canvas context"); + } + canvasCtx.drawImage(imgBmp, 0, 0); + document.body.appendChild(canvas); + ok(true, 'all pass'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(OffscreenCanvasTests); + + + +/***/ }), + +/***/ "./tests/ornament_tests.ts": +/*!*********************************!*\ + !*** ./tests/ornament_tests.ts ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "OrnamentTests": () => (/* binding */ OrnamentTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_accidental__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/accidental */ "./src/accidental.ts"); +/* harmony import */ var _src_beam__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/beam */ "./src/beam.ts"); +/* harmony import */ var _src_dot__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/dot */ "./src/dot.ts"); +/* harmony import */ var _src_formatter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/formatter */ "./src/formatter.ts"); +/* harmony import */ var _src_glyph__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/glyph */ "./src/glyph.ts"); +/* harmony import */ var _src_ornament__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/ornament */ "./src/ornament.ts"); +/* harmony import */ var _src_stave__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/stave */ "./src/stave.ts"); +/* harmony import */ var _src_stavenote__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/stavenote */ "./src/stavenote.ts"); +/* harmony import */ var _src_voice__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/voice */ "./src/voice.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// Author: Cyril Silverman +// +// Ornament Tests +// TODO: Formatting for Jazz Ornaments is incorrect. The last note + ornament bleeds into the next measure. + + + + + + + + + + +const OrnamentTests = { + Start() { + QUnit.module('Ornament'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Ornaments', drawOrnaments); + run('Ornaments Vertically Shifted', drawOrnamentsDisplaced); + run('Ornaments - Delayed turns', drawOrnamentsDelayed); + run('Ornaments - Delayed turns, Multiple Draws', drawOrnamentsDelayedMultipleDraws); + run('Stacked', drawOrnamentsStacked); + run('With Upper/Lower Accidentals', drawOrnamentsWithAccidentals); + run('Jazz Ornaments', jazzOrnaments); + }, +}; +function drawOrnaments(options, contextBuilder) { + expect(0); + // Get the rendering context + const ctx = contextBuilder(options.elementId, 750, 195); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(10, 30, 700); + stave.setContext(ctx).draw(); + const notes = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + ]; + notes[0].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('mordent'), 0); + notes[1].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('mordent_inverted'), 0); + notes[2].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('turn'), 0); + notes[3].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('turn_inverted'), 0); + notes[4].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('tr'), 0); + notes[5].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('upprall'), 0); + notes[6].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('downprall'), 0); + notes[7].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('prallup'), 0); + notes[8].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('pralldown'), 0); + notes[9].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('upmordent'), 0); + notes[10].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('downmordent'), 0); + notes[11].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('lineprall'), 0); + notes[12].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('prallprall'), 0); + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, stave, notes); +} +function drawOrnamentsDisplaced(options, contextBuilder) { + expect(0); + // Get the rendering context + const ctx = contextBuilder(options.elementId, 750, 195); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(10, 30, 700); + stave.setContext(ctx).draw(); + const notes = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['a/5'], duration: '4', stem_direction: -1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['a/5'], duration: '4', stem_direction: -1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['a/5'], duration: '4', stem_direction: -1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['a/5'], duration: '4', stem_direction: -1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['a/5'], duration: '4', stem_direction: -1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['a/5'], duration: '4', stem_direction: -1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['a/5'], duration: '4', stem_direction: -1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }), + ]; + notes[0].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('mordent'), 0); + notes[1].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('mordent_inverted'), 0); + notes[1].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('mordent_inverted'), 0); + notes[2].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('turn'), 0); + notes[3].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('turn_inverted'), 0); + notes[4].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('tr'), 0); + notes[5].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('upprall'), 0); + notes[6].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('downprall'), 0); + notes[7].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('prallup'), 0); + notes[8].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('pralldown'), 0); + notes[9].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('upmordent'), 0); + notes[10].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('downmordent'), 0); + notes[11].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('lineprall'), 0); + notes[12].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('prallprall'), 0); + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, stave, notes); +} +/** + * Helper function for the next two tests: drawOrnamentsDelayed and drawOrnamentsDelayedMultipleDraws. + * setDelayed(true) shifts the turn symbol to the right (after its note). + */ +const addDelayedTurns = (options, contextBuilder) => { + // Get the rendering context + const context = contextBuilder(options.elementId, 550, 195); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(10, 30, 500); + stave.setContext(context).draw(); + const notes = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }), + ]; + notes[0].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('turn').setDelayed(true), 0); + notes[1].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('turn_inverted').setDelayed(true), 0); + notes[2].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('turn_inverted').setDelayed(true), 0); + notes[3].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('turn').setDelayed(true), 0); + return { context, stave, notes }; +}; +function drawOrnamentsDelayed(options, contextBuilder) { + expect(0); + const { context, stave, notes } = addDelayedTurns(options, contextBuilder); + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(context, stave, notes); +} +function drawOrnamentsDelayedMultipleDraws(options, contextBuilder) { + expect(0); + const { context, stave, notes } = addDelayedTurns(options, contextBuilder); + // We can FormatAndDraw() two times, and it looks fine. + // However, if you inspect the SVG element, you will see duplicate paths. + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(context, stave, notes); + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(context, stave, notes); +} +function drawOrnamentsStacked(options, contextBuilder) { + expect(0); + // Get the rendering context + const ctx = contextBuilder(options.elementId, 550, 195); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(10, 30, 500); + stave.setContext(ctx).draw(); + const notes = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }), + ]; + notes[0].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('mordent'), 0); + notes[1].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('turn_inverted'), 0); + notes[2].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('turn'), 0); + notes[3].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('turn_inverted'), 0); + notes[0].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('turn'), 0); + notes[1].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('prallup'), 0); + notes[2].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('upmordent'), 0); + notes[3].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('lineprall'), 0); + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, stave, notes); +} +function drawOrnamentsWithAccidentals(options, contextBuilder) { + expect(0); + // Get the rendering context + const ctx = contextBuilder(options.elementId, 650, 250); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(10, 60, 600); + stave.setContext(ctx).draw(); + const notes = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + ]; + notes[0].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('mordent').setUpperAccidental('#').setLowerAccidental('#'), 0); + notes[1].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('turn_inverted').setLowerAccidental('b').setUpperAccidental('b'), 0); + notes[1].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('turn_inverted').setLowerAccidental('b').setUpperAccidental('b'), 0); + notes[2].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('turn').setUpperAccidental('##').setLowerAccidental('##'), 0); + notes[3].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('mordent_inverted').setLowerAccidental('db').setUpperAccidental('db'), 0); + notes[4].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('turn_inverted').setUpperAccidental('++').setLowerAccidental('++'), 0); + notes[5].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('tr').setUpperAccidental('n').setLowerAccidental('n'), 0); + notes[6].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('prallup').setUpperAccidental('d').setLowerAccidental('d'), 0); + notes[7].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('lineprall').setUpperAccidental('db').setLowerAccidental('db'), 0); + notes[8].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('upmordent').setUpperAccidental('bbs').setLowerAccidental('bbs'), 0); + notes[9].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('prallprall').setUpperAccidental('bb').setLowerAccidental('bb'), 0); + notes[10].addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('turn_inverted').setUpperAccidental('+').setLowerAccidental('+'), 0); + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, stave, notes); +} +function jazzOrnaments(options) { + const clefWidth = _src_glyph__WEBPACK_IMPORTED_MODULE_5__.Glyph.getWidth('gClef', 38); // widest clef + // Helper function. + function draw(modifiers, keys, x, width, y, stemDirection) { + // Helper function to create a StaveNote. + const note = (keys, duration, modifier, stemDirection) => { + const n = new _src_stavenote__WEBPACK_IMPORTED_MODULE_8__.StaveNote({ keys, duration, stem_direction: stemDirection }) + .addModifier(modifier, 0) + .addModifier(new _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental('b'), 0); + const dot = duration.indexOf('d') >= 0; + if (dot) { + _src_dot__WEBPACK_IMPORTED_MODULE_3__.Dot.buildAndAttach([n], { all: true }); + } + return n; + }; + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(x, y, width).addClef('treble').setContext(ctx).draw(); + const notes = [ + note(keys, '4d', modifiers[0], stemDirection), + note(keys, '8', modifiers[1], stemDirection), + note(keys, '4d', modifiers[2], stemDirection), + note(keys, '8', modifiers[3], stemDirection), + ]; + if (modifiers.length > 4) { + notes[3].addModifier(modifiers[4], 0); + } + _src_beam__WEBPACK_IMPORTED_MODULE_2__.Beam.generateBeams(notes); + const voice = new _src_voice__WEBPACK_IMPORTED_MODULE_9__.Voice({ + num_beats: 4, + beat_value: 4, + }).setMode(_src_voice__WEBPACK_IMPORTED_MODULE_9__.VoiceMode.SOFT); + voice.addTickables(notes); + const formatter = new _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter().joinVoices([voice]); + formatter.format([voice], width - _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave.defaultPadding - clefWidth); + stave.setContext(ctx).draw(); + voice.draw(ctx, stave); + } + expect(0); + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 950, 400); + const ctx = f.getContext(); + ctx.scale(1, 1); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + const xStart = 10; + const width = 300; + const yStart = 50; + const staffHeight = 70; + let curX = xStart; + let curY = yStart; + let mods = [ + // measure 1 + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('scoop'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('doit'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('fall'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('doitLong'), + ]; + draw(mods, ['a/5'], curX, width, curY, -1); + curX += width; + mods = [ + // measure 2 + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('fallLong'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('bend'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('plungerClosed'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('plungerOpen'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('bend'), + ]; + draw(mods, ['a/5'], curX, width, curY, -1); + curX += width; + mods = [ + // measure 3 + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('flip'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('jazzTurn'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('smear'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('doit'), + ]; + draw(mods, ['a/5'], curX, width, curY, 1); + // second line + curX = xStart; + curY += staffHeight; + mods = [ + // measure 4 + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('scoop'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('doit'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('fall'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('doitLong'), + ]; + draw(mods, ['e/5'], curX, width, curY); + curX += width; + mods = [ + // measure 5 + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('fallLong'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('bend'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('plungerClosed'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('plungerOpen'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('bend'), + ]; + draw(mods, ['e/5'], curX, width, curY); + curX += width; + mods = [ + // measure 6 + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('flip'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('jazzTurn'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('smear'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('doit'), + ]; + draw(mods, ['e/5'], curX, width, curY); + // third line + curX = xStart; + curY += staffHeight; + mods = [ + // measure 7 + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('scoop'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('doit'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('fall'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('doitLong'), + ]; + draw(mods, ['e/4'], curX, width, curY); + curX += width; + mods = [ + // measure 8 + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('fallLong'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('bend'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('plungerClosed'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('plungerOpen'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('bend'), + ]; + draw(mods, ['e/4'], curX, width, curY); + curX += width; + mods = [ + // measure 9 + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('flip'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('jazzTurn'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('smear'), + new _src_ornament__WEBPACK_IMPORTED_MODULE_6__.Ornament('doit'), + ]; + draw(mods, ['e/4'], curX, width, curY); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(OrnamentTests); + + + +/***/ }), + +/***/ "./tests/parser_tests.ts": +/*!*******************************!*\ + !*** ./tests/parser_tests.ts ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ParserTests": () => (/* binding */ ParserTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_parser__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/parser */ "./src/parser.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Parser Tests + + +const ParserTests = { + Start() { + QUnit.module('Parser'); + test('Basic', basic); + test('Advanced', advanced); + test('Mixed', mixed); + test('Micro Score', microscore); + }, +}; +/** + * Grammar used in the first three test cases: basic, advanced, mixed. + */ +class TestGrammar { + // The begin() function is the only requirement when implementing the Grammar interface. + begin() { + return () => ({ expect: this.expect }); + } + BIGORLITTLE() { + return { expect: [this.BIGLINE, this.LITTLELINE], or: true }; + } + BIGLINE() { + return { expect: [this.LBRACE, this.WORD, this.WORDS, this.MAYBEEXCLAIM, this.RBRACE] }; + } + LITTLELINE() { + return { expect: [this.WORD, this.WORDS] }; + } + WORDS() { + return { expect: [this.COMMA, this.WORD], zeroOrMore: true }; + } + MAYBEEXCLAIM() { + return { expect: [this.EXCLAIM], maybe: true }; + } + LBRACE() { + return { token: '[{]' }; + } + RBRACE() { + return { token: '[}]' }; + } + WORD() { + return { token: '[a-zA-Z]+' }; + } + COMMA() { + return { token: '[,]' }; + } + EXCLAIM() { + return { token: '[!]' }; + } + EOL() { + return { token: '$' }; + } +} +/** + * Grammar used in the microscore test case. + * It represents a series of piano key numbers (Middle C == 40) separated by whitespace. + * C Major Scale => 40 42 44 45 47 49 51 52 + * A chord is 2 or more piano key numbers surrounded by BRACKETS and separated by PERIODS + * C Major == [40.44.47] + * C-major F-major G-major A-minor chord progression => [40.44.47] [45.49.52] [47.51.54] [49.52.56] + */ +class MicroScoreGrammar { + constructor() { + this.ITEM = () => ({ expect: [this.PIANO_KEY_NUMBER, this.CHORD], or: true }); + this.MAYBE_MORE_ITEMS = () => ({ expect: [this.ITEM], zeroOrMore: true }); + this.PIANO_KEY_NUMBER = () => ({ expect: [this.NUM], oneOrMore: true }); + this.CHORD = () => ({ expect: [this.LEFT_BRACKET, this.PIANO_KEY_NUMBER, this.MORE_CHORD_PARTS, this.RIGHT_BRACKET] }); + this.MORE_CHORD_PARTS = () => ({ expect: [this.PERIOD, this.PIANO_KEY_NUMBER], oneOrMore: true }); + this.NUM = () => ({ token: '\\d+' }); + this.WHITESPACE = () => ({ token: '\\s+' }); + this.PERIOD = () => ({ token: '\\.' }); + this.LEFT_BRACKET = () => ({ token: '\\[' }); + this.RIGHT_BRACKET = () => ({ token: '\\]' }); + this.EOL = () => ({ token: '$' }); + } + begin() { + return () => ({ expect: [this.ITEM, this.MAYBE_MORE_ITEMS, this.EOL] }); + } +} +/** + * Check that the result is a parse failure, and verify the error position. + */ +function fails(result, expectedErrorPos, msg) { + notOk(result.success, msg); + equal(result.errorPos, expectedErrorPos, msg); +} +function basic() { + const grammar = new TestGrammar(); + grammar.expect = [grammar.LITTLELINE, grammar.EOL]; + const parser = new _src_parser__WEBPACK_IMPORTED_MODULE_1__.Parser(grammar); + // Each of these strings will parse correctly. + const mustPass = ['first, second', 'first,second', 'first', 'first,second, third']; + mustPass.forEach((line) => equal(parser.parse(line).success, true, line)); + fails(parser.parse(''), 0); + fails(parser.parse('first second'), 6); + fails(parser.parse('first,,'), 5); + fails(parser.parse('first,'), 5); + fails(parser.parse(',,'), 0); +} +function advanced() { + const grammar = new TestGrammar(); + grammar.expect = [grammar.BIGLINE, grammar.EOL]; + const parser = new _src_parser__WEBPACK_IMPORTED_MODULE_1__.Parser(grammar); + const mustPass = ['{first}', '{first!}', '{first,second}', '{first,second!}', '{first,second,third!}']; + mustPass.forEach((line) => equal(parser.parse(line).success, true, line)); + fails(parser.parse('{first,second,third,}'), 19); + fails(parser.parse('first,second,third'), 0); + fails(parser.parse('{first,second,third'), 19); + fails(parser.parse('{!}'), 1); +} +function mixed() { + const grammar = new TestGrammar(); + grammar.expect = [grammar.BIGORLITTLE, grammar.EOL]; + const parser = new _src_parser__WEBPACK_IMPORTED_MODULE_1__.Parser(grammar); + const mustPass = ['{first,second,third!}', 'first, second']; + mustPass.forEach((line) => equal(parser.parse(line).success, true, line)); + fails(parser.parse('first second'), 6); +} +function microscore() { + const grammar = new MicroScoreGrammar(); + const parser = new _src_parser__WEBPACK_IMPORTED_MODULE_1__.Parser(grammar); + const mustPass = [ + '40 42 44 45 47 49 51 52', + '[40.44.47] [45.49.52] [47.51.54] [49.52.56]', + '40 [40.44.47] 45 47 [44.47.51]', // Mixed Notes and Chords: C4 [Cmajor] F4 G4 [Eminor] + ]; + mustPass.forEach((line) => { + var _a; + const result = parser.parse(line); + equal(result.success, true, line); + equal((_a = result.matches) === null || _a === void 0 ? void 0 : _a.length, 3, line); + }); + fails(parser.parse('40 42 44 45 47 49 5A 52'), 19); + fails(parser.parse('40.44.47] [45.49.52] [47.51.54] [49.52.56]'), 2); + fails(parser.parse('40 [40] 45 47 [44.47.51]'), 3); // A chord with a single note is not allowed. +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(ParserTests); + + + +/***/ }), + +/***/ "./tests/pedalmarking_tests.ts": +/*!*************************************!*\ + !*** ./tests/pedalmarking_tests.ts ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "PedalMarkingTests": () => (/* binding */ PedalMarkingTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// PedalMarking Tests +// TODO: Fix Error => Type 'Tickable' is not assignable to type 'StaveNote'. + +const PedalMarkingTests = { + Start() { + QUnit.module('PedalMarking'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Simple Pedal 1', simple1); + run('Simple Pedal 2', simple2); + run('Simple Pedal 3', simple3); + run('Release and Depress on Same Note 1', releaseDepress1); + run('Release and Depress on Same Note 2', releaseDepress2); + run('Custom Text 1', customTest1); + run('Custom Text 2', customTest2); + }, +}; +/** + * Every test below uses this to set up the score and two staves/voices. + */ +function createTest(makePedal) { + return (options) => { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 550, 200); + const score = f.EasyScore(); + const stave0 = f.Stave({ width: 250 }).addClef('treble'); + const voice0 = score.voice(score.notes('b4/4, b4, b4, b4[stem="down"]', { stem: 'up' })); + f.Formatter().joinVoices([voice0]).formatToStave([voice0], stave0); + const stave1 = f.Stave({ width: 260, x: 250 }); + const voice1 = score.voice(score.notes('c4/4, c4, c4, c4', { stem: 'up' })); + f.Formatter().joinVoices([voice1]).formatToStave([voice1], stave1); + makePedal(f, voice0.getTickables(), voice1.getTickables()); + f.draw(); + ok(true, 'Must render'); + }; +} +function withSimplePedal(style) { + return (factory, notes0, notes1) => factory.PedalMarking({ + notes: [notes0[0], notes0[2], notes0[3], notes1[3]], + options: { style }, + }); +} +function withReleaseAndDepressedPedal(style) { + return (factory, notes0, notes1) => factory.PedalMarking({ + notes: [notes0[0], notes0[3], notes0[3], notes1[1], notes1[1], notes1[3]], + options: { style }, + }); +} +const simple1 = createTest(withSimplePedal('text')); +const simple2 = createTest(withSimplePedal('bracket')); +const simple3 = createTest(withSimplePedal('mixed')); +const releaseDepress1 = createTest(withReleaseAndDepressedPedal('bracket')); +const releaseDepress2 = createTest(withReleaseAndDepressedPedal('mixed')); +const customTest1 = createTest((factory, notes0, notes1) => { + const pedal = factory.PedalMarking({ + notes: [notes0[0], notes1[3]], + options: { style: 'text' }, + }); + pedal.setCustomText('una corda', 'tre corda'); + return pedal; +}); +const customTest2 = createTest((factory, notes0, notes1) => { + const pedal = factory.PedalMarking({ + notes: [notes0[0], notes1[3]], + options: { style: 'mixed' }, + }); + pedal.setCustomText('Sost. Ped.'); + return pedal; +}); +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(PedalMarkingTests); + + + +/***/ }), + +/***/ "./tests/percussion_tests.ts": +/*!***********************************!*\ + !*** ./tests/percussion_tests.ts ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "PercussionTests": () => (/* binding */ PercussionTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/index */ "./src/index.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// Author: Mike Corrigan 2012 +// +// Percussion Tests +// TODO: Type 'Tickable[]' is not assignable to type 'StemmableNote[]'. + + +const PercussionTests = { + Start() { + QUnit.module('Percussion'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Percussion Clef', draw); + run('Percussion Notes', drawNotes); + run('Percussion Basic0', basic0); + run('Percussion Basic1', basic1); + run('Percussion Basic2', basic2); + run('Percussion Snare0', snare0); + run('Percussion Snare1', snare1); + run('Percussion Snare2', snare2); + run('Percussion Snare3', snare3); + }, +}; +function draw(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 120); + new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stave(10, 10, 300).addClef('percussion').setContext(ctx).draw(); + ok(true); +} +/** + * Helper function used by the drawNotes() test case below. + */ +function showNote(struct, stave, ctx, x) { + const staveNote = new _src_index__WEBPACK_IMPORTED_MODULE_1__.StaveNote(struct).setStave(stave); + new _src_index__WEBPACK_IMPORTED_MODULE_1__.TickContext().addTickable(staveNote).preFormat().setX(x); + staveNote.setContext(ctx).draw(); + return staveNote; +} +function drawNotes(options, contextBuilder) { + const notes = [ + { keys: ['g/5/d0'], duration: '4' }, + { keys: ['g/5/d1'], duration: '4' }, + { keys: ['g/5/d2'], duration: '4' }, + { keys: ['g/5/d3'], duration: '4' }, + { keys: ['x/'], duration: '1' }, + { keys: ['g/5/t0'], duration: '1' }, + { keys: ['g/5/t1'], duration: '4' }, + { keys: ['g/5/t2'], duration: '4' }, + { keys: ['g/5/t3'], duration: '4' }, + { keys: ['x/'], duration: '1' }, + { keys: ['g/5/x0'], duration: '1' }, + { keys: ['g/5/x1'], duration: '4' }, + { keys: ['g/5/x2'], duration: '4' }, + { keys: ['g/5/x3'], duration: '4' }, + ]; + const ctx = contextBuilder(options.elementId, notes.length * 25 + 100, 240); + // Draw two staves, one with up-stems and one with down-stems. + for (let h = 0; h < 2; ++h) { + const stave = new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stave(10, 10 + h * 120, notes.length * 25 + 75).addClef('percussion').setContext(ctx).draw(); + for (let i = 0; i < notes.length; ++i) { + const note = notes[i]; + note.stem_direction = h === 0 ? -1 : 1; + const staveNote = showNote(note, stave, ctx, (i + 1) * 25); + ok(staveNote.getX() > 0, 'Note ' + i + ' has X value'); + ok(staveNote.getYs().length > 0, 'Note ' + i + ' has Y values'); + } + } +} +/** + * Helper function for the seven test cases below. + * Adds a percussion clef (two short vertical bars, like a pause sign) to the stave. + */ +function createSingleMeasureTest(setup) { + return (options) => { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 500); + const stave = f.Stave().addClef('percussion'); + setup(f); + f.Formatter().joinVoices(f.getVoices()).formatToStave(f.getVoices(), stave); + f.draw(); + ok(true); + }; +} +const basic0 = createSingleMeasureTest((f) => { + const voice0 = f + .Voice() + .addTickables([ + f.StaveNote({ keys: ['g/5/x2'], duration: '8' }), + f.StaveNote({ keys: ['g/5/x2'], duration: '8' }), + f.StaveNote({ keys: ['g/5/x2'], duration: '8' }), + f.StaveNote({ keys: ['g/5/x2'], duration: '8' }), + f.StaveNote({ keys: ['g/5/x2'], duration: '8' }), + f.StaveNote({ keys: ['g/5/x2'], duration: '8' }), + f.StaveNote({ keys: ['g/5/x2'], duration: '8' }), + f.StaveNote({ keys: ['g/5/x2'], duration: '8' }), + ]); + const voice1 = f + .Voice() + .addTickables([ + f.StaveNote({ keys: ['f/4'], duration: '8', stem_direction: -1 }), + f.StaveNote({ keys: ['f/4'], duration: '8', stem_direction: -1 }), + f.StaveNote({ keys: ['d/4/x2', 'c/5'], duration: '4', stem_direction: -1 }), + f.StaveNote({ keys: ['f/4'], duration: '8', stem_direction: -1 }), + f.StaveNote({ keys: ['f/4'], duration: '8', stem_direction: -1 }), + f.StaveNote({ keys: ['d/4/x2', 'c/5'], duration: '4', stem_direction: -1 }), + ]); + f.Beam({ notes: voice0.getTickables() }); + f.Beam({ notes: voice1.getTickables().slice(0, 2) }); + f.Beam({ notes: voice1.getTickables().slice(3, 5) }); +}); +const basic1 = createSingleMeasureTest((f) => { + f.Voice().addTickables([ + f.StaveNote({ keys: ['f/5/x2'], duration: '4' }), + f.StaveNote({ keys: ['f/5/x2'], duration: '4' }), + f.StaveNote({ keys: ['f/5/x2'], duration: '4' }), + f.StaveNote({ keys: ['f/5/x2'], duration: '4' }), + ]); + f.Voice().addTickables([ + f.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: -1 }), + f.StaveNote({ keys: ['d/4/x2', 'c/5'], duration: '4', stem_direction: -1 }), + f.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: -1 }), + f.StaveNote({ keys: ['d/4/x2', 'c/5'], duration: '4', stem_direction: -1 }), + ]); +}); +const basic2 = createSingleMeasureTest((f) => { + const voice0 = f + .Voice() + .addTickables([ + f.StaveNote({ keys: ['a/5/x3'], duration: '8' }), + f.StaveNote({ keys: ['g/5/x2'], duration: '8' }), + f.StaveNote({ keys: ['g/5'], duration: '8' }), + f.StaveNote({ keys: ['g/4/n', 'g/5/x2'], duration: '8' }), + f.StaveNote({ keys: ['g/5/x2'], duration: '8' }), + f.StaveNote({ keys: ['g/5/x2'], duration: '8' }), + f.StaveNote({ keys: ['g/5/x2'], duration: '8' }), + f.StaveNote({ keys: ['g/5/x2'], duration: '8' }), + ]); + f.Beam({ notes: voice0.getTickables().slice(1, 8) }); + const notes1 = [ + f.StaveNote({ keys: ['f/4'], duration: '8', stem_direction: -1 }), + f.StaveNote({ keys: ['f/4'], duration: '8', stem_direction: -1 }), + f.StaveNote({ keys: ['d/4/x2', 'c/5'], duration: '4', stem_direction: -1 }), + f.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: -1 }), + f.StaveNote({ keys: ['d/4/x2', 'c/5'], duration: '8d', stem_direction: -1 }), + f.StaveNote({ keys: ['c/5'], duration: '16', stem_direction: -1 }), + ]; + _src_index__WEBPACK_IMPORTED_MODULE_1__.Dot.buildAndAttach([notes1[4]], { all: true }); + const voice1 = f.Voice().addTickables(notes1); + f.Beam({ notes: voice1.getTickables().slice(0, 2) }); + f.Beam({ notes: voice1.getTickables().slice(4, 6) }); +}); +const snare0 = createSingleMeasureTest((f) => { + const font = { + family: _src_index__WEBPACK_IMPORTED_MODULE_1__.Font.SERIF, + size: 14, + weight: _src_index__WEBPACK_IMPORTED_MODULE_1__.FontWeight.BOLD, + style: _src_index__WEBPACK_IMPORTED_MODULE_1__.FontStyle.ITALIC, + }; + f.Voice().addTickables([ + f + .StaveNote({ keys: ['c/5'], duration: '4', stem_direction: -1 }) + .addModifier(f.Articulation({ type: 'a>' }), 0) + .addModifier(f.Annotation({ text: 'L', font }), 0), + f.StaveNote({ keys: ['c/5'], duration: '4', stem_direction: -1 }).addModifier(f.Annotation({ text: 'R', font }), 0), + f.StaveNote({ keys: ['c/5'], duration: '4', stem_direction: -1 }).addModifier(f.Annotation({ text: 'L', font }), 0), + f.StaveNote({ keys: ['c/5'], duration: '4', stem_direction: -1 }).addModifier(f.Annotation({ text: 'L', font }), 0), + ]); +}); +const snare1 = createSingleMeasureTest((f) => { + f.Voice().addTickables([ + f.StaveNote({ keys: ['g/5/x2'], duration: '4', stem_direction: -1 }).addModifier(f.Articulation({ type: 'ah' }), 0), + f.StaveNote({ keys: ['g/5/x2'], duration: '4', stem_direction: -1 }), + f.StaveNote({ keys: ['g/5/x2'], duration: '4', stem_direction: -1 }).addModifier(f.Articulation({ type: 'ah' }), 0), + f.StaveNote({ keys: ['a/5/x3'], duration: '4', stem_direction: -1 }).addModifier(f.Articulation({ type: 'a,' }), 0), + ]); +}); +const snare2 = createSingleMeasureTest((f) => { + f.Voice().addTickables([ + f.StaveNote({ keys: ['c/5'], duration: '4', stem_direction: -1 }).addModifier(new _src_index__WEBPACK_IMPORTED_MODULE_1__.Tremolo(1), 0), + f.GraceNote({ keys: ['c/5'], duration: '4', stem_direction: -1 }).addModifier(new _src_index__WEBPACK_IMPORTED_MODULE_1__.Tremolo(1), 0), + f.StaveNote({ keys: ['c/5'], duration: '4', stem_direction: -1 }).addModifier(new _src_index__WEBPACK_IMPORTED_MODULE_1__.Tremolo(3), 0), + f.StaveNote({ keys: ['c/5'], duration: '4', stem_direction: -1 }).addModifier(new _src_index__WEBPACK_IMPORTED_MODULE_1__.Tremolo(5), 0), + ]); +}); +const snare3 = createSingleMeasureTest((factory) => { + factory + .Voice() + .addTickables([ + factory.StaveNote({ keys: ['c/5'], duration: '4', stem_direction: 1 }).addModifier(new _src_index__WEBPACK_IMPORTED_MODULE_1__.Tremolo(2), 0), + factory.GraceNote({ keys: ['c/5'], duration: '4', stem_direction: 1 }).addModifier(new _src_index__WEBPACK_IMPORTED_MODULE_1__.Tremolo(2), 0), + factory.GraceNote({ keys: ['c/5'], duration: '4', stem_direction: 1 }).addModifier(new _src_index__WEBPACK_IMPORTED_MODULE_1__.Tremolo(3), 0), + factory.StaveNote({ keys: ['c/5'], duration: '4', stem_direction: 1 }).addModifier(new _src_index__WEBPACK_IMPORTED_MODULE_1__.Tremolo(5), 0), + ]); +}); +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(PercussionTests); + + + +/***/ }), + +/***/ "./tests/registry_tests.ts": +/*!*********************************!*\ + !*** ./tests/registry_tests.ts ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "RegistryTests": () => (/* binding */ RegistryTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/index */ "./src/index.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Registry Tests + + +const RegistryTests = { + Start() { + QUnit.module('Registry'); + test('Register and Clear', registerAndClear); + test('Default Registry', defaultRegistry); + test('Multiple Classes', classes); + }, +}; +function registerAndClear() { + const registry = new _src_index__WEBPACK_IMPORTED_MODULE_1__.Registry(); + const score = new _src_index__WEBPACK_IMPORTED_MODULE_1__.EasyScore({ factory: _src_index__WEBPACK_IMPORTED_MODULE_1__.Factory.newFromElementId(null) }); + registry.register(score.notes('C4')[0], 'foobar'); + const foobar = registry.getElementById('foobar'); + ok(foobar); + equal(foobar.getAttribute('id'), 'foobar'); + registry.clear(); + notOk(registry.getElementById('foobar')); + // eslint-disable-next-line + // @ts-ignore: intentional type mismatch to trigger an error. + throws(() => registry.register(score.notes('C4'))); + registry.clear(); + ok(registry.register(score.notes('C4[id="boobar"]')[0]).getElementById('boobar')); +} +function defaultRegistry() { + const registry = new _src_index__WEBPACK_IMPORTED_MODULE_1__.Registry(); + const score = new _src_index__WEBPACK_IMPORTED_MODULE_1__.EasyScore({ factory: _src_index__WEBPACK_IMPORTED_MODULE_1__.Factory.newFromElementId(null) }); + _src_index__WEBPACK_IMPORTED_MODULE_1__.Registry.enableDefaultRegistry(registry); + score.notes('C4[id="foobar"]'); + const note = registry.getElementById('foobar'); + ok(note); + note.setAttribute('id', 'boobar'); + ok(registry.getElementById('boobar')); + notOk(registry.getElementById('foobar')); + registry.clear(); + equal(registry.getElementsByType(_src_index__WEBPACK_IMPORTED_MODULE_1__.StaveNote.CATEGORY).length, 0); + score.notes('C5'); + const elements = registry.getElementsByType(_src_index__WEBPACK_IMPORTED_MODULE_1__.StaveNote.CATEGORY); + equal(elements.length, 1); +} +function classes() { + const registry = new _src_index__WEBPACK_IMPORTED_MODULE_1__.Registry(); + const score = new _src_index__WEBPACK_IMPORTED_MODULE_1__.EasyScore({ factory: _src_index__WEBPACK_IMPORTED_MODULE_1__.Factory.newFromElementId(null) }); + _src_index__WEBPACK_IMPORTED_MODULE_1__.Registry.enableDefaultRegistry(registry); + score.notes('C4[id="foobar"]'); + const note = registry.getElementById('foobar'); + note.addClass('foo'); + ok(note.hasClass('foo')); + notOk(note.hasClass('boo')); + equal(registry.getElementsByClass('foo').length, 1); + equal(registry.getElementsByClass('boo').length, 0); + note.addClass('boo'); + ok(note.hasClass('foo')); + ok(note.hasClass('boo')); + equal(registry.getElementsByClass('foo').length, 1); + equal(registry.getElementsByClass('boo').length, 1); + note.removeClass('boo'); + note.removeClass('foo'); + notOk(note.hasClass('foo')); + notOk(note.hasClass('boo')); + equal(registry.getElementsByClass('foo').length, 0); + equal(registry.getElementsByClass('boo').length, 0); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(RegistryTests); + + + +/***/ }), + +/***/ "./tests/renderer_tests.ts": +/*!*********************************!*\ + !*** ./tests/renderer_tests.ts ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "RendererTests": () => (/* binding */ RendererTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/index */ "./src/index.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author: Ron B. Yeh +// MIT License +// +// Renderer Tests + + +// TODO: Should FactoryOptions.renderer.elementId also accept a canvas | div? +const STAVE_WIDTH = 700; +const STAVE_HEIGHT = 100; +// FactoryOptions.stave.space defaults to 10. +// We subtract 10 to make the useRendererAPI() output look identical to useFactoryAPI(). +const STAVE_RIGHT_MARGIN = 10; +const USE_RENDERER = { useRendererAPI: true }; +const USE_FACTORY = { useRendererAPI: false }; +const RendererTests = { + Start() { + QUnit.module('Renderer'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + // Randomly choose one of four setup paths. See below for a description. + // Refresh `flow.html` to see the test change each time. + // We can manually check that they look identical + // by opening `flow.html` in multiple tabs & quickly switching between tabs. + run('Random', random); + // These are the four setup paths. They should all produce the same output. + // Use the: Renderer API OR Factory API + // Pass in: element ID string OR canvas/div element. + run('Renderer API with element ID string', stringElementId, USE_RENDERER); + run('Renderer API with canvas or div', canvasOrDivElement, USE_RENDERER); + run('Renderer API with context', passRenderContext); + run('Factory API with element ID string', stringElementId, USE_FACTORY); + run('Factory API with canvas or div', canvasOrDivElement, USE_FACTORY); + }, +}; +/** + * Helper function to add three notes to a stave. + */ +function drawStave(stave, context) { + stave.addClef('bass').addTimeSignature('3/4').draw(); + _src_index__WEBPACK_IMPORTED_MODULE_1__.Formatter.FormatAndDraw(context, stave, [ + new _src_index__WEBPACK_IMPORTED_MODULE_1__.StaveNote({ keys: ['C/4'], duration: '4' }), + new _src_index__WEBPACK_IMPORTED_MODULE_1__.StaveNote({ keys: ['E/4'], duration: '4' }), + new _src_index__WEBPACK_IMPORTED_MODULE_1__.StaveNote({ keys: ['G/4'], duration: '4' }), + ]); +} +/** + * Randomize the test upon each refresh (for verifying that the output is identical). + * Draw a colored outline to indicate which of the four options is shown. + * - blue = element is a SVG or Canvas element + * - gray = element ID is a string + * - solid outline = use the Renderer API directly + * - dashed outline = use the Factory API + */ +function random(options) { + const useElementIDString = Math.random() > 0.5; + const useRendererAPI = Math.random() > 0.5; + options.params = { useRendererAPI }; + if (useElementIDString) { + stringElementId(options); + } + else { + canvasOrDivElement(options); + } + // eslint-disable-next-line + const element = document.getElementById(options.elementId); + const colorForElementType = useElementIDString ? '#CCCCCC' /* light gray */ : '#0074d9'; /* blue */ + const lineStyleForWhichAPI = useRendererAPI ? 'solid' : 'dashed'; + const borderStyle = `3px ${lineStyleForWhichAPI} ${colorForElementType}`; + let elementType; + if (options.backend === _src_index__WEBPACK_IMPORTED_MODULE_1__.Renderer.Backends.CANVAS) { + // If the backend is canvas, we draw a border around the canvas directly. + element.style.border = borderStyle; + elementType = '<canvas> element object'; + } + else { + // If the backend is SVG, we draw a border around the SVG child of the DIV. + element.children[0].style.border = borderStyle; + elementType = '<svg> element object'; + } + if (useElementIDString) { + elementType = 'elementID string'; + } + const whichAPI = useRendererAPI ? 'Renderer API' : 'Factory API'; + element.parentElement.insertAdjacentHTML('beforeend', `
` + + `${whichAPI}` + + ` with ` + + `${elementType}` + + `

`); +} +function useRendererAPI(e, backend) { + const renderer = new _src_index__WEBPACK_IMPORTED_MODULE_1__.Renderer(e, backend); + renderer.resize(STAVE_WIDTH, STAVE_HEIGHT); + const context = renderer.getContext(); + drawStave(new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stave(0, 0, STAVE_WIDTH - STAVE_RIGHT_MARGIN).setContext(context), context); +} +/** + * Alternatively, use the Factory API! + * The Factory API declares elementId to be string | null. + * However, if we pass in a canvas or div element, it will still work. + * This is because Factory calls new Renderer(elementId, ...) via Renderer.buildContext(). + */ +function useFactoryAPI(e, backend) { + const opts = { + renderer: { elementId: e, width: STAVE_WIDTH, height: STAVE_HEIGHT, backend }, + }; + const factory = new _src_index__WEBPACK_IMPORTED_MODULE_1__.Factory(opts); + drawStave(factory.Stave(), factory.getContext()); +} +/** + * Pass in a elementId string. Renderer will call document.getElementById(). + */ +function stringElementId(options) { + const elementId = options.elementId; + if (options.params.useRendererAPI) { + useRendererAPI(elementId, options.backend); + } + else { + useFactoryAPI(elementId, options.backend); + } + ok(true); +} +/** + * Pass a canvas or div element directly to the Renderer constructor. + */ +function canvasOrDivElement(options) { + const element = document.getElementById(options.elementId); + if (options.params.useRendererAPI) { + useRendererAPI(element, options.backend); + } + else { + useFactoryAPI(element, options.backend); + } + ok(true); +} +/** + * Pass the render context directly to the Renderer constructor. + */ +function passRenderContext(options) { + let context; + const element = document.getElementById(options.elementId); + if ((0,_src_index__WEBPACK_IMPORTED_MODULE_1__.isHTMLCanvas)(element)) { + const ctx = element.getContext('2d'); + if (!ctx) { + throw new _src_index__WEBPACK_IMPORTED_MODULE_1__.RuntimeError(`Couldn't get context from element "${options.elementId}"`); + } + context = new _src_index__WEBPACK_IMPORTED_MODULE_1__.CanvasContext(ctx); + } + else { + context = new _src_index__WEBPACK_IMPORTED_MODULE_1__.SVGContext(element); + } + const renderer = new _src_index__WEBPACK_IMPORTED_MODULE_1__.Renderer(context); + renderer.resize(STAVE_WIDTH, STAVE_HEIGHT); + drawStave(new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stave(0, 0, STAVE_WIDTH - STAVE_RIGHT_MARGIN).setContext(context), context); + ok(true); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(RendererTests); + + + +/***/ }), + +/***/ "./tests/rests_tests.ts": +/*!******************************!*\ + !*** ./tests/rests_tests.ts ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "RestsTests": () => (/* binding */ RestsTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_beam__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/beam */ "./src/beam.ts"); +/* harmony import */ var _src_dot__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/dot */ "./src/dot.ts"); +/* harmony import */ var _src_flow__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/flow */ "./src/flow.ts"); +/* harmony import */ var _src_formatter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/formatter */ "./src/formatter.ts"); +/* harmony import */ var _src_stave__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/stave */ "./src/stave.ts"); +/* harmony import */ var _src_stavenote__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/stavenote */ "./src/stavenote.ts"); +/* harmony import */ var _src_tuplet__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/tuplet */ "./src/tuplet.ts"); +/* harmony import */ var _src_voice__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/voice */ "./src/voice.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Rests Tests + + + + + + + + + +const RestsTests = { + Start() { + QUnit.module('Rests'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + // TODO: Simplify test names by removing 'Rests - ' or 'Rests '. + run('Rests - Dotted', basic); + run('Auto Align Rests - Beamed Notes Stems Up', beamsUp); + run('Auto Align Rests - Beamed Notes Stems Down', beamsDown); + run('Auto Align Rests - Tuplets Stems Up', tupletsUp); + run('Auto Align Rests - Tuplets Stems Down', tupletsDown); + run('Auto Align Rests - Single Voice (Default)', singleVoiceDefaultAlignment); + run('Auto Align Rests - Single Voice (Align All)', singleVoiceAlignAll); + run('Auto Align Rests - Multi Voice', multiVoice); + }, +}; +/** + * Helper function to create a context and stave. + * + * @param options + * @param contextBuilder static function in renderer.ts (Renderer.getSVGContext or Renderer.getCanvasContext). + * @param width + * @param height + * @returns object with .context and .stave properties + */ +function setupContext(options, contextBuilder, width = 350, height = 150) { + // context is SVGContext or CanvasRenderingContext2D (native) or CanvasContext (only if Renderer.USE_CANVAS_PROXY is true). + const context = contextBuilder(options.elementId, width, height); + context.scale(0.9, 0.9); + context.fillStyle = '#221'; + context.strokeStyle = '#221'; + context.font = '10pt Arial'; + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_5__.Stave(10, 30, width).addClef('treble').addTimeSignature('4/4').setContext(context).draw(); + return { context, stave }; +} +/** + * Dotted rests (whole to 128th). + * The rest duration is specified as 'wr', 'hr', ..., '128r'. + */ +function basic(options, contextBuilder) { + const { context, stave } = setupContext(options, contextBuilder, 700); + const notes = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ keys: ['b/4'], stem_direction: 1, duration: 'wr' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ keys: ['b/4'], stem_direction: 1, duration: 'hr' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ keys: ['b/4'], stem_direction: 1, duration: '4r' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ keys: ['b/4'], stem_direction: 1, duration: '8r' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ keys: ['b/4'], stem_direction: 1, duration: '16r' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ keys: ['b/4'], stem_direction: 1, duration: '32r' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ keys: ['b/4'], stem_direction: 1, duration: '64r' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ keys: ['b/4'], stem_direction: 1, duration: '128r' }), + ]; + _src_dot__WEBPACK_IMPORTED_MODULE_2__.Dot.buildAndAttach(notes, { all: true }); + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(context, stave, notes); + ok(true, 'Dotted Rest Test'); +} +// Optional: Use a helper function to make your code more concise. +const note = (noteStruct) => new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote(noteStruct); +/** + * Rests are intermixed within beamed notes (with the stems and beams at the top). + */ +function beamsUp(options, contextBuilder) { + const { context, stave } = setupContext(options, contextBuilder, 600, 160); + const notes = [ + note({ keys: ['e/5'], stem_direction: 1, duration: '8' }), + note({ keys: ['b/4'], stem_direction: 1, duration: '8r' }), + note({ keys: ['b/5'], stem_direction: 1, duration: '8' }), + note({ keys: ['c/5'], stem_direction: 1, duration: '8' }), + note({ keys: ['b/4', 'd/5', 'a/5'], stem_direction: 1, duration: '8' }), + note({ keys: ['b/4'], stem_direction: 1, duration: '8r' }), + note({ keys: ['b/4'], stem_direction: 1, duration: '8r' }), + note({ keys: ['c/4'], stem_direction: 1, duration: '8' }), + note({ keys: ['b/4', 'd/5', 'a/5'], stem_direction: 1, duration: '8' }), + note({ keys: ['b/4'], stem_direction: 1, duration: '8' }), + note({ keys: ['b/4'], stem_direction: 1, duration: '8r' }), + note({ keys: ['c/4'], stem_direction: 1, duration: '8' }), + ]; + const beam1 = new _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam(notes.slice(0, 4)); + const beam2 = new _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam(notes.slice(4, 8)); + const beam3 = new _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam(notes.slice(8, 12)); + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(context, stave, notes); + beam1.setContext(context).draw(); + beam2.setContext(context).draw(); + beam3.setContext(context).draw(); + ok(true, 'Auto Align Rests - Beams Up Test'); +} +/** + * Rests are intermixed within beamed notes (with the stems and beams at the bottom). + */ +function beamsDown(options, contextBuilder) { + const { context, stave } = setupContext(options, contextBuilder, 600, 160); + const notes = [ + note({ keys: ['a/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), + note({ keys: ['b/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['c/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['b/4', 'd/5', 'a/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), + note({ keys: ['e/4'], stem_direction: -1, duration: '8' }), + note({ keys: ['b/4', 'd/5', 'a/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '8' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), + note({ keys: ['e/4'], stem_direction: -1, duration: '8' }), + ]; + const beam1 = new _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam(notes.slice(0, 4)); + const beam2 = new _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam(notes.slice(4, 8)); + const beam3 = new _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam(notes.slice(8, 12)); + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(context, stave, notes); + beam1.setContext(context).draw(); + beam2.setContext(context).draw(); + beam3.setContext(context).draw(); + ok(true, 'Auto Align Rests - Beams Down Test'); +} +/** + * Call setTupletLocation(Tuplet.LOCATION_TOP) to place the tuplet indicator (bracket and number) at the + * top of the group of notes. Tuplet.LOCATION_TOP is the default, so this is optional. + */ +function tupletsUp(options, contextBuilder) { + const { context, stave } = setupContext(options, contextBuilder, 600, 160); + const notes = [ + note({ keys: ['b/4'], stem_direction: 1, duration: '4' }), + note({ keys: ['b/4'], stem_direction: 1, duration: '4' }), + note({ keys: ['a/5'], stem_direction: 1, duration: '4r' }), + note({ keys: ['a/5'], stem_direction: 1, duration: '4r' }), + note({ keys: ['g/5'], stem_direction: 1, duration: '4r' }), + note({ keys: ['b/5'], stem_direction: 1, duration: '4' }), + note({ keys: ['a/5'], stem_direction: 1, duration: '4' }), + note({ keys: ['g/5'], stem_direction: 1, duration: '4r' }), + note({ keys: ['b/4'], stem_direction: 1, duration: '4' }), + note({ keys: ['a/5'], stem_direction: 1, duration: '4' }), + note({ keys: ['b/4'], stem_direction: 1, duration: '4r' }), + note({ keys: ['b/4'], stem_direction: 1, duration: '4r' }), + ]; + const tuplet1 = new _src_tuplet__WEBPACK_IMPORTED_MODULE_7__.Tuplet(notes.slice(0, 3)).setTupletLocation(_src_tuplet__WEBPACK_IMPORTED_MODULE_7__.Tuplet.LOCATION_TOP); + const tuplet2 = new _src_tuplet__WEBPACK_IMPORTED_MODULE_7__.Tuplet(notes.slice(3, 6)).setTupletLocation(_src_tuplet__WEBPACK_IMPORTED_MODULE_7__.Tuplet.LOCATION_TOP); + const tuplet3 = new _src_tuplet__WEBPACK_IMPORTED_MODULE_7__.Tuplet(notes.slice(6, 9)).setTupletLocation(_src_tuplet__WEBPACK_IMPORTED_MODULE_7__.Tuplet.LOCATION_TOP); + const tuplet4 = new _src_tuplet__WEBPACK_IMPORTED_MODULE_7__.Tuplet(notes.slice(9, 12)).setTupletLocation(_src_tuplet__WEBPACK_IMPORTED_MODULE_7__.Tuplet.LOCATION_TOP); + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(context, stave, notes); + tuplet1.setContext(context).draw(); + tuplet2.setContext(context).draw(); + tuplet3.setContext(context).draw(); + tuplet4.setContext(context).draw(); + ok(true, 'Auto Align Rests - Tuplets Stem Up Test'); +} +/** + * Call setTupletLocation(Tuplet.LOCATION_BOTTOM) to place the tuplet indicator (bracket and number) at the + * bottom of the group of notes. + */ +function tupletsDown(options, contextBuilder) { + const { context, stave } = setupContext(options, contextBuilder, 600, 160); + const notes = [ + note({ keys: ['a/5'], stem_direction: -1, duration: '8r' }), + note({ keys: ['g/5'], stem_direction: -1, duration: '8r' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '8' }), + note({ keys: ['a/5'], stem_direction: -1, duration: '8r' }), + note({ keys: ['g/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['b/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['a/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['g/5'], stem_direction: -1, duration: '8r' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '8' }), + note({ keys: ['a/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['g/5'], stem_direction: -1, duration: '8r' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), + ]; + const beam1 = new _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam(notes.slice(0, 3)); + const beam2 = new _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam(notes.slice(3, 6)); + const beam3 = new _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam(notes.slice(6, 9)); + const beam4 = new _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam(notes.slice(9, 12)); + const tuplet1 = new _src_tuplet__WEBPACK_IMPORTED_MODULE_7__.Tuplet(notes.slice(0, 3)).setTupletLocation(_src_tuplet__WEBPACK_IMPORTED_MODULE_7__.Tuplet.LOCATION_BOTTOM); + const tuplet2 = new _src_tuplet__WEBPACK_IMPORTED_MODULE_7__.Tuplet(notes.slice(3, 6)).setTupletLocation(_src_tuplet__WEBPACK_IMPORTED_MODULE_7__.Tuplet.LOCATION_BOTTOM); + const tuplet3 = new _src_tuplet__WEBPACK_IMPORTED_MODULE_7__.Tuplet(notes.slice(6, 9)).setTupletLocation(_src_tuplet__WEBPACK_IMPORTED_MODULE_7__.Tuplet.LOCATION_BOTTOM); + const tuplet4 = new _src_tuplet__WEBPACK_IMPORTED_MODULE_7__.Tuplet(notes.slice(9, 12)).setTupletLocation(_src_tuplet__WEBPACK_IMPORTED_MODULE_7__.Tuplet.LOCATION_BOTTOM); + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(context, stave, notes); + tuplet1.setContext(context).draw(); + tuplet2.setContext(context).draw(); + tuplet3.setContext(context).draw(); + tuplet4.setContext(context).draw(); + beam1.setContext(context).draw(); + beam2.setContext(context).draw(); + beam3.setContext(context).draw(); + beam4.setContext(context).draw(); + ok(true, 'Auto Align Rests - Tuplets Stem Down Test'); +} +/** + * By default rests are centered vertically within the stave, except + * when they are inside a group of beamed notes (in which case they are + * centered vertically within that group). + */ +function singleVoiceDefaultAlignment(options, contextBuilder) { + const { context, stave } = setupContext(options, contextBuilder, 600, 160); + const notes = [ + note({ keys: ['b/4'], stem_direction: -1, duration: '4r' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '4r' }), + note({ keys: ['f/4'], stem_direction: -1, duration: '4' }), + note({ keys: ['e/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), + note({ keys: ['a/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '8' }), + note({ keys: ['e/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['a/5'], stem_direction: 1, duration: '4' }), + note({ keys: ['b/4'], stem_direction: 1, duration: '4r' }), + note({ keys: ['b/5'], stem_direction: 1, duration: '4' }), + note({ keys: ['d/5'], stem_direction: -1, duration: '4' }), + note({ keys: ['g/5'], stem_direction: -1, duration: '4' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '4r' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '4r' }), + ]; + const beam = new _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam(notes.slice(5, 9)); + const tuplet = new _src_tuplet__WEBPACK_IMPORTED_MODULE_7__.Tuplet(notes.slice(9, 12)).setTupletLocation(_src_tuplet__WEBPACK_IMPORTED_MODULE_7__.Tuplet.LOCATION_TOP); + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(context, stave, notes); + tuplet.setContext(context).draw(); + beam.setContext(context).draw(); + ok(true, 'Auto Align Rests - Default Test'); +} +/** + * The only difference between staveRestsAll() and staveRests() is that this test case + * passes { align_rests: true } to Formatter.FormatAndDraw(...). + */ +function singleVoiceAlignAll(options, contextBuilder) { + const { context, stave } = setupContext(options, contextBuilder, 600, 160); + const notes = [ + note({ keys: ['b/4'], stem_direction: -1, duration: '4r' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '4r' }), + note({ keys: ['f/4'], stem_direction: -1, duration: '4' }), + note({ keys: ['e/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), + note({ keys: ['a/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '8' }), + note({ keys: ['e/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['a/5'], stem_direction: 1, duration: '4' }), + note({ keys: ['b/4'], stem_direction: 1, duration: '4r' }), + note({ keys: ['b/5'], stem_direction: 1, duration: '4' }), + note({ keys: ['d/5'], stem_direction: -1, duration: '4' }), + note({ keys: ['g/5'], stem_direction: -1, duration: '4' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '4r' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '4r' }), + ]; + const beam = new _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam(notes.slice(5, 9)); + const tuplet = new _src_tuplet__WEBPACK_IMPORTED_MODULE_7__.Tuplet(notes.slice(9, 12)).setTupletLocation(_src_tuplet__WEBPACK_IMPORTED_MODULE_7__.Tuplet.LOCATION_TOP); + // Set { align_rests: true } to align rests (vertically) with nearby notes in each voice. + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(context, stave, notes, { align_rests: true }); + tuplet.setContext(context).draw(); + beam.setContext(context).draw(); + ok(true, 'Auto Align Rests - Align All Test'); +} +/** + * Multi Voice + * The top voice shows quarter-note chords alternating with quarter rests. + * The bottom voice shows two groups of beamed eighth notes, with eighth rests. + */ +function multiVoice(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 600, 200); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_5__.Stave(50, 10, 500).addClef('treble').setContext(ctx).addTimeSignature('4/4').draw(); + const noteOnStave = (noteStruct) => new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote(noteStruct).setStave(stave); + const notes1 = [ + noteOnStave({ keys: ['c/4', 'e/4', 'g/4'], duration: '4' }), + noteOnStave({ keys: ['b/4'], duration: '4r' }), + noteOnStave({ keys: ['c/4', 'd/4', 'a/4'], duration: '4' }), + noteOnStave({ keys: ['b/4'], duration: '4r' }), + ]; + const notes2 = [ + noteOnStave({ keys: ['e/3'], stem_direction: -1, duration: '8' }), + noteOnStave({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), + noteOnStave({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), + noteOnStave({ keys: ['e/3'], stem_direction: -1, duration: '8' }), + noteOnStave({ keys: ['e/3'], stem_direction: -1, duration: '8' }), + noteOnStave({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), + noteOnStave({ keys: ['e/3'], stem_direction: -1, duration: '8' }), + noteOnStave({ keys: ['e/3'], stem_direction: -1, duration: '8' }), + ]; + const voice1 = new _src_voice__WEBPACK_IMPORTED_MODULE_8__.Voice(_src_flow__WEBPACK_IMPORTED_MODULE_3__.Flow.TIME4_4).addTickables(notes1); + const voice2 = new _src_voice__WEBPACK_IMPORTED_MODULE_8__.Voice(_src_flow__WEBPACK_IMPORTED_MODULE_3__.Flow.TIME4_4).addTickables(notes2); + // Set { align_rests: true } to align rests (vertically) with nearby notes in each voice. + new _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter().joinVoices([voice1, voice2]).formatToStave([voice1, voice2], stave, { align_rests: true }); + const beam2_1 = new _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam(notes2.slice(0, 4)); + const beam2_2 = new _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam(notes2.slice(4, 8)); + // Important Note: we need to draw voice2 first, since voice2 generates ledger lines. + // Otherwise, the ledger lines will be drawn on top of middle C notes in voice1. + voice2.draw(ctx); + voice1.draw(ctx); + beam2_1.setContext(ctx).draw(); + beam2_2.setContext(ctx).draw(); + ok(true, 'Strokes Test Multi Voice'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(RestsTests); + + + +/***/ }), + +/***/ "./tests/rhythm_tests.ts": +/*!*******************************!*\ + !*** ./tests/rhythm_tests.ts ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "RhythmTests": () => (/* binding */ RhythmTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_annotation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/annotation */ "./src/annotation.ts"); +/* harmony import */ var _src_beam__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/beam */ "./src/beam.ts"); +/* harmony import */ var _src_formatter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/formatter */ "./src/formatter.ts"); +/* harmony import */ var _src_stave__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/stave */ "./src/stave.ts"); +/* harmony import */ var _src_stavebarline__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/stavebarline */ "./src/stavebarline.ts"); +/* harmony import */ var _src_stavenote__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/stavenote */ "./src/stavenote.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Rhythm Tests + + + + + + + +const RhythmTests = { + Start() { + QUnit.module('Rhythm'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + // TODO: Simplify test names by removing 'Rhythm Draw - '. + run('Rhythm Draw - slash notes', drawBasic); + run('Rhythm Draw - beamed slash notes', drawBeamedSlashNotes); + run('Rhythm Draw - beamed slash notes, some rests', drawSlashAndBeamAndRests); + run('Rhythm Draw - 16th note rhythm with scratches', drawSixtenthWithScratches); + run('Rhythm Draw - 32nd note rhythm with scratches', drawThirtySecondWithScratches); + }, +}; +// CURRENTLY UNUSED. Draws 7 different slash notes without beams. +/* +function drawSlash(options: TestOptions, contextBuilder: ContextBuilder): void { + const ctx = contextBuilder(options.elementId, 350, 180); + const stave = new Stave(10, 10, 350); + stave.setContext(ctx); + stave.draw(); + + const notes: StaveNoteStruct[] = [ + { keys: ['b/4'], duration: 'ws', stem_direction: -1 }, + { keys: ['b/4'], duration: 'hs', stem_direction: -1 }, + { keys: ['b/4'], duration: 'qs', stem_direction: -1 }, + { keys: ['b/4'], duration: '8s', stem_direction: -1 }, + { keys: ['b/4'], duration: '16s', stem_direction: -1 }, + { keys: ['b/4'], duration: '32s', stem_direction: -1 }, + { keys: ['b/4'], duration: '64s', stem_direction: -1 }, + ]; + expect(notes.length * 2); + + for (let i = 0; i < notes.length; ++i) { + const staveNote = new StaveNote(notes[i]).setStave(stave); + new TickContext() + .addTickable(staveNote) + .preFormat() + .setX((i + 1) * 25); + staveNote.setContext(ctx).draw(); + + ok(staveNote.getX() > 0, 'Note ' + i + ' has X value'); + ok(staveNote.getYs().length > 0, 'Note ' + i + ' has Y values'); + } +} +*/ +function drawBasic(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 800, 150); + // bar 1 + const staveBar1 = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(10, 30, 150); + staveBar1.setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.DOUBLE); + staveBar1.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.SINGLE); + staveBar1.addClef('treble'); + staveBar1.addTimeSignature('4/4'); + staveBar1.addKeySignature('C'); + staveBar1.setContext(ctx).draw(); + const notesBar1 = [new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ keys: ['b/4'], duration: '1s', stem_direction: -1 })]; + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_3__.Formatter.FormatAndDraw(ctx, staveBar1, notesBar1); + // bar 2 - juxtaposing second bar next to first bar + const staveBar2 = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(staveBar1.getWidth() + staveBar1.getX(), staveBar1.getY(), 120); + staveBar2.setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.SINGLE); + staveBar2.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.SINGLE); + staveBar2.setContext(ctx).draw(); + // bar 2 + const notesBar2 = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ keys: ['b/4'], duration: '2s', stem_direction: -1 }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ keys: ['b/4'], duration: '2s', stem_direction: -1 }), + ]; + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_3__.Formatter.FormatAndDraw(ctx, staveBar2, notesBar2); + // bar 3 - juxtaposing second bar next to first bar + const staveBar3 = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(staveBar2.getWidth() + staveBar2.getX(), staveBar2.getY(), 170); + staveBar3.setContext(ctx).draw(); + // bar 3 + const notesBar3 = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '4s', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '4s', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '4s', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '4s', + stem_direction: -1, + }), + ]; + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_3__.Formatter.FormatAndDraw(ctx, staveBar3, notesBar3); + // bar 4 - juxtaposing second bar next to first bar + const staveBar4 = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(staveBar3.getWidth() + staveBar3.getX(), staveBar3.getY(), 200); + staveBar4.setContext(ctx).draw(); + // bar 4 + const notesBar4 = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + ]; + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_3__.Formatter.FormatAndDraw(ctx, staveBar4, notesBar4); + expect(0); +} +function drawBeamedSlashNotes(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 800, 150); + // bar 1 + const staveBar1 = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(10, 30, 300); + staveBar1.setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.DOUBLE); + staveBar1.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.SINGLE); + staveBar1.addClef('treble'); + staveBar1.addTimeSignature('4/4'); + staveBar1.addKeySignature('C'); + staveBar1.setContext(ctx).draw(); + // bar 4 + const notesBar1_part1 = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + ]; + const notesBar1_part2 = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + ]; + // create the beams for 8th notes in 2nd measure + const beam1 = new _src_beam__WEBPACK_IMPORTED_MODULE_2__.Beam(notesBar1_part1); + const beam2 = new _src_beam__WEBPACK_IMPORTED_MODULE_2__.Beam(notesBar1_part2); + const notesBar1 = notesBar1_part1.concat(notesBar1_part2); + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_3__.Formatter.FormatAndDraw(ctx, staveBar1, notesBar1); + // Render beams + beam1.setContext(ctx).draw(); + beam2.setContext(ctx).draw(); + expect(0); +} +function drawSlashAndBeamAndRests(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 800, 150); + // bar 1 + const staveBar1 = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(10, 30, 300); + staveBar1.setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.DOUBLE); + staveBar1.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.SINGLE); + staveBar1.addClef('treble'); + staveBar1.addTimeSignature('4/4'); + staveBar1.addKeySignature('F'); + staveBar1.setContext(ctx).draw(); + // bar 1 + const notesBar1_part1 = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ keys: ['b/4'], duration: '8s', stem_direction: -1 }), + ]; + notesBar1_part1[0].addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation('C7').setFont('Times', _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.Font.size + 2), 0); + const notesBar1_part2 = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '8r', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '8r', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '8r', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + ]; + // create the beams for 8th notes in 2nd measure + const beam1 = new _src_beam__WEBPACK_IMPORTED_MODULE_2__.Beam(notesBar1_part1); + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_3__.Formatter.FormatAndDraw(ctx, staveBar1, notesBar1_part1.concat(notesBar1_part2)); + // Render beams + beam1.setContext(ctx).draw(); + // bar 2 - juxtaposing second bar next to first bar + const staveBar2 = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(staveBar1.getWidth() + staveBar1.getX(), staveBar1.getY(), 220); + staveBar2.setContext(ctx).draw(); + const notesBar2 = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '1s', + stem_direction: -1, + }), + ]; + notesBar2[0].addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation('F').setFont('Times', _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.Font.size + 2), 0); + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_3__.Formatter.FormatAndDraw(ctx, staveBar2, notesBar2); + expect(0); +} +function drawSixtenthWithScratches(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 800, 150); + // bar 1 + const staveBar1 = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(10, 30, 300); + staveBar1.setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.DOUBLE); + staveBar1.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.SINGLE); + staveBar1.addClef('treble'); + staveBar1.addTimeSignature('4/4'); + staveBar1.addKeySignature('F'); + staveBar1.setContext(ctx).draw(); + // bar 1 + const notesBar1_part1 = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '16s', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '16s', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '16m', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '16s', + stem_direction: -1, + }), + ]; + const notesBar1_part2 = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '16m', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '16s', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '16r', + stem_direction: -1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '16s', + stem_direction: -1, + }), + ]; + notesBar1_part1[0].addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation('C7').setFont('Times', _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.Font.size + 3), 0); + // create the beams for 8th notes in 2nd measure + const beam1 = new _src_beam__WEBPACK_IMPORTED_MODULE_2__.Beam(notesBar1_part1); + const beam2 = new _src_beam__WEBPACK_IMPORTED_MODULE_2__.Beam(notesBar1_part2); + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_3__.Formatter.FormatAndDraw(ctx, staveBar1, notesBar1_part1.concat(notesBar1_part2)); + // Render beams + beam1.setContext(ctx).draw(); + beam2.setContext(ctx).draw(); + expect(0); +} +function drawThirtySecondWithScratches(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 800, 150); + // bar 1 + const staveBar1 = new _src_stave__WEBPACK_IMPORTED_MODULE_4__.Stave(10, 30, 300); + staveBar1.setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.DOUBLE); + staveBar1.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.SINGLE); + staveBar1.addClef('treble'); + staveBar1.addTimeSignature('4/4'); + staveBar1.addKeySignature('F'); + staveBar1.setContext(ctx).draw(); + // bar 1 + const notesBar1_part1 = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '32s', + stem_direction: 1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '32s', + stem_direction: 1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '32m', + stem_direction: 1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '32s', + stem_direction: 1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '32m', + stem_direction: 1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '32s', + stem_direction: 1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '32r', + stem_direction: 1, + }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_6__.StaveNote({ + keys: ['b/4'], + duration: '32s', + stem_direction: 1, + }), + ]; + notesBar1_part1[0].addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation('C7').setFont('Times', _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.Font.size + 3), 0); + // Create the beams for 8th notes in 2nd measure. + const beam1 = new _src_beam__WEBPACK_IMPORTED_MODULE_2__.Beam(notesBar1_part1); + // Helper function to justify and draw a 4/4 voice. + _src_formatter__WEBPACK_IMPORTED_MODULE_3__.Formatter.FormatAndDraw(ctx, staveBar1, notesBar1_part1); + // Render beams + beam1.setContext(ctx).draw(); + expect(0); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(RhythmTests); + + + +/***/ }), + +/***/ "./tests/stave_tests.ts": +/*!******************************!*\ + !*** ./tests/stave_tests.ts ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StaveTests": () => (/* binding */ StaveTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_accidental__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/accidental */ "./src/accidental.ts"); +/* harmony import */ var _src_beam__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/beam */ "./src/beam.ts"); +/* harmony import */ var _src_clef__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/clef */ "./src/clef.ts"); +/* harmony import */ var _src_formatter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/formatter */ "./src/formatter.ts"); +/* harmony import */ var _src_keysignature__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/keysignature */ "./src/keysignature.ts"); +/* harmony import */ var _src_modifier__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/modifier */ "./src/modifier.ts"); +/* harmony import */ var _src_stave__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/stave */ "./src/stave.ts"); +/* harmony import */ var _src_stavebarline__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/stavebarline */ "./src/stavebarline.ts"); +/* harmony import */ var _src_stavenote__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/stavenote */ "./src/stavenote.ts"); +/* harmony import */ var _src_staverepetition__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/staverepetition */ "./src/staverepetition.ts"); +/* harmony import */ var _src_stavevolta__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/stavevolta */ "./src/stavevolta.ts"); +/* harmony import */ var _src_textnote__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../src/textnote */ "./src/textnote.ts"); +/* harmony import */ var _src_timesignature__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../src/timesignature */ "./src/timesignature.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Basic Stave Tests +// TODO: Like Stave.setTempo(t: StaveTempoOptions, ...), Stave.setText(...) could declare an interface called StaveTextOptions. +// This helps developers because they can use the named type in their code for type checking. + + + + + + + + + + + + + + +const StaveTests = { + Start() { + QUnit.module('Stave'); + test('StaveModifiers SortByCategory', sortByCategory); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Stave Draw Test', draw); + run('Open Stave Draw Test', drawOpenStave); + run('Multiple Stave Barline Test', drawMultipleMeasures); + run('Multiple Stave Barline Test (14pt Section)', drawMultipleMeasures, { fontSize: 14 }); + run('Multiple Stave Repeats Test', drawRepeats); + run('Stave End Modifiers Test', drawEndModifiers); + run('Stave Repetition (CODA) Positioning', drawStaveRepetition, { yShift: 0 }); + run('Stave Repetition (CODA) Positioning (-20)', drawStaveRepetition, { yShift: -20 }); + run('Stave Repetition (CODA) Positioning (+10)', drawStaveRepetition, { yShift: +10 }); + run('Multiple Staves Volta Test', drawVolta); + run('Volta + Modifier Measure Test', drawVoltaModifier); + run('Tempo Test', drawTempo); + run('Single Line Configuration Test', configureSingleLine); + run('Batch Line Configuration Test', configureAllLines); + run('Stave Text Test', drawStaveText); + run('Multiple Line Stave Text Test', drawStaveTextMultiLine); + run('Factory API', factoryAPI); + }, +}; +function sortByCategory() { + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(0, 0, 300); + const clef0 = new _src_clef__WEBPACK_IMPORTED_MODULE_3__.Clef('treble'); + const clef1 = new _src_clef__WEBPACK_IMPORTED_MODULE_3__.Clef('alto'); + const clef2 = new _src_clef__WEBPACK_IMPORTED_MODULE_3__.Clef('bass'); + const time0 = new _src_timesignature__WEBPACK_IMPORTED_MODULE_13__.TimeSignature('C'); + const time1 = new _src_timesignature__WEBPACK_IMPORTED_MODULE_13__.TimeSignature('C|'); + const time2 = new _src_timesignature__WEBPACK_IMPORTED_MODULE_13__.TimeSignature('9/8'); + const key0 = new _src_keysignature__WEBPACK_IMPORTED_MODULE_5__.KeySignature('G'); + const key1 = new _src_keysignature__WEBPACK_IMPORTED_MODULE_5__.KeySignature('F'); + const key2 = new _src_keysignature__WEBPACK_IMPORTED_MODULE_5__.KeySignature('D'); + const bar0 = new _src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.Barline(_src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.SINGLE); + const bar1 = new _src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.Barline(_src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.DOUBLE); + const bar2 = new _src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.Barline(_src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.NONE); + // const order0 = { barlines: 0, clefs: 1, keysignatures: 2, timesignatures: 3 }; + // const order1 = { timesignatures: 0, keysignatures: 1, barlines: 2, clefs: 3 }; + const order0 = { Barline: 0, Clef: 1, KeySignature: 2, TimeSignature: 3 }; + const order1 = { TimeSignature: 0, KeySignature: 1, Barline: 2, Clef: 3 }; + const sortAndCompare = (title, a, b, order) => { + stave.sortByCategory(a, order); + // Verify that the two arrays are identical. + let isSame = true; + if (a.length !== b.length) + isSame = false; + for (let i = 0; i < a.length; ++i) { + if (a[i] !== b[i]) + isSame = false; + } + ok(isSame, title); + }; + sortAndCompare('Keep the original order 1', [bar0, bar1, clef0, clef1, key0, key1, time0, time1], [bar0, bar1, clef0, clef1, key0, key1, time0, time1], order0); + sortAndCompare('Keep the original order 2', [time0, time1, key0, key1, bar0, bar1, clef0, clef1], [time0, time1, key0, key1, bar0, bar1, clef0, clef1], order1); + sortAndCompare('Sort and keep 1', [bar0, bar1, clef0, clef1, key0, key1, time0, time1], [time0, time1, key0, key1, bar0, bar1, clef0, clef1], order1); + sortAndCompare('Sort and keep 2', [bar0, clef0, key0, time0, key1, time1, clef1, bar1, time2, clef2, bar2, key2], [bar0, bar1, bar2, clef0, clef1, clef2, key0, key1, key2, time0, time1, time2], order0); + sortAndCompare('Sort and keep 3', [bar2, clef2, key2, time0, key0, time2, clef1, bar1, time1, clef0, bar0, key1], [time0, time2, time1, key2, key0, key1, bar2, bar1, bar0, clef2, clef1, clef0], order1); +} +function draw(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 150); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(10, 10, 300); + stave.setContext(ctx); + stave.draw(); + equal(stave.getYForNote(0), 100, 'getYForNote(0)'); + equal(stave.getYForLine(5), 100, 'getYForLine(5)'); + equal(stave.getYForLine(0), 50, 'getYForLine(0) - Top Line'); + equal(stave.getYForLine(4), 90, 'getYForLine(4) - Bottom Line'); + ok(true, 'all pass'); +} +function drawOpenStave(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 350); + let stave = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(10, 10, 300, { left_bar: false }); + stave.setContext(ctx); + stave.draw(); + stave = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(10, 150, 300, { right_bar: false }); + stave.setContext(ctx); + stave.draw(); + ok(true, 'all pass'); +} +function drawMultipleMeasures(options, contextBuilder) { + var _a, _b; + expect(0); + // Get the rendering context + const ctx = contextBuilder(options.elementId, 550, 200); + // bar 1 + const staveBar1 = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(10, 50, 200); + staveBar1.setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.REPEAT_BEGIN); + staveBar1.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.DOUBLE); + staveBar1.setSection('A', 0, 0, (_a = options.params) === null || _a === void 0 ? void 0 : _a.fontSize); + staveBar1.addClef('treble').setContext(ctx).draw(); + const notesBar1 = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['c/4'], duration: 'q' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['d/4'], duration: 'q' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['b/4'], duration: 'qr' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: 'q' }), + ]; + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, staveBar1, notesBar1); + // bar 2 - juxtaposing second bar next to first bar + const staveBar2 = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(staveBar1.getWidth() + staveBar1.getX(), staveBar1.getY(), 300); + staveBar2.setSection('B', 0, 0, (_b = options.params) === null || _b === void 0 ? void 0 : _b.fontSize); + staveBar2.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.END); + staveBar2.setContext(ctx).draw(); + const notesBar2_part1 = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['c/4'], duration: '8' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['d/4'], duration: '8' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['g/4'], duration: '8' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['e/4'], duration: '8' }), + ]; + const notesBar2_part2 = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['c/4'], duration: '8' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['d/4'], duration: '8' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['g/4'], duration: '8' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['e/4'], duration: '8' }), + ]; + // create the beams for 8th notes in 2nd measure + const beam1 = new _src_beam__WEBPACK_IMPORTED_MODULE_2__.Beam(notesBar2_part1); + const beam2 = new _src_beam__WEBPACK_IMPORTED_MODULE_2__.Beam(notesBar2_part2); + const notesBar2 = notesBar2_part1.concat(notesBar2_part2); + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, staveBar2, notesBar2); + // Render beams + beam1.setContext(ctx).draw(); + beam2.setContext(ctx).draw(); +} +function drawRepeats(options, contextBuilder) { + expect(0); + // Get the rendering context + const ctx = contextBuilder(options.elementId, 750, 120); + // bar 1 + const staveBar1 = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(10, 0, 250); + staveBar1.setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.REPEAT_BEGIN); + staveBar1.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.REPEAT_END); + staveBar1.addClef('treble'); + staveBar1.addKeySignature('A'); + staveBar1.setContext(ctx).draw(); + const notesBar1 = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['c/4'], duration: 'q' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['d/4'], duration: 'q' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['b/4'], duration: 'qr' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: 'q' }), + ]; + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, staveBar1, notesBar1); + // bar 2 - juxtaposing second bar next to first bar + const staveBar2 = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(staveBar1.getWidth() + staveBar1.getX(), staveBar1.getY(), 250); + staveBar2.setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.REPEAT_BEGIN); + staveBar2.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.REPEAT_END); + staveBar2.setContext(ctx).draw(); + const notesBar2_part1 = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['c/4'], duration: '8' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['d/4'], duration: '8' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['g/4'], duration: '8' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['e/4'], duration: '8' }), + ]; + const notesBar2_part2 = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['c/4'], duration: '8' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['d/4'], duration: '8' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['g/4'], duration: '8' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['e/4'], duration: '8' }), + ]; + notesBar2_part2[0].addModifier(new _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental('#'), 0); + notesBar2_part2[1].addModifier(new _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental('#'), 0); + notesBar2_part2[3].addModifier(new _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental('b'), 0); + // create the beams for 8th notes in 2nd measure + const beam1 = new _src_beam__WEBPACK_IMPORTED_MODULE_2__.Beam(notesBar2_part1); + const beam2 = new _src_beam__WEBPACK_IMPORTED_MODULE_2__.Beam(notesBar2_part2); + const notesBar2 = notesBar2_part1.concat(notesBar2_part2); + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, staveBar2, notesBar2); + // Render beams + beam1.setContext(ctx).draw(); + beam2.setContext(ctx).draw(); + // bar 3 - juxtaposing third bar next to second bar + const staveBar3 = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(staveBar2.getWidth() + staveBar2.getX(), staveBar2.getY(), 50); + staveBar3.setContext(ctx).draw(); + const notesBar3 = [new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['d/5'], duration: 'wr' })]; + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, staveBar3, notesBar3); + // bar 4 - juxtaposing third bar next to third bar + const staveBar4 = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(staveBar3.getWidth() + staveBar3.getX(), staveBar3.getY(), 250 - staveBar1.getModifierXShift()); + staveBar4.setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.REPEAT_BEGIN); + staveBar4.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.REPEAT_END); + staveBar4.setContext(ctx).draw(); + const notesBar4 = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['c/4'], duration: 'q' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['d/4'], duration: 'q' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['b/4'], duration: 'qr' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: 'q' }), + ]; + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, staveBar4, notesBar4); +} +function drawEndModifiers(options, contextBuilder) { + expect(0); + const staveWidth = 230; + const blockHeight = 80; + let x = 10; + let y = 0; + const ctx = contextBuilder(options.elementId, 800, 700); + function drawStavesInTwoLines(endBarLine) { + // Draw a stave with one measure. Change the ending modifiers. + // eslint-disable-next-line + function drawStave(x, y, width, begMods, endMods) { + const staveBar = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(x, y, width - 10); + if (begMods) { + if (begMods.barLine !== undefined) { + staveBar.setBegBarType(begMods.barLine); + } + if (begMods.clef !== undefined) { + staveBar.addClef(begMods.clef); + } + if (begMods.keySig !== undefined) { + staveBar.addKeySignature(begMods.keySig); + } + if (begMods.timeSig !== undefined) { + staveBar.setTimeSignature(begMods.timeSig); + } + } + if (endMods) { + if (endMods.barLine !== undefined) { + staveBar.setEndBarType(endMods.barLine); + } + if (endMods.clef !== undefined) { + staveBar.addEndClef(endMods.clef); + } + if (endMods.keySig !== undefined) { + staveBar.setEndKeySignature(endMods.keySig); + } + if (endMods.timeSig !== undefined) { + staveBar.setEndTimeSignature(endMods.timeSig); + } + } + staveBar.setContext(ctx).draw(); + const notesBar = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['c/4'], duration: 'q' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['d/4'], duration: 'q' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['b/4'], duration: 'qr' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: 'q' }), + ]; + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, staveBar, notesBar); + } + drawStave(x, y, staveWidth + 50, { barLine: _src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.REPEAT_BEGIN, clef: 'treble', keySig: 'A' }, { barLine: endBarLine, clef: 'bass' }); + x += staveWidth + 50; + drawStave(x, y, staveWidth, { barLine: _src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.REPEAT_BEGIN }, { barLine: endBarLine, keySig: 'E' }); + x += staveWidth; + drawStave(x, y, staveWidth, { barLine: _src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.REPEAT_BEGIN }, { barLine: endBarLine, timeSig: '2/4' }); + x += staveWidth; + x = 10; + y += blockHeight; + drawStave(x, y, staveWidth, { barLine: _src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.REPEAT_BEGIN }, { barLine: endBarLine, clef: 'bass', timeSig: '2/4' }); + x += staveWidth; + drawStave(x, y, staveWidth, { barLine: _src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.REPEAT_BEGIN }, { barLine: endBarLine, clef: 'treble', keySig: 'Ab' }); + x += staveWidth; + drawStave(x, y, staveWidth, { barLine: _src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.REPEAT_BEGIN }, { barLine: endBarLine, clef: 'bass', keySig: 'Ab', timeSig: '2/4' }); + x += staveWidth; + } + y = 0; + x = 10; + // First pair of staves. + drawStavesInTwoLines(_src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.SINGLE); + y += blockHeight + 10; + x = 10; + // Second pair of staves, with double barlines. + drawStavesInTwoLines(_src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.DOUBLE); + y += blockHeight + 10; + x = 10; + // Third pair of staves, with "two dot" repeat barlines. + drawStavesInTwoLines(_src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.REPEAT_END); + y += blockHeight + 10; + x = 10; + // Fourth pair of staves, with "two dots" on each side of the barlines. + drawStavesInTwoLines(_src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.REPEAT_BOTH); +} +function drawStaveRepetition(options, contextBuilder) { + expect(0); + // Get the rendering context + const ctx = contextBuilder(options.elementId, 725, 200); + // bar 1 + const mm1 = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(10, 50, 150); + mm1.addClef('treble'); + mm1.setRepetitionType(_src_staverepetition__WEBPACK_IMPORTED_MODULE_10__.Repetition.type.DS_AL_FINE, options.params.yShift); + mm1.setMeasure(1); + mm1.setContext(ctx).draw(); + const notesmm1 = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['a/4'], duration: 'q' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['f/4'], duration: 'q' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['f/4'], duration: 'q' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['a/4'], duration: 'q' }), + ]; + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, mm1, notesmm1); + // bar 2 - juxtapose second measure + const mm2 = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(mm1.getWidth() + mm1.getX(), mm1.getY(), 150); + mm2.setRepetitionType(_src_staverepetition__WEBPACK_IMPORTED_MODULE_10__.Repetition.type.TO_CODA, options.params.yShift); + mm2.setMeasure(2); + mm2.setContext(ctx).draw(); + const notesmm2 = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['a/4'], duration: 'q' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['f/4'], duration: 'q' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['f/4'], duration: 'q' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['a/4'], duration: 'q' }), + ]; + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, mm2, notesmm2); + // bar 3 - juxtapose third measure + const mm3 = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(mm2.getWidth() + mm2.getX(), mm1.getY(), 150); + mm3.setRepetitionType(_src_staverepetition__WEBPACK_IMPORTED_MODULE_10__.Repetition.type.DS_AL_CODA, options.params.yShift); + mm3.setMeasure(3); + mm3.setContext(ctx).draw(); + const notesmm3 = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['a/4'], duration: 'q' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['f/4'], duration: 'q' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['f/4'], duration: 'q' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['a/4'], duration: 'q' }), + ]; + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, mm3, notesmm3); + // bar 4 - juxtapose fourth measure + const mm4 = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(mm3.getWidth() + mm3.getX(), mm1.getY(), 150); + mm4.setRepetitionType(_src_staverepetition__WEBPACK_IMPORTED_MODULE_10__.Repetition.type.CODA_LEFT, options.params.yShift); + mm4.setMeasure(4); + mm4.setContext(ctx).draw(); + const notesmm4 = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['a/4'], duration: 'q' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['f/4'], duration: 'q' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['f/4'], duration: 'q' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['a/4'], duration: 'q' }), + ]; + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, mm4, notesmm4); +} +function drawVolta(options, contextBuilder) { + expect(0); + // Get the rendering context + const ctx = contextBuilder(options.elementId, 725, 200); + // bar 1 + const mm1 = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(10, 50, 125); + mm1.setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.REPEAT_BEGIN); + mm1.setRepetitionType(_src_staverepetition__WEBPACK_IMPORTED_MODULE_10__.Repetition.type.SEGNO_LEFT); + mm1.addClef('treble'); + mm1.addKeySignature('A'); + mm1.setMeasure(1); + mm1.setSection('A', 0); + mm1.setContext(ctx).draw(); + const notesmm1 = [new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['c/4'], duration: 'w' })]; + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, mm1, notesmm1); + // bar 2 - juxtapose second measure + const mm2 = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(mm1.getWidth() + mm1.getX(), mm1.getY(), 60); + mm2.setRepetitionType(_src_staverepetition__WEBPACK_IMPORTED_MODULE_10__.Repetition.type.CODA_RIGHT); + mm2.setMeasure(2); + mm2.setContext(ctx).draw(); + const notesmm2 = [new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['d/4'], duration: 'w' })]; + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, mm2, notesmm2); + // bar 3 - juxtapose third measure + const mm3 = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(mm2.getWidth() + mm2.getX(), mm1.getY(), 60); + mm3.setVoltaType(_src_stavevolta__WEBPACK_IMPORTED_MODULE_11__.VoltaType.BEGIN, '1.', -5); + mm3.setMeasure(3); + mm3.setContext(ctx).draw(); + const notesmm3 = [new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['e/4'], duration: 'w' })]; + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, mm3, notesmm3); + // bar 4 - juxtapose fourth measure + const mm4 = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(mm3.getWidth() + mm3.getX(), mm1.getY(), 60); + mm4.setVoltaType(_src_stavevolta__WEBPACK_IMPORTED_MODULE_11__.VoltaType.MID, '', -5); + mm4.setMeasure(4); + mm4.setContext(ctx).draw(); + const notesmm4 = [new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['f/4'], duration: 'w' })]; + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, mm4, notesmm4); + // bar 5 - juxtapose fifth measure + const mm5 = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(mm4.getWidth() + mm4.getX(), mm1.getY(), 60); + mm5.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.REPEAT_END); + mm5.setVoltaType(_src_stavevolta__WEBPACK_IMPORTED_MODULE_11__.VoltaType.END, '', -5); + mm5.setMeasure(5); + mm5.setContext(ctx).draw(); + const notesmm5 = [new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['g/4'], duration: 'w' })]; + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, mm5, notesmm5); + // bar 6 - juxtapose sixth measure + const mm6 = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(mm5.getWidth() + mm5.getX(), mm1.getY(), 60); + mm6.setVoltaType(_src_stavevolta__WEBPACK_IMPORTED_MODULE_11__.VoltaType.BEGIN_END, '2.', -5); + mm6.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.DOUBLE); + mm6.setMeasure(6); + mm6.setContext(ctx).draw(); + const notesmm6 = [new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['a/4'], duration: 'w' })]; + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, mm6, notesmm6); + // bar 7 - juxtapose seventh measure + const mm7 = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(mm6.getWidth() + mm6.getX(), mm1.getY(), 60); + mm7.setMeasure(7); + mm7.setSection('B', 0); + mm7.setContext(ctx).draw(); + const notesmm7 = [new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['b/4'], duration: 'w' })]; + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, mm7, notesmm7); + // bar 8 - juxtapose eighth measure + const mm8 = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(mm7.getWidth() + mm7.getX(), mm1.getY(), 60); + mm8.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.DOUBLE); + mm8.setRepetitionType(_src_staverepetition__WEBPACK_IMPORTED_MODULE_10__.Repetition.type.DS_AL_CODA); + mm8.setMeasure(8); + mm8.setContext(ctx).draw(); + const notesmm8 = [new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['c/5'], duration: 'w' })]; + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, mm8, notesmm8); + // bar 9 - juxtapose ninth measure + const mm9 = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(mm8.getWidth() + mm8.getX() + 20, mm1.getY(), 125); + mm9.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.END); + mm9.setRepetitionType(_src_staverepetition__WEBPACK_IMPORTED_MODULE_10__.Repetition.type.CODA_LEFT); + mm9.addClef('treble'); + mm9.addKeySignature('A'); + mm9.setMeasure(9); + mm9.setContext(ctx).draw(); + const notesmm9 = [new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['d/5'], duration: 'w' })]; + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, mm9, notesmm9); +} +function drawVoltaModifier(options, contextBuilder) { + expect(0); + // Get the rendering context + const ctx = contextBuilder(options.elementId, 1100, 200); + // bar 1: volta begin, with modifiers (clef, keysignature) + const mm1 = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(10, 50, 175); + mm1.setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.REPEAT_BEGIN); + mm1.setVoltaType(_src_stavevolta__WEBPACK_IMPORTED_MODULE_11__.VoltaType.BEGIN_END, '1.', -5); + mm1.addClef('treble'); + mm1.addKeySignature('A'); + mm1.setMeasure(1); + mm1.setSection('A', 0); + mm1.setContext(ctx).draw(); + const notesmm1 = [new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['c/4'], duration: 'w' })]; + // Helper function to justify and draw a 4/4 voice + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, mm1, notesmm1); + // bar 2: volta begin_mid, with modifiers (clef, keysignature) + const mm2 = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(mm1.getX() + mm1.getWidth(), mm1.getY(), 175); + mm2.setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.REPEAT_BEGIN); + mm2.setRepetitionType(_src_staverepetition__WEBPACK_IMPORTED_MODULE_10__.Repetition.type.DS); + mm2.setVoltaType(_src_stavevolta__WEBPACK_IMPORTED_MODULE_11__.VoltaType.BEGIN, '2.', -5); + mm2.addClef('treble'); + mm2.addKeySignature('A'); + mm2.setMeasure(2); + mm2.setContext(ctx).draw(); + const notesmm2 = [new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['c/4'], duration: 'w' })]; + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, mm2, notesmm2); + // bar 3: volta mid, with modifiers (clef, keysignature) + const mm3 = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(mm2.getX() + mm2.getWidth(), mm2.getY(), 175); + mm3.setVoltaType(_src_stavevolta__WEBPACK_IMPORTED_MODULE_11__.VoltaType.MID, '', -5); + mm3.setRepetitionType(_src_staverepetition__WEBPACK_IMPORTED_MODULE_10__.Repetition.type.DS); + mm3.addClef('treble'); + mm3.addKeySignature('B'); + mm3.setMeasure(3); + mm3.setSection('B', 0); + mm3.setContext(ctx).draw(); + const notesmm3 = [new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['c/4'], duration: 'w' })]; + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, mm3, notesmm3); + // bar 4: volta end, with modifiers (clef, keysignature) + const mm4 = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(mm3.getX() + mm3.getWidth(), mm3.getY(), 175); + mm4.setVoltaType(_src_stavevolta__WEBPACK_IMPORTED_MODULE_11__.VoltaType.END, '1.', -5); + mm4.setRepetitionType(_src_staverepetition__WEBPACK_IMPORTED_MODULE_10__.Repetition.type.DS); + mm4.addClef('treble'); + mm4.addKeySignature('A'); + mm4.setMeasure(4); + mm4.setSection('C', 0); + mm4.setContext(ctx).draw(); + const notesmm4 = [new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['c/4'], duration: 'w' })]; + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, mm4, notesmm4); + // bar 5: d.s. shift (similar potential x-shift concern) + const mm5 = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(mm4.getX() + mm4.getWidth(), mm4.getY(), 175); + // mm5.addModifier(new Repetition(Repetition.type.DS, mm4.getX() + mm4.getWidth(), 50), StaveModifierPosition.RIGHT); + mm5.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_8__.BarlineType.DOUBLE); + mm5.setRepetitionType(_src_staverepetition__WEBPACK_IMPORTED_MODULE_10__.Repetition.type.DS); + mm5.addClef('treble'); + mm5.addKeySignature('A'); + mm5.setMeasure(5); + mm5.setSection('D', 0); + mm5.setContext(ctx).draw(); + const notesmm5 = [new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['c/4'], duration: 'w' })]; + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, mm5, notesmm5); + // bar 6: d.s. without modifiers + const mm6 = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(mm5.getX() + mm5.getWidth(), mm5.getY(), 175); + // mm5.addModifier(new Repetition(Repetition.type.DS, mm4.getX() + mm4.getWidth(), 50), StaveModifierPosition.RIGHT); + mm6.setRepetitionType(_src_staverepetition__WEBPACK_IMPORTED_MODULE_10__.Repetition.type.DS); + mm6.setMeasure(6); + mm6.setSection('E', 0); + mm6.setContext(ctx).draw(); + const notesmm6 = [new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['c/4'], duration: 'w' })]; + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, mm6, notesmm6); +} +function drawTempo(options, contextBuilder) { + expect(0); + const ctx = contextBuilder(options.elementId, 725, 350); + const padding = 10; + let x = 0; + let y = 50; + function drawTempoStaveBar(width, tempo, tempo_y, notes) { + const staveBar = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(padding + x, y, width); + if (x === 0) + staveBar.addClef('treble'); + staveBar.setTempo(tempo, tempo_y); + staveBar.setContext(ctx).draw(); + const notesBar = notes || [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['c/4'], duration: 'q' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['d/4'], duration: 'q' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['b/4'], duration: 'q' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['c/4'], duration: 'q' }), + ]; + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, staveBar, notesBar); + x += width; + } + drawTempoStaveBar(120, { duration: 'q', dots: 1, bpm: 80 }, 0); + drawTempoStaveBar(100, { duration: '8', dots: 2, bpm: 90 }, 0); + drawTempoStaveBar(100, { duration: '16', dots: 1, bpm: 96 }, 0); + drawTempoStaveBar(100, { duration: '32', bpm: 70 }, 0); + drawTempoStaveBar(250, { name: 'Andante', bpm: 120 }, -20, [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['c/4'], duration: '8' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['d/4'], duration: '8' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['g/4'], duration: '8' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['e/5'], duration: '8' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['c/4'], duration: '8' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['d/4'], duration: '8' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['g/4'], duration: '8' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['e/4'], duration: '8' }), + ]); + x = 0; + y += 150; + drawTempoStaveBar(120, { duration: 'w', bpm: 80 }, 0); + drawTempoStaveBar(100, { duration: 'h', bpm: 90 }, 0); + drawTempoStaveBar(100, { duration: 'q', bpm: 96 }, 0); + drawTempoStaveBar(100, { duration: '8', bpm: 70 }, 0); + drawTempoStaveBar(250, { name: 'Andante grazioso' }, 0, [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['c/4'], duration: '8' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['d/4'], duration: '8' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['g/4'], duration: '8' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['e/4'], duration: '8' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['c/4'], duration: '8' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['d/4'], duration: '8' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['g/4'], duration: '8' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_9__.StaveNote({ keys: ['e/4'], duration: '8' }), + ]); +} +function configureSingleLine(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 120); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(10, 10, 300); + stave + .setConfigForLine(0, { visible: true }) + .setConfigForLine(1, { visible: false }) + .setConfigForLine(2, { visible: true }) + .setConfigForLine(3, { visible: false }) + .setConfigForLine(4, { visible: true }); + stave.setContext(ctx).draw(); + const config = stave.getConfigForLines(); + equal(config[0].visible, true, 'getLinesConfiguration() - Line 0'); + equal(config[1].visible, false, 'getLinesConfiguration() - Line 1'); + equal(config[2].visible, true, 'getLinesConfiguration() - Line 2'); + equal(config[3].visible, false, 'getLinesConfiguration() - Line 3'); + equal(config[4].visible, true, 'getLinesConfiguration() - Line 4'); + ok(true, 'all pass'); +} +function configureAllLines(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 120); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(10, 10, 300); + stave + .setConfigForLines([{ visible: false }, {}, { visible: false }, { visible: true }, { visible: false }]) + .setContext(ctx) + .draw(); + const config = stave.getConfigForLines(); + equal(config[0].visible, false, 'getLinesConfiguration() - Line 0'); + equal(config[1].visible, true, 'getLinesConfiguration() - Line 1'); + equal(config[2].visible, false, 'getLinesConfiguration() - Line 2'); + equal(config[3].visible, true, 'getLinesConfiguration() - Line 3'); + equal(config[4].visible, false, 'getLinesConfiguration() - Line 4'); + ok(true, 'all pass'); +} +function drawStaveText(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 900, 140); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(300, 10, 300); + stave.setText('Violin', _src_modifier__WEBPACK_IMPORTED_MODULE_6__.Modifier.Position.LEFT); + stave.setText('Right Text', _src_modifier__WEBPACK_IMPORTED_MODULE_6__.Modifier.Position.RIGHT); + stave.setText('Above Text', _src_modifier__WEBPACK_IMPORTED_MODULE_6__.Modifier.Position.ABOVE); + stave.setText('Below Text', _src_modifier__WEBPACK_IMPORTED_MODULE_6__.Modifier.Position.BELOW); + stave.setContext(ctx).draw(); + ok(true, 'all pass'); +} +function drawStaveTextMultiLine(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 900, 200); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_7__.Stave(300, 40, 300); + stave.setText('Violin', _src_modifier__WEBPACK_IMPORTED_MODULE_6__.Modifier.Position.LEFT, { shift_y: -10 }); + stave.setText('2nd line', _src_modifier__WEBPACK_IMPORTED_MODULE_6__.Modifier.Position.LEFT, { shift_y: 10 }); + stave.setText('Right Text', _src_modifier__WEBPACK_IMPORTED_MODULE_6__.Modifier.Position.RIGHT, { shift_y: -10 }); + stave.setText('2nd line', _src_modifier__WEBPACK_IMPORTED_MODULE_6__.Modifier.Position.RIGHT, { shift_y: 10 }); + stave.setText('Above Text', _src_modifier__WEBPACK_IMPORTED_MODULE_6__.Modifier.Position.ABOVE, { shift_y: -10 }); + stave.setText('2nd line', _src_modifier__WEBPACK_IMPORTED_MODULE_6__.Modifier.Position.ABOVE, { shift_y: 10 }); + stave.setText('Left Below Text', _src_modifier__WEBPACK_IMPORTED_MODULE_6__.Modifier.Position.BELOW, { shift_y: -10, justification: _src_textnote__WEBPACK_IMPORTED_MODULE_12__.Justification.LEFT }); + stave.setText('Right Below Text', _src_modifier__WEBPACK_IMPORTED_MODULE_6__.Modifier.Position.BELOW, { shift_y: 10, justification: _src_textnote__WEBPACK_IMPORTED_MODULE_12__.Justification.RIGHT }); + stave.setContext(ctx).draw(); + ok(true, 'all pass'); +} +function factoryAPI(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 900, 200); + const stave = f.Stave({ x: 300, y: 40, width: 300 }); + stave.setText('Violin', _src_modifier__WEBPACK_IMPORTED_MODULE_6__.Modifier.Position.LEFT, { shift_y: -10 }); + stave.setText('2nd line', _src_modifier__WEBPACK_IMPORTED_MODULE_6__.Modifier.Position.LEFT, { shift_y: 10 }); + f.draw(); + ok(true, 'all pass'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(StaveTests); + + + +/***/ }), + +/***/ "./tests/staveconnector_tests.ts": +/*!***************************************!*\ + !*** ./tests/staveconnector_tests.ts ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StaveConnectorTests": () => (/* binding */ StaveConnectorTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_flow__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/flow */ "./src/flow.ts"); +/* harmony import */ var _src_modifier__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/modifier */ "./src/modifier.ts"); +/* harmony import */ var _src_stave__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/stave */ "./src/stave.ts"); +/* harmony import */ var _src_stavebarline__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/stavebarline */ "./src/stavebarline.ts"); +/* harmony import */ var _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/staveconnector */ "./src/staveconnector.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// StaveConnector Tests +// TODO: Should we change StaveConnector.type => StaveConnectorType? We are inconsistent with this. + + + + + + +const StaveConnectorTests = { + Start() { + QUnit.module('StaveConnector'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Single Draw Test', drawSingle); + run('Single Draw Test, 4px Stave Line Thickness', drawSingle4pxStaveLines); + run('Single Both Sides Test', drawSingleBoth); + run('Double Draw Test', drawDouble); + run('Bold Double Line Left Draw Test', drawRepeatBegin); + run('Bold Double Line Right Draw Test', drawRepeatEnd); + run('Thin Double Line Right Draw Test', drawThinDouble); + run('Bold Double Lines Overlapping Draw Test', drawRepeatAdjacent); + run('Bold Double Lines Offset Draw Test', drawRepeatOffset); + run('Bold Double Lines Offset Draw Test 2', drawRepeatOffset2); + run('Brace Draw Test', drawBrace); + run('Brace Wide Draw Test', drawBraceWide); + run('Bracket Draw Test', drawBracket); + run('Combined Draw Test', drawCombined); + }, +}; +function drawSingle(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 300); + const stave1 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(25, 10, 300); + const stave2 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(25, 120, 300); + stave1.setContext(ctx); + stave2.setContext(ctx); + const connector = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave1, stave2); + connector.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.SINGLE); + connector.setContext(ctx); + stave1.draw(); + stave2.draw(); + connector.draw(); + ok(true, 'all pass'); +} +function drawSingle4pxStaveLines(options, contextBuilder) { + const oldThickness = _src_flow__WEBPACK_IMPORTED_MODULE_1__.Flow.STAVE_LINE_THICKNESS; + _src_flow__WEBPACK_IMPORTED_MODULE_1__.Flow.STAVE_LINE_THICKNESS = 4; + const ctx = contextBuilder(options.elementId, 400, 300); + const stave1 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(25, 10, 300); + const stave2 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(25, 120, 300); + stave1.setContext(ctx); + stave2.setContext(ctx); + const connector = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave1, stave2); + connector.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.SINGLE); + connector.setContext(ctx); + stave1.draw(); + stave2.draw(); + connector.draw(); + _src_flow__WEBPACK_IMPORTED_MODULE_1__.Flow.STAVE_LINE_THICKNESS = oldThickness; + ok(true, 'all pass'); +} +function drawSingleBoth(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 300); + const stave1 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(25, 10, 300); + const stave2 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(25, 120, 300); + stave1.setContext(ctx); + stave2.setContext(ctx); + const connector1 = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave1, stave2); + connector1.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.SINGLE_LEFT); + connector1.setContext(ctx); + const connector2 = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave1, stave2); + connector2.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.SINGLE_RIGHT); + connector2.setContext(ctx); + stave1.draw(); + stave2.draw(); + connector1.draw(); + connector2.draw(); + ok(true, 'all pass'); +} +function drawDouble(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 300); + const stave1 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(25, 10, 300); + const stave2 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(25, 120, 300); + stave1.setContext(ctx); + stave2.setContext(ctx); + const connector = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave1, stave2); + const line = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave1, stave2); + connector.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.DOUBLE); + connector.setContext(ctx); + line.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.SINGLE); + connector.setContext(ctx); + line.setContext(ctx); + stave1.draw(); + stave2.draw(); + connector.draw(); + line.draw(); + ok(true, 'all pass'); +} +function drawBrace(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 450, 300); + const stave1 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(100, 10, 300); + const stave2 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(100, 120, 300); + stave1.setContext(ctx); + stave2.setContext(ctx); + const connector = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave1, stave2); + const line = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave1, stave2); + connector.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.BRACE); + connector.setContext(ctx); + connector.setText('Piano'); + line.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.SINGLE); + connector.setContext(ctx); + line.setContext(ctx); + stave1.draw(); + stave2.draw(); + connector.draw(); + line.draw(); + ok(true, 'all pass'); +} +function drawBraceWide(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 300); + const stave1 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(25, -20, 300); + const stave2 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(25, 200, 300); + stave1.setContext(ctx); + stave2.setContext(ctx); + const connector = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave1, stave2); + const line = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave1, stave2); + connector.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.BRACE); + connector.setContext(ctx); + line.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.SINGLE); + connector.setContext(ctx); + line.setContext(ctx); + stave1.draw(); + stave2.draw(); + connector.draw(); + line.draw(); + ok(true, 'all pass'); +} +function drawBracket(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 300); + const stave1 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(25, 10, 300); + const stave2 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(25, 120, 300); + stave1.setContext(ctx); + stave2.setContext(ctx); + const connector = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave1, stave2); + const line = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave1, stave2); + connector.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.BRACKET); + connector.setContext(ctx); + line.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.SINGLE); + connector.setContext(ctx); + line.setContext(ctx); + stave1.draw(); + stave2.draw(); + connector.draw(); + line.draw(); + ok(true, 'all pass'); +} +function drawRepeatBegin(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 300); + const stave1 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(25, 10, 300); + const stave2 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(25, 120, 300); + stave1.setContext(ctx); + stave2.setContext(ctx); + stave1.setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.REPEAT_BEGIN); + stave2.setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.REPEAT_BEGIN); + const line = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave1, stave2); + line.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.BOLD_DOUBLE_LEFT); + line.setContext(ctx); + stave1.draw(); + stave2.draw(); + line.draw(); + ok(true, 'all pass'); +} +function drawRepeatEnd(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 300); + const stave1 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(25, 10, 300); + const stave2 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(25, 120, 300); + stave1.setContext(ctx); + stave2.setContext(ctx); + stave1.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.REPEAT_END); + stave2.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.REPEAT_END); + const line = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave1, stave2); + line.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.BOLD_DOUBLE_RIGHT); + line.setContext(ctx); + stave1.draw(); + stave2.draw(); + line.draw(); + ok(true, 'all pass'); +} +function drawThinDouble(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 300); + const stave1 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(25, 10, 300); + const stave2 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(25, 120, 300); + stave1.setContext(ctx); + stave2.setContext(ctx); + stave1.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.DOUBLE); + stave2.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.DOUBLE); + const line = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave1, stave2); + line.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.THIN_DOUBLE); + line.setContext(ctx); + stave1.draw(); + stave2.draw(); + line.draw(); + ok(true, 'all pass'); +} +function drawRepeatAdjacent(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 300); + const stave1 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(25, 10, 150); + const stave2 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(25, 120, 150); + const stave3 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(175, 10, 150); + const stave4 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(175, 120, 150); + stave1.setContext(ctx); + stave2.setContext(ctx); + stave3.setContext(ctx); + stave4.setContext(ctx); + stave1.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.REPEAT_END); + stave2.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.REPEAT_END); + stave3.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.END); + stave4.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.END); + stave1.setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.REPEAT_BEGIN); + stave2.setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.REPEAT_BEGIN); + stave3.setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.REPEAT_BEGIN); + stave4.setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.REPEAT_BEGIN); + const connector1 = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave1, stave2); + const connector2 = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave1, stave2); + const connector3 = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave3, stave4); + const connector4 = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave3, stave4); + connector1.setContext(ctx); + connector2.setContext(ctx); + connector3.setContext(ctx); + connector4.setContext(ctx); + connector1.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.BOLD_DOUBLE_LEFT); + connector2.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.BOLD_DOUBLE_RIGHT); + connector3.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.BOLD_DOUBLE_LEFT); + connector4.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.BOLD_DOUBLE_RIGHT); + stave1.draw(); + stave2.draw(); + stave3.draw(); + stave4.draw(); + connector1.draw(); + connector2.draw(); + connector3.draw(); + connector4.draw(); + ok(true, 'all pass'); +} +function drawRepeatOffset2(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 300); + const stave1 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(25, 10, 150); + const stave2 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(25, 120, 150); + const stave3 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(175, 10, 150); + const stave4 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(175, 120, 150); + stave1.setContext(ctx); + stave2.setContext(ctx); + stave3.setContext(ctx); + stave4.setContext(ctx); + stave1.addClef('treble'); + stave2.addClef('bass'); + stave3.addClef('alto'); + stave4.addClef('treble'); + stave1.addTimeSignature('4/4'); + stave2.addTimeSignature('4/4'); + stave3.addTimeSignature('6/8'); + stave4.addTimeSignature('6/8'); + stave1.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.REPEAT_END); + stave2.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.REPEAT_END); + stave3.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.END); + stave4.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.END); + stave1.setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.REPEAT_BEGIN); + stave2.setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.REPEAT_BEGIN); + stave3.setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.REPEAT_BEGIN); + stave4.setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.REPEAT_BEGIN); + const connector1 = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave1, stave2); + const connector2 = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave1, stave2); + const connector3 = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave3, stave4); + const connector4 = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave3, stave4); + const connector5 = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave3, stave4); + connector1.setContext(ctx); + connector2.setContext(ctx); + connector3.setContext(ctx); + connector4.setContext(ctx); + connector5.setContext(ctx); + connector1.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.BOLD_DOUBLE_LEFT); + connector2.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.BOLD_DOUBLE_RIGHT); + connector3.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.BOLD_DOUBLE_LEFT); + connector4.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.BOLD_DOUBLE_RIGHT); + connector5.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.SINGLE_LEFT); + connector1.setXShift(stave1.getModifierXShift()); + connector3.setXShift(stave3.getModifierXShift()); + stave1.draw(); + stave2.draw(); + stave3.draw(); + stave4.draw(); + connector1.draw(); + connector2.draw(); + connector3.draw(); + connector4.draw(); + connector5.draw(); + ok(true, 'all pass'); +} +function drawRepeatOffset(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 300); + const stave1 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(25, 10, 150); + const stave2 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(25, 120, 150); + const stave3 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(185, 10, 150); + const stave4 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(185, 120, 150); + stave1.setContext(ctx); + stave2.setContext(ctx); + stave3.setContext(ctx); + stave4.setContext(ctx); + stave1.addClef('bass'); + stave2.addClef('alto'); + stave3.addClef('treble'); + stave4.addClef('tenor'); + stave3.addKeySignature('Ab'); + stave4.addKeySignature('Ab'); + stave1.addTimeSignature('4/4'); + stave2.addTimeSignature('4/4'); + stave3.addTimeSignature('6/8'); + stave4.addTimeSignature('6/8'); + stave1.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.REPEAT_END); + stave2.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.REPEAT_END); + stave3.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.END); + stave4.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.END); + stave1.setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.REPEAT_BEGIN); + stave2.setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.REPEAT_BEGIN); + stave3.setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.REPEAT_BEGIN); + stave4.setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.REPEAT_BEGIN); + const connector1 = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave1, stave2); + const connector2 = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave1, stave2); + const connector3 = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave3, stave4); + const connector4 = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave3, stave4); + const connector5 = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave3, stave4); + connector1.setContext(ctx); + connector2.setContext(ctx); + connector3.setContext(ctx); + connector4.setContext(ctx); + connector5.setContext(ctx); + connector1.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.BOLD_DOUBLE_LEFT); + connector2.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.BOLD_DOUBLE_RIGHT); + connector3.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.BOLD_DOUBLE_LEFT); + connector4.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.BOLD_DOUBLE_RIGHT); + connector5.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.SINGLE_LEFT); + connector1.setXShift(stave1.getModifierXShift()); + connector3.setXShift(stave3.getModifierXShift()); + stave1.draw(); + stave2.draw(); + stave3.draw(); + stave4.draw(); + connector1.draw(); + connector2.draw(); + connector3.draw(); + connector4.draw(); + connector5.draw(); + ok(true, 'all pass'); +} +function drawCombined(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 550, 700); + const stave1 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(150, 10, 300); + const stave2 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(150, 100, 300); + const stave3 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(150, 190, 300); + const stave4 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(150, 280, 300); + const stave5 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(150, 370, 300); + const stave6 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(150, 460, 300); + const stave7 = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(150, 560, 300); + stave1.setText('Violin', _src_modifier__WEBPACK_IMPORTED_MODULE_2__.Modifier.Position.LEFT); + stave1.setContext(ctx); + stave2.setContext(ctx); + stave3.setContext(ctx); + stave4.setContext(ctx); + stave5.setContext(ctx); + stave6.setContext(ctx); + stave7.setContext(ctx); + const conn_single = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave1, stave7); + const conn_double = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave2, stave3); + const conn_bracket = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave4, stave7); + const conn_none = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave4, stave5); + const conn_brace = new _src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave6, stave7); + conn_single.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.SINGLE); + conn_double.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.DOUBLE); + conn_bracket.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.BRACKET); + conn_brace.setType(_src_staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector.type.BRACE); + conn_brace.setXShift(-5); + conn_double.setText('Piano'); + conn_none.setText('Multiple', { shift_y: -15 }); + conn_none.setText('Line Text', { shift_y: 15 }); + conn_brace.setText('Harpsichord'); + conn_single.setContext(ctx); + conn_double.setContext(ctx); + conn_bracket.setContext(ctx); + conn_none.setContext(ctx); + conn_brace.setContext(ctx); + stave1.draw(); + stave2.draw(); + stave3.draw(); + stave4.draw(); + stave5.draw(); + stave6.draw(); + stave7.draw(); + conn_single.draw(); + conn_double.draw(); + conn_bracket.draw(); + conn_none.draw(); + conn_brace.draw(); + ok(true, 'all pass'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(StaveConnectorTests); + + + +/***/ }), + +/***/ "./tests/stavehairpin_tests.ts": +/*!*************************************!*\ + !*** ./tests/stavehairpin_tests.ts ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StaveHairpinTests": () => (/* binding */ StaveHairpinTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_stavehairpin__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/stavehairpin */ "./src/stavehairpin.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// Author: Raffaele Viglianti, 2012 +// +// StaveHairpin Tests +// TODO: Incorrect property names in the options object: vo, left_ho, right_ho. + + +const StaveHairpinTests = { + Start() { + QUnit.module('StaveHairpin'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Simple StaveHairpin', simple); + run('Horizontal Offset StaveHairpin', horizontal); + run('Vertical Offset StaveHairpin', vertical); + run('Height StaveHairpin', height); + }, +}; +/** + * Helper function to draw a single hairpin (either crescendo or decrescendo). + * @param type is StaveHairpin.type.CRESC or StaveHairpin.type.DECRESC. + * @param position is Modifier.Position.ABOVE or Modifier.Position.BELOW. + */ +function drawHairpin(first_note, last_note, ctx, type, position, options) { + const hairpin = new _src_stavehairpin__WEBPACK_IMPORTED_MODULE_1__.StaveHairpin({ first_note, last_note }, type); + hairpin.setContext(ctx); + hairpin.setPosition(position); + if (options) { + hairpin.setRenderOptions(options); + } + hairpin.draw(); +} +/** + * Helper function + */ +function createTest(drawTwoHairpins) { + return (options) => { + const factory = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const ctx = factory.getContext(); + const stave = factory.Stave(); + const notes = [ + factory + .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], stem_direction: 1, duration: '4' }) + .addModifier(factory.Accidental({ type: 'b' }), 0) + .addModifier(factory.Accidental({ type: '#' }), 1), + factory.StaveNote({ keys: ['d/4'], stem_direction: 1, duration: '4' }), + factory.StaveNote({ keys: ['e/4'], stem_direction: 1, duration: '4' }), + factory.StaveNote({ keys: ['f/4'], stem_direction: 1, duration: '4' }), + ]; + const voice = factory.Voice().addTickables(notes); + factory.Formatter().joinVoices([voice]).formatToStave([voice], stave); + factory.draw(); + drawTwoHairpins(ctx, notes); + ok(true, 'Simple Test'); + }; +} +const simple = createTest((ctx, notes) => { + drawHairpin(notes[0], notes[2], ctx, 1, 4); + drawHairpin(notes[1], notes[3], ctx, 2, 3); +}); +const horizontal = createTest((ctx, notes) => { + drawHairpin(notes[0], notes[2], ctx, 1, 3, { + height: 10, + // TODO: these three property names seem to be incorrect. + // vo => should it be 'y_shift'? + // left_ho => should it be 'left_shift_px'? + // right_ho => should it be 'right_shift_px'? + vo: 20, + left_ho: 20, + right_ho: -20, // right horizontal offset + }); + drawHairpin(notes[3], notes[3], ctx, 2, 4, { + height: 10, + y_shift: 0, + left_shift_px: 0, + right_shift_px: 120, // right horizontal offset + }); +}); +const vertical = createTest((ctx, notes) => { + drawHairpin(notes[0], notes[2], ctx, 1, 4, { + height: 10, + y_shift: 0, + left_shift_px: 0, + right_shift_px: 0, // right horizontal offset + }); + drawHairpin(notes[2], notes[3], ctx, 2, 4, { + height: 10, + y_shift: -15, + left_shift_px: 2, + right_shift_px: 0, // right horizontal offset + }); +}); +const height = createTest((ctx, notes) => { + drawHairpin(notes[0], notes[2], ctx, 1, 4, { + height: 10, + y_shift: 0, + left_shift_px: 0, + right_shift_px: 0, // right horizontal offset + }); + drawHairpin(notes[2], notes[3], ctx, 2, 4, { + height: 15, + y_shift: 0, + left_shift_px: 2, + right_shift_px: 0, // right horizontal offset + }); +}); +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(StaveHairpinTests); + + + +/***/ }), + +/***/ "./tests/staveline_tests.ts": +/*!**********************************!*\ + !*** ./tests/staveline_tests.ts ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StaveLineTests": () => (/* binding */ StaveLineTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_dot__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/dot */ "./src/dot.ts"); +/* harmony import */ var _src_font__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/font */ "./src/font.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// StaveLine Tests + + + +const StaveLineTests = { + Start() { + QUnit.module('StaveLine'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Simple StaveLine', simple0); + run('StaveLine Arrow Options', simple1); + }, +}; +function simple0(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave().addClef('treble'); + const notes = [ + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'treble' }), + f.StaveNote({ keys: ['c/5'], duration: '4', clef: 'treble' }), + f.StaveNote({ keys: ['c/4', 'g/4', 'b/4'], duration: '4', clef: 'treble' }), + f.StaveNote({ keys: ['f/4', 'a/4', 'f/5'], duration: '4', clef: 'treble' }), + ]; + const voice = f.Voice().addTickables(notes); + f.StaveLine({ + from: notes[0], + to: notes[1], + first_indices: [0], + last_indices: [0], + options: { + font: { family: _src_font__WEBPACK_IMPORTED_MODULE_2__.Font.SERIF, size: 12, style: _src_font__WEBPACK_IMPORTED_MODULE_2__.FontStyle.ITALIC }, + text: 'gliss.', + }, + }); + const staveLine2 = f.StaveLine({ + from: notes[2], + to: notes[3], + first_indices: [2, 1, 0], + last_indices: [0, 1, 2], + }); + staveLine2.render_options.line_dash = [10, 10]; + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true); +} +function simple1(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 770); + const stave = f.Stave().addClef('treble'); + const notes = [ + f.StaveNote({ keys: ['c#/5', 'd/5'], duration: '4', clef: 'treble', stem_direction: -1 }), + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'treble' }).addModifier(f.Accidental({ type: '#' }), 0), + f.StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: '4', clef: 'treble' }), + f + .StaveNote({ keys: ['f/4', 'a/4', 'c/5'], duration: '4', clef: 'treble' }) + .addModifier(f.Accidental({ type: '#' }), 2), + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'treble' }).addModifier(f.Accidental({ type: '#' }), 0), + f.StaveNote({ keys: ['c#/5', 'd/5'], duration: '4', clef: 'treble', stem_direction: -1 }), + f.StaveNote({ keys: ['c/4', 'd/4', 'g/4'], duration: '4', clef: 'treble' }), + f + .StaveNote({ keys: ['f/4', 'a/4', 'c/5'], duration: '4', clef: 'treble' }) + .addModifier(f.Accidental({ type: '#' }), 2), + ]; + _src_dot__WEBPACK_IMPORTED_MODULE_1__.Dot.buildAndAttach([notes[0]], { all: true }); + const voice = f.Voice().setStrict(false).addTickables(notes); + const staveLine0 = f.StaveLine({ + from: notes[0], + to: notes[1], + first_indices: [0], + last_indices: [0], + options: { text: 'Left' }, + }); + const staveLine4 = f.StaveLine({ + from: notes[2], + to: notes[3], + first_indices: [1], + last_indices: [1], + options: { text: 'Right' }, + }); + const staveLine1 = f.StaveLine({ + from: notes[4], + to: notes[5], + first_indices: [0], + last_indices: [0], + options: { text: 'Center' }, + }); + const staveLine2 = f.StaveLine({ + from: notes[6], + to: notes[7], + first_indices: [1], + last_indices: [0], + }); + const staveLine3 = f.StaveLine({ + from: notes[6], + to: notes[7], + first_indices: [2], + last_indices: [2], + options: { text: 'Top' }, + }); + staveLine0.render_options.draw_end_arrow = true; + staveLine0.render_options.text_justification = 1; + staveLine0.render_options.text_position_vertical = 2; + staveLine1.render_options.draw_end_arrow = true; + staveLine1.render_options.arrowhead_length = 30; + staveLine1.render_options.line_width = 5; + staveLine1.render_options.text_justification = 2; + staveLine1.render_options.text_position_vertical = 2; + staveLine4.render_options.line_width = 2; + staveLine4.render_options.draw_end_arrow = true; + staveLine4.render_options.draw_start_arrow = true; + staveLine4.render_options.arrowhead_angle = 0.5; + staveLine4.render_options.arrowhead_length = 20; + staveLine4.render_options.text_justification = 3; + staveLine4.render_options.text_position_vertical = 2; + staveLine2.render_options.draw_start_arrow = true; + staveLine2.render_options.line_dash = [5, 4]; + staveLine3.render_options.draw_end_arrow = true; + staveLine3.render_options.draw_start_arrow = true; + staveLine3.render_options.color = 'red'; + staveLine3.render_options.text_position_vertical = 1; + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(StaveLineTests); + + + +/***/ }), + +/***/ "./tests/stavemodifier_tests.ts": +/*!**************************************!*\ + !*** ./tests/stavemodifier_tests.ts ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StaveModifierTests": () => (/* binding */ StaveModifierTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_stave__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/stave */ "./src/stave.ts"); +/* harmony import */ var _src_stavebarline__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/stavebarline */ "./src/stavebarline.ts"); +/* harmony import */ var _src_stavemodifier__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/stavemodifier */ "./src/stavemodifier.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// StaveModifier Tests + + + + +const StaveModifierTests = { + Start() { + QUnit.module('StaveModifier'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Stave Draw Test', draw); + run('Begin & End StaveModifier Test', drawBeginAndEnd); + }, +}; +function draw(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 120); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_1__.Stave(10, 10, 300); + stave.setContext(ctx); + stave.draw(); + equal(stave.getYForNote(0), 100, 'getYForNote(0)'); + equal(stave.getYForLine(5), 100, 'getYForLine(5)'); + equal(stave.getYForLine(0), 50, 'getYForLine(0) - Top Line'); + equal(stave.getYForLine(4), 90, 'getYForLine(4) - Bottom Line'); + ok(true, 'all pass'); +} +function drawBeginAndEnd(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 500, 240); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_1__.Stave(10, 10, 400); + stave.setContext(ctx); + stave.setTimeSignature('C|'); + stave.setKeySignature('Db'); + stave.setClef('treble'); + stave.setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_2__.BarlineType.REPEAT_BEGIN); + stave.setEndClef('alto'); + stave.setEndTimeSignature('9/8'); + stave.setEndKeySignature('G', 'C#'); + stave.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_2__.BarlineType.DOUBLE); + stave.draw(); + // change + const END = _src_stavemodifier__WEBPACK_IMPORTED_MODULE_3__.StaveModifierPosition.END; + stave.setY(100); + stave.setTimeSignature('3/4'); + stave.setKeySignature('G', 'C#'); + stave.setClef('bass'); + stave.setBegBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_2__.BarlineType.SINGLE); + stave.setClef('treble', undefined, undefined, END); + stave.setTimeSignature('C', undefined, END); + stave.setKeySignature('F', undefined, END); + stave.setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_2__.BarlineType.SINGLE); + stave.draw(); + ok(true, 'all pass'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(StaveModifierTests); + + + +/***/ }), + +/***/ "./tests/stavenote_tests.ts": +/*!**********************************!*\ + !*** ./tests/stavenote_tests.ts ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StaveNoteTests": () => (/* binding */ StaveNoteTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_accidental__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/accidental */ "./src/accidental.ts"); +/* harmony import */ var _src_annotation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/annotation */ "./src/annotation.ts"); +/* harmony import */ var _src_articulation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/articulation */ "./src/articulation.ts"); +/* harmony import */ var _src_beam__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/beam */ "./src/beam.ts"); +/* harmony import */ var _src_dot__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/dot */ "./src/dot.ts"); +/* harmony import */ var _src_flow__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/flow */ "./src/flow.ts"); +/* harmony import */ var _src_formatter__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/formatter */ "./src/formatter.ts"); +/* harmony import */ var _src_fraction__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/fraction */ "./src/fraction.ts"); +/* harmony import */ var _src_frethandfinger__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/frethandfinger */ "./src/frethandfinger.ts"); +/* harmony import */ var _src_modifier__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/modifier */ "./src/modifier.ts"); +/* harmony import */ var _src_modifiercontext__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/modifiercontext */ "./src/modifiercontext.ts"); +/* harmony import */ var _src_stave__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../src/stave */ "./src/stave.ts"); +/* harmony import */ var _src_stavenote__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../src/stavenote */ "./src/stavenote.ts"); +/* harmony import */ var _src_stem__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../src/stem */ "./src/stem.ts"); +/* harmony import */ var _src_stringnumber__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../src/stringnumber */ "./src/stringnumber.ts"); +/* harmony import */ var _src_strokes__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../src/strokes */ "./src/strokes.ts"); +/* harmony import */ var _src_tickcontext__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../src/tickcontext */ "./src/tickcontext.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// StaveNote Tests +// TODO: In StaveNote.preFormat() line 929, should noteHeadPadding default to StaveNote.minNoteheadPadding? +// The bounding box of a note changes slightly when we add a ModifierContext (even if we add zero modifiers). + + + + + + + + + + + + + + + + + + +const StaveNoteTests = { + Start() { + QUnit.module('StaveNote'); + test('Tick', ticks); + test('Tick - New API', ticksNewAPI); + test('Stem', stem); + test('Automatic Stem Direction', autoStem); + test('Stem Extension Pitch', stemExtensionPitch); + test('Displacement after calling setStemDirection', setStemDirectionDisplacement); + test('StaveLine', staveLine); + test('Width', width); + test('TickContext', tickContext); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('StaveNote Draw - Treble', drawBasic, { clef: 'treble', octaveShift: 0, restKey: 'r/4' }); + run('StaveNote BoundingBoxes - Treble', drawBoundingBoxes, { clef: 'treble', octaveShift: 0, restKey: 'r/4' }); + run('StaveNote Draw - Alto', drawBasic, { clef: 'alto', octaveShift: -1, restKey: 'r/4' }); + run('StaveNote Draw - Tenor', drawBasic, { clef: 'tenor', octaveShift: -1, restKey: 'r/3' }); + run('StaveNote Draw - Bass', drawBasic, { clef: 'bass', octaveShift: -2, restKey: 'r/3' }); + run('StaveNote Draw - Harmonic And Muted', drawHarmonicAndMuted); + run('StaveNote Draw - Slash', drawSlash); + run('Displacements', displacements); + run('StaveNote Draw - Bass 2', drawBass); + run('StaveNote Draw - Key Styles', drawKeyStyles); + run('StaveNote Draw - StaveNote Stem Styles', drawNoteStemStyles); + run('StaveNote Draw - StaveNote Stem Lengths', drawNoteStemLengths); + run('StaveNote Draw - StaveNote Flag Styles', drawNoteStylesWithFlag); + run('StaveNote Draw - StaveNote Styles', drawNoteStyles); + run('Stave, Ledger Line, Beam, Stem and Flag Styles', drawBeamStyles); + run('Flag and Dot Placement - Stem Up', dotsAndFlagsStemUp); + run('Flag and Dots Placement - Stem Down', dotsAndFlagsStemDown); + run('Beam and Dot Placement - Stem Up', dotsAndBeamsUp); + run('Beam and Dot Placement - Stem Down', dotsAndBeamsDown); + run('Center Aligned Note', centerAlignedRest); + run('Center Aligned Note with Articulation', centerAlignedRestFermata); + run('Center Aligned Note with Annotation', centerAlignedRestAnnotation); + run('Center Aligned Note - Multi Voice', centerAlignedMultiVoice); + run('Center Aligned Note with Multiple Modifiers', centerAlignedNoteMultiModifiers); + // This interactivity test currently only works with the SVG backend. + _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runSVGTest('Interactive Mouseover StaveNote', drawBasic, { + clef: 'treble', + octaveShift: 0, + restKey: 'r/4', + ui: true, + }); + }, +}; +// Helper function to create StaveNotes. +const staveNote = (struct) => new _src_stavenote__WEBPACK_IMPORTED_MODULE_13__.StaveNote(struct); +/** + * Helper function to draw a note with an optional bounding box. + */ +function draw(note, stave, context, x, drawBoundingBox = false, addModifierContext = true) { + // Associate the note with the stave. + note.setStave(stave); + // A ModifierContext is required for dots and other modifiers to be drawn properly. + // If added, it changes the bounding box of a note, even if there are no modifiers to draw. + // See StaveNote.minNoteheadPadding in stavenote.ts. + if (addModifierContext) { + note.addToModifierContext(new _src_modifiercontext__WEBPACK_IMPORTED_MODULE_11__.ModifierContext()); + } + new _src_tickcontext__WEBPACK_IMPORTED_MODULE_17__.TickContext().addTickable(note).preFormat().setX(x); + note.setContext(context).draw(); + if (drawBoundingBox) { + const bb = note.getBoundingBox(); + context.rect(bb.getX(), bb.getY(), bb.getW(), bb.getH()); + context.stroke(); + } + return note; +} +function ticks() { + const BEAT = (1 * _src_flow__WEBPACK_IMPORTED_MODULE_6__.Flow.RESOLUTION) / 4; + // Key value pairs of `testName: [durationString, expectedBeats, expectedNoteType]` + const tickTests = { + 'Breve note': ['1/2', 8.0, 'n'], + 'Whole note': ['w', 4.0, 'n'], + 'Quarter note': ['q', 1.0, 'n'], + 'Dotted half note': ['hd', 3.0, 'n'], + 'Doubled-dotted half note': ['hdd', 3.5, 'n'], + 'Triple-dotted half note': ['hddd', 3.75, 'n'], + 'Dotted half rest': ['hdr', 3.0, 'r'], + 'Double-dotted half rest': ['hddr', 3.5, 'r'], + 'Triple-dotted half rest': ['hdddr', 3.75, 'r'], + 'Dotted harmonic quarter note': ['qdh', 1.5, 'h'], + 'Double-dotted harmonic quarter note': ['qddh', 1.75, 'h'], + 'Triple-dotted harmonic quarter note': ['qdddh', 1.875, 'h'], + 'Dotted muted 8th note': ['8dm', 0.75, 'm'], + 'Double-dotted muted 8th note': ['8ddm', 0.875, 'm'], + 'Triple-dotted muted 8th note': ['8dddm', 0.9375, 'm'], + }; + Object.keys(tickTests).forEach((testName) => { + const testData = tickTests[testName]; + const durationString = testData[0]; + const expectedBeats = testData[1]; + const expectedNoteType = testData[2]; + const note = new _src_stavenote__WEBPACK_IMPORTED_MODULE_13__.StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: durationString }); + equal(note.getTicks().value(), BEAT * expectedBeats, testName + ' must have ' + expectedBeats + ' beats'); + equal(note.getNoteType(), expectedNoteType, 'Note type must be ' + expectedNoteType); + }); + throws(() => new _src_stavenote__WEBPACK_IMPORTED_MODULE_13__.StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: '8.7dddm' }), /BadArguments/, "Invalid note duration '8.7' throws BadArguments exception"); + throws(() => new _src_stavenote__WEBPACK_IMPORTED_MODULE_13__.StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: '2Z' }), /BadArguments/, "Invalid note type 'Z' throws BadArguments exception"); + throws(() => new _src_stavenote__WEBPACK_IMPORTED_MODULE_13__.StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: '2dddZ' }), /BadArguments/, "Invalid note type 'Z' throws BadArguments exception"); +} +function ticksNewAPI() { + const BEAT = (1 * _src_flow__WEBPACK_IMPORTED_MODULE_6__.Flow.RESOLUTION) / 4; + // Key value pairs of `testName: [noteData, expectedBeats, expectedNoteType]` + const tickTests = { + 'Breve note': [{ duration: '1/2' }, 8.0, 'n'], + 'Whole note': [{ duration: 'w' }, 4.0, 'n'], + 'Quarter note': [{ duration: 'q' }, 1.0, 'n'], + 'Dotted half note': [{ duration: 'h', dots: 1 }, 3.0, 'n'], + 'Doubled-dotted half note': [{ duration: 'h', dots: 2 }, 3.5, 'n'], + 'Triple-dotted half note': [{ duration: 'h', dots: 3 }, 3.75, 'n'], + 'Dotted half rest': [{ duration: 'h', dots: 1, type: 'r' }, 3.0, 'r'], + 'Double-dotted half rest': [{ duration: 'h', dots: 2, type: 'r' }, 3.5, 'r'], + 'Triple-dotted half rest': [{ duration: 'h', dots: 3, type: 'r' }, 3.75, 'r'], + 'Dotted harmonic quarter note': [{ duration: 'q', dots: 1, type: 'h' }, 1.5, 'h'], + 'Double-dotted harmonic quarter note': [{ duration: 'q', dots: 2, type: 'h' }, 1.75, 'h'], + 'Triple-dotted harmonic quarter note': [{ duration: 'q', dots: 3, type: 'h' }, 1.875, 'h'], + 'Dotted muted 8th note': [{ duration: '8', dots: 1, type: 'm' }, 0.75, 'm'], + 'Double-dotted muted 8th note': [{ duration: '8', dots: 2, type: 'm' }, 0.875, 'm'], + 'Triple-dotted muted 8th note': [{ duration: '8', dots: 3, type: 'm' }, 0.9375, 'm'], + }; + Object.keys(tickTests).forEach(function (testName) { + const testData = tickTests[testName]; + const noteData = testData[0]; + const expectedBeats = testData[1]; + const expectedNoteType = testData[2]; + noteData.keys = ['c/4', 'e/4', 'g/4']; + const note = new _src_stavenote__WEBPACK_IMPORTED_MODULE_13__.StaveNote(noteData); + equal(note.getTicks().value(), BEAT * expectedBeats, testName + ' must have ' + expectedBeats + ' beats'); + equal(note.getNoteType(), expectedNoteType, 'Note type must be ' + expectedNoteType); + }); + throws(() => new _src_stavenote__WEBPACK_IMPORTED_MODULE_13__.StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: '8.7dddm' }), /BadArguments/, "Invalid note duration '8.7' throws BadArguments exception"); + throws(() => new _src_stavenote__WEBPACK_IMPORTED_MODULE_13__.StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: '2Z' }), /BadArguments/, "Invalid note type 'Z' throws BadArguments exception"); + throws(() => new _src_stavenote__WEBPACK_IMPORTED_MODULE_13__.StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: '2dddZ' }), /BadArguments/, "Invalid note type 'Z' throws BadArguments exception"); +} +function stem() { + const note = new _src_stavenote__WEBPACK_IMPORTED_MODULE_13__.StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: 'w' }); + equal(note.getStemDirection(), _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP, 'Default note has UP stem'); +} +function autoStem() { + const testData = [ + [['c/5', 'e/5', 'g/5'], _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN], + [['e/4', 'g/4', 'c/5'], _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP], + [['c/5'], _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN], + [['a/4', 'e/5', 'g/5'], _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN], + [['b/4'], _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN], + ]; + testData.forEach((td) => { + const keys = td[0]; + const expectedStemDirection = td[1]; + const note = new _src_stavenote__WEBPACK_IMPORTED_MODULE_13__.StaveNote({ keys: keys, auto_stem: true, duration: '8' }); + equal(note.getStemDirection(), expectedStemDirection, 'Stem must be ' + (expectedStemDirection === _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP ? 'up' : 'down')); + }); +} +function stemExtensionPitch() { + // [keys, expectedStemExtension, override stem direction] + const testData = [ + [['c/5', 'e/5', 'g/5'], 0, 0], + [['e/4', 'g/4', 'c/5'], 0, 0], + [['c/5'], 0, 0], + [['f/3'], 15, 0], + [['f/3'], 15, _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP], + [['f/3'], 0, _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN], + [['f/3', 'e/5'], 0, 0], + [['g/6'], 25, 0], + [['g/6'], 25, _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN], + [['g/6'], 0, _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP], + ]; + testData.forEach((td) => { + const keys = td[0]; + const expectedStemExtension = td[1]; + const overrideStemDirection = td[2]; + let note; + if (overrideStemDirection === 0) { + note = new _src_stavenote__WEBPACK_IMPORTED_MODULE_13__.StaveNote({ keys: keys, auto_stem: true, duration: '4' }); + } + else { + note = new _src_stavenote__WEBPACK_IMPORTED_MODULE_13__.StaveNote({ keys: keys, duration: '4', stem_direction: overrideStemDirection }); + } + equal(note.getStemExtension(), expectedStemExtension, 'For ' + keys.toString() + ' StemExtension must be ' + expectedStemExtension); + // set to weird Stave + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_12__.Stave(10, 10, 300, { spacing_between_lines_px: 20 }); + note.setStave(stave); + equal(note.getStemExtension(), expectedStemExtension * 2, 'For wide staff ' + keys.toString() + ' StemExtension must be ' + expectedStemExtension * 2); + // const whole_note = new StaveNote({ keys: keys, duration: 'w' }); + // equal( + // whole_note.getStemExtension(), + // -1 * Flow.STEM_HEIGHT, + // 'For ' + keys.toString() + ' whole_note StemExtension must always be -1 * Flow.STEM_HEIGHT' + // ); + }); +} +function setStemDirectionDisplacement() { + function getDisplacements(note) { + return note.noteHeads.map((noteHead) => noteHead.isDisplaced()); + } + const stemUpDisplacements = [false, true, false]; + const stemDownDisplacements = [true, false, false]; + const note = new _src_stavenote__WEBPACK_IMPORTED_MODULE_13__.StaveNote({ keys: ['c/5', 'd/5', 'g/5'], stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP, duration: '4' }); + deepEqual(getDisplacements(note), stemUpDisplacements); + note.setStemDirection(_src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN); + deepEqual(getDisplacements(note), stemDownDisplacements); + note.setStemDirection(_src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP); + deepEqual(getDisplacements(note), stemUpDisplacements); +} +function staveLine() { + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_12__.Stave(10, 10, 300); + const note = new _src_stavenote__WEBPACK_IMPORTED_MODULE_13__.StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: 'w' }); + note.setStave(stave); + const props = note.getKeyProps(); + equal(props[0].line, 0, 'C/4 on line 0'); + equal(props[1].line, 1, 'E/4 on line 1'); + equal(props[2].line, 2.5, 'A/4 on line 2.5'); + const ys = note.getYs(); + equal(ys.length, 3, 'Chord should be rendered on three lines'); + equal(ys[0], 100, 'Line for C/4'); + equal(ys[1], 90, 'Line for E/4'); + equal(ys[2], 75, 'Line for A/4'); +} +function width() { + const note = new _src_stavenote__WEBPACK_IMPORTED_MODULE_13__.StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: 'w' }); + throws(() => note.getWidth(), /UnformattedNote/, 'Unformatted note should have no width'); +} +function tickContext() { + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_12__.Stave(10, 10, 400); + const note = new _src_stavenote__WEBPACK_IMPORTED_MODULE_13__.StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: 'w' }).setStave(stave); + new _src_tickcontext__WEBPACK_IMPORTED_MODULE_17__.TickContext().addTickable(note).preFormat().setX(10).setPadding(0); + expect(0); +} +function drawBasic(options, contextBuilder) { + const clef = options.params.clef; + const octaveShift = options.params.octaveShift; + const restKey = options.params.restKey; + const ctx = contextBuilder(options.elementId, 700, 180); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_12__.Stave(10, 30, 750); + stave.setContext(ctx); + stave.addClef(clef); + stave.draw(); + const lowerKeys = ['c/', 'e/', 'a/']; + const higherKeys = ['c/', 'e/', 'a/']; + for (let k = 0; k < lowerKeys.length; k++) { + lowerKeys[k] = lowerKeys[k] + (4 + octaveShift); + higherKeys[k] = higherKeys[k] + (5 + octaveShift); + } + const restKeys = [restKey]; + const noteStructs = [ + { clef: clef, keys: higherKeys, duration: '1/2' }, + { clef: clef, keys: lowerKeys, duration: 'w' }, + { clef: clef, keys: higherKeys, duration: 'h' }, + { clef: clef, keys: lowerKeys, duration: 'q' }, + { clef: clef, keys: higherKeys, duration: '8' }, + { clef: clef, keys: lowerKeys, duration: '16' }, + { clef: clef, keys: higherKeys, duration: '32' }, + { clef: clef, keys: higherKeys, duration: '64' }, + { clef: clef, keys: higherKeys, duration: '128' }, + { clef: clef, keys: lowerKeys, duration: '1/2', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: 'w', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: 'h', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: 'q', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: '8', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: '16', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: '32', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: '64', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: '128', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { clef: clef, keys: restKeys, duration: '1/2r' }, + { clef: clef, keys: restKeys, duration: 'wr' }, + { clef: clef, keys: restKeys, duration: 'hr' }, + { clef: clef, keys: restKeys, duration: 'qr' }, + { clef: clef, keys: restKeys, duration: '8r' }, + { clef: clef, keys: restKeys, duration: '16r' }, + { clef: clef, keys: restKeys, duration: '32r' }, + { clef: clef, keys: restKeys, duration: '64r' }, + { clef: clef, keys: restKeys, duration: '128r' }, + { keys: ['x/4'], duration: 'h' }, + ]; + expect(noteStructs.length * 2); + const colorDescendants = (parentItem, color) => () => parentItem.querySelectorAll('*').forEach((child) => { + child.setAttribute('fill', color); + child.setAttribute('stroke', color); + }); + for (let i = 0; i < noteStructs.length; ++i) { + const note = draw(staveNote(noteStructs[i]), stave, ctx, (i + 1) * 25); + // If this is an interactivity test (ui: true), then attach mouseover & mouseout handlers to the notes. + if (options.params.ui) { + const item = note.getAttribute('el'); + item.addEventListener('mouseover', colorDescendants(item, 'green'), false); + item.addEventListener('mouseout', colorDescendants(item, 'black'), false); + } + ok(note.getX() > 0, 'Note ' + i + ' has X value'); + ok(note.getYs().length > 0, 'Note ' + i + ' has Y values'); + } +} +function drawBoundingBoxes(options, contextBuilder) { + const clef = options.params.clef; + const octaveShift = options.params.octaveShift; + const restKey = options.params.restKey; + const ctx = contextBuilder(options.elementId, 700, 180); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_12__.Stave(10, 30, 750); + stave.setContext(ctx); + stave.addClef(clef); + stave.draw(); + const lowerKeys = ['c/', 'e/', 'a/']; + const higherKeys = ['c/', 'e/', 'a/']; + for (let k = 0; k < lowerKeys.length; k++) { + lowerKeys[k] = lowerKeys[k] + (4 + octaveShift); + higherKeys[k] = higherKeys[k] + (5 + octaveShift); + } + const restKeys = [restKey]; + const noteStructs = [ + { clef: clef, keys: higherKeys, duration: '1/2' }, + { clef: clef, keys: lowerKeys, duration: 'w' }, + { clef: clef, keys: higherKeys, duration: 'h' }, + { clef: clef, keys: lowerKeys, duration: 'q' }, + { clef: clef, keys: higherKeys, duration: '8' }, + { clef: clef, keys: lowerKeys, duration: '16' }, + { clef: clef, keys: higherKeys, duration: '32' }, + { clef: clef, keys: higherKeys, duration: '64' }, + { clef: clef, keys: higherKeys, duration: '128' }, + { clef: clef, keys: lowerKeys, duration: '1/2', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: 'w', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: 'h', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: 'q', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: '8', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: '16', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: '32', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: '64', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: '128' }, + { clef: clef, keys: restKeys, duration: '1/2r' }, + { clef: clef, keys: restKeys, duration: 'wr' }, + { clef: clef, keys: restKeys, duration: 'hr' }, + { clef: clef, keys: restKeys, duration: 'qr' }, + { clef: clef, keys: restKeys, duration: '8r' }, + { clef: clef, keys: restKeys, duration: '16r' }, + { clef: clef, keys: restKeys, duration: '32r' }, + { clef: clef, keys: restKeys, duration: '64r' }, + { clef: clef, keys: restKeys, duration: '128r' }, + { keys: ['x/4'], duration: 'h' }, + ]; + expect(noteStructs.length * 2); + for (let i = 0; i < noteStructs.length; ++i) { + const note = draw(staveNote(noteStructs[i]), stave, ctx, (i + 1) * 25, true /* drawBoundingBox */, false /* addModifierContext */); + ok(note.getX() > 0, 'Note ' + i + ' has X value'); + ok(note.getYs().length > 0, 'Note ' + i + ' has Y values'); + } +} +function drawBass(options, contextBuilder) { + expect(40); + const ctx = contextBuilder(options.elementId, 600, 280); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_12__.Stave(10, 10, 650); + stave.setContext(ctx); + stave.addClef('bass'); + stave.draw(); + const noteStructs = [ + { clef: 'bass', keys: ['c/3', 'e/3', 'a/3'], duration: '1/2' }, + { clef: 'bass', keys: ['c/2', 'e/2', 'a/2'], duration: 'w' }, + { clef: 'bass', keys: ['c/3', 'e/3', 'a/3'], duration: 'h' }, + { clef: 'bass', keys: ['c/2', 'e/2', 'a/2'], duration: 'q' }, + { clef: 'bass', keys: ['c/3', 'e/3', 'a/3'], duration: '8' }, + { clef: 'bass', keys: ['c/2', 'e/2', 'a/2'], duration: '16' }, + { clef: 'bass', keys: ['c/3', 'e/3', 'a/3'], duration: '32' }, + { clef: 'bass', keys: ['c/2', 'e/2', 'a/2'], duration: 'h', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { clef: 'bass', keys: ['c/2', 'e/2', 'a/2'], duration: 'q', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { clef: 'bass', keys: ['c/2', 'e/2', 'a/2'], duration: '8', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { clef: 'bass', keys: ['c/2', 'e/2', 'a/2'], duration: '16', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { clef: 'bass', keys: ['c/2', 'e/2', 'a/2'], duration: '32', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['r/4'], duration: '1/2r' }, + { keys: ['r/4'], duration: 'wr' }, + { keys: ['r/4'], duration: 'hr' }, + { keys: ['r/4'], duration: 'qr' }, + { keys: ['r/4'], duration: '8r' }, + { keys: ['r/4'], duration: '16r' }, + { keys: ['r/4'], duration: '32r' }, + { keys: ['x/4'], duration: 'h' }, + ]; + for (let i = 0; i < noteStructs.length; ++i) { + const note = draw(staveNote(noteStructs[i]), stave, ctx, (i + 1) * 25); + ok(note.getX() > 0, 'Note ' + i + ' has X value'); + ok(note.getYs().length > 0, 'Note ' + i + ' has Y values'); + } +} +function displacements(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 700, 155); + ctx.scale(0.9, 0.9); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_12__.Stave(10, 10, 675); + stave.setContext(ctx); + stave.draw(); + const noteStructs = [ + { keys: ['g/3', 'a/3', 'c/4', 'd/4', 'e/4'], duration: '1/2' }, + { keys: ['g/3', 'a/3', 'c/4', 'd/4', 'e/4'], duration: 'w' }, + { keys: ['d/4', 'e/4', 'f/4'], duration: 'h' }, + { keys: ['f/4', 'g/4', 'a/4', 'b/4'], duration: 'q' }, + { keys: ['e/3', 'b/3', 'c/4', 'e/4', 'f/4', 'g/5', 'a/5'], duration: '8' }, + { keys: ['a/3', 'c/4', 'e/4', 'g/4', 'a/4', 'b/4'], duration: '16' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '32' }, + { keys: ['c/4', 'e/4', 'a/4', 'a/4'], duration: '64' }, + { keys: ['g/3', 'c/4', 'd/4', 'e/4'], duration: 'h', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['d/4', 'e/4', 'f/4'], duration: 'q', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['f/4', 'g/4', 'a/4', 'b/4'], duration: '8', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['c/4', 'd/4', 'e/4', 'f/4', 'g/4', 'a/4'], duration: '16', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['b/3', 'c/4', 'e/4', 'a/4', 'b/5', 'c/6', 'e/6'], duration: '32', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { + keys: ['b/3', 'c/4', 'e/4', 'a/4', 'b/5', 'c/6', 'e/6', 'e/6'], + duration: '64', + stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN, + }, + ]; + expect(noteStructs.length * 2); + for (let i = 0; i < noteStructs.length; ++i) { + const note = draw(staveNote(noteStructs[i]), stave, ctx, (i + 1) * 45); + ok(note.getX() > 0, 'Note ' + i + ' has X value'); + ok(note.getYs().length > 0, 'Note ' + i + ' has Y values'); + } +} +function drawHarmonicAndMuted(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 1000, 180); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_12__.Stave(10, 10, 950); + stave.setContext(ctx); + stave.draw(); + const noteStructs = [ + { keys: ['c/4', 'e/4', 'a/4'], duration: '1/2h' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: 'wh' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: 'hh' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: 'qh' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '8h' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '16h' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '32h' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '64h' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '128h' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '1/2h', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: 'wh', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: 'hh', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: 'qh', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '8h', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '16h', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '32h', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '64h', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '128h', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '1/2m' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: 'wm' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: 'hm' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: 'qm' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '8m' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '16m' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '32m' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '64m' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '128m' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '1/2m', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: 'wm', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: 'hm', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: 'qm', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '8m', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '16m', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '32m', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '64m', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '128m', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + ]; + expect(noteStructs.length * 2); + for (let i = 0; i < noteStructs.length; ++i) { + const note = draw(staveNote(noteStructs[i]), stave, ctx, i * 25 + 5); + ok(note.getX() > 0, 'Note ' + i + ' has X value'); + ok(note.getYs().length > 0, 'Note ' + i + ' has Y values'); + } +} +function drawSlash(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 700, 180); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_12__.Stave(10, 10, 650); + stave.setContext(ctx); + stave.draw(); + const notes = [ + { keys: ['b/4'], duration: '1/2s', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['b/4'], duration: 'ws', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['b/4'], duration: 'hs', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['b/4'], duration: 'qs', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['b/4'], duration: '8s', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['b/4'], duration: '16s', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['b/4'], duration: '32s', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['b/4'], duration: '64s', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['b/4'], duration: '128s', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['b/4'], duration: '1/2s', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }, + { keys: ['b/4'], duration: 'ws', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }, + { keys: ['b/4'], duration: 'hs', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }, + { keys: ['b/4'], duration: 'qs', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }, + { keys: ['b/4'], duration: '8s', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }, + { keys: ['b/4'], duration: '16s', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }, + { keys: ['b/4'], duration: '32s', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }, + { keys: ['b/4'], duration: '64s', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }, + { keys: ['b/4'], duration: '128s', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }, + // Beam + { keys: ['b/4'], duration: '8s', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['b/4'], duration: '8s', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['b/4'], duration: '8s', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }, + { keys: ['b/4'], duration: '8s', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }, + ]; + const stave_notes = notes.map((struct) => new _src_stavenote__WEBPACK_IMPORTED_MODULE_13__.StaveNote(struct)); + const beam1 = new _src_beam__WEBPACK_IMPORTED_MODULE_4__.Beam([stave_notes[16], stave_notes[17]]); + const beam2 = new _src_beam__WEBPACK_IMPORTED_MODULE_4__.Beam([stave_notes[18], stave_notes[19]]); + _src_formatter__WEBPACK_IMPORTED_MODULE_7__.Formatter.FormatAndDraw(ctx, stave, stave_notes, false); + beam1.setContext(ctx).draw(); + beam2.setContext(ctx).draw(); + ok('Slash Note Heads'); +} +function drawKeyStyles(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 300, 280); + ctx.scale(3, 3); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_12__.Stave(10, 0, 100); + const note = new _src_stavenote__WEBPACK_IMPORTED_MODULE_13__.StaveNote({ keys: ['g/4', 'bb/4', 'd/5'], duration: 'q' }) + .setStave(stave) + .addModifier(new _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental('b'), 1) + .setKeyStyle(1, { shadowBlur: 2, shadowColor: 'blue', fillStyle: 'blue' }); + new _src_tickcontext__WEBPACK_IMPORTED_MODULE_17__.TickContext().addTickable(note).preFormat().setX(25); + stave.setContext(ctx).draw(); + note.setContext(ctx).draw(); + ok(note.getX() > 0, 'Note has X value'); + ok(note.getYs().length > 0, 'Note has Y values'); +} +function drawNoteStyles(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 300, 280); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_12__.Stave(10, 0, 100); + ctx.scale(3, 3); + const note = new _src_stavenote__WEBPACK_IMPORTED_MODULE_13__.StaveNote({ keys: ['g/4', 'bb/4', 'd/5'], duration: '8' }) + .setStave(stave) + .addModifier(new _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental('b'), 1); + note.setStyle({ shadowBlur: 2, shadowColor: 'blue', fillStyle: 'blue', strokeStyle: 'blue' }); + new _src_tickcontext__WEBPACK_IMPORTED_MODULE_17__.TickContext().addTickable(note).preFormat().setX(25); + stave.setContext(ctx).draw(); + note.setContext(ctx).draw(); + ok(note.getX() > 0, 'Note has X value'); + ok(note.getYs().length > 0, 'Note has Y values'); +} +function drawNoteStemStyles(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 300, 280); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_12__.Stave(10, 0, 100); + ctx.scale(3, 3); + const note = new _src_stavenote__WEBPACK_IMPORTED_MODULE_13__.StaveNote({ keys: ['g/4', 'bb/4', 'd/5'], duration: 'q' }) + .setStave(stave) + .addModifier(new _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental('b'), 1); + note.setStemStyle({ shadowBlur: 2, shadowColor: 'blue', fillStyle: 'blue', strokeStyle: 'blue' }); + new _src_tickcontext__WEBPACK_IMPORTED_MODULE_17__.TickContext().addTickable(note).preFormat().setX(25); + stave.setContext(ctx).draw(); + note.setContext(ctx).draw(); + ok('Note Stem Style'); +} +function drawNoteStemLengths(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 975, 150); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_12__.Stave(10, 10, 975); + stave.setContext(ctx).draw(); + const keys = [ + 'e/3', + 'f/3', + 'g/3', + 'a/3', + 'b/3', + 'c/4', + 'd/4', + 'e/4', + 'f/4', + 'g/4', + 'f/5', + 'g/5', + 'a/5', + 'b/5', + 'c/6', + 'd/6', + 'e/6', + 'f/6', + 'g/6', + 'a/6', + ]; + const notes = []; + let note; + let i; + for (i = 0; i < keys.length; i++) { + let duration = 'q'; + if (i % 2 === 1) { + duration = '8'; + } + note = new _src_stavenote__WEBPACK_IMPORTED_MODULE_13__.StaveNote({ keys: [keys[i]], duration, auto_stem: true }).setStave(stave); + new _src_tickcontext__WEBPACK_IMPORTED_MODULE_17__.TickContext().addTickable(note); + note.setContext(ctx); + notes.push(note); + } + const whole_keys = ['e/3', 'a/3', 'f/5', 'a/5', 'd/6', 'a/6']; + for (i = 0; i < whole_keys.length; i++) { + note = new _src_stavenote__WEBPACK_IMPORTED_MODULE_13__.StaveNote({ keys: [whole_keys[i]], duration: 'w' }).setStave(stave); + new _src_tickcontext__WEBPACK_IMPORTED_MODULE_17__.TickContext().addTickable(note); + note.setContext(ctx); + notes.push(note); + } + _src_formatter__WEBPACK_IMPORTED_MODULE_7__.Formatter.FormatAndDraw(ctx, stave, notes); + ok('Note Stem Length'); +} +function drawNoteStylesWithFlag(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 300, 280); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_12__.Stave(10, 0, 100); + ctx.scale(3, 3); + const note = new _src_stavenote__WEBPACK_IMPORTED_MODULE_13__.StaveNote({ keys: ['g/4', 'bb/4', 'd/5'], duration: '8' }) + .setStave(stave) + .addModifier(new _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental('b'), 1); + note.setFlagStyle({ shadowBlur: 2, shadowColor: 'blue', fillStyle: 'blue', strokeStyle: 'blue' }); + new _src_tickcontext__WEBPACK_IMPORTED_MODULE_17__.TickContext().addTickable(note).preFormat().setX(25); + stave.setContext(ctx).draw(); + note.setContext(ctx).draw(); + ok(note.getX() > 0, 'Note has X value'); + ok(note.getYs().length > 0, 'Note has Y values'); +} +function drawBeamStyles(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 160); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_12__.Stave(10, 10, 380); + stave.setStyle({ strokeStyle: '#EEAAEE', lineWidth: 3 }); + stave.setContext(ctx); + stave.draw(); + const notes = [ + // beam1 + { keys: ['b/4'], duration: '8', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['b/4'], duration: '8', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + // should be unstyled... + { keys: ['b/4'], duration: '8', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + // beam2 should also be unstyled + { keys: ['b/4'], duration: '8', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['b/4'], duration: '8', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + // beam3 + { keys: ['b/4'], duration: '8', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }, + { keys: ['b/4'], duration: '8', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }, + // beam4 + { keys: ['d/6'], duration: '8', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + { keys: ['c/6', 'd/6'], duration: '8', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + // unbeamed + { keys: ['d/6', 'e/6'], duration: '8', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + // unbeamed, unstyled + { keys: ['e/6', 'f/6'], duration: '8', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }, + ]; + const staveNotes = notes.map((note) => new _src_stavenote__WEBPACK_IMPORTED_MODULE_13__.StaveNote(note)); + const beam1 = new _src_beam__WEBPACK_IMPORTED_MODULE_4__.Beam(staveNotes.slice(0, 2)); + const beam2 = new _src_beam__WEBPACK_IMPORTED_MODULE_4__.Beam(staveNotes.slice(3, 5)); + const beam3 = new _src_beam__WEBPACK_IMPORTED_MODULE_4__.Beam(staveNotes.slice(5, 7)); + const beam4 = new _src_beam__WEBPACK_IMPORTED_MODULE_4__.Beam(staveNotes.slice(7, 9)); + // stem, key, ledger, flag; beam.setStyle + beam1.setStyle({ fillStyle: 'blue', strokeStyle: 'blue' }); + staveNotes[0].setKeyStyle(0, { fillStyle: 'purple' }); + staveNotes[0].setStemStyle({ strokeStyle: 'green' }); + staveNotes[1].setStemStyle({ strokeStyle: 'orange' }); + staveNotes[1].setKeyStyle(0, { fillStyle: 'darkturquoise' }); + staveNotes[5].setStyle({ fillStyle: 'tomato', strokeStyle: 'tomato' }); + beam3.setStyle({ shadowBlur: 4, shadowColor: 'blue' }); + staveNotes[9].setLedgerLineStyle({ fillStyle: 'lawngreen', strokeStyle: 'lawngreen', lineWidth: 1 }); + staveNotes[9].setFlagStyle({ fillStyle: 'orange', strokeStyle: 'orange' }); + _src_formatter__WEBPACK_IMPORTED_MODULE_7__.Formatter.FormatAndDraw(ctx, stave, staveNotes, false); + beam1.setContext(ctx).draw(); + beam2.setContext(ctx).draw(); + beam3.setContext(ctx).draw(); + beam4.setContext(ctx).draw(); + ok('draw beam styles'); +} +function dotsAndFlagsStemUp(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 800, 150); + ctx.scale(1.0, 1.0); + ctx.setFillStyle('#221'); + ctx.setStrokeStyle('#221'); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_12__.Stave(10, 10, 975); + const notes = [ + staveNote({ keys: ['f/4'], duration: '4', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }), + staveNote({ keys: ['f/4'], duration: '8', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }), + staveNote({ keys: ['f/4'], duration: '16', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }), + staveNote({ keys: ['f/4'], duration: '32', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }), + staveNote({ keys: ['f/4'], duration: '64', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }), + staveNote({ keys: ['f/4'], duration: '128', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }), + staveNote({ keys: ['g/4'], duration: '4', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }), + staveNote({ keys: ['g/4'], duration: '8', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }), + staveNote({ keys: ['g/4'], duration: '16', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }), + staveNote({ keys: ['g/4'], duration: '32' }), + staveNote({ keys: ['g/4'], duration: '64', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }), + staveNote({ keys: ['g/4'], duration: '128', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }), + ]; + _src_dot__WEBPACK_IMPORTED_MODULE_5__.Dot.buildAndAttach(notes, { all: true }); + _src_dot__WEBPACK_IMPORTED_MODULE_5__.Dot.buildAndAttach([notes[5], notes[11]], { all: true }); + stave.setContext(ctx).draw(); + for (let i = 0; i < notes.length; ++i) { + draw(notes[i], stave, ctx, i * 65); + } + ok(true, 'Full Dot'); +} +function dotsAndFlagsStemDown(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 800, 160); + ctx.scale(1.0, 1.0); + ctx.setFillStyle('#221'); + ctx.setStrokeStyle('#221'); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_12__.Stave(10, 10, 975); + const staveNotes = [ + staveNote({ keys: ['e/5'], duration: '4', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }), + staveNote({ keys: ['e/5'], duration: '8', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }), + staveNote({ keys: ['e/5'], duration: '16', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }), + staveNote({ keys: ['e/5'], duration: '32', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }), + staveNote({ keys: ['e/5'], duration: '64', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }), + staveNote({ keys: ['e/5'], duration: '128', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }), + staveNote({ keys: ['d/5'], duration: '4', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }), + staveNote({ keys: ['d/5'], duration: '8', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }), + staveNote({ keys: ['d/5'], duration: '16', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }), + staveNote({ keys: ['d/5'], duration: '32', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }), + staveNote({ keys: ['d/5'], duration: '64', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }), + staveNote({ keys: ['d/5'], duration: '128', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }), + ]; + _src_dot__WEBPACK_IMPORTED_MODULE_5__.Dot.buildAndAttach(staveNotes, { all: true }); + stave.setContext(ctx).draw(); + for (let i = 0; i < staveNotes.length; ++i) { + draw(staveNotes[i], stave, ctx, i * 65); + } + ok(true, 'Full Dot'); +} +function dotsAndBeamsUp(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 800, 150); + ctx.scale(1.0, 1.0); + ctx.setFillStyle('#221'); + ctx.setStrokeStyle('#221'); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_12__.Stave(10, 10, 975); + const staveNotes = [ + staveNote({ keys: ['f/4'], duration: '8', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }), + staveNote({ keys: ['f/4'], duration: '16', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }), + staveNote({ keys: ['f/4'], duration: '32', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }), + staveNote({ keys: ['f/4'], duration: '64', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }), + staveNote({ keys: ['f/4'], duration: '128', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }), + staveNote({ keys: ['g/4'], duration: '8', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }), + staveNote({ keys: ['g/4'], duration: '16', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }), + staveNote({ keys: ['g/4'], duration: '32' }), + staveNote({ keys: ['g/4'], duration: '64', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }), + staveNote({ keys: ['g/4'], duration: '128', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.UP }), + ]; + _src_dot__WEBPACK_IMPORTED_MODULE_5__.Dot.buildAndAttach(staveNotes, { all: true }); + _src_dot__WEBPACK_IMPORTED_MODULE_5__.Dot.buildAndAttach([staveNotes[4], staveNotes[9]], { all: true }); + const beam = new _src_beam__WEBPACK_IMPORTED_MODULE_4__.Beam(staveNotes); + stave.setContext(ctx).draw(); + for (let i = 0; i < staveNotes.length; ++i) { + draw(staveNotes[i], stave, ctx, i * 65); + } + beam.setContext(ctx).draw(); + ok(true, 'Full Dot'); +} +function dotsAndBeamsDown(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 800, 160); + ctx.scale(1.0, 1.0); + ctx.setFillStyle('#221'); + ctx.setStrokeStyle('#221'); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_12__.Stave(10, 10, 975); + const staveNotes = [ + staveNote({ keys: ['e/5'], duration: '8', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }), + staveNote({ keys: ['e/5'], duration: '16', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }), + staveNote({ keys: ['e/5'], duration: '32', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }), + staveNote({ keys: ['e/5'], duration: '64', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }), + staveNote({ keys: ['e/5'], duration: '128', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }), + staveNote({ keys: ['d/5'], duration: '8', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }), + staveNote({ keys: ['d/5'], duration: '16', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }), + staveNote({ keys: ['d/5'], duration: '32', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }), + staveNote({ keys: ['d/5'], duration: '64', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }), + staveNote({ keys: ['d/5'], duration: '128', stem_direction: _src_stem__WEBPACK_IMPORTED_MODULE_14__.Stem.DOWN }), + ]; + _src_dot__WEBPACK_IMPORTED_MODULE_5__.Dot.buildAndAttach(staveNotes, { all: true }); + const beam = new _src_beam__WEBPACK_IMPORTED_MODULE_4__.Beam(staveNotes); + stave.setContext(ctx).draw(); + for (let i = 0; i < staveNotes.length; ++i) { + draw(staveNotes[i], stave, ctx, i * 65); + } + beam.setContext(ctx).draw(); + ok(true, 'Full Dot'); +} +function centerAlignedRest(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 400, 160); + const stave = f.Stave({ x: 10, y: 10, width: 350 }).addClef('treble').addTimeSignature('4/4'); + const note = f.StaveNote({ keys: ['b/4'], duration: '1r', align_center: true }); + const voice = f.Voice().setStrict(false).addTickables([note]); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true); +} +function centerAlignedRestFermata(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 400, 160); + const stave = f.Stave({ x: 10, y: 10, width: 350 }).addClef('treble').addTimeSignature('4/4'); + const note = f + .StaveNote({ keys: ['b/4'], duration: '1r', align_center: true }) + .addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_3__.Articulation('a@a').setPosition(3), 0); + const voice = f.Voice().setStrict(false).addTickables([note]); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true); +} +function centerAlignedRestAnnotation(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 400, 160); + const stave = f.Stave({ x: 10, y: 10, width: 350 }).addClef('treble').addTimeSignature('4/4'); + const note = f + .StaveNote({ keys: ['b/4'], duration: '1r', align_center: true }) + .addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_2__.Annotation('Whole measure rest').setVerticalJustification(_src_annotation__WEBPACK_IMPORTED_MODULE_2__.AnnotationVerticalJustify.TOP), 0); + const voice = f.Voice().setStrict(false).addTickables([note]); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true); +} +function centerAlignedNoteMultiModifiers(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 400, 160); + const stave = f.Stave({ x: 10, y: 10, width: 350 }).addClef('treble').addTimeSignature('4/4'); + function newFinger(num, pos) { + return new _src_frethandfinger__WEBPACK_IMPORTED_MODULE_9__.FretHandFinger(num).setPosition(pos); + } + const note = f + .StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: '4', align_center: true }) + .addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_2__.Annotation('Test').setPosition(3), 0) + .addStroke(0, new _src_strokes__WEBPACK_IMPORTED_MODULE_16__.Stroke(2)) + .addModifier(new _src_accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental('#'), 1) + .addModifier(newFinger('3', _src_modifier__WEBPACK_IMPORTED_MODULE_10__.Modifier.Position.LEFT), 0) + .addModifier(newFinger('2', _src_modifier__WEBPACK_IMPORTED_MODULE_10__.Modifier.Position.LEFT), 2) + .addModifier(newFinger('1', _src_modifier__WEBPACK_IMPORTED_MODULE_10__.Modifier.Position.RIGHT), 1) + .addModifier(new _src_stringnumber__WEBPACK_IMPORTED_MODULE_15__.StringNumber('4').setPosition(_src_modifier__WEBPACK_IMPORTED_MODULE_10__.Modifier.Position.BELOW), 2); + _src_dot__WEBPACK_IMPORTED_MODULE_5__.Dot.buildAndAttach([note], { all: true }); + const voice = f.Voice().setStrict(false).addTickables([note]); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true); +} +function centerAlignedMultiVoice(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 400, 160); + const stave = f.Stave({ x: 10, y: 10, width: 350 }).addClef('treble').addTimeSignature('3/8'); + // Set a custom duration of 3 / 8. + const custom_duration = new _src_fraction__WEBPACK_IMPORTED_MODULE_8__.Fraction(3, 8); + // TODO: Should the whole rest draw a ledger line that is visible to the left/right of the rest? + const notes0 = [ + f.StaveNote({ + keys: ['c/4'], + duration: '1r', + align_center: true, + duration_override: custom_duration, + }), + ]; + const createStaveNote = (struct) => f.StaveNote(struct); + const notes1 = [ + { keys: ['b/4'], duration: '8' }, + { keys: ['b/4'], duration: '8' }, + { keys: ['b/4'], duration: '8' }, + ].map(createStaveNote); + notes1[1].addModifier(f.Accidental({ type: '#' }), 0); + f.Beam({ notes: notes1 }); + const voice0 = f.Voice({ time: '3/8' }).setStrict(false).addTickables(notes0); + const voice1 = f.Voice({ time: '3/8' }).setStrict(false).addTickables(notes1); + f.Formatter().joinVoices([voice0, voice1]).formatToStave([voice0, voice1], stave); + f.draw(); + ok(true); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(StaveNoteTests); + + + +/***/ }), + +/***/ "./tests/stavetie_tests.ts": +/*!*********************************!*\ + !*** ./tests/stavetie_tests.ts ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StaveTieTests": () => (/* binding */ StaveTieTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_stem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/stem */ "./src/stem.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// StaveTie Tests + + +const StaveTieTests = { + Start() { + QUnit.module('StaveTie'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Simple StaveTie', simple); + run('Chord StaveTie', chord); + run('Stem Up StaveTie', stemUp); + run('No End Note With Clef', noEndNote1); + run('No End Note', noEndNote2); + run('No Start Note With Clef', noStartNote1); + run('No Start Note', noStartNote2); + run('Set Direction Down', setDirectionDown); + run('Set Direction Up', setDirectionUp); + }, +}; +/** + * Used by the 7 tests below to set up the stave, easyscore, notes, voice, and to format & draw. + */ +function createTest(notesData, setupTies) { + return (options) => { + const factory = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 300); + const stave = factory.Stave(); + const score = factory.EasyScore(); + const notes = score.notes(notesData[0], notesData[1]); + const voice = score.voice(notes); + // const tickables = voice.getTickables(); // same as the notes that we passed in. + setupTies(factory, notes, stave); + factory.Formatter().joinVoices([voice]).formatToStave([voice], stave); + factory.draw(); + ok(true); + }; +} +const simple = createTest(['(cb4 e#4 a4)/2, (d4 e4 f4)', { stem: 'down' }], (f, notes) => { + f.StaveTie({ + from: notes[0], + to: notes[1], + first_indices: [0, 1], + last_indices: [0, 1], + }); +}); +const chord = createTest(['(d4 e4 f4)/2, (cn4 f#4 a4)', { stem: 'down' }], (f, notes) => { + f.StaveTie({ + from: notes[0], + to: notes[1], + first_indices: [0, 1, 2], + last_indices: [0, 1, 2], + }); +}); +const stemUp = createTest(['(d4 e4 f4)/2, (cn4 f#4 a4)', { stem: 'up' }], (f, notes) => { + f.StaveTie({ + from: notes[0], + to: notes[1], + first_indices: [0, 1, 2], + last_indices: [0, 1, 2], + }); +}); +const noEndNote1 = createTest(['(cb4 e#4 a4)/2, (d4 e4 f4)', { stem: 'down' }], (f, notes, stave) => { + stave.addEndClef('treble'); + f.StaveTie({ + from: notes[1], + first_indices: [2], + last_indices: [2], + text: 'slow.', + }); +}); +const noEndNote2 = createTest(['(cb4 e#4 a4)/2, (d4 e4 f4)', { stem: 'down' }], (f, notes) => { + f.StaveTie({ + from: notes[1], + first_indices: [2], + last_indices: [2], + text: 'slow.', + }); +}); +const noStartNote1 = createTest(['(cb4 e#4 a4)/2, (d4 e4 f4)', { stem: 'down' }], (f, notes, stave) => { + stave.addClef('treble'); + f.StaveTie({ + to: notes[0], + first_indices: [2], + last_indices: [2], + text: 'H', + }); +}); +const noStartNote2 = createTest(['(cb4 e#4 a4)/2, (d4 e4 f4)', { stem: 'down' }], (f, notes) => { + f.StaveTie({ + to: notes[0], + first_indices: [2], + last_indices: [2], + text: 'H', + }); +}); +const setDirectionDown = createTest(['(cb4 e#4 a4)/2, (d4 e4 f4)', { stem: 'down' }], (f, notes) => { + f.StaveTie({ + from: notes[0], + to: notes[1], + first_indices: [0, 1], + last_indices: [0, 1], + options: { direction: _src_stem__WEBPACK_IMPORTED_MODULE_1__.Stem.DOWN }, + }); +}); +const setDirectionUp = createTest(['(cb4 e#4 a4)/2, (d4 e4 f4)', { stem: 'down' }], (f, notes) => { + f.StaveTie({ + from: notes[0], + to: notes[1], + first_indices: [0, 1], + last_indices: [0, 1], + options: { direction: _src_stem__WEBPACK_IMPORTED_MODULE_1__.Stem.UP }, + }); +}); +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(StaveTieTests); + + + +/***/ }), + +/***/ "./tests/stringnumber_tests.ts": +/*!*************************************!*\ + !*** ./tests/stringnumber_tests.ts ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StringNumberTests": () => (/* binding */ StringNumberTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_glyph__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/glyph */ "./src/glyph.ts"); +/* harmony import */ var _src_renderer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/renderer */ "./src/renderer.ts"); +/* harmony import */ var _src_stave__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/stave */ "./src/stave.ts"); +/* harmony import */ var _src_stavebarline__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/stavebarline */ "./src/stavebarline.ts"); +/* harmony import */ var _src_strokes__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/strokes */ "./src/strokes.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// StringNumber Tests + + + + + + +const StringNumberTests = { + Start() { + QUnit.module('StringNumber'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('String Number In Notation', drawMultipleMeasures); + run('Fret Hand Finger In Notation', drawFretHandFingers); + run('Multi Voice With Strokes, String & Finger Numbers', multi); + run('Complex Measure With String & Finger Numbers', drawAccidentals); + }, +}; +function drawMultipleMeasures(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 775, 200); + const score = f.EasyScore(); + // bar 1 + const stave1 = f.Stave({ width: 300 }).setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.DOUBLE).addClef('treble'); + const notes1 = score.notes('(c4 e4 g4)/4., (c5 e5 g5)/8, (c4 f4 g4)/4, (c4 f4 g4)/4', { stem: 'down' }); + notes1[0] + .addModifier(f.StringNumber({ number: '5', position: 'right' }), 0) + .addModifier(f.StringNumber({ number: '4', position: 'left' }), 1) + .addModifier(f.StringNumber({ number: '3', position: 'right' }), 2); + notes1[1] + .addModifier(f.Accidental({ type: '#' }), 0) + .addModifier(f.StringNumber({ number: '5', position: 'below' }), 0) + .addModifier(f.Accidental({ type: '#' }).setAsCautionary(), 1) + .addModifier(f + .StringNumber({ number: '3', position: 'above' }) + .setLastNote(notes1[3]) + .setLineEndType(_src_renderer__WEBPACK_IMPORTED_MODULE_2__.Renderer.LineEndType.DOWN), 2); + notes1[2] + .addModifier(f.StringNumber({ number: '5', position: 'left' }), 0) + .addModifier(f.StringNumber({ number: '3', position: 'left' }), 2) + .addModifier(f.Accidental({ type: '#' }), 1); + notes1[3] + .addModifier(f.StringNumber({ number: '5', position: 'right' }).setOffsetY(7), 0) + .addModifier(f.StringNumber({ number: '4', position: 'right' }).setOffsetY(6), 1) + .addModifier(f.StringNumber({ number: '3', position: 'right' }).setOffsetY(-6), 2); + const voice1 = score.voice(notes1); + f.Formatter().joinVoices([voice1]).formatToStave([voice1], stave1); + // bar 2 - juxtaposing second bar next to first bar + const stave2 = f + .Stave({ x: stave1.getWidth() + stave1.getX(), y: stave1.getY(), width: 300 }) + .setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.DOUBLE); + const notes2 = score.notes('(c4 e4 g4)/4, (c5 e5 g5), (c4 f4 g4), (c4 f4 g4)', { stem: 'up' }); + notes2[0] + .addModifier(f.StringNumber({ number: '5', position: 'right' }), 0) + .addModifier(f.StringNumber({ number: '4', position: 'left' }), 1) + .addModifier(f.StringNumber({ number: '3', position: 'right' }), 2); + notes2[1] + .addModifier(f.Accidental({ type: '#' }), 0) + .addModifier(f.StringNumber({ number: '5', position: 'below' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1) + .addModifier(f.StringNumber({ number: '3', position: 'above' }).setLastNote(notes2[3]).setDashed(false), 2); + notes2[2] + .addModifier(f.StringNumber({ number: '3', position: 'left' }), 2) + .addModifier(f.Accidental({ type: '#' }), 1); + notes2[3] + .addModifier(f.StringNumber({ number: '5', position: 'right' }).setOffsetY(7), 0) + .addModifier(f.StringNumber({ number: '4', position: 'right' }).setOffsetY(6), 1) + .addModifier(f.StringNumber({ number: '3', position: 'right' }).setOffsetY(-6), 2); + const voice2 = score.voice(notes2); + f.Formatter().joinVoices([voice2]).formatToStave([voice2], stave2); + // bar 3 - juxtaposing third bar next to second bar + const stave3 = f + .Stave({ x: stave2.getWidth() + stave2.getX(), y: stave2.getY(), width: 150 }) + .setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.END); + const notesBar3 = score.notes('(c4 e4 g4 a4)/1.'); + notesBar3[0] + .addModifier(f.StringNumber({ number: '5', position: 'below' }), 0) + .addModifier(f.StringNumber({ number: '4', position: 'right' }), 1) + .addModifier(f.StringNumber({ number: '3', position: 'left' }), 2) + .addModifier(f.StringNumber({ number: '2', position: 'above' }), 3); + const voice3 = score.voice(notesBar3, { time: '6/4' }); + f.Formatter().joinVoices([voice3]).formatToStave([voice3], stave3); + f.draw(); + ok(true, 'String Number'); +} +function drawFretHandFingers(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 725, 200); + const score = f.EasyScore(); + // bar 1 + const stave1 = f.Stave({ width: 350 }).setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.DOUBLE).addClef('treble'); + const notes1 = score.notes('(c4 e4 g4)/4, (c5 e5 g5), (c4 f4 g4), (c4 f4 g4)', { stem: 'down' }); + notes1[0] + .addModifier(f.Fingering({ number: '3', position: 'left' }), 0) + .addModifier(f.Fingering({ number: '2', position: 'left' }), 1) + .addModifier(f.Fingering({ number: '0', position: 'left' }), 2); + notes1[1] + .addModifier(f.Accidental({ type: '#' }), 0) + .addModifier(f.Fingering({ number: '3', position: 'left' }), 0) + .addModifier(f.Fingering({ number: '2', position: 'left' }), 1) + .addModifier(f.Accidental({ type: '#' }), 1) + .addModifier(f.Fingering({ number: '0', position: 'left' }), 2); + notes1[2] + .addModifier(f.Fingering({ number: '3', position: 'below' }), 0) + .addModifier(f.Fingering({ number: '4', position: 'left' }), 1) + .addModifier(f.StringNumber({ number: '4', position: 'left' }), 1) + .addModifier(f.Fingering({ number: '0', position: 'above' }), 2) + .addModifier(f.Accidental({ type: '#' }), 1); + notes1[3] + .addModifier(f.Fingering({ number: '3', position: 'right' }), 0) + .addModifier(f.StringNumber({ number: '5', position: 'right' }).setOffsetY(7), 0) + .addModifier(f.Fingering({ number: '4', position: 'right' }), 1) + .addModifier(f.StringNumber({ number: '4', position: 'right' }).setOffsetY(6), 1) + .addModifier(f.Fingering({ number: '0', position: 'right' }).setOffsetY(-5), 2) + .addModifier(f.StringNumber({ number: '3', position: 'right' }).setOffsetY(-6), 2); + const voice1 = score.voice(notes1); + f.Formatter().joinVoices([voice1]).formatToStave([voice1], stave1); + // bar 2 - juxtaposing second bar next to first bar + const stave2 = f + .Stave({ x: stave1.getWidth() + stave1.getX(), y: stave1.getY(), width: 350 }) + .setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.END); + const notes2 = score.notes('(c4 e4 g4)/4., (c5 e5 g5)/8, (c4 f4 g4)/8, (c4 f4 g4)/4.[stem="down"]', { + stem: 'up', + }); + notes2[0] + .addModifier(f.Fingering({ number: '3', position: 'right' }), 0) + .addModifier(f.Fingering({ number: '2', position: 'left' }), 1) + .addModifier(f.StringNumber({ number: '4', position: 'right' }), 1) + .addModifier(f.Fingering({ number: '0', position: 'above' }), 2); + notes2[1] + .addModifier(f.Accidental({ type: '#' }), 0) + .addModifier(f.Fingering({ number: '3', position: 'right' }), 0) + .addModifier(f.Fingering({ number: '2', position: 'left' }), 1) + .addModifier(f.Accidental({ type: '#' }), 1) + .addModifier(f.Fingering({ number: '0', position: 'left' }), 2); + notes2[2] + .addModifier(f.Fingering({ number: '3', position: 'below' }), 0) + .addModifier(f.Fingering({ number: '2', position: 'left' }), 1) + .addModifier(f.StringNumber({ number: '4', position: 'left' }), 1) + .addModifier(f.Fingering({ number: '1', position: 'right' }), 2) + .addModifier(f.Accidental({ type: '#' }), 2); + notes2[3] + .addModifier(f.Fingering({ number: '3', position: 'right' }), 0) + .addModifier(f.StringNumber({ number: '5', position: 'right' }).setOffsetY(7), 0) + .addModifier(f.Fingering({ number: '4', position: 'right' }), 1) + .addModifier(f.StringNumber({ number: '4', position: 'right' }).setOffsetY(6), 1) + .addModifier(f.Fingering({ number: '1', position: 'right' }).setOffsetY(-6), 2) + .addModifier(f.StringNumber({ number: '3', position: 'right' }).setOffsetY(-6), 2); + const voice2 = score.voice(notes2); + f.Formatter().joinVoices([voice2]).formatToStave([voice2], stave2); + f.draw(); + ok(true, 'String Number'); +} +function multi(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 700, 200); + const score = f.EasyScore(); + const stave = f.Stave(); + const notes1 = score.notes('(c4 e4 g4)/4, (a3 e4 g4), (c4 d4 a4), (c4 d4 a4)', { stem: 'up' }); + notes1[0] + .addStroke(0, new _src_strokes__WEBPACK_IMPORTED_MODULE_5__.Stroke(5)) + .addModifier(f.Fingering({ number: '3', position: 'left' }), 0) + .addModifier(f.Fingering({ number: '2', position: 'left' }), 1) + .addModifier(f.Fingering({ number: '0', position: 'left' }), 2) + .addModifier(f.StringNumber({ number: '4', position: 'left' }), 1) + .addModifier(f.StringNumber({ number: '3', position: 'above' }), 2); + notes1[1] + .addStroke(0, new _src_strokes__WEBPACK_IMPORTED_MODULE_5__.Stroke(6)) + .addModifier(f.StringNumber({ number: '4', position: 'right' }), 1) + .addModifier(f.StringNumber({ number: '3', position: 'above' }), 2) + .addModifier(f.Accidental({ type: '#' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1) + .addModifier(f.Accidental({ type: '#' }), 2); + notes1[2] + .addStroke(0, new _src_strokes__WEBPACK_IMPORTED_MODULE_5__.Stroke(2)) + .addModifier(f.Fingering({ number: '3', position: 'left' }), 0) + .addModifier(f.Fingering({ number: '0', position: 'right' }), 1) + .addModifier(f.StringNumber({ number: '4', position: 'right' }), 1) + .addModifier(f.Fingering({ number: '1', position: 'left' }), 2) + .addModifier(f.StringNumber({ number: '3', position: 'right' }), 2); + notes1[3] + .addStroke(0, new _src_strokes__WEBPACK_IMPORTED_MODULE_5__.Stroke(1)) + .addModifier(f.StringNumber({ number: '3', position: 'left' }), 2) + .addModifier(f.StringNumber({ number: '4', position: 'right' }), 1); + const notes2 = score.notes('e3/8, e3, e3, e3, e3, e3, e3, e3', { stem: 'down' }); + notes2[0] + .addModifier(f.Fingering({ number: '0', position: 'left' }), 0) + .addModifier(f.StringNumber({ number: '6', position: 'below' }), 0); + notes2[2].addModifier(f.Accidental({ type: '#' }), 0); + notes2[4].addModifier(f.Fingering({ number: '0', position: 'left' }), 0); + // Position string number 6 beneath the strum arrow: left (15) and down (18) + notes2[4].addModifier(f.StringNumber({ number: '6', position: 'left' }).setOffsetX(15).setOffsetY(18), 0); + // Important Note: notes2 must come first, otherwise ledger lines from notes2 will be drawn on top of notes from notes1! + // BUG: VexFlow draws TWO ledger lines for middle C, because both notes1 and notes2 require the middle C ledger line. + const voices = [score.voice(notes2), score.voice(notes1)]; + f.Formatter().joinVoices(voices).formatToStave(voices, stave); + f.Beam({ notes: notes2.slice(0, 4) }); + f.Beam({ notes: notes2.slice(4, 8) }); + f.draw(); + ok(true, 'Strokes Test Multi Voice'); +} +function drawAccidentals(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 750); + const glyphScale = 39; // default font scale + const clefWidth = _src_glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.getWidth('gClef', glyphScale); // widest clef + const notes = [ + f.StaveNote({ keys: ['c/4', 'e/4', 'g/4', 'c/5', 'e/5', 'g/5'], stem_direction: 1, duration: '4' }), + f.StaveNote({ keys: ['c/4', 'e/4', 'g/4', 'd/5', 'e/5', 'g/5'], stem_direction: 1, duration: '4' }), + f.StaveNote({ keys: ['c/4', 'e/4', 'g/4', 'd/5', 'e/5', 'g/5'], stem_direction: -1, duration: '4' }), + f.StaveNote({ keys: ['c/4', 'e/4', 'g/4', 'd/5', 'e/5', 'g/5'], stem_direction: -1, duration: '4' }), + ]; + notes[0] + .addModifier(f.Fingering({ number: '3', position: 'left' }), 0) + .addModifier(f.Accidental({ type: '#' }), 0) + .addModifier(f.Fingering({ number: '2', position: 'left' }), 1) + .addModifier(f.StringNumber({ number: '2', position: 'left' }), 1) + .addModifier(f.Accidental({ type: '#' }), 1) + .addModifier(f.Fingering({ number: '0', position: 'left' }), 2) + .addModifier(f.Accidental({ type: '#' }), 2) + .addModifier(f.Fingering({ number: '3', position: 'left' }), 3) + .addModifier(f.Accidental({ type: '#' }), 3) + .addModifier(f.Fingering({ number: '2', position: 'right' }), 4) + .addModifier(f.StringNumber({ number: '3', position: 'right' }), 4) + .addModifier(f.Accidental({ type: '#' }), 4) + .addModifier(f.Fingering({ number: '0', position: 'left' }), 5) + .addModifier(f.Accidental({ type: '#' }), 5); + notes[1] + .addModifier(f.Accidental({ type: '#' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1) + .addModifier(f.Accidental({ type: '#' }), 2) + .addModifier(f.Accidental({ type: '#' }), 3) + .addModifier(f.Accidental({ type: '#' }), 4) + .addModifier(f.Accidental({ type: '#' }), 5); + notes[2] + .addModifier(f.Fingering({ number: '3', position: 'left' }), 0) + .addModifier(f.Accidental({ type: '#' }), 0) + .addModifier(f.Fingering({ number: '2', position: 'left' }), 1) + .addModifier(f.StringNumber({ number: '2', position: 'left' }), 1) + .addModifier(f.Accidental({ type: '#' }), 1) + .addModifier(f.Fingering({ number: '0', position: 'left' }), 2) + .addModifier(f.Accidental({ type: '#' }), 2) + .addModifier(f.Fingering({ number: '3', position: 'left' }), 3) + .addModifier(f.Accidental({ type: '#' }), 3) + .addModifier(f.Fingering({ number: '2', position: 'right' }), 4) + .addModifier(f.StringNumber({ number: '3', position: 'right' }), 4) + .addModifier(f.Accidental({ type: '#' }), 4) + .addModifier(f.Fingering({ number: '0', position: 'left' }), 5) + .addModifier(f.Accidental({ type: '#' }), 5); + notes[3] + .addModifier(f.Accidental({ type: '#' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1) + .addModifier(f.Accidental({ type: '#' }), 2) + .addModifier(f.Accidental({ type: '#' }), 3) + .addModifier(f.Accidental({ type: '#' }), 4) + .addModifier(f.Accidental({ type: '#' }), 5); + const voice = f.Voice().addTickables(notes); + const ctx = f.getContext(); + const formatter = f.Formatter().joinVoices([voice]); + const stavePadding = clefWidth + _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave.defaultPadding + 10; + const nwidth = Math.max(formatter.preCalculateMinTotalWidth([voice]), 490 - stavePadding); + formatter.format([voice], nwidth); + const stave = f + .Stave({ x: 0, y: 0, width: nwidth + stavePadding }) + .setContext(ctx) + .setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.BarlineType.DOUBLE) + .addClef('treble') + .draw(); + voice.draw(ctx, stave); + ok(true, 'String Number'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(StringNumberTests); + + + +/***/ }), + +/***/ "./tests/strokes_tests.ts": +/*!********************************!*\ + !*** ./tests/strokes_tests.ts ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StrokesTests": () => (/* binding */ StrokesTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/index */ "./src/index.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Strokes Tests + + +const StrokesTests = { + Start() { + QUnit.module('Strokes'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + // TODO: Rename tests by removing 'Strokes - ' since it is redundant with the module name. + // This will make flow.html easier to read. + run('Strokes - Brush/Roll/Rasquedo', brushRollRasquedo); + run('Strokes - Arpeggio directionless (without arrows)', arpeggioDirectionless); + run('Strokes - Multi Voice', multiVoice); + run('Strokes - Notation and Tab', notesWithTab); + run('Strokes - Multi-Voice Notation and Tab', multiNotationAndTab); + }, +}; +function brushRollRasquedo(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 200); + const score = f.EasyScore(); + // bar 1 + const stave1 = f.Stave({ width: 250 }).setEndBarType(_src_index__WEBPACK_IMPORTED_MODULE_1__.Barline.type.DOUBLE); + const notes1 = score.notes('(a3 e4 a4)/4, (c4 e4 g4), (c4 e4 g4), (c4 e4 g4)', { stem: 'up' }); + notes1[0].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(1)); + notes1[1] + .addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(2)) + .addModifier(f.Accidental({ type: '#' }), 1) + .addModifier(f.Accidental({ type: '#' }), 2) + .addModifier(f.Accidental({ type: '#' }), 0); + notes1[2].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(1)); + notes1[3].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(2)); + const voice1 = score.voice(notes1); + f.Formatter().joinVoices([voice1]).formatToStave([voice1], stave1); + // bar 2 + const stave2 = f + .Stave({ x: stave1.getWidth() + stave1.getX(), y: stave1.getY(), width: 300 }) + .setEndBarType(_src_index__WEBPACK_IMPORTED_MODULE_1__.Barline.type.DOUBLE); + const notes2 = score.notes('(c4 d4 g4)/4, (c4 d4 g4), (c4 d4 g4), (c4 d4 a4)', { stem: 'up' }); + notes2[0].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(3)); + notes2[1].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(4)); + notes2[2].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(5)); + notes2[3] + .addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(6)) + .addModifier(f.Accidental({ type: 'bb' }), 0) + .addModifier(f.Accidental({ type: 'bb' }), 1) + .addModifier(f.Accidental({ type: 'bb' }), 2); + const voice2 = score.voice(notes2); + f.Formatter().joinVoices([voice2]).formatToStave([voice2], stave2); + f.draw(); + ok(true, 'Brush/Roll/Rasquedo'); +} +function arpeggioDirectionless(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 700, 200); + const score = f.EasyScore(); + // bar 1 + const stave1 = f.Stave({ x: 100, width: 500 }).setEndBarType(_src_index__WEBPACK_IMPORTED_MODULE_1__.Barline.type.DOUBLE); + const notes1 = score.notes('(g4 b4 d5)/4, (g4 b4 d5 g5), (g4 b4 d5 g5), (g4 b4 d5)', { stem: 'up' }); + const graceNoteStructs = [ + { keys: ['e/4'], duration: '32' }, + { keys: ['f/4'], duration: '32' }, + { keys: ['g/4'], duration: '32' }, + ]; + const graceNotes = graceNoteStructs.map((graceNoteStruct) => f.GraceNote(graceNoteStruct)); + const graceNoteGroup = f.GraceNoteGroup({ notes: graceNotes, slur: false }); + graceNoteGroup.beamNotes(); + notes1[0].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(7)); + notes1[1] + .addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(7)) + .addModifier(f.Accidental({ type: '#' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1) + .addModifier(f.Accidental({ type: '#' }), 2) + .addModifier(f.Accidental({ type: '#' }), 3); + notes1[2] + .addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(7)) + .addModifier(f.Accidental({ type: 'b' }), 1) + .addModifier(graceNoteGroup, 0); + notes1[3].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(7)).addModifier(f.NoteSubGroup({ + notes: [f.ClefNote({ type: 'treble', options: { size: 'default', annotation: '8va' } })], + }), 0); + const voice1 = score.voice(notes1); + f.Formatter().joinVoices([voice1]).formatToStave([voice1], stave1); + f.draw(); + ok(true, 'Arpeggio directionless (without arrows)'); +} +function multiVoice(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 500, 200); + const score = f.EasyScore(); + const stave = f.Stave(); + const notes1 = score.notes('(c4 e4 g4)/4, (c4 e4 g4), (c4 d4 a4), (c4 d4 a4)', { stem: 'up' }); + notes1[0].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(5)); + notes1[1] + .addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(6)) + .addModifier(f.Accidental({ type: '#' }), 0) + .addModifier(f.Accidental({ type: '#' }), 2); + notes1[2].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(2)); + notes1[3].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(1)); + const notes2 = score.notes('e3/8, e3, e3, e3, e3, e3, e3, e3', { stem: 'down' }); + f.Beam({ notes: notes2.slice(0, 4) }); + f.Beam({ notes: notes2.slice(4, 8) }); + const voices = [notes1, notes2].map((notes) => score.voice(notes)); + f.Formatter().joinVoices(voices).formatToStave(voices, stave); + f.draw(); + ok(true, 'Strokes Test Multi Voice'); +} +function multiNotationAndTab(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 400, 275); + const score = f.EasyScore(); + const stave = f.Stave().addClef('treble'); + // notation upper voice notes + const notes1 = score.notes('(g4 b4 e5)/4, (g4 b4 e5), (g4 b4 e5), (g4 b4 e5)', { stem: 'up' }); + notes1[0].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(3, { all_voices: false })); + notes1[1].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(6)); + notes1[2].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(2, { all_voices: false })); + notes1[3].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(1)); + const notes2 = score.notes('g3/4, g3, g3, g3', { stem: 'down' }); + f.TabStave({ y: 100 }).addClef('tab').setNoteStartX(stave.getNoteStartX()); + // tablature upper voice notes + const tabNotes1 = [ + f.TabNote({ + positions: [ + { str: 3, fret: 0 }, + { str: 2, fret: 0 }, + { str: 1, fret: 1 }, + ], + duration: '4', + }), + f.TabNote({ + positions: [ + { str: 3, fret: 0 }, + { str: 2, fret: 0 }, + { str: 1, fret: 1 }, + ], + duration: '4', + }), + f.TabNote({ + positions: [ + { str: 3, fret: 0 }, + { str: 2, fret: 0 }, + { str: 1, fret: 1 }, + ], + duration: '4', + }), + f.TabNote({ + positions: [ + { str: 3, fret: 0 }, + { str: 2, fret: 0 }, + { str: 1, fret: 1 }, + ], + duration: '4', + }), + ]; + tabNotes1[0].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(3, { all_voices: false })); + tabNotes1[1].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(6)); + tabNotes1[2].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(2, { all_voices: false })); + tabNotes1[3].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(1)); + const tabNotes2 = [ + f.TabNote({ positions: [{ str: 6, fret: 3 }], duration: '4' }), + f.TabNote({ positions: [{ str: 6, fret: 3 }], duration: '4' }), + f.TabNote({ positions: [{ str: 6, fret: 3 }], duration: '4' }), + f.TabNote({ positions: [{ str: 6, fret: 3 }], duration: '4' }), + ]; + const voices = [notes1, notes2, tabNotes1, tabNotes2].map((notes) => score.voice(notes)); + f.Formatter().joinVoices(voices).formatToStave(voices, stave); + f.draw(); + ok(true, 'Strokes Test Notation & Tab Multi Voice'); +} +/* +function drawTabStrokes(options: TestOptions): void { + const f = VexFlowTests.makeFactory(options, 600, 200); + const stave1 = f.TabStave({ width: 250 }).setEndBarType(Barline.type.DOUBLE); + + const tabNotes1 = [ + f.TabNote({ + positions: [ + { str: 2, fret: 8 }, + { str: 3, fret: 9 }, + { str: 4, fret: 10 }, + ], + duration: '4', + }), + f.TabNote({ + positions: [ + { str: 3, fret: 7 }, + { str: 4, fret: 8 }, + { str: 5, fret: 9 }, + ], + duration: '4', + }), + f.TabNote({ + positions: [ + { str: 1, fret: 5 }, + { str: 2, fret: 6 }, + { str: 3, fret: 7 }, + { str: 4, fret: 7 }, + { str: 5, fret: 5 }, + { str: 6, fret: 5 }, + ], + duration: '4', + }), + f.TabNote({ + positions: [ + { str: 4, fret: 3 }, + { str: 5, fret: 4 }, + { str: 6, fret: 5 }, + ], + duration: '4', + }), + ]; + + tabNotes1[0].addStroke(0, new Stroke(1)); + tabNotes1[1].addStroke(0, new Stroke(2)); + tabNotes1[2].addStroke(0, new Stroke(3)); + tabNotes1[3].addStroke(0, new Stroke(4)); + + const tabVoice1 = f.Voice().addTickables(tabNotes1); + + f.Formatter().joinVoices([tabVoice1]).formatToStave([tabVoice1], stave1); + + // bar 2 + const stave2 = f.TabStave({ x: stave1.getWidth() + stave1.getX(), width: 300 }).setEndBarType(Barline.type.DOUBLE); + + const tabNotes2 = [ + f.TabNote({ + positions: [ + { str: 2, fret: 7 }, + { str: 3, fret: 8 }, + { str: 4, fret: 9 }, + ], + duration: '2', + }), + f.TabNote({ + positions: [ + { str: 1, fret: 5 }, + { str: 2, fret: 6 }, + { str: 3, fret: 7 }, + { str: 4, fret: 7 }, + { str: 5, fret: 5 }, + { str: 6, fret: 5 }, + ], + duration: '2', + }), + ]; + + tabNotes2[0].addStroke(0, new Stroke(6)); + tabNotes2[1].addStroke(0, new Stroke(5)); + + const tabVoice2 = f.Voice().addTickables(tabNotes2); + + f.Formatter().joinVoices([tabVoice2]).formatToStave([tabVoice2], stave2); + + f.draw(); + + ok(true, 'Strokes Tab test'); +} +*/ +function notesWithTab(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 500, 300); + const stave = f.Stave({ x: 15, y: 40, width: 450 }).addClef('treble'); + const notes = [ + f + .StaveNote({ keys: ['b/4', 'd/5', 'g/5'], stem_direction: -1, duration: '4' }) + .addModifier(f.Accidental({ type: 'b' }), 1) + .addModifier(f.Accidental({ type: 'b' }), 0), + f.StaveNote({ keys: ['c/5', 'd/5'], stem_direction: -1, duration: '4' }), + f.StaveNote({ keys: ['b/3', 'e/4', 'a/4', 'd/5'], stem_direction: 1, duration: '8' }), + f + .StaveNote({ keys: ['a/3', 'e/4', 'a/4', 'c/5', 'e/5', 'a/5'], stem_direction: 1, duration: '8' }) + .addModifier(f.Accidental({ type: '#' }), 3), + f.StaveNote({ keys: ['b/3', 'e/4', 'a/4', 'd/5'], stem_direction: 1, duration: '8' }), + f + .StaveNote({ keys: ['a/3', 'e/4', 'a/4', 'c/5', 'f/5', 'a/5'], stem_direction: 1, duration: '8' }) + .addModifier(f.Accidental({ type: '#' }), 3) + .addModifier(f.Accidental({ type: '#' }), 4), + ]; + const tabstave = f + .TabStave({ x: stave.getX(), y: 140, width: 450 }) + .addClef('tab') + .setNoteStartX(stave.getNoteStartX()); + const tabNotes = [ + f + .TabNote({ + positions: [ + { str: 1, fret: 3 }, + { str: 2, fret: 2 }, + { str: 3, fret: 3 }, + ], + duration: '4', + }) + .addModifier(new _src_index__WEBPACK_IMPORTED_MODULE_1__.Bend('Full'), 0), + f + .TabNote({ + positions: [ + { str: 2, fret: 3 }, + { str: 3, fret: 5 }, + ], + duration: '4', + }) + .addModifier(new _src_index__WEBPACK_IMPORTED_MODULE_1__.Bend('Unison'), 1), + f.TabNote({ + positions: [ + { str: 3, fret: 7 }, + { str: 4, fret: 7 }, + { str: 5, fret: 7 }, + { str: 6, fret: 7 }, + ], + duration: '8', + }), + f.TabNote({ + positions: [ + { str: 1, fret: 5 }, + { str: 2, fret: 5 }, + { str: 3, fret: 6 }, + { str: 4, fret: 7 }, + { str: 5, fret: 7 }, + { str: 6, fret: 5 }, + ], + duration: '8', + }), + f.TabNote({ + positions: [ + { str: 3, fret: 7 }, + { str: 4, fret: 7 }, + { str: 5, fret: 7 }, + { str: 6, fret: 7 }, + ], + duration: '8', + }), + f.TabNote({ + positions: [ + { str: 1, fret: 5 }, + { str: 2, fret: 5 }, + { str: 3, fret: 6 }, + { str: 4, fret: 7 }, + { str: 5, fret: 7 }, + { str: 6, fret: 5 }, + ], + duration: '8', + }), + ]; + notes[0].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(1)); + notes[1].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(2)); + notes[2].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(3)); + notes[3].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(4)); + notes[4].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(5)); + notes[5].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(6)); + tabNotes[0].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(1)); + tabNotes[1].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(2)); + tabNotes[2].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(3)); + tabNotes[3].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(4)); + tabNotes[4].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(5)); + tabNotes[5].addStroke(0, new _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke(6)); + f.StaveConnector({ + top_stave: stave, + bottom_stave: tabstave, + type: 'bracket', + }); + f.StaveConnector({ + top_stave: stave, + bottom_stave: tabstave, + type: 'single', + }); + const voice = f.Voice().addTickables(notes); + const tabVoice = f.Voice().addTickables(tabNotes); + const beams = _src_index__WEBPACK_IMPORTED_MODULE_1__.Beam.applyAndGetBeams(voice); + f.Formatter().joinVoices([voice]).joinVoices([tabVoice]).formatToStave([voice, tabVoice], stave); + f.draw(); + beams.forEach(function (beam) { + beam.setContext(f.getContext()).draw(); + }); + ok(true); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(StrokesTests); + + + +/***/ }), + +/***/ "./tests/style_tests.ts": +/*!******************************!*\ + !*** ./tests/style_tests.ts ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StyleTests": () => (/* binding */ StyleTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_annotation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/annotation */ "./src/annotation.ts"); +/* harmony import */ var _src_articulation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/articulation */ "./src/articulation.ts"); +/* harmony import */ var _src_bend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/bend */ "./src/bend.ts"); +/* harmony import */ var _src_formatter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/formatter */ "./src/formatter.ts"); +/* harmony import */ var _src_keysignature__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/keysignature */ "./src/keysignature.ts"); +/* harmony import */ var _src_notesubgroup__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/notesubgroup */ "./src/notesubgroup.ts"); +/* harmony import */ var _src_ornament__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/ornament */ "./src/ornament.ts"); +/* harmony import */ var _src_stavemodifier__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/stavemodifier */ "./src/stavemodifier.ts"); +/* harmony import */ var _src_strokes__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/strokes */ "./src/strokes.ts"); +/* harmony import */ var _src_tabnote__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/tabnote */ "./src/tabnote.ts"); +/* harmony import */ var _src_tabstave__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/tabstave */ "./src/tabstave.ts"); +/* harmony import */ var _src_timesignature__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../src/timesignature */ "./src/timesignature.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Style Tests +// TODO: The .addStroke(0, new Stroke(...)) in the tab test case shows a NO GLYPH for the Petaluma font. +// TODO: Changing ctx.font seems to have no effect in the tab test case. Should it? +// Annotation sets its own font. +// TabNote sets its own font. +// Is there a way to set all the text fonts in one go? + + + + + + + + + + + + + +const StyleTests = { + Start() { + QUnit.module('Style'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Basic Style', stave); + run('TabNote modifiers Style', tab); + }, +}; +/** + * Helper function to create a ElementStyle options object of the form { fillStyle: XXX, strokeStyle: YYY }. + * Used for updating the fillStyle and optionally the strokeStyle. + */ +function FS(fillStyle, strokeStyle) { + const ret = { fillStyle }; + if (strokeStyle) { + ret.strokeStyle = strokeStyle; + } + return ret; +} +/** + * Color elements on a stave. + */ +function stave(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 150); + const stave = f.Stave({ x: 25, y: 20, width: 500 }); + // Stave modifiers test. + const keySig = new _src_keysignature__WEBPACK_IMPORTED_MODULE_5__.KeySignature('D'); + keySig.addToStave(stave); + keySig.setStyle(FS('blue')); + stave.addTimeSignature('4/4'); + const timeSig = stave.getModifiers(_src_stavemodifier__WEBPACK_IMPORTED_MODULE_8__.StaveModifierPosition.BEGIN, _src_timesignature__WEBPACK_IMPORTED_MODULE_12__.TimeSignature.CATEGORY); + timeSig[0].setStyle(FS('brown')); + const notes = [ + f + .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], stem_direction: 1, duration: '4' }) + .addModifier(f.Accidental({ type: 'b' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1), + f + .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], stem_direction: 1, duration: '4' }) + .addModifier(f.Accidental({ type: 'b' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1), + f.StaveNote({ keys: ['e/4'], stem_direction: 1, duration: '4' }), + f.StaveNote({ keys: ['f/4'], stem_direction: 1, duration: '8' }), + // voice.draw() test. + f.TextDynamics({ text: 'sfz', duration: '16' }).setStyle(FS('blue')), + // GhostNote modifiers test. + f.GhostNote({ duration: '16' }).addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation('GhostNote green text').setStyle(FS('green')), 0), + ]; + const notes0 = notes[0]; + const notes1 = notes[1]; + notes0.setKeyStyle(0, FS('red')); + notes1.setKeyStyle(0, FS('red')); + // StaveNote modifiers test. + const mods1 = notes1.getModifiers(); + mods1[0].setStyle(FS('green')); + notes0.addModifier(new _src_articulation__WEBPACK_IMPORTED_MODULE_2__.Articulation('a.').setPosition(4).setStyle(FS('green')), 0); + notes0.addModifier(new _src_ornament__WEBPACK_IMPORTED_MODULE_7__.Ornament('mordent').setStyle(FS('lightgreen')), 0); + notes1.addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation('blue').setStyle(FS('blue')), 0); + notes1.addModifier(new _src_notesubgroup__WEBPACK_IMPORTED_MODULE_6__.NoteSubGroup([f.ClefNote({ options: { size: 'small' } }).setStyle(FS('blue'))]), 0); + const voice = f.Voice().addTickables(notes); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Basic Style'); +} +/** + * Color elements on a guitar tab. + */ +function tab(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 500, 140); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + ctx.font = '10pt Arial'; + const stave = new _src_tabstave__WEBPACK_IMPORTED_MODULE_11__.TabStave(10, 10, 450).addTabGlyph(); + stave.getModifiers()[2].setStyle(FS('blue')); + stave.setContext(ctx).draw(); + const tabNote = (noteStruct) => new _src_tabnote__WEBPACK_IMPORTED_MODULE_10__.TabNote(noteStruct); + const notes = [ + tabNote({ + positions: [ + { str: 2, fret: 10 }, + { str: 4, fret: 9 }, + ], + duration: 'h', + }).addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation('green text').setStyle(FS('green')), 0), + tabNote({ + positions: [ + { str: 2, fret: 10 }, + { str: 4, fret: 9 }, + ], + duration: 'h', + }) + .addModifier(new _src_bend__WEBPACK_IMPORTED_MODULE_3__.Bend('Full').setStyle(FS('brown')), 0) + .addStroke(0, new _src_strokes__WEBPACK_IMPORTED_MODULE_9__.Stroke(1, { all_voices: false }).setStyle(FS('blue'))), + ]; + _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter.FormatAndDraw(ctx, stave, notes); + ok(true, 'TabNote Modifiers Style'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(StyleTests); + + + +/***/ }), + +/***/ "./tests/tabnote_tests.ts": +/*!********************************!*\ + !*** ./tests/tabnote_tests.ts ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TabNoteTests": () => (/* binding */ TabNoteTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_dot__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/dot */ "./src/dot.ts"); +/* harmony import */ var _src_flow__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/flow */ "./src/flow.ts"); +/* harmony import */ var _src_font__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/font */ "./src/font.ts"); +/* harmony import */ var _src_formatter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/formatter */ "./src/formatter.ts"); +/* harmony import */ var _src_stave__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/stave */ "./src/stave.ts"); +/* harmony import */ var _src_tabnote__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/tabnote */ "./src/tabnote.ts"); +/* harmony import */ var _src_tabstave__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/tabstave */ "./src/tabstave.ts"); +/* harmony import */ var _src_tickcontext__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/tickcontext */ "./src/tickcontext.ts"); +/* harmony import */ var _src_voice__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/voice */ "./src/voice.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// TabNote Tests + + + + + + + + + + +const TabNoteTests = { + Start() { + QUnit.module('TabNote'); + test('Tick', ticks); + test('TabStave Line', tabStaveLine); + test('Width', width); + test('TickContext', tickContext); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('TabNote Draw', draw); + run('TabNote Stems Up', drawStemsUp); + run('TabNote Stems Down', drawStemsDown); + run('TabNote Stems Up Through Stave', drawStemsUpThrough); + run('TabNote Stems Down Through Stave', drawStemsDownThrough); + run('TabNote Stems with Dots', drawStemsDotted); + }, +}; +function ticks() { + const BEAT = (1 * _src_flow__WEBPACK_IMPORTED_MODULE_2__.Flow.RESOLUTION) / 4; + let note = new _src_tabnote__WEBPACK_IMPORTED_MODULE_6__.TabNote({ positions: [{ str: 6, fret: 6 }], duration: '1' }); + equal(note.getTicks().value(), BEAT * 4, 'Whole note has 4 beats'); + note = new _src_tabnote__WEBPACK_IMPORTED_MODULE_6__.TabNote({ positions: [{ str: 3, fret: 4 }], duration: '4' }); + equal(note.getTicks().value(), BEAT, 'Quarter note has 1 beat'); +} +function tabStaveLine() { + const note = new _src_tabnote__WEBPACK_IMPORTED_MODULE_6__.TabNote({ + positions: [ + { str: 6, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '1', + }); + const positions = note.getPositions(); + equal(positions[0].str, 6, 'String 6, Fret 6'); + equal(positions[0].fret, 6, 'String 6, Fret 6'); + equal(positions[1].str, 4, 'String 4, Fret 5'); + equal(positions[1].fret, 5, 'String 4, Fret 5'); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_5__.Stave(10, 10, 300); + note.setStave(stave); + const ys = note.getYs(); + equal(ys.length, 2, 'Chord should be rendered on two lines'); + equal(ys[0], 100, 'Line for String 6, Fret 6'); + equal(ys[1], 80, 'Line for String 4, Fret 5'); +} +function width() { + expect(1); + const note = new _src_tabnote__WEBPACK_IMPORTED_MODULE_6__.TabNote({ + positions: [ + { str: 6, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '1', + }); + throws(() => note.getWidth(), /UnformattedNote/, 'Unformatted note should have no width'); +} +function tickContext() { + const note = new _src_tabnote__WEBPACK_IMPORTED_MODULE_6__.TabNote({ + positions: [ + { str: 6, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '1', + }); + const tickContext = new _src_tickcontext__WEBPACK_IMPORTED_MODULE_8__.TickContext().addTickable(note).preFormat().setX(10).setPadding(0); + equal(tickContext.getWidth(), 7); +} +function draw(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 600, 140); + ctx.font = '10pt Arial'; + const stave = new _src_tabstave__WEBPACK_IMPORTED_MODULE_7__.TabStave(10, 10, 550); + stave.setContext(ctx); + stave.draw(); + const notes = [ + { positions: [{ str: 6, fret: 6 }], duration: '4' }, + { + positions: [ + { str: 3, fret: 6 }, + { str: 4, fret: 25 }, + ], + duration: '4', + }, + { + positions: [ + { str: 2, fret: 'x' }, + { str: 5, fret: 15 }, + ], + duration: '4', + }, + { + positions: [ + { str: 2, fret: 'x' }, + { str: 5, fret: 5 }, + ], + duration: '4', + }, + { + positions: [ + { str: 2, fret: 10 }, + { str: 5, fret: 12 }, + ], + duration: '4', + }, + { + positions: [ + { str: 6, fret: 0 }, + { str: 5, fret: 5 }, + { str: 4, fret: 5 }, + { str: 3, fret: 4 }, + { str: 2, fret: 3 }, + { str: 1, fret: 0 }, + ], + duration: '4', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '4', + }, + ]; + // Helper function + function showNote(noteStruct, stave, ctx, x) { + const tabNote = new _src_tabnote__WEBPACK_IMPORTED_MODULE_6__.TabNote(noteStruct); + const tickContext = new _src_tickcontext__WEBPACK_IMPORTED_MODULE_8__.TickContext(); + tickContext.addTickable(tabNote).preFormat().setX(x); + tabNote.setContext(ctx).setStave(stave); + tabNote.draw(); + return tabNote; + } + for (let i = 0; i < notes.length; ++i) { + const note = notes[i]; + const tabNote = showNote(note, stave, ctx, (i + 1) * 25); + ok(tabNote.getX() > 0, 'Note ' + i + ' has X value'); + ok(tabNote.getYs().length > 0, 'Note ' + i + ' has Y values'); + } +} +function drawStemsUp(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 600, 200); + ctx.font = '10pt Arial'; + const stave = new _src_tabstave__WEBPACK_IMPORTED_MODULE_7__.TabStave(10, 30, 550); + stave.setContext(ctx); + stave.draw(); + const specs = [ + { + positions: [ + { str: 3, fret: 6 }, + { str: 4, fret: 25 }, + ], + duration: '4', + }, + { + positions: [ + { str: 2, fret: 10 }, + { str: 5, fret: 12 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '16', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '32', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '64', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '128', + }, + ]; + const notes = specs.map((struct) => { + const tabNote = new _src_tabnote__WEBPACK_IMPORTED_MODULE_6__.TabNote(struct); + tabNote.render_options.draw_stem = true; + return tabNote; + }); + const voice = new _src_voice__WEBPACK_IMPORTED_MODULE_9__.Voice(_src_flow__WEBPACK_IMPORTED_MODULE_2__.Flow.TIME4_4).setMode(_src_voice__WEBPACK_IMPORTED_MODULE_9__.VoiceMode.SOFT); + voice.addTickables(notes); + new _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter().joinVoices([voice]).formatToStave([voice], stave); + voice.draw(ctx, stave); + ok(true, 'TabNotes successfully drawn'); +} +function drawStemsDown(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 600, 200); + ctx.font = '10pt Arial'; + const stave = new _src_tabstave__WEBPACK_IMPORTED_MODULE_7__.TabStave(10, 10, 550); + stave.setContext(ctx); + stave.draw(); + const specs = [ + { + positions: [ + { str: 3, fret: 6 }, + { str: 4, fret: 25 }, + ], + duration: '4', + }, + { + positions: [ + { str: 2, fret: 10 }, + { str: 5, fret: 12 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '16', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '32', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '64', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '128', + }, + ]; + const notes = specs.map((struct) => { + const tabNote = new _src_tabnote__WEBPACK_IMPORTED_MODULE_6__.TabNote(struct); + tabNote.render_options.draw_stem = true; + tabNote.setStemDirection(-1); + return tabNote; + }); + const voice = new _src_voice__WEBPACK_IMPORTED_MODULE_9__.Voice(_src_flow__WEBPACK_IMPORTED_MODULE_2__.Flow.TIME4_4).setMode(_src_voice__WEBPACK_IMPORTED_MODULE_9__.VoiceMode.SOFT); + voice.addTickables(notes); + new _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter().joinVoices([voice]).formatToStave([voice], stave); + voice.draw(ctx, stave); + ok(true, 'All objects have been drawn'); +} +function drawStemsUpThrough(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 600, 200); + ctx.font = '10pt Arial'; + const stave = new _src_tabstave__WEBPACK_IMPORTED_MODULE_7__.TabStave(10, 30, 550); + stave.setContext(ctx); + stave.draw(); + const specs = [ + { + positions: [ + { str: 3, fret: 6 }, + { str: 4, fret: 25 }, + ], + duration: '4', + }, + { + positions: [ + { str: 2, fret: 10 }, + { str: 5, fret: 12 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '16', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '32', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '64', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '128', + }, + ]; + const notes = specs.map((struct) => { + const tabNote = new _src_tabnote__WEBPACK_IMPORTED_MODULE_6__.TabNote(struct); + tabNote.render_options.draw_stem = true; + tabNote.render_options.draw_stem_through_stave = true; + return tabNote; + }); + ctx.setFont(_src_font__WEBPACK_IMPORTED_MODULE_3__.Font.SANS_SERIF, 10, _src_font__WEBPACK_IMPORTED_MODULE_3__.FontWeight.BOLD); + const voice = new _src_voice__WEBPACK_IMPORTED_MODULE_9__.Voice(_src_flow__WEBPACK_IMPORTED_MODULE_2__.Flow.TIME4_4).setMode(_src_voice__WEBPACK_IMPORTED_MODULE_9__.VoiceMode.SOFT); + voice.addTickables(notes); + new _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter().joinVoices([voice]).formatToStave([voice], stave); + voice.draw(ctx, stave); + ok(true, 'TabNotes successfully drawn'); +} +function drawStemsDownThrough(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 600, 250); + ctx.font = '10pt Arial'; + const stave = new _src_tabstave__WEBPACK_IMPORTED_MODULE_7__.TabStave(10, 10, 550, { num_lines: 8 }); + stave.setContext(ctx); + stave.draw(); + const specs = [ + { + positions: [ + { str: 3, fret: 6 }, + { str: 4, fret: 25 }, + ], + duration: '4', + }, + { + positions: [ + { str: 2, fret: 10 }, + { str: 5, fret: 12 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '16', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + { str: 6, fret: 10 }, + ], + duration: '32', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '64', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 3, fret: 5 }, + { str: 5, fret: 5 }, + { str: 7, fret: 5 }, + ], + duration: '128', + }, + ]; + const notes = specs.map((struct) => { + const tabNote = new _src_tabnote__WEBPACK_IMPORTED_MODULE_6__.TabNote(struct); + tabNote.render_options.draw_stem = true; + tabNote.render_options.draw_stem_through_stave = true; + tabNote.setStemDirection(-1); + return tabNote; + }); + ctx.setFont('Arial', 10, 'bold'); + const voice = new _src_voice__WEBPACK_IMPORTED_MODULE_9__.Voice(_src_flow__WEBPACK_IMPORTED_MODULE_2__.Flow.TIME4_4).setMode(_src_voice__WEBPACK_IMPORTED_MODULE_9__.VoiceMode.SOFT); + voice.addTickables(notes); + new _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter().joinVoices([voice]).formatToStave([voice], stave); + voice.draw(ctx, stave); + ok(true, 'All objects have been drawn'); +} +function drawStemsDotted(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 600, 200); + ctx.font = '10pt Arial'; + const stave = new _src_tabstave__WEBPACK_IMPORTED_MODULE_7__.TabStave(10, 10, 550); + stave.setContext(ctx); + stave.draw(); + const specs = [ + { + positions: [ + { str: 3, fret: 6 }, + { str: 4, fret: 25 }, + ], + duration: '4d', + }, + { + positions: [ + { str: 2, fret: 10 }, + { str: 5, fret: 12 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '4dd', + stem_direction: -1, + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '16', + stem_direction: -1, + }, + ]; + const notes = specs.map((struct) => new _src_tabnote__WEBPACK_IMPORTED_MODULE_6__.TabNote(struct, true /* draw_stem */)); + _src_dot__WEBPACK_IMPORTED_MODULE_1__.Dot.buildAndAttach([notes[0], notes[2], notes[2]]); + const voice = new _src_voice__WEBPACK_IMPORTED_MODULE_9__.Voice(_src_flow__WEBPACK_IMPORTED_MODULE_2__.Flow.TIME4_4).setMode(_src_voice__WEBPACK_IMPORTED_MODULE_9__.VoiceMode.SOFT); + voice.addTickables(notes); + new _src_formatter__WEBPACK_IMPORTED_MODULE_4__.Formatter().joinVoices([voice]).formatToStave([voice], stave); + voice.draw(ctx, stave); + ok(true, 'TabNotes successfully drawn'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(TabNoteTests); + + + +/***/ }), + +/***/ "./tests/tabslide_tests.ts": +/*!*********************************!*\ + !*** ./tests/tabslide_tests.ts ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TabSlideTests": () => (/* binding */ TabSlideTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_flow__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/flow */ "./src/flow.ts"); +/* harmony import */ var _src_formatter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/formatter */ "./src/formatter.ts"); +/* harmony import */ var _src_tabnote__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/tabnote */ "./src/tabnote.ts"); +/* harmony import */ var _src_tabslide__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/tabslide */ "./src/tabslide.ts"); +/* harmony import */ var _src_tabstave__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/tabstave */ "./src/tabstave.ts"); +/* harmony import */ var _src_voice__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/voice */ "./src/voice.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// TabSlide Tests + + + + + + + +const TabSlideTests = { + Start() { + QUnit.module('TabSlide'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Simple TabSlide', simple); + run('Slide Up', slideUp); + run('Slide Down', slideDown); + }, +}; +function tieNotes(notes, indices, stave, ctx) { + const voice = new _src_voice__WEBPACK_IMPORTED_MODULE_6__.Voice(_src_flow__WEBPACK_IMPORTED_MODULE_1__.Flow.TIME4_4); + voice.addTickables(notes); + new _src_formatter__WEBPACK_IMPORTED_MODULE_2__.Formatter().joinVoices([voice]).format([voice], 100); + voice.draw(ctx, stave); + const tie = new _src_tabslide__WEBPACK_IMPORTED_MODULE_4__.TabSlide({ + first_note: notes[0], + last_note: notes[1], + first_indices: indices, + last_indices: indices, + }, _src_tabslide__WEBPACK_IMPORTED_MODULE_4__.TabSlide.SLIDE_UP); + tie.setContext(ctx); + tie.draw(); +} +function setupContext(options, width) { + // eslint-disable-next-line + const context = options.contextBuilder(options.elementId, 350, 140); + context.scale(0.9, 0.9); + context.fillStyle = '#221'; + context.strokeStyle = '#221'; + context.font = '10pt Arial'; + const stave = new _src_tabstave__WEBPACK_IMPORTED_MODULE_5__.TabStave(10, 10, width || 350).addTabGlyph().setContext(context).draw(); + return { context, stave }; +} +// Helper function to create TabNote objects. +const tabNote = (noteStruct) => new _src_tabnote__WEBPACK_IMPORTED_MODULE_3__.TabNote(noteStruct); +/** + * Test Case + */ +function simple(options, contextBuilder) { + options.contextBuilder = contextBuilder; + const { stave, context } = setupContext(options); + tieNotes([ + tabNote({ positions: [{ str: 4, fret: 4 }], duration: 'h' }), + tabNote({ positions: [{ str: 4, fret: 6 }], duration: 'h' }), + ], [0], stave, context); + ok(true, 'Simple Test'); +} +/** + * The slideUp and slideDown tests pass in a builder function: TabSlide.createSlideUp | TabSlide.createSlideDown. + */ +function multiTest(options, buildTabSlide) { + const { context, stave } = setupContext(options, 440); + const notes = [ + tabNote({ positions: [{ str: 4, fret: 4 }], duration: '8' }), + tabNote({ positions: [{ str: 4, fret: 4 }], duration: '8' }), + tabNote({ + positions: [ + { str: 4, fret: 4 }, + { str: 5, fret: 4 }, + ], + duration: '8', + }), + tabNote({ + positions: [ + { str: 4, fret: 6 }, + { str: 5, fret: 6 }, + ], + duration: '8', + }), + tabNote({ positions: [{ str: 2, fret: 14 }], duration: '8' }), + tabNote({ positions: [{ str: 2, fret: 16 }], duration: '8' }), + tabNote({ + positions: [ + { str: 2, fret: 14 }, + { str: 3, fret: 14 }, + ], + duration: '8', + }), + tabNote({ + positions: [ + { str: 2, fret: 16 }, + { str: 3, fret: 16 }, + ], + duration: '8', + }), + ]; + const voice = new _src_voice__WEBPACK_IMPORTED_MODULE_6__.Voice(_src_flow__WEBPACK_IMPORTED_MODULE_1__.Flow.TIME4_4).addTickables(notes); + new _src_formatter__WEBPACK_IMPORTED_MODULE_2__.Formatter().joinVoices([voice]).format([voice], 300); + voice.draw(context, stave); + buildTabSlide({ + first_note: notes[0], + last_note: notes[1], + first_indices: [0], + last_indices: [0], + }) + .setContext(context) + .draw(); + ok(true, 'Single note'); + buildTabSlide({ + first_note: notes[2], + last_note: notes[3], + first_indices: [0, 1], + last_indices: [0, 1], + }) + .setContext(context) + .draw(); + ok(true, 'Chord'); + buildTabSlide({ + first_note: notes[4], + last_note: notes[5], + first_indices: [0], + last_indices: [0], + }) + .setContext(context) + .draw(); + ok(true, 'Single note high-fret'); + buildTabSlide({ + first_note: notes[6], + last_note: notes[7], + first_indices: [0, 1], + last_indices: [0, 1], + }) + .setContext(context) + .draw(); + ok(true, 'Chord high-fret'); +} +function slideUp(options, contextBuilder) { + options.contextBuilder = contextBuilder; + multiTest(options, _src_tabslide__WEBPACK_IMPORTED_MODULE_4__.TabSlide.createSlideUp); +} +function slideDown(options, contextBuilder) { + options.contextBuilder = contextBuilder; + multiTest(options, _src_tabslide__WEBPACK_IMPORTED_MODULE_4__.TabSlide.createSlideDown); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(TabSlideTests); + + + +/***/ }), + +/***/ "./tests/tabstave_tests.ts": +/*!*********************************!*\ + !*** ./tests/tabstave_tests.ts ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TabStaveTests": () => (/* binding */ TabStaveTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_tabstave__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/tabstave */ "./src/tabstave.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// TabStave Tests + + +const TabStaveTests = { + Start() { + QUnit.module('TabStave'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('TabStave Draw Test', draw); + }, +}; +function draw(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 160); + const stave = new _src_tabstave__WEBPACK_IMPORTED_MODULE_1__.TabStave(10, 10, 300); + stave.setNumLines(6); + stave.setContext(ctx); + stave.draw(); + equal(stave.getYForNote(0), 127, 'getYForNote(0)'); + equal(stave.getYForLine(5), 127, 'getYForLine(5)'); + equal(stave.getYForLine(0), 62, 'getYForLine(0) - Top Line'); + equal(stave.getYForLine(4), 114, 'getYForLine(4) - Bottom Line'); + ok(true, 'all pass'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(TabStaveTests); + + + +/***/ }), + +/***/ "./tests/tabtie_tests.ts": +/*!*******************************!*\ + !*** ./tests/tabtie_tests.ts ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TabTieTests": () => (/* binding */ TabTieTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_annotation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/annotation */ "./src/annotation.ts"); +/* harmony import */ var _src_flow__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/flow */ "./src/flow.ts"); +/* harmony import */ var _src_formatter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/formatter */ "./src/formatter.ts"); +/* harmony import */ var _src_tabnote__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/tabnote */ "./src/tabnote.ts"); +/* harmony import */ var _src_tabstave__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/tabstave */ "./src/tabstave.ts"); +/* harmony import */ var _src_tabtie__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/tabtie */ "./src/tabtie.ts"); +/* harmony import */ var _src_voice__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/voice */ "./src/voice.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// TabTie Tests + + + + + + + + +const TabTieTests = { + Start() { + QUnit.module('TabTie'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Simple TabTie', simple); + run('Hammerons', simpleHammerOn); + run('Pulloffs', simplePullOff); + run('Tapping', tap); + run('Continuous', continuous); + }, +}; +/** + * Helper function to create TabNote objects. + */ +const tabNote = (noteStruct) => new _src_tabnote__WEBPACK_IMPORTED_MODULE_4__.TabNote(noteStruct); +/** + * Helper function to create a RenderContext and TabStave. + */ +function setupContext(options, w = 0, h = 0) { + // eslint-disable-next-line + const context = options.contextBuilder(options.elementId, w || 350, h || 160); + context.fillStyle = '#221'; + context.strokeStyle = '#221'; + context.setFont('Arial', _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.Font.size); + const stave = new _src_tabstave__WEBPACK_IMPORTED_MODULE_5__.TabStave(10, 10, w || 350).addTabGlyph().setContext(context).draw(); + return { context, stave }; +} +/** + * Helper function to create the TabTie between two Note objects. + */ +function tieNotes(notes, indices, stave, ctx, text) { + const voice = new _src_voice__WEBPACK_IMPORTED_MODULE_7__.Voice(_src_flow__WEBPACK_IMPORTED_MODULE_2__.Flow.TIME4_4); + voice.addTickables(notes); + new _src_formatter__WEBPACK_IMPORTED_MODULE_3__.Formatter().joinVoices([voice]).format([voice], 100); + voice.draw(ctx, stave); + const tie = new _src_tabtie__WEBPACK_IMPORTED_MODULE_6__.TabTie({ + first_note: notes[0], + last_note: notes[1], + first_indices: indices, + last_indices: indices, + }, text !== null && text !== void 0 ? text : 'Annotation'); + tie.setContext(ctx); + tie.draw(); +} +/** + * Two notes on string 4 with a tie drawn between them. + */ +function simple(options, contextBuilder) { + options.contextBuilder = contextBuilder; + const { context, stave } = setupContext(options); + const note1 = tabNote({ positions: [{ str: 4, fret: 4 }], duration: 'h' }); + const note2 = tabNote({ positions: [{ str: 4, fret: 6 }], duration: 'h' }); + tieNotes([note1, note2], [0], stave, context); + ok(true, 'Simple Test'); +} +function simpleHammerOn(options, contextBuilder) { + options.contextBuilder = contextBuilder; + multiTest(options, _src_tabtie__WEBPACK_IMPORTED_MODULE_6__.TabTie.createHammeron); +} +function simplePullOff(options, contextBuilder) { + options.contextBuilder = contextBuilder; + multiTest(options, _src_tabtie__WEBPACK_IMPORTED_MODULE_6__.TabTie.createPulloff); +} +/** + * Helper function for the two test cases above (simpleHammerOn and simplePullOff). + */ +function multiTest(options, createTabTie) { + const { context, stave } = setupContext(options, 440, 140); + const notes = [ + tabNote({ positions: [{ str: 4, fret: 4 }], duration: '8' }), + tabNote({ positions: [{ str: 4, fret: 4 }], duration: '8' }), + tabNote({ + positions: [ + { str: 4, fret: 4 }, + { str: 5, fret: 4 }, + ], + duration: '8', + }), + tabNote({ + positions: [ + { str: 4, fret: 6 }, + { str: 5, fret: 6 }, + ], + duration: '8', + }), + tabNote({ positions: [{ str: 2, fret: 14 }], duration: '8' }), + tabNote({ positions: [{ str: 2, fret: 16 }], duration: '8' }), + tabNote({ + positions: [ + { str: 2, fret: 14 }, + { str: 3, fret: 14 }, + ], + duration: '8', + }), + tabNote({ + positions: [ + { str: 2, fret: 16 }, + { str: 3, fret: 16 }, + ], + duration: '8', + }), + ]; + const voice = new _src_voice__WEBPACK_IMPORTED_MODULE_7__.Voice(_src_flow__WEBPACK_IMPORTED_MODULE_2__.Flow.TIME4_4).addTickables(notes); + new _src_formatter__WEBPACK_IMPORTED_MODULE_3__.Formatter().joinVoices([voice]).format([voice], 300); + voice.draw(context, stave); + createTabTie({ + first_note: notes[0], + last_note: notes[1], + first_indices: [0], + last_indices: [0], + }) + .setContext(context) + .draw(); + ok(true, 'Single note'); + createTabTie({ + first_note: notes[2], + last_note: notes[3], + first_indices: [0, 1], + last_indices: [0, 1], + }) + .setContext(context) + .draw(); + ok(true, 'Chord'); + createTabTie({ + first_note: notes[4], + last_note: notes[5], + first_indices: [0], + last_indices: [0], + }) + .setContext(context) + .draw(); + ok(true, 'Single note high-fret'); + createTabTie({ + first_note: notes[6], + last_note: notes[7], + first_indices: [0, 1], + last_indices: [0, 1], + }) + .setContext(context) + .draw(); + ok(true, 'Chord high-fret'); +} +function tap(options, contextBuilder) { + options.contextBuilder = contextBuilder; + const { context, stave } = setupContext(options); + const note1 = tabNote({ positions: [{ str: 4, fret: 12 }], duration: 'h' }).addModifier(new _src_annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation('T'), 0); + const note2 = tabNote({ positions: [{ str: 4, fret: 10 }], duration: 'h' }); + tieNotes([note1, note2], [0], stave, context, 'P'); + ok(true, 'Tapping Test'); +} +function continuous(options, contextBuilder) { + options.contextBuilder = contextBuilder; + const { context, stave } = setupContext(options, 440, 140); + const notes = [ + tabNote({ positions: [{ str: 4, fret: 4 }], duration: 'q' }), + tabNote({ positions: [{ str: 4, fret: 5 }], duration: 'q' }), + tabNote({ positions: [{ str: 4, fret: 6 }], duration: 'h' }), + ]; + const voice = new _src_voice__WEBPACK_IMPORTED_MODULE_7__.Voice(_src_flow__WEBPACK_IMPORTED_MODULE_2__.Flow.TIME4_4).addTickables(notes); + new _src_formatter__WEBPACK_IMPORTED_MODULE_3__.Formatter().joinVoices([voice]).format([voice], 300); + voice.draw(context, stave); + _src_tabtie__WEBPACK_IMPORTED_MODULE_6__.TabTie.createHammeron({ + first_note: notes[0], + last_note: notes[1], + first_indices: [0], + last_indices: [0], + }) + .setContext(context) + .draw(); + _src_tabtie__WEBPACK_IMPORTED_MODULE_6__.TabTie.createPulloff({ + first_note: notes[1], + last_note: notes[2], + first_indices: [0], + last_indices: [0], + }) + .setContext(context) + .draw(); + ok(true, 'Continuous Hammeron'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(TabTieTests); + + + +/***/ }), + +/***/ "./tests/textbracket_tests.ts": +/*!************************************!*\ + !*** ./tests/textbracket_tests.ts ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TextBracketTests": () => (/* binding */ TextBracketTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// TextBracket Tests + +const TextBracketTests = { + Start() { + QUnit.module('TextBracket'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Simple TextBracket', simple0); + run('TextBracket Styles', simple1); + }, +}; +function simple0(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 550); + const stave = f.Stave(); + const score = f.EasyScore(); + const notes = score.notes('c4/4, c4, c4, c4, c4', { stem: 'up' }); + const voice = score.voice(notes, { time: '5/4' }); + f.TextBracket({ + from: notes[0], + to: notes[4], + text: '15', + options: { + superscript: 'va', + position: 'top', + }, + }); + f.TextBracket({ + from: notes[0], + to: notes[4], + text: '8', + options: { + superscript: 'vb', + position: 'bottom', + line: 3, + }, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true); +} +function simple1(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 550); + const stave = f.Stave(); + const score = f.EasyScore(); + const notes = score.notes('c4/4, c4, c4, c4, c4', { stem: 'up' }); + const voice = score.voice(notes, { time: '5/4' }); + const topOctaves = [ + f.TextBracket({ + from: notes[0], + to: notes[1], + text: 'Cool notes', + options: { + superscript: '', + position: 'top', + }, + }), + f.TextBracket({ + from: notes[2], + to: notes[4], + text: 'Testing', + options: { + position: 'top', + superscript: 'superscript', + // weight & style below can be left undefined. They will fall back to the default defined in textbracket.ts. + font: { family: 'Arial', size: 15, weight: 'normal', style: 'normal' }, + }, + }), + ]; + const bottomOctaves = [ + f.TextBracket({ + from: notes[0], + to: notes[1], + text: '8', + options: { + superscript: 'vb', + position: 'bottom', + line: 3, + font: { size: 30 }, + }, + }), + f.TextBracket({ + from: notes[2], + to: notes[4], + text: 'Not cool notes', + options: { + superscript: ' super uncool', + position: 'bottom', + line: 4, + }, + }), + ]; + topOctaves[1].render_options.line_width = 2; + topOctaves[1].render_options.show_bracket = false; + bottomOctaves[0].render_options.underline_superscript = false; + bottomOctaves[0].setDashed(false); + bottomOctaves[1].render_options.bracket_height = 40; + bottomOctaves[1].setDashed(true, [2, 2]); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(TextBracketTests); + + + +/***/ }), + +/***/ "./tests/textformatter_tests.ts": +/*!**************************************!*\ + !*** ./tests/textformatter_tests.ts ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TextFormatterTests": () => (/* binding */ TextFormatterTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_textformatter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/textformatter */ "./src/textformatter.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// TextFormatter Tests + + +const TextFormatterTests = { + Start() { + QUnit.module('TextFormatter'); + test('Basic', basic); + }, +}; +function basic() { + var _a; + // See: src/fonts/loadTextFonts.ts + const registeredFamilies = _src_textformatter__WEBPACK_IMPORTED_MODULE_1__.TextFormatter.getFontFamilies(); + equal(registeredFamilies.length, 2, `There are two registered font families: 'Roboto Slab' & 'PetalumaScript'`); + // Verify the advanceWidth and other metrics by opening the font file with a glyph inspector: + // https://fontdrop.info/ + // https://opentype.js.org/glyph-inspector.html + const petalumaFormatterInfo = _src_textformatter__WEBPACK_IMPORTED_MODULE_1__.TextFormatter.getInfo('PetalumaScript'); + equal((_a = petalumaFormatterInfo === null || petalumaFormatterInfo === void 0 ? void 0 : petalumaFormatterInfo.glyphs) === null || _a === void 0 ? void 0 : _a.C.advanceWidth, 623, 'PetalumaScript advanceWidth of C character is 623.'); + const formatterForPetalumaScript = _src_textformatter__WEBPACK_IMPORTED_MODULE_1__.TextFormatter.create({ family: 'PetalumaScript', size: '100px' }); + const metricsPetalumaScriptH = formatterForPetalumaScript.getGlyphMetrics('H'); + equal(metricsPetalumaScriptH.leftSideBearing, 37); + const formatterForRobotoSlab = _src_textformatter__WEBPACK_IMPORTED_MODULE_1__.TextFormatter.create({ family: 'Roboto Slab', size: '100px', style: 'italic' }); + const metricsRobotoSlabH = formatterForRobotoSlab.getGlyphMetrics('H'); + equal(metricsRobotoSlabH.advanceWidth, 1578); + // eslint-disable-next-line + // @ts-ignore direct access to protected variable .cacheKey + equal(formatterForRobotoSlab.cacheKey, 'Roboto_Slab%75%normal%normal'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(TextFormatterTests); + + + +/***/ }), + +/***/ "./tests/textnote_tests.ts": +/*!*********************************!*\ + !*** ./tests/textnote_tests.ts ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TextNoteTests": () => (/* binding */ TextNoteTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_crescendo__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/crescendo */ "./src/crescendo.ts"); +/* harmony import */ var _src_flow__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/flow */ "./src/flow.ts"); +/* harmony import */ var _src_font__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/font */ "./src/font.ts"); +/* harmony import */ var _src_note__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/note */ "./src/note.ts"); +/* harmony import */ var _src_stave__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/stave */ "./src/stave.ts"); +/* harmony import */ var _src_textnote__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/textnote */ "./src/textnote.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Text Note Tests + + + + + + + +const TextNoteTests = { + Start() { + QUnit.module('TextNote'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('TextNote Formatting', formatTextNotes); + run('TextNote Formatting 2', formatTextNotes2); + run('TextNote Superscript and Subscript', superscriptAndSubscript); + run('TextNote Formatting With Glyphs 0', formatTextGlyphs0); + run('TextNote Formatting With Glyphs 1', formatTextGlyphs1); + run('Crescendo', crescendo); + run('Text Dynamics', textDynamics); + }, +}; +function formatTextNotes(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 400, 200); + const stave = f.Stave({ y: 40 }); + const score = f.EasyScore(); + const voice1 = score.voice([ + f + .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], stem_direction: -1, duration: 'h' }) + .addModifier(f.Accidental({ type: 'b' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1), + f.StaveNote({ keys: ['d/4', 'e/4', 'f/4'], stem_direction: -1, duration: 'q' }), + f + .StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: 'q' }) + .addModifier(f.Accidental({ type: 'n' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1), + ]); + const voice2 = score.voice([ + f.TextNote({ text: 'Center Justification', duration: 'h' }).setJustification(_src_textnote__WEBPACK_IMPORTED_MODULE_6__.TextNote.Justification.CENTER), + f.TextNote({ text: 'Left Line 1', duration: 'q' }).setLine(1), + f.TextNote({ text: 'Right', duration: 'q' }).setJustification(_src_textnote__WEBPACK_IMPORTED_MODULE_6__.TextNote.Justification.RIGHT), + ]); + const formatter = f.Formatter(); + formatter.joinVoices([voice1, voice2]).formatToStave([voice1, voice2], stave); + f.draw(); + ok(true); +} +function formatTextNotes2(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 200); + const stave = f.Stave({ y: 40 }); + const score = f.EasyScore(); + const voice1 = score.voice([ + f.StaveNote({ keys: ['g/4'], stem_direction: 1, duration: '16' }), + f.StaveNote({ keys: ['g/4'], stem_direction: 1, duration: '16' }), + f.StaveNote({ keys: ['g/4'], stem_direction: 1, duration: '16' }), + f.StaveNote({ keys: ['g/5'], stem_direction: -1, duration: '16' }), + f.StaveNote({ keys: ['g/5'], stem_direction: -1, duration: '16' }), + f.StaveNote({ keys: ['g/5'], stem_direction: -1, duration: '16' }), + f.StaveNote({ keys: ['g/5', 'a/5'], stem_direction: -1, duration: '16' }), + f.StaveNote({ keys: ['g/5', 'a/5'], stem_direction: -1, duration: '16' }), + f.StaveNote({ keys: ['g/5', 'a/5'], stem_direction: -1, duration: '16' }), + f.StaveNote({ keys: ['g/4', 'a/4'], stem_direction: 1, duration: '16' }), + f.StaveNote({ keys: ['g/4', 'a/4'], stem_direction: 1, duration: '16' }), + f.StaveNote({ keys: ['g/4', 'a/4'], stem_direction: 1, duration: '16' }), + f.StaveNote({ keys: ['g/4', 'a/4'], stem_direction: 1, duration: 'q' }), + ]); + const voice2 = score.voice([ + f.TextNote({ text: 'C', duration: '16' }).setJustification(_src_textnote__WEBPACK_IMPORTED_MODULE_6__.TextNote.Justification.CENTER), + f.TextNote({ text: 'L', duration: '16' }), + f.TextNote({ text: 'R', duration: '16' }).setJustification(_src_textnote__WEBPACK_IMPORTED_MODULE_6__.TextNote.Justification.RIGHT), + f.TextNote({ text: 'C', duration: '16' }).setJustification(_src_textnote__WEBPACK_IMPORTED_MODULE_6__.TextNote.Justification.CENTER), + f.TextNote({ text: 'L', duration: '16' }), + f.TextNote({ text: 'R', duration: '16' }).setJustification(_src_textnote__WEBPACK_IMPORTED_MODULE_6__.TextNote.Justification.RIGHT), + f.TextNote({ text: 'C', duration: '16' }).setJustification(_src_textnote__WEBPACK_IMPORTED_MODULE_6__.TextNote.Justification.CENTER), + f.TextNote({ text: 'L', duration: '16' }), + f.TextNote({ text: 'R', duration: '16' }).setJustification(_src_textnote__WEBPACK_IMPORTED_MODULE_6__.TextNote.Justification.RIGHT), + f.TextNote({ text: 'C', duration: '16' }).setJustification(_src_textnote__WEBPACK_IMPORTED_MODULE_6__.TextNote.Justification.CENTER), + f.TextNote({ text: 'L', duration: '16' }), + f.TextNote({ text: 'R', duration: '16' }).setJustification(_src_textnote__WEBPACK_IMPORTED_MODULE_6__.TextNote.Justification.RIGHT), + f.TextNote({ text: 'R', duration: 'q' }).setJustification(_src_textnote__WEBPACK_IMPORTED_MODULE_6__.TextNote.Justification.RIGHT), + ]); + f.Formatter().joinVoices([voice1, voice2]).formatToStave([voice1, voice2], stave); + voice2.getTickables().forEach((note) => _src_note__WEBPACK_IMPORTED_MODULE_4__.Note.plotMetrics(f.getContext(), note, 170)); + f.draw(); + ok(true); +} +function superscriptAndSubscript(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 230); + const stave = f.Stave({ y: 40 }); + const score = f.EasyScore(); + const voice1 = score.voice([ + f + .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], stem_direction: 1, duration: 'h' }) + .addModifier(f.Accidental({ type: 'b' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1), + f.StaveNote({ keys: ['d/4', 'e/4', 'f/4'], stem_direction: 1, duration: 'q' }), + f + .StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: 1, duration: 'q' }) + .addModifier(f.Accidental({ type: 'n' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1), + ]); + const voice2 = score.voice([ + f.TextNote({ text: _src_flow__WEBPACK_IMPORTED_MODULE_2__.Flow.unicode.flat + 'I', superscript: '+5', duration: '8' }), + f.TextNote({ text: 'D' + _src_flow__WEBPACK_IMPORTED_MODULE_2__.Flow.unicode.sharp + '/F', duration: '4d', superscript: 'sus2' }), + f.TextNote({ text: 'ii', superscript: '6', subscript: '4', duration: '8' }), + f.TextNote({ text: 'C', superscript: _src_flow__WEBPACK_IMPORTED_MODULE_2__.Flow.unicode.triangle + '7', subscript: '', duration: '8' }), + f.TextNote({ text: 'vii', superscript: _src_flow__WEBPACK_IMPORTED_MODULE_2__.Flow.unicode["o-with-slash"] + '7', duration: '8' }), + f.TextNote({ text: 'V', superscript: '7', duration: '8' }), + ]); + voice2.getTickables().forEach((note) => { + const textNote = note; + textNote.setFont({ family: _src_font__WEBPACK_IMPORTED_MODULE_3__.Font.SERIF, size: 15 }); + textNote.setLine(13); + textNote.setJustification(_src_textnote__WEBPACK_IMPORTED_MODULE_6__.TextNote.Justification.LEFT); + }); + f.Formatter().joinVoices([voice1, voice2]).formatToStave([voice1, voice2], stave); + f.draw(); + ok(true); +} +function formatTextGlyphs0(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 230); + const stave = f.Stave({ y: 40 }); + const score = f.EasyScore(); + const voice1 = score.voice([ + f + .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], stem_direction: -1, duration: 'h' }) + .addModifier(f.Accidental({ type: 'b' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1), + f.StaveNote({ keys: ['d/4', 'e/4', 'f/4'], stem_direction: -1, duration: '8' }), + f.StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: '8' }), + f.StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: '8' }), + f.StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: '8' }), + ]); + const voice2 = score.voice([ + f.TextNote({ text: 'Center', duration: '8' }).setJustification(_src_textnote__WEBPACK_IMPORTED_MODULE_6__.TextNote.Justification.CENTER), + f.TextNote({ glyph: 'f', duration: '8' }), + f.TextNote({ glyph: 'p', duration: '8' }), + f.TextNote({ glyph: 'm', duration: '8' }), + f.TextNote({ glyph: 'z', duration: '8' }), + f.TextNote({ glyph: 'mordent_upper', duration: '16' }), + f.TextNote({ glyph: 'mordent_lower', duration: '16' }), + f.TextNote({ glyph: 'segno', duration: '8' }), + f.TextNote({ glyph: 'coda', duration: '8' }), + ]); + voice2.getTickables().forEach((n) => n.setJustification(_src_textnote__WEBPACK_IMPORTED_MODULE_6__.TextNote.Justification.CENTER)); + f.Formatter().joinVoices([voice1, voice2]).formatToStave([voice1, voice2], stave); + f.draw(); + ok(true); +} +function formatTextGlyphs1(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 230); + const stave = f.Stave({ y: 40 }); + const score = f.EasyScore(); + const voice1 = score.voice([ + f + .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], stem_direction: -1, duration: 'h' }) + .addModifier(f.Accidental({ type: 'b' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1), + f.StaveNote({ keys: ['d/4', 'e/4', 'f/4'], stem_direction: -1, duration: '8' }), + f.StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: '8' }), + f.StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: '8' }), + f.StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: '8' }), + ]); + const voice2 = score.voice([ + f.TextNote({ glyph: 'turn', duration: '16' }), + f.TextNote({ glyph: 'turn_inverted', duration: '16' }), + f.TextNote({ glyph: 'pedal_open', duration: '8' }).setLine(10), + f.TextNote({ glyph: 'pedal_close', duration: '8' }).setLine(10), + f.TextNote({ glyph: 'caesura_curved', duration: '8' }).setLine(3), + f.TextNote({ glyph: 'caesura_straight', duration: '8' }).setLine(3), + f.TextNote({ glyph: 'breath', duration: '8' }).setLine(2), + f.TextNote({ glyph: 'tick', duration: '8' }).setLine(3), + f.TextNote({ glyph: 'tr', duration: '8', smooth: true }).setJustification(_src_textnote__WEBPACK_IMPORTED_MODULE_6__.TextNote.Justification.CENTER), + ]); + voice2.getTickables().forEach((n) => n.setJustification(_src_textnote__WEBPACK_IMPORTED_MODULE_6__.TextNote.Justification.CENTER)); + f.Formatter().joinVoices([voice1, voice2]).formatToStave([voice1, voice2], stave); + f.draw(); + ok(true); +} +function crescendo(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 230); + const stave = f.Stave({ y: 40 }); + const score = f.EasyScore(); + const voice = score.voice([ + f.TextNote({ glyph: 'p', duration: '16' }), + new _src_crescendo__WEBPACK_IMPORTED_MODULE_1__.Crescendo({ duration: '4d' }).setLine(0).setHeight(25).setStave(stave), + f.TextNote({ glyph: 'f', duration: '16' }), + new _src_crescendo__WEBPACK_IMPORTED_MODULE_1__.Crescendo({ duration: '4' }).setLine(5).setStave(stave), + new _src_crescendo__WEBPACK_IMPORTED_MODULE_1__.Crescendo({ duration: '4' }).setLine(10).setDecrescendo(true).setHeight(5).setStave(stave), + ]); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true); +} +function textDynamics(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 230); + const score = f.EasyScore(); + const voice = score.voice([ + f.TextDynamics({ text: 'sfz', duration: '4' }), + f.TextDynamics({ text: 'rfz', duration: '4' }), + f.TextDynamics({ text: 'mp', duration: '4' }), + f.TextDynamics({ text: 'ppp', duration: '4' }), + f.TextDynamics({ text: 'fff', duration: '4' }), + f.TextDynamics({ text: 'mf', duration: '4' }), + f.TextDynamics({ text: 'sff', duration: '4' }), + ], { time: '7/4' }); + // This is refactored to use preCalculateMinWidth... to exercise + // a bug fix when textDynamic got formatted more than once. + const formatter = f.Formatter(); + formatter.joinVoices([voice]); + // const width = 250; //formatter.preCalculateMinTotalWidth([voice]); + const width = formatter.preCalculateMinTotalWidth([voice]); + formatter.format([voice]); + const stave = f.Stave({ y: 40, width: width + _src_stave__WEBPACK_IMPORTED_MODULE_5__.Stave.defaultPadding }); + stave.draw(); + voice.draw(f.getContext(), stave); + ok(true); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(TextNoteTests); + + + +/***/ }), + +/***/ "./tests/threevoice_tests.ts": +/*!***********************************!*\ + !*** ./tests/threevoice_tests.ts ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ThreeVoicesTests": () => (/* binding */ ThreeVoicesTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_beam__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/beam */ "./src/beam.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Three Voices Tests - Three voices in single staff. + + +const ThreeVoicesTests = { + Start() { + // TODO: Rename the module to 'Three Voices', because we aren't really testing rests. + QUnit.module('Three Voice Rests'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Three Voices - #1', threeVoices1); + run('Three Voices - #2 Complex', threeVoices2); + run('Three Voices - #3', threeVoices3); + run('Auto Adjust Rest Positions - Two Voices', autoRestTwoVoices); + run('Auto Adjust Rest Positions - Three Voices #1', autoRestThreeVoices1); + run('Auto Adjust Rest Positions - Three Voices #2', autoRestThreeVoices2); + }, +}; +/** + * Helper for setting up the first three test cases: threeVoices1, threeVoices2, threeVoices3. + */ +function createThreeVoicesTest(noteGroup1, noteGroup2, noteGroup3, setup) { + return (options) => { + const factory = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 200); + const stave = factory.Stave().addClef('treble').addTimeSignature('4/4'); + const score = factory.EasyScore(); + // Convert each noteGroup array to StaveNote[]. + const noteGroups = [noteGroup1, noteGroup2, noteGroup3].map((args) => score.notes(...args)); + const voices = noteGroups.map((notes) => score.voice(notes)); + setup(factory, voices); + const beams = [ + _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.applyAndGetBeams(voices[0], +1), + _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.applyAndGetBeams(voices[1], -1), + _src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.applyAndGetBeams(voices[2], -1), + ].reduce(_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.concat); + // Set option to position rests near the notes in each voice. + factory.Formatter().joinVoices(voices).formatToStave(voices, stave); + factory.draw(); + for (let i = 0; i < beams.length; i++) { + beams[i].setContext(factory.getContext()).draw(); + } + ok(true); + }; +} +/** + * + */ +const threeVoices1 = createThreeVoicesTest(['e5/2, e5', { stem: 'up' }], ['(d4 a4 d#5)/8, b4, (d4 a4 c5), b4, (d4 a4 c5), b4, (d4 a4 c5), b4', { stem: 'down' }], ['b3/4, e3, f3, a3', { stem: 'down' }], (f, voices) => { + voices[0].getTickables()[0].addModifier(f.Fingering({ number: '0', position: 'left' }), 0); + voices[1] + .getTickables()[0] + .addModifier(f.Fingering({ number: '0', position: 'left' }), 0) + .addModifier(f.Fingering({ number: '4', position: 'left' }), 1); +}); +/** + * Lots of beamed notes. A beam and notehead overlap. + */ +const threeVoices2 = createThreeVoicesTest(['(a4 e5)/16, e5, e5, e5, e5/8, e5, e5/2', { stem: 'up' }], ['(d4 d#5)/16, (b4 c5), d5, e5, (d4 a4 c5)/8, b4, (d4 a4 c5), b4, (d4 a4 c5), b4', { stem: 'down' }], ['b3/8, b3, e3/4, f3, a3', { stem: 'down' }], (f, voices) => { + voices[0] + .getTickables()[0] + .addModifier(f.Fingering({ number: '2', position: 'left' }), 0) + .addModifier(f.Fingering({ number: '0', position: 'above' }), 1); + voices[1] + .getTickables()[0] + .addModifier(f.Fingering({ number: '0', position: 'left' }), 0) + .addModifier(f.Fingering({ number: '4', position: 'left' }), 1); +}); +/** + * + */ +const threeVoices3 = createThreeVoicesTest(['(g4 e5)/4, e5, (g4 e5)/2', { stem: 'up' }], ['c#5/4, b4/8, b4/8/r, a4/4., g4/8', { stem: 'down' }], ['c4/4, b3, a3, g3', { stem: 'down' }], (f, voices) => { + voices[0] + .getTickables()[0] + .addModifier(f.Fingering({ number: '0', position: 'left' }), 0) + .addModifier(f.Fingering({ number: '0', position: 'left' }), 1); + voices[1].getTickables()[0].addModifier(f.Fingering({ number: '1', position: 'left' }), 0); + voices[2].getTickables()[0].addModifier(f.Fingering({ number: '3', position: 'left' }), 0); +}); +function autoRestTwoVoices(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 900, 200); + const score = f.EasyScore(); + let x = 10; + let beams = []; + function createMeasure(measureTitle, width, align_rests) { + const stave = f.Stave({ x: x, y: 50, width: width }).setBegBarType(1); + x += width; + const noteArrays = [ + score.notes('b4/8/r, e5/16, b4/r, b4/8/r, e5/16, b4/r, b4/8/r, d5/16, b4/r, e5/4', { stem: 'up' }), + score.notes('c5/16, c4, b4/r, d4, e4, f4, b4/r, g4, g4[stem="up"], a4[stem="up"], b4/r, b4[stem="up"], e4/4', { + stem: 'down', + }), + [f.TextNote({ text: measureTitle, line: -1, duration: '1', smooth: true })], + ]; + const voices = noteArrays.map((notes) => score.voice(notes)); + beams = beams.concat(_src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.applyAndGetBeams(voices[0], 1)).concat(_src_beam__WEBPACK_IMPORTED_MODULE_1__.Beam.applyAndGetBeams(voices[1], -1)); + f.Formatter().joinVoices(voices).formatToStave(voices, stave, { align_rests }); + } + createMeasure('Default Rest Positions', 400, false); + createMeasure('Rests Repositioned To Avoid Collisions', 400, true); + f.draw(); + for (let i = 0; i < beams.length; i++) { + beams[i].setContext(f.getContext()).draw(); + } + ok(true, 'Auto Adjust Rests - Two Voices'); +} +function autoRestThreeVoices1(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 850, 200); + const score = f.EasyScore(); + let x = 10; + function createMeasure(measureTitle, width, align_rests) { + const stave = f.Stave({ x: x, y: 50, width: width }).setBegBarType(1); + const voices = [ + score.voice(score.notes('b4/4/r, e5, e5/r, e5/r, e5, e5, e5, e5/r', { stem: 'up' }), { time: '8/4' }), + score.voice(score.notes('b4/4/r, b4/r, b4/r, b4, b4/r, b4/r, b4, b4', { stem: 'down' }), { time: '8/4' }), + score.voice(score.notes('e4/4/r, e4/r, f4, b4/r, g4, c4, e4/r, c4', { stem: 'down' }), { time: '8/4' }), + score.voice([ + f.TextNote({ text: measureTitle, duration: '1', line: -1, smooth: true }), + f.TextNote({ text: '', duration: '1', line: -1, smooth: true }), + ], { time: '8/4' }), + ]; + f.Formatter().joinVoices(voices).formatToStave(voices, stave, { align_rests }); + x += width; + } + createMeasure('Default Rest Positions', 400, false); + createMeasure('Rests Repositioned To Avoid Collisions', 400, true); + f.draw(); + ok(true); +} +function autoRestThreeVoices2(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 850, 200); + const score = f.EasyScore(); + let x = 10; + function createMeasure(measureTitle, width, align_rests) { + const stave = f.Stave({ x: x, y: 50, width: width }).setBegBarType(1); + const voices = [ + score.voice(score.notes('b4/16/r, e5, e5/r, e5/r, e5, e5, e5, e5/r'), { time: '2/4' }), + score.voice(score.notes('b4/16/r, b4/r, b4/r, b4, b4/r, b4/r, b4, b4'), { time: '2/4' }), + score.voice(score.notes('e4/16/r, e4/r, f4, b4/r, g4, c4, e4/r, c4'), { time: '2/4' }), + score.voice([f.TextNote({ text: measureTitle, duration: 'h', line: -1, smooth: true })], { time: '2/4' }), + ]; + f.Formatter().joinVoices(voices).formatToStave(voices, stave, { align_rests }); + x += width; + } + createMeasure('Default Rest Positions', 400, false); + createMeasure('Rests Repositioned To Avoid Collisions', 400, true); + f.draw(); + ok(true); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(ThreeVoicesTests); + + + +/***/ }), + +/***/ "./tests/tickcontext_tests.ts": +/*!************************************!*\ + !*** ./tests/tickcontext_tests.ts ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TickContextTests": () => (/* binding */ TickContextTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_flow__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/flow */ "./src/flow.ts"); +/* harmony import */ var _src_tickcontext__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/tickcontext */ "./src/tickcontext.ts"); +/* harmony import */ var _mocks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./mocks */ "./tests/mocks.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// TickContext Tests + + + + +const TickContextTests = { + Start() { + QUnit.module('TickContext'); + test('Current Tick Test', currentTick); + test('Tracking Test', tracking); + }, +}; +function currentTick() { + const tc = new _src_tickcontext__WEBPACK_IMPORTED_MODULE_2__.TickContext(); + equal(tc.getCurrentTick().value(), 0, 'New tick context has no ticks'); +} +function tracking() { + const BEAT = (1 * _src_flow__WEBPACK_IMPORTED_MODULE_1__.Flow.RESOLUTION) / 4; + const tickables = [ + new _mocks__WEBPACK_IMPORTED_MODULE_3__.MockTickable().setTicks(BEAT).setWidth(10), + new _mocks__WEBPACK_IMPORTED_MODULE_3__.MockTickable().setTicks(BEAT * 2).setWidth(20), + new _mocks__WEBPACK_IMPORTED_MODULE_3__.MockTickable().setTicks(BEAT).setWidth(30), + ]; + const tc = new _src_tickcontext__WEBPACK_IMPORTED_MODULE_2__.TickContext(); + tc.setPadding(0); + tc.addTickable(tickables[0]); + equal(tc.getMaxTicks().value(), BEAT); + tc.addTickable(tickables[1]); + equal(tc.getMaxTicks().value(), BEAT * 2); + tc.addTickable(tickables[2]); + equal(tc.getMaxTicks().value(), BEAT * 2); + equal(tc.getWidth(), 0); + tc.preFormat(); + equal(tc.getWidth(), 30); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(TickContextTests); + + + +/***/ }), + +/***/ "./tests/timesignature_tests.ts": +/*!**************************************!*\ + !*** ./tests/timesignature_tests.ts ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TimeSignatureTests": () => (/* binding */ TimeSignatureTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_stave__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/stave */ "./src/stave.ts"); +/* harmony import */ var _src_staveconnector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/staveconnector */ "./src/staveconnector.ts"); +/* harmony import */ var _src_timesignature__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/timesignature */ "./src/timesignature.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// TimeSignature Tests + + + + +const TimeSignatureTests = { + Start() { + QUnit.module('TimeSignature'); + test('Time Signature Parser', parser); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Basic Time Signatures', basic); + run('Big Signature Test', big); + run('Additive Signature Test', additive); + run('Alternating Signature Test', alternating); + run('Interchangeable Signature Test', interchangeable); + run('Aggregate Signature Test', agregate); + run('Complex Signature Test', complex); + run('Time Signature multiple staves alignment test', multiple); + run('Time Signature Change Test', change); + }, +}; +function parser() { + const timeSig = new _src_timesignature__WEBPACK_IMPORTED_MODULE_3__.TimeSignature(); + const mustFail = ['asdf', '123/', '/10', '/', '4567', 'C+', '1+', '+1', '(3+', '+3)', '()', '(+)']; + mustFail.forEach((invalidString) => { + throws(() => timeSig.parseTimeSpec(invalidString), /BadTimeSignature/); + }); + const mustPass = ['4/4', '10/12', '1/8', '1234567890/1234567890', 'C', 'C|', '+']; + mustPass.forEach((validString) => timeSig.parseTimeSpec(validString)); + ok(true, 'all pass'); +} +function basic(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 600, 120); + new _src_stave__WEBPACK_IMPORTED_MODULE_1__.Stave(10, 10, 500) + .addTimeSignature('2/2') + .addTimeSignature('3/4') + .addTimeSignature('4/4') + .addTimeSignature('6/8') + .addTimeSignature('C') + .addTimeSignature('C|') + .addEndTimeSignature('2/2') + .addEndTimeSignature('3/4') + .addEndTimeSignature('4/4') + .addEndClef('treble') + .addEndTimeSignature('6/8') + .addEndTimeSignature('C') + .addEndTimeSignature('C|') + .setContext(ctx) + .draw(); + ok(true, 'all pass'); +} +function big(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 120); + new _src_stave__WEBPACK_IMPORTED_MODULE_1__.Stave(10, 10, 300) + .addTimeSignature('12/8') + .addTimeSignature('7/16') + .addTimeSignature('1234567/890') + .addTimeSignature('987/654321') + .setContext(ctx) + .draw(); + ok(true, 'all pass'); +} +function additive(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 120); + new _src_stave__WEBPACK_IMPORTED_MODULE_1__.Stave(10, 10, 300).addTimeSignature('2+3+2/8').setContext(ctx).draw(); + ok(true, 'all pass'); +} +function alternating(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 120); + new _src_stave__WEBPACK_IMPORTED_MODULE_1__.Stave(10, 10, 300).addTimeSignature('6/8').addTimeSignature('+').addTimeSignature('3/4').setContext(ctx).draw(); + ok(true, 'all pass'); +} +function interchangeable(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 120); + new _src_stave__WEBPACK_IMPORTED_MODULE_1__.Stave(10, 10, 300).addTimeSignature('3/4').addTimeSignature('-').addTimeSignature('2/4').setContext(ctx).draw(); + ok(true, 'all pass'); +} +function agregate(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 120); + new _src_stave__WEBPACK_IMPORTED_MODULE_1__.Stave(10, 10, 300) + .addTimeSignature('2/4') + .addTimeSignature('+') + .addTimeSignature('3/8') + .addTimeSignature('+') + .addTimeSignature('5/4') + .setContext(ctx) + .draw(); + ok(true, 'all pass'); +} +function complex(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 120); + new _src_stave__WEBPACK_IMPORTED_MODULE_1__.Stave(10, 10, 300) + .addTimeSignature('(2+3)/16') + .addTimeSignature('+') + .addTimeSignature('3/8') + .setContext(ctx) + .draw(); + ok(true, 'all pass'); +} +function multiple(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 350); + // Each StaveLineConfig object is of the form { visible: boolean }. + const stave1LineConfig = [false, false, true, false, false].map((visible) => ({ visible })); + const stave1 = new _src_stave__WEBPACK_IMPORTED_MODULE_1__.Stave(15, 0, 300) + .setConfigForLines(stave1LineConfig) + .addClef('percussion') + .addTimeSignature('4/4', 25) // passing the custom padding in pixels + .setContext(ctx) + .draw(); + const stave2 = new _src_stave__WEBPACK_IMPORTED_MODULE_1__.Stave(15, 110, 300).addClef('treble').addTimeSignature('4/4').setContext(ctx).draw(); + const stave3 = new _src_stave__WEBPACK_IMPORTED_MODULE_1__.Stave(15, 220, 300).addClef('bass').addTimeSignature('4/4').setContext(ctx).draw(); + new _src_staveconnector__WEBPACK_IMPORTED_MODULE_2__.StaveConnector(stave1, stave2).setType('single').setContext(ctx).draw(); + new _src_staveconnector__WEBPACK_IMPORTED_MODULE_2__.StaveConnector(stave2, stave3).setType('single').setContext(ctx).draw(); + new _src_staveconnector__WEBPACK_IMPORTED_MODULE_2__.StaveConnector(stave2, stave3).setType('brace').setContext(ctx).draw(); + ok(true, 'all pass'); +} +function change(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 900); + const stave = f.Stave({ x: 0, y: 0 }).addClef('treble').addTimeSignature('C|'); + const tickables = [ + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'treble' }), + f.TimeSigNote({ time: '3/4' }), + f.StaveNote({ keys: ['d/4'], duration: '4', clef: 'alto' }), + f.StaveNote({ keys: ['b/3'], duration: '4r', clef: 'alto' }), + f.TimeSigNote({ time: 'C' }), + f.StaveNote({ keys: ['c/3', 'e/3', 'g/3'], duration: '4', clef: 'bass' }), + f.TimeSigNote({ time: '9/8' }), + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'treble' }), + ]; + const voice = f.Voice().setStrict(false).addTickables(tickables); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'all pass'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(TimeSignatureTests); + + + +/***/ }), + +/***/ "./tests/tremolo_tests.ts": +/*!********************************!*\ + !*** ./tests/tremolo_tests.ts ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TremoloTests": () => (/* binding */ TremoloTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_stavebarline__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/stavebarline */ "./src/stavebarline.ts"); +/* harmony import */ var _src_tremolo__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/tremolo */ "./src/tremolo.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Tremolo Tests + + + +const TremoloTests = { + Start() { + QUnit.module('Tremolo'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Tremolo - Basic', tremoloBasic); + run('Tremolo - Big', tremoloBig); + }, +}; +function tremoloBasic(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 200); + const score = f.EasyScore(); + // bar 1 + const stave1 = f.Stave({ width: 250 }).setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_1__.Barline.type.DOUBLE); + const notes1 = score.notes('e4/4, e4, e4, e4', { stem: 'up' }); + notes1[0].addModifier(new _src_tremolo__WEBPACK_IMPORTED_MODULE_2__.Tremolo(3), 0); + notes1[1].addModifier(new _src_tremolo__WEBPACK_IMPORTED_MODULE_2__.Tremolo(2), 0); + notes1[2].addModifier(new _src_tremolo__WEBPACK_IMPORTED_MODULE_2__.Tremolo(1), 0); + const voice1 = score.voice(notes1); + f.Formatter().joinVoices([voice1]).formatToStave([voice1], stave1); + // bar 2 + const stave2 = f + .Stave({ x: stave1.getWidth() + stave1.getX(), y: stave1.getY(), width: 300 }) + .setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_1__.Barline.type.DOUBLE); + const notes2 = score.notes('e5/4, e5, e5, e5', { stem: 'down' }); + notes2[1].addModifier(new _src_tremolo__WEBPACK_IMPORTED_MODULE_2__.Tremolo(1), 0); + notes2[2].addModifier(new _src_tremolo__WEBPACK_IMPORTED_MODULE_2__.Tremolo(2), 0); + notes2[3].addModifier(new _src_tremolo__WEBPACK_IMPORTED_MODULE_2__.Tremolo(3), 0); + const voice2 = score.voice(notes2); + f.Formatter().joinVoices([voice2]).formatToStave([voice2], stave2); + f.draw(); + ok(true, 'Tremolo - Basic'); +} +function tremoloBig(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600, 200); + const score = f.EasyScore(); + // bar 1 + const stave1 = f.Stave({ width: 250 }).setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_1__.Barline.type.DOUBLE); + const notes1 = score.notes('e4/4, e4, e4, e4', { stem: 'up' }); + const tremolo1 = new _src_tremolo__WEBPACK_IMPORTED_MODULE_2__.Tremolo(3); + tremolo1.extra_stroke_scale = 1.7; + tremolo1.y_spacing_scale = 1.5; + const tremolo2 = new _src_tremolo__WEBPACK_IMPORTED_MODULE_2__.Tremolo(2); + tremolo2.extra_stroke_scale = 1.7; + tremolo2.y_spacing_scale = 1.5; + const tremolo3 = new _src_tremolo__WEBPACK_IMPORTED_MODULE_2__.Tremolo(1); + tremolo3.extra_stroke_scale = 1.7; + tremolo3.y_spacing_scale = 1.5; + notes1[0].addModifier(tremolo1, 0); + notes1[1].addModifier(tremolo2, 0); + notes1[2].addModifier(tremolo3, 0); + const voice1 = score.voice(notes1); + f.Formatter().joinVoices([voice1]).formatToStave([voice1], stave1); + // bar 2 + const stave2 = f + .Stave({ x: stave1.getWidth() + stave1.getX(), y: stave1.getY(), width: 300 }) + .setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_1__.Barline.type.DOUBLE); + const notes2 = score.notes('e5/4, e5, e5, e5', { stem: 'down' }); + const tremolo4 = new _src_tremolo__WEBPACK_IMPORTED_MODULE_2__.Tremolo(1); + tremolo4.extra_stroke_scale = 1.7; + tremolo4.y_spacing_scale = 1.5; + const tremolo5 = new _src_tremolo__WEBPACK_IMPORTED_MODULE_2__.Tremolo(2); + tremolo5.extra_stroke_scale = 1.7; + tremolo5.y_spacing_scale = 1.5; + const tremolo6 = new _src_tremolo__WEBPACK_IMPORTED_MODULE_2__.Tremolo(3); + tremolo6.extra_stroke_scale = 1.7; + tremolo6.y_spacing_scale = 1.5; + notes2[1].addModifier(tremolo4, 0); + notes2[2].addModifier(tremolo5, 0); + notes2[3].addModifier(tremolo6, 0); + const voice2 = score.voice(notes2); + f.Formatter().joinVoices([voice2]).formatToStave([voice2], stave2); + f.draw(); + ok(true, 'Tremolo - Big'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(TremoloTests); + + + +/***/ }), + +/***/ "./tests/tuning_tests.ts": +/*!*******************************!*\ + !*** ./tests/tuning_tests.ts ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TuningTests": () => (/* binding */ TuningTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_tuning__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/tuning */ "./src/tuning.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Tuning Tests + + +const TuningTests = { + Start() { + QUnit.module('Tuning'); + test('Standard Tuning', standard); + test('Standard Banjo Tuning', banjo); + test('Return note for fret', noteForFret); + }, +}; +/** + * Helper function to verify that the provided tuning matches a standard 6-string guitar. + */ +function checkStandard(tuning) { + throws(() => tuning.getValueForString(0), /BadArguments/, 'String 0'); + throws(() => tuning.getValueForString(9), /BadArguments/, 'String 9'); + // TODO: Tuning constructor has a bug in that the default tuning has 8 strings. + // See: 'E/5,B/4,G/4,D/4,A/3,E/3,B/2,E/2' in tuning.ts constructor. + // throws(() => tuning.getValueForString(7), /BadArguments/, 'String 7'); + // Tuning.getValueForString() returns a note number where the value 60 corresponds to middle C. + equal(tuning.getValueForString(6), 40, 'Low E string'); + equal(tuning.getValueForString(5), 45, 'A string'); + equal(tuning.getValueForString(4), 50, 'D string'); + equal(tuning.getValueForString(3), 55, 'G string'); + equal(tuning.getValueForString(2), 59, 'B string'); + equal(tuning.getValueForString(1), 64, 'High E string'); +} +/** + * Helper function to verify that the provided tuning matches a standard 5-string banjo. + */ +function checkStandardBanjo(tuning) { + throws(() => tuning.getValueForString(0), /BadArguments/, 'String 0'); + throws(() => tuning.getValueForString(6), /BadArguments/, 'String 6'); + equal(tuning.getValueForString(5), 67, 'High G string'); + equal(tuning.getValueForString(4), 50, 'D string'); + equal(tuning.getValueForString(3), 55, 'G string'); + equal(tuning.getValueForString(2), 59, 'B string'); + equal(tuning.getValueForString(1), 62, 'High D string'); +} +function standard() { + expect(16); + const tuning = new _src_tuning__WEBPACK_IMPORTED_MODULE_1__.Tuning(); + checkStandard(tuning); + // Set the tuning by specifying a name: 'standard'. + tuning.setTuning('standard'); + checkStandard(tuning); +} +function banjo() { + expect(7); + const tuning = new _src_tuning__WEBPACK_IMPORTED_MODULE_1__.Tuning(); + tuning.setTuning('standardBanjo'); + checkStandardBanjo(tuning); +} +function noteForFret() { + expect(8); + const tuning = new _src_tuning__WEBPACK_IMPORTED_MODULE_1__.Tuning('E/5,B/4,G/4,D/4,A/3,E/3'); + throws(() => tuning.getNoteForFret(-1, 1), /BadArguments/, 'Fret = -1'); + throws(() => tuning.getNoteForFret(1, -1), /BadArguments/, 'String = -1'); + equal(tuning.getNoteForFret(0, 1), 'E/5', 'High E string'); + equal(tuning.getNoteForFret(5, 1), 'A/5', 'High E string, fret 5'); + equal(tuning.getNoteForFret(0, 2), 'B/4', 'B string'); + equal(tuning.getNoteForFret(0, 3), 'G/4', 'G string'); + equal(tuning.getNoteForFret(12, 2), 'B/5', 'B string, fret 12'); + equal(tuning.getNoteForFret(0, 6), 'E/3', 'Low E string'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(TuningTests); + + + +/***/ }), + +/***/ "./tests/tuplet_tests.ts": +/*!*******************************!*\ + !*** ./tests/tuplet_tests.ts ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TupletTests": () => (/* binding */ TupletTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_dot__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/dot */ "./src/dot.ts"); +/* harmony import */ var _src_formatter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/formatter */ "./src/formatter.ts"); +/* harmony import */ var _src_stem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/stem */ "./src/stem.ts"); +/* harmony import */ var _src_tuplet__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/tuplet */ "./src/tuplet.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Tuplet Tests + + + + + +const TupletTests = { + Start() { + QUnit.module('Tuplet'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Simple Tuplet', simple); + run('Beamed Tuplet', beamed); + run('Ratioed Tuplet', ratio); + run('Bottom Tuplet', bottom); + run('Bottom Ratioed Tuplet', bottomRatio); + run('Awkward Tuplet', awkward); + run('Complex Tuplet', complex); + run('Mixed Stem Direction Tuplet', mixedTop); + run('Mixed Stem Direction Bottom Tuplet', mixedBottom); + run('Nested Tuplets', nested); + run('Single Tuplets', single); + }, +}; +// Helper Functions to set the stem direction and duration of the options objects (i.e., StaveNoteStruct) +// that are ultimately passed into Factory.StaveNote(). +// eslint-disable-next-line +const set = (key) => (value) => (object) => { + object[key] = value; + return object; +}; +const setStemDirection = set('stem_direction'); +const setStemUp = setStemDirection(_src_stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP); +const setStemDown = setStemDirection(_src_stem__WEBPACK_IMPORTED_MODULE_3__.Stem.DOWN); +const setDurationToQuarterNote = set('duration')('4'); +/** + * Simple test case with one ascending triplet and one descending triplet. + */ +function simple(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave({ x: 10, y: 10, width: 350 }).addTimeSignature('3/4'); + const notes = [ + { keys: ['g/4'], duration: '4' }, + { keys: ['a/4'], duration: '4' }, + { keys: ['b/4'], duration: '4' }, + { keys: ['b/4'], duration: '8' }, + { keys: ['a/4'], duration: '8' }, + { keys: ['g/4'], duration: '8' }, + ] + .map(setStemUp) + .map(f.StaveNote.bind(f)); + f.Tuplet({ notes: notes.slice(0, 3) }); + f.Tuplet({ notes: notes.slice(3, 6) }); + // 3/4 time + const voice = f + .Voice({ time: { num_beats: 3, beat_value: 4 } }) + .setStrict(true) + .addTickables(notes); + new _src_formatter__WEBPACK_IMPORTED_MODULE_2__.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Simple Test'); +} +function beamed(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave({ x: 10, y: 10, width: 350 }).addTimeSignature('3/8'); + const notes = [ + { keys: ['b/4'], duration: '16' }, + { keys: ['a/4'], duration: '16' }, + { keys: ['g/4'], duration: '16' }, + { keys: ['a/4'], duration: '8' }, + { keys: ['f/4'], duration: '8' }, + { keys: ['a/4'], duration: '8' }, + { keys: ['f/4'], duration: '8' }, + { keys: ['a/4'], duration: '8' }, + { keys: ['f/4'], duration: '8' }, + { keys: ['g/4'], duration: '8' }, + ] + .map(setStemUp) + .map(f.StaveNote.bind(f)); + f.Beam({ notes: notes.slice(0, 3) }); + f.Beam({ notes: notes.slice(3, 10) }); + f.Tuplet({ notes: notes.slice(0, 3) }); + f.Tuplet({ notes: notes.slice(3, 10) }); + // 3/8 time + const voice = f + .Voice({ time: { num_beats: 3, beat_value: 8 } }) + .setStrict(true) + .addTickables(notes); + new _src_formatter__WEBPACK_IMPORTED_MODULE_2__.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Beamed Test'); +} +function ratio(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave({ x: 10, y: 10, width: 350 }).addTimeSignature('4/4'); + const notes = [ + { keys: ['f/4'], duration: '4' }, + { keys: ['a/4'], duration: '4' }, + { keys: ['b/4'], duration: '4' }, + { keys: ['g/4'], duration: '8' }, + { keys: ['e/4'], duration: '8' }, + { keys: ['g/4'], duration: '8' }, + ] + .map(setStemUp) + .map(f.StaveNote.bind(f)); + f.Beam({ + notes: notes.slice(3, 6), + }); + f.Tuplet({ + notes: notes.slice(0, 3), + options: { + ratioed: true, + }, + }); + f.Tuplet({ + notes: notes.slice(3, 6), + options: { + ratioed: true, + notes_occupied: 4, + }, + }); + const voice = f.Voice().setStrict(true).addTickables(notes); + new _src_formatter__WEBPACK_IMPORTED_MODULE_2__.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Ratioed Test'); +} +function bottom(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 350, 160); + const stave = f.Stave({ x: 10, y: 10 }).addTimeSignature('3/4'); + const notes = [ + { keys: ['f/4'], duration: '4' }, + { keys: ['c/4'], duration: '4' }, + { keys: ['g/4'], duration: '4' }, + { keys: ['d/5'], duration: '8' }, + { keys: ['g/3'], duration: '8' }, + { keys: ['b/4'], duration: '8' }, + ] + .map(setStemDown) + .map(f.StaveNote.bind(f)); + f.Beam({ + notes: notes.slice(3, 6), + }); + f.Tuplet({ + notes: notes.slice(0, 3), + options: { location: _src_tuplet__WEBPACK_IMPORTED_MODULE_4__.Tuplet.LOCATION_BOTTOM }, + }); + f.Tuplet({ + notes: notes.slice(3, 6), + options: { location: _src_tuplet__WEBPACK_IMPORTED_MODULE_4__.Tuplet.LOCATION_BOTTOM }, + }); + const voice = f + .Voice({ time: { num_beats: 3, beat_value: 4 } }) + .setStrict(true) + .addTickables(notes); + new _src_formatter__WEBPACK_IMPORTED_MODULE_2__.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Bottom Test'); +} +function bottomRatio(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 350, 160); + const stave = f.Stave({ x: 10, y: 10 }).addTimeSignature('5/8'); + const notes = [ + { keys: ['f/4'], duration: '4' }, + { keys: ['c/4'], duration: '4' }, + { keys: ['d/4'], duration: '4' }, + { keys: ['d/5'], duration: '8' }, + { keys: ['g/5'], duration: '8' }, + { keys: ['b/4'], duration: '8' }, + ] + .map(setStemDown) + .map(f.StaveNote.bind(f)); + f.Beam({ + notes: notes.slice(3, 6), + }); + f.Tuplet({ + notes: notes.slice(0, 3), + options: { + location: _src_tuplet__WEBPACK_IMPORTED_MODULE_4__.Tuplet.LOCATION_BOTTOM, + ratioed: true, + }, + }); + f.Tuplet({ + notes: notes.slice(3, 6), + options: { + location: _src_tuplet__WEBPACK_IMPORTED_MODULE_4__.Tuplet.LOCATION_BOTTOM, + notes_occupied: 1, + }, + }); + const voice = f + .Voice({ time: { num_beats: 5, beat_value: 8 } }) + .setStrict(true) + .addTickables(notes); + new _src_formatter__WEBPACK_IMPORTED_MODULE_2__.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Bottom Ratioed Test'); +} +function awkward(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 370, 160); + const stave = f.Stave({ x: 10, y: 10 }); + const notes = [ + { keys: ['g/4'], duration: '16' }, + { keys: ['b/4'], duration: '16' }, + { keys: ['a/4'], duration: '16' }, + { keys: ['a/4'], duration: '16' }, + { keys: ['g/4'], duration: '16' }, + { keys: ['f/4'], duration: '16' }, + { keys: ['e/4'], duration: '16' }, + { keys: ['c/4'], duration: '16' }, + { keys: ['g/4'], duration: '16' }, + { keys: ['a/4'], duration: '16' }, + { keys: ['f/4'], duration: '16' }, + { keys: ['e/4'], duration: '16' }, + { keys: ['c/4'], duration: '8' }, + { keys: ['d/4'], duration: '8' }, + { keys: ['e/4'], duration: '8' }, + ] + .map(setStemUp) + .map(f.StaveNote.bind(f)); + f.Beam({ notes: notes.slice(0, 12) }); + f.Tuplet({ + notes: notes.slice(0, 12), + options: { + notes_occupied: 142, + ratioed: true, + }, + }); + f.Tuplet({ + notes: notes.slice(12, 15), + options: { + ratioed: true, + }, + }).setBracketed(true); + const voice = f.Voice().setStrict(false).addTickables(notes); + new _src_formatter__WEBPACK_IMPORTED_MODULE_2__.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Awkward Test'); +} +function complex(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 600); + const stave = f.Stave({ x: 10, y: 10 }).addTimeSignature('4/4'); + const notes1 = [ + { keys: ['b/4'], duration: '8d' }, + { keys: ['a/4'], duration: '16' }, + { keys: ['g/4'], duration: '8' }, + { keys: ['a/4'], duration: '16' }, + { keys: ['b/4'], duration: '16r' }, + { keys: ['g/4'], duration: '32' }, + { keys: ['f/4'], duration: '32' }, + { keys: ['g/4'], duration: '32' }, + { keys: ['f/4'], duration: '32' }, + { keys: ['a/4'], duration: '16' }, + { keys: ['f/4'], duration: '8' }, + { keys: ['b/4'], duration: '8' }, + { keys: ['a/4'], duration: '8' }, + { keys: ['g/4'], duration: '8' }, + { keys: ['b/4'], duration: '8' }, + { keys: ['a/4'], duration: '8' }, + ] + .map(setStemUp) + .map(f.StaveNote.bind(f)); + _src_dot__WEBPACK_IMPORTED_MODULE_1__.Dot.buildAndAttach([notes1[0]], { all: true }); + const notes2 = [{ keys: ['c/4'] }, { keys: ['c/4'] }, { keys: ['c/4'] }, { keys: ['c/4'] }] + .map(setDurationToQuarterNote) + .map(setStemDown) + .map(f.StaveNote.bind(f)); + f.Beam({ notes: notes1.slice(0, 3) }); + f.Beam({ notes: notes1.slice(5, 9) }); + f.Beam({ notes: notes1.slice(11, 16) }); + f.Tuplet({ + notes: notes1.slice(0, 3), + }); + f.Tuplet({ + notes: notes1.slice(3, 11), + options: { + num_notes: 7, + notes_occupied: 4, + ratioed: false, + }, + }); + f.Tuplet({ + notes: notes1.slice(11, 16), + options: { + notes_occupied: 4, + }, + }); + const voice1 = f.Voice().setStrict(true).addTickables(notes1); + const voice2 = f.Voice().setStrict(true).addTickables(notes2); + new _src_formatter__WEBPACK_IMPORTED_MODULE_2__.Formatter().joinVoices([voice1, voice2]).formatToStave([voice1, voice2], stave); + f.draw(); + ok(true, 'Complex Test'); +} +function mixedTop(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave({ x: 10, y: 10 }); + const notes = [ + { keys: ['a/4'], stem_direction: 1 }, + { keys: ['c/6'], stem_direction: -1 }, + { keys: ['a/4'], stem_direction: 1 }, + { keys: ['f/5'], stem_direction: 1 }, + { keys: ['a/4'], stem_direction: -1 }, + { keys: ['c/6'], stem_direction: -1 }, + ] + .map(setDurationToQuarterNote) + .map(f.StaveNote.bind(f)); + f.Tuplet({ + notes: notes.slice(0, 2), + options: { + notes_occupied: 3, + }, + }); + f.Tuplet({ + notes: notes.slice(2, 4), + options: { + notes_occupied: 3, + }, + }); + f.Tuplet({ + notes: notes.slice(4, 6), + options: { + notes_occupied: 3, + }, + }); + const voice = f.Voice().setStrict(false).addTickables(notes); + new _src_formatter__WEBPACK_IMPORTED_MODULE_2__.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Mixed Stem Direction Tuplet'); +} +function mixedBottom(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave({ x: 10, y: 10 }); + const notes = [ + { keys: ['f/3'], stem_direction: 1 }, + { keys: ['a/5'], stem_direction: -1 }, + { keys: ['a/4'], stem_direction: 1 }, + { keys: ['f/3'], stem_direction: 1 }, + { keys: ['a/4'], stem_direction: -1 }, + { keys: ['c/4'], stem_direction: -1 }, + ] + .map(setDurationToQuarterNote) + .map(f.StaveNote.bind(f)); + f.Tuplet({ + notes: notes.slice(0, 2), + options: { + notes_occupied: 3, + }, + }); + f.Tuplet({ + notes: notes.slice(2, 4), + options: { + notes_occupied: 3, + }, + }); + f.Tuplet({ + notes: notes.slice(4, 6), + options: { + notes_occupied: 3, + }, + }); + const voice = f.Voice().setStrict(false).addTickables(notes); + new _src_formatter__WEBPACK_IMPORTED_MODULE_2__.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Mixed Stem Direction Bottom Tuplet'); +} +function nested(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave({ x: 10, y: 10 }).addTimeSignature('4/4'); + const notes = [ + // Big triplet 1: + { keys: ['b/4'], duration: '4' }, + { keys: ['a/4'], duration: '4' }, + { keys: ['g/4'], duration: '16' }, + { keys: ['a/4'], duration: '16' }, + { keys: ['f/4'], duration: '16' }, + { keys: ['a/4'], duration: '16' }, + { keys: ['g/4'], duration: '16' }, + { keys: ['b/4'], duration: '2' }, + ] + .map(setStemUp) + .map(f.StaveNote.bind(f)); + f.Beam({ + notes: notes.slice(2, 7), + }); + f.Tuplet({ + notes: notes.slice(0, 7), + options: { + notes_occupied: 2, + num_notes: 3, + }, + }); + f.Tuplet({ + notes: notes.slice(2, 7), + options: { + notes_occupied: 4, + num_notes: 5, + }, + }); + // 4/4 time + const voice = f.Voice().setStrict(true).addTickables(notes); + new _src_formatter__WEBPACK_IMPORTED_MODULE_2__.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Nested Tuplets'); +} +function single(options) { + const f = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options); + const stave = f.Stave({ x: 10, y: 10 }).addTimeSignature('4/4'); + const notes = [ + // Big triplet 1: + { keys: ['c/4'], duration: '4' }, + { keys: ['d/4'], duration: '8' }, + { keys: ['e/4'], duration: '8' }, + { keys: ['f/4'], duration: '8' }, + { keys: ['g/4'], duration: '8' }, + { keys: ['a/4'], duration: '2' }, + { keys: ['b/4'], duration: '4' }, + ] + .map(setStemUp) + .map(f.StaveNote.bind(f)); + f.Beam({ + notes: notes.slice(1, 4), + }); + // big quartuplet + f.Tuplet({ + notes: notes.slice(0, -1), + options: { + num_notes: 4, + notes_occupied: 3, + ratioed: true, + bracketed: true, + }, + }); + // first singleton + f.Tuplet({ + notes: notes.slice(0, 1), + options: { + num_notes: 3, + notes_occupied: 2, + ratioed: true, + }, + }); + // eighth note triplet + f.Tuplet({ + notes: notes.slice(1, 4), + options: { + num_notes: 3, + notes_occupied: 2, + }, + }); + // second singleton + f.Tuplet({ + notes: notes.slice(4, 5), + options: { + num_notes: 3, + notes_occupied: 2, + ratioed: true, + bracketed: true, + }, + }); + // 4/4 time + const voice = f + .Voice({ time: { num_beats: 4, beat_value: 4 } }) + .setStrict(true) + .addTickables(notes); + new _src_formatter__WEBPACK_IMPORTED_MODULE_2__.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Nested Tuplets'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(TupletTests); + + + +/***/ }), + +/***/ "./tests/typeguard_tests.ts": +/*!**********************************!*\ + !*** ./tests/typeguard_tests.ts ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TypeGuardTests": () => (/* binding */ TypeGuardTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_canvascontext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/canvascontext */ "./src/canvascontext.ts"); +/* harmony import */ var _src_stavenote__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/stavenote */ "./src/stavenote.ts"); +/* harmony import */ var _src_stemmablenote__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/stemmablenote */ "./src/stemmablenote.ts"); +/* harmony import */ var _src_tabnote__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/tabnote */ "./src/tabnote.ts"); +/* harmony import */ var _src_typeguard__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author: Ron B. Yeh +// MIT License +// +// TypeGuard Tests +// eslint-disable-next-line +// @ts-nocheck to support ES5 style class declaration in the fakeES5() test case. + + + + + + +const TypeGuardTests = { + Start() { + QUnit.module('TypeGuard'); + test('Real VexFlow Types', real); + test('Fake VexFlow Types in ES5', fakeES5); + test('Fake VexFlow Types in ES6', fakeES6); + test('Edge Case ES5/ES6', edgeCaseES5vsES6); + }, +}; +function real() { + const s = new _src_stavenote__WEBPACK_IMPORTED_MODULE_2__.StaveNote({ keys: ['c/4'], duration: 'w' }); + ok((0,_src_typeguard__WEBPACK_IMPORTED_MODULE_5__.isStaveNote)(s), 'isStaveNote helper function'); + ok((0,_src_typeguard__WEBPACK_IMPORTED_MODULE_5__.isCategory)(s, 'StaveNote'), 'Use isCategory(s, "StaveNote") directly'); + notOk((0,_src_typeguard__WEBPACK_IMPORTED_MODULE_5__.isTabNote)(s), 'isTabNote helper function. s is NOT a TabNote.'); + const t = new _src_tabnote__WEBPACK_IMPORTED_MODULE_4__.TabNote({ positions: [{ str: 2, fret: 1 }], duration: '1' }); + ok((0,_src_typeguard__WEBPACK_IMPORTED_MODULE_5__.isTabNote)(t), 'isTabNote helper function'); + notOk((0,_src_typeguard__WEBPACK_IMPORTED_MODULE_5__.isStaveNote)(t), 't is NOT a StaveNote'); + ok((0,_src_typeguard__WEBPACK_IMPORTED_MODULE_5__.isNote)(s), 'StaveNote extends StemmableNote which extends Note, so s is a Note'); + ok((0,_src_typeguard__WEBPACK_IMPORTED_MODULE_5__.isStemmableNote)(t), 'TabNote extends StemmableNote'); + ok((0,_src_typeguard__WEBPACK_IMPORTED_MODULE_5__.isNote)(t), 'TabNote extends StemmableNote which extends Note, so t is a Note'); + const canvas = document.createElement('canvas'); + canvas.width = 800; + canvas.height = 400; + const ctx = new _src_canvascontext__WEBPACK_IMPORTED_MODULE_1__.CanvasContext(canvas.getContext('2d')); + ok((0,_src_typeguard__WEBPACK_IMPORTED_MODULE_5__.isRenderContext)(ctx), 'ctx is a RenderContext'); +} +/** + * Helper function to test the fake VexFlow objects we create in fakeES5() and fakeES6(). + */ +function checkFakeObjects(fakeStemmableNote, fakeStaveNote) { + ok((0,_src_typeguard__WEBPACK_IMPORTED_MODULE_5__.isStemmableNote)(fakeStemmableNote), 'Fake StemmableNote is a StemmableNote.'); + notOk((0,_src_typeguard__WEBPACK_IMPORTED_MODULE_5__.isNote)(fakeStemmableNote), 'Fake StemmableNote is not a Note (no ancestors with the correct CATEGORY).'); + ok((0,_src_typeguard__WEBPACK_IMPORTED_MODULE_5__.isCategory)(fakeStaveNote, 'StaveNote'), 'Fake StaveNote is a StaveNote.'); + ok((0,_src_typeguard__WEBPACK_IMPORTED_MODULE_5__.isStaveNote)(fakeStaveNote), 'Fake StaveNote is a StaveNote (via helper function).'); + ok((0,_src_typeguard__WEBPACK_IMPORTED_MODULE_5__.isCategory)(fakeStaveNote, 'StemmableNote'), 'Fake StaveNote is also a StemmableNote (via inheritance).'); + notOk((0,_src_typeguard__WEBPACK_IMPORTED_MODULE_5__.isNote)(fakeStaveNote), 'Fake StaveNote is not a Note. CATEGORY does not match.'); +} +/** + * Demonstrate that an object (ES5-style) can pass the isCategory(...) test if it + * has the correct static .CATEGORY property. + */ +function fakeES5() { + function FakeStemmableNote() { + this.isFake = true; + } + FakeStemmableNote.CATEGORY = _src_stemmablenote__WEBPACK_IMPORTED_MODULE_3__.StemmableNote.CATEGORY; + function FakeStaveNote() { + FakeStemmableNote.call(this); + } + FakeStaveNote.CATEGORY = _src_stavenote__WEBPACK_IMPORTED_MODULE_2__.StaveNote.CATEGORY; + FakeStaveNote.prototype = Object.create(FakeStemmableNote.prototype); + FakeStaveNote.prototype.constructor = FakeStaveNote; + const fakeStemmableNote = new FakeStemmableNote(); + const fakeStaveNote = new FakeStaveNote(); + checkFakeObjects(fakeStemmableNote, fakeStaveNote); +} +/** + * Demonstrate that an object (ES6-style) can pass the isCategory(...) test if it + * or its ancestor has the correct static .CATEGORY property. + */ +function fakeES6() { + class FakeStemmableNote { + } + FakeStemmableNote.CATEGORY = _src_stemmablenote__WEBPACK_IMPORTED_MODULE_3__.StemmableNote.CATEGORY; + class FakeStaveNote extends FakeStemmableNote { + } + FakeStaveNote.CATEGORY = _src_stavenote__WEBPACK_IMPORTED_MODULE_2__.StaveNote.CATEGORY; + const fakeStemmableNote = new FakeStemmableNote(); + const fakeStaveNote = new FakeStaveNote(); + checkFakeObjects(fakeStemmableNote, fakeStaveNote); +} +/** + * The tsconfig.json target is ES6 (as of August 18, 2021), so isCategory() works even when the root class "extends Object". + */ +function edgeCaseES5vsES6() { + class Z extends Object { + } + class Y extends Z { + } + class X extends Y { + } + const zInstance = new Z(); + const xInstance = new X(); + ok(xInstance instanceof Object, 'es5 & es6: x IS an instanceof Object'); + // If targeting es5, these three assertions only pass if we remove "extends Object" from the class Z definition. + ok(zInstance instanceof Z, 'es6: z IS an instanceof Z'); + ok(xInstance instanceof Y, 'es6: x IS an instanceof Y'); + ok(xInstance instanceof Z, 'es6: x IS an instanceof Z'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(TypeGuardTests); + + + +/***/ }), + +/***/ "./tests/vexflow_test_helpers.ts": +/*!***************************************!*\ + !*** ./tests/vexflow_test_helpers.ts ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "VexFlowTests": () => (/* binding */ VexFlowTests), +/* harmony export */ "concat": () => (/* binding */ concat), +/* harmony export */ "MAJOR_KEYS": () => (/* binding */ MAJOR_KEYS), +/* harmony export */ "MINOR_KEYS": () => (/* binding */ MINOR_KEYS) +/* harmony export */ }); +/* harmony import */ var _src_index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/index */ "./src/index.ts"); +/* harmony import */ var _src_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com/) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// VexFlow Test Support Library + + +const global = (0,_src_util__WEBPACK_IMPORTED_MODULE_1__.globalObject)(); +// Each test case will switch through the available fonts, and then restore the original font when done. +let originalFontNames; +function useTempFontStack(fontName) { + originalFontNames = _src_index__WEBPACK_IMPORTED_MODULE_0__.Flow.getMusicFont(); + _src_index__WEBPACK_IMPORTED_MODULE_0__.Flow.setMusicFont(...VexFlowTests.FONT_STACKS[fontName]); +} +function restoreOriginalFontStack() { + _src_index__WEBPACK_IMPORTED_MODULE_0__.Flow.setMusicFont(...originalFontNames); +} +// A micro util inspired by jQuery. +if (!global.$) { + // generate_png_images.js uses jsdom and does not include jQuery. + global.$ = (param) => { + let element; + if (typeof param !== 'string') { + element = param; + } + else if (param.startsWith('<')) { + // Extract the tag name: e.g.,
=> div + // Assume param.match returns something (! operator). + // eslint-disable-next-line + const tagName = param.match(/[A-Za-z]+/g)[0]; + element = document.createElement(tagName); + } + else { + element = document.querySelector(param); + } + const $element = { + // eslint-disable-next-line + get(index) { + return element; + }, + addClass(c) { + element.classList.add(c); + return $element; + }, + text(t) { + element.textContent = t; + return $element; + }, + html(h) { + if (!h) { + return element.innerHTML; + } + else { + element.innerHTML = h; + return $element; + } + }, + append(...elementsToAppend) { + elementsToAppend.forEach((e) => { + element.appendChild(e); + }); + return $element; + }, + attr(attrName, val) { + element.setAttribute(attrName, val); + return $element; + }, + }; + return $element; + }; +} +/** Allow `name` to be used inside file names. */ +function sanitizeName(name) { + return name.replace(/[^a-zA-Z0-9]/g, '_'); +} +const CANVAS_TEST_CONFIG = { + backend: _src_index__WEBPACK_IMPORTED_MODULE_0__.Renderer.Backends.CANVAS, + tagName: 'canvas', + testType: 'Canvas', + fontStacks: ['Bravura'], +}; +const SVG_TEST_CONFIG = { + backend: _src_index__WEBPACK_IMPORTED_MODULE_0__.Renderer.Backends.SVG, + tagName: 'div', + testType: 'SVG', + fontStacks: ['Bravura', 'Gonville', 'Petaluma'], +}; +const NODE_TEST_CONFIG = { + backend: _src_index__WEBPACK_IMPORTED_MODULE_0__.Renderer.Backends.CANVAS, + tagName: 'canvas', + testType: 'NodeCanvas', + fontStacks: ['Bravura', 'Gonville', 'Petaluma'], +}; +class VexFlowTests { + // Call this at the end of a `tests/xxxx_tests.ts` file to register the module. + static register(test) { + VexFlowTests.tests.push(test); + } + static parseJobOptions(runOptions) { + let { jobs, job } = runOptions || { jobs: 1, job: 0 }; + if (window) { + const { location } = window; + if (location) { + const sps = new URLSearchParams(location.search); + const jobsParam = sps.get('jobs'); + const jobParam = sps.get('job'); + if (jobsParam) { + jobs = parseInt(jobsParam, 10); + } + if (jobParam) { + job = parseInt(jobParam, 10); + } + } + } + return { + jobs, + job, + }; + } + // flow.html calls this to invoke all the tests. + static run(runOptions) { + const { jobs, job } = VexFlowTests.parseJobOptions(runOptions); + VexFlowTests.tests.forEach((test, idx) => { + if (jobs === 1 || idx % jobs === job) { + test.Start(); + } + }); + } + static set NODE_FONT_STACKS(fontStacks) { + NODE_TEST_CONFIG.fontStacks = fontStacks; + } + /** Return a unique ID for a test. */ + static generateTestID(prefix) { + return prefix + '_' + VexFlowTests.NEXT_TEST_ID++; + } + /** + * Run `func` inside a QUnit test for each of the enabled rendering backends. + * @param name + * @param testFunc + * @param params + */ + // eslint-disable-next-line + static runTests(name, testFunc, params) { + VexFlowTests.runCanvasTest(name, testFunc, params); + VexFlowTests.runSVGTest(name, testFunc, params); + VexFlowTests.runNodeTest(name, testFunc, params); + } + /** + * Append a
which contains the test case title and rendered output. + * See flow.html and flow.css. + * @param elementId + * @param testTitle + * @param tagName + */ + static createTest(elementId, testTitle, tagName, titleId = '') { + const anchorTestTitle = `${testTitle}`; + const title = $('
').addClass('name').attr('id', titleId).html(anchorTestTitle).get(0); + const vexOutput = $(`<${tagName}/>`).addClass('vex-tabdiv').attr('id', elementId).get(0); + const container = $('
').addClass('testcanvas').append(title, vexOutput).get(0); + $('#vexflow_testoutput').append(container); + return vexOutput; + } + static makeFactory(options, width = 450, height = 140) { + const { elementId, backend } = options; + return new _src_index__WEBPACK_IMPORTED_MODULE_0__.Factory({ renderer: { elementId, backend, width, height } }); + } + // eslint-disable-next-line + static runCanvasTest(name, testFunc, params) { + if (VexFlowTests.RUN_CANVAS_TESTS) { + const helper = null; + VexFlowTests.runWithParams(Object.assign(Object.assign({}, CANVAS_TEST_CONFIG), { name, testFunc, params, helper })); + } + } + // eslint-disable-next-line + static runSVGTest(name, testFunc, params) { + if (VexFlowTests.RUN_SVG_TESTS) { + const helper = null; + VexFlowTests.runWithParams(Object.assign(Object.assign({}, SVG_TEST_CONFIG), { name, testFunc, params, helper })); + } + } + // eslint-disable-next-line + static runNodeTest(name, testFunc, params) { + if (VexFlowTests.RUN_NODE_TESTS) { + const helper = VexFlowTests.runNodeTestHelper; + VexFlowTests.runWithParams(Object.assign(Object.assign({}, NODE_TEST_CONFIG), { name, testFunc, params, helper })); + } + } + /** + * Save the PNG file. + * @param fontName + * @param element + */ + static runNodeTestHelper(fontName, element) { + if (_src_index__WEBPACK_IMPORTED_MODULE_0__.Renderer.lastContext !== undefined) { + const moduleName = sanitizeName(QUnit.current_module); + const testName = sanitizeName(QUnit.current_test); + // If we are only testing Bravura, we OMIT the font name from the + // output image file name, which allows visual diffs against + // the previous release: version 3.0.9. In the future, if we decide + // to test all fonts by default, we can remove this check. + const onlyBravura = NODE_TEST_CONFIG.fontStacks.length === 1 && fontName === 'Bravura'; + const fontInfo = onlyBravura ? '' : `.${fontName}`; + const fileName = `${VexFlowTests.NODE_IMAGEDIR}/${moduleName}.${testName}${fontInfo}.png`; + const imageData = element.toDataURL().split(';base64,').pop(); + const imageBuffer = Buffer.from(imageData, 'base64'); + VexFlowTests.shims.fs.writeFileSync(fileName, imageBuffer, { encoding: 'base64' }); + } + } + /** Run QUnit.test(...) for each font. */ + // eslint-disable-next-line + static runWithParams({ fontStacks, testFunc, name, params, backend, tagName, testType, helper }) { + if (name === undefined) { + throw new Error('Test name is undefined.'); + } + const testTypeLowerCase = testType.toLowerCase(); + fontStacks.forEach((fontStackName) => { + QUnit.test(name, (assert) => { + useTempFontStack(fontStackName); + const elementId = VexFlowTests.generateTestID(`${testTypeLowerCase}_` + fontStackName); + const moduleName = assert.test.module.name; + const title = moduleName + ' › ' + name + ` › ${testType} + ${fontStackName}`; + // Add an element id for the title div, so that we can scroll directly to a test case. + // Add a fragment identifier to the url (e.g., #Stave.Multiple_Stave_Barline_Test.Bravura) + // This titleId will match the name of the PNGs generated by visual regression tests + // (without the _Current.png or _Reference.png). + let prefix = ''; + if (testTypeLowerCase === 'canvas') { + prefix = testTypeLowerCase + '_'; + } + else { + // DO NOT ADD A PREFIX TO SVG TESTS + // The canvas prefix above is for making sure our element ids are unique, + // since we have a canvas+bravura test case and a svg+bravura test case + // that would otherwise have the same titleId. + } + const titleId = `${prefix}${sanitizeName(moduleName)}.${sanitizeName(name)}.${fontStackName}`; + const element = VexFlowTests.createTest(elementId, title, tagName, titleId); + const options = { elementId, params, assert, backend }; + const isSVG = backend === _src_index__WEBPACK_IMPORTED_MODULE_0__.Renderer.Backends.SVG; + const contextBuilder = isSVG ? _src_index__WEBPACK_IMPORTED_MODULE_0__.Renderer.getSVGContext : _src_index__WEBPACK_IMPORTED_MODULE_0__.Renderer.getCanvasContext; + testFunc(options, contextBuilder); + restoreOriginalFontStack(); + if (helper) + helper(fontStackName, element); + }); + }); + } + /** + * @param ctx + * @param x + * @param y + */ + static plotLegendForNoteWidth(ctx, x, y) { + ctx.save(); + ctx.setFont(_src_index__WEBPACK_IMPORTED_MODULE_0__.Font.SANS_SERIF, 8); + const spacing = 12; + let lastY = y; + function legend(color, text) { + ctx.beginPath(); + ctx.setStrokeStyle(color); + ctx.setFillStyle(color); + ctx.setLineWidth(10); + ctx.moveTo(x, lastY - 4); + ctx.lineTo(x + 10, lastY - 4); + ctx.stroke(); + ctx.setFillStyle('black'); + ctx.fillText(text, x + 15, lastY); + lastY += spacing; + } + legend('green', 'Note + Flag'); + legend('red', 'Modifiers'); + legend('#999', 'Displaced Head'); + legend('#DDD', 'Formatter Shift'); + ctx.restore(); + } +} +VexFlowTests.tests = []; +VexFlowTests.RUN_CANVAS_TESTS = true; +VexFlowTests.RUN_SVG_TESTS = true; +VexFlowTests.RUN_NODE_TESTS = false; +// Default font properties for tests. +VexFlowTests.Font = { size: 10 }; +/** + * Each font stack is a prioritized list of font names. + */ +VexFlowTests.FONT_STACKS = { + Bravura: ['Bravura', 'Gonville', 'Custom'], + Gonville: ['Gonville', 'Bravura', 'Custom'], + Petaluma: ['Petaluma', 'Gonville', 'Bravura', 'Custom'], +}; +VexFlowTests.NEXT_TEST_ID = 0; +/** + * Used with array.reduce(...) to flatten arrays of arrays in the tests. + */ +// eslint-disable-next-line +const concat = (a, b) => a.concat(b); +/** Used in KeySignature and ClefKeySignature Tests. */ +const MAJOR_KEYS = [ + // + 'C', + 'F', + 'Bb', + 'Eb', + 'Ab', + 'Db', + 'Gb', + 'Cb', + 'G', + 'D', + 'A', + 'E', + 'B', + 'F#', + 'C#', +]; +const MINOR_KEYS = [ + 'Am', + 'Dm', + 'Gm', + 'Cm', + 'Fm', + 'Bbm', + 'Ebm', + 'Abm', + 'Em', + 'Bm', + 'F#m', + 'C#m', + 'G#m', + 'D#m', + 'A#m', +]; +// VexFlow classes can be accessed via Vex.Flow.* or by directly importing a library class. +// Tests can be accessed via Vex.Flow.Test.* or by directly importing a test class. +// Here we set Vex.Flow.Test = VexFlowTests. +// eslint-disable-next-line +// @ts-ignore +_src_index__WEBPACK_IMPORTED_MODULE_0__.Flow.Test = VexFlowTests; + + +/***/ }), + +/***/ "./tests/vf_prefix_tests.ts": +/*!**********************************!*\ + !*** ./tests/vf_prefix_tests.ts ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "VFPrefixTests": () => (/* binding */ VFPrefixTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/index */ "./src/index.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// VF.* Prefix Tests +// +// VexFlow classes are available under the global Vex.Flow.* namespace. + + +const VFPrefixTests = { + Start() { + QUnit.module('VF.* API'); + test('VF.* API', VF_Prefix); + test('VF Alias', VF_Alias); + }, +}; +function VF_Prefix() { + // Intentionally use Vex.Flow here so we can verify that the Vex.Flow.* API + // is equivalent to using the individual classes in TypeScript. + const VF = Vex.Flow; + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Accidental, VF.Accidental); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Annotation, VF.Annotation); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Articulation, VF.Articulation); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Barline, VF.Barline); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.BarNote, VF.BarNote); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Beam, VF.Beam); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Bend, VF.Bend); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.BoundingBox, VF.BoundingBox); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.BoundingBoxComputation, VF.BoundingBoxComputation); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.ChordSymbol, VF.ChordSymbol); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Clef, VF.Clef); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.ClefNote, VF.ClefNote); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Crescendo, VF.Crescendo); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Curve, VF.Curve); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Dot, VF.Dot); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.EasyScore, VF.EasyScore); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Element, VF.Element); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Factory, VF.Factory); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Flow.RESOLUTION, VF.RESOLUTION); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Font, VF.Font); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Formatter, VF.Formatter); + propEqual(new _src_index__WEBPACK_IMPORTED_MODULE_1__.Formatter(), new VF.Formatter(), 'new Formatter()'); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Fraction, VF.Fraction); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.FretHandFinger, VF.FretHandFinger); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.GhostNote, VF.GhostNote); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Glyph, VF.Glyph); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.GlyphNote, VF.GlyphNote); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.GraceNote, VF.GraceNote); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.GraceNoteGroup, VF.GraceNoteGroup); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.GraceTabNote, VF.GraceTabNote); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.KeyManager, VF.KeyManager); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.KeySignature, VF.KeySignature); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.KeySigNote, VF.KeySigNote); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Modifier, VF.Modifier); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.ModifierContext, VF.ModifierContext); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.MultiMeasureRest, VF.MultiMeasureRest); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Music, VF.Music); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Note, VF.Note); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.NoteHead, VF.NoteHead); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.NoteSubGroup, VF.NoteSubGroup); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Ornament, VF.Ornament); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Parser, VF.Parser); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.PedalMarking, VF.PedalMarking); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Registry, VF.Registry); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Renderer, VF.Renderer); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.RepeatNote, VF.RepeatNote); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Repetition, VF.Repetition); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Stave, VF.Stave); + notEqual(_src_index__WEBPACK_IMPORTED_MODULE_1__.Stave, VF.StaveNote); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.StaveConnector, VF.StaveConnector); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.StaveHairpin, VF.StaveHairpin); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.StaveLine, VF.StaveLine); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.StaveModifier, VF.StaveModifier); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.StaveNote, VF.StaveNote); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.StaveTempo, VF.StaveTempo); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.StaveText, VF.StaveText); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.StaveTie, VF.StaveTie); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Stem, VF.Stem); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.StringNumber, VF.StringNumber); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke, VF.Stroke); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.System, VF.System); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.TabNote, VF.TabNote); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.TabSlide, VF.TabSlide); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.TabStave, VF.TabStave); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.TabTie, VF.TabTie); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.TextBracket, VF.TextBracket); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.TextDynamics, VF.TextDynamics); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.TextFormatter, VF.TextFormatter); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.TextNote, VF.TextNote); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.TickContext, VF.TickContext); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.TimeSignature, VF.TimeSignature); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.TimeSigNote, VF.TimeSigNote); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Tremolo, VF.Tremolo); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Tuning, VF.Tuning); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Tuplet, VF.Tuplet); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Vibrato, VF.Vibrato); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.VibratoBracket, VF.VibratoBracket); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Voice, VF.Voice); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Volta, VF.Volta); +} +/** + * If you have name collisions with VexFlow classes, consider extracting classes from Vex.Flow + * and renaming them with a VF prefix. + */ +function VF_Alias() { + const Flow = Vex.Flow; + const VFAliases = { + get VFAccidental() { + return Flow.Accidental; + }, + get VFAnnotation() { + return Flow.Annotation; + }, + get VFVibrato() { + return Flow.Vibrato; + }, + }; + const { VFVibrato, VFAccidental, VFAnnotation } = VFAliases; + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Accidental, VFAccidental); + equal(_src_index__WEBPACK_IMPORTED_MODULE_1__.Annotation, VFAnnotation); + const vibrato = new VFVibrato(); + ok(vibrato); + const acc1 = new VFAccidental('##'); + const acc2 = new _src_index__WEBPACK_IMPORTED_MODULE_1__.Accidental('##'); + equal(acc1.type, acc2.type); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(VFPrefixTests); + + + +/***/ }), + +/***/ "./tests/vibrato_tests.ts": +/*!********************************!*\ + !*** ./tests/vibrato_tests.ts ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "VibratoTests": () => (/* binding */ VibratoTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/index */ "./src/index.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Vibrato Tests + + +const VibratoTests = { + Start() { + QUnit.module('Vibrato'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Simple Vibrato', simple); + run('Harsh Vibrato', harsh); + run('Vibrato with Bend', withBend); + }, +}; +// Helper function to create TabNote objects. +const tabNote = (noteStruct) => new _src_index__WEBPACK_IMPORTED_MODULE_1__.TabNote(noteStruct); +/** + * Default vibrato symbol (wavy line) on top of a tab with two notes fretted. + */ +function simple(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 500, 240); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + ctx.font = '10pt Arial'; + const stave = new _src_index__WEBPACK_IMPORTED_MODULE_1__.TabStave(10, 10, 450).addTabGlyph().setContext(ctx).draw(); + const notes = [ + tabNote({ + positions: [ + { str: 2, fret: 10 }, + { str: 4, fret: 9 }, + ], + duration: 'h', + }).addModifier(new _src_index__WEBPACK_IMPORTED_MODULE_1__.Vibrato(), 0), + tabNote({ + positions: [{ str: 2, fret: 10 }], + duration: 'h', + }).addModifier(new _src_index__WEBPACK_IMPORTED_MODULE_1__.Vibrato(), 0), + ]; + _src_index__WEBPACK_IMPORTED_MODULE_1__.Formatter.FormatAndDraw(ctx, stave, notes); + ok(true, 'Simple Vibrato'); +} +/** + * The harsh vibrato symbol is a zig zag line with sharp points. + * This test is nearly identical to the 'simple' test above. + * The only difference is that we call .setHarsh(true) on each Vibrato object. + */ +function harsh(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 500, 240); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + ctx.font = '10pt Arial'; + const stave = new _src_index__WEBPACK_IMPORTED_MODULE_1__.TabStave(10, 10, 450).addTabGlyph().setContext(ctx).draw(); + const notes = [ + tabNote({ + positions: [ + { str: 2, fret: 10 }, + { str: 4, fret: 9 }, + ], + duration: 'h', + }).addModifier(new _src_index__WEBPACK_IMPORTED_MODULE_1__.Vibrato().setHarsh(true), 0), + tabNote({ + positions: [{ str: 2, fret: 10 }], + duration: 'h', + }).addModifier(new _src_index__WEBPACK_IMPORTED_MODULE_1__.Vibrato().setHarsh(true), 0), + ]; + _src_index__WEBPACK_IMPORTED_MODULE_1__.Formatter.FormatAndDraw(ctx, stave, notes); + ok(true, 'Harsh Vibrato'); +} +function withBend(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 500, 240); + ctx.scale(1.3, 1.3); + ctx.setFillStyle('#221'); + ctx.setStrokeStyle('#221'); + ctx.setFont(_src_index__WEBPACK_IMPORTED_MODULE_1__.Font.SANS_SERIF, _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.Font.size); + const stave = new _src_index__WEBPACK_IMPORTED_MODULE_1__.TabStave(10, 10, 450).addTabGlyph().setContext(ctx).draw(); + const notes = [ + tabNote({ + positions: [ + { str: 2, fret: 9 }, + { str: 3, fret: 9 }, + ], + duration: 'q', + }) + .addModifier(new _src_index__WEBPACK_IMPORTED_MODULE_1__.Bend('1/2', true), 0) + .addModifier(new _src_index__WEBPACK_IMPORTED_MODULE_1__.Bend('1/2', true), 1) + .addModifier(new _src_index__WEBPACK_IMPORTED_MODULE_1__.Vibrato(), 0), + tabNote({ + positions: [{ str: 2, fret: 10 }], + duration: 'q', + }) + .addModifier(new _src_index__WEBPACK_IMPORTED_MODULE_1__.Bend('Full', false), 0) + .addModifier(new _src_index__WEBPACK_IMPORTED_MODULE_1__.Vibrato().setVibratoWidth(60), 0), + tabNote({ + positions: [{ str: 2, fret: 10 }], + duration: 'h', + }).addModifier(new _src_index__WEBPACK_IMPORTED_MODULE_1__.Vibrato().setVibratoWidth(120).setHarsh(true), 0), + ]; + _src_index__WEBPACK_IMPORTED_MODULE_1__.Formatter.FormatAndDraw(ctx, stave, notes); + ok(true, 'Vibrato with Bend'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(VibratoTests); + + + +/***/ }), + +/***/ "./tests/vibratobracket_tests.ts": +/*!***************************************!*\ + !*** ./tests/vibratobracket_tests.ts ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "VibratoBracketTests": () => (/* binding */ VibratoBracketTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// Author: Balazs Forian-Szabo +// +// VibratoBracket Tests +// TODO: It's annoying to have to cast "as Note" or "as Note[]". Could we add a method to Voice to get the tickables as Note[]? Voice.getTickables() vs Voice.getNotes()? + +const VibratoBracketTests = { + Start() { + QUnit.module('VibratoBracket'); + const run = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests; + run('Simple VibratoBracket', simple); + run('Harsh VibratoBracket Without End Note', withoutEndNote); + run('Harsh VibratoBracket Without Start Note', withoutStartNote); + }, +}; +// Helper function to set up the stave, easyscore, voice, and to format & draw. +function createTest(noteGroup, setupVibratoBracket) { + return (options) => { + const factory = _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.makeFactory(options, 650, 200); + const stave = factory.Stave(); + const score = factory.EasyScore(); + const voice = score.voice(score.notes(noteGroup)); + setupVibratoBracket(factory, voice.getTickables()); + factory.Formatter().joinVoices([voice]).formatToStave([voice], stave); + factory.draw(); + ok(true); + }; +} +const simple = createTest('c4/4, c4, c4, c4', (factory, notes) => { + factory.VibratoBracket({ + from: notes[0], + to: notes[3], + options: { line: 2 }, + }); +}); +const withoutEndNote = createTest('c4/4, c4, c4, c4', (factory, notes) => { + factory.VibratoBracket({ + from: notes[2], + to: null, + options: { line: 2, harsh: true }, + }); +}); +const withoutStartNote = createTest('c4/4, c4, c4, c4', (factory, notes) => { + factory.VibratoBracket({ + from: null, + to: notes[2], + options: { line: 2, harsh: true }, + }); +}); +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(VibratoBracketTests); + + + +/***/ }), + +/***/ "./tests/voice_tests.ts": +/*!******************************!*\ + !*** ./tests/voice_tests.ts ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "VoiceTests": () => (/* binding */ VoiceTests) +/* harmony export */ }); +/* harmony import */ var _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow_test_helpers */ "./tests/vexflow_test_helpers.ts"); +/* harmony import */ var _src_flow__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/flow */ "./src/flow.ts"); +/* harmony import */ var _src_formatter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/formatter */ "./src/formatter.ts"); +/* harmony import */ var _src_stave__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/stave */ "./src/stave.ts"); +/* harmony import */ var _src_stavebarline__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/stavebarline */ "./src/stavebarline.ts"); +/* harmony import */ var _src_stavenote__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/stavenote */ "./src/stavenote.ts"); +/* harmony import */ var _src_voice__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/voice */ "./src/voice.ts"); +/* harmony import */ var _mocks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./mocks */ "./tests/mocks.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Voice Tests + + + + + + + + +const VoiceTests = { + Start() { + QUnit.module('Voice'); + test('Strict Test', strict); + test('Ignore Test', ignore); + _vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.runTests('Full Voice Mode Test', full); + }, +}; +const BEAT = (1 * _src_flow__WEBPACK_IMPORTED_MODULE_1__.Flow.RESOLUTION) / 4; +// Helper function to create a tickable with a preset number of ticks. +const createTickable = () => new _mocks__WEBPACK_IMPORTED_MODULE_7__.MockTickable().setTicks(BEAT); +function strict() { + expect(8); + const tickables = [createTickable(), createTickable(), createTickable()]; + const voice = new _src_voice__WEBPACK_IMPORTED_MODULE_6__.Voice(_src_flow__WEBPACK_IMPORTED_MODULE_1__.Flow.TIME4_4); + equal(voice.getTotalTicks().value(), BEAT * 4, '4/4 Voice has 4 beats'); + equal(voice.getTicksUsed().value(), BEAT * 0, 'No beats in voice'); + voice.addTickables(tickables); + equal(voice.getTicksUsed().value(), BEAT * 3, 'Three beats in voice'); + voice.addTickable(createTickable()); + equal(voice.getTicksUsed().value(), BEAT * 4, 'Four beats in voice'); + equal(voice.isComplete(), true, 'Voice is complete'); + const numeratorBeforeException = voice.getTicksUsed().numerator; + throws(() => voice.addTickable(createTickable()), /BadArgument/, '"Too many ticks" exception'); + // Verify that adding too many ticks does not affect the `ticksUsed` property of the voice. + // See voice.ts: this.ticksUsed.subtract(ticks); + equal(voice.getTicksUsed().numerator, numeratorBeforeException, 'Revert `ticksUsed` after a "Too many ticks" exception'); + equal(voice.getSmallestTickCount().value(), BEAT, 'Smallest tick count is BEAT'); +} +function ignore() { + const tickables = [ + createTickable(), + createTickable(), + createTickable().setIgnoreTicks(true), + createTickable(), + createTickable().setIgnoreTicks(true), + createTickable(), + ]; + const voice = new _src_voice__WEBPACK_IMPORTED_MODULE_6__.Voice(_src_flow__WEBPACK_IMPORTED_MODULE_1__.Flow.TIME4_4); + voice.addTickables(tickables); + ok(true, 'all pass'); +} +function full(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 550, 200); + const stave = new _src_stave__WEBPACK_IMPORTED_MODULE_3__.Stave(10, 50, 500).addClef('treble').addTimeSignature('4/4').setEndBarType(_src_stavebarline__WEBPACK_IMPORTED_MODULE_4__.Barline.type.END); + const notes = [ + new _src_stavenote__WEBPACK_IMPORTED_MODULE_5__.StaveNote({ keys: ['c/4'], duration: '4' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_5__.StaveNote({ keys: ['d/4'], duration: '4' }), + new _src_stavenote__WEBPACK_IMPORTED_MODULE_5__.StaveNote({ keys: ['r/4'], duration: '4r' }), + ]; + notes.forEach((note) => note.setStave(stave)); + const voice = new _src_voice__WEBPACK_IMPORTED_MODULE_6__.Voice(_src_flow__WEBPACK_IMPORTED_MODULE_1__.Flow.TIME4_4).setMode(_src_voice__WEBPACK_IMPORTED_MODULE_6__.Voice.Mode.FULL).addTickables(notes); + new _src_formatter__WEBPACK_IMPORTED_MODULE_2__.Formatter().joinVoices([voice]).formatToStave([voice], stave); + stave.setContext(ctx).draw(); + voice.draw(ctx); + const bb = voice.getBoundingBox(); + if (bb) { + ctx.rect(bb.getX(), bb.getY(), bb.getW(), bb.getH()); + } + ctx.stroke(); + throws(() => voice.addTickable(new _src_stavenote__WEBPACK_IMPORTED_MODULE_5__.StaveNote({ keys: ['c/4'], duration: '2' })), /BadArgument/, 'Voice cannot exceed full amount of ticks'); +} +_vexflow_test_helpers__WEBPACK_IMPORTED_MODULE_0__.VexFlowTests.register(VoiceTests); + + + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/global */ +/******/ (() => { +/******/ __webpack_require__.g = (function() { +/******/ if (typeof globalThis === 'object') return globalThis; +/******/ try { +/******/ return this || new Function('return this')(); +/******/ } catch (e) { +/******/ if (typeof window === 'object') return window; +/******/ } +/******/ })(); +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. +(() => { +/*!*******************************************!*\ + !*** ./entry/vexflow-debug-with-tests.ts ***! + \*******************************************/ +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Accidental": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Accidental), +/* harmony export */ "Annotation": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Annotation), +/* harmony export */ "AnnotationHorizontalJustify": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.AnnotationHorizontalJustify), +/* harmony export */ "AnnotationVerticalJustify": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify), +/* harmony export */ "Articulation": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Articulation), +/* harmony export */ "BarNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.BarNote), +/* harmony export */ "Barline": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Barline), +/* harmony export */ "BarlineType": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.BarlineType), +/* harmony export */ "Beam": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Beam), +/* harmony export */ "Bend": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Bend), +/* harmony export */ "BoundingBox": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.BoundingBox), +/* harmony export */ "BoundingBoxComputation": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.BoundingBoxComputation), +/* harmony export */ "Builder": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Builder), +/* harmony export */ "CanvasContext": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.CanvasContext), +/* harmony export */ "Category": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Category), +/* harmony export */ "ChordSymbol": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.ChordSymbol), +/* harmony export */ "ChordSymbolHorizontalJustify": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.ChordSymbolHorizontalJustify), +/* harmony export */ "ChordSymbolVerticalJustify": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.ChordSymbolVerticalJustify), +/* harmony export */ "Clef": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Clef), +/* harmony export */ "ClefNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.ClefNote), +/* harmony export */ "Crescendo": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Crescendo), +/* harmony export */ "Curve": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Curve), +/* harmony export */ "CurvePosition": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.CurvePosition), +/* harmony export */ "Dot": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Dot), +/* harmony export */ "EasyScore": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.EasyScore), +/* harmony export */ "EasyScoreGrammar": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.EasyScoreGrammar), +/* harmony export */ "Element": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Element), +/* harmony export */ "Factory": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Factory), +/* harmony export */ "Flow": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Flow), +/* harmony export */ "Font": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Font), +/* harmony export */ "FontStyle": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.FontStyle), +/* harmony export */ "FontWeight": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.FontWeight), +/* harmony export */ "Formatter": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Formatter), +/* harmony export */ "Fraction": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Fraction), +/* harmony export */ "FretHandFinger": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.FretHandFinger), +/* harmony export */ "GhostNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.GhostNote), +/* harmony export */ "Glyph": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Glyph), +/* harmony export */ "GlyphNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.GlyphNote), +/* harmony export */ "GraceNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.GraceNote), +/* harmony export */ "GraceNoteGroup": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.GraceNoteGroup), +/* harmony export */ "GraceTabNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.GraceTabNote), +/* harmony export */ "Justification": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Justification), +/* harmony export */ "KeyManager": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.KeyManager), +/* harmony export */ "KeySigNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.KeySigNote), +/* harmony export */ "KeySignature": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.KeySignature), +/* harmony export */ "Modifier": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Modifier), +/* harmony export */ "ModifierContext": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.ModifierContext), +/* harmony export */ "ModifierPosition": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.ModifierPosition), +/* harmony export */ "MultiMeasureRest": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.MultiMeasureRest), +/* harmony export */ "Music": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Music), +/* harmony export */ "Note": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Note), +/* harmony export */ "NoteHead": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.NoteHead), +/* harmony export */ "NoteSubGroup": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.NoteSubGroup), +/* harmony export */ "Ornament": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Ornament), +/* harmony export */ "OutlineCode": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.OutlineCode), +/* harmony export */ "Parenthesis": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Parenthesis), +/* harmony export */ "Parser": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Parser), +/* harmony export */ "PedalMarking": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.PedalMarking), +/* harmony export */ "Piece": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Piece), +/* harmony export */ "Registry": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Registry), +/* harmony export */ "RenderContext": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.RenderContext), +/* harmony export */ "Renderer": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Renderer), +/* harmony export */ "RendererBackends": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.RendererBackends), +/* harmony export */ "RendererLineEndType": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.RendererLineEndType), +/* harmony export */ "RepeatNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.RepeatNote), +/* harmony export */ "Repetition": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Repetition), +/* harmony export */ "RuntimeError": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.RuntimeError), +/* harmony export */ "SVGContext": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.SVGContext), +/* harmony export */ "Stave": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Stave), +/* harmony export */ "StaveConnector": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.StaveConnector), +/* harmony export */ "StaveHairpin": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.StaveHairpin), +/* harmony export */ "StaveLine": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.StaveLine), +/* harmony export */ "StaveModifier": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.StaveModifier), +/* harmony export */ "StaveModifierPosition": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.StaveModifierPosition), +/* harmony export */ "StaveNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.StaveNote), +/* harmony export */ "StaveSection": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.StaveSection), +/* harmony export */ "StaveTempo": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.StaveTempo), +/* harmony export */ "StaveText": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.StaveText), +/* harmony export */ "StaveTie": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.StaveTie), +/* harmony export */ "Stem": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Stem), +/* harmony export */ "StemmableNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.StemmableNote), +/* harmony export */ "StringNumber": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.StringNumber), +/* harmony export */ "Stroke": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke), +/* harmony export */ "SymbolModifiers": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.SymbolModifiers), +/* harmony export */ "SymbolTypes": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.SymbolTypes), +/* harmony export */ "System": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.System), +/* harmony export */ "TabNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.TabNote), +/* harmony export */ "TabSlide": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.TabSlide), +/* harmony export */ "TabStave": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.TabStave), +/* harmony export */ "TabTie": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.TabTie), +/* harmony export */ "TextBracket": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.TextBracket), +/* harmony export */ "TextBracketPosition": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.TextBracketPosition), +/* harmony export */ "TextDynamics": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.TextDynamics), +/* harmony export */ "TextFormatter": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.TextFormatter), +/* harmony export */ "TextNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.TextNote), +/* harmony export */ "TickContext": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.TickContext), +/* harmony export */ "Tickable": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Tickable), +/* harmony export */ "TimeSigNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.TimeSigNote), +/* harmony export */ "TimeSignature": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.TimeSignature), +/* harmony export */ "TimeSignatureGlyph": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.TimeSignatureGlyph), +/* harmony export */ "Tremolo": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Tremolo), +/* harmony export */ "Tuning": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Tuning), +/* harmony export */ "Tuplet": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Tuplet), +/* harmony export */ "TupletLocation": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.TupletLocation), +/* harmony export */ "Vex": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Vex), +/* harmony export */ "Vibrato": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Vibrato), +/* harmony export */ "VibratoBracket": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.VibratoBracket), +/* harmony export */ "Voice": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Voice), +/* harmony export */ "VoiceMode": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.VoiceMode), +/* harmony export */ "Volta": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Volta), +/* harmony export */ "VoltaType": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.VoltaType), +/* harmony export */ "defined": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.defined), +/* harmony export */ "drawDot": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.drawDot), +/* harmony export */ "globalObject": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.globalObject), +/* harmony export */ "isAccidental": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.isAccidental), +/* harmony export */ "isAnnotation": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.isAnnotation), +/* harmony export */ "isBarline": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.isBarline), +/* harmony export */ "isCategory": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.isCategory), +/* harmony export */ "isDot": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.isDot), +/* harmony export */ "isGraceNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.isGraceNote), +/* harmony export */ "isGraceNoteGroup": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.isGraceNoteGroup), +/* harmony export */ "isHTMLCanvas": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.isHTMLCanvas), +/* harmony export */ "isHTMLDiv": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.isHTMLDiv), +/* harmony export */ "isNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.isNote), +/* harmony export */ "isRenderContext": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.isRenderContext), +/* harmony export */ "isStaveNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.isStaveNote), +/* harmony export */ "isStemmableNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.isStemmableNote), +/* harmony export */ "isTabNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.isTabNote), +/* harmony export */ "log": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.log), +/* harmony export */ "midLine": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.midLine), +/* harmony export */ "normalizeAngle": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.normalizeAngle), +/* harmony export */ "prefix": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.prefix), +/* harmony export */ "warn": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.warn), +/* harmony export */ "AccidentalTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.AccidentalTests), +/* harmony export */ "AnnotationTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.AnnotationTests), +/* harmony export */ "ArticulationTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.ArticulationTests), +/* harmony export */ "AutoBeamFormattingTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.AutoBeamFormattingTests), +/* harmony export */ "BachDemoTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.BachDemoTests), +/* harmony export */ "BarlineTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.BarlineTests), +/* harmony export */ "BeamTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.BeamTests), +/* harmony export */ "BendTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.BendTests), +/* harmony export */ "BoundingBoxComputationTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.BoundingBoxComputationTests), +/* harmony export */ "BoundingBoxTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.BoundingBoxTests), +/* harmony export */ "ChordSymbolTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.ChordSymbolTests), +/* harmony export */ "ClefKeySignatureTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.ClefKeySignatureTests), +/* harmony export */ "ClefTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.ClefTests), +/* harmony export */ "CurveTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.CurveTests), +/* harmony export */ "DotTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.DotTests), +/* harmony export */ "EasyScoreTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.EasyScoreTests), +/* harmony export */ "FactoryTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.FactoryTests), +/* harmony export */ "FontTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.FontTests), +/* harmony export */ "FormatterTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.FormatterTests), +/* harmony export */ "FractionTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.FractionTests), +/* harmony export */ "GhostNoteTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.GhostNoteTests), +/* harmony export */ "GlyphNoteTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.GlyphNoteTests), +/* harmony export */ "GraceNoteTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.GraceNoteTests), +/* harmony export */ "GraceTabNoteTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.GraceTabNoteTests), +/* harmony export */ "KeyManagerTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.KeyManagerTests), +/* harmony export */ "KeySignatureTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.KeySignatureTests), +/* harmony export */ "ModifierContextTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.ModifierContextTests), +/* harmony export */ "MultiMeasureRestTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.MultiMeasureRestTests), +/* harmony export */ "MusicTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.MusicTests), +/* harmony export */ "NoteHeadTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.NoteHeadTests), +/* harmony export */ "NoteSubGroupTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.NoteSubGroupTests), +/* harmony export */ "OffscreenCanvasTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.OffscreenCanvasTests), +/* harmony export */ "OrnamentTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.OrnamentTests), +/* harmony export */ "ParserTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.ParserTests), +/* harmony export */ "PedalMarkingTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.PedalMarkingTests), +/* harmony export */ "PercussionTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.PercussionTests), +/* harmony export */ "RegistryTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.RegistryTests), +/* harmony export */ "RendererTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.RendererTests), +/* harmony export */ "RestsTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.RestsTests), +/* harmony export */ "RhythmTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.RhythmTests), +/* harmony export */ "StaveConnectorTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.StaveConnectorTests), +/* harmony export */ "StaveHairpinTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.StaveHairpinTests), +/* harmony export */ "StaveLineTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.StaveLineTests), +/* harmony export */ "StaveModifierTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.StaveModifierTests), +/* harmony export */ "StaveNoteTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.StaveNoteTests), +/* harmony export */ "StaveTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.StaveTests), +/* harmony export */ "StaveTieTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.StaveTieTests), +/* harmony export */ "StringNumberTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.StringNumberTests), +/* harmony export */ "StrokesTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.StrokesTests), +/* harmony export */ "StyleTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.StyleTests), +/* harmony export */ "TabNoteTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.TabNoteTests), +/* harmony export */ "TabSlideTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.TabSlideTests), +/* harmony export */ "TabStaveTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.TabStaveTests), +/* harmony export */ "TabTieTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.TabTieTests), +/* harmony export */ "TextBracketTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.TextBracketTests), +/* harmony export */ "TextFormatterTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.TextFormatterTests), +/* harmony export */ "TextNoteTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.TextNoteTests), +/* harmony export */ "ThreeVoicesTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.ThreeVoicesTests), +/* harmony export */ "TickContextTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.TickContextTests), +/* harmony export */ "TimeSignatureTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.TimeSignatureTests), +/* harmony export */ "TremoloTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.TremoloTests), +/* harmony export */ "TuningTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.TuningTests), +/* harmony export */ "TupletTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.TupletTests), +/* harmony export */ "TypeGuardTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.TypeGuardTests), +/* harmony export */ "VFPrefixTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.VFPrefixTests), +/* harmony export */ "VibratoBracketTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.VibratoBracketTests), +/* harmony export */ "VibratoTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.VibratoTests), +/* harmony export */ "VoiceTests": () => (/* reexport safe */ _tests_index__WEBPACK_IMPORTED_MODULE_2__.VoiceTests), +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _vexflow__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow */ "./entry/vexflow.ts"); +/* harmony import */ var _src_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/index */ "./src/index.ts"); +/* harmony import */ var _tests_index__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tests/index */ "./tests/index.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// vexflow-debug-with-tests.ts is the entry point for the build output file vexflow-debug-with-tests.js. +// It statically bundles all the music engraving fonts, and also includes the tests from vexflow/tests/. +// The output file is used by flow.html & flow-headless-browser.html to run the tests. + + + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_vexflow__WEBPACK_IMPORTED_MODULE_0__.Vex); + +})(); + +__webpack_exports__ = __webpack_exports__["default"]; +/******/ return __webpack_exports__; +/******/ })() +; +}); +//# sourceMappingURL=vexflow-debug-with-tests.js.map \ No newline at end of file diff --git a/build/cjs/vexflow-debug-with-tests.js.map b/build/cjs/vexflow-debug-with-tests.js.map new file mode 100644 index 0000000000..5f4fa288a0 --- /dev/null +++ b/build/cjs/vexflow-debug-with-tests.js.map @@ -0,0 +1 @@ +{"version":3,"file":"vexflow-debug-with-tests.js","mappings":";;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;;;;;;;;;;;;;;;;ACVO;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACFP;AACA;AACA;AACA;AACA;AACA;AACA;AACiC;AACE;AACuB;AACH;AACvD,sEAAiB;AACjB,wDAAiB;AACjB,mEAAa;AACgB;AAC7B,iEAAe,yCAAG,EAAC;;;;;;;;;;;;;;;;;;;;;;ACfnB;AACA;AACA;AACA;AACsC;AACN;AACM;AACN;AACE;AAC+D;AAC3D;AACtC;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,yBAAyB,+CAAQ;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6DAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,2DAAsB;AAChD,QAAQ,8CAAO,+DAA+D,KAAK;AACnF;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,2DAAmB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,4DAAuB;AACjD;AACA;AACA;AACA,oFAAoF;AACpF;AACA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,sBAAsB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,iDAAiD;AAChF;AACA;AACA,+BAA+B,sCAAsC;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,wCAAwC;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,yBAAyB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,yBAAyB;AAC/D,6BAA6B,kEAA6B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,0BAA0B;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,+CAAQ;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,0BAA0B,yCAAK;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,uDAAW;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,wDAAY;AACxC;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,wBAAwB,4DAAgB;AACxC;AACA;AACA,iBAAiB;AACjB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,yBAAyB,yCAAK;AAC9B;AACA;AACA,iCAAiC,yCAAK,CAAC,2DAAsB,GAAG;AAChE,kCAAkC,yCAAK,CAAC,2DAAsB,GAAG;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,8CAAO;AACrC,+BAA+B,8CAAO;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,8CAAO,2CAA2C,KAAK;AAC/D;AACA;AACA,YAAY,uDAAW;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,8EAA8E,qCAAqC,IAAI;AACvI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,8CAAO;AACrC,+BAA+B,8CAAO;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;AC5dA;AACA;AACoC;AACoB;AAC1B;AACI;AACc;AACmB;AACtC;AAC7B;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACO;AACP;AACA;AACA;AACA;AACA;AACA,CAAC,kEAAkE;AAC5D;AACP;AACA;AACA;AACA;AACA;AACA,CAAC,8DAA8D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACO,yBAAyB,+CAAQ;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,qDAAgB;AACtC;AACA;AACA;AACA,eAAe,2DAAmB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA,kCAAkC,gEAAoB;AACtD;AACA,8DAA8D,+DAA0B;AACxF;AACA;AACA;AACA,6EAA6E,0CAAO;AACpF;AACA;AACA,gBAAgB,qDAAS;AACzB;AACA;AACA;AACA,kEAAkE,+DAA0B;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,2DAAe;AACpC;AACA;AACA,8DAA8D,+DAA0B;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qDAAS;AAC7B;AACA;AACA,sCAAsC,0CAAO;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qDAAS;AAC7B;AACA;AACA,sCAAsC,4CAAS;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE,0CAAO;AAChF,8BAA8B,gEAAoB;AAClD,8CAA8C,6DAAsB;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,+DAA0B;AAClE,8CAA8C,4CAAS;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,+DAA0B;AACnF,8CAA8C,0CAAO;AACrD;AACA;AACA,mEAAmE,+DAA0B;AAC7F;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,EAAE,uDAAiB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;AC7PA;AACA;AACA;AACgC;AACM;AACR;AACI;AAC2D;AACzC;AACpD;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA,QAAQ,eAAe,EAAE,wDAAiB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,uDAAW,UAAU,uDAAW;AACrE;AACA;AACA,YAAY,mCAAmC;AAC/C;AACA;AACA,kCAAkC,0CAAO;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,qDAAS;AACtB;AACA,kCAAkC,0CAAO;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,+CAAY;AAC9B;AACA;AACA;AACA;AACA,YAAY,mCAAmC;AAC/C;AACA;AACA,kCAAkC,0CAAO;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,qDAAS;AACtB;AACA,kCAAkC,0CAAO;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,+CAAY;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,0CAAO;AAClF,2DAA2D,4CAAS;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,2BAA2B,+CAAQ;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,6DAAqB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uHAAuH,8CAAO;AAC9H;AACA;AACA;AACA,6EAA6E,0CAAO;AACpF;AACA;AACA,gBAAgB,2DAAe;AAC/B;AACA;AACA,8DAA8D,+DAA0B;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,0CAAO;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,4CAAS;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,eAAe;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA,iCAAiC,8DAAuB;AACxD;AACA,SAAS;AACT;AACA;AACA;AACA,4BAA4B,6DAAwB;AACpD,6BAA6B,8CAAO,gEAAgE,UAAU;AAC9G;AACA,yBAAyB,yCAAK;AAC9B,sBAAsB,8CAAO;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uCAAuC;AACvD;AACA;AACA;AACA,sBAAsB,qDAAS;AAC/B;AACA,gBAAgB,IAAI;AACpB;AACA;AACA,wBAAwB,4DAAuB,gCAAgC,gBAAgB;AAC/F;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,EAAE,OAAO,EAAE;AACtD;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AC9TA;AACA;AAC8B;AACwB;AACf;AACV;AAC7B;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,sBAAsB,uCAAI;AACjC,uBAAuB,6DAAkB;AACzC,gBAAgB,eAAe;AAC/B;AACA,sBAAsB;AACtB;AACA,qBAAqB,sDAAW;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,wDAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,6DAAkB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,kDAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;AC9EA;AACA;AACoC;AACE;AACR;AACI;AACQ;AACqB;AACzB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA,eAAe,4CAAS;AACxB;AACA,WAAW,0CAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,mBAAmB,6CAAO;AACjC;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA,0BAA0B,2DAAsB;AAChD,sBAAsB,+CAAY;AAClC;AACA,eAAe;AACf;AACA,8BAA8B,0CAAO;AACrC,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,uDAAW;AACpC;AACA;AACA,8BAA8B,qDAAS;AACvC;AACA;AACA,gDAAgD,0CAAO,GAAG,4CAAS;AACnE;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,qDAAa;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,+CAAQ;AACpC;AACA;AACA,4BAA4B,+CAAQ;AACpC;AACA;AACA,4BAA4B,+CAAQ;AACpC;AACA;AACA;AACA,6CAA6C,+CAAQ;AACrD;AACA,oBAAoB,+CAAQ;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,wBAAwB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA,iCAAiC,+CAAQ;AACzC;AACA;AACA;AACA;AACA,0BAA0B,+CAAY;AACtC;AACA,0CAA0C,sDAAiB;AAC3D,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,0FAA0F,+CAAQ;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,+CAAQ;AACrD;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA,mCAAmC,4DAAuB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,iDAAiD,+CAAQ;AACzD;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,2DAAsB;AAC9E;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,0CAAO;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,2DAAsB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,iEAAiE,4CAAS,GAAG,0DAAqB,GAAG,uDAAkB;AACvH;AACA;AACA;AACA,4BAA4B,yBAAyB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,wDAAwD,oDAAoD,IAAI;AAChI;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,oBAAoB;AACxD;AACA;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,yCAAyC,oDAAoD,IAAI;AACjH;AACA;AACA;AACA,0BAA0B;AAC1B,kCAAkC;AAClC;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,4CAAS;AAC5C;AACA;AACA;AACA;AACA,wCAAwC,0CAAO;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,4CAAS;AACxC;AACA;AACA,oCAAoC,0CAAO;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,4CAAS;AAC7C;AACA;AACA,oCAAoC,0CAAO;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,qEAAqE,8CAA8C,IAAI;AACvI;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA,yDAAyD,0CAAO;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,4DAAuB,eAAe;AACzE,gDAAgD,2DAAsB;AACtE,gDAAgD,2DAAsB;AACtE,sCAAsC,2DAAsB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,2DAAsB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,6CAAU;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iCAAiC;AACzD;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,+CAAY;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,qDAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;AC3wBA;AACA;AACoC;AACE;AACU;AACE;AACZ;AACtC;AACO,mBAAmB,+CAAQ;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,gCAAgC;AAC7D;AACA,mCAAmC,2BAA2B;AAC9D;AACA;AACA;AACA;AACA,eAAe,qDAAa;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA,gBAAgB,qDAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,gEAAoB;AAClD;AACA;AACA;AACA;AACA,8BAA8B,gEAAoB;AAClD;AACA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,8DAAuB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,+DAAwB;AAC7E;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,EAAE,uDAAiB;;;;;;;;;;;;;;;ACvPpD;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AC/HA;AACA;AAC8B;AACkB;AACJ;AACP;AACrC;AACA;AACA;AACA;AACO,4BAA4B,yDAAa;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,2CAAI;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,mDAAY;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,kDAAY;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,gDAAa;AACtC,8BAA8B,mDAAgB;AAC9C,0BAA0B,+DAA4B;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;ACpPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACqD;AACrB;AACM;AACJ;AACc;AACT;AACV;AAC7B;AACA;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACO;AACP;AACA;AACA;AACA;AACA;AACA,CAAC,oEAAoE;AAC9D;AACP;AACA;AACA;AACA,CAAC,gEAAgE;AAC1D;AACP;AACA;AACA;AACA;AACA,CAAC,kCAAkC;AAC5B;AACP;AACA;AACA;AACA;AACA,CAAC,0CAA0C;AAC3C;AACA;AACA;AACA;AACO,0BAA0B,+CAAQ;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,4DAAoB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,4DAAuB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,4DAAuB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,+DAA4B;AACzD,4BAA4B,iDAAc;AAC1C;AACA;AACA;AACA,4BAA4B,gCAAgC;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,4DAAuB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,oDAAiB;AACrC,mBAAmB,mDAAgB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,mBAAmB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,qBAAqB;AAClD;AACA;AACA;AACA;AACA,sCAAsC,qCAAqC;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,8BAA8B;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yCAAK,gCAAgC,yBAAyB;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA,iEAAiE,iBAAiB,kBAAkB;AACpG;AACA;AACA;AACA;AACA;AACA,qCAAqC,kCAAkC;AACvE;AACA;AACA;AACA;AACA;AACA,qCAAqC,kCAAkC;AACvE;AACA;AACA;AACA;AACA;AACA,qCAAqC,mCAAmC;AACxE;AACA;AACA;AACA,+BAA+B;AAC/B;AACA,iEAAiE,aAAa,mBAAmB;AACjG;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA,iEAAiE,aAAa,mBAAmB;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,gEAAoB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,8DAAuB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,mEAA8B;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,8BAA8B;AAC9D,gDAAgD,iDAAc;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;AC5qBA;AACA;AACA;AACgC;AACuC;AACrC;AACK;AACD;AACtC;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA;AACA;AACA;AACA;AACA;AACO,mBAAmB,yDAAa;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,uEAA2B;AACpD;AACA,sBAAsB,4DAAuB,wBAAwB,UAAU;AAC/E;AACA;AACA;AACA,eAAe,qDAAa;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,4DAAuB;AACjD,yDAAyD,UAAU;AACnE,yBAAyB,yCAAK;AAC9B,8BAA8B,eAAe,GAAG,UAAU;AAC1D,SAAS;AACT;AACA;AACA,oEAAoE,WAAW;AAC/E,qEAAqE,WAAW,GAAG,UAAU;AAC7F,oEAAoE,WAAW,GAAG,UAAU,GAAG,UAAU;AACzG,uEAAuE,WAAW,GAAG,UAAU,GAAG,UAAU;AAC5G,gCAAgC;AAChC,kCAAkC,yCAAK;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,8CAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,8CAAO;AACjC;AACA,8BAA8B,4DAAuB;AACrD,mEAAmE,SAAS;AAC5E,oEAAoE,SAAS;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,8CAAO;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;ACjLA;AACA;AACA;AAC8B;AACE;AACF;AACS;AACvC;AACO,uBAAuB,uCAAI;AAClC;AACA,gBAAgB,eAAe;AAC/B;AACA,4BAA4B,uCAAI;AAChC;AACA,yBAAyB,yCAAK;AAC9B;AACA;AACA;AACA;AACA;AACA,eAAe,yDAAiB;AAChC;AACA;AACA;AACA;AACA,4BAA4B,uCAAI;AAChC;AACA,yBAAyB,yCAAK;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,yCAAK;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AC/EA;AACA;AACA;AACA;AACA;AACA;AACA;AAC8B;AACc;AACL;AACV;AAC7B;AACA;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,wBAAwB,uCAAI;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0DAAkB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,oEAA0B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;;;;;;;;;;;;;;;;;;ACpGA;AACA;AACA;AACA;AACoC;AACG;AACD;AAC/B;AACP;AACA;AACA;AACA,CAAC,sCAAsC;AAChC,oBAAoB,6CAAO;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C,kBAAkB,aAAa;AAC/B,kBAAkB,aAAa;AAC/B,eAAe;AACf;AACA;AACA;AACA;AACA,eAAe,sDAAc;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,mBAAmB;AACnC,gBAAgB,mBAAmB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;;;;;;;;;;;;;;;;;ACnIA;AACA;AACA;AACA;AACsC;AACsC;AACtC;AAC/B,kBAAkB,+CAAQ;AACjC;AACA;AACA,wBAAwB,8DAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA,eAAe,oDAAY;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,sBAAsB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA,gBAAgB,uDAAW;AAC3B;AACA;AACA;AACA;AACA;AACA,qBAAqB,qDAAS;AAC9B,0BAA0B,aAAa;AACvC;AACA;AACA;AACA;AACA,0BAA0B,+CAAY;AACtC;AACA;AACA,4BAA4B,sCAAsC;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C,oBAAoB,2BAA2B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,uDAAW;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,sBAAsB;AACjG;AACA,YAAY,qDAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;AC1JA;AACA;AAC8C;AAClB;AACsB;AAClB;AACE;AACJ;AACsB;AACpD;AACA;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,8BAA8B;AACrE,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,gBAAgB,UAAU;AAC1B;AACA;AACA,sDAAsD;AACtD;AACA;AACA,qBAAqB,8CAAO;AAC5B;AACA,qBAAqB,8CAAO;AAC5B,gBAAgB,8BAA8B;AAC9C;AACA,iFAAiF,UAAU,WAAW,EAAE;AACxG;AACA,oCAAoC,qDAAiB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,2CAA2C;AAC3C;AACA;AACA,kCAAkC,gBAAgB;AAClD,kCAAkC,6CAA6C;AAC/E;AACA,kDAAkD,0CAAO,GAAG,4CAAS;AACrE;AACA;AACA;AACA;AACA;AACA,wDAAwD,aAAa;AACrE;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,wBAAwB,UAAU;AAClC,YAAY,oDAAkB,WAAW,WAAW;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE;AACnE;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA,qDAAqD,+BAA+B,qEAA0B,EAAE,yEAA4B,wBAAwB,cAAc;AAClL,qBAAqB;AACrB;AACA;AACA;AACA,0BAA0B,2CAAM;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA,4BAA4B,gBAAgB;AAC5C;AACA;AACA;AACA,8BAA8B,gBAAgB;AAC9C;AACA;AACA,4BAA4B;AAC5B,kCAAkC,oDAAoD;AACtF;AACA;AACA;AACA,6BAA6B;AAC7B,kCAAkC,0BAA0B;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AChaA;AACA;AACA;AACqD;AACf;AACC;AACN;AACjC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA,cAAc,kEAA2B;AACzC;AACA;AACA,eAAe,wDAAgB;AAC/B;AACA;AACA,sBAAsB,aAAa;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,sCAAsC;AAChE;AACA;AACA;AACA;AACA;AACA,0BAA0B,sCAAsC;AAChE;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,sCAAsC;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF,kCAAkC;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8CAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,mDAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D;AAC1D;AACA;AACA;AACA,4BAA4B,qDAAkB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,gDAAa;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,mDAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,KAAK;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,+DAA4B;AAC3C;AACA;AACA;AACA;AACA;AACA,eAAe,+DAA4B;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,kDAAe;AAC3B,UAAU,4CAAS;AACnB,YAAY,oDAAiB;AAC7B,WAAW,mDAAgB;AAC3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC9UA;AACA;AACA;AAC0C;AACwD;AACpD;AACV;AACN;AACc;AACN;AACN;AACQ;AACJ;AACI;AACU;AACV;AACA;AACA;AACU;AACR;AACU;AACE;AACR;AACA;AACR;AACI;AACV;AACkB;AACV;AACA;AACF;AACQ;AACZ;AACE;AACE;AACM;AACE;AACR;AACM;AACA;AACV;AACkB;AACF;AAClB;AACK;AACrC;AACA;AACA;AACA,QAAQ,2CAAG;AACX;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,kDAAkD,YAAY,6CAA6C,EAAE;AAC7G;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iFAAiF;AACjF;AACA;AACA,6BAA6B,YAAY,4BAA4B;AACrE;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA,gBAAgB,uCAAuC;AACvD;AACA;AACA;AACA;AACA;AACA,sBAAsB,gDAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,mDAAY;AAC5B,0BAA0B,gEAAwB;AAClD;AACA;AACA,0BAA0B,6DAAqB;AAC/C;AACA;AACA,uBAAuB,6DAAqB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,8EAA8E,8CAA8C;AAC9J,0BAA0B,0CAAK;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,8EAA8E,8CAA8C;AAC9J,0BAA0B,gDAAQ;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,kDAAS;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,kDAAS;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,oDAAU;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,kDAAS;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,gDAAQ;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB,4BAA4B,6CAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA,eAAe;AACf,6BAA6B,+CAAQ;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,aAAa;AAC/C,gCAAgC,sDAAW;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,oDAAU;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,8CAAO;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,kDAAS;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,4DAAc;AACxC;AACA;AACA;AACA;AACA,0BAA0B,mDAAU;AACpC;AACA;AACA;AACA;AACA,kCAAkC,qBAAqB,2EAAkC,YAAY,yEAAgC,EAAE;AACvI,+BAA+B,mDAAU;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,uEAAuE;AACzG,gCAAgC,qDAAW;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,+BAA+B;AACjE,iCAAiC,uDAAY;AAC7C;AACA;AACA;AACA;AACA;AACA,kCAAkC,4CAA4C;AAC9E,yBAAyB,wDAAY;AACrC;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,+BAA+B;AACjE,8BAA8B,4DAAc;AAC5C;AACA;AACA;AACA;AACA;AACA,iCAAiC,wDAAY;AAC7C;AACA;AACA;AACA;AACA;AACA,mBAAmB,sDAAW;AAC9B;AACA;AACA,mBAAmB,8DAAe;AAClC;AACA;AACA,4BAA4B,+CAAO;AACnC,qCAAqC,gEAAgB;AACrD;AACA;AACA;AACA;AACA;AACA,kCAAkC,aAAa;AAC/C,0BAA0B,0CAAK;AAC/B;AACA;AACA;AACA;AACA,8BAA8B,4DAAc;AAC5C;AACA;AACA;AACA;AACA;AACA,mBAAmB,kDAAS;AAC5B;AACA;AACA,kCAAkC,wBAAwB;AAC1D,2BAA2B,4CAAM;AACjC;AACA;AACA;AACA;AACA;AACA,yBAAyB,uCAAI;AAC7B;AACA;AACA;AACA;AACA;AACA,0BAA0B,yCAAK;AAC/B;AACA;AACA;AACA;AACA;AACA,wBAAwB,gDAAQ;AAChC;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,kDAAS;AAClC;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,4DAAc;AACjD;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,sDAAW;AAC3C;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,2BAA2B,4CAAM;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,YAAY,6CAA6C;AAC1G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA,mBAAmB,iDAAS;AAC5B;AACA;AACA,kCAAkC;AAClC;AACA,eAAe;AACf,0BAA0B,wDAAY;AACtC,sBAAsB,mEAAuB;AAC7C;AACA;AACA;AACA;AACA;AACA,kCAAkC,WAAW;AAC7C,0BAA0B,wDAAY;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,EAAE,uDAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnevD,iBAAiB,SAAI,IAAI,SAAI;AAC7B,4BAA4B,+DAA+D,iBAAiB;AAC5G;AACA,oCAAoC,MAAM,+BAA+B,YAAY;AACrF,mCAAmC,MAAM,mCAAmC,YAAY;AACxF,gCAAgC;AAChC;AACA,KAAK;AACL;AAC0C;AACA;AACI;AACV;AACN;AACA;AACc;AACsB;AAClB;AACJ;AACd;AACQ;AACE;AACR;AACJ;AACY;AACJ;AACA;AACN;AACU;AACF;AACY;AACV;AACR;AACQ;AACA;AACU;AACJ;AACJ;AACI;AACJ;AACc;AACJ;AACE;AACtB;AACF;AACQ;AACQ;AACR;AACM;AACV;AACY;AACR;AACU;AACV;AACI;AACV;AACsB;AACJ;AACJ;AACN;AACQ;AACR;AACO;AACL;AACF;AACF;AACD;AACP;AACgB;AACX;AACO;AACR;AACA;AACE;AACE;AACA;AACJ;AACU;AACE;AACE;AACV;AACM;AACI;AACJ;AACR;AACF;AACA;AACY;AACV;AACc;AAClB;AACzB;AACP;AACA;AACA;AACA,qBAAqB,8CAAO;AAC5B;AACA,gBAAgB,yCAAE;AAClB;AACA,kBAAkB,2CAAI;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,8CAA8C;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,6CAAS;AAC3D,QAAQ,6DAAuB;AAC/B,QAAQ,2DAAsB;AAC9B,QAAQ,4DAAuB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,sBAAsB,6DAAuB;AAC7C;AACA;AACA;AACA,eAAe,gEAA0B;AACzC;AACA;AACA,QAAQ,gEAA0B;AAClC;AACA;AACA,eAAe,iEAA2B;AAC1C;AACA;AACA,QAAQ,iEAA2B;AACnC;AACA;AACA,eAAe,uDAAiB;AAChC;AACA;AACA,QAAQ,uDAAiB;AACzB;AACA;AACA,eAAe,iEAA2B;AAC1C;AACA;AACA,QAAQ,iEAA2B;AACnC;AACA;AACA,eAAe,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ACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,KAAK;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,8CAA8C;AAC9D,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D,sBAAsB,oBAAoB,EAAE,KAAK;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,QAAQ;AAC3D,oCAAoC,QAAQ;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,6CAA6C;AAC7C;AACA,0BAA0B,mBAAmB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8CAAO;AACtB;AACA;AACA,eAAe,8CAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;ACjYO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;;;;;;;;;;;;;;;ACtqGA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;AACA;AACA,mBAAmB,uBAAuB;AAC1C,mBAAmB,sBAAsB;AACzC,mBAAmB,sBAAsB;AACzC,mBAAmB,uBAAuB;AAC1C,mBAAmB,wBAAwB;AAC3C,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA,2BAA2B,uBAAuB;AAClD,yBAAyB,aAAa;AACtC,aAAa;AACb;AACA,2BAA2B,cAAc;AACzC,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;;;;;;;;;;;;;;;AC5gBO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;;;;;;;;;;;;;;;AC7EO;AACP;AACA;AACA,cAAc;AACd;;;;;;;;;;;;;;;ACJO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;AC3zBA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;AACA;AACA,mBAAmB,uBAAuB;AAC1C,mBAAmB,sBAAsB;AACzC,mBAAmB,sBAAsB;AACzC,mBAAmB,uBAAuB;AAC1C,mBAAmB,wBAAwB;AAC3C,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;;;;;;;;;;;;;;;;;;;AC1aA;AACA;AACA;AACA;AAC6C;AACF;AACI;AACA;AAC/C;AACA,YAAY,UAAU;AACtB;AACO;AACP,IAAI,0DAAW;AACf,IAAI,4DAAY;AAChB,IAAI,4DAAY;AAChB,IAAI,wDAAU;AACd;AACA;AACA;;;;;;;;;;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC+B;AACgB;AACI;AAC5C;AACP,IAAI,4CAAS,YAAY,wDAAW,EAAE,4DAAc;AACpD;;;;;;;;;;;;;;;;;;ACfA;AACA;AAC+B;AACc;AACI;AAC1C;AACP,IAAI,4CAAS,WAAW,sDAAU,EAAE,0DAAa;AACjD;;;;;;;;;;;;;;;;;;ACPA;AACA;AAC+B;AACkB;AACI;AAC9C;AACP,IAAI,4CAAS,aAAa,0DAAY,EAAE,8DAAe;AACvD;;;;;;;;;;;;;;;;;;ACPA;AACA;AAC+B;AACkB;AACI;AAC9C;AACP,IAAI,4CAAS,aAAa,0DAAY,EAAE,8DAAe;AACvD;;;;;;;;;;;;;;;ACPO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;;;;;;;;;;;;;;;ACtzCA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;AACA;AACA,mBAAmB,uBAAuB;AAC1C,mBAAmB,sBAAsB;AACzC,mBAAmB,sBAAsB;AACzC,mBAAmB,uBAAuB;AAC1C,mBAAmB,wBAAwB;AAC3C,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA,2BAA2B,uBAAuB;AAClD,yBAAyB,aAAa;AACtC,aAAa;AACb;AACA,2BAA2B,cAAc;AACzC,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;;;;;;;;;;;;;;;ACviBO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;;;;;;;;;;;;;;;AC91BO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AC91BA;AACA;AAC+B;AACkB;AACY;AACR;AAC9C;AACP;AACA;AACA,yBAAyB,8DAAc;AACvC,gBAAgB,iCAAiC;AACjD,QAAQ,4CAAS;AACjB;AACA;AACA;AACA,QAAQ,sEAA0B;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,yBAAyB,sEAAkB;AAC3C,gBAAgB,iCAAiC;AACjD,QAAQ,4CAAS;AACjB;AACA;AACA;AACA,QAAQ,sEAA0B;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;ACnDA;AACA;AAC8B;AACA;AACQ;AACc;AACpB;AACkB;AAChB;AACU;AACM;AACW;AAC7B;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,+CAAQ;AACtC;AACA;AACA;AACA;AACA,iDAAiD,sBAAsB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,0BAA0B;AACtE;AACA,YAAY,kDAAM;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,8CAAO;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA,gDAAgD,4DAA4D;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,sBAAsB,IAAI;AAClE;AACA,0CAA0C,6DAAe;AACzD,6BAA6B,qDAAW;AACxC;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,kCAAkC,cAAc,4DAAuB,kCAAkC;AACzG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kDAAe;AACnC;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,8BAA8B,uCAAuC,SAAS,wCAAwC,OAAO,6BAA6B;AAC1J;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,eAAe;AACjD,+EAA+E,kBAAkB;AACjG;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA,0BAA0B,0CAAK,CAAC,mDAAc,UAAU,oDAAe;AACvE;AACA,0CAA0C,wDAAqB;AAC/D;AACA;AACA,wCAAwC,kCAAkC;AAC1E,6CAA6C,yCAAyC;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA,8BAA8B,0CAAK,CAAC,mDAAc,UAAU,oDAAe;AAC3E;AACA,6BAA6B,0CAAK,CAAC,mDAAc,UAAU,oDAAe;AAC1E;AACA,uCAAuC,wDAAqB;AAC5D;AACA;AACA,4CAA4C,+BAA+B;AAC3E;AACA,2DAA2D,+BAA+B;AAC1F;AACA;AACA;AACA;AACA;AACA,YAAY,2DAAc;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uDAAW;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,uDAAW;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,4DAAuB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,+CAAY;AACtC;AACA;AACA;AACA;AACA,gBAAgB,qCAAqC;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA,0BAA0B,+CAAY;AACtC;AACA,oCAAoC,sDAAiB;AACrD,0BAA0B,+CAAY;AACtC;AACA,yCAAyC,mDAAY;AACrD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,0DAA0D,6DAAe;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,qDAAW;AACzE;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA,gBAAgB,qCAAqC;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,gBAAgB,8CAA8C;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,QAAQ;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,8CAAO;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,4DAAuB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,uBAAuB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,yCAAyC;AAClF;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,oBAAoB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,6BAA6B;AACrE;AACA,2EAA2E,wDAAoB;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;AClyBA;AACA;AACA;AACA;AACA;AACuC;AACD;AACtC;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,yDAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,oCAAoC,EAAE,IAAI,EAAE;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,eAAe,GAAG,iBAAiB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,uBAAuB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;ACnNA;AACA;AACA;AACA;AACqD;AACG;AACtB;AACc;AACT;AACD;AAC/B,6BAA6B,+CAAQ;AAC5C;AACA;AACA;AACA;AACA,wBAAwB,6DAAsB,EAAE;AAChD;AACA;AACA,2BAA2B;AAC3B,2BAA2B;AAC3B;AACA;AACA;AACA,eAAe,+DAAuB;AACtC;AACA;AACA;AACA,gBAAgB,0BAA0B;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA,kCAAkC,gEAAoB;AACtD;AACA,iCAAiC,6DAAsB;AACvD,oDAAoD,+DAA0B;AAC9E;AACA,iCAAiC,6DAAsB;AACvD,gDAAgD,+DAA0B;AAC1E;AACA;AACA,gCAAgC,sBAAsB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA,oBAAoB,uCAAuC;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6DAAsB;AAC9C;AACA,mDAAmD;AACnD;AACA;AACA,6BAA6B,8DAAuB;AACpD;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,aAAa,IAAI;AAC5C;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,8DAAuB;AACxC;AACA;AACA;AACA,iBAAiB,8DAAuB;AACxC;AACA;AACA;AACA,iBAAiB,6DAAsB;AACvC;AACA;AACA,iBAAiB,8DAAuB;AACxC;AACA;AACA;AACA,0BAA0B,+CAAY,oCAAoC,eAAe;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,kDAAe;AAC3B;AACA,YAAY,kDAAe;AAC3B,WAAW,mDAAgB;AAC3B;;;;;;;;;;;;;;;;;;ACnKA;AACA;AACA;AACgD;AACK;AACf;AACtC;AACO,wBAAwB,yDAAa;AAC5C;AACA,eAAe,0DAAkB;AACjC;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA,gBAAgB,wDAAY;AAC5B;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;AC7DA;AACA;AAC4C;AACsB;AAC9B;AACG;AACQ;AACxC;AACP;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,KAAK,GAAG,SAAS;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,oBAAoB,6CAAO;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qDAAW;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,sDAAc;AAC7B;AACA;AACA,uCAAuC,SAAS,EAAE,KAAK,EAAE,IAAI;AAC7D,wCAAwC,SAAS,EAAE,IAAI;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,SAAS,GAAG,KAAK,GAAG,IAAI;AACxE;AACA,sDAAsD,MAAM;AAC5D,gDAAgD,SAAS,GAAG,IAAI;AAChE;AACA;AACA;AACA;AACA,QAAQ,8CAAO;AACf;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA,yBAAyB;AACzB;AACA,kBAAkB,+CAAY,sBAAsB,MAAM;AAC1D;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA,sBAAsB,+CAAY,sBAAsB,MAAM;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,2EAAsB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,qDAAW;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qDAAW;AACnC;AACA;AACA,eAAe,8CAAO,oCAAoC,WAAW;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8CAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;AC/XA;AAC8B;AACS;AAChC,wBAAwB,uCAAI;AACnC;AACA;AACA,uCAAuC,6BAA6B;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0DAAkB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;AC1DA;AACwC;AACV;AACI;AACK;AACD;AAC/B,wBAAwB,iDAAS;AACxC;AACA,8BAA8B,kBAAkB,+DAA0B,6DAA6D;AACvI;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0DAAkB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,8CAAW,2BAA2B,8CAAW;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,+DAA0B;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,4CAAS;AACpD;AACA;AACA,qCAAqC,uDAAkB;AACvD;AACA;AACA,mDAAmD,0CAAO;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;ACzIA;AACA;AACA;AACA;AACA;AACA;AAC8B;AACU;AACF;AACA;AACJ;AACA;AACkB;AACvB;AACG;AAChC;AACA;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA;AACO,6BAA6B,+CAAQ;AAC5C;AACA;AACA;AACA;AACA,wBAAwB,6DAAsB;AAC9C;AACA;AACA;AACA;AACA,yBAAyB,yCAAK;AAC9B;AACA;AACA,wBAAwB,sDAAiB;AACzC,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,+DAAuB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6BAA6B;AACrD;AACA;AACA,iCAAiC,uDAAW;AAC5C;AACA;AACA;AACA,gCAAgC,sBAAsB;AACtD;AACA;AACA;AACA;AACA,8BAA8B,yCAAyC;AACvE;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,iDAAS;AAC1C;AACA,0EAA0E;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,uCAAI;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,uDAAW;AAC5C,4CAA4C,+CAAQ,GAAG,2CAAM;AAC7D;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;AC/IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC8B;AACM;AACG;AAChC,2BAA2B,6CAAO;AACzC;AACA,eAAe,6DAAqB;AACpC;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA,2BAA2B,kDAAe,CAAC,GAAG;AAC9C;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC3BA;AACA;AAC4B;AACC;AACA;AACE;AACL;AACH;AACA;AACO;AACW;AACT;AACF;AACP;AACI;AACC;AACJ;AACF;AACM;AACF;AACA;AACH;AACA;AACvB;AAC4B;AACD;AACM;AACL;AACJ;AACI;AACA;AACK;AACF;AACF;AACE;AACF;AACF;AACO;AACC;AACX;AACD;AACI;AACI;AACJ;AACG;AACL;AACM;AACJ;AACK;AACL;AACE;AACL;AACO;AACE;AACF;AACH;AACI;AACJ;AACM;AACH;AACF;AACD;AACD;AACE;AACN;AACS;AACD;AACL;AACG;AACJ;AACzB;AAC0B;AACC;AACA;AACF;AACK;AACC;AACC;AACL;AACA;AACG;AACC;AACC;AACF;AACJ;AACD;AACA;AACG;AACL;AACvB;AAC0B;AACO;AACT;AACF;AACtB;AACe;AACf,iEAAe,qCAAG,EAAC;;;;;;;;;;;;;;;;;AChGnB;AACA;AACA;AACA;AACA;AACgC;AACM;AAC/B;AACP;AACA,yBAAyB,yCAAK;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,oDAAgB;AAClD;AACA,sBAAsB,+CAAY,0CAA0C,SAAS;AACrF;AACA,uFAAuF,oDAAgB;AACvG;AACA;AACA;AACA,6BAA6B,sDAAkB;AAC/C,wBAAwB,IAAI,sDAAkB,EAAE;AAChD,+CAA+C,sDAAkB;AACjE,6BAA6B,+CAAW;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;AC5GA;AACA;AACA;AACA;AACA;AACA;AACA;AACgC;AACuC;AACrC;AACK;AACN;AAC1B,2BAA2B,yDAAa;AAC/C;AACA;AACA;AACA;AACA;AACA,yBAAyB,uEAA2B;AACpD,kCAAkC;AAClC;AACA,8BAA8B;AAC9B;AACA;AACA;AACA,eAAe,6DAAqB;AACpC;AACA;AACA;AACA;AACA;AACA,6BAA6B,2DAAsB;AACnD,0BAA0B,yCAAK;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,wDAAmB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA;AACA,6BAA6B,2BAA2B;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,uBAAuB,wDAAmB,CAAC,8CAAO;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,qEAAyB;AACrE;AACA;AACA;AACA;AACA,4BAA4B,yBAAyB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;;;;;;;;;;;;;;;;;;AC3RA;AACA;AAC8C;AAChB;AACS;AAChC,yBAAyB,uCAAI;AACpC;AACA,gBAAgB,eAAe;AAC/B,gCAAgC,uDAAY;AAC5C;AACA;AACA;AACA;AACA,eAAe,2DAAmB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AClCA;AACA;AACoC;AACG;AACQ;AACxC;AACP;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4CAA4C;AAC7C;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,uBAAuB,6CAAO;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,yDAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8CAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,8CAAO,sCAAsC,UAAU;AAC/D,eAAe,8CAAO,oCAAoC,UAAU;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8CAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8CAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,+CAAY;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD,SAAS;AACT;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1LA;AACA;AACA;AACA;AACA;AACA;AAC0C;AACA;AACI;AAChB;AACc;AAChB;AACsB;AACA;AACJ;AACR;AACM;AACJ;AACM;AACX;AACI;AACI;AACP;AACpC;AACA;AACA;AACA;AACA,QAAQ,2CAAG;AACX;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gDAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,yDAAgB,SAAS,2DAAkB;AACnD,QAAQ,6DAAkB,SAAS,6DAAoB;AACvD,QAAQ,4CAAU,SAAS,qDAAY;AACvC,QAAQ,kEAAqB,SAAS,gEAAuB;AAC7D,QAAQ,0DAAiB,SAAS,4DAAmB;AACrD,QAAQ,oDAAa,SAAS,wDAAe;AAC7C,QAAQ,kEAAqB,SAAS,gEAAuB;AAC7D,QAAQ,8DAAmB,SAAS,8DAAqB;AACzD,QAAQ,+DAAmB,SAAS,8DAAqB;AACzD,QAAQ,8DAAmB,SAAS,8DAAqB;AACzD,QAAQ,sDAAe,SAAS,0DAAiB;AACjD,QAAQ,0DAAiB,SAAS,4DAAmB;AACrD,QAAQ,4DAAkB,SAAS,6DAAoB;AACvD,QAAQ,8CAAW,SAAS,sDAAa;AACzC,QAAQ,qDAAc,SAAS,yDAAgB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,6DAAoB,iBAAiB,2DAAkB;AAC/D;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;ACpIA;AACA;AACA;AACA;AACoC;AACJ;AACM;AACkB;AACtB;AACc;AACE;AACjB;AACjC;AACA;AACA;AACA,6BAA6B,+CAAQ,GAAG,+BAA+B;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,+BAA+B,6CAAO;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,4DAAuB;AACjD,8CAA8C,yJAAyJ,+DAA0B,kDAAkD,+DAA0B,2EAA2E;AACxX;AACA;AACA;AACA;AACA,eAAe,iEAAyB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8CAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC,YAAY,qDAAiB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,uEAA2B;AAC3E,yCAAyC,qDAAS;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,yDAAa;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;AC7LA;AACA;AACsC;AACtC;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,wBAAwB;AAC9C,kBAAkB,yBAAyB;AAC3C,kBAAkB,wBAAwB;AAC1C,kBAAkB,yBAAyB;AAC3C,kBAAkB,wBAAwB;AAC1C,kBAAkB,wBAAwB;AAC1C,oBAAoB,yBAAyB;AAC7C,kBAAkB,wBAAwB;AAC1C,kBAAkB,yBAAyB;AAC3C,kBAAkB,wBAAwB;AAC1C,kBAAkB,yBAAyB;AAC3C,kBAAkB,wBAAwB;AAC1C,sBAAsB,wBAAwB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,2BAA2B;AAC5C,kBAAkB,2BAA2B;AAC7C,oBAAoB,2BAA2B;AAC/C,qBAAqB,2BAA2B;AAChD,kBAAkB,4BAA4B;AAC9C,mBAAmB,4BAA4B;AAC/C,iBAAiB,2BAA2B;AAC5C,kBAAkB,2BAA2B;AAC7C,oBAAoB,2BAA2B;AAC/C,qBAAqB,2BAA2B;AAChD,kBAAkB,2BAA2B;AAC7C,mBAAmB,2BAA2B;AAC9C,iBAAiB,2BAA2B;AAC5C,kBAAkB,2BAA2B;AAC7C,oBAAoB,2BAA2B;AAC/C,qBAAqB,2BAA2B;AAChD,kBAAkB,2BAA2B;AAC7C,mBAAmB,2BAA2B;AAC9C,iBAAiB,2BAA2B;AAC5C,kBAAkB,2BAA2B;AAC7C,oBAAoB,2BAA2B;AAC/C,qBAAqB,2BAA2B;AAChD,kBAAkB,2BAA2B;AAC7C,mBAAmB,2BAA2B;AAC9C,iBAAiB,2BAA2B;AAC5C,kBAAkB,2BAA2B;AAC7C,oBAAoB,2BAA2B;AAC/C,qBAAqB,2BAA2B;AAChD,kBAAkB,2BAA2B;AAC7C,mBAAmB,2BAA2B;AAC9C,iBAAiB,2BAA2B;AAC5C,kBAAkB,2BAA2B;AAC7C,oBAAoB,4BAA4B;AAChD,qBAAqB,4BAA4B;AACjD,kBAAkB,2BAA2B;AAC7C,mBAAmB,2BAA2B;AAC9C,iBAAiB,4BAA4B;AAC7C,kBAAkB,4BAA4B;AAC9C,oBAAoB,2BAA2B;AAC/C,qBAAqB,2BAA2B;AAChD,kBAAkB,4BAA4B;AAC9C,mBAAmB,2BAA2B;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,iCAAiC,UAAU;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,uCAAuC,WAAW;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,2CAA2C,eAAe;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,wCAAwC,UAAU;AACpF;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,4CAA4C,cAAc;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,uCAAuC,UAAU;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,+CAAY,uCAAuC,KAAK,IAAI,UAAU;AAChG;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,uCAAuC,KAAK,IAAI,UAAU;AAC5F;AACA;AACA;AACA,4BAA4B,eAAe;AAC3C;AACA;AACA;AACA;AACA,6BAA6B,eAAe;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,uCAAuC,UAAU;AACnF;AACA;AACA,sBAAsB,+CAAY,mCAAmC,MAAM,IAAI,MAAM;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;AClXA;AACA;AAC8B;AACY;AACR;AACI;AACC;AACQ;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,mBAAmB,+CAAQ;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,wDAAwD,2BAA2B;AACrH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,yDAAoB;AACzC,wDAAwD,yDAAoB;AAC5E;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,sCAAsC;AACtC,uCAAuC;AACvC,0BAA0B;AAC1B,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,qDAAa;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kDAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D,QAAQ,uDAAO;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,sDAAiB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,oBAAoB,2DAAsB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,UAAU;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8CAAO;AACtB;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8CAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,4DAAuB;AACzC;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,4DAAuB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,+CAAY;AAC9B;AACA;AACA;AACA,kBAAkB,+CAAY;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;AC7eA;AACA;AAC4C;AACZ;AACF;AACA;AACI;AACK;AACa;AACpD;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,gEAA2B;AAC7C;AACA,qBAAqB,sDAAiB;AACtC;AACA,QAAQ,4DAAuB;AAC/B;AACA;AACA;AACA,cAAc,sDAAiB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,8DAAyB;AACjC;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,uBAAuB,uCAAI;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,0CAAO;AAClE;AACA;AACA;AACA,qBAAqB,yDAAoB;AACzC,QAAQ,8CAAO,6DAA6D,cAAc,cAAc,cAAc;AACtH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA,6DAA6D,+DAA0B,EAAE;AACzF;AACA;AACA;AACA,eAAe,yDAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,6CAAU;AACrD,0BAA0B,4DAAuB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA,mBAAmB,qDAAW;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,0CAAO;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,gBAAgB,MAAM,mBAAmB,0CAAO,iBAAiB;AACnG;AACA;AACA;AACA;AACA;AACA,YAAY,qDAAiB;AAC7B,iEAAiE,eAAe,yBAAyB,eAAe;AACxH,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;ACnNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACwC;AACF;AACJ;AACK;AACP;AACzB,2BAA2B,+CAAQ;AAC1C;AACA;AACA;AACA,wBAAwB,6DAAsB;AAC9C;AACA;AACA;AACA,SAAS;AACT;AACA,6BAA6B,iDAAS;AACtC,yBAAyB,yCAAK;AAC9B;AACA;AACA,wBAAwB,sDAAiB;AACzC,SAAS;AACT;AACA;AACA;AACA,eAAe,6DAAqB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;ACpEA;AACA;AACA;AACgC;AACM;AACR;AACI;AACU;AACM;AACE;AACpD;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,uBAAuB,+CAAQ;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yDAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,0CAA0C,UAAU;AACtF;AACA;AACA;AACA,yBAAyB,yCAAK;AAC9B,kCAAkC,mBAAmB;AACrD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA,eAAe,yDAAiB;AAChC;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB,6CAA6C;AAC7C;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,8CAAO;AAC5C,oFAAoF,8DAAuB;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,8DAAuB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,4DAAuB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,yCAAK,CAAC,2DAAsB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,yCAAK,CAAC,2DAAsB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,4CAAS;AACrC;AACA,YAAY,qDAAS;AACrB;AACA,gCAAgC,4CAAS;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,4CAAS;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,oEAA0B;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AC/QA;AACA;AACA;AACgC;AACwB;AACtB;AACkB;AACpD;AACO,0BAA0B,+CAAQ;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,6DAAsB;AACpG,qBAAqB,4DAAuB;AAC5C,sBAAsB,4DAAuB;AAC7C;AACA;AACA,eAAe,4DAAoB;AACnC;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD,iDAAiD,4DAAqB;AACtE,iDAAiD,6DAAsB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA,wBAAwB,6DAAsB;AAC9C;AACA;AACA;AACA,wBAAwB,4DAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,4DAAuB;AAC5C,sBAAsB,4DAAuB;AAC7C,YAAY,uDAAW;AACvB,yBAAyB,4DAAuB;AAChD,0BAA0B,4DAAuB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,sBAAsB;AACjG;AACA;AACA,6BAA6B,8DAAuB;AACpD,YAAY,qDAAiB;AAC7B;AACA,aAAa;AACb;AACA,kCAAkC,6DAAsB;AACxD,YAAY,qDAAiB;AAC7B;AACA,aAAa;AACb;AACA;AACA;;;;;;;;;;;;;;;;ACxFA;AACA;AACA;AAC2C;AAC3C;AACA;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,cAAc;AACnE,kDAAkD,4BAA4B;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,iBAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,SAAS;AAChC;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;ACnNA;AACA;AACoC;AACiB;AACrB;AACE;AACK;AACI;AAC3C;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,yCAAK,2BAA2B,0BAA0B;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,2BAA2B,6CAAO;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,6DAAqB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,+CAAY;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,4DAAuB,gCAAgC,mCAAmC;AACpH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,4DAAuB,gCAAgC,mCAAmC;AACpH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,6CAAU;AACtB;AACA,YAAY,kDAAe;AAC3B,WAAW,mDAAgB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;ACtPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,2BAA2B;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA,2BAA2B,yEAAyE;AACpG;AACA;AACA;AACA;AACA;AACA,oIAAoI;AACpI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACnHA;AACA;AACuC;AAChC;AACP;AACA,eAAe,8DAAsB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;ACtCA;AACA;AACgD;AACN;AACI;AACR;AACU;AACzC;AACP;AACA;AACA;AACA,CAAC,4CAA4C;AAC7C;AACO;AACP;AACA;AACA;AACA;AACA,CAAC,kDAAkD;AACnD;AACA;AACA;AACO;AACP;AACA,YAAY,2DAAe;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,+CAAY;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,+CAAY,gDAAgD,aAAa;AACvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,kDAAY;AACjC,8BAA8B,+CAAY;AAC1C;AACA;AACA;AACA,8BAA8B,+CAAY;AAC1C;AACA,+BAA+B,yDAAa;AAC5C;AACA;AACA,qBAAqB,+CAAS;AAC9B,8BAA8B,+CAAY;AAC1C;AACA,+BAA+B,mDAAU;AACzC;AACA;AACA,0BAA0B,+CAAY,8CAA8C,QAAQ;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AC9HA;AACgC;AACQ;AACN;AACK;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACO,yBAAyB,iDAAS;AACzC;AACA,eAAe,2DAAmB;AAClC;AACA;AACA,yCAAyC,+CAA+C;AACxF;AACA,0BAA0B,yCAAK,YAAY,4DAAuB;AAClE;AACA,SAAS;AACT;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxBA;AACA;AAC4C;AACd;AACM;AACiB;AACP;AACQ;AACE;AACT;AACD;AACJ;AACF;AACH;AACH;AACc;AACE;AACZ;AACtC;AACA;AACA;AACA;AACA,KAAK,2DAAgB;AACrB,KAAK,gDAAa;AAClB,KAAK,gEAAqB;AAC1B,KAAK,mEAAsB;AAC3B;AACA;AACA,KAAK,mEAAsB;AAC3B,KAAK,gEAAqB;AAC1B,KAAK,2DAAgB;AACrB,KAAK,gDAAa;AAClB;AACO,oBAAoB,6CAAO;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA,uCAAuC,wHAAwH,gEAA0B,oHAAoH;AAC7S,wBAAwB;AACxB,wCAAwC;AACxC;AACA;AACA,6BAA6B,kDAAO,yBAAyB,6DAAkB,GAAG,2DAAgB;AAClG;AACA,gCAAgC,kDAAO,0BAA0B,6DAAkB,GAAG,2DAAgB;AACtG;AACA;AACA,eAAe,uDAAc;AAC7B;AACA;AACA;AACA;AACA,0BAA0B,6DAAuB;AACjD;AACA;AACA;AACA;AACA,0BAA0B,6DAAuB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,4BAA4B;AACpD,4CAA4C,eAAe;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,iEAA2B;AAChE;AACA;AACA,0DAA0D,iEAA2B;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,qFAAqF,iEAA2B,EAAE;AACjJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA,sBAAsB,gDAAY;AAClC;AACA;AACA;AACA,8BAA8B,uEAA2B;AACzD;AACA;AACA;AACA,oDAAoD,uEAA2B;AAC/E;AACA;AACA;AACA;AACA,qCAAqC,mEAAwB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,wDAAU;AAC1C;AACA;AACA;AACA;AACA,gCAAgC,+CAAK;AACrC;AACA;AACA;AACA;AACA,iCAAiC,uDAAY;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,mDAAU;AAC1C;AACA;AACA;AACA,wCAAwC;AACxC,gCAAgC,kDAAS;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,qDAAW;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,qEAAyB;AAC5D;AACA;AACA;AACA;AACA;AACA,gBAAgB,6BAA6B,EAAE,sDAAW;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,mEAAwB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,uEAA2B;AAClD;AACA,yBAAyB,qEAAyB;AAClD;AACA;AACA;AACA;AACA;AACA,kDAAkD,gDAAa;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,qEAAyB;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,uEAA2B;AAClD;AACA,0DAA0D,gEAAqB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,qEAAyB;AAC9E;AACA;AACA;AACA;AACA,uBAAuB,uEAA2B;AAClD;AACA,2DAA2D,mEAAsB;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,qEAAyB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,uEAA2B;AAClD;AACA,6BAA6B,uDAAY;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,uEAA2B;AAC9E;AACA;AACA,8BAA8B,qEAAyB;AACvD;AACA;AACA,6BAA6B,uCAAI;AACjC;AACA;AACA;AACA,6CAA6C,qEAAyB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,0DAAa;AAC1C;AACA;AACA;AACA,uDAAuD,qEAAyB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,QAAQ;AAC/C,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,uEAA2B;AAC1E,+CAA+C,qEAAyB;AACxE;AACA;AACA,gEAAgE,mEAAwB;AACxF;AACA,0CAA0C,kDAAO,CAAC,6DAAkB;AACpE;AACA;AACA,0CAA0C,kDAAO,CAAC,2DAAgB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA,6BAA6B,sDAAS;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,kBAAkB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gDAAY;AAClC;AACA;AACA,sBAAsB,gDAAY;AAClC;AACA;AACA,sBAAsB,gDAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gDAAY;AAClC;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA,kFAAkF;AAClF;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,kDAAe;AAC3B;AACA,YAAY,oDAAiB;AAC7B,WAAW,mDAAgB;AAC3B;;;;;;;;;;;;;;;;;;;ACnpBA;AACA;AACA;AACuE;AACrC;AACK;AAChC;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;AAC5B,sBAAsB,yDAAa;AAC1C;AACA;AACA,yBAAyB,gEAA2B;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,uEAA2B;AACpD;AACA;AACA;AACA,eAAe,wDAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;ACjMA;AACA;AACoC;AACiB;AACrB;AACE;AACK;AACD;AACtC;AACA;AACA,kBAAkB,+CAAY;AAC9B;AACA;AACA,6BAA6B;AAC7B,+BAA+B;AAC/B;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,6BAA6B,6CAAO;AAC3C;AACA;AACA,yBAAyB,gEAA2B;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,+DAAuB;AACtC;AACA;AACA;AACA,wBAAwB,2BAA2B,GAAG;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA,qCAAqC,wBAAwB;AAC7D,SAAS;AACT;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,qDAAiB;AACjC,gBAAgB,qDAAiB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,+CAAY,qDAAqD,UAAU;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,6CAAU;AACtB;AACA,YAAY,oDAAiB;AAC7B,WAAW,mDAAgB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;ACtOA;AACA;AACA;AACA;AACA;AACA;AACA;AACoC;AACE;AACC;AACD;AAC/B,2BAA2B,6CAAO;AACzC;AACA;AACA;AACA,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;AACA,wBAAwB,8DAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,6DAAqB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,8DAAuB,iBAAiB,8DAAuB;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAAS;AACxB;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,8DAAuB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AC/JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACoC;AACF;AACK;AACD;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,wBAAwB,6CAAO;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0DAAkB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,mEAA8B;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,EAAE,uDAAiB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;ACpRA;AACA;AACA;AACA;AACoC;AACG;AACN;AAC1B;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sDAAsD;AAChD,4BAA4B,6CAAO;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8DAAsB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8CAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC4C;AACN;AACA;AACR;AACkB;AACd;AACK;AAC4B;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA,iFAAiF,0CAAO;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,8CAAO;AACrC;AACA;AACA;AACA;AACA;AACO,wBAAwB,yDAAa;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,yDAAoB;AACzC,QAAQ,8CAAO,6DAA6D,cAAc,cAAc,cAAc;AACtH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA,6DAA6D,+DAA0B;AACvF;AACA,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oGAAoG,0CAAO;AAC3G;AACA;AACA;AACA;AACA;AACA,eAAe,0DAAkB;AACjC;AACA;AACA;AACA;AACA;AACA,eAAe,0CAAO;AACtB;AACA;AACA;AACA;AACA;AACA,eAAe,4CAAS;AACxB;AACA;AACA;AACA;AACA;AACA,0BAA0B,4DAAuB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,uCAAI,GAAG,uBAAuB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,0CAAO;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,WAAW;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,+CAAQ;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,0CAAO,GAAG,4CAAS;AACzE;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B,0BAA0B,yDAAoB;AAC9C;AACA,0BAA0B,+CAAY,qDAAqD,IAAI;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,2CAAI;AACpB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA,gBAAgB,2CAA2C;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,8DAAyB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,oBAAoB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,qDAAW;AAC9B;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,6CAAU;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,8CAAO;AAC9B;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA,gBAAgB,4BAA4B,EAAE,wDAAiB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,0CAAO;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,4CAAS;AACvF;AACA;AACA,kGAAkG,0CAAO;AACzG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,0CAAO;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,kBAAkB,QAAQ;AAC1B,kBAAkB,QAAQ;AAC1B,kBAAkB,aAAa;AAC/B,kBAAkB,aAAa;AAC/B,kBAAkB,QAAQ;AAC1B;AACA,kBAAkB,QAAQ;AAC1B,kBAAkB,cAAc;AAChC;AACA,kBAAkB,cAAc;AAChC,kBAAkB,QAAQ;AAC1B,kBAAkB,QAAQ;AAC1B;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,yBAAyB,WAAW,IAAI;AACxD;AACA;AACA,iEAAiE,6CAAU;AAC3E;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA,gBAAgB,iKAAiK;AACjL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA,2BAA2B,sBAAsB;AACjD;AACA;AACA;AACA;AACA;AACA,2BAA2B,qBAAqB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,4CAAS;AAC/D;AACA;AACA;AACA;AACA;AACA,+CAA+C,mBAAmB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,mBAAmB;AACtE;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,uCAAI;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,mBAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA,+BAA+B,0CAAO;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,mBAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;ACl8BA;AACA;AACqD;AACrB;AACgB;AACd;AACK;AAChC,yBAAyB,yDAAa;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,2DAAmB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,qDAAiB,sDAAsD,4DAAuB,kEAAkE,kBAAkB;AAC1L;AACA;AACA;AACA;AACA,QAAQ,qDAAiB,sDAAsD,4DAAuB,mEAAmE,mBAAmB;AAC5L;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,4DAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,4DAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,4DAAuB;AAC/C;AACA;AACA,wBAAwB,4DAAuB;AAC/C;AACA;AACA;AACA,wBAAwB,4DAAuB;AAC/C;AACA;AACA;AACA;AACA,YAAY,4DAAuB;AACnC;AACA,YAAY,qDAAiB,iCAAiC,kBAAkB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,6CAAU;AACtB;AACA,YAAY,kDAAe;AAC3B,WAAW,mDAAgB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;ACjKA;AACA;AACqD;AACL;AACT;AAChC,2BAA2B,yDAAa;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,6DAAqB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,kDAAe;AAC3B;AACA,YAAY,kDAAe;AAC3B,WAAW,mDAAgB;AAC3B;;;;;;;;;;;;;;;;;;;;AC7DA;AACA;AACqD;AACrB;AACuC;AACrC;AACK;AAChC,yBAAyB,yDAAa;AAC7C;AACA;AACA;AACA,gCAAgC;AAChC;AACA,wBAAwB,uEAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,2DAAmB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,oBAAoB,mCAAmC;AAC7G;AACA;AACA;AACA;AACA;AACA,yBAAyB,yDAAoB;AAC7C;AACA,YAAY,qDAAiB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qDAAiB;AACrC;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA,4BAA4B,UAAU;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,6CAAU;AACtB;AACA,YAAY,kDAAe;AAC3B,WAAW,mDAAgB;AAC3B;;;;;;;;;;;;;;;;;;;;ACnGA;AACA;AACqD;AACkB;AAClB;AACd;AACD;AAC/B,wBAAwB,yDAAa;AAC5C,4CAA4C;AAC5C;AACA;AACA;AACA;AACA,uCAAuC,uCAAuC,oEAA6B,EAAE;AAC7G;AACA;AACA;AACA,eAAe,0DAAkB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,sEAA0B;AAC3C,iBAAiB,uEAA2B;AAC5C;AACA,sCAAsC,sEAA0B;AAChE;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,uEAA2B;AAC5C,iBAAiB,uEAA2B;AAC5C;AACA,mDAAmD,2DAAoB;AACvE;AACA;AACA,wDAAwD,0DAAmB;AAC3E;AACA;AACA,sCAAsC,uEAA2B;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,+CAAY;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,6CAAU;AACtB;AACA,YAAY,oDAAiB;AAC7B,WAAW,mDAAgB;AAC3B;;;;;;;;;;;;;;;;;;ACpFA;AACA;AACA;AACA;AACoC;AACG;AACD;AAC/B,uBAAuB,6CAAO;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,yDAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAAS;AACxB;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA,0BAA0B,+CAAY;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,qCAAqC,EAAE,uDAAiB;;;;;;;;;;;;;;;;;;;ACzKxD;AACA;AACqD;AACL;AACT;AAChC;AACP;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8BAA8B;AACxB,oBAAoB,yDAAa;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,sDAAc;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,kDAAe;AAC3B;AACA,YAAY,kDAAe;AAC3B,WAAW,mDAAgB;AAC3B;;;;;;;;;;;;;;;;;;;ACtEA;AACA;AACA;AACA;AACA;AACoC;AACF;AACK;AACI;AAC3C;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACO,mBAAmB,6CAAO;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,qDAAa;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,sDAAiB;AAChC;AACA;AACA,eAAe,uDAAkB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6GAA6G;AAC7G;AACA;AACA;AACA,kBAAkB,+CAAY;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,4DAAuB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;AChKA;AACA;AACA;AACA;AACA;AACgC;AACF;AACA;AACI;AACK;AACD;AAC/B,4BAA4B,uCAAI;AACvC;AACA;AACA;AACA;AACA,eAAe,8DAAsB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,uCAAI;AAC7B;AACA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA,yDAAyD,4CAAS;AAClE,4BAA4B,yCAAK,mDAAmD,UAAU;AAC9F;AACA;AACA;AACA;AACA,wCAAwC,4CAAS;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8CAAW;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,8DAAyB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA,wBAAwB,0CAAO;AAC/B,0BAA0B,0CAAO,kBAAkB,4CAAS;AAC5D,sBAAsB,+CAAY,2CAA2C,UAAU;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,4DAAuB,iCAAiC,gBAAgB;AACpG;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,4CAAS;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,4CAAS;AAC9D,wBAAwB,4DAAuB,+BAA+B,SAAS;AACvF;AACA;AACA;AACA,gDAAgD,8CAAW;AAC3D;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,+CAAY;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,+CAAY;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,yDAAoB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,uCAAI;AAC7B;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;AC5NA;AACA;AACA;AACA;AACA;AACqD;AACG;AAClB;AACR;AACI;AACmC;AAC/B;AAC/B,2BAA2B,+CAAQ;AAC1C;AACA;AACA;AACA,2BAA2B;AAC3B,wBAAwB,8DAAuB,EAAE;AACjD;AACA;AACA;AACA;AACA,2BAA2B;AAC3B,2BAA2B;AAC3B,4BAA4B;AAC5B,mBAAmB,gEAAyB,EAAE;AAC9C;AACA;AACA;AACA;AACA,eAAe,6DAAqB;AACpC;AACA;AACA;AACA,eAAe,4DAAuB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA,iBAAiB,uDAAW;AAC5B,0BAA0B,+CAAY;AACtC;AACA;AACA;AACA;AACA,2DAA2D,+DAA0B;AACrF;AACA,4BAA4B,6DAAsB;AAClD;AACA;AACA;AACA,iCAAiC,6DAAsB;AACvD;AACA;AACA;AACA;AACA;AACA,gCAAgC,sBAAsB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6DAAsB;AAC9C;AACA,oDAAoD;AACpD;AACA;AACA,6BAA6B,8DAAuB;AACpD;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,gEAAyB,WAAW,gEAAyB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE,0CAAO;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,8DAAuB;AACxC;AACA;AACA;AACA,2DAA2D,0CAAO;AAClE;AACA;AACA,mGAAmG,+DAA0B;AAC7H;AACA;AACA,iBAAiB,8DAAuB;AACxC;AACA;AACA;AACA,2DAA2D,4CAAS;AACpE;AACA;AACA,mGAAmG,+DAA0B;AAC7H;AACA;AACA,iBAAiB,6DAAsB;AACvC;AACA;AACA,iBAAiB,8DAAuB;AACxC;AACA;AACA;AACA,0BAA0B,+CAAY,oCAAoC,eAAe;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,2DAAe;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,8DAAuB;AACvC;AACA;AACA,gBAAgB,8DAAuB;AACvC;AACA;AACA;AACA;AACA,qBAAqB,8DAAuB;AAC5C;AACA;AACA,oBAAoB,8DAAuB;AAC3C;AACA,qBAAqB,gEAAyB;AAC9C;AACA;AACA,oBAAoB,8DAAuB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,kDAAe;AAC3B,UAAU,4CAAS;AACnB,YAAY,kDAAe;AAC3B,WAAW,mDAAgB;AAC3B;;;;;;;;;;;;;;;;;;;;ACjPA;AACA;AACA;AACA;AACA;AACqD;AACrB;AACM;AACiC;AACjC;AAC/B,qBAAqB,+CAAQ;AACpC;AACA;AACA,uCAAuC,kBAAkB;AACzD;AACA;AACA;AACA;AACA,wBAAwB,6DAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,uDAAe;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uDAAW;AAC3B;AACA,wBAAwB,OAAO;AAC/B;AACA,yBAAyB;AACzB;AACA,qBAAqB,qDAAS;AAC9B;AACA,wBAAwB,cAAc;AACtC,yBAAyB;AACzB;AACA;AACA,0BAA0B,+CAAY;AACtC;AACA,SAAS;AACT;AACA;AACA,oDAAoD,eAAe;AACnE;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA,gBAAgB,kDAAM;AACtB;AACA;AACA;AACA,gCAAgC,eAAe;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,uDAAW;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,uDAAW;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA,0BAA0B,+CAAY,mCAAmC,WAAW;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uDAAW;AAC3B,mCAAmC,WAAW;AAC9C,oBAAoB,qDAAiB;AACrC;AACA;AACA;AACA;AACA,+BAA+B,WAAW;AAC1C,oBAAoB,qDAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,QAAQ,qDAAiB;AACzB,gCAAgC,MAAM,GAAG,WAAW;AACpD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,6CAAU;AACtB,UAAU,4CAAS;AACnB,YAAY,kDAAe;AAC3B,WAAW,mDAAgB;AAC3B;;;;;;;;;;;;;;;;;;ACvNA;AACA;AACA;AACqD;AACL;AACc;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACO,yBAAyB,yDAAa;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,2BAA2B,kDAAe;AAC1C,yBAAyB,4CAAS;AAClC,2BAA2B,oDAAiB;AAC5C,0BAA0B,mDAAgB;AAC1C;AACA,qCAAqC,SAAS,cAAc;AAC5D,0CAA0C,iFAAiF;AAC3H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,6CAAM;AAC9C;AACA,qCAAqC,6CAAM;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mFAAmF;AACnF,wDAAwD,qBAAqB;AAC7E;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,mDAAmD;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,IAAI,EAAE,IAAI,GAAG,QAAQ,EAAE,QAAQ,QAAQ,IAAI,EAAE,IAAI;AAC9E,6BAA6B,QAAQ,EAAE,QAAQ,QAAQ,IAAI,EAAE,GAAG;AAChE;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,qDAAc;AACvC,uBAAuB,qDAAc;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,IAAI,EAAE,IAAI,GAAG,QAAQ,EAAE,QAAQ,IAAI,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,eAAe,KAAK,SAAS;AACvE;AACA;AACA;AACA;AACA,uDAAuD,sBAAsB,gBAAgB;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,sBAAsB,4DAA4D;AAC3I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,sBAAsB;AAC/E,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,gDAAa;AACtC,6BAA6B,mDAAgB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;ACjgBA;AACA;AAC4C;AACR;AACI;AACV;AACE;AACO;AACD;AACtC;AACA;AACA;AACA;AACA;AACO,qBAAqB,6CAAO;AACnC,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA,eAAe,uDAAe;AAC9B;AACA;AACA,2BAA2B;AAC3B;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA,qDAAqD,iLAAiL,cAAc,yBAAyB,YAAY,mDAAmD,0BAA0B;AACtW;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,yDAAyD,EAAE;AACpF;AACA;AACA;AACA,yBAAyB;AACzB,yDAAyD,WAAW;AACpE,iDAAiD,aAAa;AAC9D,UAAU,EAAE;AACZ;AACA;AACA;AACA,6CAA6C,iBAAiB;AAC9D,gGAAgG,wFAAwF;AACxL,gDAAgD;AAChD;AACA,2FAA2F,aAAa,uBAAuB;AAC/H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,iDAAS;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,0BAA0B;AACpE;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,mDAAmD,sDAAkB;AACrE,aAAa;AACb;AACA;AACA;AACA;AACA,mEAAmE,wDAAoB;AACvF;AACA;AACA,wBAAwB,mCAAmC;AAC3D;AACA;AACA;AACA;AACA;A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AAC9C,mBAAmB,uBAAuB;AAC1C,YAAY,mBAAmB;AAC/B,gBAAgB,uBAAuB;AACvC,aAAa,oBAAoB;AACjC;AACO;AACP;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,2EAA2E;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA,gGAAgG,SAAS;AACzG;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA,oDAAoD;AACpD;AACA;AACA;AACA,sBAAsB,+CAAY,kFAAkF,eAAe;AACnI;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA,sBAAsB,+CAAY,8EAA8E,QAAQ;AACxH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,oDAAoD,QAAQ;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,yCAAK;AAC1C;AACA;AACA,0BAA0B,+CAAY;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,gDAAgD,KAAK;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA,4BAA4B,yBAAyB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,wDAAwD,SAAS;AACnG;AACA;AACA;AACA;AACA;AACA,mBAAmB,+CAAQ;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,2CAA2C;AAC7F;AACA;AACA;AACA;AACA,iEAAiE,kDAAc;AAC/E;AACA,2DAA2D,kBAAkB,oBAAoB;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;;;;;;;;;;;;;;;;;;;;;;;AC9xCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC8B;AACE;AACM;AACR;AACkB;AACd;AACY;AACC;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACO,sBAAsB,yDAAa;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA,0DAA0D,iBAAiB;AAC3E;AACA;AACA,4DAA4D;AAC5D;AACA,8BAA8B,gEAA2B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,4CAAS,CAAC,KAAK,kDAAe,CAAC,GAAG;AACvD,qBAAqB,yDAAoB;AACzC,QAAQ,8CAAO,6DAA6D,cAAc,cAAc,cAAc;AACtH;AACA;AACA;AACA;AACA;AACA,kCAAkC,0CAAO;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,wDAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA,0BAA0B,sDAAiB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,wBAAwB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,WAAW;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA,yBAAyB,6DAAsB;AAC/C,wBAAwB;AACxB;AACA,8BAA8B,8DAAuB;AACrD,gCAAgC;AAChC;AACA,8BAA8B,8DAAuB,iBAAiB,8DAAuB;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,0CAAO;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,+CAA+C,6BAA6B,IAAI;AAChG;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,4CAAS;AAC1D;AACA;AACA;AACA,YAAY,qDAAiB,yDAAyD,0BAA0B;AAChH;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,iDAAK;AACrB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,6CAAU;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,qDAAiB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA,8CAA8C,mBAAmB;AACjE;AACA;AACA;AACA;AACA;AACA,+CAA+C,mBAAmB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;ACjYA;AACA;AACA;AACA;AACA;AACqD;AACnB;AACK;AACD;AAC/B,uBAAuB,2CAAM;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,yDAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA,0BAA0B,+CAAY;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,6CAAU;AACtB;AACA,YAAY,kDAAe;AAC3B,WAAW,mDAAgB;AAC3B;;;;;;;;;;;;;;;;;ACpGA;AACgC;AACO;AAChC,uBAAuB,yCAAK;AACnC;AACA,eAAe,yDAAiB;AAChC;AACA;AACA,4CAA4C,kEAAkE;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACsC;AACC;AAChC,qBAAqB,+CAAQ;AACpC;AACA,eAAe,uDAAe;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;;;;;;;;;;;;;;;;;;;;;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACoC;AACiB;AACf;AACJ;AACK;AACI;AAC3C;AACA;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACO;AACP;AACA;AACA;AACA,CAAC,kDAAkD;AAC5C,0BAA0B,6CAAO;AACxC,kBAAkB,8EAA8E;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,4DAAoB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,mEAA8B;AACxG;AACA;AACA,0BAA0B,+CAAY,oCAAoC,eAAe;AACzF;AACA;AACA,wBAAwB;AACxB,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,8BAA8B;AAC9C;AACA,gCAAgC,iDAAc;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,8DAAuB;AACnC;AACA;AACA,gBAAgB,8DAAuB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,6CAAU;AACtB;AACA,YAAY,oDAAiB;AAC7B,WAAW,mDAAgB;AAC3B;;;;;;;;;;;;;;;;;;;ACvLA;AACA;AACgC;AACF;AACS;AACa;AACpD;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,2BAA2B,uCAAI;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,0BAA0B,qBAAqB;AAC3G;AACA;AACA;AACA,eAAe,6DAAqB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,+CAAY;AACtC,yBAAyB,8CAAO;AAChC,8BAA8B,yCAAK,0BAA0B,sBAAsB;AACnF;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;;;;;;;;;;;;;;;;AChHA;AACA;AACqD;AACxB;AAC7B;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA,mCAAmC,kDAAe;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,8CAAW;AACpC,2BAA2B,gDAAa;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,+DAA4B;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,kDAAe,GAAG,oDAAiB;AACtE,oCAAoC,mDAAgB,GAAG,mDAAgB;AACvE;AACA,2BAA2B,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,wDAAqB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;AChRA;AACA;AACqD;AACrB;AACF;AACS;AACD;AAC/B;AACP;AACA;AACA;AACA;AACA,CAAC,sCAAsC;AACvC;AACA;AACA;AACA;AACA;AACA;AACO,uBAAuB,uCAAI;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,+CAAY;AACtC,6BAA6B,yCAAK,oBAAoB,sBAAsB;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,yDAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,8BAA8B;AAClD;AACA,oCAAoC,iDAAc;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,kDAAe;AAC3B;AACA,YAAY,oDAAiB;AAC7B,WAAW,mDAAgB;AAC3B;;;;;;;;;;;;;;;;;;;;AC1MA;AACA;AACoC;AACE;AACJ;AACK;AACQ;AAC/C;AACA;AACA;AACA;AACO,uBAAuB,6CAAO;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,+CAAQ,QAAQ;AACzC,iCAAiC;AACjC,kCAAkC,+CAAQ;AAC1C;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,mBAAmB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,eAAe,yDAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8CAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8CAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,sDAAiB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8CAAO;AACtB;AACA;;;;;;;;;;;;;;;;;AChSA;AACA;AACA;AACA;AACA;AACsC;AACA;AACtC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,+BAA+B,+CAAQ;AACvC,4BAA4B,+CAAQ;AACpC,sCAAsC;AACtC,mCAAmC;AACnC;AACA,0BAA0B;AAC1B;AACA,wBAAwB;AACxB,0BAA0B;AAC1B,6BAA6B;AAC7B,oCAAoC;AACpC;AACA,yBAAyB;AACzB,0BAA0B;AAC1B,sCAAsC;AACtC,uCAAuC;AACvC,4BAA4B;AAC5B,6BAA6B;AAC7B,8BAA8B;AAC9B,+BAA+B;AAC/B,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA,uBAAuB,mBAAmB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uHAAuH;AACvI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACjMA;AACA;AACA;AACA;AACA;AACgC;AACC;AAC1B,iCAAiC,yCAAK;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,yCAAK;AACtC;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,yCAAK;AACtC;AACA,wBAAwB,8CAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA,YAAY,uDAAmB;AAC/B,uBAAuB,8CAAO;AAC9B;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA,YAAY,uDAAmB;AAC/B,uBAAuB,8CAAO;AAC9B;AACA;AACA;;;;;;;;;;;;;;;;;;;;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACgC;AACuC;AACrC;AACkB;AACb;AACQ;AAC/C;AACA;AACA;AACA,kBAAkB,+CAAY,2CAA2C,SAAS;AAClF;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,2CAA2C,SAAS;AACtF;AACA,KAAK;AACL;AACO,4BAA4B,yDAAa;AAChD;AACA;AACA;AACA;AACA,0BAA0B,4DAAuB;AACjD;AACA;AACA;AACA;AACA,yBAAyB,uEAA2B;AACpD;AACA,sBAAsB,8CAAO;AAC7B;AACA;AACA;AACA,eAAe,8DAAsB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB,oBAAoB;AACxC;AACA;AACA;AACA,2BAA2B,yCAAK;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,6DAAkB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;AChGA;AACA;AAC8B;AACkB;AACT;AAChC,0BAA0B,uCAAI;AACrC;AACA,gBAAgB,eAAe;AAC/B,kCAAkC,yDAAa;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,4DAAoB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;ACtCA;AACA;AACA;AACgC;AACQ;AACF;AACR;AACI;AACkB;AACpD;AACO,sBAAsB,+CAAQ;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,+DAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,wDAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,uDAAW;AAC9B,2BAA2B,uDAAe;AAC1C,oCAAoC,yBAAyB;AAC7D,0BAA0B,4DAAuB;AACjD,kDAAkD,SAAS;AAC3D;AACA;AACA;AACA;AACA;AACA,2CAA2C,SAAS;AACpD;AACA;AACA,2CAA2C,SAAS;AACpD;AACA,oDAAoD,SAAS;AAC7D,uCAAuC,SAAS,cAAc,kBAAkB,0CAAO,iBAAiB;AACxG,wBAAwB,cAAc;AACtC,YAAY,qDAAiB,oCAAoC,0CAA0C;AAC3G;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACxDA;AACA;AACkC;AACI;AACtC;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,yDAAoB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,2CAA2C,aAAa;AAC1F;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,wDAAwD,yBAAyB,GAAG,UAAU;AAChI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,qDAAqD,QAAQ;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,yDAAoB,QAAQ,GAAG,OAAO;AACxD;AACA;;;;;;;;;;;;;;;;;;;;;;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,4BAA4B;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACoC;AACI;AACR;AACF;AACI;AACK;AACQ;AACxC;AACP;AACA;AACA;AACA,CAAC,wCAAwC;AAClC,qBAAqB,6CAAO;AACnC,mCAAmC;AACnC;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,4DAAuB;AAC5C;AACA;AACA;AACA;AACA,QAAQ,mEAA2B;AACnC;AACA;AACA;AACA;AACA,eAAe,uDAAe;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,4DAAuB;AACtC;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,SAAS;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,yCAAK;AACnD;AACA;AACA;AACA;AACA;AACA,0CAA0C,yCAAK;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,uBAAuB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,0CAAO;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,4BAA4B,uBAAuB;AACnD;AACA,0EAA0E,0CAAO;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,8CAAO;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,4DAAuB;AAC9C;AACA;AACA;AACA,wBAAwB,8CAAO;AAC/B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,8CAAO;AACnC,aAAa;AACb;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACP;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4BAA4B;;;;;;;;;;;;;;;;;;;;;;ACtH7B;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,qBAAM;AACrB,eAAe,qBAAM;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,MAAM,6BAA6B,MAAM;AACjF;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,iBAAiB,KAAK;AACtB;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;AChFA;AACA;AACA;AAC8B;AACa;AACpC;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,gBAAgB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,uCAAI;;;;;;;;;;;;;;;;;;;ACpEf;AACA;AAC8B;AACQ;AACJ;AACK;AACvC;AACO,sBAAsB,+CAAQ;AACrC;AACA;AACA,wBAAwB,8DAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,wDAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,gDAAa;AACtD;AACA,yGAAyG,+DAA0B;AACnI;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,8DAAuB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,4DAA4D;AAC5E;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AClHA;AACA;AACA;AACoC;AACG;AACV;AACO;AACpC;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA;AACO,6BAA6B,6CAAO;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,+DAAuB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,2DAAqB;AAC7B;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;ACpEA;AACA;AACoC;AACE;AACJ;AACK;AACQ;AACxC;AACP;AACA;AACA;AACA;AACA,CAAC,8BAA8B;AAC/B;AACA;AACA;AACO,oBAAoB,6CAAO;AAClC;AACA;AACA;AACA;AACA;AACA,6BAA6B,+CAAQ;AACrC;AACA;AACA,uCAAuC,oBAAoB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yCAAyC,sDAAiB,EAAE;AAChG;AACA,8BAA8B,+CAAQ;AACtC;AACA;AACA;AACA,eAAe,sDAAc;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,2BAA2B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA,0BAA0B,+CAAY;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,eAAe,8CAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA,YAAY,8CAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACvPA;AACA;AACA;AACA;AACA;AACA;AACsC;AACtC;AACO;AACP;AACA;AACA,mBAAmB,mDAAY;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,mBAAmB,mDAAY;AAC/B;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC7BA;AACA;AACA;AACA;AACsD;AACP;AACZ;AACF;AACE;AACU;AACY;AACtB;AACE;AACQ;AACV;AACc;AACA;AACD;AACX;AACrC;AACA;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,kDAAkD,6DAAY;AAC9D;AACA;AACA;AACA,0CAA0C,MAAM;AAChD;AACA;AACA;AACA;AACA;AACA,gDAAgD,qDAAS;AACzD;AACA,UAAU,+BAA+B;AACzC,UAAU,+BAA+B;AACzC,UAAU,+BAA+B;AACzC,UAAU,8BAA8B;AACxC,UAAU,8BAA8B;AACxC,UAAU,8BAA8B;AACxC,UAAU,+BAA+B;AACzC,UAAU,+BAA+B;AACzC;AACA,oBAAoB,8CAAK,WAAW,wDAAe;AACnD;AACA,IAAI,wEAA2B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,+BAA+B;AACzC,UAAU,+BAA+B;AACzC,UAAU,+BAA+B;AACzC,UAAU,+BAA+B;AACzC,UAAU,+BAA+B;AACzC,UAAU,+BAA+B;AACzC,UAAU,+BAA+B;AACzC,UAAU,+BAA+B;AACzC;AACA,gBAAgB,8CAAK,WAAW,wDAAe;AAC/C;AACA,IAAI,wEAA2B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,8BAA8B;AACxC,UAAU,+BAA+B;AACzC,UAAU,+BAA+B;AACzC,UAAU,+BAA+B;AACzC,UAAU,+BAA+B;AACzC,UAAU,gCAAgC;AAC1C,UAAU,gCAAgC;AAC1C,UAAU,gCAAgC;AAC1C,UAAU,gCAAgC;AAC1C,UAAU,8BAA8B;AACxC,UAAU,8BAA8B;AACxC;AACA,gBAAgB,8CAAK,WAAW,wDAAe;AAC/C;AACA,IAAI,wEAA2B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA,YAAY,qDAAS;AACrB;AACA;AACA,SAAS,kBAAkB,uDAAU;AACrC,YAAY,qDAAS;AACrB;AACA;AACA,SAAS,kBAAkB,uDAAU;AACrC,YAAY,qDAAS;AACrB;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA,SAAS;AACT,6BAA6B,uDAAU;AACvC,6BAA6B,uDAAU;AACvC,YAAY,qDAAS;AACrB;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA,SAAS;AACT,6BAA6B,uDAAU;AACvC,6BAA6B,uDAAU;AACvC,YAAY,qDAAS;AACrB;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA,SAAS;AACT;AACA,IAAI,wDAAkB,eAAe,WAAW;AAChD,kBAAkB,yDAAkB;AACpC,sBAAsB,8CAAK;AAC3B;AACA;AACA,KAAK;AACL;AACA,0BAA0B,qDAAS,GAAG,eAAe;AACrD;AACA,sBAAsB,6CAAK;AAC3B;AACA;AACA;AACA;AACA,4BAA4B,uDAAgB;AAC5C,IAAI,sFAAmC;AACvC;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA,cAAc,0BAA0B;AACxC;AACA;AACA,yBAAyB,4CAA4C;AACrE;AACA;AACA;AACA,yBAAyB,wEAAwE;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,yEAAyE;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,iEAAiE;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,kEAAsB,cAAc,oBAAoB;AAC5D;AACA,QAAQ,uDAAgB;AACxB;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA,IAAI,sFAAmC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA,+BAA+B,yDAAkB,gCAAgC,iBAAiB;AAClG;AACA,gBAAgB,gBAAgB;AAChC,gCAAgC,kDAAkD;AAClF;AACA;AACA,oBAAoB,+CAA+C;AACnE;AACA;AACA;AACA,yBAAyB,8CAA8C,+CAAO,EAAE;AAChF,wCAAwC,iBAAiB;AACzD,2CAA2C,4BAA4B;AACvE;AACA;AACA;AACA,wEAAwE,gEAAmB;AAC3F;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA,cAAc,0BAA0B;AACxC;AACA;AACA,yBAAyB,qCAAqC;AAC9D;AACA;AACA;AACA,yBAAyB,qCAAqC;AAC9D;AACA;AACA;AACA,yBAAyB,6CAA6C;AACtE;AACA;AACA;AACA;AACA,yBAAyB,oDAAoD;AAC7E;AACA;AACA;AACA;AACA,yBAAyB,mDAAmD;AAC5E;AACA;AACA;AACA;AACA;AACA,yBAAyB,0DAA0D;AACnF;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,kEAAsB,aAAa,oBAAoB;AAC3D;AACA,QAAQ,uDAAgB;AACxB;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA,IAAI,sFAAmC;AACvC;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA,cAAc,0BAA0B;AACxC;AACA;AACA,yBAAyB,gEAAgE;AACzF;AACA;AACA;AACA,yBAAyB,4FAA4F;AACrH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6FAA6F;AACtH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,kEAAsB,aAAa,oBAAoB;AAC3D;AACA,QAAQ,uDAAgB;AACxB;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA,IAAI,sFAAmC;AACvC;AACA;AACA;AACA;AACA;AACA,oCAAoC,iEAAe;AACnD;AACA;AACA,YAAY,0DAAW;AACvB;AACA;AACA,QAAQ,uDAAgB;AACxB,QAAQ,uDAAgB;AACxB;AACA,cAAc,2EAAwB;AACtC;AACA,4BAA4B,0BAA0B;AACtD;AACA;AACA;AACA,qBAAqB,gEAAgE;AACrF;AACA;AACA;AACA;AACA;AACA,qBAAqB,+DAA+D;AACpF;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,gEAAgE;AACrF;AACA;AACA;AACA;AACA;AACA,qBAAqB,+DAA+D;AACpF;AACA;AACA;AACA;AACA,qBAAqB,gEAAgE;AACrF;AACA;AACA;AACA;AACA;AACA,qBAAqB,+DAA+D;AACpF;AACA;AACA;AACA,IAAI,sFAAmC;AACvC;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,cAAc,0BAA0B;AACxC;AACA;AACA,yBAAyB,4CAA4C;AACrE;AACA;AACA;AACA,yBAAyB,wEAAwE;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,yEAAyE;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,iEAAiE;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,kEAAkE;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,kEAAsB,aAAa,oBAAoB;AAC3D;AACA,QAAQ,uDAAgB;AACxB;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA,IAAI,sFAAmC;AACvC;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,cAAc,0BAA0B;AACxC;AACA;AACA,yBAAyB,4CAA4C;AACrE;AACA;AACA;AACA,yBAAyB,wEAAwE;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,yEAAyE;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,iEAAiE;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,oDAAoD;AAC7E;AACA;AACA;AACA;AACA;AACA,IAAI,kEAAsB,aAAa,oBAAoB;AAC3D;AACA,QAAQ,uDAAgB;AACxB;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA,IAAI,sFAAmC;AACvC;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,cAAc,0BAA0B;AACxC;AACA;AACA,yBAAyB,mDAAmD;AAC5E;AACA;AACA;AACA;AACA;AACA,yBAAyB,mDAAmD;AAC5E;AACA,sBAAsB,mDAAmD;AACzE;AACA,yBAAyB,mDAAmD;AAC5E;AACA;AACA;AACA;AACA,yBAAyB,mDAAmD;AAC5E;AACA;AACA;AACA;AACA,yBAAyB,mDAAmD;AAC5E;AACA,sBAAsB,mDAAmD;AACzE;AACA,yBAAyB,mDAAmD;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,iDAAS;AAChC,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,iDAAS;AAChC,SAAS;AACT,KAAK;AACL,aAAa,0BAA0B;AACvC,aAAa,0BAA0B;AACvC,IAAI,kEAAsB;AAC1B;AACA,QAAQ,uDAAgB;AACxB;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA,IAAI,sFAAmC;AACvC;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,UAAU,qCAAqC;AAC/C,UAAU,uCAAuC;AACjD,UAAU,uCAAuC;AACjD,UAAU,yCAAyC;AACnD,UAAU,yCAAyC;AACnD,UAAU,qCAAqC;AAC/C,UAAU,uCAAuC;AACjD,UAAU,yCAAyC;AACnD,UAAU,yCAAyC;AACnD,UAAU,uCAAuC;AACjD,UAAU,uCAAuC;AACjD,UAAU,qCAAqC;AAC/C;AACA,0BAA0B,6CAA6C;AACvE,4CAA4C,mBAAmB;AAC/D;AACA;AACA,iBAAiB,wDAAe;AAChC,yBAAyB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AACA;AACA;AACA;AACA;AACA,yBAAyB,iEAAiE;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,kEAAsB;AAC1B;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA,wEAAqB;AACM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACh+B3B;AACA;AACA;AACA;AACA;AACA;AACA;AACsD;AACoB;AACvB;AAChB;AACA;AACA;AACuB;AACb;AACM;AACR;AACN;AACQ;AACV;AACM;AACE;AACF;AACJ;AACrC;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,kBAAkB,yEAAsB;AACxC;AACA,oCAAoC,kDAAO;AAC3C,sCAAsC,sDAAS;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mDAAQ;AACjC,IAAI,yEAA8B;AAClC,cAAc,2EAAwB;AACtC;AACA,oBAAoB,OAAO;AAC3B;AACA,oBAAoB,aAAa;AACjC,kCAAkC,UAAU;AAC5C;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,oDAAoD,MAAM;AAC1D,yCAAyC,iEAAsB;AAC/D;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,oDAAQ;AAC9B;AACA;AACA;AACA,kBAAkB,kBAAkB;AACpC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS,kBAAkB,uDAAU;AACrC;AACA,0BAA0B,kBAAkB;AAC5C;AACA,SAAS,kBAAkB,2CAAI;AAC/B;AACA,IAAI,mEAAuB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,8CAAK;AAC3B,qCAAqC,uDAAU,eAAe,iDAAU;AACxE;AACA,oBAAoB,qCAAqC;AACzD,oBAAoB,4CAA4C;AAChE;AACA,IAAI,mEAAuB;AAC3B;AAC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AC1C,8BAA8B,2DAAY;AAC1C,8BAA8B,2DAAY;AAC1C,8BAA8B,2DAAY;AAC1C,sBAAsB,8CAAK,CAAC,mDAAY,UAAU,wDAAe;AACjE;AACA;AACA;AACA,QAAQ,qDAAS;AACjB;AACA;AACA;AACA,wEAAqB;AACQ;;;;;;;;;;;;;;;;;;;AChZ7B;AACA;AACA;AACA;AACA;AACA;AAC8D;AAC3B;AACQ;AACR;AACnC;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,yGAAyG,aAAa;AACtH;AACA,kBAAkB,4DAAqB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,kBAAkB,4DAAqB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA,kBAAkB,4DAAqB;AACvC;AACA;AACA;AACA,uCAAuC,8CAAO;AAC9C,uCAAuC,8CAAO;AAC9C,uCAAuC,8CAAO;AAC9C,uCAAuC,8CAAO;AAC9C,uCAAuC,gDAAS;AAChD,uCAAuC,gDAAS;AAChD;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA,KAAK;AACL,wBAAwB,mDAAQ;AAChC,kBAAkB,4DAAqB;AACvC,uCAAuC,gDAAS;AAChD,uCAAuC,gDAAS;AAChD,uCAAuC,8CAAO;AAC9C,uCAAuC,gDAAS;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,sGAAsG,aAAa;AACnH,wBAAwB,mDAAQ,YAAY,mDAAQ,YAAY,mDAAQ;AACxE;AACA,kBAAkB,4DAAqB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,iFAAiF,aAAa;AAC9F,kBAAkB,4DAAqB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,yIAAyI,aAAa;AACtJ,kBAAkB,4DAAqB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,yIAAyI,aAAa;AACtJ,kBAAkB,yDAAkB;AACpC;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,yIAAyI,aAAa;AACtJ,kBAAkB,yDAAkB;AACpC;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,yIAAyI,aAAa;AACtJ,kBAAkB,yDAAkB;AACpC;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,yIAAyI,aAAa;AACtJ,kBAAkB,yDAAkB;AACpC;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,YAAY,KAAK,aAAa;AAClD,kBAAkB,yDAAkB;AACpC;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,YAAY,KAAK,aAAa;AAClD,kBAAkB,yDAAkB;AACpC;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,2EAA2E,aAAa;AACxF,kBAAkB,yDAAkB;AACpC,qBAAqB,mDAAQ;AAC7B;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,uEAAuE,aAAa;AACpF,kBAAkB,yDAAkB;AACpC,qBAAqB,mDAAQ;AAC7B;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA,6BAA6B,OAAO;AACpC,0FAA0F,aAAa;AACvG,6BAA6B,QAAQ;AACrC,sEAAsE,aAAa;AACnF,6BAA6B,QAAQ;AACrC;AACA;AACA,KAAK;AACL;AACA;AACA,WAAW,4DAAqB,oBAAoB,gEAAyB;AAC7E,WAAW,4DAAqB,oBAAoB,gEAAyB;AAC7E,WAAW,4DAAqB,oBAAoB,gEAAyB;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA,6BAA6B,OAAO;AACpC,0FAA0F,aAAa;AACvG,6BAA6B,QAAQ;AACrC,sEAAsE,aAAa;AACnF,6BAA6B,QAAQ;AACrC,uGAAuG,eAAe;AACtH,wBAAwB,mDAAQ;AAChC,wBAAwB,mDAAQ,YAAY,mDAAQ;AACpD,wBAAwB,mDAAQ,aAAa,mDAAQ,aAAa,mDAAQ;AAC1E;AACA;AACA;AACA,WAAW,4DAAqB;AAChC,WAAW,4DAAqB;AAChC,WAAW,4DAAqB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,YAAY,gBAAgB;AAC5B;AACA;AACA;AACA,yDAAyD,mCAAmC;AAC5F,SAAS,aAAa;AACtB,kBAAkB,4DAAqB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,YAAY,gBAAgB;AAC5B,wGAAwG,aAAa;AACrH,kBAAkB,4DAAqB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,wGAAwG,aAAa;AACrH,kBAAkB,4DAAqB,mBAAmB,gEAAyB;AACnF;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,iFAAiF,aAAa;AAC9F,kBAAkB,4DAAqB,wBAAwB,mDAAQ,YAAY,mDAAQ,YAAY,mDAAQ;AAC/G;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,8EAA8E,aAAa;AAC3F,kBAAkB,4DAAqB,wBAAwB,mDAAQ,YAAY,mDAAQ,YAAY,mDAAQ;AAC/G;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA,KAAK;AACL,kBAAkB,4DAAqB,wBAAwB,mDAAQ,YAAY,mDAAQ,YAAY,mDAAQ;AAC/G;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,+FAA+F,aAAa;AAC5G,kBAAkB,4DAAqB,wBAAwB,mDAAQ,YAAY,mDAAQ,YAAY,mDAAQ;AAC/G;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,yDAAkB,yBAAyB,uBAAuB;AACpF;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,YAAY,gBAAgB;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,yDAAM;AACnB,kBAAkB,yDAAkB,yBAAyB,uBAAuB;AACpF;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC,4BAA4B,OAAO;AACnC;AACA,YAAY,gBAAgB;AAC5B;AACA;AACA;AACA;AACA;AACA,aAAa,yDAAM;AACnB,kBAAkB,yDAAkB;AACpC;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC,4BAA4B,OAAO;AACnC;AACA;AACA,kBAAkB,yDAAkB;AACpC;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC,4BAA4B,OAAO;AACnC;AACA;AACA,kBAAkB,yDAAkB,yBAAyB,kBAAkB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC,4BAA4B,OAAO;AACnC;AACA,YAAY,gBAAgB;AAC5B;AACA;AACA;AACA;AACA,kBAAkB,yDAAkB;AACpC;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC,4BAA4B,OAAO;AACnC;AACA;AACA,kBAAkB,yDAAkB;AACpC;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC,4BAA4B,OAAO;AACnC;AACA,YAAY,gBAAgB;AAC5B;AACA;AACA;AACA;AACA,kBAAkB,yDAAkB;AACpC;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,cAAc;AACjC,kBAAkB,yDAAkB;AACpC;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,wEAAqB;AACc;;;;;;;;;;;;;;;;;ACtjBnC;AACA;AACA;AACA;AAC8D;AACT;AACrD;AACA;AACA;AACA,QAAQ,wEAAqB;AAC7B,KAAK;AACL;AACA;AACA,yBAAyB,gDAAQ;AACjC,IAAI,sEAA8B;AAClC;AACA;AACA,cAAc,2EAAwB;AACtC,gCAAgC,oBAAoB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,qCAAqC;AACvE;AACA;AACA;AACA,gBAAgB,aAAa;AAC7B;AACA;AACA;AACA;AACA;AACA,6EAA6E,YAAY,WAAW,yDAAM;AAC1G,oCAAoC,4CAA4C;AAChF;AACA,KAAK;AACL;AACA;AACA;AACA,oBAAoB,qDAAqD;AACzE;AACA,oBAAoB,6CAA6C,cAAc,KAAK;AACpF;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,aAAa;AACrD;AACA;AACA,sBAAsB,sEAAsE;AAC5F,sBAAsB,gCAAgC,cAAc,KAAK;AACzE;AACA,2CAA2C,+BAA+B;AAC1E,2CAA2C,+BAA+B;AAC1E,2CAA2C,+BAA+B;AAC1E;AACA;AACA;AACA;AACA;AACA,kBAAkB,aAAa;AAC/B,kBAAkB,aAAa;AAC/B;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA,kFAAkF,cAAc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EAAgE;AACtF,oBAAoB,gBAAgB;AACpC;AACA,yBAAyB,gEAAgE;AACzF,wCAAwC,WAAW;AACnD,wCAAwC,WAAW;AACnD;AACA,wBAAwB,6EAA6E;AACrG;AACA;AACA;AACA;AACA;AACA,wEAAqB;AACG;;;;;;;;;;;;;;;;;ACzDxB;AACA;AACA;AACA;AACA;AAC8D;AACiD;AAC/G;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E,YAAY;AAC3F,aAAa,yDAAM,KAAK,aAAa;AACrC;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,YAAY,mCAAmC,YAAY,WAAW,yDAAM;AAC5H,gDAAgD,cAAc,qCAAqC,cAAc,WAAW,yDAAM;AAClI;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,YAAY;AAC1D,8CAA8C,YAAY;AAC1D,4BAA4B,YAAY;AACxC,iBAAiB,yDAAM;AACvB;AACA,uDAAuD,cAAc;AACrE,uDAAuD,cAAc;AACrE,4BAA4B,cAAc;AAC1C,iBAAiB,yDAAM;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,wEAAwE,YAAY,KAAK,6BAA6B;AACtH,sDAAsD,YAAY,KAAK,0BAA0B;AACjG,iBAAiB,yDAAM,KAAK,aAAa;AACzC;AACA,8EAA8E,cAAc;AAC5F;AACA,aAAa;AACb,sDAAsD,cAAc,KAAK,0BAA0B;AACnG,iBAAiB,yDAAM,KAAK,aAAa;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC,4BAA4B,OAAO;AACnC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;AACA;AACA,kBAAkB,kBAAkB;AACpC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA,SAAS;AACT;AACA,IAAI,mEAAuB;AAC3B,4BAA4B,uDAAgB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,yEAAsB;AAC/C,sBAAsB,mDAAQ;AAC9B;AACA;AACA;AACA,kBAAkB,kBAAkB;AACpC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA,SAAS;AACT;AACA,0BAA0B,iBAAiB;AAC3C;AACA,SAAS;AACT;AACA,IAAI,mEAAuB;AAC3B,4BAA4B,uDAAgB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,mDAAQ;AAC9B;AACA;AACA;AACA,kBAAkB,kBAAkB;AACpC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA,SAAS;AACT;AACA,oBAAoB,kBAAkB;AACtC;AACA,uBAAuB,iEAAe;AACtC;AACA,gCAAgC,yDAAW;AAC3C;AACA;AACA;AACA;AACA;AACA,QAAQ,uDAAgB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,gDAAS,WAAW,sDAAe,EAAE;AACpD,sBAAsB,mDAAQ;AAC9B;AACA,UAAU,MAAM,8CAAO,gBAAgB;AACvC,UAAU,MAAM,gDAAS,qBAAqB;AAC9C,UAAU,MAAM,8CAAO,eAAe;AACtC,UAAU,MAAM,gDAAS,YAAY;AACrC;AACA;AACA;AACA;AACA,0BAA0B,kBAAkB;AAC5C;AACA,SAAS;AACT;AACA,oBAAoB,kBAAkB;AACtC;AACA,sCAAsC,iEAAe;AACrD,gCAAgC,yDAAW;AAC3C;AACA;AACA;AACA;AACA;AACA,QAAQ,uDAAgB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,yEAAsB;AAC/C,sBAAsB,mDAAQ;AAC9B;AACA,UAAU,MAAM,8CAAO,gBAAgB;AACvC,UAAU,MAAM,gDAAS,YAAY;AACrC,UAAU,MAAM,8CAAO,eAAe;AACtC,UAAU,MAAM,gDAAS,YAAY;AACrC;AACA;AACA,UAAU,MAAM,8CAAO,gBAAgB;AACvC,UAAU,MAAM,8CAAO,gBAAgB;AACvC,UAAU,MAAM,8CAAO,eAAe;AACtC,UAAU,MAAM,gDAAS,YAAY;AACrC,UAAU,MAAM,gDAAS,gBAAgB;AACzC,UAAU,MAAM,gDAAS,gBAAgB;AACzC,UAAU,MAAM,8CAAO,eAAe;AACtC,UAAU,MAAM,gDAAS,YAAY;AACrC;AACA;AACA;AACA;AACA,kBAAkB,kBAAkB;AACpC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,IAAI,mEAAuB;AAC3B,IAAI,uDAAgB;AACpB;AACA;AACA,wEAAqB;AACA;;;;;;;;;;;;;;;;;ACrOrB;AACA;AACA;AACA;AACsD;AACX;AAC3C;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,mBAAmB,mDAAW;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,mDAAW;AAChC,qBAAqB,mDAAW;AAChC,wBAAwB,mDAAW;AACnC,SAAS;AACT;AACA;AACA,qBAAqB,mDAAW;AAChC,qBAAqB,mDAAW;AAChC,wBAAwB,mDAAW;AACnC,SAAS;AACT;AACA;AACA,qBAAqB,mDAAW;AAChC,qBAAqB,mDAAW;AAChC,wBAAwB,mDAAW;AACnC,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,wEAAqB;AACO;;;;;;;;;;;;;;;;;ACxD5B;AACA;AACA;AACA;AACsD;AACoB;AAC1E;AACA;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA,kCAAkC,MAAM;AACxC,SAAS;AACT;AACA,8BAA8B,MAAM;AACpC,SAAS;AACT,KAAK;AACL;AACA;AACA,yBAAyB,8DAAsB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,8DAAsB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,wDAAgB,WAAW,6DAAqB;AAC/D,iBAAiB,mEAA2B;AAC5C;AACA;AACA;AACA;AACA,IAAI,2DAAmB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,iBAAiB;AAC/E,8DAA8D,iBAAiB;AAC/E,iEAAiE,iBAAiB;AAClF,mEAAmE,kBAAkB;AACrF,wDAAwD,YAAY;AACpE,wDAAwD,YAAY;AACpE,wDAAwD,YAAY;AACpE,wDAAwD,YAAY;AACpE;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,8DAAsB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,wDAAgB,WAAW,0DAAkB;AAC5D,iBAAiB,mEAA2B;AAC5C;AACA;AACA;AACA;AACA,IAAI,2DAAmB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,iBAAiB;AAC/E,8DAA8D,iBAAiB;AAC/E,iEAAiE,iBAAiB;AAClF,mEAAmE,kBAAkB;AACrF,wDAAwD,YAAY;AACpE,wDAAwD,YAAY;AACpE,wDAAwD,YAAY;AACpE,wDAAwD,YAAY;AACpE;AACA,wEAAqB;AACkB;;;;;;;;;;;;;;;;;;;;;ACrNvC;AACA;AACA;AACA;AACsD;AACP;AACE;AACJ;AACR;AACQ;AAC7C;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,sBAAsB,gBAAgB,qFAAuC;AAC7E,oBAAoB,gBAAgB,mFAAqC;AACzE;AACA,2EAA2E,gBAAgB;AAC3F;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA;AACA,gCAAgC,sBAAsB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,aAAa;AACxD;AACA;AACA;AACA;AACA;AACA,uBAAuB,cAAc;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,cAAc;AACrC;AACA;AACA;AACA;AACA;AACA,uBAAuB,cAAc;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,cAAc;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,cAAc;AACrC;AACA;AACA;AACA;AACA,gCAAgC,cAAc;AAC9C,gCAAgC,cAAc;AAC9C;AACA,uBAAuB,cAAc;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,cAAc;AACtC,wBAAwB,cAAc;AACtC,wBAAwB,cAAc;AACtC,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA;AACA,gCAAgC,sBAAsB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,aAAa;AACxD;AACA;AACA;AACA;AACA;AACA,wBAAwB,oCAAoC;AAC5D,wBAAwB,sCAAsC;AAC9D,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA;AACA,gCAAgC,sBAAsB;AACtD;AACA,oEAAoE,uDAAU;AAC9E;AACA;AACA;AACA,2CAA2C,aAAa;AACxD;AACA;AACA;AACA;AACA,uBAAuB,oBAAoB;AAC3C;AACA;AACA;AACA;AACA,uBAAuB,oBAAoB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA;AACA,0BAA0B,6CAAK;AAC/B;AACA,wEAAwE,uDAAU;AAClF;AACA;AACA,QAAQ,mEAAuB;AAC/B;AACA;AACA,iCAAiC,kBAAkB;AACnD;AACA;AACA,uBAAuB,oBAAoB;AAC3C;AACA;AACA;AACA,6BAA6B,oBAAoB;AACjD;AACA;AACA,uBAAuB,mBAAmB;AAC1C;AACA;AACA;AACA;AACA,6BAA6B,mBAAmB;AAChD;AACA;AACA,uBAAuB,kBAAkB;AACzC;AACA;AACA;AACA;AACA,6BAA6B,wBAAwB;AACrD;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA;AACA,0BAA0B,6CAAK;AAC/B;AACA;AACA,2EAA2E,uDAAU;AACrF;AACA,2EAA2E,uDAAU;AACrF;AACA,QAAQ,mEAAuB;AAC/B;AACA;AACA,wBAAwB,oBAAoB;AAC5C,wBAAwB,oBAAoB;AAC5C,wBAAwB,oBAAoB;AAC5C,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,qDAAS,GAAG,oCAAoC;AAC1G,0BAA0B,6CAAK;AAC/B;AACA;AACA,wEAAwE,uDAAU;AAClF;AACA,wEAAwE,uDAAU;AAClF;AACA,QAAQ,mEAAuB;AAC/B;AACA;AACA,wBAAwB,oBAAoB;AAC5C,wBAAwB,oBAAoB;AAC5C,wBAAwB,oBAAoB;AAC5C,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE,qDAAS,GAAG,gBAAgB;AACrG,0BAA0B,6CAAK;AAC/B;AACA;AACA,oFAAoF,uDAAU;AAC9F;AACA,oFAAoF,uDAAU;AAC9F;AACA,QAAQ,mEAAuB;AAC/B;AACA;AACA,wBAAwB,oBAAoB;AAC5C,wBAAwB,oBAAoB;AAC5C,wBAAwB,oBAAoB;AAC5C,wBAAwB,oBAAoB;AAC5C;AACA;AACA,wBAAwB,oBAAoB;AAC5C,wBAAwB,oBAAoB;AAC5C,wBAAwB,oBAAoB;AAC5C,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA,wEAAqB;AACO;;;;;;;;;;;;;;;;ACvU5B;AACA;AACA;AACA;AACsD;AACtD;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,sBAAsB,8CAA8C;AACpE,qBAAqB,yBAAyB,iBAAiB;AAC/D,sBAAsB,4CAA4C;AAClE,qBAAqB,0BAA0B,iBAAiB;AAChE,sBAAsB,6CAA6C;AACnE,qBAAqB,4BAA4B,iBAAiB;AAClE,sBAAsB,+CAA+C;AACrE,qBAAqB,yBAAyB,iBAAiB;AAC/D,sBAAsB,4CAA4C;AAClE,qBAAqB,kCAAkC,iBAAiB;AACxE,sBAAsB,qDAAqD;AAC3E,qBAAqB,+BAA+B,iBAAiB;AACrE,sBAAsB,kDAAkD;AACxE,qBAAqB,+BAA+B,iBAAiB;AACrE,sBAAsB,kDAAkD;AACxE,qBAAqB,4BAA4B,iBAAiB;AAClE,sBAAsB,+CAA+C;AACrE,qBAAqB,2BAA2B,iBAAiB;AACjE,sBAAsB,8CAA8C;AACpE,qBAAqB,2BAA2B,oCAAoC;AACpF,sBAAsB,gEAAgE;AACtF,qBAAqB,2BAA2B,oCAAoC;AACpF,sBAAsB,+DAA+D;AACrF;AACA,4BAA4B,cAAc;AAC1C;AACA;AACA;AACA;AACA,wEAAqB;AACA;;;;;;;;;;;;;;;;;ACtIrB;AACA;AACA;AACA;AAC8D;AACjB;AAC7C;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2EAAwB;AAChD,sCAAsC,OAAO;AAC7C;AACA;AACA;AACA;AACA;AACA,iBAAiB,yDAAM;AACvB;AACA,kDAAkD,aAAa;AAC/D;AACA;AACA;AACA;AACA;AACA,iDAAiD,YAAY;AAC7D,uBAAuB,cAAc;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,aAAa;AAC/B,kBAAkB,aAAa;AAC/B;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,kBAAkB,aAAa;AAC/B,kBAAkB,aAAa;AAC/B;AACA,SAAS;AACT,KAAK;AACL,CAAC;AACD,kDAAkD,YAAY;AAC9D,uBAAuB,cAAc;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,aAAa;AAC/B,kBAAkB,aAAa;AAC/B;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,kBAAkB,aAAa;AAC/B,kBAAkB,aAAa;AAC/B;AACA,SAAS;AACT,KAAK;AACL,CAAC;AACD,oDAAoD,YAAY;AAChE,uBAAuB,cAAc;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,aAAa;AAC/B,kBAAkB,aAAa;AAC/B;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,aAAa;AAC/B,kBAAkB,aAAa;AAC/B;AACA,SAAS;AACT,KAAK;AACL,CAAC;AACD,8CAA8C,YAAY;AAC1D,uBAAuB,cAAc;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,8DAAsB;AAC5C,0BAA0B,+DAAuB;AACjD;AACA,kBAAkB,aAAa;AAC/B,kBAAkB,cAAc;AAChC;AACA,SAAS;AACT,KAAK;AACL,CAAC;AACD,wEAAqB;AACC;;;;;;;;;;;;;;;;;;;;;;;;;ACvItB;AACA;AACA;AACA;AACsD;AACnB;AACF;AACY;AACY;AACtB;AACE;AACQ;AACI;AACZ;AACrC;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,gCAAgC,iEAAe;AAC/C;AACA,QAAQ,yDAAW;AACnB;AACA,IAAI,uDAAgB;AACpB;AACA;AACA;AACA;AACA;AACA,sBAAsB,6CAAK;AAC3B;AACA;AACA;AACA,YAAY,qDAAS,GAAG,mDAAmD;AAC3E,YAAY,qDAAS,GAAG,+DAA+D;AACvF,YAAY,qDAAS,GAAG,gEAAgE;AACxF,YAAY,qDAAS,GAAG,mDAAmD;AAC3E,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS,GAAG,uEAAuE;AAC/F,YAAY,qDAAS,GAAG,sEAAsE;AAC9F,YAAY,qDAAS,GAAG,wEAAwE;AAChG,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS,GAAG,4FAA4F;AACpH,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS,GAAG,uEAAuE;AAC/F;AACA,IAAI,wDAAkB,UAAU,WAAW;AAC3C,IAAI,wDAAkB,mCAAmC,WAAW;AACpE,IAAI,wDAAkB,yBAAyB,WAAW;AAC1D,qBAAqB,2CAAI;AACzB,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA,IAAI,sFAAmC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,6CAAK;AAC3B;AACA,YAAY,qDAAS,GAAG,gEAAgE;AACxF,YAAY,qDAAS,GAAG,gEAAgE;AACxF,YAAY,qDAAS,GAAG,gEAAgE;AACxF,YAAY,qDAAS,GAAG,gEAAgE;AACxF,YAAY,qDAAS,GAAG,gEAAgE;AACxF;AACA,IAAI,wDAAkB,iDAAiD,WAAW;AAClF,IAAI,wDAAkB,iDAAiD,WAAW;AAClF,IAAI,wDAAkB,gBAAgB,UAAU;AAChD,IAAI,wDAAkB,gBAAgB,UAAU;AAChD,IAAI,wDAAkB,gBAAgB,UAAU;AAChD,IAAI,wDAAkB,gBAAgB,UAAU;AAChD,IAAI,wDAAkB,gBAAgB,UAAU;AAChD,IAAI,wDAAkB,gBAAgB,UAAU;AAChD,IAAI,wDAAkB,gBAAgB,UAAU;AAChD,IAAI,wDAAkB;AACtB;AACA,YAAY,qDAAS,GAAG,+DAA+D;AACvF,YAAY,qDAAS,GAAG,+DAA+D;AACvF,YAAY,qDAAS,GAAG,+DAA+D;AACvF,YAAY,qDAAS,GAAG,sEAAsE;AAC9F,YAAY,qDAAS,GAAG,+DAA+D;AACvF;AACA,IAAI,wDAAkB,WAAW,WAAW;AAC5C,IAAI,wDAAkB,gBAAgB,WAAW;AACjD,uBAAuB,6CAAK,WAAW,uDAAe;AACtD,uBAAuB,6CAAK,WAAW,uDAAe;AACtD,0BAA0B,qDAAS;AACnC;AACA;AACA;AACA,6BAA6B,uDAAgB;AAC7C,6BAA6B,uDAAgB;AAC7C,IAAI,sFAAmC;AACvC;AACA;AACA,wEAAqB;AACD;;;;;;;;;;;;;;;;;;;;;;;;ACjIpB;AACA;AACA;AACA;AACsD;AACH;AACN;AACU;AACZ;AACM;AACM;AACpB;AACI;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,qDAAS;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,qDAAS;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,qDAAS;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,qDAAS;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,qDAAS;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,qDAAS;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,qDAAS;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,YAAY,eAAe;AAC3B;AACA;AACA;AACA,8DAA8D,cAAc;AAC5E,0CAA0C,YAAY;AACtD;AACA,KAAK;AACL;AACA;AACA;AACA,8DAA8D,cAAc;AAC5E,KAAK;AACL;AACA,kCAAkC,4EAA2B;AAC7D;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,YAAY,eAAe;AAC3B;AACA;AACA;AACA,oEAAoE,cAAc;AAClF,8CAA8C,YAAY;AAC1D;AACA,KAAK;AACL;AACA;AACA;AACA,sEAAsE,cAAc;AACpF,KAAK;AACL;AACA,kCAAkC,4EAA2B;AAC7D;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,YAAY,eAAe;AAC3B;AACA;AACA;AACA,oEAAoE,cAAc;AAClF,8CAA8C,YAAY;AAC1D;AACA,KAAK;AACL;AACA;AACA;AACA,sEAAsE,cAAc;AACpF,KAAK;AACL;AACA,kCAAkC,4EAA2B;AAC7D;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,YAAY,eAAe;AAC3B;AACA;AACA;AACA,oEAAoE,cAAc;AAClF,8CAA8C,YAAY;AAC1D;AACA,KAAK;AACL;AACA;AACA;AACA,sEAAsE,cAAc;AACpF,KAAK;AACL;AACA,kCAAkC,4EAA2B;AAC7D;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA;AACA,uDAAuD,YAAY;AACnE,iEAAiE,YAAY;AAC7E,sDAAsD,YAAY;AAClE,iBAAiB,aAAa;AAC9B,gGAAgG,cAAc;AAC9G;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA;AACA,0DAA0D,YAAY;AACtE,mEAAmE,YAAY;AAC/E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uEAA2B;AACzD;AACA;AACA;AACA;AACA;AACA,IAAI,8DAAkB;AACtB;AACA;AACA;AACA,IAAI,wDAAiB;AACrB,oBAAoB,2EAAwB;AAC5C,kCAAkC,OAAO;AACzC;AACA;AACA,4BAA4B,gEAAgE;AAC5F,4BAA4B,yDAAyD;AACrF,4BAA4B,gEAAgE;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA,wEAAqB;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC3JrB;AACA;AACA;AACA;AACsD;AACP;AAC2B;AACvB;AAChB;AACA;AACF;AACE;AACY;AACF;AACU;AACJ;AAChB;AACQ;AACN;AACkB;AACV;AACV;AACgB;AACZ;AACA;AACF;AACE;AACvC;AACA;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA;AACA;AACA;AACA,oFAAoF,sBAAsB;AAC1G,qGAAqG,qBAAqB;AAC1H,gFAAgF,qBAAqB;AACrG;AACA;AACA,0DAA0D,aAAa;AACvE;AACA;AACA;AACA;AACA;AACA,mEAAmE,4BAA4B;AAC/F,0EAA0E,4CAA4C;AACtH,uEAAuE,yCAAyC;AAChH,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,iEAAuB;AAC7C;AACA;AACA,4BAA4B,4DAAqB;AACjD;AACA;AACA;AACA,mBAAmB,iDAAY;AAC/B;AACA,sBAAsB,sDAAe;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,8CAAK,CAAC,mDAAY;AACzC,uBAAuB,8CAAK,CAAC,mDAAY;AACzC;AACA;AACA,0BAA0B,qDAAS;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA,oBAAoB,OAAO;AAC3B,4BAA4B,sDAAS,GAAG,yBAAyB;AACjE;AACA,mBAAmB,8CAAK;AACxB;AACA;AACA;AACA,gCAAgC,iBAAiB;AACjD;AACA;AACA;AACA;AACA;AACA;AAC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AkB,6CAA6C;AAC/D;AACA;AACA;AACA;AACA,YAAY,2CAAI;AAChB,YAAY,2CAAI;AAChB;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA,mDAAmD,wDAAgB;AACnE;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,0EAA8B,KAAK,oDAAQ;AAC/C,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,6BAA6B;AAChD,KAAK;AACL;AACA;AACA;AACA,oDAAoD,mBAAmB;AACvE;AACA,6DAA6D,mBAAmB;AAChF,qEAAqE,mBAAmB;AACxF;AACA,wDAAwD,aAAa;AACrE;AACA,oBAAoB,0CAA0C;AAC9D;AACA;AACA;AACA,kCAAkC,6EAA2B;AAC7D;AACA;AACA;AACA;AACA;AACA,IAAI,2EAA+B;AACnC;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,uBAAuB;AAC9C;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,sFAAsF,aAAa;AACnG;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB,gBAAgB,6DAAoB;AAC1E;AACA;AACA;AACA,mBAAmB,oBAAoB;AACvC;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA;AACA,mBAAmB,mBAAmB;AACtC,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,8CAAK;AAC/B;AACA;AACA;AACA;AACA;AACA,6BAA6B,sDAAS,GAAG,6BAA6B;AACtE;AACA,gBAAgB,wDAAkB,WAAW,WAAW;AACxD;AACA;AACA,qCAAqC,uDAAU;AAC/C,8CAA8C,8EAAiC;AAC/E,6BAA6B,iDAAU,MAAM,wDAAiB;AAC9D;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB,wDAAkB,WAAW,WAAW;AACxD;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,2CAAI;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,2BAA2B,8CAAK,GAAG,wCAAwC,UAAU,wDAAe;AACpG,wBAAwB,qDAAS,GAAG,wCAAwC;AAC5E;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,wEAAqB;AACK;;;;;;;;;;;;;;;;;ACrrB1B;AACA;AACA;AACA;AACsD;AACX;AAC3C;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,sBAAsB,mDAAQ;AAC9B;AACA,wBAAwB,mDAAQ;AAChC,wBAAwB,mDAAQ;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,uBAAuB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,wDAAa;AACvB,UAAU,wDAAa;AACvB,UAAU,wDAAa;AACvB,UAAU,wDAAa;AACvB,UAAU,wDAAa;AACvB,UAAU,wDAAa;AACvB,UAAU,wDAAa;AACvB;AACA,UAAU,uDAAY;AACtB,UAAU,uDAAY;AACtB,UAAU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AAoB;AAChE;AACA;AACA,QAAQ,qDAAS;AACjB;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC,4BAA4B,0BAA0B;AACtD;AACA,UAAU,+BAA+B;AACzC,UAAU,+BAA+B;AACzC,UAAU,+BAA+B;AACzC,UAAU,+BAA+B;AACzC;AACA,2BAA2B,4CAA4C;AACvE,2BAA2B,2CAA2C;AACtE;AACA,UAAU,8BAA8B;AACxC,UAAU,+BAA+B;AACzC,UAAU,qCAAqC;AAC/C,UAAU,+BAA+B;AACzC,UAAU,+BAA+B;AACzC;AACA;AACA,UAAU,8BAA8B;AACxC,UAAU,+BAA+B;AACzC,UAAU,+BAA+B;AACzC;AACA,8CAA8C,WAAW;AACzD,8CAA8C,WAAW;AACzD,8CAA8C,WAAW;AACzD,IAAI,wDAAkB,qBAAqB,WAAW;AACtD;AACA;AACA,yBAAyB,+CAA+C;AACxE,4CAA4C,gCAAgC;AAC5E;AACA,yBAAyB,+CAA+C;AACxE,wCAAwC,WAAW;AACnD,4CAA4C,gCAAgC;AAC5E;AACA,yBAAyB,sDAAsD;AAC/E,4CAA4C,gCAAgC;AAC5E;AACA,yBAAyB,+CAA+C;AACxE,4CAA4C,gCAAgC;AAC5E;AACA,yBAAyB,+CAA+C;AACxE,4CAA4C,gCAAgC;AAC5E,sBAAsB,+CAA+C;AACrE;AACA;AACA,QAAQ,qDAAS;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC,4BAA4B,0BAA0B;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,mBAAmB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC,4BAA4B,0BAA0B;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,iBAAiB;AACrD;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,mBAAmB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC,4BAA4B,0BAA0B;AACtD;AACA;AACA;AACA;AACA,qCAAqC,+CAA+C;AACpF;AACA;AACA;AACA,cAAc,6DAA6D;AAC3E,cAAc,6DAA6D;AAC3E,cAAc,6DAA6D;AAC3E,cAAc,6DAA6D;AAC3E,cAAc,6DAA6D;AAC3E,cAAc,6DAA6D;AAC3E,cAAc,6DAA6D;AAC3E,cAAc,6DAA6D;AAC3E,cAAc,6DAA6D;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,mBAAmB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC,4BAA4B,0BAA0B;AACtD;AACA,qCAAqC,+CAA+C;AACpF;AACA;AACA;AACA;AACA,kBAAkB,6DAA6D;AAC/E,kBAAkB,8DAA8D;AAChF,kBAAkB,6DAA6D;AAC/E,kBAAkB,8DAA8D;AAChF,kBAAkB,6DAA6D;AAC/E,kBAAkB,8DAA8D;AAChF;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,kDAAkD,sBAAsB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC,4BAA4B,0BAA0B;AACtD;AACA,UAAU,kDAAkD;AAC5D,UAAU,kDAAkD;AAC5D,UAAU,kDAAkD;AAC5D,UAAU,kDAAkD;AAC5D,UAAU,kDAAkD;AAC5D,UAAU,kDAAkD;AAC5D,UAAU,kDAAkD;AAC5D,UAAU,kDAAkD;AAC5D;AACA;AACA,UAAU,mDAAmD;AAC7D,UAAU,mDAAmD;AAC7D,UAAU,mDAAmD;AAC7D,UAAU,mDAAmD;AAC7D,UAAU,mDAAmD;AAC7D,UAAU,mDAAmD;AAC7D,UAAU,mDAAmD;AAC7D,UAAU,mDAAmD;AAC7D;AACA,2BAA2B,8DAA8D;AACzF,2BAA2B,+DAA+D;AAC1F;AACA,UAAU,mDAAmD;AAC7D,UAAU,mDAAmD;AAC7D;AACA;AACA,UAAU,kDAAkD;AAC5D,UAAU,kDAAkD;AAC5D,UAAU,iDAAiD;AAC3D;AACA;AACA,8CAA8C,WAAW;AACzD,4CAA4C,oBAAoB;AAChE,4CAA4C,oBAAoB;AAChE,6CAA6C,oBAAoB;AACjE,6CAA6C,oBAAoB;AACjE;AACA;AACA,aAAa,0BAA0B;AACvC,aAAa,0BAA0B;AACvC,aAAa,2BAA2B;AACxC,aAAa,2BAA2B;AACxC;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC,4BAA4B,0BAA0B;AACtD;AACA,UAAU,kDAAkD;AAC5D,UAAU,kDAAkD;AAC5D,UAAU,kDAAkD;AAC5D,UAAU,kDAAkD;AAC5D,UAAU,kDAAkD;AAC5D,UAAU,kDAAkD;AAC5D,UAAU,kDAAkD;AAC5D,UAAU,kDAAkD;AAC5D;AACA;AACA,UAAU,mDAAmD;AAC7D,UAAU,mDAAmD;AAC7D,UAAU,mDAAmD;AAC7D,UAAU,mDAAmD;AAC7D,UAAU,mDAAmD;AAC7D,UAAU,mDAAmD;AAC7D,UAAU,mDAAmD;AAC7D,UAAU,mDAAmD;AAC7D;AACA,2BAA2B,8DAA8D;AACzF,2BAA2B,+DAA+D;AAC1F;AACA,UAAU,mDAAmD;AAC7D,UAAU,mDAAmD;AAC7D;AACA;AACA,UAAU,kDAAkD;AAC5D,UAAU,kDAAkD;AAC5D,UAAU,iDAAiD;AAC3D;AACA;AACA,8CAA8C,WAAW;AACzD,4CAA4C,oBAAoB;AAChE,4CAA4C,oBAAoB;AAChE,6CAA6C,oBAAoB;AACjE,6CAA6C,oBAAoB;AACjE;AACA;AACA,aAAa,0BAA0B;AACvC,aAAa,0BAA0B;AACvC,aAAa,2BAA2B;AACxC,aAAa,2BAA2B;AACxC;AACA;AACA;AACA;AACA;AACA,wEAAqB;AACK;;;;;;;;;;;;;;;;;;;;;;;AC5X1B;AACA;AACA;AACA;AACsD;AACnB;AACU;AACU;AACJ;AACV;AACE;AACN;AACrC;AACA;AACA;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA,KAAK;AACL;AACA;AACA,oCAAoC,iDAAO;AAC3C,yCAAyC,2DAAY;AACrD;AACA;AACA;AACA;AACA;AACA,sBAAsB,mDAAQ;AAC9B,aAAa;AACb;AACA;AACA,YAAY,iBAAiB;AAC7B,4BAA4B,cAAc,iBAAiB,kBAAkB;AAC7E,4BAA4B,cAAc,kBAAkB,kBAAkB;AAC9E,4BAA4B,cAAc,kBAAkB,kBAAkB;AAC9E,4BAA4B,cAAc,kBAAkB,kBAAkB;AAC9E,gCAAgC,cAAc,mBAAmB,kBAAkB;AACnF;AACA,UAAU,cAAc,iBAAiB,mBAAmB;AAC5D,UAAU,cAAc,kBAAkB,mBAAmB;AAC7D;AACA,gCAAgC,cAAc,iBAAiB,kBAAkB;AACjF;AACA,UAAU,cAAc,kBAAkB,kBAAkB;AAC5D,UAAU,cAAc,iBAAiB,kBAAkB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,+DAAc;AACxC,0BAA0B,+DAAc;AACxC,0BAA0B,+DAAc;AACxC,0BAA0B,+DAAc;AACxC,sBAAsB,6CAAK,CAAC,mDAAY;AACxC;AACA,QAAQ,qDAAS;AACjB;AACA;AACA;AACA;AACA,YAAY,iBAAiB;AAC7B,4BAA4B,cAAc,kBAAkB,kBAAkB;AAC9E,4BAA4B,cAAc,kBAAkB,kBAAkB;AAC9E;AACA,UAAU,cAAc,iBAAiB,kBAAkB;AAC3D,UAAU,cAAc,kBAAkB,kBAAkB;AAC5D;AACA;AACA,UAAU,cAAc,iBAAiB,mBAAmB;AAC5D,UAAU,cAAc,iBAAiB,mBAAmB;AAC5D,UAAU,cAAc,iBAAiB,mBAAmB;AAC5D;AACA;AACA;AACA,0BAA0B,+DAAc;AACxC,0BAA0B,+DAAc;AACxC,sBAAsB,6CAAK,CAAC,mDAAY;AACxC;AACA,QAAQ,qDAAS;AACjB;AACA;AACA;AACA,wEAAqB;AACQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxF7B;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACmC;AACA;AACE;AACQ;AAChB;AACG;AACH;AACA;AACO;AACW;AACX;AACP;AACC;AACF;AACM;AACF;AACH;AACK;AACD;AACC;AACA;AACA;AACG;AACJ;AACE;AACE;AACJ;AACQ;AACX;AACG;AACI;AACG;AACP;AACF;AACM;AACF;AACF;AACA;AACH;AACC;AACD;AACS;AACF;AACH;AACI;AACJ;AACD;AACI;AACL;AACF;AACE;AACC;AACA;AACF;AACK;AACE;AACL;AACE;AACC;AACE;AACN;AACD;AACA;AACG;AACA;AACF;AACO;AACT;;;;;;;;;;;;;;;;;;;ACnF9B;AACA;AACA;AACA;AACA;AAC8E;AACzC;AACc;AACd;AACrC;AACA;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC,2CAA2C,iBAAiB;AAC5D,2CAA2C,kBAAkB;AAC7D;AACA,KAAK;AACL;AACA;AACA,2BAA2B;AAC3B,uBAAuB,sDAAc;AACrC,sBAAsB,sDAAc;AACpC,0BAA0B;AAC1B,yBAAyB,sDAAc;AACvC,sBAAsB,sDAAc,uBAAuB;AAC3D,aAAa;AACb;AACA;AACA;AACA,gCAAgC;AAChC,0EAA0E,4DAAoB;AAC9F,wEAAwE,4DAAoB;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,6DAAU,GAAG,6DAAU;AACnE;AACA;AACA;AACA;AACA;AACA,gBAAgB,kBAAkB;AAClC;AACA,wBAAwB,6CAAK;AAC7B;AACA,uCAAuC,6CAAK;AAC5C;AACA,uBAAuB,UAAU;AACjC,yBAAyB,2DAAY;AACrC;AACA;AACA,wBAAwB,qBAAqB;AAC7C,yBAAyB,2DAAY;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC,0EAA0E,4DAAoB;AAC9F,wEAAwE,4DAAoB;AAC5F;AACA,uBAAuB,6CAAK;AAC5B,uBAAuB,6CAAK;AAC5B,uBAAuB,6CAAK;AAC5B,uBAAuB,6CAAK;AAC5B,iBAAiB,6DAAU;AAC3B;AACA;AACA;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAqB;AACY;;;;;;;;;;;;;;;;;AC7GjC;AACA;AACA;AACA;AACA;AACA;AACA;AACsD;AACZ;AAC1C;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,wBAAwB,kDAAU;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kDAAU;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAqB;AACM;;;;;;;;;;;;;;;;;;;;;AC5E3B;AACA;AACA;AACA;AACA;AAC8E;AAC3C;AACE;AACc;AACd;AACa;AAClD;AACA;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,2BAA2B;AAC3B,uBAAuB,sDAAc;AACrC,sBAAsB,sDAAc;AACpC,yBAAyB,sDAAc;AACvC,sBAAsB,sDAAc,2BAA2B;AAC/D,aAAa;AACb;AACA;AACA;AACA;AACA,qBAAqB,wDAAiB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,wDAAiB;AACrB,IAAI,wDAAiB;AACrB,IAAI,wDAAiB;AACrB,IAAI,wDAAiB;AACrB,IAAI,wDAAiB;AACrB,IAAI,wDAAiB;AACrB,IAAI,wDAAiB;AACrB;AACA;AACA;AACA;AACA,gCAAgC;AAChC,4BAA4B;AAC5B,yBAAyB;AACzB,sFAAsF,4DAAoB;AAC1G,oFAAoF,4DAAoB;AACxG;AACA,uBAAuB,6CAAK;AAC5B,uBAAuB,6CAAK;AAC5B,iBAAiB,6DAAU;AAC3B;AACA,oBAAoB,OAAO;AAC3B,qBAAqB,2DAAY;AACjC;AACA;AACA,oBAAoB,iBAAiB;AACrC,qBAAqB,2DAAY;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qGAAqG,4DAAoB;AACzH,iGAAiG,4DAAoB;AACrH,kGAAkG,4DAAoB;AACtH,sGAAsG,4DAAoB;AAC1H;AACA;AACA;AACA,uBAAuB,6CAAK;AAC5B,uBAAuB,6CAAK;AAC5B,uBAAuB,6CAAK;AAC5B,uBAAuB,6CAAK;AAC5B,iBAAiB,6DAAU;AAC3B;AACA;AACA;AACA,gBAAgB,OAAO;AACvB,qBAAqB,2DAAY;AACjC;AACA;AACA;AACA;AACA,gBAAgB,iBAAiB;AACjC,qBAAqB,2DAAY;AACjC;AACA;AACA;AACA;AACA,gBAAgB,OAAO;AACvB,qBAAqB,2DAAY;AACjC;AACA;AACA;AACA;AACA,gBAAgB,iBAAiB;AACjC,qBAAqB,2DAAY;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF,4DAAoB;AACpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,4DAAoB;AACpC,8BAA8B,6CAAK;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,uBAAuB,6CAAK;AAC5B,uBAAuB,6CAAK;AAC5B,uBAAuB,6CAAK;AAC5B,uBAAuB,6CAAK;AAC5B,iBAAiB,6DAAU;AAC3B;AACA;AACA;AACA,gBAAgB,OAAO;AACvB,qBAAqB,2DAAY;AACjC;AACA;AACA;AACA;AACA,gBAAgB,iBAAiB;AACjC,qBAAqB,2DAAY;AACjC;AACA;AACA;AACA;AACA,gBAAgB,OAAO;AACvB,qBAAqB,2DAAY;AACjC;AACA;AACA;AACA;AACA,gBAAgB,iBAAiB;AACjC,qBAAqB,2DAAY;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sFAAsF,4DAAoB;AAC1G,oFAAoF,4DAAoB;AACxG;AACA,uBAAuB,6CAAK;AAC5B,uBAAuB,6CAAK;AAC5B,iBAAiB,6DAAU;AAC3B;AACA,oBAAoB,OAAO;AAC3B,qBAAqB,2DAAY;AACjC;AACA;AACA,oBAAoB,iBAAiB;AACrC,qBAAqB,2DAAY;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,6CAAK;AAC5B;AACA;AACA,uBAAuB,uEAAwB;AAC/C,uBAAuB,qEAAsB;AAC7C;AACA;AACA;AACA;AACA,uBAAuB,6CAAK;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC,4BAA4B;AAC5B,yBAAyB;AACzB,sFAAsF,4DAAoB;AAC1G,oFAAoF,4DAAoB;AACxG;AACA,uBAAuB,6CAAK;AAC5B,uBAAuB,6CAAK;AAC5B,iBAAiB,6DAAU;AAC3B,oBAAoB,OAAO;AAC3B;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA,4BAA4B,0BAA0B;AACtD;AACA;AACA;AACA;AACA,uBAAuB,WAAW;AAClC,sBAAsB,8BAA8B;AACpD;AACA,uBAAuB,2BAA2B;AAClD,sBAAsB,8BAA8B;AACpD;AACA,uBAAuB,WAAW;AAClC,sBAAsB,8BAA8B;AACpD;AACA,uBAAuB,gCAAgC;AACvD,sBAAsB,8BAA8B;AACpD;AACA;AACA;AACA;AACA;AACA,wEAAqB;AACQ;;;;;;;;;;;;;;;;;AC1T7B;AACA;AACA;AACA;AAC2C;AACA;AAC3C,2BAA2B,mDAAQ;AACnC;AACA;AACA,yBAAyB,mDAAQ;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mDAAQ;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACwB;;;;;;;;;;;;;;;;;AChFxB;AACA;AACA;AACA;AACsD;AACG;AACzD;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,mBAAmB,uDAAe;AAClC;AACA;AACA;AACA,mBAAmB,uDAAe;AAClC,0BAA0B,gDAAQ;AAClC,0BAA0B,gDAAQ;AAClC;AACA;AACA,oCAAoC,yDAAiB;AACrD;AACA;AACA,wEAAqB;AACW;;;;;;;;;;;;;;;;;;AC3BhC;AACA;AACA;AACA;AACsD;AACnB;AACA;AACnC;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,cAAc,2EAAwB;AACtC,gCAAgC,WAAW;AAC3C;AACA;AACA;AACA;AACA;AACA,WAAW,IAAI,2CAA2C;AAC1D,WAAW,IAAI,uBAAuB;AACtC,WAAW,IAAI,8DAA8D;AAC7E,WAAW,IAAI,0CAA0C;AACzD,WAAW,IAAI,0CAA0C;AACzD,WAAW,IAAI,0CAA0C;AACzD,WAAW,IAAI,0CAA0C;AACzD,WAAW,IAAI,0CAA0C;AACzD,WAAW,IAAI,0CAA0C;AACzD,WAAW,IAAI,0CAA0C;AACzD,WAAW,IAAI,0CAA0C;AACzD,WAAW,IAAI,0CAA0C;AACzD,WAAW,IAAI,2CAA2C;AAC1D,WAAW,IAAI,2CAA2C;AAC1D,WAAW,IAAI,iFAAiF;AAChG,WAAW,IAAI,8DAA8D;AAC7E,WAAW,IAAI,qEAAqE;AACpF,WAAW,IAAI,oEAAoE;AACnF,8BAA8B,wBAAwB;AACtD,8BAA8B,0CAA0C;AACxE,8BAA8B,oFAAoF;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,+DAAwB;AACpE,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,iDAAU;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA,WAAW,0BAA0B,cAAc,IAAI,uBAAuB;AAC9E,WAAW,uCAAuC,cAAc,IAAI,uBAAuB;AAC3F,WAAW,uDAAuD,cAAc,IAAI,uBAAuB;AAC3G,WAAW,2CAA2C,cAAc,IAAI,uBAAuB;AAC/F,WAAW,0CAA0C,cAAc,IAAI,uBAAuB;AAC9F,WAAW,6CAA6C,cAAc,IAAI,uBAAuB;AACjG,WAAW,8DAA8D,cAAc,IAAI,uBAAuB;AAClH;AACA,cAAc,8DAA8D,cAAc;AAC1F,cAAc,0CAA0C;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,wEAAqB;AACY;;;;;;;;;;;;;;;;;;ACvJjC;AACA;AACA;AACA;AACsD;AACP;AACV;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,sBAAsB,6CAAK;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,6CAAK;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,6CAAK;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,6CAAK;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,6CAAK;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,6CAAK;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,6CAAK;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,6CAAK;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,6CAAK;AAC3B,wBAAwB,uDAAU;AAClC,iEAAiE,0DAAkB;AACnF;AACA;AACA,oBAAoB,oBAAoB;AACxC;AACA;AACA;AACA,kEAAkE,2DAAmB;AACrF;AACA;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;AACA,sEAAsE,+DAAuB;AAC7F;AACA;AACA,oBAAoB,yBAAyB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,6CAAK;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAqB;AACC;;;;;;;;;;;;;;;;;;;;;;;AC7KtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACsD;AACnB;AACU;AACF;AACN;AACQ;AACI;AACZ;AACrC;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,6CAAK;AAC3B;AACA,0BAA0B,qDAAS;AACnC,sBAAsB,6CAAK,CAAC,mDAAY;AACxC,2BAA2B,mDAAQ,GAAG,wBAAwB;AAC9D,2BAA2B,mDAA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AiB,UAAU;AAC3B;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,uDAAuD;AACpF,yCAAyC,uCAAuC;AAChF,yCAAyC,qCAAqC;AAC9E,8BAA8B,+FAA+F;AAC7H,yCAAyC,+DAA+D;AACxG,4BAA4B,eAAe;AAC3C,mCAAmC,eAAe;AAClD,+BAA+B,cAAc;AAC7C,qCAAqC,cAAc;AACnD,sCAAsC,cAAc;AACpD,4BAA4B,YAAY;AACxC;AACA;AACA,wBAAwB,sDAAsD;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,+CAAM;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,+CAAM;AAC7B,wBAAwB,MAAM,KAAK,OAAO,KAAK,aAAa,KAAK,cAAc,KAAK,oBAAoB;AACxG;AACA,yBAAyB,oBAAoB;AAC7C;AACA,yBAAyB;AACzB,yBAAyB,EAAE;AAC3B;AACA;AACA;AACA;AACA,uBAAuB,+CAAM;AAC7B,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA,uBAAuB,+CAAM;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,wDAAwD;AACxD;AACA,wEAAqB;AACE;;;;;;;;;;;;;;;;AC7IvB;AACA;AACA;AACA;AACA;AACsD;AACtD;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,2EAAwB;AAC1C;AACA,iCAAiC,YAAY;AAC7C,kFAAkF,YAAY;AAC9F;AACA,iCAAiC,oBAAoB;AACrD,qEAAqE,YAAY;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,KAAK;AACL;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,eAAe;AAClC,KAAK;AACL;AACA;AACA,CAAC;AACD;AACA;AACA;AACA,mBAAmB,gBAAgB;AACnC,KAAK;AACL;AACA;AACA,CAAC;AACD,wEAAqB;AACQ;;;;;;;;;;;;;;;;;ACvE7B;AACA;AACA;AACA;AACA;AACA;AACsD;AACmD;AACzG;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,QAAQ,6CAAK;AACb;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,iDAAS;AACnC,QAAQ,mDAAW;AACnB;AACA;AACA;AACA;AACA;AACA,UAAU,iCAAiC;AAC3C,UAAU,iCAAiC;AAC3C,UAAU,iCAAiC;AAC3C,UAAU,iCAAiC;AAC3C,UAAU,6BAA6B;AACvC,UAAU,iCAAiC;AAC3C,UAAU,iCAAiC;AAC3C,UAAU,iCAAiC;AAC3C,UAAU,iCAAiC;AAC3C,UAAU,6BAA6B;AACvC,UAAU,iCAAiC;AAC3C,UAAU,iCAAiC;AAC3C,UAAU,iCAAiC;AAC3C,UAAU,iCAAiC;AAC3C;AACA;AACA;AACA,oBAAoB,OAAO;AAC3B,0BAA0B,6CAAK;AAC/B,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,2EAAwB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,iCAAiC;AACvD,sBAAsB,iCAAiC;AACvD,sBAAsB,iCAAiC;AACvD,sBAAsB,iCAAiC;AACvD,sBAAsB,iCAAiC;AACvD,sBAAsB,iCAAiC;AACvD,sBAAsB,iCAAiC;AACvD,sBAAsB,iCAAiC;AACvD;AACA;AACA;AACA;AACA,sBAAsB,kDAAkD;AACxE,sBAAsB,kDAAkD;AACxE,sBAAsB,4DAA4D;AAClF,sBAAsB,kDAAkD;AACxE,sBAAsB,kDAAkD;AACxE,sBAAsB,4DAA4D;AAClF;AACA,aAAa,8BAA8B;AAC3C,aAAa,0CAA0C;AACvD,aAAa,0CAA0C;AACvD,CAAC;AACD;AACA;AACA,sBAAsB,iCAAiC;AACvD,sBAAsB,iCAAiC;AACvD,sBAAsB,iCAAiC;AACvD,sBAAsB,iCAAiC;AACvD;AACA;AACA,sBAAsB,kDAAkD;AACxE,sBAAsB,4DAA4D;AAClF,sBAAsB,kDAAkD;AACxE,sBAAsB,4DAA4D;AAClF;AACA,CAAC;AACD;AACA;AACA;AACA;AACA,sBAAsB,iCAAiC;AACvD,sBAAsB,iCAAiC;AACvD,sBAAsB,8BAA8B;AACpD,sBAAsB,0CAA0C;AAChE,sBAAsB,iCAAiC;AACvD,sBAAsB,iCAAiC;AACvD,sBAAsB,iCAAiC;AACvD,sBAAsB,iCAAiC;AACvD;AACA,aAAa,0CAA0C;AACvD;AACA,sBAAsB,kDAAkD;AACxE,sBAAsB,kDAAkD;AACxE,sBAAsB,4DAA4D;AAClF,sBAAsB,kDAAkD;AACxE,sBAAsB,6DAA6D;AACnF,sBAAsB,mDAAmD;AACzE;AACA,IAAI,0DAAkB,gBAAgB,WAAW;AACjD;AACA,aAAa,0CAA0C;AACvD,aAAa,0CAA0C;AACvD,CAAC;AACD;AACA;AACA,gBAAgB,kDAAU;AAC1B;AACA,gBAAgB,uDAAe;AAC/B,eAAe,wDAAgB;AAC/B;AACA;AACA;AACA,yBAAyB,kDAAkD;AAC3E,0CAA0C,YAAY;AACtD,wCAAwC,iBAAiB;AACzD,sBAAsB,kDAAkD,6BAA6B,iBAAiB;AACtH,sBAAsB,kDAAkD,6BAA6B,iBAAiB;AACtH,sBAAsB,kDAAkD,6BAA6B,iBAAiB;AACtH;AACA,CAAC;AACD;AACA;AACA,sBAAsB,qDAAqD,+BAA+B,YAAY;AACtH,sBAAsB,qDAAqD;AAC3E,sBAAsB,qDAAqD,+BAA+B,YAAY;AACtH,sBAAsB,qDAAqD,+BAA+B,YAAY;AACtH;AACA,CAAC;AACD;AACA;AACA,sBAAsB,kDAAkD,kBAAkB,+CAAO;AACjG,sBAAsB,kDAAkD,kBAAkB,+CAAO;AACjG,sBAAsB,kDAAkD,kBAAkB,+CAAO;AACjG,sBAAsB,kDAAkD,kBAAkB,+CAAO;AACjG;AACA,CAAC;AACD;AACA;AACA;AACA;AACA,4BAA4B,iDAAiD,kBAAkB,+CAAO;AACtG,4BAA4B,iDAAiD,kBAAkB,+CAAO;AACtG,4BAA4B,iDAAiD,kBAAkB,+CAAO;AACtG,4BAA4B,iDAAiD,kBAAkB,+CAAO;AACtG;AACA,CAAC;AACD,wEAAqB;AACM;;;;;;;;;;;;;;;;;ACjM3B;AACA;AACA;AACA;AACsD;AACiB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,yBAAyB,gDAAQ;AACjC,sBAAsB,iDAAS,GAAG,SAAS,gEAAwB,QAAQ;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,gDAAQ;AACjC,sBAAsB,iDAAS,GAAG,SAAS,gEAAwB,QAAQ;AAC3E,IAAI,sEAA8B;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,0DAAkB;AACvD;AACA,gDAAgD,0DAAkB;AAClE;AACA;AACA;AACA,yBAAyB,gDAAQ;AACjC,sBAAsB,iDAAS,GAAG,SAAS,gEAAwB,QAAQ;AAC3E,IAAI,sEAA8B;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAqB;AACI;;;;;;;;;;;;;;;;;ACrEzB;AACA;AACA;AACA;AACA;AACsD;AACgF;AACtI;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB,sBAAsB;AACtB;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,+DAAuB;AAC3B,YAAY,iDAAS,GAAG,8BAA8B;AACtD,YAAY,iDAAS,GAAG,8BAA8B;AACtD,YAAY,iDAAS,GAAG,8BAA8B;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6FAA6F;AAC7F;AACA,+BAA+B,sBAAsB,EAAE,oBAAoB;AAC3E;AACA,4BAA4B,gEAAwB;AACpD;AACA;AACA,2BAA2B,WAAW;AACtC;AACA;AACA;AACA;AACA,2BAA2B,QAAQ;AACnC;AACA;AACA;AACA;AACA;AACA,0FAA0F,eAAe,gBAAgB;AACzH,uCAAuC,cAAc,qBAAqB,EAAE,qBAAqB,IAAI,SAAS;AAC9G;AACA,yCAAyC,sBAAsB,cAAc,YAAY,IAAI,YAAY;AACzG;AACA;AACA;AACA,yBAAyB,gDAAQ;AACjC;AACA;AACA,kBAAkB,6CAAK;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,iEAAiE;AACrF;AACA,wBAAwB,+CAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,wDAAY;AACpB;AACA;AACA,sBAAsB,oDAAY,uCAAuC,kBAAkB;AAC3F;AACA,sBAAsB,qDAAa;AACnC;AACA;AACA,sBAAsB,kDAAU;AAChC;AACA,yBAAyB,gDAAQ;AACjC;AACA,kBAAkB,6CAAK;AACvB;AACA;AACA,wEAAqB;AACI;;;;;;;;;;;;;;;;;;;;;;;;AC5JzB;AACA;AACA;AACA;AACsD;AACnB;AACF;AACE;AACU;AACR;AACQ;AACN;AACF;AACrC;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,6CAAK;AAC3B,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,iBAAiB;AAC7B;AACA,YAAY,qDAAS,GAAG,kDAAkD;AAC1E,YAAY,qDAAS,GAAG,kDAAkD;AAC1E,YAAY,qDAAS,GAAG,kDAAkD;AAC1E,YAAY,qDAAS,GAAG,kDAAkD;AAC1E,YAAY,qDAAS,GAAG,mDAAmD;AAC3E,YAAY,qDAAS,GAAG,mDAAmD;AAC3E,YAAY,qDAAS,GAAG,mDAAmD;AAC3E,YAAY,qDAAS,GAAG,oDAAoD;AAC5E;AACA,IAAI,wDAAkB,UAAU,WAAW;AAC3C,IAAI,mEAAuB;AAC3B;AACA;AACA;AACA,iCAAiC,qDAAS;AAC1C;AACA;AACA;AACA;AACA,YAAY,iBAAiB;AAC7B;AACA,eAAe,iDAAiD;AAChE,eAAe,kDAAkD;AACjE,eAAe,iDAAiD;AAChE,eAAe,iDAAiD;AAChE,eAAe,+DAA+D;AAC9E,eAAe,kDAAkD;AACjE,eAAe,kDAAkD;AACjE,eAAe,iDAAiD;AAChE,eAAe,+DAA+D;AAC9E,eAAe,iDAAiD;AAChE,eAAe,kDAAkD;AACjE,eAAe,iDAAiD;AAChE;AACA,sBAAsB,2CAAI;AAC1B,sBAAsB,2CAAI;AAC1B,sBAAsB,2CAAI;AAC1B,IAAI,mEAAuB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,iBAAiB;AAC7B;AACA,eAAe,kDAAkD;AACjE,eAAe,mDAAmD;AAClE,eAAe,kDAAkD;AACjE,eAAe,kDAAkD;AACjE,eAAe,gEAAgE;AAC/E,eAAe,mDAAmD;AAClE,eAAe,mDAAmD;AAClE,eAAe,kDAAkD;AACjE,eAAe,gEAAgE;AAC/E,eAAe,kDAAkD;AACjE,eAAe,mDAAmD;AAClE,eAAe,kDAAkD;AACjE;AACA,sBAAsB,2CAAI;AAC1B,sBAAsB,2CAAI;AAC1B,sBAAsB,2CAAI;AAC1B,IAAI,mEAAuB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,iBAAiB;AAC7B;AACA,eAAe,iDAAiD;AAChE,eAAe,iDAAiD;AAChE,eAAe,kDAAkD;AACjE,eAAe,kDAAkD;AACjE,eAAe,kDAAkD;AACjE,eAAe,iDAAiD;AAChE,eAAe,iDAAiD;AAChE,eAAe,kDAAkD;AACjE,eAAe,iDAAiD;AAChE,eAAe,iDAAiD;AAChE,eAAe,kDAAkD;AACjE,eAAe,kDAAkD;AACjE;AACA,wBAAwB,+CAAM,sCAAsC,4DAAmB;AACvF,wBAAwB,+CAAM,sCAAsC,4DAAmB;AACvF,wBAAwB,+CAAM,sCAAsC,4DAAmB;AACvF,wBAAwB,+CAAM,uCAAuC,4DAAmB;AACxF,IAAI,mEAAuB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,iBAAiB;AAC7B;AACA,eAAe,mDAAmD;AAClE,eAAe,mDAAmD;AAClE,eAAe,kDAAkD;AACjE,eAAe,mDAAmD;AAClE,eAAe,kDAAkD;AACjE,eAAe,kDAAkD;AACjE,eAAe,kDAAkD;AACjE,eAAe,mDAAmD;AAClE,eAAe,kDAAkD;AACjE,eAAe,kDAAkD;AACjE,eAAe,mDAAmD;AAClE,eAAe,mDAAmD;AAClE;AACA,sBAAsB,2CAAI;AAC1B,sBAAsB,2CAAI;AAC1B,sBAAsB,2CAAI;AAC1B,sBAAsB,2CAAI;AAC1B,wBAAwB,+CAAM,sCAAsC,+DAAsB;AAC1F,wBAAwB,+CAAM,sCAAsC,+DAAsB;AAC1F,wBAAwB,+CAAM,sCAAsC,+DAAsB;AAC1F,wBAAwB,+CAAM,uCAAuC,+DAAsB;AAC3F,IAAI,mEAAuB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,iBAAiB;AAC7B;AACA,eAAe,mDAAmD;AAClE,eAAe,mDAAmD;AAClE,eAAe,kDAAkD;AACjE,eAAe,kDAAkD;AACjE,eAAe,mDAAmD;AAClE,eAAe,kDAAkD;AACjE,eAAe,mDAAmD;AAClE,eAAe,kDAAkD;AACjE,eAAe,kDAAkD;AACjE,eAAe,iDAAiD;AAChE,eAAe,kDAAkD;AACjE,eAAe,iDAAiD;AAChE,eAAe,kDAAkD;AACjE,eAAe,kDAAkD;AACjE,eAAe,mDAAmD;AAClE,eAAe,mDAAmD;AAClE;AACA,qBAAqB,2CAAI;AACzB,uBAAuB,+CAAM,uCAAuC,4DAAmB;AACvF,IAAI,mEAAuB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,oBAAoB;AAChC;AACA;AACA,YAAY,iBAAiB;AAC7B;AACA,eAAe,mDAAmD;AAClE,eAAe,mDAAmD;AAClE,eAAe,kDAAkD;AACjE,eAAe,kDAAkD;AACjE,eAAe,mDAAmD;AAClE,eAAe,kDAAkD;AACjE,eAAe,mDAAmD;AAClE,eAAe,kDAAkD;AACjE,eAAe,kDAAkD;AACjE,eAAe,iDAAiD;AAChE,eAAe,kDAAkD;AACjE,eAAe,iDAAiD;AAChE,eAAe,kDAAkD;AACjE,eAAe,kDAAkD;AACjE,eAAe,mDAAmD;AAClE,eAAe,mDAAmD;AAClE;AACA,qBAAqB,2CAAI;AACzB,uBAAuB,+CAAM,uCAAuC,4DAAmB;AACvF,aAAa,oBAAoB;AACjC,IAAI,mEAAuB,0BAA0B,mBAAmB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,6CAAK;AAC3B,4CAA4C,qDAAS;AACrD;AACA,sBAAsB,4CAA4C;AAClE,sBAAsB,+BAA+B;AACrD,sBAAsB,4CAA4C;AAClE,sBAAsB,+BAA+B;AACrD;AACA;AACA,sBAAsB,kDAAkD;AACxE,sBAAsB,mDAAmD;AACzE,sBAAsB,mDAAmD;AACzE,sBAAsB,kDAAkD;AACxE,sBAAsB,kDAAkD;AACxE,sBAAsB,mDAAmD;AACzE,sBAAsB,kDAAkD;AACxE,sBAAsB,kDAAkD;AACxE;AACA,uBAAuB,6CAAK,CAAC,mDAAY;AACzC,uBAAuB,6CAAK,CAAC,mDAAY;AACzC,aAAa,oBAAoB;AACjC,QAAQ,qDAAS,yEAAyE,mBAAmB;AAC7G,wBAAwB,2CAAI;AAC5B,wBAAwB,2CAAI;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAqB;AACC;;;;;;;;;;;;;;;;;;;;;;AC3StB;AACA;AACA;AACA;AACsD;AACP;AACZ;AACU;AACR;AACa;AACL;AAC7C;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAM,mDAAmD;AACzD,MAAM,mDAAmD;AACzD,MAAM,mDAAmD;AACzD,MAAM,mDAAmD;AACzD,MAAM,oDAAoD;AAC1D,MAAM,oDAAoD;AAC1D,MAAM,oDAAoD;AAC1D;AACA;;AAEA,kBAAkB,kBAAkB;AACpC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,6CAAK;AAC/B,4BAA4B,iEAAkB;AAC9C,4BAA4B,iEAAkB;AAC9C;AACA;AACA;AACA;AACA,2BAA2B,qDAAS,GAAG,mDAAmD;AAC1F;AACA,IAAI,mEAAuB;AAC3B;AACA,0BAA0B,6CAAK;AAC/B,4BAA4B,iEAAkB;AAC9C,4BAA4B,iEAAkB;AAC9C;AACA;AACA;AACA,YAAY,qDAAS,GAAG,mDAAmD;AAC3E,YAAY,qDAAS,GAAG,mDAAmD;AAC3E;AACA;AACA,IAAI,mEAAuB;AAC3B;AACA,0BAA0B,6CAAK;AAC/B;AACA;AACA;AACA,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,IAAI,mEAAuB;AAC3B;AACA,0BAA0B,6CAAK;AAC/B;AACA;AACA;AACA,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,IAAI,mEAAuB;AAC3B;AACA;AACA;AACA;AACA;AACA,0BAA0B,6CAAK;AAC/B,4BAA4B,iEAAkB;AAC9C,4BAA4B,iEAAkB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,sBAAsB,2CAAI;AAC1B,sBAAsB,2CAAI;AAC1B;AACA;AACA,IAAI,mEAAuB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,6CAAK;AAC/B,4BAA4B,iEAAkB;AAC9C,4BAA4B,iEAAkB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS,GAAG,mDAAmD;AAC3E;AACA,uCAAuC,uDAAU,wBAAwB,yEAAsB;AAC/F;AACA,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,sBAAsB,2CAAI;AAC1B;AACA,IAAI,mEAAuB;AAC3B;AACA;AACA;AACA,0BAA0B,6CAAK;AAC/B;AACA;AACA,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT;AACA,iCAAiC,uDAAU,uBAAuB,yEAAsB;AACxF;AACA,IAAI,mEAAuB;AAC3B;AACA;AACA;AACA;AACA;AACA,0BAA0B,6CAAK;AAC/B,4BAA4B,iEAAkB;AAC9C,4BAA4B,iEAAkB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT;AACA,uCAAuC,uDAAU,wBAAwB,yEAAsB;AAC/F;AACA,sBAAsB,2CAAI;AAC1B,sBAAsB,2CAAI;AAC1B;AACA,IAAI,mEAAuB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,6CAAK;AAC/B,4BAA4B,iEAAkB;AAC9C,4BAA4B,iEAAkB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT,YAAY,qDAAS;AACrB;AACA;AACA;AACA,SAAS;AACT;AACA,uCAAuC,uDAAU,wBAAwB,yEAAsB;AAC/F;AACA,sBAAsB,2CAAI;AAC1B;AACA,IAAI,mEAAuB;AAC3B;AACA;AACA;AACA;AACA,wEAAqB;AACE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1avB;AACA;AACA;AACA;AACA;AACA;AACsD;AACP;AACZ;AACA;AACU;AACM;AACR;AACN;AACsB;AACd;AACO;AACN;AACE;AACK;AACrD;AACA;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA;AACA,kFAAkF,cAAc;AAChG;AACA;AACA,0EAA0E,WAAW;AACrF,gFAAgF,aAAa;AAC7F,gFAAgF,aAAa;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,sBAAsB,6CAAK;AAC3B,sBAAsB,2CAAI;AAC1B,sBAAsB,2CAAI;AAC1B,sBAAsB,2CAAI;AAC1B,sBAAsB,8DAAa;AACnC,sBAAsB,8DAAa;AACnC,sBAAsB,8DAAa;AACnC,qBAAqB,2DAAY;AACjC,qBAAqB,2DAAY;AACjC,qBAAqB,2DAAY;AACjC,qBAAqB,sDAAO,CAAC,iEAAkB;AAC/C,qBAAqB,sDAAO,CAAC,iEAAkB;AAC/C,qBAAqB,sDAAO,CAAC,+DAAgB;AAC7C,wBAAwB;AACxB,wBAAwB;AACxB,qBAAqB;AACrB,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,6CAAK;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,6CAAK,gBAAgB,iBAAiB;AAC1D;AACA;AACA,gBAAgB,6CAAK,iBAAiB,kBAAkB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,6CAAK;AAC/B,4BAA4B,uEAAwB;AACpD,4BAA4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CA;AACA,4BAA4B,+DAAc;AAC1C,4BAA4B,+DAAc;AAC1C,6BAA6B,+DAAc;AAC3C,0BAA0B,+DAAc;AACxC,2BAA2B,+DAAc;AACzC,wBAAwB,2EAA0B;AAClD,wBAAwB,2EAA0B;AAClD,yBAAyB,4EAA2B;AACpD,uBAAuB,0EAAyB;AAChD;AACA;AACA,oCAAoC,cAAc;AAClD,qCAAqC,aAAa;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAqB;AACU;;;;;;;;;;;;;;;;;ACtZ/B;AACA;AACA;AACA;AACA;AACA;AACsD;AACH;AACnD;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2DAAY,GAAG,uBAAuB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2EAAwB;AAChD;AACA;AACA;AACA;AACA,6BAA6B,+DAA+D;AAC5F,kDAAkD,WAAW;AAC7D,kDAAkD,WAAW;AAC7D,gCAAgC,iDAAiD;AACjF,gCAAgC,iDAAiD;AACjF,gCAAgC,iDAAiD;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,CAAC;AACD,wEAAqB;AACQ;;;;;;;;;;;;;;;;;;AC3G7B;AACA;AACA;AACA;AACsD;AACrB;AACa;AAC9C;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA,KAAK;AACL;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,sBAAsB,8CAA8C;AACpE,sBAAsB,8CAA8C;AACpE,sBAAsB,4DAA4D;AAClF,sBAAsB,4DAA4D;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,QAAQ,iDAAU,mBAAmB,uDAAgB,EAAE;AAC3E;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,sBAAsB,0EAA0E;AAChG,sBAAsB,8CAA8C,6BAA6B,WAAW;AAC5G,sBAAsB,4DAA4D;AAClF;AACA,yBAAyB,4DAA4D;AACrF,wCAAwC,WAAW;AACnD,sBAAsB,8CAA8C,6BAA6B,WAAW;AAC5G,sBAAsB,0EAA0E;AAChG,sBAAsB,4DAA4D;AAClF;AACA,yBAAyB,4DAA4D;AACrF,wCAAwC,WAAW;AACnD;AACA,IAAI,wDAAkB,eAAe,WAAW;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,cAAc;AACjC,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,mBAAmB,eAAe;AAClC,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,mBAAmB,gBAAgB;AACnC,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,mBAAmB,aAAa;AAChC,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAqB;AACK;;;;;;;;;;;;;;;;;;;AC7H1B;AACA;AACA;AACA;AACsD;AACjB;AACa;AACW;AAC7D;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,sBAAsB,6CAAK;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,6CAAK;AAC3B;AACA;AACA;AACA;AACA,wBAAwB,uEAAwB;AAChD;AACA;AACA;AACA,wBAAwB,iEAAkB;AAC1C;AACA;AACA,gBAAgB,yEAAyB;AACzC;AACA;AACA;AACA;AACA,wBAAwB,iEAAkB;AAC1C;AACA;AACA;AACA,wBAAwB,iEAAkB;AAC1C;AACA;AACA;AACA,wEAAqB;AACS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACvD9B;AACA;AACA;AACA;AACA;AACA;AACsD;AACP;AAC2B;AACvB;AAChB;AACF;AACE;AACU;AACF;AACY;AACZ;AACc;AACpB;AACQ;AACV;AACgB;AACX;AACS;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC,oDAAoD,gDAAgD;AACpG,qEAAqE,gDAAgD;AACrH,kDAAkD,+CAA+C;AACjG,mDAAmD,gDAAgD;AACnG,kDAAkD,+CAA+C;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,0EAAuB;AAC/B;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA,kCAAkC,sDAAS;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,kEAAe;AACrD;AACA,QAAQ,0DAAW;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,sDAAe;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,sDAAS,GAAG,uDAAuD;AAC5F;AACA;AACA,KAAK;AACL,qBAAqB,sDAAS,GAAG,kDAAkD;AACnF,qBAAqB,sDAAS,GAAG,6CAA6C;AAC9E,qBAAqB,sDAAS,GAAG,gDAAgD;AACjF;AACA;AACA,sBAAsB,sDAAe;AA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rC;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC,4BAA4B,0BAA0B;AACtD;AACA,qBAAqB,mDAAmD;AACxE,yBAAyB,uDAAU,gDAAgD,0EAA6B;AAChH;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC,4BAA4B,0BAA0B;AACtD;AACA,mBAAmB,+DAAc;AACjC;AACA;AACA,qBAAqB,gEAAgE;AACrF,yBAAyB,uDAAU;AACnC,0BAA0B,iDAAM;AAChC,yBAAyB,uDAAU;AACnC,oCAAoC,kEAAsB;AAC1D,oCAAoC,kEAAsB;AAC1D,oCAAoC,mEAAuB;AAC3D,yBAAyB,4DAAY,kBAAkB,mEAAuB;AAC9E,IAAI,wDAAkB,WAAW,WAAW;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC,4BAA4B,0BAA0B;AACtD;AACA,gCAAgC,mDAAQ;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,UAAU,8BAA8B;AACxC,UAAU,8BAA8B;AACxC,UAAU,8BAA8B;AACxC;AACA,yCAAyC,WAAW;AACpD,aAAa,eAAe;AAC5B,6BAA6B,aAAa;AAC1C,6BAA6B,aAAa;AAC1C;AACA;AACA;AACA;AACA,wEAAqB;AACK;;;;;;;;;;;;;;;;;ACv2B1B;AACA;AACA;AACA;AACsD;AACnB;AACnC;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2EAAwB;AAChD;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,cAAc;AACzE;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,CAAC;AACD,0DAA0D,cAAc;AACxE;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,CAAC;AACD,2DAA2D,YAAY;AACvE;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,CAAC;AACD,+DAA+D,cA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AAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,kBAAkB,6DAAqB;AACvC;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,wEAAqB;AACG;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtXxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACsD;AACP;AACI;AAChB;AACU;AACM;AACA;AACR;AACkB;AACrB;AACC;AACE;AACU;AACrD;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA,KAAK;AACL;AACA;AACA,yEAAyE,kCAAkC;AAC3G;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC,4BAA4B,0BAA0B;AACtD;AACA,uBAAuB,2DAAY;AACnC;AACA;AACA;AACA,uCAAuC,2EAA2B,EAAE,uEAAsB;AAC1F;AACA;AACA;AACA,yBAAyB,+DAA+D;AACxF,wCAAwC,WAAW;AACnD,wCAAwC,WAAW;AACnD;AACA,yBAAyB,+DAA+D;AACxF,wCAAwC,WAAW;AACnD,wCAAwC,WAAW;AACnD,sBAAsB,iDAAiD;AACvE,sBAAsB,iDAAiD;AACvE;AACA,yBAAyB,6BAA6B;AACtD;AACA,sBAAsB,gBAAgB,kBAAkB,uDAAU;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,2DAAY;AACvC,2BAA2B,mDAAQ;AACnC,2BAA2B,uDAAU;AACrC,2BAA2B,2DAAY,eAAe,WAAW,iBAAiB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,oDAAQ;AAC9B;AACA;AACA,wCAAwC,kDAAO;AAC/C;AACA;AACA;AACA,kBAAkB,kBAAkB;AACpC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS,kBAAkB,uDAAU;AACrC;AACA;AACA,kBAAkB,kBAAkB;AACpC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT,6BAA6B,2CAAI;AACjC,8BAA8B,gDAAM,MAAM,mBAAmB;AAC7D;AACA,IAAI,mEAAuB;AAC3B;AACA;AACA,wEAAqB;AACC;;;;;;;;;;;;;;;;;;;;;;;;;ACxHtB;AACA;AACA;AACA;AACsD;AACrB;AACE;AACY;AACF;AACR;AACI;AACE;AACM;AACD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,sBAAsB,sDAAe;AACrC,mBAAmB,iDAAO,GAAG,cAAc,iBAAiB,kBAAkB;AAC9E;AACA,eAAe,iDAAO,GAAG,cAAc,iBAAiB,kBAAkB;AAC1E;AACA;AACA;AACA,qBAAqB,iDAAO;AAC5B;AACA,cAAc,iBAAiB;AAC/B,cAAc,iBAAiB;AAC/B;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,sBAAsB,6CAAK;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,iDAAO;AAC5B;AACA,cAAc,iBAAiB;AAC/B,cAAc,iBAAiB;AAC/B;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,qBAAqB,iDAAO;AAC5B;AACA,cAAc,iBAAiB;AAC/B,cAAc,iBAAiB;AAC/B;AACA;AACA,KAAK;AACL,4BAA4B,yDAAW;AACvC;AACA;AACA;AACA;AACA;AACA,sBAAsB,mDAAQ;AAC9B;AACA;AACA;AACA,UAAU,cAAc,iBAAiB,kBAAkB;AAC3D;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,kBAAkB;AACpC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,mBAAmB;AACrC,kBAAkB,kBAAkB;AACpC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,mBAAmB;AACrC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,kBAAkB;AACpC,kBAAkB,kBAAkB;AACpC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,4BAA4B,iDAAO;AACnC,gCAAgC,yDAAW;AAC3C;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,mDAAQ;AAC9B;AACA;AACA;AACA;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,kBAAkB;AACpC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,kBAAkB;AACpC,kBAAkB,kBAAkB;AACpC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA,4BAA4B,iDAAO;AACnC;AACA;AACA,KAAK;AACL,sBAAsB,6CAAK,CAAC,mDAAY,UAAU,sDAAc;AAChE;AACA,QAAQ,qDAAS;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,mDAAQ;AAC9B;AACA;AACA;AACA;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,kBAAkB;AACpC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,kBAAkB;AACpC,kBAAkB,kBAAkB;AACpC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA,4BAA4B,iDAAO;AACnC;AACA;AACA;AACA,KAAK;AACL,sBAAsB,6CAAK,CAAC,mDAAY,UAAU,sDAAc;AAChE;AACA,QAAQ,qDAAS;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,mDAAQ;AAC9B;AACA;AACA;AACA;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,kBAAkB;AACpC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,kBAAkB;AACpC,kBAAkB,kBAAkB;AACpC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA,4BAA4B,iDAAO;AACnC;AACA;AACA;AACA,KAAK;AACL,gBAAgB,sDAAe,MAAM,sDAAe;AACpD,sBAAsB,6CAAK,CAAC,mDAAY,UAAU,sDAAc;AAChE;AACA,QAAQ,qDAAS;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,mDAAQ,gBAAgB,cAAc;AAC5D;AACA;AACA;AACA;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,kBAAkB;AACpC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,kBAAkB;AACpC,kBAAkB,kBAAkB;AACpC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC,kBAAkB,kBAAkB;AACpC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA,4BAA4B,iDAAO;AACnC;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,sBAAsB,6CAAK,CAAC,mDAAY,UAAU,sDAAc;AAChE;AACA,QAAQ,qDAAS;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,mDAAQ;AAC9B;AACA;AACA;AACA;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,kBAAkB;AACpC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,kBAAkB;AACpC,kBAAkB,kBAAkB;AACpC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA;AACA,SAAS;AACT;AACA,4CAA4C,iDAAO;AACnD,IAAI,wDAAkB;AACtB,sBAAsB,6CAAK,CAAC,mDAAY,UAAU,sDAAc;AAChE;AACA,QAAQ,qDAAS;AACjB;AACA;AACA;AACA,wEAAqB;AACG;;;;;;;;;;;;;;;;;;;;;;AC9dxB;AACA;AACA;AACA;AACsD;AACnB;AACU;AACJ;AACE;AACA;AACN;AACrC;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,sBAAsB,6CAAK,CAAC,mDAAY;AACxC;AACA,QAAQ,qDAAS;AACjB;AACA,oBAAoB,mDAAQ;AAC5B;AACA;AACA;AACA;AACA,KAAK,EAAE,4DAAiB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,mDAAQ;AAC9B,aAAa;AACb;AACA;AACA,oCAAoC,iDAAO;AAC3C;AACA;AACA;AACA;AACA;AACA,YAAY,iBAAiB;AAC7B;AACA,kBAAkB,cAAc,iBAAiB,kBAAkB;AACnE,kBAAkB,cAAc,iBAAiB,kBAAkB;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,iBAAiB;AAC7B;AACA,kBAAkB,cAAc,iBAAiB,kBAAkB;AACnE,kBAAkB,cAAc,iBAAiB,kBAAkB;AACnE;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT,kBAAkB,cAAc,kBAAkB,kBAAkB;AACpE,kBAAkB,cAAc,kBAAkB,kBAAkB;AACpE;AACA;AACA,kBAAkB,kBAAkB;AACpC,kBAAkB,kBAAkB;AACpC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,kBAAkB;AACpC,kBAAkB,kBAAkB;AACpC;AACA;AACA,SAAS;AACT;AACA,sBAAsB,6CAAK,CAAC,mDAAY;AACxC,QAAQ,qDAAS;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,iEAAsB;AAC7C;AACA;AACA;AACA,uBAAuB,mEAAwB;AAC/C;AACA,wEAAqB;AACI;;;;;;;;;;;;;;;;;AClJzB;AACA;AACA;AACA;AACsD;AACX;AAC3C;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA,KAAK;AACL;AACA;AACA;AACA,sBAAsB,mDAAQ;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAqB;AACI;;;;;;;;;;;;;;;;;;;;;;;AC1BzB;AACA;AACA;AACA;AACsD;AACP;AACZ;AACU;AACJ;AACE;AACJ;AACF;AACrC;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,oCAAoC,iDAAO;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,yEAAsB;AACnD,sBAAsB,mDAAQ;AAC9B,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,sBAAsB,6CAAK,CAAC,mDAAY;AACxC;AACA,QAAQ,qDAAS;AACjB;AACA,oBAAoB,+CAAM;AAC1B;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,iBAAiB;AAC7B,4BAA4B,cAAc,iBAAiB,kBAAkB;AAC7E,4BAA4B,cAAc,iBAAiB,kBAAkB;AAC7E;AACA;AACA;AACA;AACA;AACA,uBAAuB,8DAAqB;AAC5C;AACA;AACA;AACA,uBAAuB,6DAAoB;AAC3C;AACA;AACA;AACA;AACA;AACA,YAAY,iBAAiB;AAC7B;AACA,kBAAkB,cAAc,iBAAiB,kBAAkB;AACnE,kBAAkB,cAAc,iBAAiB,kBAAkB;AACnE;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT,kBAAkB,cAAc,kBAAkB,kBAAkB;AACpE,kBAAkB,cAAc,kBAAkB,kBAAkB;AACpE;AACA;AACA,kBAAkB,kBAAkB;AACpC,kBAAkB,kBAAkB;AACpC;AACA;AACA,SAAS;AACT;AACA;AACA,kBAAkB,kBAAkB;AACpC,kBAAkB,kBAAkB;AACpC;AACA;AACA,SAAS;AACT;AACA,sBAAsB,6CAAK,CAAC,mDAAY;AACxC,QAAQ,qDAAS;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,iBAAiB;AAC7B,4BAA4B,cAAc,kBAAkB,kBAAkB,kBAAkB,uDAAU;AAC1G,4BAA4B,cAAc,kBAAkB,kBAAkB;AAC9E;AACA;AACA;AACA;AACA;AACA,YAAY,iBAAiB;AAC7B;AACA,kBAAkB,cAAc,iBAAiB,kBAAkB;AACnE,kBAAkB,cAAc,iBAAiB,kBAAkB;AACnE,kBAAkB,cAAc,iBAAiB,kBAAkB;AACnE;AACA,sBAAsB,6CAAK,CAAC,mDAAY;AACxC,QAAQ,qDAAS;AACjB;AACA,IAAI,8DAAqB;AACzB;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,IAAI,6DAAoB;AACxB;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,wEAAqB;AACE;;;;;;;;;;;;;;;;AChMvB;AACA;AACA;AACA;AACsD;AACtD;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA,KAAK;AACL;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,wDAAwD,YAAY;AACpE,uCAAuC,aAAa;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,wDAAwD,YAAY;AACpE,uCAAuC,aAAa;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,8DAA8D;AACtF,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,UAAU;AAClC,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAqB;AACO;;;;;;;;;;;;;;;;;ACxG5B;AACA;AACA;AACA;AACsD;AACD;AACrD;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,+BAA+B,6EAA6B;AAC5D;AACA;AACA;AACA;AACA,kCAAkC,qEAAqB;AACvD;AACA,uCAAuC,oEAAoB,GAAG,yCAAyC;AACvG;AACA;AACA,mCAAmC,oEAAoB,GAAG,uDAAuD;AACjH;AACA;AACA;AACA;AACA;AACA;AACA,wEAAqB;AACS;;;;;;;;;;;;;;;;;;;;;;ACjC9B;AACA;AACA;AACA;AACsD;AACT;AACV;AACA;AACA;AACE;AACM;AAC3C;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,cAAc,2EAAwB;AACtC,4BAA4B,OAAO;AACnC;AACA;AACA;AACA,yBAAyB,gEAAgE;AACzF,wCAAwC,WAAW;AACnD,wCAAwC,WAAW;AACnD,sBAAsB,gEAAgE;AACtF;AACA,yBAAyB,gEAAgE;AACzF,wCAAwC,WAAW;AACnD,wCAAwC,WAAW;AACnD;AACA;AACA,qBAAqB,6CAA6C,mBAAmB,wEAA6B;AAClH,qBAAqB,oCAAoC;AACzD,qBAAqB,8BAA8B,mBAAmB,uEAA4B;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC,4BAA4B,OAAO;AACnC;AACA;AACA,sBAAsB,kD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yBAAyB,4BAA4B;AACrD,SAAS,aAAa;AACtB;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA,4BAA4B,sBAAsB,4DAAoB,EAAE;AACxE;AACA;AACA;AACA;AACA,wEAAqB;AACI;;;;;;;;;;;;;;;;;AC7NzB;AACA;AACA;AACA;AAC8D;AAC3B;AACnC;AACA;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2EAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,4DAAqB;AACjC,YAAY,4DAAqB;AACjC,YAAY,4DAAqB;AACjC,iBAAiB,yDAAM;AACvB;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,YAAY,2EAA2E,cAAc,0BAA0B,cAAc;AACvM,0DAA0D,+BAA+B;AACzF;AACA;AACA,mCAAmC,+BAA+B;AAClE,mCAAmC,+BAA+B;AAClE,CAAC;AACD;AACA;AACA;AACA,wFAAwF,YAAY,wFAAwF,cAAc,gCAAgC,cAAc;AACxP;AACA;AACA,mCAAmC,+BAA+B;AAClE,mCAAmC,gCAAgC;AACnE;AACA;AACA,mCAAmC,+BAA+B;AAClE,mCAAmC,+BAA+B;AAClE,CAAC;AACD;AACA;AACA;AACA,0EAA0E,YAAY,0CAA0C,cAAc,0BAA0B,cAAc;AACtL;AACA;AACA,mCAAmC,+BAA+B;AAClE,mCAAmC,+BAA+B;AAClE,0DAA0D,+BAA+B;AACzF,0DAA0D,+BAA+B;AACzF,CAAC;AACD;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA;AACA,gCAAgC,2BAA2B;AAC3D;AACA;AACA,iGAAiG,YAAY;AAC7G;AACA;AACA,aAAa;AACb,0BAA0B,2DAA2D;AACrF;AACA;AACA,6BAA6B,4DAAqB,uBAAuB,4DAAqB;AAC9F,wEAAwE,aAAa;AACrF;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA,gCAAgC,2BAA2B;AAC3D;AACA,kFAAkF,YAAY,KAAK,aAAa;AAChH,oFAAoF,cAAc,KAAK,aAAa;AACpH,kFAAkF,cAAc,KAAK,aAAa;AAClH;AACA,6BAA6B,2DAA2D;AACxF,6BAA6B,iDAAiD;AAC9E,iBAAiB,aAAa;AAC9B;AACA,wEAAwE,aAAa;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA;AACA,gCAAgC,2BAA2B;AAC3D;AACA,oFAAoF,aAAa;AACjG,sFAAsF,aAAa;AACnG,oFAAoF,aAAa;AACjG,sCAAsC,2DAA2D,MAAM,aAAa;AACpH;AACA,wEAAwE,aAAa;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAqB;AACO;;;;;;;;;;;;;;;;;;;ACtJ5B;AACA;AACA;AACA;AACsD;AACnB;AACc;AACV;AACvC;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,mBAAmB,yDAAW;AAC9B;AACA;AACA;AACA,sBAAsB,sDAAe;AACrC;AACA,YAAY,gDAAY;AACxB,YAAY,gDAAY;AACxB,YAAY,gDAAY;AACxB;AACA,mBAAmB,yDAAW;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAqB;AACO;;;;;;;;;;;;;;;;;;;ACvC5B;AACA;AACA;AACA;AACsD;AACjB;AACkB;AACF;AACrD;AACA;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,wBAAwB,6DAAa;AACrC;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,6CAAK;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,6CAAK;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,6CAAK;AACb;AACA;AACA;AACA;AACA,QAAQ,6CAAK;AACb;AACA;AACA;AACA;AACA,QAAQ,6CAAK;AACb;AACA;AACA;AACA;AACA,QAAQ,6CAAK;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,6CAAK;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,kBAAkB;AACtE,oFAAoF,SAAS;AAC7F,uBAAuB,6CAAK;AAC5B;AACA;AACA;AACA;AACA;AACA,uBAAuB,6CAAK;AAC5B,uBAAuB,6CAAK;AAC5B,QAAQ,+DAAc;AACtB,QAAQ,+DAAc;AACtB,QAAQ,+DAAc;AACtB;AACA;AACA;AACA,cAAc,2EAAwB;AACtC,4BAA4B,YAAY;AACxC;AACA,sBAAsB,8CAA8C;AACpE,wBAAwB,aAAa;AACrC,sBAAsB,4CAA4C;AAClE,sBAAsB,6CAA6C;AACnE,wBAAwB,WAAW;AACnC,sBAAsB,0DAA0D;AAChF,wBAAwB,aAAa;AACrC,sBAAsB,8CAA8C;AACpE;AACA;AACA;AACA;AACA;AACA;AACA,wEAAqB;AACS;;;;;;;;;;;;;;;;;;AC1I9B;AACA;AACA;AACA;AACsD;AACR;AACL;AACzC;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA,KAAK;AACL;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,6BAA6B,YAAY,gBAAgB,kEAAmB;AAC5E,qDAAqD,YAAY;AACjE,8BAA8B,iDAAO;AACrC,8BAA8B,iDAAO;AACrC,8BAA8B,iDAAO;AACrC;AACA;AACA;AACA;AACA,iBAAiB,oEAAoE;AACrF,uBAAuB,kEAAmB;AAC1C,qDAAqD,cAAc;AACnE,8BAA8B,iDAAO;AACrC,8BAA8B,iDAAO;AACrC,8BAA8B,iDAAO;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC;AACA;AACA,6BAA6B,YAAY,gBAAgB,kEAAmB;AAC5E,qDAAqD,YAAY;AACjE,yBAAyB,iDAAO;AAChC;AACA;AACA,yBAAyB,iDAAO;AAChC;AACA;AACA,yBAAyB,iDAAO;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,oEAAoE;AACrF,uBAAuB,kEAAmB;AAC1C,qDAAqD,cAAc;AACnE,yBAAyB,iDAAO;AAChC;AACA;AACA,yBAAyB,iDAAO;AAChC;AACA;AACA,yBAAyB,iDAAO;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAqB;AACG;;;;;;;;;;;;;;;;;AClFxB;AACA;AACA;AACA;AACsD;AACf;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,+CAAM;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,+CAAM;AAC7B;AACA;AACA;AACA;AACA;AACA,uBAAuB,+CAAM;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAqB;AACE;;;;;;;;;;;;;;;;;;;;ACtEvB;AACA;AACA;AACA;AACsD;AACrB;AACY;AACV;AACI;AACvC;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,8CAAO;AAC1C,qCAAqC,gDAAS;AAC9C;AACA;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC,4BAA4B,0BAA0B;AACtD;AACA,UAAU,8BAA8B;AACxC,UAAU,8BAA8B;AACxC,UAAU,8BAA8B;AACxC,UAAU,8BAA8B;AACxC,UAAU,8BAA8B;AACxC,UAAU,8BAA8B;AACxC;AACA;AACA;AACA,eAA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CL;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA,QAAQ,qDAAS;AACjB;AACA;AACA;AACA;AACA,cAAc,2EAAwB;AACtC,4BAA4B,cAAc;AAC1C;AACA;AACA,UAAU,8BAA8B;AACxC,UAAU,8BAA8B;AACxC,UAAU,8BAA8B;AACxC,UAAU,8BAA8B;AACxC,UAAU,8BAA8B;AACxC,UAAU,8BAA8B;AACxC,UAAU,8BAA8B;AACxC;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA,iBAAiB,QAAQ,+BAA+B;AACxD;AACA;AACA,QAAQ,qDAAS;AACjB;AACA;AACA;AACA,wEAAqB;AACE;;;;;;;;;;;;;;;;;;;;;ACrdvB;AACA;AACA;AACA;AACA;AACA;AACA;AACsD;AACD;AACR;AACQ;AACZ;AACuE;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,kBAAkB,qDAAS,GAAG,8BAA8B;AAC5D,OAAO,2DAAW;AAClB,OAAO,0DAAU;AACjB,UAAU,yDAAS;AACnB,kBAAkB,iDAAO,GAAG,cAAc,iBAAiB,kBAAkB;AAC7E,OAAO,yDAAS;AAChB,UAAU,2DAAW;AACrB,OAAO,sDAAM;AACb,OAAO,+DAAe;AACtB,OAAO,sDAAM;AACb;AACA;AACA;AACA,oBAAoB,6DAAa;AACjC,OAAO,+DAAe;AACtB;AACA;AACA;AACA;AACA;AACA,OAAO,+DAAe;AACtB,UAAU,sDAAM;AAChB,OAAO,0DAAU;AACjB,OAAO,2DAAW;AAClB,OAAO,0DAAU;AACjB,UAAU,sDAAM;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,sEAAsB;AACvD;AACA;AACA;AACA,6BAA6B,8DAAkB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,sEAAsB;AACvD;AACA;AACA,6BAA6B,8DAAkB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAqB;AACK;;;;;;;;;;;;;;;;;;;;ACvG1B;AACA;AACA;AACA;AAC6D;AAClB;AAC3C,eAAe,uDAAY;AAC3B;AACA;AACA;AACA,wBAAwB,yDAAiB;AACzC,IAAI,yDAAiB;AACrB;AACA;AACA,IAAI,yDAAiB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,gEAAwB;AACrC;AACA;AACA;AACA;AACA;AACA,aAAa,6DAAqB;AAClC;AACA;AACA;AACA;AACA;AACA,aAAa,gEAAwB;AACrC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,cAAc,YAAY,kBAAkB;AAC5C;AACA,oBAAoB,WAAW;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,YAAY;AAC5B;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,QAAQ,IAAI,UAAU;AACnE;AACA,gCAAgC,QAAQ;AACxC;AACA;AACA;AACA;AACA;AACA,gBAAgB,qBAAqB;AACrC,mBAAmB,+CAAO,GAAG,YAAY,qCAAqC;AAC9E;AACA;AACA;AACA;AACA;AACA,qEAAqE,yBAAyB,gCAAgC;AAC9H;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,sBAAsB,gCAAgC;AAC3H;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,uBAAuB,gCAAgC;AAC5H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,4DAAoB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,SAAS;AAC7D,gCAAgC,2BAA2B,GAAG,WAAW,GAAG,SAAS,EAAE,SAAS;AAChG,0DAA0D;AAC1D;AACA,yEAAyE,oBAAoB;AAC7F;AACA;AACA;AACA;AACA,2BAA2B,wEAAwE;AACnG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,kBAAkB;AACnF;AACA,gEAAgE,UAAU,IAAI,cAAc;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,OAAO,EAAE,yBAAyB,GAAG,mBAAmB,GAAG,cAAc;AAC5G;AACA,kCAAkC;AAClC,0CAA0C,6DAAqB;AAC/D,+CAA+C,8DAAsB,GAAG,iEAAyB;AACjG;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,uDAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACO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AACA,SAAS,kBAAkB,+CAAO;AAClC;AACA,0BAA0B,kBAAkB;AAC5C;AACA,SAAS,kBAAkB,+CAAO;AAClC;AACA,IAAI,+DAAuB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uDAAe,EAAE,yEAAsB;AACvD,sBAAsB,gDAAQ;AAC9B;AACA;AACA;AACA,kBAAkB,iBAAiB;AACnC,kBAAkB,iBAAiB;AACnC;AACA;AACA,SAAS;AACT,6BAA6B,4CAAI;AACjC,6BAA6B,4CAAI;AACjC,6BAA6B,+CAAO;AACpC;AACA,0BAA0B,kBAAkB;AAC5C;AACA,SAAS;AACT,6BAA6B,4CAAI;AACjC,6BAA6B,+CAAO;AACpC;AACA,0BAA0B,kBAAkB;AAC5C;AACA,SAAS,kBAAkB,+CAAO;AAClC;AACA,IAAI,+DAAuB;AAC3B;AACA;AACA,wEAAqB;AACG;;;;;;;;;;;;;;;;ACxGxB;AACA;AACA;AACA;AACA;AACA;AACsD;AACtD;AACA;AACA;AACA,oBAAoB,wEAAqB;AACzC;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,wBAAwB,2EAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,SAAS;AAC5B,KAAK;AACL,CAAC;AACD;AACA;AACA;AACA;AACA,mBAAmB,sBAAsB;AACzC,KAAK;AACL,CAAC;AACD;AACA;AACA;AACA;AACA,mBAAmB,sBAAsB;AACzC,KAAK;AACL,CAAC;AACD,wEAAqB;AACU;;;;;;;;;;;;;;;;;;;;;;;ACnD/B;AACA;AACA;AACA;AACsD;AACnB;AACU;AACR;AACS;AACD;AACR;AACE;AACvC;AACA;AACA;AACA;AACA;AACA,QAAQ,wEAAqB;AAC7B,KAAK;AACL;AACA,kBAAkB,sDAAe;AACjC;AACA,iCAAiC,gDAAY;AAC7C;AACA;AACA;AACA,sBAAsB,6CAAK,CAAC,mDAAY;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,6CAAK,CAAC,mDAAY;AACxC;AACA;AACA;AACA;AACA;AACA,sBAAsB,6CAAK,sEAAsE,+DAAgB;AACjH;AACA,YAAY,qDAAS,GAAG,8BAA8B;AACtD,YAAY,qDAAS,GAAG,8BAA8B;AACtD,YAAY,qDAAS,GAAG,+BAA+B;AACvD;AACA;AACA,sBAAsB,6CAAK,CAAC,mDAAY,UAAU,uDAAe;AACjE,QAAQ,qDAAS;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,qDAAS,GAAG,8BAA8B;AACjF;AACA,wEAAqB;AACC;;;;;;;UC3EtB;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC;;;;;WCPD;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACgC;AACH;AACE;AAC/B,iEAAe,yCAAG,EAAC","sources":["webpack://Vex/webpack/universalModuleDefinition","webpack://Vex/./src/version.ts","webpack://Vex/./entry/vexflow.ts","webpack://Vex/./src/accidental.ts","webpack://Vex/./src/annotation.ts","webpack://Vex/./src/articulation.ts","webpack://Vex/./src/barnote.ts","webpack://Vex/./src/beam.ts","webpack://Vex/./src/bend.ts","webpack://Vex/./src/boundingbox.ts","webpack://Vex/./src/boundingboxcomputation.ts","webpack://Vex/./src/canvascontext.ts","webpack://Vex/./src/chordsymbol.ts","webpack://Vex/./src/clef.ts","webpack://Vex/./src/clefnote.ts","webpack://Vex/./src/crescendo.ts","webpack://Vex/./src/curve.ts","webpack://Vex/./src/dot.ts","webpack://Vex/./src/easyscore.ts","webpack://Vex/./src/element.ts","webpack://Vex/./src/factory.ts","webpack://Vex/./src/flow.ts","webpack://Vex/./src/font.ts","webpack://Vex/./src/fonts/bravura_glyphs.ts","webpack://Vex/./src/fonts/bravura_metrics.ts","webpack://Vex/./src/fonts/custom_glyphs.ts","webpack://Vex/./src/fonts/custom_metrics.ts","webpack://Vex/./src/fonts/gonville_glyphs.ts","webpack://Vex/./src/fonts/gonville_metrics.ts","webpack://Vex/./src/fonts/load_all.ts","webpack://Vex/./src/fonts/load_bravura.ts","webpack://Vex/./src/fonts/load_custom.ts","webpack://Vex/./src/fonts/load_gonville.ts","webpack://Vex/./src/fonts/load_petaluma.ts","webpack://Vex/./src/fonts/petaluma_glyphs.ts","webpack://Vex/./src/fonts/petaluma_metrics.ts","webpack://Vex/./src/fonts/petalumascript_glyphs.ts","webpack://Vex/./src/fonts/robotoslab_glyphs.ts","webpack://Vex/./src/fonts/textfonts.ts","webpack://Vex/./src/formatter.ts","webpack://Vex/./src/fraction.ts","webpack://Vex/./src/frethandfinger.ts","webpack://Vex/./src/ghostnote.ts","webpack://Vex/./src/glyph.ts","webpack://Vex/./src/glyphnote.ts","webpack://Vex/./src/gracenote.ts","webpack://Vex/./src/gracenotegroup.ts","webpack://Vex/./src/gracetabnote.ts","webpack://Vex/./src/index.ts","webpack://Vex/./src/keymanager.ts","webpack://Vex/./src/keysignature.ts","webpack://Vex/./src/keysignote.ts","webpack://Vex/./src/modifier.ts","webpack://Vex/./src/modifiercontext.ts","webpack://Vex/./src/multimeasurerest.ts","webpack://Vex/./src/music.ts","webpack://Vex/./src/note.ts","webpack://Vex/./src/notehead.ts","webpack://Vex/./src/notesubgroup.ts","webpack://Vex/./src/ornament.ts","webpack://Vex/./src/parenthesis.ts","webpack://Vex/./src/parser.ts","webpack://Vex/./src/pedalmarking.ts","webpack://Vex/./src/registry.ts","webpack://Vex/./src/rendercontext.ts","webpack://Vex/./src/renderer.ts","webpack://Vex/./src/repeatnote.ts","webpack://Vex/./src/stave.ts","webpack://Vex/./src/stavebarline.ts","webpack://Vex/./src/staveconnector.ts","webpack://Vex/./src/stavehairpin.ts","webpack://Vex/./src/staveline.ts","webpack://Vex/./src/stavemodifier.ts","webpack://Vex/./src/stavenote.ts","webpack://Vex/./src/staverepetition.ts","webpack://Vex/./src/stavesection.ts","webpack://Vex/./src/stavetempo.ts","webpack://Vex/./src/stavetext.ts","webpack://Vex/./src/stavetie.ts","webpack://Vex/./src/stavevolta.ts","webpack://Vex/./src/stem.ts","webpack://Vex/./src/stemmablenote.ts","webpack://Vex/./src/stringnumber.ts","webpack://Vex/./src/strokes.ts","webpack://Vex/./src/svgcontext.ts","webpack://Vex/./src/system.ts","webpack://Vex/./src/tables.ts","webpack://Vex/./src/tabnote.ts","webpack://Vex/./src/tabslide.ts","webpack://Vex/./src/tabstave.ts","webpack://Vex/./src/tabtie.ts","webpack://Vex/./src/textbracket.ts","webpack://Vex/./src/textdynamics.ts","webpack://Vex/./src/textformatter.ts","webpack://Vex/./src/textnote.ts","webpack://Vex/./src/tickable.ts","webpack://Vex/./src/tickcontext.ts","webpack://Vex/./src/timesigglyph.ts","webpack://Vex/./src/timesignature.ts","webpack://Vex/./src/timesignote.ts","webpack://Vex/./src/tremolo.ts","webpack://Vex/./src/tuning.ts","webpack://Vex/./src/tuplet.ts","webpack://Vex/./src/typeguard.ts","webpack://Vex/./src/util.ts","webpack://Vex/./src/vex.ts","webpack://Vex/./src/vibrato.ts","webpack://Vex/./src/vibratobracket.ts","webpack://Vex/./src/voice.ts","webpack://Vex/./src/web.ts","webpack://Vex/./tests/accidental_tests.ts","webpack://Vex/./tests/annotation_tests.ts","webpack://Vex/./tests/articulation_tests.ts","webpack://Vex/./tests/auto_beam_formatting_tests.ts","webpack://Vex/./tests/bach_tests.ts","webpack://Vex/./tests/barline_tests.ts","webpack://Vex/./tests/beam_tests.ts","webpack://Vex/./tests/bend_tests.ts","webpack://Vex/./tests/boundingbox_tests.ts","webpack://Vex/./tests/boundingboxcomputation_tests.ts","webpack://Vex/./tests/chordsymbol_tests.ts","webpack://Vex/./tests/clef_tests.ts","webpack://Vex/./tests/curve_tests.ts","webpack://Vex/./tests/dot_tests.ts","webpack://Vex/./tests/easyscore_tests.ts","webpack://Vex/./tests/factory_tests.ts","webpack://Vex/./tests/font_tests.ts","webpack://Vex/./tests/formatter_tests.ts","webpack://Vex/./tests/fraction_tests.ts","webpack://Vex/./tests/ghostnote_tests.ts","webpack://Vex/./tests/glyphnote_tests.ts","webpack://Vex/./tests/gracenote_tests.ts","webpack://Vex/./tests/gracetabnote_tests.ts","webpack://Vex/./tests/index.ts","webpack://Vex/./tests/key_clef_tests.ts","webpack://Vex/./tests/keymanager_tests.ts","webpack://Vex/./tests/keysignature_tests.ts","webpack://Vex/./tests/mocks.ts","webpack://Vex/./tests/modifier_tests.ts","webpack://Vex/./tests/multimeasurerest_tests.ts","webpack://Vex/./tests/music_tests.ts","webpack://Vex/./tests/notehead_tests.ts","webpack://Vex/./tests/notesubgroup_tests.ts","webpack://Vex/./tests/offscreencanvas_tests.ts","webpack://Vex/./tests/ornament_tests.ts","webpack://Vex/./tests/parser_tests.ts","webpack://Vex/./tests/pedalmarking_tests.ts","webpack://Vex/./tests/percussion_tests.ts","webpack://Vex/./tests/registry_tests.ts","webpack://Vex/./tests/renderer_tests.ts","webpack://Vex/./tests/rests_tests.ts","webpack://Vex/./tests/rhythm_tests.ts","webpack://Vex/./tests/stave_tests.ts","webpack://Vex/./tests/staveconnector_tests.ts","webpack://Vex/./tests/stavehairpin_tests.ts","webpack://Vex/./tests/staveline_tests.ts","webpack://Vex/./tests/stavemodifier_tests.ts","webpack://Vex/./tests/stavenote_tests.ts","webpack://Vex/./tests/stavetie_tests.ts","webpack://Vex/./tests/stringnumber_tests.ts","webpack://Vex/./tests/strokes_tests.ts","webpack://Vex/./tests/style_tests.ts","webpack://Vex/./tests/tabnote_tests.ts","webpack://Vex/./tests/tabslide_tests.ts","webpack://Vex/./tests/tabstave_tests.ts","webpack://Vex/./tests/tabtie_tests.ts","webpack://Vex/./tests/textbracket_tests.ts","webpack://Vex/./tests/textformatter_tests.ts","webpack://Vex/./tests/textnote_tests.ts","webpack://Vex/./tests/threevoice_tests.ts","webpack://Vex/./tests/tickcontext_tests.ts","webpack://Vex/./tests/timesignature_tests.ts","webpack://Vex/./tests/tremolo_tests.ts","webpack://Vex/./tests/tuning_tests.ts","webpack://Vex/./tests/tuplet_tests.ts","webpack://Vex/./tests/typeguard_tests.ts","webpack://Vex/./tests/vexflow_test_helpers.ts","webpack://Vex/./tests/vf_prefix_tests.ts","webpack://Vex/./tests/vibrato_tests.ts","webpack://Vex/./tests/vibratobracket_tests.ts","webpack://Vex/./tests/voice_tests.ts","webpack://Vex/webpack/bootstrap","webpack://Vex/webpack/runtime/define property getters","webpack://Vex/webpack/runtime/global","webpack://Vex/webpack/runtime/hasOwnProperty shorthand","webpack://Vex/webpack/runtime/make namespace object","webpack://Vex/./entry/vexflow-debug-with-tests.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Vex\"] = factory();\n\telse\n\t\troot[\"Vex\"] = factory();\n})((typeof window !== 'undefined' ? window : typeof globalThis !== 'undefined' ? globalThis : this), function() {\nreturn ","export const VERSION = '4.0.1-alpha.2';\nexport const ID = '0df10df6d1fab3a99f5aa306341a31c6e686d659';\nexport const DATE = '2022-02-02T09:30:30.784Z';\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// vexflow.ts is the entry point for the build output file vexflow.js.\n// It statically bundles all the music engraving fonts, and sets the music font stack to:\n// Flow.setMusicFont('Bravura', 'Gonville', 'Custom');\n// The webpack config inside Gruntfile.js sets the mode to 'production' to produce a minified build.\nimport { Vex } from '../src/vex';\nimport { Flow } from '../src/flow';\nimport { loadAllMusicFonts } from '../src/fonts/load_all';\nimport { loadTextFonts } from '../src/fonts/textfonts';\nloadAllMusicFonts();\nFlow.setMusicFont('Bravura', 'Gonville', 'Custom');\nloadTextFonts();\nexport * from '../src/index';\nexport default Vex;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// @author Mohit Cheppudira\n// @author Greg Ristow (modifications)\nimport { Fraction } from './fraction';\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Music } from './music';\nimport { Tables } from './tables';\nimport { Category, isAccidental, isGraceNote, isGraceNoteGroup, isStaveNote } from './typeguard';\nimport { defined, log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Accidental.DEBUG)\n log('Vex.Flow.Accidental', args);\n}\n/**\n * An `Accidental` inherits from `Modifier`, and is formatted within a\n * `ModifierContext`. Accidentals are modifiers that can be attached to\n * notes. Support is included for both western and microtonal accidentals.\n *\n * See `tests/accidental_tests.ts` for usage examples.\n */\nexport class Accidental extends Modifier {\n /**\n * Create accidental.\n * @param type value from `Vex.Flow.accidentalCodes.accidentals` table in `tables.ts`.\n * For example: `#`, `##`, `b`, `n`, etc.\n */\n constructor(type) {\n super();\n L('New accidental: ', type);\n this.type = type;\n this.position = Modifier.Position.LEFT;\n this.render_options = {\n // Font size for glyphs\n font_scale: 38,\n // Padding between accidental and parentheses on each side\n parenLeftPadding: 2,\n parenRightPadding: 2,\n };\n this.accidental = Tables.accidentalCodes(this.type);\n defined(this.accidental, 'ArgumentError', `Unknown accidental type: ${type}`);\n // Cautionary accidentals have parentheses around them\n this.cautionary = false;\n this.reset();\n }\n /** Accidentals category string. */\n static get CATEGORY() {\n return Category.Accidental;\n }\n /** Arrange accidentals inside a ModifierContext. */\n static format(accidentals, state) {\n // If there are no accidentals, no need to format their positions.\n if (!accidentals || accidentals.length === 0)\n return;\n const musicFont = Tables.currentMusicFont();\n const noteheadAccidentalPadding = musicFont.lookupMetric('accidental.noteheadAccidentalPadding');\n const leftShift = state.left_shift + noteheadAccidentalPadding;\n const accidentalSpacing = musicFont.lookupMetric('accidental.accidentalSpacing');\n const additionalPadding = musicFont.lookupMetric('accidental.leftPadding'); // padding to the left of all accidentals\n const accList = [];\n let prevNote = undefined;\n let shiftL = 0;\n // First determine the accidentals' Y positions from the note.keys\n for (let i = 0; i < accidentals.length; ++i) {\n const acc = accidentals[i];\n const note = acc.getNote();\n const stave = note.getStave();\n const index = acc.checkIndex();\n const props = note.getKeyProps()[index];\n if (note !== prevNote) {\n // Iterate through all notes to get the displaced pixels\n for (let n = 0; n < note.keys.length; ++n) {\n shiftL = Math.max(note.getLeftDisplacedHeadPx(), shiftL);\n }\n prevNote = note;\n }\n if (stave) {\n const lineSpace = stave.getSpacingBetweenLines();\n const y = stave.getYForLine(props.line);\n const accLine = Math.round((y / lineSpace) * 2) / 2;\n accList.push({ y, line: accLine, shift: shiftL, acc, lineSpace });\n }\n else {\n accList.push({ line: props.line, shift: shiftL, acc });\n }\n }\n // Sort accidentals by line number.\n accList.sort((a, b) => b.line - a.line);\n // FIXME: Confusing name. Each object in this array has a property called `line`.\n // So if this is a list of lines, you end up with: `line.line` which is very awkward.\n const lineList = [];\n // amount by which all accidentals must be shifted right or left for\n // stem flipping, notehead shifting concerns.\n let accShift = 0;\n let previousLine = undefined;\n // Create an array of unique line numbers (lineList) from accList\n for (let i = 0; i < accList.length; i++) {\n const acc = accList[i];\n // if this is the first line, or a new line, add a lineList\n if (previousLine === undefined || previousLine !== acc.line) {\n lineList.push({\n line: acc.line,\n flatLine: true,\n dblSharpLine: true,\n numAcc: 0,\n width: 0,\n column: 0,\n });\n }\n // if this accidental is not a flat, the accidental needs 3.0 lines lower\n // clearance instead of 2.5 lines for b or bb.\n // FIXME: Naming could use work. acc.acc is very awkward\n if (acc.acc.type !== 'b' && acc.acc.type !== 'bb') {\n lineList[lineList.length - 1].flatLine = false;\n }\n // if this accidental is not a double sharp, the accidental needs 3.0 lines above\n if (acc.acc.type !== '##') {\n lineList[lineList.length - 1].dblSharpLine = false;\n }\n // Track how many accidentals are on this line:\n lineList[lineList.length - 1].numAcc++;\n // Track the total x_offset needed for this line which will be needed\n // for formatting lines w/ multiple accidentals:\n // width = accidental width + universal spacing between accidentals\n lineList[lineList.length - 1].width += acc.acc.getWidth() + accidentalSpacing;\n // if this accShift is larger, use it to keep first column accidentals in the same line\n accShift = acc.shift > accShift ? acc.shift : accShift;\n previousLine = acc.line;\n }\n // ### Place Accidentals in Columns\n //\n // Default to a classic triangular layout (middle accidental farthest left),\n // but follow exceptions as outlined in G. Read's _Music Notation_ and\n // Elaine Gould's _Behind Bars_.\n //\n // Additionally, this implements different vertical collision rules for\n // flats (only need 2.5 lines clearance below) and double sharps (only\n // need 2.5 lines of clearance above or below).\n //\n // Classic layouts and exception patterns are found in the 'tables.js'\n // in 'Tables.accidentalColumnsTable'\n //\n // Beyond 6 vertical accidentals, default to the parallel ascending lines approach,\n // using as few columns as possible for the verticle structure.\n //\n // TODO (?): Allow column to be specified for an accidental at run-time?\n let totalColumns = 0;\n // establish the boundaries for a group of notes with clashing accidentals:\n for (let i = 0; i < lineList.length; i++) {\n let noFurtherConflicts = false;\n const groupStart = i;\n let groupEnd = i;\n while (groupEnd + 1 < lineList.length && !noFurtherConflicts) {\n // if this note conflicts with the next:\n if (this.checkCollision(lineList[groupEnd], lineList[groupEnd + 1])) {\n // include the next note in the group:\n groupEnd++;\n }\n else {\n noFurtherConflicts = true;\n }\n }\n // Gets an a line from the `lineList`, relative to the current group\n const getGroupLine = (index) => lineList[groupStart + index];\n const getGroupLines = (indexes) => indexes.map(getGroupLine);\n const lineDifference = (indexA, indexB) => {\n const [a, b] = getGroupLines([indexA, indexB]).map((item) => item.line);\n return a - b;\n };\n const notColliding = (...indexPairs) => indexPairs.map(getGroupLines).every(([line1, line2]) => !this.checkCollision(line1, line2));\n // Set columns for the lines in this group:\n const groupLength = groupEnd - groupStart + 1;\n // Set the accidental column for each line of the group\n let endCase = this.checkCollision(lineList[groupStart], lineList[groupEnd]) ? 'a' : 'b';\n switch (groupLength) {\n case 3:\n if (endCase === 'a' && lineDifference(1, 2) === 0.5 && lineDifference(0, 1) !== 0.5) {\n endCase = 'second_on_bottom';\n }\n break;\n case 4:\n if (notColliding([0, 2], [1, 3])) {\n endCase = 'spaced_out_tetrachord';\n }\n break;\n case 5:\n if (endCase === 'b' && notColliding([1, 3])) {\n endCase = 'spaced_out_pentachord';\n if (notColliding([0, 2], [2, 4])) {\n endCase = 'very_spaced_out_pentachord';\n }\n }\n break;\n case 6:\n if (notColliding([0, 3], [1, 4], [2, 5])) {\n endCase = 'spaced_out_hexachord';\n }\n if (notColliding([0, 2], [2, 4], [1, 3], [3, 5])) {\n endCase = 'very_spaced_out_hexachord';\n }\n break;\n default:\n break;\n }\n let groupMember;\n let column;\n // If the group contains seven members or more, use ascending parallel lines\n // of accidentals, using as few columns as possible while avoiding collisions.\n if (groupLength >= 7) {\n // First, determine how many columns to use:\n let patternLength = 2;\n let collisionDetected = true;\n while (collisionDetected === true) {\n collisionDetected = false;\n for (let line = 0; line + patternLength < lineList.length; line++) {\n if (this.checkCollision(lineList[line], lineList[line + patternLength])) {\n collisionDetected = true;\n patternLength++;\n break;\n }\n }\n }\n // Then, assign a column to each line of accidentals\n for (groupMember = i; groupMember <= groupEnd; groupMember++) {\n column = ((groupMember - i) % patternLength) + 1;\n lineList[groupMember].column = column;\n totalColumns = totalColumns > column ? totalColumns : column;\n }\n }\n else {\n // If the group contains fewer than seven members, use the layouts from\n // the Tables.accidentalColumnsTable (See: tables.ts).\n for (groupMember = i; groupMember <= groupEnd; groupMember++) {\n column = Tables.accidentalColumnsTable[groupLength][endCase][groupMember - i];\n lineList[groupMember].column = column;\n totalColumns = totalColumns > column ? totalColumns : column;\n }\n }\n // Increment i to the last note that was set, so that if a lower set of notes\n // does not conflict at all with this group, it can have its own classic shape.\n i = groupEnd;\n }\n // ### Convert Columns to x_offsets\n //\n // This keeps columns aligned, even if they have different accidentals within them\n // which sometimes results in a larger x_offset than is an accidental might need\n // to preserve the symmetry of the accidental shape.\n //\n // Neither A.C. Vinci nor G. Read address this, and it typically only happens in\n // music with complex chord clusters.\n //\n // TODO (?): Optionally allow closer compression of accidentals, instead of forcing\n // parallel columns.\n // track each column's max width, which will be used as initial shift of later columns:\n const columnWidths = [];\n const columnXOffsets = [];\n for (let i = 0; i <= totalColumns; i++) {\n columnWidths[i] = 0;\n columnXOffsets[i] = 0;\n }\n columnWidths[0] = accShift + leftShift;\n columnXOffsets[0] = accShift + leftShift;\n // Fill columnWidths with widest needed x-space;\n // this is what keeps the columns parallel.\n lineList.forEach((line) => {\n if (line.width > columnWidths[line.column])\n columnWidths[line.column] = line.width;\n });\n for (let i = 1; i < columnWidths.length; i++) {\n // this column's offset = this column's width + previous column's offset\n columnXOffsets[i] = columnWidths[i] + columnXOffsets[i - 1];\n }\n const totalShift = columnXOffsets[columnXOffsets.length - 1];\n // Set the xShift for each accidental according to column offsets:\n let accCount = 0;\n lineList.forEach((line) => {\n let lineWidth = 0;\n const lastAccOnLine = accCount + line.numAcc;\n // handle all of the accidentals on a given line:\n for (accCount; accCount < lastAccOnLine; accCount++) {\n const xShift = columnXOffsets[line.column - 1] + lineWidth;\n accList[accCount].acc.setXShift(xShift);\n // keep track of the width of accidentals we've added so far, so that when\n // we loop, we add space for them.\n lineWidth += accList[accCount].acc.getWidth() + accidentalSpacing;\n L('Line, accCount, shift: ', line.line, accCount, xShift);\n }\n });\n // update the overall layout with the full width of the accidental shapes:\n state.left_shift += totalShift + additionalPadding;\n }\n /** Helper function to determine whether two lines of accidentals collide vertically */\n static checkCollision(line1, line2) {\n let clearance = line2.line - line1.line;\n let clearanceRequired = 3;\n // But less clearance is required for certain accidentals: b, bb and ##.\n if (clearance > 0) {\n // then line 2 is on top\n clearanceRequired = line2.flatLine || line2.dblSharpLine ? 2.5 : 3.0;\n if (line1.dblSharpLine)\n clearance -= 0.5;\n }\n else {\n // line 1 is on top\n clearanceRequired = line1.flatLine || line1.dblSharpLine ? 2.5 : 3.0;\n if (line2.dblSharpLine)\n clearance -= 0.5;\n }\n const collision = Math.abs(clearance) < clearanceRequired;\n L('Line_1, Line_2, Collision: ', line1.line, line2.line, collision);\n return collision;\n }\n /**\n * Use this method to automatically apply accidentals to a set of `voices`.\n * The accidentals will be remembered between all the voices provided.\n * Optionally, you can also provide an initial `keySignature`.\n */\n static applyAccidentals(voices, keySignature) {\n const tickPositions = [];\n const tickNoteMap = {};\n // Sort the tickables in each voice by their tick position in the voice.\n voices.forEach((voice) => {\n const tickPosition = new Fraction(0, 1);\n const tickable = voice.getTickables();\n tickable.forEach((t) => {\n if (t.shouldIgnoreTicks())\n return;\n const notesAtPosition = tickNoteMap[tickPosition.value()];\n if (!notesAtPosition) {\n tickPositions.push(tickPosition.value());\n tickNoteMap[tickPosition.value()] = [t];\n }\n else {\n notesAtPosition.push(t);\n }\n tickPosition.add(t.getTicks());\n });\n });\n const music = new Music();\n // Default key signature is C major.\n if (!keySignature)\n keySignature = 'C';\n // Get the scale map, which represents the current state of each pitch.\n const scaleMapKey = music.createScaleMap(keySignature);\n const scaleMap = {};\n tickPositions.forEach((tickPos) => {\n const tickables = tickNoteMap[tickPos];\n // Array to store all pitches that modified accidental states\n // at this tick position\n const modifiedPitches = [];\n const processNote = (t) => {\n // Only StaveNote implements .addModifier(), which is used below.\n if (!isStaveNote(t) || t.isRest() || t.shouldIgnoreTicks()) {\n return;\n }\n // Go through each key and determine if an accidental should be applied.\n const staveNote = t;\n staveNote.keys.forEach((keyString, keyIndex) => {\n const key = music.getNoteParts(keyString.split('/')[0]);\n const octave = keyString.split('/')[1];\n // Force a natural for every key without an accidental\n const accidentalString = key.accidental || 'n';\n const pitch = key.root + accidentalString;\n // Determine if the current pitch has the same accidental\n // as the scale state\n if (!scaleMap[key.root + octave])\n scaleMap[key.root + octave] = scaleMapKey[key.root];\n const sameAccidental = scaleMap[key.root + octave] === pitch;\n // Determine if an identical pitch in the chord already\n // modified the accidental state\n const previouslyModified = modifiedPitches.indexOf(keyString) > -1;\n // Remove accidentals\n staveNote.getModifiers().forEach((modifier, index) => {\n if (isAccidental(modifier) && modifier.type == accidentalString && modifier.getIndex() == keyIndex) {\n staveNote.getModifiers().splice(index, 1);\n }\n });\n // Add the accidental to the StaveNote\n if (!sameAccidental || (sameAccidental && previouslyModified)) {\n // Modify the scale map so that the root pitch has an\n // updated state\n scaleMap[key.root + octave] = pitch;\n // Create the accidental\n const accidental = new Accidental(accidentalString);\n // Attach the accidental to the StaveNote\n staveNote.addModifier(accidental, keyIndex);\n // Add the pitch to list of pitches that modified accidentals\n modifiedPitches.push(keyString);\n }\n });\n // process grace notes\n staveNote.getModifiers().forEach((modifier) => {\n if (isGraceNoteGroup(modifier)) {\n modifier.getGraceNotes().forEach(processNote);\n }\n });\n };\n tickables.forEach(processNote);\n });\n }\n reset() {\n const fontScale = this.render_options.font_scale;\n this.glyph = new Glyph(this.accidental.code, fontScale);\n this.glyph.setOriginX(1.0);\n if (this.cautionary) {\n this.parenLeft = new Glyph(Tables.accidentalCodes('{').code, fontScale);\n this.parenRight = new Glyph(Tables.accidentalCodes('}').code, fontScale);\n this.parenLeft.setOriginX(1.0);\n this.parenRight.setOriginX(1.0);\n }\n }\n /** Get width in pixels. */\n getWidth() {\n if (this.cautionary) {\n const parenLeft = defined(this.parenLeft);\n const parenRight = defined(this.parenRight);\n const parenWidth = parenLeft.getMetrics().width +\n parenRight.getMetrics().width +\n this.render_options.parenLeftPadding +\n this.render_options.parenRightPadding;\n return this.glyph.getMetrics().width + parenWidth;\n }\n else {\n return this.glyph.getMetrics().width;\n }\n }\n /** Attach this accidental to `note`, which must be a `StaveNote`. */\n setNote(note) {\n defined(note, 'ArgumentError', `Bad note value: ${note}`);\n this.note = note;\n // Accidentals attached to grace notes are rendered smaller.\n if (isGraceNote(note)) {\n this.render_options.font_scale = 25;\n this.reset();\n }\n return this;\n }\n /** If called, draws parenthesis around accidental. */\n setAsCautionary() {\n this.cautionary = true;\n this.render_options.font_scale = 28;\n this.reset();\n return this;\n }\n /** Render accidental onto canvas. */\n draw() {\n const { type, position, index, cautionary, x_shift, y_shift, glyph, render_options: { parenLeftPadding, parenRightPadding }, } = this;\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n // Figure out the start `x` and `y` coordinates for note and index.\n const start = note.getModifierStartXY(position, index);\n let accX = start.x + x_shift;\n const accY = start.y + y_shift;\n L('Rendering: ', type, accX, accY);\n if (!cautionary) {\n glyph.render(ctx, accX, accY);\n }\n else {\n const parenLeft = defined(this.parenLeft);\n const parenRight = defined(this.parenRight);\n // Render the accidental in parentheses.\n parenRight.render(ctx, accX, accY);\n accX -= parenRight.getMetrics().width;\n accX -= parenRightPadding;\n accX -= this.accidental.parenRightPaddingAdjustment;\n glyph.render(ctx, accX, accY);\n accX -= glyph.getMetrics().width;\n accX -= parenLeftPadding;\n parenLeft.render(ctx, accX, accY);\n }\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Accidental.DEBUG` to `true`. */\nAccidental.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { TextFormatter } from './textformatter';\nimport { Category, isStemmableNote, isTabNote } from './typeguard';\nimport { log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Annotation.DEBUG)\n log('Vex.Flow.Annotation', args);\n}\nexport var AnnotationHorizontalJustify;\n(function (AnnotationHorizontalJustify) {\n AnnotationHorizontalJustify[AnnotationHorizontalJustify[\"LEFT\"] = 1] = \"LEFT\";\n AnnotationHorizontalJustify[AnnotationHorizontalJustify[\"CENTER\"] = 2] = \"CENTER\";\n AnnotationHorizontalJustify[AnnotationHorizontalJustify[\"RIGHT\"] = 3] = \"RIGHT\";\n AnnotationHorizontalJustify[AnnotationHorizontalJustify[\"CENTER_STEM\"] = 4] = \"CENTER_STEM\";\n})(AnnotationHorizontalJustify || (AnnotationHorizontalJustify = {}));\nexport var AnnotationVerticalJustify;\n(function (AnnotationVerticalJustify) {\n AnnotationVerticalJustify[AnnotationVerticalJustify[\"TOP\"] = 1] = \"TOP\";\n AnnotationVerticalJustify[AnnotationVerticalJustify[\"CENTER\"] = 2] = \"CENTER\";\n AnnotationVerticalJustify[AnnotationVerticalJustify[\"BOTTOM\"] = 3] = \"BOTTOM\";\n AnnotationVerticalJustify[AnnotationVerticalJustify[\"CENTER_STEM\"] = 4] = \"CENTER_STEM\";\n})(AnnotationVerticalJustify || (AnnotationVerticalJustify = {}));\n/**\n * Annotations are modifiers that can be attached to\n * notes.\n *\n * See `tests/annotation_tests.ts` for usage examples.\n */\nexport class Annotation extends Modifier {\n /**\n * Annotations inherit from `Modifier` and is positioned correctly when\n * in a `ModifierContext`.\n * Create a new `Annotation` with the string `text`.\n */\n constructor(text) {\n super();\n this.text = text;\n this.horizontalJustification = AnnotationHorizontalJustify.CENTER;\n // warning: the default in the constructor is TOP, but in the factory the default is BOTTOM.\n // this is to support legacy application that may expect this.\n this.verticalJustification = AnnotationVerticalJustify.TOP;\n this.resetFont();\n // The default width is calculated from the text.\n this.setWidth(Tables.textWidth(text));\n }\n /** Annotations category string. */\n static get CATEGORY() {\n return Category.Annotation;\n }\n /** Arrange annotations within a `ModifierContext` */\n static format(annotations, state) {\n if (!annotations || annotations.length === 0)\n return false;\n let width = 0;\n for (let i = 0; i < annotations.length; ++i) {\n const annotation = annotations[i];\n const textFormatter = TextFormatter.create(annotation.textFont);\n // Text height is expressed in fractional stave spaces.\n const textLines = (5 + textFormatter.maxHeight) / Tables.STAVE_LINE_DISTANCE;\n let verticalSpaceNeeded = textLines;\n const note = annotation.checkAttachedNote();\n const stave = note.getStave();\n const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP;\n let stemHeight = 0;\n let lines = 5;\n if (isTabNote(note)) {\n if (note.render_options.draw_stem) {\n const stem = note.getStem();\n if (stem) {\n stemHeight = Math.abs(stem.getHeight()) / Tables.STAVE_LINE_DISTANCE;\n }\n }\n else {\n stemHeight = 0;\n }\n }\n else if (isStemmableNote(note)) {\n const stem = note.getStem();\n if (stem && note.getNoteType() === 'n') {\n stemHeight = Math.abs(stem.getHeight()) / Tables.STAVE_LINE_DISTANCE;\n }\n }\n if (stave) {\n lines = stave.getNumLines();\n }\n // Get the text width from the font metrics.\n const textWidth = textFormatter.getWidthForTextInPx(annotation.text);\n width = Math.max(width, textWidth);\n if (annotation.verticalJustification === this.VerticalJustify.TOP) {\n let noteLine = note.getLineNumber(true);\n if (isTabNote(note)) {\n noteLine = lines - (note.leastString() - 0.5);\n }\n if (stemDirection === Stem.UP) {\n noteLine += stemHeight;\n }\n const curTop = noteLine + state.top_text_line + 0.5;\n if (curTop < lines) {\n annotation.setTextLine(lines - noteLine);\n verticalSpaceNeeded += lines - noteLine;\n state.top_text_line = verticalSpaceNeeded;\n }\n else {\n annotation.setTextLine(state.top_text_line);\n state.top_text_line += verticalSpaceNeeded;\n }\n }\n else if (annotation.verticalJustification === this.VerticalJustify.BOTTOM) {\n let noteLine = lines - note.getLineNumber();\n if (isTabNote(note)) {\n noteLine = note.greatestString() - 1;\n }\n if (stemDirection === Stem.DOWN) {\n noteLine += stemHeight;\n }\n const curBottom = noteLine + state.text_line + 1;\n if (curBottom < lines) {\n annotation.setTextLine(lines - curBottom);\n verticalSpaceNeeded += lines - curBottom;\n state.text_line = verticalSpaceNeeded;\n }\n else {\n annotation.setTextLine(state.text_line);\n state.text_line += verticalSpaceNeeded;\n }\n }\n else {\n annotation.setTextLine(state.text_line);\n }\n }\n state.left_shift += width / 2;\n state.right_shift += width / 2;\n return true;\n }\n /**\n * Set vertical position of text (above or below stave).\n * @param just value in `AnnotationVerticalJustify`.\n */\n setVerticalJustification(just) {\n this.verticalJustification = typeof just === 'string' ? Annotation.VerticalJustifyString[just] : just;\n return this;\n }\n /**\n * Get horizontal justification.\n */\n getJustification() {\n return this.horizontalJustification;\n }\n /**\n * Set horizontal justification.\n * @param justification value in `Annotation.Justify`.\n */\n setJustification(just) {\n this.horizontalJustification = typeof just === 'string' ? Annotation.HorizontalJustifyString[just] : just;\n return this;\n }\n /** Render text beside the note. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP;\n const textFormatter = TextFormatter.create(this.textFont);\n const start = note.getModifierStartXY(ModifierPosition.ABOVE, this.index);\n this.setRendered();\n // We're changing context parameters. Save current state.\n ctx.save();\n const classString = Object.keys(this.getAttribute('classes')).join(' ');\n ctx.openGroup(classString, this.getAttribute('id'));\n ctx.setFont(this.textFont);\n const text_width = ctx.measureText(this.text).width;\n const text_height = textFormatter.maxHeight + 2;\n let x;\n let y;\n if (this.horizontalJustification === AnnotationHorizontalJustify.LEFT) {\n x = start.x;\n }\n else if (this.horizontalJustification === AnnotationHorizontalJustify.RIGHT) {\n x = start.x - text_width;\n }\n else if (this.horizontalJustification === AnnotationHorizontalJustify.CENTER) {\n x = start.x - text_width / 2;\n } /* CENTER_STEM */\n else {\n x = note.getStemX() - text_width / 2;\n }\n let stem_ext = {};\n let spacing = 0;\n const has_stem = note.hasStem();\n const stave = note.checkStave();\n // The position of the text varies based on whether or not the note\n // has a stem.\n if (has_stem) {\n stem_ext = note.checkStem().getExtents();\n spacing = stave.getSpacingBetweenLines();\n }\n if (this.verticalJustification === AnnotationVerticalJustify.BOTTOM) {\n // Use the largest (lowest) Y value\n const ys = note.getYs();\n y = ys.reduce((a, b) => (a > b ? a : b));\n y += (this.text_line + 1) * Tables.STAVE_LINE_DISTANCE + text_height;\n if (has_stem && stemDirection === Stem.DOWN) {\n y = Math.max(y, stem_ext.topY + text_height + spacing * this.text_line);\n }\n }\n else if (this.verticalJustification === AnnotationVerticalJustify.CENTER) {\n const yt = note.getYForTopText(this.text_line) - 1;\n const yb = stave.getYForBottomText(this.text_line);\n y = yt + (yb - yt) / 2 + text_height / 2;\n }\n else if (this.verticalJustification === AnnotationVerticalJustify.TOP) {\n y = note.getYs()[0] - (this.text_line + 1) * Tables.STAVE_LINE_DISTANCE;\n if (has_stem && stemDirection === Stem.UP) {\n // If the stem is above the stave already, go with default line width vs. actual\n // since the lines between don't really matter.\n spacing = stem_ext.topY < stave.getTopLineTopY() ? Tables.STAVE_LINE_DISTANCE : spacing;\n y = Math.min(y, stem_ext.topY - spacing * (this.text_line + 1));\n }\n } /* CENTER_STEM */\n else {\n const extents = note.getStemExtents();\n y = extents.topY + (extents.baseY - extents.topY) / 2 + text_height / 2;\n }\n L('Rendering annotation: ', this.text, x, y);\n ctx.fillText(this.text, x, y);\n ctx.closeGroup();\n ctx.restore();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Annotation.DEBUG` to `true`. */\nAnnotation.DEBUG = false;\nAnnotation.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n/** Text annotations can be positioned and justified relative to the note. */\nAnnotation.HorizontalJustify = AnnotationHorizontalJustify;\nAnnotation.HorizontalJustifyString = {\n left: AnnotationHorizontalJustify.LEFT,\n right: AnnotationHorizontalJustify.RIGHT,\n center: AnnotationHorizontalJustify.CENTER,\n centerStem: AnnotationHorizontalJustify.CENTER_STEM,\n};\nAnnotation.VerticalJustify = AnnotationVerticalJustify;\nAnnotation.VerticalJustifyString = {\n above: AnnotationVerticalJustify.TOP,\n top: AnnotationVerticalJustify.TOP,\n below: AnnotationVerticalJustify.BOTTOM,\n bottom: AnnotationVerticalJustify.BOTTOM,\n center: AnnotationVerticalJustify.CENTER,\n centerStem: AnnotationVerticalJustify.CENTER_STEM,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Larry Kuhns.\n// MIT License\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category, isGraceNote, isStaveNote, isStemmableNote, isTabNote } from './typeguard';\nimport { defined, log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Articulation.DEBUG)\n log('Vex.Flow.Articulation', args);\n}\nconst { ABOVE, BELOW } = Modifier.Position;\nfunction roundToNearestHalf(mathFn, value) {\n return mathFn(value / 0.5) * 0.5;\n}\n// This includes both staff and ledger lines\nfunction isWithinLines(line, position) {\n return position === ABOVE ? line <= 5 : line >= 1;\n}\nfunction getRoundingFunction(line, position) {\n if (isWithinLines(line, position)) {\n if (position === ABOVE) {\n return Math.ceil;\n }\n else {\n return Math.floor;\n }\n }\n else {\n return Math.round;\n }\n}\nfunction snapLineToStaff(canSitBetweenLines, line, position, offsetDirection) {\n // Initially, snap to nearest staff line or space\n const snappedLine = roundToNearestHalf(getRoundingFunction(line, position), line);\n const canSnapToStaffSpace = canSitBetweenLines && isWithinLines(snappedLine, position);\n const onStaffLine = snappedLine % 1 === 0;\n if (canSnapToStaffSpace && onStaffLine) {\n const HALF_STAFF_SPACE = 0.5;\n return snappedLine + HALF_STAFF_SPACE * -offsetDirection;\n }\n else {\n return snappedLine;\n }\n}\n// Helper function for checking if a Note object is either a StaveNote or a GraceNote.\nconst isStaveOrGraceNote = (note) => isStaveNote(note) || isGraceNote(note);\nfunction getTopY(note, textLine) {\n const stemDirection = note.getStemDirection();\n const { topY: stemTipY, baseY: stemBaseY } = note.getStemExtents();\n if (isStaveOrGraceNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return stemTipY;\n }\n else {\n return stemBaseY;\n }\n }\n else {\n return Math.min(...note.getYs());\n }\n }\n else if (isTabNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return stemTipY;\n }\n else {\n return note.checkStave().getYForTopText(textLine);\n }\n }\n else {\n return note.checkStave().getYForTopText(textLine);\n }\n }\n else {\n throw new RuntimeError('UnknownCategory', 'Only can get the top and bottom ys of stavenotes and tabnotes');\n }\n}\nfunction getBottomY(note, textLine) {\n const stemDirection = note.getStemDirection();\n const { topY: stemTipY, baseY: stemBaseY } = note.getStemExtents();\n if (isStaveOrGraceNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return stemBaseY;\n }\n else {\n return stemTipY;\n }\n }\n else {\n return Math.max(...note.getYs());\n }\n }\n else if (isTabNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return note.checkStave().getYForBottomText(textLine);\n }\n else {\n return stemTipY;\n }\n }\n else {\n return note.checkStave().getYForBottomText(textLine);\n }\n }\n else {\n throw new RuntimeError('UnknownCategory', 'Only can get the top and bottom ys of stavenotes and tabnotes');\n }\n}\n/**\n * Get the initial offset of the articulation from the y value of the starting position.\n * This is required because the top/bottom text positions already have spacing applied to\n * provide a \"visually pleasant\" default position. However the y values provided from\n * the stavenote's top/bottom do *not* have any pre-applied spacing. This function\n * normalizes this asymmetry.\n * @param note\n * @param position\n * @returns\n */\nfunction getInitialOffset(note, position) {\n const isOnStemTip = (position === ABOVE && note.getStemDirection() === Stem.UP) ||\n (position === BELOW && note.getStemDirection() === Stem.DOWN);\n if (isStaveOrGraceNote(note)) {\n if (note.hasStem() && isOnStemTip) {\n return 0.5;\n }\n else {\n // this amount is larger than the stem-tip offset because we start from\n // the center of the notehead\n return 1;\n }\n }\n else {\n if (note.hasStem() && isOnStemTip) {\n return 1;\n }\n else {\n return 0;\n }\n }\n}\n/**\n * Articulations and Accents are modifiers that can be\n * attached to notes. The complete list of articulations is available in\n * `tables.ts` under `Vex.Flow.articulationCodes`.\n *\n * See `tests/articulation_tests.ts` for usage examples.\n */\nexport class Articulation extends Modifier {\n /**\n * Create a new articulation.\n * @param type entry in `Vex.Flow.articulationCodes` in `tables.ts`\n */\n constructor(type) {\n super();\n this.type = type;\n this.position = BELOW;\n this.render_options = {\n font_scale: 38,\n };\n this.reset();\n }\n /** Articulations category string. */\n static get CATEGORY() {\n return Category.Articulation;\n }\n /**\n * FIXME:\n * Most of the complex formatting logic (ie: snapping to space) is\n * actually done in .render(). But that logic belongs in this method.\n *\n * Unfortunately, this isn't possible because, by this point, stem lengths\n * have not yet been finalized. Finalized stem lengths are required to determine the\n * initial position of any stem-side articulation.\n *\n * This indicates that all objects should have their stave set before being\n * formatted. It can't be an optional if you want accurate vertical positioning.\n * Consistently positioned articulations that play nice with other modifiers\n * won't be possible until we stop relying on render-time formatting.\n *\n * Ideally, when this function has completed, the vertical articulation positions\n * should be ready to render without further adjustment. But the current state\n * is far from this ideal.\n */\n static format(articulations, state) {\n if (!articulations || articulations.length === 0)\n return false;\n const margin = 0.5;\n const getIncrement = (articulation, line, position) => roundToNearestHalf(getRoundingFunction(line, position), defined(articulation.glyph.getMetrics().height) / 10 + margin);\n articulations.forEach((articulation) => {\n const note = articulation.checkAttachedNote();\n let lines = 5;\n const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP;\n let stemHeight = 0;\n // Decide if we need to consider beam direction in placement.\n if (isStemmableNote(note)) {\n const stem = note.getStem();\n if (stem) {\n stemHeight = Math.abs(stem.getHeight()) / Tables.STAVE_LINE_DISTANCE;\n }\n }\n const stave = note.getStave();\n if (stave) {\n lines = stave.getNumLines();\n }\n if (articulation.getPosition() === ABOVE) {\n let noteLine = note.getLineNumber(true);\n if (stemDirection === Stem.UP) {\n noteLine += stemHeight;\n }\n let increment = getIncrement(articulation, state.top_text_line, ABOVE);\n const curTop = noteLine + state.top_text_line + 0.5;\n // If articulation must be above stave, add lines between note and stave top\n if (!articulation.articulation.between_lines && curTop < lines) {\n increment += lines - curTop;\n }\n articulation.setTextLine(state.top_text_line);\n state.top_text_line += increment;\n }\n else if (articulation.getPosition() === BELOW) {\n let noteLine = Math.max(lines - note.getLineNumber(), 0);\n if (stemDirection === Stem.DOWN) {\n noteLine += stemHeight;\n }\n let increment = getIncrement(articulation, state.text_line, BELOW);\n const curBottom = noteLine + state.text_line + 0.5;\n // if articulation must be below stave, add lines from note to stave bottom\n if (!articulation.articulation.between_lines && curBottom < lines) {\n increment += lines - curBottom;\n }\n articulation.setTextLine(state.text_line);\n state.text_line += increment;\n }\n });\n const width = articulations\n .map((articulation) => articulation.getWidth())\n .reduce((maxWidth, articWidth) => Math.max(articWidth, maxWidth));\n state.left_shift += width / 2;\n state.right_shift += width / 2;\n return true;\n }\n static easyScoreHook({ articulations }, note, builder) {\n if (!articulations)\n return;\n const articNameToCode = {\n staccato: 'a.',\n tenuto: 'a-',\n accent: 'a>',\n };\n articulations\n .split(',')\n .map((articString) => articString.trim().split('.'))\n .map(([name, position]) => {\n const artic = { type: articNameToCode[name] };\n if (position)\n artic.position = Modifier.PositionString[position];\n return builder.getFactory().Articulation(artic);\n })\n .map((artic) => note.addModifier(artic, 0));\n }\n reset() {\n this.articulation = Tables.articulationCodes(this.type);\n const articulation = defined(this.articulation, 'ArgumentError', `Articulation not found: ${this.type}`);\n const code = (this.position === ABOVE ? articulation.aboveCode : articulation.belowCode) || articulation.code;\n this.glyph = new Glyph(code !== null && code !== void 0 ? code : '', this.render_options.font_scale);\n this.setWidth(defined(this.glyph.getMetrics().width));\n }\n /** Render articulation in position next to note. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const index = this.checkIndex();\n const { position, glyph, text_line: textLine } = this;\n const canSitBetweenLines = this.articulation.between_lines;\n const stave = note.checkStave();\n const staffSpace = stave.getSpacingBetweenLines();\n const isTab = isTabNote(note);\n // Articulations are centered over/under the note head.\n const { x } = note.getModifierStartXY(position, index);\n const shouldSitOutsideStaff = !canSitBetweenLines || isTab;\n const initialOffset = getInitialOffset(note, position);\n const padding = Tables.currentMusicFont().lookupMetric(`articulation.${glyph.getCode()}.padding`, 0);\n let y = {\n [ABOVE]: () => {\n glyph.setOrigin(0.5, 1);\n const y = getTopY(note, textLine) - (textLine + initialOffset) * staffSpace;\n return shouldSitOutsideStaff ? Math.min(stave.getYForTopText(Articulation.INITIAL_OFFSET), y) : y;\n },\n [BELOW]: () => {\n glyph.setOrigin(0.5, 0);\n const y = getBottomY(note, textLine) + (textLine + initialOffset) * staffSpace;\n return shouldSitOutsideStaff ? Math.max(stave.getYForBottomText(Articulation.INITIAL_OFFSET), y) : y;\n },\n }[position]();\n if (!isTab) {\n const offsetDirection = position === ABOVE ? -1 : +1;\n const noteLine = note.getKeyProps()[index].line;\n const distanceFromNote = (note.getYs()[index] - y) / staffSpace;\n const articLine = distanceFromNote + Number(noteLine);\n const snappedLine = snapLineToStaff(canSitBetweenLines, articLine, position, offsetDirection);\n if (isWithinLines(snappedLine, position))\n glyph.setOrigin(0.5, 0.5);\n y += Math.abs(snappedLine - articLine) * staffSpace * offsetDirection + padding * offsetDirection;\n }\n L(`Rendering articulation at (x: ${x}, y: ${y})`);\n glyph.render(ctx, x, y);\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Articulation.DEBUG` to `true`. */\nArticulation.DEBUG = false;\nArticulation.INITIAL_OFFSET = -0.5;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Note } from './note';\nimport { Barline, BarlineType } from './stavebarline';\nimport { Category } from './typeguard';\nimport { log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (BarNote.DEBUG)\n log('Vex.Flow.BarNote', args);\n}\n/**\n * A `BarNote` is used to render bar lines (from `barline.ts`). `BarNote`s can\n * be added to a voice and rendered in the middle of a stave. Since it has no\n * duration, it consumes no `tick`s, and is dealt with appropriately by the formatter.\n *\n * See `tests/barnote_tests.ts` for usage examples.\n */\nexport class BarNote extends Note {\n constructor(type = BarlineType.SINGLE) {\n super({ duration: 'b' });\n this.metrics = {\n widths: {},\n };\n const TYPE = BarlineType;\n this.metrics.widths = {\n [TYPE.SINGLE]: 8,\n [TYPE.DOUBLE]: 12,\n [TYPE.END]: 15,\n [TYPE.REPEAT_BEGIN]: 14,\n [TYPE.REPEAT_END]: 14,\n [TYPE.REPEAT_BOTH]: 18,\n [TYPE.NONE]: 0,\n };\n // Tell the formatter that bar notes have no duration.\n this.ignore_ticks = true;\n this.setType(type);\n }\n static get CATEGORY() {\n return Category.BarNote;\n }\n /** Get the type of bar note.*/\n getType() {\n return this.type;\n }\n /** Set the type of bar note. */\n setType(type) {\n this.type = typeof type === 'string' ? Barline.typeString[type] : type;\n // Set width to width of relevant `Barline`.\n this.setWidth(this.metrics.widths[this.type]);\n return this;\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n /** Overridden to ignore. */\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n /** Render note to stave. */\n draw() {\n const ctx = this.checkContext();\n L('Rendering bar line at: ', this.getAbsoluteX());\n if (this.style)\n this.applyStyle(ctx);\n const barline = new Barline(this.type);\n barline.setX(this.getAbsoluteX());\n barline.draw(this.checkStave());\n if (this.style)\n this.restoreStyle(ctx);\n this.setRendered();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.BarNote.DEBUG` to `true`. */\nBarNote.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Fraction } from './fraction';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { TupletLocation } from './tuplet';\nimport { Category, isStaveNote, isTabNote } from './typeguard';\nimport { RuntimeError } from './util';\nfunction calculateStemDirection(notes) {\n let lineSum = 0;\n notes.forEach((note) => {\n if (note.keyProps) {\n note.keyProps.forEach((keyProp) => {\n lineSum += keyProp.line - 3;\n });\n }\n });\n if (lineSum >= 0) {\n return Stem.DOWN;\n }\n return Stem.UP;\n}\nfunction getStemSlope(firstNote, lastNote) {\n const firstStemTipY = firstNote.getStemExtents().topY;\n const firstStemX = firstNote.getStemX();\n const lastStemTipY = lastNote.getStemExtents().topY;\n const lastStemX = lastNote.getStemX();\n return (lastStemTipY - firstStemTipY) / (lastStemX - firstStemX);\n}\nconst BEAM_LEFT = 'L';\nconst BEAM_RIGHT = 'R';\nconst BEAM_BOTH = 'B';\n/** `Beams` span over a set of `StemmableNotes`. */\nexport class Beam extends Element {\n constructor(notes, auto_stem = false) {\n super();\n this.slope = 0;\n this.y_shift = 0;\n if (!notes || notes.length === 0) {\n throw new RuntimeError('BadArguments', 'No notes provided for beam.');\n }\n if (notes.length === 1) {\n throw new RuntimeError('BadArguments', 'Too few notes for beam.');\n }\n // Validate beam line, direction and ticks.\n this.ticks = notes[0].getIntrinsicTicks();\n if (this.ticks >= Tables.durationToTicks('4')) {\n throw new RuntimeError('BadArguments', 'Beams can only be applied to notes shorter than a quarter note.');\n }\n let i; // shared iterator\n let note;\n this.stem_direction = Stem.UP;\n for (i = 0; i < notes.length; ++i) {\n note = notes[i];\n if (note.hasStem()) {\n this.stem_direction = note.getStemDirection();\n break;\n }\n }\n let stem_direction = this.stem_direction;\n // Figure out optimal stem direction based on given notes\n if (auto_stem && isStaveNote(notes[0])) {\n stem_direction = calculateStemDirection(notes);\n }\n else if (auto_stem && isTabNote(notes[0])) {\n // Auto Stem TabNotes\n const stem_weight = notes.reduce((memo, note) => memo + note.getStemDirection(), 0);\n stem_direction = stem_weight > -1 ? Stem.UP : Stem.DOWN;\n }\n // Apply stem directions and attach beam to notes\n for (i = 0; i < notes.length; ++i) {\n note = notes[i];\n if (auto_stem) {\n note.setStemDirection(stem_direction);\n this.stem_direction = stem_direction;\n }\n note.setBeam(this);\n }\n this.postFormatted = false;\n this.notes = notes;\n this.beam_count = this.getBeamCount();\n this.break_on_indices = [];\n this.render_options = {\n beam_width: 5,\n max_slope: 0.25,\n min_slope: -0.25,\n slope_iterations: 20,\n slope_cost: 100,\n show_stemlets: false,\n stemlet_extension: 7,\n partial_beam_length: 10,\n flat_beams: false,\n min_flat_beam_offset: 15,\n };\n }\n static get CATEGORY() {\n return Category.Beam;\n }\n /** Get the direction of the beam */\n getStemDirection() {\n return this.stem_direction;\n }\n /**\n * Get the default beam groups for a provided time signature.\n * Attempt to guess if the time signature is not found in table.\n * Currently this is fairly naive.\n */\n static getDefaultBeamGroups(time_sig) {\n if (!time_sig || time_sig === 'c') {\n time_sig = '4/4';\n }\n const defaults = {\n '1/2': ['1/2'],\n '2/2': ['1/2'],\n '3/2': ['1/2'],\n '4/2': ['1/2'],\n '1/4': ['1/4'],\n '2/4': ['1/4'],\n '3/4': ['1/4'],\n '4/4': ['1/4'],\n '1/8': ['1/8'],\n '2/8': ['2/8'],\n '3/8': ['3/8'],\n '4/8': ['2/8'],\n '1/16': ['1/16'],\n '2/16': ['2/16'],\n '3/16': ['3/16'],\n '4/16': ['2/16'],\n };\n const groups = defaults[time_sig];\n if (groups === undefined) {\n // If no beam groups found, naively determine\n // the beam groupings from the time signature\n const beatTotal = parseInt(time_sig.split('/')[0], 10);\n const beatValue = parseInt(time_sig.split('/')[1], 10);\n const tripleMeter = beatTotal % 3 === 0;\n if (tripleMeter) {\n return [new Fraction(3, beatValue)];\n }\n else if (beatValue > 4) {\n return [new Fraction(2, beatValue)];\n }\n else if (beatValue <= 4) {\n return [new Fraction(1, beatValue)];\n }\n }\n else {\n return groups.map((group) => new Fraction().parse(group));\n }\n return [new Fraction(1, 4)];\n }\n /**\n * A helper function to automatically build basic beams for a voice. For more\n * complex auto-beaming use `Beam.generateBeams()`.\n * @param voice the voice to generate the beams for\n * @param stem_direction a stem direction to apply to the entire voice\n * @param groups an array of `Fraction` representing beat groupings for the beam\n */\n static applyAndGetBeams(voice, stem_direction, groups) {\n return Beam.generateBeams(voice.getTickables(), { groups, stem_direction });\n }\n /**\n * A helper function to autimatically build beams for a voice with\n * configuration options.\n *\n * Example configuration object:\n *\n * ```\n * config = {\n * groups: [new Vex.Flow.Fraction(2, 8)],\n * stem_direction: -1,\n * beam_rests: true,\n * beam_middle_only: true,\n * show_stemlets: false\n * };\n * ```\n * @param notes an array of notes to create the beams for\n * @param config the configuration object\n * @param config.stem_direction set to apply the same direction to all notes\n * @param config.beam_rests set to `true` to include rests in the beams\n * @param config.beam_middle_only set to `true` to only beam rests in the middle of the beat\n * @param config.show_stemlets set to `true` to draw stemlets for rests\n * @param config.maintain_stem_directions set to `true` to not apply new stem directions\n * @param config.groups array of `Fractions` that represent the beat structure to beam the notes\n *\n */\n static generateBeams(notes, config = {}) {\n if (!config.groups || !config.groups.length) {\n config.groups = [new Fraction(2, 8)];\n }\n // Convert beam groups to tick amounts\n const tickGroups = config.groups.map((group) => {\n if (!group.multiply) {\n throw new RuntimeError('InvalidBeamGroups', 'The beam groups must be an array of Vex.Flow.Fractions');\n }\n return group.clone().multiply(Tables.RESOLUTION, 1);\n });\n const unprocessedNotes = notes;\n let currentTickGroup = 0;\n let noteGroups = [];\n let currentGroup = [];\n function getTotalTicks(vf_notes) {\n return vf_notes.reduce((memo, note) => note.getTicks().clone().add(memo), new Fraction(0, 1));\n }\n function nextTickGroup() {\n if (tickGroups.length - 1 > currentTickGroup) {\n currentTickGroup += 1;\n }\n else {\n currentTickGroup = 0;\n }\n }\n function createGroups() {\n let nextGroup = [];\n // number of ticks in current group\n let currentGroupTotalTicks = new Fraction(0, 1);\n unprocessedNotes.forEach((unprocessedNote) => {\n nextGroup = [];\n if (unprocessedNote.shouldIgnoreTicks()) {\n noteGroups.push(currentGroup);\n currentGroup = nextGroup;\n return; // Ignore untickables (like bar notes)\n }\n currentGroup.push(unprocessedNote);\n const ticksPerGroup = tickGroups[currentTickGroup].clone();\n const totalTicks = getTotalTicks(currentGroup).add(currentGroupTotalTicks);\n // Double the amount of ticks in a group, if it's an unbeamable tuplet\n const unbeamable = Tables.durationToNumber(unprocessedNote.getDuration()) < 8;\n if (unbeamable && unprocessedNote.getTuplet()) {\n ticksPerGroup.numerator *= 2;\n }\n // If the note that was just added overflows the group tick total\n if (totalTicks.greaterThan(ticksPerGroup)) {\n // If the overflow note can be beamed, start the next group\n // with it. Unbeamable notes leave the group overflowed.\n if (!unbeamable) {\n const note = currentGroup.pop();\n if (note)\n nextGroup.push(note);\n }\n noteGroups.push(currentGroup);\n // We have overflown, so we're going to next tick group. As we might have\n // overflown by more than 1 group, we need to go forward as many times as\n // needed, decreasing currentGroupTotalTicks by as many ticks as there are\n // in current groups as we go forward.\n do {\n currentGroupTotalTicks = totalTicks.subtract(tickGroups[currentTickGroup]);\n nextTickGroup();\n } while (currentGroupTotalTicks.greaterThanEquals(tickGroups[currentTickGroup]));\n currentGroup = nextGroup;\n }\n else if (totalTicks.equals(ticksPerGroup)) {\n noteGroups.push(currentGroup);\n currentGroupTotalTicks = new Fraction(0, 1);\n currentGroup = nextGroup;\n nextTickGroup();\n }\n });\n // Adds any remainder notes beam\n if (currentGroup.length > 0) {\n noteGroups.push(currentGroup);\n }\n }\n function getBeamGroups() {\n return noteGroups.filter((group) => {\n if (group.length > 1) {\n let beamable = true;\n group.forEach((note) => {\n if (note.getIntrinsicTicks() >= Tables.durationToTicks('4')) {\n beamable = false;\n }\n });\n return beamable;\n }\n return false;\n });\n }\n // Splits up groups by Rest\n function sanitizeGroups() {\n const sanitizedGroups = [];\n noteGroups.forEach((group) => {\n let tempGroup = [];\n group.forEach((note, index, group) => {\n const isFirstOrLast = index === 0 || index === group.length - 1;\n const prevNote = group[index - 1];\n const breaksOnEachRest = !config.beam_rests && note.isRest();\n const breaksOnFirstOrLastRest = config.beam_rests && config.beam_middle_only && note.isRest() && isFirstOrLast;\n let breakOnStemChange = false;\n if (config.maintain_stem_directions && prevNote && !note.isRest() && !prevNote.isRest()) {\n const prevDirection = prevNote.getStemDirection();\n const currentDirection = note.getStemDirection();\n breakOnStemChange = currentDirection !== prevDirection;\n }\n const isUnbeamableDuration = parseInt(note.getDuration(), 10) < 8;\n // Determine if the group should be broken at this note\n const shouldBreak = breaksOnEachRest || breaksOnFirstOrLastRest || breakOnStemChange || isUnbeamableDuration;\n if (shouldBreak) {\n // Add current group\n if (tempGroup.length > 0) {\n sanitizedGroups.push(tempGroup);\n }\n // Start a new group. Include the current note if the group\n // was broken up by stem direction, as that note needs to start\n // the next group of notes\n tempGroup = breakOnStemChange ? [note] : [];\n }\n else {\n // Add note to group\n tempGroup.push(note);\n }\n });\n // If there is a remaining group, add it as well\n if (tempGroup.length > 0) {\n sanitizedGroups.push(tempGroup);\n }\n });\n noteGroups = sanitizedGroups;\n }\n function formatStems() {\n noteGroups.forEach((group) => {\n let stemDirection;\n if (config.maintain_stem_directions) {\n const note = findFirstNote(group);\n stemDirection = note ? note.getStemDirection() : Stem.UP;\n }\n else {\n if (config.stem_direction) {\n stemDirection = config.stem_direction;\n }\n else {\n stemDirection = calculateStemDirection(group);\n }\n }\n applyStemDirection(group, stemDirection);\n });\n }\n function findFirstNote(group) {\n for (let i = 0; i < group.length; i++) {\n const note = group[i];\n if (!note.isRest()) {\n return note;\n }\n }\n return false;\n }\n function applyStemDirection(group, direction) {\n group.forEach((note) => {\n note.setStemDirection(direction);\n });\n }\n // Get all of the tuplets in all of the note groups\n function getTuplets() {\n const uniqueTuplets = [];\n // Go through all of the note groups and inspect for tuplets\n noteGroups.forEach((group) => {\n let tuplet;\n group.forEach((note) => {\n const noteTuplet = note.getTuplet();\n if (noteTuplet && tuplet !== noteTuplet) {\n tuplet = noteTuplet;\n uniqueTuplets.push(tuplet);\n }\n });\n });\n return uniqueTuplets;\n }\n // Using closures to store the variables throughout the various functions\n // IMO Keeps it this process lot cleaner - but not super consistent with\n // the rest of the API's style - Silverwolf90 (Cyril)\n createGroups();\n sanitizeGroups();\n formatStems();\n // Get the notes to be beamed\n const beamedNoteGroups = getBeamGroups();\n // Get the tuplets in order to format them accurately\n const allTuplets = getTuplets();\n // Create a Vex.Flow.Beam from each group of notes to be beamed\n const beams = [];\n beamedNoteGroups.forEach((group) => {\n const beam = new Beam(group);\n if (config.show_stemlets) {\n beam.render_options.show_stemlets = true;\n }\n if (config.secondary_breaks) {\n beam.render_options.secondary_break_ticks = Tables.durationToTicks(config.secondary_breaks);\n }\n if (config.flat_beams === true) {\n beam.render_options.flat_beams = true;\n beam.render_options.flat_beam_offset = config.flat_beam_offset;\n }\n beams.push(beam);\n });\n // Reformat tuplets\n allTuplets.forEach((tuplet) => {\n // Set the tuplet location based on the stem direction\n const direction = tuplet.notes[0].stem_direction === Stem.DOWN ? TupletLocation.BOTTOM : TupletLocation.TOP;\n tuplet.setTupletLocation(direction);\n // If any of the notes in the tuplet are not beamed, draw a bracket.\n let bracketed = false;\n for (let i = 0; i < tuplet.notes.length; i++) {\n const note = tuplet.notes[i];\n if (!note.hasBeam()) {\n bracketed = true;\n break;\n }\n }\n tuplet.setBracketed(bracketed);\n });\n return beams;\n }\n /** Get the notes in this beam. */\n getNotes() {\n return this.notes;\n }\n /** Get the max number of beams in the set of notes. */\n getBeamCount() {\n const beamCounts = this.notes.map((note) => note.getGlyph().beam_count);\n const maxBeamCount = beamCounts.reduce((max, beamCount) => (beamCount > max ? beamCount : max));\n return maxBeamCount;\n }\n /** Set which note `indices` to break the secondary beam at. */\n breakSecondaryAt(indices) {\n this.break_on_indices = indices;\n return this;\n }\n /** Return the y coordinate for linear function. */\n getSlopeY(x, first_x_px, first_y_px, slope) {\n return first_y_px + (x - first_x_px) * slope;\n }\n /** Calculate the best possible slope for the provided notes. */\n calculateSlope() {\n const { notes, stem_direction: stemDirection, render_options: { max_slope, min_slope, slope_iterations, slope_cost }, } = this;\n const firstNote = notes[0];\n const initialSlope = getStemSlope(firstNote, notes[notes.length - 1]);\n const increment = (max_slope - min_slope) / slope_iterations;\n let minCost = Number.MAX_VALUE;\n let bestSlope = 0;\n let yShift = 0;\n // iterate through slope values to find best weighted fit\n for (let slope = min_slope; slope <= max_slope; slope += increment) {\n let totalStemExtension = 0;\n let yShiftTemp = 0;\n // iterate through notes, calculating y shift and stem extension\n for (let i = 1; i < notes.length; ++i) {\n const note = notes[i];\n if (note.hasStem() || note.isRest()) {\n const adjustedStemTipY = this.getSlopeY(note.getStemX(), firstNote.getStemX(), firstNote.getStemExtents().topY, slope) + yShiftTemp;\n const stemTipY = note.getStemExtents().topY;\n // beam needs to be shifted up to accommodate note\n if (stemTipY * stemDirection < adjustedStemTipY * stemDirection) {\n const diff = Math.abs(stemTipY - adjustedStemTipY);\n yShiftTemp += diff * -stemDirection;\n totalStemExtension += diff * i;\n }\n else {\n // beam overshoots note, account for the difference\n totalStemExtension += (stemTipY - adjustedStemTipY) * stemDirection;\n }\n }\n }\n // most engraving books suggest aiming for a slope about half the angle of the\n // difference between the first and last notes' stem length;\n const idealSlope = initialSlope / 2;\n const distanceFromIdeal = Math.abs(idealSlope - slope);\n // This tries to align most beams to something closer to the idealSlope, but\n // doesn't go crazy. To disable, set this.render_options.slope_cost = 0\n const cost = slope_cost * distanceFromIdeal + Math.abs(totalStemExtension);\n // update state when a more ideal slope is found\n if (cost < minCost) {\n minCost = cost;\n bestSlope = slope;\n yShift = yShiftTemp;\n }\n }\n this.slope = bestSlope;\n this.y_shift = yShift;\n }\n /** Calculate a slope and y-shift for flat beams. */\n calculateFlatSlope() {\n const { notes, stem_direction, render_options: { beam_width, min_flat_beam_offset, flat_beam_offset }, } = this;\n // If a flat beam offset has not yet been supplied or calculated,\n // generate one based on the notes in this particular note group\n let total = 0;\n let extremeY = 0; // Store the highest or lowest note here\n let extremeBeamCount = 0; // The beam count of the extreme note\n let currentExtreme = 0;\n for (let i = 0; i < notes.length; i++) {\n // Total up all of the offsets so we can average them out later\n const note = notes[i];\n const stemTipY = note.getStemExtents().topY;\n total += stemTipY;\n // Store the highest (stems-up) or lowest (stems-down) note so the\n // offset can be adjusted in case the average isn't enough\n if (stem_direction === Stem.DOWN && currentExtreme < stemTipY) {\n currentExtreme = stemTipY;\n extremeY = Math.max(...note.getYs());\n extremeBeamCount = note.getBeamCount();\n }\n else if (stem_direction === Stem.UP && (currentExtreme === 0 || currentExtreme > stemTipY)) {\n currentExtreme = stemTipY;\n extremeY = Math.min(...note.getYs());\n extremeBeamCount = note.getBeamCount();\n }\n }\n // Average the offsets to try and come up with a reasonable one that\n // works for all of the notes in the beam group.\n let offset = total / notes.length;\n // In case the average isn't long enough, add or subtract some more\n // based on the highest or lowest note (again, based on the stem\n // direction). This also takes into account the added height due to\n // the width of the beams.\n const beamWidth = beam_width * 1.5;\n const extremeTest = min_flat_beam_offset + extremeBeamCount * beamWidth;\n const newOffset = extremeY + extremeTest * -stem_direction;\n if (stem_direction === Stem.DOWN && offset < newOffset) {\n offset = extremeY + extremeTest;\n }\n else if (stem_direction === Stem.UP && offset > newOffset) {\n offset = extremeY - extremeTest;\n }\n if (!flat_beam_offset) {\n // Set the offset for the group based on the calculations above.\n this.render_options.flat_beam_offset = offset;\n }\n else if (stem_direction === Stem.DOWN && offset > flat_beam_offset) {\n this.render_options.flat_beam_offset = offset;\n }\n else if (stem_direction === Stem.UP && offset < flat_beam_offset) {\n this.render_options.flat_beam_offset = offset;\n }\n // for flat beams, the slope and y_shift are simply 0\n this.slope = 0;\n this.y_shift = 0;\n }\n /** Return the Beam y offset. */\n getBeamYToDraw() {\n const firstNote = this.notes[0];\n const firstStemTipY = firstNote.getStemExtents().topY;\n let beamY = firstStemTipY;\n // For flat beams, set the first and last Y to the offset, rather than\n // using the note's stem extents.\n if (this.render_options.flat_beams && this.render_options.flat_beam_offset) {\n beamY = this.render_options.flat_beam_offset;\n }\n return beamY;\n }\n /**\n * Create new stems for the notes in the beam, so that each stem\n * extends into the beams.\n */\n applyStemExtensions() {\n const { notes, slope, y_shift, stem_direction, beam_count, render_options: { show_stemlets, stemlet_extension, beam_width }, } = this;\n const firstNote = notes[0];\n const firstStemTipY = this.getBeamYToDraw();\n const firstStemX = firstNote.getStemX();\n for (let i = 0; i < notes.length; ++i) {\n const note = notes[i];\n const stem = note.getStem();\n if (stem) {\n const stemX = note.getStemX();\n const { topY: stemTipY } = note.getStemExtents();\n const beamedStemTipY = this.getSlopeY(stemX, firstStemX, firstStemTipY, slope) + y_shift;\n const preBeamExtension = stem.getExtension();\n const beamExtension = stem_direction === Stem.UP ? stemTipY - beamedStemTipY : beamedStemTipY - stemTipY;\n stem.setExtension(preBeamExtension + beamExtension);\n stem.adjustHeightForBeam();\n if (note.isRest() && show_stemlets) {\n const beamWidth = beam_width;\n const totalBeamWidth = (beam_count - 1) * beamWidth * 1.5 + beamWidth;\n stem.setVisibility(true).setStemlet(true, totalBeamWidth + stemlet_extension);\n }\n }\n }\n }\n /** Return upper level beam direction. */\n lookupBeamDirection(duration, prev_tick, tick, next_tick) {\n if (duration === '4') {\n return BEAM_LEFT;\n }\n const lookup_duration = `${Tables.durationToNumber(duration) / 2}`;\n const prev_note_gets_beam = prev_tick < Tables.durationToTicks(lookup_duration);\n const next_note_gets_beam = next_tick < Tables.durationToTicks(lookup_duration);\n const note_gets_beam = tick < Tables.durationToTicks(lookup_duration);\n if (prev_note_gets_beam && next_note_gets_beam && note_gets_beam) {\n return BEAM_BOTH;\n }\n else if (prev_note_gets_beam && !next_note_gets_beam && note_gets_beam) {\n return BEAM_LEFT;\n }\n else if (!prev_note_gets_beam && next_note_gets_beam && note_gets_beam) {\n return BEAM_RIGHT;\n }\n return this.lookupBeamDirection(lookup_duration, prev_tick, tick, next_tick);\n }\n /** Get the x coordinates for the beam lines of specific `duration`. */\n getBeamLines(duration) {\n const tick_of_duration = Tables.durationToTicks(duration);\n let beam_started = false;\n const beam_lines = [];\n let current_beam = undefined;\n const partial_beam_length = this.render_options.partial_beam_length;\n let previous_should_break = false;\n let tick_tally = 0;\n for (let i = 0; i < this.notes.length; ++i) {\n const note = this.notes[i];\n // See if we need to break secondary beams on this note.\n const ticks = note.getTicks().value();\n tick_tally += ticks;\n let should_break = false;\n // 8th note beams are always drawn.\n if (parseInt(duration, 10) >= 8) {\n // First, check to see if any indices were set up through breakSecondaryAt()\n should_break = this.break_on_indices.indexOf(i) !== -1;\n // If the secondary breaks were auto-configured in the render options,\n // handle that as well.\n if (this.render_options.secondary_break_ticks && tick_tally >= this.render_options.secondary_break_ticks) {\n tick_tally = 0;\n should_break = true;\n }\n }\n const note_gets_beam = note.getIntrinsicTicks() < tick_of_duration;\n const stem_x = note.getStemX() - Stem.WIDTH / 2;\n // Check to see if the next note in the group will get a beam at this\n // level. This will help to inform the partial beam logic below.\n const prev_note = this.notes[i - 1];\n const next_note = this.notes[i + 1];\n const next_note_gets_beam = next_note && next_note.getIntrinsicTicks() < tick_of_duration;\n const prev_note_gets_beam = prev_note && prev_note.getIntrinsicTicks() < tick_of_duration;\n const beam_alone = prev_note && next_note && note_gets_beam && !prev_note_gets_beam && !next_note_gets_beam;\n // const beam_alone = note_gets_beam && !prev_note_gets_beam && !next_note_gets_beam;\n if (note_gets_beam) {\n // This note gets a beam at the current level\n if (beam_started) {\n // We're currently in the middle of a beam. Just continue it on to\n // the stem X of the current note.\n current_beam = beam_lines[beam_lines.length - 1];\n current_beam.end = stem_x;\n // If a secondary beam break is set up, end the beam right now.\n if (should_break) {\n beam_started = false;\n if (next_note && !next_note_gets_beam && current_beam.end === undefined) {\n // This note gets a beam,.but the next one does not. This means\n // we need a partial pointing right.\n current_beam.end = current_beam.start - partial_beam_length;\n }\n }\n }\n else {\n // No beam started yet. Start a new one.\n current_beam = { start: stem_x, end: undefined };\n beam_started = true;\n if (beam_alone) {\n // previous and next beam exists and does not get a beam but current gets it.\n const prev_tick = prev_note.getIntrinsicTicks();\n const next_tick = next_note.getIntrinsicTicks();\n const tick = note.getIntrinsicTicks();\n const beam_direction = this.lookupBeamDirection(duration, prev_tick, tick, next_tick);\n if ([BEAM_LEFT, BEAM_BOTH].includes(beam_direction)) {\n current_beam.end = current_beam.start - partial_beam_length;\n }\n else {\n current_beam.end = current_beam.start + partial_beam_length;\n }\n }\n else if (!next_note_gets_beam) {\n // The next note doesn't get a beam. Draw a partial.\n if ((previous_should_break || i === 0) && next_note) {\n // This is the first note (but not the last one), or it is\n // following a secondary break. Draw a partial to the right.\n current_beam.end = current_beam.start + partial_beam_length;\n }\n else {\n // By default, draw a partial to the left.\n current_beam.end = current_beam.start - partial_beam_length;\n }\n }\n else if (should_break) {\n // This note should have a secondary break after it. Even though\n // we just started a beam, it needs to end immediately.\n current_beam.end = current_beam.start - partial_beam_length;\n beam_started = false;\n }\n beam_lines.push(current_beam);\n }\n }\n else {\n // The current note does not get a beam.\n beam_started = false;\n }\n // Store the secondary break flag to inform the partial beam logic in\n // the next iteration of the loop.\n previous_should_break = should_break;\n }\n // Add a partial beam pointing left if this is the last note in the group\n const last_beam = beam_lines[beam_lines.length - 1];\n if (last_beam && last_beam.end === undefined) {\n last_beam.end = last_beam.start - partial_beam_length;\n }\n return beam_lines;\n }\n /** Render the stems for each note. */\n drawStems(ctx) {\n this.notes.forEach((note) => {\n const stem = note.getStem();\n if (stem) {\n stem.setContext(ctx).draw();\n }\n }, this);\n }\n // Render the beam lines\n drawBeamLines(ctx) {\n const valid_beam_durations = ['4', '8', '16', '32', '64'];\n const firstNote = this.notes[0];\n let beamY = this.getBeamYToDraw();\n const firstStemX = firstNote.getStemX();\n const beamThickness = this.render_options.beam_width * this.stem_direction;\n // Draw the beams.\n for (let i = 0; i < valid_beam_durations.length; ++i) {\n const duration = valid_beam_durations[i];\n const beamLines = this.getBeamLines(duration);\n for (let j = 0; j < beamLines.length; ++j) {\n const beam_line = beamLines[j];\n const startBeamX = beam_line.start;\n const startBeamY = this.getSlopeY(startBeamX, firstStemX, beamY, this.slope);\n const lastBeamX = beam_line.end;\n if (lastBeamX) {\n const lastBeamY = this.getSlopeY(lastBeamX, firstStemX, beamY, this.slope);\n ctx.beginPath();\n ctx.moveTo(startBeamX, startBeamY);\n ctx.lineTo(startBeamX, startBeamY + beamThickness);\n ctx.lineTo(lastBeamX + 1, lastBeamY + beamThickness);\n ctx.lineTo(lastBeamX + 1, lastBeamY);\n ctx.closePath();\n ctx.fill();\n }\n else {\n throw new RuntimeError('NoLastBeamX', 'lastBeamX undefined.');\n }\n }\n beamY += beamThickness * 1.5;\n }\n }\n /** Pre-format the beam. */\n preFormat() {\n return this;\n }\n /**\n * Post-format the beam. This can only be called after\n * the notes in the beam have both `x` and `y` values. ie: they've\n * been formatted and have staves.\n */\n postFormat() {\n if (this.postFormatted)\n return;\n // Calculate a smart slope if we're not forcing the beams to be flat.\n if (isTabNote(this.notes[0]) || this.render_options.flat_beams) {\n this.calculateFlatSlope();\n }\n else {\n this.calculateSlope();\n }\n this.applyStemExtensions();\n this.postFormatted = true;\n }\n /** Render the beam to the canvas context */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n if (this.unbeamable)\n return;\n if (!this.postFormatted) {\n this.postFormat();\n }\n this.drawStems(ctx);\n this.applyStyle();\n this.drawBeamLines(ctx);\n this.restoreStyle();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Modifier } from './modifier';\nimport { TextFormatter } from './textformatter';\nimport { Category, isTabNote } from './typeguard';\nimport { RuntimeError } from './util';\n/** Bend implements tablature bends. */\nexport class Bend extends Modifier {\n /**\n * Example of a phrase:\n * ```\n * [{\n * type: UP,\n * text: \"whole\"\n * width: 8;\n * },\n * {\n * type: DOWN,\n * text: \"whole\"\n * width: 8;\n * },\n * {\n * type: UP,\n * text: \"half\"\n * width: 8;\n * },\n * {\n * type: UP,\n * text: \"whole\"\n * width: 8;\n * },\n * {\n * type: DOWN,\n * text: \"1 1/2\"\n * width: 8;\n * }]\n * ```\n * @param text text for bend (\"Full\", \"Half\", etc.) (DEPRECATED)\n * @param release if true, render a release. (DEPRECATED)\n * @param phrase if set, ignore \"text\" and \"release\", and use the more sophisticated phrase specified\n */\n constructor(text, release = false, phrase) {\n super();\n this.text = text;\n this.x_shift = 0;\n this.release = release;\n this.tap = '';\n this.resetFont();\n this.render_options = {\n line_width: 1.5,\n line_style: '#777777',\n bend_width: 8,\n release_width: 8,\n };\n if (phrase) {\n this.phrase = phrase;\n }\n else {\n // Backward compatibility\n this.phrase = [{ type: Bend.UP, text: this.text }];\n if (this.release)\n this.phrase.push({ type: Bend.DOWN, text: '' });\n }\n this.updateWidth();\n }\n static get CATEGORY() {\n return Category.Bend;\n }\n static get UP() {\n return 0;\n }\n static get DOWN() {\n return 1;\n }\n // Arrange bends in `ModifierContext`\n static format(bends, state) {\n if (!bends || bends.length === 0)\n return false;\n let last_width = 0;\n // Format Bends\n for (let i = 0; i < bends.length; ++i) {\n const bend = bends[i];\n const note = bend.checkAttachedNote();\n if (isTabNote(note)) {\n const stringPos = note.leastString() - 1;\n if (state.top_text_line < stringPos) {\n state.top_text_line = stringPos;\n }\n }\n bend.setXShift(last_width);\n last_width = bend.getWidth();\n bend.setTextLine(state.top_text_line);\n }\n state.right_shift += last_width;\n state.top_text_line += 1;\n return true;\n }\n /** Set horizontal shift in pixels. */\n setXShift(value) {\n this.x_shift = value;\n this.updateWidth();\n return this;\n }\n setTap(value) {\n this.tap = value;\n return this;\n }\n /** Get text provided in the constructor. */\n getText() {\n return this.text;\n }\n getTextHeight() {\n const textFormatter = TextFormatter.create(this.textFont);\n return textFormatter.maxHeight;\n }\n /** Recalculate width. */\n updateWidth() {\n const textFormatter = TextFormatter.create(this.textFont);\n const measureText = (text) => {\n return textFormatter.getWidthForTextInPx(text);\n };\n let totalWidth = 0;\n for (let i = 0; i < this.phrase.length; ++i) {\n const bend = this.phrase[i];\n if (bend.width !== undefined) {\n totalWidth += bend.width;\n }\n else {\n const additional_width = bend.type === Bend.UP ? this.render_options.bend_width : this.render_options.release_width;\n bend.width = Math.max(additional_width, measureText(bend.text)) + 3;\n bend.draw_width = bend.width / 2;\n totalWidth += bend.width;\n }\n }\n this.setWidth(totalWidth + this.x_shift);\n return this;\n }\n /** Draw the bend on the rendering context. */\n draw() {\n var _a;\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(Modifier.Position.RIGHT, this.index);\n start.x += 3;\n start.y += 0.5;\n const x_shift = this.x_shift;\n const stave = note.checkStave();\n const spacing = stave.getSpacingBetweenLines();\n const lowestY = note.getYs().reduce((a, b) => (a < b ? a : b));\n // this.text_line is relative to top string in the group.\n const bend_height = start.y - ((this.text_line + 1) * spacing + start.y - lowestY) + 3;\n const annotation_y = start.y - ((this.text_line + 1) * spacing + start.y - lowestY) - 1;\n const renderBend = (x, y, width, height) => {\n const cp_x = x + width;\n const cp_y = y;\n ctx.save();\n ctx.beginPath();\n ctx.setLineWidth(this.render_options.line_width);\n ctx.setStrokeStyle(this.render_options.line_style);\n ctx.setFillStyle(this.render_options.line_style);\n ctx.moveTo(x, y);\n ctx.quadraticCurveTo(cp_x, cp_y, x + width, height);\n ctx.stroke();\n ctx.restore();\n };\n const renderRelease = (x, y, width, height) => {\n ctx.save();\n ctx.beginPath();\n ctx.setLineWidth(this.render_options.line_width);\n ctx.setStrokeStyle(this.render_options.line_style);\n ctx.setFillStyle(this.render_options.line_style);\n ctx.moveTo(x, height);\n ctx.quadraticCurveTo(x + width, height, x + width, y);\n ctx.stroke();\n ctx.restore();\n };\n const renderArrowHead = (x, y, direction) => {\n const width = 4;\n const yBase = y + width * direction;\n ctx.beginPath();\n ctx.moveTo(x, y); // tip of the arrow\n ctx.lineTo(x - width, yBase);\n ctx.lineTo(x + width, yBase);\n ctx.closePath();\n ctx.fill();\n };\n const renderText = (x, text) => {\n ctx.save();\n ctx.setFont(this.textFont);\n const render_x = x - ctx.measureText(text).width / 2;\n ctx.fillText(text, render_x, annotation_y);\n ctx.restore();\n };\n let last_bend = undefined;\n let last_bend_draw_width = 0;\n let last_drawn_width = 0;\n if ((_a = this.tap) === null || _a === void 0 ? void 0 : _a.length) {\n const tapStart = note.getModifierStartXY(Modifier.Position.CENTER, this.index);\n renderText(tapStart.x, this.tap);\n }\n for (let i = 0; i < this.phrase.length; ++i) {\n const bend = this.phrase[i];\n if (!bend.draw_width)\n bend.draw_width = 0;\n if (i === 0)\n bend.draw_width += x_shift;\n last_drawn_width = bend.draw_width + last_bend_draw_width - (i === 1 ? x_shift : 0);\n if (bend.type === Bend.UP) {\n if (last_bend && last_bend.type === Bend.UP) {\n renderArrowHead(start.x, bend_height, +1);\n }\n renderBend(start.x, start.y, last_drawn_width, bend_height);\n }\n if (bend.type === Bend.DOWN) {\n if (last_bend && last_bend.type === Bend.UP) {\n renderRelease(start.x, start.y, last_drawn_width, bend_height);\n }\n if (last_bend && last_bend.type === Bend.DOWN) {\n renderArrowHead(start.x, start.y, -1);\n renderRelease(start.x, start.y, last_drawn_width, bend_height);\n }\n if (!last_bend) {\n last_drawn_width = bend.draw_width;\n renderRelease(start.x, start.y, last_drawn_width, bend_height);\n }\n }\n renderText(start.x + last_drawn_width, bend.text);\n last_bend = bend;\n last_bend_draw_width = bend.draw_width;\n last_bend.x = start.x;\n start.x += last_drawn_width;\n }\n if (!last_bend || last_bend.x == undefined) {\n throw new RuntimeError('NoLastBendForBend', 'Internal error.');\n }\n // Final arrowhead and text\n if (last_bend.type === Bend.UP) {\n renderArrowHead(last_bend.x + last_drawn_width, bend_height, +1);\n }\n else if (last_bend.type === Bend.DOWN) {\n renderArrowHead(last_bend.x + last_drawn_width, start.y, -1);\n }\n }\n}\n/** Default text font. */\nBend.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nexport class BoundingBox {\n constructor(x, y, w, h) {\n this.x = x;\n this.y = y;\n this.w = w;\n this.h = h;\n }\n /**\n * Create a new copy.\n */\n static copy(that) {\n return new BoundingBox(that.x, that.y, that.w, that.h);\n }\n /** Get x position. */\n getX() {\n return this.x;\n }\n /** Get y position. */\n getY() {\n return this.y;\n }\n /** Get width. */\n getW() {\n return this.w;\n }\n /** Get height. */\n getH() {\n return this.h;\n }\n /** Set x position. */\n setX(x) {\n this.x = x;\n return this;\n }\n /** Set y position. */\n setY(y) {\n this.y = y;\n return this;\n }\n /** Set width. */\n setW(w) {\n this.w = w;\n return this;\n }\n /** Set height. */\n setH(h) {\n this.h = h;\n return this;\n }\n /** Move to position. */\n move(x, y) {\n this.x += x;\n this.y += y;\n return this;\n }\n /** Clone. */\n clone() {\n return BoundingBox.copy(this);\n }\n /**\n * Merge my box with given box. Creates a bigger bounding box unless\n * the given box is contained in this one.\n */\n mergeWith(boundingBox) {\n const that = boundingBox;\n const new_x = this.x < that.x ? this.x : that.x;\n const new_y = this.y < that.y ? this.y : that.y;\n const new_w = Math.max(this.x + this.w, that.x + that.w) - new_x;\n const new_h = Math.max(this.y + this.h, that.y + that.h) - new_y;\n this.x = new_x;\n this.y = new_y;\n this.w = new_w;\n this.h = new_h;\n return this;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n/**\n * BoundingBoxComputation computes metrics for a bounding box by continuously\n * taking canvas path commands.\n *\n * Warning: This class is merely a crutch to get bounding box information without\n * explicit metadata. This is likely to get deprecated following SMuFL support.\n *\n * based on: https://github.com/canvg/canvg/blob/master/src/BoundingBox.ts (MIT License)\n */\nexport class BoundingBoxComputation {\n constructor() {\n this.x1 = Number.NaN;\n this.y1 = Number.NaN;\n this.x2 = Number.NaN;\n this.y2 = Number.NaN;\n }\n /** Get calculated X1. */\n getX1() {\n return this.x1;\n }\n /** Get calculated Y1. */\n getY1() {\n return this.y1;\n }\n /** Get calculated width. */\n width() {\n return this.x2 - this.x1;\n }\n /** Get calculated height. */\n height() {\n return this.y2 - this.y1;\n }\n /** Add point to BoundingBox. */\n addPoint(x, y) {\n if (isNaN(this.x1) || x < this.x1)\n this.x1 = x;\n if (isNaN(this.x2) || x > this.x2)\n this.x2 = x;\n if (isNaN(this.y1) || y < this.y1)\n this.y1 = y;\n if (isNaN(this.y2) || y > this.y2)\n this.y2 = y;\n }\n /** Add X to BoundingBox. */\n addX(x) {\n this.addPoint(x, this.y1);\n }\n /** Add Y to BoundingBox. */\n addY(y) {\n this.addPoint(this.x1, y);\n }\n /** Add quadratic curve to BoundingBox. */\n addQuadraticCurve(p0x, p0y, p1x, p1y, p2x, p2y) {\n this.addPoint(p0x, p0y);\n this.addPoint(p2x, p2y);\n const p01x = p1x - p0x;\n const p12x = p2x - p1x;\n let denom = p01x - p12x;\n if (denom != 0) {\n const t = p01x / denom;\n if (t > 0 && t < 1) {\n const it = 1 - t;\n this.addX(it * it * p0x + 2 * it * t * p1x + t * t * p2x);\n }\n }\n const p01y = p1y - p0y;\n const p12y = p2y - p1y;\n denom = p01y - p12y;\n if (denom != 0) {\n const t = p01y / denom;\n if (t > 0 && t < 1) {\n const it = 1 - t;\n this.addY(it * it * p0y + 2 * it * t * p1y + t * t * p2y);\n }\n }\n }\n /** Add bezier curve to BoundingBox. */\n addBezierCurve(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) {\n // from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html\n const p0 = [p0x, p0y];\n const p1 = [p1x, p1y];\n const p2 = [p2x, p2y];\n const p3 = [p3x, p3y];\n let i;\n this.addPoint(p0[0], p0[1]);\n this.addPoint(p3[0], p3[1]);\n const f = (t, i) => Math.pow(1 - t, 3) * p0[i] +\n 3 * Math.pow(1 - t, 2) * t * p1[i] +\n 3 * (1 - t) * Math.pow(t, 2) * p2[i] +\n Math.pow(t, 3) * p3[i];\n for (i = 0; i <= 1; i++) {\n const b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i];\n const a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i];\n const c = 3 * p1[i] - 3 * p0[i];\n if (a === 0) {\n if (b === 0)\n continue;\n const t = -c / b;\n if (0 < t && t < 1) {\n if (i === 0)\n this.addX(f(t, i));\n if (i === 1)\n this.addY(f(t, i));\n }\n continue;\n }\n const b2ac = Math.pow(b, 2) - 4 * c * a;\n if (b2ac < 0)\n continue;\n const t1 = (-b + Math.sqrt(b2ac)) / (2 * a);\n if (0 < t1 && t1 < 1) {\n if (i === 0)\n this.addX(f(t1, i));\n if (i === 1)\n this.addY(f(t1, i));\n }\n const t2 = (-b - Math.sqrt(b2ac)) / (2 * a);\n if (0 < t2 && t2 < 1) {\n if (i === 0)\n this.addX(f(t2, i));\n if (i === 1)\n this.addY(f(t2, i));\n }\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from './font';\nimport { RenderContext } from './rendercontext';\nimport { globalObject, warn } from './util';\nimport { isHTMLCanvas } from './web';\n/**\n * A rendering context for the Canvas backend. This class serves as a proxy for the\n * underlying CanvasRenderingContext2D object, part of the browser's API.\n */\nexport class CanvasContext extends RenderContext {\n constructor(context) {\n super();\n /** Height of one line of text (in pixels). */\n this.textHeight = 0;\n this.context2D = context;\n if (!context.canvas) {\n this.canvas = {\n width: CanvasContext.WIDTH,\n height: CanvasContext.HEIGHT,\n };\n }\n else {\n this.canvas = context.canvas;\n }\n }\n static get WIDTH() {\n return 600;\n }\n static get HEIGHT() {\n return 400;\n }\n static get CANVAS_BROWSER_SIZE_LIMIT() {\n return 32767; // Chrome/Firefox. Could be determined more precisely by npm module canvas-size.\n }\n /**\n * Ensure that width and height do not exceed the browser limit.\n * @returns array of [width, height] clamped to the browser limit.\n */\n static sanitizeCanvasDims(width, height) {\n const limit = this.CANVAS_BROWSER_SIZE_LIMIT;\n if (Math.max(width, height) > limit) {\n warn('Canvas dimensions exceed browser limit. Cropping to ' + limit);\n if (width > limit) {\n width = limit;\n }\n if (height > limit) {\n height = limit;\n }\n }\n return [width, height];\n }\n /**\n * Set all pixels to transparent black rgba(0,0,0,0).\n */\n clear() {\n this.context2D.clearRect(0, 0, this.canvas.width, this.canvas.height);\n }\n // eslint-disable-next-line\n openGroup(cls, id, attrs) {\n // Containers not implemented.\n }\n closeGroup() {\n // Containers not implemented.\n }\n // eslint-disable-next-line\n add(child) {\n // Containers not implemented.\n }\n setFillStyle(style) {\n this.context2D.fillStyle = style;\n return this;\n }\n /** CanvasContext ignores `setBackgroundFillStyle()`. */\n // eslint-disable-next-line\n setBackgroundFillStyle(style) {\n // DO NOTHING\n return this;\n }\n setStrokeStyle(style) {\n this.context2D.strokeStyle = style;\n return this;\n }\n setShadowColor(color) {\n this.context2D.shadowColor = color;\n return this;\n }\n setShadowBlur(blur) {\n // CanvasRenderingContext2D does not scale the shadow blur by the current\n // transform, so we have to do it manually. We assume uniform scaling\n // (though allow for rotation) because the blur can only be scaled\n // uniformly anyway.\n const t = this.context2D.getTransform();\n const scale = Math.sqrt(t.a * t.a + t.b * t.b + t.c * t.c + t.d * t.d);\n this.context2D.shadowBlur = scale * blur;\n return this;\n }\n setLineWidth(width) {\n this.context2D.lineWidth = width;\n return this;\n }\n setLineCap(capType) {\n this.context2D.lineCap = capType;\n return this;\n }\n setLineDash(dash) {\n this.context2D.setLineDash(dash);\n return this;\n }\n scale(x, y) {\n this.context2D.scale(x, y);\n return this;\n }\n resize(width, height) {\n const canvas = this.context2D.canvas;\n const devicePixelRatio = globalObject().devicePixelRatio || 1;\n // Scale the canvas size by the device pixel ratio clamping to the maximum supported size.\n [width, height] = CanvasContext.sanitizeCanvasDims(width * devicePixelRatio, height * devicePixelRatio);\n // Divide back down by the pixel ratio and convert to integers.\n width = (width / devicePixelRatio) | 0;\n height = (height / devicePixelRatio) | 0;\n canvas.width = width * devicePixelRatio;\n canvas.height = height * devicePixelRatio;\n // The canvas could be an instance of either HTMLCanvasElement or an OffscreenCanvas.\n // Only HTMLCanvasElement has a style attribute.\n if (isHTMLCanvas(canvas)) {\n canvas.style.width = width + 'px';\n canvas.style.height = height + 'px';\n }\n return this.scale(devicePixelRatio, devicePixelRatio);\n }\n rect(x, y, width, height) {\n this.context2D.rect(x, y, width, height);\n return this;\n }\n fillRect(x, y, width, height) {\n this.context2D.fillRect(x, y, width, height);\n return this;\n }\n /**\n * Set the pixels in a rectangular area to transparent black rgba(0,0,0,0).\n */\n clearRect(x, y, width, height) {\n this.context2D.clearRect(x, y, width, height);\n return this;\n }\n beginPath() {\n this.context2D.beginPath();\n return this;\n }\n moveTo(x, y) {\n this.context2D.moveTo(x, y);\n return this;\n }\n lineTo(x, y) {\n this.context2D.lineTo(x, y);\n return this;\n }\n bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) {\n this.context2D.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);\n return this;\n }\n quadraticCurveTo(cpx, cpy, x, y) {\n this.context2D.quadraticCurveTo(cpx, cpy, x, y);\n return this;\n }\n arc(x, y, radius, startAngle, endAngle, counterclockwise) {\n this.context2D.arc(x, y, radius, startAngle, endAngle, counterclockwise);\n return this;\n }\n fill() {\n this.context2D.fill();\n return this;\n }\n stroke() {\n this.context2D.stroke();\n return this;\n }\n closePath() {\n this.context2D.closePath();\n return this;\n }\n measureText(text) {\n const metrics = this.context2D.measureText(text);\n let y = 0;\n let height = 0;\n if (metrics.fontBoundingBoxAscent) {\n y = -metrics.fontBoundingBoxAscent;\n height = metrics.fontBoundingBoxDescent + metrics.fontBoundingBoxAscent;\n }\n else {\n y = -metrics.actualBoundingBoxAscent;\n height = metrics.actualBoundingBoxDescent + metrics.actualBoundingBoxAscent;\n }\n // Return x, y, width & height in the same manner as svg getBBox\n return {\n x: 0,\n y: y,\n width: metrics.width,\n height: height,\n };\n }\n fillText(text, x, y) {\n this.context2D.fillText(text, x, y);\n return this;\n }\n save() {\n this.context2D.save();\n return this;\n }\n restore() {\n this.context2D.restore();\n return this;\n }\n set fillStyle(style) {\n this.context2D.fillStyle = style;\n }\n get fillStyle() {\n return this.context2D.fillStyle;\n }\n set strokeStyle(style) {\n this.context2D.strokeStyle = style;\n }\n get strokeStyle() {\n return this.context2D.strokeStyle;\n }\n /**\n * @param f is 1) a `FontInfo` object or\n * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or\n * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided).\n * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt').\n * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900).\n * @param style is a string (e.g., 'italic', 'normal').\n */\n setFont(f, size, weight, style) {\n const fontInfo = Font.validate(f, size, weight, style);\n this.context2D.font = Font.toCSSString(fontInfo);\n this.textHeight = Font.convertSizeToPixelValue(fontInfo.size);\n return this;\n }\n /** Return a string of the form `'italic bold 15pt Arial'` */\n getFont() {\n return this.context2D.font;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// Author: Aaron (@AaronDavidNewman)\n//\n// This implements chord symbols above/below a chord.\n// Chord symbols are modifiers that can be attached to notes.\n// They can contain multiple 'blocks' which represent text or\n// glyphs with various positioning options.\n//\n// See `tests/chordsymbol_tests.ts` for usage examples.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Tables } from './tables';\nimport { TextFormatter } from './textformatter';\nimport { Category } from './typeguard';\nimport { log } from './util';\n// To enable logging for this class. Set `Vex.Flow.ChordSymbol.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (ChordSymbol.DEBUG)\n log('Vex.Flow.ChordSymbol', args);\n}\nexport var ChordSymbolHorizontalJustify;\n(function (ChordSymbolHorizontalJustify) {\n ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify[\"LEFT\"] = 1] = \"LEFT\";\n ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify[\"CENTER\"] = 2] = \"CENTER\";\n ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify[\"RIGHT\"] = 3] = \"RIGHT\";\n ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify[\"CENTER_STEM\"] = 4] = \"CENTER_STEM\";\n})(ChordSymbolHorizontalJustify || (ChordSymbolHorizontalJustify = {}));\nexport var ChordSymbolVerticalJustify;\n(function (ChordSymbolVerticalJustify) {\n ChordSymbolVerticalJustify[ChordSymbolVerticalJustify[\"TOP\"] = 1] = \"TOP\";\n ChordSymbolVerticalJustify[ChordSymbolVerticalJustify[\"BOTTOM\"] = 2] = \"BOTTOM\";\n})(ChordSymbolVerticalJustify || (ChordSymbolVerticalJustify = {}));\nexport var SymbolTypes;\n(function (SymbolTypes) {\n SymbolTypes[SymbolTypes[\"GLYPH\"] = 1] = \"GLYPH\";\n SymbolTypes[SymbolTypes[\"TEXT\"] = 2] = \"TEXT\";\n SymbolTypes[SymbolTypes[\"LINE\"] = 3] = \"LINE\";\n})(SymbolTypes || (SymbolTypes = {}));\nexport var SymbolModifiers;\n(function (SymbolModifiers) {\n SymbolModifiers[SymbolModifiers[\"NONE\"] = 1] = \"NONE\";\n SymbolModifiers[SymbolModifiers[\"SUBSCRIPT\"] = 2] = \"SUBSCRIPT\";\n SymbolModifiers[SymbolModifiers[\"SUPERSCRIPT\"] = 3] = \"SUPERSCRIPT\";\n})(SymbolModifiers || (SymbolModifiers = {}));\n/**\n * ChordSymbol is a modifier that creates a chord symbol above/below a chord.\n * As a modifier, it is attached to an existing note.\n */\nexport class ChordSymbol extends Modifier {\n constructor() {\n super();\n this.symbolBlocks = [];\n this.horizontal = ChordSymbolHorizontalJustify.LEFT;\n this.vertical = ChordSymbolVerticalJustify.TOP;\n this.useKerning = true;\n this.reportWidth = true;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.ChordSymbol;\n }\n static get superSubRatio() {\n return ChordSymbol.metrics.global.superSubRatio;\n }\n /** Currently unused: Globally turn off text formatting, if the built-in formatting does not work for your font. */\n static set NO_TEXT_FORMAT(val) {\n ChordSymbol.noFormat = val;\n }\n static get NO_TEXT_FORMAT() {\n return ChordSymbol.noFormat;\n }\n // eslint-disable-next-line\n static getMetricForGlyph(glyphCode) {\n if (ChordSymbol.metrics[glyphCode]) {\n return ChordSymbol.metrics[glyphCode];\n }\n return undefined;\n }\n static get engravingFontResolution() {\n return Tables.currentMusicFont().getResolution();\n }\n static get spacingBetweenBlocks() {\n return ChordSymbol.metrics.global.spacing / ChordSymbol.engravingFontResolution;\n }\n static getWidthForGlyph(glyph) {\n const metric = ChordSymbol.getMetricForGlyph(glyph.code);\n if (!metric) {\n return 0.65; // probably should do something here.\n }\n return metric.advanceWidth / ChordSymbol.engravingFontResolution;\n }\n static getYShiftForGlyph(glyph) {\n const metric = ChordSymbol.getMetricForGlyph(glyph.code);\n if (!metric) {\n return 0;\n }\n return metric.yOffset / ChordSymbol.engravingFontResolution;\n }\n static getXShiftForGlyph(glyph) {\n const metric = ChordSymbol.getMetricForGlyph(glyph.code);\n if (!metric) {\n return 0;\n }\n return (-1 * metric.leftSideBearing) / ChordSymbol.engravingFontResolution;\n }\n static get superscriptOffset() {\n return ChordSymbol.metrics.global.superscriptOffset / ChordSymbol.engravingFontResolution;\n }\n static get subscriptOffset() {\n return ChordSymbol.metrics.global.subscriptOffset / ChordSymbol.engravingFontResolution;\n }\n static get kerningOffset() {\n return ChordSymbol.metrics.global.kerningOffset / ChordSymbol.engravingFontResolution;\n }\n // eslint-disable-next-line\n static get metrics() {\n return Tables.currentMusicFont().getMetrics().glyphs.chordSymbol;\n }\n static get lowerKerningText() {\n // For example, see: `bravura_metrics.ts`\n // BravuraMetrics.glyphs.chordSymbol.global.lowerKerningText, which returns an array of letters.\n // ['D', 'F', 'P', 'T', 'V', 'Y']\n return ChordSymbol.metrics.global.lowerKerningText;\n }\n static get upperKerningText() {\n return ChordSymbol.metrics.global.upperKerningText;\n }\n static isSuperscript(block) {\n return block.symbolModifier !== undefined && block.symbolModifier === SymbolModifiers.SUPERSCRIPT;\n }\n static isSubscript(block) {\n return block.symbolModifier !== undefined && block.symbolModifier === SymbolModifiers.SUBSCRIPT;\n }\n /**\n * Estimate the width of the whole chord symbol, based on the sum of the widths of the individual blocks.\n * Estimate how many lines above/below the staff we need.\n */\n static format(symbols, state) {\n var _a;\n if (!symbols || symbols.length === 0)\n return false;\n let width = 0;\n let nonSuperWidth = 0;\n const reportedWidths = [];\n for (const symbol of symbols) {\n const fontSize = Font.convertSizeToPointValue((_a = symbol.textFont) === null || _a === void 0 ? void 0 : _a.size);\n const fontAdj = Font.scaleSize(fontSize, 0.05);\n const glyphAdj = fontAdj * 2;\n let lineSpaces = 1;\n let vAlign = false;\n for (let j = 0; j < symbol.symbolBlocks.length; ++j) {\n const block = symbol.symbolBlocks[j];\n const sup = ChordSymbol.isSuperscript(block);\n const sub = ChordSymbol.isSubscript(block);\n const superSubScale = sup || sub ? ChordSymbol.superSubRatio : 1;\n const adj = block.symbolType === SymbolTypes.GLYPH ? glyphAdj * superSubScale : fontAdj * superSubScale;\n // If there are super/subscripts, they extend beyond the line so\n // assume they take up 2 lines\n if (sup || sub) {\n lineSpaces = 2;\n }\n // If there is a symbol-specific offset, add it but consider font\n // size since font and glyphs will be interspersed.\n const fontSize = symbol.textFormatter.fontSizeInPixels;\n const superSubFontSize = fontSize * superSubScale;\n if (block.symbolType === SymbolTypes.GLYPH && block.glyph !== undefined) {\n block.width = ChordSymbol.getWidthForGlyph(block.glyph) * superSubFontSize;\n block.yShift += ChordSymbol.getYShiftForGlyph(block.glyph) * superSubFontSize;\n block.xShift += ChordSymbol.getXShiftForGlyph(block.glyph) * superSubFontSize;\n block.glyph.scale = block.glyph.scale * adj;\n }\n else if (block.symbolType === SymbolTypes.TEXT) {\n block.width = block.width * superSubFontSize;\n block.yShift += symbol.getYOffsetForText(block.text) * adj;\n }\n if (block.symbolType === SymbolTypes.GLYPH &&\n block.glyph !== undefined &&\n block.glyph.code === ChordSymbol.glyphs.over.code) {\n lineSpaces = 2;\n }\n block.width += ChordSymbol.spacingBetweenBlocks * fontSize * superSubScale;\n // If a subscript immediately follows a superscript block, try to\n // overlay them.\n if (sup && j > 0) {\n const prev = symbol.symbolBlocks[j - 1];\n if (!ChordSymbol.isSuperscript(prev)) {\n nonSuperWidth = width;\n }\n }\n if (sub && nonSuperWidth > 0) {\n vAlign = true;\n // slide the symbol over so it lines up with superscript\n block.xShift = block.xShift + (nonSuperWidth - width);\n width = nonSuperWidth;\n nonSuperWidth = 0;\n // If we have vertically lined up, turn kerning off.\n symbol.setEnableKerning(false);\n }\n if (!sup && !sub) {\n nonSuperWidth = 0;\n }\n block.vAlign = vAlign;\n width += block.width;\n }\n // make kerning adjustments after computing super/subscripts\n symbol.updateKerningAdjustments();\n symbol.updateOverBarAdjustments();\n if (symbol.getVertical() === ChordSymbolVerticalJustify.TOP) {\n symbol.setTextLine(state.top_text_line);\n state.top_text_line += lineSpaces;\n }\n else {\n symbol.setTextLine(state.text_line + 1);\n state.text_line += lineSpaces + 1;\n }\n if (symbol.getReportWidth()) {\n reportedWidths.push(width);\n }\n else {\n reportedWidths.push(0);\n }\n }\n width = reportedWidths.reduce((a, b) => a + b, 0);\n state.left_shift += width / 2;\n state.right_shift += width / 2;\n return true;\n }\n /**\n * Default text font.\n * Choose a font family that works well with the current music engraving font.\n * @override `Element.TEXT_FONT`.\n */\n static get TEXT_FONT() {\n let family = 'Roboto Slab, Times, serif';\n if (Tables.currentMusicFont().getName() === 'Petaluma') {\n // Fixes Issue #1180\n family = 'PetalumaScript, Arial, sans-serif';\n }\n return {\n family,\n size: 12,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n };\n }\n /**\n * The offset is specified in `em`. Scale this value by the font size in pixels.\n */\n get superscriptOffset() {\n return ChordSymbol.superscriptOffset * this.textFormatter.fontSizeInPixels;\n }\n get subscriptOffset() {\n return ChordSymbol.subscriptOffset * this.textFormatter.fontSizeInPixels;\n }\n setReportWidth(value) {\n this.reportWidth = value;\n return this;\n }\n getReportWidth() {\n return this.reportWidth;\n }\n updateOverBarAdjustments() {\n const barIndex = this.symbolBlocks.findIndex(({ symbolType, glyph }) => symbolType === SymbolTypes.GLYPH && glyph !== undefined && glyph.code === 'csymDiagonalArrangementSlash');\n if (barIndex < 0) {\n return;\n }\n const bar = this.symbolBlocks[barIndex];\n const xoff = bar.width / 4;\n const yoff = 0.25 * this.textFormatter.fontSizeInPixels;\n let symIndex = 0;\n for (symIndex === 0; symIndex < barIndex; ++symIndex) {\n const symbol = this.symbolBlocks[symIndex];\n symbol.xShift = symbol.xShift + xoff;\n symbol.yShift = symbol.yShift - yoff;\n }\n for (symIndex = barIndex + 1; symIndex < this.symbolBlocks.length; ++symIndex) {\n const symbol = this.symbolBlocks[symIndex];\n symbol.xShift = symbol.xShift - xoff;\n symbol.yShift = symbol.yShift + yoff;\n }\n }\n updateKerningAdjustments() {\n let accum = 0;\n for (let j = 0; j < this.symbolBlocks.length; ++j) {\n const symbol = this.symbolBlocks[j];\n accum += this.getKerningAdjustment(j);\n symbol.xShift += accum;\n }\n }\n /** Do some basic kerning so that letter chords like 'A' don't have the extensions hanging off to the right. */\n getKerningAdjustment(j) {\n if (!this.useKerning) {\n return 0;\n }\n const currSymbol = this.symbolBlocks[j];\n const prevSymbol = j > 0 ? this.symbolBlocks[j - 1] : undefined;\n let adjustment = 0;\n // Move things into the '/' over bar\n if (currSymbol.symbolType === SymbolTypes.GLYPH &&\n currSymbol.glyph !== undefined &&\n currSymbol.glyph.code === ChordSymbol.glyphs.over.code) {\n adjustment += currSymbol.glyph.metrics.x_shift;\n }\n if (prevSymbol !== undefined &&\n prevSymbol.symbolType === SymbolTypes.GLYPH &&\n prevSymbol.glyph !== undefined &&\n prevSymbol.glyph.code === ChordSymbol.glyphs.over.code) {\n adjustment += prevSymbol.glyph.metrics.x_shift;\n }\n // For superscripts that follow a letter without much top part, move it to the left slightly\n let preKernUpper = false;\n let preKernLower = false;\n if (prevSymbol !== undefined && prevSymbol.symbolType === SymbolTypes.TEXT) {\n preKernUpper = ChordSymbol.upperKerningText.some((xx) => xx === prevSymbol.text[prevSymbol.text.length - 1]);\n preKernLower = ChordSymbol.lowerKerningText.some((xx) => xx === prevSymbol.text[prevSymbol.text.length - 1]);\n }\n const kerningOffsetPixels = ChordSymbol.kerningOffset * this.textFormatter.fontSizeInPixels;\n // TODO: adjust kern for font size.\n // Where should this constant live?\n if (preKernUpper && currSymbol.symbolModifier === SymbolModifiers.SUPERSCRIPT) {\n adjustment += kerningOffsetPixels;\n }\n if (preKernLower && currSymbol.symbolType === SymbolTypes.TEXT) {\n if (currSymbol.text[0] >= 'a' && currSymbol.text[0] <= 'z') {\n adjustment += kerningOffsetPixels / 2;\n }\n if (ChordSymbol.upperKerningText.some((xx) => xx === (prevSymbol === null || prevSymbol === void 0 ? void 0 : prevSymbol.text[prevSymbol.text.length - 1]))) {\n adjustment += kerningOffsetPixels / 2;\n }\n }\n return adjustment;\n }\n /**\n * ChordSymbol allows multiple blocks so we can mix glyphs and font text.\n * Each block can have its own vertical orientation.\n */\n // eslint-disable-next-line\n getSymbolBlock(params = {}) {\n var _a, _b, _c;\n const symbolType = (_a = params.symbolType) !== null && _a !== void 0 ? _a : SymbolTypes.TEXT;\n const symbolBlock = {\n text: (_b = params.text) !== null && _b !== void 0 ? _b : '',\n symbolType,\n symbolModifier: (_c = params.symbolModifier) !== null && _c !== void 0 ? _c : SymbolModifiers.NONE,\n xShift: 0,\n yShift: 0,\n vAlign: false,\n width: 0,\n };\n // Note: symbol widths are resolution and font-independent.\n // We convert to pixel values when we know what the font is.\n if (symbolType === SymbolTypes.GLYPH && typeof params.glyph === 'string') {\n const glyphArgs = ChordSymbol.glyphs[params.glyph];\n const glyphPoints = 20;\n symbolBlock.glyph = new Glyph(glyphArgs.code, glyphPoints, { category: 'chordSymbol' });\n // Beware: glyph.metrics is not the same as glyph.getMetrics() !\n // rv.glyph.point = rv.glyph.point * rv.glyph.metrics.scale;\n // rv.width = rv.glyph.getMetrics().width;\n // don't set yShift here, b/c we need to do it at formatting time after the font is set.\n }\n else if (symbolType === SymbolTypes.TEXT) {\n symbolBlock.width = this.textFormatter.getWidthForTextInEm(symbolBlock.text);\n }\n else if (symbolType === SymbolTypes.LINE) {\n symbolBlock.width = params.width;\n }\n return symbolBlock;\n }\n /** Add a symbol to this chord, could be text, glyph or line. */\n // eslint-disable-next-line\n addSymbolBlock(parameters) {\n this.symbolBlocks.push(this.getSymbolBlock(parameters));\n return this;\n }\n // ### Convenience functions for creating different types of chord symbol parts.\n /** Add a text block. */\n // eslint-disable-next-line\n addText(text, parameters = {}) {\n const symbolType = SymbolTypes.TEXT;\n return this.addSymbolBlock(Object.assign(Object.assign({}, parameters), { text, symbolType }));\n }\n /** Add a text block with superscript modifier. */\n addTextSuperscript(text) {\n const symbolType = SymbolTypes.TEXT;\n const symbolModifier = SymbolModifiers.SUPERSCRIPT;\n return this.addSymbolBlock({ text, symbolType, symbolModifier });\n }\n /** Add a text block with subscript modifier. */\n addTextSubscript(text) {\n const symbolType = SymbolTypes.TEXT;\n const symbolModifier = SymbolModifiers.SUBSCRIPT;\n return this.addSymbolBlock({ text, symbolType, symbolModifier });\n }\n /** Add a glyph block with superscript modifier. */\n addGlyphSuperscript(glyph) {\n const symbolType = SymbolTypes.GLYPH;\n const symbolModifier = SymbolModifiers.SUPERSCRIPT;\n return this.addSymbolBlock({ glyph, symbolType, symbolModifier });\n }\n /** Add a glyph block. */\n // eslint-disable-next-line\n addGlyph(glyph, params = {}) {\n const symbolType = SymbolTypes.GLYPH;\n return this.addSymbolBlock(Object.assign(Object.assign({}, params), { glyph, symbolType }));\n }\n /**\n * Add a glyph for each character in 'text'. If the glyph is not available, use text from the font.\n * e.g. `addGlyphOrText('(+5#11)')` will use text for the '5' and '11', and glyphs for everything else.\n */\n // eslint-disable-next-line\n addGlyphOrText(text, params = {}) {\n let str = '';\n for (let i = 0; i < text.length; ++i) {\n const char = text[i];\n if (ChordSymbol.glyphs[char]) {\n if (str.length > 0) {\n this.addText(str, params);\n str = '';\n }\n this.addGlyph(char, params);\n }\n else {\n // Collect consecutive characters with no glyphs.\n str += char;\n }\n }\n if (str.length > 0) {\n this.addText(str, params);\n }\n return this;\n }\n /** Add a line of the given width, used as a continuation of the previous symbol in analysis, or lyrics, etc. */\n // eslint-disable-next-line\n addLine(width, params = {}) {\n const symbolType = SymbolTypes.LINE;\n return this.addSymbolBlock(Object.assign(Object.assign({}, params), { symbolType, width }));\n }\n /**\n * Set the chord symbol's font family, size, weight, style (e.g., `Arial`, `10pt`, `bold`, `italic`).\n *\n * @param f is 1) a `FontInfo` object or\n * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or\n * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided).\n * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt').\n * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900).\n * @param style is a string (e.g., 'italic', 'normal').\n *\n * @override See: Element.\n */\n setFont(f, size, weight, style) {\n super.setFont(f, size, weight, style);\n this.textFormatter = TextFormatter.create(this.textFont);\n return this;\n }\n setEnableKerning(val) {\n this.useKerning = val;\n return this;\n }\n /** Set vertical position of text (above or below stave). */\n setVertical(vj) {\n this.vertical = typeof vj === 'string' ? ChordSymbol.VerticalJustifyString[vj] : vj;\n return this;\n }\n getVertical() {\n return this.vertical;\n }\n /** Set horizontal justification. */\n setHorizontal(hj) {\n this.horizontal = typeof hj === 'string' ? ChordSymbol.HorizontalJustifyString[hj] : hj;\n return this;\n }\n getHorizontal() {\n return this.horizontal;\n }\n getWidth() {\n let width = 0;\n this.symbolBlocks.forEach((symbol) => {\n width += symbol.vAlign ? 0 : symbol.width;\n });\n return width;\n }\n getYOffsetForText(text) {\n var _a;\n let acc = 0;\n let i = 0;\n for (i = 0; i < text.length; ++i) {\n const metrics = this.textFormatter.getGlyphMetrics(text[i]);\n if (metrics) {\n const yMax = (_a = metrics.y_max) !== null && _a !== void 0 ? _a : 0;\n acc = yMax < acc ? yMax : acc;\n }\n }\n const resolution = this.textFormatter.getResolution();\n return i > 0 ? -1 * (acc / resolution) : 0;\n }\n /** Render text and glyphs above/below the note. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n // We're changing context parameters. Save current state.\n ctx.save();\n const classString = Object.keys(this.getAttribute('classes')).join(' ');\n ctx.openGroup(classString, this.getAttribute('id'));\n const start = note.getModifierStartXY(Modifier.Position.ABOVE, this.index);\n ctx.setFont(this.textFont);\n let y;\n // The position of the text varies based on whether or not the note\n // has a stem.\n const hasStem = note.hasStem();\n const stave = note.checkStave();\n if (this.vertical === ChordSymbolVerticalJustify.BOTTOM) {\n // HACK: We need to compensate for the text's height since its origin is bottom-right.\n y = stave.getYForBottomText(this.text_line + Tables.TEXT_HEIGHT_OFFSET_HACK);\n if (hasStem) {\n const stem_ext = note.checkStem().getExtents();\n const spacing = stave.getSpacingBetweenLines();\n const stem_base = note.getStemDirection() === 1 ? stem_ext.baseY : stem_ext.topY;\n y = Math.max(y, stem_base + spacing * (this.text_line + 2));\n }\n }\n else {\n // (this.vertical === VerticalJustify.TOP)\n y = Math.min(stave.getYForTopText(this.text_line), note.getYs()[0] - 10);\n if (hasStem) {\n const stem_ext = note.checkStem().getExtents();\n const spacing = stave.getSpacingBetweenLines();\n y = Math.min(y, stem_ext.topY - 5 - spacing * this.text_line);\n }\n }\n let x = start.x;\n if (this.horizontal === ChordSymbolHorizontalJustify.LEFT) {\n x = start.x;\n }\n else if (this.horizontal === ChordSymbolHorizontalJustify.RIGHT) {\n x = start.x + this.getWidth();\n }\n else if (this.horizontal === ChordSymbolHorizontalJustify.CENTER) {\n x = start.x - this.getWidth() / 2;\n }\n else {\n // HorizontalJustify.CENTER_STEM\n x = note.getStemX() - this.getWidth() / 2;\n }\n L('Rendering ChordSymbol: ', this.textFormatter, x, y);\n this.symbolBlocks.forEach((symbol) => {\n const isSuper = ChordSymbol.isSuperscript(symbol);\n const isSub = ChordSymbol.isSubscript(symbol);\n let curY = y;\n L('shift was ', symbol.xShift, symbol.yShift);\n L('curY pre sub ', curY);\n if (isSuper) {\n curY += this.superscriptOffset;\n }\n if (isSub) {\n curY += this.subscriptOffset;\n }\n L('curY sup/sub ', curY);\n if (symbol.symbolType === SymbolTypes.TEXT) {\n if (isSuper || isSub) {\n ctx.save();\n if (this.textFont) {\n const { family, size, weight, style } = this.textFont;\n const smallerFontSize = Font.scaleSize(size, ChordSymbol.superSubRatio);\n ctx.setFont(family, smallerFontSize, weight, style);\n }\n }\n // TODO???\n // We estimate the text width, fill it in with the empirical value so the formatting is even.\n // const textDim = ctx.measureText(symbol.text);\n // symbol.width = textDim.width;\n L('Rendering Text: ', symbol.text, x + symbol.xShift, curY + symbol.yShift);\n ctx.fillText(symbol.text, x + symbol.xShift, curY + symbol.yShift);\n if (isSuper || isSub) {\n ctx.restore();\n }\n }\n else if (symbol.symbolType === SymbolTypes.GLYPH && symbol.glyph) {\n curY += symbol.yShift;\n L('Rendering Glyph: ', symbol.glyph.code, x + symbol.xShift, curY);\n symbol.glyph.render(ctx, x + symbol.xShift, curY);\n }\n else if (symbol.symbolType === SymbolTypes.LINE) {\n L('Rendering Line : ', symbol.width, x, curY);\n ctx.beginPath();\n ctx.setLineWidth(1); // ?\n ctx.moveTo(x, y);\n ctx.lineTo(x + symbol.width, curY);\n ctx.stroke();\n }\n x += symbol.width;\n if (symbol.vAlign) {\n x += symbol.xShift;\n }\n });\n ctx.closeGroup();\n ctx.restore();\n }\n}\nChordSymbol.DEBUG = false;\n// Chord symbols can be positioned and justified relative to the note.\nChordSymbol.HorizontalJustify = ChordSymbolHorizontalJustify;\nChordSymbol.HorizontalJustifyString = {\n left: ChordSymbolHorizontalJustify.LEFT,\n right: ChordSymbolHorizontalJustify.RIGHT,\n center: ChordSymbolHorizontalJustify.CENTER,\n centerStem: ChordSymbolHorizontalJustify.CENTER_STEM,\n};\nChordSymbol.VerticalJustify = ChordSymbolVerticalJustify;\nChordSymbol.VerticalJustifyString = {\n top: ChordSymbolVerticalJustify.TOP,\n above: ChordSymbolVerticalJustify.TOP,\n below: ChordSymbolVerticalJustify.BOTTOM,\n bottom: ChordSymbolVerticalJustify.BOTTOM,\n};\n// Glyph data\nChordSymbol.glyphs = {\n diminished: {\n code: 'csymDiminished',\n },\n dim: {\n code: 'csymDiminished',\n },\n halfDiminished: {\n code: 'csymHalfDiminished',\n },\n '+': {\n code: 'csymAugmented',\n },\n augmented: {\n code: 'csymAugmented',\n },\n majorSeventh: {\n code: 'csymMajorSeventh',\n },\n minor: {\n code: 'csymMinor',\n },\n '-': {\n code: 'csymMinor',\n },\n '(': {\n code: 'csymParensLeftTall',\n },\n leftParen: {\n code: 'csymParensLeftTall',\n },\n ')': {\n code: 'csymParensRightTall',\n },\n rightParen: {\n code: 'csymParensRightTall',\n },\n leftBracket: {\n code: 'csymBracketLeftTall',\n },\n rightBracket: {\n code: 'csymBracketRightTall',\n },\n leftParenTall: {\n code: 'csymParensLeftVeryTall',\n },\n rightParenTall: {\n code: 'csymParensRightVeryTall',\n },\n '/': {\n code: 'csymDiagonalArrangementSlash',\n },\n over: {\n code: 'csymDiagonalArrangementSlash',\n },\n '#': {\n code: 'accidentalSharp',\n },\n b: {\n code: 'accidentalFlat',\n },\n};\nChordSymbol.symbolTypes = SymbolTypes;\nChordSymbol.symbolModifiers = SymbolModifiers;\n/** Currently unused. */\nChordSymbol.noFormat = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna Cheppudira 2013.\n// Co-author: Benjamin W. Bohl\n// MIT License\nimport { Glyph } from './glyph';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Clef.DEBUG)\n log('Vex.Flow.Clef', args);\n}\n/**\n * Clef implements various types of clefs that can be rendered on a stave.\n *\n * See `tests/clef_tests.ts` for usage examples.\n */\nexport class Clef extends StaveModifier {\n /** Create a new clef. */\n constructor(type, size, annotation) {\n super();\n /**\n * The attribute `clef` must be a key from\n * `Clef.types`\n */\n this.clef = Clef.types['treble'];\n this.setPosition(StaveModifierPosition.BEGIN);\n this.setType(type, size, annotation);\n this.setWidth(Tables.currentMusicFont().lookupMetric(`clef.${this.size}.width`));\n L('Creating clef:', type);\n }\n static get CATEGORY() {\n return Category.Clef;\n }\n /**\n * Every clef name is associated with a glyph code from the font file\n * and a default stave line number.\n */\n static get types() {\n return {\n treble: {\n code: 'gClef',\n line: 3,\n point: 0,\n },\n bass: {\n code: 'fClef',\n line: 1,\n point: 0,\n },\n alto: {\n code: 'cClef',\n line: 2,\n point: 0,\n },\n tenor: {\n code: 'cClef',\n line: 1,\n point: 0,\n },\n percussion: {\n code: 'restMaxima',\n line: 2,\n point: 0,\n },\n soprano: {\n code: 'cClef',\n line: 4,\n point: 0,\n },\n 'mezzo-soprano': {\n code: 'cClef',\n line: 3,\n point: 0,\n },\n 'baritone-c': {\n code: 'cClef',\n line: 0,\n point: 0,\n },\n 'baritone-f': {\n code: 'fClef',\n line: 2,\n point: 0,\n },\n subbass: {\n code: 'fClef',\n line: 0,\n point: 0,\n },\n french: {\n code: 'gClef',\n line: 4,\n point: 0,\n },\n tab: {\n code: '6stringTabClef',\n point: 0,\n },\n };\n }\n /** Set clef type, size and annotation. */\n setType(type, size, annotation) {\n this.type = type;\n this.clef = Clef.types[type];\n if (size === undefined) {\n this.size = 'default';\n }\n else {\n this.size = size;\n }\n const musicFont = Tables.currentMusicFont();\n this.clef.point = musicFont.lookupMetric(`clef.${this.size}.point`, 0);\n this.glyph = new Glyph(this.clef.code, this.clef.point, {\n category: `clef.${this.clef.code}.${this.size}`,\n });\n // If an annotation, such as 8va, is specified, add it to the Clef object.\n if (annotation !== undefined) {\n const code = musicFont.lookupMetric(`clef.annotations.${annotation}.smuflCode`);\n const point = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.point`);\n const line = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.${this.type}.line`);\n const x_shift = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.${this.type}.shiftX`);\n this.annotation = { code, point, line, x_shift };\n this.attachment = new Glyph(this.annotation.code, this.annotation.point);\n this.attachment.metrics.x_max = 0;\n this.attachment.setXShift(this.annotation.x_shift);\n }\n else {\n this.annotation = undefined;\n }\n return this;\n }\n /** Get clef width. */\n getWidth() {\n if (this.type === 'tab') {\n defined(this.stave, 'ClefError', \"Can't get width without stave.\");\n }\n return this.width;\n }\n /** Set associated stave. */\n setStave(stave) {\n this.stave = stave;\n if (this.type === 'tab') {\n const glyph = defined(this.glyph, 'ClefError', \"Can't set stave without glyph.\");\n const numLines = this.stave.getNumLines();\n const musicFont = Tables.currentMusicFont();\n const point = musicFont.lookupMetric(`clef.lineCount.${numLines}.point`);\n const shiftY = musicFont.lookupMetric(`clef.lineCount.${numLines}.shiftY`);\n glyph.setPoint(point);\n glyph.setYShift(shiftY);\n }\n return this;\n }\n /** Render clef. */\n draw() {\n const glyph = defined(this.glyph, 'ClefError', \"Can't draw clef without glyph.\");\n const stave = this.checkStave();\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.openGroup('clef', this.getAttribute('id'));\n glyph.setStave(stave);\n glyph.setContext(ctx);\n if (this.clef.line !== undefined) {\n this.placeGlyphOnLine(glyph, stave, this.clef.line);\n }\n glyph.renderToStave(this.x);\n if (this.annotation !== undefined && this.attachment !== undefined) {\n this.placeGlyphOnLine(this.attachment, stave, this.annotation.line);\n this.attachment.setStave(stave);\n this.attachment.setContext(ctx);\n this.attachment.renderToStave(this.x);\n }\n ctx.closeGroup();\n }\n}\n/** To enable logging for this class, set `Vex.Flow.Clef.DEBUG` to `true`. */\nClef.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2014\n// MIT License\nimport { Clef } from './clef';\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Category } from './typeguard';\n/** ClefNote implements clef annotations in measures. */\nexport class ClefNote extends Note {\n constructor(type, size, annotation) {\n super({ duration: 'b' });\n this.type = type;\n this.clef_obj = new Clef(type, size, annotation);\n this.clef = this.clef_obj.clef;\n this.glyph = new Glyph(this.clef.code, this.clef.point);\n this.setWidth(this.glyph.getMetrics().width);\n // Note properties\n this.ignore_ticks = true;\n }\n static get CATEGORY() {\n return Category.ClefNote;\n }\n /** Set clef type, size and annotation. */\n setType(type, size, annotation) {\n this.type = type;\n this.clef_obj = new Clef(type, size, annotation);\n this.clef = this.clef_obj.clef;\n this.glyph = new Glyph(this.clef.code, this.clef.point);\n this.setWidth(this.glyph.getMetrics().width);\n return this;\n }\n /** Get associated clef. */\n getClef() {\n return this.clef;\n }\n /** Set associated context. */\n setContext(context) {\n super.setContext(context);\n this.glyph.setContext(this.getContext());\n return this;\n }\n /** Get bounding box. */\n getBoundingBox() {\n return super.getBoundingBox();\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n /** Render clef note. */\n draw() {\n var _a;\n const stave = this.checkStave();\n if (!this.glyph.getContext()) {\n this.glyph.setContext(this.getContext());\n }\n this.setRendered();\n const abs_x = this.getAbsoluteX();\n this.glyph.setStave(stave);\n this.glyph.setYShift(stave.getYForLine((_a = this.clef.line) !== null && _a !== void 0 ? _a : 0) - stave.getYForGlyphs());\n this.glyph.renderToStave(abs_x);\n // If the Vex.Flow.Clef has an annotation, such as 8va, draw it.\n if (this.clef_obj.annotation !== undefined) {\n const attachment = new Glyph(this.clef_obj.annotation.code, this.clef_obj.annotation.point);\n if (!attachment.getContext()) {\n attachment.setContext(this.getContext());\n }\n attachment.setStave(stave);\n attachment.setYShift(stave.getYForLine(this.clef_obj.annotation.line) - stave.getYForGlyphs());\n attachment.setXShift(this.clef_obj.annotation.x_shift);\n attachment.renderToStave(abs_x);\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// This file implements the `Crescendo` object which draws crescendos and\n// decrescendo dynamics markings. A `Crescendo` is initialized with a\n// duration and formatted as part of a `Voice` like any other `Note`\n// type in VexFlow. This object would most likely be formatted in a Voice\n// with `TextNotes` - which are used to represent other dynamics markings.\nimport { Note } from './note';\nimport { TickContext } from './tickcontext';\nimport { Category } from './typeguard';\nimport { log } from './util';\n// To enable logging for this class. Set `Vex.Flow.Crescendo.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (Crescendo.DEBUG)\n log('Vex.Flow.Crescendo', args);\n}\n// Private helper to draw the hairpin\nfunction renderHairpin(ctx, params) {\n const begin_x = params.begin_x;\n const end_x = params.end_x;\n const y = params.y;\n const half_height = params.height / 2;\n ctx.beginPath();\n if (params.reverse) {\n ctx.moveTo(begin_x, y - half_height);\n ctx.lineTo(end_x, y);\n ctx.lineTo(begin_x, y + half_height);\n }\n else {\n ctx.moveTo(end_x, y - half_height);\n ctx.lineTo(begin_x, y);\n ctx.lineTo(end_x, y + half_height);\n }\n ctx.stroke();\n ctx.closePath();\n}\nexport class Crescendo extends Note {\n // Initialize the crescendo's properties\n constructor(noteStruct) {\n super(noteStruct);\n this.options = {\n // Extensions to the length of the crescendo on either side\n extend_left: 0,\n extend_right: 0,\n // Vertical shift\n y_shift: 0,\n };\n // Whether the object is a decrescendo\n this.decrescendo = false;\n // The staff line to be placed on\n this.line = noteStruct.line || 0;\n // The height at the open end of the cresc/decresc\n this.height = 15;\n }\n /** Crescendo category string. */\n static get CATEGORY() {\n return Category.Crescendo;\n }\n // Set the line to center the element on\n setLine(line) {\n this.line = line;\n return this;\n }\n // Set the full height at the open end\n setHeight(height) {\n this.height = height;\n return this;\n }\n // Set whether the sign should be a descresendo by passing a bool\n // to `decresc`\n setDecrescendo(decresc) {\n this.decrescendo = decresc;\n return this;\n }\n // Preformat the note\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n // Render the Crescendo object onto the canvas\n draw() {\n const ctx = this.checkContext();\n const stave = this.checkStave();\n this.setRendered();\n const tick_context = this.getTickContext();\n const next_context = TickContext.getNextContext(tick_context);\n const begin_x = this.getAbsoluteX();\n const end_x = next_context ? next_context.getX() : stave.getX() + stave.getWidth();\n const y = stave.getYForLine(this.line + -3) + 1;\n L('Drawing ', this.decrescendo ? 'decrescendo ' : 'crescendo ', this.height, 'x', begin_x - end_x);\n renderHairpin(ctx, {\n begin_x: begin_x - this.options.extend_left,\n end_x: end_x + this.options.extend_right,\n y: y + this.options.y_shift,\n height: this.height,\n reverse: this.decrescendo,\n });\n }\n}\nCrescendo.DEBUG = false;\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n//\n// This class implements curves (for slurs)\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport var CurvePosition;\n(function (CurvePosition) {\n CurvePosition[CurvePosition[\"NEAR_HEAD\"] = 1] = \"NEAR_HEAD\";\n CurvePosition[CurvePosition[\"NEAR_TOP\"] = 2] = \"NEAR_TOP\";\n})(CurvePosition || (CurvePosition = {}));\nexport class Curve extends Element {\n // from: Start note\n // to: End note\n // options:\n // cps: List of control points\n // x_shift: pixels to shift\n // y_shift: pixels to shift\n constructor(from, to, options) {\n super();\n this.render_options = Object.assign({ thickness: 2, x_shift: 0, y_shift: 10, position: CurvePosition.NEAR_HEAD, position_end: CurvePosition.NEAR_HEAD, invert: false, cps: [\n { x: 0, y: 10 },\n { x: 0, y: 10 },\n ] }, options);\n this.from = from;\n this.to = to;\n }\n static get CATEGORY() {\n return Category.Curve;\n }\n static get Position() {\n return CurvePosition;\n }\n static get PositionString() {\n return {\n nearHead: CurvePosition.NEAR_HEAD,\n nearTop: CurvePosition.NEAR_TOP,\n };\n }\n setNotes(from, to) {\n if (!from && !to) {\n throw new RuntimeError('BadArguments', 'Curve needs to have either `from` or `to` set.');\n }\n this.from = from;\n this.to = to;\n return this;\n }\n /**\n * @return {boolean} Returns true if this is a partial bar.\n */\n isPartial() {\n return !this.from || !this.to;\n }\n renderCurve(params) {\n const ctx = this.checkContext();\n const x_shift = this.render_options.x_shift;\n const y_shift = this.render_options.y_shift * params.direction;\n const first_x = params.first_x + x_shift;\n const first_y = params.first_y + y_shift;\n const last_x = params.last_x - x_shift;\n const last_y = params.last_y + y_shift;\n const thickness = this.render_options.thickness;\n const cps = this.render_options.cps;\n const { x: cp0x, y: cp0y } = cps[0];\n const { x: cp1x, y: cp1y } = cps[1];\n const cp_spacing = (last_x - first_x) / (cps.length + 2);\n ctx.beginPath();\n ctx.moveTo(first_x, first_y);\n ctx.bezierCurveTo(first_x + cp_spacing + cp0x, first_y + cp0y * params.direction, last_x - cp_spacing + cp1x, last_y + cp1y * params.direction, last_x, last_y);\n ctx.bezierCurveTo(last_x - cp_spacing + cp1x, last_y + (cp1y + thickness) * params.direction, first_x + cp_spacing + cp0x, first_y + (cp0y + thickness) * params.direction, first_x, first_y);\n ctx.stroke();\n ctx.closePath();\n ctx.fill();\n }\n draw() {\n this.checkContext();\n this.setRendered();\n const first_note = this.from;\n const last_note = this.to;\n let first_x;\n let last_x;\n let first_y;\n let last_y;\n let stem_direction = 0;\n let metric = 'baseY';\n let end_metric = 'baseY';\n function getPosition(position) {\n return typeof position === 'string' ? Curve.PositionString[position] : position;\n }\n const position = getPosition(this.render_options.position);\n const position_end = getPosition(this.render_options.position_end);\n if (position === CurvePosition.NEAR_TOP) {\n metric = 'topY';\n end_metric = 'topY';\n }\n if (position_end === CurvePosition.NEAR_HEAD) {\n end_metric = 'baseY';\n }\n else if (position_end === CurvePosition.NEAR_TOP) {\n end_metric = 'topY';\n }\n if (first_note) {\n first_x = first_note.getTieRightX();\n stem_direction = first_note.getStemDirection();\n first_y = first_note.getStemExtents()[metric];\n }\n else {\n const stave = last_note.checkStave();\n first_x = stave.getTieStartX();\n first_y = last_note.getStemExtents()[metric];\n }\n if (last_note) {\n last_x = last_note.getTieLeftX();\n stem_direction = last_note.getStemDirection();\n last_y = last_note.getStemExtents()[end_metric];\n }\n else {\n const stave = first_note.checkStave();\n last_x = stave.getTieEndX();\n last_y = first_note.getStemExtents()[end_metric];\n }\n this.renderCurve({\n first_x,\n last_x,\n first_y,\n last_y,\n direction: stem_direction * (this.render_options.invert === true ? -1 : 1),\n });\n return true;\n }\n}\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n//\n// This class implements dot modifiers for notes.\nimport { Modifier } from './modifier';\nimport { Category, isGraceNote, isStaveNote, isTabNote } from './typeguard';\nimport { RuntimeError } from './util';\nexport class Dot extends Modifier {\n constructor() {\n super();\n this.position = Modifier.Position.RIGHT;\n this.radius = 2;\n this.setWidth(5);\n this.dot_shiftY = 0;\n }\n static get CATEGORY() {\n return Category.Dot;\n }\n /** Returns the dots associated to a Note. */\n static getDots(note) {\n return note.getModifiersByType(Dot.CATEGORY);\n }\n /** Add a dot on the specified keys to the notes. */\n static buildAndAttach(notes, options) {\n for (const note of notes) {\n if (options === null || options === void 0 ? void 0 : options.all) {\n for (let i = 0; i < note.keys.length; i++) {\n const dot = new Dot();\n dot.setDotShiftY(note.glyph.dot_shiftY);\n note.addModifier(dot, i);\n }\n }\n else if ((options === null || options === void 0 ? void 0 : options.index) != undefined) {\n const dot = new Dot();\n dot.setDotShiftY(note.glyph.dot_shiftY);\n note.addModifier(dot, options === null || options === void 0 ? void 0 : options.index);\n }\n else {\n const dot = new Dot();\n dot.setDotShiftY(note.glyph.dot_shiftY);\n note.addModifier(dot, 0);\n }\n }\n }\n // Arrange dots inside a ModifierContext.\n static format(dots, state) {\n const right_shift = state.right_shift;\n const dot_spacing = 1;\n if (!dots || dots.length === 0)\n return false;\n const dot_list = [];\n const max_shift_map = {};\n for (let i = 0; i < dots.length; ++i) {\n const dot = dots[i];\n const note = dot.getNote();\n let props;\n let shift;\n if (isStaveNote(note)) {\n const index = dot.checkIndex();\n props = note.getKeyProps()[index];\n // consider right displaced head with no previous modifier\n shift = note.getFirstDotPx();\n }\n else if (isTabNote(note)) {\n props = { line: 0.5 }; // Shim key props for dot placement\n shift = right_shift;\n }\n else {\n // note object is not StaveNote or TabNote.\n throw new RuntimeError('Internal', 'Unexpected instance.');\n }\n const note_id = note.getAttribute('id');\n dot_list.push({ line: props.line, note, note_id, dot });\n max_shift_map[note_id] = Math.max(max_shift_map[note_id] || shift, shift);\n }\n // Sort dots by line number.\n dot_list.sort((a, b) => b.line - a.line);\n let dot_shift = right_shift;\n let x_width = 0;\n let last_line = null;\n let last_note = null;\n let prev_dotted_space = null;\n let half_shiftY = 0;\n for (let i = 0; i < dot_list.length; ++i) {\n const { dot, note, note_id, line } = dot_list[i];\n // Reset the position of the dot every line.\n if (line !== last_line || note !== last_note) {\n dot_shift = max_shift_map[note_id];\n }\n if (!note.isRest() && line !== last_line) {\n if (Math.abs(line % 1) === 0.5) {\n // note is on a space, so no dot shift\n half_shiftY = 0;\n }\n else {\n // note is on a line, so shift dot to space above the line\n half_shiftY = 0.5;\n if (last_note != null && !last_note.isRest() && last_line != null && last_line - line === 0.5) {\n // previous note on a space, so shift dot to space below the line\n half_shiftY = -0.5;\n }\n else if (line + half_shiftY === prev_dotted_space) {\n // previous space is dotted, so shift dot to space below the line\n half_shiftY = -0.5;\n }\n }\n }\n // convert half_shiftY to a multiplier for dots.draw()\n if (note.isRest()) {\n dot.dot_shiftY += -half_shiftY;\n }\n else {\n dot.dot_shiftY = -half_shiftY;\n }\n prev_dotted_space = line + half_shiftY;\n dot.setXShift(dot_shift);\n dot_shift += dot.getWidth() + dot_spacing; // spacing\n x_width = dot_shift > x_width ? dot_shift : x_width;\n last_line = line;\n last_note = note;\n }\n // Update state.\n state.right_shift += x_width;\n return true;\n }\n setNote(note) {\n this.note = note;\n if (isGraceNote(note)) {\n this.radius *= 0.5;\n this.setWidth(3);\n }\n return this;\n }\n setDotShiftY(y) {\n this.dot_shiftY = y;\n return this;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const stave = note.checkStave();\n const lineSpace = stave.getSpacingBetweenLines();\n const start = note.getModifierStartXY(this.position, this.index, { forceFlagRight: true });\n // Set the starting y coordinate to the base of the stem for TabNotes.\n if (isTabNote(note)) {\n start.y = note.getStemExtents().baseY;\n }\n const x = start.x + this.x_shift + this.width - this.radius;\n const y = start.y + this.y_shift + this.dot_shiftY * lineSpace;\n ctx.beginPath();\n ctx.arc(x, y, this.radius, 0, Math.PI * 2, false);\n ctx.fill();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Articulation } from './articulation';\nimport { Dot } from './dot';\nimport { FretHandFinger } from './frethandfinger';\nimport { Music } from './music';\nimport { Parser } from './parser';\nimport { Stem } from './stem';\nimport { defined, log, RuntimeError } from './util';\n// To enable logging for this class. Set `Vex.Flow.EasyScore.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (EasyScore.DEBUG)\n log('Vex.Flow.EasyScore', args);\n}\nexport class EasyScoreGrammar {\n constructor(builder) {\n this.builder = builder;\n }\n begin() {\n return this.LINE;\n }\n LINE() {\n return {\n expect: [this.PIECE, this.PIECES, this.EOL],\n };\n }\n PIECE() {\n return {\n expect: [this.CHORDORNOTE, this.PARAMS],\n run: () => this.builder.commitPiece(),\n };\n }\n PIECES() {\n return {\n expect: [this.COMMA, this.PIECE],\n zeroOrMore: true,\n };\n }\n PARAMS() {\n return {\n expect: [this.DURATION, this.TYPE, this.DOTS, this.OPTS],\n };\n }\n CHORDORNOTE() {\n return {\n expect: [this.CHORD, this.SINGLENOTE],\n or: true,\n };\n }\n CHORD() {\n return {\n expect: [this.LPAREN, this.NOTES, this.RPAREN],\n // eslint-disable-next-line\n run: (state) => this.builder.addChord(state.matches[1]),\n };\n }\n NOTES() {\n return {\n expect: [this.NOTE],\n oneOrMore: true,\n };\n }\n NOTE() {\n return {\n expect: [this.NOTENAME, this.ACCIDENTAL, this.OCTAVE],\n };\n }\n SINGLENOTE() {\n return {\n expect: [this.NOTENAME, this.ACCIDENTAL, this.OCTAVE],\n run: (state) => {\n // eslint-disable-next-line\n const s = state;\n this.builder.addSingleNote(s.matches[0], s.matches[1], s.matches[2]);\n },\n };\n }\n ACCIDENTAL() {\n return {\n expect: [this.MICROTONES, this.ACCIDENTALS],\n maybe: true,\n or: true,\n };\n }\n DOTS() {\n return {\n expect: [this.DOT],\n zeroOrMore: true,\n // eslint-disable-next-line\n run: (state) => this.builder.setNoteDots(state.matches),\n };\n }\n TYPE() {\n return {\n expect: [this.SLASH, this.MAYBESLASH, this.TYPES],\n maybe: true,\n // eslint-disable-next-line\n run: (state) => this.builder.setNoteType(state.matches[2]),\n };\n }\n DURATION() {\n return {\n expect: [this.SLASH, this.DURATIONS],\n maybe: true,\n // eslint-disable-next-line\n run: (state) => this.builder.setNoteDuration(state.matches[1]),\n };\n }\n OPTS() {\n return {\n expect: [this.LBRACKET, this.KEYVAL, this.KEYVALS, this.RBRACKET],\n maybe: true,\n };\n }\n KEYVALS() {\n return {\n expect: [this.COMMA, this.KEYVAL],\n zeroOrMore: true,\n };\n }\n KEYVAL() {\n const unquote = (str) => str.slice(1, -1);\n return {\n expect: [this.KEY, this.EQUALS, this.VAL],\n // eslint-disable-next-line\n run: (state) => this.builder.addNoteOption(state.matches[0], unquote(state.matches[2])),\n };\n }\n VAL() {\n return {\n expect: [this.SVAL, this.DVAL],\n or: true,\n };\n }\n KEY() {\n return { token: '[a-zA-Z][a-zA-Z0-9]*' };\n }\n DVAL() {\n return { token: '[\"][^\"]*[\"]' };\n }\n SVAL() {\n return { token: \"['][^']*[']\" };\n }\n NOTENAME() {\n return { token: '[a-gA-G]' };\n }\n OCTAVE() {\n return { token: '[0-9]+' };\n }\n ACCIDENTALS() {\n return { token: 'bb|b|##|#|n' };\n }\n MICROTONES() {\n return { token: 'bbs|bss|bs|db|d|\\\\+\\\\+-|\\\\+-|\\\\+\\\\+|\\\\+|k|o' };\n }\n DURATIONS() {\n return { token: '[0-9whq]+' };\n }\n TYPES() {\n return { token: '[rRsSmMhHgG]' };\n }\n LPAREN() {\n return { token: '[(]' };\n }\n RPAREN() {\n return { token: '[)]' };\n }\n COMMA() {\n return { token: '[,]' };\n }\n DOT() {\n return { token: '[.]' };\n }\n SLASH() {\n return { token: '[/]' };\n }\n MAYBESLASH() {\n return { token: '[/]?' };\n }\n EQUALS() {\n return { token: '[=]' };\n }\n LBRACKET() {\n return { token: '\\\\[' };\n }\n RBRACKET() {\n return { token: '\\\\]' };\n }\n EOL() {\n return { token: '$' };\n }\n}\nexport class Piece {\n constructor(duration) {\n this.chord = [];\n this.dots = 0;\n this.options = {};\n this.duration = duration;\n }\n}\nexport class Builder {\n constructor(factory) {\n this.commitHooks = [];\n this.factory = factory;\n this.reset();\n }\n reset(options) {\n this.options = Object.assign({ stem: 'auto', clef: 'treble' }, options);\n this.elements = { notes: [], accidentals: [] };\n this.rollingDuration = '8';\n this.resetPiece();\n }\n getFactory() {\n return this.factory;\n }\n getElements() {\n return this.elements;\n }\n addCommitHook(commitHook) {\n this.commitHooks.push(commitHook);\n }\n resetPiece() {\n L('resetPiece');\n this.piece = new Piece(this.rollingDuration);\n }\n setNoteDots(dots) {\n L('setNoteDots:', dots);\n if (dots)\n this.piece.dots = dots.length;\n }\n setNoteDuration(duration) {\n L('setNoteDuration:', duration);\n this.rollingDuration = this.piece.duration = duration || this.rollingDuration;\n }\n setNoteType(type) {\n L('setNoteType:', type);\n if (type)\n this.piece.type = type;\n }\n addNoteOption(key, value) {\n L('addNoteOption: key:', key, 'value:', value);\n this.piece.options[key] = value;\n }\n addNote(key, accid, octave) {\n L('addNote:', key, accid, octave);\n this.piece.chord.push({\n key: key,\n accid,\n octave,\n });\n }\n addSingleNote(key, accid, octave) {\n L('addSingleNote:', key, accid, octave);\n this.addNote(key, accid, octave);\n }\n // notes is an array with 3 entries\n addChord(notes) {\n L('startChord');\n if (typeof notes[0] !== 'object') {\n this.addSingleNote(notes[0]);\n }\n else {\n notes.forEach((n) => {\n if (n)\n this.addNote(...n); // n => [string, string | null, string]\n });\n }\n L('endChord');\n }\n commitPiece() {\n L('commitPiece');\n const { factory } = this;\n if (!factory)\n return;\n const options = Object.assign(Object.assign({}, this.options), this.piece.options);\n // reset() sets this.options.stem & this.options.clef but we check to make sure nothing has changed.\n // e.g., auto | up | down\n const stem = defined(options.stem, 'BadArguments', 'options.stem is not defined').toLowerCase();\n // e.g., treble | bass\n const clef = defined(options.clef, 'BadArguments', 'options.clef is not defined').toLowerCase();\n const { chord, duration, dots, type } = this.piece;\n // Create a string[] that will be assigned to the .keys property of the StaveNote.\n // Each string in the array represents a note pitch and is of the form: {NoteName}{Accidental}/{Octave}\n // Only standard accidentals are included in the .keys property. Microtonal accidentals are not included.\n const standardAccidentals = Music.accidentals;\n const keys = chord.map((notePiece) => {\n var _a;\n return notePiece.key +\n (standardAccidentals.includes((_a = notePiece.accid) !== null && _a !== void 0 ? _a : '') ? notePiece.accid : '') +\n '/' +\n notePiece.octave;\n });\n const auto_stem = stem === 'auto'; // StaveNoteStruct expects the underscore & lowercase.\n // Build a GhostNote or StaveNote using the information we gathered.\n const note = (type === null || type === void 0 ? void 0 : type.toLowerCase()) == 'g'\n ? factory.GhostNote({ duration, dots })\n : factory.StaveNote({ keys, duration, dots, type, clef, auto_stem });\n if (!auto_stem)\n note.setStemDirection(stem === 'up' ? Stem.UP : Stem.DOWN);\n // Attach accidentals.\n const accidentals = [];\n chord.forEach((notePiece, index) => {\n const accid = notePiece.accid;\n if (typeof accid === 'string') {\n const accidental = factory.Accidental({ type: accid });\n note.addModifier(accidental, index);\n accidentals.push(accidental);\n }\n else {\n accidentals.push(undefined);\n }\n });\n // Attach dots.\n for (let i = 0; i < dots; i++)\n Dot.buildAndAttach([note], { all: true });\n this.commitHooks.forEach((commitHook) => commitHook(options, note, this));\n this.elements.notes.push(note);\n this.elements.accidentals.push(accidentals);\n this.resetPiece();\n }\n}\n/**\n * Commit hook used by EasyScore.setOptions().\n */\nfunction setId(options, note) {\n if (options.id === undefined)\n return;\n note.setAttribute('id', options.id);\n}\n// Used by setClass() below.\nconst commaSeparatedRegex = /\\s*,\\s*/;\n/**\n * Commit hook used by EasyScore.setOptions().\n */\nfunction setClass(options, note) {\n if (options.class === undefined)\n return;\n options.class.split(commaSeparatedRegex).forEach((className) => note.addClass(className));\n}\n/**\n * EasyScore implements a parser for a simple language to generate VexFlow objects.\n */\nexport class EasyScore {\n constructor(options = {}) {\n this.defaults = {\n clef: 'treble',\n time: '4/4',\n stem: 'auto',\n };\n this.setOptions(options);\n }\n /**\n * Set the score defaults.\n * clef must be set appropriately to avoid errors when adding Staves.\n * @param defaults.clef default clef ( treble | bass ...) see {@link Clef.types}\n * @param defaults.time default time signature ( 4/4 | 9/8 ...)\n * @param defaults.stem default stem arrangement (auto | up | down)\n * @returns this\n */\n set(defaults) {\n this.defaults = Object.assign(Object.assign({}, this.defaults), defaults);\n return this;\n }\n /**\n * @param options.factory is required.\n * @returns this\n */\n setOptions(options) {\n var _a, _b;\n // eslint-disable-next-line\n const factory = options.factory; // ! operator, because options.factory was set in Factory.EasyScore().\n const builder = (_a = options.builder) !== null && _a !== void 0 ? _a : new Builder(factory);\n this.options = Object.assign(Object.assign({ commitHooks: [setId, setClass, Articulation.easyScoreHook, FretHandFinger.easyScoreHook], throwOnError: false }, options), { factory,\n builder });\n this.factory = factory;\n this.builder = builder;\n this.grammar = new EasyScoreGrammar(this.builder);\n this.parser = new Parser(this.grammar);\n (_b = this.options.commitHooks) === null || _b === void 0 ? void 0 : _b.forEach((commitHook) => this.addCommitHook(commitHook));\n return this;\n }\n setContext(context) {\n this.factory.setContext(context);\n return this;\n }\n parse(line, options = {}) {\n this.builder.reset(options);\n const result = this.parser.parse(line);\n if (!result.success && this.options.throwOnError) {\n L(result);\n throw new RuntimeError('Error parsing line: ' + line);\n }\n return result;\n }\n beam(notes, options) {\n this.factory.Beam({ notes, options });\n return notes;\n }\n tuplet(notes, options) {\n this.factory.Tuplet({ notes, options });\n return notes;\n }\n notes(line, options = {}) {\n options = Object.assign({ clef: this.defaults.clef, stem: this.defaults.stem }, options);\n this.parse(line, options);\n return this.builder.getElements().notes;\n }\n voice(notes, options = {}) {\n options = Object.assign({ time: this.defaults.time }, options);\n return this.factory.Voice(options).addTickables(notes);\n }\n addCommitHook(commitHook) {\n this.builder.addCommitHook(commitHook);\n }\n}\nEasyScore.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Mohit Cheppudira\n// MIT License\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Registry } from './registry';\nimport { Category } from './typeguard';\nimport { defined } from './util';\n/**\n * Element implements a generic base class for VexFlow, with implementations\n * of general functions and properties that can be inherited by all VexFlow elements.\n */\nexport class Element {\n constructor() {\n var _a;\n this.attrs = {\n id: Element.newID(),\n el: undefined,\n type: this.getCategory(),\n classes: {},\n };\n this.rendered = false;\n // If a default registry exist, then register with it right away.\n (_a = Registry.getDefaultRegistry()) === null || _a === void 0 ? void 0 : _a.register(this);\n }\n static get CATEGORY() {\n return Category.Element;\n }\n static newID() {\n return `auto${Element.ID++}`;\n }\n /** Get element category string. */\n getCategory() {\n return this.constructor.CATEGORY;\n }\n /**\n * Set the element style used to render.\n *\n * Example:\n * ```typescript\n * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' });\n * element.draw();\n * ```\n * Note: If the element draws additional sub-elements (ie.: Modifiers in a Stave),\n * the style can be applied to all of them by means of the context:\n * ```typescript\n * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' });\n * element.getContext().setFillStyle('red');\n * element.getContext().setStrokeStyle('red');\n * element.draw();\n * ```\n * or using drawWithStyle:\n * ```typescript\n * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' });\n * element.drawWithStyle();\n * ```\n */\n setStyle(style) {\n this.style = style;\n return this;\n }\n /** Get the element style used for rendering. */\n getStyle() {\n return this.style;\n }\n /** Apply the element style to `context`. */\n applyStyle(context = this.context, style = this.getStyle()) {\n if (!style)\n return this;\n if (!context)\n return this;\n context.save();\n if (style.shadowColor)\n context.setShadowColor(style.shadowColor);\n if (style.shadowBlur)\n context.setShadowBlur(style.shadowBlur);\n if (style.fillStyle)\n context.setFillStyle(style.fillStyle);\n if (style.strokeStyle)\n context.setStrokeStyle(style.strokeStyle);\n if (style.lineWidth)\n context.setLineWidth(style.lineWidth);\n return this;\n }\n /** Restore the style of `context`. */\n restoreStyle(context = this.context, style = this.getStyle()) {\n if (!style)\n return this;\n if (!context)\n return this;\n context.restore();\n return this;\n }\n /**\n * Draw the element and all its sub-elements (ie.: Modifiers in a Stave)\n * with the element style.\n */\n drawWithStyle() {\n this.checkContext();\n this.applyStyle();\n this.draw();\n this.restoreStyle();\n }\n /** Check if it has a class label (An element can have multiple class labels). */\n hasClass(className) {\n return this.attrs.classes[className] === true;\n }\n /** Add a class label (An element can have multiple class labels). */\n addClass(className) {\n var _a;\n this.attrs.classes[className] = true;\n (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({\n id: this.attrs.id,\n name: 'class',\n value: className,\n oldValue: undefined,\n });\n return this;\n }\n /** Remove a class label (An element can have multiple class labels). */\n removeClass(className) {\n var _a;\n delete this.attrs.classes[className];\n (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({\n id: this.attrs.id,\n name: 'class',\n value: undefined,\n oldValue: className,\n });\n return this;\n }\n /** Call back from registry after the element is registered. */\n onRegister(registry) {\n this.registry = registry;\n return this;\n }\n /** Return the rendered status. */\n isRendered() {\n return this.rendered;\n }\n /** Set the rendered status. */\n setRendered(rendered = true) {\n this.rendered = rendered;\n return this;\n }\n /** Return the element attributes. */\n getAttributes() {\n return this.attrs;\n }\n /** Return an attribute. */\n // eslint-disable-next-line\n getAttribute(name) {\n return this.attrs[name];\n }\n /** Set an attribute. */\n // eslint-disable-next-line\n setAttribute(name, value) {\n var _a;\n const oldID = this.attrs.id;\n const oldValue = this.attrs[name];\n this.attrs[name] = value;\n // Register with old id to support id changes.\n (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({ id: oldID, name, value, oldValue });\n return this;\n }\n /** Get the boundingBox. */\n getBoundingBox() {\n return this.boundingBox;\n }\n /** Return the context. */\n getContext() {\n return this.context;\n }\n /** Set the context. */\n setContext(context) {\n this.context = context;\n return this;\n }\n /** Validate and return the context. */\n checkContext() {\n return defined(this.context, 'NoContext', 'No rendering context attached to instance.');\n }\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // Font Handling\n /**\n * Provide a CSS compatible font string (e.g., 'bold 16px Arial').\n */\n set font(f) {\n this.setFont(f);\n }\n /** Returns the CSS compatible font string. */\n get font() {\n return Font.toCSSString(this.textFont);\n }\n /**\n * Set the element's font family, size, weight, style (e.g., `Arial`, `10pt`, `bold`, `italic`).\n * @param font is 1) a `FontInfo` object or\n * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or\n * 3) a string representing the font family (at least one of `size`, `weight`, or `style` must also be provided).\n * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt').\n * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900).\n * @param style is a string (e.g., 'italic', 'normal').\n * If no arguments are provided, then the font is set to the default font.\n * Each Element subclass may specify its own default by overriding the static `TEXT_FONT` property.\n */\n setFont(font, size, weight, style) {\n // Allow subclasses to override `TEXT_FONT`.\n const defaultTextFont = this.constructor.TEXT_FONT;\n const fontIsObject = typeof font === 'object';\n const fontIsString = typeof font === 'string';\n const fontIsUndefined = font === undefined;\n const sizeWeightStyleAreUndefined = size === undefined && weight === undefined && style === undefined;\n if (fontIsObject) {\n // `font` is case 1) a FontInfo object\n this.textFont = Object.assign(Object.assign({}, defaultTextFont), font);\n }\n else if (fontIsString && sizeWeightStyleAreUndefined) {\n // `font` is case 2) CSS font shorthand.\n this.textFont = Font.fromCSSString(font);\n }\n else if (fontIsUndefined && sizeWeightStyleAreUndefined) {\n // All arguments are undefined. Do not check for `arguments.length === 0`,\n // which fails on the edge case: `setFont(undefined)`.\n // TODO: See if we can remove this case entirely without introducing a visual diff.\n // The else case below seems like it should be equivalent to this case.\n this.textFont = Object.assign({}, defaultTextFont);\n }\n else {\n // `font` is case 3) a font family string (e.g., 'Times New Roman').\n // The other parameters represent the size, weight, and style.\n // It is okay for `font` to be undefined while one or more of the other arguments is provided.\n // Following CSS conventions, unspecified params are reset to the default.\n this.textFont = Font.validate(font !== null && font !== void 0 ? font : defaultTextFont.family, size !== null && size !== void 0 ? size : defaultTextFont.size, weight !== null && weight !== void 0 ? weight : defaultTextFont.weight, style !== null && style !== void 0 ? style : defaultTextFont.style);\n }\n return this;\n }\n getFont() {\n if (!this.textFont) {\n this.resetFont();\n }\n return Font.toCSSString(this.textFont);\n }\n /**\n * Reset the text font to the style indicated by the static `TEXT_FONT` property.\n * Subclasses can call this to initialize `textFont` for the first time.\n */\n resetFont() {\n this.setFont();\n }\n /** Return a copy of the current FontInfo object. */\n get fontInfo() {\n if (!this.textFont) {\n this.resetFont();\n }\n // We can cast to Required here, because\n // we just called resetFont() above to ensure this.textFont is set.\n return Object.assign({}, this.textFont);\n }\n set fontInfo(fontInfo) {\n this.setFont(fontInfo);\n }\n /** Change the font size, while keeping everything else the same. */\n setFontSize(size) {\n const fontInfo = this.fontInfo;\n this.setFont(fontInfo.family, size, fontInfo.weight, fontInfo.style);\n return this;\n }\n /**\n * @returns a CSS font-size string (e.g., '18pt', '12px', '1em').\n * See Element.fontSizeInPixels or Element.fontSizeInPoints if you need to get a number for calculation purposes.\n */\n getFontSize() {\n return this.fontSize;\n }\n /**\n * The size is 1) a string of the form '10pt' or '16px', compatible with the CSS font-size property.\n * or 2) a number, which is interpreted as a point size (i.e. 12 == '12pt').\n */\n set fontSize(size) {\n this.setFontSize(size);\n }\n /**\n * @returns a CSS font-size string (e.g., '18pt', '12px', '1em').\n */\n get fontSize() {\n let size = this.fontInfo.size;\n if (typeof size === 'number') {\n size = `${size}pt`;\n }\n return size;\n }\n /**\n * @returns the font size in `pt`.\n */\n get fontSizeInPoints() {\n return Font.convertSizeToPointValue(this.fontSize);\n }\n /**\n * @returns the font size in `px`.\n */\n get fontSizeInPixels() {\n return Font.convertSizeToPixelValue(this.fontSize);\n }\n /**\n * @returns a CSS font-style string (e.g., 'italic').\n */\n get fontStyle() {\n return this.fontInfo.style;\n }\n set fontStyle(style) {\n const fontInfo = this.fontInfo;\n this.setFont(fontInfo.family, fontInfo.size, fontInfo.weight, style);\n }\n /**\n * @returns a CSS font-weight string (e.g., 'bold').\n * As in CSS, font-weight is always returned as a string, even if it was set as a number.\n */\n get fontWeight() {\n return this.fontInfo.weight + '';\n }\n set fontWeight(weight) {\n const fontInfo = this.fontInfo;\n this.setFont(fontInfo.family, fontInfo.size, weight, fontInfo.style);\n }\n}\nElement.ID = 1000;\n/**\n * Default font for text. This is not related to music engraving. Instead, see `Flow.setMusicFont(...fontNames)`\n * to customize the font for musical symbols placed on the score.\n */\nElement.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: Font.SIZE,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Mohit Cheppudira\n// MIT License\nimport { Accidental } from './accidental';\nimport { Annotation, AnnotationHorizontalJustify, AnnotationVerticalJustify } from './annotation';\nimport { Articulation } from './articulation';\nimport { BarNote } from './barnote';\nimport { Beam } from './beam';\nimport { ChordSymbol } from './chordsymbol';\nimport { ClefNote } from './clefnote';\nimport { Curve } from './curve';\nimport { EasyScore } from './easyscore';\nimport { Element } from './element';\nimport { Formatter } from './formatter';\nimport { FretHandFinger } from './frethandfinger';\nimport { GhostNote } from './ghostnote';\nimport { GlyphNote } from './glyphnote';\nimport { GraceNote } from './gracenote';\nimport { GraceNoteGroup } from './gracenotegroup';\nimport { KeySigNote } from './keysignote';\nimport { ModifierContext } from './modifiercontext';\nimport { MultiMeasureRest } from './multimeasurerest';\nimport { NoteSubGroup } from './notesubgroup';\nimport { PedalMarking } from './pedalmarking';\nimport { Renderer } from './renderer';\nimport { RepeatNote } from './repeatnote';\nimport { Stave } from './stave';\nimport { StaveConnector } from './staveconnector';\nimport { StaveLine } from './staveline';\nimport { StaveNote } from './stavenote';\nimport { StaveTie } from './stavetie';\nimport { StringNumber } from './stringnumber';\nimport { System } from './system';\nimport { TabNote } from './tabnote';\nimport { TabStave } from './tabstave';\nimport { TextBracket } from './textbracket';\nimport { TextDynamics } from './textdynamics';\nimport { TextNote } from './textnote';\nimport { TickContext } from './tickcontext';\nimport { TimeSigNote } from './timesignote';\nimport { Tuplet } from './tuplet';\nimport { defined, log, RuntimeError } from './util';\nimport { VibratoBracket } from './vibratobracket';\nimport { Voice } from './voice';\nimport { isHTMLCanvas } from './web';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Factory.DEBUG)\n log('Vex.Flow.Factory', args);\n}\n/**\n * Factory implements a high level API around VexFlow.\n */\nexport class Factory {\n /**\n * Example:\n *\n * Create an SVG renderer and attach it to the DIV element named \"boo\" to render using 1200 and 600\n *\n * `const vf: Factory = new Vex.Flow.Factory({renderer: { elementId: 'boo', width: 1200, height: 600 }});`\n */\n constructor(options = {}) {\n L('New factory: ', options);\n this.options = {\n stave: {\n space: 10,\n },\n renderer: {\n elementId: '',\n width: 500,\n height: 200,\n background: '#FFF',\n },\n font: Factory.TEXT_FONT,\n };\n this.setOptions(options);\n }\n /**\n * Static simplified function to access constructor without providing FactoryOptions\n *\n * Example:\n *\n * Create an SVG renderer and attach it to the DIV element named \"boo\" to render using 1200 and 600\n *\n * `const vf: Factory = Vex.Flow.Factory.newFromElementId('boo', 1200, 600 );`\n */\n static newFromElementId(elementId, width = 500, height = 200) {\n return new Factory({ renderer: { elementId, width, height } });\n }\n reset() {\n this.renderQ = [];\n this.systems = [];\n this.staves = [];\n this.voices = [];\n this.stave = undefined; // current stave\n }\n setOptions(options) {\n this.options = Object.assign(Object.assign({}, this.options), options);\n this.initRenderer();\n this.reset();\n }\n initRenderer() {\n const { elementId, width, height, background } = this.options.renderer;\n if (elementId == null) {\n return;\n }\n if (elementId == '') {\n L(this);\n throw new RuntimeError('renderer.elementId not set in FactoryOptions');\n }\n let backend = this.options.renderer.backend;\n if (backend === undefined) {\n const elem = document.getElementById(elementId);\n // We use a custom type check here, because node-canvas mimics canvas,\n // but is not an instance of window.HTMLCanvasElement.\n // In fact, `window` might be undefined here.\n // See: https://www.npmjs.com/package/canvas\n if (isHTMLCanvas(elem)) {\n backend = Renderer.Backends.CANVAS;\n }\n else {\n backend = Renderer.Backends.SVG;\n }\n }\n this.context = Renderer.buildContext(elementId, backend, width, height, background);\n }\n getContext() {\n return this.context;\n }\n setContext(context) {\n this.context = context;\n return this;\n }\n getStave() {\n return this.stave;\n }\n getVoices() {\n return this.voices;\n }\n /** Return pixels from current stave spacing. */\n Stave(params) {\n const staveSpace = this.options.stave.space;\n const p = Object.assign({ x: 0, y: 0, width: this.options.renderer.width - staveSpace * 1.0, options: { spacing_between_lines_px: staveSpace * 1.0 } }, params);\n const stave = new Stave(p.x, p.y, p.width, p.options);\n this.staves.push(stave);\n stave.setContext(this.context);\n this.stave = stave;\n return stave;\n }\n TabStave(params) {\n const staveSpace = this.options.stave.space;\n const p = Object.assign({ x: 0, y: 0, width: this.options.renderer.width - staveSpace * 1.0, options: { spacing_between_lines_px: staveSpace * 1.3 } }, params);\n const stave = new TabStave(p.x, p.y, p.width, p.options);\n this.staves.push(stave);\n stave.setContext(this.context);\n this.stave = stave;\n return stave;\n }\n StaveNote(noteStruct) {\n const note = new StaveNote(noteStruct);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n GlyphNote(glyph, noteStruct, options) {\n const note = new GlyphNote(glyph, noteStruct, options);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n RepeatNote(type, noteStruct, options) {\n const note = new RepeatNote(type, noteStruct, options);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n GhostNote(noteStruct) {\n const ghostNote = new GhostNote(noteStruct);\n if (this.stave)\n ghostNote.setStave(this.stave);\n ghostNote.setContext(this.context);\n this.renderQ.push(ghostNote);\n return ghostNote;\n }\n TextNote(noteStruct) {\n const textNote = new TextNote(noteStruct);\n if (this.stave)\n textNote.setStave(this.stave);\n textNote.setContext(this.context);\n this.renderQ.push(textNote);\n return textNote;\n }\n BarNote(params = {}) {\n const barNote = new BarNote(params.type);\n if (this.stave)\n barNote.setStave(this.stave);\n barNote.setContext(this.context);\n this.renderQ.push(barNote);\n return barNote;\n }\n ClefNote(params) {\n const p = Object.assign({ type: 'treble', options: {\n size: 'default',\n annotation: undefined,\n } }, params);\n const clefNote = new ClefNote(p.type, p.options.size, p.options.annotation);\n if (this.stave)\n clefNote.setStave(this.stave);\n clefNote.setContext(this.context);\n this.renderQ.push(clefNote);\n return clefNote;\n }\n TimeSigNote(params) {\n const p = Object.assign({ time: '4/4' }, params);\n const timeSigNote = new TimeSigNote(p.time);\n if (this.stave)\n timeSigNote.setStave(this.stave);\n timeSigNote.setContext(this.context);\n this.renderQ.push(timeSigNote);\n return timeSigNote;\n }\n KeySigNote(params) {\n const keySigNote = new KeySigNote(params.key, params.cancelKey, params.alterKey);\n if (this.stave)\n keySigNote.setStave(this.stave);\n keySigNote.setContext(this.context);\n this.renderQ.push(keySigNote);\n return keySigNote;\n }\n TabNote(noteStruct) {\n const note = new TabNote(noteStruct);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n GraceNote(noteStruct) {\n const note = new GraceNote(noteStruct);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n return note;\n }\n GraceNoteGroup(params) {\n const group = new GraceNoteGroup(params.notes, params.slur);\n group.setContext(this.context);\n return group;\n }\n Accidental(params) {\n const accid = new Accidental(params.type);\n accid.setContext(this.context);\n return accid;\n }\n Annotation(params) {\n const p = Object.assign({ text: 'p', hJustify: AnnotationHorizontalJustify.CENTER, vJustify: AnnotationVerticalJustify.BOTTOM }, params);\n const annotation = new Annotation(p.text);\n annotation.setJustification(p.hJustify);\n annotation.setVerticalJustification(p.vJustify);\n annotation.setFont(p.font);\n annotation.setContext(this.context);\n return annotation;\n }\n ChordSymbol(params) {\n const p = Object.assign({ vJustify: 'top', hJustify: 'center', kerning: true, reportWidth: true }, params);\n const chordSymbol = new ChordSymbol();\n chordSymbol.setHorizontal(p.hJustify);\n chordSymbol.setVertical(p.vJustify);\n chordSymbol.setEnableKerning(p.kerning);\n chordSymbol.setReportWidth(p.reportWidth);\n // There is a default font based on the engraving font. Only set then\n // font if it is specific, else use the default\n if (typeof p.fontFamily === 'string' && typeof p.fontSize === 'number') {\n if (typeof p.fontWeight === 'string')\n chordSymbol.setFont(p.fontFamily, p.fontSize, p.fontWeight);\n else\n chordSymbol.setFont(p.fontFamily, p.fontSize, '');\n }\n else if (typeof p.fontSize === 'number') {\n chordSymbol.setFontSize(p.fontSize);\n }\n chordSymbol.setContext(this.context);\n return chordSymbol;\n }\n Articulation(params) {\n const p = Object.assign({ type: 'a.', position: 'above' }, params);\n const articulation = new Articulation(p.type);\n articulation.setPosition(p.position);\n articulation.setContext(this.context);\n return articulation;\n }\n TextDynamics(params) {\n const p = Object.assign({ text: 'p', duration: 'q', dots: 0, line: 0 }, params);\n const text = new TextDynamics({\n text: p.text,\n line: p.line,\n duration: p.duration,\n dots: p.dots,\n });\n if (this.stave)\n text.setStave(this.stave);\n text.setContext(this.context);\n this.renderQ.push(text);\n return text;\n }\n Fingering(params) {\n const p = Object.assign({ number: '0', position: 'left' }, params);\n const fingering = new FretHandFinger(p.number);\n fingering.setPosition(p.position);\n fingering.setContext(this.context);\n return fingering;\n }\n StringNumber(params) {\n const stringNumber = new StringNumber(params.number);\n stringNumber.setPosition(params.position);\n stringNumber.setContext(this.context);\n return stringNumber;\n }\n TickContext() {\n return new TickContext();\n }\n ModifierContext() {\n return new ModifierContext();\n }\n MultiMeasureRest(params) {\n const numMeasures = defined(params.number_of_measures, 'NoNumberOfMeasures');\n const multiMeasureRest = new MultiMeasureRest(numMeasures, params);\n multiMeasureRest.setContext(this.context);\n this.renderQ.push(multiMeasureRest);\n return multiMeasureRest;\n }\n Voice(params) {\n const p = Object.assign({ time: '4/4' }, params);\n const voice = new Voice(p.time, p.options);\n this.voices.push(voice);\n return voice;\n }\n StaveConnector(params) {\n const connector = new StaveConnector(params.top_stave, params.bottom_stave);\n connector.setType(params.type).setContext(this.context);\n this.renderQ.push(connector);\n return connector;\n }\n Formatter(options) {\n return new Formatter(options);\n }\n Tuplet(params) {\n const p = Object.assign({ notes: [], options: {} }, params);\n const tuplet = new Tuplet(p.notes, p.options).setContext(this.context);\n this.renderQ.push(tuplet);\n return tuplet;\n }\n Beam(params) {\n var _a, _b, _c;\n const beam = new Beam(params.notes, (_a = params.options) === null || _a === void 0 ? void 0 : _a.autoStem).setContext(this.context);\n beam.breakSecondaryAt((_c = (_b = params.options) === null || _b === void 0 ? void 0 : _b.secondaryBeamBreaks) !== null && _c !== void 0 ? _c : []);\n this.renderQ.push(beam);\n return beam;\n }\n Curve(params) {\n const curve = new Curve(params.from, params.to, params.options).setContext(this.context);\n this.renderQ.push(curve);\n return curve;\n }\n StaveTie(params) {\n var _a;\n const tie = new StaveTie({\n first_note: params.from,\n last_note: params.to,\n first_indices: params.first_indices,\n last_indices: params.last_indices,\n }, params.text);\n if ((_a = params.options) === null || _a === void 0 ? void 0 : _a.direction)\n tie.setDirection(params.options.direction);\n tie.setContext(this.context);\n this.renderQ.push(tie);\n return tie;\n }\n StaveLine(params) {\n var _a, _b;\n const line = new StaveLine({\n first_note: params.from,\n last_note: params.to,\n first_indices: params.first_indices,\n last_indices: params.last_indices,\n });\n if ((_a = params.options) === null || _a === void 0 ? void 0 : _a.text)\n line.setText(params.options.text);\n if ((_b = params.options) === null || _b === void 0 ? void 0 : _b.font)\n line.setFont(params.options.font);\n line.setContext(this.context);\n this.renderQ.push(line);\n return line;\n }\n VibratoBracket(params) {\n const vibratoBracket = new VibratoBracket({\n start: params.from,\n stop: params.to,\n });\n if (params.options.line)\n vibratoBracket.setLine(params.options.line);\n if (params.options.harsh)\n vibratoBracket.setHarsh(params.options.harsh);\n vibratoBracket.setContext(this.context);\n this.renderQ.push(vibratoBracket);\n return vibratoBracket;\n }\n TextBracket(params) {\n const textBracket = new TextBracket({\n start: params.from,\n stop: params.to,\n text: params.text,\n superscript: params.options.superscript,\n position: params.options.position,\n });\n if (params.options.line)\n textBracket.setLine(params.options.line);\n if (params.options.font)\n textBracket.setFont(params.options.font);\n textBracket.setContext(this.context);\n this.renderQ.push(textBracket);\n return textBracket;\n }\n System(params = {}) {\n params.factory = this;\n const system = new System(params).setContext(this.context);\n this.systems.push(system);\n return system;\n }\n /**\n * Creates EasyScore. Normally the first step after constructing a Factory. For example:\n * ```\n * const vf: Factory = new Vex.Flow.Factory({renderer: { elementId: 'boo', width: 1200, height: 600 }});\n * const score: EasyScore = vf.EasyScore();\n * ```\n * @param options.factory optional instance of Factory\n * @param options.builder instance of Builder\n * @param options.commitHooks function to call after a note element is created\n * @param options.throwOnError throw error in case of parsing error\n */\n EasyScore(options = {}) {\n options.factory = this;\n return new EasyScore(options);\n }\n PedalMarking(params) {\n const p = Object.assign({ notes: [], options: {\n style: 'mixed',\n } }, params);\n const pedal = new PedalMarking(p.notes);\n pedal.setType(PedalMarking.typeString[p.options.style]);\n pedal.setContext(this.context);\n this.renderQ.push(pedal);\n return pedal;\n }\n NoteSubGroup(params) {\n const p = Object.assign({ notes: [] }, params);\n const group = new NoteSubGroup(p.notes);\n group.setContext(this.context);\n return group;\n }\n /** Render the score. */\n draw() {\n const ctx = this.context;\n this.systems.forEach((s) => s.setContext(ctx).format());\n this.staves.forEach((s) => s.setContext(ctx).draw());\n this.voices.forEach((v) => v.setContext(ctx).draw());\n this.renderQ.forEach((e) => {\n if (!e.isRendered())\n e.setContext(ctx).draw();\n });\n this.systems.forEach((s) => s.setContext(ctx).draw());\n this.reset();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Factory.DEBUG` to `true`. */\nFactory.DEBUG = false;\n/** Default text font. */\nFactory.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { Accidental } from './accidental';\nimport { Annotation } from './annotation';\nimport { Articulation } from './articulation';\nimport { BarNote } from './barnote';\nimport { Beam } from './beam';\nimport { Bend } from './bend';\nimport { BoundingBox } from './boundingbox';\nimport { BoundingBoxComputation } from './boundingboxcomputation';\nimport { CanvasContext } from './canvascontext';\nimport { ChordSymbol } from './chordsymbol';\nimport { Clef } from './clef';\nimport { ClefNote } from './clefnote';\nimport { Crescendo } from './crescendo';\nimport { Curve } from './curve';\nimport { Dot } from './dot';\nimport { EasyScore } from './easyscore';\nimport { Element } from './element';\nimport { Factory } from './factory';\nimport { Font } from './font';\nimport { Formatter } from './formatter';\nimport { Fraction } from './fraction';\nimport { FretHandFinger } from './frethandfinger';\nimport { GhostNote } from './ghostnote';\nimport { Glyph } from './glyph';\nimport { GlyphNote } from './glyphnote';\nimport { GraceNote } from './gracenote';\nimport { GraceNoteGroup } from './gracenotegroup';\nimport { GraceTabNote } from './gracetabnote';\nimport { KeyManager } from './keymanager';\nimport { KeySignature } from './keysignature';\nimport { KeySigNote } from './keysignote';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { ModifierContext } from './modifiercontext';\nimport { MultiMeasureRest } from './multimeasurerest';\nimport { Music } from './music';\nimport { Note } from './note';\nimport { NoteHead } from './notehead';\nimport { NoteSubGroup } from './notesubgroup';\nimport { Ornament } from './ornament';\nimport { Parenthesis } from './parenthesis';\nimport { Parser } from './parser';\nimport { PedalMarking } from './pedalmarking';\nimport { Registry } from './registry';\nimport { RenderContext } from './rendercontext';\nimport { Renderer } from './renderer';\nimport { RepeatNote } from './repeatnote';\nimport { Stave } from './stave';\nimport { Barline, BarlineType } from './stavebarline';\nimport { StaveConnector } from './staveconnector';\nimport { StaveHairpin } from './stavehairpin';\nimport { StaveLine } from './staveline';\nimport { StaveModifier } from './stavemodifier';\nimport { StaveNote } from './stavenote';\nimport { Repetition } from './staverepetition';\nimport { StaveTempo } from './stavetempo';\nimport { StaveText } from './stavetext';\nimport { StaveTie } from './stavetie';\nimport { Volta } from './stavevolta';\nimport { Stem } from './stem';\nimport { StringNumber } from './stringnumber';\nimport { Stroke } from './strokes';\nimport { SVGContext } from './svgcontext';\nimport { System } from './system';\nimport { Tables } from './tables';\nimport { TabNote } from './tabnote';\nimport { TabSlide } from './tabslide';\nimport { TabStave } from './tabstave';\nimport { TabTie } from './tabtie';\nimport { TextBracket } from './textbracket';\nimport { TextDynamics } from './textdynamics';\nimport { TextFormatter } from './textformatter';\nimport { TextNote } from './textnote';\nimport { TickContext } from './tickcontext';\nimport { TimeSignature } from './timesignature';\nimport { TimeSigNote } from './timesignote';\nimport { Tremolo } from './tremolo';\nimport { Tuning } from './tuning';\nimport { Tuplet } from './tuplet';\nimport { DATE, ID, VERSION } from './version';\nimport { Vibrato } from './vibrato';\nimport { VibratoBracket } from './vibratobracket';\nimport { Voice } from './voice';\nexport class Flow {\n static get BUILD() {\n return {\n /** version number. */\n VERSION: VERSION,\n /** git commit ID that this library was built from. */\n ID: ID,\n /** The date when this library was compiled. */\n DATE: DATE,\n };\n }\n static get Flow() {\n // This (circular reference) provides a handy shortcut for importing VexFlow via `require()`.\n // For example:\n // const Vex = require('vexflow');\n // const { Flow, Stave, StaveNote, Formatter, Renderer } = Vex.Flow;\n return Flow;\n }\n // ... more to come ...\n /**\n * Examples:\n * ```\n * Vex.Flow.setMusicFont('Petaluma');\n * Vex.Flow.setMusicFont('Bravura', 'Gonville');\n * ```\n *\n * **CASE 1**: You are using `vexflow.js`, which includes all music fonts (Bravura, Gonville, Petaluma, Custom).\n * In this case, calling this method is optional, since VexFlow already defaults to a music font stack of:\n * 'Bravura', 'Gonville', 'Custom'.\n *\n * **CASE 2**: You are using `vexflow-bravura.js` or `vexflow-petaluma.js` or `vexflow-gonville.js`,\n * which includes a single music font. Calling this method is unnecessary.\n *\n * **CASE 3**: You are using the light weight `vexflow-core.js` to take advantage of lazy loading for fonts.\n * In this case, the default music font stack is empty.\n * Example:\n * ```\n * await Vex.Flow.fetchMusicFont('Petaluma');\n * Vex.Flow.setMusicFont('Petaluma');\n * ... (do VexFlow stuff) ...\n * ```\n * See `demos/fonts/` for more examples.\n *\n * @returns an array of Font objects corresponding to the provided `fontNames`.\n */\n static setMusicFont(...fontNames) {\n // Convert the array of font names into an array of Font objects.\n const fonts = fontNames.map((fontName) => Font.load(fontName));\n Tables.MUSIC_FONT_STACK = fonts;\n Glyph.MUSIC_FONT_STACK = fonts.slice();\n Glyph.CURRENT_CACHE_KEY = fontNames.join(',');\n return fonts;\n }\n /**\n * Used with vexflow-core which supports dynamic font loading.\n */\n // eslint-disable-next-line\n static fetchMusicFont(fontName, fontModuleOrPath) {\n return __awaiter(this, void 0, void 0, function* () {\n // The default implementation does nothing.\n // See vexflow-core.ts for the implementation that vexflow-core.js uses.\n });\n }\n static getMusicFont() {\n const fonts = Tables.MUSIC_FONT_STACK;\n return fonts.map((font) => font.getName());\n }\n static get NOTATION_FONT_SCALE() {\n return Tables.NOTATION_FONT_SCALE;\n }\n static set NOTATION_FONT_SCALE(value) {\n Tables.NOTATION_FONT_SCALE = value;\n }\n static get TABLATURE_FONT_SCALE() {\n return Tables.TABLATURE_FONT_SCALE;\n }\n static set TABLATURE_FONT_SCALE(value) {\n Tables.TABLATURE_FONT_SCALE = value;\n }\n static get RESOLUTION() {\n return Tables.RESOLUTION;\n }\n static set RESOLUTION(value) {\n Tables.RESOLUTION = value;\n }\n static get SLASH_NOTEHEAD_WIDTH() {\n return Tables.SLASH_NOTEHEAD_WIDTH;\n }\n static set SLASH_NOTEHEAD_WIDTH(value) {\n Tables.SLASH_NOTEHEAD_WIDTH = value;\n }\n static get STAVE_LINE_DISTANCE() {\n return Tables.STAVE_LINE_DISTANCE;\n }\n static set STAVE_LINE_DISTANCE(value) {\n Tables.STAVE_LINE_DISTANCE = value;\n }\n static get STAVE_LINE_THICKNESS() {\n return Tables.STAVE_LINE_THICKNESS;\n }\n static set STAVE_LINE_THICKNESS(value) {\n Tables.STAVE_LINE_THICKNESS = value;\n }\n static get STEM_HEIGHT() {\n return Tables.STEM_HEIGHT;\n }\n static set STEM_HEIGHT(value) {\n Tables.STEM_HEIGHT = value;\n }\n static get STEM_WIDTH() {\n return Tables.STEM_WIDTH;\n }\n static set STEM_WIDTH(value) {\n Tables.STEM_WIDTH = value;\n }\n static get TIME4_4() {\n return Tables.TIME4_4;\n }\n static get accidentalMap() {\n return Tables.accidentalMap;\n }\n static get unicode() {\n return Tables.unicode;\n }\n static keySignature(spec) {\n return Tables.keySignature(spec);\n }\n static hasKeySignature(spec) {\n return Tables.hasKeySignature(spec);\n }\n static getKeySignatures() {\n return Tables.getKeySignatures();\n }\n static clefProperties(clef) {\n return Tables.clefProperties(clef);\n }\n // eslint-disable-next-line\n static keyProperties(key, clef, params) {\n return Tables.keyProperties(key, clef, params);\n }\n static durationToTicks(duration) {\n return Tables.durationToTicks(duration);\n }\n}\nFlow.Accidental = Accidental;\nFlow.Annotation = Annotation;\nFlow.Articulation = Articulation;\nFlow.Barline = Barline;\nFlow.BarNote = BarNote;\nFlow.Beam = Beam;\nFlow.Bend = Bend;\nFlow.BoundingBox = BoundingBox;\nFlow.BoundingBoxComputation = BoundingBoxComputation;\nFlow.CanvasContext = CanvasContext;\nFlow.ChordSymbol = ChordSymbol;\nFlow.Clef = Clef;\nFlow.ClefNote = ClefNote;\nFlow.Crescendo = Crescendo;\nFlow.Curve = Curve;\nFlow.Dot = Dot;\nFlow.EasyScore = EasyScore;\nFlow.Element = Element;\nFlow.Factory = Factory;\nFlow.Font = Font;\nFlow.Formatter = Formatter;\nFlow.Fraction = Fraction;\nFlow.FretHandFinger = FretHandFinger;\nFlow.GhostNote = GhostNote;\nFlow.Glyph = Glyph;\nFlow.GlyphNote = GlyphNote;\nFlow.GraceNote = GraceNote;\nFlow.GraceNoteGroup = GraceNoteGroup;\nFlow.GraceTabNote = GraceTabNote;\nFlow.KeyManager = KeyManager;\nFlow.KeySignature = KeySignature;\nFlow.KeySigNote = KeySigNote;\nFlow.Modifier = Modifier;\nFlow.ModifierContext = ModifierContext;\nFlow.MultiMeasureRest = MultiMeasureRest;\nFlow.Music = Music;\nFlow.Note = Note;\nFlow.NoteHead = NoteHead;\nFlow.NoteSubGroup = NoteSubGroup;\nFlow.Ornament = Ornament;\nFlow.Parenthesis = Parenthesis;\nFlow.Parser = Parser;\nFlow.PedalMarking = PedalMarking;\nFlow.Registry = Registry;\nFlow.RenderContext = RenderContext;\nFlow.Renderer = Renderer;\nFlow.RepeatNote = RepeatNote;\nFlow.Repetition = Repetition;\nFlow.Stave = Stave;\nFlow.StaveConnector = StaveConnector;\nFlow.StaveHairpin = StaveHairpin;\nFlow.StaveLine = StaveLine;\nFlow.StaveModifier = StaveModifier;\nFlow.StaveNote = StaveNote;\nFlow.StaveTempo = StaveTempo;\nFlow.StaveText = StaveText;\nFlow.StaveTie = StaveTie;\nFlow.Stem = Stem;\nFlow.StringNumber = StringNumber;\nFlow.Stroke = Stroke;\nFlow.SVGContext = SVGContext;\nFlow.System = System;\nFlow.TabNote = TabNote;\nFlow.TabSlide = TabSlide;\nFlow.TabStave = TabStave;\nFlow.TabTie = TabTie;\nFlow.TextBracket = TextBracket;\nFlow.TextDynamics = TextDynamics;\nFlow.TextFormatter = TextFormatter;\nFlow.TextNote = TextNote;\nFlow.TickContext = TickContext;\nFlow.TimeSignature = TimeSignature;\nFlow.TimeSigNote = TimeSigNote;\nFlow.Tremolo = Tremolo;\nFlow.Tuning = Tuning;\nFlow.Tuplet = Tuplet;\nFlow.Vibrato = Vibrato;\nFlow.VibratoBracket = VibratoBracket;\nFlow.Voice = Voice;\nFlow.Volta = Volta;\n// enums need to be exported too!\nFlow.BarlineType = BarlineType;\nFlow.ModifierPosition = ModifierPosition;\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { defined } from './util';\nexport var FontWeight;\n(function (FontWeight) {\n FontWeight[\"NORMAL\"] = \"normal\";\n FontWeight[\"BOLD\"] = \"bold\";\n})(FontWeight || (FontWeight = {}));\nexport var FontStyle;\n(function (FontStyle) {\n FontStyle[\"NORMAL\"] = \"normal\";\n FontStyle[\"ITALIC\"] = \"italic\";\n})(FontStyle || (FontStyle = {}));\n// Internal element for parsing CSS font shorthand strings.\nlet fontParser;\nconst Fonts = {};\nexport class Font {\n /**\n * Use `Font.load(fontName)` to get a Font object.\n * Do not call this constructor directly.\n */\n constructor(fontName) {\n this.name = fontName;\n }\n /**\n * @param fontSize a font size to convert. Can be specified as a CSS length string (e.g., '16pt', '1em')\n * or as a number (the unit is assumed to be 'pt'). See `Font.scaleToPxFrom` for the supported\n * units (e.g., pt, em, %).\n * @returns the number of pixels that is equivalent to `fontSize`\n */\n static convertSizeToPixelValue(fontSize = Font.SIZE) {\n var _a;\n if (typeof fontSize === 'number') {\n // Assume the numeric fontSize is specified in pt.\n return fontSize * Font.scaleToPxFrom.pt;\n }\n else {\n const value = parseFloat(fontSize);\n if (isNaN(value)) {\n return 0;\n }\n const unit = fontSize.replace(/[\\d.\\s]/g, '').toLowerCase(); // Extract the unit by removing all numbers, dots, spaces.\n const conversionFactor = (_a = Font.scaleToPxFrom[unit]) !== null && _a !== void 0 ? _a : 1;\n return value * conversionFactor;\n }\n }\n /**\n * @param fontSize a font size to convert. Can be specified as a CSS length string (e.g., '16pt', '1em')\n * or as a number (the unit is assumed to be 'pt'). See `Font.scaleToPxFrom` for the supported\n * units (e.g., pt, em, %).\n * @returns the number of points that is equivalent to `fontSize`\n */\n static convertSizeToPointValue(fontSize = Font.SIZE) {\n var _a;\n if (typeof fontSize === 'number') {\n // Assume the numeric fontSize is specified in pt.\n return fontSize;\n }\n else {\n const value = parseFloat(fontSize);\n if (isNaN(value)) {\n return 0;\n }\n const unit = fontSize.replace(/[\\d.\\s]/g, '').toLowerCase(); // Extract the unit by removing all numbers, dots, spaces.\n const conversionFactor = ((_a = Font.scaleToPxFrom[unit]) !== null && _a !== void 0 ? _a : 1) / Font.scaleToPxFrom.pt;\n return value * conversionFactor;\n }\n }\n /**\n * @param f\n * @param size\n * @param weight\n * @param style\n * @returns the `size` field will include the units (e.g., '12pt', '16px').\n */\n static validate(f, size, weight, style) {\n // If f is a string but all other arguments are undefined, we assume that\n // f is CSS font shorthand (e.g., 'italic bold 10pt Arial').\n if (typeof f === 'string' && size === undefined && weight === undefined && style === undefined) {\n return Font.fromCSSString(f);\n }\n let family;\n if (typeof f === 'object') {\n // f is a FontInfo object, so we extract its fields.\n family = f.family;\n size = f.size;\n weight = f.weight;\n style = f.style;\n }\n else {\n // f is a string representing the font family name or undefined.\n family = f;\n }\n family = family !== null && family !== void 0 ? family : Font.SANS_SERIF;\n size = size !== null && size !== void 0 ? size : Font.SIZE + 'pt';\n weight = weight !== null && weight !== void 0 ? weight : FontWeight.NORMAL;\n style = style !== null && style !== void 0 ? style : FontStyle.NORMAL;\n if (weight === '') {\n weight = FontWeight.NORMAL;\n }\n if (style === '') {\n style = FontStyle.NORMAL;\n }\n // If size is a number, we assume the unit is `pt`.\n if (typeof size === 'number') {\n size = `${size}pt`;\n }\n // If weight is a number (e.g., 900), turn it into a string representation of that number.\n if (typeof weight === 'number') {\n weight = weight.toString();\n }\n // At this point, `family`, `size`, `weight`, and `style` are all strings.\n return { family, size, weight, style };\n }\n /**\n * @param cssFontShorthand a string formatted as CSS font shorthand (e.g., 'italic bold 15pt Arial').\n */\n static fromCSSString(cssFontShorthand) {\n // Let the browser parse this string for us.\n // First, create a span element.\n // Then, set its style.font and extract it back out.\n if (!fontParser) {\n fontParser = document.createElement('span');\n }\n fontParser.style.font = cssFontShorthand;\n const { fontFamily, fontSize, fontWeight, fontStyle } = fontParser.style;\n return { family: fontFamily, size: fontSize, weight: fontWeight, style: fontStyle };\n }\n /**\n * @returns a CSS font shorthand string of the form `italic bold 16pt Arial`.\n */\n static toCSSString(fontInfo) {\n var _a;\n if (!fontInfo) {\n return '';\n }\n let style;\n const st = fontInfo.style;\n if (st === FontStyle.NORMAL || st === '' || st === undefined) {\n style = ''; // no space! Omit the style section.\n }\n else {\n style = st.trim() + ' ';\n }\n let weight;\n const wt = fontInfo.weight;\n if (wt === FontWeight.NORMAL || wt === '' || wt === undefined) {\n weight = ''; // no space! Omit the weight section.\n }\n else if (typeof wt === 'number') {\n weight = wt + ' ';\n }\n else {\n weight = wt.trim() + ' ';\n }\n let size;\n const sz = fontInfo.size;\n if (sz === undefined) {\n size = Font.SIZE + 'pt ';\n }\n else if (typeof sz === 'number') {\n size = sz + 'pt ';\n }\n else {\n // size is already a string.\n size = sz.trim() + ' ';\n }\n const family = (_a = fontInfo.family) !== null && _a !== void 0 ? _a : Font.SANS_SERIF;\n return `${style}${weight}${size}${family}`;\n }\n /**\n * @param fontSize a number representing a font size, or a string font size with units.\n * @param scaleFactor multiply the size by this factor.\n * @returns size * scaleFactor (e.g., 16pt * 3 = 48pt, 8px * 0.5 = 4px, 24 * 2 = 48).\n * If the fontSize argument was a number, the return value will be a number.\n * If the fontSize argument was a string, the return value will be a string.\n */\n static scaleSize(fontSize, scaleFactor) {\n if (typeof fontSize === 'number') {\n return (fontSize * scaleFactor);\n }\n else {\n const value = parseFloat(fontSize);\n const unit = fontSize.replace(/[\\d.\\s]/g, ''); // Remove all numbers, dots, spaces.\n return `${value * scaleFactor}${unit}`;\n }\n }\n /**\n * @param weight a string (e.g., 'bold') or a number (e.g., 600 / semi-bold in the OpenType spec).\n * @returns true if the font weight indicates bold.\n */\n static isBold(weight) {\n if (!weight) {\n return false;\n }\n else if (typeof weight === 'number') {\n return weight >= 600;\n }\n else {\n // a string can be 'bold' or '700'\n const parsedWeight = parseInt(weight, 10);\n if (isNaN(parsedWeight)) {\n return weight.toLowerCase() === 'bold';\n }\n else {\n return parsedWeight >= 600;\n }\n }\n }\n /**\n * @param style\n * @returns true if the font style indicates 'italic'.\n */\n static isItalic(style) {\n if (!style) {\n return false;\n }\n else {\n return style.toLowerCase() === FontStyle.ITALIC;\n }\n }\n /**\n * @param fontName\n * @param woffURL The absolute or relative URL to the woff file.\n * @param includeWoff2 If true, we assume that a woff2 file is in\n * the same folder as the woff file, and will append a `2` to the url.\n */\n // Support distributions of the typescript compiler that do not yet include the FontFace API declarations.\n // eslint-disable-next-line\n // @ts-ignore\n static loadWebFont(fontName, woffURL, includeWoff2 = true) {\n return __awaiter(this, void 0, void 0, function* () {\n const woff2URL = includeWoff2 ? `url(${woffURL}2) format('woff2'), ` : '';\n const woff1URL = `url(${woffURL}) format('woff')`;\n const woffURLs = woff2URL + woff1URL;\n // eslint-disable-next-line\n // @ts-ignore\n const fontFace = new FontFace(fontName, woffURLs);\n yield fontFace.load();\n // eslint-disable-next-line\n // @ts-ignore\n document.fonts.add(fontFace);\n return fontFace;\n });\n }\n /**\n * Load the web fonts that are used by ChordSymbol. For example, `flow.html` calls:\n * `await Vex.Flow.Font.loadWebFonts();`\n * Alternatively, you may load web fonts with a stylesheet link (e.g., from Google Fonts),\n * and a @font-face { font-family: ... } rule in your CSS.\n * If you do not load either of these fonts, ChordSymbol will fall back to Times or Arial,\n * depending on the current music engraving font.\n *\n * You can customize `Font.WEB_FONT_HOST` and `Font.WEB_FONT_FILES` to load different fonts\n * for your app.\n */\n static loadWebFonts() {\n return __awaiter(this, void 0, void 0, function* () {\n const host = Font.WEB_FONT_HOST;\n const files = Font.WEB_FONT_FILES;\n for (const fontName in files) {\n const fontPath = files[fontName];\n Font.loadWebFont(fontName, host + fontPath);\n }\n });\n }\n static loadTextFonts() {\n //\n }\n /**\n * @param fontName\n * @param data optionally set the Font object's `.data` property.\n * This is usually done when setting up a font for the first time.\n * @param metrics optionally set the Font object's `.metrics` property.\n * This is usually done when setting up a font for the first time.\n * @returns a Font object with the given `fontName`.\n * Reuse an existing Font object if a matching one is found.\n */\n static load(fontName, data, metrics) {\n let font = Fonts[fontName];\n if (!font) {\n font = new Font(fontName);\n Fonts[fontName] = font;\n }\n if (data) {\n font.setData(data);\n }\n if (metrics) {\n font.setMetrics(metrics);\n }\n return font;\n }\n getName() {\n return this.name;\n }\n getData() {\n return defined(this.data, 'FontError', 'Missing font data');\n }\n getMetrics() {\n return defined(this.metrics, 'FontError', 'Missing metrics');\n }\n setData(data) {\n this.data = data;\n }\n setMetrics(metrics) {\n this.metrics = metrics;\n }\n hasData() {\n return this.data !== undefined;\n }\n getResolution() {\n return this.getData().resolution;\n }\n getGlyphs() {\n return this.getData().glyphs;\n }\n /**\n * Use the provided key to look up a value in this font's metrics file (e.g., bravura_metrics.ts, petaluma_metrics.ts).\n * @param key is a string separated by periods (e.g., stave.endPaddingMax, clef.lineCount.'5'.shiftY).\n * @param defaultValue is returned if the lookup fails.\n * @returns the retrieved value (or `defaultValue` if the lookup fails).\n */\n // eslint-disable-next-line\n lookupMetric(key, defaultValue) {\n const keyParts = key.split('.');\n // Start with the top level font metrics object, and keep looking deeper into the object (via each part of the period-delimited key).\n let currObj = this.getMetrics();\n for (let i = 0; i < keyParts.length; i++) {\n const keyPart = keyParts[i];\n const value = currObj[keyPart];\n if (value === undefined) {\n // If the key lookup fails, we fall back to the defaultValue.\n return defaultValue;\n }\n // The most recent lookup succeeded, so we drill deeper into the object.\n currObj = value;\n }\n // After checking every part of the key (i.e., the loop completed), return the most recently retrieved value.\n return currObj;\n }\n /** For debugging. */\n toString() {\n return '[' + this.name + ' Font]';\n }\n}\n//////////////////////////////////////////////////////////////////////////////////////////////////\n// STATIC MEMBERS\n/** Default sans-serif font family. */\nFont.SANS_SERIF = 'Arial, sans-serif';\n/** Default serif font family. */\nFont.SERIF = 'Times New Roman, serif';\n/** Default font size in `pt`. */\nFont.SIZE = 10;\n// CSS Font Sizes: 36pt == 48px == 3em == 300% == 0.5in\n/** Given a length (for units: pt, px, em, %, in, mm, cm) what is the scale factor to convert it to px? */\nFont.scaleToPxFrom = {\n pt: 4 / 3,\n px: 1,\n em: 16,\n '%': 4 / 25,\n in: 96,\n mm: 96 / 25.4,\n cm: 96 / 2.54,\n};\n/**\n * Customize this field to specify a different CDN for delivering web fonts.\n * Alternative: https://cdn.jsdelivr.net/npm/vexflow-fonts@1.0.3/\n * Or you can use your own host.\n */\nFont.WEB_FONT_HOST = 'https://unpkg.com/vexflow-fonts@1.0.3/';\n/**\n * These font files will be loaded from the CDN specified by `Font.WEB_FONT_HOST` when\n * `await Font.loadWebFonts()` is called. Customize this field to specify a different\n * set of fonts to load. See: `Font.loadWebFonts()`.\n */\nFont.WEB_FONT_FILES = {\n 'Roboto Slab': 'robotoslab/RobotoSlab-Medium_2.001.woff',\n PetalumaScript: 'petaluma/PetalumaScript_1.10_FS.woff',\n};\n","export const BravuraFont = {\n glyphs: {\n bracketTop: {\n x_min: 0,\n x_max: 469,\n y_min: 0,\n y_max: 295,\n ha: 295,\n o: 'm 0 0 l 180 0 b 674 390 410 43 616 150 b 675 405 675 396 675 400 b 664 425 675 416 671 422 b 628 405 651 425 635 415 b 157 179 613 389 432 199 l 12 179 b 0 168 3 179 0 177 z',\n },\n bracketBottom: {\n x_min: 0,\n x_max: 469,\n y_min: -295,\n y_max: 0,\n ha: 295,\n o: 'm 0 -168 b 12 -179 0 -177 3 -179 l 157 -179 b 628 -405 432 -199 613 -389 b 664 -425 635 -415 651 -425 b 675 -405 671 -422 675 -416 b 674 -390 675 -400 675 -396 b 180 0 616 -150 410 -43 l 0 0 z',\n },\n barlineTick: {\n x_min: 0,\n x_max: 36,\n y_min: 868,\n y_max: 1120,\n ha: 252,\n o: 'm 52 1250 l 52 1613 l 0 1613 l 0 1250 z',\n },\n breathMarkTick: {\n x_min: 0,\n x_max: 500,\n y_min: 0,\n y_max: 502,\n ha: 502,\n o: 'm 9 367 b 0 374 6 372 3 374 b 9 334 0 367 0 343 b 179 19 40 312 164 121 b 192 0 179 3 186 0 b 210 19 197 0 207 6 b 698 701 245 197 507 658 b 720 714 714 704 720 711 b 698 723 720 720 711 723 b 197 186 455 714 210 202 b 186 176 194 179 189 176 b 176 186 179 176 176 186 b 9 367 143 266 27 359 z',\n },\n segno: {\n x_min: 4,\n x_max: 550,\n y_min: -27,\n y_max: 759,\n ha: 786,\n o: 'm 194 958 b 217 939 203 958 213 955 l 220 929 b 325 805 230 890 252 805 b 425 901 384 805 425 840 b 413 969 425 923 420 946 b 220 1060 390 1035 294 1060 b 6 793 120 1060 6 936 b 29 687 6 759 13 723 b 295 449 75 582 284 454 b 304 438 301 446 304 444 b 295 415 304 432 301 425 b 78 22 285 395 78 22 b 73 3 75 16 73 9 b 114 -39 73 -20 91 -39 b 150 -17 128 -39 143 -30 b 377 395 150 -17 373 386 b 395 402 377 393 389 402 b 704 176 416 397 704 312 b 621 75 704 120 670 82 l 616 73 b 562 138 586 73 562 94 l 562 154 b 485 249 562 209 526 249 b 468 246 480 249 474 248 b 366 153 415 233 366 210 b 540 -12 366 65 455 -12 b 600 -1 559 -12 579 -9 b 792 251 716 37 792 131 b 789 292 792 264 791 278 b 523 588 768 451 540 579 b 498 611 505 598 498 603 b 501 619 498 613 500 616 b 732 1032 508 631 732 1032 b 737 1053 736 1040 737 1045 b 697 1093 737 1076 719 1093 b 661 1073 683 1093 668 1086 b 423 647 661 1073 432 660 b 410 635 419 639 416 635 b 396 639 406 635 402 636 b 128 792 383 644 166 727 b 108 868 120 808 108 838 b 186 958 108 907 125 948 z m 598 671 b 680 589 598 626 635 589 b 762 671 726 589 762 626 b 680 753 762 717 726 753 b 598 671 635 753 598 717 z m 202 380 b 120 462 202 425 166 462 b 37 380 75 462 37 425 b 120 298 37 334 75 298 b 202 380 166 298 202 334 z',\n },\n coda: {\n x_min: -4,\n x_max: 955,\n y_min: -158,\n y_max: 898,\n ha: 1056,\n o: 'm 1349 576 l 1178 576 b 729 1083 1164 847 962 1064 l 729 1269 b 694 1293 729 1287 713 1293 b 660 1269 675 1293 660 1287 l 660 1083 b 210 576 426 1064 226 848 l 20 576 b -6 541 0 576 -6 560 b 20 507 -6 523 0 507 l 210 507 b 660 0 226 238 426 19 l 660 -202 b 694 -228 660 -222 675 -228 b 729 -202 713 -228 729 -222 l 729 0 b 1178 507 962 19 1164 238 l 1349 507 b 1375 541 1369 507 1375 523 b 1349 576 1375 560 1369 576 z m 940 576 l 729 576 l 729 1002 b 940 576 930 985 940 809 z m 660 1002 l 660 576 l 455 576 b 660 1002 455 809 455 985 z m 455 507 l 660 507 l 660 69 b 455 507 474 91 456 285 z m 729 69 l 729 507 l 940 507 b 729 69 936 287 909 91 z',\n },\n gClef: {\n x_min: 0,\n x_max: 671,\n y_min: -658,\n y_max: 1098,\n ha: 1756,\n o: 'm 541 598 b 550 625 539 615 541 616 b 824 1174 706 770 824 953 b 730 1509 824 1299 789 1423 b 655 1581 708 1541 671 1581 b 562 1512 635 1581 590 1544 b 420 1064 455 1394 420 1214 b 441 828 420 981 431 887 b 428 793 444 811 445 808 b 0 125 220 622 0 416 b 524 -363 0 -125 171 -363 b 624 -354 557 -363 595 -360 b 645 -367 639 -351 642 -350 b 684 -657 662 -464 684 -589 b 455 -896 684 -870 540 -896 b 340 -854 377 -896 340 -873 b 386 -829 340 -844 353 -840 b 482 -694 431 -816 482 -778 b 344 -547 482 -615 432 -547 b 190 -713 248 -547 190 -624 b 464 -948 190 -806 246 -948 b 747 -660 560 -948 747 -904 b 706 -351 747 -577 721 -441 b 724 -327 703 -334 704 -336 b 966 16 870 -269 966 -147 b 619 363 966 200 831 363 b 577 389 582 363 582 363 z m 677 1358 b 763 1240 724 1358 763 1319 b 513 851 763 1080 626 950 b 494 863 503 842 497 844 b 485 995 488 900 485 949 b 677 1358 485 1220 589 1358 z m 520 377 b 498 343 524 350 524 351 b 289 63 372 300 289 186 b 455 -192 289 -66 357 -158 b 494 -200 467 -196 484 -200 b 511 -184 505 -200 511 -193 b 490 -166 511 -174 500 -170 b 386 -12 429 -140 386 -78 b 530 157 386 71 442 132 b 559 145 553 163 556 161 l 631 -284 b 611 -304 634 -300 632 -300 b 530 -311 588 -308 559 -311 b 115 29 278 -311 115 -171 b 249 363 115 114 130 228 b 469 567 336 459 402 513 b 490 562 484 579 487 577 z m 619 148 b 635 168 616 166 618 170 b 848 -66 752 158 848 60 b 713 -271 848 -157 793 -230 b 690 -262 696 -279 693 -279 z',\n },\n cClef: {\n x_min: 0,\n x_max: 699,\n y_min: -506,\n y_max: 506,\n ha: 1012,\n o: 'm 331 694 b 301 724 331 714 321 724 l 300 724 b 269 694 279 724 269 714 l 269 -694 b 300 -724 269 -714 279 -724 l 301 -724 b 331 -694 321 -724 331 -714 l 331 -63 b 344 -55 331 -52 338 -53 b 472 -265 382 -65 442 -102 b 500 -301 477 -288 485 -301 b 530 -262 516 -301 523 -287 b 684 -128 549 -199 582 -128 b 804 -409 778 -128 804 -220 b 651 -683 804 -598 770 -683 b 528 -644 631 -683 528 -674 b 567 -622 528 -636 552 -628 b 625 -528 596 -612 625 -583 b 527 -429 625 -465 583 -429 b 416 -547 465 -429 416 -471 b 667 -729 416 -638 495 -729 b 1007 -413 903 -729 1007 -563 b 706 -76 1007 -215 897 -76 b 618 -89 664 -76 636 -84 b 576 -88 603 -94 589 -96 b 524 0 556 -75 524 -29 b 576 88 524 29 556 75 b 618 89 589 96 603 94 b 706 76 636 84 664 76 b 1007 413 897 76 1007 215 b 667 729 1007 563 903 729 b 416 547 495 729 416 638 b 527 429 416 471 465 429 b 625 528 583 429 625 465 b 567 622 625 583 596 612 b 528 644 552 628 528 636 b 651 683 528 674 631 683 b 804 409 770 683 804 598 b 684 128 804 220 778 128 b 530 262 582 128 549 199 b 500 301 523 287 516 301 b 472 265 485 301 477 288 b 344 55 442 102 382 65 b 331 63 338 53 331 52 z m 30 724 b 0 694 10 724 0 714 l 0 -694 b 30 -724 0 -714 10 -724 l 154 -724 b 184 -694 174 -724 184 -714 l 184 694 b 154 724 184 714 174 724 z',\n },\n fClef: {\n x_min: -5,\n x_max: 684,\n y_min: -635,\n y_max: 262,\n ha: 897,\n o: 'm 363 377 b 0 56 112 377 0 194 b 177 -158 0 -59 60 -158 b 330 -6 268 -158 330 -95 b 192 144 330 86 262 144 b 120 134 153 144 138 134 b 96 160 101 134 96 145 b 330 323 96 217 183 323 b 549 -53 482 323 549 173 b 14 -871 549 -455 350 -680 b -7 -897 1 -878 -7 -886 b 12 -914 -7 -906 -1 -914 b 36 -907 19 -914 27 -912 b 765 -40 390 -734 765 -478 b 363 377 765 210 612 377 z m 906 259 b 827 180 861 259 827 225 b 906 101 827 135 861 101 b 985 180 950 101 985 135 b 906 259 985 225 950 259 z m 907 -102 b 829 -180 863 -102 829 -135 b 907 -258 829 -225 863 -258 b 985 -180 952 -258 985 -225 b 907 -102 985 -135 952 -102 z',\n },\n unpitchedPercussionClef1: {\n x_min: 0,\n x_max: 382,\n y_min: -250,\n y_max: 250,\n ha: 500,\n o: 'm 230 -338 l 230 338 b 210 360 230 350 222 360 l 20 360 b 0 338 9 360 0 350 l 0 -338 b 20 -360 0 -350 9 -360 l 210 -360 b 230 -338 222 -360 230 -350 z m 550 338 b 530 360 550 350 541 360 l 340 360 b 320 338 328 360 320 350 l 320 -338 b 340 -360 320 -350 328 -360 l 530 -360 b 550 -338 541 -360 550 -350 z',\n },\n '6stringTabClef': {\n x_min: -3,\n x_max: 408,\n y_min: -748,\n y_max: 764,\n ha: 1512,\n o: 'm 557 1024 l 557 1100 l 26 1100 l 26 1024 l 249 1024 l 249 422 l 336 422 l 336 1024 z m 588 -328 l 350 348 l 238 348 l -4 -328 l 88 -328 l 160 -125 l 420 -125 l 491 -328 z m 397 -52 l 181 -52 l 292 256 z m 544 -883 b 420 -719 544 -802 507 -752 b 514 -572 482 -690 514 -639 b 314 -399 514 -472 442 -399 l 39 -399 l 39 -1077 l 344 -1077 b 544 -883 467 -1077 544 -995 z m 428 -583 b 292 -691 428 -652 389 -691 l 125 -691 l 125 -475 l 292 -475 b 428 -583 389 -475 428 -514 z m 458 -884 b 337 -1001 458 -949 418 -1001 l 125 -1001 l 125 -768 l 337 -768 b 458 -884 418 -768 458 -818 z',\n },\n timeSig0: {\n x_min: 20,\n x_max: 450,\n y_min: -250,\n y_max: 251,\n ha: 501,\n o: 'm 648 0 b 338 361 648 200 510 361 b 29 0 167 361 29 200 b 338 -360 29 -199 167 -360 b 648 0 510 -360 648 -199 z m 338 317 b 446 10 397 317 446 180 b 338 -295 446 -158 397 -295 b 230 10 278 -295 230 -158 b 338 317 230 180 278 317 z',\n },\n timeSig1: {\n x_min: 20,\n x_max: 314,\n y_min: -250,\n y_max: 251,\n ha: 501,\n o: 'm 35 19 b 29 0 35 19 29 10 b 45 -20 29 -7 33 -16 b 58 -23 50 -22 56 -23 b 78 -10 72 -23 78 -10 b 156 117 78 -10 140 89 b 170 131 161 127 167 131 b 179 111 176 131 179 120 l 179 -261 b 115 -315 179 -294 145 -315 b 91 -337 105 -315 91 -320 b 122 -360 91 -353 104 -360 l 429 -360 b 452 -337 452 -360 452 -337 b 431 -315 452 -337 452 -315 b 384 -265 410 -315 384 -289 l 384 328 b 356 361 384 351 376 360 b 281 356 336 361 300 356 b 206 360 253 356 228 357 b 199 361 203 360 200 361 b 173 334 184 361 179 347 z',\n },\n timeSig2: {\n x_min: 20,\n x_max: 426,\n y_min: -257,\n y_max: 254,\n ha: 511,\n o: 'm 606 -131 b 589 -111 606 -114 599 -111 b 570 -127 577 -111 573 -117 l 569 -128 b 513 -192 554 -164 543 -192 b 488 -187 505 -192 498 -190 b 445 -171 469 -180 459 -179 b 289 -137 416 -160 348 -137 b 236 -145 271 -137 252 -140 b 422 -42 268 -94 390 -50 b 613 147 523 -14 613 27 b 330 366 613 300 464 366 b 69 275 229 366 140 357 b 29 170 45 245 29 209 b 42 108 29 150 33 130 b 160 29 63 63 108 29 b 261 156 248 29 261 120 b 161 275 261 242 161 246 b 275 330 164 295 190 330 b 405 192 403 330 405 233 b 193 -102 405 60 297 -39 b 33 -317 114 -153 58 -223 l 32 -321 b 69 -370 32 -340 48 -370 b 203 -282 101 -370 118 -282 b 410 -360 261 -282 282 -360 b 606 -131 472 -360 583 -354 z',\n },\n timeSig3: {\n x_min: 20,\n x_max: 401,\n y_min: -251,\n y_max: 249,\n ha: 500,\n o: 'm 307 357 b 301 357 305 357 304 357 l 291 359 b 285 359 289 359 287 359 b 37 200 161 359 37 276 b 154 84 37 153 65 89 l 161 84 b 256 177 225 84 256 130 l 256 189 b 209 248 252 242 216 245 b 180 268 202 251 180 248 l 180 274 b 240 310 183 298 228 310 b 374 199 363 310 374 233 l 374 189 b 199 36 374 82 289 40 b 164 12 184 35 164 27 b 200 -6 164 -6 189 -6 b 379 -137 366 -6 379 -118 b 269 -307 379 -289 301 -307 b 256 -305 264 -307 258 -305 b 216 -282 245 -304 217 -304 l 216 -275 b 249 -180 216 -243 248 -222 b 145 -76 249 -120 207 -76 b 130 -78 140 -76 135 -76 b 60 -115 105 -82 78 -96 b 29 -203 36 -137 29 -171 b 275 -361 32 -315 134 -359 l 288 -361 b 577 -161 431 -361 577 -288 l 577 -151 b 537 -50 575 -109 564 -82 b 503 -20 528 -39 517 -29 l 472 -3 l 425 10 b 410 17 418 12 413 12 b 409 24 409 20 409 22 b 415 37 409 30 410 36 b 459 50 431 42 446 43 b 547 181 517 78 547 115 b 307 357 547 314 367 353 z',\n },\n timeSig4: {\n x_min: 20,\n x_max: 450,\n y_min: -250,\n y_max: 251,\n ha: 501,\n o: 'm 521 -107 l 521 202 b 504 226 521 213 520 226 b 475 213 491 226 484 223 l 338 48 b 325 14 333 40 325 32 l 325 -107 l 131 -107 b 481 336 246 -9 477 318 l 482 340 b 461 361 482 353 472 361 b 363 359 448 361 389 359 b 261 361 337 359 272 361 b 228 334 248 361 228 357 b 43 -105 228 156 86 -45 l 35 -117 b 35 -118 35 -117 35 -118 l 33 -120 b 29 -137 30 -127 29 -132 b 58 -161 29 -151 40 -161 l 325 -161 l 325 -252 b 268 -302 325 -291 294 -302 b 235 -330 245 -302 235 -315 b 262 -360 235 -344 240 -360 l 569 -360 b 598 -330 583 -360 598 -350 b 566 -301 598 -310 580 -301 b 521 -246 552 -301 521 -292 l 521 -161 l 626 -161 b 648 -134 641 -161 648 -151 b 626 -107 648 -117 642 -107 z',\n },\n timeSig5: {\n x_min: 20,\n x_max: 383,\n y_min: -251,\n y_max: 246,\n ha: 497,\n o: 'm 109 85 b 117 179 109 85 115 166 b 138 197 118 190 125 197 l 144 197 b 285 184 158 194 226 184 b 492 323 485 184 492 300 b 472 353 492 341 488 353 b 295 340 454 353 341 340 b 101 354 249 340 125 351 b 66 330 75 354 68 341 l 50 10 l 50 7 b 79 -14 50 -12 65 -14 b 111 14 94 -14 95 -1 b 209 62 125 29 160 62 b 357 -125 258 62 357 35 b 235 -304 357 -284 272 -304 b 202 -300 223 -304 212 -304 b 184 -279 194 -295 186 -289 b 202 -259 184 -269 194 -264 b 256 -163 235 -239 256 -203 b 144 -50 256 -99 206 -50 b 30 -157 66 -50 35 -107 b 29 -183 29 -166 29 -174 b 284 -361 29 -302 107 -361 b 552 -125 456 -361 552 -255 b 314 112 552 6 445 112 b 122 71 230 112 168 98 b 115 69 120 69 117 69 b 109 79 109 69 109 75 z',\n },\n timeSig6: {\n x_min: 20,\n x_max: 414,\n y_min: -249,\n y_max: 251,\n ha: 500,\n o: 'm 439 120 b 554 229 500 120 554 167 b 553 245 554 235 554 239 b 348 361 539 337 426 361 b 85 209 239 360 137 307 b 29 4 53 148 29 72 l 29 -1 b 73 -200 30 -68 42 -143 b 324 -359 132 -307 203 -359 b 513 -307 389 -359 461 -348 b 596 -137 563 -266 596 -202 b 379 72 596 -24 490 72 b 248 22 333 72 285 55 b 239 19 245 19 242 19 b 226 53 230 19 226 30 b 346 327 230 320 315 327 b 393 305 374 327 393 320 b 357 251 393 285 366 268 b 347 209 350 238 347 223 b 369 150 347 187 354 166 b 439 120 379 131 420 120 z m 320 3 b 405 -158 366 3 405 -69 b 320 -320 405 -248 366 -320 b 236 -158 274 -320 236 -248 b 320 3 236 -69 274 3 z',\n },\n timeSig7: {\n x_min: 20,\n x_max: 421,\n y_min: -250,\n y_max: 249,\n ha: 499,\n o: 'm 606 294 b 582 351 606 333 606 351 b 552 336 580 351 557 346 b 485 236 541 318 521 236 b 262 359 449 236 382 359 b 137 307 179 359 157 325 b 98 281 117 288 108 282 b 60 315 86 281 68 301 b 43 325 58 321 50 325 b 29 308 36 325 29 321 l 29 71 b 45 48 29 71 30 48 b 66 76 56 48 60 60 b 164 196 81 112 99 196 b 374 88 222 196 291 88 b 446 118 415 88 435 109 b 459 124 451 121 456 124 b 469 111 465 124 468 120 b 272 -112 469 71 359 -10 b 173 -315 217 -176 173 -259 b 200 -360 173 -346 173 -360 b 294 -347 226 -360 258 -347 b 412 -360 330 -347 397 -360 b 435 -307 426 -360 435 -348 b 606 288 435 -66 606 140 z',\n },\n timeSig8: {\n x_min: 20,\n x_max: 416,\n y_min: -259,\n y_max: 259,\n ha: 518,\n o: 'm 481 52 b 567 204 533 85 567 132 b 317 373 567 351 356 373 b 36 176 150 373 36 297 b 161 -16 36 76 92 23 b 29 -190 86 -52 29 -99 b 301 -373 29 -315 158 -373 b 599 -117 445 -373 599 -311 b 481 52 599 -30 549 17 z m 406 85 b 168 240 291 125 168 150 b 314 331 168 301 251 331 b 482 207 360 331 482 308 b 406 85 482 150 454 112 z m 295 -325 b 111 -183 199 -325 111 -276 b 225 -48 111 -125 161 -72 b 436 -219 330 -94 436 -124 b 295 -325 436 -276 392 -325 z',\n },\n timeSig9: {\n x_min: 20,\n x_max: 414,\n y_min: -249,\n y_max: 251,\n ha: 500,\n o: 'm 186 -117 b 71 -226 125 -117 71 -164 b 72 -242 71 -232 71 -236 b 276 -359 86 -334 199 -359 b 540 -206 386 -357 488 -304 b 596 -1 572 -145 596 -69 l 596 4 b 552 203 595 71 583 145 b 301 361 492 310 422 361 b 112 310 236 361 164 351 b 29 140 62 269 29 204 b 246 -69 29 27 135 -69 b 377 -19 292 -69 340 -52 b 386 -16 380 -16 383 -16 b 399 -50 395 -16 399 -27 b 279 -324 395 -317 310 -324 b 232 -302 251 -324 232 -317 b 268 -248 232 -282 259 -265 b 278 -206 275 -235 278 -220 b 256 -147 278 -184 271 -163 b 186 -117 246 -128 204 -117 z m 305 0 b 220 161 259 0 220 72 b 305 323 220 251 259 323 b 389 161 351 323 389 251 b 305 0 389 72 351 0 z',\n },\n timeSigCommon: {\n x_min: 5,\n x_max: 424,\n y_min: -249,\n y_max: 251,\n ha: 500,\n o: 'm 336 361 b 7 -14 131 361 7 180 b 101 -262 7 -108 42 -190 b 321 -359 156 -328 235 -359 b 611 -88 573 -359 611 -130 b 589 -56 611 -56 595 -56 b 567 -82 577 -56 567 -58 b 363 -311 567 -268 409 -311 b 184 40 246 -311 184 -197 b 372 327 184 278 294 327 b 477 278 446 327 477 292 b 451 246 477 265 472 246 b 360 140 393 246 360 184 b 471 32 360 58 431 32 b 580 156 471 32 580 36 b 336 361 580 344 363 361 z',\n },\n timeSigCutCommon: {\n x_min: 0,\n x_max: 418,\n y_min: -359,\n y_max: 361,\n ha: 720,\n o: 'm 573 -58 b 559 -82 567 -58 559 -60 b 354 -310 559 -266 400 -310 b 317 -305 340 -310 328 -308 b 302 -284 311 -304 302 -295 l 302 287 b 338 323 302 297 328 321 b 363 324 347 324 356 324 b 468 275 436 324 468 289 b 442 243 468 264 464 243 b 351 137 384 243 351 181 b 462 30 351 56 422 30 b 572 154 462 30 572 35 b 318 357 572 295 441 357 b 302 390 310 359 302 383 l 302 495 b 276 520 302 507 292 520 b 252 495 265 520 252 507 l 252 369 b 235 346 252 359 238 346 l 196 331 b 0 -14 66 275 0 122 b 225 -346 0 -150 86 -310 b 252 -382 235 -350 252 -369 l 252 -492 b 276 -517 252 -505 265 -517 b 302 -492 292 -517 302 -505 l 302 -379 b 318 -359 302 -370 308 -363 b 602 -85 563 -354 602 -130 b 579 -58 600 -58 586 -58 z m 252 -235 b 243 -252 252 -248 248 -252 b 236 -248 240 -252 238 -251 b 177 37 197 -193 177 -96 b 232 259 177 147 200 215 b 236 262 233 262 235 262 b 252 239 243 262 252 251 z',\n },\n timeSigPlus: {\n x_min: -1,\n x_max: 499,\n y_min: -250,\n y_max: 250,\n ha: 500,\n o: 'm 432 53 b 413 79 420 53 413 65 l 413 340 b 392 360 413 350 405 360 l 325 360 b 305 340 312 360 305 350 l 305 79 b 284 53 305 66 292 53 l 19 53 b -1 33 9 53 -1 46 l -1 -33 b 19 -55 -1 -46 9 -55 l 284 -55 b 305 -75 298 -55 305 -68 l 305 -340 b 325 -360 305 -350 312 -360 l 392 -360 b 413 -340 405 -360 413 -350 l 413 -78 b 433 -55 413 -63 423 -55 l 698 -55 b 719 -33 708 -55 719 -46 l 719 33 b 698 53 719 46 708 53 z',\n },\n timeSigPlusSmall: {\n x_min: -1,\n x_max: 255,\n y_min: -133,\n y_max: 123,\n ha: 256,\n o: 'm 220 20 b 210 33 215 20 210 26 l 210 166 b 200 177 210 171 206 177 l 166 177 b 156 166 160 177 156 171 l 156 33 b 145 20 156 27 150 20 l 10 20 b -1 10 4 20 -1 16 l -1 -24 b 10 -35 -1 -30 4 -35 l 145 -35 b 156 -46 153 -35 156 -42 l 156 -180 b 166 -192 156 -186 160 -192 l 200 -192 b 210 -180 206 -192 210 -186 l 210 -48 b 222 -35 210 -39 216 -35 l 356 -35 b 367 -24 361 -35 367 -30 l 367 10 b 356 20 367 16 361 20 z',\n },\n timeSigMinus: {\n x_min: 0,\n x_max: 448,\n y_min: -35,\n y_max: 40,\n ha: 75,\n o: 'm 645 39 b 619 58 645 49 634 58 l 27 58 b 0 39 12 58 0 49 l 0 -32 b 27 -50 0 -42 12 -50 l 619 -50 b 645 -32 634 -50 645 -42 z',\n },\n timeSigParensRight: {\n x_min: 0,\n x_max: 184,\n y_min: -489,\n y_max: 491,\n ha: 980,\n o: 'm 0 -696 b 3 -704 0 -698 1 -704 b 7 -703 4 -704 6 -704 b 265 1 187 -530 265 -282 b 12 701 265 289 187 531 b 4 707 12 701 6 707 b 0 696 1 707 0 703 l 0 665 b 4 644 0 665 0 651 b 167 1 112 503 167 315 b 6 -641 167 -311 109 -497 b 0 -658 3 -644 0 -651 z',\n },\n timeSigParensRightSmall: {\n x_min: 0,\n x_max: 110,\n y_min: -251,\n y_max: 249,\n ha: 500,\n o: 'm 0 -356 b 3 -361 0 -357 1 -361 b 158 0 112 -272 158 -145 b 4 359 158 147 109 272 b 0 353 3 359 0 357 l 0 338 b 3 327 0 338 0 330 b 91 0 60 246 91 160 b 4 -328 91 -160 62 -249 b 0 -337 3 -330 0 -333 z',\n },\n timeSigParensLeft: {\n x_min: 0,\n x_max: 184,\n y_min: -489,\n y_max: 491,\n ha: 980,\n o: 'm 265 -658 b 259 -641 265 -651 262 -644 b 98 1 156 -497 98 -311 b 261 644 98 315 153 503 b 265 665 265 651 265 665 l 265 696 b 261 707 265 703 264 707 b 253 701 259 707 253 701 b 0 1 78 531 0 289 b 258 -703 0 -282 78 -530 b 262 -704 259 -704 261 -704 b 265 -696 264 -704 265 -698 z',\n },\n timeSigParensLeftSmall: {\n x_min: 0,\n x_max: 110,\n y_min: -251,\n y_max: 249,\n ha: 500,\n o: 'm 158 -337 b 154 -328 158 -333 156 -330 b 68 0 96 -249 68 -160 b 156 327 68 160 98 246 b 158 338 158 330 158 338 l 158 353 b 154 359 158 357 156 359 b 0 0 49 272 0 147 b 156 -361 0 -145 46 -272 b 158 -356 157 -361 158 -357 z',\n },\n noteheadDoubleWhole: {\n x_min: 0,\n x_max: 599,\n y_min: -155,\n y_max: 155,\n ha: 310,\n o: 'm 13 223 b 0 212 4 223 0 217 l 0 -213 b 13 -223 0 -219 4 -223 l 32 -223 b 45 -213 39 -223 45 -219 l 45 212 b 32 223 45 217 39 223 z m 96 223 b 82 212 88 223 82 217 l 82 -213 b 96 -223 82 -219 88 -223 l 114 -223 b 128 -213 121 -223 128 -219 l 128 212 b 114 223 128 217 121 223 z m 747 223 b 733 212 740 223 733 217 l 733 -213 b 747 -223 733 -219 740 -223 l 766 -223 b 780 -213 773 -223 780 -219 l 780 212 b 766 223 780 217 773 223 z m 829 223 b 815 212 824 223 815 217 l 815 -213 b 829 -223 815 -219 824 -223 l 848 -223 b 863 -213 857 -223 863 -219 l 863 212 b 848 223 863 217 857 223 z m 438 180 b 130 1 248 180 130 101 b 423 -180 130 -92 210 -180 b 733 1 657 -180 733 -98 b 438 180 733 104 572 180 z m 469 -145 b 331 -71 409 -145 369 -112 b 284 58 305 -37 284 12 b 400 147 284 131 333 147 b 577 -45 498 147 577 42 b 469 -145 577 -115 533 -145 z',\n },\n noteheadWhole: {\n x_min: 0,\n x_max: 422,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 311 180 b 0 3 120 180 0 101 b 297 -180 0 -94 82 -180 b 608 3 533 -180 608 -98 b 311 180 608 105 445 180 z m 160 91 b 274 148 176 141 229 148 b 452 -45 373 148 452 42 b 386 -141 452 -89 433 -130 b 341 -147 372 -145 356 -147 b 206 -72 289 -147 236 -112 b 156 56 177 -39 156 10 b 160 91 156 68 157 79 z',\n },\n noteheadHalf: {\n x_min: 0,\n x_max: 295,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 140 -180 b 425 60 377 -180 425 13 b 282 180 425 134 366 180 b 0 -60 68 180 0 14 b 140 -180 0 -137 60 -180 z m 108 -125 b 50 -92 78 -125 60 -109 b 42 -63 46 -84 42 -73 b 318 121 42 7 251 121 b 372 91 346 121 361 108 b 380 63 376 82 380 73 b 108 -125 380 1 177 -125 z',\n },\n noteheadBlack: {\n x_min: 0,\n x_max: 295,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 140 -180 b 425 60 268 -180 425 -62 b 285 180 425 134 367 180 b 0 -60 127 180 0 63 b 140 -180 0 -135 62 -180 z',\n },\n noteheadXWhole: {\n x_min: 0,\n x_max: 377,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 272 -95 l 364 -171 b 384 -180 370 -177 377 -180 l 511 -180 b 543 -148 528 -180 543 -164 b 531 -124 543 -140 539 -131 l 412 0 l 531 124 b 541 148 539 131 541 140 b 513 180 541 164 528 180 l 384 180 b 364 171 377 180 370 177 l 272 94 l 179 171 b 158 180 173 177 166 180 l 30 180 b 0 148 16 180 0 164 b 12 124 0 140 4 131 l 132 0 l 12 -124 b 1 -148 4 -131 1 -140 b 32 -180 1 -164 14 -180 l 158 -180 b 179 -171 166 -180 173 -177 z m 386 -141 l 272 -45 l 157 -141 l 88 -141 l 245 0 l 88 141 l 157 141 l 272 45 l 386 141 l 456 141 l 300 0 l 456 -141 z',\n },\n noteheadXHalf: {\n x_min: 0,\n x_max: 334,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 295 180 b 271 170 287 180 278 177 l 209 98 l 115 171 b 95 180 109 177 104 180 l 36 180 b 4 148 19 180 4 164 b 14 124 4 140 7 132 l 140 22 l 7 -127 b 0 -148 3 -131 0 -138 b 32 -180 0 -166 14 -180 l 184 -180 b 209 -170 193 -180 203 -177 l 271 -99 l 363 -171 b 384 -180 370 -176 377 -180 l 445 -180 b 478 -147 461 -180 478 -163 b 465 -125 478 -138 474 -131 l 341 -22 l 474 127 b 481 148 480 131 481 138 b 448 180 481 166 468 180 z m 36 148 l 95 148 l 233 33 l 334 148 l 410 148 l 274 -6 l 445 -148 l 384 -148 l 248 -35 l 147 -148 l 71 -148 l 206 4 z',\n },\n noteheadXBlack: {\n x_min: 0,\n x_max: 290,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 410 -143 l 239 0 l 410 144 b 418 160 415 147 418 154 b 399 180 418 171 408 180 b 389 177 396 180 392 179 l 207 26 l 29 177 b 17 180 26 179 22 180 b 0 161 7 180 0 170 b 7 144 0 156 3 148 l 179 0 l 7 -143 b 0 -158 1 -147 0 -153 b 19 -180 0 -170 7 -180 b 29 -176 23 -180 26 -179 l 207 -24 l 389 -176 b 399 -180 392 -179 396 -180 b 418 -160 410 -180 418 -168 b 410 -143 418 -153 415 -147 z',\n },\n noteheadCircleX: {\n x_min: 0,\n x_max: 249,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 179 180 b 0 0 81 180 0 99 b 179 -180 0 -99 81 -180 b 359 0 278 -180 359 -99 b 179 180 359 99 278 180 z m 261 112 l 180 30 l 98 112 b 179 138 121 128 148 138 b 261 112 210 138 238 128 z m 317 0 b 292 -82 317 -30 308 -59 l 209 1 l 291 84 b 317 0 307 60 317 30 z m 40 0 b 69 84 40 32 50 60 l 151 1 l 68 -84 b 40 0 49 -60 40 -30 z m 95 -111 l 180 -27 l 262 -111 b 179 -138 239 -128 210 -138 b 95 -111 148 -138 120 -128 z',\n },\n noteheadTriangleUpWhole: {\n x_min: 0,\n x_max: 319,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 445 -180 b 459 -166 454 -180 459 -173 b 458 -158 459 -163 458 -160 l 239 173 b 228 180 238 177 233 180 b 216 173 225 180 219 177 l 1 -158 b 0 -166 1 -160 0 -163 b 14 -180 0 -173 6 -180 z m 170 -137 b 145 -96 157 -137 145 -109 b 228 108 145 -17 197 56 b 310 -98 259 55 310 -17 b 288 -137 310 -111 301 -137 z',\n },\n noteheadTriangleUpHalf: {\n x_min: 0,\n x_max: 285,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 215 180 b 202 173 210 180 204 177 l 3 -157 b 0 -166 1 -160 0 -163 b 14 -180 0 -173 7 -180 l 396 -180 b 410 -166 406 -180 410 -173 b 409 -158 410 -163 410 -161 l 228 173 b 215 180 226 174 220 180 z m 246 -138 l 115 -138 l 232 76 l 297 -37 z',\n },\n noteheadTriangleUpBlack: {\n x_min: 0,\n x_max: 293,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 422 -180 l 207 180 l 0 -180 z',\n },\n noteheadDiamondWhole: {\n x_min: 0,\n x_max: 270,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 386 -23 b 389 -16 387 -20 389 -19 b 383 -7 389 -13 386 -9 l 130 179 b 122 180 128 180 125 180 b 115 177 120 180 117 180 l 3 23 b 0 17 1 20 0 19 b 4 7 0 16 3 10 l 258 -179 b 264 -180 261 -179 262 -180 b 272 -176 268 -180 271 -179 z m 66 40 b 62 48 65 42 62 45 l 109 111 b 112 112 109 112 111 112 b 118 111 115 112 117 111 l 320 -37 b 324 -46 323 -39 324 -42 b 275 -111 278 -111 276 -111 b 268 -108 272 -111 271 -109 z',\n },\n noteheadDiamondHalf: {\n x_min: 0,\n x_max: 251,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 359 -7 b 361 0 360 -6 361 -3 b 359 7 361 3 360 4 l 189 177 b 180 180 186 179 183 180 b 174 177 179 180 176 179 l 4 7 b 0 0 1 4 0 3 b 4 -7 0 -3 1 -6 l 174 -177 b 180 -180 176 -180 179 -180 b 189 -177 183 -180 186 -180 z m 266 26 b 138 -71 266 -12 176 -71 b 96 -50 121 -71 108 -63 b 88 -24 89 -43 88 -32 b 215 73 88 13 177 73 b 266 26 238 73 266 50 z',\n },\n noteheadDiamondBlack: {\n x_min: 0,\n x_max: 250,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 357 -6 b 360 1 359 -4 360 -1 b 357 9 360 4 359 7 l 189 177 b 180 180 187 179 184 180 b 171 177 177 180 173 179 l 3 9 b 0 1 0 6 0 4 b 4 -7 0 -1 1 -4 l 173 -177 b 180 -180 176 -180 177 -180 b 187 -177 181 -180 184 -180 z',\n },\n noteheadSquareWhite: {\n x_min: 0,\n x_max: 313,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 451 -180 l 451 180 l 0 180 l 0 -180 z m 40 -138 l 40 140 l 410 140 l 410 -138 z',\n },\n noteheadSquareBlack: {\n x_min: 0,\n x_max: 313,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 451 -180 l 451 180 l 0 180 l 0 -180 z',\n },\n noteheadParenthesis: {\n x_min: -73,\n x_max: 368,\n y_min: -180,\n y_max: 182,\n ha: 362,\n o: 'm 52 -249 b -30 -144 3 -212 -14 -190 b -52 4 -45 -102 -52 -56 b 52 252 -52 118 -36 179 l 46 262 b -105 3 -49 197 -105 124 b 45 -259 -105 -109 -48 -200 z m 382 -259 b 530 3 474 -202 530 -108 b 379 262 530 122 474 200 l 373 252 b 478 4 462 180 478 118 b 456 -144 478 -56 471 -102 b 373 -249 439 -190 422 -212 z',\n },\n noteheadParenthesisRight: {\n x_min: -36,\n x_max: 73,\n y_min: -181,\n y_max: 181,\n ha: 362,\n o: 'm -43 -261 b 105 1 49 -203 105 -109 b -46 261 105 121 49 199 l -52 251 b 53 3 37 179 53 117 b 32 -145 53 -58 46 -104 b -52 -251 14 -192 -3 -213 z',\n },\n noteheadParenthesisLeft: {\n x_min: 0,\n x_max: 109,\n y_min: -181,\n y_max: 181,\n ha: 362,\n o: 'm 157 -251 b 75 -145 108 -213 91 -192 b 53 3 60 -104 53 -58 b 157 251 53 117 69 177 l 151 261 b 0 1 56 196 0 122 b 150 -261 0 -111 58 -202 z',\n },\n augmentationDot: {\n x_min: 0,\n x_max: 100,\n y_min: -50,\n y_max: 50,\n ha: 100,\n o: 'm 144 0 b 72 72 144 40 112 72 b 0 0 32 72 0 40 b 72 -72 0 -40 32 -72 b 144 0 112 -72 144 -40 z',\n },\n tremolo1: {\n x_min: -150,\n x_max: 150,\n y_min: -93,\n y_max: 94,\n ha: 187,\n o: 'm 216 -45 l 216 135 l -216 46 l -216 -134 z',\n },\n flag8thUp: {\n x_min: 0,\n x_max: 264,\n y_min: -810.1921176545985,\n y_max: 9,\n ha: 819.1921176545985,\n o: 'm 343 -1138 b 380 -888 343 -1138 380 -1001 b 215 -395 380 -708 305 -539 b 58 -19 141 -281 81 -157 b 27 13 53 4 42 13 b 0 -9 12 13 0 9 l 0 -353 b 284 -688 95 -370 232 -566 b 318 -904 305 -737 318 -819 b 284 -1102 318 -969 308 -1037 b 279 -1123 281 -1110 279 -1117 b 302 -1165 279 -1146 294 -1159 b 343 -1138 311 -1171 336 -1162 z',\n },\n flag8thDown: {\n x_min: 0,\n x_max: 306,\n y_min: -14,\n y_max: 808,\n ha: 822,\n o: 'm 346 1094 b 376 897 366 1034 376 962 b 318 642 376 812 340 691 b 0 340 265 521 193 405 l 0 1 b 23 -20 0 -13 12 -20 b 58 12 36 -20 55 -12 b 262 387 82 148 189 274 b 441 881 353 530 441 701 b 400 1142 441 994 412 1096 b 377 1164 396 1158 387 1164 b 346 1094 356 1164 331 1136 z',\n },\n flag16thUp: {\n x_min: 0,\n x_max: 279,\n y_min: -813,\n y_max: 2,\n ha: 815,\n o: 'm 392 -1146 b 402 -988 397 -1139 402 -1057 l 402 -956 b 360 -783 402 -896 386 -837 b 359 -770 360 -779 359 -776 b 360 -760 359 -768 359 -765 b 396 -577 364 -752 396 -665 b 392 -526 396 -559 395 -543 b 236 -275 377 -428 340 -387 b 53 -16 158 -192 78 -168 b 24 3 50 0 33 3 b 0 -12 16 3 0 -1 l 0 -570 l 7 -570 b 298 -778 96 -573 199 -576 b 344 -992 331 -847 344 -917 b 333 -1120 344 -1034 340 -1077 b 331 -1133 331 -1126 331 -1129 b 363 -1171 331 -1152 343 -1171 b 392 -1146 373 -1171 383 -1165 z m 301 -661 b 223 -562 278 -625 253 -596 b 59 -331 156 -484 89 -449 b 58 -327 58 -330 58 -328 b 78 -312 58 -321 66 -312 l 89 -312 b 302 -464 177 -312 255 -393 b 341 -592 328 -501 341 -546 b 340 -621 341 -602 341 -611 b 330 -658 337 -632 337 -647 b 311 -667 328 -662 318 -667 b 301 -661 307 -667 304 -665 z',\n },\n flag16thDown: {\n x_min: 0,\n x_max: 290.8951581511223,\n y_min: -9,\n y_max: 812.0064,\n ha: 821.0064,\n o: 'm 346 1132 b 312 768 367 1011 367 880 b 7 559 213 566 96 562 l 0 559 l 0 1 b 24 -13 0 -6 10 -13 b 53 6 35 -13 50 -10 b 406 516 88 228 372 289 b 410 567 409 531 410 549 b 374 750 410 655 379 742 b 373 760 373 753 373 756 b 374 773 373 766 374 769 b 405 1138 426 881 428 1022 b 370 1169 397 1171 387 1169 b 346 1132 353 1168 341 1156 z m 325 657 b 344 647 333 657 343 652 b 354 611 351 636 351 622 b 356 582 356 600 356 590 b 317 454 356 534 343 491 b 89 302 269 383 177 302 l 78 302 b 58 317 66 302 58 310 b 59 321 58 318 58 320 b 238 552 89 439 170 472 b 315 651 268 585 292 613 b 325 657 318 655 321 657 z',\n },\n flag32ndUp: {\n x_min: 0,\n x_max: 261,\n y_min: -812,\n y_max: 149,\n ha: 961,\n o: 'm 374 -969 b 337 -806 372 -913 359 -858 b 336 -796 336 -804 336 -801 b 337 -788 336 -793 336 -791 b 370 -616 340 -778 370 -698 b 340 -482 370 -570 360 -524 b 369 -330 353 -445 369 -386 b 366 -289 369 -315 369 -302 b 220 -58 350 -202 317 -163 b 46 187 148 20 71 43 b 20 215 45 200 35 215 b 0 197 12 215 0 207 l 0 -609 l 7 -609 b 278 -802 91 -612 186 -615 b 323 -999 310 -865 323 -930 b 311 -1122 323 -1040 318 -1080 b 310 -1132 311 -1126 310 -1129 b 328 -1166 310 -1149 318 -1162 b 337 -1169 331 -1168 334 -1169 b 366 -1146 346 -1169 356 -1162 b 376 -1009 370 -1138 376 -1071 b 374 -969 376 -995 374 -982 z m 300 -261 b 321 -330 315 -289 321 -311 b 317 -360 321 -341 318 -350 b 300 -423 314 -374 307 -399 b 220 -334 279 -397 253 -370 b 56 -92 150 -256 79 -232 b 300 -261 135 -92 220 -127 z m 315 -657 b 308 -690 312 -668 312 -680 b 292 -698 307 -694 300 -698 b 282 -693 288 -698 284 -697 b 216 -608 261 -661 240 -636 l 209 -600 b 56 -390 147 -527 88 -495 b 73 -367 53 -380 60 -367 b 318 -622 189 -367 318 -505 b 315 -657 318 -634 317 -645 z',\n },\n flag32ndDown: {\n x_min: 0,\n x_max: 273,\n y_min: -172,\n y_max: 812,\n ha: 984,\n o: 'm 393 973 b 333 1169 393 1002 383 1169 b 324 1168 330 1169 327 1169 b 304 1130 314 1164 304 1149 b 305 1120 304 1128 305 1125 b 334 962 317 1056 334 1011 b 289 821 334 922 323 880 b 0 619 180 625 88 622 l 0 -229 b 20 -248 0 -242 9 -248 b 48 -219 35 -248 46 -232 b 229 36 72 -69 154 -46 b 380 278 330 145 364 186 b 383 320 383 291 383 305 b 351 484 383 382 364 445 b 384 629 374 526 384 580 b 356 780 384 704 361 766 b 356 783 356 782 356 783 l 351 791 b 356 804 351 796 353 799 l 361 814 b 393 958 380 850 387 865 z m 56 386 b 217 609 86 501 153 533 b 292 706 246 642 269 670 b 304 711 295 710 300 711 b 321 703 311 711 320 707 b 328 670 325 693 325 681 b 331 634 330 658 331 645 b 82 367 331 516 199 367 l 75 367 b 56 386 62 367 56 379 z m 330 350 b 334 320 331 340 334 331 b 311 248 334 301 328 278 b 59 72 229 109 141 72 b 56 76 56 73 56 75 b 229 331 81 226 154 249 b 310 423 264 369 289 397 b 330 350 318 396 325 366 z',\n },\n flag64thUp: {\n x_min: 0,\n x_max: 261,\n y_min: -812,\n y_max: 347,\n ha: 1159,\n o: 'm 374 -969 b 337 -806 372 -913 359 -858 b 336 -796 336 -804 336 -801 b 337 -788 336 -793 336 -791 b 370 -616 340 -778 370 -698 b 340 -482 370 -570 360 -524 b 369 -330 353 -445 369 -386 b 337 -203 369 -287 359 -242 b 369 -43 350 -167 369 -104 b 366 -4 369 -30 367 -17 b 220 228 350 84 317 122 b 46 472 148 305 71 328 b 20 500 45 485 32 500 b 0 482 10 500 0 492 l 0 -609 l 7 -609 b 278 -802 91 -612 186 -615 b 323 -999 310 -865 323 -930 b 311 -1122 323 -1040 318 -1080 b 310 -1132 311 -1126 310 -1129 b 328 -1166 310 -1149 318 -1162 b 337 -1169 331 -1168 334 -1169 b 366 -1146 346 -1169 356 -1162 b 376 -1009 370 -1138 376 -1071 b 374 -969 376 -995 374 -982 z m 300 24 b 321 -45 315 -4 321 -26 b 317 -75 321 -56 318 -65 l 298 -145 b 220 -58 278 -121 253 -94 b 58 187 148 20 82 43 b 56 193 58 189 58 192 b 300 24 138 193 220 157 z m 300 -261 b 321 -330 315 -289 321 -311 b 317 -360 321 -341 318 -350 b 300 -423 314 -374 307 -399 b 220 -334 279 -397 253 -370 b 56 -92 150 -256 79 -232 b 300 -261 135 -92 220 -127 z m 315 -657 b 308 -690 312 -668 312 -680 b 292 -698 307 -694 300 -698 b 282 -693 288 -698 284 -697 b 216 -608 261 -661 240 -636 l 209 -600 b 55 -386 147 -527 84 -497 b 73 -367 52 -376 63 -367 b 318 -622 189 -367 318 -505 b 315 -657 318 -634 317 -645 z',\n },\n flag64thDown: {\n x_min: 0,\n x_max: 273,\n y_min: -376,\n y_max: 812,\n ha: 1188,\n o: 'm 393 973 b 333 1169 393 1002 383 1169 b 324 1168 330 1169 327 1169 b 304 1130 314 1164 304 1149 b 305 1120 304 1128 305 1125 b 334 962 317 1056 334 1011 b 289 821 334 922 323 880 b 0 619 180 625 88 622 l 0 -523 b 20 -541 0 -534 9 -541 b 48 -513 35 -541 46 -526 b 229 -258 72 -363 154 -340 b 380 -16 330 -148 364 -108 b 384 27 383 -1 384 13 b 351 189 384 88 366 151 b 380 278 366 216 374 243 b 383 320 383 291 383 305 b 351 484 383 382 364 445 b 384 629 374 526 384 580 b 356 780 384 704 361 766 b 356 783 356 782 356 783 l 351 791 b 356 804 351 796 353 799 l 361 814 b 393 958 380 850 387 865 z m 56 386 b 217 609 86 501 153 533 b 292 706 246 642 269 670 b 304 711 295 710 300 711 b 321 703 311 711 320 707 b 328 670 325 693 325 681 b 331 634 330 658 331 645 b 82 367 331 516 199 367 l 75 367 b 56 386 62 367 56 379 z m 330 350 b 334 320 331 340 334 331 b 311 248 334 301 328 278 b 59 72 229 109 141 72 b 56 76 56 73 56 75 b 229 331 81 226 154 249 b 310 423 264 369 289 397 b 330 350 318 396 325 366 z m 330 56 b 334 26 331 46 334 37 b 311 -46 334 7 328 -16 b 56 -222 229 -184 137 -222 b 229 36 75 -86 145 -55 b 311 128 264 73 289 102 z',\n },\n flag128thUp: {\n x_min: 0,\n x_max: 261,\n y_min: -812,\n y_max: 533,\n ha: 1345,\n o: 'm 374 -969 b 337 -806 372 -913 359 -858 b 336 -796 336 -804 336 -801 b 337 -788 336 -793 336 -791 b 370 -616 340 -778 370 -698 b 340 -482 370 -570 360 -524 b 369 -330 353 -445 369 -386 b 337 -203 369 -287 359 -242 b 369 -43 350 -167 369 -104 b 366 -4 369 -30 367 -17 b 341 75 360 26 353 50 b 369 222 354 111 369 167 b 366 264 369 236 369 251 b 220 495 350 351 317 390 b 46 740 148 573 71 596 b 22 768 45 753 35 768 b 0 750 10 768 0 760 l 0 -609 l 7 -609 b 278 -802 91 -612 186 -615 b 323 -999 310 -865 323 -930 b 311 -1122 323 -1040 318 -1080 b 310 -1132 311 -1126 310 -1129 b 328 -1166 310 -1149 318 -1162 b 337 -1169 331 -1168 334 -1169 b 366 -1146 346 -1169 356 -1162 b 376 -1009 370 -1138 376 -1071 b 374 -969 376 -995 374 -982 z m 300 292 b 321 223 315 264 321 242 b 317 193 321 212 318 203 b 301 135 314 180 308 158 b 220 228 281 161 255 190 b 55 461 151 304 79 327 b 300 292 134 461 220 426 z m 300 24 b 321 -45 315 -4 321 -26 b 317 -75 321 -56 318 -65 l 298 -145 b 220 -58 278 -121 253 -94 b 56 187 148 20 81 43 b 55 193 56 189 56 192 b 300 24 137 193 220 157 z m 300 -261 b 321 -330 315 -289 321 -311 b 317 -360 321 -341 318 -350 b 300 -423 314 -374 307 -399 b 220 -334 279 -397 253 -370 b 56 -92 150 -256 79 -232 b 300 -261 135 -92 220 -127 z m 315 -657 b 308 -690 312 -668 312 -680 b 292 -698 307 -694 300 -698 b 282 -693 288 -698 284 -697 b 216 -608 261 -661 240 -636 l 209 -600 b 55 -386 147 -527 84 -497 b 73 -367 53 -376 62 -367 b 318 -622 189 -367 318 -505 b 315 -657 318 -634 317 -645 z',\n },\n flag128thDown: {\n x_min: 0,\n x_max: 273,\n y_min: -580,\n y_max: 812,\n ha: 1392,\n o: 'm 393 973 b 333 1169 393 1002 383 1169 b 324 1168 330 1169 327 1169 b 304 1130 314 1164 304 1149 b 305 1120 304 1128 305 1125 b 334 962 317 1056 334 1011 b 289 821 334 922 323 880 b 0 619 180 625 88 622 l 0 -816 b 20 -835 0 -828 7 -835 b 48 -806 33 -835 46 -819 b 229 -552 72 -657 154 -634 b 380 -310 330 -442 364 -402 b 384 -266 383 -295 384 -281 b 351 -105 384 -206 366 -143 b 384 27 372 -66 384 -16 b 351 189 384 88 366 151 b 380 278 366 216 374 243 b 383 320 383 291 383 305 b 351 484 383 382 364 445 b 384 629 374 526 384 580 b 356 780 384 704 361 766 b 356 783 356 782 356 783 l 351 791 b 356 804 351 796 353 799 l 361 814 b 393 958 380 850 387 865 z m 56 386 b 217 609 86 501 153 533 b 292 706 246 642 269 670 b 304 711 295 710 300 711 b 321 703 311 711 320 707 b 328 670 325 693 325 681 b 331 634 330 658 331 645 b 82 367 331 516 199 367 l 75 367 b 56 386 62 367 56 379 z m 330 350 b 334 320 331 340 334 331 b 311 248 334 301 328 278 b 59 72 229 109 141 72 b 56 76 56 73 56 75 b 229 331 81 226 154 249 b 310 423 264 369 289 397 b 330 350 318 396 325 366 z m 330 56 b 334 26 331 46 334 37 b 311 -46 334 7 328 -16 b 56 -222 229 -184 137 -222 b 229 36 75 -86 145 -55 b 311 128 264 73 289 102 z m 330 -238 b 334 -268 331 -248 334 -256 b 311 -340 334 -287 328 -310 b 56 -516 229 -478 137 -516 b 229 -258 75 -380 145 -348 b 311 -166 264 -220 289 -192 z',\n },\n accidentalFlat: {\n x_min: 0,\n x_max: 226,\n y_min: -175,\n y_max: 439,\n ha: 614,\n o: 'm 17 -245 b 30 -252 22 -251 26 -252 b 39 -249 35 -252 39 -249 b 153 -161 82 -225 117 -186 b 325 82 281 -72 325 16 b 196 220 325 164 262 216 b 117 196 171 220 137 209 b 85 176 108 189 92 176 b 78 177 82 176 81 176 b 62 202 68 181 62 192 b 72 608 63 233 72 579 b 45 632 72 624 59 632 b 0 592 24 632 1 618 b 17 -245 0 592 6 -230 z m 68 -117 b 63 27 68 -117 63 -30 b 66 73 63 50 65 68 b 167 144 76 102 134 144 b 226 60 209 144 226 96 b 98 -134 226 -17 160 -95 b 84 -138 92 -137 88 -138 b 68 -117 71 -138 68 -124 z',\n },\n accidentalNatural: {\n x_min: 0,\n x_max: 168,\n y_min: -335,\n y_max: 341,\n ha: 676,\n o: 'm 203 261 b 197 259 200 261 199 259 b 68 226 197 259 105 226 b 53 233 59 226 53 228 l 53 474 b 36 491 53 484 45 491 l 17 491 b 0 474 7 491 0 484 l 0 -268 b 13 -281 0 -276 4 -281 l 16 -279 b 22 -278 17 -279 20 -279 b 164 -235 42 -269 122 -235 b 189 -251 179 -235 189 -239 l 189 -465 b 206 -482 189 -475 196 -482 l 225 -482 b 242 -465 233 -482 242 -475 l 242 258 b 230 269 242 265 236 269 b 225 268 229 269 226 269 z m 53 56 b 176 114 53 76 141 114 b 189 107 184 114 189 112 l 189 -42 b 71 -101 189 -68 107 -101 b 53 -92 60 -101 53 -98 z',\n },\n accidentalSharp: {\n x_min: 0,\n x_max: 249,\n y_min: -348,\n y_max: 350,\n ha: 698,\n o: 'm 341 170 b 359 194 351 174 359 186 l 359 297 b 348 308 359 304 354 308 b 341 307 346 308 344 308 b 305 294 341 307 312 295 b 285 312 295 294 285 301 l 285 488 b 265 504 285 497 276 504 b 242 488 251 504 242 497 l 242 301 b 223 259 240 287 236 268 b 132 223 206 249 157 229 b 115 252 120 223 115 240 l 115 425 b 95 441 115 433 105 441 b 72 425 81 441 72 433 l 72 230 b 55 192 72 210 63 196 b 17 176 46 187 17 176 b 0 153 7 173 0 161 l 0 50 b 13 37 0 42 4 37 l 16 39 b 50 53 17 39 39 48 l 52 55 b 72 29 63 55 72 40 l 72 -114 b 56 -147 72 -130 65 -143 b 17 -163 48 -150 17 -163 b 0 -186 7 -166 0 -177 l 0 -288 b 13 -301 0 -297 4 -301 l 16 -300 b 50 -287 17 -300 37 -291 b 55 -285 52 -285 53 -285 b 72 -308 65 -285 72 -301 l 72 -485 b 91 -501 72 -494 81 -501 b 115 -485 105 -501 115 -494 l 115 -285 b 130 -253 115 -266 122 -256 l 217 -217 b 219 -217 217 -217 219 -217 l 222 -216 b 242 -242 235 -216 242 -233 l 242 -422 b 261 -438 242 -431 251 -438 b 285 -422 276 -438 285 -431 l 285 -217 b 301 -184 285 -206 291 -189 b 341 -168 311 -180 341 -168 b 359 -144 351 -164 359 -153 l 359 -42 b 348 -30 359 -35 354 -30 b 341 -32 346 -30 344 -30 l 304 -46 b 285 -20 295 -46 285 -37 l 285 114 b 304 156 285 124 292 151 z m 242 -65 b 132 -122 233 -94 166 -122 b 115 -115 124 -122 117 -120 b 111 -43 112 -109 111 -78 b 115 63 111 1 112 52 b 220 118 118 88 184 118 b 242 109 230 118 239 115 b 248 27 245 102 248 66 b 242 -65 248 -12 245 -52 z',\n },\n accidentalDoubleSharp: {\n x_min: 0,\n x_max: 247,\n y_min: -125,\n y_max: 127,\n ha: 252,\n o: 'm 274 -46 b 206 1 258 -37 206 -9 b 274 50 206 22 253 43 b 278 50 275 50 276 50 l 287 49 b 346 63 304 49 331 52 b 356 115 353 71 356 92 b 292 183 356 174 351 183 b 233 173 266 183 240 180 b 226 117 228 168 226 143 b 179 49 219 101 196 49 b 130 117 158 49 135 96 b 118 173 130 141 125 167 b 66 183 112 180 89 183 b 7 173 42 183 16 180 b 0 120 3 170 0 145 b 7 63 0 94 3 68 b 68 49 17 55 43 49 b 82 50 73 49 78 50 b 150 3 98 42 150 13 b 84 -46 150 -16 104 -39 l 69 -46 b 7 -56 43 -46 16 -49 b 0 -111 3 -60 0 -85 b 7 -166 0 -137 3 -163 b 65 -180 17 -174 40 -180 b 118 -166 86 -180 109 -176 b 130 -111 127 -158 130 -134 b 132 -105 130 -109 131 -107 b 177 -45 141 -85 158 -45 b 226 -111 196 -45 220 -91 b 233 -166 226 -137 228 -161 b 291 -180 243 -174 266 -180 b 356 -114 346 -180 356 -166 b 346 -56 356 -89 351 -63 b 288 -46 338 -49 312 -46 z',\n },\n accidentalDoubleFlat: {\n x_min: 0,\n x_max: 411,\n y_min: -175,\n y_max: 437,\n ha: 612,\n o: 'm 452 217 b 384 194 426 217 408 207 b 350 176 374 189 363 176 b 343 177 347 176 344 176 b 328 202 333 180 328 190 b 337 606 328 232 337 579 b 310 629 337 622 324 629 b 265 592 291 629 268 616 b 269 194 265 592 266 395 b 196 217 248 209 223 217 l 187 217 b 120 194 160 217 143 207 b 85 176 108 189 98 176 b 78 177 82 176 81 176 b 62 202 68 180 62 190 b 72 606 62 232 72 579 b 45 629 72 622 59 629 b 0 592 24 629 1 616 b 17 -245 0 592 7 -232 b 30 -252 22 -251 26 -252 b 39 -249 35 -252 39 -249 b 153 -161 84 -226 120 -186 b 274 -50 206 -124 246 -85 b 284 -245 276 -158 279 -240 b 295 -252 288 -251 292 -252 b 304 -249 300 -252 304 -249 b 416 -163 348 -226 383 -186 b 592 82 546 -72 592 16 b 461 217 592 163 528 216 z m 96 -134 b 84 -138 92 -137 86 -138 b 68 -115 72 -138 68 -124 b 63 26 68 -115 63 -30 b 66 72 63 49 65 66 b 168 144 75 101 134 144 b 226 59 212 144 226 95 b 96 -134 226 -22 161 -94 z m 361 -134 b 348 -138 356 -137 351 -138 b 333 -115 337 -138 333 -124 b 328 39 333 -115 328 -16 b 330 72 328 55 328 68 b 433 144 338 101 399 144 b 468 130 448 144 459 140 b 490 59 481 112 490 88 b 361 -134 490 -22 426 -94 z',\n },\n accidentalParensLeft: {\n x_min: 0,\n x_max: 141,\n y_min: -248,\n y_max: 247,\n ha: 495,\n o: 'm 203 331 l 203 351 b 202 356 203 354 203 356 b 0 0 60 281 0 140 b 199 -357 0 -144 60 -269 b 203 -354 200 -357 203 -356 l 203 -333 b 200 -327 203 -330 202 -328 b 86 0 118 -253 86 -160 b 200 324 86 158 120 251 b 203 331 202 325 203 327 z',\n },\n accidentalParensRight: {\n x_min: 0,\n x_max: 141,\n y_min: -248,\n y_max: 247,\n ha: 495,\n o: 'm 0 331 b 3 324 0 327 1 325 b 117 0 84 251 117 158 b 3 -327 117 -160 85 -253 b 0 -333 1 -328 0 -330 l 0 -354 b 4 -357 0 -356 3 -357 b 203 0 143 -269 203 -144 b 1 356 203 140 143 281 b 0 351 0 356 0 354 z',\n },\n accidentalQuarterToneFlatStein: {\n x_min: 1,\n x_max: 227,\n y_min: -175,\n y_max: 439,\n ha: 614,\n o: 'm 310 -245 b 327 592 321 -230 327 592 b 282 632 325 618 302 632 b 255 608 268 632 255 624 b 265 202 255 579 264 233 b 249 177 265 192 259 181 b 242 176 246 176 245 176 b 210 196 235 176 219 189 b 131 220 190 209 156 220 b 1 85 65 216 1 164 b 174 -161 1 16 46 -72 b 288 -249 210 -186 245 -225 b 297 -252 288 -249 292 -252 b 310 -245 301 -252 305 -251 z m 259 -117 b 243 -138 259 -124 256 -138 b 229 -134 239 -138 235 -137 b 101 60 167 -95 101 -17 b 160 144 101 96 118 144 b 261 73 193 144 251 102 b 264 27 262 68 264 50 b 259 -117 264 -30 259 -117 z',\n },\n accidentalThreeQuarterTonesFlatZimmermann: {\n x_min: 1,\n x_max: 466,\n y_min: -175,\n y_max: 439,\n ha: 614,\n o: 'm 363 -245 b 376 -252 367 -251 372 -252 b 384 -249 380 -252 384 -249 b 497 -161 428 -226 464 -186 b 671 84 625 -72 671 16 b 541 220 671 164 606 217 b 513 217 531 220 523 219 b 464 196 495 212 480 206 b 431 176 452 189 442 176 b 423 177 428 176 426 176 b 408 202 413 180 408 190 l 419 608 b 392 632 419 625 406 632 b 346 592 372 632 347 618 b 363 -245 346 592 351 -230 z m 289 -249 b 297 -252 289 -249 292 -252 b 310 -245 300 -252 305 -251 b 328 592 321 -230 328 592 b 282 631 327 618 302 631 b 255 608 268 631 255 624 l 266 202 b 251 177 266 190 261 180 b 243 176 248 176 246 176 b 210 196 232 176 222 189 b 164 216 196 204 180 210 l 163 217 b 132 220 151 219 143 220 b 1 84 65 217 1 163 b 177 -163 1 16 48 -72 b 289 -249 210 -186 245 -226 z m 262 72 b 265 26 264 66 265 49 b 261 -115 265 -30 261 -115 b 245 -138 261 -124 258 -138 b 230 -134 240 -138 236 -137 b 102 60 166 -92 102 -20 b 124 128 102 88 111 112 b 161 144 134 138 147 144 b 199 134 173 144 184 141 b 262 72 219 122 256 92 z m 413 -115 b 409 26 413 -115 409 -30 b 412 72 409 49 410 66 b 514 144 420 102 480 144 b 570 60 557 144 570 96 b 442 -134 570 -23 508 -91 b 429 -138 436 -137 433 -138 b 413 -115 418 -138 413 -124 z',\n },\n accidentalQuarterToneSharpStein: {\n x_min: 0,\n x_max: 179,\n y_min: -353,\n y_max: 307,\n ha: 660,\n o: 'm 258 240 b 246 252 258 248 252 252 b 240 251 245 252 242 252 b 168 225 240 251 171 225 b 150 253 156 225 150 240 l 150 426 b 130 442 150 435 141 442 b 105 418 108 442 105 429 l 105 230 b 91 193 105 219 101 202 b 17 161 65 183 42 171 b 0 138 9 158 0 147 l 0 36 b 13 23 0 27 4 23 l 16 24 b 86 53 17 24 73 49 l 88 55 b 107 30 98 55 107 42 l 107 -114 b 92 -145 107 -130 101 -143 l 17 -177 b 0 -200 9 -180 0 -192 l 0 -302 b 13 -315 0 -311 4 -315 l 16 -314 b 85 -285 17 -314 72 -291 b 105 -312 92 -282 105 -301 l 105 -492 b 125 -508 105 -501 114 -508 b 150 -484 147 -508 150 -498 l 150 -285 b 151 -274 150 -281 150 -278 b 164 -253 153 -265 158 -256 b 240 -225 176 -251 240 -225 b 258 -202 249 -222 258 -210 l 258 -99 b 245 -86 258 -91 253 -86 l 242 -88 b 240 -88 242 -88 240 -88 l 240 -86 b 168 -115 240 -86 174 -114 b 148 -91 158 -115 148 -107 l 148 43 b 167 85 148 55 156 81 b 240 114 180 91 240 114 b 258 138 249 118 258 128 z',\n },\n accidentalThreeQuarterTonesSharpStein: {\n x_min: 3,\n x_max: 317,\n y_min: -347,\n y_max: 369,\n ha: 716,\n o: 'm 456 324 b 448 336 456 330 454 336 b 393 317 445 336 400 320 b 389 315 392 315 390 315 b 383 325 386 315 383 318 l 383 508 b 360 531 383 528 379 531 b 337 508 341 531 337 527 l 337 318 b 325 291 337 300 334 294 b 268 268 320 288 287 276 b 253 281 256 268 253 274 l 253 464 b 230 487 253 484 249 487 b 207 464 212 487 207 482 l 207 264 b 194 240 207 253 204 245 l 132 217 b 131 217 132 217 132 217 l 130 216 b 118 229 122 216 118 220 l 118 420 b 95 444 118 439 114 444 b 72 420 76 444 72 439 l 72 212 b 60 190 72 197 68 193 l 16 173 b 4 161 9 170 4 167 l 4 50 b 13 39 4 45 9 39 b 58 55 16 39 46 49 b 63 56 60 56 62 56 b 72 42 71 56 72 50 l 72 -125 b 58 -150 72 -137 65 -147 l 16 -166 b 4 -177 9 -168 4 -171 l 4 -289 b 14 -301 4 -295 9 -301 b 53 -287 16 -301 40 -291 b 62 -285 56 -285 59 -285 b 72 -298 69 -285 72 -289 l 72 -477 b 95 -500 72 -495 76 -500 b 118 -477 114 -500 118 -495 l 118 -278 b 127 -259 118 -269 121 -261 l 196 -232 b 207 -243 204 -232 207 -235 l 207 -432 b 230 -455 207 -452 212 -455 b 253 -432 249 -455 253 -451 l 253 -228 b 268 -204 253 -216 259 -207 l 320 -186 b 328 -183 323 -184 325 -183 b 337 -194 334 -183 337 -187 l 337 -387 b 360 -410 337 -408 341 -410 b 383 -387 379 -410 383 -406 l 383 -174 b 395 -157 383 -166 390 -158 l 445 -138 b 456 -127 452 -135 456 -132 l 456 -14 b 448 -3 456 -10 454 -3 b 397 -22 445 -3 408 -17 l 396 -23 b 383 -6 387 -23 383 -16 l 383 163 b 392 181 383 173 384 179 b 445 202 397 183 445 202 b 456 213 452 203 456 207 z m 337 -45 b 266 -78 333 -56 287 -78 b 258 -75 262 -78 259 -76 b 253 19 255 -71 253 -27 b 258 130 253 69 255 122 b 333 163 264 141 315 163 b 337 161 334 163 337 161 b 341 78 340 157 341 120 b 337 -45 341 24 340 -37 z m 118 -127 b 114 -48 114 -121 114 -86 b 118 78 114 6 115 68 b 200 114 122 91 180 114 b 207 111 204 114 206 112 b 212 22 210 107 212 66 b 207 -94 212 -29 210 -85 b 127 -130 203 -108 148 -130 b 118 -127 122 -130 120 -128 z',\n },\n accidentalBuyukMucennebFlat: {\n x_min: 1,\n x_max: 287,\n y_min: -174,\n y_max: 438,\n ha: 612,\n o: 'm 379 452 b 370 464 379 458 377 464 b 164 389 366 464 170 392 b 156 396 163 389 156 393 b 157 436 157 409 157 428 b 167 452 157 445 161 449 b 366 526 173 455 366 526 b 379 540 374 528 379 534 l 379 611 b 370 622 379 616 377 622 b 170 550 366 622 174 552 b 160 557 163 550 160 554 b 161 608 160 585 161 602 b 134 631 161 624 148 631 b 89 590 114 631 91 616 l 89 528 b 81 517 89 526 88 518 b 16 491 76 514 16 491 b 1 480 6 490 1 485 l 1 406 b 13 395 1 400 4 395 l 14 396 b 79 419 16 396 72 415 b 89 412 86 419 89 415 b 91 376 89 399 89 386 b 82 359 91 364 89 361 b 16 331 76 356 16 331 b 1 321 6 331 1 328 l 1 248 b 13 236 1 242 4 236 b 79 262 16 236 71 258 b 92 251 89 262 92 256 b 107 -242 95 23 101 -236 b 120 -251 111 -249 115 -251 b 128 -248 124 -251 128 -248 b 240 -160 171 -225 207 -184 b 413 84 367 -71 413 16 b 284 220 413 166 350 216 b 207 196 259 220 229 209 b 170 176 196 190 184 176 l 168 177 b 151 203 157 181 151 192 b 153 269 151 210 151 236 b 163 292 153 275 153 289 b 366 367 173 297 366 367 b 379 383 374 370 379 376 z m 186 -132 b 173 -137 180 -135 176 -137 b 157 -114 161 -137 157 -122 b 153 35 157 -114 153 -22 b 154 73 153 53 153 68 b 219 135 160 92 197 124 b 255 144 232 141 243 144 b 292 130 269 144 282 140 b 314 62 305 114 314 91 b 186 -132 314 -17 251 -94 z',\n },\n accidentalBakiyeFlat: {\n x_min: -1,\n x_max: 286,\n y_min: -175,\n y_max: 439,\n ha: 614,\n o: 'm 377 454 b 369 467 377 458 376 467 b 363 465 367 467 364 467 b 161 390 363 465 167 393 b 153 399 154 390 153 395 b 157 608 154 494 157 593 b 130 632 157 624 144 632 b 86 592 111 632 88 618 b 88 377 86 592 86 501 b 76 356 88 373 88 360 l 12 331 b -1 320 3 330 -1 327 l -1 248 b 9 236 -1 242 1 236 b 81 264 12 236 78 261 b 89 258 86 264 89 261 b 104 -245 92 30 96 -236 b 115 -252 108 -251 112 -252 b 124 -249 120 -252 124 -249 b 239 -161 167 -226 203 -186 b 412 84 367 -72 412 17 b 282 220 412 166 348 216 b 255 216 274 220 264 219 b 203 196 238 212 222 206 b 171 177 193 189 177 177 b 163 179 168 177 166 177 b 147 202 153 181 147 192 b 147 216 147 204 147 209 l 150 262 b 150 276 150 269 150 275 b 158 291 150 287 154 289 b 363 370 163 292 363 370 b 377 384 373 373 377 379 z m 181 -134 b 167 -138 176 -137 171 -138 b 153 -117 156 -138 153 -125 b 148 27 153 -117 148 -30 b 151 73 148 50 150 68 b 255 144 161 105 219 144 b 312 62 298 144 312 99 b 181 -134 312 -19 249 -96 z',\n },\n accidentalKomaSharp: {\n x_min: 0,\n x_max: 229,\n y_min: -337,\n y_max: 322,\n ha: 659,\n o: 'm 312 151 b 330 176 323 156 330 166 l 330 278 b 320 289 330 285 327 289 b 312 288 318 289 315 289 b 200 246 312 288 203 248 b 181 275 187 246 181 264 l 181 448 b 163 464 181 456 173 464 b 138 441 140 464 138 452 l 138 253 b 122 215 137 240 132 225 b 17 177 92 203 45 177 b 0 153 7 173 0 163 l 0 50 b 10 39 0 43 4 39 b 17 40 13 39 14 39 l 128 81 b 138 52 138 81 138 63 l 138 -91 b 124 -124 138 -107 132 -120 b 17 -167 115 -127 17 -167 b 0 -192 7 -171 0 -181 l 0 -294 b 10 -305 0 -301 4 -305 b 17 -304 13 -305 14 -305 b 128 -261 17 -304 117 -264 l 130 -259 b 138 -276 137 -259 138 -268 l 138 -469 b 157 -485 138 -478 147 -485 b 181 -462 179 -485 181 -475 l 181 -262 b 183 -252 181 -258 181 -255 b 197 -232 186 -243 190 -235 b 312 -187 207 -228 312 -187 b 330 -163 323 -183 330 -173 l 330 -60 b 320 -49 330 -53 327 -49 b 312 -50 318 -49 315 -49 l 200 -94 b 193 -95 197 -95 194 -95 b 181 -68 183 -95 181 -85 l 181 66 b 200 108 181 92 189 104 z',\n },\n accidentalKucukMucennebSharp: {\n x_min: -1,\n x_max: 339,\n y_min: -338,\n y_max: 321,\n ha: 659,\n o: 'm 264 92 b 271 102 264 98 265 99 l 395 150 b 412 174 405 154 412 164 l 412 276 b 402 288 412 284 409 288 b 395 287 400 288 397 288 b 282 245 395 287 285 246 b 264 274 269 245 264 262 l 264 446 b 245 462 264 455 255 462 b 220 439 222 462 220 451 l 220 252 b 204 213 219 239 215 223 b 99 176 174 202 127 176 b 82 151 89 171 82 161 l 82 49 b 92 37 82 42 86 37 b 99 39 95 37 96 37 l 210 79 b 216 81 212 81 215 81 b 220 78 219 81 220 79 l 220 56 b 216 46 220 52 220 48 b 16 -29 210 45 16 -29 b -1 -45 4 -32 -1 -36 l -1 -138 b 12 -154 -1 -145 3 -154 l 215 -79 b 220 -84 219 -79 220 -81 l 220 -105 b 210 -122 220 -115 219 -120 b 99 -168 202 -127 99 -168 b 82 -193 89 -173 82 -183 l 82 -295 b 92 -307 82 -302 86 -307 b 99 -305 95 -307 96 -307 b 210 -262 99 -305 199 -265 l 212 -261 b 220 -278 219 -261 220 -269 l 220 -471 b 239 -487 220 -480 229 -487 b 264 -464 261 -487 264 -477 l 264 -264 b 265 -253 264 -259 264 -256 b 279 -233 268 -245 272 -236 b 395 -189 289 -229 395 -189 b 412 -164 405 -184 412 -174 l 412 -62 b 402 -50 412 -55 409 -50 b 395 -52 400 -50 397 -50 l 278 -96 b 264 -86 268 -96 264 -94 l 264 -68 b 269 -59 264 -62 265 -60 b 471 17 274 -58 471 17 b 488 36 484 22 488 27 l 488 127 b 475 144 488 134 487 144 l 472 141 b 471 141 472 141 471 141 l 471 143 b 272 68 471 143 282 71 l 269 66 b 264 71 264 66 264 69 z',\n },\n accidentalKoron: {\n x_min: 0,\n x_max: 300,\n y_min: -472,\n y_max: 157,\n ha: 629,\n o: 'm 432 -4 b 415 10 432 1 418 9 l 4 226 b 0 223 1 226 0 225 l 0 -672 b 7 -680 0 -677 3 -680 l 45 -680 b 52 -672 49 -680 52 -677 l 52 -193 l 415 -22 b 432 -4 418 -20 432 -13 z m 52 -137 l 52 144 l 327 -7 z',\n },\n accidentalSori: {\n x_min: 0,\n x_max: 421,\n y_min: -318,\n y_max: 328,\n ha: 646,\n o: 'm 606 10 b 589 23 606 16 592 22 l 382 109 l 382 465 b 374 472 382 469 379 472 l 337 472 b 330 465 333 472 330 469 l 330 132 l 183 194 l 183 425 b 176 432 183 429 180 432 l 138 432 b 131 425 134 432 131 429 l 131 216 l 3 269 b 0 265 0 269 0 266 l 0 223 b 3 213 0 216 0 215 l 131 160 l 131 -150 l 3 -203 b 0 -212 0 -204 0 -206 l 0 -255 b 3 -259 0 -258 1 -259 l 131 -204 l 131 -451 b 138 -458 131 -455 134 -458 l 176 -458 b 183 -451 180 -458 183 -455 l 183 -183 l 330 -120 l 330 -410 b 337 -418 330 -415 333 -418 l 374 -418 b 382 -410 379 -418 382 -415 l 382 -98 l 589 -9 b 606 10 592 -9 606 0 z m 183 -128 l 183 138 l 330 76 l 330 -66 z m 382 -45 l 382 55 l 501 6 z',\n },\n articAccentAbove: {\n x_min: 0,\n x_max: 339,\n y_min: 1,\n y_max: 245,\n ha: 244,\n o: 'm 469 151 b 488 177 488 156 488 166 b 469 203 488 189 488 197 l 37 350 b 24 353 32 351 26 353 b 3 333 12 353 7 344 b 0 318 1 327 0 323 b 20 298 0 311 4 304 b 346 187 20 298 331 193 b 356 177 353 186 356 181 b 344 167 356 173 353 170 b 20 58 328 163 20 58 b 0 36 4 50 0 43 b 3 23 0 32 1 27 b 23 1 7 13 13 1 b 29 3 24 1 27 1 z',\n },\n articAccentBelow: {\n x_min: 0,\n x_max: 339,\n y_min: -244,\n y_max: 0,\n ha: 244,\n o: 'm 469 -202 b 488 -176 488 -197 488 -187 b 469 -150 488 -164 488 -156 l 37 -3 b 24 0 32 -1 26 0 b 3 -20 12 0 7 -9 b 0 -35 1 -26 0 -30 b 20 -55 0 -42 4 -49 b 346 -166 20 -55 331 -160 b 356 -176 353 -167 356 -171 b 344 -186 356 -180 353 -183 b 20 -295 328 -190 20 -295 b 0 -317 4 -302 0 -310 b 3 -330 0 -321 1 -325 b 23 -351 7 -340 13 -351 b 29 -350 24 -351 27 -351 z',\n },\n articTenutoAbove: {\n x_min: -1,\n x_max: 338,\n y_min: 0,\n y_max: 48,\n ha: 48,\n o: 'm 452 0 b 487 35 485 0 487 16 b 452 69 487 53 487 69 l 33 69 b -1 35 -1 69 -1 53 b 33 0 -1 16 -1 0 z',\n },\n articTenutoBelow: {\n x_min: -1,\n x_max: 338,\n y_min: -48,\n y_max: 0,\n ha: 48,\n o: 'm 452 -69 b 487 -35 485 -69 487 -53 b 452 0 487 -16 487 0 l 33 0 b -1 -35 -1 0 -1 -16 b 33 -69 -1 -53 -1 -69 z',\n },\n articStaccatoAbove: {\n x_min: 0,\n x_max: 84,\n y_min: 0,\n y_max: 84,\n ha: 84,\n o: 'm 121 60 b 60 121 121 94 94 121 b 0 60 27 121 0 94 b 60 0 0 27 27 0 b 121 60 94 0 121 27 z',\n },\n articStaccatoBelow: {\n x_min: 0,\n x_max: 84,\n y_min: -84,\n y_max: 0,\n ha: 84,\n o: 'm 121 -60 b 60 0 121 -27 94 0 b 0 -60 27 0 0 -27 b 60 -121 0 -94 27 -121 b 121 -60 94 -121 121 -94 z',\n },\n articStaccatissimoAbove: {\n x_min: 1,\n x_max: 100,\n y_min: -2,\n y_max: 293,\n ha: 295,\n o: 'm 72 422 b 1 390 35 422 3 409 b 72 -3 1 369 39 -3 b 144 389 108 -3 144 356 b 72 422 144 410 111 422 z',\n },\n articStaccatissimoBelow: {\n x_min: 1,\n x_max: 100,\n y_min: -295,\n y_max: 0,\n ha: 295,\n o: 'm 72 -425 b 144 -392 111 -425 144 -413 b 72 0 144 -359 108 0 b 1 -393 39 0 1 -372 b 72 -425 3 -412 35 -425 z',\n },\n articMarcatoAbove: {\n x_min: -1,\n x_max: 235,\n y_min: -1,\n y_max: 253,\n ha: 254,\n o: 'm 181 356 b 167 364 177 361 173 364 b 153 356 157 364 153 356 l 0 23 b -1 16 -1 20 -1 19 b 9 0 -1 9 1 1 b 16 -1 10 -1 14 -1 b 32 9 22 -1 29 1 b 112 186 32 9 109 180 b 118 190 114 189 115 190 b 127 186 121 190 124 189 b 209 9 128 180 209 9 b 225 0 213 3 219 0 l 323 0 b 338 16 333 1 338 7 b 337 23 338 19 338 22 z',\n },\n articMarcatoBelow: {\n x_min: -1,\n x_max: 235,\n y_min: -254,\n y_max: 0,\n ha: 254,\n o: 'm 156 -357 b 170 -366 160 -363 164 -366 b 184 -357 180 -366 184 -357 l 337 -24 b 338 -17 338 -22 338 -20 b 328 -1 338 -10 336 -3 b 321 0 327 0 323 0 b 305 -10 315 0 308 -3 b 225 -187 305 -10 228 -181 b 219 -192 223 -190 222 -192 b 210 -187 216 -192 213 -190 b 128 -10 209 -181 128 -10 b 112 -1 124 -4 118 -1 l 14 -1 b -1 -17 4 -3 -1 -9 b 0 -24 -1 -20 -1 -23 z',\n },\n fermataAbove: {\n x_min: 3,\n x_max: 605,\n y_min: -3,\n y_max: 329,\n ha: 332,\n o: 'm 435 318 b 818 36 742 318 804 91 b 821 26 819 32 819 27 b 851 -4 831 6 837 -4 b 871 16 864 -4 871 1 b 870 30 871 20 871 24 b 438 474 780 471 480 474 b 6 30 392 474 94 471 b 4 14 4 24 4 19 b 23 -4 4 0 12 -4 b 52 26 36 -4 43 6 b 56 39 53 27 55 33 b 435 318 73 98 138 318 z m 516 75 b 436 153 516 117 480 153 b 359 75 395 153 359 117 b 436 -4 359 32 395 -4 b 516 75 480 -4 516 32 z',\n },\n fermataBelow: {\n x_min: 3,\n x_max: 605,\n y_min: -332,\n y_max: 0,\n ha: 332,\n o: 'm 435 -323 b 56 -43 138 -323 73 -102 b 52 -30 55 -37 53 -32 b 23 0 43 -10 36 0 b 4 -19 12 0 4 -4 b 6 -35 4 -23 4 -29 b 438 -478 94 -475 392 -478 b 870 -35 480 -478 780 -475 b 871 -20 871 -29 871 -24 b 851 0 871 -6 864 0 b 821 -30 837 0 831 -10 b 818 -40 819 -32 819 -36 b 435 -323 804 -95 742 -323 z m 516 -79 b 436 0 516 -36 480 0 b 359 -79 395 0 359 -36 b 436 -157 359 -121 395 -157 b 516 -79 480 -157 516 -121 z',\n },\n breathMarkComma: {\n x_min: 1,\n x_max: 152,\n y_min: 2,\n y_max: 251,\n ha: 249,\n o: 'm 104 361 b 1 271 42 361 1 321 b 82 190 1 222 35 190 b 122 160 118 190 122 160 b 125 144 124 154 125 150 b 102 88 125 124 115 105 b 37 32 78 56 40 35 b 26 17 32 29 26 26 l 27 16 b 37 3 29 6 33 3 b 181 102 85 3 158 66 b 219 239 210 147 219 197 l 219 249 b 104 361 219 317 170 361 z',\n },\n breathMarkUpbow: {\n x_min: 1,\n x_max: 249,\n y_min: 1,\n y_max: 495,\n ha: 494,\n o: 'm 181 1 b 206 22 193 1 203 10 l 359 683 l 359 688 b 338 713 359 700 351 710 l 333 713 b 308 694 321 713 311 706 l 180 140 l 53 694 b 27 713 49 706 39 713 l 22 713 b 1 690 10 710 1 700 b 3 683 1 687 1 685 l 154 22 b 181 1 157 10 167 1 z',\n },\n caesura: {\n x_min: 0,\n x_max: 384,\n y_min: -1,\n y_max: 532,\n ha: 533,\n o: 'm 40 -1 b 78 26 58 -1 72 9 l 321 713 b 323 726 323 717 323 721 b 282 766 323 747 304 766 b 245 739 265 766 251 756 l 3 52 b 0 37 1 48 0 42 b 27 1 0 22 10 7 b 40 -1 32 -1 36 -1 z m 308 26 l 552 713 b 553 726 553 717 553 721 b 513 766 553 747 534 766 b 475 739 495 766 481 756 l 232 52 b 230 39 230 48 230 43 b 258 1 230 23 240 7 b 271 -1 262 -1 266 -1 b 308 26 287 -1 302 9 z',\n },\n caesuraCurved: {\n x_min: 0,\n x_max: 373,\n y_min: 0,\n y_max: 530,\n ha: 530,\n o: 'm 491 763 b 445 719 468 763 446 744 b 252 98 432 507 340 295 l 226 39 b 223 27 225 35 223 32 b 252 0 223 13 233 0 b 276 16 262 0 272 6 b 537 716 386 230 537 478 b 491 763 537 742 518 763 z m 29 0 b 53 16 39 0 48 6 l 82 69 b 314 716 187 264 314 498 b 268 763 314 742 295 763 b 222 719 245 763 223 744 b 29 98 209 507 117 295 l 3 39 b 0 29 1 36 0 33 b 29 0 0 14 12 0 z',\n },\n restMaxima: {\n x_min: 0,\n x_max: 381,\n y_min: -249,\n y_max: 250,\n ha: 499,\n o: 'm 180 -330 l 180 331 b 156 360 180 356 170 360 l 23 360 b 0 331 10 360 0 356 l 0 -330 b 23 -359 0 -354 10 -359 l 156 -359 b 180 -330 170 -359 180 -354 z m 549 -330 l 549 331 b 524 360 549 356 539 360 l 392 360 b 369 331 379 360 369 356 l 369 -330 b 392 -359 369 -354 379 -359 l 524 -359 b 549 -330 539 -359 549 -354 z',\n },\n restDoubleWhole: {\n x_min: 0,\n x_max: 125,\n y_min: 0,\n y_max: 250,\n ha: 250,\n o: 'm 180 22 l 180 338 b 156 360 180 350 170 360 l 23 360 b 0 338 10 360 0 350 l 0 22 b 23 0 0 10 10 0 l 156 0 b 180 22 170 0 180 10 z',\n },\n restWhole: {\n x_min: 0,\n x_max: 282,\n y_min: -135,\n y_max: 9,\n ha: 144,\n o: 'm 406 -157 l 406 -24 b 369 13 406 -3 389 13 l 37 13 b 0 -24 16 13 0 -3 l 0 -157 b 37 -194 0 -177 16 -194 l 369 -194 b 406 -157 389 -194 406 -177 z',\n },\n restHalf: {\n x_min: 0,\n x_max: 282,\n y_min: -2,\n y_max: 142,\n ha: 144,\n o: 'm 406 35 l 406 167 b 369 204 406 189 389 204 l 37 204 b 0 167 16 204 0 189 l 0 35 b 37 -3 0 14 16 -3 l 369 -3 b 406 35 389 -3 406 14 z',\n },\n restQuarter: {\n x_min: 1,\n x_max: 270,\n y_min: -375,\n y_max: 373,\n ha: 748,\n o: 'm 112 -55 b 174 -141 135 -84 156 -111 b 183 -161 177 -147 183 -158 b 181 -167 183 -163 183 -166 b 166 -174 179 -173 173 -174 b 143 -170 160 -174 148 -171 b 137 -170 141 -170 138 -170 l 125 -166 b 1 -304 50 -166 1 -233 b 168 -527 1 -376 63 -446 b 206 -540 180 -536 194 -540 b 228 -531 216 -540 226 -537 b 230 -521 229 -527 230 -524 b 207 -487 230 -508 219 -497 b 170 -435 189 -487 173 -448 b 164 -397 166 -423 164 -410 b 255 -292 164 -338 194 -292 b 369 -317 297 -292 344 -308 l 370 -318 b 382 -320 376 -320 379 -320 b 389 -314 386 -320 389 -318 b 336 -232 389 -297 351 -249 b 236 -32 281 -166 236 -112 b 236 -27 236 -30 236 -29 l 238 -17 b 238 -13 238 -16 238 -14 b 333 199 243 71 295 140 b 338 220 337 206 338 213 b 333 248 338 235 333 248 b 95 526 333 248 120 501 b 69 537 88 533 78 537 b 40 507 55 537 40 527 b 46 484 40 500 42 492 b 134 291 52 468 134 395 b 48 108 134 238 112 176 b 27 66 33 94 27 78 b 42 32 27 46 42 32 z',\n },\n rest8th: {\n x_min: 0,\n x_max: 247,\n y_min: -251,\n y_max: 174,\n ha: 425,\n o: 'm 193 154 b 96 251 193 207 150 251 b 0 154 43 251 0 207 b 39 81 0 124 17 98 b 117 56 62 65 89 56 b 173 66 137 56 157 60 b 225 88 193 72 206 78 b 232 89 228 89 230 89 b 239 76 238 89 239 84 b 238 60 239 72 239 66 b 104 -343 233 39 130 -248 b 145 -361 104 -360 137 -361 b 196 -347 161 -361 181 -359 b 341 161 200 -344 341 161 b 356 217 347 187 354 210 b 338 240 356 232 341 239 b 323 235 336 240 331 240 b 193 140 312 226 240 140 z',\n },\n rest16th: {\n x_min: 0,\n x_max: 320,\n y_min: -500,\n y_max: 179,\n ha: 679,\n o: 'm 300 160 b 202 258 300 215 256 258 b 104 160 148 258 104 215 b 219 62 104 101 164 62 b 331 94 258 62 298 75 b 341 96 336 95 338 96 b 348 86 346 96 348 94 b 265 -173 348 63 275 -151 b 194 -217 253 -200 215 -217 b 196 -203 196 -212 196 -207 b 98 -105 196 -148 151 -105 b 0 -203 43 -105 0 -148 b 115 -301 0 -262 60 -301 b 223 -271 153 -301 190 -288 b 229 -279 226 -271 229 -274 l 228 -281 b 228 -282 228 -282 228 -282 l 91 -690 b 91 -691 91 -690 91 -691 l 89 -693 b 134 -720 89 -706 102 -720 b 189 -687 176 -720 183 -703 l 356 -138 b 420 81 393 -16 420 81 b 459 226 420 81 456 207 b 461 232 459 229 461 230 b 446 248 461 240 449 246 b 431 242 439 248 435 245 b 300 145 420 233 348 147 z',\n },\n rest32nd: {\n x_min: 0,\n x_max: 363,\n y_min: -500,\n y_max: 426,\n ha: 926,\n o: 'm 508 603 b 492 598 501 603 497 600 b 361 503 482 590 410 503 l 361 516 b 264 613 361 570 318 613 b 166 516 210 613 166 570 b 206 444 166 487 183 461 b 246 423 217 433 232 428 b 284 418 258 420 269 418 b 393 449 321 418 360 432 b 399 451 395 451 397 451 b 415 426 409 451 415 436 l 413 423 b 413 422 413 423 413 422 l 357 192 b 279 140 350 168 302 140 b 281 153 281 144 281 148 b 183 251 281 207 236 251 b 85 153 128 251 85 207 b 125 81 85 124 102 98 b 164 60 137 71 150 65 b 203 55 176 58 189 55 b 311 86 240 55 278 69 b 315 88 312 88 314 88 b 325 69 323 88 325 76 l 268 -167 b 194 -217 261 -197 216 -216 b 196 -203 196 -212 196 -207 b 98 -105 196 -148 153 -105 b 0 -203 45 -105 0 -148 b 115 -301 0 -262 60 -301 b 228 -269 154 -301 194 -288 b 232 -268 229 -268 230 -268 b 240 -276 236 -268 240 -272 b 138 -688 240 -282 141 -678 b 137 -697 137 -691 137 -694 b 176 -720 137 -708 145 -720 b 232 -690 222 -720 226 -706 b 484 436 236 -672 484 436 b 521 582 484 436 518 564 b 523 588 521 585 523 586 b 508 603 523 600 511 603 z',\n },\n rest64th: {\n x_min: 0,\n x_max: 423,\n y_min: -753,\n y_max: 430,\n ha: 1183,\n o: 'm 596 609 b 580 603 589 609 585 606 b 448 507 569 595 497 507 b 449 521 449 511 449 516 b 351 619 449 575 405 619 b 253 521 297 619 253 575 b 372 422 253 461 317 422 b 481 454 410 422 446 438 b 491 456 484 455 488 456 b 504 441 498 456 504 451 b 501 426 504 436 503 432 b 445 202 500 422 451 217 b 359 144 435 174 383 144 l 359 158 b 261 256 359 212 315 256 b 163 158 207 256 163 212 b 243 65 163 112 202 78 b 279 60 255 62 266 60 b 397 91 320 60 360 73 b 403 92 400 92 402 92 b 412 79 409 92 412 86 b 410 72 412 76 412 75 b 351 -161 408 59 356 -150 b 281 -212 340 -199 301 -212 l 281 -197 b 183 -99 281 -144 238 -99 b 85 -197 130 -99 85 -144 b 125 -271 85 -228 102 -253 b 166 -291 138 -279 151 -287 b 204 -297 177 -294 192 -297 b 262 -287 225 -297 245 -292 b 305 -265 282 -279 287 -274 b 310 -264 307 -264 308 -264 b 318 -284 317 -264 318 -275 b 317 -295 318 -288 317 -294 b 259 -524 315 -302 265 -508 b 194 -567 251 -554 213 -567 b 196 -554 196 -563 196 -559 b 98 -456 196 -500 153 -456 b 0 -554 45 -456 0 -500 b 40 -626 0 -583 17 -609 b 118 -652 60 -644 92 -652 b 210 -629 145 -652 186 -642 b 216 -628 213 -628 215 -628 b 228 -647 226 -628 228 -639 l 226 -651 b 226 -652 226 -651 226 -652 l 122 -1054 b 121 -1064 121 -1058 121 -1061 b 167 -1084 121 -1077 134 -1084 b 215 -1060 202 -1084 209 -1076 b 402 -278 217 -1047 229 -1021 b 436 -135 403 -278 431 -161 l 570 441 b 609 588 570 441 605 569 b 596 609 609 603 602 608 z',\n },\n rest128th: {\n x_min: 0,\n x_max: 485,\n y_min: -750,\n y_max: 689,\n ha: 1439,\n o: 'm 537 894 b 439 992 537 949 494 992 b 341 894 386 992 341 949 b 382 822 341 865 359 840 b 459 796 402 805 433 796 b 518 806 480 796 501 801 l 520 808 b 569 828 539 814 552 819 b 580 831 572 829 577 831 b 598 812 589 831 598 825 b 596 801 598 809 598 805 b 540 575 590 773 546 595 b 448 510 534 553 475 510 l 448 524 b 350 622 448 577 405 622 b 252 524 297 622 252 577 b 292 451 252 494 269 468 b 369 426 318 433 337 426 b 429 435 389 426 412 429 b 494 464 449 442 475 455 b 498 465 495 465 497 465 b 505 446 504 465 505 456 b 503 426 505 439 504 432 l 446 202 b 366 144 439 173 389 144 l 366 158 b 268 256 366 212 323 256 b 170 158 215 256 170 212 b 289 59 170 98 235 59 b 347 69 310 59 330 63 b 397 91 367 76 379 82 b 406 94 400 92 403 94 b 415 79 412 94 415 88 b 412 63 415 75 413 69 b 357 -157 408 42 364 -134 b 281 -212 346 -196 302 -212 b 282 -197 281 -207 282 -203 b 184 -99 282 -144 238 -99 b 86 -197 130 -99 86 -144 b 204 -297 86 -258 150 -297 b 262 -287 225 -297 245 -292 b 312 -265 282 -279 294 -274 b 318 -264 314 -264 317 -264 b 327 -275 324 -264 327 -269 b 266 -517 324 -287 278 -490 b 200 -569 248 -566 220 -567 l 196 -554 b 98 -456 196 -500 153 -456 b 0 -554 45 -456 0 -500 b 118 -652 0 -615 63 -652 b 177 -642 138 -652 160 -648 l 179 -641 b 229 -621 197 -635 210 -629 l 230 -619 b 239 -626 236 -619 239 -622 b 238 -632 239 -628 239 -631 b 131 -1057 235 -642 134 -1050 b 173 -1080 131 -1071 140 -1080 b 230 -1057 219 -1080 225 -1074 l 658 815 b 697 960 658 815 694 942 b 698 966 697 963 698 965 b 684 982 698 975 687 981 b 668 976 677 982 672 979 b 537 880 658 969 586 881 z',\n },\n dynamicPiano: {\n x_min: -89,\n x_max: 366,\n y_min: -142,\n y_max: 274,\n ha: 416,\n o: 'm 395 395 b 292 357 350 395 318 380 b 262 328 272 340 268 328 b 246 363 255 328 259 338 b 177 393 236 380 215 393 b 1 251 92 393 46 333 b -9 223 -6 238 -9 230 b 7 207 -9 213 -1 207 b 30 229 17 207 23 216 b 127 338 72 301 101 338 b 143 321 138 338 143 331 b 134 285 143 310 138 295 l -43 -154 b -65 -168 -48 -166 -50 -168 l -109 -168 b -128 -187 -122 -168 -128 -174 b -111 -204 -128 -199 -122 -204 l 167 -204 b 186 -186 180 -204 186 -199 b 168 -168 186 -174 180 -168 l 111 -168 b 98 -164 102 -168 98 -168 b 101 -154 98 -163 99 -158 l 166 7 b 179 24 168 14 171 24 b 213 -1 186 24 190 10 b 276 -14 233 -12 252 -14 b 527 266 415 -14 527 130 b 395 395 527 350 475 395 z m 356 341 b 389 288 380 341 389 320 b 243 35 389 217 312 35 b 207 81 219 35 207 50 b 235 180 207 111 219 140 l 264 251 b 356 341 284 300 321 341 z',\n },\n dynamicMezzo: {\n x_min: -20,\n x_max: 446,\n y_min: -10,\n y_max: 274,\n ha: 284,\n o: 'm 528 395 b 431 350 487 395 454 374 b 409 330 416 336 415 330 b 397 360 402 330 406 341 b 334 395 389 379 370 395 b 236 350 292 395 259 374 b 215 330 222 336 220 330 b 203 360 207 330 212 340 b 147 393 194 379 174 393 b -19 251 71 393 26 331 b -29 223 -26 238 -29 230 b -13 207 -29 213 -22 207 b 9 226 -3 207 1 215 b 107 338 52 300 81 338 b 122 321 118 338 122 331 b 114 285 122 310 118 295 l 9 24 b 4 9 6 17 4 13 b 20 0 4 3 9 0 l 91 0 b 114 17 104 0 108 3 l 207 251 b 287 323 225 292 255 323 b 308 302 304 323 308 314 b 294 249 308 285 302 269 b 203 24 294 248 292 248 b 199 9 200 17 199 13 b 215 0 199 3 203 0 l 285 0 b 308 17 298 0 302 3 l 402 251 b 481 323 419 292 449 323 b 503 302 498 323 503 314 b 413 43 503 252 413 104 b 478 -14 413 6 436 -14 b 629 102 533 -14 583 26 b 642 132 638 117 642 125 b 629 145 642 141 636 145 b 608 127 619 145 615 138 b 534 49 580 84 553 49 b 523 62 526 49 523 53 b 606 317 523 112 606 238 b 528 395 606 353 588 395 z',\n },\n dynamicForte: {\n x_min: -141,\n x_max: 364,\n y_min: -152,\n y_max: 444,\n ha: 596,\n o: 'm 23 380 b 0 357 7 380 0 373 b 22 336 0 343 7 336 l 105 336 b 117 330 114 336 117 336 b 114 315 117 327 115 323 l 23 0 b -101 -187 -17 -141 -43 -187 b -127 -174 -120 -187 -127 -181 b -92 -156 -127 -163 -114 -170 b -63 -102 -75 -144 -63 -125 b -128 -43 -63 -65 -89 -43 b -203 -122 -171 -43 -203 -78 b -95 -219 -203 -186 -156 -219 b 161 17 14 -219 82 -145 b 269 317 203 105 235 194 l 271 318 b 289 336 271 323 282 336 l 383 336 b 406 359 399 336 406 343 b 384 380 406 373 399 380 l 298 380 b 284 387 288 380 284 380 b 287 405 284 392 285 396 b 419 606 315 530 347 606 b 442 595 431 606 442 603 b 419 580 442 586 435 588 b 389 526 400 572 389 552 b 454 465 389 485 418 465 b 524 543 491 465 524 490 b 400 639 524 596 491 639 b 135 402 261 639 183 540 b 107 380 128 380 127 380 z',\n },\n dynamicRinforzando: {\n x_min: -20,\n x_max: 277,\n y_min: 0,\n y_max: 274,\n ha: 274,\n o: 'm 324 395 b 235 350 287 395 256 374 b 215 330 222 336 220 330 b 203 360 207 330 213 337 b 145 393 194 379 174 393 b -19 251 75 393 27 337 b -29 223 -26 238 -29 230 b -13 207 -29 213 -22 207 b 9 226 -3 207 3 215 b 107 338 52 301 81 338 b 122 321 118 338 122 331 b 114 285 122 310 118 295 l 9 24 b 4 9 6 17 4 13 b 20 0 4 3 9 0 l 91 0 b 114 17 104 0 108 3 l 207 251 b 304 351 226 298 272 351 b 318 343 312 351 318 348 b 287 285 318 330 287 325 b 338 239 287 256 308 239 b 399 318 373 239 399 268 b 324 395 399 360 377 395 z',\n },\n dynamicSforzando: {\n x_min: 0,\n x_max: 229,\n y_min: -10,\n y_max: 273,\n ha: 283,\n o: 'm 212 393 b 68 274 127 393 68 350 b 145 161 68 223 95 196 b 200 85 187 132 200 114 b 127 20 200 53 173 20 b 66 42 91 20 66 32 b 91 56 66 49 75 46 b 111 98 104 65 111 79 b 59 145 111 127 86 145 b 0 78 24 145 0 117 b 125 -14 0 30 49 -14 b 291 120 219 -14 291 36 b 220 232 291 160 276 190 b 151 314 168 271 151 287 b 213 361 151 337 168 361 b 258 346 238 361 258 356 b 240 333 258 340 251 340 b 226 298 232 325 226 314 b 276 252 226 269 248 252 b 330 307 311 252 330 279 b 212 393 330 360 285 393 z',\n },\n dynamicZ: {\n x_min: -30,\n x_max: 244,\n y_min: -10,\n y_max: 268,\n ha: 278,\n o: 'm 333 386 b 298 377 321 386 314 382 b 239 370 282 373 259 370 b 94 383 153 370 111 383 b 68 364 79 383 72 377 l 33 264 b 29 242 30 255 29 248 b 45 228 29 232 36 228 b 66 249 55 228 60 236 l 81 279 b 96 297 85 288 88 297 b 168 292 102 297 127 292 b 223 302 194 292 215 302 b 196 269 229 302 197 271 l -26 45 b -43 16 -37 33 -43 27 b -24 -1 -43 6 -36 -1 b 4 16 -12 -1 -3 10 b 39 30 16 24 27 30 b 179 -14 79 30 108 -14 b 297 102 259 -14 297 43 b 245 166 297 147 271 166 b 197 115 219 166 197 145 b 236 72 197 88 216 72 b 259 79 251 72 255 79 b 264 75 262 79 264 78 b 258 60 264 72 261 66 b 229 45 252 50 242 45 b 117 95 186 45 173 95 b 85 86 98 95 89 86 b 102 111 85 86 95 104 l 333 338 b 351 370 344 350 351 359 b 333 386 351 380 343 386 z',\n },\n ornamentTrill: {\n x_min: 0,\n x_max: 521,\n y_min: -10,\n y_max: 390,\n ha: 400,\n o: 'm 383 562 b 364 557 377 562 369 559 l 294 534 b 269 511 281 530 275 526 l 217 384 b 206 367 212 370 210 367 b 179 380 200 367 192 374 b 118 393 158 389 140 393 b 0 292 50 393 0 353 b 95 210 0 248 30 210 b 140 213 112 210 131 213 b 144 209 143 213 144 212 b 140 194 144 206 143 202 l 124 156 b 96 58 108 117 96 88 b 179 -14 96 17 124 -14 b 325 153 253 -14 325 46 b 307 251 325 187 320 219 b 302 265 304 258 302 261 b 334 294 302 274 311 281 l 343 298 b 455 348 393 328 428 348 b 474 327 468 348 474 344 b 465 285 474 312 469 295 l 360 24 b 356 9 357 17 356 13 b 372 0 356 3 360 0 l 442 0 b 465 17 455 0 459 3 l 559 251 b 655 351 577 298 624 351 b 670 343 664 351 670 348 b 638 285 670 330 638 325 b 690 239 638 256 660 239 b 750 318 724 239 750 268 b 675 395 750 360 729 395 b 586 350 638 395 608 374 b 566 330 573 336 572 330 b 553 361 559 330 564 340 b 490 393 543 380 521 393 b 347 348 432 393 377 364 b 312 333 328 338 320 333 b 308 337 310 333 308 334 b 315 359 308 343 312 351 l 387 537 b 392 553 390 544 392 549 b 383 562 392 559 389 562 z m 118 360 b 192 325 134 360 192 347 b 186 307 192 321 189 314 l 180 292 b 148 265 173 274 167 269 b 98 258 130 261 112 258 b 39 301 50 258 39 281 b 118 360 39 327 60 360 z m 272 240 b 292 151 285 240 292 164 b 212 30 292 88 253 30 b 196 48 200 30 196 37 b 207 92 196 59 202 78 b 264 230 207 94 209 94 b 272 240 266 238 268 240 z',\n },\n ornamentTurn: {\n x_min: 0,\n x_max: 460,\n y_min: 0,\n y_max: 218,\n ha: 218,\n o: 'm 534 314 b 454 251 490 314 454 294 b 505 199 454 219 475 199 b 579 232 547 199 549 232 b 626 164 603 232 626 202 b 533 72 626 102 583 72 b 377 180 487 72 439 111 b 150 312 307 258 243 312 b 0 148 55 312 0 240 b 128 0 0 45 66 0 b 209 63 173 0 209 20 b 157 115 209 95 187 115 b 84 82 115 115 114 82 b 36 150 59 82 36 112 b 130 242 36 212 79 242 b 285 134 176 242 223 203 b 513 1 356 56 419 1 b 662 166 608 1 662 73 b 534 314 662 269 596 314 z',\n },\n ornamentTurnSlash: {\n x_min: 0,\n x_max: 460,\n y_min: -90,\n y_max: 306,\n ha: 396,\n o: 'm 333 441 b 310 418 315 441 310 433 l 310 274 b 302 252 310 258 308 252 b 261 278 294 252 287 262 b 150 311 228 298 192 311 b 0 147 55 311 0 239 b 128 -1 0 43 66 -1 b 209 62 173 -1 209 19 b 157 114 209 94 187 114 b 84 81 115 114 114 81 b 36 148 59 81 36 111 b 130 240 36 210 79 240 b 285 128 176 240 222 197 b 307 79 304 108 307 105 l 307 -107 b 330 -130 307 -122 312 -130 b 353 -107 347 -130 353 -122 l 353 37 b 360 59 353 53 353 59 b 402 33 369 59 376 49 b 513 0 435 13 471 0 b 662 164 608 0 662 72 b 534 312 662 268 596 312 b 454 249 490 312 454 292 b 505 197 454 217 475 197 b 579 230 547 197 549 230 b 626 163 603 230 626 200 b 533 71 626 101 583 71 b 377 183 487 71 441 114 b 356 232 359 203 356 206 l 356 418 b 333 441 356 433 350 441 z',\n },\n ornamentMordent: {\n x_min: 1,\n x_max: 729,\n y_min: -73,\n y_max: 319,\n ha: 392,\n o: 'm 546 265 l 546 459 l 501 459 l 501 216 l 459 167 b 439 167 454 160 445 160 b 302 327 387 228 310 317 b 258 353 291 338 282 351 b 226 340 245 353 238 348 l 20 107 b 1 73 12 98 1 84 b 30 59 1 65 9 59 b 88 94 53 59 73 79 b 144 143 107 109 124 127 b 176 161 158 154 168 161 b 197 144 183 161 189 156 l 323 10 b 351 0 328 3 340 0 b 377 9 361 0 372 3 b 498 114 392 17 475 94 l 498 -105 l 544 -105 l 544 153 b 562 160 550 157 556 160 b 585 144 569 160 576 156 b 710 10 590 135 697 24 b 737 0 716 3 727 0 b 765 9 749 0 759 3 b 1030 295 776 17 1011 274 l 1032 300 b 1050 328 1041 308 1050 318 b 1012 353 1050 343 1024 353 b 986 343 1002 353 994 348 b 854 190 971 330 871 206 b 828 176 842 180 835 176 b 802 190 818 176 809 183 b 681 333 791 202 696 320 b 645 353 668 344 657 353 b 613 340 634 353 626 350 b 580 304 600 330 590 315 z',\n },\n ornamentShortTrill: {\n x_min: 0,\n x_max: 725,\n y_min: 0,\n y_max: 245,\n ha: 245,\n o: 'm 429 167 l 301 325 b 256 353 291 338 282 350 b 225 340 246 353 238 350 b 16 105 158 268 88 186 b 0 72 9 96 0 86 b 29 58 0 63 7 58 b 71 76 42 58 55 62 l 158 154 b 174 160 163 158 168 160 b 197 143 181 160 187 154 b 321 10 203 135 310 24 b 350 0 327 3 338 0 b 377 7 361 0 372 3 l 533 148 b 554 160 543 158 550 160 b 577 143 562 160 566 156 b 703 10 585 135 690 24 b 732 0 708 3 720 0 b 759 7 743 0 753 3 b 1024 294 769 16 1005 272 b 1044 327 1032 305 1044 321 b 1005 353 1044 341 1018 353 b 979 343 996 353 988 348 b 848 189 963 330 864 204 b 821 174 837 179 828 174 b 796 189 811 174 804 181 b 674 331 783 202 688 318 b 641 351 662 343 651 351 b 606 340 628 351 619 350 b 573 304 593 328 583 315 b 444 167 533 259 491 213 b 429 167 439 161 433 161 z',\n },\n ornamentTremblement: {\n x_min: 1,\n x_max: 985,\n y_min: 0,\n y_max: 244,\n ha: 244,\n o: 'm 678 325 b 634 351 667 338 657 350 b 602 338 621 351 613 348 l 448 167 b 439 167 446 164 441 164 l 302 325 b 258 351 291 338 281 350 b 228 338 245 351 238 348 b 193 304 215 328 204 315 l 19 107 b 1 72 13 96 1 76 b 30 58 1 63 9 58 b 89 92 52 58 73 78 l 144 141 b 148 144 145 143 147 143 b 176 160 160 153 170 160 b 199 143 183 160 189 154 b 324 10 204 134 311 23 b 351 0 330 3 340 0 b 379 7 363 0 373 3 l 530 148 b 552 160 536 154 546 160 b 575 143 559 160 564 154 b 698 10 580 134 687 23 b 727 0 704 3 716 0 b 755 7 739 0 749 3 l 907 147 b 930 160 922 158 923 160 b 952 143 937 160 943 154 l 1077 10 b 1107 0 1084 3 1096 0 b 1133 7 1117 0 1128 3 b 1398 294 1143 16 1380 272 b 1418 327 1407 305 1418 321 b 1381 351 1418 343 1394 351 b 1354 341 1371 351 1362 348 b 1223 189 1338 328 1238 204 b 1195 174 1211 179 1202 174 b 1171 189 1185 174 1178 181 b 1048 331 1158 200 1063 318 b 1012 351 1035 343 1024 351 b 981 338 1002 351 994 350 b 948 304 968 328 958 315 b 827 166 907 258 865 212 b 815 166 824 163 818 163 b 678 325 760 226 732 264 z',\n },\n ornamentPrecompAppoggTrill: {\n x_min: 0,\n x_max: 1119,\n y_min: 0,\n y_max: 481,\n ha: 481,\n o: 'm 1015 163 b 873 328 963 223 880 318 b 828 354 860 344 847 353 b 796 341 816 354 809 351 b 763 305 783 331 773 317 b 642 168 721 261 681 215 b 636 163 641 167 639 164 b 494 328 585 223 501 318 b 449 354 481 344 468 353 b 418 341 438 354 431 351 b 384 305 405 331 395 317 b 264 168 343 261 302 215 l 242 144 b 144 88 232 124 171 88 b 79 197 81 88 79 189 l 79 648 b 60 693 79 683 71 693 b 52 691 58 693 55 693 b 0 616 3 672 0 625 l 0 207 b 121 0 0 40 68 0 b 249 68 168 0 232 53 b 279 94 262 75 271 86 b 336 144 298 111 315 128 b 367 163 350 156 360 163 b 389 145 374 163 380 157 b 514 12 395 137 501 26 b 543 1 520 4 531 1 b 569 9 553 1 563 4 b 636 73 576 14 605 43 l 658 94 b 714 144 677 111 694 128 b 746 163 729 156 739 163 b 768 145 753 163 759 157 b 893 12 773 137 880 26 b 922 1 899 4 910 1 b 948 9 932 1 942 4 l 1012 71 b 1037 94 1022 78 1030 86 b 1092 144 1054 111 1073 128 b 1123 161 1106 156 1115 161 b 1146 145 1130 161 1136 157 b 1270 12 1152 137 1259 26 b 1299 1 1276 4 1287 1 b 1326 9 1310 1 1320 4 b 1591 297 1336 19 1572 275 b 1611 328 1600 307 1611 320 b 1574 354 1611 343 1585 354 b 1548 344 1565 354 1555 350 b 1416 192 1532 331 1431 206 b 1388 177 1404 181 1395 177 b 1365 190 1380 177 1371 184 b 1243 333 1352 203 1256 321 b 1205 354 1228 346 1217 354 b 1174 341 1195 354 1187 351 b 1140 305 1161 330 1152 317 z',\n },\n ornamentPrecompSlideTrillDAnglebert: {\n x_min: 2,\n x_max: 1150,\n y_min: -367,\n y_max: 245,\n ha: 612,\n o: 'm 1058 160 b 916 327 1007 220 923 317 b 871 353 903 343 890 351 b 840 340 860 353 852 350 b 806 304 827 330 816 315 b 685 167 765 259 724 213 l 680 160 l 615 235 b 419 344 582 275 523 344 b 3 -144 258 344 3 26 b 4 -168 3 -153 3 -160 b 246 -482 24 -315 99 -422 b 458 -528 340 -521 410 -528 b 514 -526 485 -528 504 -526 b 552 -508 531 -526 552 -517 b 514 -497 552 -503 541 -498 l 503 -497 b 194 -390 432 -494 298 -488 b 69 -151 194 -390 69 -279 b 184 96 69 -60 128 27 b 328 183 202 118 258 183 b 477 96 413 183 454 118 b 559 10 510 62 552 19 b 588 0 566 3 576 0 b 613 7 598 0 609 3 b 723 112 622 14 681 73 b 789 161 733 122 776 161 b 811 144 796 161 802 156 b 936 10 816 135 923 24 b 965 0 942 3 953 0 b 991 7 975 0 985 3 b 1051 66 996 12 1022 37 b 1081 92 1063 73 1073 84 b 1136 143 1099 109 1117 127 b 1168 160 1151 154 1159 160 b 1191 144 1175 160 1181 156 b 1315 10 1197 135 1303 24 b 1344 0 1320 3 1332 0 b 1371 7 1355 0 1365 3 b 1636 295 1381 17 1617 274 b 1656 327 1644 305 1656 318 b 1619 353 1656 341 1630 353 b 1593 343 1610 353 1600 348 b 1460 190 1577 330 1476 204 b 1433 176 1449 180 1440 176 b 1410 189 1424 176 1416 183 b 1287 331 1397 202 1300 320 b 1250 353 1273 344 1261 353 b 1218 340 1240 353 1231 350 b 1185 304 1205 328 1197 315 z',\n },\n ornamentPrecompSlideTrillBach: {\n x_min: 0,\n x_max: 1048,\n y_min: -367,\n y_max: 331,\n ha: 698,\n o: 'm 1038 477 l 979 477 l 979 238 l 912 160 b 769 327 858 220 775 317 b 724 353 756 343 743 351 b 693 340 713 353 706 350 b 660 304 680 330 670 315 b 539 167 618 259 577 213 b 533 161 536 166 534 163 b 390 327 480 220 396 317 b 346 353 377 343 364 351 l 340 353 b 308 340 330 353 321 350 b 275 304 295 330 285 315 b 117 122 220 243 168 186 b 0 -144 68 62 0 -48 b 1 -168 0 -153 0 -160 b 243 -482 22 -315 96 -422 b 455 -528 337 -521 408 -528 b 511 -526 482 -528 501 -526 b 549 -508 528 -526 549 -517 b 511 -497 549 -503 539 -498 l 500 -497 b 192 -390 429 -494 295 -488 b 68 -177 192 -390 84 -298 b 66 -151 66 -168 66 -160 b 189 105 66 -58 127 35 b 232 143 203 118 216 131 b 264 161 246 154 256 161 b 285 144 271 161 276 156 b 410 10 291 135 397 24 b 439 0 416 3 428 0 b 465 7 449 0 459 3 l 531 72 b 554 92 540 78 547 86 b 611 143 573 109 590 127 b 642 161 625 154 635 161 b 664 144 649 161 655 156 b 789 10 670 135 776 24 b 818 0 795 3 806 0 b 844 7 828 0 838 3 b 904 66 850 12 876 37 b 935 92 916 73 924 84 b 979 134 949 107 963 121 l 979 -88 l 1037 -88 l 1037 151 l 1044 144 b 1168 10 1050 135 1156 24 b 1197 0 1174 3 1185 0 b 1224 7 1208 0 1218 3 b 1489 295 1234 17 1470 274 b 1509 327 1498 305 1509 318 b 1472 353 1509 341 1483 353 b 1446 343 1463 353 1453 348 b 1313 190 1430 330 1329 204 b 1286 176 1302 180 1293 176 b 1263 189 1277 176 1269 183 b 1140 331 1250 202 1153 320 b 1103 353 1126 344 1115 353 b 1071 340 1093 353 1084 350 b 1038 304 1058 328 1050 315 z',\n },\n ornamentPrecompTrillSuffixDandrieu: {\n x_min: 0,\n x_max: 949,\n y_min: 0,\n y_max: 381,\n ha: 381,\n o: 'm 1367 314 b 1250 521 1367 419 1318 482 b 1107 549 1211 537 1145 549 b 1083 546 1096 549 1087 549 b 1066 528 1071 540 1066 534 b 1079 520 1066 524 1070 520 b 1323 351 1187 517 1323 487 b 1201 171 1323 269 1260 219 b 1194 166 1201 171 1198 168 b 1056 327 1142 226 1063 317 b 1011 353 1043 343 1030 351 b 979 340 999 353 992 350 b 946 304 966 330 956 315 b 825 167 904 259 864 213 l 821 161 b 678 327 768 222 685 317 b 634 353 665 343 652 351 b 602 340 622 353 615 350 b 569 304 589 330 579 315 b 448 167 527 259 487 213 l 444 161 b 301 327 390 222 308 317 b 256 353 288 343 275 351 b 225 340 245 353 238 350 b 192 304 212 330 202 315 b 71 167 150 259 109 213 b 17 105 52 147 36 127 b 0 73 10 98 0 84 b 29 58 0 65 7 58 b 86 92 56 59 72 79 b 143 143 105 109 122 127 b 174 161 157 154 167 161 b 196 144 181 161 187 156 b 321 10 202 135 308 24 b 350 0 327 3 338 0 b 376 7 360 0 370 3 b 485 112 384 14 444 73 b 552 161 495 122 539 161 b 573 144 559 161 564 156 b 698 10 579 135 685 24 b 727 0 704 3 716 0 b 753 7 737 0 747 3 b 863 112 762 14 821 73 b 929 161 873 122 916 161 b 950 144 936 161 942 156 b 1076 10 956 135 1063 24 b 1104 0 1081 3 1093 0 b 1130 7 1115 0 1125 3 b 1236 108 1139 14 1195 69 b 1367 314 1297 160 1367 233 z',\n },\n ornamentPrecompDoubleCadenceUpperPrefix: {\n x_min: 0,\n x_max: 1278,\n y_min: 0,\n y_max: 247,\n ha: 247,\n o: 'm 1801 356 b 1776 346 1793 356 1783 351 b 1642 192 1760 333 1659 206 b 1614 177 1630 181 1621 177 b 1591 190 1606 177 1597 184 b 1469 334 1578 203 1482 323 b 1430 356 1453 347 1441 356 b 1398 343 1420 356 1411 353 b 1365 307 1385 331 1377 318 l 1240 164 b 1097 330 1187 226 1104 320 b 1053 356 1084 346 1071 354 b 1021 343 1041 356 1034 353 b 988 307 1008 333 998 318 b 865 168 946 262 904 216 l 861 163 b 717 330 808 223 724 320 b 672 356 704 346 691 354 b 641 343 661 356 654 353 b 608 307 628 333 618 318 b 485 168 566 262 524 216 l 455 134 b 284 46 409 88 351 46 b 16 285 148 46 32 265 b 3 295 9 292 4 295 b 0 291 1 295 0 292 b 1 285 0 288 1 285 b 308 0 42 190 157 0 b 530 120 415 1 482 63 b 559 144 539 128 549 137 b 590 163 573 156 583 163 b 612 145 598 163 603 157 b 739 10 618 137 724 24 b 768 0 744 3 756 0 b 793 7 778 0 788 3 b 903 114 802 14 861 75 l 939 144 b 971 163 953 156 963 163 b 992 145 978 163 984 157 b 1119 10 998 137 1106 24 b 1148 0 1125 3 1136 0 b 1174 7 1158 0 1168 3 b 1284 114 1182 14 1241 75 b 1316 144 1282 115 1312 141 b 1348 161 1331 156 1339 161 b 1371 145 1355 161 1361 157 b 1496 10 1377 137 1485 24 b 1525 0 1502 3 1513 0 b 1552 7 1536 0 1547 3 b 1819 298 1562 17 1800 276 b 1840 330 1829 308 1840 320 b 1832 344 1840 334 1837 340 b 1801 356 1820 351 1810 356 z',\n },\n ornamentPrecompDoubleCadenceUpperPrefixTurn: {\n x_min: 0,\n x_max: 1277,\n y_min: -62,\n y_max: 333,\n ha: 395,\n o: 'm 1273 202 l 1273 480 l 1230 480 l 1230 174 l 1097 328 b 1053 354 1084 344 1071 353 b 1021 341 1041 354 1034 351 b 988 305 1008 331 998 317 b 865 167 945 261 904 215 l 861 161 b 717 328 808 222 724 318 b 672 354 704 344 691 353 b 641 341 661 354 654 351 b 608 305 628 331 618 317 b 485 167 564 261 524 215 b 455 132 474 156 465 144 b 284 45 410 88 350 45 b 14 284 148 45 30 264 b 3 294 9 291 4 294 b 0 289 1 294 0 291 b 1 284 0 287 1 284 b 308 -1 42 189 157 -1 b 530 118 415 0 481 62 b 557 143 539 127 547 135 b 590 161 572 154 582 161 b 612 144 598 161 603 156 b 737 9 618 135 724 24 b 768 -1 743 1 755 -1 b 793 6 778 -1 788 1 b 903 112 802 13 861 73 l 937 143 b 971 161 953 154 963 161 b 992 144 978 161 984 156 b 1117 9 998 135 1104 24 b 1148 -1 1123 1 1136 -1 b 1174 6 1158 -1 1168 1 l 1230 60 l 1230 -89 l 1273 -89 l 1273 102 l 1283 112 b 1348 160 1295 125 1332 160 b 1371 144 1355 160 1361 156 b 1496 9 1377 135 1483 24 b 1525 -1 1502 1 1513 -1 b 1552 6 1536 -1 1547 1 b 1819 297 1562 16 1800 275 b 1839 328 1827 307 1839 320 b 1801 354 1839 343 1813 354 b 1776 344 1793 354 1783 350 b 1642 190 1760 331 1657 206 b 1614 176 1630 180 1621 176 b 1591 189 1606 176 1597 183 b 1467 333 1578 203 1480 321 b 1430 354 1453 346 1441 354 b 1398 341 1420 354 1411 351 b 1365 305 1385 330 1377 317 z',\n },\n ornamentPrecompTrillLowerSuffix: {\n x_min: 0,\n x_max: 859,\n y_min: -222,\n y_max: 246,\n ha: 468,\n o: 'm 1164 217 b 1031 351 1138 259 1063 351 b 1011 337 1020 351 1024 347 b 828 167 952 291 886 217 l 824 164 b 683 328 772 225 690 318 b 638 354 670 344 657 353 b 606 341 626 354 619 351 b 573 305 593 331 583 317 b 451 167 530 261 490 215 l 446 161 b 302 328 393 222 310 318 b 258 354 289 344 276 353 b 226 341 246 354 239 351 b 193 305 213 331 203 317 b 71 167 150 261 109 215 b 17 105 52 147 36 127 b 0 73 10 98 0 84 b 29 58 0 65 7 58 b 86 92 56 59 72 79 b 143 143 105 109 122 127 b 176 161 157 154 168 161 b 197 144 183 161 189 156 b 323 9 203 135 310 23 b 353 -1 328 1 340 -1 b 379 6 363 -1 373 1 b 488 112 387 13 446 73 l 523 143 b 556 161 539 154 549 161 b 577 144 563 161 569 156 b 703 9 583 135 690 23 b 733 -1 708 1 721 -1 b 759 6 743 -1 753 1 b 868 112 768 13 827 73 b 955 183 878 122 943 183 b 1081 107 965 183 1031 153 b 1156 -89 1128 63 1156 6 l 1156 -102 b 948 -297 1156 -204 1048 -297 b 806 -271 904 -297 850 -282 l 792 -266 b 801 -288 792 -268 795 -282 b 948 -320 809 -297 880 -320 b 1237 -50 1092 -320 1237 -199 b 1164 217 1237 75 1218 122 z',\n },\n brassScoop: {\n x_min: 1,\n x_max: 320,\n y_min: -373,\n y_max: 13,\n ha: 386,\n o: 'm 35 -537 b 461 -12 194 -518 461 -289 b 438 19 461 13 451 19 b 410 -9 425 19 413 9 b 35 -425 357 -366 92 -403 b 1 -482 13 -433 1 -438 l 1 -505 b 26 -537 1 -526 3 -537 z',\n },\n brassDoitMedium: {\n x_min: 0,\n x_max: 489,\n y_min: -40,\n y_max: 346,\n ha: 386,\n o: 'm 33 -58 b 704 468 255 -58 683 186 b 681 498 704 494 693 498 b 654 471 668 498 658 488 b 33 55 550 118 91 76 b 0 -3 12 46 0 42 l 0 -26 b 24 -58 0 -46 1 -58 z',\n },\n brassFallLipShort: {\n x_min: 1,\n x_max: 293,\n y_min: -345,\n y_max: 42,\n ha: 387,\n o: 'm 22 60 b 1 35 4 60 1 52 l 1 6 b 26 -50 3 -40 10 -43 b 32 -52 27 -50 30 -50 b 376 -469 85 -73 327 -111 b 400 -497 379 -487 387 -497 b 422 -467 412 -497 422 -491 b 32 60 422 -187 177 40 z',\n },\n brassLiftMedium: {\n x_min: 0,\n x_max: 811,\n y_min: 0,\n y_max: 852,\n ha: 852,\n o: 'm 1138 1220 b 1135 1225 1135 1223 1135 1224 b 1129 1227 1133 1227 1130 1227 b 1117 1207 1122 1227 1117 1212 l 1117 1201 b 1109 1164 1117 1187 1117 1172 b 1100 1156 1107 1161 1104 1158 b 959 1104 1058 1128 995 1140 b 929 1032 936 1081 929 1056 b 932 1007 929 1024 930 1015 b 923 976 932 995 930 985 l 914 971 b 773 919 873 942 809 955 b 743 847 750 896 743 870 b 746 821 743 838 744 829 b 737 791 746 809 744 799 l 729 783 b 588 733 687 756 624 769 b 557 661 564 710 557 684 b 560 635 557 652 559 644 b 552 605 560 624 559 612 l 543 598 b 402 547 501 570 438 583 b 372 475 379 524 372 498 b 374 449 372 467 373 458 b 366 419 374 438 373 426 l 357 412 b 216 361 315 384 252 397 b 186 289 193 338 186 312 b 189 264 186 281 187 272 b 180 233 189 252 187 240 b 171 226 177 232 174 229 b 30 176 130 199 66 212 b 0 104 7 153 0 128 b 33 0 0 88 14 0 b 49 17 40 0 49 10 b 71 63 52 35 56 49 b 212 115 102 95 154 59 b 239 186 230 134 239 160 b 236 210 239 194 238 202 b 256 249 239 225 243 236 b 397 301 288 281 340 245 b 425 372 416 320 425 346 b 422 396 425 380 423 387 b 442 435 425 410 429 422 b 583 487 474 467 526 431 b 611 557 602 505 611 531 b 608 582 611 566 609 573 b 628 621 611 596 615 608 b 769 672 660 652 711 618 b 796 743 788 691 796 717 b 793 768 796 752 795 759 b 814 806 796 782 801 793 b 955 858 845 838 897 804 b 982 929 973 877 982 903 b 979 953 982 937 981 945 b 999 992 982 968 986 979 b 1140 1045 1031 1024 1083 989 b 1168 1116 1161 1066 1168 1090 b 1138 1220 1168 1162 1145 1207 z',\n },\n brassFallRoughMedium: {\n x_min: 0,\n x_max: 811,\n y_min: 0,\n y_max: 852,\n ha: 852,\n o: 'm 30 1220 b 0 1116 23 1207 0 1162 b 27 1045 0 1090 7 1066 b 168 992 85 989 137 1024 b 189 953 181 979 186 968 b 186 929 187 945 186 937 b 213 858 186 903 194 877 b 354 806 271 804 323 838 b 374 768 367 793 372 782 b 372 743 373 759 372 752 b 399 672 372 717 380 691 b 540 621 456 618 508 652 b 560 582 553 608 557 596 b 557 557 559 573 557 566 b 585 487 557 531 566 505 b 726 435 642 431 694 467 b 746 396 739 422 743 410 b 743 372 744 387 743 380 b 770 301 743 346 752 320 b 912 249 828 245 880 281 b 932 210 924 236 929 225 b 929 186 930 202 929 194 b 956 115 929 160 937 134 b 1097 63 1014 59 1066 95 b 1119 17 1112 49 1116 35 b 1135 0 1119 10 1128 0 b 1168 104 1153 0 1168 91 b 1138 176 1168 128 1161 153 b 996 226 1102 212 1038 199 b 988 233 994 229 991 232 b 979 264 981 240 979 252 b 982 289 981 272 982 281 b 952 361 982 312 975 338 b 811 412 916 397 852 384 l 802 419 b 793 449 795 426 793 438 b 796 475 795 458 796 467 b 766 547 796 498 789 524 b 625 598 730 583 667 570 l 616 605 b 608 635 609 612 608 624 b 611 661 609 644 611 652 b 580 733 611 684 603 710 b 439 783 544 769 481 756 l 431 791 b 422 821 423 799 422 809 b 425 847 423 829 425 838 b 395 919 425 870 418 896 b 253 971 359 955 295 942 l 245 976 b 236 1007 238 985 236 995 b 239 1032 238 1015 239 1024 b 209 1104 239 1056 232 1081 b 68 1156 173 1140 109 1128 b 59 1164 63 1158 60 1161 b 50 1201 50 1172 50 1187 l 50 1207 b 39 1227 50 1212 46 1227 b 33 1225 37 1227 35 1227 b 30 1220 33 1224 33 1223 z',\n },\n brassBend: {\n x_min: 0,\n x_max: 392,\n y_min: 0,\n y_max: 282,\n ha: 282,\n o: 'm 282 0 b 552 72 369 0 456 23 b 564 92 560 75 564 84 l 564 383 b 541 406 564 395 554 406 b 518 383 528 406 518 395 l 518 107 b 282 46 435 65 357 46 b 46 107 207 46 130 65 l 46 383 b 23 406 46 395 36 406 b 0 383 10 406 0 395 l 0 92 b 13 72 0 84 4 75 b 282 0 108 23 196 0 z',\n },\n brassMuteClosed: {\n x_min: 0,\n x_max: 272,\n y_min: 0,\n y_max: 272,\n ha: 272,\n o: 'm 392 219 l 219 219 l 219 392 l 173 392 l 173 219 l 0 219 l 0 173 l 173 173 l 173 0 l 219 0 l 219 173 l 392 173 z',\n },\n brassMuteOpen: {\n x_min: 0,\n x_max: 304,\n y_min: 0,\n y_max: 304,\n ha: 304,\n o: 'm 219 0 b 438 219 340 0 438 98 b 219 438 438 340 340 438 b 0 219 98 438 0 340 b 219 0 0 98 98 0 z m 219 392 b 392 219 314 392 392 314 b 219 46 392 124 314 46 b 46 219 124 46 46 124 b 219 392 46 314 124 392 z',\n },\n brassFlip: {\n x_min: 0,\n x_max: 379,\n y_min: 0,\n y_max: 282,\n ha: 282,\n o: 'm 523 0 b 541 9 530 0 536 3 b 546 22 544 13 546 17 b 536 42 546 29 541 36 l 36 402 b 23 406 33 405 27 406 b 0 383 12 406 0 395 l 0 23 b 23 0 0 10 10 0 b 46 23 36 0 46 10 l 46 337 l 508 4 b 523 0 513 1 517 0 z',\n },\n brassJazzTurn: {\n x_min: 0,\n x_max: 620,\n y_min: 0,\n y_max: 245,\n ha: 245,\n o: 'm 792 190 b 765 176 780 179 772 176 b 740 190 755 176 747 183 b 629 325 727 202 644 312 b 593 347 616 338 605 347 b 562 334 583 346 575 344 b 528 298 549 323 539 310 l 406 176 b 389 168 406 176 399 168 b 374 176 384 168 379 170 b 245 325 360 192 245 325 b 200 353 232 343 219 351 b 168 340 190 353 181 350 l 17 156 b 0 121 10 147 0 132 b 16 107 0 114 4 108 b 84 143 26 107 76 137 b 118 160 92 150 108 160 b 141 143 125 160 131 154 b 265 10 147 135 253 24 b 294 0 271 3 282 0 b 321 7 305 0 315 3 b 498 160 321 7 478 158 b 521 143 505 160 513 154 b 647 10 528 135 635 24 b 675 0 652 3 664 0 b 703 7 687 0 697 3 b 874 186 713 16 855 164 b 893 220 881 196 893 212 b 873 245 890 235 883 243 b 796 194 847 245 815 213 z',\n },\n brassSmear: {\n x_min: 1,\n x_max: 306,\n y_min: 0,\n y_max: 170,\n ha: 170,\n o: 'm 193 79 b 308 0 219 50 264 0 b 439 117 396 0 438 102 b 439 120 439 118 439 118 l 441 125 b 441 128 441 127 441 127 b 433 141 441 135 439 141 b 416 130 429 141 423 137 b 343 94 390 107 370 94 b 269 153 315 94 294 121 l 265 158 b 144 245 239 190 180 245 b 6 134 62 245 10 143 b 1 114 3 125 1 118 b 7 107 1 108 4 107 b 36 122 13 107 22 112 b 92 151 55 137 65 151 b 183 89 125 151 161 112 b 189 84 184 88 187 86 z',\n },\n stringsDownBow: {\n x_min: 0,\n x_max: 312,\n y_min: 0,\n y_max: 318,\n ha: 318,\n o: 'm 37 458 b 0 420 17 458 0 441 l 0 17 b 17 0 0 7 9 0 l 37 0 b 55 17 46 0 55 7 l 55 253 b 225 278 55 269 140 278 b 395 253 310 278 395 269 l 395 17 b 413 0 395 7 403 0 l 432 0 b 449 17 441 0 449 7 l 449 420 b 412 458 449 441 432 458 z',\n },\n stringsUpBow: {\n x_min: 1,\n x_max: 249,\n y_min: 1,\n y_max: 495,\n ha: 494,\n o: 'm 181 1 b 206 22 193 1 203 10 l 359 683 l 359 688 b 338 713 359 700 351 710 l 333 713 b 308 694 321 713 311 706 l 180 140 l 53 694 b 27 713 49 706 39 713 l 22 713 b 1 690 10 710 1 700 b 3 683 1 687 1 685 l 154 22 b 181 1 157 10 167 1 z',\n },\n stringsHarmonic: {\n x_min: 0,\n x_max: 200,\n y_min: 0,\n y_max: 200,\n ha: 200,\n o: 'm 288 144 b 144 288 288 225 223 288 b 0 144 65 288 0 225 b 144 0 0 65 65 0 b 288 144 223 0 288 65 z m 144 249 b 249 144 203 249 249 203 b 144 39 249 86 203 39 b 39 144 86 39 39 86 b 144 249 39 203 86 249 z',\n },\n pluckedSnapPizzicatoAbove: {\n x_min: 0,\n x_max: 200,\n y_min: 0,\n y_max: 300,\n ha: 300,\n o: 'm 0 144 b 144 0 0 63 65 0 b 288 144 223 0 288 63 b 167 285 288 215 235 275 l 167 432 l 121 432 l 121 285 b 0 144 52 275 0 215 z m 121 246 l 121 144 l 167 144 l 167 246 b 249 144 213 236 249 193 b 144 39 249 85 202 39 b 39 144 85 39 39 85 b 121 246 39 193 73 236 z',\n },\n pluckedSnapPizzicatoBelow: {\n x_min: 0,\n x_max: 200,\n y_min: 0,\n y_max: 300,\n ha: 300,\n o: 'm 288 288 b 144 432 288 369 223 432 b 0 288 65 432 0 369 b 121 145 0 216 52 157 l 121 0 l 167 0 l 167 145 b 288 288 235 157 288 216 z m 167 186 l 167 288 l 121 288 l 121 186 b 39 288 75 196 39 238 b 144 393 39 347 86 393 b 249 288 203 393 249 347 b 167 186 249 238 215 196 z',\n },\n pluckedLeftHandPizzicato: {\n x_min: 0,\n x_max: 272,\n y_min: 0,\n y_max: 272,\n ha: 272,\n o: 'm 392 219 l 219 219 l 219 392 l 173 392 l 173 219 l 0 219 l 0 173 l 173 173 l 173 0 l 219 0 l 219 173 l 392 173 z',\n },\n keyboardPedalPed: {\n x_min: 0,\n x_max: 1019,\n y_min: -8,\n y_max: 555,\n ha: 563,\n o: 'm 413 799 b 179 749 327 798 261 789 b 0 517 107 713 0 632 b 122 376 0 454 37 376 b 240 540 189 376 240 452 b 225 586 240 579 233 586 b 204 549 213 586 212 573 b 138 480 199 527 181 480 b 85 549 96 480 85 517 l 85 554 b 353 762 89 690 230 762 b 373 752 364 762 373 760 b 351 708 373 740 360 723 b 274 546 330 675 274 585 b 353 416 274 508 333 444 b 412 304 372 390 412 351 b 382 228 412 275 403 256 b 334 190 363 202 361 200 b 147 29 271 167 147 88 b 196 -12 147 4 171 -12 b 343 108 239 -12 279 33 l 363 132 b 387 150 370 141 376 150 b 543 -4 445 150 467 -4 b 631 42 567 -4 586 0 l 668 78 b 685 89 674 84 680 89 b 696 75 688 89 690 86 b 809 -9 717 29 753 -9 b 946 66 854 -9 894 13 b 988 107 971 92 981 107 b 1002 89 994 107 996 99 b 1152 -4 1030 36 1077 -4 b 1329 248 1238 -4 1329 82 b 792 717 1329 556 1047 665 b 766 720 785 719 775 720 b 747 703 752 720 747 711 b 780 680 747 693 756 685 b 1223 222 1028 621 1223 504 b 1152 39 1223 122 1205 39 b 1073 229 1104 39 1073 132 b 1132 423 1073 314 1086 377 b 1142 442 1140 432 1142 436 b 1126 458 1142 451 1136 458 b 1093 446 1119 458 1109 455 b 975 216 1022 408 975 337 l 975 190 b 943 121 975 160 972 150 b 852 69 899 76 877 69 b 776 148 816 69 786 117 b 773 163 775 154 773 158 b 786 177 773 167 776 170 l 801 187 b 937 366 867 235 937 284 b 844 454 937 422 900 454 b 665 217 711 454 665 331 b 671 153 665 197 667 176 l 671 147 b 662 134 671 143 670 140 b 605 111 639 118 625 111 b 521 160 572 111 546 135 b 451 203 497 184 474 197 b 426 212 435 207 426 206 b 436 230 426 216 429 220 b 510 389 464 269 510 340 b 429 521 510 435 480 462 b 369 629 387 570 369 599 b 402 720 369 648 384 691 b 462 763 425 759 446 763 b 611 624 540 763 611 704 b 564 575 611 592 590 575 b 501 602 540 575 520 582 b 474 622 492 611 487 622 b 459 603 465 622 459 615 b 603 471 459 570 510 471 b 711 588 670 471 711 524 b 422 799 711 742 554 799 z m 815 403 b 848 343 838 403 848 383 b 780 226 848 295 824 261 b 765 217 773 220 768 217 b 759 228 762 217 759 220 b 756 282 757 245 756 262 b 815 403 756 346 772 403 z m 1405 124 b 1344 62 1369 124 1344 98 b 1405 0 1344 26 1369 0 b 1467 62 1441 0 1467 26 b 1405 124 1467 98 1441 124 z',\n },\n keyboardPedalUp: {\n x_min: 0,\n x_max: 450,\n y_min: 0,\n y_max: 450,\n ha: 450,\n o: 'm 582 396 b 516 367 554 396 533 384 b 465 340 495 347 487 340 l 458 340 b 412 377 432 340 412 348 b 432 409 412 387 419 396 l 438 415 b 490 429 451 428 464 429 b 575 501 534 429 575 452 b 501 575 575 541 541 575 b 429 490 452 575 429 534 b 415 438 429 464 428 451 l 409 432 b 377 412 396 419 387 412 b 340 458 348 412 340 432 l 340 465 b 367 516 340 487 347 495 b 396 582 384 533 396 554 b 324 648 396 625 363 648 b 252 582 285 648 252 625 b 281 516 252 554 264 533 b 308 465 301 495 308 487 l 308 458 b 271 412 308 432 300 412 b 239 432 261 412 252 419 l 233 438 b 219 490 220 451 219 464 b 147 575 219 534 196 575 b 73 501 107 575 73 541 b 158 429 73 452 114 429 b 210 415 184 429 197 428 l 216 409 b 236 377 229 396 236 387 b 190 340 236 348 216 340 l 183 340 b 132 367 161 340 153 347 b 66 396 115 384 94 396 b 0 324 23 396 0 363 b 66 252 0 285 23 252 b 132 281 94 252 115 264 b 183 308 153 301 161 308 l 190 308 b 236 271 216 308 236 300 b 216 239 236 261 229 252 l 210 233 b 158 219 197 220 184 219 b 73 147 114 219 73 196 b 147 73 73 107 107 73 b 219 158 196 73 219 114 b 233 210 219 184 220 197 l 239 216 b 271 236 252 229 261 236 b 308 190 300 236 308 216 l 308 183 b 281 132 308 161 301 153 b 252 66 264 115 252 94 b 324 0 252 23 285 0 b 396 66 363 0 396 23 b 367 132 396 94 384 115 b 340 183 347 153 340 161 l 340 190 b 377 236 340 216 348 236 b 409 216 387 236 396 229 l 415 210 b 429 158 428 197 429 184 b 501 73 429 114 452 73 b 575 147 541 73 575 107 b 490 219 575 196 534 219 b 438 233 464 219 451 220 l 432 239 b 412 271 419 252 412 261 b 458 308 412 300 432 308 l 465 308 b 516 281 487 308 495 301 b 582 252 533 264 554 252 b 648 324 625 252 648 285 b 582 396 648 363 625 396 z m 324 271 b 271 324 291 271 271 291 b 324 377 271 357 291 377 b 377 324 357 377 377 357 b 324 271 377 291 357 271 z',\n },\n pictChokeCymbal: {\n x_min: 1,\n x_max: 152,\n y_min: 2,\n y_max: 251,\n ha: 249,\n o: 'm 104 361 b 1 271 42 361 1 321 b 82 190 1 222 35 190 b 122 160 118 190 122 160 b 125 144 124 154 125 150 b 102 88 125 124 115 105 b 37 32 78 56 40 35 b 26 17 32 29 26 26 l 27 16 b 37 3 29 6 33 3 b 181 102 85 3 158 66 b 219 239 210 147 219 197 l 219 249 b 104 361 219 317 170 361 z',\n },\n wiggleArpeggiatoUp: {\n x_min: -33,\n x_max: 292,\n y_min: 0,\n y_max: 119,\n ha: 119,\n o: 'm 130 171 b -39 68 16 171 -14 91 b -48 53 -45 62 -48 58 b -29 42 -48 46 -39 42 b -10 46 -23 42 -16 43 b 56 63 12 56 29 63 b 248 0 121 63 135 0 b 419 127 361 0 410 104 b 420 132 420 130 420 131 b 412 140 420 137 416 140 b 386 130 403 140 392 134 b 334 107 367 117 353 107 b 318 108 330 107 324 107 b 240 138 289 112 265 128 b 130 171 209 153 168 171 z',\n },\n arrowheadBlackUp: {\n x_min: 0,\n x_max: 228,\n y_min: 0,\n y_max: 299,\n ha: 299,\n o: 'm 166 431 b 0 20 111 274 0 30 b 16 0 0 12 6 0 l 17 1 b 166 50 43 16 160 50 b 310 1 171 50 289 13 l 311 0 b 328 20 321 0 328 12 b 166 431 328 30 220 274 z',\n },\n arrowheadBlackDown: {\n x_min: 0,\n x_max: 228,\n y_min: 0,\n y_max: 299,\n ha: 299,\n o: 'm 166 0 b 328 410 220 157 328 400 b 311 431 328 419 321 431 l 310 429 b 166 380 289 418 171 380 b 17 429 160 380 43 415 l 16 431 b 0 410 6 431 0 419 b 166 0 0 400 111 157 z',\n },\n arpeggiatoUp: {\n x_min: 1,\n x_max: 229,\n y_min: 7,\n y_max: 1511,\n ha: 1504,\n o: 'm 219 1848 l 330 1848 l 164 2176 l 1 1848 l 121 1848 b 92 1778 115 1822 101 1800 l 89 1773 b 59 1668 75 1741 59 1702 b 96 1555 59 1614 76 1580 b 99 1551 98 1554 99 1551 l 102 1547 b 124 1496 115 1531 124 1515 b 122 1482 124 1492 124 1488 b 92 1404 118 1453 102 1428 b 59 1293 78 1372 59 1332 b 105 1172 59 1234 81 1198 b 124 1120 118 1155 124 1143 l 122 1113 b 122 1110 122 1113 122 1112 b 92 1032 118 1081 102 1057 b 59 922 78 1001 59 960 b 115 792 59 855 86 816 b 124 760 121 782 124 773 b 122 744 124 756 124 750 b 92 667 118 716 102 693 b 59 556 78 635 59 595 b 108 433 59 495 82 458 b 124 389 117 420 124 408 b 122 374 124 384 124 379 b 92 298 118 346 102 323 l 89 292 b 59 186 75 261 59 222 b 163 19 59 73 140 42 b 177 10 168 13 173 10 b 189 29 184 10 189 19 b 184 48 189 35 187 42 b 167 114 174 69 167 85 b 230 305 167 179 229 193 b 181 423 230 357 209 396 b 167 484 173 442 167 458 b 230 675 167 547 229 563 b 179 796 230 729 206 769 b 167 850 171 812 167 827 b 230 1040 167 913 229 929 b 183 1158 230 1092 209 1130 b 167 1220 173 1178 167 1194 b 230 1411 167 1284 229 1300 b 186 1526 230 1462 210 1499 b 167 1594 176 1529 167 1584 b 230 1786 167 1659 229 1673 b 219 1848 230 1809 226 1829 z',\n },\n arpeggiatoDown: {\n x_min: 1,\n x_max: 229,\n y_min: -4,\n y_max: 1500,\n ha: 1504,\n o: 'm 219 323 b 230 384 226 341 230 361 b 167 576 229 497 167 511 b 186 644 167 586 176 641 b 230 759 210 671 230 708 b 167 950 229 870 167 886 b 183 1012 167 976 173 992 b 230 1130 209 1040 230 1079 b 167 1320 229 1241 167 1257 b 179 1374 167 1344 171 1358 b 230 1495 206 1401 230 1441 b 167 1686 229 1607 167 1623 b 181 1747 167 1712 173 1728 b 230 1865 209 1774 230 1813 b 167 2056 229 1977 167 1992 b 184 2123 167 2085 174 2101 b 189 2141 187 2128 189 2136 b 177 2160 189 2151 184 2160 b 163 2151 173 2160 168 2157 b 59 1984 140 2128 59 2097 b 89 1878 59 1948 75 1909 l 92 1872 b 122 1796 102 1848 118 1824 b 124 1781 124 1791 124 1786 b 108 1737 124 1763 117 1750 b 59 1614 82 1712 59 1675 b 92 1503 59 1575 78 1535 b 122 1426 102 1477 118 1454 b 124 1410 124 1420 124 1414 b 115 1378 124 1397 121 1388 b 59 1248 86 1354 59 1315 b 92 1138 59 1210 78 1169 b 122 1060 102 1113 118 1089 b 122 1057 122 1058 122 1058 l 124 1050 b 105 998 124 1027 118 1015 b 59 877 81 972 59 936 b 92 766 59 838 78 798 b 122 688 102 742 118 717 b 124 674 124 683 124 678 b 102 624 124 655 115 639 l 99 619 b 96 615 99 619 98 616 b 59 503 76 590 59 556 b 89 397 59 468 75 429 l 92 392 b 121 323 101 370 115 348 l 1 323 l 164 -6 l 330 323 z',\n },\n repeat1Bar: {\n x_min: 0,\n x_max: 532,\n y_min: -250,\n y_max: 279,\n ha: 529,\n o: 'm 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z m 89 288 b 0 197 40 288 0 248 b 89 108 0 148 40 108 b 180 197 140 108 180 148 b 89 288 180 248 140 288 z m 675 -71 b 586 -161 626 -71 586 -111 b 675 -251 586 -210 626 -251 b 766 -161 726 -251 766 -210 b 675 -71 766 -111 726 -71 z',\n },\n repeat2Bars: {\n x_min: 0,\n x_max: 762,\n y_min: -250,\n y_max: 279,\n ha: 529,\n o: 'm 1090 380 b 1097 395 1094 386 1097 390 b 1089 402 1097 399 1094 402 l 936 402 b 910 380 927 402 920 393 l 336 -340 b 331 -350 333 -343 331 -347 b 343 -360 331 -356 336 -360 l 485 -360 b 516 -340 498 -360 508 -348 z m 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z m 89 288 b 0 197 40 288 0 248 b 89 108 0 148 40 108 b 180 197 140 108 180 148 b 89 288 180 248 140 288 z m 1007 -71 b 917 -161 958 -71 917 -111 b 1007 -251 917 -210 958 -251 b 1097 -161 1057 -251 1097 -210 b 1007 -71 1097 -111 1057 -71 z',\n },\n repeat4Bars: {\n x_min: 0,\n x_max: 1232,\n y_min: -250,\n y_max: 279,\n ha: 529,\n o: 'm 1767 380 b 1774 395 1771 386 1774 390 b 1765 402 1774 399 1771 402 l 1613 402 b 1587 380 1604 402 1597 393 l 1012 -340 b 1008 -350 1009 -343 1008 -347 b 1020 -360 1008 -356 1012 -360 l 1162 -360 b 1192 -340 1175 -360 1185 -348 z m 1436 380 b 1443 395 1440 386 1443 390 b 1434 402 1443 399 1440 402 l 1282 402 b 1256 380 1273 402 1266 393 l 681 -340 b 677 -350 678 -343 677 -347 b 688 -360 677 -356 681 -360 l 831 -360 b 861 -340 844 -360 854 -348 z m 1090 380 b 1097 395 1094 386 1097 390 b 1089 402 1097 399 1094 402 l 936 402 b 910 380 927 402 920 393 l 336 -340 b 331 -350 333 -343 331 -347 b 343 -360 331 -356 336 -360 l 485 -360 b 516 -340 498 -360 508 -348 z m 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z m 89 288 b 0 197 40 288 0 248 b 89 108 0 148 40 108 b 180 197 140 108 180 148 b 89 288 180 248 140 288 z m 1683 -71 b 1594 -161 1634 -71 1594 -111 b 1683 -251 1594 -210 1634 -251 b 1774 -161 1734 -251 1774 -210 b 1683 -71 1774 -111 1734 -71 z',\n },\n repeatBarSlash: {\n x_min: 0,\n x_max: 532,\n y_min: -250,\n y_max: 279,\n ha: 529,\n o: 'm 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z',\n },\n csymDiminished: {\n x_min: 0,\n x_max: 473,\n y_min: 0,\n y_max: 473,\n ha: 473,\n o: 'm 341 681 b 0 341 153 681 0 530 b 341 0 0 153 153 0 b 681 341 530 0 681 153 b 341 681 681 530 530 681 z m 341 618 b 618 341 495 618 618 495 b 341 63 618 189 494 63 b 63 341 187 63 63 187 b 341 618 63 494 189 618 z',\n },\n csymHalfDiminished: {\n x_min: -16,\n x_max: 488,\n y_min: -15,\n y_max: 489,\n ha: 504,\n o: 'm 703 660 l 658 704 l 557 603 b 340 681 498 652 422 681 b -1 341 151 681 -1 530 b 78 124 -1 259 29 183 l -23 23 l 22 -22 l 122 79 b 340 0 181 30 258 0 b 680 341 528 0 680 153 b 602 559 680 423 651 500 z m 62 341 b 340 618 62 494 187 618 b 513 559 403 618 464 598 l 122 168 b 62 341 84 217 62 278 z m 616 341 b 340 63 616 189 492 63 b 167 124 276 63 216 85 l 557 514 b 616 341 596 465 616 405 z',\n },\n csymAugmented: {\n x_min: 0,\n x_max: 395,\n y_min: 1,\n y_max: 396,\n ha: 395,\n o: 'm 569 318 l 317 318 l 317 570 l 253 570 l 253 318 l 0 318 l 0 255 l 253 255 l 253 1 l 317 1 l 317 255 l 569 255 z',\n },\n csymMajorSeventh: {\n x_min: 0,\n x_max: 558,\n y_min: 1,\n y_max: 477,\n ha: 476,\n o: 'm 402 687 l 0 1 l 804 1 z m 402 562 l 693 65 l 111 65 z',\n },\n csymMinor: {\n x_min: 0,\n x_max: 325,\n y_min: 216,\n y_max: 260,\n ha: 44,\n o: 'm 468 374 l 0 374 l 0 311 l 468 311 z',\n },\n csymParensLeftTall: {\n x_min: 1,\n x_max: 185,\n y_min: 0,\n y_max: 997,\n ha: 997,\n o: 'm 266 48 b 261 65 266 55 264 62 b 92 719 157 212 92 400 b 262 1371 92 1037 154 1228 b 266 1394 266 1378 266 1394 l 266 1424 b 264 1436 266 1431 266 1436 b 259 1434 262 1436 259 1434 b 1 719 84 1261 1 1011 b 259 1 1 429 79 177 b 264 0 261 0 262 0 b 266 9 265 0 266 6 z',\n },\n csymParensRightTall: {\n x_min: -20,\n x_max: 164,\n y_min: 0,\n y_max: 997,\n ha: 997,\n o: 'm -29 9 b -26 0 -29 6 -27 0 b -22 1 -24 0 -23 0 b 236 719 158 177 236 429 b -22 1434 236 1011 154 1261 b -26 1436 -22 1434 -24 1436 b -29 1424 -29 1436 -29 1431 l -29 1394 b -24 1371 -29 1394 -29 1378 b 145 719 84 1228 145 1037 b -23 65 145 400 81 212 b -29 48 -26 62 -29 55 z',\n },\n csymBracketLeftTall: {\n x_min: 0,\n x_max: 155,\n y_min: 0,\n y_max: 1000,\n ha: 1000,\n o: 'm 217 0 b 223 9 220 0 223 4 l 223 37 b 217 46 223 42 220 46 l 92 46 l 92 1394 l 217 1394 b 223 1403 220 1394 223 1398 l 223 1431 b 217 1440 223 1436 220 1440 l 6 1440 b 0 1436 3 1440 0 1439 l 0 4 b 6 0 0 1 3 0 z',\n },\n csymBracketRightTall: {\n x_min: 1,\n x_max: 156,\n y_min: 0,\n y_max: 1000,\n ha: 1000,\n o: 'm 219 0 b 225 4 222 0 225 1 l 225 1436 b 219 1440 225 1439 222 1440 l 7 1440 b 1 1431 4 1440 1 1436 l 1 1403 b 7 1394 1 1398 4 1394 l 132 1394 l 132 46 l 7 46 b 1 37 4 46 1 42 l 1 9 b 7 0 1 4 4 0 z',\n },\n csymParensLeftVeryTall: {\n x_min: 0,\n x_max: 122,\n y_min: 0,\n y_max: 993,\n ha: 993,\n o: 'm 176 32 b 171 49 176 39 174 46 b 60 716 104 194 60 399 b 173 1382 60 1032 101 1241 b 176 1405 176 1390 176 1405 l 176 1427 b 173 1430 176 1428 174 1430 b 0 716 40 1297 0 978 b 170 3 0 428 50 179 b 171 0 170 1 170 0 b 176 6 173 0 176 4 z',\n },\n csymParensRightVeryTall: {\n x_min: -15,\n x_max: 107,\n y_min: 0,\n y_max: 993,\n ha: 993,\n o: 'm -22 6 b -17 0 -22 4 -19 0 b -16 3 -16 0 -16 1 b 154 716 104 179 154 428 b -19 1430 154 978 114 1297 b -22 1427 -20 1430 -22 1428 l -22 1405 b -19 1382 -22 1405 -22 1390 b 94 716 53 1241 94 1032 b -17 49 94 399 50 194 b -22 32 -20 46 -22 39 z',\n },\n csymDiagonalArrangementSlash: {\n x_min: 0,\n x_max: 999,\n y_min: 0,\n y_max: 1000,\n ha: 1000,\n o: 'm 1439 1380 l 1377 1440 l 0 60 l 62 0 z',\n },\n accSagittal5v7KleismaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -35 b 135 -112 68 -86 99 -112 b 225 68 194 -112 225 -53 l 180 68 b 144 -4 180 20 168 -4 b 122 0 138 -4 131 -3 b 23 248 86 14 52 96 l 0 248 z',\n },\n accSagittal5v7KleismaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 b 122 0 52 -96 86 -14 b 144 4 131 3 138 4 b 180 -68 168 4 180 -20 l 225 -68 b 135 112 225 53 194 112 b 45 35 99 112 68 86 l 45 517 l 0 517 z',\n },\n accSagittal5CommaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 225 -517 l 225 248 l 203 248 l 0 -112 l 0 -284 l 180 33 l 180 -517 z',\n },\n accSagittal5CommaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 180 517 l 180 -33 l 0 284 l 0 112 l 203 -248 l 225 -248 l 225 517 z',\n },\n accSagittal7CommaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 248 l 0 -517 l 45 -517 l 45 112 l 89 112 b 180 -68 150 112 180 53 l 180 -248 l 225 -248 l 225 68 b 135 248 225 187 194 248 z',\n },\n accSagittal7CommaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 135 -248 b 225 -68 194 -248 225 -187 l 225 248 l 180 248 l 180 68 b 89 -112 180 -53 150 -112 l 45 -112 l 45 517 l 0 517 l 0 -248 z',\n },\n accSagittal25SmallDiesisUp: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -157 l 0 -259 l 315 -89 l 315 -517 l 360 -517 l 360 248 l 337 248 l 0 68 l 0 -33 l 315 135 l 315 10 z',\n },\n accSagittal25SmallDiesisDown: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 315 -10 l 315 -135 l 0 33 l 0 -68 l 337 -248 l 360 -248 l 360 517 l 315 517 l 315 89 l 0 259 l 0 157 z',\n },\n accSagittal35MediumDiesisUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -284 l 180 33 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -68 330 112 360 53 l 360 -248 l 405 -248 l 405 68 b 315 248 405 187 374 248 l 203 248 l 0 -112 z',\n },\n accSagittal35MediumDiesisDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 203 -248 l 315 -248 b 405 -68 374 -248 405 -187 l 405 248 l 360 248 l 360 68 b 271 -112 360 -53 330 -112 l 225 -112 l 225 517 l 180 517 l 180 -33 l 0 284 z',\n },\n accSagittal11MediumDiesisUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 225 53 l 225 -517 l 271 -517 l 271 53 l 495 -248 l 495 -89 l 248 248 l 0 -89 l 0 -248 z',\n },\n accSagittal11MediumDiesisDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 248 l 0 89 l 248 -248 l 495 89 l 495 248 l 271 -53 l 271 517 l 225 517 l 225 -53 z',\n },\n accSagittal11LargeDiesisUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 112 l 315 112 b 449 -68 405 112 449 53 l 449 -248 l 495 -248 l 495 68 b 360 248 495 187 449 248 l 135 248 b 0 68 45 248 0 187 z',\n },\n accSagittal11LargeDiesisDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 360 -248 b 495 -68 449 -248 495 -187 l 495 248 l 449 248 l 449 68 b 315 -112 449 -53 405 -112 l 271 -112 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittal35LargeDiesisUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 248 -248 l 540 112 l 540 274 l 271 -58 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittal35LargeDiesisDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 248 -248 l 540 112 l 540 274 l 269 -58 l 269 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittalSharp25SDown: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 112 -112 0 -53 36 -112 l 135 -112 l 135 -517 l 180 -517 l 180 -89 b 248 26 206 -65 229 -27 b 315 -89 264 -27 287 -65 l 315 -517 l 360 -517 l 360 -112 l 383 -112 b 495 68 458 -112 495 -53 l 449 68 b 399 -4 449 20 433 -4 b 248 248 297 -4 261 171 b 122 0 216 96 176 14 b 94 -4 112 -3 102 -4 b 45 68 60 -4 45 20 z',\n },\n accSagittalFlat25SUp: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 94 4 45 -20 60 4 b 122 0 102 4 112 3 b 248 -248 176 -14 216 -96 b 399 4 261 -171 297 4 b 449 -68 433 4 449 -20 l 495 -68 b 383 112 495 53 458 112 l 360 112 l 360 517 l 315 517 l 315 89 b 248 -26 287 65 264 27 b 180 89 229 27 206 65 l 180 517 l 135 517 l 135 112 l 112 112 b 0 -68 36 112 0 53 z',\n },\n accSagittalSharp7CDown: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 112 l 89 112 b 180 104 124 112 154 109 l 180 -517 l 225 -517 l 225 89 b 315 -68 285 60 315 9 l 315 -248 l 360 -248 l 360 68 b 135 248 360 187 285 248 l 0 248 z',\n },\n accSagittalFlat7CUp: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 135 -248 b 360 -68 285 -248 360 -187 l 360 248 l 315 248 l 315 68 b 225 -89 315 -9 285 -60 l 225 517 l 180 517 l 180 -104 b 89 -112 154 -109 124 -112 l 45 -112 l 45 517 l 0 517 z',\n },\n accSagittalSharp5CDown: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -517 l 45 71 l 180 -56 l 180 -517 l 225 -517 l 225 -98 l 405 -268 l 405 -112 l 23 248 l 0 248 l 0 -517 z',\n },\n accSagittalFlat5CUp: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 517 l 0 -248 l 23 -248 l 405 112 l 405 268 l 225 98 l 225 517 l 180 517 l 180 56 l 45 -71 l 45 517 z',\n },\n accSagittalSharp5v7kDown: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -276 l 135 -82 l 135 -517 l 180 -517 l 180 -17 l 271 112 l 315 112 l 315 -517 l 360 -517 l 360 107 b 449 -68 420 89 449 30 l 449 -248 l 495 -248 l 495 68 b 360 248 495 189 449 248 l 248 248 z',\n },\n accSagittalFlat5v7kUp: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 248 -248 l 360 -248 b 495 -68 449 -248 495 -189 l 495 248 l 449 248 l 449 68 b 360 -107 449 -30 420 -89 l 360 517 l 315 517 l 315 -112 l 271 -112 l 180 17 l 180 517 l 135 517 l 135 82 l 0 276 l 0 112 z',\n },\n accSagittalSharp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 180 -53 l 180 -517 l 225 -517 l 225 0 l 292 85 l 360 0 l 360 -517 l 405 -517 l 405 -53 l 585 -274 l 585 -112 l 292 248 l 0 -112 l 0 -274 z',\n },\n accSagittalFlat: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 274 l 0 112 l 292 -248 l 585 112 l 585 274 l 405 53 l 405 517 l 360 517 l 360 0 l 292 -85 l 225 0 l 225 517 l 180 517 l 180 53 z',\n },\n accSagittalSharp5v7kUp: {\n x_min: 0,\n x_max: 312,\n y_min: -361,\n y_max: 172,\n ha: 533,\n o: 'm 45 -517 l 45 -10 b 135 -92 68 -48 98 -75 l 135 -520 l 180 -520 l 180 -108 b 248 -115 203 -112 225 -115 b 271 -112 256 -115 264 -115 l 271 -517 l 315 -517 l 315 -107 b 449 68 405 -89 449 -30 l 405 68 b 297 -4 405 19 369 -4 b 23 248 131 -4 56 85 l 0 248 l 0 -517 z',\n },\n accSagittalFlat5v7kDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 361,\n ha: 533,\n o: 'm 0 517 l 0 -248 l 23 -248 b 297 4 56 -85 131 4 b 405 -68 369 4 405 -19 l 449 -68 b 315 107 449 30 405 89 l 315 517 l 271 517 l 271 112 b 248 115 264 115 256 115 b 180 108 225 115 203 112 l 180 520 l 135 520 l 135 92 b 45 10 98 75 68 48 l 45 517 z',\n },\n accSagittalSharp5CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -266 l 135 -153 l 135 -517 l 180 -517 l 180 -115 l 271 -39 l 271 -517 l 315 -517 l 315 0 l 405 75 l 405 -517 l 449 -517 l 449 248 l 428 248 l 0 -112 z',\n },\n accSagittalFlat5CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 428 -248 l 449 -248 l 449 517 l 405 517 l 405 -75 l 315 0 l 315 517 l 271 517 l 271 39 l 180 115 l 180 517 l 135 517 l 135 153 l 0 266 z',\n },\n accSagittalSharp7CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 112 l 135 112 l 135 -517 l 180 -517 l 180 108 b 271 89 213 105 243 99 l 271 -517 l 315 -517 l 315 73 b 405 -68 374 45 405 -3 l 405 -248 l 449 -248 l 449 68 b 135 248 449 187 346 248 l 0 248 z',\n },\n accSagittalFlat7CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 135 -248 b 449 -68 346 -248 449 -187 l 449 248 l 405 248 l 405 68 b 315 -73 405 3 374 -45 l 315 517 l 271 517 l 271 -89 b 180 -108 243 -99 213 -105 l 180 517 l 135 517 l 135 -112 l 45 -112 l 45 517 l 0 517 z',\n },\n accSagittalSharp25SUp: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -30 l 495 143 l 495 14 l 0 -157 l 0 -255 l 225 -177 l 225 -517 l 271 -517 l 271 -161 l 360 -130 l 360 -517 l 405 -517 l 405 -115 l 495 -84 l 495 -517 l 540 -517 l 540 248 l 517 248 l 0 68 z',\n },\n accSagittalFlat25SDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 l 517 -248 l 540 -248 l 540 517 l 495 517 l 495 84 l 405 115 l 405 517 l 360 517 l 360 130 l 271 161 l 271 517 l 225 517 l 225 177 l 0 255 l 0 157 l 495 -14 l 495 -143 l 0 30 z',\n },\n accSagittalSharp35MUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -274 l 135 -108 l 135 -517 l 180 -517 l 180 -53 l 271 58 l 271 -517 l 315 -517 l 315 112 l 360 112 b 405 109 376 112 390 112 l 405 -517 l 449 -517 l 449 96 b 540 -68 510 72 540 17 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 z',\n },\n accSagittalFlat35MDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 292 -248 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 449 -96 540 -17 510 -72 l 449 517 l 405 517 l 405 -109 b 360 -112 390 -112 376 -112 l 315 -112 l 315 517 l 271 517 l 271 -58 l 180 53 l 180 517 l 135 517 l 135 108 l 0 274 l 0 112 z',\n },\n accSagittalSharp11MUp: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -271 l 180 -79 l 180 -517 l 225 -517 l 225 -30 l 315 65 l 315 -517 l 360 -517 l 360 65 l 449 -30 l 449 -517 l 495 -517 l 495 -79 l 675 -271 l 675 -112 l 337 248 z',\n },\n accSagittalFlat11MDown: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 337 -248 l 675 112 l 675 271 l 495 79 l 495 517 l 449 517 l 449 30 l 360 -65 l 360 517 l 315 517 l 315 -65 l 225 30 l 225 517 l 180 517 l 180 79 l 0 271 l 0 112 z',\n },\n accSagittalSharp11LUp: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 112 l 449 112 l 449 -517 l 495 -517 l 495 104 b 631 -68 585 82 631 26 l 631 -248 l 675 -248 l 675 68 b 449 248 675 187 600 248 l 225 248 b 0 68 75 248 0 187 z',\n },\n accSagittalFlat11LDown: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 449 -248 b 675 -68 600 -248 675 -187 l 675 248 l 631 248 l 631 68 b 495 -104 631 -26 585 -82 l 495 517 l 449 517 l 449 -112 l 360 -112 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z',\n },\n accSagittalSharp35LUp: {\n x_min: 0,\n x_max: 500,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 71 l 452 -17 l 452 -517 l 495 -517 l 495 -56 l 720 -268 l 720 -112 l 337 248 l 225 248 b 0 68 75 248 0 187 z',\n },\n accSagittalFlat35LDown: {\n x_min: 0,\n x_max: 500,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 337 -248 l 720 112 l 720 268 l 495 56 l 495 517 l 452 517 l 452 17 l 360 -71 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z',\n },\n accSagittalDoubleSharp25SDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 135 -112 0 -53 45 -112 b 243 -62 180 -112 215 -95 l 89 -503 l 143 -517 l 292 -82 l 445 -517 l 495 -503 l 343 -62 b 449 -112 372 -95 408 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 315 148 b 112 -4 274 148 236 -4 b 45 68 68 -4 45 20 z',\n },\n accSagittalDoubleFlat25SUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 112 4 45 -20 68 4 b 292 -248 236 4 274 -148 b 475 4 315 -148 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 b 343 62 408 112 372 95 l 495 503 l 445 517 l 292 82 l 143 517 l 89 503 l 243 62 b 135 112 215 95 180 112 b 0 -68 45 112 0 53 z',\n },\n accSagittalDoubleSharp7CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -503 l 52 -517 l 203 -82 l 354 -517 l 405 -503 l 230 0 l 271 108 b 495 -68 420 92 495 35 l 495 -248 l 540 -248 l 540 68 b 225 248 540 187 435 248 l 89 248 l 89 112 l 135 112 l 174 0 z m 213 112 l 203 82 l 192 112 z',\n },\n accSagittalDoubleFlat7CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 174 0 l 135 -112 l 89 -112 l 89 -248 l 225 -248 b 540 -68 435 -248 540 -187 l 540 248 l 495 248 l 495 68 b 271 -108 495 -35 420 -92 l 230 0 l 405 503 l 354 517 l 203 82 l 52 517 l 0 503 z m 192 -112 l 203 -82 l 213 -112 z',\n },\n accSagittalDoubleSharp5CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 405 -503 l 230 0 l 232 4 l 585 -264 l 585 -112 l 112 248 l 89 248 l 89 112 l 151 68 l 174 0 l 0 -503 l 52 -517 l 203 -82 l 354 -517 z',\n },\n accSagittalDoubleFlat5CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 354 517 l 203 82 l 52 517 l 0 503 l 174 0 l 151 -68 l 89 -112 l 89 -248 l 112 -248 l 585 112 l 585 264 l 232 -4 l 230 0 l 405 503 z',\n },\n accSagittalDoubleSharp5v7kDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -274 l 252 35 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 360 112 b 540 -68 480 112 540 53 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 l 0 -112 z',\n },\n accSagittalDoubleFlat5v7kUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 292 -248 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 360 -112 540 -53 480 -112 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 252 -35 l 0 274 z',\n },\n accSagittalDoubleSharp: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 540 -503 l 366 0 l 380 45 l 675 -271 l 675 -112 l 337 248 l 0 -112 l 0 -271 l 295 45 l 310 0 l 135 -503 l 186 -517 l 337 -82 l 488 -517 z',\n },\n accSagittalDoubleFlat: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 488 517 l 337 82 l 186 517 l 135 503 l 310 0 l 295 -45 l 0 271 l 0 112 l 337 -248 l 675 112 l 675 271 l 380 -45 l 366 0 l 540 503 z',\n },\n accSagittal7v11KleismaUp: {\n x_min: 0,\n x_max: 219,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 68 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 -45 b 248 -112 200 -89 225 -112 b 315 68 292 -112 315 -53 l 271 68 b 248 -4 271 20 264 -4 b 236 0 245 -4 240 -3 b 157 248 213 14 187 96 b 78 0 127 96 101 14 b 65 -4 73 -3 68 -4 b 45 68 50 -4 45 20 l 0 68 b 68 -112 0 -53 23 -112 z',\n },\n accSagittal7v11KleismaDown: {\n x_min: 0,\n x_max: 219,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 68 112 b 0 -68 23 112 0 53 l 45 -68 b 65 4 45 -20 50 4 b 78 0 68 4 73 3 b 157 -248 101 -14 127 -96 b 236 0 187 -96 213 -14 b 248 4 240 3 245 4 b 271 -68 264 4 271 -20 l 315 -68 b 248 112 315 53 292 112 b 180 45 225 112 200 89 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 z',\n },\n accSagittal17CommaUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 -40 b 315 -118 248 -92 279 -118 b 405 62 374 -118 405 -59 l 360 62 b 324 -10 360 14 348 -10 b 302 -6 318 -10 311 -9 b 206 217 268 9 235 84 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z',\n },\n accSagittal17CommaDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 206 -217 b 302 6 235 -84 268 -9 b 324 10 311 9 318 10 b 360 -62 348 10 360 -14 l 405 -62 b 315 118 405 59 374 118 b 225 40 279 118 248 92 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z',\n },\n accSagittal55CommaUp: {\n x_min: 0,\n x_max: 219,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 248 l 0 -517 l 45 -517 l 45 58 l 315 -274 l 315 -112 l 23 248 z',\n },\n accSagittal55CommaDown: {\n x_min: 0,\n x_max: 219,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 23 -248 l 315 112 l 315 274 l 45 -58 l 45 517 l 0 517 l 0 -248 z',\n },\n accSagittal7v11CommaUp: {\n x_min: 0,\n x_max: 188,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 248 l 135 248 b 0 68 45 248 0 187 z',\n },\n accSagittal7v11CommaDown: {\n x_min: 0,\n x_max: 188,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 271 -248 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittal5v11SmallDiesisUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 73 l 0 -248 l 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 -40 b 360 -118 295 -92 325 -118 b 449 62 420 -118 449 -59 l 405 62 b 369 -10 405 14 393 -10 b 348 -6 363 -10 356 -9 b 251 217 312 9 279 84 l 248 248 l 135 248 b 0 73 45 248 0 189 z',\n },\n accSagittal5v11SmallDiesisDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -73 b 135 -248 0 -189 45 -248 l 248 -248 l 251 -217 b 348 6 279 -84 312 -9 b 369 10 356 9 363 10 b 405 -62 393 10 405 -14 l 449 -62 b 360 118 449 59 420 118 b 271 40 325 118 295 92 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittalSharp5v11SDown: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 112 -23 45 -84 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 b 242 37 203 -23 225 -3 b 315 -89 262 -23 285 -63 l 315 -517 l 360 -517 l 360 -112 l 383 -112 b 495 68 458 -112 495 -53 l 449 68 b 399 -4 449 20 433 -4 b 248 248 297 -4 261 171 b 157 68 222 127 192 68 l 89 68 b 0 -203 30 68 0 -23 z',\n },\n accSagittalFlat5v11SUp: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 89 -68 0 23 30 -68 l 157 -68 b 248 -248 192 -68 222 -127 b 399 4 261 -171 297 4 b 449 -68 433 4 449 -20 l 495 -68 b 383 112 495 53 458 112 l 360 112 l 360 517 l 315 517 l 315 89 b 242 -37 285 63 262 23 b 180 23 225 3 203 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 84 z',\n },\n accSagittalSharp7v11CDown: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 89 -112 l 89 -517 l 135 -517 l 135 -95 b 206 37 163 -73 187 -30 b 271 -23 225 -3 248 -23 l 271 -517 l 315 -517 l 315 -23 l 383 -23 b 449 -203 428 -23 449 -84 l 495 -203 b 405 68 495 -23 465 68 l 292 68 b 203 248 258 68 228 127 b 101 0 173 98 138 16 b 81 -3 94 0 86 -3 b 45 68 56 -3 45 20 l 0 68 b 89 -112 0 -52 30 -112 z',\n },\n accSagittalFlat7v11CUp: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 112 b 0 -68 30 112 0 52 l 45 -68 b 81 3 45 -20 56 3 b 101 0 86 3 94 0 b 203 -248 138 -16 173 -98 b 292 -68 228 -127 258 -68 l 405 -68 b 495 203 465 -68 495 23 l 449 203 b 383 23 449 84 428 23 l 315 23 l 315 517 l 271 517 l 271 23 b 206 -37 248 23 225 3 b 135 95 187 30 163 73 l 135 517 l 89 517 z',\n },\n accSagittalSharp55CDown: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -271 l 135 -125 l 135 -517 l 180 -517 l 180 -78 l 315 65 l 315 -517 l 360 -517 l 360 248 l 337 248 l 0 -112 z',\n },\n accSagittalFlat55CUp: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 337 -248 l 360 -248 l 360 517 l 315 517 l 315 -65 l 180 78 l 180 517 l 135 517 l 135 125 l 0 271 z',\n },\n accSagittalSharp17CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -248 l 45 -68 b 180 109 45 36 89 95 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -89 292 13 321 -55 l 360 -517 l 405 -517 l 405 -112 l 428 -112 b 540 68 504 -112 540 -53 l 495 68 b 445 -4 495 20 480 -4 b 292 248 343 -4 307 171 l 180 248 b 0 68 60 248 0 187 l 0 -248 z',\n },\n accSagittalFlat17CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 248 l 0 -68 b 180 -248 0 -187 60 -248 l 292 -248 b 445 4 307 -171 343 4 b 495 -68 480 4 495 -20 l 540 -68 b 428 112 540 53 504 112 l 405 112 l 405 517 l 360 517 l 360 89 b 271 -112 321 55 292 -13 l 225 -112 l 225 517 l 180 517 l 180 -109 b 45 68 89 -95 45 -36 l 45 248 z',\n },\n accSagittalSharp7v11kDown: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -32 l 405 138 l 405 13 l 0 -157 l 0 -256 l 225 -161 l 225 -517 l 271 -517 l 271 -144 l 405 -86 l 405 -517 l 449 -517 l 449 248 l 428 248 l 0 68 z',\n },\n accSagittalFlat7v11kUp: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 l 428 -248 l 449 -248 l 449 517 l 405 517 l 405 86 l 271 144 l 271 517 l 225 517 l 225 161 l 0 256 l 0 157 l 405 -13 l 405 -138 l 0 32 z',\n },\n accSagittalSharp7v11kUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 135 -112 l 135 -517 l 180 -517 l 180 -105 b 271 -23 217 -94 248 -65 l 271 -517 l 315 -517 l 315 -23 b 405 -105 337 -65 369 -94 l 405 -517 l 449 -517 l 449 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 315 148 b 112 -4 274 148 236 -4 b 45 68 68 -4 45 20 l 0 68 b 135 -112 0 -53 45 -112 z',\n },\n accSagittalFlat7v11kDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 135 112 b 0 -68 45 112 0 53 l 45 -68 b 112 4 45 -20 68 4 b 292 -248 236 4 274 -148 b 475 4 315 -148 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 l 449 517 l 405 517 l 405 105 b 315 23 369 94 337 65 l 315 517 l 271 517 l 271 23 b 180 105 248 65 217 94 l 180 517 l 135 517 z',\n },\n accSagittalSharp17CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 203 -23 b 271 14 229 -23 251 -10 l 271 -517 l 315 -517 l 315 -23 b 405 -105 337 -65 369 -94 l 405 -517 l 449 -517 l 449 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 312 150 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalFlat17CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 b 475 4 312 -150 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 l 449 517 l 405 517 l 405 105 b 315 23 369 94 337 65 l 315 517 l 271 517 l 271 -14 b 203 23 251 10 229 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalSharp55CUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -517 l 45 78 l 135 10 l 135 -517 l 180 -517 l 180 -23 l 271 -92 l 271 -517 l 315 -517 l 315 -127 l 495 -264 l 495 -112 l 23 248 l 0 248 l 0 -517 z',\n },\n accSagittalFlat55CDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 517 l 0 -248 l 23 -248 l 495 112 l 495 264 l 315 127 l 315 517 l 271 517 l 271 92 l 180 23 l 180 517 l 135 517 l 135 -10 l 45 -78 l 45 517 z',\n },\n accSagittalSharp7v11CUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 86 45 6 89 58 l 180 -517 l 225 -517 l 225 98 b 315 109 252 104 282 108 l 315 -517 l 360 -517 l 360 112 l 449 112 l 449 -517 l 495 -517 l 495 248 l 360 248 b 0 68 121 248 0 189 z',\n },\n accSagittalFlat7v11CDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 360 -248 0 -189 121 -248 l 495 -248 l 495 517 l 449 517 l 449 -112 l 360 -112 l 360 517 l 315 517 l 315 -109 b 225 -98 282 -108 252 -104 l 225 517 l 180 517 l 180 -86 b 45 68 89 -58 45 -6 l 45 248 l 0 248 z',\n },\n accSagittalSharp5v11SUp: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 -23 b 449 -105 383 -65 415 -94 l 449 -517 l 495 -517 l 495 -112 b 631 68 585 -112 631 -53 l 585 68 b 520 -4 585 20 563 -4 b 337 248 396 -4 360 150 l 225 248 b 0 68 76 248 0 187 z',\n },\n accSagittalFlat5v11SDown: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 225 -248 0 -187 76 -248 l 337 -248 b 520 4 360 -150 396 4 b 585 -68 563 4 585 -20 l 631 -68 b 495 112 631 53 585 112 l 495 517 l 449 517 l 449 105 b 360 23 415 94 383 65 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z',\n },\n accSagittalDoubleSharp5v11SDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 203 -23 b 262 4 225 -23 245 -13 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 341 -60 b 449 -112 370 -95 405 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 312 150 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalDoubleFlat5v11SUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 b 475 4 312 -150 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 b 341 60 405 112 370 95 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 262 -4 b 203 23 245 13 225 23 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalDoubleSharp7v11CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 112 -112 b 193 -73 143 -112 170 -99 l 45 -501 l 95 -517 l 248 -81 l 397 -517 l 449 -503 l 275 0 l 278 4 b 337 -23 295 -13 315 -23 l 405 -23 b 495 -203 465 -23 495 -84 l 540 -203 b 428 68 540 -23 503 68 l 360 68 b 248 248 310 68 271 127 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 112 -112 0 -52 36 -112 z',\n },\n accSagittalDoubleFlat7v11CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 112 112 b 0 -68 36 112 0 52 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 b 360 -68 271 -127 310 -68 l 428 -68 b 540 203 503 -68 540 23 l 495 203 b 405 23 495 84 465 23 l 337 23 b 278 -4 315 23 295 13 l 275 0 l 449 503 l 397 517 l 248 81 l 95 517 l 45 501 l 193 73 b 112 112 170 99 143 112 z',\n },\n accSagittalDoubleSharp55CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 428 248 l 0 -112 l 0 -266 l 307 -7 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 366 0 l 386 59 l 449 112 l 449 248 z',\n },\n accSagittalDoubleFlat55CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 449 -248 l 449 -112 l 386 -59 l 366 0 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 307 7 l 0 266 l 0 112 l 428 -248 z',\n },\n accSagittalDoubleSharp17CDown: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -248 l 45 -68 b 271 112 45 53 120 112 l 310 0 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 387 -62 b 495 -112 416 -95 452 -112 b 631 68 585 -112 631 -53 l 585 68 b 520 -4 585 20 563 -4 b 337 248 396 -4 360 150 l 225 248 b 0 68 76 248 0 187 l 0 -248 z',\n },\n accSagittalDoubleFlat17CUp: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 248 l 0 -68 b 225 -248 0 -187 76 -248 l 337 -248 b 520 4 360 -150 396 4 b 585 -68 563 4 585 -20 l 631 -68 b 495 112 631 53 585 112 b 387 62 452 112 416 95 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 310 0 l 271 -112 b 45 68 120 -112 45 -53 l 45 248 z',\n },\n accSagittalDoubleSharp7v11kDown: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -30 l 366 96 l 399 0 l 392 -23 l 0 -157 l 0 -255 l 353 -135 l 225 -503 l 276 -517 l 428 -82 l 579 -517 l 631 -503 l 455 0 l 507 145 l 540 157 l 540 248 l 517 248 z m 416 115 l 442 124 l 428 82 z',\n },\n accSagittalDoubleFlat7v11kUp: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 517 -248 l 540 -248 l 540 -157 l 507 -145 l 455 0 l 631 503 l 579 517 l 428 82 l 276 517 l 225 503 l 353 135 l 0 255 l 0 157 l 392 23 l 399 0 l 366 -96 l 0 30 l 0 -68 z m 428 -82 l 442 -124 l 416 -115 z',\n },\n accSagittal23CommaUp: {\n x_min: 0,\n x_max: 188,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -4 b 68 -23 53 -17 60 -23 l 180 -23 b 225 -203 210 -23 225 -82 l 271 -203 b 206 68 271 -23 248 68 l 89 68 b 23 248 71 68 48 127 l 0 248 z',\n },\n accSagittal23CommaDown: {\n x_min: 0,\n x_max: 188,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 b 89 -68 48 -127 71 -68 l 206 -68 b 271 203 248 -68 271 23 l 225 203 b 180 23 225 82 210 23 l 68 23 b 45 4 60 23 53 17 l 45 517 l 0 517 z',\n },\n accSagittal5v19CommaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -284 l 180 33 l 180 -517 l 225 -517 l 225 248 l 203 248 b 86 112 151 157 112 112 b 45 157 59 112 45 127 l 0 157 b 76 23 0 72 26 27 l 0 -112 z',\n },\n accSagittal5v19CommaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 76 -23 b 0 -157 26 -27 0 -72 l 45 -157 b 86 -112 45 -127 59 -112 b 203 -248 112 -112 151 -157 l 225 -248 l 225 517 l 180 517 l 180 -33 l 0 284 z',\n },\n accSagittal5v23SmallDiesisUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -284 l 180 33 l 180 -517 l 225 -517 l 225 -4 b 248 -23 233 -17 240 -23 l 360 -23 b 405 -203 390 -23 405 -82 l 449 -203 b 386 68 449 -23 428 68 l 271 68 b 203 248 251 68 228 127 l 0 -112 z',\n },\n accSagittal5v23SmallDiesisDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 203 -248 b 271 -68 228 -127 251 -68 l 386 -68 b 449 203 428 -68 449 23 l 405 203 b 360 23 405 82 390 23 l 248 23 b 225 4 240 23 233 17 l 225 517 l 180 517 l 180 -33 l 0 284 z',\n },\n accSagittalSharp5v23SDown: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 6 b 89 -23 59 -13 73 -23 l 180 -23 l 180 -517 l 225 -517 l 225 -23 l 292 -23 b 360 -203 337 -23 360 -84 l 405 -203 b 315 68 405 -23 374 68 l 112 68 b 23 248 78 68 48 127 l 0 248 z',\n },\n accSagittalFlat5v23SUp: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 b 112 -68 48 -127 78 -68 l 315 -68 b 405 203 374 -68 405 23 l 360 203 b 292 23 360 84 337 23 l 225 23 l 225 517 l 180 517 l 180 23 l 89 23 b 45 -6 73 23 59 13 l 45 517 l 0 517 z',\n },\n accSagittalSharp5v19CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 89 -112 0 -52 30 -112 l 89 -517 l 135 -517 l 135 -95 b 225 112 173 -65 203 4 l 271 112 l 271 -517 l 315 -517 l 315 107 b 405 -68 374 89 405 30 l 405 -248 l 449 -248 l 449 68 b 315 248 449 189 405 248 l 203 248 b 101 0 173 98 138 16 b 81 -3 94 0 86 -3 b 45 68 56 -3 45 23 z',\n },\n accSagittalFlat5v19CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 81 3 45 -23 56 3 b 101 0 86 3 94 0 b 203 -248 138 -16 173 -98 l 315 -248 b 449 -68 405 -248 449 -189 l 449 248 l 405 248 l 405 68 b 315 -107 405 -30 374 -89 l 315 517 l 271 517 l 271 -112 l 225 -112 b 135 95 203 -4 173 65 l 135 517 l 89 517 l 89 112 b 0 -68 30 112 0 52 z',\n },\n accSagittalSharp23CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 135 -82 l 135 -517 l 180 -517 l 180 -17 l 239 68 b 315 -23 261 7 287 -23 l 315 -517 l 360 -517 l 360 -23 l 428 -23 b 495 -203 472 -23 495 -84 l 540 -203 b 449 68 540 -23 510 68 l 337 68 b 248 248 302 68 271 127 l 0 -112 l 0 -276 z',\n },\n accSagittalFlat23CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 276 l 0 112 l 248 -248 b 337 -68 271 -127 302 -68 l 449 -68 b 540 203 510 -68 540 23 l 495 203 b 428 23 495 84 472 23 l 360 23 l 360 517 l 315 517 l 315 23 b 239 -68 287 23 261 -7 l 180 17 l 180 517 l 135 517 l 135 82 z',\n },\n accSagittalSharp23CUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 14 b 112 -23 63 -10 86 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 l 271 -517 l 315 -517 l 315 -23 l 360 -23 b 449 -203 420 -23 449 -84 l 495 -203 b 383 68 495 -23 458 68 l 135 68 b 23 248 85 68 48 127 l 0 248 z',\n },\n accSagittalFlat23CDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 b 135 -68 48 -127 85 -68 l 383 -68 b 495 203 458 -68 495 23 l 449 203 b 360 23 449 84 420 23 l 315 23 l 315 517 l 271 517 l 271 23 l 180 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 -14 86 23 63 10 l 45 517 l 0 517 z',\n },\n accSagittalSharp5v19CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -266 l 135 -153 l 135 -517 l 180 -517 l 180 -115 l 271 -39 l 271 -517 l 315 -517 l 315 0 l 405 75 l 405 -517 l 449 -517 l 449 248 l 428 248 b 130 68 285 127 186 68 b 45 157 73 68 45 98 l 0 157 b 112 -20 0 53 37 -6 z',\n },\n accSagittalFlat5v19CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 112 20 b 0 -157 37 6 0 -53 l 45 -157 b 130 -68 45 -98 73 -68 b 428 -248 186 -68 285 -127 l 449 -248 l 449 517 l 405 517 l 405 -75 l 315 0 l 315 517 l 271 517 l 271 39 l 180 115 l 180 517 l 135 517 l 135 153 l 0 266 l 0 112 z',\n },\n accSagittalSharp5v23SUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 135 -108 l 135 -517 l 180 -517 l 180 -53 l 271 58 l 271 -517 l 315 -517 l 315 14 b 383 -23 334 -10 357 -23 l 405 -23 l 405 -517 l 449 -517 l 449 -23 b 540 -203 510 -23 540 -84 l 585 -203 b 472 68 585 -23 547 68 l 405 68 b 292 248 356 68 318 127 l 0 -112 l 0 -274 z',\n },\n accSagittalFlat5v23SDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 274 l 0 112 l 292 -248 b 405 -68 318 -127 356 -68 l 472 -68 b 585 203 547 -68 585 23 l 540 203 b 449 23 540 84 510 23 l 449 517 l 405 517 l 405 23 l 383 23 b 315 -14 357 23 334 10 l 315 517 l 271 517 l 271 -58 l 180 53 l 180 517 l 135 517 l 135 108 z',\n },\n accSagittalDoubleSharp5v23SDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 52 -517 l 203 -81 l 354 -517 l 405 -503 l 239 -23 l 449 -23 b 540 -203 510 -23 540 -84 l 585 -203 b 472 68 585 -23 547 68 l 225 68 b 112 248 176 68 138 127 l 89 248 l 89 112 b 170 -14 109 45 135 0 l 0 -501 z',\n },\n accSagittalDoubleFlat5v23SUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 501 l 170 14 b 89 -112 135 0 109 -45 l 89 -248 l 112 -248 b 225 -68 138 -127 176 -68 l 472 -68 b 585 203 547 -68 585 23 l 540 203 b 449 23 540 84 510 23 l 239 23 l 405 503 l 354 517 l 203 81 l 52 517 z',\n },\n accSagittalDoubleSharp5v19CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 112 -112 0 -52 36 -112 b 193 -73 143 -112 170 -99 l 45 -501 l 95 -517 l 248 -81 l 397 -517 l 449 -501 l 275 0 l 315 112 b 495 -68 435 112 495 53 l 495 -248 l 540 -248 l 540 68 b 360 248 540 189 480 248 l 248 248 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 z',\n },\n accSagittalDoubleFlat5v19CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 l 360 -248 b 540 -68 480 -248 540 -189 l 540 248 l 495 248 l 495 68 b 315 -112 495 -53 435 -112 l 275 0 l 449 501 l 397 517 l 248 81 l 95 517 l 45 501 l 193 73 b 112 112 170 99 143 112 b 0 -68 36 112 0 52 z',\n },\n accSagittalDoubleSharp23CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 252 35 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 323 4 b 383 -23 340 -13 360 -23 l 449 -23 b 540 -203 510 -23 540 -84 l 585 -203 b 472 68 585 -23 547 68 l 405 68 b 292 248 356 68 318 127 l 0 -112 l 0 -274 z',\n },\n accSagittalDoubleFlat23CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 274 l 0 112 l 292 -248 b 405 -68 318 -127 356 -68 l 472 -68 b 585 203 547 -68 585 23 l 540 203 b 449 23 540 84 510 23 l 383 23 b 323 -4 360 23 340 13 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 252 -35 z',\n },\n accSagittal19SchismaUp: {\n x_min: 0,\n x_max: 125,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 68 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 248 l 157 248 b 79 0 127 98 101 16 b 68 -3 73 0 68 -3 b 45 68 52 -3 45 20 l 0 68 b 68 -112 0 -52 23 -112 z',\n },\n accSagittal19SchismaDown: {\n x_min: 0,\n x_max: 125,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 68 112 b 0 -68 23 112 0 52 l 45 -68 b 68 3 45 -20 52 3 b 79 0 68 3 73 0 b 157 -248 101 -16 127 -98 l 180 -248 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 z',\n },\n accSagittal17KleismaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 248 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z',\n },\n accSagittal17KleismaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 225 -248 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z',\n },\n accSagittal143CommaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -203 l 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 248 l 203 248 b 135 68 177 127 154 68 l 105 68 b 45 157 65 68 45 98 l 0 157 b 23 20 0 95 7 50 b 0 -203 7 -23 0 -98 z',\n },\n accSagittal143CommaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 23 -20 0 98 7 23 b 0 -157 7 -50 0 -95 l 45 -157 b 105 -68 45 -98 65 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 225 -248 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z',\n },\n accSagittal11v49CommaUp: {\n x_min: 0,\n x_max: 188,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -292 b 89 -157 45 -203 60 -157 l 203 -157 b 225 -143 210 -157 217 -153 l 225 -517 l 271 -517 l 271 248 l 248 248 b 180 157 233 187 210 157 l 68 157 b 0 -68 23 157 0 82 l 45 -68 b 89 68 45 23 60 68 l 203 68 b 225 84 209 68 216 72 l 225 -36 b 180 -68 213 -58 199 -68 l 68 -68 b 0 -292 23 -68 0 -143 z',\n },\n accSagittal11v49CommaDown: {\n x_min: 0,\n x_max: 188,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 292 b 68 68 0 143 23 68 l 180 68 b 225 36 199 68 213 58 l 225 -84 b 203 -68 216 -72 209 -68 l 89 -68 b 45 68 60 -68 45 -23 l 0 68 b 68 -157 0 -82 23 -157 l 180 -157 b 248 -248 210 -157 233 -187 l 271 -248 l 271 517 l 225 517 l 225 143 b 203 157 217 153 210 157 l 89 157 b 45 292 60 157 45 203 z',\n },\n accSagittal19CommaUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 68 -112 0 -52 23 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 -4 b 203 -23 187 -17 196 -23 l 315 -23 b 360 -203 346 -23 360 -82 l 405 -203 b 341 68 405 -23 383 68 l 225 68 b 157 248 206 68 183 127 b 79 0 127 98 101 16 b 68 -3 73 0 68 -3 b 45 68 52 -3 45 20 z',\n },\n accSagittal19CommaDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 68 3 45 -20 52 3 b 79 0 68 3 73 0 b 157 -248 101 -16 127 -98 b 225 -68 183 -127 206 -68 l 341 -68 b 405 203 383 -68 405 23 l 360 203 b 315 23 360 82 346 23 l 203 23 b 180 4 196 23 187 17 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 b 0 -68 23 112 0 52 z',\n },\n accSagittal7v19CommaUp: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 68 -112 0 -52 23 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 112 l 225 112 b 315 -68 285 112 315 53 l 315 -248 l 360 -248 l 360 68 b 271 248 360 187 330 248 l 157 248 b 79 0 127 98 101 16 b 68 -3 73 0 68 -3 b 45 68 52 -3 45 20 z',\n },\n accSagittal7v19CommaDown: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 68 3 45 -20 52 3 b 79 0 68 3 73 0 b 157 -248 101 -16 127 -98 l 271 -248 b 360 -68 330 -248 360 -187 l 360 248 l 315 248 l 315 68 b 225 -112 315 -53 285 -112 l 180 -112 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 b 0 -68 23 112 0 52 z',\n },\n accSagittal49SmallDiesisUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -203 l 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -68 330 112 360 53 l 360 -248 l 405 -248 l 405 68 b 315 248 405 187 374 248 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z',\n },\n accSagittal49SmallDiesisDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 315 -248 b 405 -68 374 -248 405 -187 l 405 248 l 360 248 l 360 68 b 271 -112 360 -53 330 -112 l 225 -112 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z',\n },\n accSagittal23SmallDiesisUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 58 l 495 -274 l 495 -112 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z',\n },\n accSagittal23SmallDiesisDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 495 112 l 495 274 l 225 -58 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z',\n },\n accSagittal5v13MediumDiesisUp: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -259 l 315 -89 l 315 -517 l 360 -517 l 360 248 l 337 248 b 128 180 253 203 184 180 b 45 248 73 180 45 203 l 0 248 b 52 95 0 170 17 120 l 0 68 l 0 -33 l 315 135 l 315 10 l 0 -157 z',\n },\n accSagittal5v13MediumDiesisDown: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 157 l 315 -10 l 315 -135 l 0 33 l 0 -68 l 52 -95 b 0 -248 17 -120 0 -170 l 45 -248 b 128 -180 45 -203 73 -180 b 337 -248 184 -180 253 -203 l 360 -248 l 360 517 l 315 517 l 315 89 l 0 259 z',\n },\n accSagittal11v19MediumDiesisUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 -4 b 292 -23 278 -17 285 -23 l 405 -23 b 449 -203 435 -23 449 -82 l 495 -203 b 431 68 495 -23 472 68 l 315 68 b 248 248 295 68 271 127 l 135 248 b 0 68 45 248 0 187 l 0 -248 z',\n },\n accSagittal11v19MediumDiesisDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 248 l 0 -68 b 135 -248 0 -187 45 -248 l 248 -248 b 315 -68 271 -127 295 -68 l 431 -68 b 495 203 472 -68 495 23 l 449 203 b 405 23 449 82 435 23 l 292 23 b 271 4 285 23 278 17 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 z',\n },\n accSagittal49MediumDiesisUp: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -68 l 0 -248 l 45 -248 l 315 -94 l 315 -517 l 360 -517 l 360 248 l 225 248 b 0 -68 75 248 0 143 z m 45 -68 b 225 112 45 53 105 112 l 315 112 l 315 10 l 45 -145 z',\n },\n accSagittal49MediumDiesisDown: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 68 b 225 -248 0 -143 75 -248 l 360 -248 l 360 517 l 315 517 l 315 94 l 45 248 l 0 248 z m 45 145 l 315 -10 l 315 -112 l 225 -112 b 45 68 105 -112 45 -53 z',\n },\n accSagittal5v49MediumDiesisUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -89 l 0 -248 l 225 53 l 225 -517 l 271 -517 l 271 53 l 495 -248 l 495 -89 l 248 248 b 89 89 170 143 118 89 b 45 157 60 89 45 112 l 0 157 b 68 3 0 68 23 16 z',\n },\n accSagittal5v49MediumDiesisDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 68 -3 b 0 -157 23 -16 0 -68 l 45 -157 b 89 -89 45 -112 60 -89 b 248 -248 118 -89 170 -143 l 495 89 l 495 248 l 271 -53 l 271 517 l 225 517 l 225 -53 l 0 248 l 0 89 z',\n },\n accSagittal49LargeDiesisUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -89 l 360 -248 l 405 -248 l 405 -68 b 180 248 405 143 330 248 l 0 248 z m 45 12 l 45 112 l 180 112 b 360 -68 300 112 360 53 l 360 -147 z',\n },\n accSagittal49LargeDiesisDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 180 -248 b 405 68 330 -248 405 -143 l 405 248 l 360 248 l 45 89 l 45 517 l 0 517 z m 360 147 l 360 68 b 180 -112 360 -53 300 -112 l 45 -112 l 45 -12 z',\n },\n accSagittal11v19LargeDiesisUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -86 l 449 -256 l 449 -157 l 45 13 l 45 138 l 449 -30 l 449 68 l 23 248 l 0 248 z',\n },\n accSagittal11v19LargeDiesisDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 l 449 -68 l 449 30 l 45 -138 l 45 -13 l 449 157 l 449 256 l 45 86 l 45 517 l 0 517 z',\n },\n accSagittal5v13LargeDiesisUp: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 89 -112 0 -52 30 -112 b 180 -35 125 -112 157 -86 l 180 -517 l 225 -517 l 225 -86 l 631 -256 l 631 -157 l 225 13 l 225 138 l 631 -30 l 631 68 l 203 248 b 101 0 173 98 138 16 b 81 -3 94 0 86 -3 b 45 68 56 -3 45 20 z',\n },\n accSagittal5v13LargeDiesisDown: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 81 3 45 -20 56 3 b 101 0 86 3 94 0 b 203 -248 138 -16 173 -98 l 631 -68 l 631 30 l 225 -138 l 225 -13 l 631 157 l 631 256 l 225 86 l 225 517 l 180 517 l 180 35 b 89 112 157 86 125 112 b 0 -68 30 112 0 52 z',\n },\n accSagittalSharp23SDown: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -203 l 45 -203 b 112 -23 45 -84 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 b 315 6 287 -23 301 -13 l 315 -517 l 360 -517 l 360 248 l 337 248 b 248 68 312 127 282 68 l 194 68 b 89 157 125 68 89 98 l 45 157 b 60 59 45 118 50 85 b 0 -203 20 30 0 -56 z',\n },\n accSagittalFlat23SUp: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 60 -59 0 56 20 -30 b 45 -157 50 -85 45 -118 l 89 -157 b 194 -68 89 -98 125 -68 l 248 -68 b 337 -248 282 -68 312 -127 l 360 -248 l 360 517 l 315 517 l 315 -6 b 271 23 301 13 287 23 l 180 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 84 z',\n },\n accSagittalSharp49SDown: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -292 l 45 -292 b 112 -157 45 -203 68 -157 l 135 -157 l 135 -517 l 180 -517 l 180 -157 l 271 -157 b 315 -135 285 -157 300 -150 l 315 -517 l 360 -517 l 360 248 l 337 248 b 248 157 323 187 292 157 l 89 157 b 0 -68 30 157 0 82 l 45 -68 b 112 68 45 23 68 68 l 271 68 b 315 89 284 68 300 75 l 315 -32 b 248 -68 298 -56 275 -68 l 89 -68 b 0 -292 29 -68 0 -143 z',\n },\n accSagittalFlat49SUp: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 292 b 89 68 0 143 29 68 l 248 68 b 315 32 275 68 298 56 l 315 -89 b 271 -68 300 -75 284 -68 l 112 -68 b 45 68 68 -68 45 -23 l 0 68 b 89 -157 0 -82 30 -157 l 248 -157 b 337 -248 292 -157 323 -187 l 360 -248 l 360 517 l 315 517 l 315 135 b 271 157 300 150 285 157 l 180 157 l 180 517 l 135 517 l 135 157 l 112 157 b 45 292 68 157 45 203 z',\n },\n accSagittalSharp7v19CDown: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -271 l 135 -125 l 135 -517 l 180 -517 l 180 -78 l 315 65 l 315 -517 l 360 -517 l 360 248 l 337 248 b 118 89 239 143 166 89 b 45 157 68 89 45 112 l 0 157 b 89 -20 0 53 29 -6 z',\n },\n accSagittalFlat7v19CUp: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 20 b 0 -157 29 6 0 -53 l 45 -157 b 118 -89 45 -112 68 -89 b 337 -248 166 -89 239 -143 l 360 -248 l 360 517 l 315 517 l 315 -65 l 180 78 l 180 517 l 135 517 l 135 125 l 0 271 l 0 112 z',\n },\n accSagittalSharp19CDown: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 180 96 45 17 89 72 l 180 -517 l 225 -517 l 225 107 b 315 112 252 112 282 112 l 360 112 l 360 -517 l 405 -517 l 405 248 l 271 248 b 0 68 89 248 0 187 z',\n },\n accSagittalFlat19CUp: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 271 -248 0 -187 89 -248 l 405 -248 l 405 517 l 360 517 l 360 -112 l 315 -112 b 225 -107 282 -112 252 -112 l 225 517 l 180 517 l 180 -96 b 45 68 89 -72 45 -17 l 45 248 l 0 248 z',\n },\n accSagittalSharp11v49CDown: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 112 -23 45 -82 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 b 271 112 215 -23 245 23 l 315 112 l 315 -517 l 360 -517 l 360 107 b 449 -68 420 89 449 30 l 449 -248 l 495 -248 l 495 68 b 360 248 495 189 449 248 l 248 248 b 157 68 222 128 192 68 l 89 68 b 0 -203 30 68 0 -23 z',\n },\n accSagittalFlat11v49CUp: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 89 -68 0 23 30 -68 l 157 -68 b 248 -248 192 -68 222 -128 l 360 -248 b 495 -68 449 -248 495 -189 l 495 248 l 449 248 l 449 68 b 360 -107 449 -30 420 -89 l 360 517 l 315 517 l 315 -112 l 271 -112 b 180 23 245 -23 215 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 82 z',\n },\n accSagittalSharp143CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 112 -23 45 -84 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 b 259 76 210 -23 236 10 l 315 17 l 315 -517 l 360 -517 l 360 -30 l 585 -271 l 585 -112 l 248 248 b 157 68 222 127 192 68 l 89 68 b 0 -203 30 68 0 -23 z',\n },\n accSagittalFlat143CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 89 -68 0 23 30 -68 l 157 -68 b 248 -248 192 -68 222 -127 l 585 112 l 585 271 l 360 30 l 360 517 l 315 517 l 315 -17 l 259 -76 b 180 23 236 -10 210 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 84 z',\n },\n accSagittalSharp17kDown: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -157 l 0 -256 l 225 -161 l 225 -517 l 271 -517 l 271 -144 l 405 -86 l 405 -517 l 449 -517 l 449 248 l 428 248 b 145 171 305 196 210 171 b 45 248 78 171 45 196 l 0 248 b 79 101 0 170 26 121 l 0 68 l 0 -32 l 405 138 l 405 13 z',\n },\n accSagittalFlat17kUp: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 405 -13 l 405 -138 l 0 32 l 0 -68 l 79 -101 b 0 -248 26 -121 0 -170 l 45 -248 b 145 -171 45 -196 78 -171 b 428 -248 210 -171 305 -196 l 449 -248 l 449 517 l 405 517 l 405 86 l 271 144 l 271 517 l 225 517 l 225 161 l 0 256 l 0 157 z',\n },\n accSagittalSharp19sDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 180 109 45 36 89 95 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -23 295 23 325 -23 l 360 -517 l 405 -517 l 405 -23 l 472 -23 b 540 -203 517 -23 540 -84 l 585 -203 b 495 68 585 -23 554 68 l 383 68 b 292 248 348 68 318 127 l 180 248 b 0 68 60 248 0 187 z',\n },\n accSagittalFlat19sUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 180 -248 0 -187 60 -248 l 292 -248 b 383 -68 318 -127 348 -68 l 495 -68 b 585 203 554 -68 585 23 l 540 203 b 472 23 540 84 517 23 l 405 23 l 405 517 l 360 517 l 360 23 b 271 -112 325 23 295 -23 l 225 -112 l 225 517 l 180 517 l 180 -109 b 45 68 89 -95 45 -36 l 45 248 l 0 248 z',\n },\n accSagittalSharp19sUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 89 -96 l 89 -517 l 135 -517 l 135 -108 b 180 -112 148 -112 163 -112 b 225 -108 196 -112 210 -112 l 225 -517 l 271 -517 l 271 -94 b 360 -12 305 -78 337 -50 l 360 -517 l 405 -517 l 405 248 l 383 248 b 190 0 353 98 288 16 b 138 -3 171 0 153 -3 b 45 68 75 -3 45 20 l 0 68 b 89 -96 0 -17 30 -72 z',\n },\n accSagittalFlat19sDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 96 b 0 -68 30 72 0 17 l 45 -68 b 138 3 45 -20 75 3 b 190 0 153 3 171 0 b 383 -248 288 -16 353 -98 l 405 -248 l 405 517 l 360 517 l 360 12 b 271 94 337 50 305 78 l 271 517 l 225 517 l 225 108 b 180 112 210 112 196 112 b 135 108 163 112 148 112 l 135 517 l 89 517 z',\n },\n accSagittalSharp17kUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 l 271 -517 l 315 -517 l 315 -23 l 337 -23 b 405 14 363 -23 386 -10 l 405 -517 l 449 -517 l 449 248 l 428 248 b 315 68 402 127 364 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalFlat17kDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 315 -68 b 428 -248 364 -68 402 -127 l 449 -248 l 449 517 l 405 517 l 405 -14 b 337 23 386 10 363 23 l 315 23 l 315 517 l 271 517 l 271 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalSharp143CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 l 271 -517 l 315 -517 l 315 -23 l 337 -23 b 405 14 363 -23 386 -10 l 405 -517 l 449 -517 l 449 248 l 428 248 b 315 68 402 127 364 68 l 240 68 b 89 157 140 68 89 98 l 45 157 b 68 53 45 115 52 81 b 0 -203 23 23 0 -63 z',\n },\n accSagittalFlat143CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -53 0 63 23 -23 b 45 -157 52 -81 45 -115 l 89 -157 b 240 -68 89 -98 140 -68 l 315 -68 b 428 -248 364 -68 402 -127 l 449 -248 l 449 517 l 405 517 l 405 -14 b 337 23 386 10 363 23 l 315 23 l 315 517 l 271 517 l 271 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalSharp11v49CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -68 b 135 68 45 23 76 68 l 337 68 b 405 95 363 68 386 76 l 405 -27 b 315 -68 386 -55 356 -68 l 112 -68 b 0 -292 37 -68 0 -143 l 45 -292 b 135 -157 45 -203 75 -157 l 135 -517 l 180 -517 l 180 -157 l 271 -157 l 271 -517 l 315 -517 l 315 -157 l 337 -157 b 405 -130 360 -157 383 -148 l 405 -517 l 449 -517 l 449 248 l 428 248 b 315 157 413 187 376 157 l 112 157 b 0 -68 37 157 0 82 z',\n },\n accSagittalFlat11v49CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 68 b 112 -157 0 -82 37 -157 l 315 -157 b 428 -248 376 -157 413 -187 l 449 -248 l 449 517 l 405 517 l 405 130 b 337 157 383 148 360 157 l 315 157 l 315 517 l 271 517 l 271 157 l 180 157 l 180 517 l 135 517 l 135 157 b 45 292 75 157 45 203 l 0 292 b 112 68 0 143 37 68 l 315 68 b 405 27 356 68 386 55 l 405 -95 b 337 -68 386 -76 363 -68 l 135 -68 b 45 68 76 -68 45 -23 z',\n },\n accSagittalSharp19CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 89 -109 l 89 -517 l 135 -517 l 135 -109 b 225 -27 170 -102 200 -75 l 225 -517 l 271 -517 l 271 14 b 337 -23 289 -10 311 -23 l 360 -23 l 360 -517 l 405 -517 l 405 -23 b 495 -203 465 -23 495 -82 l 540 -203 b 428 68 540 -23 503 68 l 360 68 b 248 248 310 68 271 128 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 89 -109 0 -39 30 -98 z',\n },\n accSagittalFlat19CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 109 b 0 -68 30 98 0 39 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 b 360 -68 271 -128 310 -68 l 428 -68 b 540 203 503 -68 540 23 l 495 203 b 405 23 495 82 465 23 l 405 517 l 360 517 l 360 23 l 337 23 b 271 -14 311 23 289 10 l 271 517 l 225 517 l 225 27 b 135 109 200 75 170 102 l 135 517 l 89 517 z',\n },\n accSagittalSharp7v19CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 89 -109 l 89 -517 l 135 -517 l 135 -109 b 225 -27 170 -102 200 -75 l 225 -517 l 271 -517 l 271 112 l 315 112 b 360 109 331 112 346 112 l 360 -517 l 405 -517 l 405 98 b 495 -68 465 73 495 19 l 495 -248 l 540 -248 l 540 68 b 360 248 540 189 480 248 l 248 248 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 89 -109 0 -39 30 -98 z',\n },\n accSagittalFlat7v19CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 109 b 0 -68 30 98 0 39 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 l 360 -248 b 540 -68 480 -248 540 -189 l 540 248 l 495 248 l 495 68 b 405 -98 495 -19 465 -73 l 405 517 l 360 517 l 360 -109 b 315 -112 346 -112 331 -112 l 271 -112 l 271 517 l 225 517 l 225 27 b 135 109 200 75 170 102 l 135 517 l 89 517 z',\n },\n accSagittalSharp49SUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 203 -23 b 271 14 229 -23 251 -10 l 271 -517 l 315 -517 l 315 112 l 360 112 b 405 109 376 112 390 112 l 405 -517 l 449 -517 l 449 96 b 540 -68 510 72 540 17 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalFlat49SDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 449 -96 540 -17 510 -72 l 449 517 l 405 517 l 405 -109 b 360 -112 390 -112 376 -112 l 315 -112 l 315 517 l 271 517 l 271 -14 b 203 23 251 10 229 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalSharp23SUp: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 203 -23 b 271 14 229 -23 251 -10 l 271 -517 l 315 -517 l 315 71 l 405 -14 l 405 -517 l 449 -517 l 449 -56 l 675 -268 l 675 -112 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalFlat23SDown: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 675 112 l 675 268 l 449 56 l 449 517 l 405 517 l 405 14 l 315 -71 l 315 517 l 271 517 l 271 -14 b 203 23 251 10 229 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalSharp5v13MUp: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 495 141 l 495 14 l 0 -157 l 0 -256 l 225 -180 l 225 -517 l 271 -517 l 271 -161 l 360 -130 l 360 -517 l 405 -517 l 405 -115 l 495 -84 l 495 -517 l 540 -517 l 540 248 l 517 248 b 167 168 366 194 248 168 b 45 248 85 168 45 194 l 0 248 b 95 99 0 170 30 120 l 0 68 l 0 -30 z',\n },\n accSagittalFlat5v13MDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 30 l 0 -68 l 95 -99 b 0 -248 30 -120 0 -170 l 45 -248 b 167 -168 45 -194 85 -168 b 517 -248 248 -168 366 -194 l 540 -248 l 540 517 l 495 517 l 495 84 l 405 115 l 405 517 l 360 517 l 360 130 l 271 161 l 271 517 l 225 517 l 225 180 l 0 256 l 0 157 l 495 -14 l 495 -141 z',\n },\n accSagittalSharp11v19MUp: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 14 b 428 -23 379 -10 402 -23 l 449 -23 l 449 -517 l 495 -517 l 495 -23 b 585 -203 554 -23 585 -84 l 631 -203 b 517 68 631 -23 593 68 l 449 68 b 337 248 400 68 363 127 l 225 248 b 0 68 75 248 0 187 z',\n },\n accSagittalFlat11v19MDown: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 337 -248 b 449 -68 363 -127 400 -68 l 517 -68 b 631 203 593 -68 631 23 l 585 203 b 495 23 585 84 554 23 l 495 517 l 449 517 l 449 23 l 428 23 b 360 -14 402 23 379 10 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z',\n },\n accSagittalSharp49MUp: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 225 -180 l 225 -517 l 271 -517 l 271 -166 l 360 -132 l 360 -517 l 405 -517 l 405 -117 l 495 -84 l 495 -517 l 540 -517 l 540 248 l 360 248 b 0 -68 120 248 0 143 z m 45 -145 l 45 -68 b 360 112 45 53 150 112 l 495 112 l 495 14 z',\n },\n accSagittalFlat49MDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 68 b 360 -248 0 -143 120 -248 l 540 -248 l 540 517 l 495 517 l 495 84 l 405 117 l 405 517 l 360 517 l 360 132 l 271 166 l 271 517 l 225 517 l 225 180 l 45 248 l 0 248 z m 495 -14 l 495 -112 l 360 -112 b 45 68 150 -112 45 -53 l 45 145 z',\n },\n accSagittalSharp5v49MUp: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -271 l 180 -79 l 180 -517 l 225 -517 l 225 -30 l 315 65 l 315 -517 l 360 -517 l 360 65 l 449 -30 l 449 -517 l 495 -517 l 495 -79 l 675 -271 l 675 -112 l 337 248 b 118 89 239 143 166 89 b 45 157 68 89 45 112 l 0 157 b 107 0 0 62 36 10 l 0 -112 z',\n },\n accSagittalFlat5v49MDown: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 107 0 b 0 -157 36 -10 0 -62 l 45 -157 b 118 -89 45 -112 68 -89 b 337 -248 166 -89 239 -143 l 675 112 l 675 271 l 495 79 l 495 517 l 449 517 l 449 30 l 360 -65 l 360 517 l 315 517 l 315 -65 l 225 30 l 225 517 l 180 517 l 180 79 l 0 271 z',\n },\n accSagittalSharp49LUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -82 l 135 -112 l 135 -517 l 180 -517 l 180 -127 l 271 -157 l 271 -517 l 315 -517 l 315 -173 l 540 -248 l 585 -248 l 585 -68 b 180 248 585 143 449 248 l 0 248 z m 45 112 l 180 112 b 540 -68 420 112 540 53 l 540 -145 l 45 16 z',\n },\n accSagittalFlat49LDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 180 -248 b 585 68 449 -248 585 -143 l 585 248 l 540 248 l 315 173 l 315 517 l 271 517 l 271 157 l 180 127 l 180 517 l 135 517 l 135 112 l 45 82 l 45 517 l 0 517 z m 45 -16 l 540 145 l 540 68 b 180 -112 540 -53 420 -112 l 45 -112 z',\n },\n accSagittalSharp11v19LUp: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -81 l 135 -108 l 135 -517 l 180 -517 l 180 -121 l 271 -148 l 271 -517 l 315 -517 l 315 -161 l 631 -255 l 631 -157 l 45 16 l 45 144 l 631 -30 l 631 68 l 23 248 l 0 248 z',\n },\n accSagittalFlat11v19LDown: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 l 631 -68 l 631 30 l 45 -144 l 45 -16 l 631 157 l 631 255 l 315 161 l 315 517 l 271 517 l 271 148 l 180 121 l 180 517 l 135 517 l 135 108 l 45 81 l 45 517 l 0 517 z',\n },\n accSagittalSharp5v13LUp: {\n x_min: 0,\n x_max: 500,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 89 -109 l 89 -517 l 135 -517 l 135 -109 b 225 -27 170 -102 200 -75 l 225 -517 l 271 -517 l 271 -85 l 360 -120 l 360 -517 l 405 -517 l 405 -135 l 720 -256 l 720 -157 l 271 14 l 271 141 l 720 -30 l 720 68 l 248 248 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 89 -109 0 -39 30 -98 z',\n },\n accSagittalFlat5v13LDown: {\n x_min: 0,\n x_max: 500,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 109 b 0 -68 30 98 0 39 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 l 720 -68 l 720 30 l 271 -141 l 271 -14 l 720 157 l 720 256 l 405 135 l 405 517 l 360 517 l 360 120 l 271 85 l 271 517 l 225 517 l 225 27 b 135 109 200 75 170 102 l 135 517 l 89 517 z',\n },\n accSagittalDoubleSharp23SDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -203 l 45 -203 b 135 -23 45 -82 76 -23 l 301 -23 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 370 -14 b 449 112 423 10 449 53 l 449 248 l 428 248 b 315 68 402 127 364 68 l 240 68 b 89 157 140 68 89 98 l 45 157 b 68 53 45 115 52 81 b 0 -203 23 23 0 -63 z',\n },\n accSagittalDoubleFlat23SUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -53 0 63 23 -23 b 45 -157 52 -81 45 -115 l 89 -157 b 240 -68 89 -98 140 -68 l 315 -68 b 428 -248 364 -68 402 -127 l 449 -248 l 449 -112 b 370 14 449 -53 423 -10 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 301 23 l 135 23 b 45 203 76 23 45 82 z',\n },\n accSagittalDoubleSharp49SDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -292 l 45 -292 b 112 -157 45 -203 68 -157 l 256 -157 l 135 -503 l 187 -517 l 337 -82 l 490 -517 l 540 -503 l 366 0 l 396 89 b 449 157 416 102 435 125 l 449 248 l 428 248 b 315 157 413 187 376 157 l 112 157 b 0 -68 39 157 0 82 l 45 -68 b 135 68 45 23 76 68 l 287 68 l 311 0 l 288 -68 l 89 -68 b 0 -292 32 -68 0 -144 z',\n },\n accSagittalDoubleFlat49SUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 292 b 89 68 0 144 32 68 l 288 68 l 311 0 l 287 -68 l 135 -68 b 45 68 76 -68 45 -23 l 0 68 b 112 -157 0 -82 39 -157 l 315 -157 b 428 -248 376 -157 413 -187 l 449 -248 l 449 -157 b 396 -89 435 -125 416 -102 l 366 0 l 540 503 l 490 517 l 337 82 l 187 517 l 135 503 l 256 157 l 112 157 b 45 292 68 157 45 203 z',\n },\n accSagittalDoubleSharp7v19CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -266 l 307 -7 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 366 0 l 386 59 l 449 112 l 449 248 l 428 248 b 130 68 285 127 186 68 b 45 157 73 68 45 98 l 0 157 b 112 -20 0 53 37 -6 z',\n },\n accSagittalDoubleFlat7v19CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 112 20 b 0 -157 37 6 0 -53 l 45 -157 b 130 -68 45 -98 73 -68 b 428 -248 186 -68 285 -127 l 449 -248 l 449 -112 l 386 -59 l 366 0 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 307 7 l 0 266 l 0 112 z',\n },\n accSagittalDoubleSharp19CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 315 109 45 36 135 95 l 354 0 l 180 -503 l 232 -517 l 383 -82 l 534 -517 l 585 -503 l 410 0 l 449 112 l 495 112 l 495 248 l 360 248 b 0 68 120 248 0 187 z m 372 112 l 393 112 l 383 82 z',\n },\n accSagittalDoubleFlat19CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 360 -248 0 -187 120 -248 l 495 -248 l 495 -112 l 449 -112 l 410 0 l 585 503 l 534 517 l 383 82 l 232 517 l 180 503 l 354 0 l 315 -109 b 45 68 135 -95 45 -36 l 45 248 l 0 248 z m 383 -82 l 393 -112 l 372 -112 z',\n },\n accSagittalDoubleSharp11v49CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 203 -23 b 262 4 225 -23 245 -13 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 360 112 b 540 -68 480 112 540 53 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalDoubleFlat11v49CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 360 -112 540 -53 480 -112 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 262 -4 b 203 23 245 13 225 23 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalDoubleSharp143CDown: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 203 -23 b 262 4 225 -23 245 -13 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 337 49 l 675 -268 l 675 -112 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalDoubleFlat143CUp: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 675 112 l 675 268 l 337 -49 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 262 -4 b 203 23 245 13 225 23 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalDoubleSharp17kDown: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 248 b 95 101 0 170 30 121 l 0 68 l 0 -30 l 364 96 l 399 0 l 390 -23 l 0 -157 l 0 -255 l 353 -135 l 225 -503 l 275 -517 l 428 -82 l 577 -517 l 631 -503 l 455 0 l 507 145 l 540 157 l 540 248 l 517 248 b 167 168 366 194 248 168 b 45 248 85 168 45 194 z m 416 115 l 442 124 l 428 82 z',\n },\n accSagittalDoubleFlat17kUp: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -248 b 167 -168 45 -194 85 -168 b 517 -248 248 -168 366 -194 l 540 -248 l 540 -157 l 507 -145 l 455 0 l 631 503 l 577 517 l 428 82 l 275 517 l 225 503 l 353 135 l 0 255 l 0 157 l 390 23 l 399 0 l 364 -96 l 0 30 l 0 -68 l 95 -101 b 0 -248 30 -121 0 -170 z m 428 -82 l 442 -124 l 416 -115 z',\n },\n accSagittalDoubleSharp19sDown: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 271 112 45 53 120 112 l 310 0 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 366 0 l 367 4 b 428 -23 386 -13 405 -23 l 495 -23 b 585 -203 554 -23 585 -84 l 631 -203 b 517 68 631 -23 593 68 l 449 68 b 337 248 400 68 363 127 l 225 248 b 0 68 75 248 0 187 z',\n },\n accSagittalDoubleFlat19sUp: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 337 -248 b 449 -68 363 -127 400 -68 l 517 -68 b 631 203 593 -68 631 23 l 585 203 b 495 23 585 84 554 23 l 428 23 b 367 -4 405 23 386 13 l 366 0 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 310 0 l 271 -112 b 45 68 120 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittalShaftUp: {\n x_min: 0,\n x_max: 31,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 112 l 0 -517 l 45 -517 l 45 112 l 23 248 z',\n },\n accSagittalShaftDown: {\n x_min: 0,\n x_max: 31,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 23 -248 l 45 -112 l 45 517 l 0 517 l 0 -112 z',\n },\n accSagittalAcute: {\n x_min: 0,\n x_max: 125,\n y_min: -62,\n y_max: 125,\n ha: 187,\n o: 'm 0 0 l 0 -89 l 180 89 l 180 180 z',\n },\n accSagittalGrave: {\n x_min: 0,\n x_max: 125,\n y_min: -125,\n y_max: 62,\n ha: 187,\n o: 'm 180 -180 l 180 -89 l 0 89 l 0 0 z',\n },\n accSagittal1MinaUp: {\n x_min: -7,\n x_max: 124,\n y_min: 16,\n y_max: 106.31676725154982,\n ha: 90.31676725154982,\n o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 134 150 179 112 163 135 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z',\n },\n accSagittal1MinaDown: {\n x_min: -7,\n x_max: 124,\n y_min: -106.31676725154983,\n y_max: -16,\n ha: 90.31676725154983,\n o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 179 -23 163 -135 179 -112 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z',\n },\n accSagittal2MinasUp: {\n x_min: -7,\n x_max: 218,\n y_min: 16,\n y_max: 106.31676725154982,\n ha: 90.31676725154982,\n o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 207 65 179 23 200 55 b 252 107 223 86 240 107 b 271 23 264 107 272 86 l 314 23 b 269 150 314 112 298 135 b 203 130 252 158 220 150 b 173 92 190 115 181 104 b 134 150 167 127 154 140 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z',\n },\n accSagittal2MinasDown: {\n x_min: -7,\n x_max: 218,\n y_min: -106.31676725154983,\n y_max: -16,\n ha: 90.31676725154983,\n o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 173 -92 154 -140 167 -127 b 203 -130 181 -104 190 -115 b 269 -150 220 -150 252 -158 b 314 -23 298 -135 314 -112 l 271 -23 b 252 -107 272 -86 264 -107 b 207 -65 240 -107 223 -86 b 179 -23 200 -55 179 -23 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z',\n },\n accSagittal1TinaUp: {\n x_min: 0,\n x_max: 93,\n y_min: 16,\n y_max: 107,\n ha: 91,\n o: 'm 134 154 l 91 154 b 81 76 91 101 91 86 b 0 68 73 69 48 68 l 0 23 b 134 154 122 23 134 36 z',\n },\n accSagittal1TinaDown: {\n x_min: 0,\n x_max: 93,\n y_min: -107,\n y_max: -16,\n ha: 91,\n o: 'm 134 -154 b 0 -23 134 -36 122 -23 l 0 -68 b 81 -76 48 -68 73 -69 b 91 -154 91 -86 91 -101 z',\n },\n accSagittal2TinasUp: {\n x_min: 0,\n x_max: 94,\n y_min: 16,\n y_max: 107,\n ha: 91,\n o: 'm 135 68 b 89 154 94 68 89 124 l 46 154 b 36 92 45 131 42 105 b 0 68 32 82 23 68 l 0 23 b 68 63 29 23 53 40 b 135 23 84 39 104 23 z',\n },\n accSagittal2TinasDown: {\n x_min: 0,\n x_max: 94,\n y_min: -107,\n y_max: -16,\n ha: 91,\n o: 'm 135 -23 b 68 -63 104 -23 84 -39 b 0 -23 53 -40 29 -23 l 0 -68 b 36 -92 23 -68 32 -82 b 46 -154 42 -105 45 -131 l 89 -154 b 135 -68 89 -124 94 -68 z',\n },\n accSagittal3TinasUp: {\n x_min: -7,\n x_max: 124,\n y_min: 16,\n y_max: 106.31676725154982,\n ha: 90.31676725154982,\n o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 134 150 179 112 163 135 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z',\n },\n accSagittal3TinasDown: {\n x_min: -7,\n x_max: 124,\n y_min: -106.31676725154983,\n y_max: -16,\n ha: 90.31676725154983,\n o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 179 -23 163 -135 179 -112 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z',\n },\n accSagittal4TinasUp: {\n x_min: 0,\n x_max: 187,\n y_min: 16,\n y_max: 106.69999999999997,\n ha: 90.69999999999997,\n o: 'm 0 68 l 0 23 b 143 45 105 23 124 26 b 203 107 153 55 183 107 b 226 23 216 107 226 86 l 269 23 b 225 150 269 112 253 135 b 160 132 207 158 181 153 b 115 81 138 112 124 88 b 0 68 104 71 94 68 z',\n },\n accSagittal4TinasDown: {\n x_min: 0,\n x_max: 187,\n y_min: -106.69999999999999,\n y_max: -16,\n ha: 90.69999999999999,\n o: 'm 0 -68 b 115 -81 94 -68 104 -71 b 160 -132 124 -88 138 -112 b 225 -150 181 -153 207 -158 b 269 -23 253 -135 269 -112 l 226 -23 b 203 -107 226 -86 216 -107 b 143 -45 183 -107 153 -55 b 0 -23 124 -26 105 -23 z',\n },\n accSagittal5TinasUp: {\n x_min: 0,\n x_max: 218,\n y_min: 16,\n y_max: 107,\n ha: 91,\n o: 'm 135 23 b 187 45 156 23 168 26 b 249 107 197 55 228 107 b 271 23 262 107 271 86 l 314 23 b 269 150 314 112 298 135 b 204 132 252 158 226 153 b 160 81 183 112 168 88 b 135 68 148 71 147 68 b 89 154 94 68 89 124 l 46 154 b 36 92 45 131 42 105 b 0 68 32 82 23 68 l 0 23 b 68 63 29 23 53 40 b 135 23 84 39 104 23 z',\n },\n accSagittal5TinasDown: {\n x_min: 0,\n x_max: 218,\n y_min: -107,\n y_max: -16,\n ha: 91,\n o: 'm 135 -23 b 68 -63 104 -23 84 -39 b 0 -23 53 -40 29 -23 l 0 -68 b 36 -92 23 -68 32 -82 b 46 -154 42 -105 45 -131 l 89 -154 b 135 -68 89 -124 94 -68 b 160 -81 147 -68 148 -71 b 204 -132 168 -88 183 -112 b 269 -150 226 -153 252 -158 b 314 -23 298 -135 314 -112 l 271 -23 b 249 -107 271 -86 262 -107 b 187 -45 228 -107 197 -55 b 135 -23 168 -26 156 -23 z',\n },\n accSagittal6TinasUp: {\n x_min: -7,\n x_max: 218,\n y_min: 16,\n y_max: 106.31676725154982,\n ha: 90.31676725154982,\n o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 207 65 179 23 200 55 b 252 107 223 86 240 107 b 271 23 264 107 272 86 l 314 23 b 269 150 314 112 298 135 b 203 130 252 158 220 150 b 173 92 190 115 181 104 b 134 150 167 127 154 140 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z',\n },\n accSagittal6TinasDown: {\n x_min: -7,\n x_max: 218,\n y_min: -106.31676725154983,\n y_max: -16,\n ha: 90.31676725154983,\n o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 173 -92 154 -140 167 -127 b 203 -130 181 -104 190 -115 b 269 -150 220 -150 252 -158 b 314 -23 298 -135 314 -112 l 271 -23 b 252 -107 272 -86 264 -107 b 207 -65 240 -107 223 -86 b 179 -23 200 -55 179 -23 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z',\n },\n accSagittal7TinasUp: {\n x_min: 0,\n x_max: 281,\n y_min: 16,\n y_max: 106.69999999999997,\n ha: 90.69999999999997,\n o: 'm 0 68 l 0 23 b 143 45 105 23 124 26 b 203 107 153 55 183 107 b 226 23 216 107 226 86 l 269 23 b 298 65 269 23 291 55 b 343 107 314 86 331 107 b 361 23 354 107 363 86 l 405 23 b 360 150 405 112 389 135 b 294 130 343 158 311 150 b 264 92 281 115 272 104 b 225 150 258 127 245 140 b 160 132 207 158 181 153 b 115 81 138 112 124 88 b 0 68 104 71 94 68 z',\n },\n accSagittal7TinasDown: {\n x_min: 0,\n x_max: 281,\n y_min: -106.69999999999999,\n y_max: -16,\n ha: 90.69999999999999,\n o: 'm 0 -68 b 115 -81 94 -68 104 -71 b 160 -132 124 -88 138 -112 b 225 -150 181 -153 207 -158 b 264 -92 245 -140 258 -127 b 294 -130 272 -104 281 -115 b 360 -150 311 -150 343 -158 b 405 -23 389 -135 405 -112 l 361 -23 b 343 -107 363 -86 354 -107 b 298 -65 331 -107 314 -86 b 269 -23 291 -55 269 -23 l 226 -23 b 203 -107 226 -86 216 -107 b 143 -45 183 -107 153 -55 b 0 -23 124 -26 105 -23 z',\n },\n accSagittal8TinasUp: {\n x_min: 0,\n x_max: 312,\n y_min: 16,\n y_max: 107,\n ha: 91,\n o: 'm 135 23 b 187 45 156 23 168 26 b 249 107 197 55 228 107 b 271 23 262 107 271 86 l 314 23 b 343 65 314 23 336 55 b 387 107 359 86 376 107 b 406 23 399 107 408 86 l 449 23 b 405 150 449 112 433 135 b 338 130 387 158 356 150 b 308 92 325 115 317 104 b 269 150 302 127 289 140 b 204 132 252 158 226 153 b 160 81 183 112 168 88 b 135 68 148 71 147 68 b 89 154 94 68 89 124 l 46 154 b 36 92 45 131 42 105 b 0 68 32 82 23 68 l 0 23 b 68 63 29 23 53 40 b 135 23 84 39 104 23 z',\n },\n accSagittal8TinasDown: {\n x_min: 0,\n x_max: 312,\n y_min: -107,\n y_max: -16,\n ha: 91,\n o: 'm 135 -23 b 68 -63 104 -23 84 -39 b 0 -23 53 -40 29 -23 l 0 -68 b 36 -92 23 -68 32 -82 b 46 -154 42 -105 45 -131 l 89 -154 b 135 -68 89 -124 94 -68 b 160 -81 147 -68 148 -71 b 204 -132 168 -88 183 -112 b 269 -150 226 -153 252 -158 b 308 -92 289 -140 302 -127 b 338 -130 317 -104 325 -115 b 405 -150 356 -150 387 -158 b 449 -23 433 -135 449 -112 l 406 -23 b 387 -107 408 -86 399 -107 b 343 -65 376 -107 359 -86 b 314 -23 336 -55 314 -23 l 271 -23 b 249 -107 271 -86 262 -107 b 187 -45 228 -107 197 -55 b 135 -23 168 -26 156 -23 z',\n },\n accSagittal9TinasUp: {\n x_min: -7,\n x_max: 312,\n y_min: 16,\n y_max: 106.31676725154982,\n ha: 90.31676725154982,\n o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 207 65 179 23 200 55 b 252 107 223 86 240 107 b 271 23 264 107 272 86 l 314 23 b 343 65 314 23 336 55 b 387 107 359 86 376 107 b 406 23 399 107 408 86 l 449 23 b 405 150 449 112 433 135 b 338 130 387 158 356 150 b 308 92 325 115 317 104 b 269 150 302 127 289 140 b 203 130 252 158 220 150 b 173 92 190 115 181 104 b 134 150 167 127 154 140 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z',\n },\n accSagittal9TinasDown: {\n x_min: -7,\n x_max: 312,\n y_min: -106.31676725154983,\n y_max: -16,\n ha: 90.31676725154983,\n o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 173 -92 154 -140 167 -127 b 203 -130 181 -104 190 -115 b 269 -150 220 -150 252 -158 b 308 -92 289 -140 302 -127 b 338 -130 317 -104 325 -115 b 405 -150 356 -150 387 -158 b 449 -23 433 -135 449 -112 l 406 -23 b 387 -107 408 -86 399 -107 b 343 -65 376 -107 359 -86 b 314 -23 336 -55 314 -23 l 271 -23 b 252 -107 272 -86 264 -107 b 207 -65 240 -107 223 -86 b 179 -23 200 -55 179 -23 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z',\n },\n accSagittalFractionalTinaUp: {\n x_min: -3,\n x_max: 35,\n y_min: 73,\n y_max: 111,\n ha: 38,\n o: 'm -4 132 b 23 105 -4 118 9 105 b 50 132 37 105 50 118 b 23 160 50 147 37 160 b -4 132 9 160 -4 147 z',\n },\n accSagittalFractionalTinaDown: {\n x_min: -3,\n x_max: 35,\n y_min: -111,\n y_max: -73,\n ha: 38,\n o: 'm -4 -132 b 23 -160 -4 -147 9 -160 b 50 -132 37 -160 50 -147 b 23 -105 50 -118 37 -105 b -4 -132 9 -105 -4 -118 z',\n },\n accidentalNarrowReversedFlat: {\n x_min: 0,\n x_max: 164,\n y_min: -194,\n y_max: 421,\n ha: 615,\n o: 'm 236 -279 l 236 606 l 192 606 l 192 179 b 85 243 150 222 114 243 b 0 84 23 243 0 134 b 112 -158 0 3 37 -78 z m 192 112 l 192 -163 l 135 -98 b 82 40 101 -50 82 -3 b 138 144 82 73 96 144 b 192 112 153 144 170 132 z',\n },\n accidentalNarrowReversedFlatAndFlat: {\n x_min: 0,\n x_max: 414,\n y_min: -194,\n y_max: 421,\n ha: 615,\n o: 'm 281 606 l 281 -268 l 438 -158 b 596 84 547 -82 596 3 b 475 243 596 154 556 243 b 325 179 435 243 384 222 l 325 606 z m 235 -279 l 235 606 l 190 606 l 190 179 b 85 243 148 222 114 243 b 12 158 52 243 27 215 b 0 84 3 134 0 108 b 112 -158 0 3 37 -78 z m 325 111 b 410 144 359 132 386 144 b 498 36 462 144 498 84 b 413 -107 498 -9 469 -58 l 325 -173 z m 192 112 l 192 -163 l 135 -98 b 81 40 99 -50 81 -3 b 91 94 81 59 84 76 b 137 144 102 127 118 144 b 192 112 153 144 170 132 z',\n },\n accidentalWilsonPlus: {\n x_min: 0,\n x_max: 281,\n y_min: -203,\n y_max: 203,\n ha: 406,\n o: 'm 405 268 l 225 98 l 225 292 l 180 292 l 180 56 l 0 -112 l 0 -268 l 180 -98 l 180 -292 l 225 -292 l 225 -56 l 405 112 z',\n },\n accidentalWilsonMinus: {\n x_min: 0,\n x_max: 281,\n y_min: -186,\n y_max: 186,\n ha: 372,\n o: 'm 0 112 l 405 -268 l 405 -112 l 0 268 z',\n },\n },\n fontFamily: 'Bravura',\n resolution: 1000,\n generatedOn: '2021-12-06T21:04:30.234Z',\n};\n","/**\n * The Bravura font was created by Daniel Spreadbury @ Steinberg.\n * https://github.com/steinbergmedia/bravura/\n */\nexport const BravuraMetrics = {\n name: 'Bravura',\n smufl: true,\n stave: {\n padding: 12,\n endPaddingMax: 10,\n endPaddingMin: 5,\n unalignedNotePadding: 10,\n },\n accidental: {\n noteheadAccidentalPadding: 1,\n leftPadding: 2,\n accidentalSpacing: 3,\n },\n clef: {\n default: {\n point: 32,\n width: 26,\n },\n small: {\n point: 26,\n width: 20,\n },\n annotations: {\n '8va': {\n smuflCode: 'timeSig8',\n default: {\n point: 18,\n treble: {\n line: -1.4,\n shiftX: 12,\n },\n },\n small: {\n point: 16,\n treble: {\n line: -0.2,\n shiftX: 8,\n },\n },\n },\n '8vb': {\n smuflCode: 'timeSig8',\n default: {\n point: 18,\n treble: {\n line: 6,\n shiftX: 10,\n },\n bass: {\n line: 3.5,\n shiftX: 1,\n },\n },\n small: {\n point: 16,\n treble: {\n line: 5.3,\n shiftX: 6,\n },\n bass: {\n line: 3.1,\n shiftX: 0.5,\n },\n },\n },\n },\n // These may no longer be necessary\n lineCount: {\n '8': { point: 55, shiftY: 14 },\n '7': { point: 47, shiftY: 8 },\n '6': { point: 32, shiftY: 1 },\n '5': { point: 30, shiftY: -6 },\n '4': { point: 23, shiftY: -12 },\n },\n },\n parenthesis: {\n default: {\n point: 39,\n width: 7,\n },\n gracenote: {\n point: (39 * 3) / 5,\n width: 3,\n },\n },\n pedalMarking: {\n up: {\n point: 40,\n },\n down: {\n point: 34,\n },\n },\n // These are for numeric digits, such as in time signatures\n digits: {\n // used by timesig\n shiftLine: -1,\n point: 34,\n // used by tuplets\n tupletPoint: 22,\n shiftY: -6,\n },\n articulation: {\n articStaccatissimoAbove: {\n padding: 2,\n },\n articStaccatissimoBelow: {\n padding: 2,\n },\n },\n tremolo: {\n default: {\n point: 25,\n spacing: 5,\n offsetYStemUp: -5,\n offsetYStemDown: 5,\n offsetXStemUp: 11,\n offsetXStemDown: 1,\n },\n grace: {\n point: 18,\n spacing: 4,\n offsetYStemUp: -5,\n offsetYStemDown: 5,\n offsetXStemUp: 7,\n offsetXStemDown: 1,\n },\n },\n staveRepetition: {\n default: {\n offsetY: 25,\n offsetSymbol: 12,\n spacing: 5,\n },\n },\n // noteHead: {\n // },\n stem: {\n heightAdjustmentForFlag: -3,\n // These are stem (Y) offsets to the note heads. To shift the\n // noteheads (x-position) themselves, see glyphs.notehead.custom.\n noteHead: {\n noteheadTriangleUpHalf: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpBlack: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpWhole: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadXHalf: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXBlack: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXWhole: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadHalf: {\n offsetYBaseStemUp: -2.55,\n offsetYBaseStemDown: 2.65,\n },\n noteheadBlack: {\n offsetYBaseStemUp: -2,\n offsetYBaseStemDown: 2,\n },\n noteheadSquareWhite: {\n offsetYBaseStemDown: -5,\n offsetYBaseStemUp: 5,\n },\n },\n },\n // Values under here are used by the Glyph class to reposition and rescale\n // glyphs based on their category. This should be the first stop for\n // custom font glyph repositioning.\n //\n // The glyph loader first looks up a specific set of settings based on the\n // glyph code, and if not found, uses the defaults from the category. See\n // glyphs.textNote for an example of this.\n //\n // Details in Glyph.lookupFontMetrics.\n glyphs: {\n coda: {\n point: 20,\n shiftX: -7,\n shiftY: 8,\n },\n segno: {\n shiftX: -7,\n },\n flag: {\n shiftX: -0.75,\n tabStem: {\n shiftX: -1.75,\n },\n staveTempo: {\n shiftX: -1,\n },\n },\n clef: {\n gClef: {\n default: { scale: 1.1, shiftY: 1 },\n small: { shiftY: 1.5 },\n },\n fClef: {\n default: { shiftY: -0.5 },\n },\n },\n ornament: {\n ornamentTurn: {\n scale: 1.2,\n },\n ornamentTurnSlash: {\n scale: 1.2,\n },\n },\n stringNumber: {\n verticalPadding: 8,\n stemPadding: 2,\n leftPadding: 5,\n rightPadding: 6,\n },\n stroke: {\n arrowheadBlackDown: {\n straight: {\n shiftX: -4.5,\n },\n wiggly: {\n shiftX: -1,\n shiftY: 1,\n },\n },\n arrowheadBlackUp: {\n straight: {\n shiftX: -0.85,\n },\n wiggly: {\n shiftX: -1,\n shiftY: 1,\n },\n },\n },\n textNote: {\n point: 34,\n breathMarkTick: {\n point: 36,\n shiftY: 9,\n },\n breathMarkComma: {\n point: 36,\n },\n segno: {\n point: 30,\n shiftX: -7,\n shiftY: 8,\n },\n coda: {\n point: 20,\n shiftX: -7,\n shiftY: 8,\n },\n ornamentTrill: {\n shiftX: -8,\n shiftY: 8,\n },\n ornamentTurn: {\n point: 42,\n },\n ornamentTurnSlash: {\n point: 42,\n },\n ornamentMordent: {\n shiftX: -8,\n },\n ornamentShortTrill: {\n shiftX: -8,\n },\n },\n noteHead: {\n minPadding: 2,\n standard: {\n restQuarterStemUp: {\n point: 35,\n },\n restQuarterStemDown: {\n point: 35,\n },\n },\n custom: {\n noteheadCircleXStemUp: {\n shiftX: 1.5,\n },\n noteheadCircleXStemDown: {\n shiftX: 0.25,\n },\n noteheadDiamondHalfStemUp: {\n shiftX: 1.5,\n },\n noteheadDiamondBlackStemUp: {\n shiftX: 1.5,\n },\n noteheadDiamondWholeStemUp: {\n shiftX: 1,\n },\n noteheadXHalfStemUp: {\n shiftX: -2,\n },\n noteheadXHalfStemDown: {\n shiftX: 1,\n },\n noteheadXWholeStemUp: {\n shiftX: -4,\n },\n noteheadXWholeStemDown: {\n shiftX: 1,\n },\n noteheadSquareWhiteStemDown: {\n shiftX: 0.25,\n },\n noteheadSquareWhiteStemUp: {\n shiftX: -0.75,\n },\n noteheadSquareBlackStemUp: {\n shiftX: -0.75,\n },\n noteheadTriangleUpWholeStemUp: {\n shiftX: -0.75,\n },\n },\n },\n chordSymbol: {\n global: {\n superscriptOffset: -400,\n subscriptOffset: 300,\n kerningOffset: -250,\n lowerKerningText: ['D', 'F', 'P', 'T', 'V', 'Y'],\n upperKerningText: ['A', 'L'],\n spacing: 100,\n superSubRatio: 0.66,\n },\n csymDiminished: {\n scale: 0.8,\n leftSideBearing: -32,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymHalfDiminished: {\n scale: 0.8,\n leftSideBearing: -32,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymAugmented: {\n scale: 1,\n leftSideBearing: 0,\n advanceWidth: 530,\n yOffset: 0,\n },\n csymParensLeftTall: {\n scale: 0.8,\n leftSideBearing: -20,\n advanceWidth: 184,\n yOffset: 250,\n },\n csymParensRightTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 189,\n yOffset: 250,\n },\n csymBracketLeftTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 328,\n yOffset: 0,\n },\n csymBracketRightTall: {\n scale: 0.8,\n leftSideBearing: 1,\n advanceWidth: 600,\n yOffset: 0,\n },\n csymParensLeftVeryTall: {\n scale: 0.9,\n leftSideBearing: 50,\n advanceWidth: 121,\n yOffset: 350,\n },\n csymParensRightVeryTall: {\n scale: 0.9,\n leftSideBearing: 0,\n advanceWidth: 111,\n yOffset: 350,\n },\n csymDiagonalArrangementSlash: {\n scale: 0.6,\n leftSideBearing: -1,\n advanceWidth: 990,\n yOffset: 0,\n },\n csymMinor: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 482,\n yOffset: 0,\n },\n csymMajorSeventh: {\n scale: 0.9,\n leftSideBearing: 200,\n yOffset: 0,\n advanceWidth: 600,\n },\n accidentalSharp: {\n scale: 0.75,\n leftSideBearing: 20,\n advanceWidth: 250,\n yOffset: -302,\n },\n accidentalFlat: {\n scale: 0.9,\n leftSideBearing: -20,\n advanceWidth: 226,\n yOffset: -184,\n },\n },\n jazzOrnaments: {\n brassScoop: {\n scale: 1.0,\n xOffset: -12,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 10,\n },\n brassDoitMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 15,\n },\n brassFallLipShort: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassLiftMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 5,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassFallRoughMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 28,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassBend: {\n scale: 1.0,\n xOffset: 2,\n yOffset: -8,\n stemUpYOffset: 25,\n reportedWidth: 5,\n },\n brassMuteClosed: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -8,\n stemUpYOffset: 25,\n reportedWidth: 5,\n },\n brassMuteOpen: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -7,\n stemUpYOffset: 25,\n reportedWidth: 5,\n },\n brassFlip: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassJazzTurn: {\n scale: 1.0,\n xOffset: 6,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassSmear: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n },\n tuplet: {\n noteHeadOffset: 20,\n stemOffset: 10,\n bottomLine: 4,\n topModifierOffset: 15,\n },\n },\n};\n","export const CustomFont = {\n resolution: 1000,\n fontFamily: 'VexFlowCustom',\n glyphs: {\n noteheadSquareWhite: {\n x_min: 0,\n x_max: 430.75,\n ha: 386,\n o: 'm 0 200 l 0 -200 l 430 -200 l 430 200 l 0 200 l 50 150 l 380 150 l 380 -150 l 50 -150 l 50 150 ',\n },\n noteheadSquareBlack: {\n x_min: 0,\n x_max: 430.75,\n ha: 386,\n o: 'm 0 200 l 0 -200 l 430 -200 l 430 200 l 0 200 ',\n },\n accidentalBuyukMucennebFlat: {\n x_min: -171.5,\n x_max: 251.8125,\n ha: 257,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 553 20 616 20 614 b 20 491 20 503 20 491 l 20 491 b 153 535 47 501 149 535 b 174 514 167 535 174 524 b 164 496 174 508 171 501 b 92 470 164 495 132 484 l 20 445 l 20 390 b 20 363 20 378 20 370 b 20 333 20 340 20 333 l 20 333 b 153 377 47 344 149 377 b 174 356 167 377 174 367 b 164 338 174 349 171 342 b 92 312 164 338 132 326 l 20 288 l 20 219 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 30 -21 -212 -21 -212 b -21 273 -21 163 -21 273 b -84 252 -21 273 -50 263 b -152 230 -133 234 -145 230 b -157 231 -155 230 -156 231 b -171 252 -166 234 -171 244 b -160 270 -171 259 -167 266 b -27 316 -159 270 -93 294 l -21 319 l -21 374 b -21 431 -21 406 -21 431 b -84 409 -21 431 -50 421 b -152 388 -133 392 -145 388 b -157 390 -155 388 -156 388 b -171 409 -166 392 -171 401 b -160 428 -171 417 -167 424 b -27 474 -159 428 -93 451 l -21 476 l -21 546 b -20 620 -21 614 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ',\n },\n accidentalBakiyeFlat: {\n x_min: -176.9375,\n x_max: 251.8125,\n ha: 257,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 503 20 616 20 614 b 20 391 20 442 20 391 b 84 424 20 391 49 406 l 147 456 l 152 456 b 153 456 153 456 153 456 b 175 435 166 456 175 446 b 172 427 175 433 174 430 b 92 380 170 420 172 421 l 20 342 l 20 245 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 54 -21 -212 -21 -212 b -21 322 -21 201 -21 322 b -85 290 -21 322 -50 308 l -148 256 l -153 256 b -155 256 -155 256 -155 256 b -176 277 -167 256 -176 266 b -174 285 -176 280 -175 283 b -93 333 -171 294 -174 292 l -21 370 l -21 494 b -20 620 -21 616 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ',\n },\n accidentalKucukMucennebSharp: {\n x_min: -1.359375,\n x_max: 255.890625,\n ha: 261,\n o: 'm 118 514 b 127 517 121 517 122 517 b 147 505 136 517 142 513 l 148 502 l 148 403 b 148 306 148 351 148 306 b 174 315 149 306 160 310 l 200 324 l 205 323 b 223 312 213 323 220 319 l 225 308 l 225 260 b 225 245 225 255 225 249 b 220 204 225 208 224 209 b 179 188 216 199 215 199 l 148 177 l 148 124 l 148 70 l 189 84 b 236 98 219 94 230 98 b 247 94 240 98 243 97 b 255 52 254 88 255 87 b 255 33 255 47 255 40 l 254 -12 l 253 -15 b 249 -22 253 -18 250 -20 l 245 -24 l 196 -41 l 148 -58 l 148 -108 b 148 -158 148 -136 148 -158 b 174 -148 148 -158 160 -154 b 204 -140 198 -140 200 -140 l 204 -140 b 224 -152 213 -140 221 -145 b 225 -201 224 -155 225 -177 b 224 -254 225 -226 224 -251 b 157 -284 220 -262 220 -262 l 148 -288 l 148 -395 l 148 -503 l 147 -506 b 127 -519 142 -514 134 -519 b 107 -506 119 -519 111 -514 l 106 -503 l 106 -403 b 106 -303 106 -316 106 -303 b 104 -303 104 -303 104 -303 b 88 -310 104 -303 96 -306 l 63 -319 b 51 -322 59 -320 55 -322 b 36 -315 46 -322 40 -319 b 31 -273 32 -309 31 -312 b 31 -258 31 -269 31 -263 l 31 -210 l 34 -206 b 40 -198 35 -204 38 -199 b 74 -186 42 -197 57 -191 l 106 -173 l 106 -123 b 106 -97 106 -112 106 -104 b 106 -72 106 -76 106 -72 b 104 -72 106 -72 106 -72 b 20 -99 89 -79 23 -99 b 0 -84 10 -99 2 -93 b -1 -37 0 -81 -1 -59 b 0 11 -1 -15 0 9 b 58 40 4 22 2 22 l 106 56 l 106 109 b 106 123 106 115 106 119 b 106 162 106 147 106 162 b 81 155 106 162 93 159 b 50 147 65 149 55 147 b 36 152 43 147 40 148 b 31 194 32 158 31 156 b 31 209 31 198 31 204 l 31 256 l 34 260 b 76 281 38 269 38 269 l 106 292 l 106 396 l 106 502 l 107 505 b 118 514 110 509 114 513 ',\n },\n accidentalKoron: {\n x_min: -20,\n x_max: 320,\n ha: 257,\n o: 'm -8 200 b -8 210 8 200 16 200 l 20 148 -199 l 23 -615 b 0 -629 9 -629 6 -629 l -21 -612 l -21 -201 l -21 216 l -20 200 m 16 200 l 310 0 l 240 0 l 16 140 l 16 -120 l 240 0 l 310 0 l 16 -200 ',\n },\n accidentalSori: {\n x_min: -10.890625,\n x_max: 299.4375,\n ha: 294,\n o: 'm 44 174 b 51 174 47 174 49 174 b 68 173 55 174 61 174 l 287 112 l 551 40 b 615 20 617 22 609 23 b 626 0 622 16 626 8 b 615 -22 626 -9 622 -18 b 613 -23 613 -23 613 -23 b 613 -23 613 -23 613 -23 b 287 -113 613 -24 597 -29 l 68 -174 b 53 -176 61 -176 57 -176 b 39 -172 47 -176 43 -174 b 27 -151 31 -167 27 -159 b 39 -129 27 -141 31 -133 b 230 -74 43 -124 20 -131 l 370 -36 l 468 -9 b 498 0 484 -4 498 -1 b 468 8 498 0 484 2 l 370 34 l 230 73 b 40 126 28 129 43 124 b 27 149 31 131 27 140 b 44 174 27 161 34 170 m 205 110 l 205 300 b 205 330 245 330 245 300 l 245 300 l 245 -300 b 245 -330 205 -330 205 -300 l 205 -300 l 205 110 l 345 90 m 345 90 l 345 330 b 345 360 385 360 385 330 l 385 330 l 385 -270 b 385 -300 345 -300 345 -270 l 345 -270 l 345 90 ',\n },\n vexAccidentalMicrotonal2: {\n x_min: -1.359375,\n x_max: 386.5625,\n ha: 394,\n o: 'm 249 535 b 257 537 251 537 253 537 b 276 524 266 537 273 533 l 277 521 l 279 419 l 279 316 l 304 323 b 337 328 319 326 330 328 b 353 316 347 328 349 324 b 355 266 355 315 355 290 b 353 215 355 241 355 217 b 319 198 349 206 347 205 b 279 187 284 190 279 188 b 279 156 279 187 279 174 b 279 136 279 151 279 144 l 279 84 l 289 87 l 330 98 b 367 105 352 102 362 105 b 378 101 372 105 375 104 b 386 61 385 95 386 94 b 386 40 386 55 386 48 l 386 -5 l 385 -8 b 374 -19 383 -12 378 -18 b 291 -40 372 -19 347 -26 b 279 -43 284 -41 279 -43 b 279 -83 279 -43 279 -59 b 279 -95 279 -87 279 -91 l 279 -145 l 304 -140 b 337 -133 321 -136 330 -133 b 349 -140 343 -133 347 -136 b 355 -181 355 -145 355 -142 l 355 -197 l 355 -210 b 349 -252 355 -249 355 -247 b 300 -269 345 -258 347 -258 b 280 -274 291 -272 281 -273 l 279 -274 l 277 -378 l 277 -483 l 276 -487 b 257 -499 273 -495 265 -499 b 238 -487 249 -499 242 -495 l 236 -483 l 236 -384 l 236 -285 l 235 -285 l 212 -291 l 170 -301 b 148 -308 159 -305 148 -306 b 147 -415 147 -308 147 -313 l 147 -523 l 145 -526 b 126 -538 141 -534 133 -538 b 106 -526 118 -538 110 -534 l 104 -523 l 104 -420 b 103 -317 104 -326 104 -317 b 103 -317 103 -317 103 -317 b 50 -330 92 -322 54 -330 b 31 -317 42 -330 35 -326 b 29 -267 29 -315 29 -315 l 29 -219 l 32 -216 b 92 -192 36 -206 36 -206 l 104 -190 l 104 -138 b 103 -87 104 -91 104 -87 b 103 -87 103 -87 103 -87 b 88 -91 103 -87 96 -88 l 49 -101 b 17 -106 32 -105 23 -106 b 6 -102 13 -106 10 -105 b -1 -62 0 -97 -1 -95 b 0 -41 -1 -56 0 -49 l 0 4 l 1 6 b 10 16 2 11 6 15 b 91 37 12 18 38 24 l 104 41 l 104 93 b 103 144 104 140 104 144 b 103 144 103 144 103 144 b 50 131 92 141 54 131 b 31 144 42 131 35 137 b 29 195 29 147 29 148 l 29 242 l 32 245 b 92 269 36 255 36 255 l 104 273 l 104 377 l 104 481 l 106 485 b 126 498 110 492 118 498 b 134 495 129 498 132 496 b 145 485 138 494 142 489 l 147 481 l 147 383 l 147 283 l 152 284 b 190 294 155 285 171 290 l 230 303 l 236 305 l 236 413 l 236 521 l 238 524 b 249 535 240 528 243 533 m 236 126 b 235 177 236 154 236 177 l 235 177 b 213 172 235 177 225 174 l 170 161 b 147 155 157 158 147 155 b 147 124 147 155 147 142 b 147 102 147 117 147 111 l 147 52 l 153 54 l 228 72 l 236 74 l 236 126 m 236 -105 b 235 -54 236 -65 236 -54 l 235 -54 b 231 -55 235 -54 234 -54 b 172 -69 227 -55 204 -62 l 149 -76 l 147 -76 l 147 -127 l 147 -179 l 152 -177 b 190 -167 155 -177 171 -173 l 230 -158 l 236 -156 l 236 -105 ',\n },\n vexAccidentalMicrotonal3: {\n x_min: 0,\n x_max: 430.75,\n ha: 360,\n o: 'm -146 537 b -138 538 -143 538 -141 538 b -118 525 -129 538 -121 533 b -117 390 -117 522 -117 521 b -115 259 -117 268 -117 259 b -115 259 -115 259 -115 259 b -59 272 -104 263 -62 272 b -39 259 -50 272 -42 267 b -37 209 -38 257 -37 233 b -39 159 -37 185 -38 162 b -85 138 -43 149 -44 149 l -117 131 l -117 21 b -115 -88 -117 -80 -117 -88 b -115 -88 -115 -88 -115 -88 b -59 -75 -104 -84 -62 -75 b -44 -81 -52 -75 -48 -77 b -38 -124 -38 -87 -38 -85 b -38 -138 -38 -124 -38 -138 b -38 -152 -38 -138 -38 -152 b -44 -195 -38 -191 -38 -190 b -85 -209 -48 -200 -48 -200 l -117 -217 l -117 -349 b -118 -486 -117 -481 -117 -482 b -138 -499 -121 -494 -129 -499 b -153 -493 -143 -499 -149 -497 b -159 -415 -158 -487 -159 -496 b -159 -355 -159 -398 -159 -379 b -159 -227 -159 -284 -159 -227 b -205 -238 -159 -227 -180 -232 b -250 -249 -230 -244 -250 -249 b -251 -386 -251 -249 -251 -311 b -252 -525 -251 -521 -251 -522 b -272 -538 -255 -534 -264 -538 b -287 -532 -277 -538 -283 -536 b -293 -452 -292 -527 -293 -536 b -293 -391 -293 -436 -293 -415 b -294 -260 -293 -269 -293 -260 b -294 -260 -294 -260 -294 -260 b -348 -272 -306 -264 -345 -272 b -368 -259 -357 -272 -365 -267 b -369 -209 -369 -257 -369 -233 b -368 -159 -369 -185 -369 -162 b -323 -139 -364 -149 -362 -148 l -293 -131 l -293 -22 b -294 87 -293 80 -293 87 b -294 87 -294 87 -294 87 b -348 75 -306 84 -345 75 b -368 88 -357 75 -365 80 b -369 138 -369 91 -369 114 b -368 188 -369 162 -369 186 b -323 209 -364 198 -362 199 l -293 216 l -293 349 b -292 486 -293 481 -293 482 b -272 499 -288 494 -280 499 b -257 493 -266 499 -261 497 b -251 414 -251 487 -251 496 b -251 354 -251 398 -251 378 b -251 226 -251 284 -251 226 b -205 238 -250 226 -230 231 b -159 249 -180 244 -159 249 b -159 385 -159 249 -159 310 b -157 525 -159 521 -159 522 b -146 537 -156 530 -151 535 z m -159 11 b -159 120 -159 98 -159 120 l -159 120 b -175 116 -160 120 -167 119 b -221 105 -184 114 -204 109 l -251 98 l -251 -12 b -251 -121 -251 -72 -251 -121 b -205 -110 -250 -121 -230 -116 b -159 -99 -180 -104 -159 -99 b -159 11 -159 -99 -159 -49 z m 89 517 b 97 519 92 518 94 519 b 117 505 106 519 114 513 b 119 376 119 502 119 501 l 119 249 l 145 258 b 176 267 169 266 172 267 b 177 267 176 267 177 267 b 196 255 186 267 192 263 l 197 252 l 197 205 b 197 181 197 195 197 187 b 193 149 197 153 197 153 b 152 131 190 144 187 143 l 119 120 l 119 10 b 119 -100 119 -62 119 -100 b 145 -91 120 -100 131 -96 b 173 -82 159 -86 171 -82 b 176 -81 174 -81 175 -81 b 196 -94 185 -81 193 -87 b 198 -151 197 -97 198 -125 b 197 -194 198 -172 197 -192 b 153 -218 193 -203 192 -204 l 119 -230 l 119 -367 l 118 -504 l 117 -507 b 97 -519 113 -514 105 -519 b 82 -512 92 -519 87 -517 b 76 -434 77 -507 76 -516 b 76 -374 76 -418 76 -398 b 76 -245 76 -303 76 -245 b 52 -254 76 -245 65 -249 b 19 -263 34 -260 25 -263 b 6 -257 13 -263 10 -261 b 0 -214 0 -251 0 -253 b 0 -200 0 -210 0 -205 b 0 -188 0 -196 0 -192 b 6 -143 0 -147 0 -149 b 46 -126 10 -139 10 -139 l 76 -115 l 76 -5 b 76 106 76 56 76 106 b 51 98 76 106 64 102 b 18 89 34 92 25 89 b 6 95 13 89 10 91 b 0 139 0 101 0 99 b 0 153 0 143 0 148 b 0 179 0 163 0 172 b 44 225 0 215 3 211 l 76 236 l 76 369 b 78 505 76 501 76 502 b 89 517 80 510 85 515 z ',\n },\n vexAccidentalMicrotonal4: {\n x_min: 0,\n x_max: 430.75,\n ha: 360,\n o: 'm 283 633 b 291 634 286 634 289 634 b 311 621 300 634 308 629 b 313 505 313 618 313 617 b 313 393 313 443 313 393 b 378 425 313 393 343 407 l 443 458 l 448 458 b 449 458 449 458 449 458 b 471 437 462 458 471 448 b 469 429 471 434 470 432 b 387 382 466 421 469 423 l 313 344 l 313 247 l 313 150 l 315 152 b 433 201 353 184 394 201 b 479 193 448 201 464 198 b 549 86 524 177 549 135 b 526 1 549 59 541 29 b 395 -143 504 -39 475 -71 b 316 -214 351 -182 341 -191 b 292 -229 302 -228 300 -229 b 272 -216 283 -229 275 -224 b 271 55 271 -212 271 -212 b 270 323 271 203 270 323 b 205 291 270 323 241 308 l 140 258 l 135 258 b 134 258 135 258 134 258 b 112 279 121 258 112 267 b 114 287 112 281 113 284 b 196 334 117 295 114 293 l 271 371 l 271 495 b 272 621 271 617 271 618 b 283 633 274 626 279 631 z m 404 133 b 391 134 400 134 395 134 b 384 134 388 134 386 134 b 318 88 358 130 335 114 l 313 81 l 313 -37 l 313 -156 l 316 -152 b 439 83 391 -71 439 22 l 439 84 b 404 133 439 115 430 128 z m -8 633 l -8 633 b 0 634 -6 634 -3 634 b 20 621 8 634 17 629 b 21 384 21 618 21 617 l 21 150 l 24 152 b 141 201 62 184 102 201 b 187 193 157 201 172 198 b 257 86 232 177 257 135 b 234 1 257 59 250 29 b 103 -143 212 -39 183 -71 b 24 -214 60 -182 49 -191 b 0 -229 10 -228 8 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 203 l -21 618 l -20 621 b -8 633 -18 626 -13 631 z m 113 133 l 113 133 b 99 134 109 134 103 134 b 93 134 97 134 94 134 b 26 88 66 130 43 114 l 21 81 l 21 -37 l 21 -156 l 25 -152 b 148 83 99 -71 148 22 l 148 84 b 113 133 148 115 138 128 z ',\n },\n vexNoteHeadRectBlack: {\n x_min: 0,\n x_max: 430.75,\n ha: 360,\n o: 'm 0 150 l 0 -150 l 430 -150 l 430 150 l 0 150 ',\n },\n vexNoteHeadRectWhite: {\n x_min: 0,\n x_max: 430.75,\n ha: 360,\n o: 'm 0 150 l 0 -150 l 430 -150 l 430 150 l 0 150 l 50 100 l 380 100 l 380 -100 l 50 -100 l 50 100',\n },\n },\n};\n","export const CustomMetrics = {\n name: 'VexFlowCustom',\n smufl: false,\n glyphs: {},\n};\n","export const GonvilleFont = {\n glyphs: {\n bracketTop: {\n x_min: 0,\n x_max: 559.421875,\n ha: 571,\n o: 'm 544 204 b 548 204 545 204 547 204 b 559 194 555 204 559 199 b 559 190 559 192 559 191 b 530 156 559 188 556 184 b 462 86 510 134 481 104 b 453 76 458 81 454 77 l 446 70 l 441 65 b 434 59 439 63 436 61 l 427 54 b 409 37 426 51 416 44 b 392 23 398 29 394 26 b 387 19 389 22 387 20 b 379 13 386 19 383 16 l 371 8 l 367 5 l 359 -1 l 337 -16 b 285 -48 319 -29 298 -41 l 279 -52 b 186 -95 255 -66 210 -87 l 175 -99 b 23 -129 127 -117 68 -129 b 17 -129 20 -129 19 -129 b 1 -123 2 -129 2 -129 b 0 -49 0 -122 0 -83 b 0 4 0 -22 0 1 b 27 11 2 9 4 9 b 185 31 78 12 145 20 b 198 34 186 31 193 33 b 314 73 234 44 277 58 b 349 88 328 79 340 84 b 353 90 352 90 353 90 b 363 94 353 90 357 93 b 371 98 367 97 371 98 b 428 129 372 98 413 120 b 461 148 441 136 454 144 b 468 151 464 149 466 151 b 472 154 469 152 470 154 b 481 161 473 155 477 158 b 525 190 490 166 518 186 l 534 197 b 540 201 536 198 539 199 b 544 204 541 202 544 204 ',\n },\n bracketBottom: {\n x_min: 0,\n x_max: 559.421875,\n ha: 571,\n o: 'm 5 127 b 14 127 6 127 9 127 b 51 126 25 127 43 127 b 175 98 93 122 138 112 l 186 94 b 279 51 210 86 255 65 b 285 47 280 51 283 48 b 319 27 291 44 311 31 l 326 22 b 359 0 332 19 352 4 l 367 -6 b 371 -9 368 -6 370 -8 l 379 -15 b 387 -22 383 -18 386 -20 l 398 -30 l 411 -40 l 417 -47 l 427 -55 l 434 -61 b 441 -66 436 -62 439 -65 l 446 -72 l 453 -77 l 462 -87 b 558 -188 490 -113 549 -176 b 559 -195 559 -191 559 -194 b 548 -205 559 -201 555 -205 b 541 -204 547 -205 544 -205 b 534 -198 539 -201 536 -199 l 525 -191 b 481 -162 518 -187 490 -167 b 472 -155 477 -159 472 -156 b 468 -152 470 -155 469 -154 b 461 -149 466 -152 464 -151 b 428 -130 454 -145 441 -137 b 371 -99 413 -122 372 -99 b 363 -95 371 -99 367 -98 b 353 -91 357 -94 353 -91 b 348 -90 353 -91 352 -91 b 332 -81 343 -87 341 -86 b 27 -12 230 -37 127 -13 b 0 -5 4 -11 2 -11 b 0 58 0 -2 0 27 b 0 122 0 88 0 120 b 5 127 1 124 4 126 ',\n },\n barlineTick: {\n x_min: -80.3125,\n x_max: 78.9375,\n ha: 81,\n o: 'm 63 191 b 69 192 65 192 66 192 b 77 188 72 192 76 191 b 78 183 78 187 78 186 b 74 158 78 179 77 172 l 66 115 b 9 -161 49 30 10 -158 b -10 -187 6 -172 -1 -181 b -34 -194 -17 -191 -25 -194 b -80 -147 -58 -194 -80 -174 b -80 -141 -80 -144 -80 -142 b 9 70 -80 -134 -73 -117 l 49 163 b 63 191 59 188 61 190 ',\n },\n breathMarkTick: {\n x_min: -80.3125,\n x_max: 78.9375,\n ha: 81,\n o: 'm 63 191 b 69 192 65 192 66 192 b 77 188 72 192 76 191 b 78 183 78 187 78 186 b 74 158 78 179 77 172 l 66 115 b 9 -161 49 30 10 -158 b -10 -187 6 -172 -1 -181 b -34 -194 -17 -191 -25 -194 b -80 -147 -58 -194 -80 -174 b -80 -141 -80 -144 -80 -142 b 9 70 -80 -134 -73 -117 l 49 163 b 63 191 59 188 61 190 ',\n },\n segno: {\n x_min: -330.75,\n x_max: 329.390625,\n ha: 336,\n o: 'm -133 483 b -117 484 -127 484 -122 484 b 31 373 -51 484 9 440 b 35 348 34 365 35 356 b -25 285 35 313 10 285 b -87 331 -55 285 -76 302 b -167 402 -100 376 -133 402 b -191 398 -175 402 -183 401 b -227 341 -215 388 -227 369 b -225 320 -227 334 -227 327 b -13 74 -209 230 -125 133 b 6 65 -4 70 5 66 l 9 63 l 10 65 b 117 231 12 68 40 112 l 189 341 l 242 424 b 268 460 262 456 264 458 b 283 464 273 463 277 464 b 308 438 296 464 308 453 l 308 437 b 287 396 308 430 308 428 l 95 98 l 59 43 l 58 41 l 65 37 b 253 -156 151 -8 217 -77 b 281 -285 272 -199 281 -244 b 148 -481 281 -381 231 -463 b 115 -485 137 -484 126 -485 b -32 -376 51 -485 -9 -442 b -36 -349 -35 -366 -36 -358 b 25 -287 -36 -315 -12 -287 b 85 -333 54 -287 74 -302 b 166 -403 99 -377 133 -403 b 190 -399 174 -403 182 -402 b 225 -342 215 -390 225 -370 b 224 -322 225 -335 225 -328 b 12 -76 208 -231 125 -134 b -8 -66 2 -72 -6 -68 l -10 -65 l -12 -66 b -118 -231 -13 -68 -42 -113 l -190 -342 l -243 -426 b -269 -462 -264 -458 -265 -458 b -284 -466 -274 -464 -279 -466 b -310 -440 -298 -466 -310 -455 l -310 -438 b -288 -398 -310 -430 -308 -430 l -96 -99 l -59 -44 l -59 -43 l -66 -38 b -281 284 -198 33 -281 158 l -281 284 b -133 483 -281 392 -220 474 m 254 177 b 266 179 258 177 262 179 b 319 149 287 179 307 167 b 329 115 326 140 329 127 b 319 79 329 102 326 90 b 268 51 307 61 287 51 b 221 72 250 51 234 58 b 205 115 210 84 205 99 b 254 177 205 142 223 170 m -281 -54 b -269 -52 -277 -52 -273 -52 b -223 -73 -253 -52 -235 -59 b -206 -116 -212 -84 -206 -101 b -216 -151 -206 -129 -209 -141 b -269 -179 -228 -170 -249 -179 b -314 -159 -285 -179 -302 -173 b -330 -116 -325 -147 -330 -131 b -281 -54 -330 -88 -313 -61 ',\n },\n coda: {\n x_min: -311.6875,\n x_max: 310.328125,\n ha: 317,\n o: 'm -9 388 b -2 390 -8 390 -5 390 b 5 388 1 390 4 390 b 19 378 10 387 16 383 b 23 333 23 371 23 371 b 24 298 23 299 24 298 b 81 276 34 298 65 285 b 213 91 145 240 190 177 b 224 24 217 76 224 36 b 257 24 224 24 235 24 b 299 19 292 24 292 24 b 310 -1 306 15 310 6 b 299 -23 310 -11 306 -19 b 257 -27 292 -27 292 -27 b 224 -29 235 -27 224 -29 b 213 -95 224 -40 217 -80 b 81 -280 190 -181 145 -244 b 24 -301 65 -290 34 -301 b 23 -335 24 -301 23 -303 l 23 -340 b 17 -381 23 -374 23 -374 b -1 -391 13 -388 5 -391 b -21 -381 -9 -391 -17 -388 b -27 -340 -27 -374 -27 -374 l -27 -335 b -28 -301 -27 -303 -27 -301 b -85 -280 -38 -301 -69 -290 b -217 -95 -149 -244 -194 -181 b -228 -29 -221 -80 -228 -40 b -259 -27 -228 -29 -238 -27 b -300 -23 -294 -27 -294 -27 b -311 -2 -307 -19 -311 -11 b -294 23 -311 8 -304 19 b -259 24 -291 23 -284 24 b -228 24 -239 24 -228 24 b -217 91 -228 36 -221 76 b -85 276 -194 177 -149 240 b -28 298 -69 285 -38 298 b -27 333 -27 298 -27 299 b -27 371 -27 362 -27 369 b -9 388 -24 378 -17 385 m -27 136 b -28 247 -27 197 -28 247 b -61 216 -31 247 -53 226 b -123 33 -95 172 -121 98 l -125 24 l -76 24 l -27 24 l -27 136 m 29 242 b 24 247 27 245 24 247 b 23 136 24 247 23 197 l 23 24 l 72 24 l 121 24 l 119 33 b 29 242 115 116 77 206 m -27 -140 l -27 -27 l -76 -27 l -125 -27 l -123 -36 b -61 -220 -121 -102 -95 -176 b -28 -251 -53 -230 -31 -251 b -27 -140 -28 -251 -27 -201 m 119 -36 l 121 -27 l 72 -27 l 23 -27 l 23 -140 b 24 -251 23 -201 24 -251 b 57 -220 27 -251 49 -230 b 119 -36 91 -176 117 -102 ',\n },\n gClef: {\n x_min: -1.359375,\n x_max: 847.96875,\n ha: 865,\n o: 'm 488 1499 b 495 1500 490 1500 492 1500 b 541 1465 507 1500 521 1490 b 679 1078 622 1372 679 1210 b 677 1050 679 1068 677 1060 b 477 642 668 893 604 764 l 443 609 l 431 596 l 431 592 l 438 562 l 449 508 l 460 458 b 481 355 475 390 481 355 b 481 355 481 355 481 355 b 490 356 481 355 485 355 b 528 358 495 356 511 358 b 558 356 540 358 552 356 b 839 95 699 338 808 237 b 847 22 845 72 847 47 b 631 -303 847 -113 766 -242 b 620 -309 623 -308 620 -309 l 620 -310 b 631 -359 620 -310 626 -333 l 646 -435 l 660 -496 b 672 -588 668 -535 672 -563 b 664 -653 672 -610 669 -630 b 383 -875 630 -792 509 -875 b 201 -810 321 -875 257 -855 b 129 -680 151 -768 129 -730 b 274 -530 129 -592 200 -530 b 351 -553 300 -530 326 -538 b 412 -669 393 -582 412 -626 b 287 -805 412 -735 366 -800 l 279 -805 l 285 -809 b 383 -830 318 -823 351 -830 b 586 -718 464 -830 540 -789 b 626 -584 612 -678 626 -631 b 619 -528 626 -566 623 -548 b 612 -495 619 -526 616 -510 b 577 -324 590 -387 577 -324 b 577 -324 577 -324 577 -324 b 568 -326 575 -324 571 -324 b 528 -334 558 -328 537 -333 b 465 -338 506 -337 485 -338 b 24 -11 269 -338 87 -206 b -1 145 8 41 -1 93 b 96 442 -1 249 32 351 b 322 714 166 541 236 626 l 352 745 l 345 782 l 332 843 l 315 921 b 303 984 310 950 304 978 b 295 1082 298 1017 295 1049 b 413 1426 295 1208 336 1329 b 488 1499 436 1456 477 1496 m 549 1301 b 541 1301 547 1301 544 1301 b 411 1207 500 1301 447 1263 b 355 1004 374 1152 355 1079 b 359 942 355 984 356 963 b 371 881 362 927 363 917 l 385 818 b 392 782 389 799 392 784 l 392 782 b 434 828 393 782 424 816 b 607 1165 534 941 594 1060 b 608 1193 608 1175 608 1183 b 597 1270 608 1224 604 1254 b 549 1301 589 1286 571 1299 m 398 528 b 393 555 396 542 393 553 b 392 555 393 555 393 555 b 317 470 390 555 347 505 b 190 298 266 408 212 334 b 127 70 148 227 127 148 b 155 -77 127 19 137 -30 b 468 -303 209 -216 333 -303 b 519 -299 484 -303 502 -302 b 568 -284 541 -295 568 -287 l 568 -284 b 563 -263 568 -284 566 -274 l 534 -120 l 511 -13 l 496 61 l 480 133 b 469 187 472 176 469 187 b 468 188 469 187 469 188 b 416 162 462 188 430 172 b 337 13 364 126 337 69 b 413 -124 337 -40 363 -93 b 428 -144 424 -131 428 -137 b 428 -149 428 -145 428 -148 b 409 -166 426 -161 419 -166 b 394 -162 405 -166 400 -165 b 240 77 302 -122 240 -27 l 240 77 b 430 342 240 197 315 301 l 436 344 l 426 394 l 398 528 m 548 194 b 526 195 540 195 532 195 b 519 195 524 195 521 195 l 514 195 l 518 177 l 539 79 l 552 15 l 566 -48 l 594 -187 l 605 -240 b 612 -266 609 -254 611 -266 b 612 -266 612 -266 612 -266 b 641 -248 613 -266 630 -256 b 744 -98 692 -212 730 -156 b 751 -40 749 -79 751 -59 b 548 194 751 76 665 181 ',\n },\n cClef: {\n x_min: 0,\n x_max: 873.828125,\n ha: 892,\n o: 'm 0 0 l 0 703 l 81 703 l 164 703 l 164 0 l 164 -705 l 81 -705 l 0 -705 l 0 0 m 225 0 l 225 703 l 246 703 l 268 703 l 268 366 l 268 30 l 274 36 b 314 79 284 44 302 63 b 413 302 357 137 392 213 b 432 327 419 324 421 327 b 449 306 443 327 447 322 b 611 115 457 195 529 115 b 651 122 624 115 638 117 b 728 316 705 140 724 188 b 729 388 728 342 729 366 b 671 635 729 533 711 602 b 581 662 649 652 616 662 b 477 637 545 662 510 653 l 475 635 l 477 634 b 503 627 488 632 495 631 b 545 556 532 612 545 584 b 491 480 545 524 526 491 b 465 474 481 476 473 474 b 379 563 417 474 379 516 b 389 602 379 576 382 588 b 541 691 409 641 479 681 b 582 694 555 692 568 694 b 865 462 714 694 834 598 b 873 392 871 440 873 416 b 865 317 873 367 871 341 b 639 84 839 194 748 101 b 612 83 630 83 620 83 b 511 116 577 83 543 94 b 504 120 509 119 506 120 b 504 120 504 120 504 120 b 469 59 504 120 488 93 l 432 -1 l 469 -61 b 504 -122 488 -94 504 -122 b 504 -122 504 -122 504 -122 b 511 -117 506 -122 509 -120 b 612 -84 543 -95 577 -84 b 665 -91 630 -84 647 -87 b 869 -338 771 -122 850 -216 b 873 -392 872 -356 873 -374 b 798 -595 873 -469 847 -539 b 581 -695 741 -662 660 -695 b 406 -626 517 -695 454 -671 b 381 -563 389 -607 381 -585 b 465 -477 381 -519 413 -477 b 545 -559 514 -477 545 -519 b 503 -628 545 -587 532 -613 b 477 -635 495 -632 488 -634 l 475 -637 l 477 -638 b 581 -663 510 -655 545 -663 b 671 -637 616 -663 649 -653 b 729 -391 711 -603 729 -534 b 728 -317 729 -367 728 -344 b 623 -117 722 -173 698 -124 b 611 -116 619 -116 615 -116 b 449 -308 528 -116 457 -198 b 432 -328 447 -323 443 -328 b 413 -303 421 -328 419 -326 b 314 -80 392 -215 357 -138 b 274 -37 302 -65 284 -45 l 268 -31 l 268 -367 l 268 -705 l 246 -705 l 225 -705 l 225 0 ',\n },\n fClef: {\n x_min: -1.359375,\n x_max: 899.703125,\n ha: 918,\n o: 'm 307 349 b 332 351 315 351 323 351 b 443 340 367 351 408 347 b 741 47 607 306 720 195 b 744 0 743 31 744 16 b 660 -303 744 -90 713 -206 b 28 -755 534 -531 304 -695 b 14 -756 23 -755 19 -756 b -1 -741 4 -756 -1 -750 b 21 -720 -1 -731 1 -728 b 567 -56 337 -601 548 -344 b 568 -11 568 -41 568 -24 b 442 285 568 129 525 233 b 325 319 406 308 367 319 b 93 177 232 319 137 266 b 84 154 91 170 84 155 b 84 154 84 154 84 154 b 88 156 84 154 85 155 b 159 177 110 170 134 177 b 257 134 194 177 231 162 b 294 41 281 108 294 73 b 171 -97 294 -24 246 -90 b 156 -98 166 -97 161 -98 b 6 74 73 -98 6 -22 b 6 80 6 76 6 79 b 307 349 10 223 141 340 m 839 215 b 845 216 841 216 842 216 b 862 213 852 216 860 215 b 899 163 887 206 899 184 b 872 117 899 145 890 127 b 847 111 865 112 856 111 b 808 130 833 111 818 117 b 796 162 800 140 796 151 b 839 215 796 187 812 212 m 839 -112 b 845 -112 841 -112 842 -112 b 862 -115 852 -112 860 -113 b 899 -165 887 -122 899 -144 b 872 -210 899 -183 890 -201 b 847 -217 865 -215 856 -217 b 808 -198 833 -217 818 -210 b 796 -165 800 -188 796 -177 b 839 -112 796 -140 812 -116 ',\n },\n unpitchedPercussionClef1: {\n x_min: 0,\n x_max: 464.140625,\n ha: 474,\n o: 'm 0 0 l 0 347 l 76 347 l 153 347 l 153 0 l 153 -348 l 76 -348 l 0 -348 l 0 0 m 308 -1 l 308 347 l 386 347 l 464 347 l 464 -1 l 464 -348 l 386 -348 l 308 -348 l 308 -1 ',\n },\n '6stringTabClef': {\n x_min: -1.359375,\n x_max: 680.5625,\n ha: 694,\n o: 'm 597 1042 b 604 1042 600 1042 602 1042 b 642 1002 627 1042 642 1022 b 619 966 642 988 635 974 b 439 927 574 942 503 927 l 426 927 l 426 921 b 430 838 428 893 430 866 b 345 480 430 696 398 560 b 179 391 307 423 249 391 b 156 392 171 391 164 392 b 138 394 149 394 142 394 b 103 434 115 396 103 416 b 129 471 103 451 111 466 b 141 474 133 473 137 474 b 172 459 153 474 164 469 b 181 455 175 456 176 455 b 187 456 182 455 185 455 b 253 520 212 460 234 483 b 315 836 294 605 315 714 b 311 928 315 867 314 898 b 302 945 310 943 311 942 b 245 953 283 950 262 953 b 130 891 193 953 149 931 b 84 860 119 870 102 860 b 36 905 61 860 39 877 b 36 910 36 907 36 909 b 80 970 36 931 50 949 b 249 1017 125 1000 187 1017 b 322 1009 273 1017 299 1014 l 341 1003 b 436 991 372 995 406 991 b 577 1031 495 991 545 1004 b 597 1042 583 1038 590 1041 m 416 360 b 424 360 419 360 421 360 b 481 309 454 360 479 338 b 503 145 484 280 495 199 b 585 -185 525 16 555 -106 b 630 -245 596 -213 613 -237 l 634 -247 l 638 -245 b 647 -244 641 -245 645 -244 b 680 -278 666 -244 680 -262 b 664 -308 680 -290 675 -301 b 638 -312 658 -310 650 -312 b 613 -309 631 -312 623 -310 b 477 -201 555 -303 502 -260 b 417 -2 460 -159 434 -72 b 416 5 417 1 416 5 b 416 5 416 5 416 5 b 411 -5 415 5 413 0 b 359 -97 397 -33 377 -70 b 353 -106 355 -102 353 -105 b 359 -112 353 -108 355 -109 b 409 -130 375 -123 390 -129 b 426 -134 420 -130 421 -131 b 431 -147 428 -137 431 -141 b 420 -162 431 -152 427 -159 b 382 -169 409 -166 396 -169 b 323 -155 363 -169 341 -165 l 317 -152 l 314 -155 b 62 -303 240 -240 148 -295 b 36 -305 55 -305 44 -305 b 23 -303 29 -305 24 -305 b -1 -273 6 -299 -1 -287 b 31 -240 -1 -256 10 -240 b 36 -240 32 -240 34 -240 b 42 -241 38 -241 39 -241 b 134 -204 63 -241 99 -226 b 367 288 265 -115 357 81 b 375 330 368 313 370 320 b 416 360 383 347 400 358 m 360 -359 b 379 -359 363 -359 371 -359 b 424 -360 396 -359 416 -359 b 646 -502 536 -373 624 -430 b 649 -527 649 -510 649 -519 b 530 -673 649 -578 604 -635 l 521 -677 l 529 -681 b 653 -811 592 -714 637 -762 b 660 -853 658 -827 660 -839 b 645 -911 660 -873 656 -892 b 426 -1021 608 -981 519 -1021 b 283 -989 377 -1021 328 -1011 b 235 -949 249 -972 239 -964 b 234 -936 234 -946 234 -941 b 234 -928 234 -934 234 -931 l 235 -925 l 234 -927 l 225 -934 b 87 -982 186 -966 138 -982 b 80 -982 85 -982 83 -982 b 55 -981 70 -981 58 -981 b 17 -943 32 -981 17 -964 b 54 -904 17 -921 35 -904 b 78 -914 62 -904 72 -909 l 83 -918 l 88 -918 b 190 -831 122 -918 166 -881 b 269 -506 242 -727 269 -612 b 268 -462 269 -492 269 -477 b 266 -449 266 -458 266 -452 b 265 -444 266 -445 266 -444 b 257 -446 264 -444 261 -445 b 132 -545 196 -470 152 -505 b 88 -573 122 -563 104 -573 b 39 -523 63 -573 39 -553 b 63 -476 39 -505 44 -494 b 360 -359 136 -408 235 -369 m 419 -424 b 393 -423 411 -423 406 -423 l 375 -423 l 377 -426 b 379 -439 377 -427 378 -434 b 383 -510 382 -463 383 -487 b 314 -811 383 -609 360 -710 b 266 -893 296 -850 285 -870 b 264 -898 265 -896 264 -898 l 264 -898 b 264 -898 264 -898 264 -898 b 268 -898 264 -898 266 -898 b 273 -898 270 -898 272 -898 b 300 -909 283 -898 291 -900 b 426 -957 340 -941 385 -957 b 476 -949 443 -957 460 -954 b 547 -853 522 -931 547 -893 b 485 -745 547 -816 526 -775 b 397 -707 460 -727 432 -714 b 366 -675 375 -703 366 -692 b 396 -642 366 -657 377 -645 b 530 -557 455 -637 511 -601 b 536 -527 534 -548 536 -537 b 419 -424 536 -480 490 -437 ',\n },\n timeSig0: {\n x_min: 0,\n x_max: 514.5,\n ha: 525,\n o: 'm 236 648 b 246 648 238 648 242 648 b 288 646 261 648 283 648 b 472 513 364 634 428 587 b 514 347 502 464 514 413 b 462 163 514 272 499 217 b 257 44 409 83 333 44 b 50 163 181 44 103 83 b 0 347 14 217 0 272 b 40 513 0 413 12 464 b 236 648 87 591 155 638 m 277 614 b 253 616 273 616 261 616 b 242 616 247 616 243 616 b 170 499 193 609 181 589 b 159 348 163 446 159 398 b 166 222 159 308 161 266 b 201 91 174 138 183 106 b 257 76 215 81 235 76 b 311 91 277 76 299 81 b 347 222 330 106 338 138 b 353 348 352 266 353 308 b 344 499 353 398 351 446 b 277 614 333 587 322 606 m 257 -1 l 258 -1 l 255 -1 l 257 -1 m 257 673 l 258 673 l 255 673 l 257 673 ',\n },\n timeSig1: {\n x_min: -1.359375,\n x_max: 344.359375,\n ha: 351,\n o: 'm 126 637 l 129 638 l 198 638 l 266 638 l 269 635 b 274 631 272 634 273 632 l 277 627 l 277 395 b 279 156 277 230 277 161 b 329 88 281 123 295 106 b 344 69 341 81 344 79 b 337 55 344 62 343 59 l 333 54 l 197 54 l 61 54 l 58 55 b 50 69 53 59 50 62 b 65 88 50 79 53 81 b 80 97 72 91 74 93 b 117 156 103 113 112 129 b 117 345 117 161 117 222 l 117 528 l 100 503 l 38 406 b 14 383 24 384 23 383 b -1 398 5 383 -1 390 b 4 415 -1 403 1 409 b 16 437 5 416 10 426 l 72 539 l 100 596 b 121 632 119 631 119 631 b 126 637 122 634 125 635 m 171 -1 l 172 -1 l 170 -1 l 171 -1 m 171 673 l 172 673 l 170 673 l 171 673 ',\n },\n timeSig2: {\n x_min: -1.359375,\n x_max: 458.6875,\n ha: 468,\n o: 'm 197 648 b 216 648 201 648 208 648 b 258 646 232 648 253 648 b 419 546 333 637 393 599 b 432 489 428 528 432 509 b 356 342 432 440 405 384 b 235 278 322 313 288 295 b 69 170 166 256 107 217 b 69 169 69 170 69 169 b 69 169 69 169 69 169 b 74 173 69 169 72 170 b 209 222 112 204 163 222 b 310 195 247 222 274 215 b 371 179 332 184 352 179 b 396 181 379 179 387 179 b 428 202 409 184 423 194 b 442 212 431 209 436 212 b 458 197 450 212 458 206 b 441 148 458 190 449 165 b 299 44 409 84 353 44 b 288 45 295 44 292 44 b 250 61 274 45 268 49 b 122 99 212 86 164 99 b 73 91 104 99 88 97 b 28 63 53 84 34 72 b 14 54 25 56 20 54 b 1 62 9 54 4 56 l -1 65 l -1 79 b 0 99 -1 91 0 95 b 2 113 1 102 2 108 b 164 309 20 197 81 272 b 285 470 232 341 277 398 b 287 487 287 476 287 481 b 171 595 287 551 239 595 b 155 595 166 595 160 595 b 142 592 145 594 142 594 b 145 589 142 592 142 591 b 179 527 168 576 179 551 b 132 455 179 496 163 467 b 104 451 122 452 112 451 b 27 530 62 451 27 487 b 29 555 27 538 27 546 b 197 648 44 601 115 639 m 228 -1 l 230 -1 l 227 -1 l 228 -1 m 228 673 l 230 673 l 227 673 l 228 673 ',\n },\n timeSig3: {\n x_min: -1.359375,\n x_max: 409.6875,\n ha: 418,\n o: 'm 174 648 b 191 648 176 648 183 648 b 225 648 204 648 220 648 b 402 523 317 638 389 588 b 404 503 404 517 404 510 b 402 484 404 495 404 488 b 264 373 389 437 334 394 b 257 370 259 371 257 371 b 257 370 257 370 257 370 b 264 369 258 370 261 369 b 409 202 359 334 409 267 b 318 72 409 152 381 104 b 200 43 281 52 240 43 b 23 113 134 43 69 68 b 0 169 6 129 0 149 b 77 249 0 210 29 249 l 77 249 b 152 174 125 249 152 212 b 103 102 152 145 137 116 b 103 102 103 102 103 102 b 147 94 103 101 132 95 b 153 94 149 94 151 94 b 265 206 219 94 265 141 b 264 226 265 213 265 219 b 147 355 253 299 204 353 b 126 371 133 356 126 362 b 147 388 126 383 132 388 b 254 474 196 391 238 424 b 259 502 258 484 259 494 b 182 592 259 544 228 582 b 156 595 175 595 166 595 b 115 592 142 595 129 594 l 111 591 l 115 588 b 152 524 141 574 152 549 b 92 449 152 491 130 458 b 76 448 87 448 81 448 b -1 530 32 448 -1 488 b 20 581 -1 548 5 566 b 174 648 55 619 108 641 m 204 -1 l 205 -1 l 202 -1 l 204 -1 m 204 673 l 205 673 l 202 673 l 204 673 ',\n },\n timeSig4: {\n x_min: 0,\n x_max: 468.21875,\n ha: 478,\n o: 'm 174 637 b 232 638 175 638 189 638 b 277 638 245 638 259 638 l 378 638 l 381 635 b 389 623 386 632 389 627 b 382 609 389 617 386 613 b 366 589 381 606 372 598 l 313 528 l 245 451 l 209 410 l 155 348 l 84 267 b 59 240 72 252 59 240 b 59 240 59 240 59 240 b 151 238 59 238 68 238 l 242 238 l 242 303 b 243 371 242 369 242 370 b 289 426 245 374 254 385 l 303 441 l 317 456 l 338 483 l 360 506 l 371 520 b 386 527 375 526 381 527 b 400 519 392 527 397 524 b 401 440 401 516 401 514 b 401 377 401 423 401 402 l 401 238 l 426 238 b 453 237 449 238 450 238 b 465 217 461 234 465 226 b 460 202 465 212 464 206 b 426 197 454 197 453 197 l 401 197 l 401 180 b 451 88 402 129 412 109 b 468 69 465 81 468 79 b 461 55 468 62 466 59 l 458 54 l 321 54 l 185 54 l 182 55 b 175 69 176 59 175 62 b 191 88 175 79 176 81 b 240 180 230 109 240 129 l 240 197 l 125 197 b 73 195 104 195 87 195 b 8 197 10 195 9 197 b 0 212 2 199 0 205 b 0 212 0 212 0 212 b 20 242 0 219 0 219 b 163 610 104 344 163 492 b 174 637 163 628 166 634 m 234 -1 l 235 -1 l 232 -1 l 234 -1 m 234 673 l 235 673 l 232 673 l 234 673 ',\n },\n timeSig5: {\n x_min: 0,\n x_max: 409.6875,\n ha: 418,\n o: 'm 47 637 b 53 638 49 638 50 638 b 69 634 55 638 61 637 b 210 610 114 619 161 610 b 363 634 259 610 311 619 b 382 638 372 637 378 638 b 392 634 386 638 389 637 b 397 623 396 630 397 627 b 393 610 397 620 396 616 b 298 505 368 552 338 520 b 212 494 277 498 246 494 b 65 517 163 494 106 502 b 61 517 62 517 61 517 b 61 517 61 517 61 517 b 51 408 61 517 51 412 b 51 408 51 408 51 408 b 51 408 51 408 51 408 b 61 412 53 408 55 409 b 125 434 80 421 103 430 b 185 441 145 440 166 441 b 409 244 310 441 409 353 b 401 191 409 227 406 209 b 197 43 375 105 287 43 b 159 47 183 43 171 44 b 23 123 112 56 61 86 b 0 180 6 140 0 159 b 76 260 0 220 31 260 b 92 259 81 260 87 259 b 152 183 132 251 152 216 b 100 112 152 152 134 122 b 95 111 98 112 95 111 b 95 111 95 111 95 111 b 129 98 95 109 119 101 b 148 97 136 97 141 97 b 264 235 206 97 261 158 b 265 248 265 240 265 244 b 210 398 265 312 243 373 b 179 408 201 406 194 408 b 174 408 178 408 176 408 b 53 369 130 408 88 394 b 34 359 39 359 38 359 b 17 374 24 359 17 365 b 39 628 17 384 38 625 b 47 637 40 631 43 635 m 204 -1 l 205 -1 l 202 -1 l 204 -1 m 204 673 l 205 673 l 202 673 l 204 673 ',\n },\n timeSig6: {\n x_min: 0,\n x_max: 475.03125,\n ha: 485,\n o: 'm 255 648 b 274 648 259 648 266 648 b 314 646 288 648 307 648 b 450 555 374 637 438 594 b 454 530 453 546 454 538 b 375 451 454 485 416 451 b 328 467 359 451 343 455 b 300 526 310 483 300 503 b 352 598 300 557 319 589 b 356 599 355 598 356 599 b 352 602 356 599 355 601 b 288 616 330 612 308 616 b 210 584 257 616 230 605 b 164 433 189 559 174 508 b 160 374 163 415 160 381 b 160 374 160 374 160 374 b 160 374 160 374 160 374 b 168 377 160 374 164 376 b 258 395 200 390 228 395 b 366 367 294 395 328 387 b 475 223 436 333 475 283 b 472 197 475 215 473 206 b 349 65 462 141 419 95 b 259 43 317 51 288 43 b 167 69 230 43 200 52 b 4 290 80 113 20 195 b 0 349 1 309 0 328 b 20 467 0 391 6 433 b 255 648 58 563 155 637 m 269 363 b 257 363 265 363 261 363 b 210 345 236 363 220 356 b 186 226 196 324 186 272 b 187 198 186 216 186 206 b 213 95 191 151 202 112 b 257 76 221 83 238 76 b 270 77 261 76 266 76 b 321 156 299 81 310 99 b 329 229 326 183 329 206 b 321 301 329 252 326 274 b 269 363 311 342 298 359 m 236 -1 l 238 -1 l 235 -1 l 236 -1 m 236 673 l 238 673 l 235 673 l 236 673 ',\n },\n timeSig7: {\n x_min: 0,\n x_max: 442.359375,\n ha: 451,\n o: 'm 147 648 b 166 649 153 649 160 649 b 313 598 217 649 273 630 b 340 587 323 588 328 587 l 341 587 b 412 628 367 587 390 601 b 427 638 416 635 421 638 b 439 632 431 638 435 637 b 442 623 441 630 442 628 b 430 569 442 616 439 603 b 352 369 408 492 377 410 b 300 259 325 324 313 298 b 273 84 283 205 273 140 b 265 55 273 65 272 59 l 261 54 l 181 54 l 99 54 l 96 55 b 91 61 95 56 92 59 l 89 63 l 89 77 b 147 263 89 133 111 202 b 261 401 176 313 212 355 b 378 541 315 449 349 489 l 382 548 l 375 544 b 240 495 333 512 285 495 b 129 535 198 495 160 509 b 84 560 108 552 95 560 b 76 559 81 560 78 560 b 31 487 59 555 43 530 b 14 470 27 473 24 470 b 1 477 8 470 4 471 l 0 480 l 0 553 l 0 627 l 1 630 b 16 638 4 635 9 638 b 23 635 17 638 20 637 b 49 626 36 626 39 626 b 96 638 59 626 80 630 b 104 639 99 638 102 639 b 117 644 107 641 112 642 b 147 648 125 645 137 648 m 220 -1 l 221 -1 l 219 -1 l 220 -1 m 220 673 l 221 673 l 219 673 l 220 673 ',\n },\n timeSig8: {\n x_min: 0,\n x_max: 488.640625,\n ha: 499,\n o: 'm 217 648 b 245 649 225 648 235 649 b 453 516 343 649 430 595 b 458 478 455 503 458 491 b 412 370 458 440 441 398 b 411 369 412 369 411 369 b 415 365 411 367 412 367 b 488 231 462 331 488 281 b 472 165 488 208 483 186 b 243 43 434 86 338 43 b 63 104 178 43 112 62 b 0 233 20 140 0 186 b 73 365 0 283 24 331 l 77 369 l 72 374 b 29 476 42 406 29 441 b 217 648 29 557 103 635 m 258 605 b 242 606 253 605 247 606 b 157 552 198 606 157 580 b 160 541 157 548 159 544 b 319 413 176 503 242 452 l 337 403 l 338 406 b 359 476 352 428 359 452 b 258 605 359 537 318 595 m 138 326 b 130 330 134 328 130 330 b 130 330 130 330 130 330 b 107 305 127 330 112 313 b 84 231 91 281 84 256 b 243 86 84 156 151 86 b 249 87 245 86 246 87 b 347 156 303 88 347 120 b 344 172 347 162 345 167 b 156 319 325 227 257 281 b 138 326 151 322 144 324 m 243 -1 l 245 -1 l 242 -1 l 243 -1 m 243 673 l 245 673 l 242 673 l 243 673 ',\n },\n timeSig9: {\n x_min: 0,\n x_max: 475.03125,\n ha: 485,\n o: 'm 191 646 b 212 649 198 648 205 649 b 255 644 227 649 243 646 b 458 448 348 616 428 539 b 475 342 469 415 475 378 b 460 244 475 308 469 274 b 193 44 421 124 303 44 b 91 69 157 44 122 51 b 19 161 43 97 19 126 b 21 181 19 167 20 174 b 98 241 32 220 65 241 b 170 186 129 241 160 223 b 172 166 171 179 172 173 b 121 94 172 134 152 102 b 117 93 118 94 117 93 b 121 90 117 93 118 91 b 185 76 142 80 164 76 b 270 119 220 76 251 91 b 308 259 287 145 300 194 b 313 317 310 277 313 310 b 313 317 313 317 313 317 b 313 317 313 317 313 317 b 304 315 313 317 308 316 b 216 295 273 302 245 295 b 145 308 193 295 170 299 b 19 398 88 327 42 360 b 0 469 5 420 0 444 b 24 551 0 496 8 526 b 191 646 54 596 125 637 m 227 614 b 215 616 224 616 220 616 b 202 614 210 616 206 616 b 152 535 174 610 163 592 b 144 463 147 509 144 485 b 152 391 144 440 147 417 b 216 328 163 344 179 328 b 280 391 253 328 269 344 b 288 463 285 417 288 440 b 280 535 288 485 285 509 b 227 614 269 594 258 610 m 236 -1 l 238 -1 l 235 -1 l 236 -1 m 236 673 l 238 673 l 235 673 l 236 673 ',\n },\n timeSigCommon: {\n x_min: -1.359375,\n x_max: 556.6875,\n ha: 568,\n o: 'm 294 322 b 318 323 299 322 308 323 b 360 320 334 323 352 322 b 526 217 430 310 490 273 b 543 166 537 202 543 184 b 447 70 543 117 503 70 b 445 70 447 70 446 70 b 359 159 394 72 359 113 b 368 201 359 173 362 187 b 442 245 382 229 412 245 b 455 244 446 245 451 245 b 460 244 458 244 460 244 b 460 244 460 244 460 244 b 454 248 460 244 458 245 b 325 291 417 276 372 291 b 285 287 313 291 299 290 b 144 -2 183 269 144 190 b 281 -290 144 -208 179 -280 b 304 -291 289 -291 298 -291 b 524 -105 412 -291 506 -212 b 541 -84 526 -88 530 -84 b 556 -101 551 -84 556 -90 b 549 -138 556 -111 553 -122 b 334 -322 521 -237 435 -310 b 302 -324 323 -323 313 -324 b 13 -101 172 -324 54 -234 b -1 -1 4 -68 -1 -34 b 294 322 -1 161 121 303 ',\n },\n timeSigCutCommon: {\n x_min: 0,\n x_max: 556.6875,\n ha: 568,\n o: 'm 289 545 b 298 546 292 545 295 546 b 318 533 306 546 315 541 b 319 428 319 530 319 528 l 319 327 l 334 327 b 526 223 412 326 485 285 b 543 172 537 206 543 190 b 447 76 543 122 503 76 b 445 76 446 76 446 76 b 359 165 394 77 359 119 b 368 205 359 179 362 192 b 441 251 382 233 412 251 b 455 249 446 251 451 251 b 460 248 458 249 460 248 b 460 248 460 248 460 248 b 454 254 460 249 458 251 b 334 295 419 280 378 294 l 319 295 l 319 4 l 319 -287 l 321 -285 b 328 -285 322 -285 325 -285 b 524 -99 424 -277 507 -198 b 541 -79 526 -84 530 -79 b 556 -97 551 -79 556 -84 b 548 -133 556 -105 553 -117 b 334 -317 521 -233 434 -306 b 322 -319 329 -317 323 -317 l 319 -319 l 319 -424 b 319 -471 319 -444 319 -459 b 313 -541 319 -544 318 -535 b 298 -548 308 -545 303 -548 b 279 -534 289 -548 281 -542 b 277 -424 277 -531 277 -530 l 277 -317 l 273 -317 b 13 -95 153 -305 51 -217 b 0 2 4 -62 0 -29 b 182 295 0 126 66 238 b 274 324 210 309 249 320 l 277 324 l 277 427 b 279 533 277 528 277 530 b 289 545 281 538 285 542 m 277 2 b 277 291 277 161 277 291 b 268 288 277 291 273 290 b 144 1 179 265 144 184 b 276 -284 144 -199 175 -267 l 277 -285 l 277 2 ',\n },\n timeSigPlus: {\n x_min: 0,\n x_max: 319.859375,\n ha: 326,\n o: 'm 149 508 b 159 509 152 509 155 509 b 186 494 170 509 181 503 b 190 440 190 487 190 488 l 190 430 l 190 377 l 242 377 l 251 377 b 303 373 298 377 296 377 b 319 345 314 367 319 356 b 304 319 319 335 314 324 b 250 315 296 315 299 315 l 242 315 l 190 315 l 190 262 l 190 252 b 186 198 190 204 190 205 b 159 183 179 188 170 183 b 132 198 148 183 138 188 b 127 252 127 205 127 204 l 127 262 l 127 315 l 76 315 l 68 315 b 14 319 20 315 21 315 b 0 347 4 324 0 335 b 14 373 0 356 4 367 b 68 377 21 377 20 377 l 76 377 l 127 377 l 127 430 l 127 440 b 132 494 127 488 127 487 b 149 508 136 501 142 505 ',\n },\n timeSigPlusSmall: {\n x_min: 0,\n x_max: 319.859375,\n ha: 326,\n o: 'm 149 508 b 159 509 152 509 155 509 b 186 494 170 509 181 503 b 190 440 190 487 190 488 l 190 430 l 190 377 l 242 377 l 251 377 b 303 373 298 377 296 377 b 319 345 314 367 319 356 b 304 319 319 335 314 324 b 250 315 296 315 299 315 l 242 315 l 190 315 l 190 262 l 190 252 b 186 198 190 204 190 205 b 159 183 179 188 170 183 b 132 198 148 183 138 188 b 127 252 127 205 127 204 l 127 262 l 127 315 l 76 315 l 68 315 b 14 319 20 315 21 315 b 0 347 4 324 0 335 b 14 373 0 356 4 367 b 68 377 21 377 20 377 l 76 377 l 127 377 l 127 430 l 127 440 b 132 494 127 488 127 487 b 149 508 136 501 142 505 ',\n },\n timeSigMinus: {\n x_min: 0,\n x_max: 318.5,\n ha: 325,\n o: 'm 20 376 b 167 377 23 377 96 377 b 296 376 231 377 294 377 b 318 347 311 371 318 359 b 296 316 318 333 311 320 b 159 315 294 315 227 315 b 21 316 91 315 24 315 b 0 345 6 320 0 333 b 20 376 0 359 6 371 ',\n },\n timeSigParensRight: {\n x_min: 25.859375,\n x_max: 164.6875,\n ha: 168,\n o: 'm 34 369 b 40 370 35 370 38 370 b 59 353 49 370 50 367 b 164 40 122 254 155 158 b 164 0 164 33 164 16 b 164 -40 164 -16 164 -34 b 59 -353 155 -158 122 -254 b 40 -371 53 -366 47 -371 b 34 -370 38 -371 36 -370 b 25 -358 28 -367 25 -363 b 31 -337 25 -352 27 -347 b 92 0 72 -234 92 -117 b 31 335 92 116 72 233 b 25 356 27 345 25 352 b 34 369 25 363 28 366 ',\n },\n timeSigParensRightSmall: {\n x_min: 25.859375,\n x_max: 164.6875,\n ha: 168,\n o: 'm 34 369 b 40 370 35 370 38 370 b 59 353 49 370 50 367 b 164 40 122 254 155 158 b 164 0 164 33 164 16 b 164 -40 164 -16 164 -34 b 59 -353 155 -158 122 -254 b 40 -371 53 -366 47 -371 b 34 -370 38 -371 36 -370 b 25 -358 28 -367 25 -363 b 31 -337 25 -352 27 -347 b 92 0 72 -234 92 -117 b 31 335 92 116 72 233 b 25 356 27 345 25 352 b 34 369 25 363 28 366 ',\n },\n timeSigParensLeft: {\n x_min: -166.0625,\n x_max: -25.859375,\n ha: 0,\n o: 'm -49 369 b -42 370 -46 369 -44 370 b -27 360 -36 370 -29 366 b -25 355 -27 359 -25 358 b -32 335 -25 351 -28 347 b -92 52 -66 248 -87 159 b -93 -1 -93 43 -93 20 b -92 -54 -93 -23 -93 -45 b -32 -337 -85 -162 -66 -251 b -25 -355 -27 -349 -25 -352 b -42 -371 -25 -365 -32 -371 b -61 -353 -50 -371 -51 -369 b -163 -63 -119 -262 -153 -165 b -166 -1 -166 -37 -166 -31 b -163 62 -166 30 -166 36 b -61 352 -153 163 -119 260 b -49 369 -54 365 -51 366 ',\n },\n timeSigParensLeftSmall: {\n x_min: -166.0625,\n x_max: -25.859375,\n ha: 0,\n o: 'm -49 369 b -42 370 -46 369 -44 370 b -27 360 -36 370 -29 366 b -25 355 -27 359 -25 358 b -32 335 -25 351 -28 347 b -92 52 -66 248 -87 159 b -93 -1 -93 43 -93 20 b -92 -54 -93 -23 -93 -45 b -32 -337 -85 -162 -66 -251 b -25 -355 -27 -349 -25 -352 b -42 -371 -25 -365 -32 -371 b -61 -353 -50 -371 -51 -369 b -163 -63 -119 -262 -153 -165 b -166 -1 -166 -37 -166 -31 b -163 62 -166 30 -166 36 b -61 352 -153 163 -119 260 b -49 369 -54 365 -51 366 ',\n },\n noteheadDoubleWhole: {\n x_min: 0,\n x_max: 902.421875,\n ha: 921,\n o: 'm 17 240 b 24 241 19 241 21 241 b 32 240 28 241 31 241 b 46 229 38 238 43 234 b 50 88 50 223 50 237 b 50 -1 50 63 50 34 b 50 -90 50 -36 50 -65 b 46 -231 50 -238 50 -224 b 25 -242 42 -238 34 -242 b 0 -224 14 -242 4 -235 b 0 2 0 -222 0 -108 b 0 223 0 112 0 220 b 17 240 2 230 9 237 m 110 240 b 118 241 111 241 114 241 b 126 240 121 241 123 241 b 142 223 133 237 140 230 b 144 123 144 220 144 205 b 144 29 144 45 144 29 b 144 29 144 29 144 29 b 393 183 166 106 264 167 b 450 186 412 184 431 186 b 756 29 600 186 732 120 b 756 29 756 29 756 29 b 758 123 758 29 758 45 b 760 227 758 226 758 223 b 784 241 766 237 774 241 b 804 229 792 241 800 237 b 809 88 808 223 809 237 l 809 -1 l 809 -90 b 804 -231 809 -238 808 -224 b 784 -242 800 -238 792 -242 b 762 -231 775 -242 766 -238 b 758 -124 756 -224 758 -231 b 756 -30 758 -47 758 -30 b 756 -30 756 -30 756 -30 b 509 -184 736 -108 637 -169 b 450 -187 488 -187 469 -187 b 144 -30 300 -187 168 -122 b 144 -30 144 -30 144 -30 b 144 -124 144 -30 144 -47 b 140 -231 144 -231 144 -224 b 118 -242 134 -238 126 -242 b 92 -224 107 -242 96 -235 b 92 2 92 -222 92 -108 b 92 223 92 112 92 220 b 110 240 95 230 102 237 m 432 161 b 413 162 426 162 420 162 b 313 41 351 162 313 109 b 347 -73 313 5 323 -34 b 487 -163 385 -133 439 -163 b 578 -97 526 -163 562 -142 b 588 -43 585 -80 588 -62 b 432 161 588 47 518 147 m 868 240 b 876 241 869 241 872 241 b 884 240 879 241 882 241 b 898 229 890 238 894 234 b 902 88 902 223 902 237 l 902 -1 l 902 -90 b 898 -231 902 -238 902 -224 b 876 -242 892 -238 884 -242 b 852 -224 865 -242 854 -235 b 850 2 850 -222 850 -108 b 852 223 850 112 850 220 b 868 240 853 230 860 237 ',\n },\n noteheadWhole: {\n x_min: 0,\n x_max: 619.3125,\n ha: 632,\n o: 'm 274 184 b 307 186 285 186 296 186 b 616 22 465 186 597 116 b 619 -1 617 13 619 5 b 308 -187 619 -104 483 -187 b 0 -1 133 -187 0 -102 b 5 36 0 11 1 23 b 274 184 29 115 141 176 m 289 161 b 272 162 284 162 277 162 b 171 41 209 162 171 108 b 205 -73 171 5 182 -34 b 345 -163 243 -133 298 -163 b 436 -98 385 -163 420 -142 b 446 -43 443 -80 446 -62 b 289 161 446 47 377 147 ',\n },\n noteheadHalf: {\n x_min: 0,\n x_max: 428.75,\n ha: 438,\n o: 'm 262 186 b 273 186 266 186 272 186 b 274 186 273 186 274 186 b 285 186 274 186 280 186 b 428 48 375 181 428 122 b 386 -68 428 12 416 -29 b 155 -187 329 -145 236 -187 b 12 -111 92 -187 38 -162 b 0 -51 4 -91 0 -72 b 262 186 0 58 122 179 m 366 131 b 352 134 362 133 357 134 b 219 81 321 134 269 115 b 47 -111 126 23 50 -62 b 47 -112 47 -111 47 -112 b 77 -136 47 -129 58 -136 b 264 -45 118 -136 194 -101 b 382 109 336 12 382 76 b 366 131 382 120 377 129 ',\n },\n noteheadBlack: {\n x_min: 0,\n x_max: 428.75,\n ha: 438,\n o: 'm 262 186 b 273 186 266 186 272 186 b 274 186 273 186 274 186 b 285 186 274 186 280 186 b 428 48 375 181 428 122 b 386 -68 428 12 416 -29 b 155 -187 329 -145 236 -187 b 12 -111 92 -187 38 -162 b 0 -51 4 -91 0 -72 b 262 186 0 58 122 179 ',\n },\n noteheadXWhole: {\n x_min: 0,\n x_max: 598.890625,\n ha: 611,\n o: 'm 62 181 b 77 183 66 183 72 183 b 91 181 83 183 88 183 b 202 131 100 180 106 177 l 299 87 l 394 131 b 517 183 499 181 502 183 b 519 183 517 183 518 183 b 598 104 567 183 598 144 b 577 49 598 84 592 65 b 518 15 567 38 563 37 b 484 0 499 6 484 0 b 518 -16 484 -1 499 -8 b 577 -51 563 -38 567 -40 b 598 -105 592 -66 598 -86 b 519 -184 598 -145 567 -184 b 517 -184 518 -184 517 -184 b 394 -133 502 -184 499 -183 l 299 -88 l 202 -133 b 81 -184 99 -183 95 -184 b 77 -184 80 -184 78 -184 b 0 -105 29 -184 0 -145 b 20 -51 0 -86 5 -66 b 80 -16 29 -40 34 -38 b 114 -1 98 -8 114 -1 b 80 15 114 0 98 6 b 20 49 34 37 29 38 b 0 104 6 65 0 84 b 62 181 0 140 23 174 m 88 134 b 74 136 85 134 80 136 b 68 134 72 136 69 136 b 46 104 54 130 46 117 b 55 81 46 95 49 88 b 149 34 59 76 53 80 b 224 -1 190 15 224 0 b 144 -38 224 -1 187 -18 b 54 -84 59 -79 58 -79 b 46 -105 49 -90 46 -98 b 76 -137 46 -122 58 -137 b 78 -137 77 -137 77 -137 b 194 -86 87 -137 76 -141 b 298 -36 250 -58 298 -36 b 298 -36 298 -36 298 -36 b 402 -84 299 -36 345 -58 b 518 -137 522 -141 510 -137 b 521 -137 519 -137 519 -137 b 551 -105 539 -137 551 -122 b 541 -83 551 -98 548 -90 b 447 -36 537 -77 544 -81 b 374 -1 406 -16 374 -1 b 447 34 374 0 406 15 b 541 81 544 80 537 76 b 551 104 548 88 551 97 b 521 136 551 120 539 136 b 518 136 519 136 519 136 b 517 136 518 136 517 136 l 517 136 b 402 83 511 136 511 136 b 298 34 345 56 299 34 b 298 34 298 34 298 34 b 194 84 298 34 250 56 b 88 134 137 111 89 133 ',\n },\n noteheadXHalf: {\n x_min: 0,\n x_max: 406.96875,\n ha: 415,\n o: 'm 55 181 b 70 183 61 183 66 183 b 111 170 85 183 99 179 b 160 130 115 167 137 149 l 202 95 l 245 130 b 319 181 299 176 302 179 b 334 183 325 183 330 183 b 406 109 375 183 406 148 b 401 81 406 99 405 91 b 348 24 394 65 390 59 b 318 -1 332 11 318 0 b 348 -26 318 -1 332 -12 b 401 -83 390 -61 394 -66 b 406 -111 405 -93 406 -101 b 334 -184 406 -149 375 -184 b 319 -183 330 -184 325 -184 b 245 -131 302 -180 299 -177 l 202 -97 l 160 -131 b 85 -183 107 -177 103 -180 b 70 -184 80 -184 76 -184 b 0 -111 31 -184 0 -149 b 4 -83 0 -101 1 -93 b 58 -26 10 -66 16 -61 b 88 -1 74 -12 88 -1 b 58 24 88 0 74 11 b 10 69 23 54 17 59 b 0 109 2 81 0 95 b 55 181 0 142 21 173 m 83 133 b 72 136 78 136 76 136 b 57 131 66 136 61 134 b 46 109 49 126 46 117 b 50 93 46 104 47 98 b 107 45 51 91 77 70 b 160 0 137 20 160 0 b 107 -47 160 -1 137 -22 b 50 -94 77 -72 51 -93 b 46 -111 47 -99 46 -105 b 59 -134 46 -120 50 -130 b 72 -137 62 -136 68 -137 b 83 -136 76 -137 80 -136 b 144 -84 84 -134 107 -116 b 202 -36 176 -58 202 -36 b 261 -84 202 -36 230 -58 b 323 -136 299 -116 321 -134 b 334 -137 326 -136 330 -137 b 345 -134 338 -137 343 -136 b 360 -111 355 -130 360 -120 b 355 -94 360 -105 359 -99 b 299 -47 353 -93 329 -72 b 245 0 269 -22 245 -1 b 299 45 245 0 269 20 b 355 93 329 70 353 91 b 360 109 359 98 360 104 b 345 133 360 119 355 129 b 334 136 343 134 338 136 b 323 134 330 136 326 134 b 261 83 321 133 299 115 b 202 34 230 56 202 34 b 144 83 202 34 176 56 b 83 133 106 115 84 133 ',\n },\n noteheadXBlack: {\n x_min: 0,\n x_max: 406.96875,\n ha: 415,\n o: 'm 21 183 b 28 183 24 183 25 183 b 42 181 34 183 39 183 b 127 108 47 179 47 179 b 202 41 168 72 202 41 b 279 108 204 41 238 72 b 357 177 321 145 356 176 b 375 183 363 181 370 183 b 406 151 392 183 406 169 b 404 137 406 147 405 141 b 322 62 401 131 398 129 b 251 0 284 27 251 0 b 322 -63 251 -1 284 -29 b 404 -138 398 -130 401 -133 b 406 -152 405 -142 406 -148 b 375 -184 406 -170 392 -184 b 357 -179 370 -184 363 -183 b 279 -109 356 -177 321 -147 b 202 -43 238 -73 204 -43 b 127 -109 202 -43 168 -73 b 49 -179 85 -147 50 -177 b 31 -184 43 -183 36 -184 b 0 -152 13 -184 0 -170 b 2 -138 0 -148 0 -142 b 83 -63 5 -133 8 -130 b 155 0 122 -29 155 -1 b 83 62 155 0 122 27 b 8 129 43 97 10 127 b 0 151 2 136 0 144 b 21 183 0 165 8 177 ',\n },\n noteheadCircleX: {\n x_min: 0,\n x_max: 484.5625,\n ha: 494,\n o: 'm 228 245 b 239 247 234 247 239 247 b 243 247 240 247 242 247 b 303 238 257 247 287 242 b 484 -2 417 208 484 104 b 412 -177 484 -65 461 -127 b 243 -248 363 -226 303 -248 b 6 -63 138 -248 36 -180 b 0 -1 1 -41 0 -20 b 228 245 0 127 98 240 m 255 181 b 240 183 247 183 245 183 b 232 181 238 183 235 183 b 142 152 200 180 168 170 l 138 149 l 190 97 l 242 44 l 294 97 l 345 149 l 340 152 b 255 181 315 169 284 180 m 147 -54 l 197 -1 l 147 51 l 95 104 l 91 99 b 62 -1 72 70 62 34 b 66 -43 62 -15 63 -29 b 91 -101 72 -63 80 -84 l 95 -106 l 147 -54 m 393 99 b 389 104 390 102 389 104 b 337 51 389 104 366 80 l 285 -1 l 337 -54 l 389 -106 l 393 -101 b 421 -1 412 -72 421 -36 b 393 99 421 34 412 69 m 294 -98 b 242 -45 265 -69 242 -45 b 190 -98 242 -45 219 -69 l 138 -151 l 142 -154 b 242 -184 172 -174 206 -184 b 340 -154 276 -184 311 -174 l 345 -151 l 294 -98 ',\n },\n noteheadTriangleUpWhole: {\n x_min: 0,\n x_max: 630.203125,\n ha: 643,\n o: 'm 308 204 b 314 205 310 205 313 205 b 326 201 319 205 323 204 b 355 154 328 199 338 180 b 401 83 362 142 392 95 l 409 72 b 431 41 412 66 424 49 b 619 -174 498 -51 570 -134 b 630 -192 626 -180 630 -186 b 626 -202 630 -195 628 -199 b 616 -206 623 -205 620 -206 b 552 -188 608 -206 592 -202 b 310 -155 488 -169 392 -155 b 268 -156 295 -155 281 -155 b 77 -188 197 -161 126 -173 b 13 -206 35 -202 20 -206 b 9 -206 12 -206 10 -206 b 0 -191 2 -202 0 -197 b 8 -176 0 -186 2 -180 b 204 49 58 -136 138 -43 l 220 72 l 227 83 b 295 188 245 108 281 166 b 308 204 299 197 304 202 m 315 147 b 314 147 315 147 314 147 b 314 147 314 147 314 147 b 306 129 314 145 310 138 l 296 105 b 281 72 292 97 284 77 l 274 56 b 181 -123 247 -4 212 -72 l 174 -134 l 176 -133 b 314 -123 215 -127 272 -123 b 451 -133 356 -123 413 -127 l 454 -134 l 449 -123 b 353 56 417 -72 381 -4 l 347 72 b 332 105 344 77 336 97 l 322 129 b 315 147 318 138 315 145 ',\n },\n noteheadTriangleUpHalf: {\n x_min: 0,\n x_max: 438.28125,\n ha: 447,\n o: 'm 212 205 b 219 205 213 205 216 205 b 239 183 228 205 231 204 b 421 -163 298 40 363 -83 b 438 -191 434 -180 438 -186 b 436 -197 438 -192 438 -195 b 424 -206 434 -204 431 -206 b 406 -201 420 -206 415 -205 b 216 -156 347 -172 281 -156 b 23 -205 148 -156 80 -173 b 14 -206 20 -206 17 -206 b 0 -191 6 -206 0 -201 b 6 -176 0 -187 1 -183 b 202 192 63 -104 142 45 b 212 205 205 199 208 202 m 264 48 l 249 81 l 243 94 l 242 91 b 89 -126 208 36 137 -66 b 81 -138 85 -133 81 -138 b 81 -138 81 -138 81 -138 b 81 -138 81 -138 81 -138 b 95 -133 81 -138 87 -136 b 280 -94 156 -108 221 -94 b 334 -98 299 -94 317 -95 b 343 -99 338 -99 343 -99 b 343 -99 343 -99 343 -99 b 338 -94 343 -99 341 -97 b 264 48 318 -58 287 1 ',\n },\n noteheadTriangleUpBlack: {\n x_min: -1.359375,\n x_max: 436.921875,\n ha: 446,\n o: 'm 213 205 b 217 205 215 205 216 205 b 234 194 224 205 234 199 b 236 187 234 194 235 190 l 245 167 l 261 129 l 270 106 b 355 -61 294 54 329 -13 b 420 -163 381 -105 402 -138 b 436 -188 435 -184 436 -184 b 436 -191 436 -190 436 -190 b 421 -206 436 -201 431 -206 l 421 -206 l 416 -206 l 405 -201 b 217 -158 347 -172 283 -158 b 31 -201 153 -158 88 -172 l 20 -206 l 14 -206 l 14 -206 b 0 -191 5 -206 0 -201 b -1 -188 0 -190 -1 -190 b 14 -163 -1 -186 0 -184 b 95 -34 36 -136 72 -77 b 166 106 119 8 148 68 l 175 129 l 183 148 l 200 188 b 213 205 205 199 208 202 ',\n },\n noteheadDiamondWhole: {\n x_min: 0,\n x_max: 627.46875,\n ha: 640,\n o: 'm 306 190 b 314 191 308 191 311 191 b 326 184 318 191 322 190 l 336 173 b 510 52 377 127 442 80 b 515 49 513 51 515 49 b 611 16 537 40 579 24 b 627 0 624 13 627 9 b 607 -18 627 -11 624 -13 b 330 -181 490 -49 389 -109 b 314 -192 323 -190 319 -192 b 306 -191 311 -192 308 -192 b 294 -177 302 -188 302 -188 b 257 -140 287 -170 265 -148 b 19 -18 193 -84 114 -44 b 0 0 2 -13 0 -11 b 16 16 0 9 2 13 b 110 49 47 24 89 40 b 117 52 111 49 114 51 b 145 65 126 56 130 58 b 281 163 200 93 245 124 b 300 186 288 170 291 174 b 306 190 300 187 303 188 m 317 137 b 313 142 315 141 314 142 b 308 137 313 142 311 141 b 161 4 276 84 220 33 b 155 0 159 1 155 0 b 163 -4 155 0 159 -2 b 308 -138 220 -34 276 -84 b 313 -142 311 -141 313 -142 b 317 -138 314 -142 315 -141 b 464 -4 351 -84 406 -34 b 470 0 468 -2 470 0 b 464 4 470 0 468 1 b 317 137 406 33 351 84 ',\n },\n noteheadDiamondHalf: {\n x_min: 0,\n x_max: 438.28125,\n ha: 447,\n o: 'm 212 190 b 219 191 213 191 216 191 b 236 176 225 191 228 190 b 419 18 277 105 341 49 b 436 5 431 13 434 11 b 438 -1 438 4 438 1 b 424 -16 438 -8 432 -13 b 356 -49 409 -20 379 -36 b 234 -180 306 -83 258 -133 b 219 -192 230 -188 224 -192 b 200 -176 213 -192 206 -187 b 9 -15 157 -102 89 -45 b 0 0 2 -12 0 -6 b 16 18 0 9 2 12 b 200 176 93 48 159 104 b 212 190 205 186 208 188 m 239 113 b 236 117 238 116 238 117 b 230 108 235 117 234 115 b 92 -15 196 58 140 8 b 88 -18 91 -16 88 -18 b 92 -20 88 -18 91 -19 b 198 -116 130 -43 166 -74 b 200 -117 200 -117 200 -117 b 201 -117 200 -117 201 -117 b 264 -43 212 -98 242 -62 b 345 15 288 -19 321 4 b 348 18 347 16 348 16 b 344 20 348 18 347 19 b 239 113 307 41 266 79 ',\n },\n noteheadDiamondBlack: {\n x_min: 0,\n x_max: 432.828125,\n ha: 442,\n o: 'm 209 186 b 213 187 210 187 212 187 b 216 187 215 187 216 187 b 224 174 216 186 220 180 b 420 -1 269 105 338 43 b 432 -12 431 -8 432 -9 b 421 -23 432 -15 432 -16 b 228 -180 345 -70 264 -137 b 219 -188 221 -188 221 -188 l 219 -188 b 208 -177 215 -188 215 -188 b 10 1 163 -106 93 -44 b 0 11 0 6 0 8 b 10 22 0 13 0 15 b 202 179 87 69 167 136 b 209 186 206 183 209 186 ',\n },\n augmentationDot: {\n x_min: 0,\n x_max: 133.390625,\n ha: 136,\n o: 'm 54 66 b 65 68 58 68 61 68 b 122 37 88 68 110 56 b 133 -1 130 26 133 12 b 104 -58 133 -23 123 -44 b 66 -69 92 -65 78 -69 b 10 -38 44 -69 23 -58 b 0 -1 2 -27 0 -13 b 54 66 0 30 20 61 ',\n },\n tremolo1: {\n x_min: -206.890625,\n x_max: 428.75,\n ha: 438,\n o: 'm 389 -351 b 394 -351 390 -351 393 -351 b 428 -385 413 -351 428 -367 b 428 -394 428 -388 428 -391 b 394 -428 426 -406 421 -410 l 332 -473 l 269 -516 l 205 -560 l 141 -603 l 77 -648 l 13 -692 l -50 -737 l -114 -780 l -145 -802 b -171 -813 -157 -810 -163 -813 b -175 -813 -172 -813 -174 -813 b -206 -777 -194 -811 -206 -795 b -202 -760 -206 -771 -205 -766 b -87 -675 -197 -752 -206 -757 l -34 -639 l 83 -557 l 145 -514 l 209 -470 l 272 -427 b 389 -351 375 -356 381 -352 ',\n },\n flag8thUp: {\n x_min: -24.5,\n x_max: 317.140625,\n ha: 324,\n o: 'm -24 -161 l -24 -5 l -20 -5 b 0 -24 -9 -5 -2 -12 b 171 -315 21 -124 84 -233 b 317 -660 268 -406 317 -531 b 187 -1014 317 -782 274 -909 b 161 -1034 172 -1034 171 -1034 b 141 -1013 149 -1034 141 -1025 b 152 -991 141 -1004 142 -1002 b 266 -682 228 -899 266 -788 b 174 -430 266 -588 236 -498 b -23 -317 136 -388 66 -348 b -24 -161 -23 -316 -24 -285 ',\n },\n flag8thDown: {\n x_min: -21.78125,\n x_max: 367.5,\n ha: 375,\n o: 'm 230 1031 b 238 1032 232 1032 235 1032 b 259 1014 245 1032 251 1027 b 367 662 330 906 367 782 b 364 602 367 641 367 621 b 232 317 352 488 304 384 b 57 120 155 245 103 187 b -1 18 31 84 6 40 b -19 4 -4 11 -12 4 l -21 4 l -21 159 l -21 315 l -16 315 b 96 335 10 315 62 324 b 315 695 227 380 315 527 b 313 738 315 709 314 724 b 224 991 304 825 273 916 b 216 1013 219 999 216 1007 b 230 1031 216 1021 220 1028 ',\n },\n flag16thUp: {\n x_min: -24.5,\n x_max: 317.140625,\n ha: 324,\n o: 'm -24 -147 l -24 -5 l -20 -5 b -1 -19 -12 -5 -4 -11 b 58 -123 6 -43 31 -86 b 196 -278 93 -173 134 -219 b 317 -570 274 -356 317 -460 b 294 -713 317 -617 308 -666 l 289 -724 l 294 -735 b 317 -873 308 -780 317 -827 b 235 -1132 317 -963 288 -1054 b 209 -1165 228 -1140 224 -1146 b 189 -1177 204 -1172 196 -1177 b 171 -1164 182 -1177 175 -1172 b 168 -1154 170 -1161 168 -1159 b 181 -1132 168 -1149 172 -1142 b 269 -891 238 -1064 269 -975 b 269 -881 269 -886 269 -884 b 262 -814 269 -857 265 -827 b 258 -800 261 -811 259 -806 b 142 -628 240 -731 198 -667 b -8 -589 112 -606 47 -589 b -20 -589 -13 -589 -19 -589 l -24 -589 l -24 -449 l -24 -308 l -20 -308 b -1 -322 -12 -308 -4 -313 b 58 -424 6 -345 31 -388 b 194 -580 93 -476 136 -523 b 259 -660 221 -606 245 -635 b 261 -663 259 -662 261 -663 b 264 -656 262 -663 262 -660 b 269 -587 268 -632 269 -610 b 264 -521 269 -566 268 -544 b 262 -512 264 -517 262 -513 b 258 -498 261 -509 259 -503 b 142 -326 240 -428 198 -365 b -8 -287 112 -303 47 -288 b -20 -287 -13 -287 -19 -287 l -24 -287 l -24 -147 ',\n },\n flag16thDown: {\n x_min: -21.78125,\n x_max: 362.0625,\n ha: 369,\n o: 'm 302 1031 b 308 1032 304 1032 307 1032 b 330 1016 318 1032 325 1027 b 362 867 351 970 362 920 b 340 738 362 824 353 780 l 336 727 l 340 717 b 362 591 355 677 362 634 b 257 323 362 496 325 401 b 204 272 243 306 227 290 b 20 56 129 206 66 133 b -1 18 12 44 0 22 b -19 4 -4 9 -12 4 l -21 4 l -21 140 l -21 276 l -12 277 b 167 333 61 288 127 309 b 319 598 262 388 319 491 b 311 664 319 620 317 642 l 310 673 l 304 664 b 204 548 279 620 250 587 b 20 333 129 483 66 409 b -1 292 12 320 0 298 b -19 280 -4 285 -12 280 l -21 280 l -21 416 l -21 552 l -12 553 b 167 609 61 564 127 585 b 319 874 264 666 319 770 b 294 992 319 914 311 954 b 288 1011 288 1004 288 1007 b 302 1031 288 1021 294 1028 ',\n },\n flag32ndUp: {\n x_min: -24.5,\n x_max: 315.78125,\n ha: 322,\n o: 'm -24 -145 l -24 -5 l -20 -5 b 1 -26 -10 -5 -6 -9 b 175 -241 31 -86 96 -166 b 314 -548 259 -323 304 -420 b 315 -589 315 -555 315 -571 b 314 -630 315 -606 315 -623 b 298 -730 311 -664 306 -699 l 295 -742 l 296 -748 b 314 -850 304 -778 311 -813 b 315 -892 315 -857 315 -874 b 314 -932 315 -909 315 -925 b 298 -1032 311 -967 306 -1002 l 295 -1045 l 296 -1050 b 314 -1153 304 -1081 311 -1115 b 315 -1193 315 -1160 315 -1177 b 314 -1235 315 -1211 315 -1228 b 217 -1526 306 -1338 270 -1444 b 201 -1533 213 -1532 208 -1533 b 182 -1522 193 -1533 185 -1529 b 179 -1514 181 -1518 179 -1517 b 189 -1489 179 -1508 182 -1501 b 266 -1217 240 -1403 266 -1308 b 262 -1156 266 -1196 265 -1177 b 110 -907 247 -1043 190 -950 b 0 -889 87 -895 50 -889 l -1 -889 l -24 -889 l -24 -749 l -24 -610 l -20 -610 b 1 -631 -10 -610 -6 -614 b 175 -846 31 -691 96 -771 b 259 -956 213 -884 236 -914 b 265 -966 262 -961 264 -966 b 265 -966 265 -966 265 -966 b 265 -953 265 -964 265 -959 b 266 -920 266 -943 266 -932 b 262 -853 266 -898 265 -873 b 110 -605 247 -741 190 -648 b 0 -587 87 -592 50 -587 l -1 -587 l -24 -587 l -24 -448 l -24 -308 l -20 -308 b 1 -328 -10 -308 -6 -312 b 175 -544 31 -388 96 -469 b 259 -655 213 -581 236 -612 b 265 -663 262 -659 264 -663 b 265 -663 265 -663 265 -663 b 265 -650 265 -663 265 -657 b 266 -617 266 -641 266 -630 b 262 -551 266 -595 265 -570 b 110 -303 247 -438 190 -345 b 0 -284 87 -290 50 -284 l -1 -284 l -24 -284 l -24 -145 ',\n },\n flag32ndDown: {\n x_min: -21.78125,\n x_max: 366.140625,\n ha: 374,\n o: 'm 276 1378 b 284 1379 279 1379 281 1379 b 306 1360 292 1379 298 1374 b 352 1247 326 1326 343 1286 b 366 1139 362 1213 366 1175 b 347 1009 366 1093 359 1049 l 344 1002 l 347 992 b 352 971 348 986 351 977 b 366 863 362 936 366 899 b 347 732 366 818 359 773 l 344 725 l 347 716 b 352 695 348 710 351 700 b 366 588 362 659 366 623 b 223 262 366 464 314 345 b 189 233 212 252 212 252 b 35 76 126 183 73 129 b -1 16 20 56 2 27 b -19 4 -4 9 -12 4 l -21 4 l -21 137 l -21 270 l -17 270 b 186 344 59 281 134 308 b 319 606 270 399 319 499 b 317 650 319 620 319 635 l 315 659 l 314 655 b 223 537 288 607 258 570 b 189 509 212 528 212 528 b 35 352 126 459 73 405 b -1 292 20 333 2 303 b -19 280 -4 285 -12 280 l -21 280 l -21 413 l -21 546 l -17 546 b 186 620 59 557 134 584 b 319 882 270 675 319 775 b 317 925 319 896 319 911 l 315 935 l 314 931 b 223 813 288 884 258 846 b 189 785 212 805 212 805 b 35 628 126 735 73 681 b -1 569 20 609 2 580 b -19 556 -4 562 -12 556 l -21 556 l -21 689 l -21 823 l -17 823 b 202 907 68 835 152 867 b 319 1157 280 968 319 1061 b 270 1338 319 1218 303 1281 b 262 1358 264 1349 262 1353 b 262 1364 262 1360 262 1363 b 276 1378 265 1371 269 1376 ',\n },\n flag64thUp: {\n x_min: -24.5,\n x_max: 314.421875,\n ha: 321,\n o: 'm -24 -145 l -24 -5 l -20 -5 b 0 -23 -9 -5 -2 -12 b 27 -87 4 -38 14 -66 b 138 -220 53 -136 88 -177 b 235 -328 179 -255 208 -288 b 314 -592 287 -409 314 -501 b 292 -732 314 -639 307 -687 l 289 -742 l 294 -756 b 314 -896 307 -802 314 -849 b 292 -1035 314 -943 307 -991 l 289 -1045 l 294 -1057 b 314 -1197 307 -1104 314 -1152 b 292 -1338 314 -1246 307 -1292 l 289 -1347 l 294 -1360 b 314 -1500 307 -1407 314 -1454 b 273 -1689 314 -1565 300 -1628 b 250 -1712 265 -1710 261 -1712 b 228 -1691 236 -1712 228 -1704 l 228 -1685 l 234 -1675 b 270 -1507 258 -1621 270 -1564 b 98 -1193 270 -1381 209 -1261 b 40 -1174 76 -1179 58 -1174 b -10 -1189 24 -1174 8 -1178 b -20 -1192 -14 -1192 -16 -1192 l -24 -1192 l -24 -1052 l -24 -913 l -20 -913 b 0 -931 -9 -913 -2 -920 b 27 -995 4 -946 14 -974 b 138 -1128 53 -1043 88 -1085 b 257 -1275 190 -1172 228 -1220 b 262 -1283 259 -1279 262 -1283 l 262 -1283 b 269 -1249 264 -1282 268 -1260 b 270 -1206 270 -1233 270 -1220 b 98 -891 270 -1075 206 -957 b 40 -871 76 -877 58 -871 b -10 -886 24 -871 8 -875 b -20 -889 -14 -889 -16 -889 l -24 -889 l -24 -749 l -24 -610 l -20 -610 b 0 -628 -9 -610 -2 -617 b 27 -692 4 -644 14 -671 b 138 -825 53 -741 88 -782 b 257 -973 190 -870 228 -917 b 262 -981 259 -977 262 -981 l 262 -981 b 269 -946 264 -979 268 -957 b 270 -903 270 -931 270 -917 b 98 -588 270 -774 206 -655 b 40 -569 76 -574 58 -569 b -10 -584 24 -569 8 -574 b -20 -587 -14 -587 -16 -587 l -24 -587 l -24 -448 l -24 -308 l -20 -308 b 0 -326 -9 -308 -2 -315 b 27 -390 4 -341 14 -369 b 138 -523 53 -438 88 -480 b 257 -670 190 -567 228 -614 b 262 -678 259 -674 262 -678 b 262 -678 262 -678 262 -678 b 269 -644 264 -677 268 -656 b 270 -601 270 -628 270 -614 b 98 -285 270 -471 206 -352 b 40 -266 76 -273 58 -266 b -10 -281 24 -266 8 -272 b -20 -284 -14 -284 -16 -284 l -24 -284 l -24 -145 ',\n },\n flag64thDown: {\n x_min: -21.78125,\n x_max: 367.5,\n ha: 375,\n o: 'm 259 1553 b 265 1553 261 1553 264 1553 b 288 1540 272 1553 277 1550 b 367 1351 340 1493 367 1424 b 336 1221 367 1308 357 1263 l 332 1211 l 333 1208 b 367 1077 356 1170 367 1124 b 336 945 367 1032 357 986 l 332 935 l 333 932 b 367 800 356 893 367 848 b 336 669 367 756 357 710 l 332 659 l 333 656 b 367 523 356 617 367 571 b 345 412 367 485 360 446 b 231 273 322 356 284 310 b -1 19 121 195 27 93 b -17 4 -4 11 -10 5 l -21 4 l -21 134 l -21 265 l -17 265 b 133 291 20 265 96 278 b 318 537 245 328 318 433 b 307 603 318 559 315 582 b 303 614 304 612 304 614 b 298 609 302 614 300 613 b 231 549 281 589 258 567 b -1 295 121 471 27 369 b -17 280 -4 287 -10 281 l -21 280 l -21 410 l -21 541 l -17 541 b 133 567 20 541 96 555 b 318 813 245 605 318 709 b 307 880 318 835 315 859 b 303 891 304 888 304 891 b 298 885 302 891 300 888 b 231 825 281 866 258 843 b -1 571 121 748 27 645 b -17 556 -4 563 -10 557 l -21 556 l -21 687 l -21 817 l -17 817 b 133 843 20 817 96 830 b 318 1089 245 881 318 985 b 307 1156 318 1111 315 1134 b 303 1167 304 1164 304 1167 b 298 1161 302 1167 300 1164 b 231 1102 281 1140 258 1120 b -1 848 121 1024 27 921 b -17 832 -4 839 -10 834 l -21 832 l -21 963 l -21 1093 l -17 1093 b 114 1113 12 1093 78 1103 b 313 1314 215 1142 289 1218 b 318 1364 317 1331 318 1347 b 255 1511 318 1422 295 1478 b 243 1532 247 1519 243 1525 b 259 1553 243 1540 250 1550 ',\n },\n flag128thUp: {\n x_min: -24.5,\n x_max: 313.0625,\n ha: 319,\n o: 'm -24 -133 l -24 -5 l -20 -5 b -1 -19 -12 -5 -4 -11 b 142 -213 13 -61 74 -144 b 258 -376 196 -269 230 -315 b 313 -605 295 -449 313 -528 b 292 -742 313 -652 306 -699 b 288 -752 289 -748 288 -752 b 288 -752 288 -752 288 -752 b 292 -764 289 -753 291 -757 b 313 -907 306 -811 313 -860 b 292 -1045 313 -954 306 -1002 b 288 -1054 289 -1050 288 -1054 b 288 -1054 288 -1054 288 -1054 b 292 -1067 289 -1054 291 -1060 b 313 -1210 306 -1113 313 -1161 b 292 -1346 313 -1257 306 -1304 b 288 -1357 289 -1353 288 -1357 b 288 -1357 288 -1357 288 -1357 b 292 -1368 289 -1357 291 -1363 b 313 -1512 306 -1415 313 -1464 b 292 -1648 313 -1560 306 -1605 b 288 -1660 289 -1654 288 -1660 b 288 -1660 288 -1660 288 -1660 b 292 -1671 289 -1660 291 -1665 b 313 -1814 306 -1719 313 -1766 b 250 -2040 313 -1897 291 -1977 b 232 -2062 238 -2057 236 -2059 b 221 -2065 230 -2063 225 -2065 b 200 -2045 210 -2065 201 -2057 b 200 -2043 200 -2044 200 -2044 b 208 -2026 200 -2037 202 -2034 b 269 -1826 249 -1966 269 -1897 b 153 -1544 269 -1726 230 -1625 b -9 -1472 115 -1506 58 -1481 b -21 -1471 -14 -1471 -19 -1471 l -24 -1471 l -24 -1343 l -24 -1215 l -20 -1215 b -1 -1229 -12 -1215 -4 -1221 b 142 -1424 13 -1270 74 -1353 b 257 -1582 196 -1478 228 -1524 b 264 -1594 261 -1589 264 -1594 l 264 -1594 b 265 -1582 264 -1594 264 -1589 b 270 -1525 268 -1562 270 -1544 b 153 -1243 270 -1424 228 -1321 b -9 -1170 115 -1203 58 -1178 b -21 -1168 -14 -1170 -19 -1168 l -24 -1168 l -24 -1041 l -24 -913 l -20 -913 b -1 -927 -12 -913 -4 -918 b 142 -1121 13 -967 74 -1050 b 257 -1281 196 -1175 228 -1221 b 264 -1292 261 -1286 264 -1292 l 264 -1292 b 265 -1279 264 -1292 264 -1286 b 270 -1222 268 -1261 270 -1242 b 153 -941 270 -1121 228 -1018 b -9 -867 115 -900 58 -875 b -21 -866 -14 -867 -19 -866 l -24 -866 l -24 -738 l -24 -610 l -20 -610 b -1 -624 -12 -610 -4 -616 b 142 -818 13 -664 74 -749 b 257 -978 196 -873 228 -918 b 264 -989 261 -984 264 -989 l 264 -989 b 265 -977 264 -989 264 -984 b 270 -920 268 -959 270 -939 b 153 -638 270 -818 228 -716 b -9 -564 115 -598 58 -573 b -21 -563 -14 -564 -19 -563 l -24 -563 l -24 -435 l -24 -308 l -20 -308 b -1 -322 -12 -308 -4 -313 b 142 -516 13 -363 74 -446 b 257 -675 196 -571 228 -616 b 264 -687 261 -681 264 -687 l 264 -687 b 265 -674 264 -687 264 -681 b 270 -617 268 -656 270 -637 b 153 -335 270 -516 228 -413 b -9 -262 115 -295 58 -270 b -21 -260 -14 -262 -19 -260 l -24 -260 l -24 -133 ',\n },\n flag128thDown: {\n x_min: -21.78125,\n x_max: 367.5,\n ha: 375,\n o: 'm 276 1900 b 284 1901 279 1900 281 1901 b 306 1883 291 1901 298 1896 b 367 1686 347 1825 367 1757 b 343 1558 367 1643 359 1600 l 338 1549 l 343 1537 b 367 1411 359 1497 367 1454 b 343 1282 367 1367 359 1324 l 338 1272 l 343 1261 b 367 1135 359 1221 367 1178 b 343 1007 367 1090 359 1047 l 338 996 l 343 985 b 367 859 359 945 367 902 b 343 731 367 814 359 771 l 338 720 l 343 709 b 367 582 359 667 367 626 b 289 362 367 503 340 426 b 239 312 276 345 259 330 b 29 77 152 237 76 152 b -1 18 14 54 2 30 b -19 4 -4 11 -12 4 l -21 4 l -21 133 l -20 260 l -13 262 b 98 299 17 269 62 284 b 111 305 103 302 110 305 b 167 334 123 310 156 327 b 319 595 264 391 319 491 b 313 659 319 616 318 638 b 310 667 311 664 311 667 b 307 663 310 667 308 666 b 240 588 289 637 269 614 b 16 331 141 505 62 413 b -1 294 8 316 1 302 b -19 280 -4 287 -12 280 l -21 280 l -21 408 l -20 537 l -13 538 b 98 576 17 545 62 560 b 111 581 103 578 110 581 b 167 610 123 587 156 603 b 319 871 264 667 319 767 b 313 935 319 892 318 913 b 310 942 311 941 311 942 b 307 939 310 942 308 941 b 240 864 289 913 269 889 b 16 607 141 781 62 689 b -1 570 8 592 1 578 b -19 556 -4 563 -12 556 l -21 556 l -21 684 l -20 813 l -13 814 b 98 852 17 821 62 836 b 111 857 103 855 110 857 b 167 886 123 863 156 880 b 319 1147 264 943 319 1043 b 313 1211 319 1168 318 1189 b 310 1218 311 1217 311 1218 b 307 1215 310 1218 308 1217 b 240 1140 289 1188 269 1165 b 16 884 141 1057 62 966 b -1 846 8 868 1 855 b -19 832 -4 839 -12 832 l -21 832 l -21 960 l -20 1089 l -13 1090 b 98 1128 17 1097 62 1111 b 111 1134 103 1131 110 1134 b 167 1163 123 1139 156 1156 b 319 1424 264 1220 319 1320 b 313 1486 319 1444 318 1465 b 310 1494 311 1493 311 1494 b 307 1492 310 1494 308 1493 b 240 1417 289 1464 269 1442 b 16 1160 141 1333 62 1242 b -1 1121 8 1145 1 1131 b -19 1109 -4 1115 -12 1109 l -21 1109 l -21 1236 l -20 1365 l -13 1367 b 98 1404 17 1374 62 1388 b 111 1410 103 1407 110 1410 b 250 1508 172 1437 215 1467 b 319 1701 296 1564 319 1633 b 270 1859 319 1757 303 1814 b 262 1882 265 1868 262 1875 b 276 1900 262 1890 266 1896 ',\n },\n accidentalFlat: {\n x_min: -21.78125,\n x_max: 251.8125,\n ha: 257,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 383 20 616 20 616 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 201 l -21 616 l -20 620 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ',\n },\n accidentalNatural: {\n x_min: 0,\n x_max: 239.5625,\n ha: 244,\n o: 'm 10 460 b 20 462 13 462 14 462 b 39 449 28 462 35 458 l 40 446 l 40 326 b 40 205 40 259 40 205 b 127 227 40 205 80 215 b 220 249 196 244 213 249 b 227 247 224 249 225 248 b 238 237 231 245 235 241 l 239 233 l 239 -106 l 239 -448 l 238 -451 b 219 -463 234 -459 225 -463 b 198 -451 210 -463 202 -459 l 197 -448 l 197 -324 b 197 -201 197 -248 197 -201 b 110 -223 196 -201 157 -210 b 17 -245 42 -240 24 -245 b 10 -242 13 -245 13 -244 b 0 -233 6 -241 2 -237 l 0 -230 l 0 108 l 0 446 l 0 449 b 10 460 2 453 6 458 m 197 22 b 197 70 197 41 197 58 b 196 116 197 113 197 116 l 196 116 b 118 97 196 116 160 106 l 40 77 l 40 -18 b 40 -112 40 -69 40 -112 l 119 -93 l 197 -73 l 197 22 ',\n },\n accidentalSharp: {\n x_min: 0,\n x_max: 323.9375,\n ha: 331,\n o: 'm 217 535 b 225 537 220 537 221 537 b 245 524 235 537 242 533 l 246 521 l 247 390 l 247 258 l 273 265 b 306 270 288 269 299 270 b 322 259 315 270 319 267 b 323 208 323 256 323 233 b 322 158 323 184 323 159 b 288 140 318 148 315 147 b 247 130 254 131 247 130 b 247 65 247 130 247 104 b 247 20 247 51 247 36 l 247 -88 l 273 -81 b 306 -76 289 -77 299 -76 b 318 -81 311 -76 315 -77 b 323 -123 323 -87 323 -86 l 323 -138 l 323 -154 b 318 -195 323 -191 323 -190 b 269 -210 314 -199 315 -199 b 249 -216 259 -213 250 -216 l 247 -216 l 247 -349 l 246 -483 l 245 -487 b 225 -499 242 -495 234 -499 b 206 -487 219 -499 210 -495 l 205 -483 l 205 -355 l 205 -227 l 204 -227 l 181 -233 l 138 -244 b 117 -249 127 -247 117 -249 b 115 -385 115 -249 115 -256 l 115 -523 l 114 -526 b 95 -538 110 -534 102 -538 b 74 -526 87 -538 78 -534 l 73 -523 l 73 -391 b 72 -260 73 -269 73 -260 b 72 -260 72 -260 72 -260 b 19 -273 61 -263 23 -273 b 0 -260 10 -273 4 -267 b 0 -209 0 -256 0 -256 l 0 -162 l 1 -158 b 61 -134 5 -148 5 -148 l 73 -131 l 73 -22 b 72 86 73 79 73 86 b 72 86 72 86 72 86 b 19 74 61 83 23 74 b 0 86 10 74 4 79 b 0 137 0 90 0 90 l 0 184 l 1 188 b 61 212 5 198 5 198 l 73 215 l 73 348 l 73 481 l 74 485 b 95 498 78 492 87 498 b 103 495 98 498 100 496 b 114 485 107 494 111 489 l 115 481 l 115 353 l 115 226 l 121 226 b 159 235 123 227 141 231 l 198 247 l 205 248 l 205 384 l 205 521 l 206 524 b 217 535 209 528 212 533 m 205 9 b 205 119 205 70 205 119 l 205 119 b 182 113 204 119 194 116 l 138 102 b 117 97 127 99 117 97 b 115 -12 115 97 115 91 l 115 -122 l 121 -120 b 159 -111 123 -119 141 -115 l 198 -101 l 205 -98 l 205 9 ',\n },\n accidentalDoubleSharp: {\n x_min: 0,\n x_max: 367.5,\n ha: 375,\n o: 'm 0 124 l 0 187 l 61 187 l 122 187 l 122 138 l 122 91 l 153 61 l 183 30 l 213 61 l 243 91 l 243 138 l 243 187 l 306 187 l 367 187 l 367 124 l 367 61 l 321 61 l 274 61 l 243 30 l 213 0 l 243 -31 l 274 -62 l 321 -62 l 367 -62 l 367 -124 l 367 -188 l 306 -188 l 243 -188 l 243 -140 l 243 -93 l 213 -62 l 183 -31 l 153 -62 l 122 -93 l 122 -140 l 122 -188 l 61 -188 l 0 -188 l 0 -124 l 0 -62 l 46 -62 l 92 -62 l 123 -31 l 153 0 l 123 30 l 92 61 l 46 61 l 0 61 l 0 124 ',\n },\n accidentalDoubleFlat: {\n x_min: -21.78125,\n x_max: 483.1875,\n ha: 493,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 383 20 616 20 616 l 20 148 l 21 151 b 140 199 59 183 102 199 b 206 179 164 199 187 192 l 210 176 l 210 396 l 210 617 l 212 621 b 231 632 216 628 223 632 b 250 620 239 632 247 628 b 251 383 251 616 251 616 l 251 148 l 254 151 b 370 199 291 183 332 199 b 415 191 385 199 400 197 b 483 84 458 176 483 134 b 461 0 483 58 476 29 b 332 -142 439 -40 411 -72 l 255 -215 b 231 -229 240 -229 239 -229 b 216 -223 224 -229 220 -227 b 210 -158 210 -217 210 -223 b 210 -120 210 -148 210 -136 l 210 -29 l 205 -34 b 100 -142 182 -65 159 -88 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 201 l -21 616 l -20 620 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 m 341 131 b 328 133 337 133 332 133 b 322 133 326 133 323 133 b 257 87 296 129 273 113 l 251 80 l 251 -37 l 251 -156 l 255 -152 b 375 81 328 -72 375 20 l 375 83 b 341 131 375 113 367 126 ',\n },\n accidentalParensLeft: {\n x_min: -166.0625,\n x_max: -25.859375,\n ha: 0,\n o: 'm -49 369 b -42 370 -46 369 -44 370 b -27 360 -36 370 -29 366 b -25 355 -27 359 -25 358 b -32 335 -25 351 -28 347 b -92 52 -66 248 -87 159 b -93 -1 -93 43 -93 20 b -92 -54 -93 -23 -93 -45 b -32 -337 -85 -162 -66 -251 b -25 -355 -27 -349 -25 -352 b -42 -371 -25 -365 -32 -371 b -61 -353 -50 -371 -51 -369 b -163 -63 -119 -262 -153 -165 b -166 -1 -166 -37 -166 -31 b -163 62 -166 30 -166 36 b -61 352 -153 163 -119 260 b -49 369 -54 365 -51 366 ',\n },\n accidentalParensRight: {\n x_min: 25.859375,\n x_max: 164.6875,\n ha: 168,\n o: 'm 34 369 b 40 370 35 370 38 370 b 59 353 49 370 50 367 b 164 40 122 254 155 158 b 164 0 164 33 164 16 b 164 -40 164 -16 164 -34 b 59 -353 155 -158 122 -254 b 40 -371 53 -366 47 -371 b 34 -370 38 -371 36 -370 b 25 -358 28 -367 25 -363 b 31 -337 25 -352 27 -347 b 92 0 72 -234 92 -117 b 31 335 92 116 72 233 b 25 356 27 345 25 352 b 34 369 25 363 28 366 ',\n },\n accidentalQuarterToneFlatStein: {\n x_min: 0,\n x_max: 272.21875,\n ha: 278,\n o: 'm 243 631 b 250 632 246 632 249 632 b 270 620 259 632 268 628 l 272 616 l 272 201 l 272 -212 l 270 -216 b 251 -229 268 -224 259 -229 b 227 -215 243 -229 240 -229 l 151 -142 b 32 -16 81 -80 53 -49 b 0 84 9 18 0 52 b 111 199 0 149 42 199 b 137 197 119 199 127 198 b 228 151 168 191 197 177 l 231 148 l 231 383 b 232 620 231 616 231 616 b 243 631 234 624 238 630 m 168 131 b 152 133 163 133 157 133 b 107 102 130 133 111 120 b 106 86 107 97 106 91 b 111 41 106 73 108 56 b 227 -152 125 -13 171 -90 l 231 -156 l 231 -37 l 231 80 l 225 87 b 168 131 210 111 190 126 ',\n },\n accidentalThreeQuarterTonesFlatZimmermann: {\n x_min: 0,\n x_max: 607.0625,\n ha: 619,\n o: 'm 243 631 b 250 632 246 632 249 632 b 270 620 259 632 268 628 l 272 616 l 272 201 l 272 -212 l 270 -216 b 251 -229 268 -224 259 -229 b 227 -215 243 -229 240 -229 l 151 -142 b 32 -16 81 -80 53 -49 b 0 84 9 18 0 52 b 111 199 0 149 42 199 b 137 197 119 199 127 198 b 228 151 168 191 197 177 l 231 148 l 231 383 b 232 620 231 616 231 616 b 243 631 234 624 238 630 m 168 131 b 152 133 163 133 157 133 b 107 102 130 133 111 120 b 106 86 107 97 106 91 b 111 41 106 73 108 56 b 227 -152 125 -13 171 -90 l 231 -156 l 231 -37 l 231 80 l 225 87 b 168 131 210 111 190 126 m 347 631 b 353 632 348 632 351 632 b 374 620 363 632 371 628 b 375 383 375 616 375 616 l 375 148 l 377 151 b 492 199 415 183 454 199 b 537 191 507 199 522 197 b 607 84 582 176 607 134 b 583 0 607 58 598 29 b 455 -142 562 -40 533 -72 l 378 -215 b 355 -229 364 -229 362 -229 b 334 -216 345 -229 337 -224 l 333 -212 l 333 201 l 333 616 l 334 620 b 347 631 337 624 341 630 m 465 131 b 451 133 461 133 455 133 b 445 133 449 133 446 133 b 379 87 419 129 396 113 l 375 80 l 375 -37 l 375 -156 l 378 -152 b 499 81 451 -72 499 20 l 499 83 b 465 131 499 113 490 126 ',\n },\n accidentalQuarterToneSharpStein: {\n x_min: 0,\n x_max: 193.28125,\n ha: 197,\n o: 'm 85 514 b 95 517 88 517 89 517 b 114 505 103 517 110 513 l 115 502 l 115 376 b 115 249 115 306 115 249 b 141 258 117 249 127 252 l 167 266 l 172 266 b 190 254 181 265 187 262 l 193 251 l 193 202 l 193 188 b 187 147 193 149 191 152 b 147 130 183 142 182 141 l 115 119 l 115 9 b 115 -99 115 -51 115 -99 b 141 -91 115 -99 127 -95 b 171 -81 166 -81 167 -81 l 171 -81 b 191 -94 181 -81 189 -87 b 193 -142 191 -97 193 -120 b 191 -195 193 -167 191 -194 b 125 -227 187 -205 187 -204 l 115 -230 l 115 -366 l 115 -503 l 114 -506 b 95 -519 110 -514 102 -519 b 74 -506 87 -519 78 -514 l 73 -503 l 73 -374 b 73 -245 73 -260 73 -245 b 73 -245 73 -245 73 -245 b 55 -252 72 -245 63 -249 l 32 -260 b 19 -263 27 -262 23 -263 b 4 -256 13 -263 8 -260 b 0 -215 0 -251 0 -254 b 0 -199 0 -210 0 -206 l 0 -152 l 1 -149 b 8 -140 2 -145 5 -141 b 42 -127 9 -140 24 -133 l 73 -116 l 73 -5 b 73 23 73 4 73 15 b 73 105 73 70 73 105 b 49 97 73 105 61 101 b 17 88 32 91 23 88 b 4 95 10 88 8 91 b 0 137 0 101 0 98 b 0 151 0 141 0 145 l 0 199 l 1 202 b 43 224 5 212 5 212 l 73 234 l 73 367 l 73 502 l 74 505 b 85 514 77 509 81 513 ',\n },\n accidentalThreeQuarterTonesSharpStein: {\n x_min: -1.359375,\n x_max: 455.96875,\n ha: 465,\n o: 'm 352 541 b 357 542 353 542 355 542 b 377 530 364 542 372 537 l 378 526 l 378 394 l 379 262 l 404 266 b 436 270 420 269 430 270 b 450 265 443 270 446 269 b 455 220 455 259 455 260 l 455 208 l 455 161 l 454 156 b 411 140 449 147 447 147 b 378 133 393 137 379 134 b 378 68 378 133 378 106 b 378 22 378 54 378 38 l 379 -87 l 404 -83 b 436 -79 420 -80 430 -79 b 450 -84 443 -79 446 -80 b 455 -129 455 -90 455 -88 l 455 -141 l 455 -188 l 454 -192 b 413 -209 449 -202 447 -202 b 382 -215 398 -212 383 -215 l 378 -215 l 378 -345 l 378 -380 b 375 -485 378 -484 378 -480 b 357 -494 371 -491 364 -494 b 340 -485 351 -494 344 -491 b 336 -383 337 -480 336 -484 l 336 -349 l 336 -223 l 334 -223 b 291 -231 334 -223 314 -227 l 247 -240 l 247 -371 l 246 -503 l 245 -506 b 225 -519 242 -514 234 -519 b 206 -506 219 -519 210 -514 l 205 -503 l 205 -376 l 205 -248 l 160 -256 l 115 -265 l 115 -396 l 115 -527 l 114 -531 b 95 -544 110 -539 102 -544 b 76 -531 87 -544 78 -539 l 73 -527 l 73 -399 b 73 -273 73 -330 73 -273 b 49 -277 73 -273 61 -274 b 17 -281 32 -280 24 -281 b 4 -276 10 -281 8 -280 b -1 -234 0 -269 -1 -272 b 0 -219 -1 -229 0 -224 l 0 -170 l 1 -167 b 10 -158 2 -163 6 -159 b 49 -149 13 -156 16 -155 l 73 -145 l 73 -34 b 73 76 73 26 73 76 b 49 72 73 76 61 74 b 17 68 32 69 24 68 b 4 73 10 68 8 69 b -1 115 0 80 -1 77 b 0 130 -1 120 0 124 l 0 179 l 1 181 b 10 191 2 186 6 190 b 49 199 13 192 16 194 l 73 204 l 73 338 b 73 374 73 352 73 365 b 77 483 73 484 73 477 b 95 492 81 489 88 492 b 111 483 100 492 107 489 b 115 378 115 477 115 483 l 115 342 b 117 212 115 223 115 212 b 204 229 117 212 200 227 l 205 229 l 205 365 l 205 502 l 206 505 b 225 517 210 513 219 517 b 245 505 234 517 242 513 l 246 502 l 247 369 l 247 237 l 249 237 b 336 254 253 238 336 254 b 337 390 336 254 337 302 l 337 526 l 338 530 b 352 541 341 535 347 539 m 336 15 b 336 126 336 102 336 126 l 336 126 b 291 117 336 126 315 122 l 247 109 l 247 -1 l 247 -112 l 249 -112 b 336 -95 253 -111 336 -95 b 336 15 336 -95 336 -56 m 205 -120 b 205 -55 205 -120 205 -93 b 205 -9 205 -41 205 -24 l 205 101 l 160 93 l 115 84 l 115 -26 b 115 -83 115 -49 115 -69 b 117 -137 115 -133 115 -137 b 205 -120 118 -137 204 -120 ',\n },\n accidentalBuyukMucennebFlat: {\n x_min: -171.5,\n x_max: 251.8125,\n ha: 257,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 553 20 616 20 614 b 20 491 20 503 20 491 l 20 491 b 153 535 47 501 149 535 b 174 514 167 535 174 524 b 164 496 174 508 171 501 b 92 470 164 495 132 484 l 20 445 l 20 390 b 20 363 20 378 20 370 b 20 333 20 340 20 333 l 20 333 b 153 377 47 344 149 377 b 174 356 167 377 174 367 b 164 338 174 349 171 342 b 92 312 164 338 132 326 l 20 288 l 20 219 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 30 -21 -212 -21 -212 b -21 273 -21 163 -21 273 b -84 252 -21 273 -50 263 b -152 230 -133 234 -145 230 b -157 231 -155 230 -156 231 b -171 252 -166 234 -171 244 b -160 270 -171 259 -167 266 b -27 316 -159 270 -93 294 l -21 319 l -21 374 b -21 431 -21 406 -21 431 b -84 409 -21 431 -50 421 b -152 388 -133 392 -145 388 b -157 390 -155 388 -156 388 b -171 409 -166 392 -171 401 b -160 428 -171 417 -167 424 b -27 474 -159 428 -93 451 l -21 476 l -21 546 b -20 620 -21 614 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ',\n },\n accidentalBakiyeFlat: {\n x_min: -176.9375,\n x_max: 251.8125,\n ha: 257,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 503 20 616 20 614 b 20 391 20 442 20 391 b 84 424 20 391 49 406 l 147 456 l 152 456 b 153 456 153 456 153 456 b 175 435 166 456 175 446 b 172 427 175 433 174 430 b 92 380 170 420 172 421 l 20 342 l 20 245 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 54 -21 -212 -21 -212 b -21 322 -21 201 -21 322 b -85 290 -21 322 -50 308 l -148 256 l -153 256 b -155 256 -155 256 -155 256 b -176 277 -167 256 -176 266 b -174 285 -176 280 -175 283 b -93 333 -171 294 -174 292 l -21 370 l -21 494 b -20 620 -21 616 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ',\n },\n accidentalKomaSharp: {\n x_min: -1.359375,\n x_max: 455.96875,\n ha: 465,\n o: 'm 352 541 b 357 542 353 542 355 542 b 377 530 364 542 372 537 l 378 526 l 378 394 l 379 262 l 404 266 b 436 270 420 269 430 270 b 450 265 443 270 446 269 b 455 220 455 259 455 260 l 455 208 l 455 161 l 454 156 b 411 140 449 147 447 147 b 378 133 393 137 379 134 b 378 68 378 133 378 106 b 378 22 378 54 378 38 l 379 -87 l 404 -83 b 436 -79 420 -80 430 -79 b 450 -84 443 -79 446 -80 b 455 -129 455 -90 455 -88 l 455 -141 l 455 -188 l 454 -192 b 413 -209 449 -202 447 -202 b 382 -215 398 -212 383 -215 l 378 -215 l 378 -345 l 378 -380 b 375 -485 378 -484 378 -480 b 357 -494 371 -491 364 -494 b 340 -485 351 -494 344 -491 b 336 -383 337 -480 336 -484 l 336 -349 l 336 -223 l 334 -223 b 291 -231 334 -223 314 -227 l 247 -240 l 247 -371 l 246 -503 l 245 -506 b 225 -519 242 -514 234 -519 b 206 -506 219 -519 210 -514 l 205 -503 l 205 -376 l 205 -248 l 160 -256 l 115 -265 l 115 -396 l 115 -527 l 114 -531 b 95 -544 110 -539 102 -544 b 76 -531 87 -544 78 -539 l 73 -527 l 73 -399 b 73 -273 73 -330 73 -273 b 49 -277 73 -273 61 -274 b 17 -281 32 -280 24 -281 b 4 -276 10 -281 8 -280 b -1 -234 0 -269 -1 -272 b 0 -219 -1 -229 0 -224 l 0 -170 l 1 -167 b 10 -158 2 -163 6 -159 b 49 -149 13 -156 16 -155 l 73 -145 l 73 -34 b 73 76 73 26 73 76 b 49 72 73 76 61 74 b 17 68 32 69 24 68 b 4 73 10 68 8 69 b -1 115 0 80 -1 77 b 0 130 -1 120 0 124 l 0 179 l 1 181 b 10 191 2 186 6 190 b 49 199 13 192 16 194 l 73 204 l 73 338 b 73 374 73 352 73 365 b 77 483 73 484 73 477 b 95 492 81 489 88 492 b 111 483 100 492 107 489 b 115 378 115 477 115 483 l 115 342 b 117 212 115 223 115 212 b 204 229 117 212 200 227 l 205 229 l 205 365 l 205 502 l 206 505 b 225 517 210 513 219 517 b 245 505 234 517 242 513 l 246 502 l 247 369 l 247 237 l 249 237 b 336 254 253 238 336 254 b 337 390 336 254 337 302 l 337 526 l 338 530 b 352 541 341 535 347 539 m 336 15 b 336 126 336 102 336 126 l 336 126 b 291 117 336 126 315 122 l 247 109 l 247 -1 l 247 -112 l 249 -112 b 336 -95 253 -111 336 -95 b 336 15 336 -95 336 -56 m 205 -120 b 205 -55 205 -120 205 -93 b 205 -9 205 -41 205 -24 l 205 101 l 160 93 l 115 84 l 115 -26 b 115 -83 115 -49 115 -69 b 117 -137 115 -133 115 -137 b 205 -120 118 -137 204 -120 ',\n },\n accidentalKucukMucennebSharp: {\n x_min: -1.359375,\n x_max: 255.890625,\n ha: 261,\n o: 'm 118 514 b 127 517 121 517 122 517 b 147 505 136 517 142 513 l 148 502 l 148 403 b 148 306 148 351 148 306 b 174 315 149 306 160 310 l 200 324 l 205 323 b 223 312 213 323 220 319 l 225 308 l 225 260 b 225 245 225 255 225 249 b 220 204 225 208 224 209 b 179 188 216 199 215 199 l 148 177 l 148 124 l 148 70 l 189 84 b 236 98 219 94 230 98 b 247 94 240 98 243 97 b 255 52 254 88 255 87 b 255 33 255 47 255 40 l 254 -12 l 253 -15 b 249 -22 253 -18 250 -20 l 245 -24 l 196 -41 l 148 -58 l 148 -108 b 148 -158 148 -136 148 -158 b 174 -148 148 -158 160 -154 b 204 -140 198 -140 200 -140 l 204 -140 b 224 -152 213 -140 221 -145 b 225 -201 224 -155 225 -177 b 224 -254 225 -226 224 -251 b 157 -284 220 -262 220 -262 l 148 -288 l 148 -395 l 148 -503 l 147 -506 b 127 -519 142 -514 134 -519 b 107 -506 119 -519 111 -514 l 106 -503 l 106 -403 b 106 -303 106 -316 106 -303 b 104 -303 104 -303 104 -303 b 88 -310 104 -303 96 -306 l 63 -319 b 51 -322 59 -320 55 -322 b 36 -315 46 -322 40 -319 b 31 -273 32 -309 31 -312 b 31 -258 31 -269 31 -263 l 31 -210 l 34 -206 b 40 -198 35 -204 38 -199 b 74 -186 42 -197 57 -191 l 106 -173 l 106 -123 b 106 -97 106 -112 106 -104 b 106 -72 106 -76 106 -72 b 104 -72 106 -72 106 -72 b 20 -99 89 -79 23 -99 b 0 -84 10 -99 2 -93 b -1 -37 0 -81 -1 -59 b 0 11 -1 -15 0 9 b 58 40 4 22 2 22 l 106 56 l 106 109 b 106 123 106 115 106 119 b 106 162 106 147 106 162 b 81 155 106 162 93 159 b 50 147 65 149 55 147 b 36 152 43 147 40 148 b 31 194 32 158 31 156 b 31 209 31 198 31 204 l 31 256 l 34 260 b 76 281 38 269 38 269 l 106 292 l 106 396 l 106 502 l 107 505 b 118 514 110 509 114 513 ',\n },\n articAccentAbove: {\n x_min: -348.4375,\n x_max: 24.5,\n ha: 25,\n o: 'm -330 155 b -322 156 -329 156 -326 156 b -315 156 -319 156 -317 156 b -298 147 -311 155 -308 154 b -19 30 -224 98 -122 55 l 2 26 b 24 -1 17 22 24 13 b 2 -27 24 -15 17 -23 l -19 -31 b -298 -148 -122 -56 -224 -99 b -322 -158 -313 -158 -315 -158 b -348 -131 -338 -158 -348 -145 b -344 -117 -348 -127 -347 -122 b -328 -104 -341 -112 -338 -111 b -127 -8 -269 -65 -202 -33 b -106 0 -115 -4 -106 -1 b -127 6 -106 0 -115 2 b -328 102 -202 31 -269 63 b -344 116 -338 109 -341 111 b -348 130 -347 120 -348 124 b -330 155 -348 141 -341 152 ',\n },\n articAccentBelow: {\n x_min: -348.4375,\n x_max: 24.5,\n ha: 25,\n o: 'm -330 155 b -322 156 -329 156 -326 156 b -315 156 -319 156 -317 156 b -298 147 -311 155 -308 154 b -19 30 -224 98 -122 55 l 2 26 b 24 -1 17 22 24 13 b 2 -27 24 -15 17 -23 l -19 -31 b -298 -148 -122 -56 -224 -99 b -322 -158 -313 -158 -315 -158 b -348 -131 -338 -158 -348 -145 b -344 -117 -348 -127 -347 -122 b -328 -104 -341 -112 -338 -111 b -127 -8 -269 -65 -202 -33 b -106 0 -115 -4 -106 -1 b -127 6 -106 0 -115 2 b -328 102 -202 31 -269 63 b -344 116 -338 109 -341 111 b -348 130 -347 120 -348 124 b -330 155 -348 141 -341 152 ',\n },\n articTenutoAbove: {\n x_min: 0,\n x_max: 318.5,\n ha: 325,\n o: 'm 20 376 b 167 377 23 377 96 377 b 296 376 231 377 294 377 b 318 347 311 371 318 359 b 296 316 318 333 311 320 b 159 315 294 315 227 315 b 21 316 91 315 24 315 b 0 345 6 320 0 333 b 20 376 0 359 6 371 ',\n },\n articTenutoBelow: {\n x_min: 0,\n x_max: 318.5,\n ha: 325,\n o: 'm 20 376 b 167 377 23 377 96 377 b 296 376 231 377 294 377 b 318 347 311 371 318 359 b 296 316 318 333 311 320 b 159 315 294 315 227 315 b 21 316 91 315 24 315 b 0 345 6 320 0 333 b 20 376 0 359 6 371 ',\n },\n articStaccatoAbove: {\n x_min: 0,\n x_max: 133.390625,\n ha: 136,\n o: 'm 54 66 b 65 68 58 68 61 68 b 122 37 88 68 110 56 b 133 -1 130 26 133 12 b 104 -58 133 -23 123 -44 b 66 -69 92 -65 78 -69 b 10 -38 44 -69 23 -58 b 0 -1 2 -27 0 -13 b 54 66 0 30 20 61 ',\n },\n articStaccatoBelow: {\n x_min: 0,\n x_max: 133.390625,\n ha: 136,\n o: 'm 54 66 b 65 68 58 68 61 68 b 122 37 88 68 110 56 b 133 -1 130 26 133 12 b 104 -58 133 -23 123 -44 b 66 -69 92 -65 78 -69 b 10 -38 44 -69 23 -58 b 0 -1 2 -27 0 -13 b 54 66 0 30 20 61 ',\n },\n articStaccatissimoAbove: {\n x_min: -73.5,\n x_max: 72.140625,\n ha: 74,\n o: 'm -72 252 l -73 254 l 0 254 l 72 254 l 70 252 b 0 -1 70 248 0 -1 b -72 252 -1 -1 -72 248 ',\n },\n articStaccatissimoBelow: {\n x_min: -73.5,\n x_max: 72.140625,\n ha: 74,\n o: 'm -72 252 l -73 254 l 0 254 l 72 254 l 70 252 b 0 -1 70 248 0 -1 b -72 252 -1 -1 -72 248 ',\n },\n articMarcatoAbove: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -8 -1 b -1 0 -5 -1 -4 0 b 16 -11 5 0 13 -4 b 83 -186 17 -12 47 -90 l 148 -358 l 148 -363 b 127 -385 148 -376 138 -385 b 112 -378 122 -385 118 -383 b 54 -226 110 -374 114 -385 b 0 -81 24 -147 0 -81 b -55 -226 -1 -81 -25 -147 b -114 -378 -115 -385 -111 -374 b -129 -385 -119 -383 -123 -385 b -149 -363 -140 -385 -149 -376 l -149 -358 l -84 -186 b -19 -11 -49 -90 -19 -12 b -8 -1 -17 -8 -12 -4 ',\n },\n articMarcatoBelow: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -8 -1 b -1 0 -5 -1 -4 0 b 16 -11 5 0 13 -4 b 83 -186 17 -12 47 -90 l 148 -358 l 148 -363 b 127 -385 148 -376 138 -385 b 112 -378 122 -385 118 -383 b 54 -226 110 -374 114 -385 b 0 -81 24 -147 0 -81 b -55 -226 -1 -81 -25 -147 b -114 -378 -115 -385 -111 -374 b -129 -385 -119 -383 -123 -385 b -149 -363 -140 -385 -149 -376 l -149 -358 l -84 -186 b -19 -11 -49 -90 -19 -12 b -8 -1 -17 -8 -12 -4 ',\n },\n fermataAbove: {\n x_min: -442.359375,\n x_max: 441,\n ha: 450,\n o: 'm -31 487 b -1 488 -21 488 -10 488 b 434 104 216 488 397 330 b 441 27 438 79 441 47 b 439 12 441 20 439 15 b 419 0 435 4 427 0 b 404 5 413 0 408 1 b 398 30 400 11 398 13 b 0 351 390 213 213 351 b -59 348 -20 351 -39 349 b -400 30 -251 324 -393 191 b -405 5 -400 13 -401 11 b -420 0 -409 1 -415 0 b -441 12 -428 0 -436 4 b -442 27 -441 15 -442 20 b -435 104 -442 47 -439 79 b -31 487 -401 316 -235 474 m -13 131 b -1 133 -9 133 -5 133 b 51 105 19 133 39 123 b 61 70 58 95 61 83 b 51 34 61 58 58 45 b -1 6 39 16 19 6 b -46 27 -17 6 -34 13 b -62 69 -57 38 -62 54 b -13 131 -62 98 -44 124 ',\n },\n fermataBelow: {\n x_min: -441,\n x_max: 439.640625,\n ha: 449,\n o: 'm -428 -2 b -421 0 -427 -1 -424 0 b -406 -6 -416 0 -409 -2 b -400 -31 -401 -12 -400 -15 b -1 -352 -392 -215 -215 -352 b 58 -349 19 -352 38 -351 b 398 -31 250 -326 392 -192 b 404 -6 398 -15 400 -12 b 419 -1 408 -2 413 -1 b 439 -13 427 -1 435 -5 b 439 -29 439 -16 439 -22 b 434 -105 439 -48 438 -80 b 0 -489 397 -333 213 -489 b -68 -484 -23 -489 -44 -488 b -441 -36 -280 -452 -436 -263 b -441 -30 -441 -34 -441 -31 b -428 -2 -441 -11 -439 -5 m -13 -9 b -1 -8 -9 -8 -5 -8 b 50 -36 19 -8 39 -19 b 61 -72 57 -47 61 -59 b 50 -106 61 -84 57 -97 b -1 -134 39 -124 19 -134 b -46 -115 -17 -134 -34 -129 b -62 -72 -57 -102 -62 -87 b -13 -9 -62 -44 -44 -16 ',\n },\n breathMarkComma: {\n x_min: -1.359375,\n x_max: 193.28125,\n ha: 197,\n o: 'm 78 233 b 87 233 81 233 84 233 b 187 140 132 233 174 195 b 193 102 190 127 193 115 b 43 -113 193 22 136 -62 b 27 -119 36 -116 31 -119 b 19 -108 21 -119 19 -115 b 29 -97 19 -102 20 -101 b 102 13 73 -72 102 -27 b 92 51 102 26 98 40 l 91 54 l 84 54 b 8 104 53 54 21 74 b -1 142 1 116 -1 130 b 78 233 -1 187 31 227 ',\n },\n breathMarkUpbow: {\n x_min: -170.140625,\n x_max: 168.78125,\n ha: 172,\n o: 'm -160 567 b -122 567 -159 567 -149 567 l -87 567 l -84 566 b -74 553 -78 563 -77 560 b -20 366 -73 551 -49 466 b 31 186 8 267 31 186 b 85 371 31 186 55 269 b 140 559 114 473 138 557 b 153 567 141 564 148 567 b 168 559 159 567 166 564 b 168 555 168 557 168 557 b 92 281 168 548 159 513 b 14 13 50 134 14 13 b 0 0 14 6 6 0 b -17 15 -8 0 -17 8 b -93 283 -17 15 -51 136 b -170 552 -166 533 -170 548 b -170 553 -170 552 -170 552 b -160 567 -170 560 -167 564 ',\n },\n caesura: {\n x_min: 0,\n x_max: 622.03125,\n ha: 635,\n o: 'm 398 417 b 406 419 401 419 404 419 b 427 398 417 419 427 409 b 427 391 427 395 427 392 b 34 -274 424 385 38 -272 b 20 -280 29 -278 25 -280 b 0 -259 9 -280 0 -270 b 0 -252 0 -256 0 -254 b 393 413 2 -247 389 410 b 398 417 394 415 397 416 m 592 417 b 600 419 594 419 597 419 b 622 398 611 419 622 409 b 620 391 622 395 620 392 b 227 -274 617 385 231 -272 b 213 -280 223 -278 219 -280 b 193 -259 202 -280 193 -270 b 194 -252 193 -256 193 -254 b 586 413 196 -247 582 410 b 592 417 588 415 590 416 ',\n },\n caesuraCurved: {\n x_min: 0,\n x_max: 503.609375,\n ha: 514,\n o: 'm 274 430 b 277 430 276 430 277 430 b 310 394 296 430 310 415 b 308 383 310 391 308 387 b 306 367 307 381 307 374 b 236 120 298 305 272 210 b 40 -273 189 -5 125 -134 b 20 -287 35 -283 27 -287 b 5 -281 14 -287 9 -285 b 0 -267 1 -277 0 -273 b 9 -242 0 -262 2 -255 b 246 395 137 -12 232 242 b 274 430 249 416 257 427 m 468 430 b 472 430 469 430 470 430 b 503 394 490 430 503 415 b 502 383 503 391 503 387 b 499 367 502 381 500 374 b 431 120 491 305 465 210 b 234 -273 382 -5 318 -134 b 213 -287 228 -283 220 -287 b 198 -281 208 -287 202 -285 b 193 -267 194 -277 193 -273 b 202 -242 193 -262 196 -255 b 439 395 330 -12 426 242 b 468 430 442 416 451 427 ',\n },\n restMaxima: {\n x_min: 0,\n x_max: 464.140625,\n ha: 474,\n o: 'm 0 0 l 0 347 l 76 347 l 153 347 l 153 0 l 153 -348 l 76 -348 l 0 -348 l 0 0 m 308 -1 l 308 347 l 386 347 l 464 347 l 464 -1 l 464 -348 l 386 -348 l 308 -348 l 308 -1 ',\n },\n restDoubleWhole: {\n x_min: 0,\n x_max: 386.5625,\n ha: 394,\n o: 'm 0 173 l 0 347 l 193 347 l 386 347 l 386 173 l 386 0 l 193 0 l 0 0 l 0 173 ',\n },\n restWhole: {\n x_min: 0,\n x_max: 447.8125,\n ha: 457,\n o: 'm 0 -87 l 0 0 l 223 0 l 447 0 l 447 -87 l 447 -174 l 223 -174 l 0 -174 l 0 -87 ',\n },\n restHalf: {\n x_min: 0,\n x_max: 447.8125,\n ha: 457,\n o: 'm 0 86 l 0 173 l 223 173 l 447 173 l 447 86 l 447 0 l 223 0 l 0 0 l 0 86 ',\n },\n restQuarter: {\n x_min: 0,\n x_max: 300.8125,\n ha: 307,\n o: 'm 49 505 b 53 506 50 505 51 506 b 70 496 58 506 62 503 b 81 485 73 492 78 488 l 96 473 l 111 459 l 122 449 l 134 438 l 182 396 l 255 330 b 292 291 292 298 292 298 l 292 290 l 292 284 l 283 270 b 209 36 234 197 209 113 b 288 -170 209 -44 235 -119 b 299 -184 295 -179 299 -181 b 300 -191 300 -187 300 -188 b 285 -206 300 -199 294 -206 b 280 -206 283 -206 281 -206 b 247 -201 270 -202 259 -201 b 176 -222 223 -201 197 -208 b 114 -340 136 -249 114 -292 b 172 -471 114 -384 134 -433 b 185 -492 182 -481 185 -487 b 181 -502 185 -496 183 -499 b 171 -508 176 -505 174 -508 b 152 -498 166 -508 160 -503 b 0 -284 65 -428 12 -352 b 0 -260 0 -278 0 -270 b 1 -238 0 -252 0 -242 b 148 -140 16 -177 73 -140 b 209 -148 167 -140 189 -142 b 215 -149 212 -148 215 -149 b 215 -149 215 -149 215 -149 l 215 -149 b 201 -136 215 -148 209 -142 l 157 -97 l 96 -41 b 17 34 21 24 17 29 b 17 37 17 36 17 36 b 17 38 17 37 17 38 b 25 56 17 44 17 44 b 110 298 81 131 110 219 b 46 474 110 367 88 431 b 38 491 40 480 38 487 b 49 505 38 498 42 502 ',\n },\n rest8th: {\n x_min: 0,\n x_max: 349.8125,\n ha: 357,\n o: 'm 88 302 b 103 303 93 302 98 303 b 202 224 149 303 191 270 b 205 199 204 216 205 208 b 178 129 205 173 196 147 l 175 126 l 182 127 b 307 249 236 142 284 190 b 313 259 308 254 311 258 b 329 267 317 265 323 267 b 349 247 340 267 349 259 b 201 -263 349 242 204 -258 b 182 -273 197 -270 190 -273 b 163 -260 174 -273 166 -269 b 161 -256 161 -259 161 -258 b 217 -59 161 -248 170 -220 b 272 129 247 43 272 127 b 272 129 272 129 272 129 b 264 122 272 129 268 126 b 140 80 227 94 183 80 b 36 115 102 80 65 91 b 0 194 10 136 0 165 b 88 302 0 244 32 292 ',\n },\n rest16th: {\n x_min: 0,\n x_max: 450.53125,\n ha: 460,\n o: 'm 189 302 b 204 303 193 302 198 303 b 303 224 250 303 292 270 b 306 199 304 216 306 208 b 279 129 306 173 296 147 l 276 126 l 281 127 b 408 249 337 142 385 190 b 412 259 409 254 412 258 b 430 267 417 265 423 267 b 450 247 441 267 450 259 b 200 -605 450 242 204 -599 b 182 -616 197 -612 190 -616 b 163 -602 174 -616 166 -610 b 161 -598 161 -601 161 -601 b 217 -402 161 -589 170 -562 b 272 -213 247 -298 272 -213 b 272 -213 272 -213 272 -213 b 264 -219 272 -213 268 -216 b 140 -262 227 -247 182 -262 b 36 -226 102 -262 65 -249 b 0 -145 12 -206 0 -176 b 17 -84 0 -124 5 -104 b 103 -38 38 -54 70 -38 b 191 -91 137 -38 172 -56 b 205 -141 201 -106 205 -124 b 178 -212 205 -167 196 -194 l 175 -215 l 182 -213 b 307 -93 236 -198 284 -151 b 372 129 308 -88 372 127 b 372 129 372 129 372 129 b 364 122 372 129 368 126 b 240 80 328 94 283 80 b 137 115 202 80 166 91 b 99 194 111 136 99 165 b 189 302 99 244 133 292 ',\n },\n rest32nd: {\n x_min: 0,\n x_max: 551.25,\n ha: 563,\n o: 'm 289 644 b 304 645 294 645 299 645 b 404 566 349 645 392 613 b 406 541 405 557 406 549 b 379 471 406 514 397 489 l 377 467 l 382 470 b 509 591 438 485 485 531 b 513 601 510 595 513 599 b 530 609 518 607 524 609 b 551 588 540 609 551 602 b 200 -605 551 584 204 -599 b 182 -616 197 -612 190 -616 b 163 -602 174 -616 166 -610 b 161 -598 161 -601 161 -601 b 217 -402 161 -589 170 -562 b 272 -213 247 -298 272 -213 b 272 -213 272 -213 272 -213 b 264 -219 272 -213 268 -216 b 140 -262 227 -247 182 -262 b 36 -226 102 -262 65 -249 b 0 -145 12 -206 0 -176 b 17 -84 0 -124 5 -104 b 103 -38 38 -54 70 -38 b 191 -91 137 -38 172 -56 b 205 -141 201 -106 205 -124 b 178 -212 205 -167 196 -194 l 175 -215 l 182 -213 b 307 -93 236 -198 284 -151 b 372 129 308 -88 372 127 b 372 129 372 129 372 129 b 364 122 372 129 368 126 b 240 80 328 94 283 80 b 137 115 202 80 166 91 b 99 195 112 136 99 165 b 118 256 99 217 106 238 b 204 303 138 287 171 303 b 292 249 238 303 273 285 b 306 199 302 234 306 217 b 279 129 306 173 296 148 l 276 126 l 281 127 b 408 248 336 142 385 190 b 473 470 409 254 473 469 b 473 470 473 470 473 470 b 465 464 473 470 469 467 b 341 421 428 435 383 421 b 236 458 303 421 266 433 b 200 537 212 478 200 508 b 289 644 200 585 234 635 ',\n },\n rest64th: {\n x_min: -1.359375,\n x_max: 651.96875,\n ha: 665,\n o: 'm 389 644 b 405 645 394 645 400 645 b 504 566 450 645 492 613 b 507 541 506 557 507 549 b 480 471 507 514 498 489 l 477 467 l 483 470 b 609 591 539 485 586 531 b 613 601 611 595 613 599 b 631 609 619 607 624 609 b 651 588 641 609 651 602 b 200 -946 651 584 204 -941 b 182 -957 197 -953 190 -957 b 163 -945 174 -957 166 -953 b 161 -939 161 -942 161 -942 b 217 -743 161 -931 170 -904 b 272 -555 247 -639 272 -555 b 272 -555 272 -555 272 -555 b 264 -560 272 -555 268 -557 b 140 -603 227 -589 182 -603 b 36 -567 102 -603 65 -592 b -1 -487 12 -548 -1 -517 b 17 -427 -1 -466 5 -445 b 103 -380 38 -395 70 -380 b 191 -433 137 -380 172 -398 b 205 -484 201 -448 205 -466 b 178 -553 205 -509 196 -535 l 175 -557 l 182 -555 b 307 -435 236 -539 284 -494 b 372 -213 308 -430 372 -215 b 372 -213 372 -213 372 -213 b 364 -219 372 -213 368 -216 b 240 -262 328 -247 283 -262 b 137 -226 202 -262 166 -249 b 99 -145 112 -206 99 -176 b 118 -84 99 -124 106 -104 b 204 -38 138 -54 171 -38 b 292 -91 238 -38 273 -56 b 306 -141 302 -106 306 -124 b 279 -212 306 -167 296 -194 l 276 -215 l 281 -213 b 408 -93 336 -198 385 -151 b 473 129 409 -88 473 127 b 473 129 473 129 473 129 b 465 122 473 129 469 126 b 341 80 428 94 383 80 b 236 115 303 80 266 91 b 200 195 213 136 200 165 b 217 256 200 217 206 238 b 304 303 239 287 272 303 b 393 249 338 303 374 285 b 406 199 402 234 406 217 b 379 129 406 173 397 148 l 377 126 l 382 127 b 509 248 436 142 485 190 b 574 470 510 254 574 469 b 574 470 574 470 574 470 b 566 464 574 470 570 467 b 442 421 529 435 484 421 b 337 458 404 421 367 433 b 300 537 313 478 300 508 b 389 644 300 585 334 635 ',\n },\n rest128th: {\n x_min: -1.359375,\n x_max: 752.703125,\n ha: 768,\n o: 'm 490 985 b 504 986 495 986 500 986 b 604 907 551 986 593 954 b 607 884 607 900 607 892 b 581 813 607 857 597 831 l 578 810 l 583 811 b 710 932 638 827 687 873 b 714 943 711 936 713 942 b 730 952 720 949 725 952 b 752 931 741 952 752 943 b 200 -946 752 927 204 -941 b 182 -957 197 -953 190 -957 b 163 -945 174 -957 166 -953 b 161 -939 161 -942 161 -942 b 217 -743 161 -931 170 -904 b 272 -555 247 -639 272 -555 b 272 -555 272 -555 272 -555 b 264 -560 272 -555 268 -557 b 140 -603 227 -589 182 -603 b 36 -567 102 -603 65 -592 b -1 -487 12 -548 -1 -517 b 17 -427 -1 -466 5 -445 b 103 -380 38 -395 70 -380 b 191 -433 137 -380 172 -398 b 205 -484 201 -448 205 -466 b 178 -553 205 -509 196 -535 l 175 -557 l 182 -555 b 307 -435 236 -539 284 -494 b 372 -213 308 -430 372 -215 b 372 -213 372 -213 372 -213 b 364 -219 372 -213 368 -216 b 240 -262 328 -247 283 -262 b 137 -226 202 -262 166 -249 b 99 -145 112 -206 99 -176 b 118 -84 99 -124 106 -104 b 204 -38 138 -54 171 -38 b 292 -91 238 -38 273 -56 b 306 -141 302 -106 306 -124 b 279 -212 306 -167 296 -194 l 276 -215 l 281 -213 b 408 -93 336 -198 385 -151 b 473 129 409 -88 473 127 b 473 129 473 129 473 129 b 465 122 473 129 469 126 b 341 80 428 94 383 80 b 236 115 303 80 266 91 b 200 195 213 136 200 165 b 217 256 200 217 206 238 b 304 303 239 287 272 303 b 393 249 338 303 374 285 b 406 199 402 234 406 217 b 379 129 406 173 397 148 l 377 126 l 382 127 b 509 248 436 142 485 190 b 574 470 510 254 574 469 b 574 470 574 470 574 470 b 566 464 574 470 570 467 b 442 421 529 435 484 421 b 337 458 404 421 367 433 b 300 538 314 477 300 508 b 318 598 300 559 306 580 b 404 645 340 630 372 645 b 494 592 439 645 475 627 b 507 541 502 577 507 559 b 480 471 507 516 498 489 l 477 467 l 483 470 b 608 589 537 485 586 531 b 675 811 611 595 675 810 b 675 811 675 811 675 811 b 666 806 675 811 671 809 b 543 763 628 777 585 763 b 438 799 504 763 468 775 b 401 878 412 820 401 849 b 490 985 401 928 434 977 ',\n },\n dynamicPiano: {\n x_min: -53.078125,\n x_max: 513.140625,\n ha: 485,\n o: 'm 185 383 b 196 384 187 383 191 384 b 277 334 230 384 259 365 b 288 301 281 324 288 306 b 288 297 288 298 288 297 b 294 302 289 297 291 299 b 394 370 323 338 367 367 b 404 371 398 370 401 371 b 510 272 453 371 498 328 b 513 237 513 262 513 251 b 507 172 513 217 511 192 b 326 -34 487 59 412 -26 b 314 -36 322 -36 318 -36 b 274 -24 298 -36 283 -31 l 265 -16 b 224 44 246 -1 232 20 b 223 49 224 47 223 49 b 223 49 223 49 223 49 b 149 -197 221 48 149 -194 b 149 -198 149 -197 149 -198 b 170 -210 149 -202 155 -205 b 187 -215 174 -210 175 -212 b 204 -231 201 -219 204 -222 b 197 -245 204 -240 202 -242 l 194 -248 l 76 -248 l -42 -248 l -46 -245 b -53 -231 -51 -242 -53 -240 b -35 -215 -53 -222 -49 -217 b -13 -210 -21 -212 -20 -212 b -6 -208 -10 -209 -8 -208 b 0 -206 -6 -208 -2 -206 b 25 -188 13 -201 21 -195 b 163 280 28 -183 163 276 b 166 291 163 283 164 287 b 167 302 167 295 167 299 b 155 324 167 315 161 324 b 155 324 155 324 155 324 b 65 230 125 322 85 280 b 53 215 61 217 58 215 b 51 215 53 215 51 215 b 42 224 46 215 42 217 b 57 263 42 231 47 244 b 140 360 77 305 104 337 b 152 370 144 365 149 369 b 185 383 157 376 172 381 m 374 306 b 366 308 371 308 368 308 b 300 273 348 308 321 294 b 284 254 288 262 287 259 b 280 242 283 249 281 245 b 257 169 279 240 270 213 l 236 98 l 236 93 b 251 48 238 77 243 61 b 279 27 258 37 272 27 b 281 27 279 27 280 27 b 291 31 281 27 287 30 b 396 170 334 52 378 109 b 406 247 402 197 406 224 b 401 277 406 259 405 270 b 374 306 397 290 383 303 ',\n },\n dynamicMezzo: {\n x_min: 46.28125,\n x_max: 669.671875,\n ha: 563,\n o: 'm 183 376 b 189 376 185 376 187 376 b 212 374 197 376 208 376 b 265 337 234 369 253 355 b 274 317 268 331 273 320 b 274 316 274 317 274 316 b 280 323 276 316 276 319 b 311 358 288 337 299 348 b 319 366 315 360 318 365 b 356 376 326 373 340 376 b 382 371 364 376 374 374 b 428 337 400 366 417 352 b 436 317 431 331 436 320 b 438 316 436 317 436 316 b 442 323 438 316 439 319 b 475 358 451 337 462 348 b 483 366 477 360 481 365 b 518 376 488 373 503 376 b 544 373 528 376 536 376 b 604 285 579 360 604 326 b 597 249 604 273 601 258 b 543 63 596 247 544 70 b 541 54 543 61 541 55 b 540 44 540 51 540 47 b 552 23 540 33 545 23 b 552 23 552 23 552 23 b 647 126 586 29 627 72 b 658 138 651 136 653 138 b 660 138 660 138 660 138 b 669 129 666 137 669 136 b 654 88 669 122 665 109 b 562 -12 631 43 602 9 l 549 -19 b 521 -27 540 -24 530 -27 b 447 30 490 -27 458 -4 b 443 58 445 38 443 48 b 450 93 443 72 446 84 b 504 278 453 97 504 272 b 507 288 506 283 506 287 b 509 298 507 292 509 295 b 491 326 509 310 502 320 b 487 327 490 327 488 327 b 479 324 484 327 483 326 b 441 270 462 316 443 288 b 435 249 441 265 436 254 b 398 127 434 248 419 195 b 362 4 379 61 362 5 b 328 -1 359 -1 362 -1 b 314 -1 323 -1 319 -1 b 302 -1 310 -1 306 -1 b 266 4 266 -1 269 -1 b 265 6 265 5 265 5 b 303 144 265 13 272 34 b 343 278 325 216 343 276 b 344 288 343 281 344 285 b 345 298 345 291 345 295 b 330 326 345 310 340 320 b 323 327 328 327 325 327 b 317 324 322 327 321 326 b 279 270 300 316 281 288 b 273 249 279 265 274 254 b 236 127 272 248 255 195 b 200 4 216 61 200 5 b 164 -1 197 -1 198 -1 b 151 -1 161 -1 156 -1 b 140 -1 147 -1 142 -1 b 103 4 104 -1 106 -1 b 103 6 103 5 103 5 b 141 144 103 13 108 34 b 181 278 161 216 179 276 b 182 288 181 281 181 285 b 183 298 182 291 183 295 b 168 324 183 310 178 320 b 160 327 166 326 163 327 b 141 320 156 327 151 324 b 69 230 112 305 85 272 b 57 215 65 217 62 215 b 55 215 57 215 55 215 b 46 224 49 215 46 217 b 59 260 46 231 50 242 b 151 363 81 306 112 341 b 161 369 155 365 160 367 b 183 376 166 371 174 374 ',\n },\n dynamicForte: {\n x_min: -118.421875,\n x_max: 597.53125,\n ha: 381,\n o: 'm 460 574 b 464 574 461 574 462 574 b 488 574 470 574 481 574 b 500 573 491 574 498 574 b 594 503 543 570 588 538 b 597 488 596 498 597 494 b 528 417 597 449 564 417 b 502 423 519 417 510 419 b 465 481 477 434 465 458 b 488 528 465 499 472 516 b 490 530 490 530 490 530 b 490 530 490 530 490 530 b 468 517 488 530 475 523 b 349 340 419 485 377 420 b 347 330 348 334 347 330 b 383 328 347 328 363 328 b 428 326 423 328 424 328 b 442 302 438 320 442 312 b 430 281 442 294 438 285 b 385 276 424 277 426 276 l 377 276 l 332 276 l 330 269 b 178 -117 303 126 250 -9 b 1 -249 129 -194 69 -237 b -20 -251 -6 -251 -13 -251 b -114 -187 -65 -251 -100 -227 b -118 -156 -117 -177 -118 -166 b -51 -84 -118 -116 -91 -84 b -31 -87 -46 -84 -39 -86 b 16 -152 0 -95 16 -124 b -12 -205 16 -173 8 -194 b -16 -208 -14 -206 -16 -208 b -14 -208 -16 -208 -14 -208 b -9 -206 -14 -208 -12 -208 b 74 -124 23 -197 54 -166 b 172 224 98 -79 125 22 b 185 276 178 252 183 274 b 185 276 185 276 185 276 b 141 276 185 276 181 276 b 91 280 96 276 96 276 b 77 302 83 285 77 294 b 91 326 77 312 83 320 b 148 328 95 328 96 328 l 198 330 l 202 341 b 460 574 249 473 351 566 ',\n },\n dynamicRinforzando: {\n x_min: 78.9375,\n x_max: 485.921875,\n ha: 417,\n o: 'm 362 378 b 378 380 367 380 372 380 b 472 348 415 380 453 367 b 485 315 481 338 485 327 b 462 273 485 298 477 281 b 439 267 454 269 446 267 b 398 290 424 267 409 274 b 344 319 385 309 364 319 b 281 269 315 319 289 301 b 279 262 280 266 279 262 b 276 256 279 260 277 258 b 274 249 276 254 274 251 b 238 127 273 248 257 192 b 201 4 217 61 201 5 b 166 -1 198 -1 200 -1 b 153 -1 163 -1 157 -1 b 141 -1 148 -1 144 -1 b 104 4 106 -1 107 -1 b 104 6 104 5 104 5 b 142 144 104 13 110 34 b 182 278 164 219 181 276 b 183 288 182 281 182 285 b 185 302 185 292 185 298 b 164 330 185 317 176 328 b 159 330 163 330 161 330 b 102 302 140 330 119 320 b 91 294 95 295 93 294 b 88 294 91 294 89 294 b 78 303 83 294 78 298 b 81 312 78 306 78 309 b 200 373 106 347 160 373 b 215 371 205 373 209 371 b 266 335 235 367 254 353 b 269 331 268 333 269 331 b 269 331 269 331 269 331 b 273 335 269 331 270 334 b 362 378 298 359 330 376 ',\n },\n dynamicSforzando: {\n x_min: 70.78125,\n x_max: 378.390625,\n ha: 315,\n o: 'm 246 373 b 254 373 249 373 251 373 b 372 324 303 373 360 351 b 378 302 377 317 378 309 b 338 251 378 278 362 255 b 328 249 334 249 332 249 b 283 294 303 249 283 270 b 288 315 283 301 284 308 b 289 319 289 317 289 319 b 289 319 289 319 289 319 b 283 320 289 320 287 320 b 270 322 279 322 274 322 b 206 288 242 322 215 308 b 206 283 206 287 206 285 b 257 223 206 267 230 238 b 284 206 272 213 277 210 b 351 90 328 173 351 130 b 340 47 351 74 348 59 b 205 -30 314 -2 264 -30 b 182 -29 198 -30 190 -30 b 84 15 147 -24 103 -5 b 70 48 74 24 70 36 b 108 99 70 70 85 94 b 121 102 112 101 117 102 b 167 56 147 102 167 80 b 159 31 167 48 164 40 l 156 26 l 157 26 b 190 20 167 22 178 20 b 220 26 201 20 212 22 b 258 65 243 34 258 51 b 257 70 258 66 258 69 b 204 126 249 94 234 109 b 114 258 148 158 114 209 b 125 302 114 273 118 288 b 246 373 147 342 193 370 ',\n },\n dynamicZ: {\n x_min: 29.9375,\n x_max: 420.578125,\n ha: 371,\n o: 'm 115 345 b 221 347 117 345 166 347 b 411 345 306 347 409 345 b 420 330 416 342 420 335 b 415 319 420 326 419 321 b 178 118 397 303 179 118 b 178 117 178 118 178 117 b 181 117 178 117 178 117 b 189 117 182 117 185 117 b 193 117 190 117 191 117 b 247 98 215 117 232 111 b 296 75 266 83 280 76 b 302 75 299 75 300 75 b 322 91 311 75 315 79 b 322 91 322 91 322 91 b 322 91 322 91 322 91 b 319 91 322 91 321 91 b 313 90 318 90 315 90 b 283 107 300 90 288 97 b 277 126 279 114 277 121 b 319 167 277 149 295 167 b 319 167 319 167 319 167 b 362 118 347 167 362 147 b 355 82 362 108 359 96 b 311 33 349 65 340 55 b 224 1 284 12 253 1 b 194 5 213 1 204 2 b 168 18 183 8 178 11 b 110 36 151 30 130 36 b 57 15 88 36 68 29 b 47 11 54 12 51 11 b 31 20 40 11 34 13 b 29 26 31 22 29 25 b 68 66 29 36 39 45 b 285 250 73 71 281 248 b 285 250 285 250 285 250 b 231 252 285 252 261 252 b 137 250 190 252 141 250 b 93 227 122 248 110 241 b 78 220 88 222 83 220 b 66 227 74 220 70 222 b 63 234 65 229 63 231 b 85 291 63 241 69 252 b 115 345 108 342 108 344 ',\n },\n ornamentTrill: {\n x_min: -340.28125,\n x_max: 338.921875,\n ha: 346,\n o: 'm -32 520 b -29 521 -31 520 -31 521 b -23 519 -27 521 -24 520 b -20 513 -21 517 -20 516 b -21 506 -20 512 -20 509 b -31 474 -23 502 -27 488 l -53 402 l -66 352 l -68 349 l -57 349 b -32 351 -51 349 -40 351 b 123 370 19 352 74 359 b 137 371 127 370 133 371 b 170 356 152 371 164 366 b 171 355 170 355 170 355 b 216 366 174 355 183 358 b 280 378 268 377 266 377 b 287 378 283 378 284 378 b 332 349 307 378 322 369 b 338 319 336 341 338 330 b 332 301 338 310 336 302 b 242 280 329 299 246 280 b 242 280 242 280 242 280 b 235 288 236 280 235 283 b 235 292 235 290 235 291 b 236 302 236 297 236 299 b 220 337 236 316 230 330 l 216 340 l 210 335 b 159 276 189 322 172 301 b 118 149 152 265 156 274 b 81 34 84 36 85 36 b -8 13 78 33 -4 13 b -8 13 -8 13 -8 13 b -14 20 -12 15 -14 15 b -8 44 -14 24 -12 31 b -2 66 -5 55 -2 65 b -2 66 -2 66 -2 66 l -2 66 b -43 41 -2 66 -21 55 b -114 4 -98 8 -98 8 b -144 0 -123 0 -134 0 b -242 99 -197 0 -242 43 b -242 109 -242 102 -242 105 b -212 219 -240 122 -242 116 b -185 312 -197 270 -185 312 l -185 312 b -189 312 -185 312 -186 312 b -259 312 -200 312 -227 312 b -321 310 -291 312 -310 310 b -334 312 -330 310 -334 312 b -340 319 -338 313 -340 316 b -336 326 -340 322 -338 324 b -291 337 -334 326 -314 331 l -247 347 l -210 348 b -172 348 -190 348 -172 348 b -168 363 -172 348 -171 355 b -145 442 -151 424 -145 441 b -133 452 -144 444 -140 446 l -77 489 b -32 520 -53 506 -32 520 m 57 334 b 53 335 55 335 54 335 b 44 334 50 335 49 335 b -70 316 8 326 -28 320 b -78 309 -78 316 -78 316 b -108 202 -80 305 -88 274 b -141 81 -136 112 -141 93 b -140 74 -141 79 -141 77 b -117 49 -137 59 -127 49 b -107 52 -114 49 -110 51 b 16 127 -106 54 14 126 b 42 217 16 127 42 215 b 49 241 42 222 44 229 b 73 320 53 251 73 317 b 57 334 73 327 65 333 ',\n },\n ornamentTurn: {\n x_min: -423.3125,\n x_max: 421.9375,\n ha: 431,\n o: 'm -262 197 b -247 197 -257 197 -253 197 b -118 162 -210 197 -163 184 b 40 45 -61 134 -13 98 b 277 -95 119 -33 200 -81 b 289 -97 281 -97 285 -97 b 378 0 332 -97 371 -55 b 378 11 378 4 378 6 b 302 83 378 55 345 83 b 242 66 283 83 262 77 b 208 56 231 59 219 56 b 148 120 175 56 148 81 b 201 186 148 151 164 172 b 261 198 220 194 240 198 b 420 45 341 198 411 136 b 421 22 421 37 421 29 b 245 -199 421 -93 338 -199 b 238 -198 243 -199 240 -199 b -44 -47 148 -194 50 -141 b -250 86 -114 22 -183 66 b -295 94 -270 91 -283 94 b -315 91 -302 94 -307 94 b -381 4 -356 81 -381 43 b -355 -56 -381 -18 -372 -40 b -298 -81 -338 -73 -319 -81 b -246 -68 -283 -81 -265 -77 b -212 -58 -234 -61 -223 -58 b -178 -69 -200 -58 -189 -62 b -151 -122 -160 -81 -151 -101 b -171 -167 -151 -138 -157 -155 b -239 -195 -185 -181 -213 -192 b -257 -197 -245 -197 -250 -197 b -423 -5 -352 -197 -423 -109 b -412 65 -423 16 -419 40 b -262 197 -389 137 -329 188 ',\n },\n ornamentTurnSlash: {\n x_min: -423.3125,\n x_max: 421.9375,\n ha: 431,\n o: 'm -10 276 b -2 277 -8 277 -5 277 b 17 265 5 277 13 273 b 19 163 19 260 19 260 l 19 68 l 39 45 b 277 -95 122 -34 200 -81 b 289 -97 281 -97 285 -97 b 378 0 332 -97 371 -54 b 378 11 378 4 378 6 b 302 83 378 55 345 83 b 242 66 283 83 262 77 b 208 56 231 59 219 56 b 148 120 175 56 148 81 b 200 186 148 151 164 172 b 261 198 220 194 240 198 b 420 45 341 198 411 137 b 421 22 421 37 421 29 b 257 -198 421 -86 347 -188 b 242 -198 251 -198 247 -198 b 20 -105 181 -198 95 -163 l 19 -104 l 19 -183 b 19 -216 19 -195 19 -206 b 12 -273 19 -272 17 -267 b -2 -278 8 -277 2 -278 b -21 -266 -10 -278 -19 -274 b -23 -165 -23 -263 -23 -262 l -23 -69 l -44 -47 b -250 86 -117 23 -183 66 b -295 94 -270 93 -284 94 b -315 91 -302 94 -308 94 b -381 5 -356 81 -381 43 b -355 -56 -381 -16 -372 -40 b -299 -81 -338 -73 -319 -81 b -246 -68 -283 -81 -265 -77 b -212 -58 -234 -61 -223 -58 b -168 -77 -196 -58 -179 -65 b -151 -122 -156 -90 -151 -105 b -179 -174 -151 -141 -160 -162 b -239 -195 -194 -184 -217 -192 b -257 -197 -245 -195 -250 -197 b -423 -5 -349 -197 -423 -113 b -423 0 -423 -4 -423 -1 b -277 194 -420 97 -362 173 b -247 197 -268 197 -258 197 b -24 104 -185 197 -100 162 l -23 102 l -23 181 b -21 265 -23 260 -23 260 b -10 276 -20 269 -14 274 ',\n },\n ornamentMordent: {\n x_min: -402.890625,\n x_max: 401.53125,\n ha: 410,\n o: 'm -10 273 b -4 274 -9 273 -6 274 b 16 262 4 274 12 269 b 17 158 17 259 17 259 l 17 56 l 62 112 b 117 174 110 172 110 172 b 122 174 118 174 119 174 b 132 173 125 174 129 173 b 295 11 134 172 171 134 l 307 -1 l 336 34 b 374 76 366 72 368 74 b 381 77 375 77 378 77 b 401 56 392 77 401 68 b 400 48 401 54 401 51 b 223 -172 397 41 230 -166 b 210 -176 220 -174 215 -176 b 201 -174 206 -176 204 -176 b 112 -87 198 -173 178 -152 b 27 0 65 -38 27 0 b 21 -6 27 0 24 -2 l 17 -12 l 17 -147 b 17 -210 17 -173 17 -194 b 10 -292 17 -297 16 -287 b -2 -299 6 -297 2 -299 b -21 -287 -10 -299 -19 -295 b -24 -174 -23 -284 -23 -284 l -24 -63 l -66 -117 b -121 -176 -110 -170 -114 -176 b -125 -176 -122 -176 -123 -176 b -296 -12 -134 -174 -125 -184 l -308 0 l -337 -34 b -375 -77 -367 -73 -370 -76 b -382 -79 -377 -79 -379 -79 b -402 -58 -393 -79 -402 -69 b -401 -49 -402 -55 -402 -52 b -224 170 -398 -43 -231 165 b -212 174 -221 173 -216 174 b -202 173 -208 174 -205 174 b -39 11 -200 172 -151 122 l -28 -1 l -25 1 l -24 4 l -24 130 b -23 260 -24 256 -24 258 b -10 273 -20 266 -16 270 ',\n },\n ornamentShortTrill: {\n x_min: -402.890625,\n x_max: 401.53125,\n ha: 410,\n o: 'm -219 173 b -213 174 -217 174 -215 174 b -202 173 -209 174 -205 173 b -114 86 -200 172 -179 151 b -28 0 -66 37 -28 0 b 40 84 -28 0 2 37 b 117 174 111 173 110 172 b 122 174 118 174 119 174 b 132 173 125 174 129 173 b 295 11 134 172 171 134 l 307 -1 l 336 34 b 374 76 366 72 368 74 b 381 77 375 77 378 77 b 401 56 392 77 401 68 b 400 48 401 54 401 51 b 223 -172 397 41 230 -166 b 210 -176 220 -174 215 -176 b 201 -174 206 -176 204 -176 b 112 -87 198 -173 178 -152 b 27 0 65 -38 27 0 b -42 -86 27 0 -4 -38 b -118 -174 -112 -174 -111 -173 b -123 -176 -119 -176 -121 -176 b -133 -174 -126 -176 -130 -174 b -296 -12 -136 -173 -172 -137 l -308 0 l -337 -34 b -375 -77 -367 -73 -370 -76 b -382 -79 -377 -79 -379 -79 b -402 -58 -393 -79 -402 -69 b -401 -49 -402 -55 -402 -52 b -224 172 -398 -43 -228 167 b -219 173 -223 172 -220 173 ',\n },\n ornamentTremblement: {\n x_min: -571.671875,\n x_max: 570.3125,\n ha: 582,\n o: 'm -386 173 b -381 174 -385 174 -383 174 b -370 173 -377 174 -372 173 b -281 86 -367 172 -347 151 b -196 0 -235 37 -196 0 b -126 84 -196 0 -164 37 b -50 174 -55 173 -57 172 b -44 174 -49 174 -47 174 b -35 173 -42 174 -38 173 b 53 86 -32 172 -12 151 b 138 0 100 37 138 0 b 208 84 140 0 170 37 b 284 174 279 173 277 172 b 289 174 285 174 288 174 b 299 173 294 174 298 173 b 462 11 303 172 338 134 l 475 -1 l 503 34 b 541 76 534 72 536 74 b 548 77 544 77 545 77 b 570 56 560 77 570 68 b 567 48 570 54 568 51 b 392 -172 564 41 397 -166 b 378 -176 387 -174 382 -176 b 368 -174 374 -176 371 -176 b 280 -87 367 -173 345 -152 b 194 0 234 -38 194 0 b 125 -86 194 0 163 -38 b 49 -174 54 -174 55 -173 b 43 -176 47 -176 46 -176 b 34 -174 40 -176 36 -174 b -54 -87 31 -173 10 -152 b -140 0 -102 -38 -140 0 b -209 -86 -141 0 -171 -38 b -285 -174 -280 -174 -279 -173 b -291 -176 -287 -176 -289 -176 b -300 -174 -295 -176 -299 -174 b -464 -12 -304 -173 -340 -137 l -476 0 l -504 -34 b -543 -77 -534 -73 -537 -76 b -549 -79 -545 -79 -547 -79 b -571 -58 -562 -79 -571 -69 b -568 -49 -571 -55 -570 -52 b -392 172 -566 -43 -396 167 b -386 173 -390 172 -387 173 ',\n },\n ornamentPrecompAppoggTrill: {\n x_min: -571.671875,\n x_max: 570.3125,\n ha: 582,\n o: 'm -559 351 b -551 352 -556 352 -553 352 b -530 338 -543 352 -533 348 b -529 169 -530 337 -529 291 l -529 1 l -507 27 l -441 112 b -382 174 -394 169 -390 174 b -378 174 -381 174 -379 174 b -281 86 -370 174 -375 179 b -196 0 -234 37 -196 0 b -126 84 -196 0 -164 37 b -50 174 -55 173 -57 172 b -44 174 -49 174 -47 174 b -35 173 -42 174 -38 173 b 53 86 -32 172 -12 151 b 138 0 100 37 138 0 b 208 84 140 0 170 37 b 284 174 279 173 279 172 b 289 174 285 174 288 174 b 300 173 294 174 298 173 b 462 11 303 172 340 134 l 475 -1 l 503 34 b 541 76 534 72 536 74 b 548 77 544 77 545 77 b 570 56 560 77 570 68 b 567 48 570 54 568 51 b 392 -172 564 41 397 -166 b 378 -176 387 -174 382 -176 b 368 -174 375 -176 371 -176 b 280 -87 367 -173 347 -152 b 194 0 234 -38 194 0 b 126 -86 194 0 163 -38 b 49 -174 54 -174 55 -173 b 44 -176 47 -176 46 -176 b 34 -174 40 -176 36 -174 b -54 -87 31 -173 10 -152 b -140 0 -102 -38 -140 0 b -209 -86 -140 0 -171 -38 b -285 -174 -280 -174 -279 -173 b -291 -176 -287 -176 -288 -176 b -300 -174 -294 -176 -298 -174 b -464 -11 -303 -173 -374 -102 l -476 0 l -506 -37 b -539 -76 -528 -65 -537 -74 b -551 -80 -543 -79 -547 -80 b -570 -68 -558 -80 -566 -76 l -571 -65 l -571 136 b -570 340 -571 331 -571 337 b -559 351 -568 344 -564 348 ',\n },\n ornamentPrecompSlideTrillDAnglebert: {\n x_min: -590.71875,\n x_max: 589.359375,\n ha: 601,\n o: 'm -367 173 b -362 174 -366 174 -364 174 b -351 173 -357 174 -353 173 b -262 86 -348 172 -328 151 b -176 0 -216 37 -176 0 b -107 84 -176 0 -145 37 b -31 174 -36 173 -38 172 b -25 174 -29 174 -28 174 b -16 173 -23 174 -19 173 b 72 86 -13 172 6 151 b 157 0 119 37 157 0 b 227 84 159 0 189 37 b 303 174 298 173 296 172 b 308 174 304 174 307 174 b 318 173 313 174 317 173 b 481 11 322 172 357 134 l 494 -1 l 522 34 b 560 76 553 72 555 74 b 567 77 563 77 564 77 b 589 56 579 77 589 68 b 586 48 589 54 588 51 b 411 -172 583 41 416 -166 b 397 -176 406 -174 401 -176 b 387 -174 393 -176 390 -176 b 299 -87 386 -173 366 -152 b 213 0 253 -38 213 0 b 144 -86 213 0 182 -38 b 68 -174 73 -174 74 -173 b 62 -176 66 -176 65 -176 b 53 -174 59 -176 55 -174 b -35 -87 50 -173 29 -152 b -121 0 -83 -38 -121 0 b -190 -86 -122 0 -152 -38 b -266 -174 -261 -174 -259 -173 b -272 -176 -268 -176 -270 -176 b -281 -174 -276 -176 -280 -174 b -371 -86 -284 -173 -304 -152 b -457 0 -417 -38 -457 0 l -457 0 b -477 -26 -457 0 -470 -16 b -548 -227 -524 -88 -548 -161 b -536 -303 -548 -254 -544 -280 b -533 -317 -534 -309 -533 -313 b -553 -338 -533 -330 -541 -338 b -577 -315 -566 -338 -571 -333 b -590 -227 -586 -287 -590 -258 b -518 -9 -590 -154 -564 -77 b -465 56 -509 2 -504 8 l -402 134 b -367 173 -375 169 -372 172 ',\n },\n ornamentPrecompSlideTrillBach: {\n x_min: -590.71875,\n x_max: 589.359375,\n ha: 601,\n o: 'm 175 273 b 182 274 178 273 181 274 b 202 262 190 274 198 269 b 204 158 204 259 204 259 l 204 56 l 250 112 b 303 174 296 172 298 172 b 308 174 304 174 307 174 b 318 173 313 174 317 173 b 481 11 322 172 357 134 l 494 -1 l 522 34 b 560 76 553 72 555 74 b 567 77 563 77 564 77 b 589 56 579 77 589 68 b 586 48 589 54 588 51 b 411 -172 583 41 416 -166 b 397 -176 406 -174 401 -176 b 387 -174 393 -176 390 -176 b 299 -87 386 -173 366 -152 b 213 0 253 -38 213 0 b 208 -6 213 0 210 -2 l 204 -12 l 204 -147 b 204 -210 204 -173 204 -194 b 198 -292 204 -297 204 -287 b 183 -299 194 -297 189 -299 b 164 -287 175 -299 167 -295 b 163 -174 163 -284 163 -284 l 161 -63 l 119 -117 b 65 -176 76 -170 73 -176 b 61 -176 63 -176 62 -176 b -35 -87 51 -174 57 -180 b -121 0 -83 -38 -121 0 b -190 -86 -122 0 -152 -38 b -266 -174 -261 -174 -259 -173 b -272 -176 -268 -176 -270 -176 b -281 -174 -276 -176 -280 -174 b -371 -86 -284 -173 -304 -152 b -457 0 -417 -38 -457 0 l -457 0 b -477 -26 -457 0 -470 -16 b -548 -227 -524 -88 -548 -161 b -536 -303 -548 -254 -544 -280 b -533 -317 -534 -309 -533 -313 b -553 -338 -533 -330 -541 -338 b -577 -315 -566 -338 -571 -333 b -590 -227 -586 -287 -590 -258 b -518 -9 -590 -154 -564 -77 b -465 56 -509 2 -504 8 l -402 134 b -363 174 -374 170 -371 174 b -359 174 -362 174 -360 174 b -262 86 -351 174 -356 179 b -176 0 -216 37 -176 0 b -107 84 -176 0 -145 37 b -31 174 -36 173 -38 172 b -25 174 -29 174 -28 174 b -16 173 -23 174 -19 173 b 147 11 -13 172 35 123 l 157 -1 l 160 1 l 163 4 l 163 130 b 164 260 163 256 163 258 b 175 273 166 266 170 270 ',\n },\n ornamentPrecompTrillSuffixDandrieu: {\n x_min: -590.71875,\n x_max: 589.359375,\n ha: 601,\n o: 'm 544 335 b 553 337 548 337 551 337 b 575 313 563 337 570 330 b 589 226 583 285 589 256 b 517 8 589 152 563 76 b 464 -58 507 -4 503 -9 l 401 -136 b 362 -176 372 -172 370 -176 b 357 -176 360 -176 359 -176 b 261 -87 349 -174 355 -180 b 175 0 215 -38 175 0 b 106 -86 175 0 144 -38 b 29 -174 35 -174 36 -173 b 24 -176 28 -176 27 -176 b 14 -174 21 -176 17 -174 b -73 -87 12 -173 -8 -152 b -159 0 -121 -38 -159 0 b -228 -86 -160 0 -190 -38 b -304 -174 -299 -174 -298 -173 b -310 -176 -306 -176 -308 -176 b -319 -174 -314 -176 -318 -174 b -483 -12 -323 -173 -359 -137 l -495 0 l -524 -34 b -562 -77 -553 -73 -556 -76 b -568 -79 -564 -79 -566 -79 b -590 -58 -581 -79 -590 -69 b -588 -49 -590 -55 -589 -52 b -412 170 -585 -43 -417 165 b -398 174 -408 173 -402 174 b -389 173 -394 174 -392 174 b -300 86 -387 172 -366 151 b -215 -1 -254 37 -215 -1 b -145 84 -215 -1 -183 37 b -69 173 -74 173 -76 172 b -63 174 -68 174 -66 174 b -54 173 -61 174 -57 173 b 34 86 -51 172 -31 151 b 119 -1 81 37 119 -1 b 189 84 121 -1 151 37 b 265 173 259 173 258 172 b 270 174 266 174 269 174 b 280 173 274 174 279 173 b 370 84 283 172 303 151 b 455 -1 416 37 455 -1 l 455 -1 b 476 24 455 -1 469 15 b 547 226 522 87 547 159 b 534 302 547 252 543 278 b 532 317 533 308 532 313 b 544 335 532 326 536 333 ',\n },\n ornamentPrecompDoubleCadenceUpperPrefix: {\n x_min: -597.53125,\n x_max: 596.171875,\n ha: 608,\n o: 'm -533 324 b -525 327 -530 326 -528 327 b -504 305 -514 327 -504 317 b -504 305 -504 305 -504 305 b -513 284 -504 299 -504 299 b -556 112 -541 226 -556 167 b -545 33 -556 84 -552 58 b -524 -20 -541 15 -532 -9 l -522 -23 l -491 15 l -413 111 b -355 174 -367 169 -363 174 b -351 174 -353 174 -352 174 b -254 86 -343 174 -348 179 b -168 -1 -208 37 -168 -1 b -100 84 -168 -1 -137 37 b -23 173 -28 173 -29 172 b -19 174 -21 174 -20 174 b -8 173 -14 174 -10 173 b 80 86 -5 172 13 151 b 166 -1 127 37 166 -1 b 235 84 166 -1 197 37 b 311 173 306 173 304 172 b 317 174 313 174 314 174 b 326 173 319 174 323 173 b 490 11 329 172 366 134 l 502 -1 l 530 34 b 568 76 560 72 563 74 b 575 77 570 77 573 77 b 596 56 586 77 596 68 b 594 48 596 54 596 51 b 417 -172 592 41 424 -166 b 405 -176 415 -174 409 -176 b 396 -174 401 -176 398 -176 b 307 -87 393 -173 372 -152 b 221 -1 259 -38 221 -1 b 152 -86 221 -1 190 -38 b 76 -176 81 -174 83 -173 b 70 -176 74 -176 73 -176 b 61 -174 66 -176 62 -174 b -27 -87 58 -173 38 -152 b -114 -1 -74 -38 -112 -1 b -182 -86 -114 -1 -145 -38 b -258 -176 -253 -174 -253 -173 b -264 -176 -259 -176 -262 -176 b -274 -174 -268 -176 -272 -174 b -438 -11 -277 -173 -348 -102 l -449 0 l -479 -37 b -524 -80 -513 -80 -514 -80 l -524 -80 b -553 -52 -534 -80 -540 -74 b -597 109 -583 -8 -597 48 b -560 280 -597 165 -585 224 b -533 324 -548 310 -540 322 ',\n },\n ornamentPrecompDoubleCadenceUpperPrefixTurn: {\n x_min: -597.53125,\n x_max: 596.171875,\n ha: 608,\n o: 'm -533 324 b -525 327 -530 326 -528 327 b -504 305 -514 327 -504 317 b -504 305 -504 305 -504 305 b -513 284 -504 299 -504 299 b -556 112 -541 226 -556 167 b -545 33 -556 84 -552 58 b -524 -20 -541 15 -532 -9 l -522 -23 l -491 15 l -413 111 b -355 174 -367 169 -363 174 b -351 174 -353 174 -352 174 b -254 86 -343 174 -348 179 b -168 -1 -208 37 -168 -1 b -100 84 -168 -1 -137 37 b -23 173 -28 173 -29 172 b -19 174 -21 174 -20 174 b -8 173 -14 174 -10 173 b 155 11 -5 172 43 123 l 166 -1 l 168 1 l 170 4 l 170 130 b 171 260 170 256 170 258 b 191 274 175 269 183 274 b 205 267 196 274 201 272 b 212 158 212 262 210 273 l 212 56 l 257 112 b 311 173 304 172 304 172 b 317 174 313 174 314 174 b 326 173 319 174 323 173 b 490 11 329 172 366 134 l 502 -1 l 530 34 b 568 76 560 72 563 74 b 575 77 570 77 573 77 b 596 56 586 77 596 68 b 594 48 596 54 596 51 b 417 -172 592 41 424 -166 b 405 -176 415 -174 409 -176 b 396 -174 401 -176 398 -176 b 307 -87 393 -173 372 -152 b 221 -1 259 -38 221 -1 b 216 -6 221 -1 219 -2 l 212 -12 l 212 -147 b 212 -210 212 -173 212 -194 b 205 -292 212 -297 210 -287 b 191 -299 201 -297 196 -299 b 172 -287 183 -299 175 -295 b 170 -174 171 -284 171 -284 l 170 -63 l 127 -117 b 73 -176 84 -170 80 -176 b 68 -176 72 -176 70 -176 b -27 -87 59 -174 65 -180 b -114 0 -74 -38 -112 0 b -182 -86 -114 0 -145 -38 b -258 -174 -253 -174 -253 -173 b -264 -176 -259 -176 -262 -176 b -274 -174 -268 -176 -272 -174 b -438 -11 -277 -173 -348 -102 l -449 0 l -479 -37 b -524 -80 -513 -80 -514 -80 l -524 -80 b -553 -52 -534 -80 -540 -74 b -597 109 -583 -8 -597 48 b -560 280 -597 165 -585 224 b -533 324 -548 310 -540 322 ',\n },\n ornamentPrecompTrillLowerSuffix: {\n x_min: -597.53125,\n x_max: 596.171875,\n ha: 608,\n o: 'm -413 173 b -408 174 -412 174 -409 174 b -397 173 -404 174 -400 173 b -308 86 -394 172 -374 151 b -223 0 -261 37 -223 0 b -153 84 -223 0 -191 37 b -77 174 -83 173 -84 172 b -72 174 -76 174 -74 174 b -62 173 -68 174 -63 173 b 25 86 -59 172 -39 151 b 112 0 73 37 111 0 b 181 84 112 0 144 37 b 257 174 251 173 251 172 b 262 174 258 174 261 174 b 273 173 266 174 270 173 b 436 9 276 172 347 101 l 447 -1 l 477 36 b 522 79 511 79 513 79 l 522 79 b 552 51 533 79 539 73 b 596 -112 582 6 596 -51 b 567 -262 596 -161 586 -213 b 539 -322 558 -287 544 -316 b 524 -327 534 -326 529 -327 b 504 -315 515 -327 507 -323 b 503 -308 503 -312 503 -309 b 511 -285 503 -302 504 -297 b 555 -113 540 -227 555 -169 b 544 -34 555 -86 551 -59 b 522 19 540 -16 530 8 l 521 22 l 481 -26 l 405 -122 b 353 -176 366 -172 362 -176 b 349 -176 352 -176 351 -176 b 253 -87 341 -176 347 -180 b 167 0 206 -38 167 0 b 99 -86 167 0 136 -38 b 21 -174 27 -174 28 -173 b 17 -176 20 -176 19 -176 b 6 -174 13 -176 9 -174 b -81 -87 4 -173 -14 -152 b -167 0 -129 -38 -167 0 b -236 -86 -167 0 -198 -38 b -313 -174 -307 -174 -306 -173 b -318 -176 -314 -176 -315 -176 b -328 -174 -321 -176 -325 -174 b -491 -12 -330 -173 -367 -137 l -503 0 l -530 -34 b -570 -77 -562 -73 -564 -76 b -577 -79 -571 -79 -574 -79 b -597 -58 -588 -79 -597 -69 b -596 -49 -597 -55 -597 -52 b -417 172 -593 -43 -423 167 b -413 173 -417 172 -415 173 ',\n },\n stringsDownBow: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -9 215 b 0 217 -6 217 -4 217 b 19 205 8 217 14 213 b 20 142 20 202 20 201 l 20 84 l 23 84 b 144 -27 81 74 129 30 b 148 -66 147 -40 148 -54 b 36 -213 148 -134 103 -197 b 0 -219 24 -217 12 -219 b -145 -104 -68 -219 -129 -173 b -149 -68 -148 -91 -149 -79 b -24 84 -149 6 -98 74 l -21 84 l -21 142 b -19 205 -20 201 -20 202 b -9 215 -17 209 -13 213 m -21 -15 b -23 41 -21 37 -21 41 b -23 41 -23 41 -23 41 b -76 11 -35 40 -62 26 b -108 -65 -98 -11 -108 -38 b -1 -176 -108 -122 -65 -176 b 107 -65 63 -176 107 -122 b 74 11 107 -38 96 -11 b 20 41 61 26 32 41 b 20 -15 20 41 20 15 b 19 -74 20 -72 20 -72 b 0 -87 14 -83 6 -87 b -19 -74 -8 -87 -16 -83 b -21 -15 -20 -72 -20 -72 ',\n },\n stringsUpBow: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -137 381 b -130 383 -134 383 -133 383 b -111 371 -122 383 -114 378 b -55 224 -110 370 -85 305 b 0 80 -25 145 -1 80 b 54 224 0 80 24 145 b 112 377 114 384 110 373 b 127 384 118 381 122 384 b 148 362 138 384 148 374 l 148 356 l 83 183 b 16 9 47 88 17 11 b -1 0 12 2 5 0 b -14 5 -5 0 -10 1 b -84 183 -19 9 -13 -6 l -149 356 l -149 362 b -137 381 -149 371 -145 378 ',\n },\n stringsHarmonic: {\n x_min: -122.5,\n x_max: 121.140625,\n ha: 124,\n o: 'm -16 145 b 0 147 -10 147 -5 147 b 121 -1 66 147 121 77 b 114 -49 121 -16 118 -33 b -1 -148 95 -112 47 -148 b -85 -106 -31 -148 -61 -134 b -122 -1 -110 -76 -122 -38 b -16 145 -122 68 -81 134 m 12 111 b 0 113 8 113 4 113 b -68 22 -29 113 -61 73 b -70 0 -69 15 -70 6 b -13 -113 -70 -49 -47 -98 b -1 -115 -9 -115 -5 -115 b 63 -40 24 -115 53 -83 b 68 -1 66 -27 68 -15 b 12 111 68 48 46 97 ',\n },\n pluckedSnapPizzicatoAbove: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -9 215 b 0 217 -6 217 -4 217 b 19 205 8 217 14 213 b 20 142 20 202 20 201 l 20 84 l 23 84 b 144 -27 81 74 129 30 b 148 -66 147 -40 148 -54 b 36 -213 148 -134 103 -197 b 0 -219 24 -217 12 -219 b -145 -104 -68 -219 -129 -173 b -149 -68 -148 -91 -149 -79 b -24 84 -149 6 -98 74 l -21 84 l -21 142 b -19 205 -20 201 -20 202 b -9 215 -17 209 -13 213 m -21 -15 b -23 41 -21 37 -21 41 b -23 41 -23 41 -23 41 b -76 11 -35 40 -62 26 b -108 -65 -98 -11 -108 -38 b -1 -176 -108 -122 -65 -176 b 107 -65 63 -176 107 -122 b 74 11 107 -38 96 -11 b 20 41 61 26 32 41 b 20 -15 20 41 20 15 b 19 -74 20 -72 20 -72 b 0 -87 14 -83 6 -87 b -19 -74 -8 -87 -16 -83 b -21 -15 -20 -72 -20 -72 ',\n },\n pluckedSnapPizzicatoBelow: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -9 215 b 0 217 -6 217 -4 217 b 19 205 8 217 14 213 b 20 142 20 202 20 201 l 20 84 l 23 84 b 144 -27 81 74 129 30 b 148 -66 147 -40 148 -54 b 36 -213 148 -134 103 -197 b 0 -219 24 -217 12 -219 b -145 -104 -68 -219 -129 -173 b -149 -68 -148 -91 -149 -79 b -24 84 -149 6 -98 74 l -21 84 l -21 142 b -19 205 -20 201 -20 202 b -9 215 -17 209 -13 213 m -21 -15 b -23 41 -21 37 -21 41 b -23 41 -23 41 -23 41 b -76 11 -35 40 -62 26 b -108 -65 -98 -11 -108 -38 b -1 -176 -108 -122 -65 -176 b 107 -65 63 -176 107 -122 b 74 11 107 -38 96 -11 b 20 41 61 26 32 41 b 20 -15 20 41 20 15 b 19 -74 20 -72 20 -72 b 0 -87 14 -83 6 -87 b -19 -74 -8 -87 -16 -83 b -21 -15 -20 -72 -20 -72 ',\n },\n pluckedLeftHandPizzicato: {\n x_min: 0,\n x_max: 319.859375,\n ha: 326,\n o: 'm 149 508 b 159 509 152 509 155 509 b 186 494 170 509 181 503 b 190 440 190 487 190 488 l 190 430 l 190 377 l 242 377 l 251 377 b 303 373 298 377 296 377 b 319 345 314 367 319 356 b 304 319 319 335 314 324 b 250 315 296 315 299 315 l 242 315 l 190 315 l 190 262 l 190 252 b 186 198 190 204 190 205 b 159 183 179 188 170 183 b 132 198 148 183 138 188 b 127 252 127 205 127 204 l 127 262 l 127 315 l 76 315 l 68 315 b 14 319 20 315 21 315 b 0 347 4 324 0 335 b 14 373 0 356 4 367 b 68 377 21 377 20 377 l 76 377 l 127 377 l 127 430 l 127 440 b 132 494 127 488 127 487 b 149 508 136 501 142 505 ',\n },\n keyboardPedalPed: {\n x_min: -1.359375,\n x_max: 1064.390625,\n ha: 1086,\n o: 'm 296 692 b 314 694 302 694 307 694 b 386 685 337 694 366 689 b 548 498 480 660 548 580 b 548 481 548 492 548 487 b 455 395 541 426 499 395 b 370 462 420 395 383 417 b 362 496 364 477 362 488 b 377 514 362 509 367 514 b 393 501 386 514 390 510 b 432 474 397 484 413 474 b 470 487 445 474 458 478 b 491 530 484 496 491 510 b 490 544 491 534 491 539 b 333 660 479 606 411 657 l 323 662 l 315 646 b 269 524 285 591 269 556 b 321 431 269 492 287 466 b 349 395 338 413 343 408 b 363 342 359 378 363 362 b 359 312 363 333 362 322 b 285 158 348 266 318 206 b 281 152 283 155 281 152 b 281 152 281 152 281 152 b 287 154 283 152 284 152 b 318 155 298 154 308 155 b 461 98 371 155 419 136 l 464 97 l 483 112 b 503 129 494 120 503 127 b 504 130 503 129 504 129 b 503 138 504 131 503 134 b 500 180 500 152 500 166 b 553 326 500 238 518 288 b 604 366 560 331 592 358 b 649 381 617 376 632 381 b 696 362 665 381 681 374 b 724 302 714 347 724 324 b 695 238 724 278 714 255 b 660 210 691 234 662 212 b 579 148 658 209 582 151 b 579 148 579 148 579 148 b 596 106 579 144 589 119 b 622 77 604 88 609 83 b 657 69 632 72 645 69 b 748 112 688 69 721 84 b 755 123 754 117 755 120 b 755 127 755 124 755 126 b 751 165 752 137 751 151 b 758 219 751 183 754 202 b 894 387 774 290 820 347 b 896 390 896 388 896 388 b 891 398 896 391 895 392 b 622 560 827 477 730 535 b 600 580 605 564 600 569 b 617 596 600 591 607 596 b 628 595 622 596 624 596 b 1057 248 846 552 1020 412 b 1064 191 1061 229 1064 209 b 922 0 1064 94 1005 9 b 902 -1 916 -1 909 -1 b 774 76 847 -1 800 26 b 769 83 770 81 770 83 b 769 81 769 83 769 83 b 627 -1 733 29 677 -1 b 548 27 597 -1 570 8 b 515 88 537 37 525 61 l 513 95 l 510 93 l 453 45 b 390 0 396 0 396 0 b 390 0 390 0 390 0 b 374 15 381 0 377 4 b 268 105 359 69 314 105 b 250 104 262 105 257 105 l 243 102 l 234 90 b 155 1 201 49 159 2 b 147 -1 152 0 149 -1 b 130 15 138 -1 130 6 b 132 20 130 18 132 19 b 136 31 133 22 134 27 b 220 131 149 74 178 109 b 231 137 225 134 230 136 b 302 278 280 202 302 244 b 265 335 302 299 295 309 b 209 442 234 363 213 402 b 209 455 209 446 209 451 b 279 648 209 502 232 564 l 285 659 l 283 659 b 176 627 238 653 210 645 b 57 477 111 594 66 538 b 55 459 55 471 55 464 b 72 409 55 437 61 415 b 93 403 78 405 87 403 b 152 467 123 403 151 431 b 168 488 153 483 157 488 b 185 462 181 488 185 483 l 185 460 b 137 344 183 409 168 369 b 78 322 119 328 98 322 b 13 360 50 322 25 335 b -1 426 4 380 -1 402 b 89 610 -1 488 32 559 b 296 692 147 659 210 685 m 926 348 b 921 353 924 351 922 353 b 914 348 920 353 918 351 b 823 167 857 306 823 237 b 828 124 823 154 826 138 b 890 31 837 79 862 40 b 896 31 892 31 894 31 b 956 104 916 31 940 59 b 970 191 965 129 970 159 b 966 241 970 208 969 224 b 926 348 959 277 945 313 m 627 326 b 619 326 624 326 622 326 b 598 316 611 326 604 323 b 568 215 579 288 568 255 b 568 208 568 213 568 210 b 571 183 570 195 570 184 l 571 183 b 594 201 571 183 582 191 l 634 231 b 660 259 653 247 656 248 b 664 278 662 266 664 272 b 627 326 664 299 649 320 ',\n },\n keyboardPedalUp: {\n x_min: -1.359375,\n x_max: 592.078125,\n ha: 604,\n o: 'm 280 692 b 295 694 283 692 289 694 b 310 692 300 694 307 692 b 357 630 340 684 357 657 b 336 580 357 612 351 594 b 311 538 321 566 311 549 b 352 492 311 512 330 492 b 366 495 357 492 362 492 b 397 553 390 503 397 517 b 415 603 397 576 402 591 b 460 623 427 617 443 623 b 509 599 479 623 498 614 b 522 559 518 587 522 573 b 494 506 522 538 513 519 b 451 495 481 498 473 496 b 415 488 432 495 426 494 b 394 449 404 483 394 464 b 394 448 394 448 394 448 l 394 440 l 397 433 b 428 409 404 420 413 413 b 438 408 431 408 435 408 b 479 431 450 408 462 415 b 528 455 495 448 510 455 b 548 452 534 455 541 453 b 592 391 577 442 592 416 b 549 331 592 365 577 340 b 528 327 541 328 534 327 b 479 351 510 327 495 335 b 438 374 464 367 450 374 b 417 369 431 374 424 373 b 394 333 402 360 394 348 b 400 312 394 326 396 319 b 451 287 408 294 420 288 b 513 258 484 285 499 278 b 522 223 519 247 522 234 b 461 159 522 190 496 159 b 449 161 457 159 453 159 b 397 229 416 167 397 191 b 366 288 397 265 390 278 b 352 290 362 290 357 290 b 315 262 336 290 321 280 b 311 245 313 256 311 251 b 334 204 311 233 318 220 b 355 170 348 190 351 184 b 357 152 356 166 357 159 b 355 136 357 147 356 140 b 295 88 345 104 321 88 b 232 152 264 88 232 112 b 255 204 232 174 238 186 b 279 244 273 222 279 231 l 279 245 b 238 290 279 270 259 290 b 224 288 234 290 228 290 b 193 229 200 278 193 265 b 141 161 193 191 174 167 b 129 159 137 159 133 159 b 68 223 93 159 68 190 b 77 258 68 234 70 247 b 138 287 91 278 106 285 b 185 302 166 287 175 291 b 196 333 193 312 196 323 b 174 369 196 347 187 360 b 152 374 166 373 159 374 b 111 351 140 374 126 367 b 62 327 95 335 80 327 b 51 328 58 327 54 327 b -1 391 16 334 -1 363 b 53 455 -1 420 17 449 b 62 455 57 455 59 455 b 111 431 80 455 95 448 b 152 408 127 415 140 408 b 161 409 155 408 159 408 b 193 433 176 413 186 420 l 196 440 l 196 448 b 196 451 196 449 196 449 b 190 471 196 459 194 463 b 137 495 182 489 167 495 l 134 495 l 134 495 b 68 560 95 495 68 521 b 129 623 68 596 95 623 b 144 621 134 623 138 623 b 193 553 175 614 193 589 b 224 495 193 517 200 503 b 238 492 228 492 234 492 b 279 538 259 492 279 512 b 254 580 279 549 269 566 b 232 630 239 594 232 612 b 280 692 232 657 250 684 m 307 456 b 295 458 303 458 299 458 b 230 391 258 458 230 426 b 236 360 230 381 231 371 b 295 324 249 337 272 324 b 353 360 318 324 341 337 b 360 391 357 370 360 381 b 307 456 360 421 340 451 ',\n },\n pictChokeCymbal: {\n x_min: 0,\n x_max: 227.3125,\n ha: 232,\n o: 'm 91 213 b 100 215 93 215 96 215 b 227 58 167 215 224 144 b 227 52 227 56 227 54 b 61 -201 227 -43 164 -138 b 29 -216 44 -212 36 -216 b 23 -210 27 -216 24 -213 b 21 -205 21 -208 21 -206 b 34 -192 21 -201 25 -197 b 122 -55 89 -161 122 -106 b 104 6 122 -33 117 -12 l 103 9 l 96 9 b 4 79 57 9 17 38 b 0 112 1 90 0 101 b 91 213 0 163 36 209 ',\n },\n wiggleArpeggiatoUp: {\n x_min: 58.53125,\n x_max: 228.671875,\n ha: 294,\n o: 'm 138 371 b 142 373 140 371 141 373 b 178 342 149 373 156 366 b 228 251 217 297 228 278 b 228 244 228 248 228 247 b 176 147 227 212 212 184 b 123 73 152 122 132 93 b 121 62 122 70 121 66 b 145 13 121 48 129 31 b 153 -2 151 6 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 145 -11 b 129 -1 140 -11 136 -8 b 61 87 89 37 68 68 b 58 113 59 95 58 105 b 110 215 58 144 74 177 b 163 287 134 240 155 269 b 166 299 166 291 166 295 b 141 348 166 313 157 330 b 133 360 134 356 133 358 b 133 363 133 362 133 362 b 138 371 133 367 136 370 ',\n },\n arrowheadBlackUp: {\n x_min: -10.890625,\n x_max: 299.4375,\n ha: 294,\n o: 'm 136 460 b 142 462 137 462 140 462 b 166 449 152 462 161 456 b 171 428 168 446 168 445 b 288 131 194 322 238 209 b 298 115 295 120 296 117 b 299 106 298 112 299 109 b 273 81 299 91 287 81 b 255 86 268 81 261 83 b 155 116 225 104 183 116 l 152 116 l 149 108 b 141 83 148 102 144 91 b 134 48 137 69 134 58 b 149 9 134 34 140 24 b 153 -1 152 5 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 147 -11 b 122 2 138 -11 133 -6 b 95 61 104 20 95 38 b 107 108 95 74 99 90 b 108 113 107 111 108 112 b 107 113 108 113 108 113 b 102 113 106 113 104 113 b 31 86 76 108 53 98 b 14 80 24 81 20 80 b -10 106 0 80 -10 91 b 0 131 -10 115 -9 116 b 115 430 49 209 91 317 b 136 460 119 451 123 456 ',\n },\n arrowheadBlackDown: {\n x_min: -10.890625,\n x_max: 298.078125,\n ha: 294,\n o: 'm 138 473 b 142 474 140 473 141 474 b 164 459 148 474 153 470 b 191 402 183 442 191 423 b 181 353 191 388 187 371 b 178 349 179 352 178 349 b 179 348 178 348 179 348 b 185 349 181 348 182 348 b 255 376 210 355 234 363 b 272 381 264 381 266 381 b 298 355 287 381 298 370 b 288 330 298 348 298 345 b 171 34 238 254 194 141 b 166 13 168 16 168 16 b 144 1 161 5 152 1 b 121 15 134 1 125 5 b 115 33 119 18 117 24 b 0 330 91 145 49 252 b -10 355 -9 345 -10 348 b 13 381 -10 371 0 381 b 31 376 19 381 25 380 b 132 345 61 358 103 345 l 136 345 l 137 355 b 145 378 138 359 142 370 b 152 415 149 394 152 405 b 137 452 152 427 148 438 b 133 464 134 458 133 460 b 138 473 133 467 134 470 ',\n },\n vexAccidentalMicrotonal1: {\n x_min: -171.5,\n x_max: 483.1875,\n ha: 493,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 495 20 616 20 616 b 20 373 20 427 20 373 b 115 410 20 373 63 390 l 210 448 l 210 531 b 212 620 210 614 210 616 b 231 632 215 628 223 632 b 246 627 236 632 242 631 b 251 541 251 620 251 628 l 251 463 l 315 489 b 387 514 368 509 381 514 b 393 513 390 514 392 514 b 406 494 402 510 406 502 b 397 476 406 487 404 480 b 323 446 396 474 363 462 l 251 417 l 251 283 l 251 148 l 254 151 b 370 199 291 183 332 199 b 415 191 385 199 400 197 b 483 84 458 176 483 134 b 461 0 483 58 476 29 b 332 -142 439 -40 411 -72 l 255 -215 b 231 -229 240 -229 239 -229 b 216 -223 224 -229 220 -227 b 210 -158 210 -217 210 -223 b 210 -120 210 -148 210 -136 l 210 -29 l 205 -34 b 100 -142 182 -65 159 -88 l 23 -215 b -1 -229 9 -229 6 -229 b -19 -217 -9 -229 -16 -224 l -20 -215 l -21 48 l -21 310 l -83 287 b -152 262 -133 266 -145 262 b -157 263 -153 262 -155 262 b -171 283 -166 266 -171 274 b -161 301 -171 290 -167 297 b -91 328 -160 302 -129 315 l -21 356 l -21 487 l -20 617 l -19 621 b -8 631 -17 626 -12 630 m 210 288 b 210 401 210 351 210 401 b 114 365 209 401 167 384 l 20 327 l 20 238 l 20 148 l 21 151 b 140 199 59 183 102 199 b 206 180 164 199 187 192 l 209 177 b 209 177 209 177 209 177 b 210 288 210 177 210 199 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 m 341 131 b 328 133 337 133 332 133 b 322 133 326 133 323 133 b 257 87 296 129 273 113 l 251 80 l 251 -37 l 251 -156 l 255 -152 b 375 81 328 -72 375 20 l 375 83 b 341 131 375 113 367 126 ',\n },\n vexAccidentalMicrotonal2: {\n x_min: -1.359375,\n x_max: 386.5625,\n ha: 394,\n o: 'm 249 535 b 257 537 251 537 253 537 b 276 524 266 537 273 533 l 277 521 l 279 419 l 279 316 l 304 323 b 337 328 319 326 330 328 b 353 316 347 328 349 324 b 355 266 355 315 355 290 b 353 215 355 241 355 217 b 319 198 349 206 347 205 b 279 187 284 190 279 188 b 279 156 279 187 279 174 b 279 136 279 151 279 144 l 279 84 l 289 87 l 330 98 b 367 105 352 102 362 105 b 378 101 372 105 375 104 b 386 61 385 95 386 94 b 386 40 386 55 386 48 l 386 -5 l 385 -8 b 374 -19 383 -12 378 -18 b 291 -40 372 -19 347 -26 b 279 -43 284 -41 279 -43 b 279 -83 279 -43 279 -59 b 279 -95 279 -87 279 -91 l 279 -145 l 304 -140 b 337 -133 321 -136 330 -133 b 349 -140 343 -133 347 -136 b 355 -181 355 -145 355 -142 l 355 -197 l 355 -210 b 349 -252 355 -249 355 -247 b 300 -269 345 -258 347 -258 b 280 -274 291 -272 281 -273 l 279 -274 l 277 -378 l 277 -483 l 276 -487 b 257 -499 273 -495 265 -499 b 238 -487 249 -499 242 -495 l 236 -483 l 236 -384 l 236 -285 l 235 -285 l 212 -291 l 170 -301 b 148 -308 159 -305 148 -306 b 147 -415 147 -308 147 -313 l 147 -523 l 145 -526 b 126 -538 141 -534 133 -538 b 106 -526 118 -538 110 -534 l 104 -523 l 104 -420 b 103 -317 104 -326 104 -317 b 103 -317 103 -317 103 -317 b 50 -330 92 -322 54 -330 b 31 -317 42 -330 35 -326 b 29 -267 29 -315 29 -315 l 29 -219 l 32 -216 b 92 -192 36 -206 36 -206 l 104 -190 l 104 -138 b 103 -87 104 -91 104 -87 b 103 -87 103 -87 103 -87 b 88 -91 103 -87 96 -88 l 49 -101 b 17 -106 32 -105 23 -106 b 6 -102 13 -106 10 -105 b -1 -62 0 -97 -1 -95 b 0 -41 -1 -56 0 -49 l 0 4 l 1 6 b 10 16 2 11 6 15 b 91 37 12 18 38 24 l 104 41 l 104 93 b 103 144 104 140 104 144 b 103 144 103 144 103 144 b 50 131 92 141 54 131 b 31 144 42 131 35 137 b 29 195 29 147 29 148 l 29 242 l 32 245 b 92 269 36 255 36 255 l 104 273 l 104 377 l 104 481 l 106 485 b 126 498 110 492 118 498 b 134 495 129 498 132 496 b 145 485 138 494 142 489 l 147 481 l 147 383 l 147 283 l 152 284 b 190 294 155 285 171 290 l 230 303 l 236 305 l 236 413 l 236 521 l 238 524 b 249 535 240 528 243 533 m 236 126 b 235 177 236 154 236 177 l 235 177 b 213 172 235 177 225 174 l 170 161 b 147 155 157 158 147 155 b 147 124 147 155 147 142 b 147 102 147 117 147 111 l 147 52 l 153 54 l 228 72 l 236 74 l 236 126 m 236 -105 b 235 -54 236 -65 236 -54 l 235 -54 b 231 -55 235 -54 234 -54 b 172 -69 227 -55 204 -62 l 149 -76 l 147 -76 l 147 -127 l 147 -179 l 152 -177 b 190 -167 155 -177 171 -173 l 230 -158 l 236 -156 l 236 -105 ',\n },\n vexWiggleArpeggioUp: {\n x_min: 58.53125,\n x_max: 228.671875,\n ha: 294,\n o: 'm 138 371 b 142 373 140 371 141 373 b 178 342 149 373 156 366 b 228 251 217 297 228 278 b 228 244 228 248 228 247 b 176 147 227 212 212 184 b 123 73 152 122 132 93 b 121 62 122 70 121 66 b 145 13 121 48 129 31 b 153 -2 151 6 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 145 -11 b 129 -1 140 -11 136 -8 b 61 87 89 37 68 68 b 58 113 59 95 58 105 b 110 215 58 144 74 177 b 163 287 134 240 155 269 b 166 299 166 291 166 295 b 141 348 166 313 157 330 b 133 360 134 356 133 358 b 133 363 133 362 133 362 b 138 371 133 367 136 370 ',\n },\n vexNoteHeadMutedBreve: {\n x_min: 0,\n x_max: 370.21875,\n ha: 378,\n o: 'm 0 0 l 0 277 l 61 277 l 122 277 l 122 0 l 122 -278 l 61 -278 l 0 -278 l 0 0 m 246 -1 l 246 277 l 308 277 l 370 277 l 370 -1 l 370 -278 l 308 -278 l 246 -278 l 246 -1 ',\n },\n },\n cssFontWeight: 'normal',\n ascender: 1903,\n underlinePosition: -125,\n cssFontStyle: 'normal',\n boundingBox: {\n yMin: -2065.375,\n xMin: -695.53125,\n yMax: 1901.578125,\n xMax: 1159.671875,\n },\n resolution: 1000,\n original_font_information: {\n postscript_name: 'Gonville-18',\n version_string: 'Version 0.1.8904 ',\n vendor_url: '',\n full_font_name: 'Gonville-18',\n font_family_name: 'Gonville-18',\n copyright: 'No copyright is claimed on this font file.',\n description: '',\n trademark: '',\n designer: '',\n designer_url: '',\n unique_font_identifier: 'FontForge 2.0 : Gonville-18 : 17-3-2010',\n license_url: '',\n license_description: '',\n manufacturer_name: '',\n font_sub_family_name: '18',\n },\n descender: -2066,\n fontFamily: 'Gonville-18',\n lineHeight: 4093,\n underlineThickness: 50,\n};\n","/**\n * The Gonville font was created by Simon Tatham.\n * https://www.chiark.greenend.org.uk/~sgtatham/gonville/\n */\nexport const GonvilleMetrics = {\n name: 'Gonville',\n smufl: false,\n stave: {\n padding: 12,\n endPaddingMax: 10,\n endPaddingMin: 5,\n unalignedNotePadding: 10,\n },\n accidental: {\n noteheadAccidentalPadding: 1,\n leftPadding: 2,\n accidentalSpacing: 3,\n },\n clef: {\n default: {\n point: 40,\n width: 26,\n },\n small: {\n point: 32,\n width: 20,\n },\n annotations: {\n '8va': {\n smuflCode: 'timeSig8',\n default: {\n point: 20,\n treble: {\n line: -1.2,\n shiftX: 11,\n },\n },\n small: {\n point: 18,\n treble: {\n line: -0.4,\n shiftX: 8,\n },\n },\n },\n '8vb': {\n smuflCode: 'timeSig8',\n default: {\n point: 20,\n treble: {\n line: 6.3,\n shiftX: 10,\n },\n bass: {\n line: 4,\n shiftX: 1,\n },\n },\n small: {\n point: 18,\n treble: {\n line: 5.8,\n shiftX: 6,\n },\n bass: {\n line: 3.5,\n shiftX: 0.5,\n },\n },\n },\n },\n // May not need these anymore\n lineCount: {\n '8': { point: 55, shiftY: 14 },\n '7': { point: 47, shiftY: 8 },\n '6': { point: 40, shiftY: 1 },\n '5': { point: 30, shiftY: -6 },\n '4': { point: 23, shiftY: -12 },\n },\n },\n parenthesis: {\n default: {\n point: 39,\n width: 7,\n },\n gracenote: {\n point: (39 * 3) / 5,\n width: 3,\n },\n },\n pedalMarking: {\n up: {\n point: 40,\n },\n down: {\n point: 40,\n },\n },\n // These are for numeric digits, such as in time signatures\n digits: {\n point: 40,\n tupletPoint: 28,\n },\n // articulation: {\n // },\n tremolo: {\n default: {\n point: 25,\n spacing: 4,\n offsetYStemUp: -7,\n offsetYStemDown: 7,\n offsetXStemUp: 9,\n offsetXStemDown: -0.5,\n },\n grace: {\n point: 15,\n spacing: 4,\n offsetYStemUp: -7,\n offsetYStemDown: 7,\n offsetXStemUp: 6.5,\n offsetXStemDown: -0.5,\n },\n },\n staveRepetition: {\n default: {\n offsetY: 25,\n offsetSymbol: 12,\n spacing: 5,\n },\n },\n // noteHead: {\n // },\n stem: {\n heightAdjustmentForFlag: -3,\n // These are stem (Y) offsets to the note heads. To shift the\n // noteheads (x-position) themselves, see glyphs.notehead.custom.\n noteHead: {\n noteheadTriangleUpHalf: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpBlack: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpWhole: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadXHalf: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXBlack: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXWhole: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadHalf: {\n offsetYBaseStemUp: -1.5,\n offsetYBaseStemDown: 1.5,\n },\n noteheadBlack: {\n offsetYBaseStemUp: -1.5,\n offsetYBaseStemDown: 1.5,\n },\n noteheadSquareWhite: {\n offsetYBaseStemDown: -5,\n offsetYBaseStemUp: 5,\n },\n },\n },\n glyphs: {\n flag: {\n shiftX: -0.08,\n flag8thDown: {\n shiftX: -0.16,\n },\n flag16thDown: {\n shiftX: -0.16,\n },\n flag32ndDown: {\n shiftX: -0.16,\n shiftY: 9,\n },\n flag64thDown: {\n shiftX: -0.16,\n shiftY: 13,\n },\n flag128thDown: {\n shiftX: -0.16,\n shiftY: 22,\n },\n flag32ndUp: {\n shiftY: -9,\n },\n flag64thUp: {\n shiftY: -13,\n },\n flag128thUp: {\n shiftY: -22,\n },\n },\n stringNumber: {\n verticalPadding: 8,\n stemPadding: 2,\n leftPadding: 5,\n rightPadding: 6,\n },\n textNote: {\n point: 40,\n default: {},\n ornamentTrill: {\n shiftX: -5,\n shiftY: 4,\n },\n },\n noteHead: {\n minPadding: 2,\n custom: {\n noteheadDiamondWholeStemUp: {\n shiftX: -6,\n },\n noteheadCircleXStemUp: {\n shiftX: -1.5,\n },\n noteheadXWholeStemUp: {\n shiftX: -5,\n },\n noteheadTriangleUpWholeStemUp: {\n shiftX: -6,\n },\n },\n },\n chordSymbol: {\n global: {\n superscriptOffset: -400,\n subscriptOffset: 300,\n kerningOffset: -250,\n lowerKerningText: ['D', 'F', 'P', 'T', 'V', 'Y'],\n upperKerningText: ['A', 'L'],\n spacing: 100,\n superSubRatio: 0.66,\n },\n csymDiminished: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymHalfDiminished: {\n scale: 0.8,\n leftSideBearing: -32,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymAugmented: {\n scale: 1,\n leftSideBearing: 0,\n advanceWidth: 530,\n yOffset: 0,\n },\n csymParensLeftTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 155,\n yOffset: 250,\n },\n csymParensRightTall: {\n scale: 0.8,\n leftSideBearing: -40,\n advanceWidth: 189,\n yOffset: 250,\n },\n csymBracketLeftTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 328,\n yOffset: 0,\n },\n csymBracketRightTall: {\n scale: 0.8,\n leftSideBearing: 1,\n advanceWidth: 600,\n yOffset: 0,\n },\n csymParensLeftVeryTall: {\n scale: 0.9,\n leftSideBearing: 0,\n advanceWidth: 121,\n yOffset: 350,\n },\n csymParensRightVeryTall: {\n scale: 0.9,\n leftSideBearing: 50,\n advanceWidth: 111,\n yOffset: 350,\n },\n csymDiagonalArrangementSlash: {\n scale: 0.6,\n leftSideBearing: -1,\n advanceWidth: 990,\n yOffset: 0,\n },\n csymMinor: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 482,\n yOffset: 0,\n },\n csymMajorSeventh: {\n scale: 0.9,\n leftSideBearing: 200,\n yOffset: 0,\n advanceWidth: 600,\n },\n accidentalSharp: {\n scale: 0.75,\n leftSideBearing: 40,\n advanceWidth: 250,\n yOffset: -402,\n },\n accidentalFlat: {\n scale: 0.95,\n leftSideBearing: -50,\n advanceWidth: 208,\n yOffset: -184,\n },\n },\n jazzOrnaments: {\n brassScoop: {\n scale: 1.0,\n xOffset: -12,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 10,\n },\n brassDoitMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassFallLipShort: {\n scale: 1.0,\n xOffset: 17,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassLiftMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 5,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassFallRoughMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 28,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassBend: {\n scale: 1.0,\n xOffset: 2,\n yOffset: -8,\n stemUpYOffset: 24,\n reportedWidth: 5,\n },\n brassMuteClosed: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -9,\n stemUpYOffset: 24,\n reportedWidth: 5,\n },\n brassMuteOpen: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -7,\n stemUpYOffset: 25,\n reportedWidth: 5,\n },\n brassFlip: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassJazzTurn: {\n scale: 1.0,\n xOffset: 6,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassSmear: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n },\n tremolo: {\n default: {\n shiftY: -10,\n },\n grace: {\n shiftY: -5,\n },\n },\n tuplet: {\n noteHeadOffset: 20,\n stemOffset: 10,\n bottomLine: 4,\n topModifierOffset: 15,\n },\n },\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// vexflow.js statically bundles & preloads all of our music engraving fonts.\nimport { loadBravura } from './load_bravura';\nimport { loadCustom } from './load_custom';\nimport { loadGonville } from './load_gonville';\nimport { loadPetaluma } from './load_petaluma';\n// ADD_MUSIC_FONT\n// import { loadXXX } from './load_xxx';\n// Populate our font \"database\" with all our music fonts.\nexport function loadAllMusicFonts() {\n loadBravura();\n loadGonville();\n loadPetaluma();\n loadCustom();\n // ADD_MUSIC_FONT\n // loadXXX();\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// If you are adding a new music engraving font, search for instances of ADD_MUSIC_FONT throughout the code base.\n// To compile your new font into vexflow.js, take a look at src/fonts/load_all.ts\n// You can export a font module which can be dynamically loaded by vexflow-core.js (see: Gruntfile.js).\n// ADD_MUSIC_FONT\n// To add a new music engraving font XXX, make a copy of this file and name it load_xxx.ts.\n// Then you will need to generate xxx_glyphs.ts and xxx_metrics.ts.\n// xxx_glyphs.ts is created by tools/fonts/fontgen_smufl.js\n// xxx_metrics.ts is created by hand. You could copy bravura_metrics.ts and modify/remove/add entries where necessary.\nimport { Font } from '../font';\nimport { BravuraFont } from './bravura_glyphs';\nimport { BravuraMetrics } from './bravura_metrics';\nexport function loadBravura() {\n Font.load('Bravura', BravuraFont, BravuraMetrics);\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from '../font';\nimport { CustomFont } from './custom_glyphs';\nimport { CustomMetrics } from './custom_metrics';\nexport function loadCustom() {\n Font.load('Custom', CustomFont, CustomMetrics);\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from '../font';\nimport { GonvilleFont } from './gonville_glyphs';\nimport { GonvilleMetrics } from './gonville_metrics';\nexport function loadGonville() {\n Font.load('Gonville', GonvilleFont, GonvilleMetrics);\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from '../font';\nimport { PetalumaFont } from './petaluma_glyphs';\nimport { PetalumaMetrics } from './petaluma_metrics';\nexport function loadPetaluma() {\n Font.load('Petaluma', PetalumaFont, PetalumaMetrics);\n}\n","export const PetalumaFont = {\n glyphs: {\n bracketTop: {\n x_min: 0,\n x_max: 508,\n y_min: 0,\n y_max: 370,\n ha: 370,\n o: 'm 22 0 b 122 0 55 1 89 0 l 157 0 b 713 376 425 0 622 137 b 732 467 724 406 732 436 b 726 514 732 482 730 498 b 711 533 723 528 719 533 b 693 526 707 533 700 530 b 674 498 683 520 678 508 b 635 406 662 467 652 435 b 310 164 560 281 458 193 b 154 151 258 154 206 151 b 39 154 117 151 78 154 b 1 120 17 154 4 145 b 0 84 0 108 0 96 b 0 20 0 63 1 40 b 22 0 0 4 7 0 z',\n },\n bracketBottom: {\n x_min: 0,\n x_max: 496,\n y_min: -393,\n y_max: 0,\n ha: 393,\n o: 'm 696 -566 b 711 -539 713 -566 708 -549 b 714 -521 713 -533 714 -527 b 713 -508 714 -517 713 -513 b 661 -327 706 -445 688 -384 b 392 -42 603 -203 513 -109 b 206 0 331 -7 266 0 b 160 -1 190 0 174 -1 b 26 -1 107 -1 66 -3 b 0 -19 12 -1 0 -4 l 0 -23 b 3 -50 1 -32 3 -42 b 1 -86 3 -62 1 -73 b 4 -118 1 -96 1 -108 b 45 -151 10 -145 23 -154 b 180 -143 89 -144 135 -145 b 621 -419 392 -135 523 -236 b 662 -539 641 -456 655 -497 b 696 -566 667 -557 680 -566 z',\n },\n barlineTick: {\n x_min: 0,\n x_max: 56.036101509664164,\n y_min: 876.905249806889,\n y_max: 1121.5430338167066,\n ha: 244.63778400981766,\n o: 'm 42 1263 b 66 1287 62 1261 66 1272 b 81 1583 65 1387 72 1485 b 35 1614 82 1610 53 1610 b 14 1591 17 1619 16 1604 b 0 1408 7 1525 0 1459 l 0 1292 b 42 1263 1 1263 23 1266 z',\n },\n breathMarkTick: {\n x_min: 0,\n x_max: 568,\n y_min: 0,\n y_max: 621,\n ha: 621,\n o: 'm 258 0 b 278 39 276 0 274 24 b 279 56 279 45 279 50 l 279 73 b 278 117 279 88 278 102 b 281 148 278 127 279 138 b 536 600 312 330 387 487 b 744 719 600 651 670 690 b 815 779 775 730 808 740 b 818 824 818 793 818 808 b 815 868 818 838 818 852 b 796 894 814 881 808 894 b 779 888 791 894 786 893 b 719 864 760 878 739 871 b 372 602 580 806 459 724 b 229 252 298 498 251 383 b 220 268 225 262 222 264 b 209 302 217 279 213 291 b 75 527 181 387 143 467 b 16 563 58 543 39 573 b 0 539 3 557 0 549 b 12 492 0 524 9 507 b 56 400 19 459 22 425 b 163 269 104 367 138 323 b 238 36 197 194 216 115 b 258 0 242 22 243 0 z',\n },\n segno: {\n x_min: 0,\n x_max: 798,\n y_min: -65,\n y_max: 806,\n ha: 871,\n o: 'm 16 -94 b 66 -69 39 -92 53 -85 b 177 59 102 -26 138 17 b 543 456 298 192 420 324 b 726 300 615 420 680 373 b 753 217 744 271 753 243 b 655 112 753 170 719 131 b 599 104 636 107 618 104 b 461 173 544 104 495 128 b 432 190 454 183 444 190 b 409 179 425 190 418 187 b 359 118 390 160 373 141 b 341 72 347 101 341 86 b 373 24 341 56 351 40 b 409 6 384 17 396 10 b 550 -13 454 -12 501 -14 b 599 -6 566 -12 583 -10 b 864 213 720 27 806 104 b 886 300 878 242 886 271 b 857 395 886 331 877 363 b 799 467 840 420 821 445 b 648 572 755 513 704 546 b 1110 1083 802 743 955 914 b 1140 1129 1123 1097 1136 1110 b 1149 1148 1142 1135 1149 1142 b 1145 1153 1149 1149 1148 1152 b 1123 1161 1139 1158 1130 1161 b 1109 1156 1119 1161 1113 1159 b 1089 1138 1102 1151 1094 1145 b 946 988 1040 1089 989 1041 b 595 602 834 855 711 732 l 590 598 l 549 615 b 432 793 462 647 432 723 b 534 888 432 851 474 888 b 671 834 588 888 631 864 b 710 818 684 824 696 818 b 724 821 714 818 719 819 b 809 883 757 834 788 852 b 816 901 814 890 816 896 b 802 923 816 910 812 916 b 706 984 770 945 742 971 b 593 1011 668 998 631 1011 b 516 991 567 1011 541 1005 b 333 799 433 949 380 876 b 302 693 312 765 302 729 b 330 589 302 658 311 624 b 469 488 360 533 415 511 b 485 482 475 487 480 485 b 266 249 412 405 338 327 b 121 88 217 196 170 141 b 9 -65 78 40 37 -7 b 0 -85 4 -72 0 -79 b 16 -94 0 -91 4 -94 z m 861 536 b 927 575 890 539 909 557 b 965 628 952 598 965 613 b 926 680 965 644 952 658 b 865 713 900 701 883 713 b 805 667 845 713 828 698 b 768 611 791 649 770 631 b 812 564 766 589 798 582 b 861 536 824 550 840 537 z m 251 350 b 363 436 285 348 353 403 b 354 456 366 448 360 452 b 271 518 327 477 298 497 b 243 528 261 526 252 528 b 210 513 232 528 222 523 b 157 454 190 494 176 472 b 141 428 147 444 141 436 b 158 406 141 420 147 413 b 216 361 180 393 197 376 b 245 350 225 356 235 350 z',\n },\n coda: {\n x_min: 0,\n x_max: 1380,\n y_min: -196,\n y_max: 1037,\n ha: 1233,\n o: 'm 1028 -282 b 1057 -245 1045 -282 1053 -261 b 1060 -203 1060 -232 1060 -217 b 1063 9 1060 -132 1061 -62 b 1390 194 1192 22 1303 81 b 1531 543 1467 298 1512 415 b 1532 556 1531 547 1532 552 b 1904 559 1656 557 1780 559 b 1950 582 1920 559 1941 569 b 1987 674 1970 609 1987 638 b 1984 698 1987 681 1986 690 b 1950 700 1973 698 1961 700 l 1941 700 l 1545 696 b 1535 776 1545 723 1541 749 b 1103 1113 1477 996 1326 1107 b 1080 1115 1096 1115 1087 1115 b 1081 1322 1080 1184 1080 1253 b 1079 1467 1083 1371 1081 1418 b 1061 1493 1079 1476 1080 1493 l 1060 1493 b 1028 1467 1044 1490 1031 1485 b 1020 1403 1025 1446 1020 1424 b 1017 1110 1020 1305 1018 1208 l 962 1106 b 569 914 808 1087 671 1035 b 451 683 510 844 472 766 l 161 678 b 118 680 148 678 132 680 b 79 670 101 680 86 678 b 0 544 48 636 29 592 l 37 544 l 429 549 b 428 518 428 539 428 528 b 488 285 428 435 458 360 b 681 81 526 192 593 124 b 946 9 763 40 854 19 b 1008 6 966 7 988 6 b 1005 -137 1008 -42 1005 -89 b 1012 -243 1005 -173 1005 -209 b 1028 -282 1015 -258 1011 -282 z m 1074 690 b 1079 935 1077 772 1077 852 b 1326 855 1166 932 1250 909 b 1446 694 1385 814 1426 759 b 1269 693 1387 694 1328 693 b 1074 690 1204 693 1139 691 z m 577 684 b 766 874 618 763 678 828 b 989 932 837 912 913 923 b 1015 933 998 932 1007 933 b 1014 822 1015 896 1014 860 b 1011 688 1012 791 1012 743 z m 1067 184 b 1071 553 1070 307 1068 429 b 1439 556 1194 553 1316 554 b 1437 554 1439 554 1437 554 b 1341 337 1413 478 1387 402 b 1119 192 1286 261 1211 212 b 1067 184 1102 189 1084 186 z m 1008 180 b 660 264 886 181 770 212 b 524 471 570 305 524 374 b 528 524 524 488 526 505 l 533 549 b 792 552 619 550 706 550 b 1009 553 865 553 937 552 b 1008 180 1009 428 1008 288 z',\n },\n gClef: {\n x_min: 0,\n x_max: 664,\n y_min: -559,\n y_max: 1009,\n ha: 1568,\n o: 'm 343 -805 b 366 -801 350 -805 357 -804 b 409 -773 383 -795 397 -786 b 582 -328 528 -648 577 -497 b 583 -294 582 -315 583 -294 b 612 -279 583 -294 603 -282 b 747 -197 660 -256 706 -230 b 949 143 857 -109 920 10 b 956 206 955 164 956 186 b 791 384 956 297 906 363 b 704 393 762 390 733 393 b 498 336 632 393 563 374 b 481 325 490 331 481 325 l 444 465 b 442 485 442 472 442 485 b 609 880 442 485 589 746 b 619 996 616 919 619 958 b 613 1084 619 1027 618 1056 b 534 1387 599 1188 560 1286 b 482 1453 527 1417 517 1453 b 422 1407 456 1453 438 1428 b 305 1063 348 1305 312 1188 b 304 1002 304 1043 304 1022 b 338 654 304 886 323 769 b 343 629 338 645 341 636 b 144 356 278 537 206 451 b 23 144 101 288 53 220 b 0 20 7 107 0 63 b 82 -210 0 -69 30 -160 b 207 -288 112 -239 160 -271 b 410 -328 274 -312 340 -328 b 474 -324 431 -328 452 -327 l 491 -321 b 491 -341 491 -321 492 -334 b 402 -585 475 -428 454 -513 b 294 -668 374 -622 348 -664 b 271 -693 278 -670 271 -680 b 274 -708 271 -698 272 -703 b 302 -775 282 -730 292 -753 b 343 -805 311 -795 325 -805 z m 400 717 b 382 922 389 786 382 854 b 481 1286 382 1047 408 1169 b 507 1125 498 1233 507 1179 b 500 1040 507 1097 504 1068 b 400 717 481 927 455 818 z m 252 -135 b 196 -121 232 -134 215 -127 b 117 -69 158 -108 127 -94 b 111 -32 112 -58 111 -45 b 117 19 111 -16 114 1 b 130 56 118 27 127 52 b 324 337 186 156 253 246 l 384 416 l 395 384 b 416 291 406 348 416 291 b 350 213 416 291 376 239 b 243 -42 278 143 243 55 b 251 -117 243 -66 246 -91 b 252 -135 252 -122 252 -127 z m 563 -91 b 510 168 552 3 530 78 b 513 192 508 179 508 186 b 624 202 550 199 586 202 b 730 192 660 202 694 199 b 850 141 773 183 816 176 b 858 134 852 138 855 135 b 595 -121 801 19 716 -68 l 569 -131 z m 410 -160 b 311 -147 360 -160 311 -147 b 307 -98 311 -147 307 -127 b 314 -33 307 -79 308 -56 b 429 131 328 36 377 85 b 441 138 433 135 438 138 b 449 122 446 138 448 132 b 490 -131 462 37 484 -46 b 490 -153 491 -140 490 -153 b 410 -160 490 -153 452 -163 z',\n },\n cClef: {\n x_min: 0,\n x_max: 731,\n y_min: -543,\n y_max: 543,\n ha: 1086,\n o: 'm 131 -782 b 141 -755 138 -782 140 -773 b 147 -490 143 -667 145 -577 b 160 207 150 -258 153 -24 b 168 618 164 344 158 481 b 81 768 173 690 132 732 b 45 782 66 778 55 782 b 3 740 26 782 13 768 b 0 724 1 736 0 730 l 1 710 b 4 596 4 672 4 634 l 4 382 b 9 102 4 288 4 196 b 17 -301 13 -32 10 -166 l 17 -672 b 50 -736 17 -701 27 -720 b 109 -772 69 -749 91 -759 b 131 -782 120 -778 127 -782 z m 615 -770 b 881 -684 710 -770 801 -739 b 1020 -395 986 -612 1020 -510 b 1017 -334 1020 -374 1018 -354 b 769 -62 1007 -209 896 -75 b 746 -60 762 -60 755 -60 b 639 -73 710 -60 675 -69 b 524 -109 598 -79 560 -92 b 528 -36 526 -85 528 -60 b 527 -4 528 -26 528 -14 b 528 39 527 10 528 24 b 526 99 528 59 527 79 b 592 94 549 95 570 94 b 648 99 611 94 629 95 b 912 157 744 94 844 117 b 1053 377 1009 215 1053 284 b 1050 425 1053 393 1053 409 b 914 665 1037 521 986 602 b 717 753 855 717 791 753 b 626 734 688 753 658 747 l 462 665 b 347 500 374 628 347 580 b 350 449 347 484 348 468 b 392 419 353 428 367 416 b 492 438 425 425 459 428 b 541 498 524 448 541 468 b 540 514 541 503 541 508 b 537 546 537 524 537 536 b 573 639 537 580 550 611 b 606 657 582 649 593 657 l 609 657 b 716 622 647 652 684 647 b 834 372 801 556 834 469 b 831 323 834 356 832 338 b 743 187 825 266 795 217 b 710 176 732 180 720 176 b 694 179 704 176 700 177 b 527 223 638 193 582 206 b 495 229 516 228 505 229 b 454 220 481 229 468 225 b 395 189 432 213 415 200 b 363 180 384 186 374 181 b 348 168 356 179 348 176 b 340 161 343 167 340 164 b 347 150 340 157 343 154 b 356 147 348 148 353 147 b 364 92 361 130 363 111 b 369 -37 367 49 369 6 b 363 -154 369 -76 367 -115 b 357 -236 360 -183 357 -210 b 376 -264 357 -253 361 -259 b 456 -289 402 -284 429 -289 b 521 -282 478 -289 500 -285 b 549 -255 537 -279 546 -271 b 598 -177 556 -225 577 -202 b 622 -164 605 -168 613 -164 b 636 -167 626 -164 631 -166 b 749 -225 678 -177 714 -199 b 848 -405 814 -276 848 -337 b 824 -507 848 -436 840 -471 b 657 -657 792 -582 730 -625 b 608 -668 638 -664 622 -668 b 534 -602 572 -668 547 -645 b 513 -575 530 -589 523 -575 b 507 -576 510 -575 508 -575 b 478 -582 497 -580 488 -582 b 405 -570 454 -582 428 -570 b 389 -572 399 -570 395 -570 l 363 -572 b 321 -575 348 -572 333 -569 l 321 631 b 323 662 323 641 323 652 b 315 716 323 681 321 698 b 304 736 314 723 317 736 l 302 736 b 281 716 294 734 285 729 b 275 665 276 700 275 683 l 275 382 b 276 99 275 288 275 193 b 279 -170 278 10 276 -81 b 284 -399 282 -246 284 -323 b 282 -629 284 -475 282 -553 b 289 -721 282 -660 289 -690 b 300 -736 289 -727 291 -736 b 312 -724 307 -736 310 -730 b 321 -667 323 -706 321 -687 l 321 -632 l 328 -644 l 340 -657 b 510 -757 386 -707 445 -740 b 615 -770 546 -766 580 -770 z',\n },\n fClef: {\n x_min: 0,\n x_max: 776,\n y_min: -496,\n y_max: 216,\n ha: 712,\n o: 'm 402 -706 b 804 -405 592 -678 716 -566 b 876 -53 861 -298 874 -183 b 868 33 876 -32 873 1 b 560 311 845 217 723 311 b 524 310 549 311 536 311 b 131 134 373 297 239 242 b 17 -29 84 86 37 39 b 9 -89 12 -50 9 -71 b 112 -238 9 -154 43 -206 b 124 -243 117 -239 120 -242 b 186 -261 145 -255 166 -261 b 268 -228 215 -261 242 -249 b 351 -59 325 -181 351 -124 b 343 10 351 -36 348 -13 b 340 36 341 19 340 27 b 409 105 340 75 363 102 b 441 107 420 107 431 107 b 624 36 510 107 573 86 b 744 -200 688 -27 724 -109 b 747 -230 747 -210 747 -222 b 717 -323 747 -264 736 -292 b 608 -445 688 -370 654 -410 b 307 -541 518 -513 415 -541 l 213 -541 b 39 -521 154 -541 96 -539 b 0 -552 17 -514 0 -531 b 1 -564 0 -556 0 -560 b 17 -611 6 -580 10 -596 b 101 -694 35 -648 50 -684 b 288 -714 164 -707 225 -714 b 402 -706 325 -714 363 -711 z m 1018 92 b 1080 118 1041 91 1068 96 b 1117 219 1099 150 1117 180 b 1113 252 1117 229 1116 240 b 1045 288 1102 297 1068 276 b 1017 262 1028 297 1024 274 b 984 124 989 220 996 170 b 1008 91 979 108 986 91 z m 972 -281 b 1070 -148 1024 -279 1070 -210 b 1025 -105 1070 -105 1045 -112 b 989 -127 1004 -96 998 -114 b 949 -249 963 -164 963 -209 b 969 -281 943 -265 949 -281 z',\n },\n unpitchedPercussionClef1: {\n x_min: 0,\n x_max: 379.13761966945304,\n y_min: -250,\n y_max: 250,\n ha: 500,\n o: 'm 481 -360 b 507 -357 491 -360 500 -360 b 546 -295 541 -346 547 -325 b 536 79 543 -170 540 -46 b 523 311 533 157 534 235 b 475 359 518 340 508 359 b 425 360 459 359 442 360 b 400 359 416 360 409 360 b 337 294 348 353 340 347 l 337 -73 b 336 -264 337 -137 337 -200 b 343 -294 336 -274 338 -284 b 481 -360 359 -330 431 -360 z m 144 -341 b 207 -320 167 -341 189 -331 b 217 -301 215 -315 217 -308 b 210 -262 217 -289 210 -275 b 228 187 212 -112 209 37 b 228 287 228 220 229 253 b 174 353 228 336 222 343 b 120 359 157 357 138 359 b 48 357 96 359 72 356 b 17 323 29 357 19 344 b 7 120 16 255 9 187 b 6 -109 6 43 6 -33 l 6 -204 b 0 -251 6 -220 0 -235 b 3 -269 0 -256 0 -262 b 127 -340 24 -330 79 -328 b 144 -341 132 -341 138 -341 z',\n },\n '6stringTabClef': {\n x_min: 0,\n x_max: 438,\n y_min: -768,\n y_max: 767,\n ha: 1535,\n o: 'm 369 438 b 374 439 370 438 372 438 b 384 462 383 444 384 452 l 384 474 b 390 697 386 547 390 622 b 373 1002 390 799 390 901 l 533 1002 b 560 1001 541 1004 552 1001 b 573 1007 567 1001 572 1002 b 546 1050 579 1025 559 1038 b 536 1056 543 1053 539 1053 b 324 1104 472 1102 397 1104 b 72 1090 238 1104 154 1099 b 55 1093 66 1090 60 1092 b 37 1073 46 1093 37 1089 b 60 1045 37 1061 48 1051 b 203 1001 105 1022 151 1001 b 233 1004 213 1001 223 1002 b 246 1005 238 1004 243 1005 b 272 975 264 1005 272 996 l 272 965 b 258 596 264 842 265 719 b 315 474 253 540 272 504 l 343 455 b 369 438 351 448 357 438 z m 114 -320 b 127 -304 120 -320 124 -315 b 171 -174 141 -261 158 -219 b 222 -135 179 -147 196 -137 b 426 -122 289 -131 359 -128 b 498 -164 462 -120 482 -127 b 628 -301 521 -226 575 -264 b 631 -288 631 -295 631 -291 b 628 -269 631 -281 629 -276 b 569 -134 616 -220 589 -179 b 408 225 514 -14 462 107 b 314 357 384 274 351 318 b 278 380 298 372 288 379 b 251 351 268 380 261 372 b 4 -209 156 171 75 -17 b 0 -228 1 -215 0 -222 b 19 -258 0 -240 7 -249 b 102 -314 45 -279 75 -294 b 114 -320 107 -318 111 -320 z m 425 6 b 360 20 403 17 382 20 b 274 14 331 20 302 14 l 246 14 l 340 206 b 425 6 369 137 395 75 z m 245 -1106 b 281 -1104 256 -1106 269 -1106 b 511 -888 400 -1094 511 -1035 b 454 -688 511 -814 504 -744 b 448 -678 449 -685 448 -681 b 454 -667 448 -675 449 -671 b 504 -497 503 -619 507 -559 b 324 -288 500 -383 436 -308 b 295 -287 314 -287 304 -287 l 282 -287 b 115 -330 223 -287 168 -307 b 94 -366 102 -336 94 -348 l 94 -370 b 96 -435 96 -392 96 -413 b 73 -858 89 -576 71 -717 b 78 -919 73 -878 78 -899 b 72 -950 78 -930 76 -940 b 63 -992 66 -965 63 -978 b 66 -1015 63 -999 65 -1008 b 173 -1104 84 -1106 84 -1106 b 245 -1106 197 -1104 220 -1104 z m 161 -622 b 147 -618 156 -622 151 -621 b 140 -600 141 -612 140 -606 b 144 -564 140 -589 144 -575 b 143 -554 144 -560 144 -557 l 143 -546 b 220 -451 144 -467 143 -465 b 278 -445 239 -446 259 -444 b 418 -497 328 -445 376 -461 b 429 -516 426 -504 429 -510 b 415 -533 429 -521 423 -527 b 219 -608 357 -579 287 -590 b 215 -609 217 -608 216 -609 b 161 -622 197 -609 177 -622 z m 154 -953 b 130 -933 135 -953 130 -948 l 130 -865 l 128 -865 b 135 -788 130 -838 124 -808 b 203 -769 145 -769 180 -776 b 259 -762 223 -765 242 -762 b 441 -852 330 -762 386 -805 b 449 -867 446 -858 449 -863 b 436 -884 449 -874 444 -878 b 318 -942 402 -914 363 -935 b 154 -953 264 -950 209 -953 z',\n },\n timeSig0: {\n x_min: 20,\n x_max: 513,\n y_min: -358.159536277652,\n y_max: 359,\n ha: 717.159536277652,\n o: 'm 341 -516 b 420 -510 367 -516 395 -514 b 675 -338 533 -494 622 -448 b 737 -92 716 -256 734 -171 b 739 -35 739 -73 739 -53 b 680 305 739 86 720 207 b 400 517 622 449 537 517 b 337 514 380 517 359 517 b 289 507 321 511 305 513 b 91 317 192 477 127 412 b 29 9 50 212 29 108 b 217 -458 29 -157 88 -312 b 341 -516 251 -494 291 -518 z m 412 -452 b 359 -425 393 -452 376 -444 b 187 14 242 -301 179 -158 b 268 334 193 127 212 235 b 387 448 295 383 330 428 b 406 452 395 451 400 452 b 428 444 413 452 420 449 b 517 324 471 413 497 372 b 586 -29 560 222 586 86 b 556 -271 586 -112 585 -193 b 468 -422 536 -327 508 -377 b 412 -452 449 -442 431 -452 z',\n },\n timeSig1: {\n x_min: 20,\n x_max: 283,\n y_min: -364,\n y_max: 366,\n ha: 730,\n o: 'm 264 -524 b 357 -510 297 -524 325 -516 b 374 -490 369 -508 374 -501 b 380 -438 376 -472 380 -455 l 406 246 b 408 301 408 265 408 282 b 400 445 408 348 405 396 b 288 527 395 491 338 527 b 253 520 276 527 264 526 b 240 508 249 517 245 513 b 49 409 192 445 127 413 b 29 396 33 408 29 403 b 32 380 29 392 30 386 b 59 363 36 366 49 364 b 164 348 95 356 130 348 b 222 357 183 348 203 351 b 238 361 228 360 233 360 b 252 334 248 361 252 353 b 243 59 252 242 249 150 b 219 -490 229 -124 233 -307 b 264 -524 217 -516 232 -524 z',\n },\n timeSig2: {\n x_min: 20,\n x_max: 660.4636303241031,\n y_min: -378.7201231608281,\n y_max: 382,\n ha: 760.720123160828,\n o: 'm 99 -543 b 130 -533 111 -550 121 -540 b 255 -448 168 -501 213 -475 b 338 -425 282 -431 310 -425 b 392 -431 356 -425 374 -426 b 485 -462 423 -438 454 -451 b 648 -497 540 -482 595 -497 b 834 -441 711 -497 773 -480 b 950 -242 906 -395 958 -334 b 942 -210 950 -230 950 -215 b 912 -220 932 -204 920 -213 b 861 -264 894 -235 877 -248 b 775 -317 835 -289 808 -305 b 675 -334 742 -328 708 -334 b 510 -295 619 -334 563 -318 b 372 -264 465 -278 420 -264 b 305 -272 350 -264 328 -266 b 331 -242 318 -256 324 -249 b 490 -73 386 -187 438 -131 b 675 340 595 43 664 180 b 677 369 677 350 677 360 b 556 536 677 461 638 508 b 468 550 526 546 497 550 b 297 508 409 550 353 533 b 111 354 220 475 168 412 b 29 197 65 308 29 261 b 32 164 29 187 29 176 b 29 140 33 157 29 147 b 43 125 29 132 32 125 b 73 147 55 125 65 138 b 86 163 79 153 82 158 b 238 320 134 219 183 272 b 425 389 292 367 360 389 b 575 341 480 389 531 373 b 606 298 590 330 606 317 b 600 278 606 292 603 285 b 501 107 576 217 544 158 b 304 -104 439 33 372 -35 b 111 -356 230 -180 167 -265 b 84 -446 92 -386 84 -415 b 86 -481 84 -458 85 -469 b 88 -514 88 -491 88 -503 b 99 -543 89 -526 91 -537 z',\n },\n timeSig3: {\n x_min: 19.824321427094187,\n x_max: 540,\n y_min: -392,\n y_max: 392,\n ha: 784,\n o: 'm 216 -540 b 354 -564 264 -556 310 -564 b 605 -465 445 -564 530 -530 b 729 -161 697 -383 729 -275 b 724 -82 729 -135 727 -108 b 589 95 716 -1 670 62 b 523 114 567 102 546 108 b 750 418 606 213 677 315 b 778 503 769 444 778 472 b 773 540 778 514 776 527 b 750 564 769 557 762 564 b 736 562 746 564 742 563 b 641 552 704 553 672 552 b 402 554 562 552 481 554 l 346 554 b 84 546 258 554 170 554 b 36 501 55 543 40 531 b 29 412 30 472 32 442 b 52 384 27 393 32 384 l 56 384 b 210 392 107 389 158 392 l 602 392 b 354 108 523 285 445 192 b 246 -65 300 58 246 12 b 252 -108 246 -78 248 -92 l 252 -111 b 264 -141 251 -122 251 -135 b 291 -132 274 -145 284 -140 b 425 -72 328 -95 377 -84 b 475 -65 442 -68 459 -65 b 592 -108 517 -65 557 -79 b 645 -179 615 -125 645 -147 b 642 -194 645 -184 644 -189 b 485 -376 616 -278 569 -344 b 361 -399 444 -392 402 -399 b 151 -340 289 -399 219 -376 b 88 -275 122 -323 98 -310 b 71 -249 86 -268 85 -249 b 63 -251 68 -249 66 -249 b 36 -288 48 -255 36 -266 b 55 -423 33 -336 45 -377 b 101 -482 60 -448 78 -468 b 216 -540 138 -504 174 -526 z',\n },\n timeSig4: {\n x_min: 20,\n x_max: 633.0785282750762,\n y_min: -489.59088556716864,\n y_max: 491.18559127100053,\n ha: 980.7764768381692,\n o: 'm 608 -704 b 641 -684 622 -708 634 -696 b 667 -602 660 -660 662 -631 b 685 -190 683 -465 680 -327 l 685 -176 b 831 -127 736 -166 783 -148 b 912 0 901 -94 913 -76 b 886 53 912 36 904 52 b 848 40 877 53 864 49 l 838 36 b 687 -13 789 14 739 -3 b 681 177 687 50 684 114 b 672 338 678 230 677 285 b 654 373 671 350 672 373 b 622 340 636 373 624 361 b 615 262 621 314 613 288 b 619 -22 616 167 619 72 b 569 -22 602 -23 585 -23 b 305 -3 481 -16 395 -1 b 210 -9 274 -3 242 -4 b 301 163 242 52 268 108 b 513 552 377 288 459 412 b 536 652 526 585 536 618 b 533 683 536 662 534 672 b 520 707 531 691 531 707 b 487 693 508 708 494 704 b 474 668 482 684 477 677 b 384 490 454 603 418 547 b 253 281 343 419 295 351 b 73 -13 194 181 145 78 b 29 -108 50 -42 29 -72 b 37 -147 29 -121 32 -134 b 50 -186 43 -160 50 -173 b 68 -216 52 -207 56 -215 b 92 -207 73 -216 82 -213 b 288 -166 156 -180 220 -166 b 556 -186 377 -166 467 -180 b 586 -189 566 -187 576 -187 b 616 -186 596 -189 606 -189 b 606 -432 613 -268 612 -350 b 596 -625 603 -495 596 -559 b 598 -670 596 -641 596 -655 b 608 -704 598 -683 596 -700 z',\n },\n timeSig5: {\n x_min: 19.663871085403297,\n x_max: 583,\n y_min: -389,\n y_max: 389,\n ha: 778,\n o: 'm 132 -536 b 249 -560 168 -553 209 -559 b 507 -462 351 -560 454 -514 b 677 -183 588 -384 642 -289 b 694 -85 688 -150 694 -117 b 540 138 694 12 642 94 b 422 173 501 154 462 167 b 400 187 408 174 400 177 b 405 202 400 190 402 196 b 428 284 416 228 426 255 b 469 312 431 307 442 312 b 757 372 569 312 662 343 b 840 490 821 392 840 432 b 812 560 840 540 834 560 b 763 546 801 560 785 556 b 757 543 762 546 759 544 b 465 484 665 505 570 484 b 396 484 452 484 425 487 b 353 454 377 482 366 474 b 281 300 323 405 304 351 b 245 164 262 255 245 212 b 246 144 245 158 246 151 b 233 63 249 115 243 89 b 225 35 228 50 225 40 b 264 14 225 22 236 19 b 445 -26 325 7 387 0 b 569 -151 501 -52 547 -89 b 575 -180 573 -161 575 -170 b 527 -275 575 -217 547 -245 b 347 -367 484 -334 419 -367 b 261 -351 318 -367 289 -363 b 95 -300 206 -333 154 -307 b 55 -321 73 -297 65 -302 b 29 -468 29 -367 40 -419 b 56 -505 26 -482 36 -500 b 132 -536 82 -514 108 -524 z',\n },\n timeSig6: {\n x_min: 20,\n x_max: 565,\n y_min: -363,\n y_max: 363,\n ha: 726,\n o: 'm 390 -518 b 621 -458 469 -507 549 -494 b 814 -134 753 -390 814 -281 b 652 59 814 -16 750 58 b 580 48 629 59 606 55 b 233 -334 392 -9 276 -138 b 115 -228 181 -314 143 -278 b 98 -160 104 -206 98 -183 b 107 -109 98 -144 101 -127 b 167 37 124 -59 145 -12 b 508 340 236 189 347 292 b 575 353 530 347 553 353 b 648 327 600 353 625 346 b 665 320 654 321 661 320 b 687 336 674 320 681 325 b 703 405 697 359 703 382 b 684 472 703 429 697 451 b 593 523 664 504 631 521 b 576 521 588 523 582 523 b 297 403 472 508 380 465 b 115 177 217 344 164 264 b 29 -121 60 82 29 -17 b 53 -278 29 -173 36 -225 b 226 -497 82 -374 131 -454 b 347 -523 265 -514 305 -523 b 390 -518 361 -523 376 -521 z m 351 -357 b 312 -351 337 -356 320 -363 b 325 -315 304 -340 320 -327 b 543 -120 373 -222 448 -158 b 622 -104 570 -108 596 -102 b 717 -132 655 -104 687 -112 b 740 -167 732 -143 740 -153 b 730 -196 740 -176 737 -184 b 563 -321 690 -258 634 -300 b 359 -357 497 -341 428 -354 z',\n },\n timeSig7: {\n x_min: 20.3617407597707,\n x_max: 592,\n y_min: -345,\n y_max: 345,\n ha: 690,\n o: 'm 253 -497 b 318 -485 276 -497 297 -487 b 366 -441 348 -482 360 -468 b 487 -104 390 -323 433 -210 b 835 403 580 82 701 246 b 852 436 847 416 852 428 b 815 467 852 451 840 461 b 762 474 798 471 779 474 b 674 445 732 474 701 465 b 603 410 652 431 628 420 b 383 360 533 379 459 360 b 200 435 315 360 249 382 b 88 494 168 469 131 485 b 66 497 81 495 73 497 b 33 484 52 497 39 492 b 50 436 22 469 39 451 b 295 310 114 360 199 324 b 406 301 331 304 369 301 b 593 324 468 301 530 308 b 585 307 589 314 588 310 b 265 -249 451 137 338 -46 b 207 -442 242 -312 223 -377 b 204 -462 206 -449 204 -456 b 253 -497 204 -487 220 -497 z',\n },\n timeSig8: {\n x_min: 20,\n x_max: 504.15101530718516,\n y_min: -428,\n y_max: 428,\n ha: 856,\n o: 'm 265 -616 b 289 -615 274 -616 281 -616 b 710 -271 492 -592 657 -485 b 726 -148 721 -229 727 -187 b 585 108 726 -48 687 42 b 572 127 576 114 573 120 b 576 144 572 132 575 138 b 598 301 590 196 598 249 b 586 413 598 338 593 376 b 356 616 559 531 467 616 b 233 582 317 616 275 606 b 29 233 101 505 29 384 b 104 9 29 153 46 72 b 189 -48 127 -16 160 -27 b 92 -158 141 -73 114 -114 b 37 -343 63 -217 50 -279 b 33 -390 35 -359 33 -374 b 265 -616 33 -524 148 -616 z m 258 105 b 124 148 215 105 167 117 b 96 196 105 163 96 177 b 99 217 96 202 96 209 b 197 384 120 281 151 337 b 350 451 242 429 297 451 b 516 364 412 451 472 422 b 530 331 523 354 530 343 l 530 327 l 530 320 b 468 151 520 261 507 200 b 419 122 455 135 442 125 b 258 105 370 117 320 105 z m 328 -438 b 158 -276 233 -436 160 -359 b 166 -239 158 -264 161 -252 b 230 -157 176 -203 202 -179 b 367 -72 274 -125 320 -98 b 448 -49 396 -56 423 -49 b 562 -118 491 -49 528 -72 b 611 -251 590 -157 611 -199 b 569 -341 611 -288 595 -318 b 328 -438 500 -402 416 -432 z',\n },\n timeSig9: {\n x_min: 20,\n x_max: 494,\n y_min: -421,\n y_max: 421,\n ha: 842,\n o: 'm 235 -606 b 361 -564 275 -606 318 -593 b 619 -229 487 -482 566 -366 b 706 127 664 -114 694 4 b 711 233 708 163 711 197 b 700 346 711 271 708 308 b 389 606 658 517 530 606 b 351 605 376 606 364 606 b 56 272 171 586 56 441 b 96 98 56 216 69 156 b 334 -53 144 -3 238 -53 b 544 36 408 -53 484 -24 b 652 176 586 78 622 124 b 631 71 645 141 639 105 b 467 -302 599 -63 562 -196 b 271 -442 412 -364 354 -422 b 225 -448 255 -446 239 -448 b 95 -305 148 -448 98 -395 b 89 -255 95 -288 94 -271 b 73 -233 86 -246 85 -233 b 52 -248 65 -233 56 -239 b 29 -317 42 -271 30 -291 b 49 -448 29 -361 40 -405 b 235 -606 69 -541 144 -606 z m 340 104 b 144 209 264 108 194 141 b 127 258 132 225 127 240 b 137 297 127 271 130 284 b 366 449 184 396 269 449 b 517 408 415 449 467 436 b 595 348 546 392 572 372 b 616 305 608 336 616 321 b 609 281 616 298 613 289 b 340 104 557 184 477 104 z',\n },\n timeSigCommon: {\n x_min: 20,\n x_max: 585,\n y_min: -298,\n y_max: 294.49658092772603,\n ha: 592.496580927726,\n o: 'm 444 -405 b 829 -45 626 -346 740 -207 b 842 26 842 -23 842 1 b 821 58 842 39 841 58 b 795 40 811 58 802 48 b 765 3 785 29 773 16 b 469 -223 690 -104 596 -183 b 354 -242 431 -235 392 -242 b 180 -177 292 -242 235 -223 b 135 -99 154 -157 140 -131 b 132 -59 134 -85 132 -72 b 141 7 132 -37 135 -16 b 449 274 189 160 297 243 b 477 278 459 276 468 276 b 546 203 517 278 539 253 b 517 157 550 177 533 166 b 485 143 507 153 497 143 l 482 143 b 467 148 478 143 472 144 b 374 183 438 170 406 181 b 264 118 333 183 292 161 b 238 48 246 92 238 69 b 261 -9 238 29 245 10 b 383 -73 287 -39 337 -73 b 412 -68 392 -73 402 -72 b 631 164 526 -27 586 59 b 649 252 644 193 649 222 b 636 328 649 278 645 304 b 504 423 615 400 579 429 b 242 318 408 415 317 387 b 29 -158 104 190 29 33 b 30 -176 29 -164 29 -170 b 115 -364 42 -246 52 -315 b 307 -429 177 -410 240 -429 b 444 -405 351 -429 397 -420 z',\n },\n timeSigCutCommon: {\n x_min: 20,\n x_max: 695,\n y_min: -687.0379164869064,\n y_max: 687,\n ha: 1374.0379164869064,\n o: 'm 564 -989 b 595 -945 585 -991 589 -963 l 599 -922 b 605 -628 600 -824 603 -726 l 609 -399 b 878 -251 706 -363 798 -320 b 996 -85 932 -204 976 -153 b 1001 -63 998 -78 1001 -71 b 989 -46 1001 -56 998 -49 b 978 -43 985 -45 982 -43 b 950 -59 968 -43 959 -49 b 733 -216 894 -132 815 -177 b 611 -259 694 -235 652 -249 b 616 -20 612 -179 615 -99 b 680 29 642 -7 665 9 b 698 43 685 36 690 40 b 870 251 792 82 840 160 b 877 294 874 265 877 279 b 818 410 877 338 855 382 b 683 458 779 442 730 448 b 625 468 664 462 644 465 l 625 514 b 638 958 626 662 636 811 b 626 989 638 979 635 989 b 603 981 621 989 613 986 b 422 840 534 945 481 888 b 412 805 412 832 413 818 b 426 713 410 773 420 743 b 445 678 429 690 435 678 b 474 691 452 678 461 683 b 563 755 503 710 530 732 b 564 724 564 740 564 733 b 559 469 563 639 560 554 b 462 454 526 469 494 464 b 112 143 302 399 199 281 b 33 -94 66 71 45 -10 b 29 -148 30 -112 29 -131 b 105 -351 29 -223 52 -291 b 359 -455 171 -426 258 -451 b 517 -431 409 -451 464 -446 l 539 -422 l 539 -477 b 533 -739 536 -563 539 -651 b 530 -824 531 -768 530 -795 b 546 -948 530 -865 533 -907 b 564 -989 552 -962 543 -989 z m 410 -288 b 193 -197 328 -288 253 -264 b 141 -60 160 -161 141 -108 b 157 6 141 -35 147 -12 b 259 158 189 58 217 112 b 438 291 311 215 364 266 b 528 305 468 301 498 305 b 554 304 537 305 546 304 b 553 212 554 274 554 242 b 426 115 498 199 446 164 b 416 68 419 99 416 84 b 425 12 416 49 420 30 b 474 -39 432 -17 448 -32 b 513 -43 487 -42 498 -43 b 547 -40 524 -43 536 -42 l 543 -272 b 461 -285 516 -278 488 -281 b 410 -288 444 -287 426 -288 z m 694 197 b 668 203 685 197 677 199 b 621 216 654 210 638 215 b 622 294 622 242 622 268 b 706 268 651 287 678 278 b 746 235 721 261 734 249 b 752 222 749 230 752 226 b 743 213 752 219 749 215 b 694 197 727 206 711 197 z',\n },\n timeSigPlus: {\n x_min: 0,\n x_max: 661,\n y_min: -358,\n y_max: 358,\n ha: 716,\n o: 'm 605 -516 b 629 -490 624 -516 629 -507 b 628 -475 629 -485 628 -481 b 613 -131 624 -405 616 -174 b 612 -96 612 -114 612 -96 l 647 -98 b 897 -115 730 -99 814 -109 b 940 -89 919 -117 935 -109 b 952 -24 946 -69 952 -46 b 948 9 952 -14 950 -3 b 912 39 942 26 933 37 b 609 60 822 48 609 60 b 616 392 609 60 608 291 b 567 488 619 436 605 467 b 511 516 550 498 531 514 b 498 511 507 516 503 514 b 478 446 475 501 480 469 b 467 150 474 348 469 249 b 465 59 465 121 465 59 l 372 49 b 73 14 272 36 173 24 b 49 13 65 13 56 13 b 0 -33 9 13 0 6 b 60 -141 0 -117 6 -140 b 112 -135 73 -141 91 -140 b 413 -102 213 -125 314 -112 b 464 -98 441 -99 464 -98 l 464 -145 b 477 -456 464 -249 468 -353 b 526 -510 478 -488 491 -507 b 589 -513 546 -511 569 -510 b 605 -516 595 -514 600 -516 z',\n },\n timeSigPlusSmall: {\n x_min: 0,\n x_max: 418,\n y_min: -197,\n y_max: 199,\n ha: 396,\n o: 'm 301 -284 b 330 -238 320 -284 324 -255 b 348 -46 350 -176 341 -111 b 374 -20 351 -27 356 -23 b 481 -17 409 -16 445 -17 b 566 -9 510 -17 537 -16 b 602 3 579 -7 602 -16 b 566 29 602 19 582 24 b 526 33 553 32 539 33 b 384 39 478 36 432 39 b 356 62 363 39 356 42 l 356 68 b 359 177 359 104 359 141 l 359 251 b 341 287 359 264 361 285 b 311 255 324 287 314 272 b 310 228 311 246 310 236 l 301 69 b 275 39 301 49 295 39 l 271 39 b 210 40 251 40 230 40 b 167 39 196 40 181 40 b 89 40 141 37 115 40 b 24 30 68 40 46 37 b 0 17 17 27 0 30 l 0 13 b 27 -17 3 0 7 -13 b 91 -22 49 -22 71 -22 b 153 -22 115 -22 137 -20 l 275 -22 b 295 -40 289 -22 295 -27 l 295 -48 b 288 -235 288 -109 287 -171 b 287 -264 288 -243 287 -253 b 301 -284 287 -275 289 -284 z',\n },\n timeSigMinus: {\n x_min: 0,\n x_max: 662,\n y_min: -54,\n y_max: 55,\n ha: 109,\n o: 'm 39 -78 b 49 -76 42 -78 45 -76 b 452 -75 94 -75 272 -75 b 861 -76 632 -75 814 -76 b 953 -20 927 -79 953 -66 b 948 27 953 -7 950 9 b 946 37 948 30 948 35 b 896 79 940 63 929 79 b 471 78 827 78 648 78 l 42 78 b 0 37 14 78 0 69 b 23 -66 0 0 17 -32 b 39 -78 24 -75 32 -76 z',\n },\n timeSigParensRight: {\n x_min: 0,\n x_max: 274.26483738379414,\n y_min: -722.6326530612245,\n y_max: 725,\n ha: 1447.6326530612246,\n o: 'm 37 -1038 b 69 -1031 48 -1044 59 -1038 b 88 -1015 76 -1027 82 -1021 b 164 -886 120 -976 147 -933 b 333 -351 233 -711 292 -534 b 395 118 366 -204 399 -59 b 389 245 392 144 392 194 b 120 996 369 521 265 766 b 68 1044 99 1030 84 1044 b 19 988 50 1044 36 1024 b 0 922 7 965 0 945 b 20 858 0 901 6 881 b 259 215 141 660 236 449 b 271 -1 266 143 271 71 b 252 -239 271 -82 265 -161 b 148 -667 228 -384 183 -524 b 39 -1009 120 -785 66 -893 b 33 -1031 37 -1017 33 -1024 b 37 -1038 33 -1034 35 -1037 z',\n },\n timeSigParensRightSmall: {\n x_min: 0,\n x_max: 154.4025307335204,\n y_min: -422,\n y_max: 422,\n ha: 844,\n o: 'm 43 -608 b 60 -598 48 -608 53 -605 b 117 -511 82 -572 102 -543 b 222 23 193 -350 219 -177 b 213 166 225 55 216 109 b 115 531 206 294 174 416 b 45 603 99 562 76 588 b 30 608 39 606 35 608 b 10 598 23 608 17 603 b 0 546 3 590 0 570 b 23 451 0 507 9 458 b 102 351 66 429 84 390 b 167 42 150 252 167 148 b 163 -49 167 12 166 -19 b 35 -449 151 -192 121 -330 b 14 -504 22 -467 14 -485 b 17 -527 14 -511 16 -520 l 30 -590 b 43 -608 33 -603 37 -608 z',\n },\n timeSigParensLeft: {\n x_min: 0.5555555555555556,\n x_max: 399.6216117372966,\n y_min: -728,\n y_max: 728,\n ha: 1456,\n o: 'm 562 -1048 b 573 -1043 566 -1048 570 -1047 b 553 -988 582 -1025 564 -1004 b 472 -884 527 -952 497 -920 b 210 -354 366 -717 275 -541 b 148 -6 170 -240 148 -124 b 160 148 148 45 153 96 b 315 678 189 331 242 508 b 431 901 350 755 380 834 b 459 950 451 926 461 939 b 435 995 459 962 451 972 b 364 1048 405 1034 383 1048 b 305 996 343 1048 325 1028 b 127 624 226 881 174 753 b 1 30 56 432 9 235 b 1 -32 1 9 0 -12 b 180 -629 13 -245 92 -438 b 363 -936 230 -739 298 -835 b 526 -1041 402 -995 448 -1041 b 562 -1048 537 -1040 552 -1048 z',\n },\n timeSigParensLeftSmall: {\n x_min: 0,\n x_max: 173.45497224367904,\n y_min: -405,\n y_max: 404,\n ha: 809,\n o: 'm 197 -583 b 222 -553 212 -582 219 -566 b 229 -497 226 -534 229 -516 b 213 -425 229 -472 225 -448 b 102 -177 173 -344 132 -262 b 62 30 78 -111 58 -42 b 91 183 66 82 75 134 b 215 426 118 271 156 356 b 249 552 246 465 252 505 b 230 582 249 563 246 582 b 197 563 219 582 206 576 b 71 356 144 500 105 429 b 0 50 26 259 3 158 b 13 -112 4 -3 7 -58 b 176 -559 29 -275 105 -416 b 196 -583 180 -569 186 -583 z',\n },\n noteheadDoubleWhole: {\n x_min: -0.4444444444444444,\n x_max: 614.1875,\n y_min: -223.03296670127517,\n y_max: 223,\n ha: 446.0329667012752,\n o: 'm 35 -321 b 62 -266 58 -318 58 -288 l 62 -194 b 63 50 62 -114 63 -32 b 60 189 63 96 63 143 b 43 300 59 226 60 265 b 29 321 40 308 39 321 l 26 321 b 0 292 13 318 0 310 b 0 248 0 278 -1 262 b 6 147 4 215 6 181 b 4 48 6 114 4 81 b 6 0 4 32 6 16 b 7 -36 7 -12 7 -24 l 7 -52 b 6 -156 7 -86 6 -121 b 19 -275 6 -196 9 -236 b 35 -321 23 -291 16 -323 z m 847 -314 b 871 -288 860 -315 867 -300 b 884 -187 881 -255 886 -222 b 876 115 878 -86 876 14 b 877 255 876 161 876 209 b 868 291 877 268 873 279 b 855 304 867 301 863 304 b 844 301 852 304 848 304 b 822 265 825 292 822 278 b 824 251 822 259 822 255 b 822 170 822 225 822 197 l 822 -20 b 835 -284 827 -86 825 -186 b 847 -314 837 -295 835 -311 z m 757 -291 b 793 -171 796 -255 792 -212 b 795 -49 795 -131 795 -91 b 786 207 795 36 791 121 b 779 240 786 217 783 229 b 766 258 776 246 776 258 b 762 256 765 258 763 256 b 739 236 752 253 740 252 b 733 177 737 216 732 197 b 737 20 737 125 739 73 l 737 -107 b 740 -202 737 -138 739 -170 b 757 -291 740 -230 743 -261 z m 128 -261 b 144 -251 135 -264 141 -256 b 158 -203 156 -236 157 -220 b 161 -137 161 -181 161 -158 b 157 30 161 -81 157 -26 b 158 76 157 45 157 60 l 158 101 b 156 225 158 141 158 183 b 137 253 156 235 154 253 l 134 253 b 109 222 120 251 109 242 b 104 91 108 179 104 134 b 108 -58 104 42 109 -9 b 107 -105 108 -73 108 -89 b 105 -127 107 -112 107 -120 b 118 -245 105 -167 114 -204 b 128 -261 118 -252 121 -259 z m 488 -242 b 693 -79 595 -249 685 -166 l 693 -55 b 690 0 693 -36 691 -17 b 540 187 684 84 621 164 b 449 200 508 196 480 200 b 210 104 363 200 282 163 b 186 56 196 92 186 76 b 207 -82 186 9 192 -37 b 300 -204 225 -132 248 -181 b 488 -242 356 -229 415 -240 z m 490 -88 b 449 -86 477 -88 464 -88 b 287 -56 399 -85 341 -78 b 258 -33 275 -52 258 -48 b 282 -7 258 -20 272 -13 b 458 43 340 23 399 43 b 580 14 497 43 537 35 b 618 -20 606 1 619 -9 b 592 -58 618 -30 609 -42 b 490 -88 562 -82 528 -88 z',\n },\n noteheadWhole: {\n x_min: 0,\n x_max: 380.16649762501584,\n y_min: -186.17102907059297,\n y_max: 165,\n ha: 351.17102907059297,\n o: 'm 547 40 b 223 -268 543 -151 367 -259 b 102 -233 180 -271 143 -248 l 62 -216 b 0 -127 22 -197 0 -166 b 6 -91 0 -115 1 -104 b 122 141 33 -9 69 71 b 327 238 170 204 249 238 b 514 158 397 238 467 212 b 547 40 544 125 549 84 z m 248 -107 b 384 -63 295 -102 341 -88 b 426 -23 402 -53 415 -40 b 435 3 432 -14 435 -6 b 413 32 435 14 428 24 b 301 73 376 49 343 73 b 272 69 291 73 282 72 b 121 -35 207 53 157 20 b 111 -58 117 -42 111 -50 b 125 -75 111 -65 115 -71 b 248 -107 164 -89 202 -107 z',\n },\n noteheadHalf: {\n x_min: 0,\n x_max: 334,\n y_min: -174,\n y_max: 175,\n ha: 349,\n o: 'm 480 56 b 167 -251 478 -115 331 -251 b 94 -242 143 -251 118 -248 b 9 -141 43 -229 20 -192 b 0 -68 3 -115 0 -91 b 284 249 0 95 127 200 b 304 252 289 251 297 252 b 481 78 374 252 481 170 b 480 56 481 71 481 63 z m 213 -102 b 399 6 274 -81 341 -48 b 402 17 400 7 402 13 b 399 27 402 22 400 26 b 311 94 373 53 353 88 b 292 95 305 95 300 95 b 130 27 230 95 181 55 b 69 -62 98 9 62 -29 b 161 -98 76 -98 128 -91 b 213 -102 174 -101 186 -101 z',\n },\n noteheadBlack: {\n x_min: 0,\n x_max: 334.04644433966797,\n y_min: -164,\n y_max: 164,\n ha: 328,\n o: 'm 112 -233 b 141 -236 122 -235 131 -236 b 481 104 279 -236 485 -48 b 403 222 477 141 478 192 b 334 236 382 232 359 236 b 1 -59 180 236 13 59 b 0 -85 1 -68 0 -76 b 112 -233 0 -157 32 -215 z',\n },\n noteheadXWhole: {\n x_min: 0,\n x_max: 506,\n y_min: -143.0823320899293,\n y_max: 144,\n ha: 287.0823320899293,\n o: 'm 53 -206 b 219 -163 117 -207 170 -196 b 314 -102 249 -141 282 -122 b 377 -63 334 -89 356 -76 b 514 -161 422 -96 468 -128 b 576 -196 534 -174 552 -196 b 589 -193 580 -196 585 -196 b 688 -174 625 -194 657 -181 b 711 -158 698 -171 711 -173 b 696 -143 711 -151 701 -147 b 503 -9 632 -98 567 -52 l 485 4 b 704 145 559 49 634 95 b 729 164 711 150 729 151 l 729 168 b 696 196 726 183 710 193 b 621 207 671 202 645 207 b 528 177 589 207 557 200 b 373 76 480 140 426 108 b 246 164 330 104 287 132 b 122 206 207 193 167 203 b 66 192 102 207 72 207 b 99 147 58 173 85 158 b 274 14 157 102 215 58 b 16 -164 184 -42 96 -98 b 0 -179 12 -168 0 -170 b 1 -183 0 -180 0 -183 b 26 -204 6 -193 12 -204 b 53 -206 37 -206 49 -206 z m 611 -177 b 376 -9 530 -118 452 -63 l 164 -143 b 104 -164 147 -154 130 -164 b 82 -161 96 -164 89 -164 b 230 -65 137 -125 183 -95 l 347 12 b 327 26 341 16 334 22 l 196 121 b 163 147 184 128 173 137 b 140 173 154 154 140 163 b 143 180 140 176 141 177 b 179 166 154 194 167 174 l 372 27 l 566 153 b 613 171 580 161 596 170 b 635 160 624 171 635 174 b 621 147 635 153 626 150 l 429 24 b 400 6 419 19 409 13 b 569 -117 456 -35 513 -75 b 611 -177 588 -130 608 -143 z',\n },\n noteheadXHalf: {\n x_min: 0,\n x_max: 421,\n y_min: -145.51844828189743,\n y_max: 151,\n ha: 296.51844828189746,\n o: 'm 490 -209 b 539 -207 505 -207 521 -207 b 606 -209 560 -207 583 -209 b 598 -196 602 -203 600 -199 l 406 -19 l 540 130 b 547 144 546 135 547 140 b 536 156 547 148 543 153 b 488 192 518 166 503 176 b 416 217 471 209 444 217 b 323 180 380 217 344 204 l 264 115 b 239 138 256 122 248 131 b 33 197 180 196 108 200 b 3 186 23 197 6 193 b 19 154 -1 174 10 163 b 171 12 69 107 120 59 b 19 -157 120 -45 69 -101 b 0 -177 14 -163 0 -166 b 1 -181 0 -179 0 -180 b 39 -203 9 -197 22 -203 l 186 -203 b 197 -202 190 -202 193 -200 l 213 -202 b 262 -180 228 -202 246 -199 l 314 -122 b 490 -209 363 -170 412 -216 z m 435 -148 b 291 -30 379 -112 337 -69 l 213 -118 b 190 -137 207 -125 202 -137 b 145 -111 173 -130 154 -127 b 160 -79 137 -98 151 -88 b 238 16 184 -48 212 -16 b 141 99 204 43 173 72 l 124 117 b 115 132 121 121 115 127 b 118 137 115 134 117 137 b 141 132 127 147 135 138 l 253 36 b 347 150 285 75 315 112 b 370 164 354 160 363 163 b 403 145 382 164 393 156 b 416 127 412 140 416 132 b 405 102 416 118 412 111 l 307 -10 b 413 -105 343 -42 379 -73 b 435 -148 425 -115 436 -125 z',\n },\n noteheadXBlack: {\n x_min: 0,\n x_max: 289,\n y_min: -156,\n y_max: 157,\n ha: 313,\n o: 'm 23 -225 b 69 -204 40 -223 56 -219 b 137 -131 92 -180 115 -157 l 209 -50 b 377 -197 264 -101 321 -148 b 403 -210 384 -203 393 -210 l 408 -210 b 416 -192 416 -207 416 -199 l 416 -186 b 403 -148 416 -171 413 -158 b 344 -81 384 -125 367 -101 b 252 -1 312 -55 282 -29 b 377 157 297 49 340 101 b 402 202 387 170 402 187 b 395 217 402 207 400 213 b 376 226 389 223 382 226 b 334 192 360 226 346 204 b 206 42 289 143 248 94 b 96 161 167 81 131 120 b 60 193 86 174 76 189 b 33 206 52 196 42 206 b 22 199 29 206 26 204 b 10 173 14 190 10 181 b 22 147 10 166 14 157 b 148 7 62 98 104 52 b 164 -7 154 1 158 -3 b 10 -189 111 -66 55 -122 b 0 -212 6 -197 0 -203 b 1 -217 0 -213 0 -216 b 23 -225 4 -226 14 -222 z',\n },\n noteheadCircleX: {\n x_min: 0,\n x_max: 344,\n y_min: -179,\n y_max: 175.12551922594866,\n ha: 354.12551922594866,\n o: 'm 99 -210 b 236 -258 137 -242 186 -258 b 418 -183 305 -258 374 -230 b 495 33 475 -120 495 -48 b 494 66 495 45 494 55 b 302 252 487 183 405 256 b 181 243 262 249 222 248 b 46 171 128 236 79 219 b 0 19 14 127 0 73 b 99 -210 0 -68 35 -156 z m 245 42 l 124 156 b 200 176 145 166 170 173 b 337 183 245 181 291 184 b 377 176 351 183 364 180 b 245 42 333 131 288 86 z m 392 -99 l 285 3 l 400 121 b 418 154 409 131 418 140 b 465 50 448 130 465 94 b 405 -112 462 -17 439 -73 z m 89 -120 b 48 0 56 -82 48 -42 b 89 112 48 35 59 76 b 109 101 96 111 102 108 l 210 7 l 187 -17 b 89 -120 151 -53 125 -82 z m 176 -183 b 127 -163 158 -179 141 -171 l 252 -32 l 372 -144 b 233 -189 334 -173 285 -189 b 176 -183 215 -189 196 -187 z',\n },\n noteheadTriangleUpWhole: {\n x_min: 0,\n x_max: 366,\n y_min: -145,\n y_max: 138,\n ha: 283,\n o: 'm 504 -209 b 527 -199 520 -209 527 -206 b 520 -180 527 -193 524 -187 b 459 -94 501 -151 480 -122 b 279 170 400 -6 341 82 b 242 199 266 190 253 199 b 206 167 230 199 219 189 b 10 -145 140 63 76 -42 b 0 -171 3 -156 0 -164 b 23 -200 0 -183 9 -192 b 55 -209 33 -206 45 -209 z m 202 -161 b 176 -137 183 -163 176 -156 b 187 -62 176 -111 179 -86 b 253 95 206 -10 228 42 b 337 -132 307 24 334 -49 b 311 -161 338 -153 334 -161 b 256 -160 294 -161 275 -160 b 202 -161 238 -160 220 -161 z',\n },\n noteheadTriangleUpHalf: {\n x_min: 0,\n x_max: 341.0833130378007,\n y_min: -159,\n y_max: 159,\n ha: 318,\n o: 'm 458 -226 b 478 -229 462 -223 469 -229 b 490 -222 482 -229 487 -228 b 477 -184 495 -207 484 -196 b 281 176 410 -65 346 56 b 238 225 269 194 261 213 b 225 229 232 226 228 228 b 209 215 217 229 213 225 b 4 -153 141 92 73 -30 b 0 -170 1 -158 0 -164 b 12 -189 0 -177 4 -183 b 66 -215 27 -202 43 -213 b 458 -226 194 -217 323 -222 z m 151 -167 b 298 75 204 -89 240 -1 b 301 82 300 76 301 79 l 357 -22 b 344 -43 353 -27 350 -37 b 285 -163 317 -79 312 -127 b 278 -170 282 -166 279 -167 z',\n },\n noteheadTriangleUpBlack: {\n x_min: 0,\n x_max: 346,\n y_min: -149,\n y_max: 149,\n ha: 298,\n o: 'm 481 -215 b 498 -209 487 -215 492 -215 b 482 -173 498 -194 488 -184 l 284 173 b 259 202 278 184 269 194 b 229 215 248 210 238 215 b 196 189 216 215 206 206 l 13 -150 b 3 -168 9 -156 6 -163 b 0 -180 1 -173 0 -177 b 12 -197 0 -187 4 -193 b 63 -213 29 -206 45 -213 b 481 -215 203 -213 343 -215 z',\n },\n noteheadDiamondWhole: {\n x_min: 0,\n x_max: 271,\n y_min: -132,\n y_max: 132,\n ha: 264,\n o: 'm 230 -177 b 256 -190 240 -186 249 -190 b 281 -173 265 -190 272 -184 b 382 -29 314 -124 347 -76 b 390 -10 387 -22 390 -14 b 376 12 390 -3 386 4 b 173 177 308 66 240 121 b 144 190 166 183 160 190 b 98 153 127 186 112 170 b 13 40 69 115 42 76 b 0 13 4 29 0 20 b 22 -19 0 3 7 -9 b 230 -177 92 -69 163 -122 z m 279 -128 b 261 -122 274 -134 266 -127 l 66 30 b 56 45 59 35 56 39 b 62 56 56 48 59 52 b 122 122 91 101 105 122 b 194 76 138 122 158 107 l 320 -26 b 336 -50 325 -32 336 -35 b 279 -128 318 -75 300 -102 z',\n },\n noteheadDiamondHalf: {\n x_min: 0,\n x_max: 295,\n y_min: -148,\n y_max: 148,\n ha: 296,\n o: 'm 228 -207 b 245 -213 235 -210 240 -213 b 264 -203 252 -213 258 -210 b 415 -46 314 -150 364 -98 b 425 -27 420 -40 425 -35 b 416 -10 425 -22 422 -16 b 217 200 350 60 284 131 b 194 213 212 207 204 213 b 170 196 181 213 177 203 b 14 33 118 143 68 86 b 0 7 4 23 0 16 b 17 -20 0 -1 6 -10 b 118 -114 52 -50 82 -85 b 228 -207 156 -144 184 -184 z m 209 -157 b 134 -69 177 -138 141 -115 b 130 -26 131 -55 130 -40 b 215 148 130 42 160 99 b 225 156 217 151 220 156 b 230 153 226 156 228 156 b 323 -26 276 104 321 55 b 298 -75 324 -42 315 -59 b 265 -109 287 -86 276 -99 b 209 -157 245 -125 228 -167 z',\n },\n noteheadDiamondBlack: {\n x_min: 0,\n x_max: 310,\n y_min: -146,\n y_max: 146,\n ha: 292,\n o: 'm 266 -210 b 289 -194 278 -209 284 -200 b 406 -76 330 -156 367 -115 b 446 -23 433 -49 446 -36 b 412 29 446 -10 435 3 b 405 36 409 30 408 33 b 252 196 354 89 304 143 b 225 210 243 204 235 210 b 204 202 219 210 212 209 b 10 24 141 141 75 82 b 0 9 4 19 0 14 b 9 -6 0 4 3 0 l 232 -192 b 266 -210 242 -200 256 -204 z',\n },\n noteheadSquareWhite: {\n x_min: 0,\n x_max: 350,\n y_min: -131,\n y_max: 131,\n ha: 262,\n o: 'm 468 -189 b 485 -187 474 -189 480 -189 b 500 -176 495 -187 500 -183 b 498 -168 500 -174 498 -171 b 497 -166 498 -167 497 -167 l 498 -164 b 504 -154 503 -163 504 -158 b 503 -138 504 -150 503 -144 l 503 -135 l 503 -94 b 492 66 500 -45 494 10 b 488 135 492 89 488 112 b 484 150 488 141 485 145 b 482 154 482 151 482 153 b 429 189 472 177 456 189 b 53 184 304 186 179 186 l 39 184 b 33 181 36 183 35 183 b 12 160 20 181 12 177 b 0 -109 9 71 4 -19 b 19 -137 0 -125 7 -134 b 23 -151 19 -141 20 -145 b 85 -187 37 -173 55 -187 b 468 -189 212 -187 340 -187 z m 246 -125 l 63 -125 b 66 -111 65 -122 66 -117 b 73 72 69 -50 71 10 l 73 130 b 88 128 78 128 82 128 b 148 130 108 130 128 130 b 271 128 190 130 230 128 l 271 130 l 420 130 b 428 20 425 92 425 56 l 436 -127 l 246 -127 z',\n },\n noteheadSquareBlack: {\n x_min: 0,\n x_max: 342,\n y_min: -129.98961937716263,\n y_max: 132.44444444444446,\n ha: 262.4340638216071,\n o: 'm 217 190 b 439 186 304 190 372 190 b 467 180 448 184 458 183 b 492 145 484 176 492 167 b 490 -124 490 56 490 -33 b 488 -141 490 -130 488 -135 b 456 -170 488 -163 478 -168 b 118 -183 344 -176 230 -181 b 29 -184 89 -183 60 -192 b 0 -148 4 -180 0 -168 b 1 29 1 -89 1 -30 l 1 156 b 36 190 3 187 4 190 b 217 190 102 192 168 190 z',\n },\n noteheadParenthesis: {\n x_min: -70.190112022022,\n x_max: 329,\n y_min: -196,\n y_max: 201,\n ha: 397,\n o: 'm 344 -279 b 382 -262 361 -288 370 -272 b 405 -233 390 -255 399 -245 b 474 9 455 -158 468 -73 b 416 228 474 78 448 174 b 364 282 403 249 387 271 b 344 289 359 285 350 288 b 331 279 338 289 333 287 b 325 248 328 269 325 258 b 338 225 325 238 328 229 b 412 138 379 207 396 174 b 445 1 433 92 445 45 b 346 -217 445 -81 410 -154 b 336 -252 340 -223 336 -238 b 344 -279 336 -265 338 -276 z m 19 -274 b 35 -282 24 -279 30 -281 b 49 -265 42 -282 46 -275 b 52 -243 50 -256 52 -249 b 36 -210 52 -230 49 -220 b -60 -59 -16 -173 -35 -114 b -73 9 -69 -39 -73 -16 b 33 223 -73 92 -24 189 b 50 265 43 229 50 249 b 33 288 50 278 46 289 b 4 272 23 288 14 275 b -9 261 0 269 -4 265 b -101 23 -58 193 -105 124 b -37 -206 -104 -52 -75 -130 b 19 -274 -23 -232 -6 -255 z',\n },\n noteheadParenthesisRight: {\n x_min: -30,\n x_max: 82,\n y_min: -199.08429092881173,\n y_max: 206,\n ha: 405.0842909288117,\n o: 'm -17 -282 b 24 -264 -6 -297 12 -272 b 60 -219 40 -253 52 -236 b 117 1 96 -150 112 -75 b 118 16 118 6 118 12 b 109 73 118 36 112 55 b 4 279 99 154 68 226 b -23 297 -4 287 -13 297 b -37 289 -27 297 -32 294 b -43 266 -42 285 -43 276 b -32 225 -43 251 -37 229 b 84 -7 48 170 84 82 b 32 -184 84 -69 65 -132 b -10 -222 22 -200 4 -209 b -24 -258 -20 -232 -24 -245 b -17 -282 -24 -266 -22 -276 z',\n },\n noteheadParenthesisLeft: {\n x_min: 0,\n x_max: 106,\n y_min: -197,\n y_max: 197,\n ha: 394,\n o: 'm 134 -284 b 138 -281 135 -284 137 -284 b 145 -268 144 -278 145 -274 l 144 -253 b 107 -180 138 -225 121 -204 b 42 13 71 -120 42 -56 b 49 73 42 32 43 52 b 137 210 62 128 95 171 b 153 255 147 219 153 239 b 145 278 153 265 151 274 b 130 284 140 281 135 284 b 98 259 117 284 108 268 b 0 37 35 203 1 131 b 118 -268 9 -69 53 -173 b 134 -284 121 -274 127 -284 z',\n },\n augmentationDot: {\n x_min: 0,\n x_max: 96,\n y_min: -57,\n y_max: 57,\n ha: 114,\n o: 'm 13 -82 b 16 -81 14 -82 14 -82 b 105 -73 46 -76 75 -76 b 131 -48 121 -72 131 -60 b 138 26 134 -24 138 0 b 137 48 138 33 138 40 b 108 82 134 71 125 82 b 95 81 104 82 99 82 b 33 71 75 78 53 75 b 4 46 20 68 6 62 b 0 -66 1 9 0 -29 b 13 -82 0 -73 1 -82 z',\n },\n tremolo1: {\n x_min: -158,\n x_max: 156.19381479578487,\n y_min: -88,\n y_max: 88,\n ha: 176,\n o: 'm -206 -127 b -194 -125 -203 -127 -199 -127 b 173 -36 -72 -94 50 -65 b 220 16 202 -29 215 -12 b 225 50 223 30 225 45 b 216 107 226 76 222 91 b 194 127 210 120 204 127 b 183 124 192 127 189 127 l -192 33 b -226 -9 -213 27 -222 14 b -228 -32 -226 -16 -228 -23 b -222 -108 -228 -58 -222 -82 b -206 -127 -222 -120 -217 -127 z',\n },\n flag8thUp: {\n x_min: 0,\n x_max: 261,\n y_min: -819,\n y_max: 0,\n ha: 819,\n o: 'm 265 -1171 b 351 -1035 301 -1130 336 -1087 b 376 -867 369 -979 376 -923 b 367 -755 376 -829 373 -792 b 233 -422 350 -632 311 -520 b 131 -291 199 -379 166 -334 b 65 -125 91 -239 66 -192 b 62 -75 65 -112 62 -91 b 42 0 62 -49 52 -24 l 35 0 b 0 -63 6 -13 0 -36 l 0 -144 b 96 -445 0 -255 29 -356 b 177 -547 124 -478 150 -514 b 308 -831 246 -629 298 -721 b 317 -890 310 -851 317 -871 b 311 -919 317 -900 315 -910 b 256 -1005 297 -950 282 -984 b 228 -1068 233 -1024 228 -1045 b 230 -1106 228 -1080 229 -1093 b 240 -1162 232 -1125 239 -1143 b 251 -1179 242 -1174 246 -1179 b 265 -1171 255 -1179 259 -1176 z',\n },\n flag8thDown: {\n x_min: 0,\n x_max: 261,\n y_min: 0,\n y_max: 819,\n ha: 819,\n o: 'm 265 1171 b 251 1179 259 1176 255 1179 b 240 1162 246 1179 242 1174 b 230 1106 239 1143 232 1125 b 228 1068 229 1093 228 1080 b 256 1005 228 1045 233 1024 b 311 919 282 984 297 950 b 317 890 315 910 317 900 b 308 831 317 871 310 851 b 177 547 298 721 246 629 b 96 445 150 514 124 478 b 0 144 29 356 0 255 l 0 63 b 35 0 0 36 6 13 l 42 0 b 62 75 52 24 62 49 b 59 117 62 91 59 104 b 131 291 60 183 91 239 b 233 422 166 334 199 379 b 367 755 311 520 350 632 b 376 867 373 792 376 829 b 351 1035 376 923 369 979 b 265 1171 336 1087 301 1130 z',\n },\n flag16thUp: {\n x_min: 0,\n x_max: 327.1591498636094,\n y_min: -819.3972596310256,\n y_max: 0,\n ha: 819.3972596310256,\n o: 'm 415 -1179 b 435 -1168 423 -1182 429 -1174 b 451 -1138 442 -1159 446 -1149 b 465 -1020 464 -1102 467 -1064 b 461 -962 464 -1004 464 -984 b 471 -821 467 -916 472 -870 b 465 -721 472 -791 467 -756 b 415 -520 459 -651 441 -585 b 200 -245 370 -408 284 -327 b 96 -114 160 -206 118 -168 b 75 -24 84 -85 85 -53 b 59 0 72 -16 72 0 b 53 -1 58 0 56 -1 b 27 -32 40 -6 27 -10 b 29 -68 27 -43 29 -55 b 10 -79 20 -69 13 -72 b 1 -109 6 -89 1 -99 b 0 -170 0 -130 0 -148 b 35 -410 0 -252 12 -333 b 258 -793 76 -557 156 -681 b 409 -1158 350 -896 410 -1014 b 415 -1179 409 -1165 405 -1175 z m 413 -816 b 331 -681 392 -769 364 -723 b 145 -420 266 -596 189 -521 b 86 -281 125 -374 102 -330 b 156 -370 105 -312 128 -343 b 318 -539 210 -425 269 -478 b 413 -816 383 -621 420 -713 z',\n },\n flag16thDown: {\n x_min: 0,\n x_max: 327.1591498636094,\n y_min: 0,\n y_max: 819,\n ha: 819,\n o: 'm 59 0 b 75 24 72 0 72 16 b 96 114 85 53 84 85 b 200 245 118 168 160 206 b 415 520 284 327 370 408 b 465 721 441 585 459 651 b 471 821 467 756 472 791 b 461 962 472 870 467 916 b 465 1020 464 984 464 1004 b 451 1138 467 1064 464 1102 b 435 1168 446 1149 442 1159 b 418 1179 431 1172 425 1179 l 415 1179 b 408 1169 409 1176 408 1174 b 409 1158 408 1165 409 1161 b 258 793 410 1014 350 896 b 35 410 156 681 76 557 b 0 170 12 333 0 252 l 0 88 b 29 7 0 71 6 23 b 59 0 33 4 58 0 z m 86 281 b 145 420 102 330 125 374 b 331 681 189 521 266 596 b 413 816 364 723 392 769 b 415 791 413 808 415 799 b 318 539 415 698 377 613 b 156 370 269 478 210 425 b 86 281 128 343 105 312 z',\n },\n flag32ndUp: {\n x_min: -0.19862981551275186,\n x_max: 268.0942440943661,\n y_min: -849.4710740978672,\n y_max: 149.0769891455102,\n ha: 998.5480632433774,\n o: 'm 323 -1223 b 351 -1198 337 -1227 344 -1210 b 359 -1184 354 -1194 356 -1188 b 386 -999 377 -1122 387 -1060 b 341 -783 386 -927 372 -855 b 330 -736 334 -769 330 -753 b 333 -708 330 -727 330 -717 b 344 -621 340 -678 344 -649 b 341 -579 344 -608 343 -593 b 328 -500 338 -553 328 -526 b 331 -475 328 -491 328 -484 b 347 -370 343 -438 348 -402 b 151 27 348 -212 288 -56 b 53 176 98 59 50 102 b 45 197 53 183 48 192 b 33 215 40 203 40 216 l 30 215 b 6 194 22 212 9 209 b 0 120 3 170 -1 145 b 0 -43 4 65 0 13 b 0 -98 0 -60 1 -79 b 4 -276 0 -157 6 -216 b 7 -456 4 -337 7 -397 b 66 -638 7 -523 22 -585 b 158 -724 94 -671 127 -697 b 318 -1011 246 -801 295 -899 b 321 -1044 321 -1021 321 -1032 b 312 -1152 321 -1080 312 -1116 b 317 -1192 312 -1165 314 -1179 b 323 -1223 320 -1202 311 -1220 z m 285 -376 b 121 -180 249 -289 173 -245 b 91 -105 104 -158 92 -135 b 288 -354 181 -144 288 -269 b 285 -376 288 -363 287 -370 z m 275 -657 b 111 -492 226 -589 163 -547 b 65 -376 78 -456 66 -418 b 71 -323 65 -360 68 -341 b 275 -657 164 -418 265 -504 z',\n },\n flag32ndDown: {\n x_min: -2.800802874905624,\n x_max: 268.09424409436605,\n y_min: -169.07698914551014,\n y_max: 829.4710740978672,\n ha: 998.5480632433773,\n o: 'm 323 1194 b 317 1164 311 1191 320 1174 b 312 1123 314 1151 312 1136 b 321 1015 312 1087 321 1051 b 318 982 321 1004 321 992 b 158 696 295 870 246 772 b 66 609 127 668 94 642 b 7 428 22 556 7 494 b 4 248 7 369 4 308 b -1 78 6 187 -10 137 b 0 14 0 59 0 32 l 0 -148 b 6 -223 0 -174 3 -199 b 30 -243 9 -238 22 -240 l 33 -243 b 45 -226 40 -245 40 -232 b 53 -204 48 -220 53 -212 b 151 -56 50 -131 98 -88 b 347 341 288 27 348 183 b 331 446 348 373 343 409 b 328 471 328 455 328 462 b 341 550 328 497 338 524 b 344 592 343 564 344 579 b 333 680 344 621 340 649 b 330 707 330 688 330 698 b 341 755 330 724 334 740 b 386 971 372 827 386 899 b 359 1155 387 1031 377 1093 b 351 1169 356 1159 354 1165 b 323 1194 344 1181 337 1198 z m 275 628 b 71 294 265 475 164 389 b 65 347 68 312 65 331 b 111 464 66 389 78 428 b 275 628 163 518 226 560 z m 285 347 b 288 325 287 341 288 334 b 91 76 288 240 181 115 b 121 151 92 107 104 130 b 285 347 173 216 249 261 z',\n },\n flag64thUp: {\n x_min: -4,\n x_max: 282,\n y_min: -823.5430338167067,\n y_max: 347,\n ha: 1170.5430338167066,\n o: 'm 350 -1185 b 380 -1162 364 -1189 374 -1175 b 406 -1022 399 -1119 406 -1071 b 359 -798 406 -945 384 -871 b 348 -756 353 -785 348 -772 b 350 -744 348 -753 350 -749 b 363 -621 356 -704 363 -664 b 360 -580 363 -608 363 -593 b 359 -560 359 -573 359 -567 b 373 -490 359 -536 366 -513 b 393 -346 386 -444 393 -395 b 387 -269 393 -320 390 -294 b 348 -127 382 -219 348 -173 b 351 -104 348 -120 348 -111 b 353 -65 351 -91 353 -78 b 341 37 353 -26 348 6 b 226 215 323 108 278 164 b 86 336 181 258 127 288 b 62 395 72 353 62 370 b 42 481 62 423 55 454 b 27 500 37 488 36 500 b 24 498 26 500 26 500 b -1 480 14 497 1 492 b -6 444 -4 467 -6 455 l -6 435 b -1 341 -1 403 -1 372 l -1 266 b 6 156 -1 230 0 193 b 13 35 12 117 13 75 l 13 -35 b 14 -85 13 -52 14 -68 b 29 -276 19 -150 33 -213 b 20 -448 24 -334 20 -392 b 24 -534 20 -477 22 -505 b 114 -708 30 -605 59 -664 b 197 -780 143 -732 171 -755 b 344 -1153 301 -884 341 -1011 b 343 -1172 344 -1159 343 -1166 b 350 -1185 343 -1176 344 -1182 z m 287 -88 b 62 193 186 -17 79 48 b 229 52 121 144 174 98 b 289 -33 256 29 274 -3 b 295 -56 294 -42 295 -49 b 287 -88 295 -66 292 -76 z m 298 -410 b 118 -235 238 -351 176 -295 b 76 -88 82 -197 78 -147 b 268 -252 137 -153 203 -202 b 330 -360 304 -279 330 -315 b 323 -402 330 -373 327 -387 b 311 -418 318 -413 315 -418 b 298 -410 307 -418 302 -415 z m 300 -691 b 117 -508 243 -616 168 -575 b 82 -408 94 -480 82 -448 b 84 -379 82 -397 82 -387 b 259 -553 135 -451 206 -492 b 301 -667 287 -583 301 -619 b 300 -691 301 -674 301 -683 z',\n },\n flag64thDown: {\n x_min: -5,\n x_max: 281,\n y_min: -375,\n y_max: 795.5430338167066,\n ha: 1170.5430338167066,\n o: 'm 348 1145 b 341 1132 343 1142 341 1136 b 343 1113 341 1126 343 1119 b 196 740 340 971 300 844 b 112 668 170 714 141 691 b 23 494 58 624 29 564 b 19 408 20 465 19 436 b 27 236 19 351 23 294 b 13 45 32 173 17 109 b 12 -6 13 27 12 12 l 12 -75 b 4 -196 12 -115 10 -157 b -3 -307 -1 -233 -3 -271 l -3 -382 b -7 -475 -3 -412 -3 -444 l -7 -484 b -3 -520 -7 -495 -6 -507 b 23 -539 0 -533 13 -537 b 26 -540 24 -540 24 -540 b 40 -521 35 -540 36 -528 b 60 -435 53 -494 60 -464 b 85 -376 60 -410 71 -393 b 225 -255 125 -328 180 -298 b 340 -78 276 -204 321 -148 b 351 24 347 -46 351 -14 b 350 63 351 37 350 50 b 347 86 347 71 347 79 b 386 229 347 132 380 179 b 392 305 389 253 392 279 b 372 449 392 354 384 403 b 357 520 364 472 357 495 b 359 540 357 527 357 533 b 361 580 361 553 361 567 b 348 704 361 624 354 664 b 347 716 348 708 347 713 b 357 757 347 732 351 744 b 405 982 383 831 405 904 b 379 1122 405 1031 397 1079 b 348 1145 373 1135 363 1149 z m 298 651 b 300 626 300 642 300 634 b 258 513 300 579 285 543 b 82 338 204 452 134 410 b 81 367 81 347 81 357 b 115 468 81 408 92 439 b 298 651 167 534 242 576 z m 297 370 b 310 377 301 374 305 377 b 321 361 314 377 317 373 b 328 320 325 347 328 333 b 266 212 328 275 302 239 b 75 48 202 161 135 112 b 117 194 76 107 81 157 b 297 370 174 255 236 311 z m 285 48 b 294 16 291 36 294 26 b 288 -7 294 9 292 1 b 228 -92 272 -37 255 -69 b 60 -233 173 -138 120 -184 b 285 48 78 -88 184 -23 z',\n },\n flag128thUp: {\n x_min: 0,\n x_max: 252,\n y_min: -804,\n y_max: 530,\n ha: 1334,\n o: 'm 298 -1158 b 328 -1126 312 -1158 320 -1139 b 330 -1116 330 -1123 330 -1119 b 347 -996 343 -1076 347 -1037 b 328 -837 347 -943 338 -890 b 320 -778 324 -816 320 -798 b 330 -733 320 -763 323 -749 b 340 -665 338 -714 337 -688 b 341 -645 340 -660 341 -652 b 333 -534 341 -609 333 -572 b 343 -471 333 -513 334 -492 b 361 -366 356 -436 361 -402 b 331 -202 361 -311 348 -256 b 328 -187 330 -197 328 -193 b 331 -179 328 -184 328 -181 b 363 -55 353 -137 363 -96 b 337 79 363 -12 351 33 b 327 114 333 92 327 104 b 344 144 327 124 331 132 b 359 174 353 150 357 163 b 361 228 360 193 361 210 b 243 517 361 337 325 435 b 147 596 213 546 179 569 b 75 708 111 626 75 655 b 62 744 75 723 68 733 b 50 763 58 752 58 763 b 46 762 49 763 48 762 b 17 742 36 757 22 757 b 0 697 14 726 0 711 b 1 595 0 662 3 631 b 0 469 0 552 0 511 b 1 429 0 456 0 442 b 22 289 6 382 22 337 b 24 128 22 238 24 184 b 22 66 24 108 23 86 b 19 -19 20 37 19 10 b 20 -132 19 -56 20 -95 b 13 -276 20 -180 19 -229 b 9 -359 10 -304 9 -330 b 12 -487 9 -402 12 -445 b 56 -582 12 -526 29 -554 b 197 -742 107 -632 160 -681 b 288 -1100 265 -851 276 -976 b 288 -1122 288 -1107 287 -1115 b 287 -1145 289 -1129 287 -1138 b 298 -1158 287 -1153 288 -1158 z m 304 150 b 75 475 229 256 112 334 b 304 150 233 357 305 287 z m 271 -73 b 127 72 233 -14 179 26 b 81 167 96 98 81 127 b 84 194 81 176 82 184 b 271 -73 148 102 242 39 z m 279 -396 b 132 -223 233 -330 180 -279 b 81 -112 104 -192 81 -156 b 82 -91 81 -105 81 -98 b 279 -396 167 -125 269 -281 z m 249 -609 b 69 -357 197 -520 88 -471 b 249 -609 131 -441 229 -498 z',\n },\n flag128thDown: {\n x_min: -0.8888888888888888,\n x_max: 252,\n y_min: -580,\n y_max: 754,\n ha: 1334,\n o: 'm 298 1086 b 287 1073 288 1086 287 1081 b 288 1050 287 1066 289 1057 b 288 1028 287 1043 288 1035 b 197 670 276 904 265 779 b 56 510 160 609 107 560 b 12 415 29 482 12 454 b 9 287 12 373 9 330 b 13 204 9 258 10 232 b 20 60 19 157 20 108 b 19 -53 20 23 19 -16 b 22 -138 19 -82 20 -109 b 24 -200 23 -158 24 -180 b 22 -361 24 -256 22 -310 b 1 -501 22 -409 6 -454 b 0 -541 0 -514 0 -528 b 0 -667 0 -583 -3 -624 b 0 -809 0 -675 -3 -791 b 46 -834 4 -825 36 -829 b 50 -835 48 -834 49 -835 b 62 -816 58 -835 58 -824 b 75 -780 68 -805 75 -795 b 147 -668 75 -727 111 -698 b 243 -589 179 -641 213 -618 b 361 -300 325 -507 361 -409 b 359 -246 361 -282 360 -265 b 344 -216 357 -235 353 -222 b 327 -186 331 -204 327 -196 b 337 -151 327 -176 333 -164 b 363 -17 351 -105 363 -60 b 331 107 363 24 353 65 b 328 115 328 109 328 112 b 331 130 328 121 330 125 b 361 294 348 184 361 239 b 343 399 361 330 356 364 b 333 462 334 420 333 441 b 341 573 333 500 341 537 b 340 593 341 580 340 588 b 330 661 337 616 338 642 b 320 706 323 677 320 691 b 328 765 320 726 324 744 b 347 924 338 818 347 871 b 330 1044 347 965 343 1004 b 328 1054 330 1047 330 1051 b 298 1086 320 1067 312 1086 z m 249 537 b 69 285 229 426 131 369 b 249 537 88 399 197 448 z m 279 324 b 82 19 269 209 167 53 b 81 40 81 26 81 33 b 132 151 81 84 104 120 b 279 324 180 207 233 258 z m 271 1 b 84 -266 242 -111 148 -174 b 81 -239 82 -256 81 -248 b 127 -144 81 -199 96 -170 b 271 1 179 -98 233 -58 z m 304 -222 b 75 -547 305 -359 233 -429 b 304 -222 112 -406 229 -328 z',\n },\n accidentalFlat: {\n x_min: 1,\n x_max: 209,\n y_min: -208,\n y_max: 472,\n ha: 680,\n o: 'm 29 -300 b 46 -289 33 -300 39 -297 b 107 -243 65 -274 86 -258 b 301 127 233 -153 301 -30 b 298 186 301 147 301 166 b 190 297 291 256 251 297 b 147 289 177 297 163 294 b 86 265 127 284 107 274 l 85 264 l 85 301 b 91 465 85 356 88 410 b 94 559 91 497 94 527 b 84 651 94 589 91 621 b 66 680 81 661 81 680 l 65 680 b 37 645 49 678 37 665 b 33 523 36 605 32 563 l 33 478 b 26 223 33 393 29 308 b 1 -141 22 101 1 -19 b 17 -287 1 -189 4 -239 b 29 -300 20 -295 23 -300 z m 68 -105 b 76 12 71 -68 72 -29 b 81 107 79 43 81 75 l 86 109 b 171 135 114 121 141 135 b 204 128 181 135 193 132 b 238 92 228 120 239 108 b 230 63 238 84 236 75 b 68 -105 193 -10 132 -59 z',\n },\n accidentalNatural: {\n x_min: 0,\n x_max: 213.5,\n y_min: -456,\n y_max: 462,\n ha: 918,\n o: 'm 255 -657 b 281 -624 271 -657 275 -636 b 285 -599 282 -615 285 -608 b 292 -300 288 -500 289 -400 b 289 -161 292 -253 289 -207 b 300 128 292 -65 297 32 b 304 168 300 128 302 150 l 304 173 l 305 190 l 305 199 l 307 225 b 304 259 307 229 310 246 b 272 298 297 274 302 305 b 63 266 204 279 134 272 b 72 514 68 348 72 432 b 71 595 72 541 72 567 b 56 665 71 619 66 642 b 17 579 9 651 17 608 b 3 144 19 433 7 289 b 0 -7 1 94 0 43 b 3 -134 0 -50 1 -92 b 7 -219 3 -163 7 -192 b 35 -251 7 -243 17 -251 b 49 -249 39 -251 43 -251 l 223 -223 l 230 -222 l 230 -359 b 223 -516 230 -410 223 -464 b 236 -619 223 -550 226 -585 b 255 -657 240 -634 236 -657 z m 58 -63 b 55 81 56 -14 53 33 l 56 99 b 85 99 65 99 75 98 b 232 108 134 104 183 107 l 240 109 l 236 66 b 232 -48 235 29 232 -10 b 58 -81 174 -63 115 -73 z',\n },\n accidentalSharp: {\n x_min: -22,\n x_max: 390,\n y_min: -384,\n y_max: 383,\n ha: 767,\n o: 'm 202 -553 b 219 -526 213 -552 216 -536 b 226 -471 225 -507 226 -488 b 225 -425 226 -455 225 -441 b 226 -392 225 -415 225 -402 b 233 -305 229 -363 232 -334 l 297 -292 b 331 -469 300 -353 311 -412 b 347 -485 333 -477 338 -485 b 363 -469 356 -487 359 -477 b 374 -418 373 -454 374 -435 b 376 -382 376 -405 376 -393 b 372 -276 376 -347 373 -311 l 455 -259 b 550 -156 534 -243 544 -232 b 550 -109 550 -137 552 -124 b 526 -78 549 -91 541 -78 l 523 -78 b 507 -79 517 -78 513 -78 b 403 -101 474 -88 438 -95 l 379 -105 b 382 -42 380 -85 380 -63 b 384 96 383 4 384 50 b 503 131 425 107 464 118 b 549 173 524 138 543 150 b 562 249 554 199 562 223 b 554 294 562 264 560 279 b 536 315 549 308 544 315 l 533 315 b 517 312 528 315 523 315 b 382 266 472 294 428 279 l 377 344 b 359 531 374 406 372 469 b 348 552 356 539 357 552 l 347 552 l 343 552 b 315 528 331 549 317 544 l 315 501 b 320 249 315 416 318 333 l 243 232 b 239 361 243 275 242 318 b 226 425 238 383 238 403 b 199 359 194 409 199 382 b 193 223 196 312 194 268 b 72 202 153 215 112 209 b 4 118 13 192 4 183 b 10 66 0 102 12 84 b 33 29 7 39 14 30 b 48 32 37 29 42 30 b 187 55 95 39 141 46 l 183 -75 b 176 -145 181 -99 179 -122 b 16 -179 122 -156 69 -166 b -32 -232 -14 -186 -32 -197 b -17 -331 -32 -266 -19 -298 b -1 -356 -17 -347 -13 -354 b 12 -353 1 -356 6 -354 b 167 -320 63 -341 115 -331 b 166 -377 166 -338 166 -357 b 189 -526 166 -428 171 -477 b 202 -553 192 -536 189 -553 z m 240 -132 b 243 -37 242 -101 242 -69 b 245 65 245 -3 245 30 b 315 79 269 69 292 73 b 301 -120 308 13 305 -53 z',\n },\n accidentalDoubleSharp: {\n x_min: 0,\n x_max: 287,\n y_min: -159,\n y_max: 159,\n ha: 318,\n o: 'm 84 -229 b 107 -216 91 -229 98 -225 b 200 -125 138 -186 167 -154 b 232 -95 212 -115 222 -105 b 347 -189 271 -125 310 -157 b 370 -200 356 -196 363 -200 b 396 -179 380 -200 389 -192 b 412 -102 410 -154 406 -125 b 377 -27 410 -69 400 -46 l 325 14 b 402 91 350 42 374 68 b 413 127 410 96 413 107 b 382 200 409 148 397 176 b 350 229 370 220 360 229 b 314 210 340 229 328 223 b 274 174 300 199 285 187 b 212 104 252 151 232 128 b 92 187 173 132 132 161 b 78 193 86 192 82 193 b 68 190 75 193 72 193 b 48 179 62 186 53 187 b 40 137 43 168 40 154 b 81 16 40 92 56 32 b 107 -3 89 10 98 4 b 14 -94 76 -32 45 -62 b 0 -124 6 -102 0 -114 b 12 -154 0 -134 3 -144 b 62 -215 26 -176 48 -193 b 84 -229 69 -225 76 -229 z',\n },\n accidentalDoubleFlat: {\n x_min: 0,\n x_max: 359,\n y_min: -220,\n y_max: 446,\n ha: 666,\n o: 'm 43 -317 b 72 -301 55 -317 63 -310 b 160 -186 108 -268 134 -226 b 236 -60 186 -145 212 -102 b 233 -131 235 -85 233 -108 b 239 -220 233 -161 235 -190 b 259 -246 240 -233 239 -240 b 301 -228 284 -252 291 -238 b 465 -7 369 -163 416 -85 b 517 173 500 48 517 108 b 451 307 517 229 505 284 b 409 315 436 312 422 315 b 331 287 382 315 356 305 b 311 274 324 282 320 274 l 310 274 l 310 566 b 305 621 310 585 312 603 b 294 642 301 628 305 642 l 292 642 b 264 622 282 641 266 636 b 253 575 259 606 256 590 b 246 418 248 523 246 471 b 248 243 246 360 248 302 l 248 187 b 164 238 220 225 193 238 b 85 213 140 238 112 226 b 84 229 85 220 84 225 b 86 315 85 258 86 287 b 81 528 86 386 82 458 b 71 582 81 547 78 566 b 56 603 66 590 68 603 l 53 603 b 23 580 40 600 26 598 b 19 537 20 566 19 552 b 20 514 19 530 19 521 b 26 390 24 472 26 432 b 14 66 26 282 16 174 b 0 -168 13 -12 0 -91 b 12 -279 0 -206 3 -242 b 30 -314 16 -294 14 -308 b 43 -317 35 -317 39 -317 z m 301 -72 b 302 7 302 -45 302 -19 l 302 86 b 351 158 304 121 321 145 b 383 166 361 163 373 166 b 435 143 402 166 419 157 b 445 127 441 138 445 132 b 441 114 445 122 444 118 b 301 -72 397 49 354 -14 z m 75 -147 b 73 30 75 -86 75 -29 b 118 82 73 62 92 76 b 132 84 124 84 128 84 b 190 52 156 84 174 69 b 193 40 192 49 193 45 b 192 33 193 37 193 35 b 75 -147 157 -30 125 -95 z',\n },\n accidentalParensLeft: {\n x_min: 0,\n x_max: 130.18934911242604,\n y_min: -270,\n y_max: 267.6082500723851,\n ha: 537.6082500723851,\n o: 'm 107 -389 b 127 -374 114 -389 120 -384 b 141 -347 132 -367 137 -357 b 151 -294 148 -330 151 -311 b 122 -207 151 -265 141 -236 b 63 -65 94 -164 72 -117 b 59 -10 60 -46 59 -27 b 145 223 59 78 94 153 b 187 354 176 262 189 305 b 177 384 187 364 190 380 b 143 373 166 387 153 383 b 124 354 137 367 130 361 b 0 -35 33 240 0 108 l 0 -92 b 85 -372 4 -193 27 -287 b 107 -389 92 -383 99 -389 z',\n },\n accidentalParensRight: {\n x_min: -0.4444444444444445,\n x_max: 139,\n y_min: -275,\n y_max: 277,\n ha: 552,\n o: 'm 58 -396 b 96 -354 75 -396 85 -370 b 200 13 168 -238 200 -111 b 153 268 200 109 184 190 b 49 392 131 320 101 364 b 26 399 40 397 33 399 b 0 366 10 399 0 387 b 0 318 -1 350 0 334 l 0 291 b 27 238 -3 266 7 253 b 143 9 105 180 143 98 b 141 -20 143 -1 143 -10 b 63 -225 135 -92 108 -164 b 36 -307 45 -251 36 -278 b 40 -344 36 -320 37 -331 b 42 -356 42 -347 42 -351 b 58 -396 42 -374 37 -396 z',\n },\n accidentalQuarterToneFlatStein: {\n x_min: 0,\n x_max: 208,\n y_min: -240,\n y_max: 440,\n ha: 680,\n o: 'm 272 -346 b 284 -333 278 -346 281 -341 b 300 -187 297 -285 300 -235 b 275 177 300 -65 279 55 b 268 432 272 262 268 347 l 268 477 b 264 599 269 517 265 559 b 236 634 264 619 252 632 l 235 634 b 217 605 220 634 220 615 b 207 513 210 575 207 543 b 210 419 207 481 210 451 b 216 255 213 364 216 310 l 216 217 l 215 219 b 154 243 194 228 174 238 b 111 251 138 248 124 251 b 3 140 50 251 10 210 b 0 81 0 120 0 101 b 194 -289 0 -76 68 -199 b 255 -336 215 -304 236 -320 b 272 -346 262 -343 268 -346 z m 233 -151 b 71 17 168 -105 108 -56 b 63 46 65 29 63 37 b 96 82 62 62 73 73 b 130 89 108 86 120 89 b 215 63 160 89 187 75 l 220 60 b 225 -35 220 29 222 -3 b 233 -151 229 -75 230 -114 z',\n },\n accidentalThreeQuarterTonesFlatZimmermann: {\n x_min: 0,\n x_max: 422,\n y_min: -240,\n y_max: 440,\n ha: 680,\n o: 'm 272 -346 b 284 -333 278 -346 281 -341 b 300 -187 297 -285 300 -235 b 275 177 300 -65 279 55 b 268 432 272 262 268 347 l 268 477 b 264 599 269 517 265 559 b 236 634 264 619 252 632 l 235 634 b 217 605 220 634 220 615 b 207 513 210 575 207 543 b 210 419 207 481 210 451 b 216 255 213 364 216 310 l 216 217 l 215 219 b 154 243 194 228 174 238 b 111 251 138 248 124 251 b 3 140 50 251 10 210 b 0 81 0 120 0 101 b 194 -289 0 -76 68 -199 b 255 -336 215 -304 236 -320 b 272 -346 262 -343 268 -346 z m 336 -346 b 353 -336 340 -346 346 -343 b 413 -289 372 -320 393 -304 b 608 81 540 -199 608 -76 b 605 140 608 101 608 120 b 497 251 598 210 557 251 b 454 243 484 251 469 248 b 393 219 433 238 413 228 l 392 217 l 392 255 b 397 419 392 310 395 364 b 400 513 397 451 400 481 b 390 605 400 543 397 575 b 373 634 387 615 387 634 l 372 634 b 344 599 356 632 344 619 b 340 477 343 559 338 517 l 340 432 b 333 177 340 347 336 262 b 308 -187 328 55 308 -65 b 324 -333 308 -235 311 -285 b 336 -346 327 -341 330 -346 z m 233 -151 b 71 17 168 -105 108 -56 b 63 46 65 29 63 37 b 96 82 62 62 73 73 b 130 89 108 86 120 89 b 215 63 160 89 187 75 l 220 60 b 225 -35 220 29 222 -3 b 233 -151 229 -75 230 -114 z m 374 -151 b 383 -35 377 -114 379 -75 b 387 60 386 -3 387 29 l 393 63 b 478 89 420 75 448 89 b 511 82 488 89 500 86 b 544 46 534 73 546 62 b 537 17 544 37 543 29 b 374 -151 500 -56 439 -105 z',\n },\n accidentalQuarterToneSharpStein: {\n x_min: 0,\n x_max: 300,\n y_min: -338,\n y_max: 351,\n ha: 689,\n o: 'm 194 -487 b 225 -432 215 -469 223 -452 b 238 -232 229 -366 236 -298 b 377 -199 285 -220 331 -209 b 418 -164 397 -193 410 -181 b 432 -88 428 -138 432 -114 b 412 -42 432 -55 428 -42 b 389 -46 406 -42 399 -43 l 235 -85 b 233 -20 235 -63 233 -42 b 233 105 232 22 233 63 b 312 121 259 111 285 117 b 406 226 390 134 400 145 b 373 284 409 268 402 284 b 344 281 364 284 356 282 b 232 258 307 276 269 266 b 230 308 232 275 232 291 b 210 505 229 374 232 441 b 183 471 189 501 184 490 b 180 406 181 449 180 428 b 184 246 180 353 184 300 b 48 222 140 236 94 228 b 0 168 6 216 0 209 b 7 86 1 141 4 114 b 27 66 9 73 13 66 l 35 66 b 184 94 85 66 135 84 b 187 -1 184 62 186 30 b 190 -96 189 -33 190 -65 l 112 -114 b 35 -213 27 -132 35 -132 b 33 -253 35 -226 35 -240 b 49 -276 33 -269 37 -276 b 62 -275 52 -276 56 -276 l 186 -245 l 186 -256 b 179 -387 180 -300 177 -343 b 194 -487 180 -419 179 -454 z',\n },\n accidentalThreeQuarterTonesSharpStein: {\n x_min: -23,\n x_max: 388,\n y_min: -373,\n y_max: 445,\n ha: 818,\n o: 'm 114 -537 b 138 -475 137 -518 138 -495 b 147 -292 138 -413 144 -353 b 212 -278 168 -287 190 -282 b 243 -444 215 -333 225 -389 b 261 -467 248 -454 251 -465 b 281 -446 272 -469 276 -455 b 292 -347 292 -416 288 -384 b 288 -262 289 -320 288 -291 l 374 -245 b 376 -311 374 -266 374 -288 b 390 -456 379 -357 379 -405 b 416 -396 412 -436 415 -418 b 423 -287 420 -360 423 -323 b 422 -235 423 -269 423 -252 b 451 -229 432 -233 441 -232 b 547 -98 524 -215 547 -199 l 547 -89 b 521 -49 546 -59 540 -49 b 497 -52 516 -49 507 -49 b 418 -68 469 -56 444 -63 b 423 52 419 -29 422 12 b 426 140 425 81 425 109 b 495 160 449 145 472 153 b 552 219 526 170 546 189 b 559 279 557 240 553 262 b 530 341 559 324 552 341 b 490 331 520 341 507 338 b 432 311 471 324 452 318 b 449 552 436 392 442 471 b 452 588 451 563 452 575 b 446 622 452 599 451 611 b 436 641 444 629 448 641 b 418 628 428 641 420 636 b 409 602 413 621 410 611 b 386 297 396 501 390 399 b 297 274 356 288 327 281 b 291 403 295 317 294 360 b 274 550 288 452 284 501 b 259 569 271 564 265 569 b 240 559 253 569 248 563 b 230 537 232 554 230 546 l 230 488 b 233 369 230 448 232 409 b 236 261 236 333 238 297 b 156 245 210 255 183 251 b 154 396 154 295 154 346 b 150 416 154 403 153 410 b 140 438 145 423 150 438 l 138 438 b 118 413 128 436 118 428 b 112 354 118 393 114 374 b 109 238 109 315 109 276 b 49 226 89 233 69 230 b 3 163 16 222 3 202 b 7 91 3 138 9 114 b 29 62 7 69 13 62 b 39 63 32 62 35 63 b 104 73 60 66 82 71 b 101 -10 104 46 102 17 l 92 -132 l 10 -150 b -33 -204 -19 -157 -33 -170 b -19 -310 -32 -240 -19 -274 b -6 -324 -19 -321 -13 -324 b 6 -323 -1 -324 1 -324 b 82 -307 32 -317 58 -311 b 81 -376 82 -330 81 -353 b 114 -537 81 -431 94 -484 z m 294 -92 b 297 -37 295 -73 295 -56 b 300 49 300 -9 300 20 l 300 108 b 379 127 325 114 353 120 b 374 -76 376 59 374 -9 b 294 -92 347 -82 320 -86 z m 154 -120 b 157 20 154 -73 156 -26 b 158 82 158 40 158 62 b 230 95 183 86 206 89 b 225 0 229 63 226 32 b 217 -107 223 -35 220 -71 z',\n },\n accidentalBuyukMucennebFlat: {\n x_min: 1.8692317181955784,\n x_max: 287,\n y_min: -248,\n y_max: 432.4720949426819,\n ha: 680.4720949426819,\n o: 'm 410 128 b 302 239 403 199 363 239 b 259 232 289 239 275 236 b 199 207 239 226 219 216 l 197 206 l 197 243 l 197 251 b 347 317 248 272 298 295 b 376 347 360 324 372 334 b 389 435 387 376 393 405 b 348 454 384 462 377 465 b 202 387 300 432 251 409 b 203 408 203 395 203 402 l 203 431 b 347 490 252 451 300 469 b 376 517 360 495 372 505 b 389 599 387 546 393 572 b 348 616 384 625 377 628 l 203 556 b 196 593 202 569 199 582 b 179 622 193 603 193 622 l 177 622 b 150 588 161 621 150 608 b 147 533 150 570 148 552 b 29 488 108 517 69 503 b 3 455 12 482 3 472 b 12 353 1 422 9 389 b 145 408 56 372 101 389 b 145 363 145 392 145 377 l 29 315 b 3 281 12 310 3 298 b 12 170 1 245 9 209 l 141 226 b 138 166 140 206 138 186 b 114 -199 134 43 115 -76 b 130 -344 114 -246 117 -297 b 141 -357 132 -353 135 -357 b 158 -347 145 -357 151 -354 b 219 -301 177 -331 199 -315 b 413 69 346 -210 413 -88 b 410 128 413 89 413 108 z m 350 35 b 343 6 350 26 348 17 b 180 -163 308 -69 245 -117 b 189 -46 183 -125 184 -86 b 193 49 192 -14 193 17 l 199 52 b 284 78 226 63 253 78 b 317 71 294 78 305 75 b 350 35 340 62 351 50 z',\n },\n accidentalBakiyeFlat: {\n x_min: 1.8692317181955784,\n x_max: 287,\n y_min: -236,\n y_max: 444,\n ha: 680,\n o: 'm 141 -340 b 158 -330 145 -340 151 -337 b 219 -284 177 -314 199 -298 b 413 86 346 -193 413 -71 b 410 145 413 107 413 125 b 302 256 403 216 363 256 b 259 249 289 256 275 253 b 199 225 239 243 219 233 l 197 223 l 197 261 b 199 334 197 285 199 310 b 347 406 249 357 298 382 b 376 439 360 413 372 425 b 390 516 384 465 390 490 b 389 537 390 523 390 530 b 372 564 384 556 382 564 b 348 557 367 564 359 562 b 204 487 300 537 253 510 b 206 518 206 497 206 507 b 196 611 206 549 203 580 b 179 639 193 621 193 639 l 177 639 b 150 605 161 638 150 625 b 145 482 148 564 144 523 l 145 458 b 29 405 107 439 68 420 b 3 366 12 397 3 386 b 12 243 1 325 9 287 b 143 307 56 265 99 285 l 138 183 b 114 -181 134 60 114 -59 b 130 -327 114 -229 117 -279 b 141 -340 132 -336 135 -340 z m 180 -145 b 189 -29 183 -108 184 -69 b 193 66 192 3 193 35 l 199 69 b 284 95 226 81 253 95 b 317 88 294 95 305 92 b 350 52 340 79 351 68 b 343 23 350 43 348 35 b 180 -145 305 -50 245 -99 z',\n },\n accidentalKomaSharp: {\n x_min: 0,\n x_max: 300,\n y_min: -338,\n y_max: 351,\n ha: 689,\n o: 'm 194 -487 b 225 -432 215 -469 223 -452 b 238 -232 229 -366 236 -298 b 377 -199 285 -220 331 -209 b 418 -164 397 -193 410 -181 b 432 -88 428 -138 432 -114 b 412 -42 432 -55 428 -42 b 389 -46 406 -42 399 -43 l 235 -85 b 233 -20 235 -63 233 -42 b 233 105 232 22 233 63 b 312 121 259 111 285 117 b 406 226 390 134 400 145 b 373 284 409 268 402 284 b 344 281 364 284 356 282 b 232 258 307 276 269 266 b 230 308 232 275 232 291 b 210 505 229 374 232 441 b 183 471 189 501 184 490 b 180 406 181 449 180 428 b 184 246 180 353 184 300 b 48 222 140 236 94 228 b 0 168 6 216 0 209 b 7 86 1 141 4 114 b 27 66 9 73 13 66 l 35 66 b 184 94 85 66 135 84 b 187 -1 184 62 186 30 b 190 -96 189 -33 190 -65 l 112 -114 b 35 -213 27 -132 35 -132 b 33 -253 35 -226 35 -240 b 49 -276 33 -269 37 -276 b 62 -275 52 -276 56 -276 l 186 -245 l 186 -256 b 179 -387 180 -300 177 -343 b 194 -487 180 -419 179 -454 z',\n },\n accidentalKucukMucennebSharp: {\n x_min: -0.15206251809627475,\n x_max: 359,\n y_min: -420,\n y_max: 343,\n ha: 763,\n o: 'm 236 -605 b 262 -543 256 -583 261 -564 b 269 -423 268 -503 269 -464 b 266 -340 269 -396 268 -367 l 361 -318 b 405 -276 384 -312 399 -298 b 413 -189 412 -248 416 -219 b 395 -164 412 -171 409 -164 b 382 -166 392 -164 387 -164 b 264 -193 343 -176 304 -184 b 269 -102 265 -163 268 -132 b 454 -62 331 -89 392 -78 b 501 -23 477 -58 494 -45 b 517 62 511 6 517 33 b 487 112 517 95 513 112 b 471 111 482 112 477 112 b 274 66 406 95 340 81 b 276 138 275 91 276 114 b 350 154 301 144 325 148 b 402 203 377 160 396 176 b 412 284 408 230 412 258 b 392 311 412 302 406 311 b 372 308 386 311 379 310 b 287 291 343 301 314 297 l 295 405 b 298 441 297 416 298 428 b 292 475 298 452 297 464 b 282 494 289 482 294 494 b 264 481 274 494 266 490 b 255 455 259 474 256 464 b 239 282 248 397 243 340 b 148 268 209 278 179 274 b 62 164 62 252 62 253 l 62 132 b 79 108 60 117 65 108 l 86 108 l 230 130 b 229 92 230 118 229 105 b 228 56 228 79 228 68 b 66 20 173 43 120 32 b 0 -59 6 7 3 1 l 0 -138 b 14 -160 -1 -156 4 -160 b 27 -158 19 -160 23 -160 b 222 -112 92 -141 157 -127 b 220 -203 220 -143 220 -173 b 147 -217 196 -207 171 -213 b 89 -288 92 -228 89 -229 b 95 -347 85 -305 96 -325 b 112 -374 92 -366 98 -374 b 125 -373 117 -374 121 -374 l 220 -351 b 222 -458 220 -386 220 -422 b 236 -605 223 -504 225 -552 z',\n },\n accidentalKoron: {\n x_min: 0,\n x_max: 303,\n y_min: -462.4598053473055,\n y_max: 180,\n ha: 642.4598053473055,\n o: 'm 59 -665 b 72 -649 69 -662 72 -657 b 69 -626 72 -642 69 -634 b 69 -622 69 -625 69 -624 l 69 -600 b 55 -156 60 -456 68 -311 b 86 -170 66 -166 76 -170 b 112 -163 95 -170 104 -166 b 390 -35 204 -120 298 -78 b 436 -1 409 -27 436 -27 b 396 46 436 22 413 33 l 382 55 b 46 243 271 121 157 179 b 12 259 29 253 17 259 b 0 219 1 259 0 248 b 3 -372 0 22 3 -176 b 6 -616 3 -454 6 -536 b 59 -665 6 -638 40 -671 z m 55 199 b 363 24 156 141 258 84 b 55 -118 259 -24 160 -69 z',\n },\n accidentalSori: {\n x_min: 0,\n x_max: 434,\n y_min: -295,\n y_max: 325,\n ha: 620,\n o: 'm 194 -425 b 196 -409 194 -418 196 -413 b 194 -194 196 -337 196 -266 b 364 -127 251 -171 308 -150 b 361 -321 363 -192 364 -256 b 410 -387 360 -357 373 -377 b 413 -373 412 -382 413 -377 b 418 -114 418 -287 418 -200 l 418 -105 b 595 -35 477 -82 536 -59 b 625 0 612 -27 625 -22 b 593 48 624 23 618 39 l 419 117 b 423 370 419 202 423 285 b 426 403 423 382 426 393 b 418 436 426 415 425 426 b 384 468 409 449 399 468 b 369 448 370 468 369 459 b 369 436 369 444 369 441 l 369 428 l 369 423 b 367 138 369 328 367 233 l 353 143 l 192 207 l 192 367 b 173 406 192 383 184 396 b 151 422 167 413 160 422 b 144 420 148 422 147 422 b 137 403 138 416 137 410 l 137 392 l 137 229 b 33 271 102 243 68 256 b 13 276 26 274 19 276 b 0 262 6 276 0 272 b 35 199 1 239 0 212 l 138 160 b 140 -148 138 58 138 -45 b 56 -181 111 -158 84 -170 b 24 -215 35 -189 24 -199 b 29 -235 24 -220 26 -228 b 49 -253 35 -249 42 -253 b 78 -240 59 -253 69 -243 b 140 -216 98 -233 120 -225 l 140 -356 b 194 -425 140 -406 141 -406 z m 194 -125 b 193 138 194 -37 193 50 b 315 89 233 122 275 107 b 366 71 333 84 350 76 b 364 -58 366 27 366 -16 b 194 -125 308 -81 251 -104 z m 419 49 l 526 7 l 485 -10 l 419 -36 z',\n },\n articAccentAbove: {\n x_min: 0,\n x_max: 425,\n y_min: 0,\n y_max: 326,\n ha: 326,\n o: 'm 27 1 b 78 12 46 0 62 6 b 347 112 168 45 253 91 b 521 184 409 128 459 167 b 608 259 557 194 589 220 b 612 274 611 265 612 271 b 598 292 612 281 608 287 b 477 347 559 312 518 331 b 176 465 374 384 275 425 b 156 469 168 468 161 469 b 125 456 145 469 137 465 b 53 370 96 432 78 399 b 45 353 48 363 45 357 b 68 333 45 344 52 337 b 360 225 166 298 262 261 b 192 154 302 203 249 171 b 13 36 120 132 53 105 b 0 13 9 29 0 22 l 0 9 b 16 0 3 1 10 0 l 26 0 b 27 1 27 0 27 0 z',\n },\n articAccentBelow: {\n x_min: 0,\n x_max: 425,\n y_min: -326,\n y_max: 0,\n ha: 326,\n o: 'm 26 -469 l 27 -469 b 78 -458 46 -469 62 -464 b 347 -357 168 -426 253 -380 b 521 -285 409 -341 459 -302 b 608 -210 557 -276 589 -249 b 612 -196 611 -204 612 -200 b 598 -179 612 -189 608 -183 b 477 -122 559 -157 518 -138 b 176 -4 374 -85 275 -45 b 156 0 168 -1 161 0 b 125 -13 145 0 137 -4 b 53 -99 96 -37 78 -71 b 45 -117 48 -107 45 -112 b 68 -137 45 -125 52 -132 b 360 -245 166 -171 262 -209 b 192 -315 302 -266 249 -300 b 13 -433 120 -337 53 -366 b 0 -456 9 -442 0 -448 l 0 -461 b 16 -469 3 -468 10 -469 z',\n },\n articTenutoAbove: {\n x_min: 0.35192668236256364,\n x_max: 471.1238660564107,\n y_min: 0,\n y_max: 56,\n ha: 56,\n o: 'm 137 0 b 197 1 156 0 179 1 b 409 6 268 1 338 6 b 482 4 432 6 459 6 b 556 0 508 3 534 0 b 651 10 588 0 621 3 b 678 27 662 12 678 10 b 654 59 680 45 672 53 b 511 75 606 73 560 73 b 255 81 426 78 341 81 b 160 79 222 81 193 79 l 36 79 b 1 71 24 78 7 85 b 19 32 -3 56 9 43 b 45 16 26 24 36 20 b 137 0 76 3 108 0 z',\n },\n articTenutoBelow: {\n x_min: 0.35192668236256364,\n x_max: 471.1238660564107,\n y_min: -59,\n y_max: -3,\n ha: 56,\n o: 'm 137 -85 b 197 -84 156 -85 179 -84 b 409 -79 268 -84 338 -79 b 482 -81 432 -79 459 -79 b 556 -85 508 -82 534 -85 b 651 -75 588 -85 621 -82 b 678 -58 662 -73 678 -75 b 654 -26 680 -40 672 -32 b 511 -10 606 -12 560 -12 b 255 -4 426 -7 341 -4 b 160 -6 222 -4 193 -6 l 36 -6 b 1 -14 24 -7 7 0 b 19 -53 -3 -29 9 -42 b 45 -69 26 -60 36 -65 b 137 -85 76 -82 108 -85 z',\n },\n articStaccatoAbove: {\n x_min: 1.4151102965496913,\n x_max: 112,\n y_min: 0,\n y_max: 156,\n ha: 156,\n o: 'm 98 0 b 132 23 109 0 122 7 b 161 112 150 50 161 79 b 158 148 161 124 161 137 b 125 186 154 167 131 167 b 63 225 117 215 85 216 b 23 197 45 222 30 219 b 3 91 12 163 12 127 b 19 66 0 79 4 69 b 65 27 40 62 53 46 b 98 0 76 9 88 0 z',\n },\n articStaccatoBelow: {\n x_min: 1.4151102965496913,\n x_max: 112.08403222864916,\n y_min: -156,\n y_max: 0,\n ha: 156,\n o: 'm 132 -202 b 161 -112 151 -174 163 -145 b 158 -76 161 -101 161 -88 b 125 -39 153 -58 131 -58 b 63 0 115 -10 85 -9 b 23 -27 45 -3 30 -6 b 3 -134 12 -62 10 -98 b 19 -158 0 -145 4 -156 b 65 -197 40 -164 53 -179 b 98 -225 75 -216 88 -225 b 132 -202 109 -225 122 -217 z',\n },\n articStaccatissimoAbove: {\n x_min: 0,\n x_max: 139,\n y_min: 0,\n y_max: 411,\n ha: 411,\n o: 'm 104 0 b 144 115 143 29 138 75 b 197 423 158 217 180 320 b 200 454 199 433 200 444 b 181 540 200 482 193 513 b 112 592 167 573 141 592 b 55 567 92 592 72 585 b 0 490 32 546 3 527 l 0 484 b 27 279 14 416 14 347 b 84 20 43 193 52 104 b 96 0 86 13 92 6 z',\n },\n articStaccatissimoBelow: {\n x_min: 0,\n x_max: 139,\n y_min: -411,\n y_max: 0,\n ha: 411,\n o: 'm 88 -592 b 145 -567 108 -592 128 -585 b 200 -490 168 -546 197 -527 l 200 -484 b 173 -279 186 -416 186 -347 b 117 -20 157 -193 148 -104 b 104 0 114 -13 108 -6 l 96 0 b 56 -115 58 -29 62 -75 b 3 -423 42 -217 20 -320 b 0 -454 1 -433 0 -444 b 19 -540 0 -482 7 -513 b 88 -592 33 -573 59 -592 z',\n },\n articMarcatoAbove: {\n x_min: 0.04121419527862119,\n x_max: 396,\n y_min: 0,\n y_max: 328.0000000000001,\n ha: 328.0000000000001,\n o: 'm 477 0 b 510 13 488 0 500 6 b 570 124 546 40 563 81 b 547 183 570 147 560 166 b 356 422 487 265 405 330 b 346 442 354 429 350 436 l 346 444 b 318 465 340 456 330 464 l 312 469 b 274 449 294 480 284 461 b 242 413 262 438 253 425 b 56 196 177 343 112 274 b 1 56 26 154 13 105 b 27 20 -4 35 9 20 b 42 23 32 20 37 20 b 84 53 59 29 72 39 b 255 269 141 125 193 200 b 275 229 262 255 266 242 b 448 14 324 151 390 86 b 477 0 456 4 467 0 z',\n },\n articMarcatoBelow: {\n x_min: 0,\n x_max: 395.9587858047214,\n y_min: -328.0000000000001,\n y_max: 0,\n ha: 328.0000000000001,\n o: 'm 258 -469 b 297 -449 276 -480 287 -461 b 328 -413 308 -438 317 -425 b 514 -196 393 -343 458 -274 b 569 -56 544 -154 557 -105 b 543 -20 575 -35 562 -20 b 528 -23 539 -20 533 -20 b 487 -53 511 -29 498 -39 b 315 -269 429 -125 377 -200 b 295 -229 308 -255 304 -242 b 122 -14 246 -151 180 -86 b 94 0 114 -4 104 0 b 60 -13 82 0 71 -6 b 0 -124 24 -40 7 -81 b 23 -183 0 -147 10 -166 b 215 -422 84 -265 166 -330 b 225 -442 216 -429 220 -436 l 225 -444 b 252 -465 230 -456 240 -464 z',\n },\n fermataAbove: {\n x_min: -0.04550444040404433,\n x_max: 472,\n y_min: 2.015071727506986,\n y_max: 454,\n ha: 451.984928272493,\n o: 'm 39 10 b 78 108 66 37 71 73 b 163 311 92 181 111 252 b 284 423 199 353 239 392 b 373 458 312 444 340 454 b 433 431 395 458 410 446 b 603 153 530 361 596 276 b 595 121 603 144 595 131 l 595 88 b 602 50 596 75 589 55 b 639 73 619 43 631 60 b 651 102 645 82 648 92 b 667 194 660 132 662 163 b 680 278 671 222 672 248 b 560 567 680 386 638 481 b 396 654 508 625 452 649 b 291 632 364 654 325 644 b 161 526 235 613 200 566 b 4 249 85 446 26 357 b 4 174 0 222 -3 196 b 10 19 4 124 4 69 b 29 4 12 6 16 0 b 39 10 35 4 33 4 z m 338 37 b 370 40 350 36 357 36 b 380 75 387 40 380 43 b 389 94 382 79 382 85 b 356 132 389 111 374 122 b 269 154 328 147 300 156 b 225 125 252 154 228 157 b 261 48 222 81 232 56 b 338 37 287 40 312 40 z',\n },\n fermataBelow: {\n x_min: -0.310835055998654,\n x_max: 518.570567335755,\n y_min: -430,\n y_max: -0.9161449836506543,\n ha: 429.08385501634933,\n o: 'm 344 -615 b 500 -543 402 -602 452 -576 b 713 -253 605 -471 661 -364 b 746 -98 737 -204 750 -153 b 727 -59 744 -82 744 -59 b 688 -88 711 -59 694 -68 b 678 -109 687 -96 683 -102 b 562 -314 648 -183 611 -252 b 387 -439 516 -373 458 -416 b 328 -449 367 -446 347 -449 b 180 -386 274 -449 225 -423 b 69 -179 111 -330 69 -262 b 75 -121 69 -160 71 -141 b 84 -58 78 -101 84 -79 b 82 -39 84 -52 84 -45 b 68 -1 79 -26 82 -4 b 26 -32 49 0 33 -12 b 20 -52 24 -39 22 -45 b 0 -223 9 -107 -3 -161 b 141 -553 1 -348 27 -468 b 304 -619 192 -590 243 -619 b 344 -615 317 -619 330 -618 z m 415 -190 b 435 -157 429 -192 435 -184 b 308 -27 435 -86 379 -27 b 271 -46 287 -27 272 -35 b 269 -69 269 -55 269 -62 b 364 -183 269 -128 302 -170 z',\n },\n breathMarkComma: {\n x_min: 0,\n x_max: 148,\n y_min: 0,\n y_max: 275,\n ha: 275,\n o: 'm 120 0 b 187 78 156 20 174 48 b 213 209 206 121 213 164 b 206 294 213 238 210 265 b 140 390 200 337 171 367 b 122 396 134 395 128 396 b 68 382 105 396 85 384 b 46 379 60 382 53 382 b 0 328 12 369 0 357 b 1 311 0 323 1 317 b 30 210 4 275 22 243 b 66 167 39 179 46 167 b 94 171 73 167 82 168 b 143 180 109 174 124 180 b 160 179 148 180 154 180 b 120 66 124 145 120 107 b 120 0 120 45 121 23 z',\n },\n breathMarkUpbow: {\n x_min: 0,\n x_max: 254,\n y_min: 0,\n y_max: 595,\n ha: 595,\n o: 'm 233 0 b 256 48 251 14 253 30 b 272 183 264 92 265 138 b 311 455 289 274 295 364 b 350 716 327 541 341 628 b 366 815 354 749 366 782 b 359 857 366 829 363 842 b 327 815 334 852 330 832 b 302 674 315 769 310 721 b 248 357 288 567 269 462 b 225 226 240 314 242 268 b 210 251 212 232 213 243 b 69 721 163 408 117 564 b 32 835 58 760 53 801 b 20 851 29 841 27 851 b 14 850 19 851 16 851 b 0 828 6 847 0 838 l 0 825 b 12 765 1 804 7 785 b 194 125 73 552 132 338 b 233 0 206 84 213 42 z',\n },\n caesura: {\n x_min: 0,\n x_max: 565.5831864753837,\n y_min: -0.09016994374947417,\n y_max: 562.4481112129314,\n ha: 562.5382811566809,\n o: 'm 0 76 b 49 122 24 92 37 107 b 444 613 180 287 305 455 b 528 770 484 660 518 708 b 531 792 530 778 531 785 b 524 808 531 799 530 805 b 490 792 513 815 498 802 b 390 683 456 756 420 721 b 48 262 275 543 164 400 b 0 76 0 207 7 145 z m 226 1 b 248 13 238 -4 243 7 l 353 137 b 759 638 490 302 632 464 b 814 805 795 688 819 740 b 779 786 796 805 788 796 b 628 609 724 732 678 668 b 310 242 523 485 416 363 b 217 69 265 190 217 140 b 222 30 217 58 219 45 b 222 23 222 29 220 26 b 220 12 222 20 220 16 b 226 1 220 7 222 3 z',\n },\n caesuraCurved: {\n x_min: 0,\n x_max: 386,\n y_min: -10,\n y_max: 584,\n ha: 594,\n o: 'm 180 -14 b 246 14 213 -13 230 0 b 347 144 288 52 315 99 b 526 471 420 246 488 350 b 556 671 546 537 556 603 b 543 798 556 713 553 756 b 504 837 537 822 521 828 b 490 841 500 840 494 841 b 472 832 482 841 477 838 b 406 678 436 785 406 737 b 410 638 406 665 408 652 b 425 511 419 595 425 553 b 315 186 425 395 387 287 b 180 -14 271 122 228 58 z m 14 24 b 49 39 29 24 40 32 b 120 114 76 60 99 85 b 216 276 156 166 184 223 b 317 626 281 384 317 501 b 315 664 317 639 317 651 b 301 773 314 701 311 737 b 262 808 295 795 278 808 b 245 799 256 808 249 805 b 170 641 209 750 170 706 b 171 621 170 634 170 628 b 177 511 176 585 177 549 b 114 229 177 415 160 320 b 0 26 79 161 42 95 b 14 24 6 24 10 24 z',\n },\n restMaxima: {\n x_min: 0,\n x_max: 366,\n y_min: -255,\n y_max: 255,\n ha: 510,\n o: 'm 397 -367 b 504 -343 436 -367 468 -347 b 518 -318 516 -341 518 -330 b 527 -30 518 -217 527 -117 b 526 33 527 -7 527 13 l 526 301 b 501 350 526 323 520 341 b 428 367 477 361 452 367 b 374 359 410 367 393 364 b 357 333 361 354 357 347 b 356 91 357 252 356 171 l 356 30 b 340 -307 357 -82 346 -194 b 397 -367 337 -354 350 -367 z m 46 -357 b 58 -356 49 -357 53 -357 b 154 -333 91 -351 121 -338 b 173 -305 168 -330 173 -320 l 173 302 b 132 356 173 330 157 348 b 68 364 112 363 89 364 b 3 304 19 363 1 348 l 3 4 l 0 4 b 1 -302 0 -98 0 -200 b 46 -357 1 -331 16 -357 z',\n },\n restDoubleWhole: {\n x_min: 0,\n x_max: 122,\n y_min: 0,\n y_max: 249,\n ha: 249,\n o: 'm 43 0 b 58 1 48 0 52 0 b 124 20 81 6 102 17 b 176 96 173 27 176 58 b 173 220 174 138 173 179 b 176 304 173 248 176 276 b 140 353 176 331 163 346 b 95 359 125 356 111 359 b 32 346 73 359 52 354 b 0 315 20 340 0 337 b 1 243 0 291 1 268 l 1 174 l 4 174 l 4 48 b 43 0 4 16 17 0 z',\n },\n restWhole: {\n x_min: 0.8908513171538642,\n x_max: 500,\n y_min: -120,\n y_max: 14,\n ha: 134,\n o: 'm 356 -173 l 356 -171 l 642 -171 b 719 -115 680 -171 717 -145 b 720 -82 719 -104 720 -92 b 711 -20 720 -60 719 -40 b 672 17 704 0 694 10 b 649 20 664 20 657 20 b 605 17 634 20 621 17 b 92 19 433 17 262 17 b 29 7 69 20 49 12 b 9 -17 12 4 9 -6 b 10 -43 9 -26 10 -35 b 1 -84 10 -58 3 -72 b 76 -173 0 -147 7 -173 z',\n },\n restHalf: {\n x_min: 0,\n x_max: 518.3998530468286,\n y_min: 0,\n y_max: 162,\n ha: 162,\n o: 'm 98 0 l 556 0 b 665 1 592 0 629 0 b 746 82 720 3 743 29 b 736 174 749 114 740 144 b 670 232 729 215 708 232 b 570 229 636 232 603 229 b 356 233 498 229 426 233 l 73 233 b 0 179 19 233 0 220 b 1 154 0 171 0 164 b 6 95 4 135 6 115 b 98 0 3 27 29 0 z',\n },\n restQuarter: {\n x_min: -0.3784452492533808,\n x_max: 263,\n y_min: -415,\n y_max: 415,\n ha: 830,\n o: 'm 151 -596 b 164 -563 163 -589 161 -575 b 160 -546 164 -557 161 -552 b 124 -396 148 -495 135 -446 b 122 -380 122 -390 122 -384 b 199 -255 122 -331 158 -272 b 228 -256 209 -249 217 -253 b 324 -346 274 -271 298 -310 b 353 -369 331 -356 341 -369 b 360 -367 356 -369 357 -369 b 379 -336 373 -361 379 -348 l 377 -325 b 344 -232 372 -292 366 -258 b 249 -58 301 -180 278 -117 b 242 -36 245 -49 242 -42 b 258 -7 242 -26 248 -17 b 328 78 284 20 311 45 b 354 158 344 104 354 131 b 337 216 354 177 350 196 b 213 435 294 288 249 359 b 115 575 189 487 158 536 b 78 598 105 585 92 598 b 59 592 72 598 66 596 b 39 562 45 583 39 572 b 53 527 39 550 45 539 b 168 344 98 469 125 402 b 187 307 181 328 187 317 b 153 269 187 294 176 284 b 62 213 122 252 91 235 b 40 180 48 203 40 192 b 46 158 40 173 43 166 b 99 65 60 125 79 95 b 183 -79 131 20 160 -29 b 156 -86 173 -88 164 -85 b 0 -261 58 -99 -7 -173 b 96 -557 10 -366 49 -464 b 124 -585 102 -569 109 -580 b 145 -598 132 -588 138 -598 b 151 -596 147 -598 150 -598 z',\n },\n rest8th: {\n x_min: 0,\n x_max: 289,\n y_min: -260,\n y_max: 261,\n ha: 521,\n o: 'm 164 -374 b 212 -340 190 -373 203 -357 b 276 -190 238 -292 258 -242 b 410 285 333 -36 359 128 b 416 314 413 294 416 304 l 416 321 b 393 354 415 341 410 354 b 382 353 389 354 386 354 b 292 311 347 347 315 333 b 174 225 256 276 216 251 b 157 219 168 222 163 219 b 140 228 151 219 145 222 b 131 246 134 233 131 240 b 135 262 131 252 132 256 b 147 298 141 272 147 285 b 127 367 147 323 154 354 b 94 376 114 373 102 376 b 48 336 75 376 63 363 b 3 181 20 288 12 235 b 0 150 1 170 0 160 b 109 24 0 84 35 24 b 171 36 127 24 148 27 b 289 101 213 52 248 75 b 164 -374 256 -62 193 -213 z',\n },\n rest16th: {\n x_min: 0,\n x_max: 333,\n y_min: -328.283950617284,\n y_max: 244,\n ha: 572.2839506172841,\n o: 'm 209 -471 b 246 -458 222 -477 236 -468 b 307 -338 279 -425 300 -384 b 324 -226 312 -301 317 -262 b 428 161 350 -94 386 35 b 480 318 445 215 480 259 b 467 347 480 331 477 341 b 445 351 461 350 454 351 b 408 337 432 351 419 347 b 402 333 405 336 403 334 b 223 215 344 294 294 245 b 236 259 229 233 235 246 b 238 276 238 265 238 271 b 212 338 238 302 226 334 b 193 341 206 340 199 341 b 86 289 156 341 104 317 b 59 180 66 255 59 217 b 156 27 59 76 92 27 b 236 46 179 27 204 35 b 338 101 271 59 298 82 b 289 -49 312 49 302 0 b 196 -122 276 -99 235 -107 b 176 -114 187 -127 176 -127 l 176 -111 b 157 -53 177 -88 164 -72 b 69 -9 141 -7 101 -16 b 17 -48 43 -3 29 -27 b 0 -127 4 -73 0 -99 b 6 -186 0 -147 1 -167 b 82 -294 17 -262 37 -294 b 160 -276 102 -294 128 -289 b 219 -242 181 -268 203 -259 b 236 -230 223 -236 229 -230 b 243 -232 239 -230 240 -230 b 235 -275 248 -246 239 -261 b 202 -456 220 -334 202 -395 b 209 -471 202 -462 203 -468 z',\n },\n rest32nd: {\n x_min: 0,\n x_max: 347,\n y_min: -497.5023916875033,\n y_max: 483,\n ha: 980.5023916875033,\n o: 'm 177 -716 b 217 -690 194 -720 209 -704 b 233 -655 225 -680 230 -668 b 292 -390 253 -567 275 -480 b 361 -48 312 -275 336 -161 b 452 400 393 102 422 252 b 497 629 467 477 482 553 b 500 647 498 635 500 641 b 480 691 500 665 492 684 b 464 696 475 694 469 696 b 418 674 448 696 431 685 l 361 626 b 333 611 353 618 343 612 b 308 629 325 611 317 616 b 239 667 292 651 265 661 b 204 670 228 668 216 670 b 86 559 141 670 95 628 b 85 537 86 552 85 544 b 107 416 85 495 95 455 b 161 372 114 389 134 372 b 174 373 166 372 170 372 b 226 383 192 374 209 377 b 387 478 285 402 330 444 b 364 386 379 444 364 415 b 276 271 364 323 320 298 b 265 266 272 268 268 266 b 252 276 261 266 256 269 b 143 333 229 311 186 333 b 107 327 130 333 118 330 b 43 243 62 314 46 291 b 58 145 43 210 52 179 b 150 63 68 92 99 63 b 315 132 213 63 259 98 b 266 -58 297 63 281 4 b 207 -101 259 -91 230 -96 b 186 -66 186 -107 199 -75 b 180 -50 181 -63 183 -55 b 101 -3 160 -23 135 -3 b 9 -66 59 -3 20 -32 b 0 -118 3 -84 0 -101 b 10 -196 0 -144 6 -170 b 104 -287 20 -256 52 -287 b 137 -282 114 -287 125 -287 b 184 -269 151 -281 171 -269 b 196 -275 190 -269 193 -271 b 199 -287 197 -278 199 -282 b 184 -343 199 -304 189 -325 b 181 -348 184 -346 183 -347 b 134 -595 158 -429 131 -508 b 156 -677 134 -624 150 -648 b 177 -716 158 -693 160 -713 z',\n },\n rest64th: {\n x_min: 0,\n x_max: 428,\n y_min: -720,\n y_max: 473.6797408388932,\n ha: 1193.6797408388932,\n o: 'm 200 -1037 b 229 -1012 215 -1037 222 -1025 b 238 -984 233 -1004 236 -994 b 282 -780 248 -914 265 -848 b 386 -369 317 -644 354 -507 b 491 104 422 -212 451 -53 b 600 541 528 249 550 399 b 616 629 611 570 616 599 b 600 680 616 648 615 671 b 550 665 586 687 566 677 b 480 618 527 649 501 635 b 464 611 474 613 468 611 b 448 622 458 611 454 615 b 366 662 425 651 397 662 b 331 658 354 662 343 661 b 242 572 285 647 253 619 b 236 528 239 557 236 543 b 266 400 236 484 251 442 b 325 373 274 377 301 373 b 436 409 366 373 403 383 l 494 452 b 474 360 485 416 474 389 b 383 248 474 297 435 269 b 320 328 377 288 351 310 b 276 341 305 337 291 341 b 186 269 235 341 194 311 b 181 230 183 256 181 243 b 187 153 181 204 186 179 b 279 63 192 86 233 63 b 304 65 288 63 295 63 b 416 115 344 72 379 92 b 387 -14 406 69 397 27 b 320 -95 380 -52 369 -86 b 318 -79 320 -89 320 -84 b 223 0 305 -29 271 0 b 122 -81 171 0 135 -30 b 118 -127 120 -96 118 -112 l 118 -196 b 137 -242 118 -215 125 -229 b 209 -275 157 -266 181 -275 b 249 -269 222 -275 235 -274 b 318 -248 272 -264 294 -255 b 281 -390 315 -301 292 -344 b 276 -400 279 -393 279 -397 b 259 -420 272 -408 266 -416 b 246 -429 255 -425 251 -429 b 233 -415 242 -429 238 -426 b 176 -359 225 -389 200 -372 b 121 -346 158 -348 140 -346 b 14 -408 73 -346 27 -370 b 0 -498 4 -438 0 -468 b 6 -564 0 -520 3 -543 b 91 -635 12 -611 45 -635 b 131 -629 104 -635 117 -634 b 223 -590 163 -622 190 -603 b 166 -824 203 -671 189 -747 b 148 -912 157 -852 148 -881 b 156 -955 148 -926 150 -940 b 177 -1008 161 -972 170 -991 b 200 -1037 181 -1020 183 -1037 z',\n },\n rest128th: {\n x_min: 0.6717818579024267,\n x_max: 491,\n y_min: -711,\n y_max: 719,\n ha: 1430,\n o: 'm 233 -1015 b 271 -956 256 -1002 266 -981 l 314 -723 b 393 -350 337 -598 366 -474 b 543 312 442 -128 492 91 b 687 841 583 490 635 665 b 707 958 698 880 707 919 b 706 986 707 968 707 976 b 688 1025 704 999 704 1024 b 670 1027 683 1025 677 1027 b 629 1007 655 1027 639 1022 b 559 945 613 981 586 968 b 541 1004 553 968 559 991 b 456 1035 516 1024 488 1035 b 419 1030 444 1035 431 1034 b 344 953 379 1018 353 995 b 340 900 341 936 340 917 b 341 847 340 881 341 864 b 380 779 340 815 354 793 b 464 763 406 765 435 762 b 592 814 510 763 549 786 b 546 660 575 757 556 710 b 480 585 537 619 517 598 b 478 599 480 590 478 595 b 386 678 472 641 428 678 b 294 612 343 678 304 651 b 279 477 282 567 278 521 b 363 395 281 428 317 395 b 380 396 369 395 374 395 b 488 436 416 403 449 419 b 384 233 469 357 468 275 b 359 291 373 252 377 276 b 282 318 337 310 310 318 b 181 264 243 318 203 298 b 154 107 153 216 154 161 b 242 6 154 42 187 6 b 278 10 253 6 265 7 b 408 88 330 22 366 55 b 387 -1 400 56 393 27 b 301 -112 379 -55 354 -94 b 289 -65 297 -95 302 -79 b 219 -32 269 -42 245 -32 b 183 -37 207 -32 196 -35 b 112 -109 144 -46 121 -71 b 105 -219 104 -145 108 -183 b 186 -315 101 -276 134 -315 b 230 -307 199 -315 215 -312 b 324 -256 264 -295 292 -275 b 180 -491 323 -383 266 -471 b 183 -459 180 -480 180 -469 b 184 -442 184 -454 184 -448 l 184 -436 b 135 -369 184 -403 170 -383 b 102 -363 125 -364 114 -363 b 29 -399 73 -363 45 -376 b 1 -556 -4 -448 6 -503 b 109 -670 -4 -625 43 -670 b 140 -667 118 -670 130 -668 b 253 -616 180 -658 213 -638 b 238 -688 248 -644 242 -665 b 192 -959 220 -779 192 -867 b 193 -992 192 -971 192 -981 b 210 -1024 194 -1014 199 -1024 b 233 -1015 216 -1024 223 -1021 z',\n },\n dynamicPiano: {\n x_min: -49,\n x_max: 326.5019318364244,\n y_min: -142,\n y_max: 515,\n ha: 657,\n o: 'm -56 -204 b -42 -202 -52 -204 -46 -203 b -19 -194 -35 -202 -26 -197 b 147 -138 35 -170 91 -151 b 249 -58 194 -127 223 -95 b 262 -29 255 -50 262 -39 b 258 -17 262 -24 261 -20 b 232 -7 252 -10 242 -7 b 210 -12 225 -7 217 -9 b 125 -40 184 -23 157 -30 b 183 140 153 19 171 79 b 251 167 207 144 230 153 b 469 518 383 262 480 382 b 357 687 472 626 420 687 b 315 678 344 687 330 684 b 204 600 279 664 240 634 b 210 704 206 635 209 670 b 215 721 212 710 215 716 b 206 733 215 727 212 730 b 180 742 197 736 189 742 b 164 734 176 742 170 740 b 1 575 108 684 36 645 b -7 557 -1 569 -7 563 b -6 553 -7 556 -7 554 b 7 547 -3 547 3 547 l 17 547 b 82 575 43 547 59 567 l 82 452 b 56 46 82 317 81 180 b 17 -66 49 7 46 -36 b -62 -173 -13 -99 -37 -135 b -71 -192 -66 -179 -71 -184 b -68 -199 -71 -193 -69 -196 b -56 -204 -65 -203 -60 -204 z m 196 258 b 197 266 197 261 197 264 b 200 510 200 347 199 429 b 233 543 210 521 222 533 b 281 560 249 554 266 560 b 340 503 310 560 333 540 b 344 461 343 488 344 474 b 321 323 344 413 333 369 b 268 272 315 300 295 281 b 196 258 245 265 220 261 z',\n },\n dynamicMezzo: {\n x_min: -18,\n x_max: 559,\n y_min: -50,\n y_max: 365,\n ha: 415,\n o: 'm 43 -71 b 160 19 86 -71 143 -26 b 230 264 189 99 200 184 b 282 363 243 297 259 327 b 287 320 285 347 287 333 b 284 279 287 305 285 292 l 249 -12 b 275 -43 248 -29 245 -43 b 395 45 321 -43 389 3 b 462 271 406 124 436 197 b 523 387 475 310 490 348 l 523 346 b 504 130 521 274 513 202 b 501 81 501 114 501 98 b 510 3 501 55 504 29 b 580 -72 521 -48 543 -72 b 625 -63 593 -72 608 -69 b 789 50 690 -43 744 -3 b 805 72 795 56 805 63 b 798 85 805 76 802 81 b 778 94 792 91 785 94 b 755 85 770 94 763 91 l 693 40 b 675 33 685 36 680 33 b 658 52 668 33 662 39 b 645 144 651 82 645 112 b 658 448 641 246 660 346 b 606 507 658 485 638 507 b 583 504 599 507 592 505 b 495 446 547 497 521 471 b 420 373 471 423 448 399 b 413 458 418 406 418 432 b 361 507 408 490 386 507 b 320 491 347 507 333 501 b 160 307 256 444 207 382 l 160 337 b 174 488 160 387 174 438 b 156 521 174 501 173 513 b 137 526 148 524 143 526 b 109 513 127 526 118 520 b -16 399 66 477 23 439 b -26 383 -20 395 -26 389 l -26 379 b -14 370 -24 372 -20 370 b -6 372 -12 370 -9 372 b 19 376 4 374 12 376 b 36 359 32 376 36 370 b 30 330 36 350 35 341 l 30 323 b 9 -35 23 203 17 85 b 43 -71 6 -65 19 -71 z',\n },\n dynamicForte: {\n x_min: -144,\n x_max: 311.30112136775,\n y_min: -115.3876295915697,\n y_max: 504,\n ha: 619.3876295915697,\n o: 'm -101 -166 b 173 76 7 -153 150 -30 b 206 344 192 164 202 253 b 268 338 226 343 246 341 b 384 395 317 333 353 361 b 397 419 393 405 397 412 b 367 442 397 429 387 436 b 350 444 361 444 356 444 b 206 455 302 449 255 454 l 206 474 b 202 540 204 495 202 518 b 209 593 202 557 203 576 b 236 624 215 613 225 624 b 265 612 245 624 253 619 b 308 552 287 596 302 577 b 336 533 312 534 323 533 b 448 611 366 533 444 583 b 399 696 452 648 423 671 b 382 706 395 700 387 703 b 308 726 357 720 333 726 b 207 684 272 726 239 711 b 60 455 135 622 60 560 l 10 455 b -23 448 -1 455 -13 454 b -102 372 -55 426 -76 397 b -109 357 -108 367 -109 361 b -95 347 -109 353 -105 348 b -63 346 -84 346 -73 346 b 0 344 -43 344 -22 344 l 63 344 b 53 186 63 291 59 239 b 23 0 46 124 42 60 b -35 -60 10 -42 -6 -60 b -73 -52 -45 -60 -58 -58 b -91 -48 -79 -49 -85 -48 b -109 -53 -96 -48 -102 -49 b -199 -124 -143 -72 -168 -99 b -207 -137 -203 -128 -207 -132 b -194 -148 -207 -141 -203 -145 b -101 -166 -164 -160 -132 -168 z',\n },\n dynamicRinforzando: {\n x_min: -75,\n x_max: 322.0960720195126,\n y_min: -90,\n y_max: 325,\n ha: 415,\n o: 'm 23 -130 b 40 -125 27 -130 33 -128 b 128 -9 81 -114 125 -53 b 145 200 132 62 141 130 b 148 238 147 212 148 225 b 308 321 184 291 245 321 b 363 314 325 321 344 318 b 377 310 369 312 373 310 b 384 311 380 310 382 310 b 464 415 410 317 464 389 b 446 433 465 429 455 429 b 390 445 428 441 409 445 b 305 429 361 445 334 438 b 167 346 252 413 202 393 b 153 325 163 338 158 333 b 148 438 154 363 151 399 b 121 468 147 456 134 468 b 101 458 115 468 108 465 b -63 310 46 409 -16 367 b -108 240 -78 289 -98 271 b 32 330 -50 256 -13 297 b 37 304 37 320 37 312 l 37 292 b 10 -101 27 161 20 30 b 23 -130 9 -120 12 -130 z',\n },\n dynamicSforzando: {\n x_min: 0,\n x_max: 296,\n y_min: 0,\n y_max: 379,\n ha: 379,\n o: 'm 151 0 b 174 1 160 0 166 0 b 392 158 272 14 346 71 b 405 207 400 174 405 190 b 359 287 405 236 389 265 b 261 325 328 308 294 315 b 168 413 216 340 181 366 b 166 426 167 418 166 423 b 176 438 166 432 167 436 b 199 441 183 441 190 441 b 310 393 238 441 295 422 b 334 370 317 376 325 370 b 363 386 343 370 353 379 b 422 445 386 402 408 420 b 426 458 425 449 426 454 b 422 469 426 462 425 465 b 274 546 395 518 333 546 b 161 503 232 546 190 531 b 86 405 132 472 108 439 b 71 347 75 387 71 367 b 112 256 71 312 85 279 b 209 215 141 232 176 226 b 284 168 238 206 266 197 b 300 131 291 157 300 144 b 298 120 300 127 298 122 b 278 107 294 109 285 108 b 262 108 271 107 266 108 l 259 108 b 114 157 200 107 156 125 b 96 181 104 163 96 170 l 96 184 b 102 202 96 190 102 196 b 96 209 102 204 101 207 b 63 194 82 215 72 204 b 7 109 42 168 26 138 b 0 86 3 101 0 94 b 13 60 0 78 4 68 b 151 0 53 23 101 0 z',\n },\n dynamicZ: {\n x_min: -42.73880183193087,\n x_max: 331,\n y_min: 0,\n y_max: 328,\n ha: 328,\n o: 'm -45 0 b -6 16 -32 0 -17 10 b 3 20 -3 16 0 19 b 144 60 49 48 96 60 b 284 22 190 60 238 46 b 348 4 305 10 327 4 b 461 75 393 4 435 30 b 468 91 464 81 467 86 b 456 104 468 95 465 99 b 287 173 402 131 348 167 b 239 176 271 174 255 176 b 168 174 217 176 194 174 b 367 340 236 236 298 294 b 459 423 402 363 432 392 b 477 454 467 431 475 442 b 474 462 477 456 475 459 b 454 472 469 469 462 472 b 432 468 446 472 439 469 b 356 448 406 461 380 455 b 210 422 307 433 258 422 b 109 442 177 422 144 428 b 94 445 104 444 99 445 b 69 433 85 445 76 442 b 27 390 56 419 39 406 b -9 343 16 373 -17 357 b 63 311 3 320 36 314 l 78 311 b 132 307 95 308 114 307 b 240 314 168 307 203 311 l 193 271 b -37 50 117 196 19 145 b -59 7 -46 36 -69 20 b -45 0 -55 3 -50 0 z',\n },\n ornamentTrill: {\n x_min: 1,\n x_max: 551,\n y_min: -18,\n y_max: 539,\n ha: 557,\n o: 'm 321 612 b 190 602 278 605 235 605 l 190 638 b 187 693 190 652 190 667 b 161 776 184 717 193 776 b 137 747 150 776 137 766 b 130 654 135 716 131 685 l 130 596 l 52 588 b 4 539 23 585 7 570 b 1 477 3 530 1 500 b 3 448 1 461 3 448 l 3 452 b 53 432 6 436 23 432 b 134 435 75 432 102 433 b 151 117 138 328 147 223 b 170 13 153 82 157 46 b 209 -26 179 -10 193 -26 b 222 -22 213 -26 217 -24 b 269 -17 233 -16 253 -27 b 343 135 325 19 346 66 b 343 158 343 147 344 147 b 323 192 341 171 337 187 b 291 176 311 194 300 184 l 264 148 b 229 131 261 145 238 131 b 212 170 209 131 213 154 b 194 438 203 259 199 348 l 272 442 b 284 452 276 441 279 441 b 305 462 287 461 295 462 l 312 462 b 346 477 325 462 340 464 b 366 560 357 503 366 531 b 321 612 366 598 356 618 z m 759 588 b 711 560 749 592 733 570 b 588 500 671 541 631 521 b 583 533 586 514 586 524 b 560 576 577 549 577 572 b 517 550 541 582 528 564 b 416 423 482 508 452 462 b 382 353 392 397 384 370 b 387 305 380 341 386 318 b 392 275 389 295 392 285 b 409 243 393 262 393 243 b 431 262 419 243 425 255 b 521 373 459 298 488 333 b 523 354 521 366 523 360 b 520 337 523 346 521 340 b 508 295 513 323 508 310 b 530 102 508 279 524 122 b 549 66 533 88 530 66 b 577 99 563 66 572 84 b 580 131 580 109 580 121 l 580 302 b 600 347 580 318 582 337 b 701 392 632 364 665 384 b 793 518 785 409 793 435 b 759 588 793 559 785 576 z',\n },\n ornamentTurn: {\n x_min: 0,\n x_max: 574,\n y_min: 0,\n y_max: 312,\n ha: 312,\n o: 'm 651 0 b 816 132 727 0 796 46 b 827 223 822 163 827 193 b 808 340 827 262 821 301 b 665 449 785 408 729 449 b 636 446 655 449 647 448 b 589 384 600 441 586 422 l 602 300 b 611 285 603 291 605 285 b 621 288 613 285 616 287 b 655 295 632 294 644 295 b 711 284 674 295 693 289 b 773 209 740 275 773 232 b 697 156 773 184 734 160 b 664 154 685 154 675 154 b 579 168 635 154 608 158 b 455 242 533 186 495 213 b 261 400 387 291 331 354 b 160 432 225 422 190 432 b 20 328 98 432 49 392 b 0 229 6 295 0 262 b 30 71 0 176 14 122 b 144 3 43 29 96 3 b 168 6 153 3 160 4 b 248 122 233 20 248 39 b 246 147 248 124 248 135 b 226 177 243 164 239 177 b 206 170 220 177 215 174 b 144 154 186 158 166 154 b 79 170 122 154 101 160 b 53 202 62 179 53 189 b 60 228 53 209 55 217 b 161 281 81 261 120 281 b 183 279 168 281 176 281 b 325 190 243 269 284 229 b 572 16 402 124 475 53 b 651 0 598 6 625 0 z',\n },\n ornamentTurnSlash: {\n x_min: 0,\n x_max: 574,\n y_min: -106,\n y_max: 405,\n ha: 511,\n o: 'm 441 -153 b 456 -60 455 -118 456 -89 b 455 81 455 -14 455 33 b 572 14 491 55 530 30 b 651 -1 598 4 625 -1 b 816 131 727 -1 796 45 b 827 222 822 161 827 192 b 808 338 827 261 821 300 b 665 448 785 406 729 448 b 636 445 655 448 647 446 b 589 383 600 439 586 420 l 602 298 b 611 284 603 289 605 284 b 621 287 613 284 616 285 b 655 294 632 292 644 294 b 711 282 674 294 693 288 b 773 207 740 274 773 230 b 697 154 773 183 734 158 b 664 153 685 153 675 153 b 579 167 635 153 608 157 b 455 240 533 183 495 212 b 454 242 455 240 455 242 l 454 337 b 452 488 454 386 452 439 b 433 570 452 517 451 546 b 425 583 431 575 431 583 l 422 583 b 403 566 415 582 408 573 b 402 546 400 560 402 553 l 397 287 b 261 399 353 325 310 366 b 160 431 225 420 190 431 b 20 327 98 431 48 390 b 0 228 6 294 0 261 b 30 69 0 174 14 121 b 144 1 43 27 96 1 b 168 4 153 1 160 3 b 248 121 233 19 248 37 b 246 145 248 122 248 134 b 226 176 243 163 239 176 b 206 168 220 176 215 173 b 144 153 186 157 166 153 b 79 168 122 153 101 158 b 53 200 62 177 53 187 b 60 226 53 207 55 216 b 161 279 79 259 120 279 b 183 278 168 279 176 279 b 325 189 243 266 282 226 b 395 130 348 168 372 148 b 393 71 393 109 393 89 b 441 -153 390 -6 402 -78 z',\n },\n ornamentMordent: {\n x_min: 0,\n x_max: 700,\n y_min: 0,\n y_max: 497,\n ha: 497,\n o: 'm 513 0 b 528 39 526 14 527 27 b 531 72 531 50 531 60 b 528 138 531 94 528 117 l 528 347 b 552 359 537 354 544 359 b 579 338 560 359 569 353 b 674 217 609 297 639 255 b 719 190 690 200 704 190 b 759 215 732 190 744 197 b 940 395 815 279 877 337 b 1001 490 968 422 986 455 b 1008 513 1004 495 1008 505 b 1002 524 1008 517 1007 521 b 968 516 994 530 978 524 b 960 508 965 513 963 510 b 798 356 900 464 848 410 b 778 341 791 347 783 341 b 757 354 772 341 765 346 b 661 475 720 392 690 432 b 611 517 644 504 629 517 b 563 498 598 517 583 511 b 527 471 550 490 539 481 l 527 570 b 492 716 526 619 523 671 b 472 677 480 704 472 694 b 465 399 474 585 468 491 b 439 366 456 387 448 376 b 384 320 415 336 399 320 b 330 367 369 320 354 336 b 325 376 328 369 327 373 b 226 490 291 413 265 456 b 189 505 213 500 202 505 b 157 491 177 505 167 500 b 0 229 75 420 0 346 b 1 202 0 220 0 212 b 22 215 12 203 16 209 b 124 327 55 252 89 289 b 147 343 132 337 140 343 b 171 323 156 343 164 336 b 266 197 196 276 232 236 b 337 157 291 170 314 157 b 410 207 361 157 386 174 b 461 274 428 229 444 252 b 462 166 461 238 461 202 b 513 0 465 108 487 55 z',\n },\n ornamentShortTrill: {\n x_min: 0,\n x_max: 747,\n y_min: 0,\n y_max: 243,\n ha: 243,\n o: 'm 379 0 b 428 14 395 0 410 4 b 474 56 445 26 461 39 b 552 157 500 89 526 122 b 566 168 556 163 560 168 b 575 157 569 168 572 166 b 664 36 592 107 628 72 b 733 1 685 13 710 1 b 802 35 757 1 780 13 b 1007 249 871 105 940 177 b 1067 324 1028 272 1054 295 b 1076 340 1068 330 1076 334 b 1073 346 1076 341 1076 343 b 1057 350 1068 348 1063 350 b 1047 347 1053 350 1050 350 b 1001 310 1031 336 1015 324 l 857 157 b 844 143 852 153 848 143 b 835 150 841 143 838 144 b 757 242 815 186 780 209 b 685 298 739 268 713 284 b 641 310 670 305 655 310 b 590 288 625 310 608 304 b 497 179 554 256 527 215 b 480 164 490 170 485 164 b 462 179 474 164 469 168 b 372 295 436 220 405 258 b 278 344 346 324 312 344 b 199 310 252 344 226 334 b 92 196 161 274 128 233 b 0 24 46 148 23 89 b 42 48 22 27 32 37 b 156 168 84 85 114 132 b 196 192 174 184 186 192 b 228 158 206 192 215 181 b 312 36 252 114 282 75 b 379 0 331 12 354 0 z',\n },\n ornamentTremblement: {\n x_min: 0,\n x_max: 982.17691453624,\n y_min: 0,\n y_max: 224,\n ha: 224,\n o: 'm 0 0 b 63 36 30 12 48 23 b 157 124 94 66 125 94 b 177 135 164 131 170 135 b 196 122 183 135 189 131 b 268 40 217 94 245 68 b 323 6 288 16 304 6 b 369 20 336 6 350 10 b 412 53 384 29 399 40 b 501 145 442 84 472 114 b 523 158 508 154 516 158 b 543 145 528 158 536 154 b 641 45 576 112 608 78 b 698 17 658 27 677 17 b 729 23 708 17 719 20 b 804 65 756 32 780 46 b 904 154 837 95 871 124 b 920 163 910 160 916 163 b 936 153 924 163 930 160 b 1024 60 965 121 996 92 b 1112 13 1053 29 1080 13 b 1184 39 1135 13 1158 22 b 1359 194 1248 84 1305 138 b 1413 301 1388 223 1403 261 b 1404 323 1417 315 1413 323 b 1391 320 1400 323 1395 321 b 1344 294 1375 314 1358 307 b 1224 186 1305 258 1269 216 b 1194 173 1212 179 1202 173 b 1165 193 1184 173 1175 179 b 1096 271 1145 222 1122 248 b 1001 318 1061 302 1031 318 b 903 268 969 318 937 301 b 806 186 871 239 841 210 b 782 174 796 179 789 174 b 756 193 773 174 765 180 b 652 291 729 232 693 266 b 596 308 634 302 615 308 b 530 278 573 308 552 298 l 415 168 b 393 157 408 161 400 157 b 373 171 387 157 380 161 b 305 245 353 197 330 222 b 248 276 285 266 266 278 b 189 245 229 276 210 266 b 81 144 156 209 120 174 b 0 0 33 109 26 56 z',\n },\n ornamentPrecompAppoggTrill: {\n x_min: -0.11067192132025548,\n x_max: 1066,\n y_min: -50,\n y_max: 533.1706452421108,\n ha: 583.1706452421108,\n o: 'm 187 -46 b 213 -14 197 -37 204 -26 b 285 151 251 36 266 94 b 304 189 294 177 297 189 b 337 168 311 189 320 181 b 458 33 386 131 415 76 b 495 12 472 19 484 12 b 531 40 508 12 518 22 b 580 168 557 79 569 124 b 622 235 592 213 603 235 b 683 194 636 235 655 222 b 838 26 737 140 791 86 b 919 -33 860 -1 881 -39 b 984 53 960 -27 971 19 b 1022 156 998 86 1008 122 b 1054 190 1032 179 1041 190 b 1089 167 1063 190 1074 183 b 1208 32 1129 122 1171 78 b 1244 10 1221 17 1231 10 b 1273 22 1253 10 1263 14 b 1496 206 1352 78 1427 137 b 1535 310 1526 236 1535 272 b 1531 359 1535 325 1534 343 b 1496 343 1515 360 1506 351 l 1309 192 b 1269 167 1289 176 1279 167 b 1234 199 1260 167 1251 177 b 1122 324 1200 243 1168 289 b 1074 344 1106 337 1089 344 b 1014 301 1051 344 1030 328 b 952 144 985 252 971 197 b 933 121 946 128 940 121 b 910 137 927 121 920 125 b 850 210 888 161 870 186 b 687 369 799 266 750 325 b 631 390 665 383 647 390 b 567 327 602 390 580 369 b 527 199 554 284 543 242 b 508 168 520 179 514 168 b 482 192 503 168 495 177 b 353 328 444 240 405 292 b 312 343 338 338 324 343 b 266 297 292 343 276 327 b 204 125 248 239 232 180 b 143 79 193 102 173 79 b 92 122 117 79 105 102 b 81 154 86 131 84 143 b 48 423 59 242 50 333 b 45 544 46 464 45 504 b 53 730 45 606 48 668 b 40 768 55 744 52 766 b 13 730 19 770 14 747 b 0 514 7 658 -1 586 b 26 122 3 383 6 252 b 75 -36 35 66 40 10 b 134 -72 92 -59 112 -72 b 187 -46 151 -72 170 -63 z',\n },\n ornamentPrecompSlideTrillDAnglebert: {\n x_min: 0,\n x_max: 1088,\n y_min: -380,\n y_max: 252,\n ha: 632,\n o: 'm 560 -539 b 439 -481 527 -497 484 -485 b 354 -461 409 -478 380 -477 b 131 -154 236 -389 161 -285 b 124 -98 127 -135 124 -117 b 196 55 124 -40 148 10 b 308 99 230 86 268 99 b 399 81 337 99 367 92 b 514 22 441 66 477 43 b 619 -30 567 -9 590 -30 b 719 17 642 -30 670 -16 b 861 131 769 52 818 88 b 899 150 874 144 887 150 b 936 117 913 150 926 138 b 965 43 948 94 956 68 b 1007 -1 973 24 978 -1 b 1048 30 1025 -1 1037 16 b 1070 65 1057 40 1064 52 b 1110 148 1084 92 1096 121 b 1145 190 1120 164 1120 190 b 1191 153 1169 192 1179 168 b 1256 29 1218 115 1231 68 b 1292 1 1267 10 1277 1 b 1320 10 1300 1 1309 4 b 1369 48 1339 19 1355 33 b 1515 196 1418 96 1464 148 b 1567 343 1558 238 1567 287 b 1555 363 1565 357 1562 363 b 1539 356 1551 363 1547 360 b 1433 268 1502 330 1466 301 b 1335 171 1401 236 1374 199 b 1310 163 1325 166 1318 163 b 1286 183 1302 163 1293 168 b 1218 311 1264 226 1247 272 b 1164 351 1200 337 1182 351 b 1110 308 1146 351 1128 337 b 1031 176 1084 265 1058 219 b 1015 161 1025 166 1021 161 b 999 179 1009 161 1005 167 b 955 279 985 213 973 248 b 913 307 943 300 930 307 b 887 302 904 307 896 305 b 852 281 874 298 863 291 b 693 167 804 236 747 204 b 612 140 667 150 639 140 b 549 157 592 140 570 145 b 403 220 503 181 452 202 b 271 248 360 236 315 248 b 179 229 239 248 209 242 b 0 -29 65 180 0 85 b 9 -104 0 -53 3 -78 b 397 -526 56 -317 183 -464 b 505 -547 432 -536 468 -547 b 560 -539 524 -547 541 -544 z',\n },\n ornamentPrecompSlideTrillBach: {\n x_min: 0,\n x_max: 1185,\n y_min: -380,\n y_max: 465,\n ha: 845,\n o: 'm 624 -544 b 642 -528 638 -543 642 -537 b 639 -514 642 -524 642 -520 b 590 -444 629 -487 609 -467 b 523 -413 573 -422 553 -410 b 498 -415 514 -415 507 -415 b 399 -389 464 -415 431 -405 b 89 -157 281 -330 176 -255 b 72 -117 78 -144 72 -131 b 73 -101 72 -111 72 -107 b 187 186 91 3 147 91 b 246 230 200 216 222 230 b 300 209 262 230 281 223 b 456 48 359 163 403 101 b 540 -10 494 10 518 -10 b 625 59 566 -10 589 13 b 690 148 648 88 668 118 b 711 167 697 160 704 167 b 733 153 719 167 724 163 b 844 14 769 105 808 60 b 903 -42 873 -23 886 -42 b 973 -1 919 -42 937 -27 b 1008 33 986 7 996 20 b 1048 81 1021 48 1035 65 b 1050 37 1048 66 1050 52 b 1047 -24 1050 17 1048 -3 b 1038 -275 1038 -108 1040 -192 l 1037 -289 b 1045 -302 1037 -295 1038 -301 b 1068 -284 1056 -304 1064 -292 b 1084 -242 1076 -271 1081 -256 b 1099 -109 1096 -199 1099 -154 b 1106 158 1099 -19 1106 71 b 1128 187 1113 167 1120 177 b 1168 223 1143 212 1155 223 b 1210 193 1179 223 1191 213 b 1220 183 1214 190 1215 186 b 1329 36 1261 138 1292 84 b 1374 7 1345 16 1358 7 b 1411 20 1384 7 1395 12 b 1479 84 1437 37 1459 59 b 1610 235 1521 135 1564 186 b 1706 403 1655 282 1695 334 b 1614 346 1663 400 1637 373 b 1464 170 1564 287 1515 228 b 1440 150 1453 156 1447 150 b 1414 173 1433 150 1426 158 b 1283 336 1371 228 1333 288 b 1220 366 1261 356 1240 366 b 1148 318 1194 366 1169 350 b 1103 255 1133 297 1119 275 b 1097 301 1102 271 1100 285 b 1099 334 1099 312 1099 324 b 1092 428 1099 367 1094 397 b 1071 647 1087 501 1079 575 b 1058 670 1071 657 1071 670 b 1035 648 1047 670 1038 661 b 1018 516 1024 605 1015 560 b 1041 203 1025 412 1037 307 b 1043 180 1041 196 1043 187 b 992 127 1027 161 1009 143 b 965 111 981 117 972 111 b 936 132 955 111 946 120 b 829 268 900 179 867 225 b 760 317 801 301 780 317 b 691 258 739 317 719 297 b 605 147 664 219 641 177 b 589 138 599 141 593 138 b 572 148 583 138 579 141 b 415 317 520 206 467 261 b 327 372 390 343 366 366 b 300 373 317 373 308 373 b 154 295 239 373 190 348 b 55 138 120 243 85 192 b 0 -53 22 79 0 13 b 160 -317 0 -156 49 -252 b 209 -354 177 -327 192 -343 b 510 -531 305 -419 397 -495 b 593 -547 537 -540 564 -547 b 624 -544 603 -547 613 -546 z',\n },\n ornamentPrecompTrillSuffixDandrieu: {\n x_min: 0,\n x_max: 1003,\n y_min: -20,\n y_max: 521,\n ha: 541,\n o: 'm 791 -16 b 844 33 812 -3 829 14 b 981 271 900 107 937 190 b 994 288 984 278 985 288 b 1009 269 1004 288 1007 278 b 1077 112 1034 217 1051 163 b 1158 43 1103 62 1129 43 b 1231 69 1179 43 1204 55 b 1348 189 1280 98 1315 143 b 1444 451 1407 271 1444 357 b 1431 547 1444 482 1440 514 b 1188 750 1401 665 1299 750 b 1158 747 1178 750 1168 749 b 1079 684 1119 742 1089 727 b 1063 632 1076 665 1071 648 b 1056 609 1058 622 1056 615 b 1071 599 1056 602 1060 599 b 1086 600 1076 599 1080 600 b 1130 605 1102 603 1116 605 b 1244 569 1171 605 1210 595 b 1349 346 1322 511 1349 433 b 1348 312 1349 334 1349 324 b 1289 197 1345 266 1325 228 b 1238 174 1270 181 1253 174 b 1188 215 1220 174 1202 187 b 1145 308 1172 245 1159 276 b 1096 413 1129 343 1120 382 b 1053 438 1084 431 1068 438 b 1011 413 1038 438 1022 431 b 955 324 989 384 971 354 b 850 127 920 258 886 192 b 838 112 847 121 842 112 b 824 128 828 109 825 121 b 802 193 815 150 809 171 b 730 400 779 264 766 337 b 688 431 719 420 703 431 b 647 403 674 431 660 422 b 606 338 632 383 619 361 b 513 167 575 282 546 223 b 480 122 503 150 498 122 b 452 171 459 122 459 153 b 420 255 442 199 432 228 b 337 408 399 308 380 364 b 276 436 317 428 297 436 b 215 397 253 436 230 423 b 23 72 148 289 81 184 b 0 29 17 59 0 40 b 7 17 0 23 1 20 b 59 58 26 7 46 39 b 190 276 111 127 143 206 b 216 301 202 292 207 301 b 245 279 223 301 232 294 b 311 166 278 248 292 206 b 367 16 331 117 346 65 b 402 -19 377 -7 387 -19 b 438 -4 412 -19 423 -13 b 518 88 474 17 495 55 b 628 284 562 150 592 216 b 657 223 648 266 651 243 b 717 13 677 154 696 84 b 755 -29 726 -16 737 -29 b 791 -16 765 -29 776 -24 z',\n },\n ornamentPrecompDoubleCadenceUpperPrefix: {\n x_min: 0,\n x_max: 1246,\n y_min: -30,\n y_max: 296.0302860502196,\n ha: 326.0302860502196,\n o: 'm 360 -43 b 559 59 445 -43 503 7 b 698 236 615 111 652 179 b 714 248 704 243 710 248 b 727 235 719 248 721 243 l 848 42 b 883 12 860 22 870 12 b 917 32 891 12 903 19 b 946 62 927 42 939 50 b 1037 192 972 108 1009 147 b 1057 210 1044 204 1051 210 b 1076 190 1063 210 1068 203 l 1176 12 b 1215 -19 1188 -9 1201 -19 b 1250 -6 1225 -19 1237 -14 b 1284 27 1264 3 1274 16 b 1380 190 1323 78 1351 135 b 1395 210 1384 197 1385 210 b 1413 190 1405 210 1410 197 b 1508 40 1436 134 1467 85 b 1564 3 1529 14 1547 3 b 1617 32 1580 3 1597 12 b 1767 238 1678 92 1719 167 b 1794 310 1781 259 1791 282 b 1752 294 1776 317 1764 304 b 1656 164 1711 258 1689 206 b 1629 144 1646 151 1637 144 b 1603 161 1620 144 1613 150 b 1502 315 1562 207 1525 258 b 1452 357 1490 344 1470 357 b 1397 320 1431 357 1411 344 b 1316 170 1368 271 1345 219 b 1280 127 1306 154 1303 127 b 1244 171 1256 127 1254 154 b 1145 337 1210 226 1179 282 b 1110 363 1135 354 1122 363 b 1070 338 1097 363 1084 354 b 1050 311 1063 330 1057 320 b 959 181 1017 271 992 223 b 939 167 950 173 945 167 b 920 184 933 167 927 173 b 818 343 887 238 852 291 b 759 395 795 377 778 395 b 701 344 742 395 724 377 b 698 338 700 341 700 340 b 544 154 652 272 605 207 b 412 98 501 117 458 98 b 304 130 377 98 341 108 b 95 373 204 187 144 275 b 58 426 85 393 82 428 b 19 366 26 426 26 389 b 0 307 13 346 0 327 b 4 287 0 300 1 294 b 174 36 49 194 91 102 b 360 -43 230 -9 289 -43 z',\n },\n ornamentPrecompDoubleCadenceUpperPrefixTurn: {\n x_min: 0,\n x_max: 1226,\n y_min: -237,\n y_max: 436,\n ha: 673,\n o: 'm 1279 -341 b 1293 -252 1293 -307 1295 -278 b 1277 36 1287 -156 1282 -59 l 1273 118 b 1318 176 1289 137 1303 157 b 1349 203 1332 193 1342 203 b 1378 168 1359 203 1367 192 b 1456 35 1401 122 1428 78 b 1511 -12 1476 3 1493 -12 b 1568 23 1526 -12 1544 0 b 1597 53 1578 32 1588 42 b 1705 186 1629 101 1669 143 b 1761 284 1728 216 1751 246 b 1765 300 1763 288 1765 295 b 1763 307 1765 302 1765 305 b 1737 302 1754 311 1744 308 b 1718 287 1729 298 1725 292 b 1598 145 1673 245 1637 194 b 1578 130 1590 135 1584 130 b 1557 147 1571 130 1565 135 b 1447 321 1516 202 1488 265 b 1403 351 1433 341 1417 351 b 1358 323 1388 351 1372 341 b 1269 209 1329 285 1299 248 b 1254 521 1264 314 1259 418 b 1228 616 1253 554 1247 588 b 1218 628 1224 621 1223 628 l 1215 628 b 1201 613 1210 626 1202 619 b 1200 600 1200 609 1200 605 l 1200 586 b 1211 348 1204 507 1207 428 b 1217 166 1214 288 1215 226 b 1202 181 1212 168 1208 174 b 1094 334 1168 233 1130 284 b 1048 366 1079 356 1064 366 b 1004 331 1034 366 1018 354 b 904 154 969 275 930 220 b 873 202 887 171 880 187 b 778 356 845 256 819 311 b 737 379 763 372 750 379 b 698 353 724 379 711 370 l 621 232 b 415 114 570 154 495 114 b 302 138 377 114 340 121 b 73 400 187 192 117 284 b 55 420 69 415 62 420 b 42 410 50 420 45 416 b 0 292 23 373 0 334 b 4 262 0 282 1 272 b 168 39 32 168 92 99 b 359 -26 225 -6 292 -26 b 585 76 446 -26 530 10 b 668 202 616 115 641 160 b 693 228 680 219 687 228 b 720 203 700 228 707 219 b 801 63 752 160 775 111 b 844 7 812 42 818 7 b 910 66 877 6 894 39 b 923 94 916 75 919 85 b 995 219 945 137 968 179 b 1025 184 1009 210 1017 197 b 1119 56 1054 141 1087 98 b 1166 20 1138 32 1152 20 b 1215 50 1181 20 1195 30 b 1221 56 1217 52 1218 55 b 1228 -163 1223 -17 1225 -89 b 1279 -341 1231 -223 1251 -278 z',\n },\n ornamentPrecompTrillLowerSuffix: {\n x_min: 0,\n x_max: 833,\n y_min: -309,\n y_max: 319,\n ha: 628,\n o: 'm 778 -444 b 801 -445 785 -444 793 -445 b 1037 -338 894 -445 969 -397 b 1200 37 1149 -240 1200 -109 b 1084 406 1200 171 1172 300 b 1024 444 1064 431 1043 444 b 960 390 999 444 978 426 b 841 163 923 314 886 236 b 812 128 832 150 827 128 b 786 167 796 130 793 153 b 660 418 744 251 716 341 b 599 459 639 445 619 459 b 541 410 577 459 557 444 b 439 197 507 340 474 269 b 422 179 435 190 435 179 b 338 393 392 251 379 328 b 275 439 320 423 298 439 b 212 396 253 439 230 425 b 71 219 170 333 128 268 b 0 45 17 173 16 112 b 68 98 32 62 50 78 b 194 264 112 150 153 209 b 230 292 209 282 219 292 b 264 261 240 292 251 282 b 274 242 268 255 269 248 b 346 46 304 179 325 112 b 376 10 351 32 354 10 b 412 35 392 10 403 22 b 452 107 429 56 441 82 b 541 291 481 168 511 230 b 556 307 547 302 552 307 b 573 295 562 307 567 302 b 624 217 595 272 611 246 b 721 1 657 145 685 72 b 755 -27 732 -19 742 -27 b 786 -16 765 -27 775 -24 b 857 73 819 7 840 39 b 952 256 887 134 920 194 b 978 289 963 279 969 289 b 1009 262 985 289 994 281 b 1030 235 1017 253 1024 245 b 1110 -4 1071 161 1099 81 b 1116 -68 1113 -26 1116 -48 b 1009 -243 1116 -140 1090 -200 b 848 -291 956 -272 901 -291 b 730 -261 809 -291 770 -282 b 696 -248 714 -252 703 -248 b 671 -284 684 -248 678 -258 l 662 -312 b 657 -357 658 -330 657 -344 b 744 -439 657 -403 683 -425 z',\n },\n brassScoop: {\n x_min: -0.4444444444444445,\n x_max: 312,\n y_min: -390,\n y_max: 28,\n ha: 418,\n o: 'm 0 -562 b 393 -256 171 -504 307 -412 b 449 -39 431 -189 449 -115 b 448 -1 449 -26 449 -14 b 433 40 446 14 448 40 b 408 -3 410 40 412 14 b 396 -66 403 -23 402 -46 b 45 -397 346 -243 209 -337 b 0 -451 13 -409 1 -423 b 0 -562 -1 -485 0 -520 z',\n },\n brassDoitMedium: {\n x_min: -0.32815253965710617,\n x_max: 476.21251177608565,\n y_min: -50,\n y_max: 333.1535583875376,\n ha: 383.1535583875376,\n o: 'm 16 -72 b 27 -71 19 -72 23 -72 b 215 -33 89 -56 153 -48 b 521 114 327 -7 435 35 b 685 432 615 199 691 295 b 670 480 684 449 688 475 b 642 441 654 482 648 456 b 403 183 599 321 513 240 b 79 89 301 130 192 105 b 0 -1 -12 76 0 76 b 0 -50 0 -17 1 -33 b 16 -72 0 -65 3 -72 z',\n },\n brassFallLipShort: {\n x_min: 0,\n x_max: 298,\n y_min: -344,\n y_max: 65,\n ha: 409,\n o: 'm 396 -495 b 420 -461 412 -487 418 -474 b 429 -382 428 -435 429 -409 b 426 -330 429 -364 428 -347 b 285 -6 410 -209 356 -104 b 98 94 239 59 173 94 b 39 86 79 94 58 92 b 0 49 20 81 0 73 l 0 -52 b 10 -69 0 -62 1 -69 b 20 -68 13 -69 16 -69 b 88 -56 45 -59 66 -56 b 261 -160 156 -56 213 -95 b 396 -495 333 -259 382 -369 z',\n },\n brassLiftMedium: {\n x_min: 0,\n x_max: 807,\n y_min: 0,\n y_max: 838,\n ha: 838,\n o: 'm 50 0 b 55 1 52 0 53 0 b 58 23 65 7 59 16 b 55 58 56 36 55 48 b 130 117 55 99 75 112 b 220 213 202 121 220 141 b 315 308 220 289 238 308 l 336 308 b 408 380 393 310 406 321 b 461 452 409 438 416 452 b 485 451 468 452 477 451 b 569 510 531 448 556 464 b 573 543 572 520 572 531 b 657 619 580 605 595 618 b 698 621 670 619 684 619 b 788 700 749 625 778 649 b 798 778 792 726 793 752 b 873 857 806 841 809 845 b 985 950 927 867 973 887 b 1084 1047 1002 1035 1004 1034 b 1162 1128 1133 1056 1162 1087 b 1146 1182 1162 1145 1158 1164 b 1125 1207 1140 1191 1136 1207 l 1122 1207 b 1110 1191 1113 1205 1110 1198 b 1112 1174 1110 1185 1112 1178 b 1048 1110 1109 1126 1096 1113 b 1028 1109 1043 1110 1035 1109 b 939 1022 969 1102 948 1081 b 845 922 929 949 917 936 b 746 812 773 909 753 886 b 744 780 744 802 744 791 b 635 681 737 700 717 683 b 524 583 553 680 536 665 b 439 510 514 520 503 510 b 357 431 377 510 360 492 l 357 406 b 314 364 356 379 343 364 b 238 361 288 364 264 364 b 173 300 202 357 180 334 b 167 245 168 281 167 262 b 105 174 166 192 157 180 b 75 171 95 173 85 171 b 6 112 30 166 14 153 b 0 73 1 98 0 85 b 37 10 0 45 13 26 b 50 0 42 7 46 0 z',\n },\n brassFallRoughMedium: {\n x_min: 0,\n x_max: 791,\n y_min: 0,\n y_max: 819,\n ha: 819,\n o: 'm 1117 0 b 1139 101 1129 26 1139 71 b 1138 121 1139 109 1139 115 b 1084 193 1125 171 1110 193 b 1044 183 1073 193 1060 189 b 1022 177 1035 179 1028 177 b 1007 209 1012 177 1008 186 b 876 324 1004 292 959 330 b 799 317 850 321 825 320 b 759 354 772 314 755 320 b 760 373 760 360 760 366 b 759 392 760 379 760 384 b 681 477 753 451 730 477 b 654 474 672 477 664 475 b 606 467 638 471 622 468 b 586 465 599 465 592 465 b 564 481 570 465 564 469 b 569 505 564 487 566 495 b 575 553 572 521 575 537 b 572 585 575 564 573 575 b 481 665 560 657 539 668 b 412 665 458 664 435 665 b 382 690 392 667 382 672 b 383 700 382 693 383 696 b 386 773 387 724 387 749 b 297 858 382 828 351 857 b 229 861 274 858 251 858 b 190 897 207 863 193 871 b 163 1012 186 936 180 976 b 79 1084 145 1050 124 1084 b 66 1083 75 1084 71 1083 b 43 1096 49 1081 43 1087 b 48 1112 43 1100 45 1106 b 53 1130 52 1119 53 1125 b 39 1169 53 1145 45 1158 b 26 1179 36 1175 30 1179 b 16 1171 22 1179 17 1176 b 0 1103 10 1149 0 1126 b 9 1067 0 1092 1 1079 b 91 1021 26 1031 52 1018 b 145 978 122 1024 141 1011 b 156 913 147 956 151 935 b 291 795 170 831 210 795 b 346 768 337 795 346 796 b 344 743 346 760 344 753 b 343 716 344 733 343 724 b 455 600 343 651 390 602 b 505 605 471 599 490 605 b 528 598 514 605 523 603 b 536 579 534 592 536 586 b 524 523 536 562 526 541 b 523 505 524 517 523 511 b 621 405 523 442 560 405 b 639 406 626 405 634 406 b 677 413 652 408 664 410 b 701 416 687 415 696 416 b 721 392 716 416 721 410 b 720 373 721 386 720 380 b 831 255 714 301 759 252 b 897 261 854 255 876 261 b 926 262 909 261 919 262 b 969 197 963 262 965 252 b 971 184 969 193 971 189 b 1031 115 979 137 998 115 b 1071 122 1043 115 1056 118 b 1096 130 1079 125 1086 127 b 1087 59 1094 107 1087 82 b 1117 0 1087 37 1094 17 z',\n },\n brassBend: {\n x_min: 0,\n x_max: 381,\n y_min: 0,\n y_max: 367,\n ha: 367,\n o: 'm 298 0 b 472 50 359 0 418 14 b 537 135 501 71 530 92 b 543 216 543 163 543 190 l 543 266 b 544 308 543 281 543 295 b 549 433 546 354 549 395 b 543 507 549 459 547 482 b 533 528 541 516 544 528 b 511 508 524 528 514 520 b 508 478 510 498 508 488 b 504 318 507 425 504 372 b 505 264 504 300 505 282 b 446 181 505 220 484 199 b 294 150 396 160 344 150 b 92 194 226 150 158 167 b 45 269 62 207 45 230 b 46 359 46 300 46 328 b 37 497 46 405 45 451 b 27 523 36 507 37 523 b 4 498 14 524 6 513 b 3 481 3 492 3 487 b 0 409 1 456 0 433 b 4 228 0 348 4 288 b 3 177 4 210 4 194 b 68 53 1 125 20 84 b 200 10 108 27 154 17 b 298 0 233 4 266 0 z',\n },\n brassMuteClosed: {\n x_min: 0,\n x_max: 274,\n y_min: 0,\n y_max: 260,\n ha: 260,\n o: 'm 203 0 b 209 1 206 0 207 0 b 216 13 215 4 216 9 l 215 27 l 215 153 b 216 161 216 156 216 158 b 372 164 268 163 318 164 b 395 184 383 164 395 166 l 395 189 b 357 229 392 209 386 229 b 219 228 311 229 265 228 l 223 310 b 209 357 225 328 219 344 b 189 374 203 364 197 374 b 184 373 187 374 186 373 b 177 359 179 372 177 366 l 177 348 l 173 222 l 39 222 b 0 206 12 222 0 219 b 10 174 0 199 3 189 b 46 157 19 157 30 157 b 108 160 68 158 88 160 b 171 161 130 161 150 161 l 167 58 b 184 16 167 40 171 26 b 203 0 192 12 196 0 z',\n },\n brassMuteOpen: {\n x_min: 1,\n x_max: 313.01193341111656,\n y_min: 0,\n y_max: 309,\n ha: 309,\n o: 'm 265 0 b 451 189 363 7 452 88 l 451 215 b 348 383 441 285 405 343 b 209 445 288 426 248 445 b 84 379 168 445 132 420 b 69 364 79 373 73 369 b 1 213 30 323 1 275 b 230 0 1 88 94 0 z m 210 62 b 128 73 181 62 154 66 b 40 171 71 91 42 125 b 52 226 40 187 45 206 b 197 374 79 295 130 344 b 228 382 207 380 217 382 b 300 361 252 382 276 370 b 374 308 328 350 353 331 b 410 223 397 284 410 253 b 393 163 410 202 405 181 b 210 62 354 91 288 63 z',\n },\n brassFlip: {\n x_min: 0,\n x_max: 402,\n y_min: 0,\n y_max: 361,\n ha: 361,\n o: 'm 579 0 b 511 153 579 68 557 117 b 52 504 359 271 206 387 b 29 520 45 510 39 520 b 20 517 26 520 23 518 b 0 477 3 510 0 494 l 0 125 b 17 20 1 92 1 56 b 40 84 37 40 40 60 b 42 287 40 151 42 219 l 42 363 z',\n },\n brassJazzTurn: {\n x_min: 0,\n x_max: 646,\n y_min: 0,\n y_max: 212,\n ha: 212,\n o: 'm 310 0 b 367 33 327 0 344 10 b 389 55 374 40 382 49 b 490 145 423 85 456 114 b 507 154 495 151 501 154 b 524 144 513 154 517 151 b 598 72 547 120 575 98 b 700 24 625 42 662 24 b 765 43 721 24 744 30 b 893 147 812 72 855 105 b 930 212 910 166 923 186 b 912 215 923 213 917 215 b 871 199 896 215 883 209 b 812 153 852 183 832 167 b 789 144 805 148 796 144 b 773 156 782 144 776 147 b 691 251 757 199 720 222 b 603 301 658 282 631 301 b 527 258 580 301 556 288 b 420 156 494 222 455 190 b 399 143 412 147 405 143 b 377 157 392 143 386 147 b 259 282 340 200 300 242 b 219 305 245 298 232 305 b 177 279 204 305 192 297 b 55 127 137 228 95 177 b 0 52 36 104 20 79 b 14 50 6 50 10 50 b 53 66 32 50 45 58 b 115 131 75 88 98 108 b 135 148 124 143 130 148 b 157 132 141 148 148 143 b 252 33 186 96 219 65 b 310 0 275 12 292 0 z',\n },\n brassSmear: {\n x_min: 0,\n x_max: 334,\n y_min: 0,\n y_max: 151,\n ha: 151,\n o: 'm 321 0 b 475 125 390 0 436 43 b 481 143 478 131 481 137 b 475 154 481 147 480 151 b 449 148 468 158 458 154 b 395 132 432 137 413 132 b 343 140 377 132 360 137 b 229 194 301 148 266 173 b 168 217 206 209 186 217 b 109 192 148 217 130 209 b 0 26 59 148 32 89 b 59 63 32 29 45 48 b 98 84 72 78 84 84 b 130 73 108 84 118 81 b 213 26 157 58 183 37 b 321 0 255 9 289 0 z',\n },\n stringsDownBow: {\n x_min: 0,\n x_max: 306,\n y_min: -0.09607201951262866,\n y_max: 366,\n ha: 366.09607201951263,\n o: 'm 405 0 b 425 17 413 -1 420 9 b 439 66 435 32 439 48 b 441 268 439 137 441 202 b 436 412 441 314 439 361 l 435 413 b 423 469 435 436 431 456 b 344 508 406 501 373 501 b 204 527 298 520 251 527 b 60 498 156 527 108 518 b 7 438 32 485 10 468 l 7 426 b 4 337 7 396 7 367 b 0 140 0 272 0 206 b 1 42 0 107 0 73 b 13 3 1 27 -3 4 b 40 39 29 3 35 24 b 42 53 42 43 40 49 b 49 141 48 84 49 112 b 48 215 49 167 48 192 b 49 252 48 228 48 240 l 49 312 b 130 343 72 331 99 340 b 206 347 156 346 180 347 b 372 314 262 347 318 338 l 390 307 l 390 245 b 390 138 392 212 390 176 b 397 23 390 101 392 62 b 405 0 399 14 393 1 z',\n },\n stringsUpBow: {\n x_min: 0,\n x_max: 219.2842808242076,\n y_min: 0,\n y_max: 489,\n ha: 489,\n o: 'm 151 0 b 184 42 170 12 180 26 b 297 554 223 212 261 382 b 315 690 305 598 318 645 b 304 704 315 697 311 704 b 276 670 288 704 282 697 b 157 131 236 490 196 311 l 157 144 b 73 526 134 276 104 396 b 30 677 60 576 52 638 b 13 694 26 684 22 694 b 0 674 9 694 0 691 l 0 671 b 10 603 3 649 6 626 b 105 174 42 461 72 317 b 150 0 117 117 128 58 z',\n },\n stringsHarmonic: {\n x_min: 0,\n x_max: 191,\n y_min: 0,\n y_max: 202,\n ha: 202,\n o: 'm 143 0 b 275 122 217 0 275 53 b 127 291 275 206 202 291 b 0 154 63 291 0 222 b 143 0 0 76 71 0 z m 122 68 b 43 105 89 66 59 75 b 39 124 40 111 39 117 b 79 199 39 148 56 180 b 145 226 101 216 122 226 b 199 210 163 226 180 220 b 235 150 223 196 235 173 b 203 92 235 128 225 107 b 122 68 181 76 150 68 z',\n },\n pluckedSnapPizzicatoAbove: {\n x_min: 0,\n x_max: 201,\n y_min: 0,\n y_max: 325,\n ha: 325,\n o: 'm 171 0 b 289 99 240 0 289 45 b 258 183 289 130 274 156 b 174 269 236 217 203 240 l 174 408 b 174 429 174 415 176 422 b 131 468 168 451 153 468 b 117 451 120 468 117 461 b 118 429 117 444 118 435 b 115 307 117 389 115 347 b 0 166 59 295 0 223 b 171 0 0 85 89 0 z m 134 55 b 52 131 84 55 52 85 b 115 233 52 179 81 209 b 114 192 114 220 114 206 b 174 120 114 137 114 137 l 174 228 b 233 148 200 207 223 183 b 236 130 235 143 236 135 b 197 72 236 105 223 85 b 134 55 177 60 157 55 z',\n },\n pluckedSnapPizzicatoBelow: {\n x_min: 0,\n x_max: 211,\n y_min: 0,\n y_max: 307,\n ha: 307,\n o: 'm 145 7 b 163 0 153 3 158 0 b 173 23 170 0 173 7 l 173 140 l 170 140 l 170 163 l 171 163 b 206 170 179 164 193 166 b 304 287 264 186 304 233 b 281 354 304 308 297 333 b 118 442 240 412 186 439 b 0 324 69 442 0 370 b 115 176 0 266 55 202 l 115 56 b 145 7 114 33 125 19 z m 115 220 b 62 256 92 223 73 230 b 53 292 56 269 53 281 b 78 344 53 311 60 328 b 168 384 105 372 135 384 b 213 376 183 384 199 382 b 253 321 239 366 253 346 b 246 291 253 311 251 301 b 170 226 230 256 203 236 l 170 258 b 148 305 171 278 163 292 b 128 315 143 310 135 315 l 124 315 b 115 301 117 314 115 308 z',\n },\n pluckedLeftHandPizzicato: {\n x_min: 0,\n x_max: 271,\n y_min: 0,\n y_max: 284,\n ha: 284,\n o: 'm 213 0 b 223 14 222 0 223 7 b 222 35 223 22 222 29 l 222 176 b 373 170 272 174 323 170 b 390 180 382 170 390 171 l 390 184 b 347 232 386 207 382 232 b 219 238 307 233 266 235 l 219 364 b 171 409 219 395 193 409 b 156 393 160 409 156 402 b 158 370 156 384 158 376 l 158 240 b 16 239 115 240 66 239 b 0 226 7 239 0 238 l 0 223 b 50 179 1 203 29 179 b 158 177 86 179 122 179 l 158 63 b 161 29 158 52 158 40 b 213 0 166 -1 194 1 z',\n },\n keyboardPedalPed: {\n x_min: 0,\n x_max: 944,\n y_min: -13,\n y_max: 550,\n ha: 563,\n o: 'm 22 0 b 109 78 53 0 105 46 l 144 333 b 163 376 147 347 140 372 b 364 465 238 390 301 426 b 454 599 416 497 454 540 b 452 618 454 605 454 612 b 320 770 442 694 396 747 b 248 779 295 778 272 779 b 193 778 229 779 212 779 b 160 780 181 778 167 775 b 137 792 153 789 144 791 b 109 789 128 792 118 789 b 7 719 59 789 48 737 b 23 708 16 714 20 708 b 36 710 29 710 33 710 b 53 684 52 710 53 698 l 53 674 b 43 386 53 577 53 482 b 20 164 36 312 30 238 b 1 30 14 120 7 75 b 0 19 0 26 0 22 b 22 0 0 9 4 0 z m 171 425 b 156 442 160 425 156 429 b 157 475 157 452 157 464 b 164 602 161 517 164 560 b 161 698 164 635 163 667 b 184 729 161 720 167 729 l 193 729 b 348 563 278 719 348 641 b 346 539 348 554 347 547 b 171 425 328 459 229 422 z m 979 6 b 1008 13 986 6 995 9 b 1081 101 1047 29 1079 46 b 1116 449 1087 217 1104 333 b 1143 654 1123 518 1133 586 b 1148 685 1145 664 1148 675 b 1140 704 1148 693 1146 700 b 1107 716 1130 713 1119 716 b 1056 706 1092 716 1073 710 b 1037 671 1035 703 1038 685 b 1004 439 1025 595 1014 517 b 986 419 1001 428 999 419 b 979 419 985 419 982 420 b 935 426 965 423 949 425 b 795 376 884 426 838 405 b 664 153 714 323 664 249 b 665 130 664 145 665 138 b 753 29 671 65 704 29 b 815 40 773 29 792 33 b 975 147 873 65 923 101 b 965 45 971 108 968 76 b 979 6 963 17 966 6 z m 393 -17 b 634 145 494 16 579 52 b 638 160 636 151 638 156 b 625 168 638 166 634 168 b 621 167 624 168 622 168 b 524 118 582 164 544 160 b 495 79 517 104 505 92 b 435 33 471 49 452 33 b 380 96 416 33 397 55 b 369 145 373 114 369 131 b 442 225 369 186 395 213 b 468 232 451 228 459 229 b 654 344 539 255 606 285 b 677 395 667 360 677 376 b 672 415 677 402 675 408 b 612 459 661 442 639 455 b 589 461 602 461 592 461 b 348 328 500 461 409 408 b 269 120 302 268 269 199 b 379 -19 269 45 318 -19 b 393 -17 383 -19 389 -19 z m 395 240 b 494 383 418 300 452 344 l 521 405 b 544 419 528 409 536 418 b 554 415 547 419 550 418 b 570 383 564 406 570 396 l 570 379 b 552 331 570 360 562 344 b 395 240 511 285 462 253 z m 827 89 b 792 111 815 89 804 96 b 766 204 775 131 766 158 b 845 360 772 256 799 314 b 871 372 854 369 863 372 b 897 366 880 372 888 369 b 978 279 942 353 963 320 b 976 259 981 272 981 265 b 858 104 942 203 909 147 b 827 89 847 94 837 89 z m 1282 12 b 1336 35 1303 14 1320 23 b 1359 71 1351 45 1359 58 b 1338 102 1359 82 1352 95 b 1254 130 1312 118 1284 130 b 1187 88 1223 130 1202 109 b 1178 65 1182 81 1178 72 b 1195 37 1178 55 1182 45 b 1282 12 1223 23 1253 19 z',\n },\n keyboardPedalUp: {\n x_min: 0,\n x_max: 436.6015132318337,\n y_min: 0,\n y_max: 461,\n ha: 461,\n o: 'm 330 0 b 334 1 331 0 333 0 b 340 12 338 4 340 7 l 338 26 b 340 264 338 105 338 184 b 526 95 400 206 461 148 b 559 71 536 88 547 71 b 564 72 560 71 563 71 b 580 121 580 79 580 102 l 580 127 b 543 203 585 158 573 184 b 472 259 518 219 495 238 l 445 285 b 590 292 494 288 541 291 b 622 318 609 294 618 302 b 628 359 625 331 626 346 b 586 402 632 393 621 405 b 464 395 546 399 504 396 l 559 491 b 567 524 567 500 567 510 b 564 543 567 527 567 536 b 539 596 559 563 560 590 b 494 564 521 600 508 577 b 340 413 442 514 390 464 l 340 560 b 287 664 340 600 321 632 b 271 518 274 612 272 566 b 268 445 269 494 269 469 b 117 569 219 488 168 530 b 96 579 109 575 102 579 b 85 560 89 579 85 573 b 124 446 85 518 82 477 b 209 380 153 426 181 403 b 45 374 154 377 99 376 b 0 324 9 374 0 359 b 63 266 0 265 1 265 b 144 272 89 269 117 272 l 196 272 b 108 193 167 246 138 219 b 60 135 76 164 60 151 b 99 73 60 121 73 105 b 104 68 101 72 102 71 b 114 58 107 60 111 58 b 130 66 120 58 124 62 b 259 186 173 107 217 145 b 256 117 259 163 256 140 b 311 13 256 72 271 37 b 330 0 317 10 323 0 z',\n },\n pictChokeCymbal: {\n x_min: 1,\n x_max: 147,\n y_min: 0,\n y_max: 242,\n ha: 242,\n o: 'm 79 4 b 207 158 153 32 192 88 b 212 200 210 173 212 187 b 143 336 212 253 187 298 b 98 348 131 344 115 348 b 4 295 60 348 16 327 b 1 276 1 289 1 282 b 9 249 1 266 3 258 b 121 183 35 206 72 183 b 156 186 132 183 144 183 b 26 53 134 115 91 73 b 7 39 13 49 7 45 b 19 20 7 33 12 27 b 59 0 30 9 43 0 b 79 4 65 0 72 1 z',\n },\n wiggleArpeggiatoUp: {\n x_min: -22,\n x_max: 300,\n y_min: 0,\n y_max: 176,\n ha: 176,\n o: 'm 173 4 b 196 0 180 1 189 0 b 246 26 215 0 230 9 b 301 117 271 53 285 85 b 312 131 305 125 307 131 b 327 124 315 131 321 128 b 373 86 341 112 353 101 b 412 69 389 75 402 69 b 432 94 425 69 432 79 b 373 181 432 117 413 154 b 235 252 323 216 285 245 b 220 253 229 253 225 253 b 168 215 196 253 181 240 b 111 112 151 180 140 141 b 94 102 105 105 99 102 b 78 111 89 102 84 105 b 0 181 55 135 35 160 b -32 153 -20 194 -32 168 b 0 86 -32 124 -32 109 b 94 36 22 71 73 46 b 173 4 134 16 131 17 z',\n },\n arpeggiatoUp: {\n x_min: 0,\n x_max: 262,\n y_min: 0,\n y_max: 1459,\n ha: 1459,\n o: 'm 190 0 b 160 63 187 29 170 45 b 145 108 150 81 145 95 b 183 163 145 128 157 145 b 300 246 222 190 262 216 b 347 318 333 272 347 295 b 301 393 347 341 331 364 b 258 413 289 403 272 408 b 145 449 220 425 183 436 b 117 464 135 452 120 452 b 140 491 115 477 128 484 b 294 593 192 526 243 557 b 330 647 318 611 330 626 b 314 693 330 660 324 675 b 262 736 302 714 285 729 b 170 763 230 744 200 753 b 122 783 153 768 125 768 b 160 831 120 804 143 818 b 288 922 202 861 246 890 b 333 999 318 945 333 972 b 266 1083 333 1032 310 1064 b 189 1115 240 1094 215 1103 b 122 1178 145 1133 122 1153 b 168 1250 122 1200 138 1223 l 180 1257 b 269 1333 210 1283 240 1306 b 305 1405 294 1356 305 1381 b 284 1469 305 1426 298 1447 b 228 1525 269 1492 251 1511 b 183 1600 197 1545 183 1571 b 190 1640 183 1613 184 1626 b 197 1670 193 1650 194 1660 b 272 1735 213 1719 230 1735 b 295 1734 279 1735 287 1735 b 323 1732 305 1732 314 1732 b 350 1731 333 1732 341 1732 b 377 1742 369 1729 377 1732 b 370 1761 377 1747 374 1754 l 301 1898 b 217 2066 274 1954 248 2012 b 186 2101 204 2089 196 2101 b 154 2069 177 2101 167 2091 b 12 1824 105 1987 59 1907 b 0 1787 4 1810 0 1797 b 59 1744 0 1761 20 1745 b 160 1738 92 1744 125 1740 b 145 1692 156 1721 151 1706 b 135 1633 138 1672 135 1652 b 184 1518 135 1591 151 1552 b 229 1475 199 1503 213 1488 b 259 1431 249 1456 259 1444 b 229 1388 259 1420 249 1407 b 151 1325 203 1365 177 1345 b 105 1279 134 1310 118 1296 b 73 1202 84 1251 73 1227 b 108 1123 73 1176 85 1152 b 255 1031 148 1077 199 1051 b 282 1014 274 1025 282 1021 b 262 991 282 1008 275 1001 b 151 914 226 963 189 939 b 79 851 125 896 99 877 b 63 809 69 837 63 824 b 79 769 63 796 68 783 b 202 697 111 729 154 710 b 266 670 225 690 266 688 b 210 622 266 648 232 635 b 82 534 167 593 120 570 b 55 491 63 518 55 505 b 79 448 55 478 63 465 b 255 361 127 395 192 380 b 288 343 269 359 288 357 b 266 312 288 331 275 320 b 144 223 229 278 184 253 b 85 134 104 193 85 166 b 118 53 85 111 96 85 b 190 0 135 29 160 14 z',\n },\n arpeggiatoDown: {\n x_min: 0,\n x_max: 218,\n y_min: 0,\n y_max: 1440,\n ha: 1440,\n o: 'm 161 16 b 310 261 210 98 259 180 b 314 275 312 266 314 271 b 302 295 314 282 310 289 b 252 311 287 308 269 311 b 217 310 240 311 229 310 b 190 333 202 310 194 315 b 151 412 186 363 171 389 b 102 501 120 452 102 477 b 150 588 102 524 118 547 b 161 603 154 592 158 598 b 181 661 176 622 181 641 b 173 704 181 675 179 690 b 86 795 156 746 121 770 b 53 829 63 811 53 819 b 78 868 53 840 62 851 b 102 888 85 876 94 883 b 180 956 128 912 156 933 b 216 1028 204 979 216 1002 b 203 1081 216 1044 212 1061 b 115 1171 186 1123 148 1145 b 75 1221 88 1191 75 1207 b 114 1272 75 1237 88 1251 b 173 1308 132 1284 154 1296 b 226 1339 190 1318 209 1328 b 265 1405 253 1359 265 1380 b 258 1447 265 1418 264 1431 b 154 1541 242 1499 199 1521 b 109 1581 124 1555 109 1567 b 141 1627 109 1594 121 1608 b 204 1680 163 1646 184 1662 b 233 1742 223 1699 233 1719 b 226 1777 233 1752 230 1764 b 135 1862 210 1822 173 1840 b 104 1895 114 1875 104 1884 b 118 1930 104 1904 109 1914 b 192 2006 135 1961 161 1986 b 206 2029 203 2013 206 2022 b 192 2064 206 2040 197 2052 b 180 2074 187 2071 184 2074 b 156 2061 171 2074 163 2065 b 84 1983 125 2040 102 2013 b 65 1921 71 1961 65 1941 b 88 1853 65 1899 72 1876 b 171 1784 108 1820 138 1801 b 190 1764 184 1777 190 1770 b 174 1741 190 1757 184 1750 b 107 1683 153 1722 128 1704 b 68 1610 81 1659 68 1636 b 88 1548 68 1591 75 1571 b 177 1470 109 1512 141 1489 b 223 1431 209 1453 223 1443 b 179 1390 223 1420 209 1408 b 128 1361 163 1380 145 1371 b 71 1322 108 1348 88 1338 b 32 1253 45 1300 32 1277 b 48 1198 32 1236 37 1218 b 147 1090 71 1152 108 1120 b 174 1057 166 1076 174 1067 b 153 1022 174 1047 167 1037 b 109 982 140 1008 124 995 b 37 919 85 962 59 942 b 9 860 17 899 9 880 b 26 806 9 844 14 827 b 120 717 50 769 84 740 b 138 691 132 708 138 700 b 130 668 138 684 135 677 b 92 618 118 651 105 635 b 59 531 71 589 59 560 b 84 455 59 507 68 481 b 132 386 98 431 115 408 b 148 341 144 372 148 357 b 144 317 148 333 147 324 b 121 305 140 307 131 305 l 98 305 b 82 304 94 304 88 304 l 32 304 b 0 292 10 304 0 302 b 12 266 0 287 4 279 b 60 164 32 233 46 199 b 127 20 84 117 105 68 b 144 0 132 9 137 0 b 161 16 150 0 154 4 z',\n },\n repeat1Bar: {\n x_min: 0,\n x_max: 599.1057280164835,\n y_min: -250,\n y_max: 175,\n ha: 425,\n o: 'm 216 98 b 255 75 236 84 246 75 b 291 104 265 75 274 85 b 323 147 304 117 327 125 b 289 215 323 168 314 184 b 238 252 269 239 253 252 b 187 222 222 252 207 242 b 173 206 183 216 177 212 b 157 170 163 194 157 183 b 174 138 157 160 161 150 b 216 98 189 127 200 109 z m 76 -334 b 181 -285 111 -315 148 -302 b 831 52 396 -168 613 -58 b 863 114 855 63 864 82 b 828 202 855 140 855 176 b 808 213 821 209 815 213 b 793 209 804 213 799 212 l 422 19 b 26 -179 291 -48 164 -124 b 0 -213 10 -186 0 -196 b 3 -232 0 -219 0 -225 b 52 -325 14 -265 37 -294 b 66 -337 55 -331 59 -337 b 76 -334 69 -337 72 -336 z m 769 -360 b 829 -264 779 -360 829 -284 b 769 -176 822 -232 799 -200 b 742 -163 760 -167 750 -163 b 716 -184 733 -163 723 -168 b 683 -228 708 -202 693 -213 b 672 -253 675 -236 672 -245 b 683 -281 672 -262 675 -271 b 752 -353 703 -308 732 -327 b 769 -360 756 -357 763 -360 z',\n },\n repeat2Bars: {\n x_min: 0.008571918423331715,\n x_max: 775,\n y_min: -246.92374029115243,\n y_max: 362.82068246705313,\n ha: 609.7444227582056,\n o: 'm 909 412 b 873 351 906 384 893 367 b 436 50 729 249 585 147 l 91 -179 b 62 -174 76 -189 68 -183 b 12 -96 48 -147 24 -125 b 36 -16 -7 -53 -6 -43 b 220 104 96 24 158 65 b 819 507 425 232 624 369 b 881 495 852 530 861 528 b 909 412 899 469 900 439 z m 333 338 b 302 240 330 307 317 274 b 276 235 297 225 287 228 l 233 269 b 203 376 186 307 183 318 b 225 441 212 397 217 419 b 246 454 228 452 232 458 b 333 338 284 441 333 380 z m 1116 228 b 1067 158 1115 192 1092 174 b 910 59 1015 125 963 92 b 478 -240 762 -33 622 -140 b 311 -350 423 -279 366 -314 b 285 -344 298 -360 289 -356 b 239 -258 272 -314 251 -288 b 261 -196 228 -228 235 -210 b 517 -29 348 -144 436 -91 b 1030 321 681 98 861 202 b 1093 307 1060 343 1076 340 b 1116 228 1107 281 1109 252 z m 1070 -105 b 1020 -210 1057 -143 1038 -176 b 998 -210 1014 -219 1004 -215 l 924 -153 b 913 -88 899 -135 897 -112 b 949 -22 926 -66 939 -45 b 998 -7 960 6 976 9 b 1070 -105 1032 -32 1058 -63 z',\n },\n repeat4Bars: {\n x_min: 0,\n x_max: 1374,\n y_min: -304,\n y_max: 304,\n ha: 608,\n o: 'm 78 -266 b 92 -258 82 -266 88 -264 b 114 -240 98 -251 107 -246 b 638 107 289 -125 467 -14 b 873 271 716 161 793 216 b 907 337 894 285 906 305 b 887 400 901 354 897 379 b 852 438 877 426 867 438 b 814 420 842 438 829 432 b 135 -33 592 262 366 111 b 12 -121 92 -60 48 -84 b 0 -144 4 -128 0 -135 b 4 -160 0 -148 1 -154 b 63 -255 17 -196 45 -223 b 78 -266 68 -262 72 -266 z m 291 148 b 325 223 302 148 308 170 b 333 256 328 235 330 246 b 264 363 330 305 298 336 b 242 373 255 369 248 373 b 220 347 232 373 225 364 b 202 288 216 327 213 305 b 190 252 193 275 190 262 b 222 200 190 232 202 215 b 291 148 264 170 279 148 z m 815 -367 b 829 -359 819 -367 824 -364 b 851 -343 835 -353 844 -347 b 1375 6 1027 -228 1205 -117 l 1610 170 b 1644 235 1632 184 1643 203 b 1626 300 1639 253 1634 276 b 1590 337 1614 325 1604 337 b 1551 320 1580 337 1567 330 b 873 -135 1329 161 1103 10 b 749 -222 829 -161 785 -184 b 737 -245 742 -230 737 -238 b 742 -261 737 -249 739 -255 b 802 -357 755 -297 782 -325 b 815 -367 805 -363 809 -367 z m 396 -360 b 408 -356 400 -360 403 -359 b 609 -223 471 -307 543 -269 b 896 -19 706 -156 795 -81 b 1164 154 985 37 1074 96 b 1214 223 1189 170 1211 187 b 1176 321 1204 253 1205 292 b 1159 330 1169 327 1165 330 b 1145 324 1155 330 1151 328 b 1048 258 1113 302 1081 278 b 357 -202 809 117 598 -65 b 333 -238 341 -212 333 -223 b 338 -262 333 -245 334 -253 b 384 -350 350 -294 372 -318 b 396 -360 386 -354 390 -360 z m 1162 -438 b 1174 -433 1166 -438 1169 -436 b 1374 -300 1237 -384 1309 -346 b 1660 -96 1470 -233 1561 -158 b 1930 76 1751 -39 1840 19 b 1979 147 1954 92 1977 109 b 1943 243 1968 177 1971 216 b 1924 253 1935 251 1930 253 b 1911 248 1920 253 1915 252 b 1814 181 1878 225 1848 202 b 1123 -279 1575 40 1364 -141 b 1099 -315 1106 -289 1099 -300 b 1103 -338 1099 -321 1100 -330 b 1149 -426 1115 -370 1138 -396 b 1162 -438 1151 -432 1156 -438 z m 1875 -295 b 1882 -291 1878 -295 1879 -294 b 1934 -189 1904 -258 1921 -223 b 1872 -96 1925 -147 1901 -120 b 1840 -78 1858 -84 1848 -78 b 1812 -109 1830 -78 1823 -88 l 1777 -173 b 1770 -199 1773 -181 1770 -190 b 1786 -230 1770 -210 1774 -220 b 1862 -289 1809 -253 1837 -269 b 1875 -295 1865 -292 1871 -295 z',\n },\n repeatBarSlash: {\n x_min: 0,\n x_max: 630,\n y_min: -225.19160170741762,\n y_max: 265.12618221237005,\n ha: 490.31778391978764,\n o: 'm 78 -324 b 92 -314 82 -325 88 -321 b 114 -298 96 -307 107 -302 b 638 49 289 -183 467 -72 b 873 215 716 104 792 161 b 907 279 894 229 906 248 b 887 344 901 298 897 321 b 852 382 877 369 867 380 b 814 363 842 383 829 376 b 135 -91 603 192 364 55 b 12 -177 92 -118 45 -137 b 0 -202 4 -186 0 -192 b 4 -217 0 -206 1 -212 b 63 -312 17 -253 42 -284 b 78 -324 68 -318 72 -323 z',\n },\n csymDiminished: {\n x_min: 0,\n x_max: 506,\n y_min: -0.011036179317259481,\n y_max: 500,\n ha: 500.0110361793173,\n o: 'm 397 0 b 729 265 576 -1 729 95 b 711 367 729 297 723 331 b 472 670 668 498 586 595 b 315 720 423 701 372 720 b 253 713 295 720 275 719 b 32 514 144 687 75 615 b 0 374 12 468 0 420 b 27 251 0 333 9 292 b 140 117 52 196 92 153 b 397 0 223 52 317 4 z m 340 95 b 132 314 233 84 122 216 b 324 589 145 438 200 539 b 415 611 360 603 389 611 b 544 505 469 611 505 576 b 590 392 564 471 583 432 b 596 343 593 374 596 359 b 340 95 596 210 485 96 z',\n },\n csymHalfDiminished: {\n x_min: -32,\n x_max: 496,\n y_min: -33,\n y_max: 492,\n ha: 525,\n o: 'm -29 -48 b 0 -36 -19 -48 -9 -40 b 17 -20 7 -32 12 -24 b 134 94 56 19 95 56 b 372 0 207 43 282 0 b 455 13 397 0 426 4 b 677 258 556 45 671 141 b 678 289 677 268 678 278 b 593 539 678 380 654 467 b 592 541 593 540 592 540 l 684 632 b 713 678 700 647 711 665 b 714 691 714 684 714 688 b 707 704 714 698 711 701 b 691 708 701 707 696 708 b 660 691 680 708 670 701 l 552 585 b 478 634 530 606 507 624 b 361 684 438 648 397 661 b 301 703 341 697 320 703 b 226 677 275 703 251 693 b 27 449 140 618 72 543 b 0 324 9 410 -4 370 b 88 128 -1 243 30 177 b -30 -7 43 86 0 46 b -46 -33 -35 -16 -46 -24 b -42 -42 -46 -36 -45 -39 b -29 -48 -37 -46 -33 -48 z m 141 179 b 121 251 128 200 121 225 b 128 297 121 265 124 281 b 351 575 163 420 248 505 b 377 582 359 579 369 580 b 501 536 422 586 468 567 b 141 179 382 416 261 298 z m 281 105 b 179 137 240 105 206 117 b 210 168 189 147 200 157 l 537 487 b 547 455 541 477 544 467 b 556 370 552 426 556 397 b 429 154 556 274 503 207 b 281 105 384 122 336 105 z',\n },\n csymAugmented: {\n x_min: 0,\n x_max: 530,\n y_min: 0,\n y_max: 539,\n ha: 539,\n o: 'm 380 0 b 393 14 384 4 390 9 b 397 46 397 24 397 36 l 397 333 b 736 327 511 331 624 330 b 763 343 755 327 763 333 b 755 361 763 348 760 354 b 635 431 726 402 688 431 l 390 431 l 390 485 b 386 606 392 526 386 566 b 392 664 386 625 387 645 b 395 690 393 672 395 681 b 376 753 395 711 389 734 b 357 776 372 762 369 776 b 350 775 354 776 353 776 b 327 740 337 769 327 759 b 327 621 328 700 327 661 b 330 438 328 559 328 498 l 29 438 b 4 431 20 438 7 442 b 0 413 3 425 0 419 b 7 399 0 408 1 403 b 131 338 45 369 85 340 b 331 334 199 336 265 334 b 333 163 333 276 333 220 b 366 13 333 109 348 63 b 380 0 367 7 374 4 z',\n },\n csymMajorSeventh: {\n x_min: 0,\n x_max: 593.1050509327923,\n y_min: 0,\n y_max: 569,\n ha: 569,\n o: 'm 124 1 l 497 27 b 819 50 605 35 711 43 b 854 98 847 52 855 63 b 812 200 845 128 835 166 b 564 585 730 328 648 456 b 435 786 521 652 480 720 b 397 819 419 809 408 819 b 369 792 387 819 379 811 b 7 173 248 585 128 379 b 0 150 3 166 0 158 b 7 128 0 143 3 135 b 89 10 30 86 65 50 b 109 0 95 1 102 0 z m 163 147 b 153 153 158 147 156 148 b 164 179 147 163 158 170 b 426 644 251 334 338 488 b 442 660 432 655 436 660 b 458 645 446 660 452 655 b 727 220 547 503 636 361 b 736 202 732 213 736 206 b 714 190 736 196 730 192 b 179 148 537 177 359 163 b 163 147 174 150 168 147 z',\n },\n csymMinor: {\n x_min: 0,\n x_max: 481.64484584675915,\n y_min: 193,\n y_max: 265.20435472429375,\n ha: 72.20435472429375,\n o: 'm 168 278 b 197 279 177 278 187 278 b 431 292 275 287 353 288 l 431 291 b 661 302 508 295 585 300 b 693 311 672 304 688 300 b 674 346 697 324 685 338 b 564 382 641 366 606 384 l 27 360 b 0 347 17 360 1 366 b 19 314 0 333 3 321 b 168 278 66 291 115 278 z',\n },\n csymParensLeftTall: {\n x_min: 0,\n x_max: 185,\n y_min: 0,\n y_max: 1034,\n ha: 1034,\n o: 'm 215 0 b 226 17 223 1 223 10 b 229 37 229 24 229 32 b 220 81 229 52 225 66 b 167 203 206 124 181 160 b 86 616 124 338 89 474 b 82 765 85 665 82 716 b 91 886 82 805 84 845 b 245 1319 120 1038 171 1184 b 266 1397 259 1346 266 1371 b 259 1443 266 1411 264 1427 b 226 1489 253 1463 248 1489 b 193 1454 212 1489 203 1467 b 114 1292 158 1404 140 1346 b 0 806 40 1138 0 978 b 3 721 0 779 0 750 b 1 677 1 707 1 693 b 36 418 1 593 16 504 b 144 96 62 307 95 199 b 196 12 158 66 179 39 b 212 0 200 7 204 0 z',\n },\n csymParensRightTall: {\n x_min: -40,\n x_max: 188.5411603861406,\n y_min: 0.20204102886728756,\n y_max: 1058,\n ha: 1057.7979589711326,\n o: 'm 30 1 b 63 14 42 -3 55 6 b 122 99 86 40 108 68 b 189 258 145 153 166 204 b 271 667 239 379 268 503 b 246 852 275 708 261 780 b 10 1495 197 1077 128 1295 b -14 1524 4 1505 1 1524 b -16 1522 -14 1524 -16 1524 b -46 1489 -33 1521 -43 1503 b -58 1417 -53 1464 -58 1440 b -36 1335 -58 1390 -52 1364 b 68 1138 0 1270 35 1204 b 163 883 108 1056 137 969 b 206 668 184 814 200 742 b 207 631 207 655 207 642 b 166 426 207 560 192 492 b 46 143 130 330 111 228 b 19 29 19 109 17 69 b 30 1 20 19 24 3 z',\n },\n csymBracketLeftTall: {\n x_min: 0,\n x_max: 328,\n y_min: 2,\n y_max: 807,\n ha: 805,\n o: 'm 68 3 b 76 4 71 3 73 3 b 186 13 112 12 150 13 b 240 13 204 13 222 13 l 287 13 b 379 17 317 13 348 13 b 472 121 435 24 472 69 b 467 156 472 132 469 144 b 446 174 462 168 456 174 l 439 174 b 327 166 402 167 364 166 b 265 167 307 166 285 167 l 209 167 b 187 475 199 269 189 372 b 166 985 186 645 187 815 l 377 1002 b 415 1001 389 1002 402 1001 b 456 1027 432 1001 448 1005 b 472 1096 467 1048 472 1073 b 464 1146 472 1113 469 1130 b 439 1162 459 1161 452 1162 b 40 1129 305 1151 173 1139 b 1 1093 17 1128 1 1120 b 0 1009 0 1064 0 1037 b 13 975 0 991 3 981 b 30 670 23 873 30 772 b 29 608 30 649 29 628 l 29 563 b 56 88 29 405 49 246 b 53 22 55 66 55 43 b 68 3 53 12 56 3 z',\n },\n csymBracketRightTall: {\n x_min: 0.8519422934604696,\n x_max: 306,\n y_min: -0.17180889215212544,\n y_max: 829.1037519824849,\n ha: 829.2755608746371,\n o: 'm 117 0 b 372 29 203 -3 287 20 l 373 29 b 406 32 383 30 395 30 b 436 60 428 33 432 43 b 441 109 439 76 441 92 b 433 200 441 140 436 170 b 409 696 422 366 409 530 b 416 887 409 763 416 831 b 415 920 416 899 415 910 l 415 1106 b 412 1135 415 1116 415 1126 l 412 1145 b 373 1189 413 1171 408 1192 b 321 1189 356 1189 338 1189 l 215 1189 l 215 1194 l 56 1194 b 6 1153 27 1195 10 1187 b 1 1064 3 1123 4 1093 b 22 1043 0 1050 6 1043 b 84 1044 42 1044 63 1044 b 264 1038 144 1044 203 1040 b 265 958 264 1011 265 985 b 262 845 265 920 264 883 b 259 710 259 801 259 755 b 279 243 259 554 271 399 b 285 170 281 219 284 194 b 95 151 222 161 158 156 b 29 81 27 147 27 147 l 29 73 b 105 0 33 0 33 0 z',\n },\n csymParensLeftVeryTall: {\n x_min: 0,\n x_max: 116,\n y_min: 0,\n y_max: 934.1531437146923,\n ha: 934.1531437146923,\n o: 'm 128 0 b 147 17 137 0 144 9 b 167 102 160 45 167 73 b 158 154 167 120 164 137 b 117 307 141 204 130 256 b 63 698 84 435 71 567 b 62 788 62 729 62 757 b 69 916 62 829 63 873 b 109 1172 81 1001 94 1087 b 132 1320 118 1221 137 1269 b 124 1345 131 1329 134 1342 b 96 1332 114 1346 102 1341 b 71 1269 82 1313 75 1292 b 39 1104 59 1214 48 1159 b 0 742 19 988 0 871 b 10 559 3 688 6 624 b 58 226 16 446 33 336 b 112 20 73 157 94 89 b 128 0 115 13 118 0 z',\n },\n csymParensRightVeryTall: {\n x_min: -20,\n x_max: 111.4332498248095,\n y_min: -0.07657185734616112,\n y_max: 1009,\n ha: 1009.0765718573462,\n o: 'm -3 0 b 20 22 9 -1 14 12 b 36 56 26 33 32 45 b 99 274 58 128 84 199 b 160 788 135 439 163 605 b 122 1181 164 912 145 1047 b 50 1431 108 1267 86 1351 b 36 1453 48 1439 46 1453 l 35 1453 l 30 1453 b 7 1423 17 1449 7 1440 b 27 1287 9 1377 10 1331 b 96 963 71 1184 85 1074 b 105 818 102 914 105 867 b 91 624 105 753 99 688 b -4 213 72 484 48 344 b -29 101 -19 174 -29 138 b -16 27 -29 76 -24 52 b -3 0 -13 17 -14 3 z',\n },\n csymDiagonalArrangementSlash: {\n x_min: -0.19862981551275186,\n x_max: 990,\n y_min: -26.946823529189132,\n y_max: 1027.5514326488437,\n ha: 1054.4982561780328,\n o: 'm 14 -37 b 58 -9 35 -45 46 -22 b 392 333 170 105 279 217 l 765 711 b 1372 1329 968 916 1168 1125 b 1424 1439 1403 1359 1417 1397 b 1426 1457 1424 1444 1426 1450 b 1416 1477 1426 1466 1423 1475 b 1374 1462 1400 1485 1385 1473 b 1181 1269 1309 1397 1246 1331 b 736 831 1031 1122 884 979 b 356 452 609 704 485 576 b 32 132 246 347 143 236 b 0 50 7 109 1 84 b 6 9 -1 37 3 23 b 14 -37 10 -9 0 -32 z',\n },\n accidentalNarrowReversedFlat: {\n x_min: 0,\n x_max: 208,\n y_min: -231,\n y_max: 449,\n ha: 680,\n o: 'm 272 -333 b 284 -320 278 -333 281 -328 b 300 -174 297 -272 300 -222 b 275 190 298 -52 279 68 b 268 445 272 275 268 360 l 268 490 b 264 612 269 530 265 572 b 236 647 264 632 252 645 l 235 647 b 217 618 220 647 220 628 b 207 526 210 588 207 556 b 210 432 207 494 210 464 b 216 268 213 377 215 323 l 216 230 l 215 232 b 154 256 194 240 174 251 b 111 264 138 261 124 264 b 3 153 50 264 10 223 b 0 94 0 132 0 114 b 194 -276 0 -63 68 -186 b 255 -323 215 -291 236 -307 b 272 -333 262 -330 268 -333 z m 233 -138 b 71 30 168 -92 105 -45 b 63 59 65 42 63 50 b 96 95 62 75 73 86 b 130 102 108 99 120 102 b 215 76 160 102 187 88 l 220 73 b 225 -22 220 42 222 10 b 233 -138 229 -62 230 -101 z',\n },\n accidentalNarrowReversedFlatAndFlat: {\n x_min: 0,\n x_max: 335,\n y_min: -231,\n y_max: 449,\n ha: 680,\n o: 'm 151 490 b 148 612 151 530 150 572 b 132 647 148 632 141 645 b 122 618 124 647 124 628 b 117 526 118 588 117 556 b 118 432 117 494 118 464 b 121 268 120 377 121 323 l 121 232 b 86 256 109 240 98 251 b 62 264 78 261 69 264 b 1 153 29 264 6 223 b 0 94 0 132 0 114 b 109 -276 0 -63 37 -186 b 144 -323 121 -291 132 -307 b 153 -333 147 -330 151 -333 b 160 -320 157 -333 158 -328 b 168 -174 167 -272 168 -222 b 154 190 168 -52 157 68 b 151 445 153 275 151 360 z m 480 153 b 372 264 472 223 432 264 b 328 256 359 264 344 261 b 268 232 308 251 288 240 l 266 230 l 266 268 b 272 432 266 323 269 377 b 275 526 272 464 275 494 b 265 618 275 556 272 588 b 248 647 262 628 262 647 l 246 647 b 219 612 230 645 219 632 b 215 490 217 572 213 530 l 215 445 b 207 190 215 360 210 275 b 183 -174 203 68 183 -52 b 199 -320 183 -222 186 -272 b 210 -333 202 -328 204 -333 b 228 -323 215 -333 220 -330 b 288 -276 246 -307 268 -291 b 482 94 415 -186 482 -63 b 480 153 482 114 482 132 z m 40 30 b 36 59 36 42 36 50 b 55 95 35 75 42 86 b 73 102 60 99 68 102 b 121 76 89 102 105 88 l 124 73 b 127 -22 124 42 125 10 l 131 -138 b 40 30 95 -92 60 -43 z m 419 59 b 412 30 419 50 418 42 b 249 -138 374 -43 314 -92 b 258 -22 252 -101 253 -62 b 262 73 261 10 262 42 l 268 76 b 353 102 295 88 323 102 b 386 95 363 102 374 99 b 419 59 409 86 420 75 z',\n },\n accidentalWilsonPlus: {\n x_min: 0,\n x_max: 298,\n y_min: -218,\n y_max: 218,\n ha: 436,\n o: 'm 232 -314 b 236 -301 236 -310 236 -305 l 236 -295 b 243 -52 239 -213 242 -132 l 369 62 b 429 200 413 101 425 147 b 416 243 429 216 428 236 b 383 225 406 251 393 232 l 377 220 b 246 98 336 177 291 138 b 249 242 248 145 246 193 b 225 304 251 265 242 287 b 209 314 220 308 215 314 b 204 312 207 314 206 312 b 196 292 196 310 196 300 b 193 184 194 256 194 220 b 187 48 192 140 190 94 b 46 -72 141 7 94 -32 b 0 -163 13 -98 0 -127 b 1 -187 0 -170 0 -179 b 10 -235 4 -203 6 -219 b 20 -255 12 -242 14 -251 b 36 -245 26 -259 30 -249 b 181 -109 85 -200 132 -154 b 176 -258 180 -158 176 -209 b 232 -314 176 -298 186 -307 z',\n },\n accidentalWilsonMinus: {\n x_min: 0,\n x_max: 284.2093390143919,\n y_min: -163,\n y_max: 163,\n ha: 326,\n o: 'm 386 -232 b 409 -163 415 -222 408 -180 b 382 -69 410 -120 408 -89 b 32 228 264 30 141 118 b 17 235 26 233 22 235 b 3 219 9 235 3 228 b 0 157 3 199 0 179 b 29 69 0 125 6 95 b 323 -194 115 -29 222 -111 b 374 -235 338 -206 353 -235 b 386 -232 377 -235 382 -233 z',\n },\n },\n fontFamily: 'Petaluma',\n resolution: 1000,\n generatedOn: '2021-12-06T21:04:23.441Z',\n};\n","/**\n * The Petaluma font was created by Steinberg Media.\n * https://github.com/steinbergmedia/petaluma\n */\nexport const PetalumaMetrics = {\n name: 'Petaluma',\n smufl: true,\n stave: {\n padding: 15,\n endPaddingMax: 15,\n endPaddingMin: 7,\n unalignedNotePadding: 12,\n },\n accidental: {\n noteheadAccidentalPadding: 1,\n leftPadding: 2,\n accidentalSpacing: 3,\n },\n clef: {\n default: {\n point: 32,\n width: 26,\n },\n small: {\n point: 26,\n width: 20,\n },\n annotations: {\n '8va': {\n smuflCode: 'timeSig8',\n default: {\n point: 18,\n treble: {\n line: -1.4,\n shiftX: 12,\n },\n },\n small: {\n point: 16,\n treble: {\n line: -0.2,\n shiftX: 8,\n },\n },\n },\n '8vb': {\n smuflCode: 'timeSig8',\n default: {\n point: 18,\n treble: {\n line: 6,\n shiftX: 10,\n },\n bass: {\n line: 3.5,\n shiftX: 1,\n },\n },\n small: {\n point: 16,\n treble: {\n line: 5.3,\n shiftX: 6,\n },\n bass: {\n line: 3.1,\n shiftX: 0.5,\n },\n },\n },\n },\n // These may no longer be necessary\n lineCount: {\n '8': { point: 55, shiftY: 14 },\n '7': { point: 47, shiftY: 8 },\n '6': { point: 32, shiftY: 1 },\n '5': { point: 30, shiftY: -6 },\n '4': { point: 23, shiftY: -12 },\n },\n },\n parenthesis: {\n default: {\n point: 39,\n width: 7,\n },\n gracenote: {\n point: (39 * 3) / 5,\n width: 3,\n },\n },\n pedalMarking: {\n up: {\n point: 40,\n },\n down: {\n point: 34,\n },\n },\n // These are for numeric digits, such as in time signatures\n digits: {\n // used by timesig\n shiftLine: -1,\n point: 22,\n // used by tuplets\n tupletPoint: 16,\n shiftY: -2,\n },\n articulation: {\n articStaccatissimoAbove: {\n padding: 2,\n },\n articStaccatissimoBelow: {\n padding: 2,\n },\n },\n tremolo: {\n default: {\n point: 25,\n spacing: 5,\n offsetYStemUp: -5,\n offsetYStemDown: 5,\n offsetXStemUp: 13,\n offsetXStemDown: 1,\n },\n grace: {\n point: 18,\n spacing: 4,\n offsetYStemUp: -5,\n offsetYStemDown: 5,\n offsetXStemUp: 8,\n offsetXStemDown: 1,\n },\n },\n staveRepetition: {\n default: {\n offsetY: 25,\n offsetSymbol: 12,\n spacing: 5,\n },\n },\n noteHead: {\n displaced: {\n shiftX: -2,\n },\n },\n stem: {\n heightAdjustmentForFlag: -3,\n // These are stem (Y) offsets to the note heads. To shift the\n // noteheads (x-position) themselves, see glyphs.notehead.custom.\n noteHead: {\n noteheadTriangleUpHalf: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpBlack: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpWhole: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadXHalf: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXBlack: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXWhole: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadHalf: {\n offsetYBaseStemDown: 1.8,\n offsetYBaseStemUp: -1.8,\n },\n noteheadBlack: {\n offsetYBaseStemDown: 2,\n offsetYBaseStemUp: -2,\n },\n noteheadSquareWhite: {\n offsetYBaseStemDown: -5,\n offsetYBaseStemUp: 5,\n },\n },\n },\n // Values under here are used by the Glyph class to reposition and rescale\n // glyphs based on their category. This should be the first stop for\n // custom font glyph repositioning.\n //\n // The glyph loader first looks up a specific set of settings based on the\n // glyph code, and if not found, uses the defaults from the category. See\n // glyphs.textNote for an example of this.\n //\n // Details in Glyph.lookupFontMetrics.\n glyphs: {\n coda: {\n point: 20,\n shiftX: -7,\n shiftY: 8,\n },\n segno: {\n shiftX: -7,\n },\n flag: {\n shiftX: -0.77,\n flag16thUp: {\n shiftX: -0.75,\n },\n flag32ndUp: {\n shiftX: -0.85,\n },\n flag64thUp: {\n shiftX: -1.55,\n },\n flag128thUp: {\n shiftX: -1.3,\n },\n flag16thDown: {\n shiftX: -0.75,\n },\n flag32ndDown: {\n shiftX: -0.76,\n },\n flag64thDown: {\n shiftX: -1.5,\n },\n flag128thDown: {\n shiftX: -1.2,\n },\n tabStem: {\n shiftX: -1.75,\n },\n staveTempo: {\n shiftX: -1,\n },\n },\n clef: {\n gClef: {\n default: { scale: 1.1, shiftY: 1 },\n small: { shiftY: 1.5 },\n },\n fClef: {\n default: { shiftY: -0.5 },\n },\n },\n ornament: {\n ornamentTurn: {\n scale: 1.2,\n },\n ornamentTurnSlash: {\n scale: 1.2,\n },\n },\n stringNumber: {\n verticalPadding: 8,\n stemPadding: 2,\n leftPadding: 5,\n rightPadding: 6,\n },\n stroke: {\n arrowheadBlackDown: {\n straight: {\n shiftX: -4.5,\n },\n wiggly: {\n shiftX: -1,\n shiftY: 1,\n },\n },\n arrowheadBlackUp: {\n straight: {\n shiftX: -0.85,\n },\n wiggly: {\n shiftX: -1,\n shiftY: 1,\n },\n },\n },\n textNote: {\n point: 34,\n breathMarkTick: {\n point: 36,\n shiftY: 9,\n },\n breathMarkComma: {\n point: 36,\n },\n segno: {\n point: 30,\n shiftX: -7,\n shiftY: 8,\n },\n coda: {\n point: 20,\n shiftX: -7,\n shiftY: 8,\n },\n ornamentTrill: {\n shiftX: -10,\n shiftY: 8,\n },\n ornamentMordent: {\n shiftX: -8,\n },\n ornamentShortTrill: {\n shiftX: -8,\n },\n },\n noteHead: {\n minPadding: 2,\n standard: {\n noteheadBlackStemUp: {\n shiftX: 0.5,\n },\n noteheadHalfStemUp: {\n shiftX: 0.725,\n },\n noteheadWholeStemUp: {\n shiftX: 1,\n },\n },\n custom: {\n noteheadCircleXStemUp: {\n shiftX: -1,\n },\n noteheadCircleXStemDown: {\n shiftX: 0.25,\n },\n noteheadDiamondHalfStemUp: {\n shiftX: 1.5,\n },\n noteheadDiamondBlackStemUp: {\n shiftX: 1.5,\n },\n noteheadDiamondWholeStemUp: {\n shiftX: 1,\n },\n noteheadXBlackStemUp: {\n shiftX: 1,\n },\n noteheadXHalfStemUp: {\n shiftX: -3,\n },\n noteheadXHalfStemDown: {\n shiftX: 1,\n },\n noteheadXWholeStemUp: {\n shiftX: -7,\n },\n noteheadXWholeStemDown: {\n shiftX: 1,\n },\n noteheadSquareWhiteStemDown: {\n shiftX: 0.25,\n },\n noteheadSquareWhiteStemUp: {\n shiftX: -0.75,\n },\n noteheadSquareBlackStemUp: {\n shiftX: -0.75,\n },\n noteheadTriangleUpWholeStemUp: {\n shiftX: -0.75,\n },\n },\n },\n chordSymbol: {\n global: {\n superscriptOffset: -400,\n subscriptOffset: 300,\n kerningOffset: -150,\n lowerKerningText: ['D', 'F', 'P', 'T', 'V', 'Y'],\n upperKerningText: ['L'],\n spacing: 20,\n superSubRatio: 0.73,\n },\n csymDiminished: {\n scale: 0.8,\n leftSideBearing: -95,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymHalfDiminished: {\n scale: 0.8,\n leftSideBearing: -32,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymAugmented: {\n scale: 1,\n leftSideBearing: -25,\n advanceWidth: 530,\n yOffset: 0,\n },\n csymParensLeftTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 155,\n yOffset: 150,\n },\n csymParensRightTall: {\n scale: 0.8,\n leftSideBearing: 40,\n advanceWidth: 189,\n yOffset: 150,\n },\n csymBracketLeftTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 328,\n yOffset: 0,\n },\n csymBracketRightTall: {\n scale: 0.8,\n leftSideBearing: 1,\n advanceWidth: 600,\n yOffset: 0,\n },\n csymParensLeftVeryTall: {\n scale: 0.95,\n leftSideBearing: 0,\n advanceWidth: 210,\n yOffset: 250,\n },\n csymParensRightVeryTall: {\n scale: 0.9,\n leftSideBearing: -100,\n advanceWidth: 111,\n yOffset: 250,\n },\n csymDiagonalArrangementSlash: {\n scale: 0.6,\n leftSideBearing: -1,\n advanceWidth: 990,\n yOffset: 0,\n },\n csymMinor: {\n scale: 0.7,\n leftSideBearing: 0,\n advanceWidth: 482,\n yOffset: 0,\n },\n csymMajorSeventh: {\n scale: 0.8,\n leftSideBearing: 100,\n yOffset: 0,\n advanceWidth: 600,\n },\n accidentalSharp: {\n scale: 0.7,\n leftSideBearing: 0,\n advanceWidth: 425,\n yOffset: -422,\n },\n accidentalFlat: {\n scale: 0.8,\n leftSideBearing: -10,\n advanceWidth: 228,\n yOffset: -284,\n },\n },\n jazzOrnaments: {\n brassScoop: {\n scale: 1.0,\n xOffset: -12,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 10,\n },\n brassDoitMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassFallLipShort: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassLiftMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 5,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassFallRoughMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 26,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassBend: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -8,\n stemUpYOffset: 28,\n reportedWidth: 5,\n },\n brassMuteClosed: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -8,\n stemUpYOffset: 26,\n reportedWidth: 5,\n },\n brassMuteOpen: {\n scale: 1.0,\n xOffset: 4,\n yOffset: -8,\n stemUpYOffset: 27,\n reportedWidth: 5,\n },\n brassFlip: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassJazzTurn: {\n scale: 1.0,\n xOffset: 6,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassSmear: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n },\n tuplet: {\n noteHeadOffset: 20,\n stemOffset: 10,\n bottomLine: 4,\n topModifierOffset: 20,\n },\n },\n};\n","export const PetalumaScriptFont = {\n spacing: 50,\n glyphs: {\n ' ': {\n x_min: 0,\n x_max: 250,\n y_min: 0,\n y_max: 500,\n ha: 500,\n leftSideBearing: 0,\n advanceWidth: 250,\n },\n '0': {\n x_min: 33,\n x_max: 534,\n y_min: -13,\n y_max: 751,\n ha: 764,\n leftSideBearing: 33,\n advanceWidth: 570,\n },\n '1': {\n x_min: 48,\n x_max: 235,\n y_min: -17,\n y_max: 734,\n ha: 751,\n leftSideBearing: 48,\n advanceWidth: 286,\n },\n '2': {\n x_min: 56,\n x_max: 571,\n y_min: -19,\n y_max: 741,\n ha: 760,\n leftSideBearing: 56,\n advanceWidth: 626,\n },\n '3': {\n x_min: 50,\n x_max: 528,\n y_min: -7,\n y_max: 731,\n ha: 738,\n leftSideBearing: 50,\n advanceWidth: 589,\n },\n '4': {\n x_min: 38,\n x_max: 564,\n y_min: -13,\n y_max: 743,\n ha: 756,\n leftSideBearing: 38,\n advanceWidth: 614,\n },\n '5': {\n x_min: 42,\n x_max: 601,\n y_min: -34,\n y_max: 743,\n ha: 777,\n leftSideBearing: 42,\n advanceWidth: 648,\n },\n '6': {\n x_min: 47,\n x_max: 606,\n y_min: -16,\n y_max: 743,\n ha: 759,\n leftSideBearing: 47,\n advanceWidth: 667,\n },\n '7': {\n x_min: 47,\n x_max: 567,\n y_min: 5,\n y_max: 739,\n ha: 734,\n leftSideBearing: 0,\n advanceWidth: 615,\n },\n '8': {\n x_min: 40,\n x_max: 541,\n y_min: -15,\n y_max: 752,\n ha: 767,\n leftSideBearing: 40,\n advanceWidth: 585,\n },\n '9': {\n x_min: 40,\n x_max: 537,\n y_min: -52,\n y_max: 736,\n ha: 788,\n leftSideBearing: 40,\n advanceWidth: 592,\n },\n '!': {\n x_min: 49,\n x_max: 180,\n y_min: -7,\n y_max: 761,\n ha: 768,\n leftSideBearing: 49,\n advanceWidth: 230,\n },\n '\"': {\n x_min: 39,\n x_max: 304,\n y_min: 596,\n y_max: 804,\n ha: 208,\n leftSideBearing: 39,\n advanceWidth: 353,\n },\n '#': {\n x_min: 33,\n x_max: 599,\n y_min: -8,\n y_max: 765,\n ha: 773,\n leftSideBearing: 33,\n advanceWidth: 648,\n },\n $: {\n x_min: 53,\n x_max: 495,\n y_min: -111,\n y_max: 823,\n ha: 934,\n leftSideBearing: 53,\n advanceWidth: 560,\n },\n '%': {\n x_min: 35,\n x_max: 656,\n y_min: -128,\n y_max: 808,\n ha: 936,\n leftSideBearing: 35,\n advanceWidth: 711,\n },\n '&': {\n x_min: 53,\n x_max: 441,\n y_min: -3,\n y_max: 753,\n ha: 756,\n leftSideBearing: 53,\n advanceWidth: 500,\n },\n \"'\": {\n x_min: 43,\n x_max: 161,\n y_min: 590,\n y_max: 811,\n ha: 221,\n leftSideBearing: 43,\n advanceWidth: 217,\n },\n '(': {\n x_min: 41,\n x_max: 311,\n y_min: -36,\n y_max: 845,\n ha: 881,\n leftSideBearing: 41,\n advanceWidth: 308,\n },\n ')': {\n x_min: -8,\n x_max: 257,\n y_min: -21,\n y_max: 852,\n ha: 873,\n leftSideBearing: -8,\n advanceWidth: 280,\n },\n '*': {\n x_min: 59,\n x_max: 539,\n y_min: 175,\n y_max: 589,\n ha: 414,\n leftSideBearing: 59,\n advanceWidth: 601,\n },\n '+': {\n x_min: 33,\n x_max: 361,\n y_min: 180,\n y_max: 587,\n ha: 407,\n leftSideBearing: 33,\n advanceWidth: 400,\n },\n ',': {\n x_min: 15,\n x_max: 176,\n y_min: -129,\n y_max: 92,\n ha: 221,\n leftSideBearing: 15,\n advanceWidth: 205,\n },\n '-': {\n x_min: 40,\n x_max: 380,\n y_min: 317,\n y_max: 452,\n ha: 135,\n leftSideBearing: 40,\n advanceWidth: 422,\n },\n '.': {\n x_min: 48,\n x_max: 185,\n y_min: -56,\n y_max: 84,\n ha: 140,\n leftSideBearing: 48,\n advanceWidth: 227,\n },\n '/': {\n x_min: -58,\n x_max: 654,\n y_min: -122,\n y_max: 844,\n ha: 966,\n leftSideBearing: -58,\n advanceWidth: 626,\n },\n ':': {\n x_min: 65,\n x_max: 225,\n y_min: 97,\n y_max: 536,\n ha: 439,\n leftSideBearing: 65,\n advanceWidth: 302,\n },\n ';': {\n x_min: 13,\n x_max: 295,\n y_min: -139,\n y_max: 536,\n ha: 675,\n leftSideBearing: 13,\n advanceWidth: 334,\n },\n '<': {\n x_min: 28,\n x_max: 438,\n y_min: -1,\n y_max: 607,\n ha: 608,\n leftSideBearing: 28,\n advanceWidth: 475,\n },\n '=': {\n x_min: 40,\n x_max: 383,\n y_min: 199.9598640852289,\n y_max: 541,\n ha: 341.0401359147711,\n leftSideBearing: 40,\n advanceWidth: 422,\n },\n '>': {\n x_min: 35,\n x_max: 421,\n y_min: 28,\n y_max: 632,\n ha: 604,\n leftSideBearing: 35,\n advanceWidth: 466,\n },\n '?': {\n x_min: 45,\n x_max: 548,\n y_min: -17,\n y_max: 767,\n ha: 784,\n leftSideBearing: 45,\n advanceWidth: 592,\n },\n '@': {\n x_min: 51,\n x_max: 730,\n y_min: -78,\n y_max: 753,\n ha: 831,\n leftSideBearing: 51,\n advanceWidth: 781,\n },\n A: {\n x_min: 37,\n x_max: 554,\n y_min: -4,\n y_max: 746,\n ha: 750,\n leftSideBearing: 37,\n advanceWidth: 617,\n },\n B: {\n x_min: 37,\n x_max: 532,\n y_min: 3,\n y_max: 783,\n ha: 780,\n leftSideBearing: 37,\n advanceWidth: 579,\n },\n C: {\n x_min: 37,\n x_max: 583,\n y_min: -3,\n y_max: 775,\n ha: 778,\n leftSideBearing: 37,\n advanceWidth: 623,\n },\n D: {\n x_min: 50,\n x_max: 530,\n y_min: -15,\n y_max: 749,\n ha: 764,\n leftSideBearing: 50,\n advanceWidth: 579,\n },\n E: {\n x_min: 45,\n x_max: 531,\n y_min: -1,\n y_max: 743,\n ha: 744,\n leftSideBearing: 45,\n advanceWidth: 585,\n },\n F: {\n x_min: 45,\n x_max: 459,\n y_min: 23,\n y_max: 727,\n ha: 704,\n leftSideBearing: 45,\n advanceWidth: 510,\n },\n G: {\n x_min: 31,\n x_max: 577,\n y_min: -8,\n y_max: 733,\n ha: 741,\n leftSideBearing: 31,\n advanceWidth: 611,\n },\n H: {\n x_min: 37,\n x_max: 493,\n y_min: -22,\n y_max: 758,\n ha: 780,\n leftSideBearing: 37,\n advanceWidth: 535,\n },\n I: {\n x_min: 47,\n x_max: 501,\n y_min: -3,\n y_max: 731,\n ha: 734,\n leftSideBearing: 47,\n advanceWidth: 541,\n },\n J: {\n x_min: 33,\n x_max: 531,\n y_min: -23,\n y_max: 725,\n ha: 748,\n leftSideBearing: 33,\n advanceWidth: 573,\n },\n K: {\n x_min: 43,\n x_max: 505,\n y_min: -10,\n y_max: 740,\n ha: 750,\n leftSideBearing: 43,\n advanceWidth: 560,\n },\n L: {\n x_min: 49,\n x_max: 457,\n y_min: -2,\n y_max: 746,\n ha: 748,\n leftSideBearing: 49,\n advanceWidth: 510,\n },\n M: {\n x_min: 35,\n x_max: 699,\n y_min: 1,\n y_max: 744,\n ha: 743,\n leftSideBearing: 35,\n advanceWidth: 743,\n },\n N: {\n x_min: 34,\n x_max: 533,\n y_min: -17,\n y_max: 761,\n ha: 778,\n leftSideBearing: 34,\n advanceWidth: 579,\n },\n O: {\n x_min: 41,\n x_max: 608,\n y_min: -5,\n y_max: 735,\n ha: 740,\n leftSideBearing: 41,\n advanceWidth: 667,\n },\n P: {\n x_min: 53,\n x_max: 451,\n y_min: -18,\n y_max: 735,\n ha: 753,\n leftSideBearing: 53,\n advanceWidth: 497,\n },\n Q: {\n x_min: 40,\n x_max: 599,\n y_min: -67,\n y_max: 744,\n ha: 811,\n leftSideBearing: 40,\n advanceWidth: 648,\n },\n R: {\n x_min: 39,\n x_max: 487,\n y_min: 16,\n y_max: 735,\n ha: 719,\n leftSideBearing: 39,\n advanceWidth: 535,\n },\n S: {\n x_min: 35,\n x_max: 552,\n y_min: -47,\n y_max: 708,\n ha: 755,\n leftSideBearing: 35,\n advanceWidth: 604,\n },\n T: {\n x_min: 26,\n x_max: 656,\n y_min: -13,\n y_max: 718,\n ha: 731,\n leftSideBearing: 26,\n advanceWidth: 705,\n },\n U: {\n x_min: 41,\n x_max: 518,\n y_min: -20,\n y_max: 748,\n ha: 768,\n leftSideBearing: 41,\n advanceWidth: 567,\n },\n V: {\n x_min: 47,\n x_max: 509,\n y_min: -26,\n y_max: 744,\n ha: 770,\n leftSideBearing: 47,\n advanceWidth: 567,\n },\n W: {\n x_min: 44,\n x_max: 789,\n y_min: -35,\n y_max: 720,\n ha: 755,\n leftSideBearing: 44,\n advanceWidth: 833,\n },\n X: {\n x_min: 63,\n x_max: 635,\n y_min: -10,\n y_max: 745,\n ha: 755,\n leftSideBearing: 63,\n advanceWidth: 680,\n },\n Y: {\n x_min: 43,\n x_max: 503,\n y_min: -21,\n y_max: 734,\n ha: 755,\n leftSideBearing: 43,\n advanceWidth: 541,\n },\n Z: {\n x_min: 42,\n x_max: 584,\n y_min: -10,\n y_max: 739,\n ha: 749,\n leftSideBearing: 42,\n advanceWidth: 629,\n },\n '[': {\n x_min: 46,\n x_max: 346,\n y_min: -150,\n y_max: 884,\n ha: 1034,\n leftSideBearing: 46,\n advanceWidth: 291,\n },\n '\\\\': {\n x_min: 20,\n x_max: 616,\n y_min: -100,\n y_max: 797,\n ha: 897,\n leftSideBearing: 20,\n advanceWidth: 645,\n },\n ']': {\n x_min: -76,\n x_max: 226,\n y_min: -150,\n y_max: 881,\n ha: 1031,\n leftSideBearing: -76,\n advanceWidth: 297,\n },\n '^': {\n x_min: 43,\n x_max: 437,\n y_min: 517,\n y_max: 812,\n ha: 295,\n leftSideBearing: 43,\n advanceWidth: 478,\n },\n _: {\n x_min: 29,\n x_max: 563,\n y_min: -110,\n y_max: -1,\n ha: 109,\n leftSideBearing: 29,\n advanceWidth: 598,\n },\n '`': {\n x_min: 54,\n x_max: 321,\n y_min: 540,\n y_max: 747,\n ha: 207,\n leftSideBearing: 54,\n advanceWidth: 368,\n },\n a: {\n x_min: 20,\n x_max: 447,\n y_min: -17,\n y_max: 495,\n ha: 512,\n leftSideBearing: 20,\n advanceWidth: 494,\n },\n b: {\n x_min: 37,\n x_max: 466,\n y_min: -27,\n y_max: 770,\n ha: 797,\n leftSideBearing: 37,\n advanceWidth: 510,\n },\n c: {\n x_min: 35,\n x_max: 456,\n y_min: -9,\n y_max: 507,\n ha: 516,\n leftSideBearing: 35,\n advanceWidth: 460,\n },\n d: {\n x_min: 45,\n x_max: 520,\n y_min: -15,\n y_max: 764,\n ha: 779,\n leftSideBearing: 45,\n advanceWidth: 560,\n },\n e: {\n x_min: 33,\n x_max: 370,\n y_min: -5,\n y_max: 501,\n ha: 506,\n leftSideBearing: 33,\n advanceWidth: 397,\n },\n f: {\n x_min: 35,\n x_max: 411,\n y_min: -13,\n y_max: 695,\n ha: 708,\n leftSideBearing: 35,\n advanceWidth: 453,\n },\n g: {\n x_min: 33,\n x_max: 551,\n y_min: -257,\n y_max: 505,\n ha: 762,\n leftSideBearing: 33,\n advanceWidth: 611,\n },\n h: {\n x_min: 32,\n x_max: 458,\n y_min: -29,\n y_max: 743,\n ha: 772,\n leftSideBearing: 32,\n advanceWidth: 491,\n },\n i: {\n x_min: 45,\n x_max: 167,\n y_min: -13,\n y_max: 631,\n ha: 644,\n leftSideBearing: 45,\n advanceWidth: 220,\n },\n j: {\n x_min: -127,\n x_max: 261,\n y_min: -231,\n y_max: 601,\n ha: 832,\n leftSideBearing: -127,\n advanceWidth: 308,\n },\n k: {\n x_min: 39,\n x_max: 443,\n y_min: -3,\n y_max: 700,\n ha: 703,\n leftSideBearing: 39,\n advanceWidth: 497,\n },\n l: {\n x_min: 58,\n x_max: 168,\n y_min: -8,\n y_max: 686,\n ha: 694,\n leftSideBearing: 58,\n advanceWidth: 227,\n },\n m: {\n x_min: 39,\n x_max: 688,\n y_min: -14,\n y_max: 501,\n ha: 515,\n leftSideBearing: 39,\n advanceWidth: 718,\n },\n n: {\n x_min: 45,\n x_max: 491,\n y_min: -32,\n y_max: 512,\n ha: 544,\n leftSideBearing: 45,\n advanceWidth: 541,\n },\n o: {\n x_min: 41,\n x_max: 424,\n y_min: -12,\n y_max: 493,\n ha: 505,\n leftSideBearing: 41,\n advanceWidth: 447,\n },\n p: {\n x_min: 25,\n x_max: 529,\n y_min: -260,\n y_max: 500,\n ha: 760,\n leftSideBearing: 25,\n advanceWidth: 573,\n },\n q: {\n x_min: 53,\n x_max: 603,\n y_min: -235,\n y_max: 514,\n ha: 749,\n leftSideBearing: 53,\n advanceWidth: 623,\n },\n r: {\n x_min: 32,\n x_max: 407,\n y_min: -7,\n y_max: 492,\n ha: 499,\n leftSideBearing: 32,\n advanceWidth: 460,\n },\n s: {\n x_min: 49,\n x_max: 416,\n y_min: -12,\n y_max: 519,\n ha: 531,\n leftSideBearing: 49,\n advanceWidth: 460,\n },\n t: {\n x_min: 32,\n x_max: 442,\n y_min: -5,\n y_max: 684,\n ha: 689,\n leftSideBearing: 32,\n advanceWidth: 469,\n },\n u: {\n x_min: 41,\n x_max: 487,\n y_min: -5,\n y_max: 507,\n ha: 512,\n leftSideBearing: 41,\n advanceWidth: 510,\n },\n v: {\n x_min: 16,\n x_max: 441,\n y_min: -20,\n y_max: 542,\n ha: 562,\n leftSideBearing: 16,\n advanceWidth: 456,\n },\n w: {\n x_min: 39,\n x_max: 639,\n y_min: -22,\n y_max: 505,\n ha: 527,\n leftSideBearing: 39,\n advanceWidth: 661,\n },\n x: {\n x_min: 15,\n x_max: 505,\n y_min: -39,\n y_max: 539,\n ha: 578,\n leftSideBearing: 15,\n advanceWidth: 541,\n },\n y: {\n x_min: -98,\n x_max: 501,\n y_min: -242,\n y_max: 511,\n ha: 753,\n leftSideBearing: -98,\n advanceWidth: 548,\n },\n z: {\n x_min: 27,\n x_max: 479,\n y_min: -3,\n y_max: 494,\n ha: 497,\n leftSideBearing: 27,\n advanceWidth: 494,\n },\n '{': {\n x_min: 0,\n x_max: 0,\n y_min: 0,\n y_max: 0,\n ha: 0,\n leftSideBearing: 0,\n advanceWidth: 308,\n },\n '|': {\n x_min: 0,\n x_max: 0,\n y_min: 0,\n y_max: 0,\n ha: 0,\n leftSideBearing: 0,\n advanceWidth: 308,\n },\n '}': {\n x_min: 0,\n x_max: 0,\n y_min: 0,\n y_max: 0,\n ha: 0,\n leftSideBearing: 0,\n advanceWidth: 308,\n },\n '~': {\n x_min: 0,\n x_max: 0,\n y_min: 0,\n y_max: 0,\n ha: 0,\n leftSideBearing: 0,\n advanceWidth: 308,\n },\n },\n fontFamily: 'PetalumaScript',\n resolution: 1000,\n generatedOn: '2020-06-14T18:33:25.407Z',\n};\n","export const RobotoSlabFont = {\n spacing: 50,\n glyphs: {\n ' ': {\n x_min: 0,\n x_max: 509,\n y_min: 0,\n y_max: 2000,\n ha: 2000,\n leftSideBearing: 0,\n advanceWidth: 509,\n },\n '0': {\n x_min: 121,\n x_max: 1048,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 121,\n advanceWidth: 1168,\n },\n '1': {\n x_min: 117,\n x_max: 767,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 117,\n advanceWidth: 844,\n },\n '2': {\n x_min: 75.8474576645637,\n x_max: 1040,\n y_min: 0,\n y_max: 1477,\n ha: 1477,\n leftSideBearing: 75,\n advanceWidth: 1131,\n },\n '3': {\n x_min: 74.85365853658536,\n x_max: 994,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 74,\n advanceWidth: 1106,\n },\n '4': {\n x_min: 63,\n x_max: 1114,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 63,\n advanceWidth: 1187,\n },\n '5': {\n x_min: 96.8448275474953,\n x_max: 982,\n y_min: -21,\n y_max: 1456,\n ha: 1477,\n leftSideBearing: 96,\n advanceWidth: 1081,\n },\n '6': {\n x_min: 121,\n x_max: 1067,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 121,\n advanceWidth: 1144,\n },\n '7': {\n x_min: 76,\n x_max: 1060,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: -30,\n advanceWidth: 1128,\n },\n '8': {\n x_min: 92,\n x_max: 1039,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 92,\n advanceWidth: 1131,\n },\n '9': {\n x_min: 84,\n x_max: 1026,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 84,\n advanceWidth: 1154,\n },\n '!': {\n x_min: 143,\n x_max: 340,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 143,\n advanceWidth: 483,\n },\n '\"': {\n x_min: 166,\n x_max: 634,\n y_min: 1055,\n y_max: 1560,\n ha: 505,\n leftSideBearing: 166,\n advanceWidth: 770,\n },\n '#': {\n x_min: 63,\n x_max: 1179,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 63,\n advanceWidth: 1246,\n },\n $: {\n x_min: 81.92156915727656,\n x_max: 1012,\n y_min: -208,\n y_max: 1693,\n ha: 1901,\n leftSideBearing: 81,\n advanceWidth: 1110,\n },\n '%': {\n x_min: 77,\n x_max: 1384,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 77,\n advanceWidth: 1460,\n },\n '&': {\n x_min: 74,\n x_max: 1242,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 74,\n advanceWidth: 1289,\n },\n \"'\": {\n x_min: 166,\n x_max: 324,\n y_min: 1055,\n y_max: 1560,\n ha: 505,\n leftSideBearing: 166,\n advanceWidth: 460,\n },\n '(': {\n x_min: 114,\n x_max: 650,\n y_min: -463,\n y_max: 1636,\n ha: 2099,\n leftSideBearing: 114,\n advanceWidth: 662,\n },\n ')': {\n x_min: 11,\n x_max: 547,\n y_min: -463,\n y_max: 1636,\n ha: 2099,\n leftSideBearing: 11,\n advanceWidth: 654,\n },\n '*': {\n x_min: 66,\n x_max: 893,\n y_min: 607,\n y_max: 1456,\n ha: 849,\n leftSideBearing: 66,\n advanceWidth: 958,\n },\n '+': {\n x_min: 73,\n x_max: 1071,\n y_min: 146,\n y_max: 1206,\n ha: 1060,\n leftSideBearing: 73,\n advanceWidth: 1145,\n },\n ',': {\n x_min: 23,\n x_max: 315,\n y_min: -311,\n y_max: 221,\n ha: 532,\n leftSideBearing: 23,\n advanceWidth: 404,\n },\n '-': {\n x_min: 154,\n x_max: 643,\n y_min: 538,\n y_max: 692,\n ha: 154,\n leftSideBearing: 154,\n advanceWidth: 797,\n },\n '.': {\n x_min: 145,\n x_max: 342,\n y_min: 0,\n y_max: 202,\n ha: 202,\n leftSideBearing: 145,\n advanceWidth: 493,\n },\n '/': {\n x_min: 0,\n x_max: 774,\n y_min: -125,\n y_max: 1456,\n ha: 1581,\n leftSideBearing: 0,\n advanceWidth: 824,\n },\n ':': {\n x_min: 145,\n x_max: 342,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 145,\n advanceWidth: 419,\n },\n ';': {\n x_min: 53,\n x_max: 345,\n y_min: -311,\n y_max: 1082,\n ha: 1393,\n leftSideBearing: 53,\n advanceWidth: 424,\n },\n '<': {\n x_min: 76,\n x_max: 892,\n y_min: 107,\n y_max: 1013,\n ha: 906,\n leftSideBearing: 76,\n advanceWidth: 1017,\n },\n '=': {\n x_min: 147,\n x_max: 981,\n y_min: 407,\n y_max: 987,\n ha: 580,\n leftSideBearing: 147,\n advanceWidth: 1127,\n },\n '>': {\n x_min: 125,\n x_max: 980,\n y_min: 87,\n y_max: 993,\n ha: 906,\n leftSideBearing: 125,\n advanceWidth: 1060,\n },\n '?': {\n x_min: 65.92660602419838,\n x_max: 890,\n y_min: 0,\n y_max: 1477,\n ha: 1477,\n leftSideBearing: 65,\n advanceWidth: 953,\n },\n '@': {\n x_min: 84.3592218305664,\n x_max: 1705.2346925277395,\n y_min: -453,\n y_max: 1431,\n ha: 1884,\n leftSideBearing: 84,\n advanceWidth: 1821,\n },\n A: {\n x_min: 70,\n x_max: 1463,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 70,\n advanceWidth: 1533,\n },\n B: {\n x_min: 81,\n x_max: 1253,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1322,\n },\n C: {\n x_min: 80,\n x_max: 1174,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 80,\n advanceWidth: 1290,\n },\n D: {\n x_min: 81,\n x_max: 1291,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1356,\n },\n E: {\n x_min: 81,\n x_max: 1190,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1306,\n },\n F: {\n x_min: 81,\n x_max: 1176,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1256,\n },\n G: {\n x_min: 80,\n x_max: 1226,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 80,\n advanceWidth: 1346,\n },\n H: {\n x_min: 81,\n x_max: 1497,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1578,\n },\n I: {\n x_min: 81,\n x_max: 604,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 685,\n },\n J: {\n x_min: 60,\n x_max: 1100,\n y_min: -21,\n y_max: 1456,\n ha: 1477,\n leftSideBearing: 60,\n advanceWidth: 1169,\n },\n K: {\n x_min: 81,\n x_max: 1427,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1501,\n },\n L: {\n x_min: 81,\n x_max: 1130,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1210,\n },\n M: {\n x_min: 94,\n x_max: 1888,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 94,\n advanceWidth: 1982,\n },\n N: {\n x_min: 83,\n x_max: 1509,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 83,\n advanceWidth: 1592,\n },\n O: {\n x_min: 70,\n x_max: 1281,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 70,\n advanceWidth: 1351,\n },\n P: {\n x_min: 81,\n x_max: 1242,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1297,\n },\n Q: {\n x_min: 70,\n x_max: 1348,\n y_min: -245,\n y_max: 1477,\n ha: 1722,\n leftSideBearing: 70,\n advanceWidth: 1376,\n },\n R: {\n x_min: 81,\n x_max: 1285,\n y_min: 0,\n y_max: 1455,\n ha: 1455,\n leftSideBearing: 81,\n advanceWidth: 1385,\n },\n S: {\n x_min: 115,\n x_max: 1116,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 115,\n advanceWidth: 1206,\n },\n T: {\n x_min: 96,\n x_max: 1306,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 96,\n advanceWidth: 1406,\n },\n U: {\n x_min: 70,\n x_max: 1452,\n y_min: -21,\n y_max: 1456,\n ha: 1477,\n leftSideBearing: 70,\n advanceWidth: 1522,\n },\n V: {\n x_min: 65,\n x_max: 1443,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 65,\n advanceWidth: 1508,\n },\n W: {\n x_min: 72,\n x_max: 2057,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 72,\n advanceWidth: 2129,\n },\n X: {\n x_min: 80,\n x_max: 1449,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 80,\n advanceWidth: 1529,\n },\n Y: {\n x_min: 65,\n x_max: 1396,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 65,\n advanceWidth: 1461,\n },\n Z: {\n x_min: 90,\n x_max: 1107,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 90,\n advanceWidth: 1197,\n },\n '[': {\n x_min: 157,\n x_max: 541,\n y_min: -312,\n y_max: 1664,\n ha: 1976,\n leftSideBearing: 157,\n advanceWidth: 573,\n },\n '\\\\': {\n x_min: 36,\n x_max: 830,\n y_min: -125,\n y_max: 1456,\n ha: 1581,\n leftSideBearing: 36,\n advanceWidth: 841,\n },\n ']': {\n x_min: 23,\n x_max: 408,\n y_min: -312,\n y_max: 1664,\n ha: 1976,\n leftSideBearing: 23,\n advanceWidth: 552,\n },\n '^': {\n x_min: 71,\n x_max: 802,\n y_min: 729,\n y_max: 1456,\n ha: 727,\n leftSideBearing: 71,\n advanceWidth: 864,\n },\n _: {\n x_min: 119,\n x_max: 1041,\n y_min: -154,\n y_max: 0,\n ha: 154,\n leftSideBearing: 119,\n advanceWidth: 1168,\n },\n '`': {\n x_min: 40,\n x_max: 456,\n y_min: 1288,\n y_max: 1560,\n ha: 272,\n leftSideBearing: 40,\n advanceWidth: 496,\n },\n a: {\n x_min: 79,\n x_max: 1053,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 79,\n advanceWidth: 1132,\n },\n b: {\n x_min: -16,\n x_max: 1071,\n y_min: -21,\n y_max: 1560,\n ha: 1581,\n leftSideBearing: -16,\n advanceWidth: 1145,\n },\n c: {\n x_min: 78,\n x_max: 988,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 78,\n advanceWidth: 1067,\n },\n d: {\n x_min: 78,\n x_max: 1156,\n y_min: -21,\n y_max: 1560,\n ha: 1581,\n leftSideBearing: 78,\n advanceWidth: 1218,\n },\n e: {\n x_min: 74,\n x_max: 980,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 74,\n advanceWidth: 1059,\n },\n f: {\n x_min: 64,\n x_max: 731,\n y_min: 0,\n y_max: 1581,\n ha: 1581,\n leftSideBearing: 64,\n advanceWidth: 725,\n },\n g: {\n x_min: 78,\n x_max: 1133,\n y_min: -437,\n y_max: 1102,\n ha: 1539,\n leftSideBearing: 78,\n advanceWidth: 1157,\n },\n h: {\n x_min: 49,\n x_max: 1255,\n y_min: 0,\n y_max: 1560,\n ha: 1560,\n leftSideBearing: 49,\n advanceWidth: 1315,\n },\n i: {\n x_min: 67,\n x_max: 590,\n y_min: 0,\n y_max: 1560,\n ha: 1560,\n leftSideBearing: 67,\n advanceWidth: 652,\n },\n j: {\n x_min: -56,\n x_max: 381,\n y_min: -437,\n y_max: 1560,\n ha: 1997,\n leftSideBearing: -56,\n advanceWidth: 525,\n },\n k: {\n x_min: 64,\n x_max: 1248,\n y_min: 0,\n y_max: 1560,\n ha: 1560,\n leftSideBearing: 64,\n advanceWidth: 1287,\n },\n l: {\n x_min: 64,\n x_max: 587,\n y_min: 0,\n y_max: 1560,\n ha: 1560,\n leftSideBearing: 64,\n advanceWidth: 653,\n },\n m: {\n x_min: 74,\n x_max: 1905,\n y_min: 0,\n y_max: 1102,\n ha: 1102,\n leftSideBearing: 74,\n advanceWidth: 1977,\n },\n n: {\n x_min: 74,\n x_max: 1278,\n y_min: 0,\n y_max: 1102,\n ha: 1102,\n leftSideBearing: 74,\n advanceWidth: 1343,\n },\n o: {\n x_min: 78,\n x_max: 1046,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 78,\n advanceWidth: 1124,\n },\n p: {\n x_min: 34,\n x_max: 1119,\n y_min: -416,\n y_max: 1102,\n ha: 1518,\n leftSideBearing: 34,\n advanceWidth: 1197,\n },\n q: {\n x_min: 78,\n x_max: 1135,\n y_min: -416,\n y_max: 1102,\n ha: 1518,\n leftSideBearing: 78,\n advanceWidth: 1139,\n },\n r: {\n x_min: 72,\n x_max: 808,\n y_min: 0,\n y_max: 1102,\n ha: 1102,\n leftSideBearing: 72,\n advanceWidth: 854,\n },\n s: {\n x_min: 104,\n x_max: 933,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 104,\n advanceWidth: 1022,\n },\n t: {\n x_min: 24,\n x_max: 678,\n y_min: -17,\n y_max: 1343,\n ha: 1360,\n leftSideBearing: 24,\n advanceWidth: 730,\n },\n u: {\n x_min: 52,\n x_max: 1181,\n y_min: -21,\n y_max: 1082,\n ha: 1103,\n leftSideBearing: 52,\n advanceWidth: 1245,\n },\n v: {\n x_min: 26,\n x_max: 1176,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 26,\n advanceWidth: 1206,\n },\n w: {\n x_min: 52,\n x_max: 1777,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 52,\n advanceWidth: 1823,\n },\n x: {\n x_min: 42,\n x_max: 1163,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 42,\n advanceWidth: 1203,\n },\n y: {\n x_min: 24,\n x_max: 1172,\n y_min: -437,\n y_max: 1082,\n ha: 1519,\n leftSideBearing: 24,\n advanceWidth: 1192,\n },\n z: {\n x_min: 88,\n x_max: 960,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 88,\n advanceWidth: 1032,\n },\n '{': {\n x_min: 63,\n x_max: 671,\n y_min: -364,\n y_max: 1597,\n ha: 1961,\n leftSideBearing: 63,\n advanceWidth: 701,\n },\n '|': {\n x_min: 150,\n x_max: 307,\n y_min: -270,\n y_max: 1456,\n ha: 1726,\n leftSideBearing: 150,\n advanceWidth: 451,\n },\n '}': {\n x_min: 27,\n x_max: 635,\n y_min: -364,\n y_max: 1597,\n ha: 1961,\n leftSideBearing: 27,\n advanceWidth: 701,\n },\n '~': {\n x_min: 121,\n x_max: 1257,\n y_min: 401,\n y_max: 803,\n ha: 402,\n leftSideBearing: 121,\n advanceWidth: 1386,\n },\n },\n fontFamily: 'Roboto Slab',\n resolution: 2048,\n generatedOn: '2020-06-15T19:12:58.120Z',\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from '../font';\nimport { TextFormatter } from '../textformatter';\nimport { PetalumaScriptFont } from './petalumascript_glyphs';\nimport { RobotoSlabFont } from './robotoslab_glyphs';\nexport function loadTextFonts() {\n // Roboto Slab\n {\n const fontData = RobotoSlabFont;\n const { fontFamily, resolution, glyphs } = fontData;\n Font.load(fontFamily, fontData);\n // Previously we used 'H', but it isn't actually the tallest or the widest.\n // Interestingly, the lowercase 'b' is the tallest glyph.\n const maxSizeGlyph = 'b';\n TextFormatter.registerInfo({\n family: fontFamily,\n resolution,\n glyphs,\n maxSizeGlyph,\n monospaced: false,\n bold: false,\n italic: false,\n superscriptOffset: 0.66,\n subscriptOffset: 0.66,\n serifs: true,\n description: 'Text font to pair with the Bravura / Gonville music fonts.',\n });\n }\n // PetalumaScript\n {\n const fontData = PetalumaScriptFont;\n const { fontFamily, resolution, glyphs } = fontData;\n Font.load(fontFamily, fontData);\n // M is wider, but H is taller. :-)\n // Lowercase b is also taller in this font.\n const maxSizeGlyph = 'b';\n TextFormatter.registerInfo({\n family: fontFamily,\n resolution,\n glyphs,\n maxSizeGlyph,\n monospaced: false,\n bold: false,\n italic: false,\n superscriptOffset: 0.66,\n subscriptOffset: 0.66,\n serifs: false,\n description: 'Text font to pair with the Petaluma music font.',\n });\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Beam } from './beam';\nimport { Font } from './font';\nimport { Fraction } from './fraction';\nimport { ModifierContext } from './modifiercontext';\nimport { Stave } from './stave';\nimport { StaveConnector } from './staveconnector';\nimport { Tables } from './tables';\nimport { TickContext } from './tickcontext';\nimport { isNote, isStaveNote } from './typeguard';\nimport { defined, log, midLine, RuntimeError } from './util';\nimport { Voice } from './voice';\n// Helper function\nconst sumArray = (arr) => arr.reduce((a, b) => a + b, 0);\n/**\n * Create `Alignment`s for each tick in `voices`. Also calculate the\n * total number of ticks in voices.\n */\nfunction createContexts(voices, makeContext, addToContext) {\n const resolutionMultiplier = Formatter.getResolutionMultiplier(voices);\n // Initialize tick maps.\n const tickToContextMap = {};\n const tickList = [];\n const contexts = [];\n // For each voice, extract notes and create a context for every\n // new tick that hasn't been seen before.\n voices.forEach((voice, voiceIndex) => {\n // Use resolution multiplier as denominator so that no additional expansion\n // of fractional tick values is needed.\n const ticksUsed = new Fraction(0, resolutionMultiplier);\n voice.getTickables().forEach((tickable) => {\n const integerTicks = ticksUsed.numerator;\n // If we have no tick context for this tick, create one.\n if (!tickToContextMap[integerTicks]) {\n const newContext = makeContext({ tickID: integerTicks });\n contexts.push(newContext);\n tickToContextMap[integerTicks] = newContext;\n // Maintain a list of unique integerTicks.\n tickList.push(integerTicks);\n }\n // Add this tickable to the TickContext.\n addToContext(tickable, tickToContextMap[integerTicks], voiceIndex);\n ticksUsed.add(tickable.getTicks());\n });\n });\n return {\n map: tickToContextMap,\n array: contexts,\n list: tickList.sort((a, b) => a - b),\n resolutionMultiplier,\n };\n}\n// eslint-disable-next-line\nfunction L(...args) {\n if (Formatter.DEBUG)\n log('Vex.Flow.Formatter', args);\n}\n/**\n * Get the rest line number of the next non-rest note(s).\n * @param notes array of Notes\n * @param currRestLine\n * @param currNoteIndex current note index\n * @param compare if true, return the midpoint between the current rest line and the next rest line\n * @returns a line number, which determines the vertical position of a rest.\n */\nfunction getRestLineForNextNoteGroup(notes, currRestLine, currNoteIndex, compare) {\n // If no valid next note group, nextRestLine is same as current.\n let nextRestLine = currRestLine;\n // Start with the next note and keep going until we find a valid non-rest note group.\n for (let noteIndex = currNoteIndex + 1; noteIndex < notes.length; noteIndex++) {\n const note = notes[noteIndex];\n if (isNote(note) && !note.isRest() && !note.shouldIgnoreTicks()) {\n nextRestLine = note.getLineForRest();\n break;\n }\n }\n // Locate the mid point between two lines.\n if (compare && currRestLine !== nextRestLine) {\n const top = Math.max(currRestLine, nextRestLine);\n const bot = Math.min(currRestLine, nextRestLine);\n nextRestLine = midLine(top, bot);\n }\n return nextRestLine;\n}\n/**\n * Format implements the formatting and layout algorithms that are used\n * to position notes in a voice. The algorithm can align multiple voices both\n * within a stave, and across multiple staves.\n *\n * To do this, the formatter breaks up voices into a grid of rational-valued\n * `ticks`, to which each note is assigned. Then, minimum widths are assigned\n * to each tick based on the widths of the notes and modifiers in that tick. This\n * establishes the smallest amount of space required for each tick.\n *\n * Finally, the formatter distributes the left over space proportionally to\n * all the ticks, setting the `x` values of the notes in each tick.\n *\n * See `tests/formatter_tests.ts` for usage examples. The helper functions included\n * here (`FormatAndDraw`, `FormatAndDrawTab`) also serve as useful usage examples.\n */\nexport class Formatter {\n constructor(options) {\n this.formatterOptions = Object.assign({ globalSoftmax: false, softmaxFactor: 100, maxIterations: 5 }, options);\n this.justifyWidth = 0;\n this.totalCost = 0;\n this.totalShift = 0;\n this.durationStats = {};\n // Minimum width required to render all the notes in the voices.\n this.minTotalWidth = 0;\n // This is set to `true` after `minTotalWidth` is calculated.\n this.hasMinTotalWidth = false;\n // Arrays of tick and modifier contexts.\n this.tickContexts = undefined;\n this.modifierContexts = undefined;\n // Gaps between contexts, for free movement of notes post\n // formatting.\n this.contextGaps = {\n total: 0,\n gaps: [],\n };\n this.voices = [];\n this.lossHistory = [];\n }\n /**\n * Helper function to layout \"notes\" one after the other without\n * regard for proportions. Useful for tests and debugging.\n */\n static SimpleFormat(notes, x = 0, { paddingBetween = 10 } = {}) {\n notes.reduce((accumulator, note) => {\n note.addToModifierContext(new ModifierContext());\n const tick = new TickContext().addTickable(note).preFormat();\n const metrics = tick.getMetrics();\n tick.setX(accumulator + metrics.totalLeftPx);\n return accumulator + tick.getWidth() + metrics.totalRightPx + paddingBetween;\n }, x);\n }\n /** Helper function to plot formatter debug info. */\n static plotDebugging(ctx, formatter, xPos, y1, y2, options) {\n options = Object.assign({ stavePadding: Tables.currentMusicFont().lookupMetric('stave.padding') }, options);\n const x = xPos + options.stavePadding;\n const contextGaps = formatter.contextGaps;\n function stroke(x1, x2, color) {\n ctx.beginPath();\n ctx.setStrokeStyle(color);\n ctx.setFillStyle(color);\n ctx.setLineWidth(1);\n ctx.fillRect(x1, y1, Math.max(x2 - x1, 0), y2 - y1);\n }\n ctx.save();\n ctx.setFont(Font.SANS_SERIF, 8);\n contextGaps.gaps.forEach((gap) => {\n stroke(x + gap.x1, x + gap.x2, 'rgba(100,200,100,0.4)');\n ctx.setFillStyle('green');\n ctx.fillText(Math.round(gap.x2 - gap.x1).toString(), x + gap.x1, y2 + 12);\n });\n ctx.setFillStyle('red');\n ctx.fillText(`Loss: ${(formatter.totalCost || 0).toFixed(2)} Shift: ${(formatter.totalShift || 0).toFixed(2)} Gap: ${contextGaps.total.toFixed(2)}`, x - 20, y2 + 27);\n ctx.restore();\n }\n /**\n * Helper function to format and draw a single voice. Returns a bounding\n * box for the notation.\n * @param ctx the rendering context\n * @param stave the stave to which to draw (`Stave` or `TabStave`)\n * @param notes array of `Note` instances (`Note`, `TextNote`, `TabNote`, etc.)\n * @param params one of below:\n * * Setting `autobeam` only `(context, stave, notes, true)` or\n * `(ctx, stave, notes, {autobeam: true})`\n * * Setting `align_rests` a struct is needed `(context, stave, notes, {align_rests: true})`\n * * Setting both a struct is needed `(context, stave, notes, {\n * autobeam: true, align_rests: true})`\n * * `autobeam` automatically generates beams for the notes.\n * * `align_rests` aligns rests with nearby notes.\n */\n static FormatAndDraw(ctx, stave, notes, params) {\n let options = {\n auto_beam: false,\n align_rests: false,\n };\n if (typeof params === 'object') {\n options = Object.assign(Object.assign({}, options), params);\n }\n else if (typeof params === 'boolean') {\n options.auto_beam = params;\n }\n // Start by creating a voice and adding all the notes to it.\n const voice = new Voice(Tables.TIME4_4).setMode(Voice.Mode.SOFT).addTickables(notes);\n // Then create beams, if requested.\n const beams = options.auto_beam ? Beam.applyAndGetBeams(voice) : [];\n // Instantiate a `Formatter` and format the notes.\n new Formatter()\n .joinVoices([voice]) // , { align_rests: options.align_rests })\n .formatToStave([voice], stave, { align_rests: options.align_rests, stave });\n // Render the voice and beams to the stave.\n voice.setStave(stave).draw(ctx, stave);\n beams.forEach((beam) => beam.setContext(ctx).draw());\n // Return the bounding box of the voice.\n return voice.getBoundingBox();\n }\n /**\n * Helper function to format and draw aligned tab and stave notes in two\n * separate staves.\n * @param ctx the rendering context\n * @param tabstave a `TabStave` instance on which to render `TabNote`s.\n * @param stave a `Stave` instance on which to render `Note`s.\n * @param notes array of `Note` instances for the stave (`Note`, `BarNote`, etc.)\n * @param tabnotes array of `Note` instances for the tab stave (`TabNote`, `BarNote`, etc.)\n * @param autobeam automatically generate beams.\n * @param params a configuration object:\n * * `autobeam` automatically generates beams for the notes.\n * * `align_rests` aligns rests with nearby notes.\n */\n static FormatAndDrawTab(ctx, tabstave, stave, tabnotes, notes, autobeam, params) {\n let opts = {\n auto_beam: autobeam,\n align_rests: false,\n };\n if (typeof params === 'object') {\n opts = Object.assign(Object.assign({}, opts), params);\n }\n else if (typeof params === 'boolean') {\n opts.auto_beam = params;\n }\n // Create a `4/4` voice for `notes`.\n const notevoice = new Voice(Tables.TIME4_4).setMode(Voice.Mode.SOFT).addTickables(notes);\n // Create a `4/4` voice for `tabnotes`.\n const tabvoice = new Voice(Tables.TIME4_4).setMode(Voice.Mode.SOFT).addTickables(tabnotes);\n // Then create beams, if requested.\n const beams = opts.auto_beam ? Beam.applyAndGetBeams(notevoice) : [];\n // Instantiate a `Formatter` and align tab and stave notes.\n new Formatter()\n .joinVoices([notevoice]) // , { align_rests: opts.align_rests })\n .joinVoices([tabvoice])\n .formatToStave([notevoice, tabvoice], stave, { align_rests: opts.align_rests });\n // Render voices and beams to staves.\n notevoice.draw(ctx, stave);\n tabvoice.draw(ctx, tabstave);\n beams.forEach((beam) => beam.setContext(ctx).draw());\n // Draw a connector between tab and note staves.\n new StaveConnector(stave, tabstave).setContext(ctx).draw();\n }\n /**\n * Automatically set the vertical position of rests based on previous/next note positions.\n * @param tickables an array of Tickables.\n * @param alignAllNotes If `false`, only align rests that are within a group of beamed notes.\n * @param alignTuplets If `false`, ignores tuplets.\n */\n static AlignRestsToNotes(tickables, alignAllNotes, alignTuplets) {\n tickables.forEach((currTickable, index) => {\n if (isStaveNote(currTickable) && currTickable.isRest()) {\n if (currTickable.getTuplet() && !alignTuplets) {\n return;\n }\n // If activated rests not on default can be rendered as specified.\n const position = currTickable.getGlyph().position.toUpperCase();\n if (position !== 'R/4' && position !== 'B/4') {\n return;\n }\n if (alignAllNotes || currTickable.getBeam()) {\n // Align rests with previous/next notes.\n const props = currTickable.getKeyProps()[0];\n if (index === 0) {\n props.line = getRestLineForNextNoteGroup(tickables, props.line, index, false);\n }\n else if (index > 0 && index < tickables.length) {\n // If previous tickable is a rest, use its line number.\n const prevTickable = tickables[index - 1];\n if (isStaveNote(prevTickable)) {\n if (prevTickable.isRest()) {\n props.line = prevTickable.getKeyProps()[0].line;\n }\n else {\n const restLine = prevTickable.getLineForRest();\n // Get the rest line for next valid non-rest note group.\n props.line = getRestLineForNextNoteGroup(tickables, restLine, index, true);\n }\n }\n }\n currTickable.setKeyLine(0, props.line);\n }\n }\n });\n }\n /**\n * Find all the rests in each of the `voices` and align them to neighboring notes.\n *\n * @param voices\n * @param alignAllNotes If `false`, only align rests within beamed groups of notes. If `true`, align all rests.\n */\n alignRests(voices, alignAllNotes) {\n if (!voices || !voices.length) {\n throw new RuntimeError('BadArgument', 'No voices to format rests');\n }\n voices.forEach((voice) => Formatter.AlignRestsToNotes(voice.getTickables(), alignAllNotes));\n }\n /**\n * Estimate the width required to render 'voices'. This is done by:\n * 1. Sum the widths of all the tick contexts\n * 2. Estimate the padding.\n * The latter is done by calculating the padding 3 different ways, and taking the\n * greatest value:\n * 1. the padding required for unaligned notes in different voices\n * 2. the padding based on the stddev of the tickable widths\n * 3. the padding based on the stddev of the tickable durations.\n *\n * The last 2 quantities estimate a 'width entropy', where notes might need more\n * room than the proportional formatting gives them. A measure of all same duration\n * and width will need no extra padding, and all these quantities will be\n * zero in that case.\n *\n * @param voices the voices that contain the notes\n * @returns the estimated width in pixels\n */\n preCalculateMinTotalWidth(voices) {\n const unalignedPadding = Tables.currentMusicFont().lookupMetric('stave.unalignedNotePadding');\n // Calculate additional padding based on 3 methods:\n // 1) unaligned beats in voices, 2) variance of width, 3) variance of durations\n let unalignedCtxCount = 0;\n let wsum = 0;\n let dsum = 0;\n const widths = [];\n const durations = [];\n // Cache results.\n if (this.hasMinTotalWidth)\n return this.minTotalWidth;\n // Create tick contexts if not already created.\n if (!this.tickContexts) {\n if (!voices) {\n throw new RuntimeError('BadArgument', \"'voices' required to run preCalculateMinTotalWidth\");\n }\n this.createTickContexts(voices);\n }\n // eslint-disable-next-line\n const { list: contextList, map: contextMap } = this.tickContexts;\n this.minTotalWidth = 0;\n // Go through each tick context and calculate total width,\n // and also accumulate values used in padding hints\n contextList.forEach((tick) => {\n const context = contextMap[tick];\n context.preFormat();\n // If this TC doesn't have all the voices on it, it's unaligned.\n // so increment the unaligned padding accumulator\n if (context.getTickables().length < voices.length) {\n unalignedCtxCount += 1;\n }\n // Calculate the 'width entropy' over all the Tickables.\n context.getTickables().forEach((t) => {\n wsum += t.getMetrics().width;\n dsum += t.getTicks().value();\n widths.push(t.getMetrics().width);\n durations.push(t.getTicks().value());\n });\n const width = context.getWidth();\n this.minTotalWidth += width;\n });\n this.hasMinTotalWidth = true;\n // normalized (0-1) STDDEV of widths/durations gives us padding hints.\n const wavg = wsum > 0 ? wsum / widths.length : 1 / widths.length;\n const wvar = sumArray(widths.map((ll) => Math.pow(ll - wavg, 2)));\n const wpads = Math.pow(wvar / widths.length, 0.5) / wavg;\n const davg = dsum / durations.length;\n const dvar = sumArray(durations.map((ll) => Math.pow(ll - davg, 2)));\n const dpads = Math.pow(dvar / durations.length, 0.5) / davg;\n // Find max of 3 methods pad the width with that\n const padmax = Math.max(dpads, wpads) * contextList.length * unalignedPadding;\n const unalignedPad = unalignedPadding * unalignedCtxCount;\n return this.minTotalWidth + Math.max(unalignedPad, padmax);\n }\n /**\n * Get minimum width required to render all voices. Either `format` or\n * `preCalculateMinTotalWidth` must be called before this method.\n */\n getMinTotalWidth() {\n if (!this.hasMinTotalWidth) {\n throw new RuntimeError('NoMinTotalWidth', \"Call 'preCalculateMinTotalWidth' or 'preFormat' before calling 'getMinTotalWidth'\");\n }\n return this.minTotalWidth;\n }\n /** Calculate the resolution multiplier for `voices`. */\n static getResolutionMultiplier(voices) {\n if (!voices || !voices.length) {\n throw new RuntimeError('BadArgument', 'No voices to format');\n }\n const totalTicks = voices[0].getTotalTicks();\n const resolutionMultiplier = voices.reduce((accumulator, voice) => {\n if (!voice.getTotalTicks().equals(totalTicks)) {\n throw new RuntimeError('TickMismatch', 'Voices should have same total note duration in ticks.');\n }\n if (voice.getMode() === Voice.Mode.STRICT && !voice.isComplete()) {\n throw new RuntimeError('IncompleteVoice', 'Voice does not have enough notes.');\n }\n return Math.max(accumulator, Fraction.LCM(accumulator, voice.getResolutionMultiplier()));\n }, 1);\n return resolutionMultiplier;\n }\n /** Create a `ModifierContext` for each tick in `voices`. */\n createModifierContexts(voices) {\n const fn = (tickable, context) => tickable.addToModifierContext(context);\n const contexts = createContexts(voices, () => new ModifierContext(), fn);\n this.modifierContexts = contexts;\n return contexts;\n }\n /**\n * Create a `TickContext` for each tick in `voices`. Also calculate the\n * total number of ticks in voices.\n */\n createTickContexts(voices) {\n const fn = (tickable, context, voiceIndex) => context.addTickable(tickable, voiceIndex);\n const contexts = createContexts(voices, (tick) => new TickContext(tick), fn);\n this.tickContexts = contexts;\n const contextArray = this.tickContexts.array;\n contextArray.forEach((context) => {\n context.tContexts = contextArray;\n });\n return contexts;\n }\n /**\n * This is the core formatter logic. Format voices and justify them\n * to `justifyWidth` pixels. `renderingContext` is required to justify elements\n * that can't retreive widths without a canvas. This method sets the `x` positions\n * of all the tickables/notes in the formatter.\n */\n preFormat(justifyWidth = 0, renderingContext, voicesParam, stave) {\n // Initialize context maps.\n const contexts = this.tickContexts;\n if (!contexts) {\n throw new RuntimeError('NoTickContexts', 'preFormat requires TickContexts');\n }\n const { list: contextList, map: contextMap } = contexts;\n // Reset loss history for evaluator.\n this.lossHistory = [];\n // If voices and a stave were provided, set the Stave for each voice\n // and preFormat to apply Y values to the notes;\n if (voicesParam && stave) {\n voicesParam.forEach((voice) => voice.setStave(stave).preFormat());\n }\n // Now distribute the ticks to each tick context, and assign them their\n // own X positions.\n let x = 0;\n let shift = 0;\n this.minTotalWidth = 0;\n let totalTicks = 0;\n // Pass 1: Give each note maximum width requested by context.\n contextList.forEach((tick) => {\n const context = contextMap[tick];\n // Make sure that all tickables in this context have calculated their\n // space requirements.\n context.preFormat();\n const width = context.getWidth();\n this.minTotalWidth += width;\n const maxTicks = context.getMaxTicks().value();\n totalTicks += maxTicks;\n const metrics = context.getMetrics();\n x = x + shift + metrics.totalLeftPx;\n context.setX(x);\n // Calculate shift for the next tick.\n shift = width - metrics.totalLeftPx;\n });\n // Use softmax based on all notes across all staves. (options.globalSoftmax)\n const { globalSoftmax, softmaxFactor, maxIterations } = this.formatterOptions;\n const exp = (tick) => Math.pow(softmaxFactor, (contextMap[tick].getMaxTicks().value() / totalTicks));\n const expTicksUsed = sumArray(contextList.map(exp));\n this.minTotalWidth = x + shift;\n this.hasMinTotalWidth = true;\n // No justification needed. End formatting.\n if (justifyWidth <= 0)\n return this.evaluate();\n // Start justification. Subtract the right extra pixels of the final context because the formatter\n // justifies based on the context's X position, which is the left-most part of the note head.\n const firstContext = contextMap[contextList[0]];\n const lastContext = contextMap[contextList[contextList.length - 1]];\n // Calculate the \"distance error\" between the tick contexts. The expected distance is the spacing proportional to\n // the softmax of the ticks.\n function calculateIdealDistances(adjustedJustifyWidth) {\n const distances = contextList.map((tick, i) => {\n const context = contextMap[tick];\n const voices = context.getTickablesByVoice();\n let backTickable;\n if (i > 0) {\n const prevContext = contextMap[contextList[i - 1]];\n // Go through each tickable and search backwards for another tickable\n // in the same voice. If found, use that duration (ticks) to calculate\n // the expected distance.\n for (let j = i - 1; j >= 0; j--) {\n const backTick = contextMap[contextList[j]];\n const backVoices = backTick.getTickablesByVoice();\n // Look for matching voices between tick contexts.\n const matchingVoices = [];\n Object.keys(voices).forEach((v) => {\n if (backVoices[v]) {\n matchingVoices.push(v);\n }\n });\n if (matchingVoices.length > 0) {\n // Found matching voices, get largest duration\n let maxTicks = 0;\n let maxNegativeShiftPx = Infinity;\n let expectedDistance = 0;\n matchingVoices.forEach((v) => {\n const ticks = backVoices[v].getTicks().value();\n if (ticks > maxTicks) {\n backTickable = backVoices[v];\n maxTicks = ticks;\n }\n // Calculate the limits of the shift based on modifiers, etc.\n const thisTickable = voices[v];\n const insideLeftEdge = thisTickable.getX() -\n (thisTickable.getMetrics().modLeftPx + thisTickable.getMetrics().leftDisplacedHeadPx);\n const backMetrics = backVoices[v].getMetrics();\n const insideRightEdge = backVoices[v].getX() + backMetrics.notePx + backMetrics.modRightPx + backMetrics.rightDisplacedHeadPx;\n // Don't allow shifting if notes in the same voice can collide\n maxNegativeShiftPx = Math.min(maxNegativeShiftPx, insideLeftEdge - insideRightEdge);\n });\n // Don't shift further left than the notehead of the last context. Actually, stay at most 5% to the right\n // so that two different tick contexts don't align across staves.\n maxNegativeShiftPx = Math.min(maxNegativeShiftPx, context.getX() - (prevContext.getX() + adjustedJustifyWidth * 0.05));\n // Calculate the expected distance of the current context from the last matching tickable. The\n // distance is scaled down by the softmax for the voice.\n if (globalSoftmax) {\n const t = totalTicks;\n expectedDistance = (Math.pow(softmaxFactor, (maxTicks / t)) / expTicksUsed) * adjustedJustifyWidth;\n }\n else if (typeof backTickable !== 'undefined') {\n expectedDistance = backTickable.getVoice().softmax(maxTicks) * adjustedJustifyWidth;\n }\n return {\n expectedDistance,\n maxNegativeShiftPx,\n fromTickable: backTickable,\n };\n }\n }\n }\n return { expectedDistance: 0, fromTickablePx: 0, maxNegativeShiftPx: 0 };\n });\n return distances;\n }\n function shiftToIdealDistances(idealDistances) {\n // Distribute ticks to the contexts based on the calculated distance error.\n const centerX = adjustedJustifyWidth / 2;\n let spaceAccum = 0;\n contextList.forEach((tick, index) => {\n const context = contextMap[tick];\n if (index > 0) {\n const contextX = context.getX();\n const ideal = idealDistances[index];\n const errorPx = defined(ideal.fromTickable).getX() + ideal.expectedDistance - (contextX + spaceAccum);\n let negativeShiftPx = 0;\n if (errorPx > 0) {\n spaceAccum += errorPx;\n }\n else if (errorPx < 0) {\n negativeShiftPx = Math.min(ideal.maxNegativeShiftPx, Math.abs(errorPx));\n spaceAccum += -negativeShiftPx;\n }\n context.setX(contextX + spaceAccum);\n }\n // Move center aligned tickables to middle\n context.getCenterAlignedTickables().forEach((tickable) => {\n tickable.setCenterXShift(centerX - context.getX());\n });\n });\n return lastContext.getX() - firstContext.getX();\n }\n const adjustedJustifyWidth = justifyWidth -\n lastContext.getMetrics().notePx -\n lastContext.getMetrics().totalRightPx -\n firstContext.getMetrics().totalLeftPx;\n const musicFont = Tables.currentMusicFont();\n const configMinPadding = musicFont.lookupMetric('stave.endPaddingMin');\n const configMaxPadding = musicFont.lookupMetric('stave.endPaddingMax');\n let targetWidth = adjustedJustifyWidth;\n const distances = calculateIdealDistances(targetWidth);\n let actualWidth = shiftToIdealDistances(distances);\n // Calculate right justification by finding max of (configured value, min distance between tickables)\n // so measures with lots of white space use it evenly, and crowded measures use at least the configured\n // space.\n const calcMinDistance = (targetWidth, distances) => {\n let mdCalc = targetWidth / 2;\n if (distances.length > 1) {\n for (let di = 1; di < distances.length; ++di) {\n mdCalc = Math.min(distances[di].expectedDistance / 2, mdCalc);\n }\n }\n return mdCalc;\n };\n const minDistance = calcMinDistance(targetWidth, distances);\n // Just one context. Done formatting.\n if (contextList.length === 1)\n return 0;\n // right justify to either the configured padding, or the min distance between notes, whichever is greatest.\n // This * 2 keeps the existing formatting unless there is 'a lot' of extra whitespace, which won't break\n // existing visual regression tests.\n const paddingMax = configMaxPadding * 2 < minDistance ? minDistance : configMaxPadding;\n const paddingMin = paddingMax - (configMaxPadding - configMinPadding);\n const maxX = adjustedJustifyWidth - paddingMin;\n let iterations = maxIterations;\n // Adjust justification width until the right margin is as close as possible to the calculated padding,\n // without going over\n while ((actualWidth > maxX && iterations > 0) || (actualWidth + paddingMax < maxX && iterations > 1)) {\n targetWidth -= actualWidth - maxX;\n actualWidth = shiftToIdealDistances(calculateIdealDistances(targetWidth));\n iterations--;\n }\n this.justifyWidth = justifyWidth;\n return this.evaluate();\n }\n /** Calculate the total cost of this formatting decision. */\n evaluate() {\n if (!this.tickContexts)\n return 0;\n const contexts = this.tickContexts;\n const justifyWidth = this.justifyWidth;\n // Calculate available slack per tick context. This works out how much freedom\n // to move a context has in either direction, without affecting other notes.\n this.contextGaps = { total: 0, gaps: [] };\n contexts.list.forEach((tick, index) => {\n if (index === 0)\n return;\n const prevTick = contexts.list[index - 1];\n const prevContext = contexts.map[prevTick];\n const context = contexts.map[tick];\n const prevMetrics = prevContext.getMetrics();\n const currMetrics = context.getMetrics();\n // Calculate X position of right edge of previous note\n const insideRightEdge = prevContext.getX() + prevMetrics.notePx + prevMetrics.totalRightPx;\n // Calculate X position of left edge of current note\n const insideLeftEdge = context.getX() - currMetrics.totalLeftPx;\n const gap = insideLeftEdge - insideRightEdge;\n this.contextGaps.total += gap;\n this.contextGaps.gaps.push({ x1: insideRightEdge, x2: insideLeftEdge });\n // Tell the tick contexts how much they can reposition themselves.\n context.getFormatterMetrics().freedom.left = gap;\n prevContext.getFormatterMetrics().freedom.right = gap;\n });\n // Calculate mean distance in each voice for each duration type, then calculate\n // how far each note is from the mean.\n this.durationStats = {};\n const durationStats = this.durationStats;\n function updateStats(duration, space) {\n const stats = durationStats[duration];\n if (stats === undefined) {\n durationStats[duration] = { mean: space, count: 1 };\n }\n else {\n stats.count += 1;\n stats.mean = (stats.mean + space) / 2;\n }\n }\n this.voices.forEach((voice) => {\n voice.getTickables().forEach((note, i, notes) => {\n const duration = note.getTicks().clone().simplify().toString();\n const metrics = note.getMetrics();\n const formatterMetrics = note.getFormatterMetrics();\n const leftNoteEdge = note.getX() + metrics.notePx + metrics.modRightPx + metrics.rightDisplacedHeadPx;\n let space = 0;\n if (i < notes.length - 1) {\n const rightNote = notes[i + 1];\n const rightMetrics = rightNote.getMetrics();\n const rightNoteEdge = rightNote.getX() - rightMetrics.modLeftPx - rightMetrics.leftDisplacedHeadPx;\n space = rightNoteEdge - leftNoteEdge;\n formatterMetrics.space.used = rightNote.getX() - note.getX();\n rightNote.getFormatterMetrics().freedom.left = space;\n }\n else {\n space = justifyWidth - leftNoteEdge;\n formatterMetrics.space.used = justifyWidth - note.getX();\n }\n formatterMetrics.freedom.right = space;\n updateStats(duration, formatterMetrics.space.used);\n });\n });\n // Calculate how much each note deviates from the mean. Loss function is square\n // root of the sum of squared deviations.\n let totalDeviation = 0;\n this.voices.forEach((voice) => {\n voice.getTickables().forEach((note) => {\n const duration = note.getTicks().clone().simplify().toString();\n const metrics = note.getFormatterMetrics();\n metrics.space.mean = durationStats[duration].mean;\n metrics.duration = duration;\n metrics.iterations += 1;\n metrics.space.deviation = metrics.space.used - metrics.space.mean;\n totalDeviation += Math.pow(metrics.space.deviation, 2);\n });\n });\n this.totalCost = Math.sqrt(totalDeviation);\n this.lossHistory.push(this.totalCost);\n return this.totalCost;\n }\n /**\n * Run a single iteration of rejustification. At a high level, this method calculates\n * the overall \"loss\" (or cost) of this layout, and repositions tickcontexts in an\n * attempt to reduce the cost. You can call this method multiple times until it finds\n * and oscillates around a global minimum.\n * @param alpha the \"learning rate\" for the formatter. It determines how much of a shift\n * the formatter should make based on its cost function.\n */\n tune(options) {\n var _a;\n const contexts = this.tickContexts;\n if (!contexts) {\n return 0;\n }\n const alpha = (_a = options === null || options === void 0 ? void 0 : options.alpha) !== null && _a !== void 0 ? _a : 0.5;\n // Move `current` tickcontext by `shift` pixels, and adjust the freedom\n // on adjacent tickcontexts.\n function move(current, shift, prev, next) {\n current.setX(current.getX() + shift);\n current.getFormatterMetrics().freedom.left += shift;\n current.getFormatterMetrics().freedom.right -= shift;\n if (prev)\n prev.getFormatterMetrics().freedom.right += shift;\n if (next)\n next.getFormatterMetrics().freedom.left -= shift;\n }\n let shift = 0;\n this.totalShift = 0;\n contexts.list.forEach((tick, index, list) => {\n const context = contexts.map[tick];\n const prevContext = index > 0 ? contexts.map[list[index - 1]] : undefined;\n const nextContext = index < list.length - 1 ? contexts.map[list[index + 1]] : undefined;\n move(context, shift, prevContext, nextContext);\n const cost = -sumArray(context.getTickables().map((t) => t.getFormatterMetrics().space.deviation));\n if (cost > 0) {\n shift = -Math.min(context.getFormatterMetrics().freedom.right, Math.abs(cost));\n }\n else if (cost < 0) {\n if (nextContext) {\n shift = Math.min(nextContext.getFormatterMetrics().freedom.right, Math.abs(cost));\n }\n else {\n shift = 0;\n }\n }\n shift *= alpha;\n this.totalShift += shift;\n });\n return this.evaluate();\n }\n /**\n * This is the top-level call for all formatting logic completed\n * after `x` *and* `y` values have been computed for the notes\n * in the voices.\n */\n postFormat() {\n const postFormatContexts = (contexts) => contexts.list.forEach((tick) => contexts.map[tick].postFormat());\n if (this.modifierContexts)\n postFormatContexts(this.modifierContexts);\n if (this.tickContexts)\n postFormatContexts(this.tickContexts);\n return this;\n }\n /**\n * Take all `voices` and create `ModifierContext`s out of them. This tells\n * the formatters that the voices belong on a single stave.\n */\n joinVoices(voices) {\n this.createModifierContexts(voices);\n this.hasMinTotalWidth = false;\n return this;\n }\n /**\n * Align rests in voices, justify the contexts, and position the notes\n * so voices are aligned and ready to render onto the stave. This method\n * mutates the `x` positions of all tickables in `voices`.\n *\n * Voices are full justified to fit in `justifyWidth` pixels.\n *\n * Set `options.context` to the rendering context. Set `options.align_rests`\n * to true to enable rest alignment.\n */\n format(voices, justifyWidth, options) {\n const opts = Object.assign({ align_rests: false }, options);\n this.voices = voices;\n const softmaxFactor = this.formatterOptions.softmaxFactor;\n if (softmaxFactor) {\n this.voices.forEach((v) => v.setSoftmaxFactor(softmaxFactor));\n }\n this.alignRests(voices, opts.align_rests);\n this.createTickContexts(voices);\n this.preFormat(justifyWidth, opts.context, voices, opts.stave);\n // Only postFormat if a stave was supplied for y value formatting\n if (opts.stave)\n this.postFormat();\n return this;\n }\n // This method is just like `format` except that the `justifyWidth` is inferred from the `stave`.\n formatToStave(voices, stave, optionsParam) {\n const options = Object.assign({ context: stave.getContext() }, optionsParam);\n // eslint-disable-next-line\n const justifyWidth = stave.getNoteEndX() - stave.getNoteStartX() - Stave.defaultPadding;\n L('Formatting voices to width: ', justifyWidth);\n return this.format(voices, justifyWidth, options);\n }\n getTickContext(tick) {\n var _a;\n return (_a = this.tickContexts) === null || _a === void 0 ? void 0 : _a.map[tick];\n }\n}\n// To enable logging for this class. Set `Vex.Flow.Formatter.DEBUG` to `true`.\nFormatter.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Author: Joshua Koo / @zz85\n// Author: @incompleteopus\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\n/** Fraction represents a rational number. */\nexport class Fraction {\n /** Set the numerator and denominator. */\n constructor(numerator, denominator) {\n this.numerator = 1;\n this.denominator = 1;\n this.set(numerator, denominator);\n }\n static get CATEGORY() {\n return Category.Fraction;\n }\n /**\n * GCD: Greatest common divisor using the Euclidean algorithm.\n * Note: GCD(0, 0) => 0 and GCD(0, n) => n.\n */\n static GCD(a, b) {\n if (typeof a !== 'number' || Number.isNaN(a) || typeof b !== 'number' || Number.isNaN(b)) {\n throw new RuntimeError('BadArgument', `Invalid numbers: ${a}, ${b}`);\n }\n let t;\n while (b !== 0) {\n t = b;\n b = a % b;\n a = t;\n }\n return a;\n }\n /** LCM: Lowest common multiple. */\n static LCM(a, b) {\n return (a * b) / Fraction.GCD(a, b);\n }\n /** Lowest common multiple for more than two numbers. */\n static LCMM(args) {\n if (args.length === 0) {\n return 0;\n }\n else if (args.length === 1) {\n return args[0];\n }\n else if (args.length === 2) {\n return Fraction.LCM(args[0], args[1]);\n }\n else {\n // args.shift() removes the first number.\n // LCM the first number with the rest of the numbers.\n return Fraction.LCM(args.shift(), Fraction.LCMM(args));\n }\n }\n /** Set the numerator and denominator. */\n set(numerator = 1, denominator = 1) {\n this.numerator = numerator;\n this.denominator = denominator;\n return this;\n }\n /** Return the value of the fraction. */\n value() {\n return this.numerator / this.denominator;\n }\n /** Simplify numerator and denominator using GCD. */\n simplify() {\n let u = this.numerator;\n let d = this.denominator;\n const gcd = Fraction.GCD(u, d);\n u /= gcd;\n d /= gcd;\n if (d < 0) {\n d = -d;\n u = -u;\n }\n return this.set(u, d);\n }\n /** Add value of another fraction. */\n add(param1 = 0, param2 = 1) {\n const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2);\n const lcm = Fraction.LCM(this.denominator, otherDenominator);\n const a = lcm / this.denominator;\n const b = lcm / otherDenominator;\n const u = this.numerator * a + otherNumerator * b;\n return this.set(u, lcm);\n }\n /** Substract value of another fraction. */\n subtract(param1 = 0, param2 = 1) {\n const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2);\n const lcm = Fraction.LCM(this.denominator, otherDenominator);\n const a = lcm / this.denominator;\n const b = lcm / otherDenominator;\n const u = this.numerator * a - otherNumerator * b;\n return this.set(u, lcm);\n }\n /** Multiply by value of another fraction. */\n multiply(param1 = 1, param2 = 1) {\n const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2);\n return this.set(this.numerator * otherNumerator, this.denominator * otherDenominator);\n }\n /** Divide by value of another Fraction. */\n divide(param1 = 1, param2 = 1) {\n const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2);\n return this.set(this.numerator * otherDenominator, this.denominator * otherNumerator);\n }\n /** Simplify both sides and check if they are equal. */\n equals(compare) {\n const a = Fraction.__staticFractionA.copy(compare).simplify();\n const b = Fraction.__staticFractionB.copy(this).simplify();\n return a.numerator === b.numerator && a.denominator === b.denominator;\n }\n /** Greater than operator. */\n greaterThan(compare) {\n const a = Fraction.__staticFractionB.copy(this);\n a.subtract(compare);\n return a.numerator > 0;\n }\n /** Greater than or equals operator. */\n greaterThanEquals(compare) {\n const a = Fraction.__staticFractionB.copy(this);\n a.subtract(compare);\n return a.numerator >= 0;\n }\n /** Less than operator. */\n lessThan(compare) {\n return !this.greaterThanEquals(compare);\n }\n /** Less than or equals operator. */\n lessThanEquals(compare) {\n return !this.greaterThan(compare);\n }\n /** Return a new copy with current values. */\n clone() {\n return new Fraction(this.numerator, this.denominator);\n }\n /** Copy value of another fraction. */\n copy(other) {\n if (typeof other === 'number') {\n return this.set(other, 1);\n }\n else {\n return this.set(other.numerator, other.denominator);\n }\n }\n /** Return the integer component (eg. 5/2 => 2). */\n quotient() {\n return Math.floor(this.numerator / this.denominator);\n }\n /** Return the remainder component (eg. 5/2 => 1). */\n remainder() {\n return this.numerator % this.denominator;\n }\n /** Calculate absolute value. */\n makeAbs() {\n this.denominator = Math.abs(this.denominator);\n this.numerator = Math.abs(this.numerator);\n return this;\n }\n /** Return a raw string representation (eg. \"5/2\"). */\n toString() {\n return `${this.numerator}/${this.denominator}`;\n }\n /** Return a simplified string respresentation. */\n toSimplifiedString() {\n return Fraction.__staticFractionTmp.copy(this).simplify().toString();\n }\n /** Return string representation in mixed form. */\n toMixedString() {\n let s = '';\n const q = this.quotient();\n const f = Fraction.__staticFractionTmp.copy(this);\n if (q < 0) {\n f.makeAbs();\n }\n if (q !== 0) {\n s += q;\n if (f.numerator !== 0) {\n s += ` ${f.toSimplifiedString()}`;\n }\n }\n else if (f.numerator === 0) {\n s = '0';\n }\n else {\n s = f.toSimplifiedString();\n }\n return s;\n }\n /** Parse a fraction string. */\n parse(str) {\n const i = str.split('/');\n const n = parseInt(i[0], 10);\n const d = i[1] ? parseInt(i[1], 10) : 1;\n return this.set(n, d);\n }\n}\n// Cached objects for comparisons.\nFraction.__staticFractionA = new Fraction();\nFraction.__staticFractionB = new Fraction();\nFraction.__staticFractionTmp = new Fraction();\n/** Helper function to extract the numerator and denominator from another fraction. */\nfunction getNumeratorAndDenominator(n, d = 1) {\n if (typeof n === 'number') {\n // Both params are numbers, so we return them as [numerator, denominator].\n return [n, d];\n }\n else {\n // First param is a Fraction object. We ignore the second param.\n return [n.numerator, n.denominator];\n }\n}\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n// Author Larry Kuhns 2013\n// Class to draws string numbers into the notation.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { Tables } from './tables';\nimport { TextFormatter } from './textformatter';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class FretHandFinger extends Modifier {\n constructor(finger) {\n super();\n this.finger = finger;\n this.width = 7;\n this.position = Modifier.Position.LEFT; // Default position above stem or note head\n this.x_shift = 0;\n this.y_shift = 0;\n this.x_offset = 0; // Horizontal offset from default\n this.y_offset = 0; // Vertical offset from default\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.FretHandFinger;\n }\n // Arrange fingerings inside a ModifierContext.\n static format(nums, state) {\n const { left_shift, right_shift } = state;\n const num_spacing = 1;\n if (!nums || nums.length === 0)\n return false;\n const nums_list = [];\n let prev_note = null;\n let shiftLeft = 0;\n let shiftRight = 0;\n for (let i = 0; i < nums.length; ++i) {\n const num = nums[i];\n const note = num.getNote();\n const pos = num.getPosition();\n const index = num.checkIndex();\n const props = note.getKeyProps()[index];\n const textFormatter = TextFormatter.create(num.textFont);\n const textHeight = textFormatter.maxHeight;\n if (num.position === ModifierPosition.ABOVE) {\n state.top_text_line += textHeight / Tables.STAVE_LINE_DISTANCE + 0.5;\n }\n if (num.position === ModifierPosition.BELOW) {\n state.text_line += textHeight / Tables.STAVE_LINE_DISTANCE + 0.5;\n }\n if (note !== prev_note) {\n for (let n = 0; n < note.keys.length; ++n) {\n if (left_shift === 0) {\n shiftLeft = Math.max(note.getLeftDisplacedHeadPx(), shiftLeft);\n }\n if (right_shift === 0) {\n shiftRight = Math.max(note.getRightDisplacedHeadPx(), shiftRight);\n }\n }\n prev_note = note;\n }\n nums_list.push({\n note,\n num,\n pos,\n line: props.line,\n shiftL: shiftLeft,\n shiftR: shiftRight,\n });\n }\n // Sort fingernumbers by line number.\n nums_list.sort((a, b) => b.line - a.line);\n let numShiftL = 0;\n let numShiftR = 0;\n let xWidthL = 0;\n let xWidthR = 0;\n let lastLine = null;\n let lastNote = null;\n for (let i = 0; i < nums_list.length; ++i) {\n let num_shift = 0;\n const { note, pos, num, line, shiftL, shiftR } = nums_list[i];\n // Reset the position of the string number every line.\n if (line !== lastLine || note !== lastNote) {\n numShiftL = left_shift + shiftL;\n numShiftR = right_shift + shiftR;\n }\n const numWidth = num.getWidth() + num_spacing;\n if (pos === Modifier.Position.LEFT) {\n num.setXShift(left_shift + numShiftL);\n num_shift = left_shift + numWidth; // spacing\n xWidthL = num_shift > xWidthL ? num_shift : xWidthL;\n }\n else if (pos === Modifier.Position.RIGHT) {\n num.setXShift(numShiftR);\n num_shift = shiftRight + numWidth; // spacing\n xWidthR = num_shift > xWidthR ? num_shift : xWidthR;\n }\n lastLine = line;\n lastNote = note;\n }\n state.left_shift += xWidthL;\n state.right_shift += xWidthR;\n return true;\n }\n static easyScoreHook({ fingerings } = {}, note, builder) {\n fingerings === null || fingerings === void 0 ? void 0 : fingerings.split(',').map((fingeringString) => {\n const split = fingeringString.trim().split('.');\n const params = { number: split[0] };\n if (split[1])\n params.position = split[1];\n return builder.getFactory().Fingering(params);\n }).map((fingering, index) => note.addModifier(fingering, index));\n }\n setFretHandFinger(finger) {\n this.finger = finger;\n return this;\n }\n getFretHandFinger() {\n return this.finger;\n }\n setOffsetX(x) {\n this.x_offset = x;\n return this;\n }\n setOffsetY(y) {\n this.y_offset = y;\n return this;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(this.position, this.index);\n let dot_x = start.x + this.x_shift + this.x_offset;\n let dot_y = start.y + this.y_shift + this.y_offset + 5;\n switch (this.position) {\n case Modifier.Position.ABOVE:\n dot_x -= 4;\n dot_y -= 12;\n break;\n case Modifier.Position.BELOW:\n dot_x -= 2;\n dot_y += 10;\n break;\n case Modifier.Position.LEFT:\n dot_x -= this.width;\n break;\n case Modifier.Position.RIGHT:\n dot_x += 1;\n break;\n default:\n throw new RuntimeError('InvalidPosition', `The position ${this.position} does not exist`);\n }\n ctx.save();\n ctx.setFont(this.textFont);\n ctx.fillText('' + this.finger, dot_x, dot_y);\n ctx.restore();\n }\n}\nFretHandFinger.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 9,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\nimport { StemmableNote } from './stemmablenote';\nimport { Category, isAnnotation } from './typeguard';\nimport { RuntimeError } from './util';\nconst ERROR_MSG = 'Ghost note must have valid initialization data to identify duration.';\nexport class GhostNote extends StemmableNote {\n static get CATEGORY() {\n return Category.GhostNote;\n }\n constructor(parameter) {\n if (!parameter) {\n throw new RuntimeError('BadArguments', ERROR_MSG);\n }\n let noteStruct;\n if (typeof parameter === 'string') {\n // Preserve backwards-compatibility\n noteStruct = { duration: parameter };\n }\n else if (typeof parameter === 'object') {\n noteStruct = parameter;\n }\n else {\n throw new RuntimeError('BadArguments', ERROR_MSG);\n }\n super(noteStruct);\n // Note properties\n this.setWidth(0);\n }\n /**\n * @returns true if this note is a type of rest. Rests don't have pitches, but take up space in the score.\n */\n isRest() {\n return true;\n }\n setStave(stave) {\n super.setStave(stave);\n return this;\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n draw() {\n // Draw Annotations\n this.setRendered();\n for (let i = 0; i < this.modifiers.length; ++i) {\n const modifier = this.modifiers[i];\n if (isAnnotation(modifier)) {\n modifier.setContext(this.getContext());\n modifier.drawWithStyle();\n }\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { BoundingBox } from './boundingbox';\nimport { BoundingBoxComputation } from './boundingboxcomputation';\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nexport var OutlineCode;\n(function (OutlineCode) {\n OutlineCode[OutlineCode[\"MOVE\"] = 0] = \"MOVE\";\n OutlineCode[OutlineCode[\"LINE\"] = 1] = \"LINE\";\n OutlineCode[OutlineCode[\"QUADRATIC\"] = 2] = \"QUADRATIC\";\n OutlineCode[OutlineCode[\"BEZIER\"] = 3] = \"BEZIER\";\n})(OutlineCode || (OutlineCode = {}));\nclass GlyphCacheEntry {\n constructor(fontStack, code, category) {\n this.point = -1;\n this.metrics = Glyph.loadMetrics(fontStack, code, category);\n this.bbox = Glyph.getOutlineBoundingBox(this.metrics.outline, this.metrics.scale, this.metrics.x_shift, this.metrics.y_shift);\n if (category) {\n this.point = Glyph.lookupFontMetric(this.metrics.font, category, code, 'point', -1);\n }\n }\n}\nclass GlyphCache {\n constructor() {\n this.cache = new Map();\n }\n lookup(code, category) {\n let entries = this.cache.get(Glyph.CURRENT_CACHE_KEY);\n if (entries === undefined) {\n entries = {};\n this.cache.set(Glyph.CURRENT_CACHE_KEY, entries);\n }\n const key = category ? `${code}%${category}` : code;\n let entry = entries[key];\n if (entry === undefined) {\n entry = new GlyphCacheEntry(Glyph.MUSIC_FONT_STACK, code, category);\n entries[key] = entry;\n }\n return entry;\n }\n}\nclass GlyphOutline {\n constructor(outline, originX, originY, scale) {\n this.outline = outline;\n this.originX = originX;\n this.originY = originY;\n this.scale = scale;\n this.i = 0;\n // Automatically assign private properties: this.outline, this.originX, this.originY, and this.scale.\n }\n done() {\n return this.i >= this.outline.length;\n }\n next() {\n return this.outline[this.i++];\n }\n nextX() {\n return this.originX + this.outline[this.i++] * this.scale;\n }\n nextY() {\n return this.originY - this.outline[this.i++] * this.scale;\n }\n static parse(str) {\n const result = [];\n const parts = str.split(' ');\n let i = 0;\n while (i < parts.length) {\n switch (parts[i++]) {\n case 'm':\n result.push(OutlineCode.MOVE, parseInt(parts[i++]), parseInt(parts[i++]));\n break;\n case 'l':\n result.push(OutlineCode.LINE, parseInt(parts[i++]), parseInt(parts[i++]));\n break;\n case 'q':\n result.push(OutlineCode.QUADRATIC, parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]));\n break;\n case 'b':\n result.push(OutlineCode.BEZIER, parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]));\n break;\n }\n }\n return result;\n }\n}\nexport class Glyph extends Element {\n /**\n * @param code\n * @param point\n * @param options\n */\n constructor(code, point, options) {\n super();\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // INSTANCE MEMBERS\n this.bbox = new BoundingBox(0, 0, 0, 0);\n this.topGlyphs = [];\n this.botGlyphs = [];\n this.options = {};\n this.scale = 1;\n this.code = code;\n this.point = point;\n this.originShift = { x: 0, y: 0 };\n this.x_shift = 0;\n this.y_shift = 0;\n if (options) {\n this.setOptions(options);\n }\n else {\n this.reset();\n }\n }\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // STATIC MEMBERS\n static get CATEGORY() {\n return Category.Glyph;\n }\n /**\n * Pass a key of the form `glyphs.{category}.{code}.{key}` to Font.lookupMetric(). If the initial lookup fails,\n * try again with the path `glyphs.{category}.{key}`. If the second lookup fails, return the defaultValue.\n *\n * @param font\n * @param category any metric path under 'glyphs', so 'stem.up' could resolve to glyphs.stem.up.shiftX, glyphs.stem.up.shiftY, etc.\n * @param code\n * @param key\n * @param defaultValue\n */\n static lookupFontMetric(font, category, code, key, defaultValue) {\n let value = font.lookupMetric(`glyphs.${category}.${code}.${key}`, undefined);\n if (value === undefined) {\n // The first lookup failed, so we omit .${code} and try again (with a defaultValue this time).\n value = font.lookupMetric(`glyphs.${category}.${key}`, defaultValue);\n }\n return value;\n }\n static lookupGlyph(fontStack, code) {\n defined(fontStack, 'BadFontStack', 'Font stack is misconfigured');\n let glyph;\n let font;\n for (let i = 0; i < fontStack.length; i++) {\n font = fontStack[i];\n glyph = font.getGlyphs()[code];\n if (glyph)\n return { glyph, font };\n }\n throw new RuntimeError('BadGlyph', `Glyph ${code} does not exist in font.`);\n }\n static loadMetrics(fontStack, code, category) {\n const { glyph, font } = Glyph.lookupGlyph(fontStack, code);\n if (!glyph.o)\n throw new RuntimeError('BadGlyph', `Glyph ${code} has no outline defined.`);\n let x_shift = 0;\n let y_shift = 0;\n let scale = 1;\n if (category && font) {\n x_shift = Glyph.lookupFontMetric(font, category, code, 'shiftX', 0);\n y_shift = Glyph.lookupFontMetric(font, category, code, 'shiftY', 0);\n scale = Glyph.lookupFontMetric(font, category, code, 'scale', 1);\n }\n const x_min = glyph.x_min;\n const x_max = glyph.x_max;\n const ha = glyph.ha;\n if (!glyph.cached_outline) {\n glyph.cached_outline = GlyphOutline.parse(glyph.o);\n }\n return {\n x_min,\n x_max,\n x_shift,\n y_shift,\n scale,\n ha,\n outline: glyph.cached_outline,\n font,\n width: x_max - x_min,\n height: ha,\n };\n }\n /**\n * Renders glyphs from the default font stack.\n *\n * @param ctx Canvas or SVG context\n * @param x_pos x coordinate\n * @param y_pos y coordinate\n * @param point the point size of the font\n * @param code the glyph code in font.getGlyphs()\n * @param options\n * @returns\n */\n static renderGlyph(ctx, x_pos, y_pos, point, code, options) {\n var _a;\n const data = Glyph.cache.lookup(code, options === null || options === void 0 ? void 0 : options.category);\n const metrics = data.metrics;\n if (data.point != -1) {\n point = data.point;\n }\n const customScale = (_a = options === null || options === void 0 ? void 0 : options.scale) !== null && _a !== void 0 ? _a : 1;\n const scale = ((point * 72.0) / (metrics.font.getResolution() * 100.0)) * metrics.scale * customScale;\n Glyph.renderOutline(ctx, metrics.outline, scale, x_pos + metrics.x_shift * customScale, y_pos + metrics.y_shift * customScale);\n return metrics;\n }\n static renderOutline(ctx, outline, scale, x_pos, y_pos) {\n const go = new GlyphOutline(outline, x_pos, y_pos, scale);\n ctx.beginPath();\n let x, y;\n while (!go.done()) {\n switch (go.next()) {\n case OutlineCode.MOVE:\n ctx.moveTo(go.nextX(), go.nextY());\n break;\n case OutlineCode.LINE:\n ctx.lineTo(go.nextX(), go.nextY());\n break;\n case OutlineCode.QUADRATIC:\n x = go.nextX();\n y = go.nextY();\n ctx.quadraticCurveTo(go.nextX(), go.nextY(), x, y);\n break;\n case OutlineCode.BEZIER:\n x = go.nextX();\n y = go.nextY();\n ctx.bezierCurveTo(go.nextX(), go.nextY(), go.nextX(), go.nextY(), x, y);\n break;\n }\n }\n ctx.fill();\n }\n static getOutlineBoundingBox(outline, scale, x_pos, y_pos) {\n const go = new GlyphOutline(outline, x_pos, y_pos, scale);\n const bboxComp = new BoundingBoxComputation();\n // (penX, penY) hold the pen position: the start of each stroke.\n let penX = x_pos;\n let penY = y_pos;\n let x, y;\n while (!go.done()) {\n switch (go.next()) {\n case OutlineCode.MOVE:\n // Note that we don't add any points to the bounding box until a srroke is actually drawn.\n penX = go.nextX();\n penY = go.nextY();\n break;\n case OutlineCode.LINE:\n bboxComp.addPoint(penX, penY);\n penX = go.nextX();\n penY = go.nextY();\n bboxComp.addPoint(penX, penY);\n break;\n case OutlineCode.QUADRATIC:\n x = go.nextX();\n y = go.nextY();\n bboxComp.addQuadraticCurve(penX, penY, go.nextX(), go.nextY(), x, y);\n penX = x;\n penY = y;\n break;\n case OutlineCode.BEZIER:\n x = go.nextX();\n y = go.nextY();\n bboxComp.addBezierCurve(penX, penY, go.nextX(), go.nextY(), go.nextX(), go.nextY(), x, y);\n penX = x;\n penY = y;\n break;\n }\n }\n return new BoundingBox(bboxComp.getX1(), bboxComp.getY1(), bboxComp.width(), bboxComp.height());\n }\n static getWidth(code, point, category) {\n const data = Glyph.cache.lookup(code, category);\n if (data.point != -1) {\n point = data.point;\n }\n const scale = (point * 72) / (data.metrics.font.getResolution() * 100);\n return data.bbox.getW() * scale;\n }\n // eslint-disable-next-line\n draw(...args) {\n // DO NOTHING.\n }\n getCode() {\n return this.code;\n }\n // eslint-disable-next-line\n setOptions(options) {\n this.options = Object.assign(Object.assign({}, this.options), options);\n this.reset();\n }\n setPoint(point) {\n this.point = point;\n return this;\n }\n setStave(stave) {\n this.stave = stave;\n return this;\n }\n setXShift(x_shift) {\n this.x_shift = x_shift;\n return this;\n }\n setYShift(y_shift) {\n this.y_shift = y_shift;\n return this;\n }\n reset() {\n const data = Glyph.cache.lookup(this.code, this.options.category);\n this.metrics = data.metrics;\n // Override point from metrics file\n if (data.point != -1) {\n this.point = data.point;\n }\n this.scale = (this.point * 72) / (this.metrics.font.getResolution() * 100);\n this.bbox = new BoundingBox(data.bbox.getX() * this.scale, data.bbox.getY() * this.scale, data.bbox.getW() * this.scale, data.bbox.getH() * this.scale);\n }\n checkMetrics() {\n return defined(this.metrics, 'BadGlyph', `Glyph ${this.code} is not initialized.`);\n }\n getMetrics() {\n const metrics = this.checkMetrics();\n const metricsScale = metrics.scale;\n return {\n x_min: metrics.x_min * this.scale * metricsScale,\n x_max: metrics.x_max * this.scale * metricsScale,\n width: this.bbox.getW(),\n height: this.bbox.getH(),\n scale: this.scale * metricsScale,\n x_shift: metrics.x_shift,\n y_shift: metrics.y_shift,\n outline: metrics.outline,\n font: metrics.font,\n ha: metrics.ha,\n };\n }\n setOriginX(x) {\n const { bbox } = this;\n const originX = Math.abs(bbox.getX() / bbox.getW());\n const xShift = (x - originX) * bbox.getW();\n this.originShift.x = -xShift;\n }\n setOriginY(y) {\n const { bbox } = this;\n const originY = Math.abs(bbox.getY() / bbox.getH());\n const yShift = (y - originY) * bbox.getH();\n this.originShift.y = -yShift;\n }\n setOrigin(x, y) {\n this.setOriginX(x);\n this.setOriginY(y);\n }\n render(ctx, x, y) {\n const metrics = this.checkMetrics();\n const outline = metrics.outline;\n const scale = this.scale * metrics.scale;\n this.setRendered();\n this.applyStyle(ctx);\n const xPos = x + this.originShift.x + metrics.x_shift;\n const yPos = y + this.originShift.y + metrics.y_shift;\n Glyph.renderOutline(ctx, outline, scale, xPos, yPos);\n this.restoreStyle(ctx);\n }\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n renderToStave(x) {\n const context = this.checkContext();\n const metrics = this.checkMetrics();\n const stave = this.checkStave();\n const outline = metrics.outline;\n const scale = this.scale * metrics.scale;\n this.setRendered();\n this.applyStyle();\n const xPos = x + this.x_shift + metrics.x_shift;\n const yPos = stave.getYForGlyphs() + this.y_shift + metrics.y_shift;\n Glyph.renderOutline(context, outline, scale, xPos, yPos);\n this.restoreStyle();\n }\n}\nGlyph.cache = new GlyphCache();\n// The current cache key for GlyphCache above.\n// Computed when Flow.setMusicFont(...) is called.\n// It is set to a comma separated list of font names.\nGlyph.CURRENT_CACHE_KEY = '';\n// Used by the GlyphCache above.\n// Set when Flow.setMusicFont(...) is called.\nGlyph.MUSIC_FONT_STACK = [];\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { Note } from './note';\nimport { Category } from './typeguard';\nexport class GlyphNote extends Note {\n constructor(glyph, noteStruct, options) {\n super(noteStruct);\n this.options = Object.assign({ ignoreTicks: false, line: 2 }, options);\n // Note properties\n this.ignore_ticks = this.options.ignoreTicks;\n if (glyph) {\n this.setGlyph(glyph);\n }\n }\n static get CATEGORY() {\n return Category.GlyphNote;\n }\n setGlyph(glyph) {\n this.glyph = glyph;\n this.setWidth(this.glyph.getMetrics().width);\n return this;\n }\n getBoundingBox() {\n return this.glyph.getBoundingBox();\n }\n preFormat() {\n if (!this.preFormatted && this.modifierContext) {\n this.modifierContext.preFormat();\n }\n this.preFormatted = true;\n return this;\n }\n drawModifiers() {\n const ctx = this.checkContext();\n ctx.openGroup('modifiers');\n for (let i = 0; i < this.modifiers.length; i++) {\n const modifier = this.modifiers[i];\n modifier.setContext(ctx);\n modifier.drawWithStyle();\n }\n ctx.closeGroup();\n }\n draw() {\n const stave = this.checkStave();\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.openGroup('glyphNote', this.getAttribute('id'));\n // Context is set when setStave is called on Note\n const glyph = this.glyph;\n if (!glyph.getContext()) {\n glyph.setContext(ctx);\n }\n glyph.setStave(stave);\n glyph.setYShift(stave.getYForLine(this.options.line) - stave.getYForGlyphs());\n const x = this.isCenterAligned() ? this.getAbsoluteX() - this.getWidth() / 2 : this.getAbsoluteX();\n glyph.renderToStave(x);\n this.drawModifiers();\n ctx.closeGroup();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { StaveNote } from './stavenote';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class GraceNote extends StaveNote {\n constructor(noteStruct) {\n super(Object.assign({ glyph_font_scale: Tables.NOTATION_FONT_SCALE * GraceNote.SCALE, stroke_px: GraceNote.LEDGER_LINE_OFFSET }, noteStruct));\n this.slash = noteStruct.slash || false;\n this.slur = true;\n this.buildNoteHeads();\n this.width = 3;\n }\n static get CATEGORY() {\n return Category.GraceNote;\n }\n static get LEDGER_LINE_OFFSET() {\n return 2;\n }\n static get SCALE() {\n return 0.66;\n }\n getStemExtension() {\n if (this.stem_extension_override) {\n return this.stem_extension_override;\n }\n const glyph = this.getGlyph();\n if (glyph) {\n let ret = super.getStemExtension();\n if (glyph.stem) {\n const staveNoteScale = this.getStaveNoteScale();\n ret = (Stem.HEIGHT + ret) * staveNoteScale - Stem.HEIGHT;\n }\n return ret;\n }\n return 0;\n }\n // FIXME: move this to more basic class.\n getStaveNoteScale() {\n return this.render_options.glyph_font_scale / Tables.NOTATION_FONT_SCALE;\n }\n draw() {\n super.draw();\n this.setRendered();\n const stem = this.stem;\n if (this.slash && stem) {\n const staveNoteScale = this.getStaveNoteScale();\n // some magic numbers are based on the staveNoteScale 0.66.\n const offsetScale = staveNoteScale / 0.66;\n let slashBBox = undefined;\n const beam = this.beam;\n if (beam) {\n // FIXME: should render slash after beam?\n if (!beam.postFormatted) {\n beam.postFormat();\n }\n slashBBox = this.calcBeamedNotesSlashBBox(8 * offsetScale, 8 * offsetScale, {\n stem: 6 * offsetScale,\n beam: 5 * offsetScale,\n });\n }\n else {\n const stem_direction = this.getStemDirection();\n const noteHeadBounds = this.getNoteHeadBounds();\n const noteStemHeight = stem.getHeight();\n let x = this.getAbsoluteX();\n let y = stem_direction === Stem.DOWN\n ? noteHeadBounds.y_top - noteStemHeight\n : noteHeadBounds.y_bottom - noteStemHeight;\n let defaultOffsetY = Tables.STEM_HEIGHT;\n defaultOffsetY -= defaultOffsetY / 2.8;\n y += defaultOffsetY * staveNoteScale * stem_direction;\n const offsets = stem_direction === Stem.UP\n ? {\n x1: 1,\n y1: 0,\n x2: 13,\n y2: -9,\n }\n : {\n x1: -4,\n y1: 1,\n x2: 13,\n y2: 9,\n };\n x += offsets.x1 * offsetScale;\n y += offsets.y1 * offsetScale;\n slashBBox = {\n x1: x,\n y1: y,\n x2: x + offsets.x2 * offsetScale,\n y2: y + offsets.y2 * offsetScale,\n };\n }\n // FIXME: avoid staff lines, ledger lines or others.\n const ctx = this.checkContext();\n ctx.save();\n ctx.setLineWidth(1 * offsetScale); // FIXME: use more appropriate value.\n ctx.beginPath();\n ctx.moveTo(slashBBox.x1, slashBBox.y1);\n ctx.lineTo(slashBBox.x2, slashBBox.y2);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n }\n }\n calcBeamedNotesSlashBBox(slashStemOffset, slashBeamOffset, protrusions) {\n const beam = this.beam;\n if (!beam)\n throw new RuntimeError('NoBeam', \"Can't calculate without a beam.\");\n const beam_slope = beam.slope;\n const isBeamEndNote = beam.notes[beam.notes.length - 1] === this;\n const scaleX = isBeamEndNote ? -1 : 1;\n const beam_angle = Math.atan(beam_slope * scaleX);\n // slash line intersecting point on beam.\n const iPointOnBeam = {\n dx: Math.cos(beam_angle) * slashBeamOffset,\n dy: Math.sin(beam_angle) * slashBeamOffset,\n };\n slashStemOffset *= this.getStemDirection();\n const slash_angle = Math.atan((iPointOnBeam.dy - slashStemOffset) / iPointOnBeam.dx);\n const protrusion_stem_dx = Math.cos(slash_angle) * protrusions.stem * scaleX;\n const protrusion_stem_dy = Math.sin(slash_angle) * protrusions.stem;\n const protrusion_beam_dx = Math.cos(slash_angle) * protrusions.beam * scaleX;\n const protrusion_beam_dy = Math.sin(slash_angle) * protrusions.beam;\n const stemX = this.getStemX();\n const stem0X = beam.notes[0].getStemX();\n const stemY = beam.getBeamYToDraw() + (stemX - stem0X) * beam_slope;\n const ret = {\n x1: stemX - protrusion_stem_dx,\n y1: stemY + slashStemOffset - protrusion_stem_dy,\n x2: stemX + iPointOnBeam.dx * scaleX + protrusion_beam_dx,\n y2: stemY + iPointOnBeam.dy + protrusion_beam_dy,\n };\n return ret;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements `GraceNoteGroup` which is used to format and\n// render grace notes.\nimport { Beam } from './beam';\nimport { Formatter } from './formatter';\nimport { Modifier } from './modifier';\nimport { StaveTie } from './stavetie';\nimport { Tables } from './tables';\nimport { TabTie } from './tabtie';\nimport { Category, isStaveNote } from './typeguard';\nimport { log } from './util';\nimport { Voice } from './voice';\n// To enable logging for this class. Set `GraceNoteGroup.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (GraceNoteGroup.DEBUG)\n log('Vex.Flow.GraceNoteGroup', args);\n}\n/** GraceNoteGroup is used to format and render grace notes. */\nexport class GraceNoteGroup extends Modifier {\n //** `GraceNoteGroup` inherits from `Modifier` and is placed inside a `ModifierContext`. */\n constructor(grace_notes, show_slur) {\n super();\n this.preFormatted = false;\n this.position = Modifier.Position.LEFT;\n this.grace_notes = grace_notes;\n this.width = 0;\n this.show_slur = show_slur;\n this.slur = undefined;\n this.voice = new Voice({\n num_beats: 4,\n beat_value: 4,\n resolution: Tables.RESOLUTION,\n }).setStrict(false);\n this.render_options = {\n slur_y_shift: 0,\n };\n this.beams = [];\n this.voice.addTickables(this.grace_notes);\n return this;\n }\n static get CATEGORY() {\n return Category.GraceNoteGroup;\n }\n /** Arranges groups inside a `ModifierContext`. */\n static format(gracenote_groups, state) {\n const group_spacing_stave = 4;\n const group_spacing_tab = 0;\n if (!gracenote_groups || gracenote_groups.length === 0)\n return false;\n const group_list = [];\n let prev_note = null;\n let shiftL = 0;\n for (let i = 0; i < gracenote_groups.length; ++i) {\n const gracenote_group = gracenote_groups[i];\n const note = gracenote_group.getNote();\n const is_stavenote = isStaveNote(note);\n const spacing = is_stavenote ? group_spacing_stave : group_spacing_tab;\n if (is_stavenote && note !== prev_note) {\n // Iterate through all notes to get the displaced pixels\n for (let n = 0; n < note.keys.length; ++n) {\n shiftL = Math.max(note.getLeftDisplacedHeadPx(), shiftL);\n }\n prev_note = note;\n }\n group_list.push({ shift: shiftL, gracenote_group, spacing });\n }\n // If first note left shift in case it is displaced\n let group_shift = group_list[0].shift;\n let formatWidth;\n for (let i = 0; i < group_list.length; ++i) {\n const gracenote_group = group_list[i].gracenote_group;\n gracenote_group.preFormat();\n formatWidth = gracenote_group.getWidth() + group_list[i].spacing;\n group_shift = Math.max(formatWidth, group_shift);\n }\n for (let i = 0; i < group_list.length; ++i) {\n const gracenote_group = group_list[i].gracenote_group;\n formatWidth = gracenote_group.getWidth() + group_list[i].spacing;\n gracenote_group.setSpacingFromNextModifier(group_shift - Math.min(formatWidth, group_shift));\n }\n state.left_shift += group_shift;\n return true;\n }\n preFormat() {\n if (this.preFormatted)\n return;\n if (!this.formatter) {\n this.formatter = new Formatter();\n }\n this.formatter.joinVoices([this.voice]).format([this.voice], 0, {});\n this.setWidth(this.formatter.getMinTotalWidth());\n this.preFormatted = true;\n }\n beamNotes(grace_notes) {\n grace_notes = grace_notes || this.grace_notes;\n if (grace_notes.length > 1) {\n const beam = new Beam(grace_notes);\n beam.render_options.beam_width = 3;\n beam.render_options.partial_beam_length = 4;\n this.beams.push(beam);\n }\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n getWidth() {\n return this.width;\n }\n getGraceNotes() {\n return this.grace_notes;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n L('Drawing grace note group for:', note);\n this.alignSubNotesWithNote(this.getGraceNotes(), note); // Modifier function\n // Draw grace notes.\n this.grace_notes.forEach((graceNote) => graceNote.setContext(ctx).draw());\n // Draw beams.\n this.beams.forEach((beam) => beam.setContext(ctx).draw());\n if (this.show_slur) {\n // Create and draw slur.\n const is_stavenote = isStaveNote(note);\n const TieClass = is_stavenote ? StaveTie : TabTie;\n this.slur = new TieClass({\n last_note: this.grace_notes[0],\n first_note: note,\n first_indices: [0],\n last_indices: [0],\n });\n this.slur.render_options.cp2 = 12;\n this.slur.render_options.y_shift = (is_stavenote ? 7 : 5) + this.render_options.slur_y_shift;\n this.slur.setContext(ctx).draw();\n }\n }\n}\nGraceNoteGroup.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Balazs Forian-Szabo\n//\n// ## Description\n//\n// A basic implementation of grace notes\n// to be rendered on a tab stave.\n//\n// See `tests/gracetabnote_tests.ts` for usage examples.\nimport { Font } from './font';\nimport { TabNote } from './tabnote';\nimport { Category } from './typeguard';\nexport class GraceTabNote extends TabNote {\n static get CATEGORY() {\n return Category.GraceTabNote;\n }\n constructor(noteStruct) {\n super(noteStruct, false);\n this.render_options = Object.assign(Object.assign({}, this.render_options), { \n // vertical shift from stave line\n y_shift: 0.3, \n // grace glyph scale\n scale: 0.6, \n // grace tablature font\n font: `7.5pt ${Font.SANS_SERIF}` });\n this.updateWidth();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Vex } from './vex';\nexport * from './accidental';\nexport * from './annotation';\nexport * from './articulation';\nexport * from './barnote';\nexport * from './beam';\nexport * from './bend';\nexport * from './boundingbox';\nexport * from './boundingboxcomputation';\nexport * from './canvascontext';\nexport * from './chordsymbol';\nexport * from './clef';\nexport * from './clefnote';\nexport * from './crescendo';\nexport * from './curve';\nexport * from './dot';\nexport * from './easyscore';\nexport * from './element';\nexport * from './factory';\nexport * from './flow';\nexport * from './font';\n// Do not export './fonts/*' because they are used by the entry/* files.\nexport * from './formatter';\nexport * from './fraction';\nexport * from './frethandfinger';\nexport * from './ghostnote';\nexport * from './glyph';\nexport * from './glyphnote';\nexport * from './gracenote';\nexport * from './gracenotegroup';\nexport * from './gracetabnote';\nexport * from './keymanager';\nexport * from './keysignature';\nexport * from './keysignote';\nexport * from './modifier';\nexport * from './modifiercontext';\nexport * from './multimeasurerest';\nexport * from './music';\nexport * from './note';\nexport * from './notehead';\nexport * from './notesubgroup';\nexport * from './ornament';\nexport * from './parenthesis';\nexport * from './parser';\nexport * from './pedalmarking';\nexport * from './registry';\nexport * from './rendercontext';\nexport * from './renderer';\nexport * from './repeatnote';\nexport * from './stave';\nexport * from './stavebarline';\nexport * from './staveconnector';\nexport * from './stavehairpin';\nexport * from './staveline';\nexport * from './stavemodifier';\nexport * from './stavenote';\nexport * from './staverepetition';\nexport * from './stavesection';\nexport * from './stavetempo';\nexport * from './stavetext';\nexport * from './stavetie';\nexport * from './stavevolta';\nexport * from './stem';\nexport * from './stemmablenote';\nexport * from './stringnumber';\nexport * from './strokes';\nexport * from './svgcontext';\nexport * from './system';\n// Do not export './tables' because it is internal. Its public API is accessible via Vex.Flow.*.\nexport * from './tabnote';\nexport * from './tabslide';\nexport * from './tabstave';\nexport * from './tabtie';\nexport * from './textbracket';\nexport * from './textdynamics';\nexport * from './textformatter';\nexport * from './textnote';\nexport * from './tickable';\nexport * from './tickcontext';\nexport * from './timesigglyph';\nexport * from './timesignature';\nexport * from './timesignote';\nexport * from './tremolo';\nexport * from './tuning';\nexport * from './tuplet';\nexport * from './typeguard';\nexport * from './util';\n// Do not export './version'. It is accessible via Vex.Flow.VERSION & Vex.Flow.BUILD.\nexport * from './vibrato';\nexport * from './vibratobracket';\nexport * from './voice';\nexport * from './web';\n// Export Vex as a named export AND as a default export, to support both ways of importing.\nexport { Vex };\nexport default Vex;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This class implements diatonic key management.\nimport { Music } from './music';\nimport { RuntimeError } from './util';\nexport class KeyManager {\n constructor(key) {\n this.music = new Music();\n this.setKey(key);\n }\n setKey(key) {\n this.key = key;\n this.reset();\n return this;\n }\n getKey() {\n return this.key;\n }\n reset() {\n this.keyParts = this.music.getKeyParts(this.key);\n this.keyString = this.keyParts.root;\n if (this.keyParts.accidental)\n this.keyString += this.keyParts.accidental;\n const is_supported_type = Music.scaleTypes[this.keyParts.type];\n if (!is_supported_type) {\n throw new RuntimeError('BadArguments', `Unsupported key type: ${this.key}`);\n }\n this.scale = this.music.getScaleTones(this.music.getNoteValue(this.keyString), Music.scaleTypes[this.keyParts.type]);\n this.scaleMap = {};\n this.scaleMapByValue = {};\n this.originalScaleMapByValue = {};\n const noteLocation = Music.root_indices[this.keyParts.root];\n for (let i = 0; i < Music.roots.length; ++i) {\n const index = (noteLocation + i) % Music.roots.length;\n const rootName = Music.roots[index];\n const noteName = this.music.getRelativeNoteName(rootName, this.scale[i]);\n this.scaleMap[rootName] = noteName;\n this.scaleMapByValue[this.scale[i]] = noteName;\n this.originalScaleMapByValue[this.scale[i]] = noteName;\n }\n return this;\n }\n getAccidental(key) {\n const root = this.music.getKeyParts(key).root;\n const parts = this.music.getNoteParts(this.scaleMap[root]);\n return {\n note: this.scaleMap[root],\n accidental: parts.accidental,\n };\n }\n selectNote(note) {\n note = note.toLowerCase();\n const parts = this.music.getNoteParts(note);\n // First look for matching note in our altered scale\n const scaleNote = this.scaleMap[parts.root];\n const modparts = this.music.getNoteParts(scaleNote);\n if (scaleNote === note) {\n return {\n note: scaleNote,\n accidental: parts.accidental,\n change: false,\n };\n }\n // Then search for a note of equivalent value in our altered scale\n const valueNote = this.scaleMapByValue[this.music.getNoteValue(note)];\n if (valueNote != null) {\n return {\n note: valueNote,\n accidental: this.music.getNoteParts(valueNote).accidental,\n change: false,\n };\n }\n // Then search for a note of equivalent value in the original scale\n const originalValueNote = this.originalScaleMapByValue[this.music.getNoteValue(note)];\n if (originalValueNote != null) {\n this.scaleMap[modparts.root] = originalValueNote;\n delete this.scaleMapByValue[this.music.getNoteValue(scaleNote)];\n this.scaleMapByValue[this.music.getNoteValue(note)] = originalValueNote;\n return {\n note: originalValueNote,\n accidental: this.music.getNoteParts(originalValueNote).accidental,\n change: true,\n };\n }\n // Then try to unmodify a currently modified note.\n if (modparts.root === note) {\n delete this.scaleMapByValue[this.music.getNoteValue(this.scaleMap[parts.root])];\n this.scaleMapByValue[this.music.getNoteValue(modparts.root)] = modparts.root;\n this.scaleMap[modparts.root] = modparts.root;\n return {\n note: modparts.root,\n accidental: undefined,\n change: true,\n };\n }\n // Last resort -- shitshoot\n delete this.scaleMapByValue[this.music.getNoteValue(this.scaleMap[parts.root])];\n this.scaleMapByValue[this.music.getNoteValue(note)] = note;\n delete this.scaleMap[modparts.root];\n this.scaleMap[modparts.root] = note;\n return {\n note,\n accidental: parts.accidental,\n change: true,\n };\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Cyril Silverman\n//\n// ## Description\n//\n// This file implements key signatures. A key signature sits on a stave\n// and indicates the notes with implicit accidentals.\nimport { Glyph } from './glyph';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined } from './util';\nexport class KeySignature extends StaveModifier {\n // Create a new Key Signature based on a `key_spec`\n constructor(keySpec, cancelKeySpec, alterKeySpec) {\n super();\n this.accList = [];\n this.setKeySig(keySpec, cancelKeySpec, alterKeySpec);\n this.setPosition(StaveModifierPosition.BEGIN);\n this.glyphFontScale = 38; // TODO(0xFE): Should this match StaveNote?\n this.glyphs = [];\n this.xPositions = []; // relative to this.x\n this.paddingForced = false;\n }\n static get CATEGORY() {\n return Category.KeySignature;\n }\n // Add an accidental glyph to the `KeySignature` instance which represents\n // the provided `acc`. If `nextAcc` is also provided, the appropriate\n // spacing will be included in the glyph's position\n convertToGlyph(acc, nextAcc) {\n const accGlyphData = Tables.accidentalCodes(acc.type);\n const glyph = new Glyph(accGlyphData.code, this.glyphFontScale);\n // Determine spacing between current accidental and the next accidental\n let extraWidth = 1;\n if (acc.type === 'n' && nextAcc) {\n const spacing = KeySignature.accidentalSpacing[nextAcc.type];\n if (spacing) {\n const isAbove = nextAcc.line >= acc.line;\n extraWidth = isAbove ? spacing.above : spacing.below;\n }\n }\n // Place the glyph on the stave\n this.placeGlyphOnLine(glyph, this.checkStave(), acc.line);\n this.glyphs.push(glyph);\n const xPosition = this.xPositions[this.xPositions.length - 1];\n const glyphWidth = glyph.getMetrics().width + extraWidth;\n // Store the next accidental's x position\n this.xPositions.push(xPosition + glyphWidth);\n // Expand size of key signature\n this.width += glyphWidth;\n }\n // Cancel out a key signature provided in the `spec` parameter. This will\n // place appropriate natural accidentals before the key signature.\n cancelKey(spec) {\n this.formatted = false;\n this.cancelKeySpec = spec;\n return this;\n }\n convertToCancelAccList(spec) {\n // Get the accidental list for the cancelled key signature\n const cancel_accList = Tables.keySignature(spec);\n // If the cancelled key has a different accidental type, ie: # vs b\n const different_types = this.accList.length > 0 && cancel_accList.length > 0 && cancel_accList[0].type !== this.accList[0].type;\n // Determine how many naturals needed to add\n const naturals = different_types ? cancel_accList.length : cancel_accList.length - this.accList.length;\n // Return if no naturals needed\n if (naturals < 1)\n return undefined;\n // Get the line position for each natural\n const cancelled = [];\n for (let i = 0; i < naturals; i++) {\n let index = i;\n if (!different_types) {\n index = cancel_accList.length - naturals + i;\n }\n const acc = cancel_accList[index];\n cancelled.push({ type: 'n', line: acc.line });\n }\n // Combine naturals with main accidental list for the key signature\n this.accList = cancelled.concat(this.accList);\n return {\n accList: cancelled,\n type: cancel_accList[0].type,\n };\n }\n // Deprecated\n addToStave(stave) {\n this.paddingForced = true;\n stave.addModifier(this);\n return this;\n }\n // Apply the accidental staff line placement based on the `clef` and\n // the accidental `type` for the key signature ('# or 'b').\n convertAccLines(clef, type, accList = this.accList) {\n let offset = 0.0; // if clef === \"treble\"\n let customLines; // when clef doesn't follow treble key sig shape\n switch (clef) {\n // Treble & Subbass both have offsets of 0, so are not included.\n case 'soprano':\n if (type === '#')\n customLines = [2.5, 0.5, 2, 0, 1.5, -0.5, 1];\n else\n offset = -1;\n break;\n case 'mezzo-soprano':\n if (type === 'b')\n customLines = [0, 2, 0.5, 2.5, 1, 3, 1.5];\n else\n offset = 1.5;\n break;\n case 'alto':\n offset = 0.5;\n break;\n case 'tenor':\n if (type === '#')\n customLines = [3, 1, 2.5, 0.5, 2, 0, 1.5];\n else\n offset = -0.5;\n break;\n case 'baritone-f':\n case 'baritone-c':\n if (type === 'b')\n customLines = [0.5, 2.5, 1, 3, 1.5, 3.5, 2];\n else\n offset = 2;\n break;\n case 'bass':\n case 'french':\n offset = 1;\n break;\n default:\n break;\n }\n // If there's a special case, assign those lines/spaces:\n let i;\n if (typeof customLines !== 'undefined') {\n for (i = 0; i < accList.length; ++i) {\n accList[i].line = customLines[i];\n }\n }\n else if (offset !== 0) {\n for (i = 0; i < accList.length; ++i) {\n accList[i].line += offset;\n }\n }\n }\n getPadding(index) {\n if (!this.formatted)\n this.format();\n return this.glyphs.length === 0 || (!this.paddingForced && index < 2) ? 0 : this.padding;\n }\n getWidth() {\n if (!this.formatted)\n this.format();\n return this.width;\n }\n setKeySig(keySpec, cancelKeySpec, alterKeySpec) {\n this.formatted = false;\n this.keySpec = keySpec;\n this.cancelKeySpec = cancelKeySpec;\n this.alterKeySpec = alterKeySpec;\n return this;\n }\n // Alter the accidentals of a key spec one by one.\n // Each alteration is a new accidental that replaces the\n // original accidental (or the canceled one).\n alterKey(alterKeySpec) {\n this.formatted = false;\n this.alterKeySpec = alterKeySpec;\n return this;\n }\n convertToAlterAccList(alterKeySpec) {\n const max = Math.min(alterKeySpec.length, this.accList.length);\n for (let i = 0; i < max; ++i) {\n if (alterKeySpec[i]) {\n this.accList[i].type = alterKeySpec[i];\n }\n }\n }\n format() {\n const stave = this.checkStave();\n this.width = 0;\n this.glyphs = [];\n this.xPositions = [0]; // initialize with initial x position\n this.accList = Tables.keySignature(defined(this.keySpec));\n const accList = this.accList;\n const firstAccidentalType = accList.length > 0 ? accList[0].type : undefined;\n let cancelAccList;\n if (this.cancelKeySpec) {\n cancelAccList = this.convertToCancelAccList(this.cancelKeySpec);\n }\n if (this.alterKeySpec) {\n this.convertToAlterAccList(this.alterKeySpec);\n }\n if (this.accList.length > 0) {\n const clef = (this.position === StaveModifierPosition.END ? stave.getEndClef() : stave.getClef()) || stave.getClef();\n if (cancelAccList) {\n this.convertAccLines(clef, cancelAccList.type, cancelAccList.accList);\n }\n this.convertAccLines(clef, firstAccidentalType, accList);\n for (let i = 0; i < this.accList.length; ++i) {\n this.convertToGlyph(this.accList[i], this.accList[i + 1]);\n }\n }\n this.formatted = true;\n }\n draw() {\n const stave = this.checkStave();\n const ctx = stave.checkContext();\n if (!this.formatted)\n this.format();\n this.setRendered();\n ctx.openGroup('keysignature', this.getAttribute('id'));\n for (let i = 0; i < this.glyphs.length; i++) {\n const glyph = this.glyphs[i];\n const x = this.x + this.xPositions[i];\n glyph.setStave(stave);\n glyph.setContext(ctx);\n glyph.renderToStave(x);\n }\n ctx.closeGroup();\n }\n}\n// Space between natural and following accidental depending\n// on vertical position\nKeySignature.accidentalSpacing = {\n '#': {\n above: 6,\n below: 4,\n },\n b: {\n above: 4,\n below: 7,\n },\n n: {\n above: 4,\n below: 1,\n },\n '##': {\n above: 6,\n below: 4,\n },\n bb: {\n above: 4,\n below: 7,\n },\n db: {\n above: 4,\n below: 7,\n },\n d: {\n above: 4,\n below: 7,\n },\n bbs: {\n above: 4,\n below: 7,\n },\n '++': {\n above: 6,\n below: 4,\n },\n '+': {\n above: 6,\n below: 4,\n },\n '+-': {\n above: 6,\n below: 4,\n },\n '++-': {\n above: 6,\n below: 4,\n },\n bs: {\n above: 4,\n below: 10,\n },\n bss: {\n above: 4,\n below: 10,\n },\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Mark Meeus 2019\nimport { KeySignature } from './keysignature';\nimport { Note } from './note';\nimport { Category } from './typeguard';\nexport class KeySigNote extends Note {\n constructor(keySpec, cancelKeySpec, alterKeySpec) {\n super({ duration: 'b' });\n this.keySignature = new KeySignature(keySpec, cancelKeySpec, alterKeySpec);\n // Note properties\n this.ignore_ticks = true;\n }\n static get CATEGORY() {\n return Category.KeySigNote;\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n preFormat() {\n this.preFormatted = true;\n this.keySignature.setStave(this.checkStave());\n this.setWidth(this.keySignature.getWidth());\n return this;\n }\n draw() {\n const ctx = this.checkStave().checkContext();\n this.setRendered();\n this.keySignature.setX(this.getAbsoluteX());\n this.keySignature.setContext(ctx);\n this.keySignature.draw();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nexport var ModifierPosition;\n(function (ModifierPosition) {\n ModifierPosition[ModifierPosition[\"CENTER\"] = 0] = \"CENTER\";\n ModifierPosition[ModifierPosition[\"LEFT\"] = 1] = \"LEFT\";\n ModifierPosition[ModifierPosition[\"RIGHT\"] = 2] = \"RIGHT\";\n ModifierPosition[ModifierPosition[\"ABOVE\"] = 3] = \"ABOVE\";\n ModifierPosition[ModifierPosition[\"BELOW\"] = 4] = \"BELOW\";\n})(ModifierPosition || (ModifierPosition = {}));\n// To enable logging for this class. Set `Vex.Flow.Modifier.DEBUG` to `true`.\n// function L(...args) { if (Modifier.DEBUG) log('Vex.Flow.Modifier', args); }\n/**\n * `Modifier` is an abstract interface for notational elements that modify\n * a `Note`. Examples of modifiers are `Accidental`, `Annotation`, `Stroke`, etc.\n *\n * For a `Modifier` instance to be positioned correctly, it must be part of\n * a `ModifierContext`. All modifiers in the same context are rendered relative to\n * one another.\n *\n * Typically, all modifiers to a note are part of the same `ModifierContext` instance. Also,\n * in multi-voice staves, all modifiers to notes on the same `tick` are part of the same\n * `ModifierContext`. This ensures that multiple voices don't trample all over each other.\n */\nexport class Modifier extends Element {\n constructor() {\n super();\n this.width = 0;\n // The `text_line` is reserved space above or below a stave.\n this.text_line = 0;\n this.position = Modifier.Position.LEFT;\n this.x_shift = 0;\n this.y_shift = 0;\n this.spacingFromNextModifier = 0;\n }\n /**\n * Modifiers category string. Every modifier has a different category.\n * The `ModifierContext` uses this to determine the type and order of the modifiers.\n */\n static get CATEGORY() {\n return Category.Modifier;\n }\n /** Modifiers can be positioned almost anywhere, relative to a note. */\n static get Position() {\n return ModifierPosition;\n }\n static get PositionString() {\n return {\n center: ModifierPosition.CENTER,\n above: ModifierPosition.ABOVE,\n below: ModifierPosition.BELOW,\n left: ModifierPosition.LEFT,\n right: ModifierPosition.RIGHT,\n };\n }\n /** Called when position changes. */\n reset() {\n // DO NOTHING.\n }\n /** Get modifier widths. */\n getWidth() {\n return this.width;\n }\n /** Set modifier widths. */\n setWidth(width) {\n this.width = width;\n return this;\n }\n /** Get attached note (`StaveNote`, `TabNote`, etc.) */\n getNote() {\n return defined(this.note, 'NoNote', 'Modifier has no note.');\n }\n /**\n * Used in draw() to check and get the attached note (`StaveNote`, `TabNote`, etc.).\n * Also verifies that the index is valid.\n */\n checkAttachedNote() {\n const category = this.getCategory();\n defined(this.index, 'NoIndex', `Can't draw ${category} without an index.`);\n return defined(this.note, 'NoNote', `Can't draw ${category} without a note.`);\n }\n /**\n * Set attached note.\n * @param note (`StaveNote`, `TabNote`, etc.)\n */\n setNote(note) {\n this.note = note;\n return this;\n }\n /** Get note index, which is a specific note in a chord. */\n getIndex() {\n return this.index;\n }\n /** Check and get note index, which is a specific note in a chord. */\n checkIndex() {\n return defined(this.index, 'NoIndex', 'Modifier has an invalid index.');\n }\n /** Set note index, which is a specific note in a chord. */\n setIndex(index) {\n this.index = index;\n return this;\n }\n /** Get `ModifierContext`. */\n getModifierContext() {\n return this.modifierContext;\n }\n /** Check and get `ModifierContext`. */\n checkModifierContext() {\n return defined(this.modifierContext, 'NoModifierContext', 'Modifier Context Required');\n }\n /** Every modifier must be part of a `ModifierContext`. */\n setModifierContext(c) {\n this.modifierContext = c;\n return this;\n }\n /** Get position. */\n getPosition() {\n return this.position;\n }\n /**\n * Set position.\n * @param position CENTER | LEFT | RIGHT | ABOVE | BELOW\n */\n setPosition(position) {\n this.position = typeof position === 'string' ? Modifier.PositionString[position] : position;\n this.reset();\n return this;\n }\n /** Set the `text_line` for the modifier. */\n setTextLine(line) {\n this.text_line = line;\n return this;\n }\n /** Shift modifier down `y` pixels. Negative values shift up. */\n setYShift(y) {\n this.y_shift = y;\n return this;\n }\n /** Set spacing from next modifier. */\n setSpacingFromNextModifier(x) {\n this.spacingFromNextModifier = x;\n }\n /** Get spacing from next modifier. */\n getSpacingFromNextModifier() {\n return this.spacingFromNextModifier;\n }\n /**\n * Shift modifier `x` pixels in the direction of the modifier. Negative values\n * shift reverse.\n */\n setXShift(x) {\n this.x_shift = 0;\n if (this.position === Modifier.Position.LEFT) {\n this.x_shift -= x;\n }\n else {\n this.x_shift += x;\n }\n return this;\n }\n /** Get shift modifier `x` */\n getXShift() {\n return this.x_shift;\n }\n /** Render the modifier onto the canvas. */\n draw() {\n this.checkContext();\n throw new RuntimeError('NotImplemented', 'draw() not implemented for this modifier.');\n }\n // aligns sub notes of NoteSubGroup (or GraceNoteGroup) to the main note with correct x-offset\n alignSubNotesWithNote(subNotes, note) {\n // Shift over the tick contexts of each note\n const tickContext = note.getTickContext();\n const metrics = tickContext.getMetrics();\n const stave = note.getStave();\n const subNoteXOffset = tickContext.getX() - metrics.modLeftPx - metrics.modRightPx + this.getSpacingFromNextModifier();\n subNotes.forEach((subNote) => {\n const subTickContext = subNote.getTickContext();\n if (stave)\n subNote.setStave(stave);\n subTickContext.setXOffset(subNoteXOffset); // don't touch baseX to avoid shift each render\n });\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This class implements various types of members to notes (e.g. bends,\n// fingering positions etc.)\nimport { Accidental } from './accidental';\nimport { Annotation } from './annotation';\nimport { Articulation } from './articulation';\nimport { Bend } from './bend';\nimport { ChordSymbol } from './chordsymbol';\nimport { Dot } from './dot';\nimport { FretHandFinger } from './frethandfinger';\nimport { GraceNoteGroup } from './gracenotegroup';\nimport { NoteSubGroup } from './notesubgroup';\nimport { Ornament } from './ornament';\nimport { Parenthesis } from './parenthesis';\nimport { StaveNote } from './stavenote';\nimport { StringNumber } from './stringnumber';\nimport { Stroke } from './strokes';\nimport { Category } from './typeguard';\nimport { log, RuntimeError } from './util';\nimport { Vibrato } from './vibrato';\n// To enable logging for this class. Set `Vex.Flow.ModifierContext.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (ModifierContext.DEBUG)\n log('Vex.Flow.ModifierContext', args);\n}\nexport class ModifierContext {\n constructor() {\n // Formatting data.\n this.state = {\n left_shift: 0,\n right_shift: 0,\n text_line: 0,\n top_text_line: 0,\n };\n // Current members\n this.members = {};\n this.preFormatted = false;\n this.postFormatted = false;\n this.formatted = false;\n this.width = 0;\n this.spacing = 0;\n }\n addModifier(member) {\n L('addModifier is deprecated, use addMember instead.');\n return this.addMember(member);\n }\n /**\n * this.members maps CATEGORY strings to arrays of Tickable | Modifier | StaveNote | TabNote.\n * Here we add a new member to this.members, and create a new array if needed.\n * @param member\n * @returns this\n */\n addMember(member) {\n const category = member.getCategory();\n if (!this.members[category]) {\n this.members[category] = [];\n }\n this.members[category].push(member);\n member.setModifierContext(this);\n this.preFormatted = false;\n return this;\n }\n /**\n * @deprecated\n */\n getModifiers(category) {\n L('getModifiers is deprecated, use getMembers instead.');\n return this.getMembers(category);\n }\n getMembers(category) {\n var _a;\n return (_a = this.members[category]) !== null && _a !== void 0 ? _a : [];\n }\n getWidth() {\n return this.width;\n }\n getLeftShift() {\n return this.state.left_shift;\n }\n getRightShift() {\n return this.state.right_shift;\n }\n getState() {\n return this.state;\n }\n getMetrics() {\n if (!this.formatted) {\n throw new RuntimeError('UnformattedMember', 'Unformatted member has no metrics.');\n }\n return {\n width: this.state.left_shift + this.state.right_shift + this.spacing,\n spacing: this.spacing,\n };\n }\n preFormat() {\n if (this.preFormatted)\n return;\n L('Preformatting ModifierContext');\n const state = this.state;\n const members = this.members;\n // The ordering below determines when different members are formatted and rendered.\n StaveNote.format(members[Category.StaveNote], state);\n Parenthesis.format(members[Category.Parenthesis], state);\n Dot.format(members[Category.Dot], state);\n FretHandFinger.format(members[Category.FretHandFinger], state);\n Accidental.format(members[Category.Accidental], state);\n Stroke.format(members[Category.Stroke], state);\n GraceNoteGroup.format(members[Category.GraceNoteGroup], state);\n NoteSubGroup.format(members[Category.NoteSubGroup], state);\n StringNumber.format(members[Category.StringNumber], state);\n Articulation.format(members[Category.Articulation], state);\n Ornament.format(members[Category.Ornament], state);\n Annotation.format(members[Category.Annotation], state);\n ChordSymbol.format(members[Category.ChordSymbol], state);\n Bend.format(members[Category.Bend], state);\n Vibrato.format(members[Category.Vibrato], state, this);\n // Update width of this member context\n this.width = state.left_shift + state.right_shift;\n this.preFormatted = true;\n }\n postFormat() {\n if (this.postFormatted)\n return;\n L('Postformatting ModifierContext');\n // If post-formatting is required for an element, add more lines below.\n StaveNote.postFormat(this.getMembers(Category.StaveNote));\n }\n}\nModifierContext.DEBUG = false;\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n//\n// This class implements multiple measure rests.\nimport { Element } from './element';\nimport { Glyph } from './glyph';\nimport { NoteHead } from './notehead';\nimport { StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { TimeSignature } from './timesignature';\nimport { Category, isBarline } from './typeguard';\nimport { defined } from './util';\nlet semibreve_rest;\nfunction get_semibreve_rest() {\n if (!semibreve_rest) {\n const noteHead = new NoteHead({ duration: 'w', note_type: 'r' });\n semibreve_rest = {\n glyph_font_scale: noteHead.render_options.glyph_font_scale,\n glyph_code: noteHead.glyph_code,\n width: noteHead.getWidth(),\n };\n }\n return semibreve_rest;\n}\nexport class MultiMeasureRest extends Element {\n /**\n *\n * @param number_of_measures Number of measures.\n * @param options The options object.\n */\n constructor(number_of_measures, options) {\n super();\n this.xs = { left: NaN, right: NaN };\n this.hasPaddingLeft = false;\n this.hasPaddingRight = false;\n this.hasLineThickness = false;\n this.hasSymbolSpacing = false;\n this.number_of_measures = number_of_measures;\n // Keep track of whether these four options were provided.\n this.hasPaddingLeft = typeof options.padding_left === 'number';\n this.hasPaddingRight = typeof options.padding_right === 'number';\n this.hasLineThickness = typeof options.line_thickness === 'number';\n this.hasSymbolSpacing = typeof options.symbol_spacing === 'number';\n const musicFont = Tables.currentMusicFont();\n this.render_options = Object.assign({ use_symbols: false, show_number: true, number_line: -0.5, number_glyph_point: musicFont.lookupMetric('digits.point'), line: 2, spacing_between_lines_px: Tables.STAVE_LINE_DISTANCE, serif_thickness: 2, semibreve_rest_glyph_scale: Tables.NOTATION_FONT_SCALE, padding_left: 0, padding_right: 0, line_thickness: 5, symbol_spacing: 0 }, options);\n const fontLineShift = musicFont.lookupMetric('digits.shiftLine', 0);\n this.render_options.number_line += fontLineShift;\n }\n static get CATEGORY() {\n return Category.MultiMeasureRest;\n }\n getXs() {\n return this.xs;\n }\n setStave(stave) {\n this.stave = stave;\n return this;\n }\n getStave() {\n return this.stave;\n }\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n drawLine(stave, ctx, left, right, spacingBetweenLines) {\n const options = this.render_options;\n const y = stave.getYForLine(options.line);\n const padding = (right - left) * 0.1;\n left += padding;\n right -= padding;\n let lineThicknessHalf;\n if (this.hasLineThickness) {\n lineThicknessHalf = options.line_thickness * 0.5;\n }\n else {\n lineThicknessHalf = spacingBetweenLines * 0.25;\n }\n const serifThickness = options.serif_thickness;\n const top = y - spacingBetweenLines;\n const bot = y + spacingBetweenLines;\n const leftIndented = left + serifThickness;\n const rightIndented = right - serifThickness;\n const lineTop = y - lineThicknessHalf;\n const lineBottom = y + lineThicknessHalf;\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(left, top);\n ctx.lineTo(leftIndented, top);\n ctx.lineTo(leftIndented, lineTop);\n ctx.lineTo(rightIndented, lineTop);\n ctx.lineTo(rightIndented, top);\n ctx.lineTo(right, top);\n ctx.lineTo(right, bot);\n ctx.lineTo(rightIndented, bot);\n ctx.lineTo(rightIndented, lineBottom);\n ctx.lineTo(leftIndented, lineBottom);\n ctx.lineTo(leftIndented, bot);\n ctx.lineTo(left, bot);\n ctx.closePath();\n ctx.fill();\n }\n drawSymbols(stave, ctx, left, right, spacingBetweenLines) {\n const n4 = Math.floor(this.number_of_measures / 4);\n const n = this.number_of_measures % 4;\n const n2 = Math.floor(n / 2);\n const n1 = n % 2;\n const options = this.render_options;\n // FIXME: TODO: invalidate semibreve_rest at the appropriate time\n // (e.g., if the system font settings are changed).\n semibreve_rest = undefined;\n const rest = get_semibreve_rest();\n const rest_scale = options.semibreve_rest_glyph_scale;\n const rest_width = rest.width * (rest_scale / rest.glyph_font_scale);\n const glyphs = {\n 2: {\n width: rest_width * 0.5,\n height: spacingBetweenLines,\n },\n 1: {\n width: rest_width,\n },\n };\n /* 10: normal spacingBetweenLines */\n const spacing = this.hasSymbolSpacing ? options.symbol_spacing : 10;\n const width = n4 * glyphs[2].width + n2 * glyphs[2].width + n1 * glyphs[1].width + (n4 + n2 + n1 - 1) * spacing;\n let x = left + (right - left) * 0.5 - width * 0.5;\n const line = options.line;\n const yTop = stave.getYForLine(line - 1);\n const yMiddle = stave.getYForLine(line);\n const yBottom = stave.getYForLine(line + 1);\n ctx.save();\n ctx.setStrokeStyle('none');\n ctx.setLineWidth(0);\n for (let i = 0; i < n4; ++i) {\n ctx.fillRect(x, yMiddle - glyphs[2].height, glyphs[2].width, glyphs[2].height);\n ctx.fillRect(x, yBottom - glyphs[2].height, glyphs[2].width, glyphs[2].height);\n x += glyphs[2].width + spacing;\n }\n for (let i = 0; i < n2; ++i) {\n ctx.fillRect(x, yMiddle - glyphs[2].height, glyphs[2].width, glyphs[2].height);\n x += glyphs[2].width + spacing;\n }\n for (let i = 0; i < n1; ++i) {\n Glyph.renderGlyph(ctx, x, yTop, rest_scale, rest.glyph_code);\n x += glyphs[1].width + spacing;\n }\n ctx.restore();\n }\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n const stave = this.checkStave();\n let left = stave.getNoteStartX();\n let right = stave.getNoteEndX();\n // FIXME: getNoteStartX() returns x + 5(barline width)\n // getNoteEndX() returns x + width(no barline width)\n // See Stave constructor. How do we fix this?\n // Here, we subtract the barline width.\n const begModifiers = stave.getModifiers(StaveModifierPosition.BEGIN);\n if (begModifiers.length === 1 && isBarline(begModifiers[0])) {\n left -= begModifiers[0].getWidth();\n }\n const options = this.render_options;\n if (this.hasPaddingLeft) {\n left = stave.getX() + options.padding_left;\n }\n if (this.hasPaddingRight) {\n right = stave.getX() + stave.getWidth() - options.padding_right;\n }\n this.xs.left = left;\n this.xs.right = right;\n const spacingBetweenLines = options.spacing_between_lines_px;\n if (options.use_symbols) {\n this.drawSymbols(stave, ctx, left, right, spacingBetweenLines);\n }\n else {\n this.drawLine(stave, ctx, left, right, spacingBetweenLines);\n }\n if (options.show_number) {\n const timeSpec = '/' + this.number_of_measures;\n const timeSig = new TimeSignature(timeSpec, 0, false);\n timeSig.point = options.number_glyph_point;\n timeSig.setTimeSig(timeSpec);\n timeSig.setStave(stave);\n timeSig.setX(left + (right - left) * 0.5 - timeSig.getInfo().glyph.getMetrics().width * 0.5);\n timeSig.bottomLine = options.number_line;\n timeSig.setContext(ctx).draw();\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { RuntimeError } from './util';\n/** Music implements some standard music theory routines. */\nexport class Music {\n /** Number of an canonical notes (12). */\n static get NUM_TONES() {\n return this.canonical_notes.length;\n }\n /** Names of root notes ('c', 'd',...) */\n static get roots() {\n return ['c', 'd', 'e', 'f', 'g', 'a', 'b'];\n }\n /** Values of the root notes.*/\n static get root_values() {\n return [0, 2, 4, 5, 7, 9, 11];\n }\n /** Indices of the root notes.*/\n static get root_indices() {\n return {\n c: 0,\n d: 1,\n e: 2,\n f: 3,\n g: 4,\n a: 5,\n b: 6,\n };\n }\n /** Names of canonical notes ('c', 'c#', 'd',...). */\n static get canonical_notes() {\n return ['c', 'c#', 'd', 'd#', 'e', 'f', 'f#', 'g', 'g#', 'a', 'a#', 'b'];\n }\n /** Names of diatonic intervals ('unison', 'm2', 'M2',...). */\n static get diatonic_intervals() {\n return ['unison', 'm2', 'M2', 'm3', 'M3', 'p4', 'dim5', 'p5', 'm6', 'M6', 'b7', 'M7', 'octave'];\n }\n /** NoteAccidental associated to diatonic intervals. */\n static get diatonic_accidentals() {\n return {\n unison: { note: 0, accidental: 0 },\n m2: { note: 1, accidental: -1 },\n M2: { note: 1, accidental: 0 },\n m3: { note: 2, accidental: -1 },\n M3: { note: 2, accidental: 0 },\n p4: { note: 3, accidental: 0 },\n dim5: { note: 4, accidental: -1 },\n p5: { note: 4, accidental: 0 },\n m6: { note: 5, accidental: -1 },\n M6: { note: 5, accidental: 0 },\n b7: { note: 6, accidental: -1 },\n M7: { note: 6, accidental: 0 },\n octave: { note: 7, accidental: 0 },\n };\n }\n /** Semitones shift associated to intervals .*/\n static get intervals() {\n return {\n u: 0,\n unison: 0,\n m2: 1,\n b2: 1,\n min2: 1,\n S: 1,\n H: 1,\n 2: 2,\n M2: 2,\n maj2: 2,\n T: 2,\n W: 2,\n m3: 3,\n b3: 3,\n min3: 3,\n M3: 4,\n 3: 4,\n maj3: 4,\n 4: 5,\n p4: 5,\n '#4': 6,\n b5: 6,\n aug4: 6,\n dim5: 6,\n 5: 7,\n p5: 7,\n '#5': 8,\n b6: 8,\n aug5: 8,\n 6: 9,\n M6: 9,\n maj6: 9,\n b7: 10,\n m7: 10,\n min7: 10,\n dom7: 10,\n M7: 11,\n maj7: 11,\n 8: 12,\n octave: 12,\n };\n }\n /** Semitones shifts associated with scales. */\n static get scales() {\n return {\n major: [2, 2, 1, 2, 2, 2, 1],\n minor: [2, 1, 2, 2, 1, 2, 2],\n ionian: [2, 2, 1, 2, 2, 2, 1],\n dorian: [2, 1, 2, 2, 2, 1, 2],\n phyrgian: [1, 2, 2, 2, 1, 2, 2],\n lydian: [2, 2, 2, 1, 2, 2, 1],\n mixolydian: [2, 2, 1, 2, 2, 1, 2],\n aeolian: [2, 1, 2, 2, 1, 2, 2],\n locrian: [1, 2, 2, 1, 2, 2, 2],\n };\n }\n /** Scales associated with m (minor) and M (major). */\n static get scaleTypes() {\n return {\n M: Music.scales.major,\n m: Music.scales.minor,\n };\n }\n /** Accidentals abbreviations. */\n static get accidentals() {\n return ['bb', 'b', 'n', '#', '##'];\n }\n /** Note values. */\n static get noteValues() {\n return {\n c: { root_index: 0, int_val: 0 },\n cn: { root_index: 0, int_val: 0 },\n 'c#': { root_index: 0, int_val: 1 },\n 'c##': { root_index: 0, int_val: 2 },\n cb: { root_index: 0, int_val: 11 },\n cbb: { root_index: 0, int_val: 10 },\n d: { root_index: 1, int_val: 2 },\n dn: { root_index: 1, int_val: 2 },\n 'd#': { root_index: 1, int_val: 3 },\n 'd##': { root_index: 1, int_val: 4 },\n db: { root_index: 1, int_val: 1 },\n dbb: { root_index: 1, int_val: 0 },\n e: { root_index: 2, int_val: 4 },\n en: { root_index: 2, int_val: 4 },\n 'e#': { root_index: 2, int_val: 5 },\n 'e##': { root_index: 2, int_val: 6 },\n eb: { root_index: 2, int_val: 3 },\n ebb: { root_index: 2, int_val: 2 },\n f: { root_index: 3, int_val: 5 },\n fn: { root_index: 3, int_val: 5 },\n 'f#': { root_index: 3, int_val: 6 },\n 'f##': { root_index: 3, int_val: 7 },\n fb: { root_index: 3, int_val: 4 },\n fbb: { root_index: 3, int_val: 3 },\n g: { root_index: 4, int_val: 7 },\n gn: { root_index: 4, int_val: 7 },\n 'g#': { root_index: 4, int_val: 8 },\n 'g##': { root_index: 4, int_val: 9 },\n gb: { root_index: 4, int_val: 6 },\n gbb: { root_index: 4, int_val: 5 },\n a: { root_index: 5, int_val: 9 },\n an: { root_index: 5, int_val: 9 },\n 'a#': { root_index: 5, int_val: 10 },\n 'a##': { root_index: 5, int_val: 11 },\n ab: { root_index: 5, int_val: 8 },\n abb: { root_index: 5, int_val: 7 },\n b: { root_index: 6, int_val: 11 },\n bn: { root_index: 6, int_val: 11 },\n 'b#': { root_index: 6, int_val: 0 },\n 'b##': { root_index: 6, int_val: 1 },\n bb: { root_index: 6, int_val: 10 },\n bbb: { root_index: 6, int_val: 9 },\n };\n }\n isValidNoteValue(note) {\n return note >= 0 && note < Music.canonical_notes.length;\n }\n isValidIntervalValue(interval) {\n return interval >= 0 && interval < Music.diatonic_intervals.length;\n }\n /** Return root and accidental associated to a note. */\n getNoteParts(noteString) {\n if (!noteString || noteString.length < 1) {\n throw new RuntimeError('BadArguments', 'Invalid note name: ' + noteString);\n }\n if (noteString.length > 3) {\n throw new RuntimeError('BadArguments', 'Invalid note name: ' + noteString);\n }\n const note = noteString.toLowerCase();\n const regex = /^([cdefgab])(b|bb|n|#|##)?$/;\n const match = regex.exec(note);\n if (match !== null) {\n const root = match[1];\n const accidental = match[2];\n return {\n root,\n accidental,\n };\n }\n else {\n throw new RuntimeError('BadArguments', 'Invalid note name: ' + noteString);\n }\n }\n /** Return root, accidental and type associated to a key. */\n getKeyParts(keyString) {\n if (!keyString || keyString.length < 1) {\n throw new RuntimeError('BadArguments', 'Invalid key: ' + keyString);\n }\n const key = keyString.toLowerCase();\n // Support Major, Minor, Melodic Minor, and Harmonic Minor key types.\n const regex = /^([cdefgab])(b|#)?(mel|harm|m|M)?$/;\n const match = regex.exec(key);\n if (match !== null) {\n const root = match[1];\n const accidental = match[2];\n let type = match[3];\n // Unspecified type implies major\n if (!type)\n type = 'M';\n return {\n root,\n accidental,\n type,\n };\n }\n else {\n throw new RuntimeError('BadArguments', `Invalid key: ${keyString}`);\n }\n }\n /** Note value associated to a note name. */\n getNoteValue(noteString) {\n const value = Music.noteValues[noteString];\n if (value === undefined) {\n throw new RuntimeError('BadArguments', `Invalid note name: ${noteString}`);\n }\n return value.int_val;\n }\n /** Interval value associated to an interval name. */\n getIntervalValue(intervalString) {\n const value = Music.intervals[intervalString];\n if (value === undefined) {\n throw new RuntimeError('BadArguments', `Invalid interval name: ${intervalString}`);\n }\n return value;\n }\n /** Canonical note name associated to a value. */\n getCanonicalNoteName(noteValue) {\n if (!this.isValidNoteValue(noteValue)) {\n throw new RuntimeError('BadArguments', `Invalid note value: ${noteValue}`);\n }\n return Music.canonical_notes[noteValue];\n }\n /** Interval name associated to a value. */\n getCanonicalIntervalName(intervalValue) {\n if (!this.isValidIntervalValue(intervalValue)) {\n throw new RuntimeError('BadArguments', `Invalid interval value: ${intervalValue}`);\n }\n return Music.diatonic_intervals[intervalValue];\n }\n /**\n * Given a note, interval, and interval direction, produce the relative note.\n */\n getRelativeNoteValue(noteValue, intervalValue, direction = 1) {\n if (direction !== 1 && direction !== -1) {\n throw new RuntimeError('BadArguments', `Invalid direction: ${direction}`);\n }\n let sum = (noteValue + direction * intervalValue) % Music.NUM_TONES;\n if (sum < 0)\n sum += Music.NUM_TONES;\n return sum;\n }\n /**\n * Given a root and note value, produce the relative note name.\n */\n getRelativeNoteName(root, noteValue) {\n const parts = this.getNoteParts(root);\n const rootValue = this.getNoteValue(parts.root);\n let interval = noteValue - rootValue;\n if (Math.abs(interval) > Music.NUM_TONES - 3) {\n let multiplier = 1;\n if (interval > 0)\n multiplier = -1;\n // Possibly wrap around. (Add +1 for modulo operator)\n const reverse_interval = ((noteValue + 1 + (rootValue + 1)) % Music.NUM_TONES) * multiplier;\n if (Math.abs(reverse_interval) > 2) {\n throw new RuntimeError('BadArguments', `Notes not related: ${root}, ${noteValue})`);\n }\n else {\n interval = reverse_interval;\n }\n }\n if (Math.abs(interval) > 2) {\n throw new RuntimeError('BadArguments', `Notes not related: ${root}, ${noteValue})`);\n }\n let relativeNoteName = parts.root;\n if (interval > 0) {\n for (let i = 1; i <= interval; ++i) {\n relativeNoteName += '#';\n }\n }\n else if (interval < 0) {\n for (let i = -1; i >= interval; --i) {\n relativeNoteName += 'b';\n }\n }\n return relativeNoteName;\n }\n /**\n * Return scale tones, given intervals. Each successive interval is\n * relative to the previous one, e.g., Major Scale:\n *\n * TTSTTTS = [2,2,1,2,2,2,1]\n *\n * When used with key = 0, returns C scale (which is isomorphic to\n * interval list).\n */\n getScaleTones(key, intervals) {\n const tones = [key];\n let nextNote = key;\n for (let i = 0; i < intervals.length; i++) {\n nextNote = this.getRelativeNoteValue(nextNote, intervals[i]);\n if (nextNote !== key)\n tones.push(nextNote);\n }\n return tones;\n }\n /**\n * Return the interval of a note, given a diatonic scale.\n * e.g., given the scale C, and the note E, returns M3.\n */\n getIntervalBetween(note1, note2, direction = 1) {\n if (direction !== 1 && direction !== -1) {\n throw new RuntimeError('BadArguments', `Invalid direction: ${direction}`);\n }\n if (!this.isValidNoteValue(note1) || !this.isValidNoteValue(note2)) {\n throw new RuntimeError('BadArguments', `Invalid notes: ${note1}, ${note2}`);\n }\n let difference = direction === 1 ? note2 - note1 : note1 - note2;\n if (difference < 0)\n difference += Music.NUM_TONES;\n return difference;\n }\n /**\n * Create a scale map that represents the pitch state for a\n * `keySignature`. For example, passing a `G` to `keySignature` would\n * return a scale map with every note naturalized except for `F` which\n * has an `F#` state.\n */\n createScaleMap(keySignature) {\n const keySigParts = this.getKeyParts(keySignature);\n if (!keySigParts.type)\n throw new RuntimeError('BadArguments', 'Unsupported key type: undefined');\n const scaleName = Music.scaleTypes[keySigParts.type];\n let keySigString = keySigParts.root;\n if (keySigParts.accidental)\n keySigString += keySigParts.accidental;\n if (!scaleName)\n throw new RuntimeError('BadArguments', 'Unsupported key type: ' + keySignature);\n const scale = this.getScaleTones(this.getNoteValue(keySigString), scaleName);\n const noteLocation = Music.root_indices[keySigParts.root];\n const scaleMap = {};\n for (let i = 0; i < Music.roots.length; ++i) {\n const index = (noteLocation + i) % Music.roots.length;\n const rootName = Music.roots[index];\n let noteName = this.getRelativeNoteName(rootName, scale[i]);\n if (noteName.length === 1) {\n noteName += 'n';\n }\n scaleMap[rootName] = noteName;\n }\n return scaleMap;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from './font';\nimport { drawDot } from './rendercontext';\nimport { Tables } from './tables';\nimport { Tickable } from './tickable';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\n/**\n * Note implements an abstract interface for notes and chords that\n * are rendered on a stave. Notes have some common properties: All of them\n * have a value (e.g., pitch, fret, etc.) and a duration (quarter, half, etc.)\n *\n * Some notes have stems, heads, dots, etc. Most notational elements that\n * surround a note are called *modifiers*, and every note has an associated\n * array of them. All notes also have a rendering context and belong to a stave.\n */\nexport class Note extends Tickable {\n /**\n * Every note is a tickable, i.e., it can be mutated by the `Formatter` class for\n * positioning and layout.\n *\n * @param noteStruct To create a new note you need to provide a `noteStruct`.\n */\n constructor(noteStruct) {\n super();\n if (!noteStruct) {\n throw new RuntimeError('BadArguments', 'Note must have valid initialization data to identify duration and type.');\n }\n /** Parses `noteStruct` and get note properties. */\n const parsedNoteStruct = Note.parseNoteStruct(noteStruct);\n if (!parsedNoteStruct) {\n throw new RuntimeError('BadArguments', `Invalid note initialization object: ${JSON.stringify(noteStruct)}`);\n }\n // Set note properties from parameters.\n this.keys = noteStruct.keys || [];\n // per-pitch properties\n this.keyProps = [];\n this.duration = parsedNoteStruct.duration;\n this.noteType = parsedNoteStruct.type;\n this.customTypes = parsedNoteStruct.customTypes;\n if (noteStruct.duration_override) {\n // Custom duration\n this.setDuration(noteStruct.duration_override);\n }\n else {\n // Default duration\n this.setIntrinsicTicks(parsedNoteStruct.ticks);\n }\n this.modifiers = [];\n // Get the glyph code for this note from the font.\n this.glyph = Tables.getGlyphProps(this.duration, this.noteType);\n this.customGlyphs = this.customTypes.map((t) => Tables.getGlyphProps(this.duration, t));\n // Note to play for audio players.\n this.playNote = undefined;\n // Positioning contexts used by the Formatter.\n this.ignore_ticks = false;\n // Positioning variables\n this.width = 0; // Width in pixels calculated after preFormat\n this.leftDisplacedHeadPx = 0; // Extra room on left for displaced note head\n this.rightDisplacedHeadPx = 0; // Extra room on right for displaced note head\n this.x_shift = 0; // X shift from tick context X\n this.ys = []; // list of y coordinates for each note\n // we need to hold on to these for ties and beams.\n if (noteStruct.align_center) {\n this.setCenterAlignment(noteStruct.align_center);\n }\n // The render surface.\n this.render_options = {\n annotation_spacing: 5,\n glyph_font_scale: 1,\n stroke_px: 1,\n scale: 1,\n font: '',\n y_shift: 0,\n };\n }\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // STATIC MEMBERS\n static get CATEGORY() {\n return Category.Note;\n }\n /** Debug helper. Displays various note metrics for the given note. */\n static plotMetrics(ctx, note, yPos) {\n const metrics = note.getMetrics();\n const xStart = note.getAbsoluteX() - metrics.modLeftPx - metrics.leftDisplacedHeadPx;\n const xPre1 = note.getAbsoluteX() - metrics.leftDisplacedHeadPx;\n const xAbs = note.getAbsoluteX();\n const xPost1 = note.getAbsoluteX() + metrics.notePx;\n const xPost2 = note.getAbsoluteX() + metrics.notePx + metrics.rightDisplacedHeadPx;\n const xEnd = note.getAbsoluteX() + metrics.notePx + metrics.rightDisplacedHeadPx + metrics.modRightPx;\n const xFreedomRight = xEnd + (note.getFormatterMetrics().freedom.right || 0);\n const xWidth = xEnd - xStart;\n ctx.save();\n ctx.setFont(Font.SANS_SERIF, 8);\n ctx.fillText(Math.round(xWidth) + 'px', xStart + note.getXShift(), yPos);\n const y = yPos + 7;\n function stroke(x1, x2, color, yy = y) {\n ctx.beginPath();\n ctx.setStrokeStyle(color);\n ctx.setFillStyle(color);\n ctx.setLineWidth(3);\n ctx.moveTo(x1 + note.getXShift(), yy);\n ctx.lineTo(x2 + note.getXShift(), yy);\n ctx.stroke();\n }\n stroke(xStart, xPre1, 'red');\n stroke(xPre1, xAbs, '#999');\n stroke(xAbs, xPost1, 'green');\n stroke(xPost1, xPost2, '#999');\n stroke(xPost2, xEnd, 'red');\n stroke(xEnd, xFreedomRight, '#DD0');\n stroke(xStart - note.getXShift(), xStart, '#BBB'); // Shift\n drawDot(ctx, xAbs + note.getXShift(), y, 'blue');\n const formatterMetrics = note.getFormatterMetrics();\n if (formatterMetrics.iterations > 0) {\n const spaceDeviation = formatterMetrics.space.deviation;\n const prefix = spaceDeviation >= 0 ? '+' : '';\n ctx.setFillStyle('red');\n ctx.fillText(prefix + Math.round(spaceDeviation), xAbs + note.getXShift(), yPos - 10);\n }\n ctx.restore();\n }\n static parseDuration(durationString) {\n if (!durationString) {\n return undefined;\n }\n const regexp = /(\\d*\\/?\\d+|[a-z])(d*)([nrhms]|$)/;\n const result = regexp.exec(durationString);\n if (!result) {\n return undefined;\n }\n const duration = result[1];\n const dots = result[2].length;\n const type = result[3] || 'n';\n return { duration, dots, type };\n }\n static parseNoteStruct(noteStruct) {\n // Preserve backwards-compatibility\n const durationProps = Note.parseDuration(noteStruct.duration);\n if (!durationProps) {\n return undefined;\n }\n // If specified type is invalid, return undefined.\n let type = noteStruct.type;\n if (type && !Tables.validTypes[type]) {\n return undefined;\n }\n // If no type specified, check duration or custom types\n const customTypes = [];\n if (!type) {\n type = durationProps.type || 'n';\n // If we have keys, try and check if we've got a custom glyph\n if (noteStruct.keys !== undefined) {\n noteStruct.keys.forEach((k, i) => {\n const result = k.split('/');\n // We have a custom glyph specified after the note eg. /X2\n customTypes[i] = (result && result.length === 3 ? result[2] : type);\n });\n }\n }\n // Calculate the tick duration of the note\n let ticks = Tables.durationToTicks(durationProps.duration);\n if (!ticks) {\n return undefined;\n }\n // Are there any dots?\n const dots = noteStruct.dots ? noteStruct.dots : durationProps.dots;\n if (typeof dots !== 'number') {\n return undefined;\n }\n // Add ticks as necessary depending on the numbr of dots\n let currentTicks = ticks;\n for (let i = 0; i < dots; i++) {\n if (currentTicks <= 1)\n return undefined;\n currentTicks = currentTicks / 2;\n ticks += currentTicks;\n }\n return {\n duration: durationProps.duration,\n type,\n customTypes,\n dots,\n ticks,\n };\n }\n /**\n * Get the play note, which is arbitrary data that can be used by an\n * audio player.\n */\n getPlayNote() {\n return this.playNote;\n }\n /**\n * Set the play note, which is arbitrary data that can be used by an\n * audio player.\n */\n setPlayNote(note) {\n this.playNote = note;\n return this;\n }\n /**\n * @returns true if this note is a type of rest.\n *\n * Rests don't have pitches, but take up space in the score.\n * Subclasses should override this default implementation.\n */\n isRest() {\n return false;\n }\n /** Add stroke. */\n addStroke(index, stroke) {\n stroke.setNote(this);\n stroke.setIndex(index);\n this.modifiers.push(stroke);\n this.preFormatted = false;\n return this;\n }\n /** Get the target stave. */\n getStave() {\n return this.stave;\n }\n /** Check and get the target stave. */\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n /** Set the target stave. */\n setStave(stave) {\n this.stave = stave;\n this.setYs([stave.getYForLine(0)]); // Update Y values if the stave is changed.\n this.setContext(this.stave.getContext());\n return this;\n }\n /** Get spacing to the left of the notes. */\n getLeftDisplacedHeadPx() {\n return this.leftDisplacedHeadPx;\n }\n /** Get spacing to the right of the notes. */\n getRightDisplacedHeadPx() {\n return this.rightDisplacedHeadPx;\n }\n /** Set spacing to the left of the notes. */\n setLeftDisplacedHeadPx(x) {\n this.leftDisplacedHeadPx = x;\n return this;\n }\n /** Set spacing to the right of the notes. */\n setRightDisplacedHeadPx(x) {\n this.rightDisplacedHeadPx = x;\n return this;\n }\n /** True if this note has no duration (e.g., bar notes, spacers, etc.). */\n shouldIgnoreTicks() {\n return this.ignore_ticks;\n }\n /** Get the stave line number for the note. */\n // eslint-disable-next-line\n getLineNumber(isTopNote) {\n return 0;\n }\n /** Get the stave line number for rest. */\n getLineForRest() {\n return 0;\n }\n /** Get the glyph associated with this note. */\n // eslint-disable-next-line\n getGlyph() {\n return this.glyph;\n }\n /** Get the glyph width. */\n getGlyphWidth() {\n // TODO: FIXME (multiple potential values for this.glyph)\n if (this.glyph) {\n if (this.glyph.getMetrics) {\n return this.glyph.getMetrics().width;\n }\n else if (this.glyph.getWidth) {\n return this.glyph.getWidth(this.render_options.glyph_font_scale);\n }\n }\n return 0;\n }\n /**\n * Set Y positions for this note. Each Y value is associated with\n * an individual pitch/key within the note/chord.\n */\n setYs(ys) {\n this.ys = ys;\n return this;\n }\n /**\n * Get Y positions for this note. Each Y value is associated with\n * an individual pitch/key within the note/chord.\n */\n getYs() {\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', 'No Y-values calculated for this note.');\n }\n return this.ys;\n }\n /**\n * Get the Y position of the space above the stave onto which text can\n * be rendered.\n */\n getYForTopText(text_line) {\n return this.checkStave().getYForTopText(text_line);\n }\n /** Return the voice that this note belongs in. */\n getVoice() {\n if (!this.voice)\n throw new RuntimeError('NoVoice', 'Note has no voice.');\n return this.voice;\n }\n /** Attach this note to `voice`. */\n setVoice(voice) {\n this.voice = voice;\n this.preFormatted = false;\n return this;\n }\n /** Get the `TickContext` for this note. */\n getTickContext() {\n return this.checkTickContext();\n }\n /** Set the `TickContext` for this note. */\n setTickContext(tc) {\n this.tickContext = tc;\n this.preFormatted = false;\n return this;\n }\n /** Accessor to duration. */\n getDuration() {\n return this.duration;\n }\n /** Accessor to isDotted. */\n isDotted() {\n return this.getModifiersByType('Dot').length > 0;\n }\n /** Accessor to hasStem. */\n hasStem() {\n return false;\n }\n /** Accessor to note type. */\n getNoteType() {\n return this.noteType;\n }\n /** Get the beam. */\n getBeam() {\n return this.beam;\n }\n /** Check and get the beam. */\n checkBeam() {\n return defined(this.beam, 'NoBeam', 'No beam attached to instance');\n }\n /** Check it has a beam. */\n hasBeam() {\n return this.beam != undefined;\n }\n /** Set the beam. */\n setBeam(beam) {\n this.beam = beam;\n return this;\n }\n /**\n * Attach a modifier to this note.\n * @param modifier the Modifier to add.\n * @param index of the key to modify.\n * @returns this\n */\n addModifier(modifier, index = 0) {\n const signature = 'Note.addModifier(modifier: Modifier, index: number=0)';\n // Backwards compatibility with 3.0.9.\n if (typeof index === 'string') {\n index = parseInt(index);\n // eslint-disable-next-line\n console.warn(signature + ' expected a number for `index`, but received a string.');\n }\n // Some versions of VexFlow had the two parameters reversed.\n // Check here and throw an error if the argument types are not correct.\n if (typeof modifier !== 'object' || typeof index !== 'number') {\n throw new RuntimeError('WrongParams', 'Incorrect call signature. Use ' + signature + ' instead.');\n }\n modifier.setNote(this);\n modifier.setIndex(index);\n super.addModifier(modifier);\n return this;\n }\n // Get all modifiers of a specific type in the `ModifierContext`\n getModifiersByType(type) {\n return this.checkModifierContext().getMembers(type);\n }\n /** Get the coordinates for where modifiers begin. */\n // eslint-disable-next-line\n getModifierStartXY(position, index, options) {\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call GetModifierStartXY on an unformatted note\");\n }\n return {\n x: this.getAbsoluteX(),\n y: this.ys[0],\n };\n }\n getRightParenthesisPx(index) {\n const props = this.getKeyProps()[index];\n return props.displaced ? this.getRightDisplacedHeadPx() : 0;\n }\n getLeftParenthesisPx(index) {\n const props = this.getKeyProps()[index];\n return props.displaced ? this.getLeftDisplacedHeadPx() : 0;\n }\n getFirstDotPx() {\n let px = this.getRightDisplacedHeadPx();\n if (this.checkModifierContext().getMembers('Parenthesis').length !== 0)\n px += Tables.currentMusicFont().lookupMetric('parenthesis.default.width');\n return px;\n }\n /** Get the metrics for this note. */\n getMetrics() {\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call getMetrics on an unformatted note.\");\n }\n const modLeftPx = this.modifierContext ? this.modifierContext.getState().left_shift : 0;\n const modRightPx = this.modifierContext ? this.modifierContext.getState().right_shift : 0;\n const width = this.getWidth();\n const glyphWidth = this.getGlyphWidth();\n const notePx = width -\n modLeftPx - // subtract left modifiers\n modRightPx - // subtract right modifiers\n this.leftDisplacedHeadPx - // subtract left displaced head\n this.rightDisplacedHeadPx; // subtract right displaced head\n // NOTE: If you change this, remember to update MockTickable.getMetrics() in the tests/ directory.\n return {\n width,\n glyphWidth,\n notePx,\n // Modifier spacing.\n modLeftPx,\n modRightPx,\n // Displaced note head on left or right.\n leftDisplacedHeadPx: this.leftDisplacedHeadPx,\n rightDisplacedHeadPx: this.rightDisplacedHeadPx,\n glyphPx: 0,\n };\n }\n /**\n * Get the absolute `X` position of this note's tick context. This\n * excludes x_shift, so you'll need to factor it in if you're\n * looking for the post-formatted x-position.\n */\n getAbsoluteX() {\n const tickContext = this.checkTickContext(`Can't getAbsoluteX() without a TickContext.`);\n // Position note to left edge of tick context.\n let x = tickContext.getX();\n if (this.stave) {\n x += this.stave.getNoteStartX() + Tables.currentMusicFont().lookupMetric('stave.padding');\n }\n if (this.isCenterAligned()) {\n x += this.getCenterXShift();\n }\n return x;\n }\n /** Get the direction of the stem. */\n getStemDirection() {\n throw new RuntimeError('NoStem', 'No stem attached to this note.');\n }\n /** Get the top and bottom `y` values of the stem. */\n getStemExtents() {\n throw new RuntimeError('NoStem', 'No stem attached to this note.');\n }\n /** Get the `x` coordinate to the right of the note. */\n getTieRightX() {\n let tieStartX = this.getAbsoluteX();\n const note_glyph_width = this.glyph.getWidth();\n tieStartX += note_glyph_width / 2;\n tieStartX += -this.width / 2 + this.width + 2;\n return tieStartX;\n }\n /** Get the `x` coordinate to the left of the note. */\n getTieLeftX() {\n let tieEndX = this.getAbsoluteX();\n const note_glyph_width = this.glyph.getWidth();\n tieEndX += note_glyph_width / 2;\n tieEndX -= this.width / 2 + 2;\n return tieEndX;\n }\n // Get the pitches in the note\n getKeys() {\n return this.keys;\n }\n // Get the properties for all the keys in the note\n getKeyProps() {\n return this.keyProps;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { BoundingBox } from './boundingbox';\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (NoteHead.DEBUG)\n log('Vex.Flow.NoteHead', args);\n}\n/**\n * Draw slashnote head manually. No glyph exists for this.\n * @param ctx the Canvas context\n * @param duration the duration of the note. ex: \"4\"\n * @param x the x coordinate to draw at\n * @param y the y coordinate to draw at\n * @param stem_direction the direction of the stem\n */\nfunction drawSlashNoteHead(ctx, duration, x, y, stem_direction, staveSpace) {\n const width = Tables.SLASH_NOTEHEAD_WIDTH;\n ctx.save();\n ctx.setLineWidth(Tables.STEM_WIDTH);\n let fill = false;\n if (Tables.durationToNumber(duration) > 2) {\n fill = true;\n }\n if (!fill)\n x -= (Tables.STEM_WIDTH / 2) * stem_direction;\n ctx.beginPath();\n ctx.moveTo(x, y + staveSpace);\n ctx.lineTo(x, y + 1);\n ctx.lineTo(x + width, y - staveSpace);\n ctx.lineTo(x + width, y);\n ctx.lineTo(x, y + staveSpace);\n ctx.closePath();\n if (fill) {\n ctx.fill();\n }\n else {\n ctx.stroke();\n }\n if (Tables.durationToFraction(duration).equals(0.5)) {\n const breve_lines = [-3, -1, width + 1, width + 3];\n for (let i = 0; i < breve_lines.length; i++) {\n ctx.beginPath();\n ctx.moveTo(x + breve_lines[i], y - 10);\n ctx.lineTo(x + breve_lines[i], y + 11);\n ctx.stroke();\n }\n }\n ctx.restore();\n}\n/**\n * `NoteHeads` are typically not manipulated\n * directly, but used internally in `StaveNote`.\n *\n * See `tests/notehead_tests.ts` for usage examples.\n */\nexport class NoteHead extends Note {\n constructor(noteStruct) {\n super(noteStruct);\n this.custom_glyph = false;\n this.stem_up_x_offset = 0;\n this.stem_down_x_offset = 0;\n this.index = noteStruct.index;\n this.x = noteStruct.x || 0;\n this.y = noteStruct.y || 0;\n if (noteStruct.note_type)\n this.noteType = noteStruct.note_type;\n this.displaced = noteStruct.displaced || false;\n this.stem_direction = noteStruct.stem_direction || Stem.UP;\n this.line = noteStruct.line || 0;\n // Get glyph code based on duration and note type. This could be\n // regular notes, rests, or other custom codes.\n this.glyph = Tables.getGlyphProps(this.duration, this.noteType);\n defined(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`);\n this.glyph_code = this.glyph.code_head;\n this.x_shift = noteStruct.x_shift || 0;\n if (noteStruct.custom_glyph_code) {\n this.custom_glyph = true;\n this.glyph_code = noteStruct.custom_glyph_code;\n this.stem_up_x_offset = noteStruct.stem_up_x_offset || 0;\n this.stem_down_x_offset = noteStruct.stem_down_x_offset || 0;\n }\n this.style = noteStruct.style;\n this.slashed = noteStruct.slashed || false;\n this.render_options = Object.assign(Object.assign({}, this.render_options), { \n // font size for note heads\n glyph_font_scale: noteStruct.glyph_font_scale || Tables.NOTATION_FONT_SCALE });\n this.setWidth(this.glyph.getWidth(this.render_options.glyph_font_scale));\n }\n static get CATEGORY() {\n return Category.NoteHead;\n }\n /** Get the width of the notehead. */\n getWidth() {\n return this.width;\n }\n /** Determine if the notehead is displaced. */\n isDisplaced() {\n return this.displaced === true;\n }\n /** Get the glyph data. */\n getGlyph() {\n return this.glyph;\n }\n /** Set the X coordinate. */\n setX(x) {\n this.x = x;\n return this;\n }\n /** Get the Y coordinate. */\n getY() {\n return this.y;\n }\n /** Set the Y coordinate. */\n setY(y) {\n this.y = y;\n return this;\n }\n /** Get the stave line the notehead is placed on. */\n getLine() {\n return this.line;\n }\n /** Set the stave line the notehead is placed on. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Get the canvas `x` coordinate position of the notehead. */\n getAbsoluteX() {\n // If the note has not been preformatted, then get the static x value\n // Otherwise, it's been formatted and we should use it's x value relative\n // to its tick context\n const x = !this.preFormatted ? this.x : super.getAbsoluteX();\n // For a more natural displaced notehead, we adjust the displacement amount\n // by half the stem width in order to maintain a slight overlap with the stem\n const displacementStemAdjustment = Stem.WIDTH / 2;\n const musicFont = Tables.currentMusicFont();\n const fontShift = musicFont.lookupMetric('notehead.shiftX', 0) * this.stem_direction;\n const displacedFontShift = musicFont.lookupMetric('noteHead.displaced.shiftX', 0) * this.stem_direction;\n return (x +\n fontShift +\n (this.displaced ? (this.width - displacementStemAdjustment) * this.stem_direction + displacedFontShift : 0));\n }\n /** Get the `BoundingBox` for the `NoteHead`. */\n getBoundingBox() {\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call getBoundingBox on an unformatted note.\");\n }\n const spacing = this.checkStave().getSpacingBetweenLines();\n const half_spacing = spacing / 2;\n const min_y = this.y - half_spacing;\n return new BoundingBox(this.getAbsoluteX(), min_y, this.width, spacing);\n }\n /** Set notehead to a provided `stave`. */\n setStave(stave) {\n const line = this.getLine();\n this.stave = stave;\n if (this.stave) {\n this.setY(this.stave.getYForNote(line));\n this.setContext(this.stave.getContext());\n }\n return this;\n }\n /** Pre-render formatting. */\n preFormat() {\n if (this.preFormatted)\n return this;\n const width = this.getWidth() + this.leftDisplacedHeadPx + this.rightDisplacedHeadPx;\n this.setWidth(width);\n this.preFormatted = true;\n return this;\n }\n /** Draw the notehead. */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n let head_x = this.getAbsoluteX();\n if (this.custom_glyph) {\n // head_x += this.x_shift;\n head_x += this.stem_direction === Stem.UP ? this.stem_up_x_offset : this.stem_down_x_offset;\n }\n const y = this.y;\n L(\"Drawing note head '\", this.noteType, this.duration, \"' at\", head_x, y);\n // Begin and end positions for head.\n const stem_direction = this.stem_direction;\n const glyph_font_scale = this.render_options.glyph_font_scale;\n if (this.style) {\n this.applyStyle(ctx);\n }\n const categorySuffix = `${this.glyph_code}Stem${stem_direction === Stem.UP ? 'Up' : 'Down'}`;\n if (this.noteType === 's') {\n const staveSpace = this.checkStave().getSpacingBetweenLines();\n drawSlashNoteHead(ctx, this.duration, head_x, y, stem_direction, staveSpace);\n }\n else {\n Glyph.renderGlyph(ctx, head_x, y, glyph_font_scale, this.glyph_code, {\n category: this.custom_glyph ? `noteHead.custom.${categorySuffix}` : `noteHead.standard.${categorySuffix}`,\n });\n }\n if (this.style) {\n this.restoreStyle(ctx);\n }\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.NoteHead.DEBUG` to `true`. */\nNoteHead.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2016\n//\n// ## Description\n//\n// This file implements `NoteSubGroup` which is used to format and\n// render notes as a `Modifier`\n// ex) ClefNote, TimeSigNote and BarNote.\nimport { Formatter } from './formatter';\nimport { Modifier } from './modifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { Voice } from './voice';\nexport class NoteSubGroup extends Modifier {\n constructor(subNotes) {\n super();\n this.preFormatted = false;\n this.position = Modifier.Position.LEFT;\n this.subNotes = subNotes;\n this.subNotes.forEach((subNote) => {\n subNote.setIgnoreTicks(false);\n });\n this.width = 0;\n this.formatter = new Formatter();\n this.voice = new Voice({\n num_beats: 4,\n beat_value: 4,\n resolution: Tables.RESOLUTION,\n }).setStrict(false);\n this.voice.addTickables(this.subNotes);\n }\n static get CATEGORY() {\n return Category.NoteSubGroup;\n }\n // Arrange groups inside a `ModifierContext`\n static format(groups, state) {\n if (!groups || groups.length === 0)\n return false;\n let width = 0;\n for (let i = 0; i < groups.length; ++i) {\n const group = groups[i];\n group.preFormat();\n width += group.getWidth();\n }\n state.left_shift += width;\n return true;\n }\n preFormat() {\n if (this.preFormatted)\n return;\n this.formatter.joinVoices([this.voice]).format([this.voice], 0);\n this.setWidth(this.formatter.getMinTotalWidth());\n this.preFormatted = true;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n getWidth() {\n return this.width;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n this.alignSubNotesWithNote(this.subNotes, note); // Modifier function\n this.subNotes.forEach((subNote) => subNote.setContext(ctx).drawWithStyle());\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Cyril Silverman\n// MIT License\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { TickContext } from './tickcontext';\nimport { Category, isTabNote } from './typeguard';\nimport { defined, log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Ornament.DEBUG)\n log('Vex.Flow.Ornament', args);\n}\n/**\n * Ornament implements ornaments as modifiers that can be\n * attached to notes. The complete list of ornaments is available in\n * `tables.ts` under `Vex.Flow.ornamentCodes`.\n *\n * See `tests/ornament_tests.ts` for usage examples.\n */\nexport class Ornament extends Modifier {\n /**\n * Create a new ornament of type `type`, which is an entry in\n * `Vex.Flow.ornamentCodes` in `tables.ts`.\n */\n constructor(type) {\n super();\n this.type = type;\n this.delayed = false;\n this.render_options = {\n font_scale: 38,\n accidentalLowerPadding: 3,\n accidentalUpperPadding: 3,\n };\n this.ornament = Tables.ornamentCodes(this.type);\n // new ornaments have their origin at the origin, and have more specific\n // metrics. Legacy ornaments do some\n // x scaling, and have hard-coded metrics\n const metrics = this.getMetrics();\n // some jazz ornaments are above or below depending on stem direction.\n this.adjustForStemDirection = false;\n // some jazz ornaments like falls are supposed to overlap with future bars\n // and so we report a different width than they actually take up.\n this.reportedWidth = metrics && metrics.reportedWidth ? metrics.reportedWidth : 0;\n this.stemUpYOffset = metrics && metrics.stemUpYOffset ? metrics.stemUpYOffset : 0;\n this.ornamentAlignWithNoteHead = Ornament.ornamentAlignWithNoteHead.indexOf(this.type) >= 0;\n if (!this.ornament) {\n throw new RuntimeError('ArgumentError', `Ornament not found: '${this.type}'`);\n }\n this.x_shift = metrics ? metrics.xOffset : 0;\n this.y_shift = metrics ? metrics.yOffset : 0;\n this.glyph = new Glyph(this.ornament.code, this.render_options.font_scale, {\n category: `ornament.${this.ornament.code}`,\n });\n // Is this a jazz ornament that goes between this note and the next note.\n if (Ornament.ornamentNoteTransition.indexOf(this.type) >= 0) {\n this.delayed = true;\n }\n // Legacy ornaments need this. I don't know why, but horizontal spacing issues\n // happen if I don't set it.\n if (!metrics) {\n this.glyph.setOrigin(0.5, 1.0); // FIXME: SMuFL won't require a vertical origin shift\n }\n }\n /** Ornaments category string. */\n static get CATEGORY() {\n return Category.Ornament;\n }\n /** Arrange ornaments inside `ModifierContext` */\n static format(ornaments, state) {\n if (!ornaments || ornaments.length === 0)\n return false;\n let width = 0; // width is used by ornaments, which are always centered on the note head\n let right_shift = state.right_shift; // jazz ornaments calculate r/l shift separately\n let left_shift = state.left_shift;\n let yOffset = 0;\n for (let i = 0; i < ornaments.length; ++i) {\n const ornament = ornaments[i];\n const increment = 2;\n if (Ornament.ornamentRelease.indexOf(ornament.type) >= 0) {\n ornament.x_shift += right_shift + 2;\n }\n if (Ornament.ornamentAttack.indexOf(ornament.type) >= 0) {\n ornament.x_shift -= left_shift + 2;\n }\n if (ornament.reportedWidth && ornament.x_shift < 0) {\n left_shift += ornament.reportedWidth;\n }\n else if (ornament.reportedWidth && ornament.x_shift > 0) {\n right_shift += ornament.reportedWidth;\n }\n else {\n width = Math.max(ornament.getWidth(), width);\n }\n // articulations above/below the line can be stacked.\n if (Ornament.ornamentArticulation.indexOf(ornament.type) >= 0) {\n // Unfortunately we don't know the stem direction. So we base it\n // on the line number, but also allow it to be overridden.\n const ornamentNote = defined(ornament.note, 'NoAttachedNote');\n if (ornamentNote.getLineNumber() >= 3 || ornament.getPosition() === Modifier.Position.ABOVE) {\n state.top_text_line += increment;\n ornament.y_shift += yOffset;\n yOffset -= ornament.glyph.bbox.getH();\n }\n else {\n state.text_line += increment;\n ornament.y_shift += yOffset;\n yOffset += ornament.glyph.bbox.getH();\n }\n }\n else {\n if (ornament.getPosition() === Modifier.Position.ABOVE) {\n ornament.setTextLine(state.top_text_line);\n state.top_text_line += increment;\n }\n else {\n ornament.setTextLine(state.text_line);\n state.text_line += increment;\n }\n }\n }\n // Note: 'legit' ornaments don't consider other modifiers when calculating their\n // X position, but jazz ornaments sometimes need to.\n state.left_shift = left_shift + width / 2;\n state.right_shift = right_shift + width / 2;\n return true;\n }\n /**\n * ornamentNoteTransition means the jazz ornament represents an effect from one note to another,\n * these are generally on the top of the staff.\n */\n static get ornamentNoteTransition() {\n return ['flip', 'jazzTurn', 'smear'];\n }\n /**\n * ornamentAttack indicates something that happens in the attach, placed before the note and\n * any accidentals\n */\n static get ornamentAttack() {\n return ['scoop'];\n }\n /**\n * The ornament is aligned based on the note head, but without regard to whether the\n * stem goes up or down.\n */\n static get ornamentAlignWithNoteHead() {\n return ['doit', 'fall', 'fallLong', 'doitLong', 'bend', 'plungerClosed', 'plungerOpen', 'scoop'];\n }\n /**\n * An ornament that happens on the release of the note, generally placed after the\n * note and overlapping the next beat/measure..\n */\n static get ornamentRelease() {\n return ['doit', 'fall', 'fallLong', 'doitLong', 'jazzTurn', 'smear', 'flip'];\n }\n /** ornamentArticulation goes above/below the note based on space availablity */\n static get ornamentArticulation() {\n return ['bend', 'plungerClosed', 'plungerOpen'];\n }\n /**\n * Legacy ornaments have hard-coded metrics. If additional ornament types are\n * added, get their metrics here.\n */\n // eslint-disable-next-line\n getMetrics() {\n return Tables.currentMusicFont().getMetrics().glyphs.jazzOrnaments[this.ornament.code];\n }\n /** Set whether the ornament is to be delayed. */\n setDelayed(delayed) {\n this.delayed = delayed;\n return this;\n }\n /** Set the upper accidental for the ornament. */\n setUpperAccidental(accid) {\n const scale = this.render_options.font_scale / 1.3;\n this.accidentalUpper = new Glyph(Tables.accidentalCodes(accid).code, scale);\n this.accidentalUpper.setOrigin(0.5, 1.0);\n return this;\n }\n /** Set the lower accidental for the ornament. */\n setLowerAccidental(accid) {\n const scale = this.render_options.font_scale / 1.3;\n this.accidentalLower = new Glyph(Tables.accidentalCodes(accid).code, scale);\n this.accidentalLower.setOrigin(0.5, 1.0);\n return this;\n }\n /** Render ornament in position next to note. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const stemDir = note.getStemDirection();\n const stave = note.checkStave();\n const classString = Object.keys(this.getAttribute('classes')).join(' ');\n ctx.openGroup(classString, this.getAttribute('id'));\n // Get stem extents\n const stemExtents = note.checkStem().getExtents();\n let y = stemDir === Stem.DOWN ? stemExtents.baseY : stemExtents.topY;\n // TabNotes don't have stems attached to them. Tab stems are rendered outside the stave.\n if (isTabNote(note)) {\n if (note.hasStem()) {\n if (stemDir === Stem.DOWN) {\n y = stave.getYForTopText(this.text_line);\n }\n }\n else {\n // Without a stem\n y = stave.getYForTopText(this.text_line);\n }\n }\n const isPlacedOnNoteheadSide = stemDir === Stem.DOWN;\n const spacing = stave.getSpacingBetweenLines();\n let lineSpacing = 1;\n // Beamed stems are longer than quarter note stems, adjust accordingly\n if (!isPlacedOnNoteheadSide && note.hasBeam()) {\n lineSpacing += 0.5;\n }\n const totalSpacing = spacing * (this.text_line + lineSpacing);\n const glyphYBetweenLines = y - totalSpacing;\n // Get initial coordinates for the modifier position\n const start = note.getModifierStartXY(this.position, this.index);\n let glyphX = start.x;\n // If the ornament is aligned with the note head, don't consider the stave y\n // but use the 'natural' modifier y\n let glyphY = this.ornamentAlignWithNoteHead\n ? start.y\n : Math.min(stave.getYForTopText(this.text_line), glyphYBetweenLines);\n glyphY += this.y_shift;\n // Ajdust x position if ornament is delayed\n if (this.delayed) {\n let delayXShift = 0;\n const startX = glyphX - (stave.getX() - 10);\n if (this.delayXShift !== undefined) {\n delayXShift = this.delayXShift;\n }\n else {\n delayXShift += this.glyph.getMetrics().width / 2;\n const nextContext = TickContext.getNextContext(note.getTickContext());\n if (nextContext) {\n delayXShift += (nextContext.getX() - startX) * 0.5;\n }\n else {\n delayXShift += (stave.getX() + stave.getWidth() - startX) * 0.5;\n }\n this.delayXShift = delayXShift;\n }\n glyphX += delayXShift;\n }\n L('Rendering ornament: ', this.ornament, glyphX, glyphY);\n if (this.accidentalLower) {\n this.accidentalLower.render(ctx, glyphX, glyphY);\n glyphY -= this.accidentalLower.getMetrics().height;\n glyphY -= this.render_options.accidentalLowerPadding;\n }\n if (this.stemUpYOffset && note.hasStem() && note.getStemDirection() === 1) {\n glyphY += this.stemUpYOffset;\n }\n if (note.getLineNumber() < 5 && Ornament.ornamentNoteTransition.indexOf(this.type) >= 0) {\n glyphY = note.checkStave().getBoundingBox().getY() + 40;\n }\n this.glyph.render(ctx, glyphX + this.x_shift, glyphY);\n if (this.accidentalUpper) {\n glyphY -= this.glyph.getMetrics().height + this.render_options.accidentalUpperPadding;\n this.accidentalUpper.render(ctx, glyphX, glyphY);\n }\n ctx.closeGroup();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Ornament.DEBUG` to `true`. */\nOrnament.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Rodrigo Vilar\n// MIT License\nimport { Glyph } from './glyph';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { Tables } from './tables';\nimport { Category, isGraceNote } from './typeguard';\n/** Parenthesis implements parenthesis modifiers for notes. */\nexport class Parenthesis extends Modifier {\n /**\n * Constructor\n *\n * @param position Modifier.Position.LEFT (default) or Modifier.Position.RIGHT\n */\n constructor(position) {\n super();\n this.position = position !== null && position !== void 0 ? position : Modifier.Position.LEFT;\n this.point = Tables.currentMusicFont().lookupMetric('parenthesis.default.point');\n this.setWidth(Tables.currentMusicFont().lookupMetric('parenthesis.default.width'));\n }\n static get CATEGORY() {\n return Category.Parenthesis;\n }\n /** Add parentheses to the notes. */\n static buildAndAttach(notes) {\n for (const note of notes) {\n for (let i = 0; i < note.keys.length; i++) {\n note.addModifier(new Parenthesis(ModifierPosition.LEFT), i);\n note.addModifier(new Parenthesis(ModifierPosition.RIGHT), i);\n }\n }\n }\n /** Arrange parentheses inside a ModifierContext. */\n static format(parentheses, state) {\n if (!parentheses || parentheses.length === 0)\n return false;\n let x_widthL = 0;\n let x_widthR = 0;\n for (let i = 0; i < parentheses.length; ++i) {\n const parenthesis = parentheses[i];\n const note = parenthesis.getNote();\n const pos = parenthesis.getPosition();\n const index = parenthesis.checkIndex();\n let shift = 0;\n if (pos === ModifierPosition.RIGHT) {\n shift = note.getRightParenthesisPx(index);\n x_widthR = x_widthR > shift + parenthesis.width ? x_widthR : shift + parenthesis.width;\n }\n if (pos === ModifierPosition.LEFT) {\n shift = note.getLeftParenthesisPx(index);\n x_widthL = x_widthL > shift + parenthesis.width ? x_widthL : shift + parenthesis.width;\n }\n parenthesis.setXShift(shift);\n }\n state.left_shift += x_widthL;\n state.right_shift += x_widthR;\n return true;\n }\n /** Set the associated note. */\n setNote(note) {\n this.note = note;\n this.point = Tables.currentMusicFont().lookupMetric('parenthesis.default.point');\n this.setWidth(Tables.currentMusicFont().lookupMetric('parenthesis.default.width'));\n if (isGraceNote(note)) {\n this.point = Tables.currentMusicFont().lookupMetric('parenthesis.gracenote.point');\n this.setWidth(Tables.currentMusicFont().lookupMetric('parenthesis.gracenote.width'));\n }\n return this;\n }\n /** Render the parenthesis. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(this.position, this.index, { forceFlagRight: true });\n const x = start.x + this.x_shift;\n const y = start.y + this.y_shift;\n if (this.position == Modifier.Position.RIGHT) {\n Glyph.renderGlyph(ctx, x + 1, y, this.point, 'noteheadParenthesisRight', {\n category: `noteHead.standard.noteheadParenthesisRight`,\n });\n }\n else if (this.position == Modifier.Position.LEFT) {\n Glyph.renderGlyph(ctx, x - 2, y, this.point, 'noteheadParenthesisLeft', {\n category: `noteHead.standard.noteheadParenthesisLeft`,\n });\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// A generic text parsing class for VexFlow.\nimport { log, RuntimeError } from './util';\n// To enable logging for this class. Set `Vex.Flow.Parser.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (Parser.DEBUG)\n log('Vex.Flow.Parser', args);\n}\nconst NO_ERROR_POS = -1;\n// Converts parser results into an easy to reference list that can be\n// used in triggers. This function returns:\n// - nested array in which the leaf elements are string or null\n// - string (including empty strings)\n// - null\nfunction flattenMatches(r) {\n if ('matchedString' in r)\n return r.matchedString; // string\n if ('results' in r)\n return flattenMatches(r.results);\n const results = r;\n if (results.length === 1)\n return flattenMatches(results[0]);\n if (results.length === 0)\n return null;\n return results.map(flattenMatches); // nested array\n}\n// This is the base parser class. Given an arbitrary context-free grammar, it\n// can parse any line and execute code when specific rules are met (e.g.,\n// when a string is terminated.)\nexport class Parser {\n // For an example of a simple grammar, take a look at tests/parser_tests.ts or\n // the EasyScore grammar in easyscore.ts.\n constructor(grammar) {\n this.grammar = grammar;\n this.line = '';\n this.pos = 0;\n this.errorPos = NO_ERROR_POS;\n }\n // Parse `line` using current grammar. Returns `{success: true}` if the\n // line parsed correctly, otherwise returns `{success: false, errorPos: N}`\n // where `errorPos` is the location of the error in the string.\n parse(line) {\n this.line = line;\n this.pos = 0;\n this.errorPos = NO_ERROR_POS;\n const result = this.expect(this.grammar.begin());\n result.errorPos = this.errorPos;\n return result;\n }\n matchFail(returnPos) {\n if (this.errorPos === NO_ERROR_POS)\n this.errorPos = this.pos;\n this.pos = returnPos;\n }\n matchSuccess() {\n this.errorPos = NO_ERROR_POS;\n }\n // Look for `token` in this.line[this.pos], and return success\n // if one is found. `token` is specified as a regular expression.\n matchToken(token, noSpace = false) {\n const regexp = noSpace ? new RegExp('^((' + token + '))') : new RegExp('^((' + token + ')\\\\s*)');\n const workingLine = this.line.slice(this.pos);\n const result = workingLine.match(regexp);\n if (result !== null) {\n return {\n success: true,\n matchedString: result[2],\n incrementPos: result[1].length,\n pos: this.pos,\n };\n }\n else {\n return { success: false, pos: this.pos };\n }\n }\n // Execute rule to match a sequence of tokens (or rules). If `maybe` is\n // set, then return success even if the token is not found, but reset\n // the position before exiting.\n // TODO: expectOne(...) is never called with the `maybe` parameter.\n expectOne(rule, maybe = false) {\n const results = [];\n const pos = this.pos;\n let allMatches = true;\n let oneMatch = false;\n maybe = maybe === true || rule.maybe === true;\n // Execute all sub rules in sequence.\n if (rule.expect) {\n for (const next of rule.expect) {\n const localPos = this.pos;\n const result = this.expect(next);\n // If `rule.or` is set, then return success if any one\n // of the subrules match, else all subrules must match.\n if (result.success) {\n results.push(result);\n oneMatch = true;\n if (rule.or)\n break;\n }\n else {\n allMatches = false;\n if (!rule.or) {\n this.pos = localPos;\n break;\n }\n }\n }\n }\n const gotOne = (rule.or && oneMatch) || allMatches;\n const success = gotOne || maybe === true;\n const numMatches = gotOne ? 1 : 0;\n if (maybe && !gotOne)\n this.pos = pos;\n if (success) {\n this.matchSuccess();\n }\n else {\n this.matchFail(pos);\n }\n return { success, results, numMatches };\n }\n // Try to match multiple (one or more) instances of the rule. If `maybe` is set,\n // then a failed match is also a success (but the position is reset).\n expectOneOrMore(rule, maybe = false) {\n const results = [];\n const pos = this.pos;\n let numMatches = 0;\n let more = true;\n do {\n const result = this.expectOne(rule);\n if (result.success && result.results) {\n numMatches++;\n results.push(result.results);\n }\n else {\n more = false;\n }\n } while (more);\n const success = numMatches > 0 || maybe === true;\n if (maybe && !(numMatches > 0))\n this.pos = pos;\n if (success) {\n this.matchSuccess();\n }\n else {\n this.matchFail(pos);\n }\n return { success, results, numMatches };\n }\n // Match zero or more instances of `rule`. Offloads to `expectOneOrMore`.\n expectZeroOrMore(rule) {\n return this.expectOneOrMore(rule, true);\n }\n // Execute the rule produced by the provided `rules` function. This\n // offloads to one of the above matchers and consolidates the results. It is also\n // responsible for executing any code triggered by the rule (in `rule.run`.)\n expect(ruleFunc) {\n L('Evaluating rule function:', ruleFunc);\n if (!ruleFunc) {\n throw new RuntimeError('Invalid rule function');\n }\n let result;\n // Get rule from Grammar class.\n // expect(...) handles both lexing & parsing:\n // - lexer rules produce tokens.\n // - parser rules produce expressions which may trigger code via the\n // { run: () => ... } trigger functions in easyscore.ts.\n // These functions build the VexFlow objects that are displayed on screen.\n const rule = ruleFunc.bind(this.grammar)();\n if (rule.token) {\n // A lexer rule has a `token` property.\n // Base case: parse the regex and throw an error if the\n // line doesn't match.\n result = this.matchToken(rule.token, rule.noSpace === true);\n if (result.success) {\n // Token match! Update position and throw away parsed portion\n // of string.\n this.pos += result.incrementPos;\n }\n }\n else if (rule.expect) {\n // A parser rule has an `expect` property.\n if (rule.oneOrMore) {\n result = this.expectOneOrMore(rule);\n }\n else if (rule.zeroOrMore) {\n result = this.expectZeroOrMore(rule);\n }\n else {\n result = this.expectOne(rule);\n }\n }\n else {\n L(rule);\n throw new RuntimeError('Bad grammar! No `token` or `expect` property ' + rule);\n }\n // If there's a trigger attached to this rule, then run it.\n // Make the matches accessible through `state.matches` in the\n // `run: (state) => ...` trigger.\n const matches = [];\n result.matches = matches;\n if (result.results) {\n result.results.forEach((r) => matches.push(flattenMatches(r)));\n }\n if (rule.run && result.success) {\n rule.run({ matches });\n }\n return result;\n }\n}\nParser.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (PedalMarking.DEBUG)\n log('Vex.Flow.PedalMarking', args);\n}\n/**\n * Draws a pedal glyph with the provided `name` on a rendering `context`\n * at the coordinates `x` and `y. Takes into account the glyph data\n * coordinate shifts.\n */\nfunction drawPedalGlyph(name, context, x, y, point) {\n const glyph_data = PedalMarking.GLYPHS[name];\n const glyph = new Glyph(glyph_data.code, point, { category: 'pedalMarking' });\n glyph.render(context, x + glyph_data.x_shift, y + glyph_data.y_shift);\n}\n/**\n * PedalMarking implements different types of pedal markings. These notation\n * elements indicate to the performer when to depress and release the a pedal.\n *\n * In order to create \"Sostenuto\", and \"una corda\" markings, you must set\n * custom text for the release/depress pedal markings.\n */\nexport class PedalMarking extends Element {\n constructor(notes) {\n super();\n this.notes = notes;\n this.type = PedalMarking.type.TEXT;\n this.line = 0;\n // Custom text for the release/depress markings\n this.custom_depress_text = '';\n this.custom_release_text = '';\n this.resetFont();\n this.render_options = {\n bracket_height: 10,\n text_margin_right: 6,\n bracket_line_width: 1,\n color: 'black',\n };\n }\n static get CATEGORY() {\n return Category.PedalMarking;\n }\n /**\n * Create a sustain pedal marking. Returns the defaults PedalMarking.\n * Which uses the traditional \"Ped\" and \"*\"\" markings.\n */\n static createSustain(notes) {\n const pedal = new PedalMarking(notes);\n return pedal;\n }\n /** Create a sostenuto pedal marking */\n static createSostenuto(notes) {\n const pedal = new PedalMarking(notes);\n pedal.setType(PedalMarking.type.MIXED);\n pedal.setCustomText('Sost. Ped.');\n return pedal;\n }\n /** Create an una corda pedal marking */\n static createUnaCorda(notes) {\n const pedal = new PedalMarking(notes);\n pedal.setType(PedalMarking.type.TEXT);\n pedal.setCustomText('una corda', 'tre corda');\n return pedal;\n }\n /** Set pedal type. */\n setType(type) {\n type = typeof type === 'string' ? PedalMarking.typeString[type] : type;\n if (type >= PedalMarking.type.TEXT && type <= PedalMarking.type.MIXED) {\n this.type = type;\n }\n return this;\n }\n /**\n * Set custom text for the `depress`/`release` pedal markings. No text is\n * set if the parameter is falsy.\n */\n setCustomText(depress, release) {\n this.custom_depress_text = depress || '';\n this.custom_release_text = release || '';\n return this;\n }\n /** Set the staff line to render the markings on. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Draw the bracket based pedal markings. */\n drawBracketed() {\n const ctx = this.checkContext();\n let is_pedal_depressed = false;\n let prev_x;\n let prev_y;\n // Iterate through each note\n this.notes.forEach((note, index, notes) => {\n // Each note triggers the opposite pedal action\n is_pedal_depressed = !is_pedal_depressed;\n // Get the initial coordinates for the note\n const x = note.getAbsoluteX();\n const y = note.checkStave().getYForBottomText(this.line + 3);\n // Throw if current note is positioned before the previous note\n if (x < prev_x) {\n throw new RuntimeError('InvalidConfiguration', 'The notes provided must be in order of ascending x positions');\n }\n // Determine if the previous or next note are the same\n // as the current note. We need to keep track of this for\n // when adjustments are made for the release+depress action\n const next_is_same = notes[index + 1] === note;\n const prev_is_same = notes[index - 1] === note;\n let x_shift = 0;\n const point = Tables.currentMusicFont().lookupMetric(`pedalMarking.${is_pedal_depressed ? 'down' : 'up'}.point`);\n if (is_pedal_depressed) {\n // Adjustment for release+depress\n x_shift = prev_is_same ? 5 : 0;\n if (this.type === PedalMarking.type.MIXED && !prev_is_same) {\n // For MIXED style, start with text instead of bracket\n if (this.custom_depress_text) {\n // If we have custom text, use instead of the default \"Ped\" glyph\n const text_width = ctx.measureText(this.custom_depress_text).width;\n ctx.fillText(this.custom_depress_text, x - text_width / 2, y);\n x_shift = text_width / 2 + this.render_options.text_margin_right;\n }\n else {\n // Render the Ped glyph in position\n drawPedalGlyph('pedal_depress', ctx, x, y, point);\n x_shift = 20 + this.render_options.text_margin_right;\n }\n }\n else {\n // Draw start bracket\n ctx.beginPath();\n ctx.moveTo(x, y - this.render_options.bracket_height);\n ctx.lineTo(x + x_shift, y);\n ctx.stroke();\n ctx.closePath();\n }\n }\n else {\n // Adjustment for release+depress\n x_shift = next_is_same ? -5 : 0;\n // Draw end bracket\n ctx.beginPath();\n ctx.moveTo(prev_x, prev_y);\n ctx.lineTo(x + x_shift, y);\n ctx.lineTo(x, y - this.render_options.bracket_height);\n ctx.stroke();\n ctx.closePath();\n }\n // Store previous coordinates\n prev_x = x + x_shift;\n prev_y = y;\n });\n }\n /**\n * Draw the text based pedal markings. This defaults to the traditional\n * \"Ped\" and \"*\"\" symbols if no custom text has been provided.\n */\n drawText() {\n const ctx = this.checkContext();\n let is_pedal_depressed = false;\n // Iterate through each note, placing glyphs or custom text accordingly\n this.notes.forEach((note) => {\n is_pedal_depressed = !is_pedal_depressed;\n const stave = note.checkStave();\n const x = note.getAbsoluteX();\n const y = stave.getYForBottomText(this.line + 3);\n const point = Tables.currentMusicFont().lookupMetric(`pedalMarking.${is_pedal_depressed ? 'down' : 'up'}.point`);\n let text_width = 0;\n if (is_pedal_depressed) {\n if (this.custom_depress_text) {\n text_width = ctx.measureText(this.custom_depress_text).width;\n ctx.fillText(this.custom_depress_text, x - text_width / 2, y);\n }\n else {\n drawPedalGlyph('pedal_depress', ctx, x, y, point);\n }\n }\n else {\n if (this.custom_release_text) {\n text_width = ctx.measureText(this.custom_release_text).width;\n ctx.fillText(this.custom_release_text, x - text_width / 2, y);\n }\n else {\n drawPedalGlyph('pedal_release', ctx, x, y, point);\n }\n }\n });\n }\n /** Render the pedal marking in position on the rendering context. */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n ctx.save();\n ctx.setStrokeStyle(this.render_options.color);\n ctx.setFillStyle(this.render_options.color);\n ctx.setFont(this.textFont);\n L('Rendering Pedal Marking');\n if (this.type === PedalMarking.type.BRACKET || this.type === PedalMarking.type.MIXED) {\n ctx.setLineWidth(this.render_options.bracket_line_width);\n this.drawBracketed();\n }\n else if (this.type === PedalMarking.type.TEXT) {\n this.drawText();\n }\n ctx.restore();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.PedalMarking.DEBUG` to `true`. */\nPedalMarking.DEBUG = false;\nPedalMarking.TEXT_FONT = {\n family: Font.SERIF,\n size: 12,\n weight: FontWeight.BOLD,\n style: FontStyle.ITALIC,\n};\n/** Glyph data */\nPedalMarking.GLYPHS = {\n pedal_depress: {\n code: 'keyboardPedalPed',\n x_shift: -10,\n y_shift: 0,\n },\n pedal_release: {\n code: 'keyboardPedalUp',\n x_shift: -2,\n y_shift: 3,\n },\n};\n/** Pedal type as number. */\nPedalMarking.type = {\n TEXT: 1,\n BRACKET: 2,\n MIXED: 3,\n};\n/** Pedal type as string. */\nPedalMarking.typeString = {\n text: PedalMarking.type.TEXT,\n bracket: PedalMarking.type.BRACKET,\n mixed: PedalMarking.type.MIXED,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Mohit Cheppudira\n//\n// ## Description\n//\n// This file implements a registry for VexFlow elements. It allows users\n// to track, query, and manage some subset of generated elements, and\n// dynamically get and set attributes.\n//\n// There are two ways to register with a registry:\n//\n// 1) Explicitly call `registry.register(elem:Element, id?:string)`, or,\n// 2) Call `Registry.enableDefaultRegistry(registry)` when ready, and all future\n// elements will automatically register with it.\n//\n// Once an element is registered, selected attributes are tracked and indexed by\n// the registry. This allows fast look up of elements by attributes like id, type,\n// and class.\nimport { RuntimeError } from './util';\n// Indexes are represented as maps of maps of maps. This allows\n// for both multi-labeling (e.g., an element can have multiple classes)\n// and efficient lookup.\nclass Index {\n constructor() {\n this.id = {};\n this.type = {};\n this.class = {};\n }\n}\nexport class Registry {\n constructor() {\n this.index = new Index();\n }\n static getDefaultRegistry() {\n return Registry.defaultRegistry;\n }\n // If you call `enableDefaultRegistry`, any new elements will auto-register with\n // the provided registry as soon as they're constructed.\n static enableDefaultRegistry(registry) {\n Registry.defaultRegistry = registry;\n }\n static disableDefaultRegistry() {\n Registry.defaultRegistry = undefined;\n }\n clear() {\n this.index = new Index();\n return this;\n }\n setIndexValue(name, value, id, elem) {\n const index = this.index;\n if (!index[name][value]) {\n index[name][value] = {};\n }\n index[name][value][id] = elem;\n }\n // Updates the indexes for element 'id'. If an element's attribute changes\n // from A -> B, make sure to remove the element from A.\n updateIndex({ id, name, value, oldValue }) {\n const elem = this.getElementById(id);\n if (oldValue !== undefined && this.index[name][oldValue]) {\n delete this.index[name][oldValue][id];\n }\n if (value && elem) {\n this.setIndexValue(name, value, elem.getAttribute('id'), elem);\n }\n }\n /**\n * Register element `elem` with this registry.\n * This adds the element to its index and watches it for attribute changes.\n * @param elem\n * @param id\n * @returns this\n */\n register(elem, id) {\n id = id || elem.getAttribute('id');\n if (!id) {\n throw new RuntimeError(\"Can't add element without `id` attribute to registry\");\n }\n // Manually add id to index, then update other indexes.\n elem.setAttribute('id', id);\n this.setIndexValue('id', id, id, elem);\n this.updateIndex({ id, name: 'type', value: elem.getAttribute('type'), oldValue: undefined });\n elem.onRegister(this);\n return this;\n }\n getElementById(id) {\n var _a, _b;\n return (_b = (_a = this.index.id) === null || _a === void 0 ? void 0 : _a[id]) === null || _b === void 0 ? void 0 : _b[id]; // return undefined if the id is not found.\n }\n getElementsByAttribute(attribute, value) {\n const index_attr = this.index[attribute];\n if (index_attr) {\n const index_attr_val = index_attr[value];\n if (index_attr_val) {\n const keys = Object.keys(index_attr_val);\n return keys.map((k) => index_attr_val[k]);\n }\n }\n return [];\n }\n getElementsByType(type) {\n return this.getElementsByAttribute('type', type);\n }\n getElementsByClass(className) {\n return this.getElementsByAttribute('class', className);\n }\n // This is called by the element when an attribute value changes. If an indexed\n // attribute changes, then update the local index.\n onUpdate(info) {\n const allowedNames = ['id', 'type', 'class'];\n if (allowedNames.includes(info.name)) {\n this.updateIndex(info);\n }\n return this;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2021.\n// MIT License\nimport { Category } from './typeguard';\nexport class RenderContext {\n static get CATEGORY() {\n return Category.RenderContext;\n }\n set font(f) {\n this.setFont(f);\n }\n get font() {\n return this.getFont();\n }\n /**\n * This is kept for backwards compatibility with 3.0.9.\n * @deprecated use `setFont(...)` instead since it now supports CSS font shorthand.\n */\n setRawFont(f) {\n this.setFont(f);\n return this;\n }\n}\n/**\n * Draw a tiny dot marker on the specified context. A great debugging aid.\n * @param ctx context\n * @param x dot x coordinate\n * @param y dot y coordinate\n * @param color\n */\nexport function drawDot(ctx, x, y, color = '#F55') {\n ctx.save();\n ctx.setFillStyle(color);\n // draw a circle\n ctx.beginPath();\n ctx.arc(x, y, 3, 0, Math.PI * 2, true);\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { CanvasContext } from './canvascontext';\nimport { SVGContext } from './svgcontext';\nimport { isRenderContext } from './typeguard';\nimport { RuntimeError } from './util';\nimport { isHTMLCanvas, isHTMLDiv } from './web';\nexport var RendererBackends;\n(function (RendererBackends) {\n RendererBackends[RendererBackends[\"CANVAS\"] = 1] = \"CANVAS\";\n RendererBackends[RendererBackends[\"SVG\"] = 2] = \"SVG\";\n})(RendererBackends || (RendererBackends = {}));\n// End of line types\nexport var RendererLineEndType;\n(function (RendererLineEndType) {\n RendererLineEndType[RendererLineEndType[\"NONE\"] = 1] = \"NONE\";\n RendererLineEndType[RendererLineEndType[\"UP\"] = 2] = \"UP\";\n RendererLineEndType[RendererLineEndType[\"DOWN\"] = 3] = \"DOWN\";\n})(RendererLineEndType || (RendererLineEndType = {}));\n/**\n * Support Canvas & SVG rendering contexts.\n */\nexport class Renderer {\n constructor(arg0, arg1) {\n if (isRenderContext(arg0)) {\n // The user has provided what looks like a RenderContext, let's just use it.\n this.ctx = arg0;\n }\n else {\n if (arg1 === undefined) {\n // The backend must be specified if the render context isn't directly provided.\n throw new RuntimeError('InvalidArgument', 'Missing backend argument');\n }\n const backend = arg1;\n let element;\n if (typeof arg0 == 'string') {\n const maybeElement = document.getElementById(arg0);\n if (!maybeElement) {\n throw new RuntimeError('BadElementId', `Can't find element with ID \"${maybeElement}\"`);\n }\n element = maybeElement;\n }\n else {\n element = arg0;\n }\n // Verify backend and create context\n if (backend === Renderer.Backends.CANVAS) {\n if (!isHTMLCanvas(element)) {\n throw new RuntimeError('BadElement', 'CANVAS context requires an HTMLCanvasElement.');\n }\n const context = element.getContext('2d');\n if (!context) {\n throw new RuntimeError('BadElement', \"Can't get canvas context\");\n }\n this.ctx = new CanvasContext(context);\n }\n else if (backend === Renderer.Backends.SVG) {\n if (!isHTMLDiv(element)) {\n throw new RuntimeError('BadElement', 'SVG context requires an HTMLDivElement.');\n }\n this.ctx = new SVGContext(element);\n }\n else {\n throw new RuntimeError('InvalidBackend', `No support for backend: ${backend}`);\n }\n }\n }\n static buildContext(elementId, backend, width, height, background = '#FFF') {\n const renderer = new Renderer(elementId, backend);\n if (width && height) {\n renderer.resize(width, height);\n }\n const ctx = renderer.getContext();\n ctx.setBackgroundFillStyle(background);\n Renderer.lastContext = ctx;\n return ctx;\n }\n static getCanvasContext(elementId, width, height, background) {\n return Renderer.buildContext(elementId, Renderer.Backends.CANVAS, width, height, background);\n }\n static getSVGContext(elementId, width, height, background) {\n return Renderer.buildContext(elementId, Renderer.Backends.SVG, width, height, background);\n }\n // Draw a dashed line (horizontal, vertical or diagonal\n // dashPattern = [3,3] draws a 3 pixel dash followed by a three pixel space.\n // setting the second number to 0 draws a solid line.\n static drawDashedLine(context, fromX, fromY, toX, toY, dashPattern) {\n context.beginPath();\n const dx = toX - fromX;\n const dy = toY - fromY;\n const angle = Math.atan2(dy, dx);\n let x = fromX;\n let y = fromY;\n context.moveTo(fromX, fromY);\n let idx = 0;\n let draw = true;\n while (!((dx < 0 ? x <= toX : x >= toX) && (dy < 0 ? y <= toY : y >= toY))) {\n const dashLength = dashPattern[idx++ % dashPattern.length];\n const nx = x + Math.cos(angle) * dashLength;\n x = dx < 0 ? Math.max(toX, nx) : Math.min(toX, nx);\n const ny = y + Math.sin(angle) * dashLength;\n y = dy < 0 ? Math.max(toY, ny) : Math.min(toY, ny);\n if (draw) {\n context.lineTo(x, y);\n }\n else {\n context.moveTo(x, y);\n }\n draw = !draw;\n }\n context.closePath();\n context.stroke();\n }\n resize(width, height) {\n this.ctx.resize(width, height);\n return this;\n }\n getContext() {\n return this.ctx;\n }\n}\nRenderer.Backends = RendererBackends;\nRenderer.LineEndType = RendererLineEndType;\n// Used by vexflow_test_helpers.ts\n// Should this be private?\n// Can we do this in a cleaner way?\nRenderer.lastContext = undefined;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { Glyph } from './glyph';\nimport { GlyphNote } from './glyphnote';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\n// Map `type` to SMuFL glyph code.\nconst CODES = {\n '1': 'repeat1Bar',\n '2': 'repeat2Bars',\n '4': 'repeat4Bars',\n slash: 'repeatBarSlash',\n};\nexport class RepeatNote extends GlyphNote {\n static get CATEGORY() {\n return Category.RepeatNote;\n }\n constructor(type, noteStruct, options) {\n super(undefined, Object.assign({ duration: 'q', align_center: type !== 'slash' }, noteStruct), options);\n const glyphCode = CODES[type] || 'repeat1Bar';\n const glyph = new Glyph(glyphCode, Tables.currentMusicFont().lookupMetric('repeatNote.point', 40), {\n category: 'repeatNote',\n });\n this.setGlyph(glyph);\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { BoundingBox } from './boundingbox';\nimport { Clef } from './clef';\nimport { Element } from './element';\nimport { Font, FontStyle, FontWeight } from './font';\nimport { KeySignature } from './keysignature';\nimport { Barline, BarlineType } from './stavebarline';\nimport { StaveModifierPosition } from './stavemodifier';\nimport { Repetition } from './staverepetition';\nimport { StaveSection } from './stavesection';\nimport { StaveTempo } from './stavetempo';\nimport { StaveText } from './stavetext';\nimport { Volta } from './stavevolta';\nimport { Tables } from './tables';\nimport { TimeSignature } from './timesignature';\nimport { Category, isBarline } from './typeguard';\nimport { RuntimeError } from './util';\n// Used by Stave.format() to sort the modifiers at the beginning and end of a stave.\n// The keys (computed property names) match the CATEGORY property in the\n// Barline, Clef, KeySignature, TimeSignature classes.\nconst SORT_ORDER_BEG_MODIFIERS = {\n [Barline.CATEGORY]: 0,\n [Clef.CATEGORY]: 1,\n [KeySignature.CATEGORY]: 2,\n [TimeSignature.CATEGORY]: 3,\n};\nconst SORT_ORDER_END_MODIFIERS = {\n [TimeSignature.CATEGORY]: 0,\n [KeySignature.CATEGORY]: 1,\n [Barline.CATEGORY]: 2,\n [Clef.CATEGORY]: 3,\n};\nexport class Stave extends Element {\n constructor(x, y, width, options) {\n super();\n // Initialized by the constructor via this.resetLines().\n this.height = 0;\n this.x = x;\n this.y = y;\n this.width = width;\n this.formatted = false;\n this.start_x = x + 5;\n this.end_x = x + width;\n this.modifiers = []; // stave modifiers (clef, key, time, barlines, coda, segno, etc.)\n this.measure = 0;\n this.clef = 'treble';\n this.endClef = undefined;\n this.resetFont();\n this.options = Object.assign({ vertical_bar_width: 10, num_lines: 5, fill_style: '#999999', left_bar: true, right_bar: true, spacing_between_lines_px: Tables.STAVE_LINE_DISTANCE, space_above_staff_ln: 4, space_below_staff_ln: 4, top_text_position: 1, bottom_text_position: 4, line_config: [] }, options);\n this.bounds = { x: this.x, y: this.y, w: this.width, h: 0 };\n this.defaultLedgerLineStyle = { strokeStyle: '#444', lineWidth: 1.4 };\n this.resetLines();\n // beg bar\n this.addModifier(new Barline(this.options.left_bar ? BarlineType.SINGLE : BarlineType.NONE));\n // end bar\n this.addEndModifier(new Barline(this.options.right_bar ? BarlineType.SINGLE : BarlineType.NONE));\n }\n static get CATEGORY() {\n return Category.Stave;\n }\n // This is the sum of the padding that normally goes on left + right of a stave during\n // drawing. Used to size staves correctly with content width.\n static get defaultPadding() {\n const musicFont = Tables.currentMusicFont();\n return musicFont.lookupMetric('stave.padding') + musicFont.lookupMetric('stave.endPaddingMax');\n }\n // Right padding, used by system if startX is already determined.\n static get rightPadding() {\n const musicFont = Tables.currentMusicFont();\n return musicFont.lookupMetric('stave.endPaddingMax');\n }\n /** Set default style for ledger lines. */\n setDefaultLedgerLineStyle(style) {\n this.defaultLedgerLineStyle = style;\n }\n /** Get default style for ledger lines. */\n getDefaultLedgerLineStyle() {\n return Object.assign(Object.assign({}, this.getStyle()), this.defaultLedgerLineStyle);\n }\n space(spacing) {\n return this.options.spacing_between_lines_px * spacing;\n }\n resetLines() {\n this.options.line_config = [];\n for (let i = 0; i < this.options.num_lines; i++) {\n this.options.line_config.push({ visible: true });\n }\n this.height = (this.options.num_lines + this.options.space_above_staff_ln) * this.options.spacing_between_lines_px;\n this.options.bottom_text_position = this.options.num_lines;\n }\n setNoteStartX(x) {\n if (!this.formatted)\n this.format();\n this.start_x = x;\n const begBarline = this.modifiers[0];\n begBarline.setX(this.start_x - begBarline.getWidth());\n return this;\n }\n getNoteStartX() {\n if (!this.formatted)\n this.format();\n return this.start_x;\n }\n getNoteEndX() {\n if (!this.formatted)\n this.format();\n return this.end_x;\n }\n getTieStartX() {\n return this.start_x;\n }\n getTieEndX() {\n return this.end_x;\n }\n getX() {\n return this.x;\n }\n getNumLines() {\n return this.options.num_lines;\n }\n setNumLines(n) {\n this.options.num_lines = n;\n this.resetLines();\n return this;\n }\n setY(y) {\n this.y = y;\n return this;\n }\n getY() {\n return this.y;\n }\n getTopLineTopY() {\n return this.getYForLine(0) - Tables.STAVE_LINE_THICKNESS / 2;\n }\n getBottomLineBottomY() {\n return this.getYForLine(this.getNumLines() - 1) + Tables.STAVE_LINE_THICKNESS / 2;\n }\n setX(x) {\n const shift = x - this.x;\n this.formatted = false;\n this.x = x;\n this.start_x += shift;\n this.end_x += shift;\n for (let i = 0; i < this.modifiers.length; i++) {\n const mod = this.modifiers[i];\n mod.setX(mod.getX() + shift);\n }\n return this;\n }\n setWidth(width) {\n this.formatted = false;\n this.width = width;\n this.end_x = this.x + width;\n // reset the x position of the end barline (TODO(0xfe): This makes no sense)\n // this.modifiers[1].setX(this.end_x);\n return this;\n }\n getWidth() {\n return this.width;\n }\n getStyle() {\n return Object.assign({ fillStyle: this.options.fill_style, strokeStyle: this.options.fill_style, lineWidth: Tables.STAVE_LINE_THICKNESS }, this.style);\n }\n setMeasure(measure) {\n this.measure = measure;\n return this;\n }\n /**\n * Gets the pixels to shift from the beginning of the stave\n * following the modifier at the provided index\n * @param {Number} index The index from which to determine the shift\n * @return {Number} The amount of pixels shifted\n */\n getModifierXShift(index = 0) {\n if (typeof index !== 'number') {\n throw new RuntimeError('InvalidIndex', 'Must be of number type');\n }\n if (!this.formatted)\n this.format();\n if (this.getModifiers(StaveModifierPosition.BEGIN).length === 1) {\n return 0;\n }\n // for right position modifiers zero shift seems correct, see 'Volta + Modifier Measure Test'\n if (this.modifiers[index].getPosition() === StaveModifierPosition.RIGHT) {\n return 0;\n }\n let start_x = this.start_x - this.x;\n const begBarline = this.modifiers[0];\n if (begBarline.getType() === BarlineType.REPEAT_BEGIN && start_x > begBarline.getWidth()) {\n start_x -= begBarline.getWidth();\n }\n return start_x;\n }\n /** Coda & Segno Symbol functions */\n setRepetitionType(type, yShift = 0) {\n this.modifiers.push(new Repetition(type, this.x, yShift));\n return this;\n }\n // Volta functions\n setVoltaType(type, number_t, y) {\n this.modifiers.push(new Volta(type, number_t, this.x, y));\n return this;\n }\n // Section functions\n setSection(section, y, xOffset = 0, fontSize) {\n const staveSection = new StaveSection(section, this.x + xOffset, y);\n if (fontSize)\n staveSection.setFontSize(fontSize);\n this.modifiers.push(staveSection);\n return this;\n }\n // Tempo functions\n setTempo(tempo, y) {\n this.modifiers.push(new StaveTempo(tempo, this.x, y));\n return this;\n }\n // Text functions\n setText(text, position, options = {}) {\n this.modifiers.push(new StaveText(text, position, options));\n return this;\n }\n getHeight() {\n return this.height;\n }\n getSpacingBetweenLines() {\n return this.options.spacing_between_lines_px;\n }\n getBoundingBox() {\n return new BoundingBox(this.x, this.y, this.width, this.getBottomY() - this.y);\n }\n getBottomY() {\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const score_bottom = this.getYForLine(options.num_lines) + options.space_below_staff_ln * spacing;\n return score_bottom;\n }\n getBottomLineY() {\n return this.getYForLine(this.options.num_lines);\n }\n // This returns\n /** @returns the y for the *center* of a staff line */\n getYForLine(line) {\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const headroom = options.space_above_staff_ln;\n const y = this.y + line * spacing + headroom * spacing;\n return y;\n }\n getLineForY(y) {\n // Does the reverse of getYForLine - somewhat dumb and just calls\n // getYForLine until the right value is reaches\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const headroom = options.space_above_staff_ln;\n return (y - this.y) / spacing - headroom;\n }\n getYForTopText(line = 0) {\n return this.getYForLine(-line - this.options.top_text_position);\n }\n getYForBottomText(line = 0) {\n return this.getYForLine(this.options.bottom_text_position + line);\n }\n getYForNote(line) {\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const headroom = options.space_above_staff_ln;\n return this.y + headroom * spacing + 5 * spacing - line * spacing;\n }\n getYForGlyphs() {\n return this.getYForLine(3);\n }\n // This method adds a stave modifier to the stave. Note that the first two\n // modifiers (BarLines) are automatically added upon construction.\n addModifier(modifier, position) {\n if (position !== undefined) {\n modifier.setPosition(position);\n }\n modifier.setStave(this);\n this.formatted = false;\n this.modifiers.push(modifier);\n return this;\n }\n addEndModifier(modifier) {\n this.addModifier(modifier, StaveModifierPosition.END);\n return this;\n }\n // Bar Line functions\n setBegBarType(type) {\n // Only valid bar types at beginning of stave is none, single or begin repeat\n const { SINGLE, REPEAT_BEGIN, NONE } = BarlineType;\n if (type === SINGLE || type === REPEAT_BEGIN || type === NONE) {\n this.modifiers[0].setType(type);\n this.formatted = false;\n }\n return this;\n }\n setEndBarType(type) {\n // Repeat end not valid at end of stave\n if (type !== BarlineType.REPEAT_BEGIN) {\n this.modifiers[1].setType(type);\n this.formatted = false;\n }\n return this;\n }\n setClef(clefSpec, size, annotation, position) {\n if (position === undefined) {\n position = StaveModifierPosition.BEGIN;\n }\n if (position === StaveModifierPosition.END) {\n this.endClef = clefSpec;\n }\n else {\n this.clef = clefSpec;\n }\n const clefs = this.getModifiers(position, Clef.CATEGORY);\n if (clefs.length === 0) {\n this.addClef(clefSpec, size, annotation, position);\n }\n else {\n clefs[0].setType(clefSpec, size, annotation);\n }\n return this;\n }\n getClef() {\n return this.clef;\n }\n setEndClef(clefSpec, size, annotation) {\n this.setClef(clefSpec, size, annotation, StaveModifierPosition.END);\n return this;\n }\n getEndClef() {\n return this.endClef;\n }\n setKeySignature(keySpec, cancelKeySpec, position) {\n if (position === undefined) {\n position = StaveModifierPosition.BEGIN;\n }\n const keySignatures = this.getModifiers(position, KeySignature.CATEGORY);\n if (keySignatures.length === 0) {\n this.addKeySignature(keySpec, cancelKeySpec, position);\n }\n else {\n keySignatures[0].setKeySig(keySpec, cancelKeySpec);\n }\n return this;\n }\n setEndKeySignature(keySpec, cancelKeySpec) {\n this.setKeySignature(keySpec, cancelKeySpec, StaveModifierPosition.END);\n return this;\n }\n setTimeSignature(timeSpec, customPadding, position) {\n if (position === undefined) {\n position = StaveModifierPosition.BEGIN;\n }\n const timeSignatures = this.getModifiers(position, TimeSignature.CATEGORY);\n if (timeSignatures.length === 0) {\n this.addTimeSignature(timeSpec, customPadding, position);\n }\n else {\n timeSignatures[0].setTimeSig(timeSpec);\n }\n return this;\n }\n setEndTimeSignature(timeSpec, customPadding) {\n this.setTimeSignature(timeSpec, customPadding, StaveModifierPosition.END);\n return this;\n }\n /**\n * Add a key signature to the stave.\n *\n * Example:\n * `stave.addKeySignature('Db');`\n * @param keySpec new key specification `[A-G][b|#]?`\n * @param cancelKeySpec\n * @param position\n * @returns\n */\n addKeySignature(keySpec, cancelKeySpec, position) {\n if (position === undefined) {\n position = StaveModifierPosition.BEGIN;\n }\n this.addModifier(new KeySignature(keySpec, cancelKeySpec).setPosition(position), position);\n return this;\n }\n /**\n * Add a clef to the stave.\n *\n * Example:\n *\n * stave.addClef('treble')\n * @param clef clef (treble|bass|...) see {@link Clef.types}\n * @param size\n * @param annotation\n * @param position\n * @returns\n */\n addClef(clef, size, annotation, position) {\n if (position === undefined || position === StaveModifierPosition.BEGIN) {\n this.clef = clef;\n }\n else if (position === StaveModifierPosition.END) {\n this.endClef = clef;\n }\n this.addModifier(new Clef(clef, size, annotation), position);\n return this;\n }\n addEndClef(clef, size, annotation) {\n this.addClef(clef, size, annotation, StaveModifierPosition.END);\n return this;\n }\n /**\n * Add a time signature to the stave\n *\n * Example:\n *\n * `stave.addTimeSignature('4/4');`\n * @param timeSpec time signature specification `(C\\||C|\\d\\/\\d)`\n * @param customPadding\n * @param position\n * @returns\n */\n addTimeSignature(timeSpec, customPadding, position) {\n this.addModifier(new TimeSignature(timeSpec, customPadding), position);\n return this;\n }\n addEndTimeSignature(timeSpec, customPadding) {\n this.addTimeSignature(timeSpec, customPadding, StaveModifierPosition.END);\n return this;\n }\n // Deprecated\n addTrebleGlyph() {\n this.addClef('treble');\n return this;\n }\n /**\n * @param position\n * @param category\n * @returns array of StaveModifiers that match the provided position and category.\n */\n getModifiers(position, category) {\n const noPosition = position === undefined;\n const noCategory = category === undefined;\n if (noPosition && noCategory) {\n return this.modifiers;\n }\n else if (noPosition) {\n // A category was provided.\n return this.modifiers.filter((m) => category === m.getCategory());\n }\n else if (noCategory) {\n // A position was provided.\n return this.modifiers.filter((m) => position === m.getPosition());\n }\n else {\n // Both position and category were provided!\n return this.modifiers.filter((m) => position === m.getPosition() && category === m.getCategory());\n }\n }\n /**\n * Use the modifier's `getCategory()` as a key for the `order` array.\n * The retrieved value is used to sort modifiers from left to right (0 to to 3).\n */\n sortByCategory(items, order) {\n for (let i = items.length - 1; i >= 0; i--) {\n for (let j = 0; j < i; j++) {\n if (order[items[j].getCategory()] > order[items[j + 1].getCategory()]) {\n const temp = items[j];\n items[j] = items[j + 1];\n items[j + 1] = temp;\n }\n }\n }\n }\n format() {\n const begBarline = this.modifiers[0];\n const endBarline = this.modifiers[1];\n const begModifiers = this.getModifiers(StaveModifierPosition.BEGIN);\n const endModifiers = this.getModifiers(StaveModifierPosition.END);\n this.sortByCategory(begModifiers, SORT_ORDER_BEG_MODIFIERS);\n this.sortByCategory(endModifiers, SORT_ORDER_END_MODIFIERS);\n if (begModifiers.length > 1 && begBarline.getType() === BarlineType.REPEAT_BEGIN) {\n begModifiers.push(begModifiers.splice(0, 1)[0]);\n begModifiers.splice(0, 0, new Barline(BarlineType.SINGLE));\n }\n if (endModifiers.indexOf(endBarline) > 0) {\n endModifiers.splice(0, 0, new Barline(BarlineType.NONE));\n }\n let width;\n let padding;\n let modifier;\n let offset = 0;\n let x = this.x;\n for (let i = 0; i < begModifiers.length; i++) {\n modifier = begModifiers[i];\n padding = modifier.getPadding(i + offset);\n width = modifier.getWidth();\n x += padding;\n modifier.setX(x);\n x += width;\n if (padding + width === 0)\n offset--;\n }\n this.start_x = x;\n x = this.x + this.width;\n const widths = {\n left: 0,\n right: 0,\n paddingRight: 0,\n paddingLeft: 0,\n };\n let lastBarlineIdx = 0;\n for (let i = 0; i < endModifiers.length; i++) {\n modifier = endModifiers[i];\n lastBarlineIdx = isBarline(modifier) ? i : lastBarlineIdx;\n widths.right = 0;\n widths.left = 0;\n widths.paddingRight = 0;\n widths.paddingLeft = 0;\n const layoutMetrics = modifier.getLayoutMetrics();\n if (layoutMetrics) {\n if (i !== 0) {\n widths.right = layoutMetrics.xMax || 0;\n widths.paddingRight = layoutMetrics.paddingRight || 0;\n }\n widths.left = -layoutMetrics.xMin || 0;\n widths.paddingLeft = layoutMetrics.paddingLeft || 0;\n if (i === endModifiers.length - 1) {\n widths.paddingLeft = 0;\n }\n }\n else {\n widths.paddingRight = modifier.getPadding(i - lastBarlineIdx);\n if (i !== 0) {\n widths.right = modifier.getWidth();\n }\n if (i === 0) {\n widths.left = modifier.getWidth();\n }\n }\n x -= widths.paddingRight;\n x -= widths.right;\n modifier.setX(x);\n x -= widths.left;\n x -= widths.paddingLeft;\n }\n this.end_x = endModifiers.length === 1 ? this.x + this.width : x;\n this.formatted = true;\n }\n /**\n * All drawing functions below need the context to be set.\n */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n ctx.openGroup('stave', this.getAttribute('id'));\n if (!this.formatted)\n this.format();\n const num_lines = this.options.num_lines;\n const width = this.width;\n const x = this.x;\n let y;\n // Render lines\n for (let line = 0; line < num_lines; line++) {\n y = this.getYForLine(line);\n this.applyStyle();\n if (this.options.line_config[line].visible) {\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(x + width, y);\n ctx.stroke();\n }\n this.restoreStyle();\n }\n // Draw the modifiers (bar lines, coda, segno, repeat brackets, etc.)\n for (let i = 0; i < this.modifiers.length; i++) {\n const modifier = this.modifiers[i];\n // Only draw modifier if it has a draw function\n if (typeof modifier.draw === 'function') {\n modifier.applyStyle(ctx);\n modifier.draw(this, this.getModifierXShift(i));\n modifier.restoreStyle(ctx);\n }\n }\n // Render measure numbers\n if (this.measure > 0) {\n ctx.save();\n ctx.setFont(this.textFont);\n const textWidth = ctx.measureText('' + this.measure).width;\n y = this.getYForTopText(0) + 3;\n ctx.fillText('' + this.measure, this.x - textWidth / 2, y);\n ctx.restore();\n }\n ctx.closeGroup();\n return this;\n }\n getVerticalBarWidth() {\n return this.options.vertical_bar_width;\n }\n /**\n * Get the current configuration for the Stave.\n * @return {Array} An array of configuration objects.\n */\n getConfigForLines() {\n return this.options.line_config;\n }\n /**\n * Configure properties of the lines in the Stave\n * @param line_number The index of the line to configure.\n * @param line_config An configuration object for the specified line.\n * @throws RuntimeError \"StaveConfigError\" When the specified line number is out of\n * range of the number of lines specified in the constructor.\n */\n setConfigForLine(line_number, line_config) {\n if (line_number >= this.options.num_lines || line_number < 0) {\n throw new RuntimeError('StaveConfigError', 'The line number must be within the range of the number of lines in the Stave.');\n }\n if (line_config.visible === undefined) {\n throw new RuntimeError('StaveConfigError', \"The line configuration object is missing the 'visible' property.\");\n }\n if (typeof line_config.visible !== 'boolean') {\n throw new RuntimeError('StaveConfigError', \"The line configuration objects 'visible' property must be true or false.\");\n }\n this.options.line_config[line_number] = line_config;\n return this;\n }\n /**\n * Set the staff line configuration array for all of the lines at once.\n * @param lines_configuration An array of line configuration objects. These objects\n * are of the same format as the single one passed in to setLineConfiguration().\n * The caller can set null for any line config entry if it is desired that the default be used\n * @throws RuntimeError \"StaveConfigError\" When the lines_configuration array does not have\n * exactly the same number of elements as the num_lines configuration object set in\n * the constructor.\n */\n setConfigForLines(lines_configuration) {\n if (lines_configuration.length !== this.options.num_lines) {\n throw new RuntimeError('StaveConfigError', 'The length of the lines configuration array must match the number of lines in the Stave');\n }\n // Make sure the defaults are present in case an incomplete set of\n // configuration options were supplied.\n // eslint-disable-next-line\n for (const line_config in lines_configuration) {\n // Allow '{}' to be used if the caller just wants the default for a particular node.\n if (lines_configuration[line_config].visible == undefined) {\n lines_configuration[line_config] = this.options.line_config[line_config];\n }\n this.options.line_config[line_config] = Object.assign(Object.assign({}, this.options.line_config[line_config]), lines_configuration[line_config]);\n }\n this.options.line_config = lines_configuration;\n return this;\n }\n}\nStave.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 8,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// Author Larry Kuhns 2011\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nexport var BarlineType;\n(function (BarlineType) {\n BarlineType[BarlineType[\"SINGLE\"] = 1] = \"SINGLE\";\n BarlineType[BarlineType[\"DOUBLE\"] = 2] = \"DOUBLE\";\n BarlineType[BarlineType[\"END\"] = 3] = \"END\";\n BarlineType[BarlineType[\"REPEAT_BEGIN\"] = 4] = \"REPEAT_BEGIN\";\n BarlineType[BarlineType[\"REPEAT_END\"] = 5] = \"REPEAT_END\";\n BarlineType[BarlineType[\"REPEAT_BOTH\"] = 6] = \"REPEAT_BOTH\";\n BarlineType[BarlineType[\"NONE\"] = 7] = \"NONE\";\n})(BarlineType || (BarlineType = {}));\nexport class Barline extends StaveModifier {\n constructor(type) {\n super();\n this.thickness = Tables.STAVE_LINE_THICKNESS;\n const TYPE = BarlineType;\n this.widths = {};\n this.widths[TYPE.SINGLE] = 5;\n this.widths[TYPE.DOUBLE] = 5;\n this.widths[TYPE.END] = 5;\n this.widths[TYPE.REPEAT_BEGIN] = 5;\n this.widths[TYPE.REPEAT_END] = 5;\n this.widths[TYPE.REPEAT_BOTH] = 5;\n this.widths[TYPE.NONE] = 5;\n this.paddings = {};\n this.paddings[TYPE.SINGLE] = 0;\n this.paddings[TYPE.DOUBLE] = 0;\n this.paddings[TYPE.END] = 0;\n this.paddings[TYPE.REPEAT_BEGIN] = 15;\n this.paddings[TYPE.REPEAT_END] = 15;\n this.paddings[TYPE.REPEAT_BOTH] = 15;\n this.paddings[TYPE.NONE] = 0;\n this.layoutMetricsMap = {};\n this.layoutMetricsMap[TYPE.SINGLE] = {\n xMin: 0,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.DOUBLE] = {\n xMin: -3,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.END] = {\n xMin: -5,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.REPEAT_END] = {\n xMin: -10,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.REPEAT_BEGIN] = {\n xMin: -2,\n xMax: 10,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.REPEAT_BOTH] = {\n xMin: -10,\n xMax: 10,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.NONE] = {\n xMin: 0,\n xMax: 0,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.setPosition(StaveModifierPosition.BEGIN);\n this.setType(type);\n }\n static get CATEGORY() {\n return Category.Barline;\n }\n static get type() {\n return BarlineType;\n }\n static get typeString() {\n return {\n single: BarlineType.SINGLE,\n double: BarlineType.DOUBLE,\n end: BarlineType.END,\n repeatBegin: BarlineType.REPEAT_BEGIN,\n repeatEnd: BarlineType.REPEAT_END,\n repeatBoth: BarlineType.REPEAT_BOTH,\n none: BarlineType.NONE,\n };\n }\n getType() {\n return this.type;\n }\n setType(type) {\n this.type = typeof type === 'string' ? Barline.typeString[type] : type;\n this.setWidth(this.widths[this.type]);\n this.setPadding(this.paddings[this.type]);\n this.setLayoutMetrics(this.layoutMetricsMap[this.type]);\n return this;\n }\n // Draw barlines\n draw(stave) {\n stave.checkContext();\n this.setRendered();\n switch (this.type) {\n case BarlineType.SINGLE:\n this.drawVerticalBar(stave, this.x, false);\n break;\n case BarlineType.DOUBLE:\n this.drawVerticalBar(stave, this.x, true);\n break;\n case BarlineType.END:\n this.drawVerticalEndBar(stave, this.x);\n break;\n case BarlineType.REPEAT_BEGIN:\n // If the barline is shifted over (in front of clef/time/key)\n // Draw vertical bar at the beginning.\n this.drawRepeatBar(stave, this.x, true);\n if (stave.getX() !== this.x) {\n this.drawVerticalBar(stave, stave.getX());\n }\n break;\n case BarlineType.REPEAT_END:\n this.drawRepeatBar(stave, this.x, false);\n break;\n case BarlineType.REPEAT_BOTH:\n this.drawRepeatBar(stave, this.x, false);\n this.drawRepeatBar(stave, this.x, true);\n break;\n default:\n // Default is NONE, so nothing to draw\n break;\n }\n }\n drawVerticalBar(stave, x, double_bar) {\n const staveCtx = stave.checkContext();\n const topY = stave.getTopLineTopY();\n const botY = stave.getBottomLineBottomY();\n if (double_bar) {\n staveCtx.fillRect(x - 3, topY, 1, botY - topY);\n }\n staveCtx.fillRect(x, topY, 1, botY - topY);\n }\n drawVerticalEndBar(stave, x) {\n const staveCtx = stave.checkContext();\n const topY = stave.getTopLineTopY();\n const botY = stave.getBottomLineBottomY();\n staveCtx.fillRect(x - 5, topY, 1, botY - topY);\n staveCtx.fillRect(x - 2, topY, 3, botY - topY);\n }\n drawRepeatBar(stave, x, begin) {\n const staveCtx = stave.checkContext();\n const topY = stave.getTopLineTopY();\n const botY = stave.getBottomLineBottomY();\n let x_shift = 3;\n if (!begin) {\n x_shift = -5;\n }\n staveCtx.fillRect(x + x_shift, topY, 1, botY - topY);\n staveCtx.fillRect(x - 2, topY, 3, botY - topY);\n const dot_radius = 2;\n // Shift dots left or right\n if (begin) {\n x_shift += 4;\n }\n else {\n x_shift -= 4;\n }\n const dot_x = x + x_shift + dot_radius / 2;\n // calculate the y offset based on number of stave lines\n let y_offset = (stave.getNumLines() - 1) * stave.getSpacingBetweenLines();\n y_offset = y_offset / 2 - stave.getSpacingBetweenLines() / 2;\n let dot_y = topY + y_offset + dot_radius / 2;\n // draw the top repeat dot\n staveCtx.beginPath();\n staveCtx.arc(dot_x, dot_y, dot_radius, 0, Math.PI * 2, false);\n staveCtx.fill();\n // draw the bottom repeat dot\n dot_y += stave.getSpacingBetweenLines();\n staveCtx.beginPath();\n staveCtx.arc(dot_x, dot_y, dot_radius, 0, Math.PI * 2, false);\n staveCtx.fill();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nfunction drawBoldDoubleLine(ctx, type, topX, topY, botY) {\n if (type !== StaveConnector.type.BOLD_DOUBLE_LEFT && type !== StaveConnector.type.BOLD_DOUBLE_RIGHT) {\n throw new RuntimeError('InvalidConnector', 'A REPEAT_BEGIN or REPEAT_END type must be provided.');\n }\n let x_shift = 3;\n let variableWidth = 3.5; // Width for avoiding anti-aliasing width issues\n const thickLineOffset = 2; // For aesthetics\n if (type === StaveConnector.type.BOLD_DOUBLE_RIGHT) {\n x_shift = -5; // Flips the side of the thin line\n variableWidth = 3;\n }\n // Thin line\n ctx.fillRect(topX + x_shift, topY, 1, botY - topY);\n // Thick line\n ctx.fillRect(topX - thickLineOffset, topY, variableWidth, botY - topY);\n}\n/** StaveConnector implements the connector lines between staves of a system. */\nexport class StaveConnector extends Element {\n constructor(top_stave, bottom_stave) {\n super();\n this.thickness = Tables.STAVE_LINE_THICKNESS;\n this.width = 3;\n this.top_stave = top_stave;\n this.bottom_stave = bottom_stave;\n this.type = StaveConnector.type.DOUBLE;\n this.resetFont();\n // 1. Offset Bold Double Left to align with offset Repeat Begin bars\n // 2. Offset BRACE type not to overlap with another StaveConnector\n this.x_shift = 0;\n this.texts = [];\n }\n static get CATEGORY() {\n return Category.StaveConnector;\n }\n /**\n * Set type.\n * @param type see {@link StaveConnector.type} & {@link StaveConnector.typeString}\n */\n setType(type) {\n type = typeof type === 'string' ? StaveConnector.typeString[type] : type;\n if (type >= StaveConnector.type.SINGLE_RIGHT && type <= StaveConnector.type.NONE) {\n this.type = type;\n }\n return this;\n }\n /** Set optional associated Text. */\n setText(text, options = {}) {\n this.texts.push({\n content: text,\n options: Object.assign({ shift_x: 0, shift_y: 0 }, options),\n });\n return this;\n }\n setXShift(x_shift) {\n if (typeof x_shift !== 'number') {\n throw new RuntimeError('InvalidType', 'x_shift must be a Number');\n }\n this.x_shift = x_shift;\n return this;\n }\n getXShift() {\n return this.x_shift;\n }\n /** Render connector and associated text. */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n let topY = this.top_stave.getYForLine(0);\n let botY = this.bottom_stave.getYForLine(this.bottom_stave.getNumLines() - 1) + this.thickness;\n let width = this.width;\n let topX = this.top_stave.getX();\n const isRightSidedConnector = this.type === StaveConnector.type.SINGLE_RIGHT ||\n this.type === StaveConnector.type.BOLD_DOUBLE_RIGHT ||\n this.type === StaveConnector.type.THIN_DOUBLE;\n if (isRightSidedConnector) {\n topX = this.top_stave.getX() + this.top_stave.getWidth();\n }\n let attachment_height = botY - topY;\n switch (this.type) {\n case StaveConnector.type.SINGLE:\n width = 1;\n break;\n case StaveConnector.type.SINGLE_LEFT:\n width = 1;\n break;\n case StaveConnector.type.SINGLE_RIGHT:\n width = 1;\n break;\n case StaveConnector.type.DOUBLE:\n topX -= this.width + 2;\n topY -= this.thickness;\n attachment_height += 0.5;\n break;\n case StaveConnector.type.BRACE: {\n width = 12;\n // May need additional code to draw brace\n const x1 = this.top_stave.getX() - 2 + this.x_shift;\n const y1 = topY;\n const x3 = x1;\n const y3 = botY;\n const x2 = x1 - width;\n const y2 = y1 + attachment_height / 2.0;\n const cpx1 = x2 - 0.9 * width;\n const cpy1 = y1 + 0.2 * attachment_height;\n const cpx2 = x1 + 1.1 * width;\n const cpy2 = y2 - 0.135 * attachment_height;\n const cpx3 = cpx2;\n const cpy3 = y2 + 0.135 * attachment_height;\n const cpx4 = cpx1;\n const cpy4 = y3 - 0.2 * attachment_height;\n const cpx5 = x2 - width;\n const cpy5 = cpy4;\n const cpx6 = x1 + 0.4 * width;\n const cpy6 = y2 + 0.135 * attachment_height;\n const cpx7 = cpx6;\n const cpy7 = y2 - 0.135 * attachment_height;\n const cpx8 = cpx5;\n const cpy8 = cpy1;\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, x2, y2);\n ctx.bezierCurveTo(cpx3, cpy3, cpx4, cpy4, x3, y3);\n ctx.bezierCurveTo(cpx5, cpy5, cpx6, cpy6, x2, y2);\n ctx.bezierCurveTo(cpx7, cpy7, cpx8, cpy8, x1, y1);\n ctx.fill();\n ctx.stroke();\n break;\n }\n case StaveConnector.type.BRACKET:\n topY -= 6;\n botY += 6;\n attachment_height = botY - topY;\n Glyph.renderGlyph(ctx, topX - 5, topY, 40, 'bracketTop');\n Glyph.renderGlyph(ctx, topX - 5, botY, 40, 'bracketBottom');\n topX -= this.width + 2;\n break;\n case StaveConnector.type.BOLD_DOUBLE_LEFT:\n drawBoldDoubleLine(ctx, this.type, topX + this.x_shift, topY, botY - this.thickness);\n break;\n case StaveConnector.type.BOLD_DOUBLE_RIGHT:\n drawBoldDoubleLine(ctx, this.type, topX, topY, botY - this.thickness);\n break;\n case StaveConnector.type.THIN_DOUBLE:\n width = 1;\n attachment_height -= this.thickness;\n break;\n case StaveConnector.type.NONE:\n break;\n default:\n throw new RuntimeError('InvalidType', `The provided StaveConnector.type (${this.type}) is invalid.`);\n }\n if (this.type !== StaveConnector.type.BRACE &&\n this.type !== StaveConnector.type.BOLD_DOUBLE_LEFT &&\n this.type !== StaveConnector.type.BOLD_DOUBLE_RIGHT &&\n this.type !== StaveConnector.type.NONE) {\n ctx.fillRect(topX, topY, width, attachment_height);\n }\n // If the connector is a thin double barline, draw the paralell line\n if (this.type === StaveConnector.type.THIN_DOUBLE) {\n ctx.fillRect(topX - 3, topY, width, attachment_height);\n }\n ctx.save();\n ctx.setLineWidth(2);\n ctx.setFont(this.textFont);\n // Add stave connector text\n for (let i = 0; i < this.texts.length; i++) {\n const text = this.texts[i];\n const text_width = ctx.measureText('' + text.content).width;\n const x = this.top_stave.getX() - text_width - 24 + text.options.shift_x;\n const y = (this.top_stave.getYForLine(0) + this.bottom_stave.getBottomLineY()) / 2 + text.options.shift_y;\n ctx.fillText('' + text.content, x, y + 4);\n }\n ctx.restore();\n }\n}\nStaveConnector.TEXT_FONT = {\n family: Font.SERIF,\n size: 16,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n/**\n * SINGLE_LEFT and SINGLE are the same value for compatibility\n * with older versions of vexflow which didn't have right sided\n * stave connectors.\n */\nStaveConnector.type = {\n SINGLE_RIGHT: 0,\n SINGLE_LEFT: 1,\n SINGLE: 1,\n DOUBLE: 2,\n BRACE: 3,\n BRACKET: 4,\n BOLD_DOUBLE_LEFT: 5,\n BOLD_DOUBLE_RIGHT: 6,\n THIN_DOUBLE: 7,\n NONE: 8,\n};\n/**\n * Connector type:\n * * \"singleRight\"\n * * \"singleLeft\"\n * * \"single\"\n * * \"double\"\n * * \"brace\"\n * * \"bracket\"\n * * \"boldDoubleLeft\"\n * * \"boldDoubleRight\"\n * * \"thinDouble\"\n * * \"none\"\n */\nStaveConnector.typeString = {\n singleRight: StaveConnector.type.SINGLE_RIGHT,\n singleLeft: StaveConnector.type.SINGLE_LEFT,\n single: StaveConnector.type.SINGLE,\n double: StaveConnector.type.DOUBLE,\n brace: StaveConnector.type.BRACE,\n bracket: StaveConnector.type.BRACKET,\n boldDoubleLeft: StaveConnector.type.BOLD_DOUBLE_LEFT,\n boldDoubleRight: StaveConnector.type.BOLD_DOUBLE_RIGHT,\n thinDouble: StaveConnector.type.THIN_DOUBLE,\n none: StaveConnector.type.NONE,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// Author: Raffaele Viglianti, 2012 http://itisnotsound.wordpress.com/\n//\n// This class implements hairpins between notes.\n// Hairpins can be either crescendo or decrescendo.\nimport { Element } from './element';\nimport { Modifier } from './modifier';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StaveHairpin extends Element {\n /**\n * Create a new hairpin from the specified notes.\n *\n * @param {!Object} notes The notes to tie up.\n * Notes is a struct that has:\n *\n * {\n * first_note: Note,\n * last_note: Note,\n * }\n * @param {!Object} type The type of hairpin\n */\n constructor(notes, type) {\n super();\n this.setNotes(notes);\n this.hairpin = type;\n this.position = Modifier.Position.BELOW;\n this.render_options = {\n height: 10,\n y_shift: 0,\n left_shift_px: 0,\n right_shift_px: 0,\n right_shift_ticks: 0,\n left_shift_ticks: 0,\n };\n }\n static get CATEGORY() {\n return Category.StaveHairpin;\n }\n /* Helper function to convert ticks into pixels.\n * Requires a Formatter with voices joined and formatted (to\n * get pixels per tick)\n *\n * options is struct that has:\n *\n * {\n * height: px,\n * y_shift: px, // vertical offset\n * left_shift_ticks: 0, // left horizontal offset expressed in ticks\n * right_shift_ticks: 0 // right horizontal offset expressed in ticks\n * }\n *\n **/\n static FormatByTicksAndDraw(ctx, formatter, notes, type, position, options) {\n var _a, _b;\n const ppt = formatter.pixelsPerTick;\n if (ppt == null) {\n throw new RuntimeError('BadArguments', 'A valid Formatter must be provide to draw offsets by ticks.');\n }\n const l_shift_px = ppt * ((_a = options.left_shift_ticks) !== null && _a !== void 0 ? _a : 0);\n const r_shift_px = ppt * ((_b = options.right_shift_ticks) !== null && _b !== void 0 ? _b : 0);\n const hairpin_options = {\n height: options.height,\n y_shift: options.y_shift,\n left_shift_px: l_shift_px,\n right_shift_px: r_shift_px,\n right_shift_ticks: 0,\n left_shift_ticks: 0,\n };\n new StaveHairpin({\n first_note: notes.first_note,\n last_note: notes.last_note,\n }, type)\n .setContext(ctx)\n .setRenderOptions(hairpin_options)\n .setPosition(position)\n .draw();\n }\n setPosition(position) {\n if (position === Modifier.Position.ABOVE || position === Modifier.Position.BELOW) {\n this.position = position;\n }\n return this;\n }\n setRenderOptions(options) {\n if (options.height != null &&\n options.y_shift != null &&\n options.left_shift_px != null &&\n options.right_shift_px != null) {\n this.render_options = options;\n }\n return this;\n }\n /**\n * Set the notes to attach this hairpin to.\n *\n * @param {!Object} notes The start and end notes.\n */\n setNotes(notes) {\n if (!notes.first_note && !notes.last_note) {\n throw new RuntimeError('BadArguments', 'Hairpin needs to have either first_note or last_note set.');\n }\n this.notes = notes;\n this.first_note = notes.first_note;\n this.last_note = notes.last_note;\n return this;\n }\n renderHairpin(params) {\n const ctx = this.checkContext();\n let dis = this.render_options.y_shift + 20;\n let y_shift = params.first_y;\n if (this.position === Modifier.Position.ABOVE) {\n dis = -dis + 30;\n y_shift = params.first_y - params.staff_height;\n }\n const l_shift = this.render_options.left_shift_px;\n const r_shift = this.render_options.right_shift_px;\n ctx.beginPath();\n switch (this.hairpin) {\n case StaveHairpin.type.CRESC:\n ctx.moveTo(params.last_x + r_shift, y_shift + dis);\n ctx.lineTo(params.first_x + l_shift, y_shift + this.render_options.height / 2 + dis);\n ctx.lineTo(params.last_x + r_shift, y_shift + this.render_options.height + dis);\n break;\n case StaveHairpin.type.DECRESC:\n ctx.moveTo(params.first_x + l_shift, y_shift + dis);\n ctx.lineTo(params.last_x + r_shift, y_shift + this.render_options.height / 2 + dis);\n ctx.lineTo(params.first_x + l_shift, y_shift + this.render_options.height + dis);\n break;\n default:\n // Default is NONE, so nothing to draw\n break;\n }\n ctx.stroke();\n ctx.closePath();\n }\n draw() {\n this.checkContext();\n this.setRendered();\n const firstNote = this.first_note;\n const lastNote = this.last_note;\n if (!firstNote || !lastNote)\n throw new RuntimeError('NoNote', 'Notes required to draw');\n const start = firstNote.getModifierStartXY(this.position, 0);\n const end = lastNote.getModifierStartXY(this.position, 0);\n this.renderHairpin({\n first_x: start.x,\n last_x: end.x,\n first_y: firstNote.checkStave().getY() + firstNote.checkStave().getHeight(),\n last_y: lastNote.checkStave().getY() + lastNote.checkStave().getHeight(),\n staff_height: firstNote.checkStave().getHeight(),\n });\n }\n}\nStaveHairpin.type = {\n CRESC: 1,\n DECRESC: 2,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements `StaveLine` which are simply lines that connect\n// two notes. This object is highly configurable, see the `render_options`.\n// A simple line is often used for notating glissando articulations, but you\n// can format a `StaveLine` with arrows or colors for more pedagogical\n// purposes, such as diagrams.\nimport { Element } from './element';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\n// Attribution: Arrow rendering implementations based off of\n// Patrick Horgan's article, \"Drawing lines and arcs with\n// arrow heads on HTML5 Canvas\"\n//\n// Draw an arrow head that connects between 3 coordinates.\nfunction drawArrowHead(ctx, x0, y0, x1, y1, x2, y2) {\n // all cases do this.\n ctx.beginPath();\n ctx.moveTo(x0, y0);\n ctx.lineTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.lineTo(x0, y0);\n ctx.closePath();\n ctx.fill();\n}\nexport class StaveLine extends Element {\n // Initialize the StaveLine with the given `notes`.\n //\n // `notes` is a struct that has:\n //\n // ```\n // {\n // first_note: Note,\n // last_note: Note,\n // first_indices: [n1, n2, n3],\n // last_indices: [n1, n2, n3]\n // }\n // ```\n constructor(notes) {\n super();\n this.setNotes(notes);\n this.text = '';\n this.resetFont();\n this.render_options = {\n // Space to add to the left or the right\n padding_left: 4,\n padding_right: 3,\n // The width of the line in pixels\n line_width: 1,\n // An array of line/space lengths. (TODO/QUESTION: Is this supported in SVG?).\n line_dash: undefined,\n // Can draw rounded line end, instead of a square. (TODO/QUESTION: Is this supported in SVG?).\n rounded_end: true,\n // The color of the line and arrowheads\n color: undefined,\n // Flags to draw arrows on each end of the line\n draw_start_arrow: false,\n draw_end_arrow: false,\n // The length of the arrowhead sides\n arrowhead_length: 10,\n // The angle of the arrowhead\n arrowhead_angle: Math.PI / 8,\n // The position of the text\n text_position_vertical: StaveLine.TextVerticalPosition.TOP,\n text_justification: StaveLine.TextJustification.CENTER,\n };\n }\n static get CATEGORY() {\n return Category.StaveLine;\n }\n // The the annotation for the `StaveLine`\n setText(text) {\n this.text = text;\n return this;\n }\n // Set the notes for the `StaveLine`\n setNotes(notes) {\n if (!notes.first_note && !notes.last_note) {\n throw new RuntimeError('BadArguments', 'Notes needs to have either first_note or last_note set.');\n }\n if (!notes.first_indices)\n notes.first_indices = [0];\n if (!notes.last_indices)\n notes.last_indices = [0];\n if (notes.first_indices.length !== notes.last_indices.length) {\n throw new RuntimeError('BadArguments', 'Connected notes must have same number of indices.');\n }\n this.notes = notes;\n this.first_note = notes.first_note;\n this.first_indices = notes.first_indices;\n this.last_note = notes.last_note;\n this.last_indices = notes.last_indices;\n return this;\n }\n // Apply the style of the `StaveLine` to the context\n applyLineStyle() {\n const ctx = this.checkContext();\n const render_options = this.render_options;\n if (render_options.line_dash) {\n ctx.setLineDash(render_options.line_dash);\n }\n if (render_options.line_width) {\n ctx.setLineWidth(render_options.line_width);\n }\n if (render_options.rounded_end) {\n ctx.setLineCap('round');\n }\n else {\n ctx.setLineCap('square');\n }\n }\n // Apply the text styling to the context\n applyFontStyle() {\n const ctx = this.checkContext();\n ctx.setFont(this.textFont);\n const render_options = this.render_options;\n const color = render_options.color;\n if (color) {\n ctx.setStrokeStyle(color);\n ctx.setFillStyle(color);\n }\n }\n // Helper function to draw a line with arrow heads\n drawArrowLine(ctx, pt1, pt2) {\n const both_arrows = this.render_options.draw_start_arrow && this.render_options.draw_end_arrow;\n const x1 = pt1.x;\n const y1 = pt1.y;\n const x2 = pt2.x;\n const y2 = pt2.y;\n // For ends with arrow we actually want to stop before we get to the arrow\n // so that wide lines won't put a flat end on the arrow.\n const distance = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));\n const ratio = (distance - this.render_options.arrowhead_length / 3) / distance;\n let end_x;\n let end_y;\n let start_x;\n let start_y;\n if (this.render_options.draw_end_arrow || both_arrows) {\n end_x = Math.round(x1 + (x2 - x1) * ratio);\n end_y = Math.round(y1 + (y2 - y1) * ratio);\n }\n else {\n end_x = x2;\n end_y = y2;\n }\n if (this.render_options.draw_start_arrow || both_arrows) {\n start_x = x1 + (x2 - x1) * (1 - ratio);\n start_y = y1 + (y2 - y1) * (1 - ratio);\n }\n else {\n start_x = x1;\n start_y = y1;\n }\n if (this.render_options.color) {\n ctx.setStrokeStyle(this.render_options.color);\n ctx.setFillStyle(this.render_options.color);\n }\n // Draw the shaft of the arrow\n ctx.beginPath();\n ctx.moveTo(start_x, start_y);\n ctx.lineTo(end_x, end_y);\n ctx.stroke();\n ctx.closePath();\n // calculate the angle of the line\n const line_angle = Math.atan2(y2 - y1, x2 - x1);\n // h is the line length of a side of the arrow head\n const h = Math.abs(this.render_options.arrowhead_length / Math.cos(this.render_options.arrowhead_angle));\n let angle1;\n let angle2;\n let top_x;\n let top_y;\n let bottom_x;\n let bottom_y;\n if (this.render_options.draw_end_arrow || both_arrows) {\n angle1 = line_angle + Math.PI + this.render_options.arrowhead_angle;\n top_x = x2 + Math.cos(angle1) * h;\n top_y = y2 + Math.sin(angle1) * h;\n angle2 = line_angle + Math.PI - this.render_options.arrowhead_angle;\n bottom_x = x2 + Math.cos(angle2) * h;\n bottom_y = y2 + Math.sin(angle2) * h;\n drawArrowHead(ctx, top_x, top_y, x2, y2, bottom_x, bottom_y);\n }\n if (this.render_options.draw_start_arrow || both_arrows) {\n angle1 = line_angle + this.render_options.arrowhead_angle;\n top_x = x1 + Math.cos(angle1) * h;\n top_y = y1 + Math.sin(angle1) * h;\n angle2 = line_angle - this.render_options.arrowhead_angle;\n bottom_x = x1 + Math.cos(angle2) * h;\n bottom_y = y1 + Math.sin(angle2) * h;\n drawArrowHead(ctx, top_x, top_y, x1, y1, bottom_x, bottom_y);\n }\n }\n // Renders the `StaveLine` on the context\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n const first_note = this.first_note;\n const last_note = this.last_note;\n const render_options = this.render_options;\n ctx.save();\n this.applyLineStyle();\n // Cycle through each set of indices and draw lines\n let start_position = { x: 0, y: 0 };\n let end_position = { x: 0, y: 0 };\n this.first_indices.forEach((first_index, i) => {\n const last_index = this.last_indices[i];\n // Get initial coordinates for the start/end of the line\n start_position = first_note.getModifierStartXY(2, first_index);\n end_position = last_note.getModifierStartXY(1, last_index);\n const upwards_slope = start_position.y > end_position.y;\n // Adjust `x` coordinates for modifiers\n start_position.x += first_note.getMetrics().modRightPx + render_options.padding_left;\n end_position.x -= last_note.getMetrics().modLeftPx + render_options.padding_right;\n // Adjust first `x` coordinates for displacements\n const notehead_width = first_note.getGlyph().getWidth();\n const first_displaced = first_note.getKeyProps()[first_index].displaced;\n if (first_displaced && first_note.getStemDirection() === 1) {\n start_position.x += notehead_width + render_options.padding_left;\n }\n // Adjust last `x` coordinates for displacements\n const last_displaced = last_note.getKeyProps()[last_index].displaced;\n if (last_displaced && last_note.getStemDirection() === -1) {\n end_position.x -= notehead_width + render_options.padding_right;\n }\n // Adjust y position better if it's not coming from the center of the note\n start_position.y += upwards_slope ? -3 : 1;\n end_position.y += upwards_slope ? 2 : 0;\n this.drawArrowLine(ctx, start_position, end_position);\n });\n ctx.restore();\n // Determine the x coordinate where to start the text\n const text_width = ctx.measureText(this.text).width;\n const justification = render_options.text_justification;\n let x = 0;\n if (justification === StaveLine.TextJustification.LEFT) {\n x = start_position.x;\n }\n else if (justification === StaveLine.TextJustification.CENTER) {\n const delta_x = end_position.x - start_position.x;\n const center_x = delta_x / 2 + start_position.x;\n x = center_x - text_width / 2;\n }\n else if (justification === StaveLine.TextJustification.RIGHT) {\n x = end_position.x - text_width;\n }\n // Determine the y value to start the text\n let y = 0;\n const vertical_position = render_options.text_position_vertical;\n if (vertical_position === StaveLine.TextVerticalPosition.TOP) {\n y = first_note.checkStave().getYForTopText();\n }\n else if (vertical_position === StaveLine.TextVerticalPosition.BOTTOM) {\n y = first_note.checkStave().getYForBottomText(Tables.TEXT_HEIGHT_OFFSET_HACK);\n }\n // Draw the text\n ctx.save();\n this.applyFontStyle();\n ctx.fillText(this.text, x, y);\n ctx.restore();\n return this;\n }\n}\n/** Default text font. */\nStaveLine.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n// Text Positioning\nStaveLine.TextVerticalPosition = {\n TOP: 1,\n BOTTOM: 2,\n};\nStaveLine.TextJustification = {\n LEFT: 1,\n CENTER: 2,\n RIGHT: 3,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// A base class for stave modifiers (e.g. clefs, key signatures)\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { defined } from './util';\nexport var StaveModifierPosition;\n(function (StaveModifierPosition) {\n StaveModifierPosition[StaveModifierPosition[\"CENTER\"] = 0] = \"CENTER\";\n StaveModifierPosition[StaveModifierPosition[\"LEFT\"] = 1] = \"LEFT\";\n StaveModifierPosition[StaveModifierPosition[\"RIGHT\"] = 2] = \"RIGHT\";\n StaveModifierPosition[StaveModifierPosition[\"ABOVE\"] = 3] = \"ABOVE\";\n StaveModifierPosition[StaveModifierPosition[\"BELOW\"] = 4] = \"BELOW\";\n StaveModifierPosition[StaveModifierPosition[\"BEGIN\"] = 5] = \"BEGIN\";\n StaveModifierPosition[StaveModifierPosition[\"END\"] = 6] = \"END\";\n})(StaveModifierPosition || (StaveModifierPosition = {}));\nexport class StaveModifier extends Element {\n constructor() {\n super();\n this.width = 0;\n this.x = 0;\n this.padding = 10;\n this.position = StaveModifierPosition.ABOVE;\n }\n static get CATEGORY() {\n return Category.StaveModifier;\n }\n static get Position() {\n return StaveModifierPosition;\n }\n getPosition() {\n return this.position;\n }\n setPosition(position) {\n this.position = position;\n return this;\n }\n getStave() {\n return this.stave;\n }\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n setStave(stave) {\n this.stave = stave;\n return this;\n }\n getWidth() {\n return this.width;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n getX() {\n return this.x;\n }\n setX(x) {\n this.x = x;\n return this;\n }\n placeGlyphOnLine(glyph, stave, line, customShift = 0) {\n glyph.setYShift(stave.getYForLine(line !== null && line !== void 0 ? line : 0) - stave.getYForGlyphs() + customShift);\n }\n getPadding(index) {\n return index !== undefined && index < 2 ? 0 : this.padding;\n }\n setPadding(padding) {\n this.padding = padding;\n return this;\n }\n setLayoutMetrics(layoutMetrics) {\n this.layoutMetrics = layoutMetrics;\n return this;\n }\n getLayoutMetrics() {\n return this.layoutMetrics;\n }\n // eslint-disable-next-line\n draw(...args) {\n // DO NOTHING.\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// This file implements notes for standard notation. This consists of one or\n// more `NoteHeads`, an optional stem, and an optional flag.\n//\n// Throughout these comments, a \"note\" refers to the entire `StaveNote`,\n// and a \"key\" refers to a specific pitch/notehead within a note.\n//\n// See `tests/stavenote_tests.ts` for usage examples.\nimport { BoundingBox } from './boundingbox';\nimport { Modifier } from './modifier';\nimport { NoteHead } from './notehead';\nimport { Stem } from './stem';\nimport { StemmableNote } from './stemmablenote';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, log, midLine, RuntimeError, warn } from './util';\nfunction showDeprecationWarningForNoteHeads() {\n // eslint-disable-next-line\n console.warn('StaveNote.note_heads is deprecated. Use StaveNote.noteHeads instead.', 'This accessor will be removed in VexFlow 5.0.');\n}\n// To enable logging for this class. Set `Vex.Flow.StaveNote.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (StaveNote.DEBUG)\n log('Vex.Flow.StaveNote', args);\n}\nconst isInnerNoteIndex = (note, index) => index === (note.getStemDirection() === Stem.UP ? note.keyProps.length - 1 : 0);\n// Helper methods for rest positioning in ModifierContext.\nfunction shiftRestVertical(rest, note, dir) {\n const delta = dir;\n rest.line += delta;\n rest.maxLine += delta;\n rest.minLine += delta;\n rest.note.setKeyLine(0, rest.note.getKeyLine(0) + delta);\n}\n// Called from formatNotes :: center a rest between two notes\nfunction centerRest(rest, noteU, noteL) {\n const delta = rest.line - midLine(noteU.minLine, noteL.maxLine);\n rest.note.setKeyLine(0, rest.note.getKeyLine(0) - delta);\n rest.line -= delta;\n rest.maxLine -= delta;\n rest.minLine -= delta;\n}\nexport class StaveNote extends StemmableNote {\n constructor(noteStruct) {\n var _a, _b, _c;\n super(noteStruct);\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // INSTANCE MEMBERS\n this.minLine = 0;\n this.maxLine = 0;\n this.ledgerLineStyle = {};\n this.clef = (_a = noteStruct.clef) !== null && _a !== void 0 ? _a : 'treble';\n this.octave_shift = (_b = noteStruct.octave_shift) !== null && _b !== void 0 ? _b : 0;\n // Pull note rendering properties.\n this.glyph = Tables.getGlyphProps(this.duration, this.noteType);\n defined(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`);\n // if true, displace note to right\n this.displaced = false;\n this.dot_shiftY = 0;\n // for displaced ledger lines\n this.use_default_head_x = false;\n // Drawing\n this._noteHeads = [];\n this.modifiers = [];\n this.render_options = Object.assign(Object.assign({}, this.render_options), { \n // font size for note heads and rests\n glyph_font_scale: noteStruct.glyph_font_scale || Tables.NOTATION_FONT_SCALE, \n // number of stroke px to the left and right of head\n stroke_px: noteStruct.stroke_px || StaveNote.LEDGER_LINE_OFFSET });\n this.calculateKeyProps();\n this.buildStem();\n // Set the stem direction\n if (noteStruct.auto_stem) {\n this.autoStem();\n }\n else {\n this.setStemDirection((_c = noteStruct.stem_direction) !== null && _c !== void 0 ? _c : Stem.UP);\n }\n this.reset();\n this.buildFlag();\n }\n static get CATEGORY() {\n return Category.StaveNote;\n }\n /**\n * @deprecated Use Stem.UP.\n */\n static get STEM_UP() {\n return Stem.UP;\n }\n /**\n * @deprecated Use Stem.DOWN.\n */\n static get STEM_DOWN() {\n return Stem.DOWN;\n }\n static get LEDGER_LINE_OFFSET() {\n return 3;\n }\n static get minNoteheadPadding() {\n const musicFont = Tables.currentMusicFont();\n return musicFont.lookupMetric('glyphs.noteHead.minPadding');\n }\n /** Format notes inside a ModifierContext. */\n static format(notes, state) {\n if (!notes || notes.length < 2)\n return false;\n const notesList = [];\n for (let i = 0; i < notes.length; i++) {\n const props = notes[i].getKeyProps();\n const line = props[0].line;\n let minL = props[props.length - 1].line;\n const stemDirection = notes[i].getStemDirection();\n const stemMax = notes[i].getStemLength() / 10;\n const stemMin = notes[i].getStemMinimumLength() / 10;\n let maxL;\n if (notes[i].isRest()) {\n maxL = line + notes[i].glyph.line_above;\n minL = line - notes[i].glyph.line_below;\n }\n else {\n maxL = stemDirection === 1 ? props[props.length - 1].line + stemMax : props[props.length - 1].line;\n minL = stemDirection === 1 ? props[0].line : props[0].line - stemMax;\n }\n notesList.push({\n line: props[0].line,\n maxLine: maxL,\n minLine: minL,\n isrest: notes[i].isRest(),\n stemDirection: stemDirection,\n stemMax,\n stemMin,\n voice_shift: notes[i].getVoiceShiftWidth(),\n is_displaced: notes[i].isDisplaced(),\n note: notes[i],\n });\n }\n const voices = notesList.length;\n let noteU = notesList[0];\n const noteM = voices > 2 ? notesList[1] : undefined;\n let noteL = voices > 2 ? notesList[2] : notesList[1];\n // for two voice backward compatibility, ensure upper voice is stems up\n // for three voices, the voices must be in order (upper, middle, lower)\n if (voices === 2 && noteU.stemDirection === -1 && noteL.stemDirection === 1) {\n noteU = notesList[1];\n noteL = notesList[0];\n }\n const voiceXShift = Math.max(noteU.voice_shift, noteL.voice_shift);\n let xShift = 0;\n // Test for two voice note intersection\n if (voices === 2) {\n const lineSpacing = noteU.stemDirection === noteL.stemDirection ? 0.0 : 0.5;\n if (noteU.minLine <= noteL.maxLine + lineSpacing) {\n if (noteU.isrest) {\n // shift rest up\n shiftRestVertical(noteU, noteL, 1);\n }\n else if (noteL.isrest) {\n // shift rest down\n shiftRestVertical(noteL, noteU, -1);\n }\n else if (noteU.stemDirection === noteL.stemDirection) {\n // upper voice is middle voice, so shift it right\n xShift = voiceXShift + 2;\n noteU.note.setXShift(xShift);\n }\n else {\n // shift lower voice right\n xShift = voiceXShift + 2;\n noteL.note.setXShift(xShift);\n }\n }\n // format complete\n state.right_shift += xShift;\n return true;\n }\n if (!noteM)\n throw new RuntimeError('InvalidState', 'noteM not defined.');\n // For three voices, test if rests can be repositioned\n //\n // Special case 1 :: middle voice rest between two notes\n //\n if (noteM.isrest && !noteU.isrest && !noteL.isrest) {\n if (noteU.minLine <= noteM.maxLine || noteM.minLine <= noteL.maxLine) {\n const restHeight = noteM.maxLine - noteM.minLine;\n const space = noteU.minLine - noteL.maxLine;\n if (restHeight < space) {\n // center middle voice rest between the upper and lower voices\n centerRest(noteM, noteU, noteL);\n }\n else {\n xShift = voiceXShift + 2; // shift middle rest right\n noteM.note.setXShift(xShift);\n if (noteL.note.hasBeam() === false) {\n noteL.stemDirection = -1;\n noteL.note.setStemDirection(-1);\n }\n if (noteU.minLine <= noteL.maxLine && noteU.note.hasBeam() === false) {\n noteU.stemDirection = 1;\n noteU.note.setStemDirection(1);\n }\n }\n // format complete\n state.right_shift += xShift;\n return true;\n }\n }\n // Special case 2 :: all voices are rests\n if (noteU.isrest && noteM.isrest && noteL.isrest) {\n // Shift upper voice rest up\n shiftRestVertical(noteU, noteM, 1);\n // Shift lower voice rest down\n shiftRestVertical(noteL, noteM, -1);\n // format complete\n state.right_shift += xShift;\n return true;\n }\n // Test if any other rests can be repositioned\n if (noteM.isrest && noteU.isrest && noteM.minLine <= noteL.maxLine) {\n // Shift middle voice rest up\n shiftRestVertical(noteM, noteL, 1);\n }\n if (noteM.isrest && noteL.isrest && noteU.minLine <= noteM.maxLine) {\n // Shift middle voice rest down\n shiftRestVertical(noteM, noteU, -1);\n }\n if (noteU.isrest && noteU.minLine <= noteM.maxLine) {\n // shift upper voice rest up;\n shiftRestVertical(noteU, noteM, 1);\n }\n if (noteL.isrest && noteM.minLine <= noteL.maxLine) {\n // shift lower voice rest down\n shiftRestVertical(noteL, noteM, -1);\n }\n // If middle voice intersects upper or lower voice\n if (noteU.minLine <= noteM.maxLine + 0.5 || noteM.minLine <= noteL.maxLine) {\n // shift middle note right\n xShift = voiceXShift + 2;\n noteM.note.setXShift(xShift);\n if (noteL.note.hasBeam() === false) {\n noteL.stemDirection = -1;\n noteL.note.setStemDirection(-1);\n }\n if (noteU.minLine <= noteL.maxLine && noteU.note.hasBeam() === false) {\n noteU.stemDirection = 1;\n noteU.note.setStemDirection(1);\n }\n }\n state.right_shift += xShift;\n return true;\n }\n static postFormat(notes) {\n if (!notes)\n return false;\n notes.forEach((note) => note.postFormat());\n return true;\n }\n reset() {\n super.reset();\n // Save prior noteHead styles & reapply them after making new noteheads.\n const noteHeadStyles = this._noteHeads.map((noteHead) => noteHead.getStyle());\n this.buildNoteHeads();\n this._noteHeads.forEach((noteHead, index) => {\n const noteHeadStyle = noteHeadStyles[index];\n if (noteHeadStyle)\n noteHead.setStyle(noteHeadStyle);\n });\n const stave = this.stave;\n if (stave) {\n this._noteHeads.forEach((head) => head.setStave(stave));\n }\n this.calcNoteDisplacements();\n return this;\n }\n setBeam(beam) {\n this.beam = beam;\n this.calcNoteDisplacements();\n // Update stem extension is a beam is assigned.\n if (this.stem) {\n this.stem.setExtension(this.getStemExtension());\n }\n return this;\n }\n // Builds a `Stem` for the note\n buildStem() {\n this.setStem(new Stem({ hide: !!this.isRest() }));\n return this;\n }\n // Builds a `NoteHead` for each key in the note\n buildNoteHeads() {\n this._noteHeads = [];\n const stemDirection = this.getStemDirection();\n const keys = this.getKeys();\n let lastLine = undefined;\n let lineDiff = undefined;\n let displaced = false;\n // Draw notes from bottom to top.\n // For down-stem notes, we draw from top to bottom.\n let start;\n let end;\n let step;\n if (stemDirection === Stem.UP) {\n start = 0;\n end = keys.length;\n step = 1;\n }\n else {\n start = keys.length - 1;\n end = -1;\n step = -1;\n }\n for (let i = start; i !== end; i += step) {\n const noteProps = this.keyProps[i];\n const line = noteProps.line;\n // Keep track of last line with a note head, so that consecutive heads\n // are correctly displaced.\n if (lastLine === undefined) {\n lastLine = line;\n }\n else {\n lineDiff = Math.abs(lastLine - line);\n if (lineDiff === 0 || lineDiff === 0.5) {\n displaced = !displaced;\n }\n else {\n displaced = false;\n this.use_default_head_x = true;\n }\n }\n lastLine = line;\n const notehead = new NoteHead({\n duration: this.duration,\n note_type: this.noteType,\n displaced,\n stem_direction: stemDirection,\n custom_glyph_code: noteProps.code,\n glyph_font_scale: this.render_options.glyph_font_scale,\n x_shift: noteProps.shift_right,\n stem_up_x_offset: noteProps.stem_up_x_offset,\n stem_down_x_offset: noteProps.stem_down_x_offset,\n line: noteProps.line,\n });\n this._noteHeads[i] = notehead;\n }\n }\n // Automatically sets the stem direction based on the keys in the note\n autoStem() {\n this.setStemDirection(this.calculateOptimalStemDirection());\n }\n calculateOptimalStemDirection() {\n // Figure out optimal stem direction based on given notes\n this.minLine = this.keyProps[0].line;\n this.maxLine = this.keyProps[this.keyProps.length - 1].line;\n const MIDDLE_LINE = 3;\n const decider = (this.minLine + this.maxLine) / 2;\n const stemDirection = decider < MIDDLE_LINE ? Stem.UP : Stem.DOWN;\n return stemDirection;\n }\n // Calculates and stores the properties for each key in the note\n calculateKeyProps() {\n let lastLine;\n for (let i = 0; i < this.keys.length; ++i) {\n const key = this.keys[i];\n // All rests use the same position on the line.\n // if (this.glyph.rest) key = this.glyph.position;\n if (this.glyph.rest)\n this.glyph.position = key;\n const options = { octave_shift: this.octave_shift || 0 };\n const props = Tables.keyProperties(key, this.clef, options);\n if (!props) {\n throw new RuntimeError('BadArguments', `Invalid key for note properties: ${key}`);\n }\n // Override line placement for default rests\n if (props.key === 'R') {\n if (this.duration === '1' || this.duration === 'w') {\n props.line = 4;\n }\n else {\n props.line = 3;\n }\n }\n // Calculate displacement of this note\n const line = props.line;\n if (lastLine == undefined) {\n lastLine = line;\n }\n else {\n if (Math.abs(lastLine - line) === 0.5) {\n this.displaced = true;\n props.displaced = true;\n // Have to mark the previous note as\n // displaced as well, for modifier placement\n if (this.keyProps.length > 0) {\n this.keyProps[i - 1].displaced = true;\n }\n }\n }\n lastLine = line;\n this.keyProps.push(props);\n }\n // Sort the notes from lowest line to highest line\n lastLine = undefined;\n this.keyProps.forEach((key) => {\n if (lastLine && key.line < lastLine) {\n warn('Unsorted keys in note will be sorted. ' + 'See https://github.com/0xfe/vexflow/issues/104 for details.');\n }\n lastLine = key.line;\n });\n this.keyProps.sort((a, b) => a.line - b.line);\n }\n // Get the `BoundingBox` for the entire note\n getBoundingBox() {\n var _a, _b;\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call getBoundingBox on an unformatted note.\");\n }\n const { width: w, modLeftPx, leftDisplacedHeadPx } = this.getMetrics();\n const x = this.getAbsoluteX() - modLeftPx - leftDisplacedHeadPx;\n let minY = 0;\n let maxY = 0;\n const halfLineSpacing = ((_b = (_a = this.getStave()) === null || _a === void 0 ? void 0 : _a.getSpacingBetweenLines()) !== null && _b !== void 0 ? _b : 0) / 2;\n const lineSpacing = halfLineSpacing * 2;\n if (this.isRest()) {\n const y = this.ys[0];\n const frac = Tables.durationToFraction(this.duration);\n if (frac.equals(1) || frac.equals(2)) {\n minY = y - halfLineSpacing;\n maxY = y + halfLineSpacing;\n }\n else {\n minY = y - this.glyph.line_above * lineSpacing;\n maxY = y + this.glyph.line_below * lineSpacing;\n }\n }\n else if (this.glyph.stem) {\n const ys = this.getStemExtents();\n ys.baseY += halfLineSpacing * this.getStemDirection();\n minY = Math.min(ys.topY, ys.baseY);\n maxY = Math.max(ys.topY, ys.baseY);\n }\n else {\n minY = 0;\n maxY = 0;\n for (let i = 0; i < this.ys.length; ++i) {\n const yy = this.ys[i];\n if (i === 0) {\n minY = yy;\n maxY = yy;\n }\n else {\n minY = Math.min(yy, minY);\n maxY = Math.max(yy, maxY);\n }\n }\n minY -= halfLineSpacing;\n maxY += halfLineSpacing;\n }\n return new BoundingBox(x, minY, w, maxY - minY);\n }\n // Gets the line number of the bottom note in the chord.\n // If `isTopNote` is `true` then get the top note's line number instead\n getLineNumber(isTopNote) {\n if (!this.keyProps.length) {\n throw new RuntimeError('NoKeyProps', \"Can't get bottom note line, because note is not initialized properly.\");\n }\n let resultLine = this.keyProps[0].line;\n // No precondition assumed for sortedness of keyProps array\n for (let i = 0; i < this.keyProps.length; i++) {\n const thisLine = this.keyProps[i].line;\n if (isTopNote) {\n if (thisLine > resultLine)\n resultLine = thisLine;\n }\n else {\n if (thisLine < resultLine)\n resultLine = thisLine;\n }\n }\n return resultLine;\n }\n /**\n * @returns true if this note is a type of rest. Rests don't have pitches, but take up space in the score.\n */\n isRest() {\n return this.glyph.rest;\n }\n // Determine if the current note is a chord\n isChord() {\n return !this.isRest() && this.keys.length > 1;\n }\n // Determine if the `StaveNote` has a stem\n hasStem() {\n return this.glyph.stem;\n }\n hasFlag() {\n return super.hasFlag() && !this.isRest();\n }\n getStemX() {\n if (this.noteType === 'r') {\n return this.getCenterGlyphX();\n }\n else {\n // We adjust the origin of the stem because we want the stem left-aligned\n // with the notehead if stemmed-down, and right-aligned if stemmed-up\n return super.getStemX() + (this.stem_direction ? Stem.WIDTH / (2 * -this.stem_direction) : 0);\n }\n }\n // Get the `y` coordinate for text placed on the top/bottom of a\n // note at a desired `text_line`\n getYForTopText(textLine) {\n const extents = this.getStemExtents();\n return Math.min(this.checkStave().getYForTopText(textLine), extents.topY - this.render_options.annotation_spacing * (textLine + 1));\n }\n getYForBottomText(textLine) {\n const extents = this.getStemExtents();\n return Math.max(this.checkStave().getYForTopText(textLine), extents.baseY + this.render_options.annotation_spacing * textLine);\n }\n // Sets the current note to the provided `stave`. This applies\n // `y` values to the `NoteHeads`.\n setStave(stave) {\n super.setStave(stave);\n const ys = this._noteHeads.map((notehead) => {\n notehead.setStave(stave);\n return notehead.getY();\n });\n this.setYs(ys);\n if (this.stem) {\n const { y_top, y_bottom } = this.getNoteHeadBounds();\n this.stem.setYBounds(y_top, y_bottom);\n }\n return this;\n }\n // Check if note is shifted to the right\n isDisplaced() {\n return this.displaced;\n }\n // Sets whether shift note to the right. `displaced` is a `boolean`\n setNoteDisplaced(displaced) {\n this.displaced = displaced;\n return this;\n }\n // Get the starting `x` coordinate for a `StaveTie`\n getTieRightX() {\n let tieStartX = this.getAbsoluteX();\n tieStartX += this.getGlyphWidth() + this.x_shift + this.rightDisplacedHeadPx;\n if (this.modifierContext)\n tieStartX += this.modifierContext.getRightShift();\n return tieStartX;\n }\n // Get the ending `x` coordinate for a `StaveTie`\n getTieLeftX() {\n let tieEndX = this.getAbsoluteX();\n tieEndX += this.x_shift - this.leftDisplacedHeadPx;\n return tieEndX;\n }\n // Get the stave line on which to place a rest\n getLineForRest() {\n let restLine = this.keyProps[0].line;\n if (this.keyProps.length > 1) {\n const lastLine = this.keyProps[this.keyProps.length - 1].line;\n const top = Math.max(restLine, lastLine);\n const bot = Math.min(restLine, lastLine);\n restLine = midLine(top, bot);\n }\n return restLine;\n }\n // Get the default `x` and `y` coordinates for the provided `position`\n // and key `index`\n getModifierStartXY(position, index, options = {}) {\n var _a, _b;\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call GetModifierStartXY on an unformatted note\");\n }\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', 'No Y-Values calculated for this note.');\n }\n const { ABOVE, BELOW, LEFT, RIGHT } = Modifier.Position;\n let x = 0;\n if (position === LEFT) {\n // FIXME: Left modifier padding, move to font file\n x = -1 * 2;\n }\n else if (position === RIGHT) {\n // FIXME: Right modifier padding, move to font file\n x = this.getGlyphWidth() + this.x_shift + 2;\n if (this.stem_direction === Stem.UP &&\n this.hasFlag() &&\n (options.forceFlagRight || isInnerNoteIndex(this, index))) {\n x += (_b = (_a = this === null || this === void 0 ? void 0 : this.flag) === null || _a === void 0 ? void 0 : _a.getMetrics().width) !== null && _b !== void 0 ? _b : 0;\n }\n }\n else if (position === BELOW || position === ABOVE) {\n x = this.getGlyphWidth() / 2;\n }\n return {\n x: this.getAbsoluteX() + x,\n y: this.ys[index],\n };\n }\n // Sets the style of the complete StaveNote, including all keys\n // and the stem.\n setStyle(style) {\n var _a;\n super.setStyle(style);\n this._noteHeads.forEach((notehead) => notehead.setStyle(style));\n (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setStyle(style);\n return this;\n }\n setStemStyle(style) {\n const stem = this.getStem();\n stem === null || stem === void 0 ? void 0 : stem.setStyle(style);\n return this;\n }\n getStemStyle() {\n var _a;\n return (_a = this.stem) === null || _a === void 0 ? void 0 : _a.getStyle();\n }\n setLedgerLineStyle(style) {\n this.ledgerLineStyle = style;\n }\n getLedgerLineStyle() {\n return this.ledgerLineStyle;\n }\n setFlagStyle(style) {\n this.flagStyle = style;\n }\n getFlagStyle() {\n return this.flagStyle;\n }\n // Sets the notehead at `index` to the provided coloring `style`.\n //\n // `style` is an `object` with the following properties: `shadowColor`,\n // `shadowBlur`, `fillStyle`, `strokeStyle`\n setKeyStyle(index, style) {\n this._noteHeads[index].setStyle(style);\n return this;\n }\n setKeyLine(index, line) {\n this.keyProps[index].line = line;\n this.reset();\n return this;\n }\n getKeyLine(index) {\n return this.keyProps[index].line;\n }\n // Get the width of the note if it is displaced. Used for `Voice`\n // formatting\n getVoiceShiftWidth() {\n // TODO: may need to accomodate for dot here.\n return this.getGlyphWidth() * (this.displaced ? 2 : 1);\n }\n // Calculates and sets the extra pixels to the left or right\n // if the note is displaced.\n calcNoteDisplacements() {\n this.setLeftDisplacedHeadPx(this.displaced && this.stem_direction === Stem.DOWN ? this.getGlyphWidth() : 0);\n // For upstems with flags, the extra space is unnecessary, since it's taken\n // up by the flag.\n this.setRightDisplacedHeadPx(!this.hasFlag() && this.displaced && this.stem_direction === Stem.UP ? this.getGlyphWidth() : 0);\n }\n // Pre-render formatting\n preFormat() {\n if (this.preFormatted)\n return;\n let noteHeadPadding = 0;\n if (this.modifierContext) {\n this.modifierContext.preFormat();\n // If there are no modifiers on this note, make sure there is adequate padding\n // between the notes.\n if (this.modifierContext.getWidth() === 0) {\n noteHeadPadding = StaveNote.minNoteheadPadding;\n }\n }\n let width = this.getGlyphWidth() + this.leftDisplacedHeadPx + this.rightDisplacedHeadPx + noteHeadPadding;\n // For upward flagged notes, the width of the flag needs to be added\n if (this.shouldDrawFlag() && this.stem_direction === Stem.UP) {\n width += this.getGlyphWidth();\n // TODO: Add flag width as a separate metric\n }\n this.setWidth(width);\n this.preFormatted = true;\n }\n /**\n * @typedef {Object} noteHeadBounds\n * @property {number} y_top the highest notehead bound\n * @property {number} y_bottom the lowest notehead bound\n * @property {number|Null} displaced_x the starting x for displaced noteheads\n * @property {number|Null} non_displaced_x the starting x for non-displaced noteheads\n * @property {number} highest_line the highest notehead line in traditional music line\n * numbering (bottom line = 1, top line = 5)\n * @property {number} lowest_line the lowest notehead line\n * @property {number|false} highest_displaced_line the highest staff line number\n * for a displaced notehead\n * @property {number|false} lowest_displaced_line\n * @property {number} highest_non_displaced_line\n * @property {number} lowest_non_displaced_line\n */\n /**\n * Get the staff line and y value for the highest & lowest noteheads\n * @returns {noteHeadBounds}\n */\n getNoteHeadBounds() {\n // Top and bottom Y values for stem.\n let yTop = +Infinity;\n let yBottom = -Infinity;\n let nonDisplacedX;\n let displacedX;\n let highestLine = this.checkStave().getNumLines();\n let lowestLine = 1;\n let highestDisplacedLine;\n let lowestDisplacedLine;\n let highestNonDisplacedLine = highestLine;\n let lowestNonDisplacedLine = lowestLine;\n this._noteHeads.forEach((notehead) => {\n const line = notehead.getLine();\n const y = notehead.getY();\n yTop = Math.min(y, yTop);\n yBottom = Math.max(y, yBottom);\n if (displacedX === undefined && notehead.isDisplaced()) {\n displacedX = notehead.getAbsoluteX();\n }\n if (nonDisplacedX === undefined && !notehead.isDisplaced()) {\n nonDisplacedX = notehead.getAbsoluteX();\n }\n highestLine = Math.max(line, highestLine);\n lowestLine = Math.min(line, lowestLine);\n if (notehead.isDisplaced()) {\n highestDisplacedLine = highestDisplacedLine === undefined ? line : Math.max(line, highestDisplacedLine);\n lowestDisplacedLine = lowestDisplacedLine === undefined ? line : Math.min(line, lowestDisplacedLine);\n }\n else {\n highestNonDisplacedLine = Math.max(line, highestNonDisplacedLine);\n lowestNonDisplacedLine = Math.min(line, lowestNonDisplacedLine);\n }\n }, this);\n return {\n y_top: yTop,\n y_bottom: yBottom,\n displaced_x: displacedX,\n non_displaced_x: nonDisplacedX,\n highest_line: highestLine,\n lowest_line: lowestLine,\n highest_displaced_line: highestDisplacedLine,\n lowest_displaced_line: lowestDisplacedLine,\n highest_non_displaced_line: highestNonDisplacedLine,\n lowest_non_displaced_line: lowestNonDisplacedLine,\n };\n }\n // Get the starting `x` coordinate for the noteheads\n getNoteHeadBeginX() {\n return this.getAbsoluteX() + this.x_shift;\n }\n // Get the ending `x` coordinate for the noteheads\n getNoteHeadEndX() {\n const xBegin = this.getNoteHeadBeginX();\n return xBegin + this.getGlyphWidth();\n }\n get noteHeads() {\n return this._noteHeads.slice();\n }\n /** @deprecated use StaveNote.noteHeads instead. */\n get note_heads() {\n showDeprecationWarningForNoteHeads();\n return this.noteHeads;\n }\n // Draw the ledger lines between the stave and the highest/lowest keys\n drawLedgerLines() {\n const stave = this.checkStave();\n const { glyph, render_options: { stroke_px }, } = this;\n const ctx = this.checkContext();\n const width = glyph.getWidth() + stroke_px * 2;\n const doubleWidth = 2 * (glyph.getWidth() + stroke_px) - Stem.WIDTH / 2;\n if (this.isRest())\n return;\n if (!ctx) {\n throw new RuntimeError('NoCanvasContext', \"Can't draw without a canvas context.\");\n }\n const { highest_line, lowest_line, highest_displaced_line, highest_non_displaced_line, lowest_displaced_line, lowest_non_displaced_line, displaced_x, non_displaced_x, } = this.getNoteHeadBounds();\n // Early out if there are no ledger lines to draw.\n if (highest_line < 6 && lowest_line > 0)\n return;\n const min_x = Math.min(displaced_x !== null && displaced_x !== void 0 ? displaced_x : 0, non_displaced_x !== null && non_displaced_x !== void 0 ? non_displaced_x : 0);\n const drawLedgerLine = (y, normal, displaced) => {\n let x;\n if (displaced && normal)\n x = min_x - stroke_px;\n else if (normal)\n x = (non_displaced_x !== null && non_displaced_x !== void 0 ? non_displaced_x : 0) - stroke_px;\n else\n x = (displaced_x !== null && displaced_x !== void 0 ? displaced_x : 0) - stroke_px;\n const ledgerWidth = normal && displaced ? doubleWidth : width;\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(x + ledgerWidth, y);\n ctx.stroke();\n };\n const style = Object.assign(Object.assign({}, stave.getDefaultLedgerLineStyle()), this.getLedgerLineStyle());\n this.applyStyle(ctx, style);\n // Draw ledger lines below the staff:\n for (let line = 6; line <= highest_line; ++line) {\n const normal = non_displaced_x !== undefined && line <= highest_non_displaced_line;\n const displaced = highest_displaced_line !== undefined && line <= highest_displaced_line;\n drawLedgerLine(stave.getYForNote(line), normal, displaced);\n }\n // Draw ledger lines above the staff:\n for (let line = 0; line >= lowest_line; --line) {\n const normal = non_displaced_x !== undefined && line >= lowest_non_displaced_line;\n const displaced = lowest_displaced_line !== undefined && line >= lowest_displaced_line;\n drawLedgerLine(stave.getYForNote(line), normal, displaced);\n }\n this.restoreStyle(ctx, style);\n }\n // Draw all key modifiers\n drawModifiers() {\n const ctx = this.checkContext();\n ctx.openGroup('modifiers');\n for (let i = 0; i < this.modifiers.length; i++) {\n const modifier = this.modifiers[i];\n const index = modifier.checkIndex();\n const notehead = this._noteHeads[index];\n const noteheadStyle = notehead.getStyle();\n notehead.applyStyle(ctx, noteheadStyle);\n modifier.setContext(ctx);\n modifier.drawWithStyle();\n notehead.restoreStyle(ctx, noteheadStyle);\n }\n ctx.closeGroup();\n }\n shouldDrawFlag() {\n const hasStem = this.stem !== undefined;\n const hasFlag = this.glyph.flag; // specified in tables.js\n const hasNoBeam = this.beam === undefined;\n return hasStem && hasFlag && hasNoBeam;\n }\n // Draw the flag for the note\n drawFlag() {\n var _a;\n const ctx = this.checkContext();\n if (!ctx) {\n throw new RuntimeError('NoCanvasContext', \"Can't draw without a canvas context.\");\n }\n if (this.shouldDrawFlag()) {\n const { y_top, y_bottom } = this.getNoteHeadBounds();\n // eslint-disable-next-line\n const noteStemHeight = this.stem.getHeight();\n const flagX = this.getStemX();\n // FIXME: What's with the magic +/- 2\n // ANSWER: a corner of the note stem pokes out beyond the tip of the flag.\n // The extra +/- 2 pushes the flag glyph outward so it covers the stem entirely.\n // Alternatively, we could shorten the stem.\n const extension = this.flag !== undefined ? this.flag.checkMetrics().y_shift : 0;\n const flagY = this.getStemDirection() === Stem.DOWN\n ? // Down stems are below the note head and have flags on the right.\n y_top - noteStemHeight + 2 - extension\n : // Up stems are above the note head and have flags on the right.\n y_bottom - noteStemHeight - 2 - extension;\n // Draw the Flag\n ctx.openGroup('flag', undefined, { pointerBBox: true });\n this.applyStyle(ctx, this.getFlagStyle());\n (_a = this.flag) === null || _a === void 0 ? void 0 : _a.render(ctx, flagX, flagY);\n this.restoreStyle(ctx, this.getFlagStyle());\n ctx.closeGroup();\n }\n }\n // Draw the NoteHeads\n drawNoteHeads() {\n const ctx = this.checkContext();\n this._noteHeads.forEach((notehead) => {\n ctx.openGroup('notehead', undefined, { pointerBBox: true });\n notehead.setContext(ctx).draw();\n ctx.closeGroup();\n });\n }\n drawStem(stemOptions) {\n var _a;\n // GCR TODO: I can't find any context in which this is called with the stemStruct\n // argument in the codebase or tests. Nor can I find a case where super.drawStem\n // is called at all. Perhaps these should be removed?\n const ctx = this.checkContext();\n if (stemOptions) {\n this.setStem(new Stem(stemOptions));\n }\n // If we will render a flag, we shorten the stem so that the tip\n // does not poke through the flag.\n if (this.shouldDrawFlag() && this.stem) {\n this.stem.adjustHeightForFlag();\n }\n ctx.openGroup('stem', undefined, { pointerBBox: true });\n (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setContext(ctx).draw();\n ctx.closeGroup();\n }\n /**\n * Override stemmablenote stem extension to adjust for distance from middle line.\n */\n getStemExtension() {\n const super_stem_extension = super.getStemExtension();\n if (!this.glyph.stem) {\n return super_stem_extension;\n }\n const stem_direction = this.getStemDirection();\n if (stem_direction !== this.calculateOptimalStemDirection()) {\n return super_stem_extension; // no adjustment for manually set stem direction.\n }\n let mid_line_distance;\n const MIDDLE_LINE = 3;\n if (stem_direction === Stem.UP) {\n // Note that the use of maxLine here instead of minLine might\n // seem counterintuitive, but in the case of (say) treble clef\n // chord(F2, E4) stem up, we do not want to extend the stem because\n // of F2, when a normal octave-length stem above E4 is fine.\n //\n // maxLine and minLine are set in calculateOptimalStemDirection() so\n // will be known.\n mid_line_distance = MIDDLE_LINE - this.maxLine;\n }\n else {\n mid_line_distance = this.minLine - MIDDLE_LINE;\n }\n // how many lines more than an octave is the relevant notehead?\n const lines_over_octave_from_mid_line = mid_line_distance - 3.5;\n if (lines_over_octave_from_mid_line <= 0) {\n return super_stem_extension;\n }\n const stave = this.getStave();\n let spacing_between_lines = 10;\n if (stave != undefined) {\n spacing_between_lines = stave.getSpacingBetweenLines();\n }\n return super_stem_extension + lines_over_octave_from_mid_line * spacing_between_lines;\n }\n // Draws all the `StaveNote` parts. This is the main drawing method.\n draw() {\n var _a;\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', \"Can't draw note without Y values.\");\n }\n const ctx = this.checkContext();\n const xBegin = this.getNoteHeadBeginX();\n const shouldRenderStem = this.hasStem() && !this.beam;\n // Format note head x positions\n this._noteHeads.forEach((notehead) => notehead.setX(xBegin));\n // Format stem x positions\n const stemX = this.getStemX();\n (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setNoteHeadXBounds(stemX, stemX);\n L('Rendering ', this.isChord() ? 'chord :' : 'note :', this.keys);\n // Apply the overall style -- may be contradicted by local settings:\n this.applyStyle();\n this.setAttribute('el', ctx.openGroup('stavenote', this.getAttribute('id')));\n this.drawLedgerLines();\n ctx.openGroup('note', undefined, { pointerBBox: true });\n if (shouldRenderStem)\n this.drawStem();\n this.drawNoteHeads();\n this.drawFlag();\n ctx.closeGroup();\n this.drawModifiers();\n ctx.closeGroup();\n this.restoreStyle();\n this.setRendered();\n }\n}\nStaveNote.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Larry Kuhns 2011\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { StaveModifier } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nexport class Repetition extends StaveModifier {\n constructor(type, x, y_shift) {\n super();\n this.symbol_type = type;\n this.x = x;\n this.x_shift = 0;\n this.y_shift = y_shift;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.Repetition;\n }\n setShiftX(x) {\n this.x_shift = x;\n return this;\n }\n setShiftY(y) {\n this.y_shift = y;\n return this;\n }\n draw(stave, x) {\n this.setRendered();\n switch (this.symbol_type) {\n case Repetition.type.CODA_RIGHT:\n this.drawCodaFixed(stave, x + stave.getWidth());\n break;\n case Repetition.type.CODA_LEFT:\n this.drawSymbolText(stave, x, 'Coda', true);\n break;\n case Repetition.type.SEGNO_LEFT:\n this.drawSignoFixed(stave, x);\n break;\n case Repetition.type.SEGNO_RIGHT:\n this.drawSignoFixed(stave, x + stave.getWidth());\n break;\n case Repetition.type.DC:\n this.drawSymbolText(stave, x, 'D.C.', false);\n break;\n case Repetition.type.DC_AL_CODA:\n this.drawSymbolText(stave, x, 'D.C. al', true);\n break;\n case Repetition.type.DC_AL_FINE:\n this.drawSymbolText(stave, x, 'D.C. al Fine', false);\n break;\n case Repetition.type.DS:\n this.drawSymbolText(stave, x, 'D.S.', false);\n break;\n case Repetition.type.DS_AL_CODA:\n this.drawSymbolText(stave, x, 'D.S. al', true);\n break;\n case Repetition.type.DS_AL_FINE:\n this.drawSymbolText(stave, x, 'D.S. al Fine', false);\n break;\n case Repetition.type.FINE:\n this.drawSymbolText(stave, x, 'Fine', false);\n break;\n case Repetition.type.TO_CODA:\n this.drawSymbolText(stave, x, 'To', true);\n break;\n default:\n break;\n }\n return this;\n }\n drawCodaFixed(stave, x) {\n const y = stave.getYForTopText(stave.getNumLines()) + this.y_shift;\n Glyph.renderGlyph(stave.checkContext(), this.x + x + this.x_shift, y + Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY'), 40, 'coda', { category: 'coda' });\n return this;\n }\n drawSignoFixed(stave, x) {\n const y = stave.getYForTopText(stave.getNumLines()) + this.y_shift;\n Glyph.renderGlyph(stave.checkContext(), this.x + x + this.x_shift, y + Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY'), 30, 'segno', { category: 'segno' });\n return this;\n }\n drawSymbolText(stave, x, text, draw_coda) {\n const ctx = stave.checkContext();\n ctx.save();\n ctx.setFont(this.textFont);\n let text_x = 0;\n let symbol_x = 0;\n const modifierWidth = stave.getNoteStartX() - this.x;\n switch (this.symbol_type) {\n // To the left with symbol\n case Repetition.type.CODA_LEFT:\n // Offset Coda text to right of stave beginning\n text_x = this.x + stave.getVerticalBarWidth();\n symbol_x =\n text_x +\n ctx.measureText(text).width +\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol');\n break;\n // To the right without symbol\n case Repetition.type.DC:\n case Repetition.type.DC_AL_FINE:\n case Repetition.type.DS:\n case Repetition.type.DS_AL_FINE:\n case Repetition.type.FINE:\n text_x =\n this.x +\n x +\n this.x_shift +\n stave.getWidth() -\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.spacing') -\n modifierWidth -\n ctx.measureText(text).width;\n break;\n // To the right with symbol\n default:\n text_x =\n this.x +\n x +\n this.x_shift +\n stave.getWidth() -\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.spacing') -\n modifierWidth -\n ctx.measureText(text).width -\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol');\n symbol_x =\n text_x +\n ctx.measureText(text).width +\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol');\n break;\n }\n const y = stave.getYForTopText(stave.getNumLines()) +\n this.y_shift +\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY');\n if (draw_coda) {\n Glyph.renderGlyph(ctx, symbol_x, y, 40, 'coda', { category: 'coda' });\n }\n ctx.fillText(text, text_x, y + 5);\n ctx.restore();\n return this;\n }\n}\nRepetition.TEXT_FONT = {\n family: Font.SERIF,\n size: 12,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\nRepetition.type = {\n NONE: 1,\n CODA_LEFT: 2,\n CODA_RIGHT: 3,\n SEGNO_LEFT: 4,\n SEGNO_RIGHT: 5,\n DC: 6,\n DC_AL_CODA: 7,\n DC_AL_FINE: 8,\n DS: 9,\n DS_AL_CODA: 10,\n DS_AL_FINE: 11,\n FINE: 12,\n TO_CODA: 13, // To Coda at end of stave\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Larry Kuhns 2011\nimport { Font, FontStyle, FontWeight } from './font';\nimport { StaveModifier } from './stavemodifier';\nimport { Category } from './typeguard';\nexport class StaveSection extends StaveModifier {\n constructor(section, x, shift_y) {\n super();\n this.setWidth(16);\n this.section = section;\n this.x = x;\n this.shift_x = 0;\n this.shift_y = shift_y;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StaveSection;\n }\n setStaveSection(section) {\n this.section = section;\n return this;\n }\n setShiftX(x) {\n this.shift_x = x;\n return this;\n }\n setShiftY(y) {\n this.shift_y = y;\n return this;\n }\n draw(stave, shift_x) {\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.save();\n ctx.setLineWidth(2);\n ctx.setFont(this.textFont);\n const paddingX = 2;\n const paddingY = 2;\n const rectWidth = 2;\n const textMeasurements = ctx.measureText(this.section);\n const textWidth = textMeasurements.width;\n const textHeight = textMeasurements.height;\n const width = textWidth + 2 * paddingX; // add left & right padding\n const height = textHeight + 2 * paddingY; // add top & bottom padding\n // Seems to be a good default y\n const y = stave.getYForTopText(2) + this.shift_y;\n const x = this.x + shift_x;\n ctx.beginPath();\n ctx.setLineWidth(rectWidth);\n ctx.rect(x, y + textMeasurements.y - paddingY, width, height);\n ctx.stroke();\n ctx.fillText(this.section, x + paddingX, y);\n ctx.restore();\n return this;\n }\n}\nStaveSection.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 10,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Radosaw Eichler 2012\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nexport class StaveTempo extends StaveModifier {\n constructor(tempo, x, shift_y) {\n super();\n /** Font size for note. */\n this.render_options = { glyph_font_scale: 30 };\n this.tempo = tempo;\n this.position = StaveModifierPosition.ABOVE;\n this.x = x;\n this.shift_x = 10;\n this.shift_y = shift_y;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StaveTempo;\n }\n setTempo(tempo) {\n this.tempo = tempo;\n return this;\n }\n setShiftX(x) {\n this.shift_x = x;\n return this;\n }\n setShiftY(y) {\n this.shift_y = y;\n return this;\n }\n draw(stave, shift_x) {\n const ctx = stave.checkContext();\n this.setRendered();\n const options = this.render_options;\n // FIXME: What does the '38' mean? Why 38? Is that supposed to\n // be the default font size for standard notation?\n const scale = options.glyph_font_scale / 38;\n const name = this.tempo.name;\n const duration = this.tempo.duration;\n const dots = this.tempo.dots || 0;\n const bpm = this.tempo.bpm;\n let x = this.x + this.shift_x + shift_x;\n const y = stave.getYForTopText(1) + this.shift_y;\n ctx.save();\n if (name) {\n ctx.setFont(this.textFont);\n ctx.fillText(name, x, y);\n x += ctx.measureText(name).width;\n }\n if (duration && bpm) {\n // Override the weight and style.\n ctx.setFont(Object.assign(Object.assign({}, this.textFont), { weight: 'normal', style: 'normal' }));\n if (name) {\n x += ctx.measureText(' ').width;\n ctx.fillText('(', x, y);\n x += ctx.measureText('(').width;\n }\n const code = Tables.getGlyphProps(duration);\n x += 3 * scale;\n Glyph.renderGlyph(ctx, x, y, options.glyph_font_scale, code.code_head);\n x += code.getWidth() * scale;\n // Draw stem and flags\n if (code.stem) {\n let stem_height = 30;\n if (code.beam_count)\n stem_height += 3 * (code.beam_count - 1);\n stem_height *= scale;\n const y_top = y - stem_height;\n ctx.fillRect(x - scale, y_top, scale, stem_height);\n if (code.flag) {\n Glyph.renderGlyph(ctx, x, y_top, options.glyph_font_scale, code.code_flag_upstem, {\n category: 'flag.staveTempo',\n });\n if (!dots)\n x += 6 * scale;\n }\n }\n // Draw dot\n for (let i = 0; i < dots; i++) {\n x += 6 * scale;\n ctx.beginPath();\n ctx.arc(x, y + 2 * scale, 2 * scale, 0, Math.PI * 2, false);\n ctx.fill();\n }\n ctx.fillText(' = ' + bpm + (name ? ')' : ''), x + 3 * scale, y);\n }\n ctx.restore();\n return this;\n }\n}\nStaveTempo.TEXT_FONT = {\n family: Font.SERIF,\n size: 14,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2014\nimport { Font, FontStyle, FontWeight } from './font';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Justification, TextNote } from './textnote';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StaveText extends StaveModifier {\n constructor(text, position, options = {}) {\n super();\n this.setWidth(16);\n this.text = text;\n this.position = position;\n this.options = Object.assign({ shift_x: 0, shift_y: 0, justification: TextNote.Justification.CENTER }, options);\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StaveText;\n }\n setStaveText(text) {\n this.text = text;\n return this;\n }\n setShiftX(x) {\n this.shift_x = x;\n return this;\n }\n setShiftY(y) {\n this.shift_y = y;\n return this;\n }\n setText(text) {\n this.text = text;\n return this;\n }\n draw(stave) {\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.save();\n ctx.setLineWidth(2);\n ctx.setFont(this.textFont);\n const text_width = ctx.measureText('' + this.text).width;\n let x;\n let y;\n switch (this.position) {\n case StaveModifierPosition.LEFT:\n case StaveModifierPosition.RIGHT:\n y = (stave.getYForLine(0) + stave.getBottomLineY()) / 2 + this.options.shift_y;\n if (this.position === StaveModifierPosition.LEFT) {\n x = stave.getX() - text_width - 24 + this.options.shift_x;\n }\n else {\n x = stave.getX() + stave.getWidth() + 24 + this.options.shift_x;\n }\n break;\n case StaveModifierPosition.ABOVE:\n case StaveModifierPosition.BELOW:\n x = stave.getX() + this.options.shift_x;\n if (this.options.justification === Justification.CENTER) {\n x += stave.getWidth() / 2 - text_width / 2;\n }\n else if (this.options.justification === Justification.RIGHT) {\n x += stave.getWidth() - text_width;\n }\n if (this.position === StaveModifierPosition.ABOVE) {\n y = stave.getYForTopText(2) + this.options.shift_y;\n }\n else {\n y = stave.getYForBottomText(2) + this.options.shift_y;\n }\n break;\n default:\n throw new RuntimeError('InvalidPosition', 'Value Must be in Modifier.Position.');\n }\n ctx.fillText('' + this.text, x, y + 4);\n ctx.restore();\n return this;\n }\n}\nStaveText.TEXT_FONT = {\n family: Font.SERIF,\n size: 16,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// This class implements varies types of ties between contiguous notes. The\n// ties include: regular ties, hammer ons, pull offs, and slides.\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StaveTie extends Element {\n /**\n * @param notes is a struct that has:\n *\n * {\n * first_note: Note,\n * last_note: Note,\n * first_indices: [n1, n2, n3],\n * last_indices: [n1, n2, n3]\n * }\n *\n * @param text\n */\n constructor(notes, text) {\n super();\n this.setNotes(notes);\n this.text = text;\n this.render_options = {\n cp1: 8,\n cp2: 12,\n text_shift_x: 0,\n first_x_shift: 0,\n last_x_shift: 0,\n y_shift: 7,\n tie_spacing: 0,\n };\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StaveTie;\n }\n setDirection(direction) {\n this.direction = direction;\n return this;\n }\n /**\n * Set the notes to attach this tie to.\n *\n * @param {!Object} notes The notes to tie up.\n */\n setNotes(notes) {\n if (!notes.first_note && !notes.last_note) {\n throw new RuntimeError('BadArguments', 'Tie needs to have either first_note or last_note set.');\n }\n if (!notes.first_indices) {\n notes.first_indices = [0];\n }\n if (!notes.last_indices) {\n notes.last_indices = [0];\n }\n if (notes.first_indices.length !== notes.last_indices.length) {\n throw new RuntimeError('BadArguments', 'Tied notes must have same number of indices.');\n }\n this.notes = notes;\n return this;\n }\n /**\n * @return {boolean} Returns true if this is a partial bar.\n */\n isPartial() {\n return !this.notes.first_note || !this.notes.last_note;\n }\n renderTie(params) {\n if (params.first_ys.length === 0 || params.last_ys.length === 0) {\n throw new RuntimeError('BadArguments', 'No Y-values to render');\n }\n const ctx = this.checkContext();\n let cp1 = this.render_options.cp1;\n let cp2 = this.render_options.cp2;\n if (Math.abs(params.last_x_px - params.first_x_px) < 10) {\n cp1 = 2;\n cp2 = 8;\n }\n const first_x_shift = this.render_options.first_x_shift;\n const last_x_shift = this.render_options.last_x_shift;\n const y_shift = this.render_options.y_shift * params.direction;\n // setNotes(...) verified that first_indices and last_indices are not undefined.\n // As a result, we use the ! non-null assertion operator here.\n // eslint-disable-next-line\n const first_indices = this.notes.first_indices;\n // eslint-disable-next-line\n const last_indices = this.notes.last_indices;\n for (let i = 0; i < first_indices.length; ++i) {\n const cp_x = (params.last_x_px + last_x_shift + (params.first_x_px + first_x_shift)) / 2;\n const first_y_px = params.first_ys[first_indices[i]] + y_shift;\n const last_y_px = params.last_ys[last_indices[i]] + y_shift;\n if (isNaN(first_y_px) || isNaN(last_y_px)) {\n throw new RuntimeError('BadArguments', 'Bad indices for tie rendering.');\n }\n const top_cp_y = (first_y_px + last_y_px) / 2 + cp1 * params.direction;\n const bottom_cp_y = (first_y_px + last_y_px) / 2 + cp2 * params.direction;\n ctx.beginPath();\n ctx.moveTo(params.first_x_px + first_x_shift, first_y_px);\n ctx.quadraticCurveTo(cp_x, top_cp_y, params.last_x_px + last_x_shift, last_y_px);\n ctx.quadraticCurveTo(cp_x, bottom_cp_y, params.first_x_px + first_x_shift, first_y_px);\n ctx.closePath();\n ctx.fill();\n }\n }\n renderText(first_x_px, last_x_px) {\n var _a, _b, _c;\n if (!this.text)\n return;\n const ctx = this.checkContext();\n let center_x = (first_x_px + last_x_px) / 2;\n center_x -= ctx.measureText(this.text).width / 2;\n const stave = (_b = (_a = this.notes.first_note) === null || _a === void 0 ? void 0 : _a.checkStave()) !== null && _b !== void 0 ? _b : (_c = this.notes.last_note) === null || _c === void 0 ? void 0 : _c.checkStave();\n if (stave) {\n ctx.save();\n ctx.setFont(this.textFont);\n ctx.fillText(this.text, center_x + this.render_options.text_shift_x, stave.getYForTopText() - 1);\n ctx.restore();\n }\n }\n draw() {\n this.checkContext();\n this.setRendered();\n const first_note = this.notes.first_note;\n const last_note = this.notes.last_note;\n // Provide some default values so the compiler doesn't complain.\n let first_x_px = 0;\n let last_x_px = 0;\n let first_ys = [0];\n let last_ys = [0];\n let stem_direction = 0;\n if (first_note) {\n first_x_px = first_note.getTieRightX() + this.render_options.tie_spacing;\n stem_direction = first_note.getStemDirection();\n first_ys = first_note.getYs();\n }\n else if (last_note) {\n const stave = last_note.checkStave();\n first_x_px = stave.getTieStartX();\n first_ys = last_note.getYs();\n this.notes.first_indices = this.notes.last_indices;\n }\n if (last_note) {\n last_x_px = last_note.getTieLeftX() + this.render_options.tie_spacing;\n stem_direction = last_note.getStemDirection();\n last_ys = last_note.getYs();\n }\n else if (first_note) {\n const stave = first_note.checkStave();\n last_x_px = stave.getTieEndX();\n last_ys = first_note.getYs();\n this.notes.last_indices = this.notes.first_indices;\n }\n if (this.direction) {\n stem_direction = this.direction;\n }\n this.renderTie({\n first_x_px,\n last_x_px,\n first_ys,\n last_ys,\n direction: stem_direction,\n });\n this.renderText(first_x_px, last_x_px);\n return true;\n }\n}\n/** Default text font. */\nStaveTie.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Larry Kuhns 2011\nimport { Font, FontStyle, FontWeight } from './font';\nimport { StaveModifier } from './stavemodifier';\nimport { Category } from './typeguard';\nexport var VoltaType;\n(function (VoltaType) {\n VoltaType[VoltaType[\"NONE\"] = 1] = \"NONE\";\n VoltaType[VoltaType[\"BEGIN\"] = 2] = \"BEGIN\";\n VoltaType[VoltaType[\"MID\"] = 3] = \"MID\";\n VoltaType[VoltaType[\"END\"] = 4] = \"END\";\n VoltaType[VoltaType[\"BEGIN_END\"] = 5] = \"BEGIN_END\";\n})(VoltaType || (VoltaType = {}));\nexport class Volta extends StaveModifier {\n constructor(type, number, x, y_shift) {\n super();\n this.volta = type;\n this.x = x;\n this.y_shift = y_shift;\n this.number = number;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.Volta;\n }\n static get type() {\n return VoltaType;\n }\n setShiftY(y) {\n this.y_shift = y;\n return this;\n }\n draw(stave, x) {\n const ctx = stave.checkContext();\n this.setRendered();\n let width = stave.getWidth() - x; // don't include x (offset) for width\n const top_y = stave.getYForTopText(stave.getNumLines()) + this.y_shift;\n const vert_height = 1.5 * stave.getSpacingBetweenLines();\n switch (this.volta) {\n case VoltaType.BEGIN:\n ctx.fillRect(this.x + x, top_y, 1, vert_height);\n break;\n case VoltaType.END:\n width -= 5;\n ctx.fillRect(this.x + x + width, top_y, 1, vert_height);\n break;\n case VoltaType.BEGIN_END:\n width -= 3;\n ctx.fillRect(this.x + x, top_y, 1, vert_height);\n ctx.fillRect(this.x + x + width, top_y, 1, vert_height);\n break;\n default:\n break;\n }\n // If the beginning of a volta, draw measure number\n if (this.volta === VoltaType.BEGIN || this.volta === VoltaType.BEGIN_END) {\n ctx.save();\n ctx.setFont(this.textFont);\n ctx.fillText(this.number, this.x + x + 5, top_y + 15);\n ctx.restore();\n }\n ctx.fillRect(this.x + x, top_y, width, 1);\n return this;\n }\n}\nVolta.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 9,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This file implements the `Stem` object. Generally this object is handled\n// by its parent `StemmableNote`.\nimport { Element } from './element';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Stem.DEBUG)\n log('Vex.Flow.Stem', args);\n}\nexport class Stem extends Element {\n constructor(options) {\n super();\n this.stem_up_y_offset = 0;\n this.stem_down_y_offset = 0;\n this.stem_up_y_base_offset = 0;\n this.stem_down_y_base_offset = 0;\n // Default notehead x bounds\n this.x_begin = (options === null || options === void 0 ? void 0 : options.x_begin) || 0;\n this.x_end = (options === null || options === void 0 ? void 0 : options.x_end) || 0;\n // Y bounds for top/bottom most notehead\n this.y_top = (options === null || options === void 0 ? void 0 : options.y_top) || 0;\n this.y_bottom = (options === null || options === void 0 ? void 0 : options.y_bottom) || 0;\n // Stem top extension\n this.stem_extension = (options === null || options === void 0 ? void 0 : options.stem_extension) || 0;\n // Direction of the stem\n this.stem_direction = (options === null || options === void 0 ? void 0 : options.stem_direction) || 0;\n // Flag to override all draw calls\n this.hide = (options === null || options === void 0 ? void 0 : options.hide) || false;\n this.isStemlet = (options === null || options === void 0 ? void 0 : options.isStemlet) || false;\n this.stemletHeight = (options === null || options === void 0 ? void 0 : options.stemletHeight) || 0;\n // Use to adjust the rendered height without affecting\n // the results of `.getExtents()`\n this.renderHeightAdjustment = 0;\n this.setOptions(options);\n }\n static get CATEGORY() {\n return Category.Stem;\n }\n // Stem directions\n static get UP() {\n return 1;\n }\n static get DOWN() {\n return -1;\n }\n // Theme\n static get WIDTH() {\n return Tables.STEM_WIDTH;\n }\n static get HEIGHT() {\n return Tables.STEM_HEIGHT;\n }\n setOptions(options) {\n // Changing where the stem meets the head\n this.stem_up_y_offset = (options === null || options === void 0 ? void 0 : options.stem_up_y_offset) || 0;\n this.stem_down_y_offset = (options === null || options === void 0 ? void 0 : options.stem_down_y_offset) || 0;\n this.stem_up_y_base_offset = (options === null || options === void 0 ? void 0 : options.stem_up_y_base_offset) || 0;\n this.stem_down_y_base_offset = (options === null || options === void 0 ? void 0 : options.stem_down_y_base_offset) || 0;\n }\n // Set the x bounds for the default notehead\n setNoteHeadXBounds(x_begin, x_end) {\n this.x_begin = x_begin;\n this.x_end = x_end;\n return this;\n }\n // Set the direction of the stem in relation to the noteheads\n setDirection(direction) {\n this.stem_direction = direction;\n }\n // Set the extension for the stem, generally for flags or beams\n setExtension(ext) {\n this.stem_extension = ext;\n }\n getExtension() {\n return this.stem_extension;\n }\n // The the y bounds for the top and bottom noteheads\n setYBounds(y_top, y_bottom) {\n this.y_top = y_top;\n this.y_bottom = y_bottom;\n }\n // Gets the entire height for the stem\n getHeight() {\n const y_offset = this.stem_direction === Stem.UP ? this.stem_up_y_offset : this.stem_down_y_offset;\n const unsigned_height = this.y_bottom - this.y_top + (Stem.HEIGHT - y_offset + this.stem_extension); // parentheses just for grouping.\n return unsigned_height * this.stem_direction;\n }\n getBoundingBox() {\n throw new RuntimeError('NotImplemented', 'getBoundingBox() not implemented.');\n }\n // Get the y coordinates for the very base of the stem to the top of\n // the extension\n getExtents() {\n const isStemUp = this.stem_direction === Stem.UP;\n const ys = [this.y_top, this.y_bottom];\n const stemHeight = Stem.HEIGHT + this.stem_extension;\n const innerMostNoteheadY = (isStemUp ? Math.min : Math.max)(...ys);\n const outerMostNoteheadY = (isStemUp ? Math.max : Math.min)(...ys);\n const stemTipY = innerMostNoteheadY + stemHeight * -this.stem_direction;\n return { topY: stemTipY, baseY: outerMostNoteheadY };\n }\n setVisibility(isVisible) {\n this.hide = !isVisible;\n return this;\n }\n setStemlet(isStemlet, stemletHeight) {\n this.isStemlet = isStemlet;\n this.stemletHeight = stemletHeight;\n return this;\n }\n adjustHeightForFlag() {\n this.renderHeightAdjustment = Tables.currentMusicFont().lookupMetric('stem.heightAdjustmentForFlag', -3);\n }\n adjustHeightForBeam() {\n this.renderHeightAdjustment = -Stem.WIDTH / 2;\n }\n // Render the stem onto the canvas\n draw() {\n this.setRendered();\n if (this.hide)\n return;\n const ctx = this.checkContext();\n let stem_x;\n let stem_y;\n const stem_direction = this.stem_direction;\n let y_base_offset = 0;\n if (stem_direction === Stem.DOWN) {\n // Down stems are rendered to the left of the head.\n stem_x = this.x_begin;\n stem_y = this.y_top + this.stem_down_y_offset;\n y_base_offset = this.stem_down_y_base_offset;\n }\n else {\n // Up stems are rendered to the right of the head.\n stem_x = this.x_end;\n stem_y = this.y_bottom - this.stem_up_y_offset;\n y_base_offset = this.stem_up_y_base_offset;\n }\n const stemHeight = this.getHeight();\n L('Rendering stem - ', 'Top Y: ', this.y_top, 'Bottom Y: ', this.y_bottom);\n // The offset from the stem's base which is required fo satisfy the stemlet height\n const stemletYOffset = this.isStemlet ? stemHeight - this.stemletHeight * this.stem_direction : 0;\n // Draw the stem\n ctx.save();\n this.applyStyle(ctx);\n ctx.beginPath();\n ctx.setLineWidth(Stem.WIDTH);\n ctx.moveTo(stem_x, stem_y - stemletYOffset + y_base_offset);\n ctx.lineTo(stem_x, stem_y - stemHeight - this.renderHeightAdjustment * stem_direction);\n ctx.stroke();\n this.restoreStyle(ctx);\n ctx.restore();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Stem.DEBUG` to `true`. */\nStem.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// `StemmableNote` is an abstract interface for notes with optional stems.\n// Examples of stemmable notes are `StaveNote` and `TabNote`\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StemmableNote extends Note {\n constructor(noteStruct) {\n super(noteStruct);\n }\n static get CATEGORY() {\n return Category.StemmableNote;\n }\n // Get and set the note's `Stem`\n getStem() {\n return this.stem;\n }\n checkStem() {\n if (!this.stem) {\n throw new RuntimeError('NoStem', 'No stem attached to instance');\n }\n return this.stem;\n }\n setStem(stem) {\n this.stem = stem;\n return this;\n }\n // Builds and sets a new stem\n buildStem() {\n const stem = new Stem();\n this.setStem(stem);\n return this;\n }\n buildFlag(category = 'flag') {\n const { glyph } = this;\n if (this.hasFlag()) {\n const flagCode = this.getStemDirection() === Stem.DOWN ? glyph.code_flag_downstem : glyph.code_flag_upstem;\n this.flag = new Glyph(flagCode, this.render_options.glyph_font_scale, { category });\n }\n }\n // Get the custom glyph associated with the outer note head on the base of the stem.\n getBaseCustomNoteHeadGlyph() {\n if (this.getStemDirection() === Stem.DOWN) {\n return this.customGlyphs[this.customGlyphs.length - 1];\n }\n else {\n return this.customGlyphs[0];\n }\n }\n // Get the full length of stem\n getStemLength() {\n return Stem.HEIGHT + this.getStemExtension();\n }\n // Get the number of beams for this duration\n getBeamCount() {\n const glyph = this.getGlyph();\n if (glyph) {\n return glyph.beam_count;\n }\n else {\n return 0;\n }\n }\n // Get the minimum length of stem\n getStemMinimumLength() {\n const frac = Tables.durationToFraction(this.duration);\n let length = frac.value() <= 1 ? 0 : 20;\n // if note is flagged, cannot shorten beam\n switch (this.duration) {\n case '8':\n if (this.beam == undefined)\n length = 35;\n break;\n case '16':\n length = this.beam == undefined ? 35 : 25;\n break;\n case '32':\n length = this.beam == undefined ? 45 : 35;\n break;\n case '64':\n length = this.beam == undefined ? 50 : 40;\n break;\n case '128':\n length = this.beam == undefined ? 55 : 45;\n break;\n default:\n break;\n }\n return length;\n }\n // Get/set the direction of the stem\n getStemDirection() {\n if (!this.stem_direction)\n throw new RuntimeError('NoStem', 'No stem attached to this note.');\n return this.stem_direction;\n }\n setStemDirection(direction) {\n if (!direction)\n direction = Stem.UP;\n if (direction !== Stem.UP && direction !== Stem.DOWN) {\n throw new RuntimeError('BadArgument', `Invalid stem direction: ${direction}`);\n }\n this.stem_direction = direction;\n // Reset and reformat everything. Flag has to be built before calling getStemExtension.\n this.reset();\n if (this.hasFlag()) {\n this.buildFlag();\n }\n this.beam = undefined;\n if (this.stem) {\n this.stem.setDirection(direction);\n this.stem.setExtension(this.getStemExtension());\n // Lookup the base custom notehead (closest to the base of the stem) to extend or shorten\n // the stem appropriately. If there's no custom note head, lookup the standard notehead.\n const glyph = this.getBaseCustomNoteHeadGlyph() || this.getGlyph();\n // Get the font-specific customizations for the note heads.\n const offsets = Tables.currentMusicFont().lookupMetric(`stem.noteHead.${glyph.code_head}`, {\n offsetYBaseStemUp: 0,\n offsetYTopStemUp: 0,\n offsetYBaseStemDown: 0,\n offsetYTopStemDown: 0,\n });\n // Configure the stem to use these offsets.\n this.stem.setOptions({\n stem_up_y_offset: offsets.offsetYTopStemUp,\n stem_down_y_offset: offsets.offsetYTopStemDown,\n stem_up_y_base_offset: offsets.offsetYBaseStemUp,\n stem_down_y_base_offset: offsets.offsetYBaseStemDown, // glyph.stem_down_y_base_offset,\n });\n }\n if (this.preFormatted) {\n this.preFormat();\n }\n return this;\n }\n // Get the `x` coordinate of the stem\n getStemX() {\n const x_begin = this.getAbsoluteX() + this.x_shift;\n const x_end = this.getAbsoluteX() + this.x_shift + this.getGlyphWidth();\n const stem_x = this.stem_direction === Stem.DOWN ? x_begin : x_end;\n return stem_x;\n }\n // Get the `x` coordinate for the center of the glyph.\n // Used for `TabNote` stems and stemlets over rests\n getCenterGlyphX() {\n return this.getAbsoluteX() + this.x_shift + this.getGlyphWidth() / 2;\n }\n // Get the stem extension for the current duration\n getStemExtension() {\n const glyph = this.getGlyph();\n if (this.stem_extension_override != undefined) {\n return this.stem_extension_override;\n }\n // Use stem_beam_extension with beams\n if (this.beam) {\n return glyph.stem_beam_extension;\n }\n const flagCode = this.getStemDirection() === Stem.DOWN ? this.glyph.code_flag_downstem : this.glyph.code_flag_upstem;\n return Math.abs(Tables.currentMusicFont().lookupMetric(`glyphs.flag.${flagCode}.shiftY`, 0));\n }\n // Set the stem length to a specific. Will override the default length.\n setStemLength(height) {\n this.stem_extension_override = height - Stem.HEIGHT;\n return this;\n }\n // Get the top and bottom `y` values of the stem.\n getStemExtents() {\n if (!this.stem)\n throw new RuntimeError('NoStem', 'No stem attached to this note.');\n return this.stem.getExtents();\n }\n /** Gets the `y` value for the top modifiers at a specific `textLine`. */\n getYForTopText(textLine) {\n const stave = this.checkStave();\n if (this.hasStem()) {\n const extents = this.getStemExtents();\n if (!extents)\n throw new RuntimeError('InvalidState', 'Stem does not have extents.');\n return Math.min(stave.getYForTopText(textLine), extents.topY - this.render_options.annotation_spacing * (textLine + 1));\n }\n else {\n return stave.getYForTopText(textLine);\n }\n }\n /** Gets the `y` value for the bottom modifiers at a specific `textLine`. */\n getYForBottomText(textLine) {\n const stave = this.checkStave();\n if (this.hasStem()) {\n const extents = this.getStemExtents();\n if (!extents)\n throw new RuntimeError('InvalidState', 'Stem does not have extents.');\n return Math.max(stave.getYForTopText(textLine), extents.baseY + this.render_options.annotation_spacing * textLine);\n }\n else {\n return stave.getYForBottomText(textLine);\n }\n }\n hasFlag() {\n return Tables.getGlyphProps(this.duration).flag && !this.beam;\n }\n /** Post formats the note. */\n postFormat() {\n var _a;\n (_a = this.beam) === null || _a === void 0 ? void 0 : _a.postFormat();\n this.postFormatted = true;\n return this;\n }\n /** Renders the stem onto the canvas. */\n drawStem(stemOptions) {\n var _a;\n this.checkContext();\n this.setRendered();\n this.setStem(new Stem(stemOptions));\n (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setContext(this.getContext()).draw();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Larry Kuhns\n//\n// This file implements the `StringNumber` class which renders string\n// number annotations beside notes.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { Renderer } from './renderer';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category, isStaveNote, isStemmableNote } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StringNumber extends Modifier {\n constructor(number) {\n super();\n this.string_number = number;\n this.setWidth(20); // ???\n this.position = Modifier.Position.ABOVE; // Default position above stem or note head\n this.x_shift = 0;\n this.y_shift = 0;\n this.text_line = 0;\n this.stem_offset = 0;\n this.x_offset = 0; // Horizontal offset from default\n this.y_offset = 0; // Vertical offset from default\n this.dashed = true; // true - draw dashed extension false - no extension\n this.leg = Renderer.LineEndType.NONE; // draw upward/downward leg at the of extension line\n this.radius = 8;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StringNumber;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static get metrics() {\n return Tables.currentMusicFont().getMetrics().glyphs.stringNumber;\n }\n // ## Static Methods\n // Arrange string numbers inside a `ModifierContext`\n static format(nums, state) {\n const left_shift = state.left_shift;\n const right_shift = state.right_shift;\n const num_spacing = 1;\n if (!nums || nums.length === 0)\n return false;\n const nums_list = [];\n let prev_note = null;\n let shift_left = 0;\n let shift_right = 0;\n const modLines = 0;\n for (let i = 0; i < nums.length; ++i) {\n const num = nums[i];\n const note = num.getNote();\n const pos = num.getPosition();\n if (!isStaveNote(note)) {\n throw new RuntimeError('NoStaveNote');\n }\n const index = num.checkIndex();\n const props = note.getKeyProps()[index];\n const mc = note.getModifierContext();\n const verticalSpaceNeeded = (num.radius * 2) / Tables.STAVE_LINE_DISTANCE + 0.5;\n if (mc) {\n if (pos === ModifierPosition.ABOVE) {\n num.text_line = mc.getState().top_text_line;\n state.top_text_line += verticalSpaceNeeded;\n }\n else if (pos === ModifierPosition.BELOW) {\n num.text_line = mc.getState().text_line;\n state.text_line += verticalSpaceNeeded;\n }\n }\n if (note !== prev_note) {\n for (let n = 0; n < note.keys.length; ++n) {\n if (left_shift === 0) {\n shift_left = Math.max(note.getLeftDisplacedHeadPx(), shift_left);\n }\n if (right_shift === 0) {\n shift_right = Math.max(note.getRightDisplacedHeadPx(), shift_right);\n }\n }\n prev_note = note;\n }\n const glyphLine = modLines === 0 ? props.line : modLines;\n nums_list.push({\n pos,\n note,\n num,\n line: glyphLine,\n shiftL: shift_left,\n shiftR: shift_right,\n });\n }\n // Sort string numbers by line number.\n nums_list.sort((a, b) => b.line - a.line);\n let num_shiftR = 0;\n let x_widthL = 0;\n let x_widthR = 0;\n let last_line = null;\n let last_note = null;\n for (let i = 0; i < nums_list.length; ++i) {\n let num_shift = 0;\n const note = nums_list[i].note;\n const pos = nums_list[i].pos;\n const num = nums_list[i].num;\n const line = nums_list[i].line;\n const shiftR = nums_list[i].shiftR;\n // Reset the position of the string number every line.\n if (line !== last_line || note !== last_note) {\n num_shiftR = right_shift + shiftR;\n }\n const num_width = num.getWidth() + num_spacing;\n if (pos === Modifier.Position.LEFT) {\n num.setXShift(left_shift);\n num_shift = shift_left + num_width; // spacing\n x_widthL = num_shift > x_widthL ? num_shift : x_widthL;\n }\n else if (pos === Modifier.Position.RIGHT) {\n num.setXShift(num_shiftR);\n num_shift += num_width; // spacing\n x_widthR = num_shift > x_widthR ? num_shift : x_widthR;\n }\n last_line = line;\n last_note = note;\n }\n state.left_shift += x_widthL;\n state.right_shift += x_widthR;\n return true;\n }\n setLineEndType(leg) {\n if (leg >= Renderer.LineEndType.NONE && leg <= Renderer.LineEndType.DOWN) {\n this.leg = leg;\n }\n return this;\n }\n setStringNumber(number) {\n this.string_number = number;\n return this;\n }\n setOffsetX(x) {\n this.x_offset = x;\n return this;\n }\n setOffsetY(y) {\n this.y_offset = y;\n return this;\n }\n setLastNote(note) {\n this.last_note = note;\n return this;\n }\n setDashed(dashed) {\n this.dashed = dashed;\n return this;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(this.position, this.index);\n const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP;\n let dot_x = start.x + this.x_shift + this.x_offset;\n let stem_ext = {};\n if (note.hasStem()) {\n stem_ext = note.checkStem().getExtents();\n }\n let dot_y = start.y + this.y_shift + this.y_offset;\n switch (this.position) {\n case Modifier.Position.ABOVE:\n {\n const ys = note.getYs();\n dot_y = ys.reduce((a, b) => (a < b ? a : b));\n if (note.hasStem() && stemDirection == Stem.UP) {\n dot_y = stem_ext.topY + StringNumber.metrics.stemPadding;\n }\n dot_y -= this.radius + StringNumber.metrics.verticalPadding + this.text_line * Tables.STAVE_LINE_DISTANCE;\n }\n break;\n case Modifier.Position.BELOW:\n {\n const ys = note.getYs();\n dot_y = ys.reduce((a, b) => (a > b ? a : b));\n if (note.hasStem() && stemDirection == Stem.DOWN) {\n dot_y = stem_ext.topY - StringNumber.metrics.stemPadding;\n }\n dot_y += this.radius + StringNumber.metrics.verticalPadding + this.text_line * Tables.STAVE_LINE_DISTANCE;\n }\n break;\n case Modifier.Position.LEFT:\n dot_x -= this.radius / 2 + StringNumber.metrics.leftPadding;\n break;\n case Modifier.Position.RIGHT:\n dot_x += this.radius / 2 + StringNumber.metrics.rightPadding;\n break;\n default:\n throw new RuntimeError('InvalidPosition', `The position ${this.position} is invalid`);\n }\n ctx.save();\n ctx.beginPath();\n ctx.arc(dot_x, dot_y, this.radius, 0, Math.PI * 2, false);\n ctx.setLineWidth(1.5);\n ctx.stroke();\n ctx.setFont(this.textFont);\n const x = dot_x - ctx.measureText(this.string_number).width / 2;\n ctx.fillText('' + this.string_number, x, dot_y + 4.5);\n const lastNote = this.last_note;\n if (isStemmableNote(lastNote)) {\n // Only StemmableNote objects have getStemX().\n const end = lastNote.getStemX() - note.getX() + 5;\n ctx.setStrokeStyle('#000000');\n ctx.setLineCap('round');\n ctx.setLineWidth(0.6);\n if (this.dashed) {\n Renderer.drawDashedLine(ctx, dot_x + 10, dot_y, dot_x + end, dot_y, [3, 3]);\n }\n else {\n Renderer.drawDashedLine(ctx, dot_x + 10, dot_y, dot_x + end, dot_y, [3, 0]);\n }\n let len;\n let pattern;\n switch (this.leg) {\n case Renderer.LineEndType.UP:\n len = -10;\n pattern = this.dashed ? [3, 3] : [3, 0];\n Renderer.drawDashedLine(ctx, dot_x + end, dot_y, dot_x + end, dot_y + len, pattern);\n break;\n case Renderer.LineEndType.DOWN:\n len = 10;\n pattern = this.dashed ? [3, 3] : [3, 0];\n Renderer.drawDashedLine(ctx, dot_x + end, dot_y, dot_x + end, dot_y + len, pattern);\n break;\n default:\n break;\n }\n }\n ctx.restore();\n }\n}\nStringNumber.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: Font.SIZE,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Larry Kuhns\n//\n// This file implements the `Stroke` class which renders chord strokes\n// that can be arpeggiated, brushed, rasquedo, etc.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Category, isNote, isStaveNote, isTabNote } from './typeguard';\nimport { RuntimeError } from './util';\nexport class Stroke extends Modifier {\n constructor(type, options) {\n super();\n this.options = Object.assign({ all_voices: true }, options);\n // multi voice - span stroke across all voices if true\n this.all_voices = this.options.all_voices;\n // multi voice - end note of stroke, set in draw()\n this.type = type;\n this.position = Modifier.Position.LEFT;\n this.render_options = {\n font_scale: 38,\n };\n this.resetFont();\n this.setXShift(0);\n this.setWidth(10);\n }\n static get CATEGORY() {\n return Category.Stroke;\n }\n // Arrange strokes inside `ModifierContext`\n static format(strokes, state) {\n const left_shift = state.left_shift;\n const stroke_spacing = 0;\n if (!strokes || strokes.length === 0)\n return false;\n const strokeList = strokes.map((stroke) => {\n const note = stroke.getNote();\n const index = stroke.checkIndex();\n if (isStaveNote(note)) {\n // Only StaveNote objects have getKeyProps().\n const { line } = note.getKeyProps()[index];\n const shift = note.getLeftDisplacedHeadPx();\n return { line, shift, stroke };\n }\n else if (isTabNote(note)) {\n // Only TabNote objects have getPositions().\n const { str: string } = note.getPositions()[index];\n return { line: string, shift: 0, stroke };\n }\n else {\n throw new RuntimeError('Internal', 'Unexpected instance.');\n }\n });\n const strokeShift = left_shift;\n // There can only be one stroke .. if more than one, they overlay each other\n const xShift = strokeList.reduce((xShift, { stroke, shift }) => {\n stroke.setXShift(strokeShift + shift);\n return Math.max(stroke.getWidth() + stroke_spacing, xShift);\n }, 0);\n state.left_shift += xShift;\n return true;\n }\n getPosition() {\n return this.position;\n }\n addEndNote(note) {\n this.note_end = note;\n return this;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(this.position, this.index);\n let ys = note.getYs();\n let topY = start.y;\n let botY = start.y;\n const x = start.x - 5;\n const line_space = note.checkStave().getSpacingBetweenLines();\n const notes = this.checkModifierContext().getMembers(note.getCategory());\n for (let i = 0; i < notes.length; i++) {\n const note = notes[i];\n if (isNote(note)) {\n // Only Note objects have getYs().\n // note is an instance of either StaveNote or TabNote.\n ys = note.getYs();\n for (let n = 0; n < ys.length; n++) {\n if (this.note === notes[i] || this.all_voices) {\n topY = Math.min(topY, ys[n]);\n botY = Math.max(botY, ys[n]);\n }\n }\n }\n }\n let arrow = '';\n let arrow_shift_x = 0;\n let arrow_y = 0;\n let text_shift_x = 0;\n let text_y = 0;\n switch (this.type) {\n case Stroke.Type.BRUSH_DOWN:\n arrow = 'arrowheadBlackUp';\n arrow_shift_x = -3;\n arrow_y = topY - line_space / 2 + 10;\n botY += line_space / 2;\n break;\n case Stroke.Type.BRUSH_UP:\n arrow = 'arrowheadBlackDown';\n arrow_shift_x = 0.5;\n arrow_y = botY + line_space / 2;\n topY -= line_space / 2;\n break;\n case Stroke.Type.ROLL_DOWN:\n case Stroke.Type.RASQUEDO_DOWN:\n arrow = 'arrowheadBlackUp';\n arrow_shift_x = -3;\n text_shift_x = this.x_shift + arrow_shift_x - 2;\n if (isStaveNote(note)) {\n topY += 1.5 * line_space;\n if ((botY - topY) % 2 !== 0) {\n botY += 0.5 * line_space;\n }\n else {\n botY += line_space;\n }\n arrow_y = topY - line_space;\n text_y = botY + line_space + 2;\n }\n else {\n topY += 1.5 * line_space;\n botY += line_space;\n arrow_y = topY - 0.75 * line_space;\n text_y = botY + 0.25 * line_space;\n }\n break;\n case Stroke.Type.ROLL_UP:\n case Stroke.Type.RASQUEDO_UP:\n arrow = 'arrowheadBlackDown';\n arrow_shift_x = -4;\n text_shift_x = this.x_shift + arrow_shift_x - 1;\n if (isStaveNote(note)) {\n arrow_y = line_space / 2;\n topY += 0.5 * line_space;\n if ((botY - topY) % 2 === 0) {\n botY += line_space / 2;\n }\n arrow_y = botY + 0.5 * line_space;\n text_y = topY - 1.25 * line_space;\n }\n else {\n topY += 0.25 * line_space;\n botY += 0.5 * line_space;\n arrow_y = botY + 0.25 * line_space;\n text_y = topY - line_space;\n }\n break;\n case Stroke.Type.ARPEGGIO_DIRECTIONLESS:\n topY += 0.5 * line_space;\n botY += line_space; // * 0.5 can lead to slight underlap instead of overlap sometimes\n break;\n default:\n throw new RuntimeError('InvalidType', `The stroke type ${this.type} does not exist`);\n }\n let strokeLine = 'straight';\n // Draw the stroke\n if (this.type === Stroke.Type.BRUSH_DOWN || this.type === Stroke.Type.BRUSH_UP) {\n ctx.fillRect(x + this.x_shift, topY, 1, botY - topY);\n }\n else {\n strokeLine = 'wiggly';\n if (isStaveNote(note)) {\n for (let i = topY; i <= botY; i += line_space) {\n Glyph.renderGlyph(ctx, x + this.x_shift - 4, i, this.render_options.font_scale, 'vexWiggleArpeggioUp');\n }\n }\n else {\n let i;\n for (i = topY; i <= botY; i += 10) {\n Glyph.renderGlyph(ctx, x + this.x_shift - 4, i, this.render_options.font_scale, 'vexWiggleArpeggioUp');\n }\n if (this.type === Stroke.Type.RASQUEDO_DOWN) {\n text_y = i + 0.25 * line_space;\n }\n }\n }\n if (this.type === Stroke.Type.ARPEGGIO_DIRECTIONLESS) {\n return; // skip drawing arrow heads or text\n }\n // Draw the arrow head\n Glyph.renderGlyph(ctx, x + this.x_shift + arrow_shift_x, arrow_y, this.render_options.font_scale, arrow, {\n category: `stroke.${arrow}.${strokeLine}`,\n });\n // Draw the rasquedo \"R\"\n if (this.type === Stroke.Type.RASQUEDO_DOWN || this.type === Stroke.Type.RASQUEDO_UP) {\n ctx.save();\n ctx.setFont(this.textFont);\n ctx.fillText('R', x + text_shift_x, text_y);\n ctx.restore();\n }\n }\n}\nStroke.Type = {\n BRUSH_DOWN: 1,\n BRUSH_UP: 2,\n ROLL_DOWN: 3,\n ROLL_UP: 4,\n RASQUEDO_DOWN: 5,\n RASQUEDO_UP: 6,\n ARPEGGIO_DIRECTIONLESS: 7, // Arpeggiated chord without upwards or downwards arrow\n};\nStroke.TEXT_FONT = {\n family: Font.SERIF,\n size: Font.SIZE,\n weight: FontWeight.BOLD,\n style: FontStyle.ITALIC,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// @author Gregory Ristow (2015)\nimport { Font, FontStyle, FontWeight } from './font';\nimport { RenderContext } from './rendercontext';\nimport { normalizeAngle, prefix, RuntimeError } from './util';\n/** For a particular element type (e.g., rect), we will not apply certain presentation attributes. */\nconst ATTRIBUTES_TO_IGNORE = {\n path: {\n x: true,\n y: true,\n width: true,\n height: true,\n 'font-family': true,\n 'font-weight': true,\n 'font-style': true,\n 'font-size': true,\n },\n rect: {\n 'font-family': true,\n 'font-weight': true,\n 'font-style': true,\n 'font-size': true,\n },\n text: {\n width: true,\n height: true,\n },\n};\n/** Create the SVG in the SVG namespace. */\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst TWO_PI = 2 * Math.PI;\nclass MeasureTextCache {\n constructor() {\n // The cache is keyed first by the text string, then by the font attributes\n // joined together.\n this.cache = {};\n }\n lookup(text, svg, attributes) {\n let entries = this.cache[text];\n if (entries === undefined) {\n entries = {};\n this.cache[text] = entries;\n }\n const family = attributes['font-family'];\n const size = attributes['font-size'];\n const weight = attributes['font-weight'];\n const style = attributes['font-style'];\n const key = `${family}%${size}%${weight}%${style}`;\n let entry = entries[key];\n if (entry === undefined) {\n entry = this.measureImpl(text, svg, attributes);\n entries[key] = entry;\n }\n return entry;\n }\n measureImpl(text, svg, attributes) {\n let txt = this.txt;\n if (!txt) {\n // Create the SVG text element that will be used to measure text in the event\n // of a cache miss.\n txt = document.createElementNS(SVG_NS, 'text');\n this.txt = txt;\n }\n txt.textContent = text;\n txt.setAttributeNS(null, 'font-family', attributes['font-family']);\n txt.setAttributeNS(null, 'font-size', attributes['font-size']);\n txt.setAttributeNS(null, 'font-style', attributes['font-style']);\n txt.setAttributeNS(null, 'font-weight', attributes['font-weight']);\n svg.appendChild(txt);\n const bbox = txt.getBBox();\n svg.removeChild(txt);\n return { x: bbox.x, y: bbox.y, width: bbox.width, height: bbox.height };\n }\n}\n/**\n * SVG rendering context with an API similar to CanvasRenderingContext2D.\n */\nexport class SVGContext extends RenderContext {\n constructor(element) {\n super();\n this.width = 0;\n this.height = 0;\n this.backgroundFillStyle = 'white';\n /** Formatted as CSS font shorthand (e.g., 'italic bold 12pt Arial') */\n this.fontCSSString = '';\n this.element = element;\n // Create a SVG element and add it to the container element.\n const svg = this.create('svg');\n this.element.appendChild(svg);\n this.svg = svg;\n this.parent = this.svg;\n this.groups = [this.svg];\n this.path = '';\n this.pen = { x: NaN, y: NaN };\n this.lineWidth = 1.0;\n const defaultFontAttributes = {\n 'font-family': Font.SANS_SERIF,\n 'font-size': Font.SIZE + 'pt',\n 'font-weight': FontWeight.NORMAL,\n 'font-style': FontStyle.NORMAL,\n };\n this.state = Object.assign({ scale: { x: 1, y: 1 } }, defaultFontAttributes);\n this.attributes = Object.assign({ 'stroke-width': 0.3, 'stroke-dasharray': 'none', fill: 'black', stroke: 'black' }, defaultFontAttributes);\n this.shadow_attributes = {\n width: 0,\n color: 'black',\n };\n this.state_stack = [];\n }\n create(svgElementType) {\n return document.createElementNS(SVG_NS, svgElementType);\n }\n // Allow grouping elements in containers for interactivity.\n openGroup(cls, id, attrs) {\n const group = this.create('g');\n this.groups.push(group);\n this.parent.appendChild(group);\n this.parent = group;\n if (cls)\n group.setAttribute('class', prefix(cls));\n if (id)\n group.setAttribute('id', prefix(id));\n if (attrs && attrs.pointerBBox) {\n group.setAttribute('pointer-events', 'bounding-box');\n }\n return group;\n }\n closeGroup() {\n this.groups.pop();\n this.parent = this.groups[this.groups.length - 1];\n }\n add(elem) {\n this.parent.appendChild(elem);\n }\n setFillStyle(style) {\n this.attributes.fill = style;\n return this;\n }\n /**\n * Used to set the fill color for `clearRect()`. This allows us to simulate\n * cutting a \"hole\" into the SVG drawing.\n */\n setBackgroundFillStyle(style) {\n this.backgroundFillStyle = style;\n return this;\n }\n setStrokeStyle(style) {\n this.attributes.stroke = style;\n return this;\n }\n setShadowColor(color) {\n this.shadow_attributes.color = color;\n return this;\n }\n /**\n * @param blur A non-negative float specifying the level of shadow blur, where 0\n * represents no blur and larger numbers represent increasingly more blur.\n * @returns this\n */\n setShadowBlur(blur) {\n this.shadow_attributes.width = blur;\n return this;\n }\n /**\n * @param width\n * @returns this\n */\n setLineWidth(width) {\n this.attributes['stroke-width'] = width;\n this.lineWidth = width;\n return this;\n }\n /**\n * @param lineDash an array of integers in the form of [dash, space, dash, space, etc...]\n * @returns this\n *\n * See: [SVG `stroke-dasharray` attribute](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray)\n */\n setLineDash(lineDash) {\n if (Object.prototype.toString.call(lineDash) === '[object Array]') {\n this.attributes['stroke-dasharray'] = lineDash.join(',');\n return this;\n }\n else {\n throw new RuntimeError('ArgumentError', 'lineDash must be an array of integers.');\n }\n }\n /**\n * @param capType\n * @returns this\n */\n setLineCap(capType) {\n this.attributes['stroke-linecap'] = capType;\n return this;\n }\n // ### Sizing & Scaling Methods:\n // TODO (GCR): See note at scale() -- separate our internal\n // conception of pixel-based width/height from the style.width\n // and style.height properties eventually to allow users to\n // apply responsive sizing attributes to the SVG.\n resize(width, height) {\n this.width = width;\n this.height = height;\n this.element.style.width = width.toString();\n this.svg.style.width = width.toString();\n this.svg.style.height = height.toString();\n const attributes = {\n width,\n height,\n };\n this.applyAttributes(this.svg, attributes);\n this.scale(this.state.scale.x, this.state.scale.y);\n return this;\n }\n scale(x, y) {\n // uses viewBox to scale\n // TODO (GCR): we may at some point want to distinguish the\n // style.width / style.height properties that are applied to\n // the SVG object from our internal conception of the SVG\n // width/height. This would allow us to create automatically\n // scaling SVG's that filled their containers, for instance.\n //\n // As this isn't implemented in Canvas contexts,\n // I've left as is for now, but in using the viewBox to\n // handle internal scaling, am trying to make it possible\n // for us to eventually move in that direction.\n this.state.scale = { x, y };\n const visibleWidth = this.width / x;\n const visibleHeight = this.height / y;\n this.setViewBox(0, 0, visibleWidth, visibleHeight);\n return this;\n }\n /**\n * 1 arg: string in the \"x y w h\" format\n * 4 args: x:number, y:number, w:number, h:number\n */\n setViewBox(viewBox_or_minX, minY, width, height) {\n if (typeof viewBox_or_minX === 'string') {\n this.svg.setAttribute('viewBox', viewBox_or_minX);\n }\n else {\n const viewBoxString = viewBox_or_minX + ' ' + minY + ' ' + width + ' ' + height;\n this.svg.setAttribute('viewBox', viewBoxString);\n }\n }\n // ### Drawing helper methods:\n applyAttributes(element, attributes) {\n const attrNamesToIgnore = ATTRIBUTES_TO_IGNORE[element.nodeName];\n for (const attrName in attributes) {\n if (attrNamesToIgnore && attrNamesToIgnore[attrName]) {\n continue;\n }\n element.setAttributeNS(null, attrName, attributes[attrName]);\n }\n return element;\n }\n // ### Shape & Path Methods:\n clear() {\n // Clear the SVG by removing all inner children.\n // (This approach is usually slightly more efficient\n // than removing the old SVG & adding a new one to\n // the container element, since it does not cause the\n // container to resize twice. Also, the resize\n // triggered by removing the entire SVG can trigger\n // a touchcancel event when the element resizes away\n // from a touch point.)\n while (this.svg.lastChild) {\n this.svg.removeChild(this.svg.lastChild);\n }\n // Replace the viewbox attribute we just removed.\n this.scale(this.state.scale.x, this.state.scale.y);\n }\n // ## Rectangles:\n rect(x, y, width, height, attributes) {\n // Avoid invalid negative height attributes by flipping the rectangle on its head:\n if (height < 0) {\n y += height;\n height *= -1;\n }\n const rectangle = this.create('rect');\n attributes = attributes !== null && attributes !== void 0 ? attributes : { fill: 'none', 'stroke-width': this.lineWidth, stroke: 'black' };\n this.applyAttributes(rectangle, Object.assign({ x, y, width, height }, attributes));\n this.add(rectangle);\n return this;\n }\n fillRect(x, y, width, height) {\n const attributes = { fill: this.attributes.fill };\n this.rect(x, y, width, height, attributes);\n return this;\n }\n clearRect(x, y, width, height) {\n // Currently this fills a rect with the backgroundFillStyle, rather\n // than \"cut a hole\" into the existing shapes.\n //\n // Since tabNote seems to be the only module that makes use of this\n // it may be worth creating a separate tabStave that would\n // draw lines around locations of tablature fingering.\n this.rect(x, y, width, height, { 'stroke-width': 0, fill: this.backgroundFillStyle });\n return this;\n }\n // ## Paths:\n beginPath() {\n this.path = '';\n this.pen.x = NaN;\n this.pen.y = NaN;\n return this;\n }\n moveTo(x, y) {\n this.path += 'M' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n lineTo(x, y) {\n this.path += 'L' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n bezierCurveTo(x1, y1, x2, y2, x, y) {\n this.path += 'C' + x1 + ' ' + y1 + ',' + x2 + ' ' + y2 + ',' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n quadraticCurveTo(x1, y1, x, y) {\n this.path += 'Q' + x1 + ' ' + y1 + ',' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n arc(x, y, radius, startAngle, endAngle, counterclockwise) {\n const x0 = x + radius * Math.cos(startAngle);\n const y0 = y + radius * Math.sin(startAngle);\n // Handle the edge case where arc length is greater than or equal to\n // the circle's circumference:\n // https://html.spec.whatwg.org/multipage/canvas.html#ellipse-method-steps\n if ((!counterclockwise && endAngle - startAngle >= TWO_PI) ||\n (counterclockwise && startAngle - endAngle >= TWO_PI)) {\n const x1 = x + radius * Math.cos(startAngle + Math.PI);\n const y1 = y + radius * Math.sin(startAngle + Math.PI);\n // There's no way to specify a completely circular arc in SVG so we have to\n // use two semi-circular arcs.\n this.path += `M${x0} ${y0} A${radius} ${radius} 0 0 0 ${x1} ${y1} `;\n this.path += `A${radius} ${radius} 0 0 0 ${x0} ${y0}`;\n this.pen.x = x0;\n this.pen.y = y0;\n }\n else {\n const x1 = x + radius * Math.cos(endAngle);\n const y1 = y + radius * Math.sin(endAngle);\n startAngle = normalizeAngle(startAngle);\n endAngle = normalizeAngle(endAngle);\n let large;\n if (Math.abs(endAngle - startAngle) < Math.PI) {\n large = counterclockwise;\n }\n else {\n large = !counterclockwise;\n }\n if (startAngle > endAngle) {\n large = !large;\n }\n const sweep = !counterclockwise;\n this.path += `M${x0} ${y0} A${radius} ${radius} 0 ${+large} ${+sweep} ${x1} ${y1}`;\n this.pen.x = x1;\n this.pen.y = y1;\n }\n return this;\n }\n closePath() {\n this.path += 'Z';\n return this;\n }\n getShadowStyle() {\n const sa = this.shadow_attributes;\n // A CSS drop-shadow filter blur looks different than a canvas shadowBlur\n // of the same radius, so we scale the drop-shadow radius here to make it\n // look close to the canvas shadow.\n return `filter: drop-shadow(0 0 ${sa.width / 1.5}px ${sa.color})`;\n }\n fill(attributes) {\n const path = this.create('path');\n if (typeof attributes === 'undefined') {\n attributes = Object.assign(Object.assign({}, this.attributes), { stroke: 'none' });\n }\n attributes.d = this.path;\n if (this.shadow_attributes.width > 0) {\n attributes.style = this.getShadowStyle();\n }\n this.applyAttributes(path, attributes);\n this.add(path);\n return this;\n }\n stroke() {\n const path = this.create('path');\n const attributes = Object.assign(Object.assign({}, this.attributes), { fill: 'none', 'stroke-width': this.lineWidth, d: this.path });\n if (this.shadow_attributes.width > 0) {\n attributes.style = this.getShadowStyle();\n }\n this.applyAttributes(path, attributes);\n this.add(path);\n return this;\n }\n // ## Text Methods:\n measureText(text) {\n return SVGContext.measureTextCache.lookup(text, this.svg, this.attributes);\n }\n fillText(text, x, y) {\n if (!text || text.length <= 0) {\n return this;\n }\n const attributes = Object.assign(Object.assign({}, this.attributes), { stroke: 'none', x,\n y });\n const txt = this.create('text');\n txt.textContent = text;\n this.applyAttributes(txt, attributes);\n this.add(txt);\n return this;\n }\n // TODO: State should be deep-copied.\n save() {\n this.state_stack.push({\n state: {\n 'font-family': this.state['font-family'],\n 'font-weight': this.state['font-weight'],\n 'font-style': this.state['font-style'],\n 'font-size': this.state['font-size'],\n scale: this.state.scale,\n },\n attributes: {\n 'font-family': this.attributes['font-family'],\n 'font-weight': this.attributes['font-weight'],\n 'font-style': this.attributes['font-style'],\n 'font-size': this.attributes['font-size'],\n fill: this.attributes.fill,\n stroke: this.attributes.stroke,\n 'stroke-width': this.attributes['stroke-width'],\n 'stroke-dasharray': this.attributes['stroke-dasharray'],\n },\n shadow_attributes: {\n width: this.shadow_attributes.width,\n color: this.shadow_attributes.color,\n },\n lineWidth: this.lineWidth,\n });\n return this;\n }\n // TODO: State should be deep-restored.\n restore() {\n const savedState = this.state_stack.pop();\n if (savedState) {\n const state = savedState;\n this.state['font-family'] = state.state['font-family'];\n this.state['font-weight'] = state.state['font-weight'];\n this.state['font-style'] = state.state['font-style'];\n this.state['font-size'] = state.state['font-size'];\n this.state.scale = state.state.scale;\n this.attributes['font-family'] = state.attributes['font-family'];\n this.attributes['font-weight'] = state.attributes['font-weight'];\n this.attributes['font-style'] = state.attributes['font-style'];\n this.attributes['font-size'] = state.attributes['font-size'];\n this.attributes.fill = state.attributes.fill;\n this.attributes.stroke = state.attributes.stroke;\n this.attributes['stroke-width'] = state.attributes['stroke-width'];\n this.attributes['stroke-dasharray'] = state.attributes['stroke-dasharray'];\n this.shadow_attributes.width = state.shadow_attributes.width;\n this.shadow_attributes.color = state.shadow_attributes.color;\n this.lineWidth = state.lineWidth;\n }\n return this;\n }\n set fillStyle(style) {\n this.setFillStyle(style);\n }\n get fillStyle() {\n return this.attributes.fill;\n }\n set strokeStyle(style) {\n this.setStrokeStyle(style);\n }\n get strokeStyle() {\n return this.attributes.stroke;\n }\n /**\n * @param f is 1) a `FontInfo` object or\n * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or\n * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided).\n * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt').\n * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900). It is inserted\n * into the font-weight attribute (e.g., font-weight=\"bold\")\n * @param style is a string (e.g., 'italic', 'normal') that is inserted into the\n * font-style attribute (e.g., font-style=\"italic\")\n */\n setFont(f, size, weight, style) {\n const fontInfo = Font.validate(f, size, weight, style);\n this.fontCSSString = Font.toCSSString(fontInfo);\n const fontAttributes = {\n 'font-family': fontInfo.family,\n 'font-size': fontInfo.size,\n 'font-weight': fontInfo.weight,\n 'font-style': fontInfo.style,\n };\n this.attributes = Object.assign(Object.assign({}, this.attributes), fontAttributes);\n this.state = Object.assign(Object.assign({}, this.state), fontAttributes);\n return this;\n }\n /** Return a string of the form `'italic bold 15pt Arial'` */\n getFont() {\n return this.fontCSSString;\n }\n}\nSVGContext.measureTextCache = new MeasureTextCache();\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { BoundingBox } from './boundingbox';\nimport { Element } from './element';\nimport { Formatter } from './formatter';\nimport { Note } from './note';\nimport { Stave } from './stave';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\n/**\n * System implements a musical system, which is a collection of staves,\n * each which can have one or more voices. All voices across all staves in\n * the system are formatted together.\n */\nexport class System extends Element {\n constructor(params = {}) {\n super();\n this.setOptions(params);\n this.parts = [];\n }\n static get CATEGORY() {\n return Category.System;\n }\n /** Set formatting options. */\n setOptions(options = {}) {\n if (!options.factory) {\n throw new RuntimeError('NoFactory', 'System.setOptions(options) requires a factory.');\n }\n this.factory = options.factory;\n this.options = Object.assign(Object.assign({ factory: this.factory, x: 10, y: 10, width: 500, spaceBetweenStaves: 12, autoWidth: false, noJustification: false, debugFormatter: false, formatIterations: 0, noPadding: false }, options), { details: Object.assign({ alpha: 0.5 }, options.details), formatOptions: Object.assign({}, options.formatOptions) });\n if (this.options.noJustification === false && typeof options.width === 'undefined') {\n this.options.autoWidth = true;\n }\n }\n /** Set associated context. */\n setContext(context) {\n super.setContext(context);\n this.factory.setContext(context);\n return this;\n }\n /**\n * Add connector between staves.\n * @param type see {@link StaveConnector.typeString}\n */\n addConnector(type = 'double') {\n this.connector = this.factory.StaveConnector({\n top_stave: this.parts[0].stave,\n bottom_stave: this.parts[this.parts.length - 1].stave,\n type,\n });\n return this.connector;\n }\n /**\n * Add a stave to the system.\n *\n * Example (one voice):\n *\n * `system.addStave({voices: [score.voice(score.notes('C#5/q, B4, A4, G#4'))]});`\n *\n * Example (two voices):\n *\n * `system.addStave({voices: [`\n * `score.voice(score.notes('C#5/q, B4, A4, G#4', {stem: 'up'})),`\n * `score.voice(score.notes('C#4/h, C#4', {stem: 'down'}))`\n * `]});`\n */\n addStave(params) {\n var _a;\n const staveOptions = Object.assign({ left_bar: false }, params.options);\n const stave = (_a = params.stave) !== null && _a !== void 0 ? _a : this.factory.Stave({ x: this.options.x, y: this.options.y, width: this.options.width, options: staveOptions });\n const p = Object.assign(Object.assign({ stave, \n /* voices: [], */\n spaceAbove: 0, spaceBelow: 0, debugNoteMetrics: false, noJustification: false }, params), { options: staveOptions });\n const ctx = this.getContext();\n p.voices.forEach((voice) => voice\n .setContext(ctx)\n .setStave(stave)\n .getTickables()\n .forEach((tickable) => tickable.setStave(stave)));\n this.parts.push(p);\n return stave;\n }\n /** Format the system. */\n format() {\n const options_details = this.options.details;\n let justifyWidth = 0;\n const formatter = new Formatter(options_details);\n this.formatter = formatter;\n let y = this.options.y;\n let startX = 0;\n let allVoices = [];\n const debugNoteMetricsYs = [];\n // Join the voices for each stave.\n this.parts.forEach((part) => {\n y = y + part.stave.space(part.spaceAbove);\n part.stave.setY(y);\n if (this.options.autoWidth) {\n part.voices.forEach((voice) => {\n formatter.joinVoices([voice]);\n });\n }\n else {\n formatter.joinVoices(part.voices);\n }\n y = y + part.stave.space(part.spaceBelow);\n y = y + part.stave.space(this.options.spaceBetweenStaves);\n if (part.debugNoteMetrics) {\n debugNoteMetricsYs.push({ y, voice: part.voices[0] });\n y += 15;\n }\n allVoices = allVoices.concat(part.voices);\n startX = Math.max(startX, part.stave.getNoteStartX());\n });\n // Update the start position of all staves.\n this.parts.forEach((part) => part.stave.setNoteStartX(startX));\n if (this.options.autoWidth) {\n justifyWidth = formatter.preCalculateMinTotalWidth(allVoices);\n this.parts.forEach((part) => {\n part.stave.setWidth(justifyWidth + Stave.rightPadding + (startX - this.options.x));\n });\n }\n else {\n justifyWidth = this.options.noPadding\n ? this.options.width - this.options.x\n : this.options.width - (startX - this.options.x) - Stave.defaultPadding;\n }\n formatter.format(allVoices, this.options.noJustification ? 0 : justifyWidth, this.options.formatOptions);\n for (let i = 0; i < this.options.formatIterations; i++) {\n formatter.tune(options_details);\n }\n this.startX = startX;\n this.debugNoteMetricsYs = debugNoteMetricsYs;\n this.lastY = y;\n this.boundingBox = new BoundingBox(this.options.x, this.options.y, this.options.width, this.lastY - this.options.y);\n }\n /** Render the system. */\n draw() {\n // Render debugging information, if requested.\n const ctx = this.checkContext();\n if (!this.formatter || !this.startX || !this.lastY || !this.debugNoteMetricsYs) {\n throw new RuntimeError('NoFormatter', 'format() must be called before draw()');\n }\n this.setRendered();\n if (this.options.debugFormatter) {\n Formatter.plotDebugging(ctx, this.formatter, this.startX, this.options.y, this.lastY);\n }\n this.debugNoteMetricsYs.forEach((d) => {\n d.voice.getTickables().forEach((tickable) => Note.plotMetrics(ctx, tickable, d.y));\n });\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { Fraction } from './fraction';\nimport { Glyph } from './glyph';\nimport { RuntimeError } from './util';\nconst RESOLUTION = 16384;\n/**\n * Map duration numbers to 'ticks', the unit of duration used throughout VexFlow.\n * For example, a quarter note is 4, so it maps to RESOLUTION / 4 = 4096 ticks.\n */\nconst durations = {\n '1/2': RESOLUTION * 2,\n 1: RESOLUTION / 1,\n 2: RESOLUTION / 2,\n 4: RESOLUTION / 4,\n 8: RESOLUTION / 8,\n 16: RESOLUTION / 16,\n 32: RESOLUTION / 32,\n 64: RESOLUTION / 64,\n 128: RESOLUTION / 128,\n 256: RESOLUTION / 256,\n};\nconst durationAliases = {\n w: '1',\n h: '2',\n q: '4',\n // This is the default duration used to render bars (BarNote). Bars no longer\n // consume ticks, so this should be a no-op.\n // TODO(0xfe): This needs to be cleaned up.\n b: '256',\n};\nconst keySignatures = {\n C: { num: 0 },\n Am: { num: 0 },\n F: { acc: 'b', num: 1 },\n Dm: { acc: 'b', num: 1 },\n Bb: { acc: 'b', num: 2 },\n Gm: { acc: 'b', num: 2 },\n Eb: { acc: 'b', num: 3 },\n Cm: { acc: 'b', num: 3 },\n Ab: { acc: 'b', num: 4 },\n Fm: { acc: 'b', num: 4 },\n Db: { acc: 'b', num: 5 },\n Bbm: { acc: 'b', num: 5 },\n Gb: { acc: 'b', num: 6 },\n Ebm: { acc: 'b', num: 6 },\n Cb: { acc: 'b', num: 7 },\n Abm: { acc: 'b', num: 7 },\n G: { acc: '#', num: 1 },\n Em: { acc: '#', num: 1 },\n D: { acc: '#', num: 2 },\n Bm: { acc: '#', num: 2 },\n A: { acc: '#', num: 3 },\n 'F#m': { acc: '#', num: 3 },\n E: { acc: '#', num: 4 },\n 'C#m': { acc: '#', num: 4 },\n B: { acc: '#', num: 5 },\n 'G#m': { acc: '#', num: 5 },\n 'F#': { acc: '#', num: 6 },\n 'D#m': { acc: '#', num: 6 },\n 'C#': { acc: '#', num: 7 },\n 'A#m': { acc: '#', num: 7 },\n};\nconst clefs = {\n treble: { line_shift: 0 },\n bass: { line_shift: 6 },\n tenor: { line_shift: 4 },\n alto: { line_shift: 3 },\n soprano: { line_shift: 1 },\n percussion: { line_shift: 0 },\n 'mezzo-soprano': { line_shift: 2 },\n 'baritone-c': { line_shift: 5 },\n 'baritone-f': { line_shift: 5 },\n subbass: { line_shift: 7 },\n french: { line_shift: -1 },\n};\nconst notesInfo = {\n C: { index: 0, int_val: 0 },\n CN: { index: 0, int_val: 0, accidental: 'n' },\n 'C#': { index: 0, int_val: 1, accidental: '#' },\n 'C##': { index: 0, int_val: 2, accidental: '##' },\n CB: { index: 0, int_val: 11, accidental: 'b' },\n CBB: { index: 0, int_val: 10, accidental: 'bb' },\n D: { index: 1, int_val: 2 },\n DN: { index: 1, int_val: 2, accidental: 'n' },\n 'D#': { index: 1, int_val: 3, accidental: '#' },\n 'D##': { index: 1, int_val: 4, accidental: '##' },\n DB: { index: 1, int_val: 1, accidental: 'b' },\n DBB: { index: 1, int_val: 0, accidental: 'bb' },\n E: { index: 2, int_val: 4 },\n EN: { index: 2, int_val: 4, accidental: 'n' },\n 'E#': { index: 2, int_val: 5, accidental: '#' },\n 'E##': { index: 2, int_val: 6, accidental: '##' },\n EB: { index: 2, int_val: 3, accidental: 'b' },\n EBB: { index: 2, int_val: 2, accidental: 'bb' },\n F: { index: 3, int_val: 5 },\n FN: { index: 3, int_val: 5, accidental: 'n' },\n 'F#': { index: 3, int_val: 6, accidental: '#' },\n 'F##': { index: 3, int_val: 7, accidental: '##' },\n FB: { index: 3, int_val: 4, accidental: 'b' },\n FBB: { index: 3, int_val: 3, accidental: 'bb' },\n G: { index: 4, int_val: 7 },\n GN: { index: 4, int_val: 7, accidental: 'n' },\n 'G#': { index: 4, int_val: 8, accidental: '#' },\n 'G##': { index: 4, int_val: 9, accidental: '##' },\n GB: { index: 4, int_val: 6, accidental: 'b' },\n GBB: { index: 4, int_val: 5, accidental: 'bb' },\n A: { index: 5, int_val: 9 },\n AN: { index: 5, int_val: 9, accidental: 'n' },\n 'A#': { index: 5, int_val: 10, accidental: '#' },\n 'A##': { index: 5, int_val: 11, accidental: '##' },\n AB: { index: 5, int_val: 8, accidental: 'b' },\n ABB: { index: 5, int_val: 7, accidental: 'bb' },\n B: { index: 6, int_val: 11 },\n BN: { index: 6, int_val: 11, accidental: 'n' },\n 'B#': { index: 6, int_val: 12, accidental: '#' },\n 'B##': { index: 6, int_val: 13, accidental: '##' },\n BB: { index: 6, int_val: 10, accidental: 'b' },\n BBB: { index: 6, int_val: 9, accidental: 'bb' },\n R: { index: 6, rest: true },\n X: {\n index: 6,\n accidental: '',\n octave: 4,\n code: 'noteheadXBlack',\n shift_right: 5.5,\n },\n};\nconst validNoteTypes = {\n n: { name: 'note' },\n r: { name: 'rest' },\n h: { name: 'harmonic' },\n m: { name: 'muted' },\n s: { name: 'slash' },\n g: { name: 'ghost' },\n};\nconst customNoteHeads = {\n /* Diamond */\n D0: { code: 'noteheadDiamondWhole' },\n D1: { code: 'noteheadDiamondHalf' },\n D2: { code: 'noteheadDiamondBlack' },\n D3: { code: 'noteheadDiamondBlack' },\n /* Triangle */\n T0: { code: 'noteheadTriangleUpWhole' },\n T1: { code: 'noteheadTriangleUpHalf' },\n T2: { code: 'noteheadTriangleUpBlack' },\n T3: { code: 'noteheadTriangleUpBlack' },\n /* Cross */\n X0: { code: 'noteheadXWhole' },\n X1: { code: 'noteheadXHalf' },\n X2: { code: 'noteheadXBlack' },\n X3: { code: 'noteheadCircleX' },\n /* Square */\n S1: { code: 'noteheadSquareWhite' },\n S2: { code: 'noteheadSquareBlack' },\n /* Rectangle */\n R1: { code: 'vexNoteHeadRectWhite' },\n R2: { code: 'vexNoteHeadRectBlack' }, // no smufl code\n};\nconst accidentals = {\n '#': { code: 'accidentalSharp', parenRightPaddingAdjustment: -1 },\n '##': { code: 'accidentalDoubleSharp', parenRightPaddingAdjustment: -1 },\n b: { code: 'accidentalFlat', parenRightPaddingAdjustment: -2 },\n bb: { code: 'accidentalDoubleFlat', parenRightPaddingAdjustment: -2 },\n n: { code: 'accidentalNatural', parenRightPaddingAdjustment: -1 },\n '{': { code: 'accidentalParensLeft', parenRightPaddingAdjustment: -1 },\n '}': { code: 'accidentalParensRight', parenRightPaddingAdjustment: -1 },\n db: { code: 'accidentalThreeQuarterTonesFlatZimmermann', parenRightPaddingAdjustment: -1 },\n d: { code: 'accidentalQuarterToneFlatStein', parenRightPaddingAdjustment: 0 },\n '++': { code: 'accidentalThreeQuarterTonesSharpStein', parenRightPaddingAdjustment: -1 },\n '+': { code: 'accidentalQuarterToneSharpStein', parenRightPaddingAdjustment: -1 },\n '+-': { code: 'accidentalKucukMucennebSharp', parenRightPaddingAdjustment: -1 },\n bs: { code: 'accidentalBakiyeFlat', parenRightPaddingAdjustment: -1 },\n bss: { code: 'accidentalBuyukMucennebFlat', parenRightPaddingAdjustment: -1 },\n o: { code: 'accidentalSori', parenRightPaddingAdjustment: -1 },\n k: { code: 'accidentalKoron', parenRightPaddingAdjustment: -1 },\n bbs: { code: 'vexAccidentalMicrotonal1', parenRightPaddingAdjustment: -1 },\n '++-': { code: 'vexAccidentalMicrotonal2', parenRightPaddingAdjustment: -1 },\n ashs: { code: 'vexAccidentalMicrotonal3', parenRightPaddingAdjustment: -1 },\n afhf: { code: 'vexAccidentalMicrotonal4', parenRightPaddingAdjustment: -1 },\n accSagittal5v7KleismaUp: { code: 'accSagittal5v7KleismaUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v7KleismaDown: { code: 'accSagittal5v7KleismaDown', parenRightPaddingAdjustment: -1 },\n accSagittal5CommaUp: { code: 'accSagittal5CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal5CommaDown: { code: 'accSagittal5CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal7CommaUp: { code: 'accSagittal7CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal7CommaDown: { code: 'accSagittal7CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal25SmallDiesisUp: { code: 'accSagittal25SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal25SmallDiesisDown: { code: 'accSagittal25SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal35MediumDiesisUp: { code: 'accSagittal35MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal35MediumDiesisDown: { code: 'accSagittal35MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal11MediumDiesisUp: { code: 'accSagittal11MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal11MediumDiesisDown: { code: 'accSagittal11MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal11LargeDiesisUp: { code: 'accSagittal11LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal11LargeDiesisDown: { code: 'accSagittal11LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal35LargeDiesisUp: { code: 'accSagittal35LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal35LargeDiesisDown: { code: 'accSagittal35LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp25SDown: { code: 'accSagittalSharp25SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat25SUp: { code: 'accSagittalFlat25SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7CDown: { code: 'accSagittalSharp7CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7CUp: { code: 'accSagittalFlat7CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5CDown: { code: 'accSagittalSharp5CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5CUp: { code: 'accSagittalFlat5CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v7kDown: { code: 'accSagittalSharp5v7kDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v7kUp: { code: 'accSagittalFlat5v7kUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp: { code: 'accSagittalSharp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat: { code: 'accSagittalFlat', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v7kUp: { code: 'accSagittalSharp5v7kUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v7kDown: { code: 'accSagittalFlat5v7kDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5CUp: { code: 'accSagittalSharp5CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5CDown: { code: 'accSagittalFlat5CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7CUp: { code: 'accSagittalSharp7CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7CDown: { code: 'accSagittalFlat7CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp25SUp: { code: 'accSagittalSharp25SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat25SDown: { code: 'accSagittalFlat25SDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp35MUp: { code: 'accSagittalSharp35MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat35MDown: { code: 'accSagittalFlat35MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11MUp: { code: 'accSagittalSharp11MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11MDown: { code: 'accSagittalFlat11MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11LUp: { code: 'accSagittalSharp11LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11LDown: { code: 'accSagittalFlat11LDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp35LUp: { code: 'accSagittalSharp35LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat35LDown: { code: 'accSagittalFlat35LDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp25SDown: { code: 'accSagittalDoubleSharp25SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat25SUp: { code: 'accSagittalDoubleFlat25SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp7CDown: { code: 'accSagittalDoubleSharp7CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat7CUp: { code: 'accSagittalDoubleFlat7CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5CDown: { code: 'accSagittalDoubleSharp5CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5CUp: { code: 'accSagittalDoubleFlat5CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5v7kDown: { code: 'accSagittalDoubleSharp5v7kDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5v7kUp: { code: 'accSagittalDoubleFlat5v7kUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp: { code: 'accSagittalDoubleSharp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat: { code: 'accSagittalDoubleFlat', parenRightPaddingAdjustment: -1 },\n accSagittal7v11KleismaUp: { code: 'accSagittal7v11KleismaUp', parenRightPaddingAdjustment: -1 },\n accSagittal7v11KleismaDown: { code: 'accSagittal7v11KleismaDown', parenRightPaddingAdjustment: -1 },\n accSagittal17CommaUp: { code: 'accSagittal17CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal17CommaDown: { code: 'accSagittal17CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal55CommaUp: { code: 'accSagittal55CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal55CommaDown: { code: 'accSagittal55CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal7v11CommaUp: { code: 'accSagittal7v11CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal7v11CommaDown: { code: 'accSagittal7v11CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v11SmallDiesisUp: { code: 'accSagittal5v11SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v11SmallDiesisDown: { code: 'accSagittal5v11SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v11SDown: { code: 'accSagittalSharp5v11SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v11SUp: { code: 'accSagittalFlat5v11SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v11CDown: { code: 'accSagittalSharp7v11CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v11CUp: { code: 'accSagittalFlat7v11CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp55CDown: { code: 'accSagittalSharp55CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat55CUp: { code: 'accSagittalFlat55CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp17CDown: { code: 'accSagittalSharp17CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat17CUp: { code: 'accSagittalFlat17CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v11kDown: { code: 'accSagittalSharp7v11kDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v11kUp: { code: 'accSagittalFlat7v11kUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v11kUp: { code: 'accSagittalSharp7v11kUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v11kDown: { code: 'accSagittalFlat7v11kDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp17CUp: { code: 'accSagittalSharp17CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat17CDown: { code: 'accSagittalFlat17CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp55CUp: { code: 'accSagittalSharp55CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat55CDown: { code: 'accSagittalFlat55CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v11CUp: { code: 'accSagittalSharp7v11CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v11CDown: { code: 'accSagittalFlat7v11CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v11SUp: { code: 'accSagittalSharp5v11SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v11SDown: { code: 'accSagittalFlat5v11SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5v11SDown: { code: 'accSagittalDoubleSharp5v11SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5v11SUp: { code: 'accSagittalDoubleFlat5v11SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp7v11CDown: { code: 'accSagittalDoubleSharp7v11CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat7v11CUp: { code: 'accSagittalDoubleFlat7v11CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp55CDown: { code: 'accSagittalDoubleSharp55CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat55CUp: { code: 'accSagittalDoubleFlat55CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp17CDown: { code: 'accSagittalDoubleSharp17CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat17CUp: { code: 'accSagittalDoubleFlat17CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp7v11kDown: { code: 'accSagittalDoubleSharp7v11kDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat7v11kUp: { code: 'accSagittalDoubleFlat7v11kUp', parenRightPaddingAdjustment: -1 },\n accSagittal23CommaUp: { code: 'accSagittal23CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal23CommaDown: { code: 'accSagittal23CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v19CommaUp: { code: 'accSagittal5v19CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v19CommaDown: { code: 'accSagittal5v19CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v23SmallDiesisUp: { code: 'accSagittal5v23SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v23SmallDiesisDown: { code: 'accSagittal5v23SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v23SDown: { code: 'accSagittalSharp5v23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v23SUp: { code: 'accSagittalFlat5v23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v19CDown: { code: 'accSagittalSharp5v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v19CUp: { code: 'accSagittalFlat5v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp23CDown: { code: 'accSagittalSharp23CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat23CUp: { code: 'accSagittalFlat23CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp23CUp: { code: 'accSagittalSharp23CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat23CDown: { code: 'accSagittalFlat23CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v19CUp: { code: 'accSagittalSharp5v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v19CDown: { code: 'accSagittalFlat5v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v23SUp: { code: 'accSagittalSharp5v23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v23SDown: { code: 'accSagittalFlat5v23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5v23SDown: { code: 'accSagittalDoubleSharp5v23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5v23SUp: { code: 'accSagittalDoubleFlat5v23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5v19CDown: { code: 'accSagittalDoubleSharp5v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5v19CUp: { code: 'accSagittalDoubleFlat5v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp23CDown: { code: 'accSagittalDoubleSharp23CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat23CUp: { code: 'accSagittalDoubleFlat23CUp', parenRightPaddingAdjustment: -1 },\n accSagittal19SchismaUp: { code: 'accSagittal19SchismaUp', parenRightPaddingAdjustment: -1 },\n accSagittal19SchismaDown: { code: 'accSagittal19SchismaDown', parenRightPaddingAdjustment: -1 },\n accSagittal17KleismaUp: { code: 'accSagittal17KleismaUp', parenRightPaddingAdjustment: -1 },\n accSagittal17KleismaDown: { code: 'accSagittal17KleismaDown', parenRightPaddingAdjustment: -1 },\n accSagittal143CommaUp: { code: 'accSagittal143CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal143CommaDown: { code: 'accSagittal143CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal11v49CommaUp: { code: 'accSagittal11v49CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal11v49CommaDown: { code: 'accSagittal11v49CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal19CommaUp: { code: 'accSagittal19CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal19CommaDown: { code: 'accSagittal19CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal7v19CommaUp: { code: 'accSagittal7v19CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal7v19CommaDown: { code: 'accSagittal7v19CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal49SmallDiesisUp: { code: 'accSagittal49SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal49SmallDiesisDown: { code: 'accSagittal49SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal23SmallDiesisUp: { code: 'accSagittal23SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal23SmallDiesisDown: { code: 'accSagittal23SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v13MediumDiesisUp: { code: 'accSagittal5v13MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v13MediumDiesisDown: { code: 'accSagittal5v13MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal11v19MediumDiesisUp: { code: 'accSagittal11v19MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal11v19MediumDiesisDown: { code: 'accSagittal11v19MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal49MediumDiesisUp: { code: 'accSagittal49MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal49MediumDiesisDown: { code: 'accSagittal49MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v49MediumDiesisUp: { code: 'accSagittal5v49MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v49MediumDiesisDown: { code: 'accSagittal5v49MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal49LargeDiesisUp: { code: 'accSagittal49LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal49LargeDiesisDown: { code: 'accSagittal49LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal11v19LargeDiesisUp: { code: 'accSagittal11v19LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal11v19LargeDiesisDown: { code: 'accSagittal11v19LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v13LargeDiesisUp: { code: 'accSagittal5v13LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v13LargeDiesisDown: { code: 'accSagittal5v13LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp23SDown: { code: 'accSagittalSharp23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat23SUp: { code: 'accSagittalFlat23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp49SDown: { code: 'accSagittalSharp49SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat49SUp: { code: 'accSagittalFlat49SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v19CDown: { code: 'accSagittalSharp7v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v19CUp: { code: 'accSagittalFlat7v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp19CDown: { code: 'accSagittalSharp19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat19CUp: { code: 'accSagittalFlat19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11v49CDown: { code: 'accSagittalSharp11v49CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11v49CUp: { code: 'accSagittalFlat11v49CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp143CDown: { code: 'accSagittalSharp143CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat143CUp: { code: 'accSagittalFlat143CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp17kDown: { code: 'accSagittalSharp17kDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat17kUp: { code: 'accSagittalFlat17kUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp19sDown: { code: 'accSagittalSharp19sDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat19sUp: { code: 'accSagittalFlat19sUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp19sUp: { code: 'accSagittalSharp19sUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat19sDown: { code: 'accSagittalFlat19sDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp17kUp: { code: 'accSagittalSharp17kUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat17kDown: { code: 'accSagittalFlat17kDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp143CUp: { code: 'accSagittalSharp143CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat143CDown: { code: 'accSagittalFlat143CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11v49CUp: { code: 'accSagittalSharp11v49CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11v49CDown: { code: 'accSagittalFlat11v49CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp19CUp: { code: 'accSagittalSharp19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat19CDown: { code: 'accSagittalFlat19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v19CUp: { code: 'accSagittalSharp7v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v19CDown: { code: 'accSagittalFlat7v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp49SUp: { code: 'accSagittalSharp49SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat49SDown: { code: 'accSagittalFlat49SDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp23SUp: { code: 'accSagittalSharp23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat23SDown: { code: 'accSagittalFlat23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v13MUp: { code: 'accSagittalSharp5v13MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v13MDown: { code: 'accSagittalFlat5v13MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11v19MUp: { code: 'accSagittalSharp11v19MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11v19MDown: { code: 'accSagittalFlat11v19MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp49MUp: { code: 'accSagittalSharp49MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat49MDown: { code: 'accSagittalFlat49MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v49MUp: { code: 'accSagittalSharp5v49MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v49MDown: { code: 'accSagittalFlat5v49MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp49LUp: { code: 'accSagittalSharp49LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat49LDown: { code: 'accSagittalFlat49LDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11v19LUp: { code: 'accSagittalSharp11v19LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11v19LDown: { code: 'accSagittalFlat11v19LDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v13LUp: { code: 'accSagittalSharp5v13LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v13LDown: { code: 'accSagittalFlat5v13LDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp23SDown: { code: 'accSagittalDoubleSharp23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat23SUp: { code: 'accSagittalDoubleFlat23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp49SDown: { code: 'accSagittalDoubleSharp49SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat49SUp: { code: 'accSagittalDoubleFlat49SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp7v19CDown: { code: 'accSagittalDoubleSharp7v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat7v19CUp: { code: 'accSagittalDoubleFlat7v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp19CDown: { code: 'accSagittalDoubleSharp19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat19CUp: { code: 'accSagittalDoubleFlat19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp11v49CDown: { code: 'accSagittalDoubleSharp11v49CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat11v49CUp: { code: 'accSagittalDoubleFlat11v49CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp143CDown: { code: 'accSagittalDoubleSharp143CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat143CUp: { code: 'accSagittalDoubleFlat143CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp17kDown: { code: 'accSagittalDoubleSharp17kDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat17kUp: { code: 'accSagittalDoubleFlat17kUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp19sDown: { code: 'accSagittalDoubleSharp19sDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat19sUp: { code: 'accSagittalDoubleFlat19sUp', parenRightPaddingAdjustment: -1 },\n accSagittalShaftUp: { code: 'accSagittalShaftUp', parenRightPaddingAdjustment: -1 },\n accSagittalShaftDown: { code: 'accSagittalShaftDown', parenRightPaddingAdjustment: -1 },\n accSagittalAcute: { code: 'accSagittalAcute', parenRightPaddingAdjustment: -1 },\n accSagittalGrave: { code: 'accSagittalGrave', parenRightPaddingAdjustment: -1 },\n accSagittal1MinaUp: { code: 'accSagittal1MinaUp', parenRightPaddingAdjustment: -1 },\n accSagittal1MinaDown: { code: 'accSagittal1MinaDown', parenRightPaddingAdjustment: -1 },\n accSagittal2MinasUp: { code: 'accSagittal2MinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal2MinasDown: { code: 'accSagittal2MinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal1TinaUp: { code: 'accSagittal1TinaUp', parenRightPaddingAdjustment: -1 },\n accSagittal1TinaDown: { code: 'accSagittal1TinaDown', parenRightPaddingAdjustment: -1 },\n accSagittal2TinasUp: { code: 'accSagittal2TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal2TinasDown: { code: 'accSagittal2TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal3TinasUp: { code: 'accSagittal3TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal3TinasDown: { code: 'accSagittal3TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal4TinasUp: { code: 'accSagittal4TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal4TinasDown: { code: 'accSagittal4TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal5TinasUp: { code: 'accSagittal5TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal5TinasDown: { code: 'accSagittal5TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal6TinasUp: { code: 'accSagittal6TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal6TinasDown: { code: 'accSagittal6TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal7TinasUp: { code: 'accSagittal7TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal7TinasDown: { code: 'accSagittal7TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal8TinasUp: { code: 'accSagittal8TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal8TinasDown: { code: 'accSagittal8TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal9TinasUp: { code: 'accSagittal9TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal9TinasDown: { code: 'accSagittal9TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittalFractionalTinaUp: { code: 'accSagittalFractionalTinaUp', parenRightPaddingAdjustment: -1 },\n accSagittalFractionalTinaDown: { code: 'accSagittalFractionalTinaDown', parenRightPaddingAdjustment: -1 },\n accidentalNarrowReversedFlat: { code: 'accidentalNarrowReversedFlat', parenRightPaddingAdjustment: -1 },\n accidentalNarrowReversedFlatAndFlat: {\n code: 'accidentalNarrowReversedFlatAndFlat',\n parenRightPaddingAdjustment: -1,\n },\n accidentalWilsonPlus: { code: 'accidentalWilsonPlus', parenRightPaddingAdjustment: -1 },\n accidentalWilsonMinus: { code: 'accidentalWilsonMinus', parenRightPaddingAdjustment: -1 },\n};\n// Helps determine the layout of accidentals.\nconst accidentalColumns = {\n 1: {\n a: [1],\n b: [1],\n },\n 2: {\n a: [1, 2],\n },\n 3: {\n a: [1, 3, 2],\n b: [1, 2, 1],\n second_on_bottom: [1, 2, 3],\n },\n 4: {\n a: [1, 3, 4, 2],\n b: [1, 2, 3, 1],\n spaced_out_tetrachord: [1, 2, 1, 2],\n },\n 5: {\n a: [1, 3, 5, 4, 2],\n b: [1, 2, 4, 3, 1],\n spaced_out_pentachord: [1, 2, 3, 2, 1],\n very_spaced_out_pentachord: [1, 2, 1, 2, 1],\n },\n 6: {\n a: [1, 3, 5, 6, 4, 2],\n b: [1, 2, 4, 5, 3, 1],\n spaced_out_hexachord: [1, 3, 2, 1, 3, 2],\n very_spaced_out_hexachord: [1, 2, 1, 2, 1, 2],\n },\n};\nconst articulations = {\n 'a.': { code: 'augmentationDot', between_lines: true },\n av: {\n aboveCode: 'articStaccatissimoAbove',\n belowCode: 'articStaccatissimoBelow',\n between_lines: true,\n },\n 'a>': {\n aboveCode: 'articAccentAbove',\n belowCode: 'articAccentBelow',\n between_lines: true,\n },\n 'a-': {\n aboveCode: 'articTenutoAbove',\n belowCode: 'articTenutoBelow',\n between_lines: true,\n },\n 'a^': {\n aboveCode: 'articMarcatoAbove',\n belowCode: 'articMarcatoBelow',\n between_lines: false,\n },\n 'a+': { code: 'pluckedLeftHandPizzicato', between_lines: false },\n ao: {\n aboveCode: 'pluckedSnapPizzicatoAbove',\n belowCode: 'pluckedSnapPizzicatoBelow',\n between_lines: false,\n },\n ah: { code: 'stringsHarmonic', between_lines: false },\n 'a@': { aboveCode: 'fermataAbove', belowCode: 'fermataBelow', between_lines: false },\n 'a@a': { code: 'fermataAbove', between_lines: false },\n 'a@u': { code: 'fermataBelow', between_lines: false },\n 'a|': { code: 'stringsUpBow', between_lines: false },\n am: { code: 'stringsDownBow', between_lines: false },\n 'a,': { code: 'pictChokeCymbal', between_lines: false }, // Choked\n};\nconst ornaments = {\n mordent: { code: 'ornamentShortTrill' },\n mordent_inverted: { code: 'ornamentMordent' },\n turn: { code: 'ornamentTurn' },\n turn_inverted: { code: 'ornamentTurnSlash' },\n tr: { code: 'ornamentTrill' },\n upprall: { code: 'ornamentPrecompSlideTrillDAnglebert' },\n downprall: { code: 'ornamentPrecompDoubleCadenceUpperPrefix' },\n prallup: { code: 'ornamentPrecompTrillSuffixDandrieu' },\n pralldown: { code: 'ornamentPrecompTrillLowerSuffix' },\n upmordent: { code: 'ornamentPrecompSlideTrillBach' },\n downmordent: { code: 'ornamentPrecompDoubleCadenceUpperPrefixTurn' },\n lineprall: { code: 'ornamentPrecompAppoggTrill' },\n prallprall: { code: 'ornamentTremblement' },\n scoop: { code: 'brassScoop' },\n doit: { code: 'brassDoitMedium' },\n fall: { code: 'brassFallLipShort' },\n doitLong: { code: 'brassLiftMedium' },\n fallLong: { code: 'brassFallRoughMedium' },\n bend: { code: 'brassBend' },\n plungerClosed: { code: 'brassMuteClosed' },\n plungerOpen: { code: 'brassMuteOpen' },\n flip: { code: 'brassFlip' },\n jazzTurn: { code: 'brassJazzTurn' },\n smear: { code: 'brassSmear' },\n};\nexport class Tables {\n /**\n * @returns the `Font` object at the head of the music font stack.\n */\n static currentMusicFont() {\n if (Tables.MUSIC_FONT_STACK.length === 0) {\n throw new RuntimeError('NoFonts', 'The font stack is empty. See: await Flow.fetchMusicFont(...); Flow.setMusicFont(...).');\n }\n else {\n return Tables.MUSIC_FONT_STACK[0];\n }\n }\n static clefProperties(clef) {\n if (!clef || !(clef in clefs))\n throw new RuntimeError('BadArgument', 'Invalid clef: ' + clef);\n return clefs[clef];\n }\n /**\n * @param keyOctaveGlyph a string in the format \"key/octave\" (e.g., \"c/5\") or \"key/octave/custom-note-head-code\" (e.g., \"g/5/t3\").\n * @param clef\n * @param params a struct with one option, `octave_shift` for clef ottavation (0 = default; 1 = 8va; -1 = 8vb, etc.).\n * @returns properties for the specified note.\n */\n // eslint-disable-next-line\n static keyProperties(keyOctaveGlyph, clef = 'treble', params) {\n let options = { octave_shift: 0 };\n if (typeof params === 'object') {\n options = Object.assign(Object.assign({}, options), params);\n }\n const pieces = keyOctaveGlyph.split('/');\n if (pieces.length < 2) {\n throw new RuntimeError('BadArguments', `First argument must be note/octave or note/octave/glyph-code: ${keyOctaveGlyph}`);\n }\n const key = pieces[0].toUpperCase();\n const value = notesInfo[key];\n if (!value)\n throw new RuntimeError('BadArguments', 'Invalid key name: ' + key);\n if (value.octave)\n pieces[1] = value.octave.toString();\n let octave = parseInt(pieces[1], 10);\n // Octave_shift is the shift to compensate for clef 8va/8vb.\n octave += -1 * options.octave_shift;\n const baseIndex = octave * 7 - 4 * 7;\n let line = (baseIndex + value.index) / 2;\n line += Tables.clefProperties(clef).line_shift;\n let stroke = 0;\n if (line <= 0 && (line * 2) % 2 === 0)\n stroke = 1; // stroke up\n if (line >= 6 && (line * 2) % 2 === 0)\n stroke = -1; // stroke down\n // Integer value for note arithmetic.\n const int_value = typeof value.int_val !== 'undefined' ? octave * 12 + value.int_val : undefined;\n // If the user specified a glyph, overwrite the glyph code.\n const code = value.code;\n const shift_right = value.shift_right;\n let customNoteHeadProps = {};\n if (pieces.length > 2 && pieces[2]) {\n const glyphName = pieces[2].toUpperCase();\n customNoteHeadProps = customNoteHeads[glyphName] || {};\n }\n return Object.assign({ key,\n octave,\n line,\n int_value, accidental: value.accidental, code,\n stroke,\n shift_right, displaced: false }, customNoteHeadProps);\n }\n static integerToNote(integer) {\n if (typeof integer === 'undefined' || integer < 0 || integer > 11) {\n throw new RuntimeError('BadArguments', `integerToNote() requires an integer in the range [0, 11]: ${integer}`);\n }\n const table = {\n 0: 'C',\n 1: 'C#',\n 2: 'D',\n 3: 'D#',\n 4: 'E',\n 5: 'F',\n 6: 'F#',\n 7: 'G',\n 8: 'G#',\n 9: 'A',\n 10: 'A#',\n 11: 'B',\n };\n const noteValue = table[integer];\n if (!noteValue) {\n throw new RuntimeError('BadArguments', `Unknown note value for integer: ${integer}`);\n }\n return noteValue;\n }\n static tabToGlyph(fret, scale = 1.0) {\n let glyph = undefined;\n let width = 0;\n let shift_y = 0;\n if (fret.toUpperCase() === 'X') {\n const glyphMetrics = new Glyph('accidentalDoubleSharp', Tables.TABLATURE_FONT_SCALE).getMetrics();\n glyph = 'accidentalDoubleSharp';\n if (glyphMetrics.width == undefined || glyphMetrics.height == undefined)\n throw new RuntimeError('InvalidMetrics', 'Width and height required');\n width = glyphMetrics.width;\n shift_y = -glyphMetrics.height / 2;\n }\n else {\n width = Tables.textWidth(fret);\n }\n return {\n text: fret,\n code: glyph,\n getWidth: () => width * scale,\n shift_y,\n };\n }\n // Used by annotation.ts and bend.ts. Clearly this implementation only works for the default font size.\n // TODO: The actual width depends on the font family, size, weight, style.\n static textWidth(text) {\n return 7 * text.toString().length;\n }\n static articulationCodes(artic) {\n return articulations[artic];\n }\n static accidentalCodes(acc) {\n return accidentals[acc];\n }\n static ornamentCodes(acc) {\n return ornaments[acc];\n }\n static keySignature(spec) {\n const keySpec = keySignatures[spec];\n if (!keySpec) {\n throw new RuntimeError('BadKeySignature', `Bad key signature spec: '${spec}'`);\n }\n if (!keySpec.acc) {\n return [];\n }\n const accidentalList = {\n b: [2, 0.5, 2.5, 1, 3, 1.5, 3.5],\n '#': [0, 1.5, -0.5, 1, 2.5, 0.5, 2],\n };\n const notes = accidentalList[keySpec.acc];\n const acc_list = [];\n for (let i = 0; i < keySpec.num; ++i) {\n const line = notes[i];\n acc_list.push({ type: keySpec.acc, line });\n }\n return acc_list;\n }\n static getKeySignatures() {\n return keySignatures;\n }\n static hasKeySignature(spec) {\n return spec in keySignatures;\n }\n /**\n * Convert duration aliases to the number based duration.\n * If the input isn't an alias, simply return the input.\n * @param duration\n * @returns Example: 'q' -> '4', '8' -> '8'\n */\n static sanitizeDuration(duration) {\n const durationNumber = durationAliases[duration];\n if (durationNumber !== undefined) {\n duration = durationNumber;\n }\n if (durations[duration] === undefined) {\n throw new RuntimeError('BadArguments', `The provided duration is not valid: ${duration}`);\n }\n return duration;\n }\n /** Convert the `duration` to a fraction. */\n static durationToFraction(duration) {\n return new Fraction().parse(Tables.sanitizeDuration(duration));\n }\n /** Convert the `duration` to a number. */\n static durationToNumber(duration) {\n return Tables.durationToFraction(duration).value();\n }\n /* Convert the `duration` to total ticks. */\n static durationToTicks(duration) {\n duration = Tables.sanitizeDuration(duration);\n const ticks = durations[duration];\n if (ticks === undefined) {\n throw new RuntimeError('InvalidDuration');\n }\n return ticks;\n }\n // Return a glyph given duration and type. The type can be a custom glyph code from customNoteHeads.\n // The default type is a regular note ('n').\n // eslint-disable-next-line\n static getGlyphProps(duration, type = 'n') {\n duration = Tables.sanitizeDuration(duration);\n // Lookup duration for default glyph head code\n const code = durationCodes[duration];\n if (code === undefined) {\n return undefined;\n }\n // Get glyph properties for 'type' from duration string (note, rest, harmonic, muted, slash)\n let glyphTypeProperties = code.type[type];\n // If this isn't a standard type, then lookup the custom note head map.\n if (glyphTypeProperties === undefined) {\n // Try and get it from the custom list of note heads\n const customGlyphTypeProperties = customNoteHeads[type.toUpperCase()];\n // If not, then return with nothing.\n if (customGlyphTypeProperties === undefined) {\n return undefined;\n }\n // Otherwise set it as the code_head value\n glyphTypeProperties = Object.assign({ code_head: customGlyphTypeProperties.code }, customGlyphTypeProperties);\n }\n const code_head = glyphTypeProperties.code_head;\n // The default implementation of getWidth() calls Glyph.getWidth(code_head, scale).\n // This can be overridden by an individual glyph type (see slash noteheads below: Tables.SLASH_NOTEHEAD_WIDTH).\n const getWidth = (scale = Tables.NOTATION_FONT_SCALE) => Glyph.getWidth(code_head, scale);\n // Merge duration props for 'duration' with the note head properties.\n return Object.assign(Object.assign(Object.assign({}, code.common), { getWidth: getWidth }), glyphTypeProperties);\n }\n}\nTables.STEM_WIDTH = 1.5;\nTables.STEM_HEIGHT = 35;\nTables.STAVE_LINE_THICKNESS = 1;\nTables.RESOLUTION = RESOLUTION;\n/**\n * Customize this by calling Flow.setMusicFont(...fontNames);\n */\nTables.MUSIC_FONT_STACK = [];\nTables.NOTATION_FONT_SCALE = 39;\nTables.TABLATURE_FONT_SCALE = 39;\nTables.SLASH_NOTEHEAD_WIDTH = 15;\nTables.STAVE_LINE_DISTANCE = 10;\n// HACK:\n// Since text origins are positioned at the baseline, we must\n// compensate for the ascender of the text. Of course, 1 staff space is\n// a very poor approximation.\n//\n// This will be deprecated in the future. This is a temporary solution until\n// we have more robust text metrics.\nTables.TEXT_HEIGHT_OFFSET_HACK = 1;\nTables.accidentalMap = accidentals;\nTables.accidentalColumnsTable = accidentalColumns;\nTables.unicode = {\n // ♯ accidental sharp\n sharp: String.fromCharCode(0x266f),\n // ♭ accidental flat\n flat: String.fromCharCode(0x266d),\n // ♮ accidental natural\n natural: String.fromCharCode(0x266e),\n // △ major seventh\n triangle: String.fromCharCode(0x25b3),\n // ø half-diminished\n 'o-with-slash': String.fromCharCode(0x00f8),\n // ° diminished\n degrees: String.fromCharCode(0x00b0),\n // ○ diminished\n circle: String.fromCharCode(0x25cb),\n};\n/* The list of valid note types. Used by note.ts during parseNoteStruct(). */\nTables.validTypes = validNoteTypes;\n// Default time signature.\nTables.TIME4_4 = {\n num_beats: 4,\n beat_value: 4,\n resolution: RESOLUTION,\n};\n// 1/2, 1, 2, 4, 8, 16, 32, 64, 128\n// NOTE: There is no 256 here! However, there are other mentions of 256 in this file.\n// For example, in durations has a 256 key, and sanitizeDuration() can return 256.\n// The sanitizeDuration() bit may need to be removed by 0xfe.\n// eslint-disable-next-line\nconst durationCodes = {\n '1/2': {\n common: {\n stem: false,\n stem_offset: 0,\n flag: false,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Breve note\n code_head: 'noteheadDoubleWhole',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDoubleWhole', scale);\n // },\n },\n h: {\n // Breve note harmonic\n code_head: 'unpitchedPercussionClef1',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('unpitchedPercussionClef1', scale);\n // },\n },\n m: {\n // Breve note muted\n code_head: 'vexNoteHeadMutedBreve',\n stem_offset: 0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('vexNoteHeadMutedBreve', scale);\n // },\n },\n r: {\n // Breve rest\n code_head: 'restDoubleWhole',\n rest: true,\n position: 'B/5',\n dot_shiftY: 0.5,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('restDoubleWhole', scale);\n // },\n },\n s: {\n // Breve note slash -\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadDoubleWhole',\n },\n },\n },\n 1: {\n common: {\n stem: false,\n stem_offset: 0,\n flag: false,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Whole note\n code_head: 'noteheadWhole',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadWhole', scale);\n // },\n },\n h: {\n // Whole note harmonic\n code_head: 'noteheadDiamondWhole',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondWhole', scale);\n // },\n },\n m: {\n // Whole note muted\n code_head: 'noteheadXWhole',\n stem_offset: -3,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXWhole', scale);\n // },\n },\n r: {\n // Whole rest\n code_head: 'restWhole',\n rest: true,\n position: 'D/5',\n dot_shiftY: 0.5,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('restWhole', scale);\n // },\n },\n s: {\n // Whole note slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadWhole',\n },\n },\n },\n 2: {\n common: {\n stem: true,\n stem_offset: 0,\n flag: false,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Half note\n code_head: 'noteheadHalf',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadHalf', scale);\n // },\n },\n h: {\n // Half note harmonic\n code_head: 'noteheadDiamondHalf',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondHalf', scale);\n // },\n },\n m: {\n // Half note muted\n code_head: 'noteheadXHalf',\n stem_offset: -3,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXHalf', scale);\n // },\n },\n r: {\n // Half rest\n code_head: 'restHalf',\n stem: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('restHalf', scale);\n // },\n },\n s: {\n // Half note slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadHalf',\n },\n },\n },\n 4: {\n common: {\n stem: true,\n stem_offset: 0,\n flag: false,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Quarter note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Quarter harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Quarter muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Quarter rest\n code_head: 'restQuarter',\n stem: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n line_above: 1.5,\n line_below: 1.5,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('restQuarter', scale);\n // },\n },\n s: {\n // Quarter slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 8: {\n common: {\n stem: true,\n stem_offset: 0,\n flag: true,\n beam_count: 1,\n stem_beam_extension: 0,\n code_flag_upstem: 'flag8thUp',\n code_flag_downstem: 'flag8thDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Eighth note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Eighth note harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Eighth note muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Eighth rest\n code_head: 'rest8th',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n line_above: 1.0,\n line_below: 1.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest8th', scale);\n // },\n },\n s: {\n // Eighth slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 16: {\n common: {\n beam_count: 2,\n stem_beam_extension: 0,\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'flag16thUp',\n code_flag_downstem: 'flag16thDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Sixteenth note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Sixteenth note harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Sixteenth note muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Sixteenth rest\n code_head: 'rest16th',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n line_above: 1.0,\n line_below: 2.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest16th', scale);\n // },\n },\n s: {\n // Sixteenth slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 32: {\n common: {\n beam_count: 3,\n stem_beam_extension: 7.5,\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'flag32ndUp',\n code_flag_downstem: 'flag32ndDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Thirty-second note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Thirty-second harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Thirty-second muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Thirty-second rest\n code_head: 'rest32nd',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -1.5,\n line_above: 2.0,\n line_below: 2.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest32nd', scale);\n // },\n },\n s: {\n // Thirty-second slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 64: {\n common: {\n beam_count: 4,\n stem_beam_extension: 15,\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'flag64thUp',\n code_flag_downstem: 'flag64thDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Sixty-fourth note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Sixty-fourth harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Sixty-fourth muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Sixty-fourth rest\n code_head: 'rest64th',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -1.5,\n line_above: 2.0,\n line_below: 3.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest64th', scale);\n // },\n },\n s: {\n // Sixty-fourth slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 128: {\n common: {\n beam_count: 5,\n stem_beam_extension: 22.5,\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'flag128thUp',\n code_flag_downstem: 'flag128thDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Hundred-twenty-eight note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Hundred-twenty-eight harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Hundred-twenty-eight muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Hundred-twenty-eight rest\n code_head: 'rest128th',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -2.5,\n line_above: 3.0,\n line_below: 3.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest128th', scale);\n // },\n },\n s: {\n // Hundred-twenty-eight slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// The file implements notes for Tablature notation. This consists of one or\n// more fret positions, and can either be drawn with or without stems.\n//\n// See `tests/tabnote_tests.ts` for usage examples.\nimport { Font } from './font';\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { StemmableNote } from './stemmablenote';\nimport { Tables } from './tables';\nimport { Category, isDot } from './typeguard';\nimport { defined, RuntimeError } from './util';\n// Gets the unused strings grouped together if consecutive.\n//\n// Parameters:\n// * num_lines - The number of lines\n// * strings_used - An array of numbers representing which strings have fret positions\nfunction getUnusedStringGroups(num_lines, strings_used) {\n const stem_through = [];\n let group = [];\n for (let string = 1; string <= num_lines; string++) {\n const is_used = strings_used.indexOf(string) > -1;\n if (!is_used) {\n group.push(string);\n }\n else {\n stem_through.push(group);\n group = [];\n }\n }\n if (group.length > 0)\n stem_through.push(group);\n return stem_through;\n}\n// Gets groups of points that outline the partial stem lines\n// between fret positions\n//\n// Parameters:\n// * stem_Y - The `y` coordinate the stem is located on\n// * unused_strings - An array of groups of unused strings\n// * stave - The stave to use for reference\n// * stem_direction - The direction of the stem\nfunction getPartialStemLines(stem_y, unused_strings, stave, stem_direction) {\n const up_stem = stem_direction !== 1;\n const down_stem = stem_direction !== -1;\n const line_spacing = stave.getSpacingBetweenLines();\n const total_lines = stave.getNumLines();\n const stem_lines = [];\n unused_strings.forEach((strings) => {\n const containsLastString = strings.indexOf(total_lines) > -1;\n const containsFirstString = strings.indexOf(1) > -1;\n if ((up_stem && containsFirstString) || (down_stem && containsLastString)) {\n return;\n }\n // If there's only one string in the group, push a duplicate value.\n // We do this because we need 2 strings to convert into upper/lower y\n // values.\n if (strings.length === 1) {\n strings.push(strings[0]);\n }\n const line_ys = [];\n // Iterate through each group string and store it's y position\n strings.forEach((string, index, strings) => {\n const isTopBound = string === 1;\n const isBottomBound = string === total_lines;\n // Get the y value for the appropriate staff line,\n // we adjust for a 0 index array, since string numbers are index 1\n let y = stave.getYForLine(string - 1);\n // Unless the string is the first or last, add padding to each side\n // of the line\n if (index === 0 && !isTopBound) {\n y -= line_spacing / 2 - 1;\n }\n else if (index === strings.length - 1 && !isBottomBound) {\n y += line_spacing / 2 - 1;\n }\n // Store the y value\n line_ys.push(y);\n // Store a subsequent y value connecting this group to the main\n // stem above/below the stave if it's the top/bottom string\n if (stem_direction === 1 && isTopBound) {\n line_ys.push(stem_y - 2);\n }\n else if (stem_direction === -1 && isBottomBound) {\n line_ys.push(stem_y + 2);\n }\n });\n // Add the sorted y values to the\n stem_lines.push(line_ys.sort((a, b) => a - b));\n });\n return stem_lines;\n}\nexport class TabNote extends StemmableNote {\n // Initialize the TabNote with a `noteStruct` full of properties\n // and whether to `draw_stem` when rendering the note\n constructor(noteStruct, draw_stem = false) {\n super(noteStruct);\n this.glyphs = [];\n // Return the number of the greatest string, which is the string lowest on the display\n this.greatestString = () => {\n return this.positions.map((x) => x.str).reduce((a, b) => (a > b ? a : b));\n };\n // Return the number of the least string, which is the string highest on the display\n this.leastString = () => {\n return this.positions.map((x) => x.str).reduce((a, b) => (a < b ? a : b));\n };\n this.ghost = false; // Renders parenthesis around notes\n // Note properties\n // The fret positions in the note. An array of `{ str: X, fret: X }`\n this.positions = noteStruct.positions || [];\n // Render Options\n this.render_options = Object.assign(Object.assign({}, this.render_options), { \n // font size for note heads and rests\n glyph_font_scale: Tables.TABLATURE_FONT_SCALE, \n // Flag to draw a stem\n draw_stem, \n // Flag to draw dot modifiers\n draw_dots: draw_stem, \n // Flag to extend the main stem through the stave and fret positions\n draw_stem_through_stave: false, \n // vertical shift from stave line\n y_shift: 0, \n // normal glyph scale\n scale: 1.0, \n // default tablature font\n font: `${Font.SIZE}pt ${Font.SANS_SERIF}` });\n this.glyph = Tables.getGlyphProps(this.duration, this.noteType);\n defined(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`);\n this.buildStem();\n if (noteStruct.stem_direction) {\n this.setStemDirection(noteStruct.stem_direction);\n }\n else {\n this.setStemDirection(Stem.UP);\n }\n // Renders parenthesis around notes\n this.ghost = false;\n this.updateWidth();\n }\n static get CATEGORY() {\n return Category.TabNote;\n }\n reset() {\n super.reset();\n if (this.stave)\n this.setStave(this.stave);\n return this;\n }\n // Set as ghost `TabNote`, surrounds the fret positions with parenthesis.\n // Often used for indicating frets that are being bent to\n setGhost(ghost) {\n this.ghost = ghost;\n this.updateWidth();\n return this;\n }\n // Determine if the note has a stem\n hasStem() {\n if (this.render_options.draw_stem)\n return true;\n return false;\n }\n // Get the default stem extension for the note\n getStemExtension() {\n if (this.stem_extension_override != null) {\n return this.stem_extension_override;\n }\n if (this.flag) {\n return this.getStemDirection() === 1 ? -this.flag.checkMetrics().y_shift : this.flag.checkMetrics().y_shift;\n }\n return 0;\n }\n // Calculate and store the width of the note\n updateWidth() {\n this.glyphs = [];\n this.width = 0;\n for (let i = 0; i < this.positions.length; ++i) {\n let fret = this.positions[i].fret;\n if (this.ghost)\n fret = '(' + fret + ')';\n const glyph = Tables.tabToGlyph(fret.toString(), this.render_options.scale);\n this.glyphs.push(glyph);\n this.width = Math.max(glyph.getWidth(), this.width);\n }\n // For some reason we associate a notehead glyph with a TabNote, and this\n // glyph is used for certain width calculations. Of course, this is totally\n // incorrect since a notehead is a poor approximation for the dimensions of\n // a fret number which can have multiple digits. As a result, we must\n // overwrite getWidth() to return the correct width\n this.glyph.getWidth = () => this.width;\n }\n // Set the `stave` to the note\n setStave(stave) {\n super.setStave(stave);\n const ctx = stave.getContext();\n this.setContext(ctx);\n // Calculate the fret number width based on font used\n if (ctx) {\n this.width = 0;\n for (let i = 0; i < this.glyphs.length; ++i) {\n const glyph = this.glyphs[i];\n const text = '' + glyph.text;\n if (text.toUpperCase() !== 'X') {\n ctx.save();\n ctx.setFont(this.render_options.font);\n glyph.width = ctx.measureText(text).width;\n ctx.restore();\n glyph.getWidth = () => glyph.width;\n }\n this.width = Math.max(glyph.getWidth(), this.width);\n }\n this.glyph.getWidth = () => this.width;\n }\n // we subtract 1 from `line` because getYForLine expects a 0-based index,\n // while the position.str is a 1-based index\n const ys = this.positions.map(({ str: line }) => stave.getYForLine(Number(line) - 1));\n this.setYs(ys);\n if (this.stem) {\n this.stem.setYBounds(this.getStemY(), this.getStemY());\n }\n return this;\n }\n // Get the fret positions for the note\n getPositions() {\n return this.positions;\n }\n // Get the default `x` and `y` coordinates for a modifier at a specific\n // `position` at a fret position `index`\n getModifierStartXY(position, index) {\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call GetModifierStartXY on an unformatted note\");\n }\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', 'No Y-Values calculated for this note.');\n }\n let x = 0;\n if (position === Modifier.Position.LEFT) {\n x = -1 * 2; // FIXME: modifier padding, move to font file\n }\n else if (position === Modifier.Position.RIGHT) {\n x = this.width + 2; // FIXME: modifier padding, move to font file\n }\n else if (position === Modifier.Position.BELOW || position === Modifier.Position.ABOVE) {\n const note_glyph_width = this.glyph.getWidth();\n x = note_glyph_width / 2;\n }\n return {\n x: this.getAbsoluteX() + x,\n y: this.ys[index],\n };\n }\n // Get the default line for rest\n getLineForRest() {\n return Number(this.positions[0].str);\n }\n // Pre-render formatting\n preFormat() {\n if (this.preFormatted)\n return;\n if (this.modifierContext)\n this.modifierContext.preFormat();\n // width is already set during init()\n this.preFormatted = true;\n }\n // Get the x position for the stem\n getStemX() {\n return this.getCenterGlyphX();\n }\n // Get the y position for the stem\n getStemY() {\n const num_lines = this.checkStave().getNumLines();\n // The decimal staff line amounts provide optimal spacing between the\n // fret number and the stem\n const stemUpLine = -0.5;\n const stemDownLine = num_lines - 0.5;\n const stemStartLine = Stem.UP === this.stem_direction ? stemUpLine : stemDownLine;\n return this.checkStave().getYForLine(stemStartLine);\n }\n // Get the stem extents for the tabnote\n getStemExtents() {\n return this.checkStem().getExtents();\n }\n // Draw the fal onto the context\n drawFlag() {\n const { beam, glyph, stem_direction, render_options: { draw_stem, glyph_font_scale }, } = this;\n const context = this.checkContext();\n const shouldDrawFlag = beam == undefined && draw_stem;\n // Now it's the flag's turn.\n if (glyph.flag && shouldDrawFlag) {\n const flag_x = this.getStemX() + 1;\n const flag_y = this.getStemY() - this.checkStem().getHeight();\n const flag_code = stem_direction === Stem.DOWN\n ? glyph.code_flag_downstem // Down stems have flags on the left.\n : glyph.code_flag_upstem;\n // Draw the Flag\n Glyph.renderGlyph(context, flag_x, flag_y, glyph_font_scale, flag_code, { category: 'flag.tabStem' });\n }\n }\n // Render the modifiers onto the context.\n drawModifiers() {\n this.modifiers.forEach((modifier) => {\n // Only draw the dots if enabled.\n if (isDot(modifier) && !this.render_options.draw_dots) {\n return;\n }\n modifier.setContext(this.getContext());\n modifier.drawWithStyle();\n });\n }\n // Render the stem extension through the fret positions\n drawStemThrough() {\n const stemX = this.getStemX();\n const stemY = this.getStemY();\n const ctx = this.checkContext();\n const drawStem = this.render_options.draw_stem;\n const stemThrough = this.render_options.draw_stem_through_stave;\n if (drawStem && stemThrough) {\n const numLines = this.checkStave().getNumLines();\n const stringsUsed = this.positions.map((position) => Number(position.str));\n const unusedStrings = getUnusedStringGroups(numLines, stringsUsed);\n const stemLines = getPartialStemLines(stemY, unusedStrings, this.checkStave(), this.getStemDirection());\n ctx.save();\n ctx.setLineWidth(Stem.WIDTH);\n stemLines.forEach((bounds) => {\n if (bounds.length === 0)\n return;\n ctx.beginPath();\n ctx.moveTo(stemX, bounds[0]);\n ctx.lineTo(stemX, bounds[bounds.length - 1]);\n ctx.stroke();\n ctx.closePath();\n });\n ctx.restore();\n }\n }\n // Render the fret positions onto the context\n drawPositions() {\n const ctx = this.checkContext();\n const x = this.getAbsoluteX();\n const ys = this.ys;\n for (let i = 0; i < this.positions.length; ++i) {\n const y = ys[i] + this.render_options.y_shift;\n const glyph = this.glyphs[i];\n // Center the fret text beneath the notation note head\n const note_glyph_width = this.glyph.getWidth();\n const tab_x = x + note_glyph_width / 2 - glyph.getWidth() / 2;\n // FIXME: Magic numbers.\n ctx.clearRect(tab_x - 2, y - 3, glyph.getWidth() + 4, 6);\n if (glyph.code) {\n Glyph.renderGlyph(ctx, tab_x, y, this.render_options.glyph_font_scale * this.render_options.scale, glyph.code);\n }\n else {\n ctx.save();\n ctx.setFont(this.render_options.font);\n const text = glyph.text.toString();\n ctx.fillText(text, tab_x, y + 5 * this.render_options.scale);\n ctx.restore();\n }\n }\n }\n // The main rendering function for the entire note.\n draw() {\n const ctx = this.checkContext();\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', \"Can't draw note without Y values.\");\n }\n this.setRendered();\n const render_stem = this.beam == undefined && this.render_options.draw_stem;\n ctx.openGroup('tabnote', undefined, { pointerBBox: true });\n this.drawPositions();\n this.drawStemThrough();\n if (this.stem && render_stem) {\n const stem_x = this.getStemX();\n this.stem.setNoteHeadXBounds(stem_x, stem_x);\n ctx.openGroup('stem', undefined, { pointerBBox: true });\n this.stem.setContext(ctx).draw();\n ctx.closeGroup();\n }\n this.drawFlag();\n this.drawModifiers();\n ctx.closeGroup();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// This class implements varies types of ties between contiguous notes. The\n// ties include: regular ties, hammer ons, pull offs, and slides.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { TabTie } from './tabtie';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class TabSlide extends TabTie {\n /**\n * @param notes is a struct of the form:\n * {\n * first_note: Note,\n * last_note: Note,\n * first_indices: [n1, n2, n3],\n * last_indices: [n1, n2, n3]\n * }\n * @param notes.first_note the starting note of the slide\n * @param notes.last_note the ending note of the slide\n * @param notes.first_indices specifies which string + fret positions of the TabNote are used in this slide. zero indexed.\n * @param notes.last_indices currently unused. we assume it's the same as first_indices.\n *\n * @param direction TabSlide.SLIDE_UP or TabSlide.SLIDE_DOWN\n */\n constructor(notes, direction) {\n super(notes, 'sl.');\n // Determine the direction automatically if it is not provided.\n if (!direction) {\n let first_fret = notes.first_note.getPositions()[0].fret;\n if (typeof first_fret === 'string') {\n first_fret = parseInt(first_fret, 10);\n }\n let last_fret = notes.last_note.getPositions()[0].fret;\n if (typeof last_fret === 'string') {\n last_fret = parseInt(last_fret, 10);\n }\n // If either of the frets are 'X', parseInt() above will return NaN.\n // Choose TabSlide.SLIDE_UP by default.\n if (isNaN(first_fret) || isNaN(last_fret)) {\n direction = TabSlide.SLIDE_UP;\n }\n else {\n direction = first_fret > last_fret ? TabSlide.SLIDE_DOWN : TabSlide.SLIDE_UP;\n }\n }\n this.direction = direction;\n this.render_options.cp1 = 11;\n this.render_options.cp2 = 14;\n this.render_options.y_shift = 0.5;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.TabSlide;\n }\n static get SLIDE_UP() {\n return 1;\n }\n static get SLIDE_DOWN() {\n return -1;\n }\n static createSlideUp(notes) {\n return new TabSlide(notes, TabSlide.SLIDE_UP);\n }\n static createSlideDown(notes) {\n return new TabSlide(notes, TabSlide.SLIDE_DOWN);\n }\n renderTie(params) {\n if (params.first_ys.length === 0 || params.last_ys.length === 0) {\n throw new RuntimeError('BadArguments', 'No Y-values to render');\n }\n const ctx = this.checkContext();\n const first_x_px = params.first_x_px;\n const first_ys = params.first_ys;\n const last_x_px = params.last_x_px;\n const direction = params.direction;\n if (direction !== TabSlide.SLIDE_UP && direction !== TabSlide.SLIDE_DOWN) {\n throw new RuntimeError('BadSlide', 'Invalid slide direction');\n }\n // eslint-disable-next-line\n const first_indices = this.notes.first_indices;\n for (let i = 0; i < first_indices.length; ++i) {\n const slide_y = first_ys[first_indices[i]] + this.render_options.y_shift;\n if (isNaN(slide_y)) {\n throw new RuntimeError('BadArguments', 'Bad indices for slide rendering.');\n }\n ctx.beginPath();\n ctx.moveTo(first_x_px, slide_y + 3 * direction);\n ctx.lineTo(last_x_px, slide_y - 3 * direction);\n ctx.closePath();\n ctx.stroke();\n }\n this.setRendered();\n }\n}\nTabSlide.TEXT_FONT = {\n family: Font.SERIF,\n size: 10,\n weight: FontWeight.BOLD,\n style: FontStyle.ITALIC,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { Stave } from './stave';\nimport { Category } from './typeguard';\nexport class TabStave extends Stave {\n static get CATEGORY() {\n return Category.TabStave;\n }\n constructor(x, y, width, options) {\n const tab_options = Object.assign({ spacing_between_lines_px: 13, num_lines: 6, top_text_position: 1 }, options);\n super(x, y, width, tab_options);\n }\n getYForGlyphs() {\n return this.getYForLine(2.5);\n }\n // Deprecated\n addTabGlyph() {\n this.addClef('tab');\n return this;\n }\n}\n","// / [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This class implements varies types of ties between contiguous notes. The\n// ties include: regular ties, hammer ons, pull offs, and slides.\nimport { StaveTie } from './stavetie';\nimport { Category } from './typeguard';\nexport class TabTie extends StaveTie {\n static get CATEGORY() {\n return Category.TabTie;\n }\n static createHammeron(notes) {\n return new TabTie(notes, 'H');\n }\n static createPulloff(notes) {\n return new TabTie(notes, 'P');\n }\n /**\n * @param notes is a struct that has:\n * {\n * first_note: Note,\n * last_note: Note,\n * first_indices: [n1, n2, n3],\n * last_indices: [n1, n2, n3]\n * }\n *\n * @param text\n */\n constructor(notes, text) {\n super(notes, text);\n this.render_options.cp1 = 9;\n this.render_options.cp2 = 11;\n this.render_options.y_shift = 3;\n this.direction = -1; // Tab tie's are always face up.\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Cyril Silverman\n//\n// This file implements `TextBrackets` which extend between two notes.\n// The octave transposition markings (8va, 8vb, 15va, 15vb) can be created\n// using this class.\nimport { Element } from './element';\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Renderer } from './renderer';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { log, RuntimeError } from './util';\n// To enable logging for this class. Set `Vex.Flow.TextBracket.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (TextBracket.DEBUG)\n log('Vex.Flow.TextBracket', args);\n}\nexport var TextBracketPosition;\n(function (TextBracketPosition) {\n TextBracketPosition[TextBracketPosition[\"TOP\"] = 1] = \"TOP\";\n TextBracketPosition[TextBracketPosition[\"BOTTOM\"] = -1] = \"BOTTOM\";\n})(TextBracketPosition || (TextBracketPosition = {}));\nexport class TextBracket extends Element {\n constructor({ start, stop, text = '', superscript = '', position = TextBracketPosition.TOP }) {\n super();\n this.start = start;\n this.stop = stop;\n this.text = text;\n this.superscript = superscript;\n this.position = typeof position === 'string' ? TextBracket.PositionString[position] : position;\n this.line = 1;\n this.resetFont();\n this.render_options = {\n dashed: true,\n dash: [5],\n color: 'black',\n line_width: 1,\n show_bracket: true,\n bracket_height: 8,\n // In the BOTTOM position, the bracket line can extend\n // under the superscript.\n underline_superscript: true,\n };\n }\n static get CATEGORY() {\n return Category.TextBracket;\n }\n static get Position() {\n return TextBracketPosition;\n }\n static get PositionString() {\n return {\n top: TextBracketPosition.TOP,\n bottom: TextBracketPosition.BOTTOM,\n };\n }\n /**\n * @deprecated Use `TextBracket.Position` instead.\n */\n static get Positions() {\n L('Positions is deprecated, use TextBracketPosition instead.');\n return TextBracketPosition;\n }\n /**\n * @deprecated Use `TextBracket.PositionString` instead.\n */\n static get PositionsString() {\n L('PositionsString is deprecated, use PositionString instead.');\n return TextBracket.PositionString;\n }\n /**\n * Apply the text backet styling to the provided context.\n * @param ctx\n * @returns this\n */\n applyStyle(ctx) {\n ctx.setFont(this.font);\n const options = this.render_options;\n ctx.setStrokeStyle(options.color);\n ctx.setFillStyle(options.color);\n ctx.setLineWidth(options.line_width);\n return this;\n }\n // Set whether the bracket line should be `dashed`. You can also\n // optionally set the `dash` pattern by passing in an array of numbers\n setDashed(dashed, dash) {\n this.render_options.dashed = dashed;\n if (dash)\n this.render_options.dash = dash;\n return this;\n }\n // Set the rendering `context` for the octave bracket\n setLine(line) {\n this.line = line;\n return this;\n }\n // Draw the octave bracket on the rendering context\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n let y = 0;\n switch (this.position) {\n case TextBracketPosition.TOP:\n y = this.start.checkStave().getYForTopText(this.line);\n break;\n case TextBracketPosition.BOTTOM:\n y = this.start.checkStave().getYForBottomText(this.line + Tables.TEXT_HEIGHT_OFFSET_HACK);\n break;\n default:\n throw new RuntimeError('InvalidPosition', `The position ${this.position} is invalid.`);\n }\n // Get the preliminary start and stop coordintates for the bracket\n const start = { x: this.start.getAbsoluteX(), y };\n const stop = { x: this.stop.getAbsoluteX(), y };\n L('Rendering TextBracket: start:', start, 'stop:', stop, 'y:', y);\n const bracket_height = this.render_options.bracket_height * this.position;\n ctx.save();\n this.applyStyle(ctx);\n // Draw text\n ctx.fillText(this.text, start.x, start.y);\n // Get the width and height for the octave number\n const main_measure = ctx.measureText(this.text);\n const main_width = main_measure.width;\n const main_height = main_measure.height;\n // Calculate the y position for the super script\n const super_y = start.y - main_height / 2.5;\n // We called this.resetFont() in the constructor, so we know this.textFont is available.\n // eslint-disable-next-line\n const { family, size, weight, style } = this.textFont;\n // To draw the superscript, we scale the font size by 1/1.4.\n const smallerFontSize = Font.scaleSize(size, 0.714286);\n ctx.setFont(family, smallerFontSize, weight, style);\n ctx.fillText(this.superscript, start.x + main_width + 1, super_y);\n // Determine width and height of the superscript\n const super_measure = ctx.measureText(this.superscript);\n const super_width = super_measure.width;\n const super_height = super_measure.height;\n // Setup initial coordinates for the bracket line\n let start_x = start.x;\n let line_y = super_y;\n const end_x = stop.x + this.stop.getGlyph().getWidth();\n // Adjust x and y coordinates based on position\n if (this.position === TextBracketPosition.TOP) {\n start_x += main_width + super_width + 5;\n line_y -= super_height / 2.7;\n }\n else if (this.position === TextBracketPosition.BOTTOM) {\n line_y += super_height / 2.7;\n start_x += main_width + 2;\n if (!this.render_options.underline_superscript) {\n start_x += super_width;\n }\n }\n if (this.render_options.dashed) {\n // Main line\n Renderer.drawDashedLine(ctx, start_x, line_y, end_x, line_y, this.render_options.dash);\n // Ending Bracket\n if (this.render_options.show_bracket) {\n Renderer.drawDashedLine(ctx, end_x, line_y + 1 * this.position, end_x, line_y + bracket_height, this.render_options.dash);\n }\n }\n else {\n ctx.beginPath();\n ctx.moveTo(start_x, line_y);\n // Main line\n ctx.lineTo(end_x, line_y);\n if (this.render_options.show_bracket) {\n // Ending bracket\n ctx.lineTo(end_x, line_y + bracket_height);\n }\n ctx.stroke();\n ctx.closePath();\n }\n ctx.restore();\n }\n}\nTextBracket.DEBUG = false;\nTextBracket.TEXT_FONT = {\n family: Font.SERIF,\n size: 15,\n weight: FontWeight.NORMAL,\n style: FontStyle.ITALIC,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Category } from './typeguard';\nimport { defined, log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (TextDynamics.DEBUG)\n log('Vex.Flow.TextDynamics', args);\n}\n/**\n * `TextDynamics` renders traditional\n * text dynamics markings, **ie: p, f, sfz, rfz, ppp**\n *\n * You can render any dynamics string that contains a combination of\n * the following letters: P, M, F, Z, R, S\n */\nexport class TextDynamics extends Note {\n /**\n * Create the dynamics marking.\n *\n * A `TextDynamics` object inherits from `Note` so that it can be formatted\n * within a `Voice`.\n *\n * @param noteStruct an object that contains a `duration` property and a\n * `sequence` of letters that represents the letters to render.\n */\n constructor(noteStruct) {\n super(noteStruct);\n this.sequence = (noteStruct.text || '').toLowerCase();\n this.line = noteStruct.line || 0;\n this.glyphs = [];\n this.render_options = Object.assign(Object.assign({}, this.render_options), { glyph_font_size: 40 });\n L('New Dynamics Text: ', this.sequence);\n }\n static get CATEGORY() {\n return Category.TextDynamics;\n }\n /** The glyph data for each dynamics letter. */\n static get GLYPHS() {\n return {\n f: {\n code: 'dynamicForte',\n width: 12,\n },\n p: {\n code: 'dynamicPiano',\n width: 14,\n },\n m: {\n code: 'dynamicMezzo',\n width: 17,\n },\n s: {\n code: 'dynamicSforzando',\n width: 10,\n },\n z: {\n code: 'dynamicZ',\n width: 12,\n },\n r: {\n code: 'dynamicRinforzando',\n width: 12,\n },\n };\n }\n /** Set the Stave line on which the note should be placed. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Preformat the dynamics text. */\n preFormat() {\n let total_width = 0;\n // length of this.glyphs must be <=\n // length of this.sequence, so if we're formatted before\n // create new glyphs.\n this.glyphs = [];\n // Iterate through each letter\n this.sequence.split('').forEach((letter) => {\n // Get the glyph data for the letter\n const glyph_data = TextDynamics.GLYPHS[letter];\n if (!glyph_data)\n throw new RuntimeError('Invalid dynamics character: ' + letter);\n const size = defined(this.render_options.glyph_font_size);\n const glyph = new Glyph(glyph_data.code, size, { category: 'textNote' });\n // Add the glyph\n this.glyphs.push(glyph);\n total_width += glyph_data.width;\n });\n // Store the width of the text\n this.setWidth(total_width);\n this.preFormatted = true;\n return this;\n }\n /** Draw the dynamics text on the rendering context. */\n draw() {\n this.setRendered();\n const x = this.getAbsoluteX();\n const y = this.checkStave().getYForLine(this.line + -3);\n L('Rendering Dynamics: ', this.sequence);\n let letter_x = x;\n this.glyphs.forEach((glyph, index) => {\n const current_letter = this.sequence[index];\n glyph.render(this.checkContext(), letter_x, y);\n letter_x += TextDynamics.GLYPHS[current_letter].width;\n });\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.TextDynamics.DEBUG` to `true`. */\nTextDynamics.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font, FontStyle, FontWeight } from './font';\nimport { log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (TextFormatter.DEBUG)\n log('Vex.Flow.TextFormatter', args);\n}\n/**\n * Text widths are stored in a cache, so we don't have to recompute widths\n * for the same font + string combination.\n *\n * The cache is first keyed by the font information. The key is of the form:\n * `${family}-${size}-${weight}-${style}`\n * The second level key is the specific text to be measured.\n *\n * The stored value is the measured width in `em` units.\n * textWidth == textWidthCache[cacheKey][textToMeasure]\n */\nconst textWidthCache = {};\n/**\n * Applications may register additional fonts via `TextFormatter.registerInfo(info)`.\n * The metrics for those fonts will be made available to the application.\n */\nconst registry = {};\nexport class TextFormatter {\n /**\n * Use `TextFormatter.create(...)` to build an instance from information previously\n * registered via `TextFormatter.registerInfo(info)`.\n */\n constructor(formatterInfo) {\n /** Font family. */\n this.family = '';\n /** Specified in `pt` units. */\n this.size = 14;\n /** Font metrics are extracted at 1000 upem (units per em). */\n this.resolution = 1000;\n /**\n * For text formatting, we do not require glyph outlines, but instead rely on glyph\n * bounding box metrics such as:\n * ```\n * {\n * x_min: 48,\n * x_max: 235,\n * y_min: -17,\n * y_max: 734,\n * ha: 751,\n * leftSideBearing: 48,\n * advanceWidth: 286,\n * }\n * ```\n */\n this.glyphs = {};\n this.serifs = false;\n this.monospaced = false;\n this.italic = false;\n this.bold = false;\n this.superscriptOffset = 0;\n this.subscriptOffset = 0;\n this.maxSizeGlyph = 'H';\n // This is an internal key used to index the `textWidthCache`.\n this.cacheKey = '';\n this.updateParams(formatterInfo);\n }\n /**\n * Return all registered font families.\n */\n static getFontFamilies() {\n const registeredFonts = [];\n for (const fontFamily in registry) {\n const formatterInfo = registry[fontFamily];\n registeredFonts.push(Object.assign({}, formatterInfo));\n }\n return registeredFonts;\n }\n /**\n * Call `TextFormatter.registerInfo(info)` to register font information before using this method.\n *\n * This method creates a formatter for the font that most closely matches the requested font.\n * We compare font family, bold, and italic attributes.\n * This method will return a fallback formatter if there are no matches.\n */\n static create(requestedFont = {}) {\n L('create: ', requestedFont);\n if (!requestedFont.family) {\n requestedFont.family = Font.SANS_SERIF;\n }\n // TODO: One potential (small) optimization is to cache the TextFormatter object\n // returned for each font info. We would probably want to clear the cache if\n // the registry is ever updated.\n const candidates = [];\n // The incoming font family is a string of comma-separated font family names.\n // (e.g., `PetalumaScript, Arial, sans-serif`).\n const requestedFamilies = requestedFont.family.split(/\\s*,\\s*/);\n for (const requestedFamily of requestedFamilies) {\n for (const fontFamily in registry) {\n // Support cases where the registry contains 'Roboto Slab Medium',\n // but the requestedFont.family is 'Roboto Slab'.\n if (fontFamily.startsWith(requestedFamily)) {\n candidates.push(registry[fontFamily]);\n }\n }\n if (candidates.length > 0) {\n break;\n }\n }\n let formatter;\n if (candidates.length === 0) {\n // No match, so return a fallback text formatter.\n formatter = new TextFormatter(Object.values(registry)[0]);\n }\n else if (candidates.length === 1) {\n formatter = new TextFormatter(candidates[0]);\n }\n else {\n const bold = Font.isBold(requestedFont.weight);\n const italic = Font.isItalic(requestedFont.style);\n const perfectMatch = candidates.find((f) => f.bold === bold && f.italic === italic);\n if (perfectMatch) {\n formatter = new TextFormatter(perfectMatch);\n }\n else {\n const partialMatch = candidates.find((f) => f.italic === italic || f.bold === bold);\n if (partialMatch) {\n formatter = new TextFormatter(partialMatch);\n }\n else {\n formatter = new TextFormatter(candidates[0]);\n }\n }\n }\n const fontSize = requestedFont.size;\n if (typeof fontSize !== 'undefined') {\n const fontSizeInPt = Font.convertSizeToPointValue(fontSize);\n formatter.setFontSize(fontSizeInPt);\n }\n return formatter;\n }\n /**\n * @param fontFamily used as a key to the font registry.\n * @returns the same info object that was passed in via `TextFormatter.registerInfo(info)`\n */\n static getInfo(fontFamily) {\n return registry[fontFamily];\n }\n /**\n * Apps may register their own fonts and metrics, and those metrics\n * will be available to the app for formatting.\n *\n * Metrics can be generated from a font file using fontgen_text.js in the tools/fonts directory.\n * @param info\n * @param overwrite\n */\n static registerInfo(info, overwrite = false) {\n L('registerInfo: ', info, overwrite);\n const fontFamily = info.family;\n const currFontInfo = registry[fontFamily];\n if (currFontInfo === undefined || overwrite) {\n registry[fontFamily] = info;\n }\n }\n updateParams(params) {\n if (params.family)\n this.family = params.family;\n if (params.resolution)\n this.resolution = params.resolution;\n if (params.glyphs)\n this.glyphs = params.glyphs;\n if (params.serifs)\n this.serifs = params.serifs;\n if (params.monospaced)\n this.monospaced = params.monospaced;\n if (params.italic)\n this.italic = params.italic;\n if (params.bold)\n this.bold = params.bold;\n if (params.maxSizeGlyph)\n this.maxSizeGlyph = params.maxSizeGlyph;\n if (params.superscriptOffset)\n this.superscriptOffset = params.superscriptOffset;\n if (params.subscriptOffset)\n this.subscriptOffset = params.subscriptOffset;\n this.updateCacheKey();\n }\n /** Create a hash with the current font data, so we can cache computed widths. */\n updateCacheKey() {\n const family = this.family.replace(/\\s+/g, '_');\n const size = this.size;\n const weight = this.bold ? FontWeight.BOLD : FontWeight.NORMAL;\n const style = this.italic ? FontStyle.ITALIC : FontStyle.NORMAL;\n // Use the same key format as SVGContext.\n this.cacheKey = `${family}%${size}%${weight}%${style}`;\n }\n /**\n * The glyphs table is indexed by the character (e.g., 'C', '@').\n * See: robotoslab_glyphs.ts & petalumascript_glyphs.ts.\n */\n getGlyphMetrics(character) {\n if (this.glyphs[character]) {\n return this.glyphs[character];\n }\n else {\n return this.glyphs[this.maxSizeGlyph];\n }\n }\n get maxHeight() {\n const metrics = this.getGlyphMetrics(this.maxSizeGlyph);\n return (metrics.ha / this.resolution) * this.fontSizeInPixels;\n }\n /**\n * Retrieve the character's advanceWidth as a fraction of an `em` unit.\n * For the space character ' ' as defined in the:\n * petalumascript_glyphs.ts: 250 advanceWidth in the 1000 unitsPerEm font returns 0.25.\n * robotoslab_glyphs.ts: 509 advanceWidth in the 2048 unitsPerEm font returns 0.2485.\n */\n getWidthForCharacterInEm(c) {\n var _a;\n const metrics = this.getGlyphMetrics(c);\n if (!metrics) {\n // An arbitrary number, close to the `em` width of the '#' and '5' characters in PetalumaScript.\n return 0.65;\n }\n else {\n const advanceWidth = (_a = metrics.advanceWidth) !== null && _a !== void 0 ? _a : 0;\n return advanceWidth / this.resolution;\n }\n }\n /**\n * Retrieve the total width of `text` in `em` units.\n */\n getWidthForTextInEm(text) {\n const key = this.cacheKey;\n // Get the cache for this specific font family, size, weight, style combination.\n // The cache contains previously computed widths for different `text` strings.\n let cachedWidths = textWidthCache[key];\n if (cachedWidths === undefined) {\n cachedWidths = {};\n textWidthCache[key] = cachedWidths;\n }\n let width = cachedWidths[text];\n if (width === undefined) {\n width = 0;\n for (let i = 0; i < text.length; ++i) {\n width += this.getWidthForCharacterInEm(text[i]);\n }\n cachedWidths[text] = width;\n }\n return width;\n }\n /** The width of the text (in `em`) is scaled by the font size (in `px`). */\n getWidthForTextInPx(text) {\n return this.getWidthForTextInEm(text) * this.fontSizeInPixels;\n }\n /**\n * @param size in pt.\n */\n setFontSize(size) {\n this.size = size;\n // The width cache key depends on the current font size.\n this.updateCacheKey();\n return this;\n }\n /** `this.size` is specified in points. Convert to pixels. */\n get fontSizeInPixels() {\n return this.size * Font.scaleToPxFrom.pt;\n }\n getResolution() {\n return this.resolution;\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.TextFormatter.DEBUG` to `true`. */\nTextFormatter.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport var Justification;\n(function (Justification) {\n Justification[Justification[\"LEFT\"] = 1] = \"LEFT\";\n Justification[Justification[\"CENTER\"] = 2] = \"CENTER\";\n Justification[Justification[\"RIGHT\"] = 3] = \"RIGHT\";\n})(Justification || (Justification = {}));\n/**\n * `TextNote` is a notation element that is positioned in time. Generally\n * meant for objects that sit above/below the staff and inline with each other.\n * `TextNote` has to be assigned to a `Stave` before rendering by means of `setStave`.\n * Examples of this would be such as dynamics, lyrics, chord changes, etc.\n */\nexport class TextNote extends Note {\n constructor(noteStruct) {\n super(noteStruct);\n this.text = noteStruct.text || '';\n this.superscript = noteStruct.superscript;\n this.subscript = noteStruct.subscript;\n this.setFont(noteStruct.font);\n this.line = noteStruct.line || 0;\n this.smooth = noteStruct.smooth || false;\n this.ignore_ticks = noteStruct.ignore_ticks || false;\n this.justification = Justification.LEFT;\n // Determine and set initial note width. Note that the text width is\n // an approximation and isn't very accurate. The only way to accurately\n // measure the length of text is with `CanvasRenderingContext2D.measureText()`.\n if (noteStruct.glyph) {\n const struct = TextNote.GLYPHS[noteStruct.glyph];\n if (!struct)\n throw new RuntimeError('Invalid glyph type: ' + noteStruct.glyph);\n this.glyph = new Glyph(struct.code, 40, { category: 'textNote' });\n this.setWidth(this.glyph.getMetrics().width);\n }\n else {\n this.glyph = undefined;\n }\n }\n static get CATEGORY() {\n return Category.TextNote;\n }\n static get Justification() {\n return Justification;\n }\n /** Glyph data. */\n static get GLYPHS() {\n return {\n segno: {\n code: 'segno',\n },\n tr: {\n code: 'ornamentTrill',\n },\n mordent: {\n code: 'ornamentMordent',\n },\n mordent_upper: {\n code: 'ornamentShortTrill',\n },\n mordent_lower: {\n code: 'ornamentMordent',\n },\n f: {\n code: 'dynamicForte',\n },\n p: {\n code: 'dynamicPiano',\n },\n m: {\n code: 'dynamicMezzo',\n },\n s: {\n code: 'dynamicSforzando',\n },\n z: {\n code: 'dynamicZ',\n },\n coda: {\n code: 'coda',\n },\n pedal_open: {\n code: 'keyboardPedalPed',\n },\n pedal_close: {\n code: 'keyboardPedalUp',\n },\n caesura_straight: {\n code: 'caesura',\n },\n caesura_curved: {\n code: 'caesuraCurved',\n },\n breath: {\n code: 'breathMarkComma',\n },\n tick: {\n code: 'breathMarkTick',\n },\n turn: {\n code: 'ornamentTurn',\n },\n turn_inverted: {\n code: 'ornamentTurnSlash',\n },\n };\n }\n /** Set the horizontal justification of the TextNote. */\n setJustification(just) {\n this.justification = just;\n return this;\n }\n /** Set the Stave line on which the note should be placed. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Pre-render formatting. */\n preFormat() {\n if (this.preFormatted)\n return;\n const tickContext = this.checkTickContext(`Can't preformat without a TickContext.`);\n if (this.smooth) {\n this.setWidth(0);\n }\n else {\n if (this.glyph) {\n // Width already set.\n }\n else {\n const ctx = this.checkContext();\n ctx.setFont(this.textFont);\n this.setWidth(ctx.measureText(this.text).width);\n }\n }\n if (this.justification === Justification.CENTER) {\n this.leftDisplacedHeadPx = this.width / 2;\n }\n else if (this.justification === Justification.RIGHT) {\n this.leftDisplacedHeadPx = this.width;\n }\n // We reposition to the center of the note head\n this.rightDisplacedHeadPx = tickContext.getMetrics().glyphPx / 2;\n this.preFormatted = true;\n }\n /**\n * Renders the TextNote.\n * `TextNote` has to be assigned to a `Stave` before rendering by means of `setStave`.\n */\n draw() {\n const ctx = this.checkContext();\n const stave = this.checkStave();\n const tickContext = this.checkTickContext(`Can't draw without a TickContext.`);\n this.setRendered();\n // Reposition to center of note head\n let x = this.getAbsoluteX() + tickContext.getMetrics().glyphPx / 2;\n // Align based on tick-context width.\n const width = this.getWidth();\n if (this.justification === Justification.CENTER) {\n x -= width / 2;\n }\n else if (this.justification === Justification.RIGHT) {\n x -= width;\n }\n let y;\n if (this.glyph) {\n y = stave.getYForLine(this.line + -3);\n this.glyph.render(ctx, x, y);\n }\n else {\n y = stave.getYForLine(this.line + -3);\n this.applyStyle(ctx);\n ctx.setFont(this.textFont);\n ctx.fillText(this.text, x, y);\n const height = ctx.measureText(this.text).height;\n // We called this.setFont(...) in the constructor, so we know this.textFont is available.\n // eslint-disable-next-line\n const { family, size, weight, style } = this.textFont;\n // Scale the font size by 1/1.3.\n const smallerFontSize = Font.scaleSize(size, 0.769231);\n if (this.superscript) {\n ctx.setFont(family, smallerFontSize, weight, style);\n ctx.fillText(this.superscript, x + this.width + 2, y - height / 2.2);\n }\n if (this.subscript) {\n ctx.setFont(family, smallerFontSize, weight, style);\n ctx.fillText(this.subscript, x + this.width + 2, y + height / 2.2 - 1);\n }\n this.restoreStyle(ctx);\n }\n }\n}\nTextNote.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 12,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Fraction } from './fraction';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\n/**\n * Tickable represents a element that sit on a score and\n * has a duration, i.e., Tickables occupy space in the musical rendering dimension.\n */\nexport class Tickable extends Element {\n constructor() {\n super();\n this._preFormatted = false;\n this._postFormatted = false;\n // These properties represent the duration of\n // this tickable element.\n this.ticks = new Fraction(0, 1); // Fractional value of ticks\n this.intrinsicTicks = 0; // Floating point value of ticks\n this.tickMultiplier = new Fraction(1, 1);\n // Formatter metrics\n this.width = 0;\n this.x_shift = 0; // Shift from tick context\n this.modifiers = [];\n this.tupletStack = [];\n this.align_center = false;\n this.center_x_shift = 0; // Shift from tick context if center aligned\n // This flag tells the formatter to ignore this tickable during\n // formatting and justification. It is set by tickables such as BarNote.\n this.ignore_ticks = false;\n // This is a space for an external formatting class or function to maintain\n // metrics.\n this.formatterMetrics = {\n // The freedom of a tickable is the distance it can move without colliding\n // with neighboring elements. A formatter can set these values during its\n // formatting pass, which a different formatter can then use to fine tune.\n freedom: { left: 0, right: 0 },\n // The simplified rational duration of this tick as a string. It can be\n // used as an index to a map or hashtable.\n duration: '',\n // The number of formatting iterations undergone.\n iterations: 0,\n // The space in pixels allocated by this formatter, along with the mean space\n // for tickables of this duration, and the deviation from the mean.\n space: {\n used: 0,\n mean: 0,\n deviation: 0,\n },\n };\n }\n static get CATEGORY() {\n return Category.Tickable;\n }\n /** Reset the Tickable, this function will be overloaded. */\n reset() {\n return this;\n }\n /** Return the ticks. */\n getTicks() {\n return this.ticks;\n }\n /** Check if it ignores the ticks. */\n shouldIgnoreTicks() {\n return this.ignore_ticks;\n }\n /** Ignore the ticks. */\n setIgnoreTicks(flag) {\n this.ignore_ticks = flag;\n return this;\n }\n /** Set width of note. Used by the formatter for positioning. */\n setWidth(width) {\n this.width = width;\n }\n /** Get width of note. Used by the formatter for positioning. */\n getWidth() {\n if (!this._preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call GetWidth on an unformatted note.\");\n }\n return this.width + (this.modifierContext ? this.modifierContext.getWidth() : 0);\n }\n /** Displace note by `x` pixels. Used by the formatter. */\n setXShift(x) {\n this.x_shift = x;\n return this;\n }\n /** Get the `x` displaced pixels of the note. */\n getXShift() {\n return this.x_shift;\n }\n /** Get `x` position of this tick context. */\n getX() {\n const tickContext = this.checkTickContext(`Can't getX() without a TickContext.`);\n return tickContext.getX() + this.x_shift;\n }\n /** Return the formatterMetrics. */\n getFormatterMetrics() {\n return this.formatterMetrics;\n }\n /** Return the center `x` shift. */\n getCenterXShift() {\n if (this.isCenterAligned()) {\n return this.center_x_shift;\n }\n return 0;\n }\n /** Set the center `x` shift. */\n setCenterXShift(centerXShift) {\n this.center_x_shift = centerXShift;\n return this;\n }\n // Check if tickable is center aligned. */\n isCenterAligned() {\n return this.align_center;\n }\n // Set/unset center alignment. */\n setCenterAlignment(align_center) {\n this.align_center = align_center;\n return this;\n }\n /**\n * Return the associated voice. Every tickable must be associated with a voice.\n * This allows formatters and preFormatter to associate them with the right modifierContexts.\n */\n getVoice() {\n return defined(this.voice, 'NoVoice', 'Tickable has no voice.');\n }\n /** Set the associated voice. */\n setVoice(voice) {\n this.voice = voice;\n }\n /** Get the tuplet. */\n getTuplet() {\n return this.tuplet;\n }\n /** Return the intrinsic ticks. */\n getTupletStack() {\n return this.tupletStack;\n }\n /**\n * Reset the specific Tuplet if this is not provided, all tuplets are reset.\n * Remove any prior tuplets from the tick calculation and\n * reset the intrinsic tick value.\n */\n resetTuplet(tuplet) {\n let noteCount;\n let notesOccupied;\n if (tuplet) {\n const i = this.tupletStack.indexOf(tuplet);\n if (i !== -1) {\n this.tupletStack.splice(i, 1);\n noteCount = tuplet.getNoteCount();\n notesOccupied = tuplet.getNotesOccupied();\n // Revert old multiplier by inverting numerator & denom.:\n this.applyTickMultiplier(noteCount, notesOccupied);\n }\n return this;\n }\n while (this.tupletStack.length) {\n tuplet = this.tupletStack.pop();\n noteCount = tuplet.getNoteCount();\n notesOccupied = tuplet.getNotesOccupied();\n // Revert old multiplier by inverting numerator & denom.:\n this.applyTickMultiplier(noteCount, notesOccupied);\n }\n return this;\n }\n /** Attach to new tuplet. */\n setTuplet(tuplet) {\n if (tuplet) {\n this.tupletStack.push(tuplet);\n const noteCount = tuplet.getNoteCount();\n const notesOccupied = tuplet.getNotesOccupied();\n this.applyTickMultiplier(notesOccupied, noteCount);\n }\n this.tuplet = tuplet;\n return this;\n }\n /**\n * Add self to the provided ModifierContext `mc`.\n * If this tickable has modifiers, set modifierContext.\n * @returns this\n */\n addToModifierContext(mc) {\n this.modifierContext = mc;\n for (let i = 0; i < this.modifiers.length; ++i) {\n this.modifierContext.addMember(this.modifiers[i]);\n }\n this.modifierContext.addMember(this);\n this._preFormatted = false;\n return this;\n }\n /**\n * Optional, if tickable has modifiers, associate a Modifier.\n * @param mod the modifier\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n addModifier(modifier, index = 0) {\n this.modifiers.push(modifier);\n this._preFormatted = false;\n return this;\n }\n /** Get the list of associated modifiers. */\n getModifiers() {\n return this.modifiers;\n }\n /** Set the Tick Context. */\n setTickContext(tc) {\n this.tickContext = tc;\n this._preFormatted = false;\n }\n checkTickContext(message = 'Tickable has no tick context.') {\n return defined(this.tickContext, 'NoTickContext', message);\n }\n /** Preformat the Tickable. */\n preFormat() {\n if (this._preFormatted)\n return;\n this.width = 0;\n if (this.modifierContext) {\n this.modifierContext.preFormat();\n this.width += this.modifierContext.getWidth();\n }\n }\n /** Set preformatted status. */\n set preFormatted(value) {\n this._preFormatted = value;\n }\n get preFormatted() {\n return this._preFormatted;\n }\n /** Postformat the Tickable. */\n postFormat() {\n if (this._postFormatted)\n return this;\n this._postFormatted = true;\n return this;\n }\n /** Set postformatted status. */\n set postFormatted(value) {\n this._postFormatted = value;\n }\n get postFormatted() {\n return this._postFormatted;\n }\n /** Return the intrinsic ticks. */\n getIntrinsicTicks() {\n return this.intrinsicTicks;\n }\n /** Set the intrinsic ticks. */\n setIntrinsicTicks(intrinsicTicks) {\n this.intrinsicTicks = intrinsicTicks;\n this.ticks = this.tickMultiplier.clone().multiply(this.intrinsicTicks);\n }\n /** Get the tick multiplier. */\n getTickMultiplier() {\n return this.tickMultiplier;\n }\n /** Apply a tick multiplier. */\n applyTickMultiplier(numerator, denominator) {\n this.tickMultiplier.multiply(numerator, denominator);\n this.ticks = this.tickMultiplier.clone().multiply(this.intrinsicTicks);\n }\n /** Set the duration. */\n setDuration(duration) {\n const ticks = duration.numerator * (Tables.RESOLUTION / duration.denominator);\n this.ticks = this.tickMultiplier.clone().multiply(ticks);\n this.intrinsicTicks = this.ticks.value();\n }\n getAbsoluteX() {\n const tickContext = this.checkTickContext(`Can't getAbsoluteX() without a TickContext.`);\n return tickContext.getX();\n }\n /** Attach this note to a modifier context. */\n setModifierContext(mc) {\n this.modifierContext = mc;\n return this;\n }\n /** Get `ModifierContext`. */\n getModifierContext() {\n return this.modifierContext;\n }\n /** Check and get `ModifierContext`. */\n checkModifierContext() {\n return defined(this.modifierContext, 'NoModifierContext', 'No modifier context attached to this tickable.');\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// A formatter for abstract tickable objects, such as notes, chords,\n// tabs, etc.\nimport { Fraction } from './fraction';\nimport { RuntimeError } from './util';\n/**\n * TickContext formats abstract tickable objects, such as notes, chords, tabs, etc.\n */\nexport class TickContext {\n constructor(options) {\n this.preFormatted = false;\n this.postFormatted = false;\n this.tickID = options && options.tickID ? options.tickID : 0;\n this.currentTick = new Fraction(0, 1);\n this.maxTicks = new Fraction(0, 1);\n this.maxTickable = undefined; // Biggest tickable\n this.minTicks = undefined; // this can remian null if all tickables have ignore_ticks\n this.minTickable = undefined;\n this.padding = 1; // padding on each side (width += padding * 2)\n this.x = 0;\n this.xBase = 0; // base x position without xOffset\n this.xOffset = 0; // xBase and xOffset are an alternative way to describe x (x = xB + xO)\n this.tickables = []; // Notes, tabs, chords, lyrics.\n this.tickablesByVoice = {}; // Tickables indexed by voice number\n // Formatting metrics\n this.notePx = 0; // width of widest note in this context\n this.glyphPx = 0; // width of glyph (note head)\n this.leftDisplacedHeadPx = 0; // Extra left pixels for displaced notes\n this.rightDisplacedHeadPx = 0; // Extra right pixels for displaced notes\n this.modLeftPx = 0; // Left modifier pixels\n this.modRightPx = 0; // Right modifier pixels\n this.totalLeftPx = 0; // Total left pixels\n this.totalRightPx = 0; // Total right pixels\n this.tContexts = []; // Parent array of tick contexts\n this.width = 0;\n this.formatterMetrics = {\n // The freedom of a tickcontext is the distance it can move without colliding\n // with neighboring elements. A formatter can set these values during its\n // formatting pass, which a different formatter can then use to fine tune.\n freedom: { left: 0, right: 0 },\n };\n }\n static getNextContext(tContext) {\n const contexts = tContext.tContexts;\n const index = contexts.indexOf(tContext);\n if (index + 1 < contexts.length)\n return contexts[index + 1];\n }\n getTickID() {\n return this.tickID;\n }\n getX() {\n return this.x;\n }\n setX(x) {\n this.x = x;\n this.xBase = x;\n this.xOffset = 0;\n return this;\n }\n getXBase() {\n return this.xBase;\n } // use of xBase and xOffset is optional, avoids offset creep\n setXBase(xBase) {\n this.xBase = xBase;\n this.x = xBase + this.xOffset;\n }\n getXOffset() {\n return this.xOffset;\n }\n setXOffset(xOffset) {\n this.xOffset = xOffset;\n this.x = this.xBase + xOffset;\n }\n getWidth() {\n return this.width + this.padding * 2;\n }\n setPadding(padding) {\n this.padding = padding;\n return this;\n }\n getMaxTicks() {\n return this.maxTicks;\n }\n getMinTicks() {\n return this.minTicks;\n }\n getMaxTickable() {\n return this.maxTickable;\n }\n getMinTickable() {\n return this.minTickable;\n }\n getTickables() {\n return this.tickables;\n }\n /**\n * Introduced on 2020-04-17 as getTickablesForVoice(voiceIndex).\n * https://github.com/0xfe/vexflow/blame/dc97b0cc5bb93171c0038638c34362dc958222ca/src/tickcontext.js#L63\n * Renamed on 2021-08-05 to getTickableForVoice(voiceIndex). Method renamed to singular, since it returns one Tickable.\n */\n getTickableForVoice(voiceIndex) {\n return this.tickablesByVoice[voiceIndex];\n }\n getTickablesByVoice() {\n return this.tickablesByVoice;\n }\n getCenterAlignedTickables() {\n return this.tickables.filter((tickable) => tickable.isCenterAligned());\n }\n /** Gets widths context, note and left/right modifiers for formatting. */\n getMetrics() {\n const { width, glyphPx, notePx, leftDisplacedHeadPx, rightDisplacedHeadPx, modLeftPx, modRightPx, totalLeftPx, totalRightPx, } = this;\n return {\n width,\n glyphPx,\n notePx,\n leftDisplacedHeadPx,\n rightDisplacedHeadPx,\n modLeftPx,\n modRightPx,\n totalLeftPx,\n totalRightPx,\n };\n }\n getCurrentTick() {\n return this.currentTick;\n }\n setCurrentTick(tick) {\n this.currentTick = tick;\n this.preFormatted = false;\n }\n addTickable(tickable, voiceIndex) {\n if (!tickable) {\n throw new RuntimeError('BadArgument', 'Invalid tickable added.');\n }\n if (!tickable.shouldIgnoreTicks()) {\n const ticks = tickable.getTicks();\n if (ticks.greaterThan(this.maxTicks)) {\n this.maxTicks = ticks.clone();\n this.maxTickable = tickable;\n }\n if (this.minTicks == null) {\n this.minTicks = ticks.clone();\n this.minTickable = tickable;\n }\n else if (ticks.lessThan(this.minTicks)) {\n this.minTicks = ticks.clone();\n this.minTickable = tickable;\n }\n }\n tickable.setTickContext(this);\n this.tickables.push(tickable);\n this.tickablesByVoice[voiceIndex || 0] = tickable;\n this.preFormatted = false;\n return this;\n }\n preFormat() {\n if (this.preFormatted)\n return this;\n for (let i = 0; i < this.tickables.length; ++i) {\n const tickable = this.tickables[i];\n tickable.preFormat();\n const metrics = tickable.getMetrics();\n // Maintain max displaced head pixels from all tickables in the context\n this.leftDisplacedHeadPx = Math.max(this.leftDisplacedHeadPx, metrics.leftDisplacedHeadPx);\n this.rightDisplacedHeadPx = Math.max(this.rightDisplacedHeadPx, metrics.rightDisplacedHeadPx);\n // Maintain the widest note for all tickables in the context\n this.notePx = Math.max(this.notePx, metrics.notePx);\n // Maintain the widest note head\n this.glyphPx = Math.max(this.glyphPx, metrics.glyphWidth || 0);\n // Total modifier shift\n this.modLeftPx = Math.max(this.modLeftPx, metrics.modLeftPx);\n this.modRightPx = Math.max(this.modRightPx, metrics.modRightPx);\n // Total shift\n this.totalLeftPx = Math.max(this.totalLeftPx, metrics.modLeftPx + metrics.leftDisplacedHeadPx);\n this.totalRightPx = Math.max(this.totalRightPx, metrics.modRightPx + metrics.rightDisplacedHeadPx);\n // Recalculate the tick context total width\n this.width = this.notePx + this.totalLeftPx + this.totalRightPx;\n }\n return this;\n }\n postFormat() {\n if (this.postFormatted)\n return this;\n this.postFormatted = true;\n return this;\n }\n getFormatterMetrics() {\n return this.formatterMetrics;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// Renders time signatures glyphs for staffs\n// This class is used by TimeSignature to render the associated glyphs\nimport { Glyph } from './glyph';\nimport { defined } from './util';\nexport class TimeSignatureGlyph extends Glyph {\n constructor(timeSignature, topDigits, botDigits, code, point, options) {\n var _a;\n super(code, point, options);\n this.timeSignature = timeSignature;\n this.topGlyphs = [];\n this.botGlyphs = [];\n let topWidth = 0;\n for (let i = 0; i < topDigits.length; ++i) {\n let timeSigType = topDigits[i];\n switch (topDigits[i]) {\n case '-':\n timeSigType = 'Minus';\n break;\n case '+':\n timeSigType = botDigits.length > 0 ? 'PlusSmall' : 'Plus';\n break;\n case '(':\n timeSigType = botDigits.length > 0 ? 'ParensLeftSmall' : 'ParensLeft';\n break;\n case ')':\n timeSigType = botDigits.length > 0 ? 'ParensRightSmall' : 'ParensRight';\n break;\n }\n const topGlyph = new Glyph('timeSig' + timeSigType, this.timeSignature.point);\n this.topGlyphs.push(topGlyph);\n topWidth += (_a = topGlyph.getMetrics().width) !== null && _a !== void 0 ? _a : 0;\n }\n let botWidth = 0;\n for (let i = 0; i < botDigits.length; ++i) {\n let timeSigType = botDigits[i];\n switch (botDigits[i]) {\n case '+':\n timeSigType = 'PlusSmall';\n break;\n case '(':\n timeSigType = 'ParensLeftSmall';\n break;\n case ')':\n timeSigType = 'ParensRightSmall';\n break;\n }\n const botGlyph = new Glyph('timeSig' + timeSigType, this.timeSignature.point);\n this.botGlyphs.push(botGlyph);\n botWidth += defined(botGlyph.getMetrics().width);\n }\n this.width = Math.max(topWidth, botWidth);\n this.xMin = this.getMetrics().x_min;\n this.topStartX = (this.width - topWidth) / 2.0;\n this.botStartX = (this.width - botWidth) / 2.0;\n this.reset();\n }\n getMetrics() {\n return {\n x_min: this.xMin,\n x_max: this.xMin + this.width,\n width: this.width,\n };\n }\n renderToStave(x) {\n const stave = this.checkStave();\n const ctx = this.checkContext();\n let start_x = x + this.topStartX;\n let y = 0;\n if (this.botGlyphs.length > 0)\n y = stave.getYForLine(this.timeSignature.topLine);\n else\n y = (stave.getYForLine(this.timeSignature.topLine) + stave.getYForLine(this.timeSignature.bottomLine)) / 2;\n for (let i = 0; i < this.topGlyphs.length; ++i) {\n const glyph = this.topGlyphs[i];\n Glyph.renderOutline(ctx, glyph.getMetrics().outline, this.scale, start_x + this.x_shift, y);\n start_x += defined(glyph.getMetrics().width);\n }\n start_x = x + this.botStartX;\n y = stave.getYForLine(this.timeSignature.bottomLine);\n for (let i = 0; i < this.botGlyphs.length; ++i) {\n const glyph = this.botGlyphs[i];\n this.timeSignature.placeGlyphOnLine(glyph, stave, 0);\n Glyph.renderOutline(ctx, glyph.getMetrics().outline, this.scale, start_x + glyph.getMetrics().x_shift, y);\n start_x += defined(glyph.getMetrics().width);\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// Implements time signatures glyphs for staffs\n// See tables.js for the internal time signatures\n// representation\nimport { Glyph } from './glyph';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { TimeSignatureGlyph } from './timesigglyph';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nconst assertIsValidTimeSig = (timeSpec) => {\n const numbers = timeSpec.split('/');\n if (numbers.length !== 2 && numbers[0] !== '+' && numbers[0] !== '-') {\n throw new RuntimeError('BadTimeSignature', `Invalid time spec: ${timeSpec}. Must be in the form \"/\"`);\n }\n numbers.forEach((number) => {\n // Characters consisting in number 0..9, '+', '-', '(' or ')'\n if (/^[0-9+\\-()]+$/.test(number) == false) {\n throw new RuntimeError('BadTimeSignature', `Invalid time spec: ${timeSpec}. Must contain valid signatures.`);\n }\n });\n};\nexport class TimeSignature extends StaveModifier {\n constructor(timeSpec = '4/4', customPadding = 15, validate_args = true) {\n super();\n this.validate_args = validate_args;\n const padding = customPadding;\n const musicFont = Tables.currentMusicFont();\n this.point = musicFont.lookupMetric('digits.point');\n const fontLineShift = musicFont.lookupMetric('digits.shiftLine', 0);\n this.topLine = 2 + fontLineShift;\n this.bottomLine = 4 + fontLineShift;\n this.setPosition(StaveModifierPosition.BEGIN);\n this.info = this.parseTimeSpec(timeSpec);\n this.setWidth(defined(this.info.glyph.getMetrics().width));\n this.setPadding(padding);\n }\n static get CATEGORY() {\n return Category.TimeSignature;\n }\n static get glyphs() {\n return {\n C: {\n code: 'timeSigCommon',\n point: 40,\n line: 2,\n },\n 'C|': {\n code: 'timeSigCutCommon',\n point: 40,\n line: 2,\n },\n };\n }\n parseTimeSpec(timeSpec) {\n var _a, _b;\n if (timeSpec === 'C' || timeSpec === 'C|') {\n const { line, code, point } = TimeSignature.glyphs[timeSpec];\n return {\n line,\n num: false,\n glyph: new Glyph(code, point),\n };\n }\n if (this.validate_args) {\n assertIsValidTimeSig(timeSpec);\n }\n const parts = timeSpec.split('/');\n return {\n num: true,\n glyph: this.makeTimeSignatureGlyph((_a = parts[0]) !== null && _a !== void 0 ? _a : '', (_b = parts[1]) !== null && _b !== void 0 ? _b : ''),\n };\n }\n makeTimeSignatureGlyph(topDigits, botDigits) {\n return new TimeSignatureGlyph(this, topDigits, botDigits, 'timeSig0', this.point);\n }\n getInfo() {\n return this.info;\n }\n setTimeSig(timeSpec) {\n this.info = this.parseTimeSpec(timeSpec);\n return this;\n }\n draw() {\n const stave = this.checkStave();\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.openGroup('timesignature', this.getAttribute('id'));\n this.info.glyph.setStave(stave);\n this.info.glyph.setContext(ctx);\n this.placeGlyphOnLine(this.info.glyph, stave, this.info.line);\n this.info.glyph.renderToStave(this.x);\n ctx.closeGroup();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2014\nimport { Note } from './note';\nimport { TimeSignature } from './timesignature';\nimport { Category } from './typeguard';\nexport class TimeSigNote extends Note {\n constructor(timeSpec, customPadding) {\n super({ duration: 'b' });\n const timeSignature = new TimeSignature(timeSpec, customPadding);\n this.timeSigInfo = timeSignature.getInfo();\n this.setWidth(this.timeSigInfo.glyph.getMetrics().width);\n // Note properties\n this.ignore_ticks = true;\n }\n static get CATEGORY() {\n return Category.TimeSigNote;\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n draw() {\n const stave = this.checkStave();\n const ctx = this.checkContext();\n this.setRendered();\n if (!this.timeSigInfo.glyph.getContext()) {\n this.timeSigInfo.glyph.setContext(ctx);\n }\n this.timeSigInfo.glyph.setStave(stave);\n this.timeSigInfo.glyph.setYShift(stave.getYForLine(2) - stave.getYForGlyphs());\n this.timeSigInfo.glyph.renderToStave(this.getAbsoluteX());\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Mike Corrigan \n// MIT License\nimport { Glyph } from './glyph';\nimport { GraceNote } from './gracenote';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category, isGraceNote } from './typeguard';\n/** Tremolo implements tremolo notation. */\nexport class Tremolo extends Modifier {\n /**\n * @param num number of bars\n */\n constructor(num) {\n super();\n this.num = num;\n this.position = Modifier.Position.CENTER;\n this.code = 'tremolo1';\n // big strokes scales initialised to 1 (no scale)\n this.y_spacing_scale = 1;\n this.extra_stroke_scale = 1;\n }\n static get CATEGORY() {\n return Category.Tremolo;\n }\n /** Draw the tremolo on the rendering context. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const stemDirection = note.getStemDirection();\n const start = note.getModifierStartXY(this.position, this.index);\n let x = start.x;\n const gn = isGraceNote(note);\n const scale = gn ? GraceNote.SCALE : 1;\n const category = `tremolo.${gn ? 'grace' : 'default'}`;\n const musicFont = Tables.currentMusicFont();\n let y_spacing = musicFont.lookupMetric(`${category}.spacing`) * stemDirection;\n // add y_spacing_scale for big strokes (#1258)\n y_spacing *= this.y_spacing_scale;\n const height = this.num * y_spacing;\n let y = note.getStemExtents().baseY - height;\n if (stemDirection < 0) {\n y += musicFont.lookupMetric(`${category}.offsetYStemDown`) * scale;\n }\n else {\n y += musicFont.lookupMetric(`${category}.offsetYStemUp`) * scale;\n }\n const fontScale = musicFont.lookupMetric(`${category}.point`);\n x += musicFont.lookupMetric(`${category}.offsetXStem${stemDirection === Stem.UP ? 'Up' : 'Down'}`);\n for (let i = 0; i < this.num; ++i) {\n Glyph.renderGlyph(ctx, x, y, fontScale, this.code, { category, scale: this.extra_stroke_scale });\n y += y_spacing;\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Tables } from './tables';\nimport { RuntimeError } from './util';\n/** `Tuning` implements varies types of tunings for tablature. */\nexport class Tuning {\n /**\n * Constructor.\n * @param tuningString tuning name (eg. 'dagdad') or comma separated note strings\n */\n constructor(tuningString = 'E/5,B/4,G/4,D/4,A/3,E/3,B/2,E/2') {\n this.tuningValues = [];\n // Default to standard tuning.\n this.setTuning(tuningString);\n }\n static get names() {\n return {\n standard: 'E/5,B/4,G/4,D/4,A/3,E/3',\n dagdad: 'D/5,A/4,G/4,D/4,A/3,D/3',\n dropd: 'E/5,B/4,G/4,D/4,A/3,D/3',\n eb: 'Eb/5,Bb/4,Gb/4,Db/4,Ab/3,Db/3',\n standardBanjo: 'D/5,B/4,G/4,D/4,G/5',\n };\n }\n /** Return the note number associated to the note string. */\n noteToInteger(noteString) {\n return Tables.keyProperties(noteString).int_value;\n }\n /**\n * Set tuning identified by tuning name (eg. 'dagdad')\n * @param tuningString tuning name (eg. 'dagdad') or comma separated note strings\n */\n setTuning(tuningString) {\n if (Tuning.names[tuningString]) {\n tuningString = Tuning.names[tuningString];\n }\n this.tuningValues = [];\n const keys = tuningString.split(/\\s*,\\s*/);\n if (keys.length === 0) {\n throw new RuntimeError('BadArguments', `Invalid tuning string: ${tuningString}`);\n }\n for (let i = 0; i < keys.length; ++i) {\n this.tuningValues[i] = this.noteToInteger(keys[i]);\n }\n }\n /** Return the note number associated with a tablature string. */\n getValueForString(stringNum) {\n const s = Number(stringNum);\n if (s < 1 || s > this.tuningValues.length) {\n throw new RuntimeError('BadArguments', `String number must be between 1 and ${this.tuningValues.length}:${stringNum}`);\n }\n return this.tuningValues[s - 1];\n }\n /** Return the note number associated with a tablature string and fret. */\n getValueForFret(fretNum, stringNum) {\n const stringValue = this.getValueForString(stringNum);\n const f = Number(fretNum);\n if (f < 0) {\n throw new RuntimeError('BadArguments', `Fret number must be 0 or higher: ${fretNum}`);\n }\n return stringValue + f;\n }\n /** Return the note string associated with tablature string and fret. */\n getNoteForFret(fretNum, stringNum) {\n const noteValue = this.getValueForFret(fretNum, stringNum);\n const octave = Math.floor(noteValue / 12);\n const value = noteValue % 12;\n return `${Tables.integerToNote(value)}/${octave}`;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n/**\n * ## Description\n *\n * Create a new tuplet from the specified notes. The notes must\n * be part of the same voice. If they are of different rhythmic\n * values, then options.num_notes must be set.\n *\n * @constructor\n * @param {Array.} A set of notes: staveNotes,\n * notes, etc... any class that inherits stemmableNote at some\n * point in its prototype chain.\n * @param options: object {\n *\n * num_notes: fit this many notes into...\n * notes_occupied: ...the space of this many notes\n *\n * Together, these two properties make up the tuplet ratio\n * in the form of num_notes : notes_occupied.\n * num_notes defaults to the number of notes passed in, so\n * it is important that if you omit this property, all of\n * the notes passed should be of the same note value.\n * notes_occupied defaults to 2 -- so you should almost\n * certainly pass this parameter for anything other than\n * a basic triplet.\n *\n * location:\n * default 1, which is above the notes: ┌─── 3 ───┐\n * -1 is below the notes └─── 3 ───┘\n *\n * bracketed: boolean, draw a bracket around the tuplet number\n * when true: ┌─── 3 ───┐ when false: 3\n * defaults to true if notes are not beamed, false otherwise\n *\n * ratioed: boolean\n * when true: ┌─── 7:8 ───┐, when false: ┌─── 7 ───┐\n * defaults to true if the difference between num_notes and\n * notes_occupied is greater than 1.\n *\n * y_offset: int, default 0\n * manually offset a tuplet, for instance to avoid collisions\n * with articulations, etc...\n * }\n */\nimport { Element } from './element';\nimport { Formatter } from './formatter';\nimport { Glyph } from './glyph';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nexport var TupletLocation;\n(function (TupletLocation) {\n TupletLocation[TupletLocation[\"BOTTOM\"] = -1] = \"BOTTOM\";\n TupletLocation[TupletLocation[\"TOP\"] = 1] = \"TOP\";\n})(TupletLocation || (TupletLocation = {}));\nexport class Tuplet extends Element {\n constructor(notes, options = {}) {\n super();\n this.numerator_glyphs = [];\n this.denom_glyphs = [];\n if (!notes || !notes.length) {\n throw new RuntimeError('BadArguments', 'No notes provided for tuplet.');\n }\n this.options = options;\n this.notes = notes;\n this.num_notes = this.options.num_notes != undefined ? this.options.num_notes : notes.length;\n // We accept beats_occupied, but warn that it's deprecated:\n // the preferred property name is now notes_occupied.\n if (this.options.beats_occupied) {\n this.beatsOccupiedDeprecationWarning();\n }\n this.notes_occupied = this.options.notes_occupied || this.options.beats_occupied || 2;\n if (this.options.bracketed != undefined) {\n this.bracketed = this.options.bracketed;\n }\n else {\n this.bracketed = notes.some((note) => !note.hasBeam());\n }\n this.ratioed =\n this.options.ratioed != undefined ? this.options.ratioed : Math.abs(this.notes_occupied - this.num_notes) > 1;\n this.point = Tables.currentMusicFont().lookupMetric('digits.tupletPoint');\n this.y_pos = 16;\n this.x_pos = 100;\n this.width = 200;\n this.setTupletLocation(this.options.location || Tuplet.LOCATION_TOP);\n Formatter.AlignRestsToNotes(notes, true, true);\n this.resolveGlyphs();\n this.attach();\n }\n static get CATEGORY() {\n return Category.Tuplet;\n }\n static get LOCATION_TOP() {\n return TupletLocation.TOP;\n }\n static get LOCATION_BOTTOM() {\n return TupletLocation.BOTTOM;\n }\n static get NESTING_OFFSET() {\n return 15;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static get metrics() {\n return Tables.currentMusicFont().getMetrics().glyphs.tuplet;\n }\n attach() {\n for (let i = 0; i < this.notes.length; i++) {\n const note = this.notes[i];\n note.setTuplet(this);\n }\n }\n detach() {\n for (let i = 0; i < this.notes.length; i++) {\n const note = this.notes[i];\n note.resetTuplet(this);\n }\n }\n /**\n * Set whether or not the bracket is drawn.\n */\n setBracketed(bracketed) {\n this.bracketed = !!bracketed;\n return this;\n }\n /**\n * Set whether or not the ratio is shown.\n */\n setRatioed(ratioed) {\n this.ratioed = !!ratioed;\n return this;\n }\n /**\n * Set the tuplet indicator to be displayed either on the top or bottom of the stave.\n */\n setTupletLocation(location) {\n if (location !== Tuplet.LOCATION_TOP && location !== Tuplet.LOCATION_BOTTOM) {\n // eslint-disable-next-line\n console.warn(`Invalid tuplet location [${location}]. Using Tuplet.LOCATION_TOP.`);\n location = Tuplet.LOCATION_TOP;\n }\n this.location = location;\n return this;\n }\n getNotes() {\n return this.notes;\n }\n getNoteCount() {\n return this.num_notes;\n }\n beatsOccupiedDeprecationWarning() {\n // eslint-disable-next-line\n console.warn('beats_occupied has been deprecated as an option for tuplets. Please use notes_occupied instead.', 'Calls to getBeatsOccupied / setBeatsOccupied should now be routed to getNotesOccupied / setNotesOccupied.', 'The old methods will be removed in VexFlow 5.0.');\n }\n getBeatsOccupied() {\n this.beatsOccupiedDeprecationWarning();\n return this.getNotesOccupied();\n }\n setBeatsOccupied(beats) {\n this.beatsOccupiedDeprecationWarning();\n return this.setNotesOccupied(beats);\n }\n getNotesOccupied() {\n return this.notes_occupied;\n }\n setNotesOccupied(notes) {\n this.detach();\n this.notes_occupied = notes;\n this.resolveGlyphs();\n this.attach();\n }\n resolveGlyphs() {\n this.numerator_glyphs = [];\n let n = this.num_notes;\n while (n >= 1) {\n this.numerator_glyphs.unshift(new Glyph('timeSig' + (n % 10), this.point));\n n = parseInt((n / 10).toString(), 10);\n }\n this.denom_glyphs = [];\n n = this.notes_occupied;\n while (n >= 1) {\n this.denom_glyphs.unshift(new Glyph('timeSig' + (n % 10), this.point));\n n = parseInt((n / 10).toString(), 10);\n }\n }\n // determine how many tuplets are nested within this tuplet\n // on the same side (above/below), to calculate a y\n // offset for this tuplet:\n getNestedTupletCount() {\n const location = this.location;\n const first_note = this.notes[0];\n let maxTupletCount = countTuplets(first_note, location);\n let minTupletCount = countTuplets(first_note, location);\n // Count the tuplets that are on the same side (above/below)\n // as this tuplet:\n function countTuplets(note, location) {\n return note.getTupletStack().filter((tuplet) => tuplet.location === location).length;\n }\n this.notes.forEach((note) => {\n const tupletCount = countTuplets(note, location);\n maxTupletCount = tupletCount > maxTupletCount ? tupletCount : maxTupletCount;\n minTupletCount = tupletCount < minTupletCount ? tupletCount : minTupletCount;\n });\n return maxTupletCount - minTupletCount;\n }\n // determine the y position of the tuplet:\n getYPosition() {\n // offset the tuplet for any nested tuplets between\n // it and the notes:\n const nested_tuplet_y_offset = this.getNestedTupletCount() * Tuplet.NESTING_OFFSET * -this.location;\n // offset the tuplet for any manual y_offset:\n const y_offset = this.options.y_offset || 0;\n // now iterate through the notes and find our highest\n // or lowest locations, to form a base y_pos\n const first_note = this.notes[0];\n let y_pos;\n if (this.location === Tuplet.LOCATION_TOP) {\n y_pos = first_note.checkStave().getYForLine(0) - Tuplet.metrics.topModifierOffset;\n // check modifiers above note to see if they will collide with tuplet beam\n for (let i = 0; i < this.notes.length; ++i) {\n const note = this.notes[i];\n let modLines = 0;\n const mc = note.getModifierContext();\n if (mc) {\n modLines = Math.max(modLines, mc.getState().top_text_line);\n }\n const modY = note.getYForTopText(modLines) - Tuplet.metrics.noteHeadOffset;\n if (note.hasStem() || note.isRest()) {\n const top_y = note.getStemDirection() === Stem.UP\n ? note.getStemExtents().topY - Tuplet.metrics.stemOffset\n : note.getStemExtents().baseY - Tuplet.metrics.noteHeadOffset;\n y_pos = Math.min(top_y, y_pos);\n if (modLines > 0) {\n y_pos = Math.min(modY, y_pos);\n }\n }\n }\n }\n else {\n let lineCheck = Tuplet.metrics.bottomLine; // tuplet default on line 4\n // check modifiers below note to see if they will collide with tuplet beam\n this.notes.forEach((nn) => {\n const mc = nn.getModifierContext();\n if (mc) {\n lineCheck = Math.max(lineCheck, mc.getState().text_line + 1);\n }\n });\n y_pos = first_note.checkStave().getYForLine(lineCheck) + Tuplet.metrics.noteHeadOffset;\n for (let i = 0; i < this.notes.length; ++i) {\n if (this.notes[i].hasStem() || this.notes[i].isRest()) {\n const bottom_y = this.notes[i].getStemDirection() === Stem.UP\n ? this.notes[i].getStemExtents().baseY + Tuplet.metrics.noteHeadOffset\n : this.notes[i].getStemExtents().topY + Tuplet.metrics.stemOffset;\n if (bottom_y > y_pos) {\n y_pos = bottom_y;\n }\n }\n }\n }\n return y_pos + nested_tuplet_y_offset + y_offset;\n }\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n // determine x value of left bound of tuplet\n const first_note = this.notes[0];\n const last_note = this.notes[this.notes.length - 1];\n if (!this.bracketed) {\n this.x_pos = first_note.getStemX();\n this.width = last_note.getStemX() - this.x_pos;\n }\n else {\n this.x_pos = first_note.getTieLeftX() - 5;\n this.width = last_note.getTieRightX() - this.x_pos + 5;\n }\n // determine y value for tuplet\n this.y_pos = this.getYPosition();\n const addGlyphWidth = (width, glyph) => width + defined(glyph.getMetrics().width);\n // calculate total width of tuplet notation\n let width = this.numerator_glyphs.reduce(addGlyphWidth, 0);\n if (this.ratioed) {\n width = this.denom_glyphs.reduce(addGlyphWidth, width);\n width += this.point * 0.32;\n }\n const notation_center_x = this.x_pos + this.width / 2;\n const notation_start_x = notation_center_x - width / 2;\n // draw bracket if the tuplet is not beamed\n if (this.bracketed) {\n const line_width = this.width / 2 - width / 2 - 5;\n // only draw the bracket if it has positive length\n if (line_width > 0) {\n ctx.fillRect(this.x_pos, this.y_pos, line_width, 1);\n ctx.fillRect(this.x_pos + this.width / 2 + width / 2 + 5, this.y_pos, line_width, 1);\n ctx.fillRect(this.x_pos, this.y_pos + (this.location === Tuplet.LOCATION_BOTTOM ? 1 : 0), 1, this.location * 10);\n ctx.fillRect(this.x_pos + this.width, this.y_pos + (this.location === Tuplet.LOCATION_BOTTOM ? 1 : 0), 1, this.location * 10);\n }\n }\n // draw numerator glyphs\n const shiftY = Tables.currentMusicFont().lookupMetric('digits.shiftY', 0);\n let x_offset = 0;\n this.numerator_glyphs.forEach((glyph) => {\n glyph.render(ctx, notation_start_x + x_offset, this.y_pos + this.point / 3 - 2 + shiftY);\n x_offset += defined(glyph.getMetrics().width);\n });\n // display colon and denominator if the ratio is to be shown\n if (this.ratioed) {\n const colon_x = notation_start_x + x_offset + this.point * 0.16;\n const colon_radius = this.point * 0.06;\n ctx.beginPath();\n ctx.arc(colon_x, this.y_pos - this.point * 0.08, colon_radius, 0, Math.PI * 2, true);\n ctx.closePath();\n ctx.fill();\n ctx.beginPath();\n ctx.arc(colon_x, this.y_pos + this.point * 0.12, colon_radius, 0, Math.PI * 2, true);\n ctx.closePath();\n ctx.fill();\n x_offset += this.point * 0.32;\n this.denom_glyphs.forEach((glyph) => {\n glyph.render(ctx, notation_start_x + x_offset, this.y_pos + this.point / 3 - 2 + shiftY);\n x_offset += defined(glyph.getMetrics().width);\n });\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Ron B. Yeh\n// MIT License\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * Use instead of `instanceof` as a more flexible type guard.\n * @param obj check if this object's CATEGORY matches the provided category.\n * @param category a string representing a category of VexFlow objects.\n * @param checkAncestors defaults to `true`, so we walk up the prototype chain to look for a matching `CATEGORY`.\n * If `false`, we do not check the superclass or other ancestors.\n * @returns true if `obj` has a static `CATEGORY` property that matches `category`.\n */\nexport function isCategory(obj, category, checkAncestors = true) {\n // obj is undefined, a number, a primitive string, or null.\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n // `obj.constructor` is a reference to the constructor function that created the `obj` instance.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor\n let constructorFcn = obj.constructor;\n // Check if the object's static .CATEGORY matches the provided category.\n if (checkAncestors) {\n // Walk up the prototype chain to look for a matching obj.constructor.CATEGORY.\n while (obj !== null) {\n constructorFcn = obj.constructor;\n if ('CATEGORY' in constructorFcn && constructorFcn.CATEGORY === category) {\n return true;\n }\n obj = Object.getPrototypeOf(obj);\n }\n return false;\n }\n else {\n // Do not walk up the prototype chain. Just check this particular object's static .CATEGORY string.\n return 'CATEGORY' in constructorFcn && constructorFcn.CATEGORY === category;\n }\n}\nexport const isAccidental = (obj) => isCategory(obj, Category.Accidental);\nexport const isAnnotation = (obj) => isCategory(obj, Category.Annotation);\nexport const isBarline = (obj) => isCategory(obj, Category.Barline);\nexport const isDot = (obj) => isCategory(obj, Category.Dot);\nexport const isGraceNote = (obj) => isCategory(obj, Category.GraceNote);\nexport const isGraceNoteGroup = (obj) => isCategory(obj, Category.GraceNoteGroup);\nexport const isNote = (obj) => isCategory(obj, Category.Note);\nexport const isRenderContext = (obj) => isCategory(obj, Category.RenderContext);\nexport const isStaveNote = (obj) => isCategory(obj, Category.StaveNote);\nexport const isStemmableNote = (obj) => isCategory(obj, Category.StemmableNote);\nexport const isTabNote = (obj) => isCategory(obj, Category.TabNote);\n// 'const' enums are erased by the TypeScript compiler. The string values are inlined at all the use sites.\n// See: https://www.typescriptlang.org/docs/handbook/enums.html#const-enums\nexport var Category;\n(function (Category) {\n Category[\"Accidental\"] = \"Accidental\";\n Category[\"Annotation\"] = \"Annotation\";\n Category[\"Articulation\"] = \"Articulation\";\n Category[\"Barline\"] = \"Barline\";\n Category[\"BarNote\"] = \"BarNote\";\n Category[\"Beam\"] = \"Beam\";\n Category[\"Bend\"] = \"Bend\";\n Category[\"ChordSymbol\"] = \"ChordSymbol\";\n Category[\"Clef\"] = \"Clef\";\n Category[\"ClefNote\"] = \"ClefNote\";\n Category[\"Crescendo\"] = \"Crescendo\";\n Category[\"Curve\"] = \"Curve\";\n Category[\"Dot\"] = \"Dot\";\n Category[\"Element\"] = \"Element\";\n Category[\"Fraction\"] = \"Fraction\";\n Category[\"FretHandFinger\"] = \"FretHandFinger\";\n Category[\"GhostNote\"] = \"GhostNote\";\n Category[\"Glyph\"] = \"Glyph\";\n Category[\"GlyphNote\"] = \"GlyphNote\";\n Category[\"GraceNote\"] = \"GraceNote\";\n Category[\"GraceNoteGroup\"] = \"GraceNoteGroup\";\n Category[\"GraceTabNote\"] = \"GraceTabNote\";\n Category[\"KeySignature\"] = \"KeySignature\";\n Category[\"KeySigNote\"] = \"KeySigNote\";\n Category[\"Modifier\"] = \"Modifier\";\n Category[\"MultiMeasureRest\"] = \"MultiMeasureRest\";\n Category[\"Note\"] = \"Note\";\n Category[\"NoteHead\"] = \"NoteHead\";\n Category[\"NoteSubGroup\"] = \"NoteSubGroup\";\n Category[\"Ornament\"] = \"Ornament\";\n Category[\"Parenthesis\"] = \"Parenthesis\";\n Category[\"PedalMarking\"] = \"PedalMarking\";\n Category[\"RenderContext\"] = \"RenderContext\";\n Category[\"RepeatNote\"] = \"RepeatNote\";\n Category[\"Repetition\"] = \"Repetition\";\n Category[\"Stave\"] = \"Stave\";\n Category[\"StaveConnector\"] = \"StaveConnector\";\n Category[\"StaveHairpin\"] = \"StaveHairpin\";\n Category[\"StaveLine\"] = \"StaveLine\";\n Category[\"StaveModifier\"] = \"StaveModifier\";\n Category[\"StaveNote\"] = \"StaveNote\";\n Category[\"StaveSection\"] = \"StaveSection\";\n Category[\"StaveTempo\"] = \"StaveTempo\";\n Category[\"StaveText\"] = \"StaveText\";\n Category[\"StaveTie\"] = \"StaveTie\";\n Category[\"Stem\"] = \"Stem\";\n Category[\"StemmableNote\"] = \"StemmableNote\";\n Category[\"StringNumber\"] = \"StringNumber\";\n Category[\"Stroke\"] = \"Stroke\";\n Category[\"System\"] = \"System\";\n Category[\"TabNote\"] = \"TabNote\";\n Category[\"TabSlide\"] = \"TabSlide\";\n Category[\"TabStave\"] = \"TabStave\";\n Category[\"TabTie\"] = \"TabTie\";\n Category[\"TextBracket\"] = \"TextBracket\";\n Category[\"TextDynamics\"] = \"TextDynamics\";\n Category[\"TextNote\"] = \"TextNote\";\n Category[\"Tickable\"] = \"Tickable\";\n Category[\"TimeSignature\"] = \"TimeSignature\";\n Category[\"TimeSigNote\"] = \"TimeSigNote\";\n Category[\"Tremolo\"] = \"Tremolo\";\n Category[\"Tuplet\"] = \"Tuplet\";\n Category[\"Vibrato\"] = \"Vibrato\";\n Category[\"VibratoBracket\"] = \"VibratoBracket\";\n Category[\"Voice\"] = \"Voice\";\n Category[\"Volta\"] = \"Volta\";\n})(Category || (Category = {}));\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// Note: Keep this module free of imports to reduce the chance of circular dependencies.\n/** `RuntimeError` will be thrown by VexFlow classes in case of error. */\nexport class RuntimeError extends Error {\n constructor(code, message = '') {\n super('[RuntimeError] ' + code + ': ' + message);\n this.code = code;\n }\n}\n/** VexFlow can be used outside of the browser (e.g., Node) where `window` may not be defined. */\n// eslint-disable-next-line\nexport function globalObject() {\n if (typeof globalThis !== 'undefined') {\n return globalThis;\n }\n if (typeof self !== 'undefined') {\n return self;\n }\n if (typeof window !== 'undefined') {\n return window;\n }\n if (typeof global !== 'undefined') {\n return global;\n }\n return Function('return this')();\n}\n/**\n * Check that `x` is of type `T` and not `undefined`.\n * If `x` is `undefined`, throw a RuntimeError with the optionally provided error code and message.\n */\nexport function defined(x, code = 'undefined', message = '') {\n if (x === undefined) {\n throw new RuntimeError(code, message);\n }\n return x;\n}\n/** Default log function sends all arguments to console. */\n// eslint-disable-next-line\nexport function log(block, ...args) {\n if (!args)\n return;\n const line = Array.prototype.slice.call(args).join(' ');\n globalObject().console.log(block + ': ' + line);\n}\n/** Dump warning to console. */\n// eslint-disable-next-line\nexport function warn(...args) {\n const line = args.join(' ');\n const err = new Error();\n globalObject().console.log('Warning: ', line, err.stack);\n}\n/** Round number to nearest fractional value (`.5`, `.25`, etc.) */\nfunction roundN(x, n) {\n return x % n >= n / 2 ? parseInt(`${x / n}`, 10) * n + n : parseInt(`${x / n}`, 10) * n;\n}\n/** Locate the mid point between stave lines. Returns a fractional line if a space. */\nexport function midLine(a, b) {\n let mid_line = b + (a - b) / 2;\n if (mid_line % 2 > 0) {\n mid_line = roundN(mid_line * 10, 5) / 10;\n }\n return mid_line;\n}\n/**\n * Used by various classes (e.g., SVGContext) to provide a\n * unique prefix to element names (or other keys in shared namespaces).\n */\nexport function prefix(text) {\n return `vf-${text}`;\n}\n/**\n * Convert an arbitrary angle in radians to the equivalent one in the range [0, pi).\n */\nexport function normalizeAngle(a) {\n a = a % (2 * Math.PI);\n if (a < 0) {\n a += 2 * Math.PI;\n }\n return a;\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// Utility methods used by the rest of the VexFlow codebase.\nimport { Flow } from './flow';\nimport { log, RuntimeError } from './util';\nexport class Vex {\n // Users of `Vex.forEach(a, fn)` should use `Array.prototype.forEach()` instead.\n // static forEach(arr: T[], callbackFn: (value: T, index: number, array: T[]) => void) {\n // arr.forEach(callbackFn);\n // }\n /**\n * Take `arr` and return a new list consisting of the sorted, unique,\n * contents of arr. Does not modify `arr`.\n */\n // eslint-disable-next-line\n static sortAndUnique(arr, cmp, eq) {\n if (arr.length > 1) {\n const newArr = [];\n let last;\n arr.sort(cmp);\n for (let i = 0; i < arr.length; ++i) {\n if (i === 0 || !eq(arr[i], last)) {\n newArr.push(arr[i]);\n }\n last = arr[i];\n }\n return newArr;\n }\n else {\n return arr;\n }\n }\n /** Check if array `arr` contains `obj`. */\n // eslint-disable-next-line\n static contains(arr, obj) {\n let i = arr.length;\n while (i--) {\n if (arr[i] === obj) {\n return true;\n }\n }\n return false;\n }\n // Get the 2D Canvas context from DOM element `canvas_sel`.\n static getCanvasContext(canvasSelector) {\n if (!canvasSelector) {\n throw new RuntimeError('BadArgument', 'Invalid canvas selector: ' + canvasSelector);\n }\n const canvas = document.getElementById(canvasSelector);\n if (!(canvas && canvas.getContext)) {\n throw new RuntimeError('UnsupportedBrowserError', 'This browser does not support HTML5 Canvas');\n }\n return canvas.getContext('2d');\n }\n /** Benchmark. Run function `f` once and report time elapsed shifted by `s` milliseconds. */\n // eslint-disable-next-line\n static benchmark(s, f) {\n const start_time = new Date().getTime();\n f();\n const elapsed = new Date().getTime() - start_time;\n log(s, elapsed + 'ms');\n }\n // Get stack trace.\n static stackTrace() {\n const err = new Error();\n return err.stack;\n }\n}\nVex.Flow = Flow;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Bend } from './bend';\nimport { Modifier } from './modifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\n/** `Vibrato` implements diverse vibratos. */\nexport class Vibrato extends Modifier {\n constructor() {\n super();\n this.position = Modifier.Position.RIGHT;\n this.render_options = {\n harsh: false,\n vibrato_width: 20,\n wave_height: 6,\n wave_width: 4,\n wave_girth: 2,\n };\n this.setVibratoWidth(this.render_options.vibrato_width);\n }\n static get CATEGORY() {\n return Category.Vibrato;\n }\n /** Arrange vibratos inside a `ModifierContext`. */\n static format(vibratos, state, context) {\n if (!vibratos || vibratos.length === 0)\n return false;\n // Vibratos are always on top.\n let text_line = state.top_text_line;\n let width = 0;\n let shift = state.right_shift - 7;\n // If there's a bend, drop the text line\n const bends = context.getMembers(Bend.CATEGORY);\n if (bends && bends.length > 0) {\n const bendHeight = bends.map((bb) => bb.getTextHeight()).reduce((a, b) => (a > b ? a : b)) / Tables.STAVE_LINE_DISTANCE;\n text_line = text_line - (bendHeight + 1);\n }\n else {\n state.top_text_line += 1;\n }\n // Format Vibratos\n for (let i = 0; i < vibratos.length; ++i) {\n const vibrato = vibratos[i];\n vibrato.setXShift(shift);\n vibrato.setTextLine(text_line);\n width += vibrato.getWidth();\n shift += width;\n }\n state.right_shift += width;\n return true;\n }\n /** Set harsh vibrato. */\n setHarsh(harsh) {\n this.render_options.harsh = harsh;\n return this;\n }\n /** Set vibrato width in pixels. */\n setVibratoWidth(width) {\n this.render_options.vibrato_width = width;\n this.setWidth(width);\n return this;\n }\n /** Draw the vibrato on the rendering context. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(Modifier.Position.RIGHT, this.index);\n const vx = start.x + this.x_shift;\n const vy = note.getYForTopText(this.text_line) + 2;\n Vibrato.renderVibrato(ctx, vx, vy, this.render_options);\n }\n /**\n * Static rendering method that can be called from\n * other classes (e.g. VibratoBracket).\n */\n static renderVibrato(ctx, x, y, opts) {\n const { harsh, vibrato_width, wave_width, wave_girth, wave_height } = opts;\n const num_waves = vibrato_width / wave_width;\n ctx.beginPath();\n let i;\n if (harsh) {\n ctx.moveTo(x, y + wave_girth + 1);\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.lineTo(x + wave_width, y - wave_height / 2);\n x += wave_width;\n ctx.lineTo(x + wave_width, y + wave_height / 2);\n x += wave_width;\n }\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.lineTo(x - wave_width, y - wave_height / 2 + wave_girth + 1);\n x -= wave_width;\n ctx.lineTo(x - wave_width, y + wave_height / 2 + wave_girth + 1);\n x -= wave_width;\n }\n ctx.fill();\n }\n else {\n ctx.moveTo(x, y + wave_girth);\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.quadraticCurveTo(x + wave_width / 2, y - wave_height / 2, x + wave_width, y);\n x += wave_width;\n ctx.quadraticCurveTo(x + wave_width / 2, y + wave_height / 2, x + wave_width, y);\n x += wave_width;\n }\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.quadraticCurveTo(x - wave_width / 2, y + wave_height / 2 + wave_girth, x - wave_width, y + wave_girth);\n x -= wave_width;\n ctx.quadraticCurveTo(x - wave_width / 2, y - wave_height / 2 + wave_girth, x - wave_width, y + wave_girth);\n x -= wave_width;\n }\n ctx.fill();\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Balazs Forian-Szabo\n// MIT License\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { log } from './util';\nimport { Vibrato } from './vibrato';\n// eslint-disable-next-line\nfunction L(...args) {\n if (VibratoBracket.DEBUG)\n log('Vex.Flow.VibratoBracket', args);\n}\n/** `VibratoBracket` renders vibrato effect between two notes. */\nexport class VibratoBracket extends Element {\n /**\n * Either the stop or start note must be set, or both of them.\n * An undefined value for the start or stop note indicates that the vibrato\n * is drawn from the beginning or until the end of the stave accordingly.\n */\n constructor(bracket_data) {\n super();\n if (bracket_data.start)\n this.start = bracket_data.start;\n if (bracket_data.stop)\n this.stop = bracket_data.stop;\n this.line = 1;\n this.render_options = {\n harsh: false,\n wave_height: 6,\n wave_width: 4,\n wave_girth: 2,\n vibrato_width: 0,\n };\n }\n static get CATEGORY() {\n return Category.VibratoBracket;\n }\n /** Set line position of the vibrato bracket. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Set harsh vibrato bracket. */\n setHarsh(harsh) {\n this.render_options.harsh = harsh;\n return this;\n }\n /** Draw the vibrato bracket on the rendering context. */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n const y = (this.start && this.start.checkStave().getYForTopText(this.line)) ||\n (this.stop && this.stop.checkStave().getYForTopText(this.line)) ||\n 0;\n // If start note is not set then vibrato will be drawn\n // from the beginning of the stave\n const start_x = (this.start && this.start.getAbsoluteX()) || (this.stop && this.stop.checkStave().getTieStartX()) || 0;\n // If stop note is not set then vibrato will be drawn\n // until the end of the stave\n const stop_x = (this.stop && this.stop.getAbsoluteX() - this.stop.getWidth() - 5) ||\n (this.start && this.start.checkStave().getTieEndX() - 10) ||\n 0;\n this.render_options.vibrato_width = stop_x - start_x;\n L('Rendering VibratoBracket: start_x:', start_x, 'stop_x:', stop_x, 'y:', y);\n Vibrato.renderVibrato(ctx, start_x, y, this.render_options);\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.VibratoBracket.DEBUG` to `true`. */\nVibratoBracket.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Fraction } from './fraction';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nexport var VoiceMode;\n(function (VoiceMode) {\n VoiceMode[VoiceMode[\"STRICT\"] = 1] = \"STRICT\";\n VoiceMode[VoiceMode[\"SOFT\"] = 2] = \"SOFT\";\n VoiceMode[VoiceMode[\"FULL\"] = 3] = \"FULL\";\n})(VoiceMode || (VoiceMode = {}));\n/**\n * `Voice` is mainly a container object to group `Tickables` for formatting.\n */\nexport class Voice extends Element {\n constructor(time, options) {\n super();\n this.resolutionMultiplier = 1;\n this.mode = VoiceMode.STRICT;\n this.preFormatted = false;\n this.ticksUsed = new Fraction(0, 1);\n this.largestTickWidth = 0;\n this.tickables = [];\n this.options = Object.assign({ softmaxFactor: 100 }, options);\n // Convert the `time` string into a VoiceTime object if necessary.\n let voiceTime;\n if (typeof time === 'string') {\n // Time signature shortcut: \"4/4\", \"3/8\", etc.\n const match = time.match(/(\\d+)\\/(\\d+)/);\n if (match) {\n voiceTime = {\n num_beats: parseInt(match[1]),\n beat_value: parseInt(match[2]),\n };\n }\n }\n else {\n voiceTime = time;\n }\n // Default time signature is 4/4.\n this.time = Object.assign({ num_beats: 4, beat_value: 4, resolution: Tables.RESOLUTION }, voiceTime);\n // Recalculate total ticks.\n this.totalTicks = new Fraction(this.time.num_beats * (this.time.resolution / this.time.beat_value), 1);\n this.smallestTickCount = this.totalTicks.clone();\n }\n static get CATEGORY() {\n return Category.Voice;\n }\n /**\n * Modes allow the addition of ticks in three different ways:\n * - STRICT: This is the default. Ticks must fill the voice.\n * - SOFT: Ticks can be added without restrictions.\n * - FULL: Ticks do not need to fill the voice, but can't exceed the maximum tick length.\n */\n static get Mode() {\n return VoiceMode;\n }\n /** Get the total ticks in the voice. */\n getTotalTicks() {\n return this.totalTicks;\n }\n /** Get the total ticks used in the voice by all the tickables. */\n getTicksUsed() {\n return this.ticksUsed;\n }\n /** Get the largest width of all the tickables. */\n getLargestTickWidth() {\n return this.largestTickWidth;\n }\n /** Get the tick count for the shortest tickable */\n getSmallestTickCount() {\n return this.smallestTickCount;\n }\n /** Get the tickables in the voice. */\n getTickables() {\n return this.tickables;\n }\n /** Get the voice mode. */\n getMode() {\n return this.mode;\n }\n /**\n * Set the voice mode.\n * @param mode value from `VoiceMode`\n */\n setMode(mode) {\n this.mode = mode;\n return this;\n }\n /** Get the resolution multiplier for the voice. */\n getResolutionMultiplier() {\n return this.resolutionMultiplier;\n }\n /** Get the actual tick resolution for the voice. */\n getActualResolution() {\n return this.resolutionMultiplier * this.time.resolution;\n }\n /** Set the voice's stave. */\n setStave(stave) {\n this.stave = stave;\n // Reset the bounding box so we can reformat.\n this.boundingBox = undefined;\n return this;\n }\n getStave() {\n return this.stave;\n }\n /** Get the bounding box for the voice. */\n getBoundingBox() {\n if (!this.boundingBox) {\n const stave = this.checkStave();\n let boundingBox = undefined;\n for (let i = 0; i < this.tickables.length; ++i) {\n const tickable = this.tickables[i];\n tickable.setStave(stave);\n const bb = tickable.getBoundingBox();\n if (bb) {\n boundingBox = boundingBox ? boundingBox.mergeWith(bb) : bb;\n }\n }\n this.boundingBox = boundingBox;\n }\n return this.boundingBox;\n }\n /** Set the voice mode to strict or soft. */\n setStrict(strict) {\n this.mode = strict ? VoiceMode.STRICT : VoiceMode.SOFT;\n return this;\n }\n /** Determine if the voice is complete according to the voice mode. */\n isComplete() {\n if (this.mode === VoiceMode.STRICT || this.mode === VoiceMode.FULL) {\n return this.ticksUsed.equals(this.totalTicks);\n }\n else {\n return true;\n }\n }\n /**\n * We use softmax to layout the tickables proportional to the exponent of\n * their duration. The softmax factor is used to determine the 'linearness' of\n * the layout.\n *\n * The softmax of all the tickables in this voice should sum to 1.\n */\n setSoftmaxFactor(factor) {\n this.options.softmaxFactor = factor;\n return this;\n }\n /**\n * Calculate the sum of the exponents of all the ticks in this voice to use\n * as the denominator of softmax.\n */\n reCalculateExpTicksUsed() {\n const totalTicks = this.ticksUsed.value();\n const exp = (tickable) => Math.pow(this.options.softmaxFactor, tickable.getTicks().value() / totalTicks);\n this.expTicksUsed = this.tickables.map(exp).reduce((a, b) => a + b, 0);\n return this.expTicksUsed;\n }\n /** Get the softmax-scaled value of a tick duration. 'tickValue' is a number. */\n softmax(tickValue) {\n if (!this.expTicksUsed) {\n this.expTicksUsed = this.reCalculateExpTicksUsed();\n }\n const totalTicks = this.ticksUsed.value();\n const exp = (v) => Math.pow(this.options.softmaxFactor, v / totalTicks);\n const sm = exp(tickValue) / this.expTicksUsed;\n return sm;\n }\n /** Add a tickable to the voice. */\n addTickable(tickable) {\n if (!tickable.shouldIgnoreTicks()) {\n const ticks = tickable.getTicks();\n // Update the total ticks for this line.\n this.ticksUsed.add(ticks);\n this.expTicksUsed = 0; // reset\n if ((this.mode === VoiceMode.STRICT || this.mode === VoiceMode.FULL) &&\n this.ticksUsed.greaterThan(this.totalTicks)) {\n this.ticksUsed.subtract(ticks);\n throw new RuntimeError('BadArgument', 'Too many ticks.');\n }\n // Track the smallest tickable for formatting.\n if (ticks.lessThan(this.smallestTickCount)) {\n this.smallestTickCount = ticks.clone();\n }\n this.resolutionMultiplier = this.ticksUsed.denominator;\n // Expand total ticks using denominator from ticks used.\n this.totalTicks.add(0, this.ticksUsed.denominator);\n }\n // Add the tickable to the line.\n this.tickables.push(tickable);\n tickable.setVoice(this);\n return this;\n }\n /** Add an array of tickables to the voice. */\n addTickables(tickables) {\n for (let i = 0; i < tickables.length; ++i) {\n this.addTickable(tickables[i]);\n }\n return this;\n }\n /** Preformat the voice by applying the voice's stave to each note. */\n preFormat() {\n if (this.preFormatted)\n return this;\n const stave = this.checkStave();\n this.tickables.forEach((tickable) => {\n if (!tickable.getStave()) {\n tickable.setStave(stave);\n }\n });\n this.preFormatted = true;\n return this;\n }\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n /**\n * Render the voice onto the canvas `context` and an optional `stave`.\n * If `stave` is omitted, it is expected that the notes have staves\n * already set.\n *\n * This method also calculates the voice's boundingBox while drawing\n * the notes. Note the similarities with this.getBoundingBox().\n */\n draw(context = this.checkContext(), stave) {\n stave = stave !== null && stave !== void 0 ? stave : this.stave;\n this.setRendered();\n let boundingBox = undefined;\n for (let i = 0; i < this.tickables.length; ++i) {\n const tickable = this.tickables[i];\n // Set the stave if provided.\n if (stave) {\n tickable.setStave(stave);\n }\n defined(tickable.getStave(), 'MissingStave', 'The voice cannot draw tickables without staves.');\n const bb = tickable.getBoundingBox();\n if (bb) {\n boundingBox = boundingBox ? boundingBox.mergeWith(bb) : bb;\n }\n tickable.setContext(context);\n tickable.drawWithStyle();\n }\n this.boundingBox = boundingBox;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Ron B. Yeh\n// MIT License\n//\n// Utilities for working with Web APIs.\n// See: https://developer.mozilla.org/en-US/docs/Web/API\nimport { globalObject } from './util';\n// eslint-disable-next-line\nexport function isHTMLCanvas(element) {\n if (!element)\n return false;\n const global = globalObject();\n return (\n // It's either an instance of the HTMLCanvasElement class,\n (typeof global.HTMLCanvasElement === 'function' && element instanceof global.HTMLCanvasElement) ||\n // OR it's pretending to be a element. Good enough!\n // Do not rely on .tagName, because node-canvas doesn't provide a tagName.\n (typeof element.getContext === 'function' && typeof element.toDataURL === 'function'));\n}\n// eslint-disable-next-line\nexport function isHTMLDiv(element) {\n if (!element)\n return false;\n const global = globalObject();\n return (\n // It's either an instance of the HTMLDivElement class.\n (typeof global.HTMLDivElement === 'function' && element instanceof global.HTMLDivElement) ||\n // OR it's pretending to be a
. See: svgcontext.ts.\n (typeof element.appendChild === 'function' && typeof element.style === 'object'));\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Accidental Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Accidental } from '../src/accidental';\nimport { Beam } from '../src/beam';\nimport { Dot } from '../src/dot';\nimport { Flow } from '../src/flow';\nimport { Formatter } from '../src/formatter';\nimport { ModifierContext } from '../src/modifiercontext';\nimport { Note } from '../src/note';\nimport { Stave } from '../src/stave';\nimport { StaveNote } from '../src/stavenote';\nimport { Stem } from '../src/stem';\nimport { TickContext } from '../src/tickcontext';\nimport { TimeSigNote } from '../src/timesignote';\nimport { isAccidental } from '../src/typeguard';\nimport { Voice } from '../src/voice';\nconst AccidentalTests = {\n Start() {\n QUnit.module('Accidental');\n test('Automatic Accidentals - Simple Tests', autoAccidentalWorking);\n const run = VexFlowTests.runTests;\n run('Accidental Padding', formatAccidentalSpaces);\n run('Basic', basic);\n run('Stem Down', basicStemDown);\n run('Cautionary Accidental', cautionary);\n run('Accidental Arrangement Special Cases', specialCases);\n run('Multi Voice', multiVoice);\n run('Microtonal', microtonal);\n run('Microtonal (Iranian)', microtonal_iranian);\n run('Sagittal', sagittal);\n run('Automatic Accidentals', automaticAccidentals0);\n run('Automatic Accidentals - C major scale in Ab', automaticAccidentals1);\n run('Automatic Accidentals - No Accidentals Necessary', automaticAccidentals2);\n run('Automatic Accidentals - No Accidentals Necessary (EasyScore)', automaticAccidentals3);\n run('Automatic Accidentals - Multi Voice Inline', automaticAccidentalsMultiVoiceInline);\n run('Automatic Accidentals - Multi Voice Offset', automaticAccidentalsMultiVoiceOffset);\n run('Automatic Accidentals - Key C, Single Octave', automaticAccidentalsCornerCases1);\n run('Automatic Accidentals - Key C, Two Octaves', automaticAccidentalsCornerCases2);\n run('Automatic Accidentals - Key C#, Single Octave', automaticAccidentalsCornerCases3);\n run('Automatic Accidentals - Key C#, Two Octaves', automaticAccidentalsCornerCases4);\n run('Factory API', factoryAPI);\n },\n};\n// Check that at least one of the note's modifiers is an Accidental.\nfunction hasAccidental(note) {\n return note.getModifiers().some((modifier) => isAccidental(modifier));\n}\n// Return a convenience function for building accidentals from a string.\nfunction makeNewAccid(factory) {\n return (type) => factory.Accidental({ type });\n}\n/**\n *\n */\nfunction autoAccidentalWorking() {\n const createStaveNote = (noteStruct) => new StaveNote(noteStruct);\n let notes = [\n { keys: ['bb/4'], duration: '4' },\n { keys: ['bb/4'], duration: '4' },\n { keys: ['g#/4'], duration: '4' },\n { keys: ['g/4'], duration: '4' },\n { keys: ['b/4'], duration: '4' },\n { keys: ['b/4'], duration: '4' },\n { keys: ['a#/4'], duration: '4' },\n { keys: ['g#/4'], duration: '4' },\n ].map(createStaveNote);\n let voice = new Voice().setMode(Voice.Mode.SOFT).addTickables(notes);\n // F Major (Bb)\n Accidental.applyAccidentals([voice], 'F');\n equal(hasAccidental(notes[0]), false, 'No flat because of key signature');\n equal(hasAccidental(notes[1]), false, 'No flat because of key signature');\n equal(hasAccidental(notes[2]), true, 'Added a sharp');\n equal(hasAccidental(notes[3]), true, 'Back to natural');\n equal(hasAccidental(notes[4]), true, 'Back to natural');\n equal(hasAccidental(notes[5]), false, 'Natural remembered');\n equal(hasAccidental(notes[6]), true, 'Added sharp');\n equal(hasAccidental(notes[7]), true, 'Added sharp');\n notes = [\n { keys: ['e#/4'], duration: '4' },\n { keys: ['cb/4'], duration: '4' },\n { keys: ['fb/4'], duration: '4' },\n { keys: ['b#/4'], duration: '4' },\n { keys: ['b#/4'], duration: '4' },\n { keys: ['cb/5'], duration: '4' },\n { keys: ['fb/5'], duration: '4' },\n { keys: ['e#/4'], duration: '4' },\n ].map(createStaveNote);\n voice = new Voice().setMode(Voice.Mode.SOFT).addTickables(notes);\n // A Major (F#,G#,C#)\n Accidental.applyAccidentals([voice], 'A');\n equal(hasAccidental(notes[0]), true, 'Added sharp');\n equal(hasAccidental(notes[1]), true, 'Added flat');\n equal(hasAccidental(notes[2]), true, 'Added flat');\n equal(hasAccidental(notes[3]), true, 'Added sharp');\n equal(hasAccidental(notes[4]), false, 'Sharp remembered');\n equal(hasAccidental(notes[5]), true, 'Added flat(different octave)');\n equal(hasAccidental(notes[6]), true, 'Added flat(different octave)');\n equal(hasAccidental(notes[7]), false, 'sharp remembered');\n notes = [\n { keys: ['c/4'], duration: '4' },\n { keys: ['cb/4'], duration: '4' },\n { keys: ['cb/4'], duration: '4' },\n { keys: ['c#/4'], duration: '4' },\n { keys: ['c#/4'], duration: '4' },\n { keys: ['cbb/4'], duration: '4' },\n { keys: ['cbb/4'], duration: '4' },\n { keys: ['c##/4'], duration: '4' },\n { keys: ['c##/4'], duration: '4' },\n { keys: ['c/4'], duration: '4' },\n { keys: ['c/4'], duration: '4' },\n ].map(createStaveNote);\n voice = new Voice().setMode(Voice.Mode.SOFT).addTickables(notes);\n // C Major (no sharps/flats)\n Accidental.applyAccidentals([voice], 'C');\n equal(hasAccidental(notes[0]), false, 'No accidental');\n equal(hasAccidental(notes[1]), true, 'Added flat');\n equal(hasAccidental(notes[2]), false, 'Flat remembered');\n equal(hasAccidental(notes[3]), true, 'Sharp added');\n equal(hasAccidental(notes[4]), false, 'Sharp remembered');\n equal(hasAccidental(notes[5]), true, 'Added doubled flat');\n equal(hasAccidental(notes[6]), false, 'Double flat remembered');\n equal(hasAccidental(notes[7]), true, 'Added double sharp');\n equal(hasAccidental(notes[8]), false, 'Double sharp rememberd');\n equal(hasAccidental(notes[9]), true, 'Added natural');\n equal(hasAccidental(notes[10]), false, 'Natural remembered');\n}\n/**\n *\n */\nfunction formatAccidentalSpaces(options) {\n const f = VexFlowTests.makeFactory(options, 750, 280);\n const context = f.getContext();\n const softmaxFactor = 100;\n // Create the notes\n const notes = [\n new StaveNote({\n keys: ['e##/5'],\n duration: '8d',\n }).addModifier(new Accidental('##'), 0),\n new StaveNote({\n keys: ['b/4'],\n duration: '16',\n }).addModifier(new Accidental('b'), 0),\n new StaveNote({\n keys: ['f/3'],\n duration: '8',\n }),\n new StaveNote({\n keys: ['a/3'],\n duration: '16',\n }),\n new StaveNote({\n keys: ['e/4', 'g/4'],\n duration: '16',\n })\n .addModifier(new Accidental('bb'), 0)\n .addModifier(new Accidental('bb'), 1),\n new StaveNote({\n keys: ['d/4'],\n duration: '16',\n }),\n new StaveNote({\n keys: ['e/4', 'g/4'],\n duration: '16',\n })\n .addModifier(new Accidental('#'), 0)\n .addModifier(new Accidental('#'), 1),\n new StaveNote({\n keys: ['g/4'],\n duration: '32',\n }),\n new StaveNote({\n keys: ['a/4'],\n duration: '32',\n }),\n new StaveNote({\n keys: ['g/4'],\n duration: '16',\n }),\n new StaveNote({\n keys: ['d/4'],\n duration: 'q',\n }),\n ];\n Dot.buildAndAttach([notes[0]], { all: true });\n const beams = Beam.generateBeams(notes);\n const voice = new Voice({\n num_beats: 4,\n beat_value: 4,\n });\n voice.addTickables(notes);\n const formatter = new Formatter({ softmaxFactor }).joinVoices([voice]);\n const width = formatter.preCalculateMinTotalWidth([voice]);\n const stave = new Stave(10, 40, width + 20);\n stave.setContext(context).draw();\n formatter.format([voice], width);\n voice.draw(context, stave);\n beams.forEach((b) => b.setContext(context).draw());\n notes.forEach((note) => Note.plotMetrics(context, note, 30));\n VexFlowTests.plotLegendForNoteWidth(context, 300, 150);\n ok(true);\n}\nfunction basic(options) {\n const f = VexFlowTests.makeFactory(options, 700, 240);\n const accid = makeNewAccid(f);\n f.Stave({ x: 10, y: 10, width: 550 });\n const notes = [\n f\n .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: '1' })\n .addModifier(accid('b'), 0)\n .addModifier(accid('#'), 1),\n f\n .StaveNote({ keys: ['d/4', 'e/4', 'f/4', 'a/4', 'c/5', 'e/5', 'g/5'], duration: '2' })\n .addModifier(accid('##'), 0)\n .addModifier(accid('n'), 1)\n .addModifier(accid('bb'), 2)\n .addModifier(accid('b'), 3)\n .addModifier(accid('#'), 4)\n .addModifier(accid('n'), 5)\n .addModifier(accid('bb'), 6),\n f\n .StaveNote({ keys: ['f/4', 'g/4', 'a/4', 'b/4', 'c/5', 'e/5', 'g/5'], duration: '16' })\n .addModifier(accid('n'), 0)\n .addModifier(accid('#'), 1)\n .addModifier(accid('#'), 2)\n .addModifier(accid('b'), 3)\n .addModifier(accid('bb'), 4)\n .addModifier(accid('##'), 5)\n .addModifier(accid('#'), 6),\n f\n .StaveNote({ keys: ['a/3', 'c/4', 'e/4', 'b/4', 'd/5', 'g/5'], duration: '1' })\n .addModifier(accid('#'), 0)\n .addModifier(accid('##').setAsCautionary(), 1)\n .addModifier(accid('#').setAsCautionary(), 2)\n .addModifier(accid('b'), 3)\n .addModifier(accid('bb').setAsCautionary(), 4)\n .addModifier(accid('b').setAsCautionary(), 5),\n ];\n Formatter.SimpleFormat(notes, 10, { paddingBetween: 45 });\n notes.forEach((note, index) => {\n Note.plotMetrics(f.getContext(), note, 140);\n ok(note.getModifiersByType('Accidental').length > 0, 'Note ' + index + ' has accidentals');\n note.getModifiersByType('Accidental').forEach((accid, index) => {\n ok(accid.getWidth() > 0, 'Accidental ' + index + ' has set width');\n });\n });\n f.draw();\n VexFlowTests.plotLegendForNoteWidth(f.getContext(), 480, 140);\n ok(true, 'Full Accidental');\n}\nfunction cautionary(options) {\n const staveCount = 12;\n const scale = 0.85;\n const staveWidth = 840;\n let i = 0;\n let j = 0;\n const f = VexFlowTests.makeFactory(options, staveWidth + 10, 175 * staveCount + 10);\n f.getContext().scale(scale, scale);\n const accids = Object.keys(Flow.accidentalMap).filter((accid) => accid !== '{' && accid !== '}');\n const mod = Math.round(accids.length / staveCount);\n for (i = 0; i < staveCount; ++i) {\n const stave = f.Stave({ x: 0, y: 10 + 200 * i, width: staveWidth / scale });\n const score = f.EasyScore();\n const rowMap = [];\n for (j = 0; j < mod && j + i * staveCount < accids.length; ++j) {\n rowMap.push(accids[j + i * staveCount]);\n }\n const notes = rowMap.map((accidType) => f\n .StaveNote({ keys: ['a/4'], duration: '4', stem_direction: Stem.UP })\n .addModifier(f.Accidental({ type: accidType }), 0));\n const voice = score.voice(notes, { time: rowMap.length + '/4' });\n voice.getTickables().forEach((tickable) => {\n tickable\n .getModifiers()\n .filter((modifier) => modifier.getAttribute('type') === Accidental.CATEGORY)\n .forEach((accid) => accid.setAsCautionary());\n });\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n }\n ok(true, 'Must successfully render cautionary accidentals');\n}\nfunction specialCases(options) {\n const f = VexFlowTests.makeFactory(options, 700, 240);\n const accid = makeNewAccid(f);\n f.Stave({ x: 10, y: 10, width: 550 });\n const notes = [\n f\n .StaveNote({ keys: ['f/4', 'd/5'], duration: '1' })\n .addModifier(accid('#'), 0)\n .addModifier(accid('b'), 1),\n f\n .StaveNote({ keys: ['c/4', 'g/4'], duration: '2' })\n .addModifier(accid('##'), 0)\n .addModifier(accid('##'), 1),\n f\n .StaveNote({ keys: ['b/3', 'd/4', 'f/4'], duration: '16' })\n .addModifier(accid('#'), 0)\n .addModifier(accid('#'), 1)\n .addModifier(accid('##'), 2),\n f\n .StaveNote({ keys: ['g/4', 'a/4', 'c/5', 'e/5'], duration: '16' })\n .addModifier(accid('b'), 0)\n .addModifier(accid('b'), 1)\n .addModifier(accid('n'), 3),\n f\n .StaveNote({ keys: ['e/4', 'g/4', 'b/4', 'c/5'], duration: '4' })\n .addModifier(accid('b').setAsCautionary(), 0)\n .addModifier(accid('b').setAsCautionary(), 1)\n .addModifier(accid('bb'), 2)\n .addModifier(accid('b'), 3),\n f\n .StaveNote({ keys: ['b/3', 'e/4', 'a/4', 'd/5', 'g/5'], duration: '8' })\n .addModifier(accid('bb'), 0)\n .addModifier(accid('b').setAsCautionary(), 1)\n .addModifier(accid('n').setAsCautionary(), 2)\n .addModifier(accid('#'), 3)\n .addModifier(accid('n').setAsCautionary(), 4),\n ];\n Formatter.SimpleFormat(notes, 0, { paddingBetween: 20 });\n notes.forEach((note, index) => {\n Note.plotMetrics(f.getContext(), note, 140);\n ok(note.getModifiersByType('Accidental').length > 0, 'Note ' + index + ' has accidentals');\n note.getModifiersByType('Accidental').forEach((accid, index) => {\n ok(accid.getWidth() > 0, 'Accidental ' + index + ' has set width');\n });\n });\n f.draw();\n VexFlowTests.plotLegendForNoteWidth(f.getContext(), 480, 140);\n ok(true, 'Full Accidental');\n}\nfunction basicStemDown(options) {\n const f = VexFlowTests.makeFactory(options, 700, 240);\n const accid = makeNewAccid(f);\n f.Stave({ x: 10, y: 10, width: 550 });\n const notes = [\n f\n .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: 'w', stem_direction: -1 })\n .addModifier(accid('b'), 0)\n .addModifier(accid('#'), 1),\n f\n .StaveNote({ keys: ['d/4', 'e/4', 'f/4', 'a/4', 'c/5', 'e/5', 'g/5'], duration: '2', stem_direction: -1 })\n .addModifier(accid('##'), 0)\n .addModifier(accid('n'), 1)\n .addModifier(accid('bb'), 2)\n .addModifier(accid('b'), 3)\n .addModifier(accid('#'), 4)\n .addModifier(accid('n'), 5)\n .addModifier(accid('bb'), 6),\n f\n .StaveNote({ keys: ['f/4', 'g/4', 'a/4', 'b/4', 'c/5', 'e/5', 'g/5'], duration: '16', stem_direction: -1 })\n .addModifier(accid('n'), 0)\n .addModifier(accid('#'), 1)\n .addModifier(accid('#'), 2)\n .addModifier(accid('b'), 3)\n .addModifier(accid('bb'), 4)\n .addModifier(accid('##'), 5)\n .addModifier(accid('#'), 6),\n ];\n Formatter.SimpleFormat(notes, 0, { paddingBetween: 30 });\n notes.forEach((note, noteIndex) => {\n Note.plotMetrics(f.getContext(), note, 140);\n ok(note.getModifiersByType('Accidental').length > 0, 'Note ' + noteIndex + ' has accidentals');\n note.getModifiersByType('Accidental').forEach((accid, accidIndex) => {\n ok(accid.getWidth() > 0, 'Accidental ' + accidIndex + ' has set width');\n });\n });\n f.draw();\n VexFlowTests.plotLegendForNoteWidth(f.getContext(), 480, 140);\n ok(true, 'Full Accidental');\n}\nfunction multiVoice(options) {\n // Helper function for visualizing\n function showNotes(note1, note2, stave, ctx, x) {\n const modifierContext = new ModifierContext();\n note1.addToModifierContext(modifierContext);\n note2.addToModifierContext(modifierContext);\n new TickContext().addTickable(note1).addTickable(note2).preFormat().setX(x);\n note1.setContext(ctx).draw();\n note2.setContext(ctx).draw();\n Note.plotMetrics(ctx, note1, 180);\n Note.plotMetrics(ctx, note2, 15);\n }\n const f = VexFlowTests.makeFactory(options, 460, 250);\n const accid = makeNewAccid(f);\n const stave = f.Stave({ x: 10, y: 45, width: 420 });\n const ctx = f.getContext();\n stave.draw();\n let note1 = f\n .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: '2', stem_direction: -1 })\n .addModifier(accid('b'), 0)\n .addModifier(accid('n'), 1)\n .addModifier(accid('#'), 2)\n .setStave(stave);\n let note2 = f\n .StaveNote({ keys: ['d/5', 'a/5', 'b/5'], duration: '2', stem_direction: 1 })\n .addModifier(accid('b'), 0)\n .addModifier(accid('bb'), 1)\n .addModifier(accid('##'), 2)\n .setStave(stave);\n showNotes(note1, note2, stave, ctx, 60);\n note1 = f\n .StaveNote({ keys: ['c/4', 'e/4', 'c/5'], duration: '2', stem_direction: -1 })\n .addModifier(accid('b'), 0)\n .addModifier(accid('n'), 1)\n .addModifier(accid('#'), 2)\n .setStave(stave);\n note2 = f\n .StaveNote({ keys: ['d/5', 'a/5', 'b/5'], duration: '4', stem_direction: 1 })\n .addModifier(accid('b'), 0)\n .setStave(stave);\n showNotes(note1, note2, stave, ctx, 150);\n note1 = f\n .StaveNote({ keys: ['d/4', 'c/5', 'd/5'], duration: '2', stem_direction: -1 })\n .addModifier(accid('b'), 0)\n .addModifier(accid('n'), 1)\n .addModifier(accid('#'), 2)\n .setStave(stave);\n note2 = f\n .StaveNote({ keys: ['d/5', 'a/5', 'b/5'], duration: '4', stem_direction: 1 })\n .addModifier(accid('b'), 0)\n .setStave(stave);\n showNotes(note1, note2, stave, ctx, 250);\n VexFlowTests.plotLegendForNoteWidth(ctx, 350, 150);\n ok(true, 'Full Accidental');\n}\nfunction microtonal(options) {\n const f = VexFlowTests.makeFactory(options, 700, 240);\n const accid = makeNewAccid(f);\n const ctx = f.getContext();\n f.Stave({ x: 10, y: 10, width: 650 });\n const notes = [\n f\n .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: '1' })\n .addModifier(accid('db'), 0)\n .addModifier(accid('d'), 1),\n f\n .StaveNote({ keys: ['d/4', 'e/4', 'f/4', 'a/4', 'c/5', 'e/5', 'g/5'], duration: '2' })\n .addModifier(accid('bbs'), 0)\n .addModifier(accid('++'), 1)\n .addModifier(accid('+'), 2)\n .addModifier(accid('d'), 3)\n .addModifier(accid('db'), 4)\n .addModifier(accid('+'), 5)\n .addModifier(accid('##'), 6),\n f\n .StaveNote({ keys: ['f/4', 'g/4', 'a/4', 'b/4', 'c/5', 'e/5', 'g/5'], duration: '16' })\n .addModifier(accid('++'), 0)\n .addModifier(accid('bbs'), 1)\n .addModifier(accid('+'), 2)\n .addModifier(accid('b'), 3)\n .addModifier(accid('db'), 4)\n .addModifier(accid('##'), 5)\n .addModifier(accid('#'), 6),\n f\n .StaveNote({ keys: ['a/3', 'c/4', 'e/4', 'b/4', 'd/5', 'g/5'], duration: '1' })\n .addModifier(accid('#'), 0)\n .addModifier(accid('db').setAsCautionary(), 1)\n .addModifier(accid('bbs').setAsCautionary(), 2)\n .addModifier(accid('b'), 3)\n .addModifier(accid('++').setAsCautionary(), 4)\n .addModifier(accid('d').setAsCautionary(), 5),\n f\n .StaveNote({ keys: ['f/4', 'g/4', 'a/4', 'b/4', 'd/5', 'g/5'], duration: '16' })\n .addModifier(accid('++-'), 0)\n .addModifier(accid('+-'), 1)\n .addModifier(accid('bs'), 2)\n .addModifier(accid('bss'), 3)\n .addModifier(accid('afhf'), 4)\n .addModifier(accid('ashs'), 5),\n ];\n Formatter.SimpleFormat(notes, 0, { paddingBetween: 35 });\n notes.forEach((note, index) => {\n Note.plotMetrics(f.getContext(), note, 140);\n ok(note.getModifiersByType('Accidental').length > 0, 'Note ' + index + ' has accidentals');\n note.getModifiersByType('Accidental').forEach((accid, index) => {\n ok(accid.getWidth() > 0, 'Accidental ' + index + ' has set width');\n });\n });\n f.draw();\n VexFlowTests.plotLegendForNoteWidth(ctx, 580, 140);\n ok(true, 'Microtonal Accidental');\n}\nfunction microtonal_iranian(options) {\n const f = VexFlowTests.makeFactory(options, 700, 240);\n const accid = makeNewAccid(f);\n const ctx = f.getContext();\n f.Stave({ x: 10, y: 10, width: 650 });\n const notes = [\n f\n .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: '1' })\n .addModifier(accid('k'), 0)\n .addModifier(accid('o'), 1),\n f\n .StaveNote({ keys: ['d/4', 'e/4', 'f/4', 'a/4', 'c/5', 'e/5', 'g/5'], duration: '2' })\n .addModifier(accid('b'), 0)\n .addModifier(accid('k'), 1)\n .addModifier(accid('n'), 2)\n .addModifier(accid('o'), 3)\n .addModifier(accid('#'), 4)\n .addModifier(accid('bb'), 5)\n .addModifier(accid('##'), 6),\n f\n .StaveNote({ keys: ['f/4', 'g/4', 'a/4', 'b/4', 'c/5', 'e/5', 'g/5'], duration: '16' })\n .addModifier(accid('o'), 0)\n .addModifier(accid('k'), 1)\n .addModifier(accid('n'), 2)\n .addModifier(accid('b'), 3)\n .addModifier(accid('bb'), 4)\n .addModifier(accid('##'), 5)\n .addModifier(accid('#'), 6),\n f\n .StaveNote({ keys: ['a/3', 'c/4', 'e/4', 'b/4', 'd/5', 'g/5'], duration: '1' })\n .addModifier(accid('#'), 0)\n .addModifier(accid('o').setAsCautionary(), 1)\n .addModifier(accid('n').setAsCautionary(), 2)\n .addModifier(accid('b'), 3)\n .addModifier(accid('k').setAsCautionary(), 4),\n f\n .StaveNote({ keys: ['f/4', 'g/4', 'a/4', 'b/4'], duration: '16' })\n .addModifier(accid('k'), 0)\n .addModifier(accid('k'), 1)\n .addModifier(accid('k'), 2)\n .addModifier(accid('k'), 3),\n ];\n Formatter.SimpleFormat(notes, 0, { paddingBetween: 35 });\n notes.forEach((note, index) => {\n Note.plotMetrics(f.getContext(), note, 140);\n ok(note.getModifiersByType('Accidental').length > 0, 'Note ' + index + ' has accidentals');\n note.getModifiersByType('Accidental').forEach((accid, index) => {\n ok(accid.getWidth() > 0, 'Accidental ' + index + ' has set width');\n });\n });\n f.draw();\n VexFlowTests.plotLegendForNoteWidth(ctx, 580, 140);\n ok(true, 'Microtonal Accidental (Iranian)');\n}\nfunction sagittal(options) {\n const f = VexFlowTests.makeFactory(options, 700, 240);\n const accid = makeNewAccid(f);\n const ctx = f.getContext();\n f.Stave({ x: 10, y: 10, width: 650 });\n const notes = [\n f\n .StaveNote({ keys: ['d/4', 'f/4', 'b/4', 'b/4'], duration: '4' })\n .addModifier(accid('accSagittal11MediumDiesisUp'), 1)\n .addModifier(accid('accSagittal5CommaDown'), 2)\n .addModifier(accid('b'), 3)\n .addModifier(accid('accSagittal7CommaDown'), 3),\n f\n .StaveNote({ keys: ['d/4', 'f/4', 'a/4', 'b/4'], duration: '4' })\n .addModifier(accid('accSagittal35LargeDiesisDown'), 2),\n f.StaveNote({ keys: ['c/4', 'e/4', 'g/4', 'c/5'], duration: '8' }).addModifier(accid('accSagittal5CommaDown'), 1),\n f\n .StaveNote({ keys: ['c/4', 'e/4', 'g/4', 'b/4'], duration: '8' })\n .addModifier(accid('b'), 1)\n .addModifier(accid('accSagittal7CommaDown'), 1)\n .addModifier(accid('accSagittal11LargeDiesisDown'), 3),\n f\n .StaveNote({ keys: ['d/4', 'f/4', 'b/4', 'b/4'], duration: '4' })\n .addModifier(accid('accSagittal11MediumDiesisUp'), 1)\n .addModifier(accid('accSagittal5CommaDown'), 2)\n .addModifier(accid('accSagittalFlat7CDown'), 3),\n f\n .StaveNote({ keys: ['d/4', 'f/4', 'a/4', 'b/4'], duration: '4' })\n .addModifier(accid('accSagittal35LargeDiesisDown'), 2),\n f.StaveNote({ keys: ['c/4', 'e/4', 'g/4', 'c/5'], duration: '8' }).addModifier(accid('accSagittal5CommaDown'), 1),\n f\n .StaveNote({ keys: ['c/4', 'e/4', 'g/4', 'b/4'], duration: '8' })\n .addModifier(accid('accSagittalFlat7CDown'), 1)\n .addModifier(accid('accSagittal11LargeDiesisDown'), 3),\n ];\n f.StaveTie({\n from: notes[0],\n to: notes[1],\n first_indices: [0, 1],\n last_indices: [0, 1],\n });\n f.StaveTie({\n from: notes[0],\n to: notes[1],\n first_indices: [3],\n last_indices: [3],\n options: {\n direction: Stem.DOWN,\n },\n });\n f.StaveTie({\n from: notes[4],\n to: notes[5],\n first_indices: [0, 1],\n last_indices: [0, 1],\n });\n f.StaveTie({\n from: notes[4],\n to: notes[5],\n first_indices: [3],\n last_indices: [3],\n options: {\n direction: Stem.DOWN,\n },\n });\n f.Beam({ notes: notes.slice(2, 4) });\n f.Beam({ notes: notes.slice(6, 8) });\n Formatter.SimpleFormat(notes);\n notes.forEach((note, index) => {\n Note.plotMetrics(f.getContext(), note, 140);\n ok(note.getModifiersByType('Accidental').length > 0, 'Note ' + index + ' has accidentals');\n note.getModifiersByType('Accidental').forEach((accid, index) => {\n ok(accid.getWidth() > 0, 'Accidental ' + index + ' has set width');\n });\n });\n f.draw();\n VexFlowTests.plotLegendForNoteWidth(ctx, 580, 140);\n ok(true, 'Sagittal');\n}\nfunction automaticAccidentals0(options) {\n const f = VexFlowTests.makeFactory(options, 700, 200);\n const stave = f.Stave();\n const notes = [\n { keys: ['c/4', 'c/5'], duration: '4' },\n { keys: ['c#/4', 'c#/5'], duration: '4' },\n { keys: ['c#/4', 'c#/5'], duration: '4' },\n { keys: ['c##/4', 'c##/5'], duration: '4' },\n { keys: ['c##/4', 'c##/5'], duration: '4' },\n { keys: ['c/4', 'c/5'], duration: '4' },\n { keys: ['cn/4', 'cn/5'], duration: '4' },\n { keys: ['cbb/4', 'cbb/5'], duration: '4' },\n { keys: ['cbb/4', 'cbb/5'], duration: '4' },\n { keys: ['cb/4', 'cb/5'], duration: '4' },\n { keys: ['cb/4', 'cb/5'], duration: '4' },\n { keys: ['c/4', 'c/5'], duration: '4' },\n ].map(f.StaveNote.bind(f));\n const gracenotes = [{ keys: ['d#/4'], duration: '16', slash: true }].map(f.GraceNote.bind(f));\n notes[0].addModifier(f.GraceNoteGroup({ notes: gracenotes }).beamNotes(), 0);\n const voice = f\n .Voice()\n .setMode(Voice.Mode.SOFT)\n .addTickable(new TimeSigNote('12/4').setStave(stave))\n .addTickables(notes);\n Accidental.applyAccidentals([voice], 'C');\n new Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true);\n}\nfunction automaticAccidentals1(options) {\n const f = VexFlowTests.makeFactory(options, 700, 150);\n const stave = f.Stave().addKeySignature('Ab');\n const notes = [\n { keys: ['c/4'], duration: '4' },\n { keys: ['d/4'], duration: '4' },\n { keys: ['e/4'], duration: '4' },\n { keys: ['f/4'], duration: '4' },\n { keys: ['g/4'], duration: '4' },\n { keys: ['a/4'], duration: '4' },\n { keys: ['b/4'], duration: '4' },\n { keys: ['c/5'], duration: '4' },\n ].map(f.StaveNote.bind(f));\n const voice = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes);\n Accidental.applyAccidentals([voice], 'Ab');\n new Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true);\n}\nfunction automaticAccidentals2(options) {\n const f = VexFlowTests.makeFactory(options, 700, 150);\n const stave = f.Stave().addKeySignature('A');\n const notes = [\n { keys: ['a/4'], duration: '4' },\n { keys: ['b/4'], duration: '4' },\n { keys: ['c#/5'], duration: '4' },\n { keys: ['d/5'], duration: '4' },\n { keys: ['e/5'], duration: '4' },\n { keys: ['f#/5'], duration: '4' },\n { keys: ['g#/5'], duration: '4' },\n { keys: ['a/5'], duration: '4' },\n ].map(f.StaveNote.bind(f));\n const voice = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes);\n Accidental.applyAccidentals([voice], 'A');\n new Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true);\n}\nfunction automaticAccidentals3(options) {\n const f = VexFlowTests.makeFactory(options, 700, 150);\n const stave = f.Stave().addKeySignature('A');\n const score = f.EasyScore();\n score.set({ time: '8/4' });\n const notes = score.notes('A4/q, B4/q, C#5/q, D5/q, E5/q,F#5/q, G#5/q, A5/q', { stem: 'UP' });\n const voice = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes);\n Accidental.applyAccidentals([voice], 'A');\n new Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true);\n}\nfunction automaticAccidentalsMultiVoiceInline(options) {\n const f = VexFlowTests.makeFactory(options, 700, 150);\n const stave = f.Stave().addKeySignature('Ab');\n const notes0 = [\n { keys: ['c/4'], duration: '4', stem_direction: -1 },\n { keys: ['d/4'], duration: '4', stem_direction: -1 },\n { keys: ['e/4'], duration: '4', stem_direction: -1 },\n { keys: ['f/4'], duration: '4', stem_direction: -1 },\n { keys: ['g/4'], duration: '4', stem_direction: -1 },\n { keys: ['a/4'], duration: '4', stem_direction: -1 },\n { keys: ['b/4'], duration: '4', stem_direction: -1 },\n { keys: ['c/5'], duration: '4', stem_direction: -1 },\n ].map(f.StaveNote.bind(f));\n const notes1 = [\n { keys: ['c/5'], duration: '4' },\n { keys: ['d/5'], duration: '4' },\n { keys: ['e/5'], duration: '4' },\n { keys: ['f/5'], duration: '4' },\n { keys: ['g/5'], duration: '4' },\n { keys: ['a/5'], duration: '4' },\n { keys: ['b/5'], duration: '4' },\n { keys: ['c/6'], duration: '4' },\n ].map(f.StaveNote.bind(f));\n const voice0 = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes0);\n const voice1 = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes1);\n // Ab Major\n Accidental.applyAccidentals([voice0, voice1], 'Ab');\n equal(hasAccidental(notes0[0]), false);\n equal(hasAccidental(notes0[1]), true);\n equal(hasAccidental(notes0[2]), true);\n equal(hasAccidental(notes0[3]), false);\n equal(hasAccidental(notes0[4]), false);\n equal(hasAccidental(notes0[5]), true);\n equal(hasAccidental(notes0[6]), true);\n equal(hasAccidental(notes0[7]), false);\n equal(hasAccidental(notes1[0]), false);\n equal(hasAccidental(notes1[1]), true);\n equal(hasAccidental(notes1[2]), true);\n equal(hasAccidental(notes1[3]), false);\n equal(hasAccidental(notes1[4]), false);\n equal(hasAccidental(notes1[5]), true);\n equal(hasAccidental(notes1[6]), true);\n equal(hasAccidental(notes1[7]), false);\n new Formatter().joinVoices([voice0, voice1]).formatToStave([voice0, voice1], stave);\n f.draw();\n ok(true);\n}\nfunction automaticAccidentalsMultiVoiceOffset(options) {\n const f = VexFlowTests.makeFactory(options, 700, 150);\n const stave = f.Stave().addKeySignature('Cb');\n const notes0 = [\n { keys: ['c/4'], duration: '4', stem_direction: -1 },\n { keys: ['d/4'], duration: '4', stem_direction: -1 },\n { keys: ['e/4'], duration: '4', stem_direction: -1 },\n { keys: ['f/4'], duration: '4', stem_direction: -1 },\n { keys: ['g/4'], duration: '4', stem_direction: -1 },\n { keys: ['a/4'], duration: '4', stem_direction: -1 },\n { keys: ['b/4'], duration: '4', stem_direction: -1 },\n { keys: ['c/5'], duration: '4', stem_direction: -1 },\n ].map(f.StaveNote.bind(f));\n const notes1 = [\n { keys: ['c/5'], duration: '8' },\n { keys: ['c/5'], duration: '4' },\n { keys: ['d/5'], duration: '4' },\n { keys: ['e/5'], duration: '4' },\n { keys: ['f/5'], duration: '4' },\n { keys: ['g/5'], duration: '4' },\n { keys: ['a/5'], duration: '4' },\n { keys: ['b/5'], duration: '4' },\n { keys: ['c/6'], duration: '4' },\n ].map(f.StaveNote.bind(f));\n const voice0 = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes0);\n const voice1 = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes1);\n // Cb Major (All flats)\n Accidental.applyAccidentals([voice0, voice1], 'Cb');\n equal(hasAccidental(notes0[0]), true);\n equal(hasAccidental(notes0[1]), true);\n equal(hasAccidental(notes0[2]), true);\n equal(hasAccidental(notes0[3]), true);\n equal(hasAccidental(notes0[4]), true);\n equal(hasAccidental(notes0[5]), true);\n equal(hasAccidental(notes0[6]), true);\n equal(hasAccidental(notes0[7]), false, 'Natural Remembered');\n equal(hasAccidental(notes1[0]), true);\n equal(hasAccidental(notes1[1]), false);\n equal(hasAccidental(notes1[2]), true);\n equal(hasAccidental(notes1[3]), true);\n equal(hasAccidental(notes1[4]), true);\n equal(hasAccidental(notes1[5]), true);\n equal(hasAccidental(notes1[6]), true);\n equal(hasAccidental(notes1[7]), true);\n new Formatter().joinVoices([voice0, voice1]).formatToStave([voice0, voice1], stave);\n f.draw();\n ok(true);\n}\nfunction automaticAccidentalsCornerCases1(options) {\n const f = VexFlowTests.makeFactory(options, 700, 150);\n const stave = f.Stave().addKeySignature('C');\n const notes0 = [\n { keys: ['c/4'], duration: '4', stem_direction: -1 },\n { keys: ['c#/4'], duration: '4', stem_direction: -1 },\n { keys: ['c#/4'], duration: '4', stem_direction: -1 },\n { keys: ['c/4'], duration: '4', stem_direction: -1 },\n { keys: ['c/4'], duration: '4', stem_direction: -1 },\n { keys: ['cb/4'], duration: '4', stem_direction: -1 },\n { keys: ['cb/4'], duration: '4', stem_direction: -1 },\n { keys: ['c/4'], duration: '4', stem_direction: -1 },\n { keys: ['c/4'], duration: '4', stem_direction: -1 },\n ].map(f.StaveNote.bind(f));\n const voice0 = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes0);\n Accidental.applyAccidentals([voice0], 'C');\n equal(hasAccidental(notes0[0]), false);\n equal(hasAccidental(notes0[1]), true);\n equal(hasAccidental(notes0[2]), false);\n equal(hasAccidental(notes0[3]), true);\n equal(hasAccidental(notes0[4]), false);\n equal(hasAccidental(notes0[5]), true);\n equal(hasAccidental(notes0[6]), false);\n equal(hasAccidental(notes0[7]), true);\n equal(hasAccidental(notes0[8]), false);\n new Formatter().joinVoices([voice0]).formatToStave([voice0], stave);\n f.draw();\n ok(true);\n}\nfunction automaticAccidentalsCornerCases2(options) {\n const f = VexFlowTests.makeFactory(options, 700, 150);\n const stave = f.Stave().addKeySignature('C');\n const notes0 = [\n { keys: ['c/4'], duration: '4', stem_direction: -1 },\n { keys: ['c/5'], duration: '4', stem_direction: -1 },\n { keys: ['c#/4'], duration: '4', stem_direction: -1 },\n { keys: ['c#/5'], duration: '4', stem_direction: -1 },\n { keys: ['c#/4'], duration: '4', stem_direction: -1 },\n { keys: ['c#/5'], duration: '4', stem_direction: -1 },\n { keys: ['c/4'], duration: '4', stem_direction: -1 },\n { keys: ['c/5'], duration: '4', stem_direction: -1 },\n { keys: ['c/4'], duration: '4', stem_direction: -1 },\n { keys: ['c/5'], duration: '4', stem_direction: -1 },\n { keys: ['cb/4'], duration: '4', stem_direction: -1 },\n { keys: ['cb/5'], duration: '4', stem_direction: -1 },\n { keys: ['cb/4'], duration: '4', stem_direction: -1 },\n { keys: ['cb/5'], duration: '4', stem_direction: -1 },\n { keys: ['c/4'], duration: '4', stem_direction: -1 },\n { keys: ['c/5'], duration: '4', stem_direction: -1 },\n { keys: ['c/4'], duration: '4', stem_direction: -1 },\n { keys: ['c/5'], duration: '4', stem_direction: -1 },\n ].map(f.StaveNote.bind(f));\n const voice0 = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes0);\n Accidental.applyAccidentals([voice0], 'C');\n equal(hasAccidental(notes0[0]), false);\n equal(hasAccidental(notes0[2]), true);\n equal(hasAccidental(notes0[4]), false);\n equal(hasAccidental(notes0[6]), true);\n equal(hasAccidental(notes0[8]), false);\n equal(hasAccidental(notes0[10]), true);\n equal(hasAccidental(notes0[12]), false);\n equal(hasAccidental(notes0[14]), true);\n equal(hasAccidental(notes0[16]), false);\n equal(hasAccidental(notes0[1]), false);\n equal(hasAccidental(notes0[3]), true);\n equal(hasAccidental(notes0[5]), false);\n equal(hasAccidental(notes0[7]), true);\n equal(hasAccidental(notes0[9]), false);\n equal(hasAccidental(notes0[11]), true);\n equal(hasAccidental(notes0[13]), false);\n equal(hasAccidental(notes0[15]), true);\n equal(hasAccidental(notes0[17]), false);\n new Formatter().joinVoices([voice0]).formatToStave([voice0], stave);\n f.draw();\n ok(true);\n}\nfunction automaticAccidentalsCornerCases3(options) {\n const f = VexFlowTests.makeFactory(options, 700, 150);\n const stave = f.Stave().addKeySignature('C#');\n const notes0 = [\n { keys: ['c/4'], duration: '4', stem_direction: -1 },\n { keys: ['c#/4'], duration: '4', stem_direction: -1 },\n { keys: ['c#/4'], duration: '4', stem_direction: -1 },\n { keys: ['c/4'], duration: '4', stem_direction: -1 },\n { keys: ['c/4'], duration: '4', stem_direction: -1 },\n { keys: ['cb/4'], duration: '4', stem_direction: -1 },\n { keys: ['cb/4'], duration: '4', stem_direction: -1 },\n { keys: ['c/4'], duration: '4', stem_direction: -1 },\n { keys: ['c/4'], duration: '4', stem_direction: -1 },\n ].map(f.StaveNote.bind(f));\n const voice0 = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes0);\n Accidental.applyAccidentals([voice0], 'C#');\n equal(hasAccidental(notes0[0]), true);\n equal(hasAccidental(notes0[1]), true);\n equal(hasAccidental(notes0[2]), false);\n equal(hasAccidental(notes0[3]), true);\n equal(hasAccidental(notes0[4]), false);\n equal(hasAccidental(notes0[5]), true);\n equal(hasAccidental(notes0[6]), false);\n equal(hasAccidental(notes0[7]), true);\n equal(hasAccidental(notes0[8]), false);\n new Formatter().joinVoices([voice0]).formatToStave([voice0], stave);\n f.draw();\n ok(true);\n}\nfunction automaticAccidentalsCornerCases4(options) {\n const f = VexFlowTests.makeFactory(options, 700, 150);\n const stave = f.Stave().addKeySignature('C#');\n const notes0 = [\n { keys: ['c/4'], duration: '4', stem_direction: -1 },\n { keys: ['c/5'], duration: '4', stem_direction: -1 },\n { keys: ['c#/4'], duration: '4', stem_direction: -1 },\n { keys: ['c#/5'], duration: '4', stem_direction: -1 },\n { keys: ['c#/4'], duration: '4', stem_direction: -1 },\n { keys: ['c#/5'], duration: '4', stem_direction: -1 },\n { keys: ['c/4'], duration: '4', stem_direction: -1 },\n { keys: ['c/5'], duration: '4', stem_direction: -1 },\n { keys: ['c/4'], duration: '4', stem_direction: -1 },\n { keys: ['c/5'], duration: '4', stem_direction: -1 },\n { keys: ['cb/4'], duration: '4', stem_direction: -1 },\n { keys: ['cb/5'], duration: '4', stem_direction: -1 },\n { keys: ['cb/4'], duration: '4', stem_direction: -1 },\n { keys: ['cb/5'], duration: '4', stem_direction: -1 },\n { keys: ['c/4'], duration: '4', stem_direction: -1 },\n { keys: ['c/5'], duration: '4', stem_direction: -1 },\n { keys: ['c/4'], duration: '4', stem_direction: -1 },\n { keys: ['c/5'], duration: '4', stem_direction: -1 },\n ].map(f.StaveNote.bind(f));\n const voice0 = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes0);\n Accidental.applyAccidentals([voice0], 'C#');\n equal(hasAccidental(notes0[0]), true);\n equal(hasAccidental(notes0[2]), true);\n equal(hasAccidental(notes0[4]), false);\n equal(hasAccidental(notes0[6]), true);\n equal(hasAccidental(notes0[8]), false);\n equal(hasAccidental(notes0[10]), true);\n equal(hasAccidental(notes0[12]), false);\n equal(hasAccidental(notes0[14]), true);\n equal(hasAccidental(notes0[16]), false);\n equal(hasAccidental(notes0[1]), true);\n equal(hasAccidental(notes0[3]), true);\n equal(hasAccidental(notes0[5]), false);\n equal(hasAccidental(notes0[7]), true);\n equal(hasAccidental(notes0[9]), false);\n equal(hasAccidental(notes0[11]), true);\n equal(hasAccidental(notes0[13]), false);\n equal(hasAccidental(notes0[15]), true);\n equal(hasAccidental(notes0[17]), false);\n new Formatter().joinVoices([voice0]).formatToStave([voice0], stave);\n f.draw();\n ok(true);\n}\nfunction factoryAPI(options) {\n const f = VexFlowTests.makeFactory(options, 700, 240);\n f.Stave({ x: 10, y: 10, width: 550 });\n const accid = makeNewAccid(f);\n const notes = [\n f\n .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: 'w' })\n .addModifier(accid('b'), 0)\n .addModifier(accid('#'), 1),\n f\n .StaveNote({ keys: ['d/4', 'e/4', 'f/4', 'a/4', 'c/5', 'e/5', 'g/5'], duration: 'h' })\n .addModifier(accid('##'), 0)\n .addModifier(accid('n'), 1)\n .addModifier(accid('bb'), 2)\n .addModifier(accid('b'), 3)\n .addModifier(accid('#'), 4)\n .addModifier(accid('n'), 5)\n .addModifier(accid('bb'), 6),\n f\n .StaveNote({ keys: ['f/4', 'g/4', 'a/4', 'b/4', 'c/5', 'e/5', 'g/5'], duration: '16' })\n .addModifier(accid('n'), 0)\n .addModifier(accid('#'), 1)\n .addModifier(accid('#'), 2)\n .addModifier(accid('b'), 3)\n .addModifier(accid('bb'), 4)\n .addModifier(accid('##'), 5)\n .addModifier(accid('#'), 6),\n f\n .StaveNote({ keys: ['a/3', 'c/4', 'e/4', 'b/4', 'd/5', 'g/5'], duration: 'w' })\n .addModifier(accid('#'), 0)\n .addModifier(accid('##').setAsCautionary(), 1)\n .addModifier(accid('#').setAsCautionary(), 2)\n .addModifier(accid('b'), 3)\n .addModifier(accid('bb').setAsCautionary(), 4)\n .addModifier(accid('b').setAsCautionary(), 5),\n ];\n Formatter.SimpleFormat(notes);\n notes.forEach((n, i) => {\n ok(n.getModifiersByType('Accidental').length > 0, 'Note ' + i + ' has accidentals');\n n.getModifiersByType('Accidental').forEach((accid, i) => {\n ok(accid.getWidth() > 0, 'Accidental ' + i + ' has set width');\n });\n });\n f.draw();\n ok(true, 'Factory API');\n}\nVexFlowTests.register(AccidentalTests);\nexport { AccidentalTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Annotation Tests\n// TODO: Formatter.FormatAndDraw(ctx, stave, notes, ???number???);\n// Did a previous version of the API accept a number as the fourth argument?\n// We removed the fourth argument from all of our test cases.\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Annotation, AnnotationVerticalJustify } from '../src/annotation';\nimport { Articulation } from '../src/articulation';\nimport { Beam } from '../src/beam';\nimport { Bend } from '../src/bend';\nimport { Flow } from '../src/flow';\nimport { Font, FontStyle, FontWeight } from '../src/font';\nimport { Formatter } from '../src/formatter';\nimport { ModifierPosition } from '../src/modifier';\nimport { Registry } from '../src/registry';\nimport { Stave } from '../src/stave';\nimport { StaveNote } from '../src/stavenote';\nimport { Stem } from '../src/stem';\nimport { TabNote } from '../src/tabnote';\nimport { TabStave } from '../src/tabstave';\nimport { Vibrato } from '../src/vibrato';\nimport { Voice } from '../src/voice';\nconst AnnotationTests = {\n Start() {\n QUnit.module('Annotation');\n const run = VexFlowTests.runTests;\n run('Placement', placement);\n run('Lyrics', lyrics);\n run('Simple Annotation', simple);\n run('Standard Notation Annotation', standard);\n run('Harmonics', harmonic);\n run('Fingerpicking', picking);\n run('Bottom Annotation', bottom);\n run('Bottom Annotations with Beams', bottomWithBeam);\n run('Test Justification Annotation Stem Up', justificationStemUp);\n run('Test Justification Annotation Stem Down', justificationStemDown);\n run('TabNote Annotations', tabNotes);\n },\n};\nconst FONT_SIZE = VexFlowTests.Font.size;\n// Helper functions to create TabNote and StaveNote objects.\nconst tabNote = (noteStruct) => new TabNote(noteStruct);\nconst staveNote = (noteStruct) => new StaveNote(noteStruct);\n/**\n * Show lyrics using Annotation objects.\n */\nfunction lyrics(options) {\n let fontSize = FONT_SIZE;\n let x = 10;\n let width = 170;\n let ratio = 1;\n const registry = new Registry();\n Registry.enableDefaultRegistry(registry);\n const f = VexFlowTests.makeFactory(options, 750, 260);\n // Add three groups of staves. Each time we increase the fontSize by 2.\n for (let i = 0; i < 3; ++i) {\n const score = f.EasyScore();\n score.set({ time: '3/4' });\n const system = f.System({ width, x });\n system.addStave({\n voices: [\n score.voice(score.notes('(C4 F4)/2[id=\"n0\"]').concat(score.beam(score.notes('(C4 A4)/8[id=\"n1\"], (C#4 A4)/8[id=\"n2\"]')))),\n ],\n });\n // Add lyrics under the first row.\n ['hand,', 'and', 'me', 'pears', 'lead', 'the'].forEach((text, ix) => {\n const verse = Math.floor(ix / 3);\n const noteGroupID = 'n' + (ix % 3);\n const noteGroup = registry.getElementById(noteGroupID);\n const lyricsAnnotation = f.Annotation({ text }).setFont('Roboto Slab', fontSize);\n lyricsAnnotation.setPosition(ModifierPosition.BELOW);\n noteGroup.addModifier(lyricsAnnotation, verse);\n });\n // Second row doesn't have any lyrics.\n system.addStave({\n voices: [score.voice(score.notes('(F4 D5)/2').concat(score.beam(score.notes('(F4 F5)/8, (F4 F5)/8'))))],\n });\n f.draw();\n ratio = (fontSize + 2) / fontSize;\n width = width * ratio;\n x = x + width;\n fontSize = fontSize + 2;\n }\n ok(true);\n}\nfunction simple(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 500, 240);\n ctx.scale(1.5, 1.5);\n ctx.fillStyle = '#221';\n ctx.strokeStyle = '#221';\n ctx.font = '10pt Arial, sans-serif';\n const stave = new TabStave(10, 10, 450).addTabGlyph().setContext(ctx).draw();\n const notes = [\n tabNote({\n positions: [\n { str: 2, fret: 10 },\n { str: 4, fret: 9 },\n ],\n duration: 'h',\n }).addModifier(new Annotation('T'), 0),\n tabNote({\n positions: [{ str: 2, fret: 10 }],\n duration: 'h',\n }).addModifier(new Bend('Full').setTap('T'), 0),\n ];\n Formatter.FormatAndDraw(ctx, stave, notes);\n ok(true, 'Simple Annotation');\n}\nfunction standard(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 500, 240);\n ctx.scale(1.5, 1.5);\n ctx.fillStyle = '#221';\n ctx.strokeStyle = '#221';\n const stave = new Stave(10, 10, 450).addClef('treble').setContext(ctx).draw();\n const annotation = (text) => new Annotation(text).setFont(Font.SERIF, FONT_SIZE, 'normal', 'italic');\n const notes = [\n staveNote({ keys: ['c/4', 'e/4'], duration: 'h' }).addModifier(annotation('quiet'), 0),\n staveNote({ keys: ['c/4', 'e/4', 'c/5'], duration: 'h' }).addModifier(annotation('Allegro'), 2),\n ];\n Formatter.FormatAndDraw(ctx, stave, notes);\n ok(true, 'Standard Notation Annotation');\n}\nfunction harmonic(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 500, 240);\n ctx.scale(1.5, 1.5);\n ctx.fillStyle = '#221';\n ctx.strokeStyle = '#221';\n ctx.font = '10pt Arial';\n const stave = new TabStave(10, 10, 450).addTabGlyph().setContext(ctx).draw();\n const notes = [\n tabNote({\n positions: [\n { str: 2, fret: 12 },\n { str: 3, fret: 12 },\n ],\n duration: 'h',\n }).addModifier(new Annotation('Harm.'), 0),\n tabNote({\n positions: [{ str: 2, fret: 9 }],\n duration: 'h',\n })\n .addModifier(new Annotation('(8va)').setFont(Font.SERIF, FONT_SIZE, FontWeight.NORMAL, FontStyle.ITALIC), 0)\n .addModifier(new Annotation('A.H.'), 0),\n ];\n Formatter.FormatAndDraw(ctx, stave, notes);\n ok(true, 'Simple Annotation');\n}\nfunction picking(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 500, 240);\n ctx.setFillStyle('#221');\n ctx.setStrokeStyle('#221');\n ctx.setFont(Font.SANS_SERIF, FONT_SIZE);\n const stave = new TabStave(10, 10, 450).addTabGlyph().setContext(ctx).draw();\n const annotation = (text) => new Annotation(text).setFont(Font.SERIF, FONT_SIZE, FontWeight.NORMAL, FontStyle.ITALIC);\n const notes = [\n tabNote({\n positions: [\n { str: 1, fret: 0 },\n { str: 2, fret: 1 },\n { str: 3, fret: 2 },\n { str: 4, fret: 2 },\n { str: 5, fret: 0 },\n ],\n duration: 'h',\n }).addModifier(new Vibrato().setVibratoWidth(40), 0),\n tabNote({\n positions: [{ str: 6, fret: 9 }],\n duration: '8',\n }).addModifier(annotation('p').setVerticalJustification(AnnotationVerticalJustify.TOP), 0),\n tabNote({\n positions: [{ str: 3, fret: 9 }],\n duration: '8',\n }).addModifier(annotation('i').setVerticalJustification(AnnotationVerticalJustify.TOP), 0),\n tabNote({\n positions: [{ str: 2, fret: 9 }],\n duration: '8',\n }).addModifier(annotation('m').setVerticalJustification(AnnotationVerticalJustify.TOP), 0),\n tabNote({\n positions: [{ str: 1, fret: 9 }],\n duration: '8',\n }).addModifier(annotation('a').setVerticalJustification(AnnotationVerticalJustify.TOP), 0),\n ];\n Formatter.FormatAndDraw(ctx, stave, notes);\n ok(true, 'Fingerpicking');\n}\nfunction placement(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 750, 300);\n ctx.fillStyle = '#221';\n ctx.strokeStyle = '#221';\n const stave = new Stave(10, 50, 750).addClef('treble').setContext(ctx).draw();\n const annotation = (text, fontSize, vj) => new Annotation(text).setFont(Font.SERIF, fontSize).setVerticalJustification(vj);\n const notes = [\n staveNote({ keys: ['e/4'], duration: 'q', stem_direction: Stem.DOWN })\n .addModifier(new Articulation('a.').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(new Articulation('a-').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(annotation('v1', 10, AnnotationVerticalJustify.TOP), 0)\n .addModifier(annotation('v2', 10, AnnotationVerticalJustify.TOP), 0),\n staveNote({ keys: ['b/4'], duration: 'q', stem_direction: Stem.DOWN })\n .addModifier(new Articulation('a.').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(new Articulation('a-').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(annotation('v1', 10, AnnotationVerticalJustify.TOP), 0)\n .addModifier(annotation('v2', 10, AnnotationVerticalJustify.TOP), 0),\n staveNote({ keys: ['c/5'], duration: 'q', stem_direction: Stem.DOWN })\n .addModifier(new Articulation('a.').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(new Articulation('a-').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(annotation('v1', 10, AnnotationVerticalJustify.TOP), 0)\n .addModifier(annotation('v2', 10, AnnotationVerticalJustify.TOP), 0),\n staveNote({ keys: ['f/4'], duration: 'q' })\n .addModifier(annotation('v1', 14, AnnotationVerticalJustify.TOP), 0)\n .addModifier(annotation('v2', 14, AnnotationVerticalJustify.TOP), 0),\n staveNote({ keys: ['f/4'], duration: 'q', stem_direction: Stem.DOWN })\n .addModifier(new Articulation('am').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(new Articulation('a.').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(new Articulation('a-').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(annotation('v1', 10, AnnotationVerticalJustify.TOP), 0)\n .addModifier(annotation('v2', 20, AnnotationVerticalJustify.TOP), 0),\n staveNote({ keys: ['f/5'], duration: 'q' })\n .addModifier(annotation('v1', 11, AnnotationVerticalJustify.TOP), 0)\n .addModifier(annotation('v2', 11, AnnotationVerticalJustify.TOP), 0),\n staveNote({ keys: ['f/5'], duration: 'q' })\n .addModifier(annotation('v1', 11, AnnotationVerticalJustify.TOP), 0)\n .addModifier(annotation('v2', 20, AnnotationVerticalJustify.TOP), 0),\n staveNote({ keys: ['f/4'], duration: 'q' })\n .addModifier(annotation('v1', 12, AnnotationVerticalJustify.BOTTOM), 0)\n .addModifier(annotation('v2', 12, AnnotationVerticalJustify.BOTTOM), 0),\n staveNote({ keys: ['f/5'], duration: 'q' })\n .addModifier(new Articulation('a.').setPosition(ModifierPosition.BELOW), 0)\n .addModifier(annotation('v1', 11, AnnotationVerticalJustify.BOTTOM), 0)\n .addModifier(annotation('v2', 20, AnnotationVerticalJustify.BOTTOM), 0),\n staveNote({ keys: ['f/5'], duration: 'q', stem_direction: Stem.DOWN })\n .addModifier(new Articulation('am').setPosition(ModifierPosition.BELOW), 0)\n .addModifier(annotation('v1', 10, AnnotationVerticalJustify.BOTTOM), 0)\n .addModifier(annotation('v2', 20, AnnotationVerticalJustify.BOTTOM), 0),\n staveNote({ keys: ['f/4'], duration: 'q', stem_direction: Stem.DOWN })\n .addModifier(annotation('v1', 10, AnnotationVerticalJustify.BOTTOM), 0)\n .addModifier(annotation('v2', 20, AnnotationVerticalJustify.BOTTOM), 0),\n staveNote({ keys: ['f/5'], duration: 'w' })\n .addModifier(new Articulation('a@u').setPosition(ModifierPosition.BELOW), 0)\n .addModifier(annotation('v1', 11, AnnotationVerticalJustify.BOTTOM), 0)\n .addModifier(annotation('v2', 16, AnnotationVerticalJustify.BOTTOM), 0),\n ];\n Formatter.FormatAndDraw(ctx, stave, notes);\n ok(true, ' Annotation Placement');\n}\nfunction bottom(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 500, 240);\n ctx.scale(1.5, 1.5);\n ctx.fillStyle = '#221';\n ctx.strokeStyle = '#221';\n const stave = new Stave(10, 10, 300).addClef('treble').setContext(ctx).draw();\n const annotation = (text) => new Annotation(text).setFont(Font.SERIF, FONT_SIZE).setVerticalJustification(Annotation.VerticalJustify.BOTTOM);\n const notes = [\n staveNote({ keys: ['f/4'], duration: 'w' }).addModifier(annotation('F'), 0),\n staveNote({ keys: ['a/4'], duration: 'w' }).addModifier(annotation('A'), 0),\n staveNote({ keys: ['c/5'], duration: 'w' }).addModifier(annotation('C'), 0),\n staveNote({ keys: ['e/5'], duration: 'w' }).addModifier(annotation('E'), 0),\n ];\n Formatter.FormatAndDraw(ctx, stave, notes);\n ok(true, 'Bottom Annotation');\n}\nfunction bottomWithBeam(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 500, 240);\n ctx.scale(1.5, 1.5);\n ctx.fillStyle = '#221';\n ctx.strokeStyle = '#221';\n const stave = new Stave(10, 10, 300).addClef('treble').setContext(ctx).draw();\n const notes = [\n new StaveNote({ keys: ['a/3'], duration: '8' }).addModifier(new Annotation('good').setVerticalJustification(Annotation.VerticalJustify.BOTTOM)),\n new StaveNote({ keys: ['g/3'], duration: '8' }).addModifier(new Annotation('even').setVerticalJustification(Annotation.VerticalJustify.BOTTOM)),\n new StaveNote({ keys: ['c/4'], duration: '8' }).addModifier(new Annotation('under').setVerticalJustification(Annotation.VerticalJustify.BOTTOM)),\n new StaveNote({ keys: ['d/4'], duration: '8' }).addModifier(new Annotation('beam').setVerticalJustification(Annotation.VerticalJustify.BOTTOM)),\n ];\n const beam = new Beam(notes.slice(1));\n Formatter.FormatAndDraw(ctx, stave, notes);\n beam.setContext(ctx).draw();\n ok(true, 'Bottom Annotation with Beams');\n}\nfunction justificationStemUp(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 650, 950);\n ctx.scale(1.5, 1.5);\n ctx.fillStyle = '#221';\n ctx.strokeStyle = '#221';\n const annotation = (text, hJustification, vJustification) => new Annotation(text)\n .setFont(Font.SANS_SERIF, FONT_SIZE)\n .setJustification(hJustification)\n .setVerticalJustification(vJustification);\n for (let v = 1; v <= 4; ++v) {\n const stave = new Stave(10, (v - 1) * 150 + 40, 400).addClef('treble').setContext(ctx).draw();\n const notes = [\n staveNote({ keys: ['c/3'], duration: 'q' }).addModifier(annotation('Text', 1, v), 0),\n staveNote({ keys: ['c/4'], duration: 'q' }).addModifier(annotation('Text', 2, v), 0),\n staveNote({ keys: ['c/5'], duration: 'q' }).addModifier(annotation('Text', 3, v), 0),\n staveNote({ keys: ['c/6'], duration: 'q' }).addModifier(annotation('Text', 4, v), 0),\n ];\n Formatter.FormatAndDraw(ctx, stave, notes);\n }\n ok(true, 'Test Justification Annotation');\n}\nfunction justificationStemDown(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 650, 1000);\n ctx.scale(1.5, 1.5);\n ctx.fillStyle = '#221';\n ctx.strokeStyle = '#221';\n const annotation = (text, hJustification, vJustification) => new Annotation(text)\n .setFont(Font.SANS_SERIF, FONT_SIZE)\n .setJustification(hJustification)\n .setVerticalJustification(vJustification);\n for (let v = 1; v <= 4; ++v) {\n const stave = new Stave(10, (v - 1) * 150 + 40, 400).addClef('treble').setContext(ctx).draw();\n const notes = [\n staveNote({ keys: ['c/3'], duration: 'q', stem_direction: -1 }).addModifier(annotation('Text', 1, v), 0),\n staveNote({ keys: ['c/4'], duration: 'q', stem_direction: -1 }).addModifier(annotation('Text', 2, v), 0),\n staveNote({ keys: ['c/5'], duration: 'q', stem_direction: -1 }).addModifier(annotation('Text', 3, v), 0),\n staveNote({ keys: ['c/6'], duration: 'q', stem_direction: -1 }).addModifier(annotation('Text', 4, v), 0),\n ];\n Formatter.FormatAndDraw(ctx, stave, notes);\n }\n ok(true, 'Test Justification Annotation');\n}\nfunction tabNotes(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 600, 200);\n ctx.font = '10pt Arial, sans-serif';\n const stave = new TabStave(10, 10, 550);\n stave.setContext(ctx);\n stave.draw();\n const specs = [\n {\n positions: [\n { str: 3, fret: 6 },\n { str: 4, fret: 25 },\n ],\n duration: '8',\n },\n {\n positions: [\n { str: 2, fret: 10 },\n { str: 5, fret: 12 },\n ],\n duration: '8',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 3, fret: 5 },\n ],\n duration: '8',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 3, fret: 5 },\n ],\n duration: '8',\n },\n ];\n const notes1 = specs.map((noteSpec) => {\n const note = new TabNote(noteSpec);\n note.render_options.draw_stem = true;\n return note;\n });\n const notes2 = specs.map((noteSpec) => {\n const note = new TabNote(noteSpec);\n note.render_options.draw_stem = true;\n note.setStemDirection(-1);\n return note;\n });\n const notes3 = specs.map((noteSpec) => new TabNote(noteSpec));\n notes1[0].addModifier(new Annotation('Text').setJustification(1).setVerticalJustification(1)); // U\n notes1[1].addModifier(new Annotation('Text').setJustification(2).setVerticalJustification(2)); // D\n notes1[2].addModifier(new Annotation('Text').setJustification(3).setVerticalJustification(3)); // U\n notes1[3].addModifier(new Annotation('Text').setJustification(4).setVerticalJustification(4)); // D\n notes2[0].addModifier(new Annotation('Text').setJustification(3).setVerticalJustification(1)); // U\n notes2[1].addModifier(new Annotation('Text').setJustification(3).setVerticalJustification(2)); // D\n notes2[2].addModifier(new Annotation('Text').setJustification(3).setVerticalJustification(3)); // U\n notes2[3].addModifier(new Annotation('Text').setJustification(3).setVerticalJustification(4)); // D\n notes3[0].addModifier(new Annotation('Text').setVerticalJustification(1)); // U\n notes3[1].addModifier(new Annotation('Text').setVerticalJustification(2)); // D\n notes3[2].addModifier(new Annotation('Text').setVerticalJustification(3)); // U\n notes3[3].addModifier(new Annotation('Text').setVerticalJustification(4)); // D\n const voice = new Voice(Flow.TIME4_4).setMode(Voice.Mode.SOFT);\n voice.addTickables(notes1);\n voice.addTickables(notes2);\n voice.addTickables(notes3);\n // Alternatively, you could add all the notes in one big array with spread syntax.\n // voice.addTickables([...notes1, ...notes2, ...notes3]);\n new Formatter().joinVoices([voice]).formatToStave([voice], stave, { stave });\n voice.draw(ctx, stave);\n ok(true, 'TabNotes successfully drawn');\n}\nVexFlowTests.register(AnnotationTests);\nexport { AnnotationTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Articulation Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Articulation } from '../src/articulation';\nimport { Beam } from '../src/beam';\nimport { Flow } from '../src/flow';\nimport { Font } from '../src/font';\nimport { Formatter } from '../src/formatter';\nimport { ModifierPosition } from '../src/modifier';\nimport { Stave } from '../src/stave';\nimport { Barline } from '../src/stavebarline';\nimport { StaveNote } from '../src/stavenote';\nimport { Stem } from '../src/stem';\nimport { TabNote } from '../src/tabnote';\nimport { TabStave } from '../src/tabstave';\nimport { Voice } from '../src/voice';\nconst ArticulationTests = {\n Start() {\n QUnit.module('Articulation');\n const run = VexFlowTests.runTests;\n run('Articulation - Vertical Placement', verticalPlacement);\n run('Articulation - Staccato/Staccatissimo', drawArticulations, { sym1: 'a.', sym2: 'av' });\n run('Articulation - Accent/Tenuto', drawArticulations, { sym1: 'a>', sym2: 'a-' });\n run('Articulation - Marcato/L.H. Pizzicato', drawArticulations, { sym1: 'a^', sym2: 'a+' });\n run('Articulation - Snap Pizzicato/Fermata', drawArticulations, { sym1: 'ao', sym2: 'ao' });\n run('Articulation - Up-stroke/Down-Stroke', drawArticulations, { sym1: 'a|', sym2: 'am' });\n run('Articulation - Fermata Above/Below', drawFermata, { sym1: 'a@a', sym2: 'a@u' });\n run('Articulation - Inline/Multiple', drawArticulations2, { sym1: 'a.', sym2: 'a.' });\n run('TabNote Articulation', tabNotes, { sym1: 'a.', sym2: 'a.' });\n },\n};\n// Helper function for creating StaveNotes.\nfunction drawArticulations(options) {\n const sym1 = options.params.sym1;\n const sym2 = options.params.sym2;\n const width = 125 - Stave.defaultPadding;\n const f = VexFlowTests.makeFactory(options, 675, 195);\n const ctx = f.getContext();\n expect(0);\n let x = 10;\n const y = 30;\n const score = f.EasyScore();\n const formatAndDrawToWidth = (x, y, width, notes, barline) => {\n const voices = [score.voice(notes, { time: '4/4' })];\n const formatter = f.Formatter();\n voices.forEach((v) => formatter.joinVoices([v]));\n const nwidth = Math.max(formatter.preCalculateMinTotalWidth(voices), width);\n formatter.format(voices, nwidth);\n const stave = f\n .Stave({ x, y, width: nwidth + Stave.defaultPadding })\n .setEndBarType(barline)\n .setContext(ctx)\n .draw();\n voices.forEach((voice) => voice.draw(ctx, stave));\n return stave.getWidth();\n };\n // bar 1\n const notesBar1 = [\n f.StaveNote({ keys: ['a/3'], duration: 'q', stem_direction: 1 }),\n f.StaveNote({ keys: ['a/4'], duration: 'q', stem_direction: 1 }),\n f.StaveNote({ keys: ['c/4'], duration: 'q', stem_direction: 1 }),\n f.StaveNote({ keys: ['a/4'], duration: 'q', stem_direction: 1 }),\n ];\n notesBar1[0].addModifier(new Articulation(sym1).setPosition(4), 0);\n notesBar1[1].addModifier(new Articulation(sym1).setPosition(4), 0);\n notesBar1[2].addModifier(new Articulation(sym1).setPosition(3), 0);\n notesBar1[3].addModifier(new Articulation(sym1).setPosition(3), 0);\n // Helper function to justify and draw a 4/4 voice\n x += formatAndDrawToWidth(x, y, width, notesBar1, Barline.type.NONE);\n // bar 2 - juxtaposing second bar next to first bar\n const notesBar2 = [\n f.StaveNote({ keys: ['c/5'], duration: 'q', stem_direction: -1 }),\n f.StaveNote({ keys: ['a/5'], duration: 'q', stem_direction: -1 }),\n f.StaveNote({ keys: ['c/5'], duration: 'q', stem_direction: -1 }),\n f.StaveNote({ keys: ['a/5'], duration: 'q', stem_direction: -1 }),\n ];\n notesBar2[0].addModifier(new Articulation(sym1).setPosition(3), 0);\n notesBar2[1].addModifier(new Articulation(sym1).setPosition(3), 0);\n notesBar2[2].addModifier(new Articulation(sym1).setPosition(4), 0);\n notesBar2[3].addModifier(new Articulation(sym1).setPosition(4), 0);\n // Helper function to justify and draw a 4/4 voice\n x += formatAndDrawToWidth(x, y, width, notesBar2, Barline.type.DOUBLE);\n // bar 3 - juxtaposing second bar next to first bar\n const notesBar3 = [\n f.StaveNote({ keys: ['c/4'], duration: 'q', stem_direction: 1 }),\n f.StaveNote({ keys: ['c/5'], duration: 'q', stem_direction: 1 }),\n f.StaveNote({ keys: ['c/4'], duration: 'q', stem_direction: 1 }),\n f.StaveNote({ keys: ['a/4'], duration: 'q', stem_direction: 1 }),\n ];\n notesBar3[0].addModifier(new Articulation(sym2).setPosition(4), 0);\n notesBar3[1].addModifier(new Articulation(sym2).setPosition(4), 0);\n notesBar3[2].addModifier(new Articulation(sym2).setPosition(3), 0);\n notesBar3[3].addModifier(new Articulation(sym2).setPosition(3), 0);\n // Helper function to justify and draw a 4/4 voice\n x += formatAndDrawToWidth(x, y, width, notesBar3, Barline.type.NONE);\n // bar 4 - juxtaposing second bar next to first bar\n const notesBar4 = [\n f.StaveNote({ keys: ['a/4'], duration: 'q', stem_direction: -1 }),\n f.StaveNote({ keys: ['a/5'], duration: 'q', stem_direction: -1 }),\n f.StaveNote({ keys: ['c/5'], duration: 'q', stem_direction: -1 }),\n f.StaveNote({ keys: ['a/5'], duration: 'q', stem_direction: -1 }),\n ];\n notesBar4[0].addModifier(new Articulation(sym2).setPosition(3), 0);\n notesBar4[1].addModifier(new Articulation(sym2).setPosition(3), 0);\n notesBar4[2].addModifier(new Articulation(sym2).setPosition(4), 0);\n notesBar4[3].addModifier(new Articulation(sym2).setPosition(4), 0);\n // Helper function to justify and draw a 4/4 voice\n formatAndDrawToWidth(x, y, width, notesBar4, Barline.type.END);\n}\nfunction drawFermata(options) {\n const sym1 = options.params.sym1;\n const sym2 = options.params.sym2;\n const f = VexFlowTests.makeFactory(options, 400, 195);\n const ctx = f.getContext();\n const score = f.EasyScore();\n const width = 150 - Stave.defaultPadding;\n let x = 50;\n const y = 30;\n const formatAndDrawToWidth = (x, y, width, notes, barline) => {\n const voices = [score.voice(notes, { time: '4/4' })];\n const formatter = f.Formatter();\n voices.forEach((v) => formatter.joinVoices([v]));\n const nwidth = Math.max(formatter.preCalculateMinTotalWidth(voices), width);\n formatter.format(voices, nwidth);\n const stave = f\n .Stave({ x, y, width: nwidth + Stave.defaultPadding })\n .setEndBarType(barline)\n .setContext(ctx)\n .draw();\n voices.forEach((voice) => voice.draw(ctx, stave));\n return stave.getWidth();\n };\n expect(0);\n const notesBar1 = [\n f.StaveNote({ keys: ['c/4'], duration: 'q', stem_direction: 1 }),\n f.StaveNote({ keys: ['a/4'], duration: 'q', stem_direction: 1 }),\n f.StaveNote({ keys: ['c/4'], duration: 'q', stem_direction: -1 }),\n f.StaveNote({ keys: ['a/4'], duration: 'q', stem_direction: -1 }),\n ];\n notesBar1[0].addModifier(new Articulation(sym1).setPosition(3), 0);\n notesBar1[1].addModifier(new Articulation(sym1).setPosition(3), 0);\n notesBar1[2].addModifier(new Articulation(sym2).setPosition(4), 0);\n notesBar1[3].addModifier(new Articulation(sym2).setPosition(4), 0);\n x += formatAndDrawToWidth(x, y, width, notesBar1, Barline.type.NONE);\n // bar 2 - juxtaposing second bar next to first bar\n const notesBar2 = [\n f.StaveNote({ keys: ['c/5'], duration: 'q', stem_direction: 1 }),\n f.StaveNote({ keys: ['a/5'], duration: 'q', stem_direction: 1 }),\n f.StaveNote({ keys: ['c/5'], duration: 'q', stem_direction: -1 }),\n f.StaveNote({ keys: ['a/5'], duration: 'q', stem_direction: -1 }),\n ];\n notesBar2[0].addModifier(new Articulation(sym1).setPosition(3), 0);\n notesBar2[1].addModifier(new Articulation(sym1).setPosition(3), 0);\n notesBar2[2].addModifier(new Articulation(sym2).setPosition(4), 0);\n notesBar2[3].addModifier(new Articulation(sym2).setPosition(4), 0);\n // Helper function to justify and draw a 4/4 voice\n formatAndDrawToWidth(x, y, width, notesBar2, Barline.type.DOUBLE);\n}\nfunction verticalPlacement(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 750, 300);\n ctx.fillStyle = '#221';\n ctx.strokeStyle = '#221';\n const staveNote = (noteStruct) => new StaveNote(noteStruct);\n const stave = new Stave(10, 50, 750).addClef('treble').setContext(ctx).draw();\n const notes = [\n staveNote({ keys: ['f/4'], duration: 'q' })\n .addModifier(new Articulation('a@u').setPosition(ModifierPosition.BELOW), 0)\n .addModifier(new Articulation('a.').setPosition(ModifierPosition.BELOW), 0)\n .addModifier(new Articulation('a-').setPosition(ModifierPosition.BELOW), 0),\n staveNote({ keys: ['g/4'], duration: 'q', stem_direction: Stem.DOWN })\n .addModifier(new Articulation('a@u').setPosition(ModifierPosition.BELOW), 0)\n .addModifier(new Articulation('a.').setPosition(ModifierPosition.BELOW), 0)\n .addModifier(new Articulation('a-').setPosition(ModifierPosition.BELOW), 0),\n staveNote({ keys: ['c/5'], duration: 'q' })\n .addModifier(new Articulation('a@u').setPosition(ModifierPosition.BELOW), 0)\n .addModifier(new Articulation('a.').setPosition(ModifierPosition.BELOW), 0)\n .addModifier(new Articulation('a-').setPosition(ModifierPosition.BELOW), 0),\n staveNote({ keys: ['f/4'], duration: 'q' })\n .addModifier(new Articulation('a.').setPosition(ModifierPosition.BELOW), 0)\n .addModifier(new Articulation('a-').setPosition(ModifierPosition.BELOW), 0)\n .addModifier(new Articulation('a@u').setPosition(ModifierPosition.BELOW), 0),\n staveNote({ keys: ['g/4'], duration: 'q', stem_direction: Stem.DOWN })\n .addModifier(new Articulation('a.').setPosition(ModifierPosition.BELOW), 0)\n .addModifier(new Articulation('a-').setPosition(ModifierPosition.BELOW), 0)\n .addModifier(new Articulation('a@u').setPosition(ModifierPosition.BELOW), 0),\n staveNote({ keys: ['c/5'], duration: 'q' })\n .addModifier(new Articulation('a.').setPosition(ModifierPosition.BELOW), 0)\n .addModifier(new Articulation('a-').setPosition(ModifierPosition.BELOW), 0)\n .addModifier(new Articulation('a@u').setPosition(ModifierPosition.BELOW), 0),\n staveNote({ keys: ['a/5'], duration: 'q', stem_direction: Stem.DOWN })\n .addModifier(new Articulation('a@a').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(new Articulation('a.').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(new Articulation('a-').setPosition(ModifierPosition.ABOVE), 0),\n staveNote({ keys: ['f/5'], duration: 'q' })\n .addModifier(new Articulation('a@a').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(new Articulation('a.').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(new Articulation('a-').setPosition(ModifierPosition.ABOVE), 0),\n staveNote({ keys: ['b/4'], duration: 'q', stem_direction: Stem.DOWN })\n .addModifier(new Articulation('a@a').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(new Articulation('a.').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(new Articulation('a-').setPosition(ModifierPosition.ABOVE), 0),\n staveNote({ keys: ['a/5'], duration: 'q', stem_direction: Stem.DOWN })\n .addModifier(new Articulation('a.').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(new Articulation('a-').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(new Articulation('a@a').setPosition(ModifierPosition.ABOVE), 0),\n staveNote({ keys: ['f/5'], duration: 'q' })\n .addModifier(new Articulation('a.').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(new Articulation('a-').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(new Articulation('a@a').setPosition(ModifierPosition.ABOVE), 0),\n staveNote({ keys: ['b/4'], duration: 'q', stem_direction: Stem.DOWN })\n .addModifier(new Articulation('a.').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(new Articulation('a-').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(new Articulation('a@a').setPosition(ModifierPosition.ABOVE), 0),\n ];\n Formatter.FormatAndDraw(ctx, stave, notes);\n ok(true, ' Annotation Placement');\n}\nfunction drawArticulations2(options) {\n expect(0);\n const scale = 0.8;\n let x = 10;\n const y = 30;\n const width = 350 - Stave.defaultPadding;\n const f = VexFlowTests.makeFactory(options, 1000, 195);\n const ctx = f.getContext();\n ctx.scale(scale, scale);\n const score = f.EasyScore();\n const formatAndDrawToWidth = (x, y, width, notes, barline, beams) => {\n const voices = [score.voice(notes, { time: '4/4' })];\n const formatter = f.Formatter();\n voices.forEach((v) => formatter.joinVoices([v]));\n const nwidth = Math.max(formatter.preCalculateMinTotalWidth(voices), width);\n formatter.format(voices, nwidth);\n const stave = f\n .Stave({ x: x, y: y, width: nwidth + Stave.defaultPadding })\n .setEndBarType(barline)\n .setContext(ctx)\n .draw();\n voices.forEach((voice) => voice.draw(ctx, stave));\n beams.forEach((beam) => beam.setContext(ctx).draw());\n return stave.getWidth();\n };\n // Get the rendering context\n // bar 1\n const notesBar1 = [\n f.StaveNote({ keys: ['c/4'], duration: '16', stem_direction: 1 }),\n f.StaveNote({ keys: ['d/4'], duration: '16', stem_direction: 1 }),\n f.StaveNote({ keys: ['e/4'], duration: '16', stem_direction: 1 }),\n f.StaveNote({ keys: ['f/4'], duration: '16', stem_direction: 1 }),\n f.StaveNote({ keys: ['g/4'], duration: '16', stem_direction: 1 }),\n f.StaveNote({ keys: ['a/4'], duration: '16', stem_direction: 1 }),\n f.StaveNote({ keys: ['b/4'], duration: '16', stem_direction: 1 }),\n f.StaveNote({ keys: ['c/5'], duration: '16', stem_direction: 1 }),\n f.StaveNote({ keys: ['d/5'], duration: '16', stem_direction: -1 }),\n f.StaveNote({ keys: ['e/5'], duration: '16', stem_direction: -1 }),\n f.StaveNote({ keys: ['f/5'], duration: '16', stem_direction: -1 }),\n f.StaveNote({ keys: ['g/5'], duration: '16', stem_direction: -1 }),\n f.StaveNote({ keys: ['a/5'], duration: '16', stem_direction: -1 }),\n f.StaveNote({ keys: ['b/5'], duration: '16', stem_direction: -1 }),\n f.StaveNote({ keys: ['c/6'], duration: '16', stem_direction: -1 }),\n f.StaveNote({ keys: ['d/6'], duration: '16', stem_direction: -1 }),\n ];\n let i;\n for (i = 0; i < 16; i++) {\n notesBar1[i].addModifier(new Articulation('a.').setPosition(4), 0);\n notesBar1[i].addModifier(new Articulation('a>').setPosition(4), 0);\n if (i === 15) {\n notesBar1[i].addModifier(new Articulation('a@u').setPosition(4), 0);\n }\n }\n const beam1 = new Beam(notesBar1.slice(0, 8));\n const beam2 = new Beam(notesBar1.slice(8, 16));\n x += formatAndDrawToWidth(x, y, width, notesBar1, Barline.type.NONE, [beam1, beam2]);\n // Helper function to justify and draw a 4/4 voice\n beam1.setContext(ctx).draw();\n beam2.setContext(ctx).draw();\n // bar 2 - juxtaposing second bar next to first bar\n const notesBar2 = [\n f.StaveNote({ keys: ['f/3'], duration: '16', stem_direction: 1 }),\n f.StaveNote({ keys: ['g/3'], duration: '16', stem_direction: 1 }),\n f.StaveNote({ keys: ['a/3'], duration: '16', stem_direction: 1 }),\n f.StaveNote({ keys: ['b/3'], duration: '16', stem_direction: 1 }),\n f.StaveNote({ keys: ['c/4'], duration: '16', stem_direction: 1 }),\n f.StaveNote({ keys: ['d/4'], duration: '16', stem_direction: 1 }),\n f.StaveNote({ keys: ['e/4'], duration: '16', stem_direction: 1 }),\n f.StaveNote({ keys: ['f/4'], duration: '16', stem_direction: 1 }),\n f.StaveNote({ keys: ['g/4'], duration: '16', stem_direction: -1 }),\n f.StaveNote({ keys: ['a/4'], duration: '16', stem_direction: -1 }),\n f.StaveNote({ keys: ['b/4'], duration: '16', stem_direction: -1 }),\n f.StaveNote({ keys: ['c/5'], duration: '16', stem_direction: -1 }),\n f.StaveNote({ keys: ['d/5'], duration: '16', stem_direction: -1 }),\n f.StaveNote({ keys: ['e/5'], duration: '16', stem_direction: -1 }),\n f.StaveNote({ keys: ['f/5'], duration: '16', stem_direction: -1 }),\n f.StaveNote({ keys: ['g/5'], duration: '16', stem_direction: -1 }),\n ];\n for (i = 0; i < 16; i++) {\n notesBar2[i].addModifier(new Articulation('a-').setPosition(3), 0);\n notesBar2[i].addModifier(new Articulation('a^').setPosition(3), 0);\n if (i === 15) {\n notesBar2[i].addModifier(new Articulation('a@u').setPosition(4), 0);\n }\n }\n const beam3 = new Beam(notesBar2.slice(0, 8));\n const beam4 = new Beam(notesBar2.slice(8, 16));\n x += formatAndDrawToWidth(x, y, width, notesBar2, Barline.type.NONE, [beam3, beam4]);\n // bar 3 - juxtaposing second bar next to first bar\n const notesBar3 = [f.StaveNote({ keys: ['c/4'], duration: 'w', stem_direction: 1 })];\n notesBar3[0].addModifier(new Articulation('a-').setPosition(3), 0);\n notesBar3[0].addModifier(new Articulation('a>').setPosition(3), 0);\n notesBar3[0].addModifier(new Articulation('a@a').setPosition(3), 0);\n // Helper function to justify and draw a 4/4 voice\n x += formatAndDrawToWidth(x, y, width, notesBar3, Barline.type.NONE, []);\n // bar 4 - juxtaposing second bar next to first bar\n const notesBar4 = [\n f.StaveNote({ keys: ['c/5'], duration: 'q', stem_direction: -1 }),\n f.StaveNote({ keys: ['a/5'], duration: 'q', stem_direction: -1 }),\n f.StaveNote({ keys: ['c/5'], duration: 'q', stem_direction: -1 }),\n f.StaveNote({ keys: ['a/5'], duration: 'q', stem_direction: -1 }),\n ];\n for (i = 0; i < 4; i++) {\n let position1 = 3;\n if (i > 1) {\n position1 = 4;\n }\n notesBar4[i].addModifier(new Articulation('a-').setPosition(position1), 0);\n }\n // Helper function to justify and draw a 4/4 voice\n formatAndDrawToWidth(x, y, width, notesBar4, Barline.type.END, []);\n}\nfunction tabNotes(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 600, 200);\n ctx.font = '10pt ' + Font.SANS_SERIF;\n const stave = new TabStave(10, 10, 550);\n stave.setContext(ctx);\n stave.draw();\n const specs = [\n {\n positions: [\n { str: 3, fret: 6 },\n { str: 4, fret: 25 },\n ],\n duration: '8',\n },\n {\n positions: [\n { str: 2, fret: 10 },\n { str: 5, fret: 12 },\n ],\n duration: '8',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 3, fret: 5 },\n ],\n duration: '8',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 3, fret: 5 },\n ],\n duration: '8',\n },\n ];\n const notes1 = specs.map((noteSpec) => {\n const tabNote = new TabNote(noteSpec);\n tabNote.render_options.draw_stem = true;\n return tabNote;\n });\n const notes2 = specs.map((noteSpec) => {\n const tabNote = new TabNote(noteSpec);\n tabNote.render_options.draw_stem = true;\n tabNote.setStemDirection(-1);\n return tabNote;\n });\n const notes3 = specs.map((noteSpec) => new TabNote(noteSpec));\n notes1[0].addModifier(new Articulation('a>').setPosition(3), 0); // U\n notes1[1].addModifier(new Articulation('a>').setPosition(4), 0); // D\n notes1[2].addModifier(new Articulation('a.').setPosition(3), 0); // U\n notes1[3].addModifier(new Articulation('a.').setPosition(4), 0); // D\n notes2[0].addModifier(new Articulation('a>').setPosition(3), 0);\n notes2[1].addModifier(new Articulation('a>').setPosition(4), 0);\n notes2[2].addModifier(new Articulation('a.').setPosition(3), 0);\n notes2[3].addModifier(new Articulation('a.').setPosition(4), 0);\n notes3[0].addModifier(new Articulation('a>').setPosition(3), 0);\n notes3[1].addModifier(new Articulation('a>').setPosition(4), 0);\n notes3[2].addModifier(new Articulation('a.').setPosition(3), 0);\n notes3[3].addModifier(new Articulation('a.').setPosition(4), 0);\n const voice = new Voice(Flow.TIME4_4).setMode(Voice.Mode.SOFT);\n voice.addTickables(notes1);\n voice.addTickables(notes2);\n voice.addTickables(notes3);\n new Formatter().joinVoices([voice]).formatToStave([voice], stave);\n voice.draw(ctx, stave);\n ok(true, 'TabNotes successfully drawn');\n}\nVexFlowTests.register(ArticulationTests);\nexport { ArticulationTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Auto Beaming Tests\n// TODO: Beam.generateBeams(voice.getTickables() as StemmableNote[], ...) requires a cast to StemmableNote[].\n// Is there a cleaner way to handle this?\nimport { concat, VexFlowTests } from './vexflow_test_helpers';\nimport { Beam } from '../src/beam';\nimport { Fraction } from '../src/fraction';\nimport { Stem } from '../src/stem';\nconst AutoBeamFormattingTests = {\n Start() {\n QUnit.module('Auto-Beaming');\n const run = VexFlowTests.runTests;\n run('Simple Auto Beaming', simpleAuto);\n run('Auto Beaming With Overflow Group', simpleAutoWithOverflowGroup);\n run('Even Group Stem Directions', evenGroupStemDirections);\n run('Odd Group Stem Directions', oddGroupStemDirections);\n run('Odd Beam Groups Auto Beaming', oddBeamGroups);\n run('More Simple Auto Beaming 0', moreSimple0);\n run('More Simple Auto Beaming 1', moreSimple1);\n run('Beam Across All Rests', beamAcrossAllRests);\n run('Beam Across All Rests with Stemlets', beamAcrossAllRestsWithStemlets);\n run('Break Beams on Middle Rests Only', beamAcrossMiddleRests);\n run('Break Beams on Rest', breakBeamsOnRests);\n run('Maintain Stem Directions', maintainStemDirections);\n run('Maintain Stem Directions - Beam Over Rests', maintainStemDirectionsBeamAcrossRests);\n run('Beat group with unbeamable note - 2/2', groupWithUnbeamableNote);\n run('Offset beat grouping - 6/8 ', groupWithUnbeamableNote1);\n run('Odd Time - Guessing Default Beam Groups', autoOddBeamGroups);\n run('Custom Beam Groups', customBeamGroups);\n run('Simple Tuplet Auto Beaming', simpleTuplets);\n run('More Simple Tuplet Auto Beaming', moreSimpleTuplets);\n run('More Automatic Beaming', moreBeaming);\n run('Automatic Beaming 4/4 with 3, 3, 2 Pattern', beamingWithSeveralGroups1);\n run('Automatic Beaming 4/4 with 3, 3, 2 Pattern and Overflow', beamingWithSeveralGroupsOverflow);\n run('Automatic Beaming 8/4 with 3, 2, 3 Pattern and 2 Overflows', beamingWithSeveralGroupsOverflow2);\n run('Automatic Beaming 8/4 with 3, 2, 3 Pattern and 3 Overflows', beamingWithSeveralGroupsOverflow3);\n run('Duration-Based Secondary Beam Breaks', secondaryBreaks1);\n run('Duration-Based Secondary Beam Breaks 2', secondaryBreaks2);\n run('Flat Beams Up', flatBeamsUp);\n run('Flat Beams Down', flatBeamsDown);\n run('Flat Beams Mixed Direction', flatBeamsMixed);\n run('Flat Beams Up (uniform)', flatBeamsUpUniform);\n run('Flat Beams Down (uniform)', flatBeamsDownUniform);\n run('Flat Beams Up Bounds', flatBeamsUpBounds);\n run('Flat Beams Down Bounds', flatBeamsDownBounds);\n },\n};\nfunction simpleAuto(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave();\n const score = f.EasyScore();\n const voice = score.voice(score.notes('f5/8, e5, d5, c5/16, c5, d5/8, e5, f5, f5/32, f5, f5, f5'), { time: '4/4' });\n // Takes a voice and returns its auto beams.\n const beams = Beam.applyAndGetBeams(voice);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Auto Beaming Applicator Test');\n}\nfunction simpleAutoWithOverflowGroup(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave();\n const score = f.EasyScore();\n // Add a . after a note (e.g., f5/4.) to make it a dotted note.\n const voice = score.voice(score.notes('f5/4., e5/8, d5/8, d5/16, c5/16, c5/16, c5/16, f5/16, f5/32, f5/32'), {\n time: '4/4',\n });\n // Takes a voice and returns its auto beams.\n const beams = Beam.applyAndGetBeams(voice);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Auto Beaming Applicator Test');\n}\nfunction evenGroupStemDirections(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave();\n const score = f.EasyScore();\n const voice = score.voice(score.notes('a4/8, b4, g4, c5, f4, d5, e4, e5, b4, b4, g4, d5'), { time: '6/4' });\n // Takes a voice and returns its auto beams.\n const beams = Beam.applyAndGetBeams(voice);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n equal(beams[0].getStemDirection(), Stem.UP);\n equal(beams[1].getStemDirection(), Stem.UP);\n equal(beams[2].getStemDirection(), Stem.UP);\n equal(beams[3].getStemDirection(), Stem.UP);\n equal(beams[4].getStemDirection(), Stem.DOWN);\n equal(beams[5].getStemDirection(), Stem.DOWN);\n ok(true, 'Auto Beaming Applicator Test');\n}\nfunction oddGroupStemDirections(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave();\n const score = f.EasyScore();\n const voice = score.voice(score.notes('g4/8, b4, d5, c5, f4, d5, e4, g5, g4, b4, g4, d5, a4, c5, a4'), {\n time: '15/8',\n });\n const groups = [new Fraction(3, 8)];\n const beams = Beam.applyAndGetBeams(voice, undefined, groups);\n equal(beams[0].getStemDirection(), Stem.DOWN, 'Notes are equidistant from middle line');\n equal(beams[1].getStemDirection(), Stem.DOWN);\n equal(beams[2].getStemDirection(), Stem.UP);\n equal(beams[3].getStemDirection(), Stem.DOWN, 'Notes are equidistant from middle line');\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Auto Beaming Applicator Test');\n}\nfunction oddBeamGroups(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave();\n const score = f.EasyScore();\n const voice = score.voice(score.notes('f5, e5, d5, c5, c5, d5, e5, f5, f5, f4, f3, f5/16, f5'), { time: '6/4' });\n const groups = [new Fraction(2, 8), new Fraction(3, 8), new Fraction(1, 8)];\n // Takes a voice and returns its auto beams.\n const beams = Beam.applyAndGetBeams(voice, undefined, groups);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Auto Beam Applicator Test');\n}\nfunction moreSimple0(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave();\n const score = f.EasyScore();\n const voice = score.voice(score.notes('c4/8, g4, c5, g5, a5, c4, d4, a5'), { time: '4/4' });\n const beams = Beam.applyAndGetBeams(voice);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Auto Beam Applicator Test');\n}\nfunction moreSimple1(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave();\n const score = f.EasyScore();\n const voice = score.voice(score.notes('c5/16, g5, c5, c5/r, c5/r, (c4 e4 g4), d4, a5, c4, g4, c5, b4/r, (c4 e4), b4/r, b4/r, a4'), { time: '4/4' });\n const beams = Beam.applyAndGetBeams(voice);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Auto Beam Applicator Test');\n}\nfunction breakBeamsOnRests(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave();\n const score = f.EasyScore();\n const voice = score.voice(score.notes('c5/16, g5, c5, c5/r, c5/r, (c4 e4 g4), d4, a5, c4, g4, c5, b4/r, (c4 e4), b4/r, b4/r, a4'), { time: '4/4' });\n const beams = Beam.generateBeams(voice.getTickables(), {\n beam_rests: false,\n });\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Auto Beam Applicator Test');\n}\nfunction beamAcrossAllRestsWithStemlets(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave();\n const score = f.EasyScore();\n const voice = score.voice(score.notes('c5/16, g5, c5, c5/r, c5/r, (c4 e4 g4), d4, a5, c4, g4, c5, b4/r, (c4 e4), b4/r, b4/r, a4'), { time: '4/4' });\n const beams = Beam.generateBeams(voice.getTickables(), {\n beam_rests: true,\n show_stemlets: true,\n });\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Auto Beam Applicator Test');\n}\nfunction beamAcrossAllRests(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave();\n const score = f.EasyScore();\n const voice = score.voice(score.notes('c5/16, g5, c5, c5/r, c5/r, (c4 e4 g4), d4, a5, c4, g4, c5, b4/r, (c4 e4), b4/r, b4/r, a4'), { time: '4/4' });\n const beams = Beam.generateBeams(voice.getTickables(), {\n beam_rests: true,\n });\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Auto Beam Applicator Test');\n}\nfunction beamAcrossMiddleRests(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave();\n const score = f.EasyScore();\n const voice = score.voice(score.notes('c5/16, g5, c5, c5/r, c5/r, (c4 e4 g4), d4, a5, c4, g4, c5, b4/r, (c4 e4), b4/r, b4/r, a4'), { time: '4/4' });\n const beams = Beam.generateBeams(voice.getTickables(), {\n beam_rests: true,\n beam_middle_only: true,\n });\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Auto Beam Applicator Test');\n}\nfunction maintainStemDirections(options) {\n const f = VexFlowTests.makeFactory(options, 450, 200);\n const stave = f.Stave();\n const score = f.EasyScore();\n // EasyScore.notes(line, ...) ignores whitespace in the line string.\n const voice = score.voice(score.notes([\n 'b4/16, b4, b4[stem=\"down\"], b4/r',\n 'b4/r, b4[stem=\"down\"], b4, b4',\n 'b4[stem=\"down\"], b4[stem=\"down\"], b4, b4/r',\n 'b4/32, b4[stem=\"down\"], b4[stem=\"down\"], b4, b4/16/r, b4',\n ].join(', '), { stem: 'up' }), { time: '4/4' });\n const beams = Beam.generateBeams(voice.getTickables(), {\n beam_rests: false,\n maintain_stem_directions: true,\n });\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Auto Beam Applicator Test');\n}\nfunction maintainStemDirectionsBeamAcrossRests(options) {\n const f = VexFlowTests.makeFactory(options, 450, 200);\n const stave = f.Stave();\n const score = f.EasyScore();\n const voice = score.voice(score.notes([\n 'b4/16, b4, b4[stem=\"down\"], b4/r',\n 'b4/r, b4[stem=\"down\"], b4, b4',\n 'b4[stem=\"down\"], b4[stem=\"down\"], b4, b4/r',\n 'b4/32, b4[stem=\"down\"], b4[stem=\"down\"], b4, b4/16/r, b4',\n ].join(', '), { stem: 'up' }), { time: '4/4' });\n const beams = Beam.generateBeams(voice.getTickables(), {\n beam_rests: true,\n maintain_stem_directions: true,\n });\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Auto Beam Applicator Test');\n}\nfunction groupWithUnbeamableNote(options) {\n const f = VexFlowTests.makeFactory(options, 450, 200);\n const stave = f.Stave().addTimeSignature('2/4');\n const score = f.EasyScore();\n const voice = score.voice(score.notes('b4/16, b4, b4/4, b4/16, b4'), { time: '2/4' });\n const beams = Beam.generateBeams(voice.getTickables(), {\n groups: [new Fraction(2, 2)],\n beam_rests: false,\n maintain_stem_directions: true,\n });\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Auto Beam Applicator Test');\n}\nfunction groupWithUnbeamableNote1(options) {\n const f = VexFlowTests.makeFactory(options, 450, 200);\n const stave = f.Stave().addTimeSignature('6/8');\n const score = f.EasyScore();\n const voice = score.voice(score.notes('b4/4, b4/4, b4/8, b4/8'), { time: '6/8' });\n const beams = Beam.generateBeams(voice.getTickables(), {\n groups: [new Fraction(3, 8)],\n beam_rests: false,\n maintain_stem_directions: true,\n });\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Auto Beam Applicator Test');\n}\nfunction autoOddBeamGroups(options) {\n const f = VexFlowTests.makeFactory(options, 450, 400);\n const score = f.EasyScore();\n const stave1 = f.Stave({ y: 10 }).addTimeSignature('5/4');\n const voice1 = score.voice(score.notes('c5/8, g5, c5, b4, b4, c4, d4, a5, c4, g4'), { time: '5/4' });\n const stave2 = f.Stave({ y: 150 }).addTimeSignature('5/8');\n const voice2 = score.voice(score.notes('c5/8, g5, c5, b4, b4'), { time: '5/8' });\n const stave3 = f.Stave({ y: 290 }).addTimeSignature('13/16');\n const voice3 = score.voice(score.notes('c5/16, g5, c5, b4, b4, c5, g5, c5, b4, b4, c5, b4, b4'), {\n time: '13/16',\n });\n // Flatten the arrays into a single Beam[].\n const beams = [\n ...Beam.applyAndGetBeams(voice1, undefined, Beam.getDefaultBeamGroups('5/4')),\n ...Beam.applyAndGetBeams(voice2, undefined, Beam.getDefaultBeamGroups('5/8')),\n ...Beam.applyAndGetBeams(voice3, undefined, Beam.getDefaultBeamGroups('13/16')),\n ];\n f.Formatter().formatToStave([voice1], stave1).formatToStave([voice2], stave2).formatToStave([voice3], stave3);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Auto Beam Applicator Test');\n}\nfunction customBeamGroups(options) {\n const f = VexFlowTests.makeFactory(options, 450, 400);\n const score = f.EasyScore();\n const stave1 = f.Stave({ y: 10 }).addTimeSignature('5/4');\n const voice1 = score.voice(score.notes('c5/8, g5, c5, b4, b4, c4, d4, a5, c4, g4'), { time: '5/4' });\n const stave2 = f.Stave({ y: 150 }).addTimeSignature('5/8');\n const voice2 = score.voice(score.notes('c5/8, g5, c5, b4, b4'), { time: '5/8' });\n const stave3 = f.Stave({ y: 290 }).addTimeSignature('13/16');\n const voice3 = score.voice(score.notes('c5/16, g5, c5, b4, b4, c5, g5, c5, b4, b4, c5, b4, b4'), { time: '13/16' });\n const group1 = [new Fraction(5, 8)];\n const group2 = [new Fraction(3, 8), new Fraction(2, 8)];\n const group3 = [new Fraction(7, 16), new Fraction(2, 16), new Fraction(4, 16)];\n // Flatten the three Beam[] into a single Beam[].\n // Alternatively, you can use .reduce(concat) flatten arrays, where concat is defined as (a, b) => a.concat(b).\n const beams = [\n ...Beam.applyAndGetBeams(voice1, undefined, group1),\n ...Beam.applyAndGetBeams(voice2, undefined, group2),\n ...Beam.applyAndGetBeams(voice3, undefined, group3),\n ];\n f.Formatter().formatToStave([voice1], stave1).formatToStave([voice2], stave2).formatToStave([voice3], stave3);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Auto Beam Applicator Test');\n}\n/**\n * Helper function which uses Function.prototype.bind() to create shortcut methods.\n * This can improve the readability of large blocks of EasyScore code.\n */\nfunction createShortcuts(score) {\n return {\n notes: score.notes.bind(score),\n tuplet: score.tuplet.bind(score),\n };\n}\nfunction simpleTuplets(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave();\n const score = f.EasyScore();\n const { notes, tuplet } = createShortcuts(score);\n const voice = score.voice([\n ...tuplet(notes('c4/8, g4, c5')),\n ...notes('g5/8, a5'),\n ...tuplet(notes('a5/16, (c5 e5), a5, d5, a5'), { ratioed: false, notes_occupied: 4 }),\n ], { time: '3/4' });\n const beams = Beam.applyAndGetBeams(voice);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Auto Beam Applicator Test');\n}\nfunction moreSimpleTuplets(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave();\n const score = f.EasyScore();\n const { notes, tuplet } = createShortcuts(score);\n const voice = score.voice([...tuplet(notes('d4/4, g4, c5')), ...notes('g5/16, a5, a5, (c5 e5)')], { time: '3/4' });\n const beams = Beam.applyAndGetBeams(voice);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Auto Beam Applicator Test');\n}\nfunction moreBeaming(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave();\n const score = f.EasyScore();\n const voice = score.voice(score.notes('c4/8, g4/4, c5/8., g5/16, a5/4, a5/16, (c5 e5)/16, a5/8'), { time: '9/8' });\n const beams = Beam.applyAndGetBeams(voice, undefined, Beam.getDefaultBeamGroups('9/8'));\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Auto Beam Applicator Test');\n}\nfunction beamingWithSeveralGroups1(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave();\n const score = f.EasyScore();\n const voice = score.voice(score.notes('c4/8, g4/4, c5/8, g5, a5, a5, f5'), { time: '4/4' });\n const beams = Beam.applyAndGetBeams(voice, undefined, [new Fraction(3, 8), new Fraction(3, 8), new Fraction(2, 8)]);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Auto Beam Applicator Test');\n}\nfunction beamingWithSeveralGroupsOverflow(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave();\n const score = f.EasyScore();\n const voice = score.voice(score.notes('c4/8, g4/4., c5/8, g5, a5, a5'), { time: '4/4' });\n const beams = Beam.applyAndGetBeams(voice, undefined, [new Fraction(3, 8), new Fraction(3, 8), new Fraction(2, 8)]);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Auto Beam Applicator Test');\n}\nfunction beamingWithSeveralGroupsOverflow2(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave();\n const score = f.EasyScore();\n const voice = score.voice(score.notes('c4/16, g4/2, f4/16, c5/8, a4/16, c4/16, g4/8, b4, c5, g5, f5, e5, c5, a4/4'), {\n time: '8/4',\n });\n const beams = Beam.applyAndGetBeams(voice, undefined, [new Fraction(3, 8), new Fraction(2, 8), new Fraction(3, 8)]);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Auto Beam Applicator Test');\n}\nfunction beamingWithSeveralGroupsOverflow3(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave();\n const score = f.EasyScore();\n const voice = score.voice(score.notes('c4/16, g4/1, f4/16, c5/8, g5, f5, e5, c5, a4/4'), { time: '8/4' });\n const beams = Beam.applyAndGetBeams(voice, undefined, [new Fraction(3, 8), new Fraction(2, 8), new Fraction(3, 8)]);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Auto Beam Applicator Test');\n}\nfunction secondaryBreaks1(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave();\n const score = f.EasyScore();\n const voice = score.voice(score.notes([\n 'f5/32, f5, f5, f5, f5/16., f5/32',\n 'f5/16, f5/8, f5/16',\n 'f5/32, f5/16., f5., f5/32',\n 'f5/16., f5/32, f5, f5/16.',\n ].join(',')));\n const beams = Beam.generateBeams(voice.getTickables(), { secondary_breaks: '8' });\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Duration-Based Secondary Breaks Test');\n}\nfunction secondaryBreaks2(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave();\n const score = f.EasyScore();\n const { notes, tuplet } = createShortcuts(score);\n const voice = score.voice([\n tuplet(notes('e5/16, f5, f5')),\n tuplet(notes('f5/16, f5, c5')),\n notes('a4/16., f4/32'),\n tuplet(notes('d4/16, d4, d4')),\n tuplet(notes('a5/8, (e5 g5), a5')),\n tuplet(notes('f5/16, f5, f5')),\n tuplet(notes('f5/16, f5, a4')),\n ].reduce(concat));\n const beams = Beam.generateBeams(voice.getTickables(), { secondary_breaks: '8' });\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Duration-Based Secondary Breaks Test');\n}\nfunction flatBeamsUp(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave({ y: 40 });\n const score = f.EasyScore();\n const { notes, tuplet } = createShortcuts(score);\n const voice = score.voice([\n tuplet(notes('c4/8, g4, f5')),\n notes('d5/8'),\n tuplet(notes('c5/16, (c4 e4 g4), f4')),\n notes('d5/8, e5, c4, f5/32, f5, f5, f5'),\n ].reduce(concat));\n const beams = Beam.generateBeams(voice.getTickables(), {\n flat_beams: true,\n stem_direction: 1,\n });\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Flat Beams Up Test');\n}\nfunction flatBeamsDown(options) {\n const f = VexFlowTests.makeFactory(options, 450, 200);\n const stave = f.Stave({ y: 40 });\n const score = f.EasyScore();\n const voice = score.voice(score.notes('c5/64, c5, c5, c5, c5, c5, c5, c5, a5/8, g5, (d4 f4 a4)/16, d4, d5/8, e5, g5, a6/32, a6, a6, g4/64, g4'));\n const beams = Beam.generateBeams(voice.getTickables(), {\n flat_beams: true,\n stem_direction: -1,\n });\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Flat Beams Down Test');\n}\nfunction flatBeamsMixed(options) {\n const f = VexFlowTests.makeFactory(options, 450, 200);\n const stave = f.Stave({ y: 40 });\n const score = f.EasyScore();\n const voice = score.voice(score.notes('c5/64, d5, e5, c5, f5, c5, a5, c5, a5/8, g5, (d4 f4 a4)/16, d4, d5/8, e5, c4, a4/32, a4, a4, g4/64, g4'));\n const beams = Beam.generateBeams(voice.getTickables(), { flat_beams: true });\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Flat Beams Mixed Direction Test');\n}\nfunction flatBeamsUpUniform(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave({ y: 40 });\n const score = f.EasyScore();\n const { notes, tuplet } = createShortcuts(score);\n const voice = score.voice([\n ...tuplet(notes('c4/8, g4, g5')),\n ...notes('d5/8, c5/16, (c4 e4 g4), d5/8, e5, c4, f5/32, f5, f5, f5'),\n ]);\n const beams = Beam.generateBeams(voice.getTickables(), {\n flat_beams: true,\n flat_beam_offset: 50,\n stem_direction: 1,\n });\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Flat Beams Up (uniform) Test');\n}\nfunction flatBeamsDownUniform(options) {\n const f = VexFlowTests.makeFactory(options, 450, 200);\n const stave = f.Stave({ y: 40 });\n const score = f.EasyScore();\n const voice = score.voice(score.notes('c5/64, c5, c5, c5, c5, c5, c5, c5, a5/8, g5, (e4 g4 b4)/16, e5, d5/8, e5/8, g5/8, a6/32, a6, a6, g4/64, g4'));\n const beams = Beam.generateBeams(voice.getTickables(), {\n flat_beams: true,\n flat_beam_offset: 155,\n stem_direction: -1,\n });\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Flat Beams Down (uniform) Test');\n}\nfunction flatBeamsUpBounds(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave({ y: 40 });\n const score = f.EasyScore();\n const { notes, tuplet } = createShortcuts(score);\n const voice = score.voice([\n ...tuplet(notes('c4/8, g4/8, g5/8')),\n ...notes('d5/8, c5/16, (c4 e4 g4)/16, d5/8, e5/8, c4/8, f5/32, f5/32, f5/32, f5/32'),\n ]);\n const beams = Beam.generateBeams(voice.getTickables(), {\n flat_beams: true,\n flat_beam_offset: 60,\n stem_direction: 1,\n });\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Flat Beams Up (uniform) Test');\n}\nfunction flatBeamsDownBounds(options) {\n const f = VexFlowTests.makeFactory(options, 450, 200);\n const stave = f.Stave({ y: 40 });\n const score = f.EasyScore();\n const voice = score.voice(score.notes([\n 'g5/8, a6/32, a6/32, a6/32, g4/64, g4/64',\n 'c5/64, c5/64, c5/64, c5/64, c5/64, c5/64, c5/64, c5/64, a5/8',\n 'g5/8, (e4 g4 b4)/16, e5/16',\n 'd5/8, e5/8',\n ].join(','), { stem: 'down' }));\n const beams = Beam.generateBeams(voice.getTickables(), {\n flat_beams: true,\n flat_beam_offset: 145,\n stem_direction: -1,\n });\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'Flat Beams Down (uniform) Test');\n}\nVexFlowTests.register(AutoBeamFormattingTests);\nexport { AutoBeamFormattingTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Bach Demo\nimport { concat, VexFlowTests } from './vexflow_test_helpers';\nimport { BarlineType, Registry } from '../src/index';\nconst BachDemoTests = {\n Start() {\n QUnit.module('Bach Demo');\n VexFlowTests.runTests('Minuet 1', minuet1);\n },\n};\nfunction minuet1(options) {\n const registry = new Registry();\n Registry.enableDefaultRegistry(registry);\n // Retrieve the element from the registry and cast to StaveNote, so we can call .addModifier( ) later.\n const id = (id) => registry.getElementById(id);\n const f = VexFlowTests.makeFactory(options, 1100, 900);\n const score = f.EasyScore({ throwOnError: true });\n // Bind these three functions so the code looks cleaner.\n // Instead of score.voice(...), just call voice(...).\n const voice = score.voice.bind(score);\n const notes = score.notes.bind(score);\n const beam = score.beam.bind(score);\n let x = 120;\n let y = 80;\n function appendSystem(width) {\n const system = f.System({ x, y, width, spaceBetweenStaves: 10 });\n x += width;\n return system;\n }\n score.set({ time: '3/4' });\n /* Measure 1 */\n let system = appendSystem(220);\n system\n .addStave({\n voices: [\n voice([notes('D5/q[id=\"m1a\"]'), beam(notes('G4/8, A4, B4, C5', { stem: 'up' }))].reduce(concat)),\n voice([f.TextDynamics({ text: 'p', duration: 'h', dots: 1, line: 9 })]),\n ],\n })\n .addClef('treble')\n .addKeySignature('G')\n .addTimeSignature('3/4')\n .setTempo({ name: 'Allegretto', duration: 'h', dots: 1, bpm: 66 }, -30);\n system\n .addStave({ voices: [voice(notes('(G3 B3 D4)/h, A3/q', { clef: 'bass' }))] })\n .addClef('bass')\n .addKeySignature('G')\n .addTimeSignature('3/4');\n system.addConnector('brace');\n system.addConnector('singleRight');\n system.addConnector('singleLeft');\n id('m1a').addModifier(f.Fingering({ number: '5' }), 0);\n /* Measure 2 */\n system = appendSystem(150);\n system.addStave({ voices: [voice(notes('D5/q[id=\"m2a\"], G4[id=\"m2b\"], G4[id=\"m2c\"]'))] });\n system.addStave({ voices: [voice(notes('B3/h.', { clef: 'bass' }))] });\n system.addConnector('singleRight');\n id('m2a').addModifier(f.Articulation({ type: 'a.', position: 'above' }), 0);\n id('m2b').addModifier(f.Articulation({ type: 'a.', position: 'below' }), 0);\n id('m2c').addModifier(f.Articulation({ type: 'a.', position: 'below' }), 0);\n f.Curve({\n from: id('m1a'),\n to: id('m2a'),\n options: {\n cps: [\n { x: 0, y: 40 },\n { x: 0, y: 40 },\n ],\n },\n });\n /* Measure 3 */\n system = appendSystem(150);\n system.addStave({\n voices: [voice([notes('E5/q[id=\"m3a\"]'), beam(notes('C5/8, D5, E5, F5', { stem: 'down' }))].reduce(concat))],\n });\n id('m3a').addModifier(f.Fingering({ number: '3', position: 'above' }), 0);\n system.addStave({ voices: [voice(notes('C4/h.', { clef: 'bass' }))] });\n system.addConnector('singleRight');\n /* Measure 4 */\n system = appendSystem(150);\n system.addStave({ voices: [voice(notes('G5/q[id=\"m4a\"], G4[id=\"m4b\"], G4[id=\"m4c\"]'))] });\n system.addStave({ voices: [voice(notes('B3/h.', { clef: 'bass' }))] });\n system.addConnector('singleRight');\n id('m4a').addModifier(f.Articulation({ type: 'a.', position: 'above' }), 0);\n id('m4b').addModifier(f.Articulation({ type: 'a.', position: 'below' }), 0);\n id('m4c').addModifier(f.Articulation({ type: 'a.', position: 'below' }), 0);\n f.Curve({\n from: id('m3a'),\n to: id('m4a'),\n options: {\n cps: [\n { x: 0, y: 20 },\n { x: 0, y: 20 },\n ],\n },\n });\n /* Measure 5 */\n system = appendSystem(150);\n system.addStave({\n voices: [voice([notes('C5/q[id=\"m5a\"]'), beam(notes('D5/8, C5, B4, A4', { stem: 'down' }))].reduce(concat))],\n });\n id('m5a').addModifier(f.Fingering({ number: '4', position: 'above' }), 0);\n system.addStave({ voices: [voice(notes('A3/h.', { clef: 'bass' }))] });\n system.addConnector('singleRight');\n /* Measure 6 */\n system = appendSystem(150);\n system.addStave({\n voices: [voice([notes('B4/q'), beam(notes('C5/8, B4, A4, G4[id=\"m6a\"]', { stem: 'up' }))].reduce(concat))],\n });\n system.addStave({ voices: [voice(notes('G3/h.', { clef: 'bass' }))] });\n system.addConnector('singleRight');\n f.Curve({\n from: id('m5a'),\n to: id('m6a'),\n options: {\n cps: [\n { x: 0, y: 20 },\n { x: 0, y: 20 },\n ],\n invert: true,\n position_end: 'nearTop',\n y_shift: 20,\n },\n });\n /* Measure 7 (New system) */\n x = 20;\n y += 230;\n system = appendSystem(220);\n system\n .addStave({\n voices: [\n voice([notes('F4/q[id=\"m7a\"]'), beam(notes('G4/8[id=\"m7b\"], A4, B4, G4', { stem: 'up' }))].reduce(concat)),\n ],\n })\n .addClef('treble')\n .addKeySignature('G');\n system\n .addStave({ voices: [voice(notes('D4/q, B3[id=\"m7c\"], G3', { clef: 'bass' }))] })\n .addClef('bass')\n .addKeySignature('G');\n system.addConnector('brace');\n system.addConnector('singleRight');\n system.addConnector('singleLeft');\n id('m7a').addModifier(f.Fingering({ number: '2', position: 'below' }), 0);\n id('m7b').addModifier(f.Fingering({ number: '1' }), 0);\n id('m7c').addModifier(f.Fingering({ number: '3', position: 'above' }), 0);\n /* Measure 8 */\n system = appendSystem(180);\n const grace = f.GraceNote({ keys: ['d/3'], clef: 'bass', duration: '8', slash: true });\n system.addStave({ voices: [voice(notes('A4/h.[id=\"m8c\"]'))] });\n system.addStave({\n voices: [\n score\n .set({ clef: 'bass' })\n .voice([notes('D4/q[id=\"m8a\"]'), beam(notes('D3/8, C4, B3[id=\"m8b\"], A3', { stem: 'down' }))].reduce(concat)),\n ],\n });\n system.addConnector('singleRight');\n id('m8b').addModifier(f.Fingering({ number: '1', position: 'above' }), 0);\n id('m8c').addModifier(f.GraceNoteGroup({ notes: [grace] }), 0);\n f.Curve({\n from: id('m7a'),\n to: id('m8c'),\n options: {\n cps: [\n { x: 0, y: 20 },\n { x: 0, y: 20 },\n ],\n invert: true,\n position: 'nearTop',\n position_end: 'nearTop',\n },\n });\n f.StaveTie({ from: grace, to: id('m8c') });\n /* Measure 9 */\n system = appendSystem(180);\n system.addStave({\n voices: [\n score\n .set({ clef: 'treble' })\n .voice([notes('D5/q[id=\"m9a\"]'), beam(notes('G4/8, A4, B4, C5', { stem: 'up' }))].reduce(concat)),\n ],\n });\n system.addStave({ voices: [voice(notes('B3/h, A3/q', { clef: 'bass' }))] });\n system.addConnector('singleRight');\n id('m9a').addModifier(f.Fingering({ number: '5' }), 0);\n /* Measure 10 */\n system = appendSystem(170);\n system.addStave({ voices: [voice(notes('D5/q[id=\"m10a\"], G4[id=\"m10b\"], G4[id=\"m10c\"]'))] });\n system.addStave({ voices: [voice(notes('G3/q[id=\"m10d\"], B3, G3', { clef: 'bass' }))] });\n system.addConnector('singleRight');\n id('m10a').addModifier(f.Articulation({ type: 'a.', position: 'above' }), 0);\n id('m10b').addModifier(f.Articulation({ type: 'a.', position: 'below' }), 0);\n id('m10c').addModifier(f.Articulation({ type: 'a.', position: 'below' }), 0);\n id('m10d').addModifier(f.Fingering({ number: '4' }), 0);\n f.Curve({\n from: id('m9a'),\n to: id('m10a'),\n options: {\n cps: [\n { x: 0, y: 40 },\n { x: 0, y: 40 },\n ],\n },\n });\n /* Measure 11 */\n system = appendSystem(150);\n system.addStave({\n voices: [voice([notes('E5/q[id=\"m11a\"]'), beam(notes('C5/8, D5, E5, F5', { stem: 'down' }))].reduce(concat))],\n });\n id('m11a').addModifier(f.Fingering({ number: '3', position: 'above' }), 0);\n system.addStave({ voices: [voice(notes('C4/h.', { clef: 'bass' }))] });\n system.addConnector('singleRight');\n /* Measure 12 */\n system = appendSystem(170);\n system.addStave({ voices: [voice(notes('G5/q[id=\"m12a\"], G4[id=\"m12b\"], G4[id=\"m12c\"]'))] });\n system.addStave({\n voices: [\n score\n .set({ clef: 'bass' })\n .voice([notes('B3/q[id=\"m12d\"]'), beam(notes('C4/8, B3, A3, G3[id=\"m12e\"]', { stem: 'down' }))].reduce(concat)),\n ],\n });\n system.addConnector('singleRight');\n id('m12a').addModifier(f.Articulation({ type: 'a.', position: 'above' }), 0);\n id('m12b').addModifier(f.Articulation({ type: 'a.', position: 'below' }), 0);\n id('m12c').addModifier(f.Articulation({ type: 'a.', position: 'below' }), 0);\n id('m12d').addModifier(f.Fingering({ number: '2', position: 'above' }), 0);\n id('m12e').addModifier(f.Fingering({ number: '4', position: 'above' }), 0);\n f.Curve({\n from: id('m11a'),\n to: id('m12a'),\n options: {\n cps: [\n { x: 0, y: 20 },\n { x: 0, y: 20 },\n ],\n },\n });\n /* Measure 13 (New system) */\n x = 20;\n y += 230;\n system = appendSystem(220);\n system\n .addStave({\n voices: [\n score\n .set({ clef: 'treble' })\n .voice([notes('c5/q[id=\"m13a\"]'), beam(notes('d5/8, c5, b4, a4', { stem: 'down' }))].reduce(concat)),\n ],\n })\n .addClef('treble')\n .addKeySignature('G');\n system\n .addStave({ voices: [voice(notes('a3/h[id=\"m13b\"], f3/q[id=\"m13c\"]', { clef: 'bass' }))] })\n .addClef('bass')\n .addKeySignature('G');\n system.addConnector('brace');\n system.addConnector('singleRight');\n system.addConnector('singleLeft');\n id('m13a').addModifier(f.Fingering({ number: '4', position: 'above' }), 0);\n id('m13b').addModifier(f.Fingering({ number: '1' }), 0);\n id('m13c').addModifier(f.Fingering({ number: '3', position: 'above' }), 0);\n /* Measure 14 */\n system = appendSystem(180);\n system.addStave({\n voices: [\n score\n .set({ clef: 'treble' })\n .voice([notes('B4/q'), beam(notes('C5/8, b4, a4, g4', { stem: 'up' }))].reduce(concat)),\n ],\n });\n system.addStave({ voices: [voice(notes('g3/h[id=\"m14a\"], b3/q[id=\"m14b\"]', { clef: 'bass' }))] });\n system.addConnector('singleRight');\n id('m14a').addModifier(f.Fingering({ number: '2' }), 0);\n id('m14b').addModifier(f.Fingering({ number: '1' }), 0);\n /* Measure 15 */\n system = appendSystem(180);\n system.addStave({\n voices: [\n score\n .set({ clef: 'treble' })\n .voice([notes('a4/q'), beam(notes('b4/8, a4, g4, f4[id=\"m15a\"]', { stem: 'up' }))].reduce(concat)),\n ],\n });\n system.addStave({ voices: [voice(notes('c4/q[id=\"m15b\"], d4, d3', { clef: 'bass' }))] });\n system.addConnector('singleRight');\n id('m15a').addModifier(f.Fingering({ number: '2' }), 0);\n id('m15b').addModifier(f.Fingering({ number: '2' }), 0);\n /* Measure 16 */\n system = appendSystem(130);\n system\n .addStave({\n voices: [score.set({ clef: 'treble' }).voice([notes('g4/h.[id=\"m16a\"]')].reduce(concat))],\n })\n .setEndBarType(BarlineType.REPEAT_END);\n system\n .addStave({ voices: [voice(notes('g3/h[id=\"m16b\"], g2/q', { clef: 'bass' }))] })\n .setEndBarType(BarlineType.REPEAT_END);\n system.addConnector('boldDoubleRight');\n id('m16a').addModifier(f.Fingering({ number: '1' }), 0);\n id('m16b').addModifier(f.Fingering({ number: '1' }), 0);\n f.Curve({\n from: id('m13a'),\n to: id('m16a'),\n options: {\n cps: [\n { x: 0, y: 50 },\n { x: 0, y: 20 },\n ],\n invert: true,\n position_end: 'nearTop',\n },\n });\n /* Measure 17 */\n system = appendSystem(180);\n system\n .addStave({\n voices: [\n score\n .set({ clef: 'treble' })\n .voice([notes('b5/q[id=\"m17a\"]'), beam(notes('g5/8, a5, b5, g5', { stem: 'down' }))].reduce(concat)),\n voice([f.TextDynamics({ text: 'mf', duration: 'h', dots: 1, line: 10 })]),\n ],\n })\n .setBegBarType(BarlineType.REPEAT_BEGIN);\n system.addStave({ voices: [voice(notes('g3/h.', { clef: 'bass' }))] }).setBegBarType(BarlineType.REPEAT_BEGIN);\n system.addConnector('boldDoubleLeft');\n system.addConnector('singleRight');\n id('m17a').addModifier(f.Fingering({ number: '5', position: 'above' }), 0);\n /* Measure 18 */\n system = appendSystem(180);\n system.addStave({\n voices: [\n score\n .set({ clef: 'treble' })\n .voice([notes('a5/q[id=\"m18a\"]'), beam(notes('d5/8, e5, f5, d5[id=\"m18b\"]', { stem: 'down' }))].reduce(concat)),\n ],\n });\n system.addStave({ voices: [voice(notes('f3/h.', { clef: 'bass' }))] });\n system.addConnector('singleRight');\n id('m18a').addModifier(f.Fingering({ number: '4', position: 'above' }), 0);\n f.Curve({\n from: id('m17a'),\n to: id('m18b'),\n options: {\n cps: [\n { x: 0, y: 20 },\n { x: 0, y: 30 },\n ],\n },\n });\n /* Done */\n f.draw();\n Registry.disableDefaultRegistry();\n ok(true, 'Bach Minuet 1');\n}\nVexFlowTests.register(BachDemoTests);\nexport { BachDemoTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Barline Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Barline, BarlineType } from '../src/stavebarline';\nconst BarlineTests = {\n Start() {\n QUnit.module('Barline');\n test('Enums', enums);\n const run = VexFlowTests.runTests;\n run('Simple BarNotes', simple);\n run('Style BarNotes', style);\n },\n};\nfunction enums() {\n // VexFlow 4.0 renamed Barline.type => BarlineType.\n // The old way still works, for backwards compatibility.\n equal(Barline.type, BarlineType);\n const a = BarlineType['DOUBLE'];\n const b = BarlineType.DOUBLE;\n equal(a, b);\n}\nfunction simple(options) {\n const f = VexFlowTests.makeFactory(options, 380, 160);\n const stave = f.Stave();\n const notes = [\n f.StaveNote({ keys: ['d/4', 'e/4', 'f/4'], stem_direction: -1, duration: '2' }),\n f.BarNote({ type: 'single' }),\n f\n .StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: '2' })\n .addModifier(f.Accidental({ type: 'n' }), 0)\n .addModifier(f.Accidental({ type: '#' }), 1),\n ];\n const voice = f.Voice().addTickables(notes);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'Simple Test');\n}\nfunction style(options) {\n const f = VexFlowTests.makeFactory(options, 380, 160);\n const stave = f.Stave();\n const notes = [\n f.StaveNote({ keys: ['d/4', 'e/4', 'f/4'], stem_direction: -1, duration: '2' }),\n f.BarNote({ type: 'single' }),\n f\n .StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: '2' })\n .addModifier(f.Accidental({ type: 'n' }), 0)\n .addModifier(f.Accidental({ type: '#' }), 1),\n ];\n notes[1].setStyle({ shadowBlur: 15, shadowColor: 'blue', fillStyle: 'blue', strokeStyle: 'blue' });\n const voice = f.Voice().addTickables(notes);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'Style');\n}\nVexFlowTests.register(BarlineTests);\nexport { BarlineTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Beam Tests\n// TODO: Factory.Beam()'s 'notes' argument is a StemmableNote[], but we only have access to Tickable[].\nimport { concat, VexFlowTests } from './vexflow_test_helpers';\nimport { AnnotationVerticalJustify, Beam, Dot, Font, FontStyle, FontWeight, Stem, Voice, } from '../src/index';\nconst BeamTests = {\n Start() {\n QUnit.module('Beam');\n const run = VexFlowTests.runTests;\n run('Simple Beam', simple);\n run('Multi Beam', multi);\n run('Sixteenth Beam', sixteenth);\n run('Slopey Beam', slopey);\n run('Auto-stemmed Beam', autoStem);\n run('Mixed Beam 1', mixed);\n run('Mixed Beam 2', mixed2);\n run('Dotted Beam', dotted);\n run('Partial Beam', partial);\n run('Close Trade-offs Beam', tradeoffs);\n run('Insane Beam', insane);\n run('Lengthy Beam', lenghty);\n run('Outlier Beam', outlier);\n run('Break Secondary Beams', breakSecondaryBeams);\n run('TabNote Beams Up', tabBeamsUp);\n run('TabNote Beams Down', tabBeamsDown);\n run('TabNote Auto Create Beams', autoTabBeams);\n run('TabNote Beams Auto Stem', tabBeamsAutoStem);\n run('Complex Beams with Annotations', complexWithAnnotation);\n run('Complex Beams with Articulations', complexWithArticulation);\n },\n};\nfunction simple(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave();\n const score = f.EasyScore();\n const beam = score.beam.bind(score);\n const notes = score.notes.bind(score);\n const voice = score.voice([\n notes('(cb4 e#4 a4)/2'),\n beam(notes('(cb4 e#4 a4)/8, (d4 f4 a4), (ebb4 g##4 b4), (f4 a4 c5)', { stem: 'up' })),\n ].reduce(concat), { time: '2/2' });\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'Simple Test');\n}\nfunction multi(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave();\n const score = f.EasyScore();\n const voice = score.voice.bind(score);\n const beam = score.beam.bind(score);\n const notes = score.notes.bind(score);\n const voices = [\n voice([beam(notes('f5/8, e5, d5, c5', { stem: 'up' })), beam(notes('c5, d5, e5, f5', { stem: 'up' }))].reduce(concat)),\n voice([beam(notes('f4/8, e4, d4, c4', { stem: 'down' })), beam(notes('c4/8, d4, e4, f4', { stem: 'down' }))].reduce(concat)),\n ];\n f.Formatter().joinVoices(voices).formatToStave(voices, stave);\n f.draw();\n ok(true, 'Multi Test');\n}\nfunction sixteenth(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave();\n const score = f.EasyScore();\n const voice = score.voice.bind(score);\n const beam = score.beam.bind(score);\n const notes = score.notes.bind(score);\n const voices = [\n voice([\n beam(notes('f5/16, f5, d5, c5', { stem: 'up' })),\n beam(notes('c5/16, d5, f5, e5', { stem: 'up' })),\n notes('f5/2', { stem: 'up' }),\n ].reduce(concat)),\n voice([\n beam(notes('f4/16, e4/16, d4/16, c4/16', { stem: 'down' })),\n beam(notes('c4/16, d4/16, f4/16, e4/16', { stem: 'down' })),\n notes('f4/2', { stem: 'down' }),\n ].reduce(concat)),\n ];\n f.Formatter().joinVoices(voices).formatToStave(voices, stave);\n f.draw();\n ok(true, 'Sixteenth Test');\n}\nfunction breakSecondaryBeams(options) {\n const f = VexFlowTests.makeFactory(options, 600, 200);\n const stave = f.Stave({ y: 20 });\n const score = f.EasyScore();\n const voice = score.voice.bind(score);\n const beam = score.beam.bind(score);\n const notes = score.notes.bind(score);\n const voices = [\n voice([\n beam(notes('f5/16., f5/32, c5/16., d5/32, c5/16., d5/32', { stem: 'up' }), { secondaryBeamBreaks: [1, 3] }),\n beam(notes('f5/16, e5, e5, e5, e5, e5', { stem: 'up' }), { secondaryBeamBreaks: [2] }),\n ].reduce(concat), { time: '3/4' }),\n voice([\n beam(notes('f4/32, d4, e4, c4, d4, c4, f4, d4, e4, c4, c4, d4', { stem: 'down' }), {\n secondaryBeamBreaks: [3, 7],\n }),\n beam(notes('d4/16, f4, d4, e4, e4, e4', { stem: 'down' }), { secondaryBeamBreaks: [3] }),\n ].reduce(concat), { time: '3/4' }),\n ];\n f.Formatter().joinVoices(voices).formatToStave(voices, stave);\n f.draw();\n ok(true, 'Breaking Secondary Beams Test');\n}\nfunction slopey(options) {\n const f = VexFlowTests.makeFactory(options, 350, 140);\n const stave = f.Stave({ y: 20 });\n const score = f.EasyScore();\n const beam = score.beam.bind(score);\n const notes = score.notes.bind(score);\n const voice = score.voice([\n beam(notes('c4/8, f4/8, d5/8, g5/8', { stem: 'up' })),\n beam(notes('d6/8, f5/8, d4/8, g3/8', { stem: 'up' })),\n ].reduce(concat));\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'Slopey Test');\n}\nfunction autoStem(options) {\n const f = VexFlowTests.makeFactory(options, 350, 140);\n const stave = f.Stave({ y: 20 });\n const score = f.EasyScore();\n const voice = score.voice(score.notes('a4/8, b4/8, g4/8, c5/8, f4/8, d5/8, e4/8, e5/8, b4/8, b4/8, g4/8, d5/8'), {\n time: '6/4',\n });\n const notes = voice.getTickables();\n const beams = [\n f.Beam({ notes: notes.slice(0, 2), options: { autoStem: true } }),\n f.Beam({ notes: notes.slice(2, 4), options: { autoStem: true } }),\n f.Beam({ notes: notes.slice(4, 6), options: { autoStem: true } }),\n f.Beam({ notes: notes.slice(6, 8), options: { autoStem: true } }),\n f.Beam({ notes: notes.slice(8, 10), options: { autoStem: true } }),\n f.Beam({ notes: notes.slice(10, 12), options: { autoStem: true } }),\n ];\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n const UP = Stem.UP;\n const DOWN = Stem.DOWN;\n equal(beams[0].getStemDirection(), UP);\n equal(beams[1].getStemDirection(), UP);\n equal(beams[2].getStemDirection(), UP);\n equal(beams[3].getStemDirection(), UP);\n equal(beams[4].getStemDirection(), DOWN);\n equal(beams[5].getStemDirection(), DOWN);\n f.draw();\n ok(true, 'AutoStem Beam Test');\n}\nfunction mixed(options) {\n const f = VexFlowTests.makeFactory(options, 350, 140);\n const stave = f.Stave({ y: 20 });\n const score = f.EasyScore();\n const voice1 = score.voice(score.notes('f5/8, d5/16, c5/16, c5/16, d5/16, e5/8, f5/8, d5/16, c5/16, c5/16, d5/16, e5/8', { stem: 'up' }));\n const voice2 = score.voice(score.notes('f4/16, e4/8, d4/16, c4/16, d4/8, f4/16, f4/16, e4/8, d4/16, c4/16, d4/8, f4/16', { stem: 'down' }));\n [\n [0, 4],\n [4, 8],\n [8, 12],\n ].forEach((range) => f.Beam({ notes: voice1.getTickables().slice(range[0], range[1]) }));\n [\n [0, 4],\n [4, 8],\n [8, 12],\n ].forEach((range) => f.Beam({ notes: voice2.getTickables().slice(range[0], range[1]) }));\n f.Formatter().joinVoices([voice1, voice2]).formatToStave([voice1, voice2], stave);\n f.draw();\n ok(true, 'Multi Test');\n}\nfunction mixed2(options) {\n const f = VexFlowTests.makeFactory(options, 450, 180);\n const stave = f.Stave({ y: 20 });\n const score = f.EasyScore();\n const voice = score.voice(score.notes('f5/32, d5/16, c5/32, c5/64, d5/128, e5/8, f5/16, d5/32, c5/64, c5/32, d5/16, e5/128', {\n stem: 'up',\n }), { time: '31/64' });\n const voice2 = score.voice(score.notes('f4/32, d4/16, c4/32, c4/64, d4/128, e4/8, f4/16, d4/32, c4/64, c4/32, d4/16, e4/128', {\n stem: 'down',\n }), { time: '31/64' });\n f.Beam({ notes: voice.getTickables().slice(0, 12) });\n f.Beam({ notes: voice2.getTickables().slice(0, 12) });\n f.Formatter().joinVoices([voice, voice2]).formatToStave([voice, voice2], stave);\n f.draw();\n ok(true, 'Multi Test');\n}\nfunction dotted(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave();\n const score = f.EasyScore();\n const voice = score.voice(score.notes('d4/8, b3/8., a3/16, a3/8, b3/8., c4/16, d4/8, b3/8, a3/8., a3/16, b3/8., c4/16', { stem: 'up' }), { time: '6/4' });\n const notes = voice.getTickables();\n f.Beam({ notes: notes.slice(0, 4) });\n f.Beam({ notes: notes.slice(4, 8) });\n f.Beam({ notes: notes.slice(8, 12) });\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'Dotted Test');\n}\nfunction partial(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave();\n const score = f.EasyScore();\n const voice = score.voice(score.notes('d4/8, b3/32, c4/16., d4/16., e4/8, c4/64, c4/32, a3/8., b3/32., c4/8, e4/64, b3/16., b3/64, f4/8, e4/8, g4/64, e4/8'), { time: '89/64' });\n const notes = voice.getTickables();\n f.Beam({ notes: notes.slice(0, 3) });\n f.Beam({ notes: notes.slice(3, 9) });\n f.Beam({ notes: notes.slice(9, 13) });\n f.Beam({ notes: notes.slice(13, 17) });\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'Partial Test');\n}\nfunction tradeoffs(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave();\n const score = f.EasyScore();\n const voice = score.voice(score.notes('a4/8, b4/8, c4/8, d4/8, g4/8, a4/8, b4/8, c4/8', { stem: 'up' }));\n const notes = voice.getTickables();\n f.Beam({ notes: notes.slice(0, 4) });\n f.Beam({ notes: notes.slice(4, 8) });\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'Close Trade-offs Test');\n}\nfunction insane(options) {\n const f = VexFlowTests.makeFactory(options, 450, 180);\n const stave = f.Stave({ y: 20 });\n const score = f.EasyScore();\n const voice = score.voice(score.notes('g4/8, g5/8, c4/8, b5/8, g4/8[stem=\"down\"], a5[stem=\"down\"], b4[stem=\"down\"], c4/8', { stem: 'up' }));\n const notes = voice.getTickables();\n f.Beam({ notes: notes.slice(0, 4) });\n f.Beam({ notes: notes.slice(4, 7) });\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'Insane Test');\n}\nfunction lenghty(options) {\n const f = VexFlowTests.makeFactory(options, 450, 180);\n const stave = f.Stave({ y: 20 });\n const score = f.EasyScore();\n const voice = score.voice(score.beam(score.notes('g4/8, g4, g4, a4', { stem: 'up' })), { time: '2/4' });\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'Lengthy Test');\n}\nfunction outlier(options) {\n const f = VexFlowTests.makeFactory(options, 450, 180);\n const stave = f.Stave({ y: 20 });\n const score = f.EasyScore();\n const voice = score.voice(score.notes([\n 'g4/8[stem=\"up\"], f4[stem=\"up\"], d5[stem=\"up\"], e4[stem=\"up\"]',\n 'd5/8[stem=\"down\"], d5[stem=\"down\"], c5[stem=\"down\"], d5[stem=\"down\"]',\n ].join()));\n const notes = voice.getTickables();\n f.Beam({ notes: notes.slice(0, 4) });\n f.Beam({ notes: notes.slice(4, 8) });\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave, { stave: stave });\n f.draw();\n ok(true, 'Outlier Test');\n}\nfunction tabBeamsUp(options) {\n const f = VexFlowTests.makeFactory(options, 600, 200);\n const stave = f.TabStave({ y: 20 });\n const specs = [\n {\n positions: [\n { str: 3, fret: 6 },\n { str: 4, fret: 25 },\n ],\n duration: '4',\n },\n {\n positions: [\n { str: 2, fret: 10 },\n { str: 5, fret: 12 },\n ],\n duration: '8',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '8',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '16',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '32',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '64',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '128',\n },\n { positions: [{ str: 3, fret: 6 }], duration: '8' },\n { positions: [{ str: 3, fret: 6 }], duration: '8' },\n { positions: [{ str: 3, fret: 6 }], duration: '8' },\n { positions: [{ str: 3, fret: 6 }], duration: '8' },\n ];\n const notes = specs.map((struct) => {\n const tabNote = f.TabNote(struct);\n tabNote.render_options.draw_stem = true;\n return tabNote;\n });\n f.Beam({ notes: notes.slice(1, 7) });\n f.Beam({ notes: notes.slice(8, 11) });\n f.Tuplet({ notes: notes.slice(8, 11), options: { ratioed: true } });\n const voice = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'All objects have been drawn');\n}\nfunction tabBeamsDown(options) {\n const f = VexFlowTests.makeFactory(options, 600, 250);\n const stave = f.TabStave({ options: { num_lines: 10 } });\n const specs = [\n {\n stem_direction: -1,\n positions: [\n { str: 3, fret: 6 },\n { str: 4, fret: 25 },\n ],\n duration: '4',\n },\n {\n stem_direction: -1,\n positions: [\n { str: 2, fret: 10 },\n { str: 5, fret: 12 },\n ],\n duration: '8dd',\n },\n {\n stem_direction: -1,\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '8',\n },\n {\n stem_direction: -1,\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '16',\n },\n {\n stem_direction: -1,\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '32',\n },\n {\n stem_direction: -1,\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '64',\n },\n {\n stem_direction: -1,\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '128',\n },\n { stem_direction: -1, positions: [{ str: 1, fret: 6 }], duration: '8' },\n { stem_direction: -1, positions: [{ str: 1, fret: 6 }], duration: '8' },\n { stem_direction: -1, positions: [{ str: 1, fret: 6 }], duration: '8' },\n { stem_direction: -1, positions: [{ str: 7, fret: 6 }], duration: '8' },\n { stem_direction: -1, positions: [{ str: 7, fret: 6 }], duration: '8' },\n { stem_direction: -1, positions: [{ str: 10, fret: 6 }], duration: '8' },\n { stem_direction: -1, positions: [{ str: 10, fret: 6 }], duration: '8' },\n ];\n const notes = specs.map((struct) => {\n const tabNote = f.TabNote(struct);\n tabNote.render_options.draw_stem = true;\n tabNote.render_options.draw_dots = true;\n return tabNote;\n });\n Dot.buildAndAttach([notes[1], notes[1]]);\n f.Beam({ notes: notes.slice(1, 7) });\n f.Beam({ notes: notes.slice(8, 11) });\n f.Tuplet({ notes: notes.slice(8, 11), options: { location: -1 } });\n f.Tuplet({ notes: notes.slice(11, 14), options: { location: -1 } });\n const voice = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'All objects have been drawn');\n}\nfunction autoTabBeams(options) {\n const f = VexFlowTests.makeFactory(options, 600, 200);\n const stave = f.TabStave();\n const specs = [\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '8',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '8',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '16',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '16',\n },\n { positions: [{ str: 1, fret: 6 }], duration: '32' },\n { positions: [{ str: 1, fret: 6 }], duration: '32' },\n { positions: [{ str: 1, fret: 6 }], duration: '32' },\n { positions: [{ str: 6, fret: 6 }], duration: '32' },\n { positions: [{ str: 6, fret: 6 }], duration: '16' },\n { positions: [{ str: 6, fret: 6 }], duration: '16' },\n { positions: [{ str: 6, fret: 6 }], duration: '16' },\n { positions: [{ str: 6, fret: 6 }], duration: '16' },\n ];\n const notes = specs.map((struct) => {\n const tabNote = f.TabNote(struct);\n tabNote.render_options.draw_stem = true;\n tabNote.render_options.draw_dots = true;\n return tabNote;\n });\n const voice = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes);\n const beams = Beam.applyAndGetBeams(voice, -1);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n beams.forEach((beam) => beam.setContext(f.getContext()).draw());\n ok(true, 'All objects have been drawn');\n}\n// This tests makes sure the auto_stem functionality is works.\n// TabNote stems within a beam group should end up normalized\nfunction tabBeamsAutoStem(options) {\n const f = VexFlowTests.makeFactory(options, 600, 300);\n const stave = f.TabStave();\n const specs = [\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '8',\n stem_direction: -1,\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '8',\n stem_direction: 1,\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '16',\n stem_direction: -1,\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '16',\n stem_direction: 1,\n },\n { positions: [{ str: 1, fret: 6 }], duration: '32', stem_direction: 1 },\n { positions: [{ str: 1, fret: 6 }], duration: '32', stem_direction: -1 },\n { positions: [{ str: 1, fret: 6 }], duration: '32', stem_direction: -1 },\n { positions: [{ str: 6, fret: 6 }], duration: '32', stem_direction: -1 },\n { positions: [{ str: 6, fret: 6 }], duration: '16', stem_direction: 1 },\n { positions: [{ str: 6, fret: 6 }], duration: '16', stem_direction: 1 },\n { positions: [{ str: 6, fret: 6 }], duration: '16', stem_direction: 1 },\n { positions: [{ str: 6, fret: 6 }], duration: '16', stem_direction: -1 },\n ];\n const notes = specs.map((struct) => {\n const tabNote = f.TabNote(struct);\n tabNote.render_options.draw_stem = true;\n tabNote.render_options.draw_dots = true;\n return tabNote;\n });\n // Stems should format down\n f.Beam({ notes: notes.slice(0, 8), options: { autoStem: true } });\n // Stems should format up\n f.Beam({ notes: notes.slice(8, 12), options: { autoStem: true } });\n const voice = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'All objects have been drawn');\n}\nfunction complexWithAnnotation(options) {\n const factory = VexFlowTests.makeFactory(options, 500, 200);\n const stave = factory.Stave({ y: 40 });\n const s1 = [\n { keys: ['e/4'], duration: '128', stem_direction: 1 },\n { keys: ['d/4'], duration: '16', stem_direction: 1 },\n { keys: ['e/4'], duration: '8', stem_direction: 1 },\n { keys: ['c/4', 'g/4'], duration: '32', stem_direction: 1 },\n { keys: ['c/4'], duration: '32', stem_direction: 1 },\n { keys: ['c/4'], duration: '32', stem_direction: 1 },\n { keys: ['c/4'], duration: '32', stem_direction: 1 },\n ];\n const s2 = [\n { keys: ['e/5'], duration: '128', stem_direction: -1 },\n { keys: ['d/5'], duration: '16', stem_direction: -1 },\n { keys: ['e/5'], duration: '8', stem_direction: -1 },\n { keys: ['c/5', 'g/5'], duration: '32', stem_direction: -1 },\n { keys: ['c/5'], duration: '32', stem_direction: -1 },\n { keys: ['c/5'], duration: '32', stem_direction: -1 },\n { keys: ['c/5'], duration: '32', stem_direction: -1 },\n ];\n const font = {\n family: Font.SERIF,\n size: 14,\n weight: FontWeight.BOLD,\n style: FontStyle.ITALIC,\n };\n const notes1 = s1.map((struct) => factory\n .StaveNote(struct) //\n .addModifier(factory.Annotation({ text: '1', vJustify: AnnotationVerticalJustify.TOP, font }), 0));\n const notes2 = s2.map((struct) => factory\n .StaveNote(struct) //\n .addModifier(factory.Annotation({ text: '3', vJustify: AnnotationVerticalJustify.BOTTOM, font }), 0));\n factory.Beam({ notes: notes1 });\n factory.Beam({ notes: notes2 });\n const voice = factory.Voice().setMode(Voice.Mode.SOFT).addTickables(notes1).addTickables(notes2);\n factory.Formatter().joinVoices([voice]).formatToStave([voice], stave, { stave: stave });\n factory.draw();\n ok(true, 'Complex beam annotations');\n}\nfunction complexWithArticulation(options) {\n const f = VexFlowTests.makeFactory(options, 500, 200);\n const stave = f.Stave({ y: 40 });\n const s1 = [\n { keys: ['e/4'], duration: '128', stem_direction: 1 },\n { keys: ['d/4'], duration: '16', stem_direction: 1 },\n { keys: ['e/4'], duration: '8', stem_direction: 1 },\n { keys: ['c/4', 'g/4'], duration: '32', stem_direction: 1 },\n { keys: ['c/4'], duration: '32', stem_direction: 1 },\n { keys: ['c/4'], duration: '32', stem_direction: 1 },\n { keys: ['c/4'], duration: '32', stem_direction: 1 },\n ];\n const s2 = [\n { keys: ['e/5'], duration: '128', stem_direction: -1 },\n { keys: ['d/5'], duration: '16', stem_direction: -1 },\n { keys: ['e/5'], duration: '8', stem_direction: -1 },\n { keys: ['c/5', 'g/5'], duration: '32', stem_direction: -1 },\n { keys: ['c/5'], duration: '32', stem_direction: -1 },\n { keys: ['c/5'], duration: '32', stem_direction: -1 },\n { keys: ['c/5'], duration: '32', stem_direction: -1 },\n ];\n const notes1 = s1.map((struct) => f.StaveNote(struct).addModifier(f.Articulation({ type: 'am', position: 'above' }), 0));\n const notes2 = s2.map((struct) => f.StaveNote(struct).addModifier(f.Articulation({ type: 'a>', position: 'below' }), 0));\n f.Beam({ notes: notes1 });\n f.Beam({ notes: notes2 });\n const voice = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes1).addTickables(notes2);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave, { stave: stave });\n f.draw();\n ok(true, 'Complex beam articulations');\n}\nVexFlowTests.register(BeamTests);\nexport { BeamTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Bend Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Bend } from '../src/bend';\nimport { Font } from '../src/font';\nimport { Formatter } from '../src/formatter';\nimport { ModifierContext } from '../src/modifiercontext';\nimport { Note } from '../src/note';\nimport { TabNote } from '../src/tabnote';\nimport { TabStave } from '../src/tabstave';\nimport { TickContext } from '../src/tickcontext';\nconst BendTests = {\n Start() {\n QUnit.module('Bend');\n const run = VexFlowTests.runTests;\n run('Double Bends', doubleBends);\n run('Reverse Bends', reverseBends);\n run('Bend Phrase', bendPhrase);\n run('Double Bends With Release', doubleBendsWithRelease);\n run('Whako Bend', whackoBends);\n // TODO: Rename 'Whako Bend' => 'Whacko'\n },\n};\n// Helper functions for creating TabNote and Bend objects.\nconst note = (noteStruct) => new TabNote(noteStruct);\nconst bendWithText = (text, release = false) => new Bend(text, release);\nconst bendWithPhrase = (phrase) => new Bend('', false, phrase);\n/**\n * Bend two strings at a time.\n */\nfunction doubleBends(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 500, 240);\n ctx.scale(1.5, 1.5);\n ctx.fillStyle = '#221';\n ctx.strokeStyle = '#221';\n ctx.font = '10pt Arial';\n const stave = new TabStave(10, 10, 450).addTabGlyph().setContext(ctx).draw();\n const notes = [\n note({\n positions: [\n { str: 2, fret: 10 },\n { str: 4, fret: 9 },\n ],\n duration: 'q',\n })\n .addModifier(bendWithText('Full'), 0)\n .addModifier(bendWithText('1/2'), 1),\n note({\n positions: [\n { str: 2, fret: 5 },\n { str: 3, fret: 5 },\n ],\n duration: 'q',\n })\n .addModifier(bendWithText('1/4'), 0)\n .addModifier(bendWithText('1/4'), 1),\n // This note is not visible because it is pushed off to the right by the ctx.scale(1.5, 1.5) at the top.\n note({\n positions: [{ str: 4, fret: 7 }],\n duration: 'h',\n }),\n ];\n Formatter.FormatAndDraw(ctx, stave, notes);\n notes.forEach((note) => Note.plotMetrics(ctx, note, 140));\n ok(true, 'Double Bends');\n}\nfunction doubleBendsWithRelease(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 550, 240);\n ctx.scale(1.0, 1.0);\n ctx.setBackgroundFillStyle('#FFF');\n ctx.setFont('Arial', VexFlowTests.Font.size);\n const stave = new TabStave(10, 10, 550).addTabGlyph().setContext(ctx).draw();\n const notes = [\n note({\n positions: [\n { str: 1, fret: 10 },\n { str: 4, fret: 9 },\n ],\n duration: 'q',\n })\n .addModifier(bendWithText('1/2', true), 0)\n .addModifier(bendWithText('Full', true), 1),\n note({\n positions: [\n { str: 2, fret: 5 },\n { str: 3, fret: 5 },\n { str: 4, fret: 5 },\n ],\n duration: 'q',\n })\n .addModifier(bendWithText('1/4', true), 0)\n .addModifier(bendWithText('Monstrous', true), 1)\n .addModifier(bendWithText('1/4', true), 2),\n note({\n positions: [{ str: 4, fret: 7 }],\n duration: 'q',\n }),\n note({\n positions: [{ str: 4, fret: 7 }],\n duration: 'q',\n }),\n ];\n Formatter.FormatAndDraw(ctx, stave, notes);\n notes.forEach((note) => Note.plotMetrics(ctx, note, 140));\n ok(true, 'Bend Release');\n}\n/**\n * Add the bend for note 1 before adding the bend for note 0,\n * by swapping the two indexes in .addModifier(modifier, index).\n * As a result, the bend curves intersect.\n */\nfunction reverseBends(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 500, 240);\n ctx.scale(1.5, 1.5);\n ctx.fillStyle = '#221';\n ctx.strokeStyle = '#221';\n ctx.setFont('10pt Arial');\n const stave = new TabStave(10, 10, 450).addTabGlyph().setContext(ctx).draw();\n const notes = [\n note({\n positions: [\n { str: 2, fret: 10 },\n { str: 4, fret: 9 },\n ],\n duration: 'w',\n })\n .addModifier(bendWithText('Full'), 1)\n .addModifier(bendWithText('1/2'), 0),\n note({\n positions: [\n { str: 2, fret: 5 },\n { str: 3, fret: 5 },\n ],\n duration: 'w',\n })\n .addModifier(bendWithText('1/4'), 1)\n .addModifier(bendWithText('1/4'), 0),\n note({\n positions: [{ str: 4, fret: 7 }],\n duration: 'w',\n }),\n ];\n for (let i = 0; i < notes.length; ++i) {\n const note = notes[i];\n const mc = new ModifierContext();\n note.addToModifierContext(mc);\n const tickContext = new TickContext();\n tickContext\n .addTickable(note)\n .preFormat()\n .setX(75 * i);\n note.setStave(stave).setContext(ctx).draw();\n Note.plotMetrics(ctx, note, 140);\n ok(true, 'Bend ' + i);\n }\n}\nfunction bendPhrase(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 500, 240);\n ctx.scale(1.5, 1.5);\n ctx.fillStyle = '#221';\n ctx.strokeStyle = '#221';\n ctx.font = Font.SIZE + 'pt ' + Font.SANS_SERIF; // Optionally use constants defined in Font.\n const stave = new TabStave(10, 10, 450).addTabGlyph().setContext(ctx).draw();\n const phrase1 = [\n { type: Bend.UP, text: 'Full' },\n { type: Bend.DOWN, text: 'Monstrous' },\n { type: Bend.UP, text: '1/2' },\n { type: Bend.DOWN, text: '' },\n ];\n const bend1 = bendWithPhrase(phrase1).setContext(ctx);\n const notes = [\n note({\n positions: [{ str: 2, fret: 10 }],\n duration: 'w',\n }).addModifier(bend1, 0),\n ];\n for (let i = 0; i < notes.length; ++i) {\n const note = notes[i];\n note.addToModifierContext(new ModifierContext());\n const tickContext = new TickContext();\n tickContext\n .addTickable(note)\n .preFormat()\n .setX(75 * i);\n note.setStave(stave).setContext(ctx).draw();\n Note.plotMetrics(ctx, note, 140);\n ok(true, 'Bend ' + i);\n }\n}\nfunction whackoBends(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 400, 240);\n ctx.scale(1.0, 1.0);\n ctx.setBackgroundFillStyle('#FFF');\n ctx.setFont('Arial', VexFlowTests.Font.size);\n const stave = new TabStave(10, 10, 350).addTabGlyph().setContext(ctx).draw();\n const phrase1 = [\n { type: Bend.UP, text: 'Full' },\n { type: Bend.DOWN, text: '' },\n { type: Bend.UP, text: '1/2' },\n { type: Bend.DOWN, text: '' },\n ];\n const phrase2 = [\n { type: Bend.UP, text: 'Full' },\n { type: Bend.UP, text: 'Full' },\n { type: Bend.UP, text: '1/2' },\n { type: Bend.DOWN, text: '' },\n { type: Bend.DOWN, text: 'Full' },\n { type: Bend.DOWN, text: 'Full' },\n { type: Bend.UP, text: '1/2' },\n { type: Bend.DOWN, text: '' },\n ];\n const notes = [\n note({\n positions: [\n { str: 2, fret: 10 },\n { str: 3, fret: 9 },\n ],\n duration: 'q',\n })\n .addModifier(bendWithPhrase(phrase1), 0)\n .addModifier(bendWithPhrase(phrase2), 1),\n ];\n Formatter.FormatAndDraw(ctx, stave, notes);\n Note.plotMetrics(ctx, notes[0], 140);\n ok(true, 'Whacko Bend & Release');\n}\nVexFlowTests.register(BendTests);\nexport { BendTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Bounding Box Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { BoundingBox } from '../src/index';\nconst BoundingBoxTests = {\n Start() {\n QUnit.module('BoundingBox');\n test('Initialization Test', initialization);\n test('Merging Text', merging);\n },\n};\nfunction initialization() {\n const bb = new BoundingBox(4, 5, 6, 7);\n equal(bb.getX(), 4, 'Bad X');\n equal(bb.getY(), 5, 'Bad Y');\n equal(bb.getW(), 6, 'Bad W');\n equal(bb.getH(), 7, 'Bad H');\n bb.setX(5);\n equal(bb.getX(), 5, 'Bad X');\n}\nfunction merging() {\n const tests = [\n {\n type: 'Intersection',\n bb1: new BoundingBox(10, 10, 10, 10),\n bb2: new BoundingBox(15, 20, 10, 10),\n merged: new BoundingBox(10, 10, 15, 20),\n },\n {\n type: '1 contains 2',\n bb1: new BoundingBox(10, 10, 30, 30),\n bb2: new BoundingBox(15, 15, 10, 10),\n merged: new BoundingBox(10, 10, 30, 30),\n },\n {\n type: '2 contains 1',\n bb1: new BoundingBox(15, 15, 10, 10),\n bb2: new BoundingBox(10, 10, 30, 30),\n merged: new BoundingBox(10, 10, 30, 30),\n },\n ];\n tests.forEach((test) => {\n const type = test.type;\n const bb1 = test.bb1;\n const bb2 = test.bb2;\n const merged = test.merged;\n bb1.mergeWith(bb2);\n equal(bb1.getX(), merged.getX(), type + ' - Bad X');\n equal(bb1.getY(), merged.getY(), type + ' - Bad Y');\n equal(bb1.getW(), merged.getW(), type + ' - Bad W');\n equal(bb1.getH(), merged.getH(), type + ' - Bad H');\n });\n}\nVexFlowTests.register(BoundingBoxTests);\nexport { BoundingBoxTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// BoundingBoxComputation Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { BoundingBoxComputation, Glyph, OutlineCode } from '../src/index';\nconst BoundingBoxComputationTests = {\n Start() {\n QUnit.module('BoundingBoxComputation');\n test('Point Test', point);\n const run = VexFlowTests.runTests;\n quadraticParams.forEach((params, index) => {\n run(`Quadratic Test ${index}`, quadratic, params);\n });\n cubicParams.forEach((params, index) => {\n run(`Cubic Test ${index}`, cubic, params);\n });\n },\n};\nfunction point() {\n const bboxComp = new BoundingBoxComputation();\n bboxComp.addPoint(2, 3);\n equal(bboxComp.getX1(), 2, 'Bad X1');\n equal(bboxComp.getY1(), 3, 'Bad Y1');\n equal(bboxComp.width(), 0, 'Bad width');\n equal(bboxComp.height(), 0, 'Bad height');\n bboxComp.addPoint(-5, 7);\n equal(bboxComp.getX1(), -5, 'Bad X1');\n equal(bboxComp.getY1(), 3, 'Bad Y1');\n equal(bboxComp.width(), 7, 'Bad width');\n equal(bboxComp.height(), 4, 'Bad height');\n}\n/**\n * Size the context to fit all the points and a small margin.\n */\nfunction createContext(options) {\n const points = options.params.points;\n let w = points[0];\n let h = points[1];\n for (let i = 2; i < points.length; i += 2) {\n w = Math.max(w, points[i]);\n h = Math.max(h, points[i + 1]);\n }\n const f = VexFlowTests.makeFactory(options, w + 20, h + 20);\n const ctx = f.getContext();\n ctx.setLineCap('square');\n return ctx;\n}\n/**\n * Draw a rectangle on the RenderContext.\n */\nfunction rect(ctx, style, lineWidth, x, y, w, h) {\n ctx.strokeStyle = style;\n ctx.setLineWidth(lineWidth);\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(x + w, y);\n ctx.lineTo(x + w, y + h);\n ctx.lineTo(x, y + h);\n ctx.lineTo(x, y);\n ctx.stroke();\n}\n// Each test consists of the control points for a single curve and its expected bounding box.\nconst quadraticParams = [\n {\n points: [10, 10, 100, 20, 110, 110],\n box: [10, 10, 100, 100],\n },\n {\n points: [110, 10, 60, 110, 10, 20],\n box: [10, 10, 100, 52.63],\n },\n {\n points: [10, 10, 30, 20, 50, 30],\n box: [10, 10, 40, 20],\n },\n {\n points: [100, 30, 30, 110, 20, 30],\n box: [20, 30, 80, 40],\n },\n];\n/**\n *\n */\nfunction quadratic(options) {\n const points = options.params.points;\n const box = options.params.box;\n const ctx = createContext(options);\n const [x0, y0, x1, y1, x2, y2] = points;\n // Draw expected bounding box.\n let [bx, by, bw, bh] = box;\n rect(ctx, '#0f0', 5, bx, by, bw, bh);\n // Compute the bounding box.\n const bboxComp = new BoundingBoxComputation();\n bboxComp.addQuadraticCurve(x0, y0, x1, y1, x2, y2);\n // Draw computed bounding box.\n [bx, by, bw, bh] = [bboxComp.getX1(), bboxComp.getY1(), bboxComp.width(), bboxComp.height()];\n rect(ctx, '#00f', 3, bx, by, bw, bh);\n // Regression test for a prior bug: compute the bounding box again,\n // this time using the Glyph.getOutlineBoundingBox code path.\n const o = [OutlineCode.MOVE, x0, -y0, OutlineCode.QUADRATIC, x2, -y2, x1, -y1];\n const bbox = Glyph.getOutlineBoundingBox(o, 1, 0, 0);\n rect(ctx, '#fa0', 1, bbox.getX(), bbox.getY(), bbox.getW(), bbox.getH());\n // Draw curve.\n ctx.setLineWidth(1);\n ctx.fillStyle = '#000';\n Glyph.renderOutline(ctx, o, 1, 0, 0);\n // Draw control points.\n ctx.strokeStyle = '#f00';\n ctx.beginPath();\n ctx.moveTo(x0, y0);\n ctx.lineTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n // Check the expected and computed bounding boxes are close enough.\n ok(Math.abs(bboxComp.getX1() - box[0]) < 0.01, `Bad X1: ${bboxComp.getX1()}`);\n ok(Math.abs(bboxComp.getY1() - box[1]) < 0.01, `Bad Y1: ${bboxComp.getY1()}`);\n ok(Math.abs(bboxComp.width() - box[2]) < 0.01, `Bad width: ${bboxComp.width()}`);\n ok(Math.abs(bboxComp.height() - box[3]) < 0.01, `Bad height: ${bboxComp.height()}`);\n ok(Math.abs(bbox.getX() - box[0]) < 0.01, `Bad X: ${bbox.getX()}`);\n ok(Math.abs(bbox.getY() - box[1]) < 0.01, `Bad Y: ${bbox.getY()}`);\n ok(Math.abs(bbox.getW() - box[2]) < 0.01, `Bad W: ${bbox.getW()}`);\n ok(Math.abs(bbox.getH() - box[3]) < 0.01, `Bad H: ${bbox.getH()}`);\n}\n// Each test consists of the control points for a single curve and its expected bounding box.\nconst cubicParams = [\n {\n points: [10, 10, 60, 20, 100, 60, 110, 110],\n box: [10, 10, 100, 100],\n },\n {\n points: [10, 10, 35, 110, 85, 110, 110, 10],\n box: [10, 10, 100, 75],\n },\n {\n points: [10, 110, 90, 10, 30, 10, 110, 110],\n box: [10, 35, 100, 75],\n },\n {\n points: [10, 10, 110, 110, 110, 10, 10, 110],\n box: [10, 10, 75, 100],\n },\n {\n points: [10, 10, 130, 110, -10, 110, 110, 10],\n box: [10, 10, 100, 75],\n },\n {\n points: [50, 10, 10, 110, 110, 110, 74, 10],\n box: [40.38, 10, 41.59, 75],\n },\n {\n points: [10, 30, 35, 60, 110, 110, 60, 10],\n box: [10, 10, 66.82, 59.37],\n },\n {\n points: [210, 70, 10, 10, 190, 10, 120, 90],\n box: [112.02, 27.23, 97.98, 62.77],\n },\n {\n points: [20, 10, 210, 90, 10, 90, 100, 38],\n box: [20, 10, 85.33, 64.06],\n },\n {\n points: [60, 14, 10, 14, 90, 14, 70, 14],\n box: [43.28, 14, 30.01, 0],\n },\n {\n points: [10, 60, 20, 100, 100, 20, 110, 60],\n box: [10, 48.45, 100, 23.1],\n },\n];\nfunction cubic(options) {\n const points = options.params.points;\n const box = options.params.box;\n const ctx = createContext(options);\n const [x0, y0, x1, y1, x2, y2, x3, y3] = points;\n // Draw expected bounding box.\n let [bx, by, bw, bh] = box;\n rect(ctx, '#0f0', 5, bx, by, bw, bh);\n // Compute the bounding box.\n const bboxComp = new BoundingBoxComputation();\n bboxComp.addBezierCurve(x0, y0, x1, y1, x2, y2, x3, y3);\n // Draw computed bounding box.\n [bx, by, bw, bh] = [bboxComp.getX1(), bboxComp.getY1(), bboxComp.width(), bboxComp.height()];\n rect(ctx, '#00f', 3, bx, by, bw, bh);\n // Regression test for a prior bug: compute the bounding box again,\n // this time using the Glyph.getOutlineBoundingBox code path.\n const o = [OutlineCode.MOVE, x0, -y0, OutlineCode.BEZIER, x3, -y3, x1, -y1, x2, -y2];\n const bbox = Glyph.getOutlineBoundingBox(o, 1, 0, 0);\n rect(ctx, '#fa0', 1, bbox.getX(), bbox.getY(), bbox.getW(), bbox.getH());\n // Draw curve.\n ctx.setLineWidth(1);\n ctx.fillStyle = '#000';\n Glyph.renderOutline(ctx, o, 1, 0, 0);\n // Draw control points.\n ctx.strokeStyle = '#f00';\n ctx.beginPath();\n ctx.moveTo(x0, y0);\n ctx.lineTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.lineTo(x3, y3);\n ctx.stroke();\n // Check the expected and computed bounding boxes are close enough.\n ok(Math.abs(bboxComp.getX1() - box[0]) < 0.01, `Bad X1: ${bboxComp.getX1()}`);\n ok(Math.abs(bboxComp.getY1() - box[1]) < 0.01, `Bad Y1: ${bboxComp.getY1()}`);\n ok(Math.abs(bboxComp.width() - box[2]) < 0.01, `Bad width: ${bboxComp.width()}`);\n ok(Math.abs(bboxComp.height() - box[3]) < 0.01, `Bad height: ${bboxComp.height()}`);\n ok(Math.abs(bbox.getX() - box[0]) < 0.01, `Bad X: ${bbox.getX()}`);\n ok(Math.abs(bbox.getY() - box[1]) < 0.01, `Bad Y: ${bbox.getY()}`);\n ok(Math.abs(bbox.getW() - box[2]) < 0.01, `Bad W: ${bbox.getW()}`);\n ok(Math.abs(bbox.getH() - box[3]) < 0.01, `Bad H: ${bbox.getH()}`);\n}\nVexFlowTests.register(BoundingBoxComputationTests);\nexport { BoundingBoxComputationTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// ChordSymbol Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Accidental } from '../src/accidental';\nimport { ChordSymbol } from '../src/chordsymbol';\nimport { Formatter } from '../src/formatter';\nimport { Stave } from '../src/stave';\nimport { StaveNote } from '../src/stavenote';\nconst ChordSymbolTests = {\n Start() {\n QUnit.module('ChordSymbol');\n const run = VexFlowTests.runTests;\n run('Chord Symbol Font Size Tests', fontSize);\n run('Chord Symbol Kerning Tests', kern);\n run('Top Chord Symbols', top);\n run('Top Chord Symbols Justified', topJustify);\n run('Bottom Chord Symbols', bottom);\n run('Bottom Stem Down Chord Symbols', bottomStemDown);\n run('Double Bottom Chord Symbols', doubleBottom);\n },\n};\n// Options for customizing addGlyphOrText() or addGlyph().\nconst superscript = { symbolModifier: ChordSymbol.symbolModifiers.SUPERSCRIPT };\nconst subscript = { symbolModifier: ChordSymbol.symbolModifiers.SUBSCRIPT };\n// Helper function for creating StaveNotes.\nconst note = (factory, keys, duration, chordSymbol) => factory.StaveNote({ keys, duration }).addModifier(chordSymbol, 0);\nfunction fontSize(options) {\n const f = VexFlowTests.makeFactory(options, 750, 580);\n const ctx = f.getContext();\n ctx.scale(1.5, 1.5);\n ctx.fillStyle = '#221';\n ctx.strokeStyle = '#221';\n function draw(chords, y) {\n const stave = f.Stave({ x: 10, y, width: 450 }).addClef('treble');\n const notes = [\n note(f, ['c/4'], 'q', chords[0]),\n note(f, ['c/4'], 'q', chords[1]),\n note(f, ['c/4'], 'q', chords[2]),\n note(f, ['c/4'], 'q', chords[3]),\n ];\n const score = f.EasyScore();\n const voice = score.voice(notes, { time: '4/4' });\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n }\n let chords = [];\n chords.push(f\n .ChordSymbol({ fontSize: 10 })\n .addText('F7')\n .addGlyph('leftParenTall')\n .addGlyphOrText('b9', superscript)\n .addGlyphOrText('#11', subscript)\n .addGlyph('rightParenTall')\n .setReportWidth(false));\n chords.push(f\n .ChordSymbol({ fontSize: 12 })\n .addText('F7')\n .addGlyphOrText('b9', superscript)\n .addGlyphOrText('#11', subscript)\n .setReportWidth(false));\n chords.push(f\n .ChordSymbol({ fontSize: 14 })\n .addText('F7')\n .addGlyph('leftParenTall')\n .addGlyphOrText('add 3', superscript)\n .addGlyphOrText('omit 9', subscript)\n .addGlyph('rightParenTall')\n .setReportWidth(false));\n chords.push(f\n .ChordSymbol({ fontSize: 16 })\n .addText('F7')\n .addGlyph('leftParenTall')\n .addGlyphOrText('b9', superscript)\n .addGlyphOrText('#11', subscript)\n .addGlyph('rightParenTall')\n .setReportWidth(false));\n draw(chords, 40);\n chords = [];\n chords.push(f\n .ChordSymbol({ fontSize: 10 })\n .setFontSize(10)\n .addText('F7')\n .addGlyphOrText('#11', superscript)\n .addGlyphOrText('b9', subscript));\n chords.push(f.ChordSymbol({ fontSize: 12 }).addText('F7').addGlyphOrText('#11', superscript).addGlyphOrText('b9', subscript));\n chords.push(f.ChordSymbol({ fontSize: 14 }).addText('F7').addGlyphOrText('#11', superscript).addGlyphOrText('b9', subscript));\n chords.push(f\n .ChordSymbol({ fontSize: 16 })\n .setFontSize(16)\n .addText('F7')\n .addGlyphOrText('#11', superscript)\n .addGlyphOrText('b9', subscript));\n draw(chords, 140);\n chords = [\n f.ChordSymbol({ fontSize: 10 }).addGlyphOrText('Ab').addGlyphOrText('7(#11b9)', superscript),\n f.ChordSymbol({ fontSize: 14 }).addGlyphOrText('C#').addGlyphOrText('7(#11b9)', superscript),\n f.ChordSymbol({ fontSize: 16 }).addGlyphOrText('Ab').addGlyphOrText('7(#11b9)', superscript),\n f.ChordSymbol({ fontSize: 18 }).addGlyphOrText('C#').addGlyphOrText('7(#11b9)', superscript),\n ];\n draw(chords, 240);\n ok(true, 'Font Size Chord Symbol');\n}\nfunction kern(options) {\n const f = VexFlowTests.makeFactory(options, 650, 650);\n const ctx = f.getContext();\n ctx.scale(1.5, 1.5);\n ctx.fillStyle = '#221';\n ctx.strokeStyle = '#221';\n function draw(chords, y) {\n const stave = f.Stave({ x: 10, y, width: 450 }).addClef('treble').setContext(ctx).draw();\n const notes = [\n note(f, ['C/4'], 'q', chords[0]),\n note(f, ['C/4'], 'q', chords[1]),\n note(f, ['C/4'], 'q', chords[2]),\n note(f, ['C/4'], 'q', chords[3]),\n ];\n const score = f.EasyScore();\n const voice = score.voice(notes, { time: '4/4' });\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n }\n let chords = [\n f.ChordSymbol().addText('A').addGlyphSuperscript('dim').setReportWidth(false),\n f.ChordSymbol({ kerning: false, reportWidth: false }).addText('A').addGlyphSuperscript('dim'),\n f.ChordSymbol({ hJustify: 'left', reportWidth: false }).addText('C').addGlyph('halfDiminished', superscript),\n f.ChordSymbol({ reportWidth: false }).addText('D').addGlyph('halfDiminished', superscript),\n ];\n draw(chords, 10);\n chords = [\n f.ChordSymbol().addText('A').addGlyphSuperscript('dim'),\n f.ChordSymbol({ kerning: false }).addText('A').addGlyphSuperscript('dim'),\n f.ChordSymbol().addText('A').addGlyphSuperscript('+').addTextSuperscript('5'),\n f.ChordSymbol().addText('G').addGlyphSuperscript('+').addTextSuperscript('5'),\n ];\n draw(chords, 110);\n chords = [\n f.ChordSymbol().addText('A').addGlyph('-'),\n f.ChordSymbol().addText('E').addGlyph('-'),\n f.ChordSymbol().addText('A').addGlyphOrText('(#11)', superscript),\n f.ChordSymbol().addText('E').addGlyphOrText('(#9)', superscript),\n ];\n draw(chords, 210);\n chords = [\n f.ChordSymbol().addGlyphOrText('F/B').addGlyphOrText('b', superscript),\n f.ChordSymbol().addText('E').addGlyphOrText('V/V'),\n f.ChordSymbol().addText('A').addGlyphOrText('(#11)', superscript),\n f.ChordSymbol().addText('E').addGlyphOrText('(#9)', superscript),\n ];\n draw(chords, 310);\n ok(true, 'Chord Symbol Kerning Tests');\n}\nfunction top(options) {\n const f = VexFlowTests.makeFactory(options, 650, 650);\n const ctx = f.getContext();\n ctx.scale(1.5, 1.5);\n ctx.fillStyle = '#221';\n ctx.strokeStyle = '#221';\n function draw(c1, c2, y) {\n const stave = f.Stave({ x: 10, y, width: 450 }).addClef('treble').setContext(ctx).draw();\n const notes = [\n note(f, ['e/4', 'a/4', 'd/5'], 'h', c1).addModifier(new Accidental('b'), 0),\n note(f, ['c/4', 'e/4', 'b/4'], 'h', c2),\n ];\n const score = f.EasyScore();\n const voice = score.voice(notes, { time: '4/4' });\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n }\n let chord1 = f\n .ChordSymbol({ reportWidth: false })\n .addText('F7')\n .setHorizontal('left')\n .addGlyphOrText('(#11b9)', superscript);\n let chord2 = f\n .ChordSymbol({ reportWidth: false })\n .addText('C')\n .setHorizontal('left')\n .addGlyphSuperscript('majorSeventh');\n draw(chord1, chord2, 40);\n chord1 = f\n .ChordSymbol()\n .addText('F7')\n .addTextSuperscript('(')\n .addGlyphOrText('#11b9', superscript)\n .addTextSuperscript(')');\n chord2 = f.ChordSymbol().addText('C').setHorizontal('left').addTextSuperscript('Maj.');\n draw(chord1, chord2, 140);\n chord1 = f\n .ChordSymbol()\n .addText('F7')\n .setHorizontal('left')\n .addGlyphOrText('#11', superscript)\n .addGlyphOrText('b9', subscript);\n chord2 = f.ChordSymbol().addText('C').addTextSuperscript('sus4');\n draw(chord1, chord2, 240);\n ok(true, 'Top Chord Symbol');\n}\nfunction topJustify(options) {\n const f = VexFlowTests.makeFactory(options, 500, 680);\n const ctx = f.getContext();\n ctx.scale(1.5, 1.5);\n ctx.fillStyle = '#221';\n ctx.strokeStyle = '#221';\n function draw(chord1, chord2, y) {\n const stave = new Stave(10, y, 450).addClef('treble').setContext(ctx).draw();\n const notes = [\n note(f, ['e/4', 'a/4', 'd/5'], 'h', chord1).addModifier(new Accidental('b'), 0),\n note(f, ['c/4', 'e/4', 'B/4'], 'h', chord2),\n ];\n Formatter.FormatAndDraw(ctx, stave, notes);\n }\n let chord1 = f.ChordSymbol().addText('F7').setHorizontal('left').addGlyphOrText('(#11b9)', superscript);\n let chord2 = f.ChordSymbol({ hJustify: 'left' }).addText('C').addGlyphSuperscript('majorSeventh');\n draw(chord1, chord2, 40);\n chord1 = f\n .ChordSymbol({ hJustify: 'center' })\n .addText('F7')\n .setHorizontal('left')\n .addGlyphOrText('(#11b9)', superscript);\n chord2 = f.ChordSymbol({ hJustify: 'center' }).addText('C').addTextSuperscript('Maj.');\n draw(chord1, chord2, 140);\n chord1 = f\n .ChordSymbol({ hJustify: 'right' })\n .addText('F7')\n .setHorizontal('left')\n .addGlyphOrText('#11', superscript)\n .addGlyphOrText('b9', subscript);\n chord2 = f.ChordSymbol({ hJustify: 'right' }).addText('C').addTextSuperscript('Maj.');\n draw(chord1, chord2, 240);\n chord1 = f\n .ChordSymbol({ hJustify: 'left' })\n .addText('F7')\n .setHorizontal('left')\n .addGlyphOrText('#11', superscript)\n .addGlyphOrText('b9', subscript);\n chord2 = f.ChordSymbol({ hJustify: 'centerStem' }).addText('C').addTextSuperscript('Maj.');\n draw(chord1, chord2, 340);\n ok(true, 'Top Chord Justified');\n}\nfunction bottom(options) {\n const f = VexFlowTests.makeFactory(options, 600, 230);\n const ctx = f.getContext();\n ctx.scale(1.5, 1.5);\n ctx.fillStyle = '#221';\n ctx.strokeStyle = '#221';\n function draw(chords, y) {\n const stave = new Stave(10, y, 400).addClef('treble').setContext(ctx).draw();\n const notes = [\n note(f, ['c/4', 'f/4', 'a/4'], 'q', chords[0]),\n note(f, ['c/4', 'e/4', 'b/4'], 'q', chords[1]).addModifier(new Accidental('b'), 2),\n note(f, ['c/4', 'e/4', 'g/4'], 'q', chords[2]),\n note(f, ['c/4', 'f/4', 'a/4'], 'q', chords[3]).addModifier(new Accidental('#'), 1),\n ];\n Formatter.FormatAndDraw(ctx, stave, notes);\n }\n const chords = [\n f.ChordSymbol({ vJustify: 'bottom' }).addText('I').addTextSuperscript('6').addTextSubscript('4'),\n f.ChordSymbol({ vJustify: 'bottom' }).addGlyphOrText('V'),\n f.ChordSymbol({ vJustify: 'bottom' }).addLine(12),\n f.ChordSymbol({ vJustify: 'bottom' }).addGlyphOrText('V/V'),\n ];\n draw(chords, 10);\n ok(true, 'Bottom Chord Symbol');\n}\nfunction bottomStemDown(options) {\n const f = VexFlowTests.makeFactory(options, 600, 330);\n const ctx = f.getContext();\n ctx.scale(1.5, 1.5);\n ctx.fillStyle = '#221';\n ctx.strokeStyle = '#221';\n function draw(chords, y) {\n // Helper function to create a StaveNote with a ChordSymbol and the stem pointing down.\n const note = (keys, duration, chordSymbol) => new StaveNote({ keys, duration, stem_direction: -1 }).addModifier(chordSymbol, 0);\n const stave = new Stave(10, y, 400).addClef('treble').setContext(ctx).draw();\n const notes = [\n note(['c/4', 'f/4', 'a/4'], 'q', chords[0]),\n note(['c/4', 'e/4', 'b/4'], 'q', chords[1]).addModifier(new Accidental('b'), 2),\n note(['c/4', 'e/4', 'g/4'], 'q', chords[2]),\n note(['c/4', 'f/4', 'a/4'], 'q', chords[3]).addModifier(new Accidental('#'), 1),\n ];\n Formatter.FormatAndDraw(ctx, stave, notes);\n }\n const chords = [\n f.ChordSymbol({ vJustify: 'bottom' }).addGlyphOrText('F'),\n f.ChordSymbol({ vJustify: 'bottom' }).addGlyphOrText('C7'),\n f.ChordSymbol({ vJustify: 'bottom' }).addLine(12),\n f.ChordSymbol({ vJustify: 'bottom' }).addText('A').addGlyphSuperscript('dim'),\n ];\n draw(chords, 10);\n ok(true, 'Bottom Stem Down Chord Symbol');\n}\nfunction doubleBottom(options) {\n const f = VexFlowTests.makeFactory(options, 600, 260);\n const ctx = f.getContext();\n ctx.scale(1.5, 1.5);\n ctx.fillStyle = '#221';\n ctx.strokeStyle = '#221';\n function draw(chords, chords2, y) {\n // Helper function to create a StaveNote with two ChordSymbols attached.\n const note = (keys, duration, chordSymbol1, chordSymbol2) => new StaveNote({ keys, duration }).addModifier(chordSymbol1, 0).addModifier(chordSymbol2, 0);\n const stave = new Stave(10, y, 450).addClef('treble').setContext(ctx).draw();\n const notes = [\n note(['c/4', 'f/4', 'a/4'], 'q', chords[0], chords2[0]),\n note(['c/4', 'e/4', 'b/4'], 'q', chords[1], chords2[1]).addModifier(new Accidental('b'), 2),\n note(['c/4', 'e/4', 'g/4'], 'q', chords[2], chords2[2]),\n note(['c/4', 'f/4', 'a/4'], 'q', chords[3], chords2[3]).addModifier(new Accidental('#'), 1),\n ];\n Formatter.FormatAndDraw(ctx, stave, notes);\n }\n const chords1 = [\n f.ChordSymbol({ vJustify: 'bottom' }).addText('I').addTextSuperscript('6').addTextSubscript('4'),\n f.ChordSymbol({ vJustify: 'bottom' }).addGlyphOrText('V'),\n f.ChordSymbol({ vJustify: 'bottom' }).addLine(12),\n f.ChordSymbol({ vJustify: 'bottom' }).addGlyphOrText('V/V'),\n ];\n const chords2 = [\n f.ChordSymbol({ vJustify: 'bottom' }).addText('T'),\n f.ChordSymbol({ vJustify: 'bottom' }).addText('D'),\n f.ChordSymbol({ vJustify: 'bottom' }).addText('D'),\n f.ChordSymbol({ vJustify: 'bottom' }).addText('SD'),\n ];\n draw(chords1, chords2, 10);\n ok(true, '2 Bottom Chord Symbol');\n}\nVexFlowTests.register(ChordSymbolTests);\nexport { ChordSymbolTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Clef Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nconst ClefTests = {\n Start() {\n QUnit.module('Clef');\n const run = VexFlowTests.runTests;\n run('Clef Test', draw);\n run('Clef End Test', drawEnd);\n run('Small Clef Test', drawSmall);\n run('Small Clef End Test', drawSmallEnd);\n run('Clef Change Test', drawClefChange);\n },\n};\nfunction draw(options) {\n const f = VexFlowTests.makeFactory(options, 800, 120);\n f.Stave()\n .addClef('treble')\n .addClef('treble', 'default', '8va')\n .addClef('treble', 'default', '8vb')\n .addClef('alto')\n .addClef('tenor')\n .addClef('soprano')\n .addClef('bass')\n .addClef('bass', 'default', '8vb')\n .addClef('mezzo-soprano')\n .addClef('baritone-c')\n .addClef('baritone-f')\n .addClef('subbass')\n .addClef('percussion')\n .addClef('french')\n .addEndClef('treble');\n f.draw();\n ok(true, 'all pass');\n}\nfunction drawEnd(options) {\n const f = VexFlowTests.makeFactory(options, 800, 120);\n f.Stave()\n .addClef('bass')\n .addEndClef('treble')\n .addEndClef('treble', 'default', '8va')\n .addEndClef('treble', 'default', '8vb')\n .addEndClef('alto')\n .addEndClef('tenor')\n .addEndClef('soprano')\n .addEndClef('bass')\n .addEndClef('bass', 'default', '8vb')\n .addEndClef('mezzo-soprano')\n .addEndClef('baritone-c')\n .addEndClef('baritone-f')\n .addEndClef('subbass')\n .addEndClef('percussion')\n .addEndClef('french');\n f.draw();\n ok(true, 'all pass');\n}\nfunction drawSmall(options) {\n const f = VexFlowTests.makeFactory(options, 800, 120);\n f.Stave()\n .addClef('treble', 'small')\n .addClef('treble', 'small', '8va')\n .addClef('treble', 'small', '8vb')\n .addClef('alto', 'small')\n .addClef('tenor', 'small')\n .addClef('soprano', 'small')\n .addClef('bass', 'small')\n .addClef('bass', 'small', '8vb')\n .addClef('mezzo-soprano', 'small')\n .addClef('baritone-c', 'small')\n .addClef('baritone-f', 'small')\n .addClef('subbass', 'small')\n .addClef('percussion', 'small')\n .addClef('french', 'small')\n .addEndClef('treble', 'small');\n f.draw();\n ok(true, 'all pass');\n}\nfunction drawSmallEnd(options) {\n const f = VexFlowTests.makeFactory(options, 800, 120);\n f.Stave()\n .addClef('bass', 'small')\n .addEndClef('treble', 'small')\n .addEndClef('treble', 'small', '8va')\n .addEndClef('treble', 'small', '8vb')\n .addEndClef('alto', 'small')\n .addEndClef('tenor', 'small')\n .addEndClef('soprano', 'small')\n .addEndClef('bass', 'small')\n .addEndClef('bass', 'small', '8vb')\n .addEndClef('mezzo-soprano', 'small')\n .addEndClef('baritone-c', 'small')\n .addEndClef('baritone-f', 'small')\n .addEndClef('subbass', 'small')\n .addEndClef('percussion', 'small')\n .addEndClef('french', 'small');\n f.draw();\n ok(true, 'all pass');\n}\nfunction drawClefChange(options) {\n const f = VexFlowTests.makeFactory(options, 800, 180);\n const stave = f.Stave().addClef('treble');\n const notes = [\n f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'treble' }),\n f.ClefNote({ type: 'alto', options: { size: 'small' } }),\n f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'alto' }),\n f.ClefNote({ type: 'tenor', options: { size: 'small' } }),\n f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'tenor' }),\n f.ClefNote({ type: 'soprano', options: { size: 'small' } }),\n f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'soprano' }),\n f.ClefNote({ type: 'bass', options: { size: 'small' } }),\n f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'bass' }),\n f.ClefNote({ type: 'mezzo-soprano', options: { size: 'small' } }),\n f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'mezzo-soprano' }),\n f.ClefNote({ type: 'baritone-c', options: { size: 'small' } }),\n f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'baritone-c' }),\n f.ClefNote({ type: 'baritone-f', options: { size: 'small' } }),\n f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'baritone-f' }),\n f.ClefNote({ type: 'subbass', options: { size: 'small' } }),\n f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'subbass' }),\n f.ClefNote({ type: 'french', options: { size: 'small' } }),\n f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'french' }),\n f.ClefNote({ type: 'treble', options: { size: 'small', annotation: '8vb' } }),\n f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'treble', octave_shift: -1 }),\n f.ClefNote({ type: 'treble', options: { size: 'small', annotation: '8va' } }),\n f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'treble', octave_shift: 1 }),\n ];\n const voice = f.Voice({ time: '12/4' }).addTickables(notes);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'all pass');\n}\nVexFlowTests.register(ClefTests);\nexport { ClefTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Curve Tests\nimport { concat, VexFlowTests } from './vexflow_test_helpers';\nimport { CurvePosition } from '../src/curve';\nconst CurveTests = {\n Start() {\n QUnit.module('Curve');\n const run = VexFlowTests.runTests;\n run('Simple Curve', simple);\n run('Rounded Curve', rounded);\n run('Thick Thin Curves', thickThin);\n run('Top Curve', top);\n },\n};\n/**\n * Helper function. Each test case passes in a set of notes and\n * a setupCurves() callback which uses Factory.Curve(...) to build the curves.\n * Curves can be used to indicate slurs (legato articulation).\n */\nfunction createTest(noteGroup1, noteGroup2, setupCurves) {\n return (options) => {\n const factory = VexFlowTests.makeFactory(options, 350, 200);\n const stave = factory.Stave({ y: 50 });\n const score = factory.EasyScore();\n // Use .reduce(concat) to flatten the two StaveNote[] into a single StaveNote[].\n const staveNotes = [\n score.beam(score.notes(...noteGroup1)),\n score.beam(score.notes(...noteGroup2)), // group 2\n ].reduce(concat);\n setupCurves(factory, staveNotes);\n const voices = [score.voice(staveNotes, { time: '4/4' })];\n factory.Formatter().joinVoices(voices).formatToStave(voices, stave);\n factory.draw();\n ok('Simple Curve');\n };\n}\nconst simple = createTest(['c4/8, f5, d5, g5', { stem: 'up' }], // beamGroup1\n['d6/8, f5, d5, g5', { stem: 'down' }], // beamGroup2\n(f, notes) => {\n f.Curve({\n from: notes[0],\n to: notes[3],\n options: {\n cps: [\n { x: 0, y: 10 },\n { x: 0, y: 50 },\n ],\n },\n });\n f.Curve({\n from: notes[4],\n to: notes[7],\n options: {\n cps: [\n { x: 0, y: 10 },\n { x: 0, y: 20 },\n ],\n },\n });\n});\nconst rounded = createTest(['c5/8, f4, d4, g5', { stem: 'up' }], // beamGroup1\n['d5/8, d6, d6, g5', { stem: 'down' }], // beamGroup2\n(f, notes) => {\n f.Curve({\n from: notes[0],\n to: notes[3],\n options: {\n x_shift: -10,\n y_shift: 30,\n cps: [\n { x: 0, y: 20 },\n { x: 0, y: 50 },\n ],\n },\n });\n f.Curve({\n from: notes[4],\n to: notes[7],\n options: {\n cps: [\n { x: 0, y: 50 },\n { x: 0, y: 50 },\n ],\n },\n });\n});\nconst thickThin = createTest(['c5/8, f4, d4, g5', { stem: 'up' }], // beamGroup1\n['d5/8, d6, d6, g5', { stem: 'down' }], // beamGroup2\n(f, notes) => {\n f.Curve({\n from: notes[0],\n to: notes[3],\n options: {\n thickness: 10,\n x_shift: -10,\n y_shift: 30,\n cps: [\n { x: 0, y: 20 },\n { x: 0, y: 50 },\n ],\n },\n });\n f.Curve({\n from: notes[4],\n to: notes[7],\n options: {\n thickness: 0,\n cps: [\n { x: 0, y: 50 },\n { x: 0, y: 50 },\n ],\n },\n });\n});\nconst top = createTest(['c5/8, f4, d4, g5', { stem: 'up' }], // beamGroup1\n['d5/8, d6, d6, g5', { stem: 'down' }], // beamGroup2\n(f, notes) => {\n f.Curve({\n from: notes[0],\n to: notes[7],\n options: {\n x_shift: -3,\n y_shift: 10,\n position: CurvePosition.NEAR_TOP,\n position_end: CurvePosition.NEAR_HEAD,\n cps: [\n { x: 0, y: 20 },\n { x: 40, y: 80 },\n ],\n },\n });\n});\nVexFlowTests.register(CurveTests);\nexport { CurveTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Dot Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Beam } from '../src/beam';\nimport { Dot } from '../src/dot';\nimport { Formatter } from '../src/formatter';\nimport { ModifierContext } from '../src/modifiercontext';\nimport { Note } from '../src/note';\nimport { Stave } from '../src/stave';\nimport { StaveNote } from '../src/stavenote';\nimport { TickContext } from '../src/tickcontext';\nimport { Voice } from '../src/voice';\nconst DotTests = {\n Start() {\n QUnit.module('Dot');\n const run = VexFlowTests.runTests;\n run('Basic', basic);\n run('Multi Voice', multiVoice);\n },\n};\n/**\n * Helper function for the basic test case below.\n */\nfunction showOneNote(note1, stave, ctx, x) {\n const modifierContext = new ModifierContext();\n note1.setStave(stave).addToModifierContext(modifierContext);\n new TickContext().addTickable(note1).preFormat().setX(x);\n note1.setContext(ctx).draw();\n Note.plotMetrics(ctx, note1, 140);\n}\nfunction basic(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 1000, 240);\n ctx.setFillStyle('#221');\n ctx.setStrokeStyle('#221');\n const stave = new Stave(10, 10, 975);\n stave.setContext(ctx);\n stave.draw();\n const notes = [\n new StaveNote({ keys: ['c/4', 'e/4', 'a/4', 'b/4'], duration: 'w' }),\n new StaveNote({ keys: ['a/4', 'b/4', 'c/5'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['g/4', 'a/4', 'b/4'], duration: '4', stem_direction: -1 }),\n new StaveNote({ keys: ['e/4', 'f/4', 'b/4', 'c/5'], duration: '4' }),\n new StaveNote({\n keys: ['g/4', 'a/4', 'd/5', 'e/5', 'g/5'],\n duration: '4',\n stem_direction: -1,\n }),\n new StaveNote({ keys: ['g/4', 'b/4', 'd/5', 'e/5'], duration: '4', stem_direction: -1 }),\n new StaveNote({ keys: ['e/4', 'g/4', 'b/4', 'c/5'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['d/4', 'e/4', 'f/4', 'a/4', 'c/5', 'e/5', 'g/5'], duration: '2' }),\n new StaveNote({\n keys: ['f/4', 'g/4', 'a/4', 'b/4', 'c/5', 'e/5', 'g/5'],\n duration: '16',\n stem_direction: -1,\n }),\n new StaveNote({ keys: ['f/4', 'g/4', 'a/4', 'b/4', 'c/5', 'e/5', 'g/5'], duration: '16', stem_direction: 1 }),\n new StaveNote({\n keys: ['e/4', 'g/4', 'a/4', 'b/4', 'c/5', 'e/5', 'f/5'],\n duration: '16',\n stem_direction: 1,\n }),\n new StaveNote({\n keys: ['e/4', 'g/4', 'a/4', 'b/4', 'c/5'],\n duration: '16',\n stem_direction: 1,\n }),\n new StaveNote({ keys: ['e/4', 'a/4', 'b/4', 'c/5'], duration: '16', stem_direction: 1 }),\n ];\n Dot.buildAndAttach(notes, { all: true });\n Dot.buildAndAttach([notes[7], notes[8], notes[9]], { all: true });\n Dot.buildAndAttach([notes[8], notes[9]], { all: true });\n const beam = new Beam(notes.slice(notes.length - 2));\n for (let i = 0; i < notes.length; i++) {\n showOneNote(notes[i], stave, ctx, 30 + i * 65);\n const dots = notes[i].getModifiersByType('Dot');\n ok(dots.length > 0, 'Note ' + i + ' has dots');\n for (let j = 0; j < dots.length; ++j) {\n ok(dots[j].getWidth() > 0, 'Dot ' + j + ' has width set');\n }\n }\n beam.setContext(ctx).draw();\n VexFlowTests.plotLegendForNoteWidth(ctx, 890, 140);\n ok(true, 'Full Dot');\n}\nfunction multiVoice(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 750, 300);\n ctx.setFillStyle('#221');\n ctx.setStrokeStyle('#221');\n const stave = new Stave(30, 45, 700).setContext(ctx).draw();\n const notes1 = [\n new StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: '2', stem_direction: -1 }),\n new StaveNote({ keys: ['c/4', 'e/4', 'c/5'], duration: '2', stem_direction: -1 }),\n new StaveNote({ keys: ['d/4', 'c/5', 'd/5'], duration: '2', stem_direction: -1 }),\n new StaveNote({ keys: ['d/4', 'c/5', 'd/5'], duration: '8', stem_direction: -1 }),\n new StaveNote({ keys: ['d/4', 'c/5', 'd/5'], duration: '8', stem_direction: -1 }),\n ];\n Dot.buildAndAttach([notes1[0], notes1[2], notes1[3], notes1[4]], { all: true });\n Dot.buildAndAttach([notes1[0], notes1[2], notes1[3], notes1[4]], { all: true });\n Dot.buildAndAttach([notes1[1]], { index: 0 });\n Dot.buildAndAttach([notes1[1]], { index: 0 });\n Dot.buildAndAttach([notes1[1]], { index: 1 });\n Dot.buildAndAttach([notes1[1]], { index: 1 });\n Dot.buildAndAttach([notes1[1]], { index: 2 });\n Dot.buildAndAttach([notes1[1]], { index: 2 });\n Dot.buildAndAttach([notes1[1]], { index: 2 });\n Dot.buildAndAttach([notes1[2], notes1[3], notes1[4]]);\n const notes2 = [\n new StaveNote({ keys: ['d/5', 'a/5', 'b/5'], duration: '2', stem_direction: 1 }),\n new StaveNote({ keys: ['d/5', 'a/5', 'b/5'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['d/5', 'a/5', 'b/5'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['d/5', 'g/5', 'a/5', 'b/5'], duration: '8', stem_direction: 1 }),\n new StaveNote({ keys: ['d/5', 'a/5', 'b/5'], duration: '8', stem_direction: 1 }),\n ];\n Dot.buildAndAttach(notes2, { all: true });\n Dot.buildAndAttach([notes2[1]], { all: true });\n const voice1 = new Voice().setMode(Voice.Mode.SOFT).addTickables(notes1);\n const voice2 = new Voice().setMode(Voice.Mode.SOFT).addTickables(notes2);\n const formatter = new Formatter().joinVoices([voice1, voice2]);\n formatter.format([voice1, voice2], 700);\n voice1.draw(ctx, stave);\n voice2.draw(ctx, stave);\n notes1.forEach((note) => Note.plotMetrics(ctx, note, 190));\n notes2.forEach((note) => Note.plotMetrics(ctx, note, 20));\n VexFlowTests.plotLegendForNoteWidth(ctx, 620, 220);\n ok(true, 'Full Dot');\n}\nVexFlowTests.register(DotTests);\nexport { DotTests };\n","// [VexFlow](https://vexflow.com/) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// EasyScore Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Articulation } from '../src/articulation';\nimport { EasyScore } from '../src/easyscore';\nimport { FretHandFinger } from '../src/frethandfinger';\nimport { Modifier } from '../src/modifier';\nimport { Parenthesis } from '../src/parenthesis';\nimport { StaveConnector } from '../src/staveconnector';\nimport { Stem } from '../src/stem';\nimport { Tuplet } from '../src/tuplet';\nconst EasyScoreTests = {\n Start() {\n QUnit.module('EasyScore');\n test('Basic', basic);\n test('Accidentals', accidentals);\n test('Durations', durations);\n test('Chords', chords);\n test('Dots', dots);\n test('Types', types);\n test('Options', options);\n const run = VexFlowTests.runTests;\n run('Draw Basic', drawBasicTest);\n run('Draw Basic Muted', drawBasicMutedTest);\n run('Draw Basic Harmonic', drawBasicHarmonicTest);\n run('Draw Basic Slash', drawBasicSlashTest);\n run('Draw Ghostnote Basic', drawGhostBasicTest);\n run('Draw Ghostnote Dotted', drawGhostDottedTest);\n run('Draw Parenthesised', drawParenthesisedTest);\n run('Draw Accidentals', drawAccidentalsTest);\n run('Draw Beams', drawBeamsTest);\n run('Draw Tuplets', drawTupletsTest);\n run('Draw Dots', drawDotsTest);\n run('Draw Options', drawOptionsTest);\n run('Draw Fingerings', drawFingeringsTest);\n run('Keys', keys);\n },\n};\n/**\n * Use Function.prototype.bind() to create shortcut methods.\n * This can improve the readability of your EasyScore code.\n */\nfunction createShortcuts(score) {\n return {\n voice: score.voice.bind(score),\n notes: score.notes.bind(score),\n beam: score.beam.bind(score),\n tuplet: score.tuplet.bind(score),\n };\n}\n/**\n * Test case verifies:\n * - all strings in `mustPass` parse correctly\n * - all strings in `mustFail` fail to parse (i.e., Result.success is `false`).\n */\nfunction basic() {\n const score = new EasyScore();\n const mustPass = ['c4', 'c#4', 'c4/r', 'c#5', 'c3/m', 'c3//m', 'c3//h', 'c3/s', 'c3//s', 'c3/g', 'c3//g'];\n const mustFail = ['', '()', '7', '(c#4 e5 g6'];\n mustPass.forEach((line) => equal(score.parse(line).success, true, line));\n mustFail.forEach((line) => equal(score.parse(line).success, false, line));\n}\nfunction accidentals() {\n const score = new EasyScore();\n const mustPass = [\n 'c3',\n 'c##3, cb3',\n 'Cn3',\n 'f3//m',\n '(c##3 cbb3 cn3), cb3',\n 'cbbs7',\n 'cbb7',\n 'cbss7',\n 'cbs7',\n 'cb7',\n 'cdb7',\n 'cd7',\n 'c##7',\n 'c#7',\n 'cn7',\n 'c++-7',\n 'c++7',\n 'c+-7',\n 'c+7',\n '(cbs3 bbs3 dbs3), ebs3',\n '(cd7 cbb3 cn3), cb3',\n 'co7',\n 'ck7',\n ];\n const mustFail = [\n 'ct3',\n 'cdbb7',\n '(cq cbb3 cn3), cb3',\n '(cdd7 cbb3 cn3), cb3',\n 'cbbbs7',\n 'cbbss7',\n 'cbsss7',\n 'csbs7',\n 'cddb7',\n 'cddbb7',\n 'cdd7',\n 'c##b7',\n 'c#bs7',\n 'cnb#7',\n 'c+#+b-d7',\n 'c+--7',\n 'c++--7',\n 'c+++7',\n 'cbk7',\n 'cok7',\n 'cko7',\n 'c#s7',\n ];\n mustPass.forEach((line) => equal(score.parse(line).success, true, line));\n mustFail.forEach((line) => equal(score.parse(line).success, false, line));\n}\nfunction durations() {\n const score = new EasyScore();\n const mustPass = ['c3/4', 'c##3/w, cb3', 'c##3/w, cb3/q', 'c##3/q, cb3/32', '(c##3 cbb3 cn3), cb3'];\n const mustFail = ['Cn3/]', '/', '(cq cbb3 cn3), cb3', '(cdd7 cbb3 cn3), cb3'];\n mustPass.forEach((line) => equal(score.parse(line).success, true, line));\n mustFail.forEach((line) => equal(score.parse(line).success, false, line));\n}\nfunction chords() {\n const score = new EasyScore();\n const mustPass = [\n '(c5)',\n '(c3 e0 g9)',\n '(c##4 cbb4 cn4)/w, (c#5 cb2 a3)/32',\n '(d##4 cbb4 cn4)/w/r, (c#5 cb2 a3)',\n '(c##4 cbb4 cn4)/4, (c#5 cb2 a3)',\n '(c##4 cbb4 cn4)/m, (c#5 cb2 a3)',\n ];\n const mustFail = ['(c)'];\n mustPass.forEach((line) => equal(score.parse(line).success, true, line));\n mustFail.forEach((line) => equal(score.parse(line).success, false, line));\n}\nfunction dots() {\n const score = new EasyScore();\n const mustPass = [\n 'c3/4.',\n 'c##3/w.., cb3',\n 'f##3/s, cb3/q...',\n 'c##3/q, cb3/32',\n '(c##3 cbb3 cn3)., cb3',\n '(c5).',\n '(c##4 cbb4 cn4)/w.., (c#5 cb2 a3)/32',\n ];\n const mustFail = ['.', 'c.#', 'c#4./4'];\n mustPass.forEach((line) => equal(score.parse(line).success, true, line));\n mustFail.forEach((line) => equal(score.parse(line).success, false, line));\n}\nfunction types() {\n const score = new EasyScore();\n const mustPass = ['c3/4/m.', 'c##3//r.., cb3', 'c##3/m.., cb3', 'c##3/r.., cb3', 'd##3/w/s, cb3/q...', 'Fb4'];\n const mustFail = ['c4/q/U', '(c##4, cbb4 cn4)/w.., (c#5 cb2 a3)/32', 'z#3'];\n mustPass.forEach((line) => equal(score.parse(line).success, true, line));\n mustFail.forEach((line) => equal(score.parse(line).success, false, line));\n}\nfunction options() {\n const score = new EasyScore();\n const mustPass = [\n 'c3/4.[foo=\"bar\"]',\n 'c##3/w.., cb3[id=\"blah\"]',\n 'c##3/q, cb3/32',\n '(c##3 cbb3 cn3).[blah=\"bod4o\"], cb3',\n '(c5)[fooooo=\"booo\"]',\n 'c#5[id=\"foobar\"]',\n ];\n const mustFail = ['.[', 'f##3/w[], cb3/q...'];\n mustPass.forEach((line) => equal(score.parse(line).success, true, line));\n mustFail.forEach((line) => equal(score.parse(line).success, false, line));\n}\nfunction drawBasicTest(options) {\n const f = VexFlowTests.makeFactory(options, 600, 350);\n const score = f.EasyScore();\n const system = f.System();\n const { voice, notes } = createShortcuts(score);\n system\n .addStave({\n voices: [\n voice(notes('(d4 e4 g4)/q, c4/q, c4/q/r, c4/q', { stem: 'down' })),\n voice(notes('c#5/h., c5/q', { stem: 'up' })),\n ],\n })\n .addClef('treble');\n system\n .addStave({\n voices: [voice(notes('c#3/q, cn3/q, bb3/q, d##3/q', { clef: 'bass' }))],\n })\n .addClef('bass');\n system.addConnector().setType(StaveConnector.type.BRACKET);\n f.draw();\n expect(0);\n}\nfunction drawBasicMutedTest(options) {\n const f = VexFlowTests.makeFactory(options, 600, 350);\n const score = f.EasyScore();\n const system = f.System();\n const { voice, notes } = createShortcuts(score);\n system\n .addStave({\n voices: [\n voice(notes('(d4 e4 g4)/q/m, c4/q/m, c4/q/r, c4/q/m', { stem: 'down' })),\n voice(notes('c#5/h/m., c5/q/m', { stem: 'up' })),\n ],\n })\n .addClef('treble');\n system\n .addStave({\n voices: [voice(notes('c#3/q/m, cn3/q/m, bb3/q/m, d##3/q/m', { clef: 'bass' }))],\n })\n .addClef('bass');\n system.addConnector().setType(StaveConnector.type.BRACKET);\n f.draw();\n expect(0);\n}\nfunction drawBasicHarmonicTest(options) {\n const f = VexFlowTests.makeFactory(options, 600, 350);\n const score = f.EasyScore();\n const system = f.System();\n const { voice, notes } = createShortcuts(score);\n system\n .addStave({\n voices: [\n voice(notes('(d4 e4 g4)/q/h, c4/q/h, c4/q/r, c4/q/h', { stem: 'down' })),\n voice(notes('c#5/h/h., c5/q/h', { stem: 'up' })),\n ],\n })\n .addClef('treble');\n system\n .addStave({\n voices: [voice(notes('c#3/q/h, cn3/q/h, bb3/q/h, d##3/q/h', { clef: 'bass' }))],\n })\n .addClef('bass');\n system.addConnector().setType(StaveConnector.type.BRACKET);\n f.draw();\n expect(0);\n}\nfunction drawBasicSlashTest(options) {\n const f = VexFlowTests.makeFactory(options, 600, 350);\n const score = f.EasyScore();\n const system = f.System();\n const { voice, notes } = createShortcuts(score);\n system\n .addStave({\n voices: [\n voice(notes('(d4 e4 g4)/q/s, c4/q/s, c4/q/r, c4/q/s', { stem: 'down' })),\n voice(notes('c#5/h/s., c5/q/s', { stem: 'up' })),\n ],\n })\n .addClef('treble');\n system\n .addStave({\n voices: [voice(notes('c#3/q/s, cn3/q/s, bb3/q/s, d##3/q/s', { clef: 'bass' }))],\n })\n .addClef('bass');\n system.addConnector().setType(StaveConnector.type.BRACKET);\n f.draw();\n expect(0);\n}\nfunction drawGhostBasicTest(options) {\n const f = VexFlowTests.makeFactory(options, 550);\n const score = f.EasyScore();\n const system = f.System();\n system.addStave({\n voices: [\n score.voice([\n ...score.notes('f#5/4, f5, db5, c5', { stem: 'up' }),\n ...score.beam(score.notes('c5/8, d5, fn5, e5', { stem: 'up' })),\n ...score.beam(score.notes('d5, c5', { stem: 'up' })),\n ], { time: '7/4' }),\n score.voice(score.notes('c4/h/g, f4/4, c4/4/g, e4/4, c4/8/g, d##4/8, c4/8, c4/8', { stem: 'down' }), {\n time: '7/4',\n }),\n ],\n });\n f.draw();\n expect(0);\n}\nfunction drawGhostDottedTest(options) {\n const f = VexFlowTests.makeFactory(options, 550);\n const score = f.EasyScore();\n const system = f.System();\n system.addStave({\n voices: [\n score.voice([\n ...score.notes('c4/4/g., fbb5/8, d5/4', { stem: 'up' }),\n ...score.beam(score.notes('c5/8, c#5/16, d5/16', { stem: 'up' })),\n ...score.notes('c4/2/g.., fn5/8', { stem: 'up' }),\n ], { time: '8/4' }),\n score.voice([\n ...score.notes('f#4/4', { stem: 'down' }),\n ...score.beam(score.notes('e4/8, d4/8', { stem: 'down' })),\n ...score.notes('c4/4/g.., cb4/16, c#4/h, d4/4', { stem: 'down' }),\n ...score.beam(score.notes('fn4/8, e4/8', { stem: 'down' })),\n ], { time: '8/4' }),\n ],\n });\n f.draw();\n expect(0);\n}\nfunction drawParenthesisedTest(options) {\n const f = VexFlowTests.makeFactory(options, 600, 350);\n const score = f.EasyScore();\n const system = f.System();\n const { voice, notes } = createShortcuts(score);\n const notes1 = notes('(d4 e4 g4)/q, c4/q, c4/q/r, c4/q', { stem: 'down' });\n Parenthesis.buildAndAttach([notes1[0], notes1[3]]);\n const notes2 = notes('c#5/h., c5/q', { stem: 'down' });\n Parenthesis.buildAndAttach([notes2[0], notes2[1]]);\n system\n .addStave({\n voices: [voice(notes1), voice(notes2)],\n })\n .addClef('treble');\n const notes3 = notes('c#3/q, cn3/q, bb3/q, d##3/q', { stem: 'down' });\n Parenthesis.buildAndAttach(notes3);\n system\n .addStave({\n voices: [voice(notes3)],\n })\n .addClef('bass');\n system.addConnector().setType(StaveConnector.type.BRACKET);\n f.draw();\n expect(0);\n}\nfunction drawAccidentalsTest(options) {\n const f = VexFlowTests.makeFactory(options, 600, 350);\n const score = f.EasyScore();\n const system = f.System();\n const { voice, notes } = createShortcuts(score);\n system\n .addStave({\n voices: [\n voice(notes('(cbbs4 ebb4 gbss4)/q, cbs4/q, cdb4/q/r, cd4/q', { stem: 'down' })),\n voice(notes('c++-5/h., c++5/q', { stem: 'up' })),\n ],\n })\n .addClef('treble');\n system\n .addStave({\n voices: [voice(notes('c+-3/q, c+3/q, bb3/q, d##3/q', { clef: 'bass' }))],\n })\n .addClef('bass');\n system.addConnector().setType(StaveConnector.type.BRACKET);\n f.draw();\n expect(0);\n}\nfunction drawBeamsTest(options) {\n const f = VexFlowTests.makeFactory(options, 600, 250);\n const score = f.EasyScore();\n const system = f.System();\n const { voice, notes, beam } = createShortcuts(score);\n system\n .addStave({\n voices: [\n voice(notes('(c4 e4 g4)/q, c4/q, c4/q/r, c4/q', { stem: 'down' })),\n voice([...notes('c#5/h.', { stem: 'up' }), ...beam(notes('c5/8, c5/8', { stem: 'up' }))]),\n ],\n })\n .addClef('treble');\n f.draw();\n expect(0);\n}\nfunction drawTupletsTest(options) {\n const f = VexFlowTests.makeFactory(options, 600, 250);\n const score = f.EasyScore();\n const system = f.System();\n const { voice, notes, tuplet, beam } = createShortcuts(score);\n // Voice 1, with stems pointed down.\n const v1_tuplet = tuplet(notes('(c4 e4 g4)/q, cbb4/q, c4/q', { stem: 'down' }), {\n location: Tuplet.LOCATION_BOTTOM,\n });\n const v1_halfNote = notes('c4/h', { stem: 'down' });\n const v1 = voice([...v1_tuplet, ...v1_halfNote]);\n // Voice 2, with stems pointed up.\n const v2_halfNote = notes('c#5/h.', { stem: 'up' });\n const v2_tuplet = tuplet(beam(notes('cb5/8, cn5/8, c5/8', { stem: 'up' })));\n const v2 = voice([...v2_halfNote, ...v2_tuplet]);\n system.addStave({ voices: [v1, v2] }).addClef('treble');\n f.draw();\n expect(0);\n}\nfunction drawDotsTest(options) {\n const f = VexFlowTests.makeFactory(options, 600, 250);\n const score = f.EasyScore();\n const system = f.System();\n const { voice, notes } = createShortcuts(score);\n system\n .addStave({\n voices: [voice(notes('(c4 e4 g4)/8., (c4 e4 g4)/8.., (c4 e4 g4)/8..., (c4 e4 g4)/8...., (c4 e4 g4)/16...'))],\n })\n .addClef('treble');\n f.draw();\n expect(0);\n}\nfunction drawOptionsTest(options) {\n const f = VexFlowTests.makeFactory(options, 500, 200);\n const score = f.EasyScore();\n const system = f.System();\n const notes = score.notes('B4/h[id=\"foobar\", class=\"red,bold\", stem=\"up\", articulations=\"staccato.below,tenuto\"], B4/q[articulations=\"accent.above\"], B4/q[stem=\"down\"]');\n system.addStave({ voices: [score.voice(notes)] });\n f.draw();\n const note0 = notes[0];\n const note1 = notes[1];\n const note0_modifier0 = note0.getModifiers()[0];\n const note0_modifier1 = note0.getModifiers()[1];\n const note1_modifier0 = note1.getModifiers()[0];\n equal(note0.getAttribute('id'), 'foobar');\n ok(note0.hasClass('red'));\n ok(note0.hasClass('bold'));\n equal(note0_modifier0.getCategory(), Articulation.CATEGORY);\n equal(note0_modifier0.type, 'a.');\n equal(note0_modifier0.getPosition(), Modifier.Position.BELOW);\n equal(note0_modifier1.getCategory(), Articulation.CATEGORY);\n equal(note0_modifier1.type, 'a-');\n equal(note0_modifier1.getPosition(), Modifier.Position.ABOVE);\n equal(note0.getStemDirection(), Stem.UP);\n equal(note1_modifier0.getCategory(), Articulation.CATEGORY);\n equal(note1_modifier0.type, 'a>');\n equal(note1_modifier0.getPosition(), Modifier.Position.ABOVE);\n equal(notes[2].getStemDirection(), Stem.DOWN);\n}\nfunction drawFingeringsTest(options) {\n const f = VexFlowTests.makeFactory(options, 500, 200);\n const score = f.EasyScore();\n const system = f.System();\n const notes = score.notes('C4/q[fingerings=\"1\"], E4[fingerings=\"3.above\"], G4[fingerings=\"5.below\"], (C4 E4 G4)[fingerings=\"1,3,5\"]');\n system.addStave({ voices: [score.voice(notes)] });\n f.draw();\n const note0_modifier0 = notes[0].getModifiers()[0];\n equal(note0_modifier0.getCategory(), FretHandFinger.CATEGORY);\n equal(note0_modifier0.getFretHandFinger(), '1');\n equal(note0_modifier0.getPosition(), Modifier.Position.LEFT);\n const note1_modifier0 = notes[1].getModifiers()[0];\n equal(note1_modifier0.getCategory(), FretHandFinger.CATEGORY);\n equal(note1_modifier0.getFretHandFinger(), '3');\n equal(note1_modifier0.getPosition(), Modifier.Position.ABOVE);\n const note2_modifier0 = notes[2].getModifiers()[0];\n equal(note2_modifier0.getCategory(), FretHandFinger.CATEGORY);\n equal(note2_modifier0.getFretHandFinger(), '5');\n equal(note2_modifier0.getPosition(), Modifier.Position.BELOW);\n const note3_modifiers = notes[3].getModifiers();\n const note3_modifier0 = note3_modifiers[0];\n const note3_modifier1 = note3_modifiers[1];\n const note3_modifier2 = note3_modifiers[2];\n equal(note3_modifier0.getCategory(), FretHandFinger.CATEGORY);\n equal(note3_modifier0.getFretHandFinger(), '1');\n equal(note3_modifier0.getPosition(), Modifier.Position.LEFT);\n equal(note3_modifier1.getCategory(), FretHandFinger.CATEGORY);\n equal(note3_modifier1.getFretHandFinger(), '3');\n equal(note3_modifier1.getPosition(), Modifier.Position.LEFT);\n equal(note3_modifier2.getCategory(), FretHandFinger.CATEGORY);\n equal(note3_modifier2.getFretHandFinger(), '5');\n equal(note3_modifier2.getPosition(), Modifier.Position.LEFT);\n}\nfunction keys(options) {\n const f = VexFlowTests.makeFactory(options, 500, 200);\n const score = f.EasyScore();\n const notes = score.notes('c#3/q, c##3, cb3, cbb3, cn3, c3, cbbs3, cbss3, cbs3, cdb3, cd3, c++-3, c++3, c+-3, c+3, co3, ck3');\n equal(notes[0].keys, 'c#/3');\n equal(notes[1].keys, 'c##/3');\n equal(notes[2].keys, 'cb/3');\n equal(notes[3].keys, 'cbb/3');\n equal(notes[4].keys, 'cn/3');\n for (let i = 5; i < notes.length; i++) {\n equal(notes[i].keys, 'c/3');\n }\n}\nVexFlowTests.register(EasyScoreTests);\nexport { EasyScoreTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Factory Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Factory } from '../src/factory';\nimport { Barline } from '../src/stavebarline';\nconst FactoryTests = {\n Start() {\n QUnit.module('Factory');\n test('Defaults', defaults);\n const run = VexFlowTests.runTests;\n run('Draw', draw);\n run('Draw Tab (repeat barlines must be aligned)', drawTab);\n },\n};\nfunction defaults() {\n // Throws RuntimeError: 'HTML DOM element not set in Factory'\n throws(() => new Factory({ renderer: { elementId: '', width: 700, height: 500 } }), 'Empty string for elementId throws an exception.');\n const factory = new Factory({\n renderer: { elementId: null, width: 700, height: 500 },\n });\n // eslint-disable-next-line\n // @ts-ignore access a protected member for testing purposes.\n const options = factory.options;\n equal(options.renderer.width, 700);\n equal(options.renderer.height, 500);\n equal(options.renderer.elementId, null);\n equal(options.stave.space, 10);\n}\nfunction draw(options) {\n const f = Factory.newFromElementId(options.elementId);\n f.Stave().setClef('treble');\n f.draw();\n expect(0);\n}\nfunction drawTab(options) {\n const factory = VexFlowTests.makeFactory(options, 500, 400);\n const system = factory.System({ width: 500 });\n const stave = factory.Stave().setClef('treble').setKeySignature('C#').setBegBarType(Barline.type.REPEAT_BEGIN);\n const voices = [factory.Voice().addTickables([factory.GhostNote({ duration: 'w' })])];\n system.addStave({ stave, voices });\n const tabStave = factory.TabStave().setClef('tab').setBegBarType(Barline.type.REPEAT_BEGIN);\n const tabVoices = [factory.Voice().addTickables([factory.GhostNote({ duration: 'w' })])];\n system.addStave({ stave: tabStave, voices: tabVoices });\n factory.draw();\n equal(stave.getModifiers()[0].getX(), tabStave.getModifiers()[0].getX());\n expect(1);\n}\nVexFlowTests.register(FactoryTests);\nexport { FactoryTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Font Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Accidental } from '../src/accidental';\nimport { Bend } from '../src/bend';\nimport { CanvasContext } from '../src/canvascontext';\nimport { Element } from '../src/element';\nimport { Flow } from '../src/flow';\nimport { Font, FontStyle, FontWeight } from '../src/font';\nimport { PedalMarking } from '../src/pedalmarking';\nimport { StaveNote } from '../src/stavenote';\nimport { TextBracket } from '../src/textbracket';\nimport { TextNote } from '../src/textnote';\nimport { Voice } from '../src/voice';\nconst FontTests = {\n Start() {\n QUnit.module('Font');\n test('setFont', setFont);\n test('Parsing', fontParsing);\n test('Sizes', fontSizes);\n const run = VexFlowTests.runTests;\n run('Set Text Font to Georgia', setTextFontToGeorgia);\n run('Set Music Font to Petaluma', setMusicFontToPetaluma);\n },\n};\n/**\n * Test out the setFont method in various classes.\n */\nfunction setFont() {\n // Create a CanvasCntext and call setFont on it.\n const canvas = document.createElement('canvas');\n canvas.width = 800;\n canvas.height = 400;\n // Set the font and get the font to verify that it matches.\n // NOTE: Safari has a bug where it does not return the font-weight!\n // https://github.com/0xfe/vexflow/issues/1240#issuecomment-986504088\n const ctx = new CanvasContext(canvas.getContext('2d'));\n ctx.setFont('PetalumaScript', '100px', 'normal', 'italic');\n equal(ctx.font, 'italic 100px PetalumaScript');\n const voice = new Voice();\n // Many elements do not override the default Element.TEXT_FONT.\n propEqual(voice.fontInfo, Element.TEXT_FONT);\n voice.setFont('bold 32pt Arial');\n const fontInfo = voice.fontInfo;\n equal(fontInfo === null || fontInfo === void 0 ? void 0 : fontInfo.size, '32pt');\n const flat = new Accidental('b');\n // eslint-disable-next-line\n // @ts-ignore access a protected member for testing purposes.\n equal(flat.textFont, undefined); // The internal instance variable .textFont is undefined by default.\n // Add italic to the default font as defined in Element.TEXT_FONT (since Accidental does not override TEXT_FONT).\n flat.setFont(undefined, undefined, undefined, FontStyle.ITALIC);\n equal(flat.getFont(), 'italic 10pt Arial, sans-serif');\n // Anything that is not set will be reset to the defaults.\n flat.setFont(undefined, undefined, FontWeight.BOLD, undefined);\n equal(flat.getFont(), 'bold 10pt Arial, sans-serif');\n flat.setFont(undefined, undefined, FontWeight.BOLD, FontStyle.ITALIC);\n equal(flat.getFont(), 'italic bold 10pt Arial, sans-serif');\n flat.setFont(undefined, undefined, FontWeight.BOLD, 'oblique');\n equal(flat.getFont(), 'oblique bold 10pt Arial, sans-serif');\n // '' is equivalent to 'normal'. Neither will be included in the CSS font string.\n flat.setFont(undefined, undefined, 'normal', '');\n equal(flat.getFont(), '10pt Arial, sans-serif');\n}\nfunction fontParsing() {\n const b = new Bend('1/2', true);\n const bFont = b.fontInfo;\n // Check the default font.\n equal(bFont === null || bFont === void 0 ? void 0 : bFont.family, Font.SANS_SERIF);\n equal(bFont === null || bFont === void 0 ? void 0 : bFont.size, Font.SIZE);\n equal(bFont === null || bFont === void 0 ? void 0 : bFont.weight, FontWeight.NORMAL);\n equal(bFont === null || bFont === void 0 ? void 0 : bFont.style, FontStyle.NORMAL);\n const f1 = 'Roboto Slab, serif';\n const t = new TextNote({ duration: '4', font: { family: f1 } });\n equal(f1, t.fontInfo.family);\n const n1 = new StaveNote({ keys: ['e/5'], duration: '4' });\n const n2 = new StaveNote({ keys: ['c/5'], duration: '4' });\n const tb = new TextBracket({ start: n1, stop: n2 });\n const f2 = tb.fontInfo;\n equal(f2 === null || f2 === void 0 ? void 0 : f2.size, 15);\n equal(f2 === null || f2 === void 0 ? void 0 : f2.style, FontStyle.ITALIC);\n // The line-height /3 is currently ignored.\n const f3 = Font.fromCSSString(`bold 1.5em/3 \"Lucida Sans Typewriter\", \"Lucida Console\", Consolas, monospace`);\n const f3SizeInPx = Font.convertSizeToPixelValue(f3.size);\n equal(f3SizeInPx, 24);\n}\nfunction fontSizes() {\n {\n const size = '17px';\n const sizeInEm = Font.convertSizeToPixelValue(size) / Font.scaleToPxFrom.em;\n equal(sizeInEm, 1.0625);\n }\n {\n const size = '2em';\n const sizeInPx = Font.convertSizeToPixelValue(size);\n equal(sizeInPx, 32);\n }\n {\n const pedal = new PedalMarking([]);\n equal(pedal.getFont(), 'italic bold 12pt Times New Roman, serif');\n equal(pedal.fontSizeInPoints, 12);\n equal(pedal.fontSizeInPixels, 16);\n const doubledSizePx = pedal.fontSizeInPixels * 2; // Double the font size.\n equal(doubledSizePx, 32);\n const doubledSizePt = Font.scaleSize(pedal.fontSizeInPoints, 2); // Double the font size.\n equal(doubledSizePt, 24);\n equal(Font.scaleSize('1.5em', 3), '4.5em');\n }\n}\nfunction setTextFontToGeorgia(options) {\n const factory = VexFlowTests.makeFactory(options, 400, 200);\n const stave = factory.Stave({ y: 40 });\n const score = factory.EasyScore();\n const voice1 = score.voice([\n factory.StaveNote({ keys: ['c/4', 'e/4', 'a/4'], stem_direction: -1, duration: 'h' }),\n factory.StaveNote({ keys: ['d/4', 'f/4'], stem_direction: -1, duration: 'q' }),\n factory.StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: 'q' }),\n ]);\n const defaultFont = TextNote.TEXT_FONT;\n // Set the default before we instantiate TextNote objects with the factory.\n TextNote.TEXT_FONT = {\n family: 'Georgia, Courier New, serif',\n size: 14,\n weight: 'bold',\n style: 'italic',\n };\n const voice2 = score.voice([\n factory\n .TextNote({ text: 'Here are some fun lyrics...', duration: 'w' })\n .setJustification(TextNote.Justification.LEFT),\n ]);\n const formatter = factory.Formatter();\n formatter.joinVoices([voice1, voice2]).formatToStave([voice1, voice2], stave);\n factory.draw();\n // Restore the previous default, or else it will affect the rest of the tests.\n TextNote.TEXT_FONT = defaultFont;\n ok(true);\n}\nfunction setMusicFontToPetaluma(options) {\n Flow.setMusicFont('Petaluma');\n const factory = VexFlowTests.makeFactory(options, 400, 200);\n const stave = factory.Stave({ y: 40 });\n const score = factory.EasyScore();\n const voice = score.voice([\n factory.StaveNote({ keys: ['c/4', 'e/4', 'a/4'], stem_direction: -1, duration: 'h' }),\n factory.StaveNote({ keys: ['d/4', 'f/4'], stem_direction: -1, duration: 'q' }),\n factory.StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: 'q' }),\n ]);\n const formatter = factory.Formatter();\n formatter.joinVoices([voice]).formatToStave([voice], stave);\n factory.draw();\n ok(true);\n}\nVexFlowTests.register(FontTests);\nexport { FontTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Formatter Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Accidental } from '../src/accidental';\nimport { Annotation, AnnotationVerticalJustify } from '../src/annotation';\nimport { Articulation } from '../src/articulation';\nimport { Beam } from '../src/beam';\nimport { Bend } from '../src/bend';\nimport { Dot } from '../src/dot';\nimport { Flow } from '../src/flow';\nimport { Font, FontWeight } from '../src/font';\nimport { Formatter } from '../src/formatter';\nimport { FretHandFinger } from '../src/frethandfinger';\nimport { ModifierPosition } from '../src/modifier';\nimport { Note } from '../src/note';\nimport { Registry } from '../src/registry';\nimport { Stave } from '../src/stave';\nimport { StaveConnector } from '../src/staveconnector';\nimport { StaveNote } from '../src/stavenote';\nimport { Stem } from '../src/stem';\nimport { StringNumber } from '../src/stringnumber';\nimport { Tables } from '../src/tables';\nimport { Tuplet } from '../src/tuplet';\nimport { Voice } from '../src/voice';\nimport { MockTickable } from './mocks';\nconst FormatterTests = {\n Start() {\n QUnit.module('Formatter');\n test('TickContext Building', buildTickContexts);\n const run = VexFlowTests.runTests;\n run('Whitespace and justify', rightJustify);\n run('Notehead padding', noteHeadPadding);\n run('Justification and alignment with accidentals', accidentalJustification);\n run('Long measure taking full space', longMeasureProblems);\n run('Vertical alignment - few unaligned beats', unalignedNoteDurations1);\n run('Vertical alignment - many unaligned beats', unalignedNoteDurations2, { globalSoftmax: false });\n run('Vertical alignment - many unaligned beats (global softmax)', unalignedNoteDurations2, { globalSoftmax: true });\n run('Vertical alignment - many mixed elements', alignedMixedElements, { globalSoftmax: true });\n run('StaveNote - Justification', justifyStaveNotes);\n run('Notes with Tab', notesWithTab);\n run('Multiple Staves - Justified', multiStaves, { debug: true });\n run('Softmax', softMax);\n run('Mixtime', mixTime);\n run('Tight', tightNotes1);\n run('Tight 2', tightNotes2);\n run('Annotations', annotations);\n run('Proportional Formatting - No Tuning', proportional, { debug: true, iterations: 0 });\n run('Proportional Formatting - No Justification', proportional, { justify: false, debug: true, iterations: 0 });\n run('Proportional Formatting (20 iterations)', proportional, { debug: true, iterations: 20, alpha: 0.5 });\n },\n};\n/** Calculate the glyph's width in the current music font. */\n// How is this different from Glyph.getWidth()? The numbers don't match up.\nfunction getGlyphWidth(glyphName) {\n // `38` seems to be the `font_scale` specified in many classes, such as\n // Accidental, Articulation, Ornament, Strokes. Does this mean `38pt`???\n //\n // However, tables.ts specifies:\n // NOTATION_FONT_SCALE: 39,\n // TABLATURE_FONT_SCALE: 39,\n const musicFont = Tables.currentMusicFont();\n const glyph = musicFont.getGlyphs()[glyphName];\n const widthInEm = (glyph.x_max - glyph.x_min) / musicFont.getResolution();\n return widthInEm * 38 * Font.scaleToPxFrom.pt;\n}\nfunction buildTickContexts() {\n function createTickable(beat) {\n return new MockTickable().setTicks(beat);\n }\n const BEAT = (1 * Flow.RESOLUTION) / 4;\n const tickables1 = [\n createTickable(BEAT).setWidth(10),\n createTickable(BEAT * 2).setWidth(20),\n createTickable(BEAT).setWidth(30),\n ];\n const tickables2 = [\n createTickable(BEAT * 2).setWidth(10),\n createTickable(BEAT).setWidth(20),\n createTickable(BEAT).setWidth(30),\n ];\n const voice1 = new Voice(Flow.TIME4_4);\n const voice2 = new Voice(Flow.TIME4_4);\n voice1.addTickables(tickables1);\n voice2.addTickables(tickables2);\n const formatter = new Formatter();\n const tContexts = formatter.createTickContexts([voice1, voice2]);\n equal(tContexts.list.length, 4, 'Voices should have four tick contexts');\n throws(() => formatter.getMinTotalWidth(), /NoMinTotalWidth/, 'Expected to throw exception');\n ok(formatter.preCalculateMinTotalWidth([voice1, voice2]), 'Successfully runs preCalculateMinTotalWidth');\n equal(formatter.getMinTotalWidth(), 88, 'Get minimum total width without passing voices');\n formatter.preFormat();\n equal(formatter.getMinTotalWidth(), 88, 'Minimum total width');\n equal(tickables1[0].getX(), tickables2[0].getX(), 'First notes of both voices have the same X');\n equal(tickables1[2].getX(), tickables2[2].getX(), 'Last notes of both voices have the same X');\n ok(tickables1[1].getX() < tickables2[1].getX(), 'Second note of voice 2 is to the right of the second note of voice 1');\n}\nfunction rightJustify(options) {\n const f = VexFlowTests.makeFactory(options, 1200, 300);\n const getTickables = (time, n, duration) => {\n const tickar = [];\n let i = 0;\n for (i = 0; i < n; ++i) {\n tickar.push(new StaveNote({ keys: ['f/4'], duration }));\n }\n return new Voice(time).addTickables(tickar);\n };\n const renderTest = (time, n, duration, x, width) => {\n const formatter = f.Formatter();\n const stave = f.Stave({ x, y: 40, width });\n // stave.addClef('treble').addTimeSignature('4/4');\n const voice = getTickables(time, n, duration);\n formatter.joinVoices([voice]).formatToStave([voice], stave);\n stave.draw();\n voice.draw(f.getContext(), stave);\n };\n renderTest({ num_beats: 4, beat_value: 4, resolution: 4 * 4096 }, 2, '2', 10, 300);\n renderTest({ num_beats: 4, beat_value: 4, resolution: 4 * 4096 }, 1, 'w', 310, 300);\n renderTest({ num_beats: 3, beat_value: 4, resolution: 4 * 4096 }, 3, '4', 610, 300);\n renderTest({ num_beats: 3, beat_value: 4, resolution: 4 * 4096 }, 6, '8', 910, 300);\n ok(true);\n}\nfunction noteHeadPadding(options) {\n const registry = new Registry();\n Registry.enableDefaultRegistry(registry);\n const f = VexFlowTests.makeFactory(options, 600, 300);\n const score = f.EasyScore();\n score.set({ time: '9/8' });\n const notes1 = score.notes('(d5 f5)/8,(c5 e5)/8,(d5 f5)/8,(c5 e5)/2.');\n const beams = [new Beam(notes1.slice(0, 3), true)];\n const voice1 = new Voice().setMode(Voice.Mode.SOFT);\n const notes2 = score.notes('(g4 an4)/2.,(g4 a4)/4.', { clef: 'treble' });\n const voice2 = new Voice().setMode(Voice.Mode.SOFT);\n voice2.addTickables(notes2);\n voice1.addTickables(notes1);\n const formatter = f.Formatter().joinVoices([voice1]).joinVoices([voice2]);\n const width = formatter.preCalculateMinTotalWidth([voice1, voice2]);\n formatter.format([voice1, voice2], width);\n const staveWidth = width + Stave.defaultPadding;\n const stave1 = f.Stave({ y: 50, width: staveWidth });\n const stave2 = f.Stave({ y: 150, width: staveWidth });\n stave1.draw();\n stave2.draw();\n voice1.draw(f.getContext(), stave1);\n voice2.draw(f.getContext(), stave2);\n beams.forEach((b) => b.setContext(f.getContext()).draw());\n ok(true);\n}\nfunction longMeasureProblems(options) {\n const registry = new Registry();\n Registry.enableDefaultRegistry(registry);\n const f = VexFlowTests.makeFactory(options, 1500, 300);\n const score = f.EasyScore();\n score.set({ time: '4/4' });\n const notes1 = score.notes('b4/4,b4/8,b4/8,b4/4,b4/4,b4/2,b4/2,b4/4,b4/8,b4/8,b4/4,b4/4,b4/2,b4/2,b4/4,b4/8,b4/8,b4/4,b4/4,b4/2,b4/2,b4/4,b4/2,b4/8,b4/8');\n const voice1 = new Voice().setMode(Voice.Mode.SOFT);\n const notes2 = score.notes('d3/4,(ab3 f4)/2,d3/4,ab3/4,d3/2,ab3/4,d3/4,ab3/2,d3/4,ab3/4,d3/2,ab3/4,d3/4,ab3/2,d3/4,ab3/4,d3/2,ab3/4,d4/4,d4/2,d4/4', { clef: 'bass' });\n const voice2 = new Voice().setMode(Voice.Mode.SOFT);\n voice2.addTickables(notes2);\n voice1.addTickables(notes1);\n const formatter = f.Formatter().joinVoices([voice1]).joinVoices([voice2]);\n const width = formatter.preCalculateMinTotalWidth([voice1, voice2]);\n formatter.format([voice1, voice2], width);\n const stave1 = f.Stave({ y: 50, width: width + Stave.defaultPadding });\n const stave2 = f.Stave({ y: 200, width: width + Stave.defaultPadding });\n stave1.draw();\n stave2.draw();\n voice1.draw(f.getContext(), stave1);\n voice2.draw(f.getContext(), stave2);\n ok(true);\n}\nfunction accidentalJustification(options) {\n const f = VexFlowTests.makeFactory(options, 600, 300);\n const score = f.EasyScore();\n const notes11 = score.notes('a4/2, a4/4, a4/8, ab4/16, an4/16');\n const voice11 = score.voice(notes11, { time: '4/4' });\n const notes21 = score.notes('c4/2, d4/8, d4/8, e4/8, e4/8');\n const voice21 = score.voice(notes21, { time: '4/4' });\n let beams = Beam.generateBeams(notes11.slice(2));\n beams = beams.concat(beams, Beam.generateBeams(notes21.slice(1, 3)));\n beams = beams.concat(Beam.generateBeams(notes21.slice(3)));\n const formatter = f.Formatter({ softmaxFactor: 100 }).joinVoices([voice11]).joinVoices([voice21]);\n const width = formatter.preCalculateMinTotalWidth([voice11, voice21]);\n const stave11 = f.Stave({ y: 20, width: width + Stave.defaultPadding });\n const stave21 = f.Stave({ y: 130, width: width + Stave.defaultPadding });\n formatter.format([voice11, voice21], width);\n const ctx = f.getContext();\n stave11.setContext(ctx).draw();\n stave21.setContext(ctx).draw();\n voice11.draw(ctx, stave11);\n voice21.draw(ctx, stave21);\n beams.forEach((b) => b.setContext(ctx).draw());\n ok(true);\n}\nfunction unalignedNoteDurations1(options) {\n const f = VexFlowTests.makeFactory(options, 600, 250);\n const score = f.EasyScore();\n const notes11 = [\n new StaveNote({ keys: ['a/4'], duration: '8' }),\n new StaveNote({ keys: ['b/4'], duration: '4' }),\n new StaveNote({ keys: ['b/4'], duration: '8' }),\n ];\n const notes21 = [\n new StaveNote({ keys: ['a/4'], duration: '16' }),\n new StaveNote({ keys: ['b/4.'], duration: '4' }),\n new StaveNote({ keys: ['a/4'], duration: '8d' }),\n ];\n Dot.buildAndAttach([notes21[2]], { all: true });\n const ctx = f.getContext();\n const voice11 = score.voice(notes11, { time: '2/4' }).setMode(Voice.Mode.SOFT);\n const voice21 = score.voice(notes21, { time: '2/4' }).setMode(Voice.Mode.SOFT);\n const beams21 = Beam.generateBeams(notes21);\n const beams11 = Beam.generateBeams(notes11);\n const formatter = new Formatter();\n formatter.joinVoices([voice11]);\n formatter.joinVoices([voice21]);\n const width = formatter.preCalculateMinTotalWidth([voice11, voice21]);\n const stave11 = f.Stave({ y: 20, width: width + Stave.defaultPadding });\n const stave21 = f.Stave({ y: 130, width: width + Stave.defaultPadding });\n formatter.format([voice11, voice21], width);\n stave11.setContext(ctx).draw();\n stave21.setContext(ctx).draw();\n voice11.draw(ctx, stave11);\n voice21.draw(ctx, stave21);\n beams21.forEach((b) => b.setContext(ctx).draw());\n beams11.forEach((b) => b.setContext(ctx).draw());\n ok(voice11.getTickables()[1].getX() > voice21.getTickables()[1].getX());\n}\nfunction unalignedNoteDurations2(options) {\n const notes1 = [\n new StaveNote({ keys: ['b/4'], duration: '8r' }),\n new StaveNote({ keys: ['g/4'], duration: '16' }),\n new StaveNote({ keys: ['c/5'], duration: '16' }),\n new StaveNote({ keys: ['e/5'], duration: '16' }),\n new StaveNote({ keys: ['g/4'], duration: '16' }),\n new StaveNote({ keys: ['c/5'], duration: '16' }),\n new StaveNote({ keys: ['e/5'], duration: '16' }),\n new StaveNote({ keys: ['b/4'], duration: '8r' }),\n new StaveNote({ keys: ['g/4'], duration: '16' }),\n new StaveNote({ keys: ['c/5'], duration: '16' }),\n new StaveNote({ keys: ['e/5'], duration: '16' }),\n new StaveNote({ keys: ['g/4'], duration: '16' }),\n new StaveNote({ keys: ['c/5'], duration: '16' }),\n new StaveNote({ keys: ['e/5'], duration: '16' }),\n ];\n const notes2 = [\n new StaveNote({ keys: ['a/4'], duration: '16r' }),\n new StaveNote({ keys: ['e/4.'], duration: '8d' }),\n new StaveNote({ keys: ['e/4'], duration: '4' }),\n new StaveNote({ keys: ['a/4'], duration: '16r' }),\n new StaveNote({ keys: ['e/4.'], duration: '8d' }),\n new StaveNote({ keys: ['e/4'], duration: '4' }),\n ];\n const f = VexFlowTests.makeFactory(options, 750, 280);\n const context = f.getContext();\n const voice1 = new Voice({ num_beats: 4, beat_value: 4 });\n voice1.addTickables(notes1);\n const voice2 = new Voice({ num_beats: 4, beat_value: 4 });\n voice2.addTickables(notes2);\n const formatter = new Formatter({ softmaxFactor: 100, globalSoftmax: options.params.globalSoftmax });\n formatter.joinVoices([voice1]);\n formatter.joinVoices([voice2]);\n const width = formatter.preCalculateMinTotalWidth([voice1, voice2]);\n formatter.format([voice1, voice2], width);\n const stave1 = new Stave(10, 40, width + Stave.defaultPadding);\n const stave2 = new Stave(10, 100, width + Stave.defaultPadding);\n stave1.setContext(context).draw();\n stave2.setContext(context).draw();\n voice1.draw(context, stave1);\n voice2.draw(context, stave2);\n ok(voice1.getTickables()[1].getX() > voice2.getTickables()[1].getX());\n}\nfunction alignedMixedElements(options) {\n const f = VexFlowTests.makeFactory(options, 800, 500);\n const context = f.getContext();\n const stave = new Stave(10, 200, 400);\n const stave2 = new Stave(410, 200, 400);\n const notes = [\n new StaveNote({ keys: ['c/5'], duration: '8' })\n .addModifier(new Accidental('##'), 0)\n .addModifier(new FretHandFinger('4').setPosition(ModifierPosition.BELOW), 0)\n .addModifier(new StringNumber('3').setPosition(ModifierPosition.BELOW), 0)\n .addModifier(new Articulation('a.').setPosition(ModifierPosition.BELOW), 0)\n .addModifier(new Articulation('a>').setPosition(ModifierPosition.BELOW), 0)\n .addModifier(new Articulation('a^').setPosition(ModifierPosition.BELOW), 0)\n .addModifier(new Articulation('am').setPosition(ModifierPosition.BELOW), 0)\n .addModifier(new Articulation('a@u').setPosition(ModifierPosition.BELOW), 0)\n .addModifier(new Annotation('yyyy').setVerticalJustification(AnnotationVerticalJustify.BOTTOM), 0)\n .addModifier(new Annotation('xxxx').setVerticalJustification(AnnotationVerticalJustify.BOTTOM).setFont('sans-serif', 20), 0)\n .addModifier(new Annotation('ttt').setVerticalJustification(AnnotationVerticalJustify.BOTTOM).setFont('sans-serif', 20), 0),\n new StaveNote({ keys: ['c/5'], duration: '8', stem_direction: Stem.DOWN })\n .addModifier(new StringNumber('3').setPosition(ModifierPosition.BELOW), 0)\n .addModifier(new Articulation('a.').setPosition(ModifierPosition.BELOW), 0)\n .addModifier(new Articulation('a>').setPosition(ModifierPosition.BELOW), 0),\n new StaveNote({ keys: ['c/5'], duration: '8' }),\n ];\n const notes2 = [\n new StaveNote({ keys: ['c/5'], duration: '8' })\n .addModifier(new StringNumber('3').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(new Articulation('a.').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(new Annotation('yyyy').setVerticalJustification(AnnotationVerticalJustify.TOP), 0),\n new StaveNote({ keys: ['c/5'], duration: '8', stem_direction: Stem.DOWN })\n .addModifier(new FretHandFinger('4').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(new StringNumber('3').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(new Articulation('a.').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(new Articulation('a>').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(new Articulation('a^').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(new Articulation('am').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(new Articulation('a@u').setPosition(ModifierPosition.ABOVE), 0)\n .addModifier(new Annotation('yyyy').setVerticalJustification(AnnotationVerticalJustify.TOP), 0)\n .addModifier(new Annotation('xxxx').setVerticalJustification(AnnotationVerticalJustify.TOP).setFont('sans-serif', 20), 0)\n .addModifier(new Annotation('ttt').setVerticalJustification(AnnotationVerticalJustify.TOP).setFont('sans-serif', 20), 0),\n new StaveNote({ keys: ['c/5'], duration: '8' }),\n ];\n const tuplet = new Tuplet(notes).setTupletLocation(-1);\n const tuplet2 = new Tuplet(notes2).setTupletLocation(1);\n Formatter.FormatAndDraw(context, stave, notes);\n Formatter.FormatAndDraw(context, stave2, notes2);\n stave.setContext(context).draw();\n stave2.setContext(context).draw();\n tuplet.setContext(context).draw();\n tuplet2.setContext(context).draw();\n ok(true);\n}\nfunction justifyStaveNotes(options) {\n const f = VexFlowTests.makeFactory(options, 520, 280);\n const ctx = f.getContext();\n const score = f.EasyScore();\n let y = 30;\n function justifyToWidth(width) {\n f.Stave({ y: y }).addClef('treble');\n const voices = [\n score.voice(score.notes('(cbb4 en4 a4)/2, (d4 e4 f4)/8, (d4 f4 a4)/8, (cn4 f#4 a4)/4', { stem: 'down' })),\n score.voice(score.notes('(bb4 e#5 a5)/4, (d5 e5 f5)/2, (c##5 fb5 a5)/4', { stem: 'up' })),\n ];\n f.Formatter()\n .joinVoices(voices)\n .format(voices, width - (Stave.defaultPadding + getGlyphWidth('gClef')));\n // Show the the width of notes via a horizontal line with red, green, yellow, blue, gray indicators.\n voices[0].getTickables().forEach((note) => Note.plotMetrics(ctx, note, y + 140)); // Bottom line.\n voices[1].getTickables().forEach((note) => Note.plotMetrics(ctx, note, y - 20)); // Top Line\n y += 210;\n }\n justifyToWidth(520);\n f.draw();\n ok(true);\n}\nfunction notesWithTab(options) {\n const f = VexFlowTests.makeFactory(options, 420, 580);\n const score = f.EasyScore();\n let y = 10;\n function justifyToWidth(width) {\n const stave = f.Stave({ y: y }).addClef('treble');\n const voice = score.voice(score.notes('d#4/2, (c4 d4)/8, d4/8, (c#4 e4 a4)/4', { stem: 'up' }));\n y += 100;\n f.TabStave({ y: y }).addTabGlyph().setNoteStartX(stave.getNoteStartX());\n const tabVoice = score.voice([\n f.TabNote({ positions: [{ str: 3, fret: 6 }], duration: '2' }).addModifier(new Bend('Full'), 0),\n f\n .TabNote({\n positions: [\n { str: 2, fret: 3 },\n { str: 3, fret: 5 },\n ],\n duration: '8',\n })\n .addModifier(new Bend('Unison'), 1),\n f.TabNote({ positions: [{ str: 3, fret: 7 }], duration: '8' }),\n f.TabNote({\n positions: [\n { str: 3, fret: 6 },\n { str: 4, fret: 7 },\n { str: 2, fret: 5 },\n ],\n duration: '4',\n }),\n ]);\n f.Formatter().joinVoices([voice]).joinVoices([tabVoice]).format([voice, tabVoice], width);\n y += 150;\n }\n justifyToWidth(0);\n justifyToWidth(300);\n f.draw();\n ok(true);\n}\nfunction multiStaves(options) {\n const f = VexFlowTests.makeFactory(options, 600, 400);\n const ctx = f.getContext();\n const score = f.EasyScore();\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // Draw 3 Staves (one measure each).\n const notes11 = score.notes('f4/4, d4/8, g4/4, eb4/8');\n const notes21 = score.notes('d4/8, d4, d4, d4, e4, eb4');\n const notes31 = score.notes('a5/8, a5, a5, a5, a5, a5', { stem: 'down' });\n let voices = [\n score.voice(notes11, { time: '6/8' }),\n score.voice(notes21, { time: '6/8' }),\n score.voice(notes31, { time: '6/8' }),\n ];\n let formatter = f.Formatter();\n voices.forEach((v) => formatter.joinVoices([v]));\n let width = formatter.preCalculateMinTotalWidth(voices);\n formatter.format(voices, width);\n let beams = [\n new Beam(notes21.slice(0, 3), true),\n new Beam(notes21.slice(3, 6), true),\n new Beam(notes31.slice(0, 3), true),\n new Beam(notes31.slice(3, 6), true),\n ];\n const staveYs = [20, 130, 250];\n let staveWidth = width + getGlyphWidth('gClef') + getGlyphWidth('timeSig8') + Stave.defaultPadding;\n let staves = [\n f.Stave({ y: staveYs[0], width: staveWidth }).addClef('treble').addTimeSignature('6/8'),\n f.Stave({ y: staveYs[1], width: staveWidth }).addClef('treble').addTimeSignature('6/8'),\n f.Stave({ y: staveYs[2], width: staveWidth }).addClef('bass').addTimeSignature('6/8'),\n ];\n f.StaveConnector({\n top_stave: staves[1],\n bottom_stave: staves[2],\n type: 'brace',\n });\n for (let i = 0; i < staves.length; ++i) {\n staves[i].setContext(ctx).draw();\n voices[i].draw(ctx, staves[i]);\n }\n beams.forEach((beam) => beam.setContext(ctx).draw());\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // Draw 3 more staves (one measure each).\n // These are adjacent to the first set of staves, representing the second measure of each stave.\n const notes12 = score.notes('ab4/4, bb4/8, (cb5 eb5)/4[stem=\"down\"], d5/8[stem=\"down\"]');\n const notes22 = score.notes('(eb4 ab4)/4., (c4 eb4 ab4)/4, db5/8', { stem: 'up' });\n const notes32 = score.notes('a5/8, a5, a5, a5, a5, a5', { stem: 'down' });\n voices = [\n score.voice(notes12, { time: '6/8' }),\n score.voice(notes22, { time: '6/8' }),\n score.voice(notes32, { time: '6/8' }),\n ];\n formatter = f.Formatter();\n voices.forEach((v) => formatter.joinVoices([v]));\n width = formatter.preCalculateMinTotalWidth(voices);\n const staveX = staves[0].getX() + staves[0].getWidth();\n staveWidth = width + Stave.defaultPadding;\n staves = [\n f.Stave({ x: staveX, y: staveYs[0], width: staveWidth }),\n f.Stave({ x: staveX, y: staveYs[1], width: staveWidth }),\n f.Stave({ x: staveX, y: staveYs[2], width: staveWidth }),\n ];\n formatter.format(voices, width);\n beams = [\n // Add beams to each group of 3 notes.\n new Beam(notes32.slice(0, 3), true),\n new Beam(notes32.slice(3, 6), true),\n ];\n for (let i = 0; i < staves.length; ++i) {\n staves[i].setContext(ctx).draw();\n voices[i].draw(ctx, staves[i]);\n voices[i].getTickables().forEach((note) => Note.plotMetrics(ctx, note, staveYs[i] - 20));\n }\n beams.forEach((beam) => beam.setContext(ctx).draw());\n ok(true);\n}\nfunction proportional(options) {\n const debug = options.params.debug;\n Registry.enableDefaultRegistry(new Registry());\n const f = VexFlowTests.makeFactory(options, 775, 750);\n const system = f.System({\n x: 50,\n autoWidth: true,\n debugFormatter: debug,\n noJustification: !(options.params.justify === undefined && true),\n formatIterations: options.params.iterations,\n details: { alpha: options.params.alpha },\n });\n const score = f.EasyScore();\n const voices = [\n score.notes('c5/8, c5'),\n score.tuplet(score.notes('a4/8, a4, a4'), { notes_occupied: 2 }),\n score.notes('c5/16, c5, c5, c5'),\n score.tuplet(score.notes('a4/16, a4, a4, a4, a4'), { notes_occupied: 4 }),\n score.tuplet(score.notes('a4/32, a4, a4, a4, a4, a4, a4'), { notes_occupied: 8 }),\n ];\n const createVoice = (notes) => score.voice(notes, { time: '1/4' });\n const createStave = (voice) => system\n .addStave({ voices: [voice], debugNoteMetrics: debug })\n .addClef('treble')\n .addTimeSignature('1/4');\n voices.map(createVoice).forEach(createStave);\n system.addConnector().setType(StaveConnector.type.BRACKET);\n f.draw();\n // Debugging: Show how many elements of each type we have added.\n // const typeMap = Registry.getDefaultRegistry().index.type;\n // const table = Object.keys(typeMap).map((typeName) => typeName + ': ' + Object.keys(typeMap[typeName]).length);\n // console.log(table);\n Registry.disableDefaultRegistry();\n ok(true);\n}\nfunction softMax(options) {\n const f = VexFlowTests.makeFactory(options, 550, 500);\n f.getContext().scale(0.8, 0.8);\n function draw(y, factor) {\n const score = f.EasyScore();\n const system = f.System({\n x: 100,\n y,\n details: { softmaxFactor: factor },\n autoWidth: true,\n });\n system\n .addStave({\n voices: [\n score.voice(score\n .notes('C#5/h, a4/q')\n .concat(score.beam(score.notes('Abb4/8, A4/8')))\n .concat(score.beam(score.notes('A4/16, A#4, A4, Ab4/32, A4'))), { time: '5/4' }),\n ],\n })\n .addClef('treble')\n .addTimeSignature('5/4');\n f.draw();\n ok(true);\n }\n draw(50, 1);\n draw(150, 2);\n draw(250, 10);\n draw(350, 20);\n draw(450, 200);\n}\nfunction mixTime(options) {\n const f = VexFlowTests.makeFactory(options, 400 + Stave.defaultPadding, 250);\n f.getContext().scale(0.8, 0.8);\n const score = f.EasyScore();\n const system = f.System({\n details: { softmaxFactor: 100 },\n autoWidth: true,\n debugFormatter: true,\n });\n system\n .addStave({\n voices: [score.voice(score.notes('C#5/q, B4').concat(score.beam(score.notes('A4/8, E4, C4, D4'))))],\n })\n .addClef('treble')\n .addTimeSignature('4/4');\n system\n .addStave({\n voices: [score.voice(score.notes('C#5/q, B4, B4').concat(score.tuplet(score.beam(score.notes('A4/8, E4, C4')))))],\n })\n .addClef('treble')\n .addTimeSignature('4/4');\n f.draw();\n ok(true);\n}\nfunction tightNotes1(options) {\n const f = VexFlowTests.makeFactory(options, 440, 250);\n f.getContext().scale(0.8, 0.8);\n const score = f.EasyScore();\n const system = f.System({\n autoWidth: true,\n debugFormatter: true,\n details: { maxIterations: 10 },\n });\n system\n .addStave({\n voices: [\n score.voice(score.beam(score.notes('B4/16, B4, B4, B4, B4, B4, B4, B4')).concat(score.notes('B4/q, B4'))),\n ],\n })\n .addClef('treble')\n .addTimeSignature('4/4');\n system\n .addStave({\n voices: [\n score.voice(score.notes('B4/q, B4').concat(score.beam(score.notes('B4/16, B4, B4, B4, B4, B4, B4, B4')))),\n ],\n })\n .addClef('treble')\n .addTimeSignature('4/4');\n f.draw();\n ok(true);\n}\nfunction tightNotes2(options) {\n const f = VexFlowTests.makeFactory(options, 440, 250);\n f.getContext().scale(0.8, 0.8);\n const score = f.EasyScore();\n const system = f.System({\n autoWidth: true,\n debugFormatter: true,\n });\n system\n .addStave({\n voices: [\n score.voice(score.beam(score.notes('B4/16, B4, B4, B4, B4, B4, B4, B4')).concat(score.notes('B4/q, B4'))),\n ],\n })\n .addClef('treble')\n .addTimeSignature('4/4');\n system\n .addStave({\n voices: [score.voice(score.notes('B4/w'))],\n })\n .addClef('treble')\n .addTimeSignature('4/4');\n f.draw();\n ok(true);\n}\nfunction annotations(options) {\n const pageWidth = 916;\n const pageHeight = 600;\n const f = VexFlowTests.makeFactory(options, pageWidth, pageHeight);\n const context = f.getContext();\n const lyrics1 = ['ipso', 'ipso-', 'ipso', 'ipso', 'ipsoz', 'ipso-', 'ipso', 'ipso', 'ipso', 'ip', 'ipso'];\n const lyrics2 = ['ipso', 'ipso-', 'ipsoz', 'ipso', 'ipso', 'ipso-', 'ipso', 'ipso', 'ipso', 'ip', 'ipso'];\n const smar = [\n {\n sm: 5,\n width: 550,\n lyrics: lyrics1,\n title: '550px,softMax:5',\n },\n {\n sm: 10,\n width: 550,\n lyrics: lyrics2,\n title: '550px,softmax:10,different word order',\n },\n {\n sm: 5,\n width: 550,\n lyrics: lyrics2,\n title: '550px,softmax:5',\n },\n {\n sm: 100,\n width: 550,\n lyrics: lyrics2,\n title: '550px,softmax:100',\n },\n ];\n const rowSize = 140;\n const beats = 12;\n const beatsPer = 8;\n const beamGroup = 3;\n const durations = ['8d', '16', '8', '8d', '16', '8', '8d', '16', '8', '4', '8'];\n const beams = [];\n let y = 40;\n smar.forEach((sm) => {\n const stave = new Stave(10, y, sm.width);\n const notes = [];\n let iii = 0;\n context.fillText(sm.title, 100, y);\n y += rowSize;\n durations.forEach((dd) => {\n const note = new StaveNote({ keys: ['b/4'], duration: dd });\n if (dd.indexOf('d') >= 0) {\n Dot.buildAndAttach([note], { all: true });\n }\n if (sm.lyrics.length > iii) {\n note.addModifier(new Annotation(sm.lyrics[iii])\n .setVerticalJustification(Annotation.VerticalJustify.BOTTOM)\n .setFont(Font.SERIF, 12, FontWeight.NORMAL));\n }\n notes.push(note);\n iii += 1;\n });\n notes.forEach((note) => {\n if (note.getDuration().indexOf('d') >= 0) {\n Dot.buildAndAttach([note], { all: true });\n }\n });\n // Don't beam the last group\n let notesToBeam = [];\n notes.forEach((note) => {\n if (note.getIntrinsicTicks() < 4096) {\n notesToBeam.push(note);\n if (notesToBeam.length >= beamGroup) {\n beams.push(new Beam(notesToBeam));\n notesToBeam = [];\n }\n }\n else {\n notesToBeam = [];\n }\n });\n const voice1 = new Voice({ num_beats: beats, beat_value: beatsPer }).setMode(Voice.Mode.SOFT).addTickables(notes);\n const fmt = new Formatter({ softmaxFactor: sm.sm, maxIterations: 2 }).joinVoices([voice1]);\n fmt.format([voice1], sm.width - 11);\n stave.setContext(context).draw();\n voice1.draw(context, stave);\n beams.forEach((b) => b.setContext(context).draw());\n });\n ok(true);\n}\nVexFlowTests.register(FormatterTests);\nexport { FormatterTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Fraction Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Fraction } from '../src/fraction';\nconst FractionTests = {\n Start() {\n QUnit.module('Fraction');\n test('Basic', basic);\n test('With Other Fractions', withOtherFractions);\n },\n};\nfunction basic() {\n const f_1_2 = new Fraction(1, 2);\n ok(f_1_2.equals(0.5), 'Fraction: 1/2 equals 0.5');\n ok(f_1_2.equals(new Fraction(1, 2)), 'Fraction: 1/2 equals 1/2');\n ok(f_1_2.equals(new Fraction(2, 4)), 'Fraction: 1/2 equals 2/4');\n notOk(f_1_2.greaterThan(1), 'Fraction: ! 1/2 > 1');\n ok(f_1_2.greaterThan(0.2), 'Fraction: 1/2 > 0.2');\n ok(f_1_2.greaterThanEquals(0.2), 'Fraction: 1/2 >= 0.2');\n ok(f_1_2.greaterThanEquals(0.5), 'Fraction: 1/2 >= 0.5');\n notOk(f_1_2.greaterThanEquals(1), 'Fraction: ! 1/2 >= 1');\n notOk(f_1_2.lessThan(0.5), 'Fraction: ! 1/2 < 0.5');\n ok(f_1_2.lessThan(1), 'Fraction: 1/2 < 1');\n ok(f_1_2.lessThanEquals(0.6), 'Fraction: 1/2 <= 0.6');\n ok(f_1_2.lessThanEquals(0.5), 'Fraction: 1/2 <= 0.5');\n notOk(f_1_2.lessThanEquals(0.4), 'Fraction: ! 1/2 <= 0.4');\n const f_05 = f_1_2.copy(0.5);\n strictEqual(f_05, f_1_2, 'Fraction: f_05 === f_1_2');\n strictEqual(f_05.toString(), '0.5/1', 'Fraction: f_05.toString() === \"0.5/1\"');\n strictEqual(f_05.toSimplifiedString(), '1/2', 'Fraction: f_05.toSimplifiedString() === \"1/2\"');\n const tF_n = f_05.clone();\n notStrictEqual(tF_n, f_05, 'Fraction: tF_n !== f_05');\n notEqual(tF_n, f_05, 'Fraction: tF_n != f_05');\n deepEqual(tF_n, f_05, 'tF_n deepEqual f_05');\n notDeepEqual(tF_n, {}, 'tF_n notDeepEqual {}');\n tF_n.subtract(-0.5);\n ok(tF_n.equals(1), 'Fraction: 0.5 -(-0.5) equals 1');\n tF_n.add(1);\n ok(tF_n.equals(2), 'Fraction: 1 + 1 equals 2');\n tF_n.multiply(2);\n ok(tF_n.equals(4), 'Fraction: 2 * 2 equals 4');\n tF_n.divide(2);\n ok(tF_n.equals(2), 'Fraction: 4 / 2 equals 2');\n // Lowest common multiple.\n equal(Fraction.LCMM([]), 0);\n equal(Fraction.LCMM([17]), 17);\n equal(Fraction.LCMM([2, 5]), 10);\n equal(Fraction.LCMM([15, 3, 5]), 15);\n equal(Fraction.LCMM([2, 4, 6]), 12);\n equal(Fraction.LCMM([2, 3, 4, 5]), 60);\n equal(Fraction.LCMM([12, 15, 10, 75]), 300);\n // Greatest common divisor.\n equal(Fraction.GCD(0, 0), 0);\n equal(Fraction.GCD(0, 99), 99);\n equal(Fraction.GCD(77, 0), 77);\n equal(Fraction.GCD(42, 14), 14);\n equal(Fraction.GCD(15, 10), 5);\n}\nfunction withOtherFractions() {\n const f_1_2 = new Fraction(1, 2);\n const f_1_4 = new Fraction(1, 4);\n const f_1_8 = new Fraction(1, 8);\n const f_2 = new Fraction(2, 1);\n // IMPORTANT NOTE: Fraction methods modify the existing Fraction object.\n // They do not return new objects.\n // Use clone() if you don't want to modify the original object.\n const a = f_1_2.clone().multiply(f_1_2);\n ok(a.equals(f_1_4), '1/2 x 1/2 == 1/4');\n const b = f_1_2.clone().divide(f_1_4);\n ok(b.equals(f_2), '1/2 / 1/4 == 2');\n const c = f_2.clone().subtract(f_1_2).subtract(f_1_2).subtract(f_1_4); // 3/4\n const d = f_1_8.clone().add(f_1_8).add(f_1_8).multiply(f_2);\n ok(c.equals(d), '2-1/2-1/2-1/4 == (1/8+1/8+1/8)*(2/1)');\n equal(c.value(), 0.75, '3/4 == 0.75');\n const e = f_1_8.clone().add(f_1_4).add(f_1_8);\n ok(e.equals(f_1_2), '1/8 + 1/4 + 1/8 == 1/2');\n}\nVexFlowTests.register(FractionTests);\nexport { FractionTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// GhostNote Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nconst GhostNoteTests = {\n Start() {\n QUnit.module('GhostNote');\n const run = VexFlowTests.runTests;\n run('GhostNote Basic', basic);\n run('GhostNote Dotted', dotted);\n },\n};\n/**\n * Helper function to set up the stave, easyscore, voice, and to format & draw.\n */\nfunction createTest(addItems) {\n return (options) => {\n const factory = VexFlowTests.makeFactory(options, 550);\n const stave = factory.Stave();\n const score = factory.EasyScore();\n addItems(factory, score);\n const voices = factory.getVoices();\n factory.Formatter().joinVoices(voices).formatToStave(voices, stave);\n factory.draw();\n ok(true, 'all pass');\n };\n}\nconst basic = createTest((f, score) => {\n // Top Voice\n const voiceTop = score.voice(score.notes('f#5/4, f5, db5, c5, c5/8, d5, fn5, e5, d5, c5', { stem: 'up' }), {\n time: '7/4',\n });\n const notesTop = voiceTop.getTickables();\n f.Beam({ notes: notesTop.slice(4, 8) });\n f.Beam({ notes: notesTop.slice(8, 10) });\n // Bottom Voice\n score.voice([\n f.GhostNote({ duration: '2' }),\n f.StaveNote({ keys: ['f/4'], stem_direction: -1, duration: '4' }),\n f.GhostNote({ duration: '4' }),\n f.StaveNote({ keys: ['e/4'], stem_direction: -1, duration: '4' }),\n f.GhostNote({ duration: '8' }),\n f.StaveNote({ keys: ['d/4'], stem_direction: -1, duration: '8' }).addModifier(f.Accidental({ type: '##' }), 0),\n f.StaveNote({ keys: ['c/4'], stem_direction: -1, duration: '8' }),\n f.StaveNote({ keys: ['c/4'], stem_direction: -1, duration: '8' }),\n ], { time: '7/4' });\n});\n/**\n * A ghost note is invisible, but takes up space on the stave corresponding to its duration.\n * '4d' is a dotted quarter note, equivalent to a quarter + eighth note.\n */\nconst dotted = createTest((f, score) => {\n const voice1 = score.voice([\n f.GhostNote({ duration: '4d' }),\n f.StaveNote({ duration: '8', keys: ['f/5'], stem_direction: 1 }),\n f.StaveNote({ duration: '4', keys: ['d/5'], stem_direction: 1 }),\n f.StaveNote({ duration: '8', keys: ['c/5'], stem_direction: 1 }),\n f.StaveNote({ duration: '16', keys: ['c/5'], stem_direction: 1 }),\n f.StaveNote({ duration: '16', keys: ['d/5'], stem_direction: 1 }),\n f.GhostNote({ duration: '2dd' }),\n f.StaveNote({ duration: '8', keys: ['f/5'], stem_direction: 1 }),\n ], { time: '8/4' });\n const voice2 = score.voice([\n f.StaveNote({ duration: '4', keys: ['f/4'], stem_direction: -1 }),\n f.StaveNote({ duration: '8', keys: ['e/4'], stem_direction: -1 }),\n f.StaveNote({ duration: '8', keys: ['d/4'], stem_direction: -1 }),\n f.GhostNote({ duration: '4dd' }),\n f.StaveNote({ duration: '16', keys: ['c/4'], stem_direction: -1 }),\n f.StaveNote({ duration: '2', keys: ['c/4'], stem_direction: -1 }),\n f.StaveNote({ duration: '4', keys: ['d/4'], stem_direction: -1 }),\n f.StaveNote({ duration: '8', keys: ['f/4'], stem_direction: -1 }),\n f.StaveNote({ duration: '8', keys: ['e/4'], stem_direction: -1 }),\n ], { time: '8/4' });\n const notes1 = voice1.getTickables();\n const notes2 = voice2.getTickables();\n const addAccidental = (note, type) => note.addModifier(f.Accidental({ type }), 0);\n addAccidental(notes1[1], 'bb');\n addAccidental(notes1[4], '#');\n addAccidental(notes1[7], 'n');\n addAccidental(notes2[0], '#');\n addAccidental(notes2[4], 'b');\n addAccidental(notes2[5], '#');\n addAccidental(notes2[7], 'n');\n f.Beam({ notes: notes1.slice(3, 6) });\n f.Beam({ notes: notes2.slice(1, 3) });\n f.Beam({ notes: notes2.slice(7, 9) });\n});\nVexFlowTests.register(GhostNoteTests);\nexport { GhostNoteTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// GlyphNote Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { ChordSymbol } from '../src/chordsymbol';\nimport { Glyph } from '../src/glyph';\nimport { Registry } from '../src/registry';\nimport { StaveConnector } from '../src/staveconnector';\nconst GlyphNoteTests = {\n Start() {\n QUnit.module('GlyphNote');\n const run = VexFlowTests.runTests;\n run('GlyphNote with ChordSymbols', chordChanges, { debug: false, noPadding: false });\n run('GlyphNote Positioning', basic, { debug: false, noPadding: false });\n run('GlyphNote No Stave Padding', basic, { debug: true, noPadding: true });\n run('GlyphNote RepeatNote', repeatNote, { debug: false, noPadding: true });\n },\n};\nfunction chordChanges(options) {\n Registry.enableDefaultRegistry(new Registry());\n const f = VexFlowTests.makeFactory(options, 300, 200);\n const system = f.System({\n x: 50,\n width: 250,\n debugFormatter: options.params.debug,\n noPadding: options.params.noPadding,\n details: { alpha: options.params.alpha },\n });\n const score = f.EasyScore();\n const notes = [\n f.GlyphNote(new Glyph('repeatBarSlash', 40), { duration: 'q' }),\n f.GlyphNote(new Glyph('repeatBarSlash', 40), { duration: 'q' }),\n f.GlyphNote(new Glyph('repeatBarSlash', 40), { duration: 'q' }),\n f.GlyphNote(new Glyph('repeatBarSlash', 40), { duration: 'q' }),\n ];\n const chord1 = f\n .ChordSymbol({ reportWidth: false })\n .addText('F7')\n .setHorizontal('left')\n .addGlyphOrText('(#11b9)', { symbolModifier: ChordSymbol.symbolModifiers.SUPERSCRIPT });\n const chord2 = f\n .ChordSymbol()\n .addText('F7')\n .setHorizontal('left')\n .addGlyphOrText('#11', { symbolModifier: ChordSymbol.symbolModifiers.SUPERSCRIPT })\n .addGlyphOrText('b9', { symbolModifier: ChordSymbol.symbolModifiers.SUBSCRIPT });\n notes[0].addModifier(chord1, 0);\n notes[2].addModifier(chord2, 0);\n const voice = score.voice(notes);\n system.addStave({ voices: [voice], debugNoteMetrics: options.params.debug });\n system.addConnector().setType(StaveConnector.type.BRACKET);\n f.draw();\n Registry.disableDefaultRegistry();\n ok(true);\n}\nfunction basic(options) {\n Registry.enableDefaultRegistry(new Registry());\n const f = VexFlowTests.makeFactory(options, 300, 400);\n const system = f.System({\n x: 50,\n width: 250,\n debugFormatter: options.params.debug,\n noPadding: options.params.noPadding,\n details: { alpha: options.params.alpha },\n });\n const score = f.EasyScore();\n const newVoice = (notes) => score.voice(notes, { time: '1/4' });\n const newStave = (voice) => system.addStave({ voices: [voice], debugNoteMetrics: options.params.debug });\n const voices = [\n [f.GlyphNote(new Glyph('repeat1Bar', 40), { duration: 'q' }, { line: 4 })],\n [f.GlyphNote(new Glyph('repeat2Bars', 40), { duration: 'q', align_center: true })],\n [\n f.GlyphNote(new Glyph('repeatBarSlash', 40), { duration: '16' }),\n f.GlyphNote(new Glyph('repeatBarSlash', 40), { duration: '16' }),\n f.GlyphNote(new Glyph('repeat4Bars', 40), { duration: '16' }),\n f.GlyphNote(new Glyph('repeatBarSlash', 40), { duration: '16' }),\n ],\n ];\n voices.map(newVoice).forEach(newStave);\n system.addConnector().setType(StaveConnector.type.BRACKET);\n f.draw();\n Registry.disableDefaultRegistry();\n ok(true);\n}\nfunction repeatNote(options) {\n Registry.enableDefaultRegistry(new Registry());\n const f = VexFlowTests.makeFactory(options, 300, 500);\n const system = f.System({\n x: 50,\n width: 250,\n debugFormatter: options.params.debug,\n noPadding: options.params.noPadding,\n details: { alpha: options.params.alpha },\n });\n const score = f.EasyScore();\n const createVoice = (notes) => score.voice(notes, { time: '1/4' });\n const addStaveWithVoice = (voice) => system.addStave({ voices: [voice], debugNoteMetrics: options.params.debug });\n const voices = [\n [f.RepeatNote('1')],\n [f.RepeatNote('2')],\n [f.RepeatNote('4')],\n [\n f.RepeatNote('slash', { duration: '16' }),\n f.RepeatNote('slash', { duration: '16' }),\n f.RepeatNote('slash', { duration: '16' }),\n f.RepeatNote('slash', { duration: '16' }),\n ],\n ];\n voices.map(createVoice).forEach(addStaveWithVoice);\n system.addConnector().setType(StaveConnector.type.BRACKET);\n f.draw();\n Registry.disableDefaultRegistry();\n ok(true);\n}\nVexFlowTests.register(GlyphNoteTests);\nexport { GlyphNoteTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// GraceNote Tests\n// TODO: In the 'stem' test (aka Grace Note Stem › SVG + Petaluma in flow.html), the Petaluma note heads are not scaled down properly.\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Dot } from '../src/dot';\nimport { Formatter } from '../src/formatter';\nconst GraceNoteTests = {\n Start() {\n QUnit.module('Grace Notes');\n const run = VexFlowTests.runTests;\n run('Grace Note Basic', basic);\n run('Grace Note Basic with Slurs', basicSlurred);\n run('Grace Note Stem', stem);\n run('Grace Note Stem with Beams 1', stemWithBeamed, {\n keys1: ['g/4'],\n stemDirection1: 1,\n keys2: ['d/5'],\n stemDirection2: -1,\n });\n run('Grace Note Stem with Beams 2', stemWithBeamed, {\n keys1: ['a/3'],\n stemDirection1: 1,\n keys2: ['a/5'],\n stemDirection2: -1,\n });\n run('Grace Note Stem with Beams 3', stemWithBeamed, {\n keys1: ['c/4'],\n stemDirection1: 1,\n keys2: ['c/6'],\n stemDirection2: -1,\n });\n run('Grace Note Slash', slash);\n run('Grace Note Slash with Beams', slashWithBeams);\n run('Grace Notes Multiple Voices', multipleVoices);\n run('Grace Notes Multiple Voices Multiple Draws', multipleVoicesMultipleDraws);\n },\n};\nfunction basic(options) {\n const f = VexFlowTests.makeFactory(options, 700, 130);\n const stave = f.Stave({ x: 10, y: 10, width: 650 });\n const gracenotes = [\n { keys: ['e/4'], duration: '32' },\n { keys: ['f/4'], duration: '32' },\n { keys: ['g/4'], duration: '32' },\n { keys: ['a/4'], duration: '32' },\n ].map(f.GraceNote.bind(f));\n const gracenotes1 = [{ keys: ['b/4'], duration: '8', slash: false }].map(f.GraceNote.bind(f));\n const gracenotes2 = [{ keys: ['b/4'], duration: '8', slash: true }].map(f.GraceNote.bind(f));\n const gracenotes3 = [\n { keys: ['e/4'], duration: '8' },\n { keys: ['f/4'], duration: '16' },\n { keys: ['e/4', 'g/4'], duration: '8' },\n { keys: ['a/4'], duration: '32' },\n { keys: ['b/4'], duration: '32' },\n ].map(f.GraceNote.bind(f));\n const gracenotes4 = [\n { keys: ['g/4'], duration: '8' },\n { keys: ['g/4'], duration: '16' },\n { keys: ['g/4'], duration: '16' },\n ].map(f.GraceNote.bind(f));\n gracenotes[1].addModifier(f.Accidental({ type: '##' }), 0);\n gracenotes3[3].addModifier(f.Accidental({ type: 'bb' }), 0);\n Dot.buildAndAttach([gracenotes4[0]], { all: true });\n const notes = [\n f\n .StaveNote({ keys: ['b/4'], duration: '4', auto_stem: true })\n .addModifier(f.GraceNoteGroup({ notes: gracenotes }).beamNotes(), 0),\n f\n .StaveNote({ keys: ['c/5'], duration: '4', auto_stem: true })\n .addModifier(f.Accidental({ type: '#' }), 0)\n .addModifier(f.GraceNoteGroup({ notes: gracenotes1 }).beamNotes(), 0),\n f\n .StaveNote({ keys: ['c/5', 'd/5'], duration: '4', auto_stem: true })\n .addModifier(f.GraceNoteGroup({ notes: gracenotes2 }).beamNotes(), 0),\n f\n .StaveNote({ keys: ['a/4'], duration: '4', auto_stem: true })\n .addModifier(f.GraceNoteGroup({ notes: gracenotes3 }).beamNotes(), 0),\n f\n .StaveNote({ keys: ['a/4'], duration: '4', auto_stem: true })\n .addModifier(f.GraceNoteGroup({ notes: gracenotes4 }).beamNotes(), 0),\n ];\n const voice = f.Voice().setStrict(false).addTickables(notes);\n new Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'GraceNoteBasic');\n}\nfunction basicSlurred(options) {\n const f = VexFlowTests.makeFactory(options, 700, 130);\n const stave = f.Stave({ x: 10, y: 10, width: 650 });\n const gracenotes0 = [\n { keys: ['e/4'], duration: '32' },\n { keys: ['f/4'], duration: '32' },\n { keys: ['g/4'], duration: '32' },\n { keys: ['a/4'], duration: '32' },\n ].map(f.GraceNote.bind(f));\n const gracenotes1 = [{ keys: ['b/4'], duration: '8', slash: false }].map(f.GraceNote.bind(f));\n const gracenotes2 = [{ keys: ['b/4'], duration: '8', slash: true }].map(f.GraceNote.bind(f));\n const gracenotes3 = [\n { keys: ['e/4'], duration: '8' },\n { keys: ['f/4'], duration: '16' },\n { keys: ['e/4', 'g/4'], duration: '8' },\n { keys: ['a/4'], duration: '32' },\n { keys: ['b/4'], duration: '32' },\n ].map(f.GraceNote.bind(f));\n const gracenotes4 = [\n { keys: ['a/4'], duration: '8' },\n { keys: ['a/4'], duration: '16' },\n { keys: ['a/4'], duration: '16' },\n ].map(f.GraceNote.bind(f));\n gracenotes0[1].addModifier(f.Accidental({ type: '#' }), 0);\n gracenotes3[3].addModifier(f.Accidental({ type: 'b' }), 0);\n gracenotes3[2].addModifier(f.Accidental({ type: 'n' }), 0);\n Dot.buildAndAttach([gracenotes4[0]], { all: true });\n const notes = [\n f\n .StaveNote({ keys: ['b/4'], duration: '4', auto_stem: true })\n .addModifier(f.GraceNoteGroup({ notes: gracenotes0, slur: true }).beamNotes(), 0),\n f\n .StaveNote({ keys: ['c/5'], duration: '4', auto_stem: true })\n .addModifier(f.Accidental({ type: '#' }), 0)\n .addModifier(f.GraceNoteGroup({ notes: gracenotes1, slur: true }).beamNotes(), 0),\n f\n .StaveNote({ keys: ['c/5', 'd/5'], duration: '4', auto_stem: true })\n .addModifier(f.GraceNoteGroup({ notes: gracenotes2, slur: true }).beamNotes(), 0),\n f\n .StaveNote({ keys: ['a/4'], duration: '4', auto_stem: true })\n .addModifier(f.GraceNoteGroup({ notes: gracenotes3, slur: true }).beamNotes(), 0),\n f\n .StaveNote({ keys: ['a/4'], duration: '4', auto_stem: true })\n .addModifier(f.GraceNoteGroup({ notes: gracenotes4, slur: true }).beamNotes(), 0),\n f.StaveNote({ keys: ['a/4'], duration: '4', auto_stem: true }),\n ];\n const voice = f.Voice().setStrict(false).addTickables(notes);\n new Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'GraceNoteBasic');\n}\n/**\n * Helper function for three tests below: stem, stemWithBeamed, slash.\n */\nconst createNoteForStemTest = (duration, noteBuilder, keys, stem_direction, slash = false) => {\n const struct = { duration, slash };\n struct.stem_direction = stem_direction;\n struct.keys = keys;\n return noteBuilder(struct);\n};\n// Used in three tests below.\nconst durationsForStemTest = ['8', '16', '32', '64', '128'];\nfunction stem(options) {\n const f = VexFlowTests.makeFactory(options, 700, 130);\n const stave = f.Stave({ x: 10, y: 10, width: 650 });\n function createNotes(noteBuilder, keys, stem_direction) {\n return durationsForStemTest.map((duration) => createNoteForStemTest(duration, noteBuilder, keys, stem_direction));\n }\n function createNoteBlock(keys, stem_direction) {\n const staveNotes = createNotes(f.StaveNote.bind(f), keys, stem_direction);\n const gracenotes = createNotes(f.GraceNote.bind(f), keys, stem_direction);\n // Add a bunch of GraceNotes in front of the first StaveNote.\n staveNotes[0].addModifier(f.GraceNoteGroup({ notes: gracenotes }), 0);\n return staveNotes;\n }\n const voice = f.Voice().setStrict(false);\n voice.addTickables(createNoteBlock(['g/4'], 1));\n voice.addTickables(createNoteBlock(['d/5'], -1));\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'GraceNoteStem');\n}\nfunction stemWithBeamed(options) {\n const f = VexFlowTests.makeFactory(options, 700, 130);\n const stave = f.Stave({ x: 10, y: 10, width: 650 });\n function createBeamedNotes(noteBuilder, keys, stem_direction, beams, isGrace = false, notesToBeam) {\n const ret = [];\n durationsForStemTest.map((duration) => {\n const n0 = createNoteForStemTest(duration, noteBuilder, keys, stem_direction);\n const n1 = createNoteForStemTest(duration, noteBuilder, keys, stem_direction);\n ret.push(n0);\n ret.push(n1);\n if (notesToBeam) {\n notesToBeam.push([n0, n1]);\n }\n if (!isGrace) {\n beams.push(f.Beam({ notes: [n0, n1] }));\n }\n });\n return ret;\n }\n function createBeamedNoteBlock(keys, stem_direction, beams) {\n const bnotes = createBeamedNotes(f.StaveNote.bind(f), keys, stem_direction, beams);\n const notesToBeam = [];\n const gracenotes = createBeamedNotes(f.GraceNote.bind(f), keys, stem_direction, beams, true, notesToBeam);\n const graceNoteGroup = f.GraceNoteGroup({ notes: gracenotes });\n notesToBeam.map(graceNoteGroup.beamNotes.bind(graceNoteGroup));\n bnotes[0].addModifier(graceNoteGroup, 0);\n return bnotes;\n }\n const beams = [];\n const voice = f.Voice().setStrict(false);\n voice.addTickables(createBeamedNoteBlock(options.params.keys1, options.params.stemDirection1, beams));\n voice.addTickables(createBeamedNoteBlock(options.params.keys2, options.params.stemDirection2, beams));\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'GraceNoteStem');\n}\nfunction slash(options) {\n const f = VexFlowTests.makeFactory(options, 700, 130);\n const stave = f.Stave({ x: 10, y: 10, width: 650 });\n function createNotes(noteT, keys, stem_direction, slash) {\n return durationsForStemTest.map((d) => createNoteForStemTest(d, noteT, keys, stem_direction, slash));\n }\n function createNoteBlock(keys, stem_direction) {\n const notes = [f.StaveNote({ keys: ['f/4'], stem_direction, duration: '16' })];\n let graceNotes = createNotes(f.GraceNote.bind(f), keys, stem_direction, true);\n const duration = '8';\n const gns = [\n { keys: ['d/4', 'a/4'], stem_direction, duration, slash: true },\n { keys: ['d/4', 'a/4'], stem_direction, duration, slash: true },\n { keys: ['d/4', 'a/4'], stem_direction, duration, slash: true },\n { keys: ['e/4', 'a/4'], stem_direction, duration, slash: true },\n { keys: ['e/4', 'a/4'], stem_direction, duration, slash: true },\n { keys: ['b/4', 'f/5'], stem_direction, duration, slash: true },\n { keys: ['b/4', 'f/5'], stem_direction, duration, slash: true },\n { keys: ['b/4', 'f/5'], stem_direction, duration, slash: true },\n { keys: ['e/4', 'a/4'], stem_direction, duration, slash: true },\n ].map(f.GraceNote.bind(f));\n const notesToBeam = [];\n notesToBeam.push([gns[0], gns[1], gns[2]]);\n notesToBeam.push([gns[3], gns[4], gns[5]]);\n notesToBeam.push([gns[6], gns[7], gns[8]]);\n // Merge the two GraceNote[].\n graceNotes = graceNotes.concat(gns);\n const graceNoteGroup = f.GraceNoteGroup({ notes: graceNotes });\n notesToBeam.forEach((notes) => graceNoteGroup.beamNotes(notes));\n notes[0].addModifier(graceNoteGroup, 0);\n return notes;\n }\n const voice = f.Voice().setStrict(false);\n voice.addTickables(createNoteBlock(['d/4', 'a/4'], 1));\n voice.addTickables(createNoteBlock(['d/4', 'a/4'], -1));\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'GraceNoteSlash');\n}\nfunction slashWithBeams(options) {\n const f = VexFlowTests.makeFactory(options, 800, 130);\n const stave = f.Stave({ x: 10, y: 10, width: 750 });\n function createNoteBlock(keys, stem_direction) {\n const notes = [f.StaveNote({ keys: ['f/4'], stem_direction, duration: '16' })];\n let allGraceNotes = [];\n const graceNotesToBeam = [];\n ['8', '16', '32', '64'].forEach(function (duration) {\n const graceNotes = [\n { keys: ['d/4', 'a/4'], stem_direction, duration, slash: true },\n { keys: ['d/4', 'a/4'], stem_direction, duration, slash: false },\n { keys: ['e/4', 'a/4'], stem_direction, duration, slash: true },\n { keys: ['b/4', 'f/5'], stem_direction, duration, slash: false },\n { keys: ['b/4', 'f/5'], stem_direction, duration, slash: true },\n { keys: ['e/4', 'a/4'], stem_direction, duration, slash: false },\n ].map(f.GraceNote.bind(f));\n graceNotesToBeam.push([graceNotes[0], graceNotes[1]]);\n graceNotesToBeam.push([graceNotes[2], graceNotes[3]]);\n graceNotesToBeam.push([graceNotes[4], graceNotes[5]]);\n allGraceNotes = allGraceNotes.concat(graceNotes);\n });\n const graceNoteGroup = f.GraceNoteGroup({ notes: allGraceNotes });\n graceNotesToBeam.forEach((g) => graceNoteGroup.beamNotes(g));\n notes[0].addModifier(graceNoteGroup, 0);\n return notes;\n }\n const voice = f.Voice().setStrict(false);\n voice.addTickables(createNoteBlock(['d/4', 'a/4'], 1));\n voice.addTickables(createNoteBlock(['d/4', 'a/4'], -1));\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'GraceNoteSlashWithBeams');\n}\nfunction multipleVoices(options) {\n const f = VexFlowTests.makeFactory(options, 450, 140);\n const stave = f.Stave({ x: 10, y: 10, width: 450 });\n const notes = [\n { keys: ['f/5'], stem_direction: 1, duration: '16' },\n { keys: ['f/5'], stem_direction: 1, duration: '16' },\n { keys: ['d/5'], stem_direction: 1, duration: '16' },\n { keys: ['c/5'], stem_direction: 1, duration: '16' },\n { keys: ['c/5'], stem_direction: 1, duration: '16' },\n { keys: ['d/5'], stem_direction: 1, duration: '16' },\n { keys: ['f/5'], stem_direction: 1, duration: '16' },\n { keys: ['e/5'], stem_direction: 1, duration: '16' },\n ].map(f.StaveNote.bind(f));\n const notes2 = [\n { keys: ['f/4'], stem_direction: -1, duration: '16' },\n { keys: ['e/4'], stem_direction: -1, duration: '16' },\n { keys: ['d/4'], stem_direction: -1, duration: '16' },\n { keys: ['c/4'], stem_direction: -1, duration: '16' },\n { keys: ['c/4'], stem_direction: -1, duration: '16' },\n { keys: ['d/4'], stem_direction: -1, duration: '16' },\n { keys: ['f/4'], stem_direction: -1, duration: '16' },\n { keys: ['e/4'], stem_direction: -1, duration: '16' },\n ].map(f.StaveNote.bind(f));\n const gracenotes1 = [{ keys: ['b/4'], stem_direction: 1, duration: '8', slash: true }].map(f.GraceNote.bind(f));\n const gracenotes2 = [{ keys: ['f/4'], stem_direction: -1, duration: '8', slash: true }].map(f.GraceNote.bind(f));\n const gracenotes3 = [\n { keys: ['f/4'], duration: '32', stem_direction: -1 },\n { keys: ['e/4'], duration: '32', stem_direction: -1 },\n ].map(f.GraceNote.bind(f));\n const gracenotes4 = [\n { keys: ['f/5'], duration: '32', stem_direction: 1 },\n { keys: ['e/5'], duration: '32', stem_direction: 1 },\n { keys: ['e/5'], duration: '8', stem_direction: 1 },\n ].map(f.GraceNote.bind(f));\n gracenotes2[0].setStemDirection(-1);\n gracenotes2[0].addModifier(f.Accidental({ type: '#' }), 0);\n notes[1].addModifier(f.GraceNoteGroup({ notes: gracenotes4 }).beamNotes(), 0);\n notes[3].addModifier(f.GraceNoteGroup({ notes: gracenotes1 }), 0);\n notes2[1].addModifier(f.GraceNoteGroup({ notes: gracenotes2 }).beamNotes(), 0);\n notes2[5].addModifier(f.GraceNoteGroup({ notes: gracenotes3 }).beamNotes(), 0);\n const voice = f.Voice().setStrict(false).addTickables(notes);\n const voice2 = f.Voice().setStrict(false).addTickables(notes2);\n f.Beam({ notes: notes.slice(0, 4) });\n f.Beam({ notes: notes.slice(4, 8) });\n f.Beam({ notes: notes2.slice(0, 4) });\n f.Beam({ notes: notes2.slice(4, 8) });\n f.Formatter().joinVoices([voice, voice2]).formatToStave([voice, voice2], stave);\n f.draw();\n ok(true, 'Sixteenth Test');\n}\nfunction multipleVoicesMultipleDraws(options) {\n const f = VexFlowTests.makeFactory(options, 450, 140);\n const stave = f.Stave({ x: 10, y: 10, width: 450 });\n const notes = [\n { keys: ['f/5'], stem_direction: 1, duration: '16' },\n { keys: ['f/5'], stem_direction: 1, duration: '16' },\n { keys: ['d/5'], stem_direction: 1, duration: '16' },\n { keys: ['c/5'], stem_direction: 1, duration: '16' },\n { keys: ['c/5'], stem_direction: 1, duration: '16' },\n { keys: ['d/5'], stem_direction: 1, duration: '16' },\n { keys: ['f/5'], stem_direction: 1, duration: '16' },\n { keys: ['e/5'], stem_direction: 1, duration: '16' },\n ].map(f.StaveNote.bind(f));\n const notes2 = [\n { keys: ['f/4'], stem_direction: -1, duration: '16' },\n { keys: ['e/4'], stem_direction: -1, duration: '16' },\n { keys: ['d/4'], stem_direction: -1, duration: '16' },\n { keys: ['c/4'], stem_direction: -1, duration: '16' },\n { keys: ['c/4'], stem_direction: -1, duration: '16' },\n { keys: ['d/4'], stem_direction: -1, duration: '16' },\n { keys: ['f/4'], stem_direction: -1, duration: '16' },\n { keys: ['e/4'], stem_direction: -1, duration: '16' },\n ].map(f.StaveNote.bind(f));\n const gracenotes1 = [{ keys: ['b/4'], stem_direction: 1, duration: '8', slash: true }].map(f.GraceNote.bind(f));\n const gracenotes2 = [{ keys: ['f/4'], stem_direction: -1, duration: '8', slash: true }].map(f.GraceNote.bind(f));\n const gracenotes3 = [\n { keys: ['f/4'], duration: '32', stem_direction: -1 },\n { keys: ['e/4'], duration: '32', stem_direction: -1 },\n ].map(f.GraceNote.bind(f));\n const gracenotes4 = [\n { keys: ['f/5'], duration: '32', stem_direction: 1 },\n { keys: ['e/5'], duration: '32', stem_direction: 1 },\n { keys: ['e/5'], duration: '8', stem_direction: 1 },\n ].map(f.GraceNote.bind(f));\n gracenotes2[0].setStemDirection(-1);\n gracenotes2[0].addModifier(f.Accidental({ type: '#' }), 0);\n notes[1].addModifier(f.GraceNoteGroup({ notes: gracenotes4 }).beamNotes(), 0);\n notes[3].addModifier(f.GraceNoteGroup({ notes: gracenotes1 }), 0);\n notes2[1].addModifier(f.GraceNoteGroup({ notes: gracenotes2 }).beamNotes(), 0);\n notes2[5].addModifier(f.GraceNoteGroup({ notes: gracenotes3 }).beamNotes(), 0);\n const voice = f.Voice().setStrict(false).addTickables(notes);\n const voice2 = f.Voice().setStrict(false).addTickables(notes2);\n f.Beam({ notes: notes.slice(0, 4) });\n f.Beam({ notes: notes.slice(4, 8) });\n f.Beam({ notes: notes2.slice(0, 4) });\n f.Beam({ notes: notes2.slice(4, 8) });\n f.Formatter().joinVoices([voice, voice2]).formatToStave([voice, voice2], stave);\n f.draw();\n f.draw();\n ok(true, 'Seventeenth Test');\n}\nVexFlowTests.register(GraceNoteTests);\nexport { GraceNoteTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// GraceTabNote Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Flow } from '../src/flow';\nimport { Formatter } from '../src/formatter';\nimport { GraceNoteGroup } from '../src/gracenotegroup';\nimport { GraceTabNote } from '../src/gracetabnote';\nimport { TabNote } from '../src/tabnote';\nimport { TabStave } from '../src/tabstave';\nimport { Voice } from '../src/voice';\nconst GraceTabNoteTests = {\n Start() {\n QUnit.module('Grace Tab Notes');\n // TODO: Rename tests below since it is redundant with the module name.\n // Remove \"Grace Tab Note \"\n const run = VexFlowTests.runTests;\n run('Grace Tab Note Simple', simple);\n run('Grace Tab Note Slurred', slurred);\n },\n};\n// Helper functions to create TabNote and GraceTabNote objects.\nconst tabNote = (noteStruct) => new TabNote(noteStruct);\nconst graceTabNote = (noteStruct) => new GraceTabNote(noteStruct);\n/**\n * Helper function to build a RenderContext and TabStave.\n */\nfunction setupContext(opts, ctxBuilder) {\n const context = ctxBuilder(opts.elementId, 350, 140);\n const stave = new TabStave(10, 10, 350).addTabGlyph().setContext(context).draw();\n return { context, stave };\n}\nfunction simple(options, contextBuilder) {\n const { context, stave } = setupContext(options, contextBuilder);\n const note0 = tabNote({ positions: [{ str: 4, fret: 6 }], duration: '4' });\n const note1 = tabNote({ positions: [{ str: 4, fret: 12 }], duration: '4' });\n const note2 = tabNote({ positions: [{ str: 4, fret: 10 }], duration: '4' });\n const note3 = tabNote({ positions: [{ str: 4, fret: 10 }], duration: '4' });\n const gracenote_group0 = [{ positions: [{ str: 4, fret: 'x' }], duration: '8' }];\n const gracenote_group1 = [\n { positions: [{ str: 4, fret: 9 }], duration: '16' },\n { positions: [{ str: 4, fret: 10 }], duration: '16' },\n ];\n const gracenote_group2 = [{ positions: [{ str: 4, fret: 9 }], duration: '8' }];\n const gracenote_group3 = [\n { positions: [{ str: 5, fret: 10 }], duration: '8' },\n { positions: [{ str: 4, fret: 9 }], duration: '8' },\n ];\n const gracenotes0 = gracenote_group0.map(graceTabNote);\n const gracenotes1 = gracenote_group1.map(graceTabNote);\n const gracenotes2 = gracenote_group2.map(graceTabNote);\n gracenotes2[0].setGhost(true);\n const gracenotes3 = gracenote_group3.map(graceTabNote);\n note0.addModifier(new GraceNoteGroup(gracenotes0), 0);\n note1.addModifier(new GraceNoteGroup(gracenotes1), 0);\n note2.addModifier(new GraceNoteGroup(gracenotes2), 0);\n note3.addModifier(new GraceNoteGroup(gracenotes3), 0);\n const voice = new Voice(Flow.TIME4_4);\n voice.addTickables([note0, note1, note2, note3]);\n new Formatter().joinVoices([voice]).format([voice], 250);\n voice.draw(context, stave);\n ok(true, 'Simple Test');\n}\nfunction slurred(options, contextBuilder) {\n const { context, stave } = setupContext(options, contextBuilder);\n const note0 = tabNote({ positions: [{ str: 4, fret: 12 }], duration: 'h' });\n const note1 = tabNote({ positions: [{ str: 4, fret: 10 }], duration: 'h' });\n const gracenote_group0 = [\n { positions: [{ str: 4, fret: 9 }], duration: '8' },\n { positions: [{ str: 4, fret: 10 }], duration: '8' },\n ];\n const gracenote_group1 = [\n { positions: [{ str: 4, fret: 7 }], duration: '16' },\n { positions: [{ str: 4, fret: 8 }], duration: '16' },\n { positions: [{ str: 4, fret: 9 }], duration: '16' },\n ];\n const gracenotes0 = gracenote_group0.map(graceTabNote);\n const gracenotes1 = gracenote_group1.map(graceTabNote);\n note0.addModifier(new GraceNoteGroup(gracenotes0, true), 0);\n note1.addModifier(new GraceNoteGroup(gracenotes1, true), 0);\n const voice = new Voice(Flow.TIME4_4);\n voice.addTickables([note0, note1]);\n new Formatter().joinVoices([voice]).format([voice], 200);\n voice.draw(context, stave);\n ok(true, 'Slurred Test');\n}\nVexFlowTests.register(GraceTabNoteTests);\nexport { GraceTabNoteTests };\n","// vexflow-debug-with-tests.ts includes this module via:\n// export * from '../../tests';\n//\n// To add a new test module, add a new line:\n// `export * from './xxxx_tests';`\n// to this file that points to the new file `xxxx_tests.ts`.\n//\n// The test module needs to call VexFlowTests.register(...).\n// For example, in annotation_tests.ts, the last two lines are:\n// VexFlowTests.register(AnnotationTests);\n// export { AnnotationTests };\n//\n// In vexflow_test_helpers.ts: VexFlowTests.run() will run all registered tests.\n//\n// To iterate faster during development, you can comment out most of this file\n// and focus on just testing the module(s) you are currently working on.\nexport * from './accidental_tests';\nexport * from './annotation_tests';\nexport * from './articulation_tests';\nexport * from './auto_beam_formatting_tests';\nexport * from './bach_tests';\nexport * from './barline_tests';\nexport * from './beam_tests';\nexport * from './bend_tests';\nexport * from './boundingbox_tests';\nexport * from './boundingboxcomputation_tests';\nexport * from './chordsymbol_tests';\nexport * from './clef_tests';\nexport * from './curve_tests';\nexport * from './dot_tests';\nexport * from './easyscore_tests';\nexport * from './factory_tests';\nexport * from './font_tests';\nexport * from './formatter_tests';\nexport * from './fraction_tests';\nexport * from './ghostnote_tests';\nexport * from './glyphnote_tests';\nexport * from './gracenote_tests';\nexport * from './gracetabnote_tests';\nexport * from './key_clef_tests';\nexport * from './keymanager_tests';\nexport * from './keysignature_tests';\nexport * from './modifier_tests';\nexport * from './multimeasurerest_tests';\nexport * from './music_tests';\nexport * from './notehead_tests';\nexport * from './notesubgroup_tests';\nexport * from './offscreencanvas_tests';\nexport * from './ornament_tests';\nexport * from './parser_tests';\nexport * from './pedalmarking_tests';\nexport * from './percussion_tests';\nexport * from './registry_tests';\nexport * from './renderer_tests';\nexport * from './rests_tests';\nexport * from './rhythm_tests';\nexport * from './stave_tests';\nexport * from './staveconnector_tests';\nexport * from './stavehairpin_tests';\nexport * from './staveline_tests';\nexport * from './stavemodifier_tests';\nexport * from './stavenote_tests';\nexport * from './stavetie_tests';\nexport * from './stringnumber_tests';\nexport * from './strokes_tests';\nexport * from './style_tests';\nexport * from './tabnote_tests';\nexport * from './tabslide_tests';\nexport * from './tabstave_tests';\nexport * from './tabtie_tests';\nexport * from './textbracket_tests';\nexport * from './textformatter_tests';\nexport * from './textnote_tests';\nexport * from './threevoice_tests';\nexport * from './tickcontext_tests';\nexport * from './timesignature_tests';\nexport * from './tremolo_tests';\nexport * from './tuning_tests';\nexport * from './tuplet_tests';\nexport * from './typeguard_tests';\nexport * from './vf_prefix_tests';\nexport * from './vibrato_tests';\nexport * from './vibratobracket_tests';\nexport * from './voice_tests';\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Clef Key Signature Tests\n//\nimport { MAJOR_KEYS, MINOR_KEYS, VexFlowTests } from './vexflow_test_helpers';\nimport { Glyph } from '../src/glyph';\nimport { KeySignature } from '../src/keysignature';\nimport { Stave } from '../src/stave';\nconst ClefKeySignatureTests = {\n Start() {\n QUnit.module('Clef Keys');\n // Removed an identical 'Key Parser Test'. See keysignature_tests.ts.\n const run = VexFlowTests.runTests;\n run('Major Key Clef Test', keys, { majorKeys: true });\n run('Minor Key Clef Test', keys, { majorKeys: false });\n run('Stave Helper', staveHelper);\n },\n};\nconst fontWidths = () => {\n const glyphScale = 39; // default font scale\n const sharpWidth = Glyph.getWidth('accidentalSharp', glyphScale) + 1;\n const flatWidth = Glyph.getWidth('accidentalFlat', glyphScale) + 1;\n const ksPadding = 10; // hard-coded in keysignature.ts\n const naturalWidth = Glyph.getWidth('accidentalNatural', glyphScale) + 2;\n const clefWidth = Glyph.getWidth('gClef', glyphScale); // widest clef\n return { sharpWidth, flatWidth, naturalWidth, clefWidth, ksPadding };\n};\nfunction keys(options, contextBuilder) {\n const w = fontWidths();\n const accidentalCount = 28; // total number in all the keys\n const sharpTestWidth = accidentalCount * w.sharpWidth + w.clefWidth + Stave.defaultPadding + 6 * w.ksPadding;\n const flatTestWidth = accidentalCount * w.flatWidth + w.clefWidth + Stave.defaultPadding + 6 * w.ksPadding;\n const clefs = [\n 'treble',\n 'soprano',\n 'mezzo-soprano',\n 'alto',\n 'tenor',\n 'baritone-f',\n 'baritone-c',\n 'bass',\n 'french',\n 'subbass',\n 'percussion',\n ];\n const ctx = contextBuilder(options.elementId, Math.max(sharpTestWidth, flatTestWidth) + 100, 20 + 80 * 2 * clefs.length);\n const staves = [];\n const keys = options.params.majorKeys ? MAJOR_KEYS : MINOR_KEYS;\n let i;\n let flat;\n let sharp;\n let keySig;\n const yOffsetForFlatStaves = 10 + 80 * clefs.length;\n for (i = 0; i < clefs.length; i++) {\n // Render all the sharps first, then all the flats:\n staves[i] = new Stave(10, 10 + 80 * i, flatTestWidth);\n staves[i].addClef(clefs[i]);\n staves[i + clefs.length] = new Stave(10, yOffsetForFlatStaves + 10 + 80 * i, sharpTestWidth);\n staves[i + clefs.length].addClef(clefs[i]);\n for (flat = 0; flat < 8; flat++) {\n keySig = new KeySignature(keys[flat]);\n keySig.addToStave(staves[i]);\n }\n for (sharp = 8; sharp < keys.length; sharp++) {\n keySig = new KeySignature(keys[sharp]);\n keySig.addToStave(staves[i + clefs.length]);\n }\n staves[i].setContext(ctx);\n staves[i].draw();\n staves[i + clefs.length].setContext(ctx);\n staves[i + clefs.length].draw();\n }\n ok(true, 'all pass');\n}\nfunction staveHelper(options, contextBuilder) {\n const w = fontWidths();\n const accidentalCount = 28; // total number in all the keys\n const sharpTestWidth = accidentalCount * w.sharpWidth + w.clefWidth + Stave.defaultPadding + 7 * w.ksPadding;\n const flatTestWidth = accidentalCount * w.flatWidth + w.clefWidth + Stave.defaultPadding + 7 * w.ksPadding;\n const ctx = contextBuilder(options.elementId, Math.max(sharpTestWidth, flatTestWidth) + 100, 400);\n const stave1 = new Stave(10, 10, flatTestWidth);\n const stave2 = new Stave(10, 90, flatTestWidth);\n const stave3 = new Stave(10, 170, sharpTestWidth);\n const stave4 = new Stave(10, 260, sharpTestWidth);\n const keys = MAJOR_KEYS;\n stave1.addClef('treble');\n stave2.addClef('bass');\n stave3.addClef('alto');\n stave4.addClef('tenor');\n for (let n = 0; n < 8; ++n) {\n stave1.addKeySignature(keys[n]);\n stave2.addKeySignature(keys[n]);\n }\n for (let i = 8; i < keys.length; ++i) {\n stave3.addKeySignature(keys[i]);\n stave4.addKeySignature(keys[i]);\n }\n stave1.setContext(ctx);\n stave1.draw();\n stave2.setContext(ctx);\n stave2.draw();\n stave3.setContext(ctx);\n stave3.draw();\n stave4.setContext(ctx);\n stave4.draw();\n ok(true, 'all pass');\n}\nVexFlowTests.register(ClefKeySignatureTests);\nexport { ClefKeySignatureTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Music Key Management Tests\n//\n// TODO: KeyManager.getAccidental(key) specifies that the return value's .accidental property is string | undefined.\n// However, we check it against null.\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { KeyManager } from '../src/index';\nconst KeyManagerTests = {\n Start() {\n QUnit.module('KeyManager');\n test('Valid Notes', works);\n test('Select Notes', selectNotes);\n },\n};\nfunction works() {\n const manager = new KeyManager('g');\n equal(manager.getAccidental('f').accidental, '#');\n manager.setKey('a');\n equal(manager.getAccidental('c').accidental, '#');\n equal(manager.getAccidental('a').accidental, null);\n equal(manager.getAccidental('f').accidental, '#');\n manager.setKey('A');\n equal(manager.getAccidental('c').accidental, '#');\n equal(manager.getAccidental('a').accidental, null);\n equal(manager.getAccidental('f').accidental, '#');\n}\nfunction selectNotes() {\n const manager = new KeyManager('f');\n equal(manager.selectNote('bb').note, 'bb');\n equal(manager.selectNote('bb').accidental, 'b');\n equal(manager.selectNote('g').note, 'g');\n equal(manager.selectNote('g').accidental, null);\n equal(manager.selectNote('b').note, 'b');\n equal(manager.selectNote('b').accidental, null);\n equal(manager.selectNote('a#').note, 'bb');\n equal(manager.selectNote('g#').note, 'g#');\n // Changes have no effect?\n equal(manager.selectNote('g#').note, 'g#');\n equal(manager.selectNote('bb').note, 'bb');\n equal(manager.selectNote('bb').accidental, 'b');\n equal(manager.selectNote('g').note, 'g');\n equal(manager.selectNote('g').accidental, null);\n equal(manager.selectNote('b').note, 'b');\n equal(manager.selectNote('b').accidental, null);\n equal(manager.selectNote('a#').note, 'bb');\n equal(manager.selectNote('g#').note, 'g#');\n // Changes should propagate\n manager.reset();\n equal(manager.selectNote('g#').change, true);\n equal(manager.selectNote('g#').change, false);\n equal(manager.selectNote('g').change, true);\n equal(manager.selectNote('g').change, false);\n equal(manager.selectNote('g#').change, true);\n manager.reset();\n let note = manager.selectNote('bb');\n equal(note.change, false);\n equal(note.accidental, 'b');\n note = manager.selectNote('g');\n equal(note.change, false);\n equal(note.accidental, null);\n note = manager.selectNote('g#');\n equal(note.change, true);\n equal(note.accidental, '#');\n note = manager.selectNote('g');\n equal(note.change, true);\n equal(note.accidental, null);\n note = manager.selectNote('g');\n equal(note.change, false);\n equal(note.accidental, null);\n note = manager.selectNote('g#');\n equal(note.change, true);\n equal(note.accidental, '#');\n}\nVexFlowTests.register(KeyManagerTests);\nexport { KeyManagerTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Key Signature Tests\n//\nimport { MAJOR_KEYS, MINOR_KEYS, VexFlowTests } from './vexflow_test_helpers';\nimport { Flow } from '../src/flow';\nimport { Glyph } from '../src/glyph';\nimport { KeySignature } from '../src/keysignature';\nimport { Stave } from '../src/stave';\nimport { BarlineType } from '../src/stavebarline';\nconst KeySignatureTests = {\n Start() {\n QUnit.module('KeySignature');\n test('Key Parser Test', parser);\n const run = VexFlowTests.runTests;\n run('Major Key Test', majorKeys);\n run('Minor Key Test', minorKeys);\n run('Stave Helper', staveHelper);\n run('Cancelled key test', majorKeysCanceled);\n run('Cancelled key (for each clef) test', keysCanceledForEachClef);\n run('Altered key test', majorKeysAltered);\n run('End key with clef test', endKeyWithClef);\n run('Key Signature Change test', changeKey);\n },\n};\nconst fontWidths = () => {\n const glyphScale = 39; // default font scale\n const sharpWidth = Glyph.getWidth('accidentalSharp', glyphScale) + 1;\n const flatWidth = Glyph.getWidth('accidentalFlat', glyphScale) + 1;\n const naturalWidth = Glyph.getWidth('accidentalNatural', glyphScale) + 2;\n const clefWidth = Glyph.getWidth('gClef', glyphScale) * 2; // widest clef\n return { sharpWidth, flatWidth, naturalWidth, clefWidth };\n};\nfunction parser() {\n expect(11);\n function catchError(spec) {\n throws(() => Flow.keySignature(spec), /BadKeySignature/);\n }\n catchError('asdf');\n catchError('D!');\n catchError('E#');\n catchError('D#');\n catchError('#');\n catchError('b');\n catchError('Kb');\n catchError('Fb');\n catchError('Dbm');\n catchError('B#m');\n Flow.keySignature('B');\n Flow.keySignature('C');\n Flow.keySignature('Fm');\n Flow.keySignature('Ab');\n Flow.keySignature('Abm');\n Flow.keySignature('F#');\n Flow.keySignature('G#m');\n ok(true, 'all pass');\n}\nfunction majorKeys(options, contextBuilder) {\n const w = fontWidths();\n const accidentalCount = 28; // total number in all the keys\n const casePadding = 10; // hard-coded in staveModifier\n const testCases = 7; // all keys, but includes key of C\n const sharpTestWidth = accidentalCount * w.sharpWidth + casePadding * testCases + Stave.defaultPadding;\n const flatTestWidth = accidentalCount * w.flatWidth + casePadding * testCases + Stave.defaultPadding;\n const ctx = contextBuilder(options.elementId, Math.max(sharpTestWidth, flatTestWidth) + 100, 240);\n const stave1 = new Stave(10, 10, flatTestWidth);\n const stave2 = new Stave(10, 90, sharpTestWidth);\n const keys = MAJOR_KEYS;\n let keySig = null;\n for (let i = 0; i < 8; ++i) {\n keySig = new KeySignature(keys[i]);\n keySig.addToStave(stave1);\n }\n for (let n = 8; n < keys.length; ++n) {\n keySig = new KeySignature(keys[n]);\n keySig.addToStave(stave2);\n }\n stave1.setContext(ctx);\n stave1.draw();\n stave2.setContext(ctx);\n stave2.draw();\n ok(true, 'all pass');\n}\nfunction majorKeysCanceled(options, contextBuilder) {\n const scale = 0.9;\n const w = fontWidths();\n const flatPadding = 18;\n const sharpPadding = 20;\n const flatTestCases = 8;\n const sharpTestCases = 7;\n // magic numbers are the numbers of that symbol that appear in the test case\n const sharpTestWidth = 28 * w.sharpWidth + 21 * w.naturalWidth + sharpPadding * sharpTestCases + Stave.defaultPadding + w.clefWidth;\n const flatTestWidth = 28 * w.flatWidth + 28 * w.naturalWidth + flatPadding * flatTestCases + Stave.defaultPadding + w.clefWidth;\n const eFlatTestWidth = 28 * w.flatWidth + 32 * w.naturalWidth + flatPadding * flatTestCases + Stave.defaultPadding + w.clefWidth;\n const eSharpTestWidth = 28 * w.sharpWidth + 28 * w.naturalWidth + sharpPadding * sharpTestCases + Stave.defaultPadding + w.clefWidth;\n const maxWidth = Math.max(Math.max(sharpTestWidth, flatTestWidth, Math.max(eSharpTestWidth, eFlatTestWidth)));\n const ctx = contextBuilder(options.elementId, maxWidth + 100, 500);\n ctx.scale(scale, scale);\n const stave1 = new Stave(10, 10, flatTestWidth).addClef('treble');\n const stave2 = new Stave(10, 90, sharpTestWidth).addClef('treble');\n const stave3 = new Stave(10, 170, eFlatTestWidth).addClef('treble');\n const stave4 = new Stave(10, 250, eSharpTestWidth).addClef('treble');\n const keys = MAJOR_KEYS;\n let keySig = null;\n let i;\n let n;\n for (i = 0; i < 8; ++i) {\n keySig = new KeySignature(keys[i]);\n keySig.cancelKey('Cb');\n keySig.setPadding(flatPadding);\n keySig.addToStave(stave1);\n }\n for (n = 8; n < keys.length; ++n) {\n keySig = new KeySignature(keys[n]);\n keySig.cancelKey('C#');\n keySig.setPadding(sharpPadding);\n keySig.addToStave(stave2);\n }\n for (i = 0; i < 8; ++i) {\n keySig = new KeySignature(keys[i]);\n keySig.cancelKey('E');\n keySig.setPadding(flatPadding);\n keySig.addToStave(stave3);\n }\n for (n = 8; n < keys.length; ++n) {\n keySig = new KeySignature(keys[n]);\n keySig.cancelKey('Ab');\n keySig.setPadding(sharpPadding);\n keySig.addToStave(stave4);\n }\n stave1.setContext(ctx);\n stave1.draw();\n stave2.setContext(ctx);\n stave2.draw();\n stave3.setContext(ctx);\n stave3.draw();\n stave4.setContext(ctx);\n stave4.draw();\n ok(true, 'all pass');\n}\nfunction keysCanceledForEachClef(options, contextBuilder) {\n const scale = 0.8;\n const w = fontWidths();\n const keyPadding = 10;\n const keys = ['C#', 'Cb'];\n const flatsKey = [7, 14];\n const sharpsKey = [14, 7];\n const natsKey = [7, 7];\n const max = 21 * Math.max(w.sharpWidth, w.flatWidth) * 2 + keyPadding * 6 + Stave.defaultPadding + w.clefWidth;\n const ctx = contextBuilder(options.elementId, max + 100, 380);\n ctx.scale(scale, scale);\n const x = 20;\n let y = 20;\n let tx = x;\n ['bass', 'tenor', 'soprano', 'mezzo-soprano', 'baritone-f'].forEach(function (clef) {\n keys.forEach((key, keyIx) => {\n const cancelKey = keys[(keyIx + 1) % 2];\n const width = flatsKey[keyIx] * w.flatWidth +\n natsKey[keyIx] * w.naturalWidth +\n sharpsKey[keyIx] * w.sharpWidth +\n keyPadding * 3 +\n w.clefWidth +\n Stave.defaultPadding;\n const stave = new Stave(tx, y, width);\n stave.setClef(clef);\n stave.addKeySignature(cancelKey);\n stave.addKeySignature(key, cancelKey);\n stave.addKeySignature(key);\n stave.setContext(ctx).draw();\n tx += width;\n });\n tx = x;\n y += 80;\n });\n ok(true, 'all pass');\n}\nfunction majorKeysAltered(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 780, 500);\n ctx.scale(0.9, 0.9);\n const stave1 = new Stave(10, 10, 750).addClef('treble');\n const stave2 = new Stave(10, 90, 750).addClef('treble');\n const stave3 = new Stave(10, 170, 750).addClef('treble');\n const stave4 = new Stave(10, 250, 750).addClef('treble');\n const keys = MAJOR_KEYS;\n let keySig = null;\n let i;\n let n;\n for (i = 0; i < 8; ++i) {\n keySig = new KeySignature(keys[i]);\n keySig.alterKey(['bs', 'bs']);\n keySig.setPadding(18);\n keySig.addToStave(stave1);\n }\n for (n = 8; n < keys.length; ++n) {\n keySig = new KeySignature(keys[n]);\n keySig.alterKey(['+', '+', '+']);\n keySig.setPadding(20);\n keySig.addToStave(stave2);\n }\n for (i = 0; i < 8; ++i) {\n keySig = new KeySignature(keys[i]);\n keySig.alterKey(['n', 'bs', 'bb']);\n keySig.setPadding(18);\n keySig.addToStave(stave3);\n }\n for (n = 8; n < keys.length; ++n) {\n keySig = new KeySignature(keys[n]);\n keySig.alterKey(['++', '+', 'n', '+']);\n keySig.setPadding(20);\n keySig.addToStave(stave4);\n }\n stave1.setContext(ctx);\n stave1.draw();\n stave2.setContext(ctx);\n stave2.draw();\n stave3.setContext(ctx);\n stave3.draw();\n stave4.setContext(ctx);\n stave4.draw();\n ok(true, 'all pass');\n}\nfunction minorKeys(options, contextBuilder) {\n const accidentalCount = 28; // total number in all the keys\n const w = fontWidths();\n const casePadding = 10; // hard-coded in staveModifier\n const testCases = 7; // all keys, but includes key of C\n const sharpTestWidth = accidentalCount * w.sharpWidth + casePadding * testCases + Stave.defaultPadding;\n const flatTestWidth = accidentalCount * w.flatWidth + casePadding * testCases + Stave.defaultPadding;\n const ctx = contextBuilder(options.elementId, Math.max(sharpTestWidth, flatTestWidth) + 100, 240);\n const stave1 = new Stave(10, 10, flatTestWidth);\n const stave2 = new Stave(10, 90, sharpTestWidth);\n const keys = MINOR_KEYS;\n let keySig = null;\n for (let i = 0; i < 8; ++i) {\n keySig = new KeySignature(keys[i]);\n keySig.addToStave(stave1);\n }\n for (let n = 8; n < keys.length; ++n) {\n keySig = new KeySignature(keys[n]);\n keySig.addToStave(stave2);\n }\n stave1.setContext(ctx);\n stave1.draw();\n stave2.setContext(ctx);\n stave2.draw();\n ok(true, 'all pass');\n}\nfunction endKeyWithClef(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 400, 200);\n ctx.scale(0.9, 0.9);\n const stave1 = new Stave(10, 10, 350);\n stave1\n .setKeySignature('G')\n .setBegBarType(BarlineType.REPEAT_BEGIN)\n .setEndBarType(BarlineType.REPEAT_END)\n .setClef('treble')\n .addTimeSignature('4/4')\n .setEndClef('bass')\n .setEndKeySignature('Cb');\n const stave2 = new Stave(10, 90, 350);\n stave2.setKeySignature('Cb').setClef('bass').setEndClef('treble').setEndKeySignature('G');\n stave1.setContext(ctx).draw();\n stave2.setContext(ctx).draw();\n ok(true, 'all pass');\n}\nfunction staveHelper(options, contextBuilder) {\n const w = fontWidths();\n const accidentalCount = 28; // total number in all the keys\n const casePadding = 10; // hard-coded in staveModifier\n const testCases = 7; // all keys, but includes key of C\n const sharpTestWidth = accidentalCount * w.sharpWidth + casePadding * testCases + Stave.defaultPadding;\n const flatTestWidth = accidentalCount * w.flatWidth + casePadding * testCases + Stave.defaultPadding;\n const ctx = contextBuilder(options.elementId, Math.max(sharpTestWidth, flatTestWidth) + 100, 240);\n const stave1 = new Stave(10, 10, flatTestWidth);\n const stave2 = new Stave(10, 90, sharpTestWidth);\n const keys = MAJOR_KEYS;\n for (let i = 0; i < 8; ++i) {\n stave1.addKeySignature(keys[i]);\n }\n for (let n = 8; n < keys.length; ++n) {\n stave2.addKeySignature(keys[n]);\n }\n stave1.setContext(ctx);\n stave1.draw();\n stave2.setContext(ctx);\n stave2.draw();\n ok(true, 'all pass');\n}\nfunction changeKey(options) {\n const f = VexFlowTests.makeFactory(options, 900);\n // The previous code was buggy: f.Stave(10, 10, 800), even though Factory.Stave() only accepts 1 argument.\n const stave = f.Stave({ x: 10, y: 10, width: 800 }).addClef('treble').addTimeSignature('C|');\n const voice = f\n .Voice()\n .setStrict(false)\n .addTickables([\n f.KeySigNote({ key: 'Bb' }),\n f.StaveNote({ keys: ['c/4'], duration: '1' }),\n f.BarNote(),\n f.KeySigNote({ key: 'D', cancelKey: 'Bb' }),\n f.StaveNote({ keys: ['c/4'], duration: '1' }),\n f.BarNote(),\n f.KeySigNote({ key: 'Bb' }),\n f.StaveNote({ keys: ['c/4'], duration: '1' }),\n f.BarNote(),\n f.KeySigNote({ key: 'D', alterKey: ['b', 'n'] }),\n f.StaveNote({ keys: ['c/4'], duration: '1' }),\n ]);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'all pass');\n}\nVexFlowTests.register(KeySignatureTests);\nexport { KeySignatureTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// TickContext Mocks\nimport { Fraction } from '../src/fraction';\nimport { Tickable } from '../src/tickable';\nclass MockTickable extends Tickable {\n constructor() {\n super(...arguments);\n this.ticks = new Fraction(1, 1);\n this.width = 0;\n this.ignore_ticks = false;\n }\n init() {\n // DO NOTHING.\n }\n getX() {\n // eslint-disable-next-line\n return this.tickContext.getX();\n }\n getIntrinsicTicks() {\n return this.ticks.value();\n }\n getTicks() {\n return this.ticks;\n }\n setTicks(t) {\n this.ticks = new Fraction(t, 1);\n return this;\n }\n // Called by TickContext.preFormat().\n getMetrics() {\n return {\n width: 0,\n glyphWidth: 0,\n notePx: this.width,\n modLeftPx: 0,\n modRightPx: 0,\n leftDisplacedHeadPx: 0,\n rightDisplacedHeadPx: 0,\n glyphPx: 0,\n };\n }\n getWidth() {\n return this.width;\n }\n setWidth(w) {\n this.width = w;\n return this;\n }\n setVoice(v) {\n this.voice = v;\n return this;\n }\n setStave(stave) {\n this.stave = stave;\n return this;\n }\n getStave() {\n return this.stave;\n }\n setTickContext(tc) {\n this.tickContext = tc;\n return this;\n }\n setIgnoreTicks(flag) {\n this.ignore_ticks = flag;\n return this;\n }\n shouldIgnoreTicks() {\n return this.ignore_ticks;\n }\n preFormat() {\n // DO NOTHING.\n }\n // eslint-disable-next-line\n draw(...args) {\n // DO NOTHING.\n }\n}\nexport { MockTickable };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// ModifierContext Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Modifier, ModifierContext } from '../src/index';\nconst ModifierContextTests = {\n Start() {\n QUnit.module('ModifierContext');\n test('Modifier Width Test', width);\n test('Modifier Management', management);\n },\n};\nfunction width() {\n const mc = new ModifierContext();\n equal(mc.getWidth(), 0, 'New modifier context has no width');\n}\nfunction management() {\n const mc = new ModifierContext();\n const modifier1 = new Modifier();\n const modifier2 = new Modifier();\n mc.addMember(modifier1);\n mc.addMember(modifier2);\n const modifiers = mc.getMembers(Modifier.CATEGORY);\n equal(modifiers.length, 2, 'Added two modifiers');\n}\nVexFlowTests.register(ModifierContextTests);\nexport { ModifierContextTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// MultiMeasureRest Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Flow } from '../src/flow';\nimport { Font } from '../src/font';\nconst MultiMeasureRestTests = {\n Start() {\n QUnit.module('MultiMeasureRest');\n const run = VexFlowTests.runTests;\n run('Simple Test', simple);\n run('Stave with modifiers Test', staveWithModifiers);\n },\n};\nfunction simple(options) {\n const width = 910;\n const f = VexFlowTests.makeFactory(options, width, 300);\n const line_spacing_15px = { options: { spacing_between_lines_px: 15 } };\n // Each item below is an array that contains:\n // item[0] => staveParams to adjust vertical spacing between lines\n // item[1] => multiMeasureRestParams\n // eslint-disable-next-line\n const params = [\n [{}, { number_of_measures: 2, show_number: false }],\n [{}, { number_of_measures: 2 }],\n [{}, { number_of_measures: 2, line_thickness: 8, serif_thickness: 3 }],\n [{}, { number_of_measures: 1, use_symbols: true }],\n [{}, { number_of_measures: 2, use_symbols: true }],\n [{}, { number_of_measures: 3, use_symbols: true }],\n [{}, { number_of_measures: 4, use_symbols: true }],\n [{}, { number_of_measures: 5, use_symbols: true }],\n [{}, { number_of_measures: 6, use_symbols: true }],\n [{}, { number_of_measures: 7, use_symbols: true }],\n [{}, { number_of_measures: 8, use_symbols: true }],\n [{}, { number_of_measures: 9, use_symbols: true }],\n [{}, { number_of_measures: 10, use_symbols: true }],\n [{}, { number_of_measures: 11, use_symbols: true }],\n [{}, { number_of_measures: 11, use_symbols: false, padding_left: 20, padding_right: 20 }],\n [{}, { number_of_measures: 11, use_symbols: true, symbol_spacing: 5 }],\n [{}, { number_of_measures: 11, use_symbols: false, line: 3, number_line: 2 }],\n [{}, { number_of_measures: 11, use_symbols: true, line: 3, number_line: 2 }],\n [line_spacing_15px, { number_of_measures: 12 }],\n [line_spacing_15px, { number_of_measures: 9, use_symbols: true }],\n [line_spacing_15px, { number_of_measures: 12, spacing_between_lines_px: 15, number_glyph_point: 40 * 1.5 }],\n [\n line_spacing_15px,\n {\n number_of_measures: 9,\n spacing_between_lines_px: 15,\n use_symbols: true,\n number_glyph_point: 40 * 1.5,\n },\n ],\n [\n line_spacing_15px,\n {\n number_of_measures: 9,\n spacing_between_lines_px: 15,\n use_symbols: true,\n number_glyph_point: 40 * 1.5,\n semibreve_rest_glyph_scale: Flow.NOTATION_FONT_SCALE * 1.5,\n },\n ],\n ];\n const staveWidth = 100;\n let x = 0;\n let y = 0;\n const mmRests = params.map((param) => {\n if (x + staveWidth * 2 > width) {\n x = 0;\n y += 80;\n }\n const staveParams = param[0];\n const mmRestParams = param[1];\n staveParams.x = x;\n staveParams.y = y;\n staveParams.width = staveWidth;\n x += staveWidth;\n const stave = f.Stave(staveParams);\n return f.MultiMeasureRest(mmRestParams).setStave(stave);\n });\n f.draw();\n const xs = mmRests[0].getXs();\n // eslint-disable-next-line\n const strY = mmRests[0].getStave().getYForLine(-0.5);\n const str = 'TACET';\n const context = f.getContext();\n context.save();\n context.setFont(Font.SERIF, 16, 'bold');\n const metrics = context.measureText(str);\n context.fillText(str, xs.left + (xs.right - xs.left) * 0.5 - metrics.width * 0.5, strY);\n context.restore();\n ok(true, 'Simple Test');\n}\nfunction staveWithModifiers(options) {\n const width = 910;\n const f = VexFlowTests.makeFactory(options, width, 200);\n let x = 0;\n let y = 0;\n // eslint-disable-next-line\n const params = [\n [{ clef: 'treble', params: { width: 150 } }, { number_of_measures: 5 }],\n [{ clef: 'treble', keySig: 'G', params: { width: 150 } }, { number_of_measures: 5 }],\n [{ clef: 'treble', timeSig: '4/4', keySig: 'G', params: { width: 150 } }, { number_of_measures: 5 }],\n [{ clef: 'treble', endClef: 'bass', params: { width: 150 } }, { number_of_measures: 5 }],\n [{ clef: 'treble', endKeySig: 'F', params: { width: 150 } }, { number_of_measures: 5 }],\n [{ clef: 'treble', endTimeSig: '2/4', params: { width: 150 } }, { number_of_measures: 5 }],\n [{ clef: 'treble', endClef: 'bass', endTimeSig: '2/4', params: { width: 150 } }, { number_of_measures: 5 }],\n [\n { clef: 'treble', endClef: 'bass', endTimeSig: '2/4', params: { width: 150 } },\n { number_of_measures: 5, use_symbols: true },\n ],\n ];\n params.forEach((param) => {\n const staveOptions = param[0];\n // eslint-disable-next-line\n const staveParams = staveOptions.params;\n const mmrestParams = param[1];\n if (x + staveParams.width > width) {\n x = 0;\n y += 80;\n }\n staveParams.x = x;\n x += staveParams.width;\n staveParams.y = y;\n const stave = f.Stave(staveParams);\n if (staveOptions.clef) {\n stave.addClef(staveOptions.clef);\n }\n if (staveOptions.timeSig) {\n stave.addTimeSignature(staveOptions.timeSig);\n }\n if (staveOptions.keySig) {\n stave.addKeySignature(staveOptions.keySig);\n }\n if (staveOptions.endClef) {\n stave.addEndClef(staveOptions.endClef);\n }\n if (staveOptions.endKeySig) {\n stave.setEndKeySignature(staveOptions.endKeySig);\n }\n if (staveOptions.endTimeSig) {\n stave.setEndTimeSignature(staveOptions.endTimeSig);\n }\n return f.MultiMeasureRest(mmrestParams).setStave(stave);\n });\n f.draw();\n ok(true, 'Stave with modifiers Test');\n}\nVexFlowTests.register(MultiMeasureRestTests);\nexport { MultiMeasureRestTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Music Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { KeyManager } from '../src/keymanager';\nimport { Music } from '../src/music';\nconst MusicTests = {\n Start() {\n QUnit.module('MusicTests');\n test('Valid Notes', validNotes);\n test('Valid Keys', validKeys);\n test('Note Values', noteValue);\n test('Interval Values', intervalValue);\n test('Relative Notes', relativeNotes);\n test('Relative Note Names', relativeNoteNames);\n test('Canonical Notes', canonicalNotes);\n test('Canonical Intervals', canonicalIntervals);\n test('Scale Tones', scaleTones);\n test('Scale Intervals', scaleIntervals);\n },\n};\nfunction validNotes() {\n expect(10);\n const music = new Music();\n let parts = music.getNoteParts('c');\n equal(parts.root, 'c');\n equal(parts.accidental, null);\n // getNoteParts() converts its argument to lowercase.\n parts = music.getNoteParts('C');\n equal(parts.root, 'c');\n equal(parts.accidental, null);\n parts = music.getNoteParts('c#');\n equal(parts.root, 'c');\n equal(parts.accidental, '#');\n parts = music.getNoteParts('c##');\n equal(parts.root, 'c');\n equal(parts.accidental, '##');\n throws(() => music.getNoteParts('r'), /BadArguments/, 'Invalid note: r');\n throws(() => music.getNoteParts(''), /BadArguments/, \"Invalid note: ''\");\n}\nfunction validKeys() {\n expect(18);\n const music = new Music();\n let parts = music.getKeyParts('c');\n equal(parts.root, 'c');\n equal(parts.accidental, null);\n equal(parts.type, 'M');\n parts = music.getKeyParts('d#');\n equal(parts.root, 'd');\n equal(parts.accidental, '#');\n equal(parts.type, 'M');\n parts = music.getKeyParts('fbm');\n equal(parts.root, 'f');\n equal(parts.accidental, 'b');\n equal(parts.type, 'm');\n parts = music.getKeyParts('c#mel');\n equal(parts.root, 'c');\n equal(parts.accidental, '#');\n equal(parts.type, 'mel');\n parts = music.getKeyParts('g#harm');\n equal(parts.root, 'g');\n equal(parts.accidental, '#');\n equal(parts.type, 'harm');\n throws(() => music.getKeyParts('r'), /BadArguments/, 'Invalid key: r');\n throws(() => music.getKeyParts(''), /BadArguments/, `Invalid key: ''`);\n throws(() => music.getKeyParts('#m'), /BadArguments/, 'Invalid key: #m');\n}\nfunction noteValue() {\n expect(3);\n const music = new Music();\n let note = music.getNoteValue('c');\n equal(note, 0);\n throws(() => music.getNoteValue('r'), /BadArguments/, 'Invalid note name');\n note = music.getNoteValue('f#');\n equal(note, 6);\n}\nfunction intervalValue() {\n expect(2);\n const music = new Music();\n const value = music.getIntervalValue('b2');\n equal(value, 1);\n throws(() => music.getIntervalValue('7'), /BadArguments/, 'Invalid interval name');\n}\nfunction relativeNotes() {\n expect(8);\n const music = new Music();\n let value = music.getRelativeNoteValue(music.getNoteValue('c'), music.getIntervalValue('b5'));\n equal(value, 6);\n throws(() => music.getRelativeNoteValue(music.getNoteValue('bc'), music.getIntervalValue('b2')), /BadArguments/, 'Invalid note');\n throws(() => music.getRelativeNoteValue(music.getNoteValue('b'), music.getIntervalValue('p3')), /BadArguments/, 'Invalid interval');\n // Direction\n value = music.getRelativeNoteValue(music.getNoteValue('d'), music.getIntervalValue('2'), -1);\n equal(value, 0);\n throws(() => music.getRelativeNoteValue(music.getNoteValue('b'), music.getIntervalValue('p4'), 0), /BadArguments/, 'Invalid direction: 0');\n // Rollover\n value = music.getRelativeNoteValue(music.getNoteValue('b'), music.getIntervalValue('b5'));\n equal(value, 5);\n // Reverse rollover\n value = music.getRelativeNoteValue(music.getNoteValue('c'), music.getIntervalValue('b2'), -1);\n equal(value, 11);\n // Practical tests\n value = music.getRelativeNoteValue(music.getNoteValue('g'), music.getIntervalValue('p5'));\n equal(value, 2);\n}\nfunction relativeNoteNames() {\n expect(9);\n const music = new Music();\n equal(music.getRelativeNoteName('b', music.getNoteValue('c#')), 'b##');\n equal(music.getRelativeNoteName('c', music.getNoteValue('c')), 'c');\n equal(music.getRelativeNoteName('c', music.getNoteValue('db')), 'c#');\n equal(music.getRelativeNoteName('c', music.getNoteValue('b')), 'cb');\n equal(music.getRelativeNoteName('c#', music.getNoteValue('db')), 'c#');\n equal(music.getRelativeNoteName('e', music.getNoteValue('f#')), 'e##');\n equal(music.getRelativeNoteName('e', music.getNoteValue('d#')), 'eb');\n equal(music.getRelativeNoteName('e', music.getNoteValue('fb')), 'e');\n throws(() => music.getRelativeNoteName('e', music.getNoteValue('g#')), /BadArguments/, 'Too far away. Notes not related.');\n}\nfunction canonicalNotes() {\n expect(3);\n const music = new Music();\n equal(music.getCanonicalNoteName(0), 'c');\n equal(music.getCanonicalNoteName(2), 'd');\n throws(() => music.getCanonicalNoteName(-1), /BadArguments/, 'Invalid note value');\n}\nfunction canonicalIntervals() {\n expect(3);\n const music = new Music();\n equal(music.getCanonicalIntervalName(0), 'unison');\n equal(music.getCanonicalIntervalName(2), 'M2');\n throws(() => music.getCanonicalIntervalName(-1), /BadArguments/, 'Invalid interval value');\n}\nfunction scaleTones() {\n expect(24);\n // C Major\n const music = new Music();\n const manager = new KeyManager('CM');\n const c_major = music.getScaleTones(music.getNoteValue('c'), Music.scales.major);\n let values = ['c', 'd', 'e', 'f', 'g', 'a', 'b'];\n equal(c_major.length, 7);\n for (let i = 0; i < c_major.length; ++i) {\n equal(music.getCanonicalNoteName(c_major[i]), values[i]);\n }\n // Dorian\n const c_dorian = music.getScaleTones(music.getNoteValue('c'), Music.scales.dorian);\n values = ['c', 'd', 'eb', 'f', 'g', 'a', 'bb'];\n let note = null;\n equal(c_dorian.length, 7);\n for (let i = 0; i < c_dorian.length; ++i) {\n note = music.getCanonicalNoteName(c_dorian[i]);\n equal(manager.selectNote(note).note, values[i]);\n }\n // Mixolydian\n const c_mixolydian = music.getScaleTones(music.getNoteValue('c'), Music.scales.mixolydian);\n values = ['c', 'd', 'e', 'f', 'g', 'a', 'bb'];\n equal(c_mixolydian.length, 7);\n for (let i = 0; i < c_mixolydian.length; ++i) {\n note = music.getCanonicalNoteName(c_mixolydian[i]);\n equal(manager.selectNote(note).note, values[i]);\n }\n}\nfunction scaleIntervals() {\n expect(6);\n const m = new Music();\n equal(m.getCanonicalIntervalName(m.getIntervalBetween(m.getNoteValue('c'), m.getNoteValue('d'))), 'M2');\n equal(m.getCanonicalIntervalName(m.getIntervalBetween(m.getNoteValue('g'), m.getNoteValue('c'))), 'p4');\n equal(m.getCanonicalIntervalName(m.getIntervalBetween(m.getNoteValue('c'), m.getNoteValue('c'))), 'unison');\n equal(m.getCanonicalIntervalName(m.getIntervalBetween(m.getNoteValue('f'), m.getNoteValue('cb'))), 'dim5');\n // Forwards and backwards\n equal(m.getCanonicalIntervalName(m.getIntervalBetween(m.getNoteValue('d'), m.getNoteValue('c'), 1)), 'b7');\n equal(m.getCanonicalIntervalName(m.getIntervalBetween(m.getNoteValue('d'), m.getNoteValue('c'), -1)), 'M2');\n}\nVexFlowTests.register(MusicTests);\nexport { MusicTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// NoteHead Tests\n// TODO: There is a bug in RenderContext.scale(). The CanvasContext works as expected.\n// Each time you call scale(sx, sy), it multiplies the sx and sy by the currently stored scale.\n// The SVGContext operates differently. It just sets the sx and sy as the new scale, instead of multiplying it.\n// See: https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/scale\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Flow } from '../src/flow';\nimport { Formatter } from '../src/formatter';\nimport { NoteHead } from '../src/notehead';\nimport { Stave } from '../src/stave';\nimport { StaveNote } from '../src/stavenote';\nimport { TickContext } from '../src/tickcontext';\nimport { Voice } from '../src/voice';\nconst NoteHeadTests = {\n Start() {\n QUnit.module('NoteHead');\n const run = VexFlowTests.runTests;\n run('Basic', basic);\n run('Various Heads', variousHeads);\n run('Drum Chord Heads', drumChordHeads);\n run('Bounding Boxes', basicBoundingBoxes);\n },\n};\nfunction setContextStyle(ctx) {\n // TODO: scale() method in SVGContext and CanvasContext should work similarly!\n // The final scale should be 1.8.\n // ctx.scale(0.9, 0.9);\n // ctx.scale(2.0, 2.0);\n ctx.scale(1.8, 1.8);\n ctx.fillStyle = '#221';\n ctx.strokeStyle = '#221';\n ctx.font = '10pt Arial';\n}\nfunction basic(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 450, 250);\n setContextStyle(ctx);\n const stave = new Stave(10, 0, 250).addClef('treble');\n stave.setContext(ctx).draw();\n const formatter = new Formatter();\n const voice = new Voice(Flow.TIME4_4).setStrict(false);\n const note_head1 = new NoteHead({ duration: '4', line: 3 });\n const note_head2 = new NoteHead({ duration: '1', line: 2.5 });\n const note_head3 = new NoteHead({ duration: '2', line: 0 });\n voice.addTickables([note_head1, note_head2, note_head3]);\n formatter.joinVoices([voice]).formatToStave([voice], stave);\n voice.draw(ctx, stave);\n ok('Basic NoteHead test');\n}\n/**\n * Used by the next two test cases to draw a note.\n */\nfunction showNote(noteStruct, stave, ctx, x) {\n const note = new StaveNote(noteStruct).setStave(stave);\n new TickContext().addTickable(note).preFormat().setX(x);\n note.setContext(ctx).draw();\n return note;\n}\nfunction variousHeads(options, contextBuilder) {\n const notes = [\n { keys: ['g/5/d0'], duration: '4' },\n { keys: ['g/5/d1'], duration: '4' },\n { keys: ['g/5/d2'], duration: '4' },\n { keys: ['g/5/d3'], duration: '4' },\n { keys: ['x/'], duration: '1' },\n { keys: ['g/5/t0'], duration: '1' },\n { keys: ['g/5/t1'], duration: '4' },\n { keys: ['g/5/t2'], duration: '4' },\n { keys: ['g/5/t3'], duration: '4' },\n { keys: ['x/'], duration: '1' },\n { keys: ['g/5/x0'], duration: '1' },\n { keys: ['g/5/x1'], duration: '4' },\n { keys: ['g/5/x2'], duration: '4' },\n { keys: ['g/5/x3'], duration: '4' },\n { keys: ['x/'], duration: '1' },\n { keys: ['g/5/s1'], duration: '4' },\n { keys: ['g/5/s2'], duration: '4' },\n { keys: ['x/'], duration: '1' },\n { keys: ['g/5/r1'], duration: '4' },\n { keys: ['g/5/r2'], duration: '4' },\n ];\n const ctx = contextBuilder(options.elementId, notes.length * 25 + 100, 240);\n // Draw two staves, one with up-stems and one with down-stems.\n for (let staveNum = 0; staveNum < 2; ++staveNum) {\n const stave = new Stave(10, 10 + staveNum * 120, notes.length * 25 + 75)\n .addClef('percussion')\n .setContext(ctx)\n .draw();\n for (let i = 0; i < notes.length; ++i) {\n const note = notes[i];\n note.stem_direction = staveNum === 0 ? -1 : 1;\n const staveNote = showNote(note, stave, ctx, (i + 1) * 25);\n ok(staveNote.getX() > 0, 'Note ' + i + ' has X value');\n ok(staveNote.getYs().length > 0, 'Note ' + i + ' has Y values');\n }\n }\n}\nfunction drumChordHeads(options, contextBuilder) {\n const notes = [\n { keys: ['a/4/d0', 'g/5/x3'], duration: '4' },\n { keys: ['a/4/x3', 'g/5/d0'], duration: '4' },\n { keys: ['a/4/d1', 'g/5/x2'], duration: '4' },\n { keys: ['a/4/x2', 'g/5/d1'], duration: '4' },\n { keys: ['a/4/d2', 'g/5/x1'], duration: '4' },\n { keys: ['a/4/x1', 'g/5/d2'], duration: '4' },\n { keys: ['a/4/d3', 'g/5/x0'], duration: '4' },\n { keys: ['a/4/x0', 'g/5/d3'], duration: '4' },\n { keys: ['a/4', 'g/5/d0'], duration: '4' },\n { keys: ['a/4/x3', 'g/5'], duration: '4' },\n { keys: ['a/4/t0', 'g/5/s1'], duration: '4' },\n { keys: ['a/4/s1', 'g/5/t0'], duration: '4' },\n { keys: ['a/4/t1', 'g/5/s2'], duration: '4' },\n { keys: ['a/4/s2', 'g/5/t1'], duration: '4' },\n { keys: ['a/4/t2', 'g/5/r1'], duration: '4' },\n { keys: ['a/4/r1', 'g/5/t2'], duration: '4' },\n { keys: ['a/4/t3', 'g/5/r2'], duration: '4' },\n { keys: ['a/4/r2', 'g/5/t3'], duration: '4' },\n ];\n const ctx = contextBuilder(options.elementId, notes.length * 25 + 100, 240);\n // Draw two staves, one with up-stems and one with down-stems.\n for (let h = 0; h < 2; ++h) {\n const stave = new Stave(10, 10 + h * 120, notes.length * 25 + 75).addClef('percussion').setContext(ctx).draw();\n for (let i = 0; i < notes.length; ++i) {\n const note = notes[i];\n note.stem_direction = h === 0 ? -1 : 1;\n const staveNote = showNote(note, stave, ctx, (i + 1) * 25);\n ok(staveNote.getX() > 0, 'Note ' + i + ' has X value');\n ok(staveNote.getYs().length > 0, 'Note ' + i + ' has Y values');\n }\n }\n}\nfunction basicBoundingBoxes(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 450, 250);\n setContextStyle(ctx);\n // 250 is 450/1.8\n const stave = new Stave(10, 0, 250).addClef('treble');\n stave.setContext(ctx).draw();\n const formatter = new Formatter();\n const voice = new Voice(Flow.TIME4_4).setStrict(false);\n const nh1 = new NoteHead({ duration: '4', line: 3 });\n const nh2 = new NoteHead({ duration: '2', line: 2.5 });\n const nh3 = new NoteHead({ duration: '1', line: 0 });\n voice.addTickables([nh1, nh2, nh3]);\n formatter.joinVoices([voice]).formatToStave([voice], stave);\n voice.draw(ctx, stave);\n for (const bb of [nh1.getBoundingBox(), nh2.getBoundingBox(), nh3.getBoundingBox()]) {\n ctx.rect(bb.getX(), bb.getY(), bb.getW(), bb.getH());\n }\n ctx.stroke();\n ok('NoteHead Bounding Boxes');\n}\nVexFlowTests.register(NoteHeadTests);\nexport { NoteHeadTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// Author: Taehoon Moon 2016\n//\n// NoteSubGroup Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { BarNote } from '../src/barnote';\nimport { Note } from '../src/note';\nimport { BarlineType } from '../src/stavebarline';\nconst NoteSubGroupTests = {\n Start() {\n QUnit.module('NoteSubGroup');\n const run = VexFlowTests.runTests;\n run('Basic - ClefNote, TimeSigNote and BarNote', basic);\n run('Multi Voice', multiVoiceSingleDraw);\n run('Multi Voice Multiple Draws', multiVoiceDoubleDraw);\n run('Multi Staff', multiStaff);\n },\n};\n// Return three helper functions for creating StaveNotes, and adding Accidental & NoteSubGroup to those StaveNotes.\nfunction createShortcuts(f) {\n return {\n createStaveNote: (noteStruct) => f.StaveNote(noteStruct),\n addAccidental: (note, accid) => note.addModifier(f.Accidental({ type: accid }), 0),\n addSubGroup: (note, subNotes) => note.addModifier(f.NoteSubGroup({ notes: subNotes }), 0),\n };\n}\nfunction basic(options) {\n const f = VexFlowTests.makeFactory(options, 750, 200);\n const ctx = f.getContext();\n const stave = f.Stave({ width: 600 }).addClef('treble');\n const { createStaveNote, addAccidental, addSubGroup } = createShortcuts(f);\n const notes = [\n { keys: ['f/5'], stem_direction: -1, duration: '4' },\n { keys: ['d/4'], stem_direction: -1, duration: '4', clef: 'bass' },\n { keys: ['g/4'], stem_direction: -1, duration: '4', clef: 'alto' },\n { keys: ['a/4'], stem_direction: -1, duration: '4', clef: 'alto' },\n { keys: ['c/4'], stem_direction: -1, duration: '4', clef: 'tenor' },\n { keys: ['c/3'], stem_direction: +1, duration: '4', clef: 'tenor' },\n { keys: ['d/4'], stem_direction: -1, duration: '4', clef: 'tenor' },\n { keys: ['f/4'], stem_direction: -1, duration: '4', clef: 'tenor' },\n ].map(createStaveNote);\n addAccidental(notes[1], '#');\n addAccidental(notes[2], 'n');\n addSubGroup(notes[1], [f.ClefNote({ type: 'bass', options: { size: 'small' } })]);\n addSubGroup(notes[2], [f.ClefNote({ type: 'alto', options: { size: 'small' } })]);\n addSubGroup(notes[4], [f.ClefNote({ type: 'tenor', options: { size: 'small' } }), new BarNote()]);\n addSubGroup(notes[5], [f.TimeSigNote({ time: '6/8' })]);\n addSubGroup(notes[6], [new BarNote(BarlineType.REPEAT_BEGIN)]);\n addAccidental(notes[4], 'b');\n addAccidental(notes[6], 'bb');\n const voice = f.Voice().setStrict(false).addTickables(notes);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n notes.forEach((note) => Note.plotMetrics(ctx, note, 150));\n VexFlowTests.plotLegendForNoteWidth(ctx, 620, 120);\n ok(true, 'all pass');\n}\nfunction multiVoiceSingleDraw(options) {\n multiVoiceHelper(options, 1);\n}\n/**\n * Call Factory.draw() twice. It should look identical to the multiVoice test case above.\n */\nfunction multiVoiceDoubleDraw(options) {\n multiVoiceHelper(options, 2);\n}\n/**\n * Used by multiVoiceSingleDraw and multiVoiceDoubleDraw above.\n */\nfunction multiVoiceHelper(options, numDraws) {\n const f = VexFlowTests.makeFactory(options, 550, 200);\n const ctx = f.getContext();\n const stave = f.Stave().addClef('treble');\n const { createStaveNote, addAccidental, addSubGroup } = createShortcuts(f);\n const notes1 = [\n { keys: ['f/5'], stem_direction: 1, duration: '4' },\n { keys: ['d/4'], stem_direction: 1, duration: '4', clef: 'bass' },\n { keys: ['c/5'], stem_direction: 1, duration: '4', clef: 'alto' },\n { keys: ['c/5'], stem_direction: 1, duration: '4', clef: 'soprano' },\n ].map(createStaveNote);\n const notes2 = [\n { keys: ['c/4'], stem_direction: -1, duration: '4' },\n { keys: ['c/3'], stem_direction: -1, duration: '4', clef: 'bass' },\n { keys: ['d/4'], stem_direction: -1, duration: '4', clef: 'alto' },\n { keys: ['f/4'], stem_direction: -1, duration: '4', clef: 'soprano' },\n ].map(createStaveNote);\n addAccidental(notes1[1], '#');\n addSubGroup(notes1[1], [\n f.ClefNote({ type: 'bass', options: { size: 'small' } }),\n new BarNote(BarlineType.REPEAT_BEGIN),\n f.TimeSigNote({ time: '3/4' }),\n ]);\n addSubGroup(notes2[2], [\n f.ClefNote({ type: 'alto', options: { size: 'small' } }),\n f.TimeSigNote({ time: '9/8' }),\n new BarNote(BarlineType.DOUBLE),\n ]);\n addSubGroup(notes1[3], [f.ClefNote({ type: 'soprano', options: { size: 'small' } })]);\n addAccidental(notes1[2], 'b');\n addAccidental(notes2[3], '#');\n const voices = [f.Voice().addTickables(notes1), f.Voice().addTickables(notes2)];\n f.Formatter().joinVoices(voices).formatToStave(voices, stave);\n for (let i = 0; i < numDraws; i++) {\n f.draw();\n }\n notes1.forEach((note) => Note.plotMetrics(ctx, note, 150));\n ok(true, 'all pass');\n}\nfunction multiStaff(options) {\n const f = VexFlowTests.makeFactory(options, 550, 400);\n const { createStaveNote, addAccidental, addSubGroup } = createShortcuts(f);\n const stave1 = f.Stave({ x: 15, y: 30, width: 500 }).setClef('treble');\n const notes1 = [\n { keys: ['f/5'], stem_direction: 1, duration: '4' },\n { keys: ['d/4'], stem_direction: 1, duration: '4', clef: 'bass' },\n { keys: ['c/5'], stem_direction: 1, duration: '4', clef: 'alto' },\n { keys: ['c/5'], stem_direction: 1, duration: '4', clef: 'soprano' },\n ].map(createStaveNote);\n const notes2 = [\n { keys: ['c/4'], stem_direction: -1, duration: '4' },\n { keys: ['c/3'], stem_direction: -1, duration: '4', clef: 'bass' },\n { keys: ['d/4'], stem_direction: -1, duration: '4', clef: 'alto' },\n { keys: ['f/4'], stem_direction: -1, duration: '4', clef: 'soprano' },\n ].map(createStaveNote);\n const stave2 = f.Stave({ x: 15, y: 150, width: 500 }).setClef('bass');\n const notes3 = [\n { keys: ['e/3'], duration: '8', stem_direction: -1, clef: 'bass' },\n { keys: ['g/4'], duration: '8', stem_direction: 1, clef: 'treble' },\n { keys: ['d/4'], duration: '8', stem_direction: 1, clef: 'treble' },\n { keys: ['f/4'], duration: '8', stem_direction: 1, clef: 'treble' },\n { keys: ['c/4'], duration: '8', stem_direction: 1, clef: 'treble' },\n { keys: ['g/3'], duration: '8', stem_direction: -1, clef: 'bass' },\n { keys: ['d/3'], duration: '8', stem_direction: -1, clef: 'bass' },\n { keys: ['f/3'], duration: '8', stem_direction: -1, clef: 'bass' },\n ].map(createStaveNote);\n f.StaveConnector({ top_stave: stave1, bottom_stave: stave2, type: 'brace' });\n f.StaveConnector({ top_stave: stave1, bottom_stave: stave2, type: 'singleLeft' });\n f.StaveConnector({ top_stave: stave1, bottom_stave: stave2, type: 'singleRight' });\n f.Beam({ notes: notes3.slice(1, 4) });\n f.Beam({ notes: notes3.slice(5) });\n addAccidental(notes1[1], '#');\n addSubGroup(notes1[1], [f.ClefNote({ type: 'bass', options: { size: 'small' } }), f.TimeSigNote({ time: '3/4' })]);\n addSubGroup(notes2[2], [f.ClefNote({ type: 'alto', options: { size: 'small' } }), f.TimeSigNote({ time: '9/8' })]);\n addSubGroup(notes1[3], [f.ClefNote({ type: 'soprano', options: { size: 'small' } })]);\n addSubGroup(notes3[1], [f.ClefNote({ type: 'treble', options: { size: 'small' } })]);\n addSubGroup(notes3[5], [f.ClefNote({ type: 'bass', options: { size: 'small' } })]);\n addAccidental(notes3[0], '#');\n addAccidental(notes3[3], 'b');\n addAccidental(notes3[5], '#');\n addAccidental(notes1[2], 'b');\n addAccidental(notes2[3], '#');\n const voice1 = f.Voice().addTickables(notes1);\n const voice2 = f.Voice().addTickables(notes2);\n const voice3 = f.Voice().addTickables(notes3);\n f.Formatter().joinVoices([voice1, voice2]).joinVoices([voice3]).formatToStave([voice1, voice2, voice3], stave1);\n f.draw();\n ok(true, 'all pass');\n}\nVexFlowTests.register(NoteSubGroupTests);\nexport { NoteSubGroupTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2021.\n// MIT License\n//\n// OffscreenCanvas Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { CanvasContext } from '../src/canvascontext';\nimport { Formatter } from '../src/formatter';\nimport { Stave } from '../src/stave';\nimport { BarlineType } from '../src/stavebarline';\nimport { StaveNote } from '../src/stavenote';\nimport { globalObject } from '../src/util';\nconst OffscreenCanvasTests = {\n Start() {\n // At the time of writing, OffscreenCanvas is still an experimental technology.\n if (globalObject().OffscreenCanvas === undefined) {\n return;\n }\n QUnit.module('OffscreenCanvas');\n test('Simple Test', simpleTest);\n },\n};\nfunction simpleTest() {\n // Create a CanvasContext from an OffscreenCanvas.\n // eslint-disable-next-line\n // @ts-ignore\n const offscreenCanvas = new OffscreenCanvas(550, 200);\n const offscreenCtx = offscreenCanvas.getContext('2d');\n if (offscreenCtx == null) {\n throw new Error(\"Couldn't create offscreen context\");\n }\n const ctx = new CanvasContext(offscreenCtx);\n // Render to the OffscreenCavans.\n const stave = new Stave(10, 50, 200);\n stave.setEndBarType(BarlineType.END);\n stave.addClef('treble').setContext(ctx).draw();\n const notes = [\n new StaveNote({ keys: ['c/4'], duration: 'q' }),\n new StaveNote({ keys: ['d/4'], duration: 'q' }),\n new StaveNote({ keys: ['b/4'], duration: 'qr' }),\n new StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: 'q' }),\n ];\n Formatter.FormatAndDraw(ctx, stave, notes);\n // Copy the contents of the OffscreenCanvas to an HTMLCanvasElement.\n const imgBmp = offscreenCanvas.transferToImageBitmap();\n const canvas = document.createElement('canvas');\n canvas.width = offscreenCanvas.width;\n canvas.height = offscreenCanvas.height;\n const canvasCtx = canvas.getContext('2d');\n if (canvasCtx == null) {\n throw new Error(\"Couldn't create canvas context\");\n }\n canvasCtx.drawImage(imgBmp, 0, 0);\n document.body.appendChild(canvas);\n ok(true, 'all pass');\n}\nVexFlowTests.register(OffscreenCanvasTests);\nexport { OffscreenCanvasTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// Author: Cyril Silverman\n//\n// Ornament Tests\n// TODO: Formatting for Jazz Ornaments is incorrect. The last note + ornament bleeds into the next measure.\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Accidental } from '../src/accidental';\nimport { Beam } from '../src/beam';\nimport { Dot } from '../src/dot';\nimport { Formatter } from '../src/formatter';\nimport { Glyph } from '../src/glyph';\nimport { Ornament } from '../src/ornament';\nimport { Stave } from '../src/stave';\nimport { StaveNote } from '../src/stavenote';\nimport { Voice, VoiceMode } from '../src/voice';\nconst OrnamentTests = {\n Start() {\n QUnit.module('Ornament');\n const run = VexFlowTests.runTests;\n run('Ornaments', drawOrnaments);\n run('Ornaments Vertically Shifted', drawOrnamentsDisplaced);\n run('Ornaments - Delayed turns', drawOrnamentsDelayed);\n run('Ornaments - Delayed turns, Multiple Draws', drawOrnamentsDelayedMultipleDraws);\n run('Stacked', drawOrnamentsStacked);\n run('With Upper/Lower Accidentals', drawOrnamentsWithAccidentals);\n run('Jazz Ornaments', jazzOrnaments);\n },\n};\nfunction drawOrnaments(options, contextBuilder) {\n expect(0);\n // Get the rendering context\n const ctx = contextBuilder(options.elementId, 750, 195);\n const stave = new Stave(10, 30, 700);\n stave.setContext(ctx).draw();\n const notes = [\n new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }),\n ];\n notes[0].addModifier(new Ornament('mordent'), 0);\n notes[1].addModifier(new Ornament('mordent_inverted'), 0);\n notes[2].addModifier(new Ornament('turn'), 0);\n notes[3].addModifier(new Ornament('turn_inverted'), 0);\n notes[4].addModifier(new Ornament('tr'), 0);\n notes[5].addModifier(new Ornament('upprall'), 0);\n notes[6].addModifier(new Ornament('downprall'), 0);\n notes[7].addModifier(new Ornament('prallup'), 0);\n notes[8].addModifier(new Ornament('pralldown'), 0);\n notes[9].addModifier(new Ornament('upmordent'), 0);\n notes[10].addModifier(new Ornament('downmordent'), 0);\n notes[11].addModifier(new Ornament('lineprall'), 0);\n notes[12].addModifier(new Ornament('prallprall'), 0);\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, stave, notes);\n}\nfunction drawOrnamentsDisplaced(options, contextBuilder) {\n expect(0);\n // Get the rendering context\n const ctx = contextBuilder(options.elementId, 750, 195);\n const stave = new Stave(10, 30, 700);\n stave.setContext(ctx).draw();\n const notes = [\n new StaveNote({ keys: ['a/5'], duration: '4', stem_direction: -1 }),\n new StaveNote({ keys: ['a/5'], duration: '4', stem_direction: -1 }),\n new StaveNote({ keys: ['a/5'], duration: '4', stem_direction: -1 }),\n new StaveNote({ keys: ['a/5'], duration: '4', stem_direction: -1 }),\n new StaveNote({ keys: ['a/5'], duration: '4', stem_direction: -1 }),\n new StaveNote({ keys: ['a/5'], duration: '4', stem_direction: -1 }),\n new StaveNote({ keys: ['a/5'], duration: '4', stem_direction: -1 }),\n new StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }),\n ];\n notes[0].addModifier(new Ornament('mordent'), 0);\n notes[1].addModifier(new Ornament('mordent_inverted'), 0);\n notes[1].addModifier(new Ornament('mordent_inverted'), 0);\n notes[2].addModifier(new Ornament('turn'), 0);\n notes[3].addModifier(new Ornament('turn_inverted'), 0);\n notes[4].addModifier(new Ornament('tr'), 0);\n notes[5].addModifier(new Ornament('upprall'), 0);\n notes[6].addModifier(new Ornament('downprall'), 0);\n notes[7].addModifier(new Ornament('prallup'), 0);\n notes[8].addModifier(new Ornament('pralldown'), 0);\n notes[9].addModifier(new Ornament('upmordent'), 0);\n notes[10].addModifier(new Ornament('downmordent'), 0);\n notes[11].addModifier(new Ornament('lineprall'), 0);\n notes[12].addModifier(new Ornament('prallprall'), 0);\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, stave, notes);\n}\n/**\n * Helper function for the next two tests: drawOrnamentsDelayed and drawOrnamentsDelayedMultipleDraws.\n * setDelayed(true) shifts the turn symbol to the right (after its note).\n */\nconst addDelayedTurns = (options, contextBuilder) => {\n // Get the rendering context\n const context = contextBuilder(options.elementId, 550, 195);\n const stave = new Stave(10, 30, 500);\n stave.setContext(context).draw();\n const notes = [\n new StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }),\n ];\n notes[0].addModifier(new Ornament('turn').setDelayed(true), 0);\n notes[1].addModifier(new Ornament('turn_inverted').setDelayed(true), 0);\n notes[2].addModifier(new Ornament('turn_inverted').setDelayed(true), 0);\n notes[3].addModifier(new Ornament('turn').setDelayed(true), 0);\n return { context, stave, notes };\n};\nfunction drawOrnamentsDelayed(options, contextBuilder) {\n expect(0);\n const { context, stave, notes } = addDelayedTurns(options, contextBuilder);\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(context, stave, notes);\n}\nfunction drawOrnamentsDelayedMultipleDraws(options, contextBuilder) {\n expect(0);\n const { context, stave, notes } = addDelayedTurns(options, contextBuilder);\n // We can FormatAndDraw() two times, and it looks fine.\n // However, if you inspect the SVG element, you will see duplicate paths.\n Formatter.FormatAndDraw(context, stave, notes);\n Formatter.FormatAndDraw(context, stave, notes);\n}\nfunction drawOrnamentsStacked(options, contextBuilder) {\n expect(0);\n // Get the rendering context\n const ctx = contextBuilder(options.elementId, 550, 195);\n const stave = new Stave(10, 30, 500);\n stave.setContext(ctx).draw();\n const notes = [\n new StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }),\n ];\n notes[0].addModifier(new Ornament('mordent'), 0);\n notes[1].addModifier(new Ornament('turn_inverted'), 0);\n notes[2].addModifier(new Ornament('turn'), 0);\n notes[3].addModifier(new Ornament('turn_inverted'), 0);\n notes[0].addModifier(new Ornament('turn'), 0);\n notes[1].addModifier(new Ornament('prallup'), 0);\n notes[2].addModifier(new Ornament('upmordent'), 0);\n notes[3].addModifier(new Ornament('lineprall'), 0);\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, stave, notes);\n}\nfunction drawOrnamentsWithAccidentals(options, contextBuilder) {\n expect(0);\n // Get the rendering context\n const ctx = contextBuilder(options.elementId, 650, 250);\n const stave = new Stave(10, 60, 600);\n stave.setContext(ctx).draw();\n const notes = [\n new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }),\n new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }),\n ];\n notes[0].addModifier(new Ornament('mordent').setUpperAccidental('#').setLowerAccidental('#'), 0);\n notes[1].addModifier(new Ornament('turn_inverted').setLowerAccidental('b').setUpperAccidental('b'), 0);\n notes[1].addModifier(new Ornament('turn_inverted').setLowerAccidental('b').setUpperAccidental('b'), 0);\n notes[2].addModifier(new Ornament('turn').setUpperAccidental('##').setLowerAccidental('##'), 0);\n notes[3].addModifier(new Ornament('mordent_inverted').setLowerAccidental('db').setUpperAccidental('db'), 0);\n notes[4].addModifier(new Ornament('turn_inverted').setUpperAccidental('++').setLowerAccidental('++'), 0);\n notes[5].addModifier(new Ornament('tr').setUpperAccidental('n').setLowerAccidental('n'), 0);\n notes[6].addModifier(new Ornament('prallup').setUpperAccidental('d').setLowerAccidental('d'), 0);\n notes[7].addModifier(new Ornament('lineprall').setUpperAccidental('db').setLowerAccidental('db'), 0);\n notes[8].addModifier(new Ornament('upmordent').setUpperAccidental('bbs').setLowerAccidental('bbs'), 0);\n notes[9].addModifier(new Ornament('prallprall').setUpperAccidental('bb').setLowerAccidental('bb'), 0);\n notes[10].addModifier(new Ornament('turn_inverted').setUpperAccidental('+').setLowerAccidental('+'), 0);\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, stave, notes);\n}\nfunction jazzOrnaments(options) {\n const clefWidth = Glyph.getWidth('gClef', 38); // widest clef\n // Helper function.\n function draw(modifiers, keys, x, width, y, stemDirection) {\n // Helper function to create a StaveNote.\n const note = (keys, duration, modifier, stemDirection) => {\n const n = new StaveNote({ keys, duration, stem_direction: stemDirection })\n .addModifier(modifier, 0)\n .addModifier(new Accidental('b'), 0);\n const dot = duration.indexOf('d') >= 0;\n if (dot) {\n Dot.buildAndAttach([n], { all: true });\n }\n return n;\n };\n const stave = new Stave(x, y, width).addClef('treble').setContext(ctx).draw();\n const notes = [\n note(keys, '4d', modifiers[0], stemDirection),\n note(keys, '8', modifiers[1], stemDirection),\n note(keys, '4d', modifiers[2], stemDirection),\n note(keys, '8', modifiers[3], stemDirection),\n ];\n if (modifiers.length > 4) {\n notes[3].addModifier(modifiers[4], 0);\n }\n Beam.generateBeams(notes);\n const voice = new Voice({\n num_beats: 4,\n beat_value: 4,\n }).setMode(VoiceMode.SOFT);\n voice.addTickables(notes);\n const formatter = new Formatter().joinVoices([voice]);\n formatter.format([voice], width - Stave.defaultPadding - clefWidth);\n stave.setContext(ctx).draw();\n voice.draw(ctx, stave);\n }\n expect(0);\n const f = VexFlowTests.makeFactory(options, 950, 400);\n const ctx = f.getContext();\n ctx.scale(1, 1);\n ctx.fillStyle = '#221';\n ctx.strokeStyle = '#221';\n const xStart = 10;\n const width = 300;\n const yStart = 50;\n const staffHeight = 70;\n let curX = xStart;\n let curY = yStart;\n let mods = [\n // measure 1\n new Ornament('scoop'),\n new Ornament('doit'),\n new Ornament('fall'),\n new Ornament('doitLong'),\n ];\n draw(mods, ['a/5'], curX, width, curY, -1);\n curX += width;\n mods = [\n // measure 2\n new Ornament('fallLong'),\n new Ornament('bend'),\n new Ornament('plungerClosed'),\n new Ornament('plungerOpen'),\n new Ornament('bend'),\n ];\n draw(mods, ['a/5'], curX, width, curY, -1);\n curX += width;\n mods = [\n // measure 3\n new Ornament('flip'),\n new Ornament('jazzTurn'),\n new Ornament('smear'),\n new Ornament('doit'),\n ];\n draw(mods, ['a/5'], curX, width, curY, 1);\n // second line\n curX = xStart;\n curY += staffHeight;\n mods = [\n // measure 4\n new Ornament('scoop'),\n new Ornament('doit'),\n new Ornament('fall'),\n new Ornament('doitLong'),\n ];\n draw(mods, ['e/5'], curX, width, curY);\n curX += width;\n mods = [\n // measure 5\n new Ornament('fallLong'),\n new Ornament('bend'),\n new Ornament('plungerClosed'),\n new Ornament('plungerOpen'),\n new Ornament('bend'),\n ];\n draw(mods, ['e/5'], curX, width, curY);\n curX += width;\n mods = [\n // measure 6\n new Ornament('flip'),\n new Ornament('jazzTurn'),\n new Ornament('smear'),\n new Ornament('doit'),\n ];\n draw(mods, ['e/5'], curX, width, curY);\n // third line\n curX = xStart;\n curY += staffHeight;\n mods = [\n // measure 7\n new Ornament('scoop'),\n new Ornament('doit'),\n new Ornament('fall'),\n new Ornament('doitLong'),\n ];\n draw(mods, ['e/4'], curX, width, curY);\n curX += width;\n mods = [\n // measure 8\n new Ornament('fallLong'),\n new Ornament('bend'),\n new Ornament('plungerClosed'),\n new Ornament('plungerOpen'),\n new Ornament('bend'),\n ];\n draw(mods, ['e/4'], curX, width, curY);\n curX += width;\n mods = [\n // measure 9\n new Ornament('flip'),\n new Ornament('jazzTurn'),\n new Ornament('smear'),\n new Ornament('doit'),\n ];\n draw(mods, ['e/4'], curX, width, curY);\n}\nVexFlowTests.register(OrnamentTests);\nexport { OrnamentTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Parser Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Parser } from '../src/parser';\nconst ParserTests = {\n Start() {\n QUnit.module('Parser');\n test('Basic', basic);\n test('Advanced', advanced);\n test('Mixed', mixed);\n test('Micro Score', microscore);\n },\n};\n/**\n * Grammar used in the first three test cases: basic, advanced, mixed.\n */\nclass TestGrammar {\n // The begin() function is the only requirement when implementing the Grammar interface.\n begin() {\n return () => ({ expect: this.expect });\n }\n BIGORLITTLE() {\n return { expect: [this.BIGLINE, this.LITTLELINE], or: true };\n }\n BIGLINE() {\n return { expect: [this.LBRACE, this.WORD, this.WORDS, this.MAYBEEXCLAIM, this.RBRACE] };\n }\n LITTLELINE() {\n return { expect: [this.WORD, this.WORDS] };\n }\n WORDS() {\n return { expect: [this.COMMA, this.WORD], zeroOrMore: true };\n }\n MAYBEEXCLAIM() {\n return { expect: [this.EXCLAIM], maybe: true };\n }\n LBRACE() {\n return { token: '[{]' };\n }\n RBRACE() {\n return { token: '[}]' };\n }\n WORD() {\n return { token: '[a-zA-Z]+' };\n }\n COMMA() {\n return { token: '[,]' };\n }\n EXCLAIM() {\n return { token: '[!]' };\n }\n EOL() {\n return { token: '$' };\n }\n}\n/**\n * Grammar used in the microscore test case.\n * It represents a series of piano key numbers (Middle C == 40) separated by whitespace.\n * C Major Scale => 40 42 44 45 47 49 51 52\n * A chord is 2 or more piano key numbers surrounded by BRACKETS and separated by PERIODS\n * C Major == [40.44.47]\n * C-major F-major G-major A-minor chord progression => [40.44.47] [45.49.52] [47.51.54] [49.52.56]\n */\nclass MicroScoreGrammar {\n constructor() {\n this.ITEM = () => ({ expect: [this.PIANO_KEY_NUMBER, this.CHORD], or: true });\n this.MAYBE_MORE_ITEMS = () => ({ expect: [this.ITEM], zeroOrMore: true });\n this.PIANO_KEY_NUMBER = () => ({ expect: [this.NUM], oneOrMore: true });\n this.CHORD = () => ({ expect: [this.LEFT_BRACKET, this.PIANO_KEY_NUMBER, this.MORE_CHORD_PARTS, this.RIGHT_BRACKET] });\n this.MORE_CHORD_PARTS = () => ({ expect: [this.PERIOD, this.PIANO_KEY_NUMBER], oneOrMore: true });\n this.NUM = () => ({ token: '\\\\d+' });\n this.WHITESPACE = () => ({ token: '\\\\s+' });\n this.PERIOD = () => ({ token: '\\\\.' });\n this.LEFT_BRACKET = () => ({ token: '\\\\[' });\n this.RIGHT_BRACKET = () => ({ token: '\\\\]' });\n this.EOL = () => ({ token: '$' });\n }\n begin() {\n return () => ({ expect: [this.ITEM, this.MAYBE_MORE_ITEMS, this.EOL] });\n }\n}\n/**\n * Check that the result is a parse failure, and verify the error position.\n */\nfunction fails(result, expectedErrorPos, msg) {\n notOk(result.success, msg);\n equal(result.errorPos, expectedErrorPos, msg);\n}\nfunction basic() {\n const grammar = new TestGrammar();\n grammar.expect = [grammar.LITTLELINE, grammar.EOL];\n const parser = new Parser(grammar);\n // Each of these strings will parse correctly.\n const mustPass = ['first, second', 'first,second', 'first', 'first,second, third'];\n mustPass.forEach((line) => equal(parser.parse(line).success, true, line));\n fails(parser.parse(''), 0);\n fails(parser.parse('first second'), 6);\n fails(parser.parse('first,,'), 5);\n fails(parser.parse('first,'), 5);\n fails(parser.parse(',,'), 0);\n}\nfunction advanced() {\n const grammar = new TestGrammar();\n grammar.expect = [grammar.BIGLINE, grammar.EOL];\n const parser = new Parser(grammar);\n const mustPass = ['{first}', '{first!}', '{first,second}', '{first,second!}', '{first,second,third!}'];\n mustPass.forEach((line) => equal(parser.parse(line).success, true, line));\n fails(parser.parse('{first,second,third,}'), 19);\n fails(parser.parse('first,second,third'), 0);\n fails(parser.parse('{first,second,third'), 19);\n fails(parser.parse('{!}'), 1);\n}\nfunction mixed() {\n const grammar = new TestGrammar();\n grammar.expect = [grammar.BIGORLITTLE, grammar.EOL];\n const parser = new Parser(grammar);\n const mustPass = ['{first,second,third!}', 'first, second'];\n mustPass.forEach((line) => equal(parser.parse(line).success, true, line));\n fails(parser.parse('first second'), 6);\n}\nfunction microscore() {\n const grammar = new MicroScoreGrammar();\n const parser = new Parser(grammar);\n const mustPass = [\n '40 42 44 45 47 49 51 52',\n '[40.44.47] [45.49.52] [47.51.54] [49.52.56]',\n '40 [40.44.47] 45 47 [44.47.51]', // Mixed Notes and Chords: C4 [Cmajor] F4 G4 [Eminor]\n ];\n mustPass.forEach((line) => {\n var _a;\n const result = parser.parse(line);\n equal(result.success, true, line);\n equal((_a = result.matches) === null || _a === void 0 ? void 0 : _a.length, 3, line);\n });\n fails(parser.parse('40 42 44 45 47 49 5A 52'), 19);\n fails(parser.parse('40.44.47] [45.49.52] [47.51.54] [49.52.56]'), 2);\n fails(parser.parse('40 [40] 45 47 [44.47.51]'), 3); // A chord with a single note is not allowed.\n}\nVexFlowTests.register(ParserTests);\nexport { ParserTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// PedalMarking Tests\n// TODO: Fix Error => Type 'Tickable' is not assignable to type 'StaveNote'.\nimport { VexFlowTests } from './vexflow_test_helpers';\nconst PedalMarkingTests = {\n Start() {\n QUnit.module('PedalMarking');\n const run = VexFlowTests.runTests;\n run('Simple Pedal 1', simple1);\n run('Simple Pedal 2', simple2);\n run('Simple Pedal 3', simple3);\n run('Release and Depress on Same Note 1', releaseDepress1);\n run('Release and Depress on Same Note 2', releaseDepress2);\n run('Custom Text 1', customTest1);\n run('Custom Text 2', customTest2);\n },\n};\n/**\n * Every test below uses this to set up the score and two staves/voices.\n */\nfunction createTest(makePedal) {\n return (options) => {\n const f = VexFlowTests.makeFactory(options, 550, 200);\n const score = f.EasyScore();\n const stave0 = f.Stave({ width: 250 }).addClef('treble');\n const voice0 = score.voice(score.notes('b4/4, b4, b4, b4[stem=\"down\"]', { stem: 'up' }));\n f.Formatter().joinVoices([voice0]).formatToStave([voice0], stave0);\n const stave1 = f.Stave({ width: 260, x: 250 });\n const voice1 = score.voice(score.notes('c4/4, c4, c4, c4', { stem: 'up' }));\n f.Formatter().joinVoices([voice1]).formatToStave([voice1], stave1);\n makePedal(f, voice0.getTickables(), voice1.getTickables());\n f.draw();\n ok(true, 'Must render');\n };\n}\nfunction withSimplePedal(style) {\n return (factory, notes0, notes1) => factory.PedalMarking({\n notes: [notes0[0], notes0[2], notes0[3], notes1[3]],\n options: { style },\n });\n}\nfunction withReleaseAndDepressedPedal(style) {\n return (factory, notes0, notes1) => factory.PedalMarking({\n notes: [notes0[0], notes0[3], notes0[3], notes1[1], notes1[1], notes1[3]],\n options: { style },\n });\n}\nconst simple1 = createTest(withSimplePedal('text'));\nconst simple2 = createTest(withSimplePedal('bracket'));\nconst simple3 = createTest(withSimplePedal('mixed'));\nconst releaseDepress1 = createTest(withReleaseAndDepressedPedal('bracket'));\nconst releaseDepress2 = createTest(withReleaseAndDepressedPedal('mixed'));\nconst customTest1 = createTest((factory, notes0, notes1) => {\n const pedal = factory.PedalMarking({\n notes: [notes0[0], notes1[3]],\n options: { style: 'text' },\n });\n pedal.setCustomText('una corda', 'tre corda');\n return pedal;\n});\nconst customTest2 = createTest((factory, notes0, notes1) => {\n const pedal = factory.PedalMarking({\n notes: [notes0[0], notes1[3]],\n options: { style: 'mixed' },\n });\n pedal.setCustomText('Sost. Ped.');\n return pedal;\n});\nVexFlowTests.register(PedalMarkingTests);\nexport { PedalMarkingTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// Author: Mike Corrigan 2012 \n//\n// Percussion Tests\n// TODO: Type 'Tickable[]' is not assignable to type 'StemmableNote[]'.\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Dot, Font, FontStyle, FontWeight, Stave, StaveNote, TickContext, Tremolo, } from '../src/index';\nconst PercussionTests = {\n Start() {\n QUnit.module('Percussion');\n const run = VexFlowTests.runTests;\n run('Percussion Clef', draw);\n run('Percussion Notes', drawNotes);\n run('Percussion Basic0', basic0);\n run('Percussion Basic1', basic1);\n run('Percussion Basic2', basic2);\n run('Percussion Snare0', snare0);\n run('Percussion Snare1', snare1);\n run('Percussion Snare2', snare2);\n run('Percussion Snare3', snare3);\n },\n};\nfunction draw(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 400, 120);\n new Stave(10, 10, 300).addClef('percussion').setContext(ctx).draw();\n ok(true);\n}\n/**\n * Helper function used by the drawNotes() test case below.\n */\nfunction showNote(struct, stave, ctx, x) {\n const staveNote = new StaveNote(struct).setStave(stave);\n new TickContext().addTickable(staveNote).preFormat().setX(x);\n staveNote.setContext(ctx).draw();\n return staveNote;\n}\nfunction drawNotes(options, contextBuilder) {\n const notes = [\n { keys: ['g/5/d0'], duration: '4' },\n { keys: ['g/5/d1'], duration: '4' },\n { keys: ['g/5/d2'], duration: '4' },\n { keys: ['g/5/d3'], duration: '4' },\n { keys: ['x/'], duration: '1' },\n { keys: ['g/5/t0'], duration: '1' },\n { keys: ['g/5/t1'], duration: '4' },\n { keys: ['g/5/t2'], duration: '4' },\n { keys: ['g/5/t3'], duration: '4' },\n { keys: ['x/'], duration: '1' },\n { keys: ['g/5/x0'], duration: '1' },\n { keys: ['g/5/x1'], duration: '4' },\n { keys: ['g/5/x2'], duration: '4' },\n { keys: ['g/5/x3'], duration: '4' },\n ];\n const ctx = contextBuilder(options.elementId, notes.length * 25 + 100, 240);\n // Draw two staves, one with up-stems and one with down-stems.\n for (let h = 0; h < 2; ++h) {\n const stave = new Stave(10, 10 + h * 120, notes.length * 25 + 75).addClef('percussion').setContext(ctx).draw();\n for (let i = 0; i < notes.length; ++i) {\n const note = notes[i];\n note.stem_direction = h === 0 ? -1 : 1;\n const staveNote = showNote(note, stave, ctx, (i + 1) * 25);\n ok(staveNote.getX() > 0, 'Note ' + i + ' has X value');\n ok(staveNote.getYs().length > 0, 'Note ' + i + ' has Y values');\n }\n }\n}\n/**\n * Helper function for the seven test cases below.\n * Adds a percussion clef (two short vertical bars, like a pause sign) to the stave.\n */\nfunction createSingleMeasureTest(setup) {\n return (options) => {\n const f = VexFlowTests.makeFactory(options, 500);\n const stave = f.Stave().addClef('percussion');\n setup(f);\n f.Formatter().joinVoices(f.getVoices()).formatToStave(f.getVoices(), stave);\n f.draw();\n ok(true);\n };\n}\nconst basic0 = createSingleMeasureTest((f) => {\n const voice0 = f\n .Voice()\n .addTickables([\n f.StaveNote({ keys: ['g/5/x2'], duration: '8' }),\n f.StaveNote({ keys: ['g/5/x2'], duration: '8' }),\n f.StaveNote({ keys: ['g/5/x2'], duration: '8' }),\n f.StaveNote({ keys: ['g/5/x2'], duration: '8' }),\n f.StaveNote({ keys: ['g/5/x2'], duration: '8' }),\n f.StaveNote({ keys: ['g/5/x2'], duration: '8' }),\n f.StaveNote({ keys: ['g/5/x2'], duration: '8' }),\n f.StaveNote({ keys: ['g/5/x2'], duration: '8' }),\n ]);\n const voice1 = f\n .Voice()\n .addTickables([\n f.StaveNote({ keys: ['f/4'], duration: '8', stem_direction: -1 }),\n f.StaveNote({ keys: ['f/4'], duration: '8', stem_direction: -1 }),\n f.StaveNote({ keys: ['d/4/x2', 'c/5'], duration: '4', stem_direction: -1 }),\n f.StaveNote({ keys: ['f/4'], duration: '8', stem_direction: -1 }),\n f.StaveNote({ keys: ['f/4'], duration: '8', stem_direction: -1 }),\n f.StaveNote({ keys: ['d/4/x2', 'c/5'], duration: '4', stem_direction: -1 }),\n ]);\n f.Beam({ notes: voice0.getTickables() });\n f.Beam({ notes: voice1.getTickables().slice(0, 2) });\n f.Beam({ notes: voice1.getTickables().slice(3, 5) });\n});\nconst basic1 = createSingleMeasureTest((f) => {\n f.Voice().addTickables([\n f.StaveNote({ keys: ['f/5/x2'], duration: '4' }),\n f.StaveNote({ keys: ['f/5/x2'], duration: '4' }),\n f.StaveNote({ keys: ['f/5/x2'], duration: '4' }),\n f.StaveNote({ keys: ['f/5/x2'], duration: '4' }),\n ]);\n f.Voice().addTickables([\n f.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: -1 }),\n f.StaveNote({ keys: ['d/4/x2', 'c/5'], duration: '4', stem_direction: -1 }),\n f.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: -1 }),\n f.StaveNote({ keys: ['d/4/x2', 'c/5'], duration: '4', stem_direction: -1 }),\n ]);\n});\nconst basic2 = createSingleMeasureTest((f) => {\n const voice0 = f\n .Voice()\n .addTickables([\n f.StaveNote({ keys: ['a/5/x3'], duration: '8' }),\n f.StaveNote({ keys: ['g/5/x2'], duration: '8' }),\n f.StaveNote({ keys: ['g/5'], duration: '8' }),\n f.StaveNote({ keys: ['g/4/n', 'g/5/x2'], duration: '8' }),\n f.StaveNote({ keys: ['g/5/x2'], duration: '8' }),\n f.StaveNote({ keys: ['g/5/x2'], duration: '8' }),\n f.StaveNote({ keys: ['g/5/x2'], duration: '8' }),\n f.StaveNote({ keys: ['g/5/x2'], duration: '8' }),\n ]);\n f.Beam({ notes: voice0.getTickables().slice(1, 8) });\n const notes1 = [\n f.StaveNote({ keys: ['f/4'], duration: '8', stem_direction: -1 }),\n f.StaveNote({ keys: ['f/4'], duration: '8', stem_direction: -1 }),\n f.StaveNote({ keys: ['d/4/x2', 'c/5'], duration: '4', stem_direction: -1 }),\n f.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: -1 }),\n f.StaveNote({ keys: ['d/4/x2', 'c/5'], duration: '8d', stem_direction: -1 }),\n f.StaveNote({ keys: ['c/5'], duration: '16', stem_direction: -1 }),\n ];\n Dot.buildAndAttach([notes1[4]], { all: true });\n const voice1 = f.Voice().addTickables(notes1);\n f.Beam({ notes: voice1.getTickables().slice(0, 2) });\n f.Beam({ notes: voice1.getTickables().slice(4, 6) });\n});\nconst snare0 = createSingleMeasureTest((f) => {\n const font = {\n family: Font.SERIF,\n size: 14,\n weight: FontWeight.BOLD,\n style: FontStyle.ITALIC,\n };\n f.Voice().addTickables([\n f\n .StaveNote({ keys: ['c/5'], duration: '4', stem_direction: -1 })\n .addModifier(f.Articulation({ type: 'a>' }), 0)\n .addModifier(f.Annotation({ text: 'L', font }), 0),\n f.StaveNote({ keys: ['c/5'], duration: '4', stem_direction: -1 }).addModifier(f.Annotation({ text: 'R', font }), 0),\n f.StaveNote({ keys: ['c/5'], duration: '4', stem_direction: -1 }).addModifier(f.Annotation({ text: 'L', font }), 0),\n f.StaveNote({ keys: ['c/5'], duration: '4', stem_direction: -1 }).addModifier(f.Annotation({ text: 'L', font }), 0),\n ]);\n});\nconst snare1 = createSingleMeasureTest((f) => {\n f.Voice().addTickables([\n f.StaveNote({ keys: ['g/5/x2'], duration: '4', stem_direction: -1 }).addModifier(f.Articulation({ type: 'ah' }), 0),\n f.StaveNote({ keys: ['g/5/x2'], duration: '4', stem_direction: -1 }),\n f.StaveNote({ keys: ['g/5/x2'], duration: '4', stem_direction: -1 }).addModifier(f.Articulation({ type: 'ah' }), 0),\n f.StaveNote({ keys: ['a/5/x3'], duration: '4', stem_direction: -1 }).addModifier(f.Articulation({ type: 'a,' }), 0),\n ]);\n});\nconst snare2 = createSingleMeasureTest((f) => {\n f.Voice().addTickables([\n f.StaveNote({ keys: ['c/5'], duration: '4', stem_direction: -1 }).addModifier(new Tremolo(1), 0),\n f.GraceNote({ keys: ['c/5'], duration: '4', stem_direction: -1 }).addModifier(new Tremolo(1), 0),\n f.StaveNote({ keys: ['c/5'], duration: '4', stem_direction: -1 }).addModifier(new Tremolo(3), 0),\n f.StaveNote({ keys: ['c/5'], duration: '4', stem_direction: -1 }).addModifier(new Tremolo(5), 0),\n ]);\n});\nconst snare3 = createSingleMeasureTest((factory) => {\n factory\n .Voice()\n .addTickables([\n factory.StaveNote({ keys: ['c/5'], duration: '4', stem_direction: 1 }).addModifier(new Tremolo(2), 0),\n factory.GraceNote({ keys: ['c/5'], duration: '4', stem_direction: 1 }).addModifier(new Tremolo(2), 0),\n factory.GraceNote({ keys: ['c/5'], duration: '4', stem_direction: 1 }).addModifier(new Tremolo(3), 0),\n factory.StaveNote({ keys: ['c/5'], duration: '4', stem_direction: 1 }).addModifier(new Tremolo(5), 0),\n ]);\n});\nVexFlowTests.register(PercussionTests);\nexport { PercussionTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Registry Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { EasyScore, Factory, Registry, StaveNote } from '../src/index';\nconst RegistryTests = {\n Start() {\n QUnit.module('Registry');\n test('Register and Clear', registerAndClear);\n test('Default Registry', defaultRegistry);\n test('Multiple Classes', classes);\n },\n};\nfunction registerAndClear() {\n const registry = new Registry();\n const score = new EasyScore({ factory: Factory.newFromElementId(null) });\n registry.register(score.notes('C4')[0], 'foobar');\n const foobar = registry.getElementById('foobar');\n ok(foobar);\n equal(foobar.getAttribute('id'), 'foobar');\n registry.clear();\n notOk(registry.getElementById('foobar'));\n // eslint-disable-next-line\n // @ts-ignore: intentional type mismatch to trigger an error.\n throws(() => registry.register(score.notes('C4')));\n registry.clear();\n ok(registry.register(score.notes('C4[id=\"boobar\"]')[0]).getElementById('boobar'));\n}\nfunction defaultRegistry() {\n const registry = new Registry();\n const score = new EasyScore({ factory: Factory.newFromElementId(null) });\n Registry.enableDefaultRegistry(registry);\n score.notes('C4[id=\"foobar\"]');\n const note = registry.getElementById('foobar');\n ok(note);\n note.setAttribute('id', 'boobar');\n ok(registry.getElementById('boobar'));\n notOk(registry.getElementById('foobar'));\n registry.clear();\n equal(registry.getElementsByType(StaveNote.CATEGORY).length, 0);\n score.notes('C5');\n const elements = registry.getElementsByType(StaveNote.CATEGORY);\n equal(elements.length, 1);\n}\nfunction classes() {\n const registry = new Registry();\n const score = new EasyScore({ factory: Factory.newFromElementId(null) });\n Registry.enableDefaultRegistry(registry);\n score.notes('C4[id=\"foobar\"]');\n const note = registry.getElementById('foobar');\n note.addClass('foo');\n ok(note.hasClass('foo'));\n notOk(note.hasClass('boo'));\n equal(registry.getElementsByClass('foo').length, 1);\n equal(registry.getElementsByClass('boo').length, 0);\n note.addClass('boo');\n ok(note.hasClass('foo'));\n ok(note.hasClass('boo'));\n equal(registry.getElementsByClass('foo').length, 1);\n equal(registry.getElementsByClass('boo').length, 1);\n note.removeClass('boo');\n note.removeClass('foo');\n notOk(note.hasClass('foo'));\n notOk(note.hasClass('boo'));\n equal(registry.getElementsByClass('foo').length, 0);\n equal(registry.getElementsByClass('boo').length, 0);\n}\nVexFlowTests.register(RegistryTests);\nexport { RegistryTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Ron B. Yeh\n// MIT License\n//\n// Renderer Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { CanvasContext, Factory, Formatter, isHTMLCanvas, Renderer, RuntimeError, Stave, StaveNote, SVGContext, } from '../src/index';\n// TODO: Should FactoryOptions.renderer.elementId also accept a canvas | div?\nconst STAVE_WIDTH = 700;\nconst STAVE_HEIGHT = 100;\n// FactoryOptions.stave.space defaults to 10.\n// We subtract 10 to make the useRendererAPI() output look identical to useFactoryAPI().\nconst STAVE_RIGHT_MARGIN = 10;\nconst USE_RENDERER = { useRendererAPI: true };\nconst USE_FACTORY = { useRendererAPI: false };\nconst RendererTests = {\n Start() {\n QUnit.module('Renderer');\n const run = VexFlowTests.runTests;\n // Randomly choose one of four setup paths. See below for a description.\n // Refresh `flow.html` to see the test change each time.\n // We can manually check that they look identical\n // by opening `flow.html` in multiple tabs & quickly switching between tabs.\n run('Random', random);\n // These are the four setup paths. They should all produce the same output.\n // Use the: Renderer API OR Factory API\n // Pass in: element ID string OR canvas/div element.\n run('Renderer API with element ID string', stringElementId, USE_RENDERER);\n run('Renderer API with canvas or div', canvasOrDivElement, USE_RENDERER);\n run('Renderer API with context', passRenderContext);\n run('Factory API with element ID string', stringElementId, USE_FACTORY);\n run('Factory API with canvas or div', canvasOrDivElement, USE_FACTORY);\n },\n};\n/**\n * Helper function to add three notes to a stave.\n */\nfunction drawStave(stave, context) {\n stave.addClef('bass').addTimeSignature('3/4').draw();\n Formatter.FormatAndDraw(context, stave, [\n new StaveNote({ keys: ['C/4'], duration: '4' }),\n new StaveNote({ keys: ['E/4'], duration: '4' }),\n new StaveNote({ keys: ['G/4'], duration: '4' }),\n ]);\n}\n/**\n * Randomize the test upon each refresh (for verifying that the output is identical).\n * Draw a colored outline to indicate which of the four options is shown.\n * - blue = element is a SVG or Canvas element\n * - gray = element ID is a string\n * - solid outline = use the Renderer API directly\n * - dashed outline = use the Factory API\n */\nfunction random(options) {\n const useElementIDString = Math.random() > 0.5;\n const useRendererAPI = Math.random() > 0.5;\n options.params = { useRendererAPI };\n if (useElementIDString) {\n stringElementId(options);\n }\n else {\n canvasOrDivElement(options);\n }\n // eslint-disable-next-line\n const element = document.getElementById(options.elementId);\n const colorForElementType = useElementIDString ? '#CCCCCC' /* light gray */ : '#0074d9'; /* blue */\n const lineStyleForWhichAPI = useRendererAPI ? 'solid' : 'dashed';\n const borderStyle = `3px ${lineStyleForWhichAPI} ${colorForElementType}`;\n let elementType;\n if (options.backend === Renderer.Backends.CANVAS) {\n // If the backend is canvas, we draw a border around the canvas directly.\n element.style.border = borderStyle;\n elementType = '<canvas> element object';\n }\n else {\n // If the backend is SVG, we draw a border around the SVG child of the DIV.\n element.children[0].style.border = borderStyle;\n elementType = '<svg> element object';\n }\n if (useElementIDString) {\n elementType = 'elementID string';\n }\n const whichAPI = useRendererAPI ? 'Renderer API' : 'Factory API';\n element.parentElement.insertAdjacentHTML('beforeend', `
` +\n `${whichAPI}` +\n ` with ` +\n `${elementType}` +\n `

`);\n}\nfunction useRendererAPI(e, backend) {\n const renderer = new Renderer(e, backend);\n renderer.resize(STAVE_WIDTH, STAVE_HEIGHT);\n const context = renderer.getContext();\n drawStave(new Stave(0, 0, STAVE_WIDTH - STAVE_RIGHT_MARGIN).setContext(context), context);\n}\n/**\n * Alternatively, use the Factory API!\n * The Factory API declares elementId to be string | null.\n * However, if we pass in a canvas or div element, it will still work.\n * This is because Factory calls new Renderer(elementId, ...) via Renderer.buildContext().\n */\nfunction useFactoryAPI(e, backend) {\n const opts = {\n renderer: { elementId: e, width: STAVE_WIDTH, height: STAVE_HEIGHT, backend },\n };\n const factory = new Factory(opts);\n drawStave(factory.Stave(), factory.getContext());\n}\n/**\n * Pass in a elementId string. Renderer will call document.getElementById().\n */\nfunction stringElementId(options) {\n const elementId = options.elementId;\n if (options.params.useRendererAPI) {\n useRendererAPI(elementId, options.backend);\n }\n else {\n useFactoryAPI(elementId, options.backend);\n }\n ok(true);\n}\n/**\n * Pass a canvas or div element directly to the Renderer constructor.\n */\nfunction canvasOrDivElement(options) {\n const element = document.getElementById(options.elementId);\n if (options.params.useRendererAPI) {\n useRendererAPI(element, options.backend);\n }\n else {\n useFactoryAPI(element, options.backend);\n }\n ok(true);\n}\n/**\n * Pass the render context directly to the Renderer constructor.\n */\nfunction passRenderContext(options) {\n let context;\n const element = document.getElementById(options.elementId);\n if (isHTMLCanvas(element)) {\n const ctx = element.getContext('2d');\n if (!ctx) {\n throw new RuntimeError(`Couldn't get context from element \"${options.elementId}\"`);\n }\n context = new CanvasContext(ctx);\n }\n else {\n context = new SVGContext(element);\n }\n const renderer = new Renderer(context);\n renderer.resize(STAVE_WIDTH, STAVE_HEIGHT);\n drawStave(new Stave(0, 0, STAVE_WIDTH - STAVE_RIGHT_MARGIN).setContext(context), context);\n ok(true);\n}\nVexFlowTests.register(RendererTests);\nexport { RendererTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Rests Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Beam } from '../src/beam';\nimport { Dot } from '../src/dot';\nimport { Flow } from '../src/flow';\nimport { Formatter } from '../src/formatter';\nimport { Stave } from '../src/stave';\nimport { StaveNote } from '../src/stavenote';\nimport { Tuplet } from '../src/tuplet';\nimport { Voice } from '../src/voice';\nconst RestsTests = {\n Start() {\n QUnit.module('Rests');\n const run = VexFlowTests.runTests;\n // TODO: Simplify test names by removing 'Rests - ' or 'Rests '.\n run('Rests - Dotted', basic);\n run('Auto Align Rests - Beamed Notes Stems Up', beamsUp);\n run('Auto Align Rests - Beamed Notes Stems Down', beamsDown);\n run('Auto Align Rests - Tuplets Stems Up', tupletsUp);\n run('Auto Align Rests - Tuplets Stems Down', tupletsDown);\n run('Auto Align Rests - Single Voice (Default)', singleVoiceDefaultAlignment);\n run('Auto Align Rests - Single Voice (Align All)', singleVoiceAlignAll);\n run('Auto Align Rests - Multi Voice', multiVoice);\n },\n};\n/**\n * Helper function to create a context and stave.\n *\n * @param options\n * @param contextBuilder static function in renderer.ts (Renderer.getSVGContext or Renderer.getCanvasContext).\n * @param width\n * @param height\n * @returns object with .context and .stave properties\n */\nfunction setupContext(options, contextBuilder, width = 350, height = 150) {\n // context is SVGContext or CanvasRenderingContext2D (native) or CanvasContext (only if Renderer.USE_CANVAS_PROXY is true).\n const context = contextBuilder(options.elementId, width, height);\n context.scale(0.9, 0.9);\n context.fillStyle = '#221';\n context.strokeStyle = '#221';\n context.font = '10pt Arial';\n const stave = new Stave(10, 30, width).addClef('treble').addTimeSignature('4/4').setContext(context).draw();\n return { context, stave };\n}\n/**\n * Dotted rests (whole to 128th).\n * The rest duration is specified as 'wr', 'hr', ..., '128r'.\n */\nfunction basic(options, contextBuilder) {\n const { context, stave } = setupContext(options, contextBuilder, 700);\n const notes = [\n new StaveNote({ keys: ['b/4'], stem_direction: 1, duration: 'wr' }),\n new StaveNote({ keys: ['b/4'], stem_direction: 1, duration: 'hr' }),\n new StaveNote({ keys: ['b/4'], stem_direction: 1, duration: '4r' }),\n new StaveNote({ keys: ['b/4'], stem_direction: 1, duration: '8r' }),\n new StaveNote({ keys: ['b/4'], stem_direction: 1, duration: '16r' }),\n new StaveNote({ keys: ['b/4'], stem_direction: 1, duration: '32r' }),\n new StaveNote({ keys: ['b/4'], stem_direction: 1, duration: '64r' }),\n new StaveNote({ keys: ['b/4'], stem_direction: 1, duration: '128r' }),\n ];\n Dot.buildAndAttach(notes, { all: true });\n Formatter.FormatAndDraw(context, stave, notes);\n ok(true, 'Dotted Rest Test');\n}\n// Optional: Use a helper function to make your code more concise.\nconst note = (noteStruct) => new StaveNote(noteStruct);\n/**\n * Rests are intermixed within beamed notes (with the stems and beams at the top).\n */\nfunction beamsUp(options, contextBuilder) {\n const { context, stave } = setupContext(options, contextBuilder, 600, 160);\n const notes = [\n note({ keys: ['e/5'], stem_direction: 1, duration: '8' }),\n note({ keys: ['b/4'], stem_direction: 1, duration: '8r' }),\n note({ keys: ['b/5'], stem_direction: 1, duration: '8' }),\n note({ keys: ['c/5'], stem_direction: 1, duration: '8' }),\n note({ keys: ['b/4', 'd/5', 'a/5'], stem_direction: 1, duration: '8' }),\n note({ keys: ['b/4'], stem_direction: 1, duration: '8r' }),\n note({ keys: ['b/4'], stem_direction: 1, duration: '8r' }),\n note({ keys: ['c/4'], stem_direction: 1, duration: '8' }),\n note({ keys: ['b/4', 'd/5', 'a/5'], stem_direction: 1, duration: '8' }),\n note({ keys: ['b/4'], stem_direction: 1, duration: '8' }),\n note({ keys: ['b/4'], stem_direction: 1, duration: '8r' }),\n note({ keys: ['c/4'], stem_direction: 1, duration: '8' }),\n ];\n const beam1 = new Beam(notes.slice(0, 4));\n const beam2 = new Beam(notes.slice(4, 8));\n const beam3 = new Beam(notes.slice(8, 12));\n Formatter.FormatAndDraw(context, stave, notes);\n beam1.setContext(context).draw();\n beam2.setContext(context).draw();\n beam3.setContext(context).draw();\n ok(true, 'Auto Align Rests - Beams Up Test');\n}\n/**\n * Rests are intermixed within beamed notes (with the stems and beams at the bottom).\n */\nfunction beamsDown(options, contextBuilder) {\n const { context, stave } = setupContext(options, contextBuilder, 600, 160);\n const notes = [\n note({ keys: ['a/5'], stem_direction: -1, duration: '8' }),\n note({ keys: ['b/4'], stem_direction: -1, duration: '8r' }),\n note({ keys: ['b/5'], stem_direction: -1, duration: '8' }),\n note({ keys: ['c/5'], stem_direction: -1, duration: '8' }),\n note({ keys: ['b/4', 'd/5', 'a/5'], stem_direction: -1, duration: '8' }),\n note({ keys: ['b/4'], stem_direction: -1, duration: '8r' }),\n note({ keys: ['b/4'], stem_direction: -1, duration: '8r' }),\n note({ keys: ['e/4'], stem_direction: -1, duration: '8' }),\n note({ keys: ['b/4', 'd/5', 'a/5'], stem_direction: -1, duration: '8' }),\n note({ keys: ['b/4'], stem_direction: -1, duration: '8' }),\n note({ keys: ['b/4'], stem_direction: -1, duration: '8r' }),\n note({ keys: ['e/4'], stem_direction: -1, duration: '8' }),\n ];\n const beam1 = new Beam(notes.slice(0, 4));\n const beam2 = new Beam(notes.slice(4, 8));\n const beam3 = new Beam(notes.slice(8, 12));\n Formatter.FormatAndDraw(context, stave, notes);\n beam1.setContext(context).draw();\n beam2.setContext(context).draw();\n beam3.setContext(context).draw();\n ok(true, 'Auto Align Rests - Beams Down Test');\n}\n/**\n * Call setTupletLocation(Tuplet.LOCATION_TOP) to place the tuplet indicator (bracket and number) at the\n * top of the group of notes. Tuplet.LOCATION_TOP is the default, so this is optional.\n */\nfunction tupletsUp(options, contextBuilder) {\n const { context, stave } = setupContext(options, contextBuilder, 600, 160);\n const notes = [\n note({ keys: ['b/4'], stem_direction: 1, duration: '4' }),\n note({ keys: ['b/4'], stem_direction: 1, duration: '4' }),\n note({ keys: ['a/5'], stem_direction: 1, duration: '4r' }),\n note({ keys: ['a/5'], stem_direction: 1, duration: '4r' }),\n note({ keys: ['g/5'], stem_direction: 1, duration: '4r' }),\n note({ keys: ['b/5'], stem_direction: 1, duration: '4' }),\n note({ keys: ['a/5'], stem_direction: 1, duration: '4' }),\n note({ keys: ['g/5'], stem_direction: 1, duration: '4r' }),\n note({ keys: ['b/4'], stem_direction: 1, duration: '4' }),\n note({ keys: ['a/5'], stem_direction: 1, duration: '4' }),\n note({ keys: ['b/4'], stem_direction: 1, duration: '4r' }),\n note({ keys: ['b/4'], stem_direction: 1, duration: '4r' }),\n ];\n const tuplet1 = new Tuplet(notes.slice(0, 3)).setTupletLocation(Tuplet.LOCATION_TOP);\n const tuplet2 = new Tuplet(notes.slice(3, 6)).setTupletLocation(Tuplet.LOCATION_TOP);\n const tuplet3 = new Tuplet(notes.slice(6, 9)).setTupletLocation(Tuplet.LOCATION_TOP);\n const tuplet4 = new Tuplet(notes.slice(9, 12)).setTupletLocation(Tuplet.LOCATION_TOP);\n Formatter.FormatAndDraw(context, stave, notes);\n tuplet1.setContext(context).draw();\n tuplet2.setContext(context).draw();\n tuplet3.setContext(context).draw();\n tuplet4.setContext(context).draw();\n ok(true, 'Auto Align Rests - Tuplets Stem Up Test');\n}\n/**\n * Call setTupletLocation(Tuplet.LOCATION_BOTTOM) to place the tuplet indicator (bracket and number) at the\n * bottom of the group of notes.\n */\nfunction tupletsDown(options, contextBuilder) {\n const { context, stave } = setupContext(options, contextBuilder, 600, 160);\n const notes = [\n note({ keys: ['a/5'], stem_direction: -1, duration: '8r' }),\n note({ keys: ['g/5'], stem_direction: -1, duration: '8r' }),\n note({ keys: ['b/4'], stem_direction: -1, duration: '8' }),\n note({ keys: ['a/5'], stem_direction: -1, duration: '8r' }),\n note({ keys: ['g/5'], stem_direction: -1, duration: '8' }),\n note({ keys: ['b/5'], stem_direction: -1, duration: '8' }),\n note({ keys: ['a/5'], stem_direction: -1, duration: '8' }),\n note({ keys: ['g/5'], stem_direction: -1, duration: '8r' }),\n note({ keys: ['b/4'], stem_direction: -1, duration: '8' }),\n note({ keys: ['a/5'], stem_direction: -1, duration: '8' }),\n note({ keys: ['g/5'], stem_direction: -1, duration: '8r' }),\n note({ keys: ['b/4'], stem_direction: -1, duration: '8r' }),\n ];\n const beam1 = new Beam(notes.slice(0, 3));\n const beam2 = new Beam(notes.slice(3, 6));\n const beam3 = new Beam(notes.slice(6, 9));\n const beam4 = new Beam(notes.slice(9, 12));\n const tuplet1 = new Tuplet(notes.slice(0, 3)).setTupletLocation(Tuplet.LOCATION_BOTTOM);\n const tuplet2 = new Tuplet(notes.slice(3, 6)).setTupletLocation(Tuplet.LOCATION_BOTTOM);\n const tuplet3 = new Tuplet(notes.slice(6, 9)).setTupletLocation(Tuplet.LOCATION_BOTTOM);\n const tuplet4 = new Tuplet(notes.slice(9, 12)).setTupletLocation(Tuplet.LOCATION_BOTTOM);\n Formatter.FormatAndDraw(context, stave, notes);\n tuplet1.setContext(context).draw();\n tuplet2.setContext(context).draw();\n tuplet3.setContext(context).draw();\n tuplet4.setContext(context).draw();\n beam1.setContext(context).draw();\n beam2.setContext(context).draw();\n beam3.setContext(context).draw();\n beam4.setContext(context).draw();\n ok(true, 'Auto Align Rests - Tuplets Stem Down Test');\n}\n/**\n * By default rests are centered vertically within the stave, except\n * when they are inside a group of beamed notes (in which case they are\n * centered vertically within that group).\n */\nfunction singleVoiceDefaultAlignment(options, contextBuilder) {\n const { context, stave } = setupContext(options, contextBuilder, 600, 160);\n const notes = [\n note({ keys: ['b/4'], stem_direction: -1, duration: '4r' }),\n note({ keys: ['b/4'], stem_direction: -1, duration: '4r' }),\n note({ keys: ['f/4'], stem_direction: -1, duration: '4' }),\n note({ keys: ['e/5'], stem_direction: -1, duration: '8' }),\n note({ keys: ['b/4'], stem_direction: -1, duration: '8r' }),\n note({ keys: ['a/5'], stem_direction: -1, duration: '8' }),\n note({ keys: ['b/4'], stem_direction: -1, duration: '8r' }),\n note({ keys: ['b/4'], stem_direction: -1, duration: '8' }),\n note({ keys: ['e/5'], stem_direction: -1, duration: '8' }),\n note({ keys: ['a/5'], stem_direction: 1, duration: '4' }),\n note({ keys: ['b/4'], stem_direction: 1, duration: '4r' }),\n note({ keys: ['b/5'], stem_direction: 1, duration: '4' }),\n note({ keys: ['d/5'], stem_direction: -1, duration: '4' }),\n note({ keys: ['g/5'], stem_direction: -1, duration: '4' }),\n note({ keys: ['b/4'], stem_direction: -1, duration: '4r' }),\n note({ keys: ['b/4'], stem_direction: -1, duration: '4r' }),\n ];\n const beam = new Beam(notes.slice(5, 9));\n const tuplet = new Tuplet(notes.slice(9, 12)).setTupletLocation(Tuplet.LOCATION_TOP);\n Formatter.FormatAndDraw(context, stave, notes);\n tuplet.setContext(context).draw();\n beam.setContext(context).draw();\n ok(true, 'Auto Align Rests - Default Test');\n}\n/**\n * The only difference between staveRestsAll() and staveRests() is that this test case\n * passes { align_rests: true } to Formatter.FormatAndDraw(...).\n */\nfunction singleVoiceAlignAll(options, contextBuilder) {\n const { context, stave } = setupContext(options, contextBuilder, 600, 160);\n const notes = [\n note({ keys: ['b/4'], stem_direction: -1, duration: '4r' }),\n note({ keys: ['b/4'], stem_direction: -1, duration: '4r' }),\n note({ keys: ['f/4'], stem_direction: -1, duration: '4' }),\n note({ keys: ['e/5'], stem_direction: -1, duration: '8' }),\n note({ keys: ['b/4'], stem_direction: -1, duration: '8r' }),\n note({ keys: ['a/5'], stem_direction: -1, duration: '8' }),\n note({ keys: ['b/4'], stem_direction: -1, duration: '8r' }),\n note({ keys: ['b/4'], stem_direction: -1, duration: '8' }),\n note({ keys: ['e/5'], stem_direction: -1, duration: '8' }),\n note({ keys: ['a/5'], stem_direction: 1, duration: '4' }),\n note({ keys: ['b/4'], stem_direction: 1, duration: '4r' }),\n note({ keys: ['b/5'], stem_direction: 1, duration: '4' }),\n note({ keys: ['d/5'], stem_direction: -1, duration: '4' }),\n note({ keys: ['g/5'], stem_direction: -1, duration: '4' }),\n note({ keys: ['b/4'], stem_direction: -1, duration: '4r' }),\n note({ keys: ['b/4'], stem_direction: -1, duration: '4r' }),\n ];\n const beam = new Beam(notes.slice(5, 9));\n const tuplet = new Tuplet(notes.slice(9, 12)).setTupletLocation(Tuplet.LOCATION_TOP);\n // Set { align_rests: true } to align rests (vertically) with nearby notes in each voice.\n Formatter.FormatAndDraw(context, stave, notes, { align_rests: true });\n tuplet.setContext(context).draw();\n beam.setContext(context).draw();\n ok(true, 'Auto Align Rests - Align All Test');\n}\n/**\n * Multi Voice\n * The top voice shows quarter-note chords alternating with quarter rests.\n * The bottom voice shows two groups of beamed eighth notes, with eighth rests.\n */\nfunction multiVoice(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 600, 200);\n const stave = new Stave(50, 10, 500).addClef('treble').setContext(ctx).addTimeSignature('4/4').draw();\n const noteOnStave = (noteStruct) => new StaveNote(noteStruct).setStave(stave);\n const notes1 = [\n noteOnStave({ keys: ['c/4', 'e/4', 'g/4'], duration: '4' }),\n noteOnStave({ keys: ['b/4'], duration: '4r' }),\n noteOnStave({ keys: ['c/4', 'd/4', 'a/4'], duration: '4' }),\n noteOnStave({ keys: ['b/4'], duration: '4r' }),\n ];\n const notes2 = [\n noteOnStave({ keys: ['e/3'], stem_direction: -1, duration: '8' }),\n noteOnStave({ keys: ['b/4'], stem_direction: -1, duration: '8r' }),\n noteOnStave({ keys: ['b/4'], stem_direction: -1, duration: '8r' }),\n noteOnStave({ keys: ['e/3'], stem_direction: -1, duration: '8' }),\n noteOnStave({ keys: ['e/3'], stem_direction: -1, duration: '8' }),\n noteOnStave({ keys: ['b/4'], stem_direction: -1, duration: '8r' }),\n noteOnStave({ keys: ['e/3'], stem_direction: -1, duration: '8' }),\n noteOnStave({ keys: ['e/3'], stem_direction: -1, duration: '8' }),\n ];\n const voice1 = new Voice(Flow.TIME4_4).addTickables(notes1);\n const voice2 = new Voice(Flow.TIME4_4).addTickables(notes2);\n // Set { align_rests: true } to align rests (vertically) with nearby notes in each voice.\n new Formatter().joinVoices([voice1, voice2]).formatToStave([voice1, voice2], stave, { align_rests: true });\n const beam2_1 = new Beam(notes2.slice(0, 4));\n const beam2_2 = new Beam(notes2.slice(4, 8));\n // Important Note: we need to draw voice2 first, since voice2 generates ledger lines.\n // Otherwise, the ledger lines will be drawn on top of middle C notes in voice1.\n voice2.draw(ctx);\n voice1.draw(ctx);\n beam2_1.setContext(ctx).draw();\n beam2_2.setContext(ctx).draw();\n ok(true, 'Strokes Test Multi Voice');\n}\nVexFlowTests.register(RestsTests);\nexport { RestsTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Rhythm Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Annotation } from '../src/annotation';\nimport { Beam } from '../src/beam';\nimport { Formatter } from '../src/formatter';\nimport { Stave } from '../src/stave';\nimport { BarlineType } from '../src/stavebarline';\nimport { StaveNote } from '../src/stavenote';\nconst RhythmTests = {\n Start() {\n QUnit.module('Rhythm');\n const run = VexFlowTests.runTests;\n // TODO: Simplify test names by removing 'Rhythm Draw - '.\n run('Rhythm Draw - slash notes', drawBasic);\n run('Rhythm Draw - beamed slash notes', drawBeamedSlashNotes);\n run('Rhythm Draw - beamed slash notes, some rests', drawSlashAndBeamAndRests);\n run('Rhythm Draw - 16th note rhythm with scratches', drawSixtenthWithScratches);\n run('Rhythm Draw - 32nd note rhythm with scratches', drawThirtySecondWithScratches);\n },\n};\n// CURRENTLY UNUSED. Draws 7 different slash notes without beams.\n/*\nfunction drawSlash(options: TestOptions, contextBuilder: ContextBuilder): void {\n const ctx = contextBuilder(options.elementId, 350, 180);\n const stave = new Stave(10, 10, 350);\n stave.setContext(ctx);\n stave.draw();\n\n const notes: StaveNoteStruct[] = [\n { keys: ['b/4'], duration: 'ws', stem_direction: -1 },\n { keys: ['b/4'], duration: 'hs', stem_direction: -1 },\n { keys: ['b/4'], duration: 'qs', stem_direction: -1 },\n { keys: ['b/4'], duration: '8s', stem_direction: -1 },\n { keys: ['b/4'], duration: '16s', stem_direction: -1 },\n { keys: ['b/4'], duration: '32s', stem_direction: -1 },\n { keys: ['b/4'], duration: '64s', stem_direction: -1 },\n ];\n expect(notes.length * 2);\n\n for (let i = 0; i < notes.length; ++i) {\n const staveNote = new StaveNote(notes[i]).setStave(stave);\n new TickContext()\n .addTickable(staveNote)\n .preFormat()\n .setX((i + 1) * 25);\n staveNote.setContext(ctx).draw();\n\n ok(staveNote.getX() > 0, 'Note ' + i + ' has X value');\n ok(staveNote.getYs().length > 0, 'Note ' + i + ' has Y values');\n }\n}\n*/\nfunction drawBasic(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 800, 150);\n // bar 1\n const staveBar1 = new Stave(10, 30, 150);\n staveBar1.setBegBarType(BarlineType.DOUBLE);\n staveBar1.setEndBarType(BarlineType.SINGLE);\n staveBar1.addClef('treble');\n staveBar1.addTimeSignature('4/4');\n staveBar1.addKeySignature('C');\n staveBar1.setContext(ctx).draw();\n const notesBar1 = [new StaveNote({ keys: ['b/4'], duration: '1s', stem_direction: -1 })];\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, staveBar1, notesBar1);\n // bar 2 - juxtaposing second bar next to first bar\n const staveBar2 = new Stave(staveBar1.getWidth() + staveBar1.getX(), staveBar1.getY(), 120);\n staveBar2.setBegBarType(BarlineType.SINGLE);\n staveBar2.setEndBarType(BarlineType.SINGLE);\n staveBar2.setContext(ctx).draw();\n // bar 2\n const notesBar2 = [\n new StaveNote({ keys: ['b/4'], duration: '2s', stem_direction: -1 }),\n new StaveNote({ keys: ['b/4'], duration: '2s', stem_direction: -1 }),\n ];\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, staveBar2, notesBar2);\n // bar 3 - juxtaposing second bar next to first bar\n const staveBar3 = new Stave(staveBar2.getWidth() + staveBar2.getX(), staveBar2.getY(), 170);\n staveBar3.setContext(ctx).draw();\n // bar 3\n const notesBar3 = [\n new StaveNote({\n keys: ['b/4'],\n duration: '4s',\n stem_direction: -1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '4s',\n stem_direction: -1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '4s',\n stem_direction: -1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '4s',\n stem_direction: -1,\n }),\n ];\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, staveBar3, notesBar3);\n // bar 4 - juxtaposing second bar next to first bar\n const staveBar4 = new Stave(staveBar3.getWidth() + staveBar3.getX(), staveBar3.getY(), 200);\n staveBar4.setContext(ctx).draw();\n // bar 4\n const notesBar4 = [\n new StaveNote({\n keys: ['b/4'],\n duration: '8s',\n stem_direction: -1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '8s',\n stem_direction: -1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '8s',\n stem_direction: -1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '8s',\n stem_direction: -1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '8s',\n stem_direction: -1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '8s',\n stem_direction: -1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '8s',\n stem_direction: -1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '8s',\n stem_direction: -1,\n }),\n ];\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, staveBar4, notesBar4);\n expect(0);\n}\nfunction drawBeamedSlashNotes(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 800, 150);\n // bar 1\n const staveBar1 = new Stave(10, 30, 300);\n staveBar1.setBegBarType(BarlineType.DOUBLE);\n staveBar1.setEndBarType(BarlineType.SINGLE);\n staveBar1.addClef('treble');\n staveBar1.addTimeSignature('4/4');\n staveBar1.addKeySignature('C');\n staveBar1.setContext(ctx).draw();\n // bar 4\n const notesBar1_part1 = [\n new StaveNote({\n keys: ['b/4'],\n duration: '8s',\n stem_direction: -1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '8s',\n stem_direction: -1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '8s',\n stem_direction: -1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '8s',\n stem_direction: -1,\n }),\n ];\n const notesBar1_part2 = [\n new StaveNote({\n keys: ['b/4'],\n duration: '8s',\n stem_direction: -1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '8s',\n stem_direction: -1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '8s',\n stem_direction: -1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '8s',\n stem_direction: -1,\n }),\n ];\n // create the beams for 8th notes in 2nd measure\n const beam1 = new Beam(notesBar1_part1);\n const beam2 = new Beam(notesBar1_part2);\n const notesBar1 = notesBar1_part1.concat(notesBar1_part2);\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, staveBar1, notesBar1);\n // Render beams\n beam1.setContext(ctx).draw();\n beam2.setContext(ctx).draw();\n expect(0);\n}\nfunction drawSlashAndBeamAndRests(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 800, 150);\n // bar 1\n const staveBar1 = new Stave(10, 30, 300);\n staveBar1.setBegBarType(BarlineType.DOUBLE);\n staveBar1.setEndBarType(BarlineType.SINGLE);\n staveBar1.addClef('treble');\n staveBar1.addTimeSignature('4/4');\n staveBar1.addKeySignature('F');\n staveBar1.setContext(ctx).draw();\n // bar 1\n const notesBar1_part1 = [\n new StaveNote({\n keys: ['b/4'],\n duration: '8s',\n stem_direction: -1,\n }),\n new StaveNote({ keys: ['b/4'], duration: '8s', stem_direction: -1 }),\n ];\n notesBar1_part1[0].addModifier(new Annotation('C7').setFont('Times', VexFlowTests.Font.size + 2), 0);\n const notesBar1_part2 = [\n new StaveNote({\n keys: ['b/4'],\n duration: '8r',\n stem_direction: -1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '8s',\n stem_direction: -1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '8r',\n stem_direction: -1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '8s',\n stem_direction: -1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '8r',\n stem_direction: -1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '8s',\n stem_direction: -1,\n }),\n ];\n // create the beams for 8th notes in 2nd measure\n const beam1 = new Beam(notesBar1_part1);\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, staveBar1, notesBar1_part1.concat(notesBar1_part2));\n // Render beams\n beam1.setContext(ctx).draw();\n // bar 2 - juxtaposing second bar next to first bar\n const staveBar2 = new Stave(staveBar1.getWidth() + staveBar1.getX(), staveBar1.getY(), 220);\n staveBar2.setContext(ctx).draw();\n const notesBar2 = [\n new StaveNote({\n keys: ['b/4'],\n duration: '1s',\n stem_direction: -1,\n }),\n ];\n notesBar2[0].addModifier(new Annotation('F').setFont('Times', VexFlowTests.Font.size + 2), 0);\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, staveBar2, notesBar2);\n expect(0);\n}\nfunction drawSixtenthWithScratches(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 800, 150);\n // bar 1\n const staveBar1 = new Stave(10, 30, 300);\n staveBar1.setBegBarType(BarlineType.DOUBLE);\n staveBar1.setEndBarType(BarlineType.SINGLE);\n staveBar1.addClef('treble');\n staveBar1.addTimeSignature('4/4');\n staveBar1.addKeySignature('F');\n staveBar1.setContext(ctx).draw();\n // bar 1\n const notesBar1_part1 = [\n new StaveNote({\n keys: ['b/4'],\n duration: '16s',\n stem_direction: -1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '16s',\n stem_direction: -1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '16m',\n stem_direction: -1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '16s',\n stem_direction: -1,\n }),\n ];\n const notesBar1_part2 = [\n new StaveNote({\n keys: ['b/4'],\n duration: '16m',\n stem_direction: -1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '16s',\n stem_direction: -1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '16r',\n stem_direction: -1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '16s',\n stem_direction: -1,\n }),\n ];\n notesBar1_part1[0].addModifier(new Annotation('C7').setFont('Times', VexFlowTests.Font.size + 3), 0);\n // create the beams for 8th notes in 2nd measure\n const beam1 = new Beam(notesBar1_part1);\n const beam2 = new Beam(notesBar1_part2);\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, staveBar1, notesBar1_part1.concat(notesBar1_part2));\n // Render beams\n beam1.setContext(ctx).draw();\n beam2.setContext(ctx).draw();\n expect(0);\n}\nfunction drawThirtySecondWithScratches(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 800, 150);\n // bar 1\n const staveBar1 = new Stave(10, 30, 300);\n staveBar1.setBegBarType(BarlineType.DOUBLE);\n staveBar1.setEndBarType(BarlineType.SINGLE);\n staveBar1.addClef('treble');\n staveBar1.addTimeSignature('4/4');\n staveBar1.addKeySignature('F');\n staveBar1.setContext(ctx).draw();\n // bar 1\n const notesBar1_part1 = [\n new StaveNote({\n keys: ['b/4'],\n duration: '32s',\n stem_direction: 1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '32s',\n stem_direction: 1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '32m',\n stem_direction: 1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '32s',\n stem_direction: 1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '32m',\n stem_direction: 1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '32s',\n stem_direction: 1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '32r',\n stem_direction: 1,\n }),\n new StaveNote({\n keys: ['b/4'],\n duration: '32s',\n stem_direction: 1,\n }),\n ];\n notesBar1_part1[0].addModifier(new Annotation('C7').setFont('Times', VexFlowTests.Font.size + 3), 0);\n // Create the beams for 8th notes in 2nd measure.\n const beam1 = new Beam(notesBar1_part1);\n // Helper function to justify and draw a 4/4 voice.\n Formatter.FormatAndDraw(ctx, staveBar1, notesBar1_part1);\n // Render beams\n beam1.setContext(ctx).draw();\n expect(0);\n}\nVexFlowTests.register(RhythmTests);\nexport { RhythmTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Basic Stave Tests\n// TODO: Like Stave.setTempo(t: StaveTempoOptions, ...), Stave.setText(...) could declare an interface called StaveTextOptions.\n// This helps developers because they can use the named type in their code for type checking.\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Accidental } from '../src/accidental';\nimport { Beam } from '../src/beam';\nimport { Clef } from '../src/clef';\nimport { Formatter } from '../src/formatter';\nimport { KeySignature } from '../src/keysignature';\nimport { Modifier } from '../src/modifier';\nimport { Stave } from '../src/stave';\nimport { Barline, BarlineType } from '../src/stavebarline';\nimport { StaveNote } from '../src/stavenote';\nimport { Repetition } from '../src/staverepetition';\nimport { VoltaType } from '../src/stavevolta';\nimport { Justification } from '../src/textnote';\nimport { TimeSignature } from '../src/timesignature';\nconst StaveTests = {\n Start() {\n QUnit.module('Stave');\n test('StaveModifiers SortByCategory', sortByCategory);\n const run = VexFlowTests.runTests;\n run('Stave Draw Test', draw);\n run('Open Stave Draw Test', drawOpenStave);\n run('Multiple Stave Barline Test', drawMultipleMeasures);\n run('Multiple Stave Barline Test (14pt Section)', drawMultipleMeasures, { fontSize: 14 });\n run('Multiple Stave Repeats Test', drawRepeats);\n run('Stave End Modifiers Test', drawEndModifiers);\n run('Stave Repetition (CODA) Positioning', drawStaveRepetition, { yShift: 0 });\n run('Stave Repetition (CODA) Positioning (-20)', drawStaveRepetition, { yShift: -20 });\n run('Stave Repetition (CODA) Positioning (+10)', drawStaveRepetition, { yShift: +10 });\n run('Multiple Staves Volta Test', drawVolta);\n run('Volta + Modifier Measure Test', drawVoltaModifier);\n run('Tempo Test', drawTempo);\n run('Single Line Configuration Test', configureSingleLine);\n run('Batch Line Configuration Test', configureAllLines);\n run('Stave Text Test', drawStaveText);\n run('Multiple Line Stave Text Test', drawStaveTextMultiLine);\n run('Factory API', factoryAPI);\n },\n};\nfunction sortByCategory() {\n const stave = new Stave(0, 0, 300);\n const clef0 = new Clef('treble');\n const clef1 = new Clef('alto');\n const clef2 = new Clef('bass');\n const time0 = new TimeSignature('C');\n const time1 = new TimeSignature('C|');\n const time2 = new TimeSignature('9/8');\n const key0 = new KeySignature('G');\n const key1 = new KeySignature('F');\n const key2 = new KeySignature('D');\n const bar0 = new Barline(BarlineType.SINGLE);\n const bar1 = new Barline(BarlineType.DOUBLE);\n const bar2 = new Barline(BarlineType.NONE);\n // const order0 = { barlines: 0, clefs: 1, keysignatures: 2, timesignatures: 3 };\n // const order1 = { timesignatures: 0, keysignatures: 1, barlines: 2, clefs: 3 };\n const order0 = { Barline: 0, Clef: 1, KeySignature: 2, TimeSignature: 3 };\n const order1 = { TimeSignature: 0, KeySignature: 1, Barline: 2, Clef: 3 };\n const sortAndCompare = (title, a, b, order) => {\n stave.sortByCategory(a, order);\n // Verify that the two arrays are identical.\n let isSame = true;\n if (a.length !== b.length)\n isSame = false;\n for (let i = 0; i < a.length; ++i) {\n if (a[i] !== b[i])\n isSame = false;\n }\n ok(isSame, title);\n };\n sortAndCompare('Keep the original order 1', [bar0, bar1, clef0, clef1, key0, key1, time0, time1], [bar0, bar1, clef0, clef1, key0, key1, time0, time1], order0);\n sortAndCompare('Keep the original order 2', [time0, time1, key0, key1, bar0, bar1, clef0, clef1], [time0, time1, key0, key1, bar0, bar1, clef0, clef1], order1);\n sortAndCompare('Sort and keep 1', [bar0, bar1, clef0, clef1, key0, key1, time0, time1], [time0, time1, key0, key1, bar0, bar1, clef0, clef1], order1);\n sortAndCompare('Sort and keep 2', [bar0, clef0, key0, time0, key1, time1, clef1, bar1, time2, clef2, bar2, key2], [bar0, bar1, bar2, clef0, clef1, clef2, key0, key1, key2, time0, time1, time2], order0);\n sortAndCompare('Sort and keep 3', [bar2, clef2, key2, time0, key0, time2, clef1, bar1, time1, clef0, bar0, key1], [time0, time2, time1, key2, key0, key1, bar2, bar1, bar0, clef2, clef1, clef0], order1);\n}\nfunction draw(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 400, 150);\n const stave = new Stave(10, 10, 300);\n stave.setContext(ctx);\n stave.draw();\n equal(stave.getYForNote(0), 100, 'getYForNote(0)');\n equal(stave.getYForLine(5), 100, 'getYForLine(5)');\n equal(stave.getYForLine(0), 50, 'getYForLine(0) - Top Line');\n equal(stave.getYForLine(4), 90, 'getYForLine(4) - Bottom Line');\n ok(true, 'all pass');\n}\nfunction drawOpenStave(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 400, 350);\n let stave = new Stave(10, 10, 300, { left_bar: false });\n stave.setContext(ctx);\n stave.draw();\n stave = new Stave(10, 150, 300, { right_bar: false });\n stave.setContext(ctx);\n stave.draw();\n ok(true, 'all pass');\n}\nfunction drawMultipleMeasures(options, contextBuilder) {\n var _a, _b;\n expect(0);\n // Get the rendering context\n const ctx = contextBuilder(options.elementId, 550, 200);\n // bar 1\n const staveBar1 = new Stave(10, 50, 200);\n staveBar1.setBegBarType(BarlineType.REPEAT_BEGIN);\n staveBar1.setEndBarType(BarlineType.DOUBLE);\n staveBar1.setSection('A', 0, 0, (_a = options.params) === null || _a === void 0 ? void 0 : _a.fontSize);\n staveBar1.addClef('treble').setContext(ctx).draw();\n const notesBar1 = [\n new StaveNote({ keys: ['c/4'], duration: 'q' }),\n new StaveNote({ keys: ['d/4'], duration: 'q' }),\n new StaveNote({ keys: ['b/4'], duration: 'qr' }),\n new StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: 'q' }),\n ];\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, staveBar1, notesBar1);\n // bar 2 - juxtaposing second bar next to first bar\n const staveBar2 = new Stave(staveBar1.getWidth() + staveBar1.getX(), staveBar1.getY(), 300);\n staveBar2.setSection('B', 0, 0, (_b = options.params) === null || _b === void 0 ? void 0 : _b.fontSize);\n staveBar2.setEndBarType(BarlineType.END);\n staveBar2.setContext(ctx).draw();\n const notesBar2_part1 = [\n new StaveNote({ keys: ['c/4'], duration: '8' }),\n new StaveNote({ keys: ['d/4'], duration: '8' }),\n new StaveNote({ keys: ['g/4'], duration: '8' }),\n new StaveNote({ keys: ['e/4'], duration: '8' }),\n ];\n const notesBar2_part2 = [\n new StaveNote({ keys: ['c/4'], duration: '8' }),\n new StaveNote({ keys: ['d/4'], duration: '8' }),\n new StaveNote({ keys: ['g/4'], duration: '8' }),\n new StaveNote({ keys: ['e/4'], duration: '8' }),\n ];\n // create the beams for 8th notes in 2nd measure\n const beam1 = new Beam(notesBar2_part1);\n const beam2 = new Beam(notesBar2_part2);\n const notesBar2 = notesBar2_part1.concat(notesBar2_part2);\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, staveBar2, notesBar2);\n // Render beams\n beam1.setContext(ctx).draw();\n beam2.setContext(ctx).draw();\n}\nfunction drawRepeats(options, contextBuilder) {\n expect(0);\n // Get the rendering context\n const ctx = contextBuilder(options.elementId, 750, 120);\n // bar 1\n const staveBar1 = new Stave(10, 0, 250);\n staveBar1.setBegBarType(BarlineType.REPEAT_BEGIN);\n staveBar1.setEndBarType(BarlineType.REPEAT_END);\n staveBar1.addClef('treble');\n staveBar1.addKeySignature('A');\n staveBar1.setContext(ctx).draw();\n const notesBar1 = [\n new StaveNote({ keys: ['c/4'], duration: 'q' }),\n new StaveNote({ keys: ['d/4'], duration: 'q' }),\n new StaveNote({ keys: ['b/4'], duration: 'qr' }),\n new StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: 'q' }),\n ];\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, staveBar1, notesBar1);\n // bar 2 - juxtaposing second bar next to first bar\n const staveBar2 = new Stave(staveBar1.getWidth() + staveBar1.getX(), staveBar1.getY(), 250);\n staveBar2.setBegBarType(BarlineType.REPEAT_BEGIN);\n staveBar2.setEndBarType(BarlineType.REPEAT_END);\n staveBar2.setContext(ctx).draw();\n const notesBar2_part1 = [\n new StaveNote({ keys: ['c/4'], duration: '8' }),\n new StaveNote({ keys: ['d/4'], duration: '8' }),\n new StaveNote({ keys: ['g/4'], duration: '8' }),\n new StaveNote({ keys: ['e/4'], duration: '8' }),\n ];\n const notesBar2_part2 = [\n new StaveNote({ keys: ['c/4'], duration: '8' }),\n new StaveNote({ keys: ['d/4'], duration: '8' }),\n new StaveNote({ keys: ['g/4'], duration: '8' }),\n new StaveNote({ keys: ['e/4'], duration: '8' }),\n ];\n notesBar2_part2[0].addModifier(new Accidental('#'), 0);\n notesBar2_part2[1].addModifier(new Accidental('#'), 0);\n notesBar2_part2[3].addModifier(new Accidental('b'), 0);\n // create the beams for 8th notes in 2nd measure\n const beam1 = new Beam(notesBar2_part1);\n const beam2 = new Beam(notesBar2_part2);\n const notesBar2 = notesBar2_part1.concat(notesBar2_part2);\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, staveBar2, notesBar2);\n // Render beams\n beam1.setContext(ctx).draw();\n beam2.setContext(ctx).draw();\n // bar 3 - juxtaposing third bar next to second bar\n const staveBar3 = new Stave(staveBar2.getWidth() + staveBar2.getX(), staveBar2.getY(), 50);\n staveBar3.setContext(ctx).draw();\n const notesBar3 = [new StaveNote({ keys: ['d/5'], duration: 'wr' })];\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, staveBar3, notesBar3);\n // bar 4 - juxtaposing third bar next to third bar\n const staveBar4 = new Stave(staveBar3.getWidth() + staveBar3.getX(), staveBar3.getY(), 250 - staveBar1.getModifierXShift());\n staveBar4.setBegBarType(BarlineType.REPEAT_BEGIN);\n staveBar4.setEndBarType(BarlineType.REPEAT_END);\n staveBar4.setContext(ctx).draw();\n const notesBar4 = [\n new StaveNote({ keys: ['c/4'], duration: 'q' }),\n new StaveNote({ keys: ['d/4'], duration: 'q' }),\n new StaveNote({ keys: ['b/4'], duration: 'qr' }),\n new StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: 'q' }),\n ];\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, staveBar4, notesBar4);\n}\nfunction drawEndModifiers(options, contextBuilder) {\n expect(0);\n const staveWidth = 230;\n const blockHeight = 80;\n let x = 10;\n let y = 0;\n const ctx = contextBuilder(options.elementId, 800, 700);\n function drawStavesInTwoLines(endBarLine) {\n // Draw a stave with one measure. Change the ending modifiers.\n // eslint-disable-next-line\n function drawStave(x, y, width, begMods, endMods) {\n const staveBar = new Stave(x, y, width - 10);\n if (begMods) {\n if (begMods.barLine !== undefined) {\n staveBar.setBegBarType(begMods.barLine);\n }\n if (begMods.clef !== undefined) {\n staveBar.addClef(begMods.clef);\n }\n if (begMods.keySig !== undefined) {\n staveBar.addKeySignature(begMods.keySig);\n }\n if (begMods.timeSig !== undefined) {\n staveBar.setTimeSignature(begMods.timeSig);\n }\n }\n if (endMods) {\n if (endMods.barLine !== undefined) {\n staveBar.setEndBarType(endMods.barLine);\n }\n if (endMods.clef !== undefined) {\n staveBar.addEndClef(endMods.clef);\n }\n if (endMods.keySig !== undefined) {\n staveBar.setEndKeySignature(endMods.keySig);\n }\n if (endMods.timeSig !== undefined) {\n staveBar.setEndTimeSignature(endMods.timeSig);\n }\n }\n staveBar.setContext(ctx).draw();\n const notesBar = [\n new StaveNote({ keys: ['c/4'], duration: 'q' }),\n new StaveNote({ keys: ['d/4'], duration: 'q' }),\n new StaveNote({ keys: ['b/4'], duration: 'qr' }),\n new StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: 'q' }),\n ];\n Formatter.FormatAndDraw(ctx, staveBar, notesBar);\n }\n drawStave(x, y, staveWidth + 50, { barLine: BarlineType.REPEAT_BEGIN, clef: 'treble', keySig: 'A' }, { barLine: endBarLine, clef: 'bass' });\n x += staveWidth + 50;\n drawStave(x, y, staveWidth, { barLine: BarlineType.REPEAT_BEGIN }, { barLine: endBarLine, keySig: 'E' });\n x += staveWidth;\n drawStave(x, y, staveWidth, { barLine: BarlineType.REPEAT_BEGIN }, { barLine: endBarLine, timeSig: '2/4' });\n x += staveWidth;\n x = 10;\n y += blockHeight;\n drawStave(x, y, staveWidth, { barLine: BarlineType.REPEAT_BEGIN }, { barLine: endBarLine, clef: 'bass', timeSig: '2/4' });\n x += staveWidth;\n drawStave(x, y, staveWidth, { barLine: BarlineType.REPEAT_BEGIN }, { barLine: endBarLine, clef: 'treble', keySig: 'Ab' });\n x += staveWidth;\n drawStave(x, y, staveWidth, { barLine: BarlineType.REPEAT_BEGIN }, { barLine: endBarLine, clef: 'bass', keySig: 'Ab', timeSig: '2/4' });\n x += staveWidth;\n }\n y = 0;\n x = 10;\n // First pair of staves.\n drawStavesInTwoLines(BarlineType.SINGLE);\n y += blockHeight + 10;\n x = 10;\n // Second pair of staves, with double barlines.\n drawStavesInTwoLines(BarlineType.DOUBLE);\n y += blockHeight + 10;\n x = 10;\n // Third pair of staves, with \"two dot\" repeat barlines.\n drawStavesInTwoLines(BarlineType.REPEAT_END);\n y += blockHeight + 10;\n x = 10;\n // Fourth pair of staves, with \"two dots\" on each side of the barlines.\n drawStavesInTwoLines(BarlineType.REPEAT_BOTH);\n}\nfunction drawStaveRepetition(options, contextBuilder) {\n expect(0);\n // Get the rendering context\n const ctx = contextBuilder(options.elementId, 725, 200);\n // bar 1\n const mm1 = new Stave(10, 50, 150);\n mm1.addClef('treble');\n mm1.setRepetitionType(Repetition.type.DS_AL_FINE, options.params.yShift);\n mm1.setMeasure(1);\n mm1.setContext(ctx).draw();\n const notesmm1 = [\n new StaveNote({ keys: ['a/4'], duration: 'q' }),\n new StaveNote({ keys: ['f/4'], duration: 'q' }),\n new StaveNote({ keys: ['f/4'], duration: 'q' }),\n new StaveNote({ keys: ['a/4'], duration: 'q' }),\n ];\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, mm1, notesmm1);\n // bar 2 - juxtapose second measure\n const mm2 = new Stave(mm1.getWidth() + mm1.getX(), mm1.getY(), 150);\n mm2.setRepetitionType(Repetition.type.TO_CODA, options.params.yShift);\n mm2.setMeasure(2);\n mm2.setContext(ctx).draw();\n const notesmm2 = [\n new StaveNote({ keys: ['a/4'], duration: 'q' }),\n new StaveNote({ keys: ['f/4'], duration: 'q' }),\n new StaveNote({ keys: ['f/4'], duration: 'q' }),\n new StaveNote({ keys: ['a/4'], duration: 'q' }),\n ];\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, mm2, notesmm2);\n // bar 3 - juxtapose third measure\n const mm3 = new Stave(mm2.getWidth() + mm2.getX(), mm1.getY(), 150);\n mm3.setRepetitionType(Repetition.type.DS_AL_CODA, options.params.yShift);\n mm3.setMeasure(3);\n mm3.setContext(ctx).draw();\n const notesmm3 = [\n new StaveNote({ keys: ['a/4'], duration: 'q' }),\n new StaveNote({ keys: ['f/4'], duration: 'q' }),\n new StaveNote({ keys: ['f/4'], duration: 'q' }),\n new StaveNote({ keys: ['a/4'], duration: 'q' }),\n ];\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, mm3, notesmm3);\n // bar 4 - juxtapose fourth measure\n const mm4 = new Stave(mm3.getWidth() + mm3.getX(), mm1.getY(), 150);\n mm4.setRepetitionType(Repetition.type.CODA_LEFT, options.params.yShift);\n mm4.setMeasure(4);\n mm4.setContext(ctx).draw();\n const notesmm4 = [\n new StaveNote({ keys: ['a/4'], duration: 'q' }),\n new StaveNote({ keys: ['f/4'], duration: 'q' }),\n new StaveNote({ keys: ['f/4'], duration: 'q' }),\n new StaveNote({ keys: ['a/4'], duration: 'q' }),\n ];\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, mm4, notesmm4);\n}\nfunction drawVolta(options, contextBuilder) {\n expect(0);\n // Get the rendering context\n const ctx = contextBuilder(options.elementId, 725, 200);\n // bar 1\n const mm1 = new Stave(10, 50, 125);\n mm1.setBegBarType(BarlineType.REPEAT_BEGIN);\n mm1.setRepetitionType(Repetition.type.SEGNO_LEFT);\n mm1.addClef('treble');\n mm1.addKeySignature('A');\n mm1.setMeasure(1);\n mm1.setSection('A', 0);\n mm1.setContext(ctx).draw();\n const notesmm1 = [new StaveNote({ keys: ['c/4'], duration: 'w' })];\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, mm1, notesmm1);\n // bar 2 - juxtapose second measure\n const mm2 = new Stave(mm1.getWidth() + mm1.getX(), mm1.getY(), 60);\n mm2.setRepetitionType(Repetition.type.CODA_RIGHT);\n mm2.setMeasure(2);\n mm2.setContext(ctx).draw();\n const notesmm2 = [new StaveNote({ keys: ['d/4'], duration: 'w' })];\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, mm2, notesmm2);\n // bar 3 - juxtapose third measure\n const mm3 = new Stave(mm2.getWidth() + mm2.getX(), mm1.getY(), 60);\n mm3.setVoltaType(VoltaType.BEGIN, '1.', -5);\n mm3.setMeasure(3);\n mm3.setContext(ctx).draw();\n const notesmm3 = [new StaveNote({ keys: ['e/4'], duration: 'w' })];\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, mm3, notesmm3);\n // bar 4 - juxtapose fourth measure\n const mm4 = new Stave(mm3.getWidth() + mm3.getX(), mm1.getY(), 60);\n mm4.setVoltaType(VoltaType.MID, '', -5);\n mm4.setMeasure(4);\n mm4.setContext(ctx).draw();\n const notesmm4 = [new StaveNote({ keys: ['f/4'], duration: 'w' })];\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, mm4, notesmm4);\n // bar 5 - juxtapose fifth measure\n const mm5 = new Stave(mm4.getWidth() + mm4.getX(), mm1.getY(), 60);\n mm5.setEndBarType(BarlineType.REPEAT_END);\n mm5.setVoltaType(VoltaType.END, '', -5);\n mm5.setMeasure(5);\n mm5.setContext(ctx).draw();\n const notesmm5 = [new StaveNote({ keys: ['g/4'], duration: 'w' })];\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, mm5, notesmm5);\n // bar 6 - juxtapose sixth measure\n const mm6 = new Stave(mm5.getWidth() + mm5.getX(), mm1.getY(), 60);\n mm6.setVoltaType(VoltaType.BEGIN_END, '2.', -5);\n mm6.setEndBarType(BarlineType.DOUBLE);\n mm6.setMeasure(6);\n mm6.setContext(ctx).draw();\n const notesmm6 = [new StaveNote({ keys: ['a/4'], duration: 'w' })];\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, mm6, notesmm6);\n // bar 7 - juxtapose seventh measure\n const mm7 = new Stave(mm6.getWidth() + mm6.getX(), mm1.getY(), 60);\n mm7.setMeasure(7);\n mm7.setSection('B', 0);\n mm7.setContext(ctx).draw();\n const notesmm7 = [new StaveNote({ keys: ['b/4'], duration: 'w' })];\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, mm7, notesmm7);\n // bar 8 - juxtapose eighth measure\n const mm8 = new Stave(mm7.getWidth() + mm7.getX(), mm1.getY(), 60);\n mm8.setEndBarType(BarlineType.DOUBLE);\n mm8.setRepetitionType(Repetition.type.DS_AL_CODA);\n mm8.setMeasure(8);\n mm8.setContext(ctx).draw();\n const notesmm8 = [new StaveNote({ keys: ['c/5'], duration: 'w' })];\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, mm8, notesmm8);\n // bar 9 - juxtapose ninth measure\n const mm9 = new Stave(mm8.getWidth() + mm8.getX() + 20, mm1.getY(), 125);\n mm9.setEndBarType(BarlineType.END);\n mm9.setRepetitionType(Repetition.type.CODA_LEFT);\n mm9.addClef('treble');\n mm9.addKeySignature('A');\n mm9.setMeasure(9);\n mm9.setContext(ctx).draw();\n const notesmm9 = [new StaveNote({ keys: ['d/5'], duration: 'w' })];\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, mm9, notesmm9);\n}\nfunction drawVoltaModifier(options, contextBuilder) {\n expect(0);\n // Get the rendering context\n const ctx = contextBuilder(options.elementId, 1100, 200);\n // bar 1: volta begin, with modifiers (clef, keysignature)\n const mm1 = new Stave(10, 50, 175);\n mm1.setBegBarType(BarlineType.REPEAT_BEGIN);\n mm1.setVoltaType(VoltaType.BEGIN_END, '1.', -5);\n mm1.addClef('treble');\n mm1.addKeySignature('A');\n mm1.setMeasure(1);\n mm1.setSection('A', 0);\n mm1.setContext(ctx).draw();\n const notesmm1 = [new StaveNote({ keys: ['c/4'], duration: 'w' })];\n // Helper function to justify and draw a 4/4 voice\n Formatter.FormatAndDraw(ctx, mm1, notesmm1);\n // bar 2: volta begin_mid, with modifiers (clef, keysignature)\n const mm2 = new Stave(mm1.getX() + mm1.getWidth(), mm1.getY(), 175);\n mm2.setBegBarType(BarlineType.REPEAT_BEGIN);\n mm2.setRepetitionType(Repetition.type.DS);\n mm2.setVoltaType(VoltaType.BEGIN, '2.', -5);\n mm2.addClef('treble');\n mm2.addKeySignature('A');\n mm2.setMeasure(2);\n mm2.setContext(ctx).draw();\n const notesmm2 = [new StaveNote({ keys: ['c/4'], duration: 'w' })];\n Formatter.FormatAndDraw(ctx, mm2, notesmm2);\n // bar 3: volta mid, with modifiers (clef, keysignature)\n const mm3 = new Stave(mm2.getX() + mm2.getWidth(), mm2.getY(), 175);\n mm3.setVoltaType(VoltaType.MID, '', -5);\n mm3.setRepetitionType(Repetition.type.DS);\n mm3.addClef('treble');\n mm3.addKeySignature('B');\n mm3.setMeasure(3);\n mm3.setSection('B', 0);\n mm3.setContext(ctx).draw();\n const notesmm3 = [new StaveNote({ keys: ['c/4'], duration: 'w' })];\n Formatter.FormatAndDraw(ctx, mm3, notesmm3);\n // bar 4: volta end, with modifiers (clef, keysignature)\n const mm4 = new Stave(mm3.getX() + mm3.getWidth(), mm3.getY(), 175);\n mm4.setVoltaType(VoltaType.END, '1.', -5);\n mm4.setRepetitionType(Repetition.type.DS);\n mm4.addClef('treble');\n mm4.addKeySignature('A');\n mm4.setMeasure(4);\n mm4.setSection('C', 0);\n mm4.setContext(ctx).draw();\n const notesmm4 = [new StaveNote({ keys: ['c/4'], duration: 'w' })];\n Formatter.FormatAndDraw(ctx, mm4, notesmm4);\n // bar 5: d.s. shift (similar potential x-shift concern)\n const mm5 = new Stave(mm4.getX() + mm4.getWidth(), mm4.getY(), 175);\n // mm5.addModifier(new Repetition(Repetition.type.DS, mm4.getX() + mm4.getWidth(), 50), StaveModifierPosition.RIGHT);\n mm5.setEndBarType(BarlineType.DOUBLE);\n mm5.setRepetitionType(Repetition.type.DS);\n mm5.addClef('treble');\n mm5.addKeySignature('A');\n mm5.setMeasure(5);\n mm5.setSection('D', 0);\n mm5.setContext(ctx).draw();\n const notesmm5 = [new StaveNote({ keys: ['c/4'], duration: 'w' })];\n Formatter.FormatAndDraw(ctx, mm5, notesmm5);\n // bar 6: d.s. without modifiers\n const mm6 = new Stave(mm5.getX() + mm5.getWidth(), mm5.getY(), 175);\n // mm5.addModifier(new Repetition(Repetition.type.DS, mm4.getX() + mm4.getWidth(), 50), StaveModifierPosition.RIGHT);\n mm6.setRepetitionType(Repetition.type.DS);\n mm6.setMeasure(6);\n mm6.setSection('E', 0);\n mm6.setContext(ctx).draw();\n const notesmm6 = [new StaveNote({ keys: ['c/4'], duration: 'w' })];\n Formatter.FormatAndDraw(ctx, mm6, notesmm6);\n}\nfunction drawTempo(options, contextBuilder) {\n expect(0);\n const ctx = contextBuilder(options.elementId, 725, 350);\n const padding = 10;\n let x = 0;\n let y = 50;\n function drawTempoStaveBar(width, tempo, tempo_y, notes) {\n const staveBar = new Stave(padding + x, y, width);\n if (x === 0)\n staveBar.addClef('treble');\n staveBar.setTempo(tempo, tempo_y);\n staveBar.setContext(ctx).draw();\n const notesBar = notes || [\n new StaveNote({ keys: ['c/4'], duration: 'q' }),\n new StaveNote({ keys: ['d/4'], duration: 'q' }),\n new StaveNote({ keys: ['b/4'], duration: 'q' }),\n new StaveNote({ keys: ['c/4'], duration: 'q' }),\n ];\n Formatter.FormatAndDraw(ctx, staveBar, notesBar);\n x += width;\n }\n drawTempoStaveBar(120, { duration: 'q', dots: 1, bpm: 80 }, 0);\n drawTempoStaveBar(100, { duration: '8', dots: 2, bpm: 90 }, 0);\n drawTempoStaveBar(100, { duration: '16', dots: 1, bpm: 96 }, 0);\n drawTempoStaveBar(100, { duration: '32', bpm: 70 }, 0);\n drawTempoStaveBar(250, { name: 'Andante', bpm: 120 }, -20, [\n new StaveNote({ keys: ['c/4'], duration: '8' }),\n new StaveNote({ keys: ['d/4'], duration: '8' }),\n new StaveNote({ keys: ['g/4'], duration: '8' }),\n new StaveNote({ keys: ['e/5'], duration: '8' }),\n new StaveNote({ keys: ['c/4'], duration: '8' }),\n new StaveNote({ keys: ['d/4'], duration: '8' }),\n new StaveNote({ keys: ['g/4'], duration: '8' }),\n new StaveNote({ keys: ['e/4'], duration: '8' }),\n ]);\n x = 0;\n y += 150;\n drawTempoStaveBar(120, { duration: 'w', bpm: 80 }, 0);\n drawTempoStaveBar(100, { duration: 'h', bpm: 90 }, 0);\n drawTempoStaveBar(100, { duration: 'q', bpm: 96 }, 0);\n drawTempoStaveBar(100, { duration: '8', bpm: 70 }, 0);\n drawTempoStaveBar(250, { name: 'Andante grazioso' }, 0, [\n new StaveNote({ keys: ['c/4'], duration: '8' }),\n new StaveNote({ keys: ['d/4'], duration: '8' }),\n new StaveNote({ keys: ['g/4'], duration: '8' }),\n new StaveNote({ keys: ['e/4'], duration: '8' }),\n new StaveNote({ keys: ['c/4'], duration: '8' }),\n new StaveNote({ keys: ['d/4'], duration: '8' }),\n new StaveNote({ keys: ['g/4'], duration: '8' }),\n new StaveNote({ keys: ['e/4'], duration: '8' }),\n ]);\n}\nfunction configureSingleLine(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 400, 120);\n const stave = new Stave(10, 10, 300);\n stave\n .setConfigForLine(0, { visible: true })\n .setConfigForLine(1, { visible: false })\n .setConfigForLine(2, { visible: true })\n .setConfigForLine(3, { visible: false })\n .setConfigForLine(4, { visible: true });\n stave.setContext(ctx).draw();\n const config = stave.getConfigForLines();\n equal(config[0].visible, true, 'getLinesConfiguration() - Line 0');\n equal(config[1].visible, false, 'getLinesConfiguration() - Line 1');\n equal(config[2].visible, true, 'getLinesConfiguration() - Line 2');\n equal(config[3].visible, false, 'getLinesConfiguration() - Line 3');\n equal(config[4].visible, true, 'getLinesConfiguration() - Line 4');\n ok(true, 'all pass');\n}\nfunction configureAllLines(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 400, 120);\n const stave = new Stave(10, 10, 300);\n stave\n .setConfigForLines([{ visible: false }, {}, { visible: false }, { visible: true }, { visible: false }])\n .setContext(ctx)\n .draw();\n const config = stave.getConfigForLines();\n equal(config[0].visible, false, 'getLinesConfiguration() - Line 0');\n equal(config[1].visible, true, 'getLinesConfiguration() - Line 1');\n equal(config[2].visible, false, 'getLinesConfiguration() - Line 2');\n equal(config[3].visible, true, 'getLinesConfiguration() - Line 3');\n equal(config[4].visible, false, 'getLinesConfiguration() - Line 4');\n ok(true, 'all pass');\n}\nfunction drawStaveText(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 900, 140);\n const stave = new Stave(300, 10, 300);\n stave.setText('Violin', Modifier.Position.LEFT);\n stave.setText('Right Text', Modifier.Position.RIGHT);\n stave.setText('Above Text', Modifier.Position.ABOVE);\n stave.setText('Below Text', Modifier.Position.BELOW);\n stave.setContext(ctx).draw();\n ok(true, 'all pass');\n}\nfunction drawStaveTextMultiLine(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 900, 200);\n const stave = new Stave(300, 40, 300);\n stave.setText('Violin', Modifier.Position.LEFT, { shift_y: -10 });\n stave.setText('2nd line', Modifier.Position.LEFT, { shift_y: 10 });\n stave.setText('Right Text', Modifier.Position.RIGHT, { shift_y: -10 });\n stave.setText('2nd line', Modifier.Position.RIGHT, { shift_y: 10 });\n stave.setText('Above Text', Modifier.Position.ABOVE, { shift_y: -10 });\n stave.setText('2nd line', Modifier.Position.ABOVE, { shift_y: 10 });\n stave.setText('Left Below Text', Modifier.Position.BELOW, { shift_y: -10, justification: Justification.LEFT });\n stave.setText('Right Below Text', Modifier.Position.BELOW, { shift_y: 10, justification: Justification.RIGHT });\n stave.setContext(ctx).draw();\n ok(true, 'all pass');\n}\nfunction factoryAPI(options) {\n const f = VexFlowTests.makeFactory(options, 900, 200);\n const stave = f.Stave({ x: 300, y: 40, width: 300 });\n stave.setText('Violin', Modifier.Position.LEFT, { shift_y: -10 });\n stave.setText('2nd line', Modifier.Position.LEFT, { shift_y: 10 });\n f.draw();\n ok(true, 'all pass');\n}\nVexFlowTests.register(StaveTests);\nexport { StaveTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// StaveConnector Tests\n// TODO: Should we change StaveConnector.type => StaveConnectorType? We are inconsistent with this.\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Flow } from '../src/flow';\nimport { Modifier } from '../src/modifier';\nimport { Stave } from '../src/stave';\nimport { BarlineType } from '../src/stavebarline';\nimport { StaveConnector } from '../src/staveconnector';\nconst StaveConnectorTests = {\n Start() {\n QUnit.module('StaveConnector');\n const run = VexFlowTests.runTests;\n run('Single Draw Test', drawSingle);\n run('Single Draw Test, 4px Stave Line Thickness', drawSingle4pxStaveLines);\n run('Single Both Sides Test', drawSingleBoth);\n run('Double Draw Test', drawDouble);\n run('Bold Double Line Left Draw Test', drawRepeatBegin);\n run('Bold Double Line Right Draw Test', drawRepeatEnd);\n run('Thin Double Line Right Draw Test', drawThinDouble);\n run('Bold Double Lines Overlapping Draw Test', drawRepeatAdjacent);\n run('Bold Double Lines Offset Draw Test', drawRepeatOffset);\n run('Bold Double Lines Offset Draw Test 2', drawRepeatOffset2);\n run('Brace Draw Test', drawBrace);\n run('Brace Wide Draw Test', drawBraceWide);\n run('Bracket Draw Test', drawBracket);\n run('Combined Draw Test', drawCombined);\n },\n};\nfunction drawSingle(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 400, 300);\n const stave1 = new Stave(25, 10, 300);\n const stave2 = new Stave(25, 120, 300);\n stave1.setContext(ctx);\n stave2.setContext(ctx);\n const connector = new StaveConnector(stave1, stave2);\n connector.setType(StaveConnector.type.SINGLE);\n connector.setContext(ctx);\n stave1.draw();\n stave2.draw();\n connector.draw();\n ok(true, 'all pass');\n}\nfunction drawSingle4pxStaveLines(options, contextBuilder) {\n const oldThickness = Flow.STAVE_LINE_THICKNESS;\n Flow.STAVE_LINE_THICKNESS = 4;\n const ctx = contextBuilder(options.elementId, 400, 300);\n const stave1 = new Stave(25, 10, 300);\n const stave2 = new Stave(25, 120, 300);\n stave1.setContext(ctx);\n stave2.setContext(ctx);\n const connector = new StaveConnector(stave1, stave2);\n connector.setType(StaveConnector.type.SINGLE);\n connector.setContext(ctx);\n stave1.draw();\n stave2.draw();\n connector.draw();\n Flow.STAVE_LINE_THICKNESS = oldThickness;\n ok(true, 'all pass');\n}\nfunction drawSingleBoth(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 400, 300);\n const stave1 = new Stave(25, 10, 300);\n const stave2 = new Stave(25, 120, 300);\n stave1.setContext(ctx);\n stave2.setContext(ctx);\n const connector1 = new StaveConnector(stave1, stave2);\n connector1.setType(StaveConnector.type.SINGLE_LEFT);\n connector1.setContext(ctx);\n const connector2 = new StaveConnector(stave1, stave2);\n connector2.setType(StaveConnector.type.SINGLE_RIGHT);\n connector2.setContext(ctx);\n stave1.draw();\n stave2.draw();\n connector1.draw();\n connector2.draw();\n ok(true, 'all pass');\n}\nfunction drawDouble(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 400, 300);\n const stave1 = new Stave(25, 10, 300);\n const stave2 = new Stave(25, 120, 300);\n stave1.setContext(ctx);\n stave2.setContext(ctx);\n const connector = new StaveConnector(stave1, stave2);\n const line = new StaveConnector(stave1, stave2);\n connector.setType(StaveConnector.type.DOUBLE);\n connector.setContext(ctx);\n line.setType(StaveConnector.type.SINGLE);\n connector.setContext(ctx);\n line.setContext(ctx);\n stave1.draw();\n stave2.draw();\n connector.draw();\n line.draw();\n ok(true, 'all pass');\n}\nfunction drawBrace(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 450, 300);\n const stave1 = new Stave(100, 10, 300);\n const stave2 = new Stave(100, 120, 300);\n stave1.setContext(ctx);\n stave2.setContext(ctx);\n const connector = new StaveConnector(stave1, stave2);\n const line = new StaveConnector(stave1, stave2);\n connector.setType(StaveConnector.type.BRACE);\n connector.setContext(ctx);\n connector.setText('Piano');\n line.setType(StaveConnector.type.SINGLE);\n connector.setContext(ctx);\n line.setContext(ctx);\n stave1.draw();\n stave2.draw();\n connector.draw();\n line.draw();\n ok(true, 'all pass');\n}\nfunction drawBraceWide(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 400, 300);\n const stave1 = new Stave(25, -20, 300);\n const stave2 = new Stave(25, 200, 300);\n stave1.setContext(ctx);\n stave2.setContext(ctx);\n const connector = new StaveConnector(stave1, stave2);\n const line = new StaveConnector(stave1, stave2);\n connector.setType(StaveConnector.type.BRACE);\n connector.setContext(ctx);\n line.setType(StaveConnector.type.SINGLE);\n connector.setContext(ctx);\n line.setContext(ctx);\n stave1.draw();\n stave2.draw();\n connector.draw();\n line.draw();\n ok(true, 'all pass');\n}\nfunction drawBracket(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 400, 300);\n const stave1 = new Stave(25, 10, 300);\n const stave2 = new Stave(25, 120, 300);\n stave1.setContext(ctx);\n stave2.setContext(ctx);\n const connector = new StaveConnector(stave1, stave2);\n const line = new StaveConnector(stave1, stave2);\n connector.setType(StaveConnector.type.BRACKET);\n connector.setContext(ctx);\n line.setType(StaveConnector.type.SINGLE);\n connector.setContext(ctx);\n line.setContext(ctx);\n stave1.draw();\n stave2.draw();\n connector.draw();\n line.draw();\n ok(true, 'all pass');\n}\nfunction drawRepeatBegin(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 400, 300);\n const stave1 = new Stave(25, 10, 300);\n const stave2 = new Stave(25, 120, 300);\n stave1.setContext(ctx);\n stave2.setContext(ctx);\n stave1.setBegBarType(BarlineType.REPEAT_BEGIN);\n stave2.setBegBarType(BarlineType.REPEAT_BEGIN);\n const line = new StaveConnector(stave1, stave2);\n line.setType(StaveConnector.type.BOLD_DOUBLE_LEFT);\n line.setContext(ctx);\n stave1.draw();\n stave2.draw();\n line.draw();\n ok(true, 'all pass');\n}\nfunction drawRepeatEnd(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 400, 300);\n const stave1 = new Stave(25, 10, 300);\n const stave2 = new Stave(25, 120, 300);\n stave1.setContext(ctx);\n stave2.setContext(ctx);\n stave1.setEndBarType(BarlineType.REPEAT_END);\n stave2.setEndBarType(BarlineType.REPEAT_END);\n const line = new StaveConnector(stave1, stave2);\n line.setType(StaveConnector.type.BOLD_DOUBLE_RIGHT);\n line.setContext(ctx);\n stave1.draw();\n stave2.draw();\n line.draw();\n ok(true, 'all pass');\n}\nfunction drawThinDouble(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 400, 300);\n const stave1 = new Stave(25, 10, 300);\n const stave2 = new Stave(25, 120, 300);\n stave1.setContext(ctx);\n stave2.setContext(ctx);\n stave1.setEndBarType(BarlineType.DOUBLE);\n stave2.setEndBarType(BarlineType.DOUBLE);\n const line = new StaveConnector(stave1, stave2);\n line.setType(StaveConnector.type.THIN_DOUBLE);\n line.setContext(ctx);\n stave1.draw();\n stave2.draw();\n line.draw();\n ok(true, 'all pass');\n}\nfunction drawRepeatAdjacent(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 400, 300);\n const stave1 = new Stave(25, 10, 150);\n const stave2 = new Stave(25, 120, 150);\n const stave3 = new Stave(175, 10, 150);\n const stave4 = new Stave(175, 120, 150);\n stave1.setContext(ctx);\n stave2.setContext(ctx);\n stave3.setContext(ctx);\n stave4.setContext(ctx);\n stave1.setEndBarType(BarlineType.REPEAT_END);\n stave2.setEndBarType(BarlineType.REPEAT_END);\n stave3.setEndBarType(BarlineType.END);\n stave4.setEndBarType(BarlineType.END);\n stave1.setBegBarType(BarlineType.REPEAT_BEGIN);\n stave2.setBegBarType(BarlineType.REPEAT_BEGIN);\n stave3.setBegBarType(BarlineType.REPEAT_BEGIN);\n stave4.setBegBarType(BarlineType.REPEAT_BEGIN);\n const connector1 = new StaveConnector(stave1, stave2);\n const connector2 = new StaveConnector(stave1, stave2);\n const connector3 = new StaveConnector(stave3, stave4);\n const connector4 = new StaveConnector(stave3, stave4);\n connector1.setContext(ctx);\n connector2.setContext(ctx);\n connector3.setContext(ctx);\n connector4.setContext(ctx);\n connector1.setType(StaveConnector.type.BOLD_DOUBLE_LEFT);\n connector2.setType(StaveConnector.type.BOLD_DOUBLE_RIGHT);\n connector3.setType(StaveConnector.type.BOLD_DOUBLE_LEFT);\n connector4.setType(StaveConnector.type.BOLD_DOUBLE_RIGHT);\n stave1.draw();\n stave2.draw();\n stave3.draw();\n stave4.draw();\n connector1.draw();\n connector2.draw();\n connector3.draw();\n connector4.draw();\n ok(true, 'all pass');\n}\nfunction drawRepeatOffset2(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 400, 300);\n const stave1 = new Stave(25, 10, 150);\n const stave2 = new Stave(25, 120, 150);\n const stave3 = new Stave(175, 10, 150);\n const stave4 = new Stave(175, 120, 150);\n stave1.setContext(ctx);\n stave2.setContext(ctx);\n stave3.setContext(ctx);\n stave4.setContext(ctx);\n stave1.addClef('treble');\n stave2.addClef('bass');\n stave3.addClef('alto');\n stave4.addClef('treble');\n stave1.addTimeSignature('4/4');\n stave2.addTimeSignature('4/4');\n stave3.addTimeSignature('6/8');\n stave4.addTimeSignature('6/8');\n stave1.setEndBarType(BarlineType.REPEAT_END);\n stave2.setEndBarType(BarlineType.REPEAT_END);\n stave3.setEndBarType(BarlineType.END);\n stave4.setEndBarType(BarlineType.END);\n stave1.setBegBarType(BarlineType.REPEAT_BEGIN);\n stave2.setBegBarType(BarlineType.REPEAT_BEGIN);\n stave3.setBegBarType(BarlineType.REPEAT_BEGIN);\n stave4.setBegBarType(BarlineType.REPEAT_BEGIN);\n const connector1 = new StaveConnector(stave1, stave2);\n const connector2 = new StaveConnector(stave1, stave2);\n const connector3 = new StaveConnector(stave3, stave4);\n const connector4 = new StaveConnector(stave3, stave4);\n const connector5 = new StaveConnector(stave3, stave4);\n connector1.setContext(ctx);\n connector2.setContext(ctx);\n connector3.setContext(ctx);\n connector4.setContext(ctx);\n connector5.setContext(ctx);\n connector1.setType(StaveConnector.type.BOLD_DOUBLE_LEFT);\n connector2.setType(StaveConnector.type.BOLD_DOUBLE_RIGHT);\n connector3.setType(StaveConnector.type.BOLD_DOUBLE_LEFT);\n connector4.setType(StaveConnector.type.BOLD_DOUBLE_RIGHT);\n connector5.setType(StaveConnector.type.SINGLE_LEFT);\n connector1.setXShift(stave1.getModifierXShift());\n connector3.setXShift(stave3.getModifierXShift());\n stave1.draw();\n stave2.draw();\n stave3.draw();\n stave4.draw();\n connector1.draw();\n connector2.draw();\n connector3.draw();\n connector4.draw();\n connector5.draw();\n ok(true, 'all pass');\n}\nfunction drawRepeatOffset(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 400, 300);\n const stave1 = new Stave(25, 10, 150);\n const stave2 = new Stave(25, 120, 150);\n const stave3 = new Stave(185, 10, 150);\n const stave4 = new Stave(185, 120, 150);\n stave1.setContext(ctx);\n stave2.setContext(ctx);\n stave3.setContext(ctx);\n stave4.setContext(ctx);\n stave1.addClef('bass');\n stave2.addClef('alto');\n stave3.addClef('treble');\n stave4.addClef('tenor');\n stave3.addKeySignature('Ab');\n stave4.addKeySignature('Ab');\n stave1.addTimeSignature('4/4');\n stave2.addTimeSignature('4/4');\n stave3.addTimeSignature('6/8');\n stave4.addTimeSignature('6/8');\n stave1.setEndBarType(BarlineType.REPEAT_END);\n stave2.setEndBarType(BarlineType.REPEAT_END);\n stave3.setEndBarType(BarlineType.END);\n stave4.setEndBarType(BarlineType.END);\n stave1.setBegBarType(BarlineType.REPEAT_BEGIN);\n stave2.setBegBarType(BarlineType.REPEAT_BEGIN);\n stave3.setBegBarType(BarlineType.REPEAT_BEGIN);\n stave4.setBegBarType(BarlineType.REPEAT_BEGIN);\n const connector1 = new StaveConnector(stave1, stave2);\n const connector2 = new StaveConnector(stave1, stave2);\n const connector3 = new StaveConnector(stave3, stave4);\n const connector4 = new StaveConnector(stave3, stave4);\n const connector5 = new StaveConnector(stave3, stave4);\n connector1.setContext(ctx);\n connector2.setContext(ctx);\n connector3.setContext(ctx);\n connector4.setContext(ctx);\n connector5.setContext(ctx);\n connector1.setType(StaveConnector.type.BOLD_DOUBLE_LEFT);\n connector2.setType(StaveConnector.type.BOLD_DOUBLE_RIGHT);\n connector3.setType(StaveConnector.type.BOLD_DOUBLE_LEFT);\n connector4.setType(StaveConnector.type.BOLD_DOUBLE_RIGHT);\n connector5.setType(StaveConnector.type.SINGLE_LEFT);\n connector1.setXShift(stave1.getModifierXShift());\n connector3.setXShift(stave3.getModifierXShift());\n stave1.draw();\n stave2.draw();\n stave3.draw();\n stave4.draw();\n connector1.draw();\n connector2.draw();\n connector3.draw();\n connector4.draw();\n connector5.draw();\n ok(true, 'all pass');\n}\nfunction drawCombined(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 550, 700);\n const stave1 = new Stave(150, 10, 300);\n const stave2 = new Stave(150, 100, 300);\n const stave3 = new Stave(150, 190, 300);\n const stave4 = new Stave(150, 280, 300);\n const stave5 = new Stave(150, 370, 300);\n const stave6 = new Stave(150, 460, 300);\n const stave7 = new Stave(150, 560, 300);\n stave1.setText('Violin', Modifier.Position.LEFT);\n stave1.setContext(ctx);\n stave2.setContext(ctx);\n stave3.setContext(ctx);\n stave4.setContext(ctx);\n stave5.setContext(ctx);\n stave6.setContext(ctx);\n stave7.setContext(ctx);\n const conn_single = new StaveConnector(stave1, stave7);\n const conn_double = new StaveConnector(stave2, stave3);\n const conn_bracket = new StaveConnector(stave4, stave7);\n const conn_none = new StaveConnector(stave4, stave5);\n const conn_brace = new StaveConnector(stave6, stave7);\n conn_single.setType(StaveConnector.type.SINGLE);\n conn_double.setType(StaveConnector.type.DOUBLE);\n conn_bracket.setType(StaveConnector.type.BRACKET);\n conn_brace.setType(StaveConnector.type.BRACE);\n conn_brace.setXShift(-5);\n conn_double.setText('Piano');\n conn_none.setText('Multiple', { shift_y: -15 });\n conn_none.setText('Line Text', { shift_y: 15 });\n conn_brace.setText('Harpsichord');\n conn_single.setContext(ctx);\n conn_double.setContext(ctx);\n conn_bracket.setContext(ctx);\n conn_none.setContext(ctx);\n conn_brace.setContext(ctx);\n stave1.draw();\n stave2.draw();\n stave3.draw();\n stave4.draw();\n stave5.draw();\n stave6.draw();\n stave7.draw();\n conn_single.draw();\n conn_double.draw();\n conn_bracket.draw();\n conn_none.draw();\n conn_brace.draw();\n ok(true, 'all pass');\n}\nVexFlowTests.register(StaveConnectorTests);\nexport { StaveConnectorTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// Author: Raffaele Viglianti, 2012\n//\n// StaveHairpin Tests\n// TODO: Incorrect property names in the options object: vo, left_ho, right_ho.\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { StaveHairpin } from '../src/stavehairpin';\nconst StaveHairpinTests = {\n Start() {\n QUnit.module('StaveHairpin');\n const run = VexFlowTests.runTests;\n run('Simple StaveHairpin', simple);\n run('Horizontal Offset StaveHairpin', horizontal);\n run('Vertical Offset StaveHairpin', vertical);\n run('Height StaveHairpin', height);\n },\n};\n/**\n * Helper function to draw a single hairpin (either crescendo or decrescendo).\n * @param type is StaveHairpin.type.CRESC or StaveHairpin.type.DECRESC.\n * @param position is Modifier.Position.ABOVE or Modifier.Position.BELOW.\n */\nfunction drawHairpin(first_note, last_note, ctx, type, position, options) {\n const hairpin = new StaveHairpin({ first_note, last_note }, type);\n hairpin.setContext(ctx);\n hairpin.setPosition(position);\n if (options) {\n hairpin.setRenderOptions(options);\n }\n hairpin.draw();\n}\n/**\n * Helper function\n */\nfunction createTest(drawTwoHairpins) {\n return (options) => {\n const factory = VexFlowTests.makeFactory(options);\n const ctx = factory.getContext();\n const stave = factory.Stave();\n const notes = [\n factory\n .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], stem_direction: 1, duration: '4' })\n .addModifier(factory.Accidental({ type: 'b' }), 0)\n .addModifier(factory.Accidental({ type: '#' }), 1),\n factory.StaveNote({ keys: ['d/4'], stem_direction: 1, duration: '4' }),\n factory.StaveNote({ keys: ['e/4'], stem_direction: 1, duration: '4' }),\n factory.StaveNote({ keys: ['f/4'], stem_direction: 1, duration: '4' }),\n ];\n const voice = factory.Voice().addTickables(notes);\n factory.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n factory.draw();\n drawTwoHairpins(ctx, notes);\n ok(true, 'Simple Test');\n };\n}\nconst simple = createTest((ctx, notes) => {\n drawHairpin(notes[0], notes[2], ctx, 1, 4);\n drawHairpin(notes[1], notes[3], ctx, 2, 3);\n});\nconst horizontal = createTest((ctx, notes) => {\n drawHairpin(notes[0], notes[2], ctx, 1, 3, {\n height: 10,\n // TODO: these three property names seem to be incorrect.\n // vo => should it be 'y_shift'?\n // left_ho => should it be 'left_shift_px'?\n // right_ho => should it be 'right_shift_px'?\n vo: 20,\n left_ho: 20,\n right_ho: -20, // right horizontal offset\n });\n drawHairpin(notes[3], notes[3], ctx, 2, 4, {\n height: 10,\n y_shift: 0,\n left_shift_px: 0,\n right_shift_px: 120, // right horizontal offset\n });\n});\nconst vertical = createTest((ctx, notes) => {\n drawHairpin(notes[0], notes[2], ctx, 1, 4, {\n height: 10,\n y_shift: 0,\n left_shift_px: 0,\n right_shift_px: 0, // right horizontal offset\n });\n drawHairpin(notes[2], notes[3], ctx, 2, 4, {\n height: 10,\n y_shift: -15,\n left_shift_px: 2,\n right_shift_px: 0, // right horizontal offset\n });\n});\nconst height = createTest((ctx, notes) => {\n drawHairpin(notes[0], notes[2], ctx, 1, 4, {\n height: 10,\n y_shift: 0,\n left_shift_px: 0,\n right_shift_px: 0, // right horizontal offset\n });\n drawHairpin(notes[2], notes[3], ctx, 2, 4, {\n height: 15,\n y_shift: 0,\n left_shift_px: 2,\n right_shift_px: 0, // right horizontal offset\n });\n});\nVexFlowTests.register(StaveHairpinTests);\nexport { StaveHairpinTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// StaveLine Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Dot } from '../src/dot';\nimport { Font, FontStyle } from '../src/font';\nconst StaveLineTests = {\n Start() {\n QUnit.module('StaveLine');\n const run = VexFlowTests.runTests;\n run('Simple StaveLine', simple0);\n run('StaveLine Arrow Options', simple1);\n },\n};\nfunction simple0(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave().addClef('treble');\n const notes = [\n f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'treble' }),\n f.StaveNote({ keys: ['c/5'], duration: '4', clef: 'treble' }),\n f.StaveNote({ keys: ['c/4', 'g/4', 'b/4'], duration: '4', clef: 'treble' }),\n f.StaveNote({ keys: ['f/4', 'a/4', 'f/5'], duration: '4', clef: 'treble' }),\n ];\n const voice = f.Voice().addTickables(notes);\n f.StaveLine({\n from: notes[0],\n to: notes[1],\n first_indices: [0],\n last_indices: [0],\n options: {\n font: { family: Font.SERIF, size: 12, style: FontStyle.ITALIC },\n text: 'gliss.',\n },\n });\n const staveLine2 = f.StaveLine({\n from: notes[2],\n to: notes[3],\n first_indices: [2, 1, 0],\n last_indices: [0, 1, 2],\n });\n staveLine2.render_options.line_dash = [10, 10];\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true);\n}\nfunction simple1(options) {\n const f = VexFlowTests.makeFactory(options, 770);\n const stave = f.Stave().addClef('treble');\n const notes = [\n f.StaveNote({ keys: ['c#/5', 'd/5'], duration: '4', clef: 'treble', stem_direction: -1 }),\n f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'treble' }).addModifier(f.Accidental({ type: '#' }), 0),\n f.StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: '4', clef: 'treble' }),\n f\n .StaveNote({ keys: ['f/4', 'a/4', 'c/5'], duration: '4', clef: 'treble' })\n .addModifier(f.Accidental({ type: '#' }), 2),\n f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'treble' }).addModifier(f.Accidental({ type: '#' }), 0),\n f.StaveNote({ keys: ['c#/5', 'd/5'], duration: '4', clef: 'treble', stem_direction: -1 }),\n f.StaveNote({ keys: ['c/4', 'd/4', 'g/4'], duration: '4', clef: 'treble' }),\n f\n .StaveNote({ keys: ['f/4', 'a/4', 'c/5'], duration: '4', clef: 'treble' })\n .addModifier(f.Accidental({ type: '#' }), 2),\n ];\n Dot.buildAndAttach([notes[0]], { all: true });\n const voice = f.Voice().setStrict(false).addTickables(notes);\n const staveLine0 = f.StaveLine({\n from: notes[0],\n to: notes[1],\n first_indices: [0],\n last_indices: [0],\n options: { text: 'Left' },\n });\n const staveLine4 = f.StaveLine({\n from: notes[2],\n to: notes[3],\n first_indices: [1],\n last_indices: [1],\n options: { text: 'Right' },\n });\n const staveLine1 = f.StaveLine({\n from: notes[4],\n to: notes[5],\n first_indices: [0],\n last_indices: [0],\n options: { text: 'Center' },\n });\n const staveLine2 = f.StaveLine({\n from: notes[6],\n to: notes[7],\n first_indices: [1],\n last_indices: [0],\n });\n const staveLine3 = f.StaveLine({\n from: notes[6],\n to: notes[7],\n first_indices: [2],\n last_indices: [2],\n options: { text: 'Top' },\n });\n staveLine0.render_options.draw_end_arrow = true;\n staveLine0.render_options.text_justification = 1;\n staveLine0.render_options.text_position_vertical = 2;\n staveLine1.render_options.draw_end_arrow = true;\n staveLine1.render_options.arrowhead_length = 30;\n staveLine1.render_options.line_width = 5;\n staveLine1.render_options.text_justification = 2;\n staveLine1.render_options.text_position_vertical = 2;\n staveLine4.render_options.line_width = 2;\n staveLine4.render_options.draw_end_arrow = true;\n staveLine4.render_options.draw_start_arrow = true;\n staveLine4.render_options.arrowhead_angle = 0.5;\n staveLine4.render_options.arrowhead_length = 20;\n staveLine4.render_options.text_justification = 3;\n staveLine4.render_options.text_position_vertical = 2;\n staveLine2.render_options.draw_start_arrow = true;\n staveLine2.render_options.line_dash = [5, 4];\n staveLine3.render_options.draw_end_arrow = true;\n staveLine3.render_options.draw_start_arrow = true;\n staveLine3.render_options.color = 'red';\n staveLine3.render_options.text_position_vertical = 1;\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true);\n}\nVexFlowTests.register(StaveLineTests);\nexport { StaveLineTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// StaveModifier Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Stave } from '../src/stave';\nimport { BarlineType } from '../src/stavebarline';\nimport { StaveModifierPosition } from '../src/stavemodifier';\nconst StaveModifierTests = {\n Start() {\n QUnit.module('StaveModifier');\n const run = VexFlowTests.runTests;\n run('Stave Draw Test', draw);\n run('Begin & End StaveModifier Test', drawBeginAndEnd);\n },\n};\nfunction draw(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 400, 120);\n const stave = new Stave(10, 10, 300);\n stave.setContext(ctx);\n stave.draw();\n equal(stave.getYForNote(0), 100, 'getYForNote(0)');\n equal(stave.getYForLine(5), 100, 'getYForLine(5)');\n equal(stave.getYForLine(0), 50, 'getYForLine(0) - Top Line');\n equal(stave.getYForLine(4), 90, 'getYForLine(4) - Bottom Line');\n ok(true, 'all pass');\n}\nfunction drawBeginAndEnd(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 500, 240);\n const stave = new Stave(10, 10, 400);\n stave.setContext(ctx);\n stave.setTimeSignature('C|');\n stave.setKeySignature('Db');\n stave.setClef('treble');\n stave.setBegBarType(BarlineType.REPEAT_BEGIN);\n stave.setEndClef('alto');\n stave.setEndTimeSignature('9/8');\n stave.setEndKeySignature('G', 'C#');\n stave.setEndBarType(BarlineType.DOUBLE);\n stave.draw();\n // change\n const END = StaveModifierPosition.END;\n stave.setY(100);\n stave.setTimeSignature('3/4');\n stave.setKeySignature('G', 'C#');\n stave.setClef('bass');\n stave.setBegBarType(BarlineType.SINGLE);\n stave.setClef('treble', undefined, undefined, END);\n stave.setTimeSignature('C', undefined, END);\n stave.setKeySignature('F', undefined, END);\n stave.setEndBarType(BarlineType.SINGLE);\n stave.draw();\n ok(true, 'all pass');\n}\nVexFlowTests.register(StaveModifierTests);\nexport { StaveModifierTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// StaveNote Tests\n// TODO: In StaveNote.preFormat() line 929, should noteHeadPadding default to StaveNote.minNoteheadPadding?\n// The bounding box of a note changes slightly when we add a ModifierContext (even if we add zero modifiers).\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Accidental } from '../src/accidental';\nimport { Annotation, AnnotationVerticalJustify } from '../src/annotation';\nimport { Articulation } from '../src/articulation';\nimport { Beam } from '../src/beam';\nimport { Dot } from '../src/dot';\nimport { Flow } from '../src/flow';\nimport { Formatter } from '../src/formatter';\nimport { Fraction } from '../src/fraction';\nimport { FretHandFinger } from '../src/frethandfinger';\nimport { Modifier } from '../src/modifier';\nimport { ModifierContext } from '../src/modifiercontext';\nimport { Stave } from '../src/stave';\nimport { StaveNote } from '../src/stavenote';\nimport { Stem } from '../src/stem';\nimport { StringNumber } from '../src/stringnumber';\nimport { Stroke } from '../src/strokes';\nimport { TickContext } from '../src/tickcontext';\nconst StaveNoteTests = {\n Start() {\n QUnit.module('StaveNote');\n test('Tick', ticks);\n test('Tick - New API', ticksNewAPI);\n test('Stem', stem);\n test('Automatic Stem Direction', autoStem);\n test('Stem Extension Pitch', stemExtensionPitch);\n test('Displacement after calling setStemDirection', setStemDirectionDisplacement);\n test('StaveLine', staveLine);\n test('Width', width);\n test('TickContext', tickContext);\n const run = VexFlowTests.runTests;\n run('StaveNote Draw - Treble', drawBasic, { clef: 'treble', octaveShift: 0, restKey: 'r/4' });\n run('StaveNote BoundingBoxes - Treble', drawBoundingBoxes, { clef: 'treble', octaveShift: 0, restKey: 'r/4' });\n run('StaveNote Draw - Alto', drawBasic, { clef: 'alto', octaveShift: -1, restKey: 'r/4' });\n run('StaveNote Draw - Tenor', drawBasic, { clef: 'tenor', octaveShift: -1, restKey: 'r/3' });\n run('StaveNote Draw - Bass', drawBasic, { clef: 'bass', octaveShift: -2, restKey: 'r/3' });\n run('StaveNote Draw - Harmonic And Muted', drawHarmonicAndMuted);\n run('StaveNote Draw - Slash', drawSlash);\n run('Displacements', displacements);\n run('StaveNote Draw - Bass 2', drawBass);\n run('StaveNote Draw - Key Styles', drawKeyStyles);\n run('StaveNote Draw - StaveNote Stem Styles', drawNoteStemStyles);\n run('StaveNote Draw - StaveNote Stem Lengths', drawNoteStemLengths);\n run('StaveNote Draw - StaveNote Flag Styles', drawNoteStylesWithFlag);\n run('StaveNote Draw - StaveNote Styles', drawNoteStyles);\n run('Stave, Ledger Line, Beam, Stem and Flag Styles', drawBeamStyles);\n run('Flag and Dot Placement - Stem Up', dotsAndFlagsStemUp);\n run('Flag and Dots Placement - Stem Down', dotsAndFlagsStemDown);\n run('Beam and Dot Placement - Stem Up', dotsAndBeamsUp);\n run('Beam and Dot Placement - Stem Down', dotsAndBeamsDown);\n run('Center Aligned Note', centerAlignedRest);\n run('Center Aligned Note with Articulation', centerAlignedRestFermata);\n run('Center Aligned Note with Annotation', centerAlignedRestAnnotation);\n run('Center Aligned Note - Multi Voice', centerAlignedMultiVoice);\n run('Center Aligned Note with Multiple Modifiers', centerAlignedNoteMultiModifiers);\n // This interactivity test currently only works with the SVG backend.\n VexFlowTests.runSVGTest('Interactive Mouseover StaveNote', drawBasic, {\n clef: 'treble',\n octaveShift: 0,\n restKey: 'r/4',\n ui: true,\n });\n },\n};\n// Helper function to create StaveNotes.\nconst staveNote = (struct) => new StaveNote(struct);\n/**\n * Helper function to draw a note with an optional bounding box.\n */\nfunction draw(note, stave, context, x, drawBoundingBox = false, addModifierContext = true) {\n // Associate the note with the stave.\n note.setStave(stave);\n // A ModifierContext is required for dots and other modifiers to be drawn properly.\n // If added, it changes the bounding box of a note, even if there are no modifiers to draw.\n // See StaveNote.minNoteheadPadding in stavenote.ts.\n if (addModifierContext) {\n note.addToModifierContext(new ModifierContext());\n }\n new TickContext().addTickable(note).preFormat().setX(x);\n note.setContext(context).draw();\n if (drawBoundingBox) {\n const bb = note.getBoundingBox();\n context.rect(bb.getX(), bb.getY(), bb.getW(), bb.getH());\n context.stroke();\n }\n return note;\n}\nfunction ticks() {\n const BEAT = (1 * Flow.RESOLUTION) / 4;\n // Key value pairs of `testName: [durationString, expectedBeats, expectedNoteType]`\n const tickTests = {\n 'Breve note': ['1/2', 8.0, 'n'],\n 'Whole note': ['w', 4.0, 'n'],\n 'Quarter note': ['q', 1.0, 'n'],\n 'Dotted half note': ['hd', 3.0, 'n'],\n 'Doubled-dotted half note': ['hdd', 3.5, 'n'],\n 'Triple-dotted half note': ['hddd', 3.75, 'n'],\n 'Dotted half rest': ['hdr', 3.0, 'r'],\n 'Double-dotted half rest': ['hddr', 3.5, 'r'],\n 'Triple-dotted half rest': ['hdddr', 3.75, 'r'],\n 'Dotted harmonic quarter note': ['qdh', 1.5, 'h'],\n 'Double-dotted harmonic quarter note': ['qddh', 1.75, 'h'],\n 'Triple-dotted harmonic quarter note': ['qdddh', 1.875, 'h'],\n 'Dotted muted 8th note': ['8dm', 0.75, 'm'],\n 'Double-dotted muted 8th note': ['8ddm', 0.875, 'm'],\n 'Triple-dotted muted 8th note': ['8dddm', 0.9375, 'm'],\n };\n Object.keys(tickTests).forEach((testName) => {\n const testData = tickTests[testName];\n const durationString = testData[0];\n const expectedBeats = testData[1];\n const expectedNoteType = testData[2];\n const note = new StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: durationString });\n equal(note.getTicks().value(), BEAT * expectedBeats, testName + ' must have ' + expectedBeats + ' beats');\n equal(note.getNoteType(), expectedNoteType, 'Note type must be ' + expectedNoteType);\n });\n throws(() => new StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: '8.7dddm' }), /BadArguments/, \"Invalid note duration '8.7' throws BadArguments exception\");\n throws(() => new StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: '2Z' }), /BadArguments/, \"Invalid note type 'Z' throws BadArguments exception\");\n throws(() => new StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: '2dddZ' }), /BadArguments/, \"Invalid note type 'Z' throws BadArguments exception\");\n}\nfunction ticksNewAPI() {\n const BEAT = (1 * Flow.RESOLUTION) / 4;\n // Key value pairs of `testName: [noteData, expectedBeats, expectedNoteType]`\n const tickTests = {\n 'Breve note': [{ duration: '1/2' }, 8.0, 'n'],\n 'Whole note': [{ duration: 'w' }, 4.0, 'n'],\n 'Quarter note': [{ duration: 'q' }, 1.0, 'n'],\n 'Dotted half note': [{ duration: 'h', dots: 1 }, 3.0, 'n'],\n 'Doubled-dotted half note': [{ duration: 'h', dots: 2 }, 3.5, 'n'],\n 'Triple-dotted half note': [{ duration: 'h', dots: 3 }, 3.75, 'n'],\n 'Dotted half rest': [{ duration: 'h', dots: 1, type: 'r' }, 3.0, 'r'],\n 'Double-dotted half rest': [{ duration: 'h', dots: 2, type: 'r' }, 3.5, 'r'],\n 'Triple-dotted half rest': [{ duration: 'h', dots: 3, type: 'r' }, 3.75, 'r'],\n 'Dotted harmonic quarter note': [{ duration: 'q', dots: 1, type: 'h' }, 1.5, 'h'],\n 'Double-dotted harmonic quarter note': [{ duration: 'q', dots: 2, type: 'h' }, 1.75, 'h'],\n 'Triple-dotted harmonic quarter note': [{ duration: 'q', dots: 3, type: 'h' }, 1.875, 'h'],\n 'Dotted muted 8th note': [{ duration: '8', dots: 1, type: 'm' }, 0.75, 'm'],\n 'Double-dotted muted 8th note': [{ duration: '8', dots: 2, type: 'm' }, 0.875, 'm'],\n 'Triple-dotted muted 8th note': [{ duration: '8', dots: 3, type: 'm' }, 0.9375, 'm'],\n };\n Object.keys(tickTests).forEach(function (testName) {\n const testData = tickTests[testName];\n const noteData = testData[0];\n const expectedBeats = testData[1];\n const expectedNoteType = testData[2];\n noteData.keys = ['c/4', 'e/4', 'g/4'];\n const note = new StaveNote(noteData);\n equal(note.getTicks().value(), BEAT * expectedBeats, testName + ' must have ' + expectedBeats + ' beats');\n equal(note.getNoteType(), expectedNoteType, 'Note type must be ' + expectedNoteType);\n });\n throws(() => new StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: '8.7dddm' }), /BadArguments/, \"Invalid note duration '8.7' throws BadArguments exception\");\n throws(() => new StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: '2Z' }), /BadArguments/, \"Invalid note type 'Z' throws BadArguments exception\");\n throws(() => new StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: '2dddZ' }), /BadArguments/, \"Invalid note type 'Z' throws BadArguments exception\");\n}\nfunction stem() {\n const note = new StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: 'w' });\n equal(note.getStemDirection(), Stem.UP, 'Default note has UP stem');\n}\nfunction autoStem() {\n const testData = [\n [['c/5', 'e/5', 'g/5'], Stem.DOWN],\n [['e/4', 'g/4', 'c/5'], Stem.UP],\n [['c/5'], Stem.DOWN],\n [['a/4', 'e/5', 'g/5'], Stem.DOWN],\n [['b/4'], Stem.DOWN],\n ];\n testData.forEach((td) => {\n const keys = td[0];\n const expectedStemDirection = td[1];\n const note = new StaveNote({ keys: keys, auto_stem: true, duration: '8' });\n equal(note.getStemDirection(), expectedStemDirection, 'Stem must be ' + (expectedStemDirection === Stem.UP ? 'up' : 'down'));\n });\n}\nfunction stemExtensionPitch() {\n // [keys, expectedStemExtension, override stem direction]\n const testData = [\n [['c/5', 'e/5', 'g/5'], 0, 0],\n [['e/4', 'g/4', 'c/5'], 0, 0],\n [['c/5'], 0, 0],\n [['f/3'], 15, 0],\n [['f/3'], 15, Stem.UP],\n [['f/3'], 0, Stem.DOWN],\n [['f/3', 'e/5'], 0, 0],\n [['g/6'], 25, 0],\n [['g/6'], 25, Stem.DOWN],\n [['g/6'], 0, Stem.UP],\n ];\n testData.forEach((td) => {\n const keys = td[0];\n const expectedStemExtension = td[1];\n const overrideStemDirection = td[2];\n let note;\n if (overrideStemDirection === 0) {\n note = new StaveNote({ keys: keys, auto_stem: true, duration: '4' });\n }\n else {\n note = new StaveNote({ keys: keys, duration: '4', stem_direction: overrideStemDirection });\n }\n equal(note.getStemExtension(), expectedStemExtension, 'For ' + keys.toString() + ' StemExtension must be ' + expectedStemExtension);\n // set to weird Stave\n const stave = new Stave(10, 10, 300, { spacing_between_lines_px: 20 });\n note.setStave(stave);\n equal(note.getStemExtension(), expectedStemExtension * 2, 'For wide staff ' + keys.toString() + ' StemExtension must be ' + expectedStemExtension * 2);\n // const whole_note = new StaveNote({ keys: keys, duration: 'w' });\n // equal(\n // whole_note.getStemExtension(),\n // -1 * Flow.STEM_HEIGHT,\n // 'For ' + keys.toString() + ' whole_note StemExtension must always be -1 * Flow.STEM_HEIGHT'\n // );\n });\n}\nfunction setStemDirectionDisplacement() {\n function getDisplacements(note) {\n return note.noteHeads.map((noteHead) => noteHead.isDisplaced());\n }\n const stemUpDisplacements = [false, true, false];\n const stemDownDisplacements = [true, false, false];\n const note = new StaveNote({ keys: ['c/5', 'd/5', 'g/5'], stem_direction: Stem.UP, duration: '4' });\n deepEqual(getDisplacements(note), stemUpDisplacements);\n note.setStemDirection(Stem.DOWN);\n deepEqual(getDisplacements(note), stemDownDisplacements);\n note.setStemDirection(Stem.UP);\n deepEqual(getDisplacements(note), stemUpDisplacements);\n}\nfunction staveLine() {\n const stave = new Stave(10, 10, 300);\n const note = new StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: 'w' });\n note.setStave(stave);\n const props = note.getKeyProps();\n equal(props[0].line, 0, 'C/4 on line 0');\n equal(props[1].line, 1, 'E/4 on line 1');\n equal(props[2].line, 2.5, 'A/4 on line 2.5');\n const ys = note.getYs();\n equal(ys.length, 3, 'Chord should be rendered on three lines');\n equal(ys[0], 100, 'Line for C/4');\n equal(ys[1], 90, 'Line for E/4');\n equal(ys[2], 75, 'Line for A/4');\n}\nfunction width() {\n const note = new StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: 'w' });\n throws(() => note.getWidth(), /UnformattedNote/, 'Unformatted note should have no width');\n}\nfunction tickContext() {\n const stave = new Stave(10, 10, 400);\n const note = new StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: 'w' }).setStave(stave);\n new TickContext().addTickable(note).preFormat().setX(10).setPadding(0);\n expect(0);\n}\nfunction drawBasic(options, contextBuilder) {\n const clef = options.params.clef;\n const octaveShift = options.params.octaveShift;\n const restKey = options.params.restKey;\n const ctx = contextBuilder(options.elementId, 700, 180);\n const stave = new Stave(10, 30, 750);\n stave.setContext(ctx);\n stave.addClef(clef);\n stave.draw();\n const lowerKeys = ['c/', 'e/', 'a/'];\n const higherKeys = ['c/', 'e/', 'a/'];\n for (let k = 0; k < lowerKeys.length; k++) {\n lowerKeys[k] = lowerKeys[k] + (4 + octaveShift);\n higherKeys[k] = higherKeys[k] + (5 + octaveShift);\n }\n const restKeys = [restKey];\n const noteStructs = [\n { clef: clef, keys: higherKeys, duration: '1/2' },\n { clef: clef, keys: lowerKeys, duration: 'w' },\n { clef: clef, keys: higherKeys, duration: 'h' },\n { clef: clef, keys: lowerKeys, duration: 'q' },\n { clef: clef, keys: higherKeys, duration: '8' },\n { clef: clef, keys: lowerKeys, duration: '16' },\n { clef: clef, keys: higherKeys, duration: '32' },\n { clef: clef, keys: higherKeys, duration: '64' },\n { clef: clef, keys: higherKeys, duration: '128' },\n { clef: clef, keys: lowerKeys, duration: '1/2', stem_direction: Stem.DOWN },\n { clef: clef, keys: lowerKeys, duration: 'w', stem_direction: Stem.DOWN },\n { clef: clef, keys: lowerKeys, duration: 'h', stem_direction: Stem.DOWN },\n { clef: clef, keys: lowerKeys, duration: 'q', stem_direction: Stem.DOWN },\n { clef: clef, keys: lowerKeys, duration: '8', stem_direction: Stem.DOWN },\n { clef: clef, keys: lowerKeys, duration: '16', stem_direction: Stem.DOWN },\n { clef: clef, keys: lowerKeys, duration: '32', stem_direction: Stem.DOWN },\n { clef: clef, keys: lowerKeys, duration: '64', stem_direction: Stem.DOWN },\n { clef: clef, keys: lowerKeys, duration: '128', stem_direction: Stem.DOWN },\n { clef: clef, keys: restKeys, duration: '1/2r' },\n { clef: clef, keys: restKeys, duration: 'wr' },\n { clef: clef, keys: restKeys, duration: 'hr' },\n { clef: clef, keys: restKeys, duration: 'qr' },\n { clef: clef, keys: restKeys, duration: '8r' },\n { clef: clef, keys: restKeys, duration: '16r' },\n { clef: clef, keys: restKeys, duration: '32r' },\n { clef: clef, keys: restKeys, duration: '64r' },\n { clef: clef, keys: restKeys, duration: '128r' },\n { keys: ['x/4'], duration: 'h' },\n ];\n expect(noteStructs.length * 2);\n const colorDescendants = (parentItem, color) => () => parentItem.querySelectorAll('*').forEach((child) => {\n child.setAttribute('fill', color);\n child.setAttribute('stroke', color);\n });\n for (let i = 0; i < noteStructs.length; ++i) {\n const note = draw(staveNote(noteStructs[i]), stave, ctx, (i + 1) * 25);\n // If this is an interactivity test (ui: true), then attach mouseover & mouseout handlers to the notes.\n if (options.params.ui) {\n const item = note.getAttribute('el');\n item.addEventListener('mouseover', colorDescendants(item, 'green'), false);\n item.addEventListener('mouseout', colorDescendants(item, 'black'), false);\n }\n ok(note.getX() > 0, 'Note ' + i + ' has X value');\n ok(note.getYs().length > 0, 'Note ' + i + ' has Y values');\n }\n}\nfunction drawBoundingBoxes(options, contextBuilder) {\n const clef = options.params.clef;\n const octaveShift = options.params.octaveShift;\n const restKey = options.params.restKey;\n const ctx = contextBuilder(options.elementId, 700, 180);\n const stave = new Stave(10, 30, 750);\n stave.setContext(ctx);\n stave.addClef(clef);\n stave.draw();\n const lowerKeys = ['c/', 'e/', 'a/'];\n const higherKeys = ['c/', 'e/', 'a/'];\n for (let k = 0; k < lowerKeys.length; k++) {\n lowerKeys[k] = lowerKeys[k] + (4 + octaveShift);\n higherKeys[k] = higherKeys[k] + (5 + octaveShift);\n }\n const restKeys = [restKey];\n const noteStructs = [\n { clef: clef, keys: higherKeys, duration: '1/2' },\n { clef: clef, keys: lowerKeys, duration: 'w' },\n { clef: clef, keys: higherKeys, duration: 'h' },\n { clef: clef, keys: lowerKeys, duration: 'q' },\n { clef: clef, keys: higherKeys, duration: '8' },\n { clef: clef, keys: lowerKeys, duration: '16' },\n { clef: clef, keys: higherKeys, duration: '32' },\n { clef: clef, keys: higherKeys, duration: '64' },\n { clef: clef, keys: higherKeys, duration: '128' },\n { clef: clef, keys: lowerKeys, duration: '1/2', stem_direction: Stem.DOWN },\n { clef: clef, keys: lowerKeys, duration: 'w', stem_direction: Stem.DOWN },\n { clef: clef, keys: lowerKeys, duration: 'h', stem_direction: Stem.DOWN },\n { clef: clef, keys: lowerKeys, duration: 'q', stem_direction: Stem.DOWN },\n { clef: clef, keys: lowerKeys, duration: '8', stem_direction: Stem.DOWN },\n { clef: clef, keys: lowerKeys, duration: '16', stem_direction: Stem.DOWN },\n { clef: clef, keys: lowerKeys, duration: '32', stem_direction: Stem.DOWN },\n { clef: clef, keys: lowerKeys, duration: '64', stem_direction: Stem.DOWN },\n { clef: clef, keys: lowerKeys, duration: '128' },\n { clef: clef, keys: restKeys, duration: '1/2r' },\n { clef: clef, keys: restKeys, duration: 'wr' },\n { clef: clef, keys: restKeys, duration: 'hr' },\n { clef: clef, keys: restKeys, duration: 'qr' },\n { clef: clef, keys: restKeys, duration: '8r' },\n { clef: clef, keys: restKeys, duration: '16r' },\n { clef: clef, keys: restKeys, duration: '32r' },\n { clef: clef, keys: restKeys, duration: '64r' },\n { clef: clef, keys: restKeys, duration: '128r' },\n { keys: ['x/4'], duration: 'h' },\n ];\n expect(noteStructs.length * 2);\n for (let i = 0; i < noteStructs.length; ++i) {\n const note = draw(staveNote(noteStructs[i]), stave, ctx, (i + 1) * 25, true /* drawBoundingBox */, false /* addModifierContext */);\n ok(note.getX() > 0, 'Note ' + i + ' has X value');\n ok(note.getYs().length > 0, 'Note ' + i + ' has Y values');\n }\n}\nfunction drawBass(options, contextBuilder) {\n expect(40);\n const ctx = contextBuilder(options.elementId, 600, 280);\n const stave = new Stave(10, 10, 650);\n stave.setContext(ctx);\n stave.addClef('bass');\n stave.draw();\n const noteStructs = [\n { clef: 'bass', keys: ['c/3', 'e/3', 'a/3'], duration: '1/2' },\n { clef: 'bass', keys: ['c/2', 'e/2', 'a/2'], duration: 'w' },\n { clef: 'bass', keys: ['c/3', 'e/3', 'a/3'], duration: 'h' },\n { clef: 'bass', keys: ['c/2', 'e/2', 'a/2'], duration: 'q' },\n { clef: 'bass', keys: ['c/3', 'e/3', 'a/3'], duration: '8' },\n { clef: 'bass', keys: ['c/2', 'e/2', 'a/2'], duration: '16' },\n { clef: 'bass', keys: ['c/3', 'e/3', 'a/3'], duration: '32' },\n { clef: 'bass', keys: ['c/2', 'e/2', 'a/2'], duration: 'h', stem_direction: Stem.DOWN },\n { clef: 'bass', keys: ['c/2', 'e/2', 'a/2'], duration: 'q', stem_direction: Stem.DOWN },\n { clef: 'bass', keys: ['c/2', 'e/2', 'a/2'], duration: '8', stem_direction: Stem.DOWN },\n { clef: 'bass', keys: ['c/2', 'e/2', 'a/2'], duration: '16', stem_direction: Stem.DOWN },\n { clef: 'bass', keys: ['c/2', 'e/2', 'a/2'], duration: '32', stem_direction: Stem.DOWN },\n { keys: ['r/4'], duration: '1/2r' },\n { keys: ['r/4'], duration: 'wr' },\n { keys: ['r/4'], duration: 'hr' },\n { keys: ['r/4'], duration: 'qr' },\n { keys: ['r/4'], duration: '8r' },\n { keys: ['r/4'], duration: '16r' },\n { keys: ['r/4'], duration: '32r' },\n { keys: ['x/4'], duration: 'h' },\n ];\n for (let i = 0; i < noteStructs.length; ++i) {\n const note = draw(staveNote(noteStructs[i]), stave, ctx, (i + 1) * 25);\n ok(note.getX() > 0, 'Note ' + i + ' has X value');\n ok(note.getYs().length > 0, 'Note ' + i + ' has Y values');\n }\n}\nfunction displacements(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 700, 155);\n ctx.scale(0.9, 0.9);\n ctx.fillStyle = '#221';\n ctx.strokeStyle = '#221';\n const stave = new Stave(10, 10, 675);\n stave.setContext(ctx);\n stave.draw();\n const noteStructs = [\n { keys: ['g/3', 'a/3', 'c/4', 'd/4', 'e/4'], duration: '1/2' },\n { keys: ['g/3', 'a/3', 'c/4', 'd/4', 'e/4'], duration: 'w' },\n { keys: ['d/4', 'e/4', 'f/4'], duration: 'h' },\n { keys: ['f/4', 'g/4', 'a/4', 'b/4'], duration: 'q' },\n { keys: ['e/3', 'b/3', 'c/4', 'e/4', 'f/4', 'g/5', 'a/5'], duration: '8' },\n { keys: ['a/3', 'c/4', 'e/4', 'g/4', 'a/4', 'b/4'], duration: '16' },\n { keys: ['c/4', 'e/4', 'a/4'], duration: '32' },\n { keys: ['c/4', 'e/4', 'a/4', 'a/4'], duration: '64' },\n { keys: ['g/3', 'c/4', 'd/4', 'e/4'], duration: 'h', stem_direction: Stem.DOWN },\n { keys: ['d/4', 'e/4', 'f/4'], duration: 'q', stem_direction: Stem.DOWN },\n { keys: ['f/4', 'g/4', 'a/4', 'b/4'], duration: '8', stem_direction: Stem.DOWN },\n { keys: ['c/4', 'd/4', 'e/4', 'f/4', 'g/4', 'a/4'], duration: '16', stem_direction: Stem.DOWN },\n { keys: ['b/3', 'c/4', 'e/4', 'a/4', 'b/5', 'c/6', 'e/6'], duration: '32', stem_direction: Stem.DOWN },\n {\n keys: ['b/3', 'c/4', 'e/4', 'a/4', 'b/5', 'c/6', 'e/6', 'e/6'],\n duration: '64',\n stem_direction: Stem.DOWN,\n },\n ];\n expect(noteStructs.length * 2);\n for (let i = 0; i < noteStructs.length; ++i) {\n const note = draw(staveNote(noteStructs[i]), stave, ctx, (i + 1) * 45);\n ok(note.getX() > 0, 'Note ' + i + ' has X value');\n ok(note.getYs().length > 0, 'Note ' + i + ' has Y values');\n }\n}\nfunction drawHarmonicAndMuted(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 1000, 180);\n const stave = new Stave(10, 10, 950);\n stave.setContext(ctx);\n stave.draw();\n const noteStructs = [\n { keys: ['c/4', 'e/4', 'a/4'], duration: '1/2h' },\n { keys: ['c/4', 'e/4', 'a/4'], duration: 'wh' },\n { keys: ['c/4', 'e/4', 'a/4'], duration: 'hh' },\n { keys: ['c/4', 'e/4', 'a/4'], duration: 'qh' },\n { keys: ['c/4', 'e/4', 'a/4'], duration: '8h' },\n { keys: ['c/4', 'e/4', 'a/4'], duration: '16h' },\n { keys: ['c/4', 'e/4', 'a/4'], duration: '32h' },\n { keys: ['c/4', 'e/4', 'a/4'], duration: '64h' },\n { keys: ['c/4', 'e/4', 'a/4'], duration: '128h' },\n { keys: ['c/4', 'e/4', 'a/4'], duration: '1/2h', stem_direction: Stem.DOWN },\n { keys: ['c/4', 'e/4', 'a/4'], duration: 'wh', stem_direction: Stem.DOWN },\n { keys: ['c/4', 'e/4', 'a/4'], duration: 'hh', stem_direction: Stem.DOWN },\n { keys: ['c/4', 'e/4', 'a/4'], duration: 'qh', stem_direction: Stem.DOWN },\n { keys: ['c/4', 'e/4', 'a/4'], duration: '8h', stem_direction: Stem.DOWN },\n { keys: ['c/4', 'e/4', 'a/4'], duration: '16h', stem_direction: Stem.DOWN },\n { keys: ['c/4', 'e/4', 'a/4'], duration: '32h', stem_direction: Stem.DOWN },\n { keys: ['c/4', 'e/4', 'a/4'], duration: '64h', stem_direction: Stem.DOWN },\n { keys: ['c/4', 'e/4', 'a/4'], duration: '128h', stem_direction: Stem.DOWN },\n { keys: ['c/4', 'e/4', 'a/4'], duration: '1/2m' },\n { keys: ['c/4', 'e/4', 'a/4'], duration: 'wm' },\n { keys: ['c/4', 'e/4', 'a/4'], duration: 'hm' },\n { keys: ['c/4', 'e/4', 'a/4'], duration: 'qm' },\n { keys: ['c/4', 'e/4', 'a/4'], duration: '8m' },\n { keys: ['c/4', 'e/4', 'a/4'], duration: '16m' },\n { keys: ['c/4', 'e/4', 'a/4'], duration: '32m' },\n { keys: ['c/4', 'e/4', 'a/4'], duration: '64m' },\n { keys: ['c/4', 'e/4', 'a/4'], duration: '128m' },\n { keys: ['c/4', 'e/4', 'a/4'], duration: '1/2m', stem_direction: Stem.DOWN },\n { keys: ['c/4', 'e/4', 'a/4'], duration: 'wm', stem_direction: Stem.DOWN },\n { keys: ['c/4', 'e/4', 'a/4'], duration: 'hm', stem_direction: Stem.DOWN },\n { keys: ['c/4', 'e/4', 'a/4'], duration: 'qm', stem_direction: Stem.DOWN },\n { keys: ['c/4', 'e/4', 'a/4'], duration: '8m', stem_direction: Stem.DOWN },\n { keys: ['c/4', 'e/4', 'a/4'], duration: '16m', stem_direction: Stem.DOWN },\n { keys: ['c/4', 'e/4', 'a/4'], duration: '32m', stem_direction: Stem.DOWN },\n { keys: ['c/4', 'e/4', 'a/4'], duration: '64m', stem_direction: Stem.DOWN },\n { keys: ['c/4', 'e/4', 'a/4'], duration: '128m', stem_direction: Stem.DOWN },\n ];\n expect(noteStructs.length * 2);\n for (let i = 0; i < noteStructs.length; ++i) {\n const note = draw(staveNote(noteStructs[i]), stave, ctx, i * 25 + 5);\n ok(note.getX() > 0, 'Note ' + i + ' has X value');\n ok(note.getYs().length > 0, 'Note ' + i + ' has Y values');\n }\n}\nfunction drawSlash(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 700, 180);\n const stave = new Stave(10, 10, 650);\n stave.setContext(ctx);\n stave.draw();\n const notes = [\n { keys: ['b/4'], duration: '1/2s', stem_direction: Stem.DOWN },\n { keys: ['b/4'], duration: 'ws', stem_direction: Stem.DOWN },\n { keys: ['b/4'], duration: 'hs', stem_direction: Stem.DOWN },\n { keys: ['b/4'], duration: 'qs', stem_direction: Stem.DOWN },\n { keys: ['b/4'], duration: '8s', stem_direction: Stem.DOWN },\n { keys: ['b/4'], duration: '16s', stem_direction: Stem.DOWN },\n { keys: ['b/4'], duration: '32s', stem_direction: Stem.DOWN },\n { keys: ['b/4'], duration: '64s', stem_direction: Stem.DOWN },\n { keys: ['b/4'], duration: '128s', stem_direction: Stem.DOWN },\n { keys: ['b/4'], duration: '1/2s', stem_direction: Stem.UP },\n { keys: ['b/4'], duration: 'ws', stem_direction: Stem.UP },\n { keys: ['b/4'], duration: 'hs', stem_direction: Stem.UP },\n { keys: ['b/4'], duration: 'qs', stem_direction: Stem.UP },\n { keys: ['b/4'], duration: '8s', stem_direction: Stem.UP },\n { keys: ['b/4'], duration: '16s', stem_direction: Stem.UP },\n { keys: ['b/4'], duration: '32s', stem_direction: Stem.UP },\n { keys: ['b/4'], duration: '64s', stem_direction: Stem.UP },\n { keys: ['b/4'], duration: '128s', stem_direction: Stem.UP },\n // Beam\n { keys: ['b/4'], duration: '8s', stem_direction: Stem.DOWN },\n { keys: ['b/4'], duration: '8s', stem_direction: Stem.DOWN },\n { keys: ['b/4'], duration: '8s', stem_direction: Stem.UP },\n { keys: ['b/4'], duration: '8s', stem_direction: Stem.UP },\n ];\n const stave_notes = notes.map((struct) => new StaveNote(struct));\n const beam1 = new Beam([stave_notes[16], stave_notes[17]]);\n const beam2 = new Beam([stave_notes[18], stave_notes[19]]);\n Formatter.FormatAndDraw(ctx, stave, stave_notes, false);\n beam1.setContext(ctx).draw();\n beam2.setContext(ctx).draw();\n ok('Slash Note Heads');\n}\nfunction drawKeyStyles(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 300, 280);\n ctx.scale(3, 3);\n const stave = new Stave(10, 0, 100);\n const note = new StaveNote({ keys: ['g/4', 'bb/4', 'd/5'], duration: 'q' })\n .setStave(stave)\n .addModifier(new Accidental('b'), 1)\n .setKeyStyle(1, { shadowBlur: 2, shadowColor: 'blue', fillStyle: 'blue' });\n new TickContext().addTickable(note).preFormat().setX(25);\n stave.setContext(ctx).draw();\n note.setContext(ctx).draw();\n ok(note.getX() > 0, 'Note has X value');\n ok(note.getYs().length > 0, 'Note has Y values');\n}\nfunction drawNoteStyles(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 300, 280);\n const stave = new Stave(10, 0, 100);\n ctx.scale(3, 3);\n const note = new StaveNote({ keys: ['g/4', 'bb/4', 'd/5'], duration: '8' })\n .setStave(stave)\n .addModifier(new Accidental('b'), 1);\n note.setStyle({ shadowBlur: 2, shadowColor: 'blue', fillStyle: 'blue', strokeStyle: 'blue' });\n new TickContext().addTickable(note).preFormat().setX(25);\n stave.setContext(ctx).draw();\n note.setContext(ctx).draw();\n ok(note.getX() > 0, 'Note has X value');\n ok(note.getYs().length > 0, 'Note has Y values');\n}\nfunction drawNoteStemStyles(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 300, 280);\n const stave = new Stave(10, 0, 100);\n ctx.scale(3, 3);\n const note = new StaveNote({ keys: ['g/4', 'bb/4', 'd/5'], duration: 'q' })\n .setStave(stave)\n .addModifier(new Accidental('b'), 1);\n note.setStemStyle({ shadowBlur: 2, shadowColor: 'blue', fillStyle: 'blue', strokeStyle: 'blue' });\n new TickContext().addTickable(note).preFormat().setX(25);\n stave.setContext(ctx).draw();\n note.setContext(ctx).draw();\n ok('Note Stem Style');\n}\nfunction drawNoteStemLengths(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 975, 150);\n const stave = new Stave(10, 10, 975);\n stave.setContext(ctx).draw();\n const keys = [\n 'e/3',\n 'f/3',\n 'g/3',\n 'a/3',\n 'b/3',\n 'c/4',\n 'd/4',\n 'e/4',\n 'f/4',\n 'g/4',\n 'f/5',\n 'g/5',\n 'a/5',\n 'b/5',\n 'c/6',\n 'd/6',\n 'e/6',\n 'f/6',\n 'g/6',\n 'a/6',\n ];\n const notes = [];\n let note;\n let i;\n for (i = 0; i < keys.length; i++) {\n let duration = 'q';\n if (i % 2 === 1) {\n duration = '8';\n }\n note = new StaveNote({ keys: [keys[i]], duration, auto_stem: true }).setStave(stave);\n new TickContext().addTickable(note);\n note.setContext(ctx);\n notes.push(note);\n }\n const whole_keys = ['e/3', 'a/3', 'f/5', 'a/5', 'd/6', 'a/6'];\n for (i = 0; i < whole_keys.length; i++) {\n note = new StaveNote({ keys: [whole_keys[i]], duration: 'w' }).setStave(stave);\n new TickContext().addTickable(note);\n note.setContext(ctx);\n notes.push(note);\n }\n Formatter.FormatAndDraw(ctx, stave, notes);\n ok('Note Stem Length');\n}\nfunction drawNoteStylesWithFlag(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 300, 280);\n const stave = new Stave(10, 0, 100);\n ctx.scale(3, 3);\n const note = new StaveNote({ keys: ['g/4', 'bb/4', 'd/5'], duration: '8' })\n .setStave(stave)\n .addModifier(new Accidental('b'), 1);\n note.setFlagStyle({ shadowBlur: 2, shadowColor: 'blue', fillStyle: 'blue', strokeStyle: 'blue' });\n new TickContext().addTickable(note).preFormat().setX(25);\n stave.setContext(ctx).draw();\n note.setContext(ctx).draw();\n ok(note.getX() > 0, 'Note has X value');\n ok(note.getYs().length > 0, 'Note has Y values');\n}\nfunction drawBeamStyles(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 400, 160);\n const stave = new Stave(10, 10, 380);\n stave.setStyle({ strokeStyle: '#EEAAEE', lineWidth: 3 });\n stave.setContext(ctx);\n stave.draw();\n const notes = [\n // beam1\n { keys: ['b/4'], duration: '8', stem_direction: Stem.DOWN },\n { keys: ['b/4'], duration: '8', stem_direction: Stem.DOWN },\n // should be unstyled...\n { keys: ['b/4'], duration: '8', stem_direction: Stem.DOWN },\n // beam2 should also be unstyled\n { keys: ['b/4'], duration: '8', stem_direction: Stem.DOWN },\n { keys: ['b/4'], duration: '8', stem_direction: Stem.DOWN },\n // beam3\n { keys: ['b/4'], duration: '8', stem_direction: Stem.UP },\n { keys: ['b/4'], duration: '8', stem_direction: Stem.UP },\n // beam4\n { keys: ['d/6'], duration: '8', stem_direction: Stem.DOWN },\n { keys: ['c/6', 'd/6'], duration: '8', stem_direction: Stem.DOWN },\n // unbeamed\n { keys: ['d/6', 'e/6'], duration: '8', stem_direction: Stem.DOWN },\n // unbeamed, unstyled\n { keys: ['e/6', 'f/6'], duration: '8', stem_direction: Stem.DOWN },\n ];\n const staveNotes = notes.map((note) => new StaveNote(note));\n const beam1 = new Beam(staveNotes.slice(0, 2));\n const beam2 = new Beam(staveNotes.slice(3, 5));\n const beam3 = new Beam(staveNotes.slice(5, 7));\n const beam4 = new Beam(staveNotes.slice(7, 9));\n // stem, key, ledger, flag; beam.setStyle\n beam1.setStyle({ fillStyle: 'blue', strokeStyle: 'blue' });\n staveNotes[0].setKeyStyle(0, { fillStyle: 'purple' });\n staveNotes[0].setStemStyle({ strokeStyle: 'green' });\n staveNotes[1].setStemStyle({ strokeStyle: 'orange' });\n staveNotes[1].setKeyStyle(0, { fillStyle: 'darkturquoise' });\n staveNotes[5].setStyle({ fillStyle: 'tomato', strokeStyle: 'tomato' });\n beam3.setStyle({ shadowBlur: 4, shadowColor: 'blue' });\n staveNotes[9].setLedgerLineStyle({ fillStyle: 'lawngreen', strokeStyle: 'lawngreen', lineWidth: 1 });\n staveNotes[9].setFlagStyle({ fillStyle: 'orange', strokeStyle: 'orange' });\n Formatter.FormatAndDraw(ctx, stave, staveNotes, false);\n beam1.setContext(ctx).draw();\n beam2.setContext(ctx).draw();\n beam3.setContext(ctx).draw();\n beam4.setContext(ctx).draw();\n ok('draw beam styles');\n}\nfunction dotsAndFlagsStemUp(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 800, 150);\n ctx.scale(1.0, 1.0);\n ctx.setFillStyle('#221');\n ctx.setStrokeStyle('#221');\n const stave = new Stave(10, 10, 975);\n const notes = [\n staveNote({ keys: ['f/4'], duration: '4', stem_direction: Stem.UP }),\n staveNote({ keys: ['f/4'], duration: '8', stem_direction: Stem.UP }),\n staveNote({ keys: ['f/4'], duration: '16', stem_direction: Stem.UP }),\n staveNote({ keys: ['f/4'], duration: '32', stem_direction: Stem.UP }),\n staveNote({ keys: ['f/4'], duration: '64', stem_direction: Stem.UP }),\n staveNote({ keys: ['f/4'], duration: '128', stem_direction: Stem.UP }),\n staveNote({ keys: ['g/4'], duration: '4', stem_direction: Stem.UP }),\n staveNote({ keys: ['g/4'], duration: '8', stem_direction: Stem.UP }),\n staveNote({ keys: ['g/4'], duration: '16', stem_direction: Stem.UP }),\n staveNote({ keys: ['g/4'], duration: '32' }),\n staveNote({ keys: ['g/4'], duration: '64', stem_direction: Stem.UP }),\n staveNote({ keys: ['g/4'], duration: '128', stem_direction: Stem.UP }),\n ];\n Dot.buildAndAttach(notes, { all: true });\n Dot.buildAndAttach([notes[5], notes[11]], { all: true });\n stave.setContext(ctx).draw();\n for (let i = 0; i < notes.length; ++i) {\n draw(notes[i], stave, ctx, i * 65);\n }\n ok(true, 'Full Dot');\n}\nfunction dotsAndFlagsStemDown(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 800, 160);\n ctx.scale(1.0, 1.0);\n ctx.setFillStyle('#221');\n ctx.setStrokeStyle('#221');\n const stave = new Stave(10, 10, 975);\n const staveNotes = [\n staveNote({ keys: ['e/5'], duration: '4', stem_direction: Stem.DOWN }),\n staveNote({ keys: ['e/5'], duration: '8', stem_direction: Stem.DOWN }),\n staveNote({ keys: ['e/5'], duration: '16', stem_direction: Stem.DOWN }),\n staveNote({ keys: ['e/5'], duration: '32', stem_direction: Stem.DOWN }),\n staveNote({ keys: ['e/5'], duration: '64', stem_direction: Stem.DOWN }),\n staveNote({ keys: ['e/5'], duration: '128', stem_direction: Stem.DOWN }),\n staveNote({ keys: ['d/5'], duration: '4', stem_direction: Stem.DOWN }),\n staveNote({ keys: ['d/5'], duration: '8', stem_direction: Stem.DOWN }),\n staveNote({ keys: ['d/5'], duration: '16', stem_direction: Stem.DOWN }),\n staveNote({ keys: ['d/5'], duration: '32', stem_direction: Stem.DOWN }),\n staveNote({ keys: ['d/5'], duration: '64', stem_direction: Stem.DOWN }),\n staveNote({ keys: ['d/5'], duration: '128', stem_direction: Stem.DOWN }),\n ];\n Dot.buildAndAttach(staveNotes, { all: true });\n stave.setContext(ctx).draw();\n for (let i = 0; i < staveNotes.length; ++i) {\n draw(staveNotes[i], stave, ctx, i * 65);\n }\n ok(true, 'Full Dot');\n}\nfunction dotsAndBeamsUp(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 800, 150);\n ctx.scale(1.0, 1.0);\n ctx.setFillStyle('#221');\n ctx.setStrokeStyle('#221');\n const stave = new Stave(10, 10, 975);\n const staveNotes = [\n staveNote({ keys: ['f/4'], duration: '8', stem_direction: Stem.UP }),\n staveNote({ keys: ['f/4'], duration: '16', stem_direction: Stem.UP }),\n staveNote({ keys: ['f/4'], duration: '32', stem_direction: Stem.UP }),\n staveNote({ keys: ['f/4'], duration: '64', stem_direction: Stem.UP }),\n staveNote({ keys: ['f/4'], duration: '128', stem_direction: Stem.UP }),\n staveNote({ keys: ['g/4'], duration: '8', stem_direction: Stem.UP }),\n staveNote({ keys: ['g/4'], duration: '16', stem_direction: Stem.UP }),\n staveNote({ keys: ['g/4'], duration: '32' }),\n staveNote({ keys: ['g/4'], duration: '64', stem_direction: Stem.UP }),\n staveNote({ keys: ['g/4'], duration: '128', stem_direction: Stem.UP }),\n ];\n Dot.buildAndAttach(staveNotes, { all: true });\n Dot.buildAndAttach([staveNotes[4], staveNotes[9]], { all: true });\n const beam = new Beam(staveNotes);\n stave.setContext(ctx).draw();\n for (let i = 0; i < staveNotes.length; ++i) {\n draw(staveNotes[i], stave, ctx, i * 65);\n }\n beam.setContext(ctx).draw();\n ok(true, 'Full Dot');\n}\nfunction dotsAndBeamsDown(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 800, 160);\n ctx.scale(1.0, 1.0);\n ctx.setFillStyle('#221');\n ctx.setStrokeStyle('#221');\n const stave = new Stave(10, 10, 975);\n const staveNotes = [\n staveNote({ keys: ['e/5'], duration: '8', stem_direction: Stem.DOWN }),\n staveNote({ keys: ['e/5'], duration: '16', stem_direction: Stem.DOWN }),\n staveNote({ keys: ['e/5'], duration: '32', stem_direction: Stem.DOWN }),\n staveNote({ keys: ['e/5'], duration: '64', stem_direction: Stem.DOWN }),\n staveNote({ keys: ['e/5'], duration: '128', stem_direction: Stem.DOWN }),\n staveNote({ keys: ['d/5'], duration: '8', stem_direction: Stem.DOWN }),\n staveNote({ keys: ['d/5'], duration: '16', stem_direction: Stem.DOWN }),\n staveNote({ keys: ['d/5'], duration: '32', stem_direction: Stem.DOWN }),\n staveNote({ keys: ['d/5'], duration: '64', stem_direction: Stem.DOWN }),\n staveNote({ keys: ['d/5'], duration: '128', stem_direction: Stem.DOWN }),\n ];\n Dot.buildAndAttach(staveNotes, { all: true });\n const beam = new Beam(staveNotes);\n stave.setContext(ctx).draw();\n for (let i = 0; i < staveNotes.length; ++i) {\n draw(staveNotes[i], stave, ctx, i * 65);\n }\n beam.setContext(ctx).draw();\n ok(true, 'Full Dot');\n}\nfunction centerAlignedRest(options) {\n const f = VexFlowTests.makeFactory(options, 400, 160);\n const stave = f.Stave({ x: 10, y: 10, width: 350 }).addClef('treble').addTimeSignature('4/4');\n const note = f.StaveNote({ keys: ['b/4'], duration: '1r', align_center: true });\n const voice = f.Voice().setStrict(false).addTickables([note]);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true);\n}\nfunction centerAlignedRestFermata(options) {\n const f = VexFlowTests.makeFactory(options, 400, 160);\n const stave = f.Stave({ x: 10, y: 10, width: 350 }).addClef('treble').addTimeSignature('4/4');\n const note = f\n .StaveNote({ keys: ['b/4'], duration: '1r', align_center: true })\n .addModifier(new Articulation('a@a').setPosition(3), 0);\n const voice = f.Voice().setStrict(false).addTickables([note]);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true);\n}\nfunction centerAlignedRestAnnotation(options) {\n const f = VexFlowTests.makeFactory(options, 400, 160);\n const stave = f.Stave({ x: 10, y: 10, width: 350 }).addClef('treble').addTimeSignature('4/4');\n const note = f\n .StaveNote({ keys: ['b/4'], duration: '1r', align_center: true })\n .addModifier(new Annotation('Whole measure rest').setVerticalJustification(AnnotationVerticalJustify.TOP), 0);\n const voice = f.Voice().setStrict(false).addTickables([note]);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true);\n}\nfunction centerAlignedNoteMultiModifiers(options) {\n const f = VexFlowTests.makeFactory(options, 400, 160);\n const stave = f.Stave({ x: 10, y: 10, width: 350 }).addClef('treble').addTimeSignature('4/4');\n function newFinger(num, pos) {\n return new FretHandFinger(num).setPosition(pos);\n }\n const note = f\n .StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: '4', align_center: true })\n .addModifier(new Annotation('Test').setPosition(3), 0)\n .addStroke(0, new Stroke(2))\n .addModifier(new Accidental('#'), 1)\n .addModifier(newFinger('3', Modifier.Position.LEFT), 0)\n .addModifier(newFinger('2', Modifier.Position.LEFT), 2)\n .addModifier(newFinger('1', Modifier.Position.RIGHT), 1)\n .addModifier(new StringNumber('4').setPosition(Modifier.Position.BELOW), 2);\n Dot.buildAndAttach([note], { all: true });\n const voice = f.Voice().setStrict(false).addTickables([note]);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true);\n}\nfunction centerAlignedMultiVoice(options) {\n const f = VexFlowTests.makeFactory(options, 400, 160);\n const stave = f.Stave({ x: 10, y: 10, width: 350 }).addClef('treble').addTimeSignature('3/8');\n // Set a custom duration of 3 / 8.\n const custom_duration = new Fraction(3, 8);\n // TODO: Should the whole rest draw a ledger line that is visible to the left/right of the rest?\n const notes0 = [\n f.StaveNote({\n keys: ['c/4'],\n duration: '1r',\n align_center: true,\n duration_override: custom_duration,\n }),\n ];\n const createStaveNote = (struct) => f.StaveNote(struct);\n const notes1 = [\n { keys: ['b/4'], duration: '8' },\n { keys: ['b/4'], duration: '8' },\n { keys: ['b/4'], duration: '8' },\n ].map(createStaveNote);\n notes1[1].addModifier(f.Accidental({ type: '#' }), 0);\n f.Beam({ notes: notes1 });\n const voice0 = f.Voice({ time: '3/8' }).setStrict(false).addTickables(notes0);\n const voice1 = f.Voice({ time: '3/8' }).setStrict(false).addTickables(notes1);\n f.Formatter().joinVoices([voice0, voice1]).formatToStave([voice0, voice1], stave);\n f.draw();\n ok(true);\n}\nVexFlowTests.register(StaveNoteTests);\nexport { StaveNoteTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// StaveTie Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Stem } from '../src/stem';\nconst StaveTieTests = {\n Start() {\n QUnit.module('StaveTie');\n const run = VexFlowTests.runTests;\n run('Simple StaveTie', simple);\n run('Chord StaveTie', chord);\n run('Stem Up StaveTie', stemUp);\n run('No End Note With Clef', noEndNote1);\n run('No End Note', noEndNote2);\n run('No Start Note With Clef', noStartNote1);\n run('No Start Note', noStartNote2);\n run('Set Direction Down', setDirectionDown);\n run('Set Direction Up', setDirectionUp);\n },\n};\n/**\n * Used by the 7 tests below to set up the stave, easyscore, notes, voice, and to format & draw.\n */\nfunction createTest(notesData, setupTies) {\n return (options) => {\n const factory = VexFlowTests.makeFactory(options, 300);\n const stave = factory.Stave();\n const score = factory.EasyScore();\n const notes = score.notes(notesData[0], notesData[1]);\n const voice = score.voice(notes);\n // const tickables = voice.getTickables(); // same as the notes that we passed in.\n setupTies(factory, notes, stave);\n factory.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n factory.draw();\n ok(true);\n };\n}\nconst simple = createTest(['(cb4 e#4 a4)/2, (d4 e4 f4)', { stem: 'down' }], (f, notes) => {\n f.StaveTie({\n from: notes[0],\n to: notes[1],\n first_indices: [0, 1],\n last_indices: [0, 1],\n });\n});\nconst chord = createTest(['(d4 e4 f4)/2, (cn4 f#4 a4)', { stem: 'down' }], (f, notes) => {\n f.StaveTie({\n from: notes[0],\n to: notes[1],\n first_indices: [0, 1, 2],\n last_indices: [0, 1, 2],\n });\n});\nconst stemUp = createTest(['(d4 e4 f4)/2, (cn4 f#4 a4)', { stem: 'up' }], (f, notes) => {\n f.StaveTie({\n from: notes[0],\n to: notes[1],\n first_indices: [0, 1, 2],\n last_indices: [0, 1, 2],\n });\n});\nconst noEndNote1 = createTest(['(cb4 e#4 a4)/2, (d4 e4 f4)', { stem: 'down' }], (f, notes, stave) => {\n stave.addEndClef('treble');\n f.StaveTie({\n from: notes[1],\n first_indices: [2],\n last_indices: [2],\n text: 'slow.',\n });\n});\nconst noEndNote2 = createTest(['(cb4 e#4 a4)/2, (d4 e4 f4)', { stem: 'down' }], (f, notes) => {\n f.StaveTie({\n from: notes[1],\n first_indices: [2],\n last_indices: [2],\n text: 'slow.',\n });\n});\nconst noStartNote1 = createTest(['(cb4 e#4 a4)/2, (d4 e4 f4)', { stem: 'down' }], (f, notes, stave) => {\n stave.addClef('treble');\n f.StaveTie({\n to: notes[0],\n first_indices: [2],\n last_indices: [2],\n text: 'H',\n });\n});\nconst noStartNote2 = createTest(['(cb4 e#4 a4)/2, (d4 e4 f4)', { stem: 'down' }], (f, notes) => {\n f.StaveTie({\n to: notes[0],\n first_indices: [2],\n last_indices: [2],\n text: 'H',\n });\n});\nconst setDirectionDown = createTest(['(cb4 e#4 a4)/2, (d4 e4 f4)', { stem: 'down' }], (f, notes) => {\n f.StaveTie({\n from: notes[0],\n to: notes[1],\n first_indices: [0, 1],\n last_indices: [0, 1],\n options: { direction: Stem.DOWN },\n });\n});\nconst setDirectionUp = createTest(['(cb4 e#4 a4)/2, (d4 e4 f4)', { stem: 'down' }], (f, notes) => {\n f.StaveTie({\n from: notes[0],\n to: notes[1],\n first_indices: [0, 1],\n last_indices: [0, 1],\n options: { direction: Stem.UP },\n });\n});\nVexFlowTests.register(StaveTieTests);\nexport { StaveTieTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// StringNumber Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Glyph } from '../src/glyph';\nimport { Renderer } from '../src/renderer';\nimport { Stave } from '../src/stave';\nimport { BarlineType } from '../src/stavebarline';\nimport { Stroke } from '../src/strokes';\nconst StringNumberTests = {\n Start() {\n QUnit.module('StringNumber');\n const run = VexFlowTests.runTests;\n run('String Number In Notation', drawMultipleMeasures);\n run('Fret Hand Finger In Notation', drawFretHandFingers);\n run('Multi Voice With Strokes, String & Finger Numbers', multi);\n run('Complex Measure With String & Finger Numbers', drawAccidentals);\n },\n};\nfunction drawMultipleMeasures(options) {\n const f = VexFlowTests.makeFactory(options, 775, 200);\n const score = f.EasyScore();\n // bar 1\n const stave1 = f.Stave({ width: 300 }).setEndBarType(BarlineType.DOUBLE).addClef('treble');\n const notes1 = score.notes('(c4 e4 g4)/4., (c5 e5 g5)/8, (c4 f4 g4)/4, (c4 f4 g4)/4', { stem: 'down' });\n notes1[0]\n .addModifier(f.StringNumber({ number: '5', position: 'right' }), 0)\n .addModifier(f.StringNumber({ number: '4', position: 'left' }), 1)\n .addModifier(f.StringNumber({ number: '3', position: 'right' }), 2);\n notes1[1]\n .addModifier(f.Accidental({ type: '#' }), 0)\n .addModifier(f.StringNumber({ number: '5', position: 'below' }), 0)\n .addModifier(f.Accidental({ type: '#' }).setAsCautionary(), 1)\n .addModifier(f\n .StringNumber({ number: '3', position: 'above' })\n .setLastNote(notes1[3])\n .setLineEndType(Renderer.LineEndType.DOWN), 2);\n notes1[2]\n .addModifier(f.StringNumber({ number: '5', position: 'left' }), 0)\n .addModifier(f.StringNumber({ number: '3', position: 'left' }), 2)\n .addModifier(f.Accidental({ type: '#' }), 1);\n notes1[3]\n .addModifier(f.StringNumber({ number: '5', position: 'right' }).setOffsetY(7), 0)\n .addModifier(f.StringNumber({ number: '4', position: 'right' }).setOffsetY(6), 1)\n .addModifier(f.StringNumber({ number: '3', position: 'right' }).setOffsetY(-6), 2);\n const voice1 = score.voice(notes1);\n f.Formatter().joinVoices([voice1]).formatToStave([voice1], stave1);\n // bar 2 - juxtaposing second bar next to first bar\n const stave2 = f\n .Stave({ x: stave1.getWidth() + stave1.getX(), y: stave1.getY(), width: 300 })\n .setEndBarType(BarlineType.DOUBLE);\n const notes2 = score.notes('(c4 e4 g4)/4, (c5 e5 g5), (c4 f4 g4), (c4 f4 g4)', { stem: 'up' });\n notes2[0]\n .addModifier(f.StringNumber({ number: '5', position: 'right' }), 0)\n .addModifier(f.StringNumber({ number: '4', position: 'left' }), 1)\n .addModifier(f.StringNumber({ number: '3', position: 'right' }), 2);\n notes2[1]\n .addModifier(f.Accidental({ type: '#' }), 0)\n .addModifier(f.StringNumber({ number: '5', position: 'below' }), 0)\n .addModifier(f.Accidental({ type: '#' }), 1)\n .addModifier(f.StringNumber({ number: '3', position: 'above' }).setLastNote(notes2[3]).setDashed(false), 2);\n notes2[2]\n .addModifier(f.StringNumber({ number: '3', position: 'left' }), 2)\n .addModifier(f.Accidental({ type: '#' }), 1);\n notes2[3]\n .addModifier(f.StringNumber({ number: '5', position: 'right' }).setOffsetY(7), 0)\n .addModifier(f.StringNumber({ number: '4', position: 'right' }).setOffsetY(6), 1)\n .addModifier(f.StringNumber({ number: '3', position: 'right' }).setOffsetY(-6), 2);\n const voice2 = score.voice(notes2);\n f.Formatter().joinVoices([voice2]).formatToStave([voice2], stave2);\n // bar 3 - juxtaposing third bar next to second bar\n const stave3 = f\n .Stave({ x: stave2.getWidth() + stave2.getX(), y: stave2.getY(), width: 150 })\n .setEndBarType(BarlineType.END);\n const notesBar3 = score.notes('(c4 e4 g4 a4)/1.');\n notesBar3[0]\n .addModifier(f.StringNumber({ number: '5', position: 'below' }), 0)\n .addModifier(f.StringNumber({ number: '4', position: 'right' }), 1)\n .addModifier(f.StringNumber({ number: '3', position: 'left' }), 2)\n .addModifier(f.StringNumber({ number: '2', position: 'above' }), 3);\n const voice3 = score.voice(notesBar3, { time: '6/4' });\n f.Formatter().joinVoices([voice3]).formatToStave([voice3], stave3);\n f.draw();\n ok(true, 'String Number');\n}\nfunction drawFretHandFingers(options) {\n const f = VexFlowTests.makeFactory(options, 725, 200);\n const score = f.EasyScore();\n // bar 1\n const stave1 = f.Stave({ width: 350 }).setEndBarType(BarlineType.DOUBLE).addClef('treble');\n const notes1 = score.notes('(c4 e4 g4)/4, (c5 e5 g5), (c4 f4 g4), (c4 f4 g4)', { stem: 'down' });\n notes1[0]\n .addModifier(f.Fingering({ number: '3', position: 'left' }), 0)\n .addModifier(f.Fingering({ number: '2', position: 'left' }), 1)\n .addModifier(f.Fingering({ number: '0', position: 'left' }), 2);\n notes1[1]\n .addModifier(f.Accidental({ type: '#' }), 0)\n .addModifier(f.Fingering({ number: '3', position: 'left' }), 0)\n .addModifier(f.Fingering({ number: '2', position: 'left' }), 1)\n .addModifier(f.Accidental({ type: '#' }), 1)\n .addModifier(f.Fingering({ number: '0', position: 'left' }), 2);\n notes1[2]\n .addModifier(f.Fingering({ number: '3', position: 'below' }), 0)\n .addModifier(f.Fingering({ number: '4', position: 'left' }), 1)\n .addModifier(f.StringNumber({ number: '4', position: 'left' }), 1)\n .addModifier(f.Fingering({ number: '0', position: 'above' }), 2)\n .addModifier(f.Accidental({ type: '#' }), 1);\n notes1[3]\n .addModifier(f.Fingering({ number: '3', position: 'right' }), 0)\n .addModifier(f.StringNumber({ number: '5', position: 'right' }).setOffsetY(7), 0)\n .addModifier(f.Fingering({ number: '4', position: 'right' }), 1)\n .addModifier(f.StringNumber({ number: '4', position: 'right' }).setOffsetY(6), 1)\n .addModifier(f.Fingering({ number: '0', position: 'right' }).setOffsetY(-5), 2)\n .addModifier(f.StringNumber({ number: '3', position: 'right' }).setOffsetY(-6), 2);\n const voice1 = score.voice(notes1);\n f.Formatter().joinVoices([voice1]).formatToStave([voice1], stave1);\n // bar 2 - juxtaposing second bar next to first bar\n const stave2 = f\n .Stave({ x: stave1.getWidth() + stave1.getX(), y: stave1.getY(), width: 350 })\n .setEndBarType(BarlineType.END);\n const notes2 = score.notes('(c4 e4 g4)/4., (c5 e5 g5)/8, (c4 f4 g4)/8, (c4 f4 g4)/4.[stem=\"down\"]', {\n stem: 'up',\n });\n notes2[0]\n .addModifier(f.Fingering({ number: '3', position: 'right' }), 0)\n .addModifier(f.Fingering({ number: '2', position: 'left' }), 1)\n .addModifier(f.StringNumber({ number: '4', position: 'right' }), 1)\n .addModifier(f.Fingering({ number: '0', position: 'above' }), 2);\n notes2[1]\n .addModifier(f.Accidental({ type: '#' }), 0)\n .addModifier(f.Fingering({ number: '3', position: 'right' }), 0)\n .addModifier(f.Fingering({ number: '2', position: 'left' }), 1)\n .addModifier(f.Accidental({ type: '#' }), 1)\n .addModifier(f.Fingering({ number: '0', position: 'left' }), 2);\n notes2[2]\n .addModifier(f.Fingering({ number: '3', position: 'below' }), 0)\n .addModifier(f.Fingering({ number: '2', position: 'left' }), 1)\n .addModifier(f.StringNumber({ number: '4', position: 'left' }), 1)\n .addModifier(f.Fingering({ number: '1', position: 'right' }), 2)\n .addModifier(f.Accidental({ type: '#' }), 2);\n notes2[3]\n .addModifier(f.Fingering({ number: '3', position: 'right' }), 0)\n .addModifier(f.StringNumber({ number: '5', position: 'right' }).setOffsetY(7), 0)\n .addModifier(f.Fingering({ number: '4', position: 'right' }), 1)\n .addModifier(f.StringNumber({ number: '4', position: 'right' }).setOffsetY(6), 1)\n .addModifier(f.Fingering({ number: '1', position: 'right' }).setOffsetY(-6), 2)\n .addModifier(f.StringNumber({ number: '3', position: 'right' }).setOffsetY(-6), 2);\n const voice2 = score.voice(notes2);\n f.Formatter().joinVoices([voice2]).formatToStave([voice2], stave2);\n f.draw();\n ok(true, 'String Number');\n}\nfunction multi(options) {\n const f = VexFlowTests.makeFactory(options, 700, 200);\n const score = f.EasyScore();\n const stave = f.Stave();\n const notes1 = score.notes('(c4 e4 g4)/4, (a3 e4 g4), (c4 d4 a4), (c4 d4 a4)', { stem: 'up' });\n notes1[0]\n .addStroke(0, new Stroke(5))\n .addModifier(f.Fingering({ number: '3', position: 'left' }), 0)\n .addModifier(f.Fingering({ number: '2', position: 'left' }), 1)\n .addModifier(f.Fingering({ number: '0', position: 'left' }), 2)\n .addModifier(f.StringNumber({ number: '4', position: 'left' }), 1)\n .addModifier(f.StringNumber({ number: '3', position: 'above' }), 2);\n notes1[1]\n .addStroke(0, new Stroke(6))\n .addModifier(f.StringNumber({ number: '4', position: 'right' }), 1)\n .addModifier(f.StringNumber({ number: '3', position: 'above' }), 2)\n .addModifier(f.Accidental({ type: '#' }), 0)\n .addModifier(f.Accidental({ type: '#' }), 1)\n .addModifier(f.Accidental({ type: '#' }), 2);\n notes1[2]\n .addStroke(0, new Stroke(2))\n .addModifier(f.Fingering({ number: '3', position: 'left' }), 0)\n .addModifier(f.Fingering({ number: '0', position: 'right' }), 1)\n .addModifier(f.StringNumber({ number: '4', position: 'right' }), 1)\n .addModifier(f.Fingering({ number: '1', position: 'left' }), 2)\n .addModifier(f.StringNumber({ number: '3', position: 'right' }), 2);\n notes1[3]\n .addStroke(0, new Stroke(1))\n .addModifier(f.StringNumber({ number: '3', position: 'left' }), 2)\n .addModifier(f.StringNumber({ number: '4', position: 'right' }), 1);\n const notes2 = score.notes('e3/8, e3, e3, e3, e3, e3, e3, e3', { stem: 'down' });\n notes2[0]\n .addModifier(f.Fingering({ number: '0', position: 'left' }), 0)\n .addModifier(f.StringNumber({ number: '6', position: 'below' }), 0);\n notes2[2].addModifier(f.Accidental({ type: '#' }), 0);\n notes2[4].addModifier(f.Fingering({ number: '0', position: 'left' }), 0);\n // Position string number 6 beneath the strum arrow: left (15) and down (18)\n notes2[4].addModifier(f.StringNumber({ number: '6', position: 'left' }).setOffsetX(15).setOffsetY(18), 0);\n // Important Note: notes2 must come first, otherwise ledger lines from notes2 will be drawn on top of notes from notes1!\n // BUG: VexFlow draws TWO ledger lines for middle C, because both notes1 and notes2 require the middle C ledger line.\n const voices = [score.voice(notes2), score.voice(notes1)];\n f.Formatter().joinVoices(voices).formatToStave(voices, stave);\n f.Beam({ notes: notes2.slice(0, 4) });\n f.Beam({ notes: notes2.slice(4, 8) });\n f.draw();\n ok(true, 'Strokes Test Multi Voice');\n}\nfunction drawAccidentals(options) {\n const f = VexFlowTests.makeFactory(options, 750);\n const glyphScale = 39; // default font scale\n const clefWidth = Glyph.getWidth('gClef', glyphScale); // widest clef\n const notes = [\n f.StaveNote({ keys: ['c/4', 'e/4', 'g/4', 'c/5', 'e/5', 'g/5'], stem_direction: 1, duration: '4' }),\n f.StaveNote({ keys: ['c/4', 'e/4', 'g/4', 'd/5', 'e/5', 'g/5'], stem_direction: 1, duration: '4' }),\n f.StaveNote({ keys: ['c/4', 'e/4', 'g/4', 'd/5', 'e/5', 'g/5'], stem_direction: -1, duration: '4' }),\n f.StaveNote({ keys: ['c/4', 'e/4', 'g/4', 'd/5', 'e/5', 'g/5'], stem_direction: -1, duration: '4' }),\n ];\n notes[0]\n .addModifier(f.Fingering({ number: '3', position: 'left' }), 0)\n .addModifier(f.Accidental({ type: '#' }), 0)\n .addModifier(f.Fingering({ number: '2', position: 'left' }), 1)\n .addModifier(f.StringNumber({ number: '2', position: 'left' }), 1)\n .addModifier(f.Accidental({ type: '#' }), 1)\n .addModifier(f.Fingering({ number: '0', position: 'left' }), 2)\n .addModifier(f.Accidental({ type: '#' }), 2)\n .addModifier(f.Fingering({ number: '3', position: 'left' }), 3)\n .addModifier(f.Accidental({ type: '#' }), 3)\n .addModifier(f.Fingering({ number: '2', position: 'right' }), 4)\n .addModifier(f.StringNumber({ number: '3', position: 'right' }), 4)\n .addModifier(f.Accidental({ type: '#' }), 4)\n .addModifier(f.Fingering({ number: '0', position: 'left' }), 5)\n .addModifier(f.Accidental({ type: '#' }), 5);\n notes[1]\n .addModifier(f.Accidental({ type: '#' }), 0)\n .addModifier(f.Accidental({ type: '#' }), 1)\n .addModifier(f.Accidental({ type: '#' }), 2)\n .addModifier(f.Accidental({ type: '#' }), 3)\n .addModifier(f.Accidental({ type: '#' }), 4)\n .addModifier(f.Accidental({ type: '#' }), 5);\n notes[2]\n .addModifier(f.Fingering({ number: '3', position: 'left' }), 0)\n .addModifier(f.Accidental({ type: '#' }), 0)\n .addModifier(f.Fingering({ number: '2', position: 'left' }), 1)\n .addModifier(f.StringNumber({ number: '2', position: 'left' }), 1)\n .addModifier(f.Accidental({ type: '#' }), 1)\n .addModifier(f.Fingering({ number: '0', position: 'left' }), 2)\n .addModifier(f.Accidental({ type: '#' }), 2)\n .addModifier(f.Fingering({ number: '3', position: 'left' }), 3)\n .addModifier(f.Accidental({ type: '#' }), 3)\n .addModifier(f.Fingering({ number: '2', position: 'right' }), 4)\n .addModifier(f.StringNumber({ number: '3', position: 'right' }), 4)\n .addModifier(f.Accidental({ type: '#' }), 4)\n .addModifier(f.Fingering({ number: '0', position: 'left' }), 5)\n .addModifier(f.Accidental({ type: '#' }), 5);\n notes[3]\n .addModifier(f.Accidental({ type: '#' }), 0)\n .addModifier(f.Accidental({ type: '#' }), 1)\n .addModifier(f.Accidental({ type: '#' }), 2)\n .addModifier(f.Accidental({ type: '#' }), 3)\n .addModifier(f.Accidental({ type: '#' }), 4)\n .addModifier(f.Accidental({ type: '#' }), 5);\n const voice = f.Voice().addTickables(notes);\n const ctx = f.getContext();\n const formatter = f.Formatter().joinVoices([voice]);\n const stavePadding = clefWidth + Stave.defaultPadding + 10;\n const nwidth = Math.max(formatter.preCalculateMinTotalWidth([voice]), 490 - stavePadding);\n formatter.format([voice], nwidth);\n const stave = f\n .Stave({ x: 0, y: 0, width: nwidth + stavePadding })\n .setContext(ctx)\n .setEndBarType(BarlineType.DOUBLE)\n .addClef('treble')\n .draw();\n voice.draw(ctx, stave);\n ok(true, 'String Number');\n}\nVexFlowTests.register(StringNumberTests);\nexport { StringNumberTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Strokes Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Barline, Beam, Bend, Stroke } from '../src/index';\nconst StrokesTests = {\n Start() {\n QUnit.module('Strokes');\n const run = VexFlowTests.runTests;\n // TODO: Rename tests by removing 'Strokes - ' since it is redundant with the module name.\n // This will make flow.html easier to read.\n run('Strokes - Brush/Roll/Rasquedo', brushRollRasquedo);\n run('Strokes - Arpeggio directionless (without arrows)', arpeggioDirectionless);\n run('Strokes - Multi Voice', multiVoice);\n run('Strokes - Notation and Tab', notesWithTab);\n run('Strokes - Multi-Voice Notation and Tab', multiNotationAndTab);\n },\n};\nfunction brushRollRasquedo(options) {\n const f = VexFlowTests.makeFactory(options, 600, 200);\n const score = f.EasyScore();\n // bar 1\n const stave1 = f.Stave({ width: 250 }).setEndBarType(Barline.type.DOUBLE);\n const notes1 = score.notes('(a3 e4 a4)/4, (c4 e4 g4), (c4 e4 g4), (c4 e4 g4)', { stem: 'up' });\n notes1[0].addStroke(0, new Stroke(1));\n notes1[1]\n .addStroke(0, new Stroke(2))\n .addModifier(f.Accidental({ type: '#' }), 1)\n .addModifier(f.Accidental({ type: '#' }), 2)\n .addModifier(f.Accidental({ type: '#' }), 0);\n notes1[2].addStroke(0, new Stroke(1));\n notes1[3].addStroke(0, new Stroke(2));\n const voice1 = score.voice(notes1);\n f.Formatter().joinVoices([voice1]).formatToStave([voice1], stave1);\n // bar 2\n const stave2 = f\n .Stave({ x: stave1.getWidth() + stave1.getX(), y: stave1.getY(), width: 300 })\n .setEndBarType(Barline.type.DOUBLE);\n const notes2 = score.notes('(c4 d4 g4)/4, (c4 d4 g4), (c4 d4 g4), (c4 d4 a4)', { stem: 'up' });\n notes2[0].addStroke(0, new Stroke(3));\n notes2[1].addStroke(0, new Stroke(4));\n notes2[2].addStroke(0, new Stroke(5));\n notes2[3]\n .addStroke(0, new Stroke(6))\n .addModifier(f.Accidental({ type: 'bb' }), 0)\n .addModifier(f.Accidental({ type: 'bb' }), 1)\n .addModifier(f.Accidental({ type: 'bb' }), 2);\n const voice2 = score.voice(notes2);\n f.Formatter().joinVoices([voice2]).formatToStave([voice2], stave2);\n f.draw();\n ok(true, 'Brush/Roll/Rasquedo');\n}\nfunction arpeggioDirectionless(options) {\n const f = VexFlowTests.makeFactory(options, 700, 200);\n const score = f.EasyScore();\n // bar 1\n const stave1 = f.Stave({ x: 100, width: 500 }).setEndBarType(Barline.type.DOUBLE);\n const notes1 = score.notes('(g4 b4 d5)/4, (g4 b4 d5 g5), (g4 b4 d5 g5), (g4 b4 d5)', { stem: 'up' });\n const graceNoteStructs = [\n { keys: ['e/4'], duration: '32' },\n { keys: ['f/4'], duration: '32' },\n { keys: ['g/4'], duration: '32' },\n ];\n const graceNotes = graceNoteStructs.map((graceNoteStruct) => f.GraceNote(graceNoteStruct));\n const graceNoteGroup = f.GraceNoteGroup({ notes: graceNotes, slur: false });\n graceNoteGroup.beamNotes();\n notes1[0].addStroke(0, new Stroke(7));\n notes1[1]\n .addStroke(0, new Stroke(7))\n .addModifier(f.Accidental({ type: '#' }), 0)\n .addModifier(f.Accidental({ type: '#' }), 1)\n .addModifier(f.Accidental({ type: '#' }), 2)\n .addModifier(f.Accidental({ type: '#' }), 3);\n notes1[2]\n .addStroke(0, new Stroke(7))\n .addModifier(f.Accidental({ type: 'b' }), 1)\n .addModifier(graceNoteGroup, 0);\n notes1[3].addStroke(0, new Stroke(7)).addModifier(f.NoteSubGroup({\n notes: [f.ClefNote({ type: 'treble', options: { size: 'default', annotation: '8va' } })],\n }), 0);\n const voice1 = score.voice(notes1);\n f.Formatter().joinVoices([voice1]).formatToStave([voice1], stave1);\n f.draw();\n ok(true, 'Arpeggio directionless (without arrows)');\n}\nfunction multiVoice(options) {\n const f = VexFlowTests.makeFactory(options, 500, 200);\n const score = f.EasyScore();\n const stave = f.Stave();\n const notes1 = score.notes('(c4 e4 g4)/4, (c4 e4 g4), (c4 d4 a4), (c4 d4 a4)', { stem: 'up' });\n notes1[0].addStroke(0, new Stroke(5));\n notes1[1]\n .addStroke(0, new Stroke(6))\n .addModifier(f.Accidental({ type: '#' }), 0)\n .addModifier(f.Accidental({ type: '#' }), 2);\n notes1[2].addStroke(0, new Stroke(2));\n notes1[3].addStroke(0, new Stroke(1));\n const notes2 = score.notes('e3/8, e3, e3, e3, e3, e3, e3, e3', { stem: 'down' });\n f.Beam({ notes: notes2.slice(0, 4) });\n f.Beam({ notes: notes2.slice(4, 8) });\n const voices = [notes1, notes2].map((notes) => score.voice(notes));\n f.Formatter().joinVoices(voices).formatToStave(voices, stave);\n f.draw();\n ok(true, 'Strokes Test Multi Voice');\n}\nfunction multiNotationAndTab(options) {\n const f = VexFlowTests.makeFactory(options, 400, 275);\n const score = f.EasyScore();\n const stave = f.Stave().addClef('treble');\n // notation upper voice notes\n const notes1 = score.notes('(g4 b4 e5)/4, (g4 b4 e5), (g4 b4 e5), (g4 b4 e5)', { stem: 'up' });\n notes1[0].addStroke(0, new Stroke(3, { all_voices: false }));\n notes1[1].addStroke(0, new Stroke(6));\n notes1[2].addStroke(0, new Stroke(2, { all_voices: false }));\n notes1[3].addStroke(0, new Stroke(1));\n const notes2 = score.notes('g3/4, g3, g3, g3', { stem: 'down' });\n f.TabStave({ y: 100 }).addClef('tab').setNoteStartX(stave.getNoteStartX());\n // tablature upper voice notes\n const tabNotes1 = [\n f.TabNote({\n positions: [\n { str: 3, fret: 0 },\n { str: 2, fret: 0 },\n { str: 1, fret: 1 },\n ],\n duration: '4',\n }),\n f.TabNote({\n positions: [\n { str: 3, fret: 0 },\n { str: 2, fret: 0 },\n { str: 1, fret: 1 },\n ],\n duration: '4',\n }),\n f.TabNote({\n positions: [\n { str: 3, fret: 0 },\n { str: 2, fret: 0 },\n { str: 1, fret: 1 },\n ],\n duration: '4',\n }),\n f.TabNote({\n positions: [\n { str: 3, fret: 0 },\n { str: 2, fret: 0 },\n { str: 1, fret: 1 },\n ],\n duration: '4',\n }),\n ];\n tabNotes1[0].addStroke(0, new Stroke(3, { all_voices: false }));\n tabNotes1[1].addStroke(0, new Stroke(6));\n tabNotes1[2].addStroke(0, new Stroke(2, { all_voices: false }));\n tabNotes1[3].addStroke(0, new Stroke(1));\n const tabNotes2 = [\n f.TabNote({ positions: [{ str: 6, fret: 3 }], duration: '4' }),\n f.TabNote({ positions: [{ str: 6, fret: 3 }], duration: '4' }),\n f.TabNote({ positions: [{ str: 6, fret: 3 }], duration: '4' }),\n f.TabNote({ positions: [{ str: 6, fret: 3 }], duration: '4' }),\n ];\n const voices = [notes1, notes2, tabNotes1, tabNotes2].map((notes) => score.voice(notes));\n f.Formatter().joinVoices(voices).formatToStave(voices, stave);\n f.draw();\n ok(true, 'Strokes Test Notation & Tab Multi Voice');\n}\n/*\nfunction drawTabStrokes(options: TestOptions): void {\n const f = VexFlowTests.makeFactory(options, 600, 200);\n const stave1 = f.TabStave({ width: 250 }).setEndBarType(Barline.type.DOUBLE);\n\n const tabNotes1 = [\n f.TabNote({\n positions: [\n { str: 2, fret: 8 },\n { str: 3, fret: 9 },\n { str: 4, fret: 10 },\n ],\n duration: '4',\n }),\n f.TabNote({\n positions: [\n { str: 3, fret: 7 },\n { str: 4, fret: 8 },\n { str: 5, fret: 9 },\n ],\n duration: '4',\n }),\n f.TabNote({\n positions: [\n { str: 1, fret: 5 },\n { str: 2, fret: 6 },\n { str: 3, fret: 7 },\n { str: 4, fret: 7 },\n { str: 5, fret: 5 },\n { str: 6, fret: 5 },\n ],\n duration: '4',\n }),\n f.TabNote({\n positions: [\n { str: 4, fret: 3 },\n { str: 5, fret: 4 },\n { str: 6, fret: 5 },\n ],\n duration: '4',\n }),\n ];\n\n tabNotes1[0].addStroke(0, new Stroke(1));\n tabNotes1[1].addStroke(0, new Stroke(2));\n tabNotes1[2].addStroke(0, new Stroke(3));\n tabNotes1[3].addStroke(0, new Stroke(4));\n\n const tabVoice1 = f.Voice().addTickables(tabNotes1);\n\n f.Formatter().joinVoices([tabVoice1]).formatToStave([tabVoice1], stave1);\n\n // bar 2\n const stave2 = f.TabStave({ x: stave1.getWidth() + stave1.getX(), width: 300 }).setEndBarType(Barline.type.DOUBLE);\n\n const tabNotes2 = [\n f.TabNote({\n positions: [\n { str: 2, fret: 7 },\n { str: 3, fret: 8 },\n { str: 4, fret: 9 },\n ],\n duration: '2',\n }),\n f.TabNote({\n positions: [\n { str: 1, fret: 5 },\n { str: 2, fret: 6 },\n { str: 3, fret: 7 },\n { str: 4, fret: 7 },\n { str: 5, fret: 5 },\n { str: 6, fret: 5 },\n ],\n duration: '2',\n }),\n ];\n\n tabNotes2[0].addStroke(0, new Stroke(6));\n tabNotes2[1].addStroke(0, new Stroke(5));\n\n const tabVoice2 = f.Voice().addTickables(tabNotes2);\n\n f.Formatter().joinVoices([tabVoice2]).formatToStave([tabVoice2], stave2);\n\n f.draw();\n\n ok(true, 'Strokes Tab test');\n}\n*/\nfunction notesWithTab(options) {\n const f = VexFlowTests.makeFactory(options, 500, 300);\n const stave = f.Stave({ x: 15, y: 40, width: 450 }).addClef('treble');\n const notes = [\n f\n .StaveNote({ keys: ['b/4', 'd/5', 'g/5'], stem_direction: -1, duration: '4' })\n .addModifier(f.Accidental({ type: 'b' }), 1)\n .addModifier(f.Accidental({ type: 'b' }), 0),\n f.StaveNote({ keys: ['c/5', 'd/5'], stem_direction: -1, duration: '4' }),\n f.StaveNote({ keys: ['b/3', 'e/4', 'a/4', 'd/5'], stem_direction: 1, duration: '8' }),\n f\n .StaveNote({ keys: ['a/3', 'e/4', 'a/4', 'c/5', 'e/5', 'a/5'], stem_direction: 1, duration: '8' })\n .addModifier(f.Accidental({ type: '#' }), 3),\n f.StaveNote({ keys: ['b/3', 'e/4', 'a/4', 'd/5'], stem_direction: 1, duration: '8' }),\n f\n .StaveNote({ keys: ['a/3', 'e/4', 'a/4', 'c/5', 'f/5', 'a/5'], stem_direction: 1, duration: '8' })\n .addModifier(f.Accidental({ type: '#' }), 3)\n .addModifier(f.Accidental({ type: '#' }), 4),\n ];\n const tabstave = f\n .TabStave({ x: stave.getX(), y: 140, width: 450 })\n .addClef('tab')\n .setNoteStartX(stave.getNoteStartX());\n const tabNotes = [\n f\n .TabNote({\n positions: [\n { str: 1, fret: 3 },\n { str: 2, fret: 2 },\n { str: 3, fret: 3 },\n ],\n duration: '4',\n })\n .addModifier(new Bend('Full'), 0),\n f\n .TabNote({\n positions: [\n { str: 2, fret: 3 },\n { str: 3, fret: 5 },\n ],\n duration: '4',\n })\n .addModifier(new Bend('Unison'), 1),\n f.TabNote({\n positions: [\n { str: 3, fret: 7 },\n { str: 4, fret: 7 },\n { str: 5, fret: 7 },\n { str: 6, fret: 7 },\n ],\n duration: '8',\n }),\n f.TabNote({\n positions: [\n { str: 1, fret: 5 },\n { str: 2, fret: 5 },\n { str: 3, fret: 6 },\n { str: 4, fret: 7 },\n { str: 5, fret: 7 },\n { str: 6, fret: 5 },\n ],\n duration: '8',\n }),\n f.TabNote({\n positions: [\n { str: 3, fret: 7 },\n { str: 4, fret: 7 },\n { str: 5, fret: 7 },\n { str: 6, fret: 7 },\n ],\n duration: '8',\n }),\n f.TabNote({\n positions: [\n { str: 1, fret: 5 },\n { str: 2, fret: 5 },\n { str: 3, fret: 6 },\n { str: 4, fret: 7 },\n { str: 5, fret: 7 },\n { str: 6, fret: 5 },\n ],\n duration: '8',\n }),\n ];\n notes[0].addStroke(0, new Stroke(1));\n notes[1].addStroke(0, new Stroke(2));\n notes[2].addStroke(0, new Stroke(3));\n notes[3].addStroke(0, new Stroke(4));\n notes[4].addStroke(0, new Stroke(5));\n notes[5].addStroke(0, new Stroke(6));\n tabNotes[0].addStroke(0, new Stroke(1));\n tabNotes[1].addStroke(0, new Stroke(2));\n tabNotes[2].addStroke(0, new Stroke(3));\n tabNotes[3].addStroke(0, new Stroke(4));\n tabNotes[4].addStroke(0, new Stroke(5));\n tabNotes[5].addStroke(0, new Stroke(6));\n f.StaveConnector({\n top_stave: stave,\n bottom_stave: tabstave,\n type: 'bracket',\n });\n f.StaveConnector({\n top_stave: stave,\n bottom_stave: tabstave,\n type: 'single',\n });\n const voice = f.Voice().addTickables(notes);\n const tabVoice = f.Voice().addTickables(tabNotes);\n const beams = Beam.applyAndGetBeams(voice);\n f.Formatter().joinVoices([voice]).joinVoices([tabVoice]).formatToStave([voice, tabVoice], stave);\n f.draw();\n beams.forEach(function (beam) {\n beam.setContext(f.getContext()).draw();\n });\n ok(true);\n}\nVexFlowTests.register(StrokesTests);\nexport { StrokesTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Style Tests\n// TODO: The .addStroke(0, new Stroke(...)) in the tab test case shows a NO GLYPH for the Petaluma font.\n// TODO: Changing ctx.font seems to have no effect in the tab test case. Should it?\n// Annotation sets its own font.\n// TabNote sets its own font.\n// Is there a way to set all the text fonts in one go?\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Annotation } from '../src/annotation';\nimport { Articulation } from '../src/articulation';\nimport { Bend } from '../src/bend';\nimport { Formatter } from '../src/formatter';\nimport { KeySignature } from '../src/keysignature';\nimport { NoteSubGroup } from '../src/notesubgroup';\nimport { Ornament } from '../src/ornament';\nimport { StaveModifierPosition } from '../src/stavemodifier';\nimport { Stroke } from '../src/strokes';\nimport { TabNote } from '../src/tabnote';\nimport { TabStave } from '../src/tabstave';\nimport { TimeSignature } from '../src/timesignature';\nconst StyleTests = {\n Start() {\n QUnit.module('Style');\n const run = VexFlowTests.runTests;\n run('Basic Style', stave);\n run('TabNote modifiers Style', tab);\n },\n};\n/**\n * Helper function to create a ElementStyle options object of the form { fillStyle: XXX, strokeStyle: YYY }.\n * Used for updating the fillStyle and optionally the strokeStyle.\n */\nfunction FS(fillStyle, strokeStyle) {\n const ret = { fillStyle };\n if (strokeStyle) {\n ret.strokeStyle = strokeStyle;\n }\n return ret;\n}\n/**\n * Color elements on a stave.\n */\nfunction stave(options) {\n const f = VexFlowTests.makeFactory(options, 600, 150);\n const stave = f.Stave({ x: 25, y: 20, width: 500 });\n // Stave modifiers test.\n const keySig = new KeySignature('D');\n keySig.addToStave(stave);\n keySig.setStyle(FS('blue'));\n stave.addTimeSignature('4/4');\n const timeSig = stave.getModifiers(StaveModifierPosition.BEGIN, TimeSignature.CATEGORY);\n timeSig[0].setStyle(FS('brown'));\n const notes = [\n f\n .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], stem_direction: 1, duration: '4' })\n .addModifier(f.Accidental({ type: 'b' }), 0)\n .addModifier(f.Accidental({ type: '#' }), 1),\n f\n .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], stem_direction: 1, duration: '4' })\n .addModifier(f.Accidental({ type: 'b' }), 0)\n .addModifier(f.Accidental({ type: '#' }), 1),\n f.StaveNote({ keys: ['e/4'], stem_direction: 1, duration: '4' }),\n f.StaveNote({ keys: ['f/4'], stem_direction: 1, duration: '8' }),\n // voice.draw() test.\n f.TextDynamics({ text: 'sfz', duration: '16' }).setStyle(FS('blue')),\n // GhostNote modifiers test.\n f.GhostNote({ duration: '16' }).addModifier(new Annotation('GhostNote green text').setStyle(FS('green')), 0),\n ];\n const notes0 = notes[0];\n const notes1 = notes[1];\n notes0.setKeyStyle(0, FS('red'));\n notes1.setKeyStyle(0, FS('red'));\n // StaveNote modifiers test.\n const mods1 = notes1.getModifiers();\n mods1[0].setStyle(FS('green'));\n notes0.addModifier(new Articulation('a.').setPosition(4).setStyle(FS('green')), 0);\n notes0.addModifier(new Ornament('mordent').setStyle(FS('lightgreen')), 0);\n notes1.addModifier(new Annotation('blue').setStyle(FS('blue')), 0);\n notes1.addModifier(new NoteSubGroup([f.ClefNote({ options: { size: 'small' } }).setStyle(FS('blue'))]), 0);\n const voice = f.Voice().addTickables(notes);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'Basic Style');\n}\n/**\n * Color elements on a guitar tab.\n */\nfunction tab(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 500, 140);\n ctx.fillStyle = '#221';\n ctx.strokeStyle = '#221';\n ctx.font = '10pt Arial';\n const stave = new TabStave(10, 10, 450).addTabGlyph();\n stave.getModifiers()[2].setStyle(FS('blue'));\n stave.setContext(ctx).draw();\n const tabNote = (noteStruct) => new TabNote(noteStruct);\n const notes = [\n tabNote({\n positions: [\n { str: 2, fret: 10 },\n { str: 4, fret: 9 },\n ],\n duration: 'h',\n }).addModifier(new Annotation('green text').setStyle(FS('green')), 0),\n tabNote({\n positions: [\n { str: 2, fret: 10 },\n { str: 4, fret: 9 },\n ],\n duration: 'h',\n })\n .addModifier(new Bend('Full').setStyle(FS('brown')), 0)\n .addStroke(0, new Stroke(1, { all_voices: false }).setStyle(FS('blue'))),\n ];\n Formatter.FormatAndDraw(ctx, stave, notes);\n ok(true, 'TabNote Modifiers Style');\n}\nVexFlowTests.register(StyleTests);\nexport { StyleTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// TabNote Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Dot } from '../src/dot';\nimport { Flow } from '../src/flow';\nimport { Font, FontWeight } from '../src/font';\nimport { Formatter } from '../src/formatter';\nimport { Stave } from '../src/stave';\nimport { TabNote } from '../src/tabnote';\nimport { TabStave } from '../src/tabstave';\nimport { TickContext } from '../src/tickcontext';\nimport { Voice, VoiceMode } from '../src/voice';\nconst TabNoteTests = {\n Start() {\n QUnit.module('TabNote');\n test('Tick', ticks);\n test('TabStave Line', tabStaveLine);\n test('Width', width);\n test('TickContext', tickContext);\n const run = VexFlowTests.runTests;\n run('TabNote Draw', draw);\n run('TabNote Stems Up', drawStemsUp);\n run('TabNote Stems Down', drawStemsDown);\n run('TabNote Stems Up Through Stave', drawStemsUpThrough);\n run('TabNote Stems Down Through Stave', drawStemsDownThrough);\n run('TabNote Stems with Dots', drawStemsDotted);\n },\n};\nfunction ticks() {\n const BEAT = (1 * Flow.RESOLUTION) / 4;\n let note = new TabNote({ positions: [{ str: 6, fret: 6 }], duration: '1' });\n equal(note.getTicks().value(), BEAT * 4, 'Whole note has 4 beats');\n note = new TabNote({ positions: [{ str: 3, fret: 4 }], duration: '4' });\n equal(note.getTicks().value(), BEAT, 'Quarter note has 1 beat');\n}\nfunction tabStaveLine() {\n const note = new TabNote({\n positions: [\n { str: 6, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '1',\n });\n const positions = note.getPositions();\n equal(positions[0].str, 6, 'String 6, Fret 6');\n equal(positions[0].fret, 6, 'String 6, Fret 6');\n equal(positions[1].str, 4, 'String 4, Fret 5');\n equal(positions[1].fret, 5, 'String 4, Fret 5');\n const stave = new Stave(10, 10, 300);\n note.setStave(stave);\n const ys = note.getYs();\n equal(ys.length, 2, 'Chord should be rendered on two lines');\n equal(ys[0], 100, 'Line for String 6, Fret 6');\n equal(ys[1], 80, 'Line for String 4, Fret 5');\n}\nfunction width() {\n expect(1);\n const note = new TabNote({\n positions: [\n { str: 6, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '1',\n });\n throws(() => note.getWidth(), /UnformattedNote/, 'Unformatted note should have no width');\n}\nfunction tickContext() {\n const note = new TabNote({\n positions: [\n { str: 6, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '1',\n });\n const tickContext = new TickContext().addTickable(note).preFormat().setX(10).setPadding(0);\n equal(tickContext.getWidth(), 7);\n}\nfunction draw(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 600, 140);\n ctx.font = '10pt Arial';\n const stave = new TabStave(10, 10, 550);\n stave.setContext(ctx);\n stave.draw();\n const notes = [\n { positions: [{ str: 6, fret: 6 }], duration: '4' },\n {\n positions: [\n { str: 3, fret: 6 },\n { str: 4, fret: 25 },\n ],\n duration: '4',\n },\n {\n positions: [\n { str: 2, fret: 'x' },\n { str: 5, fret: 15 },\n ],\n duration: '4',\n },\n {\n positions: [\n { str: 2, fret: 'x' },\n { str: 5, fret: 5 },\n ],\n duration: '4',\n },\n {\n positions: [\n { str: 2, fret: 10 },\n { str: 5, fret: 12 },\n ],\n duration: '4',\n },\n {\n positions: [\n { str: 6, fret: 0 },\n { str: 5, fret: 5 },\n { str: 4, fret: 5 },\n { str: 3, fret: 4 },\n { str: 2, fret: 3 },\n { str: 1, fret: 0 },\n ],\n duration: '4',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '4',\n },\n ];\n // Helper function\n function showNote(noteStruct, stave, ctx, x) {\n const tabNote = new TabNote(noteStruct);\n const tickContext = new TickContext();\n tickContext.addTickable(tabNote).preFormat().setX(x);\n tabNote.setContext(ctx).setStave(stave);\n tabNote.draw();\n return tabNote;\n }\n for (let i = 0; i < notes.length; ++i) {\n const note = notes[i];\n const tabNote = showNote(note, stave, ctx, (i + 1) * 25);\n ok(tabNote.getX() > 0, 'Note ' + i + ' has X value');\n ok(tabNote.getYs().length > 0, 'Note ' + i + ' has Y values');\n }\n}\nfunction drawStemsUp(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 600, 200);\n ctx.font = '10pt Arial';\n const stave = new TabStave(10, 30, 550);\n stave.setContext(ctx);\n stave.draw();\n const specs = [\n {\n positions: [\n { str: 3, fret: 6 },\n { str: 4, fret: 25 },\n ],\n duration: '4',\n },\n {\n positions: [\n { str: 2, fret: 10 },\n { str: 5, fret: 12 },\n ],\n duration: '8',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '8',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '16',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '32',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '64',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '128',\n },\n ];\n const notes = specs.map((struct) => {\n const tabNote = new TabNote(struct);\n tabNote.render_options.draw_stem = true;\n return tabNote;\n });\n const voice = new Voice(Flow.TIME4_4).setMode(VoiceMode.SOFT);\n voice.addTickables(notes);\n new Formatter().joinVoices([voice]).formatToStave([voice], stave);\n voice.draw(ctx, stave);\n ok(true, 'TabNotes successfully drawn');\n}\nfunction drawStemsDown(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 600, 200);\n ctx.font = '10pt Arial';\n const stave = new TabStave(10, 10, 550);\n stave.setContext(ctx);\n stave.draw();\n const specs = [\n {\n positions: [\n { str: 3, fret: 6 },\n { str: 4, fret: 25 },\n ],\n duration: '4',\n },\n {\n positions: [\n { str: 2, fret: 10 },\n { str: 5, fret: 12 },\n ],\n duration: '8',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '8',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '16',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '32',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '64',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '128',\n },\n ];\n const notes = specs.map((struct) => {\n const tabNote = new TabNote(struct);\n tabNote.render_options.draw_stem = true;\n tabNote.setStemDirection(-1);\n return tabNote;\n });\n const voice = new Voice(Flow.TIME4_4).setMode(VoiceMode.SOFT);\n voice.addTickables(notes);\n new Formatter().joinVoices([voice]).formatToStave([voice], stave);\n voice.draw(ctx, stave);\n ok(true, 'All objects have been drawn');\n}\nfunction drawStemsUpThrough(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 600, 200);\n ctx.font = '10pt Arial';\n const stave = new TabStave(10, 30, 550);\n stave.setContext(ctx);\n stave.draw();\n const specs = [\n {\n positions: [\n { str: 3, fret: 6 },\n { str: 4, fret: 25 },\n ],\n duration: '4',\n },\n {\n positions: [\n { str: 2, fret: 10 },\n { str: 5, fret: 12 },\n ],\n duration: '8',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '8',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '16',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '32',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '64',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '128',\n },\n ];\n const notes = specs.map((struct) => {\n const tabNote = new TabNote(struct);\n tabNote.render_options.draw_stem = true;\n tabNote.render_options.draw_stem_through_stave = true;\n return tabNote;\n });\n ctx.setFont(Font.SANS_SERIF, 10, FontWeight.BOLD);\n const voice = new Voice(Flow.TIME4_4).setMode(VoiceMode.SOFT);\n voice.addTickables(notes);\n new Formatter().joinVoices([voice]).formatToStave([voice], stave);\n voice.draw(ctx, stave);\n ok(true, 'TabNotes successfully drawn');\n}\nfunction drawStemsDownThrough(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 600, 250);\n ctx.font = '10pt Arial';\n const stave = new TabStave(10, 10, 550, { num_lines: 8 });\n stave.setContext(ctx);\n stave.draw();\n const specs = [\n {\n positions: [\n { str: 3, fret: 6 },\n { str: 4, fret: 25 },\n ],\n duration: '4',\n },\n {\n positions: [\n { str: 2, fret: 10 },\n { str: 5, fret: 12 },\n ],\n duration: '8',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '8',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '16',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n { str: 6, fret: 10 },\n ],\n duration: '32',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '64',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 3, fret: 5 },\n { str: 5, fret: 5 },\n { str: 7, fret: 5 },\n ],\n duration: '128',\n },\n ];\n const notes = specs.map((struct) => {\n const tabNote = new TabNote(struct);\n tabNote.render_options.draw_stem = true;\n tabNote.render_options.draw_stem_through_stave = true;\n tabNote.setStemDirection(-1);\n return tabNote;\n });\n ctx.setFont('Arial', 10, 'bold');\n const voice = new Voice(Flow.TIME4_4).setMode(VoiceMode.SOFT);\n voice.addTickables(notes);\n new Formatter().joinVoices([voice]).formatToStave([voice], stave);\n voice.draw(ctx, stave);\n ok(true, 'All objects have been drawn');\n}\nfunction drawStemsDotted(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 600, 200);\n ctx.font = '10pt Arial';\n const stave = new TabStave(10, 10, 550);\n stave.setContext(ctx);\n stave.draw();\n const specs = [\n {\n positions: [\n { str: 3, fret: 6 },\n { str: 4, fret: 25 },\n ],\n duration: '4d',\n },\n {\n positions: [\n { str: 2, fret: 10 },\n { str: 5, fret: 12 },\n ],\n duration: '8',\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '4dd',\n stem_direction: -1,\n },\n {\n positions: [\n { str: 1, fret: 6 },\n { str: 4, fret: 5 },\n ],\n duration: '16',\n stem_direction: -1,\n },\n ];\n const notes = specs.map((struct) => new TabNote(struct, true /* draw_stem */));\n Dot.buildAndAttach([notes[0], notes[2], notes[2]]);\n const voice = new Voice(Flow.TIME4_4).setMode(VoiceMode.SOFT);\n voice.addTickables(notes);\n new Formatter().joinVoices([voice]).formatToStave([voice], stave);\n voice.draw(ctx, stave);\n ok(true, 'TabNotes successfully drawn');\n}\nVexFlowTests.register(TabNoteTests);\nexport { TabNoteTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// TabSlide Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Flow } from '../src/flow';\nimport { Formatter } from '../src/formatter';\nimport { TabNote } from '../src/tabnote';\nimport { TabSlide } from '../src/tabslide';\nimport { TabStave } from '../src/tabstave';\nimport { Voice } from '../src/voice';\nconst TabSlideTests = {\n Start() {\n QUnit.module('TabSlide');\n const run = VexFlowTests.runTests;\n run('Simple TabSlide', simple);\n run('Slide Up', slideUp);\n run('Slide Down', slideDown);\n },\n};\nfunction tieNotes(notes, indices, stave, ctx) {\n const voice = new Voice(Flow.TIME4_4);\n voice.addTickables(notes);\n new Formatter().joinVoices([voice]).format([voice], 100);\n voice.draw(ctx, stave);\n const tie = new TabSlide({\n first_note: notes[0],\n last_note: notes[1],\n first_indices: indices,\n last_indices: indices,\n }, TabSlide.SLIDE_UP);\n tie.setContext(ctx);\n tie.draw();\n}\nfunction setupContext(options, width) {\n // eslint-disable-next-line\n const context = options.contextBuilder(options.elementId, 350, 140);\n context.scale(0.9, 0.9);\n context.fillStyle = '#221';\n context.strokeStyle = '#221';\n context.font = '10pt Arial';\n const stave = new TabStave(10, 10, width || 350).addTabGlyph().setContext(context).draw();\n return { context, stave };\n}\n// Helper function to create TabNote objects.\nconst tabNote = (noteStruct) => new TabNote(noteStruct);\n/**\n * Test Case\n */\nfunction simple(options, contextBuilder) {\n options.contextBuilder = contextBuilder;\n const { stave, context } = setupContext(options);\n tieNotes([\n tabNote({ positions: [{ str: 4, fret: 4 }], duration: 'h' }),\n tabNote({ positions: [{ str: 4, fret: 6 }], duration: 'h' }),\n ], [0], stave, context);\n ok(true, 'Simple Test');\n}\n/**\n * The slideUp and slideDown tests pass in a builder function: TabSlide.createSlideUp | TabSlide.createSlideDown.\n */\nfunction multiTest(options, buildTabSlide) {\n const { context, stave } = setupContext(options, 440);\n const notes = [\n tabNote({ positions: [{ str: 4, fret: 4 }], duration: '8' }),\n tabNote({ positions: [{ str: 4, fret: 4 }], duration: '8' }),\n tabNote({\n positions: [\n { str: 4, fret: 4 },\n { str: 5, fret: 4 },\n ],\n duration: '8',\n }),\n tabNote({\n positions: [\n { str: 4, fret: 6 },\n { str: 5, fret: 6 },\n ],\n duration: '8',\n }),\n tabNote({ positions: [{ str: 2, fret: 14 }], duration: '8' }),\n tabNote({ positions: [{ str: 2, fret: 16 }], duration: '8' }),\n tabNote({\n positions: [\n { str: 2, fret: 14 },\n { str: 3, fret: 14 },\n ],\n duration: '8',\n }),\n tabNote({\n positions: [\n { str: 2, fret: 16 },\n { str: 3, fret: 16 },\n ],\n duration: '8',\n }),\n ];\n const voice = new Voice(Flow.TIME4_4).addTickables(notes);\n new Formatter().joinVoices([voice]).format([voice], 300);\n voice.draw(context, stave);\n buildTabSlide({\n first_note: notes[0],\n last_note: notes[1],\n first_indices: [0],\n last_indices: [0],\n })\n .setContext(context)\n .draw();\n ok(true, 'Single note');\n buildTabSlide({\n first_note: notes[2],\n last_note: notes[3],\n first_indices: [0, 1],\n last_indices: [0, 1],\n })\n .setContext(context)\n .draw();\n ok(true, 'Chord');\n buildTabSlide({\n first_note: notes[4],\n last_note: notes[5],\n first_indices: [0],\n last_indices: [0],\n })\n .setContext(context)\n .draw();\n ok(true, 'Single note high-fret');\n buildTabSlide({\n first_note: notes[6],\n last_note: notes[7],\n first_indices: [0, 1],\n last_indices: [0, 1],\n })\n .setContext(context)\n .draw();\n ok(true, 'Chord high-fret');\n}\nfunction slideUp(options, contextBuilder) {\n options.contextBuilder = contextBuilder;\n multiTest(options, TabSlide.createSlideUp);\n}\nfunction slideDown(options, contextBuilder) {\n options.contextBuilder = contextBuilder;\n multiTest(options, TabSlide.createSlideDown);\n}\nVexFlowTests.register(TabSlideTests);\nexport { TabSlideTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// TabStave Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { TabStave } from '../src/tabstave';\nconst TabStaveTests = {\n Start() {\n QUnit.module('TabStave');\n const run = VexFlowTests.runTests;\n run('TabStave Draw Test', draw);\n },\n};\nfunction draw(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 400, 160);\n const stave = new TabStave(10, 10, 300);\n stave.setNumLines(6);\n stave.setContext(ctx);\n stave.draw();\n equal(stave.getYForNote(0), 127, 'getYForNote(0)');\n equal(stave.getYForLine(5), 127, 'getYForLine(5)');\n equal(stave.getYForLine(0), 62, 'getYForLine(0) - Top Line');\n equal(stave.getYForLine(4), 114, 'getYForLine(4) - Bottom Line');\n ok(true, 'all pass');\n}\nVexFlowTests.register(TabStaveTests);\nexport { TabStaveTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// TabTie Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Annotation } from '../src/annotation';\nimport { Flow } from '../src/flow';\nimport { Formatter } from '../src/formatter';\nimport { TabNote } from '../src/tabnote';\nimport { TabStave } from '../src/tabstave';\nimport { TabTie } from '../src/tabtie';\nimport { Voice } from '../src/voice';\nconst TabTieTests = {\n Start() {\n QUnit.module('TabTie');\n const run = VexFlowTests.runTests;\n run('Simple TabTie', simple);\n run('Hammerons', simpleHammerOn);\n run('Pulloffs', simplePullOff);\n run('Tapping', tap);\n run('Continuous', continuous);\n },\n};\n/**\n * Helper function to create TabNote objects.\n */\nconst tabNote = (noteStruct) => new TabNote(noteStruct);\n/**\n * Helper function to create a RenderContext and TabStave.\n */\nfunction setupContext(options, w = 0, h = 0) {\n // eslint-disable-next-line\n const context = options.contextBuilder(options.elementId, w || 350, h || 160);\n context.fillStyle = '#221';\n context.strokeStyle = '#221';\n context.setFont('Arial', VexFlowTests.Font.size);\n const stave = new TabStave(10, 10, w || 350).addTabGlyph().setContext(context).draw();\n return { context, stave };\n}\n/**\n * Helper function to create the TabTie between two Note objects.\n */\nfunction tieNotes(notes, indices, stave, ctx, text) {\n const voice = new Voice(Flow.TIME4_4);\n voice.addTickables(notes);\n new Formatter().joinVoices([voice]).format([voice], 100);\n voice.draw(ctx, stave);\n const tie = new TabTie({\n first_note: notes[0],\n last_note: notes[1],\n first_indices: indices,\n last_indices: indices,\n }, text !== null && text !== void 0 ? text : 'Annotation');\n tie.setContext(ctx);\n tie.draw();\n}\n/**\n * Two notes on string 4 with a tie drawn between them.\n */\nfunction simple(options, contextBuilder) {\n options.contextBuilder = contextBuilder;\n const { context, stave } = setupContext(options);\n const note1 = tabNote({ positions: [{ str: 4, fret: 4 }], duration: 'h' });\n const note2 = tabNote({ positions: [{ str: 4, fret: 6 }], duration: 'h' });\n tieNotes([note1, note2], [0], stave, context);\n ok(true, 'Simple Test');\n}\nfunction simpleHammerOn(options, contextBuilder) {\n options.contextBuilder = contextBuilder;\n multiTest(options, TabTie.createHammeron);\n}\nfunction simplePullOff(options, contextBuilder) {\n options.contextBuilder = contextBuilder;\n multiTest(options, TabTie.createPulloff);\n}\n/**\n * Helper function for the two test cases above (simpleHammerOn and simplePullOff).\n */\nfunction multiTest(options, createTabTie) {\n const { context, stave } = setupContext(options, 440, 140);\n const notes = [\n tabNote({ positions: [{ str: 4, fret: 4 }], duration: '8' }),\n tabNote({ positions: [{ str: 4, fret: 4 }], duration: '8' }),\n tabNote({\n positions: [\n { str: 4, fret: 4 },\n { str: 5, fret: 4 },\n ],\n duration: '8',\n }),\n tabNote({\n positions: [\n { str: 4, fret: 6 },\n { str: 5, fret: 6 },\n ],\n duration: '8',\n }),\n tabNote({ positions: [{ str: 2, fret: 14 }], duration: '8' }),\n tabNote({ positions: [{ str: 2, fret: 16 }], duration: '8' }),\n tabNote({\n positions: [\n { str: 2, fret: 14 },\n { str: 3, fret: 14 },\n ],\n duration: '8',\n }),\n tabNote({\n positions: [\n { str: 2, fret: 16 },\n { str: 3, fret: 16 },\n ],\n duration: '8',\n }),\n ];\n const voice = new Voice(Flow.TIME4_4).addTickables(notes);\n new Formatter().joinVoices([voice]).format([voice], 300);\n voice.draw(context, stave);\n createTabTie({\n first_note: notes[0],\n last_note: notes[1],\n first_indices: [0],\n last_indices: [0],\n })\n .setContext(context)\n .draw();\n ok(true, 'Single note');\n createTabTie({\n first_note: notes[2],\n last_note: notes[3],\n first_indices: [0, 1],\n last_indices: [0, 1],\n })\n .setContext(context)\n .draw();\n ok(true, 'Chord');\n createTabTie({\n first_note: notes[4],\n last_note: notes[5],\n first_indices: [0],\n last_indices: [0],\n })\n .setContext(context)\n .draw();\n ok(true, 'Single note high-fret');\n createTabTie({\n first_note: notes[6],\n last_note: notes[7],\n first_indices: [0, 1],\n last_indices: [0, 1],\n })\n .setContext(context)\n .draw();\n ok(true, 'Chord high-fret');\n}\nfunction tap(options, contextBuilder) {\n options.contextBuilder = contextBuilder;\n const { context, stave } = setupContext(options);\n const note1 = tabNote({ positions: [{ str: 4, fret: 12 }], duration: 'h' }).addModifier(new Annotation('T'), 0);\n const note2 = tabNote({ positions: [{ str: 4, fret: 10 }], duration: 'h' });\n tieNotes([note1, note2], [0], stave, context, 'P');\n ok(true, 'Tapping Test');\n}\nfunction continuous(options, contextBuilder) {\n options.contextBuilder = contextBuilder;\n const { context, stave } = setupContext(options, 440, 140);\n const notes = [\n tabNote({ positions: [{ str: 4, fret: 4 }], duration: 'q' }),\n tabNote({ positions: [{ str: 4, fret: 5 }], duration: 'q' }),\n tabNote({ positions: [{ str: 4, fret: 6 }], duration: 'h' }),\n ];\n const voice = new Voice(Flow.TIME4_4).addTickables(notes);\n new Formatter().joinVoices([voice]).format([voice], 300);\n voice.draw(context, stave);\n TabTie.createHammeron({\n first_note: notes[0],\n last_note: notes[1],\n first_indices: [0],\n last_indices: [0],\n })\n .setContext(context)\n .draw();\n TabTie.createPulloff({\n first_note: notes[1],\n last_note: notes[2],\n first_indices: [0],\n last_indices: [0],\n })\n .setContext(context)\n .draw();\n ok(true, 'Continuous Hammeron');\n}\nVexFlowTests.register(TabTieTests);\nexport { TabTieTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// TextBracket Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nconst TextBracketTests = {\n Start() {\n QUnit.module('TextBracket');\n const run = VexFlowTests.runTests;\n run('Simple TextBracket', simple0);\n run('TextBracket Styles', simple1);\n },\n};\nfunction simple0(options) {\n const f = VexFlowTests.makeFactory(options, 550);\n const stave = f.Stave();\n const score = f.EasyScore();\n const notes = score.notes('c4/4, c4, c4, c4, c4', { stem: 'up' });\n const voice = score.voice(notes, { time: '5/4' });\n f.TextBracket({\n from: notes[0],\n to: notes[4],\n text: '15',\n options: {\n superscript: 'va',\n position: 'top',\n },\n });\n f.TextBracket({\n from: notes[0],\n to: notes[4],\n text: '8',\n options: {\n superscript: 'vb',\n position: 'bottom',\n line: 3,\n },\n });\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true);\n}\nfunction simple1(options) {\n const f = VexFlowTests.makeFactory(options, 550);\n const stave = f.Stave();\n const score = f.EasyScore();\n const notes = score.notes('c4/4, c4, c4, c4, c4', { stem: 'up' });\n const voice = score.voice(notes, { time: '5/4' });\n const topOctaves = [\n f.TextBracket({\n from: notes[0],\n to: notes[1],\n text: 'Cool notes',\n options: {\n superscript: '',\n position: 'top',\n },\n }),\n f.TextBracket({\n from: notes[2],\n to: notes[4],\n text: 'Testing',\n options: {\n position: 'top',\n superscript: 'superscript',\n // weight & style below can be left undefined. They will fall back to the default defined in textbracket.ts.\n font: { family: 'Arial', size: 15, weight: 'normal', style: 'normal' },\n },\n }),\n ];\n const bottomOctaves = [\n f.TextBracket({\n from: notes[0],\n to: notes[1],\n text: '8',\n options: {\n superscript: 'vb',\n position: 'bottom',\n line: 3,\n font: { size: 30 },\n },\n }),\n f.TextBracket({\n from: notes[2],\n to: notes[4],\n text: 'Not cool notes',\n options: {\n superscript: ' super uncool',\n position: 'bottom',\n line: 4,\n },\n }),\n ];\n topOctaves[1].render_options.line_width = 2;\n topOctaves[1].render_options.show_bracket = false;\n bottomOctaves[0].render_options.underline_superscript = false;\n bottomOctaves[0].setDashed(false);\n bottomOctaves[1].render_options.bracket_height = 40;\n bottomOctaves[1].setDashed(true, [2, 2]);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true);\n}\nVexFlowTests.register(TextBracketTests);\nexport { TextBracketTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// TextFormatter Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { TextFormatter } from '../src/textformatter';\nconst TextFormatterTests = {\n Start() {\n QUnit.module('TextFormatter');\n test('Basic', basic);\n },\n};\nfunction basic() {\n var _a;\n // See: src/fonts/loadTextFonts.ts\n const registeredFamilies = TextFormatter.getFontFamilies();\n equal(registeredFamilies.length, 2, `There are two registered font families: 'Roboto Slab' & 'PetalumaScript'`);\n // Verify the advanceWidth and other metrics by opening the font file with a glyph inspector:\n // https://fontdrop.info/\n // https://opentype.js.org/glyph-inspector.html\n const petalumaFormatterInfo = TextFormatter.getInfo('PetalumaScript');\n equal((_a = petalumaFormatterInfo === null || petalumaFormatterInfo === void 0 ? void 0 : petalumaFormatterInfo.glyphs) === null || _a === void 0 ? void 0 : _a.C.advanceWidth, 623, 'PetalumaScript advanceWidth of C character is 623.');\n const formatterForPetalumaScript = TextFormatter.create({ family: 'PetalumaScript', size: '100px' });\n const metricsPetalumaScriptH = formatterForPetalumaScript.getGlyphMetrics('H');\n equal(metricsPetalumaScriptH.leftSideBearing, 37);\n const formatterForRobotoSlab = TextFormatter.create({ family: 'Roboto Slab', size: '100px', style: 'italic' });\n const metricsRobotoSlabH = formatterForRobotoSlab.getGlyphMetrics('H');\n equal(metricsRobotoSlabH.advanceWidth, 1578);\n // eslint-disable-next-line\n // @ts-ignore direct access to protected variable .cacheKey\n equal(formatterForRobotoSlab.cacheKey, 'Roboto_Slab%75%normal%normal');\n}\nVexFlowTests.register(TextFormatterTests);\nexport { TextFormatterTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Text Note Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Crescendo } from '../src/crescendo';\nimport { Flow } from '../src/flow';\nimport { Font } from '../src/font';\nimport { Note } from '../src/note';\nimport { Stave } from '../src/stave';\nimport { TextNote } from '../src/textnote';\nconst TextNoteTests = {\n Start() {\n QUnit.module('TextNote');\n const run = VexFlowTests.runTests;\n run('TextNote Formatting', formatTextNotes);\n run('TextNote Formatting 2', formatTextNotes2);\n run('TextNote Superscript and Subscript', superscriptAndSubscript);\n run('TextNote Formatting With Glyphs 0', formatTextGlyphs0);\n run('TextNote Formatting With Glyphs 1', formatTextGlyphs1);\n run('Crescendo', crescendo);\n run('Text Dynamics', textDynamics);\n },\n};\nfunction formatTextNotes(options) {\n const f = VexFlowTests.makeFactory(options, 400, 200);\n const stave = f.Stave({ y: 40 });\n const score = f.EasyScore();\n const voice1 = score.voice([\n f\n .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], stem_direction: -1, duration: 'h' })\n .addModifier(f.Accidental({ type: 'b' }), 0)\n .addModifier(f.Accidental({ type: '#' }), 1),\n f.StaveNote({ keys: ['d/4', 'e/4', 'f/4'], stem_direction: -1, duration: 'q' }),\n f\n .StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: 'q' })\n .addModifier(f.Accidental({ type: 'n' }), 0)\n .addModifier(f.Accidental({ type: '#' }), 1),\n ]);\n const voice2 = score.voice([\n f.TextNote({ text: 'Center Justification', duration: 'h' }).setJustification(TextNote.Justification.CENTER),\n f.TextNote({ text: 'Left Line 1', duration: 'q' }).setLine(1),\n f.TextNote({ text: 'Right', duration: 'q' }).setJustification(TextNote.Justification.RIGHT),\n ]);\n const formatter = f.Formatter();\n formatter.joinVoices([voice1, voice2]).formatToStave([voice1, voice2], stave);\n f.draw();\n ok(true);\n}\nfunction formatTextNotes2(options) {\n const f = VexFlowTests.makeFactory(options, 600, 200);\n const stave = f.Stave({ y: 40 });\n const score = f.EasyScore();\n const voice1 = score.voice([\n f.StaveNote({ keys: ['g/4'], stem_direction: 1, duration: '16' }),\n f.StaveNote({ keys: ['g/4'], stem_direction: 1, duration: '16' }),\n f.StaveNote({ keys: ['g/4'], stem_direction: 1, duration: '16' }),\n f.StaveNote({ keys: ['g/5'], stem_direction: -1, duration: '16' }),\n f.StaveNote({ keys: ['g/5'], stem_direction: -1, duration: '16' }),\n f.StaveNote({ keys: ['g/5'], stem_direction: -1, duration: '16' }),\n f.StaveNote({ keys: ['g/5', 'a/5'], stem_direction: -1, duration: '16' }),\n f.StaveNote({ keys: ['g/5', 'a/5'], stem_direction: -1, duration: '16' }),\n f.StaveNote({ keys: ['g/5', 'a/5'], stem_direction: -1, duration: '16' }),\n f.StaveNote({ keys: ['g/4', 'a/4'], stem_direction: 1, duration: '16' }),\n f.StaveNote({ keys: ['g/4', 'a/4'], stem_direction: 1, duration: '16' }),\n f.StaveNote({ keys: ['g/4', 'a/4'], stem_direction: 1, duration: '16' }),\n f.StaveNote({ keys: ['g/4', 'a/4'], stem_direction: 1, duration: 'q' }),\n ]);\n const voice2 = score.voice([\n f.TextNote({ text: 'C', duration: '16' }).setJustification(TextNote.Justification.CENTER),\n f.TextNote({ text: 'L', duration: '16' }),\n f.TextNote({ text: 'R', duration: '16' }).setJustification(TextNote.Justification.RIGHT),\n f.TextNote({ text: 'C', duration: '16' }).setJustification(TextNote.Justification.CENTER),\n f.TextNote({ text: 'L', duration: '16' }),\n f.TextNote({ text: 'R', duration: '16' }).setJustification(TextNote.Justification.RIGHT),\n f.TextNote({ text: 'C', duration: '16' }).setJustification(TextNote.Justification.CENTER),\n f.TextNote({ text: 'L', duration: '16' }),\n f.TextNote({ text: 'R', duration: '16' }).setJustification(TextNote.Justification.RIGHT),\n f.TextNote({ text: 'C', duration: '16' }).setJustification(TextNote.Justification.CENTER),\n f.TextNote({ text: 'L', duration: '16' }),\n f.TextNote({ text: 'R', duration: '16' }).setJustification(TextNote.Justification.RIGHT),\n f.TextNote({ text: 'R', duration: 'q' }).setJustification(TextNote.Justification.RIGHT),\n ]);\n f.Formatter().joinVoices([voice1, voice2]).formatToStave([voice1, voice2], stave);\n voice2.getTickables().forEach((note) => Note.plotMetrics(f.getContext(), note, 170));\n f.draw();\n ok(true);\n}\nfunction superscriptAndSubscript(options) {\n const f = VexFlowTests.makeFactory(options, 600, 230);\n const stave = f.Stave({ y: 40 });\n const score = f.EasyScore();\n const voice1 = score.voice([\n f\n .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], stem_direction: 1, duration: 'h' })\n .addModifier(f.Accidental({ type: 'b' }), 0)\n .addModifier(f.Accidental({ type: '#' }), 1),\n f.StaveNote({ keys: ['d/4', 'e/4', 'f/4'], stem_direction: 1, duration: 'q' }),\n f\n .StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: 1, duration: 'q' })\n .addModifier(f.Accidental({ type: 'n' }), 0)\n .addModifier(f.Accidental({ type: '#' }), 1),\n ]);\n const voice2 = score.voice([\n f.TextNote({ text: Flow.unicode.flat + 'I', superscript: '+5', duration: '8' }),\n f.TextNote({ text: 'D' + Flow.unicode.sharp + '/F', duration: '4d', superscript: 'sus2' }),\n f.TextNote({ text: 'ii', superscript: '6', subscript: '4', duration: '8' }),\n f.TextNote({ text: 'C', superscript: Flow.unicode.triangle + '7', subscript: '', duration: '8' }),\n f.TextNote({ text: 'vii', superscript: Flow.unicode['o-with-slash'] + '7', duration: '8' }),\n f.TextNote({ text: 'V', superscript: '7', duration: '8' }),\n ]);\n voice2.getTickables().forEach((note) => {\n const textNote = note;\n textNote.setFont({ family: Font.SERIF, size: 15 });\n textNote.setLine(13);\n textNote.setJustification(TextNote.Justification.LEFT);\n });\n f.Formatter().joinVoices([voice1, voice2]).formatToStave([voice1, voice2], stave);\n f.draw();\n ok(true);\n}\nfunction formatTextGlyphs0(options) {\n const f = VexFlowTests.makeFactory(options, 600, 230);\n const stave = f.Stave({ y: 40 });\n const score = f.EasyScore();\n const voice1 = score.voice([\n f\n .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], stem_direction: -1, duration: 'h' })\n .addModifier(f.Accidental({ type: 'b' }), 0)\n .addModifier(f.Accidental({ type: '#' }), 1),\n f.StaveNote({ keys: ['d/4', 'e/4', 'f/4'], stem_direction: -1, duration: '8' }),\n f.StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: '8' }),\n f.StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: '8' }),\n f.StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: '8' }),\n ]);\n const voice2 = score.voice([\n f.TextNote({ text: 'Center', duration: '8' }).setJustification(TextNote.Justification.CENTER),\n f.TextNote({ glyph: 'f', duration: '8' }),\n f.TextNote({ glyph: 'p', duration: '8' }),\n f.TextNote({ glyph: 'm', duration: '8' }),\n f.TextNote({ glyph: 'z', duration: '8' }),\n f.TextNote({ glyph: 'mordent_upper', duration: '16' }),\n f.TextNote({ glyph: 'mordent_lower', duration: '16' }),\n f.TextNote({ glyph: 'segno', duration: '8' }),\n f.TextNote({ glyph: 'coda', duration: '8' }),\n ]);\n voice2.getTickables().forEach((n) => n.setJustification(TextNote.Justification.CENTER));\n f.Formatter().joinVoices([voice1, voice2]).formatToStave([voice1, voice2], stave);\n f.draw();\n ok(true);\n}\nfunction formatTextGlyphs1(options) {\n const f = VexFlowTests.makeFactory(options, 600, 230);\n const stave = f.Stave({ y: 40 });\n const score = f.EasyScore();\n const voice1 = score.voice([\n f\n .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], stem_direction: -1, duration: 'h' })\n .addModifier(f.Accidental({ type: 'b' }), 0)\n .addModifier(f.Accidental({ type: '#' }), 1),\n f.StaveNote({ keys: ['d/4', 'e/4', 'f/4'], stem_direction: -1, duration: '8' }),\n f.StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: '8' }),\n f.StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: '8' }),\n f.StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: '8' }),\n ]);\n const voice2 = score.voice([\n f.TextNote({ glyph: 'turn', duration: '16' }),\n f.TextNote({ glyph: 'turn_inverted', duration: '16' }),\n f.TextNote({ glyph: 'pedal_open', duration: '8' }).setLine(10),\n f.TextNote({ glyph: 'pedal_close', duration: '8' }).setLine(10),\n f.TextNote({ glyph: 'caesura_curved', duration: '8' }).setLine(3),\n f.TextNote({ glyph: 'caesura_straight', duration: '8' }).setLine(3),\n f.TextNote({ glyph: 'breath', duration: '8' }).setLine(2),\n f.TextNote({ glyph: 'tick', duration: '8' }).setLine(3),\n f.TextNote({ glyph: 'tr', duration: '8', smooth: true }).setJustification(TextNote.Justification.CENTER),\n ]);\n voice2.getTickables().forEach((n) => n.setJustification(TextNote.Justification.CENTER));\n f.Formatter().joinVoices([voice1, voice2]).formatToStave([voice1, voice2], stave);\n f.draw();\n ok(true);\n}\nfunction crescendo(options) {\n const f = VexFlowTests.makeFactory(options, 600, 230);\n const stave = f.Stave({ y: 40 });\n const score = f.EasyScore();\n const voice = score.voice([\n f.TextNote({ glyph: 'p', duration: '16' }),\n new Crescendo({ duration: '4d' }).setLine(0).setHeight(25).setStave(stave),\n f.TextNote({ glyph: 'f', duration: '16' }),\n new Crescendo({ duration: '4' }).setLine(5).setStave(stave),\n new Crescendo({ duration: '4' }).setLine(10).setDecrescendo(true).setHeight(5).setStave(stave),\n ]);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true);\n}\nfunction textDynamics(options) {\n const f = VexFlowTests.makeFactory(options, 600, 230);\n const score = f.EasyScore();\n const voice = score.voice([\n f.TextDynamics({ text: 'sfz', duration: '4' }),\n f.TextDynamics({ text: 'rfz', duration: '4' }),\n f.TextDynamics({ text: 'mp', duration: '4' }),\n f.TextDynamics({ text: 'ppp', duration: '4' }),\n f.TextDynamics({ text: 'fff', duration: '4' }),\n f.TextDynamics({ text: 'mf', duration: '4' }),\n f.TextDynamics({ text: 'sff', duration: '4' }),\n ], { time: '7/4' });\n // This is refactored to use preCalculateMinWidth... to exercise\n // a bug fix when textDynamic got formatted more than once.\n const formatter = f.Formatter();\n formatter.joinVoices([voice]);\n // const width = 250; //formatter.preCalculateMinTotalWidth([voice]);\n const width = formatter.preCalculateMinTotalWidth([voice]);\n formatter.format([voice]);\n const stave = f.Stave({ y: 40, width: width + Stave.defaultPadding });\n stave.draw();\n voice.draw(f.getContext(), stave);\n ok(true);\n}\nVexFlowTests.register(TextNoteTests);\nexport { TextNoteTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Three Voices Tests - Three voices in single staff.\nimport { concat, VexFlowTests } from './vexflow_test_helpers';\nimport { Beam } from '../src/beam';\nconst ThreeVoicesTests = {\n Start() {\n // TODO: Rename the module to 'Three Voices', because we aren't really testing rests.\n QUnit.module('Three Voice Rests');\n const run = VexFlowTests.runTests;\n run('Three Voices - #1', threeVoices1);\n run('Three Voices - #2 Complex', threeVoices2);\n run('Three Voices - #3', threeVoices3);\n run('Auto Adjust Rest Positions - Two Voices', autoRestTwoVoices);\n run('Auto Adjust Rest Positions - Three Voices #1', autoRestThreeVoices1);\n run('Auto Adjust Rest Positions - Three Voices #2', autoRestThreeVoices2);\n },\n};\n/**\n * Helper for setting up the first three test cases: threeVoices1, threeVoices2, threeVoices3.\n */\nfunction createThreeVoicesTest(noteGroup1, noteGroup2, noteGroup3, setup) {\n return (options) => {\n const factory = VexFlowTests.makeFactory(options, 600, 200);\n const stave = factory.Stave().addClef('treble').addTimeSignature('4/4');\n const score = factory.EasyScore();\n // Convert each noteGroup array to StaveNote[].\n const noteGroups = [noteGroup1, noteGroup2, noteGroup3].map((args) => score.notes(...args));\n const voices = noteGroups.map((notes) => score.voice(notes));\n setup(factory, voices);\n const beams = [\n Beam.applyAndGetBeams(voices[0], +1),\n Beam.applyAndGetBeams(voices[1], -1),\n Beam.applyAndGetBeams(voices[2], -1),\n ].reduce(concat);\n // Set option to position rests near the notes in each voice.\n factory.Formatter().joinVoices(voices).formatToStave(voices, stave);\n factory.draw();\n for (let i = 0; i < beams.length; i++) {\n beams[i].setContext(factory.getContext()).draw();\n }\n ok(true);\n };\n}\n/**\n *\n */\nconst threeVoices1 = createThreeVoicesTest(['e5/2, e5', { stem: 'up' }], ['(d4 a4 d#5)/8, b4, (d4 a4 c5), b4, (d4 a4 c5), b4, (d4 a4 c5), b4', { stem: 'down' }], ['b3/4, e3, f3, a3', { stem: 'down' }], (f, voices) => {\n voices[0].getTickables()[0].addModifier(f.Fingering({ number: '0', position: 'left' }), 0);\n voices[1]\n .getTickables()[0]\n .addModifier(f.Fingering({ number: '0', position: 'left' }), 0)\n .addModifier(f.Fingering({ number: '4', position: 'left' }), 1);\n});\n/**\n * Lots of beamed notes. A beam and notehead overlap.\n */\nconst threeVoices2 = createThreeVoicesTest(['(a4 e5)/16, e5, e5, e5, e5/8, e5, e5/2', { stem: 'up' }], ['(d4 d#5)/16, (b4 c5), d5, e5, (d4 a4 c5)/8, b4, (d4 a4 c5), b4, (d4 a4 c5), b4', { stem: 'down' }], ['b3/8, b3, e3/4, f3, a3', { stem: 'down' }], (f, voices) => {\n voices[0]\n .getTickables()[0]\n .addModifier(f.Fingering({ number: '2', position: 'left' }), 0)\n .addModifier(f.Fingering({ number: '0', position: 'above' }), 1);\n voices[1]\n .getTickables()[0]\n .addModifier(f.Fingering({ number: '0', position: 'left' }), 0)\n .addModifier(f.Fingering({ number: '4', position: 'left' }), 1);\n});\n/**\n *\n */\nconst threeVoices3 = createThreeVoicesTest(['(g4 e5)/4, e5, (g4 e5)/2', { stem: 'up' }], ['c#5/4, b4/8, b4/8/r, a4/4., g4/8', { stem: 'down' }], ['c4/4, b3, a3, g3', { stem: 'down' }], (f, voices) => {\n voices[0]\n .getTickables()[0]\n .addModifier(f.Fingering({ number: '0', position: 'left' }), 0)\n .addModifier(f.Fingering({ number: '0', position: 'left' }), 1);\n voices[1].getTickables()[0].addModifier(f.Fingering({ number: '1', position: 'left' }), 0);\n voices[2].getTickables()[0].addModifier(f.Fingering({ number: '3', position: 'left' }), 0);\n});\nfunction autoRestTwoVoices(options) {\n const f = VexFlowTests.makeFactory(options, 900, 200);\n const score = f.EasyScore();\n let x = 10;\n let beams = [];\n function createMeasure(measureTitle, width, align_rests) {\n const stave = f.Stave({ x: x, y: 50, width: width }).setBegBarType(1);\n x += width;\n const noteArrays = [\n score.notes('b4/8/r, e5/16, b4/r, b4/8/r, e5/16, b4/r, b4/8/r, d5/16, b4/r, e5/4', { stem: 'up' }),\n score.notes('c5/16, c4, b4/r, d4, e4, f4, b4/r, g4, g4[stem=\"up\"], a4[stem=\"up\"], b4/r, b4[stem=\"up\"], e4/4', {\n stem: 'down',\n }),\n [f.TextNote({ text: measureTitle, line: -1, duration: '1', smooth: true })],\n ];\n const voices = noteArrays.map((notes) => score.voice(notes));\n beams = beams.concat(Beam.applyAndGetBeams(voices[0], 1)).concat(Beam.applyAndGetBeams(voices[1], -1));\n f.Formatter().joinVoices(voices).formatToStave(voices, stave, { align_rests });\n }\n createMeasure('Default Rest Positions', 400, false);\n createMeasure('Rests Repositioned To Avoid Collisions', 400, true);\n f.draw();\n for (let i = 0; i < beams.length; i++) {\n beams[i].setContext(f.getContext()).draw();\n }\n ok(true, 'Auto Adjust Rests - Two Voices');\n}\nfunction autoRestThreeVoices1(options) {\n const f = VexFlowTests.makeFactory(options, 850, 200);\n const score = f.EasyScore();\n let x = 10;\n function createMeasure(measureTitle, width, align_rests) {\n const stave = f.Stave({ x: x, y: 50, width: width }).setBegBarType(1);\n const voices = [\n score.voice(score.notes('b4/4/r, e5, e5/r, e5/r, e5, e5, e5, e5/r', { stem: 'up' }), { time: '8/4' }),\n score.voice(score.notes('b4/4/r, b4/r, b4/r, b4, b4/r, b4/r, b4, b4', { stem: 'down' }), { time: '8/4' }),\n score.voice(score.notes('e4/4/r, e4/r, f4, b4/r, g4, c4, e4/r, c4', { stem: 'down' }), { time: '8/4' }),\n score.voice([\n f.TextNote({ text: measureTitle, duration: '1', line: -1, smooth: true }),\n f.TextNote({ text: '', duration: '1', line: -1, smooth: true }),\n ], { time: '8/4' }),\n ];\n f.Formatter().joinVoices(voices).formatToStave(voices, stave, { align_rests });\n x += width;\n }\n createMeasure('Default Rest Positions', 400, false);\n createMeasure('Rests Repositioned To Avoid Collisions', 400, true);\n f.draw();\n ok(true);\n}\nfunction autoRestThreeVoices2(options) {\n const f = VexFlowTests.makeFactory(options, 850, 200);\n const score = f.EasyScore();\n let x = 10;\n function createMeasure(measureTitle, width, align_rests) {\n const stave = f.Stave({ x: x, y: 50, width: width }).setBegBarType(1);\n const voices = [\n score.voice(score.notes('b4/16/r, e5, e5/r, e5/r, e5, e5, e5, e5/r'), { time: '2/4' }),\n score.voice(score.notes('b4/16/r, b4/r, b4/r, b4, b4/r, b4/r, b4, b4'), { time: '2/4' }),\n score.voice(score.notes('e4/16/r, e4/r, f4, b4/r, g4, c4, e4/r, c4'), { time: '2/4' }),\n score.voice([f.TextNote({ text: measureTitle, duration: 'h', line: -1, smooth: true })], { time: '2/4' }),\n ];\n f.Formatter().joinVoices(voices).formatToStave(voices, stave, { align_rests });\n x += width;\n }\n createMeasure('Default Rest Positions', 400, false);\n createMeasure('Rests Repositioned To Avoid Collisions', 400, true);\n f.draw();\n ok(true);\n}\nVexFlowTests.register(ThreeVoicesTests);\nexport { ThreeVoicesTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// TickContext Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Flow } from '../src/flow';\nimport { TickContext } from '../src/tickcontext';\nimport { MockTickable } from './mocks';\nconst TickContextTests = {\n Start() {\n QUnit.module('TickContext');\n test('Current Tick Test', currentTick);\n test('Tracking Test', tracking);\n },\n};\nfunction currentTick() {\n const tc = new TickContext();\n equal(tc.getCurrentTick().value(), 0, 'New tick context has no ticks');\n}\nfunction tracking() {\n const BEAT = (1 * Flow.RESOLUTION) / 4;\n const tickables = [\n new MockTickable().setTicks(BEAT).setWidth(10),\n new MockTickable().setTicks(BEAT * 2).setWidth(20),\n new MockTickable().setTicks(BEAT).setWidth(30),\n ];\n const tc = new TickContext();\n tc.setPadding(0);\n tc.addTickable(tickables[0]);\n equal(tc.getMaxTicks().value(), BEAT);\n tc.addTickable(tickables[1]);\n equal(tc.getMaxTicks().value(), BEAT * 2);\n tc.addTickable(tickables[2]);\n equal(tc.getMaxTicks().value(), BEAT * 2);\n equal(tc.getWidth(), 0);\n tc.preFormat();\n equal(tc.getWidth(), 30);\n}\nVexFlowTests.register(TickContextTests);\nexport { TickContextTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// TimeSignature Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Stave } from '../src/stave';\nimport { StaveConnector } from '../src/staveconnector';\nimport { TimeSignature } from '../src/timesignature';\nconst TimeSignatureTests = {\n Start() {\n QUnit.module('TimeSignature');\n test('Time Signature Parser', parser);\n const run = VexFlowTests.runTests;\n run('Basic Time Signatures', basic);\n run('Big Signature Test', big);\n run('Additive Signature Test', additive);\n run('Alternating Signature Test', alternating);\n run('Interchangeable Signature Test', interchangeable);\n run('Aggregate Signature Test', agregate);\n run('Complex Signature Test', complex);\n run('Time Signature multiple staves alignment test', multiple);\n run('Time Signature Change Test', change);\n },\n};\nfunction parser() {\n const timeSig = new TimeSignature();\n const mustFail = ['asdf', '123/', '/10', '/', '4567', 'C+', '1+', '+1', '(3+', '+3)', '()', '(+)'];\n mustFail.forEach((invalidString) => {\n throws(() => timeSig.parseTimeSpec(invalidString), /BadTimeSignature/);\n });\n const mustPass = ['4/4', '10/12', '1/8', '1234567890/1234567890', 'C', 'C|', '+'];\n mustPass.forEach((validString) => timeSig.parseTimeSpec(validString));\n ok(true, 'all pass');\n}\nfunction basic(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 600, 120);\n new Stave(10, 10, 500)\n .addTimeSignature('2/2')\n .addTimeSignature('3/4')\n .addTimeSignature('4/4')\n .addTimeSignature('6/8')\n .addTimeSignature('C')\n .addTimeSignature('C|')\n .addEndTimeSignature('2/2')\n .addEndTimeSignature('3/4')\n .addEndTimeSignature('4/4')\n .addEndClef('treble')\n .addEndTimeSignature('6/8')\n .addEndTimeSignature('C')\n .addEndTimeSignature('C|')\n .setContext(ctx)\n .draw();\n ok(true, 'all pass');\n}\nfunction big(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 400, 120);\n new Stave(10, 10, 300)\n .addTimeSignature('12/8')\n .addTimeSignature('7/16')\n .addTimeSignature('1234567/890')\n .addTimeSignature('987/654321')\n .setContext(ctx)\n .draw();\n ok(true, 'all pass');\n}\nfunction additive(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 400, 120);\n new Stave(10, 10, 300).addTimeSignature('2+3+2/8').setContext(ctx).draw();\n ok(true, 'all pass');\n}\nfunction alternating(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 400, 120);\n new Stave(10, 10, 300).addTimeSignature('6/8').addTimeSignature('+').addTimeSignature('3/4').setContext(ctx).draw();\n ok(true, 'all pass');\n}\nfunction interchangeable(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 400, 120);\n new Stave(10, 10, 300).addTimeSignature('3/4').addTimeSignature('-').addTimeSignature('2/4').setContext(ctx).draw();\n ok(true, 'all pass');\n}\nfunction agregate(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 400, 120);\n new Stave(10, 10, 300)\n .addTimeSignature('2/4')\n .addTimeSignature('+')\n .addTimeSignature('3/8')\n .addTimeSignature('+')\n .addTimeSignature('5/4')\n .setContext(ctx)\n .draw();\n ok(true, 'all pass');\n}\nfunction complex(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 400, 120);\n new Stave(10, 10, 300)\n .addTimeSignature('(2+3)/16')\n .addTimeSignature('+')\n .addTimeSignature('3/8')\n .setContext(ctx)\n .draw();\n ok(true, 'all pass');\n}\nfunction multiple(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 400, 350);\n // Each StaveLineConfig object is of the form { visible: boolean }.\n const stave1LineConfig = [false, false, true, false, false].map((visible) => ({ visible }));\n const stave1 = new Stave(15, 0, 300)\n .setConfigForLines(stave1LineConfig)\n .addClef('percussion')\n .addTimeSignature('4/4', 25) // passing the custom padding in pixels\n .setContext(ctx)\n .draw();\n const stave2 = new Stave(15, 110, 300).addClef('treble').addTimeSignature('4/4').setContext(ctx).draw();\n const stave3 = new Stave(15, 220, 300).addClef('bass').addTimeSignature('4/4').setContext(ctx).draw();\n new StaveConnector(stave1, stave2).setType('single').setContext(ctx).draw();\n new StaveConnector(stave2, stave3).setType('single').setContext(ctx).draw();\n new StaveConnector(stave2, stave3).setType('brace').setContext(ctx).draw();\n ok(true, 'all pass');\n}\nfunction change(options) {\n const f = VexFlowTests.makeFactory(options, 900);\n const stave = f.Stave({ x: 0, y: 0 }).addClef('treble').addTimeSignature('C|');\n const tickables = [\n f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'treble' }),\n f.TimeSigNote({ time: '3/4' }),\n f.StaveNote({ keys: ['d/4'], duration: '4', clef: 'alto' }),\n f.StaveNote({ keys: ['b/3'], duration: '4r', clef: 'alto' }),\n f.TimeSigNote({ time: 'C' }),\n f.StaveNote({ keys: ['c/3', 'e/3', 'g/3'], duration: '4', clef: 'bass' }),\n f.TimeSigNote({ time: '9/8' }),\n f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'treble' }),\n ];\n const voice = f.Voice().setStrict(false).addTickables(tickables);\n f.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'all pass');\n}\nVexFlowTests.register(TimeSignatureTests);\nexport { TimeSignatureTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Tremolo Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Barline } from '../src/stavebarline';\nimport { Tremolo } from '../src/tremolo';\nconst TremoloTests = {\n Start() {\n QUnit.module('Tremolo');\n const run = VexFlowTests.runTests;\n run('Tremolo - Basic', tremoloBasic);\n run('Tremolo - Big', tremoloBig);\n },\n};\nfunction tremoloBasic(options) {\n const f = VexFlowTests.makeFactory(options, 600, 200);\n const score = f.EasyScore();\n // bar 1\n const stave1 = f.Stave({ width: 250 }).setEndBarType(Barline.type.DOUBLE);\n const notes1 = score.notes('e4/4, e4, e4, e4', { stem: 'up' });\n notes1[0].addModifier(new Tremolo(3), 0);\n notes1[1].addModifier(new Tremolo(2), 0);\n notes1[2].addModifier(new Tremolo(1), 0);\n const voice1 = score.voice(notes1);\n f.Formatter().joinVoices([voice1]).formatToStave([voice1], stave1);\n // bar 2\n const stave2 = f\n .Stave({ x: stave1.getWidth() + stave1.getX(), y: stave1.getY(), width: 300 })\n .setEndBarType(Barline.type.DOUBLE);\n const notes2 = score.notes('e5/4, e5, e5, e5', { stem: 'down' });\n notes2[1].addModifier(new Tremolo(1), 0);\n notes2[2].addModifier(new Tremolo(2), 0);\n notes2[3].addModifier(new Tremolo(3), 0);\n const voice2 = score.voice(notes2);\n f.Formatter().joinVoices([voice2]).formatToStave([voice2], stave2);\n f.draw();\n ok(true, 'Tremolo - Basic');\n}\nfunction tremoloBig(options) {\n const f = VexFlowTests.makeFactory(options, 600, 200);\n const score = f.EasyScore();\n // bar 1\n const stave1 = f.Stave({ width: 250 }).setEndBarType(Barline.type.DOUBLE);\n const notes1 = score.notes('e4/4, e4, e4, e4', { stem: 'up' });\n const tremolo1 = new Tremolo(3);\n tremolo1.extra_stroke_scale = 1.7;\n tremolo1.y_spacing_scale = 1.5;\n const tremolo2 = new Tremolo(2);\n tremolo2.extra_stroke_scale = 1.7;\n tremolo2.y_spacing_scale = 1.5;\n const tremolo3 = new Tremolo(1);\n tremolo3.extra_stroke_scale = 1.7;\n tremolo3.y_spacing_scale = 1.5;\n notes1[0].addModifier(tremolo1, 0);\n notes1[1].addModifier(tremolo2, 0);\n notes1[2].addModifier(tremolo3, 0);\n const voice1 = score.voice(notes1);\n f.Formatter().joinVoices([voice1]).formatToStave([voice1], stave1);\n // bar 2\n const stave2 = f\n .Stave({ x: stave1.getWidth() + stave1.getX(), y: stave1.getY(), width: 300 })\n .setEndBarType(Barline.type.DOUBLE);\n const notes2 = score.notes('e5/4, e5, e5, e5', { stem: 'down' });\n const tremolo4 = new Tremolo(1);\n tremolo4.extra_stroke_scale = 1.7;\n tremolo4.y_spacing_scale = 1.5;\n const tremolo5 = new Tremolo(2);\n tremolo5.extra_stroke_scale = 1.7;\n tremolo5.y_spacing_scale = 1.5;\n const tremolo6 = new Tremolo(3);\n tremolo6.extra_stroke_scale = 1.7;\n tremolo6.y_spacing_scale = 1.5;\n notes2[1].addModifier(tremolo4, 0);\n notes2[2].addModifier(tremolo5, 0);\n notes2[3].addModifier(tremolo6, 0);\n const voice2 = score.voice(notes2);\n f.Formatter().joinVoices([voice2]).formatToStave([voice2], stave2);\n f.draw();\n ok(true, 'Tremolo - Big');\n}\nVexFlowTests.register(TremoloTests);\nexport { TremoloTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Tuning Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Tuning } from '../src/tuning';\nconst TuningTests = {\n Start() {\n QUnit.module('Tuning');\n test('Standard Tuning', standard);\n test('Standard Banjo Tuning', banjo);\n test('Return note for fret', noteForFret);\n },\n};\n/**\n * Helper function to verify that the provided tuning matches a standard 6-string guitar.\n */\nfunction checkStandard(tuning) {\n throws(() => tuning.getValueForString(0), /BadArguments/, 'String 0');\n throws(() => tuning.getValueForString(9), /BadArguments/, 'String 9');\n // TODO: Tuning constructor has a bug in that the default tuning has 8 strings.\n // See: 'E/5,B/4,G/4,D/4,A/3,E/3,B/2,E/2' in tuning.ts constructor.\n // throws(() => tuning.getValueForString(7), /BadArguments/, 'String 7');\n // Tuning.getValueForString() returns a note number where the value 60 corresponds to middle C.\n equal(tuning.getValueForString(6), 40, 'Low E string');\n equal(tuning.getValueForString(5), 45, 'A string');\n equal(tuning.getValueForString(4), 50, 'D string');\n equal(tuning.getValueForString(3), 55, 'G string');\n equal(tuning.getValueForString(2), 59, 'B string');\n equal(tuning.getValueForString(1), 64, 'High E string');\n}\n/**\n * Helper function to verify that the provided tuning matches a standard 5-string banjo.\n */\nfunction checkStandardBanjo(tuning) {\n throws(() => tuning.getValueForString(0), /BadArguments/, 'String 0');\n throws(() => tuning.getValueForString(6), /BadArguments/, 'String 6');\n equal(tuning.getValueForString(5), 67, 'High G string');\n equal(tuning.getValueForString(4), 50, 'D string');\n equal(tuning.getValueForString(3), 55, 'G string');\n equal(tuning.getValueForString(2), 59, 'B string');\n equal(tuning.getValueForString(1), 62, 'High D string');\n}\nfunction standard() {\n expect(16);\n const tuning = new Tuning();\n checkStandard(tuning);\n // Set the tuning by specifying a name: 'standard'.\n tuning.setTuning('standard');\n checkStandard(tuning);\n}\nfunction banjo() {\n expect(7);\n const tuning = new Tuning();\n tuning.setTuning('standardBanjo');\n checkStandardBanjo(tuning);\n}\nfunction noteForFret() {\n expect(8);\n const tuning = new Tuning('E/5,B/4,G/4,D/4,A/3,E/3');\n throws(() => tuning.getNoteForFret(-1, 1), /BadArguments/, 'Fret = -1');\n throws(() => tuning.getNoteForFret(1, -1), /BadArguments/, 'String = -1');\n equal(tuning.getNoteForFret(0, 1), 'E/5', 'High E string');\n equal(tuning.getNoteForFret(5, 1), 'A/5', 'High E string, fret 5');\n equal(tuning.getNoteForFret(0, 2), 'B/4', 'B string');\n equal(tuning.getNoteForFret(0, 3), 'G/4', 'G string');\n equal(tuning.getNoteForFret(12, 2), 'B/5', 'B string, fret 12');\n equal(tuning.getNoteForFret(0, 6), 'E/3', 'Low E string');\n}\nVexFlowTests.register(TuningTests);\nexport { TuningTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Tuplet Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Dot } from '../src/dot';\nimport { Formatter } from '../src/formatter';\nimport { Stem } from '../src/stem';\nimport { Tuplet } from '../src/tuplet';\nconst TupletTests = {\n Start() {\n QUnit.module('Tuplet');\n const run = VexFlowTests.runTests;\n run('Simple Tuplet', simple);\n run('Beamed Tuplet', beamed);\n run('Ratioed Tuplet', ratio);\n run('Bottom Tuplet', bottom);\n run('Bottom Ratioed Tuplet', bottomRatio);\n run('Awkward Tuplet', awkward);\n run('Complex Tuplet', complex);\n run('Mixed Stem Direction Tuplet', mixedTop);\n run('Mixed Stem Direction Bottom Tuplet', mixedBottom);\n run('Nested Tuplets', nested);\n run('Single Tuplets', single);\n },\n};\n// Helper Functions to set the stem direction and duration of the options objects (i.e., StaveNoteStruct)\n// that are ultimately passed into Factory.StaveNote().\n// eslint-disable-next-line\nconst set = (key) => (value) => (object) => {\n object[key] = value;\n return object;\n};\nconst setStemDirection = set('stem_direction');\nconst setStemUp = setStemDirection(Stem.UP);\nconst setStemDown = setStemDirection(Stem.DOWN);\nconst setDurationToQuarterNote = set('duration')('4');\n/**\n * Simple test case with one ascending triplet and one descending triplet.\n */\nfunction simple(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave({ x: 10, y: 10, width: 350 }).addTimeSignature('3/4');\n const notes = [\n { keys: ['g/4'], duration: '4' },\n { keys: ['a/4'], duration: '4' },\n { keys: ['b/4'], duration: '4' },\n { keys: ['b/4'], duration: '8' },\n { keys: ['a/4'], duration: '8' },\n { keys: ['g/4'], duration: '8' },\n ]\n .map(setStemUp)\n .map(f.StaveNote.bind(f));\n f.Tuplet({ notes: notes.slice(0, 3) });\n f.Tuplet({ notes: notes.slice(3, 6) });\n // 3/4 time\n const voice = f\n .Voice({ time: { num_beats: 3, beat_value: 4 } })\n .setStrict(true)\n .addTickables(notes);\n new Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'Simple Test');\n}\nfunction beamed(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave({ x: 10, y: 10, width: 350 }).addTimeSignature('3/8');\n const notes = [\n { keys: ['b/4'], duration: '16' },\n { keys: ['a/4'], duration: '16' },\n { keys: ['g/4'], duration: '16' },\n { keys: ['a/4'], duration: '8' },\n { keys: ['f/4'], duration: '8' },\n { keys: ['a/4'], duration: '8' },\n { keys: ['f/4'], duration: '8' },\n { keys: ['a/4'], duration: '8' },\n { keys: ['f/4'], duration: '8' },\n { keys: ['g/4'], duration: '8' },\n ]\n .map(setStemUp)\n .map(f.StaveNote.bind(f));\n f.Beam({ notes: notes.slice(0, 3) });\n f.Beam({ notes: notes.slice(3, 10) });\n f.Tuplet({ notes: notes.slice(0, 3) });\n f.Tuplet({ notes: notes.slice(3, 10) });\n // 3/8 time\n const voice = f\n .Voice({ time: { num_beats: 3, beat_value: 8 } })\n .setStrict(true)\n .addTickables(notes);\n new Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'Beamed Test');\n}\nfunction ratio(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave({ x: 10, y: 10, width: 350 }).addTimeSignature('4/4');\n const notes = [\n { keys: ['f/4'], duration: '4' },\n { keys: ['a/4'], duration: '4' },\n { keys: ['b/4'], duration: '4' },\n { keys: ['g/4'], duration: '8' },\n { keys: ['e/4'], duration: '8' },\n { keys: ['g/4'], duration: '8' },\n ]\n .map(setStemUp)\n .map(f.StaveNote.bind(f));\n f.Beam({\n notes: notes.slice(3, 6),\n });\n f.Tuplet({\n notes: notes.slice(0, 3),\n options: {\n ratioed: true,\n },\n });\n f.Tuplet({\n notes: notes.slice(3, 6),\n options: {\n ratioed: true,\n notes_occupied: 4,\n },\n });\n const voice = f.Voice().setStrict(true).addTickables(notes);\n new Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'Ratioed Test');\n}\nfunction bottom(options) {\n const f = VexFlowTests.makeFactory(options, 350, 160);\n const stave = f.Stave({ x: 10, y: 10 }).addTimeSignature('3/4');\n const notes = [\n { keys: ['f/4'], duration: '4' },\n { keys: ['c/4'], duration: '4' },\n { keys: ['g/4'], duration: '4' },\n { keys: ['d/5'], duration: '8' },\n { keys: ['g/3'], duration: '8' },\n { keys: ['b/4'], duration: '8' },\n ]\n .map(setStemDown)\n .map(f.StaveNote.bind(f));\n f.Beam({\n notes: notes.slice(3, 6),\n });\n f.Tuplet({\n notes: notes.slice(0, 3),\n options: { location: Tuplet.LOCATION_BOTTOM },\n });\n f.Tuplet({\n notes: notes.slice(3, 6),\n options: { location: Tuplet.LOCATION_BOTTOM },\n });\n const voice = f\n .Voice({ time: { num_beats: 3, beat_value: 4 } })\n .setStrict(true)\n .addTickables(notes);\n new Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'Bottom Test');\n}\nfunction bottomRatio(options) {\n const f = VexFlowTests.makeFactory(options, 350, 160);\n const stave = f.Stave({ x: 10, y: 10 }).addTimeSignature('5/8');\n const notes = [\n { keys: ['f/4'], duration: '4' },\n { keys: ['c/4'], duration: '4' },\n { keys: ['d/4'], duration: '4' },\n { keys: ['d/5'], duration: '8' },\n { keys: ['g/5'], duration: '8' },\n { keys: ['b/4'], duration: '8' },\n ]\n .map(setStemDown)\n .map(f.StaveNote.bind(f));\n f.Beam({\n notes: notes.slice(3, 6),\n });\n f.Tuplet({\n notes: notes.slice(0, 3),\n options: {\n location: Tuplet.LOCATION_BOTTOM,\n ratioed: true,\n },\n });\n f.Tuplet({\n notes: notes.slice(3, 6),\n options: {\n location: Tuplet.LOCATION_BOTTOM,\n notes_occupied: 1,\n },\n });\n const voice = f\n .Voice({ time: { num_beats: 5, beat_value: 8 } })\n .setStrict(true)\n .addTickables(notes);\n new Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'Bottom Ratioed Test');\n}\nfunction awkward(options) {\n const f = VexFlowTests.makeFactory(options, 370, 160);\n const stave = f.Stave({ x: 10, y: 10 });\n const notes = [\n { keys: ['g/4'], duration: '16' },\n { keys: ['b/4'], duration: '16' },\n { keys: ['a/4'], duration: '16' },\n { keys: ['a/4'], duration: '16' },\n { keys: ['g/4'], duration: '16' },\n { keys: ['f/4'], duration: '16' },\n { keys: ['e/4'], duration: '16' },\n { keys: ['c/4'], duration: '16' },\n { keys: ['g/4'], duration: '16' },\n { keys: ['a/4'], duration: '16' },\n { keys: ['f/4'], duration: '16' },\n { keys: ['e/4'], duration: '16' },\n { keys: ['c/4'], duration: '8' },\n { keys: ['d/4'], duration: '8' },\n { keys: ['e/4'], duration: '8' },\n ]\n .map(setStemUp)\n .map(f.StaveNote.bind(f));\n f.Beam({ notes: notes.slice(0, 12) });\n f.Tuplet({\n notes: notes.slice(0, 12),\n options: {\n notes_occupied: 142,\n ratioed: true,\n },\n });\n f.Tuplet({\n notes: notes.slice(12, 15),\n options: {\n ratioed: true,\n },\n }).setBracketed(true);\n const voice = f.Voice().setStrict(false).addTickables(notes);\n new Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'Awkward Test');\n}\nfunction complex(options) {\n const f = VexFlowTests.makeFactory(options, 600);\n const stave = f.Stave({ x: 10, y: 10 }).addTimeSignature('4/4');\n const notes1 = [\n { keys: ['b/4'], duration: '8d' },\n { keys: ['a/4'], duration: '16' },\n { keys: ['g/4'], duration: '8' },\n { keys: ['a/4'], duration: '16' },\n { keys: ['b/4'], duration: '16r' },\n { keys: ['g/4'], duration: '32' },\n { keys: ['f/4'], duration: '32' },\n { keys: ['g/4'], duration: '32' },\n { keys: ['f/4'], duration: '32' },\n { keys: ['a/4'], duration: '16' },\n { keys: ['f/4'], duration: '8' },\n { keys: ['b/4'], duration: '8' },\n { keys: ['a/4'], duration: '8' },\n { keys: ['g/4'], duration: '8' },\n { keys: ['b/4'], duration: '8' },\n { keys: ['a/4'], duration: '8' },\n ]\n .map(setStemUp)\n .map(f.StaveNote.bind(f));\n Dot.buildAndAttach([notes1[0]], { all: true });\n const notes2 = [{ keys: ['c/4'] }, { keys: ['c/4'] }, { keys: ['c/4'] }, { keys: ['c/4'] }]\n .map(setDurationToQuarterNote)\n .map(setStemDown)\n .map(f.StaveNote.bind(f));\n f.Beam({ notes: notes1.slice(0, 3) });\n f.Beam({ notes: notes1.slice(5, 9) });\n f.Beam({ notes: notes1.slice(11, 16) });\n f.Tuplet({\n notes: notes1.slice(0, 3),\n });\n f.Tuplet({\n notes: notes1.slice(3, 11),\n options: {\n num_notes: 7,\n notes_occupied: 4,\n ratioed: false,\n },\n });\n f.Tuplet({\n notes: notes1.slice(11, 16),\n options: {\n notes_occupied: 4,\n },\n });\n const voice1 = f.Voice().setStrict(true).addTickables(notes1);\n const voice2 = f.Voice().setStrict(true).addTickables(notes2);\n new Formatter().joinVoices([voice1, voice2]).formatToStave([voice1, voice2], stave);\n f.draw();\n ok(true, 'Complex Test');\n}\nfunction mixedTop(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave({ x: 10, y: 10 });\n const notes = [\n { keys: ['a/4'], stem_direction: 1 },\n { keys: ['c/6'], stem_direction: -1 },\n { keys: ['a/4'], stem_direction: 1 },\n { keys: ['f/5'], stem_direction: 1 },\n { keys: ['a/4'], stem_direction: -1 },\n { keys: ['c/6'], stem_direction: -1 },\n ]\n .map(setDurationToQuarterNote)\n .map(f.StaveNote.bind(f));\n f.Tuplet({\n notes: notes.slice(0, 2),\n options: {\n notes_occupied: 3,\n },\n });\n f.Tuplet({\n notes: notes.slice(2, 4),\n options: {\n notes_occupied: 3,\n },\n });\n f.Tuplet({\n notes: notes.slice(4, 6),\n options: {\n notes_occupied: 3,\n },\n });\n const voice = f.Voice().setStrict(false).addTickables(notes);\n new Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'Mixed Stem Direction Tuplet');\n}\nfunction mixedBottom(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave({ x: 10, y: 10 });\n const notes = [\n { keys: ['f/3'], stem_direction: 1 },\n { keys: ['a/5'], stem_direction: -1 },\n { keys: ['a/4'], stem_direction: 1 },\n { keys: ['f/3'], stem_direction: 1 },\n { keys: ['a/4'], stem_direction: -1 },\n { keys: ['c/4'], stem_direction: -1 },\n ]\n .map(setDurationToQuarterNote)\n .map(f.StaveNote.bind(f));\n f.Tuplet({\n notes: notes.slice(0, 2),\n options: {\n notes_occupied: 3,\n },\n });\n f.Tuplet({\n notes: notes.slice(2, 4),\n options: {\n notes_occupied: 3,\n },\n });\n f.Tuplet({\n notes: notes.slice(4, 6),\n options: {\n notes_occupied: 3,\n },\n });\n const voice = f.Voice().setStrict(false).addTickables(notes);\n new Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'Mixed Stem Direction Bottom Tuplet');\n}\nfunction nested(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave({ x: 10, y: 10 }).addTimeSignature('4/4');\n const notes = [\n // Big triplet 1:\n { keys: ['b/4'], duration: '4' },\n { keys: ['a/4'], duration: '4' },\n { keys: ['g/4'], duration: '16' },\n { keys: ['a/4'], duration: '16' },\n { keys: ['f/4'], duration: '16' },\n { keys: ['a/4'], duration: '16' },\n { keys: ['g/4'], duration: '16' },\n { keys: ['b/4'], duration: '2' },\n ]\n .map(setStemUp)\n .map(f.StaveNote.bind(f));\n f.Beam({\n notes: notes.slice(2, 7),\n });\n f.Tuplet({\n notes: notes.slice(0, 7),\n options: {\n notes_occupied: 2,\n num_notes: 3,\n },\n });\n f.Tuplet({\n notes: notes.slice(2, 7),\n options: {\n notes_occupied: 4,\n num_notes: 5,\n },\n });\n // 4/4 time\n const voice = f.Voice().setStrict(true).addTickables(notes);\n new Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'Nested Tuplets');\n}\nfunction single(options) {\n const f = VexFlowTests.makeFactory(options);\n const stave = f.Stave({ x: 10, y: 10 }).addTimeSignature('4/4');\n const notes = [\n // Big triplet 1:\n { keys: ['c/4'], duration: '4' },\n { keys: ['d/4'], duration: '8' },\n { keys: ['e/4'], duration: '8' },\n { keys: ['f/4'], duration: '8' },\n { keys: ['g/4'], duration: '8' },\n { keys: ['a/4'], duration: '2' },\n { keys: ['b/4'], duration: '4' },\n ]\n .map(setStemUp)\n .map(f.StaveNote.bind(f));\n f.Beam({\n notes: notes.slice(1, 4),\n });\n // big quartuplet\n f.Tuplet({\n notes: notes.slice(0, -1),\n options: {\n num_notes: 4,\n notes_occupied: 3,\n ratioed: true,\n bracketed: true,\n },\n });\n // first singleton\n f.Tuplet({\n notes: notes.slice(0, 1),\n options: {\n num_notes: 3,\n notes_occupied: 2,\n ratioed: true,\n },\n });\n // eighth note triplet\n f.Tuplet({\n notes: notes.slice(1, 4),\n options: {\n num_notes: 3,\n notes_occupied: 2,\n },\n });\n // second singleton\n f.Tuplet({\n notes: notes.slice(4, 5),\n options: {\n num_notes: 3,\n notes_occupied: 2,\n ratioed: true,\n bracketed: true,\n },\n });\n // 4/4 time\n const voice = f\n .Voice({ time: { num_beats: 4, beat_value: 4 } })\n .setStrict(true)\n .addTickables(notes);\n new Formatter().joinVoices([voice]).formatToStave([voice], stave);\n f.draw();\n ok(true, 'Nested Tuplets');\n}\nVexFlowTests.register(TupletTests);\nexport { TupletTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Ron B. Yeh\n// MIT License\n//\n// TypeGuard Tests\n// eslint-disable-next-line\n// @ts-nocheck to support ES5 style class declaration in the fakeES5() test case.\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { CanvasContext } from '../src/canvascontext';\nimport { StaveNote } from '../src/stavenote';\nimport { StemmableNote } from '../src/stemmablenote';\nimport { TabNote } from '../src/tabnote';\nimport { isCategory, isNote, isRenderContext, isStaveNote, isStemmableNote, isTabNote } from '../src/typeguard';\nconst TypeGuardTests = {\n Start() {\n QUnit.module('TypeGuard');\n test('Real VexFlow Types', real);\n test('Fake VexFlow Types in ES5', fakeES5);\n test('Fake VexFlow Types in ES6', fakeES6);\n test('Edge Case ES5/ES6', edgeCaseES5vsES6);\n },\n};\nfunction real() {\n const s = new StaveNote({ keys: ['c/4'], duration: 'w' });\n ok(isStaveNote(s), 'isStaveNote helper function');\n ok(isCategory(s, 'StaveNote'), 'Use isCategory(s, \"StaveNote\") directly');\n notOk(isTabNote(s), 'isTabNote helper function. s is NOT a TabNote.');\n const t = new TabNote({ positions: [{ str: 2, fret: 1 }], duration: '1' });\n ok(isTabNote(t), 'isTabNote helper function');\n notOk(isStaveNote(t), 't is NOT a StaveNote');\n ok(isNote(s), 'StaveNote extends StemmableNote which extends Note, so s is a Note');\n ok(isStemmableNote(t), 'TabNote extends StemmableNote');\n ok(isNote(t), 'TabNote extends StemmableNote which extends Note, so t is a Note');\n const canvas = document.createElement('canvas');\n canvas.width = 800;\n canvas.height = 400;\n const ctx = new CanvasContext(canvas.getContext('2d'));\n ok(isRenderContext(ctx), 'ctx is a RenderContext');\n}\n/**\n * Helper function to test the fake VexFlow objects we create in fakeES5() and fakeES6().\n */\nfunction checkFakeObjects(fakeStemmableNote, fakeStaveNote) {\n ok(isStemmableNote(fakeStemmableNote), 'Fake StemmableNote is a StemmableNote.');\n notOk(isNote(fakeStemmableNote), 'Fake StemmableNote is not a Note (no ancestors with the correct CATEGORY).');\n ok(isCategory(fakeStaveNote, 'StaveNote'), 'Fake StaveNote is a StaveNote.');\n ok(isStaveNote(fakeStaveNote), 'Fake StaveNote is a StaveNote (via helper function).');\n ok(isCategory(fakeStaveNote, 'StemmableNote'), 'Fake StaveNote is also a StemmableNote (via inheritance).');\n notOk(isNote(fakeStaveNote), 'Fake StaveNote is not a Note. CATEGORY does not match.');\n}\n/**\n * Demonstrate that an object (ES5-style) can pass the isCategory(...) test if it\n * has the correct static .CATEGORY property.\n */\nfunction fakeES5() {\n function FakeStemmableNote() {\n this.isFake = true;\n }\n FakeStemmableNote.CATEGORY = StemmableNote.CATEGORY;\n function FakeStaveNote() {\n FakeStemmableNote.call(this);\n }\n FakeStaveNote.CATEGORY = StaveNote.CATEGORY;\n FakeStaveNote.prototype = Object.create(FakeStemmableNote.prototype);\n FakeStaveNote.prototype.constructor = FakeStaveNote;\n const fakeStemmableNote = new FakeStemmableNote();\n const fakeStaveNote = new FakeStaveNote();\n checkFakeObjects(fakeStemmableNote, fakeStaveNote);\n}\n/**\n * Demonstrate that an object (ES6-style) can pass the isCategory(...) test if it\n * or its ancestor has the correct static .CATEGORY property.\n */\nfunction fakeES6() {\n class FakeStemmableNote {\n }\n FakeStemmableNote.CATEGORY = StemmableNote.CATEGORY;\n class FakeStaveNote extends FakeStemmableNote {\n }\n FakeStaveNote.CATEGORY = StaveNote.CATEGORY;\n const fakeStemmableNote = new FakeStemmableNote();\n const fakeStaveNote = new FakeStaveNote();\n checkFakeObjects(fakeStemmableNote, fakeStaveNote);\n}\n/**\n * The tsconfig.json target is ES6 (as of August 18, 2021), so isCategory() works even when the root class \"extends Object\".\n */\nfunction edgeCaseES5vsES6() {\n class Z extends Object {\n }\n class Y extends Z {\n }\n class X extends Y {\n }\n const zInstance = new Z();\n const xInstance = new X();\n ok(xInstance instanceof Object, 'es5 & es6: x IS an instanceof Object');\n // If targeting es5, these three assertions only pass if we remove \"extends Object\" from the class Z definition.\n ok(zInstance instanceof Z, 'es6: z IS an instanceof Z');\n ok(xInstance instanceof Y, 'es6: x IS an instanceof Y');\n ok(xInstance instanceof Z, 'es6: x IS an instanceof Z');\n}\nVexFlowTests.register(TypeGuardTests);\nexport { TypeGuardTests };\n","// [VexFlow](https://vexflow.com/) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// VexFlow Test Support Library\nimport { Factory, Flow, Font, Renderer } from '../src/index';\nimport { globalObject } from '../src/util';\nconst global = globalObject();\n// Each test case will switch through the available fonts, and then restore the original font when done.\nlet originalFontNames;\nfunction useTempFontStack(fontName) {\n originalFontNames = Flow.getMusicFont();\n Flow.setMusicFont(...VexFlowTests.FONT_STACKS[fontName]);\n}\nfunction restoreOriginalFontStack() {\n Flow.setMusicFont(...originalFontNames);\n}\n// A micro util inspired by jQuery.\nif (!global.$) {\n // generate_png_images.js uses jsdom and does not include jQuery.\n global.$ = (param) => {\n let element;\n if (typeof param !== 'string') {\n element = param;\n }\n else if (param.startsWith('<')) {\n // Extract the tag name: e.g.,
=> div\n // Assume param.match returns something (! operator).\n // eslint-disable-next-line\n const tagName = param.match(/[A-Za-z]+/g)[0];\n element = document.createElement(tagName);\n }\n else {\n element = document.querySelector(param);\n }\n const $element = {\n // eslint-disable-next-line\n get(index) {\n return element;\n },\n addClass(c) {\n element.classList.add(c);\n return $element;\n },\n text(t) {\n element.textContent = t;\n return $element;\n },\n html(h) {\n if (!h) {\n return element.innerHTML;\n }\n else {\n element.innerHTML = h;\n return $element;\n }\n },\n append(...elementsToAppend) {\n elementsToAppend.forEach((e) => {\n element.appendChild(e);\n });\n return $element;\n },\n attr(attrName, val) {\n element.setAttribute(attrName, val);\n return $element;\n },\n };\n return $element;\n };\n}\n/** Allow `name` to be used inside file names. */\nfunction sanitizeName(name) {\n return name.replace(/[^a-zA-Z0-9]/g, '_');\n}\nconst CANVAS_TEST_CONFIG = {\n backend: Renderer.Backends.CANVAS,\n tagName: 'canvas',\n testType: 'Canvas',\n fontStacks: ['Bravura'],\n};\nconst SVG_TEST_CONFIG = {\n backend: Renderer.Backends.SVG,\n tagName: 'div',\n testType: 'SVG',\n fontStacks: ['Bravura', 'Gonville', 'Petaluma'],\n};\nconst NODE_TEST_CONFIG = {\n backend: Renderer.Backends.CANVAS,\n tagName: 'canvas',\n testType: 'NodeCanvas',\n fontStacks: ['Bravura', 'Gonville', 'Petaluma'],\n};\nexport class VexFlowTests {\n // Call this at the end of a `tests/xxxx_tests.ts` file to register the module.\n static register(test) {\n VexFlowTests.tests.push(test);\n }\n static parseJobOptions(runOptions) {\n let { jobs, job } = runOptions || { jobs: 1, job: 0 };\n if (window) {\n const { location } = window;\n if (location) {\n const sps = new URLSearchParams(location.search);\n const jobsParam = sps.get('jobs');\n const jobParam = sps.get('job');\n if (jobsParam) {\n jobs = parseInt(jobsParam, 10);\n }\n if (jobParam) {\n job = parseInt(jobParam, 10);\n }\n }\n }\n return {\n jobs,\n job,\n };\n }\n // flow.html calls this to invoke all the tests.\n static run(runOptions) {\n const { jobs, job } = VexFlowTests.parseJobOptions(runOptions);\n VexFlowTests.tests.forEach((test, idx) => {\n if (jobs === 1 || idx % jobs === job) {\n test.Start();\n }\n });\n }\n static set NODE_FONT_STACKS(fontStacks) {\n NODE_TEST_CONFIG.fontStacks = fontStacks;\n }\n /** Return a unique ID for a test. */\n static generateTestID(prefix) {\n return prefix + '_' + VexFlowTests.NEXT_TEST_ID++;\n }\n /**\n * Run `func` inside a QUnit test for each of the enabled rendering backends.\n * @param name\n * @param testFunc\n * @param params\n */\n // eslint-disable-next-line\n static runTests(name, testFunc, params) {\n VexFlowTests.runCanvasTest(name, testFunc, params);\n VexFlowTests.runSVGTest(name, testFunc, params);\n VexFlowTests.runNodeTest(name, testFunc, params);\n }\n /**\n * Append a
which contains the test case title and rendered output.\n * See flow.html and flow.css.\n * @param elementId\n * @param testTitle\n * @param tagName\n */\n static createTest(elementId, testTitle, tagName, titleId = '') {\n const anchorTestTitle = `${testTitle}`;\n const title = $('
').addClass('name').attr('id', titleId).html(anchorTestTitle).get(0);\n const vexOutput = $(`<${tagName}/>`).addClass('vex-tabdiv').attr('id', elementId).get(0);\n const container = $('
').addClass('testcanvas').append(title, vexOutput).get(0);\n $('#vexflow_testoutput').append(container);\n return vexOutput;\n }\n static makeFactory(options, width = 450, height = 140) {\n const { elementId, backend } = options;\n return new Factory({ renderer: { elementId, backend, width, height } });\n }\n // eslint-disable-next-line\n static runCanvasTest(name, testFunc, params) {\n if (VexFlowTests.RUN_CANVAS_TESTS) {\n const helper = null;\n VexFlowTests.runWithParams(Object.assign(Object.assign({}, CANVAS_TEST_CONFIG), { name, testFunc, params, helper }));\n }\n }\n // eslint-disable-next-line\n static runSVGTest(name, testFunc, params) {\n if (VexFlowTests.RUN_SVG_TESTS) {\n const helper = null;\n VexFlowTests.runWithParams(Object.assign(Object.assign({}, SVG_TEST_CONFIG), { name, testFunc, params, helper }));\n }\n }\n // eslint-disable-next-line\n static runNodeTest(name, testFunc, params) {\n if (VexFlowTests.RUN_NODE_TESTS) {\n const helper = VexFlowTests.runNodeTestHelper;\n VexFlowTests.runWithParams(Object.assign(Object.assign({}, NODE_TEST_CONFIG), { name, testFunc, params, helper }));\n }\n }\n /**\n * Save the PNG file.\n * @param fontName\n * @param element\n */\n static runNodeTestHelper(fontName, element) {\n if (Renderer.lastContext !== undefined) {\n const moduleName = sanitizeName(QUnit.current_module);\n const testName = sanitizeName(QUnit.current_test);\n // If we are only testing Bravura, we OMIT the font name from the\n // output image file name, which allows visual diffs against\n // the previous release: version 3.0.9. In the future, if we decide\n // to test all fonts by default, we can remove this check.\n const onlyBravura = NODE_TEST_CONFIG.fontStacks.length === 1 && fontName === 'Bravura';\n const fontInfo = onlyBravura ? '' : `.${fontName}`;\n const fileName = `${VexFlowTests.NODE_IMAGEDIR}/${moduleName}.${testName}${fontInfo}.png`;\n const imageData = element.toDataURL().split(';base64,').pop();\n const imageBuffer = Buffer.from(imageData, 'base64');\n VexFlowTests.shims.fs.writeFileSync(fileName, imageBuffer, { encoding: 'base64' });\n }\n }\n /** Run QUnit.test(...) for each font. */\n // eslint-disable-next-line\n static runWithParams({ fontStacks, testFunc, name, params, backend, tagName, testType, helper }) {\n if (name === undefined) {\n throw new Error('Test name is undefined.');\n }\n const testTypeLowerCase = testType.toLowerCase();\n fontStacks.forEach((fontStackName) => {\n QUnit.test(name, (assert) => {\n useTempFontStack(fontStackName);\n const elementId = VexFlowTests.generateTestID(`${testTypeLowerCase}_` + fontStackName);\n const moduleName = assert.test.module.name;\n const title = moduleName + ' › ' + name + ` › ${testType} + ${fontStackName}`;\n // Add an element id for the title div, so that we can scroll directly to a test case.\n // Add a fragment identifier to the url (e.g., #Stave.Multiple_Stave_Barline_Test.Bravura)\n // This titleId will match the name of the PNGs generated by visual regression tests\n // (without the _Current.png or _Reference.png).\n let prefix = '';\n if (testTypeLowerCase === 'canvas') {\n prefix = testTypeLowerCase + '_';\n }\n else {\n // DO NOT ADD A PREFIX TO SVG TESTS\n // The canvas prefix above is for making sure our element ids are unique,\n // since we have a canvas+bravura test case and a svg+bravura test case\n // that would otherwise have the same titleId.\n }\n const titleId = `${prefix}${sanitizeName(moduleName)}.${sanitizeName(name)}.${fontStackName}`;\n const element = VexFlowTests.createTest(elementId, title, tagName, titleId);\n const options = { elementId, params, assert, backend };\n const isSVG = backend === Renderer.Backends.SVG;\n const contextBuilder = isSVG ? Renderer.getSVGContext : Renderer.getCanvasContext;\n testFunc(options, contextBuilder);\n restoreOriginalFontStack();\n if (helper)\n helper(fontStackName, element);\n });\n });\n }\n /**\n * @param ctx\n * @param x\n * @param y\n */\n static plotLegendForNoteWidth(ctx, x, y) {\n ctx.save();\n ctx.setFont(Font.SANS_SERIF, 8);\n const spacing = 12;\n let lastY = y;\n function legend(color, text) {\n ctx.beginPath();\n ctx.setStrokeStyle(color);\n ctx.setFillStyle(color);\n ctx.setLineWidth(10);\n ctx.moveTo(x, lastY - 4);\n ctx.lineTo(x + 10, lastY - 4);\n ctx.stroke();\n ctx.setFillStyle('black');\n ctx.fillText(text, x + 15, lastY);\n lastY += spacing;\n }\n legend('green', 'Note + Flag');\n legend('red', 'Modifiers');\n legend('#999', 'Displaced Head');\n legend('#DDD', 'Formatter Shift');\n ctx.restore();\n }\n}\nVexFlowTests.tests = [];\nVexFlowTests.RUN_CANVAS_TESTS = true;\nVexFlowTests.RUN_SVG_TESTS = true;\nVexFlowTests.RUN_NODE_TESTS = false;\n// Default font properties for tests.\nVexFlowTests.Font = { size: 10 };\n/**\n * Each font stack is a prioritized list of font names.\n */\nVexFlowTests.FONT_STACKS = {\n Bravura: ['Bravura', 'Gonville', 'Custom'],\n Gonville: ['Gonville', 'Bravura', 'Custom'],\n Petaluma: ['Petaluma', 'Gonville', 'Bravura', 'Custom'],\n};\nVexFlowTests.NEXT_TEST_ID = 0;\n/**\n * Used with array.reduce(...) to flatten arrays of arrays in the tests.\n */\n// eslint-disable-next-line\nexport const concat = (a, b) => a.concat(b);\n/** Used in KeySignature and ClefKeySignature Tests. */\nexport const MAJOR_KEYS = [\n //\n 'C',\n 'F',\n 'Bb',\n 'Eb',\n 'Ab',\n 'Db',\n 'Gb',\n 'Cb',\n 'G',\n 'D',\n 'A',\n 'E',\n 'B',\n 'F#',\n 'C#',\n];\nexport const MINOR_KEYS = [\n 'Am',\n 'Dm',\n 'Gm',\n 'Cm',\n 'Fm',\n 'Bbm',\n 'Ebm',\n 'Abm',\n 'Em',\n 'Bm',\n 'F#m',\n 'C#m',\n 'G#m',\n 'D#m',\n 'A#m',\n];\n// VexFlow classes can be accessed via Vex.Flow.* or by directly importing a library class.\n// Tests can be accessed via Vex.Flow.Test.* or by directly importing a test class.\n// Here we set Vex.Flow.Test = VexFlowTests.\n// eslint-disable-next-line\n// @ts-ignore\nFlow.Test = VexFlowTests;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// VF.* Prefix Tests\n//\n// VexFlow classes are available under the global Vex.Flow.* namespace.\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Accidental, Annotation, Articulation, Barline, BarNote, Beam, Bend, BoundingBox, BoundingBoxComputation, ChordSymbol, Clef, ClefNote, Crescendo, Curve, Dot, EasyScore, Element, Factory, Flow, Font, Formatter, Fraction, FretHandFinger, GhostNote, Glyph, GlyphNote, GraceNote, GraceNoteGroup, GraceTabNote, KeyManager, KeySignature, KeySigNote, Modifier, ModifierContext, MultiMeasureRest, Music, Note, NoteHead, NoteSubGroup, Ornament, Parser, PedalMarking, Registry, Renderer, RepeatNote, Repetition, Stave, StaveConnector, StaveHairpin, StaveLine, StaveModifier, StaveNote, StaveTempo, StaveText, StaveTie, Stem, StringNumber, Stroke, System, TabNote, TabSlide, TabStave, TabTie, TextBracket, TextDynamics, TextFormatter, TextNote, TickContext, TimeSignature, TimeSigNote, Tremolo, Tuning, Tuplet, Vibrato, VibratoBracket, Voice, Volta, } from '../src/index';\nconst VFPrefixTests = {\n Start() {\n QUnit.module('VF.* API');\n test('VF.* API', VF_Prefix);\n test('VF Alias', VF_Alias);\n },\n};\nfunction VF_Prefix() {\n // Intentionally use Vex.Flow here so we can verify that the Vex.Flow.* API\n // is equivalent to using the individual classes in TypeScript.\n const VF = Vex.Flow;\n equal(Accidental, VF.Accidental);\n equal(Annotation, VF.Annotation);\n equal(Articulation, VF.Articulation);\n equal(Barline, VF.Barline);\n equal(BarNote, VF.BarNote);\n equal(Beam, VF.Beam);\n equal(Bend, VF.Bend);\n equal(BoundingBox, VF.BoundingBox);\n equal(BoundingBoxComputation, VF.BoundingBoxComputation);\n equal(ChordSymbol, VF.ChordSymbol);\n equal(Clef, VF.Clef);\n equal(ClefNote, VF.ClefNote);\n equal(Crescendo, VF.Crescendo);\n equal(Curve, VF.Curve);\n equal(Dot, VF.Dot);\n equal(EasyScore, VF.EasyScore);\n equal(Element, VF.Element);\n equal(Factory, VF.Factory);\n equal(Flow.RESOLUTION, VF.RESOLUTION);\n equal(Font, VF.Font);\n equal(Formatter, VF.Formatter);\n propEqual(new Formatter(), new VF.Formatter(), 'new Formatter()');\n equal(Fraction, VF.Fraction);\n equal(FretHandFinger, VF.FretHandFinger);\n equal(GhostNote, VF.GhostNote);\n equal(Glyph, VF.Glyph);\n equal(GlyphNote, VF.GlyphNote);\n equal(GraceNote, VF.GraceNote);\n equal(GraceNoteGroup, VF.GraceNoteGroup);\n equal(GraceTabNote, VF.GraceTabNote);\n equal(KeyManager, VF.KeyManager);\n equal(KeySignature, VF.KeySignature);\n equal(KeySigNote, VF.KeySigNote);\n equal(Modifier, VF.Modifier);\n equal(ModifierContext, VF.ModifierContext);\n equal(MultiMeasureRest, VF.MultiMeasureRest);\n equal(Music, VF.Music);\n equal(Note, VF.Note);\n equal(NoteHead, VF.NoteHead);\n equal(NoteSubGroup, VF.NoteSubGroup);\n equal(Ornament, VF.Ornament);\n equal(Parser, VF.Parser);\n equal(PedalMarking, VF.PedalMarking);\n equal(Registry, VF.Registry);\n equal(Renderer, VF.Renderer);\n equal(RepeatNote, VF.RepeatNote);\n equal(Repetition, VF.Repetition);\n equal(Stave, VF.Stave);\n notEqual(Stave, VF.StaveNote);\n equal(StaveConnector, VF.StaveConnector);\n equal(StaveHairpin, VF.StaveHairpin);\n equal(StaveLine, VF.StaveLine);\n equal(StaveModifier, VF.StaveModifier);\n equal(StaveNote, VF.StaveNote);\n equal(StaveTempo, VF.StaveTempo);\n equal(StaveText, VF.StaveText);\n equal(StaveTie, VF.StaveTie);\n equal(Stem, VF.Stem);\n equal(StringNumber, VF.StringNumber);\n equal(Stroke, VF.Stroke);\n equal(System, VF.System);\n equal(TabNote, VF.TabNote);\n equal(TabSlide, VF.TabSlide);\n equal(TabStave, VF.TabStave);\n equal(TabTie, VF.TabTie);\n equal(TextBracket, VF.TextBracket);\n equal(TextDynamics, VF.TextDynamics);\n equal(TextFormatter, VF.TextFormatter);\n equal(TextNote, VF.TextNote);\n equal(TickContext, VF.TickContext);\n equal(TimeSignature, VF.TimeSignature);\n equal(TimeSigNote, VF.TimeSigNote);\n equal(Tremolo, VF.Tremolo);\n equal(Tuning, VF.Tuning);\n equal(Tuplet, VF.Tuplet);\n equal(Vibrato, VF.Vibrato);\n equal(VibratoBracket, VF.VibratoBracket);\n equal(Voice, VF.Voice);\n equal(Volta, VF.Volta);\n}\n/**\n * If you have name collisions with VexFlow classes, consider extracting classes from Vex.Flow\n * and renaming them with a VF prefix.\n */\nfunction VF_Alias() {\n const Flow = Vex.Flow;\n const VFAliases = {\n get VFAccidental() {\n return Flow.Accidental;\n },\n get VFAnnotation() {\n return Flow.Annotation;\n },\n get VFVibrato() {\n return Flow.Vibrato;\n },\n };\n const { VFVibrato, VFAccidental, VFAnnotation } = VFAliases;\n equal(Accidental, VFAccidental);\n equal(Annotation, VFAnnotation);\n const vibrato = new VFVibrato();\n ok(vibrato);\n const acc1 = new VFAccidental('##');\n const acc2 = new Accidental('##');\n equal(acc1.type, acc2.type);\n}\nVexFlowTests.register(VFPrefixTests);\nexport { VFPrefixTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Vibrato Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Bend, Font, Formatter, TabNote, TabStave, Vibrato } from '../src/index';\nconst VibratoTests = {\n Start() {\n QUnit.module('Vibrato');\n const run = VexFlowTests.runTests;\n run('Simple Vibrato', simple);\n run('Harsh Vibrato', harsh);\n run('Vibrato with Bend', withBend);\n },\n};\n// Helper function to create TabNote objects.\nconst tabNote = (noteStruct) => new TabNote(noteStruct);\n/**\n * Default vibrato symbol (wavy line) on top of a tab with two notes fretted.\n */\nfunction simple(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 500, 240);\n ctx.scale(1.5, 1.5);\n ctx.fillStyle = '#221';\n ctx.strokeStyle = '#221';\n ctx.font = '10pt Arial';\n const stave = new TabStave(10, 10, 450).addTabGlyph().setContext(ctx).draw();\n const notes = [\n tabNote({\n positions: [\n { str: 2, fret: 10 },\n { str: 4, fret: 9 },\n ],\n duration: 'h',\n }).addModifier(new Vibrato(), 0),\n tabNote({\n positions: [{ str: 2, fret: 10 }],\n duration: 'h',\n }).addModifier(new Vibrato(), 0),\n ];\n Formatter.FormatAndDraw(ctx, stave, notes);\n ok(true, 'Simple Vibrato');\n}\n/**\n * The harsh vibrato symbol is a zig zag line with sharp points.\n * This test is nearly identical to the 'simple' test above.\n * The only difference is that we call .setHarsh(true) on each Vibrato object.\n */\nfunction harsh(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 500, 240);\n ctx.scale(1.5, 1.5);\n ctx.fillStyle = '#221';\n ctx.strokeStyle = '#221';\n ctx.font = '10pt Arial';\n const stave = new TabStave(10, 10, 450).addTabGlyph().setContext(ctx).draw();\n const notes = [\n tabNote({\n positions: [\n { str: 2, fret: 10 },\n { str: 4, fret: 9 },\n ],\n duration: 'h',\n }).addModifier(new Vibrato().setHarsh(true), 0),\n tabNote({\n positions: [{ str: 2, fret: 10 }],\n duration: 'h',\n }).addModifier(new Vibrato().setHarsh(true), 0),\n ];\n Formatter.FormatAndDraw(ctx, stave, notes);\n ok(true, 'Harsh Vibrato');\n}\nfunction withBend(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 500, 240);\n ctx.scale(1.3, 1.3);\n ctx.setFillStyle('#221');\n ctx.setStrokeStyle('#221');\n ctx.setFont(Font.SANS_SERIF, VexFlowTests.Font.size);\n const stave = new TabStave(10, 10, 450).addTabGlyph().setContext(ctx).draw();\n const notes = [\n tabNote({\n positions: [\n { str: 2, fret: 9 },\n { str: 3, fret: 9 },\n ],\n duration: 'q',\n })\n .addModifier(new Bend('1/2', true), 0)\n .addModifier(new Bend('1/2', true), 1)\n .addModifier(new Vibrato(), 0),\n tabNote({\n positions: [{ str: 2, fret: 10 }],\n duration: 'q',\n })\n .addModifier(new Bend('Full', false), 0)\n .addModifier(new Vibrato().setVibratoWidth(60), 0),\n tabNote({\n positions: [{ str: 2, fret: 10 }],\n duration: 'h',\n }).addModifier(new Vibrato().setVibratoWidth(120).setHarsh(true), 0),\n ];\n Formatter.FormatAndDraw(ctx, stave, notes);\n ok(true, 'Vibrato with Bend');\n}\nVexFlowTests.register(VibratoTests);\nexport { VibratoTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// Author: Balazs Forian-Szabo\n//\n// VibratoBracket Tests\n// TODO: It's annoying to have to cast \"as Note\" or \"as Note[]\". Could we add a method to Voice to get the tickables as Note[]? Voice.getTickables() vs Voice.getNotes()?\nimport { VexFlowTests } from './vexflow_test_helpers';\nconst VibratoBracketTests = {\n Start() {\n QUnit.module('VibratoBracket');\n const run = VexFlowTests.runTests;\n run('Simple VibratoBracket', simple);\n run('Harsh VibratoBracket Without End Note', withoutEndNote);\n run('Harsh VibratoBracket Without Start Note', withoutStartNote);\n },\n};\n// Helper function to set up the stave, easyscore, voice, and to format & draw.\nfunction createTest(noteGroup, setupVibratoBracket) {\n return (options) => {\n const factory = VexFlowTests.makeFactory(options, 650, 200);\n const stave = factory.Stave();\n const score = factory.EasyScore();\n const voice = score.voice(score.notes(noteGroup));\n setupVibratoBracket(factory, voice.getTickables());\n factory.Formatter().joinVoices([voice]).formatToStave([voice], stave);\n factory.draw();\n ok(true);\n };\n}\nconst simple = createTest('c4/4, c4, c4, c4', (factory, notes) => {\n factory.VibratoBracket({\n from: notes[0],\n to: notes[3],\n options: { line: 2 },\n });\n});\nconst withoutEndNote = createTest('c4/4, c4, c4, c4', (factory, notes) => {\n factory.VibratoBracket({\n from: notes[2],\n to: null,\n options: { line: 2, harsh: true },\n });\n});\nconst withoutStartNote = createTest('c4/4, c4, c4, c4', (factory, notes) => {\n factory.VibratoBracket({\n from: null,\n to: notes[2],\n options: { line: 2, harsh: true },\n });\n});\nVexFlowTests.register(VibratoBracketTests);\nexport { VibratoBracketTests };\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Voice Tests\nimport { VexFlowTests } from './vexflow_test_helpers';\nimport { Flow } from '../src/flow';\nimport { Formatter } from '../src/formatter';\nimport { Stave } from '../src/stave';\nimport { Barline } from '../src/stavebarline';\nimport { StaveNote } from '../src/stavenote';\nimport { Voice } from '../src/voice';\nimport { MockTickable } from './mocks';\nconst VoiceTests = {\n Start() {\n QUnit.module('Voice');\n test('Strict Test', strict);\n test('Ignore Test', ignore);\n VexFlowTests.runTests('Full Voice Mode Test', full);\n },\n};\nconst BEAT = (1 * Flow.RESOLUTION) / 4;\n// Helper function to create a tickable with a preset number of ticks.\nconst createTickable = () => new MockTickable().setTicks(BEAT);\nfunction strict() {\n expect(8);\n const tickables = [createTickable(), createTickable(), createTickable()];\n const voice = new Voice(Flow.TIME4_4);\n equal(voice.getTotalTicks().value(), BEAT * 4, '4/4 Voice has 4 beats');\n equal(voice.getTicksUsed().value(), BEAT * 0, 'No beats in voice');\n voice.addTickables(tickables);\n equal(voice.getTicksUsed().value(), BEAT * 3, 'Three beats in voice');\n voice.addTickable(createTickable());\n equal(voice.getTicksUsed().value(), BEAT * 4, 'Four beats in voice');\n equal(voice.isComplete(), true, 'Voice is complete');\n const numeratorBeforeException = voice.getTicksUsed().numerator;\n throws(() => voice.addTickable(createTickable()), /BadArgument/, '\"Too many ticks\" exception');\n // Verify that adding too many ticks does not affect the `ticksUsed` property of the voice.\n // See voice.ts: this.ticksUsed.subtract(ticks);\n equal(voice.getTicksUsed().numerator, numeratorBeforeException, 'Revert `ticksUsed` after a \"Too many ticks\" exception');\n equal(voice.getSmallestTickCount().value(), BEAT, 'Smallest tick count is BEAT');\n}\nfunction ignore() {\n const tickables = [\n createTickable(),\n createTickable(),\n createTickable().setIgnoreTicks(true),\n createTickable(),\n createTickable().setIgnoreTicks(true),\n createTickable(),\n ];\n const voice = new Voice(Flow.TIME4_4);\n voice.addTickables(tickables);\n ok(true, 'all pass');\n}\nfunction full(options, contextBuilder) {\n const ctx = contextBuilder(options.elementId, 550, 200);\n const stave = new Stave(10, 50, 500).addClef('treble').addTimeSignature('4/4').setEndBarType(Barline.type.END);\n const notes = [\n new StaveNote({ keys: ['c/4'], duration: '4' }),\n new StaveNote({ keys: ['d/4'], duration: '4' }),\n new StaveNote({ keys: ['r/4'], duration: '4r' }),\n ];\n notes.forEach((note) => note.setStave(stave));\n const voice = new Voice(Flow.TIME4_4).setMode(Voice.Mode.FULL).addTickables(notes);\n new Formatter().joinVoices([voice]).formatToStave([voice], stave);\n stave.setContext(ctx).draw();\n voice.draw(ctx);\n const bb = voice.getBoundingBox();\n if (bb) {\n ctx.rect(bb.getX(), bb.getY(), bb.getW(), bb.getH());\n }\n ctx.stroke();\n throws(() => voice.addTickable(new StaveNote({ keys: ['c/4'], duration: '2' })), /BadArgument/, 'Voice cannot exceed full amount of ticks');\n}\nVexFlowTests.register(VoiceTests);\nexport { VoiceTests };\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// vexflow-debug-with-tests.ts is the entry point for the build output file vexflow-debug-with-tests.js.\n// It statically bundles all the music engraving fonts, and also includes the tests from vexflow/tests/.\n// The output file is used by flow.html & flow-headless-browser.html to run the tests.\nimport { Vex } from './vexflow';\nexport * from '../src/index';\nexport * from '../tests/index';\nexport default Vex;\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/build/cjs/vexflow-debug.js b/build/cjs/vexflow-debug.js new file mode 100644 index 0000000000..3d4cdb7ccd --- /dev/null +++ b/build/cjs/vexflow-debug.js @@ -0,0 +1,31991 @@ +/*! + * VexFlow 4.0.1-alpha.2 2022-02-02T09:30:30.784Z 0df10df6d1fab3a99f5aa306341a31c6e686d659 + * Copyright (c) 2010 Mohit Muthanna Cheppudira + * https://www.vexflow.com https://github.com/0xfe/vexflow + */ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["Vex"] = factory(); + else + root["Vex"] = factory(); +})((typeof window !== 'undefined' ? window : typeof globalThis !== 'undefined' ? globalThis : this), function() { +return /******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ "./src/version.ts": +/*!************************!*\ + !*** ./src/version.ts ***! + \************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "VERSION": () => (/* binding */ VERSION), +/* harmony export */ "ID": () => (/* binding */ ID), +/* harmony export */ "DATE": () => (/* binding */ DATE) +/* harmony export */ }); +const VERSION = '4.0.1-alpha.2'; +const ID = '0df10df6d1fab3a99f5aa306341a31c6e686d659'; +const DATE = '2022-02-02T09:30:30.784Z'; + + +/***/ }), + +/***/ "./entry/vexflow.ts": +/*!**************************!*\ + !*** ./entry/vexflow.ts ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Accidental": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Accidental), +/* harmony export */ "Annotation": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Annotation), +/* harmony export */ "AnnotationHorizontalJustify": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.AnnotationHorizontalJustify), +/* harmony export */ "AnnotationVerticalJustify": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.AnnotationVerticalJustify), +/* harmony export */ "Articulation": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Articulation), +/* harmony export */ "BarNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.BarNote), +/* harmony export */ "Barline": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Barline), +/* harmony export */ "BarlineType": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.BarlineType), +/* harmony export */ "Beam": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Beam), +/* harmony export */ "Bend": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Bend), +/* harmony export */ "BoundingBox": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.BoundingBox), +/* harmony export */ "BoundingBoxComputation": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.BoundingBoxComputation), +/* harmony export */ "Builder": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Builder), +/* harmony export */ "CanvasContext": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.CanvasContext), +/* harmony export */ "Category": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Category), +/* harmony export */ "ChordSymbol": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.ChordSymbol), +/* harmony export */ "ChordSymbolHorizontalJustify": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.ChordSymbolHorizontalJustify), +/* harmony export */ "ChordSymbolVerticalJustify": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.ChordSymbolVerticalJustify), +/* harmony export */ "Clef": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Clef), +/* harmony export */ "ClefNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.ClefNote), +/* harmony export */ "Crescendo": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Crescendo), +/* harmony export */ "Curve": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Curve), +/* harmony export */ "CurvePosition": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.CurvePosition), +/* harmony export */ "Dot": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Dot), +/* harmony export */ "EasyScore": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.EasyScore), +/* harmony export */ "EasyScoreGrammar": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.EasyScoreGrammar), +/* harmony export */ "Element": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Element), +/* harmony export */ "Factory": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Factory), +/* harmony export */ "Flow": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Flow), +/* harmony export */ "Font": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Font), +/* harmony export */ "FontStyle": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.FontStyle), +/* harmony export */ "FontWeight": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.FontWeight), +/* harmony export */ "Formatter": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Formatter), +/* harmony export */ "Fraction": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Fraction), +/* harmony export */ "FretHandFinger": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.FretHandFinger), +/* harmony export */ "GhostNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.GhostNote), +/* harmony export */ "Glyph": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Glyph), +/* harmony export */ "GlyphNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.GlyphNote), +/* harmony export */ "GraceNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.GraceNote), +/* harmony export */ "GraceNoteGroup": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.GraceNoteGroup), +/* harmony export */ "GraceTabNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.GraceTabNote), +/* harmony export */ "Justification": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Justification), +/* harmony export */ "KeyManager": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.KeyManager), +/* harmony export */ "KeySigNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.KeySigNote), +/* harmony export */ "KeySignature": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.KeySignature), +/* harmony export */ "Modifier": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Modifier), +/* harmony export */ "ModifierContext": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.ModifierContext), +/* harmony export */ "ModifierPosition": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.ModifierPosition), +/* harmony export */ "MultiMeasureRest": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.MultiMeasureRest), +/* harmony export */ "Music": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Music), +/* harmony export */ "Note": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Note), +/* harmony export */ "NoteHead": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.NoteHead), +/* harmony export */ "NoteSubGroup": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.NoteSubGroup), +/* harmony export */ "Ornament": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Ornament), +/* harmony export */ "OutlineCode": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.OutlineCode), +/* harmony export */ "Parenthesis": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Parenthesis), +/* harmony export */ "Parser": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Parser), +/* harmony export */ "PedalMarking": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.PedalMarking), +/* harmony export */ "Piece": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Piece), +/* harmony export */ "Registry": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Registry), +/* harmony export */ "RenderContext": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.RenderContext), +/* harmony export */ "Renderer": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Renderer), +/* harmony export */ "RendererBackends": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.RendererBackends), +/* harmony export */ "RendererLineEndType": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.RendererLineEndType), +/* harmony export */ "RepeatNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.RepeatNote), +/* harmony export */ "Repetition": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Repetition), +/* harmony export */ "RuntimeError": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.RuntimeError), +/* harmony export */ "SVGContext": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.SVGContext), +/* harmony export */ "Stave": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Stave), +/* harmony export */ "StaveConnector": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.StaveConnector), +/* harmony export */ "StaveHairpin": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.StaveHairpin), +/* harmony export */ "StaveLine": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.StaveLine), +/* harmony export */ "StaveModifier": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.StaveModifier), +/* harmony export */ "StaveModifierPosition": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.StaveModifierPosition), +/* harmony export */ "StaveNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.StaveNote), +/* harmony export */ "StaveSection": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.StaveSection), +/* harmony export */ "StaveTempo": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.StaveTempo), +/* harmony export */ "StaveText": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.StaveText), +/* harmony export */ "StaveTie": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.StaveTie), +/* harmony export */ "Stem": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Stem), +/* harmony export */ "StemmableNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.StemmableNote), +/* harmony export */ "StringNumber": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.StringNumber), +/* harmony export */ "Stroke": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Stroke), +/* harmony export */ "SymbolModifiers": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.SymbolModifiers), +/* harmony export */ "SymbolTypes": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.SymbolTypes), +/* harmony export */ "System": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.System), +/* harmony export */ "TabNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.TabNote), +/* harmony export */ "TabSlide": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.TabSlide), +/* harmony export */ "TabStave": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.TabStave), +/* harmony export */ "TabTie": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.TabTie), +/* harmony export */ "TextBracket": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.TextBracket), +/* harmony export */ "TextBracketPosition": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.TextBracketPosition), +/* harmony export */ "TextDynamics": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.TextDynamics), +/* harmony export */ "TextFormatter": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.TextFormatter), +/* harmony export */ "TextNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.TextNote), +/* harmony export */ "TickContext": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.TickContext), +/* harmony export */ "Tickable": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Tickable), +/* harmony export */ "TimeSigNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.TimeSigNote), +/* harmony export */ "TimeSignature": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.TimeSignature), +/* harmony export */ "TimeSignatureGlyph": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.TimeSignatureGlyph), +/* harmony export */ "Tremolo": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Tremolo), +/* harmony export */ "Tuning": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Tuning), +/* harmony export */ "Tuplet": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Tuplet), +/* harmony export */ "TupletLocation": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.TupletLocation), +/* harmony export */ "Vex": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Vex), +/* harmony export */ "Vibrato": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Vibrato), +/* harmony export */ "VibratoBracket": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.VibratoBracket), +/* harmony export */ "Voice": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Voice), +/* harmony export */ "VoiceMode": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.VoiceMode), +/* harmony export */ "Volta": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.Volta), +/* harmony export */ "VoltaType": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.VoltaType), +/* harmony export */ "defined": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.defined), +/* harmony export */ "drawDot": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.drawDot), +/* harmony export */ "globalObject": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.globalObject), +/* harmony export */ "isAccidental": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.isAccidental), +/* harmony export */ "isAnnotation": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.isAnnotation), +/* harmony export */ "isBarline": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.isBarline), +/* harmony export */ "isCategory": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.isCategory), +/* harmony export */ "isDot": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.isDot), +/* harmony export */ "isGraceNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.isGraceNote), +/* harmony export */ "isGraceNoteGroup": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.isGraceNoteGroup), +/* harmony export */ "isHTMLCanvas": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.isHTMLCanvas), +/* harmony export */ "isHTMLDiv": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.isHTMLDiv), +/* harmony export */ "isNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.isNote), +/* harmony export */ "isRenderContext": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.isRenderContext), +/* harmony export */ "isStaveNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.isStaveNote), +/* harmony export */ "isStemmableNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.isStemmableNote), +/* harmony export */ "isTabNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.isTabNote), +/* harmony export */ "log": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.log), +/* harmony export */ "midLine": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.midLine), +/* harmony export */ "normalizeAngle": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.normalizeAngle), +/* harmony export */ "prefix": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.prefix), +/* harmony export */ "warn": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_4__.warn), +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _src_vex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/vex */ "./src/vex.ts"); +/* harmony import */ var _src_flow__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/flow */ "./src/flow.ts"); +/* harmony import */ var _src_fonts_load_all__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/fonts/load_all */ "./src/fonts/load_all.ts"); +/* harmony import */ var _src_fonts_textfonts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/fonts/textfonts */ "./src/fonts/textfonts.ts"); +/* harmony import */ var _src_index__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/index */ "./src/index.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// vexflow.ts is the entry point for the build output file vexflow.js. +// It statically bundles all the music engraving fonts, and sets the music font stack to: +// Flow.setMusicFont('Bravura', 'Gonville', 'Custom'); +// The webpack config inside Gruntfile.js sets the mode to 'production' to produce a minified build. + + + + +(0,_src_fonts_load_all__WEBPACK_IMPORTED_MODULE_2__.loadAllMusicFonts)(); +_src_flow__WEBPACK_IMPORTED_MODULE_1__.Flow.setMusicFont('Bravura', 'Gonville', 'Custom'); +(0,_src_fonts_textfonts__WEBPACK_IMPORTED_MODULE_3__.loadTextFonts)(); + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_src_vex__WEBPACK_IMPORTED_MODULE_0__.Vex); + + +/***/ }), + +/***/ "./src/accidental.ts": +/*!***************************!*\ + !*** ./src/accidental.ts ***! + \***************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Accidental": () => (/* binding */ Accidental) +/* harmony export */ }); +/* harmony import */ var _fraction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./fraction */ "./src/fraction.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _music__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./music */ "./src/music.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// @author Mohit Cheppudira +// @author Greg Ristow (modifications) + + + + + + + +// eslint-disable-next-line +function L(...args) { + if (Accidental.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_6__.log)('Vex.Flow.Accidental', args); +} +/** + * An `Accidental` inherits from `Modifier`, and is formatted within a + * `ModifierContext`. Accidentals are modifiers that can be attached to + * notes. Support is included for both western and microtonal accidentals. + * + * See `tests/accidental_tests.ts` for usage examples. + */ +class Accidental extends _modifier__WEBPACK_IMPORTED_MODULE_2__.Modifier { + /** + * Create accidental. + * @param type value from `Vex.Flow.accidentalCodes.accidentals` table in `tables.ts`. + * For example: `#`, `##`, `b`, `n`, etc. + */ + constructor(type) { + super(); + L('New accidental: ', type); + this.type = type; + this.position = _modifier__WEBPACK_IMPORTED_MODULE_2__.Modifier.Position.LEFT; + this.render_options = { + // Font size for glyphs + font_scale: 38, + // Padding between accidental and parentheses on each side + parenLeftPadding: 2, + parenRightPadding: 2, + }; + this.accidental = _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.accidentalCodes(this.type); + (0,_util__WEBPACK_IMPORTED_MODULE_6__.defined)(this.accidental, 'ArgumentError', `Unknown accidental type: ${type}`); + // Cautionary accidentals have parentheses around them + this.cautionary = false; + this.reset(); + } + /** Accidentals category string. */ + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_5__.Category.Accidental; + } + /** Arrange accidentals inside a ModifierContext. */ + static format(accidentals, state) { + // If there are no accidentals, no need to format their positions. + if (!accidentals || accidentals.length === 0) + return; + const musicFont = _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.currentMusicFont(); + const noteheadAccidentalPadding = musicFont.lookupMetric('accidental.noteheadAccidentalPadding'); + const leftShift = state.left_shift + noteheadAccidentalPadding; + const accidentalSpacing = musicFont.lookupMetric('accidental.accidentalSpacing'); + const additionalPadding = musicFont.lookupMetric('accidental.leftPadding'); // padding to the left of all accidentals + const accList = []; + let prevNote = undefined; + let shiftL = 0; + // First determine the accidentals' Y positions from the note.keys + for (let i = 0; i < accidentals.length; ++i) { + const acc = accidentals[i]; + const note = acc.getNote(); + const stave = note.getStave(); + const index = acc.checkIndex(); + const props = note.getKeyProps()[index]; + if (note !== prevNote) { + // Iterate through all notes to get the displaced pixels + for (let n = 0; n < note.keys.length; ++n) { + shiftL = Math.max(note.getLeftDisplacedHeadPx(), shiftL); + } + prevNote = note; + } + if (stave) { + const lineSpace = stave.getSpacingBetweenLines(); + const y = stave.getYForLine(props.line); + const accLine = Math.round((y / lineSpace) * 2) / 2; + accList.push({ y, line: accLine, shift: shiftL, acc, lineSpace }); + } + else { + accList.push({ line: props.line, shift: shiftL, acc }); + } + } + // Sort accidentals by line number. + accList.sort((a, b) => b.line - a.line); + // FIXME: Confusing name. Each object in this array has a property called `line`. + // So if this is a list of lines, you end up with: `line.line` which is very awkward. + const lineList = []; + // amount by which all accidentals must be shifted right or left for + // stem flipping, notehead shifting concerns. + let accShift = 0; + let previousLine = undefined; + // Create an array of unique line numbers (lineList) from accList + for (let i = 0; i < accList.length; i++) { + const acc = accList[i]; + // if this is the first line, or a new line, add a lineList + if (previousLine === undefined || previousLine !== acc.line) { + lineList.push({ + line: acc.line, + flatLine: true, + dblSharpLine: true, + numAcc: 0, + width: 0, + column: 0, + }); + } + // if this accidental is not a flat, the accidental needs 3.0 lines lower + // clearance instead of 2.5 lines for b or bb. + // FIXME: Naming could use work. acc.acc is very awkward + if (acc.acc.type !== 'b' && acc.acc.type !== 'bb') { + lineList[lineList.length - 1].flatLine = false; + } + // if this accidental is not a double sharp, the accidental needs 3.0 lines above + if (acc.acc.type !== '##') { + lineList[lineList.length - 1].dblSharpLine = false; + } + // Track how many accidentals are on this line: + lineList[lineList.length - 1].numAcc++; + // Track the total x_offset needed for this line which will be needed + // for formatting lines w/ multiple accidentals: + // width = accidental width + universal spacing between accidentals + lineList[lineList.length - 1].width += acc.acc.getWidth() + accidentalSpacing; + // if this accShift is larger, use it to keep first column accidentals in the same line + accShift = acc.shift > accShift ? acc.shift : accShift; + previousLine = acc.line; + } + // ### Place Accidentals in Columns + // + // Default to a classic triangular layout (middle accidental farthest left), + // but follow exceptions as outlined in G. Read's _Music Notation_ and + // Elaine Gould's _Behind Bars_. + // + // Additionally, this implements different vertical collision rules for + // flats (only need 2.5 lines clearance below) and double sharps (only + // need 2.5 lines of clearance above or below). + // + // Classic layouts and exception patterns are found in the 'tables.js' + // in 'Tables.accidentalColumnsTable' + // + // Beyond 6 vertical accidentals, default to the parallel ascending lines approach, + // using as few columns as possible for the verticle structure. + // + // TODO (?): Allow column to be specified for an accidental at run-time? + let totalColumns = 0; + // establish the boundaries for a group of notes with clashing accidentals: + for (let i = 0; i < lineList.length; i++) { + let noFurtherConflicts = false; + const groupStart = i; + let groupEnd = i; + while (groupEnd + 1 < lineList.length && !noFurtherConflicts) { + // if this note conflicts with the next: + if (this.checkCollision(lineList[groupEnd], lineList[groupEnd + 1])) { + // include the next note in the group: + groupEnd++; + } + else { + noFurtherConflicts = true; + } + } + // Gets an a line from the `lineList`, relative to the current group + const getGroupLine = (index) => lineList[groupStart + index]; + const getGroupLines = (indexes) => indexes.map(getGroupLine); + const lineDifference = (indexA, indexB) => { + const [a, b] = getGroupLines([indexA, indexB]).map((item) => item.line); + return a - b; + }; + const notColliding = (...indexPairs) => indexPairs.map(getGroupLines).every(([line1, line2]) => !this.checkCollision(line1, line2)); + // Set columns for the lines in this group: + const groupLength = groupEnd - groupStart + 1; + // Set the accidental column for each line of the group + let endCase = this.checkCollision(lineList[groupStart], lineList[groupEnd]) ? 'a' : 'b'; + switch (groupLength) { + case 3: + if (endCase === 'a' && lineDifference(1, 2) === 0.5 && lineDifference(0, 1) !== 0.5) { + endCase = 'second_on_bottom'; + } + break; + case 4: + if (notColliding([0, 2], [1, 3])) { + endCase = 'spaced_out_tetrachord'; + } + break; + case 5: + if (endCase === 'b' && notColliding([1, 3])) { + endCase = 'spaced_out_pentachord'; + if (notColliding([0, 2], [2, 4])) { + endCase = 'very_spaced_out_pentachord'; + } + } + break; + case 6: + if (notColliding([0, 3], [1, 4], [2, 5])) { + endCase = 'spaced_out_hexachord'; + } + if (notColliding([0, 2], [2, 4], [1, 3], [3, 5])) { + endCase = 'very_spaced_out_hexachord'; + } + break; + default: + break; + } + let groupMember; + let column; + // If the group contains seven members or more, use ascending parallel lines + // of accidentals, using as few columns as possible while avoiding collisions. + if (groupLength >= 7) { + // First, determine how many columns to use: + let patternLength = 2; + let collisionDetected = true; + while (collisionDetected === true) { + collisionDetected = false; + for (let line = 0; line + patternLength < lineList.length; line++) { + if (this.checkCollision(lineList[line], lineList[line + patternLength])) { + collisionDetected = true; + patternLength++; + break; + } + } + } + // Then, assign a column to each line of accidentals + for (groupMember = i; groupMember <= groupEnd; groupMember++) { + column = ((groupMember - i) % patternLength) + 1; + lineList[groupMember].column = column; + totalColumns = totalColumns > column ? totalColumns : column; + } + } + else { + // If the group contains fewer than seven members, use the layouts from + // the Tables.accidentalColumnsTable (See: tables.ts). + for (groupMember = i; groupMember <= groupEnd; groupMember++) { + column = _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.accidentalColumnsTable[groupLength][endCase][groupMember - i]; + lineList[groupMember].column = column; + totalColumns = totalColumns > column ? totalColumns : column; + } + } + // Increment i to the last note that was set, so that if a lower set of notes + // does not conflict at all with this group, it can have its own classic shape. + i = groupEnd; + } + // ### Convert Columns to x_offsets + // + // This keeps columns aligned, even if they have different accidentals within them + // which sometimes results in a larger x_offset than is an accidental might need + // to preserve the symmetry of the accidental shape. + // + // Neither A.C. Vinci nor G. Read address this, and it typically only happens in + // music with complex chord clusters. + // + // TODO (?): Optionally allow closer compression of accidentals, instead of forcing + // parallel columns. + // track each column's max width, which will be used as initial shift of later columns: + const columnWidths = []; + const columnXOffsets = []; + for (let i = 0; i <= totalColumns; i++) { + columnWidths[i] = 0; + columnXOffsets[i] = 0; + } + columnWidths[0] = accShift + leftShift; + columnXOffsets[0] = accShift + leftShift; + // Fill columnWidths with widest needed x-space; + // this is what keeps the columns parallel. + lineList.forEach((line) => { + if (line.width > columnWidths[line.column]) + columnWidths[line.column] = line.width; + }); + for (let i = 1; i < columnWidths.length; i++) { + // this column's offset = this column's width + previous column's offset + columnXOffsets[i] = columnWidths[i] + columnXOffsets[i - 1]; + } + const totalShift = columnXOffsets[columnXOffsets.length - 1]; + // Set the xShift for each accidental according to column offsets: + let accCount = 0; + lineList.forEach((line) => { + let lineWidth = 0; + const lastAccOnLine = accCount + line.numAcc; + // handle all of the accidentals on a given line: + for (accCount; accCount < lastAccOnLine; accCount++) { + const xShift = columnXOffsets[line.column - 1] + lineWidth; + accList[accCount].acc.setXShift(xShift); + // keep track of the width of accidentals we've added so far, so that when + // we loop, we add space for them. + lineWidth += accList[accCount].acc.getWidth() + accidentalSpacing; + L('Line, accCount, shift: ', line.line, accCount, xShift); + } + }); + // update the overall layout with the full width of the accidental shapes: + state.left_shift += totalShift + additionalPadding; + } + /** Helper function to determine whether two lines of accidentals collide vertically */ + static checkCollision(line1, line2) { + let clearance = line2.line - line1.line; + let clearanceRequired = 3; + // But less clearance is required for certain accidentals: b, bb and ##. + if (clearance > 0) { + // then line 2 is on top + clearanceRequired = line2.flatLine || line2.dblSharpLine ? 2.5 : 3.0; + if (line1.dblSharpLine) + clearance -= 0.5; + } + else { + // line 1 is on top + clearanceRequired = line1.flatLine || line1.dblSharpLine ? 2.5 : 3.0; + if (line2.dblSharpLine) + clearance -= 0.5; + } + const collision = Math.abs(clearance) < clearanceRequired; + L('Line_1, Line_2, Collision: ', line1.line, line2.line, collision); + return collision; + } + /** + * Use this method to automatically apply accidentals to a set of `voices`. + * The accidentals will be remembered between all the voices provided. + * Optionally, you can also provide an initial `keySignature`. + */ + static applyAccidentals(voices, keySignature) { + const tickPositions = []; + const tickNoteMap = {}; + // Sort the tickables in each voice by their tick position in the voice. + voices.forEach((voice) => { + const tickPosition = new _fraction__WEBPACK_IMPORTED_MODULE_0__.Fraction(0, 1); + const tickable = voice.getTickables(); + tickable.forEach((t) => { + if (t.shouldIgnoreTicks()) + return; + const notesAtPosition = tickNoteMap[tickPosition.value()]; + if (!notesAtPosition) { + tickPositions.push(tickPosition.value()); + tickNoteMap[tickPosition.value()] = [t]; + } + else { + notesAtPosition.push(t); + } + tickPosition.add(t.getTicks()); + }); + }); + const music = new _music__WEBPACK_IMPORTED_MODULE_3__.Music(); + // Default key signature is C major. + if (!keySignature) + keySignature = 'C'; + // Get the scale map, which represents the current state of each pitch. + const scaleMapKey = music.createScaleMap(keySignature); + const scaleMap = {}; + tickPositions.forEach((tickPos) => { + const tickables = tickNoteMap[tickPos]; + // Array to store all pitches that modified accidental states + // at this tick position + const modifiedPitches = []; + const processNote = (t) => { + // Only StaveNote implements .addModifier(), which is used below. + if (!(0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isStaveNote)(t) || t.isRest() || t.shouldIgnoreTicks()) { + return; + } + // Go through each key and determine if an accidental should be applied. + const staveNote = t; + staveNote.keys.forEach((keyString, keyIndex) => { + const key = music.getNoteParts(keyString.split('/')[0]); + const octave = keyString.split('/')[1]; + // Force a natural for every key without an accidental + const accidentalString = key.accidental || 'n'; + const pitch = key.root + accidentalString; + // Determine if the current pitch has the same accidental + // as the scale state + if (!scaleMap[key.root + octave]) + scaleMap[key.root + octave] = scaleMapKey[key.root]; + const sameAccidental = scaleMap[key.root + octave] === pitch; + // Determine if an identical pitch in the chord already + // modified the accidental state + const previouslyModified = modifiedPitches.indexOf(keyString) > -1; + // Remove accidentals + staveNote.getModifiers().forEach((modifier, index) => { + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isAccidental)(modifier) && modifier.type == accidentalString && modifier.getIndex() == keyIndex) { + staveNote.getModifiers().splice(index, 1); + } + }); + // Add the accidental to the StaveNote + if (!sameAccidental || (sameAccidental && previouslyModified)) { + // Modify the scale map so that the root pitch has an + // updated state + scaleMap[key.root + octave] = pitch; + // Create the accidental + const accidental = new Accidental(accidentalString); + // Attach the accidental to the StaveNote + staveNote.addModifier(accidental, keyIndex); + // Add the pitch to list of pitches that modified accidentals + modifiedPitches.push(keyString); + } + }); + // process grace notes + staveNote.getModifiers().forEach((modifier) => { + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isGraceNoteGroup)(modifier)) { + modifier.getGraceNotes().forEach(processNote); + } + }); + }; + tickables.forEach(processNote); + }); + } + reset() { + const fontScale = this.render_options.font_scale; + this.glyph = new _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph(this.accidental.code, fontScale); + this.glyph.setOriginX(1.0); + if (this.cautionary) { + this.parenLeft = new _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph(_tables__WEBPACK_IMPORTED_MODULE_4__.Tables.accidentalCodes('{').code, fontScale); + this.parenRight = new _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph(_tables__WEBPACK_IMPORTED_MODULE_4__.Tables.accidentalCodes('}').code, fontScale); + this.parenLeft.setOriginX(1.0); + this.parenRight.setOriginX(1.0); + } + } + /** Get width in pixels. */ + getWidth() { + if (this.cautionary) { + const parenLeft = (0,_util__WEBPACK_IMPORTED_MODULE_6__.defined)(this.parenLeft); + const parenRight = (0,_util__WEBPACK_IMPORTED_MODULE_6__.defined)(this.parenRight); + const parenWidth = parenLeft.getMetrics().width + + parenRight.getMetrics().width + + this.render_options.parenLeftPadding + + this.render_options.parenRightPadding; + return this.glyph.getMetrics().width + parenWidth; + } + else { + return this.glyph.getMetrics().width; + } + } + /** Attach this accidental to `note`, which must be a `StaveNote`. */ + setNote(note) { + (0,_util__WEBPACK_IMPORTED_MODULE_6__.defined)(note, 'ArgumentError', `Bad note value: ${note}`); + this.note = note; + // Accidentals attached to grace notes are rendered smaller. + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isGraceNote)(note)) { + this.render_options.font_scale = 25; + this.reset(); + } + return this; + } + /** If called, draws parenthesis around accidental. */ + setAsCautionary() { + this.cautionary = true; + this.render_options.font_scale = 28; + this.reset(); + return this; + } + /** Render accidental onto canvas. */ + draw() { + const { type, position, index, cautionary, x_shift, y_shift, glyph, render_options: { parenLeftPadding, parenRightPadding }, } = this; + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + // Figure out the start `x` and `y` coordinates for note and index. + const start = note.getModifierStartXY(position, index); + let accX = start.x + x_shift; + const accY = start.y + y_shift; + L('Rendering: ', type, accX, accY); + if (!cautionary) { + glyph.render(ctx, accX, accY); + } + else { + const parenLeft = (0,_util__WEBPACK_IMPORTED_MODULE_6__.defined)(this.parenLeft); + const parenRight = (0,_util__WEBPACK_IMPORTED_MODULE_6__.defined)(this.parenRight); + // Render the accidental in parentheses. + parenRight.render(ctx, accX, accY); + accX -= parenRight.getMetrics().width; + accX -= parenRightPadding; + accX -= this.accidental.parenRightPaddingAdjustment; + glyph.render(ctx, accX, accY); + accX -= glyph.getMetrics().width; + accX -= parenLeftPadding; + parenLeft.render(ctx, accX, accY); + } + } +} +/** To enable logging for this class. Set `Vex.Flow.Accidental.DEBUG` to `true`. */ +Accidental.DEBUG = false; + + +/***/ }), + +/***/ "./src/annotation.ts": +/*!***************************!*\ + !*** ./src/annotation.ts ***! + \***************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "AnnotationHorizontalJustify": () => (/* binding */ AnnotationHorizontalJustify), +/* harmony export */ "AnnotationVerticalJustify": () => (/* binding */ AnnotationVerticalJustify), +/* harmony export */ "Annotation": () => (/* binding */ Annotation) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _textformatter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./textformatter */ "./src/textformatter.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + + + +// eslint-disable-next-line +function L(...args) { + if (Annotation.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_6__.log)('Vex.Flow.Annotation', args); +} +var AnnotationHorizontalJustify; +(function (AnnotationHorizontalJustify) { + AnnotationHorizontalJustify[AnnotationHorizontalJustify["LEFT"] = 1] = "LEFT"; + AnnotationHorizontalJustify[AnnotationHorizontalJustify["CENTER"] = 2] = "CENTER"; + AnnotationHorizontalJustify[AnnotationHorizontalJustify["RIGHT"] = 3] = "RIGHT"; + AnnotationHorizontalJustify[AnnotationHorizontalJustify["CENTER_STEM"] = 4] = "CENTER_STEM"; +})(AnnotationHorizontalJustify || (AnnotationHorizontalJustify = {})); +var AnnotationVerticalJustify; +(function (AnnotationVerticalJustify) { + AnnotationVerticalJustify[AnnotationVerticalJustify["TOP"] = 1] = "TOP"; + AnnotationVerticalJustify[AnnotationVerticalJustify["CENTER"] = 2] = "CENTER"; + AnnotationVerticalJustify[AnnotationVerticalJustify["BOTTOM"] = 3] = "BOTTOM"; + AnnotationVerticalJustify[AnnotationVerticalJustify["CENTER_STEM"] = 4] = "CENTER_STEM"; +})(AnnotationVerticalJustify || (AnnotationVerticalJustify = {})); +/** + * Annotations are modifiers that can be attached to + * notes. + * + * See `tests/annotation_tests.ts` for usage examples. + */ +class Annotation extends _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier { + /** + * Annotations inherit from `Modifier` and is positioned correctly when + * in a `ModifierContext`. + * Create a new `Annotation` with the string `text`. + */ + constructor(text) { + super(); + this.text = text; + this.horizontalJustification = AnnotationHorizontalJustify.CENTER; + // warning: the default in the constructor is TOP, but in the factory the default is BOTTOM. + // this is to support legacy application that may expect this. + this.verticalJustification = AnnotationVerticalJustify.TOP; + this.resetFont(); + // The default width is calculated from the text. + this.setWidth(_tables__WEBPACK_IMPORTED_MODULE_3__.Tables.textWidth(text)); + } + /** Annotations category string. */ + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_5__.Category.Annotation; + } + /** Arrange annotations within a `ModifierContext` */ + static format(annotations, state) { + if (!annotations || annotations.length === 0) + return false; + let width = 0; + for (let i = 0; i < annotations.length; ++i) { + const annotation = annotations[i]; + const textFormatter = _textformatter__WEBPACK_IMPORTED_MODULE_4__.TextFormatter.create(annotation.textFont); + // Text height is expressed in fractional stave spaces. + const textLines = (5 + textFormatter.maxHeight) / _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.STAVE_LINE_DISTANCE; + let verticalSpaceNeeded = textLines; + const note = annotation.checkAttachedNote(); + const stave = note.getStave(); + const stemDirection = note.hasStem() ? note.getStemDirection() : _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP; + let stemHeight = 0; + let lines = 5; + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isTabNote)(note)) { + if (note.render_options.draw_stem) { + const stem = note.getStem(); + if (stem) { + stemHeight = Math.abs(stem.getHeight()) / _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.STAVE_LINE_DISTANCE; + } + } + else { + stemHeight = 0; + } + } + else if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isStemmableNote)(note)) { + const stem = note.getStem(); + if (stem && note.getNoteType() === 'n') { + stemHeight = Math.abs(stem.getHeight()) / _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.STAVE_LINE_DISTANCE; + } + } + if (stave) { + lines = stave.getNumLines(); + } + // Get the text width from the font metrics. + const textWidth = textFormatter.getWidthForTextInPx(annotation.text); + width = Math.max(width, textWidth); + if (annotation.verticalJustification === this.VerticalJustify.TOP) { + let noteLine = note.getLineNumber(true); + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isTabNote)(note)) { + noteLine = lines - (note.leastString() - 0.5); + } + if (stemDirection === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP) { + noteLine += stemHeight; + } + const curTop = noteLine + state.top_text_line + 0.5; + if (curTop < lines) { + annotation.setTextLine(lines - noteLine); + verticalSpaceNeeded += lines - noteLine; + state.top_text_line = verticalSpaceNeeded; + } + else { + annotation.setTextLine(state.top_text_line); + state.top_text_line += verticalSpaceNeeded; + } + } + else if (annotation.verticalJustification === this.VerticalJustify.BOTTOM) { + let noteLine = lines - note.getLineNumber(); + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isTabNote)(note)) { + noteLine = note.greatestString() - 1; + } + if (stemDirection === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN) { + noteLine += stemHeight; + } + const curBottom = noteLine + state.text_line + 1; + if (curBottom < lines) { + annotation.setTextLine(lines - curBottom); + verticalSpaceNeeded += lines - curBottom; + state.text_line = verticalSpaceNeeded; + } + else { + annotation.setTextLine(state.text_line); + state.text_line += verticalSpaceNeeded; + } + } + else { + annotation.setTextLine(state.text_line); + } + } + state.left_shift += width / 2; + state.right_shift += width / 2; + return true; + } + /** + * Set vertical position of text (above or below stave). + * @param just value in `AnnotationVerticalJustify`. + */ + setVerticalJustification(just) { + this.verticalJustification = typeof just === 'string' ? Annotation.VerticalJustifyString[just] : just; + return this; + } + /** + * Get horizontal justification. + */ + getJustification() { + return this.horizontalJustification; + } + /** + * Set horizontal justification. + * @param justification value in `Annotation.Justify`. + */ + setJustification(just) { + this.horizontalJustification = typeof just === 'string' ? Annotation.HorizontalJustifyString[just] : just; + return this; + } + /** Render text beside the note. */ + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + const stemDirection = note.hasStem() ? note.getStemDirection() : _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP; + const textFormatter = _textformatter__WEBPACK_IMPORTED_MODULE_4__.TextFormatter.create(this.textFont); + const start = note.getModifierStartXY(_modifier__WEBPACK_IMPORTED_MODULE_1__.ModifierPosition.ABOVE, this.index); + this.setRendered(); + // We're changing context parameters. Save current state. + ctx.save(); + const classString = Object.keys(this.getAttribute('classes')).join(' '); + ctx.openGroup(classString, this.getAttribute('id')); + ctx.setFont(this.textFont); + const text_width = ctx.measureText(this.text).width; + const text_height = textFormatter.maxHeight + 2; + let x; + let y; + if (this.horizontalJustification === AnnotationHorizontalJustify.LEFT) { + x = start.x; + } + else if (this.horizontalJustification === AnnotationHorizontalJustify.RIGHT) { + x = start.x - text_width; + } + else if (this.horizontalJustification === AnnotationHorizontalJustify.CENTER) { + x = start.x - text_width / 2; + } /* CENTER_STEM */ + else { + x = note.getStemX() - text_width / 2; + } + let stem_ext = {}; + let spacing = 0; + const has_stem = note.hasStem(); + const stave = note.checkStave(); + // The position of the text varies based on whether or not the note + // has a stem. + if (has_stem) { + stem_ext = note.checkStem().getExtents(); + spacing = stave.getSpacingBetweenLines(); + } + if (this.verticalJustification === AnnotationVerticalJustify.BOTTOM) { + // Use the largest (lowest) Y value + const ys = note.getYs(); + y = ys.reduce((a, b) => (a > b ? a : b)); + y += (this.text_line + 1) * _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.STAVE_LINE_DISTANCE + text_height; + if (has_stem && stemDirection === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN) { + y = Math.max(y, stem_ext.topY + text_height + spacing * this.text_line); + } + } + else if (this.verticalJustification === AnnotationVerticalJustify.CENTER) { + const yt = note.getYForTopText(this.text_line) - 1; + const yb = stave.getYForBottomText(this.text_line); + y = yt + (yb - yt) / 2 + text_height / 2; + } + else if (this.verticalJustification === AnnotationVerticalJustify.TOP) { + y = note.getYs()[0] - (this.text_line + 1) * _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.STAVE_LINE_DISTANCE; + if (has_stem && stemDirection === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP) { + // If the stem is above the stave already, go with default line width vs. actual + // since the lines between don't really matter. + spacing = stem_ext.topY < stave.getTopLineTopY() ? _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.STAVE_LINE_DISTANCE : spacing; + y = Math.min(y, stem_ext.topY - spacing * (this.text_line + 1)); + } + } /* CENTER_STEM */ + else { + const extents = note.getStemExtents(); + y = extents.topY + (extents.baseY - extents.topY) / 2 + text_height / 2; + } + L('Rendering annotation: ', this.text, x, y); + ctx.fillText(this.text, x, y); + ctx.closeGroup(); + ctx.restore(); + } +} +/** To enable logging for this class. Set `Vex.Flow.Annotation.DEBUG` to `true`. */ +Annotation.DEBUG = false; +Annotation.TEXT_FONT = Object.assign({}, _element__WEBPACK_IMPORTED_MODULE_0__.Element.TEXT_FONT); +/** Text annotations can be positioned and justified relative to the note. */ +Annotation.HorizontalJustify = AnnotationHorizontalJustify; +Annotation.HorizontalJustifyString = { + left: AnnotationHorizontalJustify.LEFT, + right: AnnotationHorizontalJustify.RIGHT, + center: AnnotationHorizontalJustify.CENTER, + centerStem: AnnotationHorizontalJustify.CENTER_STEM, +}; +Annotation.VerticalJustify = AnnotationVerticalJustify; +Annotation.VerticalJustifyString = { + above: AnnotationVerticalJustify.TOP, + top: AnnotationVerticalJustify.TOP, + below: AnnotationVerticalJustify.BOTTOM, + bottom: AnnotationVerticalJustify.BOTTOM, + center: AnnotationVerticalJustify.CENTER, + centerStem: AnnotationVerticalJustify.CENTER_STEM, +}; + + +/***/ }), + +/***/ "./src/articulation.ts": +/*!*****************************!*\ + !*** ./src/articulation.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Articulation": () => (/* binding */ Articulation) +/* harmony export */ }); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author: Larry Kuhns. +// MIT License + + + + + + +// eslint-disable-next-line +function L(...args) { + if (Articulation.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_5__.log)('Vex.Flow.Articulation', args); +} +const { ABOVE, BELOW } = _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position; +function roundToNearestHalf(mathFn, value) { + return mathFn(value / 0.5) * 0.5; +} +// This includes both staff and ledger lines +function isWithinLines(line, position) { + return position === ABOVE ? line <= 5 : line >= 1; +} +function getRoundingFunction(line, position) { + if (isWithinLines(line, position)) { + if (position === ABOVE) { + return Math.ceil; + } + else { + return Math.floor; + } + } + else { + return Math.round; + } +} +function snapLineToStaff(canSitBetweenLines, line, position, offsetDirection) { + // Initially, snap to nearest staff line or space + const snappedLine = roundToNearestHalf(getRoundingFunction(line, position), line); + const canSnapToStaffSpace = canSitBetweenLines && isWithinLines(snappedLine, position); + const onStaffLine = snappedLine % 1 === 0; + if (canSnapToStaffSpace && onStaffLine) { + const HALF_STAFF_SPACE = 0.5; + return snappedLine + HALF_STAFF_SPACE * -offsetDirection; + } + else { + return snappedLine; + } +} +// Helper function for checking if a Note object is either a StaveNote or a GraceNote. +const isStaveOrGraceNote = (note) => (0,_typeguard__WEBPACK_IMPORTED_MODULE_4__.isStaveNote)(note) || (0,_typeguard__WEBPACK_IMPORTED_MODULE_4__.isGraceNote)(note); +function getTopY(note, textLine) { + const stemDirection = note.getStemDirection(); + const { topY: stemTipY, baseY: stemBaseY } = note.getStemExtents(); + if (isStaveOrGraceNote(note)) { + if (note.hasStem()) { + if (stemDirection === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP) { + return stemTipY; + } + else { + return stemBaseY; + } + } + else { + return Math.min(...note.getYs()); + } + } + else if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_4__.isTabNote)(note)) { + if (note.hasStem()) { + if (stemDirection === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP) { + return stemTipY; + } + else { + return note.checkStave().getYForTopText(textLine); + } + } + else { + return note.checkStave().getYForTopText(textLine); + } + } + else { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('UnknownCategory', 'Only can get the top and bottom ys of stavenotes and tabnotes'); + } +} +function getBottomY(note, textLine) { + const stemDirection = note.getStemDirection(); + const { topY: stemTipY, baseY: stemBaseY } = note.getStemExtents(); + if (isStaveOrGraceNote(note)) { + if (note.hasStem()) { + if (stemDirection === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP) { + return stemBaseY; + } + else { + return stemTipY; + } + } + else { + return Math.max(...note.getYs()); + } + } + else if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_4__.isTabNote)(note)) { + if (note.hasStem()) { + if (stemDirection === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP) { + return note.checkStave().getYForBottomText(textLine); + } + else { + return stemTipY; + } + } + else { + return note.checkStave().getYForBottomText(textLine); + } + } + else { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('UnknownCategory', 'Only can get the top and bottom ys of stavenotes and tabnotes'); + } +} +/** + * Get the initial offset of the articulation from the y value of the starting position. + * This is required because the top/bottom text positions already have spacing applied to + * provide a "visually pleasant" default position. However the y values provided from + * the stavenote's top/bottom do *not* have any pre-applied spacing. This function + * normalizes this asymmetry. + * @param note + * @param position + * @returns + */ +function getInitialOffset(note, position) { + const isOnStemTip = (position === ABOVE && note.getStemDirection() === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP) || + (position === BELOW && note.getStemDirection() === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN); + if (isStaveOrGraceNote(note)) { + if (note.hasStem() && isOnStemTip) { + return 0.5; + } + else { + // this amount is larger than the stem-tip offset because we start from + // the center of the notehead + return 1; + } + } + else { + if (note.hasStem() && isOnStemTip) { + return 1; + } + else { + return 0; + } + } +} +/** + * Articulations and Accents are modifiers that can be + * attached to notes. The complete list of articulations is available in + * `tables.ts` under `Vex.Flow.articulationCodes`. + * + * See `tests/articulation_tests.ts` for usage examples. + */ +class Articulation extends _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier { + /** + * Create a new articulation. + * @param type entry in `Vex.Flow.articulationCodes` in `tables.ts` + */ + constructor(type) { + super(); + this.type = type; + this.position = BELOW; + this.render_options = { + font_scale: 38, + }; + this.reset(); + } + /** Articulations category string. */ + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_4__.Category.Articulation; + } + /** + * FIXME: + * Most of the complex formatting logic (ie: snapping to space) is + * actually done in .render(). But that logic belongs in this method. + * + * Unfortunately, this isn't possible because, by this point, stem lengths + * have not yet been finalized. Finalized stem lengths are required to determine the + * initial position of any stem-side articulation. + * + * This indicates that all objects should have their stave set before being + * formatted. It can't be an optional if you want accurate vertical positioning. + * Consistently positioned articulations that play nice with other modifiers + * won't be possible until we stop relying on render-time formatting. + * + * Ideally, when this function has completed, the vertical articulation positions + * should be ready to render without further adjustment. But the current state + * is far from this ideal. + */ + static format(articulations, state) { + if (!articulations || articulations.length === 0) + return false; + const margin = 0.5; + const getIncrement = (articulation, line, position) => roundToNearestHalf(getRoundingFunction(line, position), (0,_util__WEBPACK_IMPORTED_MODULE_5__.defined)(articulation.glyph.getMetrics().height) / 10 + margin); + articulations.forEach((articulation) => { + const note = articulation.checkAttachedNote(); + let lines = 5; + const stemDirection = note.hasStem() ? note.getStemDirection() : _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP; + let stemHeight = 0; + // Decide if we need to consider beam direction in placement. + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_4__.isStemmableNote)(note)) { + const stem = note.getStem(); + if (stem) { + stemHeight = Math.abs(stem.getHeight()) / _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.STAVE_LINE_DISTANCE; + } + } + const stave = note.getStave(); + if (stave) { + lines = stave.getNumLines(); + } + if (articulation.getPosition() === ABOVE) { + let noteLine = note.getLineNumber(true); + if (stemDirection === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP) { + noteLine += stemHeight; + } + let increment = getIncrement(articulation, state.top_text_line, ABOVE); + const curTop = noteLine + state.top_text_line + 0.5; + // If articulation must be above stave, add lines between note and stave top + if (!articulation.articulation.between_lines && curTop < lines) { + increment += lines - curTop; + } + articulation.setTextLine(state.top_text_line); + state.top_text_line += increment; + } + else if (articulation.getPosition() === BELOW) { + let noteLine = Math.max(lines - note.getLineNumber(), 0); + if (stemDirection === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN) { + noteLine += stemHeight; + } + let increment = getIncrement(articulation, state.text_line, BELOW); + const curBottom = noteLine + state.text_line + 0.5; + // if articulation must be below stave, add lines from note to stave bottom + if (!articulation.articulation.between_lines && curBottom < lines) { + increment += lines - curBottom; + } + articulation.setTextLine(state.text_line); + state.text_line += increment; + } + }); + const width = articulations + .map((articulation) => articulation.getWidth()) + .reduce((maxWidth, articWidth) => Math.max(articWidth, maxWidth)); + state.left_shift += width / 2; + state.right_shift += width / 2; + return true; + } + static easyScoreHook({ articulations }, note, builder) { + if (!articulations) + return; + const articNameToCode = { + staccato: 'a.', + tenuto: 'a-', + accent: 'a>', + }; + articulations + .split(',') + .map((articString) => articString.trim().split('.')) + .map(([name, position]) => { + const artic = { type: articNameToCode[name] }; + if (position) + artic.position = _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.PositionString[position]; + return builder.getFactory().Articulation(artic); + }) + .map((artic) => note.addModifier(artic, 0)); + } + reset() { + this.articulation = _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.articulationCodes(this.type); + const articulation = (0,_util__WEBPACK_IMPORTED_MODULE_5__.defined)(this.articulation, 'ArgumentError', `Articulation not found: ${this.type}`); + const code = (this.position === ABOVE ? articulation.aboveCode : articulation.belowCode) || articulation.code; + this.glyph = new _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph(code !== null && code !== void 0 ? code : '', this.render_options.font_scale); + this.setWidth((0,_util__WEBPACK_IMPORTED_MODULE_5__.defined)(this.glyph.getMetrics().width)); + } + /** Render articulation in position next to note. */ + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const index = this.checkIndex(); + const { position, glyph, text_line: textLine } = this; + const canSitBetweenLines = this.articulation.between_lines; + const stave = note.checkStave(); + const staffSpace = stave.getSpacingBetweenLines(); + const isTab = (0,_typeguard__WEBPACK_IMPORTED_MODULE_4__.isTabNote)(note); + // Articulations are centered over/under the note head. + const { x } = note.getModifierStartXY(position, index); + const shouldSitOutsideStaff = !canSitBetweenLines || isTab; + const initialOffset = getInitialOffset(note, position); + const padding = _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().lookupMetric(`articulation.${glyph.getCode()}.padding`, 0); + let y = { + [ABOVE]: () => { + glyph.setOrigin(0.5, 1); + const y = getTopY(note, textLine) - (textLine + initialOffset) * staffSpace; + return shouldSitOutsideStaff ? Math.min(stave.getYForTopText(Articulation.INITIAL_OFFSET), y) : y; + }, + [BELOW]: () => { + glyph.setOrigin(0.5, 0); + const y = getBottomY(note, textLine) + (textLine + initialOffset) * staffSpace; + return shouldSitOutsideStaff ? Math.max(stave.getYForBottomText(Articulation.INITIAL_OFFSET), y) : y; + }, + }[position](); + if (!isTab) { + const offsetDirection = position === ABOVE ? -1 : +1; + const noteLine = note.getKeyProps()[index].line; + const distanceFromNote = (note.getYs()[index] - y) / staffSpace; + const articLine = distanceFromNote + Number(noteLine); + const snappedLine = snapLineToStaff(canSitBetweenLines, articLine, position, offsetDirection); + if (isWithinLines(snappedLine, position)) + glyph.setOrigin(0.5, 0.5); + y += Math.abs(snappedLine - articLine) * staffSpace * offsetDirection + padding * offsetDirection; + } + L(`Rendering articulation at (x: ${x}, y: ${y})`); + glyph.render(ctx, x, y); + } +} +/** To enable logging for this class. Set `Vex.Flow.Articulation.DEBUG` to `true`. */ +Articulation.DEBUG = false; +Articulation.INITIAL_OFFSET = -0.5; + + +/***/ }), + +/***/ "./src/barnote.ts": +/*!************************!*\ + !*** ./src/barnote.ts ***! + \************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "BarNote": () => (/* binding */ BarNote) +/* harmony export */ }); +/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./note */ "./src/note.ts"); +/* harmony import */ var _stavebarline__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stavebarline */ "./src/stavebarline.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + +// eslint-disable-next-line +function L(...args) { + if (BarNote.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_3__.log)('Vex.Flow.BarNote', args); +} +/** + * A `BarNote` is used to render bar lines (from `barline.ts`). `BarNote`s can + * be added to a voice and rendered in the middle of a stave. Since it has no + * duration, it consumes no `tick`s, and is dealt with appropriately by the formatter. + * + * See `tests/barnote_tests.ts` for usage examples. + */ +class BarNote extends _note__WEBPACK_IMPORTED_MODULE_0__.Note { + constructor(type = _stavebarline__WEBPACK_IMPORTED_MODULE_1__.BarlineType.SINGLE) { + super({ duration: 'b' }); + this.metrics = { + widths: {}, + }; + const TYPE = _stavebarline__WEBPACK_IMPORTED_MODULE_1__.BarlineType; + this.metrics.widths = { + [TYPE.SINGLE]: 8, + [TYPE.DOUBLE]: 12, + [TYPE.END]: 15, + [TYPE.REPEAT_BEGIN]: 14, + [TYPE.REPEAT_END]: 14, + [TYPE.REPEAT_BOTH]: 18, + [TYPE.NONE]: 0, + }; + // Tell the formatter that bar notes have no duration. + this.ignore_ticks = true; + this.setType(type); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_2__.Category.BarNote; + } + /** Get the type of bar note.*/ + getType() { + return this.type; + } + /** Set the type of bar note. */ + setType(type) { + this.type = typeof type === 'string' ? _stavebarline__WEBPACK_IMPORTED_MODULE_1__.Barline.typeString[type] : type; + // Set width to width of relevant `Barline`. + this.setWidth(this.metrics.widths[this.type]); + return this; + } + /* Overridden to ignore */ + // eslint-disable-next-line + addToModifierContext(mc) { + // DO NOTHING. + return this; + } + /** Overridden to ignore. */ + preFormat() { + this.preFormatted = true; + return this; + } + /** Render note to stave. */ + draw() { + const ctx = this.checkContext(); + L('Rendering bar line at: ', this.getAbsoluteX()); + if (this.style) + this.applyStyle(ctx); + const barline = new _stavebarline__WEBPACK_IMPORTED_MODULE_1__.Barline(this.type); + barline.setX(this.getAbsoluteX()); + barline.draw(this.checkStave()); + if (this.style) + this.restoreStyle(ctx); + this.setRendered(); + } +} +/** To enable logging for this class. Set `Vex.Flow.BarNote.DEBUG` to `true`. */ +BarNote.DEBUG = false; + + +/***/ }), + +/***/ "./src/beam.ts": +/*!*********************!*\ + !*** ./src/beam.ts ***! + \*********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Beam": () => (/* binding */ Beam) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _fraction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./fraction */ "./src/fraction.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _tuplet__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tuplet */ "./src/tuplet.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + + + +function calculateStemDirection(notes) { + let lineSum = 0; + notes.forEach((note) => { + if (note.keyProps) { + note.keyProps.forEach((keyProp) => { + lineSum += keyProp.line - 3; + }); + } + }); + if (lineSum >= 0) { + return _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN; + } + return _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP; +} +function getStemSlope(firstNote, lastNote) { + const firstStemTipY = firstNote.getStemExtents().topY; + const firstStemX = firstNote.getStemX(); + const lastStemTipY = lastNote.getStemExtents().topY; + const lastStemX = lastNote.getStemX(); + return (lastStemTipY - firstStemTipY) / (lastStemX - firstStemX); +} +const BEAM_LEFT = 'L'; +const BEAM_RIGHT = 'R'; +const BEAM_BOTH = 'B'; +/** `Beams` span over a set of `StemmableNotes`. */ +class Beam extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + constructor(notes, auto_stem = false) { + super(); + this.slope = 0; + this.y_shift = 0; + if (!notes || notes.length === 0) { + throw new _util__WEBPACK_IMPORTED_MODULE_6__.RuntimeError('BadArguments', 'No notes provided for beam.'); + } + if (notes.length === 1) { + throw new _util__WEBPACK_IMPORTED_MODULE_6__.RuntimeError('BadArguments', 'Too few notes for beam.'); + } + // Validate beam line, direction and ticks. + this.ticks = notes[0].getIntrinsicTicks(); + if (this.ticks >= _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.durationToTicks('4')) { + throw new _util__WEBPACK_IMPORTED_MODULE_6__.RuntimeError('BadArguments', 'Beams can only be applied to notes shorter than a quarter note.'); + } + let i; // shared iterator + let note; + this.stem_direction = _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP; + for (i = 0; i < notes.length; ++i) { + note = notes[i]; + if (note.hasStem()) { + this.stem_direction = note.getStemDirection(); + break; + } + } + let stem_direction = this.stem_direction; + // Figure out optimal stem direction based on given notes + if (auto_stem && (0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isStaveNote)(notes[0])) { + stem_direction = calculateStemDirection(notes); + } + else if (auto_stem && (0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isTabNote)(notes[0])) { + // Auto Stem TabNotes + const stem_weight = notes.reduce((memo, note) => memo + note.getStemDirection(), 0); + stem_direction = stem_weight > -1 ? _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP : _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN; + } + // Apply stem directions and attach beam to notes + for (i = 0; i < notes.length; ++i) { + note = notes[i]; + if (auto_stem) { + note.setStemDirection(stem_direction); + this.stem_direction = stem_direction; + } + note.setBeam(this); + } + this.postFormatted = false; + this.notes = notes; + this.beam_count = this.getBeamCount(); + this.break_on_indices = []; + this.render_options = { + beam_width: 5, + max_slope: 0.25, + min_slope: -0.25, + slope_iterations: 20, + slope_cost: 100, + show_stemlets: false, + stemlet_extension: 7, + partial_beam_length: 10, + flat_beams: false, + min_flat_beam_offset: 15, + }; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_5__.Category.Beam; + } + /** Get the direction of the beam */ + getStemDirection() { + return this.stem_direction; + } + /** + * Get the default beam groups for a provided time signature. + * Attempt to guess if the time signature is not found in table. + * Currently this is fairly naive. + */ + static getDefaultBeamGroups(time_sig) { + if (!time_sig || time_sig === 'c') { + time_sig = '4/4'; + } + const defaults = { + '1/2': ['1/2'], + '2/2': ['1/2'], + '3/2': ['1/2'], + '4/2': ['1/2'], + '1/4': ['1/4'], + '2/4': ['1/4'], + '3/4': ['1/4'], + '4/4': ['1/4'], + '1/8': ['1/8'], + '2/8': ['2/8'], + '3/8': ['3/8'], + '4/8': ['2/8'], + '1/16': ['1/16'], + '2/16': ['2/16'], + '3/16': ['3/16'], + '4/16': ['2/16'], + }; + const groups = defaults[time_sig]; + if (groups === undefined) { + // If no beam groups found, naively determine + // the beam groupings from the time signature + const beatTotal = parseInt(time_sig.split('/')[0], 10); + const beatValue = parseInt(time_sig.split('/')[1], 10); + const tripleMeter = beatTotal % 3 === 0; + if (tripleMeter) { + return [new _fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(3, beatValue)]; + } + else if (beatValue > 4) { + return [new _fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(2, beatValue)]; + } + else if (beatValue <= 4) { + return [new _fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(1, beatValue)]; + } + } + else { + return groups.map((group) => new _fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction().parse(group)); + } + return [new _fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(1, 4)]; + } + /** + * A helper function to automatically build basic beams for a voice. For more + * complex auto-beaming use `Beam.generateBeams()`. + * @param voice the voice to generate the beams for + * @param stem_direction a stem direction to apply to the entire voice + * @param groups an array of `Fraction` representing beat groupings for the beam + */ + static applyAndGetBeams(voice, stem_direction, groups) { + return Beam.generateBeams(voice.getTickables(), { groups, stem_direction }); + } + /** + * A helper function to autimatically build beams for a voice with + * configuration options. + * + * Example configuration object: + * + * ``` + * config = { + * groups: [new Vex.Flow.Fraction(2, 8)], + * stem_direction: -1, + * beam_rests: true, + * beam_middle_only: true, + * show_stemlets: false + * }; + * ``` + * @param notes an array of notes to create the beams for + * @param config the configuration object + * @param config.stem_direction set to apply the same direction to all notes + * @param config.beam_rests set to `true` to include rests in the beams + * @param config.beam_middle_only set to `true` to only beam rests in the middle of the beat + * @param config.show_stemlets set to `true` to draw stemlets for rests + * @param config.maintain_stem_directions set to `true` to not apply new stem directions + * @param config.groups array of `Fractions` that represent the beat structure to beam the notes + * + */ + static generateBeams(notes, config = {}) { + if (!config.groups || !config.groups.length) { + config.groups = [new _fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(2, 8)]; + } + // Convert beam groups to tick amounts + const tickGroups = config.groups.map((group) => { + if (!group.multiply) { + throw new _util__WEBPACK_IMPORTED_MODULE_6__.RuntimeError('InvalidBeamGroups', 'The beam groups must be an array of Vex.Flow.Fractions'); + } + return group.clone().multiply(_tables__WEBPACK_IMPORTED_MODULE_3__.Tables.RESOLUTION, 1); + }); + const unprocessedNotes = notes; + let currentTickGroup = 0; + let noteGroups = []; + let currentGroup = []; + function getTotalTicks(vf_notes) { + return vf_notes.reduce((memo, note) => note.getTicks().clone().add(memo), new _fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(0, 1)); + } + function nextTickGroup() { + if (tickGroups.length - 1 > currentTickGroup) { + currentTickGroup += 1; + } + else { + currentTickGroup = 0; + } + } + function createGroups() { + let nextGroup = []; + // number of ticks in current group + let currentGroupTotalTicks = new _fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(0, 1); + unprocessedNotes.forEach((unprocessedNote) => { + nextGroup = []; + if (unprocessedNote.shouldIgnoreTicks()) { + noteGroups.push(currentGroup); + currentGroup = nextGroup; + return; // Ignore untickables (like bar notes) + } + currentGroup.push(unprocessedNote); + const ticksPerGroup = tickGroups[currentTickGroup].clone(); + const totalTicks = getTotalTicks(currentGroup).add(currentGroupTotalTicks); + // Double the amount of ticks in a group, if it's an unbeamable tuplet + const unbeamable = _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.durationToNumber(unprocessedNote.getDuration()) < 8; + if (unbeamable && unprocessedNote.getTuplet()) { + ticksPerGroup.numerator *= 2; + } + // If the note that was just added overflows the group tick total + if (totalTicks.greaterThan(ticksPerGroup)) { + // If the overflow note can be beamed, start the next group + // with it. Unbeamable notes leave the group overflowed. + if (!unbeamable) { + const note = currentGroup.pop(); + if (note) + nextGroup.push(note); + } + noteGroups.push(currentGroup); + // We have overflown, so we're going to next tick group. As we might have + // overflown by more than 1 group, we need to go forward as many times as + // needed, decreasing currentGroupTotalTicks by as many ticks as there are + // in current groups as we go forward. + do { + currentGroupTotalTicks = totalTicks.subtract(tickGroups[currentTickGroup]); + nextTickGroup(); + } while (currentGroupTotalTicks.greaterThanEquals(tickGroups[currentTickGroup])); + currentGroup = nextGroup; + } + else if (totalTicks.equals(ticksPerGroup)) { + noteGroups.push(currentGroup); + currentGroupTotalTicks = new _fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(0, 1); + currentGroup = nextGroup; + nextTickGroup(); + } + }); + // Adds any remainder notes beam + if (currentGroup.length > 0) { + noteGroups.push(currentGroup); + } + } + function getBeamGroups() { + return noteGroups.filter((group) => { + if (group.length > 1) { + let beamable = true; + group.forEach((note) => { + if (note.getIntrinsicTicks() >= _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.durationToTicks('4')) { + beamable = false; + } + }); + return beamable; + } + return false; + }); + } + // Splits up groups by Rest + function sanitizeGroups() { + const sanitizedGroups = []; + noteGroups.forEach((group) => { + let tempGroup = []; + group.forEach((note, index, group) => { + const isFirstOrLast = index === 0 || index === group.length - 1; + const prevNote = group[index - 1]; + const breaksOnEachRest = !config.beam_rests && note.isRest(); + const breaksOnFirstOrLastRest = config.beam_rests && config.beam_middle_only && note.isRest() && isFirstOrLast; + let breakOnStemChange = false; + if (config.maintain_stem_directions && prevNote && !note.isRest() && !prevNote.isRest()) { + const prevDirection = prevNote.getStemDirection(); + const currentDirection = note.getStemDirection(); + breakOnStemChange = currentDirection !== prevDirection; + } + const isUnbeamableDuration = parseInt(note.getDuration(), 10) < 8; + // Determine if the group should be broken at this note + const shouldBreak = breaksOnEachRest || breaksOnFirstOrLastRest || breakOnStemChange || isUnbeamableDuration; + if (shouldBreak) { + // Add current group + if (tempGroup.length > 0) { + sanitizedGroups.push(tempGroup); + } + // Start a new group. Include the current note if the group + // was broken up by stem direction, as that note needs to start + // the next group of notes + tempGroup = breakOnStemChange ? [note] : []; + } + else { + // Add note to group + tempGroup.push(note); + } + }); + // If there is a remaining group, add it as well + if (tempGroup.length > 0) { + sanitizedGroups.push(tempGroup); + } + }); + noteGroups = sanitizedGroups; + } + function formatStems() { + noteGroups.forEach((group) => { + let stemDirection; + if (config.maintain_stem_directions) { + const note = findFirstNote(group); + stemDirection = note ? note.getStemDirection() : _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP; + } + else { + if (config.stem_direction) { + stemDirection = config.stem_direction; + } + else { + stemDirection = calculateStemDirection(group); + } + } + applyStemDirection(group, stemDirection); + }); + } + function findFirstNote(group) { + for (let i = 0; i < group.length; i++) { + const note = group[i]; + if (!note.isRest()) { + return note; + } + } + return false; + } + function applyStemDirection(group, direction) { + group.forEach((note) => { + note.setStemDirection(direction); + }); + } + // Get all of the tuplets in all of the note groups + function getTuplets() { + const uniqueTuplets = []; + // Go through all of the note groups and inspect for tuplets + noteGroups.forEach((group) => { + let tuplet; + group.forEach((note) => { + const noteTuplet = note.getTuplet(); + if (noteTuplet && tuplet !== noteTuplet) { + tuplet = noteTuplet; + uniqueTuplets.push(tuplet); + } + }); + }); + return uniqueTuplets; + } + // Using closures to store the variables throughout the various functions + // IMO Keeps it this process lot cleaner - but not super consistent with + // the rest of the API's style - Silverwolf90 (Cyril) + createGroups(); + sanitizeGroups(); + formatStems(); + // Get the notes to be beamed + const beamedNoteGroups = getBeamGroups(); + // Get the tuplets in order to format them accurately + const allTuplets = getTuplets(); + // Create a Vex.Flow.Beam from each group of notes to be beamed + const beams = []; + beamedNoteGroups.forEach((group) => { + const beam = new Beam(group); + if (config.show_stemlets) { + beam.render_options.show_stemlets = true; + } + if (config.secondary_breaks) { + beam.render_options.secondary_break_ticks = _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.durationToTicks(config.secondary_breaks); + } + if (config.flat_beams === true) { + beam.render_options.flat_beams = true; + beam.render_options.flat_beam_offset = config.flat_beam_offset; + } + beams.push(beam); + }); + // Reformat tuplets + allTuplets.forEach((tuplet) => { + // Set the tuplet location based on the stem direction + const direction = tuplet.notes[0].stem_direction === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN ? _tuplet__WEBPACK_IMPORTED_MODULE_4__.TupletLocation.BOTTOM : _tuplet__WEBPACK_IMPORTED_MODULE_4__.TupletLocation.TOP; + tuplet.setTupletLocation(direction); + // If any of the notes in the tuplet are not beamed, draw a bracket. + let bracketed = false; + for (let i = 0; i < tuplet.notes.length; i++) { + const note = tuplet.notes[i]; + if (!note.hasBeam()) { + bracketed = true; + break; + } + } + tuplet.setBracketed(bracketed); + }); + return beams; + } + /** Get the notes in this beam. */ + getNotes() { + return this.notes; + } + /** Get the max number of beams in the set of notes. */ + getBeamCount() { + const beamCounts = this.notes.map((note) => note.getGlyph().beam_count); + const maxBeamCount = beamCounts.reduce((max, beamCount) => (beamCount > max ? beamCount : max)); + return maxBeamCount; + } + /** Set which note `indices` to break the secondary beam at. */ + breakSecondaryAt(indices) { + this.break_on_indices = indices; + return this; + } + /** Return the y coordinate for linear function. */ + getSlopeY(x, first_x_px, first_y_px, slope) { + return first_y_px + (x - first_x_px) * slope; + } + /** Calculate the best possible slope for the provided notes. */ + calculateSlope() { + const { notes, stem_direction: stemDirection, render_options: { max_slope, min_slope, slope_iterations, slope_cost }, } = this; + const firstNote = notes[0]; + const initialSlope = getStemSlope(firstNote, notes[notes.length - 1]); + const increment = (max_slope - min_slope) / slope_iterations; + let minCost = Number.MAX_VALUE; + let bestSlope = 0; + let yShift = 0; + // iterate through slope values to find best weighted fit + for (let slope = min_slope; slope <= max_slope; slope += increment) { + let totalStemExtension = 0; + let yShiftTemp = 0; + // iterate through notes, calculating y shift and stem extension + for (let i = 1; i < notes.length; ++i) { + const note = notes[i]; + if (note.hasStem() || note.isRest()) { + const adjustedStemTipY = this.getSlopeY(note.getStemX(), firstNote.getStemX(), firstNote.getStemExtents().topY, slope) + yShiftTemp; + const stemTipY = note.getStemExtents().topY; + // beam needs to be shifted up to accommodate note + if (stemTipY * stemDirection < adjustedStemTipY * stemDirection) { + const diff = Math.abs(stemTipY - adjustedStemTipY); + yShiftTemp += diff * -stemDirection; + totalStemExtension += diff * i; + } + else { + // beam overshoots note, account for the difference + totalStemExtension += (stemTipY - adjustedStemTipY) * stemDirection; + } + } + } + // most engraving books suggest aiming for a slope about half the angle of the + // difference between the first and last notes' stem length; + const idealSlope = initialSlope / 2; + const distanceFromIdeal = Math.abs(idealSlope - slope); + // This tries to align most beams to something closer to the idealSlope, but + // doesn't go crazy. To disable, set this.render_options.slope_cost = 0 + const cost = slope_cost * distanceFromIdeal + Math.abs(totalStemExtension); + // update state when a more ideal slope is found + if (cost < minCost) { + minCost = cost; + bestSlope = slope; + yShift = yShiftTemp; + } + } + this.slope = bestSlope; + this.y_shift = yShift; + } + /** Calculate a slope and y-shift for flat beams. */ + calculateFlatSlope() { + const { notes, stem_direction, render_options: { beam_width, min_flat_beam_offset, flat_beam_offset }, } = this; + // If a flat beam offset has not yet been supplied or calculated, + // generate one based on the notes in this particular note group + let total = 0; + let extremeY = 0; // Store the highest or lowest note here + let extremeBeamCount = 0; // The beam count of the extreme note + let currentExtreme = 0; + for (let i = 0; i < notes.length; i++) { + // Total up all of the offsets so we can average them out later + const note = notes[i]; + const stemTipY = note.getStemExtents().topY; + total += stemTipY; + // Store the highest (stems-up) or lowest (stems-down) note so the + // offset can be adjusted in case the average isn't enough + if (stem_direction === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN && currentExtreme < stemTipY) { + currentExtreme = stemTipY; + extremeY = Math.max(...note.getYs()); + extremeBeamCount = note.getBeamCount(); + } + else if (stem_direction === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP && (currentExtreme === 0 || currentExtreme > stemTipY)) { + currentExtreme = stemTipY; + extremeY = Math.min(...note.getYs()); + extremeBeamCount = note.getBeamCount(); + } + } + // Average the offsets to try and come up with a reasonable one that + // works for all of the notes in the beam group. + let offset = total / notes.length; + // In case the average isn't long enough, add or subtract some more + // based on the highest or lowest note (again, based on the stem + // direction). This also takes into account the added height due to + // the width of the beams. + const beamWidth = beam_width * 1.5; + const extremeTest = min_flat_beam_offset + extremeBeamCount * beamWidth; + const newOffset = extremeY + extremeTest * -stem_direction; + if (stem_direction === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN && offset < newOffset) { + offset = extremeY + extremeTest; + } + else if (stem_direction === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP && offset > newOffset) { + offset = extremeY - extremeTest; + } + if (!flat_beam_offset) { + // Set the offset for the group based on the calculations above. + this.render_options.flat_beam_offset = offset; + } + else if (stem_direction === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN && offset > flat_beam_offset) { + this.render_options.flat_beam_offset = offset; + } + else if (stem_direction === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP && offset < flat_beam_offset) { + this.render_options.flat_beam_offset = offset; + } + // for flat beams, the slope and y_shift are simply 0 + this.slope = 0; + this.y_shift = 0; + } + /** Return the Beam y offset. */ + getBeamYToDraw() { + const firstNote = this.notes[0]; + const firstStemTipY = firstNote.getStemExtents().topY; + let beamY = firstStemTipY; + // For flat beams, set the first and last Y to the offset, rather than + // using the note's stem extents. + if (this.render_options.flat_beams && this.render_options.flat_beam_offset) { + beamY = this.render_options.flat_beam_offset; + } + return beamY; + } + /** + * Create new stems for the notes in the beam, so that each stem + * extends into the beams. + */ + applyStemExtensions() { + const { notes, slope, y_shift, stem_direction, beam_count, render_options: { show_stemlets, stemlet_extension, beam_width }, } = this; + const firstNote = notes[0]; + const firstStemTipY = this.getBeamYToDraw(); + const firstStemX = firstNote.getStemX(); + for (let i = 0; i < notes.length; ++i) { + const note = notes[i]; + const stem = note.getStem(); + if (stem) { + const stemX = note.getStemX(); + const { topY: stemTipY } = note.getStemExtents(); + const beamedStemTipY = this.getSlopeY(stemX, firstStemX, firstStemTipY, slope) + y_shift; + const preBeamExtension = stem.getExtension(); + const beamExtension = stem_direction === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP ? stemTipY - beamedStemTipY : beamedStemTipY - stemTipY; + stem.setExtension(preBeamExtension + beamExtension); + stem.adjustHeightForBeam(); + if (note.isRest() && show_stemlets) { + const beamWidth = beam_width; + const totalBeamWidth = (beam_count - 1) * beamWidth * 1.5 + beamWidth; + stem.setVisibility(true).setStemlet(true, totalBeamWidth + stemlet_extension); + } + } + } + } + /** Return upper level beam direction. */ + lookupBeamDirection(duration, prev_tick, tick, next_tick) { + if (duration === '4') { + return BEAM_LEFT; + } + const lookup_duration = `${_tables__WEBPACK_IMPORTED_MODULE_3__.Tables.durationToNumber(duration) / 2}`; + const prev_note_gets_beam = prev_tick < _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.durationToTicks(lookup_duration); + const next_note_gets_beam = next_tick < _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.durationToTicks(lookup_duration); + const note_gets_beam = tick < _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.durationToTicks(lookup_duration); + if (prev_note_gets_beam && next_note_gets_beam && note_gets_beam) { + return BEAM_BOTH; + } + else if (prev_note_gets_beam && !next_note_gets_beam && note_gets_beam) { + return BEAM_LEFT; + } + else if (!prev_note_gets_beam && next_note_gets_beam && note_gets_beam) { + return BEAM_RIGHT; + } + return this.lookupBeamDirection(lookup_duration, prev_tick, tick, next_tick); + } + /** Get the x coordinates for the beam lines of specific `duration`. */ + getBeamLines(duration) { + const tick_of_duration = _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.durationToTicks(duration); + let beam_started = false; + const beam_lines = []; + let current_beam = undefined; + const partial_beam_length = this.render_options.partial_beam_length; + let previous_should_break = false; + let tick_tally = 0; + for (let i = 0; i < this.notes.length; ++i) { + const note = this.notes[i]; + // See if we need to break secondary beams on this note. + const ticks = note.getTicks().value(); + tick_tally += ticks; + let should_break = false; + // 8th note beams are always drawn. + if (parseInt(duration, 10) >= 8) { + // First, check to see if any indices were set up through breakSecondaryAt() + should_break = this.break_on_indices.indexOf(i) !== -1; + // If the secondary breaks were auto-configured in the render options, + // handle that as well. + if (this.render_options.secondary_break_ticks && tick_tally >= this.render_options.secondary_break_ticks) { + tick_tally = 0; + should_break = true; + } + } + const note_gets_beam = note.getIntrinsicTicks() < tick_of_duration; + const stem_x = note.getStemX() - _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.WIDTH / 2; + // Check to see if the next note in the group will get a beam at this + // level. This will help to inform the partial beam logic below. + const prev_note = this.notes[i - 1]; + const next_note = this.notes[i + 1]; + const next_note_gets_beam = next_note && next_note.getIntrinsicTicks() < tick_of_duration; + const prev_note_gets_beam = prev_note && prev_note.getIntrinsicTicks() < tick_of_duration; + const beam_alone = prev_note && next_note && note_gets_beam && !prev_note_gets_beam && !next_note_gets_beam; + // const beam_alone = note_gets_beam && !prev_note_gets_beam && !next_note_gets_beam; + if (note_gets_beam) { + // This note gets a beam at the current level + if (beam_started) { + // We're currently in the middle of a beam. Just continue it on to + // the stem X of the current note. + current_beam = beam_lines[beam_lines.length - 1]; + current_beam.end = stem_x; + // If a secondary beam break is set up, end the beam right now. + if (should_break) { + beam_started = false; + if (next_note && !next_note_gets_beam && current_beam.end === undefined) { + // This note gets a beam,.but the next one does not. This means + // we need a partial pointing right. + current_beam.end = current_beam.start - partial_beam_length; + } + } + } + else { + // No beam started yet. Start a new one. + current_beam = { start: stem_x, end: undefined }; + beam_started = true; + if (beam_alone) { + // previous and next beam exists and does not get a beam but current gets it. + const prev_tick = prev_note.getIntrinsicTicks(); + const next_tick = next_note.getIntrinsicTicks(); + const tick = note.getIntrinsicTicks(); + const beam_direction = this.lookupBeamDirection(duration, prev_tick, tick, next_tick); + if ([BEAM_LEFT, BEAM_BOTH].includes(beam_direction)) { + current_beam.end = current_beam.start - partial_beam_length; + } + else { + current_beam.end = current_beam.start + partial_beam_length; + } + } + else if (!next_note_gets_beam) { + // The next note doesn't get a beam. Draw a partial. + if ((previous_should_break || i === 0) && next_note) { + // This is the first note (but not the last one), or it is + // following a secondary break. Draw a partial to the right. + current_beam.end = current_beam.start + partial_beam_length; + } + else { + // By default, draw a partial to the left. + current_beam.end = current_beam.start - partial_beam_length; + } + } + else if (should_break) { + // This note should have a secondary break after it. Even though + // we just started a beam, it needs to end immediately. + current_beam.end = current_beam.start - partial_beam_length; + beam_started = false; + } + beam_lines.push(current_beam); + } + } + else { + // The current note does not get a beam. + beam_started = false; + } + // Store the secondary break flag to inform the partial beam logic in + // the next iteration of the loop. + previous_should_break = should_break; + } + // Add a partial beam pointing left if this is the last note in the group + const last_beam = beam_lines[beam_lines.length - 1]; + if (last_beam && last_beam.end === undefined) { + last_beam.end = last_beam.start - partial_beam_length; + } + return beam_lines; + } + /** Render the stems for each note. */ + drawStems(ctx) { + this.notes.forEach((note) => { + const stem = note.getStem(); + if (stem) { + stem.setContext(ctx).draw(); + } + }, this); + } + // Render the beam lines + drawBeamLines(ctx) { + const valid_beam_durations = ['4', '8', '16', '32', '64']; + const firstNote = this.notes[0]; + let beamY = this.getBeamYToDraw(); + const firstStemX = firstNote.getStemX(); + const beamThickness = this.render_options.beam_width * this.stem_direction; + // Draw the beams. + for (let i = 0; i < valid_beam_durations.length; ++i) { + const duration = valid_beam_durations[i]; + const beamLines = this.getBeamLines(duration); + for (let j = 0; j < beamLines.length; ++j) { + const beam_line = beamLines[j]; + const startBeamX = beam_line.start; + const startBeamY = this.getSlopeY(startBeamX, firstStemX, beamY, this.slope); + const lastBeamX = beam_line.end; + if (lastBeamX) { + const lastBeamY = this.getSlopeY(lastBeamX, firstStemX, beamY, this.slope); + ctx.beginPath(); + ctx.moveTo(startBeamX, startBeamY); + ctx.lineTo(startBeamX, startBeamY + beamThickness); + ctx.lineTo(lastBeamX + 1, lastBeamY + beamThickness); + ctx.lineTo(lastBeamX + 1, lastBeamY); + ctx.closePath(); + ctx.fill(); + } + else { + throw new _util__WEBPACK_IMPORTED_MODULE_6__.RuntimeError('NoLastBeamX', 'lastBeamX undefined.'); + } + } + beamY += beamThickness * 1.5; + } + } + /** Pre-format the beam. */ + preFormat() { + return this; + } + /** + * Post-format the beam. This can only be called after + * the notes in the beam have both `x` and `y` values. ie: they've + * been formatted and have staves. + */ + postFormat() { + if (this.postFormatted) + return; + // Calculate a smart slope if we're not forcing the beams to be flat. + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isTabNote)(this.notes[0]) || this.render_options.flat_beams) { + this.calculateFlatSlope(); + } + else { + this.calculateSlope(); + } + this.applyStemExtensions(); + this.postFormatted = true; + } + /** Render the beam to the canvas context */ + draw() { + const ctx = this.checkContext(); + this.setRendered(); + if (this.unbeamable) + return; + if (!this.postFormatted) { + this.postFormat(); + } + this.drawStems(ctx); + this.applyStyle(); + this.drawBeamLines(ctx); + this.restoreStyle(); + } +} + + +/***/ }), + +/***/ "./src/bend.ts": +/*!*********************!*\ + !*** ./src/bend.ts ***! + \*********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Bend": () => (/* binding */ Bend) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _textformatter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./textformatter */ "./src/textformatter.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + +/** Bend implements tablature bends. */ +class Bend extends _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier { + /** + * Example of a phrase: + * ``` + * [{ + * type: UP, + * text: "whole" + * width: 8; + * }, + * { + * type: DOWN, + * text: "whole" + * width: 8; + * }, + * { + * type: UP, + * text: "half" + * width: 8; + * }, + * { + * type: UP, + * text: "whole" + * width: 8; + * }, + * { + * type: DOWN, + * text: "1 1/2" + * width: 8; + * }] + * ``` + * @param text text for bend ("Full", "Half", etc.) (DEPRECATED) + * @param release if true, render a release. (DEPRECATED) + * @param phrase if set, ignore "text" and "release", and use the more sophisticated phrase specified + */ + constructor(text, release = false, phrase) { + super(); + this.text = text; + this.x_shift = 0; + this.release = release; + this.tap = ''; + this.resetFont(); + this.render_options = { + line_width: 1.5, + line_style: '#777777', + bend_width: 8, + release_width: 8, + }; + if (phrase) { + this.phrase = phrase; + } + else { + // Backward compatibility + this.phrase = [{ type: Bend.UP, text: this.text }]; + if (this.release) + this.phrase.push({ type: Bend.DOWN, text: '' }); + } + this.updateWidth(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.Bend; + } + static get UP() { + return 0; + } + static get DOWN() { + return 1; + } + // Arrange bends in `ModifierContext` + static format(bends, state) { + if (!bends || bends.length === 0) + return false; + let last_width = 0; + // Format Bends + for (let i = 0; i < bends.length; ++i) { + const bend = bends[i]; + const note = bend.checkAttachedNote(); + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_3__.isTabNote)(note)) { + const stringPos = note.leastString() - 1; + if (state.top_text_line < stringPos) { + state.top_text_line = stringPos; + } + } + bend.setXShift(last_width); + last_width = bend.getWidth(); + bend.setTextLine(state.top_text_line); + } + state.right_shift += last_width; + state.top_text_line += 1; + return true; + } + /** Set horizontal shift in pixels. */ + setXShift(value) { + this.x_shift = value; + this.updateWidth(); + return this; + } + setTap(value) { + this.tap = value; + return this; + } + /** Get text provided in the constructor. */ + getText() { + return this.text; + } + getTextHeight() { + const textFormatter = _textformatter__WEBPACK_IMPORTED_MODULE_2__.TextFormatter.create(this.textFont); + return textFormatter.maxHeight; + } + /** Recalculate width. */ + updateWidth() { + const textFormatter = _textformatter__WEBPACK_IMPORTED_MODULE_2__.TextFormatter.create(this.textFont); + const measureText = (text) => { + return textFormatter.getWidthForTextInPx(text); + }; + let totalWidth = 0; + for (let i = 0; i < this.phrase.length; ++i) { + const bend = this.phrase[i]; + if (bend.width !== undefined) { + totalWidth += bend.width; + } + else { + const additional_width = bend.type === Bend.UP ? this.render_options.bend_width : this.render_options.release_width; + bend.width = Math.max(additional_width, measureText(bend.text)) + 3; + bend.draw_width = bend.width / 2; + totalWidth += bend.width; + } + } + this.setWidth(totalWidth + this.x_shift); + return this; + } + /** Draw the bend on the rendering context. */ + draw() { + var _a; + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const start = note.getModifierStartXY(_modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.RIGHT, this.index); + start.x += 3; + start.y += 0.5; + const x_shift = this.x_shift; + const stave = note.checkStave(); + const spacing = stave.getSpacingBetweenLines(); + const lowestY = note.getYs().reduce((a, b) => (a < b ? a : b)); + // this.text_line is relative to top string in the group. + const bend_height = start.y - ((this.text_line + 1) * spacing + start.y - lowestY) + 3; + const annotation_y = start.y - ((this.text_line + 1) * spacing + start.y - lowestY) - 1; + const renderBend = (x, y, width, height) => { + const cp_x = x + width; + const cp_y = y; + ctx.save(); + ctx.beginPath(); + ctx.setLineWidth(this.render_options.line_width); + ctx.setStrokeStyle(this.render_options.line_style); + ctx.setFillStyle(this.render_options.line_style); + ctx.moveTo(x, y); + ctx.quadraticCurveTo(cp_x, cp_y, x + width, height); + ctx.stroke(); + ctx.restore(); + }; + const renderRelease = (x, y, width, height) => { + ctx.save(); + ctx.beginPath(); + ctx.setLineWidth(this.render_options.line_width); + ctx.setStrokeStyle(this.render_options.line_style); + ctx.setFillStyle(this.render_options.line_style); + ctx.moveTo(x, height); + ctx.quadraticCurveTo(x + width, height, x + width, y); + ctx.stroke(); + ctx.restore(); + }; + const renderArrowHead = (x, y, direction) => { + const width = 4; + const yBase = y + width * direction; + ctx.beginPath(); + ctx.moveTo(x, y); // tip of the arrow + ctx.lineTo(x - width, yBase); + ctx.lineTo(x + width, yBase); + ctx.closePath(); + ctx.fill(); + }; + const renderText = (x, text) => { + ctx.save(); + ctx.setFont(this.textFont); + const render_x = x - ctx.measureText(text).width / 2; + ctx.fillText(text, render_x, annotation_y); + ctx.restore(); + }; + let last_bend = undefined; + let last_bend_draw_width = 0; + let last_drawn_width = 0; + if ((_a = this.tap) === null || _a === void 0 ? void 0 : _a.length) { + const tapStart = note.getModifierStartXY(_modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.CENTER, this.index); + renderText(tapStart.x, this.tap); + } + for (let i = 0; i < this.phrase.length; ++i) { + const bend = this.phrase[i]; + if (!bend.draw_width) + bend.draw_width = 0; + if (i === 0) + bend.draw_width += x_shift; + last_drawn_width = bend.draw_width + last_bend_draw_width - (i === 1 ? x_shift : 0); + if (bend.type === Bend.UP) { + if (last_bend && last_bend.type === Bend.UP) { + renderArrowHead(start.x, bend_height, +1); + } + renderBend(start.x, start.y, last_drawn_width, bend_height); + } + if (bend.type === Bend.DOWN) { + if (last_bend && last_bend.type === Bend.UP) { + renderRelease(start.x, start.y, last_drawn_width, bend_height); + } + if (last_bend && last_bend.type === Bend.DOWN) { + renderArrowHead(start.x, start.y, -1); + renderRelease(start.x, start.y, last_drawn_width, bend_height); + } + if (!last_bend) { + last_drawn_width = bend.draw_width; + renderRelease(start.x, start.y, last_drawn_width, bend_height); + } + } + renderText(start.x + last_drawn_width, bend.text); + last_bend = bend; + last_bend_draw_width = bend.draw_width; + last_bend.x = start.x; + start.x += last_drawn_width; + } + if (!last_bend || last_bend.x == undefined) { + throw new _util__WEBPACK_IMPORTED_MODULE_4__.RuntimeError('NoLastBendForBend', 'Internal error.'); + } + // Final arrowhead and text + if (last_bend.type === Bend.UP) { + renderArrowHead(last_bend.x + last_drawn_width, bend_height, +1); + } + else if (last_bend.type === Bend.DOWN) { + renderArrowHead(last_bend.x + last_drawn_width, start.y, -1); + } + } +} +/** Default text font. */ +Bend.TEXT_FONT = Object.assign({}, _element__WEBPACK_IMPORTED_MODULE_0__.Element.TEXT_FONT); + + +/***/ }), + +/***/ "./src/boundingbox.ts": +/*!****************************!*\ + !*** ./src/boundingbox.ts ***! + \****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "BoundingBox": () => (/* binding */ BoundingBox) +/* harmony export */ }); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +class BoundingBox { + constructor(x, y, w, h) { + this.x = x; + this.y = y; + this.w = w; + this.h = h; + } + /** + * Create a new copy. + */ + static copy(that) { + return new BoundingBox(that.x, that.y, that.w, that.h); + } + /** Get x position. */ + getX() { + return this.x; + } + /** Get y position. */ + getY() { + return this.y; + } + /** Get width. */ + getW() { + return this.w; + } + /** Get height. */ + getH() { + return this.h; + } + /** Set x position. */ + setX(x) { + this.x = x; + return this; + } + /** Set y position. */ + setY(y) { + this.y = y; + return this; + } + /** Set width. */ + setW(w) { + this.w = w; + return this; + } + /** Set height. */ + setH(h) { + this.h = h; + return this; + } + /** Move to position. */ + move(x, y) { + this.x += x; + this.y += y; + return this; + } + /** Clone. */ + clone() { + return BoundingBox.copy(this); + } + /** + * Merge my box with given box. Creates a bigger bounding box unless + * the given box is contained in this one. + */ + mergeWith(boundingBox) { + const that = boundingBox; + const new_x = this.x < that.x ? this.x : that.x; + const new_y = this.y < that.y ? this.y : that.y; + const new_w = Math.max(this.x + this.w, that.x + that.w) - new_x; + const new_h = Math.max(this.y + this.h, that.y + that.h) - new_y; + this.x = new_x; + this.y = new_y; + this.w = new_w; + this.h = new_h; + return this; + } +} + + +/***/ }), + +/***/ "./src/boundingboxcomputation.ts": +/*!***************************************!*\ + !*** ./src/boundingboxcomputation.ts ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "BoundingBoxComputation": () => (/* binding */ BoundingBoxComputation) +/* harmony export */ }); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +/** + * BoundingBoxComputation computes metrics for a bounding box by continuously + * taking canvas path commands. + * + * Warning: This class is merely a crutch to get bounding box information without + * explicit metadata. This is likely to get deprecated following SMuFL support. + * + * based on: https://github.com/canvg/canvg/blob/master/src/BoundingBox.ts (MIT License) + */ +class BoundingBoxComputation { + constructor() { + this.x1 = Number.NaN; + this.y1 = Number.NaN; + this.x2 = Number.NaN; + this.y2 = Number.NaN; + } + /** Get calculated X1. */ + getX1() { + return this.x1; + } + /** Get calculated Y1. */ + getY1() { + return this.y1; + } + /** Get calculated width. */ + width() { + return this.x2 - this.x1; + } + /** Get calculated height. */ + height() { + return this.y2 - this.y1; + } + /** Add point to BoundingBox. */ + addPoint(x, y) { + if (isNaN(this.x1) || x < this.x1) + this.x1 = x; + if (isNaN(this.x2) || x > this.x2) + this.x2 = x; + if (isNaN(this.y1) || y < this.y1) + this.y1 = y; + if (isNaN(this.y2) || y > this.y2) + this.y2 = y; + } + /** Add X to BoundingBox. */ + addX(x) { + this.addPoint(x, this.y1); + } + /** Add Y to BoundingBox. */ + addY(y) { + this.addPoint(this.x1, y); + } + /** Add quadratic curve to BoundingBox. */ + addQuadraticCurve(p0x, p0y, p1x, p1y, p2x, p2y) { + this.addPoint(p0x, p0y); + this.addPoint(p2x, p2y); + const p01x = p1x - p0x; + const p12x = p2x - p1x; + let denom = p01x - p12x; + if (denom != 0) { + const t = p01x / denom; + if (t > 0 && t < 1) { + const it = 1 - t; + this.addX(it * it * p0x + 2 * it * t * p1x + t * t * p2x); + } + } + const p01y = p1y - p0y; + const p12y = p2y - p1y; + denom = p01y - p12y; + if (denom != 0) { + const t = p01y / denom; + if (t > 0 && t < 1) { + const it = 1 - t; + this.addY(it * it * p0y + 2 * it * t * p1y + t * t * p2y); + } + } + } + /** Add bezier curve to BoundingBox. */ + addBezierCurve(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) { + // from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html + const p0 = [p0x, p0y]; + const p1 = [p1x, p1y]; + const p2 = [p2x, p2y]; + const p3 = [p3x, p3y]; + let i; + this.addPoint(p0[0], p0[1]); + this.addPoint(p3[0], p3[1]); + const f = (t, i) => Math.pow(1 - t, 3) * p0[i] + + 3 * Math.pow(1 - t, 2) * t * p1[i] + + 3 * (1 - t) * Math.pow(t, 2) * p2[i] + + Math.pow(t, 3) * p3[i]; + for (i = 0; i <= 1; i++) { + const b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i]; + const a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i]; + const c = 3 * p1[i] - 3 * p0[i]; + if (a === 0) { + if (b === 0) + continue; + const t = -c / b; + if (0 < t && t < 1) { + if (i === 0) + this.addX(f(t, i)); + if (i === 1) + this.addY(f(t, i)); + } + continue; + } + const b2ac = Math.pow(b, 2) - 4 * c * a; + if (b2ac < 0) + continue; + const t1 = (-b + Math.sqrt(b2ac)) / (2 * a); + if (0 < t1 && t1 < 1) { + if (i === 0) + this.addX(f(t1, i)); + if (i === 1) + this.addY(f(t1, i)); + } + const t2 = (-b - Math.sqrt(b2ac)) / (2 * a); + if (0 < t2 && t2 < 1) { + if (i === 0) + this.addX(f(t2, i)); + if (i === 1) + this.addY(f(t2, i)); + } + } + } +} + + +/***/ }), + +/***/ "./src/canvascontext.ts": +/*!******************************!*\ + !*** ./src/canvascontext.ts ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "CanvasContext": () => (/* binding */ CanvasContext) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _rendercontext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./rendercontext */ "./src/rendercontext.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +/* harmony import */ var _web__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./web */ "./src/web.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + +/** + * A rendering context for the Canvas backend. This class serves as a proxy for the + * underlying CanvasRenderingContext2D object, part of the browser's API. + */ +class CanvasContext extends _rendercontext__WEBPACK_IMPORTED_MODULE_1__.RenderContext { + constructor(context) { + super(); + /** Height of one line of text (in pixels). */ + this.textHeight = 0; + this.context2D = context; + if (!context.canvas) { + this.canvas = { + width: CanvasContext.WIDTH, + height: CanvasContext.HEIGHT, + }; + } + else { + this.canvas = context.canvas; + } + } + static get WIDTH() { + return 600; + } + static get HEIGHT() { + return 400; + } + static get CANVAS_BROWSER_SIZE_LIMIT() { + return 32767; // Chrome/Firefox. Could be determined more precisely by npm module canvas-size. + } + /** + * Ensure that width and height do not exceed the browser limit. + * @returns array of [width, height] clamped to the browser limit. + */ + static sanitizeCanvasDims(width, height) { + const limit = this.CANVAS_BROWSER_SIZE_LIMIT; + if (Math.max(width, height) > limit) { + (0,_util__WEBPACK_IMPORTED_MODULE_2__.warn)('Canvas dimensions exceed browser limit. Cropping to ' + limit); + if (width > limit) { + width = limit; + } + if (height > limit) { + height = limit; + } + } + return [width, height]; + } + /** + * Set all pixels to transparent black rgba(0,0,0,0). + */ + clear() { + this.context2D.clearRect(0, 0, this.canvas.width, this.canvas.height); + } + // eslint-disable-next-line + openGroup(cls, id, attrs) { + // Containers not implemented. + } + closeGroup() { + // Containers not implemented. + } + // eslint-disable-next-line + add(child) { + // Containers not implemented. + } + setFillStyle(style) { + this.context2D.fillStyle = style; + return this; + } + /** CanvasContext ignores `setBackgroundFillStyle()`. */ + // eslint-disable-next-line + setBackgroundFillStyle(style) { + // DO NOTHING + return this; + } + setStrokeStyle(style) { + this.context2D.strokeStyle = style; + return this; + } + setShadowColor(color) { + this.context2D.shadowColor = color; + return this; + } + setShadowBlur(blur) { + // CanvasRenderingContext2D does not scale the shadow blur by the current + // transform, so we have to do it manually. We assume uniform scaling + // (though allow for rotation) because the blur can only be scaled + // uniformly anyway. + const t = this.context2D.getTransform(); + const scale = Math.sqrt(t.a * t.a + t.b * t.b + t.c * t.c + t.d * t.d); + this.context2D.shadowBlur = scale * blur; + return this; + } + setLineWidth(width) { + this.context2D.lineWidth = width; + return this; + } + setLineCap(capType) { + this.context2D.lineCap = capType; + return this; + } + setLineDash(dash) { + this.context2D.setLineDash(dash); + return this; + } + scale(x, y) { + this.context2D.scale(x, y); + return this; + } + resize(width, height) { + const canvas = this.context2D.canvas; + const devicePixelRatio = (0,_util__WEBPACK_IMPORTED_MODULE_2__.globalObject)().devicePixelRatio || 1; + // Scale the canvas size by the device pixel ratio clamping to the maximum supported size. + [width, height] = CanvasContext.sanitizeCanvasDims(width * devicePixelRatio, height * devicePixelRatio); + // Divide back down by the pixel ratio and convert to integers. + width = (width / devicePixelRatio) | 0; + height = (height / devicePixelRatio) | 0; + canvas.width = width * devicePixelRatio; + canvas.height = height * devicePixelRatio; + // The canvas could be an instance of either HTMLCanvasElement or an OffscreenCanvas. + // Only HTMLCanvasElement has a style attribute. + if ((0,_web__WEBPACK_IMPORTED_MODULE_3__.isHTMLCanvas)(canvas)) { + canvas.style.width = width + 'px'; + canvas.style.height = height + 'px'; + } + return this.scale(devicePixelRatio, devicePixelRatio); + } + rect(x, y, width, height) { + this.context2D.rect(x, y, width, height); + return this; + } + fillRect(x, y, width, height) { + this.context2D.fillRect(x, y, width, height); + return this; + } + /** + * Set the pixels in a rectangular area to transparent black rgba(0,0,0,0). + */ + clearRect(x, y, width, height) { + this.context2D.clearRect(x, y, width, height); + return this; + } + beginPath() { + this.context2D.beginPath(); + return this; + } + moveTo(x, y) { + this.context2D.moveTo(x, y); + return this; + } + lineTo(x, y) { + this.context2D.lineTo(x, y); + return this; + } + bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) { + this.context2D.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y); + return this; + } + quadraticCurveTo(cpx, cpy, x, y) { + this.context2D.quadraticCurveTo(cpx, cpy, x, y); + return this; + } + arc(x, y, radius, startAngle, endAngle, counterclockwise) { + this.context2D.arc(x, y, radius, startAngle, endAngle, counterclockwise); + return this; + } + fill() { + this.context2D.fill(); + return this; + } + stroke() { + this.context2D.stroke(); + return this; + } + closePath() { + this.context2D.closePath(); + return this; + } + measureText(text) { + const metrics = this.context2D.measureText(text); + let y = 0; + let height = 0; + if (metrics.fontBoundingBoxAscent) { + y = -metrics.fontBoundingBoxAscent; + height = metrics.fontBoundingBoxDescent + metrics.fontBoundingBoxAscent; + } + else { + y = -metrics.actualBoundingBoxAscent; + height = metrics.actualBoundingBoxDescent + metrics.actualBoundingBoxAscent; + } + // Return x, y, width & height in the same manner as svg getBBox + return { + x: 0, + y: y, + width: metrics.width, + height: height, + }; + } + fillText(text, x, y) { + this.context2D.fillText(text, x, y); + return this; + } + save() { + this.context2D.save(); + return this; + } + restore() { + this.context2D.restore(); + return this; + } + set fillStyle(style) { + this.context2D.fillStyle = style; + } + get fillStyle() { + return this.context2D.fillStyle; + } + set strokeStyle(style) { + this.context2D.strokeStyle = style; + } + get strokeStyle() { + return this.context2D.strokeStyle; + } + /** + * @param f is 1) a `FontInfo` object or + * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or + * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided). + * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt'). + * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900). + * @param style is a string (e.g., 'italic', 'normal'). + */ + setFont(f, size, weight, style) { + const fontInfo = _font__WEBPACK_IMPORTED_MODULE_0__.Font.validate(f, size, weight, style); + this.context2D.font = _font__WEBPACK_IMPORTED_MODULE_0__.Font.toCSSString(fontInfo); + this.textHeight = _font__WEBPACK_IMPORTED_MODULE_0__.Font.convertSizeToPixelValue(fontInfo.size); + return this; + } + /** Return a string of the form `'italic bold 15pt Arial'` */ + getFont() { + return this.context2D.font; + } +} + + +/***/ }), + +/***/ "./src/chordsymbol.ts": +/*!****************************!*\ + !*** ./src/chordsymbol.ts ***! + \****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ChordSymbolHorizontalJustify": () => (/* binding */ ChordSymbolHorizontalJustify), +/* harmony export */ "ChordSymbolVerticalJustify": () => (/* binding */ ChordSymbolVerticalJustify), +/* harmony export */ "SymbolTypes": () => (/* binding */ SymbolTypes), +/* harmony export */ "SymbolModifiers": () => (/* binding */ SymbolModifiers), +/* harmony export */ "ChordSymbol": () => (/* binding */ ChordSymbol) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _textformatter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./textformatter */ "./src/textformatter.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// Author: Aaron (@AaronDavidNewman) +// +// This implements chord symbols above/below a chord. +// Chord symbols are modifiers that can be attached to notes. +// They can contain multiple 'blocks' which represent text or +// glyphs with various positioning options. +// +// See `tests/chordsymbol_tests.ts` for usage examples. + + + + + + + +// To enable logging for this class. Set `Vex.Flow.ChordSymbol.DEBUG` to `true`. +// eslint-disable-next-line +function L(...args) { + if (ChordSymbol.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_6__.log)('Vex.Flow.ChordSymbol', args); +} +var ChordSymbolHorizontalJustify; +(function (ChordSymbolHorizontalJustify) { + ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify["LEFT"] = 1] = "LEFT"; + ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify["CENTER"] = 2] = "CENTER"; + ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify["RIGHT"] = 3] = "RIGHT"; + ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify["CENTER_STEM"] = 4] = "CENTER_STEM"; +})(ChordSymbolHorizontalJustify || (ChordSymbolHorizontalJustify = {})); +var ChordSymbolVerticalJustify; +(function (ChordSymbolVerticalJustify) { + ChordSymbolVerticalJustify[ChordSymbolVerticalJustify["TOP"] = 1] = "TOP"; + ChordSymbolVerticalJustify[ChordSymbolVerticalJustify["BOTTOM"] = 2] = "BOTTOM"; +})(ChordSymbolVerticalJustify || (ChordSymbolVerticalJustify = {})); +var SymbolTypes; +(function (SymbolTypes) { + SymbolTypes[SymbolTypes["GLYPH"] = 1] = "GLYPH"; + SymbolTypes[SymbolTypes["TEXT"] = 2] = "TEXT"; + SymbolTypes[SymbolTypes["LINE"] = 3] = "LINE"; +})(SymbolTypes || (SymbolTypes = {})); +var SymbolModifiers; +(function (SymbolModifiers) { + SymbolModifiers[SymbolModifiers["NONE"] = 1] = "NONE"; + SymbolModifiers[SymbolModifiers["SUBSCRIPT"] = 2] = "SUBSCRIPT"; + SymbolModifiers[SymbolModifiers["SUPERSCRIPT"] = 3] = "SUPERSCRIPT"; +})(SymbolModifiers || (SymbolModifiers = {})); +/** + * ChordSymbol is a modifier that creates a chord symbol above/below a chord. + * As a modifier, it is attached to an existing note. + */ +class ChordSymbol extends _modifier__WEBPACK_IMPORTED_MODULE_2__.Modifier { + constructor() { + super(); + this.symbolBlocks = []; + this.horizontal = ChordSymbolHorizontalJustify.LEFT; + this.vertical = ChordSymbolVerticalJustify.TOP; + this.useKerning = true; + this.reportWidth = true; + this.resetFont(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_5__.Category.ChordSymbol; + } + static get superSubRatio() { + return ChordSymbol.metrics.global.superSubRatio; + } + /** Currently unused: Globally turn off text formatting, if the built-in formatting does not work for your font. */ + static set NO_TEXT_FORMAT(val) { + ChordSymbol.noFormat = val; + } + static get NO_TEXT_FORMAT() { + return ChordSymbol.noFormat; + } + // eslint-disable-next-line + static getMetricForGlyph(glyphCode) { + if (ChordSymbol.metrics[glyphCode]) { + return ChordSymbol.metrics[glyphCode]; + } + return undefined; + } + static get engravingFontResolution() { + return _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().getResolution(); + } + static get spacingBetweenBlocks() { + return ChordSymbol.metrics.global.spacing / ChordSymbol.engravingFontResolution; + } + static getWidthForGlyph(glyph) { + const metric = ChordSymbol.getMetricForGlyph(glyph.code); + if (!metric) { + return 0.65; // probably should do something here. + } + return metric.advanceWidth / ChordSymbol.engravingFontResolution; + } + static getYShiftForGlyph(glyph) { + const metric = ChordSymbol.getMetricForGlyph(glyph.code); + if (!metric) { + return 0; + } + return metric.yOffset / ChordSymbol.engravingFontResolution; + } + static getXShiftForGlyph(glyph) { + const metric = ChordSymbol.getMetricForGlyph(glyph.code); + if (!metric) { + return 0; + } + return (-1 * metric.leftSideBearing) / ChordSymbol.engravingFontResolution; + } + static get superscriptOffset() { + return ChordSymbol.metrics.global.superscriptOffset / ChordSymbol.engravingFontResolution; + } + static get subscriptOffset() { + return ChordSymbol.metrics.global.subscriptOffset / ChordSymbol.engravingFontResolution; + } + static get kerningOffset() { + return ChordSymbol.metrics.global.kerningOffset / ChordSymbol.engravingFontResolution; + } + // eslint-disable-next-line + static get metrics() { + return _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().getMetrics().glyphs.chordSymbol; + } + static get lowerKerningText() { + // For example, see: `bravura_metrics.ts` + // BravuraMetrics.glyphs.chordSymbol.global.lowerKerningText, which returns an array of letters. + // ['D', 'F', 'P', 'T', 'V', 'Y'] + return ChordSymbol.metrics.global.lowerKerningText; + } + static get upperKerningText() { + return ChordSymbol.metrics.global.upperKerningText; + } + static isSuperscript(block) { + return block.symbolModifier !== undefined && block.symbolModifier === SymbolModifiers.SUPERSCRIPT; + } + static isSubscript(block) { + return block.symbolModifier !== undefined && block.symbolModifier === SymbolModifiers.SUBSCRIPT; + } + /** + * Estimate the width of the whole chord symbol, based on the sum of the widths of the individual blocks. + * Estimate how many lines above/below the staff we need. + */ + static format(symbols, state) { + var _a; + if (!symbols || symbols.length === 0) + return false; + let width = 0; + let nonSuperWidth = 0; + const reportedWidths = []; + for (const symbol of symbols) { + const fontSize = _font__WEBPACK_IMPORTED_MODULE_0__.Font.convertSizeToPointValue((_a = symbol.textFont) === null || _a === void 0 ? void 0 : _a.size); + const fontAdj = _font__WEBPACK_IMPORTED_MODULE_0__.Font.scaleSize(fontSize, 0.05); + const glyphAdj = fontAdj * 2; + let lineSpaces = 1; + let vAlign = false; + for (let j = 0; j < symbol.symbolBlocks.length; ++j) { + const block = symbol.symbolBlocks[j]; + const sup = ChordSymbol.isSuperscript(block); + const sub = ChordSymbol.isSubscript(block); + const superSubScale = sup || sub ? ChordSymbol.superSubRatio : 1; + const adj = block.symbolType === SymbolTypes.GLYPH ? glyphAdj * superSubScale : fontAdj * superSubScale; + // If there are super/subscripts, they extend beyond the line so + // assume they take up 2 lines + if (sup || sub) { + lineSpaces = 2; + } + // If there is a symbol-specific offset, add it but consider font + // size since font and glyphs will be interspersed. + const fontSize = symbol.textFormatter.fontSizeInPixels; + const superSubFontSize = fontSize * superSubScale; + if (block.symbolType === SymbolTypes.GLYPH && block.glyph !== undefined) { + block.width = ChordSymbol.getWidthForGlyph(block.glyph) * superSubFontSize; + block.yShift += ChordSymbol.getYShiftForGlyph(block.glyph) * superSubFontSize; + block.xShift += ChordSymbol.getXShiftForGlyph(block.glyph) * superSubFontSize; + block.glyph.scale = block.glyph.scale * adj; + } + else if (block.symbolType === SymbolTypes.TEXT) { + block.width = block.width * superSubFontSize; + block.yShift += symbol.getYOffsetForText(block.text) * adj; + } + if (block.symbolType === SymbolTypes.GLYPH && + block.glyph !== undefined && + block.glyph.code === ChordSymbol.glyphs.over.code) { + lineSpaces = 2; + } + block.width += ChordSymbol.spacingBetweenBlocks * fontSize * superSubScale; + // If a subscript immediately follows a superscript block, try to + // overlay them. + if (sup && j > 0) { + const prev = symbol.symbolBlocks[j - 1]; + if (!ChordSymbol.isSuperscript(prev)) { + nonSuperWidth = width; + } + } + if (sub && nonSuperWidth > 0) { + vAlign = true; + // slide the symbol over so it lines up with superscript + block.xShift = block.xShift + (nonSuperWidth - width); + width = nonSuperWidth; + nonSuperWidth = 0; + // If we have vertically lined up, turn kerning off. + symbol.setEnableKerning(false); + } + if (!sup && !sub) { + nonSuperWidth = 0; + } + block.vAlign = vAlign; + width += block.width; + } + // make kerning adjustments after computing super/subscripts + symbol.updateKerningAdjustments(); + symbol.updateOverBarAdjustments(); + if (symbol.getVertical() === ChordSymbolVerticalJustify.TOP) { + symbol.setTextLine(state.top_text_line); + state.top_text_line += lineSpaces; + } + else { + symbol.setTextLine(state.text_line + 1); + state.text_line += lineSpaces + 1; + } + if (symbol.getReportWidth()) { + reportedWidths.push(width); + } + else { + reportedWidths.push(0); + } + } + width = reportedWidths.reduce((a, b) => a + b, 0); + state.left_shift += width / 2; + state.right_shift += width / 2; + return true; + } + /** + * Default text font. + * Choose a font family that works well with the current music engraving font. + * @override `Element.TEXT_FONT`. + */ + static get TEXT_FONT() { + let family = 'Roboto Slab, Times, serif'; + if (_tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().getName() === 'Petaluma') { + // Fixes Issue #1180 + family = 'PetalumaScript, Arial, sans-serif'; + } + return { + family, + size: 12, + weight: _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.NORMAL, + style: _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.NORMAL, + }; + } + /** + * The offset is specified in `em`. Scale this value by the font size in pixels. + */ + get superscriptOffset() { + return ChordSymbol.superscriptOffset * this.textFormatter.fontSizeInPixels; + } + get subscriptOffset() { + return ChordSymbol.subscriptOffset * this.textFormatter.fontSizeInPixels; + } + setReportWidth(value) { + this.reportWidth = value; + return this; + } + getReportWidth() { + return this.reportWidth; + } + updateOverBarAdjustments() { + const barIndex = this.symbolBlocks.findIndex(({ symbolType, glyph }) => symbolType === SymbolTypes.GLYPH && glyph !== undefined && glyph.code === 'csymDiagonalArrangementSlash'); + if (barIndex < 0) { + return; + } + const bar = this.symbolBlocks[barIndex]; + const xoff = bar.width / 4; + const yoff = 0.25 * this.textFormatter.fontSizeInPixels; + let symIndex = 0; + for (symIndex === 0; symIndex < barIndex; ++symIndex) { + const symbol = this.symbolBlocks[symIndex]; + symbol.xShift = symbol.xShift + xoff; + symbol.yShift = symbol.yShift - yoff; + } + for (symIndex = barIndex + 1; symIndex < this.symbolBlocks.length; ++symIndex) { + const symbol = this.symbolBlocks[symIndex]; + symbol.xShift = symbol.xShift - xoff; + symbol.yShift = symbol.yShift + yoff; + } + } + updateKerningAdjustments() { + let accum = 0; + for (let j = 0; j < this.symbolBlocks.length; ++j) { + const symbol = this.symbolBlocks[j]; + accum += this.getKerningAdjustment(j); + symbol.xShift += accum; + } + } + /** Do some basic kerning so that letter chords like 'A' don't have the extensions hanging off to the right. */ + getKerningAdjustment(j) { + if (!this.useKerning) { + return 0; + } + const currSymbol = this.symbolBlocks[j]; + const prevSymbol = j > 0 ? this.symbolBlocks[j - 1] : undefined; + let adjustment = 0; + // Move things into the '/' over bar + if (currSymbol.symbolType === SymbolTypes.GLYPH && + currSymbol.glyph !== undefined && + currSymbol.glyph.code === ChordSymbol.glyphs.over.code) { + adjustment += currSymbol.glyph.metrics.x_shift; + } + if (prevSymbol !== undefined && + prevSymbol.symbolType === SymbolTypes.GLYPH && + prevSymbol.glyph !== undefined && + prevSymbol.glyph.code === ChordSymbol.glyphs.over.code) { + adjustment += prevSymbol.glyph.metrics.x_shift; + } + // For superscripts that follow a letter without much top part, move it to the left slightly + let preKernUpper = false; + let preKernLower = false; + if (prevSymbol !== undefined && prevSymbol.symbolType === SymbolTypes.TEXT) { + preKernUpper = ChordSymbol.upperKerningText.some((xx) => xx === prevSymbol.text[prevSymbol.text.length - 1]); + preKernLower = ChordSymbol.lowerKerningText.some((xx) => xx === prevSymbol.text[prevSymbol.text.length - 1]); + } + const kerningOffsetPixels = ChordSymbol.kerningOffset * this.textFormatter.fontSizeInPixels; + // TODO: adjust kern for font size. + // Where should this constant live? + if (preKernUpper && currSymbol.symbolModifier === SymbolModifiers.SUPERSCRIPT) { + adjustment += kerningOffsetPixels; + } + if (preKernLower && currSymbol.symbolType === SymbolTypes.TEXT) { + if (currSymbol.text[0] >= 'a' && currSymbol.text[0] <= 'z') { + adjustment += kerningOffsetPixels / 2; + } + if (ChordSymbol.upperKerningText.some((xx) => xx === (prevSymbol === null || prevSymbol === void 0 ? void 0 : prevSymbol.text[prevSymbol.text.length - 1]))) { + adjustment += kerningOffsetPixels / 2; + } + } + return adjustment; + } + /** + * ChordSymbol allows multiple blocks so we can mix glyphs and font text. + * Each block can have its own vertical orientation. + */ + // eslint-disable-next-line + getSymbolBlock(params = {}) { + var _a, _b, _c; + const symbolType = (_a = params.symbolType) !== null && _a !== void 0 ? _a : SymbolTypes.TEXT; + const symbolBlock = { + text: (_b = params.text) !== null && _b !== void 0 ? _b : '', + symbolType, + symbolModifier: (_c = params.symbolModifier) !== null && _c !== void 0 ? _c : SymbolModifiers.NONE, + xShift: 0, + yShift: 0, + vAlign: false, + width: 0, + }; + // Note: symbol widths are resolution and font-independent. + // We convert to pixel values when we know what the font is. + if (symbolType === SymbolTypes.GLYPH && typeof params.glyph === 'string') { + const glyphArgs = ChordSymbol.glyphs[params.glyph]; + const glyphPoints = 20; + symbolBlock.glyph = new _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph(glyphArgs.code, glyphPoints, { category: 'chordSymbol' }); + // Beware: glyph.metrics is not the same as glyph.getMetrics() ! + // rv.glyph.point = rv.glyph.point * rv.glyph.metrics.scale; + // rv.width = rv.glyph.getMetrics().width; + // don't set yShift here, b/c we need to do it at formatting time after the font is set. + } + else if (symbolType === SymbolTypes.TEXT) { + symbolBlock.width = this.textFormatter.getWidthForTextInEm(symbolBlock.text); + } + else if (symbolType === SymbolTypes.LINE) { + symbolBlock.width = params.width; + } + return symbolBlock; + } + /** Add a symbol to this chord, could be text, glyph or line. */ + // eslint-disable-next-line + addSymbolBlock(parameters) { + this.symbolBlocks.push(this.getSymbolBlock(parameters)); + return this; + } + // ### Convenience functions for creating different types of chord symbol parts. + /** Add a text block. */ + // eslint-disable-next-line + addText(text, parameters = {}) { + const symbolType = SymbolTypes.TEXT; + return this.addSymbolBlock(Object.assign(Object.assign({}, parameters), { text, symbolType })); + } + /** Add a text block with superscript modifier. */ + addTextSuperscript(text) { + const symbolType = SymbolTypes.TEXT; + const symbolModifier = SymbolModifiers.SUPERSCRIPT; + return this.addSymbolBlock({ text, symbolType, symbolModifier }); + } + /** Add a text block with subscript modifier. */ + addTextSubscript(text) { + const symbolType = SymbolTypes.TEXT; + const symbolModifier = SymbolModifiers.SUBSCRIPT; + return this.addSymbolBlock({ text, symbolType, symbolModifier }); + } + /** Add a glyph block with superscript modifier. */ + addGlyphSuperscript(glyph) { + const symbolType = SymbolTypes.GLYPH; + const symbolModifier = SymbolModifiers.SUPERSCRIPT; + return this.addSymbolBlock({ glyph, symbolType, symbolModifier }); + } + /** Add a glyph block. */ + // eslint-disable-next-line + addGlyph(glyph, params = {}) { + const symbolType = SymbolTypes.GLYPH; + return this.addSymbolBlock(Object.assign(Object.assign({}, params), { glyph, symbolType })); + } + /** + * Add a glyph for each character in 'text'. If the glyph is not available, use text from the font. + * e.g. `addGlyphOrText('(+5#11)')` will use text for the '5' and '11', and glyphs for everything else. + */ + // eslint-disable-next-line + addGlyphOrText(text, params = {}) { + let str = ''; + for (let i = 0; i < text.length; ++i) { + const char = text[i]; + if (ChordSymbol.glyphs[char]) { + if (str.length > 0) { + this.addText(str, params); + str = ''; + } + this.addGlyph(char, params); + } + else { + // Collect consecutive characters with no glyphs. + str += char; + } + } + if (str.length > 0) { + this.addText(str, params); + } + return this; + } + /** Add a line of the given width, used as a continuation of the previous symbol in analysis, or lyrics, etc. */ + // eslint-disable-next-line + addLine(width, params = {}) { + const symbolType = SymbolTypes.LINE; + return this.addSymbolBlock(Object.assign(Object.assign({}, params), { symbolType, width })); + } + /** + * Set the chord symbol's font family, size, weight, style (e.g., `Arial`, `10pt`, `bold`, `italic`). + * + * @param f is 1) a `FontInfo` object or + * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or + * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided). + * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt'). + * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900). + * @param style is a string (e.g., 'italic', 'normal'). + * + * @override See: Element. + */ + setFont(f, size, weight, style) { + super.setFont(f, size, weight, style); + this.textFormatter = _textformatter__WEBPACK_IMPORTED_MODULE_4__.TextFormatter.create(this.textFont); + return this; + } + setEnableKerning(val) { + this.useKerning = val; + return this; + } + /** Set vertical position of text (above or below stave). */ + setVertical(vj) { + this.vertical = typeof vj === 'string' ? ChordSymbol.VerticalJustifyString[vj] : vj; + return this; + } + getVertical() { + return this.vertical; + } + /** Set horizontal justification. */ + setHorizontal(hj) { + this.horizontal = typeof hj === 'string' ? ChordSymbol.HorizontalJustifyString[hj] : hj; + return this; + } + getHorizontal() { + return this.horizontal; + } + getWidth() { + let width = 0; + this.symbolBlocks.forEach((symbol) => { + width += symbol.vAlign ? 0 : symbol.width; + }); + return width; + } + getYOffsetForText(text) { + var _a; + let acc = 0; + let i = 0; + for (i = 0; i < text.length; ++i) { + const metrics = this.textFormatter.getGlyphMetrics(text[i]); + if (metrics) { + const yMax = (_a = metrics.y_max) !== null && _a !== void 0 ? _a : 0; + acc = yMax < acc ? yMax : acc; + } + } + const resolution = this.textFormatter.getResolution(); + return i > 0 ? -1 * (acc / resolution) : 0; + } + /** Render text and glyphs above/below the note. */ + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + // We're changing context parameters. Save current state. + ctx.save(); + const classString = Object.keys(this.getAttribute('classes')).join(' '); + ctx.openGroup(classString, this.getAttribute('id')); + const start = note.getModifierStartXY(_modifier__WEBPACK_IMPORTED_MODULE_2__.Modifier.Position.ABOVE, this.index); + ctx.setFont(this.textFont); + let y; + // The position of the text varies based on whether or not the note + // has a stem. + const hasStem = note.hasStem(); + const stave = note.checkStave(); + if (this.vertical === ChordSymbolVerticalJustify.BOTTOM) { + // HACK: We need to compensate for the text's height since its origin is bottom-right. + y = stave.getYForBottomText(this.text_line + _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.TEXT_HEIGHT_OFFSET_HACK); + if (hasStem) { + const stem_ext = note.checkStem().getExtents(); + const spacing = stave.getSpacingBetweenLines(); + const stem_base = note.getStemDirection() === 1 ? stem_ext.baseY : stem_ext.topY; + y = Math.max(y, stem_base + spacing * (this.text_line + 2)); + } + } + else { + // (this.vertical === VerticalJustify.TOP) + y = Math.min(stave.getYForTopText(this.text_line), note.getYs()[0] - 10); + if (hasStem) { + const stem_ext = note.checkStem().getExtents(); + const spacing = stave.getSpacingBetweenLines(); + y = Math.min(y, stem_ext.topY - 5 - spacing * this.text_line); + } + } + let x = start.x; + if (this.horizontal === ChordSymbolHorizontalJustify.LEFT) { + x = start.x; + } + else if (this.horizontal === ChordSymbolHorizontalJustify.RIGHT) { + x = start.x + this.getWidth(); + } + else if (this.horizontal === ChordSymbolHorizontalJustify.CENTER) { + x = start.x - this.getWidth() / 2; + } + else { + // HorizontalJustify.CENTER_STEM + x = note.getStemX() - this.getWidth() / 2; + } + L('Rendering ChordSymbol: ', this.textFormatter, x, y); + this.symbolBlocks.forEach((symbol) => { + const isSuper = ChordSymbol.isSuperscript(symbol); + const isSub = ChordSymbol.isSubscript(symbol); + let curY = y; + L('shift was ', symbol.xShift, symbol.yShift); + L('curY pre sub ', curY); + if (isSuper) { + curY += this.superscriptOffset; + } + if (isSub) { + curY += this.subscriptOffset; + } + L('curY sup/sub ', curY); + if (symbol.symbolType === SymbolTypes.TEXT) { + if (isSuper || isSub) { + ctx.save(); + if (this.textFont) { + const { family, size, weight, style } = this.textFont; + const smallerFontSize = _font__WEBPACK_IMPORTED_MODULE_0__.Font.scaleSize(size, ChordSymbol.superSubRatio); + ctx.setFont(family, smallerFontSize, weight, style); + } + } + // TODO??? + // We estimate the text width, fill it in with the empirical value so the formatting is even. + // const textDim = ctx.measureText(symbol.text); + // symbol.width = textDim.width; + L('Rendering Text: ', symbol.text, x + symbol.xShift, curY + symbol.yShift); + ctx.fillText(symbol.text, x + symbol.xShift, curY + symbol.yShift); + if (isSuper || isSub) { + ctx.restore(); + } + } + else if (symbol.symbolType === SymbolTypes.GLYPH && symbol.glyph) { + curY += symbol.yShift; + L('Rendering Glyph: ', symbol.glyph.code, x + symbol.xShift, curY); + symbol.glyph.render(ctx, x + symbol.xShift, curY); + } + else if (symbol.symbolType === SymbolTypes.LINE) { + L('Rendering Line : ', symbol.width, x, curY); + ctx.beginPath(); + ctx.setLineWidth(1); // ? + ctx.moveTo(x, y); + ctx.lineTo(x + symbol.width, curY); + ctx.stroke(); + } + x += symbol.width; + if (symbol.vAlign) { + x += symbol.xShift; + } + }); + ctx.closeGroup(); + ctx.restore(); + } +} +ChordSymbol.DEBUG = false; +// Chord symbols can be positioned and justified relative to the note. +ChordSymbol.HorizontalJustify = ChordSymbolHorizontalJustify; +ChordSymbol.HorizontalJustifyString = { + left: ChordSymbolHorizontalJustify.LEFT, + right: ChordSymbolHorizontalJustify.RIGHT, + center: ChordSymbolHorizontalJustify.CENTER, + centerStem: ChordSymbolHorizontalJustify.CENTER_STEM, +}; +ChordSymbol.VerticalJustify = ChordSymbolVerticalJustify; +ChordSymbol.VerticalJustifyString = { + top: ChordSymbolVerticalJustify.TOP, + above: ChordSymbolVerticalJustify.TOP, + below: ChordSymbolVerticalJustify.BOTTOM, + bottom: ChordSymbolVerticalJustify.BOTTOM, +}; +// Glyph data +ChordSymbol.glyphs = { + diminished: { + code: 'csymDiminished', + }, + dim: { + code: 'csymDiminished', + }, + halfDiminished: { + code: 'csymHalfDiminished', + }, + '+': { + code: 'csymAugmented', + }, + augmented: { + code: 'csymAugmented', + }, + majorSeventh: { + code: 'csymMajorSeventh', + }, + minor: { + code: 'csymMinor', + }, + '-': { + code: 'csymMinor', + }, + '(': { + code: 'csymParensLeftTall', + }, + leftParen: { + code: 'csymParensLeftTall', + }, + ')': { + code: 'csymParensRightTall', + }, + rightParen: { + code: 'csymParensRightTall', + }, + leftBracket: { + code: 'csymBracketLeftTall', + }, + rightBracket: { + code: 'csymBracketRightTall', + }, + leftParenTall: { + code: 'csymParensLeftVeryTall', + }, + rightParenTall: { + code: 'csymParensRightVeryTall', + }, + '/': { + code: 'csymDiagonalArrangementSlash', + }, + over: { + code: 'csymDiagonalArrangementSlash', + }, + '#': { + code: 'accidentalSharp', + }, + b: { + code: 'accidentalFlat', + }, +}; +ChordSymbol.symbolTypes = SymbolTypes; +ChordSymbol.symbolModifiers = SymbolModifiers; +/** Currently unused. */ +ChordSymbol.noFormat = false; + + +/***/ }), + +/***/ "./src/clef.ts": +/*!*********************!*\ + !*** ./src/clef.ts ***! + \*********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Clef": () => (/* binding */ Clef) +/* harmony export */ }); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _stavemodifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stavemodifier */ "./src/stavemodifier.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna Cheppudira 2013. +// Co-author: Benjamin W. Bohl +// MIT License + + + + + +// eslint-disable-next-line +function L(...args) { + if (Clef.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_4__.log)('Vex.Flow.Clef', args); +} +/** + * Clef implements various types of clefs that can be rendered on a stave. + * + * See `tests/clef_tests.ts` for usage examples. + */ +class Clef extends _stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifier { + /** Create a new clef. */ + constructor(type, size, annotation) { + super(); + /** + * The attribute `clef` must be a key from + * `Clef.types` + */ + this.clef = Clef.types['treble']; + this.setPosition(_stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifierPosition.BEGIN); + this.setType(type, size, annotation); + this.setWidth(_tables__WEBPACK_IMPORTED_MODULE_2__.Tables.currentMusicFont().lookupMetric(`clef.${this.size}.width`)); + L('Creating clef:', type); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.Clef; + } + /** + * Every clef name is associated with a glyph code from the font file + * and a default stave line number. + */ + static get types() { + return { + treble: { + code: 'gClef', + line: 3, + point: 0, + }, + bass: { + code: 'fClef', + line: 1, + point: 0, + }, + alto: { + code: 'cClef', + line: 2, + point: 0, + }, + tenor: { + code: 'cClef', + line: 1, + point: 0, + }, + percussion: { + code: 'restMaxima', + line: 2, + point: 0, + }, + soprano: { + code: 'cClef', + line: 4, + point: 0, + }, + 'mezzo-soprano': { + code: 'cClef', + line: 3, + point: 0, + }, + 'baritone-c': { + code: 'cClef', + line: 0, + point: 0, + }, + 'baritone-f': { + code: 'fClef', + line: 2, + point: 0, + }, + subbass: { + code: 'fClef', + line: 0, + point: 0, + }, + french: { + code: 'gClef', + line: 4, + point: 0, + }, + tab: { + code: '6stringTabClef', + point: 0, + }, + }; + } + /** Set clef type, size and annotation. */ + setType(type, size, annotation) { + this.type = type; + this.clef = Clef.types[type]; + if (size === undefined) { + this.size = 'default'; + } + else { + this.size = size; + } + const musicFont = _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.currentMusicFont(); + this.clef.point = musicFont.lookupMetric(`clef.${this.size}.point`, 0); + this.glyph = new _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph(this.clef.code, this.clef.point, { + category: `clef.${this.clef.code}.${this.size}`, + }); + // If an annotation, such as 8va, is specified, add it to the Clef object. + if (annotation !== undefined) { + const code = musicFont.lookupMetric(`clef.annotations.${annotation}.smuflCode`); + const point = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.point`); + const line = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.${this.type}.line`); + const x_shift = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.${this.type}.shiftX`); + this.annotation = { code, point, line, x_shift }; + this.attachment = new _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph(this.annotation.code, this.annotation.point); + this.attachment.metrics.x_max = 0; + this.attachment.setXShift(this.annotation.x_shift); + } + else { + this.annotation = undefined; + } + return this; + } + /** Get clef width. */ + getWidth() { + if (this.type === 'tab') { + (0,_util__WEBPACK_IMPORTED_MODULE_4__.defined)(this.stave, 'ClefError', "Can't get width without stave."); + } + return this.width; + } + /** Set associated stave. */ + setStave(stave) { + this.stave = stave; + if (this.type === 'tab') { + const glyph = (0,_util__WEBPACK_IMPORTED_MODULE_4__.defined)(this.glyph, 'ClefError', "Can't set stave without glyph."); + const numLines = this.stave.getNumLines(); + const musicFont = _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.currentMusicFont(); + const point = musicFont.lookupMetric(`clef.lineCount.${numLines}.point`); + const shiftY = musicFont.lookupMetric(`clef.lineCount.${numLines}.shiftY`); + glyph.setPoint(point); + glyph.setYShift(shiftY); + } + return this; + } + /** Render clef. */ + draw() { + const glyph = (0,_util__WEBPACK_IMPORTED_MODULE_4__.defined)(this.glyph, 'ClefError', "Can't draw clef without glyph."); + const stave = this.checkStave(); + const ctx = stave.checkContext(); + this.setRendered(); + ctx.openGroup('clef', this.getAttribute('id')); + glyph.setStave(stave); + glyph.setContext(ctx); + if (this.clef.line !== undefined) { + this.placeGlyphOnLine(glyph, stave, this.clef.line); + } + glyph.renderToStave(this.x); + if (this.annotation !== undefined && this.attachment !== undefined) { + this.placeGlyphOnLine(this.attachment, stave, this.annotation.line); + this.attachment.setStave(stave); + this.attachment.setContext(ctx); + this.attachment.renderToStave(this.x); + } + ctx.closeGroup(); + } +} +/** To enable logging for this class, set `Vex.Flow.Clef.DEBUG` to `true`. */ +Clef.DEBUG = false; + + +/***/ }), + +/***/ "./src/clefnote.ts": +/*!*************************!*\ + !*** ./src/clefnote.ts ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ClefNote": () => (/* binding */ ClefNote) +/* harmony export */ }); +/* harmony import */ var _clef__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./clef */ "./src/clef.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./note */ "./src/note.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author Taehoon Moon 2014 +// MIT License + + + + +/** ClefNote implements clef annotations in measures. */ +class ClefNote extends _note__WEBPACK_IMPORTED_MODULE_2__.Note { + constructor(type, size, annotation) { + super({ duration: 'b' }); + this.type = type; + this.clef_obj = new _clef__WEBPACK_IMPORTED_MODULE_0__.Clef(type, size, annotation); + this.clef = this.clef_obj.clef; + this.glyph = new _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph(this.clef.code, this.clef.point); + this.setWidth(this.glyph.getMetrics().width); + // Note properties + this.ignore_ticks = true; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.ClefNote; + } + /** Set clef type, size and annotation. */ + setType(type, size, annotation) { + this.type = type; + this.clef_obj = new _clef__WEBPACK_IMPORTED_MODULE_0__.Clef(type, size, annotation); + this.clef = this.clef_obj.clef; + this.glyph = new _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph(this.clef.code, this.clef.point); + this.setWidth(this.glyph.getMetrics().width); + return this; + } + /** Get associated clef. */ + getClef() { + return this.clef; + } + /** Set associated context. */ + setContext(context) { + super.setContext(context); + this.glyph.setContext(this.getContext()); + return this; + } + /** Get bounding box. */ + getBoundingBox() { + return super.getBoundingBox(); + } + /* Overridden to ignore */ + // eslint-disable-next-line + addToModifierContext(mc) { + // DO NOTHING. + return this; + } + preFormat() { + this.preFormatted = true; + return this; + } + /** Render clef note. */ + draw() { + var _a; + const stave = this.checkStave(); + if (!this.glyph.getContext()) { + this.glyph.setContext(this.getContext()); + } + this.setRendered(); + const abs_x = this.getAbsoluteX(); + this.glyph.setStave(stave); + this.glyph.setYShift(stave.getYForLine((_a = this.clef.line) !== null && _a !== void 0 ? _a : 0) - stave.getYForGlyphs()); + this.glyph.renderToStave(abs_x); + // If the Vex.Flow.Clef has an annotation, such as 8va, draw it. + if (this.clef_obj.annotation !== undefined) { + const attachment = new _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph(this.clef_obj.annotation.code, this.clef_obj.annotation.point); + if (!attachment.getContext()) { + attachment.setContext(this.getContext()); + } + attachment.setStave(stave); + attachment.setYShift(stave.getYForLine(this.clef_obj.annotation.line) - stave.getYForGlyphs()); + attachment.setXShift(this.clef_obj.annotation.x_shift); + attachment.renderToStave(abs_x); + } + } +} + + +/***/ }), + +/***/ "./src/crescendo.ts": +/*!**************************!*\ + !*** ./src/crescendo.ts ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Crescendo": () => (/* binding */ Crescendo) +/* harmony export */ }); +/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./note */ "./src/note.ts"); +/* harmony import */ var _tickcontext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tickcontext */ "./src/tickcontext.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// This file implements the `Crescendo` object which draws crescendos and +// decrescendo dynamics markings. A `Crescendo` is initialized with a +// duration and formatted as part of a `Voice` like any other `Note` +// type in VexFlow. This object would most likely be formatted in a Voice +// with `TextNotes` - which are used to represent other dynamics markings. + + + + +// To enable logging for this class. Set `Vex.Flow.Crescendo.DEBUG` to `true`. +// eslint-disable-next-line +function L(...args) { + if (Crescendo.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_3__.log)('Vex.Flow.Crescendo', args); +} +// Private helper to draw the hairpin +function renderHairpin(ctx, params) { + const begin_x = params.begin_x; + const end_x = params.end_x; + const y = params.y; + const half_height = params.height / 2; + ctx.beginPath(); + if (params.reverse) { + ctx.moveTo(begin_x, y - half_height); + ctx.lineTo(end_x, y); + ctx.lineTo(begin_x, y + half_height); + } + else { + ctx.moveTo(end_x, y - half_height); + ctx.lineTo(begin_x, y); + ctx.lineTo(end_x, y + half_height); + } + ctx.stroke(); + ctx.closePath(); +} +class Crescendo extends _note__WEBPACK_IMPORTED_MODULE_0__.Note { + // Initialize the crescendo's properties + constructor(noteStruct) { + super(noteStruct); + this.options = { + // Extensions to the length of the crescendo on either side + extend_left: 0, + extend_right: 0, + // Vertical shift + y_shift: 0, + }; + // Whether the object is a decrescendo + this.decrescendo = false; + // The staff line to be placed on + this.line = noteStruct.line || 0; + // The height at the open end of the cresc/decresc + this.height = 15; + } + /** Crescendo category string. */ + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_2__.Category.Crescendo; + } + // Set the line to center the element on + setLine(line) { + this.line = line; + return this; + } + // Set the full height at the open end + setHeight(height) { + this.height = height; + return this; + } + // Set whether the sign should be a descresendo by passing a bool + // to `decresc` + setDecrescendo(decresc) { + this.decrescendo = decresc; + return this; + } + // Preformat the note + preFormat() { + this.preFormatted = true; + return this; + } + // Render the Crescendo object onto the canvas + draw() { + const ctx = this.checkContext(); + const stave = this.checkStave(); + this.setRendered(); + const tick_context = this.getTickContext(); + const next_context = _tickcontext__WEBPACK_IMPORTED_MODULE_1__.TickContext.getNextContext(tick_context); + const begin_x = this.getAbsoluteX(); + const end_x = next_context ? next_context.getX() : stave.getX() + stave.getWidth(); + const y = stave.getYForLine(this.line + -3) + 1; + L('Drawing ', this.decrescendo ? 'decrescendo ' : 'crescendo ', this.height, 'x', begin_x - end_x); + renderHairpin(ctx, { + begin_x: begin_x - this.options.extend_left, + end_x: end_x + this.options.extend_right, + y: y + this.options.y_shift, + height: this.height, + reverse: this.decrescendo, + }); + } +} +Crescendo.DEBUG = false; + + +/***/ }), + +/***/ "./src/curve.ts": +/*!**********************!*\ + !*** ./src/curve.ts ***! + \**********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "CurvePosition": () => (/* binding */ CurvePosition), +/* harmony export */ "Curve": () => (/* binding */ Curve) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// VexFlow - Music Engraving for HTML5 +// Copyright Mohit Muthanna 2010 +// +// This class implements curves (for slurs) + + + +var CurvePosition; +(function (CurvePosition) { + CurvePosition[CurvePosition["NEAR_HEAD"] = 1] = "NEAR_HEAD"; + CurvePosition[CurvePosition["NEAR_TOP"] = 2] = "NEAR_TOP"; +})(CurvePosition || (CurvePosition = {})); +class Curve extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + // from: Start note + // to: End note + // options: + // cps: List of control points + // x_shift: pixels to shift + // y_shift: pixels to shift + constructor(from, to, options) { + super(); + this.render_options = Object.assign({ thickness: 2, x_shift: 0, y_shift: 10, position: CurvePosition.NEAR_HEAD, position_end: CurvePosition.NEAR_HEAD, invert: false, cps: [ + { x: 0, y: 10 }, + { x: 0, y: 10 }, + ] }, options); + this.from = from; + this.to = to; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_1__.Category.Curve; + } + static get Position() { + return CurvePosition; + } + static get PositionString() { + return { + nearHead: CurvePosition.NEAR_HEAD, + nearTop: CurvePosition.NEAR_TOP, + }; + } + setNotes(from, to) { + if (!from && !to) { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('BadArguments', 'Curve needs to have either `from` or `to` set.'); + } + this.from = from; + this.to = to; + return this; + } + /** + * @return {boolean} Returns true if this is a partial bar. + */ + isPartial() { + return !this.from || !this.to; + } + renderCurve(params) { + const ctx = this.checkContext(); + const x_shift = this.render_options.x_shift; + const y_shift = this.render_options.y_shift * params.direction; + const first_x = params.first_x + x_shift; + const first_y = params.first_y + y_shift; + const last_x = params.last_x - x_shift; + const last_y = params.last_y + y_shift; + const thickness = this.render_options.thickness; + const cps = this.render_options.cps; + const { x: cp0x, y: cp0y } = cps[0]; + const { x: cp1x, y: cp1y } = cps[1]; + const cp_spacing = (last_x - first_x) / (cps.length + 2); + ctx.beginPath(); + ctx.moveTo(first_x, first_y); + ctx.bezierCurveTo(first_x + cp_spacing + cp0x, first_y + cp0y * params.direction, last_x - cp_spacing + cp1x, last_y + cp1y * params.direction, last_x, last_y); + ctx.bezierCurveTo(last_x - cp_spacing + cp1x, last_y + (cp1y + thickness) * params.direction, first_x + cp_spacing + cp0x, first_y + (cp0y + thickness) * params.direction, first_x, first_y); + ctx.stroke(); + ctx.closePath(); + ctx.fill(); + } + draw() { + this.checkContext(); + this.setRendered(); + const first_note = this.from; + const last_note = this.to; + let first_x; + let last_x; + let first_y; + let last_y; + let stem_direction = 0; + let metric = 'baseY'; + let end_metric = 'baseY'; + function getPosition(position) { + return typeof position === 'string' ? Curve.PositionString[position] : position; + } + const position = getPosition(this.render_options.position); + const position_end = getPosition(this.render_options.position_end); + if (position === CurvePosition.NEAR_TOP) { + metric = 'topY'; + end_metric = 'topY'; + } + if (position_end === CurvePosition.NEAR_HEAD) { + end_metric = 'baseY'; + } + else if (position_end === CurvePosition.NEAR_TOP) { + end_metric = 'topY'; + } + if (first_note) { + first_x = first_note.getTieRightX(); + stem_direction = first_note.getStemDirection(); + first_y = first_note.getStemExtents()[metric]; + } + else { + const stave = last_note.checkStave(); + first_x = stave.getTieStartX(); + first_y = last_note.getStemExtents()[metric]; + } + if (last_note) { + last_x = last_note.getTieLeftX(); + stem_direction = last_note.getStemDirection(); + last_y = last_note.getStemExtents()[end_metric]; + } + else { + const stave = first_note.checkStave(); + last_x = stave.getTieEndX(); + last_y = first_note.getStemExtents()[end_metric]; + } + this.renderCurve({ + first_x, + last_x, + first_y, + last_y, + direction: stem_direction * (this.render_options.invert === true ? -1 : 1), + }); + return true; + } +} + + +/***/ }), + +/***/ "./src/dot.ts": +/*!********************!*\ + !*** ./src/dot.ts ***! + \********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Dot": () => (/* binding */ Dot) +/* harmony export */ }); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// VexFlow - Music Engraving for HTML5 +// Copyright Mohit Muthanna 2010 +// +// This class implements dot modifiers for notes. + + + +class Dot extends _modifier__WEBPACK_IMPORTED_MODULE_0__.Modifier { + constructor() { + super(); + this.position = _modifier__WEBPACK_IMPORTED_MODULE_0__.Modifier.Position.RIGHT; + this.radius = 2; + this.setWidth(5); + this.dot_shiftY = 0; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_1__.Category.Dot; + } + /** Returns the dots associated to a Note. */ + static getDots(note) { + return note.getModifiersByType(Dot.CATEGORY); + } + /** Add a dot on the specified keys to the notes. */ + static buildAndAttach(notes, options) { + for (const note of notes) { + if (options === null || options === void 0 ? void 0 : options.all) { + for (let i = 0; i < note.keys.length; i++) { + const dot = new Dot(); + dot.setDotShiftY(note.glyph.dot_shiftY); + note.addModifier(dot, i); + } + } + else if ((options === null || options === void 0 ? void 0 : options.index) != undefined) { + const dot = new Dot(); + dot.setDotShiftY(note.glyph.dot_shiftY); + note.addModifier(dot, options === null || options === void 0 ? void 0 : options.index); + } + else { + const dot = new Dot(); + dot.setDotShiftY(note.glyph.dot_shiftY); + note.addModifier(dot, 0); + } + } + } + // Arrange dots inside a ModifierContext. + static format(dots, state) { + const right_shift = state.right_shift; + const dot_spacing = 1; + if (!dots || dots.length === 0) + return false; + const dot_list = []; + const max_shift_map = {}; + for (let i = 0; i < dots.length; ++i) { + const dot = dots[i]; + const note = dot.getNote(); + let props; + let shift; + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_1__.isStaveNote)(note)) { + const index = dot.checkIndex(); + props = note.getKeyProps()[index]; + // consider right displaced head with no previous modifier + shift = note.getFirstDotPx(); + } + else if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_1__.isTabNote)(note)) { + props = { line: 0.5 }; // Shim key props for dot placement + shift = right_shift; + } + else { + // note object is not StaveNote or TabNote. + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('Internal', 'Unexpected instance.'); + } + const note_id = note.getAttribute('id'); + dot_list.push({ line: props.line, note, note_id, dot }); + max_shift_map[note_id] = Math.max(max_shift_map[note_id] || shift, shift); + } + // Sort dots by line number. + dot_list.sort((a, b) => b.line - a.line); + let dot_shift = right_shift; + let x_width = 0; + let last_line = null; + let last_note = null; + let prev_dotted_space = null; + let half_shiftY = 0; + for (let i = 0; i < dot_list.length; ++i) { + const { dot, note, note_id, line } = dot_list[i]; + // Reset the position of the dot every line. + if (line !== last_line || note !== last_note) { + dot_shift = max_shift_map[note_id]; + } + if (!note.isRest() && line !== last_line) { + if (Math.abs(line % 1) === 0.5) { + // note is on a space, so no dot shift + half_shiftY = 0; + } + else { + // note is on a line, so shift dot to space above the line + half_shiftY = 0.5; + if (last_note != null && !last_note.isRest() && last_line != null && last_line - line === 0.5) { + // previous note on a space, so shift dot to space below the line + half_shiftY = -0.5; + } + else if (line + half_shiftY === prev_dotted_space) { + // previous space is dotted, so shift dot to space below the line + half_shiftY = -0.5; + } + } + } + // convert half_shiftY to a multiplier for dots.draw() + if (note.isRest()) { + dot.dot_shiftY += -half_shiftY; + } + else { + dot.dot_shiftY = -half_shiftY; + } + prev_dotted_space = line + half_shiftY; + dot.setXShift(dot_shift); + dot_shift += dot.getWidth() + dot_spacing; // spacing + x_width = dot_shift > x_width ? dot_shift : x_width; + last_line = line; + last_note = note; + } + // Update state. + state.right_shift += x_width; + return true; + } + setNote(note) { + this.note = note; + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_1__.isGraceNote)(note)) { + this.radius *= 0.5; + this.setWidth(3); + } + return this; + } + setDotShiftY(y) { + this.dot_shiftY = y; + return this; + } + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const stave = note.checkStave(); + const lineSpace = stave.getSpacingBetweenLines(); + const start = note.getModifierStartXY(this.position, this.index, { forceFlagRight: true }); + // Set the starting y coordinate to the base of the stem for TabNotes. + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_1__.isTabNote)(note)) { + start.y = note.getStemExtents().baseY; + } + const x = start.x + this.x_shift + this.width - this.radius; + const y = start.y + this.y_shift + this.dot_shiftY * lineSpace; + ctx.beginPath(); + ctx.arc(x, y, this.radius, 0, Math.PI * 2, false); + ctx.fill(); + } +} + + +/***/ }), + +/***/ "./src/easyscore.ts": +/*!**************************!*\ + !*** ./src/easyscore.ts ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "EasyScoreGrammar": () => (/* binding */ EasyScoreGrammar), +/* harmony export */ "Piece": () => (/* binding */ Piece), +/* harmony export */ "Builder": () => (/* binding */ Builder), +/* harmony export */ "EasyScore": () => (/* binding */ EasyScore) +/* harmony export */ }); +/* harmony import */ var _articulation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./articulation */ "./src/articulation.ts"); +/* harmony import */ var _dot__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./dot */ "./src/dot.ts"); +/* harmony import */ var _frethandfinger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./frethandfinger */ "./src/frethandfinger.ts"); +/* harmony import */ var _music__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./music */ "./src/music.ts"); +/* harmony import */ var _parser__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./parser */ "./src/parser.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + + + +// To enable logging for this class. Set `Vex.Flow.EasyScore.DEBUG` to `true`. +// eslint-disable-next-line +function L(...args) { + if (EasyScore.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_6__.log)('Vex.Flow.EasyScore', args); +} +class EasyScoreGrammar { + constructor(builder) { + this.builder = builder; + } + begin() { + return this.LINE; + } + LINE() { + return { + expect: [this.PIECE, this.PIECES, this.EOL], + }; + } + PIECE() { + return { + expect: [this.CHORDORNOTE, this.PARAMS], + run: () => this.builder.commitPiece(), + }; + } + PIECES() { + return { + expect: [this.COMMA, this.PIECE], + zeroOrMore: true, + }; + } + PARAMS() { + return { + expect: [this.DURATION, this.TYPE, this.DOTS, this.OPTS], + }; + } + CHORDORNOTE() { + return { + expect: [this.CHORD, this.SINGLENOTE], + or: true, + }; + } + CHORD() { + return { + expect: [this.LPAREN, this.NOTES, this.RPAREN], + // eslint-disable-next-line + run: (state) => this.builder.addChord(state.matches[1]), + }; + } + NOTES() { + return { + expect: [this.NOTE], + oneOrMore: true, + }; + } + NOTE() { + return { + expect: [this.NOTENAME, this.ACCIDENTAL, this.OCTAVE], + }; + } + SINGLENOTE() { + return { + expect: [this.NOTENAME, this.ACCIDENTAL, this.OCTAVE], + run: (state) => { + // eslint-disable-next-line + const s = state; + this.builder.addSingleNote(s.matches[0], s.matches[1], s.matches[2]); + }, + }; + } + ACCIDENTAL() { + return { + expect: [this.MICROTONES, this.ACCIDENTALS], + maybe: true, + or: true, + }; + } + DOTS() { + return { + expect: [this.DOT], + zeroOrMore: true, + // eslint-disable-next-line + run: (state) => this.builder.setNoteDots(state.matches), + }; + } + TYPE() { + return { + expect: [this.SLASH, this.MAYBESLASH, this.TYPES], + maybe: true, + // eslint-disable-next-line + run: (state) => this.builder.setNoteType(state.matches[2]), + }; + } + DURATION() { + return { + expect: [this.SLASH, this.DURATIONS], + maybe: true, + // eslint-disable-next-line + run: (state) => this.builder.setNoteDuration(state.matches[1]), + }; + } + OPTS() { + return { + expect: [this.LBRACKET, this.KEYVAL, this.KEYVALS, this.RBRACKET], + maybe: true, + }; + } + KEYVALS() { + return { + expect: [this.COMMA, this.KEYVAL], + zeroOrMore: true, + }; + } + KEYVAL() { + const unquote = (str) => str.slice(1, -1); + return { + expect: [this.KEY, this.EQUALS, this.VAL], + // eslint-disable-next-line + run: (state) => this.builder.addNoteOption(state.matches[0], unquote(state.matches[2])), + }; + } + VAL() { + return { + expect: [this.SVAL, this.DVAL], + or: true, + }; + } + KEY() { + return { token: '[a-zA-Z][a-zA-Z0-9]*' }; + } + DVAL() { + return { token: '["][^"]*["]' }; + } + SVAL() { + return { token: "['][^']*[']" }; + } + NOTENAME() { + return { token: '[a-gA-G]' }; + } + OCTAVE() { + return { token: '[0-9]+' }; + } + ACCIDENTALS() { + return { token: 'bb|b|##|#|n' }; + } + MICROTONES() { + return { token: 'bbs|bss|bs|db|d|\\+\\+-|\\+-|\\+\\+|\\+|k|o' }; + } + DURATIONS() { + return { token: '[0-9whq]+' }; + } + TYPES() { + return { token: '[rRsSmMhHgG]' }; + } + LPAREN() { + return { token: '[(]' }; + } + RPAREN() { + return { token: '[)]' }; + } + COMMA() { + return { token: '[,]' }; + } + DOT() { + return { token: '[.]' }; + } + SLASH() { + return { token: '[/]' }; + } + MAYBESLASH() { + return { token: '[/]?' }; + } + EQUALS() { + return { token: '[=]' }; + } + LBRACKET() { + return { token: '\\[' }; + } + RBRACKET() { + return { token: '\\]' }; + } + EOL() { + return { token: '$' }; + } +} +class Piece { + constructor(duration) { + this.chord = []; + this.dots = 0; + this.options = {}; + this.duration = duration; + } +} +class Builder { + constructor(factory) { + this.commitHooks = []; + this.factory = factory; + this.reset(); + } + reset(options) { + this.options = Object.assign({ stem: 'auto', clef: 'treble' }, options); + this.elements = { notes: [], accidentals: [] }; + this.rollingDuration = '8'; + this.resetPiece(); + } + getFactory() { + return this.factory; + } + getElements() { + return this.elements; + } + addCommitHook(commitHook) { + this.commitHooks.push(commitHook); + } + resetPiece() { + L('resetPiece'); + this.piece = new Piece(this.rollingDuration); + } + setNoteDots(dots) { + L('setNoteDots:', dots); + if (dots) + this.piece.dots = dots.length; + } + setNoteDuration(duration) { + L('setNoteDuration:', duration); + this.rollingDuration = this.piece.duration = duration || this.rollingDuration; + } + setNoteType(type) { + L('setNoteType:', type); + if (type) + this.piece.type = type; + } + addNoteOption(key, value) { + L('addNoteOption: key:', key, 'value:', value); + this.piece.options[key] = value; + } + addNote(key, accid, octave) { + L('addNote:', key, accid, octave); + this.piece.chord.push({ + key: key, + accid, + octave, + }); + } + addSingleNote(key, accid, octave) { + L('addSingleNote:', key, accid, octave); + this.addNote(key, accid, octave); + } + // notes is an array with 3 entries + addChord(notes) { + L('startChord'); + if (typeof notes[0] !== 'object') { + this.addSingleNote(notes[0]); + } + else { + notes.forEach((n) => { + if (n) + this.addNote(...n); // n => [string, string | null, string] + }); + } + L('endChord'); + } + commitPiece() { + L('commitPiece'); + const { factory } = this; + if (!factory) + return; + const options = Object.assign(Object.assign({}, this.options), this.piece.options); + // reset() sets this.options.stem & this.options.clef but we check to make sure nothing has changed. + // e.g., auto | up | down + const stem = (0,_util__WEBPACK_IMPORTED_MODULE_6__.defined)(options.stem, 'BadArguments', 'options.stem is not defined').toLowerCase(); + // e.g., treble | bass + const clef = (0,_util__WEBPACK_IMPORTED_MODULE_6__.defined)(options.clef, 'BadArguments', 'options.clef is not defined').toLowerCase(); + const { chord, duration, dots, type } = this.piece; + // Create a string[] that will be assigned to the .keys property of the StaveNote. + // Each string in the array represents a note pitch and is of the form: {NoteName}{Accidental}/{Octave} + // Only standard accidentals are included in the .keys property. Microtonal accidentals are not included. + const standardAccidentals = _music__WEBPACK_IMPORTED_MODULE_3__.Music.accidentals; + const keys = chord.map((notePiece) => { + var _a; + return notePiece.key + + (standardAccidentals.includes((_a = notePiece.accid) !== null && _a !== void 0 ? _a : '') ? notePiece.accid : '') + + '/' + + notePiece.octave; + }); + const auto_stem = stem === 'auto'; // StaveNoteStruct expects the underscore & lowercase. + // Build a GhostNote or StaveNote using the information we gathered. + const note = (type === null || type === void 0 ? void 0 : type.toLowerCase()) == 'g' + ? factory.GhostNote({ duration, dots }) + : factory.StaveNote({ keys, duration, dots, type, clef, auto_stem }); + if (!auto_stem) + note.setStemDirection(stem === 'up' ? _stem__WEBPACK_IMPORTED_MODULE_5__.Stem.UP : _stem__WEBPACK_IMPORTED_MODULE_5__.Stem.DOWN); + // Attach accidentals. + const accidentals = []; + chord.forEach((notePiece, index) => { + const accid = notePiece.accid; + if (typeof accid === 'string') { + const accidental = factory.Accidental({ type: accid }); + note.addModifier(accidental, index); + accidentals.push(accidental); + } + else { + accidentals.push(undefined); + } + }); + // Attach dots. + for (let i = 0; i < dots; i++) + _dot__WEBPACK_IMPORTED_MODULE_1__.Dot.buildAndAttach([note], { all: true }); + this.commitHooks.forEach((commitHook) => commitHook(options, note, this)); + this.elements.notes.push(note); + this.elements.accidentals.push(accidentals); + this.resetPiece(); + } +} +/** + * Commit hook used by EasyScore.setOptions(). + */ +function setId(options, note) { + if (options.id === undefined) + return; + note.setAttribute('id', options.id); +} +// Used by setClass() below. +const commaSeparatedRegex = /\s*,\s*/; +/** + * Commit hook used by EasyScore.setOptions(). + */ +function setClass(options, note) { + if (options.class === undefined) + return; + options.class.split(commaSeparatedRegex).forEach((className) => note.addClass(className)); +} +/** + * EasyScore implements a parser for a simple language to generate VexFlow objects. + */ +class EasyScore { + constructor(options = {}) { + this.defaults = { + clef: 'treble', + time: '4/4', + stem: 'auto', + }; + this.setOptions(options); + } + /** + * Set the score defaults. + * clef must be set appropriately to avoid errors when adding Staves. + * @param defaults.clef default clef ( treble | bass ...) see {@link Clef.types} + * @param defaults.time default time signature ( 4/4 | 9/8 ...) + * @param defaults.stem default stem arrangement (auto | up | down) + * @returns this + */ + set(defaults) { + this.defaults = Object.assign(Object.assign({}, this.defaults), defaults); + return this; + } + /** + * @param options.factory is required. + * @returns this + */ + setOptions(options) { + var _a, _b; + // eslint-disable-next-line + const factory = options.factory; // ! operator, because options.factory was set in Factory.EasyScore(). + const builder = (_a = options.builder) !== null && _a !== void 0 ? _a : new Builder(factory); + this.options = Object.assign(Object.assign({ commitHooks: [setId, setClass, _articulation__WEBPACK_IMPORTED_MODULE_0__.Articulation.easyScoreHook, _frethandfinger__WEBPACK_IMPORTED_MODULE_2__.FretHandFinger.easyScoreHook], throwOnError: false }, options), { factory, + builder }); + this.factory = factory; + this.builder = builder; + this.grammar = new EasyScoreGrammar(this.builder); + this.parser = new _parser__WEBPACK_IMPORTED_MODULE_4__.Parser(this.grammar); + (_b = this.options.commitHooks) === null || _b === void 0 ? void 0 : _b.forEach((commitHook) => this.addCommitHook(commitHook)); + return this; + } + setContext(context) { + this.factory.setContext(context); + return this; + } + parse(line, options = {}) { + this.builder.reset(options); + const result = this.parser.parse(line); + if (!result.success && this.options.throwOnError) { + L(result); + throw new _util__WEBPACK_IMPORTED_MODULE_6__.RuntimeError('Error parsing line: ' + line); + } + return result; + } + beam(notes, options) { + this.factory.Beam({ notes, options }); + return notes; + } + tuplet(notes, options) { + this.factory.Tuplet({ notes, options }); + return notes; + } + notes(line, options = {}) { + options = Object.assign({ clef: this.defaults.clef, stem: this.defaults.stem }, options); + this.parse(line, options); + return this.builder.getElements().notes; + } + voice(notes, options = {}) { + options = Object.assign({ time: this.defaults.time }, options); + return this.factory.Voice(options).addTickables(notes); + } + addCommitHook(commitHook) { + this.builder.addCommitHook(commitHook); + } +} +EasyScore.DEBUG = false; + + +/***/ }), + +/***/ "./src/element.ts": +/*!************************!*\ + !*** ./src/element.ts ***! + \************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Element": () => (/* binding */ Element) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _registry__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./registry */ "./src/registry.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// @author Mohit Cheppudira +// MIT License + + + + +/** + * Element implements a generic base class for VexFlow, with implementations + * of general functions and properties that can be inherited by all VexFlow elements. + */ +class Element { + constructor() { + var _a; + this.attrs = { + id: Element.newID(), + el: undefined, + type: this.getCategory(), + classes: {}, + }; + this.rendered = false; + // If a default registry exist, then register with it right away. + (_a = _registry__WEBPACK_IMPORTED_MODULE_1__.Registry.getDefaultRegistry()) === null || _a === void 0 ? void 0 : _a.register(this); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_2__.Category.Element; + } + static newID() { + return `auto${Element.ID++}`; + } + /** Get element category string. */ + getCategory() { + return this.constructor.CATEGORY; + } + /** + * Set the element style used to render. + * + * Example: + * ```typescript + * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' }); + * element.draw(); + * ``` + * Note: If the element draws additional sub-elements (ie.: Modifiers in a Stave), + * the style can be applied to all of them by means of the context: + * ```typescript + * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' }); + * element.getContext().setFillStyle('red'); + * element.getContext().setStrokeStyle('red'); + * element.draw(); + * ``` + * or using drawWithStyle: + * ```typescript + * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' }); + * element.drawWithStyle(); + * ``` + */ + setStyle(style) { + this.style = style; + return this; + } + /** Get the element style used for rendering. */ + getStyle() { + return this.style; + } + /** Apply the element style to `context`. */ + applyStyle(context = this.context, style = this.getStyle()) { + if (!style) + return this; + if (!context) + return this; + context.save(); + if (style.shadowColor) + context.setShadowColor(style.shadowColor); + if (style.shadowBlur) + context.setShadowBlur(style.shadowBlur); + if (style.fillStyle) + context.setFillStyle(style.fillStyle); + if (style.strokeStyle) + context.setStrokeStyle(style.strokeStyle); + if (style.lineWidth) + context.setLineWidth(style.lineWidth); + return this; + } + /** Restore the style of `context`. */ + restoreStyle(context = this.context, style = this.getStyle()) { + if (!style) + return this; + if (!context) + return this; + context.restore(); + return this; + } + /** + * Draw the element and all its sub-elements (ie.: Modifiers in a Stave) + * with the element style. + */ + drawWithStyle() { + this.checkContext(); + this.applyStyle(); + this.draw(); + this.restoreStyle(); + } + /** Check if it has a class label (An element can have multiple class labels). */ + hasClass(className) { + return this.attrs.classes[className] === true; + } + /** Add a class label (An element can have multiple class labels). */ + addClass(className) { + var _a; + this.attrs.classes[className] = true; + (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({ + id: this.attrs.id, + name: 'class', + value: className, + oldValue: undefined, + }); + return this; + } + /** Remove a class label (An element can have multiple class labels). */ + removeClass(className) { + var _a; + delete this.attrs.classes[className]; + (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({ + id: this.attrs.id, + name: 'class', + value: undefined, + oldValue: className, + }); + return this; + } + /** Call back from registry after the element is registered. */ + onRegister(registry) { + this.registry = registry; + return this; + } + /** Return the rendered status. */ + isRendered() { + return this.rendered; + } + /** Set the rendered status. */ + setRendered(rendered = true) { + this.rendered = rendered; + return this; + } + /** Return the element attributes. */ + getAttributes() { + return this.attrs; + } + /** Return an attribute. */ + // eslint-disable-next-line + getAttribute(name) { + return this.attrs[name]; + } + /** Set an attribute. */ + // eslint-disable-next-line + setAttribute(name, value) { + var _a; + const oldID = this.attrs.id; + const oldValue = this.attrs[name]; + this.attrs[name] = value; + // Register with old id to support id changes. + (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({ id: oldID, name, value, oldValue }); + return this; + } + /** Get the boundingBox. */ + getBoundingBox() { + return this.boundingBox; + } + /** Return the context. */ + getContext() { + return this.context; + } + /** Set the context. */ + setContext(context) { + this.context = context; + return this; + } + /** Validate and return the context. */ + checkContext() { + return (0,_util__WEBPACK_IMPORTED_MODULE_3__.defined)(this.context, 'NoContext', 'No rendering context attached to instance.'); + } + ////////////////////////////////////////////////////////////////////////////////////////////////// + // Font Handling + /** + * Provide a CSS compatible font string (e.g., 'bold 16px Arial'). + */ + set font(f) { + this.setFont(f); + } + /** Returns the CSS compatible font string. */ + get font() { + return _font__WEBPACK_IMPORTED_MODULE_0__.Font.toCSSString(this.textFont); + } + /** + * Set the element's font family, size, weight, style (e.g., `Arial`, `10pt`, `bold`, `italic`). + * @param font is 1) a `FontInfo` object or + * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or + * 3) a string representing the font family (at least one of `size`, `weight`, or `style` must also be provided). + * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt'). + * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900). + * @param style is a string (e.g., 'italic', 'normal'). + * If no arguments are provided, then the font is set to the default font. + * Each Element subclass may specify its own default by overriding the static `TEXT_FONT` property. + */ + setFont(font, size, weight, style) { + // Allow subclasses to override `TEXT_FONT`. + const defaultTextFont = this.constructor.TEXT_FONT; + const fontIsObject = typeof font === 'object'; + const fontIsString = typeof font === 'string'; + const fontIsUndefined = font === undefined; + const sizeWeightStyleAreUndefined = size === undefined && weight === undefined && style === undefined; + if (fontIsObject) { + // `font` is case 1) a FontInfo object + this.textFont = Object.assign(Object.assign({}, defaultTextFont), font); + } + else if (fontIsString && sizeWeightStyleAreUndefined) { + // `font` is case 2) CSS font shorthand. + this.textFont = _font__WEBPACK_IMPORTED_MODULE_0__.Font.fromCSSString(font); + } + else if (fontIsUndefined && sizeWeightStyleAreUndefined) { + // All arguments are undefined. Do not check for `arguments.length === 0`, + // which fails on the edge case: `setFont(undefined)`. + // TODO: See if we can remove this case entirely without introducing a visual diff. + // The else case below seems like it should be equivalent to this case. + this.textFont = Object.assign({}, defaultTextFont); + } + else { + // `font` is case 3) a font family string (e.g., 'Times New Roman'). + // The other parameters represent the size, weight, and style. + // It is okay for `font` to be undefined while one or more of the other arguments is provided. + // Following CSS conventions, unspecified params are reset to the default. + this.textFont = _font__WEBPACK_IMPORTED_MODULE_0__.Font.validate(font !== null && font !== void 0 ? font : defaultTextFont.family, size !== null && size !== void 0 ? size : defaultTextFont.size, weight !== null && weight !== void 0 ? weight : defaultTextFont.weight, style !== null && style !== void 0 ? style : defaultTextFont.style); + } + return this; + } + getFont() { + if (!this.textFont) { + this.resetFont(); + } + return _font__WEBPACK_IMPORTED_MODULE_0__.Font.toCSSString(this.textFont); + } + /** + * Reset the text font to the style indicated by the static `TEXT_FONT` property. + * Subclasses can call this to initialize `textFont` for the first time. + */ + resetFont() { + this.setFont(); + } + /** Return a copy of the current FontInfo object. */ + get fontInfo() { + if (!this.textFont) { + this.resetFont(); + } + // We can cast to Required here, because + // we just called resetFont() above to ensure this.textFont is set. + return Object.assign({}, this.textFont); + } + set fontInfo(fontInfo) { + this.setFont(fontInfo); + } + /** Change the font size, while keeping everything else the same. */ + setFontSize(size) { + const fontInfo = this.fontInfo; + this.setFont(fontInfo.family, size, fontInfo.weight, fontInfo.style); + return this; + } + /** + * @returns a CSS font-size string (e.g., '18pt', '12px', '1em'). + * See Element.fontSizeInPixels or Element.fontSizeInPoints if you need to get a number for calculation purposes. + */ + getFontSize() { + return this.fontSize; + } + /** + * The size is 1) a string of the form '10pt' or '16px', compatible with the CSS font-size property. + * or 2) a number, which is interpreted as a point size (i.e. 12 == '12pt'). + */ + set fontSize(size) { + this.setFontSize(size); + } + /** + * @returns a CSS font-size string (e.g., '18pt', '12px', '1em'). + */ + get fontSize() { + let size = this.fontInfo.size; + if (typeof size === 'number') { + size = `${size}pt`; + } + return size; + } + /** + * @returns the font size in `pt`. + */ + get fontSizeInPoints() { + return _font__WEBPACK_IMPORTED_MODULE_0__.Font.convertSizeToPointValue(this.fontSize); + } + /** + * @returns the font size in `px`. + */ + get fontSizeInPixels() { + return _font__WEBPACK_IMPORTED_MODULE_0__.Font.convertSizeToPixelValue(this.fontSize); + } + /** + * @returns a CSS font-style string (e.g., 'italic'). + */ + get fontStyle() { + return this.fontInfo.style; + } + set fontStyle(style) { + const fontInfo = this.fontInfo; + this.setFont(fontInfo.family, fontInfo.size, fontInfo.weight, style); + } + /** + * @returns a CSS font-weight string (e.g., 'bold'). + * As in CSS, font-weight is always returned as a string, even if it was set as a number. + */ + get fontWeight() { + return this.fontInfo.weight + ''; + } + set fontWeight(weight) { + const fontInfo = this.fontInfo; + this.setFont(fontInfo.family, fontInfo.size, weight, fontInfo.style); + } +} +Element.ID = 1000; +/** + * Default font for text. This is not related to music engraving. Instead, see `Flow.setMusicFont(...fontNames)` + * to customize the font for musical symbols placed on the score. + */ +Element.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_0__.Font.SANS_SERIF, + size: _font__WEBPACK_IMPORTED_MODULE_0__.Font.SIZE, + weight: _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.NORMAL, + style: _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.NORMAL, +}; + + +/***/ }), + +/***/ "./src/factory.ts": +/*!************************!*\ + !*** ./src/factory.ts ***! + \************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Factory": () => (/* binding */ Factory) +/* harmony export */ }); +/* harmony import */ var _accidental__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./accidental */ "./src/accidental.ts"); +/* harmony import */ var _annotation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./annotation */ "./src/annotation.ts"); +/* harmony import */ var _articulation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./articulation */ "./src/articulation.ts"); +/* harmony import */ var _barnote__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./barnote */ "./src/barnote.ts"); +/* harmony import */ var _beam__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./beam */ "./src/beam.ts"); +/* harmony import */ var _chordsymbol__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./chordsymbol */ "./src/chordsymbol.ts"); +/* harmony import */ var _clefnote__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./clefnote */ "./src/clefnote.ts"); +/* harmony import */ var _curve__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./curve */ "./src/curve.ts"); +/* harmony import */ var _easyscore__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./easyscore */ "./src/easyscore.ts"); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _formatter__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./formatter */ "./src/formatter.ts"); +/* harmony import */ var _frethandfinger__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./frethandfinger */ "./src/frethandfinger.ts"); +/* harmony import */ var _ghostnote__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./ghostnote */ "./src/ghostnote.ts"); +/* harmony import */ var _glyphnote__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./glyphnote */ "./src/glyphnote.ts"); +/* harmony import */ var _gracenote__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./gracenote */ "./src/gracenote.ts"); +/* harmony import */ var _gracenotegroup__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./gracenotegroup */ "./src/gracenotegroup.ts"); +/* harmony import */ var _keysignote__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./keysignote */ "./src/keysignote.ts"); +/* harmony import */ var _modifiercontext__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./modifiercontext */ "./src/modifiercontext.ts"); +/* harmony import */ var _multimeasurerest__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./multimeasurerest */ "./src/multimeasurerest.ts"); +/* harmony import */ var _notesubgroup__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./notesubgroup */ "./src/notesubgroup.ts"); +/* harmony import */ var _pedalmarking__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./pedalmarking */ "./src/pedalmarking.ts"); +/* harmony import */ var _renderer__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./renderer */ "./src/renderer.ts"); +/* harmony import */ var _repeatnote__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./repeatnote */ "./src/repeatnote.ts"); +/* harmony import */ var _stave__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./stave */ "./src/stave.ts"); +/* harmony import */ var _staveconnector__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./staveconnector */ "./src/staveconnector.ts"); +/* harmony import */ var _staveline__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./staveline */ "./src/staveline.ts"); +/* harmony import */ var _stavenote__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./stavenote */ "./src/stavenote.ts"); +/* harmony import */ var _stavetie__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./stavetie */ "./src/stavetie.ts"); +/* harmony import */ var _stringnumber__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./stringnumber */ "./src/stringnumber.ts"); +/* harmony import */ var _system__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./system */ "./src/system.ts"); +/* harmony import */ var _tabnote__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./tabnote */ "./src/tabnote.ts"); +/* harmony import */ var _tabstave__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./tabstave */ "./src/tabstave.ts"); +/* harmony import */ var _textbracket__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./textbracket */ "./src/textbracket.ts"); +/* harmony import */ var _textdynamics__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./textdynamics */ "./src/textdynamics.ts"); +/* harmony import */ var _textnote__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./textnote */ "./src/textnote.ts"); +/* harmony import */ var _tickcontext__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./tickcontext */ "./src/tickcontext.ts"); +/* harmony import */ var _timesignote__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./timesignote */ "./src/timesignote.ts"); +/* harmony import */ var _tuplet__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./tuplet */ "./src/tuplet.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +/* harmony import */ var _vibratobracket__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./vibratobracket */ "./src/vibratobracket.ts"); +/* harmony import */ var _voice__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./voice */ "./src/voice.ts"); +/* harmony import */ var _web__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./web */ "./src/web.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// @author Mohit Cheppudira +// MIT License + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// eslint-disable-next-line +function L(...args) { + if (Factory.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_38__.log)('Vex.Flow.Factory', args); +} +/** + * Factory implements a high level API around VexFlow. + */ +class Factory { + /** + * Example: + * + * Create an SVG renderer and attach it to the DIV element named "boo" to render using 1200 and 600 + * + * `const vf: Factory = new Vex.Flow.Factory({renderer: { elementId: 'boo', width: 1200, height: 600 }});` + */ + constructor(options = {}) { + L('New factory: ', options); + this.options = { + stave: { + space: 10, + }, + renderer: { + elementId: '', + width: 500, + height: 200, + background: '#FFF', + }, + font: Factory.TEXT_FONT, + }; + this.setOptions(options); + } + /** + * Static simplified function to access constructor without providing FactoryOptions + * + * Example: + * + * Create an SVG renderer and attach it to the DIV element named "boo" to render using 1200 and 600 + * + * `const vf: Factory = Vex.Flow.Factory.newFromElementId('boo', 1200, 600 );` + */ + static newFromElementId(elementId, width = 500, height = 200) { + return new Factory({ renderer: { elementId, width, height } }); + } + reset() { + this.renderQ = []; + this.systems = []; + this.staves = []; + this.voices = []; + this.stave = undefined; // current stave + } + setOptions(options) { + this.options = Object.assign(Object.assign({}, this.options), options); + this.initRenderer(); + this.reset(); + } + initRenderer() { + const { elementId, width, height, background } = this.options.renderer; + if (elementId == null) { + return; + } + if (elementId == '') { + L(this); + throw new _util__WEBPACK_IMPORTED_MODULE_38__.RuntimeError('renderer.elementId not set in FactoryOptions'); + } + let backend = this.options.renderer.backend; + if (backend === undefined) { + const elem = document.getElementById(elementId); + // We use a custom type check here, because node-canvas mimics canvas, + // but is not an instance of window.HTMLCanvasElement. + // In fact, `window` might be undefined here. + // See: https://www.npmjs.com/package/canvas + if ((0,_web__WEBPACK_IMPORTED_MODULE_41__.isHTMLCanvas)(elem)) { + backend = _renderer__WEBPACK_IMPORTED_MODULE_21__.Renderer.Backends.CANVAS; + } + else { + backend = _renderer__WEBPACK_IMPORTED_MODULE_21__.Renderer.Backends.SVG; + } + } + this.context = _renderer__WEBPACK_IMPORTED_MODULE_21__.Renderer.buildContext(elementId, backend, width, height, background); + } + getContext() { + return this.context; + } + setContext(context) { + this.context = context; + return this; + } + getStave() { + return this.stave; + } + getVoices() { + return this.voices; + } + /** Return pixels from current stave spacing. */ + Stave(params) { + const staveSpace = this.options.stave.space; + const p = Object.assign({ x: 0, y: 0, width: this.options.renderer.width - staveSpace * 1.0, options: { spacing_between_lines_px: staveSpace * 1.0 } }, params); + const stave = new _stave__WEBPACK_IMPORTED_MODULE_23__.Stave(p.x, p.y, p.width, p.options); + this.staves.push(stave); + stave.setContext(this.context); + this.stave = stave; + return stave; + } + TabStave(params) { + const staveSpace = this.options.stave.space; + const p = Object.assign({ x: 0, y: 0, width: this.options.renderer.width - staveSpace * 1.0, options: { spacing_between_lines_px: staveSpace * 1.3 } }, params); + const stave = new _tabstave__WEBPACK_IMPORTED_MODULE_31__.TabStave(p.x, p.y, p.width, p.options); + this.staves.push(stave); + stave.setContext(this.context); + this.stave = stave; + return stave; + } + StaveNote(noteStruct) { + const note = new _stavenote__WEBPACK_IMPORTED_MODULE_26__.StaveNote(noteStruct); + if (this.stave) + note.setStave(this.stave); + note.setContext(this.context); + this.renderQ.push(note); + return note; + } + GlyphNote(glyph, noteStruct, options) { + const note = new _glyphnote__WEBPACK_IMPORTED_MODULE_13__.GlyphNote(glyph, noteStruct, options); + if (this.stave) + note.setStave(this.stave); + note.setContext(this.context); + this.renderQ.push(note); + return note; + } + RepeatNote(type, noteStruct, options) { + const note = new _repeatnote__WEBPACK_IMPORTED_MODULE_22__.RepeatNote(type, noteStruct, options); + if (this.stave) + note.setStave(this.stave); + note.setContext(this.context); + this.renderQ.push(note); + return note; + } + GhostNote(noteStruct) { + const ghostNote = new _ghostnote__WEBPACK_IMPORTED_MODULE_12__.GhostNote(noteStruct); + if (this.stave) + ghostNote.setStave(this.stave); + ghostNote.setContext(this.context); + this.renderQ.push(ghostNote); + return ghostNote; + } + TextNote(noteStruct) { + const textNote = new _textnote__WEBPACK_IMPORTED_MODULE_34__.TextNote(noteStruct); + if (this.stave) + textNote.setStave(this.stave); + textNote.setContext(this.context); + this.renderQ.push(textNote); + return textNote; + } + BarNote(params = {}) { + const barNote = new _barnote__WEBPACK_IMPORTED_MODULE_3__.BarNote(params.type); + if (this.stave) + barNote.setStave(this.stave); + barNote.setContext(this.context); + this.renderQ.push(barNote); + return barNote; + } + ClefNote(params) { + const p = Object.assign({ type: 'treble', options: { + size: 'default', + annotation: undefined, + } }, params); + const clefNote = new _clefnote__WEBPACK_IMPORTED_MODULE_6__.ClefNote(p.type, p.options.size, p.options.annotation); + if (this.stave) + clefNote.setStave(this.stave); + clefNote.setContext(this.context); + this.renderQ.push(clefNote); + return clefNote; + } + TimeSigNote(params) { + const p = Object.assign({ time: '4/4' }, params); + const timeSigNote = new _timesignote__WEBPACK_IMPORTED_MODULE_36__.TimeSigNote(p.time); + if (this.stave) + timeSigNote.setStave(this.stave); + timeSigNote.setContext(this.context); + this.renderQ.push(timeSigNote); + return timeSigNote; + } + KeySigNote(params) { + const keySigNote = new _keysignote__WEBPACK_IMPORTED_MODULE_16__.KeySigNote(params.key, params.cancelKey, params.alterKey); + if (this.stave) + keySigNote.setStave(this.stave); + keySigNote.setContext(this.context); + this.renderQ.push(keySigNote); + return keySigNote; + } + TabNote(noteStruct) { + const note = new _tabnote__WEBPACK_IMPORTED_MODULE_30__.TabNote(noteStruct); + if (this.stave) + note.setStave(this.stave); + note.setContext(this.context); + this.renderQ.push(note); + return note; + } + GraceNote(noteStruct) { + const note = new _gracenote__WEBPACK_IMPORTED_MODULE_14__.GraceNote(noteStruct); + if (this.stave) + note.setStave(this.stave); + note.setContext(this.context); + return note; + } + GraceNoteGroup(params) { + const group = new _gracenotegroup__WEBPACK_IMPORTED_MODULE_15__.GraceNoteGroup(params.notes, params.slur); + group.setContext(this.context); + return group; + } + Accidental(params) { + const accid = new _accidental__WEBPACK_IMPORTED_MODULE_0__.Accidental(params.type); + accid.setContext(this.context); + return accid; + } + Annotation(params) { + const p = Object.assign({ text: 'p', hJustify: _annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationHorizontalJustify.CENTER, vJustify: _annotation__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify.BOTTOM }, params); + const annotation = new _annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation(p.text); + annotation.setJustification(p.hJustify); + annotation.setVerticalJustification(p.vJustify); + annotation.setFont(p.font); + annotation.setContext(this.context); + return annotation; + } + ChordSymbol(params) { + const p = Object.assign({ vJustify: 'top', hJustify: 'center', kerning: true, reportWidth: true }, params); + const chordSymbol = new _chordsymbol__WEBPACK_IMPORTED_MODULE_5__.ChordSymbol(); + chordSymbol.setHorizontal(p.hJustify); + chordSymbol.setVertical(p.vJustify); + chordSymbol.setEnableKerning(p.kerning); + chordSymbol.setReportWidth(p.reportWidth); + // There is a default font based on the engraving font. Only set then + // font if it is specific, else use the default + if (typeof p.fontFamily === 'string' && typeof p.fontSize === 'number') { + if (typeof p.fontWeight === 'string') + chordSymbol.setFont(p.fontFamily, p.fontSize, p.fontWeight); + else + chordSymbol.setFont(p.fontFamily, p.fontSize, ''); + } + else if (typeof p.fontSize === 'number') { + chordSymbol.setFontSize(p.fontSize); + } + chordSymbol.setContext(this.context); + return chordSymbol; + } + Articulation(params) { + const p = Object.assign({ type: 'a.', position: 'above' }, params); + const articulation = new _articulation__WEBPACK_IMPORTED_MODULE_2__.Articulation(p.type); + articulation.setPosition(p.position); + articulation.setContext(this.context); + return articulation; + } + TextDynamics(params) { + const p = Object.assign({ text: 'p', duration: 'q', dots: 0, line: 0 }, params); + const text = new _textdynamics__WEBPACK_IMPORTED_MODULE_33__.TextDynamics({ + text: p.text, + line: p.line, + duration: p.duration, + dots: p.dots, + }); + if (this.stave) + text.setStave(this.stave); + text.setContext(this.context); + this.renderQ.push(text); + return text; + } + Fingering(params) { + const p = Object.assign({ number: '0', position: 'left' }, params); + const fingering = new _frethandfinger__WEBPACK_IMPORTED_MODULE_11__.FretHandFinger(p.number); + fingering.setPosition(p.position); + fingering.setContext(this.context); + return fingering; + } + StringNumber(params) { + const stringNumber = new _stringnumber__WEBPACK_IMPORTED_MODULE_28__.StringNumber(params.number); + stringNumber.setPosition(params.position); + stringNumber.setContext(this.context); + return stringNumber; + } + TickContext() { + return new _tickcontext__WEBPACK_IMPORTED_MODULE_35__.TickContext(); + } + ModifierContext() { + return new _modifiercontext__WEBPACK_IMPORTED_MODULE_17__.ModifierContext(); + } + MultiMeasureRest(params) { + const numMeasures = (0,_util__WEBPACK_IMPORTED_MODULE_38__.defined)(params.number_of_measures, 'NoNumberOfMeasures'); + const multiMeasureRest = new _multimeasurerest__WEBPACK_IMPORTED_MODULE_18__.MultiMeasureRest(numMeasures, params); + multiMeasureRest.setContext(this.context); + this.renderQ.push(multiMeasureRest); + return multiMeasureRest; + } + Voice(params) { + const p = Object.assign({ time: '4/4' }, params); + const voice = new _voice__WEBPACK_IMPORTED_MODULE_40__.Voice(p.time, p.options); + this.voices.push(voice); + return voice; + } + StaveConnector(params) { + const connector = new _staveconnector__WEBPACK_IMPORTED_MODULE_24__.StaveConnector(params.top_stave, params.bottom_stave); + connector.setType(params.type).setContext(this.context); + this.renderQ.push(connector); + return connector; + } + Formatter(options) { + return new _formatter__WEBPACK_IMPORTED_MODULE_10__.Formatter(options); + } + Tuplet(params) { + const p = Object.assign({ notes: [], options: {} }, params); + const tuplet = new _tuplet__WEBPACK_IMPORTED_MODULE_37__.Tuplet(p.notes, p.options).setContext(this.context); + this.renderQ.push(tuplet); + return tuplet; + } + Beam(params) { + var _a, _b, _c; + const beam = new _beam__WEBPACK_IMPORTED_MODULE_4__.Beam(params.notes, (_a = params.options) === null || _a === void 0 ? void 0 : _a.autoStem).setContext(this.context); + beam.breakSecondaryAt((_c = (_b = params.options) === null || _b === void 0 ? void 0 : _b.secondaryBeamBreaks) !== null && _c !== void 0 ? _c : []); + this.renderQ.push(beam); + return beam; + } + Curve(params) { + const curve = new _curve__WEBPACK_IMPORTED_MODULE_7__.Curve(params.from, params.to, params.options).setContext(this.context); + this.renderQ.push(curve); + return curve; + } + StaveTie(params) { + var _a; + const tie = new _stavetie__WEBPACK_IMPORTED_MODULE_27__.StaveTie({ + first_note: params.from, + last_note: params.to, + first_indices: params.first_indices, + last_indices: params.last_indices, + }, params.text); + if ((_a = params.options) === null || _a === void 0 ? void 0 : _a.direction) + tie.setDirection(params.options.direction); + tie.setContext(this.context); + this.renderQ.push(tie); + return tie; + } + StaveLine(params) { + var _a, _b; + const line = new _staveline__WEBPACK_IMPORTED_MODULE_25__.StaveLine({ + first_note: params.from, + last_note: params.to, + first_indices: params.first_indices, + last_indices: params.last_indices, + }); + if ((_a = params.options) === null || _a === void 0 ? void 0 : _a.text) + line.setText(params.options.text); + if ((_b = params.options) === null || _b === void 0 ? void 0 : _b.font) + line.setFont(params.options.font); + line.setContext(this.context); + this.renderQ.push(line); + return line; + } + VibratoBracket(params) { + const vibratoBracket = new _vibratobracket__WEBPACK_IMPORTED_MODULE_39__.VibratoBracket({ + start: params.from, + stop: params.to, + }); + if (params.options.line) + vibratoBracket.setLine(params.options.line); + if (params.options.harsh) + vibratoBracket.setHarsh(params.options.harsh); + vibratoBracket.setContext(this.context); + this.renderQ.push(vibratoBracket); + return vibratoBracket; + } + TextBracket(params) { + const textBracket = new _textbracket__WEBPACK_IMPORTED_MODULE_32__.TextBracket({ + start: params.from, + stop: params.to, + text: params.text, + superscript: params.options.superscript, + position: params.options.position, + }); + if (params.options.line) + textBracket.setLine(params.options.line); + if (params.options.font) + textBracket.setFont(params.options.font); + textBracket.setContext(this.context); + this.renderQ.push(textBracket); + return textBracket; + } + System(params = {}) { + params.factory = this; + const system = new _system__WEBPACK_IMPORTED_MODULE_29__.System(params).setContext(this.context); + this.systems.push(system); + return system; + } + /** + * Creates EasyScore. Normally the first step after constructing a Factory. For example: + * ``` + * const vf: Factory = new Vex.Flow.Factory({renderer: { elementId: 'boo', width: 1200, height: 600 }}); + * const score: EasyScore = vf.EasyScore(); + * ``` + * @param options.factory optional instance of Factory + * @param options.builder instance of Builder + * @param options.commitHooks function to call after a note element is created + * @param options.throwOnError throw error in case of parsing error + */ + EasyScore(options = {}) { + options.factory = this; + return new _easyscore__WEBPACK_IMPORTED_MODULE_8__.EasyScore(options); + } + PedalMarking(params) { + const p = Object.assign({ notes: [], options: { + style: 'mixed', + } }, params); + const pedal = new _pedalmarking__WEBPACK_IMPORTED_MODULE_20__.PedalMarking(p.notes); + pedal.setType(_pedalmarking__WEBPACK_IMPORTED_MODULE_20__.PedalMarking.typeString[p.options.style]); + pedal.setContext(this.context); + this.renderQ.push(pedal); + return pedal; + } + NoteSubGroup(params) { + const p = Object.assign({ notes: [] }, params); + const group = new _notesubgroup__WEBPACK_IMPORTED_MODULE_19__.NoteSubGroup(p.notes); + group.setContext(this.context); + return group; + } + /** Render the score. */ + draw() { + const ctx = this.context; + this.systems.forEach((s) => s.setContext(ctx).format()); + this.staves.forEach((s) => s.setContext(ctx).draw()); + this.voices.forEach((v) => v.setContext(ctx).draw()); + this.renderQ.forEach((e) => { + if (!e.isRendered()) + e.setContext(ctx).draw(); + }); + this.systems.forEach((s) => s.setContext(ctx).draw()); + this.reset(); + } +} +/** To enable logging for this class. Set `Vex.Flow.Factory.DEBUG` to `true`. */ +Factory.DEBUG = false; +/** Default text font. */ +Factory.TEXT_FONT = Object.assign({}, _element__WEBPACK_IMPORTED_MODULE_9__.Element.TEXT_FONT); + + +/***/ }), + +/***/ "./src/flow.ts": +/*!*********************!*\ + !*** ./src/flow.ts ***! + \*********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Flow": () => (/* binding */ Flow) +/* harmony export */ }); +/* harmony import */ var _accidental__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./accidental */ "./src/accidental.ts"); +/* harmony import */ var _annotation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./annotation */ "./src/annotation.ts"); +/* harmony import */ var _articulation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./articulation */ "./src/articulation.ts"); +/* harmony import */ var _barnote__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./barnote */ "./src/barnote.ts"); +/* harmony import */ var _beam__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./beam */ "./src/beam.ts"); +/* harmony import */ var _bend__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./bend */ "./src/bend.ts"); +/* harmony import */ var _boundingbox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./boundingbox */ "./src/boundingbox.ts"); +/* harmony import */ var _boundingboxcomputation__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./boundingboxcomputation */ "./src/boundingboxcomputation.ts"); +/* harmony import */ var _canvascontext__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./canvascontext */ "./src/canvascontext.ts"); +/* harmony import */ var _chordsymbol__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./chordsymbol */ "./src/chordsymbol.ts"); +/* harmony import */ var _clef__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./clef */ "./src/clef.ts"); +/* harmony import */ var _clefnote__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./clefnote */ "./src/clefnote.ts"); +/* harmony import */ var _crescendo__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./crescendo */ "./src/crescendo.ts"); +/* harmony import */ var _curve__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./curve */ "./src/curve.ts"); +/* harmony import */ var _dot__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./dot */ "./src/dot.ts"); +/* harmony import */ var _easyscore__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./easyscore */ "./src/easyscore.ts"); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _factory__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./factory */ "./src/factory.ts"); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _formatter__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./formatter */ "./src/formatter.ts"); +/* harmony import */ var _fraction__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./fraction */ "./src/fraction.ts"); +/* harmony import */ var _frethandfinger__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./frethandfinger */ "./src/frethandfinger.ts"); +/* harmony import */ var _ghostnote__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./ghostnote */ "./src/ghostnote.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _glyphnote__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./glyphnote */ "./src/glyphnote.ts"); +/* harmony import */ var _gracenote__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./gracenote */ "./src/gracenote.ts"); +/* harmony import */ var _gracenotegroup__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./gracenotegroup */ "./src/gracenotegroup.ts"); +/* harmony import */ var _gracetabnote__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./gracetabnote */ "./src/gracetabnote.ts"); +/* harmony import */ var _keymanager__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./keymanager */ "./src/keymanager.ts"); +/* harmony import */ var _keysignature__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./keysignature */ "./src/keysignature.ts"); +/* harmony import */ var _keysignote__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./keysignote */ "./src/keysignote.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _modifiercontext__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./modifiercontext */ "./src/modifiercontext.ts"); +/* harmony import */ var _multimeasurerest__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./multimeasurerest */ "./src/multimeasurerest.ts"); +/* harmony import */ var _music__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./music */ "./src/music.ts"); +/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./note */ "./src/note.ts"); +/* harmony import */ var _notehead__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./notehead */ "./src/notehead.ts"); +/* harmony import */ var _notesubgroup__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./notesubgroup */ "./src/notesubgroup.ts"); +/* harmony import */ var _ornament__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./ornament */ "./src/ornament.ts"); +/* harmony import */ var _parenthesis__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./parenthesis */ "./src/parenthesis.ts"); +/* harmony import */ var _parser__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./parser */ "./src/parser.ts"); +/* harmony import */ var _pedalmarking__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./pedalmarking */ "./src/pedalmarking.ts"); +/* harmony import */ var _registry__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./registry */ "./src/registry.ts"); +/* harmony import */ var _rendercontext__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./rendercontext */ "./src/rendercontext.ts"); +/* harmony import */ var _renderer__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ./renderer */ "./src/renderer.ts"); +/* harmony import */ var _repeatnote__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ./repeatnote */ "./src/repeatnote.ts"); +/* harmony import */ var _stave__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ./stave */ "./src/stave.ts"); +/* harmony import */ var _stavebarline__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ./stavebarline */ "./src/stavebarline.ts"); +/* harmony import */ var _staveconnector__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ./staveconnector */ "./src/staveconnector.ts"); +/* harmony import */ var _stavehairpin__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ./stavehairpin */ "./src/stavehairpin.ts"); +/* harmony import */ var _staveline__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! ./staveline */ "./src/staveline.ts"); +/* harmony import */ var _stavemodifier__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! ./stavemodifier */ "./src/stavemodifier.ts"); +/* harmony import */ var _stavenote__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! ./stavenote */ "./src/stavenote.ts"); +/* harmony import */ var _staverepetition__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! ./staverepetition */ "./src/staverepetition.ts"); +/* harmony import */ var _stavetempo__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! ./stavetempo */ "./src/stavetempo.ts"); +/* harmony import */ var _stavetext__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! ./stavetext */ "./src/stavetext.ts"); +/* harmony import */ var _stavetie__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! ./stavetie */ "./src/stavetie.ts"); +/* harmony import */ var _stavevolta__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! ./stavevolta */ "./src/stavevolta.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _stringnumber__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! ./stringnumber */ "./src/stringnumber.ts"); +/* harmony import */ var _strokes__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(/*! ./strokes */ "./src/strokes.ts"); +/* harmony import */ var _svgcontext__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(/*! ./svgcontext */ "./src/svgcontext.ts"); +/* harmony import */ var _system__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(/*! ./system */ "./src/system.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _tabnote__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(/*! ./tabnote */ "./src/tabnote.ts"); +/* harmony import */ var _tabslide__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(/*! ./tabslide */ "./src/tabslide.ts"); +/* harmony import */ var _tabstave__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(/*! ./tabstave */ "./src/tabstave.ts"); +/* harmony import */ var _tabtie__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(/*! ./tabtie */ "./src/tabtie.ts"); +/* harmony import */ var _textbracket__WEBPACK_IMPORTED_MODULE_68__ = __webpack_require__(/*! ./textbracket */ "./src/textbracket.ts"); +/* harmony import */ var _textdynamics__WEBPACK_IMPORTED_MODULE_69__ = __webpack_require__(/*! ./textdynamics */ "./src/textdynamics.ts"); +/* harmony import */ var _textformatter__WEBPACK_IMPORTED_MODULE_70__ = __webpack_require__(/*! ./textformatter */ "./src/textformatter.ts"); +/* harmony import */ var _textnote__WEBPACK_IMPORTED_MODULE_71__ = __webpack_require__(/*! ./textnote */ "./src/textnote.ts"); +/* harmony import */ var _tickcontext__WEBPACK_IMPORTED_MODULE_72__ = __webpack_require__(/*! ./tickcontext */ "./src/tickcontext.ts"); +/* harmony import */ var _timesignature__WEBPACK_IMPORTED_MODULE_73__ = __webpack_require__(/*! ./timesignature */ "./src/timesignature.ts"); +/* harmony import */ var _timesignote__WEBPACK_IMPORTED_MODULE_74__ = __webpack_require__(/*! ./timesignote */ "./src/timesignote.ts"); +/* harmony import */ var _tremolo__WEBPACK_IMPORTED_MODULE_75__ = __webpack_require__(/*! ./tremolo */ "./src/tremolo.ts"); +/* harmony import */ var _tuning__WEBPACK_IMPORTED_MODULE_76__ = __webpack_require__(/*! ./tuning */ "./src/tuning.ts"); +/* harmony import */ var _tuplet__WEBPACK_IMPORTED_MODULE_77__ = __webpack_require__(/*! ./tuplet */ "./src/tuplet.ts"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_78__ = __webpack_require__(/*! ./version */ "./src/version.ts"); +/* harmony import */ var _vibrato__WEBPACK_IMPORTED_MODULE_79__ = __webpack_require__(/*! ./vibrato */ "./src/vibrato.ts"); +/* harmony import */ var _vibratobracket__WEBPACK_IMPORTED_MODULE_80__ = __webpack_require__(/*! ./vibratobracket */ "./src/vibratobracket.ts"); +/* harmony import */ var _voice__WEBPACK_IMPORTED_MODULE_81__ = __webpack_require__(/*! ./voice */ "./src/voice.ts"); +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +class Flow { + static get BUILD() { + return { + /** version number. */ + VERSION: _version__WEBPACK_IMPORTED_MODULE_78__.VERSION, + /** git commit ID that this library was built from. */ + ID: _version__WEBPACK_IMPORTED_MODULE_78__.ID, + /** The date when this library was compiled. */ + DATE: _version__WEBPACK_IMPORTED_MODULE_78__.DATE, + }; + } + static get Flow() { + // This (circular reference) provides a handy shortcut for importing VexFlow via `require()`. + // For example: + // const Vex = require('vexflow'); + // const { Flow, Stave, StaveNote, Formatter, Renderer } = Vex.Flow; + return Flow; + } + // ... more to come ... + /** + * Examples: + * ``` + * Vex.Flow.setMusicFont('Petaluma'); + * Vex.Flow.setMusicFont('Bravura', 'Gonville'); + * ``` + * + * **CASE 1**: You are using `vexflow.js`, which includes all music fonts (Bravura, Gonville, Petaluma, Custom). + * In this case, calling this method is optional, since VexFlow already defaults to a music font stack of: + * 'Bravura', 'Gonville', 'Custom'. + * + * **CASE 2**: You are using `vexflow-bravura.js` or `vexflow-petaluma.js` or `vexflow-gonville.js`, + * which includes a single music font. Calling this method is unnecessary. + * + * **CASE 3**: You are using the light weight `vexflow-core.js` to take advantage of lazy loading for fonts. + * In this case, the default music font stack is empty. + * Example: + * ``` + * await Vex.Flow.fetchMusicFont('Petaluma'); + * Vex.Flow.setMusicFont('Petaluma'); + * ... (do VexFlow stuff) ... + * ``` + * See `demos/fonts/` for more examples. + * + * @returns an array of Font objects corresponding to the provided `fontNames`. + */ + static setMusicFont(...fontNames) { + // Convert the array of font names into an array of Font objects. + const fonts = fontNames.map((fontName) => _font__WEBPACK_IMPORTED_MODULE_18__.Font.load(fontName)); + _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.MUSIC_FONT_STACK = fonts; + _glyph__WEBPACK_IMPORTED_MODULE_23__.Glyph.MUSIC_FONT_STACK = fonts.slice(); + _glyph__WEBPACK_IMPORTED_MODULE_23__.Glyph.CURRENT_CACHE_KEY = fontNames.join(','); + return fonts; + } + /** + * Used with vexflow-core which supports dynamic font loading. + */ + // eslint-disable-next-line + static fetchMusicFont(fontName, fontModuleOrPath) { + return __awaiter(this, void 0, void 0, function* () { + // The default implementation does nothing. + // See vexflow-core.ts for the implementation that vexflow-core.js uses. + }); + } + static getMusicFont() { + const fonts = _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.MUSIC_FONT_STACK; + return fonts.map((font) => font.getName()); + } + static get NOTATION_FONT_SCALE() { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.NOTATION_FONT_SCALE; + } + static set NOTATION_FONT_SCALE(value) { + _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.NOTATION_FONT_SCALE = value; + } + static get TABLATURE_FONT_SCALE() { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.TABLATURE_FONT_SCALE; + } + static set TABLATURE_FONT_SCALE(value) { + _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.TABLATURE_FONT_SCALE = value; + } + static get RESOLUTION() { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.RESOLUTION; + } + static set RESOLUTION(value) { + _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.RESOLUTION = value; + } + static get SLASH_NOTEHEAD_WIDTH() { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.SLASH_NOTEHEAD_WIDTH; + } + static set SLASH_NOTEHEAD_WIDTH(value) { + _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.SLASH_NOTEHEAD_WIDTH = value; + } + static get STAVE_LINE_DISTANCE() { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.STAVE_LINE_DISTANCE; + } + static set STAVE_LINE_DISTANCE(value) { + _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.STAVE_LINE_DISTANCE = value; + } + static get STAVE_LINE_THICKNESS() { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.STAVE_LINE_THICKNESS; + } + static set STAVE_LINE_THICKNESS(value) { + _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.STAVE_LINE_THICKNESS = value; + } + static get STEM_HEIGHT() { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.STEM_HEIGHT; + } + static set STEM_HEIGHT(value) { + _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.STEM_HEIGHT = value; + } + static get STEM_WIDTH() { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.STEM_WIDTH; + } + static set STEM_WIDTH(value) { + _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.STEM_WIDTH = value; + } + static get TIME4_4() { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.TIME4_4; + } + static get accidentalMap() { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.accidentalMap; + } + static get unicode() { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.unicode; + } + static keySignature(spec) { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.keySignature(spec); + } + static hasKeySignature(spec) { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.hasKeySignature(spec); + } + static getKeySignatures() { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.getKeySignatures(); + } + static clefProperties(clef) { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.clefProperties(clef); + } + // eslint-disable-next-line + static keyProperties(key, clef, params) { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.keyProperties(key, clef, params); + } + static durationToTicks(duration) { + return _tables__WEBPACK_IMPORTED_MODULE_63__.Tables.durationToTicks(duration); + } +} +Flow.Accidental = _accidental__WEBPACK_IMPORTED_MODULE_0__.Accidental; +Flow.Annotation = _annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation; +Flow.Articulation = _articulation__WEBPACK_IMPORTED_MODULE_2__.Articulation; +Flow.Barline = _stavebarline__WEBPACK_IMPORTED_MODULE_47__.Barline; +Flow.BarNote = _barnote__WEBPACK_IMPORTED_MODULE_3__.BarNote; +Flow.Beam = _beam__WEBPACK_IMPORTED_MODULE_4__.Beam; +Flow.Bend = _bend__WEBPACK_IMPORTED_MODULE_5__.Bend; +Flow.BoundingBox = _boundingbox__WEBPACK_IMPORTED_MODULE_6__.BoundingBox; +Flow.BoundingBoxComputation = _boundingboxcomputation__WEBPACK_IMPORTED_MODULE_7__.BoundingBoxComputation; +Flow.CanvasContext = _canvascontext__WEBPACK_IMPORTED_MODULE_8__.CanvasContext; +Flow.ChordSymbol = _chordsymbol__WEBPACK_IMPORTED_MODULE_9__.ChordSymbol; +Flow.Clef = _clef__WEBPACK_IMPORTED_MODULE_10__.Clef; +Flow.ClefNote = _clefnote__WEBPACK_IMPORTED_MODULE_11__.ClefNote; +Flow.Crescendo = _crescendo__WEBPACK_IMPORTED_MODULE_12__.Crescendo; +Flow.Curve = _curve__WEBPACK_IMPORTED_MODULE_13__.Curve; +Flow.Dot = _dot__WEBPACK_IMPORTED_MODULE_14__.Dot; +Flow.EasyScore = _easyscore__WEBPACK_IMPORTED_MODULE_15__.EasyScore; +Flow.Element = _element__WEBPACK_IMPORTED_MODULE_16__.Element; +Flow.Factory = _factory__WEBPACK_IMPORTED_MODULE_17__.Factory; +Flow.Font = _font__WEBPACK_IMPORTED_MODULE_18__.Font; +Flow.Formatter = _formatter__WEBPACK_IMPORTED_MODULE_19__.Formatter; +Flow.Fraction = _fraction__WEBPACK_IMPORTED_MODULE_20__.Fraction; +Flow.FretHandFinger = _frethandfinger__WEBPACK_IMPORTED_MODULE_21__.FretHandFinger; +Flow.GhostNote = _ghostnote__WEBPACK_IMPORTED_MODULE_22__.GhostNote; +Flow.Glyph = _glyph__WEBPACK_IMPORTED_MODULE_23__.Glyph; +Flow.GlyphNote = _glyphnote__WEBPACK_IMPORTED_MODULE_24__.GlyphNote; +Flow.GraceNote = _gracenote__WEBPACK_IMPORTED_MODULE_25__.GraceNote; +Flow.GraceNoteGroup = _gracenotegroup__WEBPACK_IMPORTED_MODULE_26__.GraceNoteGroup; +Flow.GraceTabNote = _gracetabnote__WEBPACK_IMPORTED_MODULE_27__.GraceTabNote; +Flow.KeyManager = _keymanager__WEBPACK_IMPORTED_MODULE_28__.KeyManager; +Flow.KeySignature = _keysignature__WEBPACK_IMPORTED_MODULE_29__.KeySignature; +Flow.KeySigNote = _keysignote__WEBPACK_IMPORTED_MODULE_30__.KeySigNote; +Flow.Modifier = _modifier__WEBPACK_IMPORTED_MODULE_31__.Modifier; +Flow.ModifierContext = _modifiercontext__WEBPACK_IMPORTED_MODULE_32__.ModifierContext; +Flow.MultiMeasureRest = _multimeasurerest__WEBPACK_IMPORTED_MODULE_33__.MultiMeasureRest; +Flow.Music = _music__WEBPACK_IMPORTED_MODULE_34__.Music; +Flow.Note = _note__WEBPACK_IMPORTED_MODULE_35__.Note; +Flow.NoteHead = _notehead__WEBPACK_IMPORTED_MODULE_36__.NoteHead; +Flow.NoteSubGroup = _notesubgroup__WEBPACK_IMPORTED_MODULE_37__.NoteSubGroup; +Flow.Ornament = _ornament__WEBPACK_IMPORTED_MODULE_38__.Ornament; +Flow.Parenthesis = _parenthesis__WEBPACK_IMPORTED_MODULE_39__.Parenthesis; +Flow.Parser = _parser__WEBPACK_IMPORTED_MODULE_40__.Parser; +Flow.PedalMarking = _pedalmarking__WEBPACK_IMPORTED_MODULE_41__.PedalMarking; +Flow.Registry = _registry__WEBPACK_IMPORTED_MODULE_42__.Registry; +Flow.RenderContext = _rendercontext__WEBPACK_IMPORTED_MODULE_43__.RenderContext; +Flow.Renderer = _renderer__WEBPACK_IMPORTED_MODULE_44__.Renderer; +Flow.RepeatNote = _repeatnote__WEBPACK_IMPORTED_MODULE_45__.RepeatNote; +Flow.Repetition = _staverepetition__WEBPACK_IMPORTED_MODULE_53__.Repetition; +Flow.Stave = _stave__WEBPACK_IMPORTED_MODULE_46__.Stave; +Flow.StaveConnector = _staveconnector__WEBPACK_IMPORTED_MODULE_48__.StaveConnector; +Flow.StaveHairpin = _stavehairpin__WEBPACK_IMPORTED_MODULE_49__.StaveHairpin; +Flow.StaveLine = _staveline__WEBPACK_IMPORTED_MODULE_50__.StaveLine; +Flow.StaveModifier = _stavemodifier__WEBPACK_IMPORTED_MODULE_51__.StaveModifier; +Flow.StaveNote = _stavenote__WEBPACK_IMPORTED_MODULE_52__.StaveNote; +Flow.StaveTempo = _stavetempo__WEBPACK_IMPORTED_MODULE_54__.StaveTempo; +Flow.StaveText = _stavetext__WEBPACK_IMPORTED_MODULE_55__.StaveText; +Flow.StaveTie = _stavetie__WEBPACK_IMPORTED_MODULE_56__.StaveTie; +Flow.Stem = _stem__WEBPACK_IMPORTED_MODULE_58__.Stem; +Flow.StringNumber = _stringnumber__WEBPACK_IMPORTED_MODULE_59__.StringNumber; +Flow.Stroke = _strokes__WEBPACK_IMPORTED_MODULE_60__.Stroke; +Flow.SVGContext = _svgcontext__WEBPACK_IMPORTED_MODULE_61__.SVGContext; +Flow.System = _system__WEBPACK_IMPORTED_MODULE_62__.System; +Flow.TabNote = _tabnote__WEBPACK_IMPORTED_MODULE_64__.TabNote; +Flow.TabSlide = _tabslide__WEBPACK_IMPORTED_MODULE_65__.TabSlide; +Flow.TabStave = _tabstave__WEBPACK_IMPORTED_MODULE_66__.TabStave; +Flow.TabTie = _tabtie__WEBPACK_IMPORTED_MODULE_67__.TabTie; +Flow.TextBracket = _textbracket__WEBPACK_IMPORTED_MODULE_68__.TextBracket; +Flow.TextDynamics = _textdynamics__WEBPACK_IMPORTED_MODULE_69__.TextDynamics; +Flow.TextFormatter = _textformatter__WEBPACK_IMPORTED_MODULE_70__.TextFormatter; +Flow.TextNote = _textnote__WEBPACK_IMPORTED_MODULE_71__.TextNote; +Flow.TickContext = _tickcontext__WEBPACK_IMPORTED_MODULE_72__.TickContext; +Flow.TimeSignature = _timesignature__WEBPACK_IMPORTED_MODULE_73__.TimeSignature; +Flow.TimeSigNote = _timesignote__WEBPACK_IMPORTED_MODULE_74__.TimeSigNote; +Flow.Tremolo = _tremolo__WEBPACK_IMPORTED_MODULE_75__.Tremolo; +Flow.Tuning = _tuning__WEBPACK_IMPORTED_MODULE_76__.Tuning; +Flow.Tuplet = _tuplet__WEBPACK_IMPORTED_MODULE_77__.Tuplet; +Flow.Vibrato = _vibrato__WEBPACK_IMPORTED_MODULE_79__.Vibrato; +Flow.VibratoBracket = _vibratobracket__WEBPACK_IMPORTED_MODULE_80__.VibratoBracket; +Flow.Voice = _voice__WEBPACK_IMPORTED_MODULE_81__.Voice; +Flow.Volta = _stavevolta__WEBPACK_IMPORTED_MODULE_57__.Volta; +// enums need to be exported too! +Flow.BarlineType = _stavebarline__WEBPACK_IMPORTED_MODULE_47__.BarlineType; +Flow.ModifierPosition = _modifier__WEBPACK_IMPORTED_MODULE_31__.ModifierPosition; + + +/***/ }), + +/***/ "./src/font.ts": +/*!*********************!*\ + !*** ./src/font.ts ***! + \*********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "FontWeight": () => (/* binding */ FontWeight), +/* harmony export */ "FontStyle": () => (/* binding */ FontStyle), +/* harmony export */ "Font": () => (/* binding */ Font) +/* harmony export */ }); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; + +var FontWeight; +(function (FontWeight) { + FontWeight["NORMAL"] = "normal"; + FontWeight["BOLD"] = "bold"; +})(FontWeight || (FontWeight = {})); +var FontStyle; +(function (FontStyle) { + FontStyle["NORMAL"] = "normal"; + FontStyle["ITALIC"] = "italic"; +})(FontStyle || (FontStyle = {})); +// Internal element for parsing CSS font shorthand strings. +let fontParser; +const Fonts = {}; +class Font { + /** + * Use `Font.load(fontName)` to get a Font object. + * Do not call this constructor directly. + */ + constructor(fontName) { + this.name = fontName; + } + /** + * @param fontSize a font size to convert. Can be specified as a CSS length string (e.g., '16pt', '1em') + * or as a number (the unit is assumed to be 'pt'). See `Font.scaleToPxFrom` for the supported + * units (e.g., pt, em, %). + * @returns the number of pixels that is equivalent to `fontSize` + */ + static convertSizeToPixelValue(fontSize = Font.SIZE) { + var _a; + if (typeof fontSize === 'number') { + // Assume the numeric fontSize is specified in pt. + return fontSize * Font.scaleToPxFrom.pt; + } + else { + const value = parseFloat(fontSize); + if (isNaN(value)) { + return 0; + } + const unit = fontSize.replace(/[\d.\s]/g, '').toLowerCase(); // Extract the unit by removing all numbers, dots, spaces. + const conversionFactor = (_a = Font.scaleToPxFrom[unit]) !== null && _a !== void 0 ? _a : 1; + return value * conversionFactor; + } + } + /** + * @param fontSize a font size to convert. Can be specified as a CSS length string (e.g., '16pt', '1em') + * or as a number (the unit is assumed to be 'pt'). See `Font.scaleToPxFrom` for the supported + * units (e.g., pt, em, %). + * @returns the number of points that is equivalent to `fontSize` + */ + static convertSizeToPointValue(fontSize = Font.SIZE) { + var _a; + if (typeof fontSize === 'number') { + // Assume the numeric fontSize is specified in pt. + return fontSize; + } + else { + const value = parseFloat(fontSize); + if (isNaN(value)) { + return 0; + } + const unit = fontSize.replace(/[\d.\s]/g, '').toLowerCase(); // Extract the unit by removing all numbers, dots, spaces. + const conversionFactor = ((_a = Font.scaleToPxFrom[unit]) !== null && _a !== void 0 ? _a : 1) / Font.scaleToPxFrom.pt; + return value * conversionFactor; + } + } + /** + * @param f + * @param size + * @param weight + * @param style + * @returns the `size` field will include the units (e.g., '12pt', '16px'). + */ + static validate(f, size, weight, style) { + // If f is a string but all other arguments are undefined, we assume that + // f is CSS font shorthand (e.g., 'italic bold 10pt Arial'). + if (typeof f === 'string' && size === undefined && weight === undefined && style === undefined) { + return Font.fromCSSString(f); + } + let family; + if (typeof f === 'object') { + // f is a FontInfo object, so we extract its fields. + family = f.family; + size = f.size; + weight = f.weight; + style = f.style; + } + else { + // f is a string representing the font family name or undefined. + family = f; + } + family = family !== null && family !== void 0 ? family : Font.SANS_SERIF; + size = size !== null && size !== void 0 ? size : Font.SIZE + 'pt'; + weight = weight !== null && weight !== void 0 ? weight : FontWeight.NORMAL; + style = style !== null && style !== void 0 ? style : FontStyle.NORMAL; + if (weight === '') { + weight = FontWeight.NORMAL; + } + if (style === '') { + style = FontStyle.NORMAL; + } + // If size is a number, we assume the unit is `pt`. + if (typeof size === 'number') { + size = `${size}pt`; + } + // If weight is a number (e.g., 900), turn it into a string representation of that number. + if (typeof weight === 'number') { + weight = weight.toString(); + } + // At this point, `family`, `size`, `weight`, and `style` are all strings. + return { family, size, weight, style }; + } + /** + * @param cssFontShorthand a string formatted as CSS font shorthand (e.g., 'italic bold 15pt Arial'). + */ + static fromCSSString(cssFontShorthand) { + // Let the browser parse this string for us. + // First, create a span element. + // Then, set its style.font and extract it back out. + if (!fontParser) { + fontParser = document.createElement('span'); + } + fontParser.style.font = cssFontShorthand; + const { fontFamily, fontSize, fontWeight, fontStyle } = fontParser.style; + return { family: fontFamily, size: fontSize, weight: fontWeight, style: fontStyle }; + } + /** + * @returns a CSS font shorthand string of the form `italic bold 16pt Arial`. + */ + static toCSSString(fontInfo) { + var _a; + if (!fontInfo) { + return ''; + } + let style; + const st = fontInfo.style; + if (st === FontStyle.NORMAL || st === '' || st === undefined) { + style = ''; // no space! Omit the style section. + } + else { + style = st.trim() + ' '; + } + let weight; + const wt = fontInfo.weight; + if (wt === FontWeight.NORMAL || wt === '' || wt === undefined) { + weight = ''; // no space! Omit the weight section. + } + else if (typeof wt === 'number') { + weight = wt + ' '; + } + else { + weight = wt.trim() + ' '; + } + let size; + const sz = fontInfo.size; + if (sz === undefined) { + size = Font.SIZE + 'pt '; + } + else if (typeof sz === 'number') { + size = sz + 'pt '; + } + else { + // size is already a string. + size = sz.trim() + ' '; + } + const family = (_a = fontInfo.family) !== null && _a !== void 0 ? _a : Font.SANS_SERIF; + return `${style}${weight}${size}${family}`; + } + /** + * @param fontSize a number representing a font size, or a string font size with units. + * @param scaleFactor multiply the size by this factor. + * @returns size * scaleFactor (e.g., 16pt * 3 = 48pt, 8px * 0.5 = 4px, 24 * 2 = 48). + * If the fontSize argument was a number, the return value will be a number. + * If the fontSize argument was a string, the return value will be a string. + */ + static scaleSize(fontSize, scaleFactor) { + if (typeof fontSize === 'number') { + return (fontSize * scaleFactor); + } + else { + const value = parseFloat(fontSize); + const unit = fontSize.replace(/[\d.\s]/g, ''); // Remove all numbers, dots, spaces. + return `${value * scaleFactor}${unit}`; + } + } + /** + * @param weight a string (e.g., 'bold') or a number (e.g., 600 / semi-bold in the OpenType spec). + * @returns true if the font weight indicates bold. + */ + static isBold(weight) { + if (!weight) { + return false; + } + else if (typeof weight === 'number') { + return weight >= 600; + } + else { + // a string can be 'bold' or '700' + const parsedWeight = parseInt(weight, 10); + if (isNaN(parsedWeight)) { + return weight.toLowerCase() === 'bold'; + } + else { + return parsedWeight >= 600; + } + } + } + /** + * @param style + * @returns true if the font style indicates 'italic'. + */ + static isItalic(style) { + if (!style) { + return false; + } + else { + return style.toLowerCase() === FontStyle.ITALIC; + } + } + /** + * @param fontName + * @param woffURL The absolute or relative URL to the woff file. + * @param includeWoff2 If true, we assume that a woff2 file is in + * the same folder as the woff file, and will append a `2` to the url. + */ + // Support distributions of the typescript compiler that do not yet include the FontFace API declarations. + // eslint-disable-next-line + // @ts-ignore + static loadWebFont(fontName, woffURL, includeWoff2 = true) { + return __awaiter(this, void 0, void 0, function* () { + const woff2URL = includeWoff2 ? `url(${woffURL}2) format('woff2'), ` : ''; + const woff1URL = `url(${woffURL}) format('woff')`; + const woffURLs = woff2URL + woff1URL; + // eslint-disable-next-line + // @ts-ignore + const fontFace = new FontFace(fontName, woffURLs); + yield fontFace.load(); + // eslint-disable-next-line + // @ts-ignore + document.fonts.add(fontFace); + return fontFace; + }); + } + /** + * Load the web fonts that are used by ChordSymbol. For example, `flow.html` calls: + * `await Vex.Flow.Font.loadWebFonts();` + * Alternatively, you may load web fonts with a stylesheet link (e.g., from Google Fonts), + * and a @font-face { font-family: ... } rule in your CSS. + * If you do not load either of these fonts, ChordSymbol will fall back to Times or Arial, + * depending on the current music engraving font. + * + * You can customize `Font.WEB_FONT_HOST` and `Font.WEB_FONT_FILES` to load different fonts + * for your app. + */ + static loadWebFonts() { + return __awaiter(this, void 0, void 0, function* () { + const host = Font.WEB_FONT_HOST; + const files = Font.WEB_FONT_FILES; + for (const fontName in files) { + const fontPath = files[fontName]; + Font.loadWebFont(fontName, host + fontPath); + } + }); + } + static loadTextFonts() { + // + } + /** + * @param fontName + * @param data optionally set the Font object's `.data` property. + * This is usually done when setting up a font for the first time. + * @param metrics optionally set the Font object's `.metrics` property. + * This is usually done when setting up a font for the first time. + * @returns a Font object with the given `fontName`. + * Reuse an existing Font object if a matching one is found. + */ + static load(fontName, data, metrics) { + let font = Fonts[fontName]; + if (!font) { + font = new Font(fontName); + Fonts[fontName] = font; + } + if (data) { + font.setData(data); + } + if (metrics) { + font.setMetrics(metrics); + } + return font; + } + getName() { + return this.name; + } + getData() { + return (0,_util__WEBPACK_IMPORTED_MODULE_0__.defined)(this.data, 'FontError', 'Missing font data'); + } + getMetrics() { + return (0,_util__WEBPACK_IMPORTED_MODULE_0__.defined)(this.metrics, 'FontError', 'Missing metrics'); + } + setData(data) { + this.data = data; + } + setMetrics(metrics) { + this.metrics = metrics; + } + hasData() { + return this.data !== undefined; + } + getResolution() { + return this.getData().resolution; + } + getGlyphs() { + return this.getData().glyphs; + } + /** + * Use the provided key to look up a value in this font's metrics file (e.g., bravura_metrics.ts, petaluma_metrics.ts). + * @param key is a string separated by periods (e.g., stave.endPaddingMax, clef.lineCount.'5'.shiftY). + * @param defaultValue is returned if the lookup fails. + * @returns the retrieved value (or `defaultValue` if the lookup fails). + */ + // eslint-disable-next-line + lookupMetric(key, defaultValue) { + const keyParts = key.split('.'); + // Start with the top level font metrics object, and keep looking deeper into the object (via each part of the period-delimited key). + let currObj = this.getMetrics(); + for (let i = 0; i < keyParts.length; i++) { + const keyPart = keyParts[i]; + const value = currObj[keyPart]; + if (value === undefined) { + // If the key lookup fails, we fall back to the defaultValue. + return defaultValue; + } + // The most recent lookup succeeded, so we drill deeper into the object. + currObj = value; + } + // After checking every part of the key (i.e., the loop completed), return the most recently retrieved value. + return currObj; + } + /** For debugging. */ + toString() { + return '[' + this.name + ' Font]'; + } +} +////////////////////////////////////////////////////////////////////////////////////////////////// +// STATIC MEMBERS +/** Default sans-serif font family. */ +Font.SANS_SERIF = 'Arial, sans-serif'; +/** Default serif font family. */ +Font.SERIF = 'Times New Roman, serif'; +/** Default font size in `pt`. */ +Font.SIZE = 10; +// CSS Font Sizes: 36pt == 48px == 3em == 300% == 0.5in +/** Given a length (for units: pt, px, em, %, in, mm, cm) what is the scale factor to convert it to px? */ +Font.scaleToPxFrom = { + pt: 4 / 3, + px: 1, + em: 16, + '%': 4 / 25, + in: 96, + mm: 96 / 25.4, + cm: 96 / 2.54, +}; +/** + * Customize this field to specify a different CDN for delivering web fonts. + * Alternative: https://cdn.jsdelivr.net/npm/vexflow-fonts@1.0.3/ + * Or you can use your own host. + */ +Font.WEB_FONT_HOST = 'https://unpkg.com/vexflow-fonts@1.0.3/'; +/** + * These font files will be loaded from the CDN specified by `Font.WEB_FONT_HOST` when + * `await Font.loadWebFonts()` is called. Customize this field to specify a different + * set of fonts to load. See: `Font.loadWebFonts()`. + */ +Font.WEB_FONT_FILES = { + 'Roboto Slab': 'robotoslab/RobotoSlab-Medium_2.001.woff', + PetalumaScript: 'petaluma/PetalumaScript_1.10_FS.woff', +}; + + +/***/ }), + +/***/ "./src/fonts/bravura_glyphs.ts": +/*!*************************************!*\ + !*** ./src/fonts/bravura_glyphs.ts ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "BravuraFont": () => (/* binding */ BravuraFont) +/* harmony export */ }); +const BravuraFont = { + glyphs: { + bracketTop: { + x_min: 0, + x_max: 469, + y_min: 0, + y_max: 295, + ha: 295, + o: 'm 0 0 l 180 0 b 674 390 410 43 616 150 b 675 405 675 396 675 400 b 664 425 675 416 671 422 b 628 405 651 425 635 415 b 157 179 613 389 432 199 l 12 179 b 0 168 3 179 0 177 z', + }, + bracketBottom: { + x_min: 0, + x_max: 469, + y_min: -295, + y_max: 0, + ha: 295, + o: 'm 0 -168 b 12 -179 0 -177 3 -179 l 157 -179 b 628 -405 432 -199 613 -389 b 664 -425 635 -415 651 -425 b 675 -405 671 -422 675 -416 b 674 -390 675 -400 675 -396 b 180 0 616 -150 410 -43 l 0 0 z', + }, + barlineTick: { + x_min: 0, + x_max: 36, + y_min: 868, + y_max: 1120, + ha: 252, + o: 'm 52 1250 l 52 1613 l 0 1613 l 0 1250 z', + }, + breathMarkTick: { + x_min: 0, + x_max: 500, + y_min: 0, + y_max: 502, + ha: 502, + o: 'm 9 367 b 0 374 6 372 3 374 b 9 334 0 367 0 343 b 179 19 40 312 164 121 b 192 0 179 3 186 0 b 210 19 197 0 207 6 b 698 701 245 197 507 658 b 720 714 714 704 720 711 b 698 723 720 720 711 723 b 197 186 455 714 210 202 b 186 176 194 179 189 176 b 176 186 179 176 176 186 b 9 367 143 266 27 359 z', + }, + segno: { + x_min: 4, + x_max: 550, + y_min: -27, + y_max: 759, + ha: 786, + o: 'm 194 958 b 217 939 203 958 213 955 l 220 929 b 325 805 230 890 252 805 b 425 901 384 805 425 840 b 413 969 425 923 420 946 b 220 1060 390 1035 294 1060 b 6 793 120 1060 6 936 b 29 687 6 759 13 723 b 295 449 75 582 284 454 b 304 438 301 446 304 444 b 295 415 304 432 301 425 b 78 22 285 395 78 22 b 73 3 75 16 73 9 b 114 -39 73 -20 91 -39 b 150 -17 128 -39 143 -30 b 377 395 150 -17 373 386 b 395 402 377 393 389 402 b 704 176 416 397 704 312 b 621 75 704 120 670 82 l 616 73 b 562 138 586 73 562 94 l 562 154 b 485 249 562 209 526 249 b 468 246 480 249 474 248 b 366 153 415 233 366 210 b 540 -12 366 65 455 -12 b 600 -1 559 -12 579 -9 b 792 251 716 37 792 131 b 789 292 792 264 791 278 b 523 588 768 451 540 579 b 498 611 505 598 498 603 b 501 619 498 613 500 616 b 732 1032 508 631 732 1032 b 737 1053 736 1040 737 1045 b 697 1093 737 1076 719 1093 b 661 1073 683 1093 668 1086 b 423 647 661 1073 432 660 b 410 635 419 639 416 635 b 396 639 406 635 402 636 b 128 792 383 644 166 727 b 108 868 120 808 108 838 b 186 958 108 907 125 948 z m 598 671 b 680 589 598 626 635 589 b 762 671 726 589 762 626 b 680 753 762 717 726 753 b 598 671 635 753 598 717 z m 202 380 b 120 462 202 425 166 462 b 37 380 75 462 37 425 b 120 298 37 334 75 298 b 202 380 166 298 202 334 z', + }, + coda: { + x_min: -4, + x_max: 955, + y_min: -158, + y_max: 898, + ha: 1056, + o: 'm 1349 576 l 1178 576 b 729 1083 1164 847 962 1064 l 729 1269 b 694 1293 729 1287 713 1293 b 660 1269 675 1293 660 1287 l 660 1083 b 210 576 426 1064 226 848 l 20 576 b -6 541 0 576 -6 560 b 20 507 -6 523 0 507 l 210 507 b 660 0 226 238 426 19 l 660 -202 b 694 -228 660 -222 675 -228 b 729 -202 713 -228 729 -222 l 729 0 b 1178 507 962 19 1164 238 l 1349 507 b 1375 541 1369 507 1375 523 b 1349 576 1375 560 1369 576 z m 940 576 l 729 576 l 729 1002 b 940 576 930 985 940 809 z m 660 1002 l 660 576 l 455 576 b 660 1002 455 809 455 985 z m 455 507 l 660 507 l 660 69 b 455 507 474 91 456 285 z m 729 69 l 729 507 l 940 507 b 729 69 936 287 909 91 z', + }, + gClef: { + x_min: 0, + x_max: 671, + y_min: -658, + y_max: 1098, + ha: 1756, + o: 'm 541 598 b 550 625 539 615 541 616 b 824 1174 706 770 824 953 b 730 1509 824 1299 789 1423 b 655 1581 708 1541 671 1581 b 562 1512 635 1581 590 1544 b 420 1064 455 1394 420 1214 b 441 828 420 981 431 887 b 428 793 444 811 445 808 b 0 125 220 622 0 416 b 524 -363 0 -125 171 -363 b 624 -354 557 -363 595 -360 b 645 -367 639 -351 642 -350 b 684 -657 662 -464 684 -589 b 455 -896 684 -870 540 -896 b 340 -854 377 -896 340 -873 b 386 -829 340 -844 353 -840 b 482 -694 431 -816 482 -778 b 344 -547 482 -615 432 -547 b 190 -713 248 -547 190 -624 b 464 -948 190 -806 246 -948 b 747 -660 560 -948 747 -904 b 706 -351 747 -577 721 -441 b 724 -327 703 -334 704 -336 b 966 16 870 -269 966 -147 b 619 363 966 200 831 363 b 577 389 582 363 582 363 z m 677 1358 b 763 1240 724 1358 763 1319 b 513 851 763 1080 626 950 b 494 863 503 842 497 844 b 485 995 488 900 485 949 b 677 1358 485 1220 589 1358 z m 520 377 b 498 343 524 350 524 351 b 289 63 372 300 289 186 b 455 -192 289 -66 357 -158 b 494 -200 467 -196 484 -200 b 511 -184 505 -200 511 -193 b 490 -166 511 -174 500 -170 b 386 -12 429 -140 386 -78 b 530 157 386 71 442 132 b 559 145 553 163 556 161 l 631 -284 b 611 -304 634 -300 632 -300 b 530 -311 588 -308 559 -311 b 115 29 278 -311 115 -171 b 249 363 115 114 130 228 b 469 567 336 459 402 513 b 490 562 484 579 487 577 z m 619 148 b 635 168 616 166 618 170 b 848 -66 752 158 848 60 b 713 -271 848 -157 793 -230 b 690 -262 696 -279 693 -279 z', + }, + cClef: { + x_min: 0, + x_max: 699, + y_min: -506, + y_max: 506, + ha: 1012, + o: 'm 331 694 b 301 724 331 714 321 724 l 300 724 b 269 694 279 724 269 714 l 269 -694 b 300 -724 269 -714 279 -724 l 301 -724 b 331 -694 321 -724 331 -714 l 331 -63 b 344 -55 331 -52 338 -53 b 472 -265 382 -65 442 -102 b 500 -301 477 -288 485 -301 b 530 -262 516 -301 523 -287 b 684 -128 549 -199 582 -128 b 804 -409 778 -128 804 -220 b 651 -683 804 -598 770 -683 b 528 -644 631 -683 528 -674 b 567 -622 528 -636 552 -628 b 625 -528 596 -612 625 -583 b 527 -429 625 -465 583 -429 b 416 -547 465 -429 416 -471 b 667 -729 416 -638 495 -729 b 1007 -413 903 -729 1007 -563 b 706 -76 1007 -215 897 -76 b 618 -89 664 -76 636 -84 b 576 -88 603 -94 589 -96 b 524 0 556 -75 524 -29 b 576 88 524 29 556 75 b 618 89 589 96 603 94 b 706 76 636 84 664 76 b 1007 413 897 76 1007 215 b 667 729 1007 563 903 729 b 416 547 495 729 416 638 b 527 429 416 471 465 429 b 625 528 583 429 625 465 b 567 622 625 583 596 612 b 528 644 552 628 528 636 b 651 683 528 674 631 683 b 804 409 770 683 804 598 b 684 128 804 220 778 128 b 530 262 582 128 549 199 b 500 301 523 287 516 301 b 472 265 485 301 477 288 b 344 55 442 102 382 65 b 331 63 338 53 331 52 z m 30 724 b 0 694 10 724 0 714 l 0 -694 b 30 -724 0 -714 10 -724 l 154 -724 b 184 -694 174 -724 184 -714 l 184 694 b 154 724 184 714 174 724 z', + }, + fClef: { + x_min: -5, + x_max: 684, + y_min: -635, + y_max: 262, + ha: 897, + o: 'm 363 377 b 0 56 112 377 0 194 b 177 -158 0 -59 60 -158 b 330 -6 268 -158 330 -95 b 192 144 330 86 262 144 b 120 134 153 144 138 134 b 96 160 101 134 96 145 b 330 323 96 217 183 323 b 549 -53 482 323 549 173 b 14 -871 549 -455 350 -680 b -7 -897 1 -878 -7 -886 b 12 -914 -7 -906 -1 -914 b 36 -907 19 -914 27 -912 b 765 -40 390 -734 765 -478 b 363 377 765 210 612 377 z m 906 259 b 827 180 861 259 827 225 b 906 101 827 135 861 101 b 985 180 950 101 985 135 b 906 259 985 225 950 259 z m 907 -102 b 829 -180 863 -102 829 -135 b 907 -258 829 -225 863 -258 b 985 -180 952 -258 985 -225 b 907 -102 985 -135 952 -102 z', + }, + unpitchedPercussionClef1: { + x_min: 0, + x_max: 382, + y_min: -250, + y_max: 250, + ha: 500, + o: 'm 230 -338 l 230 338 b 210 360 230 350 222 360 l 20 360 b 0 338 9 360 0 350 l 0 -338 b 20 -360 0 -350 9 -360 l 210 -360 b 230 -338 222 -360 230 -350 z m 550 338 b 530 360 550 350 541 360 l 340 360 b 320 338 328 360 320 350 l 320 -338 b 340 -360 320 -350 328 -360 l 530 -360 b 550 -338 541 -360 550 -350 z', + }, + '6stringTabClef': { + x_min: -3, + x_max: 408, + y_min: -748, + y_max: 764, + ha: 1512, + o: 'm 557 1024 l 557 1100 l 26 1100 l 26 1024 l 249 1024 l 249 422 l 336 422 l 336 1024 z m 588 -328 l 350 348 l 238 348 l -4 -328 l 88 -328 l 160 -125 l 420 -125 l 491 -328 z m 397 -52 l 181 -52 l 292 256 z m 544 -883 b 420 -719 544 -802 507 -752 b 514 -572 482 -690 514 -639 b 314 -399 514 -472 442 -399 l 39 -399 l 39 -1077 l 344 -1077 b 544 -883 467 -1077 544 -995 z m 428 -583 b 292 -691 428 -652 389 -691 l 125 -691 l 125 -475 l 292 -475 b 428 -583 389 -475 428 -514 z m 458 -884 b 337 -1001 458 -949 418 -1001 l 125 -1001 l 125 -768 l 337 -768 b 458 -884 418 -768 458 -818 z', + }, + timeSig0: { + x_min: 20, + x_max: 450, + y_min: -250, + y_max: 251, + ha: 501, + o: 'm 648 0 b 338 361 648 200 510 361 b 29 0 167 361 29 200 b 338 -360 29 -199 167 -360 b 648 0 510 -360 648 -199 z m 338 317 b 446 10 397 317 446 180 b 338 -295 446 -158 397 -295 b 230 10 278 -295 230 -158 b 338 317 230 180 278 317 z', + }, + timeSig1: { + x_min: 20, + x_max: 314, + y_min: -250, + y_max: 251, + ha: 501, + o: 'm 35 19 b 29 0 35 19 29 10 b 45 -20 29 -7 33 -16 b 58 -23 50 -22 56 -23 b 78 -10 72 -23 78 -10 b 156 117 78 -10 140 89 b 170 131 161 127 167 131 b 179 111 176 131 179 120 l 179 -261 b 115 -315 179 -294 145 -315 b 91 -337 105 -315 91 -320 b 122 -360 91 -353 104 -360 l 429 -360 b 452 -337 452 -360 452 -337 b 431 -315 452 -337 452 -315 b 384 -265 410 -315 384 -289 l 384 328 b 356 361 384 351 376 360 b 281 356 336 361 300 356 b 206 360 253 356 228 357 b 199 361 203 360 200 361 b 173 334 184 361 179 347 z', + }, + timeSig2: { + x_min: 20, + x_max: 426, + y_min: -257, + y_max: 254, + ha: 511, + o: 'm 606 -131 b 589 -111 606 -114 599 -111 b 570 -127 577 -111 573 -117 l 569 -128 b 513 -192 554 -164 543 -192 b 488 -187 505 -192 498 -190 b 445 -171 469 -180 459 -179 b 289 -137 416 -160 348 -137 b 236 -145 271 -137 252 -140 b 422 -42 268 -94 390 -50 b 613 147 523 -14 613 27 b 330 366 613 300 464 366 b 69 275 229 366 140 357 b 29 170 45 245 29 209 b 42 108 29 150 33 130 b 160 29 63 63 108 29 b 261 156 248 29 261 120 b 161 275 261 242 161 246 b 275 330 164 295 190 330 b 405 192 403 330 405 233 b 193 -102 405 60 297 -39 b 33 -317 114 -153 58 -223 l 32 -321 b 69 -370 32 -340 48 -370 b 203 -282 101 -370 118 -282 b 410 -360 261 -282 282 -360 b 606 -131 472 -360 583 -354 z', + }, + timeSig3: { + x_min: 20, + x_max: 401, + y_min: -251, + y_max: 249, + ha: 500, + o: 'm 307 357 b 301 357 305 357 304 357 l 291 359 b 285 359 289 359 287 359 b 37 200 161 359 37 276 b 154 84 37 153 65 89 l 161 84 b 256 177 225 84 256 130 l 256 189 b 209 248 252 242 216 245 b 180 268 202 251 180 248 l 180 274 b 240 310 183 298 228 310 b 374 199 363 310 374 233 l 374 189 b 199 36 374 82 289 40 b 164 12 184 35 164 27 b 200 -6 164 -6 189 -6 b 379 -137 366 -6 379 -118 b 269 -307 379 -289 301 -307 b 256 -305 264 -307 258 -305 b 216 -282 245 -304 217 -304 l 216 -275 b 249 -180 216 -243 248 -222 b 145 -76 249 -120 207 -76 b 130 -78 140 -76 135 -76 b 60 -115 105 -82 78 -96 b 29 -203 36 -137 29 -171 b 275 -361 32 -315 134 -359 l 288 -361 b 577 -161 431 -361 577 -288 l 577 -151 b 537 -50 575 -109 564 -82 b 503 -20 528 -39 517 -29 l 472 -3 l 425 10 b 410 17 418 12 413 12 b 409 24 409 20 409 22 b 415 37 409 30 410 36 b 459 50 431 42 446 43 b 547 181 517 78 547 115 b 307 357 547 314 367 353 z', + }, + timeSig4: { + x_min: 20, + x_max: 450, + y_min: -250, + y_max: 251, + ha: 501, + o: 'm 521 -107 l 521 202 b 504 226 521 213 520 226 b 475 213 491 226 484 223 l 338 48 b 325 14 333 40 325 32 l 325 -107 l 131 -107 b 481 336 246 -9 477 318 l 482 340 b 461 361 482 353 472 361 b 363 359 448 361 389 359 b 261 361 337 359 272 361 b 228 334 248 361 228 357 b 43 -105 228 156 86 -45 l 35 -117 b 35 -118 35 -117 35 -118 l 33 -120 b 29 -137 30 -127 29 -132 b 58 -161 29 -151 40 -161 l 325 -161 l 325 -252 b 268 -302 325 -291 294 -302 b 235 -330 245 -302 235 -315 b 262 -360 235 -344 240 -360 l 569 -360 b 598 -330 583 -360 598 -350 b 566 -301 598 -310 580 -301 b 521 -246 552 -301 521 -292 l 521 -161 l 626 -161 b 648 -134 641 -161 648 -151 b 626 -107 648 -117 642 -107 z', + }, + timeSig5: { + x_min: 20, + x_max: 383, + y_min: -251, + y_max: 246, + ha: 497, + o: 'm 109 85 b 117 179 109 85 115 166 b 138 197 118 190 125 197 l 144 197 b 285 184 158 194 226 184 b 492 323 485 184 492 300 b 472 353 492 341 488 353 b 295 340 454 353 341 340 b 101 354 249 340 125 351 b 66 330 75 354 68 341 l 50 10 l 50 7 b 79 -14 50 -12 65 -14 b 111 14 94 -14 95 -1 b 209 62 125 29 160 62 b 357 -125 258 62 357 35 b 235 -304 357 -284 272 -304 b 202 -300 223 -304 212 -304 b 184 -279 194 -295 186 -289 b 202 -259 184 -269 194 -264 b 256 -163 235 -239 256 -203 b 144 -50 256 -99 206 -50 b 30 -157 66 -50 35 -107 b 29 -183 29 -166 29 -174 b 284 -361 29 -302 107 -361 b 552 -125 456 -361 552 -255 b 314 112 552 6 445 112 b 122 71 230 112 168 98 b 115 69 120 69 117 69 b 109 79 109 69 109 75 z', + }, + timeSig6: { + x_min: 20, + x_max: 414, + y_min: -249, + y_max: 251, + ha: 500, + o: 'm 439 120 b 554 229 500 120 554 167 b 553 245 554 235 554 239 b 348 361 539 337 426 361 b 85 209 239 360 137 307 b 29 4 53 148 29 72 l 29 -1 b 73 -200 30 -68 42 -143 b 324 -359 132 -307 203 -359 b 513 -307 389 -359 461 -348 b 596 -137 563 -266 596 -202 b 379 72 596 -24 490 72 b 248 22 333 72 285 55 b 239 19 245 19 242 19 b 226 53 230 19 226 30 b 346 327 230 320 315 327 b 393 305 374 327 393 320 b 357 251 393 285 366 268 b 347 209 350 238 347 223 b 369 150 347 187 354 166 b 439 120 379 131 420 120 z m 320 3 b 405 -158 366 3 405 -69 b 320 -320 405 -248 366 -320 b 236 -158 274 -320 236 -248 b 320 3 236 -69 274 3 z', + }, + timeSig7: { + x_min: 20, + x_max: 421, + y_min: -250, + y_max: 249, + ha: 499, + o: 'm 606 294 b 582 351 606 333 606 351 b 552 336 580 351 557 346 b 485 236 541 318 521 236 b 262 359 449 236 382 359 b 137 307 179 359 157 325 b 98 281 117 288 108 282 b 60 315 86 281 68 301 b 43 325 58 321 50 325 b 29 308 36 325 29 321 l 29 71 b 45 48 29 71 30 48 b 66 76 56 48 60 60 b 164 196 81 112 99 196 b 374 88 222 196 291 88 b 446 118 415 88 435 109 b 459 124 451 121 456 124 b 469 111 465 124 468 120 b 272 -112 469 71 359 -10 b 173 -315 217 -176 173 -259 b 200 -360 173 -346 173 -360 b 294 -347 226 -360 258 -347 b 412 -360 330 -347 397 -360 b 435 -307 426 -360 435 -348 b 606 288 435 -66 606 140 z', + }, + timeSig8: { + x_min: 20, + x_max: 416, + y_min: -259, + y_max: 259, + ha: 518, + o: 'm 481 52 b 567 204 533 85 567 132 b 317 373 567 351 356 373 b 36 176 150 373 36 297 b 161 -16 36 76 92 23 b 29 -190 86 -52 29 -99 b 301 -373 29 -315 158 -373 b 599 -117 445 -373 599 -311 b 481 52 599 -30 549 17 z m 406 85 b 168 240 291 125 168 150 b 314 331 168 301 251 331 b 482 207 360 331 482 308 b 406 85 482 150 454 112 z m 295 -325 b 111 -183 199 -325 111 -276 b 225 -48 111 -125 161 -72 b 436 -219 330 -94 436 -124 b 295 -325 436 -276 392 -325 z', + }, + timeSig9: { + x_min: 20, + x_max: 414, + y_min: -249, + y_max: 251, + ha: 500, + o: 'm 186 -117 b 71 -226 125 -117 71 -164 b 72 -242 71 -232 71 -236 b 276 -359 86 -334 199 -359 b 540 -206 386 -357 488 -304 b 596 -1 572 -145 596 -69 l 596 4 b 552 203 595 71 583 145 b 301 361 492 310 422 361 b 112 310 236 361 164 351 b 29 140 62 269 29 204 b 246 -69 29 27 135 -69 b 377 -19 292 -69 340 -52 b 386 -16 380 -16 383 -16 b 399 -50 395 -16 399 -27 b 279 -324 395 -317 310 -324 b 232 -302 251 -324 232 -317 b 268 -248 232 -282 259 -265 b 278 -206 275 -235 278 -220 b 256 -147 278 -184 271 -163 b 186 -117 246 -128 204 -117 z m 305 0 b 220 161 259 0 220 72 b 305 323 220 251 259 323 b 389 161 351 323 389 251 b 305 0 389 72 351 0 z', + }, + timeSigCommon: { + x_min: 5, + x_max: 424, + y_min: -249, + y_max: 251, + ha: 500, + o: 'm 336 361 b 7 -14 131 361 7 180 b 101 -262 7 -108 42 -190 b 321 -359 156 -328 235 -359 b 611 -88 573 -359 611 -130 b 589 -56 611 -56 595 -56 b 567 -82 577 -56 567 -58 b 363 -311 567 -268 409 -311 b 184 40 246 -311 184 -197 b 372 327 184 278 294 327 b 477 278 446 327 477 292 b 451 246 477 265 472 246 b 360 140 393 246 360 184 b 471 32 360 58 431 32 b 580 156 471 32 580 36 b 336 361 580 344 363 361 z', + }, + timeSigCutCommon: { + x_min: 0, + x_max: 418, + y_min: -359, + y_max: 361, + ha: 720, + o: 'm 573 -58 b 559 -82 567 -58 559 -60 b 354 -310 559 -266 400 -310 b 317 -305 340 -310 328 -308 b 302 -284 311 -304 302 -295 l 302 287 b 338 323 302 297 328 321 b 363 324 347 324 356 324 b 468 275 436 324 468 289 b 442 243 468 264 464 243 b 351 137 384 243 351 181 b 462 30 351 56 422 30 b 572 154 462 30 572 35 b 318 357 572 295 441 357 b 302 390 310 359 302 383 l 302 495 b 276 520 302 507 292 520 b 252 495 265 520 252 507 l 252 369 b 235 346 252 359 238 346 l 196 331 b 0 -14 66 275 0 122 b 225 -346 0 -150 86 -310 b 252 -382 235 -350 252 -369 l 252 -492 b 276 -517 252 -505 265 -517 b 302 -492 292 -517 302 -505 l 302 -379 b 318 -359 302 -370 308 -363 b 602 -85 563 -354 602 -130 b 579 -58 600 -58 586 -58 z m 252 -235 b 243 -252 252 -248 248 -252 b 236 -248 240 -252 238 -251 b 177 37 197 -193 177 -96 b 232 259 177 147 200 215 b 236 262 233 262 235 262 b 252 239 243 262 252 251 z', + }, + timeSigPlus: { + x_min: -1, + x_max: 499, + y_min: -250, + y_max: 250, + ha: 500, + o: 'm 432 53 b 413 79 420 53 413 65 l 413 340 b 392 360 413 350 405 360 l 325 360 b 305 340 312 360 305 350 l 305 79 b 284 53 305 66 292 53 l 19 53 b -1 33 9 53 -1 46 l -1 -33 b 19 -55 -1 -46 9 -55 l 284 -55 b 305 -75 298 -55 305 -68 l 305 -340 b 325 -360 305 -350 312 -360 l 392 -360 b 413 -340 405 -360 413 -350 l 413 -78 b 433 -55 413 -63 423 -55 l 698 -55 b 719 -33 708 -55 719 -46 l 719 33 b 698 53 719 46 708 53 z', + }, + timeSigPlusSmall: { + x_min: -1, + x_max: 255, + y_min: -133, + y_max: 123, + ha: 256, + o: 'm 220 20 b 210 33 215 20 210 26 l 210 166 b 200 177 210 171 206 177 l 166 177 b 156 166 160 177 156 171 l 156 33 b 145 20 156 27 150 20 l 10 20 b -1 10 4 20 -1 16 l -1 -24 b 10 -35 -1 -30 4 -35 l 145 -35 b 156 -46 153 -35 156 -42 l 156 -180 b 166 -192 156 -186 160 -192 l 200 -192 b 210 -180 206 -192 210 -186 l 210 -48 b 222 -35 210 -39 216 -35 l 356 -35 b 367 -24 361 -35 367 -30 l 367 10 b 356 20 367 16 361 20 z', + }, + timeSigMinus: { + x_min: 0, + x_max: 448, + y_min: -35, + y_max: 40, + ha: 75, + o: 'm 645 39 b 619 58 645 49 634 58 l 27 58 b 0 39 12 58 0 49 l 0 -32 b 27 -50 0 -42 12 -50 l 619 -50 b 645 -32 634 -50 645 -42 z', + }, + timeSigParensRight: { + x_min: 0, + x_max: 184, + y_min: -489, + y_max: 491, + ha: 980, + o: 'm 0 -696 b 3 -704 0 -698 1 -704 b 7 -703 4 -704 6 -704 b 265 1 187 -530 265 -282 b 12 701 265 289 187 531 b 4 707 12 701 6 707 b 0 696 1 707 0 703 l 0 665 b 4 644 0 665 0 651 b 167 1 112 503 167 315 b 6 -641 167 -311 109 -497 b 0 -658 3 -644 0 -651 z', + }, + timeSigParensRightSmall: { + x_min: 0, + x_max: 110, + y_min: -251, + y_max: 249, + ha: 500, + o: 'm 0 -356 b 3 -361 0 -357 1 -361 b 158 0 112 -272 158 -145 b 4 359 158 147 109 272 b 0 353 3 359 0 357 l 0 338 b 3 327 0 338 0 330 b 91 0 60 246 91 160 b 4 -328 91 -160 62 -249 b 0 -337 3 -330 0 -333 z', + }, + timeSigParensLeft: { + x_min: 0, + x_max: 184, + y_min: -489, + y_max: 491, + ha: 980, + o: 'm 265 -658 b 259 -641 265 -651 262 -644 b 98 1 156 -497 98 -311 b 261 644 98 315 153 503 b 265 665 265 651 265 665 l 265 696 b 261 707 265 703 264 707 b 253 701 259 707 253 701 b 0 1 78 531 0 289 b 258 -703 0 -282 78 -530 b 262 -704 259 -704 261 -704 b 265 -696 264 -704 265 -698 z', + }, + timeSigParensLeftSmall: { + x_min: 0, + x_max: 110, + y_min: -251, + y_max: 249, + ha: 500, + o: 'm 158 -337 b 154 -328 158 -333 156 -330 b 68 0 96 -249 68 -160 b 156 327 68 160 98 246 b 158 338 158 330 158 338 l 158 353 b 154 359 158 357 156 359 b 0 0 49 272 0 147 b 156 -361 0 -145 46 -272 b 158 -356 157 -361 158 -357 z', + }, + noteheadDoubleWhole: { + x_min: 0, + x_max: 599, + y_min: -155, + y_max: 155, + ha: 310, + o: 'm 13 223 b 0 212 4 223 0 217 l 0 -213 b 13 -223 0 -219 4 -223 l 32 -223 b 45 -213 39 -223 45 -219 l 45 212 b 32 223 45 217 39 223 z m 96 223 b 82 212 88 223 82 217 l 82 -213 b 96 -223 82 -219 88 -223 l 114 -223 b 128 -213 121 -223 128 -219 l 128 212 b 114 223 128 217 121 223 z m 747 223 b 733 212 740 223 733 217 l 733 -213 b 747 -223 733 -219 740 -223 l 766 -223 b 780 -213 773 -223 780 -219 l 780 212 b 766 223 780 217 773 223 z m 829 223 b 815 212 824 223 815 217 l 815 -213 b 829 -223 815 -219 824 -223 l 848 -223 b 863 -213 857 -223 863 -219 l 863 212 b 848 223 863 217 857 223 z m 438 180 b 130 1 248 180 130 101 b 423 -180 130 -92 210 -180 b 733 1 657 -180 733 -98 b 438 180 733 104 572 180 z m 469 -145 b 331 -71 409 -145 369 -112 b 284 58 305 -37 284 12 b 400 147 284 131 333 147 b 577 -45 498 147 577 42 b 469 -145 577 -115 533 -145 z', + }, + noteheadWhole: { + x_min: 0, + x_max: 422, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 311 180 b 0 3 120 180 0 101 b 297 -180 0 -94 82 -180 b 608 3 533 -180 608 -98 b 311 180 608 105 445 180 z m 160 91 b 274 148 176 141 229 148 b 452 -45 373 148 452 42 b 386 -141 452 -89 433 -130 b 341 -147 372 -145 356 -147 b 206 -72 289 -147 236 -112 b 156 56 177 -39 156 10 b 160 91 156 68 157 79 z', + }, + noteheadHalf: { + x_min: 0, + x_max: 295, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 140 -180 b 425 60 377 -180 425 13 b 282 180 425 134 366 180 b 0 -60 68 180 0 14 b 140 -180 0 -137 60 -180 z m 108 -125 b 50 -92 78 -125 60 -109 b 42 -63 46 -84 42 -73 b 318 121 42 7 251 121 b 372 91 346 121 361 108 b 380 63 376 82 380 73 b 108 -125 380 1 177 -125 z', + }, + noteheadBlack: { + x_min: 0, + x_max: 295, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 140 -180 b 425 60 268 -180 425 -62 b 285 180 425 134 367 180 b 0 -60 127 180 0 63 b 140 -180 0 -135 62 -180 z', + }, + noteheadXWhole: { + x_min: 0, + x_max: 377, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 272 -95 l 364 -171 b 384 -180 370 -177 377 -180 l 511 -180 b 543 -148 528 -180 543 -164 b 531 -124 543 -140 539 -131 l 412 0 l 531 124 b 541 148 539 131 541 140 b 513 180 541 164 528 180 l 384 180 b 364 171 377 180 370 177 l 272 94 l 179 171 b 158 180 173 177 166 180 l 30 180 b 0 148 16 180 0 164 b 12 124 0 140 4 131 l 132 0 l 12 -124 b 1 -148 4 -131 1 -140 b 32 -180 1 -164 14 -180 l 158 -180 b 179 -171 166 -180 173 -177 z m 386 -141 l 272 -45 l 157 -141 l 88 -141 l 245 0 l 88 141 l 157 141 l 272 45 l 386 141 l 456 141 l 300 0 l 456 -141 z', + }, + noteheadXHalf: { + x_min: 0, + x_max: 334, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 295 180 b 271 170 287 180 278 177 l 209 98 l 115 171 b 95 180 109 177 104 180 l 36 180 b 4 148 19 180 4 164 b 14 124 4 140 7 132 l 140 22 l 7 -127 b 0 -148 3 -131 0 -138 b 32 -180 0 -166 14 -180 l 184 -180 b 209 -170 193 -180 203 -177 l 271 -99 l 363 -171 b 384 -180 370 -176 377 -180 l 445 -180 b 478 -147 461 -180 478 -163 b 465 -125 478 -138 474 -131 l 341 -22 l 474 127 b 481 148 480 131 481 138 b 448 180 481 166 468 180 z m 36 148 l 95 148 l 233 33 l 334 148 l 410 148 l 274 -6 l 445 -148 l 384 -148 l 248 -35 l 147 -148 l 71 -148 l 206 4 z', + }, + noteheadXBlack: { + x_min: 0, + x_max: 290, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 410 -143 l 239 0 l 410 144 b 418 160 415 147 418 154 b 399 180 418 171 408 180 b 389 177 396 180 392 179 l 207 26 l 29 177 b 17 180 26 179 22 180 b 0 161 7 180 0 170 b 7 144 0 156 3 148 l 179 0 l 7 -143 b 0 -158 1 -147 0 -153 b 19 -180 0 -170 7 -180 b 29 -176 23 -180 26 -179 l 207 -24 l 389 -176 b 399 -180 392 -179 396 -180 b 418 -160 410 -180 418 -168 b 410 -143 418 -153 415 -147 z', + }, + noteheadCircleX: { + x_min: 0, + x_max: 249, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 179 180 b 0 0 81 180 0 99 b 179 -180 0 -99 81 -180 b 359 0 278 -180 359 -99 b 179 180 359 99 278 180 z m 261 112 l 180 30 l 98 112 b 179 138 121 128 148 138 b 261 112 210 138 238 128 z m 317 0 b 292 -82 317 -30 308 -59 l 209 1 l 291 84 b 317 0 307 60 317 30 z m 40 0 b 69 84 40 32 50 60 l 151 1 l 68 -84 b 40 0 49 -60 40 -30 z m 95 -111 l 180 -27 l 262 -111 b 179 -138 239 -128 210 -138 b 95 -111 148 -138 120 -128 z', + }, + noteheadTriangleUpWhole: { + x_min: 0, + x_max: 319, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 445 -180 b 459 -166 454 -180 459 -173 b 458 -158 459 -163 458 -160 l 239 173 b 228 180 238 177 233 180 b 216 173 225 180 219 177 l 1 -158 b 0 -166 1 -160 0 -163 b 14 -180 0 -173 6 -180 z m 170 -137 b 145 -96 157 -137 145 -109 b 228 108 145 -17 197 56 b 310 -98 259 55 310 -17 b 288 -137 310 -111 301 -137 z', + }, + noteheadTriangleUpHalf: { + x_min: 0, + x_max: 285, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 215 180 b 202 173 210 180 204 177 l 3 -157 b 0 -166 1 -160 0 -163 b 14 -180 0 -173 7 -180 l 396 -180 b 410 -166 406 -180 410 -173 b 409 -158 410 -163 410 -161 l 228 173 b 215 180 226 174 220 180 z m 246 -138 l 115 -138 l 232 76 l 297 -37 z', + }, + noteheadTriangleUpBlack: { + x_min: 0, + x_max: 293, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 422 -180 l 207 180 l 0 -180 z', + }, + noteheadDiamondWhole: { + x_min: 0, + x_max: 270, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 386 -23 b 389 -16 387 -20 389 -19 b 383 -7 389 -13 386 -9 l 130 179 b 122 180 128 180 125 180 b 115 177 120 180 117 180 l 3 23 b 0 17 1 20 0 19 b 4 7 0 16 3 10 l 258 -179 b 264 -180 261 -179 262 -180 b 272 -176 268 -180 271 -179 z m 66 40 b 62 48 65 42 62 45 l 109 111 b 112 112 109 112 111 112 b 118 111 115 112 117 111 l 320 -37 b 324 -46 323 -39 324 -42 b 275 -111 278 -111 276 -111 b 268 -108 272 -111 271 -109 z', + }, + noteheadDiamondHalf: { + x_min: 0, + x_max: 251, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 359 -7 b 361 0 360 -6 361 -3 b 359 7 361 3 360 4 l 189 177 b 180 180 186 179 183 180 b 174 177 179 180 176 179 l 4 7 b 0 0 1 4 0 3 b 4 -7 0 -3 1 -6 l 174 -177 b 180 -180 176 -180 179 -180 b 189 -177 183 -180 186 -180 z m 266 26 b 138 -71 266 -12 176 -71 b 96 -50 121 -71 108 -63 b 88 -24 89 -43 88 -32 b 215 73 88 13 177 73 b 266 26 238 73 266 50 z', + }, + noteheadDiamondBlack: { + x_min: 0, + x_max: 250, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 357 -6 b 360 1 359 -4 360 -1 b 357 9 360 4 359 7 l 189 177 b 180 180 187 179 184 180 b 171 177 177 180 173 179 l 3 9 b 0 1 0 6 0 4 b 4 -7 0 -1 1 -4 l 173 -177 b 180 -180 176 -180 177 -180 b 187 -177 181 -180 184 -180 z', + }, + noteheadSquareWhite: { + x_min: 0, + x_max: 313, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 451 -180 l 451 180 l 0 180 l 0 -180 z m 40 -138 l 40 140 l 410 140 l 410 -138 z', + }, + noteheadSquareBlack: { + x_min: 0, + x_max: 313, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 451 -180 l 451 180 l 0 180 l 0 -180 z', + }, + noteheadParenthesis: { + x_min: -73, + x_max: 368, + y_min: -180, + y_max: 182, + ha: 362, + o: 'm 52 -249 b -30 -144 3 -212 -14 -190 b -52 4 -45 -102 -52 -56 b 52 252 -52 118 -36 179 l 46 262 b -105 3 -49 197 -105 124 b 45 -259 -105 -109 -48 -200 z m 382 -259 b 530 3 474 -202 530 -108 b 379 262 530 122 474 200 l 373 252 b 478 4 462 180 478 118 b 456 -144 478 -56 471 -102 b 373 -249 439 -190 422 -212 z', + }, + noteheadParenthesisRight: { + x_min: -36, + x_max: 73, + y_min: -181, + y_max: 181, + ha: 362, + o: 'm -43 -261 b 105 1 49 -203 105 -109 b -46 261 105 121 49 199 l -52 251 b 53 3 37 179 53 117 b 32 -145 53 -58 46 -104 b -52 -251 14 -192 -3 -213 z', + }, + noteheadParenthesisLeft: { + x_min: 0, + x_max: 109, + y_min: -181, + y_max: 181, + ha: 362, + o: 'm 157 -251 b 75 -145 108 -213 91 -192 b 53 3 60 -104 53 -58 b 157 251 53 117 69 177 l 151 261 b 0 1 56 196 0 122 b 150 -261 0 -111 58 -202 z', + }, + augmentationDot: { + x_min: 0, + x_max: 100, + y_min: -50, + y_max: 50, + ha: 100, + o: 'm 144 0 b 72 72 144 40 112 72 b 0 0 32 72 0 40 b 72 -72 0 -40 32 -72 b 144 0 112 -72 144 -40 z', + }, + tremolo1: { + x_min: -150, + x_max: 150, + y_min: -93, + y_max: 94, + ha: 187, + o: 'm 216 -45 l 216 135 l -216 46 l -216 -134 z', + }, + flag8thUp: { + x_min: 0, + x_max: 264, + y_min: -810.1921176545985, + y_max: 9, + ha: 819.1921176545985, + o: 'm 343 -1138 b 380 -888 343 -1138 380 -1001 b 215 -395 380 -708 305 -539 b 58 -19 141 -281 81 -157 b 27 13 53 4 42 13 b 0 -9 12 13 0 9 l 0 -353 b 284 -688 95 -370 232 -566 b 318 -904 305 -737 318 -819 b 284 -1102 318 -969 308 -1037 b 279 -1123 281 -1110 279 -1117 b 302 -1165 279 -1146 294 -1159 b 343 -1138 311 -1171 336 -1162 z', + }, + flag8thDown: { + x_min: 0, + x_max: 306, + y_min: -14, + y_max: 808, + ha: 822, + o: 'm 346 1094 b 376 897 366 1034 376 962 b 318 642 376 812 340 691 b 0 340 265 521 193 405 l 0 1 b 23 -20 0 -13 12 -20 b 58 12 36 -20 55 -12 b 262 387 82 148 189 274 b 441 881 353 530 441 701 b 400 1142 441 994 412 1096 b 377 1164 396 1158 387 1164 b 346 1094 356 1164 331 1136 z', + }, + flag16thUp: { + x_min: 0, + x_max: 279, + y_min: -813, + y_max: 2, + ha: 815, + o: 'm 392 -1146 b 402 -988 397 -1139 402 -1057 l 402 -956 b 360 -783 402 -896 386 -837 b 359 -770 360 -779 359 -776 b 360 -760 359 -768 359 -765 b 396 -577 364 -752 396 -665 b 392 -526 396 -559 395 -543 b 236 -275 377 -428 340 -387 b 53 -16 158 -192 78 -168 b 24 3 50 0 33 3 b 0 -12 16 3 0 -1 l 0 -570 l 7 -570 b 298 -778 96 -573 199 -576 b 344 -992 331 -847 344 -917 b 333 -1120 344 -1034 340 -1077 b 331 -1133 331 -1126 331 -1129 b 363 -1171 331 -1152 343 -1171 b 392 -1146 373 -1171 383 -1165 z m 301 -661 b 223 -562 278 -625 253 -596 b 59 -331 156 -484 89 -449 b 58 -327 58 -330 58 -328 b 78 -312 58 -321 66 -312 l 89 -312 b 302 -464 177 -312 255 -393 b 341 -592 328 -501 341 -546 b 340 -621 341 -602 341 -611 b 330 -658 337 -632 337 -647 b 311 -667 328 -662 318 -667 b 301 -661 307 -667 304 -665 z', + }, + flag16thDown: { + x_min: 0, + x_max: 290.8951581511223, + y_min: -9, + y_max: 812.0064, + ha: 821.0064, + o: 'm 346 1132 b 312 768 367 1011 367 880 b 7 559 213 566 96 562 l 0 559 l 0 1 b 24 -13 0 -6 10 -13 b 53 6 35 -13 50 -10 b 406 516 88 228 372 289 b 410 567 409 531 410 549 b 374 750 410 655 379 742 b 373 760 373 753 373 756 b 374 773 373 766 374 769 b 405 1138 426 881 428 1022 b 370 1169 397 1171 387 1169 b 346 1132 353 1168 341 1156 z m 325 657 b 344 647 333 657 343 652 b 354 611 351 636 351 622 b 356 582 356 600 356 590 b 317 454 356 534 343 491 b 89 302 269 383 177 302 l 78 302 b 58 317 66 302 58 310 b 59 321 58 318 58 320 b 238 552 89 439 170 472 b 315 651 268 585 292 613 b 325 657 318 655 321 657 z', + }, + flag32ndUp: { + x_min: 0, + x_max: 261, + y_min: -812, + y_max: 149, + ha: 961, + o: 'm 374 -969 b 337 -806 372 -913 359 -858 b 336 -796 336 -804 336 -801 b 337 -788 336 -793 336 -791 b 370 -616 340 -778 370 -698 b 340 -482 370 -570 360 -524 b 369 -330 353 -445 369 -386 b 366 -289 369 -315 369 -302 b 220 -58 350 -202 317 -163 b 46 187 148 20 71 43 b 20 215 45 200 35 215 b 0 197 12 215 0 207 l 0 -609 l 7 -609 b 278 -802 91 -612 186 -615 b 323 -999 310 -865 323 -930 b 311 -1122 323 -1040 318 -1080 b 310 -1132 311 -1126 310 -1129 b 328 -1166 310 -1149 318 -1162 b 337 -1169 331 -1168 334 -1169 b 366 -1146 346 -1169 356 -1162 b 376 -1009 370 -1138 376 -1071 b 374 -969 376 -995 374 -982 z m 300 -261 b 321 -330 315 -289 321 -311 b 317 -360 321 -341 318 -350 b 300 -423 314 -374 307 -399 b 220 -334 279 -397 253 -370 b 56 -92 150 -256 79 -232 b 300 -261 135 -92 220 -127 z m 315 -657 b 308 -690 312 -668 312 -680 b 292 -698 307 -694 300 -698 b 282 -693 288 -698 284 -697 b 216 -608 261 -661 240 -636 l 209 -600 b 56 -390 147 -527 88 -495 b 73 -367 53 -380 60 -367 b 318 -622 189 -367 318 -505 b 315 -657 318 -634 317 -645 z', + }, + flag32ndDown: { + x_min: 0, + x_max: 273, + y_min: -172, + y_max: 812, + ha: 984, + o: 'm 393 973 b 333 1169 393 1002 383 1169 b 324 1168 330 1169 327 1169 b 304 1130 314 1164 304 1149 b 305 1120 304 1128 305 1125 b 334 962 317 1056 334 1011 b 289 821 334 922 323 880 b 0 619 180 625 88 622 l 0 -229 b 20 -248 0 -242 9 -248 b 48 -219 35 -248 46 -232 b 229 36 72 -69 154 -46 b 380 278 330 145 364 186 b 383 320 383 291 383 305 b 351 484 383 382 364 445 b 384 629 374 526 384 580 b 356 780 384 704 361 766 b 356 783 356 782 356 783 l 351 791 b 356 804 351 796 353 799 l 361 814 b 393 958 380 850 387 865 z m 56 386 b 217 609 86 501 153 533 b 292 706 246 642 269 670 b 304 711 295 710 300 711 b 321 703 311 711 320 707 b 328 670 325 693 325 681 b 331 634 330 658 331 645 b 82 367 331 516 199 367 l 75 367 b 56 386 62 367 56 379 z m 330 350 b 334 320 331 340 334 331 b 311 248 334 301 328 278 b 59 72 229 109 141 72 b 56 76 56 73 56 75 b 229 331 81 226 154 249 b 310 423 264 369 289 397 b 330 350 318 396 325 366 z', + }, + flag64thUp: { + x_min: 0, + x_max: 261, + y_min: -812, + y_max: 347, + ha: 1159, + o: 'm 374 -969 b 337 -806 372 -913 359 -858 b 336 -796 336 -804 336 -801 b 337 -788 336 -793 336 -791 b 370 -616 340 -778 370 -698 b 340 -482 370 -570 360 -524 b 369 -330 353 -445 369 -386 b 337 -203 369 -287 359 -242 b 369 -43 350 -167 369 -104 b 366 -4 369 -30 367 -17 b 220 228 350 84 317 122 b 46 472 148 305 71 328 b 20 500 45 485 32 500 b 0 482 10 500 0 492 l 0 -609 l 7 -609 b 278 -802 91 -612 186 -615 b 323 -999 310 -865 323 -930 b 311 -1122 323 -1040 318 -1080 b 310 -1132 311 -1126 310 -1129 b 328 -1166 310 -1149 318 -1162 b 337 -1169 331 -1168 334 -1169 b 366 -1146 346 -1169 356 -1162 b 376 -1009 370 -1138 376 -1071 b 374 -969 376 -995 374 -982 z m 300 24 b 321 -45 315 -4 321 -26 b 317 -75 321 -56 318 -65 l 298 -145 b 220 -58 278 -121 253 -94 b 58 187 148 20 82 43 b 56 193 58 189 58 192 b 300 24 138 193 220 157 z m 300 -261 b 321 -330 315 -289 321 -311 b 317 -360 321 -341 318 -350 b 300 -423 314 -374 307 -399 b 220 -334 279 -397 253 -370 b 56 -92 150 -256 79 -232 b 300 -261 135 -92 220 -127 z m 315 -657 b 308 -690 312 -668 312 -680 b 292 -698 307 -694 300 -698 b 282 -693 288 -698 284 -697 b 216 -608 261 -661 240 -636 l 209 -600 b 55 -386 147 -527 84 -497 b 73 -367 52 -376 63 -367 b 318 -622 189 -367 318 -505 b 315 -657 318 -634 317 -645 z', + }, + flag64thDown: { + x_min: 0, + x_max: 273, + y_min: -376, + y_max: 812, + ha: 1188, + o: 'm 393 973 b 333 1169 393 1002 383 1169 b 324 1168 330 1169 327 1169 b 304 1130 314 1164 304 1149 b 305 1120 304 1128 305 1125 b 334 962 317 1056 334 1011 b 289 821 334 922 323 880 b 0 619 180 625 88 622 l 0 -523 b 20 -541 0 -534 9 -541 b 48 -513 35 -541 46 -526 b 229 -258 72 -363 154 -340 b 380 -16 330 -148 364 -108 b 384 27 383 -1 384 13 b 351 189 384 88 366 151 b 380 278 366 216 374 243 b 383 320 383 291 383 305 b 351 484 383 382 364 445 b 384 629 374 526 384 580 b 356 780 384 704 361 766 b 356 783 356 782 356 783 l 351 791 b 356 804 351 796 353 799 l 361 814 b 393 958 380 850 387 865 z m 56 386 b 217 609 86 501 153 533 b 292 706 246 642 269 670 b 304 711 295 710 300 711 b 321 703 311 711 320 707 b 328 670 325 693 325 681 b 331 634 330 658 331 645 b 82 367 331 516 199 367 l 75 367 b 56 386 62 367 56 379 z m 330 350 b 334 320 331 340 334 331 b 311 248 334 301 328 278 b 59 72 229 109 141 72 b 56 76 56 73 56 75 b 229 331 81 226 154 249 b 310 423 264 369 289 397 b 330 350 318 396 325 366 z m 330 56 b 334 26 331 46 334 37 b 311 -46 334 7 328 -16 b 56 -222 229 -184 137 -222 b 229 36 75 -86 145 -55 b 311 128 264 73 289 102 z', + }, + flag128thUp: { + x_min: 0, + x_max: 261, + y_min: -812, + y_max: 533, + ha: 1345, + o: 'm 374 -969 b 337 -806 372 -913 359 -858 b 336 -796 336 -804 336 -801 b 337 -788 336 -793 336 -791 b 370 -616 340 -778 370 -698 b 340 -482 370 -570 360 -524 b 369 -330 353 -445 369 -386 b 337 -203 369 -287 359 -242 b 369 -43 350 -167 369 -104 b 366 -4 369 -30 367 -17 b 341 75 360 26 353 50 b 369 222 354 111 369 167 b 366 264 369 236 369 251 b 220 495 350 351 317 390 b 46 740 148 573 71 596 b 22 768 45 753 35 768 b 0 750 10 768 0 760 l 0 -609 l 7 -609 b 278 -802 91 -612 186 -615 b 323 -999 310 -865 323 -930 b 311 -1122 323 -1040 318 -1080 b 310 -1132 311 -1126 310 -1129 b 328 -1166 310 -1149 318 -1162 b 337 -1169 331 -1168 334 -1169 b 366 -1146 346 -1169 356 -1162 b 376 -1009 370 -1138 376 -1071 b 374 -969 376 -995 374 -982 z m 300 292 b 321 223 315 264 321 242 b 317 193 321 212 318 203 b 301 135 314 180 308 158 b 220 228 281 161 255 190 b 55 461 151 304 79 327 b 300 292 134 461 220 426 z m 300 24 b 321 -45 315 -4 321 -26 b 317 -75 321 -56 318 -65 l 298 -145 b 220 -58 278 -121 253 -94 b 56 187 148 20 81 43 b 55 193 56 189 56 192 b 300 24 137 193 220 157 z m 300 -261 b 321 -330 315 -289 321 -311 b 317 -360 321 -341 318 -350 b 300 -423 314 -374 307 -399 b 220 -334 279 -397 253 -370 b 56 -92 150 -256 79 -232 b 300 -261 135 -92 220 -127 z m 315 -657 b 308 -690 312 -668 312 -680 b 292 -698 307 -694 300 -698 b 282 -693 288 -698 284 -697 b 216 -608 261 -661 240 -636 l 209 -600 b 55 -386 147 -527 84 -497 b 73 -367 53 -376 62 -367 b 318 -622 189 -367 318 -505 b 315 -657 318 -634 317 -645 z', + }, + flag128thDown: { + x_min: 0, + x_max: 273, + y_min: -580, + y_max: 812, + ha: 1392, + o: 'm 393 973 b 333 1169 393 1002 383 1169 b 324 1168 330 1169 327 1169 b 304 1130 314 1164 304 1149 b 305 1120 304 1128 305 1125 b 334 962 317 1056 334 1011 b 289 821 334 922 323 880 b 0 619 180 625 88 622 l 0 -816 b 20 -835 0 -828 7 -835 b 48 -806 33 -835 46 -819 b 229 -552 72 -657 154 -634 b 380 -310 330 -442 364 -402 b 384 -266 383 -295 384 -281 b 351 -105 384 -206 366 -143 b 384 27 372 -66 384 -16 b 351 189 384 88 366 151 b 380 278 366 216 374 243 b 383 320 383 291 383 305 b 351 484 383 382 364 445 b 384 629 374 526 384 580 b 356 780 384 704 361 766 b 356 783 356 782 356 783 l 351 791 b 356 804 351 796 353 799 l 361 814 b 393 958 380 850 387 865 z m 56 386 b 217 609 86 501 153 533 b 292 706 246 642 269 670 b 304 711 295 710 300 711 b 321 703 311 711 320 707 b 328 670 325 693 325 681 b 331 634 330 658 331 645 b 82 367 331 516 199 367 l 75 367 b 56 386 62 367 56 379 z m 330 350 b 334 320 331 340 334 331 b 311 248 334 301 328 278 b 59 72 229 109 141 72 b 56 76 56 73 56 75 b 229 331 81 226 154 249 b 310 423 264 369 289 397 b 330 350 318 396 325 366 z m 330 56 b 334 26 331 46 334 37 b 311 -46 334 7 328 -16 b 56 -222 229 -184 137 -222 b 229 36 75 -86 145 -55 b 311 128 264 73 289 102 z m 330 -238 b 334 -268 331 -248 334 -256 b 311 -340 334 -287 328 -310 b 56 -516 229 -478 137 -516 b 229 -258 75 -380 145 -348 b 311 -166 264 -220 289 -192 z', + }, + accidentalFlat: { + x_min: 0, + x_max: 226, + y_min: -175, + y_max: 439, + ha: 614, + o: 'm 17 -245 b 30 -252 22 -251 26 -252 b 39 -249 35 -252 39 -249 b 153 -161 82 -225 117 -186 b 325 82 281 -72 325 16 b 196 220 325 164 262 216 b 117 196 171 220 137 209 b 85 176 108 189 92 176 b 78 177 82 176 81 176 b 62 202 68 181 62 192 b 72 608 63 233 72 579 b 45 632 72 624 59 632 b 0 592 24 632 1 618 b 17 -245 0 592 6 -230 z m 68 -117 b 63 27 68 -117 63 -30 b 66 73 63 50 65 68 b 167 144 76 102 134 144 b 226 60 209 144 226 96 b 98 -134 226 -17 160 -95 b 84 -138 92 -137 88 -138 b 68 -117 71 -138 68 -124 z', + }, + accidentalNatural: { + x_min: 0, + x_max: 168, + y_min: -335, + y_max: 341, + ha: 676, + o: 'm 203 261 b 197 259 200 261 199 259 b 68 226 197 259 105 226 b 53 233 59 226 53 228 l 53 474 b 36 491 53 484 45 491 l 17 491 b 0 474 7 491 0 484 l 0 -268 b 13 -281 0 -276 4 -281 l 16 -279 b 22 -278 17 -279 20 -279 b 164 -235 42 -269 122 -235 b 189 -251 179 -235 189 -239 l 189 -465 b 206 -482 189 -475 196 -482 l 225 -482 b 242 -465 233 -482 242 -475 l 242 258 b 230 269 242 265 236 269 b 225 268 229 269 226 269 z m 53 56 b 176 114 53 76 141 114 b 189 107 184 114 189 112 l 189 -42 b 71 -101 189 -68 107 -101 b 53 -92 60 -101 53 -98 z', + }, + accidentalSharp: { + x_min: 0, + x_max: 249, + y_min: -348, + y_max: 350, + ha: 698, + o: 'm 341 170 b 359 194 351 174 359 186 l 359 297 b 348 308 359 304 354 308 b 341 307 346 308 344 308 b 305 294 341 307 312 295 b 285 312 295 294 285 301 l 285 488 b 265 504 285 497 276 504 b 242 488 251 504 242 497 l 242 301 b 223 259 240 287 236 268 b 132 223 206 249 157 229 b 115 252 120 223 115 240 l 115 425 b 95 441 115 433 105 441 b 72 425 81 441 72 433 l 72 230 b 55 192 72 210 63 196 b 17 176 46 187 17 176 b 0 153 7 173 0 161 l 0 50 b 13 37 0 42 4 37 l 16 39 b 50 53 17 39 39 48 l 52 55 b 72 29 63 55 72 40 l 72 -114 b 56 -147 72 -130 65 -143 b 17 -163 48 -150 17 -163 b 0 -186 7 -166 0 -177 l 0 -288 b 13 -301 0 -297 4 -301 l 16 -300 b 50 -287 17 -300 37 -291 b 55 -285 52 -285 53 -285 b 72 -308 65 -285 72 -301 l 72 -485 b 91 -501 72 -494 81 -501 b 115 -485 105 -501 115 -494 l 115 -285 b 130 -253 115 -266 122 -256 l 217 -217 b 219 -217 217 -217 219 -217 l 222 -216 b 242 -242 235 -216 242 -233 l 242 -422 b 261 -438 242 -431 251 -438 b 285 -422 276 -438 285 -431 l 285 -217 b 301 -184 285 -206 291 -189 b 341 -168 311 -180 341 -168 b 359 -144 351 -164 359 -153 l 359 -42 b 348 -30 359 -35 354 -30 b 341 -32 346 -30 344 -30 l 304 -46 b 285 -20 295 -46 285 -37 l 285 114 b 304 156 285 124 292 151 z m 242 -65 b 132 -122 233 -94 166 -122 b 115 -115 124 -122 117 -120 b 111 -43 112 -109 111 -78 b 115 63 111 1 112 52 b 220 118 118 88 184 118 b 242 109 230 118 239 115 b 248 27 245 102 248 66 b 242 -65 248 -12 245 -52 z', + }, + accidentalDoubleSharp: { + x_min: 0, + x_max: 247, + y_min: -125, + y_max: 127, + ha: 252, + o: 'm 274 -46 b 206 1 258 -37 206 -9 b 274 50 206 22 253 43 b 278 50 275 50 276 50 l 287 49 b 346 63 304 49 331 52 b 356 115 353 71 356 92 b 292 183 356 174 351 183 b 233 173 266 183 240 180 b 226 117 228 168 226 143 b 179 49 219 101 196 49 b 130 117 158 49 135 96 b 118 173 130 141 125 167 b 66 183 112 180 89 183 b 7 173 42 183 16 180 b 0 120 3 170 0 145 b 7 63 0 94 3 68 b 68 49 17 55 43 49 b 82 50 73 49 78 50 b 150 3 98 42 150 13 b 84 -46 150 -16 104 -39 l 69 -46 b 7 -56 43 -46 16 -49 b 0 -111 3 -60 0 -85 b 7 -166 0 -137 3 -163 b 65 -180 17 -174 40 -180 b 118 -166 86 -180 109 -176 b 130 -111 127 -158 130 -134 b 132 -105 130 -109 131 -107 b 177 -45 141 -85 158 -45 b 226 -111 196 -45 220 -91 b 233 -166 226 -137 228 -161 b 291 -180 243 -174 266 -180 b 356 -114 346 -180 356 -166 b 346 -56 356 -89 351 -63 b 288 -46 338 -49 312 -46 z', + }, + accidentalDoubleFlat: { + x_min: 0, + x_max: 411, + y_min: -175, + y_max: 437, + ha: 612, + o: 'm 452 217 b 384 194 426 217 408 207 b 350 176 374 189 363 176 b 343 177 347 176 344 176 b 328 202 333 180 328 190 b 337 606 328 232 337 579 b 310 629 337 622 324 629 b 265 592 291 629 268 616 b 269 194 265 592 266 395 b 196 217 248 209 223 217 l 187 217 b 120 194 160 217 143 207 b 85 176 108 189 98 176 b 78 177 82 176 81 176 b 62 202 68 180 62 190 b 72 606 62 232 72 579 b 45 629 72 622 59 629 b 0 592 24 629 1 616 b 17 -245 0 592 7 -232 b 30 -252 22 -251 26 -252 b 39 -249 35 -252 39 -249 b 153 -161 84 -226 120 -186 b 274 -50 206 -124 246 -85 b 284 -245 276 -158 279 -240 b 295 -252 288 -251 292 -252 b 304 -249 300 -252 304 -249 b 416 -163 348 -226 383 -186 b 592 82 546 -72 592 16 b 461 217 592 163 528 216 z m 96 -134 b 84 -138 92 -137 86 -138 b 68 -115 72 -138 68 -124 b 63 26 68 -115 63 -30 b 66 72 63 49 65 66 b 168 144 75 101 134 144 b 226 59 212 144 226 95 b 96 -134 226 -22 161 -94 z m 361 -134 b 348 -138 356 -137 351 -138 b 333 -115 337 -138 333 -124 b 328 39 333 -115 328 -16 b 330 72 328 55 328 68 b 433 144 338 101 399 144 b 468 130 448 144 459 140 b 490 59 481 112 490 88 b 361 -134 490 -22 426 -94 z', + }, + accidentalParensLeft: { + x_min: 0, + x_max: 141, + y_min: -248, + y_max: 247, + ha: 495, + o: 'm 203 331 l 203 351 b 202 356 203 354 203 356 b 0 0 60 281 0 140 b 199 -357 0 -144 60 -269 b 203 -354 200 -357 203 -356 l 203 -333 b 200 -327 203 -330 202 -328 b 86 0 118 -253 86 -160 b 200 324 86 158 120 251 b 203 331 202 325 203 327 z', + }, + accidentalParensRight: { + x_min: 0, + x_max: 141, + y_min: -248, + y_max: 247, + ha: 495, + o: 'm 0 331 b 3 324 0 327 1 325 b 117 0 84 251 117 158 b 3 -327 117 -160 85 -253 b 0 -333 1 -328 0 -330 l 0 -354 b 4 -357 0 -356 3 -357 b 203 0 143 -269 203 -144 b 1 356 203 140 143 281 b 0 351 0 356 0 354 z', + }, + accidentalQuarterToneFlatStein: { + x_min: 1, + x_max: 227, + y_min: -175, + y_max: 439, + ha: 614, + o: 'm 310 -245 b 327 592 321 -230 327 592 b 282 632 325 618 302 632 b 255 608 268 632 255 624 b 265 202 255 579 264 233 b 249 177 265 192 259 181 b 242 176 246 176 245 176 b 210 196 235 176 219 189 b 131 220 190 209 156 220 b 1 85 65 216 1 164 b 174 -161 1 16 46 -72 b 288 -249 210 -186 245 -225 b 297 -252 288 -249 292 -252 b 310 -245 301 -252 305 -251 z m 259 -117 b 243 -138 259 -124 256 -138 b 229 -134 239 -138 235 -137 b 101 60 167 -95 101 -17 b 160 144 101 96 118 144 b 261 73 193 144 251 102 b 264 27 262 68 264 50 b 259 -117 264 -30 259 -117 z', + }, + accidentalThreeQuarterTonesFlatZimmermann: { + x_min: 1, + x_max: 466, + y_min: -175, + y_max: 439, + ha: 614, + o: 'm 363 -245 b 376 -252 367 -251 372 -252 b 384 -249 380 -252 384 -249 b 497 -161 428 -226 464 -186 b 671 84 625 -72 671 16 b 541 220 671 164 606 217 b 513 217 531 220 523 219 b 464 196 495 212 480 206 b 431 176 452 189 442 176 b 423 177 428 176 426 176 b 408 202 413 180 408 190 l 419 608 b 392 632 419 625 406 632 b 346 592 372 632 347 618 b 363 -245 346 592 351 -230 z m 289 -249 b 297 -252 289 -249 292 -252 b 310 -245 300 -252 305 -251 b 328 592 321 -230 328 592 b 282 631 327 618 302 631 b 255 608 268 631 255 624 l 266 202 b 251 177 266 190 261 180 b 243 176 248 176 246 176 b 210 196 232 176 222 189 b 164 216 196 204 180 210 l 163 217 b 132 220 151 219 143 220 b 1 84 65 217 1 163 b 177 -163 1 16 48 -72 b 289 -249 210 -186 245 -226 z m 262 72 b 265 26 264 66 265 49 b 261 -115 265 -30 261 -115 b 245 -138 261 -124 258 -138 b 230 -134 240 -138 236 -137 b 102 60 166 -92 102 -20 b 124 128 102 88 111 112 b 161 144 134 138 147 144 b 199 134 173 144 184 141 b 262 72 219 122 256 92 z m 413 -115 b 409 26 413 -115 409 -30 b 412 72 409 49 410 66 b 514 144 420 102 480 144 b 570 60 557 144 570 96 b 442 -134 570 -23 508 -91 b 429 -138 436 -137 433 -138 b 413 -115 418 -138 413 -124 z', + }, + accidentalQuarterToneSharpStein: { + x_min: 0, + x_max: 179, + y_min: -353, + y_max: 307, + ha: 660, + o: 'm 258 240 b 246 252 258 248 252 252 b 240 251 245 252 242 252 b 168 225 240 251 171 225 b 150 253 156 225 150 240 l 150 426 b 130 442 150 435 141 442 b 105 418 108 442 105 429 l 105 230 b 91 193 105 219 101 202 b 17 161 65 183 42 171 b 0 138 9 158 0 147 l 0 36 b 13 23 0 27 4 23 l 16 24 b 86 53 17 24 73 49 l 88 55 b 107 30 98 55 107 42 l 107 -114 b 92 -145 107 -130 101 -143 l 17 -177 b 0 -200 9 -180 0 -192 l 0 -302 b 13 -315 0 -311 4 -315 l 16 -314 b 85 -285 17 -314 72 -291 b 105 -312 92 -282 105 -301 l 105 -492 b 125 -508 105 -501 114 -508 b 150 -484 147 -508 150 -498 l 150 -285 b 151 -274 150 -281 150 -278 b 164 -253 153 -265 158 -256 b 240 -225 176 -251 240 -225 b 258 -202 249 -222 258 -210 l 258 -99 b 245 -86 258 -91 253 -86 l 242 -88 b 240 -88 242 -88 240 -88 l 240 -86 b 168 -115 240 -86 174 -114 b 148 -91 158 -115 148 -107 l 148 43 b 167 85 148 55 156 81 b 240 114 180 91 240 114 b 258 138 249 118 258 128 z', + }, + accidentalThreeQuarterTonesSharpStein: { + x_min: 3, + x_max: 317, + y_min: -347, + y_max: 369, + ha: 716, + o: 'm 456 324 b 448 336 456 330 454 336 b 393 317 445 336 400 320 b 389 315 392 315 390 315 b 383 325 386 315 383 318 l 383 508 b 360 531 383 528 379 531 b 337 508 341 531 337 527 l 337 318 b 325 291 337 300 334 294 b 268 268 320 288 287 276 b 253 281 256 268 253 274 l 253 464 b 230 487 253 484 249 487 b 207 464 212 487 207 482 l 207 264 b 194 240 207 253 204 245 l 132 217 b 131 217 132 217 132 217 l 130 216 b 118 229 122 216 118 220 l 118 420 b 95 444 118 439 114 444 b 72 420 76 444 72 439 l 72 212 b 60 190 72 197 68 193 l 16 173 b 4 161 9 170 4 167 l 4 50 b 13 39 4 45 9 39 b 58 55 16 39 46 49 b 63 56 60 56 62 56 b 72 42 71 56 72 50 l 72 -125 b 58 -150 72 -137 65 -147 l 16 -166 b 4 -177 9 -168 4 -171 l 4 -289 b 14 -301 4 -295 9 -301 b 53 -287 16 -301 40 -291 b 62 -285 56 -285 59 -285 b 72 -298 69 -285 72 -289 l 72 -477 b 95 -500 72 -495 76 -500 b 118 -477 114 -500 118 -495 l 118 -278 b 127 -259 118 -269 121 -261 l 196 -232 b 207 -243 204 -232 207 -235 l 207 -432 b 230 -455 207 -452 212 -455 b 253 -432 249 -455 253 -451 l 253 -228 b 268 -204 253 -216 259 -207 l 320 -186 b 328 -183 323 -184 325 -183 b 337 -194 334 -183 337 -187 l 337 -387 b 360 -410 337 -408 341 -410 b 383 -387 379 -410 383 -406 l 383 -174 b 395 -157 383 -166 390 -158 l 445 -138 b 456 -127 452 -135 456 -132 l 456 -14 b 448 -3 456 -10 454 -3 b 397 -22 445 -3 408 -17 l 396 -23 b 383 -6 387 -23 383 -16 l 383 163 b 392 181 383 173 384 179 b 445 202 397 183 445 202 b 456 213 452 203 456 207 z m 337 -45 b 266 -78 333 -56 287 -78 b 258 -75 262 -78 259 -76 b 253 19 255 -71 253 -27 b 258 130 253 69 255 122 b 333 163 264 141 315 163 b 337 161 334 163 337 161 b 341 78 340 157 341 120 b 337 -45 341 24 340 -37 z m 118 -127 b 114 -48 114 -121 114 -86 b 118 78 114 6 115 68 b 200 114 122 91 180 114 b 207 111 204 114 206 112 b 212 22 210 107 212 66 b 207 -94 212 -29 210 -85 b 127 -130 203 -108 148 -130 b 118 -127 122 -130 120 -128 z', + }, + accidentalBuyukMucennebFlat: { + x_min: 1, + x_max: 287, + y_min: -174, + y_max: 438, + ha: 612, + o: 'm 379 452 b 370 464 379 458 377 464 b 164 389 366 464 170 392 b 156 396 163 389 156 393 b 157 436 157 409 157 428 b 167 452 157 445 161 449 b 366 526 173 455 366 526 b 379 540 374 528 379 534 l 379 611 b 370 622 379 616 377 622 b 170 550 366 622 174 552 b 160 557 163 550 160 554 b 161 608 160 585 161 602 b 134 631 161 624 148 631 b 89 590 114 631 91 616 l 89 528 b 81 517 89 526 88 518 b 16 491 76 514 16 491 b 1 480 6 490 1 485 l 1 406 b 13 395 1 400 4 395 l 14 396 b 79 419 16 396 72 415 b 89 412 86 419 89 415 b 91 376 89 399 89 386 b 82 359 91 364 89 361 b 16 331 76 356 16 331 b 1 321 6 331 1 328 l 1 248 b 13 236 1 242 4 236 b 79 262 16 236 71 258 b 92 251 89 262 92 256 b 107 -242 95 23 101 -236 b 120 -251 111 -249 115 -251 b 128 -248 124 -251 128 -248 b 240 -160 171 -225 207 -184 b 413 84 367 -71 413 16 b 284 220 413 166 350 216 b 207 196 259 220 229 209 b 170 176 196 190 184 176 l 168 177 b 151 203 157 181 151 192 b 153 269 151 210 151 236 b 163 292 153 275 153 289 b 366 367 173 297 366 367 b 379 383 374 370 379 376 z m 186 -132 b 173 -137 180 -135 176 -137 b 157 -114 161 -137 157 -122 b 153 35 157 -114 153 -22 b 154 73 153 53 153 68 b 219 135 160 92 197 124 b 255 144 232 141 243 144 b 292 130 269 144 282 140 b 314 62 305 114 314 91 b 186 -132 314 -17 251 -94 z', + }, + accidentalBakiyeFlat: { + x_min: -1, + x_max: 286, + y_min: -175, + y_max: 439, + ha: 614, + o: 'm 377 454 b 369 467 377 458 376 467 b 363 465 367 467 364 467 b 161 390 363 465 167 393 b 153 399 154 390 153 395 b 157 608 154 494 157 593 b 130 632 157 624 144 632 b 86 592 111 632 88 618 b 88 377 86 592 86 501 b 76 356 88 373 88 360 l 12 331 b -1 320 3 330 -1 327 l -1 248 b 9 236 -1 242 1 236 b 81 264 12 236 78 261 b 89 258 86 264 89 261 b 104 -245 92 30 96 -236 b 115 -252 108 -251 112 -252 b 124 -249 120 -252 124 -249 b 239 -161 167 -226 203 -186 b 412 84 367 -72 412 17 b 282 220 412 166 348 216 b 255 216 274 220 264 219 b 203 196 238 212 222 206 b 171 177 193 189 177 177 b 163 179 168 177 166 177 b 147 202 153 181 147 192 b 147 216 147 204 147 209 l 150 262 b 150 276 150 269 150 275 b 158 291 150 287 154 289 b 363 370 163 292 363 370 b 377 384 373 373 377 379 z m 181 -134 b 167 -138 176 -137 171 -138 b 153 -117 156 -138 153 -125 b 148 27 153 -117 148 -30 b 151 73 148 50 150 68 b 255 144 161 105 219 144 b 312 62 298 144 312 99 b 181 -134 312 -19 249 -96 z', + }, + accidentalKomaSharp: { + x_min: 0, + x_max: 229, + y_min: -337, + y_max: 322, + ha: 659, + o: 'm 312 151 b 330 176 323 156 330 166 l 330 278 b 320 289 330 285 327 289 b 312 288 318 289 315 289 b 200 246 312 288 203 248 b 181 275 187 246 181 264 l 181 448 b 163 464 181 456 173 464 b 138 441 140 464 138 452 l 138 253 b 122 215 137 240 132 225 b 17 177 92 203 45 177 b 0 153 7 173 0 163 l 0 50 b 10 39 0 43 4 39 b 17 40 13 39 14 39 l 128 81 b 138 52 138 81 138 63 l 138 -91 b 124 -124 138 -107 132 -120 b 17 -167 115 -127 17 -167 b 0 -192 7 -171 0 -181 l 0 -294 b 10 -305 0 -301 4 -305 b 17 -304 13 -305 14 -305 b 128 -261 17 -304 117 -264 l 130 -259 b 138 -276 137 -259 138 -268 l 138 -469 b 157 -485 138 -478 147 -485 b 181 -462 179 -485 181 -475 l 181 -262 b 183 -252 181 -258 181 -255 b 197 -232 186 -243 190 -235 b 312 -187 207 -228 312 -187 b 330 -163 323 -183 330 -173 l 330 -60 b 320 -49 330 -53 327 -49 b 312 -50 318 -49 315 -49 l 200 -94 b 193 -95 197 -95 194 -95 b 181 -68 183 -95 181 -85 l 181 66 b 200 108 181 92 189 104 z', + }, + accidentalKucukMucennebSharp: { + x_min: -1, + x_max: 339, + y_min: -338, + y_max: 321, + ha: 659, + o: 'm 264 92 b 271 102 264 98 265 99 l 395 150 b 412 174 405 154 412 164 l 412 276 b 402 288 412 284 409 288 b 395 287 400 288 397 288 b 282 245 395 287 285 246 b 264 274 269 245 264 262 l 264 446 b 245 462 264 455 255 462 b 220 439 222 462 220 451 l 220 252 b 204 213 219 239 215 223 b 99 176 174 202 127 176 b 82 151 89 171 82 161 l 82 49 b 92 37 82 42 86 37 b 99 39 95 37 96 37 l 210 79 b 216 81 212 81 215 81 b 220 78 219 81 220 79 l 220 56 b 216 46 220 52 220 48 b 16 -29 210 45 16 -29 b -1 -45 4 -32 -1 -36 l -1 -138 b 12 -154 -1 -145 3 -154 l 215 -79 b 220 -84 219 -79 220 -81 l 220 -105 b 210 -122 220 -115 219 -120 b 99 -168 202 -127 99 -168 b 82 -193 89 -173 82 -183 l 82 -295 b 92 -307 82 -302 86 -307 b 99 -305 95 -307 96 -307 b 210 -262 99 -305 199 -265 l 212 -261 b 220 -278 219 -261 220 -269 l 220 -471 b 239 -487 220 -480 229 -487 b 264 -464 261 -487 264 -477 l 264 -264 b 265 -253 264 -259 264 -256 b 279 -233 268 -245 272 -236 b 395 -189 289 -229 395 -189 b 412 -164 405 -184 412 -174 l 412 -62 b 402 -50 412 -55 409 -50 b 395 -52 400 -50 397 -50 l 278 -96 b 264 -86 268 -96 264 -94 l 264 -68 b 269 -59 264 -62 265 -60 b 471 17 274 -58 471 17 b 488 36 484 22 488 27 l 488 127 b 475 144 488 134 487 144 l 472 141 b 471 141 472 141 471 141 l 471 143 b 272 68 471 143 282 71 l 269 66 b 264 71 264 66 264 69 z', + }, + accidentalKoron: { + x_min: 0, + x_max: 300, + y_min: -472, + y_max: 157, + ha: 629, + o: 'm 432 -4 b 415 10 432 1 418 9 l 4 226 b 0 223 1 226 0 225 l 0 -672 b 7 -680 0 -677 3 -680 l 45 -680 b 52 -672 49 -680 52 -677 l 52 -193 l 415 -22 b 432 -4 418 -20 432 -13 z m 52 -137 l 52 144 l 327 -7 z', + }, + accidentalSori: { + x_min: 0, + x_max: 421, + y_min: -318, + y_max: 328, + ha: 646, + o: 'm 606 10 b 589 23 606 16 592 22 l 382 109 l 382 465 b 374 472 382 469 379 472 l 337 472 b 330 465 333 472 330 469 l 330 132 l 183 194 l 183 425 b 176 432 183 429 180 432 l 138 432 b 131 425 134 432 131 429 l 131 216 l 3 269 b 0 265 0 269 0 266 l 0 223 b 3 213 0 216 0 215 l 131 160 l 131 -150 l 3 -203 b 0 -212 0 -204 0 -206 l 0 -255 b 3 -259 0 -258 1 -259 l 131 -204 l 131 -451 b 138 -458 131 -455 134 -458 l 176 -458 b 183 -451 180 -458 183 -455 l 183 -183 l 330 -120 l 330 -410 b 337 -418 330 -415 333 -418 l 374 -418 b 382 -410 379 -418 382 -415 l 382 -98 l 589 -9 b 606 10 592 -9 606 0 z m 183 -128 l 183 138 l 330 76 l 330 -66 z m 382 -45 l 382 55 l 501 6 z', + }, + articAccentAbove: { + x_min: 0, + x_max: 339, + y_min: 1, + y_max: 245, + ha: 244, + o: 'm 469 151 b 488 177 488 156 488 166 b 469 203 488 189 488 197 l 37 350 b 24 353 32 351 26 353 b 3 333 12 353 7 344 b 0 318 1 327 0 323 b 20 298 0 311 4 304 b 346 187 20 298 331 193 b 356 177 353 186 356 181 b 344 167 356 173 353 170 b 20 58 328 163 20 58 b 0 36 4 50 0 43 b 3 23 0 32 1 27 b 23 1 7 13 13 1 b 29 3 24 1 27 1 z', + }, + articAccentBelow: { + x_min: 0, + x_max: 339, + y_min: -244, + y_max: 0, + ha: 244, + o: 'm 469 -202 b 488 -176 488 -197 488 -187 b 469 -150 488 -164 488 -156 l 37 -3 b 24 0 32 -1 26 0 b 3 -20 12 0 7 -9 b 0 -35 1 -26 0 -30 b 20 -55 0 -42 4 -49 b 346 -166 20 -55 331 -160 b 356 -176 353 -167 356 -171 b 344 -186 356 -180 353 -183 b 20 -295 328 -190 20 -295 b 0 -317 4 -302 0 -310 b 3 -330 0 -321 1 -325 b 23 -351 7 -340 13 -351 b 29 -350 24 -351 27 -351 z', + }, + articTenutoAbove: { + x_min: -1, + x_max: 338, + y_min: 0, + y_max: 48, + ha: 48, + o: 'm 452 0 b 487 35 485 0 487 16 b 452 69 487 53 487 69 l 33 69 b -1 35 -1 69 -1 53 b 33 0 -1 16 -1 0 z', + }, + articTenutoBelow: { + x_min: -1, + x_max: 338, + y_min: -48, + y_max: 0, + ha: 48, + o: 'm 452 -69 b 487 -35 485 -69 487 -53 b 452 0 487 -16 487 0 l 33 0 b -1 -35 -1 0 -1 -16 b 33 -69 -1 -53 -1 -69 z', + }, + articStaccatoAbove: { + x_min: 0, + x_max: 84, + y_min: 0, + y_max: 84, + ha: 84, + o: 'm 121 60 b 60 121 121 94 94 121 b 0 60 27 121 0 94 b 60 0 0 27 27 0 b 121 60 94 0 121 27 z', + }, + articStaccatoBelow: { + x_min: 0, + x_max: 84, + y_min: -84, + y_max: 0, + ha: 84, + o: 'm 121 -60 b 60 0 121 -27 94 0 b 0 -60 27 0 0 -27 b 60 -121 0 -94 27 -121 b 121 -60 94 -121 121 -94 z', + }, + articStaccatissimoAbove: { + x_min: 1, + x_max: 100, + y_min: -2, + y_max: 293, + ha: 295, + o: 'm 72 422 b 1 390 35 422 3 409 b 72 -3 1 369 39 -3 b 144 389 108 -3 144 356 b 72 422 144 410 111 422 z', + }, + articStaccatissimoBelow: { + x_min: 1, + x_max: 100, + y_min: -295, + y_max: 0, + ha: 295, + o: 'm 72 -425 b 144 -392 111 -425 144 -413 b 72 0 144 -359 108 0 b 1 -393 39 0 1 -372 b 72 -425 3 -412 35 -425 z', + }, + articMarcatoAbove: { + x_min: -1, + x_max: 235, + y_min: -1, + y_max: 253, + ha: 254, + o: 'm 181 356 b 167 364 177 361 173 364 b 153 356 157 364 153 356 l 0 23 b -1 16 -1 20 -1 19 b 9 0 -1 9 1 1 b 16 -1 10 -1 14 -1 b 32 9 22 -1 29 1 b 112 186 32 9 109 180 b 118 190 114 189 115 190 b 127 186 121 190 124 189 b 209 9 128 180 209 9 b 225 0 213 3 219 0 l 323 0 b 338 16 333 1 338 7 b 337 23 338 19 338 22 z', + }, + articMarcatoBelow: { + x_min: -1, + x_max: 235, + y_min: -254, + y_max: 0, + ha: 254, + o: 'm 156 -357 b 170 -366 160 -363 164 -366 b 184 -357 180 -366 184 -357 l 337 -24 b 338 -17 338 -22 338 -20 b 328 -1 338 -10 336 -3 b 321 0 327 0 323 0 b 305 -10 315 0 308 -3 b 225 -187 305 -10 228 -181 b 219 -192 223 -190 222 -192 b 210 -187 216 -192 213 -190 b 128 -10 209 -181 128 -10 b 112 -1 124 -4 118 -1 l 14 -1 b -1 -17 4 -3 -1 -9 b 0 -24 -1 -20 -1 -23 z', + }, + fermataAbove: { + x_min: 3, + x_max: 605, + y_min: -3, + y_max: 329, + ha: 332, + o: 'm 435 318 b 818 36 742 318 804 91 b 821 26 819 32 819 27 b 851 -4 831 6 837 -4 b 871 16 864 -4 871 1 b 870 30 871 20 871 24 b 438 474 780 471 480 474 b 6 30 392 474 94 471 b 4 14 4 24 4 19 b 23 -4 4 0 12 -4 b 52 26 36 -4 43 6 b 56 39 53 27 55 33 b 435 318 73 98 138 318 z m 516 75 b 436 153 516 117 480 153 b 359 75 395 153 359 117 b 436 -4 359 32 395 -4 b 516 75 480 -4 516 32 z', + }, + fermataBelow: { + x_min: 3, + x_max: 605, + y_min: -332, + y_max: 0, + ha: 332, + o: 'm 435 -323 b 56 -43 138 -323 73 -102 b 52 -30 55 -37 53 -32 b 23 0 43 -10 36 0 b 4 -19 12 0 4 -4 b 6 -35 4 -23 4 -29 b 438 -478 94 -475 392 -478 b 870 -35 480 -478 780 -475 b 871 -20 871 -29 871 -24 b 851 0 871 -6 864 0 b 821 -30 837 0 831 -10 b 818 -40 819 -32 819 -36 b 435 -323 804 -95 742 -323 z m 516 -79 b 436 0 516 -36 480 0 b 359 -79 395 0 359 -36 b 436 -157 359 -121 395 -157 b 516 -79 480 -157 516 -121 z', + }, + breathMarkComma: { + x_min: 1, + x_max: 152, + y_min: 2, + y_max: 251, + ha: 249, + o: 'm 104 361 b 1 271 42 361 1 321 b 82 190 1 222 35 190 b 122 160 118 190 122 160 b 125 144 124 154 125 150 b 102 88 125 124 115 105 b 37 32 78 56 40 35 b 26 17 32 29 26 26 l 27 16 b 37 3 29 6 33 3 b 181 102 85 3 158 66 b 219 239 210 147 219 197 l 219 249 b 104 361 219 317 170 361 z', + }, + breathMarkUpbow: { + x_min: 1, + x_max: 249, + y_min: 1, + y_max: 495, + ha: 494, + o: 'm 181 1 b 206 22 193 1 203 10 l 359 683 l 359 688 b 338 713 359 700 351 710 l 333 713 b 308 694 321 713 311 706 l 180 140 l 53 694 b 27 713 49 706 39 713 l 22 713 b 1 690 10 710 1 700 b 3 683 1 687 1 685 l 154 22 b 181 1 157 10 167 1 z', + }, + caesura: { + x_min: 0, + x_max: 384, + y_min: -1, + y_max: 532, + ha: 533, + o: 'm 40 -1 b 78 26 58 -1 72 9 l 321 713 b 323 726 323 717 323 721 b 282 766 323 747 304 766 b 245 739 265 766 251 756 l 3 52 b 0 37 1 48 0 42 b 27 1 0 22 10 7 b 40 -1 32 -1 36 -1 z m 308 26 l 552 713 b 553 726 553 717 553 721 b 513 766 553 747 534 766 b 475 739 495 766 481 756 l 232 52 b 230 39 230 48 230 43 b 258 1 230 23 240 7 b 271 -1 262 -1 266 -1 b 308 26 287 -1 302 9 z', + }, + caesuraCurved: { + x_min: 0, + x_max: 373, + y_min: 0, + y_max: 530, + ha: 530, + o: 'm 491 763 b 445 719 468 763 446 744 b 252 98 432 507 340 295 l 226 39 b 223 27 225 35 223 32 b 252 0 223 13 233 0 b 276 16 262 0 272 6 b 537 716 386 230 537 478 b 491 763 537 742 518 763 z m 29 0 b 53 16 39 0 48 6 l 82 69 b 314 716 187 264 314 498 b 268 763 314 742 295 763 b 222 719 245 763 223 744 b 29 98 209 507 117 295 l 3 39 b 0 29 1 36 0 33 b 29 0 0 14 12 0 z', + }, + restMaxima: { + x_min: 0, + x_max: 381, + y_min: -249, + y_max: 250, + ha: 499, + o: 'm 180 -330 l 180 331 b 156 360 180 356 170 360 l 23 360 b 0 331 10 360 0 356 l 0 -330 b 23 -359 0 -354 10 -359 l 156 -359 b 180 -330 170 -359 180 -354 z m 549 -330 l 549 331 b 524 360 549 356 539 360 l 392 360 b 369 331 379 360 369 356 l 369 -330 b 392 -359 369 -354 379 -359 l 524 -359 b 549 -330 539 -359 549 -354 z', + }, + restDoubleWhole: { + x_min: 0, + x_max: 125, + y_min: 0, + y_max: 250, + ha: 250, + o: 'm 180 22 l 180 338 b 156 360 180 350 170 360 l 23 360 b 0 338 10 360 0 350 l 0 22 b 23 0 0 10 10 0 l 156 0 b 180 22 170 0 180 10 z', + }, + restWhole: { + x_min: 0, + x_max: 282, + y_min: -135, + y_max: 9, + ha: 144, + o: 'm 406 -157 l 406 -24 b 369 13 406 -3 389 13 l 37 13 b 0 -24 16 13 0 -3 l 0 -157 b 37 -194 0 -177 16 -194 l 369 -194 b 406 -157 389 -194 406 -177 z', + }, + restHalf: { + x_min: 0, + x_max: 282, + y_min: -2, + y_max: 142, + ha: 144, + o: 'm 406 35 l 406 167 b 369 204 406 189 389 204 l 37 204 b 0 167 16 204 0 189 l 0 35 b 37 -3 0 14 16 -3 l 369 -3 b 406 35 389 -3 406 14 z', + }, + restQuarter: { + x_min: 1, + x_max: 270, + y_min: -375, + y_max: 373, + ha: 748, + o: 'm 112 -55 b 174 -141 135 -84 156 -111 b 183 -161 177 -147 183 -158 b 181 -167 183 -163 183 -166 b 166 -174 179 -173 173 -174 b 143 -170 160 -174 148 -171 b 137 -170 141 -170 138 -170 l 125 -166 b 1 -304 50 -166 1 -233 b 168 -527 1 -376 63 -446 b 206 -540 180 -536 194 -540 b 228 -531 216 -540 226 -537 b 230 -521 229 -527 230 -524 b 207 -487 230 -508 219 -497 b 170 -435 189 -487 173 -448 b 164 -397 166 -423 164 -410 b 255 -292 164 -338 194 -292 b 369 -317 297 -292 344 -308 l 370 -318 b 382 -320 376 -320 379 -320 b 389 -314 386 -320 389 -318 b 336 -232 389 -297 351 -249 b 236 -32 281 -166 236 -112 b 236 -27 236 -30 236 -29 l 238 -17 b 238 -13 238 -16 238 -14 b 333 199 243 71 295 140 b 338 220 337 206 338 213 b 333 248 338 235 333 248 b 95 526 333 248 120 501 b 69 537 88 533 78 537 b 40 507 55 537 40 527 b 46 484 40 500 42 492 b 134 291 52 468 134 395 b 48 108 134 238 112 176 b 27 66 33 94 27 78 b 42 32 27 46 42 32 z', + }, + rest8th: { + x_min: 0, + x_max: 247, + y_min: -251, + y_max: 174, + ha: 425, + o: 'm 193 154 b 96 251 193 207 150 251 b 0 154 43 251 0 207 b 39 81 0 124 17 98 b 117 56 62 65 89 56 b 173 66 137 56 157 60 b 225 88 193 72 206 78 b 232 89 228 89 230 89 b 239 76 238 89 239 84 b 238 60 239 72 239 66 b 104 -343 233 39 130 -248 b 145 -361 104 -360 137 -361 b 196 -347 161 -361 181 -359 b 341 161 200 -344 341 161 b 356 217 347 187 354 210 b 338 240 356 232 341 239 b 323 235 336 240 331 240 b 193 140 312 226 240 140 z', + }, + rest16th: { + x_min: 0, + x_max: 320, + y_min: -500, + y_max: 179, + ha: 679, + o: 'm 300 160 b 202 258 300 215 256 258 b 104 160 148 258 104 215 b 219 62 104 101 164 62 b 331 94 258 62 298 75 b 341 96 336 95 338 96 b 348 86 346 96 348 94 b 265 -173 348 63 275 -151 b 194 -217 253 -200 215 -217 b 196 -203 196 -212 196 -207 b 98 -105 196 -148 151 -105 b 0 -203 43 -105 0 -148 b 115 -301 0 -262 60 -301 b 223 -271 153 -301 190 -288 b 229 -279 226 -271 229 -274 l 228 -281 b 228 -282 228 -282 228 -282 l 91 -690 b 91 -691 91 -690 91 -691 l 89 -693 b 134 -720 89 -706 102 -720 b 189 -687 176 -720 183 -703 l 356 -138 b 420 81 393 -16 420 81 b 459 226 420 81 456 207 b 461 232 459 229 461 230 b 446 248 461 240 449 246 b 431 242 439 248 435 245 b 300 145 420 233 348 147 z', + }, + rest32nd: { + x_min: 0, + x_max: 363, + y_min: -500, + y_max: 426, + ha: 926, + o: 'm 508 603 b 492 598 501 603 497 600 b 361 503 482 590 410 503 l 361 516 b 264 613 361 570 318 613 b 166 516 210 613 166 570 b 206 444 166 487 183 461 b 246 423 217 433 232 428 b 284 418 258 420 269 418 b 393 449 321 418 360 432 b 399 451 395 451 397 451 b 415 426 409 451 415 436 l 413 423 b 413 422 413 423 413 422 l 357 192 b 279 140 350 168 302 140 b 281 153 281 144 281 148 b 183 251 281 207 236 251 b 85 153 128 251 85 207 b 125 81 85 124 102 98 b 164 60 137 71 150 65 b 203 55 176 58 189 55 b 311 86 240 55 278 69 b 315 88 312 88 314 88 b 325 69 323 88 325 76 l 268 -167 b 194 -217 261 -197 216 -216 b 196 -203 196 -212 196 -207 b 98 -105 196 -148 153 -105 b 0 -203 45 -105 0 -148 b 115 -301 0 -262 60 -301 b 228 -269 154 -301 194 -288 b 232 -268 229 -268 230 -268 b 240 -276 236 -268 240 -272 b 138 -688 240 -282 141 -678 b 137 -697 137 -691 137 -694 b 176 -720 137 -708 145 -720 b 232 -690 222 -720 226 -706 b 484 436 236 -672 484 436 b 521 582 484 436 518 564 b 523 588 521 585 523 586 b 508 603 523 600 511 603 z', + }, + rest64th: { + x_min: 0, + x_max: 423, + y_min: -753, + y_max: 430, + ha: 1183, + o: 'm 596 609 b 580 603 589 609 585 606 b 448 507 569 595 497 507 b 449 521 449 511 449 516 b 351 619 449 575 405 619 b 253 521 297 619 253 575 b 372 422 253 461 317 422 b 481 454 410 422 446 438 b 491 456 484 455 488 456 b 504 441 498 456 504 451 b 501 426 504 436 503 432 b 445 202 500 422 451 217 b 359 144 435 174 383 144 l 359 158 b 261 256 359 212 315 256 b 163 158 207 256 163 212 b 243 65 163 112 202 78 b 279 60 255 62 266 60 b 397 91 320 60 360 73 b 403 92 400 92 402 92 b 412 79 409 92 412 86 b 410 72 412 76 412 75 b 351 -161 408 59 356 -150 b 281 -212 340 -199 301 -212 l 281 -197 b 183 -99 281 -144 238 -99 b 85 -197 130 -99 85 -144 b 125 -271 85 -228 102 -253 b 166 -291 138 -279 151 -287 b 204 -297 177 -294 192 -297 b 262 -287 225 -297 245 -292 b 305 -265 282 -279 287 -274 b 310 -264 307 -264 308 -264 b 318 -284 317 -264 318 -275 b 317 -295 318 -288 317 -294 b 259 -524 315 -302 265 -508 b 194 -567 251 -554 213 -567 b 196 -554 196 -563 196 -559 b 98 -456 196 -500 153 -456 b 0 -554 45 -456 0 -500 b 40 -626 0 -583 17 -609 b 118 -652 60 -644 92 -652 b 210 -629 145 -652 186 -642 b 216 -628 213 -628 215 -628 b 228 -647 226 -628 228 -639 l 226 -651 b 226 -652 226 -651 226 -652 l 122 -1054 b 121 -1064 121 -1058 121 -1061 b 167 -1084 121 -1077 134 -1084 b 215 -1060 202 -1084 209 -1076 b 402 -278 217 -1047 229 -1021 b 436 -135 403 -278 431 -161 l 570 441 b 609 588 570 441 605 569 b 596 609 609 603 602 608 z', + }, + rest128th: { + x_min: 0, + x_max: 485, + y_min: -750, + y_max: 689, + ha: 1439, + o: 'm 537 894 b 439 992 537 949 494 992 b 341 894 386 992 341 949 b 382 822 341 865 359 840 b 459 796 402 805 433 796 b 518 806 480 796 501 801 l 520 808 b 569 828 539 814 552 819 b 580 831 572 829 577 831 b 598 812 589 831 598 825 b 596 801 598 809 598 805 b 540 575 590 773 546 595 b 448 510 534 553 475 510 l 448 524 b 350 622 448 577 405 622 b 252 524 297 622 252 577 b 292 451 252 494 269 468 b 369 426 318 433 337 426 b 429 435 389 426 412 429 b 494 464 449 442 475 455 b 498 465 495 465 497 465 b 505 446 504 465 505 456 b 503 426 505 439 504 432 l 446 202 b 366 144 439 173 389 144 l 366 158 b 268 256 366 212 323 256 b 170 158 215 256 170 212 b 289 59 170 98 235 59 b 347 69 310 59 330 63 b 397 91 367 76 379 82 b 406 94 400 92 403 94 b 415 79 412 94 415 88 b 412 63 415 75 413 69 b 357 -157 408 42 364 -134 b 281 -212 346 -196 302 -212 b 282 -197 281 -207 282 -203 b 184 -99 282 -144 238 -99 b 86 -197 130 -99 86 -144 b 204 -297 86 -258 150 -297 b 262 -287 225 -297 245 -292 b 312 -265 282 -279 294 -274 b 318 -264 314 -264 317 -264 b 327 -275 324 -264 327 -269 b 266 -517 324 -287 278 -490 b 200 -569 248 -566 220 -567 l 196 -554 b 98 -456 196 -500 153 -456 b 0 -554 45 -456 0 -500 b 118 -652 0 -615 63 -652 b 177 -642 138 -652 160 -648 l 179 -641 b 229 -621 197 -635 210 -629 l 230 -619 b 239 -626 236 -619 239 -622 b 238 -632 239 -628 239 -631 b 131 -1057 235 -642 134 -1050 b 173 -1080 131 -1071 140 -1080 b 230 -1057 219 -1080 225 -1074 l 658 815 b 697 960 658 815 694 942 b 698 966 697 963 698 965 b 684 982 698 975 687 981 b 668 976 677 982 672 979 b 537 880 658 969 586 881 z', + }, + dynamicPiano: { + x_min: -89, + x_max: 366, + y_min: -142, + y_max: 274, + ha: 416, + o: 'm 395 395 b 292 357 350 395 318 380 b 262 328 272 340 268 328 b 246 363 255 328 259 338 b 177 393 236 380 215 393 b 1 251 92 393 46 333 b -9 223 -6 238 -9 230 b 7 207 -9 213 -1 207 b 30 229 17 207 23 216 b 127 338 72 301 101 338 b 143 321 138 338 143 331 b 134 285 143 310 138 295 l -43 -154 b -65 -168 -48 -166 -50 -168 l -109 -168 b -128 -187 -122 -168 -128 -174 b -111 -204 -128 -199 -122 -204 l 167 -204 b 186 -186 180 -204 186 -199 b 168 -168 186 -174 180 -168 l 111 -168 b 98 -164 102 -168 98 -168 b 101 -154 98 -163 99 -158 l 166 7 b 179 24 168 14 171 24 b 213 -1 186 24 190 10 b 276 -14 233 -12 252 -14 b 527 266 415 -14 527 130 b 395 395 527 350 475 395 z m 356 341 b 389 288 380 341 389 320 b 243 35 389 217 312 35 b 207 81 219 35 207 50 b 235 180 207 111 219 140 l 264 251 b 356 341 284 300 321 341 z', + }, + dynamicMezzo: { + x_min: -20, + x_max: 446, + y_min: -10, + y_max: 274, + ha: 284, + o: 'm 528 395 b 431 350 487 395 454 374 b 409 330 416 336 415 330 b 397 360 402 330 406 341 b 334 395 389 379 370 395 b 236 350 292 395 259 374 b 215 330 222 336 220 330 b 203 360 207 330 212 340 b 147 393 194 379 174 393 b -19 251 71 393 26 331 b -29 223 -26 238 -29 230 b -13 207 -29 213 -22 207 b 9 226 -3 207 1 215 b 107 338 52 300 81 338 b 122 321 118 338 122 331 b 114 285 122 310 118 295 l 9 24 b 4 9 6 17 4 13 b 20 0 4 3 9 0 l 91 0 b 114 17 104 0 108 3 l 207 251 b 287 323 225 292 255 323 b 308 302 304 323 308 314 b 294 249 308 285 302 269 b 203 24 294 248 292 248 b 199 9 200 17 199 13 b 215 0 199 3 203 0 l 285 0 b 308 17 298 0 302 3 l 402 251 b 481 323 419 292 449 323 b 503 302 498 323 503 314 b 413 43 503 252 413 104 b 478 -14 413 6 436 -14 b 629 102 533 -14 583 26 b 642 132 638 117 642 125 b 629 145 642 141 636 145 b 608 127 619 145 615 138 b 534 49 580 84 553 49 b 523 62 526 49 523 53 b 606 317 523 112 606 238 b 528 395 606 353 588 395 z', + }, + dynamicForte: { + x_min: -141, + x_max: 364, + y_min: -152, + y_max: 444, + ha: 596, + o: 'm 23 380 b 0 357 7 380 0 373 b 22 336 0 343 7 336 l 105 336 b 117 330 114 336 117 336 b 114 315 117 327 115 323 l 23 0 b -101 -187 -17 -141 -43 -187 b -127 -174 -120 -187 -127 -181 b -92 -156 -127 -163 -114 -170 b -63 -102 -75 -144 -63 -125 b -128 -43 -63 -65 -89 -43 b -203 -122 -171 -43 -203 -78 b -95 -219 -203 -186 -156 -219 b 161 17 14 -219 82 -145 b 269 317 203 105 235 194 l 271 318 b 289 336 271 323 282 336 l 383 336 b 406 359 399 336 406 343 b 384 380 406 373 399 380 l 298 380 b 284 387 288 380 284 380 b 287 405 284 392 285 396 b 419 606 315 530 347 606 b 442 595 431 606 442 603 b 419 580 442 586 435 588 b 389 526 400 572 389 552 b 454 465 389 485 418 465 b 524 543 491 465 524 490 b 400 639 524 596 491 639 b 135 402 261 639 183 540 b 107 380 128 380 127 380 z', + }, + dynamicRinforzando: { + x_min: -20, + x_max: 277, + y_min: 0, + y_max: 274, + ha: 274, + o: 'm 324 395 b 235 350 287 395 256 374 b 215 330 222 336 220 330 b 203 360 207 330 213 337 b 145 393 194 379 174 393 b -19 251 75 393 27 337 b -29 223 -26 238 -29 230 b -13 207 -29 213 -22 207 b 9 226 -3 207 3 215 b 107 338 52 301 81 338 b 122 321 118 338 122 331 b 114 285 122 310 118 295 l 9 24 b 4 9 6 17 4 13 b 20 0 4 3 9 0 l 91 0 b 114 17 104 0 108 3 l 207 251 b 304 351 226 298 272 351 b 318 343 312 351 318 348 b 287 285 318 330 287 325 b 338 239 287 256 308 239 b 399 318 373 239 399 268 b 324 395 399 360 377 395 z', + }, + dynamicSforzando: { + x_min: 0, + x_max: 229, + y_min: -10, + y_max: 273, + ha: 283, + o: 'm 212 393 b 68 274 127 393 68 350 b 145 161 68 223 95 196 b 200 85 187 132 200 114 b 127 20 200 53 173 20 b 66 42 91 20 66 32 b 91 56 66 49 75 46 b 111 98 104 65 111 79 b 59 145 111 127 86 145 b 0 78 24 145 0 117 b 125 -14 0 30 49 -14 b 291 120 219 -14 291 36 b 220 232 291 160 276 190 b 151 314 168 271 151 287 b 213 361 151 337 168 361 b 258 346 238 361 258 356 b 240 333 258 340 251 340 b 226 298 232 325 226 314 b 276 252 226 269 248 252 b 330 307 311 252 330 279 b 212 393 330 360 285 393 z', + }, + dynamicZ: { + x_min: -30, + x_max: 244, + y_min: -10, + y_max: 268, + ha: 278, + o: 'm 333 386 b 298 377 321 386 314 382 b 239 370 282 373 259 370 b 94 383 153 370 111 383 b 68 364 79 383 72 377 l 33 264 b 29 242 30 255 29 248 b 45 228 29 232 36 228 b 66 249 55 228 60 236 l 81 279 b 96 297 85 288 88 297 b 168 292 102 297 127 292 b 223 302 194 292 215 302 b 196 269 229 302 197 271 l -26 45 b -43 16 -37 33 -43 27 b -24 -1 -43 6 -36 -1 b 4 16 -12 -1 -3 10 b 39 30 16 24 27 30 b 179 -14 79 30 108 -14 b 297 102 259 -14 297 43 b 245 166 297 147 271 166 b 197 115 219 166 197 145 b 236 72 197 88 216 72 b 259 79 251 72 255 79 b 264 75 262 79 264 78 b 258 60 264 72 261 66 b 229 45 252 50 242 45 b 117 95 186 45 173 95 b 85 86 98 95 89 86 b 102 111 85 86 95 104 l 333 338 b 351 370 344 350 351 359 b 333 386 351 380 343 386 z', + }, + ornamentTrill: { + x_min: 0, + x_max: 521, + y_min: -10, + y_max: 390, + ha: 400, + o: 'm 383 562 b 364 557 377 562 369 559 l 294 534 b 269 511 281 530 275 526 l 217 384 b 206 367 212 370 210 367 b 179 380 200 367 192 374 b 118 393 158 389 140 393 b 0 292 50 393 0 353 b 95 210 0 248 30 210 b 140 213 112 210 131 213 b 144 209 143 213 144 212 b 140 194 144 206 143 202 l 124 156 b 96 58 108 117 96 88 b 179 -14 96 17 124 -14 b 325 153 253 -14 325 46 b 307 251 325 187 320 219 b 302 265 304 258 302 261 b 334 294 302 274 311 281 l 343 298 b 455 348 393 328 428 348 b 474 327 468 348 474 344 b 465 285 474 312 469 295 l 360 24 b 356 9 357 17 356 13 b 372 0 356 3 360 0 l 442 0 b 465 17 455 0 459 3 l 559 251 b 655 351 577 298 624 351 b 670 343 664 351 670 348 b 638 285 670 330 638 325 b 690 239 638 256 660 239 b 750 318 724 239 750 268 b 675 395 750 360 729 395 b 586 350 638 395 608 374 b 566 330 573 336 572 330 b 553 361 559 330 564 340 b 490 393 543 380 521 393 b 347 348 432 393 377 364 b 312 333 328 338 320 333 b 308 337 310 333 308 334 b 315 359 308 343 312 351 l 387 537 b 392 553 390 544 392 549 b 383 562 392 559 389 562 z m 118 360 b 192 325 134 360 192 347 b 186 307 192 321 189 314 l 180 292 b 148 265 173 274 167 269 b 98 258 130 261 112 258 b 39 301 50 258 39 281 b 118 360 39 327 60 360 z m 272 240 b 292 151 285 240 292 164 b 212 30 292 88 253 30 b 196 48 200 30 196 37 b 207 92 196 59 202 78 b 264 230 207 94 209 94 b 272 240 266 238 268 240 z', + }, + ornamentTurn: { + x_min: 0, + x_max: 460, + y_min: 0, + y_max: 218, + ha: 218, + o: 'm 534 314 b 454 251 490 314 454 294 b 505 199 454 219 475 199 b 579 232 547 199 549 232 b 626 164 603 232 626 202 b 533 72 626 102 583 72 b 377 180 487 72 439 111 b 150 312 307 258 243 312 b 0 148 55 312 0 240 b 128 0 0 45 66 0 b 209 63 173 0 209 20 b 157 115 209 95 187 115 b 84 82 115 115 114 82 b 36 150 59 82 36 112 b 130 242 36 212 79 242 b 285 134 176 242 223 203 b 513 1 356 56 419 1 b 662 166 608 1 662 73 b 534 314 662 269 596 314 z', + }, + ornamentTurnSlash: { + x_min: 0, + x_max: 460, + y_min: -90, + y_max: 306, + ha: 396, + o: 'm 333 441 b 310 418 315 441 310 433 l 310 274 b 302 252 310 258 308 252 b 261 278 294 252 287 262 b 150 311 228 298 192 311 b 0 147 55 311 0 239 b 128 -1 0 43 66 -1 b 209 62 173 -1 209 19 b 157 114 209 94 187 114 b 84 81 115 114 114 81 b 36 148 59 81 36 111 b 130 240 36 210 79 240 b 285 128 176 240 222 197 b 307 79 304 108 307 105 l 307 -107 b 330 -130 307 -122 312 -130 b 353 -107 347 -130 353 -122 l 353 37 b 360 59 353 53 353 59 b 402 33 369 59 376 49 b 513 0 435 13 471 0 b 662 164 608 0 662 72 b 534 312 662 268 596 312 b 454 249 490 312 454 292 b 505 197 454 217 475 197 b 579 230 547 197 549 230 b 626 163 603 230 626 200 b 533 71 626 101 583 71 b 377 183 487 71 441 114 b 356 232 359 203 356 206 l 356 418 b 333 441 356 433 350 441 z', + }, + ornamentMordent: { + x_min: 1, + x_max: 729, + y_min: -73, + y_max: 319, + ha: 392, + o: 'm 546 265 l 546 459 l 501 459 l 501 216 l 459 167 b 439 167 454 160 445 160 b 302 327 387 228 310 317 b 258 353 291 338 282 351 b 226 340 245 353 238 348 l 20 107 b 1 73 12 98 1 84 b 30 59 1 65 9 59 b 88 94 53 59 73 79 b 144 143 107 109 124 127 b 176 161 158 154 168 161 b 197 144 183 161 189 156 l 323 10 b 351 0 328 3 340 0 b 377 9 361 0 372 3 b 498 114 392 17 475 94 l 498 -105 l 544 -105 l 544 153 b 562 160 550 157 556 160 b 585 144 569 160 576 156 b 710 10 590 135 697 24 b 737 0 716 3 727 0 b 765 9 749 0 759 3 b 1030 295 776 17 1011 274 l 1032 300 b 1050 328 1041 308 1050 318 b 1012 353 1050 343 1024 353 b 986 343 1002 353 994 348 b 854 190 971 330 871 206 b 828 176 842 180 835 176 b 802 190 818 176 809 183 b 681 333 791 202 696 320 b 645 353 668 344 657 353 b 613 340 634 353 626 350 b 580 304 600 330 590 315 z', + }, + ornamentShortTrill: { + x_min: 0, + x_max: 725, + y_min: 0, + y_max: 245, + ha: 245, + o: 'm 429 167 l 301 325 b 256 353 291 338 282 350 b 225 340 246 353 238 350 b 16 105 158 268 88 186 b 0 72 9 96 0 86 b 29 58 0 63 7 58 b 71 76 42 58 55 62 l 158 154 b 174 160 163 158 168 160 b 197 143 181 160 187 154 b 321 10 203 135 310 24 b 350 0 327 3 338 0 b 377 7 361 0 372 3 l 533 148 b 554 160 543 158 550 160 b 577 143 562 160 566 156 b 703 10 585 135 690 24 b 732 0 708 3 720 0 b 759 7 743 0 753 3 b 1024 294 769 16 1005 272 b 1044 327 1032 305 1044 321 b 1005 353 1044 341 1018 353 b 979 343 996 353 988 348 b 848 189 963 330 864 204 b 821 174 837 179 828 174 b 796 189 811 174 804 181 b 674 331 783 202 688 318 b 641 351 662 343 651 351 b 606 340 628 351 619 350 b 573 304 593 328 583 315 b 444 167 533 259 491 213 b 429 167 439 161 433 161 z', + }, + ornamentTremblement: { + x_min: 1, + x_max: 985, + y_min: 0, + y_max: 244, + ha: 244, + o: 'm 678 325 b 634 351 667 338 657 350 b 602 338 621 351 613 348 l 448 167 b 439 167 446 164 441 164 l 302 325 b 258 351 291 338 281 350 b 228 338 245 351 238 348 b 193 304 215 328 204 315 l 19 107 b 1 72 13 96 1 76 b 30 58 1 63 9 58 b 89 92 52 58 73 78 l 144 141 b 148 144 145 143 147 143 b 176 160 160 153 170 160 b 199 143 183 160 189 154 b 324 10 204 134 311 23 b 351 0 330 3 340 0 b 379 7 363 0 373 3 l 530 148 b 552 160 536 154 546 160 b 575 143 559 160 564 154 b 698 10 580 134 687 23 b 727 0 704 3 716 0 b 755 7 739 0 749 3 l 907 147 b 930 160 922 158 923 160 b 952 143 937 160 943 154 l 1077 10 b 1107 0 1084 3 1096 0 b 1133 7 1117 0 1128 3 b 1398 294 1143 16 1380 272 b 1418 327 1407 305 1418 321 b 1381 351 1418 343 1394 351 b 1354 341 1371 351 1362 348 b 1223 189 1338 328 1238 204 b 1195 174 1211 179 1202 174 b 1171 189 1185 174 1178 181 b 1048 331 1158 200 1063 318 b 1012 351 1035 343 1024 351 b 981 338 1002 351 994 350 b 948 304 968 328 958 315 b 827 166 907 258 865 212 b 815 166 824 163 818 163 b 678 325 760 226 732 264 z', + }, + ornamentPrecompAppoggTrill: { + x_min: 0, + x_max: 1119, + y_min: 0, + y_max: 481, + ha: 481, + o: 'm 1015 163 b 873 328 963 223 880 318 b 828 354 860 344 847 353 b 796 341 816 354 809 351 b 763 305 783 331 773 317 b 642 168 721 261 681 215 b 636 163 641 167 639 164 b 494 328 585 223 501 318 b 449 354 481 344 468 353 b 418 341 438 354 431 351 b 384 305 405 331 395 317 b 264 168 343 261 302 215 l 242 144 b 144 88 232 124 171 88 b 79 197 81 88 79 189 l 79 648 b 60 693 79 683 71 693 b 52 691 58 693 55 693 b 0 616 3 672 0 625 l 0 207 b 121 0 0 40 68 0 b 249 68 168 0 232 53 b 279 94 262 75 271 86 b 336 144 298 111 315 128 b 367 163 350 156 360 163 b 389 145 374 163 380 157 b 514 12 395 137 501 26 b 543 1 520 4 531 1 b 569 9 553 1 563 4 b 636 73 576 14 605 43 l 658 94 b 714 144 677 111 694 128 b 746 163 729 156 739 163 b 768 145 753 163 759 157 b 893 12 773 137 880 26 b 922 1 899 4 910 1 b 948 9 932 1 942 4 l 1012 71 b 1037 94 1022 78 1030 86 b 1092 144 1054 111 1073 128 b 1123 161 1106 156 1115 161 b 1146 145 1130 161 1136 157 b 1270 12 1152 137 1259 26 b 1299 1 1276 4 1287 1 b 1326 9 1310 1 1320 4 b 1591 297 1336 19 1572 275 b 1611 328 1600 307 1611 320 b 1574 354 1611 343 1585 354 b 1548 344 1565 354 1555 350 b 1416 192 1532 331 1431 206 b 1388 177 1404 181 1395 177 b 1365 190 1380 177 1371 184 b 1243 333 1352 203 1256 321 b 1205 354 1228 346 1217 354 b 1174 341 1195 354 1187 351 b 1140 305 1161 330 1152 317 z', + }, + ornamentPrecompSlideTrillDAnglebert: { + x_min: 2, + x_max: 1150, + y_min: -367, + y_max: 245, + ha: 612, + o: 'm 1058 160 b 916 327 1007 220 923 317 b 871 353 903 343 890 351 b 840 340 860 353 852 350 b 806 304 827 330 816 315 b 685 167 765 259 724 213 l 680 160 l 615 235 b 419 344 582 275 523 344 b 3 -144 258 344 3 26 b 4 -168 3 -153 3 -160 b 246 -482 24 -315 99 -422 b 458 -528 340 -521 410 -528 b 514 -526 485 -528 504 -526 b 552 -508 531 -526 552 -517 b 514 -497 552 -503 541 -498 l 503 -497 b 194 -390 432 -494 298 -488 b 69 -151 194 -390 69 -279 b 184 96 69 -60 128 27 b 328 183 202 118 258 183 b 477 96 413 183 454 118 b 559 10 510 62 552 19 b 588 0 566 3 576 0 b 613 7 598 0 609 3 b 723 112 622 14 681 73 b 789 161 733 122 776 161 b 811 144 796 161 802 156 b 936 10 816 135 923 24 b 965 0 942 3 953 0 b 991 7 975 0 985 3 b 1051 66 996 12 1022 37 b 1081 92 1063 73 1073 84 b 1136 143 1099 109 1117 127 b 1168 160 1151 154 1159 160 b 1191 144 1175 160 1181 156 b 1315 10 1197 135 1303 24 b 1344 0 1320 3 1332 0 b 1371 7 1355 0 1365 3 b 1636 295 1381 17 1617 274 b 1656 327 1644 305 1656 318 b 1619 353 1656 341 1630 353 b 1593 343 1610 353 1600 348 b 1460 190 1577 330 1476 204 b 1433 176 1449 180 1440 176 b 1410 189 1424 176 1416 183 b 1287 331 1397 202 1300 320 b 1250 353 1273 344 1261 353 b 1218 340 1240 353 1231 350 b 1185 304 1205 328 1197 315 z', + }, + ornamentPrecompSlideTrillBach: { + x_min: 0, + x_max: 1048, + y_min: -367, + y_max: 331, + ha: 698, + o: 'm 1038 477 l 979 477 l 979 238 l 912 160 b 769 327 858 220 775 317 b 724 353 756 343 743 351 b 693 340 713 353 706 350 b 660 304 680 330 670 315 b 539 167 618 259 577 213 b 533 161 536 166 534 163 b 390 327 480 220 396 317 b 346 353 377 343 364 351 l 340 353 b 308 340 330 353 321 350 b 275 304 295 330 285 315 b 117 122 220 243 168 186 b 0 -144 68 62 0 -48 b 1 -168 0 -153 0 -160 b 243 -482 22 -315 96 -422 b 455 -528 337 -521 408 -528 b 511 -526 482 -528 501 -526 b 549 -508 528 -526 549 -517 b 511 -497 549 -503 539 -498 l 500 -497 b 192 -390 429 -494 295 -488 b 68 -177 192 -390 84 -298 b 66 -151 66 -168 66 -160 b 189 105 66 -58 127 35 b 232 143 203 118 216 131 b 264 161 246 154 256 161 b 285 144 271 161 276 156 b 410 10 291 135 397 24 b 439 0 416 3 428 0 b 465 7 449 0 459 3 l 531 72 b 554 92 540 78 547 86 b 611 143 573 109 590 127 b 642 161 625 154 635 161 b 664 144 649 161 655 156 b 789 10 670 135 776 24 b 818 0 795 3 806 0 b 844 7 828 0 838 3 b 904 66 850 12 876 37 b 935 92 916 73 924 84 b 979 134 949 107 963 121 l 979 -88 l 1037 -88 l 1037 151 l 1044 144 b 1168 10 1050 135 1156 24 b 1197 0 1174 3 1185 0 b 1224 7 1208 0 1218 3 b 1489 295 1234 17 1470 274 b 1509 327 1498 305 1509 318 b 1472 353 1509 341 1483 353 b 1446 343 1463 353 1453 348 b 1313 190 1430 330 1329 204 b 1286 176 1302 180 1293 176 b 1263 189 1277 176 1269 183 b 1140 331 1250 202 1153 320 b 1103 353 1126 344 1115 353 b 1071 340 1093 353 1084 350 b 1038 304 1058 328 1050 315 z', + }, + ornamentPrecompTrillSuffixDandrieu: { + x_min: 0, + x_max: 949, + y_min: 0, + y_max: 381, + ha: 381, + o: 'm 1367 314 b 1250 521 1367 419 1318 482 b 1107 549 1211 537 1145 549 b 1083 546 1096 549 1087 549 b 1066 528 1071 540 1066 534 b 1079 520 1066 524 1070 520 b 1323 351 1187 517 1323 487 b 1201 171 1323 269 1260 219 b 1194 166 1201 171 1198 168 b 1056 327 1142 226 1063 317 b 1011 353 1043 343 1030 351 b 979 340 999 353 992 350 b 946 304 966 330 956 315 b 825 167 904 259 864 213 l 821 161 b 678 327 768 222 685 317 b 634 353 665 343 652 351 b 602 340 622 353 615 350 b 569 304 589 330 579 315 b 448 167 527 259 487 213 l 444 161 b 301 327 390 222 308 317 b 256 353 288 343 275 351 b 225 340 245 353 238 350 b 192 304 212 330 202 315 b 71 167 150 259 109 213 b 17 105 52 147 36 127 b 0 73 10 98 0 84 b 29 58 0 65 7 58 b 86 92 56 59 72 79 b 143 143 105 109 122 127 b 174 161 157 154 167 161 b 196 144 181 161 187 156 b 321 10 202 135 308 24 b 350 0 327 3 338 0 b 376 7 360 0 370 3 b 485 112 384 14 444 73 b 552 161 495 122 539 161 b 573 144 559 161 564 156 b 698 10 579 135 685 24 b 727 0 704 3 716 0 b 753 7 737 0 747 3 b 863 112 762 14 821 73 b 929 161 873 122 916 161 b 950 144 936 161 942 156 b 1076 10 956 135 1063 24 b 1104 0 1081 3 1093 0 b 1130 7 1115 0 1125 3 b 1236 108 1139 14 1195 69 b 1367 314 1297 160 1367 233 z', + }, + ornamentPrecompDoubleCadenceUpperPrefix: { + x_min: 0, + x_max: 1278, + y_min: 0, + y_max: 247, + ha: 247, + o: 'm 1801 356 b 1776 346 1793 356 1783 351 b 1642 192 1760 333 1659 206 b 1614 177 1630 181 1621 177 b 1591 190 1606 177 1597 184 b 1469 334 1578 203 1482 323 b 1430 356 1453 347 1441 356 b 1398 343 1420 356 1411 353 b 1365 307 1385 331 1377 318 l 1240 164 b 1097 330 1187 226 1104 320 b 1053 356 1084 346 1071 354 b 1021 343 1041 356 1034 353 b 988 307 1008 333 998 318 b 865 168 946 262 904 216 l 861 163 b 717 330 808 223 724 320 b 672 356 704 346 691 354 b 641 343 661 356 654 353 b 608 307 628 333 618 318 b 485 168 566 262 524 216 l 455 134 b 284 46 409 88 351 46 b 16 285 148 46 32 265 b 3 295 9 292 4 295 b 0 291 1 295 0 292 b 1 285 0 288 1 285 b 308 0 42 190 157 0 b 530 120 415 1 482 63 b 559 144 539 128 549 137 b 590 163 573 156 583 163 b 612 145 598 163 603 157 b 739 10 618 137 724 24 b 768 0 744 3 756 0 b 793 7 778 0 788 3 b 903 114 802 14 861 75 l 939 144 b 971 163 953 156 963 163 b 992 145 978 163 984 157 b 1119 10 998 137 1106 24 b 1148 0 1125 3 1136 0 b 1174 7 1158 0 1168 3 b 1284 114 1182 14 1241 75 b 1316 144 1282 115 1312 141 b 1348 161 1331 156 1339 161 b 1371 145 1355 161 1361 157 b 1496 10 1377 137 1485 24 b 1525 0 1502 3 1513 0 b 1552 7 1536 0 1547 3 b 1819 298 1562 17 1800 276 b 1840 330 1829 308 1840 320 b 1832 344 1840 334 1837 340 b 1801 356 1820 351 1810 356 z', + }, + ornamentPrecompDoubleCadenceUpperPrefixTurn: { + x_min: 0, + x_max: 1277, + y_min: -62, + y_max: 333, + ha: 395, + o: 'm 1273 202 l 1273 480 l 1230 480 l 1230 174 l 1097 328 b 1053 354 1084 344 1071 353 b 1021 341 1041 354 1034 351 b 988 305 1008 331 998 317 b 865 167 945 261 904 215 l 861 161 b 717 328 808 222 724 318 b 672 354 704 344 691 353 b 641 341 661 354 654 351 b 608 305 628 331 618 317 b 485 167 564 261 524 215 b 455 132 474 156 465 144 b 284 45 410 88 350 45 b 14 284 148 45 30 264 b 3 294 9 291 4 294 b 0 289 1 294 0 291 b 1 284 0 287 1 284 b 308 -1 42 189 157 -1 b 530 118 415 0 481 62 b 557 143 539 127 547 135 b 590 161 572 154 582 161 b 612 144 598 161 603 156 b 737 9 618 135 724 24 b 768 -1 743 1 755 -1 b 793 6 778 -1 788 1 b 903 112 802 13 861 73 l 937 143 b 971 161 953 154 963 161 b 992 144 978 161 984 156 b 1117 9 998 135 1104 24 b 1148 -1 1123 1 1136 -1 b 1174 6 1158 -1 1168 1 l 1230 60 l 1230 -89 l 1273 -89 l 1273 102 l 1283 112 b 1348 160 1295 125 1332 160 b 1371 144 1355 160 1361 156 b 1496 9 1377 135 1483 24 b 1525 -1 1502 1 1513 -1 b 1552 6 1536 -1 1547 1 b 1819 297 1562 16 1800 275 b 1839 328 1827 307 1839 320 b 1801 354 1839 343 1813 354 b 1776 344 1793 354 1783 350 b 1642 190 1760 331 1657 206 b 1614 176 1630 180 1621 176 b 1591 189 1606 176 1597 183 b 1467 333 1578 203 1480 321 b 1430 354 1453 346 1441 354 b 1398 341 1420 354 1411 351 b 1365 305 1385 330 1377 317 z', + }, + ornamentPrecompTrillLowerSuffix: { + x_min: 0, + x_max: 859, + y_min: -222, + y_max: 246, + ha: 468, + o: 'm 1164 217 b 1031 351 1138 259 1063 351 b 1011 337 1020 351 1024 347 b 828 167 952 291 886 217 l 824 164 b 683 328 772 225 690 318 b 638 354 670 344 657 353 b 606 341 626 354 619 351 b 573 305 593 331 583 317 b 451 167 530 261 490 215 l 446 161 b 302 328 393 222 310 318 b 258 354 289 344 276 353 b 226 341 246 354 239 351 b 193 305 213 331 203 317 b 71 167 150 261 109 215 b 17 105 52 147 36 127 b 0 73 10 98 0 84 b 29 58 0 65 7 58 b 86 92 56 59 72 79 b 143 143 105 109 122 127 b 176 161 157 154 168 161 b 197 144 183 161 189 156 b 323 9 203 135 310 23 b 353 -1 328 1 340 -1 b 379 6 363 -1 373 1 b 488 112 387 13 446 73 l 523 143 b 556 161 539 154 549 161 b 577 144 563 161 569 156 b 703 9 583 135 690 23 b 733 -1 708 1 721 -1 b 759 6 743 -1 753 1 b 868 112 768 13 827 73 b 955 183 878 122 943 183 b 1081 107 965 183 1031 153 b 1156 -89 1128 63 1156 6 l 1156 -102 b 948 -297 1156 -204 1048 -297 b 806 -271 904 -297 850 -282 l 792 -266 b 801 -288 792 -268 795 -282 b 948 -320 809 -297 880 -320 b 1237 -50 1092 -320 1237 -199 b 1164 217 1237 75 1218 122 z', + }, + brassScoop: { + x_min: 1, + x_max: 320, + y_min: -373, + y_max: 13, + ha: 386, + o: 'm 35 -537 b 461 -12 194 -518 461 -289 b 438 19 461 13 451 19 b 410 -9 425 19 413 9 b 35 -425 357 -366 92 -403 b 1 -482 13 -433 1 -438 l 1 -505 b 26 -537 1 -526 3 -537 z', + }, + brassDoitMedium: { + x_min: 0, + x_max: 489, + y_min: -40, + y_max: 346, + ha: 386, + o: 'm 33 -58 b 704 468 255 -58 683 186 b 681 498 704 494 693 498 b 654 471 668 498 658 488 b 33 55 550 118 91 76 b 0 -3 12 46 0 42 l 0 -26 b 24 -58 0 -46 1 -58 z', + }, + brassFallLipShort: { + x_min: 1, + x_max: 293, + y_min: -345, + y_max: 42, + ha: 387, + o: 'm 22 60 b 1 35 4 60 1 52 l 1 6 b 26 -50 3 -40 10 -43 b 32 -52 27 -50 30 -50 b 376 -469 85 -73 327 -111 b 400 -497 379 -487 387 -497 b 422 -467 412 -497 422 -491 b 32 60 422 -187 177 40 z', + }, + brassLiftMedium: { + x_min: 0, + x_max: 811, + y_min: 0, + y_max: 852, + ha: 852, + o: 'm 1138 1220 b 1135 1225 1135 1223 1135 1224 b 1129 1227 1133 1227 1130 1227 b 1117 1207 1122 1227 1117 1212 l 1117 1201 b 1109 1164 1117 1187 1117 1172 b 1100 1156 1107 1161 1104 1158 b 959 1104 1058 1128 995 1140 b 929 1032 936 1081 929 1056 b 932 1007 929 1024 930 1015 b 923 976 932 995 930 985 l 914 971 b 773 919 873 942 809 955 b 743 847 750 896 743 870 b 746 821 743 838 744 829 b 737 791 746 809 744 799 l 729 783 b 588 733 687 756 624 769 b 557 661 564 710 557 684 b 560 635 557 652 559 644 b 552 605 560 624 559 612 l 543 598 b 402 547 501 570 438 583 b 372 475 379 524 372 498 b 374 449 372 467 373 458 b 366 419 374 438 373 426 l 357 412 b 216 361 315 384 252 397 b 186 289 193 338 186 312 b 189 264 186 281 187 272 b 180 233 189 252 187 240 b 171 226 177 232 174 229 b 30 176 130 199 66 212 b 0 104 7 153 0 128 b 33 0 0 88 14 0 b 49 17 40 0 49 10 b 71 63 52 35 56 49 b 212 115 102 95 154 59 b 239 186 230 134 239 160 b 236 210 239 194 238 202 b 256 249 239 225 243 236 b 397 301 288 281 340 245 b 425 372 416 320 425 346 b 422 396 425 380 423 387 b 442 435 425 410 429 422 b 583 487 474 467 526 431 b 611 557 602 505 611 531 b 608 582 611 566 609 573 b 628 621 611 596 615 608 b 769 672 660 652 711 618 b 796 743 788 691 796 717 b 793 768 796 752 795 759 b 814 806 796 782 801 793 b 955 858 845 838 897 804 b 982 929 973 877 982 903 b 979 953 982 937 981 945 b 999 992 982 968 986 979 b 1140 1045 1031 1024 1083 989 b 1168 1116 1161 1066 1168 1090 b 1138 1220 1168 1162 1145 1207 z', + }, + brassFallRoughMedium: { + x_min: 0, + x_max: 811, + y_min: 0, + y_max: 852, + ha: 852, + o: 'm 30 1220 b 0 1116 23 1207 0 1162 b 27 1045 0 1090 7 1066 b 168 992 85 989 137 1024 b 189 953 181 979 186 968 b 186 929 187 945 186 937 b 213 858 186 903 194 877 b 354 806 271 804 323 838 b 374 768 367 793 372 782 b 372 743 373 759 372 752 b 399 672 372 717 380 691 b 540 621 456 618 508 652 b 560 582 553 608 557 596 b 557 557 559 573 557 566 b 585 487 557 531 566 505 b 726 435 642 431 694 467 b 746 396 739 422 743 410 b 743 372 744 387 743 380 b 770 301 743 346 752 320 b 912 249 828 245 880 281 b 932 210 924 236 929 225 b 929 186 930 202 929 194 b 956 115 929 160 937 134 b 1097 63 1014 59 1066 95 b 1119 17 1112 49 1116 35 b 1135 0 1119 10 1128 0 b 1168 104 1153 0 1168 91 b 1138 176 1168 128 1161 153 b 996 226 1102 212 1038 199 b 988 233 994 229 991 232 b 979 264 981 240 979 252 b 982 289 981 272 982 281 b 952 361 982 312 975 338 b 811 412 916 397 852 384 l 802 419 b 793 449 795 426 793 438 b 796 475 795 458 796 467 b 766 547 796 498 789 524 b 625 598 730 583 667 570 l 616 605 b 608 635 609 612 608 624 b 611 661 609 644 611 652 b 580 733 611 684 603 710 b 439 783 544 769 481 756 l 431 791 b 422 821 423 799 422 809 b 425 847 423 829 425 838 b 395 919 425 870 418 896 b 253 971 359 955 295 942 l 245 976 b 236 1007 238 985 236 995 b 239 1032 238 1015 239 1024 b 209 1104 239 1056 232 1081 b 68 1156 173 1140 109 1128 b 59 1164 63 1158 60 1161 b 50 1201 50 1172 50 1187 l 50 1207 b 39 1227 50 1212 46 1227 b 33 1225 37 1227 35 1227 b 30 1220 33 1224 33 1223 z', + }, + brassBend: { + x_min: 0, + x_max: 392, + y_min: 0, + y_max: 282, + ha: 282, + o: 'm 282 0 b 552 72 369 0 456 23 b 564 92 560 75 564 84 l 564 383 b 541 406 564 395 554 406 b 518 383 528 406 518 395 l 518 107 b 282 46 435 65 357 46 b 46 107 207 46 130 65 l 46 383 b 23 406 46 395 36 406 b 0 383 10 406 0 395 l 0 92 b 13 72 0 84 4 75 b 282 0 108 23 196 0 z', + }, + brassMuteClosed: { + x_min: 0, + x_max: 272, + y_min: 0, + y_max: 272, + ha: 272, + o: 'm 392 219 l 219 219 l 219 392 l 173 392 l 173 219 l 0 219 l 0 173 l 173 173 l 173 0 l 219 0 l 219 173 l 392 173 z', + }, + brassMuteOpen: { + x_min: 0, + x_max: 304, + y_min: 0, + y_max: 304, + ha: 304, + o: 'm 219 0 b 438 219 340 0 438 98 b 219 438 438 340 340 438 b 0 219 98 438 0 340 b 219 0 0 98 98 0 z m 219 392 b 392 219 314 392 392 314 b 219 46 392 124 314 46 b 46 219 124 46 46 124 b 219 392 46 314 124 392 z', + }, + brassFlip: { + x_min: 0, + x_max: 379, + y_min: 0, + y_max: 282, + ha: 282, + o: 'm 523 0 b 541 9 530 0 536 3 b 546 22 544 13 546 17 b 536 42 546 29 541 36 l 36 402 b 23 406 33 405 27 406 b 0 383 12 406 0 395 l 0 23 b 23 0 0 10 10 0 b 46 23 36 0 46 10 l 46 337 l 508 4 b 523 0 513 1 517 0 z', + }, + brassJazzTurn: { + x_min: 0, + x_max: 620, + y_min: 0, + y_max: 245, + ha: 245, + o: 'm 792 190 b 765 176 780 179 772 176 b 740 190 755 176 747 183 b 629 325 727 202 644 312 b 593 347 616 338 605 347 b 562 334 583 346 575 344 b 528 298 549 323 539 310 l 406 176 b 389 168 406 176 399 168 b 374 176 384 168 379 170 b 245 325 360 192 245 325 b 200 353 232 343 219 351 b 168 340 190 353 181 350 l 17 156 b 0 121 10 147 0 132 b 16 107 0 114 4 108 b 84 143 26 107 76 137 b 118 160 92 150 108 160 b 141 143 125 160 131 154 b 265 10 147 135 253 24 b 294 0 271 3 282 0 b 321 7 305 0 315 3 b 498 160 321 7 478 158 b 521 143 505 160 513 154 b 647 10 528 135 635 24 b 675 0 652 3 664 0 b 703 7 687 0 697 3 b 874 186 713 16 855 164 b 893 220 881 196 893 212 b 873 245 890 235 883 243 b 796 194 847 245 815 213 z', + }, + brassSmear: { + x_min: 1, + x_max: 306, + y_min: 0, + y_max: 170, + ha: 170, + o: 'm 193 79 b 308 0 219 50 264 0 b 439 117 396 0 438 102 b 439 120 439 118 439 118 l 441 125 b 441 128 441 127 441 127 b 433 141 441 135 439 141 b 416 130 429 141 423 137 b 343 94 390 107 370 94 b 269 153 315 94 294 121 l 265 158 b 144 245 239 190 180 245 b 6 134 62 245 10 143 b 1 114 3 125 1 118 b 7 107 1 108 4 107 b 36 122 13 107 22 112 b 92 151 55 137 65 151 b 183 89 125 151 161 112 b 189 84 184 88 187 86 z', + }, + stringsDownBow: { + x_min: 0, + x_max: 312, + y_min: 0, + y_max: 318, + ha: 318, + o: 'm 37 458 b 0 420 17 458 0 441 l 0 17 b 17 0 0 7 9 0 l 37 0 b 55 17 46 0 55 7 l 55 253 b 225 278 55 269 140 278 b 395 253 310 278 395 269 l 395 17 b 413 0 395 7 403 0 l 432 0 b 449 17 441 0 449 7 l 449 420 b 412 458 449 441 432 458 z', + }, + stringsUpBow: { + x_min: 1, + x_max: 249, + y_min: 1, + y_max: 495, + ha: 494, + o: 'm 181 1 b 206 22 193 1 203 10 l 359 683 l 359 688 b 338 713 359 700 351 710 l 333 713 b 308 694 321 713 311 706 l 180 140 l 53 694 b 27 713 49 706 39 713 l 22 713 b 1 690 10 710 1 700 b 3 683 1 687 1 685 l 154 22 b 181 1 157 10 167 1 z', + }, + stringsHarmonic: { + x_min: 0, + x_max: 200, + y_min: 0, + y_max: 200, + ha: 200, + o: 'm 288 144 b 144 288 288 225 223 288 b 0 144 65 288 0 225 b 144 0 0 65 65 0 b 288 144 223 0 288 65 z m 144 249 b 249 144 203 249 249 203 b 144 39 249 86 203 39 b 39 144 86 39 39 86 b 144 249 39 203 86 249 z', + }, + pluckedSnapPizzicatoAbove: { + x_min: 0, + x_max: 200, + y_min: 0, + y_max: 300, + ha: 300, + o: 'm 0 144 b 144 0 0 63 65 0 b 288 144 223 0 288 63 b 167 285 288 215 235 275 l 167 432 l 121 432 l 121 285 b 0 144 52 275 0 215 z m 121 246 l 121 144 l 167 144 l 167 246 b 249 144 213 236 249 193 b 144 39 249 85 202 39 b 39 144 85 39 39 85 b 121 246 39 193 73 236 z', + }, + pluckedSnapPizzicatoBelow: { + x_min: 0, + x_max: 200, + y_min: 0, + y_max: 300, + ha: 300, + o: 'm 288 288 b 144 432 288 369 223 432 b 0 288 65 432 0 369 b 121 145 0 216 52 157 l 121 0 l 167 0 l 167 145 b 288 288 235 157 288 216 z m 167 186 l 167 288 l 121 288 l 121 186 b 39 288 75 196 39 238 b 144 393 39 347 86 393 b 249 288 203 393 249 347 b 167 186 249 238 215 196 z', + }, + pluckedLeftHandPizzicato: { + x_min: 0, + x_max: 272, + y_min: 0, + y_max: 272, + ha: 272, + o: 'm 392 219 l 219 219 l 219 392 l 173 392 l 173 219 l 0 219 l 0 173 l 173 173 l 173 0 l 219 0 l 219 173 l 392 173 z', + }, + keyboardPedalPed: { + x_min: 0, + x_max: 1019, + y_min: -8, + y_max: 555, + ha: 563, + o: 'm 413 799 b 179 749 327 798 261 789 b 0 517 107 713 0 632 b 122 376 0 454 37 376 b 240 540 189 376 240 452 b 225 586 240 579 233 586 b 204 549 213 586 212 573 b 138 480 199 527 181 480 b 85 549 96 480 85 517 l 85 554 b 353 762 89 690 230 762 b 373 752 364 762 373 760 b 351 708 373 740 360 723 b 274 546 330 675 274 585 b 353 416 274 508 333 444 b 412 304 372 390 412 351 b 382 228 412 275 403 256 b 334 190 363 202 361 200 b 147 29 271 167 147 88 b 196 -12 147 4 171 -12 b 343 108 239 -12 279 33 l 363 132 b 387 150 370 141 376 150 b 543 -4 445 150 467 -4 b 631 42 567 -4 586 0 l 668 78 b 685 89 674 84 680 89 b 696 75 688 89 690 86 b 809 -9 717 29 753 -9 b 946 66 854 -9 894 13 b 988 107 971 92 981 107 b 1002 89 994 107 996 99 b 1152 -4 1030 36 1077 -4 b 1329 248 1238 -4 1329 82 b 792 717 1329 556 1047 665 b 766 720 785 719 775 720 b 747 703 752 720 747 711 b 780 680 747 693 756 685 b 1223 222 1028 621 1223 504 b 1152 39 1223 122 1205 39 b 1073 229 1104 39 1073 132 b 1132 423 1073 314 1086 377 b 1142 442 1140 432 1142 436 b 1126 458 1142 451 1136 458 b 1093 446 1119 458 1109 455 b 975 216 1022 408 975 337 l 975 190 b 943 121 975 160 972 150 b 852 69 899 76 877 69 b 776 148 816 69 786 117 b 773 163 775 154 773 158 b 786 177 773 167 776 170 l 801 187 b 937 366 867 235 937 284 b 844 454 937 422 900 454 b 665 217 711 454 665 331 b 671 153 665 197 667 176 l 671 147 b 662 134 671 143 670 140 b 605 111 639 118 625 111 b 521 160 572 111 546 135 b 451 203 497 184 474 197 b 426 212 435 207 426 206 b 436 230 426 216 429 220 b 510 389 464 269 510 340 b 429 521 510 435 480 462 b 369 629 387 570 369 599 b 402 720 369 648 384 691 b 462 763 425 759 446 763 b 611 624 540 763 611 704 b 564 575 611 592 590 575 b 501 602 540 575 520 582 b 474 622 492 611 487 622 b 459 603 465 622 459 615 b 603 471 459 570 510 471 b 711 588 670 471 711 524 b 422 799 711 742 554 799 z m 815 403 b 848 343 838 403 848 383 b 780 226 848 295 824 261 b 765 217 773 220 768 217 b 759 228 762 217 759 220 b 756 282 757 245 756 262 b 815 403 756 346 772 403 z m 1405 124 b 1344 62 1369 124 1344 98 b 1405 0 1344 26 1369 0 b 1467 62 1441 0 1467 26 b 1405 124 1467 98 1441 124 z', + }, + keyboardPedalUp: { + x_min: 0, + x_max: 450, + y_min: 0, + y_max: 450, + ha: 450, + o: 'm 582 396 b 516 367 554 396 533 384 b 465 340 495 347 487 340 l 458 340 b 412 377 432 340 412 348 b 432 409 412 387 419 396 l 438 415 b 490 429 451 428 464 429 b 575 501 534 429 575 452 b 501 575 575 541 541 575 b 429 490 452 575 429 534 b 415 438 429 464 428 451 l 409 432 b 377 412 396 419 387 412 b 340 458 348 412 340 432 l 340 465 b 367 516 340 487 347 495 b 396 582 384 533 396 554 b 324 648 396 625 363 648 b 252 582 285 648 252 625 b 281 516 252 554 264 533 b 308 465 301 495 308 487 l 308 458 b 271 412 308 432 300 412 b 239 432 261 412 252 419 l 233 438 b 219 490 220 451 219 464 b 147 575 219 534 196 575 b 73 501 107 575 73 541 b 158 429 73 452 114 429 b 210 415 184 429 197 428 l 216 409 b 236 377 229 396 236 387 b 190 340 236 348 216 340 l 183 340 b 132 367 161 340 153 347 b 66 396 115 384 94 396 b 0 324 23 396 0 363 b 66 252 0 285 23 252 b 132 281 94 252 115 264 b 183 308 153 301 161 308 l 190 308 b 236 271 216 308 236 300 b 216 239 236 261 229 252 l 210 233 b 158 219 197 220 184 219 b 73 147 114 219 73 196 b 147 73 73 107 107 73 b 219 158 196 73 219 114 b 233 210 219 184 220 197 l 239 216 b 271 236 252 229 261 236 b 308 190 300 236 308 216 l 308 183 b 281 132 308 161 301 153 b 252 66 264 115 252 94 b 324 0 252 23 285 0 b 396 66 363 0 396 23 b 367 132 396 94 384 115 b 340 183 347 153 340 161 l 340 190 b 377 236 340 216 348 236 b 409 216 387 236 396 229 l 415 210 b 429 158 428 197 429 184 b 501 73 429 114 452 73 b 575 147 541 73 575 107 b 490 219 575 196 534 219 b 438 233 464 219 451 220 l 432 239 b 412 271 419 252 412 261 b 458 308 412 300 432 308 l 465 308 b 516 281 487 308 495 301 b 582 252 533 264 554 252 b 648 324 625 252 648 285 b 582 396 648 363 625 396 z m 324 271 b 271 324 291 271 271 291 b 324 377 271 357 291 377 b 377 324 357 377 377 357 b 324 271 377 291 357 271 z', + }, + pictChokeCymbal: { + x_min: 1, + x_max: 152, + y_min: 2, + y_max: 251, + ha: 249, + o: 'm 104 361 b 1 271 42 361 1 321 b 82 190 1 222 35 190 b 122 160 118 190 122 160 b 125 144 124 154 125 150 b 102 88 125 124 115 105 b 37 32 78 56 40 35 b 26 17 32 29 26 26 l 27 16 b 37 3 29 6 33 3 b 181 102 85 3 158 66 b 219 239 210 147 219 197 l 219 249 b 104 361 219 317 170 361 z', + }, + wiggleArpeggiatoUp: { + x_min: -33, + x_max: 292, + y_min: 0, + y_max: 119, + ha: 119, + o: 'm 130 171 b -39 68 16 171 -14 91 b -48 53 -45 62 -48 58 b -29 42 -48 46 -39 42 b -10 46 -23 42 -16 43 b 56 63 12 56 29 63 b 248 0 121 63 135 0 b 419 127 361 0 410 104 b 420 132 420 130 420 131 b 412 140 420 137 416 140 b 386 130 403 140 392 134 b 334 107 367 117 353 107 b 318 108 330 107 324 107 b 240 138 289 112 265 128 b 130 171 209 153 168 171 z', + }, + arrowheadBlackUp: { + x_min: 0, + x_max: 228, + y_min: 0, + y_max: 299, + ha: 299, + o: 'm 166 431 b 0 20 111 274 0 30 b 16 0 0 12 6 0 l 17 1 b 166 50 43 16 160 50 b 310 1 171 50 289 13 l 311 0 b 328 20 321 0 328 12 b 166 431 328 30 220 274 z', + }, + arrowheadBlackDown: { + x_min: 0, + x_max: 228, + y_min: 0, + y_max: 299, + ha: 299, + o: 'm 166 0 b 328 410 220 157 328 400 b 311 431 328 419 321 431 l 310 429 b 166 380 289 418 171 380 b 17 429 160 380 43 415 l 16 431 b 0 410 6 431 0 419 b 166 0 0 400 111 157 z', + }, + arpeggiatoUp: { + x_min: 1, + x_max: 229, + y_min: 7, + y_max: 1511, + ha: 1504, + o: 'm 219 1848 l 330 1848 l 164 2176 l 1 1848 l 121 1848 b 92 1778 115 1822 101 1800 l 89 1773 b 59 1668 75 1741 59 1702 b 96 1555 59 1614 76 1580 b 99 1551 98 1554 99 1551 l 102 1547 b 124 1496 115 1531 124 1515 b 122 1482 124 1492 124 1488 b 92 1404 118 1453 102 1428 b 59 1293 78 1372 59 1332 b 105 1172 59 1234 81 1198 b 124 1120 118 1155 124 1143 l 122 1113 b 122 1110 122 1113 122 1112 b 92 1032 118 1081 102 1057 b 59 922 78 1001 59 960 b 115 792 59 855 86 816 b 124 760 121 782 124 773 b 122 744 124 756 124 750 b 92 667 118 716 102 693 b 59 556 78 635 59 595 b 108 433 59 495 82 458 b 124 389 117 420 124 408 b 122 374 124 384 124 379 b 92 298 118 346 102 323 l 89 292 b 59 186 75 261 59 222 b 163 19 59 73 140 42 b 177 10 168 13 173 10 b 189 29 184 10 189 19 b 184 48 189 35 187 42 b 167 114 174 69 167 85 b 230 305 167 179 229 193 b 181 423 230 357 209 396 b 167 484 173 442 167 458 b 230 675 167 547 229 563 b 179 796 230 729 206 769 b 167 850 171 812 167 827 b 230 1040 167 913 229 929 b 183 1158 230 1092 209 1130 b 167 1220 173 1178 167 1194 b 230 1411 167 1284 229 1300 b 186 1526 230 1462 210 1499 b 167 1594 176 1529 167 1584 b 230 1786 167 1659 229 1673 b 219 1848 230 1809 226 1829 z', + }, + arpeggiatoDown: { + x_min: 1, + x_max: 229, + y_min: -4, + y_max: 1500, + ha: 1504, + o: 'm 219 323 b 230 384 226 341 230 361 b 167 576 229 497 167 511 b 186 644 167 586 176 641 b 230 759 210 671 230 708 b 167 950 229 870 167 886 b 183 1012 167 976 173 992 b 230 1130 209 1040 230 1079 b 167 1320 229 1241 167 1257 b 179 1374 167 1344 171 1358 b 230 1495 206 1401 230 1441 b 167 1686 229 1607 167 1623 b 181 1747 167 1712 173 1728 b 230 1865 209 1774 230 1813 b 167 2056 229 1977 167 1992 b 184 2123 167 2085 174 2101 b 189 2141 187 2128 189 2136 b 177 2160 189 2151 184 2160 b 163 2151 173 2160 168 2157 b 59 1984 140 2128 59 2097 b 89 1878 59 1948 75 1909 l 92 1872 b 122 1796 102 1848 118 1824 b 124 1781 124 1791 124 1786 b 108 1737 124 1763 117 1750 b 59 1614 82 1712 59 1675 b 92 1503 59 1575 78 1535 b 122 1426 102 1477 118 1454 b 124 1410 124 1420 124 1414 b 115 1378 124 1397 121 1388 b 59 1248 86 1354 59 1315 b 92 1138 59 1210 78 1169 b 122 1060 102 1113 118 1089 b 122 1057 122 1058 122 1058 l 124 1050 b 105 998 124 1027 118 1015 b 59 877 81 972 59 936 b 92 766 59 838 78 798 b 122 688 102 742 118 717 b 124 674 124 683 124 678 b 102 624 124 655 115 639 l 99 619 b 96 615 99 619 98 616 b 59 503 76 590 59 556 b 89 397 59 468 75 429 l 92 392 b 121 323 101 370 115 348 l 1 323 l 164 -6 l 330 323 z', + }, + repeat1Bar: { + x_min: 0, + x_max: 532, + y_min: -250, + y_max: 279, + ha: 529, + o: 'm 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z m 89 288 b 0 197 40 288 0 248 b 89 108 0 148 40 108 b 180 197 140 108 180 148 b 89 288 180 248 140 288 z m 675 -71 b 586 -161 626 -71 586 -111 b 675 -251 586 -210 626 -251 b 766 -161 726 -251 766 -210 b 675 -71 766 -111 726 -71 z', + }, + repeat2Bars: { + x_min: 0, + x_max: 762, + y_min: -250, + y_max: 279, + ha: 529, + o: 'm 1090 380 b 1097 395 1094 386 1097 390 b 1089 402 1097 399 1094 402 l 936 402 b 910 380 927 402 920 393 l 336 -340 b 331 -350 333 -343 331 -347 b 343 -360 331 -356 336 -360 l 485 -360 b 516 -340 498 -360 508 -348 z m 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z m 89 288 b 0 197 40 288 0 248 b 89 108 0 148 40 108 b 180 197 140 108 180 148 b 89 288 180 248 140 288 z m 1007 -71 b 917 -161 958 -71 917 -111 b 1007 -251 917 -210 958 -251 b 1097 -161 1057 -251 1097 -210 b 1007 -71 1097 -111 1057 -71 z', + }, + repeat4Bars: { + x_min: 0, + x_max: 1232, + y_min: -250, + y_max: 279, + ha: 529, + o: 'm 1767 380 b 1774 395 1771 386 1774 390 b 1765 402 1774 399 1771 402 l 1613 402 b 1587 380 1604 402 1597 393 l 1012 -340 b 1008 -350 1009 -343 1008 -347 b 1020 -360 1008 -356 1012 -360 l 1162 -360 b 1192 -340 1175 -360 1185 -348 z m 1436 380 b 1443 395 1440 386 1443 390 b 1434 402 1443 399 1440 402 l 1282 402 b 1256 380 1273 402 1266 393 l 681 -340 b 677 -350 678 -343 677 -347 b 688 -360 677 -356 681 -360 l 831 -360 b 861 -340 844 -360 854 -348 z m 1090 380 b 1097 395 1094 386 1097 390 b 1089 402 1097 399 1094 402 l 936 402 b 910 380 927 402 920 393 l 336 -340 b 331 -350 333 -343 331 -347 b 343 -360 331 -356 336 -360 l 485 -360 b 516 -340 498 -360 508 -348 z m 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z m 89 288 b 0 197 40 288 0 248 b 89 108 0 148 40 108 b 180 197 140 108 180 148 b 89 288 180 248 140 288 z m 1683 -71 b 1594 -161 1634 -71 1594 -111 b 1683 -251 1594 -210 1634 -251 b 1774 -161 1734 -251 1774 -210 b 1683 -71 1774 -111 1734 -71 z', + }, + repeatBarSlash: { + x_min: 0, + x_max: 532, + y_min: -250, + y_max: 279, + ha: 529, + o: 'm 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z', + }, + csymDiminished: { + x_min: 0, + x_max: 473, + y_min: 0, + y_max: 473, + ha: 473, + o: 'm 341 681 b 0 341 153 681 0 530 b 341 0 0 153 153 0 b 681 341 530 0 681 153 b 341 681 681 530 530 681 z m 341 618 b 618 341 495 618 618 495 b 341 63 618 189 494 63 b 63 341 187 63 63 187 b 341 618 63 494 189 618 z', + }, + csymHalfDiminished: { + x_min: -16, + x_max: 488, + y_min: -15, + y_max: 489, + ha: 504, + o: 'm 703 660 l 658 704 l 557 603 b 340 681 498 652 422 681 b -1 341 151 681 -1 530 b 78 124 -1 259 29 183 l -23 23 l 22 -22 l 122 79 b 340 0 181 30 258 0 b 680 341 528 0 680 153 b 602 559 680 423 651 500 z m 62 341 b 340 618 62 494 187 618 b 513 559 403 618 464 598 l 122 168 b 62 341 84 217 62 278 z m 616 341 b 340 63 616 189 492 63 b 167 124 276 63 216 85 l 557 514 b 616 341 596 465 616 405 z', + }, + csymAugmented: { + x_min: 0, + x_max: 395, + y_min: 1, + y_max: 396, + ha: 395, + o: 'm 569 318 l 317 318 l 317 570 l 253 570 l 253 318 l 0 318 l 0 255 l 253 255 l 253 1 l 317 1 l 317 255 l 569 255 z', + }, + csymMajorSeventh: { + x_min: 0, + x_max: 558, + y_min: 1, + y_max: 477, + ha: 476, + o: 'm 402 687 l 0 1 l 804 1 z m 402 562 l 693 65 l 111 65 z', + }, + csymMinor: { + x_min: 0, + x_max: 325, + y_min: 216, + y_max: 260, + ha: 44, + o: 'm 468 374 l 0 374 l 0 311 l 468 311 z', + }, + csymParensLeftTall: { + x_min: 1, + x_max: 185, + y_min: 0, + y_max: 997, + ha: 997, + o: 'm 266 48 b 261 65 266 55 264 62 b 92 719 157 212 92 400 b 262 1371 92 1037 154 1228 b 266 1394 266 1378 266 1394 l 266 1424 b 264 1436 266 1431 266 1436 b 259 1434 262 1436 259 1434 b 1 719 84 1261 1 1011 b 259 1 1 429 79 177 b 264 0 261 0 262 0 b 266 9 265 0 266 6 z', + }, + csymParensRightTall: { + x_min: -20, + x_max: 164, + y_min: 0, + y_max: 997, + ha: 997, + o: 'm -29 9 b -26 0 -29 6 -27 0 b -22 1 -24 0 -23 0 b 236 719 158 177 236 429 b -22 1434 236 1011 154 1261 b -26 1436 -22 1434 -24 1436 b -29 1424 -29 1436 -29 1431 l -29 1394 b -24 1371 -29 1394 -29 1378 b 145 719 84 1228 145 1037 b -23 65 145 400 81 212 b -29 48 -26 62 -29 55 z', + }, + csymBracketLeftTall: { + x_min: 0, + x_max: 155, + y_min: 0, + y_max: 1000, + ha: 1000, + o: 'm 217 0 b 223 9 220 0 223 4 l 223 37 b 217 46 223 42 220 46 l 92 46 l 92 1394 l 217 1394 b 223 1403 220 1394 223 1398 l 223 1431 b 217 1440 223 1436 220 1440 l 6 1440 b 0 1436 3 1440 0 1439 l 0 4 b 6 0 0 1 3 0 z', + }, + csymBracketRightTall: { + x_min: 1, + x_max: 156, + y_min: 0, + y_max: 1000, + ha: 1000, + o: 'm 219 0 b 225 4 222 0 225 1 l 225 1436 b 219 1440 225 1439 222 1440 l 7 1440 b 1 1431 4 1440 1 1436 l 1 1403 b 7 1394 1 1398 4 1394 l 132 1394 l 132 46 l 7 46 b 1 37 4 46 1 42 l 1 9 b 7 0 1 4 4 0 z', + }, + csymParensLeftVeryTall: { + x_min: 0, + x_max: 122, + y_min: 0, + y_max: 993, + ha: 993, + o: 'm 176 32 b 171 49 176 39 174 46 b 60 716 104 194 60 399 b 173 1382 60 1032 101 1241 b 176 1405 176 1390 176 1405 l 176 1427 b 173 1430 176 1428 174 1430 b 0 716 40 1297 0 978 b 170 3 0 428 50 179 b 171 0 170 1 170 0 b 176 6 173 0 176 4 z', + }, + csymParensRightVeryTall: { + x_min: -15, + x_max: 107, + y_min: 0, + y_max: 993, + ha: 993, + o: 'm -22 6 b -17 0 -22 4 -19 0 b -16 3 -16 0 -16 1 b 154 716 104 179 154 428 b -19 1430 154 978 114 1297 b -22 1427 -20 1430 -22 1428 l -22 1405 b -19 1382 -22 1405 -22 1390 b 94 716 53 1241 94 1032 b -17 49 94 399 50 194 b -22 32 -20 46 -22 39 z', + }, + csymDiagonalArrangementSlash: { + x_min: 0, + x_max: 999, + y_min: 0, + y_max: 1000, + ha: 1000, + o: 'm 1439 1380 l 1377 1440 l 0 60 l 62 0 z', + }, + accSagittal5v7KleismaUp: { + x_min: 0, + x_max: 156, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 -35 b 135 -112 68 -86 99 -112 b 225 68 194 -112 225 -53 l 180 68 b 144 -4 180 20 168 -4 b 122 0 138 -4 131 -3 b 23 248 86 14 52 96 l 0 248 z', + }, + accSagittal5v7KleismaDown: { + x_min: 0, + x_max: 156, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 23 -248 b 122 0 52 -96 86 -14 b 144 4 131 3 138 4 b 180 -68 168 4 180 -20 l 225 -68 b 135 112 225 53 194 112 b 45 35 99 112 68 86 l 45 517 l 0 517 z', + }, + accSagittal5CommaUp: { + x_min: 0, + x_max: 156, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 225 -517 l 225 248 l 203 248 l 0 -112 l 0 -284 l 180 33 l 180 -517 z', + }, + accSagittal5CommaDown: { + x_min: 0, + x_max: 156, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 180 517 l 180 -33 l 0 284 l 0 112 l 203 -248 l 225 -248 l 225 517 z', + }, + accSagittal7CommaUp: { + x_min: 0, + x_max: 156, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 248 l 0 -517 l 45 -517 l 45 112 l 89 112 b 180 -68 150 112 180 53 l 180 -248 l 225 -248 l 225 68 b 135 248 225 187 194 248 z', + }, + accSagittal7CommaDown: { + x_min: 0, + x_max: 156, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 135 -248 b 225 -68 194 -248 225 -187 l 225 248 l 180 248 l 180 68 b 89 -112 180 -53 150 -112 l 45 -112 l 45 517 l 0 517 l 0 -248 z', + }, + accSagittal25SmallDiesisUp: { + x_min: 0, + x_max: 250, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -157 l 0 -259 l 315 -89 l 315 -517 l 360 -517 l 360 248 l 337 248 l 0 68 l 0 -33 l 315 135 l 315 10 z', + }, + accSagittal25SmallDiesisDown: { + x_min: 0, + x_max: 250, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 315 -10 l 315 -135 l 0 33 l 0 -68 l 337 -248 l 360 -248 l 360 517 l 315 517 l 315 89 l 0 259 l 0 157 z', + }, + accSagittal35MediumDiesisUp: { + x_min: 0, + x_max: 281, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -284 l 180 33 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -68 330 112 360 53 l 360 -248 l 405 -248 l 405 68 b 315 248 405 187 374 248 l 203 248 l 0 -112 z', + }, + accSagittal35MediumDiesisDown: { + x_min: 0, + x_max: 281, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 112 l 203 -248 l 315 -248 b 405 -68 374 -248 405 -187 l 405 248 l 360 248 l 360 68 b 271 -112 360 -53 330 -112 l 225 -112 l 225 517 l 180 517 l 180 -33 l 0 284 z', + }, + accSagittal11MediumDiesisUp: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 225 53 l 225 -517 l 271 -517 l 271 53 l 495 -248 l 495 -89 l 248 248 l 0 -89 l 0 -248 z', + }, + accSagittal11MediumDiesisDown: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 248 l 0 89 l 248 -248 l 495 89 l 495 248 l 271 -53 l 271 517 l 225 517 l 225 -53 z', + }, + accSagittal11LargeDiesisUp: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 112 l 315 112 b 449 -68 405 112 449 53 l 449 -248 l 495 -248 l 495 68 b 360 248 495 187 449 248 l 135 248 b 0 68 45 248 0 187 z', + }, + accSagittal11LargeDiesisDown: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 360 -248 b 495 -68 449 -248 495 -187 l 495 248 l 449 248 l 449 68 b 315 -112 449 -53 405 -112 l 271 -112 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z', + }, + accSagittal35LargeDiesisUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 248 -248 l 540 112 l 540 274 l 271 -58 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z', + }, + accSagittal35LargeDiesisDown: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 248 -248 l 540 112 l 540 274 l 269 -58 l 269 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z', + }, + accSagittalSharp25SDown: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 b 112 -112 0 -53 36 -112 l 135 -112 l 135 -517 l 180 -517 l 180 -89 b 248 26 206 -65 229 -27 b 315 -89 264 -27 287 -65 l 315 -517 l 360 -517 l 360 -112 l 383 -112 b 495 68 458 -112 495 -53 l 449 68 b 399 -4 449 20 433 -4 b 248 248 297 -4 261 171 b 122 0 216 96 176 14 b 94 -4 112 -3 102 -4 b 45 68 60 -4 45 20 z', + }, + accSagittalFlat25SUp: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 45 -68 b 94 4 45 -20 60 4 b 122 0 102 4 112 3 b 248 -248 176 -14 216 -96 b 399 4 261 -171 297 4 b 449 -68 433 4 449 -20 l 495 -68 b 383 112 495 53 458 112 l 360 112 l 360 517 l 315 517 l 315 89 b 248 -26 287 65 264 27 b 180 89 229 27 206 65 l 180 517 l 135 517 l 135 112 l 112 112 b 0 -68 36 112 0 53 z', + }, + accSagittalSharp7CDown: { + x_min: 0, + x_max: 250, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 112 l 89 112 b 180 104 124 112 154 109 l 180 -517 l 225 -517 l 225 89 b 315 -68 285 60 315 9 l 315 -248 l 360 -248 l 360 68 b 135 248 360 187 285 248 l 0 248 z', + }, + accSagittalFlat7CUp: { + x_min: 0, + x_max: 250, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 135 -248 b 360 -68 285 -248 360 -187 l 360 248 l 315 248 l 315 68 b 225 -89 315 -9 285 -60 l 225 517 l 180 517 l 180 -104 b 89 -112 154 -109 124 -112 l 45 -112 l 45 517 l 0 517 z', + }, + accSagittalSharp5CDown: { + x_min: 0, + x_max: 281, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -517 l 45 71 l 180 -56 l 180 -517 l 225 -517 l 225 -98 l 405 -268 l 405 -112 l 23 248 l 0 248 l 0 -517 z', + }, + accSagittalFlat5CUp: { + x_min: 0, + x_max: 281, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 517 l 0 -248 l 23 -248 l 405 112 l 405 268 l 225 98 l 225 517 l 180 517 l 180 56 l 45 -71 l 45 517 z', + }, + accSagittalSharp5v7kDown: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -112 l 0 -276 l 135 -82 l 135 -517 l 180 -517 l 180 -17 l 271 112 l 315 112 l 315 -517 l 360 -517 l 360 107 b 449 -68 420 89 449 30 l 449 -248 l 495 -248 l 495 68 b 360 248 495 189 449 248 l 248 248 z', + }, + accSagittalFlat5v7kUp: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 248 -248 l 360 -248 b 495 -68 449 -248 495 -189 l 495 248 l 449 248 l 449 68 b 360 -107 449 -30 420 -89 l 360 517 l 315 517 l 315 -112 l 271 -112 l 180 17 l 180 517 l 135 517 l 135 82 l 0 276 l 0 112 z', + }, + accSagittalSharp: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 180 -53 l 180 -517 l 225 -517 l 225 0 l 292 85 l 360 0 l 360 -517 l 405 -517 l 405 -53 l 585 -274 l 585 -112 l 292 248 l 0 -112 l 0 -274 z', + }, + accSagittalFlat: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 274 l 0 112 l 292 -248 l 585 112 l 585 274 l 405 53 l 405 517 l 360 517 l 360 0 l 292 -85 l 225 0 l 225 517 l 180 517 l 180 53 z', + }, + accSagittalSharp5v7kUp: { + x_min: 0, + x_max: 312, + y_min: -361, + y_max: 172, + ha: 533, + o: 'm 45 -517 l 45 -10 b 135 -92 68 -48 98 -75 l 135 -520 l 180 -520 l 180 -108 b 248 -115 203 -112 225 -115 b 271 -112 256 -115 264 -115 l 271 -517 l 315 -517 l 315 -107 b 449 68 405 -89 449 -30 l 405 68 b 297 -4 405 19 369 -4 b 23 248 131 -4 56 85 l 0 248 l 0 -517 z', + }, + accSagittalFlat5v7kDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 361, + ha: 533, + o: 'm 0 517 l 0 -248 l 23 -248 b 297 4 56 -85 131 4 b 405 -68 369 4 405 -19 l 449 -68 b 315 107 449 30 405 89 l 315 517 l 271 517 l 271 112 b 248 115 264 115 256 115 b 180 108 225 115 203 112 l 180 520 l 135 520 l 135 92 b 45 10 98 75 68 48 l 45 517 z', + }, + accSagittalSharp5CUp: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -266 l 135 -153 l 135 -517 l 180 -517 l 180 -115 l 271 -39 l 271 -517 l 315 -517 l 315 0 l 405 75 l 405 -517 l 449 -517 l 449 248 l 428 248 l 0 -112 z', + }, + accSagittalFlat5CDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 112 l 428 -248 l 449 -248 l 449 517 l 405 517 l 405 -75 l 315 0 l 315 517 l 271 517 l 271 39 l 180 115 l 180 517 l 135 517 l 135 153 l 0 266 z', + }, + accSagittalSharp7CUp: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 112 l 135 112 l 135 -517 l 180 -517 l 180 108 b 271 89 213 105 243 99 l 271 -517 l 315 -517 l 315 73 b 405 -68 374 45 405 -3 l 405 -248 l 449 -248 l 449 68 b 135 248 449 187 346 248 l 0 248 z', + }, + accSagittalFlat7CDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 135 -248 b 449 -68 346 -248 449 -187 l 449 248 l 405 248 l 405 68 b 315 -73 405 3 374 -45 l 315 517 l 271 517 l 271 -89 b 180 -108 243 -99 213 -105 l 180 517 l 135 517 l 135 -112 l 45 -112 l 45 517 l 0 517 z', + }, + accSagittalSharp25SUp: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -30 l 495 143 l 495 14 l 0 -157 l 0 -255 l 225 -177 l 225 -517 l 271 -517 l 271 -161 l 360 -130 l 360 -517 l 405 -517 l 405 -115 l 495 -84 l 495 -517 l 540 -517 l 540 248 l 517 248 l 0 68 z', + }, + accSagittalFlat25SDown: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 l 517 -248 l 540 -248 l 540 517 l 495 517 l 495 84 l 405 115 l 405 517 l 360 517 l 360 130 l 271 161 l 271 517 l 225 517 l 225 177 l 0 255 l 0 157 l 495 -14 l 495 -143 l 0 30 z', + }, + accSagittalSharp35MUp: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -112 l 0 -274 l 135 -108 l 135 -517 l 180 -517 l 180 -53 l 271 58 l 271 -517 l 315 -517 l 315 112 l 360 112 b 405 109 376 112 390 112 l 405 -517 l 449 -517 l 449 96 b 540 -68 510 72 540 17 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 z', + }, + accSagittalFlat35MDown: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 292 -248 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 449 -96 540 -17 510 -72 l 449 517 l 405 517 l 405 -109 b 360 -112 390 -112 376 -112 l 315 -112 l 315 517 l 271 517 l 271 -58 l 180 53 l 180 517 l 135 517 l 135 108 l 0 274 l 0 112 z', + }, + accSagittalSharp11MUp: { + x_min: 0, + x_max: 469, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -112 l 0 -271 l 180 -79 l 180 -517 l 225 -517 l 225 -30 l 315 65 l 315 -517 l 360 -517 l 360 65 l 449 -30 l 449 -517 l 495 -517 l 495 -79 l 675 -271 l 675 -112 l 337 248 z', + }, + accSagittalFlat11MDown: { + x_min: 0, + x_max: 469, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 337 -248 l 675 112 l 675 271 l 495 79 l 495 517 l 449 517 l 449 30 l 360 -65 l 360 517 l 315 517 l 315 -65 l 225 30 l 225 517 l 180 517 l 180 79 l 0 271 l 0 112 z', + }, + accSagittalSharp11LUp: { + x_min: 0, + x_max: 469, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 112 l 449 112 l 449 -517 l 495 -517 l 495 104 b 631 -68 585 82 631 26 l 631 -248 l 675 -248 l 675 68 b 449 248 675 187 600 248 l 225 248 b 0 68 75 248 0 187 z', + }, + accSagittalFlat11LDown: { + x_min: 0, + x_max: 469, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 449 -248 b 675 -68 600 -248 675 -187 l 675 248 l 631 248 l 631 68 b 495 -104 631 -26 585 -82 l 495 517 l 449 517 l 449 -112 l 360 -112 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z', + }, + accSagittalSharp35LUp: { + x_min: 0, + x_max: 500, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 71 l 452 -17 l 452 -517 l 495 -517 l 495 -56 l 720 -268 l 720 -112 l 337 248 l 225 248 b 0 68 75 248 0 187 z', + }, + accSagittalFlat35LDown: { + x_min: 0, + x_max: 500, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 337 -248 l 720 112 l 720 268 l 495 56 l 495 517 l 452 517 l 452 17 l 360 -71 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z', + }, + accSagittalDoubleSharp25SDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 b 135 -112 0 -53 45 -112 b 243 -62 180 -112 215 -95 l 89 -503 l 143 -517 l 292 -82 l 445 -517 l 495 -503 l 343 -62 b 449 -112 372 -95 408 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 315 148 b 112 -4 274 148 236 -4 b 45 68 68 -4 45 20 z', + }, + accSagittalDoubleFlat25SUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 45 -68 b 112 4 45 -20 68 4 b 292 -248 236 4 274 -148 b 475 4 315 -148 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 b 343 62 408 112 372 95 l 495 503 l 445 517 l 292 82 l 143 517 l 89 503 l 243 62 b 135 112 215 95 180 112 b 0 -68 45 112 0 53 z', + }, + accSagittalDoubleSharp7CDown: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -503 l 52 -517 l 203 -82 l 354 -517 l 405 -503 l 230 0 l 271 108 b 495 -68 420 92 495 35 l 495 -248 l 540 -248 l 540 68 b 225 248 540 187 435 248 l 89 248 l 89 112 l 135 112 l 174 0 z m 213 112 l 203 82 l 192 112 z', + }, + accSagittalDoubleFlat7CUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 174 0 l 135 -112 l 89 -112 l 89 -248 l 225 -248 b 540 -68 435 -248 540 -187 l 540 248 l 495 248 l 495 68 b 271 -108 495 -35 420 -92 l 230 0 l 405 503 l 354 517 l 203 82 l 52 517 l 0 503 z m 192 -112 l 203 -82 l 213 -112 z', + }, + accSagittalDoubleSharp5CDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 405 -503 l 230 0 l 232 4 l 585 -264 l 585 -112 l 112 248 l 89 248 l 89 112 l 151 68 l 174 0 l 0 -503 l 52 -517 l 203 -82 l 354 -517 z', + }, + accSagittalDoubleFlat5CUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 354 517 l 203 82 l 52 517 l 0 503 l 174 0 l 151 -68 l 89 -112 l 89 -248 l 112 -248 l 585 112 l 585 264 l 232 -4 l 230 0 l 405 503 z', + }, + accSagittalDoubleSharp5v7kDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -274 l 252 35 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 360 112 b 540 -68 480 112 540 53 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 l 0 -112 z', + }, + accSagittalDoubleFlat5v7kUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 112 l 292 -248 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 360 -112 540 -53 480 -112 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 252 -35 l 0 274 z', + }, + accSagittalDoubleSharp: { + x_min: 0, + x_max: 469, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 540 -503 l 366 0 l 380 45 l 675 -271 l 675 -112 l 337 248 l 0 -112 l 0 -271 l 295 45 l 310 0 l 135 -503 l 186 -517 l 337 -82 l 488 -517 z', + }, + accSagittalDoubleFlat: { + x_min: 0, + x_max: 469, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 488 517 l 337 82 l 186 517 l 135 503 l 310 0 l 295 -45 l 0 271 l 0 112 l 337 -248 l 675 112 l 675 271 l 380 -45 l 366 0 l 540 503 z', + }, + accSagittal7v11KleismaUp: { + x_min: 0, + x_max: 219, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 68 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 -45 b 248 -112 200 -89 225 -112 b 315 68 292 -112 315 -53 l 271 68 b 248 -4 271 20 264 -4 b 236 0 245 -4 240 -3 b 157 248 213 14 187 96 b 78 0 127 96 101 14 b 65 -4 73 -3 68 -4 b 45 68 50 -4 45 20 l 0 68 b 68 -112 0 -53 23 -112 z', + }, + accSagittal7v11KleismaDown: { + x_min: 0, + x_max: 219, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 68 112 b 0 -68 23 112 0 53 l 45 -68 b 65 4 45 -20 50 4 b 78 0 68 4 73 3 b 157 -248 101 -14 127 -96 b 236 0 187 -96 213 -14 b 248 4 240 3 245 4 b 271 -68 264 4 271 -20 l 315 -68 b 248 112 315 53 292 112 b 180 45 225 112 200 89 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 z', + }, + accSagittal17CommaUp: { + x_min: 0, + x_max: 281, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 -40 b 315 -118 248 -92 279 -118 b 405 62 374 -118 405 -59 l 360 62 b 324 -10 360 14 348 -10 b 302 -6 318 -10 311 -9 b 206 217 268 9 235 84 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z', + }, + accSagittal17CommaDown: { + x_min: 0, + x_max: 281, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 206 -217 b 302 6 235 -84 268 -9 b 324 10 311 9 318 10 b 360 -62 348 10 360 -14 l 405 -62 b 315 118 405 59 374 118 b 225 40 279 118 248 92 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z', + }, + accSagittal55CommaUp: { + x_min: 0, + x_max: 219, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 248 l 0 -517 l 45 -517 l 45 58 l 315 -274 l 315 -112 l 23 248 z', + }, + accSagittal55CommaDown: { + x_min: 0, + x_max: 219, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 23 -248 l 315 112 l 315 274 l 45 -58 l 45 517 l 0 517 l 0 -248 z', + }, + accSagittal7v11CommaUp: { + x_min: 0, + x_max: 188, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -248 l 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 248 l 135 248 b 0 68 45 248 0 187 z', + }, + accSagittal7v11CommaDown: { + x_min: 0, + x_max: 188, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 271 -248 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z', + }, + accSagittal5v11SmallDiesisUp: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 73 l 0 -248 l 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 -40 b 360 -118 295 -92 325 -118 b 449 62 420 -118 449 -59 l 405 62 b 369 -10 405 14 393 -10 b 348 -6 363 -10 356 -9 b 251 217 312 9 279 84 l 248 248 l 135 248 b 0 73 45 248 0 189 z', + }, + accSagittal5v11SmallDiesisDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -73 b 135 -248 0 -189 45 -248 l 248 -248 l 251 -217 b 348 6 279 -84 312 -9 b 369 10 356 9 363 10 b 405 -62 393 10 405 -14 l 449 -62 b 360 118 449 59 420 118 b 271 40 325 118 295 92 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z', + }, + accSagittalSharp5v11SDown: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 112 -23 45 -84 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 b 242 37 203 -23 225 -3 b 315 -89 262 -23 285 -63 l 315 -517 l 360 -517 l 360 -112 l 383 -112 b 495 68 458 -112 495 -53 l 449 68 b 399 -4 449 20 433 -4 b 248 248 297 -4 261 171 b 157 68 222 127 192 68 l 89 68 b 0 -203 30 68 0 -23 z', + }, + accSagittalFlat5v11SUp: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 89 -68 0 23 30 -68 l 157 -68 b 248 -248 192 -68 222 -127 b 399 4 261 -171 297 4 b 449 -68 433 4 449 -20 l 495 -68 b 383 112 495 53 458 112 l 360 112 l 360 517 l 315 517 l 315 89 b 242 -37 285 63 262 23 b 180 23 225 3 203 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 84 z', + }, + accSagittalSharp7v11CDown: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 89 -112 l 89 -517 l 135 -517 l 135 -95 b 206 37 163 -73 187 -30 b 271 -23 225 -3 248 -23 l 271 -517 l 315 -517 l 315 -23 l 383 -23 b 449 -203 428 -23 449 -84 l 495 -203 b 405 68 495 -23 465 68 l 292 68 b 203 248 258 68 228 127 b 101 0 173 98 138 16 b 81 -3 94 0 86 -3 b 45 68 56 -3 45 20 l 0 68 b 89 -112 0 -52 30 -112 z', + }, + accSagittalFlat7v11CUp: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 89 112 b 0 -68 30 112 0 52 l 45 -68 b 81 3 45 -20 56 3 b 101 0 86 3 94 0 b 203 -248 138 -16 173 -98 b 292 -68 228 -127 258 -68 l 405 -68 b 495 203 465 -68 495 23 l 449 203 b 383 23 449 84 428 23 l 315 23 l 315 517 l 271 517 l 271 23 b 206 -37 248 23 225 3 b 135 95 187 30 163 73 l 135 517 l 89 517 z', + }, + accSagittalSharp55CDown: { + x_min: 0, + x_max: 250, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -271 l 135 -125 l 135 -517 l 180 -517 l 180 -78 l 315 65 l 315 -517 l 360 -517 l 360 248 l 337 248 l 0 -112 z', + }, + accSagittalFlat55CUp: { + x_min: 0, + x_max: 250, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 112 l 337 -248 l 360 -248 l 360 517 l 315 517 l 315 -65 l 180 78 l 180 517 l 135 517 l 135 125 l 0 271 z', + }, + accSagittalSharp17CDown: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -248 l 45 -68 b 180 109 45 36 89 95 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -89 292 13 321 -55 l 360 -517 l 405 -517 l 405 -112 l 428 -112 b 540 68 504 -112 540 -53 l 495 68 b 445 -4 495 20 480 -4 b 292 248 343 -4 307 171 l 180 248 b 0 68 60 248 0 187 l 0 -248 z', + }, + accSagittalFlat17CUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 248 l 0 -68 b 180 -248 0 -187 60 -248 l 292 -248 b 445 4 307 -171 343 4 b 495 -68 480 4 495 -20 l 540 -68 b 428 112 540 53 504 112 l 405 112 l 405 517 l 360 517 l 360 89 b 271 -112 321 55 292 -13 l 225 -112 l 225 517 l 180 517 l 180 -109 b 45 68 89 -95 45 -36 l 45 248 z', + }, + accSagittalSharp7v11kDown: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -32 l 405 138 l 405 13 l 0 -157 l 0 -256 l 225 -161 l 225 -517 l 271 -517 l 271 -144 l 405 -86 l 405 -517 l 449 -517 l 449 248 l 428 248 l 0 68 z', + }, + accSagittalFlat7v11kUp: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 l 428 -248 l 449 -248 l 449 517 l 405 517 l 405 86 l 271 144 l 271 517 l 225 517 l 225 161 l 0 256 l 0 157 l 405 -13 l 405 -138 l 0 32 z', + }, + accSagittalSharp7v11kUp: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 135 -112 l 135 -517 l 180 -517 l 180 -105 b 271 -23 217 -94 248 -65 l 271 -517 l 315 -517 l 315 -23 b 405 -105 337 -65 369 -94 l 405 -517 l 449 -517 l 449 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 315 148 b 112 -4 274 148 236 -4 b 45 68 68 -4 45 20 l 0 68 b 135 -112 0 -53 45 -112 z', + }, + accSagittalFlat7v11kDown: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 135 112 b 0 -68 45 112 0 53 l 45 -68 b 112 4 45 -20 68 4 b 292 -248 236 4 274 -148 b 475 4 315 -148 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 l 449 517 l 405 517 l 405 105 b 315 23 369 94 337 65 l 315 517 l 271 517 l 271 23 b 180 105 248 65 217 94 l 180 517 l 135 517 z', + }, + accSagittalSharp17CUp: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 203 -23 b 271 14 229 -23 251 -10 l 271 -517 l 315 -517 l 315 -23 b 405 -105 337 -65 369 -94 l 405 -517 l 449 -517 l 449 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 312 150 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z', + }, + accSagittalFlat17CDown: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 b 475 4 312 -150 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 l 449 517 l 405 517 l 405 105 b 315 23 369 94 337 65 l 315 517 l 271 517 l 271 -14 b 203 23 251 10 229 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z', + }, + accSagittalSharp55CUp: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -517 l 45 78 l 135 10 l 135 -517 l 180 -517 l 180 -23 l 271 -92 l 271 -517 l 315 -517 l 315 -127 l 495 -264 l 495 -112 l 23 248 l 0 248 l 0 -517 z', + }, + accSagittalFlat55CDown: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 517 l 0 -248 l 23 -248 l 495 112 l 495 264 l 315 127 l 315 517 l 271 517 l 271 92 l 180 23 l 180 517 l 135 517 l 135 -10 l 45 -78 l 45 517 z', + }, + accSagittalSharp7v11CUp: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 86 45 6 89 58 l 180 -517 l 225 -517 l 225 98 b 315 109 252 104 282 108 l 315 -517 l 360 -517 l 360 112 l 449 112 l 449 -517 l 495 -517 l 495 248 l 360 248 b 0 68 121 248 0 189 z', + }, + accSagittalFlat7v11CDown: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 360 -248 0 -189 121 -248 l 495 -248 l 495 517 l 449 517 l 449 -112 l 360 -112 l 360 517 l 315 517 l 315 -109 b 225 -98 282 -108 252 -104 l 225 517 l 180 517 l 180 -86 b 45 68 89 -58 45 -6 l 45 248 l 0 248 z', + }, + accSagittalSharp5v11SUp: { + x_min: 0, + x_max: 438, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 -23 b 449 -105 383 -65 415 -94 l 449 -517 l 495 -517 l 495 -112 b 631 68 585 -112 631 -53 l 585 68 b 520 -4 585 20 563 -4 b 337 248 396 -4 360 150 l 225 248 b 0 68 76 248 0 187 z', + }, + accSagittalFlat5v11SDown: { + x_min: 0, + x_max: 438, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 225 -248 0 -187 76 -248 l 337 -248 b 520 4 360 -150 396 4 b 585 -68 563 4 585 -20 l 631 -68 b 495 112 631 53 585 112 l 495 517 l 449 517 l 449 105 b 360 23 415 94 383 65 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z', + }, + accSagittalDoubleSharp5v11SDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 203 -23 b 262 4 225 -23 245 -13 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 341 -60 b 449 -112 370 -95 405 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 312 150 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z', + }, + accSagittalDoubleFlat5v11SUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 b 475 4 312 -150 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 b 341 60 405 112 370 95 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 262 -4 b 203 23 245 13 225 23 l 135 23 b 45 203 75 23 45 84 z', + }, + accSagittalDoubleSharp7v11CDown: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 112 -112 b 193 -73 143 -112 170 -99 l 45 -501 l 95 -517 l 248 -81 l 397 -517 l 449 -503 l 275 0 l 278 4 b 337 -23 295 -13 315 -23 l 405 -23 b 495 -203 465 -23 495 -84 l 540 -203 b 428 68 540 -23 503 68 l 360 68 b 248 248 310 68 271 127 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 112 -112 0 -52 36 -112 z', + }, + accSagittalDoubleFlat7v11CUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 112 112 b 0 -68 36 112 0 52 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 b 360 -68 271 -127 310 -68 l 428 -68 b 540 203 503 -68 540 23 l 495 203 b 405 23 495 84 465 23 l 337 23 b 278 -4 315 23 295 13 l 275 0 l 449 503 l 397 517 l 248 81 l 95 517 l 45 501 l 193 73 b 112 112 170 99 143 112 z', + }, + accSagittalDoubleSharp55CDown: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 428 248 l 0 -112 l 0 -266 l 307 -7 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 366 0 l 386 59 l 449 112 l 449 248 z', + }, + accSagittalDoubleFlat55CUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 449 -248 l 449 -112 l 386 -59 l 366 0 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 307 7 l 0 266 l 0 112 l 428 -248 z', + }, + accSagittalDoubleSharp17CDown: { + x_min: 0, + x_max: 438, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -248 l 45 -68 b 271 112 45 53 120 112 l 310 0 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 387 -62 b 495 -112 416 -95 452 -112 b 631 68 585 -112 631 -53 l 585 68 b 520 -4 585 20 563 -4 b 337 248 396 -4 360 150 l 225 248 b 0 68 76 248 0 187 l 0 -248 z', + }, + accSagittalDoubleFlat17CUp: { + x_min: 0, + x_max: 438, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 248 l 0 -68 b 225 -248 0 -187 76 -248 l 337 -248 b 520 4 360 -150 396 4 b 585 -68 563 4 585 -20 l 631 -68 b 495 112 631 53 585 112 b 387 62 452 112 416 95 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 310 0 l 271 -112 b 45 68 120 -112 45 -53 l 45 248 z', + }, + accSagittalDoubleSharp7v11kDown: { + x_min: 0, + x_max: 438, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 l 0 -30 l 366 96 l 399 0 l 392 -23 l 0 -157 l 0 -255 l 353 -135 l 225 -503 l 276 -517 l 428 -82 l 579 -517 l 631 -503 l 455 0 l 507 145 l 540 157 l 540 248 l 517 248 z m 416 115 l 442 124 l 428 82 z', + }, + accSagittalDoubleFlat7v11kUp: { + x_min: 0, + x_max: 438, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 517 -248 l 540 -248 l 540 -157 l 507 -145 l 455 0 l 631 503 l 579 517 l 428 82 l 276 517 l 225 503 l 353 135 l 0 255 l 0 157 l 392 23 l 399 0 l 366 -96 l 0 30 l 0 -68 z m 428 -82 l 442 -124 l 416 -115 z', + }, + accSagittal23CommaUp: { + x_min: 0, + x_max: 188, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 -4 b 68 -23 53 -17 60 -23 l 180 -23 b 225 -203 210 -23 225 -82 l 271 -203 b 206 68 271 -23 248 68 l 89 68 b 23 248 71 68 48 127 l 0 248 z', + }, + accSagittal23CommaDown: { + x_min: 0, + x_max: 188, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 23 -248 b 89 -68 48 -127 71 -68 l 206 -68 b 271 203 248 -68 271 23 l 225 203 b 180 23 225 82 210 23 l 68 23 b 45 4 60 23 53 17 l 45 517 l 0 517 z', + }, + accSagittal5v19CommaUp: { + x_min: 0, + x_max: 156, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -284 l 180 33 l 180 -517 l 225 -517 l 225 248 l 203 248 b 86 112 151 157 112 112 b 45 157 59 112 45 127 l 0 157 b 76 23 0 72 26 27 l 0 -112 z', + }, + accSagittal5v19CommaDown: { + x_min: 0, + x_max: 156, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 112 l 76 -23 b 0 -157 26 -27 0 -72 l 45 -157 b 86 -112 45 -127 59 -112 b 203 -248 112 -112 151 -157 l 225 -248 l 225 517 l 180 517 l 180 -33 l 0 284 z', + }, + accSagittal5v23SmallDiesisUp: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -284 l 180 33 l 180 -517 l 225 -517 l 225 -4 b 248 -23 233 -17 240 -23 l 360 -23 b 405 -203 390 -23 405 -82 l 449 -203 b 386 68 449 -23 428 68 l 271 68 b 203 248 251 68 228 127 l 0 -112 z', + }, + accSagittal5v23SmallDiesisDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 112 l 203 -248 b 271 -68 228 -127 251 -68 l 386 -68 b 449 203 428 -68 449 23 l 405 203 b 360 23 405 82 390 23 l 248 23 b 225 4 240 23 233 17 l 225 517 l 180 517 l 180 -33 l 0 284 z', + }, + accSagittalSharp5v23SDown: { + x_min: 0, + x_max: 281, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 6 b 89 -23 59 -13 73 -23 l 180 -23 l 180 -517 l 225 -517 l 225 -23 l 292 -23 b 360 -203 337 -23 360 -84 l 405 -203 b 315 68 405 -23 374 68 l 112 68 b 23 248 78 68 48 127 l 0 248 z', + }, + accSagittalFlat5v23SUp: { + x_min: 0, + x_max: 281, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 23 -248 b 112 -68 48 -127 78 -68 l 315 -68 b 405 203 374 -68 405 23 l 360 203 b 292 23 360 84 337 23 l 225 23 l 225 517 l 180 517 l 180 23 l 89 23 b 45 -6 73 23 59 13 l 45 517 l 0 517 z', + }, + accSagittalSharp5v19CDown: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 b 89 -112 0 -52 30 -112 l 89 -517 l 135 -517 l 135 -95 b 225 112 173 -65 203 4 l 271 112 l 271 -517 l 315 -517 l 315 107 b 405 -68 374 89 405 30 l 405 -248 l 449 -248 l 449 68 b 315 248 449 189 405 248 l 203 248 b 101 0 173 98 138 16 b 81 -3 94 0 86 -3 b 45 68 56 -3 45 23 z', + }, + accSagittalFlat5v19CUp: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 45 -68 b 81 3 45 -23 56 3 b 101 0 86 3 94 0 b 203 -248 138 -16 173 -98 l 315 -248 b 449 -68 405 -248 449 -189 l 449 248 l 405 248 l 405 68 b 315 -107 405 -30 374 -89 l 315 517 l 271 517 l 271 -112 l 225 -112 b 135 95 203 -4 173 65 l 135 517 l 89 517 l 89 112 b 0 -68 30 112 0 52 z', + }, + accSagittalSharp23CDown: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 135 -82 l 135 -517 l 180 -517 l 180 -17 l 239 68 b 315 -23 261 7 287 -23 l 315 -517 l 360 -517 l 360 -23 l 428 -23 b 495 -203 472 -23 495 -84 l 540 -203 b 449 68 540 -23 510 68 l 337 68 b 248 248 302 68 271 127 l 0 -112 l 0 -276 z', + }, + accSagittalFlat23CUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 276 l 0 112 l 248 -248 b 337 -68 271 -127 302 -68 l 449 -68 b 540 203 510 -68 540 23 l 495 203 b 428 23 495 84 472 23 l 360 23 l 360 517 l 315 517 l 315 23 b 239 -68 287 23 261 -7 l 180 17 l 180 517 l 135 517 l 135 82 z', + }, + accSagittalSharp23CUp: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 14 b 112 -23 63 -10 86 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 l 271 -517 l 315 -517 l 315 -23 l 360 -23 b 449 -203 420 -23 449 -84 l 495 -203 b 383 68 495 -23 458 68 l 135 68 b 23 248 85 68 48 127 l 0 248 z', + }, + accSagittalFlat23CDown: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 23 -248 b 135 -68 48 -127 85 -68 l 383 -68 b 495 203 458 -68 495 23 l 449 203 b 360 23 449 84 420 23 l 315 23 l 315 517 l 271 517 l 271 23 l 180 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 -14 86 23 63 10 l 45 517 l 0 517 z', + }, + accSagittalSharp5v19CUp: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -112 l 0 -266 l 135 -153 l 135 -517 l 180 -517 l 180 -115 l 271 -39 l 271 -517 l 315 -517 l 315 0 l 405 75 l 405 -517 l 449 -517 l 449 248 l 428 248 b 130 68 285 127 186 68 b 45 157 73 68 45 98 l 0 157 b 112 -20 0 53 37 -6 z', + }, + accSagittalFlat5v19CDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 112 20 b 0 -157 37 6 0 -53 l 45 -157 b 130 -68 45 -98 73 -68 b 428 -248 186 -68 285 -127 l 449 -248 l 449 517 l 405 517 l 405 -75 l 315 0 l 315 517 l 271 517 l 271 39 l 180 115 l 180 517 l 135 517 l 135 153 l 0 266 l 0 112 z', + }, + accSagittalSharp5v23SUp: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 135 -108 l 135 -517 l 180 -517 l 180 -53 l 271 58 l 271 -517 l 315 -517 l 315 14 b 383 -23 334 -10 357 -23 l 405 -23 l 405 -517 l 449 -517 l 449 -23 b 540 -203 510 -23 540 -84 l 585 -203 b 472 68 585 -23 547 68 l 405 68 b 292 248 356 68 318 127 l 0 -112 l 0 -274 z', + }, + accSagittalFlat5v23SDown: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 274 l 0 112 l 292 -248 b 405 -68 318 -127 356 -68 l 472 -68 b 585 203 547 -68 585 23 l 540 203 b 449 23 540 84 510 23 l 449 517 l 405 517 l 405 23 l 383 23 b 315 -14 357 23 334 10 l 315 517 l 271 517 l 271 -58 l 180 53 l 180 517 l 135 517 l 135 108 z', + }, + accSagittalDoubleSharp5v23SDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 52 -517 l 203 -81 l 354 -517 l 405 -503 l 239 -23 l 449 -23 b 540 -203 510 -23 540 -84 l 585 -203 b 472 68 585 -23 547 68 l 225 68 b 112 248 176 68 138 127 l 89 248 l 89 112 b 170 -14 109 45 135 0 l 0 -501 z', + }, + accSagittalDoubleFlat5v23SUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 501 l 170 14 b 89 -112 135 0 109 -45 l 89 -248 l 112 -248 b 225 -68 138 -127 176 -68 l 472 -68 b 585 203 547 -68 585 23 l 540 203 b 449 23 540 84 510 23 l 239 23 l 405 503 l 354 517 l 203 81 l 52 517 z', + }, + accSagittalDoubleSharp5v19CDown: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 b 112 -112 0 -52 36 -112 b 193 -73 143 -112 170 -99 l 45 -501 l 95 -517 l 248 -81 l 397 -517 l 449 -501 l 275 0 l 315 112 b 495 -68 435 112 495 53 l 495 -248 l 540 -248 l 540 68 b 360 248 540 189 480 248 l 248 248 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 z', + }, + accSagittalDoubleFlat5v19CUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 l 360 -248 b 540 -68 480 -248 540 -189 l 540 248 l 495 248 l 495 68 b 315 -112 495 -53 435 -112 l 275 0 l 449 501 l 397 517 l 248 81 l 95 517 l 45 501 l 193 73 b 112 112 170 99 143 112 b 0 -68 36 112 0 52 z', + }, + accSagittalDoubleSharp23CDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 252 35 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 323 4 b 383 -23 340 -13 360 -23 l 449 -23 b 540 -203 510 -23 540 -84 l 585 -203 b 472 68 585 -23 547 68 l 405 68 b 292 248 356 68 318 127 l 0 -112 l 0 -274 z', + }, + accSagittalDoubleFlat23CUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 274 l 0 112 l 292 -248 b 405 -68 318 -127 356 -68 l 472 -68 b 585 203 547 -68 585 23 l 540 203 b 449 23 540 84 510 23 l 383 23 b 323 -4 360 23 340 13 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 252 -35 z', + }, + accSagittal19SchismaUp: { + x_min: 0, + x_max: 125, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 68 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 248 l 157 248 b 79 0 127 98 101 16 b 68 -3 73 0 68 -3 b 45 68 52 -3 45 20 l 0 68 b 68 -112 0 -52 23 -112 z', + }, + accSagittal19SchismaDown: { + x_min: 0, + x_max: 125, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 68 112 b 0 -68 23 112 0 52 l 45 -68 b 68 3 45 -20 52 3 b 79 0 68 3 73 0 b 157 -248 101 -16 127 -98 l 180 -248 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 z', + }, + accSagittal17KleismaUp: { + x_min: 0, + x_max: 156, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 248 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z', + }, + accSagittal17KleismaDown: { + x_min: 0, + x_max: 156, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 225 -248 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z', + }, + accSagittal143CommaUp: { + x_min: 0, + x_max: 156, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -203 l 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 248 l 203 248 b 135 68 177 127 154 68 l 105 68 b 45 157 65 68 45 98 l 0 157 b 23 20 0 95 7 50 b 0 -203 7 -23 0 -98 z', + }, + accSagittal143CommaDown: { + x_min: 0, + x_max: 156, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 23 -20 0 98 7 23 b 0 -157 7 -50 0 -95 l 45 -157 b 105 -68 45 -98 65 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 225 -248 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z', + }, + accSagittal11v49CommaUp: { + x_min: 0, + x_max: 188, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -292 b 89 -157 45 -203 60 -157 l 203 -157 b 225 -143 210 -157 217 -153 l 225 -517 l 271 -517 l 271 248 l 248 248 b 180 157 233 187 210 157 l 68 157 b 0 -68 23 157 0 82 l 45 -68 b 89 68 45 23 60 68 l 203 68 b 225 84 209 68 216 72 l 225 -36 b 180 -68 213 -58 199 -68 l 68 -68 b 0 -292 23 -68 0 -143 z', + }, + accSagittal11v49CommaDown: { + x_min: 0, + x_max: 188, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 292 b 68 68 0 143 23 68 l 180 68 b 225 36 199 68 213 58 l 225 -84 b 203 -68 216 -72 209 -68 l 89 -68 b 45 68 60 -68 45 -23 l 0 68 b 68 -157 0 -82 23 -157 l 180 -157 b 248 -248 210 -157 233 -187 l 271 -248 l 271 517 l 225 517 l 225 143 b 203 157 217 153 210 157 l 89 157 b 45 292 60 157 45 203 z', + }, + accSagittal19CommaUp: { + x_min: 0, + x_max: 281, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 b 68 -112 0 -52 23 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 -4 b 203 -23 187 -17 196 -23 l 315 -23 b 360 -203 346 -23 360 -82 l 405 -203 b 341 68 405 -23 383 68 l 225 68 b 157 248 206 68 183 127 b 79 0 127 98 101 16 b 68 -3 73 0 68 -3 b 45 68 52 -3 45 20 z', + }, + accSagittal19CommaDown: { + x_min: 0, + x_max: 281, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 45 -68 b 68 3 45 -20 52 3 b 79 0 68 3 73 0 b 157 -248 101 -16 127 -98 b 225 -68 183 -127 206 -68 l 341 -68 b 405 203 383 -68 405 23 l 360 203 b 315 23 360 82 346 23 l 203 23 b 180 4 196 23 187 17 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 b 0 -68 23 112 0 52 z', + }, + accSagittal7v19CommaUp: { + x_min: 0, + x_max: 250, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 b 68 -112 0 -52 23 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 112 l 225 112 b 315 -68 285 112 315 53 l 315 -248 l 360 -248 l 360 68 b 271 248 360 187 330 248 l 157 248 b 79 0 127 98 101 16 b 68 -3 73 0 68 -3 b 45 68 52 -3 45 20 z', + }, + accSagittal7v19CommaDown: { + x_min: 0, + x_max: 250, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 45 -68 b 68 3 45 -20 52 3 b 79 0 68 3 73 0 b 157 -248 101 -16 127 -98 l 271 -248 b 360 -68 330 -248 360 -187 l 360 248 l 315 248 l 315 68 b 225 -112 315 -53 285 -112 l 180 -112 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 b 0 -68 23 112 0 52 z', + }, + accSagittal49SmallDiesisUp: { + x_min: 0, + x_max: 281, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -203 l 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -68 330 112 360 53 l 360 -248 l 405 -248 l 405 68 b 315 248 405 187 374 248 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z', + }, + accSagittal49SmallDiesisDown: { + x_min: 0, + x_max: 281, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 315 -248 b 405 -68 374 -248 405 -187 l 405 248 l 360 248 l 360 68 b 271 -112 360 -53 330 -112 l 225 -112 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z', + }, + accSagittal23SmallDiesisUp: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 58 l 495 -274 l 495 -112 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z', + }, + accSagittal23SmallDiesisDown: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 495 112 l 495 274 l 225 -58 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z', + }, + accSagittal5v13MediumDiesisUp: { + x_min: 0, + x_max: 250, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -259 l 315 -89 l 315 -517 l 360 -517 l 360 248 l 337 248 b 128 180 253 203 184 180 b 45 248 73 180 45 203 l 0 248 b 52 95 0 170 17 120 l 0 68 l 0 -33 l 315 135 l 315 10 l 0 -157 z', + }, + accSagittal5v13MediumDiesisDown: { + x_min: 0, + x_max: 250, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 157 l 315 -10 l 315 -135 l 0 33 l 0 -68 l 52 -95 b 0 -248 17 -120 0 -170 l 45 -248 b 128 -180 45 -203 73 -180 b 337 -248 184 -180 253 -203 l 360 -248 l 360 517 l 315 517 l 315 89 l 0 259 z', + }, + accSagittal11v19MediumDiesisUp: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 -4 b 292 -23 278 -17 285 -23 l 405 -23 b 449 -203 435 -23 449 -82 l 495 -203 b 431 68 495 -23 472 68 l 315 68 b 248 248 295 68 271 127 l 135 248 b 0 68 45 248 0 187 l 0 -248 z', + }, + accSagittal11v19MediumDiesisDown: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 248 l 0 -68 b 135 -248 0 -187 45 -248 l 248 -248 b 315 -68 271 -127 295 -68 l 431 -68 b 495 203 472 -68 495 23 l 449 203 b 405 23 449 82 435 23 l 292 23 b 271 4 285 23 278 17 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 z', + }, + accSagittal49MediumDiesisUp: { + x_min: 0, + x_max: 250, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -68 l 0 -248 l 45 -248 l 315 -94 l 315 -517 l 360 -517 l 360 248 l 225 248 b 0 -68 75 248 0 143 z m 45 -68 b 225 112 45 53 105 112 l 315 112 l 315 10 l 45 -145 z', + }, + accSagittal49MediumDiesisDown: { + x_min: 0, + x_max: 250, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 68 b 225 -248 0 -143 75 -248 l 360 -248 l 360 517 l 315 517 l 315 94 l 45 248 l 0 248 z m 45 145 l 315 -10 l 315 -112 l 225 -112 b 45 68 105 -112 45 -53 z', + }, + accSagittal5v49MediumDiesisUp: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -89 l 0 -248 l 225 53 l 225 -517 l 271 -517 l 271 53 l 495 -248 l 495 -89 l 248 248 b 89 89 170 143 118 89 b 45 157 60 89 45 112 l 0 157 b 68 3 0 68 23 16 z', + }, + accSagittal5v49MediumDiesisDown: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 68 -3 b 0 -157 23 -16 0 -68 l 45 -157 b 89 -89 45 -112 60 -89 b 248 -248 118 -89 170 -143 l 495 89 l 495 248 l 271 -53 l 271 517 l 225 517 l 225 -53 l 0 248 l 0 89 z', + }, + accSagittal49LargeDiesisUp: { + x_min: 0, + x_max: 281, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 -89 l 360 -248 l 405 -248 l 405 -68 b 180 248 405 143 330 248 l 0 248 z m 45 12 l 45 112 l 180 112 b 360 -68 300 112 360 53 l 360 -147 z', + }, + accSagittal49LargeDiesisDown: { + x_min: 0, + x_max: 281, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 180 -248 b 405 68 330 -248 405 -143 l 405 248 l 360 248 l 45 89 l 45 517 l 0 517 z m 360 147 l 360 68 b 180 -112 360 -53 300 -112 l 45 -112 l 45 -12 z', + }, + accSagittal11v19LargeDiesisUp: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 -86 l 449 -256 l 449 -157 l 45 13 l 45 138 l 449 -30 l 449 68 l 23 248 l 0 248 z', + }, + accSagittal11v19LargeDiesisDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 23 -248 l 449 -68 l 449 30 l 45 -138 l 45 -13 l 449 157 l 449 256 l 45 86 l 45 517 l 0 517 z', + }, + accSagittal5v13LargeDiesisUp: { + x_min: 0, + x_max: 438, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 b 89 -112 0 -52 30 -112 b 180 -35 125 -112 157 -86 l 180 -517 l 225 -517 l 225 -86 l 631 -256 l 631 -157 l 225 13 l 225 138 l 631 -30 l 631 68 l 203 248 b 101 0 173 98 138 16 b 81 -3 94 0 86 -3 b 45 68 56 -3 45 20 z', + }, + accSagittal5v13LargeDiesisDown: { + x_min: 0, + x_max: 438, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 45 -68 b 81 3 45 -20 56 3 b 101 0 86 3 94 0 b 203 -248 138 -16 173 -98 l 631 -68 l 631 30 l 225 -138 l 225 -13 l 631 157 l 631 256 l 225 86 l 225 517 l 180 517 l 180 35 b 89 112 157 86 125 112 b 0 -68 30 112 0 52 z', + }, + accSagittalSharp23SDown: { + x_min: 0, + x_max: 250, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -203 l 45 -203 b 112 -23 45 -84 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 b 315 6 287 -23 301 -13 l 315 -517 l 360 -517 l 360 248 l 337 248 b 248 68 312 127 282 68 l 194 68 b 89 157 125 68 89 98 l 45 157 b 60 59 45 118 50 85 b 0 -203 20 30 0 -56 z', + }, + accSagittalFlat23SUp: { + x_min: 0, + x_max: 250, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 60 -59 0 56 20 -30 b 45 -157 50 -85 45 -118 l 89 -157 b 194 -68 89 -98 125 -68 l 248 -68 b 337 -248 282 -68 312 -127 l 360 -248 l 360 517 l 315 517 l 315 -6 b 271 23 301 13 287 23 l 180 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 84 z', + }, + accSagittalSharp49SDown: { + x_min: 0, + x_max: 250, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -292 l 45 -292 b 112 -157 45 -203 68 -157 l 135 -157 l 135 -517 l 180 -517 l 180 -157 l 271 -157 b 315 -135 285 -157 300 -150 l 315 -517 l 360 -517 l 360 248 l 337 248 b 248 157 323 187 292 157 l 89 157 b 0 -68 30 157 0 82 l 45 -68 b 112 68 45 23 68 68 l 271 68 b 315 89 284 68 300 75 l 315 -32 b 248 -68 298 -56 275 -68 l 89 -68 b 0 -292 29 -68 0 -143 z', + }, + accSagittalFlat49SUp: { + x_min: 0, + x_max: 250, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 292 b 89 68 0 143 29 68 l 248 68 b 315 32 275 68 298 56 l 315 -89 b 271 -68 300 -75 284 -68 l 112 -68 b 45 68 68 -68 45 -23 l 0 68 b 89 -157 0 -82 30 -157 l 248 -157 b 337 -248 292 -157 323 -187 l 360 -248 l 360 517 l 315 517 l 315 135 b 271 157 300 150 285 157 l 180 157 l 180 517 l 135 517 l 135 157 l 112 157 b 45 292 68 157 45 203 z', + }, + accSagittalSharp7v19CDown: { + x_min: 0, + x_max: 250, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -112 l 0 -271 l 135 -125 l 135 -517 l 180 -517 l 180 -78 l 315 65 l 315 -517 l 360 -517 l 360 248 l 337 248 b 118 89 239 143 166 89 b 45 157 68 89 45 112 l 0 157 b 89 -20 0 53 29 -6 z', + }, + accSagittalFlat7v19CUp: { + x_min: 0, + x_max: 250, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 89 20 b 0 -157 29 6 0 -53 l 45 -157 b 118 -89 45 -112 68 -89 b 337 -248 166 -89 239 -143 l 360 -248 l 360 517 l 315 517 l 315 -65 l 180 78 l 180 517 l 135 517 l 135 125 l 0 271 l 0 112 z', + }, + accSagittalSharp19CDown: { + x_min: 0, + x_max: 281, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -248 l 45 -248 l 45 -68 b 180 96 45 17 89 72 l 180 -517 l 225 -517 l 225 107 b 315 112 252 112 282 112 l 360 112 l 360 -517 l 405 -517 l 405 248 l 271 248 b 0 68 89 248 0 187 z', + }, + accSagittalFlat19CUp: { + x_min: 0, + x_max: 281, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 271 -248 0 -187 89 -248 l 405 -248 l 405 517 l 360 517 l 360 -112 l 315 -112 b 225 -107 282 -112 252 -112 l 225 517 l 180 517 l 180 -96 b 45 68 89 -72 45 -17 l 45 248 l 0 248 z', + }, + accSagittalSharp11v49CDown: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 112 -23 45 -82 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 b 271 112 215 -23 245 23 l 315 112 l 315 -517 l 360 -517 l 360 107 b 449 -68 420 89 449 30 l 449 -248 l 495 -248 l 495 68 b 360 248 495 189 449 248 l 248 248 b 157 68 222 128 192 68 l 89 68 b 0 -203 30 68 0 -23 z', + }, + accSagittalFlat11v49CUp: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 89 -68 0 23 30 -68 l 157 -68 b 248 -248 192 -68 222 -128 l 360 -248 b 495 -68 449 -248 495 -189 l 495 248 l 449 248 l 449 68 b 360 -107 449 -30 420 -89 l 360 517 l 315 517 l 315 -112 l 271 -112 b 180 23 245 -23 215 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 82 z', + }, + accSagittalSharp143CDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 112 -23 45 -84 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 b 259 76 210 -23 236 10 l 315 17 l 315 -517 l 360 -517 l 360 -30 l 585 -271 l 585 -112 l 248 248 b 157 68 222 127 192 68 l 89 68 b 0 -203 30 68 0 -23 z', + }, + accSagittalFlat143CUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 89 -68 0 23 30 -68 l 157 -68 b 248 -248 192 -68 222 -127 l 585 112 l 585 271 l 360 30 l 360 517 l 315 517 l 315 -17 l 259 -76 b 180 23 236 -10 210 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 84 z', + }, + accSagittalSharp17kDown: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -157 l 0 -256 l 225 -161 l 225 -517 l 271 -517 l 271 -144 l 405 -86 l 405 -517 l 449 -517 l 449 248 l 428 248 b 145 171 305 196 210 171 b 45 248 78 171 45 196 l 0 248 b 79 101 0 170 26 121 l 0 68 l 0 -32 l 405 138 l 405 13 z', + }, + accSagittalFlat17kUp: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 405 -13 l 405 -138 l 0 32 l 0 -68 l 79 -101 b 0 -248 26 -121 0 -170 l 45 -248 b 145 -171 45 -196 78 -171 b 428 -248 210 -171 305 -196 l 449 -248 l 449 517 l 405 517 l 405 86 l 271 144 l 271 517 l 225 517 l 225 161 l 0 256 l 0 157 z', + }, + accSagittalSharp19sDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -248 l 45 -248 l 45 -68 b 180 109 45 36 89 95 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -23 295 23 325 -23 l 360 -517 l 405 -517 l 405 -23 l 472 -23 b 540 -203 517 -23 540 -84 l 585 -203 b 495 68 585 -23 554 68 l 383 68 b 292 248 348 68 318 127 l 180 248 b 0 68 60 248 0 187 z', + }, + accSagittalFlat19sUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 180 -248 0 -187 60 -248 l 292 -248 b 383 -68 318 -127 348 -68 l 495 -68 b 585 203 554 -68 585 23 l 540 203 b 472 23 540 84 517 23 l 405 23 l 405 517 l 360 517 l 360 23 b 271 -112 325 23 295 -23 l 225 -112 l 225 517 l 180 517 l 180 -109 b 45 68 89 -95 45 -36 l 45 248 l 0 248 z', + }, + accSagittalSharp19sUp: { + x_min: 0, + x_max: 281, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 89 -96 l 89 -517 l 135 -517 l 135 -108 b 180 -112 148 -112 163 -112 b 225 -108 196 -112 210 -112 l 225 -517 l 271 -517 l 271 -94 b 360 -12 305 -78 337 -50 l 360 -517 l 405 -517 l 405 248 l 383 248 b 190 0 353 98 288 16 b 138 -3 171 0 153 -3 b 45 68 75 -3 45 20 l 0 68 b 89 -96 0 -17 30 -72 z', + }, + accSagittalFlat19sDown: { + x_min: 0, + x_max: 281, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 89 96 b 0 -68 30 72 0 17 l 45 -68 b 138 3 45 -20 75 3 b 190 0 153 3 171 0 b 383 -248 288 -16 353 -98 l 405 -248 l 405 517 l 360 517 l 360 12 b 271 94 337 50 305 78 l 271 517 l 225 517 l 225 108 b 180 112 210 112 196 112 b 135 108 163 112 148 112 l 135 517 l 89 517 z', + }, + accSagittalSharp17kUp: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 l 271 -517 l 315 -517 l 315 -23 l 337 -23 b 405 14 363 -23 386 -10 l 405 -517 l 449 -517 l 449 248 l 428 248 b 315 68 402 127 364 68 l 112 68 b 0 -203 37 68 0 -23 z', + }, + accSagittalFlat17kDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 112 -68 0 23 37 -68 l 315 -68 b 428 -248 364 -68 402 -127 l 449 -248 l 449 517 l 405 517 l 405 -14 b 337 23 386 10 363 23 l 315 23 l 315 517 l 271 517 l 271 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z', + }, + accSagittalSharp143CUp: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 l 271 -517 l 315 -517 l 315 -23 l 337 -23 b 405 14 363 -23 386 -10 l 405 -517 l 449 -517 l 449 248 l 428 248 b 315 68 402 127 364 68 l 240 68 b 89 157 140 68 89 98 l 45 157 b 68 53 45 115 52 81 b 0 -203 23 23 0 -63 z', + }, + accSagittalFlat143CDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 68 -53 0 63 23 -23 b 45 -157 52 -81 45 -115 l 89 -157 b 240 -68 89 -98 140 -68 l 315 -68 b 428 -248 364 -68 402 -127 l 449 -248 l 449 517 l 405 517 l 405 -14 b 337 23 386 10 363 23 l 315 23 l 315 517 l 271 517 l 271 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z', + }, + accSagittalSharp11v49CUp: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -68 b 135 68 45 23 76 68 l 337 68 b 405 95 363 68 386 76 l 405 -27 b 315 -68 386 -55 356 -68 l 112 -68 b 0 -292 37 -68 0 -143 l 45 -292 b 135 -157 45 -203 75 -157 l 135 -517 l 180 -517 l 180 -157 l 271 -157 l 271 -517 l 315 -517 l 315 -157 l 337 -157 b 405 -130 360 -157 383 -148 l 405 -517 l 449 -517 l 449 248 l 428 248 b 315 157 413 187 376 157 l 112 157 b 0 -68 37 157 0 82 z', + }, + accSagittalFlat11v49CDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 68 b 112 -157 0 -82 37 -157 l 315 -157 b 428 -248 376 -157 413 -187 l 449 -248 l 449 517 l 405 517 l 405 130 b 337 157 383 148 360 157 l 315 157 l 315 517 l 271 517 l 271 157 l 180 157 l 180 517 l 135 517 l 135 157 b 45 292 75 157 45 203 l 0 292 b 112 68 0 143 37 68 l 315 68 b 405 27 356 68 386 55 l 405 -95 b 337 -68 386 -76 363 -68 l 135 -68 b 45 68 76 -68 45 -23 z', + }, + accSagittalSharp19CUp: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 89 -109 l 89 -517 l 135 -517 l 135 -109 b 225 -27 170 -102 200 -75 l 225 -517 l 271 -517 l 271 14 b 337 -23 289 -10 311 -23 l 360 -23 l 360 -517 l 405 -517 l 405 -23 b 495 -203 465 -23 495 -82 l 540 -203 b 428 68 540 -23 503 68 l 360 68 b 248 248 310 68 271 128 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 89 -109 0 -39 30 -98 z', + }, + accSagittalFlat19CDown: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 89 109 b 0 -68 30 98 0 39 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 b 360 -68 271 -128 310 -68 l 428 -68 b 540 203 503 -68 540 23 l 495 203 b 405 23 495 82 465 23 l 405 517 l 360 517 l 360 23 l 337 23 b 271 -14 311 23 289 10 l 271 517 l 225 517 l 225 27 b 135 109 200 75 170 102 l 135 517 l 89 517 z', + }, + accSagittalSharp7v19CUp: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 89 -109 l 89 -517 l 135 -517 l 135 -109 b 225 -27 170 -102 200 -75 l 225 -517 l 271 -517 l 271 112 l 315 112 b 360 109 331 112 346 112 l 360 -517 l 405 -517 l 405 98 b 495 -68 465 73 495 19 l 495 -248 l 540 -248 l 540 68 b 360 248 540 189 480 248 l 248 248 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 89 -109 0 -39 30 -98 z', + }, + accSagittalFlat7v19CDown: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 89 109 b 0 -68 30 98 0 39 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 l 360 -248 b 540 -68 480 -248 540 -189 l 540 248 l 495 248 l 495 68 b 405 -98 495 -19 465 -73 l 405 517 l 360 517 l 360 -109 b 315 -112 346 -112 331 -112 l 271 -112 l 271 517 l 225 517 l 225 27 b 135 109 200 75 170 102 l 135 517 l 89 517 z', + }, + accSagittalSharp49SUp: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 203 -23 b 271 14 229 -23 251 -10 l 271 -517 l 315 -517 l 315 112 l 360 112 b 405 109 376 112 390 112 l 405 -517 l 449 -517 l 449 96 b 540 -68 510 72 540 17 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z', + }, + accSagittalFlat49SDown: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 449 -96 540 -17 510 -72 l 449 517 l 405 517 l 405 -109 b 360 -112 390 -112 376 -112 l 315 -112 l 315 517 l 271 517 l 271 -14 b 203 23 251 10 229 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z', + }, + accSagittalSharp23SUp: { + x_min: 0, + x_max: 469, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 203 -23 b 271 14 229 -23 251 -10 l 271 -517 l 315 -517 l 315 71 l 405 -14 l 405 -517 l 449 -517 l 449 -56 l 675 -268 l 675 -112 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z', + }, + accSagittalFlat23SDown: { + x_min: 0, + x_max: 469, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 675 112 l 675 268 l 449 56 l 449 517 l 405 517 l 405 14 l 315 -71 l 315 517 l 271 517 l 271 -14 b 203 23 251 10 229 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z', + }, + accSagittalSharp5v13MUp: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 495 141 l 495 14 l 0 -157 l 0 -256 l 225 -180 l 225 -517 l 271 -517 l 271 -161 l 360 -130 l 360 -517 l 405 -517 l 405 -115 l 495 -84 l 495 -517 l 540 -517 l 540 248 l 517 248 b 167 168 366 194 248 168 b 45 248 85 168 45 194 l 0 248 b 95 99 0 170 30 120 l 0 68 l 0 -30 z', + }, + accSagittalFlat5v13MDown: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 30 l 0 -68 l 95 -99 b 0 -248 30 -120 0 -170 l 45 -248 b 167 -168 45 -194 85 -168 b 517 -248 248 -168 366 -194 l 540 -248 l 540 517 l 495 517 l 495 84 l 405 115 l 405 517 l 360 517 l 360 130 l 271 161 l 271 517 l 225 517 l 225 180 l 0 256 l 0 157 l 495 -14 l 495 -141 z', + }, + accSagittalSharp11v19MUp: { + x_min: 0, + x_max: 438, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 14 b 428 -23 379 -10 402 -23 l 449 -23 l 449 -517 l 495 -517 l 495 -23 b 585 -203 554 -23 585 -84 l 631 -203 b 517 68 631 -23 593 68 l 449 68 b 337 248 400 68 363 127 l 225 248 b 0 68 75 248 0 187 z', + }, + accSagittalFlat11v19MDown: { + x_min: 0, + x_max: 438, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 337 -248 b 449 -68 363 -127 400 -68 l 517 -68 b 631 203 593 -68 631 23 l 585 203 b 495 23 585 84 554 23 l 495 517 l 449 517 l 449 23 l 428 23 b 360 -14 402 23 379 10 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z', + }, + accSagittalSharp49MUp: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -248 l 45 -248 l 225 -180 l 225 -517 l 271 -517 l 271 -166 l 360 -132 l 360 -517 l 405 -517 l 405 -117 l 495 -84 l 495 -517 l 540 -517 l 540 248 l 360 248 b 0 -68 120 248 0 143 z m 45 -145 l 45 -68 b 360 112 45 53 150 112 l 495 112 l 495 14 z', + }, + accSagittalFlat49MDown: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 68 b 360 -248 0 -143 120 -248 l 540 -248 l 540 517 l 495 517 l 495 84 l 405 117 l 405 517 l 360 517 l 360 132 l 271 166 l 271 517 l 225 517 l 225 180 l 45 248 l 0 248 z m 495 -14 l 495 -112 l 360 -112 b 45 68 150 -112 45 -53 l 45 145 z', + }, + accSagittalSharp5v49MUp: { + x_min: 0, + x_max: 469, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -271 l 180 -79 l 180 -517 l 225 -517 l 225 -30 l 315 65 l 315 -517 l 360 -517 l 360 65 l 449 -30 l 449 -517 l 495 -517 l 495 -79 l 675 -271 l 675 -112 l 337 248 b 118 89 239 143 166 89 b 45 157 68 89 45 112 l 0 157 b 107 0 0 62 36 10 l 0 -112 z', + }, + accSagittalFlat5v49MDown: { + x_min: 0, + x_max: 469, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 112 l 107 0 b 0 -157 36 -10 0 -62 l 45 -157 b 118 -89 45 -112 68 -89 b 337 -248 166 -89 239 -143 l 675 112 l 675 271 l 495 79 l 495 517 l 449 517 l 449 30 l 360 -65 l 360 517 l 315 517 l 315 -65 l 225 30 l 225 517 l 180 517 l 180 79 l 0 271 z', + }, + accSagittalSharp49LUp: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 -82 l 135 -112 l 135 -517 l 180 -517 l 180 -127 l 271 -157 l 271 -517 l 315 -517 l 315 -173 l 540 -248 l 585 -248 l 585 -68 b 180 248 585 143 449 248 l 0 248 z m 45 112 l 180 112 b 540 -68 420 112 540 53 l 540 -145 l 45 16 z', + }, + accSagittalFlat49LDown: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 180 -248 b 585 68 449 -248 585 -143 l 585 248 l 540 248 l 315 173 l 315 517 l 271 517 l 271 157 l 180 127 l 180 517 l 135 517 l 135 112 l 45 82 l 45 517 l 0 517 z m 45 -16 l 540 145 l 540 68 b 180 -112 540 -53 420 -112 l 45 -112 z', + }, + accSagittalSharp11v19LUp: { + x_min: 0, + x_max: 438, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 -81 l 135 -108 l 135 -517 l 180 -517 l 180 -121 l 271 -148 l 271 -517 l 315 -517 l 315 -161 l 631 -255 l 631 -157 l 45 16 l 45 144 l 631 -30 l 631 68 l 23 248 l 0 248 z', + }, + accSagittalFlat11v19LDown: { + x_min: 0, + x_max: 438, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 23 -248 l 631 -68 l 631 30 l 45 -144 l 45 -16 l 631 157 l 631 255 l 315 161 l 315 517 l 271 517 l 271 148 l 180 121 l 180 517 l 135 517 l 135 108 l 45 81 l 45 517 l 0 517 z', + }, + accSagittalSharp5v13LUp: { + x_min: 0, + x_max: 500, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 89 -109 l 89 -517 l 135 -517 l 135 -109 b 225 -27 170 -102 200 -75 l 225 -517 l 271 -517 l 271 -85 l 360 -120 l 360 -517 l 405 -517 l 405 -135 l 720 -256 l 720 -157 l 271 14 l 271 141 l 720 -30 l 720 68 l 248 248 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 89 -109 0 -39 30 -98 z', + }, + accSagittalFlat5v13LDown: { + x_min: 0, + x_max: 500, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 89 109 b 0 -68 30 98 0 39 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 l 720 -68 l 720 30 l 271 -141 l 271 -14 l 720 157 l 720 256 l 405 135 l 405 517 l 360 517 l 360 120 l 271 85 l 271 517 l 225 517 l 225 27 b 135 109 200 75 170 102 l 135 517 l 89 517 z', + }, + accSagittalDoubleSharp23SDown: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -203 l 45 -203 b 135 -23 45 -82 76 -23 l 301 -23 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 370 -14 b 449 112 423 10 449 53 l 449 248 l 428 248 b 315 68 402 127 364 68 l 240 68 b 89 157 140 68 89 98 l 45 157 b 68 53 45 115 52 81 b 0 -203 23 23 0 -63 z', + }, + accSagittalDoubleFlat23SUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 68 -53 0 63 23 -23 b 45 -157 52 -81 45 -115 l 89 -157 b 240 -68 89 -98 140 -68 l 315 -68 b 428 -248 364 -68 402 -127 l 449 -248 l 449 -112 b 370 14 449 -53 423 -10 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 301 23 l 135 23 b 45 203 76 23 45 82 z', + }, + accSagittalDoubleSharp49SDown: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -292 l 45 -292 b 112 -157 45 -203 68 -157 l 256 -157 l 135 -503 l 187 -517 l 337 -82 l 490 -517 l 540 -503 l 366 0 l 396 89 b 449 157 416 102 435 125 l 449 248 l 428 248 b 315 157 413 187 376 157 l 112 157 b 0 -68 39 157 0 82 l 45 -68 b 135 68 45 23 76 68 l 287 68 l 311 0 l 288 -68 l 89 -68 b 0 -292 32 -68 0 -144 z', + }, + accSagittalDoubleFlat49SUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 292 b 89 68 0 144 32 68 l 288 68 l 311 0 l 287 -68 l 135 -68 b 45 68 76 -68 45 -23 l 0 68 b 112 -157 0 -82 39 -157 l 315 -157 b 428 -248 376 -157 413 -187 l 449 -248 l 449 -157 b 396 -89 435 -125 416 -102 l 366 0 l 540 503 l 490 517 l 337 82 l 187 517 l 135 503 l 256 157 l 112 157 b 45 292 68 157 45 203 z', + }, + accSagittalDoubleSharp7v19CDown: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -112 l 0 -266 l 307 -7 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 366 0 l 386 59 l 449 112 l 449 248 l 428 248 b 130 68 285 127 186 68 b 45 157 73 68 45 98 l 0 157 b 112 -20 0 53 37 -6 z', + }, + accSagittalDoubleFlat7v19CUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 112 20 b 0 -157 37 6 0 -53 l 45 -157 b 130 -68 45 -98 73 -68 b 428 -248 186 -68 285 -127 l 449 -248 l 449 -112 l 386 -59 l 366 0 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 307 7 l 0 266 l 0 112 z', + }, + accSagittalDoubleSharp19CDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 315 109 45 36 135 95 l 354 0 l 180 -503 l 232 -517 l 383 -82 l 534 -517 l 585 -503 l 410 0 l 449 112 l 495 112 l 495 248 l 360 248 b 0 68 120 248 0 187 z m 372 112 l 393 112 l 383 82 z', + }, + accSagittalDoubleFlat19CUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 360 -248 0 -187 120 -248 l 495 -248 l 495 -112 l 449 -112 l 410 0 l 585 503 l 534 517 l 383 82 l 232 517 l 180 503 l 354 0 l 315 -109 b 45 68 135 -95 45 -36 l 45 248 l 0 248 z m 383 -82 l 393 -112 l 372 -112 z', + }, + accSagittalDoubleSharp11v49CDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 203 -23 b 262 4 225 -23 245 -13 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 360 112 b 540 -68 480 112 540 53 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z', + }, + accSagittalDoubleFlat11v49CUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 360 -112 540 -53 480 -112 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 262 -4 b 203 23 245 13 225 23 l 135 23 b 45 203 75 23 45 84 z', + }, + accSagittalDoubleSharp143CDown: { + x_min: 0, + x_max: 469, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 203 -23 b 262 4 225 -23 245 -13 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 337 49 l 675 -268 l 675 -112 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z', + }, + accSagittalDoubleFlat143CUp: { + x_min: 0, + x_max: 469, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 675 112 l 675 268 l 337 -49 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 262 -4 b 203 23 245 13 225 23 l 135 23 b 45 203 75 23 45 84 z', + }, + accSagittalDoubleSharp17kDown: { + x_min: 0, + x_max: 438, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 248 b 95 101 0 170 30 121 l 0 68 l 0 -30 l 364 96 l 399 0 l 390 -23 l 0 -157 l 0 -255 l 353 -135 l 225 -503 l 275 -517 l 428 -82 l 577 -517 l 631 -503 l 455 0 l 507 145 l 540 157 l 540 248 l 517 248 b 167 168 366 194 248 168 b 45 248 85 168 45 194 z m 416 115 l 442 124 l 428 82 z', + }, + accSagittalDoubleFlat17kUp: { + x_min: 0, + x_max: 438, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 45 -248 b 167 -168 45 -194 85 -168 b 517 -248 248 -168 366 -194 l 540 -248 l 540 -157 l 507 -145 l 455 0 l 631 503 l 577 517 l 428 82 l 275 517 l 225 503 l 353 135 l 0 255 l 0 157 l 390 23 l 399 0 l 364 -96 l 0 30 l 0 -68 l 95 -101 b 0 -248 30 -121 0 -170 z m 428 -82 l 442 -124 l 416 -115 z', + }, + accSagittalDoubleSharp19sDown: { + x_min: 0, + x_max: 438, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -248 l 45 -248 l 45 -68 b 271 112 45 53 120 112 l 310 0 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 366 0 l 367 4 b 428 -23 386 -13 405 -23 l 495 -23 b 585 -203 554 -23 585 -84 l 631 -203 b 517 68 631 -23 593 68 l 449 68 b 337 248 400 68 363 127 l 225 248 b 0 68 75 248 0 187 z', + }, + accSagittalDoubleFlat19sUp: { + x_min: 0, + x_max: 438, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 337 -248 b 449 -68 363 -127 400 -68 l 517 -68 b 631 203 593 -68 631 23 l 585 203 b 495 23 585 84 554 23 l 428 23 b 367 -4 405 23 386 13 l 366 0 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 310 0 l 271 -112 b 45 68 120 -112 45 -53 l 45 248 l 0 248 z', + }, + accSagittalShaftUp: { + x_min: 0, + x_max: 31, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 112 l 0 -517 l 45 -517 l 45 112 l 23 248 z', + }, + accSagittalShaftDown: { + x_min: 0, + x_max: 31, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 23 -248 l 45 -112 l 45 517 l 0 517 l 0 -112 z', + }, + accSagittalAcute: { + x_min: 0, + x_max: 125, + y_min: -62, + y_max: 125, + ha: 187, + o: 'm 0 0 l 0 -89 l 180 89 l 180 180 z', + }, + accSagittalGrave: { + x_min: 0, + x_max: 125, + y_min: -125, + y_max: 62, + ha: 187, + o: 'm 180 -180 l 180 -89 l 0 89 l 0 0 z', + }, + accSagittal1MinaUp: { + x_min: -7, + x_max: 124, + y_min: 16, + y_max: 106.31676725154982, + ha: 90.31676725154982, + o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 134 150 179 112 163 135 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z', + }, + accSagittal1MinaDown: { + x_min: -7, + x_max: 124, + y_min: -106.31676725154983, + y_max: -16, + ha: 90.31676725154983, + o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 179 -23 163 -135 179 -112 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z', + }, + accSagittal2MinasUp: { + x_min: -7, + x_max: 218, + y_min: 16, + y_max: 106.31676725154982, + ha: 90.31676725154982, + o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 207 65 179 23 200 55 b 252 107 223 86 240 107 b 271 23 264 107 272 86 l 314 23 b 269 150 314 112 298 135 b 203 130 252 158 220 150 b 173 92 190 115 181 104 b 134 150 167 127 154 140 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z', + }, + accSagittal2MinasDown: { + x_min: -7, + x_max: 218, + y_min: -106.31676725154983, + y_max: -16, + ha: 90.31676725154983, + o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 173 -92 154 -140 167 -127 b 203 -130 181 -104 190 -115 b 269 -150 220 -150 252 -158 b 314 -23 298 -135 314 -112 l 271 -23 b 252 -107 272 -86 264 -107 b 207 -65 240 -107 223 -86 b 179 -23 200 -55 179 -23 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z', + }, + accSagittal1TinaUp: { + x_min: 0, + x_max: 93, + y_min: 16, + y_max: 107, + ha: 91, + o: 'm 134 154 l 91 154 b 81 76 91 101 91 86 b 0 68 73 69 48 68 l 0 23 b 134 154 122 23 134 36 z', + }, + accSagittal1TinaDown: { + x_min: 0, + x_max: 93, + y_min: -107, + y_max: -16, + ha: 91, + o: 'm 134 -154 b 0 -23 134 -36 122 -23 l 0 -68 b 81 -76 48 -68 73 -69 b 91 -154 91 -86 91 -101 z', + }, + accSagittal2TinasUp: { + x_min: 0, + x_max: 94, + y_min: 16, + y_max: 107, + ha: 91, + o: 'm 135 68 b 89 154 94 68 89 124 l 46 154 b 36 92 45 131 42 105 b 0 68 32 82 23 68 l 0 23 b 68 63 29 23 53 40 b 135 23 84 39 104 23 z', + }, + accSagittal2TinasDown: { + x_min: 0, + x_max: 94, + y_min: -107, + y_max: -16, + ha: 91, + o: 'm 135 -23 b 68 -63 104 -23 84 -39 b 0 -23 53 -40 29 -23 l 0 -68 b 36 -92 23 -68 32 -82 b 46 -154 42 -105 45 -131 l 89 -154 b 135 -68 89 -124 94 -68 z', + }, + accSagittal3TinasUp: { + x_min: -7, + x_max: 124, + y_min: 16, + y_max: 106.31676725154982, + ha: 90.31676725154982, + o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 134 150 179 112 163 135 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z', + }, + accSagittal3TinasDown: { + x_min: -7, + x_max: 124, + y_min: -106.31676725154983, + y_max: -16, + ha: 90.31676725154983, + o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 179 -23 163 -135 179 -112 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z', + }, + accSagittal4TinasUp: { + x_min: 0, + x_max: 187, + y_min: 16, + y_max: 106.69999999999997, + ha: 90.69999999999997, + o: 'm 0 68 l 0 23 b 143 45 105 23 124 26 b 203 107 153 55 183 107 b 226 23 216 107 226 86 l 269 23 b 225 150 269 112 253 135 b 160 132 207 158 181 153 b 115 81 138 112 124 88 b 0 68 104 71 94 68 z', + }, + accSagittal4TinasDown: { + x_min: 0, + x_max: 187, + y_min: -106.69999999999999, + y_max: -16, + ha: 90.69999999999999, + o: 'm 0 -68 b 115 -81 94 -68 104 -71 b 160 -132 124 -88 138 -112 b 225 -150 181 -153 207 -158 b 269 -23 253 -135 269 -112 l 226 -23 b 203 -107 226 -86 216 -107 b 143 -45 183 -107 153 -55 b 0 -23 124 -26 105 -23 z', + }, + accSagittal5TinasUp: { + x_min: 0, + x_max: 218, + y_min: 16, + y_max: 107, + ha: 91, + o: 'm 135 23 b 187 45 156 23 168 26 b 249 107 197 55 228 107 b 271 23 262 107 271 86 l 314 23 b 269 150 314 112 298 135 b 204 132 252 158 226 153 b 160 81 183 112 168 88 b 135 68 148 71 147 68 b 89 154 94 68 89 124 l 46 154 b 36 92 45 131 42 105 b 0 68 32 82 23 68 l 0 23 b 68 63 29 23 53 40 b 135 23 84 39 104 23 z', + }, + accSagittal5TinasDown: { + x_min: 0, + x_max: 218, + y_min: -107, + y_max: -16, + ha: 91, + o: 'm 135 -23 b 68 -63 104 -23 84 -39 b 0 -23 53 -40 29 -23 l 0 -68 b 36 -92 23 -68 32 -82 b 46 -154 42 -105 45 -131 l 89 -154 b 135 -68 89 -124 94 -68 b 160 -81 147 -68 148 -71 b 204 -132 168 -88 183 -112 b 269 -150 226 -153 252 -158 b 314 -23 298 -135 314 -112 l 271 -23 b 249 -107 271 -86 262 -107 b 187 -45 228 -107 197 -55 b 135 -23 168 -26 156 -23 z', + }, + accSagittal6TinasUp: { + x_min: -7, + x_max: 218, + y_min: 16, + y_max: 106.31676725154982, + ha: 90.31676725154982, + o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 207 65 179 23 200 55 b 252 107 223 86 240 107 b 271 23 264 107 272 86 l 314 23 b 269 150 314 112 298 135 b 203 130 252 158 220 150 b 173 92 190 115 181 104 b 134 150 167 127 154 140 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z', + }, + accSagittal6TinasDown: { + x_min: -7, + x_max: 218, + y_min: -106.31676725154983, + y_max: -16, + ha: 90.31676725154983, + o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 173 -92 154 -140 167 -127 b 203 -130 181 -104 190 -115 b 269 -150 220 -150 252 -158 b 314 -23 298 -135 314 -112 l 271 -23 b 252 -107 272 -86 264 -107 b 207 -65 240 -107 223 -86 b 179 -23 200 -55 179 -23 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z', + }, + accSagittal7TinasUp: { + x_min: 0, + x_max: 281, + y_min: 16, + y_max: 106.69999999999997, + ha: 90.69999999999997, + o: 'm 0 68 l 0 23 b 143 45 105 23 124 26 b 203 107 153 55 183 107 b 226 23 216 107 226 86 l 269 23 b 298 65 269 23 291 55 b 343 107 314 86 331 107 b 361 23 354 107 363 86 l 405 23 b 360 150 405 112 389 135 b 294 130 343 158 311 150 b 264 92 281 115 272 104 b 225 150 258 127 245 140 b 160 132 207 158 181 153 b 115 81 138 112 124 88 b 0 68 104 71 94 68 z', + }, + accSagittal7TinasDown: { + x_min: 0, + x_max: 281, + y_min: -106.69999999999999, + y_max: -16, + ha: 90.69999999999999, + o: 'm 0 -68 b 115 -81 94 -68 104 -71 b 160 -132 124 -88 138 -112 b 225 -150 181 -153 207 -158 b 264 -92 245 -140 258 -127 b 294 -130 272 -104 281 -115 b 360 -150 311 -150 343 -158 b 405 -23 389 -135 405 -112 l 361 -23 b 343 -107 363 -86 354 -107 b 298 -65 331 -107 314 -86 b 269 -23 291 -55 269 -23 l 226 -23 b 203 -107 226 -86 216 -107 b 143 -45 183 -107 153 -55 b 0 -23 124 -26 105 -23 z', + }, + accSagittal8TinasUp: { + x_min: 0, + x_max: 312, + y_min: 16, + y_max: 107, + ha: 91, + o: 'm 135 23 b 187 45 156 23 168 26 b 249 107 197 55 228 107 b 271 23 262 107 271 86 l 314 23 b 343 65 314 23 336 55 b 387 107 359 86 376 107 b 406 23 399 107 408 86 l 449 23 b 405 150 449 112 433 135 b 338 130 387 158 356 150 b 308 92 325 115 317 104 b 269 150 302 127 289 140 b 204 132 252 158 226 153 b 160 81 183 112 168 88 b 135 68 148 71 147 68 b 89 154 94 68 89 124 l 46 154 b 36 92 45 131 42 105 b 0 68 32 82 23 68 l 0 23 b 68 63 29 23 53 40 b 135 23 84 39 104 23 z', + }, + accSagittal8TinasDown: { + x_min: 0, + x_max: 312, + y_min: -107, + y_max: -16, + ha: 91, + o: 'm 135 -23 b 68 -63 104 -23 84 -39 b 0 -23 53 -40 29 -23 l 0 -68 b 36 -92 23 -68 32 -82 b 46 -154 42 -105 45 -131 l 89 -154 b 135 -68 89 -124 94 -68 b 160 -81 147 -68 148 -71 b 204 -132 168 -88 183 -112 b 269 -150 226 -153 252 -158 b 308 -92 289 -140 302 -127 b 338 -130 317 -104 325 -115 b 405 -150 356 -150 387 -158 b 449 -23 433 -135 449 -112 l 406 -23 b 387 -107 408 -86 399 -107 b 343 -65 376 -107 359 -86 b 314 -23 336 -55 314 -23 l 271 -23 b 249 -107 271 -86 262 -107 b 187 -45 228 -107 197 -55 b 135 -23 168 -26 156 -23 z', + }, + accSagittal9TinasUp: { + x_min: -7, + x_max: 312, + y_min: 16, + y_max: 106.31676725154982, + ha: 90.31676725154982, + o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 207 65 179 23 200 55 b 252 107 223 86 240 107 b 271 23 264 107 272 86 l 314 23 b 343 65 314 23 336 55 b 387 107 359 86 376 107 b 406 23 399 107 408 86 l 449 23 b 405 150 449 112 433 135 b 338 130 387 158 356 150 b 308 92 325 115 317 104 b 269 150 302 127 289 140 b 203 130 252 158 220 150 b 173 92 190 115 181 104 b 134 150 167 127 154 140 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z', + }, + accSagittal9TinasDown: { + x_min: -7, + x_max: 312, + y_min: -106.31676725154983, + y_max: -16, + ha: 90.31676725154983, + o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 173 -92 154 -140 167 -127 b 203 -130 181 -104 190 -115 b 269 -150 220 -150 252 -158 b 308 -92 289 -140 302 -127 b 338 -130 317 -104 325 -115 b 405 -150 356 -150 387 -158 b 449 -23 433 -135 449 -112 l 406 -23 b 387 -107 408 -86 399 -107 b 343 -65 376 -107 359 -86 b 314 -23 336 -55 314 -23 l 271 -23 b 252 -107 272 -86 264 -107 b 207 -65 240 -107 223 -86 b 179 -23 200 -55 179 -23 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z', + }, + accSagittalFractionalTinaUp: { + x_min: -3, + x_max: 35, + y_min: 73, + y_max: 111, + ha: 38, + o: 'm -4 132 b 23 105 -4 118 9 105 b 50 132 37 105 50 118 b 23 160 50 147 37 160 b -4 132 9 160 -4 147 z', + }, + accSagittalFractionalTinaDown: { + x_min: -3, + x_max: 35, + y_min: -111, + y_max: -73, + ha: 38, + o: 'm -4 -132 b 23 -160 -4 -147 9 -160 b 50 -132 37 -160 50 -147 b 23 -105 50 -118 37 -105 b -4 -132 9 -105 -4 -118 z', + }, + accidentalNarrowReversedFlat: { + x_min: 0, + x_max: 164, + y_min: -194, + y_max: 421, + ha: 615, + o: 'm 236 -279 l 236 606 l 192 606 l 192 179 b 85 243 150 222 114 243 b 0 84 23 243 0 134 b 112 -158 0 3 37 -78 z m 192 112 l 192 -163 l 135 -98 b 82 40 101 -50 82 -3 b 138 144 82 73 96 144 b 192 112 153 144 170 132 z', + }, + accidentalNarrowReversedFlatAndFlat: { + x_min: 0, + x_max: 414, + y_min: -194, + y_max: 421, + ha: 615, + o: 'm 281 606 l 281 -268 l 438 -158 b 596 84 547 -82 596 3 b 475 243 596 154 556 243 b 325 179 435 243 384 222 l 325 606 z m 235 -279 l 235 606 l 190 606 l 190 179 b 85 243 148 222 114 243 b 12 158 52 243 27 215 b 0 84 3 134 0 108 b 112 -158 0 3 37 -78 z m 325 111 b 410 144 359 132 386 144 b 498 36 462 144 498 84 b 413 -107 498 -9 469 -58 l 325 -173 z m 192 112 l 192 -163 l 135 -98 b 81 40 99 -50 81 -3 b 91 94 81 59 84 76 b 137 144 102 127 118 144 b 192 112 153 144 170 132 z', + }, + accidentalWilsonPlus: { + x_min: 0, + x_max: 281, + y_min: -203, + y_max: 203, + ha: 406, + o: 'm 405 268 l 225 98 l 225 292 l 180 292 l 180 56 l 0 -112 l 0 -268 l 180 -98 l 180 -292 l 225 -292 l 225 -56 l 405 112 z', + }, + accidentalWilsonMinus: { + x_min: 0, + x_max: 281, + y_min: -186, + y_max: 186, + ha: 372, + o: 'm 0 112 l 405 -268 l 405 -112 l 0 268 z', + }, + }, + fontFamily: 'Bravura', + resolution: 1000, + generatedOn: '2021-12-06T21:04:30.234Z', +}; + + +/***/ }), + +/***/ "./src/fonts/bravura_metrics.ts": +/*!**************************************!*\ + !*** ./src/fonts/bravura_metrics.ts ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "BravuraMetrics": () => (/* binding */ BravuraMetrics) +/* harmony export */ }); +/** + * The Bravura font was created by Daniel Spreadbury @ Steinberg. + * https://github.com/steinbergmedia/bravura/ + */ +const BravuraMetrics = { + name: 'Bravura', + smufl: true, + stave: { + padding: 12, + endPaddingMax: 10, + endPaddingMin: 5, + unalignedNotePadding: 10, + }, + accidental: { + noteheadAccidentalPadding: 1, + leftPadding: 2, + accidentalSpacing: 3, + }, + clef: { + default: { + point: 32, + width: 26, + }, + small: { + point: 26, + width: 20, + }, + annotations: { + '8va': { + smuflCode: 'timeSig8', + default: { + point: 18, + treble: { + line: -1.4, + shiftX: 12, + }, + }, + small: { + point: 16, + treble: { + line: -0.2, + shiftX: 8, + }, + }, + }, + '8vb': { + smuflCode: 'timeSig8', + default: { + point: 18, + treble: { + line: 6, + shiftX: 10, + }, + bass: { + line: 3.5, + shiftX: 1, + }, + }, + small: { + point: 16, + treble: { + line: 5.3, + shiftX: 6, + }, + bass: { + line: 3.1, + shiftX: 0.5, + }, + }, + }, + }, + // These may no longer be necessary + lineCount: { + '8': { point: 55, shiftY: 14 }, + '7': { point: 47, shiftY: 8 }, + '6': { point: 32, shiftY: 1 }, + '5': { point: 30, shiftY: -6 }, + '4': { point: 23, shiftY: -12 }, + }, + }, + parenthesis: { + default: { + point: 39, + width: 7, + }, + gracenote: { + point: (39 * 3) / 5, + width: 3, + }, + }, + pedalMarking: { + up: { + point: 40, + }, + down: { + point: 34, + }, + }, + // These are for numeric digits, such as in time signatures + digits: { + // used by timesig + shiftLine: -1, + point: 34, + // used by tuplets + tupletPoint: 22, + shiftY: -6, + }, + articulation: { + articStaccatissimoAbove: { + padding: 2, + }, + articStaccatissimoBelow: { + padding: 2, + }, + }, + tremolo: { + default: { + point: 25, + spacing: 5, + offsetYStemUp: -5, + offsetYStemDown: 5, + offsetXStemUp: 11, + offsetXStemDown: 1, + }, + grace: { + point: 18, + spacing: 4, + offsetYStemUp: -5, + offsetYStemDown: 5, + offsetXStemUp: 7, + offsetXStemDown: 1, + }, + }, + staveRepetition: { + default: { + offsetY: 25, + offsetSymbol: 12, + spacing: 5, + }, + }, + // noteHead: { + // }, + stem: { + heightAdjustmentForFlag: -3, + // These are stem (Y) offsets to the note heads. To shift the + // noteheads (x-position) themselves, see glyphs.notehead.custom. + noteHead: { + noteheadTriangleUpHalf: { + offsetYBaseStemUp: 5, + offsetYBaseStemDown: 4, + }, + noteheadTriangleUpBlack: { + offsetYBaseStemUp: 5, + offsetYBaseStemDown: 4, + }, + noteheadTriangleUpWhole: { + offsetYBaseStemUp: 5, + offsetYBaseStemDown: 4, + }, + noteheadXHalf: { + offsetYBaseStemUp: -4, + offsetYBaseStemDown: 4, + }, + noteheadXBlack: { + offsetYBaseStemUp: -4, + offsetYBaseStemDown: 4, + }, + noteheadXWhole: { + offsetYBaseStemUp: -4, + offsetYBaseStemDown: 4, + }, + noteheadHalf: { + offsetYBaseStemUp: -2.55, + offsetYBaseStemDown: 2.65, + }, + noteheadBlack: { + offsetYBaseStemUp: -2, + offsetYBaseStemDown: 2, + }, + noteheadSquareWhite: { + offsetYBaseStemDown: -5, + offsetYBaseStemUp: 5, + }, + }, + }, + // Values under here are used by the Glyph class to reposition and rescale + // glyphs based on their category. This should be the first stop for + // custom font glyph repositioning. + // + // The glyph loader first looks up a specific set of settings based on the + // glyph code, and if not found, uses the defaults from the category. See + // glyphs.textNote for an example of this. + // + // Details in Glyph.lookupFontMetrics. + glyphs: { + coda: { + point: 20, + shiftX: -7, + shiftY: 8, + }, + segno: { + shiftX: -7, + }, + flag: { + shiftX: -0.75, + tabStem: { + shiftX: -1.75, + }, + staveTempo: { + shiftX: -1, + }, + }, + clef: { + gClef: { + default: { scale: 1.1, shiftY: 1 }, + small: { shiftY: 1.5 }, + }, + fClef: { + default: { shiftY: -0.5 }, + }, + }, + ornament: { + ornamentTurn: { + scale: 1.2, + }, + ornamentTurnSlash: { + scale: 1.2, + }, + }, + stringNumber: { + verticalPadding: 8, + stemPadding: 2, + leftPadding: 5, + rightPadding: 6, + }, + stroke: { + arrowheadBlackDown: { + straight: { + shiftX: -4.5, + }, + wiggly: { + shiftX: -1, + shiftY: 1, + }, + }, + arrowheadBlackUp: { + straight: { + shiftX: -0.85, + }, + wiggly: { + shiftX: -1, + shiftY: 1, + }, + }, + }, + textNote: { + point: 34, + breathMarkTick: { + point: 36, + shiftY: 9, + }, + breathMarkComma: { + point: 36, + }, + segno: { + point: 30, + shiftX: -7, + shiftY: 8, + }, + coda: { + point: 20, + shiftX: -7, + shiftY: 8, + }, + ornamentTrill: { + shiftX: -8, + shiftY: 8, + }, + ornamentTurn: { + point: 42, + }, + ornamentTurnSlash: { + point: 42, + }, + ornamentMordent: { + shiftX: -8, + }, + ornamentShortTrill: { + shiftX: -8, + }, + }, + noteHead: { + minPadding: 2, + standard: { + restQuarterStemUp: { + point: 35, + }, + restQuarterStemDown: { + point: 35, + }, + }, + custom: { + noteheadCircleXStemUp: { + shiftX: 1.5, + }, + noteheadCircleXStemDown: { + shiftX: 0.25, + }, + noteheadDiamondHalfStemUp: { + shiftX: 1.5, + }, + noteheadDiamondBlackStemUp: { + shiftX: 1.5, + }, + noteheadDiamondWholeStemUp: { + shiftX: 1, + }, + noteheadXHalfStemUp: { + shiftX: -2, + }, + noteheadXHalfStemDown: { + shiftX: 1, + }, + noteheadXWholeStemUp: { + shiftX: -4, + }, + noteheadXWholeStemDown: { + shiftX: 1, + }, + noteheadSquareWhiteStemDown: { + shiftX: 0.25, + }, + noteheadSquareWhiteStemUp: { + shiftX: -0.75, + }, + noteheadSquareBlackStemUp: { + shiftX: -0.75, + }, + noteheadTriangleUpWholeStemUp: { + shiftX: -0.75, + }, + }, + }, + chordSymbol: { + global: { + superscriptOffset: -400, + subscriptOffset: 300, + kerningOffset: -250, + lowerKerningText: ['D', 'F', 'P', 'T', 'V', 'Y'], + upperKerningText: ['A', 'L'], + spacing: 100, + superSubRatio: 0.66, + }, + csymDiminished: { + scale: 0.8, + leftSideBearing: -32, + advanceWidth: 506, + yOffset: 0, + }, + csymHalfDiminished: { + scale: 0.8, + leftSideBearing: -32, + advanceWidth: 506, + yOffset: 0, + }, + csymAugmented: { + scale: 1, + leftSideBearing: 0, + advanceWidth: 530, + yOffset: 0, + }, + csymParensLeftTall: { + scale: 0.8, + leftSideBearing: -20, + advanceWidth: 184, + yOffset: 250, + }, + csymParensRightTall: { + scale: 0.8, + leftSideBearing: 0, + advanceWidth: 189, + yOffset: 250, + }, + csymBracketLeftTall: { + scale: 0.8, + leftSideBearing: 0, + advanceWidth: 328, + yOffset: 0, + }, + csymBracketRightTall: { + scale: 0.8, + leftSideBearing: 1, + advanceWidth: 600, + yOffset: 0, + }, + csymParensLeftVeryTall: { + scale: 0.9, + leftSideBearing: 50, + advanceWidth: 121, + yOffset: 350, + }, + csymParensRightVeryTall: { + scale: 0.9, + leftSideBearing: 0, + advanceWidth: 111, + yOffset: 350, + }, + csymDiagonalArrangementSlash: { + scale: 0.6, + leftSideBearing: -1, + advanceWidth: 990, + yOffset: 0, + }, + csymMinor: { + scale: 0.8, + leftSideBearing: 0, + advanceWidth: 482, + yOffset: 0, + }, + csymMajorSeventh: { + scale: 0.9, + leftSideBearing: 200, + yOffset: 0, + advanceWidth: 600, + }, + accidentalSharp: { + scale: 0.75, + leftSideBearing: 20, + advanceWidth: 250, + yOffset: -302, + }, + accidentalFlat: { + scale: 0.9, + leftSideBearing: -20, + advanceWidth: 226, + yOffset: -184, + }, + }, + jazzOrnaments: { + brassScoop: { + scale: 1.0, + xOffset: -12, + yOffset: 0, + stemUpYOffset: 0, + reportedWidth: 10, + }, + brassDoitMedium: { + scale: 1.0, + xOffset: 16, + yOffset: 0, + stemUpYOffset: 0, + reportedWidth: 15, + }, + brassFallLipShort: { + scale: 1.0, + xOffset: 16, + yOffset: 0, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassLiftMedium: { + scale: 1.0, + xOffset: 16, + yOffset: 5, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassFallRoughMedium: { + scale: 1.0, + xOffset: 16, + yOffset: 28, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassBend: { + scale: 1.0, + xOffset: 2, + yOffset: -8, + stemUpYOffset: 25, + reportedWidth: 5, + }, + brassMuteClosed: { + scale: 1.0, + xOffset: 3, + yOffset: -8, + stemUpYOffset: 25, + reportedWidth: 5, + }, + brassMuteOpen: { + scale: 1.0, + xOffset: 3, + yOffset: -7, + stemUpYOffset: 25, + reportedWidth: 5, + }, + brassFlip: { + scale: 1.0, + xOffset: 10, + yOffset: -4, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassJazzTurn: { + scale: 1.0, + xOffset: 6, + yOffset: -4, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassSmear: { + scale: 1.0, + xOffset: 10, + yOffset: -4, + stemUpYOffset: 0, + reportedWidth: 5, + }, + }, + tuplet: { + noteHeadOffset: 20, + stemOffset: 10, + bottomLine: 4, + topModifierOffset: 15, + }, + }, +}; + + +/***/ }), + +/***/ "./src/fonts/custom_glyphs.ts": +/*!************************************!*\ + !*** ./src/fonts/custom_glyphs.ts ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "CustomFont": () => (/* binding */ CustomFont) +/* harmony export */ }); +const CustomFont = { + resolution: 1000, + fontFamily: 'VexFlowCustom', + glyphs: { + noteheadSquareWhite: { + x_min: 0, + x_max: 430.75, + ha: 386, + o: 'm 0 200 l 0 -200 l 430 -200 l 430 200 l 0 200 l 50 150 l 380 150 l 380 -150 l 50 -150 l 50 150 ', + }, + noteheadSquareBlack: { + x_min: 0, + x_max: 430.75, + ha: 386, + o: 'm 0 200 l 0 -200 l 430 -200 l 430 200 l 0 200 ', + }, + accidentalBuyukMucennebFlat: { + x_min: -171.5, + x_max: 251.8125, + ha: 257, + o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 553 20 616 20 614 b 20 491 20 503 20 491 l 20 491 b 153 535 47 501 149 535 b 174 514 167 535 174 524 b 164 496 174 508 171 501 b 92 470 164 495 132 484 l 20 445 l 20 390 b 20 363 20 378 20 370 b 20 333 20 340 20 333 l 20 333 b 153 377 47 344 149 377 b 174 356 167 377 174 367 b 164 338 174 349 171 342 b 92 312 164 338 132 326 l 20 288 l 20 219 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 30 -21 -212 -21 -212 b -21 273 -21 163 -21 273 b -84 252 -21 273 -50 263 b -152 230 -133 234 -145 230 b -157 231 -155 230 -156 231 b -171 252 -166 234 -171 244 b -160 270 -171 259 -167 266 b -27 316 -159 270 -93 294 l -21 319 l -21 374 b -21 431 -21 406 -21 431 b -84 409 -21 431 -50 421 b -152 388 -133 392 -145 388 b -157 390 -155 388 -156 388 b -171 409 -166 392 -171 401 b -160 428 -171 417 -167 424 b -27 474 -159 428 -93 451 l -21 476 l -21 546 b -20 620 -21 614 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ', + }, + accidentalBakiyeFlat: { + x_min: -176.9375, + x_max: 251.8125, + ha: 257, + o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 503 20 616 20 614 b 20 391 20 442 20 391 b 84 424 20 391 49 406 l 147 456 l 152 456 b 153 456 153 456 153 456 b 175 435 166 456 175 446 b 172 427 175 433 174 430 b 92 380 170 420 172 421 l 20 342 l 20 245 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 54 -21 -212 -21 -212 b -21 322 -21 201 -21 322 b -85 290 -21 322 -50 308 l -148 256 l -153 256 b -155 256 -155 256 -155 256 b -176 277 -167 256 -176 266 b -174 285 -176 280 -175 283 b -93 333 -171 294 -174 292 l -21 370 l -21 494 b -20 620 -21 616 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ', + }, + accidentalKucukMucennebSharp: { + x_min: -1.359375, + x_max: 255.890625, + ha: 261, + o: 'm 118 514 b 127 517 121 517 122 517 b 147 505 136 517 142 513 l 148 502 l 148 403 b 148 306 148 351 148 306 b 174 315 149 306 160 310 l 200 324 l 205 323 b 223 312 213 323 220 319 l 225 308 l 225 260 b 225 245 225 255 225 249 b 220 204 225 208 224 209 b 179 188 216 199 215 199 l 148 177 l 148 124 l 148 70 l 189 84 b 236 98 219 94 230 98 b 247 94 240 98 243 97 b 255 52 254 88 255 87 b 255 33 255 47 255 40 l 254 -12 l 253 -15 b 249 -22 253 -18 250 -20 l 245 -24 l 196 -41 l 148 -58 l 148 -108 b 148 -158 148 -136 148 -158 b 174 -148 148 -158 160 -154 b 204 -140 198 -140 200 -140 l 204 -140 b 224 -152 213 -140 221 -145 b 225 -201 224 -155 225 -177 b 224 -254 225 -226 224 -251 b 157 -284 220 -262 220 -262 l 148 -288 l 148 -395 l 148 -503 l 147 -506 b 127 -519 142 -514 134 -519 b 107 -506 119 -519 111 -514 l 106 -503 l 106 -403 b 106 -303 106 -316 106 -303 b 104 -303 104 -303 104 -303 b 88 -310 104 -303 96 -306 l 63 -319 b 51 -322 59 -320 55 -322 b 36 -315 46 -322 40 -319 b 31 -273 32 -309 31 -312 b 31 -258 31 -269 31 -263 l 31 -210 l 34 -206 b 40 -198 35 -204 38 -199 b 74 -186 42 -197 57 -191 l 106 -173 l 106 -123 b 106 -97 106 -112 106 -104 b 106 -72 106 -76 106 -72 b 104 -72 106 -72 106 -72 b 20 -99 89 -79 23 -99 b 0 -84 10 -99 2 -93 b -1 -37 0 -81 -1 -59 b 0 11 -1 -15 0 9 b 58 40 4 22 2 22 l 106 56 l 106 109 b 106 123 106 115 106 119 b 106 162 106 147 106 162 b 81 155 106 162 93 159 b 50 147 65 149 55 147 b 36 152 43 147 40 148 b 31 194 32 158 31 156 b 31 209 31 198 31 204 l 31 256 l 34 260 b 76 281 38 269 38 269 l 106 292 l 106 396 l 106 502 l 107 505 b 118 514 110 509 114 513 ', + }, + accidentalKoron: { + x_min: -20, + x_max: 320, + ha: 257, + o: 'm -8 200 b -8 210 8 200 16 200 l 20 148 -199 l 23 -615 b 0 -629 9 -629 6 -629 l -21 -612 l -21 -201 l -21 216 l -20 200 m 16 200 l 310 0 l 240 0 l 16 140 l 16 -120 l 240 0 l 310 0 l 16 -200 ', + }, + accidentalSori: { + x_min: -10.890625, + x_max: 299.4375, + ha: 294, + o: 'm 44 174 b 51 174 47 174 49 174 b 68 173 55 174 61 174 l 287 112 l 551 40 b 615 20 617 22 609 23 b 626 0 622 16 626 8 b 615 -22 626 -9 622 -18 b 613 -23 613 -23 613 -23 b 613 -23 613 -23 613 -23 b 287 -113 613 -24 597 -29 l 68 -174 b 53 -176 61 -176 57 -176 b 39 -172 47 -176 43 -174 b 27 -151 31 -167 27 -159 b 39 -129 27 -141 31 -133 b 230 -74 43 -124 20 -131 l 370 -36 l 468 -9 b 498 0 484 -4 498 -1 b 468 8 498 0 484 2 l 370 34 l 230 73 b 40 126 28 129 43 124 b 27 149 31 131 27 140 b 44 174 27 161 34 170 m 205 110 l 205 300 b 205 330 245 330 245 300 l 245 300 l 245 -300 b 245 -330 205 -330 205 -300 l 205 -300 l 205 110 l 345 90 m 345 90 l 345 330 b 345 360 385 360 385 330 l 385 330 l 385 -270 b 385 -300 345 -300 345 -270 l 345 -270 l 345 90 ', + }, + vexAccidentalMicrotonal2: { + x_min: -1.359375, + x_max: 386.5625, + ha: 394, + o: 'm 249 535 b 257 537 251 537 253 537 b 276 524 266 537 273 533 l 277 521 l 279 419 l 279 316 l 304 323 b 337 328 319 326 330 328 b 353 316 347 328 349 324 b 355 266 355 315 355 290 b 353 215 355 241 355 217 b 319 198 349 206 347 205 b 279 187 284 190 279 188 b 279 156 279 187 279 174 b 279 136 279 151 279 144 l 279 84 l 289 87 l 330 98 b 367 105 352 102 362 105 b 378 101 372 105 375 104 b 386 61 385 95 386 94 b 386 40 386 55 386 48 l 386 -5 l 385 -8 b 374 -19 383 -12 378 -18 b 291 -40 372 -19 347 -26 b 279 -43 284 -41 279 -43 b 279 -83 279 -43 279 -59 b 279 -95 279 -87 279 -91 l 279 -145 l 304 -140 b 337 -133 321 -136 330 -133 b 349 -140 343 -133 347 -136 b 355 -181 355 -145 355 -142 l 355 -197 l 355 -210 b 349 -252 355 -249 355 -247 b 300 -269 345 -258 347 -258 b 280 -274 291 -272 281 -273 l 279 -274 l 277 -378 l 277 -483 l 276 -487 b 257 -499 273 -495 265 -499 b 238 -487 249 -499 242 -495 l 236 -483 l 236 -384 l 236 -285 l 235 -285 l 212 -291 l 170 -301 b 148 -308 159 -305 148 -306 b 147 -415 147 -308 147 -313 l 147 -523 l 145 -526 b 126 -538 141 -534 133 -538 b 106 -526 118 -538 110 -534 l 104 -523 l 104 -420 b 103 -317 104 -326 104 -317 b 103 -317 103 -317 103 -317 b 50 -330 92 -322 54 -330 b 31 -317 42 -330 35 -326 b 29 -267 29 -315 29 -315 l 29 -219 l 32 -216 b 92 -192 36 -206 36 -206 l 104 -190 l 104 -138 b 103 -87 104 -91 104 -87 b 103 -87 103 -87 103 -87 b 88 -91 103 -87 96 -88 l 49 -101 b 17 -106 32 -105 23 -106 b 6 -102 13 -106 10 -105 b -1 -62 0 -97 -1 -95 b 0 -41 -1 -56 0 -49 l 0 4 l 1 6 b 10 16 2 11 6 15 b 91 37 12 18 38 24 l 104 41 l 104 93 b 103 144 104 140 104 144 b 103 144 103 144 103 144 b 50 131 92 141 54 131 b 31 144 42 131 35 137 b 29 195 29 147 29 148 l 29 242 l 32 245 b 92 269 36 255 36 255 l 104 273 l 104 377 l 104 481 l 106 485 b 126 498 110 492 118 498 b 134 495 129 498 132 496 b 145 485 138 494 142 489 l 147 481 l 147 383 l 147 283 l 152 284 b 190 294 155 285 171 290 l 230 303 l 236 305 l 236 413 l 236 521 l 238 524 b 249 535 240 528 243 533 m 236 126 b 235 177 236 154 236 177 l 235 177 b 213 172 235 177 225 174 l 170 161 b 147 155 157 158 147 155 b 147 124 147 155 147 142 b 147 102 147 117 147 111 l 147 52 l 153 54 l 228 72 l 236 74 l 236 126 m 236 -105 b 235 -54 236 -65 236 -54 l 235 -54 b 231 -55 235 -54 234 -54 b 172 -69 227 -55 204 -62 l 149 -76 l 147 -76 l 147 -127 l 147 -179 l 152 -177 b 190 -167 155 -177 171 -173 l 230 -158 l 236 -156 l 236 -105 ', + }, + vexAccidentalMicrotonal3: { + x_min: 0, + x_max: 430.75, + ha: 360, + o: 'm -146 537 b -138 538 -143 538 -141 538 b -118 525 -129 538 -121 533 b -117 390 -117 522 -117 521 b -115 259 -117 268 -117 259 b -115 259 -115 259 -115 259 b -59 272 -104 263 -62 272 b -39 259 -50 272 -42 267 b -37 209 -38 257 -37 233 b -39 159 -37 185 -38 162 b -85 138 -43 149 -44 149 l -117 131 l -117 21 b -115 -88 -117 -80 -117 -88 b -115 -88 -115 -88 -115 -88 b -59 -75 -104 -84 -62 -75 b -44 -81 -52 -75 -48 -77 b -38 -124 -38 -87 -38 -85 b -38 -138 -38 -124 -38 -138 b -38 -152 -38 -138 -38 -152 b -44 -195 -38 -191 -38 -190 b -85 -209 -48 -200 -48 -200 l -117 -217 l -117 -349 b -118 -486 -117 -481 -117 -482 b -138 -499 -121 -494 -129 -499 b -153 -493 -143 -499 -149 -497 b -159 -415 -158 -487 -159 -496 b -159 -355 -159 -398 -159 -379 b -159 -227 -159 -284 -159 -227 b -205 -238 -159 -227 -180 -232 b -250 -249 -230 -244 -250 -249 b -251 -386 -251 -249 -251 -311 b -252 -525 -251 -521 -251 -522 b -272 -538 -255 -534 -264 -538 b -287 -532 -277 -538 -283 -536 b -293 -452 -292 -527 -293 -536 b -293 -391 -293 -436 -293 -415 b -294 -260 -293 -269 -293 -260 b -294 -260 -294 -260 -294 -260 b -348 -272 -306 -264 -345 -272 b -368 -259 -357 -272 -365 -267 b -369 -209 -369 -257 -369 -233 b -368 -159 -369 -185 -369 -162 b -323 -139 -364 -149 -362 -148 l -293 -131 l -293 -22 b -294 87 -293 80 -293 87 b -294 87 -294 87 -294 87 b -348 75 -306 84 -345 75 b -368 88 -357 75 -365 80 b -369 138 -369 91 -369 114 b -368 188 -369 162 -369 186 b -323 209 -364 198 -362 199 l -293 216 l -293 349 b -292 486 -293 481 -293 482 b -272 499 -288 494 -280 499 b -257 493 -266 499 -261 497 b -251 414 -251 487 -251 496 b -251 354 -251 398 -251 378 b -251 226 -251 284 -251 226 b -205 238 -250 226 -230 231 b -159 249 -180 244 -159 249 b -159 385 -159 249 -159 310 b -157 525 -159 521 -159 522 b -146 537 -156 530 -151 535 z m -159 11 b -159 120 -159 98 -159 120 l -159 120 b -175 116 -160 120 -167 119 b -221 105 -184 114 -204 109 l -251 98 l -251 -12 b -251 -121 -251 -72 -251 -121 b -205 -110 -250 -121 -230 -116 b -159 -99 -180 -104 -159 -99 b -159 11 -159 -99 -159 -49 z m 89 517 b 97 519 92 518 94 519 b 117 505 106 519 114 513 b 119 376 119 502 119 501 l 119 249 l 145 258 b 176 267 169 266 172 267 b 177 267 176 267 177 267 b 196 255 186 267 192 263 l 197 252 l 197 205 b 197 181 197 195 197 187 b 193 149 197 153 197 153 b 152 131 190 144 187 143 l 119 120 l 119 10 b 119 -100 119 -62 119 -100 b 145 -91 120 -100 131 -96 b 173 -82 159 -86 171 -82 b 176 -81 174 -81 175 -81 b 196 -94 185 -81 193 -87 b 198 -151 197 -97 198 -125 b 197 -194 198 -172 197 -192 b 153 -218 193 -203 192 -204 l 119 -230 l 119 -367 l 118 -504 l 117 -507 b 97 -519 113 -514 105 -519 b 82 -512 92 -519 87 -517 b 76 -434 77 -507 76 -516 b 76 -374 76 -418 76 -398 b 76 -245 76 -303 76 -245 b 52 -254 76 -245 65 -249 b 19 -263 34 -260 25 -263 b 6 -257 13 -263 10 -261 b 0 -214 0 -251 0 -253 b 0 -200 0 -210 0 -205 b 0 -188 0 -196 0 -192 b 6 -143 0 -147 0 -149 b 46 -126 10 -139 10 -139 l 76 -115 l 76 -5 b 76 106 76 56 76 106 b 51 98 76 106 64 102 b 18 89 34 92 25 89 b 6 95 13 89 10 91 b 0 139 0 101 0 99 b 0 153 0 143 0 148 b 0 179 0 163 0 172 b 44 225 0 215 3 211 l 76 236 l 76 369 b 78 505 76 501 76 502 b 89 517 80 510 85 515 z ', + }, + vexAccidentalMicrotonal4: { + x_min: 0, + x_max: 430.75, + ha: 360, + o: 'm 283 633 b 291 634 286 634 289 634 b 311 621 300 634 308 629 b 313 505 313 618 313 617 b 313 393 313 443 313 393 b 378 425 313 393 343 407 l 443 458 l 448 458 b 449 458 449 458 449 458 b 471 437 462 458 471 448 b 469 429 471 434 470 432 b 387 382 466 421 469 423 l 313 344 l 313 247 l 313 150 l 315 152 b 433 201 353 184 394 201 b 479 193 448 201 464 198 b 549 86 524 177 549 135 b 526 1 549 59 541 29 b 395 -143 504 -39 475 -71 b 316 -214 351 -182 341 -191 b 292 -229 302 -228 300 -229 b 272 -216 283 -229 275 -224 b 271 55 271 -212 271 -212 b 270 323 271 203 270 323 b 205 291 270 323 241 308 l 140 258 l 135 258 b 134 258 135 258 134 258 b 112 279 121 258 112 267 b 114 287 112 281 113 284 b 196 334 117 295 114 293 l 271 371 l 271 495 b 272 621 271 617 271 618 b 283 633 274 626 279 631 z m 404 133 b 391 134 400 134 395 134 b 384 134 388 134 386 134 b 318 88 358 130 335 114 l 313 81 l 313 -37 l 313 -156 l 316 -152 b 439 83 391 -71 439 22 l 439 84 b 404 133 439 115 430 128 z m -8 633 l -8 633 b 0 634 -6 634 -3 634 b 20 621 8 634 17 629 b 21 384 21 618 21 617 l 21 150 l 24 152 b 141 201 62 184 102 201 b 187 193 157 201 172 198 b 257 86 232 177 257 135 b 234 1 257 59 250 29 b 103 -143 212 -39 183 -71 b 24 -214 60 -182 49 -191 b 0 -229 10 -228 8 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 203 l -21 618 l -20 621 b -8 633 -18 626 -13 631 z m 113 133 l 113 133 b 99 134 109 134 103 134 b 93 134 97 134 94 134 b 26 88 66 130 43 114 l 21 81 l 21 -37 l 21 -156 l 25 -152 b 148 83 99 -71 148 22 l 148 84 b 113 133 148 115 138 128 z ', + }, + vexNoteHeadRectBlack: { + x_min: 0, + x_max: 430.75, + ha: 360, + o: 'm 0 150 l 0 -150 l 430 -150 l 430 150 l 0 150 ', + }, + vexNoteHeadRectWhite: { + x_min: 0, + x_max: 430.75, + ha: 360, + o: 'm 0 150 l 0 -150 l 430 -150 l 430 150 l 0 150 l 50 100 l 380 100 l 380 -100 l 50 -100 l 50 100', + }, + }, +}; + + +/***/ }), + +/***/ "./src/fonts/custom_metrics.ts": +/*!*************************************!*\ + !*** ./src/fonts/custom_metrics.ts ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "CustomMetrics": () => (/* binding */ CustomMetrics) +/* harmony export */ }); +const CustomMetrics = { + name: 'VexFlowCustom', + smufl: false, + glyphs: {}, +}; + + +/***/ }), + +/***/ "./src/fonts/gonville_glyphs.ts": +/*!**************************************!*\ + !*** ./src/fonts/gonville_glyphs.ts ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "GonvilleFont": () => (/* binding */ GonvilleFont) +/* harmony export */ }); +const GonvilleFont = { + glyphs: { + bracketTop: { + x_min: 0, + x_max: 559.421875, + ha: 571, + o: 'm 544 204 b 548 204 545 204 547 204 b 559 194 555 204 559 199 b 559 190 559 192 559 191 b 530 156 559 188 556 184 b 462 86 510 134 481 104 b 453 76 458 81 454 77 l 446 70 l 441 65 b 434 59 439 63 436 61 l 427 54 b 409 37 426 51 416 44 b 392 23 398 29 394 26 b 387 19 389 22 387 20 b 379 13 386 19 383 16 l 371 8 l 367 5 l 359 -1 l 337 -16 b 285 -48 319 -29 298 -41 l 279 -52 b 186 -95 255 -66 210 -87 l 175 -99 b 23 -129 127 -117 68 -129 b 17 -129 20 -129 19 -129 b 1 -123 2 -129 2 -129 b 0 -49 0 -122 0 -83 b 0 4 0 -22 0 1 b 27 11 2 9 4 9 b 185 31 78 12 145 20 b 198 34 186 31 193 33 b 314 73 234 44 277 58 b 349 88 328 79 340 84 b 353 90 352 90 353 90 b 363 94 353 90 357 93 b 371 98 367 97 371 98 b 428 129 372 98 413 120 b 461 148 441 136 454 144 b 468 151 464 149 466 151 b 472 154 469 152 470 154 b 481 161 473 155 477 158 b 525 190 490 166 518 186 l 534 197 b 540 201 536 198 539 199 b 544 204 541 202 544 204 ', + }, + bracketBottom: { + x_min: 0, + x_max: 559.421875, + ha: 571, + o: 'm 5 127 b 14 127 6 127 9 127 b 51 126 25 127 43 127 b 175 98 93 122 138 112 l 186 94 b 279 51 210 86 255 65 b 285 47 280 51 283 48 b 319 27 291 44 311 31 l 326 22 b 359 0 332 19 352 4 l 367 -6 b 371 -9 368 -6 370 -8 l 379 -15 b 387 -22 383 -18 386 -20 l 398 -30 l 411 -40 l 417 -47 l 427 -55 l 434 -61 b 441 -66 436 -62 439 -65 l 446 -72 l 453 -77 l 462 -87 b 558 -188 490 -113 549 -176 b 559 -195 559 -191 559 -194 b 548 -205 559 -201 555 -205 b 541 -204 547 -205 544 -205 b 534 -198 539 -201 536 -199 l 525 -191 b 481 -162 518 -187 490 -167 b 472 -155 477 -159 472 -156 b 468 -152 470 -155 469 -154 b 461 -149 466 -152 464 -151 b 428 -130 454 -145 441 -137 b 371 -99 413 -122 372 -99 b 363 -95 371 -99 367 -98 b 353 -91 357 -94 353 -91 b 348 -90 353 -91 352 -91 b 332 -81 343 -87 341 -86 b 27 -12 230 -37 127 -13 b 0 -5 4 -11 2 -11 b 0 58 0 -2 0 27 b 0 122 0 88 0 120 b 5 127 1 124 4 126 ', + }, + barlineTick: { + x_min: -80.3125, + x_max: 78.9375, + ha: 81, + o: 'm 63 191 b 69 192 65 192 66 192 b 77 188 72 192 76 191 b 78 183 78 187 78 186 b 74 158 78 179 77 172 l 66 115 b 9 -161 49 30 10 -158 b -10 -187 6 -172 -1 -181 b -34 -194 -17 -191 -25 -194 b -80 -147 -58 -194 -80 -174 b -80 -141 -80 -144 -80 -142 b 9 70 -80 -134 -73 -117 l 49 163 b 63 191 59 188 61 190 ', + }, + breathMarkTick: { + x_min: -80.3125, + x_max: 78.9375, + ha: 81, + o: 'm 63 191 b 69 192 65 192 66 192 b 77 188 72 192 76 191 b 78 183 78 187 78 186 b 74 158 78 179 77 172 l 66 115 b 9 -161 49 30 10 -158 b -10 -187 6 -172 -1 -181 b -34 -194 -17 -191 -25 -194 b -80 -147 -58 -194 -80 -174 b -80 -141 -80 -144 -80 -142 b 9 70 -80 -134 -73 -117 l 49 163 b 63 191 59 188 61 190 ', + }, + segno: { + x_min: -330.75, + x_max: 329.390625, + ha: 336, + o: 'm -133 483 b -117 484 -127 484 -122 484 b 31 373 -51 484 9 440 b 35 348 34 365 35 356 b -25 285 35 313 10 285 b -87 331 -55 285 -76 302 b -167 402 -100 376 -133 402 b -191 398 -175 402 -183 401 b -227 341 -215 388 -227 369 b -225 320 -227 334 -227 327 b -13 74 -209 230 -125 133 b 6 65 -4 70 5 66 l 9 63 l 10 65 b 117 231 12 68 40 112 l 189 341 l 242 424 b 268 460 262 456 264 458 b 283 464 273 463 277 464 b 308 438 296 464 308 453 l 308 437 b 287 396 308 430 308 428 l 95 98 l 59 43 l 58 41 l 65 37 b 253 -156 151 -8 217 -77 b 281 -285 272 -199 281 -244 b 148 -481 281 -381 231 -463 b 115 -485 137 -484 126 -485 b -32 -376 51 -485 -9 -442 b -36 -349 -35 -366 -36 -358 b 25 -287 -36 -315 -12 -287 b 85 -333 54 -287 74 -302 b 166 -403 99 -377 133 -403 b 190 -399 174 -403 182 -402 b 225 -342 215 -390 225 -370 b 224 -322 225 -335 225 -328 b 12 -76 208 -231 125 -134 b -8 -66 2 -72 -6 -68 l -10 -65 l -12 -66 b -118 -231 -13 -68 -42 -113 l -190 -342 l -243 -426 b -269 -462 -264 -458 -265 -458 b -284 -466 -274 -464 -279 -466 b -310 -440 -298 -466 -310 -455 l -310 -438 b -288 -398 -310 -430 -308 -430 l -96 -99 l -59 -44 l -59 -43 l -66 -38 b -281 284 -198 33 -281 158 l -281 284 b -133 483 -281 392 -220 474 m 254 177 b 266 179 258 177 262 179 b 319 149 287 179 307 167 b 329 115 326 140 329 127 b 319 79 329 102 326 90 b 268 51 307 61 287 51 b 221 72 250 51 234 58 b 205 115 210 84 205 99 b 254 177 205 142 223 170 m -281 -54 b -269 -52 -277 -52 -273 -52 b -223 -73 -253 -52 -235 -59 b -206 -116 -212 -84 -206 -101 b -216 -151 -206 -129 -209 -141 b -269 -179 -228 -170 -249 -179 b -314 -159 -285 -179 -302 -173 b -330 -116 -325 -147 -330 -131 b -281 -54 -330 -88 -313 -61 ', + }, + coda: { + x_min: -311.6875, + x_max: 310.328125, + ha: 317, + o: 'm -9 388 b -2 390 -8 390 -5 390 b 5 388 1 390 4 390 b 19 378 10 387 16 383 b 23 333 23 371 23 371 b 24 298 23 299 24 298 b 81 276 34 298 65 285 b 213 91 145 240 190 177 b 224 24 217 76 224 36 b 257 24 224 24 235 24 b 299 19 292 24 292 24 b 310 -1 306 15 310 6 b 299 -23 310 -11 306 -19 b 257 -27 292 -27 292 -27 b 224 -29 235 -27 224 -29 b 213 -95 224 -40 217 -80 b 81 -280 190 -181 145 -244 b 24 -301 65 -290 34 -301 b 23 -335 24 -301 23 -303 l 23 -340 b 17 -381 23 -374 23 -374 b -1 -391 13 -388 5 -391 b -21 -381 -9 -391 -17 -388 b -27 -340 -27 -374 -27 -374 l -27 -335 b -28 -301 -27 -303 -27 -301 b -85 -280 -38 -301 -69 -290 b -217 -95 -149 -244 -194 -181 b -228 -29 -221 -80 -228 -40 b -259 -27 -228 -29 -238 -27 b -300 -23 -294 -27 -294 -27 b -311 -2 -307 -19 -311 -11 b -294 23 -311 8 -304 19 b -259 24 -291 23 -284 24 b -228 24 -239 24 -228 24 b -217 91 -228 36 -221 76 b -85 276 -194 177 -149 240 b -28 298 -69 285 -38 298 b -27 333 -27 298 -27 299 b -27 371 -27 362 -27 369 b -9 388 -24 378 -17 385 m -27 136 b -28 247 -27 197 -28 247 b -61 216 -31 247 -53 226 b -123 33 -95 172 -121 98 l -125 24 l -76 24 l -27 24 l -27 136 m 29 242 b 24 247 27 245 24 247 b 23 136 24 247 23 197 l 23 24 l 72 24 l 121 24 l 119 33 b 29 242 115 116 77 206 m -27 -140 l -27 -27 l -76 -27 l -125 -27 l -123 -36 b -61 -220 -121 -102 -95 -176 b -28 -251 -53 -230 -31 -251 b -27 -140 -28 -251 -27 -201 m 119 -36 l 121 -27 l 72 -27 l 23 -27 l 23 -140 b 24 -251 23 -201 24 -251 b 57 -220 27 -251 49 -230 b 119 -36 91 -176 117 -102 ', + }, + gClef: { + x_min: -1.359375, + x_max: 847.96875, + ha: 865, + o: 'm 488 1499 b 495 1500 490 1500 492 1500 b 541 1465 507 1500 521 1490 b 679 1078 622 1372 679 1210 b 677 1050 679 1068 677 1060 b 477 642 668 893 604 764 l 443 609 l 431 596 l 431 592 l 438 562 l 449 508 l 460 458 b 481 355 475 390 481 355 b 481 355 481 355 481 355 b 490 356 481 355 485 355 b 528 358 495 356 511 358 b 558 356 540 358 552 356 b 839 95 699 338 808 237 b 847 22 845 72 847 47 b 631 -303 847 -113 766 -242 b 620 -309 623 -308 620 -309 l 620 -310 b 631 -359 620 -310 626 -333 l 646 -435 l 660 -496 b 672 -588 668 -535 672 -563 b 664 -653 672 -610 669 -630 b 383 -875 630 -792 509 -875 b 201 -810 321 -875 257 -855 b 129 -680 151 -768 129 -730 b 274 -530 129 -592 200 -530 b 351 -553 300 -530 326 -538 b 412 -669 393 -582 412 -626 b 287 -805 412 -735 366 -800 l 279 -805 l 285 -809 b 383 -830 318 -823 351 -830 b 586 -718 464 -830 540 -789 b 626 -584 612 -678 626 -631 b 619 -528 626 -566 623 -548 b 612 -495 619 -526 616 -510 b 577 -324 590 -387 577 -324 b 577 -324 577 -324 577 -324 b 568 -326 575 -324 571 -324 b 528 -334 558 -328 537 -333 b 465 -338 506 -337 485 -338 b 24 -11 269 -338 87 -206 b -1 145 8 41 -1 93 b 96 442 -1 249 32 351 b 322 714 166 541 236 626 l 352 745 l 345 782 l 332 843 l 315 921 b 303 984 310 950 304 978 b 295 1082 298 1017 295 1049 b 413 1426 295 1208 336 1329 b 488 1499 436 1456 477 1496 m 549 1301 b 541 1301 547 1301 544 1301 b 411 1207 500 1301 447 1263 b 355 1004 374 1152 355 1079 b 359 942 355 984 356 963 b 371 881 362 927 363 917 l 385 818 b 392 782 389 799 392 784 l 392 782 b 434 828 393 782 424 816 b 607 1165 534 941 594 1060 b 608 1193 608 1175 608 1183 b 597 1270 608 1224 604 1254 b 549 1301 589 1286 571 1299 m 398 528 b 393 555 396 542 393 553 b 392 555 393 555 393 555 b 317 470 390 555 347 505 b 190 298 266 408 212 334 b 127 70 148 227 127 148 b 155 -77 127 19 137 -30 b 468 -303 209 -216 333 -303 b 519 -299 484 -303 502 -302 b 568 -284 541 -295 568 -287 l 568 -284 b 563 -263 568 -284 566 -274 l 534 -120 l 511 -13 l 496 61 l 480 133 b 469 187 472 176 469 187 b 468 188 469 187 469 188 b 416 162 462 188 430 172 b 337 13 364 126 337 69 b 413 -124 337 -40 363 -93 b 428 -144 424 -131 428 -137 b 428 -149 428 -145 428 -148 b 409 -166 426 -161 419 -166 b 394 -162 405 -166 400 -165 b 240 77 302 -122 240 -27 l 240 77 b 430 342 240 197 315 301 l 436 344 l 426 394 l 398 528 m 548 194 b 526 195 540 195 532 195 b 519 195 524 195 521 195 l 514 195 l 518 177 l 539 79 l 552 15 l 566 -48 l 594 -187 l 605 -240 b 612 -266 609 -254 611 -266 b 612 -266 612 -266 612 -266 b 641 -248 613 -266 630 -256 b 744 -98 692 -212 730 -156 b 751 -40 749 -79 751 -59 b 548 194 751 76 665 181 ', + }, + cClef: { + x_min: 0, + x_max: 873.828125, + ha: 892, + o: 'm 0 0 l 0 703 l 81 703 l 164 703 l 164 0 l 164 -705 l 81 -705 l 0 -705 l 0 0 m 225 0 l 225 703 l 246 703 l 268 703 l 268 366 l 268 30 l 274 36 b 314 79 284 44 302 63 b 413 302 357 137 392 213 b 432 327 419 324 421 327 b 449 306 443 327 447 322 b 611 115 457 195 529 115 b 651 122 624 115 638 117 b 728 316 705 140 724 188 b 729 388 728 342 729 366 b 671 635 729 533 711 602 b 581 662 649 652 616 662 b 477 637 545 662 510 653 l 475 635 l 477 634 b 503 627 488 632 495 631 b 545 556 532 612 545 584 b 491 480 545 524 526 491 b 465 474 481 476 473 474 b 379 563 417 474 379 516 b 389 602 379 576 382 588 b 541 691 409 641 479 681 b 582 694 555 692 568 694 b 865 462 714 694 834 598 b 873 392 871 440 873 416 b 865 317 873 367 871 341 b 639 84 839 194 748 101 b 612 83 630 83 620 83 b 511 116 577 83 543 94 b 504 120 509 119 506 120 b 504 120 504 120 504 120 b 469 59 504 120 488 93 l 432 -1 l 469 -61 b 504 -122 488 -94 504 -122 b 504 -122 504 -122 504 -122 b 511 -117 506 -122 509 -120 b 612 -84 543 -95 577 -84 b 665 -91 630 -84 647 -87 b 869 -338 771 -122 850 -216 b 873 -392 872 -356 873 -374 b 798 -595 873 -469 847 -539 b 581 -695 741 -662 660 -695 b 406 -626 517 -695 454 -671 b 381 -563 389 -607 381 -585 b 465 -477 381 -519 413 -477 b 545 -559 514 -477 545 -519 b 503 -628 545 -587 532 -613 b 477 -635 495 -632 488 -634 l 475 -637 l 477 -638 b 581 -663 510 -655 545 -663 b 671 -637 616 -663 649 -653 b 729 -391 711 -603 729 -534 b 728 -317 729 -367 728 -344 b 623 -117 722 -173 698 -124 b 611 -116 619 -116 615 -116 b 449 -308 528 -116 457 -198 b 432 -328 447 -323 443 -328 b 413 -303 421 -328 419 -326 b 314 -80 392 -215 357 -138 b 274 -37 302 -65 284 -45 l 268 -31 l 268 -367 l 268 -705 l 246 -705 l 225 -705 l 225 0 ', + }, + fClef: { + x_min: -1.359375, + x_max: 899.703125, + ha: 918, + o: 'm 307 349 b 332 351 315 351 323 351 b 443 340 367 351 408 347 b 741 47 607 306 720 195 b 744 0 743 31 744 16 b 660 -303 744 -90 713 -206 b 28 -755 534 -531 304 -695 b 14 -756 23 -755 19 -756 b -1 -741 4 -756 -1 -750 b 21 -720 -1 -731 1 -728 b 567 -56 337 -601 548 -344 b 568 -11 568 -41 568 -24 b 442 285 568 129 525 233 b 325 319 406 308 367 319 b 93 177 232 319 137 266 b 84 154 91 170 84 155 b 84 154 84 154 84 154 b 88 156 84 154 85 155 b 159 177 110 170 134 177 b 257 134 194 177 231 162 b 294 41 281 108 294 73 b 171 -97 294 -24 246 -90 b 156 -98 166 -97 161 -98 b 6 74 73 -98 6 -22 b 6 80 6 76 6 79 b 307 349 10 223 141 340 m 839 215 b 845 216 841 216 842 216 b 862 213 852 216 860 215 b 899 163 887 206 899 184 b 872 117 899 145 890 127 b 847 111 865 112 856 111 b 808 130 833 111 818 117 b 796 162 800 140 796 151 b 839 215 796 187 812 212 m 839 -112 b 845 -112 841 -112 842 -112 b 862 -115 852 -112 860 -113 b 899 -165 887 -122 899 -144 b 872 -210 899 -183 890 -201 b 847 -217 865 -215 856 -217 b 808 -198 833 -217 818 -210 b 796 -165 800 -188 796 -177 b 839 -112 796 -140 812 -116 ', + }, + unpitchedPercussionClef1: { + x_min: 0, + x_max: 464.140625, + ha: 474, + o: 'm 0 0 l 0 347 l 76 347 l 153 347 l 153 0 l 153 -348 l 76 -348 l 0 -348 l 0 0 m 308 -1 l 308 347 l 386 347 l 464 347 l 464 -1 l 464 -348 l 386 -348 l 308 -348 l 308 -1 ', + }, + '6stringTabClef': { + x_min: -1.359375, + x_max: 680.5625, + ha: 694, + o: 'm 597 1042 b 604 1042 600 1042 602 1042 b 642 1002 627 1042 642 1022 b 619 966 642 988 635 974 b 439 927 574 942 503 927 l 426 927 l 426 921 b 430 838 428 893 430 866 b 345 480 430 696 398 560 b 179 391 307 423 249 391 b 156 392 171 391 164 392 b 138 394 149 394 142 394 b 103 434 115 396 103 416 b 129 471 103 451 111 466 b 141 474 133 473 137 474 b 172 459 153 474 164 469 b 181 455 175 456 176 455 b 187 456 182 455 185 455 b 253 520 212 460 234 483 b 315 836 294 605 315 714 b 311 928 315 867 314 898 b 302 945 310 943 311 942 b 245 953 283 950 262 953 b 130 891 193 953 149 931 b 84 860 119 870 102 860 b 36 905 61 860 39 877 b 36 910 36 907 36 909 b 80 970 36 931 50 949 b 249 1017 125 1000 187 1017 b 322 1009 273 1017 299 1014 l 341 1003 b 436 991 372 995 406 991 b 577 1031 495 991 545 1004 b 597 1042 583 1038 590 1041 m 416 360 b 424 360 419 360 421 360 b 481 309 454 360 479 338 b 503 145 484 280 495 199 b 585 -185 525 16 555 -106 b 630 -245 596 -213 613 -237 l 634 -247 l 638 -245 b 647 -244 641 -245 645 -244 b 680 -278 666 -244 680 -262 b 664 -308 680 -290 675 -301 b 638 -312 658 -310 650 -312 b 613 -309 631 -312 623 -310 b 477 -201 555 -303 502 -260 b 417 -2 460 -159 434 -72 b 416 5 417 1 416 5 b 416 5 416 5 416 5 b 411 -5 415 5 413 0 b 359 -97 397 -33 377 -70 b 353 -106 355 -102 353 -105 b 359 -112 353 -108 355 -109 b 409 -130 375 -123 390 -129 b 426 -134 420 -130 421 -131 b 431 -147 428 -137 431 -141 b 420 -162 431 -152 427 -159 b 382 -169 409 -166 396 -169 b 323 -155 363 -169 341 -165 l 317 -152 l 314 -155 b 62 -303 240 -240 148 -295 b 36 -305 55 -305 44 -305 b 23 -303 29 -305 24 -305 b -1 -273 6 -299 -1 -287 b 31 -240 -1 -256 10 -240 b 36 -240 32 -240 34 -240 b 42 -241 38 -241 39 -241 b 134 -204 63 -241 99 -226 b 367 288 265 -115 357 81 b 375 330 368 313 370 320 b 416 360 383 347 400 358 m 360 -359 b 379 -359 363 -359 371 -359 b 424 -360 396 -359 416 -359 b 646 -502 536 -373 624 -430 b 649 -527 649 -510 649 -519 b 530 -673 649 -578 604 -635 l 521 -677 l 529 -681 b 653 -811 592 -714 637 -762 b 660 -853 658 -827 660 -839 b 645 -911 660 -873 656 -892 b 426 -1021 608 -981 519 -1021 b 283 -989 377 -1021 328 -1011 b 235 -949 249 -972 239 -964 b 234 -936 234 -946 234 -941 b 234 -928 234 -934 234 -931 l 235 -925 l 234 -927 l 225 -934 b 87 -982 186 -966 138 -982 b 80 -982 85 -982 83 -982 b 55 -981 70 -981 58 -981 b 17 -943 32 -981 17 -964 b 54 -904 17 -921 35 -904 b 78 -914 62 -904 72 -909 l 83 -918 l 88 -918 b 190 -831 122 -918 166 -881 b 269 -506 242 -727 269 -612 b 268 -462 269 -492 269 -477 b 266 -449 266 -458 266 -452 b 265 -444 266 -445 266 -444 b 257 -446 264 -444 261 -445 b 132 -545 196 -470 152 -505 b 88 -573 122 -563 104 -573 b 39 -523 63 -573 39 -553 b 63 -476 39 -505 44 -494 b 360 -359 136 -408 235 -369 m 419 -424 b 393 -423 411 -423 406 -423 l 375 -423 l 377 -426 b 379 -439 377 -427 378 -434 b 383 -510 382 -463 383 -487 b 314 -811 383 -609 360 -710 b 266 -893 296 -850 285 -870 b 264 -898 265 -896 264 -898 l 264 -898 b 264 -898 264 -898 264 -898 b 268 -898 264 -898 266 -898 b 273 -898 270 -898 272 -898 b 300 -909 283 -898 291 -900 b 426 -957 340 -941 385 -957 b 476 -949 443 -957 460 -954 b 547 -853 522 -931 547 -893 b 485 -745 547 -816 526 -775 b 397 -707 460 -727 432 -714 b 366 -675 375 -703 366 -692 b 396 -642 366 -657 377 -645 b 530 -557 455 -637 511 -601 b 536 -527 534 -548 536 -537 b 419 -424 536 -480 490 -437 ', + }, + timeSig0: { + x_min: 0, + x_max: 514.5, + ha: 525, + o: 'm 236 648 b 246 648 238 648 242 648 b 288 646 261 648 283 648 b 472 513 364 634 428 587 b 514 347 502 464 514 413 b 462 163 514 272 499 217 b 257 44 409 83 333 44 b 50 163 181 44 103 83 b 0 347 14 217 0 272 b 40 513 0 413 12 464 b 236 648 87 591 155 638 m 277 614 b 253 616 273 616 261 616 b 242 616 247 616 243 616 b 170 499 193 609 181 589 b 159 348 163 446 159 398 b 166 222 159 308 161 266 b 201 91 174 138 183 106 b 257 76 215 81 235 76 b 311 91 277 76 299 81 b 347 222 330 106 338 138 b 353 348 352 266 353 308 b 344 499 353 398 351 446 b 277 614 333 587 322 606 m 257 -1 l 258 -1 l 255 -1 l 257 -1 m 257 673 l 258 673 l 255 673 l 257 673 ', + }, + timeSig1: { + x_min: -1.359375, + x_max: 344.359375, + ha: 351, + o: 'm 126 637 l 129 638 l 198 638 l 266 638 l 269 635 b 274 631 272 634 273 632 l 277 627 l 277 395 b 279 156 277 230 277 161 b 329 88 281 123 295 106 b 344 69 341 81 344 79 b 337 55 344 62 343 59 l 333 54 l 197 54 l 61 54 l 58 55 b 50 69 53 59 50 62 b 65 88 50 79 53 81 b 80 97 72 91 74 93 b 117 156 103 113 112 129 b 117 345 117 161 117 222 l 117 528 l 100 503 l 38 406 b 14 383 24 384 23 383 b -1 398 5 383 -1 390 b 4 415 -1 403 1 409 b 16 437 5 416 10 426 l 72 539 l 100 596 b 121 632 119 631 119 631 b 126 637 122 634 125 635 m 171 -1 l 172 -1 l 170 -1 l 171 -1 m 171 673 l 172 673 l 170 673 l 171 673 ', + }, + timeSig2: { + x_min: -1.359375, + x_max: 458.6875, + ha: 468, + o: 'm 197 648 b 216 648 201 648 208 648 b 258 646 232 648 253 648 b 419 546 333 637 393 599 b 432 489 428 528 432 509 b 356 342 432 440 405 384 b 235 278 322 313 288 295 b 69 170 166 256 107 217 b 69 169 69 170 69 169 b 69 169 69 169 69 169 b 74 173 69 169 72 170 b 209 222 112 204 163 222 b 310 195 247 222 274 215 b 371 179 332 184 352 179 b 396 181 379 179 387 179 b 428 202 409 184 423 194 b 442 212 431 209 436 212 b 458 197 450 212 458 206 b 441 148 458 190 449 165 b 299 44 409 84 353 44 b 288 45 295 44 292 44 b 250 61 274 45 268 49 b 122 99 212 86 164 99 b 73 91 104 99 88 97 b 28 63 53 84 34 72 b 14 54 25 56 20 54 b 1 62 9 54 4 56 l -1 65 l -1 79 b 0 99 -1 91 0 95 b 2 113 1 102 2 108 b 164 309 20 197 81 272 b 285 470 232 341 277 398 b 287 487 287 476 287 481 b 171 595 287 551 239 595 b 155 595 166 595 160 595 b 142 592 145 594 142 594 b 145 589 142 592 142 591 b 179 527 168 576 179 551 b 132 455 179 496 163 467 b 104 451 122 452 112 451 b 27 530 62 451 27 487 b 29 555 27 538 27 546 b 197 648 44 601 115 639 m 228 -1 l 230 -1 l 227 -1 l 228 -1 m 228 673 l 230 673 l 227 673 l 228 673 ', + }, + timeSig3: { + x_min: -1.359375, + x_max: 409.6875, + ha: 418, + o: 'm 174 648 b 191 648 176 648 183 648 b 225 648 204 648 220 648 b 402 523 317 638 389 588 b 404 503 404 517 404 510 b 402 484 404 495 404 488 b 264 373 389 437 334 394 b 257 370 259 371 257 371 b 257 370 257 370 257 370 b 264 369 258 370 261 369 b 409 202 359 334 409 267 b 318 72 409 152 381 104 b 200 43 281 52 240 43 b 23 113 134 43 69 68 b 0 169 6 129 0 149 b 77 249 0 210 29 249 l 77 249 b 152 174 125 249 152 212 b 103 102 152 145 137 116 b 103 102 103 102 103 102 b 147 94 103 101 132 95 b 153 94 149 94 151 94 b 265 206 219 94 265 141 b 264 226 265 213 265 219 b 147 355 253 299 204 353 b 126 371 133 356 126 362 b 147 388 126 383 132 388 b 254 474 196 391 238 424 b 259 502 258 484 259 494 b 182 592 259 544 228 582 b 156 595 175 595 166 595 b 115 592 142 595 129 594 l 111 591 l 115 588 b 152 524 141 574 152 549 b 92 449 152 491 130 458 b 76 448 87 448 81 448 b -1 530 32 448 -1 488 b 20 581 -1 548 5 566 b 174 648 55 619 108 641 m 204 -1 l 205 -1 l 202 -1 l 204 -1 m 204 673 l 205 673 l 202 673 l 204 673 ', + }, + timeSig4: { + x_min: 0, + x_max: 468.21875, + ha: 478, + o: 'm 174 637 b 232 638 175 638 189 638 b 277 638 245 638 259 638 l 378 638 l 381 635 b 389 623 386 632 389 627 b 382 609 389 617 386 613 b 366 589 381 606 372 598 l 313 528 l 245 451 l 209 410 l 155 348 l 84 267 b 59 240 72 252 59 240 b 59 240 59 240 59 240 b 151 238 59 238 68 238 l 242 238 l 242 303 b 243 371 242 369 242 370 b 289 426 245 374 254 385 l 303 441 l 317 456 l 338 483 l 360 506 l 371 520 b 386 527 375 526 381 527 b 400 519 392 527 397 524 b 401 440 401 516 401 514 b 401 377 401 423 401 402 l 401 238 l 426 238 b 453 237 449 238 450 238 b 465 217 461 234 465 226 b 460 202 465 212 464 206 b 426 197 454 197 453 197 l 401 197 l 401 180 b 451 88 402 129 412 109 b 468 69 465 81 468 79 b 461 55 468 62 466 59 l 458 54 l 321 54 l 185 54 l 182 55 b 175 69 176 59 175 62 b 191 88 175 79 176 81 b 240 180 230 109 240 129 l 240 197 l 125 197 b 73 195 104 195 87 195 b 8 197 10 195 9 197 b 0 212 2 199 0 205 b 0 212 0 212 0 212 b 20 242 0 219 0 219 b 163 610 104 344 163 492 b 174 637 163 628 166 634 m 234 -1 l 235 -1 l 232 -1 l 234 -1 m 234 673 l 235 673 l 232 673 l 234 673 ', + }, + timeSig5: { + x_min: 0, + x_max: 409.6875, + ha: 418, + o: 'm 47 637 b 53 638 49 638 50 638 b 69 634 55 638 61 637 b 210 610 114 619 161 610 b 363 634 259 610 311 619 b 382 638 372 637 378 638 b 392 634 386 638 389 637 b 397 623 396 630 397 627 b 393 610 397 620 396 616 b 298 505 368 552 338 520 b 212 494 277 498 246 494 b 65 517 163 494 106 502 b 61 517 62 517 61 517 b 61 517 61 517 61 517 b 51 408 61 517 51 412 b 51 408 51 408 51 408 b 51 408 51 408 51 408 b 61 412 53 408 55 409 b 125 434 80 421 103 430 b 185 441 145 440 166 441 b 409 244 310 441 409 353 b 401 191 409 227 406 209 b 197 43 375 105 287 43 b 159 47 183 43 171 44 b 23 123 112 56 61 86 b 0 180 6 140 0 159 b 76 260 0 220 31 260 b 92 259 81 260 87 259 b 152 183 132 251 152 216 b 100 112 152 152 134 122 b 95 111 98 112 95 111 b 95 111 95 111 95 111 b 129 98 95 109 119 101 b 148 97 136 97 141 97 b 264 235 206 97 261 158 b 265 248 265 240 265 244 b 210 398 265 312 243 373 b 179 408 201 406 194 408 b 174 408 178 408 176 408 b 53 369 130 408 88 394 b 34 359 39 359 38 359 b 17 374 24 359 17 365 b 39 628 17 384 38 625 b 47 637 40 631 43 635 m 204 -1 l 205 -1 l 202 -1 l 204 -1 m 204 673 l 205 673 l 202 673 l 204 673 ', + }, + timeSig6: { + x_min: 0, + x_max: 475.03125, + ha: 485, + o: 'm 255 648 b 274 648 259 648 266 648 b 314 646 288 648 307 648 b 450 555 374 637 438 594 b 454 530 453 546 454 538 b 375 451 454 485 416 451 b 328 467 359 451 343 455 b 300 526 310 483 300 503 b 352 598 300 557 319 589 b 356 599 355 598 356 599 b 352 602 356 599 355 601 b 288 616 330 612 308 616 b 210 584 257 616 230 605 b 164 433 189 559 174 508 b 160 374 163 415 160 381 b 160 374 160 374 160 374 b 160 374 160 374 160 374 b 168 377 160 374 164 376 b 258 395 200 390 228 395 b 366 367 294 395 328 387 b 475 223 436 333 475 283 b 472 197 475 215 473 206 b 349 65 462 141 419 95 b 259 43 317 51 288 43 b 167 69 230 43 200 52 b 4 290 80 113 20 195 b 0 349 1 309 0 328 b 20 467 0 391 6 433 b 255 648 58 563 155 637 m 269 363 b 257 363 265 363 261 363 b 210 345 236 363 220 356 b 186 226 196 324 186 272 b 187 198 186 216 186 206 b 213 95 191 151 202 112 b 257 76 221 83 238 76 b 270 77 261 76 266 76 b 321 156 299 81 310 99 b 329 229 326 183 329 206 b 321 301 329 252 326 274 b 269 363 311 342 298 359 m 236 -1 l 238 -1 l 235 -1 l 236 -1 m 236 673 l 238 673 l 235 673 l 236 673 ', + }, + timeSig7: { + x_min: 0, + x_max: 442.359375, + ha: 451, + o: 'm 147 648 b 166 649 153 649 160 649 b 313 598 217 649 273 630 b 340 587 323 588 328 587 l 341 587 b 412 628 367 587 390 601 b 427 638 416 635 421 638 b 439 632 431 638 435 637 b 442 623 441 630 442 628 b 430 569 442 616 439 603 b 352 369 408 492 377 410 b 300 259 325 324 313 298 b 273 84 283 205 273 140 b 265 55 273 65 272 59 l 261 54 l 181 54 l 99 54 l 96 55 b 91 61 95 56 92 59 l 89 63 l 89 77 b 147 263 89 133 111 202 b 261 401 176 313 212 355 b 378 541 315 449 349 489 l 382 548 l 375 544 b 240 495 333 512 285 495 b 129 535 198 495 160 509 b 84 560 108 552 95 560 b 76 559 81 560 78 560 b 31 487 59 555 43 530 b 14 470 27 473 24 470 b 1 477 8 470 4 471 l 0 480 l 0 553 l 0 627 l 1 630 b 16 638 4 635 9 638 b 23 635 17 638 20 637 b 49 626 36 626 39 626 b 96 638 59 626 80 630 b 104 639 99 638 102 639 b 117 644 107 641 112 642 b 147 648 125 645 137 648 m 220 -1 l 221 -1 l 219 -1 l 220 -1 m 220 673 l 221 673 l 219 673 l 220 673 ', + }, + timeSig8: { + x_min: 0, + x_max: 488.640625, + ha: 499, + o: 'm 217 648 b 245 649 225 648 235 649 b 453 516 343 649 430 595 b 458 478 455 503 458 491 b 412 370 458 440 441 398 b 411 369 412 369 411 369 b 415 365 411 367 412 367 b 488 231 462 331 488 281 b 472 165 488 208 483 186 b 243 43 434 86 338 43 b 63 104 178 43 112 62 b 0 233 20 140 0 186 b 73 365 0 283 24 331 l 77 369 l 72 374 b 29 476 42 406 29 441 b 217 648 29 557 103 635 m 258 605 b 242 606 253 605 247 606 b 157 552 198 606 157 580 b 160 541 157 548 159 544 b 319 413 176 503 242 452 l 337 403 l 338 406 b 359 476 352 428 359 452 b 258 605 359 537 318 595 m 138 326 b 130 330 134 328 130 330 b 130 330 130 330 130 330 b 107 305 127 330 112 313 b 84 231 91 281 84 256 b 243 86 84 156 151 86 b 249 87 245 86 246 87 b 347 156 303 88 347 120 b 344 172 347 162 345 167 b 156 319 325 227 257 281 b 138 326 151 322 144 324 m 243 -1 l 245 -1 l 242 -1 l 243 -1 m 243 673 l 245 673 l 242 673 l 243 673 ', + }, + timeSig9: { + x_min: 0, + x_max: 475.03125, + ha: 485, + o: 'm 191 646 b 212 649 198 648 205 649 b 255 644 227 649 243 646 b 458 448 348 616 428 539 b 475 342 469 415 475 378 b 460 244 475 308 469 274 b 193 44 421 124 303 44 b 91 69 157 44 122 51 b 19 161 43 97 19 126 b 21 181 19 167 20 174 b 98 241 32 220 65 241 b 170 186 129 241 160 223 b 172 166 171 179 172 173 b 121 94 172 134 152 102 b 117 93 118 94 117 93 b 121 90 117 93 118 91 b 185 76 142 80 164 76 b 270 119 220 76 251 91 b 308 259 287 145 300 194 b 313 317 310 277 313 310 b 313 317 313 317 313 317 b 313 317 313 317 313 317 b 304 315 313 317 308 316 b 216 295 273 302 245 295 b 145 308 193 295 170 299 b 19 398 88 327 42 360 b 0 469 5 420 0 444 b 24 551 0 496 8 526 b 191 646 54 596 125 637 m 227 614 b 215 616 224 616 220 616 b 202 614 210 616 206 616 b 152 535 174 610 163 592 b 144 463 147 509 144 485 b 152 391 144 440 147 417 b 216 328 163 344 179 328 b 280 391 253 328 269 344 b 288 463 285 417 288 440 b 280 535 288 485 285 509 b 227 614 269 594 258 610 m 236 -1 l 238 -1 l 235 -1 l 236 -1 m 236 673 l 238 673 l 235 673 l 236 673 ', + }, + timeSigCommon: { + x_min: -1.359375, + x_max: 556.6875, + ha: 568, + o: 'm 294 322 b 318 323 299 322 308 323 b 360 320 334 323 352 322 b 526 217 430 310 490 273 b 543 166 537 202 543 184 b 447 70 543 117 503 70 b 445 70 447 70 446 70 b 359 159 394 72 359 113 b 368 201 359 173 362 187 b 442 245 382 229 412 245 b 455 244 446 245 451 245 b 460 244 458 244 460 244 b 460 244 460 244 460 244 b 454 248 460 244 458 245 b 325 291 417 276 372 291 b 285 287 313 291 299 290 b 144 -2 183 269 144 190 b 281 -290 144 -208 179 -280 b 304 -291 289 -291 298 -291 b 524 -105 412 -291 506 -212 b 541 -84 526 -88 530 -84 b 556 -101 551 -84 556 -90 b 549 -138 556 -111 553 -122 b 334 -322 521 -237 435 -310 b 302 -324 323 -323 313 -324 b 13 -101 172 -324 54 -234 b -1 -1 4 -68 -1 -34 b 294 322 -1 161 121 303 ', + }, + timeSigCutCommon: { + x_min: 0, + x_max: 556.6875, + ha: 568, + o: 'm 289 545 b 298 546 292 545 295 546 b 318 533 306 546 315 541 b 319 428 319 530 319 528 l 319 327 l 334 327 b 526 223 412 326 485 285 b 543 172 537 206 543 190 b 447 76 543 122 503 76 b 445 76 446 76 446 76 b 359 165 394 77 359 119 b 368 205 359 179 362 192 b 441 251 382 233 412 251 b 455 249 446 251 451 251 b 460 248 458 249 460 248 b 460 248 460 248 460 248 b 454 254 460 249 458 251 b 334 295 419 280 378 294 l 319 295 l 319 4 l 319 -287 l 321 -285 b 328 -285 322 -285 325 -285 b 524 -99 424 -277 507 -198 b 541 -79 526 -84 530 -79 b 556 -97 551 -79 556 -84 b 548 -133 556 -105 553 -117 b 334 -317 521 -233 434 -306 b 322 -319 329 -317 323 -317 l 319 -319 l 319 -424 b 319 -471 319 -444 319 -459 b 313 -541 319 -544 318 -535 b 298 -548 308 -545 303 -548 b 279 -534 289 -548 281 -542 b 277 -424 277 -531 277 -530 l 277 -317 l 273 -317 b 13 -95 153 -305 51 -217 b 0 2 4 -62 0 -29 b 182 295 0 126 66 238 b 274 324 210 309 249 320 l 277 324 l 277 427 b 279 533 277 528 277 530 b 289 545 281 538 285 542 m 277 2 b 277 291 277 161 277 291 b 268 288 277 291 273 290 b 144 1 179 265 144 184 b 276 -284 144 -199 175 -267 l 277 -285 l 277 2 ', + }, + timeSigPlus: { + x_min: 0, + x_max: 319.859375, + ha: 326, + o: 'm 149 508 b 159 509 152 509 155 509 b 186 494 170 509 181 503 b 190 440 190 487 190 488 l 190 430 l 190 377 l 242 377 l 251 377 b 303 373 298 377 296 377 b 319 345 314 367 319 356 b 304 319 319 335 314 324 b 250 315 296 315 299 315 l 242 315 l 190 315 l 190 262 l 190 252 b 186 198 190 204 190 205 b 159 183 179 188 170 183 b 132 198 148 183 138 188 b 127 252 127 205 127 204 l 127 262 l 127 315 l 76 315 l 68 315 b 14 319 20 315 21 315 b 0 347 4 324 0 335 b 14 373 0 356 4 367 b 68 377 21 377 20 377 l 76 377 l 127 377 l 127 430 l 127 440 b 132 494 127 488 127 487 b 149 508 136 501 142 505 ', + }, + timeSigPlusSmall: { + x_min: 0, + x_max: 319.859375, + ha: 326, + o: 'm 149 508 b 159 509 152 509 155 509 b 186 494 170 509 181 503 b 190 440 190 487 190 488 l 190 430 l 190 377 l 242 377 l 251 377 b 303 373 298 377 296 377 b 319 345 314 367 319 356 b 304 319 319 335 314 324 b 250 315 296 315 299 315 l 242 315 l 190 315 l 190 262 l 190 252 b 186 198 190 204 190 205 b 159 183 179 188 170 183 b 132 198 148 183 138 188 b 127 252 127 205 127 204 l 127 262 l 127 315 l 76 315 l 68 315 b 14 319 20 315 21 315 b 0 347 4 324 0 335 b 14 373 0 356 4 367 b 68 377 21 377 20 377 l 76 377 l 127 377 l 127 430 l 127 440 b 132 494 127 488 127 487 b 149 508 136 501 142 505 ', + }, + timeSigMinus: { + x_min: 0, + x_max: 318.5, + ha: 325, + o: 'm 20 376 b 167 377 23 377 96 377 b 296 376 231 377 294 377 b 318 347 311 371 318 359 b 296 316 318 333 311 320 b 159 315 294 315 227 315 b 21 316 91 315 24 315 b 0 345 6 320 0 333 b 20 376 0 359 6 371 ', + }, + timeSigParensRight: { + x_min: 25.859375, + x_max: 164.6875, + ha: 168, + o: 'm 34 369 b 40 370 35 370 38 370 b 59 353 49 370 50 367 b 164 40 122 254 155 158 b 164 0 164 33 164 16 b 164 -40 164 -16 164 -34 b 59 -353 155 -158 122 -254 b 40 -371 53 -366 47 -371 b 34 -370 38 -371 36 -370 b 25 -358 28 -367 25 -363 b 31 -337 25 -352 27 -347 b 92 0 72 -234 92 -117 b 31 335 92 116 72 233 b 25 356 27 345 25 352 b 34 369 25 363 28 366 ', + }, + timeSigParensRightSmall: { + x_min: 25.859375, + x_max: 164.6875, + ha: 168, + o: 'm 34 369 b 40 370 35 370 38 370 b 59 353 49 370 50 367 b 164 40 122 254 155 158 b 164 0 164 33 164 16 b 164 -40 164 -16 164 -34 b 59 -353 155 -158 122 -254 b 40 -371 53 -366 47 -371 b 34 -370 38 -371 36 -370 b 25 -358 28 -367 25 -363 b 31 -337 25 -352 27 -347 b 92 0 72 -234 92 -117 b 31 335 92 116 72 233 b 25 356 27 345 25 352 b 34 369 25 363 28 366 ', + }, + timeSigParensLeft: { + x_min: -166.0625, + x_max: -25.859375, + ha: 0, + o: 'm -49 369 b -42 370 -46 369 -44 370 b -27 360 -36 370 -29 366 b -25 355 -27 359 -25 358 b -32 335 -25 351 -28 347 b -92 52 -66 248 -87 159 b -93 -1 -93 43 -93 20 b -92 -54 -93 -23 -93 -45 b -32 -337 -85 -162 -66 -251 b -25 -355 -27 -349 -25 -352 b -42 -371 -25 -365 -32 -371 b -61 -353 -50 -371 -51 -369 b -163 -63 -119 -262 -153 -165 b -166 -1 -166 -37 -166 -31 b -163 62 -166 30 -166 36 b -61 352 -153 163 -119 260 b -49 369 -54 365 -51 366 ', + }, + timeSigParensLeftSmall: { + x_min: -166.0625, + x_max: -25.859375, + ha: 0, + o: 'm -49 369 b -42 370 -46 369 -44 370 b -27 360 -36 370 -29 366 b -25 355 -27 359 -25 358 b -32 335 -25 351 -28 347 b -92 52 -66 248 -87 159 b -93 -1 -93 43 -93 20 b -92 -54 -93 -23 -93 -45 b -32 -337 -85 -162 -66 -251 b -25 -355 -27 -349 -25 -352 b -42 -371 -25 -365 -32 -371 b -61 -353 -50 -371 -51 -369 b -163 -63 -119 -262 -153 -165 b -166 -1 -166 -37 -166 -31 b -163 62 -166 30 -166 36 b -61 352 -153 163 -119 260 b -49 369 -54 365 -51 366 ', + }, + noteheadDoubleWhole: { + x_min: 0, + x_max: 902.421875, + ha: 921, + o: 'm 17 240 b 24 241 19 241 21 241 b 32 240 28 241 31 241 b 46 229 38 238 43 234 b 50 88 50 223 50 237 b 50 -1 50 63 50 34 b 50 -90 50 -36 50 -65 b 46 -231 50 -238 50 -224 b 25 -242 42 -238 34 -242 b 0 -224 14 -242 4 -235 b 0 2 0 -222 0 -108 b 0 223 0 112 0 220 b 17 240 2 230 9 237 m 110 240 b 118 241 111 241 114 241 b 126 240 121 241 123 241 b 142 223 133 237 140 230 b 144 123 144 220 144 205 b 144 29 144 45 144 29 b 144 29 144 29 144 29 b 393 183 166 106 264 167 b 450 186 412 184 431 186 b 756 29 600 186 732 120 b 756 29 756 29 756 29 b 758 123 758 29 758 45 b 760 227 758 226 758 223 b 784 241 766 237 774 241 b 804 229 792 241 800 237 b 809 88 808 223 809 237 l 809 -1 l 809 -90 b 804 -231 809 -238 808 -224 b 784 -242 800 -238 792 -242 b 762 -231 775 -242 766 -238 b 758 -124 756 -224 758 -231 b 756 -30 758 -47 758 -30 b 756 -30 756 -30 756 -30 b 509 -184 736 -108 637 -169 b 450 -187 488 -187 469 -187 b 144 -30 300 -187 168 -122 b 144 -30 144 -30 144 -30 b 144 -124 144 -30 144 -47 b 140 -231 144 -231 144 -224 b 118 -242 134 -238 126 -242 b 92 -224 107 -242 96 -235 b 92 2 92 -222 92 -108 b 92 223 92 112 92 220 b 110 240 95 230 102 237 m 432 161 b 413 162 426 162 420 162 b 313 41 351 162 313 109 b 347 -73 313 5 323 -34 b 487 -163 385 -133 439 -163 b 578 -97 526 -163 562 -142 b 588 -43 585 -80 588 -62 b 432 161 588 47 518 147 m 868 240 b 876 241 869 241 872 241 b 884 240 879 241 882 241 b 898 229 890 238 894 234 b 902 88 902 223 902 237 l 902 -1 l 902 -90 b 898 -231 902 -238 902 -224 b 876 -242 892 -238 884 -242 b 852 -224 865 -242 854 -235 b 850 2 850 -222 850 -108 b 852 223 850 112 850 220 b 868 240 853 230 860 237 ', + }, + noteheadWhole: { + x_min: 0, + x_max: 619.3125, + ha: 632, + o: 'm 274 184 b 307 186 285 186 296 186 b 616 22 465 186 597 116 b 619 -1 617 13 619 5 b 308 -187 619 -104 483 -187 b 0 -1 133 -187 0 -102 b 5 36 0 11 1 23 b 274 184 29 115 141 176 m 289 161 b 272 162 284 162 277 162 b 171 41 209 162 171 108 b 205 -73 171 5 182 -34 b 345 -163 243 -133 298 -163 b 436 -98 385 -163 420 -142 b 446 -43 443 -80 446 -62 b 289 161 446 47 377 147 ', + }, + noteheadHalf: { + x_min: 0, + x_max: 428.75, + ha: 438, + o: 'm 262 186 b 273 186 266 186 272 186 b 274 186 273 186 274 186 b 285 186 274 186 280 186 b 428 48 375 181 428 122 b 386 -68 428 12 416 -29 b 155 -187 329 -145 236 -187 b 12 -111 92 -187 38 -162 b 0 -51 4 -91 0 -72 b 262 186 0 58 122 179 m 366 131 b 352 134 362 133 357 134 b 219 81 321 134 269 115 b 47 -111 126 23 50 -62 b 47 -112 47 -111 47 -112 b 77 -136 47 -129 58 -136 b 264 -45 118 -136 194 -101 b 382 109 336 12 382 76 b 366 131 382 120 377 129 ', + }, + noteheadBlack: { + x_min: 0, + x_max: 428.75, + ha: 438, + o: 'm 262 186 b 273 186 266 186 272 186 b 274 186 273 186 274 186 b 285 186 274 186 280 186 b 428 48 375 181 428 122 b 386 -68 428 12 416 -29 b 155 -187 329 -145 236 -187 b 12 -111 92 -187 38 -162 b 0 -51 4 -91 0 -72 b 262 186 0 58 122 179 ', + }, + noteheadXWhole: { + x_min: 0, + x_max: 598.890625, + ha: 611, + o: 'm 62 181 b 77 183 66 183 72 183 b 91 181 83 183 88 183 b 202 131 100 180 106 177 l 299 87 l 394 131 b 517 183 499 181 502 183 b 519 183 517 183 518 183 b 598 104 567 183 598 144 b 577 49 598 84 592 65 b 518 15 567 38 563 37 b 484 0 499 6 484 0 b 518 -16 484 -1 499 -8 b 577 -51 563 -38 567 -40 b 598 -105 592 -66 598 -86 b 519 -184 598 -145 567 -184 b 517 -184 518 -184 517 -184 b 394 -133 502 -184 499 -183 l 299 -88 l 202 -133 b 81 -184 99 -183 95 -184 b 77 -184 80 -184 78 -184 b 0 -105 29 -184 0 -145 b 20 -51 0 -86 5 -66 b 80 -16 29 -40 34 -38 b 114 -1 98 -8 114 -1 b 80 15 114 0 98 6 b 20 49 34 37 29 38 b 0 104 6 65 0 84 b 62 181 0 140 23 174 m 88 134 b 74 136 85 134 80 136 b 68 134 72 136 69 136 b 46 104 54 130 46 117 b 55 81 46 95 49 88 b 149 34 59 76 53 80 b 224 -1 190 15 224 0 b 144 -38 224 -1 187 -18 b 54 -84 59 -79 58 -79 b 46 -105 49 -90 46 -98 b 76 -137 46 -122 58 -137 b 78 -137 77 -137 77 -137 b 194 -86 87 -137 76 -141 b 298 -36 250 -58 298 -36 b 298 -36 298 -36 298 -36 b 402 -84 299 -36 345 -58 b 518 -137 522 -141 510 -137 b 521 -137 519 -137 519 -137 b 551 -105 539 -137 551 -122 b 541 -83 551 -98 548 -90 b 447 -36 537 -77 544 -81 b 374 -1 406 -16 374 -1 b 447 34 374 0 406 15 b 541 81 544 80 537 76 b 551 104 548 88 551 97 b 521 136 551 120 539 136 b 518 136 519 136 519 136 b 517 136 518 136 517 136 l 517 136 b 402 83 511 136 511 136 b 298 34 345 56 299 34 b 298 34 298 34 298 34 b 194 84 298 34 250 56 b 88 134 137 111 89 133 ', + }, + noteheadXHalf: { + x_min: 0, + x_max: 406.96875, + ha: 415, + o: 'm 55 181 b 70 183 61 183 66 183 b 111 170 85 183 99 179 b 160 130 115 167 137 149 l 202 95 l 245 130 b 319 181 299 176 302 179 b 334 183 325 183 330 183 b 406 109 375 183 406 148 b 401 81 406 99 405 91 b 348 24 394 65 390 59 b 318 -1 332 11 318 0 b 348 -26 318 -1 332 -12 b 401 -83 390 -61 394 -66 b 406 -111 405 -93 406 -101 b 334 -184 406 -149 375 -184 b 319 -183 330 -184 325 -184 b 245 -131 302 -180 299 -177 l 202 -97 l 160 -131 b 85 -183 107 -177 103 -180 b 70 -184 80 -184 76 -184 b 0 -111 31 -184 0 -149 b 4 -83 0 -101 1 -93 b 58 -26 10 -66 16 -61 b 88 -1 74 -12 88 -1 b 58 24 88 0 74 11 b 10 69 23 54 17 59 b 0 109 2 81 0 95 b 55 181 0 142 21 173 m 83 133 b 72 136 78 136 76 136 b 57 131 66 136 61 134 b 46 109 49 126 46 117 b 50 93 46 104 47 98 b 107 45 51 91 77 70 b 160 0 137 20 160 0 b 107 -47 160 -1 137 -22 b 50 -94 77 -72 51 -93 b 46 -111 47 -99 46 -105 b 59 -134 46 -120 50 -130 b 72 -137 62 -136 68 -137 b 83 -136 76 -137 80 -136 b 144 -84 84 -134 107 -116 b 202 -36 176 -58 202 -36 b 261 -84 202 -36 230 -58 b 323 -136 299 -116 321 -134 b 334 -137 326 -136 330 -137 b 345 -134 338 -137 343 -136 b 360 -111 355 -130 360 -120 b 355 -94 360 -105 359 -99 b 299 -47 353 -93 329 -72 b 245 0 269 -22 245 -1 b 299 45 245 0 269 20 b 355 93 329 70 353 91 b 360 109 359 98 360 104 b 345 133 360 119 355 129 b 334 136 343 134 338 136 b 323 134 330 136 326 134 b 261 83 321 133 299 115 b 202 34 230 56 202 34 b 144 83 202 34 176 56 b 83 133 106 115 84 133 ', + }, + noteheadXBlack: { + x_min: 0, + x_max: 406.96875, + ha: 415, + o: 'm 21 183 b 28 183 24 183 25 183 b 42 181 34 183 39 183 b 127 108 47 179 47 179 b 202 41 168 72 202 41 b 279 108 204 41 238 72 b 357 177 321 145 356 176 b 375 183 363 181 370 183 b 406 151 392 183 406 169 b 404 137 406 147 405 141 b 322 62 401 131 398 129 b 251 0 284 27 251 0 b 322 -63 251 -1 284 -29 b 404 -138 398 -130 401 -133 b 406 -152 405 -142 406 -148 b 375 -184 406 -170 392 -184 b 357 -179 370 -184 363 -183 b 279 -109 356 -177 321 -147 b 202 -43 238 -73 204 -43 b 127 -109 202 -43 168 -73 b 49 -179 85 -147 50 -177 b 31 -184 43 -183 36 -184 b 0 -152 13 -184 0 -170 b 2 -138 0 -148 0 -142 b 83 -63 5 -133 8 -130 b 155 0 122 -29 155 -1 b 83 62 155 0 122 27 b 8 129 43 97 10 127 b 0 151 2 136 0 144 b 21 183 0 165 8 177 ', + }, + noteheadCircleX: { + x_min: 0, + x_max: 484.5625, + ha: 494, + o: 'm 228 245 b 239 247 234 247 239 247 b 243 247 240 247 242 247 b 303 238 257 247 287 242 b 484 -2 417 208 484 104 b 412 -177 484 -65 461 -127 b 243 -248 363 -226 303 -248 b 6 -63 138 -248 36 -180 b 0 -1 1 -41 0 -20 b 228 245 0 127 98 240 m 255 181 b 240 183 247 183 245 183 b 232 181 238 183 235 183 b 142 152 200 180 168 170 l 138 149 l 190 97 l 242 44 l 294 97 l 345 149 l 340 152 b 255 181 315 169 284 180 m 147 -54 l 197 -1 l 147 51 l 95 104 l 91 99 b 62 -1 72 70 62 34 b 66 -43 62 -15 63 -29 b 91 -101 72 -63 80 -84 l 95 -106 l 147 -54 m 393 99 b 389 104 390 102 389 104 b 337 51 389 104 366 80 l 285 -1 l 337 -54 l 389 -106 l 393 -101 b 421 -1 412 -72 421 -36 b 393 99 421 34 412 69 m 294 -98 b 242 -45 265 -69 242 -45 b 190 -98 242 -45 219 -69 l 138 -151 l 142 -154 b 242 -184 172 -174 206 -184 b 340 -154 276 -184 311 -174 l 345 -151 l 294 -98 ', + }, + noteheadTriangleUpWhole: { + x_min: 0, + x_max: 630.203125, + ha: 643, + o: 'm 308 204 b 314 205 310 205 313 205 b 326 201 319 205 323 204 b 355 154 328 199 338 180 b 401 83 362 142 392 95 l 409 72 b 431 41 412 66 424 49 b 619 -174 498 -51 570 -134 b 630 -192 626 -180 630 -186 b 626 -202 630 -195 628 -199 b 616 -206 623 -205 620 -206 b 552 -188 608 -206 592 -202 b 310 -155 488 -169 392 -155 b 268 -156 295 -155 281 -155 b 77 -188 197 -161 126 -173 b 13 -206 35 -202 20 -206 b 9 -206 12 -206 10 -206 b 0 -191 2 -202 0 -197 b 8 -176 0 -186 2 -180 b 204 49 58 -136 138 -43 l 220 72 l 227 83 b 295 188 245 108 281 166 b 308 204 299 197 304 202 m 315 147 b 314 147 315 147 314 147 b 314 147 314 147 314 147 b 306 129 314 145 310 138 l 296 105 b 281 72 292 97 284 77 l 274 56 b 181 -123 247 -4 212 -72 l 174 -134 l 176 -133 b 314 -123 215 -127 272 -123 b 451 -133 356 -123 413 -127 l 454 -134 l 449 -123 b 353 56 417 -72 381 -4 l 347 72 b 332 105 344 77 336 97 l 322 129 b 315 147 318 138 315 145 ', + }, + noteheadTriangleUpHalf: { + x_min: 0, + x_max: 438.28125, + ha: 447, + o: 'm 212 205 b 219 205 213 205 216 205 b 239 183 228 205 231 204 b 421 -163 298 40 363 -83 b 438 -191 434 -180 438 -186 b 436 -197 438 -192 438 -195 b 424 -206 434 -204 431 -206 b 406 -201 420 -206 415 -205 b 216 -156 347 -172 281 -156 b 23 -205 148 -156 80 -173 b 14 -206 20 -206 17 -206 b 0 -191 6 -206 0 -201 b 6 -176 0 -187 1 -183 b 202 192 63 -104 142 45 b 212 205 205 199 208 202 m 264 48 l 249 81 l 243 94 l 242 91 b 89 -126 208 36 137 -66 b 81 -138 85 -133 81 -138 b 81 -138 81 -138 81 -138 b 81 -138 81 -138 81 -138 b 95 -133 81 -138 87 -136 b 280 -94 156 -108 221 -94 b 334 -98 299 -94 317 -95 b 343 -99 338 -99 343 -99 b 343 -99 343 -99 343 -99 b 338 -94 343 -99 341 -97 b 264 48 318 -58 287 1 ', + }, + noteheadTriangleUpBlack: { + x_min: -1.359375, + x_max: 436.921875, + ha: 446, + o: 'm 213 205 b 217 205 215 205 216 205 b 234 194 224 205 234 199 b 236 187 234 194 235 190 l 245 167 l 261 129 l 270 106 b 355 -61 294 54 329 -13 b 420 -163 381 -105 402 -138 b 436 -188 435 -184 436 -184 b 436 -191 436 -190 436 -190 b 421 -206 436 -201 431 -206 l 421 -206 l 416 -206 l 405 -201 b 217 -158 347 -172 283 -158 b 31 -201 153 -158 88 -172 l 20 -206 l 14 -206 l 14 -206 b 0 -191 5 -206 0 -201 b -1 -188 0 -190 -1 -190 b 14 -163 -1 -186 0 -184 b 95 -34 36 -136 72 -77 b 166 106 119 8 148 68 l 175 129 l 183 148 l 200 188 b 213 205 205 199 208 202 ', + }, + noteheadDiamondWhole: { + x_min: 0, + x_max: 627.46875, + ha: 640, + o: 'm 306 190 b 314 191 308 191 311 191 b 326 184 318 191 322 190 l 336 173 b 510 52 377 127 442 80 b 515 49 513 51 515 49 b 611 16 537 40 579 24 b 627 0 624 13 627 9 b 607 -18 627 -11 624 -13 b 330 -181 490 -49 389 -109 b 314 -192 323 -190 319 -192 b 306 -191 311 -192 308 -192 b 294 -177 302 -188 302 -188 b 257 -140 287 -170 265 -148 b 19 -18 193 -84 114 -44 b 0 0 2 -13 0 -11 b 16 16 0 9 2 13 b 110 49 47 24 89 40 b 117 52 111 49 114 51 b 145 65 126 56 130 58 b 281 163 200 93 245 124 b 300 186 288 170 291 174 b 306 190 300 187 303 188 m 317 137 b 313 142 315 141 314 142 b 308 137 313 142 311 141 b 161 4 276 84 220 33 b 155 0 159 1 155 0 b 163 -4 155 0 159 -2 b 308 -138 220 -34 276 -84 b 313 -142 311 -141 313 -142 b 317 -138 314 -142 315 -141 b 464 -4 351 -84 406 -34 b 470 0 468 -2 470 0 b 464 4 470 0 468 1 b 317 137 406 33 351 84 ', + }, + noteheadDiamondHalf: { + x_min: 0, + x_max: 438.28125, + ha: 447, + o: 'm 212 190 b 219 191 213 191 216 191 b 236 176 225 191 228 190 b 419 18 277 105 341 49 b 436 5 431 13 434 11 b 438 -1 438 4 438 1 b 424 -16 438 -8 432 -13 b 356 -49 409 -20 379 -36 b 234 -180 306 -83 258 -133 b 219 -192 230 -188 224 -192 b 200 -176 213 -192 206 -187 b 9 -15 157 -102 89 -45 b 0 0 2 -12 0 -6 b 16 18 0 9 2 12 b 200 176 93 48 159 104 b 212 190 205 186 208 188 m 239 113 b 236 117 238 116 238 117 b 230 108 235 117 234 115 b 92 -15 196 58 140 8 b 88 -18 91 -16 88 -18 b 92 -20 88 -18 91 -19 b 198 -116 130 -43 166 -74 b 200 -117 200 -117 200 -117 b 201 -117 200 -117 201 -117 b 264 -43 212 -98 242 -62 b 345 15 288 -19 321 4 b 348 18 347 16 348 16 b 344 20 348 18 347 19 b 239 113 307 41 266 79 ', + }, + noteheadDiamondBlack: { + x_min: 0, + x_max: 432.828125, + ha: 442, + o: 'm 209 186 b 213 187 210 187 212 187 b 216 187 215 187 216 187 b 224 174 216 186 220 180 b 420 -1 269 105 338 43 b 432 -12 431 -8 432 -9 b 421 -23 432 -15 432 -16 b 228 -180 345 -70 264 -137 b 219 -188 221 -188 221 -188 l 219 -188 b 208 -177 215 -188 215 -188 b 10 1 163 -106 93 -44 b 0 11 0 6 0 8 b 10 22 0 13 0 15 b 202 179 87 69 167 136 b 209 186 206 183 209 186 ', + }, + augmentationDot: { + x_min: 0, + x_max: 133.390625, + ha: 136, + o: 'm 54 66 b 65 68 58 68 61 68 b 122 37 88 68 110 56 b 133 -1 130 26 133 12 b 104 -58 133 -23 123 -44 b 66 -69 92 -65 78 -69 b 10 -38 44 -69 23 -58 b 0 -1 2 -27 0 -13 b 54 66 0 30 20 61 ', + }, + tremolo1: { + x_min: -206.890625, + x_max: 428.75, + ha: 438, + o: 'm 389 -351 b 394 -351 390 -351 393 -351 b 428 -385 413 -351 428 -367 b 428 -394 428 -388 428 -391 b 394 -428 426 -406 421 -410 l 332 -473 l 269 -516 l 205 -560 l 141 -603 l 77 -648 l 13 -692 l -50 -737 l -114 -780 l -145 -802 b -171 -813 -157 -810 -163 -813 b -175 -813 -172 -813 -174 -813 b -206 -777 -194 -811 -206 -795 b -202 -760 -206 -771 -205 -766 b -87 -675 -197 -752 -206 -757 l -34 -639 l 83 -557 l 145 -514 l 209 -470 l 272 -427 b 389 -351 375 -356 381 -352 ', + }, + flag8thUp: { + x_min: -24.5, + x_max: 317.140625, + ha: 324, + o: 'm -24 -161 l -24 -5 l -20 -5 b 0 -24 -9 -5 -2 -12 b 171 -315 21 -124 84 -233 b 317 -660 268 -406 317 -531 b 187 -1014 317 -782 274 -909 b 161 -1034 172 -1034 171 -1034 b 141 -1013 149 -1034 141 -1025 b 152 -991 141 -1004 142 -1002 b 266 -682 228 -899 266 -788 b 174 -430 266 -588 236 -498 b -23 -317 136 -388 66 -348 b -24 -161 -23 -316 -24 -285 ', + }, + flag8thDown: { + x_min: -21.78125, + x_max: 367.5, + ha: 375, + o: 'm 230 1031 b 238 1032 232 1032 235 1032 b 259 1014 245 1032 251 1027 b 367 662 330 906 367 782 b 364 602 367 641 367 621 b 232 317 352 488 304 384 b 57 120 155 245 103 187 b -1 18 31 84 6 40 b -19 4 -4 11 -12 4 l -21 4 l -21 159 l -21 315 l -16 315 b 96 335 10 315 62 324 b 315 695 227 380 315 527 b 313 738 315 709 314 724 b 224 991 304 825 273 916 b 216 1013 219 999 216 1007 b 230 1031 216 1021 220 1028 ', + }, + flag16thUp: { + x_min: -24.5, + x_max: 317.140625, + ha: 324, + o: 'm -24 -147 l -24 -5 l -20 -5 b -1 -19 -12 -5 -4 -11 b 58 -123 6 -43 31 -86 b 196 -278 93 -173 134 -219 b 317 -570 274 -356 317 -460 b 294 -713 317 -617 308 -666 l 289 -724 l 294 -735 b 317 -873 308 -780 317 -827 b 235 -1132 317 -963 288 -1054 b 209 -1165 228 -1140 224 -1146 b 189 -1177 204 -1172 196 -1177 b 171 -1164 182 -1177 175 -1172 b 168 -1154 170 -1161 168 -1159 b 181 -1132 168 -1149 172 -1142 b 269 -891 238 -1064 269 -975 b 269 -881 269 -886 269 -884 b 262 -814 269 -857 265 -827 b 258 -800 261 -811 259 -806 b 142 -628 240 -731 198 -667 b -8 -589 112 -606 47 -589 b -20 -589 -13 -589 -19 -589 l -24 -589 l -24 -449 l -24 -308 l -20 -308 b -1 -322 -12 -308 -4 -313 b 58 -424 6 -345 31 -388 b 194 -580 93 -476 136 -523 b 259 -660 221 -606 245 -635 b 261 -663 259 -662 261 -663 b 264 -656 262 -663 262 -660 b 269 -587 268 -632 269 -610 b 264 -521 269 -566 268 -544 b 262 -512 264 -517 262 -513 b 258 -498 261 -509 259 -503 b 142 -326 240 -428 198 -365 b -8 -287 112 -303 47 -288 b -20 -287 -13 -287 -19 -287 l -24 -287 l -24 -147 ', + }, + flag16thDown: { + x_min: -21.78125, + x_max: 362.0625, + ha: 369, + o: 'm 302 1031 b 308 1032 304 1032 307 1032 b 330 1016 318 1032 325 1027 b 362 867 351 970 362 920 b 340 738 362 824 353 780 l 336 727 l 340 717 b 362 591 355 677 362 634 b 257 323 362 496 325 401 b 204 272 243 306 227 290 b 20 56 129 206 66 133 b -1 18 12 44 0 22 b -19 4 -4 9 -12 4 l -21 4 l -21 140 l -21 276 l -12 277 b 167 333 61 288 127 309 b 319 598 262 388 319 491 b 311 664 319 620 317 642 l 310 673 l 304 664 b 204 548 279 620 250 587 b 20 333 129 483 66 409 b -1 292 12 320 0 298 b -19 280 -4 285 -12 280 l -21 280 l -21 416 l -21 552 l -12 553 b 167 609 61 564 127 585 b 319 874 264 666 319 770 b 294 992 319 914 311 954 b 288 1011 288 1004 288 1007 b 302 1031 288 1021 294 1028 ', + }, + flag32ndUp: { + x_min: -24.5, + x_max: 315.78125, + ha: 322, + o: 'm -24 -145 l -24 -5 l -20 -5 b 1 -26 -10 -5 -6 -9 b 175 -241 31 -86 96 -166 b 314 -548 259 -323 304 -420 b 315 -589 315 -555 315 -571 b 314 -630 315 -606 315 -623 b 298 -730 311 -664 306 -699 l 295 -742 l 296 -748 b 314 -850 304 -778 311 -813 b 315 -892 315 -857 315 -874 b 314 -932 315 -909 315 -925 b 298 -1032 311 -967 306 -1002 l 295 -1045 l 296 -1050 b 314 -1153 304 -1081 311 -1115 b 315 -1193 315 -1160 315 -1177 b 314 -1235 315 -1211 315 -1228 b 217 -1526 306 -1338 270 -1444 b 201 -1533 213 -1532 208 -1533 b 182 -1522 193 -1533 185 -1529 b 179 -1514 181 -1518 179 -1517 b 189 -1489 179 -1508 182 -1501 b 266 -1217 240 -1403 266 -1308 b 262 -1156 266 -1196 265 -1177 b 110 -907 247 -1043 190 -950 b 0 -889 87 -895 50 -889 l -1 -889 l -24 -889 l -24 -749 l -24 -610 l -20 -610 b 1 -631 -10 -610 -6 -614 b 175 -846 31 -691 96 -771 b 259 -956 213 -884 236 -914 b 265 -966 262 -961 264 -966 b 265 -966 265 -966 265 -966 b 265 -953 265 -964 265 -959 b 266 -920 266 -943 266 -932 b 262 -853 266 -898 265 -873 b 110 -605 247 -741 190 -648 b 0 -587 87 -592 50 -587 l -1 -587 l -24 -587 l -24 -448 l -24 -308 l -20 -308 b 1 -328 -10 -308 -6 -312 b 175 -544 31 -388 96 -469 b 259 -655 213 -581 236 -612 b 265 -663 262 -659 264 -663 b 265 -663 265 -663 265 -663 b 265 -650 265 -663 265 -657 b 266 -617 266 -641 266 -630 b 262 -551 266 -595 265 -570 b 110 -303 247 -438 190 -345 b 0 -284 87 -290 50 -284 l -1 -284 l -24 -284 l -24 -145 ', + }, + flag32ndDown: { + x_min: -21.78125, + x_max: 366.140625, + ha: 374, + o: 'm 276 1378 b 284 1379 279 1379 281 1379 b 306 1360 292 1379 298 1374 b 352 1247 326 1326 343 1286 b 366 1139 362 1213 366 1175 b 347 1009 366 1093 359 1049 l 344 1002 l 347 992 b 352 971 348 986 351 977 b 366 863 362 936 366 899 b 347 732 366 818 359 773 l 344 725 l 347 716 b 352 695 348 710 351 700 b 366 588 362 659 366 623 b 223 262 366 464 314 345 b 189 233 212 252 212 252 b 35 76 126 183 73 129 b -1 16 20 56 2 27 b -19 4 -4 9 -12 4 l -21 4 l -21 137 l -21 270 l -17 270 b 186 344 59 281 134 308 b 319 606 270 399 319 499 b 317 650 319 620 319 635 l 315 659 l 314 655 b 223 537 288 607 258 570 b 189 509 212 528 212 528 b 35 352 126 459 73 405 b -1 292 20 333 2 303 b -19 280 -4 285 -12 280 l -21 280 l -21 413 l -21 546 l -17 546 b 186 620 59 557 134 584 b 319 882 270 675 319 775 b 317 925 319 896 319 911 l 315 935 l 314 931 b 223 813 288 884 258 846 b 189 785 212 805 212 805 b 35 628 126 735 73 681 b -1 569 20 609 2 580 b -19 556 -4 562 -12 556 l -21 556 l -21 689 l -21 823 l -17 823 b 202 907 68 835 152 867 b 319 1157 280 968 319 1061 b 270 1338 319 1218 303 1281 b 262 1358 264 1349 262 1353 b 262 1364 262 1360 262 1363 b 276 1378 265 1371 269 1376 ', + }, + flag64thUp: { + x_min: -24.5, + x_max: 314.421875, + ha: 321, + o: 'm -24 -145 l -24 -5 l -20 -5 b 0 -23 -9 -5 -2 -12 b 27 -87 4 -38 14 -66 b 138 -220 53 -136 88 -177 b 235 -328 179 -255 208 -288 b 314 -592 287 -409 314 -501 b 292 -732 314 -639 307 -687 l 289 -742 l 294 -756 b 314 -896 307 -802 314 -849 b 292 -1035 314 -943 307 -991 l 289 -1045 l 294 -1057 b 314 -1197 307 -1104 314 -1152 b 292 -1338 314 -1246 307 -1292 l 289 -1347 l 294 -1360 b 314 -1500 307 -1407 314 -1454 b 273 -1689 314 -1565 300 -1628 b 250 -1712 265 -1710 261 -1712 b 228 -1691 236 -1712 228 -1704 l 228 -1685 l 234 -1675 b 270 -1507 258 -1621 270 -1564 b 98 -1193 270 -1381 209 -1261 b 40 -1174 76 -1179 58 -1174 b -10 -1189 24 -1174 8 -1178 b -20 -1192 -14 -1192 -16 -1192 l -24 -1192 l -24 -1052 l -24 -913 l -20 -913 b 0 -931 -9 -913 -2 -920 b 27 -995 4 -946 14 -974 b 138 -1128 53 -1043 88 -1085 b 257 -1275 190 -1172 228 -1220 b 262 -1283 259 -1279 262 -1283 l 262 -1283 b 269 -1249 264 -1282 268 -1260 b 270 -1206 270 -1233 270 -1220 b 98 -891 270 -1075 206 -957 b 40 -871 76 -877 58 -871 b -10 -886 24 -871 8 -875 b -20 -889 -14 -889 -16 -889 l -24 -889 l -24 -749 l -24 -610 l -20 -610 b 0 -628 -9 -610 -2 -617 b 27 -692 4 -644 14 -671 b 138 -825 53 -741 88 -782 b 257 -973 190 -870 228 -917 b 262 -981 259 -977 262 -981 l 262 -981 b 269 -946 264 -979 268 -957 b 270 -903 270 -931 270 -917 b 98 -588 270 -774 206 -655 b 40 -569 76 -574 58 -569 b -10 -584 24 -569 8 -574 b -20 -587 -14 -587 -16 -587 l -24 -587 l -24 -448 l -24 -308 l -20 -308 b 0 -326 -9 -308 -2 -315 b 27 -390 4 -341 14 -369 b 138 -523 53 -438 88 -480 b 257 -670 190 -567 228 -614 b 262 -678 259 -674 262 -678 b 262 -678 262 -678 262 -678 b 269 -644 264 -677 268 -656 b 270 -601 270 -628 270 -614 b 98 -285 270 -471 206 -352 b 40 -266 76 -273 58 -266 b -10 -281 24 -266 8 -272 b -20 -284 -14 -284 -16 -284 l -24 -284 l -24 -145 ', + }, + flag64thDown: { + x_min: -21.78125, + x_max: 367.5, + ha: 375, + o: 'm 259 1553 b 265 1553 261 1553 264 1553 b 288 1540 272 1553 277 1550 b 367 1351 340 1493 367 1424 b 336 1221 367 1308 357 1263 l 332 1211 l 333 1208 b 367 1077 356 1170 367 1124 b 336 945 367 1032 357 986 l 332 935 l 333 932 b 367 800 356 893 367 848 b 336 669 367 756 357 710 l 332 659 l 333 656 b 367 523 356 617 367 571 b 345 412 367 485 360 446 b 231 273 322 356 284 310 b -1 19 121 195 27 93 b -17 4 -4 11 -10 5 l -21 4 l -21 134 l -21 265 l -17 265 b 133 291 20 265 96 278 b 318 537 245 328 318 433 b 307 603 318 559 315 582 b 303 614 304 612 304 614 b 298 609 302 614 300 613 b 231 549 281 589 258 567 b -1 295 121 471 27 369 b -17 280 -4 287 -10 281 l -21 280 l -21 410 l -21 541 l -17 541 b 133 567 20 541 96 555 b 318 813 245 605 318 709 b 307 880 318 835 315 859 b 303 891 304 888 304 891 b 298 885 302 891 300 888 b 231 825 281 866 258 843 b -1 571 121 748 27 645 b -17 556 -4 563 -10 557 l -21 556 l -21 687 l -21 817 l -17 817 b 133 843 20 817 96 830 b 318 1089 245 881 318 985 b 307 1156 318 1111 315 1134 b 303 1167 304 1164 304 1167 b 298 1161 302 1167 300 1164 b 231 1102 281 1140 258 1120 b -1 848 121 1024 27 921 b -17 832 -4 839 -10 834 l -21 832 l -21 963 l -21 1093 l -17 1093 b 114 1113 12 1093 78 1103 b 313 1314 215 1142 289 1218 b 318 1364 317 1331 318 1347 b 255 1511 318 1422 295 1478 b 243 1532 247 1519 243 1525 b 259 1553 243 1540 250 1550 ', + }, + flag128thUp: { + x_min: -24.5, + x_max: 313.0625, + ha: 319, + o: 'm -24 -133 l -24 -5 l -20 -5 b -1 -19 -12 -5 -4 -11 b 142 -213 13 -61 74 -144 b 258 -376 196 -269 230 -315 b 313 -605 295 -449 313 -528 b 292 -742 313 -652 306 -699 b 288 -752 289 -748 288 -752 b 288 -752 288 -752 288 -752 b 292 -764 289 -753 291 -757 b 313 -907 306 -811 313 -860 b 292 -1045 313 -954 306 -1002 b 288 -1054 289 -1050 288 -1054 b 288 -1054 288 -1054 288 -1054 b 292 -1067 289 -1054 291 -1060 b 313 -1210 306 -1113 313 -1161 b 292 -1346 313 -1257 306 -1304 b 288 -1357 289 -1353 288 -1357 b 288 -1357 288 -1357 288 -1357 b 292 -1368 289 -1357 291 -1363 b 313 -1512 306 -1415 313 -1464 b 292 -1648 313 -1560 306 -1605 b 288 -1660 289 -1654 288 -1660 b 288 -1660 288 -1660 288 -1660 b 292 -1671 289 -1660 291 -1665 b 313 -1814 306 -1719 313 -1766 b 250 -2040 313 -1897 291 -1977 b 232 -2062 238 -2057 236 -2059 b 221 -2065 230 -2063 225 -2065 b 200 -2045 210 -2065 201 -2057 b 200 -2043 200 -2044 200 -2044 b 208 -2026 200 -2037 202 -2034 b 269 -1826 249 -1966 269 -1897 b 153 -1544 269 -1726 230 -1625 b -9 -1472 115 -1506 58 -1481 b -21 -1471 -14 -1471 -19 -1471 l -24 -1471 l -24 -1343 l -24 -1215 l -20 -1215 b -1 -1229 -12 -1215 -4 -1221 b 142 -1424 13 -1270 74 -1353 b 257 -1582 196 -1478 228 -1524 b 264 -1594 261 -1589 264 -1594 l 264 -1594 b 265 -1582 264 -1594 264 -1589 b 270 -1525 268 -1562 270 -1544 b 153 -1243 270 -1424 228 -1321 b -9 -1170 115 -1203 58 -1178 b -21 -1168 -14 -1170 -19 -1168 l -24 -1168 l -24 -1041 l -24 -913 l -20 -913 b -1 -927 -12 -913 -4 -918 b 142 -1121 13 -967 74 -1050 b 257 -1281 196 -1175 228 -1221 b 264 -1292 261 -1286 264 -1292 l 264 -1292 b 265 -1279 264 -1292 264 -1286 b 270 -1222 268 -1261 270 -1242 b 153 -941 270 -1121 228 -1018 b -9 -867 115 -900 58 -875 b -21 -866 -14 -867 -19 -866 l -24 -866 l -24 -738 l -24 -610 l -20 -610 b -1 -624 -12 -610 -4 -616 b 142 -818 13 -664 74 -749 b 257 -978 196 -873 228 -918 b 264 -989 261 -984 264 -989 l 264 -989 b 265 -977 264 -989 264 -984 b 270 -920 268 -959 270 -939 b 153 -638 270 -818 228 -716 b -9 -564 115 -598 58 -573 b -21 -563 -14 -564 -19 -563 l -24 -563 l -24 -435 l -24 -308 l -20 -308 b -1 -322 -12 -308 -4 -313 b 142 -516 13 -363 74 -446 b 257 -675 196 -571 228 -616 b 264 -687 261 -681 264 -687 l 264 -687 b 265 -674 264 -687 264 -681 b 270 -617 268 -656 270 -637 b 153 -335 270 -516 228 -413 b -9 -262 115 -295 58 -270 b -21 -260 -14 -262 -19 -260 l -24 -260 l -24 -133 ', + }, + flag128thDown: { + x_min: -21.78125, + x_max: 367.5, + ha: 375, + o: 'm 276 1900 b 284 1901 279 1900 281 1901 b 306 1883 291 1901 298 1896 b 367 1686 347 1825 367 1757 b 343 1558 367 1643 359 1600 l 338 1549 l 343 1537 b 367 1411 359 1497 367 1454 b 343 1282 367 1367 359 1324 l 338 1272 l 343 1261 b 367 1135 359 1221 367 1178 b 343 1007 367 1090 359 1047 l 338 996 l 343 985 b 367 859 359 945 367 902 b 343 731 367 814 359 771 l 338 720 l 343 709 b 367 582 359 667 367 626 b 289 362 367 503 340 426 b 239 312 276 345 259 330 b 29 77 152 237 76 152 b -1 18 14 54 2 30 b -19 4 -4 11 -12 4 l -21 4 l -21 133 l -20 260 l -13 262 b 98 299 17 269 62 284 b 111 305 103 302 110 305 b 167 334 123 310 156 327 b 319 595 264 391 319 491 b 313 659 319 616 318 638 b 310 667 311 664 311 667 b 307 663 310 667 308 666 b 240 588 289 637 269 614 b 16 331 141 505 62 413 b -1 294 8 316 1 302 b -19 280 -4 287 -12 280 l -21 280 l -21 408 l -20 537 l -13 538 b 98 576 17 545 62 560 b 111 581 103 578 110 581 b 167 610 123 587 156 603 b 319 871 264 667 319 767 b 313 935 319 892 318 913 b 310 942 311 941 311 942 b 307 939 310 942 308 941 b 240 864 289 913 269 889 b 16 607 141 781 62 689 b -1 570 8 592 1 578 b -19 556 -4 563 -12 556 l -21 556 l -21 684 l -20 813 l -13 814 b 98 852 17 821 62 836 b 111 857 103 855 110 857 b 167 886 123 863 156 880 b 319 1147 264 943 319 1043 b 313 1211 319 1168 318 1189 b 310 1218 311 1217 311 1218 b 307 1215 310 1218 308 1217 b 240 1140 289 1188 269 1165 b 16 884 141 1057 62 966 b -1 846 8 868 1 855 b -19 832 -4 839 -12 832 l -21 832 l -21 960 l -20 1089 l -13 1090 b 98 1128 17 1097 62 1111 b 111 1134 103 1131 110 1134 b 167 1163 123 1139 156 1156 b 319 1424 264 1220 319 1320 b 313 1486 319 1444 318 1465 b 310 1494 311 1493 311 1494 b 307 1492 310 1494 308 1493 b 240 1417 289 1464 269 1442 b 16 1160 141 1333 62 1242 b -1 1121 8 1145 1 1131 b -19 1109 -4 1115 -12 1109 l -21 1109 l -21 1236 l -20 1365 l -13 1367 b 98 1404 17 1374 62 1388 b 111 1410 103 1407 110 1410 b 250 1508 172 1437 215 1467 b 319 1701 296 1564 319 1633 b 270 1859 319 1757 303 1814 b 262 1882 265 1868 262 1875 b 276 1900 262 1890 266 1896 ', + }, + accidentalFlat: { + x_min: -21.78125, + x_max: 251.8125, + ha: 257, + o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 383 20 616 20 616 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 201 l -21 616 l -20 620 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ', + }, + accidentalNatural: { + x_min: 0, + x_max: 239.5625, + ha: 244, + o: 'm 10 460 b 20 462 13 462 14 462 b 39 449 28 462 35 458 l 40 446 l 40 326 b 40 205 40 259 40 205 b 127 227 40 205 80 215 b 220 249 196 244 213 249 b 227 247 224 249 225 248 b 238 237 231 245 235 241 l 239 233 l 239 -106 l 239 -448 l 238 -451 b 219 -463 234 -459 225 -463 b 198 -451 210 -463 202 -459 l 197 -448 l 197 -324 b 197 -201 197 -248 197 -201 b 110 -223 196 -201 157 -210 b 17 -245 42 -240 24 -245 b 10 -242 13 -245 13 -244 b 0 -233 6 -241 2 -237 l 0 -230 l 0 108 l 0 446 l 0 449 b 10 460 2 453 6 458 m 197 22 b 197 70 197 41 197 58 b 196 116 197 113 197 116 l 196 116 b 118 97 196 116 160 106 l 40 77 l 40 -18 b 40 -112 40 -69 40 -112 l 119 -93 l 197 -73 l 197 22 ', + }, + accidentalSharp: { + x_min: 0, + x_max: 323.9375, + ha: 331, + o: 'm 217 535 b 225 537 220 537 221 537 b 245 524 235 537 242 533 l 246 521 l 247 390 l 247 258 l 273 265 b 306 270 288 269 299 270 b 322 259 315 270 319 267 b 323 208 323 256 323 233 b 322 158 323 184 323 159 b 288 140 318 148 315 147 b 247 130 254 131 247 130 b 247 65 247 130 247 104 b 247 20 247 51 247 36 l 247 -88 l 273 -81 b 306 -76 289 -77 299 -76 b 318 -81 311 -76 315 -77 b 323 -123 323 -87 323 -86 l 323 -138 l 323 -154 b 318 -195 323 -191 323 -190 b 269 -210 314 -199 315 -199 b 249 -216 259 -213 250 -216 l 247 -216 l 247 -349 l 246 -483 l 245 -487 b 225 -499 242 -495 234 -499 b 206 -487 219 -499 210 -495 l 205 -483 l 205 -355 l 205 -227 l 204 -227 l 181 -233 l 138 -244 b 117 -249 127 -247 117 -249 b 115 -385 115 -249 115 -256 l 115 -523 l 114 -526 b 95 -538 110 -534 102 -538 b 74 -526 87 -538 78 -534 l 73 -523 l 73 -391 b 72 -260 73 -269 73 -260 b 72 -260 72 -260 72 -260 b 19 -273 61 -263 23 -273 b 0 -260 10 -273 4 -267 b 0 -209 0 -256 0 -256 l 0 -162 l 1 -158 b 61 -134 5 -148 5 -148 l 73 -131 l 73 -22 b 72 86 73 79 73 86 b 72 86 72 86 72 86 b 19 74 61 83 23 74 b 0 86 10 74 4 79 b 0 137 0 90 0 90 l 0 184 l 1 188 b 61 212 5 198 5 198 l 73 215 l 73 348 l 73 481 l 74 485 b 95 498 78 492 87 498 b 103 495 98 498 100 496 b 114 485 107 494 111 489 l 115 481 l 115 353 l 115 226 l 121 226 b 159 235 123 227 141 231 l 198 247 l 205 248 l 205 384 l 205 521 l 206 524 b 217 535 209 528 212 533 m 205 9 b 205 119 205 70 205 119 l 205 119 b 182 113 204 119 194 116 l 138 102 b 117 97 127 99 117 97 b 115 -12 115 97 115 91 l 115 -122 l 121 -120 b 159 -111 123 -119 141 -115 l 198 -101 l 205 -98 l 205 9 ', + }, + accidentalDoubleSharp: { + x_min: 0, + x_max: 367.5, + ha: 375, + o: 'm 0 124 l 0 187 l 61 187 l 122 187 l 122 138 l 122 91 l 153 61 l 183 30 l 213 61 l 243 91 l 243 138 l 243 187 l 306 187 l 367 187 l 367 124 l 367 61 l 321 61 l 274 61 l 243 30 l 213 0 l 243 -31 l 274 -62 l 321 -62 l 367 -62 l 367 -124 l 367 -188 l 306 -188 l 243 -188 l 243 -140 l 243 -93 l 213 -62 l 183 -31 l 153 -62 l 122 -93 l 122 -140 l 122 -188 l 61 -188 l 0 -188 l 0 -124 l 0 -62 l 46 -62 l 92 -62 l 123 -31 l 153 0 l 123 30 l 92 61 l 46 61 l 0 61 l 0 124 ', + }, + accidentalDoubleFlat: { + x_min: -21.78125, + x_max: 483.1875, + ha: 493, + o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 383 20 616 20 616 l 20 148 l 21 151 b 140 199 59 183 102 199 b 206 179 164 199 187 192 l 210 176 l 210 396 l 210 617 l 212 621 b 231 632 216 628 223 632 b 250 620 239 632 247 628 b 251 383 251 616 251 616 l 251 148 l 254 151 b 370 199 291 183 332 199 b 415 191 385 199 400 197 b 483 84 458 176 483 134 b 461 0 483 58 476 29 b 332 -142 439 -40 411 -72 l 255 -215 b 231 -229 240 -229 239 -229 b 216 -223 224 -229 220 -227 b 210 -158 210 -217 210 -223 b 210 -120 210 -148 210 -136 l 210 -29 l 205 -34 b 100 -142 182 -65 159 -88 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 201 l -21 616 l -20 620 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 m 341 131 b 328 133 337 133 332 133 b 322 133 326 133 323 133 b 257 87 296 129 273 113 l 251 80 l 251 -37 l 251 -156 l 255 -152 b 375 81 328 -72 375 20 l 375 83 b 341 131 375 113 367 126 ', + }, + accidentalParensLeft: { + x_min: -166.0625, + x_max: -25.859375, + ha: 0, + o: 'm -49 369 b -42 370 -46 369 -44 370 b -27 360 -36 370 -29 366 b -25 355 -27 359 -25 358 b -32 335 -25 351 -28 347 b -92 52 -66 248 -87 159 b -93 -1 -93 43 -93 20 b -92 -54 -93 -23 -93 -45 b -32 -337 -85 -162 -66 -251 b -25 -355 -27 -349 -25 -352 b -42 -371 -25 -365 -32 -371 b -61 -353 -50 -371 -51 -369 b -163 -63 -119 -262 -153 -165 b -166 -1 -166 -37 -166 -31 b -163 62 -166 30 -166 36 b -61 352 -153 163 -119 260 b -49 369 -54 365 -51 366 ', + }, + accidentalParensRight: { + x_min: 25.859375, + x_max: 164.6875, + ha: 168, + o: 'm 34 369 b 40 370 35 370 38 370 b 59 353 49 370 50 367 b 164 40 122 254 155 158 b 164 0 164 33 164 16 b 164 -40 164 -16 164 -34 b 59 -353 155 -158 122 -254 b 40 -371 53 -366 47 -371 b 34 -370 38 -371 36 -370 b 25 -358 28 -367 25 -363 b 31 -337 25 -352 27 -347 b 92 0 72 -234 92 -117 b 31 335 92 116 72 233 b 25 356 27 345 25 352 b 34 369 25 363 28 366 ', + }, + accidentalQuarterToneFlatStein: { + x_min: 0, + x_max: 272.21875, + ha: 278, + o: 'm 243 631 b 250 632 246 632 249 632 b 270 620 259 632 268 628 l 272 616 l 272 201 l 272 -212 l 270 -216 b 251 -229 268 -224 259 -229 b 227 -215 243 -229 240 -229 l 151 -142 b 32 -16 81 -80 53 -49 b 0 84 9 18 0 52 b 111 199 0 149 42 199 b 137 197 119 199 127 198 b 228 151 168 191 197 177 l 231 148 l 231 383 b 232 620 231 616 231 616 b 243 631 234 624 238 630 m 168 131 b 152 133 163 133 157 133 b 107 102 130 133 111 120 b 106 86 107 97 106 91 b 111 41 106 73 108 56 b 227 -152 125 -13 171 -90 l 231 -156 l 231 -37 l 231 80 l 225 87 b 168 131 210 111 190 126 ', + }, + accidentalThreeQuarterTonesFlatZimmermann: { + x_min: 0, + x_max: 607.0625, + ha: 619, + o: 'm 243 631 b 250 632 246 632 249 632 b 270 620 259 632 268 628 l 272 616 l 272 201 l 272 -212 l 270 -216 b 251 -229 268 -224 259 -229 b 227 -215 243 -229 240 -229 l 151 -142 b 32 -16 81 -80 53 -49 b 0 84 9 18 0 52 b 111 199 0 149 42 199 b 137 197 119 199 127 198 b 228 151 168 191 197 177 l 231 148 l 231 383 b 232 620 231 616 231 616 b 243 631 234 624 238 630 m 168 131 b 152 133 163 133 157 133 b 107 102 130 133 111 120 b 106 86 107 97 106 91 b 111 41 106 73 108 56 b 227 -152 125 -13 171 -90 l 231 -156 l 231 -37 l 231 80 l 225 87 b 168 131 210 111 190 126 m 347 631 b 353 632 348 632 351 632 b 374 620 363 632 371 628 b 375 383 375 616 375 616 l 375 148 l 377 151 b 492 199 415 183 454 199 b 537 191 507 199 522 197 b 607 84 582 176 607 134 b 583 0 607 58 598 29 b 455 -142 562 -40 533 -72 l 378 -215 b 355 -229 364 -229 362 -229 b 334 -216 345 -229 337 -224 l 333 -212 l 333 201 l 333 616 l 334 620 b 347 631 337 624 341 630 m 465 131 b 451 133 461 133 455 133 b 445 133 449 133 446 133 b 379 87 419 129 396 113 l 375 80 l 375 -37 l 375 -156 l 378 -152 b 499 81 451 -72 499 20 l 499 83 b 465 131 499 113 490 126 ', + }, + accidentalQuarterToneSharpStein: { + x_min: 0, + x_max: 193.28125, + ha: 197, + o: 'm 85 514 b 95 517 88 517 89 517 b 114 505 103 517 110 513 l 115 502 l 115 376 b 115 249 115 306 115 249 b 141 258 117 249 127 252 l 167 266 l 172 266 b 190 254 181 265 187 262 l 193 251 l 193 202 l 193 188 b 187 147 193 149 191 152 b 147 130 183 142 182 141 l 115 119 l 115 9 b 115 -99 115 -51 115 -99 b 141 -91 115 -99 127 -95 b 171 -81 166 -81 167 -81 l 171 -81 b 191 -94 181 -81 189 -87 b 193 -142 191 -97 193 -120 b 191 -195 193 -167 191 -194 b 125 -227 187 -205 187 -204 l 115 -230 l 115 -366 l 115 -503 l 114 -506 b 95 -519 110 -514 102 -519 b 74 -506 87 -519 78 -514 l 73 -503 l 73 -374 b 73 -245 73 -260 73 -245 b 73 -245 73 -245 73 -245 b 55 -252 72 -245 63 -249 l 32 -260 b 19 -263 27 -262 23 -263 b 4 -256 13 -263 8 -260 b 0 -215 0 -251 0 -254 b 0 -199 0 -210 0 -206 l 0 -152 l 1 -149 b 8 -140 2 -145 5 -141 b 42 -127 9 -140 24 -133 l 73 -116 l 73 -5 b 73 23 73 4 73 15 b 73 105 73 70 73 105 b 49 97 73 105 61 101 b 17 88 32 91 23 88 b 4 95 10 88 8 91 b 0 137 0 101 0 98 b 0 151 0 141 0 145 l 0 199 l 1 202 b 43 224 5 212 5 212 l 73 234 l 73 367 l 73 502 l 74 505 b 85 514 77 509 81 513 ', + }, + accidentalThreeQuarterTonesSharpStein: { + x_min: -1.359375, + x_max: 455.96875, + ha: 465, + o: 'm 352 541 b 357 542 353 542 355 542 b 377 530 364 542 372 537 l 378 526 l 378 394 l 379 262 l 404 266 b 436 270 420 269 430 270 b 450 265 443 270 446 269 b 455 220 455 259 455 260 l 455 208 l 455 161 l 454 156 b 411 140 449 147 447 147 b 378 133 393 137 379 134 b 378 68 378 133 378 106 b 378 22 378 54 378 38 l 379 -87 l 404 -83 b 436 -79 420 -80 430 -79 b 450 -84 443 -79 446 -80 b 455 -129 455 -90 455 -88 l 455 -141 l 455 -188 l 454 -192 b 413 -209 449 -202 447 -202 b 382 -215 398 -212 383 -215 l 378 -215 l 378 -345 l 378 -380 b 375 -485 378 -484 378 -480 b 357 -494 371 -491 364 -494 b 340 -485 351 -494 344 -491 b 336 -383 337 -480 336 -484 l 336 -349 l 336 -223 l 334 -223 b 291 -231 334 -223 314 -227 l 247 -240 l 247 -371 l 246 -503 l 245 -506 b 225 -519 242 -514 234 -519 b 206 -506 219 -519 210 -514 l 205 -503 l 205 -376 l 205 -248 l 160 -256 l 115 -265 l 115 -396 l 115 -527 l 114 -531 b 95 -544 110 -539 102 -544 b 76 -531 87 -544 78 -539 l 73 -527 l 73 -399 b 73 -273 73 -330 73 -273 b 49 -277 73 -273 61 -274 b 17 -281 32 -280 24 -281 b 4 -276 10 -281 8 -280 b -1 -234 0 -269 -1 -272 b 0 -219 -1 -229 0 -224 l 0 -170 l 1 -167 b 10 -158 2 -163 6 -159 b 49 -149 13 -156 16 -155 l 73 -145 l 73 -34 b 73 76 73 26 73 76 b 49 72 73 76 61 74 b 17 68 32 69 24 68 b 4 73 10 68 8 69 b -1 115 0 80 -1 77 b 0 130 -1 120 0 124 l 0 179 l 1 181 b 10 191 2 186 6 190 b 49 199 13 192 16 194 l 73 204 l 73 338 b 73 374 73 352 73 365 b 77 483 73 484 73 477 b 95 492 81 489 88 492 b 111 483 100 492 107 489 b 115 378 115 477 115 483 l 115 342 b 117 212 115 223 115 212 b 204 229 117 212 200 227 l 205 229 l 205 365 l 205 502 l 206 505 b 225 517 210 513 219 517 b 245 505 234 517 242 513 l 246 502 l 247 369 l 247 237 l 249 237 b 336 254 253 238 336 254 b 337 390 336 254 337 302 l 337 526 l 338 530 b 352 541 341 535 347 539 m 336 15 b 336 126 336 102 336 126 l 336 126 b 291 117 336 126 315 122 l 247 109 l 247 -1 l 247 -112 l 249 -112 b 336 -95 253 -111 336 -95 b 336 15 336 -95 336 -56 m 205 -120 b 205 -55 205 -120 205 -93 b 205 -9 205 -41 205 -24 l 205 101 l 160 93 l 115 84 l 115 -26 b 115 -83 115 -49 115 -69 b 117 -137 115 -133 115 -137 b 205 -120 118 -137 204 -120 ', + }, + accidentalBuyukMucennebFlat: { + x_min: -171.5, + x_max: 251.8125, + ha: 257, + o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 553 20 616 20 614 b 20 491 20 503 20 491 l 20 491 b 153 535 47 501 149 535 b 174 514 167 535 174 524 b 164 496 174 508 171 501 b 92 470 164 495 132 484 l 20 445 l 20 390 b 20 363 20 378 20 370 b 20 333 20 340 20 333 l 20 333 b 153 377 47 344 149 377 b 174 356 167 377 174 367 b 164 338 174 349 171 342 b 92 312 164 338 132 326 l 20 288 l 20 219 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 30 -21 -212 -21 -212 b -21 273 -21 163 -21 273 b -84 252 -21 273 -50 263 b -152 230 -133 234 -145 230 b -157 231 -155 230 -156 231 b -171 252 -166 234 -171 244 b -160 270 -171 259 -167 266 b -27 316 -159 270 -93 294 l -21 319 l -21 374 b -21 431 -21 406 -21 431 b -84 409 -21 431 -50 421 b -152 388 -133 392 -145 388 b -157 390 -155 388 -156 388 b -171 409 -166 392 -171 401 b -160 428 -171 417 -167 424 b -27 474 -159 428 -93 451 l -21 476 l -21 546 b -20 620 -21 614 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ', + }, + accidentalBakiyeFlat: { + x_min: -176.9375, + x_max: 251.8125, + ha: 257, + o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 503 20 616 20 614 b 20 391 20 442 20 391 b 84 424 20 391 49 406 l 147 456 l 152 456 b 153 456 153 456 153 456 b 175 435 166 456 175 446 b 172 427 175 433 174 430 b 92 380 170 420 172 421 l 20 342 l 20 245 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 54 -21 -212 -21 -212 b -21 322 -21 201 -21 322 b -85 290 -21 322 -50 308 l -148 256 l -153 256 b -155 256 -155 256 -155 256 b -176 277 -167 256 -176 266 b -174 285 -176 280 -175 283 b -93 333 -171 294 -174 292 l -21 370 l -21 494 b -20 620 -21 616 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ', + }, + accidentalKomaSharp: { + x_min: -1.359375, + x_max: 455.96875, + ha: 465, + o: 'm 352 541 b 357 542 353 542 355 542 b 377 530 364 542 372 537 l 378 526 l 378 394 l 379 262 l 404 266 b 436 270 420 269 430 270 b 450 265 443 270 446 269 b 455 220 455 259 455 260 l 455 208 l 455 161 l 454 156 b 411 140 449 147 447 147 b 378 133 393 137 379 134 b 378 68 378 133 378 106 b 378 22 378 54 378 38 l 379 -87 l 404 -83 b 436 -79 420 -80 430 -79 b 450 -84 443 -79 446 -80 b 455 -129 455 -90 455 -88 l 455 -141 l 455 -188 l 454 -192 b 413 -209 449 -202 447 -202 b 382 -215 398 -212 383 -215 l 378 -215 l 378 -345 l 378 -380 b 375 -485 378 -484 378 -480 b 357 -494 371 -491 364 -494 b 340 -485 351 -494 344 -491 b 336 -383 337 -480 336 -484 l 336 -349 l 336 -223 l 334 -223 b 291 -231 334 -223 314 -227 l 247 -240 l 247 -371 l 246 -503 l 245 -506 b 225 -519 242 -514 234 -519 b 206 -506 219 -519 210 -514 l 205 -503 l 205 -376 l 205 -248 l 160 -256 l 115 -265 l 115 -396 l 115 -527 l 114 -531 b 95 -544 110 -539 102 -544 b 76 -531 87 -544 78 -539 l 73 -527 l 73 -399 b 73 -273 73 -330 73 -273 b 49 -277 73 -273 61 -274 b 17 -281 32 -280 24 -281 b 4 -276 10 -281 8 -280 b -1 -234 0 -269 -1 -272 b 0 -219 -1 -229 0 -224 l 0 -170 l 1 -167 b 10 -158 2 -163 6 -159 b 49 -149 13 -156 16 -155 l 73 -145 l 73 -34 b 73 76 73 26 73 76 b 49 72 73 76 61 74 b 17 68 32 69 24 68 b 4 73 10 68 8 69 b -1 115 0 80 -1 77 b 0 130 -1 120 0 124 l 0 179 l 1 181 b 10 191 2 186 6 190 b 49 199 13 192 16 194 l 73 204 l 73 338 b 73 374 73 352 73 365 b 77 483 73 484 73 477 b 95 492 81 489 88 492 b 111 483 100 492 107 489 b 115 378 115 477 115 483 l 115 342 b 117 212 115 223 115 212 b 204 229 117 212 200 227 l 205 229 l 205 365 l 205 502 l 206 505 b 225 517 210 513 219 517 b 245 505 234 517 242 513 l 246 502 l 247 369 l 247 237 l 249 237 b 336 254 253 238 336 254 b 337 390 336 254 337 302 l 337 526 l 338 530 b 352 541 341 535 347 539 m 336 15 b 336 126 336 102 336 126 l 336 126 b 291 117 336 126 315 122 l 247 109 l 247 -1 l 247 -112 l 249 -112 b 336 -95 253 -111 336 -95 b 336 15 336 -95 336 -56 m 205 -120 b 205 -55 205 -120 205 -93 b 205 -9 205 -41 205 -24 l 205 101 l 160 93 l 115 84 l 115 -26 b 115 -83 115 -49 115 -69 b 117 -137 115 -133 115 -137 b 205 -120 118 -137 204 -120 ', + }, + accidentalKucukMucennebSharp: { + x_min: -1.359375, + x_max: 255.890625, + ha: 261, + o: 'm 118 514 b 127 517 121 517 122 517 b 147 505 136 517 142 513 l 148 502 l 148 403 b 148 306 148 351 148 306 b 174 315 149 306 160 310 l 200 324 l 205 323 b 223 312 213 323 220 319 l 225 308 l 225 260 b 225 245 225 255 225 249 b 220 204 225 208 224 209 b 179 188 216 199 215 199 l 148 177 l 148 124 l 148 70 l 189 84 b 236 98 219 94 230 98 b 247 94 240 98 243 97 b 255 52 254 88 255 87 b 255 33 255 47 255 40 l 254 -12 l 253 -15 b 249 -22 253 -18 250 -20 l 245 -24 l 196 -41 l 148 -58 l 148 -108 b 148 -158 148 -136 148 -158 b 174 -148 148 -158 160 -154 b 204 -140 198 -140 200 -140 l 204 -140 b 224 -152 213 -140 221 -145 b 225 -201 224 -155 225 -177 b 224 -254 225 -226 224 -251 b 157 -284 220 -262 220 -262 l 148 -288 l 148 -395 l 148 -503 l 147 -506 b 127 -519 142 -514 134 -519 b 107 -506 119 -519 111 -514 l 106 -503 l 106 -403 b 106 -303 106 -316 106 -303 b 104 -303 104 -303 104 -303 b 88 -310 104 -303 96 -306 l 63 -319 b 51 -322 59 -320 55 -322 b 36 -315 46 -322 40 -319 b 31 -273 32 -309 31 -312 b 31 -258 31 -269 31 -263 l 31 -210 l 34 -206 b 40 -198 35 -204 38 -199 b 74 -186 42 -197 57 -191 l 106 -173 l 106 -123 b 106 -97 106 -112 106 -104 b 106 -72 106 -76 106 -72 b 104 -72 106 -72 106 -72 b 20 -99 89 -79 23 -99 b 0 -84 10 -99 2 -93 b -1 -37 0 -81 -1 -59 b 0 11 -1 -15 0 9 b 58 40 4 22 2 22 l 106 56 l 106 109 b 106 123 106 115 106 119 b 106 162 106 147 106 162 b 81 155 106 162 93 159 b 50 147 65 149 55 147 b 36 152 43 147 40 148 b 31 194 32 158 31 156 b 31 209 31 198 31 204 l 31 256 l 34 260 b 76 281 38 269 38 269 l 106 292 l 106 396 l 106 502 l 107 505 b 118 514 110 509 114 513 ', + }, + articAccentAbove: { + x_min: -348.4375, + x_max: 24.5, + ha: 25, + o: 'm -330 155 b -322 156 -329 156 -326 156 b -315 156 -319 156 -317 156 b -298 147 -311 155 -308 154 b -19 30 -224 98 -122 55 l 2 26 b 24 -1 17 22 24 13 b 2 -27 24 -15 17 -23 l -19 -31 b -298 -148 -122 -56 -224 -99 b -322 -158 -313 -158 -315 -158 b -348 -131 -338 -158 -348 -145 b -344 -117 -348 -127 -347 -122 b -328 -104 -341 -112 -338 -111 b -127 -8 -269 -65 -202 -33 b -106 0 -115 -4 -106 -1 b -127 6 -106 0 -115 2 b -328 102 -202 31 -269 63 b -344 116 -338 109 -341 111 b -348 130 -347 120 -348 124 b -330 155 -348 141 -341 152 ', + }, + articAccentBelow: { + x_min: -348.4375, + x_max: 24.5, + ha: 25, + o: 'm -330 155 b -322 156 -329 156 -326 156 b -315 156 -319 156 -317 156 b -298 147 -311 155 -308 154 b -19 30 -224 98 -122 55 l 2 26 b 24 -1 17 22 24 13 b 2 -27 24 -15 17 -23 l -19 -31 b -298 -148 -122 -56 -224 -99 b -322 -158 -313 -158 -315 -158 b -348 -131 -338 -158 -348 -145 b -344 -117 -348 -127 -347 -122 b -328 -104 -341 -112 -338 -111 b -127 -8 -269 -65 -202 -33 b -106 0 -115 -4 -106 -1 b -127 6 -106 0 -115 2 b -328 102 -202 31 -269 63 b -344 116 -338 109 -341 111 b -348 130 -347 120 -348 124 b -330 155 -348 141 -341 152 ', + }, + articTenutoAbove: { + x_min: 0, + x_max: 318.5, + ha: 325, + o: 'm 20 376 b 167 377 23 377 96 377 b 296 376 231 377 294 377 b 318 347 311 371 318 359 b 296 316 318 333 311 320 b 159 315 294 315 227 315 b 21 316 91 315 24 315 b 0 345 6 320 0 333 b 20 376 0 359 6 371 ', + }, + articTenutoBelow: { + x_min: 0, + x_max: 318.5, + ha: 325, + o: 'm 20 376 b 167 377 23 377 96 377 b 296 376 231 377 294 377 b 318 347 311 371 318 359 b 296 316 318 333 311 320 b 159 315 294 315 227 315 b 21 316 91 315 24 315 b 0 345 6 320 0 333 b 20 376 0 359 6 371 ', + }, + articStaccatoAbove: { + x_min: 0, + x_max: 133.390625, + ha: 136, + o: 'm 54 66 b 65 68 58 68 61 68 b 122 37 88 68 110 56 b 133 -1 130 26 133 12 b 104 -58 133 -23 123 -44 b 66 -69 92 -65 78 -69 b 10 -38 44 -69 23 -58 b 0 -1 2 -27 0 -13 b 54 66 0 30 20 61 ', + }, + articStaccatoBelow: { + x_min: 0, + x_max: 133.390625, + ha: 136, + o: 'm 54 66 b 65 68 58 68 61 68 b 122 37 88 68 110 56 b 133 -1 130 26 133 12 b 104 -58 133 -23 123 -44 b 66 -69 92 -65 78 -69 b 10 -38 44 -69 23 -58 b 0 -1 2 -27 0 -13 b 54 66 0 30 20 61 ', + }, + articStaccatissimoAbove: { + x_min: -73.5, + x_max: 72.140625, + ha: 74, + o: 'm -72 252 l -73 254 l 0 254 l 72 254 l 70 252 b 0 -1 70 248 0 -1 b -72 252 -1 -1 -72 248 ', + }, + articStaccatissimoBelow: { + x_min: -73.5, + x_max: 72.140625, + ha: 74, + o: 'm -72 252 l -73 254 l 0 254 l 72 254 l 70 252 b 0 -1 70 248 0 -1 b -72 252 -1 -1 -72 248 ', + }, + articMarcatoAbove: { + x_min: -149.71875, + x_max: 148.359375, + ha: 151, + o: 'm -8 -1 b -1 0 -5 -1 -4 0 b 16 -11 5 0 13 -4 b 83 -186 17 -12 47 -90 l 148 -358 l 148 -363 b 127 -385 148 -376 138 -385 b 112 -378 122 -385 118 -383 b 54 -226 110 -374 114 -385 b 0 -81 24 -147 0 -81 b -55 -226 -1 -81 -25 -147 b -114 -378 -115 -385 -111 -374 b -129 -385 -119 -383 -123 -385 b -149 -363 -140 -385 -149 -376 l -149 -358 l -84 -186 b -19 -11 -49 -90 -19 -12 b -8 -1 -17 -8 -12 -4 ', + }, + articMarcatoBelow: { + x_min: -149.71875, + x_max: 148.359375, + ha: 151, + o: 'm -8 -1 b -1 0 -5 -1 -4 0 b 16 -11 5 0 13 -4 b 83 -186 17 -12 47 -90 l 148 -358 l 148 -363 b 127 -385 148 -376 138 -385 b 112 -378 122 -385 118 -383 b 54 -226 110 -374 114 -385 b 0 -81 24 -147 0 -81 b -55 -226 -1 -81 -25 -147 b -114 -378 -115 -385 -111 -374 b -129 -385 -119 -383 -123 -385 b -149 -363 -140 -385 -149 -376 l -149 -358 l -84 -186 b -19 -11 -49 -90 -19 -12 b -8 -1 -17 -8 -12 -4 ', + }, + fermataAbove: { + x_min: -442.359375, + x_max: 441, + ha: 450, + o: 'm -31 487 b -1 488 -21 488 -10 488 b 434 104 216 488 397 330 b 441 27 438 79 441 47 b 439 12 441 20 439 15 b 419 0 435 4 427 0 b 404 5 413 0 408 1 b 398 30 400 11 398 13 b 0 351 390 213 213 351 b -59 348 -20 351 -39 349 b -400 30 -251 324 -393 191 b -405 5 -400 13 -401 11 b -420 0 -409 1 -415 0 b -441 12 -428 0 -436 4 b -442 27 -441 15 -442 20 b -435 104 -442 47 -439 79 b -31 487 -401 316 -235 474 m -13 131 b -1 133 -9 133 -5 133 b 51 105 19 133 39 123 b 61 70 58 95 61 83 b 51 34 61 58 58 45 b -1 6 39 16 19 6 b -46 27 -17 6 -34 13 b -62 69 -57 38 -62 54 b -13 131 -62 98 -44 124 ', + }, + fermataBelow: { + x_min: -441, + x_max: 439.640625, + ha: 449, + o: 'm -428 -2 b -421 0 -427 -1 -424 0 b -406 -6 -416 0 -409 -2 b -400 -31 -401 -12 -400 -15 b -1 -352 -392 -215 -215 -352 b 58 -349 19 -352 38 -351 b 398 -31 250 -326 392 -192 b 404 -6 398 -15 400 -12 b 419 -1 408 -2 413 -1 b 439 -13 427 -1 435 -5 b 439 -29 439 -16 439 -22 b 434 -105 439 -48 438 -80 b 0 -489 397 -333 213 -489 b -68 -484 -23 -489 -44 -488 b -441 -36 -280 -452 -436 -263 b -441 -30 -441 -34 -441 -31 b -428 -2 -441 -11 -439 -5 m -13 -9 b -1 -8 -9 -8 -5 -8 b 50 -36 19 -8 39 -19 b 61 -72 57 -47 61 -59 b 50 -106 61 -84 57 -97 b -1 -134 39 -124 19 -134 b -46 -115 -17 -134 -34 -129 b -62 -72 -57 -102 -62 -87 b -13 -9 -62 -44 -44 -16 ', + }, + breathMarkComma: { + x_min: -1.359375, + x_max: 193.28125, + ha: 197, + o: 'm 78 233 b 87 233 81 233 84 233 b 187 140 132 233 174 195 b 193 102 190 127 193 115 b 43 -113 193 22 136 -62 b 27 -119 36 -116 31 -119 b 19 -108 21 -119 19 -115 b 29 -97 19 -102 20 -101 b 102 13 73 -72 102 -27 b 92 51 102 26 98 40 l 91 54 l 84 54 b 8 104 53 54 21 74 b -1 142 1 116 -1 130 b 78 233 -1 187 31 227 ', + }, + breathMarkUpbow: { + x_min: -170.140625, + x_max: 168.78125, + ha: 172, + o: 'm -160 567 b -122 567 -159 567 -149 567 l -87 567 l -84 566 b -74 553 -78 563 -77 560 b -20 366 -73 551 -49 466 b 31 186 8 267 31 186 b 85 371 31 186 55 269 b 140 559 114 473 138 557 b 153 567 141 564 148 567 b 168 559 159 567 166 564 b 168 555 168 557 168 557 b 92 281 168 548 159 513 b 14 13 50 134 14 13 b 0 0 14 6 6 0 b -17 15 -8 0 -17 8 b -93 283 -17 15 -51 136 b -170 552 -166 533 -170 548 b -170 553 -170 552 -170 552 b -160 567 -170 560 -167 564 ', + }, + caesura: { + x_min: 0, + x_max: 622.03125, + ha: 635, + o: 'm 398 417 b 406 419 401 419 404 419 b 427 398 417 419 427 409 b 427 391 427 395 427 392 b 34 -274 424 385 38 -272 b 20 -280 29 -278 25 -280 b 0 -259 9 -280 0 -270 b 0 -252 0 -256 0 -254 b 393 413 2 -247 389 410 b 398 417 394 415 397 416 m 592 417 b 600 419 594 419 597 419 b 622 398 611 419 622 409 b 620 391 622 395 620 392 b 227 -274 617 385 231 -272 b 213 -280 223 -278 219 -280 b 193 -259 202 -280 193 -270 b 194 -252 193 -256 193 -254 b 586 413 196 -247 582 410 b 592 417 588 415 590 416 ', + }, + caesuraCurved: { + x_min: 0, + x_max: 503.609375, + ha: 514, + o: 'm 274 430 b 277 430 276 430 277 430 b 310 394 296 430 310 415 b 308 383 310 391 308 387 b 306 367 307 381 307 374 b 236 120 298 305 272 210 b 40 -273 189 -5 125 -134 b 20 -287 35 -283 27 -287 b 5 -281 14 -287 9 -285 b 0 -267 1 -277 0 -273 b 9 -242 0 -262 2 -255 b 246 395 137 -12 232 242 b 274 430 249 416 257 427 m 468 430 b 472 430 469 430 470 430 b 503 394 490 430 503 415 b 502 383 503 391 503 387 b 499 367 502 381 500 374 b 431 120 491 305 465 210 b 234 -273 382 -5 318 -134 b 213 -287 228 -283 220 -287 b 198 -281 208 -287 202 -285 b 193 -267 194 -277 193 -273 b 202 -242 193 -262 196 -255 b 439 395 330 -12 426 242 b 468 430 442 416 451 427 ', + }, + restMaxima: { + x_min: 0, + x_max: 464.140625, + ha: 474, + o: 'm 0 0 l 0 347 l 76 347 l 153 347 l 153 0 l 153 -348 l 76 -348 l 0 -348 l 0 0 m 308 -1 l 308 347 l 386 347 l 464 347 l 464 -1 l 464 -348 l 386 -348 l 308 -348 l 308 -1 ', + }, + restDoubleWhole: { + x_min: 0, + x_max: 386.5625, + ha: 394, + o: 'm 0 173 l 0 347 l 193 347 l 386 347 l 386 173 l 386 0 l 193 0 l 0 0 l 0 173 ', + }, + restWhole: { + x_min: 0, + x_max: 447.8125, + ha: 457, + o: 'm 0 -87 l 0 0 l 223 0 l 447 0 l 447 -87 l 447 -174 l 223 -174 l 0 -174 l 0 -87 ', + }, + restHalf: { + x_min: 0, + x_max: 447.8125, + ha: 457, + o: 'm 0 86 l 0 173 l 223 173 l 447 173 l 447 86 l 447 0 l 223 0 l 0 0 l 0 86 ', + }, + restQuarter: { + x_min: 0, + x_max: 300.8125, + ha: 307, + o: 'm 49 505 b 53 506 50 505 51 506 b 70 496 58 506 62 503 b 81 485 73 492 78 488 l 96 473 l 111 459 l 122 449 l 134 438 l 182 396 l 255 330 b 292 291 292 298 292 298 l 292 290 l 292 284 l 283 270 b 209 36 234 197 209 113 b 288 -170 209 -44 235 -119 b 299 -184 295 -179 299 -181 b 300 -191 300 -187 300 -188 b 285 -206 300 -199 294 -206 b 280 -206 283 -206 281 -206 b 247 -201 270 -202 259 -201 b 176 -222 223 -201 197 -208 b 114 -340 136 -249 114 -292 b 172 -471 114 -384 134 -433 b 185 -492 182 -481 185 -487 b 181 -502 185 -496 183 -499 b 171 -508 176 -505 174 -508 b 152 -498 166 -508 160 -503 b 0 -284 65 -428 12 -352 b 0 -260 0 -278 0 -270 b 1 -238 0 -252 0 -242 b 148 -140 16 -177 73 -140 b 209 -148 167 -140 189 -142 b 215 -149 212 -148 215 -149 b 215 -149 215 -149 215 -149 l 215 -149 b 201 -136 215 -148 209 -142 l 157 -97 l 96 -41 b 17 34 21 24 17 29 b 17 37 17 36 17 36 b 17 38 17 37 17 38 b 25 56 17 44 17 44 b 110 298 81 131 110 219 b 46 474 110 367 88 431 b 38 491 40 480 38 487 b 49 505 38 498 42 502 ', + }, + rest8th: { + x_min: 0, + x_max: 349.8125, + ha: 357, + o: 'm 88 302 b 103 303 93 302 98 303 b 202 224 149 303 191 270 b 205 199 204 216 205 208 b 178 129 205 173 196 147 l 175 126 l 182 127 b 307 249 236 142 284 190 b 313 259 308 254 311 258 b 329 267 317 265 323 267 b 349 247 340 267 349 259 b 201 -263 349 242 204 -258 b 182 -273 197 -270 190 -273 b 163 -260 174 -273 166 -269 b 161 -256 161 -259 161 -258 b 217 -59 161 -248 170 -220 b 272 129 247 43 272 127 b 272 129 272 129 272 129 b 264 122 272 129 268 126 b 140 80 227 94 183 80 b 36 115 102 80 65 91 b 0 194 10 136 0 165 b 88 302 0 244 32 292 ', + }, + rest16th: { + x_min: 0, + x_max: 450.53125, + ha: 460, + o: 'm 189 302 b 204 303 193 302 198 303 b 303 224 250 303 292 270 b 306 199 304 216 306 208 b 279 129 306 173 296 147 l 276 126 l 281 127 b 408 249 337 142 385 190 b 412 259 409 254 412 258 b 430 267 417 265 423 267 b 450 247 441 267 450 259 b 200 -605 450 242 204 -599 b 182 -616 197 -612 190 -616 b 163 -602 174 -616 166 -610 b 161 -598 161 -601 161 -601 b 217 -402 161 -589 170 -562 b 272 -213 247 -298 272 -213 b 272 -213 272 -213 272 -213 b 264 -219 272 -213 268 -216 b 140 -262 227 -247 182 -262 b 36 -226 102 -262 65 -249 b 0 -145 12 -206 0 -176 b 17 -84 0 -124 5 -104 b 103 -38 38 -54 70 -38 b 191 -91 137 -38 172 -56 b 205 -141 201 -106 205 -124 b 178 -212 205 -167 196 -194 l 175 -215 l 182 -213 b 307 -93 236 -198 284 -151 b 372 129 308 -88 372 127 b 372 129 372 129 372 129 b 364 122 372 129 368 126 b 240 80 328 94 283 80 b 137 115 202 80 166 91 b 99 194 111 136 99 165 b 189 302 99 244 133 292 ', + }, + rest32nd: { + x_min: 0, + x_max: 551.25, + ha: 563, + o: 'm 289 644 b 304 645 294 645 299 645 b 404 566 349 645 392 613 b 406 541 405 557 406 549 b 379 471 406 514 397 489 l 377 467 l 382 470 b 509 591 438 485 485 531 b 513 601 510 595 513 599 b 530 609 518 607 524 609 b 551 588 540 609 551 602 b 200 -605 551 584 204 -599 b 182 -616 197 -612 190 -616 b 163 -602 174 -616 166 -610 b 161 -598 161 -601 161 -601 b 217 -402 161 -589 170 -562 b 272 -213 247 -298 272 -213 b 272 -213 272 -213 272 -213 b 264 -219 272 -213 268 -216 b 140 -262 227 -247 182 -262 b 36 -226 102 -262 65 -249 b 0 -145 12 -206 0 -176 b 17 -84 0 -124 5 -104 b 103 -38 38 -54 70 -38 b 191 -91 137 -38 172 -56 b 205 -141 201 -106 205 -124 b 178 -212 205 -167 196 -194 l 175 -215 l 182 -213 b 307 -93 236 -198 284 -151 b 372 129 308 -88 372 127 b 372 129 372 129 372 129 b 364 122 372 129 368 126 b 240 80 328 94 283 80 b 137 115 202 80 166 91 b 99 195 112 136 99 165 b 118 256 99 217 106 238 b 204 303 138 287 171 303 b 292 249 238 303 273 285 b 306 199 302 234 306 217 b 279 129 306 173 296 148 l 276 126 l 281 127 b 408 248 336 142 385 190 b 473 470 409 254 473 469 b 473 470 473 470 473 470 b 465 464 473 470 469 467 b 341 421 428 435 383 421 b 236 458 303 421 266 433 b 200 537 212 478 200 508 b 289 644 200 585 234 635 ', + }, + rest64th: { + x_min: -1.359375, + x_max: 651.96875, + ha: 665, + o: 'm 389 644 b 405 645 394 645 400 645 b 504 566 450 645 492 613 b 507 541 506 557 507 549 b 480 471 507 514 498 489 l 477 467 l 483 470 b 609 591 539 485 586 531 b 613 601 611 595 613 599 b 631 609 619 607 624 609 b 651 588 641 609 651 602 b 200 -946 651 584 204 -941 b 182 -957 197 -953 190 -957 b 163 -945 174 -957 166 -953 b 161 -939 161 -942 161 -942 b 217 -743 161 -931 170 -904 b 272 -555 247 -639 272 -555 b 272 -555 272 -555 272 -555 b 264 -560 272 -555 268 -557 b 140 -603 227 -589 182 -603 b 36 -567 102 -603 65 -592 b -1 -487 12 -548 -1 -517 b 17 -427 -1 -466 5 -445 b 103 -380 38 -395 70 -380 b 191 -433 137 -380 172 -398 b 205 -484 201 -448 205 -466 b 178 -553 205 -509 196 -535 l 175 -557 l 182 -555 b 307 -435 236 -539 284 -494 b 372 -213 308 -430 372 -215 b 372 -213 372 -213 372 -213 b 364 -219 372 -213 368 -216 b 240 -262 328 -247 283 -262 b 137 -226 202 -262 166 -249 b 99 -145 112 -206 99 -176 b 118 -84 99 -124 106 -104 b 204 -38 138 -54 171 -38 b 292 -91 238 -38 273 -56 b 306 -141 302 -106 306 -124 b 279 -212 306 -167 296 -194 l 276 -215 l 281 -213 b 408 -93 336 -198 385 -151 b 473 129 409 -88 473 127 b 473 129 473 129 473 129 b 465 122 473 129 469 126 b 341 80 428 94 383 80 b 236 115 303 80 266 91 b 200 195 213 136 200 165 b 217 256 200 217 206 238 b 304 303 239 287 272 303 b 393 249 338 303 374 285 b 406 199 402 234 406 217 b 379 129 406 173 397 148 l 377 126 l 382 127 b 509 248 436 142 485 190 b 574 470 510 254 574 469 b 574 470 574 470 574 470 b 566 464 574 470 570 467 b 442 421 529 435 484 421 b 337 458 404 421 367 433 b 300 537 313 478 300 508 b 389 644 300 585 334 635 ', + }, + rest128th: { + x_min: -1.359375, + x_max: 752.703125, + ha: 768, + o: 'm 490 985 b 504 986 495 986 500 986 b 604 907 551 986 593 954 b 607 884 607 900 607 892 b 581 813 607 857 597 831 l 578 810 l 583 811 b 710 932 638 827 687 873 b 714 943 711 936 713 942 b 730 952 720 949 725 952 b 752 931 741 952 752 943 b 200 -946 752 927 204 -941 b 182 -957 197 -953 190 -957 b 163 -945 174 -957 166 -953 b 161 -939 161 -942 161 -942 b 217 -743 161 -931 170 -904 b 272 -555 247 -639 272 -555 b 272 -555 272 -555 272 -555 b 264 -560 272 -555 268 -557 b 140 -603 227 -589 182 -603 b 36 -567 102 -603 65 -592 b -1 -487 12 -548 -1 -517 b 17 -427 -1 -466 5 -445 b 103 -380 38 -395 70 -380 b 191 -433 137 -380 172 -398 b 205 -484 201 -448 205 -466 b 178 -553 205 -509 196 -535 l 175 -557 l 182 -555 b 307 -435 236 -539 284 -494 b 372 -213 308 -430 372 -215 b 372 -213 372 -213 372 -213 b 364 -219 372 -213 368 -216 b 240 -262 328 -247 283 -262 b 137 -226 202 -262 166 -249 b 99 -145 112 -206 99 -176 b 118 -84 99 -124 106 -104 b 204 -38 138 -54 171 -38 b 292 -91 238 -38 273 -56 b 306 -141 302 -106 306 -124 b 279 -212 306 -167 296 -194 l 276 -215 l 281 -213 b 408 -93 336 -198 385 -151 b 473 129 409 -88 473 127 b 473 129 473 129 473 129 b 465 122 473 129 469 126 b 341 80 428 94 383 80 b 236 115 303 80 266 91 b 200 195 213 136 200 165 b 217 256 200 217 206 238 b 304 303 239 287 272 303 b 393 249 338 303 374 285 b 406 199 402 234 406 217 b 379 129 406 173 397 148 l 377 126 l 382 127 b 509 248 436 142 485 190 b 574 470 510 254 574 469 b 574 470 574 470 574 470 b 566 464 574 470 570 467 b 442 421 529 435 484 421 b 337 458 404 421 367 433 b 300 538 314 477 300 508 b 318 598 300 559 306 580 b 404 645 340 630 372 645 b 494 592 439 645 475 627 b 507 541 502 577 507 559 b 480 471 507 516 498 489 l 477 467 l 483 470 b 608 589 537 485 586 531 b 675 811 611 595 675 810 b 675 811 675 811 675 811 b 666 806 675 811 671 809 b 543 763 628 777 585 763 b 438 799 504 763 468 775 b 401 878 412 820 401 849 b 490 985 401 928 434 977 ', + }, + dynamicPiano: { + x_min: -53.078125, + x_max: 513.140625, + ha: 485, + o: 'm 185 383 b 196 384 187 383 191 384 b 277 334 230 384 259 365 b 288 301 281 324 288 306 b 288 297 288 298 288 297 b 294 302 289 297 291 299 b 394 370 323 338 367 367 b 404 371 398 370 401 371 b 510 272 453 371 498 328 b 513 237 513 262 513 251 b 507 172 513 217 511 192 b 326 -34 487 59 412 -26 b 314 -36 322 -36 318 -36 b 274 -24 298 -36 283 -31 l 265 -16 b 224 44 246 -1 232 20 b 223 49 224 47 223 49 b 223 49 223 49 223 49 b 149 -197 221 48 149 -194 b 149 -198 149 -197 149 -198 b 170 -210 149 -202 155 -205 b 187 -215 174 -210 175 -212 b 204 -231 201 -219 204 -222 b 197 -245 204 -240 202 -242 l 194 -248 l 76 -248 l -42 -248 l -46 -245 b -53 -231 -51 -242 -53 -240 b -35 -215 -53 -222 -49 -217 b -13 -210 -21 -212 -20 -212 b -6 -208 -10 -209 -8 -208 b 0 -206 -6 -208 -2 -206 b 25 -188 13 -201 21 -195 b 163 280 28 -183 163 276 b 166 291 163 283 164 287 b 167 302 167 295 167 299 b 155 324 167 315 161 324 b 155 324 155 324 155 324 b 65 230 125 322 85 280 b 53 215 61 217 58 215 b 51 215 53 215 51 215 b 42 224 46 215 42 217 b 57 263 42 231 47 244 b 140 360 77 305 104 337 b 152 370 144 365 149 369 b 185 383 157 376 172 381 m 374 306 b 366 308 371 308 368 308 b 300 273 348 308 321 294 b 284 254 288 262 287 259 b 280 242 283 249 281 245 b 257 169 279 240 270 213 l 236 98 l 236 93 b 251 48 238 77 243 61 b 279 27 258 37 272 27 b 281 27 279 27 280 27 b 291 31 281 27 287 30 b 396 170 334 52 378 109 b 406 247 402 197 406 224 b 401 277 406 259 405 270 b 374 306 397 290 383 303 ', + }, + dynamicMezzo: { + x_min: 46.28125, + x_max: 669.671875, + ha: 563, + o: 'm 183 376 b 189 376 185 376 187 376 b 212 374 197 376 208 376 b 265 337 234 369 253 355 b 274 317 268 331 273 320 b 274 316 274 317 274 316 b 280 323 276 316 276 319 b 311 358 288 337 299 348 b 319 366 315 360 318 365 b 356 376 326 373 340 376 b 382 371 364 376 374 374 b 428 337 400 366 417 352 b 436 317 431 331 436 320 b 438 316 436 317 436 316 b 442 323 438 316 439 319 b 475 358 451 337 462 348 b 483 366 477 360 481 365 b 518 376 488 373 503 376 b 544 373 528 376 536 376 b 604 285 579 360 604 326 b 597 249 604 273 601 258 b 543 63 596 247 544 70 b 541 54 543 61 541 55 b 540 44 540 51 540 47 b 552 23 540 33 545 23 b 552 23 552 23 552 23 b 647 126 586 29 627 72 b 658 138 651 136 653 138 b 660 138 660 138 660 138 b 669 129 666 137 669 136 b 654 88 669 122 665 109 b 562 -12 631 43 602 9 l 549 -19 b 521 -27 540 -24 530 -27 b 447 30 490 -27 458 -4 b 443 58 445 38 443 48 b 450 93 443 72 446 84 b 504 278 453 97 504 272 b 507 288 506 283 506 287 b 509 298 507 292 509 295 b 491 326 509 310 502 320 b 487 327 490 327 488 327 b 479 324 484 327 483 326 b 441 270 462 316 443 288 b 435 249 441 265 436 254 b 398 127 434 248 419 195 b 362 4 379 61 362 5 b 328 -1 359 -1 362 -1 b 314 -1 323 -1 319 -1 b 302 -1 310 -1 306 -1 b 266 4 266 -1 269 -1 b 265 6 265 5 265 5 b 303 144 265 13 272 34 b 343 278 325 216 343 276 b 344 288 343 281 344 285 b 345 298 345 291 345 295 b 330 326 345 310 340 320 b 323 327 328 327 325 327 b 317 324 322 327 321 326 b 279 270 300 316 281 288 b 273 249 279 265 274 254 b 236 127 272 248 255 195 b 200 4 216 61 200 5 b 164 -1 197 -1 198 -1 b 151 -1 161 -1 156 -1 b 140 -1 147 -1 142 -1 b 103 4 104 -1 106 -1 b 103 6 103 5 103 5 b 141 144 103 13 108 34 b 181 278 161 216 179 276 b 182 288 181 281 181 285 b 183 298 182 291 183 295 b 168 324 183 310 178 320 b 160 327 166 326 163 327 b 141 320 156 327 151 324 b 69 230 112 305 85 272 b 57 215 65 217 62 215 b 55 215 57 215 55 215 b 46 224 49 215 46 217 b 59 260 46 231 50 242 b 151 363 81 306 112 341 b 161 369 155 365 160 367 b 183 376 166 371 174 374 ', + }, + dynamicForte: { + x_min: -118.421875, + x_max: 597.53125, + ha: 381, + o: 'm 460 574 b 464 574 461 574 462 574 b 488 574 470 574 481 574 b 500 573 491 574 498 574 b 594 503 543 570 588 538 b 597 488 596 498 597 494 b 528 417 597 449 564 417 b 502 423 519 417 510 419 b 465 481 477 434 465 458 b 488 528 465 499 472 516 b 490 530 490 530 490 530 b 490 530 490 530 490 530 b 468 517 488 530 475 523 b 349 340 419 485 377 420 b 347 330 348 334 347 330 b 383 328 347 328 363 328 b 428 326 423 328 424 328 b 442 302 438 320 442 312 b 430 281 442 294 438 285 b 385 276 424 277 426 276 l 377 276 l 332 276 l 330 269 b 178 -117 303 126 250 -9 b 1 -249 129 -194 69 -237 b -20 -251 -6 -251 -13 -251 b -114 -187 -65 -251 -100 -227 b -118 -156 -117 -177 -118 -166 b -51 -84 -118 -116 -91 -84 b -31 -87 -46 -84 -39 -86 b 16 -152 0 -95 16 -124 b -12 -205 16 -173 8 -194 b -16 -208 -14 -206 -16 -208 b -14 -208 -16 -208 -14 -208 b -9 -206 -14 -208 -12 -208 b 74 -124 23 -197 54 -166 b 172 224 98 -79 125 22 b 185 276 178 252 183 274 b 185 276 185 276 185 276 b 141 276 185 276 181 276 b 91 280 96 276 96 276 b 77 302 83 285 77 294 b 91 326 77 312 83 320 b 148 328 95 328 96 328 l 198 330 l 202 341 b 460 574 249 473 351 566 ', + }, + dynamicRinforzando: { + x_min: 78.9375, + x_max: 485.921875, + ha: 417, + o: 'm 362 378 b 378 380 367 380 372 380 b 472 348 415 380 453 367 b 485 315 481 338 485 327 b 462 273 485 298 477 281 b 439 267 454 269 446 267 b 398 290 424 267 409 274 b 344 319 385 309 364 319 b 281 269 315 319 289 301 b 279 262 280 266 279 262 b 276 256 279 260 277 258 b 274 249 276 254 274 251 b 238 127 273 248 257 192 b 201 4 217 61 201 5 b 166 -1 198 -1 200 -1 b 153 -1 163 -1 157 -1 b 141 -1 148 -1 144 -1 b 104 4 106 -1 107 -1 b 104 6 104 5 104 5 b 142 144 104 13 110 34 b 182 278 164 219 181 276 b 183 288 182 281 182 285 b 185 302 185 292 185 298 b 164 330 185 317 176 328 b 159 330 163 330 161 330 b 102 302 140 330 119 320 b 91 294 95 295 93 294 b 88 294 91 294 89 294 b 78 303 83 294 78 298 b 81 312 78 306 78 309 b 200 373 106 347 160 373 b 215 371 205 373 209 371 b 266 335 235 367 254 353 b 269 331 268 333 269 331 b 269 331 269 331 269 331 b 273 335 269 331 270 334 b 362 378 298 359 330 376 ', + }, + dynamicSforzando: { + x_min: 70.78125, + x_max: 378.390625, + ha: 315, + o: 'm 246 373 b 254 373 249 373 251 373 b 372 324 303 373 360 351 b 378 302 377 317 378 309 b 338 251 378 278 362 255 b 328 249 334 249 332 249 b 283 294 303 249 283 270 b 288 315 283 301 284 308 b 289 319 289 317 289 319 b 289 319 289 319 289 319 b 283 320 289 320 287 320 b 270 322 279 322 274 322 b 206 288 242 322 215 308 b 206 283 206 287 206 285 b 257 223 206 267 230 238 b 284 206 272 213 277 210 b 351 90 328 173 351 130 b 340 47 351 74 348 59 b 205 -30 314 -2 264 -30 b 182 -29 198 -30 190 -30 b 84 15 147 -24 103 -5 b 70 48 74 24 70 36 b 108 99 70 70 85 94 b 121 102 112 101 117 102 b 167 56 147 102 167 80 b 159 31 167 48 164 40 l 156 26 l 157 26 b 190 20 167 22 178 20 b 220 26 201 20 212 22 b 258 65 243 34 258 51 b 257 70 258 66 258 69 b 204 126 249 94 234 109 b 114 258 148 158 114 209 b 125 302 114 273 118 288 b 246 373 147 342 193 370 ', + }, + dynamicZ: { + x_min: 29.9375, + x_max: 420.578125, + ha: 371, + o: 'm 115 345 b 221 347 117 345 166 347 b 411 345 306 347 409 345 b 420 330 416 342 420 335 b 415 319 420 326 419 321 b 178 118 397 303 179 118 b 178 117 178 118 178 117 b 181 117 178 117 178 117 b 189 117 182 117 185 117 b 193 117 190 117 191 117 b 247 98 215 117 232 111 b 296 75 266 83 280 76 b 302 75 299 75 300 75 b 322 91 311 75 315 79 b 322 91 322 91 322 91 b 322 91 322 91 322 91 b 319 91 322 91 321 91 b 313 90 318 90 315 90 b 283 107 300 90 288 97 b 277 126 279 114 277 121 b 319 167 277 149 295 167 b 319 167 319 167 319 167 b 362 118 347 167 362 147 b 355 82 362 108 359 96 b 311 33 349 65 340 55 b 224 1 284 12 253 1 b 194 5 213 1 204 2 b 168 18 183 8 178 11 b 110 36 151 30 130 36 b 57 15 88 36 68 29 b 47 11 54 12 51 11 b 31 20 40 11 34 13 b 29 26 31 22 29 25 b 68 66 29 36 39 45 b 285 250 73 71 281 248 b 285 250 285 250 285 250 b 231 252 285 252 261 252 b 137 250 190 252 141 250 b 93 227 122 248 110 241 b 78 220 88 222 83 220 b 66 227 74 220 70 222 b 63 234 65 229 63 231 b 85 291 63 241 69 252 b 115 345 108 342 108 344 ', + }, + ornamentTrill: { + x_min: -340.28125, + x_max: 338.921875, + ha: 346, + o: 'm -32 520 b -29 521 -31 520 -31 521 b -23 519 -27 521 -24 520 b -20 513 -21 517 -20 516 b -21 506 -20 512 -20 509 b -31 474 -23 502 -27 488 l -53 402 l -66 352 l -68 349 l -57 349 b -32 351 -51 349 -40 351 b 123 370 19 352 74 359 b 137 371 127 370 133 371 b 170 356 152 371 164 366 b 171 355 170 355 170 355 b 216 366 174 355 183 358 b 280 378 268 377 266 377 b 287 378 283 378 284 378 b 332 349 307 378 322 369 b 338 319 336 341 338 330 b 332 301 338 310 336 302 b 242 280 329 299 246 280 b 242 280 242 280 242 280 b 235 288 236 280 235 283 b 235 292 235 290 235 291 b 236 302 236 297 236 299 b 220 337 236 316 230 330 l 216 340 l 210 335 b 159 276 189 322 172 301 b 118 149 152 265 156 274 b 81 34 84 36 85 36 b -8 13 78 33 -4 13 b -8 13 -8 13 -8 13 b -14 20 -12 15 -14 15 b -8 44 -14 24 -12 31 b -2 66 -5 55 -2 65 b -2 66 -2 66 -2 66 l -2 66 b -43 41 -2 66 -21 55 b -114 4 -98 8 -98 8 b -144 0 -123 0 -134 0 b -242 99 -197 0 -242 43 b -242 109 -242 102 -242 105 b -212 219 -240 122 -242 116 b -185 312 -197 270 -185 312 l -185 312 b -189 312 -185 312 -186 312 b -259 312 -200 312 -227 312 b -321 310 -291 312 -310 310 b -334 312 -330 310 -334 312 b -340 319 -338 313 -340 316 b -336 326 -340 322 -338 324 b -291 337 -334 326 -314 331 l -247 347 l -210 348 b -172 348 -190 348 -172 348 b -168 363 -172 348 -171 355 b -145 442 -151 424 -145 441 b -133 452 -144 444 -140 446 l -77 489 b -32 520 -53 506 -32 520 m 57 334 b 53 335 55 335 54 335 b 44 334 50 335 49 335 b -70 316 8 326 -28 320 b -78 309 -78 316 -78 316 b -108 202 -80 305 -88 274 b -141 81 -136 112 -141 93 b -140 74 -141 79 -141 77 b -117 49 -137 59 -127 49 b -107 52 -114 49 -110 51 b 16 127 -106 54 14 126 b 42 217 16 127 42 215 b 49 241 42 222 44 229 b 73 320 53 251 73 317 b 57 334 73 327 65 333 ', + }, + ornamentTurn: { + x_min: -423.3125, + x_max: 421.9375, + ha: 431, + o: 'm -262 197 b -247 197 -257 197 -253 197 b -118 162 -210 197 -163 184 b 40 45 -61 134 -13 98 b 277 -95 119 -33 200 -81 b 289 -97 281 -97 285 -97 b 378 0 332 -97 371 -55 b 378 11 378 4 378 6 b 302 83 378 55 345 83 b 242 66 283 83 262 77 b 208 56 231 59 219 56 b 148 120 175 56 148 81 b 201 186 148 151 164 172 b 261 198 220 194 240 198 b 420 45 341 198 411 136 b 421 22 421 37 421 29 b 245 -199 421 -93 338 -199 b 238 -198 243 -199 240 -199 b -44 -47 148 -194 50 -141 b -250 86 -114 22 -183 66 b -295 94 -270 91 -283 94 b -315 91 -302 94 -307 94 b -381 4 -356 81 -381 43 b -355 -56 -381 -18 -372 -40 b -298 -81 -338 -73 -319 -81 b -246 -68 -283 -81 -265 -77 b -212 -58 -234 -61 -223 -58 b -178 -69 -200 -58 -189 -62 b -151 -122 -160 -81 -151 -101 b -171 -167 -151 -138 -157 -155 b -239 -195 -185 -181 -213 -192 b -257 -197 -245 -197 -250 -197 b -423 -5 -352 -197 -423 -109 b -412 65 -423 16 -419 40 b -262 197 -389 137 -329 188 ', + }, + ornamentTurnSlash: { + x_min: -423.3125, + x_max: 421.9375, + ha: 431, + o: 'm -10 276 b -2 277 -8 277 -5 277 b 17 265 5 277 13 273 b 19 163 19 260 19 260 l 19 68 l 39 45 b 277 -95 122 -34 200 -81 b 289 -97 281 -97 285 -97 b 378 0 332 -97 371 -54 b 378 11 378 4 378 6 b 302 83 378 55 345 83 b 242 66 283 83 262 77 b 208 56 231 59 219 56 b 148 120 175 56 148 81 b 200 186 148 151 164 172 b 261 198 220 194 240 198 b 420 45 341 198 411 137 b 421 22 421 37 421 29 b 257 -198 421 -86 347 -188 b 242 -198 251 -198 247 -198 b 20 -105 181 -198 95 -163 l 19 -104 l 19 -183 b 19 -216 19 -195 19 -206 b 12 -273 19 -272 17 -267 b -2 -278 8 -277 2 -278 b -21 -266 -10 -278 -19 -274 b -23 -165 -23 -263 -23 -262 l -23 -69 l -44 -47 b -250 86 -117 23 -183 66 b -295 94 -270 93 -284 94 b -315 91 -302 94 -308 94 b -381 5 -356 81 -381 43 b -355 -56 -381 -16 -372 -40 b -299 -81 -338 -73 -319 -81 b -246 -68 -283 -81 -265 -77 b -212 -58 -234 -61 -223 -58 b -168 -77 -196 -58 -179 -65 b -151 -122 -156 -90 -151 -105 b -179 -174 -151 -141 -160 -162 b -239 -195 -194 -184 -217 -192 b -257 -197 -245 -195 -250 -197 b -423 -5 -349 -197 -423 -113 b -423 0 -423 -4 -423 -1 b -277 194 -420 97 -362 173 b -247 197 -268 197 -258 197 b -24 104 -185 197 -100 162 l -23 102 l -23 181 b -21 265 -23 260 -23 260 b -10 276 -20 269 -14 274 ', + }, + ornamentMordent: { + x_min: -402.890625, + x_max: 401.53125, + ha: 410, + o: 'm -10 273 b -4 274 -9 273 -6 274 b 16 262 4 274 12 269 b 17 158 17 259 17 259 l 17 56 l 62 112 b 117 174 110 172 110 172 b 122 174 118 174 119 174 b 132 173 125 174 129 173 b 295 11 134 172 171 134 l 307 -1 l 336 34 b 374 76 366 72 368 74 b 381 77 375 77 378 77 b 401 56 392 77 401 68 b 400 48 401 54 401 51 b 223 -172 397 41 230 -166 b 210 -176 220 -174 215 -176 b 201 -174 206 -176 204 -176 b 112 -87 198 -173 178 -152 b 27 0 65 -38 27 0 b 21 -6 27 0 24 -2 l 17 -12 l 17 -147 b 17 -210 17 -173 17 -194 b 10 -292 17 -297 16 -287 b -2 -299 6 -297 2 -299 b -21 -287 -10 -299 -19 -295 b -24 -174 -23 -284 -23 -284 l -24 -63 l -66 -117 b -121 -176 -110 -170 -114 -176 b -125 -176 -122 -176 -123 -176 b -296 -12 -134 -174 -125 -184 l -308 0 l -337 -34 b -375 -77 -367 -73 -370 -76 b -382 -79 -377 -79 -379 -79 b -402 -58 -393 -79 -402 -69 b -401 -49 -402 -55 -402 -52 b -224 170 -398 -43 -231 165 b -212 174 -221 173 -216 174 b -202 173 -208 174 -205 174 b -39 11 -200 172 -151 122 l -28 -1 l -25 1 l -24 4 l -24 130 b -23 260 -24 256 -24 258 b -10 273 -20 266 -16 270 ', + }, + ornamentShortTrill: { + x_min: -402.890625, + x_max: 401.53125, + ha: 410, + o: 'm -219 173 b -213 174 -217 174 -215 174 b -202 173 -209 174 -205 173 b -114 86 -200 172 -179 151 b -28 0 -66 37 -28 0 b 40 84 -28 0 2 37 b 117 174 111 173 110 172 b 122 174 118 174 119 174 b 132 173 125 174 129 173 b 295 11 134 172 171 134 l 307 -1 l 336 34 b 374 76 366 72 368 74 b 381 77 375 77 378 77 b 401 56 392 77 401 68 b 400 48 401 54 401 51 b 223 -172 397 41 230 -166 b 210 -176 220 -174 215 -176 b 201 -174 206 -176 204 -176 b 112 -87 198 -173 178 -152 b 27 0 65 -38 27 0 b -42 -86 27 0 -4 -38 b -118 -174 -112 -174 -111 -173 b -123 -176 -119 -176 -121 -176 b -133 -174 -126 -176 -130 -174 b -296 -12 -136 -173 -172 -137 l -308 0 l -337 -34 b -375 -77 -367 -73 -370 -76 b -382 -79 -377 -79 -379 -79 b -402 -58 -393 -79 -402 -69 b -401 -49 -402 -55 -402 -52 b -224 172 -398 -43 -228 167 b -219 173 -223 172 -220 173 ', + }, + ornamentTremblement: { + x_min: -571.671875, + x_max: 570.3125, + ha: 582, + o: 'm -386 173 b -381 174 -385 174 -383 174 b -370 173 -377 174 -372 173 b -281 86 -367 172 -347 151 b -196 0 -235 37 -196 0 b -126 84 -196 0 -164 37 b -50 174 -55 173 -57 172 b -44 174 -49 174 -47 174 b -35 173 -42 174 -38 173 b 53 86 -32 172 -12 151 b 138 0 100 37 138 0 b 208 84 140 0 170 37 b 284 174 279 173 277 172 b 289 174 285 174 288 174 b 299 173 294 174 298 173 b 462 11 303 172 338 134 l 475 -1 l 503 34 b 541 76 534 72 536 74 b 548 77 544 77 545 77 b 570 56 560 77 570 68 b 567 48 570 54 568 51 b 392 -172 564 41 397 -166 b 378 -176 387 -174 382 -176 b 368 -174 374 -176 371 -176 b 280 -87 367 -173 345 -152 b 194 0 234 -38 194 0 b 125 -86 194 0 163 -38 b 49 -174 54 -174 55 -173 b 43 -176 47 -176 46 -176 b 34 -174 40 -176 36 -174 b -54 -87 31 -173 10 -152 b -140 0 -102 -38 -140 0 b -209 -86 -141 0 -171 -38 b -285 -174 -280 -174 -279 -173 b -291 -176 -287 -176 -289 -176 b -300 -174 -295 -176 -299 -174 b -464 -12 -304 -173 -340 -137 l -476 0 l -504 -34 b -543 -77 -534 -73 -537 -76 b -549 -79 -545 -79 -547 -79 b -571 -58 -562 -79 -571 -69 b -568 -49 -571 -55 -570 -52 b -392 172 -566 -43 -396 167 b -386 173 -390 172 -387 173 ', + }, + ornamentPrecompAppoggTrill: { + x_min: -571.671875, + x_max: 570.3125, + ha: 582, + o: 'm -559 351 b -551 352 -556 352 -553 352 b -530 338 -543 352 -533 348 b -529 169 -530 337 -529 291 l -529 1 l -507 27 l -441 112 b -382 174 -394 169 -390 174 b -378 174 -381 174 -379 174 b -281 86 -370 174 -375 179 b -196 0 -234 37 -196 0 b -126 84 -196 0 -164 37 b -50 174 -55 173 -57 172 b -44 174 -49 174 -47 174 b -35 173 -42 174 -38 173 b 53 86 -32 172 -12 151 b 138 0 100 37 138 0 b 208 84 140 0 170 37 b 284 174 279 173 279 172 b 289 174 285 174 288 174 b 300 173 294 174 298 173 b 462 11 303 172 340 134 l 475 -1 l 503 34 b 541 76 534 72 536 74 b 548 77 544 77 545 77 b 570 56 560 77 570 68 b 567 48 570 54 568 51 b 392 -172 564 41 397 -166 b 378 -176 387 -174 382 -176 b 368 -174 375 -176 371 -176 b 280 -87 367 -173 347 -152 b 194 0 234 -38 194 0 b 126 -86 194 0 163 -38 b 49 -174 54 -174 55 -173 b 44 -176 47 -176 46 -176 b 34 -174 40 -176 36 -174 b -54 -87 31 -173 10 -152 b -140 0 -102 -38 -140 0 b -209 -86 -140 0 -171 -38 b -285 -174 -280 -174 -279 -173 b -291 -176 -287 -176 -288 -176 b -300 -174 -294 -176 -298 -174 b -464 -11 -303 -173 -374 -102 l -476 0 l -506 -37 b -539 -76 -528 -65 -537 -74 b -551 -80 -543 -79 -547 -80 b -570 -68 -558 -80 -566 -76 l -571 -65 l -571 136 b -570 340 -571 331 -571 337 b -559 351 -568 344 -564 348 ', + }, + ornamentPrecompSlideTrillDAnglebert: { + x_min: -590.71875, + x_max: 589.359375, + ha: 601, + o: 'm -367 173 b -362 174 -366 174 -364 174 b -351 173 -357 174 -353 173 b -262 86 -348 172 -328 151 b -176 0 -216 37 -176 0 b -107 84 -176 0 -145 37 b -31 174 -36 173 -38 172 b -25 174 -29 174 -28 174 b -16 173 -23 174 -19 173 b 72 86 -13 172 6 151 b 157 0 119 37 157 0 b 227 84 159 0 189 37 b 303 174 298 173 296 172 b 308 174 304 174 307 174 b 318 173 313 174 317 173 b 481 11 322 172 357 134 l 494 -1 l 522 34 b 560 76 553 72 555 74 b 567 77 563 77 564 77 b 589 56 579 77 589 68 b 586 48 589 54 588 51 b 411 -172 583 41 416 -166 b 397 -176 406 -174 401 -176 b 387 -174 393 -176 390 -176 b 299 -87 386 -173 366 -152 b 213 0 253 -38 213 0 b 144 -86 213 0 182 -38 b 68 -174 73 -174 74 -173 b 62 -176 66 -176 65 -176 b 53 -174 59 -176 55 -174 b -35 -87 50 -173 29 -152 b -121 0 -83 -38 -121 0 b -190 -86 -122 0 -152 -38 b -266 -174 -261 -174 -259 -173 b -272 -176 -268 -176 -270 -176 b -281 -174 -276 -176 -280 -174 b -371 -86 -284 -173 -304 -152 b -457 0 -417 -38 -457 0 l -457 0 b -477 -26 -457 0 -470 -16 b -548 -227 -524 -88 -548 -161 b -536 -303 -548 -254 -544 -280 b -533 -317 -534 -309 -533 -313 b -553 -338 -533 -330 -541 -338 b -577 -315 -566 -338 -571 -333 b -590 -227 -586 -287 -590 -258 b -518 -9 -590 -154 -564 -77 b -465 56 -509 2 -504 8 l -402 134 b -367 173 -375 169 -372 172 ', + }, + ornamentPrecompSlideTrillBach: { + x_min: -590.71875, + x_max: 589.359375, + ha: 601, + o: 'm 175 273 b 182 274 178 273 181 274 b 202 262 190 274 198 269 b 204 158 204 259 204 259 l 204 56 l 250 112 b 303 174 296 172 298 172 b 308 174 304 174 307 174 b 318 173 313 174 317 173 b 481 11 322 172 357 134 l 494 -1 l 522 34 b 560 76 553 72 555 74 b 567 77 563 77 564 77 b 589 56 579 77 589 68 b 586 48 589 54 588 51 b 411 -172 583 41 416 -166 b 397 -176 406 -174 401 -176 b 387 -174 393 -176 390 -176 b 299 -87 386 -173 366 -152 b 213 0 253 -38 213 0 b 208 -6 213 0 210 -2 l 204 -12 l 204 -147 b 204 -210 204 -173 204 -194 b 198 -292 204 -297 204 -287 b 183 -299 194 -297 189 -299 b 164 -287 175 -299 167 -295 b 163 -174 163 -284 163 -284 l 161 -63 l 119 -117 b 65 -176 76 -170 73 -176 b 61 -176 63 -176 62 -176 b -35 -87 51 -174 57 -180 b -121 0 -83 -38 -121 0 b -190 -86 -122 0 -152 -38 b -266 -174 -261 -174 -259 -173 b -272 -176 -268 -176 -270 -176 b -281 -174 -276 -176 -280 -174 b -371 -86 -284 -173 -304 -152 b -457 0 -417 -38 -457 0 l -457 0 b -477 -26 -457 0 -470 -16 b -548 -227 -524 -88 -548 -161 b -536 -303 -548 -254 -544 -280 b -533 -317 -534 -309 -533 -313 b -553 -338 -533 -330 -541 -338 b -577 -315 -566 -338 -571 -333 b -590 -227 -586 -287 -590 -258 b -518 -9 -590 -154 -564 -77 b -465 56 -509 2 -504 8 l -402 134 b -363 174 -374 170 -371 174 b -359 174 -362 174 -360 174 b -262 86 -351 174 -356 179 b -176 0 -216 37 -176 0 b -107 84 -176 0 -145 37 b -31 174 -36 173 -38 172 b -25 174 -29 174 -28 174 b -16 173 -23 174 -19 173 b 147 11 -13 172 35 123 l 157 -1 l 160 1 l 163 4 l 163 130 b 164 260 163 256 163 258 b 175 273 166 266 170 270 ', + }, + ornamentPrecompTrillSuffixDandrieu: { + x_min: -590.71875, + x_max: 589.359375, + ha: 601, + o: 'm 544 335 b 553 337 548 337 551 337 b 575 313 563 337 570 330 b 589 226 583 285 589 256 b 517 8 589 152 563 76 b 464 -58 507 -4 503 -9 l 401 -136 b 362 -176 372 -172 370 -176 b 357 -176 360 -176 359 -176 b 261 -87 349 -174 355 -180 b 175 0 215 -38 175 0 b 106 -86 175 0 144 -38 b 29 -174 35 -174 36 -173 b 24 -176 28 -176 27 -176 b 14 -174 21 -176 17 -174 b -73 -87 12 -173 -8 -152 b -159 0 -121 -38 -159 0 b -228 -86 -160 0 -190 -38 b -304 -174 -299 -174 -298 -173 b -310 -176 -306 -176 -308 -176 b -319 -174 -314 -176 -318 -174 b -483 -12 -323 -173 -359 -137 l -495 0 l -524 -34 b -562 -77 -553 -73 -556 -76 b -568 -79 -564 -79 -566 -79 b -590 -58 -581 -79 -590 -69 b -588 -49 -590 -55 -589 -52 b -412 170 -585 -43 -417 165 b -398 174 -408 173 -402 174 b -389 173 -394 174 -392 174 b -300 86 -387 172 -366 151 b -215 -1 -254 37 -215 -1 b -145 84 -215 -1 -183 37 b -69 173 -74 173 -76 172 b -63 174 -68 174 -66 174 b -54 173 -61 174 -57 173 b 34 86 -51 172 -31 151 b 119 -1 81 37 119 -1 b 189 84 121 -1 151 37 b 265 173 259 173 258 172 b 270 174 266 174 269 174 b 280 173 274 174 279 173 b 370 84 283 172 303 151 b 455 -1 416 37 455 -1 l 455 -1 b 476 24 455 -1 469 15 b 547 226 522 87 547 159 b 534 302 547 252 543 278 b 532 317 533 308 532 313 b 544 335 532 326 536 333 ', + }, + ornamentPrecompDoubleCadenceUpperPrefix: { + x_min: -597.53125, + x_max: 596.171875, + ha: 608, + o: 'm -533 324 b -525 327 -530 326 -528 327 b -504 305 -514 327 -504 317 b -504 305 -504 305 -504 305 b -513 284 -504 299 -504 299 b -556 112 -541 226 -556 167 b -545 33 -556 84 -552 58 b -524 -20 -541 15 -532 -9 l -522 -23 l -491 15 l -413 111 b -355 174 -367 169 -363 174 b -351 174 -353 174 -352 174 b -254 86 -343 174 -348 179 b -168 -1 -208 37 -168 -1 b -100 84 -168 -1 -137 37 b -23 173 -28 173 -29 172 b -19 174 -21 174 -20 174 b -8 173 -14 174 -10 173 b 80 86 -5 172 13 151 b 166 -1 127 37 166 -1 b 235 84 166 -1 197 37 b 311 173 306 173 304 172 b 317 174 313 174 314 174 b 326 173 319 174 323 173 b 490 11 329 172 366 134 l 502 -1 l 530 34 b 568 76 560 72 563 74 b 575 77 570 77 573 77 b 596 56 586 77 596 68 b 594 48 596 54 596 51 b 417 -172 592 41 424 -166 b 405 -176 415 -174 409 -176 b 396 -174 401 -176 398 -176 b 307 -87 393 -173 372 -152 b 221 -1 259 -38 221 -1 b 152 -86 221 -1 190 -38 b 76 -176 81 -174 83 -173 b 70 -176 74 -176 73 -176 b 61 -174 66 -176 62 -174 b -27 -87 58 -173 38 -152 b -114 -1 -74 -38 -112 -1 b -182 -86 -114 -1 -145 -38 b -258 -176 -253 -174 -253 -173 b -264 -176 -259 -176 -262 -176 b -274 -174 -268 -176 -272 -174 b -438 -11 -277 -173 -348 -102 l -449 0 l -479 -37 b -524 -80 -513 -80 -514 -80 l -524 -80 b -553 -52 -534 -80 -540 -74 b -597 109 -583 -8 -597 48 b -560 280 -597 165 -585 224 b -533 324 -548 310 -540 322 ', + }, + ornamentPrecompDoubleCadenceUpperPrefixTurn: { + x_min: -597.53125, + x_max: 596.171875, + ha: 608, + o: 'm -533 324 b -525 327 -530 326 -528 327 b -504 305 -514 327 -504 317 b -504 305 -504 305 -504 305 b -513 284 -504 299 -504 299 b -556 112 -541 226 -556 167 b -545 33 -556 84 -552 58 b -524 -20 -541 15 -532 -9 l -522 -23 l -491 15 l -413 111 b -355 174 -367 169 -363 174 b -351 174 -353 174 -352 174 b -254 86 -343 174 -348 179 b -168 -1 -208 37 -168 -1 b -100 84 -168 -1 -137 37 b -23 173 -28 173 -29 172 b -19 174 -21 174 -20 174 b -8 173 -14 174 -10 173 b 155 11 -5 172 43 123 l 166 -1 l 168 1 l 170 4 l 170 130 b 171 260 170 256 170 258 b 191 274 175 269 183 274 b 205 267 196 274 201 272 b 212 158 212 262 210 273 l 212 56 l 257 112 b 311 173 304 172 304 172 b 317 174 313 174 314 174 b 326 173 319 174 323 173 b 490 11 329 172 366 134 l 502 -1 l 530 34 b 568 76 560 72 563 74 b 575 77 570 77 573 77 b 596 56 586 77 596 68 b 594 48 596 54 596 51 b 417 -172 592 41 424 -166 b 405 -176 415 -174 409 -176 b 396 -174 401 -176 398 -176 b 307 -87 393 -173 372 -152 b 221 -1 259 -38 221 -1 b 216 -6 221 -1 219 -2 l 212 -12 l 212 -147 b 212 -210 212 -173 212 -194 b 205 -292 212 -297 210 -287 b 191 -299 201 -297 196 -299 b 172 -287 183 -299 175 -295 b 170 -174 171 -284 171 -284 l 170 -63 l 127 -117 b 73 -176 84 -170 80 -176 b 68 -176 72 -176 70 -176 b -27 -87 59 -174 65 -180 b -114 0 -74 -38 -112 0 b -182 -86 -114 0 -145 -38 b -258 -174 -253 -174 -253 -173 b -264 -176 -259 -176 -262 -176 b -274 -174 -268 -176 -272 -174 b -438 -11 -277 -173 -348 -102 l -449 0 l -479 -37 b -524 -80 -513 -80 -514 -80 l -524 -80 b -553 -52 -534 -80 -540 -74 b -597 109 -583 -8 -597 48 b -560 280 -597 165 -585 224 b -533 324 -548 310 -540 322 ', + }, + ornamentPrecompTrillLowerSuffix: { + x_min: -597.53125, + x_max: 596.171875, + ha: 608, + o: 'm -413 173 b -408 174 -412 174 -409 174 b -397 173 -404 174 -400 173 b -308 86 -394 172 -374 151 b -223 0 -261 37 -223 0 b -153 84 -223 0 -191 37 b -77 174 -83 173 -84 172 b -72 174 -76 174 -74 174 b -62 173 -68 174 -63 173 b 25 86 -59 172 -39 151 b 112 0 73 37 111 0 b 181 84 112 0 144 37 b 257 174 251 173 251 172 b 262 174 258 174 261 174 b 273 173 266 174 270 173 b 436 9 276 172 347 101 l 447 -1 l 477 36 b 522 79 511 79 513 79 l 522 79 b 552 51 533 79 539 73 b 596 -112 582 6 596 -51 b 567 -262 596 -161 586 -213 b 539 -322 558 -287 544 -316 b 524 -327 534 -326 529 -327 b 504 -315 515 -327 507 -323 b 503 -308 503 -312 503 -309 b 511 -285 503 -302 504 -297 b 555 -113 540 -227 555 -169 b 544 -34 555 -86 551 -59 b 522 19 540 -16 530 8 l 521 22 l 481 -26 l 405 -122 b 353 -176 366 -172 362 -176 b 349 -176 352 -176 351 -176 b 253 -87 341 -176 347 -180 b 167 0 206 -38 167 0 b 99 -86 167 0 136 -38 b 21 -174 27 -174 28 -173 b 17 -176 20 -176 19 -176 b 6 -174 13 -176 9 -174 b -81 -87 4 -173 -14 -152 b -167 0 -129 -38 -167 0 b -236 -86 -167 0 -198 -38 b -313 -174 -307 -174 -306 -173 b -318 -176 -314 -176 -315 -176 b -328 -174 -321 -176 -325 -174 b -491 -12 -330 -173 -367 -137 l -503 0 l -530 -34 b -570 -77 -562 -73 -564 -76 b -577 -79 -571 -79 -574 -79 b -597 -58 -588 -79 -597 -69 b -596 -49 -597 -55 -597 -52 b -417 172 -593 -43 -423 167 b -413 173 -417 172 -415 173 ', + }, + stringsDownBow: { + x_min: -149.71875, + x_max: 148.359375, + ha: 151, + o: 'm -9 215 b 0 217 -6 217 -4 217 b 19 205 8 217 14 213 b 20 142 20 202 20 201 l 20 84 l 23 84 b 144 -27 81 74 129 30 b 148 -66 147 -40 148 -54 b 36 -213 148 -134 103 -197 b 0 -219 24 -217 12 -219 b -145 -104 -68 -219 -129 -173 b -149 -68 -148 -91 -149 -79 b -24 84 -149 6 -98 74 l -21 84 l -21 142 b -19 205 -20 201 -20 202 b -9 215 -17 209 -13 213 m -21 -15 b -23 41 -21 37 -21 41 b -23 41 -23 41 -23 41 b -76 11 -35 40 -62 26 b -108 -65 -98 -11 -108 -38 b -1 -176 -108 -122 -65 -176 b 107 -65 63 -176 107 -122 b 74 11 107 -38 96 -11 b 20 41 61 26 32 41 b 20 -15 20 41 20 15 b 19 -74 20 -72 20 -72 b 0 -87 14 -83 6 -87 b -19 -74 -8 -87 -16 -83 b -21 -15 -20 -72 -20 -72 ', + }, + stringsUpBow: { + x_min: -149.71875, + x_max: 148.359375, + ha: 151, + o: 'm -137 381 b -130 383 -134 383 -133 383 b -111 371 -122 383 -114 378 b -55 224 -110 370 -85 305 b 0 80 -25 145 -1 80 b 54 224 0 80 24 145 b 112 377 114 384 110 373 b 127 384 118 381 122 384 b 148 362 138 384 148 374 l 148 356 l 83 183 b 16 9 47 88 17 11 b -1 0 12 2 5 0 b -14 5 -5 0 -10 1 b -84 183 -19 9 -13 -6 l -149 356 l -149 362 b -137 381 -149 371 -145 378 ', + }, + stringsHarmonic: { + x_min: -122.5, + x_max: 121.140625, + ha: 124, + o: 'm -16 145 b 0 147 -10 147 -5 147 b 121 -1 66 147 121 77 b 114 -49 121 -16 118 -33 b -1 -148 95 -112 47 -148 b -85 -106 -31 -148 -61 -134 b -122 -1 -110 -76 -122 -38 b -16 145 -122 68 -81 134 m 12 111 b 0 113 8 113 4 113 b -68 22 -29 113 -61 73 b -70 0 -69 15 -70 6 b -13 -113 -70 -49 -47 -98 b -1 -115 -9 -115 -5 -115 b 63 -40 24 -115 53 -83 b 68 -1 66 -27 68 -15 b 12 111 68 48 46 97 ', + }, + pluckedSnapPizzicatoAbove: { + x_min: -149.71875, + x_max: 148.359375, + ha: 151, + o: 'm -9 215 b 0 217 -6 217 -4 217 b 19 205 8 217 14 213 b 20 142 20 202 20 201 l 20 84 l 23 84 b 144 -27 81 74 129 30 b 148 -66 147 -40 148 -54 b 36 -213 148 -134 103 -197 b 0 -219 24 -217 12 -219 b -145 -104 -68 -219 -129 -173 b -149 -68 -148 -91 -149 -79 b -24 84 -149 6 -98 74 l -21 84 l -21 142 b -19 205 -20 201 -20 202 b -9 215 -17 209 -13 213 m -21 -15 b -23 41 -21 37 -21 41 b -23 41 -23 41 -23 41 b -76 11 -35 40 -62 26 b -108 -65 -98 -11 -108 -38 b -1 -176 -108 -122 -65 -176 b 107 -65 63 -176 107 -122 b 74 11 107 -38 96 -11 b 20 41 61 26 32 41 b 20 -15 20 41 20 15 b 19 -74 20 -72 20 -72 b 0 -87 14 -83 6 -87 b -19 -74 -8 -87 -16 -83 b -21 -15 -20 -72 -20 -72 ', + }, + pluckedSnapPizzicatoBelow: { + x_min: -149.71875, + x_max: 148.359375, + ha: 151, + o: 'm -9 215 b 0 217 -6 217 -4 217 b 19 205 8 217 14 213 b 20 142 20 202 20 201 l 20 84 l 23 84 b 144 -27 81 74 129 30 b 148 -66 147 -40 148 -54 b 36 -213 148 -134 103 -197 b 0 -219 24 -217 12 -219 b -145 -104 -68 -219 -129 -173 b -149 -68 -148 -91 -149 -79 b -24 84 -149 6 -98 74 l -21 84 l -21 142 b -19 205 -20 201 -20 202 b -9 215 -17 209 -13 213 m -21 -15 b -23 41 -21 37 -21 41 b -23 41 -23 41 -23 41 b -76 11 -35 40 -62 26 b -108 -65 -98 -11 -108 -38 b -1 -176 -108 -122 -65 -176 b 107 -65 63 -176 107 -122 b 74 11 107 -38 96 -11 b 20 41 61 26 32 41 b 20 -15 20 41 20 15 b 19 -74 20 -72 20 -72 b 0 -87 14 -83 6 -87 b -19 -74 -8 -87 -16 -83 b -21 -15 -20 -72 -20 -72 ', + }, + pluckedLeftHandPizzicato: { + x_min: 0, + x_max: 319.859375, + ha: 326, + o: 'm 149 508 b 159 509 152 509 155 509 b 186 494 170 509 181 503 b 190 440 190 487 190 488 l 190 430 l 190 377 l 242 377 l 251 377 b 303 373 298 377 296 377 b 319 345 314 367 319 356 b 304 319 319 335 314 324 b 250 315 296 315 299 315 l 242 315 l 190 315 l 190 262 l 190 252 b 186 198 190 204 190 205 b 159 183 179 188 170 183 b 132 198 148 183 138 188 b 127 252 127 205 127 204 l 127 262 l 127 315 l 76 315 l 68 315 b 14 319 20 315 21 315 b 0 347 4 324 0 335 b 14 373 0 356 4 367 b 68 377 21 377 20 377 l 76 377 l 127 377 l 127 430 l 127 440 b 132 494 127 488 127 487 b 149 508 136 501 142 505 ', + }, + keyboardPedalPed: { + x_min: -1.359375, + x_max: 1064.390625, + ha: 1086, + o: 'm 296 692 b 314 694 302 694 307 694 b 386 685 337 694 366 689 b 548 498 480 660 548 580 b 548 481 548 492 548 487 b 455 395 541 426 499 395 b 370 462 420 395 383 417 b 362 496 364 477 362 488 b 377 514 362 509 367 514 b 393 501 386 514 390 510 b 432 474 397 484 413 474 b 470 487 445 474 458 478 b 491 530 484 496 491 510 b 490 544 491 534 491 539 b 333 660 479 606 411 657 l 323 662 l 315 646 b 269 524 285 591 269 556 b 321 431 269 492 287 466 b 349 395 338 413 343 408 b 363 342 359 378 363 362 b 359 312 363 333 362 322 b 285 158 348 266 318 206 b 281 152 283 155 281 152 b 281 152 281 152 281 152 b 287 154 283 152 284 152 b 318 155 298 154 308 155 b 461 98 371 155 419 136 l 464 97 l 483 112 b 503 129 494 120 503 127 b 504 130 503 129 504 129 b 503 138 504 131 503 134 b 500 180 500 152 500 166 b 553 326 500 238 518 288 b 604 366 560 331 592 358 b 649 381 617 376 632 381 b 696 362 665 381 681 374 b 724 302 714 347 724 324 b 695 238 724 278 714 255 b 660 210 691 234 662 212 b 579 148 658 209 582 151 b 579 148 579 148 579 148 b 596 106 579 144 589 119 b 622 77 604 88 609 83 b 657 69 632 72 645 69 b 748 112 688 69 721 84 b 755 123 754 117 755 120 b 755 127 755 124 755 126 b 751 165 752 137 751 151 b 758 219 751 183 754 202 b 894 387 774 290 820 347 b 896 390 896 388 896 388 b 891 398 896 391 895 392 b 622 560 827 477 730 535 b 600 580 605 564 600 569 b 617 596 600 591 607 596 b 628 595 622 596 624 596 b 1057 248 846 552 1020 412 b 1064 191 1061 229 1064 209 b 922 0 1064 94 1005 9 b 902 -1 916 -1 909 -1 b 774 76 847 -1 800 26 b 769 83 770 81 770 83 b 769 81 769 83 769 83 b 627 -1 733 29 677 -1 b 548 27 597 -1 570 8 b 515 88 537 37 525 61 l 513 95 l 510 93 l 453 45 b 390 0 396 0 396 0 b 390 0 390 0 390 0 b 374 15 381 0 377 4 b 268 105 359 69 314 105 b 250 104 262 105 257 105 l 243 102 l 234 90 b 155 1 201 49 159 2 b 147 -1 152 0 149 -1 b 130 15 138 -1 130 6 b 132 20 130 18 132 19 b 136 31 133 22 134 27 b 220 131 149 74 178 109 b 231 137 225 134 230 136 b 302 278 280 202 302 244 b 265 335 302 299 295 309 b 209 442 234 363 213 402 b 209 455 209 446 209 451 b 279 648 209 502 232 564 l 285 659 l 283 659 b 176 627 238 653 210 645 b 57 477 111 594 66 538 b 55 459 55 471 55 464 b 72 409 55 437 61 415 b 93 403 78 405 87 403 b 152 467 123 403 151 431 b 168 488 153 483 157 488 b 185 462 181 488 185 483 l 185 460 b 137 344 183 409 168 369 b 78 322 119 328 98 322 b 13 360 50 322 25 335 b -1 426 4 380 -1 402 b 89 610 -1 488 32 559 b 296 692 147 659 210 685 m 926 348 b 921 353 924 351 922 353 b 914 348 920 353 918 351 b 823 167 857 306 823 237 b 828 124 823 154 826 138 b 890 31 837 79 862 40 b 896 31 892 31 894 31 b 956 104 916 31 940 59 b 970 191 965 129 970 159 b 966 241 970 208 969 224 b 926 348 959 277 945 313 m 627 326 b 619 326 624 326 622 326 b 598 316 611 326 604 323 b 568 215 579 288 568 255 b 568 208 568 213 568 210 b 571 183 570 195 570 184 l 571 183 b 594 201 571 183 582 191 l 634 231 b 660 259 653 247 656 248 b 664 278 662 266 664 272 b 627 326 664 299 649 320 ', + }, + keyboardPedalUp: { + x_min: -1.359375, + x_max: 592.078125, + ha: 604, + o: 'm 280 692 b 295 694 283 692 289 694 b 310 692 300 694 307 692 b 357 630 340 684 357 657 b 336 580 357 612 351 594 b 311 538 321 566 311 549 b 352 492 311 512 330 492 b 366 495 357 492 362 492 b 397 553 390 503 397 517 b 415 603 397 576 402 591 b 460 623 427 617 443 623 b 509 599 479 623 498 614 b 522 559 518 587 522 573 b 494 506 522 538 513 519 b 451 495 481 498 473 496 b 415 488 432 495 426 494 b 394 449 404 483 394 464 b 394 448 394 448 394 448 l 394 440 l 397 433 b 428 409 404 420 413 413 b 438 408 431 408 435 408 b 479 431 450 408 462 415 b 528 455 495 448 510 455 b 548 452 534 455 541 453 b 592 391 577 442 592 416 b 549 331 592 365 577 340 b 528 327 541 328 534 327 b 479 351 510 327 495 335 b 438 374 464 367 450 374 b 417 369 431 374 424 373 b 394 333 402 360 394 348 b 400 312 394 326 396 319 b 451 287 408 294 420 288 b 513 258 484 285 499 278 b 522 223 519 247 522 234 b 461 159 522 190 496 159 b 449 161 457 159 453 159 b 397 229 416 167 397 191 b 366 288 397 265 390 278 b 352 290 362 290 357 290 b 315 262 336 290 321 280 b 311 245 313 256 311 251 b 334 204 311 233 318 220 b 355 170 348 190 351 184 b 357 152 356 166 357 159 b 355 136 357 147 356 140 b 295 88 345 104 321 88 b 232 152 264 88 232 112 b 255 204 232 174 238 186 b 279 244 273 222 279 231 l 279 245 b 238 290 279 270 259 290 b 224 288 234 290 228 290 b 193 229 200 278 193 265 b 141 161 193 191 174 167 b 129 159 137 159 133 159 b 68 223 93 159 68 190 b 77 258 68 234 70 247 b 138 287 91 278 106 285 b 185 302 166 287 175 291 b 196 333 193 312 196 323 b 174 369 196 347 187 360 b 152 374 166 373 159 374 b 111 351 140 374 126 367 b 62 327 95 335 80 327 b 51 328 58 327 54 327 b -1 391 16 334 -1 363 b 53 455 -1 420 17 449 b 62 455 57 455 59 455 b 111 431 80 455 95 448 b 152 408 127 415 140 408 b 161 409 155 408 159 408 b 193 433 176 413 186 420 l 196 440 l 196 448 b 196 451 196 449 196 449 b 190 471 196 459 194 463 b 137 495 182 489 167 495 l 134 495 l 134 495 b 68 560 95 495 68 521 b 129 623 68 596 95 623 b 144 621 134 623 138 623 b 193 553 175 614 193 589 b 224 495 193 517 200 503 b 238 492 228 492 234 492 b 279 538 259 492 279 512 b 254 580 279 549 269 566 b 232 630 239 594 232 612 b 280 692 232 657 250 684 m 307 456 b 295 458 303 458 299 458 b 230 391 258 458 230 426 b 236 360 230 381 231 371 b 295 324 249 337 272 324 b 353 360 318 324 341 337 b 360 391 357 370 360 381 b 307 456 360 421 340 451 ', + }, + pictChokeCymbal: { + x_min: 0, + x_max: 227.3125, + ha: 232, + o: 'm 91 213 b 100 215 93 215 96 215 b 227 58 167 215 224 144 b 227 52 227 56 227 54 b 61 -201 227 -43 164 -138 b 29 -216 44 -212 36 -216 b 23 -210 27 -216 24 -213 b 21 -205 21 -208 21 -206 b 34 -192 21 -201 25 -197 b 122 -55 89 -161 122 -106 b 104 6 122 -33 117 -12 l 103 9 l 96 9 b 4 79 57 9 17 38 b 0 112 1 90 0 101 b 91 213 0 163 36 209 ', + }, + wiggleArpeggiatoUp: { + x_min: 58.53125, + x_max: 228.671875, + ha: 294, + o: 'm 138 371 b 142 373 140 371 141 373 b 178 342 149 373 156 366 b 228 251 217 297 228 278 b 228 244 228 248 228 247 b 176 147 227 212 212 184 b 123 73 152 122 132 93 b 121 62 122 70 121 66 b 145 13 121 48 129 31 b 153 -2 151 6 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 145 -11 b 129 -1 140 -11 136 -8 b 61 87 89 37 68 68 b 58 113 59 95 58 105 b 110 215 58 144 74 177 b 163 287 134 240 155 269 b 166 299 166 291 166 295 b 141 348 166 313 157 330 b 133 360 134 356 133 358 b 133 363 133 362 133 362 b 138 371 133 367 136 370 ', + }, + arrowheadBlackUp: { + x_min: -10.890625, + x_max: 299.4375, + ha: 294, + o: 'm 136 460 b 142 462 137 462 140 462 b 166 449 152 462 161 456 b 171 428 168 446 168 445 b 288 131 194 322 238 209 b 298 115 295 120 296 117 b 299 106 298 112 299 109 b 273 81 299 91 287 81 b 255 86 268 81 261 83 b 155 116 225 104 183 116 l 152 116 l 149 108 b 141 83 148 102 144 91 b 134 48 137 69 134 58 b 149 9 134 34 140 24 b 153 -1 152 5 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 147 -11 b 122 2 138 -11 133 -6 b 95 61 104 20 95 38 b 107 108 95 74 99 90 b 108 113 107 111 108 112 b 107 113 108 113 108 113 b 102 113 106 113 104 113 b 31 86 76 108 53 98 b 14 80 24 81 20 80 b -10 106 0 80 -10 91 b 0 131 -10 115 -9 116 b 115 430 49 209 91 317 b 136 460 119 451 123 456 ', + }, + arrowheadBlackDown: { + x_min: -10.890625, + x_max: 298.078125, + ha: 294, + o: 'm 138 473 b 142 474 140 473 141 474 b 164 459 148 474 153 470 b 191 402 183 442 191 423 b 181 353 191 388 187 371 b 178 349 179 352 178 349 b 179 348 178 348 179 348 b 185 349 181 348 182 348 b 255 376 210 355 234 363 b 272 381 264 381 266 381 b 298 355 287 381 298 370 b 288 330 298 348 298 345 b 171 34 238 254 194 141 b 166 13 168 16 168 16 b 144 1 161 5 152 1 b 121 15 134 1 125 5 b 115 33 119 18 117 24 b 0 330 91 145 49 252 b -10 355 -9 345 -10 348 b 13 381 -10 371 0 381 b 31 376 19 381 25 380 b 132 345 61 358 103 345 l 136 345 l 137 355 b 145 378 138 359 142 370 b 152 415 149 394 152 405 b 137 452 152 427 148 438 b 133 464 134 458 133 460 b 138 473 133 467 134 470 ', + }, + vexAccidentalMicrotonal1: { + x_min: -171.5, + x_max: 483.1875, + ha: 493, + o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 495 20 616 20 616 b 20 373 20 427 20 373 b 115 410 20 373 63 390 l 210 448 l 210 531 b 212 620 210 614 210 616 b 231 632 215 628 223 632 b 246 627 236 632 242 631 b 251 541 251 620 251 628 l 251 463 l 315 489 b 387 514 368 509 381 514 b 393 513 390 514 392 514 b 406 494 402 510 406 502 b 397 476 406 487 404 480 b 323 446 396 474 363 462 l 251 417 l 251 283 l 251 148 l 254 151 b 370 199 291 183 332 199 b 415 191 385 199 400 197 b 483 84 458 176 483 134 b 461 0 483 58 476 29 b 332 -142 439 -40 411 -72 l 255 -215 b 231 -229 240 -229 239 -229 b 216 -223 224 -229 220 -227 b 210 -158 210 -217 210 -223 b 210 -120 210 -148 210 -136 l 210 -29 l 205 -34 b 100 -142 182 -65 159 -88 l 23 -215 b -1 -229 9 -229 6 -229 b -19 -217 -9 -229 -16 -224 l -20 -215 l -21 48 l -21 310 l -83 287 b -152 262 -133 266 -145 262 b -157 263 -153 262 -155 262 b -171 283 -166 266 -171 274 b -161 301 -171 290 -167 297 b -91 328 -160 302 -129 315 l -21 356 l -21 487 l -20 617 l -19 621 b -8 631 -17 626 -12 630 m 210 288 b 210 401 210 351 210 401 b 114 365 209 401 167 384 l 20 327 l 20 238 l 20 148 l 21 151 b 140 199 59 183 102 199 b 206 180 164 199 187 192 l 209 177 b 209 177 209 177 209 177 b 210 288 210 177 210 199 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 m 341 131 b 328 133 337 133 332 133 b 322 133 326 133 323 133 b 257 87 296 129 273 113 l 251 80 l 251 -37 l 251 -156 l 255 -152 b 375 81 328 -72 375 20 l 375 83 b 341 131 375 113 367 126 ', + }, + vexAccidentalMicrotonal2: { + x_min: -1.359375, + x_max: 386.5625, + ha: 394, + o: 'm 249 535 b 257 537 251 537 253 537 b 276 524 266 537 273 533 l 277 521 l 279 419 l 279 316 l 304 323 b 337 328 319 326 330 328 b 353 316 347 328 349 324 b 355 266 355 315 355 290 b 353 215 355 241 355 217 b 319 198 349 206 347 205 b 279 187 284 190 279 188 b 279 156 279 187 279 174 b 279 136 279 151 279 144 l 279 84 l 289 87 l 330 98 b 367 105 352 102 362 105 b 378 101 372 105 375 104 b 386 61 385 95 386 94 b 386 40 386 55 386 48 l 386 -5 l 385 -8 b 374 -19 383 -12 378 -18 b 291 -40 372 -19 347 -26 b 279 -43 284 -41 279 -43 b 279 -83 279 -43 279 -59 b 279 -95 279 -87 279 -91 l 279 -145 l 304 -140 b 337 -133 321 -136 330 -133 b 349 -140 343 -133 347 -136 b 355 -181 355 -145 355 -142 l 355 -197 l 355 -210 b 349 -252 355 -249 355 -247 b 300 -269 345 -258 347 -258 b 280 -274 291 -272 281 -273 l 279 -274 l 277 -378 l 277 -483 l 276 -487 b 257 -499 273 -495 265 -499 b 238 -487 249 -499 242 -495 l 236 -483 l 236 -384 l 236 -285 l 235 -285 l 212 -291 l 170 -301 b 148 -308 159 -305 148 -306 b 147 -415 147 -308 147 -313 l 147 -523 l 145 -526 b 126 -538 141 -534 133 -538 b 106 -526 118 -538 110 -534 l 104 -523 l 104 -420 b 103 -317 104 -326 104 -317 b 103 -317 103 -317 103 -317 b 50 -330 92 -322 54 -330 b 31 -317 42 -330 35 -326 b 29 -267 29 -315 29 -315 l 29 -219 l 32 -216 b 92 -192 36 -206 36 -206 l 104 -190 l 104 -138 b 103 -87 104 -91 104 -87 b 103 -87 103 -87 103 -87 b 88 -91 103 -87 96 -88 l 49 -101 b 17 -106 32 -105 23 -106 b 6 -102 13 -106 10 -105 b -1 -62 0 -97 -1 -95 b 0 -41 -1 -56 0 -49 l 0 4 l 1 6 b 10 16 2 11 6 15 b 91 37 12 18 38 24 l 104 41 l 104 93 b 103 144 104 140 104 144 b 103 144 103 144 103 144 b 50 131 92 141 54 131 b 31 144 42 131 35 137 b 29 195 29 147 29 148 l 29 242 l 32 245 b 92 269 36 255 36 255 l 104 273 l 104 377 l 104 481 l 106 485 b 126 498 110 492 118 498 b 134 495 129 498 132 496 b 145 485 138 494 142 489 l 147 481 l 147 383 l 147 283 l 152 284 b 190 294 155 285 171 290 l 230 303 l 236 305 l 236 413 l 236 521 l 238 524 b 249 535 240 528 243 533 m 236 126 b 235 177 236 154 236 177 l 235 177 b 213 172 235 177 225 174 l 170 161 b 147 155 157 158 147 155 b 147 124 147 155 147 142 b 147 102 147 117 147 111 l 147 52 l 153 54 l 228 72 l 236 74 l 236 126 m 236 -105 b 235 -54 236 -65 236 -54 l 235 -54 b 231 -55 235 -54 234 -54 b 172 -69 227 -55 204 -62 l 149 -76 l 147 -76 l 147 -127 l 147 -179 l 152 -177 b 190 -167 155 -177 171 -173 l 230 -158 l 236 -156 l 236 -105 ', + }, + vexWiggleArpeggioUp: { + x_min: 58.53125, + x_max: 228.671875, + ha: 294, + o: 'm 138 371 b 142 373 140 371 141 373 b 178 342 149 373 156 366 b 228 251 217 297 228 278 b 228 244 228 248 228 247 b 176 147 227 212 212 184 b 123 73 152 122 132 93 b 121 62 122 70 121 66 b 145 13 121 48 129 31 b 153 -2 151 6 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 145 -11 b 129 -1 140 -11 136 -8 b 61 87 89 37 68 68 b 58 113 59 95 58 105 b 110 215 58 144 74 177 b 163 287 134 240 155 269 b 166 299 166 291 166 295 b 141 348 166 313 157 330 b 133 360 134 356 133 358 b 133 363 133 362 133 362 b 138 371 133 367 136 370 ', + }, + vexNoteHeadMutedBreve: { + x_min: 0, + x_max: 370.21875, + ha: 378, + o: 'm 0 0 l 0 277 l 61 277 l 122 277 l 122 0 l 122 -278 l 61 -278 l 0 -278 l 0 0 m 246 -1 l 246 277 l 308 277 l 370 277 l 370 -1 l 370 -278 l 308 -278 l 246 -278 l 246 -1 ', + }, + }, + cssFontWeight: 'normal', + ascender: 1903, + underlinePosition: -125, + cssFontStyle: 'normal', + boundingBox: { + yMin: -2065.375, + xMin: -695.53125, + yMax: 1901.578125, + xMax: 1159.671875, + }, + resolution: 1000, + original_font_information: { + postscript_name: 'Gonville-18', + version_string: 'Version 0.1.8904 ', + vendor_url: '', + full_font_name: 'Gonville-18', + font_family_name: 'Gonville-18', + copyright: 'No copyright is claimed on this font file.', + description: '', + trademark: '', + designer: '', + designer_url: '', + unique_font_identifier: 'FontForge 2.0 : Gonville-18 : 17-3-2010', + license_url: '', + license_description: '', + manufacturer_name: '', + font_sub_family_name: '18', + }, + descender: -2066, + fontFamily: 'Gonville-18', + lineHeight: 4093, + underlineThickness: 50, +}; + + +/***/ }), + +/***/ "./src/fonts/gonville_metrics.ts": +/*!***************************************!*\ + !*** ./src/fonts/gonville_metrics.ts ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "GonvilleMetrics": () => (/* binding */ GonvilleMetrics) +/* harmony export */ }); +/** + * The Gonville font was created by Simon Tatham. + * https://www.chiark.greenend.org.uk/~sgtatham/gonville/ + */ +const GonvilleMetrics = { + name: 'Gonville', + smufl: false, + stave: { + padding: 12, + endPaddingMax: 10, + endPaddingMin: 5, + unalignedNotePadding: 10, + }, + accidental: { + noteheadAccidentalPadding: 1, + leftPadding: 2, + accidentalSpacing: 3, + }, + clef: { + default: { + point: 40, + width: 26, + }, + small: { + point: 32, + width: 20, + }, + annotations: { + '8va': { + smuflCode: 'timeSig8', + default: { + point: 20, + treble: { + line: -1.2, + shiftX: 11, + }, + }, + small: { + point: 18, + treble: { + line: -0.4, + shiftX: 8, + }, + }, + }, + '8vb': { + smuflCode: 'timeSig8', + default: { + point: 20, + treble: { + line: 6.3, + shiftX: 10, + }, + bass: { + line: 4, + shiftX: 1, + }, + }, + small: { + point: 18, + treble: { + line: 5.8, + shiftX: 6, + }, + bass: { + line: 3.5, + shiftX: 0.5, + }, + }, + }, + }, + // May not need these anymore + lineCount: { + '8': { point: 55, shiftY: 14 }, + '7': { point: 47, shiftY: 8 }, + '6': { point: 40, shiftY: 1 }, + '5': { point: 30, shiftY: -6 }, + '4': { point: 23, shiftY: -12 }, + }, + }, + parenthesis: { + default: { + point: 39, + width: 7, + }, + gracenote: { + point: (39 * 3) / 5, + width: 3, + }, + }, + pedalMarking: { + up: { + point: 40, + }, + down: { + point: 40, + }, + }, + // These are for numeric digits, such as in time signatures + digits: { + point: 40, + tupletPoint: 28, + }, + // articulation: { + // }, + tremolo: { + default: { + point: 25, + spacing: 4, + offsetYStemUp: -7, + offsetYStemDown: 7, + offsetXStemUp: 9, + offsetXStemDown: -0.5, + }, + grace: { + point: 15, + spacing: 4, + offsetYStemUp: -7, + offsetYStemDown: 7, + offsetXStemUp: 6.5, + offsetXStemDown: -0.5, + }, + }, + staveRepetition: { + default: { + offsetY: 25, + offsetSymbol: 12, + spacing: 5, + }, + }, + // noteHead: { + // }, + stem: { + heightAdjustmentForFlag: -3, + // These are stem (Y) offsets to the note heads. To shift the + // noteheads (x-position) themselves, see glyphs.notehead.custom. + noteHead: { + noteheadTriangleUpHalf: { + offsetYBaseStemUp: 5, + offsetYBaseStemDown: 4, + }, + noteheadTriangleUpBlack: { + offsetYBaseStemUp: 5, + offsetYBaseStemDown: 4, + }, + noteheadTriangleUpWhole: { + offsetYBaseStemUp: 5, + offsetYBaseStemDown: 4, + }, + noteheadXHalf: { + offsetYBaseStemUp: -4, + offsetYBaseStemDown: 4, + }, + noteheadXBlack: { + offsetYBaseStemUp: -4, + offsetYBaseStemDown: 4, + }, + noteheadXWhole: { + offsetYBaseStemUp: -4, + offsetYBaseStemDown: 4, + }, + noteheadHalf: { + offsetYBaseStemUp: -1.5, + offsetYBaseStemDown: 1.5, + }, + noteheadBlack: { + offsetYBaseStemUp: -1.5, + offsetYBaseStemDown: 1.5, + }, + noteheadSquareWhite: { + offsetYBaseStemDown: -5, + offsetYBaseStemUp: 5, + }, + }, + }, + glyphs: { + flag: { + shiftX: -0.08, + flag8thDown: { + shiftX: -0.16, + }, + flag16thDown: { + shiftX: -0.16, + }, + flag32ndDown: { + shiftX: -0.16, + shiftY: 9, + }, + flag64thDown: { + shiftX: -0.16, + shiftY: 13, + }, + flag128thDown: { + shiftX: -0.16, + shiftY: 22, + }, + flag32ndUp: { + shiftY: -9, + }, + flag64thUp: { + shiftY: -13, + }, + flag128thUp: { + shiftY: -22, + }, + }, + stringNumber: { + verticalPadding: 8, + stemPadding: 2, + leftPadding: 5, + rightPadding: 6, + }, + textNote: { + point: 40, + default: {}, + ornamentTrill: { + shiftX: -5, + shiftY: 4, + }, + }, + noteHead: { + minPadding: 2, + custom: { + noteheadDiamondWholeStemUp: { + shiftX: -6, + }, + noteheadCircleXStemUp: { + shiftX: -1.5, + }, + noteheadXWholeStemUp: { + shiftX: -5, + }, + noteheadTriangleUpWholeStemUp: { + shiftX: -6, + }, + }, + }, + chordSymbol: { + global: { + superscriptOffset: -400, + subscriptOffset: 300, + kerningOffset: -250, + lowerKerningText: ['D', 'F', 'P', 'T', 'V', 'Y'], + upperKerningText: ['A', 'L'], + spacing: 100, + superSubRatio: 0.66, + }, + csymDiminished: { + scale: 0.8, + leftSideBearing: 0, + advanceWidth: 506, + yOffset: 0, + }, + csymHalfDiminished: { + scale: 0.8, + leftSideBearing: -32, + advanceWidth: 506, + yOffset: 0, + }, + csymAugmented: { + scale: 1, + leftSideBearing: 0, + advanceWidth: 530, + yOffset: 0, + }, + csymParensLeftTall: { + scale: 0.8, + leftSideBearing: 0, + advanceWidth: 155, + yOffset: 250, + }, + csymParensRightTall: { + scale: 0.8, + leftSideBearing: -40, + advanceWidth: 189, + yOffset: 250, + }, + csymBracketLeftTall: { + scale: 0.8, + leftSideBearing: 0, + advanceWidth: 328, + yOffset: 0, + }, + csymBracketRightTall: { + scale: 0.8, + leftSideBearing: 1, + advanceWidth: 600, + yOffset: 0, + }, + csymParensLeftVeryTall: { + scale: 0.9, + leftSideBearing: 0, + advanceWidth: 121, + yOffset: 350, + }, + csymParensRightVeryTall: { + scale: 0.9, + leftSideBearing: 50, + advanceWidth: 111, + yOffset: 350, + }, + csymDiagonalArrangementSlash: { + scale: 0.6, + leftSideBearing: -1, + advanceWidth: 990, + yOffset: 0, + }, + csymMinor: { + scale: 0.8, + leftSideBearing: 0, + advanceWidth: 482, + yOffset: 0, + }, + csymMajorSeventh: { + scale: 0.9, + leftSideBearing: 200, + yOffset: 0, + advanceWidth: 600, + }, + accidentalSharp: { + scale: 0.75, + leftSideBearing: 40, + advanceWidth: 250, + yOffset: -402, + }, + accidentalFlat: { + scale: 0.95, + leftSideBearing: -50, + advanceWidth: 208, + yOffset: -184, + }, + }, + jazzOrnaments: { + brassScoop: { + scale: 1.0, + xOffset: -12, + yOffset: 0, + stemUpYOffset: 0, + reportedWidth: 10, + }, + brassDoitMedium: { + scale: 1.0, + xOffset: 16, + yOffset: 0, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassFallLipShort: { + scale: 1.0, + xOffset: 17, + yOffset: 0, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassLiftMedium: { + scale: 1.0, + xOffset: 16, + yOffset: 5, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassFallRoughMedium: { + scale: 1.0, + xOffset: 16, + yOffset: 28, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassBend: { + scale: 1.0, + xOffset: 2, + yOffset: -8, + stemUpYOffset: 24, + reportedWidth: 5, + }, + brassMuteClosed: { + scale: 1.0, + xOffset: 3, + yOffset: -9, + stemUpYOffset: 24, + reportedWidth: 5, + }, + brassMuteOpen: { + scale: 1.0, + xOffset: 3, + yOffset: -7, + stemUpYOffset: 25, + reportedWidth: 5, + }, + brassFlip: { + scale: 1.0, + xOffset: 10, + yOffset: -4, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassJazzTurn: { + scale: 1.0, + xOffset: 6, + yOffset: -4, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassSmear: { + scale: 1.0, + xOffset: 10, + yOffset: -4, + stemUpYOffset: 0, + reportedWidth: 5, + }, + }, + tremolo: { + default: { + shiftY: -10, + }, + grace: { + shiftY: -5, + }, + }, + tuplet: { + noteHeadOffset: 20, + stemOffset: 10, + bottomLine: 4, + topModifierOffset: 15, + }, + }, +}; + + +/***/ }), + +/***/ "./src/fonts/load_all.ts": +/*!*******************************!*\ + !*** ./src/fonts/load_all.ts ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "loadAllMusicFonts": () => (/* binding */ loadAllMusicFonts) +/* harmony export */ }); +/* harmony import */ var _load_bravura__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./load_bravura */ "./src/fonts/load_bravura.ts"); +/* harmony import */ var _load_custom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./load_custom */ "./src/fonts/load_custom.ts"); +/* harmony import */ var _load_gonville__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./load_gonville */ "./src/fonts/load_gonville.ts"); +/* harmony import */ var _load_petaluma__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./load_petaluma */ "./src/fonts/load_petaluma.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// vexflow.js statically bundles & preloads all of our music engraving fonts. + + + + +// ADD_MUSIC_FONT +// import { loadXXX } from './load_xxx'; +// Populate our font "database" with all our music fonts. +function loadAllMusicFonts() { + (0,_load_bravura__WEBPACK_IMPORTED_MODULE_0__.loadBravura)(); + (0,_load_gonville__WEBPACK_IMPORTED_MODULE_2__.loadGonville)(); + (0,_load_petaluma__WEBPACK_IMPORTED_MODULE_3__.loadPetaluma)(); + (0,_load_custom__WEBPACK_IMPORTED_MODULE_1__.loadCustom)(); + // ADD_MUSIC_FONT + // loadXXX(); +} + + +/***/ }), + +/***/ "./src/fonts/load_bravura.ts": +/*!***********************************!*\ + !*** ./src/fonts/load_bravura.ts ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "loadBravura": () => (/* binding */ loadBravura) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../font */ "./src/font.ts"); +/* harmony import */ var _bravura_glyphs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./bravura_glyphs */ "./src/fonts/bravura_glyphs.ts"); +/* harmony import */ var _bravura_metrics__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./bravura_metrics */ "./src/fonts/bravura_metrics.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// If you are adding a new music engraving font, search for instances of ADD_MUSIC_FONT throughout the code base. +// To compile your new font into vexflow.js, take a look at src/fonts/load_all.ts +// You can export a font module which can be dynamically loaded by vexflow-core.js (see: Gruntfile.js). +// ADD_MUSIC_FONT +// To add a new music engraving font XXX, make a copy of this file and name it load_xxx.ts. +// Then you will need to generate xxx_glyphs.ts and xxx_metrics.ts. +// xxx_glyphs.ts is created by tools/fonts/fontgen_smufl.js +// xxx_metrics.ts is created by hand. You could copy bravura_metrics.ts and modify/remove/add entries where necessary. + + + +function loadBravura() { + _font__WEBPACK_IMPORTED_MODULE_0__.Font.load('Bravura', _bravura_glyphs__WEBPACK_IMPORTED_MODULE_1__.BravuraFont, _bravura_metrics__WEBPACK_IMPORTED_MODULE_2__.BravuraMetrics); +} + + +/***/ }), + +/***/ "./src/fonts/load_custom.ts": +/*!**********************************!*\ + !*** ./src/fonts/load_custom.ts ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "loadCustom": () => (/* binding */ loadCustom) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../font */ "./src/font.ts"); +/* harmony import */ var _custom_glyphs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./custom_glyphs */ "./src/fonts/custom_glyphs.ts"); +/* harmony import */ var _custom_metrics__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./custom_metrics */ "./src/fonts/custom_metrics.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + +function loadCustom() { + _font__WEBPACK_IMPORTED_MODULE_0__.Font.load('Custom', _custom_glyphs__WEBPACK_IMPORTED_MODULE_1__.CustomFont, _custom_metrics__WEBPACK_IMPORTED_MODULE_2__.CustomMetrics); +} + + +/***/ }), + +/***/ "./src/fonts/load_gonville.ts": +/*!************************************!*\ + !*** ./src/fonts/load_gonville.ts ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "loadGonville": () => (/* binding */ loadGonville) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../font */ "./src/font.ts"); +/* harmony import */ var _gonville_glyphs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./gonville_glyphs */ "./src/fonts/gonville_glyphs.ts"); +/* harmony import */ var _gonville_metrics__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./gonville_metrics */ "./src/fonts/gonville_metrics.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + +function loadGonville() { + _font__WEBPACK_IMPORTED_MODULE_0__.Font.load('Gonville', _gonville_glyphs__WEBPACK_IMPORTED_MODULE_1__.GonvilleFont, _gonville_metrics__WEBPACK_IMPORTED_MODULE_2__.GonvilleMetrics); +} + + +/***/ }), + +/***/ "./src/fonts/load_petaluma.ts": +/*!************************************!*\ + !*** ./src/fonts/load_petaluma.ts ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "loadPetaluma": () => (/* binding */ loadPetaluma) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../font */ "./src/font.ts"); +/* harmony import */ var _petaluma_glyphs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./petaluma_glyphs */ "./src/fonts/petaluma_glyphs.ts"); +/* harmony import */ var _petaluma_metrics__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./petaluma_metrics */ "./src/fonts/petaluma_metrics.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + +function loadPetaluma() { + _font__WEBPACK_IMPORTED_MODULE_0__.Font.load('Petaluma', _petaluma_glyphs__WEBPACK_IMPORTED_MODULE_1__.PetalumaFont, _petaluma_metrics__WEBPACK_IMPORTED_MODULE_2__.PetalumaMetrics); +} + + +/***/ }), + +/***/ "./src/fonts/petaluma_glyphs.ts": +/*!**************************************!*\ + !*** ./src/fonts/petaluma_glyphs.ts ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "PetalumaFont": () => (/* binding */ PetalumaFont) +/* harmony export */ }); +const PetalumaFont = { + glyphs: { + bracketTop: { + x_min: 0, + x_max: 508, + y_min: 0, + y_max: 370, + ha: 370, + o: 'm 22 0 b 122 0 55 1 89 0 l 157 0 b 713 376 425 0 622 137 b 732 467 724 406 732 436 b 726 514 732 482 730 498 b 711 533 723 528 719 533 b 693 526 707 533 700 530 b 674 498 683 520 678 508 b 635 406 662 467 652 435 b 310 164 560 281 458 193 b 154 151 258 154 206 151 b 39 154 117 151 78 154 b 1 120 17 154 4 145 b 0 84 0 108 0 96 b 0 20 0 63 1 40 b 22 0 0 4 7 0 z', + }, + bracketBottom: { + x_min: 0, + x_max: 496, + y_min: -393, + y_max: 0, + ha: 393, + o: 'm 696 -566 b 711 -539 713 -566 708 -549 b 714 -521 713 -533 714 -527 b 713 -508 714 -517 713 -513 b 661 -327 706 -445 688 -384 b 392 -42 603 -203 513 -109 b 206 0 331 -7 266 0 b 160 -1 190 0 174 -1 b 26 -1 107 -1 66 -3 b 0 -19 12 -1 0 -4 l 0 -23 b 3 -50 1 -32 3 -42 b 1 -86 3 -62 1 -73 b 4 -118 1 -96 1 -108 b 45 -151 10 -145 23 -154 b 180 -143 89 -144 135 -145 b 621 -419 392 -135 523 -236 b 662 -539 641 -456 655 -497 b 696 -566 667 -557 680 -566 z', + }, + barlineTick: { + x_min: 0, + x_max: 56.036101509664164, + y_min: 876.905249806889, + y_max: 1121.5430338167066, + ha: 244.63778400981766, + o: 'm 42 1263 b 66 1287 62 1261 66 1272 b 81 1583 65 1387 72 1485 b 35 1614 82 1610 53 1610 b 14 1591 17 1619 16 1604 b 0 1408 7 1525 0 1459 l 0 1292 b 42 1263 1 1263 23 1266 z', + }, + breathMarkTick: { + x_min: 0, + x_max: 568, + y_min: 0, + y_max: 621, + ha: 621, + o: 'm 258 0 b 278 39 276 0 274 24 b 279 56 279 45 279 50 l 279 73 b 278 117 279 88 278 102 b 281 148 278 127 279 138 b 536 600 312 330 387 487 b 744 719 600 651 670 690 b 815 779 775 730 808 740 b 818 824 818 793 818 808 b 815 868 818 838 818 852 b 796 894 814 881 808 894 b 779 888 791 894 786 893 b 719 864 760 878 739 871 b 372 602 580 806 459 724 b 229 252 298 498 251 383 b 220 268 225 262 222 264 b 209 302 217 279 213 291 b 75 527 181 387 143 467 b 16 563 58 543 39 573 b 0 539 3 557 0 549 b 12 492 0 524 9 507 b 56 400 19 459 22 425 b 163 269 104 367 138 323 b 238 36 197 194 216 115 b 258 0 242 22 243 0 z', + }, + segno: { + x_min: 0, + x_max: 798, + y_min: -65, + y_max: 806, + ha: 871, + o: 'm 16 -94 b 66 -69 39 -92 53 -85 b 177 59 102 -26 138 17 b 543 456 298 192 420 324 b 726 300 615 420 680 373 b 753 217 744 271 753 243 b 655 112 753 170 719 131 b 599 104 636 107 618 104 b 461 173 544 104 495 128 b 432 190 454 183 444 190 b 409 179 425 190 418 187 b 359 118 390 160 373 141 b 341 72 347 101 341 86 b 373 24 341 56 351 40 b 409 6 384 17 396 10 b 550 -13 454 -12 501 -14 b 599 -6 566 -12 583 -10 b 864 213 720 27 806 104 b 886 300 878 242 886 271 b 857 395 886 331 877 363 b 799 467 840 420 821 445 b 648 572 755 513 704 546 b 1110 1083 802 743 955 914 b 1140 1129 1123 1097 1136 1110 b 1149 1148 1142 1135 1149 1142 b 1145 1153 1149 1149 1148 1152 b 1123 1161 1139 1158 1130 1161 b 1109 1156 1119 1161 1113 1159 b 1089 1138 1102 1151 1094 1145 b 946 988 1040 1089 989 1041 b 595 602 834 855 711 732 l 590 598 l 549 615 b 432 793 462 647 432 723 b 534 888 432 851 474 888 b 671 834 588 888 631 864 b 710 818 684 824 696 818 b 724 821 714 818 719 819 b 809 883 757 834 788 852 b 816 901 814 890 816 896 b 802 923 816 910 812 916 b 706 984 770 945 742 971 b 593 1011 668 998 631 1011 b 516 991 567 1011 541 1005 b 333 799 433 949 380 876 b 302 693 312 765 302 729 b 330 589 302 658 311 624 b 469 488 360 533 415 511 b 485 482 475 487 480 485 b 266 249 412 405 338 327 b 121 88 217 196 170 141 b 9 -65 78 40 37 -7 b 0 -85 4 -72 0 -79 b 16 -94 0 -91 4 -94 z m 861 536 b 927 575 890 539 909 557 b 965 628 952 598 965 613 b 926 680 965 644 952 658 b 865 713 900 701 883 713 b 805 667 845 713 828 698 b 768 611 791 649 770 631 b 812 564 766 589 798 582 b 861 536 824 550 840 537 z m 251 350 b 363 436 285 348 353 403 b 354 456 366 448 360 452 b 271 518 327 477 298 497 b 243 528 261 526 252 528 b 210 513 232 528 222 523 b 157 454 190 494 176 472 b 141 428 147 444 141 436 b 158 406 141 420 147 413 b 216 361 180 393 197 376 b 245 350 225 356 235 350 z', + }, + coda: { + x_min: 0, + x_max: 1380, + y_min: -196, + y_max: 1037, + ha: 1233, + o: 'm 1028 -282 b 1057 -245 1045 -282 1053 -261 b 1060 -203 1060 -232 1060 -217 b 1063 9 1060 -132 1061 -62 b 1390 194 1192 22 1303 81 b 1531 543 1467 298 1512 415 b 1532 556 1531 547 1532 552 b 1904 559 1656 557 1780 559 b 1950 582 1920 559 1941 569 b 1987 674 1970 609 1987 638 b 1984 698 1987 681 1986 690 b 1950 700 1973 698 1961 700 l 1941 700 l 1545 696 b 1535 776 1545 723 1541 749 b 1103 1113 1477 996 1326 1107 b 1080 1115 1096 1115 1087 1115 b 1081 1322 1080 1184 1080 1253 b 1079 1467 1083 1371 1081 1418 b 1061 1493 1079 1476 1080 1493 l 1060 1493 b 1028 1467 1044 1490 1031 1485 b 1020 1403 1025 1446 1020 1424 b 1017 1110 1020 1305 1018 1208 l 962 1106 b 569 914 808 1087 671 1035 b 451 683 510 844 472 766 l 161 678 b 118 680 148 678 132 680 b 79 670 101 680 86 678 b 0 544 48 636 29 592 l 37 544 l 429 549 b 428 518 428 539 428 528 b 488 285 428 435 458 360 b 681 81 526 192 593 124 b 946 9 763 40 854 19 b 1008 6 966 7 988 6 b 1005 -137 1008 -42 1005 -89 b 1012 -243 1005 -173 1005 -209 b 1028 -282 1015 -258 1011 -282 z m 1074 690 b 1079 935 1077 772 1077 852 b 1326 855 1166 932 1250 909 b 1446 694 1385 814 1426 759 b 1269 693 1387 694 1328 693 b 1074 690 1204 693 1139 691 z m 577 684 b 766 874 618 763 678 828 b 989 932 837 912 913 923 b 1015 933 998 932 1007 933 b 1014 822 1015 896 1014 860 b 1011 688 1012 791 1012 743 z m 1067 184 b 1071 553 1070 307 1068 429 b 1439 556 1194 553 1316 554 b 1437 554 1439 554 1437 554 b 1341 337 1413 478 1387 402 b 1119 192 1286 261 1211 212 b 1067 184 1102 189 1084 186 z m 1008 180 b 660 264 886 181 770 212 b 524 471 570 305 524 374 b 528 524 524 488 526 505 l 533 549 b 792 552 619 550 706 550 b 1009 553 865 553 937 552 b 1008 180 1009 428 1008 288 z', + }, + gClef: { + x_min: 0, + x_max: 664, + y_min: -559, + y_max: 1009, + ha: 1568, + o: 'm 343 -805 b 366 -801 350 -805 357 -804 b 409 -773 383 -795 397 -786 b 582 -328 528 -648 577 -497 b 583 -294 582 -315 583 -294 b 612 -279 583 -294 603 -282 b 747 -197 660 -256 706 -230 b 949 143 857 -109 920 10 b 956 206 955 164 956 186 b 791 384 956 297 906 363 b 704 393 762 390 733 393 b 498 336 632 393 563 374 b 481 325 490 331 481 325 l 444 465 b 442 485 442 472 442 485 b 609 880 442 485 589 746 b 619 996 616 919 619 958 b 613 1084 619 1027 618 1056 b 534 1387 599 1188 560 1286 b 482 1453 527 1417 517 1453 b 422 1407 456 1453 438 1428 b 305 1063 348 1305 312 1188 b 304 1002 304 1043 304 1022 b 338 654 304 886 323 769 b 343 629 338 645 341 636 b 144 356 278 537 206 451 b 23 144 101 288 53 220 b 0 20 7 107 0 63 b 82 -210 0 -69 30 -160 b 207 -288 112 -239 160 -271 b 410 -328 274 -312 340 -328 b 474 -324 431 -328 452 -327 l 491 -321 b 491 -341 491 -321 492 -334 b 402 -585 475 -428 454 -513 b 294 -668 374 -622 348 -664 b 271 -693 278 -670 271 -680 b 274 -708 271 -698 272 -703 b 302 -775 282 -730 292 -753 b 343 -805 311 -795 325 -805 z m 400 717 b 382 922 389 786 382 854 b 481 1286 382 1047 408 1169 b 507 1125 498 1233 507 1179 b 500 1040 507 1097 504 1068 b 400 717 481 927 455 818 z m 252 -135 b 196 -121 232 -134 215 -127 b 117 -69 158 -108 127 -94 b 111 -32 112 -58 111 -45 b 117 19 111 -16 114 1 b 130 56 118 27 127 52 b 324 337 186 156 253 246 l 384 416 l 395 384 b 416 291 406 348 416 291 b 350 213 416 291 376 239 b 243 -42 278 143 243 55 b 251 -117 243 -66 246 -91 b 252 -135 252 -122 252 -127 z m 563 -91 b 510 168 552 3 530 78 b 513 192 508 179 508 186 b 624 202 550 199 586 202 b 730 192 660 202 694 199 b 850 141 773 183 816 176 b 858 134 852 138 855 135 b 595 -121 801 19 716 -68 l 569 -131 z m 410 -160 b 311 -147 360 -160 311 -147 b 307 -98 311 -147 307 -127 b 314 -33 307 -79 308 -56 b 429 131 328 36 377 85 b 441 138 433 135 438 138 b 449 122 446 138 448 132 b 490 -131 462 37 484 -46 b 490 -153 491 -140 490 -153 b 410 -160 490 -153 452 -163 z', + }, + cClef: { + x_min: 0, + x_max: 731, + y_min: -543, + y_max: 543, + ha: 1086, + o: 'm 131 -782 b 141 -755 138 -782 140 -773 b 147 -490 143 -667 145 -577 b 160 207 150 -258 153 -24 b 168 618 164 344 158 481 b 81 768 173 690 132 732 b 45 782 66 778 55 782 b 3 740 26 782 13 768 b 0 724 1 736 0 730 l 1 710 b 4 596 4 672 4 634 l 4 382 b 9 102 4 288 4 196 b 17 -301 13 -32 10 -166 l 17 -672 b 50 -736 17 -701 27 -720 b 109 -772 69 -749 91 -759 b 131 -782 120 -778 127 -782 z m 615 -770 b 881 -684 710 -770 801 -739 b 1020 -395 986 -612 1020 -510 b 1017 -334 1020 -374 1018 -354 b 769 -62 1007 -209 896 -75 b 746 -60 762 -60 755 -60 b 639 -73 710 -60 675 -69 b 524 -109 598 -79 560 -92 b 528 -36 526 -85 528 -60 b 527 -4 528 -26 528 -14 b 528 39 527 10 528 24 b 526 99 528 59 527 79 b 592 94 549 95 570 94 b 648 99 611 94 629 95 b 912 157 744 94 844 117 b 1053 377 1009 215 1053 284 b 1050 425 1053 393 1053 409 b 914 665 1037 521 986 602 b 717 753 855 717 791 753 b 626 734 688 753 658 747 l 462 665 b 347 500 374 628 347 580 b 350 449 347 484 348 468 b 392 419 353 428 367 416 b 492 438 425 425 459 428 b 541 498 524 448 541 468 b 540 514 541 503 541 508 b 537 546 537 524 537 536 b 573 639 537 580 550 611 b 606 657 582 649 593 657 l 609 657 b 716 622 647 652 684 647 b 834 372 801 556 834 469 b 831 323 834 356 832 338 b 743 187 825 266 795 217 b 710 176 732 180 720 176 b 694 179 704 176 700 177 b 527 223 638 193 582 206 b 495 229 516 228 505 229 b 454 220 481 229 468 225 b 395 189 432 213 415 200 b 363 180 384 186 374 181 b 348 168 356 179 348 176 b 340 161 343 167 340 164 b 347 150 340 157 343 154 b 356 147 348 148 353 147 b 364 92 361 130 363 111 b 369 -37 367 49 369 6 b 363 -154 369 -76 367 -115 b 357 -236 360 -183 357 -210 b 376 -264 357 -253 361 -259 b 456 -289 402 -284 429 -289 b 521 -282 478 -289 500 -285 b 549 -255 537 -279 546 -271 b 598 -177 556 -225 577 -202 b 622 -164 605 -168 613 -164 b 636 -167 626 -164 631 -166 b 749 -225 678 -177 714 -199 b 848 -405 814 -276 848 -337 b 824 -507 848 -436 840 -471 b 657 -657 792 -582 730 -625 b 608 -668 638 -664 622 -668 b 534 -602 572 -668 547 -645 b 513 -575 530 -589 523 -575 b 507 -576 510 -575 508 -575 b 478 -582 497 -580 488 -582 b 405 -570 454 -582 428 -570 b 389 -572 399 -570 395 -570 l 363 -572 b 321 -575 348 -572 333 -569 l 321 631 b 323 662 323 641 323 652 b 315 716 323 681 321 698 b 304 736 314 723 317 736 l 302 736 b 281 716 294 734 285 729 b 275 665 276 700 275 683 l 275 382 b 276 99 275 288 275 193 b 279 -170 278 10 276 -81 b 284 -399 282 -246 284 -323 b 282 -629 284 -475 282 -553 b 289 -721 282 -660 289 -690 b 300 -736 289 -727 291 -736 b 312 -724 307 -736 310 -730 b 321 -667 323 -706 321 -687 l 321 -632 l 328 -644 l 340 -657 b 510 -757 386 -707 445 -740 b 615 -770 546 -766 580 -770 z', + }, + fClef: { + x_min: 0, + x_max: 776, + y_min: -496, + y_max: 216, + ha: 712, + o: 'm 402 -706 b 804 -405 592 -678 716 -566 b 876 -53 861 -298 874 -183 b 868 33 876 -32 873 1 b 560 311 845 217 723 311 b 524 310 549 311 536 311 b 131 134 373 297 239 242 b 17 -29 84 86 37 39 b 9 -89 12 -50 9 -71 b 112 -238 9 -154 43 -206 b 124 -243 117 -239 120 -242 b 186 -261 145 -255 166 -261 b 268 -228 215 -261 242 -249 b 351 -59 325 -181 351 -124 b 343 10 351 -36 348 -13 b 340 36 341 19 340 27 b 409 105 340 75 363 102 b 441 107 420 107 431 107 b 624 36 510 107 573 86 b 744 -200 688 -27 724 -109 b 747 -230 747 -210 747 -222 b 717 -323 747 -264 736 -292 b 608 -445 688 -370 654 -410 b 307 -541 518 -513 415 -541 l 213 -541 b 39 -521 154 -541 96 -539 b 0 -552 17 -514 0 -531 b 1 -564 0 -556 0 -560 b 17 -611 6 -580 10 -596 b 101 -694 35 -648 50 -684 b 288 -714 164 -707 225 -714 b 402 -706 325 -714 363 -711 z m 1018 92 b 1080 118 1041 91 1068 96 b 1117 219 1099 150 1117 180 b 1113 252 1117 229 1116 240 b 1045 288 1102 297 1068 276 b 1017 262 1028 297 1024 274 b 984 124 989 220 996 170 b 1008 91 979 108 986 91 z m 972 -281 b 1070 -148 1024 -279 1070 -210 b 1025 -105 1070 -105 1045 -112 b 989 -127 1004 -96 998 -114 b 949 -249 963 -164 963 -209 b 969 -281 943 -265 949 -281 z', + }, + unpitchedPercussionClef1: { + x_min: 0, + x_max: 379.13761966945304, + y_min: -250, + y_max: 250, + ha: 500, + o: 'm 481 -360 b 507 -357 491 -360 500 -360 b 546 -295 541 -346 547 -325 b 536 79 543 -170 540 -46 b 523 311 533 157 534 235 b 475 359 518 340 508 359 b 425 360 459 359 442 360 b 400 359 416 360 409 360 b 337 294 348 353 340 347 l 337 -73 b 336 -264 337 -137 337 -200 b 343 -294 336 -274 338 -284 b 481 -360 359 -330 431 -360 z m 144 -341 b 207 -320 167 -341 189 -331 b 217 -301 215 -315 217 -308 b 210 -262 217 -289 210 -275 b 228 187 212 -112 209 37 b 228 287 228 220 229 253 b 174 353 228 336 222 343 b 120 359 157 357 138 359 b 48 357 96 359 72 356 b 17 323 29 357 19 344 b 7 120 16 255 9 187 b 6 -109 6 43 6 -33 l 6 -204 b 0 -251 6 -220 0 -235 b 3 -269 0 -256 0 -262 b 127 -340 24 -330 79 -328 b 144 -341 132 -341 138 -341 z', + }, + '6stringTabClef': { + x_min: 0, + x_max: 438, + y_min: -768, + y_max: 767, + ha: 1535, + o: 'm 369 438 b 374 439 370 438 372 438 b 384 462 383 444 384 452 l 384 474 b 390 697 386 547 390 622 b 373 1002 390 799 390 901 l 533 1002 b 560 1001 541 1004 552 1001 b 573 1007 567 1001 572 1002 b 546 1050 579 1025 559 1038 b 536 1056 543 1053 539 1053 b 324 1104 472 1102 397 1104 b 72 1090 238 1104 154 1099 b 55 1093 66 1090 60 1092 b 37 1073 46 1093 37 1089 b 60 1045 37 1061 48 1051 b 203 1001 105 1022 151 1001 b 233 1004 213 1001 223 1002 b 246 1005 238 1004 243 1005 b 272 975 264 1005 272 996 l 272 965 b 258 596 264 842 265 719 b 315 474 253 540 272 504 l 343 455 b 369 438 351 448 357 438 z m 114 -320 b 127 -304 120 -320 124 -315 b 171 -174 141 -261 158 -219 b 222 -135 179 -147 196 -137 b 426 -122 289 -131 359 -128 b 498 -164 462 -120 482 -127 b 628 -301 521 -226 575 -264 b 631 -288 631 -295 631 -291 b 628 -269 631 -281 629 -276 b 569 -134 616 -220 589 -179 b 408 225 514 -14 462 107 b 314 357 384 274 351 318 b 278 380 298 372 288 379 b 251 351 268 380 261 372 b 4 -209 156 171 75 -17 b 0 -228 1 -215 0 -222 b 19 -258 0 -240 7 -249 b 102 -314 45 -279 75 -294 b 114 -320 107 -318 111 -320 z m 425 6 b 360 20 403 17 382 20 b 274 14 331 20 302 14 l 246 14 l 340 206 b 425 6 369 137 395 75 z m 245 -1106 b 281 -1104 256 -1106 269 -1106 b 511 -888 400 -1094 511 -1035 b 454 -688 511 -814 504 -744 b 448 -678 449 -685 448 -681 b 454 -667 448 -675 449 -671 b 504 -497 503 -619 507 -559 b 324 -288 500 -383 436 -308 b 295 -287 314 -287 304 -287 l 282 -287 b 115 -330 223 -287 168 -307 b 94 -366 102 -336 94 -348 l 94 -370 b 96 -435 96 -392 96 -413 b 73 -858 89 -576 71 -717 b 78 -919 73 -878 78 -899 b 72 -950 78 -930 76 -940 b 63 -992 66 -965 63 -978 b 66 -1015 63 -999 65 -1008 b 173 -1104 84 -1106 84 -1106 b 245 -1106 197 -1104 220 -1104 z m 161 -622 b 147 -618 156 -622 151 -621 b 140 -600 141 -612 140 -606 b 144 -564 140 -589 144 -575 b 143 -554 144 -560 144 -557 l 143 -546 b 220 -451 144 -467 143 -465 b 278 -445 239 -446 259 -444 b 418 -497 328 -445 376 -461 b 429 -516 426 -504 429 -510 b 415 -533 429 -521 423 -527 b 219 -608 357 -579 287 -590 b 215 -609 217 -608 216 -609 b 161 -622 197 -609 177 -622 z m 154 -953 b 130 -933 135 -953 130 -948 l 130 -865 l 128 -865 b 135 -788 130 -838 124 -808 b 203 -769 145 -769 180 -776 b 259 -762 223 -765 242 -762 b 441 -852 330 -762 386 -805 b 449 -867 446 -858 449 -863 b 436 -884 449 -874 444 -878 b 318 -942 402 -914 363 -935 b 154 -953 264 -950 209 -953 z', + }, + timeSig0: { + x_min: 20, + x_max: 513, + y_min: -358.159536277652, + y_max: 359, + ha: 717.159536277652, + o: 'm 341 -516 b 420 -510 367 -516 395 -514 b 675 -338 533 -494 622 -448 b 737 -92 716 -256 734 -171 b 739 -35 739 -73 739 -53 b 680 305 739 86 720 207 b 400 517 622 449 537 517 b 337 514 380 517 359 517 b 289 507 321 511 305 513 b 91 317 192 477 127 412 b 29 9 50 212 29 108 b 217 -458 29 -157 88 -312 b 341 -516 251 -494 291 -518 z m 412 -452 b 359 -425 393 -452 376 -444 b 187 14 242 -301 179 -158 b 268 334 193 127 212 235 b 387 448 295 383 330 428 b 406 452 395 451 400 452 b 428 444 413 452 420 449 b 517 324 471 413 497 372 b 586 -29 560 222 586 86 b 556 -271 586 -112 585 -193 b 468 -422 536 -327 508 -377 b 412 -452 449 -442 431 -452 z', + }, + timeSig1: { + x_min: 20, + x_max: 283, + y_min: -364, + y_max: 366, + ha: 730, + o: 'm 264 -524 b 357 -510 297 -524 325 -516 b 374 -490 369 -508 374 -501 b 380 -438 376 -472 380 -455 l 406 246 b 408 301 408 265 408 282 b 400 445 408 348 405 396 b 288 527 395 491 338 527 b 253 520 276 527 264 526 b 240 508 249 517 245 513 b 49 409 192 445 127 413 b 29 396 33 408 29 403 b 32 380 29 392 30 386 b 59 363 36 366 49 364 b 164 348 95 356 130 348 b 222 357 183 348 203 351 b 238 361 228 360 233 360 b 252 334 248 361 252 353 b 243 59 252 242 249 150 b 219 -490 229 -124 233 -307 b 264 -524 217 -516 232 -524 z', + }, + timeSig2: { + x_min: 20, + x_max: 660.4636303241031, + y_min: -378.7201231608281, + y_max: 382, + ha: 760.720123160828, + o: 'm 99 -543 b 130 -533 111 -550 121 -540 b 255 -448 168 -501 213 -475 b 338 -425 282 -431 310 -425 b 392 -431 356 -425 374 -426 b 485 -462 423 -438 454 -451 b 648 -497 540 -482 595 -497 b 834 -441 711 -497 773 -480 b 950 -242 906 -395 958 -334 b 942 -210 950 -230 950 -215 b 912 -220 932 -204 920 -213 b 861 -264 894 -235 877 -248 b 775 -317 835 -289 808 -305 b 675 -334 742 -328 708 -334 b 510 -295 619 -334 563 -318 b 372 -264 465 -278 420 -264 b 305 -272 350 -264 328 -266 b 331 -242 318 -256 324 -249 b 490 -73 386 -187 438 -131 b 675 340 595 43 664 180 b 677 369 677 350 677 360 b 556 536 677 461 638 508 b 468 550 526 546 497 550 b 297 508 409 550 353 533 b 111 354 220 475 168 412 b 29 197 65 308 29 261 b 32 164 29 187 29 176 b 29 140 33 157 29 147 b 43 125 29 132 32 125 b 73 147 55 125 65 138 b 86 163 79 153 82 158 b 238 320 134 219 183 272 b 425 389 292 367 360 389 b 575 341 480 389 531 373 b 606 298 590 330 606 317 b 600 278 606 292 603 285 b 501 107 576 217 544 158 b 304 -104 439 33 372 -35 b 111 -356 230 -180 167 -265 b 84 -446 92 -386 84 -415 b 86 -481 84 -458 85 -469 b 88 -514 88 -491 88 -503 b 99 -543 89 -526 91 -537 z', + }, + timeSig3: { + x_min: 19.824321427094187, + x_max: 540, + y_min: -392, + y_max: 392, + ha: 784, + o: 'm 216 -540 b 354 -564 264 -556 310 -564 b 605 -465 445 -564 530 -530 b 729 -161 697 -383 729 -275 b 724 -82 729 -135 727 -108 b 589 95 716 -1 670 62 b 523 114 567 102 546 108 b 750 418 606 213 677 315 b 778 503 769 444 778 472 b 773 540 778 514 776 527 b 750 564 769 557 762 564 b 736 562 746 564 742 563 b 641 552 704 553 672 552 b 402 554 562 552 481 554 l 346 554 b 84 546 258 554 170 554 b 36 501 55 543 40 531 b 29 412 30 472 32 442 b 52 384 27 393 32 384 l 56 384 b 210 392 107 389 158 392 l 602 392 b 354 108 523 285 445 192 b 246 -65 300 58 246 12 b 252 -108 246 -78 248 -92 l 252 -111 b 264 -141 251 -122 251 -135 b 291 -132 274 -145 284 -140 b 425 -72 328 -95 377 -84 b 475 -65 442 -68 459 -65 b 592 -108 517 -65 557 -79 b 645 -179 615 -125 645 -147 b 642 -194 645 -184 644 -189 b 485 -376 616 -278 569 -344 b 361 -399 444 -392 402 -399 b 151 -340 289 -399 219 -376 b 88 -275 122 -323 98 -310 b 71 -249 86 -268 85 -249 b 63 -251 68 -249 66 -249 b 36 -288 48 -255 36 -266 b 55 -423 33 -336 45 -377 b 101 -482 60 -448 78 -468 b 216 -540 138 -504 174 -526 z', + }, + timeSig4: { + x_min: 20, + x_max: 633.0785282750762, + y_min: -489.59088556716864, + y_max: 491.18559127100053, + ha: 980.7764768381692, + o: 'm 608 -704 b 641 -684 622 -708 634 -696 b 667 -602 660 -660 662 -631 b 685 -190 683 -465 680 -327 l 685 -176 b 831 -127 736 -166 783 -148 b 912 0 901 -94 913 -76 b 886 53 912 36 904 52 b 848 40 877 53 864 49 l 838 36 b 687 -13 789 14 739 -3 b 681 177 687 50 684 114 b 672 338 678 230 677 285 b 654 373 671 350 672 373 b 622 340 636 373 624 361 b 615 262 621 314 613 288 b 619 -22 616 167 619 72 b 569 -22 602 -23 585 -23 b 305 -3 481 -16 395 -1 b 210 -9 274 -3 242 -4 b 301 163 242 52 268 108 b 513 552 377 288 459 412 b 536 652 526 585 536 618 b 533 683 536 662 534 672 b 520 707 531 691 531 707 b 487 693 508 708 494 704 b 474 668 482 684 477 677 b 384 490 454 603 418 547 b 253 281 343 419 295 351 b 73 -13 194 181 145 78 b 29 -108 50 -42 29 -72 b 37 -147 29 -121 32 -134 b 50 -186 43 -160 50 -173 b 68 -216 52 -207 56 -215 b 92 -207 73 -216 82 -213 b 288 -166 156 -180 220 -166 b 556 -186 377 -166 467 -180 b 586 -189 566 -187 576 -187 b 616 -186 596 -189 606 -189 b 606 -432 613 -268 612 -350 b 596 -625 603 -495 596 -559 b 598 -670 596 -641 596 -655 b 608 -704 598 -683 596 -700 z', + }, + timeSig5: { + x_min: 19.663871085403297, + x_max: 583, + y_min: -389, + y_max: 389, + ha: 778, + o: 'm 132 -536 b 249 -560 168 -553 209 -559 b 507 -462 351 -560 454 -514 b 677 -183 588 -384 642 -289 b 694 -85 688 -150 694 -117 b 540 138 694 12 642 94 b 422 173 501 154 462 167 b 400 187 408 174 400 177 b 405 202 400 190 402 196 b 428 284 416 228 426 255 b 469 312 431 307 442 312 b 757 372 569 312 662 343 b 840 490 821 392 840 432 b 812 560 840 540 834 560 b 763 546 801 560 785 556 b 757 543 762 546 759 544 b 465 484 665 505 570 484 b 396 484 452 484 425 487 b 353 454 377 482 366 474 b 281 300 323 405 304 351 b 245 164 262 255 245 212 b 246 144 245 158 246 151 b 233 63 249 115 243 89 b 225 35 228 50 225 40 b 264 14 225 22 236 19 b 445 -26 325 7 387 0 b 569 -151 501 -52 547 -89 b 575 -180 573 -161 575 -170 b 527 -275 575 -217 547 -245 b 347 -367 484 -334 419 -367 b 261 -351 318 -367 289 -363 b 95 -300 206 -333 154 -307 b 55 -321 73 -297 65 -302 b 29 -468 29 -367 40 -419 b 56 -505 26 -482 36 -500 b 132 -536 82 -514 108 -524 z', + }, + timeSig6: { + x_min: 20, + x_max: 565, + y_min: -363, + y_max: 363, + ha: 726, + o: 'm 390 -518 b 621 -458 469 -507 549 -494 b 814 -134 753 -390 814 -281 b 652 59 814 -16 750 58 b 580 48 629 59 606 55 b 233 -334 392 -9 276 -138 b 115 -228 181 -314 143 -278 b 98 -160 104 -206 98 -183 b 107 -109 98 -144 101 -127 b 167 37 124 -59 145 -12 b 508 340 236 189 347 292 b 575 353 530 347 553 353 b 648 327 600 353 625 346 b 665 320 654 321 661 320 b 687 336 674 320 681 325 b 703 405 697 359 703 382 b 684 472 703 429 697 451 b 593 523 664 504 631 521 b 576 521 588 523 582 523 b 297 403 472 508 380 465 b 115 177 217 344 164 264 b 29 -121 60 82 29 -17 b 53 -278 29 -173 36 -225 b 226 -497 82 -374 131 -454 b 347 -523 265 -514 305 -523 b 390 -518 361 -523 376 -521 z m 351 -357 b 312 -351 337 -356 320 -363 b 325 -315 304 -340 320 -327 b 543 -120 373 -222 448 -158 b 622 -104 570 -108 596 -102 b 717 -132 655 -104 687 -112 b 740 -167 732 -143 740 -153 b 730 -196 740 -176 737 -184 b 563 -321 690 -258 634 -300 b 359 -357 497 -341 428 -354 z', + }, + timeSig7: { + x_min: 20.3617407597707, + x_max: 592, + y_min: -345, + y_max: 345, + ha: 690, + o: 'm 253 -497 b 318 -485 276 -497 297 -487 b 366 -441 348 -482 360 -468 b 487 -104 390 -323 433 -210 b 835 403 580 82 701 246 b 852 436 847 416 852 428 b 815 467 852 451 840 461 b 762 474 798 471 779 474 b 674 445 732 474 701 465 b 603 410 652 431 628 420 b 383 360 533 379 459 360 b 200 435 315 360 249 382 b 88 494 168 469 131 485 b 66 497 81 495 73 497 b 33 484 52 497 39 492 b 50 436 22 469 39 451 b 295 310 114 360 199 324 b 406 301 331 304 369 301 b 593 324 468 301 530 308 b 585 307 589 314 588 310 b 265 -249 451 137 338 -46 b 207 -442 242 -312 223 -377 b 204 -462 206 -449 204 -456 b 253 -497 204 -487 220 -497 z', + }, + timeSig8: { + x_min: 20, + x_max: 504.15101530718516, + y_min: -428, + y_max: 428, + ha: 856, + o: 'm 265 -616 b 289 -615 274 -616 281 -616 b 710 -271 492 -592 657 -485 b 726 -148 721 -229 727 -187 b 585 108 726 -48 687 42 b 572 127 576 114 573 120 b 576 144 572 132 575 138 b 598 301 590 196 598 249 b 586 413 598 338 593 376 b 356 616 559 531 467 616 b 233 582 317 616 275 606 b 29 233 101 505 29 384 b 104 9 29 153 46 72 b 189 -48 127 -16 160 -27 b 92 -158 141 -73 114 -114 b 37 -343 63 -217 50 -279 b 33 -390 35 -359 33 -374 b 265 -616 33 -524 148 -616 z m 258 105 b 124 148 215 105 167 117 b 96 196 105 163 96 177 b 99 217 96 202 96 209 b 197 384 120 281 151 337 b 350 451 242 429 297 451 b 516 364 412 451 472 422 b 530 331 523 354 530 343 l 530 327 l 530 320 b 468 151 520 261 507 200 b 419 122 455 135 442 125 b 258 105 370 117 320 105 z m 328 -438 b 158 -276 233 -436 160 -359 b 166 -239 158 -264 161 -252 b 230 -157 176 -203 202 -179 b 367 -72 274 -125 320 -98 b 448 -49 396 -56 423 -49 b 562 -118 491 -49 528 -72 b 611 -251 590 -157 611 -199 b 569 -341 611 -288 595 -318 b 328 -438 500 -402 416 -432 z', + }, + timeSig9: { + x_min: 20, + x_max: 494, + y_min: -421, + y_max: 421, + ha: 842, + o: 'm 235 -606 b 361 -564 275 -606 318 -593 b 619 -229 487 -482 566 -366 b 706 127 664 -114 694 4 b 711 233 708 163 711 197 b 700 346 711 271 708 308 b 389 606 658 517 530 606 b 351 605 376 606 364 606 b 56 272 171 586 56 441 b 96 98 56 216 69 156 b 334 -53 144 -3 238 -53 b 544 36 408 -53 484 -24 b 652 176 586 78 622 124 b 631 71 645 141 639 105 b 467 -302 599 -63 562 -196 b 271 -442 412 -364 354 -422 b 225 -448 255 -446 239 -448 b 95 -305 148 -448 98 -395 b 89 -255 95 -288 94 -271 b 73 -233 86 -246 85 -233 b 52 -248 65 -233 56 -239 b 29 -317 42 -271 30 -291 b 49 -448 29 -361 40 -405 b 235 -606 69 -541 144 -606 z m 340 104 b 144 209 264 108 194 141 b 127 258 132 225 127 240 b 137 297 127 271 130 284 b 366 449 184 396 269 449 b 517 408 415 449 467 436 b 595 348 546 392 572 372 b 616 305 608 336 616 321 b 609 281 616 298 613 289 b 340 104 557 184 477 104 z', + }, + timeSigCommon: { + x_min: 20, + x_max: 585, + y_min: -298, + y_max: 294.49658092772603, + ha: 592.496580927726, + o: 'm 444 -405 b 829 -45 626 -346 740 -207 b 842 26 842 -23 842 1 b 821 58 842 39 841 58 b 795 40 811 58 802 48 b 765 3 785 29 773 16 b 469 -223 690 -104 596 -183 b 354 -242 431 -235 392 -242 b 180 -177 292 -242 235 -223 b 135 -99 154 -157 140 -131 b 132 -59 134 -85 132 -72 b 141 7 132 -37 135 -16 b 449 274 189 160 297 243 b 477 278 459 276 468 276 b 546 203 517 278 539 253 b 517 157 550 177 533 166 b 485 143 507 153 497 143 l 482 143 b 467 148 478 143 472 144 b 374 183 438 170 406 181 b 264 118 333 183 292 161 b 238 48 246 92 238 69 b 261 -9 238 29 245 10 b 383 -73 287 -39 337 -73 b 412 -68 392 -73 402 -72 b 631 164 526 -27 586 59 b 649 252 644 193 649 222 b 636 328 649 278 645 304 b 504 423 615 400 579 429 b 242 318 408 415 317 387 b 29 -158 104 190 29 33 b 30 -176 29 -164 29 -170 b 115 -364 42 -246 52 -315 b 307 -429 177 -410 240 -429 b 444 -405 351 -429 397 -420 z', + }, + timeSigCutCommon: { + x_min: 20, + x_max: 695, + y_min: -687.0379164869064, + y_max: 687, + ha: 1374.0379164869064, + o: 'm 564 -989 b 595 -945 585 -991 589 -963 l 599 -922 b 605 -628 600 -824 603 -726 l 609 -399 b 878 -251 706 -363 798 -320 b 996 -85 932 -204 976 -153 b 1001 -63 998 -78 1001 -71 b 989 -46 1001 -56 998 -49 b 978 -43 985 -45 982 -43 b 950 -59 968 -43 959 -49 b 733 -216 894 -132 815 -177 b 611 -259 694 -235 652 -249 b 616 -20 612 -179 615 -99 b 680 29 642 -7 665 9 b 698 43 685 36 690 40 b 870 251 792 82 840 160 b 877 294 874 265 877 279 b 818 410 877 338 855 382 b 683 458 779 442 730 448 b 625 468 664 462 644 465 l 625 514 b 638 958 626 662 636 811 b 626 989 638 979 635 989 b 603 981 621 989 613 986 b 422 840 534 945 481 888 b 412 805 412 832 413 818 b 426 713 410 773 420 743 b 445 678 429 690 435 678 b 474 691 452 678 461 683 b 563 755 503 710 530 732 b 564 724 564 740 564 733 b 559 469 563 639 560 554 b 462 454 526 469 494 464 b 112 143 302 399 199 281 b 33 -94 66 71 45 -10 b 29 -148 30 -112 29 -131 b 105 -351 29 -223 52 -291 b 359 -455 171 -426 258 -451 b 517 -431 409 -451 464 -446 l 539 -422 l 539 -477 b 533 -739 536 -563 539 -651 b 530 -824 531 -768 530 -795 b 546 -948 530 -865 533 -907 b 564 -989 552 -962 543 -989 z m 410 -288 b 193 -197 328 -288 253 -264 b 141 -60 160 -161 141 -108 b 157 6 141 -35 147 -12 b 259 158 189 58 217 112 b 438 291 311 215 364 266 b 528 305 468 301 498 305 b 554 304 537 305 546 304 b 553 212 554 274 554 242 b 426 115 498 199 446 164 b 416 68 419 99 416 84 b 425 12 416 49 420 30 b 474 -39 432 -17 448 -32 b 513 -43 487 -42 498 -43 b 547 -40 524 -43 536 -42 l 543 -272 b 461 -285 516 -278 488 -281 b 410 -288 444 -287 426 -288 z m 694 197 b 668 203 685 197 677 199 b 621 216 654 210 638 215 b 622 294 622 242 622 268 b 706 268 651 287 678 278 b 746 235 721 261 734 249 b 752 222 749 230 752 226 b 743 213 752 219 749 215 b 694 197 727 206 711 197 z', + }, + timeSigPlus: { + x_min: 0, + x_max: 661, + y_min: -358, + y_max: 358, + ha: 716, + o: 'm 605 -516 b 629 -490 624 -516 629 -507 b 628 -475 629 -485 628 -481 b 613 -131 624 -405 616 -174 b 612 -96 612 -114 612 -96 l 647 -98 b 897 -115 730 -99 814 -109 b 940 -89 919 -117 935 -109 b 952 -24 946 -69 952 -46 b 948 9 952 -14 950 -3 b 912 39 942 26 933 37 b 609 60 822 48 609 60 b 616 392 609 60 608 291 b 567 488 619 436 605 467 b 511 516 550 498 531 514 b 498 511 507 516 503 514 b 478 446 475 501 480 469 b 467 150 474 348 469 249 b 465 59 465 121 465 59 l 372 49 b 73 14 272 36 173 24 b 49 13 65 13 56 13 b 0 -33 9 13 0 6 b 60 -141 0 -117 6 -140 b 112 -135 73 -141 91 -140 b 413 -102 213 -125 314 -112 b 464 -98 441 -99 464 -98 l 464 -145 b 477 -456 464 -249 468 -353 b 526 -510 478 -488 491 -507 b 589 -513 546 -511 569 -510 b 605 -516 595 -514 600 -516 z', + }, + timeSigPlusSmall: { + x_min: 0, + x_max: 418, + y_min: -197, + y_max: 199, + ha: 396, + o: 'm 301 -284 b 330 -238 320 -284 324 -255 b 348 -46 350 -176 341 -111 b 374 -20 351 -27 356 -23 b 481 -17 409 -16 445 -17 b 566 -9 510 -17 537 -16 b 602 3 579 -7 602 -16 b 566 29 602 19 582 24 b 526 33 553 32 539 33 b 384 39 478 36 432 39 b 356 62 363 39 356 42 l 356 68 b 359 177 359 104 359 141 l 359 251 b 341 287 359 264 361 285 b 311 255 324 287 314 272 b 310 228 311 246 310 236 l 301 69 b 275 39 301 49 295 39 l 271 39 b 210 40 251 40 230 40 b 167 39 196 40 181 40 b 89 40 141 37 115 40 b 24 30 68 40 46 37 b 0 17 17 27 0 30 l 0 13 b 27 -17 3 0 7 -13 b 91 -22 49 -22 71 -22 b 153 -22 115 -22 137 -20 l 275 -22 b 295 -40 289 -22 295 -27 l 295 -48 b 288 -235 288 -109 287 -171 b 287 -264 288 -243 287 -253 b 301 -284 287 -275 289 -284 z', + }, + timeSigMinus: { + x_min: 0, + x_max: 662, + y_min: -54, + y_max: 55, + ha: 109, + o: 'm 39 -78 b 49 -76 42 -78 45 -76 b 452 -75 94 -75 272 -75 b 861 -76 632 -75 814 -76 b 953 -20 927 -79 953 -66 b 948 27 953 -7 950 9 b 946 37 948 30 948 35 b 896 79 940 63 929 79 b 471 78 827 78 648 78 l 42 78 b 0 37 14 78 0 69 b 23 -66 0 0 17 -32 b 39 -78 24 -75 32 -76 z', + }, + timeSigParensRight: { + x_min: 0, + x_max: 274.26483738379414, + y_min: -722.6326530612245, + y_max: 725, + ha: 1447.6326530612246, + o: 'm 37 -1038 b 69 -1031 48 -1044 59 -1038 b 88 -1015 76 -1027 82 -1021 b 164 -886 120 -976 147 -933 b 333 -351 233 -711 292 -534 b 395 118 366 -204 399 -59 b 389 245 392 144 392 194 b 120 996 369 521 265 766 b 68 1044 99 1030 84 1044 b 19 988 50 1044 36 1024 b 0 922 7 965 0 945 b 20 858 0 901 6 881 b 259 215 141 660 236 449 b 271 -1 266 143 271 71 b 252 -239 271 -82 265 -161 b 148 -667 228 -384 183 -524 b 39 -1009 120 -785 66 -893 b 33 -1031 37 -1017 33 -1024 b 37 -1038 33 -1034 35 -1037 z', + }, + timeSigParensRightSmall: { + x_min: 0, + x_max: 154.4025307335204, + y_min: -422, + y_max: 422, + ha: 844, + o: 'm 43 -608 b 60 -598 48 -608 53 -605 b 117 -511 82 -572 102 -543 b 222 23 193 -350 219 -177 b 213 166 225 55 216 109 b 115 531 206 294 174 416 b 45 603 99 562 76 588 b 30 608 39 606 35 608 b 10 598 23 608 17 603 b 0 546 3 590 0 570 b 23 451 0 507 9 458 b 102 351 66 429 84 390 b 167 42 150 252 167 148 b 163 -49 167 12 166 -19 b 35 -449 151 -192 121 -330 b 14 -504 22 -467 14 -485 b 17 -527 14 -511 16 -520 l 30 -590 b 43 -608 33 -603 37 -608 z', + }, + timeSigParensLeft: { + x_min: 0.5555555555555556, + x_max: 399.6216117372966, + y_min: -728, + y_max: 728, + ha: 1456, + o: 'm 562 -1048 b 573 -1043 566 -1048 570 -1047 b 553 -988 582 -1025 564 -1004 b 472 -884 527 -952 497 -920 b 210 -354 366 -717 275 -541 b 148 -6 170 -240 148 -124 b 160 148 148 45 153 96 b 315 678 189 331 242 508 b 431 901 350 755 380 834 b 459 950 451 926 461 939 b 435 995 459 962 451 972 b 364 1048 405 1034 383 1048 b 305 996 343 1048 325 1028 b 127 624 226 881 174 753 b 1 30 56 432 9 235 b 1 -32 1 9 0 -12 b 180 -629 13 -245 92 -438 b 363 -936 230 -739 298 -835 b 526 -1041 402 -995 448 -1041 b 562 -1048 537 -1040 552 -1048 z', + }, + timeSigParensLeftSmall: { + x_min: 0, + x_max: 173.45497224367904, + y_min: -405, + y_max: 404, + ha: 809, + o: 'm 197 -583 b 222 -553 212 -582 219 -566 b 229 -497 226 -534 229 -516 b 213 -425 229 -472 225 -448 b 102 -177 173 -344 132 -262 b 62 30 78 -111 58 -42 b 91 183 66 82 75 134 b 215 426 118 271 156 356 b 249 552 246 465 252 505 b 230 582 249 563 246 582 b 197 563 219 582 206 576 b 71 356 144 500 105 429 b 0 50 26 259 3 158 b 13 -112 4 -3 7 -58 b 176 -559 29 -275 105 -416 b 196 -583 180 -569 186 -583 z', + }, + noteheadDoubleWhole: { + x_min: -0.4444444444444444, + x_max: 614.1875, + y_min: -223.03296670127517, + y_max: 223, + ha: 446.0329667012752, + o: 'm 35 -321 b 62 -266 58 -318 58 -288 l 62 -194 b 63 50 62 -114 63 -32 b 60 189 63 96 63 143 b 43 300 59 226 60 265 b 29 321 40 308 39 321 l 26 321 b 0 292 13 318 0 310 b 0 248 0 278 -1 262 b 6 147 4 215 6 181 b 4 48 6 114 4 81 b 6 0 4 32 6 16 b 7 -36 7 -12 7 -24 l 7 -52 b 6 -156 7 -86 6 -121 b 19 -275 6 -196 9 -236 b 35 -321 23 -291 16 -323 z m 847 -314 b 871 -288 860 -315 867 -300 b 884 -187 881 -255 886 -222 b 876 115 878 -86 876 14 b 877 255 876 161 876 209 b 868 291 877 268 873 279 b 855 304 867 301 863 304 b 844 301 852 304 848 304 b 822 265 825 292 822 278 b 824 251 822 259 822 255 b 822 170 822 225 822 197 l 822 -20 b 835 -284 827 -86 825 -186 b 847 -314 837 -295 835 -311 z m 757 -291 b 793 -171 796 -255 792 -212 b 795 -49 795 -131 795 -91 b 786 207 795 36 791 121 b 779 240 786 217 783 229 b 766 258 776 246 776 258 b 762 256 765 258 763 256 b 739 236 752 253 740 252 b 733 177 737 216 732 197 b 737 20 737 125 739 73 l 737 -107 b 740 -202 737 -138 739 -170 b 757 -291 740 -230 743 -261 z m 128 -261 b 144 -251 135 -264 141 -256 b 158 -203 156 -236 157 -220 b 161 -137 161 -181 161 -158 b 157 30 161 -81 157 -26 b 158 76 157 45 157 60 l 158 101 b 156 225 158 141 158 183 b 137 253 156 235 154 253 l 134 253 b 109 222 120 251 109 242 b 104 91 108 179 104 134 b 108 -58 104 42 109 -9 b 107 -105 108 -73 108 -89 b 105 -127 107 -112 107 -120 b 118 -245 105 -167 114 -204 b 128 -261 118 -252 121 -259 z m 488 -242 b 693 -79 595 -249 685 -166 l 693 -55 b 690 0 693 -36 691 -17 b 540 187 684 84 621 164 b 449 200 508 196 480 200 b 210 104 363 200 282 163 b 186 56 196 92 186 76 b 207 -82 186 9 192 -37 b 300 -204 225 -132 248 -181 b 488 -242 356 -229 415 -240 z m 490 -88 b 449 -86 477 -88 464 -88 b 287 -56 399 -85 341 -78 b 258 -33 275 -52 258 -48 b 282 -7 258 -20 272 -13 b 458 43 340 23 399 43 b 580 14 497 43 537 35 b 618 -20 606 1 619 -9 b 592 -58 618 -30 609 -42 b 490 -88 562 -82 528 -88 z', + }, + noteheadWhole: { + x_min: 0, + x_max: 380.16649762501584, + y_min: -186.17102907059297, + y_max: 165, + ha: 351.17102907059297, + o: 'm 547 40 b 223 -268 543 -151 367 -259 b 102 -233 180 -271 143 -248 l 62 -216 b 0 -127 22 -197 0 -166 b 6 -91 0 -115 1 -104 b 122 141 33 -9 69 71 b 327 238 170 204 249 238 b 514 158 397 238 467 212 b 547 40 544 125 549 84 z m 248 -107 b 384 -63 295 -102 341 -88 b 426 -23 402 -53 415 -40 b 435 3 432 -14 435 -6 b 413 32 435 14 428 24 b 301 73 376 49 343 73 b 272 69 291 73 282 72 b 121 -35 207 53 157 20 b 111 -58 117 -42 111 -50 b 125 -75 111 -65 115 -71 b 248 -107 164 -89 202 -107 z', + }, + noteheadHalf: { + x_min: 0, + x_max: 334, + y_min: -174, + y_max: 175, + ha: 349, + o: 'm 480 56 b 167 -251 478 -115 331 -251 b 94 -242 143 -251 118 -248 b 9 -141 43 -229 20 -192 b 0 -68 3 -115 0 -91 b 284 249 0 95 127 200 b 304 252 289 251 297 252 b 481 78 374 252 481 170 b 480 56 481 71 481 63 z m 213 -102 b 399 6 274 -81 341 -48 b 402 17 400 7 402 13 b 399 27 402 22 400 26 b 311 94 373 53 353 88 b 292 95 305 95 300 95 b 130 27 230 95 181 55 b 69 -62 98 9 62 -29 b 161 -98 76 -98 128 -91 b 213 -102 174 -101 186 -101 z', + }, + noteheadBlack: { + x_min: 0, + x_max: 334.04644433966797, + y_min: -164, + y_max: 164, + ha: 328, + o: 'm 112 -233 b 141 -236 122 -235 131 -236 b 481 104 279 -236 485 -48 b 403 222 477 141 478 192 b 334 236 382 232 359 236 b 1 -59 180 236 13 59 b 0 -85 1 -68 0 -76 b 112 -233 0 -157 32 -215 z', + }, + noteheadXWhole: { + x_min: 0, + x_max: 506, + y_min: -143.0823320899293, + y_max: 144, + ha: 287.0823320899293, + o: 'm 53 -206 b 219 -163 117 -207 170 -196 b 314 -102 249 -141 282 -122 b 377 -63 334 -89 356 -76 b 514 -161 422 -96 468 -128 b 576 -196 534 -174 552 -196 b 589 -193 580 -196 585 -196 b 688 -174 625 -194 657 -181 b 711 -158 698 -171 711 -173 b 696 -143 711 -151 701 -147 b 503 -9 632 -98 567 -52 l 485 4 b 704 145 559 49 634 95 b 729 164 711 150 729 151 l 729 168 b 696 196 726 183 710 193 b 621 207 671 202 645 207 b 528 177 589 207 557 200 b 373 76 480 140 426 108 b 246 164 330 104 287 132 b 122 206 207 193 167 203 b 66 192 102 207 72 207 b 99 147 58 173 85 158 b 274 14 157 102 215 58 b 16 -164 184 -42 96 -98 b 0 -179 12 -168 0 -170 b 1 -183 0 -180 0 -183 b 26 -204 6 -193 12 -204 b 53 -206 37 -206 49 -206 z m 611 -177 b 376 -9 530 -118 452 -63 l 164 -143 b 104 -164 147 -154 130 -164 b 82 -161 96 -164 89 -164 b 230 -65 137 -125 183 -95 l 347 12 b 327 26 341 16 334 22 l 196 121 b 163 147 184 128 173 137 b 140 173 154 154 140 163 b 143 180 140 176 141 177 b 179 166 154 194 167 174 l 372 27 l 566 153 b 613 171 580 161 596 170 b 635 160 624 171 635 174 b 621 147 635 153 626 150 l 429 24 b 400 6 419 19 409 13 b 569 -117 456 -35 513 -75 b 611 -177 588 -130 608 -143 z', + }, + noteheadXHalf: { + x_min: 0, + x_max: 421, + y_min: -145.51844828189743, + y_max: 151, + ha: 296.51844828189746, + o: 'm 490 -209 b 539 -207 505 -207 521 -207 b 606 -209 560 -207 583 -209 b 598 -196 602 -203 600 -199 l 406 -19 l 540 130 b 547 144 546 135 547 140 b 536 156 547 148 543 153 b 488 192 518 166 503 176 b 416 217 471 209 444 217 b 323 180 380 217 344 204 l 264 115 b 239 138 256 122 248 131 b 33 197 180 196 108 200 b 3 186 23 197 6 193 b 19 154 -1 174 10 163 b 171 12 69 107 120 59 b 19 -157 120 -45 69 -101 b 0 -177 14 -163 0 -166 b 1 -181 0 -179 0 -180 b 39 -203 9 -197 22 -203 l 186 -203 b 197 -202 190 -202 193 -200 l 213 -202 b 262 -180 228 -202 246 -199 l 314 -122 b 490 -209 363 -170 412 -216 z m 435 -148 b 291 -30 379 -112 337 -69 l 213 -118 b 190 -137 207 -125 202 -137 b 145 -111 173 -130 154 -127 b 160 -79 137 -98 151 -88 b 238 16 184 -48 212 -16 b 141 99 204 43 173 72 l 124 117 b 115 132 121 121 115 127 b 118 137 115 134 117 137 b 141 132 127 147 135 138 l 253 36 b 347 150 285 75 315 112 b 370 164 354 160 363 163 b 403 145 382 164 393 156 b 416 127 412 140 416 132 b 405 102 416 118 412 111 l 307 -10 b 413 -105 343 -42 379 -73 b 435 -148 425 -115 436 -125 z', + }, + noteheadXBlack: { + x_min: 0, + x_max: 289, + y_min: -156, + y_max: 157, + ha: 313, + o: 'm 23 -225 b 69 -204 40 -223 56 -219 b 137 -131 92 -180 115 -157 l 209 -50 b 377 -197 264 -101 321 -148 b 403 -210 384 -203 393 -210 l 408 -210 b 416 -192 416 -207 416 -199 l 416 -186 b 403 -148 416 -171 413 -158 b 344 -81 384 -125 367 -101 b 252 -1 312 -55 282 -29 b 377 157 297 49 340 101 b 402 202 387 170 402 187 b 395 217 402 207 400 213 b 376 226 389 223 382 226 b 334 192 360 226 346 204 b 206 42 289 143 248 94 b 96 161 167 81 131 120 b 60 193 86 174 76 189 b 33 206 52 196 42 206 b 22 199 29 206 26 204 b 10 173 14 190 10 181 b 22 147 10 166 14 157 b 148 7 62 98 104 52 b 164 -7 154 1 158 -3 b 10 -189 111 -66 55 -122 b 0 -212 6 -197 0 -203 b 1 -217 0 -213 0 -216 b 23 -225 4 -226 14 -222 z', + }, + noteheadCircleX: { + x_min: 0, + x_max: 344, + y_min: -179, + y_max: 175.12551922594866, + ha: 354.12551922594866, + o: 'm 99 -210 b 236 -258 137 -242 186 -258 b 418 -183 305 -258 374 -230 b 495 33 475 -120 495 -48 b 494 66 495 45 494 55 b 302 252 487 183 405 256 b 181 243 262 249 222 248 b 46 171 128 236 79 219 b 0 19 14 127 0 73 b 99 -210 0 -68 35 -156 z m 245 42 l 124 156 b 200 176 145 166 170 173 b 337 183 245 181 291 184 b 377 176 351 183 364 180 b 245 42 333 131 288 86 z m 392 -99 l 285 3 l 400 121 b 418 154 409 131 418 140 b 465 50 448 130 465 94 b 405 -112 462 -17 439 -73 z m 89 -120 b 48 0 56 -82 48 -42 b 89 112 48 35 59 76 b 109 101 96 111 102 108 l 210 7 l 187 -17 b 89 -120 151 -53 125 -82 z m 176 -183 b 127 -163 158 -179 141 -171 l 252 -32 l 372 -144 b 233 -189 334 -173 285 -189 b 176 -183 215 -189 196 -187 z', + }, + noteheadTriangleUpWhole: { + x_min: 0, + x_max: 366, + y_min: -145, + y_max: 138, + ha: 283, + o: 'm 504 -209 b 527 -199 520 -209 527 -206 b 520 -180 527 -193 524 -187 b 459 -94 501 -151 480 -122 b 279 170 400 -6 341 82 b 242 199 266 190 253 199 b 206 167 230 199 219 189 b 10 -145 140 63 76 -42 b 0 -171 3 -156 0 -164 b 23 -200 0 -183 9 -192 b 55 -209 33 -206 45 -209 z m 202 -161 b 176 -137 183 -163 176 -156 b 187 -62 176 -111 179 -86 b 253 95 206 -10 228 42 b 337 -132 307 24 334 -49 b 311 -161 338 -153 334 -161 b 256 -160 294 -161 275 -160 b 202 -161 238 -160 220 -161 z', + }, + noteheadTriangleUpHalf: { + x_min: 0, + x_max: 341.0833130378007, + y_min: -159, + y_max: 159, + ha: 318, + o: 'm 458 -226 b 478 -229 462 -223 469 -229 b 490 -222 482 -229 487 -228 b 477 -184 495 -207 484 -196 b 281 176 410 -65 346 56 b 238 225 269 194 261 213 b 225 229 232 226 228 228 b 209 215 217 229 213 225 b 4 -153 141 92 73 -30 b 0 -170 1 -158 0 -164 b 12 -189 0 -177 4 -183 b 66 -215 27 -202 43 -213 b 458 -226 194 -217 323 -222 z m 151 -167 b 298 75 204 -89 240 -1 b 301 82 300 76 301 79 l 357 -22 b 344 -43 353 -27 350 -37 b 285 -163 317 -79 312 -127 b 278 -170 282 -166 279 -167 z', + }, + noteheadTriangleUpBlack: { + x_min: 0, + x_max: 346, + y_min: -149, + y_max: 149, + ha: 298, + o: 'm 481 -215 b 498 -209 487 -215 492 -215 b 482 -173 498 -194 488 -184 l 284 173 b 259 202 278 184 269 194 b 229 215 248 210 238 215 b 196 189 216 215 206 206 l 13 -150 b 3 -168 9 -156 6 -163 b 0 -180 1 -173 0 -177 b 12 -197 0 -187 4 -193 b 63 -213 29 -206 45 -213 b 481 -215 203 -213 343 -215 z', + }, + noteheadDiamondWhole: { + x_min: 0, + x_max: 271, + y_min: -132, + y_max: 132, + ha: 264, + o: 'm 230 -177 b 256 -190 240 -186 249 -190 b 281 -173 265 -190 272 -184 b 382 -29 314 -124 347 -76 b 390 -10 387 -22 390 -14 b 376 12 390 -3 386 4 b 173 177 308 66 240 121 b 144 190 166 183 160 190 b 98 153 127 186 112 170 b 13 40 69 115 42 76 b 0 13 4 29 0 20 b 22 -19 0 3 7 -9 b 230 -177 92 -69 163 -122 z m 279 -128 b 261 -122 274 -134 266 -127 l 66 30 b 56 45 59 35 56 39 b 62 56 56 48 59 52 b 122 122 91 101 105 122 b 194 76 138 122 158 107 l 320 -26 b 336 -50 325 -32 336 -35 b 279 -128 318 -75 300 -102 z', + }, + noteheadDiamondHalf: { + x_min: 0, + x_max: 295, + y_min: -148, + y_max: 148, + ha: 296, + o: 'm 228 -207 b 245 -213 235 -210 240 -213 b 264 -203 252 -213 258 -210 b 415 -46 314 -150 364 -98 b 425 -27 420 -40 425 -35 b 416 -10 425 -22 422 -16 b 217 200 350 60 284 131 b 194 213 212 207 204 213 b 170 196 181 213 177 203 b 14 33 118 143 68 86 b 0 7 4 23 0 16 b 17 -20 0 -1 6 -10 b 118 -114 52 -50 82 -85 b 228 -207 156 -144 184 -184 z m 209 -157 b 134 -69 177 -138 141 -115 b 130 -26 131 -55 130 -40 b 215 148 130 42 160 99 b 225 156 217 151 220 156 b 230 153 226 156 228 156 b 323 -26 276 104 321 55 b 298 -75 324 -42 315 -59 b 265 -109 287 -86 276 -99 b 209 -157 245 -125 228 -167 z', + }, + noteheadDiamondBlack: { + x_min: 0, + x_max: 310, + y_min: -146, + y_max: 146, + ha: 292, + o: 'm 266 -210 b 289 -194 278 -209 284 -200 b 406 -76 330 -156 367 -115 b 446 -23 433 -49 446 -36 b 412 29 446 -10 435 3 b 405 36 409 30 408 33 b 252 196 354 89 304 143 b 225 210 243 204 235 210 b 204 202 219 210 212 209 b 10 24 141 141 75 82 b 0 9 4 19 0 14 b 9 -6 0 4 3 0 l 232 -192 b 266 -210 242 -200 256 -204 z', + }, + noteheadSquareWhite: { + x_min: 0, + x_max: 350, + y_min: -131, + y_max: 131, + ha: 262, + o: 'm 468 -189 b 485 -187 474 -189 480 -189 b 500 -176 495 -187 500 -183 b 498 -168 500 -174 498 -171 b 497 -166 498 -167 497 -167 l 498 -164 b 504 -154 503 -163 504 -158 b 503 -138 504 -150 503 -144 l 503 -135 l 503 -94 b 492 66 500 -45 494 10 b 488 135 492 89 488 112 b 484 150 488 141 485 145 b 482 154 482 151 482 153 b 429 189 472 177 456 189 b 53 184 304 186 179 186 l 39 184 b 33 181 36 183 35 183 b 12 160 20 181 12 177 b 0 -109 9 71 4 -19 b 19 -137 0 -125 7 -134 b 23 -151 19 -141 20 -145 b 85 -187 37 -173 55 -187 b 468 -189 212 -187 340 -187 z m 246 -125 l 63 -125 b 66 -111 65 -122 66 -117 b 73 72 69 -50 71 10 l 73 130 b 88 128 78 128 82 128 b 148 130 108 130 128 130 b 271 128 190 130 230 128 l 271 130 l 420 130 b 428 20 425 92 425 56 l 436 -127 l 246 -127 z', + }, + noteheadSquareBlack: { + x_min: 0, + x_max: 342, + y_min: -129.98961937716263, + y_max: 132.44444444444446, + ha: 262.4340638216071, + o: 'm 217 190 b 439 186 304 190 372 190 b 467 180 448 184 458 183 b 492 145 484 176 492 167 b 490 -124 490 56 490 -33 b 488 -141 490 -130 488 -135 b 456 -170 488 -163 478 -168 b 118 -183 344 -176 230 -181 b 29 -184 89 -183 60 -192 b 0 -148 4 -180 0 -168 b 1 29 1 -89 1 -30 l 1 156 b 36 190 3 187 4 190 b 217 190 102 192 168 190 z', + }, + noteheadParenthesis: { + x_min: -70.190112022022, + x_max: 329, + y_min: -196, + y_max: 201, + ha: 397, + o: 'm 344 -279 b 382 -262 361 -288 370 -272 b 405 -233 390 -255 399 -245 b 474 9 455 -158 468 -73 b 416 228 474 78 448 174 b 364 282 403 249 387 271 b 344 289 359 285 350 288 b 331 279 338 289 333 287 b 325 248 328 269 325 258 b 338 225 325 238 328 229 b 412 138 379 207 396 174 b 445 1 433 92 445 45 b 346 -217 445 -81 410 -154 b 336 -252 340 -223 336 -238 b 344 -279 336 -265 338 -276 z m 19 -274 b 35 -282 24 -279 30 -281 b 49 -265 42 -282 46 -275 b 52 -243 50 -256 52 -249 b 36 -210 52 -230 49 -220 b -60 -59 -16 -173 -35 -114 b -73 9 -69 -39 -73 -16 b 33 223 -73 92 -24 189 b 50 265 43 229 50 249 b 33 288 50 278 46 289 b 4 272 23 288 14 275 b -9 261 0 269 -4 265 b -101 23 -58 193 -105 124 b -37 -206 -104 -52 -75 -130 b 19 -274 -23 -232 -6 -255 z', + }, + noteheadParenthesisRight: { + x_min: -30, + x_max: 82, + y_min: -199.08429092881173, + y_max: 206, + ha: 405.0842909288117, + o: 'm -17 -282 b 24 -264 -6 -297 12 -272 b 60 -219 40 -253 52 -236 b 117 1 96 -150 112 -75 b 118 16 118 6 118 12 b 109 73 118 36 112 55 b 4 279 99 154 68 226 b -23 297 -4 287 -13 297 b -37 289 -27 297 -32 294 b -43 266 -42 285 -43 276 b -32 225 -43 251 -37 229 b 84 -7 48 170 84 82 b 32 -184 84 -69 65 -132 b -10 -222 22 -200 4 -209 b -24 -258 -20 -232 -24 -245 b -17 -282 -24 -266 -22 -276 z', + }, + noteheadParenthesisLeft: { + x_min: 0, + x_max: 106, + y_min: -197, + y_max: 197, + ha: 394, + o: 'm 134 -284 b 138 -281 135 -284 137 -284 b 145 -268 144 -278 145 -274 l 144 -253 b 107 -180 138 -225 121 -204 b 42 13 71 -120 42 -56 b 49 73 42 32 43 52 b 137 210 62 128 95 171 b 153 255 147 219 153 239 b 145 278 153 265 151 274 b 130 284 140 281 135 284 b 98 259 117 284 108 268 b 0 37 35 203 1 131 b 118 -268 9 -69 53 -173 b 134 -284 121 -274 127 -284 z', + }, + augmentationDot: { + x_min: 0, + x_max: 96, + y_min: -57, + y_max: 57, + ha: 114, + o: 'm 13 -82 b 16 -81 14 -82 14 -82 b 105 -73 46 -76 75 -76 b 131 -48 121 -72 131 -60 b 138 26 134 -24 138 0 b 137 48 138 33 138 40 b 108 82 134 71 125 82 b 95 81 104 82 99 82 b 33 71 75 78 53 75 b 4 46 20 68 6 62 b 0 -66 1 9 0 -29 b 13 -82 0 -73 1 -82 z', + }, + tremolo1: { + x_min: -158, + x_max: 156.19381479578487, + y_min: -88, + y_max: 88, + ha: 176, + o: 'm -206 -127 b -194 -125 -203 -127 -199 -127 b 173 -36 -72 -94 50 -65 b 220 16 202 -29 215 -12 b 225 50 223 30 225 45 b 216 107 226 76 222 91 b 194 127 210 120 204 127 b 183 124 192 127 189 127 l -192 33 b -226 -9 -213 27 -222 14 b -228 -32 -226 -16 -228 -23 b -222 -108 -228 -58 -222 -82 b -206 -127 -222 -120 -217 -127 z', + }, + flag8thUp: { + x_min: 0, + x_max: 261, + y_min: -819, + y_max: 0, + ha: 819, + o: 'm 265 -1171 b 351 -1035 301 -1130 336 -1087 b 376 -867 369 -979 376 -923 b 367 -755 376 -829 373 -792 b 233 -422 350 -632 311 -520 b 131 -291 199 -379 166 -334 b 65 -125 91 -239 66 -192 b 62 -75 65 -112 62 -91 b 42 0 62 -49 52 -24 l 35 0 b 0 -63 6 -13 0 -36 l 0 -144 b 96 -445 0 -255 29 -356 b 177 -547 124 -478 150 -514 b 308 -831 246 -629 298 -721 b 317 -890 310 -851 317 -871 b 311 -919 317 -900 315 -910 b 256 -1005 297 -950 282 -984 b 228 -1068 233 -1024 228 -1045 b 230 -1106 228 -1080 229 -1093 b 240 -1162 232 -1125 239 -1143 b 251 -1179 242 -1174 246 -1179 b 265 -1171 255 -1179 259 -1176 z', + }, + flag8thDown: { + x_min: 0, + x_max: 261, + y_min: 0, + y_max: 819, + ha: 819, + o: 'm 265 1171 b 251 1179 259 1176 255 1179 b 240 1162 246 1179 242 1174 b 230 1106 239 1143 232 1125 b 228 1068 229 1093 228 1080 b 256 1005 228 1045 233 1024 b 311 919 282 984 297 950 b 317 890 315 910 317 900 b 308 831 317 871 310 851 b 177 547 298 721 246 629 b 96 445 150 514 124 478 b 0 144 29 356 0 255 l 0 63 b 35 0 0 36 6 13 l 42 0 b 62 75 52 24 62 49 b 59 117 62 91 59 104 b 131 291 60 183 91 239 b 233 422 166 334 199 379 b 367 755 311 520 350 632 b 376 867 373 792 376 829 b 351 1035 376 923 369 979 b 265 1171 336 1087 301 1130 z', + }, + flag16thUp: { + x_min: 0, + x_max: 327.1591498636094, + y_min: -819.3972596310256, + y_max: 0, + ha: 819.3972596310256, + o: 'm 415 -1179 b 435 -1168 423 -1182 429 -1174 b 451 -1138 442 -1159 446 -1149 b 465 -1020 464 -1102 467 -1064 b 461 -962 464 -1004 464 -984 b 471 -821 467 -916 472 -870 b 465 -721 472 -791 467 -756 b 415 -520 459 -651 441 -585 b 200 -245 370 -408 284 -327 b 96 -114 160 -206 118 -168 b 75 -24 84 -85 85 -53 b 59 0 72 -16 72 0 b 53 -1 58 0 56 -1 b 27 -32 40 -6 27 -10 b 29 -68 27 -43 29 -55 b 10 -79 20 -69 13 -72 b 1 -109 6 -89 1 -99 b 0 -170 0 -130 0 -148 b 35 -410 0 -252 12 -333 b 258 -793 76 -557 156 -681 b 409 -1158 350 -896 410 -1014 b 415 -1179 409 -1165 405 -1175 z m 413 -816 b 331 -681 392 -769 364 -723 b 145 -420 266 -596 189 -521 b 86 -281 125 -374 102 -330 b 156 -370 105 -312 128 -343 b 318 -539 210 -425 269 -478 b 413 -816 383 -621 420 -713 z', + }, + flag16thDown: { + x_min: 0, + x_max: 327.1591498636094, + y_min: 0, + y_max: 819, + ha: 819, + o: 'm 59 0 b 75 24 72 0 72 16 b 96 114 85 53 84 85 b 200 245 118 168 160 206 b 415 520 284 327 370 408 b 465 721 441 585 459 651 b 471 821 467 756 472 791 b 461 962 472 870 467 916 b 465 1020 464 984 464 1004 b 451 1138 467 1064 464 1102 b 435 1168 446 1149 442 1159 b 418 1179 431 1172 425 1179 l 415 1179 b 408 1169 409 1176 408 1174 b 409 1158 408 1165 409 1161 b 258 793 410 1014 350 896 b 35 410 156 681 76 557 b 0 170 12 333 0 252 l 0 88 b 29 7 0 71 6 23 b 59 0 33 4 58 0 z m 86 281 b 145 420 102 330 125 374 b 331 681 189 521 266 596 b 413 816 364 723 392 769 b 415 791 413 808 415 799 b 318 539 415 698 377 613 b 156 370 269 478 210 425 b 86 281 128 343 105 312 z', + }, + flag32ndUp: { + x_min: -0.19862981551275186, + x_max: 268.0942440943661, + y_min: -849.4710740978672, + y_max: 149.0769891455102, + ha: 998.5480632433774, + o: 'm 323 -1223 b 351 -1198 337 -1227 344 -1210 b 359 -1184 354 -1194 356 -1188 b 386 -999 377 -1122 387 -1060 b 341 -783 386 -927 372 -855 b 330 -736 334 -769 330 -753 b 333 -708 330 -727 330 -717 b 344 -621 340 -678 344 -649 b 341 -579 344 -608 343 -593 b 328 -500 338 -553 328 -526 b 331 -475 328 -491 328 -484 b 347 -370 343 -438 348 -402 b 151 27 348 -212 288 -56 b 53 176 98 59 50 102 b 45 197 53 183 48 192 b 33 215 40 203 40 216 l 30 215 b 6 194 22 212 9 209 b 0 120 3 170 -1 145 b 0 -43 4 65 0 13 b 0 -98 0 -60 1 -79 b 4 -276 0 -157 6 -216 b 7 -456 4 -337 7 -397 b 66 -638 7 -523 22 -585 b 158 -724 94 -671 127 -697 b 318 -1011 246 -801 295 -899 b 321 -1044 321 -1021 321 -1032 b 312 -1152 321 -1080 312 -1116 b 317 -1192 312 -1165 314 -1179 b 323 -1223 320 -1202 311 -1220 z m 285 -376 b 121 -180 249 -289 173 -245 b 91 -105 104 -158 92 -135 b 288 -354 181 -144 288 -269 b 285 -376 288 -363 287 -370 z m 275 -657 b 111 -492 226 -589 163 -547 b 65 -376 78 -456 66 -418 b 71 -323 65 -360 68 -341 b 275 -657 164 -418 265 -504 z', + }, + flag32ndDown: { + x_min: -2.800802874905624, + x_max: 268.09424409436605, + y_min: -169.07698914551014, + y_max: 829.4710740978672, + ha: 998.5480632433773, + o: 'm 323 1194 b 317 1164 311 1191 320 1174 b 312 1123 314 1151 312 1136 b 321 1015 312 1087 321 1051 b 318 982 321 1004 321 992 b 158 696 295 870 246 772 b 66 609 127 668 94 642 b 7 428 22 556 7 494 b 4 248 7 369 4 308 b -1 78 6 187 -10 137 b 0 14 0 59 0 32 l 0 -148 b 6 -223 0 -174 3 -199 b 30 -243 9 -238 22 -240 l 33 -243 b 45 -226 40 -245 40 -232 b 53 -204 48 -220 53 -212 b 151 -56 50 -131 98 -88 b 347 341 288 27 348 183 b 331 446 348 373 343 409 b 328 471 328 455 328 462 b 341 550 328 497 338 524 b 344 592 343 564 344 579 b 333 680 344 621 340 649 b 330 707 330 688 330 698 b 341 755 330 724 334 740 b 386 971 372 827 386 899 b 359 1155 387 1031 377 1093 b 351 1169 356 1159 354 1165 b 323 1194 344 1181 337 1198 z m 275 628 b 71 294 265 475 164 389 b 65 347 68 312 65 331 b 111 464 66 389 78 428 b 275 628 163 518 226 560 z m 285 347 b 288 325 287 341 288 334 b 91 76 288 240 181 115 b 121 151 92 107 104 130 b 285 347 173 216 249 261 z', + }, + flag64thUp: { + x_min: -4, + x_max: 282, + y_min: -823.5430338167067, + y_max: 347, + ha: 1170.5430338167066, + o: 'm 350 -1185 b 380 -1162 364 -1189 374 -1175 b 406 -1022 399 -1119 406 -1071 b 359 -798 406 -945 384 -871 b 348 -756 353 -785 348 -772 b 350 -744 348 -753 350 -749 b 363 -621 356 -704 363 -664 b 360 -580 363 -608 363 -593 b 359 -560 359 -573 359 -567 b 373 -490 359 -536 366 -513 b 393 -346 386 -444 393 -395 b 387 -269 393 -320 390 -294 b 348 -127 382 -219 348 -173 b 351 -104 348 -120 348 -111 b 353 -65 351 -91 353 -78 b 341 37 353 -26 348 6 b 226 215 323 108 278 164 b 86 336 181 258 127 288 b 62 395 72 353 62 370 b 42 481 62 423 55 454 b 27 500 37 488 36 500 b 24 498 26 500 26 500 b -1 480 14 497 1 492 b -6 444 -4 467 -6 455 l -6 435 b -1 341 -1 403 -1 372 l -1 266 b 6 156 -1 230 0 193 b 13 35 12 117 13 75 l 13 -35 b 14 -85 13 -52 14 -68 b 29 -276 19 -150 33 -213 b 20 -448 24 -334 20 -392 b 24 -534 20 -477 22 -505 b 114 -708 30 -605 59 -664 b 197 -780 143 -732 171 -755 b 344 -1153 301 -884 341 -1011 b 343 -1172 344 -1159 343 -1166 b 350 -1185 343 -1176 344 -1182 z m 287 -88 b 62 193 186 -17 79 48 b 229 52 121 144 174 98 b 289 -33 256 29 274 -3 b 295 -56 294 -42 295 -49 b 287 -88 295 -66 292 -76 z m 298 -410 b 118 -235 238 -351 176 -295 b 76 -88 82 -197 78 -147 b 268 -252 137 -153 203 -202 b 330 -360 304 -279 330 -315 b 323 -402 330 -373 327 -387 b 311 -418 318 -413 315 -418 b 298 -410 307 -418 302 -415 z m 300 -691 b 117 -508 243 -616 168 -575 b 82 -408 94 -480 82 -448 b 84 -379 82 -397 82 -387 b 259 -553 135 -451 206 -492 b 301 -667 287 -583 301 -619 b 300 -691 301 -674 301 -683 z', + }, + flag64thDown: { + x_min: -5, + x_max: 281, + y_min: -375, + y_max: 795.5430338167066, + ha: 1170.5430338167066, + o: 'm 348 1145 b 341 1132 343 1142 341 1136 b 343 1113 341 1126 343 1119 b 196 740 340 971 300 844 b 112 668 170 714 141 691 b 23 494 58 624 29 564 b 19 408 20 465 19 436 b 27 236 19 351 23 294 b 13 45 32 173 17 109 b 12 -6 13 27 12 12 l 12 -75 b 4 -196 12 -115 10 -157 b -3 -307 -1 -233 -3 -271 l -3 -382 b -7 -475 -3 -412 -3 -444 l -7 -484 b -3 -520 -7 -495 -6 -507 b 23 -539 0 -533 13 -537 b 26 -540 24 -540 24 -540 b 40 -521 35 -540 36 -528 b 60 -435 53 -494 60 -464 b 85 -376 60 -410 71 -393 b 225 -255 125 -328 180 -298 b 340 -78 276 -204 321 -148 b 351 24 347 -46 351 -14 b 350 63 351 37 350 50 b 347 86 347 71 347 79 b 386 229 347 132 380 179 b 392 305 389 253 392 279 b 372 449 392 354 384 403 b 357 520 364 472 357 495 b 359 540 357 527 357 533 b 361 580 361 553 361 567 b 348 704 361 624 354 664 b 347 716 348 708 347 713 b 357 757 347 732 351 744 b 405 982 383 831 405 904 b 379 1122 405 1031 397 1079 b 348 1145 373 1135 363 1149 z m 298 651 b 300 626 300 642 300 634 b 258 513 300 579 285 543 b 82 338 204 452 134 410 b 81 367 81 347 81 357 b 115 468 81 408 92 439 b 298 651 167 534 242 576 z m 297 370 b 310 377 301 374 305 377 b 321 361 314 377 317 373 b 328 320 325 347 328 333 b 266 212 328 275 302 239 b 75 48 202 161 135 112 b 117 194 76 107 81 157 b 297 370 174 255 236 311 z m 285 48 b 294 16 291 36 294 26 b 288 -7 294 9 292 1 b 228 -92 272 -37 255 -69 b 60 -233 173 -138 120 -184 b 285 48 78 -88 184 -23 z', + }, + flag128thUp: { + x_min: 0, + x_max: 252, + y_min: -804, + y_max: 530, + ha: 1334, + o: 'm 298 -1158 b 328 -1126 312 -1158 320 -1139 b 330 -1116 330 -1123 330 -1119 b 347 -996 343 -1076 347 -1037 b 328 -837 347 -943 338 -890 b 320 -778 324 -816 320 -798 b 330 -733 320 -763 323 -749 b 340 -665 338 -714 337 -688 b 341 -645 340 -660 341 -652 b 333 -534 341 -609 333 -572 b 343 -471 333 -513 334 -492 b 361 -366 356 -436 361 -402 b 331 -202 361 -311 348 -256 b 328 -187 330 -197 328 -193 b 331 -179 328 -184 328 -181 b 363 -55 353 -137 363 -96 b 337 79 363 -12 351 33 b 327 114 333 92 327 104 b 344 144 327 124 331 132 b 359 174 353 150 357 163 b 361 228 360 193 361 210 b 243 517 361 337 325 435 b 147 596 213 546 179 569 b 75 708 111 626 75 655 b 62 744 75 723 68 733 b 50 763 58 752 58 763 b 46 762 49 763 48 762 b 17 742 36 757 22 757 b 0 697 14 726 0 711 b 1 595 0 662 3 631 b 0 469 0 552 0 511 b 1 429 0 456 0 442 b 22 289 6 382 22 337 b 24 128 22 238 24 184 b 22 66 24 108 23 86 b 19 -19 20 37 19 10 b 20 -132 19 -56 20 -95 b 13 -276 20 -180 19 -229 b 9 -359 10 -304 9 -330 b 12 -487 9 -402 12 -445 b 56 -582 12 -526 29 -554 b 197 -742 107 -632 160 -681 b 288 -1100 265 -851 276 -976 b 288 -1122 288 -1107 287 -1115 b 287 -1145 289 -1129 287 -1138 b 298 -1158 287 -1153 288 -1158 z m 304 150 b 75 475 229 256 112 334 b 304 150 233 357 305 287 z m 271 -73 b 127 72 233 -14 179 26 b 81 167 96 98 81 127 b 84 194 81 176 82 184 b 271 -73 148 102 242 39 z m 279 -396 b 132 -223 233 -330 180 -279 b 81 -112 104 -192 81 -156 b 82 -91 81 -105 81 -98 b 279 -396 167 -125 269 -281 z m 249 -609 b 69 -357 197 -520 88 -471 b 249 -609 131 -441 229 -498 z', + }, + flag128thDown: { + x_min: -0.8888888888888888, + x_max: 252, + y_min: -580, + y_max: 754, + ha: 1334, + o: 'm 298 1086 b 287 1073 288 1086 287 1081 b 288 1050 287 1066 289 1057 b 288 1028 287 1043 288 1035 b 197 670 276 904 265 779 b 56 510 160 609 107 560 b 12 415 29 482 12 454 b 9 287 12 373 9 330 b 13 204 9 258 10 232 b 20 60 19 157 20 108 b 19 -53 20 23 19 -16 b 22 -138 19 -82 20 -109 b 24 -200 23 -158 24 -180 b 22 -361 24 -256 22 -310 b 1 -501 22 -409 6 -454 b 0 -541 0 -514 0 -528 b 0 -667 0 -583 -3 -624 b 0 -809 0 -675 -3 -791 b 46 -834 4 -825 36 -829 b 50 -835 48 -834 49 -835 b 62 -816 58 -835 58 -824 b 75 -780 68 -805 75 -795 b 147 -668 75 -727 111 -698 b 243 -589 179 -641 213 -618 b 361 -300 325 -507 361 -409 b 359 -246 361 -282 360 -265 b 344 -216 357 -235 353 -222 b 327 -186 331 -204 327 -196 b 337 -151 327 -176 333 -164 b 363 -17 351 -105 363 -60 b 331 107 363 24 353 65 b 328 115 328 109 328 112 b 331 130 328 121 330 125 b 361 294 348 184 361 239 b 343 399 361 330 356 364 b 333 462 334 420 333 441 b 341 573 333 500 341 537 b 340 593 341 580 340 588 b 330 661 337 616 338 642 b 320 706 323 677 320 691 b 328 765 320 726 324 744 b 347 924 338 818 347 871 b 330 1044 347 965 343 1004 b 328 1054 330 1047 330 1051 b 298 1086 320 1067 312 1086 z m 249 537 b 69 285 229 426 131 369 b 249 537 88 399 197 448 z m 279 324 b 82 19 269 209 167 53 b 81 40 81 26 81 33 b 132 151 81 84 104 120 b 279 324 180 207 233 258 z m 271 1 b 84 -266 242 -111 148 -174 b 81 -239 82 -256 81 -248 b 127 -144 81 -199 96 -170 b 271 1 179 -98 233 -58 z m 304 -222 b 75 -547 305 -359 233 -429 b 304 -222 112 -406 229 -328 z', + }, + accidentalFlat: { + x_min: 1, + x_max: 209, + y_min: -208, + y_max: 472, + ha: 680, + o: 'm 29 -300 b 46 -289 33 -300 39 -297 b 107 -243 65 -274 86 -258 b 301 127 233 -153 301 -30 b 298 186 301 147 301 166 b 190 297 291 256 251 297 b 147 289 177 297 163 294 b 86 265 127 284 107 274 l 85 264 l 85 301 b 91 465 85 356 88 410 b 94 559 91 497 94 527 b 84 651 94 589 91 621 b 66 680 81 661 81 680 l 65 680 b 37 645 49 678 37 665 b 33 523 36 605 32 563 l 33 478 b 26 223 33 393 29 308 b 1 -141 22 101 1 -19 b 17 -287 1 -189 4 -239 b 29 -300 20 -295 23 -300 z m 68 -105 b 76 12 71 -68 72 -29 b 81 107 79 43 81 75 l 86 109 b 171 135 114 121 141 135 b 204 128 181 135 193 132 b 238 92 228 120 239 108 b 230 63 238 84 236 75 b 68 -105 193 -10 132 -59 z', + }, + accidentalNatural: { + x_min: 0, + x_max: 213.5, + y_min: -456, + y_max: 462, + ha: 918, + o: 'm 255 -657 b 281 -624 271 -657 275 -636 b 285 -599 282 -615 285 -608 b 292 -300 288 -500 289 -400 b 289 -161 292 -253 289 -207 b 300 128 292 -65 297 32 b 304 168 300 128 302 150 l 304 173 l 305 190 l 305 199 l 307 225 b 304 259 307 229 310 246 b 272 298 297 274 302 305 b 63 266 204 279 134 272 b 72 514 68 348 72 432 b 71 595 72 541 72 567 b 56 665 71 619 66 642 b 17 579 9 651 17 608 b 3 144 19 433 7 289 b 0 -7 1 94 0 43 b 3 -134 0 -50 1 -92 b 7 -219 3 -163 7 -192 b 35 -251 7 -243 17 -251 b 49 -249 39 -251 43 -251 l 223 -223 l 230 -222 l 230 -359 b 223 -516 230 -410 223 -464 b 236 -619 223 -550 226 -585 b 255 -657 240 -634 236 -657 z m 58 -63 b 55 81 56 -14 53 33 l 56 99 b 85 99 65 99 75 98 b 232 108 134 104 183 107 l 240 109 l 236 66 b 232 -48 235 29 232 -10 b 58 -81 174 -63 115 -73 z', + }, + accidentalSharp: { + x_min: -22, + x_max: 390, + y_min: -384, + y_max: 383, + ha: 767, + o: 'm 202 -553 b 219 -526 213 -552 216 -536 b 226 -471 225 -507 226 -488 b 225 -425 226 -455 225 -441 b 226 -392 225 -415 225 -402 b 233 -305 229 -363 232 -334 l 297 -292 b 331 -469 300 -353 311 -412 b 347 -485 333 -477 338 -485 b 363 -469 356 -487 359 -477 b 374 -418 373 -454 374 -435 b 376 -382 376 -405 376 -393 b 372 -276 376 -347 373 -311 l 455 -259 b 550 -156 534 -243 544 -232 b 550 -109 550 -137 552 -124 b 526 -78 549 -91 541 -78 l 523 -78 b 507 -79 517 -78 513 -78 b 403 -101 474 -88 438 -95 l 379 -105 b 382 -42 380 -85 380 -63 b 384 96 383 4 384 50 b 503 131 425 107 464 118 b 549 173 524 138 543 150 b 562 249 554 199 562 223 b 554 294 562 264 560 279 b 536 315 549 308 544 315 l 533 315 b 517 312 528 315 523 315 b 382 266 472 294 428 279 l 377 344 b 359 531 374 406 372 469 b 348 552 356 539 357 552 l 347 552 l 343 552 b 315 528 331 549 317 544 l 315 501 b 320 249 315 416 318 333 l 243 232 b 239 361 243 275 242 318 b 226 425 238 383 238 403 b 199 359 194 409 199 382 b 193 223 196 312 194 268 b 72 202 153 215 112 209 b 4 118 13 192 4 183 b 10 66 0 102 12 84 b 33 29 7 39 14 30 b 48 32 37 29 42 30 b 187 55 95 39 141 46 l 183 -75 b 176 -145 181 -99 179 -122 b 16 -179 122 -156 69 -166 b -32 -232 -14 -186 -32 -197 b -17 -331 -32 -266 -19 -298 b -1 -356 -17 -347 -13 -354 b 12 -353 1 -356 6 -354 b 167 -320 63 -341 115 -331 b 166 -377 166 -338 166 -357 b 189 -526 166 -428 171 -477 b 202 -553 192 -536 189 -553 z m 240 -132 b 243 -37 242 -101 242 -69 b 245 65 245 -3 245 30 b 315 79 269 69 292 73 b 301 -120 308 13 305 -53 z', + }, + accidentalDoubleSharp: { + x_min: 0, + x_max: 287, + y_min: -159, + y_max: 159, + ha: 318, + o: 'm 84 -229 b 107 -216 91 -229 98 -225 b 200 -125 138 -186 167 -154 b 232 -95 212 -115 222 -105 b 347 -189 271 -125 310 -157 b 370 -200 356 -196 363 -200 b 396 -179 380 -200 389 -192 b 412 -102 410 -154 406 -125 b 377 -27 410 -69 400 -46 l 325 14 b 402 91 350 42 374 68 b 413 127 410 96 413 107 b 382 200 409 148 397 176 b 350 229 370 220 360 229 b 314 210 340 229 328 223 b 274 174 300 199 285 187 b 212 104 252 151 232 128 b 92 187 173 132 132 161 b 78 193 86 192 82 193 b 68 190 75 193 72 193 b 48 179 62 186 53 187 b 40 137 43 168 40 154 b 81 16 40 92 56 32 b 107 -3 89 10 98 4 b 14 -94 76 -32 45 -62 b 0 -124 6 -102 0 -114 b 12 -154 0 -134 3 -144 b 62 -215 26 -176 48 -193 b 84 -229 69 -225 76 -229 z', + }, + accidentalDoubleFlat: { + x_min: 0, + x_max: 359, + y_min: -220, + y_max: 446, + ha: 666, + o: 'm 43 -317 b 72 -301 55 -317 63 -310 b 160 -186 108 -268 134 -226 b 236 -60 186 -145 212 -102 b 233 -131 235 -85 233 -108 b 239 -220 233 -161 235 -190 b 259 -246 240 -233 239 -240 b 301 -228 284 -252 291 -238 b 465 -7 369 -163 416 -85 b 517 173 500 48 517 108 b 451 307 517 229 505 284 b 409 315 436 312 422 315 b 331 287 382 315 356 305 b 311 274 324 282 320 274 l 310 274 l 310 566 b 305 621 310 585 312 603 b 294 642 301 628 305 642 l 292 642 b 264 622 282 641 266 636 b 253 575 259 606 256 590 b 246 418 248 523 246 471 b 248 243 246 360 248 302 l 248 187 b 164 238 220 225 193 238 b 85 213 140 238 112 226 b 84 229 85 220 84 225 b 86 315 85 258 86 287 b 81 528 86 386 82 458 b 71 582 81 547 78 566 b 56 603 66 590 68 603 l 53 603 b 23 580 40 600 26 598 b 19 537 20 566 19 552 b 20 514 19 530 19 521 b 26 390 24 472 26 432 b 14 66 26 282 16 174 b 0 -168 13 -12 0 -91 b 12 -279 0 -206 3 -242 b 30 -314 16 -294 14 -308 b 43 -317 35 -317 39 -317 z m 301 -72 b 302 7 302 -45 302 -19 l 302 86 b 351 158 304 121 321 145 b 383 166 361 163 373 166 b 435 143 402 166 419 157 b 445 127 441 138 445 132 b 441 114 445 122 444 118 b 301 -72 397 49 354 -14 z m 75 -147 b 73 30 75 -86 75 -29 b 118 82 73 62 92 76 b 132 84 124 84 128 84 b 190 52 156 84 174 69 b 193 40 192 49 193 45 b 192 33 193 37 193 35 b 75 -147 157 -30 125 -95 z', + }, + accidentalParensLeft: { + x_min: 0, + x_max: 130.18934911242604, + y_min: -270, + y_max: 267.6082500723851, + ha: 537.6082500723851, + o: 'm 107 -389 b 127 -374 114 -389 120 -384 b 141 -347 132 -367 137 -357 b 151 -294 148 -330 151 -311 b 122 -207 151 -265 141 -236 b 63 -65 94 -164 72 -117 b 59 -10 60 -46 59 -27 b 145 223 59 78 94 153 b 187 354 176 262 189 305 b 177 384 187 364 190 380 b 143 373 166 387 153 383 b 124 354 137 367 130 361 b 0 -35 33 240 0 108 l 0 -92 b 85 -372 4 -193 27 -287 b 107 -389 92 -383 99 -389 z', + }, + accidentalParensRight: { + x_min: -0.4444444444444445, + x_max: 139, + y_min: -275, + y_max: 277, + ha: 552, + o: 'm 58 -396 b 96 -354 75 -396 85 -370 b 200 13 168 -238 200 -111 b 153 268 200 109 184 190 b 49 392 131 320 101 364 b 26 399 40 397 33 399 b 0 366 10 399 0 387 b 0 318 -1 350 0 334 l 0 291 b 27 238 -3 266 7 253 b 143 9 105 180 143 98 b 141 -20 143 -1 143 -10 b 63 -225 135 -92 108 -164 b 36 -307 45 -251 36 -278 b 40 -344 36 -320 37 -331 b 42 -356 42 -347 42 -351 b 58 -396 42 -374 37 -396 z', + }, + accidentalQuarterToneFlatStein: { + x_min: 0, + x_max: 208, + y_min: -240, + y_max: 440, + ha: 680, + o: 'm 272 -346 b 284 -333 278 -346 281 -341 b 300 -187 297 -285 300 -235 b 275 177 300 -65 279 55 b 268 432 272 262 268 347 l 268 477 b 264 599 269 517 265 559 b 236 634 264 619 252 632 l 235 634 b 217 605 220 634 220 615 b 207 513 210 575 207 543 b 210 419 207 481 210 451 b 216 255 213 364 216 310 l 216 217 l 215 219 b 154 243 194 228 174 238 b 111 251 138 248 124 251 b 3 140 50 251 10 210 b 0 81 0 120 0 101 b 194 -289 0 -76 68 -199 b 255 -336 215 -304 236 -320 b 272 -346 262 -343 268 -346 z m 233 -151 b 71 17 168 -105 108 -56 b 63 46 65 29 63 37 b 96 82 62 62 73 73 b 130 89 108 86 120 89 b 215 63 160 89 187 75 l 220 60 b 225 -35 220 29 222 -3 b 233 -151 229 -75 230 -114 z', + }, + accidentalThreeQuarterTonesFlatZimmermann: { + x_min: 0, + x_max: 422, + y_min: -240, + y_max: 440, + ha: 680, + o: 'm 272 -346 b 284 -333 278 -346 281 -341 b 300 -187 297 -285 300 -235 b 275 177 300 -65 279 55 b 268 432 272 262 268 347 l 268 477 b 264 599 269 517 265 559 b 236 634 264 619 252 632 l 235 634 b 217 605 220 634 220 615 b 207 513 210 575 207 543 b 210 419 207 481 210 451 b 216 255 213 364 216 310 l 216 217 l 215 219 b 154 243 194 228 174 238 b 111 251 138 248 124 251 b 3 140 50 251 10 210 b 0 81 0 120 0 101 b 194 -289 0 -76 68 -199 b 255 -336 215 -304 236 -320 b 272 -346 262 -343 268 -346 z m 336 -346 b 353 -336 340 -346 346 -343 b 413 -289 372 -320 393 -304 b 608 81 540 -199 608 -76 b 605 140 608 101 608 120 b 497 251 598 210 557 251 b 454 243 484 251 469 248 b 393 219 433 238 413 228 l 392 217 l 392 255 b 397 419 392 310 395 364 b 400 513 397 451 400 481 b 390 605 400 543 397 575 b 373 634 387 615 387 634 l 372 634 b 344 599 356 632 344 619 b 340 477 343 559 338 517 l 340 432 b 333 177 340 347 336 262 b 308 -187 328 55 308 -65 b 324 -333 308 -235 311 -285 b 336 -346 327 -341 330 -346 z m 233 -151 b 71 17 168 -105 108 -56 b 63 46 65 29 63 37 b 96 82 62 62 73 73 b 130 89 108 86 120 89 b 215 63 160 89 187 75 l 220 60 b 225 -35 220 29 222 -3 b 233 -151 229 -75 230 -114 z m 374 -151 b 383 -35 377 -114 379 -75 b 387 60 386 -3 387 29 l 393 63 b 478 89 420 75 448 89 b 511 82 488 89 500 86 b 544 46 534 73 546 62 b 537 17 544 37 543 29 b 374 -151 500 -56 439 -105 z', + }, + accidentalQuarterToneSharpStein: { + x_min: 0, + x_max: 300, + y_min: -338, + y_max: 351, + ha: 689, + o: 'm 194 -487 b 225 -432 215 -469 223 -452 b 238 -232 229 -366 236 -298 b 377 -199 285 -220 331 -209 b 418 -164 397 -193 410 -181 b 432 -88 428 -138 432 -114 b 412 -42 432 -55 428 -42 b 389 -46 406 -42 399 -43 l 235 -85 b 233 -20 235 -63 233 -42 b 233 105 232 22 233 63 b 312 121 259 111 285 117 b 406 226 390 134 400 145 b 373 284 409 268 402 284 b 344 281 364 284 356 282 b 232 258 307 276 269 266 b 230 308 232 275 232 291 b 210 505 229 374 232 441 b 183 471 189 501 184 490 b 180 406 181 449 180 428 b 184 246 180 353 184 300 b 48 222 140 236 94 228 b 0 168 6 216 0 209 b 7 86 1 141 4 114 b 27 66 9 73 13 66 l 35 66 b 184 94 85 66 135 84 b 187 -1 184 62 186 30 b 190 -96 189 -33 190 -65 l 112 -114 b 35 -213 27 -132 35 -132 b 33 -253 35 -226 35 -240 b 49 -276 33 -269 37 -276 b 62 -275 52 -276 56 -276 l 186 -245 l 186 -256 b 179 -387 180 -300 177 -343 b 194 -487 180 -419 179 -454 z', + }, + accidentalThreeQuarterTonesSharpStein: { + x_min: -23, + x_max: 388, + y_min: -373, + y_max: 445, + ha: 818, + o: 'm 114 -537 b 138 -475 137 -518 138 -495 b 147 -292 138 -413 144 -353 b 212 -278 168 -287 190 -282 b 243 -444 215 -333 225 -389 b 261 -467 248 -454 251 -465 b 281 -446 272 -469 276 -455 b 292 -347 292 -416 288 -384 b 288 -262 289 -320 288 -291 l 374 -245 b 376 -311 374 -266 374 -288 b 390 -456 379 -357 379 -405 b 416 -396 412 -436 415 -418 b 423 -287 420 -360 423 -323 b 422 -235 423 -269 423 -252 b 451 -229 432 -233 441 -232 b 547 -98 524 -215 547 -199 l 547 -89 b 521 -49 546 -59 540 -49 b 497 -52 516 -49 507 -49 b 418 -68 469 -56 444 -63 b 423 52 419 -29 422 12 b 426 140 425 81 425 109 b 495 160 449 145 472 153 b 552 219 526 170 546 189 b 559 279 557 240 553 262 b 530 341 559 324 552 341 b 490 331 520 341 507 338 b 432 311 471 324 452 318 b 449 552 436 392 442 471 b 452 588 451 563 452 575 b 446 622 452 599 451 611 b 436 641 444 629 448 641 b 418 628 428 641 420 636 b 409 602 413 621 410 611 b 386 297 396 501 390 399 b 297 274 356 288 327 281 b 291 403 295 317 294 360 b 274 550 288 452 284 501 b 259 569 271 564 265 569 b 240 559 253 569 248 563 b 230 537 232 554 230 546 l 230 488 b 233 369 230 448 232 409 b 236 261 236 333 238 297 b 156 245 210 255 183 251 b 154 396 154 295 154 346 b 150 416 154 403 153 410 b 140 438 145 423 150 438 l 138 438 b 118 413 128 436 118 428 b 112 354 118 393 114 374 b 109 238 109 315 109 276 b 49 226 89 233 69 230 b 3 163 16 222 3 202 b 7 91 3 138 9 114 b 29 62 7 69 13 62 b 39 63 32 62 35 63 b 104 73 60 66 82 71 b 101 -10 104 46 102 17 l 92 -132 l 10 -150 b -33 -204 -19 -157 -33 -170 b -19 -310 -32 -240 -19 -274 b -6 -324 -19 -321 -13 -324 b 6 -323 -1 -324 1 -324 b 82 -307 32 -317 58 -311 b 81 -376 82 -330 81 -353 b 114 -537 81 -431 94 -484 z m 294 -92 b 297 -37 295 -73 295 -56 b 300 49 300 -9 300 20 l 300 108 b 379 127 325 114 353 120 b 374 -76 376 59 374 -9 b 294 -92 347 -82 320 -86 z m 154 -120 b 157 20 154 -73 156 -26 b 158 82 158 40 158 62 b 230 95 183 86 206 89 b 225 0 229 63 226 32 b 217 -107 223 -35 220 -71 z', + }, + accidentalBuyukMucennebFlat: { + x_min: 1.8692317181955784, + x_max: 287, + y_min: -248, + y_max: 432.4720949426819, + ha: 680.4720949426819, + o: 'm 410 128 b 302 239 403 199 363 239 b 259 232 289 239 275 236 b 199 207 239 226 219 216 l 197 206 l 197 243 l 197 251 b 347 317 248 272 298 295 b 376 347 360 324 372 334 b 389 435 387 376 393 405 b 348 454 384 462 377 465 b 202 387 300 432 251 409 b 203 408 203 395 203 402 l 203 431 b 347 490 252 451 300 469 b 376 517 360 495 372 505 b 389 599 387 546 393 572 b 348 616 384 625 377 628 l 203 556 b 196 593 202 569 199 582 b 179 622 193 603 193 622 l 177 622 b 150 588 161 621 150 608 b 147 533 150 570 148 552 b 29 488 108 517 69 503 b 3 455 12 482 3 472 b 12 353 1 422 9 389 b 145 408 56 372 101 389 b 145 363 145 392 145 377 l 29 315 b 3 281 12 310 3 298 b 12 170 1 245 9 209 l 141 226 b 138 166 140 206 138 186 b 114 -199 134 43 115 -76 b 130 -344 114 -246 117 -297 b 141 -357 132 -353 135 -357 b 158 -347 145 -357 151 -354 b 219 -301 177 -331 199 -315 b 413 69 346 -210 413 -88 b 410 128 413 89 413 108 z m 350 35 b 343 6 350 26 348 17 b 180 -163 308 -69 245 -117 b 189 -46 183 -125 184 -86 b 193 49 192 -14 193 17 l 199 52 b 284 78 226 63 253 78 b 317 71 294 78 305 75 b 350 35 340 62 351 50 z', + }, + accidentalBakiyeFlat: { + x_min: 1.8692317181955784, + x_max: 287, + y_min: -236, + y_max: 444, + ha: 680, + o: 'm 141 -340 b 158 -330 145 -340 151 -337 b 219 -284 177 -314 199 -298 b 413 86 346 -193 413 -71 b 410 145 413 107 413 125 b 302 256 403 216 363 256 b 259 249 289 256 275 253 b 199 225 239 243 219 233 l 197 223 l 197 261 b 199 334 197 285 199 310 b 347 406 249 357 298 382 b 376 439 360 413 372 425 b 390 516 384 465 390 490 b 389 537 390 523 390 530 b 372 564 384 556 382 564 b 348 557 367 564 359 562 b 204 487 300 537 253 510 b 206 518 206 497 206 507 b 196 611 206 549 203 580 b 179 639 193 621 193 639 l 177 639 b 150 605 161 638 150 625 b 145 482 148 564 144 523 l 145 458 b 29 405 107 439 68 420 b 3 366 12 397 3 386 b 12 243 1 325 9 287 b 143 307 56 265 99 285 l 138 183 b 114 -181 134 60 114 -59 b 130 -327 114 -229 117 -279 b 141 -340 132 -336 135 -340 z m 180 -145 b 189 -29 183 -108 184 -69 b 193 66 192 3 193 35 l 199 69 b 284 95 226 81 253 95 b 317 88 294 95 305 92 b 350 52 340 79 351 68 b 343 23 350 43 348 35 b 180 -145 305 -50 245 -99 z', + }, + accidentalKomaSharp: { + x_min: 0, + x_max: 300, + y_min: -338, + y_max: 351, + ha: 689, + o: 'm 194 -487 b 225 -432 215 -469 223 -452 b 238 -232 229 -366 236 -298 b 377 -199 285 -220 331 -209 b 418 -164 397 -193 410 -181 b 432 -88 428 -138 432 -114 b 412 -42 432 -55 428 -42 b 389 -46 406 -42 399 -43 l 235 -85 b 233 -20 235 -63 233 -42 b 233 105 232 22 233 63 b 312 121 259 111 285 117 b 406 226 390 134 400 145 b 373 284 409 268 402 284 b 344 281 364 284 356 282 b 232 258 307 276 269 266 b 230 308 232 275 232 291 b 210 505 229 374 232 441 b 183 471 189 501 184 490 b 180 406 181 449 180 428 b 184 246 180 353 184 300 b 48 222 140 236 94 228 b 0 168 6 216 0 209 b 7 86 1 141 4 114 b 27 66 9 73 13 66 l 35 66 b 184 94 85 66 135 84 b 187 -1 184 62 186 30 b 190 -96 189 -33 190 -65 l 112 -114 b 35 -213 27 -132 35 -132 b 33 -253 35 -226 35 -240 b 49 -276 33 -269 37 -276 b 62 -275 52 -276 56 -276 l 186 -245 l 186 -256 b 179 -387 180 -300 177 -343 b 194 -487 180 -419 179 -454 z', + }, + accidentalKucukMucennebSharp: { + x_min: -0.15206251809627475, + x_max: 359, + y_min: -420, + y_max: 343, + ha: 763, + o: 'm 236 -605 b 262 -543 256 -583 261 -564 b 269 -423 268 -503 269 -464 b 266 -340 269 -396 268 -367 l 361 -318 b 405 -276 384 -312 399 -298 b 413 -189 412 -248 416 -219 b 395 -164 412 -171 409 -164 b 382 -166 392 -164 387 -164 b 264 -193 343 -176 304 -184 b 269 -102 265 -163 268 -132 b 454 -62 331 -89 392 -78 b 501 -23 477 -58 494 -45 b 517 62 511 6 517 33 b 487 112 517 95 513 112 b 471 111 482 112 477 112 b 274 66 406 95 340 81 b 276 138 275 91 276 114 b 350 154 301 144 325 148 b 402 203 377 160 396 176 b 412 284 408 230 412 258 b 392 311 412 302 406 311 b 372 308 386 311 379 310 b 287 291 343 301 314 297 l 295 405 b 298 441 297 416 298 428 b 292 475 298 452 297 464 b 282 494 289 482 294 494 b 264 481 274 494 266 490 b 255 455 259 474 256 464 b 239 282 248 397 243 340 b 148 268 209 278 179 274 b 62 164 62 252 62 253 l 62 132 b 79 108 60 117 65 108 l 86 108 l 230 130 b 229 92 230 118 229 105 b 228 56 228 79 228 68 b 66 20 173 43 120 32 b 0 -59 6 7 3 1 l 0 -138 b 14 -160 -1 -156 4 -160 b 27 -158 19 -160 23 -160 b 222 -112 92 -141 157 -127 b 220 -203 220 -143 220 -173 b 147 -217 196 -207 171 -213 b 89 -288 92 -228 89 -229 b 95 -347 85 -305 96 -325 b 112 -374 92 -366 98 -374 b 125 -373 117 -374 121 -374 l 220 -351 b 222 -458 220 -386 220 -422 b 236 -605 223 -504 225 -552 z', + }, + accidentalKoron: { + x_min: 0, + x_max: 303, + y_min: -462.4598053473055, + y_max: 180, + ha: 642.4598053473055, + o: 'm 59 -665 b 72 -649 69 -662 72 -657 b 69 -626 72 -642 69 -634 b 69 -622 69 -625 69 -624 l 69 -600 b 55 -156 60 -456 68 -311 b 86 -170 66 -166 76 -170 b 112 -163 95 -170 104 -166 b 390 -35 204 -120 298 -78 b 436 -1 409 -27 436 -27 b 396 46 436 22 413 33 l 382 55 b 46 243 271 121 157 179 b 12 259 29 253 17 259 b 0 219 1 259 0 248 b 3 -372 0 22 3 -176 b 6 -616 3 -454 6 -536 b 59 -665 6 -638 40 -671 z m 55 199 b 363 24 156 141 258 84 b 55 -118 259 -24 160 -69 z', + }, + accidentalSori: { + x_min: 0, + x_max: 434, + y_min: -295, + y_max: 325, + ha: 620, + o: 'm 194 -425 b 196 -409 194 -418 196 -413 b 194 -194 196 -337 196 -266 b 364 -127 251 -171 308 -150 b 361 -321 363 -192 364 -256 b 410 -387 360 -357 373 -377 b 413 -373 412 -382 413 -377 b 418 -114 418 -287 418 -200 l 418 -105 b 595 -35 477 -82 536 -59 b 625 0 612 -27 625 -22 b 593 48 624 23 618 39 l 419 117 b 423 370 419 202 423 285 b 426 403 423 382 426 393 b 418 436 426 415 425 426 b 384 468 409 449 399 468 b 369 448 370 468 369 459 b 369 436 369 444 369 441 l 369 428 l 369 423 b 367 138 369 328 367 233 l 353 143 l 192 207 l 192 367 b 173 406 192 383 184 396 b 151 422 167 413 160 422 b 144 420 148 422 147 422 b 137 403 138 416 137 410 l 137 392 l 137 229 b 33 271 102 243 68 256 b 13 276 26 274 19 276 b 0 262 6 276 0 272 b 35 199 1 239 0 212 l 138 160 b 140 -148 138 58 138 -45 b 56 -181 111 -158 84 -170 b 24 -215 35 -189 24 -199 b 29 -235 24 -220 26 -228 b 49 -253 35 -249 42 -253 b 78 -240 59 -253 69 -243 b 140 -216 98 -233 120 -225 l 140 -356 b 194 -425 140 -406 141 -406 z m 194 -125 b 193 138 194 -37 193 50 b 315 89 233 122 275 107 b 366 71 333 84 350 76 b 364 -58 366 27 366 -16 b 194 -125 308 -81 251 -104 z m 419 49 l 526 7 l 485 -10 l 419 -36 z', + }, + articAccentAbove: { + x_min: 0, + x_max: 425, + y_min: 0, + y_max: 326, + ha: 326, + o: 'm 27 1 b 78 12 46 0 62 6 b 347 112 168 45 253 91 b 521 184 409 128 459 167 b 608 259 557 194 589 220 b 612 274 611 265 612 271 b 598 292 612 281 608 287 b 477 347 559 312 518 331 b 176 465 374 384 275 425 b 156 469 168 468 161 469 b 125 456 145 469 137 465 b 53 370 96 432 78 399 b 45 353 48 363 45 357 b 68 333 45 344 52 337 b 360 225 166 298 262 261 b 192 154 302 203 249 171 b 13 36 120 132 53 105 b 0 13 9 29 0 22 l 0 9 b 16 0 3 1 10 0 l 26 0 b 27 1 27 0 27 0 z', + }, + articAccentBelow: { + x_min: 0, + x_max: 425, + y_min: -326, + y_max: 0, + ha: 326, + o: 'm 26 -469 l 27 -469 b 78 -458 46 -469 62 -464 b 347 -357 168 -426 253 -380 b 521 -285 409 -341 459 -302 b 608 -210 557 -276 589 -249 b 612 -196 611 -204 612 -200 b 598 -179 612 -189 608 -183 b 477 -122 559 -157 518 -138 b 176 -4 374 -85 275 -45 b 156 0 168 -1 161 0 b 125 -13 145 0 137 -4 b 53 -99 96 -37 78 -71 b 45 -117 48 -107 45 -112 b 68 -137 45 -125 52 -132 b 360 -245 166 -171 262 -209 b 192 -315 302 -266 249 -300 b 13 -433 120 -337 53 -366 b 0 -456 9 -442 0 -448 l 0 -461 b 16 -469 3 -468 10 -469 z', + }, + articTenutoAbove: { + x_min: 0.35192668236256364, + x_max: 471.1238660564107, + y_min: 0, + y_max: 56, + ha: 56, + o: 'm 137 0 b 197 1 156 0 179 1 b 409 6 268 1 338 6 b 482 4 432 6 459 6 b 556 0 508 3 534 0 b 651 10 588 0 621 3 b 678 27 662 12 678 10 b 654 59 680 45 672 53 b 511 75 606 73 560 73 b 255 81 426 78 341 81 b 160 79 222 81 193 79 l 36 79 b 1 71 24 78 7 85 b 19 32 -3 56 9 43 b 45 16 26 24 36 20 b 137 0 76 3 108 0 z', + }, + articTenutoBelow: { + x_min: 0.35192668236256364, + x_max: 471.1238660564107, + y_min: -59, + y_max: -3, + ha: 56, + o: 'm 137 -85 b 197 -84 156 -85 179 -84 b 409 -79 268 -84 338 -79 b 482 -81 432 -79 459 -79 b 556 -85 508 -82 534 -85 b 651 -75 588 -85 621 -82 b 678 -58 662 -73 678 -75 b 654 -26 680 -40 672 -32 b 511 -10 606 -12 560 -12 b 255 -4 426 -7 341 -4 b 160 -6 222 -4 193 -6 l 36 -6 b 1 -14 24 -7 7 0 b 19 -53 -3 -29 9 -42 b 45 -69 26 -60 36 -65 b 137 -85 76 -82 108 -85 z', + }, + articStaccatoAbove: { + x_min: 1.4151102965496913, + x_max: 112, + y_min: 0, + y_max: 156, + ha: 156, + o: 'm 98 0 b 132 23 109 0 122 7 b 161 112 150 50 161 79 b 158 148 161 124 161 137 b 125 186 154 167 131 167 b 63 225 117 215 85 216 b 23 197 45 222 30 219 b 3 91 12 163 12 127 b 19 66 0 79 4 69 b 65 27 40 62 53 46 b 98 0 76 9 88 0 z', + }, + articStaccatoBelow: { + x_min: 1.4151102965496913, + x_max: 112.08403222864916, + y_min: -156, + y_max: 0, + ha: 156, + o: 'm 132 -202 b 161 -112 151 -174 163 -145 b 158 -76 161 -101 161 -88 b 125 -39 153 -58 131 -58 b 63 0 115 -10 85 -9 b 23 -27 45 -3 30 -6 b 3 -134 12 -62 10 -98 b 19 -158 0 -145 4 -156 b 65 -197 40 -164 53 -179 b 98 -225 75 -216 88 -225 b 132 -202 109 -225 122 -217 z', + }, + articStaccatissimoAbove: { + x_min: 0, + x_max: 139, + y_min: 0, + y_max: 411, + ha: 411, + o: 'm 104 0 b 144 115 143 29 138 75 b 197 423 158 217 180 320 b 200 454 199 433 200 444 b 181 540 200 482 193 513 b 112 592 167 573 141 592 b 55 567 92 592 72 585 b 0 490 32 546 3 527 l 0 484 b 27 279 14 416 14 347 b 84 20 43 193 52 104 b 96 0 86 13 92 6 z', + }, + articStaccatissimoBelow: { + x_min: 0, + x_max: 139, + y_min: -411, + y_max: 0, + ha: 411, + o: 'm 88 -592 b 145 -567 108 -592 128 -585 b 200 -490 168 -546 197 -527 l 200 -484 b 173 -279 186 -416 186 -347 b 117 -20 157 -193 148 -104 b 104 0 114 -13 108 -6 l 96 0 b 56 -115 58 -29 62 -75 b 3 -423 42 -217 20 -320 b 0 -454 1 -433 0 -444 b 19 -540 0 -482 7 -513 b 88 -592 33 -573 59 -592 z', + }, + articMarcatoAbove: { + x_min: 0.04121419527862119, + x_max: 396, + y_min: 0, + y_max: 328.0000000000001, + ha: 328.0000000000001, + o: 'm 477 0 b 510 13 488 0 500 6 b 570 124 546 40 563 81 b 547 183 570 147 560 166 b 356 422 487 265 405 330 b 346 442 354 429 350 436 l 346 444 b 318 465 340 456 330 464 l 312 469 b 274 449 294 480 284 461 b 242 413 262 438 253 425 b 56 196 177 343 112 274 b 1 56 26 154 13 105 b 27 20 -4 35 9 20 b 42 23 32 20 37 20 b 84 53 59 29 72 39 b 255 269 141 125 193 200 b 275 229 262 255 266 242 b 448 14 324 151 390 86 b 477 0 456 4 467 0 z', + }, + articMarcatoBelow: { + x_min: 0, + x_max: 395.9587858047214, + y_min: -328.0000000000001, + y_max: 0, + ha: 328.0000000000001, + o: 'm 258 -469 b 297 -449 276 -480 287 -461 b 328 -413 308 -438 317 -425 b 514 -196 393 -343 458 -274 b 569 -56 544 -154 557 -105 b 543 -20 575 -35 562 -20 b 528 -23 539 -20 533 -20 b 487 -53 511 -29 498 -39 b 315 -269 429 -125 377 -200 b 295 -229 308 -255 304 -242 b 122 -14 246 -151 180 -86 b 94 0 114 -4 104 0 b 60 -13 82 0 71 -6 b 0 -124 24 -40 7 -81 b 23 -183 0 -147 10 -166 b 215 -422 84 -265 166 -330 b 225 -442 216 -429 220 -436 l 225 -444 b 252 -465 230 -456 240 -464 z', + }, + fermataAbove: { + x_min: -0.04550444040404433, + x_max: 472, + y_min: 2.015071727506986, + y_max: 454, + ha: 451.984928272493, + o: 'm 39 10 b 78 108 66 37 71 73 b 163 311 92 181 111 252 b 284 423 199 353 239 392 b 373 458 312 444 340 454 b 433 431 395 458 410 446 b 603 153 530 361 596 276 b 595 121 603 144 595 131 l 595 88 b 602 50 596 75 589 55 b 639 73 619 43 631 60 b 651 102 645 82 648 92 b 667 194 660 132 662 163 b 680 278 671 222 672 248 b 560 567 680 386 638 481 b 396 654 508 625 452 649 b 291 632 364 654 325 644 b 161 526 235 613 200 566 b 4 249 85 446 26 357 b 4 174 0 222 -3 196 b 10 19 4 124 4 69 b 29 4 12 6 16 0 b 39 10 35 4 33 4 z m 338 37 b 370 40 350 36 357 36 b 380 75 387 40 380 43 b 389 94 382 79 382 85 b 356 132 389 111 374 122 b 269 154 328 147 300 156 b 225 125 252 154 228 157 b 261 48 222 81 232 56 b 338 37 287 40 312 40 z', + }, + fermataBelow: { + x_min: -0.310835055998654, + x_max: 518.570567335755, + y_min: -430, + y_max: -0.9161449836506543, + ha: 429.08385501634933, + o: 'm 344 -615 b 500 -543 402 -602 452 -576 b 713 -253 605 -471 661 -364 b 746 -98 737 -204 750 -153 b 727 -59 744 -82 744 -59 b 688 -88 711 -59 694 -68 b 678 -109 687 -96 683 -102 b 562 -314 648 -183 611 -252 b 387 -439 516 -373 458 -416 b 328 -449 367 -446 347 -449 b 180 -386 274 -449 225 -423 b 69 -179 111 -330 69 -262 b 75 -121 69 -160 71 -141 b 84 -58 78 -101 84 -79 b 82 -39 84 -52 84 -45 b 68 -1 79 -26 82 -4 b 26 -32 49 0 33 -12 b 20 -52 24 -39 22 -45 b 0 -223 9 -107 -3 -161 b 141 -553 1 -348 27 -468 b 304 -619 192 -590 243 -619 b 344 -615 317 -619 330 -618 z m 415 -190 b 435 -157 429 -192 435 -184 b 308 -27 435 -86 379 -27 b 271 -46 287 -27 272 -35 b 269 -69 269 -55 269 -62 b 364 -183 269 -128 302 -170 z', + }, + breathMarkComma: { + x_min: 0, + x_max: 148, + y_min: 0, + y_max: 275, + ha: 275, + o: 'm 120 0 b 187 78 156 20 174 48 b 213 209 206 121 213 164 b 206 294 213 238 210 265 b 140 390 200 337 171 367 b 122 396 134 395 128 396 b 68 382 105 396 85 384 b 46 379 60 382 53 382 b 0 328 12 369 0 357 b 1 311 0 323 1 317 b 30 210 4 275 22 243 b 66 167 39 179 46 167 b 94 171 73 167 82 168 b 143 180 109 174 124 180 b 160 179 148 180 154 180 b 120 66 124 145 120 107 b 120 0 120 45 121 23 z', + }, + breathMarkUpbow: { + x_min: 0, + x_max: 254, + y_min: 0, + y_max: 595, + ha: 595, + o: 'm 233 0 b 256 48 251 14 253 30 b 272 183 264 92 265 138 b 311 455 289 274 295 364 b 350 716 327 541 341 628 b 366 815 354 749 366 782 b 359 857 366 829 363 842 b 327 815 334 852 330 832 b 302 674 315 769 310 721 b 248 357 288 567 269 462 b 225 226 240 314 242 268 b 210 251 212 232 213 243 b 69 721 163 408 117 564 b 32 835 58 760 53 801 b 20 851 29 841 27 851 b 14 850 19 851 16 851 b 0 828 6 847 0 838 l 0 825 b 12 765 1 804 7 785 b 194 125 73 552 132 338 b 233 0 206 84 213 42 z', + }, + caesura: { + x_min: 0, + x_max: 565.5831864753837, + y_min: -0.09016994374947417, + y_max: 562.4481112129314, + ha: 562.5382811566809, + o: 'm 0 76 b 49 122 24 92 37 107 b 444 613 180 287 305 455 b 528 770 484 660 518 708 b 531 792 530 778 531 785 b 524 808 531 799 530 805 b 490 792 513 815 498 802 b 390 683 456 756 420 721 b 48 262 275 543 164 400 b 0 76 0 207 7 145 z m 226 1 b 248 13 238 -4 243 7 l 353 137 b 759 638 490 302 632 464 b 814 805 795 688 819 740 b 779 786 796 805 788 796 b 628 609 724 732 678 668 b 310 242 523 485 416 363 b 217 69 265 190 217 140 b 222 30 217 58 219 45 b 222 23 222 29 220 26 b 220 12 222 20 220 16 b 226 1 220 7 222 3 z', + }, + caesuraCurved: { + x_min: 0, + x_max: 386, + y_min: -10, + y_max: 584, + ha: 594, + o: 'm 180 -14 b 246 14 213 -13 230 0 b 347 144 288 52 315 99 b 526 471 420 246 488 350 b 556 671 546 537 556 603 b 543 798 556 713 553 756 b 504 837 537 822 521 828 b 490 841 500 840 494 841 b 472 832 482 841 477 838 b 406 678 436 785 406 737 b 410 638 406 665 408 652 b 425 511 419 595 425 553 b 315 186 425 395 387 287 b 180 -14 271 122 228 58 z m 14 24 b 49 39 29 24 40 32 b 120 114 76 60 99 85 b 216 276 156 166 184 223 b 317 626 281 384 317 501 b 315 664 317 639 317 651 b 301 773 314 701 311 737 b 262 808 295 795 278 808 b 245 799 256 808 249 805 b 170 641 209 750 170 706 b 171 621 170 634 170 628 b 177 511 176 585 177 549 b 114 229 177 415 160 320 b 0 26 79 161 42 95 b 14 24 6 24 10 24 z', + }, + restMaxima: { + x_min: 0, + x_max: 366, + y_min: -255, + y_max: 255, + ha: 510, + o: 'm 397 -367 b 504 -343 436 -367 468 -347 b 518 -318 516 -341 518 -330 b 527 -30 518 -217 527 -117 b 526 33 527 -7 527 13 l 526 301 b 501 350 526 323 520 341 b 428 367 477 361 452 367 b 374 359 410 367 393 364 b 357 333 361 354 357 347 b 356 91 357 252 356 171 l 356 30 b 340 -307 357 -82 346 -194 b 397 -367 337 -354 350 -367 z m 46 -357 b 58 -356 49 -357 53 -357 b 154 -333 91 -351 121 -338 b 173 -305 168 -330 173 -320 l 173 302 b 132 356 173 330 157 348 b 68 364 112 363 89 364 b 3 304 19 363 1 348 l 3 4 l 0 4 b 1 -302 0 -98 0 -200 b 46 -357 1 -331 16 -357 z', + }, + restDoubleWhole: { + x_min: 0, + x_max: 122, + y_min: 0, + y_max: 249, + ha: 249, + o: 'm 43 0 b 58 1 48 0 52 0 b 124 20 81 6 102 17 b 176 96 173 27 176 58 b 173 220 174 138 173 179 b 176 304 173 248 176 276 b 140 353 176 331 163 346 b 95 359 125 356 111 359 b 32 346 73 359 52 354 b 0 315 20 340 0 337 b 1 243 0 291 1 268 l 1 174 l 4 174 l 4 48 b 43 0 4 16 17 0 z', + }, + restWhole: { + x_min: 0.8908513171538642, + x_max: 500, + y_min: -120, + y_max: 14, + ha: 134, + o: 'm 356 -173 l 356 -171 l 642 -171 b 719 -115 680 -171 717 -145 b 720 -82 719 -104 720 -92 b 711 -20 720 -60 719 -40 b 672 17 704 0 694 10 b 649 20 664 20 657 20 b 605 17 634 20 621 17 b 92 19 433 17 262 17 b 29 7 69 20 49 12 b 9 -17 12 4 9 -6 b 10 -43 9 -26 10 -35 b 1 -84 10 -58 3 -72 b 76 -173 0 -147 7 -173 z', + }, + restHalf: { + x_min: 0, + x_max: 518.3998530468286, + y_min: 0, + y_max: 162, + ha: 162, + o: 'm 98 0 l 556 0 b 665 1 592 0 629 0 b 746 82 720 3 743 29 b 736 174 749 114 740 144 b 670 232 729 215 708 232 b 570 229 636 232 603 229 b 356 233 498 229 426 233 l 73 233 b 0 179 19 233 0 220 b 1 154 0 171 0 164 b 6 95 4 135 6 115 b 98 0 3 27 29 0 z', + }, + restQuarter: { + x_min: -0.3784452492533808, + x_max: 263, + y_min: -415, + y_max: 415, + ha: 830, + o: 'm 151 -596 b 164 -563 163 -589 161 -575 b 160 -546 164 -557 161 -552 b 124 -396 148 -495 135 -446 b 122 -380 122 -390 122 -384 b 199 -255 122 -331 158 -272 b 228 -256 209 -249 217 -253 b 324 -346 274 -271 298 -310 b 353 -369 331 -356 341 -369 b 360 -367 356 -369 357 -369 b 379 -336 373 -361 379 -348 l 377 -325 b 344 -232 372 -292 366 -258 b 249 -58 301 -180 278 -117 b 242 -36 245 -49 242 -42 b 258 -7 242 -26 248 -17 b 328 78 284 20 311 45 b 354 158 344 104 354 131 b 337 216 354 177 350 196 b 213 435 294 288 249 359 b 115 575 189 487 158 536 b 78 598 105 585 92 598 b 59 592 72 598 66 596 b 39 562 45 583 39 572 b 53 527 39 550 45 539 b 168 344 98 469 125 402 b 187 307 181 328 187 317 b 153 269 187 294 176 284 b 62 213 122 252 91 235 b 40 180 48 203 40 192 b 46 158 40 173 43 166 b 99 65 60 125 79 95 b 183 -79 131 20 160 -29 b 156 -86 173 -88 164 -85 b 0 -261 58 -99 -7 -173 b 96 -557 10 -366 49 -464 b 124 -585 102 -569 109 -580 b 145 -598 132 -588 138 -598 b 151 -596 147 -598 150 -598 z', + }, + rest8th: { + x_min: 0, + x_max: 289, + y_min: -260, + y_max: 261, + ha: 521, + o: 'm 164 -374 b 212 -340 190 -373 203 -357 b 276 -190 238 -292 258 -242 b 410 285 333 -36 359 128 b 416 314 413 294 416 304 l 416 321 b 393 354 415 341 410 354 b 382 353 389 354 386 354 b 292 311 347 347 315 333 b 174 225 256 276 216 251 b 157 219 168 222 163 219 b 140 228 151 219 145 222 b 131 246 134 233 131 240 b 135 262 131 252 132 256 b 147 298 141 272 147 285 b 127 367 147 323 154 354 b 94 376 114 373 102 376 b 48 336 75 376 63 363 b 3 181 20 288 12 235 b 0 150 1 170 0 160 b 109 24 0 84 35 24 b 171 36 127 24 148 27 b 289 101 213 52 248 75 b 164 -374 256 -62 193 -213 z', + }, + rest16th: { + x_min: 0, + x_max: 333, + y_min: -328.283950617284, + y_max: 244, + ha: 572.2839506172841, + o: 'm 209 -471 b 246 -458 222 -477 236 -468 b 307 -338 279 -425 300 -384 b 324 -226 312 -301 317 -262 b 428 161 350 -94 386 35 b 480 318 445 215 480 259 b 467 347 480 331 477 341 b 445 351 461 350 454 351 b 408 337 432 351 419 347 b 402 333 405 336 403 334 b 223 215 344 294 294 245 b 236 259 229 233 235 246 b 238 276 238 265 238 271 b 212 338 238 302 226 334 b 193 341 206 340 199 341 b 86 289 156 341 104 317 b 59 180 66 255 59 217 b 156 27 59 76 92 27 b 236 46 179 27 204 35 b 338 101 271 59 298 82 b 289 -49 312 49 302 0 b 196 -122 276 -99 235 -107 b 176 -114 187 -127 176 -127 l 176 -111 b 157 -53 177 -88 164 -72 b 69 -9 141 -7 101 -16 b 17 -48 43 -3 29 -27 b 0 -127 4 -73 0 -99 b 6 -186 0 -147 1 -167 b 82 -294 17 -262 37 -294 b 160 -276 102 -294 128 -289 b 219 -242 181 -268 203 -259 b 236 -230 223 -236 229 -230 b 243 -232 239 -230 240 -230 b 235 -275 248 -246 239 -261 b 202 -456 220 -334 202 -395 b 209 -471 202 -462 203 -468 z', + }, + rest32nd: { + x_min: 0, + x_max: 347, + y_min: -497.5023916875033, + y_max: 483, + ha: 980.5023916875033, + o: 'm 177 -716 b 217 -690 194 -720 209 -704 b 233 -655 225 -680 230 -668 b 292 -390 253 -567 275 -480 b 361 -48 312 -275 336 -161 b 452 400 393 102 422 252 b 497 629 467 477 482 553 b 500 647 498 635 500 641 b 480 691 500 665 492 684 b 464 696 475 694 469 696 b 418 674 448 696 431 685 l 361 626 b 333 611 353 618 343 612 b 308 629 325 611 317 616 b 239 667 292 651 265 661 b 204 670 228 668 216 670 b 86 559 141 670 95 628 b 85 537 86 552 85 544 b 107 416 85 495 95 455 b 161 372 114 389 134 372 b 174 373 166 372 170 372 b 226 383 192 374 209 377 b 387 478 285 402 330 444 b 364 386 379 444 364 415 b 276 271 364 323 320 298 b 265 266 272 268 268 266 b 252 276 261 266 256 269 b 143 333 229 311 186 333 b 107 327 130 333 118 330 b 43 243 62 314 46 291 b 58 145 43 210 52 179 b 150 63 68 92 99 63 b 315 132 213 63 259 98 b 266 -58 297 63 281 4 b 207 -101 259 -91 230 -96 b 186 -66 186 -107 199 -75 b 180 -50 181 -63 183 -55 b 101 -3 160 -23 135 -3 b 9 -66 59 -3 20 -32 b 0 -118 3 -84 0 -101 b 10 -196 0 -144 6 -170 b 104 -287 20 -256 52 -287 b 137 -282 114 -287 125 -287 b 184 -269 151 -281 171 -269 b 196 -275 190 -269 193 -271 b 199 -287 197 -278 199 -282 b 184 -343 199 -304 189 -325 b 181 -348 184 -346 183 -347 b 134 -595 158 -429 131 -508 b 156 -677 134 -624 150 -648 b 177 -716 158 -693 160 -713 z', + }, + rest64th: { + x_min: 0, + x_max: 428, + y_min: -720, + y_max: 473.6797408388932, + ha: 1193.6797408388932, + o: 'm 200 -1037 b 229 -1012 215 -1037 222 -1025 b 238 -984 233 -1004 236 -994 b 282 -780 248 -914 265 -848 b 386 -369 317 -644 354 -507 b 491 104 422 -212 451 -53 b 600 541 528 249 550 399 b 616 629 611 570 616 599 b 600 680 616 648 615 671 b 550 665 586 687 566 677 b 480 618 527 649 501 635 b 464 611 474 613 468 611 b 448 622 458 611 454 615 b 366 662 425 651 397 662 b 331 658 354 662 343 661 b 242 572 285 647 253 619 b 236 528 239 557 236 543 b 266 400 236 484 251 442 b 325 373 274 377 301 373 b 436 409 366 373 403 383 l 494 452 b 474 360 485 416 474 389 b 383 248 474 297 435 269 b 320 328 377 288 351 310 b 276 341 305 337 291 341 b 186 269 235 341 194 311 b 181 230 183 256 181 243 b 187 153 181 204 186 179 b 279 63 192 86 233 63 b 304 65 288 63 295 63 b 416 115 344 72 379 92 b 387 -14 406 69 397 27 b 320 -95 380 -52 369 -86 b 318 -79 320 -89 320 -84 b 223 0 305 -29 271 0 b 122 -81 171 0 135 -30 b 118 -127 120 -96 118 -112 l 118 -196 b 137 -242 118 -215 125 -229 b 209 -275 157 -266 181 -275 b 249 -269 222 -275 235 -274 b 318 -248 272 -264 294 -255 b 281 -390 315 -301 292 -344 b 276 -400 279 -393 279 -397 b 259 -420 272 -408 266 -416 b 246 -429 255 -425 251 -429 b 233 -415 242 -429 238 -426 b 176 -359 225 -389 200 -372 b 121 -346 158 -348 140 -346 b 14 -408 73 -346 27 -370 b 0 -498 4 -438 0 -468 b 6 -564 0 -520 3 -543 b 91 -635 12 -611 45 -635 b 131 -629 104 -635 117 -634 b 223 -590 163 -622 190 -603 b 166 -824 203 -671 189 -747 b 148 -912 157 -852 148 -881 b 156 -955 148 -926 150 -940 b 177 -1008 161 -972 170 -991 b 200 -1037 181 -1020 183 -1037 z', + }, + rest128th: { + x_min: 0.6717818579024267, + x_max: 491, + y_min: -711, + y_max: 719, + ha: 1430, + o: 'm 233 -1015 b 271 -956 256 -1002 266 -981 l 314 -723 b 393 -350 337 -598 366 -474 b 543 312 442 -128 492 91 b 687 841 583 490 635 665 b 707 958 698 880 707 919 b 706 986 707 968 707 976 b 688 1025 704 999 704 1024 b 670 1027 683 1025 677 1027 b 629 1007 655 1027 639 1022 b 559 945 613 981 586 968 b 541 1004 553 968 559 991 b 456 1035 516 1024 488 1035 b 419 1030 444 1035 431 1034 b 344 953 379 1018 353 995 b 340 900 341 936 340 917 b 341 847 340 881 341 864 b 380 779 340 815 354 793 b 464 763 406 765 435 762 b 592 814 510 763 549 786 b 546 660 575 757 556 710 b 480 585 537 619 517 598 b 478 599 480 590 478 595 b 386 678 472 641 428 678 b 294 612 343 678 304 651 b 279 477 282 567 278 521 b 363 395 281 428 317 395 b 380 396 369 395 374 395 b 488 436 416 403 449 419 b 384 233 469 357 468 275 b 359 291 373 252 377 276 b 282 318 337 310 310 318 b 181 264 243 318 203 298 b 154 107 153 216 154 161 b 242 6 154 42 187 6 b 278 10 253 6 265 7 b 408 88 330 22 366 55 b 387 -1 400 56 393 27 b 301 -112 379 -55 354 -94 b 289 -65 297 -95 302 -79 b 219 -32 269 -42 245 -32 b 183 -37 207 -32 196 -35 b 112 -109 144 -46 121 -71 b 105 -219 104 -145 108 -183 b 186 -315 101 -276 134 -315 b 230 -307 199 -315 215 -312 b 324 -256 264 -295 292 -275 b 180 -491 323 -383 266 -471 b 183 -459 180 -480 180 -469 b 184 -442 184 -454 184 -448 l 184 -436 b 135 -369 184 -403 170 -383 b 102 -363 125 -364 114 -363 b 29 -399 73 -363 45 -376 b 1 -556 -4 -448 6 -503 b 109 -670 -4 -625 43 -670 b 140 -667 118 -670 130 -668 b 253 -616 180 -658 213 -638 b 238 -688 248 -644 242 -665 b 192 -959 220 -779 192 -867 b 193 -992 192 -971 192 -981 b 210 -1024 194 -1014 199 -1024 b 233 -1015 216 -1024 223 -1021 z', + }, + dynamicPiano: { + x_min: -49, + x_max: 326.5019318364244, + y_min: -142, + y_max: 515, + ha: 657, + o: 'm -56 -204 b -42 -202 -52 -204 -46 -203 b -19 -194 -35 -202 -26 -197 b 147 -138 35 -170 91 -151 b 249 -58 194 -127 223 -95 b 262 -29 255 -50 262 -39 b 258 -17 262 -24 261 -20 b 232 -7 252 -10 242 -7 b 210 -12 225 -7 217 -9 b 125 -40 184 -23 157 -30 b 183 140 153 19 171 79 b 251 167 207 144 230 153 b 469 518 383 262 480 382 b 357 687 472 626 420 687 b 315 678 344 687 330 684 b 204 600 279 664 240 634 b 210 704 206 635 209 670 b 215 721 212 710 215 716 b 206 733 215 727 212 730 b 180 742 197 736 189 742 b 164 734 176 742 170 740 b 1 575 108 684 36 645 b -7 557 -1 569 -7 563 b -6 553 -7 556 -7 554 b 7 547 -3 547 3 547 l 17 547 b 82 575 43 547 59 567 l 82 452 b 56 46 82 317 81 180 b 17 -66 49 7 46 -36 b -62 -173 -13 -99 -37 -135 b -71 -192 -66 -179 -71 -184 b -68 -199 -71 -193 -69 -196 b -56 -204 -65 -203 -60 -204 z m 196 258 b 197 266 197 261 197 264 b 200 510 200 347 199 429 b 233 543 210 521 222 533 b 281 560 249 554 266 560 b 340 503 310 560 333 540 b 344 461 343 488 344 474 b 321 323 344 413 333 369 b 268 272 315 300 295 281 b 196 258 245 265 220 261 z', + }, + dynamicMezzo: { + x_min: -18, + x_max: 559, + y_min: -50, + y_max: 365, + ha: 415, + o: 'm 43 -71 b 160 19 86 -71 143 -26 b 230 264 189 99 200 184 b 282 363 243 297 259 327 b 287 320 285 347 287 333 b 284 279 287 305 285 292 l 249 -12 b 275 -43 248 -29 245 -43 b 395 45 321 -43 389 3 b 462 271 406 124 436 197 b 523 387 475 310 490 348 l 523 346 b 504 130 521 274 513 202 b 501 81 501 114 501 98 b 510 3 501 55 504 29 b 580 -72 521 -48 543 -72 b 625 -63 593 -72 608 -69 b 789 50 690 -43 744 -3 b 805 72 795 56 805 63 b 798 85 805 76 802 81 b 778 94 792 91 785 94 b 755 85 770 94 763 91 l 693 40 b 675 33 685 36 680 33 b 658 52 668 33 662 39 b 645 144 651 82 645 112 b 658 448 641 246 660 346 b 606 507 658 485 638 507 b 583 504 599 507 592 505 b 495 446 547 497 521 471 b 420 373 471 423 448 399 b 413 458 418 406 418 432 b 361 507 408 490 386 507 b 320 491 347 507 333 501 b 160 307 256 444 207 382 l 160 337 b 174 488 160 387 174 438 b 156 521 174 501 173 513 b 137 526 148 524 143 526 b 109 513 127 526 118 520 b -16 399 66 477 23 439 b -26 383 -20 395 -26 389 l -26 379 b -14 370 -24 372 -20 370 b -6 372 -12 370 -9 372 b 19 376 4 374 12 376 b 36 359 32 376 36 370 b 30 330 36 350 35 341 l 30 323 b 9 -35 23 203 17 85 b 43 -71 6 -65 19 -71 z', + }, + dynamicForte: { + x_min: -144, + x_max: 311.30112136775, + y_min: -115.3876295915697, + y_max: 504, + ha: 619.3876295915697, + o: 'm -101 -166 b 173 76 7 -153 150 -30 b 206 344 192 164 202 253 b 268 338 226 343 246 341 b 384 395 317 333 353 361 b 397 419 393 405 397 412 b 367 442 397 429 387 436 b 350 444 361 444 356 444 b 206 455 302 449 255 454 l 206 474 b 202 540 204 495 202 518 b 209 593 202 557 203 576 b 236 624 215 613 225 624 b 265 612 245 624 253 619 b 308 552 287 596 302 577 b 336 533 312 534 323 533 b 448 611 366 533 444 583 b 399 696 452 648 423 671 b 382 706 395 700 387 703 b 308 726 357 720 333 726 b 207 684 272 726 239 711 b 60 455 135 622 60 560 l 10 455 b -23 448 -1 455 -13 454 b -102 372 -55 426 -76 397 b -109 357 -108 367 -109 361 b -95 347 -109 353 -105 348 b -63 346 -84 346 -73 346 b 0 344 -43 344 -22 344 l 63 344 b 53 186 63 291 59 239 b 23 0 46 124 42 60 b -35 -60 10 -42 -6 -60 b -73 -52 -45 -60 -58 -58 b -91 -48 -79 -49 -85 -48 b -109 -53 -96 -48 -102 -49 b -199 -124 -143 -72 -168 -99 b -207 -137 -203 -128 -207 -132 b -194 -148 -207 -141 -203 -145 b -101 -166 -164 -160 -132 -168 z', + }, + dynamicRinforzando: { + x_min: -75, + x_max: 322.0960720195126, + y_min: -90, + y_max: 325, + ha: 415, + o: 'm 23 -130 b 40 -125 27 -130 33 -128 b 128 -9 81 -114 125 -53 b 145 200 132 62 141 130 b 148 238 147 212 148 225 b 308 321 184 291 245 321 b 363 314 325 321 344 318 b 377 310 369 312 373 310 b 384 311 380 310 382 310 b 464 415 410 317 464 389 b 446 433 465 429 455 429 b 390 445 428 441 409 445 b 305 429 361 445 334 438 b 167 346 252 413 202 393 b 153 325 163 338 158 333 b 148 438 154 363 151 399 b 121 468 147 456 134 468 b 101 458 115 468 108 465 b -63 310 46 409 -16 367 b -108 240 -78 289 -98 271 b 32 330 -50 256 -13 297 b 37 304 37 320 37 312 l 37 292 b 10 -101 27 161 20 30 b 23 -130 9 -120 12 -130 z', + }, + dynamicSforzando: { + x_min: 0, + x_max: 296, + y_min: 0, + y_max: 379, + ha: 379, + o: 'm 151 0 b 174 1 160 0 166 0 b 392 158 272 14 346 71 b 405 207 400 174 405 190 b 359 287 405 236 389 265 b 261 325 328 308 294 315 b 168 413 216 340 181 366 b 166 426 167 418 166 423 b 176 438 166 432 167 436 b 199 441 183 441 190 441 b 310 393 238 441 295 422 b 334 370 317 376 325 370 b 363 386 343 370 353 379 b 422 445 386 402 408 420 b 426 458 425 449 426 454 b 422 469 426 462 425 465 b 274 546 395 518 333 546 b 161 503 232 546 190 531 b 86 405 132 472 108 439 b 71 347 75 387 71 367 b 112 256 71 312 85 279 b 209 215 141 232 176 226 b 284 168 238 206 266 197 b 300 131 291 157 300 144 b 298 120 300 127 298 122 b 278 107 294 109 285 108 b 262 108 271 107 266 108 l 259 108 b 114 157 200 107 156 125 b 96 181 104 163 96 170 l 96 184 b 102 202 96 190 102 196 b 96 209 102 204 101 207 b 63 194 82 215 72 204 b 7 109 42 168 26 138 b 0 86 3 101 0 94 b 13 60 0 78 4 68 b 151 0 53 23 101 0 z', + }, + dynamicZ: { + x_min: -42.73880183193087, + x_max: 331, + y_min: 0, + y_max: 328, + ha: 328, + o: 'm -45 0 b -6 16 -32 0 -17 10 b 3 20 -3 16 0 19 b 144 60 49 48 96 60 b 284 22 190 60 238 46 b 348 4 305 10 327 4 b 461 75 393 4 435 30 b 468 91 464 81 467 86 b 456 104 468 95 465 99 b 287 173 402 131 348 167 b 239 176 271 174 255 176 b 168 174 217 176 194 174 b 367 340 236 236 298 294 b 459 423 402 363 432 392 b 477 454 467 431 475 442 b 474 462 477 456 475 459 b 454 472 469 469 462 472 b 432 468 446 472 439 469 b 356 448 406 461 380 455 b 210 422 307 433 258 422 b 109 442 177 422 144 428 b 94 445 104 444 99 445 b 69 433 85 445 76 442 b 27 390 56 419 39 406 b -9 343 16 373 -17 357 b 63 311 3 320 36 314 l 78 311 b 132 307 95 308 114 307 b 240 314 168 307 203 311 l 193 271 b -37 50 117 196 19 145 b -59 7 -46 36 -69 20 b -45 0 -55 3 -50 0 z', + }, + ornamentTrill: { + x_min: 1, + x_max: 551, + y_min: -18, + y_max: 539, + ha: 557, + o: 'm 321 612 b 190 602 278 605 235 605 l 190 638 b 187 693 190 652 190 667 b 161 776 184 717 193 776 b 137 747 150 776 137 766 b 130 654 135 716 131 685 l 130 596 l 52 588 b 4 539 23 585 7 570 b 1 477 3 530 1 500 b 3 448 1 461 3 448 l 3 452 b 53 432 6 436 23 432 b 134 435 75 432 102 433 b 151 117 138 328 147 223 b 170 13 153 82 157 46 b 209 -26 179 -10 193 -26 b 222 -22 213 -26 217 -24 b 269 -17 233 -16 253 -27 b 343 135 325 19 346 66 b 343 158 343 147 344 147 b 323 192 341 171 337 187 b 291 176 311 194 300 184 l 264 148 b 229 131 261 145 238 131 b 212 170 209 131 213 154 b 194 438 203 259 199 348 l 272 442 b 284 452 276 441 279 441 b 305 462 287 461 295 462 l 312 462 b 346 477 325 462 340 464 b 366 560 357 503 366 531 b 321 612 366 598 356 618 z m 759 588 b 711 560 749 592 733 570 b 588 500 671 541 631 521 b 583 533 586 514 586 524 b 560 576 577 549 577 572 b 517 550 541 582 528 564 b 416 423 482 508 452 462 b 382 353 392 397 384 370 b 387 305 380 341 386 318 b 392 275 389 295 392 285 b 409 243 393 262 393 243 b 431 262 419 243 425 255 b 521 373 459 298 488 333 b 523 354 521 366 523 360 b 520 337 523 346 521 340 b 508 295 513 323 508 310 b 530 102 508 279 524 122 b 549 66 533 88 530 66 b 577 99 563 66 572 84 b 580 131 580 109 580 121 l 580 302 b 600 347 580 318 582 337 b 701 392 632 364 665 384 b 793 518 785 409 793 435 b 759 588 793 559 785 576 z', + }, + ornamentTurn: { + x_min: 0, + x_max: 574, + y_min: 0, + y_max: 312, + ha: 312, + o: 'm 651 0 b 816 132 727 0 796 46 b 827 223 822 163 827 193 b 808 340 827 262 821 301 b 665 449 785 408 729 449 b 636 446 655 449 647 448 b 589 384 600 441 586 422 l 602 300 b 611 285 603 291 605 285 b 621 288 613 285 616 287 b 655 295 632 294 644 295 b 711 284 674 295 693 289 b 773 209 740 275 773 232 b 697 156 773 184 734 160 b 664 154 685 154 675 154 b 579 168 635 154 608 158 b 455 242 533 186 495 213 b 261 400 387 291 331 354 b 160 432 225 422 190 432 b 20 328 98 432 49 392 b 0 229 6 295 0 262 b 30 71 0 176 14 122 b 144 3 43 29 96 3 b 168 6 153 3 160 4 b 248 122 233 20 248 39 b 246 147 248 124 248 135 b 226 177 243 164 239 177 b 206 170 220 177 215 174 b 144 154 186 158 166 154 b 79 170 122 154 101 160 b 53 202 62 179 53 189 b 60 228 53 209 55 217 b 161 281 81 261 120 281 b 183 279 168 281 176 281 b 325 190 243 269 284 229 b 572 16 402 124 475 53 b 651 0 598 6 625 0 z', + }, + ornamentTurnSlash: { + x_min: 0, + x_max: 574, + y_min: -106, + y_max: 405, + ha: 511, + o: 'm 441 -153 b 456 -60 455 -118 456 -89 b 455 81 455 -14 455 33 b 572 14 491 55 530 30 b 651 -1 598 4 625 -1 b 816 131 727 -1 796 45 b 827 222 822 161 827 192 b 808 338 827 261 821 300 b 665 448 785 406 729 448 b 636 445 655 448 647 446 b 589 383 600 439 586 420 l 602 298 b 611 284 603 289 605 284 b 621 287 613 284 616 285 b 655 294 632 292 644 294 b 711 282 674 294 693 288 b 773 207 740 274 773 230 b 697 154 773 183 734 158 b 664 153 685 153 675 153 b 579 167 635 153 608 157 b 455 240 533 183 495 212 b 454 242 455 240 455 242 l 454 337 b 452 488 454 386 452 439 b 433 570 452 517 451 546 b 425 583 431 575 431 583 l 422 583 b 403 566 415 582 408 573 b 402 546 400 560 402 553 l 397 287 b 261 399 353 325 310 366 b 160 431 225 420 190 431 b 20 327 98 431 48 390 b 0 228 6 294 0 261 b 30 69 0 174 14 121 b 144 1 43 27 96 1 b 168 4 153 1 160 3 b 248 121 233 19 248 37 b 246 145 248 122 248 134 b 226 176 243 163 239 176 b 206 168 220 176 215 173 b 144 153 186 157 166 153 b 79 168 122 153 101 158 b 53 200 62 177 53 187 b 60 226 53 207 55 216 b 161 279 79 259 120 279 b 183 278 168 279 176 279 b 325 189 243 266 282 226 b 395 130 348 168 372 148 b 393 71 393 109 393 89 b 441 -153 390 -6 402 -78 z', + }, + ornamentMordent: { + x_min: 0, + x_max: 700, + y_min: 0, + y_max: 497, + ha: 497, + o: 'm 513 0 b 528 39 526 14 527 27 b 531 72 531 50 531 60 b 528 138 531 94 528 117 l 528 347 b 552 359 537 354 544 359 b 579 338 560 359 569 353 b 674 217 609 297 639 255 b 719 190 690 200 704 190 b 759 215 732 190 744 197 b 940 395 815 279 877 337 b 1001 490 968 422 986 455 b 1008 513 1004 495 1008 505 b 1002 524 1008 517 1007 521 b 968 516 994 530 978 524 b 960 508 965 513 963 510 b 798 356 900 464 848 410 b 778 341 791 347 783 341 b 757 354 772 341 765 346 b 661 475 720 392 690 432 b 611 517 644 504 629 517 b 563 498 598 517 583 511 b 527 471 550 490 539 481 l 527 570 b 492 716 526 619 523 671 b 472 677 480 704 472 694 b 465 399 474 585 468 491 b 439 366 456 387 448 376 b 384 320 415 336 399 320 b 330 367 369 320 354 336 b 325 376 328 369 327 373 b 226 490 291 413 265 456 b 189 505 213 500 202 505 b 157 491 177 505 167 500 b 0 229 75 420 0 346 b 1 202 0 220 0 212 b 22 215 12 203 16 209 b 124 327 55 252 89 289 b 147 343 132 337 140 343 b 171 323 156 343 164 336 b 266 197 196 276 232 236 b 337 157 291 170 314 157 b 410 207 361 157 386 174 b 461 274 428 229 444 252 b 462 166 461 238 461 202 b 513 0 465 108 487 55 z', + }, + ornamentShortTrill: { + x_min: 0, + x_max: 747, + y_min: 0, + y_max: 243, + ha: 243, + o: 'm 379 0 b 428 14 395 0 410 4 b 474 56 445 26 461 39 b 552 157 500 89 526 122 b 566 168 556 163 560 168 b 575 157 569 168 572 166 b 664 36 592 107 628 72 b 733 1 685 13 710 1 b 802 35 757 1 780 13 b 1007 249 871 105 940 177 b 1067 324 1028 272 1054 295 b 1076 340 1068 330 1076 334 b 1073 346 1076 341 1076 343 b 1057 350 1068 348 1063 350 b 1047 347 1053 350 1050 350 b 1001 310 1031 336 1015 324 l 857 157 b 844 143 852 153 848 143 b 835 150 841 143 838 144 b 757 242 815 186 780 209 b 685 298 739 268 713 284 b 641 310 670 305 655 310 b 590 288 625 310 608 304 b 497 179 554 256 527 215 b 480 164 490 170 485 164 b 462 179 474 164 469 168 b 372 295 436 220 405 258 b 278 344 346 324 312 344 b 199 310 252 344 226 334 b 92 196 161 274 128 233 b 0 24 46 148 23 89 b 42 48 22 27 32 37 b 156 168 84 85 114 132 b 196 192 174 184 186 192 b 228 158 206 192 215 181 b 312 36 252 114 282 75 b 379 0 331 12 354 0 z', + }, + ornamentTremblement: { + x_min: 0, + x_max: 982.17691453624, + y_min: 0, + y_max: 224, + ha: 224, + o: 'm 0 0 b 63 36 30 12 48 23 b 157 124 94 66 125 94 b 177 135 164 131 170 135 b 196 122 183 135 189 131 b 268 40 217 94 245 68 b 323 6 288 16 304 6 b 369 20 336 6 350 10 b 412 53 384 29 399 40 b 501 145 442 84 472 114 b 523 158 508 154 516 158 b 543 145 528 158 536 154 b 641 45 576 112 608 78 b 698 17 658 27 677 17 b 729 23 708 17 719 20 b 804 65 756 32 780 46 b 904 154 837 95 871 124 b 920 163 910 160 916 163 b 936 153 924 163 930 160 b 1024 60 965 121 996 92 b 1112 13 1053 29 1080 13 b 1184 39 1135 13 1158 22 b 1359 194 1248 84 1305 138 b 1413 301 1388 223 1403 261 b 1404 323 1417 315 1413 323 b 1391 320 1400 323 1395 321 b 1344 294 1375 314 1358 307 b 1224 186 1305 258 1269 216 b 1194 173 1212 179 1202 173 b 1165 193 1184 173 1175 179 b 1096 271 1145 222 1122 248 b 1001 318 1061 302 1031 318 b 903 268 969 318 937 301 b 806 186 871 239 841 210 b 782 174 796 179 789 174 b 756 193 773 174 765 180 b 652 291 729 232 693 266 b 596 308 634 302 615 308 b 530 278 573 308 552 298 l 415 168 b 393 157 408 161 400 157 b 373 171 387 157 380 161 b 305 245 353 197 330 222 b 248 276 285 266 266 278 b 189 245 229 276 210 266 b 81 144 156 209 120 174 b 0 0 33 109 26 56 z', + }, + ornamentPrecompAppoggTrill: { + x_min: -0.11067192132025548, + x_max: 1066, + y_min: -50, + y_max: 533.1706452421108, + ha: 583.1706452421108, + o: 'm 187 -46 b 213 -14 197 -37 204 -26 b 285 151 251 36 266 94 b 304 189 294 177 297 189 b 337 168 311 189 320 181 b 458 33 386 131 415 76 b 495 12 472 19 484 12 b 531 40 508 12 518 22 b 580 168 557 79 569 124 b 622 235 592 213 603 235 b 683 194 636 235 655 222 b 838 26 737 140 791 86 b 919 -33 860 -1 881 -39 b 984 53 960 -27 971 19 b 1022 156 998 86 1008 122 b 1054 190 1032 179 1041 190 b 1089 167 1063 190 1074 183 b 1208 32 1129 122 1171 78 b 1244 10 1221 17 1231 10 b 1273 22 1253 10 1263 14 b 1496 206 1352 78 1427 137 b 1535 310 1526 236 1535 272 b 1531 359 1535 325 1534 343 b 1496 343 1515 360 1506 351 l 1309 192 b 1269 167 1289 176 1279 167 b 1234 199 1260 167 1251 177 b 1122 324 1200 243 1168 289 b 1074 344 1106 337 1089 344 b 1014 301 1051 344 1030 328 b 952 144 985 252 971 197 b 933 121 946 128 940 121 b 910 137 927 121 920 125 b 850 210 888 161 870 186 b 687 369 799 266 750 325 b 631 390 665 383 647 390 b 567 327 602 390 580 369 b 527 199 554 284 543 242 b 508 168 520 179 514 168 b 482 192 503 168 495 177 b 353 328 444 240 405 292 b 312 343 338 338 324 343 b 266 297 292 343 276 327 b 204 125 248 239 232 180 b 143 79 193 102 173 79 b 92 122 117 79 105 102 b 81 154 86 131 84 143 b 48 423 59 242 50 333 b 45 544 46 464 45 504 b 53 730 45 606 48 668 b 40 768 55 744 52 766 b 13 730 19 770 14 747 b 0 514 7 658 -1 586 b 26 122 3 383 6 252 b 75 -36 35 66 40 10 b 134 -72 92 -59 112 -72 b 187 -46 151 -72 170 -63 z', + }, + ornamentPrecompSlideTrillDAnglebert: { + x_min: 0, + x_max: 1088, + y_min: -380, + y_max: 252, + ha: 632, + o: 'm 560 -539 b 439 -481 527 -497 484 -485 b 354 -461 409 -478 380 -477 b 131 -154 236 -389 161 -285 b 124 -98 127 -135 124 -117 b 196 55 124 -40 148 10 b 308 99 230 86 268 99 b 399 81 337 99 367 92 b 514 22 441 66 477 43 b 619 -30 567 -9 590 -30 b 719 17 642 -30 670 -16 b 861 131 769 52 818 88 b 899 150 874 144 887 150 b 936 117 913 150 926 138 b 965 43 948 94 956 68 b 1007 -1 973 24 978 -1 b 1048 30 1025 -1 1037 16 b 1070 65 1057 40 1064 52 b 1110 148 1084 92 1096 121 b 1145 190 1120 164 1120 190 b 1191 153 1169 192 1179 168 b 1256 29 1218 115 1231 68 b 1292 1 1267 10 1277 1 b 1320 10 1300 1 1309 4 b 1369 48 1339 19 1355 33 b 1515 196 1418 96 1464 148 b 1567 343 1558 238 1567 287 b 1555 363 1565 357 1562 363 b 1539 356 1551 363 1547 360 b 1433 268 1502 330 1466 301 b 1335 171 1401 236 1374 199 b 1310 163 1325 166 1318 163 b 1286 183 1302 163 1293 168 b 1218 311 1264 226 1247 272 b 1164 351 1200 337 1182 351 b 1110 308 1146 351 1128 337 b 1031 176 1084 265 1058 219 b 1015 161 1025 166 1021 161 b 999 179 1009 161 1005 167 b 955 279 985 213 973 248 b 913 307 943 300 930 307 b 887 302 904 307 896 305 b 852 281 874 298 863 291 b 693 167 804 236 747 204 b 612 140 667 150 639 140 b 549 157 592 140 570 145 b 403 220 503 181 452 202 b 271 248 360 236 315 248 b 179 229 239 248 209 242 b 0 -29 65 180 0 85 b 9 -104 0 -53 3 -78 b 397 -526 56 -317 183 -464 b 505 -547 432 -536 468 -547 b 560 -539 524 -547 541 -544 z', + }, + ornamentPrecompSlideTrillBach: { + x_min: 0, + x_max: 1185, + y_min: -380, + y_max: 465, + ha: 845, + o: 'm 624 -544 b 642 -528 638 -543 642 -537 b 639 -514 642 -524 642 -520 b 590 -444 629 -487 609 -467 b 523 -413 573 -422 553 -410 b 498 -415 514 -415 507 -415 b 399 -389 464 -415 431 -405 b 89 -157 281 -330 176 -255 b 72 -117 78 -144 72 -131 b 73 -101 72 -111 72 -107 b 187 186 91 3 147 91 b 246 230 200 216 222 230 b 300 209 262 230 281 223 b 456 48 359 163 403 101 b 540 -10 494 10 518 -10 b 625 59 566 -10 589 13 b 690 148 648 88 668 118 b 711 167 697 160 704 167 b 733 153 719 167 724 163 b 844 14 769 105 808 60 b 903 -42 873 -23 886 -42 b 973 -1 919 -42 937 -27 b 1008 33 986 7 996 20 b 1048 81 1021 48 1035 65 b 1050 37 1048 66 1050 52 b 1047 -24 1050 17 1048 -3 b 1038 -275 1038 -108 1040 -192 l 1037 -289 b 1045 -302 1037 -295 1038 -301 b 1068 -284 1056 -304 1064 -292 b 1084 -242 1076 -271 1081 -256 b 1099 -109 1096 -199 1099 -154 b 1106 158 1099 -19 1106 71 b 1128 187 1113 167 1120 177 b 1168 223 1143 212 1155 223 b 1210 193 1179 223 1191 213 b 1220 183 1214 190 1215 186 b 1329 36 1261 138 1292 84 b 1374 7 1345 16 1358 7 b 1411 20 1384 7 1395 12 b 1479 84 1437 37 1459 59 b 1610 235 1521 135 1564 186 b 1706 403 1655 282 1695 334 b 1614 346 1663 400 1637 373 b 1464 170 1564 287 1515 228 b 1440 150 1453 156 1447 150 b 1414 173 1433 150 1426 158 b 1283 336 1371 228 1333 288 b 1220 366 1261 356 1240 366 b 1148 318 1194 366 1169 350 b 1103 255 1133 297 1119 275 b 1097 301 1102 271 1100 285 b 1099 334 1099 312 1099 324 b 1092 428 1099 367 1094 397 b 1071 647 1087 501 1079 575 b 1058 670 1071 657 1071 670 b 1035 648 1047 670 1038 661 b 1018 516 1024 605 1015 560 b 1041 203 1025 412 1037 307 b 1043 180 1041 196 1043 187 b 992 127 1027 161 1009 143 b 965 111 981 117 972 111 b 936 132 955 111 946 120 b 829 268 900 179 867 225 b 760 317 801 301 780 317 b 691 258 739 317 719 297 b 605 147 664 219 641 177 b 589 138 599 141 593 138 b 572 148 583 138 579 141 b 415 317 520 206 467 261 b 327 372 390 343 366 366 b 300 373 317 373 308 373 b 154 295 239 373 190 348 b 55 138 120 243 85 192 b 0 -53 22 79 0 13 b 160 -317 0 -156 49 -252 b 209 -354 177 -327 192 -343 b 510 -531 305 -419 397 -495 b 593 -547 537 -540 564 -547 b 624 -544 603 -547 613 -546 z', + }, + ornamentPrecompTrillSuffixDandrieu: { + x_min: 0, + x_max: 1003, + y_min: -20, + y_max: 521, + ha: 541, + o: 'm 791 -16 b 844 33 812 -3 829 14 b 981 271 900 107 937 190 b 994 288 984 278 985 288 b 1009 269 1004 288 1007 278 b 1077 112 1034 217 1051 163 b 1158 43 1103 62 1129 43 b 1231 69 1179 43 1204 55 b 1348 189 1280 98 1315 143 b 1444 451 1407 271 1444 357 b 1431 547 1444 482 1440 514 b 1188 750 1401 665 1299 750 b 1158 747 1178 750 1168 749 b 1079 684 1119 742 1089 727 b 1063 632 1076 665 1071 648 b 1056 609 1058 622 1056 615 b 1071 599 1056 602 1060 599 b 1086 600 1076 599 1080 600 b 1130 605 1102 603 1116 605 b 1244 569 1171 605 1210 595 b 1349 346 1322 511 1349 433 b 1348 312 1349 334 1349 324 b 1289 197 1345 266 1325 228 b 1238 174 1270 181 1253 174 b 1188 215 1220 174 1202 187 b 1145 308 1172 245 1159 276 b 1096 413 1129 343 1120 382 b 1053 438 1084 431 1068 438 b 1011 413 1038 438 1022 431 b 955 324 989 384 971 354 b 850 127 920 258 886 192 b 838 112 847 121 842 112 b 824 128 828 109 825 121 b 802 193 815 150 809 171 b 730 400 779 264 766 337 b 688 431 719 420 703 431 b 647 403 674 431 660 422 b 606 338 632 383 619 361 b 513 167 575 282 546 223 b 480 122 503 150 498 122 b 452 171 459 122 459 153 b 420 255 442 199 432 228 b 337 408 399 308 380 364 b 276 436 317 428 297 436 b 215 397 253 436 230 423 b 23 72 148 289 81 184 b 0 29 17 59 0 40 b 7 17 0 23 1 20 b 59 58 26 7 46 39 b 190 276 111 127 143 206 b 216 301 202 292 207 301 b 245 279 223 301 232 294 b 311 166 278 248 292 206 b 367 16 331 117 346 65 b 402 -19 377 -7 387 -19 b 438 -4 412 -19 423 -13 b 518 88 474 17 495 55 b 628 284 562 150 592 216 b 657 223 648 266 651 243 b 717 13 677 154 696 84 b 755 -29 726 -16 737 -29 b 791 -16 765 -29 776 -24 z', + }, + ornamentPrecompDoubleCadenceUpperPrefix: { + x_min: 0, + x_max: 1246, + y_min: -30, + y_max: 296.0302860502196, + ha: 326.0302860502196, + o: 'm 360 -43 b 559 59 445 -43 503 7 b 698 236 615 111 652 179 b 714 248 704 243 710 248 b 727 235 719 248 721 243 l 848 42 b 883 12 860 22 870 12 b 917 32 891 12 903 19 b 946 62 927 42 939 50 b 1037 192 972 108 1009 147 b 1057 210 1044 204 1051 210 b 1076 190 1063 210 1068 203 l 1176 12 b 1215 -19 1188 -9 1201 -19 b 1250 -6 1225 -19 1237 -14 b 1284 27 1264 3 1274 16 b 1380 190 1323 78 1351 135 b 1395 210 1384 197 1385 210 b 1413 190 1405 210 1410 197 b 1508 40 1436 134 1467 85 b 1564 3 1529 14 1547 3 b 1617 32 1580 3 1597 12 b 1767 238 1678 92 1719 167 b 1794 310 1781 259 1791 282 b 1752 294 1776 317 1764 304 b 1656 164 1711 258 1689 206 b 1629 144 1646 151 1637 144 b 1603 161 1620 144 1613 150 b 1502 315 1562 207 1525 258 b 1452 357 1490 344 1470 357 b 1397 320 1431 357 1411 344 b 1316 170 1368 271 1345 219 b 1280 127 1306 154 1303 127 b 1244 171 1256 127 1254 154 b 1145 337 1210 226 1179 282 b 1110 363 1135 354 1122 363 b 1070 338 1097 363 1084 354 b 1050 311 1063 330 1057 320 b 959 181 1017 271 992 223 b 939 167 950 173 945 167 b 920 184 933 167 927 173 b 818 343 887 238 852 291 b 759 395 795 377 778 395 b 701 344 742 395 724 377 b 698 338 700 341 700 340 b 544 154 652 272 605 207 b 412 98 501 117 458 98 b 304 130 377 98 341 108 b 95 373 204 187 144 275 b 58 426 85 393 82 428 b 19 366 26 426 26 389 b 0 307 13 346 0 327 b 4 287 0 300 1 294 b 174 36 49 194 91 102 b 360 -43 230 -9 289 -43 z', + }, + ornamentPrecompDoubleCadenceUpperPrefixTurn: { + x_min: 0, + x_max: 1226, + y_min: -237, + y_max: 436, + ha: 673, + o: 'm 1279 -341 b 1293 -252 1293 -307 1295 -278 b 1277 36 1287 -156 1282 -59 l 1273 118 b 1318 176 1289 137 1303 157 b 1349 203 1332 193 1342 203 b 1378 168 1359 203 1367 192 b 1456 35 1401 122 1428 78 b 1511 -12 1476 3 1493 -12 b 1568 23 1526 -12 1544 0 b 1597 53 1578 32 1588 42 b 1705 186 1629 101 1669 143 b 1761 284 1728 216 1751 246 b 1765 300 1763 288 1765 295 b 1763 307 1765 302 1765 305 b 1737 302 1754 311 1744 308 b 1718 287 1729 298 1725 292 b 1598 145 1673 245 1637 194 b 1578 130 1590 135 1584 130 b 1557 147 1571 130 1565 135 b 1447 321 1516 202 1488 265 b 1403 351 1433 341 1417 351 b 1358 323 1388 351 1372 341 b 1269 209 1329 285 1299 248 b 1254 521 1264 314 1259 418 b 1228 616 1253 554 1247 588 b 1218 628 1224 621 1223 628 l 1215 628 b 1201 613 1210 626 1202 619 b 1200 600 1200 609 1200 605 l 1200 586 b 1211 348 1204 507 1207 428 b 1217 166 1214 288 1215 226 b 1202 181 1212 168 1208 174 b 1094 334 1168 233 1130 284 b 1048 366 1079 356 1064 366 b 1004 331 1034 366 1018 354 b 904 154 969 275 930 220 b 873 202 887 171 880 187 b 778 356 845 256 819 311 b 737 379 763 372 750 379 b 698 353 724 379 711 370 l 621 232 b 415 114 570 154 495 114 b 302 138 377 114 340 121 b 73 400 187 192 117 284 b 55 420 69 415 62 420 b 42 410 50 420 45 416 b 0 292 23 373 0 334 b 4 262 0 282 1 272 b 168 39 32 168 92 99 b 359 -26 225 -6 292 -26 b 585 76 446 -26 530 10 b 668 202 616 115 641 160 b 693 228 680 219 687 228 b 720 203 700 228 707 219 b 801 63 752 160 775 111 b 844 7 812 42 818 7 b 910 66 877 6 894 39 b 923 94 916 75 919 85 b 995 219 945 137 968 179 b 1025 184 1009 210 1017 197 b 1119 56 1054 141 1087 98 b 1166 20 1138 32 1152 20 b 1215 50 1181 20 1195 30 b 1221 56 1217 52 1218 55 b 1228 -163 1223 -17 1225 -89 b 1279 -341 1231 -223 1251 -278 z', + }, + ornamentPrecompTrillLowerSuffix: { + x_min: 0, + x_max: 833, + y_min: -309, + y_max: 319, + ha: 628, + o: 'm 778 -444 b 801 -445 785 -444 793 -445 b 1037 -338 894 -445 969 -397 b 1200 37 1149 -240 1200 -109 b 1084 406 1200 171 1172 300 b 1024 444 1064 431 1043 444 b 960 390 999 444 978 426 b 841 163 923 314 886 236 b 812 128 832 150 827 128 b 786 167 796 130 793 153 b 660 418 744 251 716 341 b 599 459 639 445 619 459 b 541 410 577 459 557 444 b 439 197 507 340 474 269 b 422 179 435 190 435 179 b 338 393 392 251 379 328 b 275 439 320 423 298 439 b 212 396 253 439 230 425 b 71 219 170 333 128 268 b 0 45 17 173 16 112 b 68 98 32 62 50 78 b 194 264 112 150 153 209 b 230 292 209 282 219 292 b 264 261 240 292 251 282 b 274 242 268 255 269 248 b 346 46 304 179 325 112 b 376 10 351 32 354 10 b 412 35 392 10 403 22 b 452 107 429 56 441 82 b 541 291 481 168 511 230 b 556 307 547 302 552 307 b 573 295 562 307 567 302 b 624 217 595 272 611 246 b 721 1 657 145 685 72 b 755 -27 732 -19 742 -27 b 786 -16 765 -27 775 -24 b 857 73 819 7 840 39 b 952 256 887 134 920 194 b 978 289 963 279 969 289 b 1009 262 985 289 994 281 b 1030 235 1017 253 1024 245 b 1110 -4 1071 161 1099 81 b 1116 -68 1113 -26 1116 -48 b 1009 -243 1116 -140 1090 -200 b 848 -291 956 -272 901 -291 b 730 -261 809 -291 770 -282 b 696 -248 714 -252 703 -248 b 671 -284 684 -248 678 -258 l 662 -312 b 657 -357 658 -330 657 -344 b 744 -439 657 -403 683 -425 z', + }, + brassScoop: { + x_min: -0.4444444444444445, + x_max: 312, + y_min: -390, + y_max: 28, + ha: 418, + o: 'm 0 -562 b 393 -256 171 -504 307 -412 b 449 -39 431 -189 449 -115 b 448 -1 449 -26 449 -14 b 433 40 446 14 448 40 b 408 -3 410 40 412 14 b 396 -66 403 -23 402 -46 b 45 -397 346 -243 209 -337 b 0 -451 13 -409 1 -423 b 0 -562 -1 -485 0 -520 z', + }, + brassDoitMedium: { + x_min: -0.32815253965710617, + x_max: 476.21251177608565, + y_min: -50, + y_max: 333.1535583875376, + ha: 383.1535583875376, + o: 'm 16 -72 b 27 -71 19 -72 23 -72 b 215 -33 89 -56 153 -48 b 521 114 327 -7 435 35 b 685 432 615 199 691 295 b 670 480 684 449 688 475 b 642 441 654 482 648 456 b 403 183 599 321 513 240 b 79 89 301 130 192 105 b 0 -1 -12 76 0 76 b 0 -50 0 -17 1 -33 b 16 -72 0 -65 3 -72 z', + }, + brassFallLipShort: { + x_min: 0, + x_max: 298, + y_min: -344, + y_max: 65, + ha: 409, + o: 'm 396 -495 b 420 -461 412 -487 418 -474 b 429 -382 428 -435 429 -409 b 426 -330 429 -364 428 -347 b 285 -6 410 -209 356 -104 b 98 94 239 59 173 94 b 39 86 79 94 58 92 b 0 49 20 81 0 73 l 0 -52 b 10 -69 0 -62 1 -69 b 20 -68 13 -69 16 -69 b 88 -56 45 -59 66 -56 b 261 -160 156 -56 213 -95 b 396 -495 333 -259 382 -369 z', + }, + brassLiftMedium: { + x_min: 0, + x_max: 807, + y_min: 0, + y_max: 838, + ha: 838, + o: 'm 50 0 b 55 1 52 0 53 0 b 58 23 65 7 59 16 b 55 58 56 36 55 48 b 130 117 55 99 75 112 b 220 213 202 121 220 141 b 315 308 220 289 238 308 l 336 308 b 408 380 393 310 406 321 b 461 452 409 438 416 452 b 485 451 468 452 477 451 b 569 510 531 448 556 464 b 573 543 572 520 572 531 b 657 619 580 605 595 618 b 698 621 670 619 684 619 b 788 700 749 625 778 649 b 798 778 792 726 793 752 b 873 857 806 841 809 845 b 985 950 927 867 973 887 b 1084 1047 1002 1035 1004 1034 b 1162 1128 1133 1056 1162 1087 b 1146 1182 1162 1145 1158 1164 b 1125 1207 1140 1191 1136 1207 l 1122 1207 b 1110 1191 1113 1205 1110 1198 b 1112 1174 1110 1185 1112 1178 b 1048 1110 1109 1126 1096 1113 b 1028 1109 1043 1110 1035 1109 b 939 1022 969 1102 948 1081 b 845 922 929 949 917 936 b 746 812 773 909 753 886 b 744 780 744 802 744 791 b 635 681 737 700 717 683 b 524 583 553 680 536 665 b 439 510 514 520 503 510 b 357 431 377 510 360 492 l 357 406 b 314 364 356 379 343 364 b 238 361 288 364 264 364 b 173 300 202 357 180 334 b 167 245 168 281 167 262 b 105 174 166 192 157 180 b 75 171 95 173 85 171 b 6 112 30 166 14 153 b 0 73 1 98 0 85 b 37 10 0 45 13 26 b 50 0 42 7 46 0 z', + }, + brassFallRoughMedium: { + x_min: 0, + x_max: 791, + y_min: 0, + y_max: 819, + ha: 819, + o: 'm 1117 0 b 1139 101 1129 26 1139 71 b 1138 121 1139 109 1139 115 b 1084 193 1125 171 1110 193 b 1044 183 1073 193 1060 189 b 1022 177 1035 179 1028 177 b 1007 209 1012 177 1008 186 b 876 324 1004 292 959 330 b 799 317 850 321 825 320 b 759 354 772 314 755 320 b 760 373 760 360 760 366 b 759 392 760 379 760 384 b 681 477 753 451 730 477 b 654 474 672 477 664 475 b 606 467 638 471 622 468 b 586 465 599 465 592 465 b 564 481 570 465 564 469 b 569 505 564 487 566 495 b 575 553 572 521 575 537 b 572 585 575 564 573 575 b 481 665 560 657 539 668 b 412 665 458 664 435 665 b 382 690 392 667 382 672 b 383 700 382 693 383 696 b 386 773 387 724 387 749 b 297 858 382 828 351 857 b 229 861 274 858 251 858 b 190 897 207 863 193 871 b 163 1012 186 936 180 976 b 79 1084 145 1050 124 1084 b 66 1083 75 1084 71 1083 b 43 1096 49 1081 43 1087 b 48 1112 43 1100 45 1106 b 53 1130 52 1119 53 1125 b 39 1169 53 1145 45 1158 b 26 1179 36 1175 30 1179 b 16 1171 22 1179 17 1176 b 0 1103 10 1149 0 1126 b 9 1067 0 1092 1 1079 b 91 1021 26 1031 52 1018 b 145 978 122 1024 141 1011 b 156 913 147 956 151 935 b 291 795 170 831 210 795 b 346 768 337 795 346 796 b 344 743 346 760 344 753 b 343 716 344 733 343 724 b 455 600 343 651 390 602 b 505 605 471 599 490 605 b 528 598 514 605 523 603 b 536 579 534 592 536 586 b 524 523 536 562 526 541 b 523 505 524 517 523 511 b 621 405 523 442 560 405 b 639 406 626 405 634 406 b 677 413 652 408 664 410 b 701 416 687 415 696 416 b 721 392 716 416 721 410 b 720 373 721 386 720 380 b 831 255 714 301 759 252 b 897 261 854 255 876 261 b 926 262 909 261 919 262 b 969 197 963 262 965 252 b 971 184 969 193 971 189 b 1031 115 979 137 998 115 b 1071 122 1043 115 1056 118 b 1096 130 1079 125 1086 127 b 1087 59 1094 107 1087 82 b 1117 0 1087 37 1094 17 z', + }, + brassBend: { + x_min: 0, + x_max: 381, + y_min: 0, + y_max: 367, + ha: 367, + o: 'm 298 0 b 472 50 359 0 418 14 b 537 135 501 71 530 92 b 543 216 543 163 543 190 l 543 266 b 544 308 543 281 543 295 b 549 433 546 354 549 395 b 543 507 549 459 547 482 b 533 528 541 516 544 528 b 511 508 524 528 514 520 b 508 478 510 498 508 488 b 504 318 507 425 504 372 b 505 264 504 300 505 282 b 446 181 505 220 484 199 b 294 150 396 160 344 150 b 92 194 226 150 158 167 b 45 269 62 207 45 230 b 46 359 46 300 46 328 b 37 497 46 405 45 451 b 27 523 36 507 37 523 b 4 498 14 524 6 513 b 3 481 3 492 3 487 b 0 409 1 456 0 433 b 4 228 0 348 4 288 b 3 177 4 210 4 194 b 68 53 1 125 20 84 b 200 10 108 27 154 17 b 298 0 233 4 266 0 z', + }, + brassMuteClosed: { + x_min: 0, + x_max: 274, + y_min: 0, + y_max: 260, + ha: 260, + o: 'm 203 0 b 209 1 206 0 207 0 b 216 13 215 4 216 9 l 215 27 l 215 153 b 216 161 216 156 216 158 b 372 164 268 163 318 164 b 395 184 383 164 395 166 l 395 189 b 357 229 392 209 386 229 b 219 228 311 229 265 228 l 223 310 b 209 357 225 328 219 344 b 189 374 203 364 197 374 b 184 373 187 374 186 373 b 177 359 179 372 177 366 l 177 348 l 173 222 l 39 222 b 0 206 12 222 0 219 b 10 174 0 199 3 189 b 46 157 19 157 30 157 b 108 160 68 158 88 160 b 171 161 130 161 150 161 l 167 58 b 184 16 167 40 171 26 b 203 0 192 12 196 0 z', + }, + brassMuteOpen: { + x_min: 1, + x_max: 313.01193341111656, + y_min: 0, + y_max: 309, + ha: 309, + o: 'm 265 0 b 451 189 363 7 452 88 l 451 215 b 348 383 441 285 405 343 b 209 445 288 426 248 445 b 84 379 168 445 132 420 b 69 364 79 373 73 369 b 1 213 30 323 1 275 b 230 0 1 88 94 0 z m 210 62 b 128 73 181 62 154 66 b 40 171 71 91 42 125 b 52 226 40 187 45 206 b 197 374 79 295 130 344 b 228 382 207 380 217 382 b 300 361 252 382 276 370 b 374 308 328 350 353 331 b 410 223 397 284 410 253 b 393 163 410 202 405 181 b 210 62 354 91 288 63 z', + }, + brassFlip: { + x_min: 0, + x_max: 402, + y_min: 0, + y_max: 361, + ha: 361, + o: 'm 579 0 b 511 153 579 68 557 117 b 52 504 359 271 206 387 b 29 520 45 510 39 520 b 20 517 26 520 23 518 b 0 477 3 510 0 494 l 0 125 b 17 20 1 92 1 56 b 40 84 37 40 40 60 b 42 287 40 151 42 219 l 42 363 z', + }, + brassJazzTurn: { + x_min: 0, + x_max: 646, + y_min: 0, + y_max: 212, + ha: 212, + o: 'm 310 0 b 367 33 327 0 344 10 b 389 55 374 40 382 49 b 490 145 423 85 456 114 b 507 154 495 151 501 154 b 524 144 513 154 517 151 b 598 72 547 120 575 98 b 700 24 625 42 662 24 b 765 43 721 24 744 30 b 893 147 812 72 855 105 b 930 212 910 166 923 186 b 912 215 923 213 917 215 b 871 199 896 215 883 209 b 812 153 852 183 832 167 b 789 144 805 148 796 144 b 773 156 782 144 776 147 b 691 251 757 199 720 222 b 603 301 658 282 631 301 b 527 258 580 301 556 288 b 420 156 494 222 455 190 b 399 143 412 147 405 143 b 377 157 392 143 386 147 b 259 282 340 200 300 242 b 219 305 245 298 232 305 b 177 279 204 305 192 297 b 55 127 137 228 95 177 b 0 52 36 104 20 79 b 14 50 6 50 10 50 b 53 66 32 50 45 58 b 115 131 75 88 98 108 b 135 148 124 143 130 148 b 157 132 141 148 148 143 b 252 33 186 96 219 65 b 310 0 275 12 292 0 z', + }, + brassSmear: { + x_min: 0, + x_max: 334, + y_min: 0, + y_max: 151, + ha: 151, + o: 'm 321 0 b 475 125 390 0 436 43 b 481 143 478 131 481 137 b 475 154 481 147 480 151 b 449 148 468 158 458 154 b 395 132 432 137 413 132 b 343 140 377 132 360 137 b 229 194 301 148 266 173 b 168 217 206 209 186 217 b 109 192 148 217 130 209 b 0 26 59 148 32 89 b 59 63 32 29 45 48 b 98 84 72 78 84 84 b 130 73 108 84 118 81 b 213 26 157 58 183 37 b 321 0 255 9 289 0 z', + }, + stringsDownBow: { + x_min: 0, + x_max: 306, + y_min: -0.09607201951262866, + y_max: 366, + ha: 366.09607201951263, + o: 'm 405 0 b 425 17 413 -1 420 9 b 439 66 435 32 439 48 b 441 268 439 137 441 202 b 436 412 441 314 439 361 l 435 413 b 423 469 435 436 431 456 b 344 508 406 501 373 501 b 204 527 298 520 251 527 b 60 498 156 527 108 518 b 7 438 32 485 10 468 l 7 426 b 4 337 7 396 7 367 b 0 140 0 272 0 206 b 1 42 0 107 0 73 b 13 3 1 27 -3 4 b 40 39 29 3 35 24 b 42 53 42 43 40 49 b 49 141 48 84 49 112 b 48 215 49 167 48 192 b 49 252 48 228 48 240 l 49 312 b 130 343 72 331 99 340 b 206 347 156 346 180 347 b 372 314 262 347 318 338 l 390 307 l 390 245 b 390 138 392 212 390 176 b 397 23 390 101 392 62 b 405 0 399 14 393 1 z', + }, + stringsUpBow: { + x_min: 0, + x_max: 219.2842808242076, + y_min: 0, + y_max: 489, + ha: 489, + o: 'm 151 0 b 184 42 170 12 180 26 b 297 554 223 212 261 382 b 315 690 305 598 318 645 b 304 704 315 697 311 704 b 276 670 288 704 282 697 b 157 131 236 490 196 311 l 157 144 b 73 526 134 276 104 396 b 30 677 60 576 52 638 b 13 694 26 684 22 694 b 0 674 9 694 0 691 l 0 671 b 10 603 3 649 6 626 b 105 174 42 461 72 317 b 150 0 117 117 128 58 z', + }, + stringsHarmonic: { + x_min: 0, + x_max: 191, + y_min: 0, + y_max: 202, + ha: 202, + o: 'm 143 0 b 275 122 217 0 275 53 b 127 291 275 206 202 291 b 0 154 63 291 0 222 b 143 0 0 76 71 0 z m 122 68 b 43 105 89 66 59 75 b 39 124 40 111 39 117 b 79 199 39 148 56 180 b 145 226 101 216 122 226 b 199 210 163 226 180 220 b 235 150 223 196 235 173 b 203 92 235 128 225 107 b 122 68 181 76 150 68 z', + }, + pluckedSnapPizzicatoAbove: { + x_min: 0, + x_max: 201, + y_min: 0, + y_max: 325, + ha: 325, + o: 'm 171 0 b 289 99 240 0 289 45 b 258 183 289 130 274 156 b 174 269 236 217 203 240 l 174 408 b 174 429 174 415 176 422 b 131 468 168 451 153 468 b 117 451 120 468 117 461 b 118 429 117 444 118 435 b 115 307 117 389 115 347 b 0 166 59 295 0 223 b 171 0 0 85 89 0 z m 134 55 b 52 131 84 55 52 85 b 115 233 52 179 81 209 b 114 192 114 220 114 206 b 174 120 114 137 114 137 l 174 228 b 233 148 200 207 223 183 b 236 130 235 143 236 135 b 197 72 236 105 223 85 b 134 55 177 60 157 55 z', + }, + pluckedSnapPizzicatoBelow: { + x_min: 0, + x_max: 211, + y_min: 0, + y_max: 307, + ha: 307, + o: 'm 145 7 b 163 0 153 3 158 0 b 173 23 170 0 173 7 l 173 140 l 170 140 l 170 163 l 171 163 b 206 170 179 164 193 166 b 304 287 264 186 304 233 b 281 354 304 308 297 333 b 118 442 240 412 186 439 b 0 324 69 442 0 370 b 115 176 0 266 55 202 l 115 56 b 145 7 114 33 125 19 z m 115 220 b 62 256 92 223 73 230 b 53 292 56 269 53 281 b 78 344 53 311 60 328 b 168 384 105 372 135 384 b 213 376 183 384 199 382 b 253 321 239 366 253 346 b 246 291 253 311 251 301 b 170 226 230 256 203 236 l 170 258 b 148 305 171 278 163 292 b 128 315 143 310 135 315 l 124 315 b 115 301 117 314 115 308 z', + }, + pluckedLeftHandPizzicato: { + x_min: 0, + x_max: 271, + y_min: 0, + y_max: 284, + ha: 284, + o: 'm 213 0 b 223 14 222 0 223 7 b 222 35 223 22 222 29 l 222 176 b 373 170 272 174 323 170 b 390 180 382 170 390 171 l 390 184 b 347 232 386 207 382 232 b 219 238 307 233 266 235 l 219 364 b 171 409 219 395 193 409 b 156 393 160 409 156 402 b 158 370 156 384 158 376 l 158 240 b 16 239 115 240 66 239 b 0 226 7 239 0 238 l 0 223 b 50 179 1 203 29 179 b 158 177 86 179 122 179 l 158 63 b 161 29 158 52 158 40 b 213 0 166 -1 194 1 z', + }, + keyboardPedalPed: { + x_min: 0, + x_max: 944, + y_min: -13, + y_max: 550, + ha: 563, + o: 'm 22 0 b 109 78 53 0 105 46 l 144 333 b 163 376 147 347 140 372 b 364 465 238 390 301 426 b 454 599 416 497 454 540 b 452 618 454 605 454 612 b 320 770 442 694 396 747 b 248 779 295 778 272 779 b 193 778 229 779 212 779 b 160 780 181 778 167 775 b 137 792 153 789 144 791 b 109 789 128 792 118 789 b 7 719 59 789 48 737 b 23 708 16 714 20 708 b 36 710 29 710 33 710 b 53 684 52 710 53 698 l 53 674 b 43 386 53 577 53 482 b 20 164 36 312 30 238 b 1 30 14 120 7 75 b 0 19 0 26 0 22 b 22 0 0 9 4 0 z m 171 425 b 156 442 160 425 156 429 b 157 475 157 452 157 464 b 164 602 161 517 164 560 b 161 698 164 635 163 667 b 184 729 161 720 167 729 l 193 729 b 348 563 278 719 348 641 b 346 539 348 554 347 547 b 171 425 328 459 229 422 z m 979 6 b 1008 13 986 6 995 9 b 1081 101 1047 29 1079 46 b 1116 449 1087 217 1104 333 b 1143 654 1123 518 1133 586 b 1148 685 1145 664 1148 675 b 1140 704 1148 693 1146 700 b 1107 716 1130 713 1119 716 b 1056 706 1092 716 1073 710 b 1037 671 1035 703 1038 685 b 1004 439 1025 595 1014 517 b 986 419 1001 428 999 419 b 979 419 985 419 982 420 b 935 426 965 423 949 425 b 795 376 884 426 838 405 b 664 153 714 323 664 249 b 665 130 664 145 665 138 b 753 29 671 65 704 29 b 815 40 773 29 792 33 b 975 147 873 65 923 101 b 965 45 971 108 968 76 b 979 6 963 17 966 6 z m 393 -17 b 634 145 494 16 579 52 b 638 160 636 151 638 156 b 625 168 638 166 634 168 b 621 167 624 168 622 168 b 524 118 582 164 544 160 b 495 79 517 104 505 92 b 435 33 471 49 452 33 b 380 96 416 33 397 55 b 369 145 373 114 369 131 b 442 225 369 186 395 213 b 468 232 451 228 459 229 b 654 344 539 255 606 285 b 677 395 667 360 677 376 b 672 415 677 402 675 408 b 612 459 661 442 639 455 b 589 461 602 461 592 461 b 348 328 500 461 409 408 b 269 120 302 268 269 199 b 379 -19 269 45 318 -19 b 393 -17 383 -19 389 -19 z m 395 240 b 494 383 418 300 452 344 l 521 405 b 544 419 528 409 536 418 b 554 415 547 419 550 418 b 570 383 564 406 570 396 l 570 379 b 552 331 570 360 562 344 b 395 240 511 285 462 253 z m 827 89 b 792 111 815 89 804 96 b 766 204 775 131 766 158 b 845 360 772 256 799 314 b 871 372 854 369 863 372 b 897 366 880 372 888 369 b 978 279 942 353 963 320 b 976 259 981 272 981 265 b 858 104 942 203 909 147 b 827 89 847 94 837 89 z m 1282 12 b 1336 35 1303 14 1320 23 b 1359 71 1351 45 1359 58 b 1338 102 1359 82 1352 95 b 1254 130 1312 118 1284 130 b 1187 88 1223 130 1202 109 b 1178 65 1182 81 1178 72 b 1195 37 1178 55 1182 45 b 1282 12 1223 23 1253 19 z', + }, + keyboardPedalUp: { + x_min: 0, + x_max: 436.6015132318337, + y_min: 0, + y_max: 461, + ha: 461, + o: 'm 330 0 b 334 1 331 0 333 0 b 340 12 338 4 340 7 l 338 26 b 340 264 338 105 338 184 b 526 95 400 206 461 148 b 559 71 536 88 547 71 b 564 72 560 71 563 71 b 580 121 580 79 580 102 l 580 127 b 543 203 585 158 573 184 b 472 259 518 219 495 238 l 445 285 b 590 292 494 288 541 291 b 622 318 609 294 618 302 b 628 359 625 331 626 346 b 586 402 632 393 621 405 b 464 395 546 399 504 396 l 559 491 b 567 524 567 500 567 510 b 564 543 567 527 567 536 b 539 596 559 563 560 590 b 494 564 521 600 508 577 b 340 413 442 514 390 464 l 340 560 b 287 664 340 600 321 632 b 271 518 274 612 272 566 b 268 445 269 494 269 469 b 117 569 219 488 168 530 b 96 579 109 575 102 579 b 85 560 89 579 85 573 b 124 446 85 518 82 477 b 209 380 153 426 181 403 b 45 374 154 377 99 376 b 0 324 9 374 0 359 b 63 266 0 265 1 265 b 144 272 89 269 117 272 l 196 272 b 108 193 167 246 138 219 b 60 135 76 164 60 151 b 99 73 60 121 73 105 b 104 68 101 72 102 71 b 114 58 107 60 111 58 b 130 66 120 58 124 62 b 259 186 173 107 217 145 b 256 117 259 163 256 140 b 311 13 256 72 271 37 b 330 0 317 10 323 0 z', + }, + pictChokeCymbal: { + x_min: 1, + x_max: 147, + y_min: 0, + y_max: 242, + ha: 242, + o: 'm 79 4 b 207 158 153 32 192 88 b 212 200 210 173 212 187 b 143 336 212 253 187 298 b 98 348 131 344 115 348 b 4 295 60 348 16 327 b 1 276 1 289 1 282 b 9 249 1 266 3 258 b 121 183 35 206 72 183 b 156 186 132 183 144 183 b 26 53 134 115 91 73 b 7 39 13 49 7 45 b 19 20 7 33 12 27 b 59 0 30 9 43 0 b 79 4 65 0 72 1 z', + }, + wiggleArpeggiatoUp: { + x_min: -22, + x_max: 300, + y_min: 0, + y_max: 176, + ha: 176, + o: 'm 173 4 b 196 0 180 1 189 0 b 246 26 215 0 230 9 b 301 117 271 53 285 85 b 312 131 305 125 307 131 b 327 124 315 131 321 128 b 373 86 341 112 353 101 b 412 69 389 75 402 69 b 432 94 425 69 432 79 b 373 181 432 117 413 154 b 235 252 323 216 285 245 b 220 253 229 253 225 253 b 168 215 196 253 181 240 b 111 112 151 180 140 141 b 94 102 105 105 99 102 b 78 111 89 102 84 105 b 0 181 55 135 35 160 b -32 153 -20 194 -32 168 b 0 86 -32 124 -32 109 b 94 36 22 71 73 46 b 173 4 134 16 131 17 z', + }, + arpeggiatoUp: { + x_min: 0, + x_max: 262, + y_min: 0, + y_max: 1459, + ha: 1459, + o: 'm 190 0 b 160 63 187 29 170 45 b 145 108 150 81 145 95 b 183 163 145 128 157 145 b 300 246 222 190 262 216 b 347 318 333 272 347 295 b 301 393 347 341 331 364 b 258 413 289 403 272 408 b 145 449 220 425 183 436 b 117 464 135 452 120 452 b 140 491 115 477 128 484 b 294 593 192 526 243 557 b 330 647 318 611 330 626 b 314 693 330 660 324 675 b 262 736 302 714 285 729 b 170 763 230 744 200 753 b 122 783 153 768 125 768 b 160 831 120 804 143 818 b 288 922 202 861 246 890 b 333 999 318 945 333 972 b 266 1083 333 1032 310 1064 b 189 1115 240 1094 215 1103 b 122 1178 145 1133 122 1153 b 168 1250 122 1200 138 1223 l 180 1257 b 269 1333 210 1283 240 1306 b 305 1405 294 1356 305 1381 b 284 1469 305 1426 298 1447 b 228 1525 269 1492 251 1511 b 183 1600 197 1545 183 1571 b 190 1640 183 1613 184 1626 b 197 1670 193 1650 194 1660 b 272 1735 213 1719 230 1735 b 295 1734 279 1735 287 1735 b 323 1732 305 1732 314 1732 b 350 1731 333 1732 341 1732 b 377 1742 369 1729 377 1732 b 370 1761 377 1747 374 1754 l 301 1898 b 217 2066 274 1954 248 2012 b 186 2101 204 2089 196 2101 b 154 2069 177 2101 167 2091 b 12 1824 105 1987 59 1907 b 0 1787 4 1810 0 1797 b 59 1744 0 1761 20 1745 b 160 1738 92 1744 125 1740 b 145 1692 156 1721 151 1706 b 135 1633 138 1672 135 1652 b 184 1518 135 1591 151 1552 b 229 1475 199 1503 213 1488 b 259 1431 249 1456 259 1444 b 229 1388 259 1420 249 1407 b 151 1325 203 1365 177 1345 b 105 1279 134 1310 118 1296 b 73 1202 84 1251 73 1227 b 108 1123 73 1176 85 1152 b 255 1031 148 1077 199 1051 b 282 1014 274 1025 282 1021 b 262 991 282 1008 275 1001 b 151 914 226 963 189 939 b 79 851 125 896 99 877 b 63 809 69 837 63 824 b 79 769 63 796 68 783 b 202 697 111 729 154 710 b 266 670 225 690 266 688 b 210 622 266 648 232 635 b 82 534 167 593 120 570 b 55 491 63 518 55 505 b 79 448 55 478 63 465 b 255 361 127 395 192 380 b 288 343 269 359 288 357 b 266 312 288 331 275 320 b 144 223 229 278 184 253 b 85 134 104 193 85 166 b 118 53 85 111 96 85 b 190 0 135 29 160 14 z', + }, + arpeggiatoDown: { + x_min: 0, + x_max: 218, + y_min: 0, + y_max: 1440, + ha: 1440, + o: 'm 161 16 b 310 261 210 98 259 180 b 314 275 312 266 314 271 b 302 295 314 282 310 289 b 252 311 287 308 269 311 b 217 310 240 311 229 310 b 190 333 202 310 194 315 b 151 412 186 363 171 389 b 102 501 120 452 102 477 b 150 588 102 524 118 547 b 161 603 154 592 158 598 b 181 661 176 622 181 641 b 173 704 181 675 179 690 b 86 795 156 746 121 770 b 53 829 63 811 53 819 b 78 868 53 840 62 851 b 102 888 85 876 94 883 b 180 956 128 912 156 933 b 216 1028 204 979 216 1002 b 203 1081 216 1044 212 1061 b 115 1171 186 1123 148 1145 b 75 1221 88 1191 75 1207 b 114 1272 75 1237 88 1251 b 173 1308 132 1284 154 1296 b 226 1339 190 1318 209 1328 b 265 1405 253 1359 265 1380 b 258 1447 265 1418 264 1431 b 154 1541 242 1499 199 1521 b 109 1581 124 1555 109 1567 b 141 1627 109 1594 121 1608 b 204 1680 163 1646 184 1662 b 233 1742 223 1699 233 1719 b 226 1777 233 1752 230 1764 b 135 1862 210 1822 173 1840 b 104 1895 114 1875 104 1884 b 118 1930 104 1904 109 1914 b 192 2006 135 1961 161 1986 b 206 2029 203 2013 206 2022 b 192 2064 206 2040 197 2052 b 180 2074 187 2071 184 2074 b 156 2061 171 2074 163 2065 b 84 1983 125 2040 102 2013 b 65 1921 71 1961 65 1941 b 88 1853 65 1899 72 1876 b 171 1784 108 1820 138 1801 b 190 1764 184 1777 190 1770 b 174 1741 190 1757 184 1750 b 107 1683 153 1722 128 1704 b 68 1610 81 1659 68 1636 b 88 1548 68 1591 75 1571 b 177 1470 109 1512 141 1489 b 223 1431 209 1453 223 1443 b 179 1390 223 1420 209 1408 b 128 1361 163 1380 145 1371 b 71 1322 108 1348 88 1338 b 32 1253 45 1300 32 1277 b 48 1198 32 1236 37 1218 b 147 1090 71 1152 108 1120 b 174 1057 166 1076 174 1067 b 153 1022 174 1047 167 1037 b 109 982 140 1008 124 995 b 37 919 85 962 59 942 b 9 860 17 899 9 880 b 26 806 9 844 14 827 b 120 717 50 769 84 740 b 138 691 132 708 138 700 b 130 668 138 684 135 677 b 92 618 118 651 105 635 b 59 531 71 589 59 560 b 84 455 59 507 68 481 b 132 386 98 431 115 408 b 148 341 144 372 148 357 b 144 317 148 333 147 324 b 121 305 140 307 131 305 l 98 305 b 82 304 94 304 88 304 l 32 304 b 0 292 10 304 0 302 b 12 266 0 287 4 279 b 60 164 32 233 46 199 b 127 20 84 117 105 68 b 144 0 132 9 137 0 b 161 16 150 0 154 4 z', + }, + repeat1Bar: { + x_min: 0, + x_max: 599.1057280164835, + y_min: -250, + y_max: 175, + ha: 425, + o: 'm 216 98 b 255 75 236 84 246 75 b 291 104 265 75 274 85 b 323 147 304 117 327 125 b 289 215 323 168 314 184 b 238 252 269 239 253 252 b 187 222 222 252 207 242 b 173 206 183 216 177 212 b 157 170 163 194 157 183 b 174 138 157 160 161 150 b 216 98 189 127 200 109 z m 76 -334 b 181 -285 111 -315 148 -302 b 831 52 396 -168 613 -58 b 863 114 855 63 864 82 b 828 202 855 140 855 176 b 808 213 821 209 815 213 b 793 209 804 213 799 212 l 422 19 b 26 -179 291 -48 164 -124 b 0 -213 10 -186 0 -196 b 3 -232 0 -219 0 -225 b 52 -325 14 -265 37 -294 b 66 -337 55 -331 59 -337 b 76 -334 69 -337 72 -336 z m 769 -360 b 829 -264 779 -360 829 -284 b 769 -176 822 -232 799 -200 b 742 -163 760 -167 750 -163 b 716 -184 733 -163 723 -168 b 683 -228 708 -202 693 -213 b 672 -253 675 -236 672 -245 b 683 -281 672 -262 675 -271 b 752 -353 703 -308 732 -327 b 769 -360 756 -357 763 -360 z', + }, + repeat2Bars: { + x_min: 0.008571918423331715, + x_max: 775, + y_min: -246.92374029115243, + y_max: 362.82068246705313, + ha: 609.7444227582056, + o: 'm 909 412 b 873 351 906 384 893 367 b 436 50 729 249 585 147 l 91 -179 b 62 -174 76 -189 68 -183 b 12 -96 48 -147 24 -125 b 36 -16 -7 -53 -6 -43 b 220 104 96 24 158 65 b 819 507 425 232 624 369 b 881 495 852 530 861 528 b 909 412 899 469 900 439 z m 333 338 b 302 240 330 307 317 274 b 276 235 297 225 287 228 l 233 269 b 203 376 186 307 183 318 b 225 441 212 397 217 419 b 246 454 228 452 232 458 b 333 338 284 441 333 380 z m 1116 228 b 1067 158 1115 192 1092 174 b 910 59 1015 125 963 92 b 478 -240 762 -33 622 -140 b 311 -350 423 -279 366 -314 b 285 -344 298 -360 289 -356 b 239 -258 272 -314 251 -288 b 261 -196 228 -228 235 -210 b 517 -29 348 -144 436 -91 b 1030 321 681 98 861 202 b 1093 307 1060 343 1076 340 b 1116 228 1107 281 1109 252 z m 1070 -105 b 1020 -210 1057 -143 1038 -176 b 998 -210 1014 -219 1004 -215 l 924 -153 b 913 -88 899 -135 897 -112 b 949 -22 926 -66 939 -45 b 998 -7 960 6 976 9 b 1070 -105 1032 -32 1058 -63 z', + }, + repeat4Bars: { + x_min: 0, + x_max: 1374, + y_min: -304, + y_max: 304, + ha: 608, + o: 'm 78 -266 b 92 -258 82 -266 88 -264 b 114 -240 98 -251 107 -246 b 638 107 289 -125 467 -14 b 873 271 716 161 793 216 b 907 337 894 285 906 305 b 887 400 901 354 897 379 b 852 438 877 426 867 438 b 814 420 842 438 829 432 b 135 -33 592 262 366 111 b 12 -121 92 -60 48 -84 b 0 -144 4 -128 0 -135 b 4 -160 0 -148 1 -154 b 63 -255 17 -196 45 -223 b 78 -266 68 -262 72 -266 z m 291 148 b 325 223 302 148 308 170 b 333 256 328 235 330 246 b 264 363 330 305 298 336 b 242 373 255 369 248 373 b 220 347 232 373 225 364 b 202 288 216 327 213 305 b 190 252 193 275 190 262 b 222 200 190 232 202 215 b 291 148 264 170 279 148 z m 815 -367 b 829 -359 819 -367 824 -364 b 851 -343 835 -353 844 -347 b 1375 6 1027 -228 1205 -117 l 1610 170 b 1644 235 1632 184 1643 203 b 1626 300 1639 253 1634 276 b 1590 337 1614 325 1604 337 b 1551 320 1580 337 1567 330 b 873 -135 1329 161 1103 10 b 749 -222 829 -161 785 -184 b 737 -245 742 -230 737 -238 b 742 -261 737 -249 739 -255 b 802 -357 755 -297 782 -325 b 815 -367 805 -363 809 -367 z m 396 -360 b 408 -356 400 -360 403 -359 b 609 -223 471 -307 543 -269 b 896 -19 706 -156 795 -81 b 1164 154 985 37 1074 96 b 1214 223 1189 170 1211 187 b 1176 321 1204 253 1205 292 b 1159 330 1169 327 1165 330 b 1145 324 1155 330 1151 328 b 1048 258 1113 302 1081 278 b 357 -202 809 117 598 -65 b 333 -238 341 -212 333 -223 b 338 -262 333 -245 334 -253 b 384 -350 350 -294 372 -318 b 396 -360 386 -354 390 -360 z m 1162 -438 b 1174 -433 1166 -438 1169 -436 b 1374 -300 1237 -384 1309 -346 b 1660 -96 1470 -233 1561 -158 b 1930 76 1751 -39 1840 19 b 1979 147 1954 92 1977 109 b 1943 243 1968 177 1971 216 b 1924 253 1935 251 1930 253 b 1911 248 1920 253 1915 252 b 1814 181 1878 225 1848 202 b 1123 -279 1575 40 1364 -141 b 1099 -315 1106 -289 1099 -300 b 1103 -338 1099 -321 1100 -330 b 1149 -426 1115 -370 1138 -396 b 1162 -438 1151 -432 1156 -438 z m 1875 -295 b 1882 -291 1878 -295 1879 -294 b 1934 -189 1904 -258 1921 -223 b 1872 -96 1925 -147 1901 -120 b 1840 -78 1858 -84 1848 -78 b 1812 -109 1830 -78 1823 -88 l 1777 -173 b 1770 -199 1773 -181 1770 -190 b 1786 -230 1770 -210 1774 -220 b 1862 -289 1809 -253 1837 -269 b 1875 -295 1865 -292 1871 -295 z', + }, + repeatBarSlash: { + x_min: 0, + x_max: 630, + y_min: -225.19160170741762, + y_max: 265.12618221237005, + ha: 490.31778391978764, + o: 'm 78 -324 b 92 -314 82 -325 88 -321 b 114 -298 96 -307 107 -302 b 638 49 289 -183 467 -72 b 873 215 716 104 792 161 b 907 279 894 229 906 248 b 887 344 901 298 897 321 b 852 382 877 369 867 380 b 814 363 842 383 829 376 b 135 -91 603 192 364 55 b 12 -177 92 -118 45 -137 b 0 -202 4 -186 0 -192 b 4 -217 0 -206 1 -212 b 63 -312 17 -253 42 -284 b 78 -324 68 -318 72 -323 z', + }, + csymDiminished: { + x_min: 0, + x_max: 506, + y_min: -0.011036179317259481, + y_max: 500, + ha: 500.0110361793173, + o: 'm 397 0 b 729 265 576 -1 729 95 b 711 367 729 297 723 331 b 472 670 668 498 586 595 b 315 720 423 701 372 720 b 253 713 295 720 275 719 b 32 514 144 687 75 615 b 0 374 12 468 0 420 b 27 251 0 333 9 292 b 140 117 52 196 92 153 b 397 0 223 52 317 4 z m 340 95 b 132 314 233 84 122 216 b 324 589 145 438 200 539 b 415 611 360 603 389 611 b 544 505 469 611 505 576 b 590 392 564 471 583 432 b 596 343 593 374 596 359 b 340 95 596 210 485 96 z', + }, + csymHalfDiminished: { + x_min: -32, + x_max: 496, + y_min: -33, + y_max: 492, + ha: 525, + o: 'm -29 -48 b 0 -36 -19 -48 -9 -40 b 17 -20 7 -32 12 -24 b 134 94 56 19 95 56 b 372 0 207 43 282 0 b 455 13 397 0 426 4 b 677 258 556 45 671 141 b 678 289 677 268 678 278 b 593 539 678 380 654 467 b 592 541 593 540 592 540 l 684 632 b 713 678 700 647 711 665 b 714 691 714 684 714 688 b 707 704 714 698 711 701 b 691 708 701 707 696 708 b 660 691 680 708 670 701 l 552 585 b 478 634 530 606 507 624 b 361 684 438 648 397 661 b 301 703 341 697 320 703 b 226 677 275 703 251 693 b 27 449 140 618 72 543 b 0 324 9 410 -4 370 b 88 128 -1 243 30 177 b -30 -7 43 86 0 46 b -46 -33 -35 -16 -46 -24 b -42 -42 -46 -36 -45 -39 b -29 -48 -37 -46 -33 -48 z m 141 179 b 121 251 128 200 121 225 b 128 297 121 265 124 281 b 351 575 163 420 248 505 b 377 582 359 579 369 580 b 501 536 422 586 468 567 b 141 179 382 416 261 298 z m 281 105 b 179 137 240 105 206 117 b 210 168 189 147 200 157 l 537 487 b 547 455 541 477 544 467 b 556 370 552 426 556 397 b 429 154 556 274 503 207 b 281 105 384 122 336 105 z', + }, + csymAugmented: { + x_min: 0, + x_max: 530, + y_min: 0, + y_max: 539, + ha: 539, + o: 'm 380 0 b 393 14 384 4 390 9 b 397 46 397 24 397 36 l 397 333 b 736 327 511 331 624 330 b 763 343 755 327 763 333 b 755 361 763 348 760 354 b 635 431 726 402 688 431 l 390 431 l 390 485 b 386 606 392 526 386 566 b 392 664 386 625 387 645 b 395 690 393 672 395 681 b 376 753 395 711 389 734 b 357 776 372 762 369 776 b 350 775 354 776 353 776 b 327 740 337 769 327 759 b 327 621 328 700 327 661 b 330 438 328 559 328 498 l 29 438 b 4 431 20 438 7 442 b 0 413 3 425 0 419 b 7 399 0 408 1 403 b 131 338 45 369 85 340 b 331 334 199 336 265 334 b 333 163 333 276 333 220 b 366 13 333 109 348 63 b 380 0 367 7 374 4 z', + }, + csymMajorSeventh: { + x_min: 0, + x_max: 593.1050509327923, + y_min: 0, + y_max: 569, + ha: 569, + o: 'm 124 1 l 497 27 b 819 50 605 35 711 43 b 854 98 847 52 855 63 b 812 200 845 128 835 166 b 564 585 730 328 648 456 b 435 786 521 652 480 720 b 397 819 419 809 408 819 b 369 792 387 819 379 811 b 7 173 248 585 128 379 b 0 150 3 166 0 158 b 7 128 0 143 3 135 b 89 10 30 86 65 50 b 109 0 95 1 102 0 z m 163 147 b 153 153 158 147 156 148 b 164 179 147 163 158 170 b 426 644 251 334 338 488 b 442 660 432 655 436 660 b 458 645 446 660 452 655 b 727 220 547 503 636 361 b 736 202 732 213 736 206 b 714 190 736 196 730 192 b 179 148 537 177 359 163 b 163 147 174 150 168 147 z', + }, + csymMinor: { + x_min: 0, + x_max: 481.64484584675915, + y_min: 193, + y_max: 265.20435472429375, + ha: 72.20435472429375, + o: 'm 168 278 b 197 279 177 278 187 278 b 431 292 275 287 353 288 l 431 291 b 661 302 508 295 585 300 b 693 311 672 304 688 300 b 674 346 697 324 685 338 b 564 382 641 366 606 384 l 27 360 b 0 347 17 360 1 366 b 19 314 0 333 3 321 b 168 278 66 291 115 278 z', + }, + csymParensLeftTall: { + x_min: 0, + x_max: 185, + y_min: 0, + y_max: 1034, + ha: 1034, + o: 'm 215 0 b 226 17 223 1 223 10 b 229 37 229 24 229 32 b 220 81 229 52 225 66 b 167 203 206 124 181 160 b 86 616 124 338 89 474 b 82 765 85 665 82 716 b 91 886 82 805 84 845 b 245 1319 120 1038 171 1184 b 266 1397 259 1346 266 1371 b 259 1443 266 1411 264 1427 b 226 1489 253 1463 248 1489 b 193 1454 212 1489 203 1467 b 114 1292 158 1404 140 1346 b 0 806 40 1138 0 978 b 3 721 0 779 0 750 b 1 677 1 707 1 693 b 36 418 1 593 16 504 b 144 96 62 307 95 199 b 196 12 158 66 179 39 b 212 0 200 7 204 0 z', + }, + csymParensRightTall: { + x_min: -40, + x_max: 188.5411603861406, + y_min: 0.20204102886728756, + y_max: 1058, + ha: 1057.7979589711326, + o: 'm 30 1 b 63 14 42 -3 55 6 b 122 99 86 40 108 68 b 189 258 145 153 166 204 b 271 667 239 379 268 503 b 246 852 275 708 261 780 b 10 1495 197 1077 128 1295 b -14 1524 4 1505 1 1524 b -16 1522 -14 1524 -16 1524 b -46 1489 -33 1521 -43 1503 b -58 1417 -53 1464 -58 1440 b -36 1335 -58 1390 -52 1364 b 68 1138 0 1270 35 1204 b 163 883 108 1056 137 969 b 206 668 184 814 200 742 b 207 631 207 655 207 642 b 166 426 207 560 192 492 b 46 143 130 330 111 228 b 19 29 19 109 17 69 b 30 1 20 19 24 3 z', + }, + csymBracketLeftTall: { + x_min: 0, + x_max: 328, + y_min: 2, + y_max: 807, + ha: 805, + o: 'm 68 3 b 76 4 71 3 73 3 b 186 13 112 12 150 13 b 240 13 204 13 222 13 l 287 13 b 379 17 317 13 348 13 b 472 121 435 24 472 69 b 467 156 472 132 469 144 b 446 174 462 168 456 174 l 439 174 b 327 166 402 167 364 166 b 265 167 307 166 285 167 l 209 167 b 187 475 199 269 189 372 b 166 985 186 645 187 815 l 377 1002 b 415 1001 389 1002 402 1001 b 456 1027 432 1001 448 1005 b 472 1096 467 1048 472 1073 b 464 1146 472 1113 469 1130 b 439 1162 459 1161 452 1162 b 40 1129 305 1151 173 1139 b 1 1093 17 1128 1 1120 b 0 1009 0 1064 0 1037 b 13 975 0 991 3 981 b 30 670 23 873 30 772 b 29 608 30 649 29 628 l 29 563 b 56 88 29 405 49 246 b 53 22 55 66 55 43 b 68 3 53 12 56 3 z', + }, + csymBracketRightTall: { + x_min: 0.8519422934604696, + x_max: 306, + y_min: -0.17180889215212544, + y_max: 829.1037519824849, + ha: 829.2755608746371, + o: 'm 117 0 b 372 29 203 -3 287 20 l 373 29 b 406 32 383 30 395 30 b 436 60 428 33 432 43 b 441 109 439 76 441 92 b 433 200 441 140 436 170 b 409 696 422 366 409 530 b 416 887 409 763 416 831 b 415 920 416 899 415 910 l 415 1106 b 412 1135 415 1116 415 1126 l 412 1145 b 373 1189 413 1171 408 1192 b 321 1189 356 1189 338 1189 l 215 1189 l 215 1194 l 56 1194 b 6 1153 27 1195 10 1187 b 1 1064 3 1123 4 1093 b 22 1043 0 1050 6 1043 b 84 1044 42 1044 63 1044 b 264 1038 144 1044 203 1040 b 265 958 264 1011 265 985 b 262 845 265 920 264 883 b 259 710 259 801 259 755 b 279 243 259 554 271 399 b 285 170 281 219 284 194 b 95 151 222 161 158 156 b 29 81 27 147 27 147 l 29 73 b 105 0 33 0 33 0 z', + }, + csymParensLeftVeryTall: { + x_min: 0, + x_max: 116, + y_min: 0, + y_max: 934.1531437146923, + ha: 934.1531437146923, + o: 'm 128 0 b 147 17 137 0 144 9 b 167 102 160 45 167 73 b 158 154 167 120 164 137 b 117 307 141 204 130 256 b 63 698 84 435 71 567 b 62 788 62 729 62 757 b 69 916 62 829 63 873 b 109 1172 81 1001 94 1087 b 132 1320 118 1221 137 1269 b 124 1345 131 1329 134 1342 b 96 1332 114 1346 102 1341 b 71 1269 82 1313 75 1292 b 39 1104 59 1214 48 1159 b 0 742 19 988 0 871 b 10 559 3 688 6 624 b 58 226 16 446 33 336 b 112 20 73 157 94 89 b 128 0 115 13 118 0 z', + }, + csymParensRightVeryTall: { + x_min: -20, + x_max: 111.4332498248095, + y_min: -0.07657185734616112, + y_max: 1009, + ha: 1009.0765718573462, + o: 'm -3 0 b 20 22 9 -1 14 12 b 36 56 26 33 32 45 b 99 274 58 128 84 199 b 160 788 135 439 163 605 b 122 1181 164 912 145 1047 b 50 1431 108 1267 86 1351 b 36 1453 48 1439 46 1453 l 35 1453 l 30 1453 b 7 1423 17 1449 7 1440 b 27 1287 9 1377 10 1331 b 96 963 71 1184 85 1074 b 105 818 102 914 105 867 b 91 624 105 753 99 688 b -4 213 72 484 48 344 b -29 101 -19 174 -29 138 b -16 27 -29 76 -24 52 b -3 0 -13 17 -14 3 z', + }, + csymDiagonalArrangementSlash: { + x_min: -0.19862981551275186, + x_max: 990, + y_min: -26.946823529189132, + y_max: 1027.5514326488437, + ha: 1054.4982561780328, + o: 'm 14 -37 b 58 -9 35 -45 46 -22 b 392 333 170 105 279 217 l 765 711 b 1372 1329 968 916 1168 1125 b 1424 1439 1403 1359 1417 1397 b 1426 1457 1424 1444 1426 1450 b 1416 1477 1426 1466 1423 1475 b 1374 1462 1400 1485 1385 1473 b 1181 1269 1309 1397 1246 1331 b 736 831 1031 1122 884 979 b 356 452 609 704 485 576 b 32 132 246 347 143 236 b 0 50 7 109 1 84 b 6 9 -1 37 3 23 b 14 -37 10 -9 0 -32 z', + }, + accidentalNarrowReversedFlat: { + x_min: 0, + x_max: 208, + y_min: -231, + y_max: 449, + ha: 680, + o: 'm 272 -333 b 284 -320 278 -333 281 -328 b 300 -174 297 -272 300 -222 b 275 190 298 -52 279 68 b 268 445 272 275 268 360 l 268 490 b 264 612 269 530 265 572 b 236 647 264 632 252 645 l 235 647 b 217 618 220 647 220 628 b 207 526 210 588 207 556 b 210 432 207 494 210 464 b 216 268 213 377 215 323 l 216 230 l 215 232 b 154 256 194 240 174 251 b 111 264 138 261 124 264 b 3 153 50 264 10 223 b 0 94 0 132 0 114 b 194 -276 0 -63 68 -186 b 255 -323 215 -291 236 -307 b 272 -333 262 -330 268 -333 z m 233 -138 b 71 30 168 -92 105 -45 b 63 59 65 42 63 50 b 96 95 62 75 73 86 b 130 102 108 99 120 102 b 215 76 160 102 187 88 l 220 73 b 225 -22 220 42 222 10 b 233 -138 229 -62 230 -101 z', + }, + accidentalNarrowReversedFlatAndFlat: { + x_min: 0, + x_max: 335, + y_min: -231, + y_max: 449, + ha: 680, + o: 'm 151 490 b 148 612 151 530 150 572 b 132 647 148 632 141 645 b 122 618 124 647 124 628 b 117 526 118 588 117 556 b 118 432 117 494 118 464 b 121 268 120 377 121 323 l 121 232 b 86 256 109 240 98 251 b 62 264 78 261 69 264 b 1 153 29 264 6 223 b 0 94 0 132 0 114 b 109 -276 0 -63 37 -186 b 144 -323 121 -291 132 -307 b 153 -333 147 -330 151 -333 b 160 -320 157 -333 158 -328 b 168 -174 167 -272 168 -222 b 154 190 168 -52 157 68 b 151 445 153 275 151 360 z m 480 153 b 372 264 472 223 432 264 b 328 256 359 264 344 261 b 268 232 308 251 288 240 l 266 230 l 266 268 b 272 432 266 323 269 377 b 275 526 272 464 275 494 b 265 618 275 556 272 588 b 248 647 262 628 262 647 l 246 647 b 219 612 230 645 219 632 b 215 490 217 572 213 530 l 215 445 b 207 190 215 360 210 275 b 183 -174 203 68 183 -52 b 199 -320 183 -222 186 -272 b 210 -333 202 -328 204 -333 b 228 -323 215 -333 220 -330 b 288 -276 246 -307 268 -291 b 482 94 415 -186 482 -63 b 480 153 482 114 482 132 z m 40 30 b 36 59 36 42 36 50 b 55 95 35 75 42 86 b 73 102 60 99 68 102 b 121 76 89 102 105 88 l 124 73 b 127 -22 124 42 125 10 l 131 -138 b 40 30 95 -92 60 -43 z m 419 59 b 412 30 419 50 418 42 b 249 -138 374 -43 314 -92 b 258 -22 252 -101 253 -62 b 262 73 261 10 262 42 l 268 76 b 353 102 295 88 323 102 b 386 95 363 102 374 99 b 419 59 409 86 420 75 z', + }, + accidentalWilsonPlus: { + x_min: 0, + x_max: 298, + y_min: -218, + y_max: 218, + ha: 436, + o: 'm 232 -314 b 236 -301 236 -310 236 -305 l 236 -295 b 243 -52 239 -213 242 -132 l 369 62 b 429 200 413 101 425 147 b 416 243 429 216 428 236 b 383 225 406 251 393 232 l 377 220 b 246 98 336 177 291 138 b 249 242 248 145 246 193 b 225 304 251 265 242 287 b 209 314 220 308 215 314 b 204 312 207 314 206 312 b 196 292 196 310 196 300 b 193 184 194 256 194 220 b 187 48 192 140 190 94 b 46 -72 141 7 94 -32 b 0 -163 13 -98 0 -127 b 1 -187 0 -170 0 -179 b 10 -235 4 -203 6 -219 b 20 -255 12 -242 14 -251 b 36 -245 26 -259 30 -249 b 181 -109 85 -200 132 -154 b 176 -258 180 -158 176 -209 b 232 -314 176 -298 186 -307 z', + }, + accidentalWilsonMinus: { + x_min: 0, + x_max: 284.2093390143919, + y_min: -163, + y_max: 163, + ha: 326, + o: 'm 386 -232 b 409 -163 415 -222 408 -180 b 382 -69 410 -120 408 -89 b 32 228 264 30 141 118 b 17 235 26 233 22 235 b 3 219 9 235 3 228 b 0 157 3 199 0 179 b 29 69 0 125 6 95 b 323 -194 115 -29 222 -111 b 374 -235 338 -206 353 -235 b 386 -232 377 -235 382 -233 z', + }, + }, + fontFamily: 'Petaluma', + resolution: 1000, + generatedOn: '2021-12-06T21:04:23.441Z', +}; + + +/***/ }), + +/***/ "./src/fonts/petaluma_metrics.ts": +/*!***************************************!*\ + !*** ./src/fonts/petaluma_metrics.ts ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "PetalumaMetrics": () => (/* binding */ PetalumaMetrics) +/* harmony export */ }); +/** + * The Petaluma font was created by Steinberg Media. + * https://github.com/steinbergmedia/petaluma + */ +const PetalumaMetrics = { + name: 'Petaluma', + smufl: true, + stave: { + padding: 15, + endPaddingMax: 15, + endPaddingMin: 7, + unalignedNotePadding: 12, + }, + accidental: { + noteheadAccidentalPadding: 1, + leftPadding: 2, + accidentalSpacing: 3, + }, + clef: { + default: { + point: 32, + width: 26, + }, + small: { + point: 26, + width: 20, + }, + annotations: { + '8va': { + smuflCode: 'timeSig8', + default: { + point: 18, + treble: { + line: -1.4, + shiftX: 12, + }, + }, + small: { + point: 16, + treble: { + line: -0.2, + shiftX: 8, + }, + }, + }, + '8vb': { + smuflCode: 'timeSig8', + default: { + point: 18, + treble: { + line: 6, + shiftX: 10, + }, + bass: { + line: 3.5, + shiftX: 1, + }, + }, + small: { + point: 16, + treble: { + line: 5.3, + shiftX: 6, + }, + bass: { + line: 3.1, + shiftX: 0.5, + }, + }, + }, + }, + // These may no longer be necessary + lineCount: { + '8': { point: 55, shiftY: 14 }, + '7': { point: 47, shiftY: 8 }, + '6': { point: 32, shiftY: 1 }, + '5': { point: 30, shiftY: -6 }, + '4': { point: 23, shiftY: -12 }, + }, + }, + parenthesis: { + default: { + point: 39, + width: 7, + }, + gracenote: { + point: (39 * 3) / 5, + width: 3, + }, + }, + pedalMarking: { + up: { + point: 40, + }, + down: { + point: 34, + }, + }, + // These are for numeric digits, such as in time signatures + digits: { + // used by timesig + shiftLine: -1, + point: 22, + // used by tuplets + tupletPoint: 16, + shiftY: -2, + }, + articulation: { + articStaccatissimoAbove: { + padding: 2, + }, + articStaccatissimoBelow: { + padding: 2, + }, + }, + tremolo: { + default: { + point: 25, + spacing: 5, + offsetYStemUp: -5, + offsetYStemDown: 5, + offsetXStemUp: 13, + offsetXStemDown: 1, + }, + grace: { + point: 18, + spacing: 4, + offsetYStemUp: -5, + offsetYStemDown: 5, + offsetXStemUp: 8, + offsetXStemDown: 1, + }, + }, + staveRepetition: { + default: { + offsetY: 25, + offsetSymbol: 12, + spacing: 5, + }, + }, + noteHead: { + displaced: { + shiftX: -2, + }, + }, + stem: { + heightAdjustmentForFlag: -3, + // These are stem (Y) offsets to the note heads. To shift the + // noteheads (x-position) themselves, see glyphs.notehead.custom. + noteHead: { + noteheadTriangleUpHalf: { + offsetYBaseStemUp: 5, + offsetYBaseStemDown: 4, + }, + noteheadTriangleUpBlack: { + offsetYBaseStemUp: 5, + offsetYBaseStemDown: 4, + }, + noteheadTriangleUpWhole: { + offsetYBaseStemUp: 5, + offsetYBaseStemDown: 4, + }, + noteheadXHalf: { + offsetYBaseStemUp: -4, + offsetYBaseStemDown: 4, + }, + noteheadXBlack: { + offsetYBaseStemUp: -4, + offsetYBaseStemDown: 4, + }, + noteheadXWhole: { + offsetYBaseStemUp: -4, + offsetYBaseStemDown: 4, + }, + noteheadHalf: { + offsetYBaseStemDown: 1.8, + offsetYBaseStemUp: -1.8, + }, + noteheadBlack: { + offsetYBaseStemDown: 2, + offsetYBaseStemUp: -2, + }, + noteheadSquareWhite: { + offsetYBaseStemDown: -5, + offsetYBaseStemUp: 5, + }, + }, + }, + // Values under here are used by the Glyph class to reposition and rescale + // glyphs based on their category. This should be the first stop for + // custom font glyph repositioning. + // + // The glyph loader first looks up a specific set of settings based on the + // glyph code, and if not found, uses the defaults from the category. See + // glyphs.textNote for an example of this. + // + // Details in Glyph.lookupFontMetrics. + glyphs: { + coda: { + point: 20, + shiftX: -7, + shiftY: 8, + }, + segno: { + shiftX: -7, + }, + flag: { + shiftX: -0.77, + flag16thUp: { + shiftX: -0.75, + }, + flag32ndUp: { + shiftX: -0.85, + }, + flag64thUp: { + shiftX: -1.55, + }, + flag128thUp: { + shiftX: -1.3, + }, + flag16thDown: { + shiftX: -0.75, + }, + flag32ndDown: { + shiftX: -0.76, + }, + flag64thDown: { + shiftX: -1.5, + }, + flag128thDown: { + shiftX: -1.2, + }, + tabStem: { + shiftX: -1.75, + }, + staveTempo: { + shiftX: -1, + }, + }, + clef: { + gClef: { + default: { scale: 1.1, shiftY: 1 }, + small: { shiftY: 1.5 }, + }, + fClef: { + default: { shiftY: -0.5 }, + }, + }, + ornament: { + ornamentTurn: { + scale: 1.2, + }, + ornamentTurnSlash: { + scale: 1.2, + }, + }, + stringNumber: { + verticalPadding: 8, + stemPadding: 2, + leftPadding: 5, + rightPadding: 6, + }, + stroke: { + arrowheadBlackDown: { + straight: { + shiftX: -4.5, + }, + wiggly: { + shiftX: -1, + shiftY: 1, + }, + }, + arrowheadBlackUp: { + straight: { + shiftX: -0.85, + }, + wiggly: { + shiftX: -1, + shiftY: 1, + }, + }, + }, + textNote: { + point: 34, + breathMarkTick: { + point: 36, + shiftY: 9, + }, + breathMarkComma: { + point: 36, + }, + segno: { + point: 30, + shiftX: -7, + shiftY: 8, + }, + coda: { + point: 20, + shiftX: -7, + shiftY: 8, + }, + ornamentTrill: { + shiftX: -10, + shiftY: 8, + }, + ornamentMordent: { + shiftX: -8, + }, + ornamentShortTrill: { + shiftX: -8, + }, + }, + noteHead: { + minPadding: 2, + standard: { + noteheadBlackStemUp: { + shiftX: 0.5, + }, + noteheadHalfStemUp: { + shiftX: 0.725, + }, + noteheadWholeStemUp: { + shiftX: 1, + }, + }, + custom: { + noteheadCircleXStemUp: { + shiftX: -1, + }, + noteheadCircleXStemDown: { + shiftX: 0.25, + }, + noteheadDiamondHalfStemUp: { + shiftX: 1.5, + }, + noteheadDiamondBlackStemUp: { + shiftX: 1.5, + }, + noteheadDiamondWholeStemUp: { + shiftX: 1, + }, + noteheadXBlackStemUp: { + shiftX: 1, + }, + noteheadXHalfStemUp: { + shiftX: -3, + }, + noteheadXHalfStemDown: { + shiftX: 1, + }, + noteheadXWholeStemUp: { + shiftX: -7, + }, + noteheadXWholeStemDown: { + shiftX: 1, + }, + noteheadSquareWhiteStemDown: { + shiftX: 0.25, + }, + noteheadSquareWhiteStemUp: { + shiftX: -0.75, + }, + noteheadSquareBlackStemUp: { + shiftX: -0.75, + }, + noteheadTriangleUpWholeStemUp: { + shiftX: -0.75, + }, + }, + }, + chordSymbol: { + global: { + superscriptOffset: -400, + subscriptOffset: 300, + kerningOffset: -150, + lowerKerningText: ['D', 'F', 'P', 'T', 'V', 'Y'], + upperKerningText: ['L'], + spacing: 20, + superSubRatio: 0.73, + }, + csymDiminished: { + scale: 0.8, + leftSideBearing: -95, + advanceWidth: 506, + yOffset: 0, + }, + csymHalfDiminished: { + scale: 0.8, + leftSideBearing: -32, + advanceWidth: 506, + yOffset: 0, + }, + csymAugmented: { + scale: 1, + leftSideBearing: -25, + advanceWidth: 530, + yOffset: 0, + }, + csymParensLeftTall: { + scale: 0.8, + leftSideBearing: 0, + advanceWidth: 155, + yOffset: 150, + }, + csymParensRightTall: { + scale: 0.8, + leftSideBearing: 40, + advanceWidth: 189, + yOffset: 150, + }, + csymBracketLeftTall: { + scale: 0.8, + leftSideBearing: 0, + advanceWidth: 328, + yOffset: 0, + }, + csymBracketRightTall: { + scale: 0.8, + leftSideBearing: 1, + advanceWidth: 600, + yOffset: 0, + }, + csymParensLeftVeryTall: { + scale: 0.95, + leftSideBearing: 0, + advanceWidth: 210, + yOffset: 250, + }, + csymParensRightVeryTall: { + scale: 0.9, + leftSideBearing: -100, + advanceWidth: 111, + yOffset: 250, + }, + csymDiagonalArrangementSlash: { + scale: 0.6, + leftSideBearing: -1, + advanceWidth: 990, + yOffset: 0, + }, + csymMinor: { + scale: 0.7, + leftSideBearing: 0, + advanceWidth: 482, + yOffset: 0, + }, + csymMajorSeventh: { + scale: 0.8, + leftSideBearing: 100, + yOffset: 0, + advanceWidth: 600, + }, + accidentalSharp: { + scale: 0.7, + leftSideBearing: 0, + advanceWidth: 425, + yOffset: -422, + }, + accidentalFlat: { + scale: 0.8, + leftSideBearing: -10, + advanceWidth: 228, + yOffset: -284, + }, + }, + jazzOrnaments: { + brassScoop: { + scale: 1.0, + xOffset: -12, + yOffset: 0, + stemUpYOffset: 0, + reportedWidth: 10, + }, + brassDoitMedium: { + scale: 1.0, + xOffset: 16, + yOffset: 0, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassFallLipShort: { + scale: 1.0, + xOffset: 16, + yOffset: 0, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassLiftMedium: { + scale: 1.0, + xOffset: 16, + yOffset: 5, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassFallRoughMedium: { + scale: 1.0, + xOffset: 16, + yOffset: 26, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassBend: { + scale: 1.0, + xOffset: 3, + yOffset: -8, + stemUpYOffset: 28, + reportedWidth: 5, + }, + brassMuteClosed: { + scale: 1.0, + xOffset: 3, + yOffset: -8, + stemUpYOffset: 26, + reportedWidth: 5, + }, + brassMuteOpen: { + scale: 1.0, + xOffset: 4, + yOffset: -8, + stemUpYOffset: 27, + reportedWidth: 5, + }, + brassFlip: { + scale: 1.0, + xOffset: 10, + yOffset: -4, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassJazzTurn: { + scale: 1.0, + xOffset: 6, + yOffset: -4, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassSmear: { + scale: 1.0, + xOffset: 10, + yOffset: -4, + stemUpYOffset: 0, + reportedWidth: 5, + }, + }, + tuplet: { + noteHeadOffset: 20, + stemOffset: 10, + bottomLine: 4, + topModifierOffset: 20, + }, + }, +}; + + +/***/ }), + +/***/ "./src/fonts/petalumascript_glyphs.ts": +/*!********************************************!*\ + !*** ./src/fonts/petalumascript_glyphs.ts ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "PetalumaScriptFont": () => (/* binding */ PetalumaScriptFont) +/* harmony export */ }); +const PetalumaScriptFont = { + spacing: 50, + glyphs: { + ' ': { + x_min: 0, + x_max: 250, + y_min: 0, + y_max: 500, + ha: 500, + leftSideBearing: 0, + advanceWidth: 250, + }, + '0': { + x_min: 33, + x_max: 534, + y_min: -13, + y_max: 751, + ha: 764, + leftSideBearing: 33, + advanceWidth: 570, + }, + '1': { + x_min: 48, + x_max: 235, + y_min: -17, + y_max: 734, + ha: 751, + leftSideBearing: 48, + advanceWidth: 286, + }, + '2': { + x_min: 56, + x_max: 571, + y_min: -19, + y_max: 741, + ha: 760, + leftSideBearing: 56, + advanceWidth: 626, + }, + '3': { + x_min: 50, + x_max: 528, + y_min: -7, + y_max: 731, + ha: 738, + leftSideBearing: 50, + advanceWidth: 589, + }, + '4': { + x_min: 38, + x_max: 564, + y_min: -13, + y_max: 743, + ha: 756, + leftSideBearing: 38, + advanceWidth: 614, + }, + '5': { + x_min: 42, + x_max: 601, + y_min: -34, + y_max: 743, + ha: 777, + leftSideBearing: 42, + advanceWidth: 648, + }, + '6': { + x_min: 47, + x_max: 606, + y_min: -16, + y_max: 743, + ha: 759, + leftSideBearing: 47, + advanceWidth: 667, + }, + '7': { + x_min: 47, + x_max: 567, + y_min: 5, + y_max: 739, + ha: 734, + leftSideBearing: 0, + advanceWidth: 615, + }, + '8': { + x_min: 40, + x_max: 541, + y_min: -15, + y_max: 752, + ha: 767, + leftSideBearing: 40, + advanceWidth: 585, + }, + '9': { + x_min: 40, + x_max: 537, + y_min: -52, + y_max: 736, + ha: 788, + leftSideBearing: 40, + advanceWidth: 592, + }, + '!': { + x_min: 49, + x_max: 180, + y_min: -7, + y_max: 761, + ha: 768, + leftSideBearing: 49, + advanceWidth: 230, + }, + '"': { + x_min: 39, + x_max: 304, + y_min: 596, + y_max: 804, + ha: 208, + leftSideBearing: 39, + advanceWidth: 353, + }, + '#': { + x_min: 33, + x_max: 599, + y_min: -8, + y_max: 765, + ha: 773, + leftSideBearing: 33, + advanceWidth: 648, + }, + $: { + x_min: 53, + x_max: 495, + y_min: -111, + y_max: 823, + ha: 934, + leftSideBearing: 53, + advanceWidth: 560, + }, + '%': { + x_min: 35, + x_max: 656, + y_min: -128, + y_max: 808, + ha: 936, + leftSideBearing: 35, + advanceWidth: 711, + }, + '&': { + x_min: 53, + x_max: 441, + y_min: -3, + y_max: 753, + ha: 756, + leftSideBearing: 53, + advanceWidth: 500, + }, + "'": { + x_min: 43, + x_max: 161, + y_min: 590, + y_max: 811, + ha: 221, + leftSideBearing: 43, + advanceWidth: 217, + }, + '(': { + x_min: 41, + x_max: 311, + y_min: -36, + y_max: 845, + ha: 881, + leftSideBearing: 41, + advanceWidth: 308, + }, + ')': { + x_min: -8, + x_max: 257, + y_min: -21, + y_max: 852, + ha: 873, + leftSideBearing: -8, + advanceWidth: 280, + }, + '*': { + x_min: 59, + x_max: 539, + y_min: 175, + y_max: 589, + ha: 414, + leftSideBearing: 59, + advanceWidth: 601, + }, + '+': { + x_min: 33, + x_max: 361, + y_min: 180, + y_max: 587, + ha: 407, + leftSideBearing: 33, + advanceWidth: 400, + }, + ',': { + x_min: 15, + x_max: 176, + y_min: -129, + y_max: 92, + ha: 221, + leftSideBearing: 15, + advanceWidth: 205, + }, + '-': { + x_min: 40, + x_max: 380, + y_min: 317, + y_max: 452, + ha: 135, + leftSideBearing: 40, + advanceWidth: 422, + }, + '.': { + x_min: 48, + x_max: 185, + y_min: -56, + y_max: 84, + ha: 140, + leftSideBearing: 48, + advanceWidth: 227, + }, + '/': { + x_min: -58, + x_max: 654, + y_min: -122, + y_max: 844, + ha: 966, + leftSideBearing: -58, + advanceWidth: 626, + }, + ':': { + x_min: 65, + x_max: 225, + y_min: 97, + y_max: 536, + ha: 439, + leftSideBearing: 65, + advanceWidth: 302, + }, + ';': { + x_min: 13, + x_max: 295, + y_min: -139, + y_max: 536, + ha: 675, + leftSideBearing: 13, + advanceWidth: 334, + }, + '<': { + x_min: 28, + x_max: 438, + y_min: -1, + y_max: 607, + ha: 608, + leftSideBearing: 28, + advanceWidth: 475, + }, + '=': { + x_min: 40, + x_max: 383, + y_min: 199.9598640852289, + y_max: 541, + ha: 341.0401359147711, + leftSideBearing: 40, + advanceWidth: 422, + }, + '>': { + x_min: 35, + x_max: 421, + y_min: 28, + y_max: 632, + ha: 604, + leftSideBearing: 35, + advanceWidth: 466, + }, + '?': { + x_min: 45, + x_max: 548, + y_min: -17, + y_max: 767, + ha: 784, + leftSideBearing: 45, + advanceWidth: 592, + }, + '@': { + x_min: 51, + x_max: 730, + y_min: -78, + y_max: 753, + ha: 831, + leftSideBearing: 51, + advanceWidth: 781, + }, + A: { + x_min: 37, + x_max: 554, + y_min: -4, + y_max: 746, + ha: 750, + leftSideBearing: 37, + advanceWidth: 617, + }, + B: { + x_min: 37, + x_max: 532, + y_min: 3, + y_max: 783, + ha: 780, + leftSideBearing: 37, + advanceWidth: 579, + }, + C: { + x_min: 37, + x_max: 583, + y_min: -3, + y_max: 775, + ha: 778, + leftSideBearing: 37, + advanceWidth: 623, + }, + D: { + x_min: 50, + x_max: 530, + y_min: -15, + y_max: 749, + ha: 764, + leftSideBearing: 50, + advanceWidth: 579, + }, + E: { + x_min: 45, + x_max: 531, + y_min: -1, + y_max: 743, + ha: 744, + leftSideBearing: 45, + advanceWidth: 585, + }, + F: { + x_min: 45, + x_max: 459, + y_min: 23, + y_max: 727, + ha: 704, + leftSideBearing: 45, + advanceWidth: 510, + }, + G: { + x_min: 31, + x_max: 577, + y_min: -8, + y_max: 733, + ha: 741, + leftSideBearing: 31, + advanceWidth: 611, + }, + H: { + x_min: 37, + x_max: 493, + y_min: -22, + y_max: 758, + ha: 780, + leftSideBearing: 37, + advanceWidth: 535, + }, + I: { + x_min: 47, + x_max: 501, + y_min: -3, + y_max: 731, + ha: 734, + leftSideBearing: 47, + advanceWidth: 541, + }, + J: { + x_min: 33, + x_max: 531, + y_min: -23, + y_max: 725, + ha: 748, + leftSideBearing: 33, + advanceWidth: 573, + }, + K: { + x_min: 43, + x_max: 505, + y_min: -10, + y_max: 740, + ha: 750, + leftSideBearing: 43, + advanceWidth: 560, + }, + L: { + x_min: 49, + x_max: 457, + y_min: -2, + y_max: 746, + ha: 748, + leftSideBearing: 49, + advanceWidth: 510, + }, + M: { + x_min: 35, + x_max: 699, + y_min: 1, + y_max: 744, + ha: 743, + leftSideBearing: 35, + advanceWidth: 743, + }, + N: { + x_min: 34, + x_max: 533, + y_min: -17, + y_max: 761, + ha: 778, + leftSideBearing: 34, + advanceWidth: 579, + }, + O: { + x_min: 41, + x_max: 608, + y_min: -5, + y_max: 735, + ha: 740, + leftSideBearing: 41, + advanceWidth: 667, + }, + P: { + x_min: 53, + x_max: 451, + y_min: -18, + y_max: 735, + ha: 753, + leftSideBearing: 53, + advanceWidth: 497, + }, + Q: { + x_min: 40, + x_max: 599, + y_min: -67, + y_max: 744, + ha: 811, + leftSideBearing: 40, + advanceWidth: 648, + }, + R: { + x_min: 39, + x_max: 487, + y_min: 16, + y_max: 735, + ha: 719, + leftSideBearing: 39, + advanceWidth: 535, + }, + S: { + x_min: 35, + x_max: 552, + y_min: -47, + y_max: 708, + ha: 755, + leftSideBearing: 35, + advanceWidth: 604, + }, + T: { + x_min: 26, + x_max: 656, + y_min: -13, + y_max: 718, + ha: 731, + leftSideBearing: 26, + advanceWidth: 705, + }, + U: { + x_min: 41, + x_max: 518, + y_min: -20, + y_max: 748, + ha: 768, + leftSideBearing: 41, + advanceWidth: 567, + }, + V: { + x_min: 47, + x_max: 509, + y_min: -26, + y_max: 744, + ha: 770, + leftSideBearing: 47, + advanceWidth: 567, + }, + W: { + x_min: 44, + x_max: 789, + y_min: -35, + y_max: 720, + ha: 755, + leftSideBearing: 44, + advanceWidth: 833, + }, + X: { + x_min: 63, + x_max: 635, + y_min: -10, + y_max: 745, + ha: 755, + leftSideBearing: 63, + advanceWidth: 680, + }, + Y: { + x_min: 43, + x_max: 503, + y_min: -21, + y_max: 734, + ha: 755, + leftSideBearing: 43, + advanceWidth: 541, + }, + Z: { + x_min: 42, + x_max: 584, + y_min: -10, + y_max: 739, + ha: 749, + leftSideBearing: 42, + advanceWidth: 629, + }, + '[': { + x_min: 46, + x_max: 346, + y_min: -150, + y_max: 884, + ha: 1034, + leftSideBearing: 46, + advanceWidth: 291, + }, + '\\': { + x_min: 20, + x_max: 616, + y_min: -100, + y_max: 797, + ha: 897, + leftSideBearing: 20, + advanceWidth: 645, + }, + ']': { + x_min: -76, + x_max: 226, + y_min: -150, + y_max: 881, + ha: 1031, + leftSideBearing: -76, + advanceWidth: 297, + }, + '^': { + x_min: 43, + x_max: 437, + y_min: 517, + y_max: 812, + ha: 295, + leftSideBearing: 43, + advanceWidth: 478, + }, + _: { + x_min: 29, + x_max: 563, + y_min: -110, + y_max: -1, + ha: 109, + leftSideBearing: 29, + advanceWidth: 598, + }, + '`': { + x_min: 54, + x_max: 321, + y_min: 540, + y_max: 747, + ha: 207, + leftSideBearing: 54, + advanceWidth: 368, + }, + a: { + x_min: 20, + x_max: 447, + y_min: -17, + y_max: 495, + ha: 512, + leftSideBearing: 20, + advanceWidth: 494, + }, + b: { + x_min: 37, + x_max: 466, + y_min: -27, + y_max: 770, + ha: 797, + leftSideBearing: 37, + advanceWidth: 510, + }, + c: { + x_min: 35, + x_max: 456, + y_min: -9, + y_max: 507, + ha: 516, + leftSideBearing: 35, + advanceWidth: 460, + }, + d: { + x_min: 45, + x_max: 520, + y_min: -15, + y_max: 764, + ha: 779, + leftSideBearing: 45, + advanceWidth: 560, + }, + e: { + x_min: 33, + x_max: 370, + y_min: -5, + y_max: 501, + ha: 506, + leftSideBearing: 33, + advanceWidth: 397, + }, + f: { + x_min: 35, + x_max: 411, + y_min: -13, + y_max: 695, + ha: 708, + leftSideBearing: 35, + advanceWidth: 453, + }, + g: { + x_min: 33, + x_max: 551, + y_min: -257, + y_max: 505, + ha: 762, + leftSideBearing: 33, + advanceWidth: 611, + }, + h: { + x_min: 32, + x_max: 458, + y_min: -29, + y_max: 743, + ha: 772, + leftSideBearing: 32, + advanceWidth: 491, + }, + i: { + x_min: 45, + x_max: 167, + y_min: -13, + y_max: 631, + ha: 644, + leftSideBearing: 45, + advanceWidth: 220, + }, + j: { + x_min: -127, + x_max: 261, + y_min: -231, + y_max: 601, + ha: 832, + leftSideBearing: -127, + advanceWidth: 308, + }, + k: { + x_min: 39, + x_max: 443, + y_min: -3, + y_max: 700, + ha: 703, + leftSideBearing: 39, + advanceWidth: 497, + }, + l: { + x_min: 58, + x_max: 168, + y_min: -8, + y_max: 686, + ha: 694, + leftSideBearing: 58, + advanceWidth: 227, + }, + m: { + x_min: 39, + x_max: 688, + y_min: -14, + y_max: 501, + ha: 515, + leftSideBearing: 39, + advanceWidth: 718, + }, + n: { + x_min: 45, + x_max: 491, + y_min: -32, + y_max: 512, + ha: 544, + leftSideBearing: 45, + advanceWidth: 541, + }, + o: { + x_min: 41, + x_max: 424, + y_min: -12, + y_max: 493, + ha: 505, + leftSideBearing: 41, + advanceWidth: 447, + }, + p: { + x_min: 25, + x_max: 529, + y_min: -260, + y_max: 500, + ha: 760, + leftSideBearing: 25, + advanceWidth: 573, + }, + q: { + x_min: 53, + x_max: 603, + y_min: -235, + y_max: 514, + ha: 749, + leftSideBearing: 53, + advanceWidth: 623, + }, + r: { + x_min: 32, + x_max: 407, + y_min: -7, + y_max: 492, + ha: 499, + leftSideBearing: 32, + advanceWidth: 460, + }, + s: { + x_min: 49, + x_max: 416, + y_min: -12, + y_max: 519, + ha: 531, + leftSideBearing: 49, + advanceWidth: 460, + }, + t: { + x_min: 32, + x_max: 442, + y_min: -5, + y_max: 684, + ha: 689, + leftSideBearing: 32, + advanceWidth: 469, + }, + u: { + x_min: 41, + x_max: 487, + y_min: -5, + y_max: 507, + ha: 512, + leftSideBearing: 41, + advanceWidth: 510, + }, + v: { + x_min: 16, + x_max: 441, + y_min: -20, + y_max: 542, + ha: 562, + leftSideBearing: 16, + advanceWidth: 456, + }, + w: { + x_min: 39, + x_max: 639, + y_min: -22, + y_max: 505, + ha: 527, + leftSideBearing: 39, + advanceWidth: 661, + }, + x: { + x_min: 15, + x_max: 505, + y_min: -39, + y_max: 539, + ha: 578, + leftSideBearing: 15, + advanceWidth: 541, + }, + y: { + x_min: -98, + x_max: 501, + y_min: -242, + y_max: 511, + ha: 753, + leftSideBearing: -98, + advanceWidth: 548, + }, + z: { + x_min: 27, + x_max: 479, + y_min: -3, + y_max: 494, + ha: 497, + leftSideBearing: 27, + advanceWidth: 494, + }, + '{': { + x_min: 0, + x_max: 0, + y_min: 0, + y_max: 0, + ha: 0, + leftSideBearing: 0, + advanceWidth: 308, + }, + '|': { + x_min: 0, + x_max: 0, + y_min: 0, + y_max: 0, + ha: 0, + leftSideBearing: 0, + advanceWidth: 308, + }, + '}': { + x_min: 0, + x_max: 0, + y_min: 0, + y_max: 0, + ha: 0, + leftSideBearing: 0, + advanceWidth: 308, + }, + '~': { + x_min: 0, + x_max: 0, + y_min: 0, + y_max: 0, + ha: 0, + leftSideBearing: 0, + advanceWidth: 308, + }, + }, + fontFamily: 'PetalumaScript', + resolution: 1000, + generatedOn: '2020-06-14T18:33:25.407Z', +}; + + +/***/ }), + +/***/ "./src/fonts/robotoslab_glyphs.ts": +/*!****************************************!*\ + !*** ./src/fonts/robotoslab_glyphs.ts ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "RobotoSlabFont": () => (/* binding */ RobotoSlabFont) +/* harmony export */ }); +const RobotoSlabFont = { + spacing: 50, + glyphs: { + ' ': { + x_min: 0, + x_max: 509, + y_min: 0, + y_max: 2000, + ha: 2000, + leftSideBearing: 0, + advanceWidth: 509, + }, + '0': { + x_min: 121, + x_max: 1048, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 121, + advanceWidth: 1168, + }, + '1': { + x_min: 117, + x_max: 767, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 117, + advanceWidth: 844, + }, + '2': { + x_min: 75.8474576645637, + x_max: 1040, + y_min: 0, + y_max: 1477, + ha: 1477, + leftSideBearing: 75, + advanceWidth: 1131, + }, + '3': { + x_min: 74.85365853658536, + x_max: 994, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 74, + advanceWidth: 1106, + }, + '4': { + x_min: 63, + x_max: 1114, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 63, + advanceWidth: 1187, + }, + '5': { + x_min: 96.8448275474953, + x_max: 982, + y_min: -21, + y_max: 1456, + ha: 1477, + leftSideBearing: 96, + advanceWidth: 1081, + }, + '6': { + x_min: 121, + x_max: 1067, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 121, + advanceWidth: 1144, + }, + '7': { + x_min: 76, + x_max: 1060, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: -30, + advanceWidth: 1128, + }, + '8': { + x_min: 92, + x_max: 1039, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 92, + advanceWidth: 1131, + }, + '9': { + x_min: 84, + x_max: 1026, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 84, + advanceWidth: 1154, + }, + '!': { + x_min: 143, + x_max: 340, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 143, + advanceWidth: 483, + }, + '"': { + x_min: 166, + x_max: 634, + y_min: 1055, + y_max: 1560, + ha: 505, + leftSideBearing: 166, + advanceWidth: 770, + }, + '#': { + x_min: 63, + x_max: 1179, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 63, + advanceWidth: 1246, + }, + $: { + x_min: 81.92156915727656, + x_max: 1012, + y_min: -208, + y_max: 1693, + ha: 1901, + leftSideBearing: 81, + advanceWidth: 1110, + }, + '%': { + x_min: 77, + x_max: 1384, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 77, + advanceWidth: 1460, + }, + '&': { + x_min: 74, + x_max: 1242, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 74, + advanceWidth: 1289, + }, + "'": { + x_min: 166, + x_max: 324, + y_min: 1055, + y_max: 1560, + ha: 505, + leftSideBearing: 166, + advanceWidth: 460, + }, + '(': { + x_min: 114, + x_max: 650, + y_min: -463, + y_max: 1636, + ha: 2099, + leftSideBearing: 114, + advanceWidth: 662, + }, + ')': { + x_min: 11, + x_max: 547, + y_min: -463, + y_max: 1636, + ha: 2099, + leftSideBearing: 11, + advanceWidth: 654, + }, + '*': { + x_min: 66, + x_max: 893, + y_min: 607, + y_max: 1456, + ha: 849, + leftSideBearing: 66, + advanceWidth: 958, + }, + '+': { + x_min: 73, + x_max: 1071, + y_min: 146, + y_max: 1206, + ha: 1060, + leftSideBearing: 73, + advanceWidth: 1145, + }, + ',': { + x_min: 23, + x_max: 315, + y_min: -311, + y_max: 221, + ha: 532, + leftSideBearing: 23, + advanceWidth: 404, + }, + '-': { + x_min: 154, + x_max: 643, + y_min: 538, + y_max: 692, + ha: 154, + leftSideBearing: 154, + advanceWidth: 797, + }, + '.': { + x_min: 145, + x_max: 342, + y_min: 0, + y_max: 202, + ha: 202, + leftSideBearing: 145, + advanceWidth: 493, + }, + '/': { + x_min: 0, + x_max: 774, + y_min: -125, + y_max: 1456, + ha: 1581, + leftSideBearing: 0, + advanceWidth: 824, + }, + ':': { + x_min: 145, + x_max: 342, + y_min: 0, + y_max: 1082, + ha: 1082, + leftSideBearing: 145, + advanceWidth: 419, + }, + ';': { + x_min: 53, + x_max: 345, + y_min: -311, + y_max: 1082, + ha: 1393, + leftSideBearing: 53, + advanceWidth: 424, + }, + '<': { + x_min: 76, + x_max: 892, + y_min: 107, + y_max: 1013, + ha: 906, + leftSideBearing: 76, + advanceWidth: 1017, + }, + '=': { + x_min: 147, + x_max: 981, + y_min: 407, + y_max: 987, + ha: 580, + leftSideBearing: 147, + advanceWidth: 1127, + }, + '>': { + x_min: 125, + x_max: 980, + y_min: 87, + y_max: 993, + ha: 906, + leftSideBearing: 125, + advanceWidth: 1060, + }, + '?': { + x_min: 65.92660602419838, + x_max: 890, + y_min: 0, + y_max: 1477, + ha: 1477, + leftSideBearing: 65, + advanceWidth: 953, + }, + '@': { + x_min: 84.3592218305664, + x_max: 1705.2346925277395, + y_min: -453, + y_max: 1431, + ha: 1884, + leftSideBearing: 84, + advanceWidth: 1821, + }, + A: { + x_min: 70, + x_max: 1463, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 70, + advanceWidth: 1533, + }, + B: { + x_min: 81, + x_max: 1253, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 81, + advanceWidth: 1322, + }, + C: { + x_min: 80, + x_max: 1174, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 80, + advanceWidth: 1290, + }, + D: { + x_min: 81, + x_max: 1291, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 81, + advanceWidth: 1356, + }, + E: { + x_min: 81, + x_max: 1190, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 81, + advanceWidth: 1306, + }, + F: { + x_min: 81, + x_max: 1176, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 81, + advanceWidth: 1256, + }, + G: { + x_min: 80, + x_max: 1226, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 80, + advanceWidth: 1346, + }, + H: { + x_min: 81, + x_max: 1497, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 81, + advanceWidth: 1578, + }, + I: { + x_min: 81, + x_max: 604, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 81, + advanceWidth: 685, + }, + J: { + x_min: 60, + x_max: 1100, + y_min: -21, + y_max: 1456, + ha: 1477, + leftSideBearing: 60, + advanceWidth: 1169, + }, + K: { + x_min: 81, + x_max: 1427, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 81, + advanceWidth: 1501, + }, + L: { + x_min: 81, + x_max: 1130, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 81, + advanceWidth: 1210, + }, + M: { + x_min: 94, + x_max: 1888, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 94, + advanceWidth: 1982, + }, + N: { + x_min: 83, + x_max: 1509, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 83, + advanceWidth: 1592, + }, + O: { + x_min: 70, + x_max: 1281, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 70, + advanceWidth: 1351, + }, + P: { + x_min: 81, + x_max: 1242, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 81, + advanceWidth: 1297, + }, + Q: { + x_min: 70, + x_max: 1348, + y_min: -245, + y_max: 1477, + ha: 1722, + leftSideBearing: 70, + advanceWidth: 1376, + }, + R: { + x_min: 81, + x_max: 1285, + y_min: 0, + y_max: 1455, + ha: 1455, + leftSideBearing: 81, + advanceWidth: 1385, + }, + S: { + x_min: 115, + x_max: 1116, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 115, + advanceWidth: 1206, + }, + T: { + x_min: 96, + x_max: 1306, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 96, + advanceWidth: 1406, + }, + U: { + x_min: 70, + x_max: 1452, + y_min: -21, + y_max: 1456, + ha: 1477, + leftSideBearing: 70, + advanceWidth: 1522, + }, + V: { + x_min: 65, + x_max: 1443, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 65, + advanceWidth: 1508, + }, + W: { + x_min: 72, + x_max: 2057, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 72, + advanceWidth: 2129, + }, + X: { + x_min: 80, + x_max: 1449, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 80, + advanceWidth: 1529, + }, + Y: { + x_min: 65, + x_max: 1396, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 65, + advanceWidth: 1461, + }, + Z: { + x_min: 90, + x_max: 1107, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 90, + advanceWidth: 1197, + }, + '[': { + x_min: 157, + x_max: 541, + y_min: -312, + y_max: 1664, + ha: 1976, + leftSideBearing: 157, + advanceWidth: 573, + }, + '\\': { + x_min: 36, + x_max: 830, + y_min: -125, + y_max: 1456, + ha: 1581, + leftSideBearing: 36, + advanceWidth: 841, + }, + ']': { + x_min: 23, + x_max: 408, + y_min: -312, + y_max: 1664, + ha: 1976, + leftSideBearing: 23, + advanceWidth: 552, + }, + '^': { + x_min: 71, + x_max: 802, + y_min: 729, + y_max: 1456, + ha: 727, + leftSideBearing: 71, + advanceWidth: 864, + }, + _: { + x_min: 119, + x_max: 1041, + y_min: -154, + y_max: 0, + ha: 154, + leftSideBearing: 119, + advanceWidth: 1168, + }, + '`': { + x_min: 40, + x_max: 456, + y_min: 1288, + y_max: 1560, + ha: 272, + leftSideBearing: 40, + advanceWidth: 496, + }, + a: { + x_min: 79, + x_max: 1053, + y_min: -21, + y_max: 1102, + ha: 1123, + leftSideBearing: 79, + advanceWidth: 1132, + }, + b: { + x_min: -16, + x_max: 1071, + y_min: -21, + y_max: 1560, + ha: 1581, + leftSideBearing: -16, + advanceWidth: 1145, + }, + c: { + x_min: 78, + x_max: 988, + y_min: -21, + y_max: 1102, + ha: 1123, + leftSideBearing: 78, + advanceWidth: 1067, + }, + d: { + x_min: 78, + x_max: 1156, + y_min: -21, + y_max: 1560, + ha: 1581, + leftSideBearing: 78, + advanceWidth: 1218, + }, + e: { + x_min: 74, + x_max: 980, + y_min: -21, + y_max: 1102, + ha: 1123, + leftSideBearing: 74, + advanceWidth: 1059, + }, + f: { + x_min: 64, + x_max: 731, + y_min: 0, + y_max: 1581, + ha: 1581, + leftSideBearing: 64, + advanceWidth: 725, + }, + g: { + x_min: 78, + x_max: 1133, + y_min: -437, + y_max: 1102, + ha: 1539, + leftSideBearing: 78, + advanceWidth: 1157, + }, + h: { + x_min: 49, + x_max: 1255, + y_min: 0, + y_max: 1560, + ha: 1560, + leftSideBearing: 49, + advanceWidth: 1315, + }, + i: { + x_min: 67, + x_max: 590, + y_min: 0, + y_max: 1560, + ha: 1560, + leftSideBearing: 67, + advanceWidth: 652, + }, + j: { + x_min: -56, + x_max: 381, + y_min: -437, + y_max: 1560, + ha: 1997, + leftSideBearing: -56, + advanceWidth: 525, + }, + k: { + x_min: 64, + x_max: 1248, + y_min: 0, + y_max: 1560, + ha: 1560, + leftSideBearing: 64, + advanceWidth: 1287, + }, + l: { + x_min: 64, + x_max: 587, + y_min: 0, + y_max: 1560, + ha: 1560, + leftSideBearing: 64, + advanceWidth: 653, + }, + m: { + x_min: 74, + x_max: 1905, + y_min: 0, + y_max: 1102, + ha: 1102, + leftSideBearing: 74, + advanceWidth: 1977, + }, + n: { + x_min: 74, + x_max: 1278, + y_min: 0, + y_max: 1102, + ha: 1102, + leftSideBearing: 74, + advanceWidth: 1343, + }, + o: { + x_min: 78, + x_max: 1046, + y_min: -21, + y_max: 1102, + ha: 1123, + leftSideBearing: 78, + advanceWidth: 1124, + }, + p: { + x_min: 34, + x_max: 1119, + y_min: -416, + y_max: 1102, + ha: 1518, + leftSideBearing: 34, + advanceWidth: 1197, + }, + q: { + x_min: 78, + x_max: 1135, + y_min: -416, + y_max: 1102, + ha: 1518, + leftSideBearing: 78, + advanceWidth: 1139, + }, + r: { + x_min: 72, + x_max: 808, + y_min: 0, + y_max: 1102, + ha: 1102, + leftSideBearing: 72, + advanceWidth: 854, + }, + s: { + x_min: 104, + x_max: 933, + y_min: -21, + y_max: 1102, + ha: 1123, + leftSideBearing: 104, + advanceWidth: 1022, + }, + t: { + x_min: 24, + x_max: 678, + y_min: -17, + y_max: 1343, + ha: 1360, + leftSideBearing: 24, + advanceWidth: 730, + }, + u: { + x_min: 52, + x_max: 1181, + y_min: -21, + y_max: 1082, + ha: 1103, + leftSideBearing: 52, + advanceWidth: 1245, + }, + v: { + x_min: 26, + x_max: 1176, + y_min: 0, + y_max: 1082, + ha: 1082, + leftSideBearing: 26, + advanceWidth: 1206, + }, + w: { + x_min: 52, + x_max: 1777, + y_min: 0, + y_max: 1082, + ha: 1082, + leftSideBearing: 52, + advanceWidth: 1823, + }, + x: { + x_min: 42, + x_max: 1163, + y_min: 0, + y_max: 1082, + ha: 1082, + leftSideBearing: 42, + advanceWidth: 1203, + }, + y: { + x_min: 24, + x_max: 1172, + y_min: -437, + y_max: 1082, + ha: 1519, + leftSideBearing: 24, + advanceWidth: 1192, + }, + z: { + x_min: 88, + x_max: 960, + y_min: 0, + y_max: 1082, + ha: 1082, + leftSideBearing: 88, + advanceWidth: 1032, + }, + '{': { + x_min: 63, + x_max: 671, + y_min: -364, + y_max: 1597, + ha: 1961, + leftSideBearing: 63, + advanceWidth: 701, + }, + '|': { + x_min: 150, + x_max: 307, + y_min: -270, + y_max: 1456, + ha: 1726, + leftSideBearing: 150, + advanceWidth: 451, + }, + '}': { + x_min: 27, + x_max: 635, + y_min: -364, + y_max: 1597, + ha: 1961, + leftSideBearing: 27, + advanceWidth: 701, + }, + '~': { + x_min: 121, + x_max: 1257, + y_min: 401, + y_max: 803, + ha: 402, + leftSideBearing: 121, + advanceWidth: 1386, + }, + }, + fontFamily: 'Roboto Slab', + resolution: 2048, + generatedOn: '2020-06-15T19:12:58.120Z', +}; + + +/***/ }), + +/***/ "./src/fonts/textfonts.ts": +/*!********************************!*\ + !*** ./src/fonts/textfonts.ts ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "loadTextFonts": () => (/* binding */ loadTextFonts) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../font */ "./src/font.ts"); +/* harmony import */ var _textformatter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../textformatter */ "./src/textformatter.ts"); +/* harmony import */ var _petalumascript_glyphs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./petalumascript_glyphs */ "./src/fonts/petalumascript_glyphs.ts"); +/* harmony import */ var _robotoslab_glyphs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./robotoslab_glyphs */ "./src/fonts/robotoslab_glyphs.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + +function loadTextFonts() { + // Roboto Slab + { + const fontData = _robotoslab_glyphs__WEBPACK_IMPORTED_MODULE_3__.RobotoSlabFont; + const { fontFamily, resolution, glyphs } = fontData; + _font__WEBPACK_IMPORTED_MODULE_0__.Font.load(fontFamily, fontData); + // Previously we used 'H', but it isn't actually the tallest or the widest. + // Interestingly, the lowercase 'b' is the tallest glyph. + const maxSizeGlyph = 'b'; + _textformatter__WEBPACK_IMPORTED_MODULE_1__.TextFormatter.registerInfo({ + family: fontFamily, + resolution, + glyphs, + maxSizeGlyph, + monospaced: false, + bold: false, + italic: false, + superscriptOffset: 0.66, + subscriptOffset: 0.66, + serifs: true, + description: 'Text font to pair with the Bravura / Gonville music fonts.', + }); + } + // PetalumaScript + { + const fontData = _petalumascript_glyphs__WEBPACK_IMPORTED_MODULE_2__.PetalumaScriptFont; + const { fontFamily, resolution, glyphs } = fontData; + _font__WEBPACK_IMPORTED_MODULE_0__.Font.load(fontFamily, fontData); + // M is wider, but H is taller. :-) + // Lowercase b is also taller in this font. + const maxSizeGlyph = 'b'; + _textformatter__WEBPACK_IMPORTED_MODULE_1__.TextFormatter.registerInfo({ + family: fontFamily, + resolution, + glyphs, + maxSizeGlyph, + monospaced: false, + bold: false, + italic: false, + superscriptOffset: 0.66, + subscriptOffset: 0.66, + serifs: false, + description: 'Text font to pair with the Petaluma music font.', + }); + } +} + + +/***/ }), + +/***/ "./src/formatter.ts": +/*!**************************!*\ + !*** ./src/formatter.ts ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Formatter": () => (/* binding */ Formatter) +/* harmony export */ }); +/* harmony import */ var _beam__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./beam */ "./src/beam.ts"); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _fraction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./fraction */ "./src/fraction.ts"); +/* harmony import */ var _modifiercontext__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modifiercontext */ "./src/modifiercontext.ts"); +/* harmony import */ var _stave__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./stave */ "./src/stave.ts"); +/* harmony import */ var _staveconnector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./staveconnector */ "./src/staveconnector.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _tickcontext__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./tickcontext */ "./src/tickcontext.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +/* harmony import */ var _voice__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./voice */ "./src/voice.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + + + + + + + +// Helper function +const sumArray = (arr) => arr.reduce((a, b) => a + b, 0); +/** + * Create `Alignment`s for each tick in `voices`. Also calculate the + * total number of ticks in voices. + */ +function createContexts(voices, makeContext, addToContext) { + const resolutionMultiplier = Formatter.getResolutionMultiplier(voices); + // Initialize tick maps. + const tickToContextMap = {}; + const tickList = []; + const contexts = []; + // For each voice, extract notes and create a context for every + // new tick that hasn't been seen before. + voices.forEach((voice, voiceIndex) => { + // Use resolution multiplier as denominator so that no additional expansion + // of fractional tick values is needed. + const ticksUsed = new _fraction__WEBPACK_IMPORTED_MODULE_2__.Fraction(0, resolutionMultiplier); + voice.getTickables().forEach((tickable) => { + const integerTicks = ticksUsed.numerator; + // If we have no tick context for this tick, create one. + if (!tickToContextMap[integerTicks]) { + const newContext = makeContext({ tickID: integerTicks }); + contexts.push(newContext); + tickToContextMap[integerTicks] = newContext; + // Maintain a list of unique integerTicks. + tickList.push(integerTicks); + } + // Add this tickable to the TickContext. + addToContext(tickable, tickToContextMap[integerTicks], voiceIndex); + ticksUsed.add(tickable.getTicks()); + }); + }); + return { + map: tickToContextMap, + array: contexts, + list: tickList.sort((a, b) => a - b), + resolutionMultiplier, + }; +} +// eslint-disable-next-line +function L(...args) { + if (Formatter.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_9__.log)('Vex.Flow.Formatter', args); +} +/** + * Get the rest line number of the next non-rest note(s). + * @param notes array of Notes + * @param currRestLine + * @param currNoteIndex current note index + * @param compare if true, return the midpoint between the current rest line and the next rest line + * @returns a line number, which determines the vertical position of a rest. + */ +function getRestLineForNextNoteGroup(notes, currRestLine, currNoteIndex, compare) { + // If no valid next note group, nextRestLine is same as current. + let nextRestLine = currRestLine; + // Start with the next note and keep going until we find a valid non-rest note group. + for (let noteIndex = currNoteIndex + 1; noteIndex < notes.length; noteIndex++) { + const note = notes[noteIndex]; + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_8__.isNote)(note) && !note.isRest() && !note.shouldIgnoreTicks()) { + nextRestLine = note.getLineForRest(); + break; + } + } + // Locate the mid point between two lines. + if (compare && currRestLine !== nextRestLine) { + const top = Math.max(currRestLine, nextRestLine); + const bot = Math.min(currRestLine, nextRestLine); + nextRestLine = (0,_util__WEBPACK_IMPORTED_MODULE_9__.midLine)(top, bot); + } + return nextRestLine; +} +/** + * Format implements the formatting and layout algorithms that are used + * to position notes in a voice. The algorithm can align multiple voices both + * within a stave, and across multiple staves. + * + * To do this, the formatter breaks up voices into a grid of rational-valued + * `ticks`, to which each note is assigned. Then, minimum widths are assigned + * to each tick based on the widths of the notes and modifiers in that tick. This + * establishes the smallest amount of space required for each tick. + * + * Finally, the formatter distributes the left over space proportionally to + * all the ticks, setting the `x` values of the notes in each tick. + * + * See `tests/formatter_tests.ts` for usage examples. The helper functions included + * here (`FormatAndDraw`, `FormatAndDrawTab`) also serve as useful usage examples. + */ +class Formatter { + constructor(options) { + this.formatterOptions = Object.assign({ globalSoftmax: false, softmaxFactor: 100, maxIterations: 5 }, options); + this.justifyWidth = 0; + this.totalCost = 0; + this.totalShift = 0; + this.durationStats = {}; + // Minimum width required to render all the notes in the voices. + this.minTotalWidth = 0; + // This is set to `true` after `minTotalWidth` is calculated. + this.hasMinTotalWidth = false; + // Arrays of tick and modifier contexts. + this.tickContexts = undefined; + this.modifierContexts = undefined; + // Gaps between contexts, for free movement of notes post + // formatting. + this.contextGaps = { + total: 0, + gaps: [], + }; + this.voices = []; + this.lossHistory = []; + } + /** + * Helper function to layout "notes" one after the other without + * regard for proportions. Useful for tests and debugging. + */ + static SimpleFormat(notes, x = 0, { paddingBetween = 10 } = {}) { + notes.reduce((accumulator, note) => { + note.addToModifierContext(new _modifiercontext__WEBPACK_IMPORTED_MODULE_3__.ModifierContext()); + const tick = new _tickcontext__WEBPACK_IMPORTED_MODULE_7__.TickContext().addTickable(note).preFormat(); + const metrics = tick.getMetrics(); + tick.setX(accumulator + metrics.totalLeftPx); + return accumulator + tick.getWidth() + metrics.totalRightPx + paddingBetween; + }, x); + } + /** Helper function to plot formatter debug info. */ + static plotDebugging(ctx, formatter, xPos, y1, y2, options) { + options = Object.assign({ stavePadding: _tables__WEBPACK_IMPORTED_MODULE_6__.Tables.currentMusicFont().lookupMetric('stave.padding') }, options); + const x = xPos + options.stavePadding; + const contextGaps = formatter.contextGaps; + function stroke(x1, x2, color) { + ctx.beginPath(); + ctx.setStrokeStyle(color); + ctx.setFillStyle(color); + ctx.setLineWidth(1); + ctx.fillRect(x1, y1, Math.max(x2 - x1, 0), y2 - y1); + } + ctx.save(); + ctx.setFont(_font__WEBPACK_IMPORTED_MODULE_1__.Font.SANS_SERIF, 8); + contextGaps.gaps.forEach((gap) => { + stroke(x + gap.x1, x + gap.x2, 'rgba(100,200,100,0.4)'); + ctx.setFillStyle('green'); + ctx.fillText(Math.round(gap.x2 - gap.x1).toString(), x + gap.x1, y2 + 12); + }); + ctx.setFillStyle('red'); + ctx.fillText(`Loss: ${(formatter.totalCost || 0).toFixed(2)} Shift: ${(formatter.totalShift || 0).toFixed(2)} Gap: ${contextGaps.total.toFixed(2)}`, x - 20, y2 + 27); + ctx.restore(); + } + /** + * Helper function to format and draw a single voice. Returns a bounding + * box for the notation. + * @param ctx the rendering context + * @param stave the stave to which to draw (`Stave` or `TabStave`) + * @param notes array of `Note` instances (`Note`, `TextNote`, `TabNote`, etc.) + * @param params one of below: + * * Setting `autobeam` only `(context, stave, notes, true)` or + * `(ctx, stave, notes, {autobeam: true})` + * * Setting `align_rests` a struct is needed `(context, stave, notes, {align_rests: true})` + * * Setting both a struct is needed `(context, stave, notes, { + * autobeam: true, align_rests: true})` + * * `autobeam` automatically generates beams for the notes. + * * `align_rests` aligns rests with nearby notes. + */ + static FormatAndDraw(ctx, stave, notes, params) { + let options = { + auto_beam: false, + align_rests: false, + }; + if (typeof params === 'object') { + options = Object.assign(Object.assign({}, options), params); + } + else if (typeof params === 'boolean') { + options.auto_beam = params; + } + // Start by creating a voice and adding all the notes to it. + const voice = new _voice__WEBPACK_IMPORTED_MODULE_10__.Voice(_tables__WEBPACK_IMPORTED_MODULE_6__.Tables.TIME4_4).setMode(_voice__WEBPACK_IMPORTED_MODULE_10__.Voice.Mode.SOFT).addTickables(notes); + // Then create beams, if requested. + const beams = options.auto_beam ? _beam__WEBPACK_IMPORTED_MODULE_0__.Beam.applyAndGetBeams(voice) : []; + // Instantiate a `Formatter` and format the notes. + new Formatter() + .joinVoices([voice]) // , { align_rests: options.align_rests }) + .formatToStave([voice], stave, { align_rests: options.align_rests, stave }); + // Render the voice and beams to the stave. + voice.setStave(stave).draw(ctx, stave); + beams.forEach((beam) => beam.setContext(ctx).draw()); + // Return the bounding box of the voice. + return voice.getBoundingBox(); + } + /** + * Helper function to format and draw aligned tab and stave notes in two + * separate staves. + * @param ctx the rendering context + * @param tabstave a `TabStave` instance on which to render `TabNote`s. + * @param stave a `Stave` instance on which to render `Note`s. + * @param notes array of `Note` instances for the stave (`Note`, `BarNote`, etc.) + * @param tabnotes array of `Note` instances for the tab stave (`TabNote`, `BarNote`, etc.) + * @param autobeam automatically generate beams. + * @param params a configuration object: + * * `autobeam` automatically generates beams for the notes. + * * `align_rests` aligns rests with nearby notes. + */ + static FormatAndDrawTab(ctx, tabstave, stave, tabnotes, notes, autobeam, params) { + let opts = { + auto_beam: autobeam, + align_rests: false, + }; + if (typeof params === 'object') { + opts = Object.assign(Object.assign({}, opts), params); + } + else if (typeof params === 'boolean') { + opts.auto_beam = params; + } + // Create a `4/4` voice for `notes`. + const notevoice = new _voice__WEBPACK_IMPORTED_MODULE_10__.Voice(_tables__WEBPACK_IMPORTED_MODULE_6__.Tables.TIME4_4).setMode(_voice__WEBPACK_IMPORTED_MODULE_10__.Voice.Mode.SOFT).addTickables(notes); + // Create a `4/4` voice for `tabnotes`. + const tabvoice = new _voice__WEBPACK_IMPORTED_MODULE_10__.Voice(_tables__WEBPACK_IMPORTED_MODULE_6__.Tables.TIME4_4).setMode(_voice__WEBPACK_IMPORTED_MODULE_10__.Voice.Mode.SOFT).addTickables(tabnotes); + // Then create beams, if requested. + const beams = opts.auto_beam ? _beam__WEBPACK_IMPORTED_MODULE_0__.Beam.applyAndGetBeams(notevoice) : []; + // Instantiate a `Formatter` and align tab and stave notes. + new Formatter() + .joinVoices([notevoice]) // , { align_rests: opts.align_rests }) + .joinVoices([tabvoice]) + .formatToStave([notevoice, tabvoice], stave, { align_rests: opts.align_rests }); + // Render voices and beams to staves. + notevoice.draw(ctx, stave); + tabvoice.draw(ctx, tabstave); + beams.forEach((beam) => beam.setContext(ctx).draw()); + // Draw a connector between tab and note staves. + new _staveconnector__WEBPACK_IMPORTED_MODULE_5__.StaveConnector(stave, tabstave).setContext(ctx).draw(); + } + /** + * Automatically set the vertical position of rests based on previous/next note positions. + * @param tickables an array of Tickables. + * @param alignAllNotes If `false`, only align rests that are within a group of beamed notes. + * @param alignTuplets If `false`, ignores tuplets. + */ + static AlignRestsToNotes(tickables, alignAllNotes, alignTuplets) { + tickables.forEach((currTickable, index) => { + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_8__.isStaveNote)(currTickable) && currTickable.isRest()) { + if (currTickable.getTuplet() && !alignTuplets) { + return; + } + // If activated rests not on default can be rendered as specified. + const position = currTickable.getGlyph().position.toUpperCase(); + if (position !== 'R/4' && position !== 'B/4') { + return; + } + if (alignAllNotes || currTickable.getBeam()) { + // Align rests with previous/next notes. + const props = currTickable.getKeyProps()[0]; + if (index === 0) { + props.line = getRestLineForNextNoteGroup(tickables, props.line, index, false); + } + else if (index > 0 && index < tickables.length) { + // If previous tickable is a rest, use its line number. + const prevTickable = tickables[index - 1]; + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_8__.isStaveNote)(prevTickable)) { + if (prevTickable.isRest()) { + props.line = prevTickable.getKeyProps()[0].line; + } + else { + const restLine = prevTickable.getLineForRest(); + // Get the rest line for next valid non-rest note group. + props.line = getRestLineForNextNoteGroup(tickables, restLine, index, true); + } + } + } + currTickable.setKeyLine(0, props.line); + } + } + }); + } + /** + * Find all the rests in each of the `voices` and align them to neighboring notes. + * + * @param voices + * @param alignAllNotes If `false`, only align rests within beamed groups of notes. If `true`, align all rests. + */ + alignRests(voices, alignAllNotes) { + if (!voices || !voices.length) { + throw new _util__WEBPACK_IMPORTED_MODULE_9__.RuntimeError('BadArgument', 'No voices to format rests'); + } + voices.forEach((voice) => Formatter.AlignRestsToNotes(voice.getTickables(), alignAllNotes)); + } + /** + * Estimate the width required to render 'voices'. This is done by: + * 1. Sum the widths of all the tick contexts + * 2. Estimate the padding. + * The latter is done by calculating the padding 3 different ways, and taking the + * greatest value: + * 1. the padding required for unaligned notes in different voices + * 2. the padding based on the stddev of the tickable widths + * 3. the padding based on the stddev of the tickable durations. + * + * The last 2 quantities estimate a 'width entropy', where notes might need more + * room than the proportional formatting gives them. A measure of all same duration + * and width will need no extra padding, and all these quantities will be + * zero in that case. + * + * @param voices the voices that contain the notes + * @returns the estimated width in pixels + */ + preCalculateMinTotalWidth(voices) { + const unalignedPadding = _tables__WEBPACK_IMPORTED_MODULE_6__.Tables.currentMusicFont().lookupMetric('stave.unalignedNotePadding'); + // Calculate additional padding based on 3 methods: + // 1) unaligned beats in voices, 2) variance of width, 3) variance of durations + let unalignedCtxCount = 0; + let wsum = 0; + let dsum = 0; + const widths = []; + const durations = []; + // Cache results. + if (this.hasMinTotalWidth) + return this.minTotalWidth; + // Create tick contexts if not already created. + if (!this.tickContexts) { + if (!voices) { + throw new _util__WEBPACK_IMPORTED_MODULE_9__.RuntimeError('BadArgument', "'voices' required to run preCalculateMinTotalWidth"); + } + this.createTickContexts(voices); + } + // eslint-disable-next-line + const { list: contextList, map: contextMap } = this.tickContexts; + this.minTotalWidth = 0; + // Go through each tick context and calculate total width, + // and also accumulate values used in padding hints + contextList.forEach((tick) => { + const context = contextMap[tick]; + context.preFormat(); + // If this TC doesn't have all the voices on it, it's unaligned. + // so increment the unaligned padding accumulator + if (context.getTickables().length < voices.length) { + unalignedCtxCount += 1; + } + // Calculate the 'width entropy' over all the Tickables. + context.getTickables().forEach((t) => { + wsum += t.getMetrics().width; + dsum += t.getTicks().value(); + widths.push(t.getMetrics().width); + durations.push(t.getTicks().value()); + }); + const width = context.getWidth(); + this.minTotalWidth += width; + }); + this.hasMinTotalWidth = true; + // normalized (0-1) STDDEV of widths/durations gives us padding hints. + const wavg = wsum > 0 ? wsum / widths.length : 1 / widths.length; + const wvar = sumArray(widths.map((ll) => Math.pow(ll - wavg, 2))); + const wpads = Math.pow(wvar / widths.length, 0.5) / wavg; + const davg = dsum / durations.length; + const dvar = sumArray(durations.map((ll) => Math.pow(ll - davg, 2))); + const dpads = Math.pow(dvar / durations.length, 0.5) / davg; + // Find max of 3 methods pad the width with that + const padmax = Math.max(dpads, wpads) * contextList.length * unalignedPadding; + const unalignedPad = unalignedPadding * unalignedCtxCount; + return this.minTotalWidth + Math.max(unalignedPad, padmax); + } + /** + * Get minimum width required to render all voices. Either `format` or + * `preCalculateMinTotalWidth` must be called before this method. + */ + getMinTotalWidth() { + if (!this.hasMinTotalWidth) { + throw new _util__WEBPACK_IMPORTED_MODULE_9__.RuntimeError('NoMinTotalWidth', "Call 'preCalculateMinTotalWidth' or 'preFormat' before calling 'getMinTotalWidth'"); + } + return this.minTotalWidth; + } + /** Calculate the resolution multiplier for `voices`. */ + static getResolutionMultiplier(voices) { + if (!voices || !voices.length) { + throw new _util__WEBPACK_IMPORTED_MODULE_9__.RuntimeError('BadArgument', 'No voices to format'); + } + const totalTicks = voices[0].getTotalTicks(); + const resolutionMultiplier = voices.reduce((accumulator, voice) => { + if (!voice.getTotalTicks().equals(totalTicks)) { + throw new _util__WEBPACK_IMPORTED_MODULE_9__.RuntimeError('TickMismatch', 'Voices should have same total note duration in ticks.'); + } + if (voice.getMode() === _voice__WEBPACK_IMPORTED_MODULE_10__.Voice.Mode.STRICT && !voice.isComplete()) { + throw new _util__WEBPACK_IMPORTED_MODULE_9__.RuntimeError('IncompleteVoice', 'Voice does not have enough notes.'); + } + return Math.max(accumulator, _fraction__WEBPACK_IMPORTED_MODULE_2__.Fraction.LCM(accumulator, voice.getResolutionMultiplier())); + }, 1); + return resolutionMultiplier; + } + /** Create a `ModifierContext` for each tick in `voices`. */ + createModifierContexts(voices) { + const fn = (tickable, context) => tickable.addToModifierContext(context); + const contexts = createContexts(voices, () => new _modifiercontext__WEBPACK_IMPORTED_MODULE_3__.ModifierContext(), fn); + this.modifierContexts = contexts; + return contexts; + } + /** + * Create a `TickContext` for each tick in `voices`. Also calculate the + * total number of ticks in voices. + */ + createTickContexts(voices) { + const fn = (tickable, context, voiceIndex) => context.addTickable(tickable, voiceIndex); + const contexts = createContexts(voices, (tick) => new _tickcontext__WEBPACK_IMPORTED_MODULE_7__.TickContext(tick), fn); + this.tickContexts = contexts; + const contextArray = this.tickContexts.array; + contextArray.forEach((context) => { + context.tContexts = contextArray; + }); + return contexts; + } + /** + * This is the core formatter logic. Format voices and justify them + * to `justifyWidth` pixels. `renderingContext` is required to justify elements + * that can't retreive widths without a canvas. This method sets the `x` positions + * of all the tickables/notes in the formatter. + */ + preFormat(justifyWidth = 0, renderingContext, voicesParam, stave) { + // Initialize context maps. + const contexts = this.tickContexts; + if (!contexts) { + throw new _util__WEBPACK_IMPORTED_MODULE_9__.RuntimeError('NoTickContexts', 'preFormat requires TickContexts'); + } + const { list: contextList, map: contextMap } = contexts; + // Reset loss history for evaluator. + this.lossHistory = []; + // If voices and a stave were provided, set the Stave for each voice + // and preFormat to apply Y values to the notes; + if (voicesParam && stave) { + voicesParam.forEach((voice) => voice.setStave(stave).preFormat()); + } + // Now distribute the ticks to each tick context, and assign them their + // own X positions. + let x = 0; + let shift = 0; + this.minTotalWidth = 0; + let totalTicks = 0; + // Pass 1: Give each note maximum width requested by context. + contextList.forEach((tick) => { + const context = contextMap[tick]; + // Make sure that all tickables in this context have calculated their + // space requirements. + context.preFormat(); + const width = context.getWidth(); + this.minTotalWidth += width; + const maxTicks = context.getMaxTicks().value(); + totalTicks += maxTicks; + const metrics = context.getMetrics(); + x = x + shift + metrics.totalLeftPx; + context.setX(x); + // Calculate shift for the next tick. + shift = width - metrics.totalLeftPx; + }); + // Use softmax based on all notes across all staves. (options.globalSoftmax) + const { globalSoftmax, softmaxFactor, maxIterations } = this.formatterOptions; + const exp = (tick) => Math.pow(softmaxFactor, (contextMap[tick].getMaxTicks().value() / totalTicks)); + const expTicksUsed = sumArray(contextList.map(exp)); + this.minTotalWidth = x + shift; + this.hasMinTotalWidth = true; + // No justification needed. End formatting. + if (justifyWidth <= 0) + return this.evaluate(); + // Start justification. Subtract the right extra pixels of the final context because the formatter + // justifies based on the context's X position, which is the left-most part of the note head. + const firstContext = contextMap[contextList[0]]; + const lastContext = contextMap[contextList[contextList.length - 1]]; + // Calculate the "distance error" between the tick contexts. The expected distance is the spacing proportional to + // the softmax of the ticks. + function calculateIdealDistances(adjustedJustifyWidth) { + const distances = contextList.map((tick, i) => { + const context = contextMap[tick]; + const voices = context.getTickablesByVoice(); + let backTickable; + if (i > 0) { + const prevContext = contextMap[contextList[i - 1]]; + // Go through each tickable and search backwards for another tickable + // in the same voice. If found, use that duration (ticks) to calculate + // the expected distance. + for (let j = i - 1; j >= 0; j--) { + const backTick = contextMap[contextList[j]]; + const backVoices = backTick.getTickablesByVoice(); + // Look for matching voices between tick contexts. + const matchingVoices = []; + Object.keys(voices).forEach((v) => { + if (backVoices[v]) { + matchingVoices.push(v); + } + }); + if (matchingVoices.length > 0) { + // Found matching voices, get largest duration + let maxTicks = 0; + let maxNegativeShiftPx = Infinity; + let expectedDistance = 0; + matchingVoices.forEach((v) => { + const ticks = backVoices[v].getTicks().value(); + if (ticks > maxTicks) { + backTickable = backVoices[v]; + maxTicks = ticks; + } + // Calculate the limits of the shift based on modifiers, etc. + const thisTickable = voices[v]; + const insideLeftEdge = thisTickable.getX() - + (thisTickable.getMetrics().modLeftPx + thisTickable.getMetrics().leftDisplacedHeadPx); + const backMetrics = backVoices[v].getMetrics(); + const insideRightEdge = backVoices[v].getX() + backMetrics.notePx + backMetrics.modRightPx + backMetrics.rightDisplacedHeadPx; + // Don't allow shifting if notes in the same voice can collide + maxNegativeShiftPx = Math.min(maxNegativeShiftPx, insideLeftEdge - insideRightEdge); + }); + // Don't shift further left than the notehead of the last context. Actually, stay at most 5% to the right + // so that two different tick contexts don't align across staves. + maxNegativeShiftPx = Math.min(maxNegativeShiftPx, context.getX() - (prevContext.getX() + adjustedJustifyWidth * 0.05)); + // Calculate the expected distance of the current context from the last matching tickable. The + // distance is scaled down by the softmax for the voice. + if (globalSoftmax) { + const t = totalTicks; + expectedDistance = (Math.pow(softmaxFactor, (maxTicks / t)) / expTicksUsed) * adjustedJustifyWidth; + } + else if (typeof backTickable !== 'undefined') { + expectedDistance = backTickable.getVoice().softmax(maxTicks) * adjustedJustifyWidth; + } + return { + expectedDistance, + maxNegativeShiftPx, + fromTickable: backTickable, + }; + } + } + } + return { expectedDistance: 0, fromTickablePx: 0, maxNegativeShiftPx: 0 }; + }); + return distances; + } + function shiftToIdealDistances(idealDistances) { + // Distribute ticks to the contexts based on the calculated distance error. + const centerX = adjustedJustifyWidth / 2; + let spaceAccum = 0; + contextList.forEach((tick, index) => { + const context = contextMap[tick]; + if (index > 0) { + const contextX = context.getX(); + const ideal = idealDistances[index]; + const errorPx = (0,_util__WEBPACK_IMPORTED_MODULE_9__.defined)(ideal.fromTickable).getX() + ideal.expectedDistance - (contextX + spaceAccum); + let negativeShiftPx = 0; + if (errorPx > 0) { + spaceAccum += errorPx; + } + else if (errorPx < 0) { + negativeShiftPx = Math.min(ideal.maxNegativeShiftPx, Math.abs(errorPx)); + spaceAccum += -negativeShiftPx; + } + context.setX(contextX + spaceAccum); + } + // Move center aligned tickables to middle + context.getCenterAlignedTickables().forEach((tickable) => { + tickable.setCenterXShift(centerX - context.getX()); + }); + }); + return lastContext.getX() - firstContext.getX(); + } + const adjustedJustifyWidth = justifyWidth - + lastContext.getMetrics().notePx - + lastContext.getMetrics().totalRightPx - + firstContext.getMetrics().totalLeftPx; + const musicFont = _tables__WEBPACK_IMPORTED_MODULE_6__.Tables.currentMusicFont(); + const configMinPadding = musicFont.lookupMetric('stave.endPaddingMin'); + const configMaxPadding = musicFont.lookupMetric('stave.endPaddingMax'); + let targetWidth = adjustedJustifyWidth; + const distances = calculateIdealDistances(targetWidth); + let actualWidth = shiftToIdealDistances(distances); + // Calculate right justification by finding max of (configured value, min distance between tickables) + // so measures with lots of white space use it evenly, and crowded measures use at least the configured + // space. + const calcMinDistance = (targetWidth, distances) => { + let mdCalc = targetWidth / 2; + if (distances.length > 1) { + for (let di = 1; di < distances.length; ++di) { + mdCalc = Math.min(distances[di].expectedDistance / 2, mdCalc); + } + } + return mdCalc; + }; + const minDistance = calcMinDistance(targetWidth, distances); + // Just one context. Done formatting. + if (contextList.length === 1) + return 0; + // right justify to either the configured padding, or the min distance between notes, whichever is greatest. + // This * 2 keeps the existing formatting unless there is 'a lot' of extra whitespace, which won't break + // existing visual regression tests. + const paddingMax = configMaxPadding * 2 < minDistance ? minDistance : configMaxPadding; + const paddingMin = paddingMax - (configMaxPadding - configMinPadding); + const maxX = adjustedJustifyWidth - paddingMin; + let iterations = maxIterations; + // Adjust justification width until the right margin is as close as possible to the calculated padding, + // without going over + while ((actualWidth > maxX && iterations > 0) || (actualWidth + paddingMax < maxX && iterations > 1)) { + targetWidth -= actualWidth - maxX; + actualWidth = shiftToIdealDistances(calculateIdealDistances(targetWidth)); + iterations--; + } + this.justifyWidth = justifyWidth; + return this.evaluate(); + } + /** Calculate the total cost of this formatting decision. */ + evaluate() { + if (!this.tickContexts) + return 0; + const contexts = this.tickContexts; + const justifyWidth = this.justifyWidth; + // Calculate available slack per tick context. This works out how much freedom + // to move a context has in either direction, without affecting other notes. + this.contextGaps = { total: 0, gaps: [] }; + contexts.list.forEach((tick, index) => { + if (index === 0) + return; + const prevTick = contexts.list[index - 1]; + const prevContext = contexts.map[prevTick]; + const context = contexts.map[tick]; + const prevMetrics = prevContext.getMetrics(); + const currMetrics = context.getMetrics(); + // Calculate X position of right edge of previous note + const insideRightEdge = prevContext.getX() + prevMetrics.notePx + prevMetrics.totalRightPx; + // Calculate X position of left edge of current note + const insideLeftEdge = context.getX() - currMetrics.totalLeftPx; + const gap = insideLeftEdge - insideRightEdge; + this.contextGaps.total += gap; + this.contextGaps.gaps.push({ x1: insideRightEdge, x2: insideLeftEdge }); + // Tell the tick contexts how much they can reposition themselves. + context.getFormatterMetrics().freedom.left = gap; + prevContext.getFormatterMetrics().freedom.right = gap; + }); + // Calculate mean distance in each voice for each duration type, then calculate + // how far each note is from the mean. + this.durationStats = {}; + const durationStats = this.durationStats; + function updateStats(duration, space) { + const stats = durationStats[duration]; + if (stats === undefined) { + durationStats[duration] = { mean: space, count: 1 }; + } + else { + stats.count += 1; + stats.mean = (stats.mean + space) / 2; + } + } + this.voices.forEach((voice) => { + voice.getTickables().forEach((note, i, notes) => { + const duration = note.getTicks().clone().simplify().toString(); + const metrics = note.getMetrics(); + const formatterMetrics = note.getFormatterMetrics(); + const leftNoteEdge = note.getX() + metrics.notePx + metrics.modRightPx + metrics.rightDisplacedHeadPx; + let space = 0; + if (i < notes.length - 1) { + const rightNote = notes[i + 1]; + const rightMetrics = rightNote.getMetrics(); + const rightNoteEdge = rightNote.getX() - rightMetrics.modLeftPx - rightMetrics.leftDisplacedHeadPx; + space = rightNoteEdge - leftNoteEdge; + formatterMetrics.space.used = rightNote.getX() - note.getX(); + rightNote.getFormatterMetrics().freedom.left = space; + } + else { + space = justifyWidth - leftNoteEdge; + formatterMetrics.space.used = justifyWidth - note.getX(); + } + formatterMetrics.freedom.right = space; + updateStats(duration, formatterMetrics.space.used); + }); + }); + // Calculate how much each note deviates from the mean. Loss function is square + // root of the sum of squared deviations. + let totalDeviation = 0; + this.voices.forEach((voice) => { + voice.getTickables().forEach((note) => { + const duration = note.getTicks().clone().simplify().toString(); + const metrics = note.getFormatterMetrics(); + metrics.space.mean = durationStats[duration].mean; + metrics.duration = duration; + metrics.iterations += 1; + metrics.space.deviation = metrics.space.used - metrics.space.mean; + totalDeviation += Math.pow(metrics.space.deviation, 2); + }); + }); + this.totalCost = Math.sqrt(totalDeviation); + this.lossHistory.push(this.totalCost); + return this.totalCost; + } + /** + * Run a single iteration of rejustification. At a high level, this method calculates + * the overall "loss" (or cost) of this layout, and repositions tickcontexts in an + * attempt to reduce the cost. You can call this method multiple times until it finds + * and oscillates around a global minimum. + * @param alpha the "learning rate" for the formatter. It determines how much of a shift + * the formatter should make based on its cost function. + */ + tune(options) { + var _a; + const contexts = this.tickContexts; + if (!contexts) { + return 0; + } + const alpha = (_a = options === null || options === void 0 ? void 0 : options.alpha) !== null && _a !== void 0 ? _a : 0.5; + // Move `current` tickcontext by `shift` pixels, and adjust the freedom + // on adjacent tickcontexts. + function move(current, shift, prev, next) { + current.setX(current.getX() + shift); + current.getFormatterMetrics().freedom.left += shift; + current.getFormatterMetrics().freedom.right -= shift; + if (prev) + prev.getFormatterMetrics().freedom.right += shift; + if (next) + next.getFormatterMetrics().freedom.left -= shift; + } + let shift = 0; + this.totalShift = 0; + contexts.list.forEach((tick, index, list) => { + const context = contexts.map[tick]; + const prevContext = index > 0 ? contexts.map[list[index - 1]] : undefined; + const nextContext = index < list.length - 1 ? contexts.map[list[index + 1]] : undefined; + move(context, shift, prevContext, nextContext); + const cost = -sumArray(context.getTickables().map((t) => t.getFormatterMetrics().space.deviation)); + if (cost > 0) { + shift = -Math.min(context.getFormatterMetrics().freedom.right, Math.abs(cost)); + } + else if (cost < 0) { + if (nextContext) { + shift = Math.min(nextContext.getFormatterMetrics().freedom.right, Math.abs(cost)); + } + else { + shift = 0; + } + } + shift *= alpha; + this.totalShift += shift; + }); + return this.evaluate(); + } + /** + * This is the top-level call for all formatting logic completed + * after `x` *and* `y` values have been computed for the notes + * in the voices. + */ + postFormat() { + const postFormatContexts = (contexts) => contexts.list.forEach((tick) => contexts.map[tick].postFormat()); + if (this.modifierContexts) + postFormatContexts(this.modifierContexts); + if (this.tickContexts) + postFormatContexts(this.tickContexts); + return this; + } + /** + * Take all `voices` and create `ModifierContext`s out of them. This tells + * the formatters that the voices belong on a single stave. + */ + joinVoices(voices) { + this.createModifierContexts(voices); + this.hasMinTotalWidth = false; + return this; + } + /** + * Align rests in voices, justify the contexts, and position the notes + * so voices are aligned and ready to render onto the stave. This method + * mutates the `x` positions of all tickables in `voices`. + * + * Voices are full justified to fit in `justifyWidth` pixels. + * + * Set `options.context` to the rendering context. Set `options.align_rests` + * to true to enable rest alignment. + */ + format(voices, justifyWidth, options) { + const opts = Object.assign({ align_rests: false }, options); + this.voices = voices; + const softmaxFactor = this.formatterOptions.softmaxFactor; + if (softmaxFactor) { + this.voices.forEach((v) => v.setSoftmaxFactor(softmaxFactor)); + } + this.alignRests(voices, opts.align_rests); + this.createTickContexts(voices); + this.preFormat(justifyWidth, opts.context, voices, opts.stave); + // Only postFormat if a stave was supplied for y value formatting + if (opts.stave) + this.postFormat(); + return this; + } + // This method is just like `format` except that the `justifyWidth` is inferred from the `stave`. + formatToStave(voices, stave, optionsParam) { + const options = Object.assign({ context: stave.getContext() }, optionsParam); + // eslint-disable-next-line + const justifyWidth = stave.getNoteEndX() - stave.getNoteStartX() - _stave__WEBPACK_IMPORTED_MODULE_4__.Stave.defaultPadding; + L('Formatting voices to width: ', justifyWidth); + return this.format(voices, justifyWidth, options); + } + getTickContext(tick) { + var _a; + return (_a = this.tickContexts) === null || _a === void 0 ? void 0 : _a.map[tick]; + } +} +// To enable logging for this class. Set `Vex.Flow.Formatter.DEBUG` to `true`. +Formatter.DEBUG = false; + + +/***/ }), + +/***/ "./src/fraction.ts": +/*!*************************!*\ + !*** ./src/fraction.ts ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Fraction": () => (/* binding */ Fraction) +/* harmony export */ }); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// Author: Joshua Koo / @zz85 +// Author: @incompleteopus + + +/** Fraction represents a rational number. */ +class Fraction { + /** Set the numerator and denominator. */ + constructor(numerator, denominator) { + this.numerator = 1; + this.denominator = 1; + this.set(numerator, denominator); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_0__.Category.Fraction; + } + /** + * GCD: Greatest common divisor using the Euclidean algorithm. + * Note: GCD(0, 0) => 0 and GCD(0, n) => n. + */ + static GCD(a, b) { + if (typeof a !== 'number' || Number.isNaN(a) || typeof b !== 'number' || Number.isNaN(b)) { + throw new _util__WEBPACK_IMPORTED_MODULE_1__.RuntimeError('BadArgument', `Invalid numbers: ${a}, ${b}`); + } + let t; + while (b !== 0) { + t = b; + b = a % b; + a = t; + } + return a; + } + /** LCM: Lowest common multiple. */ + static LCM(a, b) { + return (a * b) / Fraction.GCD(a, b); + } + /** Lowest common multiple for more than two numbers. */ + static LCMM(args) { + if (args.length === 0) { + return 0; + } + else if (args.length === 1) { + return args[0]; + } + else if (args.length === 2) { + return Fraction.LCM(args[0], args[1]); + } + else { + // args.shift() removes the first number. + // LCM the first number with the rest of the numbers. + return Fraction.LCM(args.shift(), Fraction.LCMM(args)); + } + } + /** Set the numerator and denominator. */ + set(numerator = 1, denominator = 1) { + this.numerator = numerator; + this.denominator = denominator; + return this; + } + /** Return the value of the fraction. */ + value() { + return this.numerator / this.denominator; + } + /** Simplify numerator and denominator using GCD. */ + simplify() { + let u = this.numerator; + let d = this.denominator; + const gcd = Fraction.GCD(u, d); + u /= gcd; + d /= gcd; + if (d < 0) { + d = -d; + u = -u; + } + return this.set(u, d); + } + /** Add value of another fraction. */ + add(param1 = 0, param2 = 1) { + const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2); + const lcm = Fraction.LCM(this.denominator, otherDenominator); + const a = lcm / this.denominator; + const b = lcm / otherDenominator; + const u = this.numerator * a + otherNumerator * b; + return this.set(u, lcm); + } + /** Substract value of another fraction. */ + subtract(param1 = 0, param2 = 1) { + const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2); + const lcm = Fraction.LCM(this.denominator, otherDenominator); + const a = lcm / this.denominator; + const b = lcm / otherDenominator; + const u = this.numerator * a - otherNumerator * b; + return this.set(u, lcm); + } + /** Multiply by value of another fraction. */ + multiply(param1 = 1, param2 = 1) { + const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2); + return this.set(this.numerator * otherNumerator, this.denominator * otherDenominator); + } + /** Divide by value of another Fraction. */ + divide(param1 = 1, param2 = 1) { + const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2); + return this.set(this.numerator * otherDenominator, this.denominator * otherNumerator); + } + /** Simplify both sides and check if they are equal. */ + equals(compare) { + const a = Fraction.__staticFractionA.copy(compare).simplify(); + const b = Fraction.__staticFractionB.copy(this).simplify(); + return a.numerator === b.numerator && a.denominator === b.denominator; + } + /** Greater than operator. */ + greaterThan(compare) { + const a = Fraction.__staticFractionB.copy(this); + a.subtract(compare); + return a.numerator > 0; + } + /** Greater than or equals operator. */ + greaterThanEquals(compare) { + const a = Fraction.__staticFractionB.copy(this); + a.subtract(compare); + return a.numerator >= 0; + } + /** Less than operator. */ + lessThan(compare) { + return !this.greaterThanEquals(compare); + } + /** Less than or equals operator. */ + lessThanEquals(compare) { + return !this.greaterThan(compare); + } + /** Return a new copy with current values. */ + clone() { + return new Fraction(this.numerator, this.denominator); + } + /** Copy value of another fraction. */ + copy(other) { + if (typeof other === 'number') { + return this.set(other, 1); + } + else { + return this.set(other.numerator, other.denominator); + } + } + /** Return the integer component (eg. 5/2 => 2). */ + quotient() { + return Math.floor(this.numerator / this.denominator); + } + /** Return the remainder component (eg. 5/2 => 1). */ + remainder() { + return this.numerator % this.denominator; + } + /** Calculate absolute value. */ + makeAbs() { + this.denominator = Math.abs(this.denominator); + this.numerator = Math.abs(this.numerator); + return this; + } + /** Return a raw string representation (eg. "5/2"). */ + toString() { + return `${this.numerator}/${this.denominator}`; + } + /** Return a simplified string respresentation. */ + toSimplifiedString() { + return Fraction.__staticFractionTmp.copy(this).simplify().toString(); + } + /** Return string representation in mixed form. */ + toMixedString() { + let s = ''; + const q = this.quotient(); + const f = Fraction.__staticFractionTmp.copy(this); + if (q < 0) { + f.makeAbs(); + } + if (q !== 0) { + s += q; + if (f.numerator !== 0) { + s += ` ${f.toSimplifiedString()}`; + } + } + else if (f.numerator === 0) { + s = '0'; + } + else { + s = f.toSimplifiedString(); + } + return s; + } + /** Parse a fraction string. */ + parse(str) { + const i = str.split('/'); + const n = parseInt(i[0], 10); + const d = i[1] ? parseInt(i[1], 10) : 1; + return this.set(n, d); + } +} +// Cached objects for comparisons. +Fraction.__staticFractionA = new Fraction(); +Fraction.__staticFractionB = new Fraction(); +Fraction.__staticFractionTmp = new Fraction(); +/** Helper function to extract the numerator and denominator from another fraction. */ +function getNumeratorAndDenominator(n, d = 1) { + if (typeof n === 'number') { + // Both params are numbers, so we return them as [numerator, denominator]. + return [n, d]; + } + else { + // First param is a Fraction object. We ignore the second param. + return [n.numerator, n.denominator]; + } +} + + +/***/ }), + +/***/ "./src/frethandfinger.ts": +/*!*******************************!*\ + !*** ./src/frethandfinger.ts ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "FretHandFinger": () => (/* binding */ FretHandFinger) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _textformatter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./textformatter */ "./src/textformatter.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// VexFlow - Music Engraving for HTML5 +// Copyright Mohit Muthanna 2010 +// Author Larry Kuhns 2013 +// Class to draws string numbers into the notation. + + + + + + +class FretHandFinger extends _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier { + constructor(finger) { + super(); + this.finger = finger; + this.width = 7; + this.position = _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.LEFT; // Default position above stem or note head + this.x_shift = 0; + this.y_shift = 0; + this.x_offset = 0; // Horizontal offset from default + this.y_offset = 0; // Vertical offset from default + this.resetFont(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_4__.Category.FretHandFinger; + } + // Arrange fingerings inside a ModifierContext. + static format(nums, state) { + const { left_shift, right_shift } = state; + const num_spacing = 1; + if (!nums || nums.length === 0) + return false; + const nums_list = []; + let prev_note = null; + let shiftLeft = 0; + let shiftRight = 0; + for (let i = 0; i < nums.length; ++i) { + const num = nums[i]; + const note = num.getNote(); + const pos = num.getPosition(); + const index = num.checkIndex(); + const props = note.getKeyProps()[index]; + const textFormatter = _textformatter__WEBPACK_IMPORTED_MODULE_3__.TextFormatter.create(num.textFont); + const textHeight = textFormatter.maxHeight; + if (num.position === _modifier__WEBPACK_IMPORTED_MODULE_1__.ModifierPosition.ABOVE) { + state.top_text_line += textHeight / _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.STAVE_LINE_DISTANCE + 0.5; + } + if (num.position === _modifier__WEBPACK_IMPORTED_MODULE_1__.ModifierPosition.BELOW) { + state.text_line += textHeight / _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.STAVE_LINE_DISTANCE + 0.5; + } + if (note !== prev_note) { + for (let n = 0; n < note.keys.length; ++n) { + if (left_shift === 0) { + shiftLeft = Math.max(note.getLeftDisplacedHeadPx(), shiftLeft); + } + if (right_shift === 0) { + shiftRight = Math.max(note.getRightDisplacedHeadPx(), shiftRight); + } + } + prev_note = note; + } + nums_list.push({ + note, + num, + pos, + line: props.line, + shiftL: shiftLeft, + shiftR: shiftRight, + }); + } + // Sort fingernumbers by line number. + nums_list.sort((a, b) => b.line - a.line); + let numShiftL = 0; + let numShiftR = 0; + let xWidthL = 0; + let xWidthR = 0; + let lastLine = null; + let lastNote = null; + for (let i = 0; i < nums_list.length; ++i) { + let num_shift = 0; + const { note, pos, num, line, shiftL, shiftR } = nums_list[i]; + // Reset the position of the string number every line. + if (line !== lastLine || note !== lastNote) { + numShiftL = left_shift + shiftL; + numShiftR = right_shift + shiftR; + } + const numWidth = num.getWidth() + num_spacing; + if (pos === _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.LEFT) { + num.setXShift(left_shift + numShiftL); + num_shift = left_shift + numWidth; // spacing + xWidthL = num_shift > xWidthL ? num_shift : xWidthL; + } + else if (pos === _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.RIGHT) { + num.setXShift(numShiftR); + num_shift = shiftRight + numWidth; // spacing + xWidthR = num_shift > xWidthR ? num_shift : xWidthR; + } + lastLine = line; + lastNote = note; + } + state.left_shift += xWidthL; + state.right_shift += xWidthR; + return true; + } + static easyScoreHook({ fingerings } = {}, note, builder) { + fingerings === null || fingerings === void 0 ? void 0 : fingerings.split(',').map((fingeringString) => { + const split = fingeringString.trim().split('.'); + const params = { number: split[0] }; + if (split[1]) + params.position = split[1]; + return builder.getFactory().Fingering(params); + }).map((fingering, index) => note.addModifier(fingering, index)); + } + setFretHandFinger(finger) { + this.finger = finger; + return this; + } + getFretHandFinger() { + return this.finger; + } + setOffsetX(x) { + this.x_offset = x; + return this; + } + setOffsetY(y) { + this.y_offset = y; + return this; + } + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const start = note.getModifierStartXY(this.position, this.index); + let dot_x = start.x + this.x_shift + this.x_offset; + let dot_y = start.y + this.y_shift + this.y_offset + 5; + switch (this.position) { + case _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.ABOVE: + dot_x -= 4; + dot_y -= 12; + break; + case _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.BELOW: + dot_x -= 2; + dot_y += 10; + break; + case _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.LEFT: + dot_x -= this.width; + break; + case _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.RIGHT: + dot_x += 1; + break; + default: + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('InvalidPosition', `The position ${this.position} does not exist`); + } + ctx.save(); + ctx.setFont(this.textFont); + ctx.fillText('' + this.finger, dot_x, dot_y); + ctx.restore(); + } +} +FretHandFinger.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_0__.Font.SANS_SERIF, + size: 9, + weight: _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.BOLD, + style: _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.NORMAL, +}; + + +/***/ }), + +/***/ "./src/ghostnote.ts": +/*!**************************!*\ + !*** ./src/ghostnote.ts ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "GhostNote": () => (/* binding */ GhostNote) +/* harmony export */ }); +/* harmony import */ var _stemmablenote__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./stemmablenote */ "./src/stemmablenote.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// ## Description + + + +const ERROR_MSG = 'Ghost note must have valid initialization data to identify duration.'; +class GhostNote extends _stemmablenote__WEBPACK_IMPORTED_MODULE_0__.StemmableNote { + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_1__.Category.GhostNote; + } + constructor(parameter) { + if (!parameter) { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('BadArguments', ERROR_MSG); + } + let noteStruct; + if (typeof parameter === 'string') { + // Preserve backwards-compatibility + noteStruct = { duration: parameter }; + } + else if (typeof parameter === 'object') { + noteStruct = parameter; + } + else { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('BadArguments', ERROR_MSG); + } + super(noteStruct); + // Note properties + this.setWidth(0); + } + /** + * @returns true if this note is a type of rest. Rests don't have pitches, but take up space in the score. + */ + isRest() { + return true; + } + setStave(stave) { + super.setStave(stave); + return this; + } + /* Overridden to ignore */ + // eslint-disable-next-line + addToModifierContext(mc) { + // DO NOTHING. + return this; + } + preFormat() { + this.preFormatted = true; + return this; + } + draw() { + // Draw Annotations + this.setRendered(); + for (let i = 0; i < this.modifiers.length; ++i) { + const modifier = this.modifiers[i]; + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_1__.isAnnotation)(modifier)) { + modifier.setContext(this.getContext()); + modifier.drawWithStyle(); + } + } + } +} + + +/***/ }), + +/***/ "./src/glyph.ts": +/*!**********************!*\ + !*** ./src/glyph.ts ***! + \**********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "OutlineCode": () => (/* binding */ OutlineCode), +/* harmony export */ "Glyph": () => (/* binding */ Glyph) +/* harmony export */ }); +/* harmony import */ var _boundingbox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./boundingbox */ "./src/boundingbox.ts"); +/* harmony import */ var _boundingboxcomputation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./boundingboxcomputation */ "./src/boundingboxcomputation.ts"); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + +var OutlineCode; +(function (OutlineCode) { + OutlineCode[OutlineCode["MOVE"] = 0] = "MOVE"; + OutlineCode[OutlineCode["LINE"] = 1] = "LINE"; + OutlineCode[OutlineCode["QUADRATIC"] = 2] = "QUADRATIC"; + OutlineCode[OutlineCode["BEZIER"] = 3] = "BEZIER"; +})(OutlineCode || (OutlineCode = {})); +class GlyphCacheEntry { + constructor(fontStack, code, category) { + this.point = -1; + this.metrics = Glyph.loadMetrics(fontStack, code, category); + this.bbox = Glyph.getOutlineBoundingBox(this.metrics.outline, this.metrics.scale, this.metrics.x_shift, this.metrics.y_shift); + if (category) { + this.point = Glyph.lookupFontMetric(this.metrics.font, category, code, 'point', -1); + } + } +} +class GlyphCache { + constructor() { + this.cache = new Map(); + } + lookup(code, category) { + let entries = this.cache.get(Glyph.CURRENT_CACHE_KEY); + if (entries === undefined) { + entries = {}; + this.cache.set(Glyph.CURRENT_CACHE_KEY, entries); + } + const key = category ? `${code}%${category}` : code; + let entry = entries[key]; + if (entry === undefined) { + entry = new GlyphCacheEntry(Glyph.MUSIC_FONT_STACK, code, category); + entries[key] = entry; + } + return entry; + } +} +class GlyphOutline { + constructor(outline, originX, originY, scale) { + this.outline = outline; + this.originX = originX; + this.originY = originY; + this.scale = scale; + this.i = 0; + // Automatically assign private properties: this.outline, this.originX, this.originY, and this.scale. + } + done() { + return this.i >= this.outline.length; + } + next() { + return this.outline[this.i++]; + } + nextX() { + return this.originX + this.outline[this.i++] * this.scale; + } + nextY() { + return this.originY - this.outline[this.i++] * this.scale; + } + static parse(str) { + const result = []; + const parts = str.split(' '); + let i = 0; + while (i < parts.length) { + switch (parts[i++]) { + case 'm': + result.push(OutlineCode.MOVE, parseInt(parts[i++]), parseInt(parts[i++])); + break; + case 'l': + result.push(OutlineCode.LINE, parseInt(parts[i++]), parseInt(parts[i++])); + break; + case 'q': + result.push(OutlineCode.QUADRATIC, parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++])); + break; + case 'b': + result.push(OutlineCode.BEZIER, parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++])); + break; + } + } + return result; + } +} +class Glyph extends _element__WEBPACK_IMPORTED_MODULE_2__.Element { + /** + * @param code + * @param point + * @param options + */ + constructor(code, point, options) { + super(); + ////////////////////////////////////////////////////////////////////////////////////////////////// + // INSTANCE MEMBERS + this.bbox = new _boundingbox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox(0, 0, 0, 0); + this.topGlyphs = []; + this.botGlyphs = []; + this.options = {}; + this.scale = 1; + this.code = code; + this.point = point; + this.originShift = { x: 0, y: 0 }; + this.x_shift = 0; + this.y_shift = 0; + if (options) { + this.setOptions(options); + } + else { + this.reset(); + } + } + ////////////////////////////////////////////////////////////////////////////////////////////////// + // STATIC MEMBERS + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.Glyph; + } + /** + * Pass a key of the form `glyphs.{category}.{code}.{key}` to Font.lookupMetric(). If the initial lookup fails, + * try again with the path `glyphs.{category}.{key}`. If the second lookup fails, return the defaultValue. + * + * @param font + * @param category any metric path under 'glyphs', so 'stem.up' could resolve to glyphs.stem.up.shiftX, glyphs.stem.up.shiftY, etc. + * @param code + * @param key + * @param defaultValue + */ + static lookupFontMetric(font, category, code, key, defaultValue) { + let value = font.lookupMetric(`glyphs.${category}.${code}.${key}`, undefined); + if (value === undefined) { + // The first lookup failed, so we omit .${code} and try again (with a defaultValue this time). + value = font.lookupMetric(`glyphs.${category}.${key}`, defaultValue); + } + return value; + } + static lookupGlyph(fontStack, code) { + (0,_util__WEBPACK_IMPORTED_MODULE_4__.defined)(fontStack, 'BadFontStack', 'Font stack is misconfigured'); + let glyph; + let font; + for (let i = 0; i < fontStack.length; i++) { + font = fontStack[i]; + glyph = font.getGlyphs()[code]; + if (glyph) + return { glyph, font }; + } + throw new _util__WEBPACK_IMPORTED_MODULE_4__.RuntimeError('BadGlyph', `Glyph ${code} does not exist in font.`); + } + static loadMetrics(fontStack, code, category) { + const { glyph, font } = Glyph.lookupGlyph(fontStack, code); + if (!glyph.o) + throw new _util__WEBPACK_IMPORTED_MODULE_4__.RuntimeError('BadGlyph', `Glyph ${code} has no outline defined.`); + let x_shift = 0; + let y_shift = 0; + let scale = 1; + if (category && font) { + x_shift = Glyph.lookupFontMetric(font, category, code, 'shiftX', 0); + y_shift = Glyph.lookupFontMetric(font, category, code, 'shiftY', 0); + scale = Glyph.lookupFontMetric(font, category, code, 'scale', 1); + } + const x_min = glyph.x_min; + const x_max = glyph.x_max; + const ha = glyph.ha; + if (!glyph.cached_outline) { + glyph.cached_outline = GlyphOutline.parse(glyph.o); + } + return { + x_min, + x_max, + x_shift, + y_shift, + scale, + ha, + outline: glyph.cached_outline, + font, + width: x_max - x_min, + height: ha, + }; + } + /** + * Renders glyphs from the default font stack. + * + * @param ctx Canvas or SVG context + * @param x_pos x coordinate + * @param y_pos y coordinate + * @param point the point size of the font + * @param code the glyph code in font.getGlyphs() + * @param options + * @returns + */ + static renderGlyph(ctx, x_pos, y_pos, point, code, options) { + var _a; + const data = Glyph.cache.lookup(code, options === null || options === void 0 ? void 0 : options.category); + const metrics = data.metrics; + if (data.point != -1) { + point = data.point; + } + const customScale = (_a = options === null || options === void 0 ? void 0 : options.scale) !== null && _a !== void 0 ? _a : 1; + const scale = ((point * 72.0) / (metrics.font.getResolution() * 100.0)) * metrics.scale * customScale; + Glyph.renderOutline(ctx, metrics.outline, scale, x_pos + metrics.x_shift * customScale, y_pos + metrics.y_shift * customScale); + return metrics; + } + static renderOutline(ctx, outline, scale, x_pos, y_pos) { + const go = new GlyphOutline(outline, x_pos, y_pos, scale); + ctx.beginPath(); + let x, y; + while (!go.done()) { + switch (go.next()) { + case OutlineCode.MOVE: + ctx.moveTo(go.nextX(), go.nextY()); + break; + case OutlineCode.LINE: + ctx.lineTo(go.nextX(), go.nextY()); + break; + case OutlineCode.QUADRATIC: + x = go.nextX(); + y = go.nextY(); + ctx.quadraticCurveTo(go.nextX(), go.nextY(), x, y); + break; + case OutlineCode.BEZIER: + x = go.nextX(); + y = go.nextY(); + ctx.bezierCurveTo(go.nextX(), go.nextY(), go.nextX(), go.nextY(), x, y); + break; + } + } + ctx.fill(); + } + static getOutlineBoundingBox(outline, scale, x_pos, y_pos) { + const go = new GlyphOutline(outline, x_pos, y_pos, scale); + const bboxComp = new _boundingboxcomputation__WEBPACK_IMPORTED_MODULE_1__.BoundingBoxComputation(); + // (penX, penY) hold the pen position: the start of each stroke. + let penX = x_pos; + let penY = y_pos; + let x, y; + while (!go.done()) { + switch (go.next()) { + case OutlineCode.MOVE: + // Note that we don't add any points to the bounding box until a srroke is actually drawn. + penX = go.nextX(); + penY = go.nextY(); + break; + case OutlineCode.LINE: + bboxComp.addPoint(penX, penY); + penX = go.nextX(); + penY = go.nextY(); + bboxComp.addPoint(penX, penY); + break; + case OutlineCode.QUADRATIC: + x = go.nextX(); + y = go.nextY(); + bboxComp.addQuadraticCurve(penX, penY, go.nextX(), go.nextY(), x, y); + penX = x; + penY = y; + break; + case OutlineCode.BEZIER: + x = go.nextX(); + y = go.nextY(); + bboxComp.addBezierCurve(penX, penY, go.nextX(), go.nextY(), go.nextX(), go.nextY(), x, y); + penX = x; + penY = y; + break; + } + } + return new _boundingbox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox(bboxComp.getX1(), bboxComp.getY1(), bboxComp.width(), bboxComp.height()); + } + static getWidth(code, point, category) { + const data = Glyph.cache.lookup(code, category); + if (data.point != -1) { + point = data.point; + } + const scale = (point * 72) / (data.metrics.font.getResolution() * 100); + return data.bbox.getW() * scale; + } + // eslint-disable-next-line + draw(...args) { + // DO NOTHING. + } + getCode() { + return this.code; + } + // eslint-disable-next-line + setOptions(options) { + this.options = Object.assign(Object.assign({}, this.options), options); + this.reset(); + } + setPoint(point) { + this.point = point; + return this; + } + setStave(stave) { + this.stave = stave; + return this; + } + setXShift(x_shift) { + this.x_shift = x_shift; + return this; + } + setYShift(y_shift) { + this.y_shift = y_shift; + return this; + } + reset() { + const data = Glyph.cache.lookup(this.code, this.options.category); + this.metrics = data.metrics; + // Override point from metrics file + if (data.point != -1) { + this.point = data.point; + } + this.scale = (this.point * 72) / (this.metrics.font.getResolution() * 100); + this.bbox = new _boundingbox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox(data.bbox.getX() * this.scale, data.bbox.getY() * this.scale, data.bbox.getW() * this.scale, data.bbox.getH() * this.scale); + } + checkMetrics() { + return (0,_util__WEBPACK_IMPORTED_MODULE_4__.defined)(this.metrics, 'BadGlyph', `Glyph ${this.code} is not initialized.`); + } + getMetrics() { + const metrics = this.checkMetrics(); + const metricsScale = metrics.scale; + return { + x_min: metrics.x_min * this.scale * metricsScale, + x_max: metrics.x_max * this.scale * metricsScale, + width: this.bbox.getW(), + height: this.bbox.getH(), + scale: this.scale * metricsScale, + x_shift: metrics.x_shift, + y_shift: metrics.y_shift, + outline: metrics.outline, + font: metrics.font, + ha: metrics.ha, + }; + } + setOriginX(x) { + const { bbox } = this; + const originX = Math.abs(bbox.getX() / bbox.getW()); + const xShift = (x - originX) * bbox.getW(); + this.originShift.x = -xShift; + } + setOriginY(y) { + const { bbox } = this; + const originY = Math.abs(bbox.getY() / bbox.getH()); + const yShift = (y - originY) * bbox.getH(); + this.originShift.y = -yShift; + } + setOrigin(x, y) { + this.setOriginX(x); + this.setOriginY(y); + } + render(ctx, x, y) { + const metrics = this.checkMetrics(); + const outline = metrics.outline; + const scale = this.scale * metrics.scale; + this.setRendered(); + this.applyStyle(ctx); + const xPos = x + this.originShift.x + metrics.x_shift; + const yPos = y + this.originShift.y + metrics.y_shift; + Glyph.renderOutline(ctx, outline, scale, xPos, yPos); + this.restoreStyle(ctx); + } + checkStave() { + return (0,_util__WEBPACK_IMPORTED_MODULE_4__.defined)(this.stave, 'NoStave', 'No stave attached to instance.'); + } + renderToStave(x) { + const context = this.checkContext(); + const metrics = this.checkMetrics(); + const stave = this.checkStave(); + const outline = metrics.outline; + const scale = this.scale * metrics.scale; + this.setRendered(); + this.applyStyle(); + const xPos = x + this.x_shift + metrics.x_shift; + const yPos = stave.getYForGlyphs() + this.y_shift + metrics.y_shift; + Glyph.renderOutline(context, outline, scale, xPos, yPos); + this.restoreStyle(); + } +} +Glyph.cache = new GlyphCache(); +// The current cache key for GlyphCache above. +// Computed when Flow.setMusicFont(...) is called. +// It is set to a comma separated list of font names. +Glyph.CURRENT_CACHE_KEY = ''; +// Used by the GlyphCache above. +// Set when Flow.setMusicFont(...) is called. +Glyph.MUSIC_FONT_STACK = []; + + +/***/ }), + +/***/ "./src/glyphnote.ts": +/*!**************************!*\ + !*** ./src/glyphnote.ts ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "GlyphNote": () => (/* binding */ GlyphNote) +/* harmony export */ }); +/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./note */ "./src/note.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. + + +class GlyphNote extends _note__WEBPACK_IMPORTED_MODULE_0__.Note { + constructor(glyph, noteStruct, options) { + super(noteStruct); + this.options = Object.assign({ ignoreTicks: false, line: 2 }, options); + // Note properties + this.ignore_ticks = this.options.ignoreTicks; + if (glyph) { + this.setGlyph(glyph); + } + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_1__.Category.GlyphNote; + } + setGlyph(glyph) { + this.glyph = glyph; + this.setWidth(this.glyph.getMetrics().width); + return this; + } + getBoundingBox() { + return this.glyph.getBoundingBox(); + } + preFormat() { + if (!this.preFormatted && this.modifierContext) { + this.modifierContext.preFormat(); + } + this.preFormatted = true; + return this; + } + drawModifiers() { + const ctx = this.checkContext(); + ctx.openGroup('modifiers'); + for (let i = 0; i < this.modifiers.length; i++) { + const modifier = this.modifiers[i]; + modifier.setContext(ctx); + modifier.drawWithStyle(); + } + ctx.closeGroup(); + } + draw() { + const stave = this.checkStave(); + const ctx = stave.checkContext(); + this.setRendered(); + ctx.openGroup('glyphNote', this.getAttribute('id')); + // Context is set when setStave is called on Note + const glyph = this.glyph; + if (!glyph.getContext()) { + glyph.setContext(ctx); + } + glyph.setStave(stave); + glyph.setYShift(stave.getYForLine(this.options.line) - stave.getYForGlyphs()); + const x = this.isCenterAligned() ? this.getAbsoluteX() - this.getWidth() / 2 : this.getAbsoluteX(); + glyph.renderToStave(x); + this.drawModifiers(); + ctx.closeGroup(); + } +} + + +/***/ }), + +/***/ "./src/gracenote.ts": +/*!**************************!*\ + !*** ./src/gracenote.ts ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "GraceNote": () => (/* binding */ GraceNote) +/* harmony export */ }); +/* harmony import */ var _stavenote__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./stavenote */ "./src/stavenote.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. + + + + + +class GraceNote extends _stavenote__WEBPACK_IMPORTED_MODULE_0__.StaveNote { + constructor(noteStruct) { + super(Object.assign({ glyph_font_scale: _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.NOTATION_FONT_SCALE * GraceNote.SCALE, stroke_px: GraceNote.LEDGER_LINE_OFFSET }, noteStruct)); + this.slash = noteStruct.slash || false; + this.slur = true; + this.buildNoteHeads(); + this.width = 3; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.GraceNote; + } + static get LEDGER_LINE_OFFSET() { + return 2; + } + static get SCALE() { + return 0.66; + } + getStemExtension() { + if (this.stem_extension_override) { + return this.stem_extension_override; + } + const glyph = this.getGlyph(); + if (glyph) { + let ret = super.getStemExtension(); + if (glyph.stem) { + const staveNoteScale = this.getStaveNoteScale(); + ret = (_stem__WEBPACK_IMPORTED_MODULE_1__.Stem.HEIGHT + ret) * staveNoteScale - _stem__WEBPACK_IMPORTED_MODULE_1__.Stem.HEIGHT; + } + return ret; + } + return 0; + } + // FIXME: move this to more basic class. + getStaveNoteScale() { + return this.render_options.glyph_font_scale / _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.NOTATION_FONT_SCALE; + } + draw() { + super.draw(); + this.setRendered(); + const stem = this.stem; + if (this.slash && stem) { + const staveNoteScale = this.getStaveNoteScale(); + // some magic numbers are based on the staveNoteScale 0.66. + const offsetScale = staveNoteScale / 0.66; + let slashBBox = undefined; + const beam = this.beam; + if (beam) { + // FIXME: should render slash after beam? + if (!beam.postFormatted) { + beam.postFormat(); + } + slashBBox = this.calcBeamedNotesSlashBBox(8 * offsetScale, 8 * offsetScale, { + stem: 6 * offsetScale, + beam: 5 * offsetScale, + }); + } + else { + const stem_direction = this.getStemDirection(); + const noteHeadBounds = this.getNoteHeadBounds(); + const noteStemHeight = stem.getHeight(); + let x = this.getAbsoluteX(); + let y = stem_direction === _stem__WEBPACK_IMPORTED_MODULE_1__.Stem.DOWN + ? noteHeadBounds.y_top - noteStemHeight + : noteHeadBounds.y_bottom - noteStemHeight; + let defaultOffsetY = _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.STEM_HEIGHT; + defaultOffsetY -= defaultOffsetY / 2.8; + y += defaultOffsetY * staveNoteScale * stem_direction; + const offsets = stem_direction === _stem__WEBPACK_IMPORTED_MODULE_1__.Stem.UP + ? { + x1: 1, + y1: 0, + x2: 13, + y2: -9, + } + : { + x1: -4, + y1: 1, + x2: 13, + y2: 9, + }; + x += offsets.x1 * offsetScale; + y += offsets.y1 * offsetScale; + slashBBox = { + x1: x, + y1: y, + x2: x + offsets.x2 * offsetScale, + y2: y + offsets.y2 * offsetScale, + }; + } + // FIXME: avoid staff lines, ledger lines or others. + const ctx = this.checkContext(); + ctx.save(); + ctx.setLineWidth(1 * offsetScale); // FIXME: use more appropriate value. + ctx.beginPath(); + ctx.moveTo(slashBBox.x1, slashBBox.y1); + ctx.lineTo(slashBBox.x2, slashBBox.y2); + ctx.closePath(); + ctx.stroke(); + ctx.restore(); + } + } + calcBeamedNotesSlashBBox(slashStemOffset, slashBeamOffset, protrusions) { + const beam = this.beam; + if (!beam) + throw new _util__WEBPACK_IMPORTED_MODULE_4__.RuntimeError('NoBeam', "Can't calculate without a beam."); + const beam_slope = beam.slope; + const isBeamEndNote = beam.notes[beam.notes.length - 1] === this; + const scaleX = isBeamEndNote ? -1 : 1; + const beam_angle = Math.atan(beam_slope * scaleX); + // slash line intersecting point on beam. + const iPointOnBeam = { + dx: Math.cos(beam_angle) * slashBeamOffset, + dy: Math.sin(beam_angle) * slashBeamOffset, + }; + slashStemOffset *= this.getStemDirection(); + const slash_angle = Math.atan((iPointOnBeam.dy - slashStemOffset) / iPointOnBeam.dx); + const protrusion_stem_dx = Math.cos(slash_angle) * protrusions.stem * scaleX; + const protrusion_stem_dy = Math.sin(slash_angle) * protrusions.stem; + const protrusion_beam_dx = Math.cos(slash_angle) * protrusions.beam * scaleX; + const protrusion_beam_dy = Math.sin(slash_angle) * protrusions.beam; + const stemX = this.getStemX(); + const stem0X = beam.notes[0].getStemX(); + const stemY = beam.getBeamYToDraw() + (stemX - stem0X) * beam_slope; + const ret = { + x1: stemX - protrusion_stem_dx, + y1: stemY + slashStemOffset - protrusion_stem_dy, + x2: stemX + iPointOnBeam.dx * scaleX + protrusion_beam_dx, + y2: stemY + iPointOnBeam.dy + protrusion_beam_dy, + }; + return ret; + } +} + + +/***/ }), + +/***/ "./src/gracenotegroup.ts": +/*!*******************************!*\ + !*** ./src/gracenotegroup.ts ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "GraceNoteGroup": () => (/* binding */ GraceNoteGroup) +/* harmony export */ }); +/* harmony import */ var _beam__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./beam */ "./src/beam.ts"); +/* harmony import */ var _formatter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./formatter */ "./src/formatter.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _stavetie__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./stavetie */ "./src/stavetie.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _tabtie__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tabtie */ "./src/tabtie.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +/* harmony import */ var _voice__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./voice */ "./src/voice.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// ## Description +// +// This file implements `GraceNoteGroup` which is used to format and +// render grace notes. + + + + + + + + + +// To enable logging for this class. Set `GraceNoteGroup.DEBUG` to `true`. +// eslint-disable-next-line +function L(...args) { + if (GraceNoteGroup.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_7__.log)('Vex.Flow.GraceNoteGroup', args); +} +/** GraceNoteGroup is used to format and render grace notes. */ +class GraceNoteGroup extends _modifier__WEBPACK_IMPORTED_MODULE_2__.Modifier { + //** `GraceNoteGroup` inherits from `Modifier` and is placed inside a `ModifierContext`. */ + constructor(grace_notes, show_slur) { + super(); + this.preFormatted = false; + this.position = _modifier__WEBPACK_IMPORTED_MODULE_2__.Modifier.Position.LEFT; + this.grace_notes = grace_notes; + this.width = 0; + this.show_slur = show_slur; + this.slur = undefined; + this.voice = new _voice__WEBPACK_IMPORTED_MODULE_8__.Voice({ + num_beats: 4, + beat_value: 4, + resolution: _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.RESOLUTION, + }).setStrict(false); + this.render_options = { + slur_y_shift: 0, + }; + this.beams = []; + this.voice.addTickables(this.grace_notes); + return this; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_6__.Category.GraceNoteGroup; + } + /** Arranges groups inside a `ModifierContext`. */ + static format(gracenote_groups, state) { + const group_spacing_stave = 4; + const group_spacing_tab = 0; + if (!gracenote_groups || gracenote_groups.length === 0) + return false; + const group_list = []; + let prev_note = null; + let shiftL = 0; + for (let i = 0; i < gracenote_groups.length; ++i) { + const gracenote_group = gracenote_groups[i]; + const note = gracenote_group.getNote(); + const is_stavenote = (0,_typeguard__WEBPACK_IMPORTED_MODULE_6__.isStaveNote)(note); + const spacing = is_stavenote ? group_spacing_stave : group_spacing_tab; + if (is_stavenote && note !== prev_note) { + // Iterate through all notes to get the displaced pixels + for (let n = 0; n < note.keys.length; ++n) { + shiftL = Math.max(note.getLeftDisplacedHeadPx(), shiftL); + } + prev_note = note; + } + group_list.push({ shift: shiftL, gracenote_group, spacing }); + } + // If first note left shift in case it is displaced + let group_shift = group_list[0].shift; + let formatWidth; + for (let i = 0; i < group_list.length; ++i) { + const gracenote_group = group_list[i].gracenote_group; + gracenote_group.preFormat(); + formatWidth = gracenote_group.getWidth() + group_list[i].spacing; + group_shift = Math.max(formatWidth, group_shift); + } + for (let i = 0; i < group_list.length; ++i) { + const gracenote_group = group_list[i].gracenote_group; + formatWidth = gracenote_group.getWidth() + group_list[i].spacing; + gracenote_group.setSpacingFromNextModifier(group_shift - Math.min(formatWidth, group_shift)); + } + state.left_shift += group_shift; + return true; + } + preFormat() { + if (this.preFormatted) + return; + if (!this.formatter) { + this.formatter = new _formatter__WEBPACK_IMPORTED_MODULE_1__.Formatter(); + } + this.formatter.joinVoices([this.voice]).format([this.voice], 0, {}); + this.setWidth(this.formatter.getMinTotalWidth()); + this.preFormatted = true; + } + beamNotes(grace_notes) { + grace_notes = grace_notes || this.grace_notes; + if (grace_notes.length > 1) { + const beam = new _beam__WEBPACK_IMPORTED_MODULE_0__.Beam(grace_notes); + beam.render_options.beam_width = 3; + beam.render_options.partial_beam_length = 4; + this.beams.push(beam); + } + return this; + } + setWidth(width) { + this.width = width; + return this; + } + getWidth() { + return this.width; + } + getGraceNotes() { + return this.grace_notes; + } + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + L('Drawing grace note group for:', note); + this.alignSubNotesWithNote(this.getGraceNotes(), note); // Modifier function + // Draw grace notes. + this.grace_notes.forEach((graceNote) => graceNote.setContext(ctx).draw()); + // Draw beams. + this.beams.forEach((beam) => beam.setContext(ctx).draw()); + if (this.show_slur) { + // Create and draw slur. + const is_stavenote = (0,_typeguard__WEBPACK_IMPORTED_MODULE_6__.isStaveNote)(note); + const TieClass = is_stavenote ? _stavetie__WEBPACK_IMPORTED_MODULE_3__.StaveTie : _tabtie__WEBPACK_IMPORTED_MODULE_5__.TabTie; + this.slur = new TieClass({ + last_note: this.grace_notes[0], + first_note: note, + first_indices: [0], + last_indices: [0], + }); + this.slur.render_options.cp2 = 12; + this.slur.render_options.y_shift = (is_stavenote ? 7 : 5) + this.render_options.slur_y_shift; + this.slur.setContext(ctx).draw(); + } + } +} +GraceNoteGroup.DEBUG = false; + + +/***/ }), + +/***/ "./src/gracetabnote.ts": +/*!*****************************!*\ + !*** ./src/gracetabnote.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "GraceTabNote": () => (/* binding */ GraceTabNote) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _tabnote__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tabnote */ "./src/tabnote.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// @author Balazs Forian-Szabo +// +// ## Description +// +// A basic implementation of grace notes +// to be rendered on a tab stave. +// +// See `tests/gracetabnote_tests.ts` for usage examples. + + + +class GraceTabNote extends _tabnote__WEBPACK_IMPORTED_MODULE_1__.TabNote { + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_2__.Category.GraceTabNote; + } + constructor(noteStruct) { + super(noteStruct, false); + this.render_options = Object.assign(Object.assign({}, this.render_options), { + // vertical shift from stave line + y_shift: 0.3, + // grace glyph scale + scale: 0.6, + // grace tablature font + font: `7.5pt ${_font__WEBPACK_IMPORTED_MODULE_0__.Font.SANS_SERIF}` }); + this.updateWidth(); + } +} + + +/***/ }), + +/***/ "./src/index.ts": +/*!**********************!*\ + !*** ./src/index.ts ***! + \**********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Accidental": () => (/* reexport safe */ _accidental__WEBPACK_IMPORTED_MODULE_1__.Accidental), +/* harmony export */ "Annotation": () => (/* reexport safe */ _annotation__WEBPACK_IMPORTED_MODULE_2__.Annotation), +/* harmony export */ "AnnotationHorizontalJustify": () => (/* reexport safe */ _annotation__WEBPACK_IMPORTED_MODULE_2__.AnnotationHorizontalJustify), +/* harmony export */ "AnnotationVerticalJustify": () => (/* reexport safe */ _annotation__WEBPACK_IMPORTED_MODULE_2__.AnnotationVerticalJustify), +/* harmony export */ "Articulation": () => (/* reexport safe */ _articulation__WEBPACK_IMPORTED_MODULE_3__.Articulation), +/* harmony export */ "BarNote": () => (/* reexport safe */ _barnote__WEBPACK_IMPORTED_MODULE_4__.BarNote), +/* harmony export */ "Beam": () => (/* reexport safe */ _beam__WEBPACK_IMPORTED_MODULE_5__.Beam), +/* harmony export */ "Bend": () => (/* reexport safe */ _bend__WEBPACK_IMPORTED_MODULE_6__.Bend), +/* harmony export */ "BoundingBox": () => (/* reexport safe */ _boundingbox__WEBPACK_IMPORTED_MODULE_7__.BoundingBox), +/* harmony export */ "BoundingBoxComputation": () => (/* reexport safe */ _boundingboxcomputation__WEBPACK_IMPORTED_MODULE_8__.BoundingBoxComputation), +/* harmony export */ "CanvasContext": () => (/* reexport safe */ _canvascontext__WEBPACK_IMPORTED_MODULE_9__.CanvasContext), +/* harmony export */ "ChordSymbol": () => (/* reexport safe */ _chordsymbol__WEBPACK_IMPORTED_MODULE_10__.ChordSymbol), +/* harmony export */ "ChordSymbolHorizontalJustify": () => (/* reexport safe */ _chordsymbol__WEBPACK_IMPORTED_MODULE_10__.ChordSymbolHorizontalJustify), +/* harmony export */ "ChordSymbolVerticalJustify": () => (/* reexport safe */ _chordsymbol__WEBPACK_IMPORTED_MODULE_10__.ChordSymbolVerticalJustify), +/* harmony export */ "SymbolModifiers": () => (/* reexport safe */ _chordsymbol__WEBPACK_IMPORTED_MODULE_10__.SymbolModifiers), +/* harmony export */ "SymbolTypes": () => (/* reexport safe */ _chordsymbol__WEBPACK_IMPORTED_MODULE_10__.SymbolTypes), +/* harmony export */ "Clef": () => (/* reexport safe */ _clef__WEBPACK_IMPORTED_MODULE_11__.Clef), +/* harmony export */ "ClefNote": () => (/* reexport safe */ _clefnote__WEBPACK_IMPORTED_MODULE_12__.ClefNote), +/* harmony export */ "Crescendo": () => (/* reexport safe */ _crescendo__WEBPACK_IMPORTED_MODULE_13__.Crescendo), +/* harmony export */ "Curve": () => (/* reexport safe */ _curve__WEBPACK_IMPORTED_MODULE_14__.Curve), +/* harmony export */ "CurvePosition": () => (/* reexport safe */ _curve__WEBPACK_IMPORTED_MODULE_14__.CurvePosition), +/* harmony export */ "Dot": () => (/* reexport safe */ _dot__WEBPACK_IMPORTED_MODULE_15__.Dot), +/* harmony export */ "Builder": () => (/* reexport safe */ _easyscore__WEBPACK_IMPORTED_MODULE_16__.Builder), +/* harmony export */ "EasyScore": () => (/* reexport safe */ _easyscore__WEBPACK_IMPORTED_MODULE_16__.EasyScore), +/* harmony export */ "EasyScoreGrammar": () => (/* reexport safe */ _easyscore__WEBPACK_IMPORTED_MODULE_16__.EasyScoreGrammar), +/* harmony export */ "Piece": () => (/* reexport safe */ _easyscore__WEBPACK_IMPORTED_MODULE_16__.Piece), +/* harmony export */ "Element": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_17__.Element), +/* harmony export */ "Factory": () => (/* reexport safe */ _factory__WEBPACK_IMPORTED_MODULE_18__.Factory), +/* harmony export */ "Flow": () => (/* reexport safe */ _flow__WEBPACK_IMPORTED_MODULE_19__.Flow), +/* harmony export */ "Font": () => (/* reexport safe */ _font__WEBPACK_IMPORTED_MODULE_20__.Font), +/* harmony export */ "FontStyle": () => (/* reexport safe */ _font__WEBPACK_IMPORTED_MODULE_20__.FontStyle), +/* harmony export */ "FontWeight": () => (/* reexport safe */ _font__WEBPACK_IMPORTED_MODULE_20__.FontWeight), +/* harmony export */ "Formatter": () => (/* reexport safe */ _formatter__WEBPACK_IMPORTED_MODULE_21__.Formatter), +/* harmony export */ "Fraction": () => (/* reexport safe */ _fraction__WEBPACK_IMPORTED_MODULE_22__.Fraction), +/* harmony export */ "FretHandFinger": () => (/* reexport safe */ _frethandfinger__WEBPACK_IMPORTED_MODULE_23__.FretHandFinger), +/* harmony export */ "GhostNote": () => (/* reexport safe */ _ghostnote__WEBPACK_IMPORTED_MODULE_24__.GhostNote), +/* harmony export */ "Glyph": () => (/* reexport safe */ _glyph__WEBPACK_IMPORTED_MODULE_25__.Glyph), +/* harmony export */ "OutlineCode": () => (/* reexport safe */ _glyph__WEBPACK_IMPORTED_MODULE_25__.OutlineCode), +/* harmony export */ "GlyphNote": () => (/* reexport safe */ _glyphnote__WEBPACK_IMPORTED_MODULE_26__.GlyphNote), +/* harmony export */ "GraceNote": () => (/* reexport safe */ _gracenote__WEBPACK_IMPORTED_MODULE_27__.GraceNote), +/* harmony export */ "GraceNoteGroup": () => (/* reexport safe */ _gracenotegroup__WEBPACK_IMPORTED_MODULE_28__.GraceNoteGroup), +/* harmony export */ "GraceTabNote": () => (/* reexport safe */ _gracetabnote__WEBPACK_IMPORTED_MODULE_29__.GraceTabNote), +/* harmony export */ "KeyManager": () => (/* reexport safe */ _keymanager__WEBPACK_IMPORTED_MODULE_30__.KeyManager), +/* harmony export */ "KeySignature": () => (/* reexport safe */ _keysignature__WEBPACK_IMPORTED_MODULE_31__.KeySignature), +/* harmony export */ "KeySigNote": () => (/* reexport safe */ _keysignote__WEBPACK_IMPORTED_MODULE_32__.KeySigNote), +/* harmony export */ "Modifier": () => (/* reexport safe */ _modifier__WEBPACK_IMPORTED_MODULE_33__.Modifier), +/* harmony export */ "ModifierPosition": () => (/* reexport safe */ _modifier__WEBPACK_IMPORTED_MODULE_33__.ModifierPosition), +/* harmony export */ "ModifierContext": () => (/* reexport safe */ _modifiercontext__WEBPACK_IMPORTED_MODULE_34__.ModifierContext), +/* harmony export */ "MultiMeasureRest": () => (/* reexport safe */ _multimeasurerest__WEBPACK_IMPORTED_MODULE_35__.MultiMeasureRest), +/* harmony export */ "Music": () => (/* reexport safe */ _music__WEBPACK_IMPORTED_MODULE_36__.Music), +/* harmony export */ "Note": () => (/* reexport safe */ _note__WEBPACK_IMPORTED_MODULE_37__.Note), +/* harmony export */ "NoteHead": () => (/* reexport safe */ _notehead__WEBPACK_IMPORTED_MODULE_38__.NoteHead), +/* harmony export */ "NoteSubGroup": () => (/* reexport safe */ _notesubgroup__WEBPACK_IMPORTED_MODULE_39__.NoteSubGroup), +/* harmony export */ "Ornament": () => (/* reexport safe */ _ornament__WEBPACK_IMPORTED_MODULE_40__.Ornament), +/* harmony export */ "Parenthesis": () => (/* reexport safe */ _parenthesis__WEBPACK_IMPORTED_MODULE_41__.Parenthesis), +/* harmony export */ "Parser": () => (/* reexport safe */ _parser__WEBPACK_IMPORTED_MODULE_42__.Parser), +/* harmony export */ "PedalMarking": () => (/* reexport safe */ _pedalmarking__WEBPACK_IMPORTED_MODULE_43__.PedalMarking), +/* harmony export */ "Registry": () => (/* reexport safe */ _registry__WEBPACK_IMPORTED_MODULE_44__.Registry), +/* harmony export */ "RenderContext": () => (/* reexport safe */ _rendercontext__WEBPACK_IMPORTED_MODULE_45__.RenderContext), +/* harmony export */ "drawDot": () => (/* reexport safe */ _rendercontext__WEBPACK_IMPORTED_MODULE_45__.drawDot), +/* harmony export */ "Renderer": () => (/* reexport safe */ _renderer__WEBPACK_IMPORTED_MODULE_46__.Renderer), +/* harmony export */ "RendererBackends": () => (/* reexport safe */ _renderer__WEBPACK_IMPORTED_MODULE_46__.RendererBackends), +/* harmony export */ "RendererLineEndType": () => (/* reexport safe */ _renderer__WEBPACK_IMPORTED_MODULE_46__.RendererLineEndType), +/* harmony export */ "RepeatNote": () => (/* reexport safe */ _repeatnote__WEBPACK_IMPORTED_MODULE_47__.RepeatNote), +/* harmony export */ "Stave": () => (/* reexport safe */ _stave__WEBPACK_IMPORTED_MODULE_48__.Stave), +/* harmony export */ "Barline": () => (/* reexport safe */ _stavebarline__WEBPACK_IMPORTED_MODULE_49__.Barline), +/* harmony export */ "BarlineType": () => (/* reexport safe */ _stavebarline__WEBPACK_IMPORTED_MODULE_49__.BarlineType), +/* harmony export */ "StaveConnector": () => (/* reexport safe */ _staveconnector__WEBPACK_IMPORTED_MODULE_50__.StaveConnector), +/* harmony export */ "StaveHairpin": () => (/* reexport safe */ _stavehairpin__WEBPACK_IMPORTED_MODULE_51__.StaveHairpin), +/* harmony export */ "StaveLine": () => (/* reexport safe */ _staveline__WEBPACK_IMPORTED_MODULE_52__.StaveLine), +/* harmony export */ "StaveModifier": () => (/* reexport safe */ _stavemodifier__WEBPACK_IMPORTED_MODULE_53__.StaveModifier), +/* harmony export */ "StaveModifierPosition": () => (/* reexport safe */ _stavemodifier__WEBPACK_IMPORTED_MODULE_53__.StaveModifierPosition), +/* harmony export */ "StaveNote": () => (/* reexport safe */ _stavenote__WEBPACK_IMPORTED_MODULE_54__.StaveNote), +/* harmony export */ "Repetition": () => (/* reexport safe */ _staverepetition__WEBPACK_IMPORTED_MODULE_55__.Repetition), +/* harmony export */ "StaveSection": () => (/* reexport safe */ _stavesection__WEBPACK_IMPORTED_MODULE_56__.StaveSection), +/* harmony export */ "StaveTempo": () => (/* reexport safe */ _stavetempo__WEBPACK_IMPORTED_MODULE_57__.StaveTempo), +/* harmony export */ "StaveText": () => (/* reexport safe */ _stavetext__WEBPACK_IMPORTED_MODULE_58__.StaveText), +/* harmony export */ "StaveTie": () => (/* reexport safe */ _stavetie__WEBPACK_IMPORTED_MODULE_59__.StaveTie), +/* harmony export */ "Volta": () => (/* reexport safe */ _stavevolta__WEBPACK_IMPORTED_MODULE_60__.Volta), +/* harmony export */ "VoltaType": () => (/* reexport safe */ _stavevolta__WEBPACK_IMPORTED_MODULE_60__.VoltaType), +/* harmony export */ "Stem": () => (/* reexport safe */ _stem__WEBPACK_IMPORTED_MODULE_61__.Stem), +/* harmony export */ "StemmableNote": () => (/* reexport safe */ _stemmablenote__WEBPACK_IMPORTED_MODULE_62__.StemmableNote), +/* harmony export */ "StringNumber": () => (/* reexport safe */ _stringnumber__WEBPACK_IMPORTED_MODULE_63__.StringNumber), +/* harmony export */ "Stroke": () => (/* reexport safe */ _strokes__WEBPACK_IMPORTED_MODULE_64__.Stroke), +/* harmony export */ "SVGContext": () => (/* reexport safe */ _svgcontext__WEBPACK_IMPORTED_MODULE_65__.SVGContext), +/* harmony export */ "System": () => (/* reexport safe */ _system__WEBPACK_IMPORTED_MODULE_66__.System), +/* harmony export */ "TabNote": () => (/* reexport safe */ _tabnote__WEBPACK_IMPORTED_MODULE_67__.TabNote), +/* harmony export */ "TabSlide": () => (/* reexport safe */ _tabslide__WEBPACK_IMPORTED_MODULE_68__.TabSlide), +/* harmony export */ "TabStave": () => (/* reexport safe */ _tabstave__WEBPACK_IMPORTED_MODULE_69__.TabStave), +/* harmony export */ "TabTie": () => (/* reexport safe */ _tabtie__WEBPACK_IMPORTED_MODULE_70__.TabTie), +/* harmony export */ "TextBracket": () => (/* reexport safe */ _textbracket__WEBPACK_IMPORTED_MODULE_71__.TextBracket), +/* harmony export */ "TextBracketPosition": () => (/* reexport safe */ _textbracket__WEBPACK_IMPORTED_MODULE_71__.TextBracketPosition), +/* harmony export */ "TextDynamics": () => (/* reexport safe */ _textdynamics__WEBPACK_IMPORTED_MODULE_72__.TextDynamics), +/* harmony export */ "TextFormatter": () => (/* reexport safe */ _textformatter__WEBPACK_IMPORTED_MODULE_73__.TextFormatter), +/* harmony export */ "Justification": () => (/* reexport safe */ _textnote__WEBPACK_IMPORTED_MODULE_74__.Justification), +/* harmony export */ "TextNote": () => (/* reexport safe */ _textnote__WEBPACK_IMPORTED_MODULE_74__.TextNote), +/* harmony export */ "Tickable": () => (/* reexport safe */ _tickable__WEBPACK_IMPORTED_MODULE_75__.Tickable), +/* harmony export */ "TickContext": () => (/* reexport safe */ _tickcontext__WEBPACK_IMPORTED_MODULE_76__.TickContext), +/* harmony export */ "TimeSignatureGlyph": () => (/* reexport safe */ _timesigglyph__WEBPACK_IMPORTED_MODULE_77__.TimeSignatureGlyph), +/* harmony export */ "TimeSignature": () => (/* reexport safe */ _timesignature__WEBPACK_IMPORTED_MODULE_78__.TimeSignature), +/* harmony export */ "TimeSigNote": () => (/* reexport safe */ _timesignote__WEBPACK_IMPORTED_MODULE_79__.TimeSigNote), +/* harmony export */ "Tremolo": () => (/* reexport safe */ _tremolo__WEBPACK_IMPORTED_MODULE_80__.Tremolo), +/* harmony export */ "Tuning": () => (/* reexport safe */ _tuning__WEBPACK_IMPORTED_MODULE_81__.Tuning), +/* harmony export */ "Tuplet": () => (/* reexport safe */ _tuplet__WEBPACK_IMPORTED_MODULE_82__.Tuplet), +/* harmony export */ "TupletLocation": () => (/* reexport safe */ _tuplet__WEBPACK_IMPORTED_MODULE_82__.TupletLocation), +/* harmony export */ "Category": () => (/* reexport safe */ _typeguard__WEBPACK_IMPORTED_MODULE_83__.Category), +/* harmony export */ "isAccidental": () => (/* reexport safe */ _typeguard__WEBPACK_IMPORTED_MODULE_83__.isAccidental), +/* harmony export */ "isAnnotation": () => (/* reexport safe */ _typeguard__WEBPACK_IMPORTED_MODULE_83__.isAnnotation), +/* harmony export */ "isBarline": () => (/* reexport safe */ _typeguard__WEBPACK_IMPORTED_MODULE_83__.isBarline), +/* harmony export */ "isCategory": () => (/* reexport safe */ _typeguard__WEBPACK_IMPORTED_MODULE_83__.isCategory), +/* harmony export */ "isDot": () => (/* reexport safe */ _typeguard__WEBPACK_IMPORTED_MODULE_83__.isDot), +/* harmony export */ "isGraceNote": () => (/* reexport safe */ _typeguard__WEBPACK_IMPORTED_MODULE_83__.isGraceNote), +/* harmony export */ "isGraceNoteGroup": () => (/* reexport safe */ _typeguard__WEBPACK_IMPORTED_MODULE_83__.isGraceNoteGroup), +/* harmony export */ "isNote": () => (/* reexport safe */ _typeguard__WEBPACK_IMPORTED_MODULE_83__.isNote), +/* harmony export */ "isRenderContext": () => (/* reexport safe */ _typeguard__WEBPACK_IMPORTED_MODULE_83__.isRenderContext), +/* harmony export */ "isStaveNote": () => (/* reexport safe */ _typeguard__WEBPACK_IMPORTED_MODULE_83__.isStaveNote), +/* harmony export */ "isStemmableNote": () => (/* reexport safe */ _typeguard__WEBPACK_IMPORTED_MODULE_83__.isStemmableNote), +/* harmony export */ "isTabNote": () => (/* reexport safe */ _typeguard__WEBPACK_IMPORTED_MODULE_83__.isTabNote), +/* harmony export */ "RuntimeError": () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_84__.RuntimeError), +/* harmony export */ "defined": () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_84__.defined), +/* harmony export */ "globalObject": () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_84__.globalObject), +/* harmony export */ "log": () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_84__.log), +/* harmony export */ "midLine": () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_84__.midLine), +/* harmony export */ "normalizeAngle": () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_84__.normalizeAngle), +/* harmony export */ "prefix": () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_84__.prefix), +/* harmony export */ "warn": () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_84__.warn), +/* harmony export */ "Vibrato": () => (/* reexport safe */ _vibrato__WEBPACK_IMPORTED_MODULE_85__.Vibrato), +/* harmony export */ "VibratoBracket": () => (/* reexport safe */ _vibratobracket__WEBPACK_IMPORTED_MODULE_86__.VibratoBracket), +/* harmony export */ "Voice": () => (/* reexport safe */ _voice__WEBPACK_IMPORTED_MODULE_87__.Voice), +/* harmony export */ "VoiceMode": () => (/* reexport safe */ _voice__WEBPACK_IMPORTED_MODULE_87__.VoiceMode), +/* harmony export */ "isHTMLCanvas": () => (/* reexport safe */ _web__WEBPACK_IMPORTED_MODULE_88__.isHTMLCanvas), +/* harmony export */ "isHTMLDiv": () => (/* reexport safe */ _web__WEBPACK_IMPORTED_MODULE_88__.isHTMLDiv), +/* harmony export */ "Vex": () => (/* reexport safe */ _vex__WEBPACK_IMPORTED_MODULE_0__.Vex), +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _vex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vex */ "./src/vex.ts"); +/* harmony import */ var _accidental__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./accidental */ "./src/accidental.ts"); +/* harmony import */ var _annotation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./annotation */ "./src/annotation.ts"); +/* harmony import */ var _articulation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./articulation */ "./src/articulation.ts"); +/* harmony import */ var _barnote__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./barnote */ "./src/barnote.ts"); +/* harmony import */ var _beam__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./beam */ "./src/beam.ts"); +/* harmony import */ var _bend__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./bend */ "./src/bend.ts"); +/* harmony import */ var _boundingbox__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./boundingbox */ "./src/boundingbox.ts"); +/* harmony import */ var _boundingboxcomputation__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./boundingboxcomputation */ "./src/boundingboxcomputation.ts"); +/* harmony import */ var _canvascontext__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./canvascontext */ "./src/canvascontext.ts"); +/* harmony import */ var _chordsymbol__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./chordsymbol */ "./src/chordsymbol.ts"); +/* harmony import */ var _clef__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./clef */ "./src/clef.ts"); +/* harmony import */ var _clefnote__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./clefnote */ "./src/clefnote.ts"); +/* harmony import */ var _crescendo__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./crescendo */ "./src/crescendo.ts"); +/* harmony import */ var _curve__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./curve */ "./src/curve.ts"); +/* harmony import */ var _dot__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./dot */ "./src/dot.ts"); +/* harmony import */ var _easyscore__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./easyscore */ "./src/easyscore.ts"); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _factory__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./factory */ "./src/factory.ts"); +/* harmony import */ var _flow__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./flow */ "./src/flow.ts"); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _formatter__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./formatter */ "./src/formatter.ts"); +/* harmony import */ var _fraction__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./fraction */ "./src/fraction.ts"); +/* harmony import */ var _frethandfinger__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./frethandfinger */ "./src/frethandfinger.ts"); +/* harmony import */ var _ghostnote__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./ghostnote */ "./src/ghostnote.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _glyphnote__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./glyphnote */ "./src/glyphnote.ts"); +/* harmony import */ var _gracenote__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./gracenote */ "./src/gracenote.ts"); +/* harmony import */ var _gracenotegroup__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./gracenotegroup */ "./src/gracenotegroup.ts"); +/* harmony import */ var _gracetabnote__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./gracetabnote */ "./src/gracetabnote.ts"); +/* harmony import */ var _keymanager__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./keymanager */ "./src/keymanager.ts"); +/* harmony import */ var _keysignature__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./keysignature */ "./src/keysignature.ts"); +/* harmony import */ var _keysignote__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./keysignote */ "./src/keysignote.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _modifiercontext__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./modifiercontext */ "./src/modifiercontext.ts"); +/* harmony import */ var _multimeasurerest__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./multimeasurerest */ "./src/multimeasurerest.ts"); +/* harmony import */ var _music__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./music */ "./src/music.ts"); +/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./note */ "./src/note.ts"); +/* harmony import */ var _notehead__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./notehead */ "./src/notehead.ts"); +/* harmony import */ var _notesubgroup__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./notesubgroup */ "./src/notesubgroup.ts"); +/* harmony import */ var _ornament__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./ornament */ "./src/ornament.ts"); +/* harmony import */ var _parenthesis__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./parenthesis */ "./src/parenthesis.ts"); +/* harmony import */ var _parser__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./parser */ "./src/parser.ts"); +/* harmony import */ var _pedalmarking__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./pedalmarking */ "./src/pedalmarking.ts"); +/* harmony import */ var _registry__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ./registry */ "./src/registry.ts"); +/* harmony import */ var _rendercontext__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ./rendercontext */ "./src/rendercontext.ts"); +/* harmony import */ var _renderer__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ./renderer */ "./src/renderer.ts"); +/* harmony import */ var _repeatnote__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ./repeatnote */ "./src/repeatnote.ts"); +/* harmony import */ var _stave__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ./stave */ "./src/stave.ts"); +/* harmony import */ var _stavebarline__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ./stavebarline */ "./src/stavebarline.ts"); +/* harmony import */ var _staveconnector__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! ./staveconnector */ "./src/staveconnector.ts"); +/* harmony import */ var _stavehairpin__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! ./stavehairpin */ "./src/stavehairpin.ts"); +/* harmony import */ var _staveline__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! ./staveline */ "./src/staveline.ts"); +/* harmony import */ var _stavemodifier__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! ./stavemodifier */ "./src/stavemodifier.ts"); +/* harmony import */ var _stavenote__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! ./stavenote */ "./src/stavenote.ts"); +/* harmony import */ var _staverepetition__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! ./staverepetition */ "./src/staverepetition.ts"); +/* harmony import */ var _stavesection__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! ./stavesection */ "./src/stavesection.ts"); +/* harmony import */ var _stavetempo__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! ./stavetempo */ "./src/stavetempo.ts"); +/* harmony import */ var _stavetext__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! ./stavetext */ "./src/stavetext.ts"); +/* harmony import */ var _stavetie__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! ./stavetie */ "./src/stavetie.ts"); +/* harmony import */ var _stavevolta__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(/*! ./stavevolta */ "./src/stavevolta.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _stemmablenote__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(/*! ./stemmablenote */ "./src/stemmablenote.ts"); +/* harmony import */ var _stringnumber__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(/*! ./stringnumber */ "./src/stringnumber.ts"); +/* harmony import */ var _strokes__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(/*! ./strokes */ "./src/strokes.ts"); +/* harmony import */ var _svgcontext__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(/*! ./svgcontext */ "./src/svgcontext.ts"); +/* harmony import */ var _system__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(/*! ./system */ "./src/system.ts"); +/* harmony import */ var _tabnote__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(/*! ./tabnote */ "./src/tabnote.ts"); +/* harmony import */ var _tabslide__WEBPACK_IMPORTED_MODULE_68__ = __webpack_require__(/*! ./tabslide */ "./src/tabslide.ts"); +/* harmony import */ var _tabstave__WEBPACK_IMPORTED_MODULE_69__ = __webpack_require__(/*! ./tabstave */ "./src/tabstave.ts"); +/* harmony import */ var _tabtie__WEBPACK_IMPORTED_MODULE_70__ = __webpack_require__(/*! ./tabtie */ "./src/tabtie.ts"); +/* harmony import */ var _textbracket__WEBPACK_IMPORTED_MODULE_71__ = __webpack_require__(/*! ./textbracket */ "./src/textbracket.ts"); +/* harmony import */ var _textdynamics__WEBPACK_IMPORTED_MODULE_72__ = __webpack_require__(/*! ./textdynamics */ "./src/textdynamics.ts"); +/* harmony import */ var _textformatter__WEBPACK_IMPORTED_MODULE_73__ = __webpack_require__(/*! ./textformatter */ "./src/textformatter.ts"); +/* harmony import */ var _textnote__WEBPACK_IMPORTED_MODULE_74__ = __webpack_require__(/*! ./textnote */ "./src/textnote.ts"); +/* harmony import */ var _tickable__WEBPACK_IMPORTED_MODULE_75__ = __webpack_require__(/*! ./tickable */ "./src/tickable.ts"); +/* harmony import */ var _tickcontext__WEBPACK_IMPORTED_MODULE_76__ = __webpack_require__(/*! ./tickcontext */ "./src/tickcontext.ts"); +/* harmony import */ var _timesigglyph__WEBPACK_IMPORTED_MODULE_77__ = __webpack_require__(/*! ./timesigglyph */ "./src/timesigglyph.ts"); +/* harmony import */ var _timesignature__WEBPACK_IMPORTED_MODULE_78__ = __webpack_require__(/*! ./timesignature */ "./src/timesignature.ts"); +/* harmony import */ var _timesignote__WEBPACK_IMPORTED_MODULE_79__ = __webpack_require__(/*! ./timesignote */ "./src/timesignote.ts"); +/* harmony import */ var _tremolo__WEBPACK_IMPORTED_MODULE_80__ = __webpack_require__(/*! ./tremolo */ "./src/tremolo.ts"); +/* harmony import */ var _tuning__WEBPACK_IMPORTED_MODULE_81__ = __webpack_require__(/*! ./tuning */ "./src/tuning.ts"); +/* harmony import */ var _tuplet__WEBPACK_IMPORTED_MODULE_82__ = __webpack_require__(/*! ./tuplet */ "./src/tuplet.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_83__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_84__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +/* harmony import */ var _vibrato__WEBPACK_IMPORTED_MODULE_85__ = __webpack_require__(/*! ./vibrato */ "./src/vibrato.ts"); +/* harmony import */ var _vibratobracket__WEBPACK_IMPORTED_MODULE_86__ = __webpack_require__(/*! ./vibratobracket */ "./src/vibratobracket.ts"); +/* harmony import */ var _voice__WEBPACK_IMPORTED_MODULE_87__ = __webpack_require__(/*! ./voice */ "./src/voice.ts"); +/* harmony import */ var _web__WEBPACK_IMPORTED_MODULE_88__ = __webpack_require__(/*! ./web */ "./src/web.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + + + + + + + + + + + + + + + + + +// Do not export './fonts/*' because they are used by the entry/* files. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// Do not export './tables' because it is internal. Its public API is accessible via Vex.Flow.*. + + + + + + + + + + + + + + + + + + +// Do not export './version'. It is accessible via Vex.Flow.VERSION & Vex.Flow.BUILD. + + + + +// Export Vex as a named export AND as a default export, to support both ways of importing. + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_vex__WEBPACK_IMPORTED_MODULE_0__.Vex); + + +/***/ }), + +/***/ "./src/keymanager.ts": +/*!***************************!*\ + !*** ./src/keymanager.ts ***! + \***************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "KeyManager": () => (/* binding */ KeyManager) +/* harmony export */ }); +/* harmony import */ var _music__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./music */ "./src/music.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// ## Description +// +// This class implements diatonic key management. + + +class KeyManager { + constructor(key) { + this.music = new _music__WEBPACK_IMPORTED_MODULE_0__.Music(); + this.setKey(key); + } + setKey(key) { + this.key = key; + this.reset(); + return this; + } + getKey() { + return this.key; + } + reset() { + this.keyParts = this.music.getKeyParts(this.key); + this.keyString = this.keyParts.root; + if (this.keyParts.accidental) + this.keyString += this.keyParts.accidental; + const is_supported_type = _music__WEBPACK_IMPORTED_MODULE_0__.Music.scaleTypes[this.keyParts.type]; + if (!is_supported_type) { + throw new _util__WEBPACK_IMPORTED_MODULE_1__.RuntimeError('BadArguments', `Unsupported key type: ${this.key}`); + } + this.scale = this.music.getScaleTones(this.music.getNoteValue(this.keyString), _music__WEBPACK_IMPORTED_MODULE_0__.Music.scaleTypes[this.keyParts.type]); + this.scaleMap = {}; + this.scaleMapByValue = {}; + this.originalScaleMapByValue = {}; + const noteLocation = _music__WEBPACK_IMPORTED_MODULE_0__.Music.root_indices[this.keyParts.root]; + for (let i = 0; i < _music__WEBPACK_IMPORTED_MODULE_0__.Music.roots.length; ++i) { + const index = (noteLocation + i) % _music__WEBPACK_IMPORTED_MODULE_0__.Music.roots.length; + const rootName = _music__WEBPACK_IMPORTED_MODULE_0__.Music.roots[index]; + const noteName = this.music.getRelativeNoteName(rootName, this.scale[i]); + this.scaleMap[rootName] = noteName; + this.scaleMapByValue[this.scale[i]] = noteName; + this.originalScaleMapByValue[this.scale[i]] = noteName; + } + return this; + } + getAccidental(key) { + const root = this.music.getKeyParts(key).root; + const parts = this.music.getNoteParts(this.scaleMap[root]); + return { + note: this.scaleMap[root], + accidental: parts.accidental, + }; + } + selectNote(note) { + note = note.toLowerCase(); + const parts = this.music.getNoteParts(note); + // First look for matching note in our altered scale + const scaleNote = this.scaleMap[parts.root]; + const modparts = this.music.getNoteParts(scaleNote); + if (scaleNote === note) { + return { + note: scaleNote, + accidental: parts.accidental, + change: false, + }; + } + // Then search for a note of equivalent value in our altered scale + const valueNote = this.scaleMapByValue[this.music.getNoteValue(note)]; + if (valueNote != null) { + return { + note: valueNote, + accidental: this.music.getNoteParts(valueNote).accidental, + change: false, + }; + } + // Then search for a note of equivalent value in the original scale + const originalValueNote = this.originalScaleMapByValue[this.music.getNoteValue(note)]; + if (originalValueNote != null) { + this.scaleMap[modparts.root] = originalValueNote; + delete this.scaleMapByValue[this.music.getNoteValue(scaleNote)]; + this.scaleMapByValue[this.music.getNoteValue(note)] = originalValueNote; + return { + note: originalValueNote, + accidental: this.music.getNoteParts(originalValueNote).accidental, + change: true, + }; + } + // Then try to unmodify a currently modified note. + if (modparts.root === note) { + delete this.scaleMapByValue[this.music.getNoteValue(this.scaleMap[parts.root])]; + this.scaleMapByValue[this.music.getNoteValue(modparts.root)] = modparts.root; + this.scaleMap[modparts.root] = modparts.root; + return { + note: modparts.root, + accidental: undefined, + change: true, + }; + } + // Last resort -- shitshoot + delete this.scaleMapByValue[this.music.getNoteValue(this.scaleMap[parts.root])]; + this.scaleMapByValue[this.music.getNoteValue(note)] = note; + delete this.scaleMap[modparts.root]; + this.scaleMap[modparts.root] = note; + return { + note, + accidental: parts.accidental, + change: true, + }; + } +} + + +/***/ }), + +/***/ "./src/keysignature.ts": +/*!*****************************!*\ + !*** ./src/keysignature.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "KeySignature": () => (/* binding */ KeySignature) +/* harmony export */ }); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _stavemodifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stavemodifier */ "./src/stavemodifier.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author: Cyril Silverman +// +// ## Description +// +// This file implements key signatures. A key signature sits on a stave +// and indicates the notes with implicit accidentals. + + + + + +class KeySignature extends _stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifier { + // Create a new Key Signature based on a `key_spec` + constructor(keySpec, cancelKeySpec, alterKeySpec) { + super(); + this.accList = []; + this.setKeySig(keySpec, cancelKeySpec, alterKeySpec); + this.setPosition(_stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifierPosition.BEGIN); + this.glyphFontScale = 38; // TODO(0xFE): Should this match StaveNote? + this.glyphs = []; + this.xPositions = []; // relative to this.x + this.paddingForced = false; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.KeySignature; + } + // Add an accidental glyph to the `KeySignature` instance which represents + // the provided `acc`. If `nextAcc` is also provided, the appropriate + // spacing will be included in the glyph's position + convertToGlyph(acc, nextAcc) { + const accGlyphData = _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.accidentalCodes(acc.type); + const glyph = new _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph(accGlyphData.code, this.glyphFontScale); + // Determine spacing between current accidental and the next accidental + let extraWidth = 1; + if (acc.type === 'n' && nextAcc) { + const spacing = KeySignature.accidentalSpacing[nextAcc.type]; + if (spacing) { + const isAbove = nextAcc.line >= acc.line; + extraWidth = isAbove ? spacing.above : spacing.below; + } + } + // Place the glyph on the stave + this.placeGlyphOnLine(glyph, this.checkStave(), acc.line); + this.glyphs.push(glyph); + const xPosition = this.xPositions[this.xPositions.length - 1]; + const glyphWidth = glyph.getMetrics().width + extraWidth; + // Store the next accidental's x position + this.xPositions.push(xPosition + glyphWidth); + // Expand size of key signature + this.width += glyphWidth; + } + // Cancel out a key signature provided in the `spec` parameter. This will + // place appropriate natural accidentals before the key signature. + cancelKey(spec) { + this.formatted = false; + this.cancelKeySpec = spec; + return this; + } + convertToCancelAccList(spec) { + // Get the accidental list for the cancelled key signature + const cancel_accList = _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.keySignature(spec); + // If the cancelled key has a different accidental type, ie: # vs b + const different_types = this.accList.length > 0 && cancel_accList.length > 0 && cancel_accList[0].type !== this.accList[0].type; + // Determine how many naturals needed to add + const naturals = different_types ? cancel_accList.length : cancel_accList.length - this.accList.length; + // Return if no naturals needed + if (naturals < 1) + return undefined; + // Get the line position for each natural + const cancelled = []; + for (let i = 0; i < naturals; i++) { + let index = i; + if (!different_types) { + index = cancel_accList.length - naturals + i; + } + const acc = cancel_accList[index]; + cancelled.push({ type: 'n', line: acc.line }); + } + // Combine naturals with main accidental list for the key signature + this.accList = cancelled.concat(this.accList); + return { + accList: cancelled, + type: cancel_accList[0].type, + }; + } + // Deprecated + addToStave(stave) { + this.paddingForced = true; + stave.addModifier(this); + return this; + } + // Apply the accidental staff line placement based on the `clef` and + // the accidental `type` for the key signature ('# or 'b'). + convertAccLines(clef, type, accList = this.accList) { + let offset = 0.0; // if clef === "treble" + let customLines; // when clef doesn't follow treble key sig shape + switch (clef) { + // Treble & Subbass both have offsets of 0, so are not included. + case 'soprano': + if (type === '#') + customLines = [2.5, 0.5, 2, 0, 1.5, -0.5, 1]; + else + offset = -1; + break; + case 'mezzo-soprano': + if (type === 'b') + customLines = [0, 2, 0.5, 2.5, 1, 3, 1.5]; + else + offset = 1.5; + break; + case 'alto': + offset = 0.5; + break; + case 'tenor': + if (type === '#') + customLines = [3, 1, 2.5, 0.5, 2, 0, 1.5]; + else + offset = -0.5; + break; + case 'baritone-f': + case 'baritone-c': + if (type === 'b') + customLines = [0.5, 2.5, 1, 3, 1.5, 3.5, 2]; + else + offset = 2; + break; + case 'bass': + case 'french': + offset = 1; + break; + default: + break; + } + // If there's a special case, assign those lines/spaces: + let i; + if (typeof customLines !== 'undefined') { + for (i = 0; i < accList.length; ++i) { + accList[i].line = customLines[i]; + } + } + else if (offset !== 0) { + for (i = 0; i < accList.length; ++i) { + accList[i].line += offset; + } + } + } + getPadding(index) { + if (!this.formatted) + this.format(); + return this.glyphs.length === 0 || (!this.paddingForced && index < 2) ? 0 : this.padding; + } + getWidth() { + if (!this.formatted) + this.format(); + return this.width; + } + setKeySig(keySpec, cancelKeySpec, alterKeySpec) { + this.formatted = false; + this.keySpec = keySpec; + this.cancelKeySpec = cancelKeySpec; + this.alterKeySpec = alterKeySpec; + return this; + } + // Alter the accidentals of a key spec one by one. + // Each alteration is a new accidental that replaces the + // original accidental (or the canceled one). + alterKey(alterKeySpec) { + this.formatted = false; + this.alterKeySpec = alterKeySpec; + return this; + } + convertToAlterAccList(alterKeySpec) { + const max = Math.min(alterKeySpec.length, this.accList.length); + for (let i = 0; i < max; ++i) { + if (alterKeySpec[i]) { + this.accList[i].type = alterKeySpec[i]; + } + } + } + format() { + const stave = this.checkStave(); + this.width = 0; + this.glyphs = []; + this.xPositions = [0]; // initialize with initial x position + this.accList = _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.keySignature((0,_util__WEBPACK_IMPORTED_MODULE_4__.defined)(this.keySpec)); + const accList = this.accList; + const firstAccidentalType = accList.length > 0 ? accList[0].type : undefined; + let cancelAccList; + if (this.cancelKeySpec) { + cancelAccList = this.convertToCancelAccList(this.cancelKeySpec); + } + if (this.alterKeySpec) { + this.convertToAlterAccList(this.alterKeySpec); + } + if (this.accList.length > 0) { + const clef = (this.position === _stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifierPosition.END ? stave.getEndClef() : stave.getClef()) || stave.getClef(); + if (cancelAccList) { + this.convertAccLines(clef, cancelAccList.type, cancelAccList.accList); + } + this.convertAccLines(clef, firstAccidentalType, accList); + for (let i = 0; i < this.accList.length; ++i) { + this.convertToGlyph(this.accList[i], this.accList[i + 1]); + } + } + this.formatted = true; + } + draw() { + const stave = this.checkStave(); + const ctx = stave.checkContext(); + if (!this.formatted) + this.format(); + this.setRendered(); + ctx.openGroup('keysignature', this.getAttribute('id')); + for (let i = 0; i < this.glyphs.length; i++) { + const glyph = this.glyphs[i]; + const x = this.x + this.xPositions[i]; + glyph.setStave(stave); + glyph.setContext(ctx); + glyph.renderToStave(x); + } + ctx.closeGroup(); + } +} +// Space between natural and following accidental depending +// on vertical position +KeySignature.accidentalSpacing = { + '#': { + above: 6, + below: 4, + }, + b: { + above: 4, + below: 7, + }, + n: { + above: 4, + below: 1, + }, + '##': { + above: 6, + below: 4, + }, + bb: { + above: 4, + below: 7, + }, + db: { + above: 4, + below: 7, + }, + d: { + above: 4, + below: 7, + }, + bbs: { + above: 4, + below: 7, + }, + '++': { + above: 6, + below: 4, + }, + '+': { + above: 6, + below: 4, + }, + '+-': { + above: 6, + below: 4, + }, + '++-': { + above: 6, + below: 4, + }, + bs: { + above: 4, + below: 10, + }, + bss: { + above: 4, + below: 10, + }, +}; + + +/***/ }), + +/***/ "./src/keysignote.ts": +/*!***************************!*\ + !*** ./src/keysignote.ts ***! + \***************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "KeySigNote": () => (/* binding */ KeySigNote) +/* harmony export */ }); +/* harmony import */ var _keysignature__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./keysignature */ "./src/keysignature.ts"); +/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./note */ "./src/note.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author Mark Meeus 2019 + + + +class KeySigNote extends _note__WEBPACK_IMPORTED_MODULE_1__.Note { + constructor(keySpec, cancelKeySpec, alterKeySpec) { + super({ duration: 'b' }); + this.keySignature = new _keysignature__WEBPACK_IMPORTED_MODULE_0__.KeySignature(keySpec, cancelKeySpec, alterKeySpec); + // Note properties + this.ignore_ticks = true; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_2__.Category.KeySigNote; + } + /* Overridden to ignore */ + // eslint-disable-next-line + addToModifierContext(mc) { + // DO NOTHING. + return this; + } + preFormat() { + this.preFormatted = true; + this.keySignature.setStave(this.checkStave()); + this.setWidth(this.keySignature.getWidth()); + return this; + } + draw() { + const ctx = this.checkStave().checkContext(); + this.setRendered(); + this.keySignature.setX(this.getAbsoluteX()); + this.keySignature.setContext(ctx); + this.keySignature.draw(); + } +} + + +/***/ }), + +/***/ "./src/modifier.ts": +/*!*************************!*\ + !*** ./src/modifier.ts ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ModifierPosition": () => (/* binding */ ModifierPosition), +/* harmony export */ "Modifier": () => (/* binding */ Modifier) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + +var ModifierPosition; +(function (ModifierPosition) { + ModifierPosition[ModifierPosition["CENTER"] = 0] = "CENTER"; + ModifierPosition[ModifierPosition["LEFT"] = 1] = "LEFT"; + ModifierPosition[ModifierPosition["RIGHT"] = 2] = "RIGHT"; + ModifierPosition[ModifierPosition["ABOVE"] = 3] = "ABOVE"; + ModifierPosition[ModifierPosition["BELOW"] = 4] = "BELOW"; +})(ModifierPosition || (ModifierPosition = {})); +// To enable logging for this class. Set `Vex.Flow.Modifier.DEBUG` to `true`. +// function L(...args) { if (Modifier.DEBUG) log('Vex.Flow.Modifier', args); } +/** + * `Modifier` is an abstract interface for notational elements that modify + * a `Note`. Examples of modifiers are `Accidental`, `Annotation`, `Stroke`, etc. + * + * For a `Modifier` instance to be positioned correctly, it must be part of + * a `ModifierContext`. All modifiers in the same context are rendered relative to + * one another. + * + * Typically, all modifiers to a note are part of the same `ModifierContext` instance. Also, + * in multi-voice staves, all modifiers to notes on the same `tick` are part of the same + * `ModifierContext`. This ensures that multiple voices don't trample all over each other. + */ +class Modifier extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + constructor() { + super(); + this.width = 0; + // The `text_line` is reserved space above or below a stave. + this.text_line = 0; + this.position = Modifier.Position.LEFT; + this.x_shift = 0; + this.y_shift = 0; + this.spacingFromNextModifier = 0; + } + /** + * Modifiers category string. Every modifier has a different category. + * The `ModifierContext` uses this to determine the type and order of the modifiers. + */ + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_1__.Category.Modifier; + } + /** Modifiers can be positioned almost anywhere, relative to a note. */ + static get Position() { + return ModifierPosition; + } + static get PositionString() { + return { + center: ModifierPosition.CENTER, + above: ModifierPosition.ABOVE, + below: ModifierPosition.BELOW, + left: ModifierPosition.LEFT, + right: ModifierPosition.RIGHT, + }; + } + /** Called when position changes. */ + reset() { + // DO NOTHING. + } + /** Get modifier widths. */ + getWidth() { + return this.width; + } + /** Set modifier widths. */ + setWidth(width) { + this.width = width; + return this; + } + /** Get attached note (`StaveNote`, `TabNote`, etc.) */ + getNote() { + return (0,_util__WEBPACK_IMPORTED_MODULE_2__.defined)(this.note, 'NoNote', 'Modifier has no note.'); + } + /** + * Used in draw() to check and get the attached note (`StaveNote`, `TabNote`, etc.). + * Also verifies that the index is valid. + */ + checkAttachedNote() { + const category = this.getCategory(); + (0,_util__WEBPACK_IMPORTED_MODULE_2__.defined)(this.index, 'NoIndex', `Can't draw ${category} without an index.`); + return (0,_util__WEBPACK_IMPORTED_MODULE_2__.defined)(this.note, 'NoNote', `Can't draw ${category} without a note.`); + } + /** + * Set attached note. + * @param note (`StaveNote`, `TabNote`, etc.) + */ + setNote(note) { + this.note = note; + return this; + } + /** Get note index, which is a specific note in a chord. */ + getIndex() { + return this.index; + } + /** Check and get note index, which is a specific note in a chord. */ + checkIndex() { + return (0,_util__WEBPACK_IMPORTED_MODULE_2__.defined)(this.index, 'NoIndex', 'Modifier has an invalid index.'); + } + /** Set note index, which is a specific note in a chord. */ + setIndex(index) { + this.index = index; + return this; + } + /** Get `ModifierContext`. */ + getModifierContext() { + return this.modifierContext; + } + /** Check and get `ModifierContext`. */ + checkModifierContext() { + return (0,_util__WEBPACK_IMPORTED_MODULE_2__.defined)(this.modifierContext, 'NoModifierContext', 'Modifier Context Required'); + } + /** Every modifier must be part of a `ModifierContext`. */ + setModifierContext(c) { + this.modifierContext = c; + return this; + } + /** Get position. */ + getPosition() { + return this.position; + } + /** + * Set position. + * @param position CENTER | LEFT | RIGHT | ABOVE | BELOW + */ + setPosition(position) { + this.position = typeof position === 'string' ? Modifier.PositionString[position] : position; + this.reset(); + return this; + } + /** Set the `text_line` for the modifier. */ + setTextLine(line) { + this.text_line = line; + return this; + } + /** Shift modifier down `y` pixels. Negative values shift up. */ + setYShift(y) { + this.y_shift = y; + return this; + } + /** Set spacing from next modifier. */ + setSpacingFromNextModifier(x) { + this.spacingFromNextModifier = x; + } + /** Get spacing from next modifier. */ + getSpacingFromNextModifier() { + return this.spacingFromNextModifier; + } + /** + * Shift modifier `x` pixels in the direction of the modifier. Negative values + * shift reverse. + */ + setXShift(x) { + this.x_shift = 0; + if (this.position === Modifier.Position.LEFT) { + this.x_shift -= x; + } + else { + this.x_shift += x; + } + return this; + } + /** Get shift modifier `x` */ + getXShift() { + return this.x_shift; + } + /** Render the modifier onto the canvas. */ + draw() { + this.checkContext(); + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('NotImplemented', 'draw() not implemented for this modifier.'); + } + // aligns sub notes of NoteSubGroup (or GraceNoteGroup) to the main note with correct x-offset + alignSubNotesWithNote(subNotes, note) { + // Shift over the tick contexts of each note + const tickContext = note.getTickContext(); + const metrics = tickContext.getMetrics(); + const stave = note.getStave(); + const subNoteXOffset = tickContext.getX() - metrics.modLeftPx - metrics.modRightPx + this.getSpacingFromNextModifier(); + subNotes.forEach((subNote) => { + const subTickContext = subNote.getTickContext(); + if (stave) + subNote.setStave(stave); + subTickContext.setXOffset(subNoteXOffset); // don't touch baseX to avoid shift each render + }); + } +} + + +/***/ }), + +/***/ "./src/modifiercontext.ts": +/*!********************************!*\ + !*** ./src/modifiercontext.ts ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ModifierContext": () => (/* binding */ ModifierContext) +/* harmony export */ }); +/* harmony import */ var _accidental__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./accidental */ "./src/accidental.ts"); +/* harmony import */ var _annotation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./annotation */ "./src/annotation.ts"); +/* harmony import */ var _articulation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./articulation */ "./src/articulation.ts"); +/* harmony import */ var _bend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./bend */ "./src/bend.ts"); +/* harmony import */ var _chordsymbol__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./chordsymbol */ "./src/chordsymbol.ts"); +/* harmony import */ var _dot__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./dot */ "./src/dot.ts"); +/* harmony import */ var _frethandfinger__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./frethandfinger */ "./src/frethandfinger.ts"); +/* harmony import */ var _gracenotegroup__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./gracenotegroup */ "./src/gracenotegroup.ts"); +/* harmony import */ var _notesubgroup__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./notesubgroup */ "./src/notesubgroup.ts"); +/* harmony import */ var _ornament__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./ornament */ "./src/ornament.ts"); +/* harmony import */ var _parenthesis__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./parenthesis */ "./src/parenthesis.ts"); +/* harmony import */ var _stavenote__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./stavenote */ "./src/stavenote.ts"); +/* harmony import */ var _stringnumber__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./stringnumber */ "./src/stringnumber.ts"); +/* harmony import */ var _strokes__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./strokes */ "./src/strokes.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +/* harmony import */ var _vibrato__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./vibrato */ "./src/vibrato.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// ## Description +// +// This class implements various types of members to notes (e.g. bends, +// fingering positions etc.) + + + + + + + + + + + + + + + + + +// To enable logging for this class. Set `Vex.Flow.ModifierContext.DEBUG` to `true`. +// eslint-disable-next-line +function L(...args) { + if (ModifierContext.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_15__.log)('Vex.Flow.ModifierContext', args); +} +class ModifierContext { + constructor() { + // Formatting data. + this.state = { + left_shift: 0, + right_shift: 0, + text_line: 0, + top_text_line: 0, + }; + // Current members + this.members = {}; + this.preFormatted = false; + this.postFormatted = false; + this.formatted = false; + this.width = 0; + this.spacing = 0; + } + addModifier(member) { + L('addModifier is deprecated, use addMember instead.'); + return this.addMember(member); + } + /** + * this.members maps CATEGORY strings to arrays of Tickable | Modifier | StaveNote | TabNote. + * Here we add a new member to this.members, and create a new array if needed. + * @param member + * @returns this + */ + addMember(member) { + const category = member.getCategory(); + if (!this.members[category]) { + this.members[category] = []; + } + this.members[category].push(member); + member.setModifierContext(this); + this.preFormatted = false; + return this; + } + /** + * @deprecated + */ + getModifiers(category) { + L('getModifiers is deprecated, use getMembers instead.'); + return this.getMembers(category); + } + getMembers(category) { + var _a; + return (_a = this.members[category]) !== null && _a !== void 0 ? _a : []; + } + getWidth() { + return this.width; + } + getLeftShift() { + return this.state.left_shift; + } + getRightShift() { + return this.state.right_shift; + } + getState() { + return this.state; + } + getMetrics() { + if (!this.formatted) { + throw new _util__WEBPACK_IMPORTED_MODULE_15__.RuntimeError('UnformattedMember', 'Unformatted member has no metrics.'); + } + return { + width: this.state.left_shift + this.state.right_shift + this.spacing, + spacing: this.spacing, + }; + } + preFormat() { + if (this.preFormatted) + return; + L('Preformatting ModifierContext'); + const state = this.state; + const members = this.members; + // The ordering below determines when different members are formatted and rendered. + _stavenote__WEBPACK_IMPORTED_MODULE_11__.StaveNote.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.StaveNote], state); + _parenthesis__WEBPACK_IMPORTED_MODULE_10__.Parenthesis.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.Parenthesis], state); + _dot__WEBPACK_IMPORTED_MODULE_5__.Dot.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.Dot], state); + _frethandfinger__WEBPACK_IMPORTED_MODULE_6__.FretHandFinger.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.FretHandFinger], state); + _accidental__WEBPACK_IMPORTED_MODULE_0__.Accidental.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.Accidental], state); + _strokes__WEBPACK_IMPORTED_MODULE_13__.Stroke.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.Stroke], state); + _gracenotegroup__WEBPACK_IMPORTED_MODULE_7__.GraceNoteGroup.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.GraceNoteGroup], state); + _notesubgroup__WEBPACK_IMPORTED_MODULE_8__.NoteSubGroup.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.NoteSubGroup], state); + _stringnumber__WEBPACK_IMPORTED_MODULE_12__.StringNumber.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.StringNumber], state); + _articulation__WEBPACK_IMPORTED_MODULE_2__.Articulation.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.Articulation], state); + _ornament__WEBPACK_IMPORTED_MODULE_9__.Ornament.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.Ornament], state); + _annotation__WEBPACK_IMPORTED_MODULE_1__.Annotation.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.Annotation], state); + _chordsymbol__WEBPACK_IMPORTED_MODULE_4__.ChordSymbol.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.ChordSymbol], state); + _bend__WEBPACK_IMPORTED_MODULE_3__.Bend.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.Bend], state); + _vibrato__WEBPACK_IMPORTED_MODULE_16__.Vibrato.format(members[_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.Vibrato], state, this); + // Update width of this member context + this.width = state.left_shift + state.right_shift; + this.preFormatted = true; + } + postFormat() { + if (this.postFormatted) + return; + L('Postformatting ModifierContext'); + // If post-formatting is required for an element, add more lines below. + _stavenote__WEBPACK_IMPORTED_MODULE_11__.StaveNote.postFormat(this.getMembers(_typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.StaveNote)); + } +} +ModifierContext.DEBUG = false; + + +/***/ }), + +/***/ "./src/multimeasurerest.ts": +/*!*********************************!*\ + !*** ./src/multimeasurerest.ts ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "MultiMeasureRest": () => (/* binding */ MultiMeasureRest) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _notehead__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./notehead */ "./src/notehead.ts"); +/* harmony import */ var _stavemodifier__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./stavemodifier */ "./src/stavemodifier.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _timesignature__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./timesignature */ "./src/timesignature.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// VexFlow - Music Engraving for HTML5 +// Copyright Mohit Muthanna 2010 +// +// This class implements multiple measure rests. + + + + + + + + +let semibreve_rest; +function get_semibreve_rest() { + if (!semibreve_rest) { + const noteHead = new _notehead__WEBPACK_IMPORTED_MODULE_2__.NoteHead({ duration: 'w', note_type: 'r' }); + semibreve_rest = { + glyph_font_scale: noteHead.render_options.glyph_font_scale, + glyph_code: noteHead.glyph_code, + width: noteHead.getWidth(), + }; + } + return semibreve_rest; +} +class MultiMeasureRest extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + /** + * + * @param number_of_measures Number of measures. + * @param options The options object. + */ + constructor(number_of_measures, options) { + super(); + this.xs = { left: NaN, right: NaN }; + this.hasPaddingLeft = false; + this.hasPaddingRight = false; + this.hasLineThickness = false; + this.hasSymbolSpacing = false; + this.number_of_measures = number_of_measures; + // Keep track of whether these four options were provided. + this.hasPaddingLeft = typeof options.padding_left === 'number'; + this.hasPaddingRight = typeof options.padding_right === 'number'; + this.hasLineThickness = typeof options.line_thickness === 'number'; + this.hasSymbolSpacing = typeof options.symbol_spacing === 'number'; + const musicFont = _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.currentMusicFont(); + this.render_options = Object.assign({ use_symbols: false, show_number: true, number_line: -0.5, number_glyph_point: musicFont.lookupMetric('digits.point'), line: 2, spacing_between_lines_px: _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.STAVE_LINE_DISTANCE, serif_thickness: 2, semibreve_rest_glyph_scale: _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.NOTATION_FONT_SCALE, padding_left: 0, padding_right: 0, line_thickness: 5, symbol_spacing: 0 }, options); + const fontLineShift = musicFont.lookupMetric('digits.shiftLine', 0); + this.render_options.number_line += fontLineShift; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_6__.Category.MultiMeasureRest; + } + getXs() { + return this.xs; + } + setStave(stave) { + this.stave = stave; + return this; + } + getStave() { + return this.stave; + } + checkStave() { + return (0,_util__WEBPACK_IMPORTED_MODULE_7__.defined)(this.stave, 'NoStave', 'No stave attached to instance.'); + } + drawLine(stave, ctx, left, right, spacingBetweenLines) { + const options = this.render_options; + const y = stave.getYForLine(options.line); + const padding = (right - left) * 0.1; + left += padding; + right -= padding; + let lineThicknessHalf; + if (this.hasLineThickness) { + lineThicknessHalf = options.line_thickness * 0.5; + } + else { + lineThicknessHalf = spacingBetweenLines * 0.25; + } + const serifThickness = options.serif_thickness; + const top = y - spacingBetweenLines; + const bot = y + spacingBetweenLines; + const leftIndented = left + serifThickness; + const rightIndented = right - serifThickness; + const lineTop = y - lineThicknessHalf; + const lineBottom = y + lineThicknessHalf; + ctx.save(); + ctx.beginPath(); + ctx.moveTo(left, top); + ctx.lineTo(leftIndented, top); + ctx.lineTo(leftIndented, lineTop); + ctx.lineTo(rightIndented, lineTop); + ctx.lineTo(rightIndented, top); + ctx.lineTo(right, top); + ctx.lineTo(right, bot); + ctx.lineTo(rightIndented, bot); + ctx.lineTo(rightIndented, lineBottom); + ctx.lineTo(leftIndented, lineBottom); + ctx.lineTo(leftIndented, bot); + ctx.lineTo(left, bot); + ctx.closePath(); + ctx.fill(); + } + drawSymbols(stave, ctx, left, right, spacingBetweenLines) { + const n4 = Math.floor(this.number_of_measures / 4); + const n = this.number_of_measures % 4; + const n2 = Math.floor(n / 2); + const n1 = n % 2; + const options = this.render_options; + // FIXME: TODO: invalidate semibreve_rest at the appropriate time + // (e.g., if the system font settings are changed). + semibreve_rest = undefined; + const rest = get_semibreve_rest(); + const rest_scale = options.semibreve_rest_glyph_scale; + const rest_width = rest.width * (rest_scale / rest.glyph_font_scale); + const glyphs = { + 2: { + width: rest_width * 0.5, + height: spacingBetweenLines, + }, + 1: { + width: rest_width, + }, + }; + /* 10: normal spacingBetweenLines */ + const spacing = this.hasSymbolSpacing ? options.symbol_spacing : 10; + const width = n4 * glyphs[2].width + n2 * glyphs[2].width + n1 * glyphs[1].width + (n4 + n2 + n1 - 1) * spacing; + let x = left + (right - left) * 0.5 - width * 0.5; + const line = options.line; + const yTop = stave.getYForLine(line - 1); + const yMiddle = stave.getYForLine(line); + const yBottom = stave.getYForLine(line + 1); + ctx.save(); + ctx.setStrokeStyle('none'); + ctx.setLineWidth(0); + for (let i = 0; i < n4; ++i) { + ctx.fillRect(x, yMiddle - glyphs[2].height, glyphs[2].width, glyphs[2].height); + ctx.fillRect(x, yBottom - glyphs[2].height, glyphs[2].width, glyphs[2].height); + x += glyphs[2].width + spacing; + } + for (let i = 0; i < n2; ++i) { + ctx.fillRect(x, yMiddle - glyphs[2].height, glyphs[2].width, glyphs[2].height); + x += glyphs[2].width + spacing; + } + for (let i = 0; i < n1; ++i) { + _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.renderGlyph(ctx, x, yTop, rest_scale, rest.glyph_code); + x += glyphs[1].width + spacing; + } + ctx.restore(); + } + draw() { + const ctx = this.checkContext(); + this.setRendered(); + const stave = this.checkStave(); + let left = stave.getNoteStartX(); + let right = stave.getNoteEndX(); + // FIXME: getNoteStartX() returns x + 5(barline width) + // getNoteEndX() returns x + width(no barline width) + // See Stave constructor. How do we fix this? + // Here, we subtract the barline width. + const begModifiers = stave.getModifiers(_stavemodifier__WEBPACK_IMPORTED_MODULE_3__.StaveModifierPosition.BEGIN); + if (begModifiers.length === 1 && (0,_typeguard__WEBPACK_IMPORTED_MODULE_6__.isBarline)(begModifiers[0])) { + left -= begModifiers[0].getWidth(); + } + const options = this.render_options; + if (this.hasPaddingLeft) { + left = stave.getX() + options.padding_left; + } + if (this.hasPaddingRight) { + right = stave.getX() + stave.getWidth() - options.padding_right; + } + this.xs.left = left; + this.xs.right = right; + const spacingBetweenLines = options.spacing_between_lines_px; + if (options.use_symbols) { + this.drawSymbols(stave, ctx, left, right, spacingBetweenLines); + } + else { + this.drawLine(stave, ctx, left, right, spacingBetweenLines); + } + if (options.show_number) { + const timeSpec = '/' + this.number_of_measures; + const timeSig = new _timesignature__WEBPACK_IMPORTED_MODULE_5__.TimeSignature(timeSpec, 0, false); + timeSig.point = options.number_glyph_point; + timeSig.setTimeSig(timeSpec); + timeSig.setStave(stave); + timeSig.setX(left + (right - left) * 0.5 - timeSig.getInfo().glyph.getMetrics().width * 0.5); + timeSig.bottomLine = options.number_line; + timeSig.setContext(ctx).draw(); + } + } +} + + +/***/ }), + +/***/ "./src/music.ts": +/*!**********************!*\ + !*** ./src/music.ts ***! + \**********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Music": () => (/* binding */ Music) +/* harmony export */ }); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + +/** Music implements some standard music theory routines. */ +class Music { + /** Number of an canonical notes (12). */ + static get NUM_TONES() { + return this.canonical_notes.length; + } + /** Names of root notes ('c', 'd',...) */ + static get roots() { + return ['c', 'd', 'e', 'f', 'g', 'a', 'b']; + } + /** Values of the root notes.*/ + static get root_values() { + return [0, 2, 4, 5, 7, 9, 11]; + } + /** Indices of the root notes.*/ + static get root_indices() { + return { + c: 0, + d: 1, + e: 2, + f: 3, + g: 4, + a: 5, + b: 6, + }; + } + /** Names of canonical notes ('c', 'c#', 'd',...). */ + static get canonical_notes() { + return ['c', 'c#', 'd', 'd#', 'e', 'f', 'f#', 'g', 'g#', 'a', 'a#', 'b']; + } + /** Names of diatonic intervals ('unison', 'm2', 'M2',...). */ + static get diatonic_intervals() { + return ['unison', 'm2', 'M2', 'm3', 'M3', 'p4', 'dim5', 'p5', 'm6', 'M6', 'b7', 'M7', 'octave']; + } + /** NoteAccidental associated to diatonic intervals. */ + static get diatonic_accidentals() { + return { + unison: { note: 0, accidental: 0 }, + m2: { note: 1, accidental: -1 }, + M2: { note: 1, accidental: 0 }, + m3: { note: 2, accidental: -1 }, + M3: { note: 2, accidental: 0 }, + p4: { note: 3, accidental: 0 }, + dim5: { note: 4, accidental: -1 }, + p5: { note: 4, accidental: 0 }, + m6: { note: 5, accidental: -1 }, + M6: { note: 5, accidental: 0 }, + b7: { note: 6, accidental: -1 }, + M7: { note: 6, accidental: 0 }, + octave: { note: 7, accidental: 0 }, + }; + } + /** Semitones shift associated to intervals .*/ + static get intervals() { + return { + u: 0, + unison: 0, + m2: 1, + b2: 1, + min2: 1, + S: 1, + H: 1, + 2: 2, + M2: 2, + maj2: 2, + T: 2, + W: 2, + m3: 3, + b3: 3, + min3: 3, + M3: 4, + 3: 4, + maj3: 4, + 4: 5, + p4: 5, + '#4': 6, + b5: 6, + aug4: 6, + dim5: 6, + 5: 7, + p5: 7, + '#5': 8, + b6: 8, + aug5: 8, + 6: 9, + M6: 9, + maj6: 9, + b7: 10, + m7: 10, + min7: 10, + dom7: 10, + M7: 11, + maj7: 11, + 8: 12, + octave: 12, + }; + } + /** Semitones shifts associated with scales. */ + static get scales() { + return { + major: [2, 2, 1, 2, 2, 2, 1], + minor: [2, 1, 2, 2, 1, 2, 2], + ionian: [2, 2, 1, 2, 2, 2, 1], + dorian: [2, 1, 2, 2, 2, 1, 2], + phyrgian: [1, 2, 2, 2, 1, 2, 2], + lydian: [2, 2, 2, 1, 2, 2, 1], + mixolydian: [2, 2, 1, 2, 2, 1, 2], + aeolian: [2, 1, 2, 2, 1, 2, 2], + locrian: [1, 2, 2, 1, 2, 2, 2], + }; + } + /** Scales associated with m (minor) and M (major). */ + static get scaleTypes() { + return { + M: Music.scales.major, + m: Music.scales.minor, + }; + } + /** Accidentals abbreviations. */ + static get accidentals() { + return ['bb', 'b', 'n', '#', '##']; + } + /** Note values. */ + static get noteValues() { + return { + c: { root_index: 0, int_val: 0 }, + cn: { root_index: 0, int_val: 0 }, + 'c#': { root_index: 0, int_val: 1 }, + 'c##': { root_index: 0, int_val: 2 }, + cb: { root_index: 0, int_val: 11 }, + cbb: { root_index: 0, int_val: 10 }, + d: { root_index: 1, int_val: 2 }, + dn: { root_index: 1, int_val: 2 }, + 'd#': { root_index: 1, int_val: 3 }, + 'd##': { root_index: 1, int_val: 4 }, + db: { root_index: 1, int_val: 1 }, + dbb: { root_index: 1, int_val: 0 }, + e: { root_index: 2, int_val: 4 }, + en: { root_index: 2, int_val: 4 }, + 'e#': { root_index: 2, int_val: 5 }, + 'e##': { root_index: 2, int_val: 6 }, + eb: { root_index: 2, int_val: 3 }, + ebb: { root_index: 2, int_val: 2 }, + f: { root_index: 3, int_val: 5 }, + fn: { root_index: 3, int_val: 5 }, + 'f#': { root_index: 3, int_val: 6 }, + 'f##': { root_index: 3, int_val: 7 }, + fb: { root_index: 3, int_val: 4 }, + fbb: { root_index: 3, int_val: 3 }, + g: { root_index: 4, int_val: 7 }, + gn: { root_index: 4, int_val: 7 }, + 'g#': { root_index: 4, int_val: 8 }, + 'g##': { root_index: 4, int_val: 9 }, + gb: { root_index: 4, int_val: 6 }, + gbb: { root_index: 4, int_val: 5 }, + a: { root_index: 5, int_val: 9 }, + an: { root_index: 5, int_val: 9 }, + 'a#': { root_index: 5, int_val: 10 }, + 'a##': { root_index: 5, int_val: 11 }, + ab: { root_index: 5, int_val: 8 }, + abb: { root_index: 5, int_val: 7 }, + b: { root_index: 6, int_val: 11 }, + bn: { root_index: 6, int_val: 11 }, + 'b#': { root_index: 6, int_val: 0 }, + 'b##': { root_index: 6, int_val: 1 }, + bb: { root_index: 6, int_val: 10 }, + bbb: { root_index: 6, int_val: 9 }, + }; + } + isValidNoteValue(note) { + return note >= 0 && note < Music.canonical_notes.length; + } + isValidIntervalValue(interval) { + return interval >= 0 && interval < Music.diatonic_intervals.length; + } + /** Return root and accidental associated to a note. */ + getNoteParts(noteString) { + if (!noteString || noteString.length < 1) { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', 'Invalid note name: ' + noteString); + } + if (noteString.length > 3) { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', 'Invalid note name: ' + noteString); + } + const note = noteString.toLowerCase(); + const regex = /^([cdefgab])(b|bb|n|#|##)?$/; + const match = regex.exec(note); + if (match !== null) { + const root = match[1]; + const accidental = match[2]; + return { + root, + accidental, + }; + } + else { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', 'Invalid note name: ' + noteString); + } + } + /** Return root, accidental and type associated to a key. */ + getKeyParts(keyString) { + if (!keyString || keyString.length < 1) { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', 'Invalid key: ' + keyString); + } + const key = keyString.toLowerCase(); + // Support Major, Minor, Melodic Minor, and Harmonic Minor key types. + const regex = /^([cdefgab])(b|#)?(mel|harm|m|M)?$/; + const match = regex.exec(key); + if (match !== null) { + const root = match[1]; + const accidental = match[2]; + let type = match[3]; + // Unspecified type implies major + if (!type) + type = 'M'; + return { + root, + accidental, + type, + }; + } + else { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', `Invalid key: ${keyString}`); + } + } + /** Note value associated to a note name. */ + getNoteValue(noteString) { + const value = Music.noteValues[noteString]; + if (value === undefined) { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', `Invalid note name: ${noteString}`); + } + return value.int_val; + } + /** Interval value associated to an interval name. */ + getIntervalValue(intervalString) { + const value = Music.intervals[intervalString]; + if (value === undefined) { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', `Invalid interval name: ${intervalString}`); + } + return value; + } + /** Canonical note name associated to a value. */ + getCanonicalNoteName(noteValue) { + if (!this.isValidNoteValue(noteValue)) { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', `Invalid note value: ${noteValue}`); + } + return Music.canonical_notes[noteValue]; + } + /** Interval name associated to a value. */ + getCanonicalIntervalName(intervalValue) { + if (!this.isValidIntervalValue(intervalValue)) { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', `Invalid interval value: ${intervalValue}`); + } + return Music.diatonic_intervals[intervalValue]; + } + /** + * Given a note, interval, and interval direction, produce the relative note. + */ + getRelativeNoteValue(noteValue, intervalValue, direction = 1) { + if (direction !== 1 && direction !== -1) { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', `Invalid direction: ${direction}`); + } + let sum = (noteValue + direction * intervalValue) % Music.NUM_TONES; + if (sum < 0) + sum += Music.NUM_TONES; + return sum; + } + /** + * Given a root and note value, produce the relative note name. + */ + getRelativeNoteName(root, noteValue) { + const parts = this.getNoteParts(root); + const rootValue = this.getNoteValue(parts.root); + let interval = noteValue - rootValue; + if (Math.abs(interval) > Music.NUM_TONES - 3) { + let multiplier = 1; + if (interval > 0) + multiplier = -1; + // Possibly wrap around. (Add +1 for modulo operator) + const reverse_interval = ((noteValue + 1 + (rootValue + 1)) % Music.NUM_TONES) * multiplier; + if (Math.abs(reverse_interval) > 2) { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', `Notes not related: ${root}, ${noteValue})`); + } + else { + interval = reverse_interval; + } + } + if (Math.abs(interval) > 2) { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', `Notes not related: ${root}, ${noteValue})`); + } + let relativeNoteName = parts.root; + if (interval > 0) { + for (let i = 1; i <= interval; ++i) { + relativeNoteName += '#'; + } + } + else if (interval < 0) { + for (let i = -1; i >= interval; --i) { + relativeNoteName += 'b'; + } + } + return relativeNoteName; + } + /** + * Return scale tones, given intervals. Each successive interval is + * relative to the previous one, e.g., Major Scale: + * + * TTSTTTS = [2,2,1,2,2,2,1] + * + * When used with key = 0, returns C scale (which is isomorphic to + * interval list). + */ + getScaleTones(key, intervals) { + const tones = [key]; + let nextNote = key; + for (let i = 0; i < intervals.length; i++) { + nextNote = this.getRelativeNoteValue(nextNote, intervals[i]); + if (nextNote !== key) + tones.push(nextNote); + } + return tones; + } + /** + * Return the interval of a note, given a diatonic scale. + * e.g., given the scale C, and the note E, returns M3. + */ + getIntervalBetween(note1, note2, direction = 1) { + if (direction !== 1 && direction !== -1) { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', `Invalid direction: ${direction}`); + } + if (!this.isValidNoteValue(note1) || !this.isValidNoteValue(note2)) { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', `Invalid notes: ${note1}, ${note2}`); + } + let difference = direction === 1 ? note2 - note1 : note1 - note2; + if (difference < 0) + difference += Music.NUM_TONES; + return difference; + } + /** + * Create a scale map that represents the pitch state for a + * `keySignature`. For example, passing a `G` to `keySignature` would + * return a scale map with every note naturalized except for `F` which + * has an `F#` state. + */ + createScaleMap(keySignature) { + const keySigParts = this.getKeyParts(keySignature); + if (!keySigParts.type) + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', 'Unsupported key type: undefined'); + const scaleName = Music.scaleTypes[keySigParts.type]; + let keySigString = keySigParts.root; + if (keySigParts.accidental) + keySigString += keySigParts.accidental; + if (!scaleName) + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('BadArguments', 'Unsupported key type: ' + keySignature); + const scale = this.getScaleTones(this.getNoteValue(keySigString), scaleName); + const noteLocation = Music.root_indices[keySigParts.root]; + const scaleMap = {}; + for (let i = 0; i < Music.roots.length; ++i) { + const index = (noteLocation + i) % Music.roots.length; + const rootName = Music.roots[index]; + let noteName = this.getRelativeNoteName(rootName, scale[i]); + if (noteName.length === 1) { + noteName += 'n'; + } + scaleMap[rootName] = noteName; + } + return scaleMap; + } +} + + +/***/ }), + +/***/ "./src/note.ts": +/*!*********************!*\ + !*** ./src/note.ts ***! + \*********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Note": () => (/* binding */ Note) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _rendercontext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./rendercontext */ "./src/rendercontext.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _tickable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tickable */ "./src/tickable.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + + +/** + * Note implements an abstract interface for notes and chords that + * are rendered on a stave. Notes have some common properties: All of them + * have a value (e.g., pitch, fret, etc.) and a duration (quarter, half, etc.) + * + * Some notes have stems, heads, dots, etc. Most notational elements that + * surround a note are called *modifiers*, and every note has an associated + * array of them. All notes also have a rendering context and belong to a stave. + */ +class Note extends _tickable__WEBPACK_IMPORTED_MODULE_3__.Tickable { + /** + * Every note is a tickable, i.e., it can be mutated by the `Formatter` class for + * positioning and layout. + * + * @param noteStruct To create a new note you need to provide a `noteStruct`. + */ + constructor(noteStruct) { + super(); + if (!noteStruct) { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('BadArguments', 'Note must have valid initialization data to identify duration and type.'); + } + /** Parses `noteStruct` and get note properties. */ + const parsedNoteStruct = Note.parseNoteStruct(noteStruct); + if (!parsedNoteStruct) { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('BadArguments', `Invalid note initialization object: ${JSON.stringify(noteStruct)}`); + } + // Set note properties from parameters. + this.keys = noteStruct.keys || []; + // per-pitch properties + this.keyProps = []; + this.duration = parsedNoteStruct.duration; + this.noteType = parsedNoteStruct.type; + this.customTypes = parsedNoteStruct.customTypes; + if (noteStruct.duration_override) { + // Custom duration + this.setDuration(noteStruct.duration_override); + } + else { + // Default duration + this.setIntrinsicTicks(parsedNoteStruct.ticks); + } + this.modifiers = []; + // Get the glyph code for this note from the font. + this.glyph = _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.getGlyphProps(this.duration, this.noteType); + this.customGlyphs = this.customTypes.map((t) => _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.getGlyphProps(this.duration, t)); + // Note to play for audio players. + this.playNote = undefined; + // Positioning contexts used by the Formatter. + this.ignore_ticks = false; + // Positioning variables + this.width = 0; // Width in pixels calculated after preFormat + this.leftDisplacedHeadPx = 0; // Extra room on left for displaced note head + this.rightDisplacedHeadPx = 0; // Extra room on right for displaced note head + this.x_shift = 0; // X shift from tick context X + this.ys = []; // list of y coordinates for each note + // we need to hold on to these for ties and beams. + if (noteStruct.align_center) { + this.setCenterAlignment(noteStruct.align_center); + } + // The render surface. + this.render_options = { + annotation_spacing: 5, + glyph_font_scale: 1, + stroke_px: 1, + scale: 1, + font: '', + y_shift: 0, + }; + } + ////////////////////////////////////////////////////////////////////////////////////////////////// + // STATIC MEMBERS + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_4__.Category.Note; + } + /** Debug helper. Displays various note metrics for the given note. */ + static plotMetrics(ctx, note, yPos) { + const metrics = note.getMetrics(); + const xStart = note.getAbsoluteX() - metrics.modLeftPx - metrics.leftDisplacedHeadPx; + const xPre1 = note.getAbsoluteX() - metrics.leftDisplacedHeadPx; + const xAbs = note.getAbsoluteX(); + const xPost1 = note.getAbsoluteX() + metrics.notePx; + const xPost2 = note.getAbsoluteX() + metrics.notePx + metrics.rightDisplacedHeadPx; + const xEnd = note.getAbsoluteX() + metrics.notePx + metrics.rightDisplacedHeadPx + metrics.modRightPx; + const xFreedomRight = xEnd + (note.getFormatterMetrics().freedom.right || 0); + const xWidth = xEnd - xStart; + ctx.save(); + ctx.setFont(_font__WEBPACK_IMPORTED_MODULE_0__.Font.SANS_SERIF, 8); + ctx.fillText(Math.round(xWidth) + 'px', xStart + note.getXShift(), yPos); + const y = yPos + 7; + function stroke(x1, x2, color, yy = y) { + ctx.beginPath(); + ctx.setStrokeStyle(color); + ctx.setFillStyle(color); + ctx.setLineWidth(3); + ctx.moveTo(x1 + note.getXShift(), yy); + ctx.lineTo(x2 + note.getXShift(), yy); + ctx.stroke(); + } + stroke(xStart, xPre1, 'red'); + stroke(xPre1, xAbs, '#999'); + stroke(xAbs, xPost1, 'green'); + stroke(xPost1, xPost2, '#999'); + stroke(xPost2, xEnd, 'red'); + stroke(xEnd, xFreedomRight, '#DD0'); + stroke(xStart - note.getXShift(), xStart, '#BBB'); // Shift + (0,_rendercontext__WEBPACK_IMPORTED_MODULE_1__.drawDot)(ctx, xAbs + note.getXShift(), y, 'blue'); + const formatterMetrics = note.getFormatterMetrics(); + if (formatterMetrics.iterations > 0) { + const spaceDeviation = formatterMetrics.space.deviation; + const prefix = spaceDeviation >= 0 ? '+' : ''; + ctx.setFillStyle('red'); + ctx.fillText(prefix + Math.round(spaceDeviation), xAbs + note.getXShift(), yPos - 10); + } + ctx.restore(); + } + static parseDuration(durationString) { + if (!durationString) { + return undefined; + } + const regexp = /(\d*\/?\d+|[a-z])(d*)([nrhms]|$)/; + const result = regexp.exec(durationString); + if (!result) { + return undefined; + } + const duration = result[1]; + const dots = result[2].length; + const type = result[3] || 'n'; + return { duration, dots, type }; + } + static parseNoteStruct(noteStruct) { + // Preserve backwards-compatibility + const durationProps = Note.parseDuration(noteStruct.duration); + if (!durationProps) { + return undefined; + } + // If specified type is invalid, return undefined. + let type = noteStruct.type; + if (type && !_tables__WEBPACK_IMPORTED_MODULE_2__.Tables.validTypes[type]) { + return undefined; + } + // If no type specified, check duration or custom types + const customTypes = []; + if (!type) { + type = durationProps.type || 'n'; + // If we have keys, try and check if we've got a custom glyph + if (noteStruct.keys !== undefined) { + noteStruct.keys.forEach((k, i) => { + const result = k.split('/'); + // We have a custom glyph specified after the note eg. /X2 + customTypes[i] = (result && result.length === 3 ? result[2] : type); + }); + } + } + // Calculate the tick duration of the note + let ticks = _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.durationToTicks(durationProps.duration); + if (!ticks) { + return undefined; + } + // Are there any dots? + const dots = noteStruct.dots ? noteStruct.dots : durationProps.dots; + if (typeof dots !== 'number') { + return undefined; + } + // Add ticks as necessary depending on the numbr of dots + let currentTicks = ticks; + for (let i = 0; i < dots; i++) { + if (currentTicks <= 1) + return undefined; + currentTicks = currentTicks / 2; + ticks += currentTicks; + } + return { + duration: durationProps.duration, + type, + customTypes, + dots, + ticks, + }; + } + /** + * Get the play note, which is arbitrary data that can be used by an + * audio player. + */ + getPlayNote() { + return this.playNote; + } + /** + * Set the play note, which is arbitrary data that can be used by an + * audio player. + */ + setPlayNote(note) { + this.playNote = note; + return this; + } + /** + * @returns true if this note is a type of rest. + * + * Rests don't have pitches, but take up space in the score. + * Subclasses should override this default implementation. + */ + isRest() { + return false; + } + /** Add stroke. */ + addStroke(index, stroke) { + stroke.setNote(this); + stroke.setIndex(index); + this.modifiers.push(stroke); + this.preFormatted = false; + return this; + } + /** Get the target stave. */ + getStave() { + return this.stave; + } + /** Check and get the target stave. */ + checkStave() { + return (0,_util__WEBPACK_IMPORTED_MODULE_5__.defined)(this.stave, 'NoStave', 'No stave attached to instance.'); + } + /** Set the target stave. */ + setStave(stave) { + this.stave = stave; + this.setYs([stave.getYForLine(0)]); // Update Y values if the stave is changed. + this.setContext(this.stave.getContext()); + return this; + } + /** Get spacing to the left of the notes. */ + getLeftDisplacedHeadPx() { + return this.leftDisplacedHeadPx; + } + /** Get spacing to the right of the notes. */ + getRightDisplacedHeadPx() { + return this.rightDisplacedHeadPx; + } + /** Set spacing to the left of the notes. */ + setLeftDisplacedHeadPx(x) { + this.leftDisplacedHeadPx = x; + return this; + } + /** Set spacing to the right of the notes. */ + setRightDisplacedHeadPx(x) { + this.rightDisplacedHeadPx = x; + return this; + } + /** True if this note has no duration (e.g., bar notes, spacers, etc.). */ + shouldIgnoreTicks() { + return this.ignore_ticks; + } + /** Get the stave line number for the note. */ + // eslint-disable-next-line + getLineNumber(isTopNote) { + return 0; + } + /** Get the stave line number for rest. */ + getLineForRest() { + return 0; + } + /** Get the glyph associated with this note. */ + // eslint-disable-next-line + getGlyph() { + return this.glyph; + } + /** Get the glyph width. */ + getGlyphWidth() { + // TODO: FIXME (multiple potential values for this.glyph) + if (this.glyph) { + if (this.glyph.getMetrics) { + return this.glyph.getMetrics().width; + } + else if (this.glyph.getWidth) { + return this.glyph.getWidth(this.render_options.glyph_font_scale); + } + } + return 0; + } + /** + * Set Y positions for this note. Each Y value is associated with + * an individual pitch/key within the note/chord. + */ + setYs(ys) { + this.ys = ys; + return this; + } + /** + * Get Y positions for this note. Each Y value is associated with + * an individual pitch/key within the note/chord. + */ + getYs() { + if (this.ys.length === 0) { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('NoYValues', 'No Y-values calculated for this note.'); + } + return this.ys; + } + /** + * Get the Y position of the space above the stave onto which text can + * be rendered. + */ + getYForTopText(text_line) { + return this.checkStave().getYForTopText(text_line); + } + /** Return the voice that this note belongs in. */ + getVoice() { + if (!this.voice) + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('NoVoice', 'Note has no voice.'); + return this.voice; + } + /** Attach this note to `voice`. */ + setVoice(voice) { + this.voice = voice; + this.preFormatted = false; + return this; + } + /** Get the `TickContext` for this note. */ + getTickContext() { + return this.checkTickContext(); + } + /** Set the `TickContext` for this note. */ + setTickContext(tc) { + this.tickContext = tc; + this.preFormatted = false; + return this; + } + /** Accessor to duration. */ + getDuration() { + return this.duration; + } + /** Accessor to isDotted. */ + isDotted() { + return this.getModifiersByType('Dot').length > 0; + } + /** Accessor to hasStem. */ + hasStem() { + return false; + } + /** Accessor to note type. */ + getNoteType() { + return this.noteType; + } + /** Get the beam. */ + getBeam() { + return this.beam; + } + /** Check and get the beam. */ + checkBeam() { + return (0,_util__WEBPACK_IMPORTED_MODULE_5__.defined)(this.beam, 'NoBeam', 'No beam attached to instance'); + } + /** Check it has a beam. */ + hasBeam() { + return this.beam != undefined; + } + /** Set the beam. */ + setBeam(beam) { + this.beam = beam; + return this; + } + /** + * Attach a modifier to this note. + * @param modifier the Modifier to add. + * @param index of the key to modify. + * @returns this + */ + addModifier(modifier, index = 0) { + const signature = 'Note.addModifier(modifier: Modifier, index: number=0)'; + // Backwards compatibility with 3.0.9. + if (typeof index === 'string') { + index = parseInt(index); + // eslint-disable-next-line + console.warn(signature + ' expected a number for `index`, but received a string.'); + } + // Some versions of VexFlow had the two parameters reversed. + // Check here and throw an error if the argument types are not correct. + if (typeof modifier !== 'object' || typeof index !== 'number') { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('WrongParams', 'Incorrect call signature. Use ' + signature + ' instead.'); + } + modifier.setNote(this); + modifier.setIndex(index); + super.addModifier(modifier); + return this; + } + // Get all modifiers of a specific type in the `ModifierContext` + getModifiersByType(type) { + return this.checkModifierContext().getMembers(type); + } + /** Get the coordinates for where modifiers begin. */ + // eslint-disable-next-line + getModifierStartXY(position, index, options) { + if (!this.preFormatted) { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('UnformattedNote', "Can't call GetModifierStartXY on an unformatted note"); + } + return { + x: this.getAbsoluteX(), + y: this.ys[0], + }; + } + getRightParenthesisPx(index) { + const props = this.getKeyProps()[index]; + return props.displaced ? this.getRightDisplacedHeadPx() : 0; + } + getLeftParenthesisPx(index) { + const props = this.getKeyProps()[index]; + return props.displaced ? this.getLeftDisplacedHeadPx() : 0; + } + getFirstDotPx() { + let px = this.getRightDisplacedHeadPx(); + if (this.checkModifierContext().getMembers('Parenthesis').length !== 0) + px += _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.currentMusicFont().lookupMetric('parenthesis.default.width'); + return px; + } + /** Get the metrics for this note. */ + getMetrics() { + if (!this.preFormatted) { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('UnformattedNote', "Can't call getMetrics on an unformatted note."); + } + const modLeftPx = this.modifierContext ? this.modifierContext.getState().left_shift : 0; + const modRightPx = this.modifierContext ? this.modifierContext.getState().right_shift : 0; + const width = this.getWidth(); + const glyphWidth = this.getGlyphWidth(); + const notePx = width - + modLeftPx - // subtract left modifiers + modRightPx - // subtract right modifiers + this.leftDisplacedHeadPx - // subtract left displaced head + this.rightDisplacedHeadPx; // subtract right displaced head + // NOTE: If you change this, remember to update MockTickable.getMetrics() in the tests/ directory. + return { + width, + glyphWidth, + notePx, + // Modifier spacing. + modLeftPx, + modRightPx, + // Displaced note head on left or right. + leftDisplacedHeadPx: this.leftDisplacedHeadPx, + rightDisplacedHeadPx: this.rightDisplacedHeadPx, + glyphPx: 0, + }; + } + /** + * Get the absolute `X` position of this note's tick context. This + * excludes x_shift, so you'll need to factor it in if you're + * looking for the post-formatted x-position. + */ + getAbsoluteX() { + const tickContext = this.checkTickContext(`Can't getAbsoluteX() without a TickContext.`); + // Position note to left edge of tick context. + let x = tickContext.getX(); + if (this.stave) { + x += this.stave.getNoteStartX() + _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.currentMusicFont().lookupMetric('stave.padding'); + } + if (this.isCenterAligned()) { + x += this.getCenterXShift(); + } + return x; + } + /** Get the direction of the stem. */ + getStemDirection() { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('NoStem', 'No stem attached to this note.'); + } + /** Get the top and bottom `y` values of the stem. */ + getStemExtents() { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('NoStem', 'No stem attached to this note.'); + } + /** Get the `x` coordinate to the right of the note. */ + getTieRightX() { + let tieStartX = this.getAbsoluteX(); + const note_glyph_width = this.glyph.getWidth(); + tieStartX += note_glyph_width / 2; + tieStartX += -this.width / 2 + this.width + 2; + return tieStartX; + } + /** Get the `x` coordinate to the left of the note. */ + getTieLeftX() { + let tieEndX = this.getAbsoluteX(); + const note_glyph_width = this.glyph.getWidth(); + tieEndX += note_glyph_width / 2; + tieEndX -= this.width / 2 + 2; + return tieEndX; + } + // Get the pitches in the note + getKeys() { + return this.keys; + } + // Get the properties for all the keys in the note + getKeyProps() { + return this.keyProps; + } +} + + +/***/ }), + +/***/ "./src/notehead.ts": +/*!*************************!*\ + !*** ./src/notehead.ts ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "NoteHead": () => (/* binding */ NoteHead) +/* harmony export */ }); +/* harmony import */ var _boundingbox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./boundingbox */ "./src/boundingbox.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./note */ "./src/note.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + + + +// eslint-disable-next-line +function L(...args) { + if (NoteHead.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_6__.log)('Vex.Flow.NoteHead', args); +} +/** + * Draw slashnote head manually. No glyph exists for this. + * @param ctx the Canvas context + * @param duration the duration of the note. ex: "4" + * @param x the x coordinate to draw at + * @param y the y coordinate to draw at + * @param stem_direction the direction of the stem + */ +function drawSlashNoteHead(ctx, duration, x, y, stem_direction, staveSpace) { + const width = _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.SLASH_NOTEHEAD_WIDTH; + ctx.save(); + ctx.setLineWidth(_tables__WEBPACK_IMPORTED_MODULE_4__.Tables.STEM_WIDTH); + let fill = false; + if (_tables__WEBPACK_IMPORTED_MODULE_4__.Tables.durationToNumber(duration) > 2) { + fill = true; + } + if (!fill) + x -= (_tables__WEBPACK_IMPORTED_MODULE_4__.Tables.STEM_WIDTH / 2) * stem_direction; + ctx.beginPath(); + ctx.moveTo(x, y + staveSpace); + ctx.lineTo(x, y + 1); + ctx.lineTo(x + width, y - staveSpace); + ctx.lineTo(x + width, y); + ctx.lineTo(x, y + staveSpace); + ctx.closePath(); + if (fill) { + ctx.fill(); + } + else { + ctx.stroke(); + } + if (_tables__WEBPACK_IMPORTED_MODULE_4__.Tables.durationToFraction(duration).equals(0.5)) { + const breve_lines = [-3, -1, width + 1, width + 3]; + for (let i = 0; i < breve_lines.length; i++) { + ctx.beginPath(); + ctx.moveTo(x + breve_lines[i], y - 10); + ctx.lineTo(x + breve_lines[i], y + 11); + ctx.stroke(); + } + } + ctx.restore(); +} +/** + * `NoteHeads` are typically not manipulated + * directly, but used internally in `StaveNote`. + * + * See `tests/notehead_tests.ts` for usage examples. + */ +class NoteHead extends _note__WEBPACK_IMPORTED_MODULE_2__.Note { + constructor(noteStruct) { + super(noteStruct); + this.custom_glyph = false; + this.stem_up_x_offset = 0; + this.stem_down_x_offset = 0; + this.index = noteStruct.index; + this.x = noteStruct.x || 0; + this.y = noteStruct.y || 0; + if (noteStruct.note_type) + this.noteType = noteStruct.note_type; + this.displaced = noteStruct.displaced || false; + this.stem_direction = noteStruct.stem_direction || _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP; + this.line = noteStruct.line || 0; + // Get glyph code based on duration and note type. This could be + // regular notes, rests, or other custom codes. + this.glyph = _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.getGlyphProps(this.duration, this.noteType); + (0,_util__WEBPACK_IMPORTED_MODULE_6__.defined)(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`); + this.glyph_code = this.glyph.code_head; + this.x_shift = noteStruct.x_shift || 0; + if (noteStruct.custom_glyph_code) { + this.custom_glyph = true; + this.glyph_code = noteStruct.custom_glyph_code; + this.stem_up_x_offset = noteStruct.stem_up_x_offset || 0; + this.stem_down_x_offset = noteStruct.stem_down_x_offset || 0; + } + this.style = noteStruct.style; + this.slashed = noteStruct.slashed || false; + this.render_options = Object.assign(Object.assign({}, this.render_options), { + // font size for note heads + glyph_font_scale: noteStruct.glyph_font_scale || _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.NOTATION_FONT_SCALE }); + this.setWidth(this.glyph.getWidth(this.render_options.glyph_font_scale)); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_5__.Category.NoteHead; + } + /** Get the width of the notehead. */ + getWidth() { + return this.width; + } + /** Determine if the notehead is displaced. */ + isDisplaced() { + return this.displaced === true; + } + /** Get the glyph data. */ + getGlyph() { + return this.glyph; + } + /** Set the X coordinate. */ + setX(x) { + this.x = x; + return this; + } + /** Get the Y coordinate. */ + getY() { + return this.y; + } + /** Set the Y coordinate. */ + setY(y) { + this.y = y; + return this; + } + /** Get the stave line the notehead is placed on. */ + getLine() { + return this.line; + } + /** Set the stave line the notehead is placed on. */ + setLine(line) { + this.line = line; + return this; + } + /** Get the canvas `x` coordinate position of the notehead. */ + getAbsoluteX() { + // If the note has not been preformatted, then get the static x value + // Otherwise, it's been formatted and we should use it's x value relative + // to its tick context + const x = !this.preFormatted ? this.x : super.getAbsoluteX(); + // For a more natural displaced notehead, we adjust the displacement amount + // by half the stem width in order to maintain a slight overlap with the stem + const displacementStemAdjustment = _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.WIDTH / 2; + const musicFont = _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.currentMusicFont(); + const fontShift = musicFont.lookupMetric('notehead.shiftX', 0) * this.stem_direction; + const displacedFontShift = musicFont.lookupMetric('noteHead.displaced.shiftX', 0) * this.stem_direction; + return (x + + fontShift + + (this.displaced ? (this.width - displacementStemAdjustment) * this.stem_direction + displacedFontShift : 0)); + } + /** Get the `BoundingBox` for the `NoteHead`. */ + getBoundingBox() { + if (!this.preFormatted) { + throw new _util__WEBPACK_IMPORTED_MODULE_6__.RuntimeError('UnformattedNote', "Can't call getBoundingBox on an unformatted note."); + } + const spacing = this.checkStave().getSpacingBetweenLines(); + const half_spacing = spacing / 2; + const min_y = this.y - half_spacing; + return new _boundingbox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox(this.getAbsoluteX(), min_y, this.width, spacing); + } + /** Set notehead to a provided `stave`. */ + setStave(stave) { + const line = this.getLine(); + this.stave = stave; + if (this.stave) { + this.setY(this.stave.getYForNote(line)); + this.setContext(this.stave.getContext()); + } + return this; + } + /** Pre-render formatting. */ + preFormat() { + if (this.preFormatted) + return this; + const width = this.getWidth() + this.leftDisplacedHeadPx + this.rightDisplacedHeadPx; + this.setWidth(width); + this.preFormatted = true; + return this; + } + /** Draw the notehead. */ + draw() { + const ctx = this.checkContext(); + this.setRendered(); + let head_x = this.getAbsoluteX(); + if (this.custom_glyph) { + // head_x += this.x_shift; + head_x += this.stem_direction === _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP ? this.stem_up_x_offset : this.stem_down_x_offset; + } + const y = this.y; + L("Drawing note head '", this.noteType, this.duration, "' at", head_x, y); + // Begin and end positions for head. + const stem_direction = this.stem_direction; + const glyph_font_scale = this.render_options.glyph_font_scale; + if (this.style) { + this.applyStyle(ctx); + } + const categorySuffix = `${this.glyph_code}Stem${stem_direction === _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP ? 'Up' : 'Down'}`; + if (this.noteType === 's') { + const staveSpace = this.checkStave().getSpacingBetweenLines(); + drawSlashNoteHead(ctx, this.duration, head_x, y, stem_direction, staveSpace); + } + else { + _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.renderGlyph(ctx, head_x, y, glyph_font_scale, this.glyph_code, { + category: this.custom_glyph ? `noteHead.custom.${categorySuffix}` : `noteHead.standard.${categorySuffix}`, + }); + } + if (this.style) { + this.restoreStyle(ctx); + } + } +} +/** To enable logging for this class. Set `Vex.Flow.NoteHead.DEBUG` to `true`. */ +NoteHead.DEBUG = false; + + +/***/ }), + +/***/ "./src/notesubgroup.ts": +/*!*****************************!*\ + !*** ./src/notesubgroup.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "NoteSubGroup": () => (/* binding */ NoteSubGroup) +/* harmony export */ }); +/* harmony import */ var _formatter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./formatter */ "./src/formatter.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _voice__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./voice */ "./src/voice.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author Taehoon Moon 2016 +// +// ## Description +// +// This file implements `NoteSubGroup` which is used to format and +// render notes as a `Modifier` +// ex) ClefNote, TimeSigNote and BarNote. + + + + + +class NoteSubGroup extends _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier { + constructor(subNotes) { + super(); + this.preFormatted = false; + this.position = _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.LEFT; + this.subNotes = subNotes; + this.subNotes.forEach((subNote) => { + subNote.setIgnoreTicks(false); + }); + this.width = 0; + this.formatter = new _formatter__WEBPACK_IMPORTED_MODULE_0__.Formatter(); + this.voice = new _voice__WEBPACK_IMPORTED_MODULE_4__.Voice({ + num_beats: 4, + beat_value: 4, + resolution: _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.RESOLUTION, + }).setStrict(false); + this.voice.addTickables(this.subNotes); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.NoteSubGroup; + } + // Arrange groups inside a `ModifierContext` + static format(groups, state) { + if (!groups || groups.length === 0) + return false; + let width = 0; + for (let i = 0; i < groups.length; ++i) { + const group = groups[i]; + group.preFormat(); + width += group.getWidth(); + } + state.left_shift += width; + return true; + } + preFormat() { + if (this.preFormatted) + return; + this.formatter.joinVoices([this.voice]).format([this.voice], 0); + this.setWidth(this.formatter.getMinTotalWidth()); + this.preFormatted = true; + } + setWidth(width) { + this.width = width; + return this; + } + getWidth() { + return this.width; + } + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + this.alignSubNotesWithNote(this.subNotes, note); // Modifier function + this.subNotes.forEach((subNote) => subNote.setContext(ctx).drawWithStyle()); + } +} + + +/***/ }), + +/***/ "./src/ornament.ts": +/*!*************************!*\ + !*** ./src/ornament.ts ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Ornament": () => (/* binding */ Ornament) +/* harmony export */ }); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _tickcontext__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tickcontext */ "./src/tickcontext.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author: Cyril Silverman +// MIT License + + + + + + + +// eslint-disable-next-line +function L(...args) { + if (Ornament.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_6__.log)('Vex.Flow.Ornament', args); +} +/** + * Ornament implements ornaments as modifiers that can be + * attached to notes. The complete list of ornaments is available in + * `tables.ts` under `Vex.Flow.ornamentCodes`. + * + * See `tests/ornament_tests.ts` for usage examples. + */ +class Ornament extends _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier { + /** + * Create a new ornament of type `type`, which is an entry in + * `Vex.Flow.ornamentCodes` in `tables.ts`. + */ + constructor(type) { + super(); + this.type = type; + this.delayed = false; + this.render_options = { + font_scale: 38, + accidentalLowerPadding: 3, + accidentalUpperPadding: 3, + }; + this.ornament = _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.ornamentCodes(this.type); + // new ornaments have their origin at the origin, and have more specific + // metrics. Legacy ornaments do some + // x scaling, and have hard-coded metrics + const metrics = this.getMetrics(); + // some jazz ornaments are above or below depending on stem direction. + this.adjustForStemDirection = false; + // some jazz ornaments like falls are supposed to overlap with future bars + // and so we report a different width than they actually take up. + this.reportedWidth = metrics && metrics.reportedWidth ? metrics.reportedWidth : 0; + this.stemUpYOffset = metrics && metrics.stemUpYOffset ? metrics.stemUpYOffset : 0; + this.ornamentAlignWithNoteHead = Ornament.ornamentAlignWithNoteHead.indexOf(this.type) >= 0; + if (!this.ornament) { + throw new _util__WEBPACK_IMPORTED_MODULE_6__.RuntimeError('ArgumentError', `Ornament not found: '${this.type}'`); + } + this.x_shift = metrics ? metrics.xOffset : 0; + this.y_shift = metrics ? metrics.yOffset : 0; + this.glyph = new _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph(this.ornament.code, this.render_options.font_scale, { + category: `ornament.${this.ornament.code}`, + }); + // Is this a jazz ornament that goes between this note and the next note. + if (Ornament.ornamentNoteTransition.indexOf(this.type) >= 0) { + this.delayed = true; + } + // Legacy ornaments need this. I don't know why, but horizontal spacing issues + // happen if I don't set it. + if (!metrics) { + this.glyph.setOrigin(0.5, 1.0); // FIXME: SMuFL won't require a vertical origin shift + } + } + /** Ornaments category string. */ + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_5__.Category.Ornament; + } + /** Arrange ornaments inside `ModifierContext` */ + static format(ornaments, state) { + if (!ornaments || ornaments.length === 0) + return false; + let width = 0; // width is used by ornaments, which are always centered on the note head + let right_shift = state.right_shift; // jazz ornaments calculate r/l shift separately + let left_shift = state.left_shift; + let yOffset = 0; + for (let i = 0; i < ornaments.length; ++i) { + const ornament = ornaments[i]; + const increment = 2; + if (Ornament.ornamentRelease.indexOf(ornament.type) >= 0) { + ornament.x_shift += right_shift + 2; + } + if (Ornament.ornamentAttack.indexOf(ornament.type) >= 0) { + ornament.x_shift -= left_shift + 2; + } + if (ornament.reportedWidth && ornament.x_shift < 0) { + left_shift += ornament.reportedWidth; + } + else if (ornament.reportedWidth && ornament.x_shift > 0) { + right_shift += ornament.reportedWidth; + } + else { + width = Math.max(ornament.getWidth(), width); + } + // articulations above/below the line can be stacked. + if (Ornament.ornamentArticulation.indexOf(ornament.type) >= 0) { + // Unfortunately we don't know the stem direction. So we base it + // on the line number, but also allow it to be overridden. + const ornamentNote = (0,_util__WEBPACK_IMPORTED_MODULE_6__.defined)(ornament.note, 'NoAttachedNote'); + if (ornamentNote.getLineNumber() >= 3 || ornament.getPosition() === _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.ABOVE) { + state.top_text_line += increment; + ornament.y_shift += yOffset; + yOffset -= ornament.glyph.bbox.getH(); + } + else { + state.text_line += increment; + ornament.y_shift += yOffset; + yOffset += ornament.glyph.bbox.getH(); + } + } + else { + if (ornament.getPosition() === _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.ABOVE) { + ornament.setTextLine(state.top_text_line); + state.top_text_line += increment; + } + else { + ornament.setTextLine(state.text_line); + state.text_line += increment; + } + } + } + // Note: 'legit' ornaments don't consider other modifiers when calculating their + // X position, but jazz ornaments sometimes need to. + state.left_shift = left_shift + width / 2; + state.right_shift = right_shift + width / 2; + return true; + } + /** + * ornamentNoteTransition means the jazz ornament represents an effect from one note to another, + * these are generally on the top of the staff. + */ + static get ornamentNoteTransition() { + return ['flip', 'jazzTurn', 'smear']; + } + /** + * ornamentAttack indicates something that happens in the attach, placed before the note and + * any accidentals + */ + static get ornamentAttack() { + return ['scoop']; + } + /** + * The ornament is aligned based on the note head, but without regard to whether the + * stem goes up or down. + */ + static get ornamentAlignWithNoteHead() { + return ['doit', 'fall', 'fallLong', 'doitLong', 'bend', 'plungerClosed', 'plungerOpen', 'scoop']; + } + /** + * An ornament that happens on the release of the note, generally placed after the + * note and overlapping the next beat/measure.. + */ + static get ornamentRelease() { + return ['doit', 'fall', 'fallLong', 'doitLong', 'jazzTurn', 'smear', 'flip']; + } + /** ornamentArticulation goes above/below the note based on space availablity */ + static get ornamentArticulation() { + return ['bend', 'plungerClosed', 'plungerOpen']; + } + /** + * Legacy ornaments have hard-coded metrics. If additional ornament types are + * added, get their metrics here. + */ + // eslint-disable-next-line + getMetrics() { + return _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().getMetrics().glyphs.jazzOrnaments[this.ornament.code]; + } + /** Set whether the ornament is to be delayed. */ + setDelayed(delayed) { + this.delayed = delayed; + return this; + } + /** Set the upper accidental for the ornament. */ + setUpperAccidental(accid) { + const scale = this.render_options.font_scale / 1.3; + this.accidentalUpper = new _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph(_tables__WEBPACK_IMPORTED_MODULE_3__.Tables.accidentalCodes(accid).code, scale); + this.accidentalUpper.setOrigin(0.5, 1.0); + return this; + } + /** Set the lower accidental for the ornament. */ + setLowerAccidental(accid) { + const scale = this.render_options.font_scale / 1.3; + this.accidentalLower = new _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph(_tables__WEBPACK_IMPORTED_MODULE_3__.Tables.accidentalCodes(accid).code, scale); + this.accidentalLower.setOrigin(0.5, 1.0); + return this; + } + /** Render ornament in position next to note. */ + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const stemDir = note.getStemDirection(); + const stave = note.checkStave(); + const classString = Object.keys(this.getAttribute('classes')).join(' '); + ctx.openGroup(classString, this.getAttribute('id')); + // Get stem extents + const stemExtents = note.checkStem().getExtents(); + let y = stemDir === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN ? stemExtents.baseY : stemExtents.topY; + // TabNotes don't have stems attached to them. Tab stems are rendered outside the stave. + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isTabNote)(note)) { + if (note.hasStem()) { + if (stemDir === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN) { + y = stave.getYForTopText(this.text_line); + } + } + else { + // Without a stem + y = stave.getYForTopText(this.text_line); + } + } + const isPlacedOnNoteheadSide = stemDir === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN; + const spacing = stave.getSpacingBetweenLines(); + let lineSpacing = 1; + // Beamed stems are longer than quarter note stems, adjust accordingly + if (!isPlacedOnNoteheadSide && note.hasBeam()) { + lineSpacing += 0.5; + } + const totalSpacing = spacing * (this.text_line + lineSpacing); + const glyphYBetweenLines = y - totalSpacing; + // Get initial coordinates for the modifier position + const start = note.getModifierStartXY(this.position, this.index); + let glyphX = start.x; + // If the ornament is aligned with the note head, don't consider the stave y + // but use the 'natural' modifier y + let glyphY = this.ornamentAlignWithNoteHead + ? start.y + : Math.min(stave.getYForTopText(this.text_line), glyphYBetweenLines); + glyphY += this.y_shift; + // Ajdust x position if ornament is delayed + if (this.delayed) { + let delayXShift = 0; + const startX = glyphX - (stave.getX() - 10); + if (this.delayXShift !== undefined) { + delayXShift = this.delayXShift; + } + else { + delayXShift += this.glyph.getMetrics().width / 2; + const nextContext = _tickcontext__WEBPACK_IMPORTED_MODULE_4__.TickContext.getNextContext(note.getTickContext()); + if (nextContext) { + delayXShift += (nextContext.getX() - startX) * 0.5; + } + else { + delayXShift += (stave.getX() + stave.getWidth() - startX) * 0.5; + } + this.delayXShift = delayXShift; + } + glyphX += delayXShift; + } + L('Rendering ornament: ', this.ornament, glyphX, glyphY); + if (this.accidentalLower) { + this.accidentalLower.render(ctx, glyphX, glyphY); + glyphY -= this.accidentalLower.getMetrics().height; + glyphY -= this.render_options.accidentalLowerPadding; + } + if (this.stemUpYOffset && note.hasStem() && note.getStemDirection() === 1) { + glyphY += this.stemUpYOffset; + } + if (note.getLineNumber() < 5 && Ornament.ornamentNoteTransition.indexOf(this.type) >= 0) { + glyphY = note.checkStave().getBoundingBox().getY() + 40; + } + this.glyph.render(ctx, glyphX + this.x_shift, glyphY); + if (this.accidentalUpper) { + glyphY -= this.glyph.getMetrics().height + this.render_options.accidentalUpperPadding; + this.accidentalUpper.render(ctx, glyphX, glyphY); + } + ctx.closeGroup(); + } +} +/** To enable logging for this class. Set `Vex.Flow.Ornament.DEBUG` to `true`. */ +Ornament.DEBUG = false; + + +/***/ }), + +/***/ "./src/parenthesis.ts": +/*!****************************!*\ + !*** ./src/parenthesis.ts ***! + \****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Parenthesis": () => (/* binding */ Parenthesis) +/* harmony export */ }); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author: Rodrigo Vilar +// MIT License + + + + +/** Parenthesis implements parenthesis modifiers for notes. */ +class Parenthesis extends _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier { + /** + * Constructor + * + * @param position Modifier.Position.LEFT (default) or Modifier.Position.RIGHT + */ + constructor(position) { + super(); + this.position = position !== null && position !== void 0 ? position : _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.LEFT; + this.point = _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.currentMusicFont().lookupMetric('parenthesis.default.point'); + this.setWidth(_tables__WEBPACK_IMPORTED_MODULE_2__.Tables.currentMusicFont().lookupMetric('parenthesis.default.width')); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.Parenthesis; + } + /** Add parentheses to the notes. */ + static buildAndAttach(notes) { + for (const note of notes) { + for (let i = 0; i < note.keys.length; i++) { + note.addModifier(new Parenthesis(_modifier__WEBPACK_IMPORTED_MODULE_1__.ModifierPosition.LEFT), i); + note.addModifier(new Parenthesis(_modifier__WEBPACK_IMPORTED_MODULE_1__.ModifierPosition.RIGHT), i); + } + } + } + /** Arrange parentheses inside a ModifierContext. */ + static format(parentheses, state) { + if (!parentheses || parentheses.length === 0) + return false; + let x_widthL = 0; + let x_widthR = 0; + for (let i = 0; i < parentheses.length; ++i) { + const parenthesis = parentheses[i]; + const note = parenthesis.getNote(); + const pos = parenthesis.getPosition(); + const index = parenthesis.checkIndex(); + let shift = 0; + if (pos === _modifier__WEBPACK_IMPORTED_MODULE_1__.ModifierPosition.RIGHT) { + shift = note.getRightParenthesisPx(index); + x_widthR = x_widthR > shift + parenthesis.width ? x_widthR : shift + parenthesis.width; + } + if (pos === _modifier__WEBPACK_IMPORTED_MODULE_1__.ModifierPosition.LEFT) { + shift = note.getLeftParenthesisPx(index); + x_widthL = x_widthL > shift + parenthesis.width ? x_widthL : shift + parenthesis.width; + } + parenthesis.setXShift(shift); + } + state.left_shift += x_widthL; + state.right_shift += x_widthR; + return true; + } + /** Set the associated note. */ + setNote(note) { + this.note = note; + this.point = _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.currentMusicFont().lookupMetric('parenthesis.default.point'); + this.setWidth(_tables__WEBPACK_IMPORTED_MODULE_2__.Tables.currentMusicFont().lookupMetric('parenthesis.default.width')); + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_3__.isGraceNote)(note)) { + this.point = _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.currentMusicFont().lookupMetric('parenthesis.gracenote.point'); + this.setWidth(_tables__WEBPACK_IMPORTED_MODULE_2__.Tables.currentMusicFont().lookupMetric('parenthesis.gracenote.width')); + } + return this; + } + /** Render the parenthesis. */ + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const start = note.getModifierStartXY(this.position, this.index, { forceFlagRight: true }); + const x = start.x + this.x_shift; + const y = start.y + this.y_shift; + if (this.position == _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.RIGHT) { + _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph.renderGlyph(ctx, x + 1, y, this.point, 'noteheadParenthesisRight', { + category: `noteHead.standard.noteheadParenthesisRight`, + }); + } + else if (this.position == _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.LEFT) { + _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph.renderGlyph(ctx, x - 2, y, this.point, 'noteheadParenthesisLeft', { + category: `noteHead.standard.noteheadParenthesisLeft`, + }); + } + } +} + + +/***/ }), + +/***/ "./src/parser.ts": +/*!***********************!*\ + !*** ./src/parser.ts ***! + \***********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Parser": () => (/* binding */ Parser) +/* harmony export */ }); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// A generic text parsing class for VexFlow. + +// To enable logging for this class. Set `Vex.Flow.Parser.DEBUG` to `true`. +// eslint-disable-next-line +function L(...args) { + if (Parser.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_0__.log)('Vex.Flow.Parser', args); +} +const NO_ERROR_POS = -1; +// Converts parser results into an easy to reference list that can be +// used in triggers. This function returns: +// - nested array in which the leaf elements are string or null +// - string (including empty strings) +// - null +function flattenMatches(r) { + if ('matchedString' in r) + return r.matchedString; // string + if ('results' in r) + return flattenMatches(r.results); + const results = r; + if (results.length === 1) + return flattenMatches(results[0]); + if (results.length === 0) + return null; + return results.map(flattenMatches); // nested array +} +// This is the base parser class. Given an arbitrary context-free grammar, it +// can parse any line and execute code when specific rules are met (e.g., +// when a string is terminated.) +class Parser { + // For an example of a simple grammar, take a look at tests/parser_tests.ts or + // the EasyScore grammar in easyscore.ts. + constructor(grammar) { + this.grammar = grammar; + this.line = ''; + this.pos = 0; + this.errorPos = NO_ERROR_POS; + } + // Parse `line` using current grammar. Returns `{success: true}` if the + // line parsed correctly, otherwise returns `{success: false, errorPos: N}` + // where `errorPos` is the location of the error in the string. + parse(line) { + this.line = line; + this.pos = 0; + this.errorPos = NO_ERROR_POS; + const result = this.expect(this.grammar.begin()); + result.errorPos = this.errorPos; + return result; + } + matchFail(returnPos) { + if (this.errorPos === NO_ERROR_POS) + this.errorPos = this.pos; + this.pos = returnPos; + } + matchSuccess() { + this.errorPos = NO_ERROR_POS; + } + // Look for `token` in this.line[this.pos], and return success + // if one is found. `token` is specified as a regular expression. + matchToken(token, noSpace = false) { + const regexp = noSpace ? new RegExp('^((' + token + '))') : new RegExp('^((' + token + ')\\s*)'); + const workingLine = this.line.slice(this.pos); + const result = workingLine.match(regexp); + if (result !== null) { + return { + success: true, + matchedString: result[2], + incrementPos: result[1].length, + pos: this.pos, + }; + } + else { + return { success: false, pos: this.pos }; + } + } + // Execute rule to match a sequence of tokens (or rules). If `maybe` is + // set, then return success even if the token is not found, but reset + // the position before exiting. + // TODO: expectOne(...) is never called with the `maybe` parameter. + expectOne(rule, maybe = false) { + const results = []; + const pos = this.pos; + let allMatches = true; + let oneMatch = false; + maybe = maybe === true || rule.maybe === true; + // Execute all sub rules in sequence. + if (rule.expect) { + for (const next of rule.expect) { + const localPos = this.pos; + const result = this.expect(next); + // If `rule.or` is set, then return success if any one + // of the subrules match, else all subrules must match. + if (result.success) { + results.push(result); + oneMatch = true; + if (rule.or) + break; + } + else { + allMatches = false; + if (!rule.or) { + this.pos = localPos; + break; + } + } + } + } + const gotOne = (rule.or && oneMatch) || allMatches; + const success = gotOne || maybe === true; + const numMatches = gotOne ? 1 : 0; + if (maybe && !gotOne) + this.pos = pos; + if (success) { + this.matchSuccess(); + } + else { + this.matchFail(pos); + } + return { success, results, numMatches }; + } + // Try to match multiple (one or more) instances of the rule. If `maybe` is set, + // then a failed match is also a success (but the position is reset). + expectOneOrMore(rule, maybe = false) { + const results = []; + const pos = this.pos; + let numMatches = 0; + let more = true; + do { + const result = this.expectOne(rule); + if (result.success && result.results) { + numMatches++; + results.push(result.results); + } + else { + more = false; + } + } while (more); + const success = numMatches > 0 || maybe === true; + if (maybe && !(numMatches > 0)) + this.pos = pos; + if (success) { + this.matchSuccess(); + } + else { + this.matchFail(pos); + } + return { success, results, numMatches }; + } + // Match zero or more instances of `rule`. Offloads to `expectOneOrMore`. + expectZeroOrMore(rule) { + return this.expectOneOrMore(rule, true); + } + // Execute the rule produced by the provided `rules` function. This + // offloads to one of the above matchers and consolidates the results. It is also + // responsible for executing any code triggered by the rule (in `rule.run`.) + expect(ruleFunc) { + L('Evaluating rule function:', ruleFunc); + if (!ruleFunc) { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('Invalid rule function'); + } + let result; + // Get rule from Grammar class. + // expect(...) handles both lexing & parsing: + // - lexer rules produce tokens. + // - parser rules produce expressions which may trigger code via the + // { run: () => ... } trigger functions in easyscore.ts. + // These functions build the VexFlow objects that are displayed on screen. + const rule = ruleFunc.bind(this.grammar)(); + if (rule.token) { + // A lexer rule has a `token` property. + // Base case: parse the regex and throw an error if the + // line doesn't match. + result = this.matchToken(rule.token, rule.noSpace === true); + if (result.success) { + // Token match! Update position and throw away parsed portion + // of string. + this.pos += result.incrementPos; + } + } + else if (rule.expect) { + // A parser rule has an `expect` property. + if (rule.oneOrMore) { + result = this.expectOneOrMore(rule); + } + else if (rule.zeroOrMore) { + result = this.expectZeroOrMore(rule); + } + else { + result = this.expectOne(rule); + } + } + else { + L(rule); + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError('Bad grammar! No `token` or `expect` property ' + rule); + } + // If there's a trigger attached to this rule, then run it. + // Make the matches accessible through `state.matches` in the + // `run: (state) => ...` trigger. + const matches = []; + result.matches = matches; + if (result.results) { + result.results.forEach((r) => matches.push(flattenMatches(r))); + } + if (rule.run && result.success) { + rule.run({ matches }); + } + return result; + } +} +Parser.DEBUG = false; + + +/***/ }), + +/***/ "./src/pedalmarking.ts": +/*!*****************************!*\ + !*** ./src/pedalmarking.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "PedalMarking": () => (/* binding */ PedalMarking) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + + +// eslint-disable-next-line +function L(...args) { + if (PedalMarking.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_5__.log)('Vex.Flow.PedalMarking', args); +} +/** + * Draws a pedal glyph with the provided `name` on a rendering `context` + * at the coordinates `x` and `y. Takes into account the glyph data + * coordinate shifts. + */ +function drawPedalGlyph(name, context, x, y, point) { + const glyph_data = PedalMarking.GLYPHS[name]; + const glyph = new _glyph__WEBPACK_IMPORTED_MODULE_2__.Glyph(glyph_data.code, point, { category: 'pedalMarking' }); + glyph.render(context, x + glyph_data.x_shift, y + glyph_data.y_shift); +} +/** + * PedalMarking implements different types of pedal markings. These notation + * elements indicate to the performer when to depress and release the a pedal. + * + * In order to create "Sostenuto", and "una corda" markings, you must set + * custom text for the release/depress pedal markings. + */ +class PedalMarking extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + constructor(notes) { + super(); + this.notes = notes; + this.type = PedalMarking.type.TEXT; + this.line = 0; + // Custom text for the release/depress markings + this.custom_depress_text = ''; + this.custom_release_text = ''; + this.resetFont(); + this.render_options = { + bracket_height: 10, + text_margin_right: 6, + bracket_line_width: 1, + color: 'black', + }; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_4__.Category.PedalMarking; + } + /** + * Create a sustain pedal marking. Returns the defaults PedalMarking. + * Which uses the traditional "Ped" and "*"" markings. + */ + static createSustain(notes) { + const pedal = new PedalMarking(notes); + return pedal; + } + /** Create a sostenuto pedal marking */ + static createSostenuto(notes) { + const pedal = new PedalMarking(notes); + pedal.setType(PedalMarking.type.MIXED); + pedal.setCustomText('Sost. Ped.'); + return pedal; + } + /** Create an una corda pedal marking */ + static createUnaCorda(notes) { + const pedal = new PedalMarking(notes); + pedal.setType(PedalMarking.type.TEXT); + pedal.setCustomText('una corda', 'tre corda'); + return pedal; + } + /** Set pedal type. */ + setType(type) { + type = typeof type === 'string' ? PedalMarking.typeString[type] : type; + if (type >= PedalMarking.type.TEXT && type <= PedalMarking.type.MIXED) { + this.type = type; + } + return this; + } + /** + * Set custom text for the `depress`/`release` pedal markings. No text is + * set if the parameter is falsy. + */ + setCustomText(depress, release) { + this.custom_depress_text = depress || ''; + this.custom_release_text = release || ''; + return this; + } + /** Set the staff line to render the markings on. */ + setLine(line) { + this.line = line; + return this; + } + /** Draw the bracket based pedal markings. */ + drawBracketed() { + const ctx = this.checkContext(); + let is_pedal_depressed = false; + let prev_x; + let prev_y; + // Iterate through each note + this.notes.forEach((note, index, notes) => { + // Each note triggers the opposite pedal action + is_pedal_depressed = !is_pedal_depressed; + // Get the initial coordinates for the note + const x = note.getAbsoluteX(); + const y = note.checkStave().getYForBottomText(this.line + 3); + // Throw if current note is positioned before the previous note + if (x < prev_x) { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('InvalidConfiguration', 'The notes provided must be in order of ascending x positions'); + } + // Determine if the previous or next note are the same + // as the current note. We need to keep track of this for + // when adjustments are made for the release+depress action + const next_is_same = notes[index + 1] === note; + const prev_is_same = notes[index - 1] === note; + let x_shift = 0; + const point = _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().lookupMetric(`pedalMarking.${is_pedal_depressed ? 'down' : 'up'}.point`); + if (is_pedal_depressed) { + // Adjustment for release+depress + x_shift = prev_is_same ? 5 : 0; + if (this.type === PedalMarking.type.MIXED && !prev_is_same) { + // For MIXED style, start with text instead of bracket + if (this.custom_depress_text) { + // If we have custom text, use instead of the default "Ped" glyph + const text_width = ctx.measureText(this.custom_depress_text).width; + ctx.fillText(this.custom_depress_text, x - text_width / 2, y); + x_shift = text_width / 2 + this.render_options.text_margin_right; + } + else { + // Render the Ped glyph in position + drawPedalGlyph('pedal_depress', ctx, x, y, point); + x_shift = 20 + this.render_options.text_margin_right; + } + } + else { + // Draw start bracket + ctx.beginPath(); + ctx.moveTo(x, y - this.render_options.bracket_height); + ctx.lineTo(x + x_shift, y); + ctx.stroke(); + ctx.closePath(); + } + } + else { + // Adjustment for release+depress + x_shift = next_is_same ? -5 : 0; + // Draw end bracket + ctx.beginPath(); + ctx.moveTo(prev_x, prev_y); + ctx.lineTo(x + x_shift, y); + ctx.lineTo(x, y - this.render_options.bracket_height); + ctx.stroke(); + ctx.closePath(); + } + // Store previous coordinates + prev_x = x + x_shift; + prev_y = y; + }); + } + /** + * Draw the text based pedal markings. This defaults to the traditional + * "Ped" and "*"" symbols if no custom text has been provided. + */ + drawText() { + const ctx = this.checkContext(); + let is_pedal_depressed = false; + // Iterate through each note, placing glyphs or custom text accordingly + this.notes.forEach((note) => { + is_pedal_depressed = !is_pedal_depressed; + const stave = note.checkStave(); + const x = note.getAbsoluteX(); + const y = stave.getYForBottomText(this.line + 3); + const point = _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().lookupMetric(`pedalMarking.${is_pedal_depressed ? 'down' : 'up'}.point`); + let text_width = 0; + if (is_pedal_depressed) { + if (this.custom_depress_text) { + text_width = ctx.measureText(this.custom_depress_text).width; + ctx.fillText(this.custom_depress_text, x - text_width / 2, y); + } + else { + drawPedalGlyph('pedal_depress', ctx, x, y, point); + } + } + else { + if (this.custom_release_text) { + text_width = ctx.measureText(this.custom_release_text).width; + ctx.fillText(this.custom_release_text, x - text_width / 2, y); + } + else { + drawPedalGlyph('pedal_release', ctx, x, y, point); + } + } + }); + } + /** Render the pedal marking in position on the rendering context. */ + draw() { + const ctx = this.checkContext(); + this.setRendered(); + ctx.save(); + ctx.setStrokeStyle(this.render_options.color); + ctx.setFillStyle(this.render_options.color); + ctx.setFont(this.textFont); + L('Rendering Pedal Marking'); + if (this.type === PedalMarking.type.BRACKET || this.type === PedalMarking.type.MIXED) { + ctx.setLineWidth(this.render_options.bracket_line_width); + this.drawBracketed(); + } + else if (this.type === PedalMarking.type.TEXT) { + this.drawText(); + } + ctx.restore(); + } +} +/** To enable logging for this class. Set `Vex.Flow.PedalMarking.DEBUG` to `true`. */ +PedalMarking.DEBUG = false; +PedalMarking.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_1__.Font.SERIF, + size: 12, + weight: _font__WEBPACK_IMPORTED_MODULE_1__.FontWeight.BOLD, + style: _font__WEBPACK_IMPORTED_MODULE_1__.FontStyle.ITALIC, +}; +/** Glyph data */ +PedalMarking.GLYPHS = { + pedal_depress: { + code: 'keyboardPedalPed', + x_shift: -10, + y_shift: 0, + }, + pedal_release: { + code: 'keyboardPedalUp', + x_shift: -2, + y_shift: 3, + }, +}; +/** Pedal type as number. */ +PedalMarking.type = { + TEXT: 1, + BRACKET: 2, + MIXED: 3, +}; +/** Pedal type as string. */ +PedalMarking.typeString = { + text: PedalMarking.type.TEXT, + bracket: PedalMarking.type.BRACKET, + mixed: PedalMarking.type.MIXED, +}; + + +/***/ }), + +/***/ "./src/registry.ts": +/*!*************************!*\ + !*** ./src/registry.ts ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Registry": () => (/* binding */ Registry) +/* harmony export */ }); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// @author Mohit Cheppudira +// +// ## Description +// +// This file implements a registry for VexFlow elements. It allows users +// to track, query, and manage some subset of generated elements, and +// dynamically get and set attributes. +// +// There are two ways to register with a registry: +// +// 1) Explicitly call `registry.register(elem:Element, id?:string)`, or, +// 2) Call `Registry.enableDefaultRegistry(registry)` when ready, and all future +// elements will automatically register with it. +// +// Once an element is registered, selected attributes are tracked and indexed by +// the registry. This allows fast look up of elements by attributes like id, type, +// and class. + +// Indexes are represented as maps of maps of maps. This allows +// for both multi-labeling (e.g., an element can have multiple classes) +// and efficient lookup. +class Index { + constructor() { + this.id = {}; + this.type = {}; + this.class = {}; + } +} +class Registry { + constructor() { + this.index = new Index(); + } + static getDefaultRegistry() { + return Registry.defaultRegistry; + } + // If you call `enableDefaultRegistry`, any new elements will auto-register with + // the provided registry as soon as they're constructed. + static enableDefaultRegistry(registry) { + Registry.defaultRegistry = registry; + } + static disableDefaultRegistry() { + Registry.defaultRegistry = undefined; + } + clear() { + this.index = new Index(); + return this; + } + setIndexValue(name, value, id, elem) { + const index = this.index; + if (!index[name][value]) { + index[name][value] = {}; + } + index[name][value][id] = elem; + } + // Updates the indexes for element 'id'. If an element's attribute changes + // from A -> B, make sure to remove the element from A. + updateIndex({ id, name, value, oldValue }) { + const elem = this.getElementById(id); + if (oldValue !== undefined && this.index[name][oldValue]) { + delete this.index[name][oldValue][id]; + } + if (value && elem) { + this.setIndexValue(name, value, elem.getAttribute('id'), elem); + } + } + /** + * Register element `elem` with this registry. + * This adds the element to its index and watches it for attribute changes. + * @param elem + * @param id + * @returns this + */ + register(elem, id) { + id = id || elem.getAttribute('id'); + if (!id) { + throw new _util__WEBPACK_IMPORTED_MODULE_0__.RuntimeError("Can't add element without `id` attribute to registry"); + } + // Manually add id to index, then update other indexes. + elem.setAttribute('id', id); + this.setIndexValue('id', id, id, elem); + this.updateIndex({ id, name: 'type', value: elem.getAttribute('type'), oldValue: undefined }); + elem.onRegister(this); + return this; + } + getElementById(id) { + var _a, _b; + return (_b = (_a = this.index.id) === null || _a === void 0 ? void 0 : _a[id]) === null || _b === void 0 ? void 0 : _b[id]; // return undefined if the id is not found. + } + getElementsByAttribute(attribute, value) { + const index_attr = this.index[attribute]; + if (index_attr) { + const index_attr_val = index_attr[value]; + if (index_attr_val) { + const keys = Object.keys(index_attr_val); + return keys.map((k) => index_attr_val[k]); + } + } + return []; + } + getElementsByType(type) { + return this.getElementsByAttribute('type', type); + } + getElementsByClass(className) { + return this.getElementsByAttribute('class', className); + } + // This is called by the element when an attribute value changes. If an indexed + // attribute changes, then update the local index. + onUpdate(info) { + const allowedNames = ['id', 'type', 'class']; + if (allowedNames.includes(info.name)) { + this.updateIndex(info); + } + return this; + } +} + + +/***/ }), + +/***/ "./src/rendercontext.ts": +/*!******************************!*\ + !*** ./src/rendercontext.ts ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "RenderContext": () => (/* binding */ RenderContext), +/* harmony export */ "drawDot": () => (/* binding */ drawDot) +/* harmony export */ }); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2021. +// MIT License + +class RenderContext { + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_0__.Category.RenderContext; + } + set font(f) { + this.setFont(f); + } + get font() { + return this.getFont(); + } + /** + * This is kept for backwards compatibility with 3.0.9. + * @deprecated use `setFont(...)` instead since it now supports CSS font shorthand. + */ + setRawFont(f) { + this.setFont(f); + return this; + } +} +/** + * Draw a tiny dot marker on the specified context. A great debugging aid. + * @param ctx context + * @param x dot x coordinate + * @param y dot y coordinate + * @param color + */ +function drawDot(ctx, x, y, color = '#F55') { + ctx.save(); + ctx.setFillStyle(color); + // draw a circle + ctx.beginPath(); + ctx.arc(x, y, 3, 0, Math.PI * 2, true); + ctx.closePath(); + ctx.fill(); + ctx.restore(); +} + + +/***/ }), + +/***/ "./src/renderer.ts": +/*!*************************!*\ + !*** ./src/renderer.ts ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "RendererBackends": () => (/* binding */ RendererBackends), +/* harmony export */ "RendererLineEndType": () => (/* binding */ RendererLineEndType), +/* harmony export */ "Renderer": () => (/* binding */ Renderer) +/* harmony export */ }); +/* harmony import */ var _canvascontext__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./canvascontext */ "./src/canvascontext.ts"); +/* harmony import */ var _svgcontext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./svgcontext */ "./src/svgcontext.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +/* harmony import */ var _web__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./web */ "./src/web.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + +var RendererBackends; +(function (RendererBackends) { + RendererBackends[RendererBackends["CANVAS"] = 1] = "CANVAS"; + RendererBackends[RendererBackends["SVG"] = 2] = "SVG"; +})(RendererBackends || (RendererBackends = {})); +// End of line types +var RendererLineEndType; +(function (RendererLineEndType) { + RendererLineEndType[RendererLineEndType["NONE"] = 1] = "NONE"; + RendererLineEndType[RendererLineEndType["UP"] = 2] = "UP"; + RendererLineEndType[RendererLineEndType["DOWN"] = 3] = "DOWN"; +})(RendererLineEndType || (RendererLineEndType = {})); +/** + * Support Canvas & SVG rendering contexts. + */ +class Renderer { + constructor(arg0, arg1) { + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_2__.isRenderContext)(arg0)) { + // The user has provided what looks like a RenderContext, let's just use it. + this.ctx = arg0; + } + else { + if (arg1 === undefined) { + // The backend must be specified if the render context isn't directly provided. + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('InvalidArgument', 'Missing backend argument'); + } + const backend = arg1; + let element; + if (typeof arg0 == 'string') { + const maybeElement = document.getElementById(arg0); + if (!maybeElement) { + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('BadElementId', `Can't find element with ID "${maybeElement}"`); + } + element = maybeElement; + } + else { + element = arg0; + } + // Verify backend and create context + if (backend === Renderer.Backends.CANVAS) { + if (!(0,_web__WEBPACK_IMPORTED_MODULE_4__.isHTMLCanvas)(element)) { + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('BadElement', 'CANVAS context requires an HTMLCanvasElement.'); + } + const context = element.getContext('2d'); + if (!context) { + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('BadElement', "Can't get canvas context"); + } + this.ctx = new _canvascontext__WEBPACK_IMPORTED_MODULE_0__.CanvasContext(context); + } + else if (backend === Renderer.Backends.SVG) { + if (!(0,_web__WEBPACK_IMPORTED_MODULE_4__.isHTMLDiv)(element)) { + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('BadElement', 'SVG context requires an HTMLDivElement.'); + } + this.ctx = new _svgcontext__WEBPACK_IMPORTED_MODULE_1__.SVGContext(element); + } + else { + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('InvalidBackend', `No support for backend: ${backend}`); + } + } + } + static buildContext(elementId, backend, width, height, background = '#FFF') { + const renderer = new Renderer(elementId, backend); + if (width && height) { + renderer.resize(width, height); + } + const ctx = renderer.getContext(); + ctx.setBackgroundFillStyle(background); + Renderer.lastContext = ctx; + return ctx; + } + static getCanvasContext(elementId, width, height, background) { + return Renderer.buildContext(elementId, Renderer.Backends.CANVAS, width, height, background); + } + static getSVGContext(elementId, width, height, background) { + return Renderer.buildContext(elementId, Renderer.Backends.SVG, width, height, background); + } + // Draw a dashed line (horizontal, vertical or diagonal + // dashPattern = [3,3] draws a 3 pixel dash followed by a three pixel space. + // setting the second number to 0 draws a solid line. + static drawDashedLine(context, fromX, fromY, toX, toY, dashPattern) { + context.beginPath(); + const dx = toX - fromX; + const dy = toY - fromY; + const angle = Math.atan2(dy, dx); + let x = fromX; + let y = fromY; + context.moveTo(fromX, fromY); + let idx = 0; + let draw = true; + while (!((dx < 0 ? x <= toX : x >= toX) && (dy < 0 ? y <= toY : y >= toY))) { + const dashLength = dashPattern[idx++ % dashPattern.length]; + const nx = x + Math.cos(angle) * dashLength; + x = dx < 0 ? Math.max(toX, nx) : Math.min(toX, nx); + const ny = y + Math.sin(angle) * dashLength; + y = dy < 0 ? Math.max(toY, ny) : Math.min(toY, ny); + if (draw) { + context.lineTo(x, y); + } + else { + context.moveTo(x, y); + } + draw = !draw; + } + context.closePath(); + context.stroke(); + } + resize(width, height) { + this.ctx.resize(width, height); + return this; + } + getContext() { + return this.ctx; + } +} +Renderer.Backends = RendererBackends; +Renderer.LineEndType = RendererLineEndType; +// Used by vexflow_test_helpers.ts +// Should this be private? +// Can we do this in a cleaner way? +Renderer.lastContext = undefined; + + +/***/ }), + +/***/ "./src/repeatnote.ts": +/*!***************************!*\ + !*** ./src/repeatnote.ts ***! + \***************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "RepeatNote": () => (/* binding */ RepeatNote) +/* harmony export */ }); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _glyphnote__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./glyphnote */ "./src/glyphnote.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. + + + + +// Map `type` to SMuFL glyph code. +const CODES = { + '1': 'repeat1Bar', + '2': 'repeat2Bars', + '4': 'repeat4Bars', + slash: 'repeatBarSlash', +}; +class RepeatNote extends _glyphnote__WEBPACK_IMPORTED_MODULE_1__.GlyphNote { + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.RepeatNote; + } + constructor(type, noteStruct, options) { + super(undefined, Object.assign({ duration: 'q', align_center: type !== 'slash' }, noteStruct), options); + const glyphCode = CODES[type] || 'repeat1Bar'; + const glyph = new _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph(glyphCode, _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.currentMusicFont().lookupMetric('repeatNote.point', 40), { + category: 'repeatNote', + }); + this.setGlyph(glyph); + } +} + + +/***/ }), + +/***/ "./src/stave.ts": +/*!**********************!*\ + !*** ./src/stave.ts ***! + \**********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Stave": () => (/* binding */ Stave) +/* harmony export */ }); +/* harmony import */ var _boundingbox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./boundingbox */ "./src/boundingbox.ts"); +/* harmony import */ var _clef__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./clef */ "./src/clef.ts"); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _keysignature__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./keysignature */ "./src/keysignature.ts"); +/* harmony import */ var _stavebarline__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./stavebarline */ "./src/stavebarline.ts"); +/* harmony import */ var _stavemodifier__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./stavemodifier */ "./src/stavemodifier.ts"); +/* harmony import */ var _staverepetition__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./staverepetition */ "./src/staverepetition.ts"); +/* harmony import */ var _stavesection__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./stavesection */ "./src/stavesection.ts"); +/* harmony import */ var _stavetempo__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./stavetempo */ "./src/stavetempo.ts"); +/* harmony import */ var _stavetext__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./stavetext */ "./src/stavetext.ts"); +/* harmony import */ var _stavevolta__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./stavevolta */ "./src/stavevolta.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _timesignature__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./timesignature */ "./src/timesignature.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + + + + + + + + + + + + +// Used by Stave.format() to sort the modifiers at the beginning and end of a stave. +// The keys (computed property names) match the CATEGORY property in the +// Barline, Clef, KeySignature, TimeSignature classes. +const SORT_ORDER_BEG_MODIFIERS = { + [_stavebarline__WEBPACK_IMPORTED_MODULE_5__.Barline.CATEGORY]: 0, + [_clef__WEBPACK_IMPORTED_MODULE_1__.Clef.CATEGORY]: 1, + [_keysignature__WEBPACK_IMPORTED_MODULE_4__.KeySignature.CATEGORY]: 2, + [_timesignature__WEBPACK_IMPORTED_MODULE_13__.TimeSignature.CATEGORY]: 3, +}; +const SORT_ORDER_END_MODIFIERS = { + [_timesignature__WEBPACK_IMPORTED_MODULE_13__.TimeSignature.CATEGORY]: 0, + [_keysignature__WEBPACK_IMPORTED_MODULE_4__.KeySignature.CATEGORY]: 1, + [_stavebarline__WEBPACK_IMPORTED_MODULE_5__.Barline.CATEGORY]: 2, + [_clef__WEBPACK_IMPORTED_MODULE_1__.Clef.CATEGORY]: 3, +}; +class Stave extends _element__WEBPACK_IMPORTED_MODULE_2__.Element { + constructor(x, y, width, options) { + super(); + // Initialized by the constructor via this.resetLines(). + this.height = 0; + this.x = x; + this.y = y; + this.width = width; + this.formatted = false; + this.start_x = x + 5; + this.end_x = x + width; + this.modifiers = []; // stave modifiers (clef, key, time, barlines, coda, segno, etc.) + this.measure = 0; + this.clef = 'treble'; + this.endClef = undefined; + this.resetFont(); + this.options = Object.assign({ vertical_bar_width: 10, num_lines: 5, fill_style: '#999999', left_bar: true, right_bar: true, spacing_between_lines_px: _tables__WEBPACK_IMPORTED_MODULE_12__.Tables.STAVE_LINE_DISTANCE, space_above_staff_ln: 4, space_below_staff_ln: 4, top_text_position: 1, bottom_text_position: 4, line_config: [] }, options); + this.bounds = { x: this.x, y: this.y, w: this.width, h: 0 }; + this.defaultLedgerLineStyle = { strokeStyle: '#444', lineWidth: 1.4 }; + this.resetLines(); + // beg bar + this.addModifier(new _stavebarline__WEBPACK_IMPORTED_MODULE_5__.Barline(this.options.left_bar ? _stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.SINGLE : _stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.NONE)); + // end bar + this.addEndModifier(new _stavebarline__WEBPACK_IMPORTED_MODULE_5__.Barline(this.options.right_bar ? _stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.SINGLE : _stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.NONE)); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_14__.Category.Stave; + } + // This is the sum of the padding that normally goes on left + right of a stave during + // drawing. Used to size staves correctly with content width. + static get defaultPadding() { + const musicFont = _tables__WEBPACK_IMPORTED_MODULE_12__.Tables.currentMusicFont(); + return musicFont.lookupMetric('stave.padding') + musicFont.lookupMetric('stave.endPaddingMax'); + } + // Right padding, used by system if startX is already determined. + static get rightPadding() { + const musicFont = _tables__WEBPACK_IMPORTED_MODULE_12__.Tables.currentMusicFont(); + return musicFont.lookupMetric('stave.endPaddingMax'); + } + /** Set default style for ledger lines. */ + setDefaultLedgerLineStyle(style) { + this.defaultLedgerLineStyle = style; + } + /** Get default style for ledger lines. */ + getDefaultLedgerLineStyle() { + return Object.assign(Object.assign({}, this.getStyle()), this.defaultLedgerLineStyle); + } + space(spacing) { + return this.options.spacing_between_lines_px * spacing; + } + resetLines() { + this.options.line_config = []; + for (let i = 0; i < this.options.num_lines; i++) { + this.options.line_config.push({ visible: true }); + } + this.height = (this.options.num_lines + this.options.space_above_staff_ln) * this.options.spacing_between_lines_px; + this.options.bottom_text_position = this.options.num_lines; + } + setNoteStartX(x) { + if (!this.formatted) + this.format(); + this.start_x = x; + const begBarline = this.modifiers[0]; + begBarline.setX(this.start_x - begBarline.getWidth()); + return this; + } + getNoteStartX() { + if (!this.formatted) + this.format(); + return this.start_x; + } + getNoteEndX() { + if (!this.formatted) + this.format(); + return this.end_x; + } + getTieStartX() { + return this.start_x; + } + getTieEndX() { + return this.end_x; + } + getX() { + return this.x; + } + getNumLines() { + return this.options.num_lines; + } + setNumLines(n) { + this.options.num_lines = n; + this.resetLines(); + return this; + } + setY(y) { + this.y = y; + return this; + } + getY() { + return this.y; + } + getTopLineTopY() { + return this.getYForLine(0) - _tables__WEBPACK_IMPORTED_MODULE_12__.Tables.STAVE_LINE_THICKNESS / 2; + } + getBottomLineBottomY() { + return this.getYForLine(this.getNumLines() - 1) + _tables__WEBPACK_IMPORTED_MODULE_12__.Tables.STAVE_LINE_THICKNESS / 2; + } + setX(x) { + const shift = x - this.x; + this.formatted = false; + this.x = x; + this.start_x += shift; + this.end_x += shift; + for (let i = 0; i < this.modifiers.length; i++) { + const mod = this.modifiers[i]; + mod.setX(mod.getX() + shift); + } + return this; + } + setWidth(width) { + this.formatted = false; + this.width = width; + this.end_x = this.x + width; + // reset the x position of the end barline (TODO(0xfe): This makes no sense) + // this.modifiers[1].setX(this.end_x); + return this; + } + getWidth() { + return this.width; + } + getStyle() { + return Object.assign({ fillStyle: this.options.fill_style, strokeStyle: this.options.fill_style, lineWidth: _tables__WEBPACK_IMPORTED_MODULE_12__.Tables.STAVE_LINE_THICKNESS }, this.style); + } + setMeasure(measure) { + this.measure = measure; + return this; + } + /** + * Gets the pixels to shift from the beginning of the stave + * following the modifier at the provided index + * @param {Number} index The index from which to determine the shift + * @return {Number} The amount of pixels shifted + */ + getModifierXShift(index = 0) { + if (typeof index !== 'number') { + throw new _util__WEBPACK_IMPORTED_MODULE_15__.RuntimeError('InvalidIndex', 'Must be of number type'); + } + if (!this.formatted) + this.format(); + if (this.getModifiers(_stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.BEGIN).length === 1) { + return 0; + } + // for right position modifiers zero shift seems correct, see 'Volta + Modifier Measure Test' + if (this.modifiers[index].getPosition() === _stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.RIGHT) { + return 0; + } + let start_x = this.start_x - this.x; + const begBarline = this.modifiers[0]; + if (begBarline.getType() === _stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.REPEAT_BEGIN && start_x > begBarline.getWidth()) { + start_x -= begBarline.getWidth(); + } + return start_x; + } + /** Coda & Segno Symbol functions */ + setRepetitionType(type, yShift = 0) { + this.modifiers.push(new _staverepetition__WEBPACK_IMPORTED_MODULE_7__.Repetition(type, this.x, yShift)); + return this; + } + // Volta functions + setVoltaType(type, number_t, y) { + this.modifiers.push(new _stavevolta__WEBPACK_IMPORTED_MODULE_11__.Volta(type, number_t, this.x, y)); + return this; + } + // Section functions + setSection(section, y, xOffset = 0, fontSize) { + const staveSection = new _stavesection__WEBPACK_IMPORTED_MODULE_8__.StaveSection(section, this.x + xOffset, y); + if (fontSize) + staveSection.setFontSize(fontSize); + this.modifiers.push(staveSection); + return this; + } + // Tempo functions + setTempo(tempo, y) { + this.modifiers.push(new _stavetempo__WEBPACK_IMPORTED_MODULE_9__.StaveTempo(tempo, this.x, y)); + return this; + } + // Text functions + setText(text, position, options = {}) { + this.modifiers.push(new _stavetext__WEBPACK_IMPORTED_MODULE_10__.StaveText(text, position, options)); + return this; + } + getHeight() { + return this.height; + } + getSpacingBetweenLines() { + return this.options.spacing_between_lines_px; + } + getBoundingBox() { + return new _boundingbox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox(this.x, this.y, this.width, this.getBottomY() - this.y); + } + getBottomY() { + const options = this.options; + const spacing = options.spacing_between_lines_px; + const score_bottom = this.getYForLine(options.num_lines) + options.space_below_staff_ln * spacing; + return score_bottom; + } + getBottomLineY() { + return this.getYForLine(this.options.num_lines); + } + // This returns + /** @returns the y for the *center* of a staff line */ + getYForLine(line) { + const options = this.options; + const spacing = options.spacing_between_lines_px; + const headroom = options.space_above_staff_ln; + const y = this.y + line * spacing + headroom * spacing; + return y; + } + getLineForY(y) { + // Does the reverse of getYForLine - somewhat dumb and just calls + // getYForLine until the right value is reaches + const options = this.options; + const spacing = options.spacing_between_lines_px; + const headroom = options.space_above_staff_ln; + return (y - this.y) / spacing - headroom; + } + getYForTopText(line = 0) { + return this.getYForLine(-line - this.options.top_text_position); + } + getYForBottomText(line = 0) { + return this.getYForLine(this.options.bottom_text_position + line); + } + getYForNote(line) { + const options = this.options; + const spacing = options.spacing_between_lines_px; + const headroom = options.space_above_staff_ln; + return this.y + headroom * spacing + 5 * spacing - line * spacing; + } + getYForGlyphs() { + return this.getYForLine(3); + } + // This method adds a stave modifier to the stave. Note that the first two + // modifiers (BarLines) are automatically added upon construction. + addModifier(modifier, position) { + if (position !== undefined) { + modifier.setPosition(position); + } + modifier.setStave(this); + this.formatted = false; + this.modifiers.push(modifier); + return this; + } + addEndModifier(modifier) { + this.addModifier(modifier, _stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.END); + return this; + } + // Bar Line functions + setBegBarType(type) { + // Only valid bar types at beginning of stave is none, single or begin repeat + const { SINGLE, REPEAT_BEGIN, NONE } = _stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType; + if (type === SINGLE || type === REPEAT_BEGIN || type === NONE) { + this.modifiers[0].setType(type); + this.formatted = false; + } + return this; + } + setEndBarType(type) { + // Repeat end not valid at end of stave + if (type !== _stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.REPEAT_BEGIN) { + this.modifiers[1].setType(type); + this.formatted = false; + } + return this; + } + setClef(clefSpec, size, annotation, position) { + if (position === undefined) { + position = _stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.BEGIN; + } + if (position === _stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.END) { + this.endClef = clefSpec; + } + else { + this.clef = clefSpec; + } + const clefs = this.getModifiers(position, _clef__WEBPACK_IMPORTED_MODULE_1__.Clef.CATEGORY); + if (clefs.length === 0) { + this.addClef(clefSpec, size, annotation, position); + } + else { + clefs[0].setType(clefSpec, size, annotation); + } + return this; + } + getClef() { + return this.clef; + } + setEndClef(clefSpec, size, annotation) { + this.setClef(clefSpec, size, annotation, _stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.END); + return this; + } + getEndClef() { + return this.endClef; + } + setKeySignature(keySpec, cancelKeySpec, position) { + if (position === undefined) { + position = _stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.BEGIN; + } + const keySignatures = this.getModifiers(position, _keysignature__WEBPACK_IMPORTED_MODULE_4__.KeySignature.CATEGORY); + if (keySignatures.length === 0) { + this.addKeySignature(keySpec, cancelKeySpec, position); + } + else { + keySignatures[0].setKeySig(keySpec, cancelKeySpec); + } + return this; + } + setEndKeySignature(keySpec, cancelKeySpec) { + this.setKeySignature(keySpec, cancelKeySpec, _stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.END); + return this; + } + setTimeSignature(timeSpec, customPadding, position) { + if (position === undefined) { + position = _stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.BEGIN; + } + const timeSignatures = this.getModifiers(position, _timesignature__WEBPACK_IMPORTED_MODULE_13__.TimeSignature.CATEGORY); + if (timeSignatures.length === 0) { + this.addTimeSignature(timeSpec, customPadding, position); + } + else { + timeSignatures[0].setTimeSig(timeSpec); + } + return this; + } + setEndTimeSignature(timeSpec, customPadding) { + this.setTimeSignature(timeSpec, customPadding, _stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.END); + return this; + } + /** + * Add a key signature to the stave. + * + * Example: + * `stave.addKeySignature('Db');` + * @param keySpec new key specification `[A-G][b|#]?` + * @param cancelKeySpec + * @param position + * @returns + */ + addKeySignature(keySpec, cancelKeySpec, position) { + if (position === undefined) { + position = _stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.BEGIN; + } + this.addModifier(new _keysignature__WEBPACK_IMPORTED_MODULE_4__.KeySignature(keySpec, cancelKeySpec).setPosition(position), position); + return this; + } + /** + * Add a clef to the stave. + * + * Example: + * + * stave.addClef('treble') + * @param clef clef (treble|bass|...) see {@link Clef.types} + * @param size + * @param annotation + * @param position + * @returns + */ + addClef(clef, size, annotation, position) { + if (position === undefined || position === _stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.BEGIN) { + this.clef = clef; + } + else if (position === _stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.END) { + this.endClef = clef; + } + this.addModifier(new _clef__WEBPACK_IMPORTED_MODULE_1__.Clef(clef, size, annotation), position); + return this; + } + addEndClef(clef, size, annotation) { + this.addClef(clef, size, annotation, _stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.END); + return this; + } + /** + * Add a time signature to the stave + * + * Example: + * + * `stave.addTimeSignature('4/4');` + * @param timeSpec time signature specification `(C\||C|\d\/\d)` + * @param customPadding + * @param position + * @returns + */ + addTimeSignature(timeSpec, customPadding, position) { + this.addModifier(new _timesignature__WEBPACK_IMPORTED_MODULE_13__.TimeSignature(timeSpec, customPadding), position); + return this; + } + addEndTimeSignature(timeSpec, customPadding) { + this.addTimeSignature(timeSpec, customPadding, _stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.END); + return this; + } + // Deprecated + addTrebleGlyph() { + this.addClef('treble'); + return this; + } + /** + * @param position + * @param category + * @returns array of StaveModifiers that match the provided position and category. + */ + getModifiers(position, category) { + const noPosition = position === undefined; + const noCategory = category === undefined; + if (noPosition && noCategory) { + return this.modifiers; + } + else if (noPosition) { + // A category was provided. + return this.modifiers.filter((m) => category === m.getCategory()); + } + else if (noCategory) { + // A position was provided. + return this.modifiers.filter((m) => position === m.getPosition()); + } + else { + // Both position and category were provided! + return this.modifiers.filter((m) => position === m.getPosition() && category === m.getCategory()); + } + } + /** + * Use the modifier's `getCategory()` as a key for the `order` array. + * The retrieved value is used to sort modifiers from left to right (0 to to 3). + */ + sortByCategory(items, order) { + for (let i = items.length - 1; i >= 0; i--) { + for (let j = 0; j < i; j++) { + if (order[items[j].getCategory()] > order[items[j + 1].getCategory()]) { + const temp = items[j]; + items[j] = items[j + 1]; + items[j + 1] = temp; + } + } + } + } + format() { + const begBarline = this.modifiers[0]; + const endBarline = this.modifiers[1]; + const begModifiers = this.getModifiers(_stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.BEGIN); + const endModifiers = this.getModifiers(_stavemodifier__WEBPACK_IMPORTED_MODULE_6__.StaveModifierPosition.END); + this.sortByCategory(begModifiers, SORT_ORDER_BEG_MODIFIERS); + this.sortByCategory(endModifiers, SORT_ORDER_END_MODIFIERS); + if (begModifiers.length > 1 && begBarline.getType() === _stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.REPEAT_BEGIN) { + begModifiers.push(begModifiers.splice(0, 1)[0]); + begModifiers.splice(0, 0, new _stavebarline__WEBPACK_IMPORTED_MODULE_5__.Barline(_stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.SINGLE)); + } + if (endModifiers.indexOf(endBarline) > 0) { + endModifiers.splice(0, 0, new _stavebarline__WEBPACK_IMPORTED_MODULE_5__.Barline(_stavebarline__WEBPACK_IMPORTED_MODULE_5__.BarlineType.NONE)); + } + let width; + let padding; + let modifier; + let offset = 0; + let x = this.x; + for (let i = 0; i < begModifiers.length; i++) { + modifier = begModifiers[i]; + padding = modifier.getPadding(i + offset); + width = modifier.getWidth(); + x += padding; + modifier.setX(x); + x += width; + if (padding + width === 0) + offset--; + } + this.start_x = x; + x = this.x + this.width; + const widths = { + left: 0, + right: 0, + paddingRight: 0, + paddingLeft: 0, + }; + let lastBarlineIdx = 0; + for (let i = 0; i < endModifiers.length; i++) { + modifier = endModifiers[i]; + lastBarlineIdx = (0,_typeguard__WEBPACK_IMPORTED_MODULE_14__.isBarline)(modifier) ? i : lastBarlineIdx; + widths.right = 0; + widths.left = 0; + widths.paddingRight = 0; + widths.paddingLeft = 0; + const layoutMetrics = modifier.getLayoutMetrics(); + if (layoutMetrics) { + if (i !== 0) { + widths.right = layoutMetrics.xMax || 0; + widths.paddingRight = layoutMetrics.paddingRight || 0; + } + widths.left = -layoutMetrics.xMin || 0; + widths.paddingLeft = layoutMetrics.paddingLeft || 0; + if (i === endModifiers.length - 1) { + widths.paddingLeft = 0; + } + } + else { + widths.paddingRight = modifier.getPadding(i - lastBarlineIdx); + if (i !== 0) { + widths.right = modifier.getWidth(); + } + if (i === 0) { + widths.left = modifier.getWidth(); + } + } + x -= widths.paddingRight; + x -= widths.right; + modifier.setX(x); + x -= widths.left; + x -= widths.paddingLeft; + } + this.end_x = endModifiers.length === 1 ? this.x + this.width : x; + this.formatted = true; + } + /** + * All drawing functions below need the context to be set. + */ + draw() { + const ctx = this.checkContext(); + this.setRendered(); + ctx.openGroup('stave', this.getAttribute('id')); + if (!this.formatted) + this.format(); + const num_lines = this.options.num_lines; + const width = this.width; + const x = this.x; + let y; + // Render lines + for (let line = 0; line < num_lines; line++) { + y = this.getYForLine(line); + this.applyStyle(); + if (this.options.line_config[line].visible) { + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.lineTo(x + width, y); + ctx.stroke(); + } + this.restoreStyle(); + } + // Draw the modifiers (bar lines, coda, segno, repeat brackets, etc.) + for (let i = 0; i < this.modifiers.length; i++) { + const modifier = this.modifiers[i]; + // Only draw modifier if it has a draw function + if (typeof modifier.draw === 'function') { + modifier.applyStyle(ctx); + modifier.draw(this, this.getModifierXShift(i)); + modifier.restoreStyle(ctx); + } + } + // Render measure numbers + if (this.measure > 0) { + ctx.save(); + ctx.setFont(this.textFont); + const textWidth = ctx.measureText('' + this.measure).width; + y = this.getYForTopText(0) + 3; + ctx.fillText('' + this.measure, this.x - textWidth / 2, y); + ctx.restore(); + } + ctx.closeGroup(); + return this; + } + getVerticalBarWidth() { + return this.options.vertical_bar_width; + } + /** + * Get the current configuration for the Stave. + * @return {Array} An array of configuration objects. + */ + getConfigForLines() { + return this.options.line_config; + } + /** + * Configure properties of the lines in the Stave + * @param line_number The index of the line to configure. + * @param line_config An configuration object for the specified line. + * @throws RuntimeError "StaveConfigError" When the specified line number is out of + * range of the number of lines specified in the constructor. + */ + setConfigForLine(line_number, line_config) { + if (line_number >= this.options.num_lines || line_number < 0) { + throw new _util__WEBPACK_IMPORTED_MODULE_15__.RuntimeError('StaveConfigError', 'The line number must be within the range of the number of lines in the Stave.'); + } + if (line_config.visible === undefined) { + throw new _util__WEBPACK_IMPORTED_MODULE_15__.RuntimeError('StaveConfigError', "The line configuration object is missing the 'visible' property."); + } + if (typeof line_config.visible !== 'boolean') { + throw new _util__WEBPACK_IMPORTED_MODULE_15__.RuntimeError('StaveConfigError', "The line configuration objects 'visible' property must be true or false."); + } + this.options.line_config[line_number] = line_config; + return this; + } + /** + * Set the staff line configuration array for all of the lines at once. + * @param lines_configuration An array of line configuration objects. These objects + * are of the same format as the single one passed in to setLineConfiguration(). + * The caller can set null for any line config entry if it is desired that the default be used + * @throws RuntimeError "StaveConfigError" When the lines_configuration array does not have + * exactly the same number of elements as the num_lines configuration object set in + * the constructor. + */ + setConfigForLines(lines_configuration) { + if (lines_configuration.length !== this.options.num_lines) { + throw new _util__WEBPACK_IMPORTED_MODULE_15__.RuntimeError('StaveConfigError', 'The length of the lines configuration array must match the number of lines in the Stave'); + } + // Make sure the defaults are present in case an incomplete set of + // configuration options were supplied. + // eslint-disable-next-line + for (const line_config in lines_configuration) { + // Allow '{}' to be used if the caller just wants the default for a particular node. + if (lines_configuration[line_config].visible == undefined) { + lines_configuration[line_config] = this.options.line_config[line_config]; + } + this.options.line_config[line_config] = Object.assign(Object.assign({}, this.options.line_config[line_config]), lines_configuration[line_config]); + } + this.options.line_config = lines_configuration; + return this; + } +} +Stave.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_3__.Font.SANS_SERIF, + size: 8, + weight: _font__WEBPACK_IMPORTED_MODULE_3__.FontWeight.NORMAL, + style: _font__WEBPACK_IMPORTED_MODULE_3__.FontStyle.NORMAL, +}; + + +/***/ }), + +/***/ "./src/stavebarline.ts": +/*!*****************************!*\ + !*** ./src/stavebarline.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "BarlineType": () => (/* binding */ BarlineType), +/* harmony export */ "Barline": () => (/* binding */ Barline) +/* harmony export */ }); +/* harmony import */ var _stavemodifier__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./stavemodifier */ "./src/stavemodifier.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// Author Larry Kuhns 2011 + + + +var BarlineType; +(function (BarlineType) { + BarlineType[BarlineType["SINGLE"] = 1] = "SINGLE"; + BarlineType[BarlineType["DOUBLE"] = 2] = "DOUBLE"; + BarlineType[BarlineType["END"] = 3] = "END"; + BarlineType[BarlineType["REPEAT_BEGIN"] = 4] = "REPEAT_BEGIN"; + BarlineType[BarlineType["REPEAT_END"] = 5] = "REPEAT_END"; + BarlineType[BarlineType["REPEAT_BOTH"] = 6] = "REPEAT_BOTH"; + BarlineType[BarlineType["NONE"] = 7] = "NONE"; +})(BarlineType || (BarlineType = {})); +class Barline extends _stavemodifier__WEBPACK_IMPORTED_MODULE_0__.StaveModifier { + constructor(type) { + super(); + this.thickness = _tables__WEBPACK_IMPORTED_MODULE_1__.Tables.STAVE_LINE_THICKNESS; + const TYPE = BarlineType; + this.widths = {}; + this.widths[TYPE.SINGLE] = 5; + this.widths[TYPE.DOUBLE] = 5; + this.widths[TYPE.END] = 5; + this.widths[TYPE.REPEAT_BEGIN] = 5; + this.widths[TYPE.REPEAT_END] = 5; + this.widths[TYPE.REPEAT_BOTH] = 5; + this.widths[TYPE.NONE] = 5; + this.paddings = {}; + this.paddings[TYPE.SINGLE] = 0; + this.paddings[TYPE.DOUBLE] = 0; + this.paddings[TYPE.END] = 0; + this.paddings[TYPE.REPEAT_BEGIN] = 15; + this.paddings[TYPE.REPEAT_END] = 15; + this.paddings[TYPE.REPEAT_BOTH] = 15; + this.paddings[TYPE.NONE] = 0; + this.layoutMetricsMap = {}; + this.layoutMetricsMap[TYPE.SINGLE] = { + xMin: 0, + xMax: 1, + paddingLeft: 5, + paddingRight: 5, + }; + this.layoutMetricsMap[TYPE.DOUBLE] = { + xMin: -3, + xMax: 1, + paddingLeft: 5, + paddingRight: 5, + }; + this.layoutMetricsMap[TYPE.END] = { + xMin: -5, + xMax: 1, + paddingLeft: 5, + paddingRight: 5, + }; + this.layoutMetricsMap[TYPE.REPEAT_END] = { + xMin: -10, + xMax: 1, + paddingLeft: 5, + paddingRight: 5, + }; + this.layoutMetricsMap[TYPE.REPEAT_BEGIN] = { + xMin: -2, + xMax: 10, + paddingLeft: 5, + paddingRight: 5, + }; + this.layoutMetricsMap[TYPE.REPEAT_BOTH] = { + xMin: -10, + xMax: 10, + paddingLeft: 5, + paddingRight: 5, + }; + this.layoutMetricsMap[TYPE.NONE] = { + xMin: 0, + xMax: 0, + paddingLeft: 5, + paddingRight: 5, + }; + this.setPosition(_stavemodifier__WEBPACK_IMPORTED_MODULE_0__.StaveModifierPosition.BEGIN); + this.setType(type); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_2__.Category.Barline; + } + static get type() { + return BarlineType; + } + static get typeString() { + return { + single: BarlineType.SINGLE, + double: BarlineType.DOUBLE, + end: BarlineType.END, + repeatBegin: BarlineType.REPEAT_BEGIN, + repeatEnd: BarlineType.REPEAT_END, + repeatBoth: BarlineType.REPEAT_BOTH, + none: BarlineType.NONE, + }; + } + getType() { + return this.type; + } + setType(type) { + this.type = typeof type === 'string' ? Barline.typeString[type] : type; + this.setWidth(this.widths[this.type]); + this.setPadding(this.paddings[this.type]); + this.setLayoutMetrics(this.layoutMetricsMap[this.type]); + return this; + } + // Draw barlines + draw(stave) { + stave.checkContext(); + this.setRendered(); + switch (this.type) { + case BarlineType.SINGLE: + this.drawVerticalBar(stave, this.x, false); + break; + case BarlineType.DOUBLE: + this.drawVerticalBar(stave, this.x, true); + break; + case BarlineType.END: + this.drawVerticalEndBar(stave, this.x); + break; + case BarlineType.REPEAT_BEGIN: + // If the barline is shifted over (in front of clef/time/key) + // Draw vertical bar at the beginning. + this.drawRepeatBar(stave, this.x, true); + if (stave.getX() !== this.x) { + this.drawVerticalBar(stave, stave.getX()); + } + break; + case BarlineType.REPEAT_END: + this.drawRepeatBar(stave, this.x, false); + break; + case BarlineType.REPEAT_BOTH: + this.drawRepeatBar(stave, this.x, false); + this.drawRepeatBar(stave, this.x, true); + break; + default: + // Default is NONE, so nothing to draw + break; + } + } + drawVerticalBar(stave, x, double_bar) { + const staveCtx = stave.checkContext(); + const topY = stave.getTopLineTopY(); + const botY = stave.getBottomLineBottomY(); + if (double_bar) { + staveCtx.fillRect(x - 3, topY, 1, botY - topY); + } + staveCtx.fillRect(x, topY, 1, botY - topY); + } + drawVerticalEndBar(stave, x) { + const staveCtx = stave.checkContext(); + const topY = stave.getTopLineTopY(); + const botY = stave.getBottomLineBottomY(); + staveCtx.fillRect(x - 5, topY, 1, botY - topY); + staveCtx.fillRect(x - 2, topY, 3, botY - topY); + } + drawRepeatBar(stave, x, begin) { + const staveCtx = stave.checkContext(); + const topY = stave.getTopLineTopY(); + const botY = stave.getBottomLineBottomY(); + let x_shift = 3; + if (!begin) { + x_shift = -5; + } + staveCtx.fillRect(x + x_shift, topY, 1, botY - topY); + staveCtx.fillRect(x - 2, topY, 3, botY - topY); + const dot_radius = 2; + // Shift dots left or right + if (begin) { + x_shift += 4; + } + else { + x_shift -= 4; + } + const dot_x = x + x_shift + dot_radius / 2; + // calculate the y offset based on number of stave lines + let y_offset = (stave.getNumLines() - 1) * stave.getSpacingBetweenLines(); + y_offset = y_offset / 2 - stave.getSpacingBetweenLines() / 2; + let dot_y = topY + y_offset + dot_radius / 2; + // draw the top repeat dot + staveCtx.beginPath(); + staveCtx.arc(dot_x, dot_y, dot_radius, 0, Math.PI * 2, false); + staveCtx.fill(); + // draw the bottom repeat dot + dot_y += stave.getSpacingBetweenLines(); + staveCtx.beginPath(); + staveCtx.arc(dot_x, dot_y, dot_radius, 0, Math.PI * 2, false); + staveCtx.fill(); + } +} + + +/***/ }), + +/***/ "./src/staveconnector.ts": +/*!*******************************!*\ + !*** ./src/staveconnector.ts ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StaveConnector": () => (/* binding */ StaveConnector) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + + +function drawBoldDoubleLine(ctx, type, topX, topY, botY) { + if (type !== StaveConnector.type.BOLD_DOUBLE_LEFT && type !== StaveConnector.type.BOLD_DOUBLE_RIGHT) { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('InvalidConnector', 'A REPEAT_BEGIN or REPEAT_END type must be provided.'); + } + let x_shift = 3; + let variableWidth = 3.5; // Width for avoiding anti-aliasing width issues + const thickLineOffset = 2; // For aesthetics + if (type === StaveConnector.type.BOLD_DOUBLE_RIGHT) { + x_shift = -5; // Flips the side of the thin line + variableWidth = 3; + } + // Thin line + ctx.fillRect(topX + x_shift, topY, 1, botY - topY); + // Thick line + ctx.fillRect(topX - thickLineOffset, topY, variableWidth, botY - topY); +} +/** StaveConnector implements the connector lines between staves of a system. */ +class StaveConnector extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + constructor(top_stave, bottom_stave) { + super(); + this.thickness = _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.STAVE_LINE_THICKNESS; + this.width = 3; + this.top_stave = top_stave; + this.bottom_stave = bottom_stave; + this.type = StaveConnector.type.DOUBLE; + this.resetFont(); + // 1. Offset Bold Double Left to align with offset Repeat Begin bars + // 2. Offset BRACE type not to overlap with another StaveConnector + this.x_shift = 0; + this.texts = []; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_4__.Category.StaveConnector; + } + /** + * Set type. + * @param type see {@link StaveConnector.type} & {@link StaveConnector.typeString} + */ + setType(type) { + type = typeof type === 'string' ? StaveConnector.typeString[type] : type; + if (type >= StaveConnector.type.SINGLE_RIGHT && type <= StaveConnector.type.NONE) { + this.type = type; + } + return this; + } + /** Set optional associated Text. */ + setText(text, options = {}) { + this.texts.push({ + content: text, + options: Object.assign({ shift_x: 0, shift_y: 0 }, options), + }); + return this; + } + setXShift(x_shift) { + if (typeof x_shift !== 'number') { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('InvalidType', 'x_shift must be a Number'); + } + this.x_shift = x_shift; + return this; + } + getXShift() { + return this.x_shift; + } + /** Render connector and associated text. */ + draw() { + const ctx = this.checkContext(); + this.setRendered(); + let topY = this.top_stave.getYForLine(0); + let botY = this.bottom_stave.getYForLine(this.bottom_stave.getNumLines() - 1) + this.thickness; + let width = this.width; + let topX = this.top_stave.getX(); + const isRightSidedConnector = this.type === StaveConnector.type.SINGLE_RIGHT || + this.type === StaveConnector.type.BOLD_DOUBLE_RIGHT || + this.type === StaveConnector.type.THIN_DOUBLE; + if (isRightSidedConnector) { + topX = this.top_stave.getX() + this.top_stave.getWidth(); + } + let attachment_height = botY - topY; + switch (this.type) { + case StaveConnector.type.SINGLE: + width = 1; + break; + case StaveConnector.type.SINGLE_LEFT: + width = 1; + break; + case StaveConnector.type.SINGLE_RIGHT: + width = 1; + break; + case StaveConnector.type.DOUBLE: + topX -= this.width + 2; + topY -= this.thickness; + attachment_height += 0.5; + break; + case StaveConnector.type.BRACE: { + width = 12; + // May need additional code to draw brace + const x1 = this.top_stave.getX() - 2 + this.x_shift; + const y1 = topY; + const x3 = x1; + const y3 = botY; + const x2 = x1 - width; + const y2 = y1 + attachment_height / 2.0; + const cpx1 = x2 - 0.9 * width; + const cpy1 = y1 + 0.2 * attachment_height; + const cpx2 = x1 + 1.1 * width; + const cpy2 = y2 - 0.135 * attachment_height; + const cpx3 = cpx2; + const cpy3 = y2 + 0.135 * attachment_height; + const cpx4 = cpx1; + const cpy4 = y3 - 0.2 * attachment_height; + const cpx5 = x2 - width; + const cpy5 = cpy4; + const cpx6 = x1 + 0.4 * width; + const cpy6 = y2 + 0.135 * attachment_height; + const cpx7 = cpx6; + const cpy7 = y2 - 0.135 * attachment_height; + const cpx8 = cpx5; + const cpy8 = cpy1; + ctx.beginPath(); + ctx.moveTo(x1, y1); + ctx.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, x2, y2); + ctx.bezierCurveTo(cpx3, cpy3, cpx4, cpy4, x3, y3); + ctx.bezierCurveTo(cpx5, cpy5, cpx6, cpy6, x2, y2); + ctx.bezierCurveTo(cpx7, cpy7, cpx8, cpy8, x1, y1); + ctx.fill(); + ctx.stroke(); + break; + } + case StaveConnector.type.BRACKET: + topY -= 6; + botY += 6; + attachment_height = botY - topY; + _glyph__WEBPACK_IMPORTED_MODULE_2__.Glyph.renderGlyph(ctx, topX - 5, topY, 40, 'bracketTop'); + _glyph__WEBPACK_IMPORTED_MODULE_2__.Glyph.renderGlyph(ctx, topX - 5, botY, 40, 'bracketBottom'); + topX -= this.width + 2; + break; + case StaveConnector.type.BOLD_DOUBLE_LEFT: + drawBoldDoubleLine(ctx, this.type, topX + this.x_shift, topY, botY - this.thickness); + break; + case StaveConnector.type.BOLD_DOUBLE_RIGHT: + drawBoldDoubleLine(ctx, this.type, topX, topY, botY - this.thickness); + break; + case StaveConnector.type.THIN_DOUBLE: + width = 1; + attachment_height -= this.thickness; + break; + case StaveConnector.type.NONE: + break; + default: + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('InvalidType', `The provided StaveConnector.type (${this.type}) is invalid.`); + } + if (this.type !== StaveConnector.type.BRACE && + this.type !== StaveConnector.type.BOLD_DOUBLE_LEFT && + this.type !== StaveConnector.type.BOLD_DOUBLE_RIGHT && + this.type !== StaveConnector.type.NONE) { + ctx.fillRect(topX, topY, width, attachment_height); + } + // If the connector is a thin double barline, draw the paralell line + if (this.type === StaveConnector.type.THIN_DOUBLE) { + ctx.fillRect(topX - 3, topY, width, attachment_height); + } + ctx.save(); + ctx.setLineWidth(2); + ctx.setFont(this.textFont); + // Add stave connector text + for (let i = 0; i < this.texts.length; i++) { + const text = this.texts[i]; + const text_width = ctx.measureText('' + text.content).width; + const x = this.top_stave.getX() - text_width - 24 + text.options.shift_x; + const y = (this.top_stave.getYForLine(0) + this.bottom_stave.getBottomLineY()) / 2 + text.options.shift_y; + ctx.fillText('' + text.content, x, y + 4); + } + ctx.restore(); + } +} +StaveConnector.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_1__.Font.SERIF, + size: 16, + weight: _font__WEBPACK_IMPORTED_MODULE_1__.FontWeight.NORMAL, + style: _font__WEBPACK_IMPORTED_MODULE_1__.FontStyle.NORMAL, +}; +/** + * SINGLE_LEFT and SINGLE are the same value for compatibility + * with older versions of vexflow which didn't have right sided + * stave connectors. + */ +StaveConnector.type = { + SINGLE_RIGHT: 0, + SINGLE_LEFT: 1, + SINGLE: 1, + DOUBLE: 2, + BRACE: 3, + BRACKET: 4, + BOLD_DOUBLE_LEFT: 5, + BOLD_DOUBLE_RIGHT: 6, + THIN_DOUBLE: 7, + NONE: 8, +}; +/** + * Connector type: + * * "singleRight" + * * "singleLeft" + * * "single" + * * "double" + * * "brace" + * * "bracket" + * * "boldDoubleLeft" + * * "boldDoubleRight" + * * "thinDouble" + * * "none" + */ +StaveConnector.typeString = { + singleRight: StaveConnector.type.SINGLE_RIGHT, + singleLeft: StaveConnector.type.SINGLE_LEFT, + single: StaveConnector.type.SINGLE, + double: StaveConnector.type.DOUBLE, + brace: StaveConnector.type.BRACE, + bracket: StaveConnector.type.BRACKET, + boldDoubleLeft: StaveConnector.type.BOLD_DOUBLE_LEFT, + boldDoubleRight: StaveConnector.type.BOLD_DOUBLE_RIGHT, + thinDouble: StaveConnector.type.THIN_DOUBLE, + none: StaveConnector.type.NONE, +}; + + +/***/ }), + +/***/ "./src/stavehairpin.ts": +/*!*****************************!*\ + !*** ./src/stavehairpin.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StaveHairpin": () => (/* binding */ StaveHairpin) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// ## Description +// Author: Raffaele Viglianti, 2012 http://itisnotsound.wordpress.com/ +// +// This class implements hairpins between notes. +// Hairpins can be either crescendo or decrescendo. + + + + +class StaveHairpin extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + /** + * Create a new hairpin from the specified notes. + * + * @param {!Object} notes The notes to tie up. + * Notes is a struct that has: + * + * { + * first_note: Note, + * last_note: Note, + * } + * @param {!Object} type The type of hairpin + */ + constructor(notes, type) { + super(); + this.setNotes(notes); + this.hairpin = type; + this.position = _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.BELOW; + this.render_options = { + height: 10, + y_shift: 0, + left_shift_px: 0, + right_shift_px: 0, + right_shift_ticks: 0, + left_shift_ticks: 0, + }; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_2__.Category.StaveHairpin; + } + /* Helper function to convert ticks into pixels. + * Requires a Formatter with voices joined and formatted (to + * get pixels per tick) + * + * options is struct that has: + * + * { + * height: px, + * y_shift: px, // vertical offset + * left_shift_ticks: 0, // left horizontal offset expressed in ticks + * right_shift_ticks: 0 // right horizontal offset expressed in ticks + * } + * + **/ + static FormatByTicksAndDraw(ctx, formatter, notes, type, position, options) { + var _a, _b; + const ppt = formatter.pixelsPerTick; + if (ppt == null) { + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('BadArguments', 'A valid Formatter must be provide to draw offsets by ticks.'); + } + const l_shift_px = ppt * ((_a = options.left_shift_ticks) !== null && _a !== void 0 ? _a : 0); + const r_shift_px = ppt * ((_b = options.right_shift_ticks) !== null && _b !== void 0 ? _b : 0); + const hairpin_options = { + height: options.height, + y_shift: options.y_shift, + left_shift_px: l_shift_px, + right_shift_px: r_shift_px, + right_shift_ticks: 0, + left_shift_ticks: 0, + }; + new StaveHairpin({ + first_note: notes.first_note, + last_note: notes.last_note, + }, type) + .setContext(ctx) + .setRenderOptions(hairpin_options) + .setPosition(position) + .draw(); + } + setPosition(position) { + if (position === _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.ABOVE || position === _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.BELOW) { + this.position = position; + } + return this; + } + setRenderOptions(options) { + if (options.height != null && + options.y_shift != null && + options.left_shift_px != null && + options.right_shift_px != null) { + this.render_options = options; + } + return this; + } + /** + * Set the notes to attach this hairpin to. + * + * @param {!Object} notes The start and end notes. + */ + setNotes(notes) { + if (!notes.first_note && !notes.last_note) { + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('BadArguments', 'Hairpin needs to have either first_note or last_note set.'); + } + this.notes = notes; + this.first_note = notes.first_note; + this.last_note = notes.last_note; + return this; + } + renderHairpin(params) { + const ctx = this.checkContext(); + let dis = this.render_options.y_shift + 20; + let y_shift = params.first_y; + if (this.position === _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.ABOVE) { + dis = -dis + 30; + y_shift = params.first_y - params.staff_height; + } + const l_shift = this.render_options.left_shift_px; + const r_shift = this.render_options.right_shift_px; + ctx.beginPath(); + switch (this.hairpin) { + case StaveHairpin.type.CRESC: + ctx.moveTo(params.last_x + r_shift, y_shift + dis); + ctx.lineTo(params.first_x + l_shift, y_shift + this.render_options.height / 2 + dis); + ctx.lineTo(params.last_x + r_shift, y_shift + this.render_options.height + dis); + break; + case StaveHairpin.type.DECRESC: + ctx.moveTo(params.first_x + l_shift, y_shift + dis); + ctx.lineTo(params.last_x + r_shift, y_shift + this.render_options.height / 2 + dis); + ctx.lineTo(params.first_x + l_shift, y_shift + this.render_options.height + dis); + break; + default: + // Default is NONE, so nothing to draw + break; + } + ctx.stroke(); + ctx.closePath(); + } + draw() { + this.checkContext(); + this.setRendered(); + const firstNote = this.first_note; + const lastNote = this.last_note; + if (!firstNote || !lastNote) + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('NoNote', 'Notes required to draw'); + const start = firstNote.getModifierStartXY(this.position, 0); + const end = lastNote.getModifierStartXY(this.position, 0); + this.renderHairpin({ + first_x: start.x, + last_x: end.x, + first_y: firstNote.checkStave().getY() + firstNote.checkStave().getHeight(), + last_y: lastNote.checkStave().getY() + lastNote.checkStave().getHeight(), + staff_height: firstNote.checkStave().getHeight(), + }); + } +} +StaveHairpin.type = { + CRESC: 1, + DECRESC: 2, +}; + + +/***/ }), + +/***/ "./src/staveline.ts": +/*!**************************!*\ + !*** ./src/staveline.ts ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StaveLine": () => (/* binding */ StaveLine) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// ## Description +// +// This file implements `StaveLine` which are simply lines that connect +// two notes. This object is highly configurable, see the `render_options`. +// A simple line is often used for notating glissando articulations, but you +// can format a `StaveLine` with arrows or colors for more pedagogical +// purposes, such as diagrams. + + + + +// Attribution: Arrow rendering implementations based off of +// Patrick Horgan's article, "Drawing lines and arcs with +// arrow heads on HTML5 Canvas" +// +// Draw an arrow head that connects between 3 coordinates. +function drawArrowHead(ctx, x0, y0, x1, y1, x2, y2) { + // all cases do this. + ctx.beginPath(); + ctx.moveTo(x0, y0); + ctx.lineTo(x1, y1); + ctx.lineTo(x2, y2); + ctx.lineTo(x0, y0); + ctx.closePath(); + ctx.fill(); +} +class StaveLine extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + // Initialize the StaveLine with the given `notes`. + // + // `notes` is a struct that has: + // + // ``` + // { + // first_note: Note, + // last_note: Note, + // first_indices: [n1, n2, n3], + // last_indices: [n1, n2, n3] + // } + // ``` + constructor(notes) { + super(); + this.setNotes(notes); + this.text = ''; + this.resetFont(); + this.render_options = { + // Space to add to the left or the right + padding_left: 4, + padding_right: 3, + // The width of the line in pixels + line_width: 1, + // An array of line/space lengths. (TODO/QUESTION: Is this supported in SVG?). + line_dash: undefined, + // Can draw rounded line end, instead of a square. (TODO/QUESTION: Is this supported in SVG?). + rounded_end: true, + // The color of the line and arrowheads + color: undefined, + // Flags to draw arrows on each end of the line + draw_start_arrow: false, + draw_end_arrow: false, + // The length of the arrowhead sides + arrowhead_length: 10, + // The angle of the arrowhead + arrowhead_angle: Math.PI / 8, + // The position of the text + text_position_vertical: StaveLine.TextVerticalPosition.TOP, + text_justification: StaveLine.TextJustification.CENTER, + }; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_2__.Category.StaveLine; + } + // The the annotation for the `StaveLine` + setText(text) { + this.text = text; + return this; + } + // Set the notes for the `StaveLine` + setNotes(notes) { + if (!notes.first_note && !notes.last_note) { + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('BadArguments', 'Notes needs to have either first_note or last_note set.'); + } + if (!notes.first_indices) + notes.first_indices = [0]; + if (!notes.last_indices) + notes.last_indices = [0]; + if (notes.first_indices.length !== notes.last_indices.length) { + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('BadArguments', 'Connected notes must have same number of indices.'); + } + this.notes = notes; + this.first_note = notes.first_note; + this.first_indices = notes.first_indices; + this.last_note = notes.last_note; + this.last_indices = notes.last_indices; + return this; + } + // Apply the style of the `StaveLine` to the context + applyLineStyle() { + const ctx = this.checkContext(); + const render_options = this.render_options; + if (render_options.line_dash) { + ctx.setLineDash(render_options.line_dash); + } + if (render_options.line_width) { + ctx.setLineWidth(render_options.line_width); + } + if (render_options.rounded_end) { + ctx.setLineCap('round'); + } + else { + ctx.setLineCap('square'); + } + } + // Apply the text styling to the context + applyFontStyle() { + const ctx = this.checkContext(); + ctx.setFont(this.textFont); + const render_options = this.render_options; + const color = render_options.color; + if (color) { + ctx.setStrokeStyle(color); + ctx.setFillStyle(color); + } + } + // Helper function to draw a line with arrow heads + drawArrowLine(ctx, pt1, pt2) { + const both_arrows = this.render_options.draw_start_arrow && this.render_options.draw_end_arrow; + const x1 = pt1.x; + const y1 = pt1.y; + const x2 = pt2.x; + const y2 = pt2.y; + // For ends with arrow we actually want to stop before we get to the arrow + // so that wide lines won't put a flat end on the arrow. + const distance = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); + const ratio = (distance - this.render_options.arrowhead_length / 3) / distance; + let end_x; + let end_y; + let start_x; + let start_y; + if (this.render_options.draw_end_arrow || both_arrows) { + end_x = Math.round(x1 + (x2 - x1) * ratio); + end_y = Math.round(y1 + (y2 - y1) * ratio); + } + else { + end_x = x2; + end_y = y2; + } + if (this.render_options.draw_start_arrow || both_arrows) { + start_x = x1 + (x2 - x1) * (1 - ratio); + start_y = y1 + (y2 - y1) * (1 - ratio); + } + else { + start_x = x1; + start_y = y1; + } + if (this.render_options.color) { + ctx.setStrokeStyle(this.render_options.color); + ctx.setFillStyle(this.render_options.color); + } + // Draw the shaft of the arrow + ctx.beginPath(); + ctx.moveTo(start_x, start_y); + ctx.lineTo(end_x, end_y); + ctx.stroke(); + ctx.closePath(); + // calculate the angle of the line + const line_angle = Math.atan2(y2 - y1, x2 - x1); + // h is the line length of a side of the arrow head + const h = Math.abs(this.render_options.arrowhead_length / Math.cos(this.render_options.arrowhead_angle)); + let angle1; + let angle2; + let top_x; + let top_y; + let bottom_x; + let bottom_y; + if (this.render_options.draw_end_arrow || both_arrows) { + angle1 = line_angle + Math.PI + this.render_options.arrowhead_angle; + top_x = x2 + Math.cos(angle1) * h; + top_y = y2 + Math.sin(angle1) * h; + angle2 = line_angle + Math.PI - this.render_options.arrowhead_angle; + bottom_x = x2 + Math.cos(angle2) * h; + bottom_y = y2 + Math.sin(angle2) * h; + drawArrowHead(ctx, top_x, top_y, x2, y2, bottom_x, bottom_y); + } + if (this.render_options.draw_start_arrow || both_arrows) { + angle1 = line_angle + this.render_options.arrowhead_angle; + top_x = x1 + Math.cos(angle1) * h; + top_y = y1 + Math.sin(angle1) * h; + angle2 = line_angle - this.render_options.arrowhead_angle; + bottom_x = x1 + Math.cos(angle2) * h; + bottom_y = y1 + Math.sin(angle2) * h; + drawArrowHead(ctx, top_x, top_y, x1, y1, bottom_x, bottom_y); + } + } + // Renders the `StaveLine` on the context + draw() { + const ctx = this.checkContext(); + this.setRendered(); + const first_note = this.first_note; + const last_note = this.last_note; + const render_options = this.render_options; + ctx.save(); + this.applyLineStyle(); + // Cycle through each set of indices and draw lines + let start_position = { x: 0, y: 0 }; + let end_position = { x: 0, y: 0 }; + this.first_indices.forEach((first_index, i) => { + const last_index = this.last_indices[i]; + // Get initial coordinates for the start/end of the line + start_position = first_note.getModifierStartXY(2, first_index); + end_position = last_note.getModifierStartXY(1, last_index); + const upwards_slope = start_position.y > end_position.y; + // Adjust `x` coordinates for modifiers + start_position.x += first_note.getMetrics().modRightPx + render_options.padding_left; + end_position.x -= last_note.getMetrics().modLeftPx + render_options.padding_right; + // Adjust first `x` coordinates for displacements + const notehead_width = first_note.getGlyph().getWidth(); + const first_displaced = first_note.getKeyProps()[first_index].displaced; + if (first_displaced && first_note.getStemDirection() === 1) { + start_position.x += notehead_width + render_options.padding_left; + } + // Adjust last `x` coordinates for displacements + const last_displaced = last_note.getKeyProps()[last_index].displaced; + if (last_displaced && last_note.getStemDirection() === -1) { + end_position.x -= notehead_width + render_options.padding_right; + } + // Adjust y position better if it's not coming from the center of the note + start_position.y += upwards_slope ? -3 : 1; + end_position.y += upwards_slope ? 2 : 0; + this.drawArrowLine(ctx, start_position, end_position); + }); + ctx.restore(); + // Determine the x coordinate where to start the text + const text_width = ctx.measureText(this.text).width; + const justification = render_options.text_justification; + let x = 0; + if (justification === StaveLine.TextJustification.LEFT) { + x = start_position.x; + } + else if (justification === StaveLine.TextJustification.CENTER) { + const delta_x = end_position.x - start_position.x; + const center_x = delta_x / 2 + start_position.x; + x = center_x - text_width / 2; + } + else if (justification === StaveLine.TextJustification.RIGHT) { + x = end_position.x - text_width; + } + // Determine the y value to start the text + let y = 0; + const vertical_position = render_options.text_position_vertical; + if (vertical_position === StaveLine.TextVerticalPosition.TOP) { + y = first_note.checkStave().getYForTopText(); + } + else if (vertical_position === StaveLine.TextVerticalPosition.BOTTOM) { + y = first_note.checkStave().getYForBottomText(_tables__WEBPACK_IMPORTED_MODULE_1__.Tables.TEXT_HEIGHT_OFFSET_HACK); + } + // Draw the text + ctx.save(); + this.applyFontStyle(); + ctx.fillText(this.text, x, y); + ctx.restore(); + return this; + } +} +/** Default text font. */ +StaveLine.TEXT_FONT = Object.assign({}, _element__WEBPACK_IMPORTED_MODULE_0__.Element.TEXT_FONT); +// Text Positioning +StaveLine.TextVerticalPosition = { + TOP: 1, + BOTTOM: 2, +}; +StaveLine.TextJustification = { + LEFT: 1, + CENTER: 2, + RIGHT: 3, +}; + + +/***/ }), + +/***/ "./src/stavemodifier.ts": +/*!******************************!*\ + !*** ./src/stavemodifier.ts ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StaveModifierPosition": () => (/* binding */ StaveModifierPosition), +/* harmony export */ "StaveModifier": () => (/* binding */ StaveModifier) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// ## Description +// A base class for stave modifiers (e.g. clefs, key signatures) + + + +var StaveModifierPosition; +(function (StaveModifierPosition) { + StaveModifierPosition[StaveModifierPosition["CENTER"] = 0] = "CENTER"; + StaveModifierPosition[StaveModifierPosition["LEFT"] = 1] = "LEFT"; + StaveModifierPosition[StaveModifierPosition["RIGHT"] = 2] = "RIGHT"; + StaveModifierPosition[StaveModifierPosition["ABOVE"] = 3] = "ABOVE"; + StaveModifierPosition[StaveModifierPosition["BELOW"] = 4] = "BELOW"; + StaveModifierPosition[StaveModifierPosition["BEGIN"] = 5] = "BEGIN"; + StaveModifierPosition[StaveModifierPosition["END"] = 6] = "END"; +})(StaveModifierPosition || (StaveModifierPosition = {})); +class StaveModifier extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + constructor() { + super(); + this.width = 0; + this.x = 0; + this.padding = 10; + this.position = StaveModifierPosition.ABOVE; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_1__.Category.StaveModifier; + } + static get Position() { + return StaveModifierPosition; + } + getPosition() { + return this.position; + } + setPosition(position) { + this.position = position; + return this; + } + getStave() { + return this.stave; + } + checkStave() { + return (0,_util__WEBPACK_IMPORTED_MODULE_2__.defined)(this.stave, 'NoStave', 'No stave attached to instance.'); + } + setStave(stave) { + this.stave = stave; + return this; + } + getWidth() { + return this.width; + } + setWidth(width) { + this.width = width; + return this; + } + getX() { + return this.x; + } + setX(x) { + this.x = x; + return this; + } + placeGlyphOnLine(glyph, stave, line, customShift = 0) { + glyph.setYShift(stave.getYForLine(line !== null && line !== void 0 ? line : 0) - stave.getYForGlyphs() + customShift); + } + getPadding(index) { + return index !== undefined && index < 2 ? 0 : this.padding; + } + setPadding(padding) { + this.padding = padding; + return this; + } + setLayoutMetrics(layoutMetrics) { + this.layoutMetrics = layoutMetrics; + return this; + } + getLayoutMetrics() { + return this.layoutMetrics; + } + // eslint-disable-next-line + draw(...args) { + // DO NOTHING. + } +} + + +/***/ }), + +/***/ "./src/stavenote.ts": +/*!**************************!*\ + !*** ./src/stavenote.ts ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StaveNote": () => (/* binding */ StaveNote) +/* harmony export */ }); +/* harmony import */ var _boundingbox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./boundingbox */ "./src/boundingbox.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _notehead__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./notehead */ "./src/notehead.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _stemmablenote__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./stemmablenote */ "./src/stemmablenote.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// This file implements notes for standard notation. This consists of one or +// more `NoteHeads`, an optional stem, and an optional flag. +// +// Throughout these comments, a "note" refers to the entire `StaveNote`, +// and a "key" refers to a specific pitch/notehead within a note. +// +// See `tests/stavenote_tests.ts` for usage examples. + + + + + + + + +function showDeprecationWarningForNoteHeads() { + // eslint-disable-next-line + console.warn('StaveNote.note_heads is deprecated. Use StaveNote.noteHeads instead.', 'This accessor will be removed in VexFlow 5.0.'); +} +// To enable logging for this class. Set `Vex.Flow.StaveNote.DEBUG` to `true`. +// eslint-disable-next-line +function L(...args) { + if (StaveNote.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_7__.log)('Vex.Flow.StaveNote', args); +} +const isInnerNoteIndex = (note, index) => index === (note.getStemDirection() === _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP ? note.keyProps.length - 1 : 0); +// Helper methods for rest positioning in ModifierContext. +function shiftRestVertical(rest, note, dir) { + const delta = dir; + rest.line += delta; + rest.maxLine += delta; + rest.minLine += delta; + rest.note.setKeyLine(0, rest.note.getKeyLine(0) + delta); +} +// Called from formatNotes :: center a rest between two notes +function centerRest(rest, noteU, noteL) { + const delta = rest.line - (0,_util__WEBPACK_IMPORTED_MODULE_7__.midLine)(noteU.minLine, noteL.maxLine); + rest.note.setKeyLine(0, rest.note.getKeyLine(0) - delta); + rest.line -= delta; + rest.maxLine -= delta; + rest.minLine -= delta; +} +class StaveNote extends _stemmablenote__WEBPACK_IMPORTED_MODULE_4__.StemmableNote { + constructor(noteStruct) { + var _a, _b, _c; + super(noteStruct); + ////////////////////////////////////////////////////////////////////////////////////////////////// + // INSTANCE MEMBERS + this.minLine = 0; + this.maxLine = 0; + this.ledgerLineStyle = {}; + this.clef = (_a = noteStruct.clef) !== null && _a !== void 0 ? _a : 'treble'; + this.octave_shift = (_b = noteStruct.octave_shift) !== null && _b !== void 0 ? _b : 0; + // Pull note rendering properties. + this.glyph = _tables__WEBPACK_IMPORTED_MODULE_5__.Tables.getGlyphProps(this.duration, this.noteType); + (0,_util__WEBPACK_IMPORTED_MODULE_7__.defined)(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`); + // if true, displace note to right + this.displaced = false; + this.dot_shiftY = 0; + // for displaced ledger lines + this.use_default_head_x = false; + // Drawing + this._noteHeads = []; + this.modifiers = []; + this.render_options = Object.assign(Object.assign({}, this.render_options), { + // font size for note heads and rests + glyph_font_scale: noteStruct.glyph_font_scale || _tables__WEBPACK_IMPORTED_MODULE_5__.Tables.NOTATION_FONT_SCALE, + // number of stroke px to the left and right of head + stroke_px: noteStruct.stroke_px || StaveNote.LEDGER_LINE_OFFSET }); + this.calculateKeyProps(); + this.buildStem(); + // Set the stem direction + if (noteStruct.auto_stem) { + this.autoStem(); + } + else { + this.setStemDirection((_c = noteStruct.stem_direction) !== null && _c !== void 0 ? _c : _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP); + } + this.reset(); + this.buildFlag(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_6__.Category.StaveNote; + } + /** + * @deprecated Use Stem.UP. + */ + static get STEM_UP() { + return _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP; + } + /** + * @deprecated Use Stem.DOWN. + */ + static get STEM_DOWN() { + return _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.DOWN; + } + static get LEDGER_LINE_OFFSET() { + return 3; + } + static get minNoteheadPadding() { + const musicFont = _tables__WEBPACK_IMPORTED_MODULE_5__.Tables.currentMusicFont(); + return musicFont.lookupMetric('glyphs.noteHead.minPadding'); + } + /** Format notes inside a ModifierContext. */ + static format(notes, state) { + if (!notes || notes.length < 2) + return false; + const notesList = []; + for (let i = 0; i < notes.length; i++) { + const props = notes[i].getKeyProps(); + const line = props[0].line; + let minL = props[props.length - 1].line; + const stemDirection = notes[i].getStemDirection(); + const stemMax = notes[i].getStemLength() / 10; + const stemMin = notes[i].getStemMinimumLength() / 10; + let maxL; + if (notes[i].isRest()) { + maxL = line + notes[i].glyph.line_above; + minL = line - notes[i].glyph.line_below; + } + else { + maxL = stemDirection === 1 ? props[props.length - 1].line + stemMax : props[props.length - 1].line; + minL = stemDirection === 1 ? props[0].line : props[0].line - stemMax; + } + notesList.push({ + line: props[0].line, + maxLine: maxL, + minLine: minL, + isrest: notes[i].isRest(), + stemDirection: stemDirection, + stemMax, + stemMin, + voice_shift: notes[i].getVoiceShiftWidth(), + is_displaced: notes[i].isDisplaced(), + note: notes[i], + }); + } + const voices = notesList.length; + let noteU = notesList[0]; + const noteM = voices > 2 ? notesList[1] : undefined; + let noteL = voices > 2 ? notesList[2] : notesList[1]; + // for two voice backward compatibility, ensure upper voice is stems up + // for three voices, the voices must be in order (upper, middle, lower) + if (voices === 2 && noteU.stemDirection === -1 && noteL.stemDirection === 1) { + noteU = notesList[1]; + noteL = notesList[0]; + } + const voiceXShift = Math.max(noteU.voice_shift, noteL.voice_shift); + let xShift = 0; + // Test for two voice note intersection + if (voices === 2) { + const lineSpacing = noteU.stemDirection === noteL.stemDirection ? 0.0 : 0.5; + if (noteU.minLine <= noteL.maxLine + lineSpacing) { + if (noteU.isrest) { + // shift rest up + shiftRestVertical(noteU, noteL, 1); + } + else if (noteL.isrest) { + // shift rest down + shiftRestVertical(noteL, noteU, -1); + } + else if (noteU.stemDirection === noteL.stemDirection) { + // upper voice is middle voice, so shift it right + xShift = voiceXShift + 2; + noteU.note.setXShift(xShift); + } + else { + // shift lower voice right + xShift = voiceXShift + 2; + noteL.note.setXShift(xShift); + } + } + // format complete + state.right_shift += xShift; + return true; + } + if (!noteM) + throw new _util__WEBPACK_IMPORTED_MODULE_7__.RuntimeError('InvalidState', 'noteM not defined.'); + // For three voices, test if rests can be repositioned + // + // Special case 1 :: middle voice rest between two notes + // + if (noteM.isrest && !noteU.isrest && !noteL.isrest) { + if (noteU.minLine <= noteM.maxLine || noteM.minLine <= noteL.maxLine) { + const restHeight = noteM.maxLine - noteM.minLine; + const space = noteU.minLine - noteL.maxLine; + if (restHeight < space) { + // center middle voice rest between the upper and lower voices + centerRest(noteM, noteU, noteL); + } + else { + xShift = voiceXShift + 2; // shift middle rest right + noteM.note.setXShift(xShift); + if (noteL.note.hasBeam() === false) { + noteL.stemDirection = -1; + noteL.note.setStemDirection(-1); + } + if (noteU.minLine <= noteL.maxLine && noteU.note.hasBeam() === false) { + noteU.stemDirection = 1; + noteU.note.setStemDirection(1); + } + } + // format complete + state.right_shift += xShift; + return true; + } + } + // Special case 2 :: all voices are rests + if (noteU.isrest && noteM.isrest && noteL.isrest) { + // Shift upper voice rest up + shiftRestVertical(noteU, noteM, 1); + // Shift lower voice rest down + shiftRestVertical(noteL, noteM, -1); + // format complete + state.right_shift += xShift; + return true; + } + // Test if any other rests can be repositioned + if (noteM.isrest && noteU.isrest && noteM.minLine <= noteL.maxLine) { + // Shift middle voice rest up + shiftRestVertical(noteM, noteL, 1); + } + if (noteM.isrest && noteL.isrest && noteU.minLine <= noteM.maxLine) { + // Shift middle voice rest down + shiftRestVertical(noteM, noteU, -1); + } + if (noteU.isrest && noteU.minLine <= noteM.maxLine) { + // shift upper voice rest up; + shiftRestVertical(noteU, noteM, 1); + } + if (noteL.isrest && noteM.minLine <= noteL.maxLine) { + // shift lower voice rest down + shiftRestVertical(noteL, noteM, -1); + } + // If middle voice intersects upper or lower voice + if (noteU.minLine <= noteM.maxLine + 0.5 || noteM.minLine <= noteL.maxLine) { + // shift middle note right + xShift = voiceXShift + 2; + noteM.note.setXShift(xShift); + if (noteL.note.hasBeam() === false) { + noteL.stemDirection = -1; + noteL.note.setStemDirection(-1); + } + if (noteU.minLine <= noteL.maxLine && noteU.note.hasBeam() === false) { + noteU.stemDirection = 1; + noteU.note.setStemDirection(1); + } + } + state.right_shift += xShift; + return true; + } + static postFormat(notes) { + if (!notes) + return false; + notes.forEach((note) => note.postFormat()); + return true; + } + reset() { + super.reset(); + // Save prior noteHead styles & reapply them after making new noteheads. + const noteHeadStyles = this._noteHeads.map((noteHead) => noteHead.getStyle()); + this.buildNoteHeads(); + this._noteHeads.forEach((noteHead, index) => { + const noteHeadStyle = noteHeadStyles[index]; + if (noteHeadStyle) + noteHead.setStyle(noteHeadStyle); + }); + const stave = this.stave; + if (stave) { + this._noteHeads.forEach((head) => head.setStave(stave)); + } + this.calcNoteDisplacements(); + return this; + } + setBeam(beam) { + this.beam = beam; + this.calcNoteDisplacements(); + // Update stem extension is a beam is assigned. + if (this.stem) { + this.stem.setExtension(this.getStemExtension()); + } + return this; + } + // Builds a `Stem` for the note + buildStem() { + this.setStem(new _stem__WEBPACK_IMPORTED_MODULE_3__.Stem({ hide: !!this.isRest() })); + return this; + } + // Builds a `NoteHead` for each key in the note + buildNoteHeads() { + this._noteHeads = []; + const stemDirection = this.getStemDirection(); + const keys = this.getKeys(); + let lastLine = undefined; + let lineDiff = undefined; + let displaced = false; + // Draw notes from bottom to top. + // For down-stem notes, we draw from top to bottom. + let start; + let end; + let step; + if (stemDirection === _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP) { + start = 0; + end = keys.length; + step = 1; + } + else { + start = keys.length - 1; + end = -1; + step = -1; + } + for (let i = start; i !== end; i += step) { + const noteProps = this.keyProps[i]; + const line = noteProps.line; + // Keep track of last line with a note head, so that consecutive heads + // are correctly displaced. + if (lastLine === undefined) { + lastLine = line; + } + else { + lineDiff = Math.abs(lastLine - line); + if (lineDiff === 0 || lineDiff === 0.5) { + displaced = !displaced; + } + else { + displaced = false; + this.use_default_head_x = true; + } + } + lastLine = line; + const notehead = new _notehead__WEBPACK_IMPORTED_MODULE_2__.NoteHead({ + duration: this.duration, + note_type: this.noteType, + displaced, + stem_direction: stemDirection, + custom_glyph_code: noteProps.code, + glyph_font_scale: this.render_options.glyph_font_scale, + x_shift: noteProps.shift_right, + stem_up_x_offset: noteProps.stem_up_x_offset, + stem_down_x_offset: noteProps.stem_down_x_offset, + line: noteProps.line, + }); + this._noteHeads[i] = notehead; + } + } + // Automatically sets the stem direction based on the keys in the note + autoStem() { + this.setStemDirection(this.calculateOptimalStemDirection()); + } + calculateOptimalStemDirection() { + // Figure out optimal stem direction based on given notes + this.minLine = this.keyProps[0].line; + this.maxLine = this.keyProps[this.keyProps.length - 1].line; + const MIDDLE_LINE = 3; + const decider = (this.minLine + this.maxLine) / 2; + const stemDirection = decider < MIDDLE_LINE ? _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP : _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.DOWN; + return stemDirection; + } + // Calculates and stores the properties for each key in the note + calculateKeyProps() { + let lastLine; + for (let i = 0; i < this.keys.length; ++i) { + const key = this.keys[i]; + // All rests use the same position on the line. + // if (this.glyph.rest) key = this.glyph.position; + if (this.glyph.rest) + this.glyph.position = key; + const options = { octave_shift: this.octave_shift || 0 }; + const props = _tables__WEBPACK_IMPORTED_MODULE_5__.Tables.keyProperties(key, this.clef, options); + if (!props) { + throw new _util__WEBPACK_IMPORTED_MODULE_7__.RuntimeError('BadArguments', `Invalid key for note properties: ${key}`); + } + // Override line placement for default rests + if (props.key === 'R') { + if (this.duration === '1' || this.duration === 'w') { + props.line = 4; + } + else { + props.line = 3; + } + } + // Calculate displacement of this note + const line = props.line; + if (lastLine == undefined) { + lastLine = line; + } + else { + if (Math.abs(lastLine - line) === 0.5) { + this.displaced = true; + props.displaced = true; + // Have to mark the previous note as + // displaced as well, for modifier placement + if (this.keyProps.length > 0) { + this.keyProps[i - 1].displaced = true; + } + } + } + lastLine = line; + this.keyProps.push(props); + } + // Sort the notes from lowest line to highest line + lastLine = undefined; + this.keyProps.forEach((key) => { + if (lastLine && key.line < lastLine) { + (0,_util__WEBPACK_IMPORTED_MODULE_7__.warn)('Unsorted keys in note will be sorted. ' + 'See https://github.com/0xfe/vexflow/issues/104 for details.'); + } + lastLine = key.line; + }); + this.keyProps.sort((a, b) => a.line - b.line); + } + // Get the `BoundingBox` for the entire note + getBoundingBox() { + var _a, _b; + if (!this.preFormatted) { + throw new _util__WEBPACK_IMPORTED_MODULE_7__.RuntimeError('UnformattedNote', "Can't call getBoundingBox on an unformatted note."); + } + const { width: w, modLeftPx, leftDisplacedHeadPx } = this.getMetrics(); + const x = this.getAbsoluteX() - modLeftPx - leftDisplacedHeadPx; + let minY = 0; + let maxY = 0; + const halfLineSpacing = ((_b = (_a = this.getStave()) === null || _a === void 0 ? void 0 : _a.getSpacingBetweenLines()) !== null && _b !== void 0 ? _b : 0) / 2; + const lineSpacing = halfLineSpacing * 2; + if (this.isRest()) { + const y = this.ys[0]; + const frac = _tables__WEBPACK_IMPORTED_MODULE_5__.Tables.durationToFraction(this.duration); + if (frac.equals(1) || frac.equals(2)) { + minY = y - halfLineSpacing; + maxY = y + halfLineSpacing; + } + else { + minY = y - this.glyph.line_above * lineSpacing; + maxY = y + this.glyph.line_below * lineSpacing; + } + } + else if (this.glyph.stem) { + const ys = this.getStemExtents(); + ys.baseY += halfLineSpacing * this.getStemDirection(); + minY = Math.min(ys.topY, ys.baseY); + maxY = Math.max(ys.topY, ys.baseY); + } + else { + minY = 0; + maxY = 0; + for (let i = 0; i < this.ys.length; ++i) { + const yy = this.ys[i]; + if (i === 0) { + minY = yy; + maxY = yy; + } + else { + minY = Math.min(yy, minY); + maxY = Math.max(yy, maxY); + } + } + minY -= halfLineSpacing; + maxY += halfLineSpacing; + } + return new _boundingbox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox(x, minY, w, maxY - minY); + } + // Gets the line number of the bottom note in the chord. + // If `isTopNote` is `true` then get the top note's line number instead + getLineNumber(isTopNote) { + if (!this.keyProps.length) { + throw new _util__WEBPACK_IMPORTED_MODULE_7__.RuntimeError('NoKeyProps', "Can't get bottom note line, because note is not initialized properly."); + } + let resultLine = this.keyProps[0].line; + // No precondition assumed for sortedness of keyProps array + for (let i = 0; i < this.keyProps.length; i++) { + const thisLine = this.keyProps[i].line; + if (isTopNote) { + if (thisLine > resultLine) + resultLine = thisLine; + } + else { + if (thisLine < resultLine) + resultLine = thisLine; + } + } + return resultLine; + } + /** + * @returns true if this note is a type of rest. Rests don't have pitches, but take up space in the score. + */ + isRest() { + return this.glyph.rest; + } + // Determine if the current note is a chord + isChord() { + return !this.isRest() && this.keys.length > 1; + } + // Determine if the `StaveNote` has a stem + hasStem() { + return this.glyph.stem; + } + hasFlag() { + return super.hasFlag() && !this.isRest(); + } + getStemX() { + if (this.noteType === 'r') { + return this.getCenterGlyphX(); + } + else { + // We adjust the origin of the stem because we want the stem left-aligned + // with the notehead if stemmed-down, and right-aligned if stemmed-up + return super.getStemX() + (this.stem_direction ? _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.WIDTH / (2 * -this.stem_direction) : 0); + } + } + // Get the `y` coordinate for text placed on the top/bottom of a + // note at a desired `text_line` + getYForTopText(textLine) { + const extents = this.getStemExtents(); + return Math.min(this.checkStave().getYForTopText(textLine), extents.topY - this.render_options.annotation_spacing * (textLine + 1)); + } + getYForBottomText(textLine) { + const extents = this.getStemExtents(); + return Math.max(this.checkStave().getYForTopText(textLine), extents.baseY + this.render_options.annotation_spacing * textLine); + } + // Sets the current note to the provided `stave`. This applies + // `y` values to the `NoteHeads`. + setStave(stave) { + super.setStave(stave); + const ys = this._noteHeads.map((notehead) => { + notehead.setStave(stave); + return notehead.getY(); + }); + this.setYs(ys); + if (this.stem) { + const { y_top, y_bottom } = this.getNoteHeadBounds(); + this.stem.setYBounds(y_top, y_bottom); + } + return this; + } + // Check if note is shifted to the right + isDisplaced() { + return this.displaced; + } + // Sets whether shift note to the right. `displaced` is a `boolean` + setNoteDisplaced(displaced) { + this.displaced = displaced; + return this; + } + // Get the starting `x` coordinate for a `StaveTie` + getTieRightX() { + let tieStartX = this.getAbsoluteX(); + tieStartX += this.getGlyphWidth() + this.x_shift + this.rightDisplacedHeadPx; + if (this.modifierContext) + tieStartX += this.modifierContext.getRightShift(); + return tieStartX; + } + // Get the ending `x` coordinate for a `StaveTie` + getTieLeftX() { + let tieEndX = this.getAbsoluteX(); + tieEndX += this.x_shift - this.leftDisplacedHeadPx; + return tieEndX; + } + // Get the stave line on which to place a rest + getLineForRest() { + let restLine = this.keyProps[0].line; + if (this.keyProps.length > 1) { + const lastLine = this.keyProps[this.keyProps.length - 1].line; + const top = Math.max(restLine, lastLine); + const bot = Math.min(restLine, lastLine); + restLine = (0,_util__WEBPACK_IMPORTED_MODULE_7__.midLine)(top, bot); + } + return restLine; + } + // Get the default `x` and `y` coordinates for the provided `position` + // and key `index` + getModifierStartXY(position, index, options = {}) { + var _a, _b; + if (!this.preFormatted) { + throw new _util__WEBPACK_IMPORTED_MODULE_7__.RuntimeError('UnformattedNote', "Can't call GetModifierStartXY on an unformatted note"); + } + if (this.ys.length === 0) { + throw new _util__WEBPACK_IMPORTED_MODULE_7__.RuntimeError('NoYValues', 'No Y-Values calculated for this note.'); + } + const { ABOVE, BELOW, LEFT, RIGHT } = _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position; + let x = 0; + if (position === LEFT) { + // FIXME: Left modifier padding, move to font file + x = -1 * 2; + } + else if (position === RIGHT) { + // FIXME: Right modifier padding, move to font file + x = this.getGlyphWidth() + this.x_shift + 2; + if (this.stem_direction === _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP && + this.hasFlag() && + (options.forceFlagRight || isInnerNoteIndex(this, index))) { + x += (_b = (_a = this === null || this === void 0 ? void 0 : this.flag) === null || _a === void 0 ? void 0 : _a.getMetrics().width) !== null && _b !== void 0 ? _b : 0; + } + } + else if (position === BELOW || position === ABOVE) { + x = this.getGlyphWidth() / 2; + } + return { + x: this.getAbsoluteX() + x, + y: this.ys[index], + }; + } + // Sets the style of the complete StaveNote, including all keys + // and the stem. + setStyle(style) { + var _a; + super.setStyle(style); + this._noteHeads.forEach((notehead) => notehead.setStyle(style)); + (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setStyle(style); + return this; + } + setStemStyle(style) { + const stem = this.getStem(); + stem === null || stem === void 0 ? void 0 : stem.setStyle(style); + return this; + } + getStemStyle() { + var _a; + return (_a = this.stem) === null || _a === void 0 ? void 0 : _a.getStyle(); + } + setLedgerLineStyle(style) { + this.ledgerLineStyle = style; + } + getLedgerLineStyle() { + return this.ledgerLineStyle; + } + setFlagStyle(style) { + this.flagStyle = style; + } + getFlagStyle() { + return this.flagStyle; + } + // Sets the notehead at `index` to the provided coloring `style`. + // + // `style` is an `object` with the following properties: `shadowColor`, + // `shadowBlur`, `fillStyle`, `strokeStyle` + setKeyStyle(index, style) { + this._noteHeads[index].setStyle(style); + return this; + } + setKeyLine(index, line) { + this.keyProps[index].line = line; + this.reset(); + return this; + } + getKeyLine(index) { + return this.keyProps[index].line; + } + // Get the width of the note if it is displaced. Used for `Voice` + // formatting + getVoiceShiftWidth() { + // TODO: may need to accomodate for dot here. + return this.getGlyphWidth() * (this.displaced ? 2 : 1); + } + // Calculates and sets the extra pixels to the left or right + // if the note is displaced. + calcNoteDisplacements() { + this.setLeftDisplacedHeadPx(this.displaced && this.stem_direction === _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.DOWN ? this.getGlyphWidth() : 0); + // For upstems with flags, the extra space is unnecessary, since it's taken + // up by the flag. + this.setRightDisplacedHeadPx(!this.hasFlag() && this.displaced && this.stem_direction === _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP ? this.getGlyphWidth() : 0); + } + // Pre-render formatting + preFormat() { + if (this.preFormatted) + return; + let noteHeadPadding = 0; + if (this.modifierContext) { + this.modifierContext.preFormat(); + // If there are no modifiers on this note, make sure there is adequate padding + // between the notes. + if (this.modifierContext.getWidth() === 0) { + noteHeadPadding = StaveNote.minNoteheadPadding; + } + } + let width = this.getGlyphWidth() + this.leftDisplacedHeadPx + this.rightDisplacedHeadPx + noteHeadPadding; + // For upward flagged notes, the width of the flag needs to be added + if (this.shouldDrawFlag() && this.stem_direction === _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP) { + width += this.getGlyphWidth(); + // TODO: Add flag width as a separate metric + } + this.setWidth(width); + this.preFormatted = true; + } + /** + * @typedef {Object} noteHeadBounds + * @property {number} y_top the highest notehead bound + * @property {number} y_bottom the lowest notehead bound + * @property {number|Null} displaced_x the starting x for displaced noteheads + * @property {number|Null} non_displaced_x the starting x for non-displaced noteheads + * @property {number} highest_line the highest notehead line in traditional music line + * numbering (bottom line = 1, top line = 5) + * @property {number} lowest_line the lowest notehead line + * @property {number|false} highest_displaced_line the highest staff line number + * for a displaced notehead + * @property {number|false} lowest_displaced_line + * @property {number} highest_non_displaced_line + * @property {number} lowest_non_displaced_line + */ + /** + * Get the staff line and y value for the highest & lowest noteheads + * @returns {noteHeadBounds} + */ + getNoteHeadBounds() { + // Top and bottom Y values for stem. + let yTop = +Infinity; + let yBottom = -Infinity; + let nonDisplacedX; + let displacedX; + let highestLine = this.checkStave().getNumLines(); + let lowestLine = 1; + let highestDisplacedLine; + let lowestDisplacedLine; + let highestNonDisplacedLine = highestLine; + let lowestNonDisplacedLine = lowestLine; + this._noteHeads.forEach((notehead) => { + const line = notehead.getLine(); + const y = notehead.getY(); + yTop = Math.min(y, yTop); + yBottom = Math.max(y, yBottom); + if (displacedX === undefined && notehead.isDisplaced()) { + displacedX = notehead.getAbsoluteX(); + } + if (nonDisplacedX === undefined && !notehead.isDisplaced()) { + nonDisplacedX = notehead.getAbsoluteX(); + } + highestLine = Math.max(line, highestLine); + lowestLine = Math.min(line, lowestLine); + if (notehead.isDisplaced()) { + highestDisplacedLine = highestDisplacedLine === undefined ? line : Math.max(line, highestDisplacedLine); + lowestDisplacedLine = lowestDisplacedLine === undefined ? line : Math.min(line, lowestDisplacedLine); + } + else { + highestNonDisplacedLine = Math.max(line, highestNonDisplacedLine); + lowestNonDisplacedLine = Math.min(line, lowestNonDisplacedLine); + } + }, this); + return { + y_top: yTop, + y_bottom: yBottom, + displaced_x: displacedX, + non_displaced_x: nonDisplacedX, + highest_line: highestLine, + lowest_line: lowestLine, + highest_displaced_line: highestDisplacedLine, + lowest_displaced_line: lowestDisplacedLine, + highest_non_displaced_line: highestNonDisplacedLine, + lowest_non_displaced_line: lowestNonDisplacedLine, + }; + } + // Get the starting `x` coordinate for the noteheads + getNoteHeadBeginX() { + return this.getAbsoluteX() + this.x_shift; + } + // Get the ending `x` coordinate for the noteheads + getNoteHeadEndX() { + const xBegin = this.getNoteHeadBeginX(); + return xBegin + this.getGlyphWidth(); + } + get noteHeads() { + return this._noteHeads.slice(); + } + /** @deprecated use StaveNote.noteHeads instead. */ + get note_heads() { + showDeprecationWarningForNoteHeads(); + return this.noteHeads; + } + // Draw the ledger lines between the stave and the highest/lowest keys + drawLedgerLines() { + const stave = this.checkStave(); + const { glyph, render_options: { stroke_px }, } = this; + const ctx = this.checkContext(); + const width = glyph.getWidth() + stroke_px * 2; + const doubleWidth = 2 * (glyph.getWidth() + stroke_px) - _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.WIDTH / 2; + if (this.isRest()) + return; + if (!ctx) { + throw new _util__WEBPACK_IMPORTED_MODULE_7__.RuntimeError('NoCanvasContext', "Can't draw without a canvas context."); + } + const { highest_line, lowest_line, highest_displaced_line, highest_non_displaced_line, lowest_displaced_line, lowest_non_displaced_line, displaced_x, non_displaced_x, } = this.getNoteHeadBounds(); + // Early out if there are no ledger lines to draw. + if (highest_line < 6 && lowest_line > 0) + return; + const min_x = Math.min(displaced_x !== null && displaced_x !== void 0 ? displaced_x : 0, non_displaced_x !== null && non_displaced_x !== void 0 ? non_displaced_x : 0); + const drawLedgerLine = (y, normal, displaced) => { + let x; + if (displaced && normal) + x = min_x - stroke_px; + else if (normal) + x = (non_displaced_x !== null && non_displaced_x !== void 0 ? non_displaced_x : 0) - stroke_px; + else + x = (displaced_x !== null && displaced_x !== void 0 ? displaced_x : 0) - stroke_px; + const ledgerWidth = normal && displaced ? doubleWidth : width; + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.lineTo(x + ledgerWidth, y); + ctx.stroke(); + }; + const style = Object.assign(Object.assign({}, stave.getDefaultLedgerLineStyle()), this.getLedgerLineStyle()); + this.applyStyle(ctx, style); + // Draw ledger lines below the staff: + for (let line = 6; line <= highest_line; ++line) { + const normal = non_displaced_x !== undefined && line <= highest_non_displaced_line; + const displaced = highest_displaced_line !== undefined && line <= highest_displaced_line; + drawLedgerLine(stave.getYForNote(line), normal, displaced); + } + // Draw ledger lines above the staff: + for (let line = 0; line >= lowest_line; --line) { + const normal = non_displaced_x !== undefined && line >= lowest_non_displaced_line; + const displaced = lowest_displaced_line !== undefined && line >= lowest_displaced_line; + drawLedgerLine(stave.getYForNote(line), normal, displaced); + } + this.restoreStyle(ctx, style); + } + // Draw all key modifiers + drawModifiers() { + const ctx = this.checkContext(); + ctx.openGroup('modifiers'); + for (let i = 0; i < this.modifiers.length; i++) { + const modifier = this.modifiers[i]; + const index = modifier.checkIndex(); + const notehead = this._noteHeads[index]; + const noteheadStyle = notehead.getStyle(); + notehead.applyStyle(ctx, noteheadStyle); + modifier.setContext(ctx); + modifier.drawWithStyle(); + notehead.restoreStyle(ctx, noteheadStyle); + } + ctx.closeGroup(); + } + shouldDrawFlag() { + const hasStem = this.stem !== undefined; + const hasFlag = this.glyph.flag; // specified in tables.js + const hasNoBeam = this.beam === undefined; + return hasStem && hasFlag && hasNoBeam; + } + // Draw the flag for the note + drawFlag() { + var _a; + const ctx = this.checkContext(); + if (!ctx) { + throw new _util__WEBPACK_IMPORTED_MODULE_7__.RuntimeError('NoCanvasContext', "Can't draw without a canvas context."); + } + if (this.shouldDrawFlag()) { + const { y_top, y_bottom } = this.getNoteHeadBounds(); + // eslint-disable-next-line + const noteStemHeight = this.stem.getHeight(); + const flagX = this.getStemX(); + // FIXME: What's with the magic +/- 2 + // ANSWER: a corner of the note stem pokes out beyond the tip of the flag. + // The extra +/- 2 pushes the flag glyph outward so it covers the stem entirely. + // Alternatively, we could shorten the stem. + const extension = this.flag !== undefined ? this.flag.checkMetrics().y_shift : 0; + const flagY = this.getStemDirection() === _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.DOWN + ? // Down stems are below the note head and have flags on the right. + y_top - noteStemHeight + 2 - extension + : // Up stems are above the note head and have flags on the right. + y_bottom - noteStemHeight - 2 - extension; + // Draw the Flag + ctx.openGroup('flag', undefined, { pointerBBox: true }); + this.applyStyle(ctx, this.getFlagStyle()); + (_a = this.flag) === null || _a === void 0 ? void 0 : _a.render(ctx, flagX, flagY); + this.restoreStyle(ctx, this.getFlagStyle()); + ctx.closeGroup(); + } + } + // Draw the NoteHeads + drawNoteHeads() { + const ctx = this.checkContext(); + this._noteHeads.forEach((notehead) => { + ctx.openGroup('notehead', undefined, { pointerBBox: true }); + notehead.setContext(ctx).draw(); + ctx.closeGroup(); + }); + } + drawStem(stemOptions) { + var _a; + // GCR TODO: I can't find any context in which this is called with the stemStruct + // argument in the codebase or tests. Nor can I find a case where super.drawStem + // is called at all. Perhaps these should be removed? + const ctx = this.checkContext(); + if (stemOptions) { + this.setStem(new _stem__WEBPACK_IMPORTED_MODULE_3__.Stem(stemOptions)); + } + // If we will render a flag, we shorten the stem so that the tip + // does not poke through the flag. + if (this.shouldDrawFlag() && this.stem) { + this.stem.adjustHeightForFlag(); + } + ctx.openGroup('stem', undefined, { pointerBBox: true }); + (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setContext(ctx).draw(); + ctx.closeGroup(); + } + /** + * Override stemmablenote stem extension to adjust for distance from middle line. + */ + getStemExtension() { + const super_stem_extension = super.getStemExtension(); + if (!this.glyph.stem) { + return super_stem_extension; + } + const stem_direction = this.getStemDirection(); + if (stem_direction !== this.calculateOptimalStemDirection()) { + return super_stem_extension; // no adjustment for manually set stem direction. + } + let mid_line_distance; + const MIDDLE_LINE = 3; + if (stem_direction === _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP) { + // Note that the use of maxLine here instead of minLine might + // seem counterintuitive, but in the case of (say) treble clef + // chord(F2, E4) stem up, we do not want to extend the stem because + // of F2, when a normal octave-length stem above E4 is fine. + // + // maxLine and minLine are set in calculateOptimalStemDirection() so + // will be known. + mid_line_distance = MIDDLE_LINE - this.maxLine; + } + else { + mid_line_distance = this.minLine - MIDDLE_LINE; + } + // how many lines more than an octave is the relevant notehead? + const lines_over_octave_from_mid_line = mid_line_distance - 3.5; + if (lines_over_octave_from_mid_line <= 0) { + return super_stem_extension; + } + const stave = this.getStave(); + let spacing_between_lines = 10; + if (stave != undefined) { + spacing_between_lines = stave.getSpacingBetweenLines(); + } + return super_stem_extension + lines_over_octave_from_mid_line * spacing_between_lines; + } + // Draws all the `StaveNote` parts. This is the main drawing method. + draw() { + var _a; + if (this.ys.length === 0) { + throw new _util__WEBPACK_IMPORTED_MODULE_7__.RuntimeError('NoYValues', "Can't draw note without Y values."); + } + const ctx = this.checkContext(); + const xBegin = this.getNoteHeadBeginX(); + const shouldRenderStem = this.hasStem() && !this.beam; + // Format note head x positions + this._noteHeads.forEach((notehead) => notehead.setX(xBegin)); + // Format stem x positions + const stemX = this.getStemX(); + (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setNoteHeadXBounds(stemX, stemX); + L('Rendering ', this.isChord() ? 'chord :' : 'note :', this.keys); + // Apply the overall style -- may be contradicted by local settings: + this.applyStyle(); + this.setAttribute('el', ctx.openGroup('stavenote', this.getAttribute('id'))); + this.drawLedgerLines(); + ctx.openGroup('note', undefined, { pointerBBox: true }); + if (shouldRenderStem) + this.drawStem(); + this.drawNoteHeads(); + this.drawFlag(); + ctx.closeGroup(); + this.drawModifiers(); + ctx.closeGroup(); + this.restoreStyle(); + this.setRendered(); + } +} +StaveNote.DEBUG = false; + + +/***/ }), + +/***/ "./src/staverepetition.ts": +/*!********************************!*\ + !*** ./src/staverepetition.ts ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Repetition": () => (/* binding */ Repetition) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _stavemodifier__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./stavemodifier */ "./src/stavemodifier.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author Larry Kuhns 2011 + + + + + +class Repetition extends _stavemodifier__WEBPACK_IMPORTED_MODULE_2__.StaveModifier { + constructor(type, x, y_shift) { + super(); + this.symbol_type = type; + this.x = x; + this.x_shift = 0; + this.y_shift = y_shift; + this.resetFont(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_4__.Category.Repetition; + } + setShiftX(x) { + this.x_shift = x; + return this; + } + setShiftY(y) { + this.y_shift = y; + return this; + } + draw(stave, x) { + this.setRendered(); + switch (this.symbol_type) { + case Repetition.type.CODA_RIGHT: + this.drawCodaFixed(stave, x + stave.getWidth()); + break; + case Repetition.type.CODA_LEFT: + this.drawSymbolText(stave, x, 'Coda', true); + break; + case Repetition.type.SEGNO_LEFT: + this.drawSignoFixed(stave, x); + break; + case Repetition.type.SEGNO_RIGHT: + this.drawSignoFixed(stave, x + stave.getWidth()); + break; + case Repetition.type.DC: + this.drawSymbolText(stave, x, 'D.C.', false); + break; + case Repetition.type.DC_AL_CODA: + this.drawSymbolText(stave, x, 'D.C. al', true); + break; + case Repetition.type.DC_AL_FINE: + this.drawSymbolText(stave, x, 'D.C. al Fine', false); + break; + case Repetition.type.DS: + this.drawSymbolText(stave, x, 'D.S.', false); + break; + case Repetition.type.DS_AL_CODA: + this.drawSymbolText(stave, x, 'D.S. al', true); + break; + case Repetition.type.DS_AL_FINE: + this.drawSymbolText(stave, x, 'D.S. al Fine', false); + break; + case Repetition.type.FINE: + this.drawSymbolText(stave, x, 'Fine', false); + break; + case Repetition.type.TO_CODA: + this.drawSymbolText(stave, x, 'To', true); + break; + default: + break; + } + return this; + } + drawCodaFixed(stave, x) { + const y = stave.getYForTopText(stave.getNumLines()) + this.y_shift; + _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.renderGlyph(stave.checkContext(), this.x + x + this.x_shift, y + _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY'), 40, 'coda', { category: 'coda' }); + return this; + } + drawSignoFixed(stave, x) { + const y = stave.getYForTopText(stave.getNumLines()) + this.y_shift; + _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.renderGlyph(stave.checkContext(), this.x + x + this.x_shift, y + _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY'), 30, 'segno', { category: 'segno' }); + return this; + } + drawSymbolText(stave, x, text, draw_coda) { + const ctx = stave.checkContext(); + ctx.save(); + ctx.setFont(this.textFont); + let text_x = 0; + let symbol_x = 0; + const modifierWidth = stave.getNoteStartX() - this.x; + switch (this.symbol_type) { + // To the left with symbol + case Repetition.type.CODA_LEFT: + // Offset Coda text to right of stave beginning + text_x = this.x + stave.getVerticalBarWidth(); + symbol_x = + text_x + + ctx.measureText(text).width + + _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol'); + break; + // To the right without symbol + case Repetition.type.DC: + case Repetition.type.DC_AL_FINE: + case Repetition.type.DS: + case Repetition.type.DS_AL_FINE: + case Repetition.type.FINE: + text_x = + this.x + + x + + this.x_shift + + stave.getWidth() - + _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().lookupMetric('staveRepetition.default.spacing') - + modifierWidth - + ctx.measureText(text).width; + break; + // To the right with symbol + default: + text_x = + this.x + + x + + this.x_shift + + stave.getWidth() - + _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().lookupMetric('staveRepetition.default.spacing') - + modifierWidth - + ctx.measureText(text).width - + _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol'); + symbol_x = + text_x + + ctx.measureText(text).width + + _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol'); + break; + } + const y = stave.getYForTopText(stave.getNumLines()) + + this.y_shift + + _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY'); + if (draw_coda) { + _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.renderGlyph(ctx, symbol_x, y, 40, 'coda', { category: 'coda' }); + } + ctx.fillText(text, text_x, y + 5); + ctx.restore(); + return this; + } +} +Repetition.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_0__.Font.SERIF, + size: 12, + weight: _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.BOLD, + style: _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.NORMAL, +}; +Repetition.type = { + NONE: 1, + CODA_LEFT: 2, + CODA_RIGHT: 3, + SEGNO_LEFT: 4, + SEGNO_RIGHT: 5, + DC: 6, + DC_AL_CODA: 7, + DC_AL_FINE: 8, + DS: 9, + DS_AL_CODA: 10, + DS_AL_FINE: 11, + FINE: 12, + TO_CODA: 13, // To Coda at end of stave +}; + + +/***/ }), + +/***/ "./src/stavesection.ts": +/*!*****************************!*\ + !*** ./src/stavesection.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StaveSection": () => (/* binding */ StaveSection) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _stavemodifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stavemodifier */ "./src/stavemodifier.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author Larry Kuhns 2011 + + + +class StaveSection extends _stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifier { + constructor(section, x, shift_y) { + super(); + this.setWidth(16); + this.section = section; + this.x = x; + this.shift_x = 0; + this.shift_y = shift_y; + this.resetFont(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_2__.Category.StaveSection; + } + setStaveSection(section) { + this.section = section; + return this; + } + setShiftX(x) { + this.shift_x = x; + return this; + } + setShiftY(y) { + this.shift_y = y; + return this; + } + draw(stave, shift_x) { + const ctx = stave.checkContext(); + this.setRendered(); + ctx.save(); + ctx.setLineWidth(2); + ctx.setFont(this.textFont); + const paddingX = 2; + const paddingY = 2; + const rectWidth = 2; + const textMeasurements = ctx.measureText(this.section); + const textWidth = textMeasurements.width; + const textHeight = textMeasurements.height; + const width = textWidth + 2 * paddingX; // add left & right padding + const height = textHeight + 2 * paddingY; // add top & bottom padding + // Seems to be a good default y + const y = stave.getYForTopText(2) + this.shift_y; + const x = this.x + shift_x; + ctx.beginPath(); + ctx.setLineWidth(rectWidth); + ctx.rect(x, y + textMeasurements.y - paddingY, width, height); + ctx.stroke(); + ctx.fillText(this.section, x + paddingX, y); + ctx.restore(); + return this; + } +} +StaveSection.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_0__.Font.SANS_SERIF, + size: 10, + weight: _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.BOLD, + style: _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.NORMAL, +}; + + +/***/ }), + +/***/ "./src/stavetempo.ts": +/*!***************************!*\ + !*** ./src/stavetempo.ts ***! + \***************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StaveTempo": () => (/* binding */ StaveTempo) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _stavemodifier__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./stavemodifier */ "./src/stavemodifier.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author Radosaw Eichler 2012 + + + + + +class StaveTempo extends _stavemodifier__WEBPACK_IMPORTED_MODULE_2__.StaveModifier { + constructor(tempo, x, shift_y) { + super(); + /** Font size for note. */ + this.render_options = { glyph_font_scale: 30 }; + this.tempo = tempo; + this.position = _stavemodifier__WEBPACK_IMPORTED_MODULE_2__.StaveModifierPosition.ABOVE; + this.x = x; + this.shift_x = 10; + this.shift_y = shift_y; + this.resetFont(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_4__.Category.StaveTempo; + } + setTempo(tempo) { + this.tempo = tempo; + return this; + } + setShiftX(x) { + this.shift_x = x; + return this; + } + setShiftY(y) { + this.shift_y = y; + return this; + } + draw(stave, shift_x) { + const ctx = stave.checkContext(); + this.setRendered(); + const options = this.render_options; + // FIXME: What does the '38' mean? Why 38? Is that supposed to + // be the default font size for standard notation? + const scale = options.glyph_font_scale / 38; + const name = this.tempo.name; + const duration = this.tempo.duration; + const dots = this.tempo.dots || 0; + const bpm = this.tempo.bpm; + let x = this.x + this.shift_x + shift_x; + const y = stave.getYForTopText(1) + this.shift_y; + ctx.save(); + if (name) { + ctx.setFont(this.textFont); + ctx.fillText(name, x, y); + x += ctx.measureText(name).width; + } + if (duration && bpm) { + // Override the weight and style. + ctx.setFont(Object.assign(Object.assign({}, this.textFont), { weight: 'normal', style: 'normal' })); + if (name) { + x += ctx.measureText(' ').width; + ctx.fillText('(', x, y); + x += ctx.measureText('(').width; + } + const code = _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.getGlyphProps(duration); + x += 3 * scale; + _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.renderGlyph(ctx, x, y, options.glyph_font_scale, code.code_head); + x += code.getWidth() * scale; + // Draw stem and flags + if (code.stem) { + let stem_height = 30; + if (code.beam_count) + stem_height += 3 * (code.beam_count - 1); + stem_height *= scale; + const y_top = y - stem_height; + ctx.fillRect(x - scale, y_top, scale, stem_height); + if (code.flag) { + _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.renderGlyph(ctx, x, y_top, options.glyph_font_scale, code.code_flag_upstem, { + category: 'flag.staveTempo', + }); + if (!dots) + x += 6 * scale; + } + } + // Draw dot + for (let i = 0; i < dots; i++) { + x += 6 * scale; + ctx.beginPath(); + ctx.arc(x, y + 2 * scale, 2 * scale, 0, Math.PI * 2, false); + ctx.fill(); + } + ctx.fillText(' = ' + bpm + (name ? ')' : ''), x + 3 * scale, y); + } + ctx.restore(); + return this; + } +} +StaveTempo.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_0__.Font.SERIF, + size: 14, + weight: _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.BOLD, + style: _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.NORMAL, +}; + + +/***/ }), + +/***/ "./src/stavetext.ts": +/*!**************************!*\ + !*** ./src/stavetext.ts ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StaveText": () => (/* binding */ StaveText) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _stavemodifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stavemodifier */ "./src/stavemodifier.ts"); +/* harmony import */ var _textnote__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./textnote */ "./src/textnote.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author Taehoon Moon 2014 + + + + + +class StaveText extends _stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifier { + constructor(text, position, options = {}) { + super(); + this.setWidth(16); + this.text = text; + this.position = position; + this.options = Object.assign({ shift_x: 0, shift_y: 0, justification: _textnote__WEBPACK_IMPORTED_MODULE_2__.TextNote.Justification.CENTER }, options); + this.resetFont(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.StaveText; + } + setStaveText(text) { + this.text = text; + return this; + } + setShiftX(x) { + this.shift_x = x; + return this; + } + setShiftY(y) { + this.shift_y = y; + return this; + } + setText(text) { + this.text = text; + return this; + } + draw(stave) { + const ctx = stave.checkContext(); + this.setRendered(); + ctx.save(); + ctx.setLineWidth(2); + ctx.setFont(this.textFont); + const text_width = ctx.measureText('' + this.text).width; + let x; + let y; + switch (this.position) { + case _stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifierPosition.LEFT: + case _stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifierPosition.RIGHT: + y = (stave.getYForLine(0) + stave.getBottomLineY()) / 2 + this.options.shift_y; + if (this.position === _stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifierPosition.LEFT) { + x = stave.getX() - text_width - 24 + this.options.shift_x; + } + else { + x = stave.getX() + stave.getWidth() + 24 + this.options.shift_x; + } + break; + case _stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifierPosition.ABOVE: + case _stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifierPosition.BELOW: + x = stave.getX() + this.options.shift_x; + if (this.options.justification === _textnote__WEBPACK_IMPORTED_MODULE_2__.Justification.CENTER) { + x += stave.getWidth() / 2 - text_width / 2; + } + else if (this.options.justification === _textnote__WEBPACK_IMPORTED_MODULE_2__.Justification.RIGHT) { + x += stave.getWidth() - text_width; + } + if (this.position === _stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifierPosition.ABOVE) { + y = stave.getYForTopText(2) + this.options.shift_y; + } + else { + y = stave.getYForBottomText(2) + this.options.shift_y; + } + break; + default: + throw new _util__WEBPACK_IMPORTED_MODULE_4__.RuntimeError('InvalidPosition', 'Value Must be in Modifier.Position.'); + } + ctx.fillText('' + this.text, x, y + 4); + ctx.restore(); + return this; + } +} +StaveText.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_0__.Font.SERIF, + size: 16, + weight: _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.NORMAL, + style: _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.NORMAL, +}; + + +/***/ }), + +/***/ "./src/stavetie.ts": +/*!*************************!*\ + !*** ./src/stavetie.ts ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StaveTie": () => (/* binding */ StaveTie) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// This class implements varies types of ties between contiguous notes. The +// ties include: regular ties, hammer ons, pull offs, and slides. + + + +class StaveTie extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + /** + * @param notes is a struct that has: + * + * { + * first_note: Note, + * last_note: Note, + * first_indices: [n1, n2, n3], + * last_indices: [n1, n2, n3] + * } + * + * @param text + */ + constructor(notes, text) { + super(); + this.setNotes(notes); + this.text = text; + this.render_options = { + cp1: 8, + cp2: 12, + text_shift_x: 0, + first_x_shift: 0, + last_x_shift: 0, + y_shift: 7, + tie_spacing: 0, + }; + this.resetFont(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_1__.Category.StaveTie; + } + setDirection(direction) { + this.direction = direction; + return this; + } + /** + * Set the notes to attach this tie to. + * + * @param {!Object} notes The notes to tie up. + */ + setNotes(notes) { + if (!notes.first_note && !notes.last_note) { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('BadArguments', 'Tie needs to have either first_note or last_note set.'); + } + if (!notes.first_indices) { + notes.first_indices = [0]; + } + if (!notes.last_indices) { + notes.last_indices = [0]; + } + if (notes.first_indices.length !== notes.last_indices.length) { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('BadArguments', 'Tied notes must have same number of indices.'); + } + this.notes = notes; + return this; + } + /** + * @return {boolean} Returns true if this is a partial bar. + */ + isPartial() { + return !this.notes.first_note || !this.notes.last_note; + } + renderTie(params) { + if (params.first_ys.length === 0 || params.last_ys.length === 0) { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('BadArguments', 'No Y-values to render'); + } + const ctx = this.checkContext(); + let cp1 = this.render_options.cp1; + let cp2 = this.render_options.cp2; + if (Math.abs(params.last_x_px - params.first_x_px) < 10) { + cp1 = 2; + cp2 = 8; + } + const first_x_shift = this.render_options.first_x_shift; + const last_x_shift = this.render_options.last_x_shift; + const y_shift = this.render_options.y_shift * params.direction; + // setNotes(...) verified that first_indices and last_indices are not undefined. + // As a result, we use the ! non-null assertion operator here. + // eslint-disable-next-line + const first_indices = this.notes.first_indices; + // eslint-disable-next-line + const last_indices = this.notes.last_indices; + for (let i = 0; i < first_indices.length; ++i) { + const cp_x = (params.last_x_px + last_x_shift + (params.first_x_px + first_x_shift)) / 2; + const first_y_px = params.first_ys[first_indices[i]] + y_shift; + const last_y_px = params.last_ys[last_indices[i]] + y_shift; + if (isNaN(first_y_px) || isNaN(last_y_px)) { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('BadArguments', 'Bad indices for tie rendering.'); + } + const top_cp_y = (first_y_px + last_y_px) / 2 + cp1 * params.direction; + const bottom_cp_y = (first_y_px + last_y_px) / 2 + cp2 * params.direction; + ctx.beginPath(); + ctx.moveTo(params.first_x_px + first_x_shift, first_y_px); + ctx.quadraticCurveTo(cp_x, top_cp_y, params.last_x_px + last_x_shift, last_y_px); + ctx.quadraticCurveTo(cp_x, bottom_cp_y, params.first_x_px + first_x_shift, first_y_px); + ctx.closePath(); + ctx.fill(); + } + } + renderText(first_x_px, last_x_px) { + var _a, _b, _c; + if (!this.text) + return; + const ctx = this.checkContext(); + let center_x = (first_x_px + last_x_px) / 2; + center_x -= ctx.measureText(this.text).width / 2; + const stave = (_b = (_a = this.notes.first_note) === null || _a === void 0 ? void 0 : _a.checkStave()) !== null && _b !== void 0 ? _b : (_c = this.notes.last_note) === null || _c === void 0 ? void 0 : _c.checkStave(); + if (stave) { + ctx.save(); + ctx.setFont(this.textFont); + ctx.fillText(this.text, center_x + this.render_options.text_shift_x, stave.getYForTopText() - 1); + ctx.restore(); + } + } + draw() { + this.checkContext(); + this.setRendered(); + const first_note = this.notes.first_note; + const last_note = this.notes.last_note; + // Provide some default values so the compiler doesn't complain. + let first_x_px = 0; + let last_x_px = 0; + let first_ys = [0]; + let last_ys = [0]; + let stem_direction = 0; + if (first_note) { + first_x_px = first_note.getTieRightX() + this.render_options.tie_spacing; + stem_direction = first_note.getStemDirection(); + first_ys = first_note.getYs(); + } + else if (last_note) { + const stave = last_note.checkStave(); + first_x_px = stave.getTieStartX(); + first_ys = last_note.getYs(); + this.notes.first_indices = this.notes.last_indices; + } + if (last_note) { + last_x_px = last_note.getTieLeftX() + this.render_options.tie_spacing; + stem_direction = last_note.getStemDirection(); + last_ys = last_note.getYs(); + } + else if (first_note) { + const stave = first_note.checkStave(); + last_x_px = stave.getTieEndX(); + last_ys = first_note.getYs(); + this.notes.last_indices = this.notes.first_indices; + } + if (this.direction) { + stem_direction = this.direction; + } + this.renderTie({ + first_x_px, + last_x_px, + first_ys, + last_ys, + direction: stem_direction, + }); + this.renderText(first_x_px, last_x_px); + return true; + } +} +/** Default text font. */ +StaveTie.TEXT_FONT = Object.assign({}, _element__WEBPACK_IMPORTED_MODULE_0__.Element.TEXT_FONT); + + +/***/ }), + +/***/ "./src/stavevolta.ts": +/*!***************************!*\ + !*** ./src/stavevolta.ts ***! + \***************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "VoltaType": () => (/* binding */ VoltaType), +/* harmony export */ "Volta": () => (/* binding */ Volta) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _stavemodifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stavemodifier */ "./src/stavemodifier.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author Larry Kuhns 2011 + + + +var VoltaType; +(function (VoltaType) { + VoltaType[VoltaType["NONE"] = 1] = "NONE"; + VoltaType[VoltaType["BEGIN"] = 2] = "BEGIN"; + VoltaType[VoltaType["MID"] = 3] = "MID"; + VoltaType[VoltaType["END"] = 4] = "END"; + VoltaType[VoltaType["BEGIN_END"] = 5] = "BEGIN_END"; +})(VoltaType || (VoltaType = {})); +class Volta extends _stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifier { + constructor(type, number, x, y_shift) { + super(); + this.volta = type; + this.x = x; + this.y_shift = y_shift; + this.number = number; + this.resetFont(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_2__.Category.Volta; + } + static get type() { + return VoltaType; + } + setShiftY(y) { + this.y_shift = y; + return this; + } + draw(stave, x) { + const ctx = stave.checkContext(); + this.setRendered(); + let width = stave.getWidth() - x; // don't include x (offset) for width + const top_y = stave.getYForTopText(stave.getNumLines()) + this.y_shift; + const vert_height = 1.5 * stave.getSpacingBetweenLines(); + switch (this.volta) { + case VoltaType.BEGIN: + ctx.fillRect(this.x + x, top_y, 1, vert_height); + break; + case VoltaType.END: + width -= 5; + ctx.fillRect(this.x + x + width, top_y, 1, vert_height); + break; + case VoltaType.BEGIN_END: + width -= 3; + ctx.fillRect(this.x + x, top_y, 1, vert_height); + ctx.fillRect(this.x + x + width, top_y, 1, vert_height); + break; + default: + break; + } + // If the beginning of a volta, draw measure number + if (this.volta === VoltaType.BEGIN || this.volta === VoltaType.BEGIN_END) { + ctx.save(); + ctx.setFont(this.textFont); + ctx.fillText(this.number, this.x + x + 5, top_y + 15); + ctx.restore(); + } + ctx.fillRect(this.x + x, top_y, width, 1); + return this; + } +} +Volta.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_0__.Font.SANS_SERIF, + size: 9, + weight: _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.BOLD, + style: _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.NORMAL, +}; + + +/***/ }), + +/***/ "./src/stem.ts": +/*!*********************!*\ + !*** ./src/stem.ts ***! + \*********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Stem": () => (/* binding */ Stem) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// ## Description +// This file implements the `Stem` object. Generally this object is handled +// by its parent `StemmableNote`. + + + + +// eslint-disable-next-line +function L(...args) { + if (Stem.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_3__.log)('Vex.Flow.Stem', args); +} +class Stem extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + constructor(options) { + super(); + this.stem_up_y_offset = 0; + this.stem_down_y_offset = 0; + this.stem_up_y_base_offset = 0; + this.stem_down_y_base_offset = 0; + // Default notehead x bounds + this.x_begin = (options === null || options === void 0 ? void 0 : options.x_begin) || 0; + this.x_end = (options === null || options === void 0 ? void 0 : options.x_end) || 0; + // Y bounds for top/bottom most notehead + this.y_top = (options === null || options === void 0 ? void 0 : options.y_top) || 0; + this.y_bottom = (options === null || options === void 0 ? void 0 : options.y_bottom) || 0; + // Stem top extension + this.stem_extension = (options === null || options === void 0 ? void 0 : options.stem_extension) || 0; + // Direction of the stem + this.stem_direction = (options === null || options === void 0 ? void 0 : options.stem_direction) || 0; + // Flag to override all draw calls + this.hide = (options === null || options === void 0 ? void 0 : options.hide) || false; + this.isStemlet = (options === null || options === void 0 ? void 0 : options.isStemlet) || false; + this.stemletHeight = (options === null || options === void 0 ? void 0 : options.stemletHeight) || 0; + // Use to adjust the rendered height without affecting + // the results of `.getExtents()` + this.renderHeightAdjustment = 0; + this.setOptions(options); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_2__.Category.Stem; + } + // Stem directions + static get UP() { + return 1; + } + static get DOWN() { + return -1; + } + // Theme + static get WIDTH() { + return _tables__WEBPACK_IMPORTED_MODULE_1__.Tables.STEM_WIDTH; + } + static get HEIGHT() { + return _tables__WEBPACK_IMPORTED_MODULE_1__.Tables.STEM_HEIGHT; + } + setOptions(options) { + // Changing where the stem meets the head + this.stem_up_y_offset = (options === null || options === void 0 ? void 0 : options.stem_up_y_offset) || 0; + this.stem_down_y_offset = (options === null || options === void 0 ? void 0 : options.stem_down_y_offset) || 0; + this.stem_up_y_base_offset = (options === null || options === void 0 ? void 0 : options.stem_up_y_base_offset) || 0; + this.stem_down_y_base_offset = (options === null || options === void 0 ? void 0 : options.stem_down_y_base_offset) || 0; + } + // Set the x bounds for the default notehead + setNoteHeadXBounds(x_begin, x_end) { + this.x_begin = x_begin; + this.x_end = x_end; + return this; + } + // Set the direction of the stem in relation to the noteheads + setDirection(direction) { + this.stem_direction = direction; + } + // Set the extension for the stem, generally for flags or beams + setExtension(ext) { + this.stem_extension = ext; + } + getExtension() { + return this.stem_extension; + } + // The the y bounds for the top and bottom noteheads + setYBounds(y_top, y_bottom) { + this.y_top = y_top; + this.y_bottom = y_bottom; + } + // Gets the entire height for the stem + getHeight() { + const y_offset = this.stem_direction === Stem.UP ? this.stem_up_y_offset : this.stem_down_y_offset; + const unsigned_height = this.y_bottom - this.y_top + (Stem.HEIGHT - y_offset + this.stem_extension); // parentheses just for grouping. + return unsigned_height * this.stem_direction; + } + getBoundingBox() { + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('NotImplemented', 'getBoundingBox() not implemented.'); + } + // Get the y coordinates for the very base of the stem to the top of + // the extension + getExtents() { + const isStemUp = this.stem_direction === Stem.UP; + const ys = [this.y_top, this.y_bottom]; + const stemHeight = Stem.HEIGHT + this.stem_extension; + const innerMostNoteheadY = (isStemUp ? Math.min : Math.max)(...ys); + const outerMostNoteheadY = (isStemUp ? Math.max : Math.min)(...ys); + const stemTipY = innerMostNoteheadY + stemHeight * -this.stem_direction; + return { topY: stemTipY, baseY: outerMostNoteheadY }; + } + setVisibility(isVisible) { + this.hide = !isVisible; + return this; + } + setStemlet(isStemlet, stemletHeight) { + this.isStemlet = isStemlet; + this.stemletHeight = stemletHeight; + return this; + } + adjustHeightForFlag() { + this.renderHeightAdjustment = _tables__WEBPACK_IMPORTED_MODULE_1__.Tables.currentMusicFont().lookupMetric('stem.heightAdjustmentForFlag', -3); + } + adjustHeightForBeam() { + this.renderHeightAdjustment = -Stem.WIDTH / 2; + } + // Render the stem onto the canvas + draw() { + this.setRendered(); + if (this.hide) + return; + const ctx = this.checkContext(); + let stem_x; + let stem_y; + const stem_direction = this.stem_direction; + let y_base_offset = 0; + if (stem_direction === Stem.DOWN) { + // Down stems are rendered to the left of the head. + stem_x = this.x_begin; + stem_y = this.y_top + this.stem_down_y_offset; + y_base_offset = this.stem_down_y_base_offset; + } + else { + // Up stems are rendered to the right of the head. + stem_x = this.x_end; + stem_y = this.y_bottom - this.stem_up_y_offset; + y_base_offset = this.stem_up_y_base_offset; + } + const stemHeight = this.getHeight(); + L('Rendering stem - ', 'Top Y: ', this.y_top, 'Bottom Y: ', this.y_bottom); + // The offset from the stem's base which is required fo satisfy the stemlet height + const stemletYOffset = this.isStemlet ? stemHeight - this.stemletHeight * this.stem_direction : 0; + // Draw the stem + ctx.save(); + this.applyStyle(ctx); + ctx.beginPath(); + ctx.setLineWidth(Stem.WIDTH); + ctx.moveTo(stem_x, stem_y - stemletYOffset + y_base_offset); + ctx.lineTo(stem_x, stem_y - stemHeight - this.renderHeightAdjustment * stem_direction); + ctx.stroke(); + this.restoreStyle(ctx); + ctx.restore(); + } +} +/** To enable logging for this class. Set `Vex.Flow.Stem.DEBUG` to `true`. */ +Stem.DEBUG = false; + + +/***/ }), + +/***/ "./src/stemmablenote.ts": +/*!******************************!*\ + !*** ./src/stemmablenote.ts ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StemmableNote": () => (/* binding */ StemmableNote) +/* harmony export */ }); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./note */ "./src/note.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// ## Description +// `StemmableNote` is an abstract interface for notes with optional stems. +// Examples of stemmable notes are `StaveNote` and `TabNote` + + + + + + +class StemmableNote extends _note__WEBPACK_IMPORTED_MODULE_1__.Note { + constructor(noteStruct) { + super(noteStruct); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_4__.Category.StemmableNote; + } + // Get and set the note's `Stem` + getStem() { + return this.stem; + } + checkStem() { + if (!this.stem) { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('NoStem', 'No stem attached to instance'); + } + return this.stem; + } + setStem(stem) { + this.stem = stem; + return this; + } + // Builds and sets a new stem + buildStem() { + const stem = new _stem__WEBPACK_IMPORTED_MODULE_2__.Stem(); + this.setStem(stem); + return this; + } + buildFlag(category = 'flag') { + const { glyph } = this; + if (this.hasFlag()) { + const flagCode = this.getStemDirection() === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN ? glyph.code_flag_downstem : glyph.code_flag_upstem; + this.flag = new _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph(flagCode, this.render_options.glyph_font_scale, { category }); + } + } + // Get the custom glyph associated with the outer note head on the base of the stem. + getBaseCustomNoteHeadGlyph() { + if (this.getStemDirection() === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN) { + return this.customGlyphs[this.customGlyphs.length - 1]; + } + else { + return this.customGlyphs[0]; + } + } + // Get the full length of stem + getStemLength() { + return _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.HEIGHT + this.getStemExtension(); + } + // Get the number of beams for this duration + getBeamCount() { + const glyph = this.getGlyph(); + if (glyph) { + return glyph.beam_count; + } + else { + return 0; + } + } + // Get the minimum length of stem + getStemMinimumLength() { + const frac = _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.durationToFraction(this.duration); + let length = frac.value() <= 1 ? 0 : 20; + // if note is flagged, cannot shorten beam + switch (this.duration) { + case '8': + if (this.beam == undefined) + length = 35; + break; + case '16': + length = this.beam == undefined ? 35 : 25; + break; + case '32': + length = this.beam == undefined ? 45 : 35; + break; + case '64': + length = this.beam == undefined ? 50 : 40; + break; + case '128': + length = this.beam == undefined ? 55 : 45; + break; + default: + break; + } + return length; + } + // Get/set the direction of the stem + getStemDirection() { + if (!this.stem_direction) + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('NoStem', 'No stem attached to this note.'); + return this.stem_direction; + } + setStemDirection(direction) { + if (!direction) + direction = _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP; + if (direction !== _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.UP && direction !== _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN) { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('BadArgument', `Invalid stem direction: ${direction}`); + } + this.stem_direction = direction; + // Reset and reformat everything. Flag has to be built before calling getStemExtension. + this.reset(); + if (this.hasFlag()) { + this.buildFlag(); + } + this.beam = undefined; + if (this.stem) { + this.stem.setDirection(direction); + this.stem.setExtension(this.getStemExtension()); + // Lookup the base custom notehead (closest to the base of the stem) to extend or shorten + // the stem appropriately. If there's no custom note head, lookup the standard notehead. + const glyph = this.getBaseCustomNoteHeadGlyph() || this.getGlyph(); + // Get the font-specific customizations for the note heads. + const offsets = _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().lookupMetric(`stem.noteHead.${glyph.code_head}`, { + offsetYBaseStemUp: 0, + offsetYTopStemUp: 0, + offsetYBaseStemDown: 0, + offsetYTopStemDown: 0, + }); + // Configure the stem to use these offsets. + this.stem.setOptions({ + stem_up_y_offset: offsets.offsetYTopStemUp, + stem_down_y_offset: offsets.offsetYTopStemDown, + stem_up_y_base_offset: offsets.offsetYBaseStemUp, + stem_down_y_base_offset: offsets.offsetYBaseStemDown, // glyph.stem_down_y_base_offset, + }); + } + if (this.preFormatted) { + this.preFormat(); + } + return this; + } + // Get the `x` coordinate of the stem + getStemX() { + const x_begin = this.getAbsoluteX() + this.x_shift; + const x_end = this.getAbsoluteX() + this.x_shift + this.getGlyphWidth(); + const stem_x = this.stem_direction === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN ? x_begin : x_end; + return stem_x; + } + // Get the `x` coordinate for the center of the glyph. + // Used for `TabNote` stems and stemlets over rests + getCenterGlyphX() { + return this.getAbsoluteX() + this.x_shift + this.getGlyphWidth() / 2; + } + // Get the stem extension for the current duration + getStemExtension() { + const glyph = this.getGlyph(); + if (this.stem_extension_override != undefined) { + return this.stem_extension_override; + } + // Use stem_beam_extension with beams + if (this.beam) { + return glyph.stem_beam_extension; + } + const flagCode = this.getStemDirection() === _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.DOWN ? this.glyph.code_flag_downstem : this.glyph.code_flag_upstem; + return Math.abs(_tables__WEBPACK_IMPORTED_MODULE_3__.Tables.currentMusicFont().lookupMetric(`glyphs.flag.${flagCode}.shiftY`, 0)); + } + // Set the stem length to a specific. Will override the default length. + setStemLength(height) { + this.stem_extension_override = height - _stem__WEBPACK_IMPORTED_MODULE_2__.Stem.HEIGHT; + return this; + } + // Get the top and bottom `y` values of the stem. + getStemExtents() { + if (!this.stem) + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('NoStem', 'No stem attached to this note.'); + return this.stem.getExtents(); + } + /** Gets the `y` value for the top modifiers at a specific `textLine`. */ + getYForTopText(textLine) { + const stave = this.checkStave(); + if (this.hasStem()) { + const extents = this.getStemExtents(); + if (!extents) + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('InvalidState', 'Stem does not have extents.'); + return Math.min(stave.getYForTopText(textLine), extents.topY - this.render_options.annotation_spacing * (textLine + 1)); + } + else { + return stave.getYForTopText(textLine); + } + } + /** Gets the `y` value for the bottom modifiers at a specific `textLine`. */ + getYForBottomText(textLine) { + const stave = this.checkStave(); + if (this.hasStem()) { + const extents = this.getStemExtents(); + if (!extents) + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('InvalidState', 'Stem does not have extents.'); + return Math.max(stave.getYForTopText(textLine), extents.baseY + this.render_options.annotation_spacing * textLine); + } + else { + return stave.getYForBottomText(textLine); + } + } + hasFlag() { + return _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.getGlyphProps(this.duration).flag && !this.beam; + } + /** Post formats the note. */ + postFormat() { + var _a; + (_a = this.beam) === null || _a === void 0 ? void 0 : _a.postFormat(); + this.postFormatted = true; + return this; + } + /** Renders the stem onto the canvas. */ + drawStem(stemOptions) { + var _a; + this.checkContext(); + this.setRendered(); + this.setStem(new _stem__WEBPACK_IMPORTED_MODULE_2__.Stem(stemOptions)); + (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setContext(this.getContext()).draw(); + } +} + + +/***/ }), + +/***/ "./src/stringnumber.ts": +/*!*****************************!*\ + !*** ./src/stringnumber.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StringNumber": () => (/* binding */ StringNumber) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _renderer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./renderer */ "./src/renderer.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author: Larry Kuhns +// +// This file implements the `StringNumber` class which renders string +// number annotations beside notes. + + + + + + + +class StringNumber extends _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier { + constructor(number) { + super(); + this.string_number = number; + this.setWidth(20); // ??? + this.position = _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.ABOVE; // Default position above stem or note head + this.x_shift = 0; + this.y_shift = 0; + this.text_line = 0; + this.stem_offset = 0; + this.x_offset = 0; // Horizontal offset from default + this.y_offset = 0; // Vertical offset from default + this.dashed = true; // true - draw dashed extension false - no extension + this.leg = _renderer__WEBPACK_IMPORTED_MODULE_2__.Renderer.LineEndType.NONE; // draw upward/downward leg at the of extension line + this.radius = 8; + this.resetFont(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_5__.Category.StringNumber; + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + static get metrics() { + return _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.currentMusicFont().getMetrics().glyphs.stringNumber; + } + // ## Static Methods + // Arrange string numbers inside a `ModifierContext` + static format(nums, state) { + const left_shift = state.left_shift; + const right_shift = state.right_shift; + const num_spacing = 1; + if (!nums || nums.length === 0) + return false; + const nums_list = []; + let prev_note = null; + let shift_left = 0; + let shift_right = 0; + const modLines = 0; + for (let i = 0; i < nums.length; ++i) { + const num = nums[i]; + const note = num.getNote(); + const pos = num.getPosition(); + if (!(0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isStaveNote)(note)) { + throw new _util__WEBPACK_IMPORTED_MODULE_6__.RuntimeError('NoStaveNote'); + } + const index = num.checkIndex(); + const props = note.getKeyProps()[index]; + const mc = note.getModifierContext(); + const verticalSpaceNeeded = (num.radius * 2) / _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.STAVE_LINE_DISTANCE + 0.5; + if (mc) { + if (pos === _modifier__WEBPACK_IMPORTED_MODULE_1__.ModifierPosition.ABOVE) { + num.text_line = mc.getState().top_text_line; + state.top_text_line += verticalSpaceNeeded; + } + else if (pos === _modifier__WEBPACK_IMPORTED_MODULE_1__.ModifierPosition.BELOW) { + num.text_line = mc.getState().text_line; + state.text_line += verticalSpaceNeeded; + } + } + if (note !== prev_note) { + for (let n = 0; n < note.keys.length; ++n) { + if (left_shift === 0) { + shift_left = Math.max(note.getLeftDisplacedHeadPx(), shift_left); + } + if (right_shift === 0) { + shift_right = Math.max(note.getRightDisplacedHeadPx(), shift_right); + } + } + prev_note = note; + } + const glyphLine = modLines === 0 ? props.line : modLines; + nums_list.push({ + pos, + note, + num, + line: glyphLine, + shiftL: shift_left, + shiftR: shift_right, + }); + } + // Sort string numbers by line number. + nums_list.sort((a, b) => b.line - a.line); + let num_shiftR = 0; + let x_widthL = 0; + let x_widthR = 0; + let last_line = null; + let last_note = null; + for (let i = 0; i < nums_list.length; ++i) { + let num_shift = 0; + const note = nums_list[i].note; + const pos = nums_list[i].pos; + const num = nums_list[i].num; + const line = nums_list[i].line; + const shiftR = nums_list[i].shiftR; + // Reset the position of the string number every line. + if (line !== last_line || note !== last_note) { + num_shiftR = right_shift + shiftR; + } + const num_width = num.getWidth() + num_spacing; + if (pos === _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.LEFT) { + num.setXShift(left_shift); + num_shift = shift_left + num_width; // spacing + x_widthL = num_shift > x_widthL ? num_shift : x_widthL; + } + else if (pos === _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.RIGHT) { + num.setXShift(num_shiftR); + num_shift += num_width; // spacing + x_widthR = num_shift > x_widthR ? num_shift : x_widthR; + } + last_line = line; + last_note = note; + } + state.left_shift += x_widthL; + state.right_shift += x_widthR; + return true; + } + setLineEndType(leg) { + if (leg >= _renderer__WEBPACK_IMPORTED_MODULE_2__.Renderer.LineEndType.NONE && leg <= _renderer__WEBPACK_IMPORTED_MODULE_2__.Renderer.LineEndType.DOWN) { + this.leg = leg; + } + return this; + } + setStringNumber(number) { + this.string_number = number; + return this; + } + setOffsetX(x) { + this.x_offset = x; + return this; + } + setOffsetY(y) { + this.y_offset = y; + return this; + } + setLastNote(note) { + this.last_note = note; + return this; + } + setDashed(dashed) { + this.dashed = dashed; + return this; + } + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const start = note.getModifierStartXY(this.position, this.index); + const stemDirection = note.hasStem() ? note.getStemDirection() : _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP; + let dot_x = start.x + this.x_shift + this.x_offset; + let stem_ext = {}; + if (note.hasStem()) { + stem_ext = note.checkStem().getExtents(); + } + let dot_y = start.y + this.y_shift + this.y_offset; + switch (this.position) { + case _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.ABOVE: + { + const ys = note.getYs(); + dot_y = ys.reduce((a, b) => (a < b ? a : b)); + if (note.hasStem() && stemDirection == _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP) { + dot_y = stem_ext.topY + StringNumber.metrics.stemPadding; + } + dot_y -= this.radius + StringNumber.metrics.verticalPadding + this.text_line * _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.STAVE_LINE_DISTANCE; + } + break; + case _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.BELOW: + { + const ys = note.getYs(); + dot_y = ys.reduce((a, b) => (a > b ? a : b)); + if (note.hasStem() && stemDirection == _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.DOWN) { + dot_y = stem_ext.topY - StringNumber.metrics.stemPadding; + } + dot_y += this.radius + StringNumber.metrics.verticalPadding + this.text_line * _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.STAVE_LINE_DISTANCE; + } + break; + case _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.LEFT: + dot_x -= this.radius / 2 + StringNumber.metrics.leftPadding; + break; + case _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.RIGHT: + dot_x += this.radius / 2 + StringNumber.metrics.rightPadding; + break; + default: + throw new _util__WEBPACK_IMPORTED_MODULE_6__.RuntimeError('InvalidPosition', `The position ${this.position} is invalid`); + } + ctx.save(); + ctx.beginPath(); + ctx.arc(dot_x, dot_y, this.radius, 0, Math.PI * 2, false); + ctx.setLineWidth(1.5); + ctx.stroke(); + ctx.setFont(this.textFont); + const x = dot_x - ctx.measureText(this.string_number).width / 2; + ctx.fillText('' + this.string_number, x, dot_y + 4.5); + const lastNote = this.last_note; + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isStemmableNote)(lastNote)) { + // Only StemmableNote objects have getStemX(). + const end = lastNote.getStemX() - note.getX() + 5; + ctx.setStrokeStyle('#000000'); + ctx.setLineCap('round'); + ctx.setLineWidth(0.6); + if (this.dashed) { + _renderer__WEBPACK_IMPORTED_MODULE_2__.Renderer.drawDashedLine(ctx, dot_x + 10, dot_y, dot_x + end, dot_y, [3, 3]); + } + else { + _renderer__WEBPACK_IMPORTED_MODULE_2__.Renderer.drawDashedLine(ctx, dot_x + 10, dot_y, dot_x + end, dot_y, [3, 0]); + } + let len; + let pattern; + switch (this.leg) { + case _renderer__WEBPACK_IMPORTED_MODULE_2__.Renderer.LineEndType.UP: + len = -10; + pattern = this.dashed ? [3, 3] : [3, 0]; + _renderer__WEBPACK_IMPORTED_MODULE_2__.Renderer.drawDashedLine(ctx, dot_x + end, dot_y, dot_x + end, dot_y + len, pattern); + break; + case _renderer__WEBPACK_IMPORTED_MODULE_2__.Renderer.LineEndType.DOWN: + len = 10; + pattern = this.dashed ? [3, 3] : [3, 0]; + _renderer__WEBPACK_IMPORTED_MODULE_2__.Renderer.drawDashedLine(ctx, dot_x + end, dot_y, dot_x + end, dot_y + len, pattern); + break; + default: + break; + } + } + ctx.restore(); + } +} +StringNumber.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_0__.Font.SANS_SERIF, + size: _font__WEBPACK_IMPORTED_MODULE_0__.Font.SIZE, + weight: _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.BOLD, + style: _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.NORMAL, +}; + + +/***/ }), + +/***/ "./src/strokes.ts": +/*!************************!*\ + !*** ./src/strokes.ts ***! + \************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Stroke": () => (/* binding */ Stroke) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author: Larry Kuhns +// +// This file implements the `Stroke` class which renders chord strokes +// that can be arpeggiated, brushed, rasquedo, etc. + + + + + +class Stroke extends _modifier__WEBPACK_IMPORTED_MODULE_2__.Modifier { + constructor(type, options) { + super(); + this.options = Object.assign({ all_voices: true }, options); + // multi voice - span stroke across all voices if true + this.all_voices = this.options.all_voices; + // multi voice - end note of stroke, set in draw() + this.type = type; + this.position = _modifier__WEBPACK_IMPORTED_MODULE_2__.Modifier.Position.LEFT; + this.render_options = { + font_scale: 38, + }; + this.resetFont(); + this.setXShift(0); + this.setWidth(10); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.Stroke; + } + // Arrange strokes inside `ModifierContext` + static format(strokes, state) { + const left_shift = state.left_shift; + const stroke_spacing = 0; + if (!strokes || strokes.length === 0) + return false; + const strokeList = strokes.map((stroke) => { + const note = stroke.getNote(); + const index = stroke.checkIndex(); + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_3__.isStaveNote)(note)) { + // Only StaveNote objects have getKeyProps(). + const { line } = note.getKeyProps()[index]; + const shift = note.getLeftDisplacedHeadPx(); + return { line, shift, stroke }; + } + else if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_3__.isTabNote)(note)) { + // Only TabNote objects have getPositions(). + const { str: string } = note.getPositions()[index]; + return { line: string, shift: 0, stroke }; + } + else { + throw new _util__WEBPACK_IMPORTED_MODULE_4__.RuntimeError('Internal', 'Unexpected instance.'); + } + }); + const strokeShift = left_shift; + // There can only be one stroke .. if more than one, they overlay each other + const xShift = strokeList.reduce((xShift, { stroke, shift }) => { + stroke.setXShift(strokeShift + shift); + return Math.max(stroke.getWidth() + stroke_spacing, xShift); + }, 0); + state.left_shift += xShift; + return true; + } + getPosition() { + return this.position; + } + addEndNote(note) { + this.note_end = note; + return this; + } + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const start = note.getModifierStartXY(this.position, this.index); + let ys = note.getYs(); + let topY = start.y; + let botY = start.y; + const x = start.x - 5; + const line_space = note.checkStave().getSpacingBetweenLines(); + const notes = this.checkModifierContext().getMembers(note.getCategory()); + for (let i = 0; i < notes.length; i++) { + const note = notes[i]; + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_3__.isNote)(note)) { + // Only Note objects have getYs(). + // note is an instance of either StaveNote or TabNote. + ys = note.getYs(); + for (let n = 0; n < ys.length; n++) { + if (this.note === notes[i] || this.all_voices) { + topY = Math.min(topY, ys[n]); + botY = Math.max(botY, ys[n]); + } + } + } + } + let arrow = ''; + let arrow_shift_x = 0; + let arrow_y = 0; + let text_shift_x = 0; + let text_y = 0; + switch (this.type) { + case Stroke.Type.BRUSH_DOWN: + arrow = 'arrowheadBlackUp'; + arrow_shift_x = -3; + arrow_y = topY - line_space / 2 + 10; + botY += line_space / 2; + break; + case Stroke.Type.BRUSH_UP: + arrow = 'arrowheadBlackDown'; + arrow_shift_x = 0.5; + arrow_y = botY + line_space / 2; + topY -= line_space / 2; + break; + case Stroke.Type.ROLL_DOWN: + case Stroke.Type.RASQUEDO_DOWN: + arrow = 'arrowheadBlackUp'; + arrow_shift_x = -3; + text_shift_x = this.x_shift + arrow_shift_x - 2; + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_3__.isStaveNote)(note)) { + topY += 1.5 * line_space; + if ((botY - topY) % 2 !== 0) { + botY += 0.5 * line_space; + } + else { + botY += line_space; + } + arrow_y = topY - line_space; + text_y = botY + line_space + 2; + } + else { + topY += 1.5 * line_space; + botY += line_space; + arrow_y = topY - 0.75 * line_space; + text_y = botY + 0.25 * line_space; + } + break; + case Stroke.Type.ROLL_UP: + case Stroke.Type.RASQUEDO_UP: + arrow = 'arrowheadBlackDown'; + arrow_shift_x = -4; + text_shift_x = this.x_shift + arrow_shift_x - 1; + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_3__.isStaveNote)(note)) { + arrow_y = line_space / 2; + topY += 0.5 * line_space; + if ((botY - topY) % 2 === 0) { + botY += line_space / 2; + } + arrow_y = botY + 0.5 * line_space; + text_y = topY - 1.25 * line_space; + } + else { + topY += 0.25 * line_space; + botY += 0.5 * line_space; + arrow_y = botY + 0.25 * line_space; + text_y = topY - line_space; + } + break; + case Stroke.Type.ARPEGGIO_DIRECTIONLESS: + topY += 0.5 * line_space; + botY += line_space; // * 0.5 can lead to slight underlap instead of overlap sometimes + break; + default: + throw new _util__WEBPACK_IMPORTED_MODULE_4__.RuntimeError('InvalidType', `The stroke type ${this.type} does not exist`); + } + let strokeLine = 'straight'; + // Draw the stroke + if (this.type === Stroke.Type.BRUSH_DOWN || this.type === Stroke.Type.BRUSH_UP) { + ctx.fillRect(x + this.x_shift, topY, 1, botY - topY); + } + else { + strokeLine = 'wiggly'; + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_3__.isStaveNote)(note)) { + for (let i = topY; i <= botY; i += line_space) { + _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.renderGlyph(ctx, x + this.x_shift - 4, i, this.render_options.font_scale, 'vexWiggleArpeggioUp'); + } + } + else { + let i; + for (i = topY; i <= botY; i += 10) { + _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.renderGlyph(ctx, x + this.x_shift - 4, i, this.render_options.font_scale, 'vexWiggleArpeggioUp'); + } + if (this.type === Stroke.Type.RASQUEDO_DOWN) { + text_y = i + 0.25 * line_space; + } + } + } + if (this.type === Stroke.Type.ARPEGGIO_DIRECTIONLESS) { + return; // skip drawing arrow heads or text + } + // Draw the arrow head + _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.renderGlyph(ctx, x + this.x_shift + arrow_shift_x, arrow_y, this.render_options.font_scale, arrow, { + category: `stroke.${arrow}.${strokeLine}`, + }); + // Draw the rasquedo "R" + if (this.type === Stroke.Type.RASQUEDO_DOWN || this.type === Stroke.Type.RASQUEDO_UP) { + ctx.save(); + ctx.setFont(this.textFont); + ctx.fillText('R', x + text_shift_x, text_y); + ctx.restore(); + } + } +} +Stroke.Type = { + BRUSH_DOWN: 1, + BRUSH_UP: 2, + ROLL_DOWN: 3, + ROLL_UP: 4, + RASQUEDO_DOWN: 5, + RASQUEDO_UP: 6, + ARPEGGIO_DIRECTIONLESS: 7, // Arpeggiated chord without upwards or downwards arrow +}; +Stroke.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_0__.Font.SERIF, + size: _font__WEBPACK_IMPORTED_MODULE_0__.Font.SIZE, + weight: _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.BOLD, + style: _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.ITALIC, +}; + + +/***/ }), + +/***/ "./src/svgcontext.ts": +/*!***************************!*\ + !*** ./src/svgcontext.ts ***! + \***************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "SVGContext": () => (/* binding */ SVGContext) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _rendercontext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./rendercontext */ "./src/rendercontext.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// @author Gregory Ristow (2015) + + + +/** For a particular element type (e.g., rect), we will not apply certain presentation attributes. */ +const ATTRIBUTES_TO_IGNORE = { + path: { + x: true, + y: true, + width: true, + height: true, + 'font-family': true, + 'font-weight': true, + 'font-style': true, + 'font-size': true, + }, + rect: { + 'font-family': true, + 'font-weight': true, + 'font-style': true, + 'font-size': true, + }, + text: { + width: true, + height: true, + }, +}; +/** Create the SVG in the SVG namespace. */ +const SVG_NS = 'http://www.w3.org/2000/svg'; +const TWO_PI = 2 * Math.PI; +class MeasureTextCache { + constructor() { + // The cache is keyed first by the text string, then by the font attributes + // joined together. + this.cache = {}; + } + lookup(text, svg, attributes) { + let entries = this.cache[text]; + if (entries === undefined) { + entries = {}; + this.cache[text] = entries; + } + const family = attributes['font-family']; + const size = attributes['font-size']; + const weight = attributes['font-weight']; + const style = attributes['font-style']; + const key = `${family}%${size}%${weight}%${style}`; + let entry = entries[key]; + if (entry === undefined) { + entry = this.measureImpl(text, svg, attributes); + entries[key] = entry; + } + return entry; + } + measureImpl(text, svg, attributes) { + let txt = this.txt; + if (!txt) { + // Create the SVG text element that will be used to measure text in the event + // of a cache miss. + txt = document.createElementNS(SVG_NS, 'text'); + this.txt = txt; + } + txt.textContent = text; + txt.setAttributeNS(null, 'font-family', attributes['font-family']); + txt.setAttributeNS(null, 'font-size', attributes['font-size']); + txt.setAttributeNS(null, 'font-style', attributes['font-style']); + txt.setAttributeNS(null, 'font-weight', attributes['font-weight']); + svg.appendChild(txt); + const bbox = txt.getBBox(); + svg.removeChild(txt); + return { x: bbox.x, y: bbox.y, width: bbox.width, height: bbox.height }; + } +} +/** + * SVG rendering context with an API similar to CanvasRenderingContext2D. + */ +class SVGContext extends _rendercontext__WEBPACK_IMPORTED_MODULE_1__.RenderContext { + constructor(element) { + super(); + this.width = 0; + this.height = 0; + this.backgroundFillStyle = 'white'; + /** Formatted as CSS font shorthand (e.g., 'italic bold 12pt Arial') */ + this.fontCSSString = ''; + this.element = element; + // Create a SVG element and add it to the container element. + const svg = this.create('svg'); + this.element.appendChild(svg); + this.svg = svg; + this.parent = this.svg; + this.groups = [this.svg]; + this.path = ''; + this.pen = { x: NaN, y: NaN }; + this.lineWidth = 1.0; + const defaultFontAttributes = { + 'font-family': _font__WEBPACK_IMPORTED_MODULE_0__.Font.SANS_SERIF, + 'font-size': _font__WEBPACK_IMPORTED_MODULE_0__.Font.SIZE + 'pt', + 'font-weight': _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.NORMAL, + 'font-style': _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.NORMAL, + }; + this.state = Object.assign({ scale: { x: 1, y: 1 } }, defaultFontAttributes); + this.attributes = Object.assign({ 'stroke-width': 0.3, 'stroke-dasharray': 'none', fill: 'black', stroke: 'black' }, defaultFontAttributes); + this.shadow_attributes = { + width: 0, + color: 'black', + }; + this.state_stack = []; + } + create(svgElementType) { + return document.createElementNS(SVG_NS, svgElementType); + } + // Allow grouping elements in containers for interactivity. + openGroup(cls, id, attrs) { + const group = this.create('g'); + this.groups.push(group); + this.parent.appendChild(group); + this.parent = group; + if (cls) + group.setAttribute('class', (0,_util__WEBPACK_IMPORTED_MODULE_2__.prefix)(cls)); + if (id) + group.setAttribute('id', (0,_util__WEBPACK_IMPORTED_MODULE_2__.prefix)(id)); + if (attrs && attrs.pointerBBox) { + group.setAttribute('pointer-events', 'bounding-box'); + } + return group; + } + closeGroup() { + this.groups.pop(); + this.parent = this.groups[this.groups.length - 1]; + } + add(elem) { + this.parent.appendChild(elem); + } + setFillStyle(style) { + this.attributes.fill = style; + return this; + } + /** + * Used to set the fill color for `clearRect()`. This allows us to simulate + * cutting a "hole" into the SVG drawing. + */ + setBackgroundFillStyle(style) { + this.backgroundFillStyle = style; + return this; + } + setStrokeStyle(style) { + this.attributes.stroke = style; + return this; + } + setShadowColor(color) { + this.shadow_attributes.color = color; + return this; + } + /** + * @param blur A non-negative float specifying the level of shadow blur, where 0 + * represents no blur and larger numbers represent increasingly more blur. + * @returns this + */ + setShadowBlur(blur) { + this.shadow_attributes.width = blur; + return this; + } + /** + * @param width + * @returns this + */ + setLineWidth(width) { + this.attributes['stroke-width'] = width; + this.lineWidth = width; + return this; + } + /** + * @param lineDash an array of integers in the form of [dash, space, dash, space, etc...] + * @returns this + * + * See: [SVG `stroke-dasharray` attribute](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray) + */ + setLineDash(lineDash) { + if (Object.prototype.toString.call(lineDash) === '[object Array]') { + this.attributes['stroke-dasharray'] = lineDash.join(','); + return this; + } + else { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('ArgumentError', 'lineDash must be an array of integers.'); + } + } + /** + * @param capType + * @returns this + */ + setLineCap(capType) { + this.attributes['stroke-linecap'] = capType; + return this; + } + // ### Sizing & Scaling Methods: + // TODO (GCR): See note at scale() -- separate our internal + // conception of pixel-based width/height from the style.width + // and style.height properties eventually to allow users to + // apply responsive sizing attributes to the SVG. + resize(width, height) { + this.width = width; + this.height = height; + this.element.style.width = width.toString(); + this.svg.style.width = width.toString(); + this.svg.style.height = height.toString(); + const attributes = { + width, + height, + }; + this.applyAttributes(this.svg, attributes); + this.scale(this.state.scale.x, this.state.scale.y); + return this; + } + scale(x, y) { + // uses viewBox to scale + // TODO (GCR): we may at some point want to distinguish the + // style.width / style.height properties that are applied to + // the SVG object from our internal conception of the SVG + // width/height. This would allow us to create automatically + // scaling SVG's that filled their containers, for instance. + // + // As this isn't implemented in Canvas contexts, + // I've left as is for now, but in using the viewBox to + // handle internal scaling, am trying to make it possible + // for us to eventually move in that direction. + this.state.scale = { x, y }; + const visibleWidth = this.width / x; + const visibleHeight = this.height / y; + this.setViewBox(0, 0, visibleWidth, visibleHeight); + return this; + } + /** + * 1 arg: string in the "x y w h" format + * 4 args: x:number, y:number, w:number, h:number + */ + setViewBox(viewBox_or_minX, minY, width, height) { + if (typeof viewBox_or_minX === 'string') { + this.svg.setAttribute('viewBox', viewBox_or_minX); + } + else { + const viewBoxString = viewBox_or_minX + ' ' + minY + ' ' + width + ' ' + height; + this.svg.setAttribute('viewBox', viewBoxString); + } + } + // ### Drawing helper methods: + applyAttributes(element, attributes) { + const attrNamesToIgnore = ATTRIBUTES_TO_IGNORE[element.nodeName]; + for (const attrName in attributes) { + if (attrNamesToIgnore && attrNamesToIgnore[attrName]) { + continue; + } + element.setAttributeNS(null, attrName, attributes[attrName]); + } + return element; + } + // ### Shape & Path Methods: + clear() { + // Clear the SVG by removing all inner children. + // (This approach is usually slightly more efficient + // than removing the old SVG & adding a new one to + // the container element, since it does not cause the + // container to resize twice. Also, the resize + // triggered by removing the entire SVG can trigger + // a touchcancel event when the element resizes away + // from a touch point.) + while (this.svg.lastChild) { + this.svg.removeChild(this.svg.lastChild); + } + // Replace the viewbox attribute we just removed. + this.scale(this.state.scale.x, this.state.scale.y); + } + // ## Rectangles: + rect(x, y, width, height, attributes) { + // Avoid invalid negative height attributes by flipping the rectangle on its head: + if (height < 0) { + y += height; + height *= -1; + } + const rectangle = this.create('rect'); + attributes = attributes !== null && attributes !== void 0 ? attributes : { fill: 'none', 'stroke-width': this.lineWidth, stroke: 'black' }; + this.applyAttributes(rectangle, Object.assign({ x, y, width, height }, attributes)); + this.add(rectangle); + return this; + } + fillRect(x, y, width, height) { + const attributes = { fill: this.attributes.fill }; + this.rect(x, y, width, height, attributes); + return this; + } + clearRect(x, y, width, height) { + // Currently this fills a rect with the backgroundFillStyle, rather + // than "cut a hole" into the existing shapes. + // + // Since tabNote seems to be the only module that makes use of this + // it may be worth creating a separate tabStave that would + // draw lines around locations of tablature fingering. + this.rect(x, y, width, height, { 'stroke-width': 0, fill: this.backgroundFillStyle }); + return this; + } + // ## Paths: + beginPath() { + this.path = ''; + this.pen.x = NaN; + this.pen.y = NaN; + return this; + } + moveTo(x, y) { + this.path += 'M' + x + ' ' + y; + this.pen.x = x; + this.pen.y = y; + return this; + } + lineTo(x, y) { + this.path += 'L' + x + ' ' + y; + this.pen.x = x; + this.pen.y = y; + return this; + } + bezierCurveTo(x1, y1, x2, y2, x, y) { + this.path += 'C' + x1 + ' ' + y1 + ',' + x2 + ' ' + y2 + ',' + x + ' ' + y; + this.pen.x = x; + this.pen.y = y; + return this; + } + quadraticCurveTo(x1, y1, x, y) { + this.path += 'Q' + x1 + ' ' + y1 + ',' + x + ' ' + y; + this.pen.x = x; + this.pen.y = y; + return this; + } + arc(x, y, radius, startAngle, endAngle, counterclockwise) { + const x0 = x + radius * Math.cos(startAngle); + const y0 = y + radius * Math.sin(startAngle); + // Handle the edge case where arc length is greater than or equal to + // the circle's circumference: + // https://html.spec.whatwg.org/multipage/canvas.html#ellipse-method-steps + if ((!counterclockwise && endAngle - startAngle >= TWO_PI) || + (counterclockwise && startAngle - endAngle >= TWO_PI)) { + const x1 = x + radius * Math.cos(startAngle + Math.PI); + const y1 = y + radius * Math.sin(startAngle + Math.PI); + // There's no way to specify a completely circular arc in SVG so we have to + // use two semi-circular arcs. + this.path += `M${x0} ${y0} A${radius} ${radius} 0 0 0 ${x1} ${y1} `; + this.path += `A${radius} ${radius} 0 0 0 ${x0} ${y0}`; + this.pen.x = x0; + this.pen.y = y0; + } + else { + const x1 = x + radius * Math.cos(endAngle); + const y1 = y + radius * Math.sin(endAngle); + startAngle = (0,_util__WEBPACK_IMPORTED_MODULE_2__.normalizeAngle)(startAngle); + endAngle = (0,_util__WEBPACK_IMPORTED_MODULE_2__.normalizeAngle)(endAngle); + let large; + if (Math.abs(endAngle - startAngle) < Math.PI) { + large = counterclockwise; + } + else { + large = !counterclockwise; + } + if (startAngle > endAngle) { + large = !large; + } + const sweep = !counterclockwise; + this.path += `M${x0} ${y0} A${radius} ${radius} 0 ${+large} ${+sweep} ${x1} ${y1}`; + this.pen.x = x1; + this.pen.y = y1; + } + return this; + } + closePath() { + this.path += 'Z'; + return this; + } + getShadowStyle() { + const sa = this.shadow_attributes; + // A CSS drop-shadow filter blur looks different than a canvas shadowBlur + // of the same radius, so we scale the drop-shadow radius here to make it + // look close to the canvas shadow. + return `filter: drop-shadow(0 0 ${sa.width / 1.5}px ${sa.color})`; + } + fill(attributes) { + const path = this.create('path'); + if (typeof attributes === 'undefined') { + attributes = Object.assign(Object.assign({}, this.attributes), { stroke: 'none' }); + } + attributes.d = this.path; + if (this.shadow_attributes.width > 0) { + attributes.style = this.getShadowStyle(); + } + this.applyAttributes(path, attributes); + this.add(path); + return this; + } + stroke() { + const path = this.create('path'); + const attributes = Object.assign(Object.assign({}, this.attributes), { fill: 'none', 'stroke-width': this.lineWidth, d: this.path }); + if (this.shadow_attributes.width > 0) { + attributes.style = this.getShadowStyle(); + } + this.applyAttributes(path, attributes); + this.add(path); + return this; + } + // ## Text Methods: + measureText(text) { + return SVGContext.measureTextCache.lookup(text, this.svg, this.attributes); + } + fillText(text, x, y) { + if (!text || text.length <= 0) { + return this; + } + const attributes = Object.assign(Object.assign({}, this.attributes), { stroke: 'none', x, + y }); + const txt = this.create('text'); + txt.textContent = text; + this.applyAttributes(txt, attributes); + this.add(txt); + return this; + } + // TODO: State should be deep-copied. + save() { + this.state_stack.push({ + state: { + 'font-family': this.state['font-family'], + 'font-weight': this.state['font-weight'], + 'font-style': this.state['font-style'], + 'font-size': this.state['font-size'], + scale: this.state.scale, + }, + attributes: { + 'font-family': this.attributes['font-family'], + 'font-weight': this.attributes['font-weight'], + 'font-style': this.attributes['font-style'], + 'font-size': this.attributes['font-size'], + fill: this.attributes.fill, + stroke: this.attributes.stroke, + 'stroke-width': this.attributes['stroke-width'], + 'stroke-dasharray': this.attributes['stroke-dasharray'], + }, + shadow_attributes: { + width: this.shadow_attributes.width, + color: this.shadow_attributes.color, + }, + lineWidth: this.lineWidth, + }); + return this; + } + // TODO: State should be deep-restored. + restore() { + const savedState = this.state_stack.pop(); + if (savedState) { + const state = savedState; + this.state['font-family'] = state.state['font-family']; + this.state['font-weight'] = state.state['font-weight']; + this.state['font-style'] = state.state['font-style']; + this.state['font-size'] = state.state['font-size']; + this.state.scale = state.state.scale; + this.attributes['font-family'] = state.attributes['font-family']; + this.attributes['font-weight'] = state.attributes['font-weight']; + this.attributes['font-style'] = state.attributes['font-style']; + this.attributes['font-size'] = state.attributes['font-size']; + this.attributes.fill = state.attributes.fill; + this.attributes.stroke = state.attributes.stroke; + this.attributes['stroke-width'] = state.attributes['stroke-width']; + this.attributes['stroke-dasharray'] = state.attributes['stroke-dasharray']; + this.shadow_attributes.width = state.shadow_attributes.width; + this.shadow_attributes.color = state.shadow_attributes.color; + this.lineWidth = state.lineWidth; + } + return this; + } + set fillStyle(style) { + this.setFillStyle(style); + } + get fillStyle() { + return this.attributes.fill; + } + set strokeStyle(style) { + this.setStrokeStyle(style); + } + get strokeStyle() { + return this.attributes.stroke; + } + /** + * @param f is 1) a `FontInfo` object or + * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or + * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided). + * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt'). + * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900). It is inserted + * into the font-weight attribute (e.g., font-weight="bold") + * @param style is a string (e.g., 'italic', 'normal') that is inserted into the + * font-style attribute (e.g., font-style="italic") + */ + setFont(f, size, weight, style) { + const fontInfo = _font__WEBPACK_IMPORTED_MODULE_0__.Font.validate(f, size, weight, style); + this.fontCSSString = _font__WEBPACK_IMPORTED_MODULE_0__.Font.toCSSString(fontInfo); + const fontAttributes = { + 'font-family': fontInfo.family, + 'font-size': fontInfo.size, + 'font-weight': fontInfo.weight, + 'font-style': fontInfo.style, + }; + this.attributes = Object.assign(Object.assign({}, this.attributes), fontAttributes); + this.state = Object.assign(Object.assign({}, this.state), fontAttributes); + return this; + } + /** Return a string of the form `'italic bold 15pt Arial'` */ + getFont() { + return this.fontCSSString; + } +} +SVGContext.measureTextCache = new MeasureTextCache(); + + +/***/ }), + +/***/ "./src/system.ts": +/*!***********************!*\ + !*** ./src/system.ts ***! + \***********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "System": () => (/* binding */ System) +/* harmony export */ }); +/* harmony import */ var _boundingbox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./boundingbox */ "./src/boundingbox.ts"); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _formatter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./formatter */ "./src/formatter.ts"); +/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./note */ "./src/note.ts"); +/* harmony import */ var _stave__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./stave */ "./src/stave.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + + + +/** + * System implements a musical system, which is a collection of staves, + * each which can have one or more voices. All voices across all staves in + * the system are formatted together. + */ +class System extends _element__WEBPACK_IMPORTED_MODULE_1__.Element { + constructor(params = {}) { + super(); + this.setOptions(params); + this.parts = []; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_5__.Category.System; + } + /** Set formatting options. */ + setOptions(options = {}) { + if (!options.factory) { + throw new _util__WEBPACK_IMPORTED_MODULE_6__.RuntimeError('NoFactory', 'System.setOptions(options) requires a factory.'); + } + this.factory = options.factory; + this.options = Object.assign(Object.assign({ factory: this.factory, x: 10, y: 10, width: 500, spaceBetweenStaves: 12, autoWidth: false, noJustification: false, debugFormatter: false, formatIterations: 0, noPadding: false }, options), { details: Object.assign({ alpha: 0.5 }, options.details), formatOptions: Object.assign({}, options.formatOptions) }); + if (this.options.noJustification === false && typeof options.width === 'undefined') { + this.options.autoWidth = true; + } + } + /** Set associated context. */ + setContext(context) { + super.setContext(context); + this.factory.setContext(context); + return this; + } + /** + * Add connector between staves. + * @param type see {@link StaveConnector.typeString} + */ + addConnector(type = 'double') { + this.connector = this.factory.StaveConnector({ + top_stave: this.parts[0].stave, + bottom_stave: this.parts[this.parts.length - 1].stave, + type, + }); + return this.connector; + } + /** + * Add a stave to the system. + * + * Example (one voice): + * + * `system.addStave({voices: [score.voice(score.notes('C#5/q, B4, A4, G#4'))]});` + * + * Example (two voices): + * + * `system.addStave({voices: [` + * `score.voice(score.notes('C#5/q, B4, A4, G#4', {stem: 'up'})),` + * `score.voice(score.notes('C#4/h, C#4', {stem: 'down'}))` + * `]});` + */ + addStave(params) { + var _a; + const staveOptions = Object.assign({ left_bar: false }, params.options); + const stave = (_a = params.stave) !== null && _a !== void 0 ? _a : this.factory.Stave({ x: this.options.x, y: this.options.y, width: this.options.width, options: staveOptions }); + const p = Object.assign(Object.assign({ stave, + /* voices: [], */ + spaceAbove: 0, spaceBelow: 0, debugNoteMetrics: false, noJustification: false }, params), { options: staveOptions }); + const ctx = this.getContext(); + p.voices.forEach((voice) => voice + .setContext(ctx) + .setStave(stave) + .getTickables() + .forEach((tickable) => tickable.setStave(stave))); + this.parts.push(p); + return stave; + } + /** Format the system. */ + format() { + const options_details = this.options.details; + let justifyWidth = 0; + const formatter = new _formatter__WEBPACK_IMPORTED_MODULE_2__.Formatter(options_details); + this.formatter = formatter; + let y = this.options.y; + let startX = 0; + let allVoices = []; + const debugNoteMetricsYs = []; + // Join the voices for each stave. + this.parts.forEach((part) => { + y = y + part.stave.space(part.spaceAbove); + part.stave.setY(y); + if (this.options.autoWidth) { + part.voices.forEach((voice) => { + formatter.joinVoices([voice]); + }); + } + else { + formatter.joinVoices(part.voices); + } + y = y + part.stave.space(part.spaceBelow); + y = y + part.stave.space(this.options.spaceBetweenStaves); + if (part.debugNoteMetrics) { + debugNoteMetricsYs.push({ y, voice: part.voices[0] }); + y += 15; + } + allVoices = allVoices.concat(part.voices); + startX = Math.max(startX, part.stave.getNoteStartX()); + }); + // Update the start position of all staves. + this.parts.forEach((part) => part.stave.setNoteStartX(startX)); + if (this.options.autoWidth) { + justifyWidth = formatter.preCalculateMinTotalWidth(allVoices); + this.parts.forEach((part) => { + part.stave.setWidth(justifyWidth + _stave__WEBPACK_IMPORTED_MODULE_4__.Stave.rightPadding + (startX - this.options.x)); + }); + } + else { + justifyWidth = this.options.noPadding + ? this.options.width - this.options.x + : this.options.width - (startX - this.options.x) - _stave__WEBPACK_IMPORTED_MODULE_4__.Stave.defaultPadding; + } + formatter.format(allVoices, this.options.noJustification ? 0 : justifyWidth, this.options.formatOptions); + for (let i = 0; i < this.options.formatIterations; i++) { + formatter.tune(options_details); + } + this.startX = startX; + this.debugNoteMetricsYs = debugNoteMetricsYs; + this.lastY = y; + this.boundingBox = new _boundingbox__WEBPACK_IMPORTED_MODULE_0__.BoundingBox(this.options.x, this.options.y, this.options.width, this.lastY - this.options.y); + } + /** Render the system. */ + draw() { + // Render debugging information, if requested. + const ctx = this.checkContext(); + if (!this.formatter || !this.startX || !this.lastY || !this.debugNoteMetricsYs) { + throw new _util__WEBPACK_IMPORTED_MODULE_6__.RuntimeError('NoFormatter', 'format() must be called before draw()'); + } + this.setRendered(); + if (this.options.debugFormatter) { + _formatter__WEBPACK_IMPORTED_MODULE_2__.Formatter.plotDebugging(ctx, this.formatter, this.startX, this.options.y, this.lastY); + } + this.debugNoteMetricsYs.forEach((d) => { + d.voice.getTickables().forEach((tickable) => _note__WEBPACK_IMPORTED_MODULE_3__.Note.plotMetrics(ctx, tickable, d.y)); + }); + } +} + + +/***/ }), + +/***/ "./src/tables.ts": +/*!***********************!*\ + !*** ./src/tables.ts ***! + \***********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Tables": () => (/* binding */ Tables) +/* harmony export */ }); +/* harmony import */ var _fraction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./fraction */ "./src/fraction.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. + + + +const RESOLUTION = 16384; +/** + * Map duration numbers to 'ticks', the unit of duration used throughout VexFlow. + * For example, a quarter note is 4, so it maps to RESOLUTION / 4 = 4096 ticks. + */ +const durations = { + '1/2': RESOLUTION * 2, + 1: RESOLUTION / 1, + 2: RESOLUTION / 2, + 4: RESOLUTION / 4, + 8: RESOLUTION / 8, + 16: RESOLUTION / 16, + 32: RESOLUTION / 32, + 64: RESOLUTION / 64, + 128: RESOLUTION / 128, + 256: RESOLUTION / 256, +}; +const durationAliases = { + w: '1', + h: '2', + q: '4', + // This is the default duration used to render bars (BarNote). Bars no longer + // consume ticks, so this should be a no-op. + // TODO(0xfe): This needs to be cleaned up. + b: '256', +}; +const keySignatures = { + C: { num: 0 }, + Am: { num: 0 }, + F: { acc: 'b', num: 1 }, + Dm: { acc: 'b', num: 1 }, + Bb: { acc: 'b', num: 2 }, + Gm: { acc: 'b', num: 2 }, + Eb: { acc: 'b', num: 3 }, + Cm: { acc: 'b', num: 3 }, + Ab: { acc: 'b', num: 4 }, + Fm: { acc: 'b', num: 4 }, + Db: { acc: 'b', num: 5 }, + Bbm: { acc: 'b', num: 5 }, + Gb: { acc: 'b', num: 6 }, + Ebm: { acc: 'b', num: 6 }, + Cb: { acc: 'b', num: 7 }, + Abm: { acc: 'b', num: 7 }, + G: { acc: '#', num: 1 }, + Em: { acc: '#', num: 1 }, + D: { acc: '#', num: 2 }, + Bm: { acc: '#', num: 2 }, + A: { acc: '#', num: 3 }, + 'F#m': { acc: '#', num: 3 }, + E: { acc: '#', num: 4 }, + 'C#m': { acc: '#', num: 4 }, + B: { acc: '#', num: 5 }, + 'G#m': { acc: '#', num: 5 }, + 'F#': { acc: '#', num: 6 }, + 'D#m': { acc: '#', num: 6 }, + 'C#': { acc: '#', num: 7 }, + 'A#m': { acc: '#', num: 7 }, +}; +const clefs = { + treble: { line_shift: 0 }, + bass: { line_shift: 6 }, + tenor: { line_shift: 4 }, + alto: { line_shift: 3 }, + soprano: { line_shift: 1 }, + percussion: { line_shift: 0 }, + 'mezzo-soprano': { line_shift: 2 }, + 'baritone-c': { line_shift: 5 }, + 'baritone-f': { line_shift: 5 }, + subbass: { line_shift: 7 }, + french: { line_shift: -1 }, +}; +const notesInfo = { + C: { index: 0, int_val: 0 }, + CN: { index: 0, int_val: 0, accidental: 'n' }, + 'C#': { index: 0, int_val: 1, accidental: '#' }, + 'C##': { index: 0, int_val: 2, accidental: '##' }, + CB: { index: 0, int_val: 11, accidental: 'b' }, + CBB: { index: 0, int_val: 10, accidental: 'bb' }, + D: { index: 1, int_val: 2 }, + DN: { index: 1, int_val: 2, accidental: 'n' }, + 'D#': { index: 1, int_val: 3, accidental: '#' }, + 'D##': { index: 1, int_val: 4, accidental: '##' }, + DB: { index: 1, int_val: 1, accidental: 'b' }, + DBB: { index: 1, int_val: 0, accidental: 'bb' }, + E: { index: 2, int_val: 4 }, + EN: { index: 2, int_val: 4, accidental: 'n' }, + 'E#': { index: 2, int_val: 5, accidental: '#' }, + 'E##': { index: 2, int_val: 6, accidental: '##' }, + EB: { index: 2, int_val: 3, accidental: 'b' }, + EBB: { index: 2, int_val: 2, accidental: 'bb' }, + F: { index: 3, int_val: 5 }, + FN: { index: 3, int_val: 5, accidental: 'n' }, + 'F#': { index: 3, int_val: 6, accidental: '#' }, + 'F##': { index: 3, int_val: 7, accidental: '##' }, + FB: { index: 3, int_val: 4, accidental: 'b' }, + FBB: { index: 3, int_val: 3, accidental: 'bb' }, + G: { index: 4, int_val: 7 }, + GN: { index: 4, int_val: 7, accidental: 'n' }, + 'G#': { index: 4, int_val: 8, accidental: '#' }, + 'G##': { index: 4, int_val: 9, accidental: '##' }, + GB: { index: 4, int_val: 6, accidental: 'b' }, + GBB: { index: 4, int_val: 5, accidental: 'bb' }, + A: { index: 5, int_val: 9 }, + AN: { index: 5, int_val: 9, accidental: 'n' }, + 'A#': { index: 5, int_val: 10, accidental: '#' }, + 'A##': { index: 5, int_val: 11, accidental: '##' }, + AB: { index: 5, int_val: 8, accidental: 'b' }, + ABB: { index: 5, int_val: 7, accidental: 'bb' }, + B: { index: 6, int_val: 11 }, + BN: { index: 6, int_val: 11, accidental: 'n' }, + 'B#': { index: 6, int_val: 12, accidental: '#' }, + 'B##': { index: 6, int_val: 13, accidental: '##' }, + BB: { index: 6, int_val: 10, accidental: 'b' }, + BBB: { index: 6, int_val: 9, accidental: 'bb' }, + R: { index: 6, rest: true }, + X: { + index: 6, + accidental: '', + octave: 4, + code: 'noteheadXBlack', + shift_right: 5.5, + }, +}; +const validNoteTypes = { + n: { name: 'note' }, + r: { name: 'rest' }, + h: { name: 'harmonic' }, + m: { name: 'muted' }, + s: { name: 'slash' }, + g: { name: 'ghost' }, +}; +const customNoteHeads = { + /* Diamond */ + D0: { code: 'noteheadDiamondWhole' }, + D1: { code: 'noteheadDiamondHalf' }, + D2: { code: 'noteheadDiamondBlack' }, + D3: { code: 'noteheadDiamondBlack' }, + /* Triangle */ + T0: { code: 'noteheadTriangleUpWhole' }, + T1: { code: 'noteheadTriangleUpHalf' }, + T2: { code: 'noteheadTriangleUpBlack' }, + T3: { code: 'noteheadTriangleUpBlack' }, + /* Cross */ + X0: { code: 'noteheadXWhole' }, + X1: { code: 'noteheadXHalf' }, + X2: { code: 'noteheadXBlack' }, + X3: { code: 'noteheadCircleX' }, + /* Square */ + S1: { code: 'noteheadSquareWhite' }, + S2: { code: 'noteheadSquareBlack' }, + /* Rectangle */ + R1: { code: 'vexNoteHeadRectWhite' }, + R2: { code: 'vexNoteHeadRectBlack' }, // no smufl code +}; +const accidentals = { + '#': { code: 'accidentalSharp', parenRightPaddingAdjustment: -1 }, + '##': { code: 'accidentalDoubleSharp', parenRightPaddingAdjustment: -1 }, + b: { code: 'accidentalFlat', parenRightPaddingAdjustment: -2 }, + bb: { code: 'accidentalDoubleFlat', parenRightPaddingAdjustment: -2 }, + n: { code: 'accidentalNatural', parenRightPaddingAdjustment: -1 }, + '{': { code: 'accidentalParensLeft', parenRightPaddingAdjustment: -1 }, + '}': { code: 'accidentalParensRight', parenRightPaddingAdjustment: -1 }, + db: { code: 'accidentalThreeQuarterTonesFlatZimmermann', parenRightPaddingAdjustment: -1 }, + d: { code: 'accidentalQuarterToneFlatStein', parenRightPaddingAdjustment: 0 }, + '++': { code: 'accidentalThreeQuarterTonesSharpStein', parenRightPaddingAdjustment: -1 }, + '+': { code: 'accidentalQuarterToneSharpStein', parenRightPaddingAdjustment: -1 }, + '+-': { code: 'accidentalKucukMucennebSharp', parenRightPaddingAdjustment: -1 }, + bs: { code: 'accidentalBakiyeFlat', parenRightPaddingAdjustment: -1 }, + bss: { code: 'accidentalBuyukMucennebFlat', parenRightPaddingAdjustment: -1 }, + o: { code: 'accidentalSori', parenRightPaddingAdjustment: -1 }, + k: { code: 'accidentalKoron', parenRightPaddingAdjustment: -1 }, + bbs: { code: 'vexAccidentalMicrotonal1', parenRightPaddingAdjustment: -1 }, + '++-': { code: 'vexAccidentalMicrotonal2', parenRightPaddingAdjustment: -1 }, + ashs: { code: 'vexAccidentalMicrotonal3', parenRightPaddingAdjustment: -1 }, + afhf: { code: 'vexAccidentalMicrotonal4', parenRightPaddingAdjustment: -1 }, + accSagittal5v7KleismaUp: { code: 'accSagittal5v7KleismaUp', parenRightPaddingAdjustment: -1 }, + accSagittal5v7KleismaDown: { code: 'accSagittal5v7KleismaDown', parenRightPaddingAdjustment: -1 }, + accSagittal5CommaUp: { code: 'accSagittal5CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal5CommaDown: { code: 'accSagittal5CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal7CommaUp: { code: 'accSagittal7CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal7CommaDown: { code: 'accSagittal7CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal25SmallDiesisUp: { code: 'accSagittal25SmallDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal25SmallDiesisDown: { code: 'accSagittal25SmallDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal35MediumDiesisUp: { code: 'accSagittal35MediumDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal35MediumDiesisDown: { code: 'accSagittal35MediumDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal11MediumDiesisUp: { code: 'accSagittal11MediumDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal11MediumDiesisDown: { code: 'accSagittal11MediumDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal11LargeDiesisUp: { code: 'accSagittal11LargeDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal11LargeDiesisDown: { code: 'accSagittal11LargeDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal35LargeDiesisUp: { code: 'accSagittal35LargeDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal35LargeDiesisDown: { code: 'accSagittal35LargeDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp25SDown: { code: 'accSagittalSharp25SDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat25SUp: { code: 'accSagittalFlat25SUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp7CDown: { code: 'accSagittalSharp7CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat7CUp: { code: 'accSagittalFlat7CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5CDown: { code: 'accSagittalSharp5CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5CUp: { code: 'accSagittalFlat5CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v7kDown: { code: 'accSagittalSharp5v7kDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v7kUp: { code: 'accSagittalFlat5v7kUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp: { code: 'accSagittalSharp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat: { code: 'accSagittalFlat', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v7kUp: { code: 'accSagittalSharp5v7kUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v7kDown: { code: 'accSagittalFlat5v7kDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5CUp: { code: 'accSagittalSharp5CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5CDown: { code: 'accSagittalFlat5CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp7CUp: { code: 'accSagittalSharp7CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat7CDown: { code: 'accSagittalFlat7CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp25SUp: { code: 'accSagittalSharp25SUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat25SDown: { code: 'accSagittalFlat25SDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp35MUp: { code: 'accSagittalSharp35MUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat35MDown: { code: 'accSagittalFlat35MDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp11MUp: { code: 'accSagittalSharp11MUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat11MDown: { code: 'accSagittalFlat11MDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp11LUp: { code: 'accSagittalSharp11LUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat11LDown: { code: 'accSagittalFlat11LDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp35LUp: { code: 'accSagittalSharp35LUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat35LDown: { code: 'accSagittalFlat35LDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp25SDown: { code: 'accSagittalDoubleSharp25SDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat25SUp: { code: 'accSagittalDoubleFlat25SUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp7CDown: { code: 'accSagittalDoubleSharp7CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat7CUp: { code: 'accSagittalDoubleFlat7CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp5CDown: { code: 'accSagittalDoubleSharp5CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat5CUp: { code: 'accSagittalDoubleFlat5CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp5v7kDown: { code: 'accSagittalDoubleSharp5v7kDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat5v7kUp: { code: 'accSagittalDoubleFlat5v7kUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp: { code: 'accSagittalDoubleSharp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat: { code: 'accSagittalDoubleFlat', parenRightPaddingAdjustment: -1 }, + accSagittal7v11KleismaUp: { code: 'accSagittal7v11KleismaUp', parenRightPaddingAdjustment: -1 }, + accSagittal7v11KleismaDown: { code: 'accSagittal7v11KleismaDown', parenRightPaddingAdjustment: -1 }, + accSagittal17CommaUp: { code: 'accSagittal17CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal17CommaDown: { code: 'accSagittal17CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal55CommaUp: { code: 'accSagittal55CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal55CommaDown: { code: 'accSagittal55CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal7v11CommaUp: { code: 'accSagittal7v11CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal7v11CommaDown: { code: 'accSagittal7v11CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal5v11SmallDiesisUp: { code: 'accSagittal5v11SmallDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal5v11SmallDiesisDown: { code: 'accSagittal5v11SmallDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v11SDown: { code: 'accSagittalSharp5v11SDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v11SUp: { code: 'accSagittalFlat5v11SUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp7v11CDown: { code: 'accSagittalSharp7v11CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat7v11CUp: { code: 'accSagittalFlat7v11CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp55CDown: { code: 'accSagittalSharp55CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat55CUp: { code: 'accSagittalFlat55CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp17CDown: { code: 'accSagittalSharp17CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat17CUp: { code: 'accSagittalFlat17CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp7v11kDown: { code: 'accSagittalSharp7v11kDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat7v11kUp: { code: 'accSagittalFlat7v11kUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp7v11kUp: { code: 'accSagittalSharp7v11kUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat7v11kDown: { code: 'accSagittalFlat7v11kDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp17CUp: { code: 'accSagittalSharp17CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat17CDown: { code: 'accSagittalFlat17CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp55CUp: { code: 'accSagittalSharp55CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat55CDown: { code: 'accSagittalFlat55CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp7v11CUp: { code: 'accSagittalSharp7v11CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat7v11CDown: { code: 'accSagittalFlat7v11CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v11SUp: { code: 'accSagittalSharp5v11SUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v11SDown: { code: 'accSagittalFlat5v11SDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp5v11SDown: { code: 'accSagittalDoubleSharp5v11SDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat5v11SUp: { code: 'accSagittalDoubleFlat5v11SUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp7v11CDown: { code: 'accSagittalDoubleSharp7v11CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat7v11CUp: { code: 'accSagittalDoubleFlat7v11CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp55CDown: { code: 'accSagittalDoubleSharp55CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat55CUp: { code: 'accSagittalDoubleFlat55CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp17CDown: { code: 'accSagittalDoubleSharp17CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat17CUp: { code: 'accSagittalDoubleFlat17CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp7v11kDown: { code: 'accSagittalDoubleSharp7v11kDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat7v11kUp: { code: 'accSagittalDoubleFlat7v11kUp', parenRightPaddingAdjustment: -1 }, + accSagittal23CommaUp: { code: 'accSagittal23CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal23CommaDown: { code: 'accSagittal23CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal5v19CommaUp: { code: 'accSagittal5v19CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal5v19CommaDown: { code: 'accSagittal5v19CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal5v23SmallDiesisUp: { code: 'accSagittal5v23SmallDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal5v23SmallDiesisDown: { code: 'accSagittal5v23SmallDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v23SDown: { code: 'accSagittalSharp5v23SDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v23SUp: { code: 'accSagittalFlat5v23SUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v19CDown: { code: 'accSagittalSharp5v19CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v19CUp: { code: 'accSagittalFlat5v19CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp23CDown: { code: 'accSagittalSharp23CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat23CUp: { code: 'accSagittalFlat23CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp23CUp: { code: 'accSagittalSharp23CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat23CDown: { code: 'accSagittalFlat23CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v19CUp: { code: 'accSagittalSharp5v19CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v19CDown: { code: 'accSagittalFlat5v19CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v23SUp: { code: 'accSagittalSharp5v23SUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v23SDown: { code: 'accSagittalFlat5v23SDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp5v23SDown: { code: 'accSagittalDoubleSharp5v23SDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat5v23SUp: { code: 'accSagittalDoubleFlat5v23SUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp5v19CDown: { code: 'accSagittalDoubleSharp5v19CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat5v19CUp: { code: 'accSagittalDoubleFlat5v19CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp23CDown: { code: 'accSagittalDoubleSharp23CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat23CUp: { code: 'accSagittalDoubleFlat23CUp', parenRightPaddingAdjustment: -1 }, + accSagittal19SchismaUp: { code: 'accSagittal19SchismaUp', parenRightPaddingAdjustment: -1 }, + accSagittal19SchismaDown: { code: 'accSagittal19SchismaDown', parenRightPaddingAdjustment: -1 }, + accSagittal17KleismaUp: { code: 'accSagittal17KleismaUp', parenRightPaddingAdjustment: -1 }, + accSagittal17KleismaDown: { code: 'accSagittal17KleismaDown', parenRightPaddingAdjustment: -1 }, + accSagittal143CommaUp: { code: 'accSagittal143CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal143CommaDown: { code: 'accSagittal143CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal11v49CommaUp: { code: 'accSagittal11v49CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal11v49CommaDown: { code: 'accSagittal11v49CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal19CommaUp: { code: 'accSagittal19CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal19CommaDown: { code: 'accSagittal19CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal7v19CommaUp: { code: 'accSagittal7v19CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal7v19CommaDown: { code: 'accSagittal7v19CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal49SmallDiesisUp: { code: 'accSagittal49SmallDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal49SmallDiesisDown: { code: 'accSagittal49SmallDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal23SmallDiesisUp: { code: 'accSagittal23SmallDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal23SmallDiesisDown: { code: 'accSagittal23SmallDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal5v13MediumDiesisUp: { code: 'accSagittal5v13MediumDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal5v13MediumDiesisDown: { code: 'accSagittal5v13MediumDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal11v19MediumDiesisUp: { code: 'accSagittal11v19MediumDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal11v19MediumDiesisDown: { code: 'accSagittal11v19MediumDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal49MediumDiesisUp: { code: 'accSagittal49MediumDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal49MediumDiesisDown: { code: 'accSagittal49MediumDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal5v49MediumDiesisUp: { code: 'accSagittal5v49MediumDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal5v49MediumDiesisDown: { code: 'accSagittal5v49MediumDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal49LargeDiesisUp: { code: 'accSagittal49LargeDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal49LargeDiesisDown: { code: 'accSagittal49LargeDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal11v19LargeDiesisUp: { code: 'accSagittal11v19LargeDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal11v19LargeDiesisDown: { code: 'accSagittal11v19LargeDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal5v13LargeDiesisUp: { code: 'accSagittal5v13LargeDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal5v13LargeDiesisDown: { code: 'accSagittal5v13LargeDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp23SDown: { code: 'accSagittalSharp23SDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat23SUp: { code: 'accSagittalFlat23SUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp49SDown: { code: 'accSagittalSharp49SDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat49SUp: { code: 'accSagittalFlat49SUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp7v19CDown: { code: 'accSagittalSharp7v19CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat7v19CUp: { code: 'accSagittalFlat7v19CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp19CDown: { code: 'accSagittalSharp19CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat19CUp: { code: 'accSagittalFlat19CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp11v49CDown: { code: 'accSagittalSharp11v49CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat11v49CUp: { code: 'accSagittalFlat11v49CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp143CDown: { code: 'accSagittalSharp143CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat143CUp: { code: 'accSagittalFlat143CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp17kDown: { code: 'accSagittalSharp17kDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat17kUp: { code: 'accSagittalFlat17kUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp19sDown: { code: 'accSagittalSharp19sDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat19sUp: { code: 'accSagittalFlat19sUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp19sUp: { code: 'accSagittalSharp19sUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat19sDown: { code: 'accSagittalFlat19sDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp17kUp: { code: 'accSagittalSharp17kUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat17kDown: { code: 'accSagittalFlat17kDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp143CUp: { code: 'accSagittalSharp143CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat143CDown: { code: 'accSagittalFlat143CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp11v49CUp: { code: 'accSagittalSharp11v49CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat11v49CDown: { code: 'accSagittalFlat11v49CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp19CUp: { code: 'accSagittalSharp19CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat19CDown: { code: 'accSagittalFlat19CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp7v19CUp: { code: 'accSagittalSharp7v19CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat7v19CDown: { code: 'accSagittalFlat7v19CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp49SUp: { code: 'accSagittalSharp49SUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat49SDown: { code: 'accSagittalFlat49SDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp23SUp: { code: 'accSagittalSharp23SUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat23SDown: { code: 'accSagittalFlat23SDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v13MUp: { code: 'accSagittalSharp5v13MUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v13MDown: { code: 'accSagittalFlat5v13MDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp11v19MUp: { code: 'accSagittalSharp11v19MUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat11v19MDown: { code: 'accSagittalFlat11v19MDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp49MUp: { code: 'accSagittalSharp49MUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat49MDown: { code: 'accSagittalFlat49MDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v49MUp: { code: 'accSagittalSharp5v49MUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v49MDown: { code: 'accSagittalFlat5v49MDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp49LUp: { code: 'accSagittalSharp49LUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat49LDown: { code: 'accSagittalFlat49LDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp11v19LUp: { code: 'accSagittalSharp11v19LUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat11v19LDown: { code: 'accSagittalFlat11v19LDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v13LUp: { code: 'accSagittalSharp5v13LUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v13LDown: { code: 'accSagittalFlat5v13LDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp23SDown: { code: 'accSagittalDoubleSharp23SDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat23SUp: { code: 'accSagittalDoubleFlat23SUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp49SDown: { code: 'accSagittalDoubleSharp49SDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat49SUp: { code: 'accSagittalDoubleFlat49SUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp7v19CDown: { code: 'accSagittalDoubleSharp7v19CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat7v19CUp: { code: 'accSagittalDoubleFlat7v19CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp19CDown: { code: 'accSagittalDoubleSharp19CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat19CUp: { code: 'accSagittalDoubleFlat19CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp11v49CDown: { code: 'accSagittalDoubleSharp11v49CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat11v49CUp: { code: 'accSagittalDoubleFlat11v49CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp143CDown: { code: 'accSagittalDoubleSharp143CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat143CUp: { code: 'accSagittalDoubleFlat143CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp17kDown: { code: 'accSagittalDoubleSharp17kDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat17kUp: { code: 'accSagittalDoubleFlat17kUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp19sDown: { code: 'accSagittalDoubleSharp19sDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat19sUp: { code: 'accSagittalDoubleFlat19sUp', parenRightPaddingAdjustment: -1 }, + accSagittalShaftUp: { code: 'accSagittalShaftUp', parenRightPaddingAdjustment: -1 }, + accSagittalShaftDown: { code: 'accSagittalShaftDown', parenRightPaddingAdjustment: -1 }, + accSagittalAcute: { code: 'accSagittalAcute', parenRightPaddingAdjustment: -1 }, + accSagittalGrave: { code: 'accSagittalGrave', parenRightPaddingAdjustment: -1 }, + accSagittal1MinaUp: { code: 'accSagittal1MinaUp', parenRightPaddingAdjustment: -1 }, + accSagittal1MinaDown: { code: 'accSagittal1MinaDown', parenRightPaddingAdjustment: -1 }, + accSagittal2MinasUp: { code: 'accSagittal2MinasUp', parenRightPaddingAdjustment: -1 }, + accSagittal2MinasDown: { code: 'accSagittal2MinasDown', parenRightPaddingAdjustment: -1 }, + accSagittal1TinaUp: { code: 'accSagittal1TinaUp', parenRightPaddingAdjustment: -1 }, + accSagittal1TinaDown: { code: 'accSagittal1TinaDown', parenRightPaddingAdjustment: -1 }, + accSagittal2TinasUp: { code: 'accSagittal2TinasUp', parenRightPaddingAdjustment: -1 }, + accSagittal2TinasDown: { code: 'accSagittal2TinasDown', parenRightPaddingAdjustment: -1 }, + accSagittal3TinasUp: { code: 'accSagittal3TinasUp', parenRightPaddingAdjustment: -1 }, + accSagittal3TinasDown: { code: 'accSagittal3TinasDown', parenRightPaddingAdjustment: -1 }, + accSagittal4TinasUp: { code: 'accSagittal4TinasUp', parenRightPaddingAdjustment: -1 }, + accSagittal4TinasDown: { code: 'accSagittal4TinasDown', parenRightPaddingAdjustment: -1 }, + accSagittal5TinasUp: { code: 'accSagittal5TinasUp', parenRightPaddingAdjustment: -1 }, + accSagittal5TinasDown: { code: 'accSagittal5TinasDown', parenRightPaddingAdjustment: -1 }, + accSagittal6TinasUp: { code: 'accSagittal6TinasUp', parenRightPaddingAdjustment: -1 }, + accSagittal6TinasDown: { code: 'accSagittal6TinasDown', parenRightPaddingAdjustment: -1 }, + accSagittal7TinasUp: { code: 'accSagittal7TinasUp', parenRightPaddingAdjustment: -1 }, + accSagittal7TinasDown: { code: 'accSagittal7TinasDown', parenRightPaddingAdjustment: -1 }, + accSagittal8TinasUp: { code: 'accSagittal8TinasUp', parenRightPaddingAdjustment: -1 }, + accSagittal8TinasDown: { code: 'accSagittal8TinasDown', parenRightPaddingAdjustment: -1 }, + accSagittal9TinasUp: { code: 'accSagittal9TinasUp', parenRightPaddingAdjustment: -1 }, + accSagittal9TinasDown: { code: 'accSagittal9TinasDown', parenRightPaddingAdjustment: -1 }, + accSagittalFractionalTinaUp: { code: 'accSagittalFractionalTinaUp', parenRightPaddingAdjustment: -1 }, + accSagittalFractionalTinaDown: { code: 'accSagittalFractionalTinaDown', parenRightPaddingAdjustment: -1 }, + accidentalNarrowReversedFlat: { code: 'accidentalNarrowReversedFlat', parenRightPaddingAdjustment: -1 }, + accidentalNarrowReversedFlatAndFlat: { + code: 'accidentalNarrowReversedFlatAndFlat', + parenRightPaddingAdjustment: -1, + }, + accidentalWilsonPlus: { code: 'accidentalWilsonPlus', parenRightPaddingAdjustment: -1 }, + accidentalWilsonMinus: { code: 'accidentalWilsonMinus', parenRightPaddingAdjustment: -1 }, +}; +// Helps determine the layout of accidentals. +const accidentalColumns = { + 1: { + a: [1], + b: [1], + }, + 2: { + a: [1, 2], + }, + 3: { + a: [1, 3, 2], + b: [1, 2, 1], + second_on_bottom: [1, 2, 3], + }, + 4: { + a: [1, 3, 4, 2], + b: [1, 2, 3, 1], + spaced_out_tetrachord: [1, 2, 1, 2], + }, + 5: { + a: [1, 3, 5, 4, 2], + b: [1, 2, 4, 3, 1], + spaced_out_pentachord: [1, 2, 3, 2, 1], + very_spaced_out_pentachord: [1, 2, 1, 2, 1], + }, + 6: { + a: [1, 3, 5, 6, 4, 2], + b: [1, 2, 4, 5, 3, 1], + spaced_out_hexachord: [1, 3, 2, 1, 3, 2], + very_spaced_out_hexachord: [1, 2, 1, 2, 1, 2], + }, +}; +const articulations = { + 'a.': { code: 'augmentationDot', between_lines: true }, + av: { + aboveCode: 'articStaccatissimoAbove', + belowCode: 'articStaccatissimoBelow', + between_lines: true, + }, + 'a>': { + aboveCode: 'articAccentAbove', + belowCode: 'articAccentBelow', + between_lines: true, + }, + 'a-': { + aboveCode: 'articTenutoAbove', + belowCode: 'articTenutoBelow', + between_lines: true, + }, + 'a^': { + aboveCode: 'articMarcatoAbove', + belowCode: 'articMarcatoBelow', + between_lines: false, + }, + 'a+': { code: 'pluckedLeftHandPizzicato', between_lines: false }, + ao: { + aboveCode: 'pluckedSnapPizzicatoAbove', + belowCode: 'pluckedSnapPizzicatoBelow', + between_lines: false, + }, + ah: { code: 'stringsHarmonic', between_lines: false }, + 'a@': { aboveCode: 'fermataAbove', belowCode: 'fermataBelow', between_lines: false }, + 'a@a': { code: 'fermataAbove', between_lines: false }, + 'a@u': { code: 'fermataBelow', between_lines: false }, + 'a|': { code: 'stringsUpBow', between_lines: false }, + am: { code: 'stringsDownBow', between_lines: false }, + 'a,': { code: 'pictChokeCymbal', between_lines: false }, // Choked +}; +const ornaments = { + mordent: { code: 'ornamentShortTrill' }, + mordent_inverted: { code: 'ornamentMordent' }, + turn: { code: 'ornamentTurn' }, + turn_inverted: { code: 'ornamentTurnSlash' }, + tr: { code: 'ornamentTrill' }, + upprall: { code: 'ornamentPrecompSlideTrillDAnglebert' }, + downprall: { code: 'ornamentPrecompDoubleCadenceUpperPrefix' }, + prallup: { code: 'ornamentPrecompTrillSuffixDandrieu' }, + pralldown: { code: 'ornamentPrecompTrillLowerSuffix' }, + upmordent: { code: 'ornamentPrecompSlideTrillBach' }, + downmordent: { code: 'ornamentPrecompDoubleCadenceUpperPrefixTurn' }, + lineprall: { code: 'ornamentPrecompAppoggTrill' }, + prallprall: { code: 'ornamentTremblement' }, + scoop: { code: 'brassScoop' }, + doit: { code: 'brassDoitMedium' }, + fall: { code: 'brassFallLipShort' }, + doitLong: { code: 'brassLiftMedium' }, + fallLong: { code: 'brassFallRoughMedium' }, + bend: { code: 'brassBend' }, + plungerClosed: { code: 'brassMuteClosed' }, + plungerOpen: { code: 'brassMuteOpen' }, + flip: { code: 'brassFlip' }, + jazzTurn: { code: 'brassJazzTurn' }, + smear: { code: 'brassSmear' }, +}; +class Tables { + /** + * @returns the `Font` object at the head of the music font stack. + */ + static currentMusicFont() { + if (Tables.MUSIC_FONT_STACK.length === 0) { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('NoFonts', 'The font stack is empty. See: await Flow.fetchMusicFont(...); Flow.setMusicFont(...).'); + } + else { + return Tables.MUSIC_FONT_STACK[0]; + } + } + static clefProperties(clef) { + if (!clef || !(clef in clefs)) + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('BadArgument', 'Invalid clef: ' + clef); + return clefs[clef]; + } + /** + * @param keyOctaveGlyph a string in the format "key/octave" (e.g., "c/5") or "key/octave/custom-note-head-code" (e.g., "g/5/t3"). + * @param clef + * @param params a struct with one option, `octave_shift` for clef ottavation (0 = default; 1 = 8va; -1 = 8vb, etc.). + * @returns properties for the specified note. + */ + // eslint-disable-next-line + static keyProperties(keyOctaveGlyph, clef = 'treble', params) { + let options = { octave_shift: 0 }; + if (typeof params === 'object') { + options = Object.assign(Object.assign({}, options), params); + } + const pieces = keyOctaveGlyph.split('/'); + if (pieces.length < 2) { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('BadArguments', `First argument must be note/octave or note/octave/glyph-code: ${keyOctaveGlyph}`); + } + const key = pieces[0].toUpperCase(); + const value = notesInfo[key]; + if (!value) + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('BadArguments', 'Invalid key name: ' + key); + if (value.octave) + pieces[1] = value.octave.toString(); + let octave = parseInt(pieces[1], 10); + // Octave_shift is the shift to compensate for clef 8va/8vb. + octave += -1 * options.octave_shift; + const baseIndex = octave * 7 - 4 * 7; + let line = (baseIndex + value.index) / 2; + line += Tables.clefProperties(clef).line_shift; + let stroke = 0; + if (line <= 0 && (line * 2) % 2 === 0) + stroke = 1; // stroke up + if (line >= 6 && (line * 2) % 2 === 0) + stroke = -1; // stroke down + // Integer value for note arithmetic. + const int_value = typeof value.int_val !== 'undefined' ? octave * 12 + value.int_val : undefined; + // If the user specified a glyph, overwrite the glyph code. + const code = value.code; + const shift_right = value.shift_right; + let customNoteHeadProps = {}; + if (pieces.length > 2 && pieces[2]) { + const glyphName = pieces[2].toUpperCase(); + customNoteHeadProps = customNoteHeads[glyphName] || {}; + } + return Object.assign({ key, + octave, + line, + int_value, accidental: value.accidental, code, + stroke, + shift_right, displaced: false }, customNoteHeadProps); + } + static integerToNote(integer) { + if (typeof integer === 'undefined' || integer < 0 || integer > 11) { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('BadArguments', `integerToNote() requires an integer in the range [0, 11]: ${integer}`); + } + const table = { + 0: 'C', + 1: 'C#', + 2: 'D', + 3: 'D#', + 4: 'E', + 5: 'F', + 6: 'F#', + 7: 'G', + 8: 'G#', + 9: 'A', + 10: 'A#', + 11: 'B', + }; + const noteValue = table[integer]; + if (!noteValue) { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('BadArguments', `Unknown note value for integer: ${integer}`); + } + return noteValue; + } + static tabToGlyph(fret, scale = 1.0) { + let glyph = undefined; + let width = 0; + let shift_y = 0; + if (fret.toUpperCase() === 'X') { + const glyphMetrics = new _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph('accidentalDoubleSharp', Tables.TABLATURE_FONT_SCALE).getMetrics(); + glyph = 'accidentalDoubleSharp'; + if (glyphMetrics.width == undefined || glyphMetrics.height == undefined) + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('InvalidMetrics', 'Width and height required'); + width = glyphMetrics.width; + shift_y = -glyphMetrics.height / 2; + } + else { + width = Tables.textWidth(fret); + } + return { + text: fret, + code: glyph, + getWidth: () => width * scale, + shift_y, + }; + } + // Used by annotation.ts and bend.ts. Clearly this implementation only works for the default font size. + // TODO: The actual width depends on the font family, size, weight, style. + static textWidth(text) { + return 7 * text.toString().length; + } + static articulationCodes(artic) { + return articulations[artic]; + } + static accidentalCodes(acc) { + return accidentals[acc]; + } + static ornamentCodes(acc) { + return ornaments[acc]; + } + static keySignature(spec) { + const keySpec = keySignatures[spec]; + if (!keySpec) { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('BadKeySignature', `Bad key signature spec: '${spec}'`); + } + if (!keySpec.acc) { + return []; + } + const accidentalList = { + b: [2, 0.5, 2.5, 1, 3, 1.5, 3.5], + '#': [0, 1.5, -0.5, 1, 2.5, 0.5, 2], + }; + const notes = accidentalList[keySpec.acc]; + const acc_list = []; + for (let i = 0; i < keySpec.num; ++i) { + const line = notes[i]; + acc_list.push({ type: keySpec.acc, line }); + } + return acc_list; + } + static getKeySignatures() { + return keySignatures; + } + static hasKeySignature(spec) { + return spec in keySignatures; + } + /** + * Convert duration aliases to the number based duration. + * If the input isn't an alias, simply return the input. + * @param duration + * @returns Example: 'q' -> '4', '8' -> '8' + */ + static sanitizeDuration(duration) { + const durationNumber = durationAliases[duration]; + if (durationNumber !== undefined) { + duration = durationNumber; + } + if (durations[duration] === undefined) { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('BadArguments', `The provided duration is not valid: ${duration}`); + } + return duration; + } + /** Convert the `duration` to a fraction. */ + static durationToFraction(duration) { + return new _fraction__WEBPACK_IMPORTED_MODULE_0__.Fraction().parse(Tables.sanitizeDuration(duration)); + } + /** Convert the `duration` to a number. */ + static durationToNumber(duration) { + return Tables.durationToFraction(duration).value(); + } + /* Convert the `duration` to total ticks. */ + static durationToTicks(duration) { + duration = Tables.sanitizeDuration(duration); + const ticks = durations[duration]; + if (ticks === undefined) { + throw new _util__WEBPACK_IMPORTED_MODULE_2__.RuntimeError('InvalidDuration'); + } + return ticks; + } + // Return a glyph given duration and type. The type can be a custom glyph code from customNoteHeads. + // The default type is a regular note ('n'). + // eslint-disable-next-line + static getGlyphProps(duration, type = 'n') { + duration = Tables.sanitizeDuration(duration); + // Lookup duration for default glyph head code + const code = durationCodes[duration]; + if (code === undefined) { + return undefined; + } + // Get glyph properties for 'type' from duration string (note, rest, harmonic, muted, slash) + let glyphTypeProperties = code.type[type]; + // If this isn't a standard type, then lookup the custom note head map. + if (glyphTypeProperties === undefined) { + // Try and get it from the custom list of note heads + const customGlyphTypeProperties = customNoteHeads[type.toUpperCase()]; + // If not, then return with nothing. + if (customGlyphTypeProperties === undefined) { + return undefined; + } + // Otherwise set it as the code_head value + glyphTypeProperties = Object.assign({ code_head: customGlyphTypeProperties.code }, customGlyphTypeProperties); + } + const code_head = glyphTypeProperties.code_head; + // The default implementation of getWidth() calls Glyph.getWidth(code_head, scale). + // This can be overridden by an individual glyph type (see slash noteheads below: Tables.SLASH_NOTEHEAD_WIDTH). + const getWidth = (scale = Tables.NOTATION_FONT_SCALE) => _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.getWidth(code_head, scale); + // Merge duration props for 'duration' with the note head properties. + return Object.assign(Object.assign(Object.assign({}, code.common), { getWidth: getWidth }), glyphTypeProperties); + } +} +Tables.STEM_WIDTH = 1.5; +Tables.STEM_HEIGHT = 35; +Tables.STAVE_LINE_THICKNESS = 1; +Tables.RESOLUTION = RESOLUTION; +/** + * Customize this by calling Flow.setMusicFont(...fontNames); + */ +Tables.MUSIC_FONT_STACK = []; +Tables.NOTATION_FONT_SCALE = 39; +Tables.TABLATURE_FONT_SCALE = 39; +Tables.SLASH_NOTEHEAD_WIDTH = 15; +Tables.STAVE_LINE_DISTANCE = 10; +// HACK: +// Since text origins are positioned at the baseline, we must +// compensate for the ascender of the text. Of course, 1 staff space is +// a very poor approximation. +// +// This will be deprecated in the future. This is a temporary solution until +// we have more robust text metrics. +Tables.TEXT_HEIGHT_OFFSET_HACK = 1; +Tables.accidentalMap = accidentals; +Tables.accidentalColumnsTable = accidentalColumns; +Tables.unicode = { + // ♯ accidental sharp + sharp: String.fromCharCode(0x266f), + // ♭ accidental flat + flat: String.fromCharCode(0x266d), + // ♮ accidental natural + natural: String.fromCharCode(0x266e), + // △ major seventh + triangle: String.fromCharCode(0x25b3), + // ø half-diminished + 'o-with-slash': String.fromCharCode(0x00f8), + // ° diminished + degrees: String.fromCharCode(0x00b0), + // ○ diminished + circle: String.fromCharCode(0x25cb), +}; +/* The list of valid note types. Used by note.ts during parseNoteStruct(). */ +Tables.validTypes = validNoteTypes; +// Default time signature. +Tables.TIME4_4 = { + num_beats: 4, + beat_value: 4, + resolution: RESOLUTION, +}; +// 1/2, 1, 2, 4, 8, 16, 32, 64, 128 +// NOTE: There is no 256 here! However, there are other mentions of 256 in this file. +// For example, in durations has a 256 key, and sanitizeDuration() can return 256. +// The sanitizeDuration() bit may need to be removed by 0xfe. +// eslint-disable-next-line +const durationCodes = { + '1/2': { + common: { + stem: false, + stem_offset: 0, + flag: false, + dot_shiftY: 0, + line_above: 0, + line_below: 0, + }, + type: { + n: { + // Breve note + code_head: 'noteheadDoubleWhole', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadDoubleWhole', scale); + // }, + }, + h: { + // Breve note harmonic + code_head: 'unpitchedPercussionClef1', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('unpitchedPercussionClef1', scale); + // }, + }, + m: { + // Breve note muted + code_head: 'vexNoteHeadMutedBreve', + stem_offset: 0, + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('vexNoteHeadMutedBreve', scale); + // }, + }, + r: { + // Breve rest + code_head: 'restDoubleWhole', + rest: true, + position: 'B/5', + dot_shiftY: 0.5, + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('restDoubleWhole', scale); + // }, + }, + s: { + // Breve note slash - + // Drawn with canvas primitives + getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH, + position: 'B/4', + }, + g: { + // Ghostnote + code_head: 'noteheadDoubleWhole', + }, + }, + }, + 1: { + common: { + stem: false, + stem_offset: 0, + flag: false, + dot_shiftY: 0, + line_above: 0, + line_below: 0, + }, + type: { + n: { + // Whole note + code_head: 'noteheadWhole', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadWhole', scale); + // }, + }, + h: { + // Whole note harmonic + code_head: 'noteheadDiamondWhole', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadDiamondWhole', scale); + // }, + }, + m: { + // Whole note muted + code_head: 'noteheadXWhole', + stem_offset: -3, + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadXWhole', scale); + // }, + }, + r: { + // Whole rest + code_head: 'restWhole', + rest: true, + position: 'D/5', + dot_shiftY: 0.5, + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('restWhole', scale); + // }, + }, + s: { + // Whole note slash + // Drawn with canvas primitives + getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH, + position: 'B/4', + }, + g: { + // Ghostnote + code_head: 'noteheadWhole', + }, + }, + }, + 2: { + common: { + stem: true, + stem_offset: 0, + flag: false, + dot_shiftY: 0, + line_above: 0, + line_below: 0, + }, + type: { + n: { + // Half note + code_head: 'noteheadHalf', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadHalf', scale); + // }, + }, + h: { + // Half note harmonic + code_head: 'noteheadDiamondHalf', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadDiamondHalf', scale); + // }, + }, + m: { + // Half note muted + code_head: 'noteheadXHalf', + stem_offset: -3, + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadXHalf', scale); + // }, + }, + r: { + // Half rest + code_head: 'restHalf', + stem: false, + rest: true, + position: 'B/4', + dot_shiftY: -0.5, + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('restHalf', scale); + // }, + }, + s: { + // Half note slash + // Drawn with canvas primitives + getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH, + position: 'B/4', + }, + g: { + // Ghostnote + code_head: 'noteheadHalf', + }, + }, + }, + 4: { + common: { + stem: true, + stem_offset: 0, + flag: false, + dot_shiftY: 0, + line_above: 0, + line_below: 0, + }, + type: { + n: { + // Quarter note + code_head: 'noteheadBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadBlack', scale); + // }, + }, + h: { + // Quarter harmonic + code_head: 'noteheadDiamondBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadDiamondBlack', scale); + // }, + }, + m: { + // Quarter muted + code_head: 'noteheadXBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadXBlack', scale); + // }, + }, + r: { + // Quarter rest + code_head: 'restQuarter', + stem: false, + rest: true, + position: 'B/4', + dot_shiftY: -0.5, + line_above: 1.5, + line_below: 1.5, + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('restQuarter', scale); + // }, + }, + s: { + // Quarter slash + // Drawn with canvas primitives + getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH, + position: 'B/4', + }, + g: { + // Ghostnote + code_head: 'noteheadBlack', + }, + }, + }, + 8: { + common: { + stem: true, + stem_offset: 0, + flag: true, + beam_count: 1, + stem_beam_extension: 0, + code_flag_upstem: 'flag8thUp', + code_flag_downstem: 'flag8thDown', + dot_shiftY: 0, + line_above: 0, + line_below: 0, + }, + type: { + n: { + // Eighth note + code_head: 'noteheadBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadBlack', scale); + // }, + }, + h: { + // Eighth note harmonic + code_head: 'noteheadDiamondBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadDiamondBlack', scale); + // }, + }, + m: { + // Eighth note muted + code_head: 'noteheadXBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadXBlack', scale); + // }, + }, + r: { + // Eighth rest + code_head: 'rest8th', + stem: false, + flag: false, + rest: true, + position: 'B/4', + dot_shiftY: -0.5, + line_above: 1.0, + line_below: 1.0, + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('rest8th', scale); + // }, + }, + s: { + // Eighth slash + // Drawn with canvas primitives + getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH, + position: 'B/4', + }, + g: { + // Ghostnote + code_head: 'noteheadBlack', + }, + }, + }, + 16: { + common: { + beam_count: 2, + stem_beam_extension: 0, + stem: true, + stem_offset: 0, + flag: true, + code_flag_upstem: 'flag16thUp', + code_flag_downstem: 'flag16thDown', + dot_shiftY: 0, + line_above: 0, + line_below: 0, + }, + type: { + n: { + // Sixteenth note + code_head: 'noteheadBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadBlack', scale); + // }, + }, + h: { + // Sixteenth note harmonic + code_head: 'noteheadDiamondBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadDiamondBlack', scale); + // }, + }, + m: { + // Sixteenth note muted + code_head: 'noteheadXBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadXBlack', scale); + // }, + }, + r: { + // Sixteenth rest + code_head: 'rest16th', + stem: false, + flag: false, + rest: true, + position: 'B/4', + dot_shiftY: -0.5, + line_above: 1.0, + line_below: 2.0, + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('rest16th', scale); + // }, + }, + s: { + // Sixteenth slash + // Drawn with canvas primitives + getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH, + position: 'B/4', + }, + g: { + // Ghostnote + code_head: 'noteheadBlack', + }, + }, + }, + 32: { + common: { + beam_count: 3, + stem_beam_extension: 7.5, + stem: true, + stem_offset: 0, + flag: true, + code_flag_upstem: 'flag32ndUp', + code_flag_downstem: 'flag32ndDown', + dot_shiftY: 0, + line_above: 0, + line_below: 0, + }, + type: { + n: { + // Thirty-second note + code_head: 'noteheadBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadBlack', scale); + // }, + }, + h: { + // Thirty-second harmonic + code_head: 'noteheadDiamondBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadDiamondBlack', scale); + // }, + }, + m: { + // Thirty-second muted + code_head: 'noteheadXBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadXBlack', scale); + // }, + }, + r: { + // Thirty-second rest + code_head: 'rest32nd', + stem: false, + flag: false, + rest: true, + position: 'B/4', + dot_shiftY: -1.5, + line_above: 2.0, + line_below: 2.0, + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('rest32nd', scale); + // }, + }, + s: { + // Thirty-second slash + // Drawn with canvas primitives + getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH, + position: 'B/4', + }, + g: { + // Ghostnote + code_head: 'noteheadBlack', + }, + }, + }, + 64: { + common: { + beam_count: 4, + stem_beam_extension: 15, + stem: true, + stem_offset: 0, + flag: true, + code_flag_upstem: 'flag64thUp', + code_flag_downstem: 'flag64thDown', + dot_shiftY: 0, + line_above: 0, + line_below: 0, + }, + type: { + n: { + // Sixty-fourth note + code_head: 'noteheadBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadBlack', scale); + // }, + }, + h: { + // Sixty-fourth harmonic + code_head: 'noteheadDiamondBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadDiamondBlack', scale); + // }, + }, + m: { + // Sixty-fourth muted + code_head: 'noteheadXBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadXBlack', scale); + // }, + }, + r: { + // Sixty-fourth rest + code_head: 'rest64th', + stem: false, + flag: false, + rest: true, + position: 'B/4', + dot_shiftY: -1.5, + line_above: 2.0, + line_below: 3.0, + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('rest64th', scale); + // }, + }, + s: { + // Sixty-fourth slash + // Drawn with canvas primitives + getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH, + position: 'B/4', + }, + g: { + // Ghostnote + code_head: 'noteheadBlack', + }, + }, + }, + 128: { + common: { + beam_count: 5, + stem_beam_extension: 22.5, + stem: true, + stem_offset: 0, + flag: true, + code_flag_upstem: 'flag128thUp', + code_flag_downstem: 'flag128thDown', + dot_shiftY: 0, + line_above: 0, + line_below: 0, + }, + type: { + n: { + // Hundred-twenty-eight note + code_head: 'noteheadBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadBlack', scale); + // }, + }, + h: { + // Hundred-twenty-eight harmonic + code_head: 'noteheadDiamondBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadDiamondBlack', scale); + // }, + }, + m: { + // Hundred-twenty-eight muted + code_head: 'noteheadXBlack', + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('noteheadXBlack', scale); + // }, + }, + r: { + // Hundred-twenty-eight rest + code_head: 'rest128th', + stem: false, + flag: false, + rest: true, + position: 'B/4', + dot_shiftY: -2.5, + line_above: 3.0, + line_below: 3.0, + // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined { + // return Glyph.getWidth('rest128th', scale); + // }, + }, + s: { + // Hundred-twenty-eight slash + // Drawn with canvas primitives + getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH, + position: 'B/4', + }, + g: { + // Ghostnote + code_head: 'noteheadBlack', + }, + }, + }, +}; + + +/***/ }), + +/***/ "./src/tabnote.ts": +/*!************************!*\ + !*** ./src/tabnote.ts ***! + \************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TabNote": () => (/* binding */ TabNote) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _stemmablenote__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./stemmablenote */ "./src/stemmablenote.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// ## Description +// +// The file implements notes for Tablature notation. This consists of one or +// more fret positions, and can either be drawn with or without stems. +// +// See `tests/tabnote_tests.ts` for usage examples. + + + + + + + + +// Gets the unused strings grouped together if consecutive. +// +// Parameters: +// * num_lines - The number of lines +// * strings_used - An array of numbers representing which strings have fret positions +function getUnusedStringGroups(num_lines, strings_used) { + const stem_through = []; + let group = []; + for (let string = 1; string <= num_lines; string++) { + const is_used = strings_used.indexOf(string) > -1; + if (!is_used) { + group.push(string); + } + else { + stem_through.push(group); + group = []; + } + } + if (group.length > 0) + stem_through.push(group); + return stem_through; +} +// Gets groups of points that outline the partial stem lines +// between fret positions +// +// Parameters: +// * stem_Y - The `y` coordinate the stem is located on +// * unused_strings - An array of groups of unused strings +// * stave - The stave to use for reference +// * stem_direction - The direction of the stem +function getPartialStemLines(stem_y, unused_strings, stave, stem_direction) { + const up_stem = stem_direction !== 1; + const down_stem = stem_direction !== -1; + const line_spacing = stave.getSpacingBetweenLines(); + const total_lines = stave.getNumLines(); + const stem_lines = []; + unused_strings.forEach((strings) => { + const containsLastString = strings.indexOf(total_lines) > -1; + const containsFirstString = strings.indexOf(1) > -1; + if ((up_stem && containsFirstString) || (down_stem && containsLastString)) { + return; + } + // If there's only one string in the group, push a duplicate value. + // We do this because we need 2 strings to convert into upper/lower y + // values. + if (strings.length === 1) { + strings.push(strings[0]); + } + const line_ys = []; + // Iterate through each group string and store it's y position + strings.forEach((string, index, strings) => { + const isTopBound = string === 1; + const isBottomBound = string === total_lines; + // Get the y value for the appropriate staff line, + // we adjust for a 0 index array, since string numbers are index 1 + let y = stave.getYForLine(string - 1); + // Unless the string is the first or last, add padding to each side + // of the line + if (index === 0 && !isTopBound) { + y -= line_spacing / 2 - 1; + } + else if (index === strings.length - 1 && !isBottomBound) { + y += line_spacing / 2 - 1; + } + // Store the y value + line_ys.push(y); + // Store a subsequent y value connecting this group to the main + // stem above/below the stave if it's the top/bottom string + if (stem_direction === 1 && isTopBound) { + line_ys.push(stem_y - 2); + } + else if (stem_direction === -1 && isBottomBound) { + line_ys.push(stem_y + 2); + } + }); + // Add the sorted y values to the + stem_lines.push(line_ys.sort((a, b) => a - b)); + }); + return stem_lines; +} +class TabNote extends _stemmablenote__WEBPACK_IMPORTED_MODULE_4__.StemmableNote { + // Initialize the TabNote with a `noteStruct` full of properties + // and whether to `draw_stem` when rendering the note + constructor(noteStruct, draw_stem = false) { + super(noteStruct); + this.glyphs = []; + // Return the number of the greatest string, which is the string lowest on the display + this.greatestString = () => { + return this.positions.map((x) => x.str).reduce((a, b) => (a > b ? a : b)); + }; + // Return the number of the least string, which is the string highest on the display + this.leastString = () => { + return this.positions.map((x) => x.str).reduce((a, b) => (a < b ? a : b)); + }; + this.ghost = false; // Renders parenthesis around notes + // Note properties + // The fret positions in the note. An array of `{ str: X, fret: X }` + this.positions = noteStruct.positions || []; + // Render Options + this.render_options = Object.assign(Object.assign({}, this.render_options), { + // font size for note heads and rests + glyph_font_scale: _tables__WEBPACK_IMPORTED_MODULE_5__.Tables.TABLATURE_FONT_SCALE, + // Flag to draw a stem + draw_stem, + // Flag to draw dot modifiers + draw_dots: draw_stem, + // Flag to extend the main stem through the stave and fret positions + draw_stem_through_stave: false, + // vertical shift from stave line + y_shift: 0, + // normal glyph scale + scale: 1.0, + // default tablature font + font: `${_font__WEBPACK_IMPORTED_MODULE_0__.Font.SIZE}pt ${_font__WEBPACK_IMPORTED_MODULE_0__.Font.SANS_SERIF}` }); + this.glyph = _tables__WEBPACK_IMPORTED_MODULE_5__.Tables.getGlyphProps(this.duration, this.noteType); + (0,_util__WEBPACK_IMPORTED_MODULE_7__.defined)(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`); + this.buildStem(); + if (noteStruct.stem_direction) { + this.setStemDirection(noteStruct.stem_direction); + } + else { + this.setStemDirection(_stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP); + } + // Renders parenthesis around notes + this.ghost = false; + this.updateWidth(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_6__.Category.TabNote; + } + reset() { + super.reset(); + if (this.stave) + this.setStave(this.stave); + return this; + } + // Set as ghost `TabNote`, surrounds the fret positions with parenthesis. + // Often used for indicating frets that are being bent to + setGhost(ghost) { + this.ghost = ghost; + this.updateWidth(); + return this; + } + // Determine if the note has a stem + hasStem() { + if (this.render_options.draw_stem) + return true; + return false; + } + // Get the default stem extension for the note + getStemExtension() { + if (this.stem_extension_override != null) { + return this.stem_extension_override; + } + if (this.flag) { + return this.getStemDirection() === 1 ? -this.flag.checkMetrics().y_shift : this.flag.checkMetrics().y_shift; + } + return 0; + } + // Calculate and store the width of the note + updateWidth() { + this.glyphs = []; + this.width = 0; + for (let i = 0; i < this.positions.length; ++i) { + let fret = this.positions[i].fret; + if (this.ghost) + fret = '(' + fret + ')'; + const glyph = _tables__WEBPACK_IMPORTED_MODULE_5__.Tables.tabToGlyph(fret.toString(), this.render_options.scale); + this.glyphs.push(glyph); + this.width = Math.max(glyph.getWidth(), this.width); + } + // For some reason we associate a notehead glyph with a TabNote, and this + // glyph is used for certain width calculations. Of course, this is totally + // incorrect since a notehead is a poor approximation for the dimensions of + // a fret number which can have multiple digits. As a result, we must + // overwrite getWidth() to return the correct width + this.glyph.getWidth = () => this.width; + } + // Set the `stave` to the note + setStave(stave) { + super.setStave(stave); + const ctx = stave.getContext(); + this.setContext(ctx); + // Calculate the fret number width based on font used + if (ctx) { + this.width = 0; + for (let i = 0; i < this.glyphs.length; ++i) { + const glyph = this.glyphs[i]; + const text = '' + glyph.text; + if (text.toUpperCase() !== 'X') { + ctx.save(); + ctx.setFont(this.render_options.font); + glyph.width = ctx.measureText(text).width; + ctx.restore(); + glyph.getWidth = () => glyph.width; + } + this.width = Math.max(glyph.getWidth(), this.width); + } + this.glyph.getWidth = () => this.width; + } + // we subtract 1 from `line` because getYForLine expects a 0-based index, + // while the position.str is a 1-based index + const ys = this.positions.map(({ str: line }) => stave.getYForLine(Number(line) - 1)); + this.setYs(ys); + if (this.stem) { + this.stem.setYBounds(this.getStemY(), this.getStemY()); + } + return this; + } + // Get the fret positions for the note + getPositions() { + return this.positions; + } + // Get the default `x` and `y` coordinates for a modifier at a specific + // `position` at a fret position `index` + getModifierStartXY(position, index) { + if (!this.preFormatted) { + throw new _util__WEBPACK_IMPORTED_MODULE_7__.RuntimeError('UnformattedNote', "Can't call GetModifierStartXY on an unformatted note"); + } + if (this.ys.length === 0) { + throw new _util__WEBPACK_IMPORTED_MODULE_7__.RuntimeError('NoYValues', 'No Y-Values calculated for this note.'); + } + let x = 0; + if (position === _modifier__WEBPACK_IMPORTED_MODULE_2__.Modifier.Position.LEFT) { + x = -1 * 2; // FIXME: modifier padding, move to font file + } + else if (position === _modifier__WEBPACK_IMPORTED_MODULE_2__.Modifier.Position.RIGHT) { + x = this.width + 2; // FIXME: modifier padding, move to font file + } + else if (position === _modifier__WEBPACK_IMPORTED_MODULE_2__.Modifier.Position.BELOW || position === _modifier__WEBPACK_IMPORTED_MODULE_2__.Modifier.Position.ABOVE) { + const note_glyph_width = this.glyph.getWidth(); + x = note_glyph_width / 2; + } + return { + x: this.getAbsoluteX() + x, + y: this.ys[index], + }; + } + // Get the default line for rest + getLineForRest() { + return Number(this.positions[0].str); + } + // Pre-render formatting + preFormat() { + if (this.preFormatted) + return; + if (this.modifierContext) + this.modifierContext.preFormat(); + // width is already set during init() + this.preFormatted = true; + } + // Get the x position for the stem + getStemX() { + return this.getCenterGlyphX(); + } + // Get the y position for the stem + getStemY() { + const num_lines = this.checkStave().getNumLines(); + // The decimal staff line amounts provide optimal spacing between the + // fret number and the stem + const stemUpLine = -0.5; + const stemDownLine = num_lines - 0.5; + const stemStartLine = _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP === this.stem_direction ? stemUpLine : stemDownLine; + return this.checkStave().getYForLine(stemStartLine); + } + // Get the stem extents for the tabnote + getStemExtents() { + return this.checkStem().getExtents(); + } + // Draw the fal onto the context + drawFlag() { + const { beam, glyph, stem_direction, render_options: { draw_stem, glyph_font_scale }, } = this; + const context = this.checkContext(); + const shouldDrawFlag = beam == undefined && draw_stem; + // Now it's the flag's turn. + if (glyph.flag && shouldDrawFlag) { + const flag_x = this.getStemX() + 1; + const flag_y = this.getStemY() - this.checkStem().getHeight(); + const flag_code = stem_direction === _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.DOWN + ? glyph.code_flag_downstem // Down stems have flags on the left. + : glyph.code_flag_upstem; + // Draw the Flag + _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.renderGlyph(context, flag_x, flag_y, glyph_font_scale, flag_code, { category: 'flag.tabStem' }); + } + } + // Render the modifiers onto the context. + drawModifiers() { + this.modifiers.forEach((modifier) => { + // Only draw the dots if enabled. + if ((0,_typeguard__WEBPACK_IMPORTED_MODULE_6__.isDot)(modifier) && !this.render_options.draw_dots) { + return; + } + modifier.setContext(this.getContext()); + modifier.drawWithStyle(); + }); + } + // Render the stem extension through the fret positions + drawStemThrough() { + const stemX = this.getStemX(); + const stemY = this.getStemY(); + const ctx = this.checkContext(); + const drawStem = this.render_options.draw_stem; + const stemThrough = this.render_options.draw_stem_through_stave; + if (drawStem && stemThrough) { + const numLines = this.checkStave().getNumLines(); + const stringsUsed = this.positions.map((position) => Number(position.str)); + const unusedStrings = getUnusedStringGroups(numLines, stringsUsed); + const stemLines = getPartialStemLines(stemY, unusedStrings, this.checkStave(), this.getStemDirection()); + ctx.save(); + ctx.setLineWidth(_stem__WEBPACK_IMPORTED_MODULE_3__.Stem.WIDTH); + stemLines.forEach((bounds) => { + if (bounds.length === 0) + return; + ctx.beginPath(); + ctx.moveTo(stemX, bounds[0]); + ctx.lineTo(stemX, bounds[bounds.length - 1]); + ctx.stroke(); + ctx.closePath(); + }); + ctx.restore(); + } + } + // Render the fret positions onto the context + drawPositions() { + const ctx = this.checkContext(); + const x = this.getAbsoluteX(); + const ys = this.ys; + for (let i = 0; i < this.positions.length; ++i) { + const y = ys[i] + this.render_options.y_shift; + const glyph = this.glyphs[i]; + // Center the fret text beneath the notation note head + const note_glyph_width = this.glyph.getWidth(); + const tab_x = x + note_glyph_width / 2 - glyph.getWidth() / 2; + // FIXME: Magic numbers. + ctx.clearRect(tab_x - 2, y - 3, glyph.getWidth() + 4, 6); + if (glyph.code) { + _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph.renderGlyph(ctx, tab_x, y, this.render_options.glyph_font_scale * this.render_options.scale, glyph.code); + } + else { + ctx.save(); + ctx.setFont(this.render_options.font); + const text = glyph.text.toString(); + ctx.fillText(text, tab_x, y + 5 * this.render_options.scale); + ctx.restore(); + } + } + } + // The main rendering function for the entire note. + draw() { + const ctx = this.checkContext(); + if (this.ys.length === 0) { + throw new _util__WEBPACK_IMPORTED_MODULE_7__.RuntimeError('NoYValues', "Can't draw note without Y values."); + } + this.setRendered(); + const render_stem = this.beam == undefined && this.render_options.draw_stem; + ctx.openGroup('tabnote', undefined, { pointerBBox: true }); + this.drawPositions(); + this.drawStemThrough(); + if (this.stem && render_stem) { + const stem_x = this.getStemX(); + this.stem.setNoteHeadXBounds(stem_x, stem_x); + ctx.openGroup('stem', undefined, { pointerBBox: true }); + this.stem.setContext(ctx).draw(); + ctx.closeGroup(); + } + this.drawFlag(); + this.drawModifiers(); + ctx.closeGroup(); + } +} + + +/***/ }), + +/***/ "./src/tabslide.ts": +/*!*************************!*\ + !*** ./src/tabslide.ts ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TabSlide": () => (/* binding */ TabSlide) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _tabtie__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tabtie */ "./src/tabtie.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// This class implements varies types of ties between contiguous notes. The +// ties include: regular ties, hammer ons, pull offs, and slides. + + + + +class TabSlide extends _tabtie__WEBPACK_IMPORTED_MODULE_1__.TabTie { + /** + * @param notes is a struct of the form: + * { + * first_note: Note, + * last_note: Note, + * first_indices: [n1, n2, n3], + * last_indices: [n1, n2, n3] + * } + * @param notes.first_note the starting note of the slide + * @param notes.last_note the ending note of the slide + * @param notes.first_indices specifies which string + fret positions of the TabNote are used in this slide. zero indexed. + * @param notes.last_indices currently unused. we assume it's the same as first_indices. + * + * @param direction TabSlide.SLIDE_UP or TabSlide.SLIDE_DOWN + */ + constructor(notes, direction) { + super(notes, 'sl.'); + // Determine the direction automatically if it is not provided. + if (!direction) { + let first_fret = notes.first_note.getPositions()[0].fret; + if (typeof first_fret === 'string') { + first_fret = parseInt(first_fret, 10); + } + let last_fret = notes.last_note.getPositions()[0].fret; + if (typeof last_fret === 'string') { + last_fret = parseInt(last_fret, 10); + } + // If either of the frets are 'X', parseInt() above will return NaN. + // Choose TabSlide.SLIDE_UP by default. + if (isNaN(first_fret) || isNaN(last_fret)) { + direction = TabSlide.SLIDE_UP; + } + else { + direction = first_fret > last_fret ? TabSlide.SLIDE_DOWN : TabSlide.SLIDE_UP; + } + } + this.direction = direction; + this.render_options.cp1 = 11; + this.render_options.cp2 = 14; + this.render_options.y_shift = 0.5; + this.resetFont(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_2__.Category.TabSlide; + } + static get SLIDE_UP() { + return 1; + } + static get SLIDE_DOWN() { + return -1; + } + static createSlideUp(notes) { + return new TabSlide(notes, TabSlide.SLIDE_UP); + } + static createSlideDown(notes) { + return new TabSlide(notes, TabSlide.SLIDE_DOWN); + } + renderTie(params) { + if (params.first_ys.length === 0 || params.last_ys.length === 0) { + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('BadArguments', 'No Y-values to render'); + } + const ctx = this.checkContext(); + const first_x_px = params.first_x_px; + const first_ys = params.first_ys; + const last_x_px = params.last_x_px; + const direction = params.direction; + if (direction !== TabSlide.SLIDE_UP && direction !== TabSlide.SLIDE_DOWN) { + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('BadSlide', 'Invalid slide direction'); + } + // eslint-disable-next-line + const first_indices = this.notes.first_indices; + for (let i = 0; i < first_indices.length; ++i) { + const slide_y = first_ys[first_indices[i]] + this.render_options.y_shift; + if (isNaN(slide_y)) { + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('BadArguments', 'Bad indices for slide rendering.'); + } + ctx.beginPath(); + ctx.moveTo(first_x_px, slide_y + 3 * direction); + ctx.lineTo(last_x_px, slide_y - 3 * direction); + ctx.closePath(); + ctx.stroke(); + } + this.setRendered(); + } +} +TabSlide.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_0__.Font.SERIF, + size: 10, + weight: _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.BOLD, + style: _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.ITALIC, +}; + + +/***/ }), + +/***/ "./src/tabstave.ts": +/*!*************************!*\ + !*** ./src/tabstave.ts ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TabStave": () => (/* binding */ TabStave) +/* harmony export */ }); +/* harmony import */ var _stave__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./stave */ "./src/stave.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. + + +class TabStave extends _stave__WEBPACK_IMPORTED_MODULE_0__.Stave { + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_1__.Category.TabStave; + } + constructor(x, y, width, options) { + const tab_options = Object.assign({ spacing_between_lines_px: 13, num_lines: 6, top_text_position: 1 }, options); + super(x, y, width, tab_options); + } + getYForGlyphs() { + return this.getYForLine(2.5); + } + // Deprecated + addTabGlyph() { + this.addClef('tab'); + return this; + } +} + + +/***/ }), + +/***/ "./src/tabtie.ts": +/*!***********************!*\ + !*** ./src/tabtie.ts ***! + \***********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TabTie": () => (/* binding */ TabTie) +/* harmony export */ }); +/* harmony import */ var _stavetie__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./stavetie */ "./src/stavetie.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// / [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// ## Description +// This class implements varies types of ties between contiguous notes. The +// ties include: regular ties, hammer ons, pull offs, and slides. + + +class TabTie extends _stavetie__WEBPACK_IMPORTED_MODULE_0__.StaveTie { + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_1__.Category.TabTie; + } + static createHammeron(notes) { + return new TabTie(notes, 'H'); + } + static createPulloff(notes) { + return new TabTie(notes, 'P'); + } + /** + * @param notes is a struct that has: + * { + * first_note: Note, + * last_note: Note, + * first_indices: [n1, n2, n3], + * last_indices: [n1, n2, n3] + * } + * + * @param text + */ + constructor(notes, text) { + super(notes, text); + this.render_options.cp1 = 9; + this.render_options.cp2 = 11; + this.render_options.y_shift = 3; + this.direction = -1; // Tab tie's are always face up. + } +} + + +/***/ }), + +/***/ "./src/textbracket.ts": +/*!****************************!*\ + !*** ./src/textbracket.ts ***! + \****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TextBracketPosition": () => (/* binding */ TextBracketPosition), +/* harmony export */ "TextBracket": () => (/* binding */ TextBracket) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _renderer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./renderer */ "./src/renderer.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author: Cyril Silverman +// +// This file implements `TextBrackets` which extend between two notes. +// The octave transposition markings (8va, 8vb, 15va, 15vb) can be created +// using this class. + + + + + + +// To enable logging for this class. Set `Vex.Flow.TextBracket.DEBUG` to `true`. +// eslint-disable-next-line +function L(...args) { + if (TextBracket.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_5__.log)('Vex.Flow.TextBracket', args); +} +var TextBracketPosition; +(function (TextBracketPosition) { + TextBracketPosition[TextBracketPosition["TOP"] = 1] = "TOP"; + TextBracketPosition[TextBracketPosition["BOTTOM"] = -1] = "BOTTOM"; +})(TextBracketPosition || (TextBracketPosition = {})); +class TextBracket extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + constructor({ start, stop, text = '', superscript = '', position = TextBracketPosition.TOP }) { + super(); + this.start = start; + this.stop = stop; + this.text = text; + this.superscript = superscript; + this.position = typeof position === 'string' ? TextBracket.PositionString[position] : position; + this.line = 1; + this.resetFont(); + this.render_options = { + dashed: true, + dash: [5], + color: 'black', + line_width: 1, + show_bracket: true, + bracket_height: 8, + // In the BOTTOM position, the bracket line can extend + // under the superscript. + underline_superscript: true, + }; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_4__.Category.TextBracket; + } + static get Position() { + return TextBracketPosition; + } + static get PositionString() { + return { + top: TextBracketPosition.TOP, + bottom: TextBracketPosition.BOTTOM, + }; + } + /** + * @deprecated Use `TextBracket.Position` instead. + */ + static get Positions() { + L('Positions is deprecated, use TextBracketPosition instead.'); + return TextBracketPosition; + } + /** + * @deprecated Use `TextBracket.PositionString` instead. + */ + static get PositionsString() { + L('PositionsString is deprecated, use PositionString instead.'); + return TextBracket.PositionString; + } + /** + * Apply the text backet styling to the provided context. + * @param ctx + * @returns this + */ + applyStyle(ctx) { + ctx.setFont(this.font); + const options = this.render_options; + ctx.setStrokeStyle(options.color); + ctx.setFillStyle(options.color); + ctx.setLineWidth(options.line_width); + return this; + } + // Set whether the bracket line should be `dashed`. You can also + // optionally set the `dash` pattern by passing in an array of numbers + setDashed(dashed, dash) { + this.render_options.dashed = dashed; + if (dash) + this.render_options.dash = dash; + return this; + } + // Set the rendering `context` for the octave bracket + setLine(line) { + this.line = line; + return this; + } + // Draw the octave bracket on the rendering context + draw() { + const ctx = this.checkContext(); + this.setRendered(); + let y = 0; + switch (this.position) { + case TextBracketPosition.TOP: + y = this.start.checkStave().getYForTopText(this.line); + break; + case TextBracketPosition.BOTTOM: + y = this.start.checkStave().getYForBottomText(this.line + _tables__WEBPACK_IMPORTED_MODULE_3__.Tables.TEXT_HEIGHT_OFFSET_HACK); + break; + default: + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('InvalidPosition', `The position ${this.position} is invalid.`); + } + // Get the preliminary start and stop coordintates for the bracket + const start = { x: this.start.getAbsoluteX(), y }; + const stop = { x: this.stop.getAbsoluteX(), y }; + L('Rendering TextBracket: start:', start, 'stop:', stop, 'y:', y); + const bracket_height = this.render_options.bracket_height * this.position; + ctx.save(); + this.applyStyle(ctx); + // Draw text + ctx.fillText(this.text, start.x, start.y); + // Get the width and height for the octave number + const main_measure = ctx.measureText(this.text); + const main_width = main_measure.width; + const main_height = main_measure.height; + // Calculate the y position for the super script + const super_y = start.y - main_height / 2.5; + // We called this.resetFont() in the constructor, so we know this.textFont is available. + // eslint-disable-next-line + const { family, size, weight, style } = this.textFont; + // To draw the superscript, we scale the font size by 1/1.4. + const smallerFontSize = _font__WEBPACK_IMPORTED_MODULE_1__.Font.scaleSize(size, 0.714286); + ctx.setFont(family, smallerFontSize, weight, style); + ctx.fillText(this.superscript, start.x + main_width + 1, super_y); + // Determine width and height of the superscript + const super_measure = ctx.measureText(this.superscript); + const super_width = super_measure.width; + const super_height = super_measure.height; + // Setup initial coordinates for the bracket line + let start_x = start.x; + let line_y = super_y; + const end_x = stop.x + this.stop.getGlyph().getWidth(); + // Adjust x and y coordinates based on position + if (this.position === TextBracketPosition.TOP) { + start_x += main_width + super_width + 5; + line_y -= super_height / 2.7; + } + else if (this.position === TextBracketPosition.BOTTOM) { + line_y += super_height / 2.7; + start_x += main_width + 2; + if (!this.render_options.underline_superscript) { + start_x += super_width; + } + } + if (this.render_options.dashed) { + // Main line + _renderer__WEBPACK_IMPORTED_MODULE_2__.Renderer.drawDashedLine(ctx, start_x, line_y, end_x, line_y, this.render_options.dash); + // Ending Bracket + if (this.render_options.show_bracket) { + _renderer__WEBPACK_IMPORTED_MODULE_2__.Renderer.drawDashedLine(ctx, end_x, line_y + 1 * this.position, end_x, line_y + bracket_height, this.render_options.dash); + } + } + else { + ctx.beginPath(); + ctx.moveTo(start_x, line_y); + // Main line + ctx.lineTo(end_x, line_y); + if (this.render_options.show_bracket) { + // Ending bracket + ctx.lineTo(end_x, line_y + bracket_height); + } + ctx.stroke(); + ctx.closePath(); + } + ctx.restore(); + } +} +TextBracket.DEBUG = false; +TextBracket.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_1__.Font.SERIF, + size: 15, + weight: _font__WEBPACK_IMPORTED_MODULE_1__.FontWeight.NORMAL, + style: _font__WEBPACK_IMPORTED_MODULE_1__.FontStyle.ITALIC, +}; + + +/***/ }), + +/***/ "./src/textdynamics.ts": +/*!*****************************!*\ + !*** ./src/textdynamics.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TextDynamics": () => (/* binding */ TextDynamics) +/* harmony export */ }); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./note */ "./src/note.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + +// eslint-disable-next-line +function L(...args) { + if (TextDynamics.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_3__.log)('Vex.Flow.TextDynamics', args); +} +/** + * `TextDynamics` renders traditional + * text dynamics markings, **ie: p, f, sfz, rfz, ppp** + * + * You can render any dynamics string that contains a combination of + * the following letters: P, M, F, Z, R, S + */ +class TextDynamics extends _note__WEBPACK_IMPORTED_MODULE_1__.Note { + /** + * Create the dynamics marking. + * + * A `TextDynamics` object inherits from `Note` so that it can be formatted + * within a `Voice`. + * + * @param noteStruct an object that contains a `duration` property and a + * `sequence` of letters that represents the letters to render. + */ + constructor(noteStruct) { + super(noteStruct); + this.sequence = (noteStruct.text || '').toLowerCase(); + this.line = noteStruct.line || 0; + this.glyphs = []; + this.render_options = Object.assign(Object.assign({}, this.render_options), { glyph_font_size: 40 }); + L('New Dynamics Text: ', this.sequence); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_2__.Category.TextDynamics; + } + /** The glyph data for each dynamics letter. */ + static get GLYPHS() { + return { + f: { + code: 'dynamicForte', + width: 12, + }, + p: { + code: 'dynamicPiano', + width: 14, + }, + m: { + code: 'dynamicMezzo', + width: 17, + }, + s: { + code: 'dynamicSforzando', + width: 10, + }, + z: { + code: 'dynamicZ', + width: 12, + }, + r: { + code: 'dynamicRinforzando', + width: 12, + }, + }; + } + /** Set the Stave line on which the note should be placed. */ + setLine(line) { + this.line = line; + return this; + } + /** Preformat the dynamics text. */ + preFormat() { + let total_width = 0; + // length of this.glyphs must be <= + // length of this.sequence, so if we're formatted before + // create new glyphs. + this.glyphs = []; + // Iterate through each letter + this.sequence.split('').forEach((letter) => { + // Get the glyph data for the letter + const glyph_data = TextDynamics.GLYPHS[letter]; + if (!glyph_data) + throw new _util__WEBPACK_IMPORTED_MODULE_3__.RuntimeError('Invalid dynamics character: ' + letter); + const size = (0,_util__WEBPACK_IMPORTED_MODULE_3__.defined)(this.render_options.glyph_font_size); + const glyph = new _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph(glyph_data.code, size, { category: 'textNote' }); + // Add the glyph + this.glyphs.push(glyph); + total_width += glyph_data.width; + }); + // Store the width of the text + this.setWidth(total_width); + this.preFormatted = true; + return this; + } + /** Draw the dynamics text on the rendering context. */ + draw() { + this.setRendered(); + const x = this.getAbsoluteX(); + const y = this.checkStave().getYForLine(this.line + -3); + L('Rendering Dynamics: ', this.sequence); + let letter_x = x; + this.glyphs.forEach((glyph, index) => { + const current_letter = this.sequence[index]; + glyph.render(this.checkContext(), letter_x, y); + letter_x += TextDynamics.GLYPHS[current_letter].width; + }); + } +} +/** To enable logging for this class. Set `Vex.Flow.TextDynamics.DEBUG` to `true`. */ +TextDynamics.DEBUG = false; + + +/***/ }), + +/***/ "./src/textformatter.ts": +/*!******************************!*\ + !*** ./src/textformatter.ts ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TextFormatter": () => (/* binding */ TextFormatter) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + +// eslint-disable-next-line +function L(...args) { + if (TextFormatter.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_1__.log)('Vex.Flow.TextFormatter', args); +} +/** + * Text widths are stored in a cache, so we don't have to recompute widths + * for the same font + string combination. + * + * The cache is first keyed by the font information. The key is of the form: + * `${family}-${size}-${weight}-${style}` + * The second level key is the specific text to be measured. + * + * The stored value is the measured width in `em` units. + * textWidth == textWidthCache[cacheKey][textToMeasure] + */ +const textWidthCache = {}; +/** + * Applications may register additional fonts via `TextFormatter.registerInfo(info)`. + * The metrics for those fonts will be made available to the application. + */ +const registry = {}; +class TextFormatter { + /** + * Use `TextFormatter.create(...)` to build an instance from information previously + * registered via `TextFormatter.registerInfo(info)`. + */ + constructor(formatterInfo) { + /** Font family. */ + this.family = ''; + /** Specified in `pt` units. */ + this.size = 14; + /** Font metrics are extracted at 1000 upem (units per em). */ + this.resolution = 1000; + /** + * For text formatting, we do not require glyph outlines, but instead rely on glyph + * bounding box metrics such as: + * ``` + * { + * x_min: 48, + * x_max: 235, + * y_min: -17, + * y_max: 734, + * ha: 751, + * leftSideBearing: 48, + * advanceWidth: 286, + * } + * ``` + */ + this.glyphs = {}; + this.serifs = false; + this.monospaced = false; + this.italic = false; + this.bold = false; + this.superscriptOffset = 0; + this.subscriptOffset = 0; + this.maxSizeGlyph = 'H'; + // This is an internal key used to index the `textWidthCache`. + this.cacheKey = ''; + this.updateParams(formatterInfo); + } + /** + * Return all registered font families. + */ + static getFontFamilies() { + const registeredFonts = []; + for (const fontFamily in registry) { + const formatterInfo = registry[fontFamily]; + registeredFonts.push(Object.assign({}, formatterInfo)); + } + return registeredFonts; + } + /** + * Call `TextFormatter.registerInfo(info)` to register font information before using this method. + * + * This method creates a formatter for the font that most closely matches the requested font. + * We compare font family, bold, and italic attributes. + * This method will return a fallback formatter if there are no matches. + */ + static create(requestedFont = {}) { + L('create: ', requestedFont); + if (!requestedFont.family) { + requestedFont.family = _font__WEBPACK_IMPORTED_MODULE_0__.Font.SANS_SERIF; + } + // TODO: One potential (small) optimization is to cache the TextFormatter object + // returned for each font info. We would probably want to clear the cache if + // the registry is ever updated. + const candidates = []; + // The incoming font family is a string of comma-separated font family names. + // (e.g., `PetalumaScript, Arial, sans-serif`). + const requestedFamilies = requestedFont.family.split(/\s*,\s*/); + for (const requestedFamily of requestedFamilies) { + for (const fontFamily in registry) { + // Support cases where the registry contains 'Roboto Slab Medium', + // but the requestedFont.family is 'Roboto Slab'. + if (fontFamily.startsWith(requestedFamily)) { + candidates.push(registry[fontFamily]); + } + } + if (candidates.length > 0) { + break; + } + } + let formatter; + if (candidates.length === 0) { + // No match, so return a fallback text formatter. + formatter = new TextFormatter(Object.values(registry)[0]); + } + else if (candidates.length === 1) { + formatter = new TextFormatter(candidates[0]); + } + else { + const bold = _font__WEBPACK_IMPORTED_MODULE_0__.Font.isBold(requestedFont.weight); + const italic = _font__WEBPACK_IMPORTED_MODULE_0__.Font.isItalic(requestedFont.style); + const perfectMatch = candidates.find((f) => f.bold === bold && f.italic === italic); + if (perfectMatch) { + formatter = new TextFormatter(perfectMatch); + } + else { + const partialMatch = candidates.find((f) => f.italic === italic || f.bold === bold); + if (partialMatch) { + formatter = new TextFormatter(partialMatch); + } + else { + formatter = new TextFormatter(candidates[0]); + } + } + } + const fontSize = requestedFont.size; + if (typeof fontSize !== 'undefined') { + const fontSizeInPt = _font__WEBPACK_IMPORTED_MODULE_0__.Font.convertSizeToPointValue(fontSize); + formatter.setFontSize(fontSizeInPt); + } + return formatter; + } + /** + * @param fontFamily used as a key to the font registry. + * @returns the same info object that was passed in via `TextFormatter.registerInfo(info)` + */ + static getInfo(fontFamily) { + return registry[fontFamily]; + } + /** + * Apps may register their own fonts and metrics, and those metrics + * will be available to the app for formatting. + * + * Metrics can be generated from a font file using fontgen_text.js in the tools/fonts directory. + * @param info + * @param overwrite + */ + static registerInfo(info, overwrite = false) { + L('registerInfo: ', info, overwrite); + const fontFamily = info.family; + const currFontInfo = registry[fontFamily]; + if (currFontInfo === undefined || overwrite) { + registry[fontFamily] = info; + } + } + updateParams(params) { + if (params.family) + this.family = params.family; + if (params.resolution) + this.resolution = params.resolution; + if (params.glyphs) + this.glyphs = params.glyphs; + if (params.serifs) + this.serifs = params.serifs; + if (params.monospaced) + this.monospaced = params.monospaced; + if (params.italic) + this.italic = params.italic; + if (params.bold) + this.bold = params.bold; + if (params.maxSizeGlyph) + this.maxSizeGlyph = params.maxSizeGlyph; + if (params.superscriptOffset) + this.superscriptOffset = params.superscriptOffset; + if (params.subscriptOffset) + this.subscriptOffset = params.subscriptOffset; + this.updateCacheKey(); + } + /** Create a hash with the current font data, so we can cache computed widths. */ + updateCacheKey() { + const family = this.family.replace(/\s+/g, '_'); + const size = this.size; + const weight = this.bold ? _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.BOLD : _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.NORMAL; + const style = this.italic ? _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.ITALIC : _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.NORMAL; + // Use the same key format as SVGContext. + this.cacheKey = `${family}%${size}%${weight}%${style}`; + } + /** + * The glyphs table is indexed by the character (e.g., 'C', '@'). + * See: robotoslab_glyphs.ts & petalumascript_glyphs.ts. + */ + getGlyphMetrics(character) { + if (this.glyphs[character]) { + return this.glyphs[character]; + } + else { + return this.glyphs[this.maxSizeGlyph]; + } + } + get maxHeight() { + const metrics = this.getGlyphMetrics(this.maxSizeGlyph); + return (metrics.ha / this.resolution) * this.fontSizeInPixels; + } + /** + * Retrieve the character's advanceWidth as a fraction of an `em` unit. + * For the space character ' ' as defined in the: + * petalumascript_glyphs.ts: 250 advanceWidth in the 1000 unitsPerEm font returns 0.25. + * robotoslab_glyphs.ts: 509 advanceWidth in the 2048 unitsPerEm font returns 0.2485. + */ + getWidthForCharacterInEm(c) { + var _a; + const metrics = this.getGlyphMetrics(c); + if (!metrics) { + // An arbitrary number, close to the `em` width of the '#' and '5' characters in PetalumaScript. + return 0.65; + } + else { + const advanceWidth = (_a = metrics.advanceWidth) !== null && _a !== void 0 ? _a : 0; + return advanceWidth / this.resolution; + } + } + /** + * Retrieve the total width of `text` in `em` units. + */ + getWidthForTextInEm(text) { + const key = this.cacheKey; + // Get the cache for this specific font family, size, weight, style combination. + // The cache contains previously computed widths for different `text` strings. + let cachedWidths = textWidthCache[key]; + if (cachedWidths === undefined) { + cachedWidths = {}; + textWidthCache[key] = cachedWidths; + } + let width = cachedWidths[text]; + if (width === undefined) { + width = 0; + for (let i = 0; i < text.length; ++i) { + width += this.getWidthForCharacterInEm(text[i]); + } + cachedWidths[text] = width; + } + return width; + } + /** The width of the text (in `em`) is scaled by the font size (in `px`). */ + getWidthForTextInPx(text) { + return this.getWidthForTextInEm(text) * this.fontSizeInPixels; + } + /** + * @param size in pt. + */ + setFontSize(size) { + this.size = size; + // The width cache key depends on the current font size. + this.updateCacheKey(); + return this; + } + /** `this.size` is specified in points. Convert to pixels. */ + get fontSizeInPixels() { + return this.size * _font__WEBPACK_IMPORTED_MODULE_0__.Font.scaleToPxFrom.pt; + } + getResolution() { + return this.resolution; + } +} +/** To enable logging for this class. Set `Vex.Flow.TextFormatter.DEBUG` to `true`. */ +TextFormatter.DEBUG = false; + + +/***/ }), + +/***/ "./src/textnote.ts": +/*!*************************!*\ + !*** ./src/textnote.ts ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Justification": () => (/* binding */ Justification), +/* harmony export */ "TextNote": () => (/* binding */ TextNote) +/* harmony export */ }); +/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./font */ "./src/font.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./note */ "./src/note.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + +var Justification; +(function (Justification) { + Justification[Justification["LEFT"] = 1] = "LEFT"; + Justification[Justification["CENTER"] = 2] = "CENTER"; + Justification[Justification["RIGHT"] = 3] = "RIGHT"; +})(Justification || (Justification = {})); +/** + * `TextNote` is a notation element that is positioned in time. Generally + * meant for objects that sit above/below the staff and inline with each other. + * `TextNote` has to be assigned to a `Stave` before rendering by means of `setStave`. + * Examples of this would be such as dynamics, lyrics, chord changes, etc. + */ +class TextNote extends _note__WEBPACK_IMPORTED_MODULE_2__.Note { + constructor(noteStruct) { + super(noteStruct); + this.text = noteStruct.text || ''; + this.superscript = noteStruct.superscript; + this.subscript = noteStruct.subscript; + this.setFont(noteStruct.font); + this.line = noteStruct.line || 0; + this.smooth = noteStruct.smooth || false; + this.ignore_ticks = noteStruct.ignore_ticks || false; + this.justification = Justification.LEFT; + // Determine and set initial note width. Note that the text width is + // an approximation and isn't very accurate. The only way to accurately + // measure the length of text is with `CanvasRenderingContext2D.measureText()`. + if (noteStruct.glyph) { + const struct = TextNote.GLYPHS[noteStruct.glyph]; + if (!struct) + throw new _util__WEBPACK_IMPORTED_MODULE_4__.RuntimeError('Invalid glyph type: ' + noteStruct.glyph); + this.glyph = new _glyph__WEBPACK_IMPORTED_MODULE_1__.Glyph(struct.code, 40, { category: 'textNote' }); + this.setWidth(this.glyph.getMetrics().width); + } + else { + this.glyph = undefined; + } + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.TextNote; + } + static get Justification() { + return Justification; + } + /** Glyph data. */ + static get GLYPHS() { + return { + segno: { + code: 'segno', + }, + tr: { + code: 'ornamentTrill', + }, + mordent: { + code: 'ornamentMordent', + }, + mordent_upper: { + code: 'ornamentShortTrill', + }, + mordent_lower: { + code: 'ornamentMordent', + }, + f: { + code: 'dynamicForte', + }, + p: { + code: 'dynamicPiano', + }, + m: { + code: 'dynamicMezzo', + }, + s: { + code: 'dynamicSforzando', + }, + z: { + code: 'dynamicZ', + }, + coda: { + code: 'coda', + }, + pedal_open: { + code: 'keyboardPedalPed', + }, + pedal_close: { + code: 'keyboardPedalUp', + }, + caesura_straight: { + code: 'caesura', + }, + caesura_curved: { + code: 'caesuraCurved', + }, + breath: { + code: 'breathMarkComma', + }, + tick: { + code: 'breathMarkTick', + }, + turn: { + code: 'ornamentTurn', + }, + turn_inverted: { + code: 'ornamentTurnSlash', + }, + }; + } + /** Set the horizontal justification of the TextNote. */ + setJustification(just) { + this.justification = just; + return this; + } + /** Set the Stave line on which the note should be placed. */ + setLine(line) { + this.line = line; + return this; + } + /** Pre-render formatting. */ + preFormat() { + if (this.preFormatted) + return; + const tickContext = this.checkTickContext(`Can't preformat without a TickContext.`); + if (this.smooth) { + this.setWidth(0); + } + else { + if (this.glyph) { + // Width already set. + } + else { + const ctx = this.checkContext(); + ctx.setFont(this.textFont); + this.setWidth(ctx.measureText(this.text).width); + } + } + if (this.justification === Justification.CENTER) { + this.leftDisplacedHeadPx = this.width / 2; + } + else if (this.justification === Justification.RIGHT) { + this.leftDisplacedHeadPx = this.width; + } + // We reposition to the center of the note head + this.rightDisplacedHeadPx = tickContext.getMetrics().glyphPx / 2; + this.preFormatted = true; + } + /** + * Renders the TextNote. + * `TextNote` has to be assigned to a `Stave` before rendering by means of `setStave`. + */ + draw() { + const ctx = this.checkContext(); + const stave = this.checkStave(); + const tickContext = this.checkTickContext(`Can't draw without a TickContext.`); + this.setRendered(); + // Reposition to center of note head + let x = this.getAbsoluteX() + tickContext.getMetrics().glyphPx / 2; + // Align based on tick-context width. + const width = this.getWidth(); + if (this.justification === Justification.CENTER) { + x -= width / 2; + } + else if (this.justification === Justification.RIGHT) { + x -= width; + } + let y; + if (this.glyph) { + y = stave.getYForLine(this.line + -3); + this.glyph.render(ctx, x, y); + } + else { + y = stave.getYForLine(this.line + -3); + this.applyStyle(ctx); + ctx.setFont(this.textFont); + ctx.fillText(this.text, x, y); + const height = ctx.measureText(this.text).height; + // We called this.setFont(...) in the constructor, so we know this.textFont is available. + // eslint-disable-next-line + const { family, size, weight, style } = this.textFont; + // Scale the font size by 1/1.3. + const smallerFontSize = _font__WEBPACK_IMPORTED_MODULE_0__.Font.scaleSize(size, 0.769231); + if (this.superscript) { + ctx.setFont(family, smallerFontSize, weight, style); + ctx.fillText(this.superscript, x + this.width + 2, y - height / 2.2); + } + if (this.subscript) { + ctx.setFont(family, smallerFontSize, weight, style); + ctx.fillText(this.subscript, x + this.width + 2, y + height / 2.2 - 1); + } + this.restoreStyle(ctx); + } + } +} +TextNote.TEXT_FONT = { + family: _font__WEBPACK_IMPORTED_MODULE_0__.Font.SANS_SERIF, + size: 12, + weight: _font__WEBPACK_IMPORTED_MODULE_0__.FontWeight.NORMAL, + style: _font__WEBPACK_IMPORTED_MODULE_0__.FontStyle.NORMAL, +}; + + +/***/ }), + +/***/ "./src/tickable.ts": +/*!*************************!*\ + !*** ./src/tickable.ts ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Tickable": () => (/* binding */ Tickable) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _fraction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./fraction */ "./src/fraction.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + +/** + * Tickable represents a element that sit on a score and + * has a duration, i.e., Tickables occupy space in the musical rendering dimension. + */ +class Tickable extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + constructor() { + super(); + this._preFormatted = false; + this._postFormatted = false; + // These properties represent the duration of + // this tickable element. + this.ticks = new _fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(0, 1); // Fractional value of ticks + this.intrinsicTicks = 0; // Floating point value of ticks + this.tickMultiplier = new _fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(1, 1); + // Formatter metrics + this.width = 0; + this.x_shift = 0; // Shift from tick context + this.modifiers = []; + this.tupletStack = []; + this.align_center = false; + this.center_x_shift = 0; // Shift from tick context if center aligned + // This flag tells the formatter to ignore this tickable during + // formatting and justification. It is set by tickables such as BarNote. + this.ignore_ticks = false; + // This is a space for an external formatting class or function to maintain + // metrics. + this.formatterMetrics = { + // The freedom of a tickable is the distance it can move without colliding + // with neighboring elements. A formatter can set these values during its + // formatting pass, which a different formatter can then use to fine tune. + freedom: { left: 0, right: 0 }, + // The simplified rational duration of this tick as a string. It can be + // used as an index to a map or hashtable. + duration: '', + // The number of formatting iterations undergone. + iterations: 0, + // The space in pixels allocated by this formatter, along with the mean space + // for tickables of this duration, and the deviation from the mean. + space: { + used: 0, + mean: 0, + deviation: 0, + }, + }; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.Tickable; + } + /** Reset the Tickable, this function will be overloaded. */ + reset() { + return this; + } + /** Return the ticks. */ + getTicks() { + return this.ticks; + } + /** Check if it ignores the ticks. */ + shouldIgnoreTicks() { + return this.ignore_ticks; + } + /** Ignore the ticks. */ + setIgnoreTicks(flag) { + this.ignore_ticks = flag; + return this; + } + /** Set width of note. Used by the formatter for positioning. */ + setWidth(width) { + this.width = width; + } + /** Get width of note. Used by the formatter for positioning. */ + getWidth() { + if (!this._preFormatted) { + throw new _util__WEBPACK_IMPORTED_MODULE_4__.RuntimeError('UnformattedNote', "Can't call GetWidth on an unformatted note."); + } + return this.width + (this.modifierContext ? this.modifierContext.getWidth() : 0); + } + /** Displace note by `x` pixels. Used by the formatter. */ + setXShift(x) { + this.x_shift = x; + return this; + } + /** Get the `x` displaced pixels of the note. */ + getXShift() { + return this.x_shift; + } + /** Get `x` position of this tick context. */ + getX() { + const tickContext = this.checkTickContext(`Can't getX() without a TickContext.`); + return tickContext.getX() + this.x_shift; + } + /** Return the formatterMetrics. */ + getFormatterMetrics() { + return this.formatterMetrics; + } + /** Return the center `x` shift. */ + getCenterXShift() { + if (this.isCenterAligned()) { + return this.center_x_shift; + } + return 0; + } + /** Set the center `x` shift. */ + setCenterXShift(centerXShift) { + this.center_x_shift = centerXShift; + return this; + } + // Check if tickable is center aligned. */ + isCenterAligned() { + return this.align_center; + } + // Set/unset center alignment. */ + setCenterAlignment(align_center) { + this.align_center = align_center; + return this; + } + /** + * Return the associated voice. Every tickable must be associated with a voice. + * This allows formatters and preFormatter to associate them with the right modifierContexts. + */ + getVoice() { + return (0,_util__WEBPACK_IMPORTED_MODULE_4__.defined)(this.voice, 'NoVoice', 'Tickable has no voice.'); + } + /** Set the associated voice. */ + setVoice(voice) { + this.voice = voice; + } + /** Get the tuplet. */ + getTuplet() { + return this.tuplet; + } + /** Return the intrinsic ticks. */ + getTupletStack() { + return this.tupletStack; + } + /** + * Reset the specific Tuplet if this is not provided, all tuplets are reset. + * Remove any prior tuplets from the tick calculation and + * reset the intrinsic tick value. + */ + resetTuplet(tuplet) { + let noteCount; + let notesOccupied; + if (tuplet) { + const i = this.tupletStack.indexOf(tuplet); + if (i !== -1) { + this.tupletStack.splice(i, 1); + noteCount = tuplet.getNoteCount(); + notesOccupied = tuplet.getNotesOccupied(); + // Revert old multiplier by inverting numerator & denom.: + this.applyTickMultiplier(noteCount, notesOccupied); + } + return this; + } + while (this.tupletStack.length) { + tuplet = this.tupletStack.pop(); + noteCount = tuplet.getNoteCount(); + notesOccupied = tuplet.getNotesOccupied(); + // Revert old multiplier by inverting numerator & denom.: + this.applyTickMultiplier(noteCount, notesOccupied); + } + return this; + } + /** Attach to new tuplet. */ + setTuplet(tuplet) { + if (tuplet) { + this.tupletStack.push(tuplet); + const noteCount = tuplet.getNoteCount(); + const notesOccupied = tuplet.getNotesOccupied(); + this.applyTickMultiplier(notesOccupied, noteCount); + } + this.tuplet = tuplet; + return this; + } + /** + * Add self to the provided ModifierContext `mc`. + * If this tickable has modifiers, set modifierContext. + * @returns this + */ + addToModifierContext(mc) { + this.modifierContext = mc; + for (let i = 0; i < this.modifiers.length; ++i) { + this.modifierContext.addMember(this.modifiers[i]); + } + this.modifierContext.addMember(this); + this._preFormatted = false; + return this; + } + /** + * Optional, if tickable has modifiers, associate a Modifier. + * @param mod the modifier + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + addModifier(modifier, index = 0) { + this.modifiers.push(modifier); + this._preFormatted = false; + return this; + } + /** Get the list of associated modifiers. */ + getModifiers() { + return this.modifiers; + } + /** Set the Tick Context. */ + setTickContext(tc) { + this.tickContext = tc; + this._preFormatted = false; + } + checkTickContext(message = 'Tickable has no tick context.') { + return (0,_util__WEBPACK_IMPORTED_MODULE_4__.defined)(this.tickContext, 'NoTickContext', message); + } + /** Preformat the Tickable. */ + preFormat() { + if (this._preFormatted) + return; + this.width = 0; + if (this.modifierContext) { + this.modifierContext.preFormat(); + this.width += this.modifierContext.getWidth(); + } + } + /** Set preformatted status. */ + set preFormatted(value) { + this._preFormatted = value; + } + get preFormatted() { + return this._preFormatted; + } + /** Postformat the Tickable. */ + postFormat() { + if (this._postFormatted) + return this; + this._postFormatted = true; + return this; + } + /** Set postformatted status. */ + set postFormatted(value) { + this._postFormatted = value; + } + get postFormatted() { + return this._postFormatted; + } + /** Return the intrinsic ticks. */ + getIntrinsicTicks() { + return this.intrinsicTicks; + } + /** Set the intrinsic ticks. */ + setIntrinsicTicks(intrinsicTicks) { + this.intrinsicTicks = intrinsicTicks; + this.ticks = this.tickMultiplier.clone().multiply(this.intrinsicTicks); + } + /** Get the tick multiplier. */ + getTickMultiplier() { + return this.tickMultiplier; + } + /** Apply a tick multiplier. */ + applyTickMultiplier(numerator, denominator) { + this.tickMultiplier.multiply(numerator, denominator); + this.ticks = this.tickMultiplier.clone().multiply(this.intrinsicTicks); + } + /** Set the duration. */ + setDuration(duration) { + const ticks = duration.numerator * (_tables__WEBPACK_IMPORTED_MODULE_2__.Tables.RESOLUTION / duration.denominator); + this.ticks = this.tickMultiplier.clone().multiply(ticks); + this.intrinsicTicks = this.ticks.value(); + } + getAbsoluteX() { + const tickContext = this.checkTickContext(`Can't getAbsoluteX() without a TickContext.`); + return tickContext.getX(); + } + /** Attach this note to a modifier context. */ + setModifierContext(mc) { + this.modifierContext = mc; + return this; + } + /** Get `ModifierContext`. */ + getModifierContext() { + return this.modifierContext; + } + /** Check and get `ModifierContext`. */ + checkModifierContext() { + return (0,_util__WEBPACK_IMPORTED_MODULE_4__.defined)(this.modifierContext, 'NoModifierContext', 'No modifier context attached to this tickable.'); + } +} + + +/***/ }), + +/***/ "./src/tickcontext.ts": +/*!****************************!*\ + !*** ./src/tickcontext.ts ***! + \****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TickContext": () => (/* binding */ TickContext) +/* harmony export */ }); +/* harmony import */ var _fraction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./fraction */ "./src/fraction.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// ## Description +// A formatter for abstract tickable objects, such as notes, chords, +// tabs, etc. + + +/** + * TickContext formats abstract tickable objects, such as notes, chords, tabs, etc. + */ +class TickContext { + constructor(options) { + this.preFormatted = false; + this.postFormatted = false; + this.tickID = options && options.tickID ? options.tickID : 0; + this.currentTick = new _fraction__WEBPACK_IMPORTED_MODULE_0__.Fraction(0, 1); + this.maxTicks = new _fraction__WEBPACK_IMPORTED_MODULE_0__.Fraction(0, 1); + this.maxTickable = undefined; // Biggest tickable + this.minTicks = undefined; // this can remian null if all tickables have ignore_ticks + this.minTickable = undefined; + this.padding = 1; // padding on each side (width += padding * 2) + this.x = 0; + this.xBase = 0; // base x position without xOffset + this.xOffset = 0; // xBase and xOffset are an alternative way to describe x (x = xB + xO) + this.tickables = []; // Notes, tabs, chords, lyrics. + this.tickablesByVoice = {}; // Tickables indexed by voice number + // Formatting metrics + this.notePx = 0; // width of widest note in this context + this.glyphPx = 0; // width of glyph (note head) + this.leftDisplacedHeadPx = 0; // Extra left pixels for displaced notes + this.rightDisplacedHeadPx = 0; // Extra right pixels for displaced notes + this.modLeftPx = 0; // Left modifier pixels + this.modRightPx = 0; // Right modifier pixels + this.totalLeftPx = 0; // Total left pixels + this.totalRightPx = 0; // Total right pixels + this.tContexts = []; // Parent array of tick contexts + this.width = 0; + this.formatterMetrics = { + // The freedom of a tickcontext is the distance it can move without colliding + // with neighboring elements. A formatter can set these values during its + // formatting pass, which a different formatter can then use to fine tune. + freedom: { left: 0, right: 0 }, + }; + } + static getNextContext(tContext) { + const contexts = tContext.tContexts; + const index = contexts.indexOf(tContext); + if (index + 1 < contexts.length) + return contexts[index + 1]; + } + getTickID() { + return this.tickID; + } + getX() { + return this.x; + } + setX(x) { + this.x = x; + this.xBase = x; + this.xOffset = 0; + return this; + } + getXBase() { + return this.xBase; + } // use of xBase and xOffset is optional, avoids offset creep + setXBase(xBase) { + this.xBase = xBase; + this.x = xBase + this.xOffset; + } + getXOffset() { + return this.xOffset; + } + setXOffset(xOffset) { + this.xOffset = xOffset; + this.x = this.xBase + xOffset; + } + getWidth() { + return this.width + this.padding * 2; + } + setPadding(padding) { + this.padding = padding; + return this; + } + getMaxTicks() { + return this.maxTicks; + } + getMinTicks() { + return this.minTicks; + } + getMaxTickable() { + return this.maxTickable; + } + getMinTickable() { + return this.minTickable; + } + getTickables() { + return this.tickables; + } + /** + * Introduced on 2020-04-17 as getTickablesForVoice(voiceIndex). + * https://github.com/0xfe/vexflow/blame/dc97b0cc5bb93171c0038638c34362dc958222ca/src/tickcontext.js#L63 + * Renamed on 2021-08-05 to getTickableForVoice(voiceIndex). Method renamed to singular, since it returns one Tickable. + */ + getTickableForVoice(voiceIndex) { + return this.tickablesByVoice[voiceIndex]; + } + getTickablesByVoice() { + return this.tickablesByVoice; + } + getCenterAlignedTickables() { + return this.tickables.filter((tickable) => tickable.isCenterAligned()); + } + /** Gets widths context, note and left/right modifiers for formatting. */ + getMetrics() { + const { width, glyphPx, notePx, leftDisplacedHeadPx, rightDisplacedHeadPx, modLeftPx, modRightPx, totalLeftPx, totalRightPx, } = this; + return { + width, + glyphPx, + notePx, + leftDisplacedHeadPx, + rightDisplacedHeadPx, + modLeftPx, + modRightPx, + totalLeftPx, + totalRightPx, + }; + } + getCurrentTick() { + return this.currentTick; + } + setCurrentTick(tick) { + this.currentTick = tick; + this.preFormatted = false; + } + addTickable(tickable, voiceIndex) { + if (!tickable) { + throw new _util__WEBPACK_IMPORTED_MODULE_1__.RuntimeError('BadArgument', 'Invalid tickable added.'); + } + if (!tickable.shouldIgnoreTicks()) { + const ticks = tickable.getTicks(); + if (ticks.greaterThan(this.maxTicks)) { + this.maxTicks = ticks.clone(); + this.maxTickable = tickable; + } + if (this.minTicks == null) { + this.minTicks = ticks.clone(); + this.minTickable = tickable; + } + else if (ticks.lessThan(this.minTicks)) { + this.minTicks = ticks.clone(); + this.minTickable = tickable; + } + } + tickable.setTickContext(this); + this.tickables.push(tickable); + this.tickablesByVoice[voiceIndex || 0] = tickable; + this.preFormatted = false; + return this; + } + preFormat() { + if (this.preFormatted) + return this; + for (let i = 0; i < this.tickables.length; ++i) { + const tickable = this.tickables[i]; + tickable.preFormat(); + const metrics = tickable.getMetrics(); + // Maintain max displaced head pixels from all tickables in the context + this.leftDisplacedHeadPx = Math.max(this.leftDisplacedHeadPx, metrics.leftDisplacedHeadPx); + this.rightDisplacedHeadPx = Math.max(this.rightDisplacedHeadPx, metrics.rightDisplacedHeadPx); + // Maintain the widest note for all tickables in the context + this.notePx = Math.max(this.notePx, metrics.notePx); + // Maintain the widest note head + this.glyphPx = Math.max(this.glyphPx, metrics.glyphWidth || 0); + // Total modifier shift + this.modLeftPx = Math.max(this.modLeftPx, metrics.modLeftPx); + this.modRightPx = Math.max(this.modRightPx, metrics.modRightPx); + // Total shift + this.totalLeftPx = Math.max(this.totalLeftPx, metrics.modLeftPx + metrics.leftDisplacedHeadPx); + this.totalRightPx = Math.max(this.totalRightPx, metrics.modRightPx + metrics.rightDisplacedHeadPx); + // Recalculate the tick context total width + this.width = this.notePx + this.totalLeftPx + this.totalRightPx; + } + return this; + } + postFormat() { + if (this.postFormatted) + return this; + this.postFormatted = true; + return this; + } + getFormatterMetrics() { + return this.formatterMetrics; + } +} + + +/***/ }), + +/***/ "./src/timesigglyph.ts": +/*!*****************************!*\ + !*** ./src/timesigglyph.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TimeSignatureGlyph": () => (/* binding */ TimeSignatureGlyph) +/* harmony export */ }); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// ## Description +// Renders time signatures glyphs for staffs +// This class is used by TimeSignature to render the associated glyphs + + +class TimeSignatureGlyph extends _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph { + constructor(timeSignature, topDigits, botDigits, code, point, options) { + var _a; + super(code, point, options); + this.timeSignature = timeSignature; + this.topGlyphs = []; + this.botGlyphs = []; + let topWidth = 0; + for (let i = 0; i < topDigits.length; ++i) { + let timeSigType = topDigits[i]; + switch (topDigits[i]) { + case '-': + timeSigType = 'Minus'; + break; + case '+': + timeSigType = botDigits.length > 0 ? 'PlusSmall' : 'Plus'; + break; + case '(': + timeSigType = botDigits.length > 0 ? 'ParensLeftSmall' : 'ParensLeft'; + break; + case ')': + timeSigType = botDigits.length > 0 ? 'ParensRightSmall' : 'ParensRight'; + break; + } + const topGlyph = new _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph('timeSig' + timeSigType, this.timeSignature.point); + this.topGlyphs.push(topGlyph); + topWidth += (_a = topGlyph.getMetrics().width) !== null && _a !== void 0 ? _a : 0; + } + let botWidth = 0; + for (let i = 0; i < botDigits.length; ++i) { + let timeSigType = botDigits[i]; + switch (botDigits[i]) { + case '+': + timeSigType = 'PlusSmall'; + break; + case '(': + timeSigType = 'ParensLeftSmall'; + break; + case ')': + timeSigType = 'ParensRightSmall'; + break; + } + const botGlyph = new _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph('timeSig' + timeSigType, this.timeSignature.point); + this.botGlyphs.push(botGlyph); + botWidth += (0,_util__WEBPACK_IMPORTED_MODULE_1__.defined)(botGlyph.getMetrics().width); + } + this.width = Math.max(topWidth, botWidth); + this.xMin = this.getMetrics().x_min; + this.topStartX = (this.width - topWidth) / 2.0; + this.botStartX = (this.width - botWidth) / 2.0; + this.reset(); + } + getMetrics() { + return { + x_min: this.xMin, + x_max: this.xMin + this.width, + width: this.width, + }; + } + renderToStave(x) { + const stave = this.checkStave(); + const ctx = this.checkContext(); + let start_x = x + this.topStartX; + let y = 0; + if (this.botGlyphs.length > 0) + y = stave.getYForLine(this.timeSignature.topLine); + else + y = (stave.getYForLine(this.timeSignature.topLine) + stave.getYForLine(this.timeSignature.bottomLine)) / 2; + for (let i = 0; i < this.topGlyphs.length; ++i) { + const glyph = this.topGlyphs[i]; + _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph.renderOutline(ctx, glyph.getMetrics().outline, this.scale, start_x + this.x_shift, y); + start_x += (0,_util__WEBPACK_IMPORTED_MODULE_1__.defined)(glyph.getMetrics().width); + } + start_x = x + this.botStartX; + y = stave.getYForLine(this.timeSignature.bottomLine); + for (let i = 0; i < this.botGlyphs.length; ++i) { + const glyph = this.botGlyphs[i]; + this.timeSignature.placeGlyphOnLine(glyph, stave, 0); + _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph.renderOutline(ctx, glyph.getMetrics().outline, this.scale, start_x + glyph.getMetrics().x_shift, y); + start_x += (0,_util__WEBPACK_IMPORTED_MODULE_1__.defined)(glyph.getMetrics().width); + } + } +} + + +/***/ }), + +/***/ "./src/timesignature.ts": +/*!******************************!*\ + !*** ./src/timesignature.ts ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TimeSignature": () => (/* binding */ TimeSignature) +/* harmony export */ }); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _stavemodifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stavemodifier */ "./src/stavemodifier.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _timesigglyph__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./timesigglyph */ "./src/timesigglyph.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// ## Description +// Implements time signatures glyphs for staffs +// See tables.js for the internal time signatures +// representation + + + + + + +const assertIsValidTimeSig = (timeSpec) => { + const numbers = timeSpec.split('/'); + if (numbers.length !== 2 && numbers[0] !== '+' && numbers[0] !== '-') { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('BadTimeSignature', `Invalid time spec: ${timeSpec}. Must be in the form "/"`); + } + numbers.forEach((number) => { + // Characters consisting in number 0..9, '+', '-', '(' or ')' + if (/^[0-9+\-()]+$/.test(number) == false) { + throw new _util__WEBPACK_IMPORTED_MODULE_5__.RuntimeError('BadTimeSignature', `Invalid time spec: ${timeSpec}. Must contain valid signatures.`); + } + }); +}; +class TimeSignature extends _stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifier { + constructor(timeSpec = '4/4', customPadding = 15, validate_args = true) { + super(); + this.validate_args = validate_args; + const padding = customPadding; + const musicFont = _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.currentMusicFont(); + this.point = musicFont.lookupMetric('digits.point'); + const fontLineShift = musicFont.lookupMetric('digits.shiftLine', 0); + this.topLine = 2 + fontLineShift; + this.bottomLine = 4 + fontLineShift; + this.setPosition(_stavemodifier__WEBPACK_IMPORTED_MODULE_1__.StaveModifierPosition.BEGIN); + this.info = this.parseTimeSpec(timeSpec); + this.setWidth((0,_util__WEBPACK_IMPORTED_MODULE_5__.defined)(this.info.glyph.getMetrics().width)); + this.setPadding(padding); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_4__.Category.TimeSignature; + } + static get glyphs() { + return { + C: { + code: 'timeSigCommon', + point: 40, + line: 2, + }, + 'C|': { + code: 'timeSigCutCommon', + point: 40, + line: 2, + }, + }; + } + parseTimeSpec(timeSpec) { + var _a, _b; + if (timeSpec === 'C' || timeSpec === 'C|') { + const { line, code, point } = TimeSignature.glyphs[timeSpec]; + return { + line, + num: false, + glyph: new _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph(code, point), + }; + } + if (this.validate_args) { + assertIsValidTimeSig(timeSpec); + } + const parts = timeSpec.split('/'); + return { + num: true, + glyph: this.makeTimeSignatureGlyph((_a = parts[0]) !== null && _a !== void 0 ? _a : '', (_b = parts[1]) !== null && _b !== void 0 ? _b : ''), + }; + } + makeTimeSignatureGlyph(topDigits, botDigits) { + return new _timesigglyph__WEBPACK_IMPORTED_MODULE_3__.TimeSignatureGlyph(this, topDigits, botDigits, 'timeSig0', this.point); + } + getInfo() { + return this.info; + } + setTimeSig(timeSpec) { + this.info = this.parseTimeSpec(timeSpec); + return this; + } + draw() { + const stave = this.checkStave(); + const ctx = stave.checkContext(); + this.setRendered(); + ctx.openGroup('timesignature', this.getAttribute('id')); + this.info.glyph.setStave(stave); + this.info.glyph.setContext(ctx); + this.placeGlyphOnLine(this.info.glyph, stave, this.info.line); + this.info.glyph.renderToStave(this.x); + ctx.closeGroup(); + } +} + + +/***/ }), + +/***/ "./src/timesignote.ts": +/*!****************************!*\ + !*** ./src/timesignote.ts ***! + \****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TimeSigNote": () => (/* binding */ TimeSigNote) +/* harmony export */ }); +/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./note */ "./src/note.ts"); +/* harmony import */ var _timesignature__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./timesignature */ "./src/timesignature.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author Taehoon Moon 2014 + + + +class TimeSigNote extends _note__WEBPACK_IMPORTED_MODULE_0__.Note { + constructor(timeSpec, customPadding) { + super({ duration: 'b' }); + const timeSignature = new _timesignature__WEBPACK_IMPORTED_MODULE_1__.TimeSignature(timeSpec, customPadding); + this.timeSigInfo = timeSignature.getInfo(); + this.setWidth(this.timeSigInfo.glyph.getMetrics().width); + // Note properties + this.ignore_ticks = true; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_2__.Category.TimeSigNote; + } + /* Overridden to ignore */ + // eslint-disable-next-line + addToModifierContext(mc) { + // DO NOTHING. + return this; + } + preFormat() { + this.preFormatted = true; + return this; + } + draw() { + const stave = this.checkStave(); + const ctx = this.checkContext(); + this.setRendered(); + if (!this.timeSigInfo.glyph.getContext()) { + this.timeSigInfo.glyph.setContext(ctx); + } + this.timeSigInfo.glyph.setStave(stave); + this.timeSigInfo.glyph.setYShift(stave.getYForLine(2) - stave.getYForGlyphs()); + this.timeSigInfo.glyph.renderToStave(this.getAbsoluteX()); + } +} + + +/***/ }), + +/***/ "./src/tremolo.ts": +/*!************************!*\ + !*** ./src/tremolo.ts ***! + \************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Tremolo": () => (/* binding */ Tremolo) +/* harmony export */ }); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _gracenote__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./gracenote */ "./src/gracenote.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author: Mike Corrigan +// MIT License + + + + + + +/** Tremolo implements tremolo notation. */ +class Tremolo extends _modifier__WEBPACK_IMPORTED_MODULE_2__.Modifier { + /** + * @param num number of bars + */ + constructor(num) { + super(); + this.num = num; + this.position = _modifier__WEBPACK_IMPORTED_MODULE_2__.Modifier.Position.CENTER; + this.code = 'tremolo1'; + // big strokes scales initialised to 1 (no scale) + this.y_spacing_scale = 1; + this.extra_stroke_scale = 1; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_5__.Category.Tremolo; + } + /** Draw the tremolo on the rendering context. */ + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const stemDirection = note.getStemDirection(); + const start = note.getModifierStartXY(this.position, this.index); + let x = start.x; + const gn = (0,_typeguard__WEBPACK_IMPORTED_MODULE_5__.isGraceNote)(note); + const scale = gn ? _gracenote__WEBPACK_IMPORTED_MODULE_1__.GraceNote.SCALE : 1; + const category = `tremolo.${gn ? 'grace' : 'default'}`; + const musicFont = _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.currentMusicFont(); + let y_spacing = musicFont.lookupMetric(`${category}.spacing`) * stemDirection; + // add y_spacing_scale for big strokes (#1258) + y_spacing *= this.y_spacing_scale; + const height = this.num * y_spacing; + let y = note.getStemExtents().baseY - height; + if (stemDirection < 0) { + y += musicFont.lookupMetric(`${category}.offsetYStemDown`) * scale; + } + else { + y += musicFont.lookupMetric(`${category}.offsetYStemUp`) * scale; + } + const fontScale = musicFont.lookupMetric(`${category}.point`); + x += musicFont.lookupMetric(`${category}.offsetXStem${stemDirection === _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP ? 'Up' : 'Down'}`); + for (let i = 0; i < this.num; ++i) { + _glyph__WEBPACK_IMPORTED_MODULE_0__.Glyph.renderGlyph(ctx, x, y, fontScale, this.code, { category, scale: this.extra_stroke_scale }); + y += y_spacing; + } + } +} + + +/***/ }), + +/***/ "./src/tuning.ts": +/*!***********************!*\ + !*** ./src/tuning.ts ***! + \***********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Tuning": () => (/* binding */ Tuning) +/* harmony export */ }); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + +/** `Tuning` implements varies types of tunings for tablature. */ +class Tuning { + /** + * Constructor. + * @param tuningString tuning name (eg. 'dagdad') or comma separated note strings + */ + constructor(tuningString = 'E/5,B/4,G/4,D/4,A/3,E/3,B/2,E/2') { + this.tuningValues = []; + // Default to standard tuning. + this.setTuning(tuningString); + } + static get names() { + return { + standard: 'E/5,B/4,G/4,D/4,A/3,E/3', + dagdad: 'D/5,A/4,G/4,D/4,A/3,D/3', + dropd: 'E/5,B/4,G/4,D/4,A/3,D/3', + eb: 'Eb/5,Bb/4,Gb/4,Db/4,Ab/3,Db/3', + standardBanjo: 'D/5,B/4,G/4,D/4,G/5', + }; + } + /** Return the note number associated to the note string. */ + noteToInteger(noteString) { + return _tables__WEBPACK_IMPORTED_MODULE_0__.Tables.keyProperties(noteString).int_value; + } + /** + * Set tuning identified by tuning name (eg. 'dagdad') + * @param tuningString tuning name (eg. 'dagdad') or comma separated note strings + */ + setTuning(tuningString) { + if (Tuning.names[tuningString]) { + tuningString = Tuning.names[tuningString]; + } + this.tuningValues = []; + const keys = tuningString.split(/\s*,\s*/); + if (keys.length === 0) { + throw new _util__WEBPACK_IMPORTED_MODULE_1__.RuntimeError('BadArguments', `Invalid tuning string: ${tuningString}`); + } + for (let i = 0; i < keys.length; ++i) { + this.tuningValues[i] = this.noteToInteger(keys[i]); + } + } + /** Return the note number associated with a tablature string. */ + getValueForString(stringNum) { + const s = Number(stringNum); + if (s < 1 || s > this.tuningValues.length) { + throw new _util__WEBPACK_IMPORTED_MODULE_1__.RuntimeError('BadArguments', `String number must be between 1 and ${this.tuningValues.length}:${stringNum}`); + } + return this.tuningValues[s - 1]; + } + /** Return the note number associated with a tablature string and fret. */ + getValueForFret(fretNum, stringNum) { + const stringValue = this.getValueForString(stringNum); + const f = Number(fretNum); + if (f < 0) { + throw new _util__WEBPACK_IMPORTED_MODULE_1__.RuntimeError('BadArguments', `Fret number must be 0 or higher: ${fretNum}`); + } + return stringValue + f; + } + /** Return the note string associated with tablature string and fret. */ + getNoteForFret(fretNum, stringNum) { + const noteValue = this.getValueForFret(fretNum, stringNum); + const octave = Math.floor(noteValue / 12); + const value = noteValue % 12; + return `${_tables__WEBPACK_IMPORTED_MODULE_0__.Tables.integerToNote(value)}/${octave}`; + } +} + + +/***/ }), + +/***/ "./src/tuplet.ts": +/*!***********************!*\ + !*** ./src/tuplet.ts ***! + \***********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TupletLocation": () => (/* binding */ TupletLocation), +/* harmony export */ "Tuplet": () => (/* binding */ Tuplet) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _formatter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./formatter */ "./src/formatter.ts"); +/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./glyph */ "./src/glyph.ts"); +/* harmony import */ var _stem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./stem */ "./src/stem.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +/** + * ## Description + * + * Create a new tuplet from the specified notes. The notes must + * be part of the same voice. If they are of different rhythmic + * values, then options.num_notes must be set. + * + * @constructor + * @param {Array.} A set of notes: staveNotes, + * notes, etc... any class that inherits stemmableNote at some + * point in its prototype chain. + * @param options: object { + * + * num_notes: fit this many notes into... + * notes_occupied: ...the space of this many notes + * + * Together, these two properties make up the tuplet ratio + * in the form of num_notes : notes_occupied. + * num_notes defaults to the number of notes passed in, so + * it is important that if you omit this property, all of + * the notes passed should be of the same note value. + * notes_occupied defaults to 2 -- so you should almost + * certainly pass this parameter for anything other than + * a basic triplet. + * + * location: + * default 1, which is above the notes: ┌─── 3 ───┐ + * -1 is below the notes └─── 3 ───┘ + * + * bracketed: boolean, draw a bracket around the tuplet number + * when true: ┌─── 3 ───┐ when false: 3 + * defaults to true if notes are not beamed, false otherwise + * + * ratioed: boolean + * when true: ┌─── 7:8 ───┐, when false: ┌─── 7 ───┐ + * defaults to true if the difference between num_notes and + * notes_occupied is greater than 1. + * + * y_offset: int, default 0 + * manually offset a tuplet, for instance to avoid collisions + * with articulations, etc... + * } + */ + + + + + + + +var TupletLocation; +(function (TupletLocation) { + TupletLocation[TupletLocation["BOTTOM"] = -1] = "BOTTOM"; + TupletLocation[TupletLocation["TOP"] = 1] = "TOP"; +})(TupletLocation || (TupletLocation = {})); +class Tuplet extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + constructor(notes, options = {}) { + super(); + this.numerator_glyphs = []; + this.denom_glyphs = []; + if (!notes || !notes.length) { + throw new _util__WEBPACK_IMPORTED_MODULE_6__.RuntimeError('BadArguments', 'No notes provided for tuplet.'); + } + this.options = options; + this.notes = notes; + this.num_notes = this.options.num_notes != undefined ? this.options.num_notes : notes.length; + // We accept beats_occupied, but warn that it's deprecated: + // the preferred property name is now notes_occupied. + if (this.options.beats_occupied) { + this.beatsOccupiedDeprecationWarning(); + } + this.notes_occupied = this.options.notes_occupied || this.options.beats_occupied || 2; + if (this.options.bracketed != undefined) { + this.bracketed = this.options.bracketed; + } + else { + this.bracketed = notes.some((note) => !note.hasBeam()); + } + this.ratioed = + this.options.ratioed != undefined ? this.options.ratioed : Math.abs(this.notes_occupied - this.num_notes) > 1; + this.point = _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.currentMusicFont().lookupMetric('digits.tupletPoint'); + this.y_pos = 16; + this.x_pos = 100; + this.width = 200; + this.setTupletLocation(this.options.location || Tuplet.LOCATION_TOP); + _formatter__WEBPACK_IMPORTED_MODULE_1__.Formatter.AlignRestsToNotes(notes, true, true); + this.resolveGlyphs(); + this.attach(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_5__.Category.Tuplet; + } + static get LOCATION_TOP() { + return TupletLocation.TOP; + } + static get LOCATION_BOTTOM() { + return TupletLocation.BOTTOM; + } + static get NESTING_OFFSET() { + return 15; + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + static get metrics() { + return _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.currentMusicFont().getMetrics().glyphs.tuplet; + } + attach() { + for (let i = 0; i < this.notes.length; i++) { + const note = this.notes[i]; + note.setTuplet(this); + } + } + detach() { + for (let i = 0; i < this.notes.length; i++) { + const note = this.notes[i]; + note.resetTuplet(this); + } + } + /** + * Set whether or not the bracket is drawn. + */ + setBracketed(bracketed) { + this.bracketed = !!bracketed; + return this; + } + /** + * Set whether or not the ratio is shown. + */ + setRatioed(ratioed) { + this.ratioed = !!ratioed; + return this; + } + /** + * Set the tuplet indicator to be displayed either on the top or bottom of the stave. + */ + setTupletLocation(location) { + if (location !== Tuplet.LOCATION_TOP && location !== Tuplet.LOCATION_BOTTOM) { + // eslint-disable-next-line + console.warn(`Invalid tuplet location [${location}]. Using Tuplet.LOCATION_TOP.`); + location = Tuplet.LOCATION_TOP; + } + this.location = location; + return this; + } + getNotes() { + return this.notes; + } + getNoteCount() { + return this.num_notes; + } + beatsOccupiedDeprecationWarning() { + // eslint-disable-next-line + console.warn('beats_occupied has been deprecated as an option for tuplets. Please use notes_occupied instead.', 'Calls to getBeatsOccupied / setBeatsOccupied should now be routed to getNotesOccupied / setNotesOccupied.', 'The old methods will be removed in VexFlow 5.0.'); + } + getBeatsOccupied() { + this.beatsOccupiedDeprecationWarning(); + return this.getNotesOccupied(); + } + setBeatsOccupied(beats) { + this.beatsOccupiedDeprecationWarning(); + return this.setNotesOccupied(beats); + } + getNotesOccupied() { + return this.notes_occupied; + } + setNotesOccupied(notes) { + this.detach(); + this.notes_occupied = notes; + this.resolveGlyphs(); + this.attach(); + } + resolveGlyphs() { + this.numerator_glyphs = []; + let n = this.num_notes; + while (n >= 1) { + this.numerator_glyphs.unshift(new _glyph__WEBPACK_IMPORTED_MODULE_2__.Glyph('timeSig' + (n % 10), this.point)); + n = parseInt((n / 10).toString(), 10); + } + this.denom_glyphs = []; + n = this.notes_occupied; + while (n >= 1) { + this.denom_glyphs.unshift(new _glyph__WEBPACK_IMPORTED_MODULE_2__.Glyph('timeSig' + (n % 10), this.point)); + n = parseInt((n / 10).toString(), 10); + } + } + // determine how many tuplets are nested within this tuplet + // on the same side (above/below), to calculate a y + // offset for this tuplet: + getNestedTupletCount() { + const location = this.location; + const first_note = this.notes[0]; + let maxTupletCount = countTuplets(first_note, location); + let minTupletCount = countTuplets(first_note, location); + // Count the tuplets that are on the same side (above/below) + // as this tuplet: + function countTuplets(note, location) { + return note.getTupletStack().filter((tuplet) => tuplet.location === location).length; + } + this.notes.forEach((note) => { + const tupletCount = countTuplets(note, location); + maxTupletCount = tupletCount > maxTupletCount ? tupletCount : maxTupletCount; + minTupletCount = tupletCount < minTupletCount ? tupletCount : minTupletCount; + }); + return maxTupletCount - minTupletCount; + } + // determine the y position of the tuplet: + getYPosition() { + // offset the tuplet for any nested tuplets between + // it and the notes: + const nested_tuplet_y_offset = this.getNestedTupletCount() * Tuplet.NESTING_OFFSET * -this.location; + // offset the tuplet for any manual y_offset: + const y_offset = this.options.y_offset || 0; + // now iterate through the notes and find our highest + // or lowest locations, to form a base y_pos + const first_note = this.notes[0]; + let y_pos; + if (this.location === Tuplet.LOCATION_TOP) { + y_pos = first_note.checkStave().getYForLine(0) - Tuplet.metrics.topModifierOffset; + // check modifiers above note to see if they will collide with tuplet beam + for (let i = 0; i < this.notes.length; ++i) { + const note = this.notes[i]; + let modLines = 0; + const mc = note.getModifierContext(); + if (mc) { + modLines = Math.max(modLines, mc.getState().top_text_line); + } + const modY = note.getYForTopText(modLines) - Tuplet.metrics.noteHeadOffset; + if (note.hasStem() || note.isRest()) { + const top_y = note.getStemDirection() === _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP + ? note.getStemExtents().topY - Tuplet.metrics.stemOffset + : note.getStemExtents().baseY - Tuplet.metrics.noteHeadOffset; + y_pos = Math.min(top_y, y_pos); + if (modLines > 0) { + y_pos = Math.min(modY, y_pos); + } + } + } + } + else { + let lineCheck = Tuplet.metrics.bottomLine; // tuplet default on line 4 + // check modifiers below note to see if they will collide with tuplet beam + this.notes.forEach((nn) => { + const mc = nn.getModifierContext(); + if (mc) { + lineCheck = Math.max(lineCheck, mc.getState().text_line + 1); + } + }); + y_pos = first_note.checkStave().getYForLine(lineCheck) + Tuplet.metrics.noteHeadOffset; + for (let i = 0; i < this.notes.length; ++i) { + if (this.notes[i].hasStem() || this.notes[i].isRest()) { + const bottom_y = this.notes[i].getStemDirection() === _stem__WEBPACK_IMPORTED_MODULE_3__.Stem.UP + ? this.notes[i].getStemExtents().baseY + Tuplet.metrics.noteHeadOffset + : this.notes[i].getStemExtents().topY + Tuplet.metrics.stemOffset; + if (bottom_y > y_pos) { + y_pos = bottom_y; + } + } + } + } + return y_pos + nested_tuplet_y_offset + y_offset; + } + draw() { + const ctx = this.checkContext(); + this.setRendered(); + // determine x value of left bound of tuplet + const first_note = this.notes[0]; + const last_note = this.notes[this.notes.length - 1]; + if (!this.bracketed) { + this.x_pos = first_note.getStemX(); + this.width = last_note.getStemX() - this.x_pos; + } + else { + this.x_pos = first_note.getTieLeftX() - 5; + this.width = last_note.getTieRightX() - this.x_pos + 5; + } + // determine y value for tuplet + this.y_pos = this.getYPosition(); + const addGlyphWidth = (width, glyph) => width + (0,_util__WEBPACK_IMPORTED_MODULE_6__.defined)(glyph.getMetrics().width); + // calculate total width of tuplet notation + let width = this.numerator_glyphs.reduce(addGlyphWidth, 0); + if (this.ratioed) { + width = this.denom_glyphs.reduce(addGlyphWidth, width); + width += this.point * 0.32; + } + const notation_center_x = this.x_pos + this.width / 2; + const notation_start_x = notation_center_x - width / 2; + // draw bracket if the tuplet is not beamed + if (this.bracketed) { + const line_width = this.width / 2 - width / 2 - 5; + // only draw the bracket if it has positive length + if (line_width > 0) { + ctx.fillRect(this.x_pos, this.y_pos, line_width, 1); + ctx.fillRect(this.x_pos + this.width / 2 + width / 2 + 5, this.y_pos, line_width, 1); + ctx.fillRect(this.x_pos, this.y_pos + (this.location === Tuplet.LOCATION_BOTTOM ? 1 : 0), 1, this.location * 10); + ctx.fillRect(this.x_pos + this.width, this.y_pos + (this.location === Tuplet.LOCATION_BOTTOM ? 1 : 0), 1, this.location * 10); + } + } + // draw numerator glyphs + const shiftY = _tables__WEBPACK_IMPORTED_MODULE_4__.Tables.currentMusicFont().lookupMetric('digits.shiftY', 0); + let x_offset = 0; + this.numerator_glyphs.forEach((glyph) => { + glyph.render(ctx, notation_start_x + x_offset, this.y_pos + this.point / 3 - 2 + shiftY); + x_offset += (0,_util__WEBPACK_IMPORTED_MODULE_6__.defined)(glyph.getMetrics().width); + }); + // display colon and denominator if the ratio is to be shown + if (this.ratioed) { + const colon_x = notation_start_x + x_offset + this.point * 0.16; + const colon_radius = this.point * 0.06; + ctx.beginPath(); + ctx.arc(colon_x, this.y_pos - this.point * 0.08, colon_radius, 0, Math.PI * 2, true); + ctx.closePath(); + ctx.fill(); + ctx.beginPath(); + ctx.arc(colon_x, this.y_pos + this.point * 0.12, colon_radius, 0, Math.PI * 2, true); + ctx.closePath(); + ctx.fill(); + x_offset += this.point * 0.32; + this.denom_glyphs.forEach((glyph) => { + glyph.render(ctx, notation_start_x + x_offset, this.y_pos + this.point / 3 - 2 + shiftY); + x_offset += (0,_util__WEBPACK_IMPORTED_MODULE_6__.defined)(glyph.getMetrics().width); + }); + } + } +} + + +/***/ }), + +/***/ "./src/typeguard.ts": +/*!**************************!*\ + !*** ./src/typeguard.ts ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "isCategory": () => (/* binding */ isCategory), +/* harmony export */ "isAccidental": () => (/* binding */ isAccidental), +/* harmony export */ "isAnnotation": () => (/* binding */ isAnnotation), +/* harmony export */ "isBarline": () => (/* binding */ isBarline), +/* harmony export */ "isDot": () => (/* binding */ isDot), +/* harmony export */ "isGraceNote": () => (/* binding */ isGraceNote), +/* harmony export */ "isGraceNoteGroup": () => (/* binding */ isGraceNoteGroup), +/* harmony export */ "isNote": () => (/* binding */ isNote), +/* harmony export */ "isRenderContext": () => (/* binding */ isRenderContext), +/* harmony export */ "isStaveNote": () => (/* binding */ isStaveNote), +/* harmony export */ "isStemmableNote": () => (/* binding */ isStemmableNote), +/* harmony export */ "isTabNote": () => (/* binding */ isTabNote), +/* harmony export */ "Category": () => (/* binding */ Category) +/* harmony export */ }); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author: Ron B. Yeh +// MIT License +/* eslint-disable @typescript-eslint/no-explicit-any */ +/** + * Use instead of `instanceof` as a more flexible type guard. + * @param obj check if this object's CATEGORY matches the provided category. + * @param category a string representing a category of VexFlow objects. + * @param checkAncestors defaults to `true`, so we walk up the prototype chain to look for a matching `CATEGORY`. + * If `false`, we do not check the superclass or other ancestors. + * @returns true if `obj` has a static `CATEGORY` property that matches `category`. + */ +function isCategory(obj, category, checkAncestors = true) { + // obj is undefined, a number, a primitive string, or null. + if (typeof obj !== 'object' || obj === null) { + return false; + } + // `obj.constructor` is a reference to the constructor function that created the `obj` instance. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor + let constructorFcn = obj.constructor; + // Check if the object's static .CATEGORY matches the provided category. + if (checkAncestors) { + // Walk up the prototype chain to look for a matching obj.constructor.CATEGORY. + while (obj !== null) { + constructorFcn = obj.constructor; + if ('CATEGORY' in constructorFcn && constructorFcn.CATEGORY === category) { + return true; + } + obj = Object.getPrototypeOf(obj); + } + return false; + } + else { + // Do not walk up the prototype chain. Just check this particular object's static .CATEGORY string. + return 'CATEGORY' in constructorFcn && constructorFcn.CATEGORY === category; + } +} +const isAccidental = (obj) => isCategory(obj, Category.Accidental); +const isAnnotation = (obj) => isCategory(obj, Category.Annotation); +const isBarline = (obj) => isCategory(obj, Category.Barline); +const isDot = (obj) => isCategory(obj, Category.Dot); +const isGraceNote = (obj) => isCategory(obj, Category.GraceNote); +const isGraceNoteGroup = (obj) => isCategory(obj, Category.GraceNoteGroup); +const isNote = (obj) => isCategory(obj, Category.Note); +const isRenderContext = (obj) => isCategory(obj, Category.RenderContext); +const isStaveNote = (obj) => isCategory(obj, Category.StaveNote); +const isStemmableNote = (obj) => isCategory(obj, Category.StemmableNote); +const isTabNote = (obj) => isCategory(obj, Category.TabNote); +// 'const' enums are erased by the TypeScript compiler. The string values are inlined at all the use sites. +// See: https://www.typescriptlang.org/docs/handbook/enums.html#const-enums +var Category; +(function (Category) { + Category["Accidental"] = "Accidental"; + Category["Annotation"] = "Annotation"; + Category["Articulation"] = "Articulation"; + Category["Barline"] = "Barline"; + Category["BarNote"] = "BarNote"; + Category["Beam"] = "Beam"; + Category["Bend"] = "Bend"; + Category["ChordSymbol"] = "ChordSymbol"; + Category["Clef"] = "Clef"; + Category["ClefNote"] = "ClefNote"; + Category["Crescendo"] = "Crescendo"; + Category["Curve"] = "Curve"; + Category["Dot"] = "Dot"; + Category["Element"] = "Element"; + Category["Fraction"] = "Fraction"; + Category["FretHandFinger"] = "FretHandFinger"; + Category["GhostNote"] = "GhostNote"; + Category["Glyph"] = "Glyph"; + Category["GlyphNote"] = "GlyphNote"; + Category["GraceNote"] = "GraceNote"; + Category["GraceNoteGroup"] = "GraceNoteGroup"; + Category["GraceTabNote"] = "GraceTabNote"; + Category["KeySignature"] = "KeySignature"; + Category["KeySigNote"] = "KeySigNote"; + Category["Modifier"] = "Modifier"; + Category["MultiMeasureRest"] = "MultiMeasureRest"; + Category["Note"] = "Note"; + Category["NoteHead"] = "NoteHead"; + Category["NoteSubGroup"] = "NoteSubGroup"; + Category["Ornament"] = "Ornament"; + Category["Parenthesis"] = "Parenthesis"; + Category["PedalMarking"] = "PedalMarking"; + Category["RenderContext"] = "RenderContext"; + Category["RepeatNote"] = "RepeatNote"; + Category["Repetition"] = "Repetition"; + Category["Stave"] = "Stave"; + Category["StaveConnector"] = "StaveConnector"; + Category["StaveHairpin"] = "StaveHairpin"; + Category["StaveLine"] = "StaveLine"; + Category["StaveModifier"] = "StaveModifier"; + Category["StaveNote"] = "StaveNote"; + Category["StaveSection"] = "StaveSection"; + Category["StaveTempo"] = "StaveTempo"; + Category["StaveText"] = "StaveText"; + Category["StaveTie"] = "StaveTie"; + Category["Stem"] = "Stem"; + Category["StemmableNote"] = "StemmableNote"; + Category["StringNumber"] = "StringNumber"; + Category["Stroke"] = "Stroke"; + Category["System"] = "System"; + Category["TabNote"] = "TabNote"; + Category["TabSlide"] = "TabSlide"; + Category["TabStave"] = "TabStave"; + Category["TabTie"] = "TabTie"; + Category["TextBracket"] = "TextBracket"; + Category["TextDynamics"] = "TextDynamics"; + Category["TextNote"] = "TextNote"; + Category["Tickable"] = "Tickable"; + Category["TimeSignature"] = "TimeSignature"; + Category["TimeSigNote"] = "TimeSigNote"; + Category["Tremolo"] = "Tremolo"; + Category["Tuplet"] = "Tuplet"; + Category["Vibrato"] = "Vibrato"; + Category["VibratoBracket"] = "VibratoBracket"; + Category["Voice"] = "Voice"; + Category["Volta"] = "Volta"; +})(Category || (Category = {})); + + +/***/ }), + +/***/ "./src/util.ts": +/*!*********************!*\ + !*** ./src/util.ts ***! + \*********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "RuntimeError": () => (/* binding */ RuntimeError), +/* harmony export */ "globalObject": () => (/* binding */ globalObject), +/* harmony export */ "defined": () => (/* binding */ defined), +/* harmony export */ "log": () => (/* binding */ log), +/* harmony export */ "warn": () => (/* binding */ warn), +/* harmony export */ "midLine": () => (/* binding */ midLine), +/* harmony export */ "prefix": () => (/* binding */ prefix), +/* harmony export */ "normalizeAngle": () => (/* binding */ normalizeAngle) +/* harmony export */ }); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// Note: Keep this module free of imports to reduce the chance of circular dependencies. +/** `RuntimeError` will be thrown by VexFlow classes in case of error. */ +class RuntimeError extends Error { + constructor(code, message = '') { + super('[RuntimeError] ' + code + ': ' + message); + this.code = code; + } +} +/** VexFlow can be used outside of the browser (e.g., Node) where `window` may not be defined. */ +// eslint-disable-next-line +function globalObject() { + if (typeof globalThis !== 'undefined') { + return globalThis; + } + if (typeof self !== 'undefined') { + return self; + } + if (typeof window !== 'undefined') { + return window; + } + if (typeof __webpack_require__.g !== 'undefined') { + return __webpack_require__.g; + } + return Function('return this')(); +} +/** + * Check that `x` is of type `T` and not `undefined`. + * If `x` is `undefined`, throw a RuntimeError with the optionally provided error code and message. + */ +function defined(x, code = 'undefined', message = '') { + if (x === undefined) { + throw new RuntimeError(code, message); + } + return x; +} +/** Default log function sends all arguments to console. */ +// eslint-disable-next-line +function log(block, ...args) { + if (!args) + return; + const line = Array.prototype.slice.call(args).join(' '); + globalObject().console.log(block + ': ' + line); +} +/** Dump warning to console. */ +// eslint-disable-next-line +function warn(...args) { + const line = args.join(' '); + const err = new Error(); + globalObject().console.log('Warning: ', line, err.stack); +} +/** Round number to nearest fractional value (`.5`, `.25`, etc.) */ +function roundN(x, n) { + return x % n >= n / 2 ? parseInt(`${x / n}`, 10) * n + n : parseInt(`${x / n}`, 10) * n; +} +/** Locate the mid point between stave lines. Returns a fractional line if a space. */ +function midLine(a, b) { + let mid_line = b + (a - b) / 2; + if (mid_line % 2 > 0) { + mid_line = roundN(mid_line * 10, 5) / 10; + } + return mid_line; +} +/** + * Used by various classes (e.g., SVGContext) to provide a + * unique prefix to element names (or other keys in shared namespaces). + */ +function prefix(text) { + return `vf-${text}`; +} +/** + * Convert an arbitrary angle in radians to the equivalent one in the range [0, pi). + */ +function normalizeAngle(a) { + a = a % (2 * Math.PI); + if (a < 0) { + a += 2 * Math.PI; + } + return a; +} + + +/***/ }), + +/***/ "./src/vex.ts": +/*!********************!*\ + !*** ./src/vex.ts ***! + \********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Vex": () => (/* binding */ Vex) +/* harmony export */ }); +/* harmony import */ var _flow__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./flow */ "./src/flow.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// +// Utility methods used by the rest of the VexFlow codebase. + + +class Vex { + // Users of `Vex.forEach(a, fn)` should use `Array.prototype.forEach()` instead. + // static forEach(arr: T[], callbackFn: (value: T, index: number, array: T[]) => void) { + // arr.forEach(callbackFn); + // } + /** + * Take `arr` and return a new list consisting of the sorted, unique, + * contents of arr. Does not modify `arr`. + */ + // eslint-disable-next-line + static sortAndUnique(arr, cmp, eq) { + if (arr.length > 1) { + const newArr = []; + let last; + arr.sort(cmp); + for (let i = 0; i < arr.length; ++i) { + if (i === 0 || !eq(arr[i], last)) { + newArr.push(arr[i]); + } + last = arr[i]; + } + return newArr; + } + else { + return arr; + } + } + /** Check if array `arr` contains `obj`. */ + // eslint-disable-next-line + static contains(arr, obj) { + let i = arr.length; + while (i--) { + if (arr[i] === obj) { + return true; + } + } + return false; + } + // Get the 2D Canvas context from DOM element `canvas_sel`. + static getCanvasContext(canvasSelector) { + if (!canvasSelector) { + throw new _util__WEBPACK_IMPORTED_MODULE_1__.RuntimeError('BadArgument', 'Invalid canvas selector: ' + canvasSelector); + } + const canvas = document.getElementById(canvasSelector); + if (!(canvas && canvas.getContext)) { + throw new _util__WEBPACK_IMPORTED_MODULE_1__.RuntimeError('UnsupportedBrowserError', 'This browser does not support HTML5 Canvas'); + } + return canvas.getContext('2d'); + } + /** Benchmark. Run function `f` once and report time elapsed shifted by `s` milliseconds. */ + // eslint-disable-next-line + static benchmark(s, f) { + const start_time = new Date().getTime(); + f(); + const elapsed = new Date().getTime() - start_time; + (0,_util__WEBPACK_IMPORTED_MODULE_1__.log)(s, elapsed + 'ms'); + } + // Get stack trace. + static stackTrace() { + const err = new Error(); + return err.stack; + } +} +Vex.Flow = _flow__WEBPACK_IMPORTED_MODULE_0__.Flow; + + +/***/ }), + +/***/ "./src/vibrato.ts": +/*!************************!*\ + !*** ./src/vibrato.ts ***! + \************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Vibrato": () => (/* binding */ Vibrato) +/* harmony export */ }); +/* harmony import */ var _bend__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./bend */ "./src/bend.ts"); +/* harmony import */ var _modifier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifier */ "./src/modifier.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + +/** `Vibrato` implements diverse vibratos. */ +class Vibrato extends _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier { + constructor() { + super(); + this.position = _modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.RIGHT; + this.render_options = { + harsh: false, + vibrato_width: 20, + wave_height: 6, + wave_width: 4, + wave_girth: 2, + }; + this.setVibratoWidth(this.render_options.vibrato_width); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.Vibrato; + } + /** Arrange vibratos inside a `ModifierContext`. */ + static format(vibratos, state, context) { + if (!vibratos || vibratos.length === 0) + return false; + // Vibratos are always on top. + let text_line = state.top_text_line; + let width = 0; + let shift = state.right_shift - 7; + // If there's a bend, drop the text line + const bends = context.getMembers(_bend__WEBPACK_IMPORTED_MODULE_0__.Bend.CATEGORY); + if (bends && bends.length > 0) { + const bendHeight = bends.map((bb) => bb.getTextHeight()).reduce((a, b) => (a > b ? a : b)) / _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.STAVE_LINE_DISTANCE; + text_line = text_line - (bendHeight + 1); + } + else { + state.top_text_line += 1; + } + // Format Vibratos + for (let i = 0; i < vibratos.length; ++i) { + const vibrato = vibratos[i]; + vibrato.setXShift(shift); + vibrato.setTextLine(text_line); + width += vibrato.getWidth(); + shift += width; + } + state.right_shift += width; + return true; + } + /** Set harsh vibrato. */ + setHarsh(harsh) { + this.render_options.harsh = harsh; + return this; + } + /** Set vibrato width in pixels. */ + setVibratoWidth(width) { + this.render_options.vibrato_width = width; + this.setWidth(width); + return this; + } + /** Draw the vibrato on the rendering context. */ + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const start = note.getModifierStartXY(_modifier__WEBPACK_IMPORTED_MODULE_1__.Modifier.Position.RIGHT, this.index); + const vx = start.x + this.x_shift; + const vy = note.getYForTopText(this.text_line) + 2; + Vibrato.renderVibrato(ctx, vx, vy, this.render_options); + } + /** + * Static rendering method that can be called from + * other classes (e.g. VibratoBracket). + */ + static renderVibrato(ctx, x, y, opts) { + const { harsh, vibrato_width, wave_width, wave_girth, wave_height } = opts; + const num_waves = vibrato_width / wave_width; + ctx.beginPath(); + let i; + if (harsh) { + ctx.moveTo(x, y + wave_girth + 1); + for (i = 0; i < num_waves / 2; ++i) { + ctx.lineTo(x + wave_width, y - wave_height / 2); + x += wave_width; + ctx.lineTo(x + wave_width, y + wave_height / 2); + x += wave_width; + } + for (i = 0; i < num_waves / 2; ++i) { + ctx.lineTo(x - wave_width, y - wave_height / 2 + wave_girth + 1); + x -= wave_width; + ctx.lineTo(x - wave_width, y + wave_height / 2 + wave_girth + 1); + x -= wave_width; + } + ctx.fill(); + } + else { + ctx.moveTo(x, y + wave_girth); + for (i = 0; i < num_waves / 2; ++i) { + ctx.quadraticCurveTo(x + wave_width / 2, y - wave_height / 2, x + wave_width, y); + x += wave_width; + ctx.quadraticCurveTo(x + wave_width / 2, y + wave_height / 2, x + wave_width, y); + x += wave_width; + } + for (i = 0; i < num_waves / 2; ++i) { + ctx.quadraticCurveTo(x - wave_width / 2, y + wave_height / 2 + wave_girth, x - wave_width, y + wave_girth); + x -= wave_width; + ctx.quadraticCurveTo(x - wave_width / 2, y - wave_height / 2 + wave_girth, x - wave_width, y + wave_girth); + x -= wave_width; + } + ctx.fill(); + } + } +} + + +/***/ }), + +/***/ "./src/vibratobracket.ts": +/*!*******************************!*\ + !*** ./src/vibratobracket.ts ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "VibratoBracket": () => (/* binding */ VibratoBracket) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +/* harmony import */ var _vibrato__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./vibrato */ "./src/vibrato.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author: Balazs Forian-Szabo +// MIT License + + + + +// eslint-disable-next-line +function L(...args) { + if (VibratoBracket.DEBUG) + (0,_util__WEBPACK_IMPORTED_MODULE_2__.log)('Vex.Flow.VibratoBracket', args); +} +/** `VibratoBracket` renders vibrato effect between two notes. */ +class VibratoBracket extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + /** + * Either the stop or start note must be set, or both of them. + * An undefined value for the start or stop note indicates that the vibrato + * is drawn from the beginning or until the end of the stave accordingly. + */ + constructor(bracket_data) { + super(); + if (bracket_data.start) + this.start = bracket_data.start; + if (bracket_data.stop) + this.stop = bracket_data.stop; + this.line = 1; + this.render_options = { + harsh: false, + wave_height: 6, + wave_width: 4, + wave_girth: 2, + vibrato_width: 0, + }; + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_1__.Category.VibratoBracket; + } + /** Set line position of the vibrato bracket. */ + setLine(line) { + this.line = line; + return this; + } + /** Set harsh vibrato bracket. */ + setHarsh(harsh) { + this.render_options.harsh = harsh; + return this; + } + /** Draw the vibrato bracket on the rendering context. */ + draw() { + const ctx = this.checkContext(); + this.setRendered(); + const y = (this.start && this.start.checkStave().getYForTopText(this.line)) || + (this.stop && this.stop.checkStave().getYForTopText(this.line)) || + 0; + // If start note is not set then vibrato will be drawn + // from the beginning of the stave + const start_x = (this.start && this.start.getAbsoluteX()) || (this.stop && this.stop.checkStave().getTieStartX()) || 0; + // If stop note is not set then vibrato will be drawn + // until the end of the stave + const stop_x = (this.stop && this.stop.getAbsoluteX() - this.stop.getWidth() - 5) || + (this.start && this.start.checkStave().getTieEndX() - 10) || + 0; + this.render_options.vibrato_width = stop_x - start_x; + L('Rendering VibratoBracket: start_x:', start_x, 'stop_x:', stop_x, 'y:', y); + _vibrato__WEBPACK_IMPORTED_MODULE_3__.Vibrato.renderVibrato(ctx, start_x, y, this.render_options); + } +} +/** To enable logging for this class. Set `Vex.Flow.VibratoBracket.DEBUG` to `true`. */ +VibratoBracket.DEBUG = false; + + +/***/ }), + +/***/ "./src/voice.ts": +/*!**********************!*\ + !*** ./src/voice.ts ***! + \**********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "VoiceMode": () => (/* binding */ VoiceMode), +/* harmony export */ "Voice": () => (/* binding */ Voice) +/* harmony export */ }); +/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ "./src/element.ts"); +/* harmony import */ var _fraction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./fraction */ "./src/fraction.ts"); +/* harmony import */ var _tables__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tables */ "./src/tables.ts"); +/* harmony import */ var _typeguard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeguard */ "./src/typeguard.ts"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License + + + + + +var VoiceMode; +(function (VoiceMode) { + VoiceMode[VoiceMode["STRICT"] = 1] = "STRICT"; + VoiceMode[VoiceMode["SOFT"] = 2] = "SOFT"; + VoiceMode[VoiceMode["FULL"] = 3] = "FULL"; +})(VoiceMode || (VoiceMode = {})); +/** + * `Voice` is mainly a container object to group `Tickables` for formatting. + */ +class Voice extends _element__WEBPACK_IMPORTED_MODULE_0__.Element { + constructor(time, options) { + super(); + this.resolutionMultiplier = 1; + this.mode = VoiceMode.STRICT; + this.preFormatted = false; + this.ticksUsed = new _fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(0, 1); + this.largestTickWidth = 0; + this.tickables = []; + this.options = Object.assign({ softmaxFactor: 100 }, options); + // Convert the `time` string into a VoiceTime object if necessary. + let voiceTime; + if (typeof time === 'string') { + // Time signature shortcut: "4/4", "3/8", etc. + const match = time.match(/(\d+)\/(\d+)/); + if (match) { + voiceTime = { + num_beats: parseInt(match[1]), + beat_value: parseInt(match[2]), + }; + } + } + else { + voiceTime = time; + } + // Default time signature is 4/4. + this.time = Object.assign({ num_beats: 4, beat_value: 4, resolution: _tables__WEBPACK_IMPORTED_MODULE_2__.Tables.RESOLUTION }, voiceTime); + // Recalculate total ticks. + this.totalTicks = new _fraction__WEBPACK_IMPORTED_MODULE_1__.Fraction(this.time.num_beats * (this.time.resolution / this.time.beat_value), 1); + this.smallestTickCount = this.totalTicks.clone(); + } + static get CATEGORY() { + return _typeguard__WEBPACK_IMPORTED_MODULE_3__.Category.Voice; + } + /** + * Modes allow the addition of ticks in three different ways: + * - STRICT: This is the default. Ticks must fill the voice. + * - SOFT: Ticks can be added without restrictions. + * - FULL: Ticks do not need to fill the voice, but can't exceed the maximum tick length. + */ + static get Mode() { + return VoiceMode; + } + /** Get the total ticks in the voice. */ + getTotalTicks() { + return this.totalTicks; + } + /** Get the total ticks used in the voice by all the tickables. */ + getTicksUsed() { + return this.ticksUsed; + } + /** Get the largest width of all the tickables. */ + getLargestTickWidth() { + return this.largestTickWidth; + } + /** Get the tick count for the shortest tickable */ + getSmallestTickCount() { + return this.smallestTickCount; + } + /** Get the tickables in the voice. */ + getTickables() { + return this.tickables; + } + /** Get the voice mode. */ + getMode() { + return this.mode; + } + /** + * Set the voice mode. + * @param mode value from `VoiceMode` + */ + setMode(mode) { + this.mode = mode; + return this; + } + /** Get the resolution multiplier for the voice. */ + getResolutionMultiplier() { + return this.resolutionMultiplier; + } + /** Get the actual tick resolution for the voice. */ + getActualResolution() { + return this.resolutionMultiplier * this.time.resolution; + } + /** Set the voice's stave. */ + setStave(stave) { + this.stave = stave; + // Reset the bounding box so we can reformat. + this.boundingBox = undefined; + return this; + } + getStave() { + return this.stave; + } + /** Get the bounding box for the voice. */ + getBoundingBox() { + if (!this.boundingBox) { + const stave = this.checkStave(); + let boundingBox = undefined; + for (let i = 0; i < this.tickables.length; ++i) { + const tickable = this.tickables[i]; + tickable.setStave(stave); + const bb = tickable.getBoundingBox(); + if (bb) { + boundingBox = boundingBox ? boundingBox.mergeWith(bb) : bb; + } + } + this.boundingBox = boundingBox; + } + return this.boundingBox; + } + /** Set the voice mode to strict or soft. */ + setStrict(strict) { + this.mode = strict ? VoiceMode.STRICT : VoiceMode.SOFT; + return this; + } + /** Determine if the voice is complete according to the voice mode. */ + isComplete() { + if (this.mode === VoiceMode.STRICT || this.mode === VoiceMode.FULL) { + return this.ticksUsed.equals(this.totalTicks); + } + else { + return true; + } + } + /** + * We use softmax to layout the tickables proportional to the exponent of + * their duration. The softmax factor is used to determine the 'linearness' of + * the layout. + * + * The softmax of all the tickables in this voice should sum to 1. + */ + setSoftmaxFactor(factor) { + this.options.softmaxFactor = factor; + return this; + } + /** + * Calculate the sum of the exponents of all the ticks in this voice to use + * as the denominator of softmax. + */ + reCalculateExpTicksUsed() { + const totalTicks = this.ticksUsed.value(); + const exp = (tickable) => Math.pow(this.options.softmaxFactor, tickable.getTicks().value() / totalTicks); + this.expTicksUsed = this.tickables.map(exp).reduce((a, b) => a + b, 0); + return this.expTicksUsed; + } + /** Get the softmax-scaled value of a tick duration. 'tickValue' is a number. */ + softmax(tickValue) { + if (!this.expTicksUsed) { + this.expTicksUsed = this.reCalculateExpTicksUsed(); + } + const totalTicks = this.ticksUsed.value(); + const exp = (v) => Math.pow(this.options.softmaxFactor, v / totalTicks); + const sm = exp(tickValue) / this.expTicksUsed; + return sm; + } + /** Add a tickable to the voice. */ + addTickable(tickable) { + if (!tickable.shouldIgnoreTicks()) { + const ticks = tickable.getTicks(); + // Update the total ticks for this line. + this.ticksUsed.add(ticks); + this.expTicksUsed = 0; // reset + if ((this.mode === VoiceMode.STRICT || this.mode === VoiceMode.FULL) && + this.ticksUsed.greaterThan(this.totalTicks)) { + this.ticksUsed.subtract(ticks); + throw new _util__WEBPACK_IMPORTED_MODULE_4__.RuntimeError('BadArgument', 'Too many ticks.'); + } + // Track the smallest tickable for formatting. + if (ticks.lessThan(this.smallestTickCount)) { + this.smallestTickCount = ticks.clone(); + } + this.resolutionMultiplier = this.ticksUsed.denominator; + // Expand total ticks using denominator from ticks used. + this.totalTicks.add(0, this.ticksUsed.denominator); + } + // Add the tickable to the line. + this.tickables.push(tickable); + tickable.setVoice(this); + return this; + } + /** Add an array of tickables to the voice. */ + addTickables(tickables) { + for (let i = 0; i < tickables.length; ++i) { + this.addTickable(tickables[i]); + } + return this; + } + /** Preformat the voice by applying the voice's stave to each note. */ + preFormat() { + if (this.preFormatted) + return this; + const stave = this.checkStave(); + this.tickables.forEach((tickable) => { + if (!tickable.getStave()) { + tickable.setStave(stave); + } + }); + this.preFormatted = true; + return this; + } + checkStave() { + return (0,_util__WEBPACK_IMPORTED_MODULE_4__.defined)(this.stave, 'NoStave', 'No stave attached to instance.'); + } + /** + * Render the voice onto the canvas `context` and an optional `stave`. + * If `stave` is omitted, it is expected that the notes have staves + * already set. + * + * This method also calculates the voice's boundingBox while drawing + * the notes. Note the similarities with this.getBoundingBox(). + */ + draw(context = this.checkContext(), stave) { + stave = stave !== null && stave !== void 0 ? stave : this.stave; + this.setRendered(); + let boundingBox = undefined; + for (let i = 0; i < this.tickables.length; ++i) { + const tickable = this.tickables[i]; + // Set the stave if provided. + if (stave) { + tickable.setStave(stave); + } + (0,_util__WEBPACK_IMPORTED_MODULE_4__.defined)(tickable.getStave(), 'MissingStave', 'The voice cannot draw tickables without staves.'); + const bb = tickable.getBoundingBox(); + if (bb) { + boundingBox = boundingBox ? boundingBox.mergeWith(bb) : bb; + } + tickable.setContext(context); + tickable.drawWithStyle(); + } + this.boundingBox = boundingBox; + } +} + + +/***/ }), + +/***/ "./src/web.ts": +/*!********************!*\ + !*** ./src/web.ts ***! + \********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "isHTMLCanvas": () => (/* binding */ isHTMLCanvas), +/* harmony export */ "isHTMLDiv": () => (/* binding */ isHTMLDiv) +/* harmony export */ }); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ "./src/util.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// Author: Ron B. Yeh +// MIT License +// +// Utilities for working with Web APIs. +// See: https://developer.mozilla.org/en-US/docs/Web/API + +// eslint-disable-next-line +function isHTMLCanvas(element) { + if (!element) + return false; + const global = (0,_util__WEBPACK_IMPORTED_MODULE_0__.globalObject)(); + return ( + // It's either an instance of the HTMLCanvasElement class, + (typeof global.HTMLCanvasElement === 'function' && element instanceof global.HTMLCanvasElement) || + // OR it's pretending to be a element. Good enough! + // Do not rely on .tagName, because node-canvas doesn't provide a tagName. + (typeof element.getContext === 'function' && typeof element.toDataURL === 'function')); +} +// eslint-disable-next-line +function isHTMLDiv(element) { + if (!element) + return false; + const global = (0,_util__WEBPACK_IMPORTED_MODULE_0__.globalObject)(); + return ( + // It's either an instance of the HTMLDivElement class. + (typeof global.HTMLDivElement === 'function' && element instanceof global.HTMLDivElement) || + // OR it's pretending to be a
. See: svgcontext.ts. + (typeof element.appendChild === 'function' && typeof element.style === 'object')); +} + + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/global */ +/******/ (() => { +/******/ __webpack_require__.g = (function() { +/******/ if (typeof globalThis === 'object') return globalThis; +/******/ try { +/******/ return this || new Function('return this')(); +/******/ } catch (e) { +/******/ if (typeof window === 'object') return window; +/******/ } +/******/ })(); +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. +(() => { +/*!********************************!*\ + !*** ./entry/vexflow-debug.ts ***! + \********************************/ +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Accidental": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Accidental), +/* harmony export */ "Annotation": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Annotation), +/* harmony export */ "AnnotationHorizontalJustify": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.AnnotationHorizontalJustify), +/* harmony export */ "AnnotationVerticalJustify": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.AnnotationVerticalJustify), +/* harmony export */ "Articulation": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Articulation), +/* harmony export */ "BarNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.BarNote), +/* harmony export */ "Barline": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Barline), +/* harmony export */ "BarlineType": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.BarlineType), +/* harmony export */ "Beam": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Beam), +/* harmony export */ "Bend": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Bend), +/* harmony export */ "BoundingBox": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.BoundingBox), +/* harmony export */ "BoundingBoxComputation": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.BoundingBoxComputation), +/* harmony export */ "Builder": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Builder), +/* harmony export */ "CanvasContext": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.CanvasContext), +/* harmony export */ "Category": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Category), +/* harmony export */ "ChordSymbol": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.ChordSymbol), +/* harmony export */ "ChordSymbolHorizontalJustify": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.ChordSymbolHorizontalJustify), +/* harmony export */ "ChordSymbolVerticalJustify": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.ChordSymbolVerticalJustify), +/* harmony export */ "Clef": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Clef), +/* harmony export */ "ClefNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.ClefNote), +/* harmony export */ "Crescendo": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Crescendo), +/* harmony export */ "Curve": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Curve), +/* harmony export */ "CurvePosition": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.CurvePosition), +/* harmony export */ "Dot": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Dot), +/* harmony export */ "EasyScore": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.EasyScore), +/* harmony export */ "EasyScoreGrammar": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.EasyScoreGrammar), +/* harmony export */ "Element": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Element), +/* harmony export */ "Factory": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Factory), +/* harmony export */ "Flow": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Flow), +/* harmony export */ "Font": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Font), +/* harmony export */ "FontStyle": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.FontStyle), +/* harmony export */ "FontWeight": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.FontWeight), +/* harmony export */ "Formatter": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Formatter), +/* harmony export */ "Fraction": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Fraction), +/* harmony export */ "FretHandFinger": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.FretHandFinger), +/* harmony export */ "GhostNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.GhostNote), +/* harmony export */ "Glyph": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Glyph), +/* harmony export */ "GlyphNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.GlyphNote), +/* harmony export */ "GraceNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.GraceNote), +/* harmony export */ "GraceNoteGroup": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.GraceNoteGroup), +/* harmony export */ "GraceTabNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.GraceTabNote), +/* harmony export */ "Justification": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Justification), +/* harmony export */ "KeyManager": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.KeyManager), +/* harmony export */ "KeySigNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.KeySigNote), +/* harmony export */ "KeySignature": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.KeySignature), +/* harmony export */ "Modifier": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Modifier), +/* harmony export */ "ModifierContext": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.ModifierContext), +/* harmony export */ "ModifierPosition": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.ModifierPosition), +/* harmony export */ "MultiMeasureRest": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.MultiMeasureRest), +/* harmony export */ "Music": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Music), +/* harmony export */ "Note": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Note), +/* harmony export */ "NoteHead": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.NoteHead), +/* harmony export */ "NoteSubGroup": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.NoteSubGroup), +/* harmony export */ "Ornament": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Ornament), +/* harmony export */ "OutlineCode": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.OutlineCode), +/* harmony export */ "Parenthesis": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Parenthesis), +/* harmony export */ "Parser": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Parser), +/* harmony export */ "PedalMarking": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.PedalMarking), +/* harmony export */ "Piece": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Piece), +/* harmony export */ "Registry": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Registry), +/* harmony export */ "RenderContext": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.RenderContext), +/* harmony export */ "Renderer": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Renderer), +/* harmony export */ "RendererBackends": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.RendererBackends), +/* harmony export */ "RendererLineEndType": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.RendererLineEndType), +/* harmony export */ "RepeatNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.RepeatNote), +/* harmony export */ "Repetition": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Repetition), +/* harmony export */ "RuntimeError": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.RuntimeError), +/* harmony export */ "SVGContext": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.SVGContext), +/* harmony export */ "Stave": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Stave), +/* harmony export */ "StaveConnector": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.StaveConnector), +/* harmony export */ "StaveHairpin": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.StaveHairpin), +/* harmony export */ "StaveLine": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.StaveLine), +/* harmony export */ "StaveModifier": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.StaveModifier), +/* harmony export */ "StaveModifierPosition": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.StaveModifierPosition), +/* harmony export */ "StaveNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.StaveNote), +/* harmony export */ "StaveSection": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.StaveSection), +/* harmony export */ "StaveTempo": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.StaveTempo), +/* harmony export */ "StaveText": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.StaveText), +/* harmony export */ "StaveTie": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.StaveTie), +/* harmony export */ "Stem": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Stem), +/* harmony export */ "StemmableNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.StemmableNote), +/* harmony export */ "StringNumber": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.StringNumber), +/* harmony export */ "Stroke": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Stroke), +/* harmony export */ "SymbolModifiers": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.SymbolModifiers), +/* harmony export */ "SymbolTypes": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.SymbolTypes), +/* harmony export */ "System": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.System), +/* harmony export */ "TabNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.TabNote), +/* harmony export */ "TabSlide": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.TabSlide), +/* harmony export */ "TabStave": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.TabStave), +/* harmony export */ "TabTie": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.TabTie), +/* harmony export */ "TextBracket": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.TextBracket), +/* harmony export */ "TextBracketPosition": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.TextBracketPosition), +/* harmony export */ "TextDynamics": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.TextDynamics), +/* harmony export */ "TextFormatter": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.TextFormatter), +/* harmony export */ "TextNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.TextNote), +/* harmony export */ "TickContext": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.TickContext), +/* harmony export */ "Tickable": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Tickable), +/* harmony export */ "TimeSigNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.TimeSigNote), +/* harmony export */ "TimeSignature": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.TimeSignature), +/* harmony export */ "TimeSignatureGlyph": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.TimeSignatureGlyph), +/* harmony export */ "Tremolo": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Tremolo), +/* harmony export */ "Tuning": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Tuning), +/* harmony export */ "Tuplet": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Tuplet), +/* harmony export */ "TupletLocation": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.TupletLocation), +/* harmony export */ "Vex": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Vex), +/* harmony export */ "Vibrato": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Vibrato), +/* harmony export */ "VibratoBracket": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.VibratoBracket), +/* harmony export */ "Voice": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Voice), +/* harmony export */ "VoiceMode": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.VoiceMode), +/* harmony export */ "Volta": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.Volta), +/* harmony export */ "VoltaType": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.VoltaType), +/* harmony export */ "defined": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.defined), +/* harmony export */ "drawDot": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.drawDot), +/* harmony export */ "globalObject": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.globalObject), +/* harmony export */ "isAccidental": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.isAccidental), +/* harmony export */ "isAnnotation": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.isAnnotation), +/* harmony export */ "isBarline": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.isBarline), +/* harmony export */ "isCategory": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.isCategory), +/* harmony export */ "isDot": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.isDot), +/* harmony export */ "isGraceNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.isGraceNote), +/* harmony export */ "isGraceNoteGroup": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.isGraceNoteGroup), +/* harmony export */ "isHTMLCanvas": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.isHTMLCanvas), +/* harmony export */ "isHTMLDiv": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.isHTMLDiv), +/* harmony export */ "isNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.isNote), +/* harmony export */ "isRenderContext": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.isRenderContext), +/* harmony export */ "isStaveNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.isStaveNote), +/* harmony export */ "isStemmableNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.isStemmableNote), +/* harmony export */ "isTabNote": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.isTabNote), +/* harmony export */ "log": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.log), +/* harmony export */ "midLine": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.midLine), +/* harmony export */ "normalizeAngle": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.normalizeAngle), +/* harmony export */ "prefix": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.prefix), +/* harmony export */ "warn": () => (/* reexport safe */ _src_index__WEBPACK_IMPORTED_MODULE_1__.warn), +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _vexflow__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vexflow */ "./entry/vexflow.ts"); +/* harmony import */ var _src_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/index */ "./src/index.ts"); +// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010. +// MIT License +// +// vexflow-debug.ts is the entry point for the build output file vexflow-debug.js. +// It statically bundles all the music engraving fonts. +// Currently, it just imports vexflow.ts, but the webpack config inside Gruntfile.js +// sets the webpack mode to 'development' to produce an unminified build. +// In the future, we could do something different with this entry file, such as turn on flags for logging. + + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_vexflow__WEBPACK_IMPORTED_MODULE_0__.Vex); + +})(); + +__webpack_exports__ = __webpack_exports__["default"]; +/******/ return __webpack_exports__; +/******/ })() +; +}); +//# sourceMappingURL=vexflow-debug.js.map \ No newline at end of file diff --git a/build/cjs/vexflow-debug.js.map b/build/cjs/vexflow-debug.js.map new file mode 100644 index 0000000000..4635f09277 --- /dev/null +++ b/build/cjs/vexflow-debug.js.map @@ -0,0 +1 @@ +{"version":3,"file":"vexflow-debug.js","mappings":";;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;;;;;;;;;;;;;;;;ACVO;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACFP;AACA;AACA;AACA;AACA;AACA;AACA;AACiC;AACE;AACuB;AACH;AACvD,sEAAiB;AACjB,wDAAiB;AACjB,mEAAa;AACgB;AAC7B,iEAAe,yCAAG,EAAC;;;;;;;;;;;;;;;;;;;;;;ACfnB;AACA;AACA;AACA;AACsC;AACN;AACM;AACN;AACE;AAC+D;AAC3D;AACtC;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,yBAAyB,+CAAQ;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6DAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,2DAAsB;AAChD,QAAQ,8CAAO,+DAA+D,KAAK;AACnF;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,2DAAmB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,4DAAuB;AACjD;AACA;AACA;AACA,oFAAoF;AACpF;AACA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,sBAAsB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,iDAAiD;AAChF;AACA;AACA,+BAA+B,sCAAsC;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,wCAAwC;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,yBAAyB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,yBAAyB;AAC/D,6BAA6B,kEAA6B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,0BAA0B;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,+CAAQ;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,0BAA0B,yCAAK;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,uDAAW;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,wDAAY;AACxC;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,wBAAwB,4DAAgB;AACxC;AACA;AACA,iBAAiB;AACjB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,yBAAyB,yCAAK;AAC9B;AACA;AACA,iCAAiC,yCAAK,CAAC,2DAAsB,GAAG;AAChE,kCAAkC,yCAAK,CAAC,2DAAsB,GAAG;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,8CAAO;AACrC,+BAA+B,8CAAO;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,8CAAO,2CAA2C,KAAK;AAC/D;AACA;AACA,YAAY,uDAAW;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,8EAA8E,qCAAqC,IAAI;AACvI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,8CAAO;AACrC,+BAA+B,8CAAO;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;AC5dA;AACA;AACoC;AACoB;AAC1B;AACI;AACc;AACmB;AACtC;AAC7B;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACO;AACP;AACA;AACA;AACA;AACA;AACA,CAAC,kEAAkE;AAC5D;AACP;AACA;AACA;AACA;AACA;AACA,CAAC,8DAA8D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACO,yBAAyB,+CAAQ;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,qDAAgB;AACtC;AACA;AACA;AACA,eAAe,2DAAmB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA,kCAAkC,gEAAoB;AACtD;AACA,8DAA8D,+DAA0B;AACxF;AACA;AACA;AACA,6EAA6E,0CAAO;AACpF;AACA;AACA,gBAAgB,qDAAS;AACzB;AACA;AACA;AACA,kEAAkE,+DAA0B;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,2DAAe;AACpC;AACA;AACA,8DAA8D,+DAA0B;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qDAAS;AAC7B;AACA;AACA,sCAAsC,0CAAO;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qDAAS;AAC7B;AACA;AACA,sCAAsC,4CAAS;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE,0CAAO;AAChF,8BAA8B,gEAAoB;AAClD,8CAA8C,6DAAsB;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,+DAA0B;AAClE,8CAA8C,4CAAS;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,+DAA0B;AACnF,8CAA8C,0CAAO;AACrD;AACA;AACA,mEAAmE,+DAA0B;AAC7F;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,EAAE,uDAAiB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;AC7PA;AACA;AACA;AACgC;AACM;AACR;AACI;AAC2D;AACzC;AACpD;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA,QAAQ,eAAe,EAAE,wDAAiB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,uDAAW,UAAU,uDAAW;AACrE;AACA;AACA,YAAY,mCAAmC;AAC/C;AACA;AACA,kCAAkC,0CAAO;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,qDAAS;AACtB;AACA,kCAAkC,0CAAO;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,+CAAY;AAC9B;AACA;AACA;AACA;AACA,YAAY,mCAAmC;AAC/C;AACA;AACA,kCAAkC,0CAAO;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,qDAAS;AACtB;AACA,kCAAkC,0CAAO;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,+CAAY;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,0CAAO;AAClF,2DAA2D,4CAAS;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,2BAA2B,+CAAQ;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,6DAAqB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uHAAuH,8CAAO;AAC9H;AACA;AACA;AACA,6EAA6E,0CAAO;AACpF;AACA;AACA,gBAAgB,2DAAe;AAC/B;AACA;AACA,8DAA8D,+DAA0B;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,0CAAO;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,4CAAS;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,eAAe;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA,iCAAiC,8DAAuB;AACxD;AACA,SAAS;AACT;AACA;AACA;AACA,4BAA4B,6DAAwB;AACpD,6BAA6B,8CAAO,gEAAgE,UAAU;AAC9G;AACA,yBAAyB,yCAAK;AAC9B,sBAAsB,8CAAO;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uCAAuC;AACvD;AACA;AACA;AACA,sBAAsB,qDAAS;AAC/B;AACA,gBAAgB,IAAI;AACpB;AACA;AACA,wBAAwB,4DAAuB,gCAAgC,gBAAgB;AAC/F;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,EAAE,OAAO,EAAE;AACtD;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AC9TA;AACA;AAC8B;AACwB;AACf;AACV;AAC7B;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,sBAAsB,uCAAI;AACjC,uBAAuB,6DAAkB;AACzC,gBAAgB,eAAe;AAC/B;AACA,sBAAsB;AACtB;AACA,qBAAqB,sDAAW;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,wDAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,6DAAkB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,kDAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;AC9EA;AACA;AACoC;AACE;AACR;AACI;AACQ;AACqB;AACzB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA,eAAe,4CAAS;AACxB;AACA,WAAW,0CAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,mBAAmB,6CAAO;AACjC;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA,0BAA0B,2DAAsB;AAChD,sBAAsB,+CAAY;AAClC;AACA,eAAe;AACf;AACA,8BAA8B,0CAAO;AACrC,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,uDAAW;AACpC;AACA;AACA,8BAA8B,qDAAS;AACvC;AACA;AACA,gDAAgD,0CAAO,GAAG,4CAAS;AACnE;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,qDAAa;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,+CAAQ;AACpC;AACA;AACA,4BAA4B,+CAAQ;AACpC;AACA;AACA,4BAA4B,+CAAQ;AACpC;AACA;AACA;AACA,6CAA6C,+CAAQ;AACrD;AACA,oBAAoB,+CAAQ;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,wBAAwB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA,iCAAiC,+CAAQ;AACzC;AACA;AACA;AACA;AACA,0BAA0B,+CAAY;AACtC;AACA,0CAA0C,sDAAiB;AAC3D,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,0FAA0F,+CAAQ;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,+CAAQ;AACrD;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA,mCAAmC,4DAAuB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,iDAAiD,+CAAQ;AACzD;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,2DAAsB;AAC9E;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,0CAAO;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,2DAAsB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,iEAAiE,4CAAS,GAAG,0DAAqB,GAAG,uDAAkB;AACvH;AACA;AACA;AACA,4BAA4B,yBAAyB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,wDAAwD,oDAAoD,IAAI;AAChI;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,oBAAoB;AACxD;AACA;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,yCAAyC,oDAAoD,IAAI;AACjH;AACA;AACA;AACA,0BAA0B;AAC1B,kCAAkC;AAClC;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,4CAAS;AAC5C;AACA;AACA;AACA;AACA,wCAAwC,0CAAO;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,4CAAS;AACxC;AACA;AACA,oCAAoC,0CAAO;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,4CAAS;AAC7C;AACA;AACA,oCAAoC,0CAAO;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,qEAAqE,8CAA8C,IAAI;AACvI;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA,yDAAyD,0CAAO;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,4DAAuB,eAAe;AACzE,gDAAgD,2DAAsB;AACtE,gDAAgD,2DAAsB;AACtE,sCAAsC,2DAAsB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,2DAAsB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,6CAAU;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iCAAiC;AACzD;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,+CAAY;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,qDAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;AC3wBA;AACA;AACoC;AACE;AACU;AACE;AACZ;AACtC;AACO,mBAAmB,+CAAQ;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,gCAAgC;AAC7D;AACA,mCAAmC,2BAA2B;AAC9D;AACA;AACA;AACA;AACA,eAAe,qDAAa;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA,gBAAgB,qDAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,gEAAoB;AAClD;AACA;AACA;AACA;AACA,8BAA8B,gEAAoB;AAClD;AACA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,8DAAuB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,+DAAwB;AAC7E;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,EAAE,uDAAiB;;;;;;;;;;;;;;;ACvPpD;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AC/HA;AACA;AAC8B;AACkB;AACJ;AACP;AACrC;AACA;AACA;AACA;AACO,4BAA4B,yDAAa;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,2CAAI;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,mDAAY;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,kDAAY;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,gDAAa;AACtC,8BAA8B,mDAAgB;AAC9C,0BAA0B,+DAA4B;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;ACpPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACqD;AACrB;AACM;AACJ;AACc;AACT;AACV;AAC7B;AACA;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACO;AACP;AACA;AACA;AACA;AACA;AACA,CAAC,oEAAoE;AAC9D;AACP;AACA;AACA;AACA,CAAC,gEAAgE;AAC1D;AACP;AACA;AACA;AACA;AACA,CAAC,kCAAkC;AAC5B;AACP;AACA;AACA;AACA;AACA,CAAC,0CAA0C;AAC3C;AACA;AACA;AACA;AACO,0BAA0B,+CAAQ;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,4DAAoB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,4DAAuB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,4DAAuB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,+DAA4B;AACzD,4BAA4B,iDAAc;AAC1C;AACA;AACA;AACA,4BAA4B,gCAAgC;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,4DAAuB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,oDAAiB;AACrC,mBAAmB,mDAAgB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,mBAAmB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,qBAAqB;AAClD;AACA;AACA;AACA;AACA,sCAAsC,qCAAqC;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,8BAA8B;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yCAAK,gCAAgC,yBAAyB;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA,iEAAiE,iBAAiB,kBAAkB;AACpG;AACA;AACA;AACA;AACA;AACA,qCAAqC,kCAAkC;AACvE;AACA;AACA;AACA;AACA;AACA,qCAAqC,kCAAkC;AACvE;AACA;AACA;AACA;AACA;AACA,qCAAqC,mCAAmC;AACxE;AACA;AACA;AACA,+BAA+B;AAC/B;AACA,iEAAiE,aAAa,mBAAmB;AACjG;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA,iEAAiE,aAAa,mBAAmB;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,gEAAoB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,8DAAuB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,mEAA8B;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,8BAA8B;AAC9D,gDAAgD,iDAAc;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;AC5qBA;AACA;AACA;AACgC;AACuC;AACrC;AACK;AACD;AACtC;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA;AACA;AACA;AACA;AACA;AACO,mBAAmB,yDAAa;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,uEAA2B;AACpD;AACA,sBAAsB,4DAAuB,wBAAwB,UAAU;AAC/E;AACA;AACA;AACA,eAAe,qDAAa;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,4DAAuB;AACjD,yDAAyD,UAAU;AACnE,yBAAyB,yCAAK;AAC9B,8BAA8B,eAAe,GAAG,UAAU;AAC1D,SAAS;AACT;AACA;AACA,oEAAoE,WAAW;AAC/E,qEAAqE,WAAW,GAAG,UAAU;AAC7F,oEAAoE,WAAW,GAAG,UAAU,GAAG,UAAU;AACzG,uEAAuE,WAAW,GAAG,UAAU,GAAG,UAAU;AAC5G,gCAAgC;AAChC,kCAAkC,yCAAK;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,8CAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,8CAAO;AACjC;AACA,8BAA8B,4DAAuB;AACrD,mEAAmE,SAAS;AAC5E,oEAAoE,SAAS;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,8CAAO;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;ACjLA;AACA;AACA;AAC8B;AACE;AACF;AACS;AACvC;AACO,uBAAuB,uCAAI;AAClC;AACA,gBAAgB,eAAe;AAC/B;AACA,4BAA4B,uCAAI;AAChC;AACA,yBAAyB,yCAAK;AAC9B;AACA;AACA;AACA;AACA;AACA,eAAe,yDAAiB;AAChC;AACA;AACA;AACA;AACA,4BAA4B,uCAAI;AAChC;AACA,yBAAyB,yCAAK;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,yCAAK;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AC/EA;AACA;AACA;AACA;AACA;AACA;AACA;AAC8B;AACc;AACL;AACV;AAC7B;AACA;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,wBAAwB,uCAAI;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0DAAkB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,oEAA0B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;;;;;;;;;;;;;;;;;;ACpGA;AACA;AACA;AACA;AACoC;AACG;AACD;AAC/B;AACP;AACA;AACA;AACA,CAAC,sCAAsC;AAChC,oBAAoB,6CAAO;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C,kBAAkB,aAAa;AAC/B,kBAAkB,aAAa;AAC/B,eAAe;AACf;AACA;AACA;AACA;AACA,eAAe,sDAAc;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,mBAAmB;AACnC,gBAAgB,mBAAmB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;;;;;;;;;;;;;;;;;ACnIA;AACA;AACA;AACA;AACsC;AACsC;AACtC;AAC/B,kBAAkB,+CAAQ;AACjC;AACA;AACA,wBAAwB,8DAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA,eAAe,oDAAY;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,sBAAsB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA,gBAAgB,uDAAW;AAC3B;AACA;AACA;AACA;AACA;AACA,qBAAqB,qDAAS;AAC9B,0BAA0B,aAAa;AACvC;AACA;AACA;AACA;AACA,0BAA0B,+CAAY;AACtC;AACA;AACA,4BAA4B,sCAAsC;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C,oBAAoB,2BAA2B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,uDAAW;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,sBAAsB;AACjG;AACA,YAAY,qDAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;AC1JA;AACA;AAC8C;AAClB;AACsB;AAClB;AACE;AACJ;AACsB;AACpD;AACA;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,8BAA8B;AACrE,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,gBAAgB,UAAU;AAC1B;AACA;AACA,sDAAsD;AACtD;AACA;AACA,qBAAqB,8CAAO;AAC5B;AACA,qBAAqB,8CAAO;AAC5B,gBAAgB,8BAA8B;AAC9C;AACA,iFAAiF,UAAU,WAAW,EAAE;AACxG;AACA,oCAAoC,qDAAiB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,2CAA2C;AAC3C;AACA;AACA,kCAAkC,gBAAgB;AAClD,kCAAkC,6CAA6C;AAC/E;AACA,kDAAkD,0CAAO,GAAG,4CAAS;AACrE;AACA;AACA;AACA;AACA;AACA,wDAAwD,aAAa;AACrE;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,wBAAwB,UAAU;AAClC,YAAY,oDAAkB,WAAW,WAAW;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE;AACnE;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA,qDAAqD,+BAA+B,qEAA0B,EAAE,yEAA4B,wBAAwB,cAAc;AAClL,qBAAqB;AACrB;AACA;AACA;AACA,0BAA0B,2CAAM;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA,4BAA4B,gBAAgB;AAC5C;AACA;AACA;AACA,8BAA8B,gBAAgB;AAC9C;AACA;AACA,4BAA4B;AAC5B,kCAAkC,oDAAoD;AACtF;AACA;AACA;AACA,6BAA6B;AAC7B,kCAAkC,0BAA0B;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AChaA;AACA;AACA;AACqD;AACf;AACC;AACN;AACjC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA,cAAc,kEAA2B;AACzC;AACA;AACA,eAAe,wDAAgB;AAC/B;AACA;AACA,sBAAsB,aAAa;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,sCAAsC;AAChE;AACA;AACA;AACA;AACA;AACA,0BAA0B,sCAAsC;AAChE;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,sCAAsC;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF,kCAAkC;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8CAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,mDAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D;AAC1D;AACA;AACA;AACA,4BAA4B,qDAAkB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,gDAAa;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,mDAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,KAAK;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,+DAA4B;AAC3C;AACA;AACA;AACA;AACA;AACA,eAAe,+DAA4B;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,kDAAe;AAC3B,UAAU,4CAAS;AACnB,YAAY,oDAAiB;AAC7B,WAAW,mDAAgB;AAC3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC9UA;AACA;AACA;AAC0C;AACwD;AACpD;AACV;AACN;AACc;AACN;AACN;AACQ;AACJ;AACI;AACU;AACV;AACA;AACA;AACU;AACR;AACU;AACE;AACR;AACA;AACR;AACI;AACV;AACkB;AACV;AACA;AACF;AACQ;AACZ;AACE;AACE;AACM;AACE;AACR;AACM;AACA;AACV;AACkB;AACF;AAClB;AACK;AACrC;AACA;AACA;AACA,QAAQ,2CAAG;AACX;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,kDAAkD,YAAY,6CAA6C,EAAE;AAC7G;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iFAAiF;AACjF;AACA;AACA,6BAA6B,YAAY,4BAA4B;AACrE;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA,gBAAgB,uCAAuC;AACvD;AACA;AACA;AACA;AACA;AACA,sBAAsB,gDAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,mDAAY;AAC5B,0BAA0B,gEAAwB;AAClD;AACA;AACA,0BAA0B,6DAAqB;AAC/C;AACA;AACA,uBAAuB,6DAAqB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,8EAA8E,8CAA8C;AAC9J,0BAA0B,0CAAK;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,8EAA8E,8CAA8C;AAC9J,0BAA0B,gDAAQ;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,kDAAS;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,kDAAS;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,oDAAU;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,kDAAS;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,gDAAQ;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB,4BAA4B,6CAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA,eAAe;AACf,6BAA6B,+CAAQ;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,aAAa;AAC/C,gCAAgC,sDAAW;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,oDAAU;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,8CAAO;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,kDAAS;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,4DAAc;AACxC;AACA;AACA;AACA;AACA,0BAA0B,mDAAU;AACpC;AACA;AACA;AACA;AACA,kCAAkC,qBAAqB,2EAAkC,YAAY,yEAAgC,EAAE;AACvI,+BAA+B,mDAAU;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,uEAAuE;AACzG,gCAAgC,qDAAW;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,+BAA+B;AACjE,iCAAiC,uDAAY;AAC7C;AACA;AACA;AACA;AACA;AACA,kCAAkC,4CAA4C;AAC9E,yBAAyB,wDAAY;AACrC;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,+BAA+B;AACjE,8BAA8B,4DAAc;AAC5C;AACA;AACA;AACA;AACA;AACA,iCAAiC,wDAAY;AAC7C;AACA;AACA;AACA;AACA;AACA,mBAAmB,sDAAW;AAC9B;AACA;AACA,mBAAmB,8DAAe;AAClC;AACA;AACA,4BAA4B,+CAAO;AACnC,qCAAqC,gEAAgB;AACrD;AACA;AACA;AACA;AACA;AACA,kCAAkC,aAAa;AAC/C,0BAA0B,0CAAK;AAC/B;AACA;AACA;AACA;AACA,8BAA8B,4DAAc;AAC5C;AACA;AACA;AACA;AACA;AACA,mBAAmB,kDAAS;AAC5B;AACA;AACA,kCAAkC,wBAAwB;AAC1D,2BAA2B,4CAAM;AACjC;AACA;AACA;AACA;AACA;AACA,yBAAyB,uCAAI;AAC7B;AACA;AACA;AACA;AACA;AACA,0BAA0B,yCAAK;AAC/B;AACA;AACA;AACA;AACA;AACA,wBAAwB,gDAAQ;AAChC;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,kDAAS;AAClC;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,4DAAc;AACjD;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,sDAAW;AAC3C;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,2BAA2B,4CAAM;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,YAAY,6CAA6C;AAC1G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA,mBAAmB,iDAAS;AAC5B;AACA;AACA,kCAAkC;AAClC;AACA,eAAe;AACf,0BAA0B,wDAAY;AACtC,sBAAsB,mEAAuB;AAC7C;AACA;AACA;AACA;AACA;AACA,kCAAkC,WAAW;AAC7C,0BAA0B,wDAAY;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,EAAE,uDAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnevD,iBAAiB,SAAI,IAAI,SAAI;AAC7B,4BAA4B,+DAA+D,iBAAiB;AAC5G;AACA,oCAAoC,MAAM,+BAA+B,YAAY;AACrF,mCAAmC,MAAM,mCAAmC,YAAY;AACxF,gCAAgC;AAChC;AACA,KAAK;AACL;AAC0C;AACA;AACI;AACV;AACN;AACA;AACc;AACsB;AAClB;AACJ;AACd;AACQ;AACE;AACR;AACJ;AACY;AACJ;AACA;AACN;AACU;AACF;AACY;AACV;AACR;AACQ;AACA;AACU;AACJ;AACJ;AACI;AACJ;AACc;AACJ;AACE;AACtB;AACF;AACQ;AACQ;AACR;AACM;AACV;AACY;AACR;AACU;AACV;AACI;AACV;AACsB;AACJ;AACJ;AACN;AACQ;AACR;AACO;AACL;AACF;AACF;AACD;AACP;AACgB;AACX;AACO;AACR;AACA;AACE;AACE;AACA;AACJ;AACU;AACE;AACE;AACV;AACM;AACI;AACJ;AACR;AACF;AACA;AACY;AACV;AACc;AAClB;AACzB;AACP;AACA;AACA;AACA,qBAAqB,8CAAO;AAC5B;AACA,gBAAgB,yCAAE;AAClB;AACA,kBAAkB,2CAAI;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,8CAA8C;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,6CAAS;AAC3D,QAAQ,6DAAuB;AAC/B,QAAQ,2DAAsB;AAC9B,QAAQ,4DAAuB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,sBAAsB,6DAAuB;AAC7C;AACA;AACA;AACA,eAAe,gEAA0B;AACzC;AACA;AACA,QAAQ,gEAA0B;AAClC;AACA;AACA,eAAe,iEAA2B;AAC1C;AACA;AACA,QAAQ,iEAA2B;AACnC;AACA;AACA,eAAe,uDAAiB;AAChC;AACA;AACA,QAAQ,uDAAiB;AACzB;AACA;AACA,eAAe,iEAA2B;AAC1C;AACA;AACA,QAAQ,iEAA2B;AACnC;AACA;AACA,eAAe,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ACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,KAAK;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,8CAA8C;AAC9D,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D,sBAAsB,oBAAoB,EAAE,KAAK;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,QAAQ;AAC3D,oCAAoC,QAAQ;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,6CAA6C;AAC7C;AACA,0BAA0B,mBAAmB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8CAAO;AACtB;AACA;AACA,eAAe,8CAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;ACjYO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;;;;;;;;;;;;;;;ACtqGA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;AACA;AACA,mBAAmB,uBAAuB;AAC1C,mBAAmB,sBAAsB;AACzC,mBAAmB,sBAAsB;AACzC,mBAAmB,uBAAuB;AAC1C,mBAAmB,wBAAwB;AAC3C,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA,2BAA2B,uBAAuB;AAClD,yBAAyB,aAAa;AACtC,aAAa;AACb;AACA,2BAA2B,cAAc;AACzC,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;;;;;;;;;;;;;;;AC5gBO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;;;;;;;;;;;;;;;AC7EO;AACP;AACA;AACA,cAAc;AACd;;;;;;;;;;;;;;;ACJO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;AC3zBA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;AACA;AACA,mBAAmB,uBAAuB;AAC1C,mBAAmB,sBAAsB;AACzC,mBAAmB,sBAAsB;AACzC,mBAAmB,uBAAuB;AAC1C,mBAAmB,wBAAwB;AAC3C,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;;;;;;;;;;;;;;;;;;;AC1aA;AACA;AACA;AACA;AAC6C;AACF;AACI;AACA;AAC/C;AACA,YAAY,UAAU;AACtB;AACO;AACP,IAAI,0DAAW;AACf,IAAI,4DAAY;AAChB,IAAI,4DAAY;AAChB,IAAI,wDAAU;AACd;AACA;AACA;;;;;;;;;;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC+B;AACgB;AACI;AAC5C;AACP,IAAI,4CAAS,YAAY,wDAAW,EAAE,4DAAc;AACpD;;;;;;;;;;;;;;;;;;ACfA;AACA;AAC+B;AACc;AACI;AAC1C;AACP,IAAI,4CAAS,WAAW,sDAAU,EAAE,0DAAa;AACjD;;;;;;;;;;;;;;;;;;ACPA;AACA;AAC+B;AACkB;AACI;AAC9C;AACP,IAAI,4CAAS,aAAa,0DAAY,EAAE,8DAAe;AACvD;;;;;;;;;;;;;;;;;;ACPA;AACA;AAC+B;AACkB;AACI;AAC9C;AACP,IAAI,4CAAS,aAAa,0DAAY,EAAE,8DAAe;AACvD;;;;;;;;;;;;;;;ACPO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;;;;;;;;;;;;;;;ACtzCA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;AACA;AACA,mBAAmB,uBAAuB;AAC1C,mBAAmB,sBAAsB;AACzC,mBAAmB,sBAAsB;AACzC,mBAAmB,uBAAuB;AAC1C,mBAAmB,wBAAwB;AAC3C,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA,2BAA2B,uBAAuB;AAClD,yBAAyB,aAAa;AACtC,aAAa;AACb;AACA,2BAA2B,cAAc;AACzC,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;;;;;;;;;;;;;;;ACviBO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;;;;;;;;;;;;;;;AC91BO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AC91BA;AACA;AAC+B;AACkB;AACY;AACR;AAC9C;AACP;AACA;AACA,yBAAyB,8DAAc;AACvC,gBAAgB,iCAAiC;AACjD,QAAQ,4CAAS;AACjB;AACA;AACA;AACA,QAAQ,sEAA0B;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,yBAAyB,sEAAkB;AAC3C,gBAAgB,iCAAiC;AACjD,QAAQ,4CAAS;AACjB;AACA;AACA;AACA,QAAQ,sEAA0B;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;ACnDA;AACA;AAC8B;AACA;AACQ;AACc;AACpB;AACkB;AAChB;AACU;AACM;AACW;AAC7B;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,+CAAQ;AACtC;AACA;AACA;AACA;AACA,iDAAiD,sBAAsB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,0BAA0B;AACtE;AACA,YAAY,kDAAM;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,8CAAO;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA,gDAAgD,4DAA4D;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,sBAAsB,IAAI;AAClE;AACA,0CAA0C,6DAAe;AACzD,6BAA6B,qDAAW;AACxC;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,kCAAkC,cAAc,4DAAuB,kCAAkC;AACzG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kDAAe;AACnC;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,8BAA8B,uCAAuC,SAAS,wCAAwC,OAAO,6BAA6B;AAC1J;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,eAAe;AACjD,+EAA+E,kBAAkB;AACjG;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA,0BAA0B,0CAAK,CAAC,mDAAc,UAAU,oDAAe;AACvE;AACA,0CAA0C,wDAAqB;AAC/D;AACA;AACA,wCAAwC,kCAAkC;AAC1E,6CAA6C,yCAAyC;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA,8BAA8B,0CAAK,CAAC,mDAAc,UAAU,oDAAe;AAC3E;AACA,6BAA6B,0CAAK,CAAC,mDAAc,UAAU,oDAAe;AAC1E;AACA,uCAAuC,wDAAqB;AAC5D;AACA;AACA,4CAA4C,+BAA+B;AAC3E;AACA,2DAA2D,+BAA+B;AAC1F;AACA;AACA;AACA;AACA;AACA,YAAY,2DAAc;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uDAAW;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,uDAAW;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,4DAAuB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,+CAAY;AACtC;AACA;AACA;AACA;AACA,gBAAgB,qCAAqC;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA,0BAA0B,+CAAY;AACtC;AACA,oCAAoC,sDAAiB;AACrD,0BAA0B,+CAAY;AACtC;AACA,yCAAyC,mDAAY;AACrD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,0DAA0D,6DAAe;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,qDAAW;AACzE;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA,gBAAgB,qCAAqC;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,gBAAgB,8CAA8C;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,QAAQ;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,8CAAO;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,4DAAuB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,uBAAuB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,yCAAyC;AAClF;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,oBAAoB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,6BAA6B;AACrE;AACA,2EAA2E,wDAAoB;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;AClyBA;AACA;AACA;AACA;AACA;AACuC;AACD;AACtC;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,yDAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,oCAAoC,EAAE,IAAI,EAAE;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,eAAe,GAAG,iBAAiB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,uBAAuB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;ACnNA;AACA;AACA;AACA;AACqD;AACG;AACtB;AACc;AACT;AACD;AAC/B,6BAA6B,+CAAQ;AAC5C;AACA;AACA;AACA;AACA,wBAAwB,6DAAsB,EAAE;AAChD;AACA;AACA,2BAA2B;AAC3B,2BAA2B;AAC3B;AACA;AACA;AACA,eAAe,+DAAuB;AACtC;AACA;AACA;AACA,gBAAgB,0BAA0B;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA,kCAAkC,gEAAoB;AACtD;AACA,iCAAiC,6DAAsB;AACvD,oDAAoD,+DAA0B;AAC9E;AACA,iCAAiC,6DAAsB;AACvD,gDAAgD,+DAA0B;AAC1E;AACA;AACA,gCAAgC,sBAAsB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA,oBAAoB,uCAAuC;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6DAAsB;AAC9C;AACA,mDAAmD;AACnD;AACA;AACA,6BAA6B,8DAAuB;AACpD;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,aAAa,IAAI;AAC5C;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,8DAAuB;AACxC;AACA;AACA;AACA,iBAAiB,8DAAuB;AACxC;AACA;AACA;AACA,iBAAiB,6DAAsB;AACvC;AACA;AACA,iBAAiB,8DAAuB;AACxC;AACA;AACA;AACA,0BAA0B,+CAAY,oCAAoC,eAAe;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,kDAAe;AAC3B;AACA,YAAY,kDAAe;AAC3B,WAAW,mDAAgB;AAC3B;;;;;;;;;;;;;;;;;;ACnKA;AACA;AACA;AACgD;AACK;AACf;AACtC;AACO,wBAAwB,yDAAa;AAC5C;AACA,eAAe,0DAAkB;AACjC;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA,gBAAgB,wDAAY;AAC5B;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;AC7DA;AACA;AAC4C;AACsB;AAC9B;AACG;AACQ;AACxC;AACP;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,KAAK,GAAG,SAAS;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,oBAAoB,6CAAO;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qDAAW;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,sDAAc;AAC7B;AACA;AACA,uCAAuC,SAAS,EAAE,KAAK,EAAE,IAAI;AAC7D,wCAAwC,SAAS,EAAE,IAAI;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,SAAS,GAAG,KAAK,GAAG,IAAI;AACxE;AACA,sDAAsD,MAAM;AAC5D,gDAAgD,SAAS,GAAG,IAAI;AAChE;AACA;AACA;AACA;AACA,QAAQ,8CAAO;AACf;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA,yBAAyB;AACzB;AACA,kBAAkB,+CAAY,sBAAsB,MAAM;AAC1D;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA,sBAAsB,+CAAY,sBAAsB,MAAM;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,2EAAsB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,qDAAW;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qDAAW;AACnC;AACA;AACA,eAAe,8CAAO,oCAAoC,WAAW;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8CAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;AC/XA;AAC8B;AACS;AAChC,wBAAwB,uCAAI;AACnC;AACA;AACA,uCAAuC,6BAA6B;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0DAAkB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;AC1DA;AACwC;AACV;AACI;AACK;AACD;AAC/B,wBAAwB,iDAAS;AACxC;AACA,8BAA8B,kBAAkB,+DAA0B,6DAA6D;AACvI;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0DAAkB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,8CAAW,2BAA2B,8CAAW;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,+DAA0B;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,4CAAS;AACpD;AACA;AACA,qCAAqC,uDAAkB;AACvD;AACA;AACA,mDAAmD,0CAAO;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;ACzIA;AACA;AACA;AACA;AACA;AACA;AAC8B;AACU;AACF;AACA;AACJ;AACA;AACkB;AACvB;AACG;AAChC;AACA;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA;AACO,6BAA6B,+CAAQ;AAC5C;AACA;AACA;AACA;AACA,wBAAwB,6DAAsB;AAC9C;AACA;AACA;AACA;AACA,yBAAyB,yCAAK;AAC9B;AACA;AACA,wBAAwB,sDAAiB;AACzC,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,+DAAuB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6BAA6B;AACrD;AACA;AACA,iCAAiC,uDAAW;AAC5C;AACA;AACA;AACA,gCAAgC,sBAAsB;AACtD;AACA;AACA;AACA;AACA,8BAA8B,yCAAyC;AACvE;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,iDAAS;AAC1C;AACA,0EAA0E;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,uCAAI;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,uDAAW;AAC5C,4CAA4C,+CAAQ,GAAG,2CAAM;AAC7D;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;AC/IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC8B;AACM;AACG;AAChC,2BAA2B,6CAAO;AACzC;AACA,eAAe,6DAAqB;AACpC;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA,2BAA2B,kDAAe,CAAC,GAAG;AAC9C;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC3BA;AACA;AAC4B;AACC;AACA;AACE;AACL;AACH;AACA;AACO;AACW;AACT;AACF;AACP;AACI;AACC;AACJ;AACF;AACM;AACF;AACA;AACH;AACA;AACvB;AAC4B;AACD;AACM;AACL;AACJ;AACI;AACA;AACK;AACF;AACF;AACE;AACF;AACF;AACO;AACC;AACX;AACD;AACI;AACI;AACJ;AACG;AACL;AACM;AACJ;AACK;AACL;AACE;AACL;AACO;AACE;AACF;AACH;AACI;AACJ;AACM;AACH;AACF;AACD;AACD;AACE;AACN;AACS;AACD;AACL;AACG;AACJ;AACzB;AAC0B;AACC;AACA;AACF;AACK;AACC;AACC;AACL;AACA;AACG;AACC;AACC;AACF;AACJ;AACD;AACA;AACG;AACL;AACvB;AAC0B;AACO;AACT;AACF;AACtB;AACe;AACf,iEAAe,qCAAG,EAAC;;;;;;;;;;;;;;;;;AChGnB;AACA;AACA;AACA;AACA;AACgC;AACM;AAC/B;AACP;AACA,yBAAyB,yCAAK;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,oDAAgB;AAClD;AACA,sBAAsB,+CAAY,0CAA0C,SAAS;AACrF;AACA,uFAAuF,oDAAgB;AACvG;AACA;AACA;AACA,6BAA6B,sDAAkB;AAC/C,wBAAwB,IAAI,sDAAkB,EAAE;AAChD,+CAA+C,sDAAkB;AACjE,6BAA6B,+CAAW;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;AC5GA;AACA;AACA;AACA;AACA;AACA;AACA;AACgC;AACuC;AACrC;AACK;AACN;AAC1B,2BAA2B,yDAAa;AAC/C;AACA;AACA;AACA;AACA;AACA,yBAAyB,uEAA2B;AACpD,kCAAkC;AAClC;AACA,8BAA8B;AAC9B;AACA;AACA;AACA,eAAe,6DAAqB;AACpC;AACA;AACA;AACA;AACA;AACA,6BAA6B,2DAAsB;AACnD,0BAA0B,yCAAK;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,wDAAmB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA;AACA,6BAA6B,2BAA2B;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,uBAAuB,wDAAmB,CAAC,8CAAO;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,qEAAyB;AACrE;AACA;AACA;AACA;AACA,4BAA4B,yBAAyB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;;;;;;;;;;;;;;;;;;AC3RA;AACA;AAC8C;AAChB;AACS;AAChC,yBAAyB,uCAAI;AACpC;AACA,gBAAgB,eAAe;AAC/B,gCAAgC,uDAAY;AAC5C;AACA;AACA;AACA;AACA,eAAe,2DAAmB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AClCA;AACA;AACoC;AACG;AACQ;AACxC;AACP;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4CAA4C;AAC7C;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,uBAAuB,6CAAO;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,yDAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8CAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,8CAAO,sCAAsC,UAAU;AAC/D,eAAe,8CAAO,oCAAoC,UAAU;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8CAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8CAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,+CAAY;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD,SAAS;AACT;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1LA;AACA;AACA;AACA;AACA;AACA;AAC0C;AACA;AACI;AAChB;AACc;AAChB;AACsB;AACA;AACJ;AACR;AACM;AACJ;AACM;AACX;AACI;AACI;AACP;AACpC;AACA;AACA;AACA;AACA,QAAQ,2CAAG;AACX;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gDAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,yDAAgB,SAAS,2DAAkB;AACnD,QAAQ,6DAAkB,SAAS,6DAAoB;AACvD,QAAQ,4CAAU,SAAS,qDAAY;AACvC,QAAQ,kEAAqB,SAAS,gEAAuB;AAC7D,QAAQ,0DAAiB,SAAS,4DAAmB;AACrD,QAAQ,oDAAa,SAAS,wDAAe;AAC7C,QAAQ,kEAAqB,SAAS,gEAAuB;AAC7D,QAAQ,8DAAmB,SAAS,8DAAqB;AACzD,QAAQ,+DAAmB,SAAS,8DAAqB;AACzD,QAAQ,8DAAmB,SAAS,8DAAqB;AACzD,QAAQ,sDAAe,SAAS,0DAAiB;AACjD,QAAQ,0DAAiB,SAAS,4DAAmB;AACrD,QAAQ,4DAAkB,SAAS,6DAAoB;AACvD,QAAQ,8CAAW,SAAS,sDAAa;AACzC,QAAQ,qDAAc,SAAS,yDAAgB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,6DAAoB,iBAAiB,2DAAkB;AAC/D;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;ACpIA;AACA;AACA;AACA;AACoC;AACJ;AACM;AACkB;AACtB;AACc;AACE;AACjB;AACjC;AACA;AACA;AACA,6BAA6B,+CAAQ,GAAG,+BAA+B;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,+BAA+B,6CAAO;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,4DAAuB;AACjD,8CAA8C,yJAAyJ,+DAA0B,kDAAkD,+DAA0B,2EAA2E;AACxX;AACA;AACA;AACA;AACA,eAAe,iEAAyB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8CAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC,YAAY,qDAAiB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,uEAA2B;AAC3E,yCAAyC,qDAAS;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,yDAAa;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;AC7LA;AACA;AACsC;AACtC;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,wBAAwB;AAC9C,kBAAkB,yBAAyB;AAC3C,kBAAkB,wBAAwB;AAC1C,kBAAkB,yBAAyB;AAC3C,kBAAkB,wBAAwB;AAC1C,kBAAkB,wBAAwB;AAC1C,oBAAoB,yBAAyB;AAC7C,kBAAkB,wBAAwB;AAC1C,kBAAkB,yBAAyB;AAC3C,kBAAkB,wBAAwB;AAC1C,kBAAkB,yBAAyB;AAC3C,kBAAkB,wBAAwB;AAC1C,sBAAsB,wBAAwB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,2BAA2B;AAC5C,kBAAkB,2BAA2B;AAC7C,oBAAoB,2BAA2B;AAC/C,qBAAqB,2BAA2B;AAChD,kBAAkB,4BAA4B;AAC9C,mBAAmB,4BAA4B;AAC/C,iBAAiB,2BAA2B;AAC5C,kBAAkB,2BAA2B;AAC7C,oBAAoB,2BAA2B;AAC/C,qBAAqB,2BAA2B;AAChD,kBAAkB,2BAA2B;AAC7C,mBAAmB,2BAA2B;AAC9C,iBAAiB,2BAA2B;AAC5C,kBAAkB,2BAA2B;AAC7C,oBAAoB,2BAA2B;AAC/C,qBAAqB,2BAA2B;AAChD,kBAAkB,2BAA2B;AAC7C,mBAAmB,2BAA2B;AAC9C,iBAAiB,2BAA2B;AAC5C,kBAAkB,2BAA2B;AAC7C,oBAAoB,2BAA2B;AAC/C,qBAAqB,2BAA2B;AAChD,kBAAkB,2BAA2B;AAC7C,mBAAmB,2BAA2B;AAC9C,iBAAiB,2BAA2B;AAC5C,kBAAkB,2BAA2B;AAC7C,oBAAoB,2BAA2B;AAC/C,qBAAqB,2BAA2B;AAChD,kBAAkB,2BAA2B;AAC7C,mBAAmB,2BAA2B;AAC9C,iBAAiB,2BAA2B;AAC5C,kBAAkB,2BAA2B;AAC7C,oBAAoB,4BAA4B;AAChD,qBAAqB,4BAA4B;AACjD,kBAAkB,2BAA2B;AAC7C,mBAAmB,2BAA2B;AAC9C,iBAAiB,4BAA4B;AAC7C,kBAAkB,4BAA4B;AAC9C,oBAAoB,2BAA2B;AAC/C,qBAAqB,2BAA2B;AAChD,kBAAkB,4BAA4B;AAC9C,mBAAmB,2BAA2B;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,iCAAiC,UAAU;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,uCAAuC,WAAW;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,2CAA2C,eAAe;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,wCAAwC,UAAU;AACpF;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,4CAA4C,cAAc;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,uCAAuC,UAAU;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,+CAAY,uCAAuC,KAAK,IAAI,UAAU;AAChG;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,uCAAuC,KAAK,IAAI,UAAU;AAC5F;AACA;AACA;AACA,4BAA4B,eAAe;AAC3C;AACA;AACA;AACA;AACA,6BAA6B,eAAe;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,uCAAuC,UAAU;AACnF;AACA;AACA,sBAAsB,+CAAY,mCAAmC,MAAM,IAAI,MAAM;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;AClXA;AACA;AAC8B;AACY;AACR;AACI;AACC;AACQ;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,mBAAmB,+CAAQ;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,wDAAwD,2BAA2B;AACrH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,yDAAoB;AACzC,wDAAwD,yDAAoB;AAC5E;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,sCAAsC;AACtC,uCAAuC;AACvC,0BAA0B;AAC1B,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,qDAAa;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kDAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D,QAAQ,uDAAO;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,sDAAiB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,oBAAoB,2DAAsB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,UAAU;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8CAAO;AACtB;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8CAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,4DAAuB;AACzC;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,4DAAuB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,+CAAY;AAC9B;AACA;AACA;AACA,kBAAkB,+CAAY;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;AC7eA;AACA;AAC4C;AACZ;AACF;AACA;AACI;AACK;AACa;AACpD;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,gEAA2B;AAC7C;AACA,qBAAqB,sDAAiB;AACtC;AACA,QAAQ,4DAAuB;AAC/B;AACA;AACA;AACA,cAAc,sDAAiB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,8DAAyB;AACjC;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,uBAAuB,uCAAI;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,0CAAO;AAClE;AACA;AACA;AACA,qBAAqB,yDAAoB;AACzC,QAAQ,8CAAO,6DAA6D,cAAc,cAAc,cAAc;AACtH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA,6DAA6D,+DAA0B,EAAE;AACzF;AACA;AACA;AACA,eAAe,yDAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,6CAAU;AACrD,0BAA0B,4DAAuB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA,mBAAmB,qDAAW;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,0CAAO;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,gBAAgB,MAAM,mBAAmB,0CAAO,iBAAiB;AACnG;AACA;AACA;AACA;AACA;AACA,YAAY,qDAAiB;AAC7B,iEAAiE,eAAe,yBAAyB,eAAe;AACxH,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;ACnNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACwC;AACF;AACJ;AACK;AACP;AACzB,2BAA2B,+CAAQ;AAC1C;AACA;AACA;AACA,wBAAwB,6DAAsB;AAC9C;AACA;AACA;AACA,SAAS;AACT;AACA,6BAA6B,iDAAS;AACtC,yBAAyB,yCAAK;AAC9B;AACA;AACA,wBAAwB,sDAAiB;AACzC,SAAS;AACT;AACA;AACA;AACA,eAAe,6DAAqB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;ACpEA;AACA;AACA;AACgC;AACM;AACR;AACI;AACU;AACM;AACE;AACpD;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,uBAAuB,+CAAQ;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yDAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,0CAA0C,UAAU;AACtF;AACA;AACA;AACA,yBAAyB,yCAAK;AAC9B,kCAAkC,mBAAmB;AACrD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA,eAAe,yDAAiB;AAChC;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB,6CAA6C;AAC7C;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,8CAAO;AAC5C,oFAAoF,8DAAuB;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,8DAAuB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,4DAAuB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,yCAAK,CAAC,2DAAsB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,yCAAK,CAAC,2DAAsB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,4CAAS;AACrC;AACA,YAAY,qDAAS;AACrB;AACA,gCAAgC,4CAAS;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,4CAAS;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,oEAA0B;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AC/QA;AACA;AACA;AACgC;AACwB;AACtB;AACkB;AACpD;AACO,0BAA0B,+CAAQ;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,6DAAsB;AACpG,qBAAqB,4DAAuB;AAC5C,sBAAsB,4DAAuB;AAC7C;AACA;AACA,eAAe,4DAAoB;AACnC;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD,iDAAiD,4DAAqB;AACtE,iDAAiD,6DAAsB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA,wBAAwB,6DAAsB;AAC9C;AACA;AACA;AACA,wBAAwB,4DAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,4DAAuB;AAC5C,sBAAsB,4DAAuB;AAC7C,YAAY,uDAAW;AACvB,yBAAyB,4DAAuB;AAChD,0BAA0B,4DAAuB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,sBAAsB;AACjG;AACA;AACA,6BAA6B,8DAAuB;AACpD,YAAY,qDAAiB;AAC7B;AACA,aAAa;AACb;AACA,kCAAkC,6DAAsB;AACxD,YAAY,qDAAiB;AAC7B;AACA,aAAa;AACb;AACA;AACA;;;;;;;;;;;;;;;;ACxFA;AACA;AACA;AAC2C;AAC3C;AACA;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,cAAc;AACnE,kDAAkD,4BAA4B;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,iBAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,SAAS;AAChC;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;ACnNA;AACA;AACoC;AACiB;AACrB;AACE;AACK;AACI;AAC3C;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,yCAAK,2BAA2B,0BAA0B;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,2BAA2B,6CAAO;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,6DAAqB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,+CAAY;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,4DAAuB,gCAAgC,mCAAmC;AACpH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,4DAAuB,gCAAgC,mCAAmC;AACpH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,6CAAU;AACtB;AACA,YAAY,kDAAe;AAC3B,WAAW,mDAAgB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;ACtPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,2BAA2B;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA,2BAA2B,yEAAyE;AACpG;AACA;AACA;AACA;AACA;AACA,oIAAoI;AACpI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACnHA;AACA;AACuC;AAChC;AACP;AACA,eAAe,8DAAsB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;ACtCA;AACA;AACgD;AACN;AACI;AACR;AACU;AACzC;AACP;AACA;AACA;AACA,CAAC,4CAA4C;AAC7C;AACO;AACP;AACA;AACA;AACA;AACA,CAAC,kDAAkD;AACnD;AACA;AACA;AACO;AACP;AACA,YAAY,2DAAe;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,+CAAY;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,+CAAY,gDAAgD,aAAa;AACvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,kDAAY;AACjC,8BAA8B,+CAAY;AAC1C;AACA;AACA;AACA,8BAA8B,+CAAY;AAC1C;AACA,+BAA+B,yDAAa;AAC5C;AACA;AACA,qBAAqB,+CAAS;AAC9B,8BAA8B,+CAAY;AAC1C;AACA,+BAA+B,mDAAU;AACzC;AACA;AACA,0BAA0B,+CAAY,8CAA8C,QAAQ;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AC9HA;AACgC;AACQ;AACN;AACK;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACO,yBAAyB,iDAAS;AACzC;AACA,eAAe,2DAAmB;AAClC;AACA;AACA,yCAAyC,+CAA+C;AACxF;AACA,0BAA0B,yCAAK,YAAY,4DAAuB;AAClE;AACA,SAAS;AACT;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxBA;AACA;AAC4C;AACd;AACM;AACiB;AACP;AACQ;AACE;AACT;AACD;AACJ;AACF;AACH;AACH;AACc;AACE;AACZ;AACtC;AACA;AACA;AACA;AACA,KAAK,2DAAgB;AACrB,KAAK,gDAAa;AAClB,KAAK,gEAAqB;AAC1B,KAAK,mEAAsB;AAC3B;AACA;AACA,KAAK,mEAAsB;AAC3B,KAAK,gEAAqB;AAC1B,KAAK,2DAAgB;AACrB,KAAK,gDAAa;AAClB;AACO,oBAAoB,6CAAO;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA,uCAAuC,wHAAwH,gEAA0B,oHAAoH;AAC7S,wBAAwB;AACxB,wCAAwC;AACxC;AACA;AACA,6BAA6B,kDAAO,yBAAyB,6DAAkB,GAAG,2DAAgB;AAClG;AACA,gCAAgC,kDAAO,0BAA0B,6DAAkB,GAAG,2DAAgB;AACtG;AACA;AACA,eAAe,uDAAc;AAC7B;AACA;AACA;AACA;AACA,0BAA0B,6DAAuB;AACjD;AACA;AACA;AACA;AACA,0BAA0B,6DAAuB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,4BAA4B;AACpD,4CAA4C,eAAe;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,iEAA2B;AAChE;AACA;AACA,0DAA0D,iEAA2B;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,qFAAqF,iEAA2B,EAAE;AACjJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA,sBAAsB,gDAAY;AAClC;AACA;AACA;AACA,8BAA8B,uEAA2B;AACzD;AACA;AACA;AACA,oDAAoD,uEAA2B;AAC/E;AACA;AACA;AACA;AACA,qCAAqC,mEAAwB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,wDAAU;AAC1C;AACA;AACA;AACA;AACA,gCAAgC,+CAAK;AACrC;AACA;AACA;AACA;AACA,iCAAiC,uDAAY;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,mDAAU;AAC1C;AACA;AACA;AACA,wCAAwC;AACxC,gCAAgC,kDAAS;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,qDAAW;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,qEAAyB;AAC5D;AACA;AACA;AACA;AACA;AACA,gBAAgB,6BAA6B,EAAE,sDAAW;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,mEAAwB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,uEAA2B;AAClD;AACA,yBAAyB,qEAAyB;AAClD;AACA;AACA;AACA;AACA;AACA,kDAAkD,gDAAa;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,qEAAyB;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,uEAA2B;AAClD;AACA,0DAA0D,gEAAqB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,qEAAyB;AAC9E;AACA;AACA;AACA;AACA,uBAAuB,uEAA2B;AAClD;AACA,2DAA2D,mEAAsB;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,qEAAyB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,uEAA2B;AAClD;AACA,6BAA6B,uDAAY;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,uEAA2B;AAC9E;AACA;AACA,8BAA8B,qEAAyB;AACvD;AACA;AACA,6BAA6B,uCAAI;AACjC;AACA;AACA;AACA,6CAA6C,qEAAyB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,0DAAa;AAC1C;AACA;AACA;AACA,uDAAuD,qEAAyB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,QAAQ;AAC/C,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,uEAA2B;AAC1E,+CAA+C,qEAAyB;AACxE;AACA;AACA,gEAAgE,mEAAwB;AACxF;AACA,0CAA0C,kDAAO,CAAC,6DAAkB;AACpE;AACA;AACA,0CAA0C,kDAAO,CAAC,2DAAgB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA,6BAA6B,sDAAS;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,kBAAkB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gDAAY;AAClC;AACA;AACA,sBAAsB,gDAAY;AAClC;AACA;AACA,sBAAsB,gDAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gDAAY;AAClC;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA,kFAAkF;AAClF;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,kDAAe;AAC3B;AACA,YAAY,oDAAiB;AAC7B,WAAW,mDAAgB;AAC3B;;;;;;;;;;;;;;;;;;;ACnpBA;AACA;AACA;AACuE;AACrC;AACK;AAChC;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;AAC5B,sBAAsB,yDAAa;AAC1C;AACA;AACA,yBAAyB,gEAA2B;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,uEAA2B;AACpD;AACA;AACA;AACA,eAAe,wDAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;ACjMA;AACA;AACoC;AACiB;AACrB;AACE;AACK;AACD;AACtC;AACA;AACA,kBAAkB,+CAAY;AAC9B;AACA;AACA,6BAA6B;AAC7B,+BAA+B;AAC/B;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,6BAA6B,6CAAO;AAC3C;AACA;AACA,yBAAyB,gEAA2B;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,+DAAuB;AACtC;AACA;AACA;AACA,wBAAwB,2BAA2B,GAAG;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA,qCAAqC,wBAAwB;AAC7D,SAAS;AACT;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,qDAAiB;AACjC,gBAAgB,qDAAiB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,+CAAY,qDAAqD,UAAU;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,6CAAU;AACtB;AACA,YAAY,oDAAiB;AAC7B,WAAW,mDAAgB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;ACtOA;AACA;AACA;AACA;AACA;AACA;AACA;AACoC;AACE;AACC;AACD;AAC/B,2BAA2B,6CAAO;AACzC;AACA;AACA;AACA,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;AACA,wBAAwB,8DAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,6DAAqB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,8DAAuB,iBAAiB,8DAAuB;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAAS;AACxB;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,8DAAuB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AC/JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACoC;AACF;AACK;AACD;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,wBAAwB,6CAAO;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0DAAkB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,mEAA8B;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,EAAE,uDAAiB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;ACpRA;AACA;AACA;AACA;AACoC;AACG;AACN;AAC1B;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sDAAsD;AAChD,4BAA4B,6CAAO;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8DAAsB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8CAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC4C;AACN;AACA;AACR;AACkB;AACd;AACK;AAC4B;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA,iFAAiF,0CAAO;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,8CAAO;AACrC;AACA;AACA;AACA;AACA;AACO,wBAAwB,yDAAa;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,yDAAoB;AACzC,QAAQ,8CAAO,6DAA6D,cAAc,cAAc,cAAc;AACtH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA,6DAA6D,+DAA0B;AACvF;AACA,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oGAAoG,0CAAO;AAC3G;AACA;AACA;AACA;AACA;AACA,eAAe,0DAAkB;AACjC;AACA;AACA;AACA;AACA;AACA,eAAe,0CAAO;AACtB;AACA;AACA;AACA;AACA;AACA,eAAe,4CAAS;AACxB;AACA;AACA;AACA;AACA;AACA,0BAA0B,4DAAuB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,uCAAI,GAAG,uBAAuB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,0CAAO;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,WAAW;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,+CAAQ;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,0CAAO,GAAG,4CAAS;AACzE;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B,0BAA0B,yDAAoB;AAC9C;AACA,0BAA0B,+CAAY,qDAAqD,IAAI;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,2CAAI;AACpB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA,gBAAgB,2CAA2C;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,8DAAyB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,oBAAoB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,qDAAW;AAC9B;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,6CAAU;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,8CAAO;AAC9B;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA,gBAAgB,4BAA4B,EAAE,wDAAiB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,0CAAO;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,4CAAS;AACvF;AACA;AACA,kGAAkG,0CAAO;AACzG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,0CAAO;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,kBAAkB,QAAQ;AAC1B,kBAAkB,QAAQ;AAC1B,kBAAkB,aAAa;AAC/B,kBAAkB,aAAa;AAC/B,kBAAkB,QAAQ;AAC1B;AACA,kBAAkB,QAAQ;AAC1B,kBAAkB,cAAc;AAChC;AACA,kBAAkB,cAAc;AAChC,kBAAkB,QAAQ;AAC1B,kBAAkB,QAAQ;AAC1B;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,yBAAyB,WAAW,IAAI;AACxD;AACA;AACA,iEAAiE,6CAAU;AAC3E;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA,gBAAgB,iKAAiK;AACjL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA,2BAA2B,sBAAsB;AACjD;AACA;AACA;AACA;AACA;AACA,2BAA2B,qBAAqB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,4CAAS;AAC/D;AACA;AACA;AACA;AACA;AACA,+CAA+C,mBAAmB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,mBAAmB;AACtE;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,uCAAI;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,mBAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA,+BAA+B,0CAAO;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,mBAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;ACl8BA;AACA;AACqD;AACrB;AACgB;AACd;AACK;AAChC,yBAAyB,yDAAa;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,2DAAmB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,qDAAiB,sDAAsD,4DAAuB,kEAAkE,kBAAkB;AAC1L;AACA;AACA;AACA;AACA,QAAQ,qDAAiB,sDAAsD,4DAAuB,mEAAmE,mBAAmB;AAC5L;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,4DAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,4DAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,4DAAuB;AAC/C;AACA;AACA,wBAAwB,4DAAuB;AAC/C;AACA;AACA;AACA,wBAAwB,4DAAuB;AAC/C;AACA;AACA;AACA;AACA,YAAY,4DAAuB;AACnC;AACA,YAAY,qDAAiB,iCAAiC,kBAAkB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,6CAAU;AACtB;AACA,YAAY,kDAAe;AAC3B,WAAW,mDAAgB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;ACjKA;AACA;AACqD;AACL;AACT;AAChC,2BAA2B,yDAAa;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,6DAAqB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,kDAAe;AAC3B;AACA,YAAY,kDAAe;AAC3B,WAAW,mDAAgB;AAC3B;;;;;;;;;;;;;;;;;;;;AC7DA;AACA;AACqD;AACrB;AACuC;AACrC;AACK;AAChC,yBAAyB,yDAAa;AAC7C;AACA;AACA;AACA,gCAAgC;AAChC;AACA,wBAAwB,uEAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,2DAAmB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,oBAAoB,mCAAmC;AAC7G;AACA;AACA;AACA;AACA;AACA,yBAAyB,yDAAoB;AAC7C;AACA,YAAY,qDAAiB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qDAAiB;AACrC;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA,4BAA4B,UAAU;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,6CAAU;AACtB;AACA,YAAY,kDAAe;AAC3B,WAAW,mDAAgB;AAC3B;;;;;;;;;;;;;;;;;;;;ACnGA;AACA;AACqD;AACkB;AAClB;AACd;AACD;AAC/B,wBAAwB,yDAAa;AAC5C,4CAA4C;AAC5C;AACA;AACA;AACA;AACA,uCAAuC,uCAAuC,oEAA6B,EAAE;AAC7G;AACA;AACA;AACA,eAAe,0DAAkB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,sEAA0B;AAC3C,iBAAiB,uEAA2B;AAC5C;AACA,sCAAsC,sEAA0B;AAChE;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,uEAA2B;AAC5C,iBAAiB,uEAA2B;AAC5C;AACA,mDAAmD,2DAAoB;AACvE;AACA;AACA,wDAAwD,0DAAmB;AAC3E;AACA;AACA,sCAAsC,uEAA2B;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,+CAAY;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,6CAAU;AACtB;AACA,YAAY,oDAAiB;AAC7B,WAAW,mDAAgB;AAC3B;;;;;;;;;;;;;;;;;;ACpFA;AACA;AACA;AACA;AACoC;AACG;AACD;AAC/B,uBAAuB,6CAAO;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,yDAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAAS;AACxB;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA,0BAA0B,+CAAY;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,qCAAqC,EAAE,uDAAiB;;;;;;;;;;;;;;;;;;;ACzKxD;AACA;AACqD;AACL;AACT;AAChC;AACP;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8BAA8B;AACxB,oBAAoB,yDAAa;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,sDAAc;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,kDAAe;AAC3B;AACA,YAAY,kDAAe;AAC3B,WAAW,mDAAgB;AAC3B;;;;;;;;;;;;;;;;;;;ACtEA;AACA;AACA;AACA;AACA;AACoC;AACF;AACK;AACI;AAC3C;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACO,mBAAmB,6CAAO;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,qDAAa;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,sDAAiB;AAChC;AACA;AACA,eAAe,uDAAkB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6GAA6G;AAC7G;AACA;AACA;AACA,kBAAkB,+CAAY;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,4DAAuB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;AChKA;AACA;AACA;AACA;AACA;AACgC;AACF;AACA;AACI;AACK;AACD;AAC/B,4BAA4B,uCAAI;AACvC;AACA;AACA;AACA;AACA,eAAe,8DAAsB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,uCAAI;AAC7B;AACA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA,yDAAyD,4CAAS;AAClE,4BAA4B,yCAAK,mDAAmD,UAAU;AAC9F;AACA;AACA;AACA;AACA,wCAAwC,4CAAS;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8CAAW;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,8DAAyB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA,wBAAwB,0CAAO;AAC/B,0BAA0B,0CAAO,kBAAkB,4CAAS;AAC5D,sBAAsB,+CAAY,2CAA2C,UAAU;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,4DAAuB,iCAAiC,gBAAgB;AACpG;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,4CAAS;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,4CAAS;AAC9D,wBAAwB,4DAAuB,+BAA+B,SAAS;AACvF;AACA;AACA;AACA,gDAAgD,8CAAW;AAC3D;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,+CAAY;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,+CAAY;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,yDAAoB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,uCAAI;AAC7B;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;AC5NA;AACA;AACA;AACA;AACA;AACqD;AACG;AAClB;AACR;AACI;AACmC;AAC/B;AAC/B,2BAA2B,+CAAQ;AAC1C;AACA;AACA;AACA,2BAA2B;AAC3B,wBAAwB,8DAAuB,EAAE;AACjD;AACA;AACA;AACA;AACA,2BAA2B;AAC3B,2BAA2B;AAC3B,4BAA4B;AAC5B,mBAAmB,gEAAyB,EAAE;AAC9C;AACA;AACA;AACA;AACA,eAAe,6DAAqB;AACpC;AACA;AACA;AACA,eAAe,4DAAuB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA,iBAAiB,uDAAW;AAC5B,0BAA0B,+CAAY;AACtC;AACA;AACA;AACA;AACA,2DAA2D,+DAA0B;AACrF;AACA,4BAA4B,6DAAsB;AAClD;AACA;AACA;AACA,iCAAiC,6DAAsB;AACvD;AACA;AACA;AACA;AACA;AACA,gCAAgC,sBAAsB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6DAAsB;AAC9C;AACA,oDAAoD;AACpD;AACA;AACA,6BAA6B,8DAAuB;AACpD;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,gEAAyB,WAAW,gEAAyB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE,0CAAO;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,8DAAuB;AACxC;AACA;AACA;AACA,2DAA2D,0CAAO;AAClE;AACA;AACA,mGAAmG,+DAA0B;AAC7H;AACA;AACA,iBAAiB,8DAAuB;AACxC;AACA;AACA;AACA,2DAA2D,4CAAS;AACpE;AACA;AACA,mGAAmG,+DAA0B;AAC7H;AACA;AACA,iBAAiB,6DAAsB;AACvC;AACA;AACA,iBAAiB,8DAAuB;AACxC;AACA;AACA;AACA,0BAA0B,+CAAY,oCAAoC,eAAe;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,2DAAe;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,8DAAuB;AACvC;AACA;AACA,gBAAgB,8DAAuB;AACvC;AACA;AACA;AACA;AACA,qBAAqB,8DAAuB;AAC5C;AACA;AACA,oBAAoB,8DAAuB;AAC3C;AACA,qBAAqB,gEAAyB;AAC9C;AACA;AACA,oBAAoB,8DAAuB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,kDAAe;AAC3B,UAAU,4CAAS;AACnB,YAAY,kDAAe;AAC3B,WAAW,mDAAgB;AAC3B;;;;;;;;;;;;;;;;;;;;ACjPA;AACA;AACA;AACA;AACA;AACqD;AACrB;AACM;AACiC;AACjC;AAC/B,qBAAqB,+CAAQ;AACpC;AACA;AACA,uCAAuC,kBAAkB;AACzD;AACA;AACA;AACA;AACA,wBAAwB,6DAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,uDAAe;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uDAAW;AAC3B;AACA,wBAAwB,OAAO;AAC/B;AACA,yBAAyB;AACzB;AACA,qBAAqB,qDAAS;AAC9B;AACA,wBAAwB,cAAc;AACtC,yBAAyB;AACzB;AACA;AACA,0BAA0B,+CAAY;AACtC;AACA,SAAS;AACT;AACA;AACA,oDAAoD,eAAe;AACnE;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA,gBAAgB,kDAAM;AACtB;AACA;AACA;AACA,gCAAgC,eAAe;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,uDAAW;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,uDAAW;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA,0BAA0B,+CAAY,mCAAmC,WAAW;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uDAAW;AAC3B,mCAAmC,WAAW;AAC9C,oBAAoB,qDAAiB;AACrC;AACA;AACA;AACA;AACA,+BAA+B,WAAW;AAC1C,oBAAoB,qDAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,QAAQ,qDAAiB;AACzB,gCAAgC,MAAM,GAAG,WAAW;AACpD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,6CAAU;AACtB,UAAU,4CAAS;AACnB,YAAY,kDAAe;AAC3B,WAAW,mDAAgB;AAC3B;;;;;;;;;;;;;;;;;;ACvNA;AACA;AACA;AACqD;AACL;AACc;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACO,yBAAyB,yDAAa;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,2BAA2B,kDAAe;AAC1C,yBAAyB,4CAAS;AAClC,2BAA2B,oDAAiB;AAC5C,0BAA0B,mDAAgB;AAC1C;AACA,qCAAqC,SAAS,cAAc;AAC5D,0CAA0C,iFAAiF;AAC3H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,6CAAM;AAC9C;AACA,qCAAqC,6CAAM;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mFAAmF;AACnF,wDAAwD,qBAAqB;AAC7E;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,mDAAmD;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,IAAI,EAAE,IAAI,GAAG,QAAQ,EAAE,QAAQ,QAAQ,IAAI,EAAE,IAAI;AAC9E,6BAA6B,QAAQ,EAAE,QAAQ,QAAQ,IAAI,EAAE,GAAG;AAChE;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,qDAAc;AACvC,uBAAuB,qDAAc;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,IAAI,EAAE,IAAI,GAAG,QAAQ,EAAE,QAAQ,IAAI,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,eAAe,KAAK,SAAS;AACvE;AACA;AACA;AACA;AACA,uDAAuD,sBAAsB,gBAAgB;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,sBAAsB,4DAA4D;AAC3I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,sBAAsB;AAC/E,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,gDAAa;AACtC,6BAA6B,mDAAgB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;ACjgBA;AACA;AAC4C;AACR;AACI;AACV;AACE;AACO;AACD;AACtC;AACA;AACA;AACA;AACA;AACO,qBAAqB,6CAAO;AACnC,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA,eAAe,uDAAe;AAC9B;AACA;AACA,2BAA2B;AAC3B;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA,qDAAqD,iLAAiL,cAAc,yBAAyB,YAAY,mDAAmD,0BAA0B;AACtW;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,yDAAyD,EAAE;AACpF;AACA;AACA;AACA,yBAAyB;AACzB,yDAAyD,WAAW;AACpE,iDAAiD,aAAa;AAC9D,UAAU,EAAE;AACZ;AACA;AACA;AACA,6CAA6C,iBAAiB;AAC9D,gGAAgG,wFAAwF;AACxL,gDAAgD;AAChD;AACA,2FAA2F,aAAa,uBAAuB;AAC/H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,iDAAS;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,0BAA0B;AACpE;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,mDAAmD,sDAAkB;AACrE,aAAa;AACb;AACA;AACA;AACA;AACA,mEAAmE,wDAAoB;AACvF;AACA;AACA,wBAAwB,mCAAmC;AAC3D;AACA;AACA;AACA;AACA;A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AAC9C,mBAAmB,uBAAuB;AAC1C,YAAY,mBAAmB;AAC/B,gBAAgB,uBAAuB;AACvC,aAAa,oBAAoB;AACjC;AACO;AACP;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,2EAA2E;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA,gGAAgG,SAAS;AACzG;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA,oDAAoD;AACpD;AACA;AACA;AACA,sBAAsB,+CAAY,kFAAkF,eAAe;AACnI;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA,sBAAsB,+CAAY,8EAA8E,QAAQ;AACxH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,oDAAoD,QAAQ;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,yCAAK;AAC1C;AACA;AACA,0BAA0B,+CAAY;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,gDAAgD,KAAK;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA,4BAA4B,yBAAyB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,wDAAwD,SAAS;AACnG;AACA;AACA;AACA;AACA;AACA,mBAAmB,+CAAQ;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,2CAA2C;AAC7F;AACA;AACA;AACA;AACA,iEAAiE,kDAAc;AAC/E;AACA,2DAA2D,kBAAkB,oBAAoB;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;;;;;;;;;;;;;;;;;;;;;;;AC9xCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC8B;AACE;AACM;AACR;AACkB;AACd;AACY;AACC;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACO,sBAAsB,yDAAa;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA,0DAA0D,iBAAiB;AAC3E;AACA;AACA,4DAA4D;AAC5D;AACA,8BAA8B,gEAA2B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,4CAAS,CAAC,KAAK,kDAAe,CAAC,GAAG;AACvD,qBAAqB,yDAAoB;AACzC,QAAQ,8CAAO,6DAA6D,cAAc,cAAc,cAAc;AACtH;AACA;AACA;AACA;AACA;AACA,kCAAkC,0CAAO;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,wDAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA,0BAA0B,sDAAiB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,wBAAwB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,WAAW;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA,yBAAyB,6DAAsB;AAC/C,wBAAwB;AACxB;AACA,8BAA8B,8DAAuB;AACrD,gCAAgC;AAChC;AACA,8BAA8B,8DAAuB,iBAAiB,8DAAuB;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,0CAAO;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,+CAA+C,6BAA6B,IAAI;AAChG;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,4CAAS;AAC1D;AACA;AACA;AACA,YAAY,qDAAiB,yDAAyD,0BAA0B;AAChH;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,iDAAK;AACrB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,6CAAU;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,qDAAiB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA,8CAA8C,mBAAmB;AACjE;AACA;AACA;AACA;AACA;AACA,+CAA+C,mBAAmB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;ACjYA;AACA;AACA;AACA;AACA;AACqD;AACnB;AACK;AACD;AAC/B,uBAAuB,2CAAM;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,yDAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA,0BAA0B,+CAAY;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,6CAAU;AACtB;AACA,YAAY,kDAAe;AAC3B,WAAW,mDAAgB;AAC3B;;;;;;;;;;;;;;;;;ACpGA;AACgC;AACO;AAChC,uBAAuB,yCAAK;AACnC;AACA,eAAe,yDAAiB;AAChC;AACA;AACA,4CAA4C,kEAAkE;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACsC;AACC;AAChC,qBAAqB,+CAAQ;AACpC;AACA,eAAe,uDAAe;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;;;;;;;;;;;;;;;;;;;;;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACoC;AACiB;AACf;AACJ;AACK;AACI;AAC3C;AACA;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACO;AACP;AACA;AACA;AACA,CAAC,kDAAkD;AAC5C,0BAA0B,6CAAO;AACxC,kBAAkB,8EAA8E;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,4DAAoB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,mEAA8B;AACxG;AACA;AACA,0BAA0B,+CAAY,oCAAoC,eAAe;AACzF;AACA;AACA,wBAAwB;AACxB,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,8BAA8B;AAC9C;AACA,gCAAgC,iDAAc;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,8DAAuB;AACnC;AACA;AACA,gBAAgB,8DAAuB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,6CAAU;AACtB;AACA,YAAY,oDAAiB;AAC7B,WAAW,mDAAgB;AAC3B;;;;;;;;;;;;;;;;;;;ACvLA;AACA;AACgC;AACF;AACS;AACa;AACpD;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,2BAA2B,uCAAI;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,0BAA0B,qBAAqB;AAC3G;AACA;AACA;AACA,eAAe,6DAAqB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,+CAAY;AACtC,yBAAyB,8CAAO;AAChC,8BAA8B,yCAAK,0BAA0B,sBAAsB;AACnF;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;;;;;;;;;;;;;;;;AChHA;AACA;AACqD;AACxB;AAC7B;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA,mCAAmC,kDAAe;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,8CAAW;AACpC,2BAA2B,gDAAa;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,+DAA4B;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,kDAAe,GAAG,oDAAiB;AACtE,oCAAoC,mDAAgB,GAAG,mDAAgB;AACvE;AACA,2BAA2B,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,wDAAqB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;AChRA;AACA;AACqD;AACrB;AACF;AACS;AACD;AAC/B;AACP;AACA;AACA;AACA;AACA,CAAC,sCAAsC;AACvC;AACA;AACA;AACA;AACA;AACA;AACO,uBAAuB,uCAAI;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,+CAAY;AACtC,6BAA6B,yCAAK,oBAAoB,sBAAsB;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,yDAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,8BAA8B;AAClD;AACA,oCAAoC,iDAAc;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,kDAAe;AAC3B;AACA,YAAY,oDAAiB;AAC7B,WAAW,mDAAgB;AAC3B;;;;;;;;;;;;;;;;;;;;AC1MA;AACA;AACoC;AACE;AACJ;AACK;AACQ;AAC/C;AACA;AACA;AACA;AACO,uBAAuB,6CAAO;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,+CAAQ,QAAQ;AACzC,iCAAiC;AACjC,kCAAkC,+CAAQ;AAC1C;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,mBAAmB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,eAAe,yDAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8CAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8CAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,sDAAiB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8CAAO;AACtB;AACA;;;;;;;;;;;;;;;;;AChSA;AACA;AACA;AACA;AACA;AACsC;AACA;AACtC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,+BAA+B,+CAAQ;AACvC,4BAA4B,+CAAQ;AACpC,sCAAsC;AACtC,mCAAmC;AACnC;AACA,0BAA0B;AAC1B;AACA,wBAAwB;AACxB,0BAA0B;AAC1B,6BAA6B;AAC7B,oCAAoC;AACpC;AACA,yBAAyB;AACzB,0BAA0B;AAC1B,sCAAsC;AACtC,uCAAuC;AACvC,4BAA4B;AAC5B,6BAA6B;AAC7B,8BAA8B;AAC9B,+BAA+B;AAC/B,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA,uBAAuB,mBAAmB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uHAAuH;AACvI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACjMA;AACA;AACA;AACA;AACA;AACgC;AACC;AAC1B,iCAAiC,yCAAK;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,yCAAK;AACtC;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,yCAAK;AACtC;AACA,wBAAwB,8CAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA,YAAY,uDAAmB;AAC/B,uBAAuB,8CAAO;AAC9B;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA,YAAY,uDAAmB;AAC/B,uBAAuB,8CAAO;AAC9B;AACA;AACA;;;;;;;;;;;;;;;;;;;;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACgC;AACuC;AACrC;AACkB;AACb;AACQ;AAC/C;AACA;AACA;AACA,kBAAkB,+CAAY,2CAA2C,SAAS;AAClF;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,2CAA2C,SAAS;AACtF;AACA,KAAK;AACL;AACO,4BAA4B,yDAAa;AAChD;AACA;AACA;AACA;AACA,0BAA0B,4DAAuB;AACjD;AACA;AACA;AACA;AACA,yBAAyB,uEAA2B;AACpD;AACA,sBAAsB,8CAAO;AAC7B;AACA;AACA;AACA,eAAe,8DAAsB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oBAAoB,oBAAoB;AACxC;AACA;AACA;AACA,2BAA2B,yCAAK;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,6DAAkB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;AChGA;AACA;AAC8B;AACkB;AACT;AAChC,0BAA0B,uCAAI;AACrC;AACA,gBAAgB,eAAe;AAC/B,kCAAkC,yDAAa;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,4DAAoB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;ACtCA;AACA;AACA;AACgC;AACQ;AACF;AACR;AACI;AACkB;AACpD;AACO,sBAAsB,+CAAQ;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,+DAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,wDAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,uDAAW;AAC9B,2BAA2B,uDAAe;AAC1C,oCAAoC,yBAAyB;AAC7D,0BAA0B,4DAAuB;AACjD,kDAAkD,SAAS;AAC3D;AACA;AACA;AACA;AACA;AACA,2CAA2C,SAAS;AACpD;AACA;AACA,2CAA2C,SAAS;AACpD;AACA,oDAAoD,SAAS;AAC7D,uCAAuC,SAAS,cAAc,kBAAkB,0CAAO,iBAAiB;AACxG,wBAAwB,cAAc;AACtC,YAAY,qDAAiB,oCAAoC,0CAA0C;AAC3G;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACxDA;AACA;AACkC;AACI;AACtC;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,yDAAoB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,2CAA2C,aAAa;AAC1F;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,wDAAwD,yBAAyB,GAAG,UAAU;AAChI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY,qDAAqD,QAAQ;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,yDAAoB,QAAQ,GAAG,OAAO;AACxD;AACA;;;;;;;;;;;;;;;;;;;;;;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,4BAA4B;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACoC;AACI;AACR;AACF;AACI;AACK;AACQ;AACxC;AACP;AACA;AACA;AACA,CAAC,wCAAwC;AAClC,qBAAqB,6CAAO;AACnC,mCAAmC;AACnC;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,4DAAuB;AAC5C;AACA;AACA;AACA;AACA,QAAQ,mEAA2B;AACnC;AACA;AACA;AACA;AACA,eAAe,uDAAe;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,4DAAuB;AACtC;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,SAAS;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,yCAAK;AACnD;AACA;AACA;AACA;AACA;AACA,0CAA0C,yCAAK;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,uBAAuB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,0CAAO;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,4BAA4B,uBAAuB;AACnD;AACA,0EAA0E,0CAAO;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,8CAAO;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,4DAAuB;AAC9C;AACA;AACA;AACA,wBAAwB,8CAAO;AAC/B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,8CAAO;AACnC,aAAa;AACb;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACP;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4BAA4B;;;;;;;;;;;;;;;;;;;;;;ACtH7B;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,qBAAM;AACrB,eAAe,qBAAM;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,MAAM,6BAA6B,MAAM;AACjF;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,iBAAiB,KAAK;AACtB;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;AChFA;AACA;AACA;AAC8B;AACa;AACpC;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,gBAAgB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA,sBAAsB,+CAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,uCAAI;;;;;;;;;;;;;;;;;;;ACpEf;AACA;AAC8B;AACQ;AACJ;AACK;AACvC;AACO,sBAAsB,+CAAQ;AACrC;AACA;AACA,wBAAwB,8DAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,wDAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,gDAAa;AACtD;AACA,yGAAyG,+DAA0B;AACnI;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,8DAAuB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,4DAA4D;AAC5E;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AClHA;AACA;AACA;AACoC;AACG;AACV;AACO;AACpC;AACA;AACA;AACA,QAAQ,0CAAG;AACX;AACA;AACO,6BAA6B,6CAAO;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,+DAAuB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,2DAAqB;AAC7B;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;ACpEA;AACA;AACoC;AACE;AACJ;AACK;AACQ;AACxC;AACP;AACA;AACA;AACA;AACA,CAAC,8BAA8B;AAC/B;AACA;AACA;AACO,oBAAoB,6CAAO;AAClC;AACA;AACA;AACA;AACA;AACA,6BAA6B,+CAAQ;AACrC;AACA;AACA,uCAAuC,oBAAoB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yCAAyC,sDAAiB,EAAE;AAChG;AACA,8BAA8B,+CAAQ;AACtC;AACA;AACA;AACA,eAAe,sDAAc;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,2BAA2B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA,0BAA0B,+CAAY;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,eAAe,8CAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA,YAAY,8CAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACvPA;AACA;AACA;AACA;AACA;AACA;AACsC;AACtC;AACO;AACP;AACA;AACA,mBAAmB,mDAAY;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,mBAAmB,mDAAY;AAC/B;AACA;AACA;AACA;AACA;AACA;;;;;;;UC7BA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC;;;;;WCPD;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACgC;AACH;AAC7B,iEAAe,yCAAG,EAAC","sources":["webpack://Vex/webpack/universalModuleDefinition","webpack://Vex/./src/version.ts","webpack://Vex/./entry/vexflow.ts","webpack://Vex/./src/accidental.ts","webpack://Vex/./src/annotation.ts","webpack://Vex/./src/articulation.ts","webpack://Vex/./src/barnote.ts","webpack://Vex/./src/beam.ts","webpack://Vex/./src/bend.ts","webpack://Vex/./src/boundingbox.ts","webpack://Vex/./src/boundingboxcomputation.ts","webpack://Vex/./src/canvascontext.ts","webpack://Vex/./src/chordsymbol.ts","webpack://Vex/./src/clef.ts","webpack://Vex/./src/clefnote.ts","webpack://Vex/./src/crescendo.ts","webpack://Vex/./src/curve.ts","webpack://Vex/./src/dot.ts","webpack://Vex/./src/easyscore.ts","webpack://Vex/./src/element.ts","webpack://Vex/./src/factory.ts","webpack://Vex/./src/flow.ts","webpack://Vex/./src/font.ts","webpack://Vex/./src/fonts/bravura_glyphs.ts","webpack://Vex/./src/fonts/bravura_metrics.ts","webpack://Vex/./src/fonts/custom_glyphs.ts","webpack://Vex/./src/fonts/custom_metrics.ts","webpack://Vex/./src/fonts/gonville_glyphs.ts","webpack://Vex/./src/fonts/gonville_metrics.ts","webpack://Vex/./src/fonts/load_all.ts","webpack://Vex/./src/fonts/load_bravura.ts","webpack://Vex/./src/fonts/load_custom.ts","webpack://Vex/./src/fonts/load_gonville.ts","webpack://Vex/./src/fonts/load_petaluma.ts","webpack://Vex/./src/fonts/petaluma_glyphs.ts","webpack://Vex/./src/fonts/petaluma_metrics.ts","webpack://Vex/./src/fonts/petalumascript_glyphs.ts","webpack://Vex/./src/fonts/robotoslab_glyphs.ts","webpack://Vex/./src/fonts/textfonts.ts","webpack://Vex/./src/formatter.ts","webpack://Vex/./src/fraction.ts","webpack://Vex/./src/frethandfinger.ts","webpack://Vex/./src/ghostnote.ts","webpack://Vex/./src/glyph.ts","webpack://Vex/./src/glyphnote.ts","webpack://Vex/./src/gracenote.ts","webpack://Vex/./src/gracenotegroup.ts","webpack://Vex/./src/gracetabnote.ts","webpack://Vex/./src/index.ts","webpack://Vex/./src/keymanager.ts","webpack://Vex/./src/keysignature.ts","webpack://Vex/./src/keysignote.ts","webpack://Vex/./src/modifier.ts","webpack://Vex/./src/modifiercontext.ts","webpack://Vex/./src/multimeasurerest.ts","webpack://Vex/./src/music.ts","webpack://Vex/./src/note.ts","webpack://Vex/./src/notehead.ts","webpack://Vex/./src/notesubgroup.ts","webpack://Vex/./src/ornament.ts","webpack://Vex/./src/parenthesis.ts","webpack://Vex/./src/parser.ts","webpack://Vex/./src/pedalmarking.ts","webpack://Vex/./src/registry.ts","webpack://Vex/./src/rendercontext.ts","webpack://Vex/./src/renderer.ts","webpack://Vex/./src/repeatnote.ts","webpack://Vex/./src/stave.ts","webpack://Vex/./src/stavebarline.ts","webpack://Vex/./src/staveconnector.ts","webpack://Vex/./src/stavehairpin.ts","webpack://Vex/./src/staveline.ts","webpack://Vex/./src/stavemodifier.ts","webpack://Vex/./src/stavenote.ts","webpack://Vex/./src/staverepetition.ts","webpack://Vex/./src/stavesection.ts","webpack://Vex/./src/stavetempo.ts","webpack://Vex/./src/stavetext.ts","webpack://Vex/./src/stavetie.ts","webpack://Vex/./src/stavevolta.ts","webpack://Vex/./src/stem.ts","webpack://Vex/./src/stemmablenote.ts","webpack://Vex/./src/stringnumber.ts","webpack://Vex/./src/strokes.ts","webpack://Vex/./src/svgcontext.ts","webpack://Vex/./src/system.ts","webpack://Vex/./src/tables.ts","webpack://Vex/./src/tabnote.ts","webpack://Vex/./src/tabslide.ts","webpack://Vex/./src/tabstave.ts","webpack://Vex/./src/tabtie.ts","webpack://Vex/./src/textbracket.ts","webpack://Vex/./src/textdynamics.ts","webpack://Vex/./src/textformatter.ts","webpack://Vex/./src/textnote.ts","webpack://Vex/./src/tickable.ts","webpack://Vex/./src/tickcontext.ts","webpack://Vex/./src/timesigglyph.ts","webpack://Vex/./src/timesignature.ts","webpack://Vex/./src/timesignote.ts","webpack://Vex/./src/tremolo.ts","webpack://Vex/./src/tuning.ts","webpack://Vex/./src/tuplet.ts","webpack://Vex/./src/typeguard.ts","webpack://Vex/./src/util.ts","webpack://Vex/./src/vex.ts","webpack://Vex/./src/vibrato.ts","webpack://Vex/./src/vibratobracket.ts","webpack://Vex/./src/voice.ts","webpack://Vex/./src/web.ts","webpack://Vex/webpack/bootstrap","webpack://Vex/webpack/runtime/define property getters","webpack://Vex/webpack/runtime/global","webpack://Vex/webpack/runtime/hasOwnProperty shorthand","webpack://Vex/webpack/runtime/make namespace object","webpack://Vex/./entry/vexflow-debug.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Vex\"] = factory();\n\telse\n\t\troot[\"Vex\"] = factory();\n})((typeof window !== 'undefined' ? window : typeof globalThis !== 'undefined' ? globalThis : this), function() {\nreturn ","export const VERSION = '4.0.1-alpha.2';\nexport const ID = '0df10df6d1fab3a99f5aa306341a31c6e686d659';\nexport const DATE = '2022-02-02T09:30:30.784Z';\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// vexflow.ts is the entry point for the build output file vexflow.js.\n// It statically bundles all the music engraving fonts, and sets the music font stack to:\n// Flow.setMusicFont('Bravura', 'Gonville', 'Custom');\n// The webpack config inside Gruntfile.js sets the mode to 'production' to produce a minified build.\nimport { Vex } from '../src/vex';\nimport { Flow } from '../src/flow';\nimport { loadAllMusicFonts } from '../src/fonts/load_all';\nimport { loadTextFonts } from '../src/fonts/textfonts';\nloadAllMusicFonts();\nFlow.setMusicFont('Bravura', 'Gonville', 'Custom');\nloadTextFonts();\nexport * from '../src/index';\nexport default Vex;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// @author Mohit Cheppudira\n// @author Greg Ristow (modifications)\nimport { Fraction } from './fraction';\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Music } from './music';\nimport { Tables } from './tables';\nimport { Category, isAccidental, isGraceNote, isGraceNoteGroup, isStaveNote } from './typeguard';\nimport { defined, log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Accidental.DEBUG)\n log('Vex.Flow.Accidental', args);\n}\n/**\n * An `Accidental` inherits from `Modifier`, and is formatted within a\n * `ModifierContext`. Accidentals are modifiers that can be attached to\n * notes. Support is included for both western and microtonal accidentals.\n *\n * See `tests/accidental_tests.ts` for usage examples.\n */\nexport class Accidental extends Modifier {\n /**\n * Create accidental.\n * @param type value from `Vex.Flow.accidentalCodes.accidentals` table in `tables.ts`.\n * For example: `#`, `##`, `b`, `n`, etc.\n */\n constructor(type) {\n super();\n L('New accidental: ', type);\n this.type = type;\n this.position = Modifier.Position.LEFT;\n this.render_options = {\n // Font size for glyphs\n font_scale: 38,\n // Padding between accidental and parentheses on each side\n parenLeftPadding: 2,\n parenRightPadding: 2,\n };\n this.accidental = Tables.accidentalCodes(this.type);\n defined(this.accidental, 'ArgumentError', `Unknown accidental type: ${type}`);\n // Cautionary accidentals have parentheses around them\n this.cautionary = false;\n this.reset();\n }\n /** Accidentals category string. */\n static get CATEGORY() {\n return Category.Accidental;\n }\n /** Arrange accidentals inside a ModifierContext. */\n static format(accidentals, state) {\n // If there are no accidentals, no need to format their positions.\n if (!accidentals || accidentals.length === 0)\n return;\n const musicFont = Tables.currentMusicFont();\n const noteheadAccidentalPadding = musicFont.lookupMetric('accidental.noteheadAccidentalPadding');\n const leftShift = state.left_shift + noteheadAccidentalPadding;\n const accidentalSpacing = musicFont.lookupMetric('accidental.accidentalSpacing');\n const additionalPadding = musicFont.lookupMetric('accidental.leftPadding'); // padding to the left of all accidentals\n const accList = [];\n let prevNote = undefined;\n let shiftL = 0;\n // First determine the accidentals' Y positions from the note.keys\n for (let i = 0; i < accidentals.length; ++i) {\n const acc = accidentals[i];\n const note = acc.getNote();\n const stave = note.getStave();\n const index = acc.checkIndex();\n const props = note.getKeyProps()[index];\n if (note !== prevNote) {\n // Iterate through all notes to get the displaced pixels\n for (let n = 0; n < note.keys.length; ++n) {\n shiftL = Math.max(note.getLeftDisplacedHeadPx(), shiftL);\n }\n prevNote = note;\n }\n if (stave) {\n const lineSpace = stave.getSpacingBetweenLines();\n const y = stave.getYForLine(props.line);\n const accLine = Math.round((y / lineSpace) * 2) / 2;\n accList.push({ y, line: accLine, shift: shiftL, acc, lineSpace });\n }\n else {\n accList.push({ line: props.line, shift: shiftL, acc });\n }\n }\n // Sort accidentals by line number.\n accList.sort((a, b) => b.line - a.line);\n // FIXME: Confusing name. Each object in this array has a property called `line`.\n // So if this is a list of lines, you end up with: `line.line` which is very awkward.\n const lineList = [];\n // amount by which all accidentals must be shifted right or left for\n // stem flipping, notehead shifting concerns.\n let accShift = 0;\n let previousLine = undefined;\n // Create an array of unique line numbers (lineList) from accList\n for (let i = 0; i < accList.length; i++) {\n const acc = accList[i];\n // if this is the first line, or a new line, add a lineList\n if (previousLine === undefined || previousLine !== acc.line) {\n lineList.push({\n line: acc.line,\n flatLine: true,\n dblSharpLine: true,\n numAcc: 0,\n width: 0,\n column: 0,\n });\n }\n // if this accidental is not a flat, the accidental needs 3.0 lines lower\n // clearance instead of 2.5 lines for b or bb.\n // FIXME: Naming could use work. acc.acc is very awkward\n if (acc.acc.type !== 'b' && acc.acc.type !== 'bb') {\n lineList[lineList.length - 1].flatLine = false;\n }\n // if this accidental is not a double sharp, the accidental needs 3.0 lines above\n if (acc.acc.type !== '##') {\n lineList[lineList.length - 1].dblSharpLine = false;\n }\n // Track how many accidentals are on this line:\n lineList[lineList.length - 1].numAcc++;\n // Track the total x_offset needed for this line which will be needed\n // for formatting lines w/ multiple accidentals:\n // width = accidental width + universal spacing between accidentals\n lineList[lineList.length - 1].width += acc.acc.getWidth() + accidentalSpacing;\n // if this accShift is larger, use it to keep first column accidentals in the same line\n accShift = acc.shift > accShift ? acc.shift : accShift;\n previousLine = acc.line;\n }\n // ### Place Accidentals in Columns\n //\n // Default to a classic triangular layout (middle accidental farthest left),\n // but follow exceptions as outlined in G. Read's _Music Notation_ and\n // Elaine Gould's _Behind Bars_.\n //\n // Additionally, this implements different vertical collision rules for\n // flats (only need 2.5 lines clearance below) and double sharps (only\n // need 2.5 lines of clearance above or below).\n //\n // Classic layouts and exception patterns are found in the 'tables.js'\n // in 'Tables.accidentalColumnsTable'\n //\n // Beyond 6 vertical accidentals, default to the parallel ascending lines approach,\n // using as few columns as possible for the verticle structure.\n //\n // TODO (?): Allow column to be specified for an accidental at run-time?\n let totalColumns = 0;\n // establish the boundaries for a group of notes with clashing accidentals:\n for (let i = 0; i < lineList.length; i++) {\n let noFurtherConflicts = false;\n const groupStart = i;\n let groupEnd = i;\n while (groupEnd + 1 < lineList.length && !noFurtherConflicts) {\n // if this note conflicts with the next:\n if (this.checkCollision(lineList[groupEnd], lineList[groupEnd + 1])) {\n // include the next note in the group:\n groupEnd++;\n }\n else {\n noFurtherConflicts = true;\n }\n }\n // Gets an a line from the `lineList`, relative to the current group\n const getGroupLine = (index) => lineList[groupStart + index];\n const getGroupLines = (indexes) => indexes.map(getGroupLine);\n const lineDifference = (indexA, indexB) => {\n const [a, b] = getGroupLines([indexA, indexB]).map((item) => item.line);\n return a - b;\n };\n const notColliding = (...indexPairs) => indexPairs.map(getGroupLines).every(([line1, line2]) => !this.checkCollision(line1, line2));\n // Set columns for the lines in this group:\n const groupLength = groupEnd - groupStart + 1;\n // Set the accidental column for each line of the group\n let endCase = this.checkCollision(lineList[groupStart], lineList[groupEnd]) ? 'a' : 'b';\n switch (groupLength) {\n case 3:\n if (endCase === 'a' && lineDifference(1, 2) === 0.5 && lineDifference(0, 1) !== 0.5) {\n endCase = 'second_on_bottom';\n }\n break;\n case 4:\n if (notColliding([0, 2], [1, 3])) {\n endCase = 'spaced_out_tetrachord';\n }\n break;\n case 5:\n if (endCase === 'b' && notColliding([1, 3])) {\n endCase = 'spaced_out_pentachord';\n if (notColliding([0, 2], [2, 4])) {\n endCase = 'very_spaced_out_pentachord';\n }\n }\n break;\n case 6:\n if (notColliding([0, 3], [1, 4], [2, 5])) {\n endCase = 'spaced_out_hexachord';\n }\n if (notColliding([0, 2], [2, 4], [1, 3], [3, 5])) {\n endCase = 'very_spaced_out_hexachord';\n }\n break;\n default:\n break;\n }\n let groupMember;\n let column;\n // If the group contains seven members or more, use ascending parallel lines\n // of accidentals, using as few columns as possible while avoiding collisions.\n if (groupLength >= 7) {\n // First, determine how many columns to use:\n let patternLength = 2;\n let collisionDetected = true;\n while (collisionDetected === true) {\n collisionDetected = false;\n for (let line = 0; line + patternLength < lineList.length; line++) {\n if (this.checkCollision(lineList[line], lineList[line + patternLength])) {\n collisionDetected = true;\n patternLength++;\n break;\n }\n }\n }\n // Then, assign a column to each line of accidentals\n for (groupMember = i; groupMember <= groupEnd; groupMember++) {\n column = ((groupMember - i) % patternLength) + 1;\n lineList[groupMember].column = column;\n totalColumns = totalColumns > column ? totalColumns : column;\n }\n }\n else {\n // If the group contains fewer than seven members, use the layouts from\n // the Tables.accidentalColumnsTable (See: tables.ts).\n for (groupMember = i; groupMember <= groupEnd; groupMember++) {\n column = Tables.accidentalColumnsTable[groupLength][endCase][groupMember - i];\n lineList[groupMember].column = column;\n totalColumns = totalColumns > column ? totalColumns : column;\n }\n }\n // Increment i to the last note that was set, so that if a lower set of notes\n // does not conflict at all with this group, it can have its own classic shape.\n i = groupEnd;\n }\n // ### Convert Columns to x_offsets\n //\n // This keeps columns aligned, even if they have different accidentals within them\n // which sometimes results in a larger x_offset than is an accidental might need\n // to preserve the symmetry of the accidental shape.\n //\n // Neither A.C. Vinci nor G. Read address this, and it typically only happens in\n // music with complex chord clusters.\n //\n // TODO (?): Optionally allow closer compression of accidentals, instead of forcing\n // parallel columns.\n // track each column's max width, which will be used as initial shift of later columns:\n const columnWidths = [];\n const columnXOffsets = [];\n for (let i = 0; i <= totalColumns; i++) {\n columnWidths[i] = 0;\n columnXOffsets[i] = 0;\n }\n columnWidths[0] = accShift + leftShift;\n columnXOffsets[0] = accShift + leftShift;\n // Fill columnWidths with widest needed x-space;\n // this is what keeps the columns parallel.\n lineList.forEach((line) => {\n if (line.width > columnWidths[line.column])\n columnWidths[line.column] = line.width;\n });\n for (let i = 1; i < columnWidths.length; i++) {\n // this column's offset = this column's width + previous column's offset\n columnXOffsets[i] = columnWidths[i] + columnXOffsets[i - 1];\n }\n const totalShift = columnXOffsets[columnXOffsets.length - 1];\n // Set the xShift for each accidental according to column offsets:\n let accCount = 0;\n lineList.forEach((line) => {\n let lineWidth = 0;\n const lastAccOnLine = accCount + line.numAcc;\n // handle all of the accidentals on a given line:\n for (accCount; accCount < lastAccOnLine; accCount++) {\n const xShift = columnXOffsets[line.column - 1] + lineWidth;\n accList[accCount].acc.setXShift(xShift);\n // keep track of the width of accidentals we've added so far, so that when\n // we loop, we add space for them.\n lineWidth += accList[accCount].acc.getWidth() + accidentalSpacing;\n L('Line, accCount, shift: ', line.line, accCount, xShift);\n }\n });\n // update the overall layout with the full width of the accidental shapes:\n state.left_shift += totalShift + additionalPadding;\n }\n /** Helper function to determine whether two lines of accidentals collide vertically */\n static checkCollision(line1, line2) {\n let clearance = line2.line - line1.line;\n let clearanceRequired = 3;\n // But less clearance is required for certain accidentals: b, bb and ##.\n if (clearance > 0) {\n // then line 2 is on top\n clearanceRequired = line2.flatLine || line2.dblSharpLine ? 2.5 : 3.0;\n if (line1.dblSharpLine)\n clearance -= 0.5;\n }\n else {\n // line 1 is on top\n clearanceRequired = line1.flatLine || line1.dblSharpLine ? 2.5 : 3.0;\n if (line2.dblSharpLine)\n clearance -= 0.5;\n }\n const collision = Math.abs(clearance) < clearanceRequired;\n L('Line_1, Line_2, Collision: ', line1.line, line2.line, collision);\n return collision;\n }\n /**\n * Use this method to automatically apply accidentals to a set of `voices`.\n * The accidentals will be remembered between all the voices provided.\n * Optionally, you can also provide an initial `keySignature`.\n */\n static applyAccidentals(voices, keySignature) {\n const tickPositions = [];\n const tickNoteMap = {};\n // Sort the tickables in each voice by their tick position in the voice.\n voices.forEach((voice) => {\n const tickPosition = new Fraction(0, 1);\n const tickable = voice.getTickables();\n tickable.forEach((t) => {\n if (t.shouldIgnoreTicks())\n return;\n const notesAtPosition = tickNoteMap[tickPosition.value()];\n if (!notesAtPosition) {\n tickPositions.push(tickPosition.value());\n tickNoteMap[tickPosition.value()] = [t];\n }\n else {\n notesAtPosition.push(t);\n }\n tickPosition.add(t.getTicks());\n });\n });\n const music = new Music();\n // Default key signature is C major.\n if (!keySignature)\n keySignature = 'C';\n // Get the scale map, which represents the current state of each pitch.\n const scaleMapKey = music.createScaleMap(keySignature);\n const scaleMap = {};\n tickPositions.forEach((tickPos) => {\n const tickables = tickNoteMap[tickPos];\n // Array to store all pitches that modified accidental states\n // at this tick position\n const modifiedPitches = [];\n const processNote = (t) => {\n // Only StaveNote implements .addModifier(), which is used below.\n if (!isStaveNote(t) || t.isRest() || t.shouldIgnoreTicks()) {\n return;\n }\n // Go through each key and determine if an accidental should be applied.\n const staveNote = t;\n staveNote.keys.forEach((keyString, keyIndex) => {\n const key = music.getNoteParts(keyString.split('/')[0]);\n const octave = keyString.split('/')[1];\n // Force a natural for every key without an accidental\n const accidentalString = key.accidental || 'n';\n const pitch = key.root + accidentalString;\n // Determine if the current pitch has the same accidental\n // as the scale state\n if (!scaleMap[key.root + octave])\n scaleMap[key.root + octave] = scaleMapKey[key.root];\n const sameAccidental = scaleMap[key.root + octave] === pitch;\n // Determine if an identical pitch in the chord already\n // modified the accidental state\n const previouslyModified = modifiedPitches.indexOf(keyString) > -1;\n // Remove accidentals\n staveNote.getModifiers().forEach((modifier, index) => {\n if (isAccidental(modifier) && modifier.type == accidentalString && modifier.getIndex() == keyIndex) {\n staveNote.getModifiers().splice(index, 1);\n }\n });\n // Add the accidental to the StaveNote\n if (!sameAccidental || (sameAccidental && previouslyModified)) {\n // Modify the scale map so that the root pitch has an\n // updated state\n scaleMap[key.root + octave] = pitch;\n // Create the accidental\n const accidental = new Accidental(accidentalString);\n // Attach the accidental to the StaveNote\n staveNote.addModifier(accidental, keyIndex);\n // Add the pitch to list of pitches that modified accidentals\n modifiedPitches.push(keyString);\n }\n });\n // process grace notes\n staveNote.getModifiers().forEach((modifier) => {\n if (isGraceNoteGroup(modifier)) {\n modifier.getGraceNotes().forEach(processNote);\n }\n });\n };\n tickables.forEach(processNote);\n });\n }\n reset() {\n const fontScale = this.render_options.font_scale;\n this.glyph = new Glyph(this.accidental.code, fontScale);\n this.glyph.setOriginX(1.0);\n if (this.cautionary) {\n this.parenLeft = new Glyph(Tables.accidentalCodes('{').code, fontScale);\n this.parenRight = new Glyph(Tables.accidentalCodes('}').code, fontScale);\n this.parenLeft.setOriginX(1.0);\n this.parenRight.setOriginX(1.0);\n }\n }\n /** Get width in pixels. */\n getWidth() {\n if (this.cautionary) {\n const parenLeft = defined(this.parenLeft);\n const parenRight = defined(this.parenRight);\n const parenWidth = parenLeft.getMetrics().width +\n parenRight.getMetrics().width +\n this.render_options.parenLeftPadding +\n this.render_options.parenRightPadding;\n return this.glyph.getMetrics().width + parenWidth;\n }\n else {\n return this.glyph.getMetrics().width;\n }\n }\n /** Attach this accidental to `note`, which must be a `StaveNote`. */\n setNote(note) {\n defined(note, 'ArgumentError', `Bad note value: ${note}`);\n this.note = note;\n // Accidentals attached to grace notes are rendered smaller.\n if (isGraceNote(note)) {\n this.render_options.font_scale = 25;\n this.reset();\n }\n return this;\n }\n /** If called, draws parenthesis around accidental. */\n setAsCautionary() {\n this.cautionary = true;\n this.render_options.font_scale = 28;\n this.reset();\n return this;\n }\n /** Render accidental onto canvas. */\n draw() {\n const { type, position, index, cautionary, x_shift, y_shift, glyph, render_options: { parenLeftPadding, parenRightPadding }, } = this;\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n // Figure out the start `x` and `y` coordinates for note and index.\n const start = note.getModifierStartXY(position, index);\n let accX = start.x + x_shift;\n const accY = start.y + y_shift;\n L('Rendering: ', type, accX, accY);\n if (!cautionary) {\n glyph.render(ctx, accX, accY);\n }\n else {\n const parenLeft = defined(this.parenLeft);\n const parenRight = defined(this.parenRight);\n // Render the accidental in parentheses.\n parenRight.render(ctx, accX, accY);\n accX -= parenRight.getMetrics().width;\n accX -= parenRightPadding;\n accX -= this.accidental.parenRightPaddingAdjustment;\n glyph.render(ctx, accX, accY);\n accX -= glyph.getMetrics().width;\n accX -= parenLeftPadding;\n parenLeft.render(ctx, accX, accY);\n }\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Accidental.DEBUG` to `true`. */\nAccidental.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { TextFormatter } from './textformatter';\nimport { Category, isStemmableNote, isTabNote } from './typeguard';\nimport { log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Annotation.DEBUG)\n log('Vex.Flow.Annotation', args);\n}\nexport var AnnotationHorizontalJustify;\n(function (AnnotationHorizontalJustify) {\n AnnotationHorizontalJustify[AnnotationHorizontalJustify[\"LEFT\"] = 1] = \"LEFT\";\n AnnotationHorizontalJustify[AnnotationHorizontalJustify[\"CENTER\"] = 2] = \"CENTER\";\n AnnotationHorizontalJustify[AnnotationHorizontalJustify[\"RIGHT\"] = 3] = \"RIGHT\";\n AnnotationHorizontalJustify[AnnotationHorizontalJustify[\"CENTER_STEM\"] = 4] = \"CENTER_STEM\";\n})(AnnotationHorizontalJustify || (AnnotationHorizontalJustify = {}));\nexport var AnnotationVerticalJustify;\n(function (AnnotationVerticalJustify) {\n AnnotationVerticalJustify[AnnotationVerticalJustify[\"TOP\"] = 1] = \"TOP\";\n AnnotationVerticalJustify[AnnotationVerticalJustify[\"CENTER\"] = 2] = \"CENTER\";\n AnnotationVerticalJustify[AnnotationVerticalJustify[\"BOTTOM\"] = 3] = \"BOTTOM\";\n AnnotationVerticalJustify[AnnotationVerticalJustify[\"CENTER_STEM\"] = 4] = \"CENTER_STEM\";\n})(AnnotationVerticalJustify || (AnnotationVerticalJustify = {}));\n/**\n * Annotations are modifiers that can be attached to\n * notes.\n *\n * See `tests/annotation_tests.ts` for usage examples.\n */\nexport class Annotation extends Modifier {\n /**\n * Annotations inherit from `Modifier` and is positioned correctly when\n * in a `ModifierContext`.\n * Create a new `Annotation` with the string `text`.\n */\n constructor(text) {\n super();\n this.text = text;\n this.horizontalJustification = AnnotationHorizontalJustify.CENTER;\n // warning: the default in the constructor is TOP, but in the factory the default is BOTTOM.\n // this is to support legacy application that may expect this.\n this.verticalJustification = AnnotationVerticalJustify.TOP;\n this.resetFont();\n // The default width is calculated from the text.\n this.setWidth(Tables.textWidth(text));\n }\n /** Annotations category string. */\n static get CATEGORY() {\n return Category.Annotation;\n }\n /** Arrange annotations within a `ModifierContext` */\n static format(annotations, state) {\n if (!annotations || annotations.length === 0)\n return false;\n let width = 0;\n for (let i = 0; i < annotations.length; ++i) {\n const annotation = annotations[i];\n const textFormatter = TextFormatter.create(annotation.textFont);\n // Text height is expressed in fractional stave spaces.\n const textLines = (5 + textFormatter.maxHeight) / Tables.STAVE_LINE_DISTANCE;\n let verticalSpaceNeeded = textLines;\n const note = annotation.checkAttachedNote();\n const stave = note.getStave();\n const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP;\n let stemHeight = 0;\n let lines = 5;\n if (isTabNote(note)) {\n if (note.render_options.draw_stem) {\n const stem = note.getStem();\n if (stem) {\n stemHeight = Math.abs(stem.getHeight()) / Tables.STAVE_LINE_DISTANCE;\n }\n }\n else {\n stemHeight = 0;\n }\n }\n else if (isStemmableNote(note)) {\n const stem = note.getStem();\n if (stem && note.getNoteType() === 'n') {\n stemHeight = Math.abs(stem.getHeight()) / Tables.STAVE_LINE_DISTANCE;\n }\n }\n if (stave) {\n lines = stave.getNumLines();\n }\n // Get the text width from the font metrics.\n const textWidth = textFormatter.getWidthForTextInPx(annotation.text);\n width = Math.max(width, textWidth);\n if (annotation.verticalJustification === this.VerticalJustify.TOP) {\n let noteLine = note.getLineNumber(true);\n if (isTabNote(note)) {\n noteLine = lines - (note.leastString() - 0.5);\n }\n if (stemDirection === Stem.UP) {\n noteLine += stemHeight;\n }\n const curTop = noteLine + state.top_text_line + 0.5;\n if (curTop < lines) {\n annotation.setTextLine(lines - noteLine);\n verticalSpaceNeeded += lines - noteLine;\n state.top_text_line = verticalSpaceNeeded;\n }\n else {\n annotation.setTextLine(state.top_text_line);\n state.top_text_line += verticalSpaceNeeded;\n }\n }\n else if (annotation.verticalJustification === this.VerticalJustify.BOTTOM) {\n let noteLine = lines - note.getLineNumber();\n if (isTabNote(note)) {\n noteLine = note.greatestString() - 1;\n }\n if (stemDirection === Stem.DOWN) {\n noteLine += stemHeight;\n }\n const curBottom = noteLine + state.text_line + 1;\n if (curBottom < lines) {\n annotation.setTextLine(lines - curBottom);\n verticalSpaceNeeded += lines - curBottom;\n state.text_line = verticalSpaceNeeded;\n }\n else {\n annotation.setTextLine(state.text_line);\n state.text_line += verticalSpaceNeeded;\n }\n }\n else {\n annotation.setTextLine(state.text_line);\n }\n }\n state.left_shift += width / 2;\n state.right_shift += width / 2;\n return true;\n }\n /**\n * Set vertical position of text (above or below stave).\n * @param just value in `AnnotationVerticalJustify`.\n */\n setVerticalJustification(just) {\n this.verticalJustification = typeof just === 'string' ? Annotation.VerticalJustifyString[just] : just;\n return this;\n }\n /**\n * Get horizontal justification.\n */\n getJustification() {\n return this.horizontalJustification;\n }\n /**\n * Set horizontal justification.\n * @param justification value in `Annotation.Justify`.\n */\n setJustification(just) {\n this.horizontalJustification = typeof just === 'string' ? Annotation.HorizontalJustifyString[just] : just;\n return this;\n }\n /** Render text beside the note. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP;\n const textFormatter = TextFormatter.create(this.textFont);\n const start = note.getModifierStartXY(ModifierPosition.ABOVE, this.index);\n this.setRendered();\n // We're changing context parameters. Save current state.\n ctx.save();\n const classString = Object.keys(this.getAttribute('classes')).join(' ');\n ctx.openGroup(classString, this.getAttribute('id'));\n ctx.setFont(this.textFont);\n const text_width = ctx.measureText(this.text).width;\n const text_height = textFormatter.maxHeight + 2;\n let x;\n let y;\n if (this.horizontalJustification === AnnotationHorizontalJustify.LEFT) {\n x = start.x;\n }\n else if (this.horizontalJustification === AnnotationHorizontalJustify.RIGHT) {\n x = start.x - text_width;\n }\n else if (this.horizontalJustification === AnnotationHorizontalJustify.CENTER) {\n x = start.x - text_width / 2;\n } /* CENTER_STEM */\n else {\n x = note.getStemX() - text_width / 2;\n }\n let stem_ext = {};\n let spacing = 0;\n const has_stem = note.hasStem();\n const stave = note.checkStave();\n // The position of the text varies based on whether or not the note\n // has a stem.\n if (has_stem) {\n stem_ext = note.checkStem().getExtents();\n spacing = stave.getSpacingBetweenLines();\n }\n if (this.verticalJustification === AnnotationVerticalJustify.BOTTOM) {\n // Use the largest (lowest) Y value\n const ys = note.getYs();\n y = ys.reduce((a, b) => (a > b ? a : b));\n y += (this.text_line + 1) * Tables.STAVE_LINE_DISTANCE + text_height;\n if (has_stem && stemDirection === Stem.DOWN) {\n y = Math.max(y, stem_ext.topY + text_height + spacing * this.text_line);\n }\n }\n else if (this.verticalJustification === AnnotationVerticalJustify.CENTER) {\n const yt = note.getYForTopText(this.text_line) - 1;\n const yb = stave.getYForBottomText(this.text_line);\n y = yt + (yb - yt) / 2 + text_height / 2;\n }\n else if (this.verticalJustification === AnnotationVerticalJustify.TOP) {\n y = note.getYs()[0] - (this.text_line + 1) * Tables.STAVE_LINE_DISTANCE;\n if (has_stem && stemDirection === Stem.UP) {\n // If the stem is above the stave already, go with default line width vs. actual\n // since the lines between don't really matter.\n spacing = stem_ext.topY < stave.getTopLineTopY() ? Tables.STAVE_LINE_DISTANCE : spacing;\n y = Math.min(y, stem_ext.topY - spacing * (this.text_line + 1));\n }\n } /* CENTER_STEM */\n else {\n const extents = note.getStemExtents();\n y = extents.topY + (extents.baseY - extents.topY) / 2 + text_height / 2;\n }\n L('Rendering annotation: ', this.text, x, y);\n ctx.fillText(this.text, x, y);\n ctx.closeGroup();\n ctx.restore();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Annotation.DEBUG` to `true`. */\nAnnotation.DEBUG = false;\nAnnotation.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n/** Text annotations can be positioned and justified relative to the note. */\nAnnotation.HorizontalJustify = AnnotationHorizontalJustify;\nAnnotation.HorizontalJustifyString = {\n left: AnnotationHorizontalJustify.LEFT,\n right: AnnotationHorizontalJustify.RIGHT,\n center: AnnotationHorizontalJustify.CENTER,\n centerStem: AnnotationHorizontalJustify.CENTER_STEM,\n};\nAnnotation.VerticalJustify = AnnotationVerticalJustify;\nAnnotation.VerticalJustifyString = {\n above: AnnotationVerticalJustify.TOP,\n top: AnnotationVerticalJustify.TOP,\n below: AnnotationVerticalJustify.BOTTOM,\n bottom: AnnotationVerticalJustify.BOTTOM,\n center: AnnotationVerticalJustify.CENTER,\n centerStem: AnnotationVerticalJustify.CENTER_STEM,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Larry Kuhns.\n// MIT License\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category, isGraceNote, isStaveNote, isStemmableNote, isTabNote } from './typeguard';\nimport { defined, log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Articulation.DEBUG)\n log('Vex.Flow.Articulation', args);\n}\nconst { ABOVE, BELOW } = Modifier.Position;\nfunction roundToNearestHalf(mathFn, value) {\n return mathFn(value / 0.5) * 0.5;\n}\n// This includes both staff and ledger lines\nfunction isWithinLines(line, position) {\n return position === ABOVE ? line <= 5 : line >= 1;\n}\nfunction getRoundingFunction(line, position) {\n if (isWithinLines(line, position)) {\n if (position === ABOVE) {\n return Math.ceil;\n }\n else {\n return Math.floor;\n }\n }\n else {\n return Math.round;\n }\n}\nfunction snapLineToStaff(canSitBetweenLines, line, position, offsetDirection) {\n // Initially, snap to nearest staff line or space\n const snappedLine = roundToNearestHalf(getRoundingFunction(line, position), line);\n const canSnapToStaffSpace = canSitBetweenLines && isWithinLines(snappedLine, position);\n const onStaffLine = snappedLine % 1 === 0;\n if (canSnapToStaffSpace && onStaffLine) {\n const HALF_STAFF_SPACE = 0.5;\n return snappedLine + HALF_STAFF_SPACE * -offsetDirection;\n }\n else {\n return snappedLine;\n }\n}\n// Helper function for checking if a Note object is either a StaveNote or a GraceNote.\nconst isStaveOrGraceNote = (note) => isStaveNote(note) || isGraceNote(note);\nfunction getTopY(note, textLine) {\n const stemDirection = note.getStemDirection();\n const { topY: stemTipY, baseY: stemBaseY } = note.getStemExtents();\n if (isStaveOrGraceNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return stemTipY;\n }\n else {\n return stemBaseY;\n }\n }\n else {\n return Math.min(...note.getYs());\n }\n }\n else if (isTabNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return stemTipY;\n }\n else {\n return note.checkStave().getYForTopText(textLine);\n }\n }\n else {\n return note.checkStave().getYForTopText(textLine);\n }\n }\n else {\n throw new RuntimeError('UnknownCategory', 'Only can get the top and bottom ys of stavenotes and tabnotes');\n }\n}\nfunction getBottomY(note, textLine) {\n const stemDirection = note.getStemDirection();\n const { topY: stemTipY, baseY: stemBaseY } = note.getStemExtents();\n if (isStaveOrGraceNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return stemBaseY;\n }\n else {\n return stemTipY;\n }\n }\n else {\n return Math.max(...note.getYs());\n }\n }\n else if (isTabNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return note.checkStave().getYForBottomText(textLine);\n }\n else {\n return stemTipY;\n }\n }\n else {\n return note.checkStave().getYForBottomText(textLine);\n }\n }\n else {\n throw new RuntimeError('UnknownCategory', 'Only can get the top and bottom ys of stavenotes and tabnotes');\n }\n}\n/**\n * Get the initial offset of the articulation from the y value of the starting position.\n * This is required because the top/bottom text positions already have spacing applied to\n * provide a \"visually pleasant\" default position. However the y values provided from\n * the stavenote's top/bottom do *not* have any pre-applied spacing. This function\n * normalizes this asymmetry.\n * @param note\n * @param position\n * @returns\n */\nfunction getInitialOffset(note, position) {\n const isOnStemTip = (position === ABOVE && note.getStemDirection() === Stem.UP) ||\n (position === BELOW && note.getStemDirection() === Stem.DOWN);\n if (isStaveOrGraceNote(note)) {\n if (note.hasStem() && isOnStemTip) {\n return 0.5;\n }\n else {\n // this amount is larger than the stem-tip offset because we start from\n // the center of the notehead\n return 1;\n }\n }\n else {\n if (note.hasStem() && isOnStemTip) {\n return 1;\n }\n else {\n return 0;\n }\n }\n}\n/**\n * Articulations and Accents are modifiers that can be\n * attached to notes. The complete list of articulations is available in\n * `tables.ts` under `Vex.Flow.articulationCodes`.\n *\n * See `tests/articulation_tests.ts` for usage examples.\n */\nexport class Articulation extends Modifier {\n /**\n * Create a new articulation.\n * @param type entry in `Vex.Flow.articulationCodes` in `tables.ts`\n */\n constructor(type) {\n super();\n this.type = type;\n this.position = BELOW;\n this.render_options = {\n font_scale: 38,\n };\n this.reset();\n }\n /** Articulations category string. */\n static get CATEGORY() {\n return Category.Articulation;\n }\n /**\n * FIXME:\n * Most of the complex formatting logic (ie: snapping to space) is\n * actually done in .render(). But that logic belongs in this method.\n *\n * Unfortunately, this isn't possible because, by this point, stem lengths\n * have not yet been finalized. Finalized stem lengths are required to determine the\n * initial position of any stem-side articulation.\n *\n * This indicates that all objects should have their stave set before being\n * formatted. It can't be an optional if you want accurate vertical positioning.\n * Consistently positioned articulations that play nice with other modifiers\n * won't be possible until we stop relying on render-time formatting.\n *\n * Ideally, when this function has completed, the vertical articulation positions\n * should be ready to render without further adjustment. But the current state\n * is far from this ideal.\n */\n static format(articulations, state) {\n if (!articulations || articulations.length === 0)\n return false;\n const margin = 0.5;\n const getIncrement = (articulation, line, position) => roundToNearestHalf(getRoundingFunction(line, position), defined(articulation.glyph.getMetrics().height) / 10 + margin);\n articulations.forEach((articulation) => {\n const note = articulation.checkAttachedNote();\n let lines = 5;\n const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP;\n let stemHeight = 0;\n // Decide if we need to consider beam direction in placement.\n if (isStemmableNote(note)) {\n const stem = note.getStem();\n if (stem) {\n stemHeight = Math.abs(stem.getHeight()) / Tables.STAVE_LINE_DISTANCE;\n }\n }\n const stave = note.getStave();\n if (stave) {\n lines = stave.getNumLines();\n }\n if (articulation.getPosition() === ABOVE) {\n let noteLine = note.getLineNumber(true);\n if (stemDirection === Stem.UP) {\n noteLine += stemHeight;\n }\n let increment = getIncrement(articulation, state.top_text_line, ABOVE);\n const curTop = noteLine + state.top_text_line + 0.5;\n // If articulation must be above stave, add lines between note and stave top\n if (!articulation.articulation.between_lines && curTop < lines) {\n increment += lines - curTop;\n }\n articulation.setTextLine(state.top_text_line);\n state.top_text_line += increment;\n }\n else if (articulation.getPosition() === BELOW) {\n let noteLine = Math.max(lines - note.getLineNumber(), 0);\n if (stemDirection === Stem.DOWN) {\n noteLine += stemHeight;\n }\n let increment = getIncrement(articulation, state.text_line, BELOW);\n const curBottom = noteLine + state.text_line + 0.5;\n // if articulation must be below stave, add lines from note to stave bottom\n if (!articulation.articulation.between_lines && curBottom < lines) {\n increment += lines - curBottom;\n }\n articulation.setTextLine(state.text_line);\n state.text_line += increment;\n }\n });\n const width = articulations\n .map((articulation) => articulation.getWidth())\n .reduce((maxWidth, articWidth) => Math.max(articWidth, maxWidth));\n state.left_shift += width / 2;\n state.right_shift += width / 2;\n return true;\n }\n static easyScoreHook({ articulations }, note, builder) {\n if (!articulations)\n return;\n const articNameToCode = {\n staccato: 'a.',\n tenuto: 'a-',\n accent: 'a>',\n };\n articulations\n .split(',')\n .map((articString) => articString.trim().split('.'))\n .map(([name, position]) => {\n const artic = { type: articNameToCode[name] };\n if (position)\n artic.position = Modifier.PositionString[position];\n return builder.getFactory().Articulation(artic);\n })\n .map((artic) => note.addModifier(artic, 0));\n }\n reset() {\n this.articulation = Tables.articulationCodes(this.type);\n const articulation = defined(this.articulation, 'ArgumentError', `Articulation not found: ${this.type}`);\n const code = (this.position === ABOVE ? articulation.aboveCode : articulation.belowCode) || articulation.code;\n this.glyph = new Glyph(code !== null && code !== void 0 ? code : '', this.render_options.font_scale);\n this.setWidth(defined(this.glyph.getMetrics().width));\n }\n /** Render articulation in position next to note. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const index = this.checkIndex();\n const { position, glyph, text_line: textLine } = this;\n const canSitBetweenLines = this.articulation.between_lines;\n const stave = note.checkStave();\n const staffSpace = stave.getSpacingBetweenLines();\n const isTab = isTabNote(note);\n // Articulations are centered over/under the note head.\n const { x } = note.getModifierStartXY(position, index);\n const shouldSitOutsideStaff = !canSitBetweenLines || isTab;\n const initialOffset = getInitialOffset(note, position);\n const padding = Tables.currentMusicFont().lookupMetric(`articulation.${glyph.getCode()}.padding`, 0);\n let y = {\n [ABOVE]: () => {\n glyph.setOrigin(0.5, 1);\n const y = getTopY(note, textLine) - (textLine + initialOffset) * staffSpace;\n return shouldSitOutsideStaff ? Math.min(stave.getYForTopText(Articulation.INITIAL_OFFSET), y) : y;\n },\n [BELOW]: () => {\n glyph.setOrigin(0.5, 0);\n const y = getBottomY(note, textLine) + (textLine + initialOffset) * staffSpace;\n return shouldSitOutsideStaff ? Math.max(stave.getYForBottomText(Articulation.INITIAL_OFFSET), y) : y;\n },\n }[position]();\n if (!isTab) {\n const offsetDirection = position === ABOVE ? -1 : +1;\n const noteLine = note.getKeyProps()[index].line;\n const distanceFromNote = (note.getYs()[index] - y) / staffSpace;\n const articLine = distanceFromNote + Number(noteLine);\n const snappedLine = snapLineToStaff(canSitBetweenLines, articLine, position, offsetDirection);\n if (isWithinLines(snappedLine, position))\n glyph.setOrigin(0.5, 0.5);\n y += Math.abs(snappedLine - articLine) * staffSpace * offsetDirection + padding * offsetDirection;\n }\n L(`Rendering articulation at (x: ${x}, y: ${y})`);\n glyph.render(ctx, x, y);\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Articulation.DEBUG` to `true`. */\nArticulation.DEBUG = false;\nArticulation.INITIAL_OFFSET = -0.5;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Note } from './note';\nimport { Barline, BarlineType } from './stavebarline';\nimport { Category } from './typeguard';\nimport { log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (BarNote.DEBUG)\n log('Vex.Flow.BarNote', args);\n}\n/**\n * A `BarNote` is used to render bar lines (from `barline.ts`). `BarNote`s can\n * be added to a voice and rendered in the middle of a stave. Since it has no\n * duration, it consumes no `tick`s, and is dealt with appropriately by the formatter.\n *\n * See `tests/barnote_tests.ts` for usage examples.\n */\nexport class BarNote extends Note {\n constructor(type = BarlineType.SINGLE) {\n super({ duration: 'b' });\n this.metrics = {\n widths: {},\n };\n const TYPE = BarlineType;\n this.metrics.widths = {\n [TYPE.SINGLE]: 8,\n [TYPE.DOUBLE]: 12,\n [TYPE.END]: 15,\n [TYPE.REPEAT_BEGIN]: 14,\n [TYPE.REPEAT_END]: 14,\n [TYPE.REPEAT_BOTH]: 18,\n [TYPE.NONE]: 0,\n };\n // Tell the formatter that bar notes have no duration.\n this.ignore_ticks = true;\n this.setType(type);\n }\n static get CATEGORY() {\n return Category.BarNote;\n }\n /** Get the type of bar note.*/\n getType() {\n return this.type;\n }\n /** Set the type of bar note. */\n setType(type) {\n this.type = typeof type === 'string' ? Barline.typeString[type] : type;\n // Set width to width of relevant `Barline`.\n this.setWidth(this.metrics.widths[this.type]);\n return this;\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n /** Overridden to ignore. */\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n /** Render note to stave. */\n draw() {\n const ctx = this.checkContext();\n L('Rendering bar line at: ', this.getAbsoluteX());\n if (this.style)\n this.applyStyle(ctx);\n const barline = new Barline(this.type);\n barline.setX(this.getAbsoluteX());\n barline.draw(this.checkStave());\n if (this.style)\n this.restoreStyle(ctx);\n this.setRendered();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.BarNote.DEBUG` to `true`. */\nBarNote.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Fraction } from './fraction';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { TupletLocation } from './tuplet';\nimport { Category, isStaveNote, isTabNote } from './typeguard';\nimport { RuntimeError } from './util';\nfunction calculateStemDirection(notes) {\n let lineSum = 0;\n notes.forEach((note) => {\n if (note.keyProps) {\n note.keyProps.forEach((keyProp) => {\n lineSum += keyProp.line - 3;\n });\n }\n });\n if (lineSum >= 0) {\n return Stem.DOWN;\n }\n return Stem.UP;\n}\nfunction getStemSlope(firstNote, lastNote) {\n const firstStemTipY = firstNote.getStemExtents().topY;\n const firstStemX = firstNote.getStemX();\n const lastStemTipY = lastNote.getStemExtents().topY;\n const lastStemX = lastNote.getStemX();\n return (lastStemTipY - firstStemTipY) / (lastStemX - firstStemX);\n}\nconst BEAM_LEFT = 'L';\nconst BEAM_RIGHT = 'R';\nconst BEAM_BOTH = 'B';\n/** `Beams` span over a set of `StemmableNotes`. */\nexport class Beam extends Element {\n constructor(notes, auto_stem = false) {\n super();\n this.slope = 0;\n this.y_shift = 0;\n if (!notes || notes.length === 0) {\n throw new RuntimeError('BadArguments', 'No notes provided for beam.');\n }\n if (notes.length === 1) {\n throw new RuntimeError('BadArguments', 'Too few notes for beam.');\n }\n // Validate beam line, direction and ticks.\n this.ticks = notes[0].getIntrinsicTicks();\n if (this.ticks >= Tables.durationToTicks('4')) {\n throw new RuntimeError('BadArguments', 'Beams can only be applied to notes shorter than a quarter note.');\n }\n let i; // shared iterator\n let note;\n this.stem_direction = Stem.UP;\n for (i = 0; i < notes.length; ++i) {\n note = notes[i];\n if (note.hasStem()) {\n this.stem_direction = note.getStemDirection();\n break;\n }\n }\n let stem_direction = this.stem_direction;\n // Figure out optimal stem direction based on given notes\n if (auto_stem && isStaveNote(notes[0])) {\n stem_direction = calculateStemDirection(notes);\n }\n else if (auto_stem && isTabNote(notes[0])) {\n // Auto Stem TabNotes\n const stem_weight = notes.reduce((memo, note) => memo + note.getStemDirection(), 0);\n stem_direction = stem_weight > -1 ? Stem.UP : Stem.DOWN;\n }\n // Apply stem directions and attach beam to notes\n for (i = 0; i < notes.length; ++i) {\n note = notes[i];\n if (auto_stem) {\n note.setStemDirection(stem_direction);\n this.stem_direction = stem_direction;\n }\n note.setBeam(this);\n }\n this.postFormatted = false;\n this.notes = notes;\n this.beam_count = this.getBeamCount();\n this.break_on_indices = [];\n this.render_options = {\n beam_width: 5,\n max_slope: 0.25,\n min_slope: -0.25,\n slope_iterations: 20,\n slope_cost: 100,\n show_stemlets: false,\n stemlet_extension: 7,\n partial_beam_length: 10,\n flat_beams: false,\n min_flat_beam_offset: 15,\n };\n }\n static get CATEGORY() {\n return Category.Beam;\n }\n /** Get the direction of the beam */\n getStemDirection() {\n return this.stem_direction;\n }\n /**\n * Get the default beam groups for a provided time signature.\n * Attempt to guess if the time signature is not found in table.\n * Currently this is fairly naive.\n */\n static getDefaultBeamGroups(time_sig) {\n if (!time_sig || time_sig === 'c') {\n time_sig = '4/4';\n }\n const defaults = {\n '1/2': ['1/2'],\n '2/2': ['1/2'],\n '3/2': ['1/2'],\n '4/2': ['1/2'],\n '1/4': ['1/4'],\n '2/4': ['1/4'],\n '3/4': ['1/4'],\n '4/4': ['1/4'],\n '1/8': ['1/8'],\n '2/8': ['2/8'],\n '3/8': ['3/8'],\n '4/8': ['2/8'],\n '1/16': ['1/16'],\n '2/16': ['2/16'],\n '3/16': ['3/16'],\n '4/16': ['2/16'],\n };\n const groups = defaults[time_sig];\n if (groups === undefined) {\n // If no beam groups found, naively determine\n // the beam groupings from the time signature\n const beatTotal = parseInt(time_sig.split('/')[0], 10);\n const beatValue = parseInt(time_sig.split('/')[1], 10);\n const tripleMeter = beatTotal % 3 === 0;\n if (tripleMeter) {\n return [new Fraction(3, beatValue)];\n }\n else if (beatValue > 4) {\n return [new Fraction(2, beatValue)];\n }\n else if (beatValue <= 4) {\n return [new Fraction(1, beatValue)];\n }\n }\n else {\n return groups.map((group) => new Fraction().parse(group));\n }\n return [new Fraction(1, 4)];\n }\n /**\n * A helper function to automatically build basic beams for a voice. For more\n * complex auto-beaming use `Beam.generateBeams()`.\n * @param voice the voice to generate the beams for\n * @param stem_direction a stem direction to apply to the entire voice\n * @param groups an array of `Fraction` representing beat groupings for the beam\n */\n static applyAndGetBeams(voice, stem_direction, groups) {\n return Beam.generateBeams(voice.getTickables(), { groups, stem_direction });\n }\n /**\n * A helper function to autimatically build beams for a voice with\n * configuration options.\n *\n * Example configuration object:\n *\n * ```\n * config = {\n * groups: [new Vex.Flow.Fraction(2, 8)],\n * stem_direction: -1,\n * beam_rests: true,\n * beam_middle_only: true,\n * show_stemlets: false\n * };\n * ```\n * @param notes an array of notes to create the beams for\n * @param config the configuration object\n * @param config.stem_direction set to apply the same direction to all notes\n * @param config.beam_rests set to `true` to include rests in the beams\n * @param config.beam_middle_only set to `true` to only beam rests in the middle of the beat\n * @param config.show_stemlets set to `true` to draw stemlets for rests\n * @param config.maintain_stem_directions set to `true` to not apply new stem directions\n * @param config.groups array of `Fractions` that represent the beat structure to beam the notes\n *\n */\n static generateBeams(notes, config = {}) {\n if (!config.groups || !config.groups.length) {\n config.groups = [new Fraction(2, 8)];\n }\n // Convert beam groups to tick amounts\n const tickGroups = config.groups.map((group) => {\n if (!group.multiply) {\n throw new RuntimeError('InvalidBeamGroups', 'The beam groups must be an array of Vex.Flow.Fractions');\n }\n return group.clone().multiply(Tables.RESOLUTION, 1);\n });\n const unprocessedNotes = notes;\n let currentTickGroup = 0;\n let noteGroups = [];\n let currentGroup = [];\n function getTotalTicks(vf_notes) {\n return vf_notes.reduce((memo, note) => note.getTicks().clone().add(memo), new Fraction(0, 1));\n }\n function nextTickGroup() {\n if (tickGroups.length - 1 > currentTickGroup) {\n currentTickGroup += 1;\n }\n else {\n currentTickGroup = 0;\n }\n }\n function createGroups() {\n let nextGroup = [];\n // number of ticks in current group\n let currentGroupTotalTicks = new Fraction(0, 1);\n unprocessedNotes.forEach((unprocessedNote) => {\n nextGroup = [];\n if (unprocessedNote.shouldIgnoreTicks()) {\n noteGroups.push(currentGroup);\n currentGroup = nextGroup;\n return; // Ignore untickables (like bar notes)\n }\n currentGroup.push(unprocessedNote);\n const ticksPerGroup = tickGroups[currentTickGroup].clone();\n const totalTicks = getTotalTicks(currentGroup).add(currentGroupTotalTicks);\n // Double the amount of ticks in a group, if it's an unbeamable tuplet\n const unbeamable = Tables.durationToNumber(unprocessedNote.getDuration()) < 8;\n if (unbeamable && unprocessedNote.getTuplet()) {\n ticksPerGroup.numerator *= 2;\n }\n // If the note that was just added overflows the group tick total\n if (totalTicks.greaterThan(ticksPerGroup)) {\n // If the overflow note can be beamed, start the next group\n // with it. Unbeamable notes leave the group overflowed.\n if (!unbeamable) {\n const note = currentGroup.pop();\n if (note)\n nextGroup.push(note);\n }\n noteGroups.push(currentGroup);\n // We have overflown, so we're going to next tick group. As we might have\n // overflown by more than 1 group, we need to go forward as many times as\n // needed, decreasing currentGroupTotalTicks by as many ticks as there are\n // in current groups as we go forward.\n do {\n currentGroupTotalTicks = totalTicks.subtract(tickGroups[currentTickGroup]);\n nextTickGroup();\n } while (currentGroupTotalTicks.greaterThanEquals(tickGroups[currentTickGroup]));\n currentGroup = nextGroup;\n }\n else if (totalTicks.equals(ticksPerGroup)) {\n noteGroups.push(currentGroup);\n currentGroupTotalTicks = new Fraction(0, 1);\n currentGroup = nextGroup;\n nextTickGroup();\n }\n });\n // Adds any remainder notes beam\n if (currentGroup.length > 0) {\n noteGroups.push(currentGroup);\n }\n }\n function getBeamGroups() {\n return noteGroups.filter((group) => {\n if (group.length > 1) {\n let beamable = true;\n group.forEach((note) => {\n if (note.getIntrinsicTicks() >= Tables.durationToTicks('4')) {\n beamable = false;\n }\n });\n return beamable;\n }\n return false;\n });\n }\n // Splits up groups by Rest\n function sanitizeGroups() {\n const sanitizedGroups = [];\n noteGroups.forEach((group) => {\n let tempGroup = [];\n group.forEach((note, index, group) => {\n const isFirstOrLast = index === 0 || index === group.length - 1;\n const prevNote = group[index - 1];\n const breaksOnEachRest = !config.beam_rests && note.isRest();\n const breaksOnFirstOrLastRest = config.beam_rests && config.beam_middle_only && note.isRest() && isFirstOrLast;\n let breakOnStemChange = false;\n if (config.maintain_stem_directions && prevNote && !note.isRest() && !prevNote.isRest()) {\n const prevDirection = prevNote.getStemDirection();\n const currentDirection = note.getStemDirection();\n breakOnStemChange = currentDirection !== prevDirection;\n }\n const isUnbeamableDuration = parseInt(note.getDuration(), 10) < 8;\n // Determine if the group should be broken at this note\n const shouldBreak = breaksOnEachRest || breaksOnFirstOrLastRest || breakOnStemChange || isUnbeamableDuration;\n if (shouldBreak) {\n // Add current group\n if (tempGroup.length > 0) {\n sanitizedGroups.push(tempGroup);\n }\n // Start a new group. Include the current note if the group\n // was broken up by stem direction, as that note needs to start\n // the next group of notes\n tempGroup = breakOnStemChange ? [note] : [];\n }\n else {\n // Add note to group\n tempGroup.push(note);\n }\n });\n // If there is a remaining group, add it as well\n if (tempGroup.length > 0) {\n sanitizedGroups.push(tempGroup);\n }\n });\n noteGroups = sanitizedGroups;\n }\n function formatStems() {\n noteGroups.forEach((group) => {\n let stemDirection;\n if (config.maintain_stem_directions) {\n const note = findFirstNote(group);\n stemDirection = note ? note.getStemDirection() : Stem.UP;\n }\n else {\n if (config.stem_direction) {\n stemDirection = config.stem_direction;\n }\n else {\n stemDirection = calculateStemDirection(group);\n }\n }\n applyStemDirection(group, stemDirection);\n });\n }\n function findFirstNote(group) {\n for (let i = 0; i < group.length; i++) {\n const note = group[i];\n if (!note.isRest()) {\n return note;\n }\n }\n return false;\n }\n function applyStemDirection(group, direction) {\n group.forEach((note) => {\n note.setStemDirection(direction);\n });\n }\n // Get all of the tuplets in all of the note groups\n function getTuplets() {\n const uniqueTuplets = [];\n // Go through all of the note groups and inspect for tuplets\n noteGroups.forEach((group) => {\n let tuplet;\n group.forEach((note) => {\n const noteTuplet = note.getTuplet();\n if (noteTuplet && tuplet !== noteTuplet) {\n tuplet = noteTuplet;\n uniqueTuplets.push(tuplet);\n }\n });\n });\n return uniqueTuplets;\n }\n // Using closures to store the variables throughout the various functions\n // IMO Keeps it this process lot cleaner - but not super consistent with\n // the rest of the API's style - Silverwolf90 (Cyril)\n createGroups();\n sanitizeGroups();\n formatStems();\n // Get the notes to be beamed\n const beamedNoteGroups = getBeamGroups();\n // Get the tuplets in order to format them accurately\n const allTuplets = getTuplets();\n // Create a Vex.Flow.Beam from each group of notes to be beamed\n const beams = [];\n beamedNoteGroups.forEach((group) => {\n const beam = new Beam(group);\n if (config.show_stemlets) {\n beam.render_options.show_stemlets = true;\n }\n if (config.secondary_breaks) {\n beam.render_options.secondary_break_ticks = Tables.durationToTicks(config.secondary_breaks);\n }\n if (config.flat_beams === true) {\n beam.render_options.flat_beams = true;\n beam.render_options.flat_beam_offset = config.flat_beam_offset;\n }\n beams.push(beam);\n });\n // Reformat tuplets\n allTuplets.forEach((tuplet) => {\n // Set the tuplet location based on the stem direction\n const direction = tuplet.notes[0].stem_direction === Stem.DOWN ? TupletLocation.BOTTOM : TupletLocation.TOP;\n tuplet.setTupletLocation(direction);\n // If any of the notes in the tuplet are not beamed, draw a bracket.\n let bracketed = false;\n for (let i = 0; i < tuplet.notes.length; i++) {\n const note = tuplet.notes[i];\n if (!note.hasBeam()) {\n bracketed = true;\n break;\n }\n }\n tuplet.setBracketed(bracketed);\n });\n return beams;\n }\n /** Get the notes in this beam. */\n getNotes() {\n return this.notes;\n }\n /** Get the max number of beams in the set of notes. */\n getBeamCount() {\n const beamCounts = this.notes.map((note) => note.getGlyph().beam_count);\n const maxBeamCount = beamCounts.reduce((max, beamCount) => (beamCount > max ? beamCount : max));\n return maxBeamCount;\n }\n /** Set which note `indices` to break the secondary beam at. */\n breakSecondaryAt(indices) {\n this.break_on_indices = indices;\n return this;\n }\n /** Return the y coordinate for linear function. */\n getSlopeY(x, first_x_px, first_y_px, slope) {\n return first_y_px + (x - first_x_px) * slope;\n }\n /** Calculate the best possible slope for the provided notes. */\n calculateSlope() {\n const { notes, stem_direction: stemDirection, render_options: { max_slope, min_slope, slope_iterations, slope_cost }, } = this;\n const firstNote = notes[0];\n const initialSlope = getStemSlope(firstNote, notes[notes.length - 1]);\n const increment = (max_slope - min_slope) / slope_iterations;\n let minCost = Number.MAX_VALUE;\n let bestSlope = 0;\n let yShift = 0;\n // iterate through slope values to find best weighted fit\n for (let slope = min_slope; slope <= max_slope; slope += increment) {\n let totalStemExtension = 0;\n let yShiftTemp = 0;\n // iterate through notes, calculating y shift and stem extension\n for (let i = 1; i < notes.length; ++i) {\n const note = notes[i];\n if (note.hasStem() || note.isRest()) {\n const adjustedStemTipY = this.getSlopeY(note.getStemX(), firstNote.getStemX(), firstNote.getStemExtents().topY, slope) + yShiftTemp;\n const stemTipY = note.getStemExtents().topY;\n // beam needs to be shifted up to accommodate note\n if (stemTipY * stemDirection < adjustedStemTipY * stemDirection) {\n const diff = Math.abs(stemTipY - adjustedStemTipY);\n yShiftTemp += diff * -stemDirection;\n totalStemExtension += diff * i;\n }\n else {\n // beam overshoots note, account for the difference\n totalStemExtension += (stemTipY - adjustedStemTipY) * stemDirection;\n }\n }\n }\n // most engraving books suggest aiming for a slope about half the angle of the\n // difference between the first and last notes' stem length;\n const idealSlope = initialSlope / 2;\n const distanceFromIdeal = Math.abs(idealSlope - slope);\n // This tries to align most beams to something closer to the idealSlope, but\n // doesn't go crazy. To disable, set this.render_options.slope_cost = 0\n const cost = slope_cost * distanceFromIdeal + Math.abs(totalStemExtension);\n // update state when a more ideal slope is found\n if (cost < minCost) {\n minCost = cost;\n bestSlope = slope;\n yShift = yShiftTemp;\n }\n }\n this.slope = bestSlope;\n this.y_shift = yShift;\n }\n /** Calculate a slope and y-shift for flat beams. */\n calculateFlatSlope() {\n const { notes, stem_direction, render_options: { beam_width, min_flat_beam_offset, flat_beam_offset }, } = this;\n // If a flat beam offset has not yet been supplied or calculated,\n // generate one based on the notes in this particular note group\n let total = 0;\n let extremeY = 0; // Store the highest or lowest note here\n let extremeBeamCount = 0; // The beam count of the extreme note\n let currentExtreme = 0;\n for (let i = 0; i < notes.length; i++) {\n // Total up all of the offsets so we can average them out later\n const note = notes[i];\n const stemTipY = note.getStemExtents().topY;\n total += stemTipY;\n // Store the highest (stems-up) or lowest (stems-down) note so the\n // offset can be adjusted in case the average isn't enough\n if (stem_direction === Stem.DOWN && currentExtreme < stemTipY) {\n currentExtreme = stemTipY;\n extremeY = Math.max(...note.getYs());\n extremeBeamCount = note.getBeamCount();\n }\n else if (stem_direction === Stem.UP && (currentExtreme === 0 || currentExtreme > stemTipY)) {\n currentExtreme = stemTipY;\n extremeY = Math.min(...note.getYs());\n extremeBeamCount = note.getBeamCount();\n }\n }\n // Average the offsets to try and come up with a reasonable one that\n // works for all of the notes in the beam group.\n let offset = total / notes.length;\n // In case the average isn't long enough, add or subtract some more\n // based on the highest or lowest note (again, based on the stem\n // direction). This also takes into account the added height due to\n // the width of the beams.\n const beamWidth = beam_width * 1.5;\n const extremeTest = min_flat_beam_offset + extremeBeamCount * beamWidth;\n const newOffset = extremeY + extremeTest * -stem_direction;\n if (stem_direction === Stem.DOWN && offset < newOffset) {\n offset = extremeY + extremeTest;\n }\n else if (stem_direction === Stem.UP && offset > newOffset) {\n offset = extremeY - extremeTest;\n }\n if (!flat_beam_offset) {\n // Set the offset for the group based on the calculations above.\n this.render_options.flat_beam_offset = offset;\n }\n else if (stem_direction === Stem.DOWN && offset > flat_beam_offset) {\n this.render_options.flat_beam_offset = offset;\n }\n else if (stem_direction === Stem.UP && offset < flat_beam_offset) {\n this.render_options.flat_beam_offset = offset;\n }\n // for flat beams, the slope and y_shift are simply 0\n this.slope = 0;\n this.y_shift = 0;\n }\n /** Return the Beam y offset. */\n getBeamYToDraw() {\n const firstNote = this.notes[0];\n const firstStemTipY = firstNote.getStemExtents().topY;\n let beamY = firstStemTipY;\n // For flat beams, set the first and last Y to the offset, rather than\n // using the note's stem extents.\n if (this.render_options.flat_beams && this.render_options.flat_beam_offset) {\n beamY = this.render_options.flat_beam_offset;\n }\n return beamY;\n }\n /**\n * Create new stems for the notes in the beam, so that each stem\n * extends into the beams.\n */\n applyStemExtensions() {\n const { notes, slope, y_shift, stem_direction, beam_count, render_options: { show_stemlets, stemlet_extension, beam_width }, } = this;\n const firstNote = notes[0];\n const firstStemTipY = this.getBeamYToDraw();\n const firstStemX = firstNote.getStemX();\n for (let i = 0; i < notes.length; ++i) {\n const note = notes[i];\n const stem = note.getStem();\n if (stem) {\n const stemX = note.getStemX();\n const { topY: stemTipY } = note.getStemExtents();\n const beamedStemTipY = this.getSlopeY(stemX, firstStemX, firstStemTipY, slope) + y_shift;\n const preBeamExtension = stem.getExtension();\n const beamExtension = stem_direction === Stem.UP ? stemTipY - beamedStemTipY : beamedStemTipY - stemTipY;\n stem.setExtension(preBeamExtension + beamExtension);\n stem.adjustHeightForBeam();\n if (note.isRest() && show_stemlets) {\n const beamWidth = beam_width;\n const totalBeamWidth = (beam_count - 1) * beamWidth * 1.5 + beamWidth;\n stem.setVisibility(true).setStemlet(true, totalBeamWidth + stemlet_extension);\n }\n }\n }\n }\n /** Return upper level beam direction. */\n lookupBeamDirection(duration, prev_tick, tick, next_tick) {\n if (duration === '4') {\n return BEAM_LEFT;\n }\n const lookup_duration = `${Tables.durationToNumber(duration) / 2}`;\n const prev_note_gets_beam = prev_tick < Tables.durationToTicks(lookup_duration);\n const next_note_gets_beam = next_tick < Tables.durationToTicks(lookup_duration);\n const note_gets_beam = tick < Tables.durationToTicks(lookup_duration);\n if (prev_note_gets_beam && next_note_gets_beam && note_gets_beam) {\n return BEAM_BOTH;\n }\n else if (prev_note_gets_beam && !next_note_gets_beam && note_gets_beam) {\n return BEAM_LEFT;\n }\n else if (!prev_note_gets_beam && next_note_gets_beam && note_gets_beam) {\n return BEAM_RIGHT;\n }\n return this.lookupBeamDirection(lookup_duration, prev_tick, tick, next_tick);\n }\n /** Get the x coordinates for the beam lines of specific `duration`. */\n getBeamLines(duration) {\n const tick_of_duration = Tables.durationToTicks(duration);\n let beam_started = false;\n const beam_lines = [];\n let current_beam = undefined;\n const partial_beam_length = this.render_options.partial_beam_length;\n let previous_should_break = false;\n let tick_tally = 0;\n for (let i = 0; i < this.notes.length; ++i) {\n const note = this.notes[i];\n // See if we need to break secondary beams on this note.\n const ticks = note.getTicks().value();\n tick_tally += ticks;\n let should_break = false;\n // 8th note beams are always drawn.\n if (parseInt(duration, 10) >= 8) {\n // First, check to see if any indices were set up through breakSecondaryAt()\n should_break = this.break_on_indices.indexOf(i) !== -1;\n // If the secondary breaks were auto-configured in the render options,\n // handle that as well.\n if (this.render_options.secondary_break_ticks && tick_tally >= this.render_options.secondary_break_ticks) {\n tick_tally = 0;\n should_break = true;\n }\n }\n const note_gets_beam = note.getIntrinsicTicks() < tick_of_duration;\n const stem_x = note.getStemX() - Stem.WIDTH / 2;\n // Check to see if the next note in the group will get a beam at this\n // level. This will help to inform the partial beam logic below.\n const prev_note = this.notes[i - 1];\n const next_note = this.notes[i + 1];\n const next_note_gets_beam = next_note && next_note.getIntrinsicTicks() < tick_of_duration;\n const prev_note_gets_beam = prev_note && prev_note.getIntrinsicTicks() < tick_of_duration;\n const beam_alone = prev_note && next_note && note_gets_beam && !prev_note_gets_beam && !next_note_gets_beam;\n // const beam_alone = note_gets_beam && !prev_note_gets_beam && !next_note_gets_beam;\n if (note_gets_beam) {\n // This note gets a beam at the current level\n if (beam_started) {\n // We're currently in the middle of a beam. Just continue it on to\n // the stem X of the current note.\n current_beam = beam_lines[beam_lines.length - 1];\n current_beam.end = stem_x;\n // If a secondary beam break is set up, end the beam right now.\n if (should_break) {\n beam_started = false;\n if (next_note && !next_note_gets_beam && current_beam.end === undefined) {\n // This note gets a beam,.but the next one does not. This means\n // we need a partial pointing right.\n current_beam.end = current_beam.start - partial_beam_length;\n }\n }\n }\n else {\n // No beam started yet. Start a new one.\n current_beam = { start: stem_x, end: undefined };\n beam_started = true;\n if (beam_alone) {\n // previous and next beam exists and does not get a beam but current gets it.\n const prev_tick = prev_note.getIntrinsicTicks();\n const next_tick = next_note.getIntrinsicTicks();\n const tick = note.getIntrinsicTicks();\n const beam_direction = this.lookupBeamDirection(duration, prev_tick, tick, next_tick);\n if ([BEAM_LEFT, BEAM_BOTH].includes(beam_direction)) {\n current_beam.end = current_beam.start - partial_beam_length;\n }\n else {\n current_beam.end = current_beam.start + partial_beam_length;\n }\n }\n else if (!next_note_gets_beam) {\n // The next note doesn't get a beam. Draw a partial.\n if ((previous_should_break || i === 0) && next_note) {\n // This is the first note (but not the last one), or it is\n // following a secondary break. Draw a partial to the right.\n current_beam.end = current_beam.start + partial_beam_length;\n }\n else {\n // By default, draw a partial to the left.\n current_beam.end = current_beam.start - partial_beam_length;\n }\n }\n else if (should_break) {\n // This note should have a secondary break after it. Even though\n // we just started a beam, it needs to end immediately.\n current_beam.end = current_beam.start - partial_beam_length;\n beam_started = false;\n }\n beam_lines.push(current_beam);\n }\n }\n else {\n // The current note does not get a beam.\n beam_started = false;\n }\n // Store the secondary break flag to inform the partial beam logic in\n // the next iteration of the loop.\n previous_should_break = should_break;\n }\n // Add a partial beam pointing left if this is the last note in the group\n const last_beam = beam_lines[beam_lines.length - 1];\n if (last_beam && last_beam.end === undefined) {\n last_beam.end = last_beam.start - partial_beam_length;\n }\n return beam_lines;\n }\n /** Render the stems for each note. */\n drawStems(ctx) {\n this.notes.forEach((note) => {\n const stem = note.getStem();\n if (stem) {\n stem.setContext(ctx).draw();\n }\n }, this);\n }\n // Render the beam lines\n drawBeamLines(ctx) {\n const valid_beam_durations = ['4', '8', '16', '32', '64'];\n const firstNote = this.notes[0];\n let beamY = this.getBeamYToDraw();\n const firstStemX = firstNote.getStemX();\n const beamThickness = this.render_options.beam_width * this.stem_direction;\n // Draw the beams.\n for (let i = 0; i < valid_beam_durations.length; ++i) {\n const duration = valid_beam_durations[i];\n const beamLines = this.getBeamLines(duration);\n for (let j = 0; j < beamLines.length; ++j) {\n const beam_line = beamLines[j];\n const startBeamX = beam_line.start;\n const startBeamY = this.getSlopeY(startBeamX, firstStemX, beamY, this.slope);\n const lastBeamX = beam_line.end;\n if (lastBeamX) {\n const lastBeamY = this.getSlopeY(lastBeamX, firstStemX, beamY, this.slope);\n ctx.beginPath();\n ctx.moveTo(startBeamX, startBeamY);\n ctx.lineTo(startBeamX, startBeamY + beamThickness);\n ctx.lineTo(lastBeamX + 1, lastBeamY + beamThickness);\n ctx.lineTo(lastBeamX + 1, lastBeamY);\n ctx.closePath();\n ctx.fill();\n }\n else {\n throw new RuntimeError('NoLastBeamX', 'lastBeamX undefined.');\n }\n }\n beamY += beamThickness * 1.5;\n }\n }\n /** Pre-format the beam. */\n preFormat() {\n return this;\n }\n /**\n * Post-format the beam. This can only be called after\n * the notes in the beam have both `x` and `y` values. ie: they've\n * been formatted and have staves.\n */\n postFormat() {\n if (this.postFormatted)\n return;\n // Calculate a smart slope if we're not forcing the beams to be flat.\n if (isTabNote(this.notes[0]) || this.render_options.flat_beams) {\n this.calculateFlatSlope();\n }\n else {\n this.calculateSlope();\n }\n this.applyStemExtensions();\n this.postFormatted = true;\n }\n /** Render the beam to the canvas context */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n if (this.unbeamable)\n return;\n if (!this.postFormatted) {\n this.postFormat();\n }\n this.drawStems(ctx);\n this.applyStyle();\n this.drawBeamLines(ctx);\n this.restoreStyle();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Modifier } from './modifier';\nimport { TextFormatter } from './textformatter';\nimport { Category, isTabNote } from './typeguard';\nimport { RuntimeError } from './util';\n/** Bend implements tablature bends. */\nexport class Bend extends Modifier {\n /**\n * Example of a phrase:\n * ```\n * [{\n * type: UP,\n * text: \"whole\"\n * width: 8;\n * },\n * {\n * type: DOWN,\n * text: \"whole\"\n * width: 8;\n * },\n * {\n * type: UP,\n * text: \"half\"\n * width: 8;\n * },\n * {\n * type: UP,\n * text: \"whole\"\n * width: 8;\n * },\n * {\n * type: DOWN,\n * text: \"1 1/2\"\n * width: 8;\n * }]\n * ```\n * @param text text for bend (\"Full\", \"Half\", etc.) (DEPRECATED)\n * @param release if true, render a release. (DEPRECATED)\n * @param phrase if set, ignore \"text\" and \"release\", and use the more sophisticated phrase specified\n */\n constructor(text, release = false, phrase) {\n super();\n this.text = text;\n this.x_shift = 0;\n this.release = release;\n this.tap = '';\n this.resetFont();\n this.render_options = {\n line_width: 1.5,\n line_style: '#777777',\n bend_width: 8,\n release_width: 8,\n };\n if (phrase) {\n this.phrase = phrase;\n }\n else {\n // Backward compatibility\n this.phrase = [{ type: Bend.UP, text: this.text }];\n if (this.release)\n this.phrase.push({ type: Bend.DOWN, text: '' });\n }\n this.updateWidth();\n }\n static get CATEGORY() {\n return Category.Bend;\n }\n static get UP() {\n return 0;\n }\n static get DOWN() {\n return 1;\n }\n // Arrange bends in `ModifierContext`\n static format(bends, state) {\n if (!bends || bends.length === 0)\n return false;\n let last_width = 0;\n // Format Bends\n for (let i = 0; i < bends.length; ++i) {\n const bend = bends[i];\n const note = bend.checkAttachedNote();\n if (isTabNote(note)) {\n const stringPos = note.leastString() - 1;\n if (state.top_text_line < stringPos) {\n state.top_text_line = stringPos;\n }\n }\n bend.setXShift(last_width);\n last_width = bend.getWidth();\n bend.setTextLine(state.top_text_line);\n }\n state.right_shift += last_width;\n state.top_text_line += 1;\n return true;\n }\n /** Set horizontal shift in pixels. */\n setXShift(value) {\n this.x_shift = value;\n this.updateWidth();\n return this;\n }\n setTap(value) {\n this.tap = value;\n return this;\n }\n /** Get text provided in the constructor. */\n getText() {\n return this.text;\n }\n getTextHeight() {\n const textFormatter = TextFormatter.create(this.textFont);\n return textFormatter.maxHeight;\n }\n /** Recalculate width. */\n updateWidth() {\n const textFormatter = TextFormatter.create(this.textFont);\n const measureText = (text) => {\n return textFormatter.getWidthForTextInPx(text);\n };\n let totalWidth = 0;\n for (let i = 0; i < this.phrase.length; ++i) {\n const bend = this.phrase[i];\n if (bend.width !== undefined) {\n totalWidth += bend.width;\n }\n else {\n const additional_width = bend.type === Bend.UP ? this.render_options.bend_width : this.render_options.release_width;\n bend.width = Math.max(additional_width, measureText(bend.text)) + 3;\n bend.draw_width = bend.width / 2;\n totalWidth += bend.width;\n }\n }\n this.setWidth(totalWidth + this.x_shift);\n return this;\n }\n /** Draw the bend on the rendering context. */\n draw() {\n var _a;\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(Modifier.Position.RIGHT, this.index);\n start.x += 3;\n start.y += 0.5;\n const x_shift = this.x_shift;\n const stave = note.checkStave();\n const spacing = stave.getSpacingBetweenLines();\n const lowestY = note.getYs().reduce((a, b) => (a < b ? a : b));\n // this.text_line is relative to top string in the group.\n const bend_height = start.y - ((this.text_line + 1) * spacing + start.y - lowestY) + 3;\n const annotation_y = start.y - ((this.text_line + 1) * spacing + start.y - lowestY) - 1;\n const renderBend = (x, y, width, height) => {\n const cp_x = x + width;\n const cp_y = y;\n ctx.save();\n ctx.beginPath();\n ctx.setLineWidth(this.render_options.line_width);\n ctx.setStrokeStyle(this.render_options.line_style);\n ctx.setFillStyle(this.render_options.line_style);\n ctx.moveTo(x, y);\n ctx.quadraticCurveTo(cp_x, cp_y, x + width, height);\n ctx.stroke();\n ctx.restore();\n };\n const renderRelease = (x, y, width, height) => {\n ctx.save();\n ctx.beginPath();\n ctx.setLineWidth(this.render_options.line_width);\n ctx.setStrokeStyle(this.render_options.line_style);\n ctx.setFillStyle(this.render_options.line_style);\n ctx.moveTo(x, height);\n ctx.quadraticCurveTo(x + width, height, x + width, y);\n ctx.stroke();\n ctx.restore();\n };\n const renderArrowHead = (x, y, direction) => {\n const width = 4;\n const yBase = y + width * direction;\n ctx.beginPath();\n ctx.moveTo(x, y); // tip of the arrow\n ctx.lineTo(x - width, yBase);\n ctx.lineTo(x + width, yBase);\n ctx.closePath();\n ctx.fill();\n };\n const renderText = (x, text) => {\n ctx.save();\n ctx.setFont(this.textFont);\n const render_x = x - ctx.measureText(text).width / 2;\n ctx.fillText(text, render_x, annotation_y);\n ctx.restore();\n };\n let last_bend = undefined;\n let last_bend_draw_width = 0;\n let last_drawn_width = 0;\n if ((_a = this.tap) === null || _a === void 0 ? void 0 : _a.length) {\n const tapStart = note.getModifierStartXY(Modifier.Position.CENTER, this.index);\n renderText(tapStart.x, this.tap);\n }\n for (let i = 0; i < this.phrase.length; ++i) {\n const bend = this.phrase[i];\n if (!bend.draw_width)\n bend.draw_width = 0;\n if (i === 0)\n bend.draw_width += x_shift;\n last_drawn_width = bend.draw_width + last_bend_draw_width - (i === 1 ? x_shift : 0);\n if (bend.type === Bend.UP) {\n if (last_bend && last_bend.type === Bend.UP) {\n renderArrowHead(start.x, bend_height, +1);\n }\n renderBend(start.x, start.y, last_drawn_width, bend_height);\n }\n if (bend.type === Bend.DOWN) {\n if (last_bend && last_bend.type === Bend.UP) {\n renderRelease(start.x, start.y, last_drawn_width, bend_height);\n }\n if (last_bend && last_bend.type === Bend.DOWN) {\n renderArrowHead(start.x, start.y, -1);\n renderRelease(start.x, start.y, last_drawn_width, bend_height);\n }\n if (!last_bend) {\n last_drawn_width = bend.draw_width;\n renderRelease(start.x, start.y, last_drawn_width, bend_height);\n }\n }\n renderText(start.x + last_drawn_width, bend.text);\n last_bend = bend;\n last_bend_draw_width = bend.draw_width;\n last_bend.x = start.x;\n start.x += last_drawn_width;\n }\n if (!last_bend || last_bend.x == undefined) {\n throw new RuntimeError('NoLastBendForBend', 'Internal error.');\n }\n // Final arrowhead and text\n if (last_bend.type === Bend.UP) {\n renderArrowHead(last_bend.x + last_drawn_width, bend_height, +1);\n }\n else if (last_bend.type === Bend.DOWN) {\n renderArrowHead(last_bend.x + last_drawn_width, start.y, -1);\n }\n }\n}\n/** Default text font. */\nBend.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nexport class BoundingBox {\n constructor(x, y, w, h) {\n this.x = x;\n this.y = y;\n this.w = w;\n this.h = h;\n }\n /**\n * Create a new copy.\n */\n static copy(that) {\n return new BoundingBox(that.x, that.y, that.w, that.h);\n }\n /** Get x position. */\n getX() {\n return this.x;\n }\n /** Get y position. */\n getY() {\n return this.y;\n }\n /** Get width. */\n getW() {\n return this.w;\n }\n /** Get height. */\n getH() {\n return this.h;\n }\n /** Set x position. */\n setX(x) {\n this.x = x;\n return this;\n }\n /** Set y position. */\n setY(y) {\n this.y = y;\n return this;\n }\n /** Set width. */\n setW(w) {\n this.w = w;\n return this;\n }\n /** Set height. */\n setH(h) {\n this.h = h;\n return this;\n }\n /** Move to position. */\n move(x, y) {\n this.x += x;\n this.y += y;\n return this;\n }\n /** Clone. */\n clone() {\n return BoundingBox.copy(this);\n }\n /**\n * Merge my box with given box. Creates a bigger bounding box unless\n * the given box is contained in this one.\n */\n mergeWith(boundingBox) {\n const that = boundingBox;\n const new_x = this.x < that.x ? this.x : that.x;\n const new_y = this.y < that.y ? this.y : that.y;\n const new_w = Math.max(this.x + this.w, that.x + that.w) - new_x;\n const new_h = Math.max(this.y + this.h, that.y + that.h) - new_y;\n this.x = new_x;\n this.y = new_y;\n this.w = new_w;\n this.h = new_h;\n return this;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n/**\n * BoundingBoxComputation computes metrics for a bounding box by continuously\n * taking canvas path commands.\n *\n * Warning: This class is merely a crutch to get bounding box information without\n * explicit metadata. This is likely to get deprecated following SMuFL support.\n *\n * based on: https://github.com/canvg/canvg/blob/master/src/BoundingBox.ts (MIT License)\n */\nexport class BoundingBoxComputation {\n constructor() {\n this.x1 = Number.NaN;\n this.y1 = Number.NaN;\n this.x2 = Number.NaN;\n this.y2 = Number.NaN;\n }\n /** Get calculated X1. */\n getX1() {\n return this.x1;\n }\n /** Get calculated Y1. */\n getY1() {\n return this.y1;\n }\n /** Get calculated width. */\n width() {\n return this.x2 - this.x1;\n }\n /** Get calculated height. */\n height() {\n return this.y2 - this.y1;\n }\n /** Add point to BoundingBox. */\n addPoint(x, y) {\n if (isNaN(this.x1) || x < this.x1)\n this.x1 = x;\n if (isNaN(this.x2) || x > this.x2)\n this.x2 = x;\n if (isNaN(this.y1) || y < this.y1)\n this.y1 = y;\n if (isNaN(this.y2) || y > this.y2)\n this.y2 = y;\n }\n /** Add X to BoundingBox. */\n addX(x) {\n this.addPoint(x, this.y1);\n }\n /** Add Y to BoundingBox. */\n addY(y) {\n this.addPoint(this.x1, y);\n }\n /** Add quadratic curve to BoundingBox. */\n addQuadraticCurve(p0x, p0y, p1x, p1y, p2x, p2y) {\n this.addPoint(p0x, p0y);\n this.addPoint(p2x, p2y);\n const p01x = p1x - p0x;\n const p12x = p2x - p1x;\n let denom = p01x - p12x;\n if (denom != 0) {\n const t = p01x / denom;\n if (t > 0 && t < 1) {\n const it = 1 - t;\n this.addX(it * it * p0x + 2 * it * t * p1x + t * t * p2x);\n }\n }\n const p01y = p1y - p0y;\n const p12y = p2y - p1y;\n denom = p01y - p12y;\n if (denom != 0) {\n const t = p01y / denom;\n if (t > 0 && t < 1) {\n const it = 1 - t;\n this.addY(it * it * p0y + 2 * it * t * p1y + t * t * p2y);\n }\n }\n }\n /** Add bezier curve to BoundingBox. */\n addBezierCurve(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) {\n // from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html\n const p0 = [p0x, p0y];\n const p1 = [p1x, p1y];\n const p2 = [p2x, p2y];\n const p3 = [p3x, p3y];\n let i;\n this.addPoint(p0[0], p0[1]);\n this.addPoint(p3[0], p3[1]);\n const f = (t, i) => Math.pow(1 - t, 3) * p0[i] +\n 3 * Math.pow(1 - t, 2) * t * p1[i] +\n 3 * (1 - t) * Math.pow(t, 2) * p2[i] +\n Math.pow(t, 3) * p3[i];\n for (i = 0; i <= 1; i++) {\n const b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i];\n const a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i];\n const c = 3 * p1[i] - 3 * p0[i];\n if (a === 0) {\n if (b === 0)\n continue;\n const t = -c / b;\n if (0 < t && t < 1) {\n if (i === 0)\n this.addX(f(t, i));\n if (i === 1)\n this.addY(f(t, i));\n }\n continue;\n }\n const b2ac = Math.pow(b, 2) - 4 * c * a;\n if (b2ac < 0)\n continue;\n const t1 = (-b + Math.sqrt(b2ac)) / (2 * a);\n if (0 < t1 && t1 < 1) {\n if (i === 0)\n this.addX(f(t1, i));\n if (i === 1)\n this.addY(f(t1, i));\n }\n const t2 = (-b - Math.sqrt(b2ac)) / (2 * a);\n if (0 < t2 && t2 < 1) {\n if (i === 0)\n this.addX(f(t2, i));\n if (i === 1)\n this.addY(f(t2, i));\n }\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from './font';\nimport { RenderContext } from './rendercontext';\nimport { globalObject, warn } from './util';\nimport { isHTMLCanvas } from './web';\n/**\n * A rendering context for the Canvas backend. This class serves as a proxy for the\n * underlying CanvasRenderingContext2D object, part of the browser's API.\n */\nexport class CanvasContext extends RenderContext {\n constructor(context) {\n super();\n /** Height of one line of text (in pixels). */\n this.textHeight = 0;\n this.context2D = context;\n if (!context.canvas) {\n this.canvas = {\n width: CanvasContext.WIDTH,\n height: CanvasContext.HEIGHT,\n };\n }\n else {\n this.canvas = context.canvas;\n }\n }\n static get WIDTH() {\n return 600;\n }\n static get HEIGHT() {\n return 400;\n }\n static get CANVAS_BROWSER_SIZE_LIMIT() {\n return 32767; // Chrome/Firefox. Could be determined more precisely by npm module canvas-size.\n }\n /**\n * Ensure that width and height do not exceed the browser limit.\n * @returns array of [width, height] clamped to the browser limit.\n */\n static sanitizeCanvasDims(width, height) {\n const limit = this.CANVAS_BROWSER_SIZE_LIMIT;\n if (Math.max(width, height) > limit) {\n warn('Canvas dimensions exceed browser limit. Cropping to ' + limit);\n if (width > limit) {\n width = limit;\n }\n if (height > limit) {\n height = limit;\n }\n }\n return [width, height];\n }\n /**\n * Set all pixels to transparent black rgba(0,0,0,0).\n */\n clear() {\n this.context2D.clearRect(0, 0, this.canvas.width, this.canvas.height);\n }\n // eslint-disable-next-line\n openGroup(cls, id, attrs) {\n // Containers not implemented.\n }\n closeGroup() {\n // Containers not implemented.\n }\n // eslint-disable-next-line\n add(child) {\n // Containers not implemented.\n }\n setFillStyle(style) {\n this.context2D.fillStyle = style;\n return this;\n }\n /** CanvasContext ignores `setBackgroundFillStyle()`. */\n // eslint-disable-next-line\n setBackgroundFillStyle(style) {\n // DO NOTHING\n return this;\n }\n setStrokeStyle(style) {\n this.context2D.strokeStyle = style;\n return this;\n }\n setShadowColor(color) {\n this.context2D.shadowColor = color;\n return this;\n }\n setShadowBlur(blur) {\n // CanvasRenderingContext2D does not scale the shadow blur by the current\n // transform, so we have to do it manually. We assume uniform scaling\n // (though allow for rotation) because the blur can only be scaled\n // uniformly anyway.\n const t = this.context2D.getTransform();\n const scale = Math.sqrt(t.a * t.a + t.b * t.b + t.c * t.c + t.d * t.d);\n this.context2D.shadowBlur = scale * blur;\n return this;\n }\n setLineWidth(width) {\n this.context2D.lineWidth = width;\n return this;\n }\n setLineCap(capType) {\n this.context2D.lineCap = capType;\n return this;\n }\n setLineDash(dash) {\n this.context2D.setLineDash(dash);\n return this;\n }\n scale(x, y) {\n this.context2D.scale(x, y);\n return this;\n }\n resize(width, height) {\n const canvas = this.context2D.canvas;\n const devicePixelRatio = globalObject().devicePixelRatio || 1;\n // Scale the canvas size by the device pixel ratio clamping to the maximum supported size.\n [width, height] = CanvasContext.sanitizeCanvasDims(width * devicePixelRatio, height * devicePixelRatio);\n // Divide back down by the pixel ratio and convert to integers.\n width = (width / devicePixelRatio) | 0;\n height = (height / devicePixelRatio) | 0;\n canvas.width = width * devicePixelRatio;\n canvas.height = height * devicePixelRatio;\n // The canvas could be an instance of either HTMLCanvasElement or an OffscreenCanvas.\n // Only HTMLCanvasElement has a style attribute.\n if (isHTMLCanvas(canvas)) {\n canvas.style.width = width + 'px';\n canvas.style.height = height + 'px';\n }\n return this.scale(devicePixelRatio, devicePixelRatio);\n }\n rect(x, y, width, height) {\n this.context2D.rect(x, y, width, height);\n return this;\n }\n fillRect(x, y, width, height) {\n this.context2D.fillRect(x, y, width, height);\n return this;\n }\n /**\n * Set the pixels in a rectangular area to transparent black rgba(0,0,0,0).\n */\n clearRect(x, y, width, height) {\n this.context2D.clearRect(x, y, width, height);\n return this;\n }\n beginPath() {\n this.context2D.beginPath();\n return this;\n }\n moveTo(x, y) {\n this.context2D.moveTo(x, y);\n return this;\n }\n lineTo(x, y) {\n this.context2D.lineTo(x, y);\n return this;\n }\n bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) {\n this.context2D.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);\n return this;\n }\n quadraticCurveTo(cpx, cpy, x, y) {\n this.context2D.quadraticCurveTo(cpx, cpy, x, y);\n return this;\n }\n arc(x, y, radius, startAngle, endAngle, counterclockwise) {\n this.context2D.arc(x, y, radius, startAngle, endAngle, counterclockwise);\n return this;\n }\n fill() {\n this.context2D.fill();\n return this;\n }\n stroke() {\n this.context2D.stroke();\n return this;\n }\n closePath() {\n this.context2D.closePath();\n return this;\n }\n measureText(text) {\n const metrics = this.context2D.measureText(text);\n let y = 0;\n let height = 0;\n if (metrics.fontBoundingBoxAscent) {\n y = -metrics.fontBoundingBoxAscent;\n height = metrics.fontBoundingBoxDescent + metrics.fontBoundingBoxAscent;\n }\n else {\n y = -metrics.actualBoundingBoxAscent;\n height = metrics.actualBoundingBoxDescent + metrics.actualBoundingBoxAscent;\n }\n // Return x, y, width & height in the same manner as svg getBBox\n return {\n x: 0,\n y: y,\n width: metrics.width,\n height: height,\n };\n }\n fillText(text, x, y) {\n this.context2D.fillText(text, x, y);\n return this;\n }\n save() {\n this.context2D.save();\n return this;\n }\n restore() {\n this.context2D.restore();\n return this;\n }\n set fillStyle(style) {\n this.context2D.fillStyle = style;\n }\n get fillStyle() {\n return this.context2D.fillStyle;\n }\n set strokeStyle(style) {\n this.context2D.strokeStyle = style;\n }\n get strokeStyle() {\n return this.context2D.strokeStyle;\n }\n /**\n * @param f is 1) a `FontInfo` object or\n * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or\n * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided).\n * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt').\n * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900).\n * @param style is a string (e.g., 'italic', 'normal').\n */\n setFont(f, size, weight, style) {\n const fontInfo = Font.validate(f, size, weight, style);\n this.context2D.font = Font.toCSSString(fontInfo);\n this.textHeight = Font.convertSizeToPixelValue(fontInfo.size);\n return this;\n }\n /** Return a string of the form `'italic bold 15pt Arial'` */\n getFont() {\n return this.context2D.font;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// Author: Aaron (@AaronDavidNewman)\n//\n// This implements chord symbols above/below a chord.\n// Chord symbols are modifiers that can be attached to notes.\n// They can contain multiple 'blocks' which represent text or\n// glyphs with various positioning options.\n//\n// See `tests/chordsymbol_tests.ts` for usage examples.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Tables } from './tables';\nimport { TextFormatter } from './textformatter';\nimport { Category } from './typeguard';\nimport { log } from './util';\n// To enable logging for this class. Set `Vex.Flow.ChordSymbol.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (ChordSymbol.DEBUG)\n log('Vex.Flow.ChordSymbol', args);\n}\nexport var ChordSymbolHorizontalJustify;\n(function (ChordSymbolHorizontalJustify) {\n ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify[\"LEFT\"] = 1] = \"LEFT\";\n ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify[\"CENTER\"] = 2] = \"CENTER\";\n ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify[\"RIGHT\"] = 3] = \"RIGHT\";\n ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify[\"CENTER_STEM\"] = 4] = \"CENTER_STEM\";\n})(ChordSymbolHorizontalJustify || (ChordSymbolHorizontalJustify = {}));\nexport var ChordSymbolVerticalJustify;\n(function (ChordSymbolVerticalJustify) {\n ChordSymbolVerticalJustify[ChordSymbolVerticalJustify[\"TOP\"] = 1] = \"TOP\";\n ChordSymbolVerticalJustify[ChordSymbolVerticalJustify[\"BOTTOM\"] = 2] = \"BOTTOM\";\n})(ChordSymbolVerticalJustify || (ChordSymbolVerticalJustify = {}));\nexport var SymbolTypes;\n(function (SymbolTypes) {\n SymbolTypes[SymbolTypes[\"GLYPH\"] = 1] = \"GLYPH\";\n SymbolTypes[SymbolTypes[\"TEXT\"] = 2] = \"TEXT\";\n SymbolTypes[SymbolTypes[\"LINE\"] = 3] = \"LINE\";\n})(SymbolTypes || (SymbolTypes = {}));\nexport var SymbolModifiers;\n(function (SymbolModifiers) {\n SymbolModifiers[SymbolModifiers[\"NONE\"] = 1] = \"NONE\";\n SymbolModifiers[SymbolModifiers[\"SUBSCRIPT\"] = 2] = \"SUBSCRIPT\";\n SymbolModifiers[SymbolModifiers[\"SUPERSCRIPT\"] = 3] = \"SUPERSCRIPT\";\n})(SymbolModifiers || (SymbolModifiers = {}));\n/**\n * ChordSymbol is a modifier that creates a chord symbol above/below a chord.\n * As a modifier, it is attached to an existing note.\n */\nexport class ChordSymbol extends Modifier {\n constructor() {\n super();\n this.symbolBlocks = [];\n this.horizontal = ChordSymbolHorizontalJustify.LEFT;\n this.vertical = ChordSymbolVerticalJustify.TOP;\n this.useKerning = true;\n this.reportWidth = true;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.ChordSymbol;\n }\n static get superSubRatio() {\n return ChordSymbol.metrics.global.superSubRatio;\n }\n /** Currently unused: Globally turn off text formatting, if the built-in formatting does not work for your font. */\n static set NO_TEXT_FORMAT(val) {\n ChordSymbol.noFormat = val;\n }\n static get NO_TEXT_FORMAT() {\n return ChordSymbol.noFormat;\n }\n // eslint-disable-next-line\n static getMetricForGlyph(glyphCode) {\n if (ChordSymbol.metrics[glyphCode]) {\n return ChordSymbol.metrics[glyphCode];\n }\n return undefined;\n }\n static get engravingFontResolution() {\n return Tables.currentMusicFont().getResolution();\n }\n static get spacingBetweenBlocks() {\n return ChordSymbol.metrics.global.spacing / ChordSymbol.engravingFontResolution;\n }\n static getWidthForGlyph(glyph) {\n const metric = ChordSymbol.getMetricForGlyph(glyph.code);\n if (!metric) {\n return 0.65; // probably should do something here.\n }\n return metric.advanceWidth / ChordSymbol.engravingFontResolution;\n }\n static getYShiftForGlyph(glyph) {\n const metric = ChordSymbol.getMetricForGlyph(glyph.code);\n if (!metric) {\n return 0;\n }\n return metric.yOffset / ChordSymbol.engravingFontResolution;\n }\n static getXShiftForGlyph(glyph) {\n const metric = ChordSymbol.getMetricForGlyph(glyph.code);\n if (!metric) {\n return 0;\n }\n return (-1 * metric.leftSideBearing) / ChordSymbol.engravingFontResolution;\n }\n static get superscriptOffset() {\n return ChordSymbol.metrics.global.superscriptOffset / ChordSymbol.engravingFontResolution;\n }\n static get subscriptOffset() {\n return ChordSymbol.metrics.global.subscriptOffset / ChordSymbol.engravingFontResolution;\n }\n static get kerningOffset() {\n return ChordSymbol.metrics.global.kerningOffset / ChordSymbol.engravingFontResolution;\n }\n // eslint-disable-next-line\n static get metrics() {\n return Tables.currentMusicFont().getMetrics().glyphs.chordSymbol;\n }\n static get lowerKerningText() {\n // For example, see: `bravura_metrics.ts`\n // BravuraMetrics.glyphs.chordSymbol.global.lowerKerningText, which returns an array of letters.\n // ['D', 'F', 'P', 'T', 'V', 'Y']\n return ChordSymbol.metrics.global.lowerKerningText;\n }\n static get upperKerningText() {\n return ChordSymbol.metrics.global.upperKerningText;\n }\n static isSuperscript(block) {\n return block.symbolModifier !== undefined && block.symbolModifier === SymbolModifiers.SUPERSCRIPT;\n }\n static isSubscript(block) {\n return block.symbolModifier !== undefined && block.symbolModifier === SymbolModifiers.SUBSCRIPT;\n }\n /**\n * Estimate the width of the whole chord symbol, based on the sum of the widths of the individual blocks.\n * Estimate how many lines above/below the staff we need.\n */\n static format(symbols, state) {\n var _a;\n if (!symbols || symbols.length === 0)\n return false;\n let width = 0;\n let nonSuperWidth = 0;\n const reportedWidths = [];\n for (const symbol of symbols) {\n const fontSize = Font.convertSizeToPointValue((_a = symbol.textFont) === null || _a === void 0 ? void 0 : _a.size);\n const fontAdj = Font.scaleSize(fontSize, 0.05);\n const glyphAdj = fontAdj * 2;\n let lineSpaces = 1;\n let vAlign = false;\n for (let j = 0; j < symbol.symbolBlocks.length; ++j) {\n const block = symbol.symbolBlocks[j];\n const sup = ChordSymbol.isSuperscript(block);\n const sub = ChordSymbol.isSubscript(block);\n const superSubScale = sup || sub ? ChordSymbol.superSubRatio : 1;\n const adj = block.symbolType === SymbolTypes.GLYPH ? glyphAdj * superSubScale : fontAdj * superSubScale;\n // If there are super/subscripts, they extend beyond the line so\n // assume they take up 2 lines\n if (sup || sub) {\n lineSpaces = 2;\n }\n // If there is a symbol-specific offset, add it but consider font\n // size since font and glyphs will be interspersed.\n const fontSize = symbol.textFormatter.fontSizeInPixels;\n const superSubFontSize = fontSize * superSubScale;\n if (block.symbolType === SymbolTypes.GLYPH && block.glyph !== undefined) {\n block.width = ChordSymbol.getWidthForGlyph(block.glyph) * superSubFontSize;\n block.yShift += ChordSymbol.getYShiftForGlyph(block.glyph) * superSubFontSize;\n block.xShift += ChordSymbol.getXShiftForGlyph(block.glyph) * superSubFontSize;\n block.glyph.scale = block.glyph.scale * adj;\n }\n else if (block.symbolType === SymbolTypes.TEXT) {\n block.width = block.width * superSubFontSize;\n block.yShift += symbol.getYOffsetForText(block.text) * adj;\n }\n if (block.symbolType === SymbolTypes.GLYPH &&\n block.glyph !== undefined &&\n block.glyph.code === ChordSymbol.glyphs.over.code) {\n lineSpaces = 2;\n }\n block.width += ChordSymbol.spacingBetweenBlocks * fontSize * superSubScale;\n // If a subscript immediately follows a superscript block, try to\n // overlay them.\n if (sup && j > 0) {\n const prev = symbol.symbolBlocks[j - 1];\n if (!ChordSymbol.isSuperscript(prev)) {\n nonSuperWidth = width;\n }\n }\n if (sub && nonSuperWidth > 0) {\n vAlign = true;\n // slide the symbol over so it lines up with superscript\n block.xShift = block.xShift + (nonSuperWidth - width);\n width = nonSuperWidth;\n nonSuperWidth = 0;\n // If we have vertically lined up, turn kerning off.\n symbol.setEnableKerning(false);\n }\n if (!sup && !sub) {\n nonSuperWidth = 0;\n }\n block.vAlign = vAlign;\n width += block.width;\n }\n // make kerning adjustments after computing super/subscripts\n symbol.updateKerningAdjustments();\n symbol.updateOverBarAdjustments();\n if (symbol.getVertical() === ChordSymbolVerticalJustify.TOP) {\n symbol.setTextLine(state.top_text_line);\n state.top_text_line += lineSpaces;\n }\n else {\n symbol.setTextLine(state.text_line + 1);\n state.text_line += lineSpaces + 1;\n }\n if (symbol.getReportWidth()) {\n reportedWidths.push(width);\n }\n else {\n reportedWidths.push(0);\n }\n }\n width = reportedWidths.reduce((a, b) => a + b, 0);\n state.left_shift += width / 2;\n state.right_shift += width / 2;\n return true;\n }\n /**\n * Default text font.\n * Choose a font family that works well with the current music engraving font.\n * @override `Element.TEXT_FONT`.\n */\n static get TEXT_FONT() {\n let family = 'Roboto Slab, Times, serif';\n if (Tables.currentMusicFont().getName() === 'Petaluma') {\n // Fixes Issue #1180\n family = 'PetalumaScript, Arial, sans-serif';\n }\n return {\n family,\n size: 12,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n };\n }\n /**\n * The offset is specified in `em`. Scale this value by the font size in pixels.\n */\n get superscriptOffset() {\n return ChordSymbol.superscriptOffset * this.textFormatter.fontSizeInPixels;\n }\n get subscriptOffset() {\n return ChordSymbol.subscriptOffset * this.textFormatter.fontSizeInPixels;\n }\n setReportWidth(value) {\n this.reportWidth = value;\n return this;\n }\n getReportWidth() {\n return this.reportWidth;\n }\n updateOverBarAdjustments() {\n const barIndex = this.symbolBlocks.findIndex(({ symbolType, glyph }) => symbolType === SymbolTypes.GLYPH && glyph !== undefined && glyph.code === 'csymDiagonalArrangementSlash');\n if (barIndex < 0) {\n return;\n }\n const bar = this.symbolBlocks[barIndex];\n const xoff = bar.width / 4;\n const yoff = 0.25 * this.textFormatter.fontSizeInPixels;\n let symIndex = 0;\n for (symIndex === 0; symIndex < barIndex; ++symIndex) {\n const symbol = this.symbolBlocks[symIndex];\n symbol.xShift = symbol.xShift + xoff;\n symbol.yShift = symbol.yShift - yoff;\n }\n for (symIndex = barIndex + 1; symIndex < this.symbolBlocks.length; ++symIndex) {\n const symbol = this.symbolBlocks[symIndex];\n symbol.xShift = symbol.xShift - xoff;\n symbol.yShift = symbol.yShift + yoff;\n }\n }\n updateKerningAdjustments() {\n let accum = 0;\n for (let j = 0; j < this.symbolBlocks.length; ++j) {\n const symbol = this.symbolBlocks[j];\n accum += this.getKerningAdjustment(j);\n symbol.xShift += accum;\n }\n }\n /** Do some basic kerning so that letter chords like 'A' don't have the extensions hanging off to the right. */\n getKerningAdjustment(j) {\n if (!this.useKerning) {\n return 0;\n }\n const currSymbol = this.symbolBlocks[j];\n const prevSymbol = j > 0 ? this.symbolBlocks[j - 1] : undefined;\n let adjustment = 0;\n // Move things into the '/' over bar\n if (currSymbol.symbolType === SymbolTypes.GLYPH &&\n currSymbol.glyph !== undefined &&\n currSymbol.glyph.code === ChordSymbol.glyphs.over.code) {\n adjustment += currSymbol.glyph.metrics.x_shift;\n }\n if (prevSymbol !== undefined &&\n prevSymbol.symbolType === SymbolTypes.GLYPH &&\n prevSymbol.glyph !== undefined &&\n prevSymbol.glyph.code === ChordSymbol.glyphs.over.code) {\n adjustment += prevSymbol.glyph.metrics.x_shift;\n }\n // For superscripts that follow a letter without much top part, move it to the left slightly\n let preKernUpper = false;\n let preKernLower = false;\n if (prevSymbol !== undefined && prevSymbol.symbolType === SymbolTypes.TEXT) {\n preKernUpper = ChordSymbol.upperKerningText.some((xx) => xx === prevSymbol.text[prevSymbol.text.length - 1]);\n preKernLower = ChordSymbol.lowerKerningText.some((xx) => xx === prevSymbol.text[prevSymbol.text.length - 1]);\n }\n const kerningOffsetPixels = ChordSymbol.kerningOffset * this.textFormatter.fontSizeInPixels;\n // TODO: adjust kern for font size.\n // Where should this constant live?\n if (preKernUpper && currSymbol.symbolModifier === SymbolModifiers.SUPERSCRIPT) {\n adjustment += kerningOffsetPixels;\n }\n if (preKernLower && currSymbol.symbolType === SymbolTypes.TEXT) {\n if (currSymbol.text[0] >= 'a' && currSymbol.text[0] <= 'z') {\n adjustment += kerningOffsetPixels / 2;\n }\n if (ChordSymbol.upperKerningText.some((xx) => xx === (prevSymbol === null || prevSymbol === void 0 ? void 0 : prevSymbol.text[prevSymbol.text.length - 1]))) {\n adjustment += kerningOffsetPixels / 2;\n }\n }\n return adjustment;\n }\n /**\n * ChordSymbol allows multiple blocks so we can mix glyphs and font text.\n * Each block can have its own vertical orientation.\n */\n // eslint-disable-next-line\n getSymbolBlock(params = {}) {\n var _a, _b, _c;\n const symbolType = (_a = params.symbolType) !== null && _a !== void 0 ? _a : SymbolTypes.TEXT;\n const symbolBlock = {\n text: (_b = params.text) !== null && _b !== void 0 ? _b : '',\n symbolType,\n symbolModifier: (_c = params.symbolModifier) !== null && _c !== void 0 ? _c : SymbolModifiers.NONE,\n xShift: 0,\n yShift: 0,\n vAlign: false,\n width: 0,\n };\n // Note: symbol widths are resolution and font-independent.\n // We convert to pixel values when we know what the font is.\n if (symbolType === SymbolTypes.GLYPH && typeof params.glyph === 'string') {\n const glyphArgs = ChordSymbol.glyphs[params.glyph];\n const glyphPoints = 20;\n symbolBlock.glyph = new Glyph(glyphArgs.code, glyphPoints, { category: 'chordSymbol' });\n // Beware: glyph.metrics is not the same as glyph.getMetrics() !\n // rv.glyph.point = rv.glyph.point * rv.glyph.metrics.scale;\n // rv.width = rv.glyph.getMetrics().width;\n // don't set yShift here, b/c we need to do it at formatting time after the font is set.\n }\n else if (symbolType === SymbolTypes.TEXT) {\n symbolBlock.width = this.textFormatter.getWidthForTextInEm(symbolBlock.text);\n }\n else if (symbolType === SymbolTypes.LINE) {\n symbolBlock.width = params.width;\n }\n return symbolBlock;\n }\n /** Add a symbol to this chord, could be text, glyph or line. */\n // eslint-disable-next-line\n addSymbolBlock(parameters) {\n this.symbolBlocks.push(this.getSymbolBlock(parameters));\n return this;\n }\n // ### Convenience functions for creating different types of chord symbol parts.\n /** Add a text block. */\n // eslint-disable-next-line\n addText(text, parameters = {}) {\n const symbolType = SymbolTypes.TEXT;\n return this.addSymbolBlock(Object.assign(Object.assign({}, parameters), { text, symbolType }));\n }\n /** Add a text block with superscript modifier. */\n addTextSuperscript(text) {\n const symbolType = SymbolTypes.TEXT;\n const symbolModifier = SymbolModifiers.SUPERSCRIPT;\n return this.addSymbolBlock({ text, symbolType, symbolModifier });\n }\n /** Add a text block with subscript modifier. */\n addTextSubscript(text) {\n const symbolType = SymbolTypes.TEXT;\n const symbolModifier = SymbolModifiers.SUBSCRIPT;\n return this.addSymbolBlock({ text, symbolType, symbolModifier });\n }\n /** Add a glyph block with superscript modifier. */\n addGlyphSuperscript(glyph) {\n const symbolType = SymbolTypes.GLYPH;\n const symbolModifier = SymbolModifiers.SUPERSCRIPT;\n return this.addSymbolBlock({ glyph, symbolType, symbolModifier });\n }\n /** Add a glyph block. */\n // eslint-disable-next-line\n addGlyph(glyph, params = {}) {\n const symbolType = SymbolTypes.GLYPH;\n return this.addSymbolBlock(Object.assign(Object.assign({}, params), { glyph, symbolType }));\n }\n /**\n * Add a glyph for each character in 'text'. If the glyph is not available, use text from the font.\n * e.g. `addGlyphOrText('(+5#11)')` will use text for the '5' and '11', and glyphs for everything else.\n */\n // eslint-disable-next-line\n addGlyphOrText(text, params = {}) {\n let str = '';\n for (let i = 0; i < text.length; ++i) {\n const char = text[i];\n if (ChordSymbol.glyphs[char]) {\n if (str.length > 0) {\n this.addText(str, params);\n str = '';\n }\n this.addGlyph(char, params);\n }\n else {\n // Collect consecutive characters with no glyphs.\n str += char;\n }\n }\n if (str.length > 0) {\n this.addText(str, params);\n }\n return this;\n }\n /** Add a line of the given width, used as a continuation of the previous symbol in analysis, or lyrics, etc. */\n // eslint-disable-next-line\n addLine(width, params = {}) {\n const symbolType = SymbolTypes.LINE;\n return this.addSymbolBlock(Object.assign(Object.assign({}, params), { symbolType, width }));\n }\n /**\n * Set the chord symbol's font family, size, weight, style (e.g., `Arial`, `10pt`, `bold`, `italic`).\n *\n * @param f is 1) a `FontInfo` object or\n * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or\n * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided).\n * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt').\n * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900).\n * @param style is a string (e.g., 'italic', 'normal').\n *\n * @override See: Element.\n */\n setFont(f, size, weight, style) {\n super.setFont(f, size, weight, style);\n this.textFormatter = TextFormatter.create(this.textFont);\n return this;\n }\n setEnableKerning(val) {\n this.useKerning = val;\n return this;\n }\n /** Set vertical position of text (above or below stave). */\n setVertical(vj) {\n this.vertical = typeof vj === 'string' ? ChordSymbol.VerticalJustifyString[vj] : vj;\n return this;\n }\n getVertical() {\n return this.vertical;\n }\n /** Set horizontal justification. */\n setHorizontal(hj) {\n this.horizontal = typeof hj === 'string' ? ChordSymbol.HorizontalJustifyString[hj] : hj;\n return this;\n }\n getHorizontal() {\n return this.horizontal;\n }\n getWidth() {\n let width = 0;\n this.symbolBlocks.forEach((symbol) => {\n width += symbol.vAlign ? 0 : symbol.width;\n });\n return width;\n }\n getYOffsetForText(text) {\n var _a;\n let acc = 0;\n let i = 0;\n for (i = 0; i < text.length; ++i) {\n const metrics = this.textFormatter.getGlyphMetrics(text[i]);\n if (metrics) {\n const yMax = (_a = metrics.y_max) !== null && _a !== void 0 ? _a : 0;\n acc = yMax < acc ? yMax : acc;\n }\n }\n const resolution = this.textFormatter.getResolution();\n return i > 0 ? -1 * (acc / resolution) : 0;\n }\n /** Render text and glyphs above/below the note. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n // We're changing context parameters. Save current state.\n ctx.save();\n const classString = Object.keys(this.getAttribute('classes')).join(' ');\n ctx.openGroup(classString, this.getAttribute('id'));\n const start = note.getModifierStartXY(Modifier.Position.ABOVE, this.index);\n ctx.setFont(this.textFont);\n let y;\n // The position of the text varies based on whether or not the note\n // has a stem.\n const hasStem = note.hasStem();\n const stave = note.checkStave();\n if (this.vertical === ChordSymbolVerticalJustify.BOTTOM) {\n // HACK: We need to compensate for the text's height since its origin is bottom-right.\n y = stave.getYForBottomText(this.text_line + Tables.TEXT_HEIGHT_OFFSET_HACK);\n if (hasStem) {\n const stem_ext = note.checkStem().getExtents();\n const spacing = stave.getSpacingBetweenLines();\n const stem_base = note.getStemDirection() === 1 ? stem_ext.baseY : stem_ext.topY;\n y = Math.max(y, stem_base + spacing * (this.text_line + 2));\n }\n }\n else {\n // (this.vertical === VerticalJustify.TOP)\n y = Math.min(stave.getYForTopText(this.text_line), note.getYs()[0] - 10);\n if (hasStem) {\n const stem_ext = note.checkStem().getExtents();\n const spacing = stave.getSpacingBetweenLines();\n y = Math.min(y, stem_ext.topY - 5 - spacing * this.text_line);\n }\n }\n let x = start.x;\n if (this.horizontal === ChordSymbolHorizontalJustify.LEFT) {\n x = start.x;\n }\n else if (this.horizontal === ChordSymbolHorizontalJustify.RIGHT) {\n x = start.x + this.getWidth();\n }\n else if (this.horizontal === ChordSymbolHorizontalJustify.CENTER) {\n x = start.x - this.getWidth() / 2;\n }\n else {\n // HorizontalJustify.CENTER_STEM\n x = note.getStemX() - this.getWidth() / 2;\n }\n L('Rendering ChordSymbol: ', this.textFormatter, x, y);\n this.symbolBlocks.forEach((symbol) => {\n const isSuper = ChordSymbol.isSuperscript(symbol);\n const isSub = ChordSymbol.isSubscript(symbol);\n let curY = y;\n L('shift was ', symbol.xShift, symbol.yShift);\n L('curY pre sub ', curY);\n if (isSuper) {\n curY += this.superscriptOffset;\n }\n if (isSub) {\n curY += this.subscriptOffset;\n }\n L('curY sup/sub ', curY);\n if (symbol.symbolType === SymbolTypes.TEXT) {\n if (isSuper || isSub) {\n ctx.save();\n if (this.textFont) {\n const { family, size, weight, style } = this.textFont;\n const smallerFontSize = Font.scaleSize(size, ChordSymbol.superSubRatio);\n ctx.setFont(family, smallerFontSize, weight, style);\n }\n }\n // TODO???\n // We estimate the text width, fill it in with the empirical value so the formatting is even.\n // const textDim = ctx.measureText(symbol.text);\n // symbol.width = textDim.width;\n L('Rendering Text: ', symbol.text, x + symbol.xShift, curY + symbol.yShift);\n ctx.fillText(symbol.text, x + symbol.xShift, curY + symbol.yShift);\n if (isSuper || isSub) {\n ctx.restore();\n }\n }\n else if (symbol.symbolType === SymbolTypes.GLYPH && symbol.glyph) {\n curY += symbol.yShift;\n L('Rendering Glyph: ', symbol.glyph.code, x + symbol.xShift, curY);\n symbol.glyph.render(ctx, x + symbol.xShift, curY);\n }\n else if (symbol.symbolType === SymbolTypes.LINE) {\n L('Rendering Line : ', symbol.width, x, curY);\n ctx.beginPath();\n ctx.setLineWidth(1); // ?\n ctx.moveTo(x, y);\n ctx.lineTo(x + symbol.width, curY);\n ctx.stroke();\n }\n x += symbol.width;\n if (symbol.vAlign) {\n x += symbol.xShift;\n }\n });\n ctx.closeGroup();\n ctx.restore();\n }\n}\nChordSymbol.DEBUG = false;\n// Chord symbols can be positioned and justified relative to the note.\nChordSymbol.HorizontalJustify = ChordSymbolHorizontalJustify;\nChordSymbol.HorizontalJustifyString = {\n left: ChordSymbolHorizontalJustify.LEFT,\n right: ChordSymbolHorizontalJustify.RIGHT,\n center: ChordSymbolHorizontalJustify.CENTER,\n centerStem: ChordSymbolHorizontalJustify.CENTER_STEM,\n};\nChordSymbol.VerticalJustify = ChordSymbolVerticalJustify;\nChordSymbol.VerticalJustifyString = {\n top: ChordSymbolVerticalJustify.TOP,\n above: ChordSymbolVerticalJustify.TOP,\n below: ChordSymbolVerticalJustify.BOTTOM,\n bottom: ChordSymbolVerticalJustify.BOTTOM,\n};\n// Glyph data\nChordSymbol.glyphs = {\n diminished: {\n code: 'csymDiminished',\n },\n dim: {\n code: 'csymDiminished',\n },\n halfDiminished: {\n code: 'csymHalfDiminished',\n },\n '+': {\n code: 'csymAugmented',\n },\n augmented: {\n code: 'csymAugmented',\n },\n majorSeventh: {\n code: 'csymMajorSeventh',\n },\n minor: {\n code: 'csymMinor',\n },\n '-': {\n code: 'csymMinor',\n },\n '(': {\n code: 'csymParensLeftTall',\n },\n leftParen: {\n code: 'csymParensLeftTall',\n },\n ')': {\n code: 'csymParensRightTall',\n },\n rightParen: {\n code: 'csymParensRightTall',\n },\n leftBracket: {\n code: 'csymBracketLeftTall',\n },\n rightBracket: {\n code: 'csymBracketRightTall',\n },\n leftParenTall: {\n code: 'csymParensLeftVeryTall',\n },\n rightParenTall: {\n code: 'csymParensRightVeryTall',\n },\n '/': {\n code: 'csymDiagonalArrangementSlash',\n },\n over: {\n code: 'csymDiagonalArrangementSlash',\n },\n '#': {\n code: 'accidentalSharp',\n },\n b: {\n code: 'accidentalFlat',\n },\n};\nChordSymbol.symbolTypes = SymbolTypes;\nChordSymbol.symbolModifiers = SymbolModifiers;\n/** Currently unused. */\nChordSymbol.noFormat = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna Cheppudira 2013.\n// Co-author: Benjamin W. Bohl\n// MIT License\nimport { Glyph } from './glyph';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Clef.DEBUG)\n log('Vex.Flow.Clef', args);\n}\n/**\n * Clef implements various types of clefs that can be rendered on a stave.\n *\n * See `tests/clef_tests.ts` for usage examples.\n */\nexport class Clef extends StaveModifier {\n /** Create a new clef. */\n constructor(type, size, annotation) {\n super();\n /**\n * The attribute `clef` must be a key from\n * `Clef.types`\n */\n this.clef = Clef.types['treble'];\n this.setPosition(StaveModifierPosition.BEGIN);\n this.setType(type, size, annotation);\n this.setWidth(Tables.currentMusicFont().lookupMetric(`clef.${this.size}.width`));\n L('Creating clef:', type);\n }\n static get CATEGORY() {\n return Category.Clef;\n }\n /**\n * Every clef name is associated with a glyph code from the font file\n * and a default stave line number.\n */\n static get types() {\n return {\n treble: {\n code: 'gClef',\n line: 3,\n point: 0,\n },\n bass: {\n code: 'fClef',\n line: 1,\n point: 0,\n },\n alto: {\n code: 'cClef',\n line: 2,\n point: 0,\n },\n tenor: {\n code: 'cClef',\n line: 1,\n point: 0,\n },\n percussion: {\n code: 'restMaxima',\n line: 2,\n point: 0,\n },\n soprano: {\n code: 'cClef',\n line: 4,\n point: 0,\n },\n 'mezzo-soprano': {\n code: 'cClef',\n line: 3,\n point: 0,\n },\n 'baritone-c': {\n code: 'cClef',\n line: 0,\n point: 0,\n },\n 'baritone-f': {\n code: 'fClef',\n line: 2,\n point: 0,\n },\n subbass: {\n code: 'fClef',\n line: 0,\n point: 0,\n },\n french: {\n code: 'gClef',\n line: 4,\n point: 0,\n },\n tab: {\n code: '6stringTabClef',\n point: 0,\n },\n };\n }\n /** Set clef type, size and annotation. */\n setType(type, size, annotation) {\n this.type = type;\n this.clef = Clef.types[type];\n if (size === undefined) {\n this.size = 'default';\n }\n else {\n this.size = size;\n }\n const musicFont = Tables.currentMusicFont();\n this.clef.point = musicFont.lookupMetric(`clef.${this.size}.point`, 0);\n this.glyph = new Glyph(this.clef.code, this.clef.point, {\n category: `clef.${this.clef.code}.${this.size}`,\n });\n // If an annotation, such as 8va, is specified, add it to the Clef object.\n if (annotation !== undefined) {\n const code = musicFont.lookupMetric(`clef.annotations.${annotation}.smuflCode`);\n const point = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.point`);\n const line = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.${this.type}.line`);\n const x_shift = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.${this.type}.shiftX`);\n this.annotation = { code, point, line, x_shift };\n this.attachment = new Glyph(this.annotation.code, this.annotation.point);\n this.attachment.metrics.x_max = 0;\n this.attachment.setXShift(this.annotation.x_shift);\n }\n else {\n this.annotation = undefined;\n }\n return this;\n }\n /** Get clef width. */\n getWidth() {\n if (this.type === 'tab') {\n defined(this.stave, 'ClefError', \"Can't get width without stave.\");\n }\n return this.width;\n }\n /** Set associated stave. */\n setStave(stave) {\n this.stave = stave;\n if (this.type === 'tab') {\n const glyph = defined(this.glyph, 'ClefError', \"Can't set stave without glyph.\");\n const numLines = this.stave.getNumLines();\n const musicFont = Tables.currentMusicFont();\n const point = musicFont.lookupMetric(`clef.lineCount.${numLines}.point`);\n const shiftY = musicFont.lookupMetric(`clef.lineCount.${numLines}.shiftY`);\n glyph.setPoint(point);\n glyph.setYShift(shiftY);\n }\n return this;\n }\n /** Render clef. */\n draw() {\n const glyph = defined(this.glyph, 'ClefError', \"Can't draw clef without glyph.\");\n const stave = this.checkStave();\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.openGroup('clef', this.getAttribute('id'));\n glyph.setStave(stave);\n glyph.setContext(ctx);\n if (this.clef.line !== undefined) {\n this.placeGlyphOnLine(glyph, stave, this.clef.line);\n }\n glyph.renderToStave(this.x);\n if (this.annotation !== undefined && this.attachment !== undefined) {\n this.placeGlyphOnLine(this.attachment, stave, this.annotation.line);\n this.attachment.setStave(stave);\n this.attachment.setContext(ctx);\n this.attachment.renderToStave(this.x);\n }\n ctx.closeGroup();\n }\n}\n/** To enable logging for this class, set `Vex.Flow.Clef.DEBUG` to `true`. */\nClef.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2014\n// MIT License\nimport { Clef } from './clef';\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Category } from './typeguard';\n/** ClefNote implements clef annotations in measures. */\nexport class ClefNote extends Note {\n constructor(type, size, annotation) {\n super({ duration: 'b' });\n this.type = type;\n this.clef_obj = new Clef(type, size, annotation);\n this.clef = this.clef_obj.clef;\n this.glyph = new Glyph(this.clef.code, this.clef.point);\n this.setWidth(this.glyph.getMetrics().width);\n // Note properties\n this.ignore_ticks = true;\n }\n static get CATEGORY() {\n return Category.ClefNote;\n }\n /** Set clef type, size and annotation. */\n setType(type, size, annotation) {\n this.type = type;\n this.clef_obj = new Clef(type, size, annotation);\n this.clef = this.clef_obj.clef;\n this.glyph = new Glyph(this.clef.code, this.clef.point);\n this.setWidth(this.glyph.getMetrics().width);\n return this;\n }\n /** Get associated clef. */\n getClef() {\n return this.clef;\n }\n /** Set associated context. */\n setContext(context) {\n super.setContext(context);\n this.glyph.setContext(this.getContext());\n return this;\n }\n /** Get bounding box. */\n getBoundingBox() {\n return super.getBoundingBox();\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n /** Render clef note. */\n draw() {\n var _a;\n const stave = this.checkStave();\n if (!this.glyph.getContext()) {\n this.glyph.setContext(this.getContext());\n }\n this.setRendered();\n const abs_x = this.getAbsoluteX();\n this.glyph.setStave(stave);\n this.glyph.setYShift(stave.getYForLine((_a = this.clef.line) !== null && _a !== void 0 ? _a : 0) - stave.getYForGlyphs());\n this.glyph.renderToStave(abs_x);\n // If the Vex.Flow.Clef has an annotation, such as 8va, draw it.\n if (this.clef_obj.annotation !== undefined) {\n const attachment = new Glyph(this.clef_obj.annotation.code, this.clef_obj.annotation.point);\n if (!attachment.getContext()) {\n attachment.setContext(this.getContext());\n }\n attachment.setStave(stave);\n attachment.setYShift(stave.getYForLine(this.clef_obj.annotation.line) - stave.getYForGlyphs());\n attachment.setXShift(this.clef_obj.annotation.x_shift);\n attachment.renderToStave(abs_x);\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// This file implements the `Crescendo` object which draws crescendos and\n// decrescendo dynamics markings. A `Crescendo` is initialized with a\n// duration and formatted as part of a `Voice` like any other `Note`\n// type in VexFlow. This object would most likely be formatted in a Voice\n// with `TextNotes` - which are used to represent other dynamics markings.\nimport { Note } from './note';\nimport { TickContext } from './tickcontext';\nimport { Category } from './typeguard';\nimport { log } from './util';\n// To enable logging for this class. Set `Vex.Flow.Crescendo.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (Crescendo.DEBUG)\n log('Vex.Flow.Crescendo', args);\n}\n// Private helper to draw the hairpin\nfunction renderHairpin(ctx, params) {\n const begin_x = params.begin_x;\n const end_x = params.end_x;\n const y = params.y;\n const half_height = params.height / 2;\n ctx.beginPath();\n if (params.reverse) {\n ctx.moveTo(begin_x, y - half_height);\n ctx.lineTo(end_x, y);\n ctx.lineTo(begin_x, y + half_height);\n }\n else {\n ctx.moveTo(end_x, y - half_height);\n ctx.lineTo(begin_x, y);\n ctx.lineTo(end_x, y + half_height);\n }\n ctx.stroke();\n ctx.closePath();\n}\nexport class Crescendo extends Note {\n // Initialize the crescendo's properties\n constructor(noteStruct) {\n super(noteStruct);\n this.options = {\n // Extensions to the length of the crescendo on either side\n extend_left: 0,\n extend_right: 0,\n // Vertical shift\n y_shift: 0,\n };\n // Whether the object is a decrescendo\n this.decrescendo = false;\n // The staff line to be placed on\n this.line = noteStruct.line || 0;\n // The height at the open end of the cresc/decresc\n this.height = 15;\n }\n /** Crescendo category string. */\n static get CATEGORY() {\n return Category.Crescendo;\n }\n // Set the line to center the element on\n setLine(line) {\n this.line = line;\n return this;\n }\n // Set the full height at the open end\n setHeight(height) {\n this.height = height;\n return this;\n }\n // Set whether the sign should be a descresendo by passing a bool\n // to `decresc`\n setDecrescendo(decresc) {\n this.decrescendo = decresc;\n return this;\n }\n // Preformat the note\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n // Render the Crescendo object onto the canvas\n draw() {\n const ctx = this.checkContext();\n const stave = this.checkStave();\n this.setRendered();\n const tick_context = this.getTickContext();\n const next_context = TickContext.getNextContext(tick_context);\n const begin_x = this.getAbsoluteX();\n const end_x = next_context ? next_context.getX() : stave.getX() + stave.getWidth();\n const y = stave.getYForLine(this.line + -3) + 1;\n L('Drawing ', this.decrescendo ? 'decrescendo ' : 'crescendo ', this.height, 'x', begin_x - end_x);\n renderHairpin(ctx, {\n begin_x: begin_x - this.options.extend_left,\n end_x: end_x + this.options.extend_right,\n y: y + this.options.y_shift,\n height: this.height,\n reverse: this.decrescendo,\n });\n }\n}\nCrescendo.DEBUG = false;\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n//\n// This class implements curves (for slurs)\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport var CurvePosition;\n(function (CurvePosition) {\n CurvePosition[CurvePosition[\"NEAR_HEAD\"] = 1] = \"NEAR_HEAD\";\n CurvePosition[CurvePosition[\"NEAR_TOP\"] = 2] = \"NEAR_TOP\";\n})(CurvePosition || (CurvePosition = {}));\nexport class Curve extends Element {\n // from: Start note\n // to: End note\n // options:\n // cps: List of control points\n // x_shift: pixels to shift\n // y_shift: pixels to shift\n constructor(from, to, options) {\n super();\n this.render_options = Object.assign({ thickness: 2, x_shift: 0, y_shift: 10, position: CurvePosition.NEAR_HEAD, position_end: CurvePosition.NEAR_HEAD, invert: false, cps: [\n { x: 0, y: 10 },\n { x: 0, y: 10 },\n ] }, options);\n this.from = from;\n this.to = to;\n }\n static get CATEGORY() {\n return Category.Curve;\n }\n static get Position() {\n return CurvePosition;\n }\n static get PositionString() {\n return {\n nearHead: CurvePosition.NEAR_HEAD,\n nearTop: CurvePosition.NEAR_TOP,\n };\n }\n setNotes(from, to) {\n if (!from && !to) {\n throw new RuntimeError('BadArguments', 'Curve needs to have either `from` or `to` set.');\n }\n this.from = from;\n this.to = to;\n return this;\n }\n /**\n * @return {boolean} Returns true if this is a partial bar.\n */\n isPartial() {\n return !this.from || !this.to;\n }\n renderCurve(params) {\n const ctx = this.checkContext();\n const x_shift = this.render_options.x_shift;\n const y_shift = this.render_options.y_shift * params.direction;\n const first_x = params.first_x + x_shift;\n const first_y = params.first_y + y_shift;\n const last_x = params.last_x - x_shift;\n const last_y = params.last_y + y_shift;\n const thickness = this.render_options.thickness;\n const cps = this.render_options.cps;\n const { x: cp0x, y: cp0y } = cps[0];\n const { x: cp1x, y: cp1y } = cps[1];\n const cp_spacing = (last_x - first_x) / (cps.length + 2);\n ctx.beginPath();\n ctx.moveTo(first_x, first_y);\n ctx.bezierCurveTo(first_x + cp_spacing + cp0x, first_y + cp0y * params.direction, last_x - cp_spacing + cp1x, last_y + cp1y * params.direction, last_x, last_y);\n ctx.bezierCurveTo(last_x - cp_spacing + cp1x, last_y + (cp1y + thickness) * params.direction, first_x + cp_spacing + cp0x, first_y + (cp0y + thickness) * params.direction, first_x, first_y);\n ctx.stroke();\n ctx.closePath();\n ctx.fill();\n }\n draw() {\n this.checkContext();\n this.setRendered();\n const first_note = this.from;\n const last_note = this.to;\n let first_x;\n let last_x;\n let first_y;\n let last_y;\n let stem_direction = 0;\n let metric = 'baseY';\n let end_metric = 'baseY';\n function getPosition(position) {\n return typeof position === 'string' ? Curve.PositionString[position] : position;\n }\n const position = getPosition(this.render_options.position);\n const position_end = getPosition(this.render_options.position_end);\n if (position === CurvePosition.NEAR_TOP) {\n metric = 'topY';\n end_metric = 'topY';\n }\n if (position_end === CurvePosition.NEAR_HEAD) {\n end_metric = 'baseY';\n }\n else if (position_end === CurvePosition.NEAR_TOP) {\n end_metric = 'topY';\n }\n if (first_note) {\n first_x = first_note.getTieRightX();\n stem_direction = first_note.getStemDirection();\n first_y = first_note.getStemExtents()[metric];\n }\n else {\n const stave = last_note.checkStave();\n first_x = stave.getTieStartX();\n first_y = last_note.getStemExtents()[metric];\n }\n if (last_note) {\n last_x = last_note.getTieLeftX();\n stem_direction = last_note.getStemDirection();\n last_y = last_note.getStemExtents()[end_metric];\n }\n else {\n const stave = first_note.checkStave();\n last_x = stave.getTieEndX();\n last_y = first_note.getStemExtents()[end_metric];\n }\n this.renderCurve({\n first_x,\n last_x,\n first_y,\n last_y,\n direction: stem_direction * (this.render_options.invert === true ? -1 : 1),\n });\n return true;\n }\n}\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n//\n// This class implements dot modifiers for notes.\nimport { Modifier } from './modifier';\nimport { Category, isGraceNote, isStaveNote, isTabNote } from './typeguard';\nimport { RuntimeError } from './util';\nexport class Dot extends Modifier {\n constructor() {\n super();\n this.position = Modifier.Position.RIGHT;\n this.radius = 2;\n this.setWidth(5);\n this.dot_shiftY = 0;\n }\n static get CATEGORY() {\n return Category.Dot;\n }\n /** Returns the dots associated to a Note. */\n static getDots(note) {\n return note.getModifiersByType(Dot.CATEGORY);\n }\n /** Add a dot on the specified keys to the notes. */\n static buildAndAttach(notes, options) {\n for (const note of notes) {\n if (options === null || options === void 0 ? void 0 : options.all) {\n for (let i = 0; i < note.keys.length; i++) {\n const dot = new Dot();\n dot.setDotShiftY(note.glyph.dot_shiftY);\n note.addModifier(dot, i);\n }\n }\n else if ((options === null || options === void 0 ? void 0 : options.index) != undefined) {\n const dot = new Dot();\n dot.setDotShiftY(note.glyph.dot_shiftY);\n note.addModifier(dot, options === null || options === void 0 ? void 0 : options.index);\n }\n else {\n const dot = new Dot();\n dot.setDotShiftY(note.glyph.dot_shiftY);\n note.addModifier(dot, 0);\n }\n }\n }\n // Arrange dots inside a ModifierContext.\n static format(dots, state) {\n const right_shift = state.right_shift;\n const dot_spacing = 1;\n if (!dots || dots.length === 0)\n return false;\n const dot_list = [];\n const max_shift_map = {};\n for (let i = 0; i < dots.length; ++i) {\n const dot = dots[i];\n const note = dot.getNote();\n let props;\n let shift;\n if (isStaveNote(note)) {\n const index = dot.checkIndex();\n props = note.getKeyProps()[index];\n // consider right displaced head with no previous modifier\n shift = note.getFirstDotPx();\n }\n else if (isTabNote(note)) {\n props = { line: 0.5 }; // Shim key props for dot placement\n shift = right_shift;\n }\n else {\n // note object is not StaveNote or TabNote.\n throw new RuntimeError('Internal', 'Unexpected instance.');\n }\n const note_id = note.getAttribute('id');\n dot_list.push({ line: props.line, note, note_id, dot });\n max_shift_map[note_id] = Math.max(max_shift_map[note_id] || shift, shift);\n }\n // Sort dots by line number.\n dot_list.sort((a, b) => b.line - a.line);\n let dot_shift = right_shift;\n let x_width = 0;\n let last_line = null;\n let last_note = null;\n let prev_dotted_space = null;\n let half_shiftY = 0;\n for (let i = 0; i < dot_list.length; ++i) {\n const { dot, note, note_id, line } = dot_list[i];\n // Reset the position of the dot every line.\n if (line !== last_line || note !== last_note) {\n dot_shift = max_shift_map[note_id];\n }\n if (!note.isRest() && line !== last_line) {\n if (Math.abs(line % 1) === 0.5) {\n // note is on a space, so no dot shift\n half_shiftY = 0;\n }\n else {\n // note is on a line, so shift dot to space above the line\n half_shiftY = 0.5;\n if (last_note != null && !last_note.isRest() && last_line != null && last_line - line === 0.5) {\n // previous note on a space, so shift dot to space below the line\n half_shiftY = -0.5;\n }\n else if (line + half_shiftY === prev_dotted_space) {\n // previous space is dotted, so shift dot to space below the line\n half_shiftY = -0.5;\n }\n }\n }\n // convert half_shiftY to a multiplier for dots.draw()\n if (note.isRest()) {\n dot.dot_shiftY += -half_shiftY;\n }\n else {\n dot.dot_shiftY = -half_shiftY;\n }\n prev_dotted_space = line + half_shiftY;\n dot.setXShift(dot_shift);\n dot_shift += dot.getWidth() + dot_spacing; // spacing\n x_width = dot_shift > x_width ? dot_shift : x_width;\n last_line = line;\n last_note = note;\n }\n // Update state.\n state.right_shift += x_width;\n return true;\n }\n setNote(note) {\n this.note = note;\n if (isGraceNote(note)) {\n this.radius *= 0.5;\n this.setWidth(3);\n }\n return this;\n }\n setDotShiftY(y) {\n this.dot_shiftY = y;\n return this;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const stave = note.checkStave();\n const lineSpace = stave.getSpacingBetweenLines();\n const start = note.getModifierStartXY(this.position, this.index, { forceFlagRight: true });\n // Set the starting y coordinate to the base of the stem for TabNotes.\n if (isTabNote(note)) {\n start.y = note.getStemExtents().baseY;\n }\n const x = start.x + this.x_shift + this.width - this.radius;\n const y = start.y + this.y_shift + this.dot_shiftY * lineSpace;\n ctx.beginPath();\n ctx.arc(x, y, this.radius, 0, Math.PI * 2, false);\n ctx.fill();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Articulation } from './articulation';\nimport { Dot } from './dot';\nimport { FretHandFinger } from './frethandfinger';\nimport { Music } from './music';\nimport { Parser } from './parser';\nimport { Stem } from './stem';\nimport { defined, log, RuntimeError } from './util';\n// To enable logging for this class. Set `Vex.Flow.EasyScore.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (EasyScore.DEBUG)\n log('Vex.Flow.EasyScore', args);\n}\nexport class EasyScoreGrammar {\n constructor(builder) {\n this.builder = builder;\n }\n begin() {\n return this.LINE;\n }\n LINE() {\n return {\n expect: [this.PIECE, this.PIECES, this.EOL],\n };\n }\n PIECE() {\n return {\n expect: [this.CHORDORNOTE, this.PARAMS],\n run: () => this.builder.commitPiece(),\n };\n }\n PIECES() {\n return {\n expect: [this.COMMA, this.PIECE],\n zeroOrMore: true,\n };\n }\n PARAMS() {\n return {\n expect: [this.DURATION, this.TYPE, this.DOTS, this.OPTS],\n };\n }\n CHORDORNOTE() {\n return {\n expect: [this.CHORD, this.SINGLENOTE],\n or: true,\n };\n }\n CHORD() {\n return {\n expect: [this.LPAREN, this.NOTES, this.RPAREN],\n // eslint-disable-next-line\n run: (state) => this.builder.addChord(state.matches[1]),\n };\n }\n NOTES() {\n return {\n expect: [this.NOTE],\n oneOrMore: true,\n };\n }\n NOTE() {\n return {\n expect: [this.NOTENAME, this.ACCIDENTAL, this.OCTAVE],\n };\n }\n SINGLENOTE() {\n return {\n expect: [this.NOTENAME, this.ACCIDENTAL, this.OCTAVE],\n run: (state) => {\n // eslint-disable-next-line\n const s = state;\n this.builder.addSingleNote(s.matches[0], s.matches[1], s.matches[2]);\n },\n };\n }\n ACCIDENTAL() {\n return {\n expect: [this.MICROTONES, this.ACCIDENTALS],\n maybe: true,\n or: true,\n };\n }\n DOTS() {\n return {\n expect: [this.DOT],\n zeroOrMore: true,\n // eslint-disable-next-line\n run: (state) => this.builder.setNoteDots(state.matches),\n };\n }\n TYPE() {\n return {\n expect: [this.SLASH, this.MAYBESLASH, this.TYPES],\n maybe: true,\n // eslint-disable-next-line\n run: (state) => this.builder.setNoteType(state.matches[2]),\n };\n }\n DURATION() {\n return {\n expect: [this.SLASH, this.DURATIONS],\n maybe: true,\n // eslint-disable-next-line\n run: (state) => this.builder.setNoteDuration(state.matches[1]),\n };\n }\n OPTS() {\n return {\n expect: [this.LBRACKET, this.KEYVAL, this.KEYVALS, this.RBRACKET],\n maybe: true,\n };\n }\n KEYVALS() {\n return {\n expect: [this.COMMA, this.KEYVAL],\n zeroOrMore: true,\n };\n }\n KEYVAL() {\n const unquote = (str) => str.slice(1, -1);\n return {\n expect: [this.KEY, this.EQUALS, this.VAL],\n // eslint-disable-next-line\n run: (state) => this.builder.addNoteOption(state.matches[0], unquote(state.matches[2])),\n };\n }\n VAL() {\n return {\n expect: [this.SVAL, this.DVAL],\n or: true,\n };\n }\n KEY() {\n return { token: '[a-zA-Z][a-zA-Z0-9]*' };\n }\n DVAL() {\n return { token: '[\"][^\"]*[\"]' };\n }\n SVAL() {\n return { token: \"['][^']*[']\" };\n }\n NOTENAME() {\n return { token: '[a-gA-G]' };\n }\n OCTAVE() {\n return { token: '[0-9]+' };\n }\n ACCIDENTALS() {\n return { token: 'bb|b|##|#|n' };\n }\n MICROTONES() {\n return { token: 'bbs|bss|bs|db|d|\\\\+\\\\+-|\\\\+-|\\\\+\\\\+|\\\\+|k|o' };\n }\n DURATIONS() {\n return { token: '[0-9whq]+' };\n }\n TYPES() {\n return { token: '[rRsSmMhHgG]' };\n }\n LPAREN() {\n return { token: '[(]' };\n }\n RPAREN() {\n return { token: '[)]' };\n }\n COMMA() {\n return { token: '[,]' };\n }\n DOT() {\n return { token: '[.]' };\n }\n SLASH() {\n return { token: '[/]' };\n }\n MAYBESLASH() {\n return { token: '[/]?' };\n }\n EQUALS() {\n return { token: '[=]' };\n }\n LBRACKET() {\n return { token: '\\\\[' };\n }\n RBRACKET() {\n return { token: '\\\\]' };\n }\n EOL() {\n return { token: '$' };\n }\n}\nexport class Piece {\n constructor(duration) {\n this.chord = [];\n this.dots = 0;\n this.options = {};\n this.duration = duration;\n }\n}\nexport class Builder {\n constructor(factory) {\n this.commitHooks = [];\n this.factory = factory;\n this.reset();\n }\n reset(options) {\n this.options = Object.assign({ stem: 'auto', clef: 'treble' }, options);\n this.elements = { notes: [], accidentals: [] };\n this.rollingDuration = '8';\n this.resetPiece();\n }\n getFactory() {\n return this.factory;\n }\n getElements() {\n return this.elements;\n }\n addCommitHook(commitHook) {\n this.commitHooks.push(commitHook);\n }\n resetPiece() {\n L('resetPiece');\n this.piece = new Piece(this.rollingDuration);\n }\n setNoteDots(dots) {\n L('setNoteDots:', dots);\n if (dots)\n this.piece.dots = dots.length;\n }\n setNoteDuration(duration) {\n L('setNoteDuration:', duration);\n this.rollingDuration = this.piece.duration = duration || this.rollingDuration;\n }\n setNoteType(type) {\n L('setNoteType:', type);\n if (type)\n this.piece.type = type;\n }\n addNoteOption(key, value) {\n L('addNoteOption: key:', key, 'value:', value);\n this.piece.options[key] = value;\n }\n addNote(key, accid, octave) {\n L('addNote:', key, accid, octave);\n this.piece.chord.push({\n key: key,\n accid,\n octave,\n });\n }\n addSingleNote(key, accid, octave) {\n L('addSingleNote:', key, accid, octave);\n this.addNote(key, accid, octave);\n }\n // notes is an array with 3 entries\n addChord(notes) {\n L('startChord');\n if (typeof notes[0] !== 'object') {\n this.addSingleNote(notes[0]);\n }\n else {\n notes.forEach((n) => {\n if (n)\n this.addNote(...n); // n => [string, string | null, string]\n });\n }\n L('endChord');\n }\n commitPiece() {\n L('commitPiece');\n const { factory } = this;\n if (!factory)\n return;\n const options = Object.assign(Object.assign({}, this.options), this.piece.options);\n // reset() sets this.options.stem & this.options.clef but we check to make sure nothing has changed.\n // e.g., auto | up | down\n const stem = defined(options.stem, 'BadArguments', 'options.stem is not defined').toLowerCase();\n // e.g., treble | bass\n const clef = defined(options.clef, 'BadArguments', 'options.clef is not defined').toLowerCase();\n const { chord, duration, dots, type } = this.piece;\n // Create a string[] that will be assigned to the .keys property of the StaveNote.\n // Each string in the array represents a note pitch and is of the form: {NoteName}{Accidental}/{Octave}\n // Only standard accidentals are included in the .keys property. Microtonal accidentals are not included.\n const standardAccidentals = Music.accidentals;\n const keys = chord.map((notePiece) => {\n var _a;\n return notePiece.key +\n (standardAccidentals.includes((_a = notePiece.accid) !== null && _a !== void 0 ? _a : '') ? notePiece.accid : '') +\n '/' +\n notePiece.octave;\n });\n const auto_stem = stem === 'auto'; // StaveNoteStruct expects the underscore & lowercase.\n // Build a GhostNote or StaveNote using the information we gathered.\n const note = (type === null || type === void 0 ? void 0 : type.toLowerCase()) == 'g'\n ? factory.GhostNote({ duration, dots })\n : factory.StaveNote({ keys, duration, dots, type, clef, auto_stem });\n if (!auto_stem)\n note.setStemDirection(stem === 'up' ? Stem.UP : Stem.DOWN);\n // Attach accidentals.\n const accidentals = [];\n chord.forEach((notePiece, index) => {\n const accid = notePiece.accid;\n if (typeof accid === 'string') {\n const accidental = factory.Accidental({ type: accid });\n note.addModifier(accidental, index);\n accidentals.push(accidental);\n }\n else {\n accidentals.push(undefined);\n }\n });\n // Attach dots.\n for (let i = 0; i < dots; i++)\n Dot.buildAndAttach([note], { all: true });\n this.commitHooks.forEach((commitHook) => commitHook(options, note, this));\n this.elements.notes.push(note);\n this.elements.accidentals.push(accidentals);\n this.resetPiece();\n }\n}\n/**\n * Commit hook used by EasyScore.setOptions().\n */\nfunction setId(options, note) {\n if (options.id === undefined)\n return;\n note.setAttribute('id', options.id);\n}\n// Used by setClass() below.\nconst commaSeparatedRegex = /\\s*,\\s*/;\n/**\n * Commit hook used by EasyScore.setOptions().\n */\nfunction setClass(options, note) {\n if (options.class === undefined)\n return;\n options.class.split(commaSeparatedRegex).forEach((className) => note.addClass(className));\n}\n/**\n * EasyScore implements a parser for a simple language to generate VexFlow objects.\n */\nexport class EasyScore {\n constructor(options = {}) {\n this.defaults = {\n clef: 'treble',\n time: '4/4',\n stem: 'auto',\n };\n this.setOptions(options);\n }\n /**\n * Set the score defaults.\n * clef must be set appropriately to avoid errors when adding Staves.\n * @param defaults.clef default clef ( treble | bass ...) see {@link Clef.types}\n * @param defaults.time default time signature ( 4/4 | 9/8 ...)\n * @param defaults.stem default stem arrangement (auto | up | down)\n * @returns this\n */\n set(defaults) {\n this.defaults = Object.assign(Object.assign({}, this.defaults), defaults);\n return this;\n }\n /**\n * @param options.factory is required.\n * @returns this\n */\n setOptions(options) {\n var _a, _b;\n // eslint-disable-next-line\n const factory = options.factory; // ! operator, because options.factory was set in Factory.EasyScore().\n const builder = (_a = options.builder) !== null && _a !== void 0 ? _a : new Builder(factory);\n this.options = Object.assign(Object.assign({ commitHooks: [setId, setClass, Articulation.easyScoreHook, FretHandFinger.easyScoreHook], throwOnError: false }, options), { factory,\n builder });\n this.factory = factory;\n this.builder = builder;\n this.grammar = new EasyScoreGrammar(this.builder);\n this.parser = new Parser(this.grammar);\n (_b = this.options.commitHooks) === null || _b === void 0 ? void 0 : _b.forEach((commitHook) => this.addCommitHook(commitHook));\n return this;\n }\n setContext(context) {\n this.factory.setContext(context);\n return this;\n }\n parse(line, options = {}) {\n this.builder.reset(options);\n const result = this.parser.parse(line);\n if (!result.success && this.options.throwOnError) {\n L(result);\n throw new RuntimeError('Error parsing line: ' + line);\n }\n return result;\n }\n beam(notes, options) {\n this.factory.Beam({ notes, options });\n return notes;\n }\n tuplet(notes, options) {\n this.factory.Tuplet({ notes, options });\n return notes;\n }\n notes(line, options = {}) {\n options = Object.assign({ clef: this.defaults.clef, stem: this.defaults.stem }, options);\n this.parse(line, options);\n return this.builder.getElements().notes;\n }\n voice(notes, options = {}) {\n options = Object.assign({ time: this.defaults.time }, options);\n return this.factory.Voice(options).addTickables(notes);\n }\n addCommitHook(commitHook) {\n this.builder.addCommitHook(commitHook);\n }\n}\nEasyScore.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Mohit Cheppudira\n// MIT License\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Registry } from './registry';\nimport { Category } from './typeguard';\nimport { defined } from './util';\n/**\n * Element implements a generic base class for VexFlow, with implementations\n * of general functions and properties that can be inherited by all VexFlow elements.\n */\nexport class Element {\n constructor() {\n var _a;\n this.attrs = {\n id: Element.newID(),\n el: undefined,\n type: this.getCategory(),\n classes: {},\n };\n this.rendered = false;\n // If a default registry exist, then register with it right away.\n (_a = Registry.getDefaultRegistry()) === null || _a === void 0 ? void 0 : _a.register(this);\n }\n static get CATEGORY() {\n return Category.Element;\n }\n static newID() {\n return `auto${Element.ID++}`;\n }\n /** Get element category string. */\n getCategory() {\n return this.constructor.CATEGORY;\n }\n /**\n * Set the element style used to render.\n *\n * Example:\n * ```typescript\n * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' });\n * element.draw();\n * ```\n * Note: If the element draws additional sub-elements (ie.: Modifiers in a Stave),\n * the style can be applied to all of them by means of the context:\n * ```typescript\n * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' });\n * element.getContext().setFillStyle('red');\n * element.getContext().setStrokeStyle('red');\n * element.draw();\n * ```\n * or using drawWithStyle:\n * ```typescript\n * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' });\n * element.drawWithStyle();\n * ```\n */\n setStyle(style) {\n this.style = style;\n return this;\n }\n /** Get the element style used for rendering. */\n getStyle() {\n return this.style;\n }\n /** Apply the element style to `context`. */\n applyStyle(context = this.context, style = this.getStyle()) {\n if (!style)\n return this;\n if (!context)\n return this;\n context.save();\n if (style.shadowColor)\n context.setShadowColor(style.shadowColor);\n if (style.shadowBlur)\n context.setShadowBlur(style.shadowBlur);\n if (style.fillStyle)\n context.setFillStyle(style.fillStyle);\n if (style.strokeStyle)\n context.setStrokeStyle(style.strokeStyle);\n if (style.lineWidth)\n context.setLineWidth(style.lineWidth);\n return this;\n }\n /** Restore the style of `context`. */\n restoreStyle(context = this.context, style = this.getStyle()) {\n if (!style)\n return this;\n if (!context)\n return this;\n context.restore();\n return this;\n }\n /**\n * Draw the element and all its sub-elements (ie.: Modifiers in a Stave)\n * with the element style.\n */\n drawWithStyle() {\n this.checkContext();\n this.applyStyle();\n this.draw();\n this.restoreStyle();\n }\n /** Check if it has a class label (An element can have multiple class labels). */\n hasClass(className) {\n return this.attrs.classes[className] === true;\n }\n /** Add a class label (An element can have multiple class labels). */\n addClass(className) {\n var _a;\n this.attrs.classes[className] = true;\n (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({\n id: this.attrs.id,\n name: 'class',\n value: className,\n oldValue: undefined,\n });\n return this;\n }\n /** Remove a class label (An element can have multiple class labels). */\n removeClass(className) {\n var _a;\n delete this.attrs.classes[className];\n (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({\n id: this.attrs.id,\n name: 'class',\n value: undefined,\n oldValue: className,\n });\n return this;\n }\n /** Call back from registry after the element is registered. */\n onRegister(registry) {\n this.registry = registry;\n return this;\n }\n /** Return the rendered status. */\n isRendered() {\n return this.rendered;\n }\n /** Set the rendered status. */\n setRendered(rendered = true) {\n this.rendered = rendered;\n return this;\n }\n /** Return the element attributes. */\n getAttributes() {\n return this.attrs;\n }\n /** Return an attribute. */\n // eslint-disable-next-line\n getAttribute(name) {\n return this.attrs[name];\n }\n /** Set an attribute. */\n // eslint-disable-next-line\n setAttribute(name, value) {\n var _a;\n const oldID = this.attrs.id;\n const oldValue = this.attrs[name];\n this.attrs[name] = value;\n // Register with old id to support id changes.\n (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({ id: oldID, name, value, oldValue });\n return this;\n }\n /** Get the boundingBox. */\n getBoundingBox() {\n return this.boundingBox;\n }\n /** Return the context. */\n getContext() {\n return this.context;\n }\n /** Set the context. */\n setContext(context) {\n this.context = context;\n return this;\n }\n /** Validate and return the context. */\n checkContext() {\n return defined(this.context, 'NoContext', 'No rendering context attached to instance.');\n }\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // Font Handling\n /**\n * Provide a CSS compatible font string (e.g., 'bold 16px Arial').\n */\n set font(f) {\n this.setFont(f);\n }\n /** Returns the CSS compatible font string. */\n get font() {\n return Font.toCSSString(this.textFont);\n }\n /**\n * Set the element's font family, size, weight, style (e.g., `Arial`, `10pt`, `bold`, `italic`).\n * @param font is 1) a `FontInfo` object or\n * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or\n * 3) a string representing the font family (at least one of `size`, `weight`, or `style` must also be provided).\n * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt').\n * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900).\n * @param style is a string (e.g., 'italic', 'normal').\n * If no arguments are provided, then the font is set to the default font.\n * Each Element subclass may specify its own default by overriding the static `TEXT_FONT` property.\n */\n setFont(font, size, weight, style) {\n // Allow subclasses to override `TEXT_FONT`.\n const defaultTextFont = this.constructor.TEXT_FONT;\n const fontIsObject = typeof font === 'object';\n const fontIsString = typeof font === 'string';\n const fontIsUndefined = font === undefined;\n const sizeWeightStyleAreUndefined = size === undefined && weight === undefined && style === undefined;\n if (fontIsObject) {\n // `font` is case 1) a FontInfo object\n this.textFont = Object.assign(Object.assign({}, defaultTextFont), font);\n }\n else if (fontIsString && sizeWeightStyleAreUndefined) {\n // `font` is case 2) CSS font shorthand.\n this.textFont = Font.fromCSSString(font);\n }\n else if (fontIsUndefined && sizeWeightStyleAreUndefined) {\n // All arguments are undefined. Do not check for `arguments.length === 0`,\n // which fails on the edge case: `setFont(undefined)`.\n // TODO: See if we can remove this case entirely without introducing a visual diff.\n // The else case below seems like it should be equivalent to this case.\n this.textFont = Object.assign({}, defaultTextFont);\n }\n else {\n // `font` is case 3) a font family string (e.g., 'Times New Roman').\n // The other parameters represent the size, weight, and style.\n // It is okay for `font` to be undefined while one or more of the other arguments is provided.\n // Following CSS conventions, unspecified params are reset to the default.\n this.textFont = Font.validate(font !== null && font !== void 0 ? font : defaultTextFont.family, size !== null && size !== void 0 ? size : defaultTextFont.size, weight !== null && weight !== void 0 ? weight : defaultTextFont.weight, style !== null && style !== void 0 ? style : defaultTextFont.style);\n }\n return this;\n }\n getFont() {\n if (!this.textFont) {\n this.resetFont();\n }\n return Font.toCSSString(this.textFont);\n }\n /**\n * Reset the text font to the style indicated by the static `TEXT_FONT` property.\n * Subclasses can call this to initialize `textFont` for the first time.\n */\n resetFont() {\n this.setFont();\n }\n /** Return a copy of the current FontInfo object. */\n get fontInfo() {\n if (!this.textFont) {\n this.resetFont();\n }\n // We can cast to Required here, because\n // we just called resetFont() above to ensure this.textFont is set.\n return Object.assign({}, this.textFont);\n }\n set fontInfo(fontInfo) {\n this.setFont(fontInfo);\n }\n /** Change the font size, while keeping everything else the same. */\n setFontSize(size) {\n const fontInfo = this.fontInfo;\n this.setFont(fontInfo.family, size, fontInfo.weight, fontInfo.style);\n return this;\n }\n /**\n * @returns a CSS font-size string (e.g., '18pt', '12px', '1em').\n * See Element.fontSizeInPixels or Element.fontSizeInPoints if you need to get a number for calculation purposes.\n */\n getFontSize() {\n return this.fontSize;\n }\n /**\n * The size is 1) a string of the form '10pt' or '16px', compatible with the CSS font-size property.\n * or 2) a number, which is interpreted as a point size (i.e. 12 == '12pt').\n */\n set fontSize(size) {\n this.setFontSize(size);\n }\n /**\n * @returns a CSS font-size string (e.g., '18pt', '12px', '1em').\n */\n get fontSize() {\n let size = this.fontInfo.size;\n if (typeof size === 'number') {\n size = `${size}pt`;\n }\n return size;\n }\n /**\n * @returns the font size in `pt`.\n */\n get fontSizeInPoints() {\n return Font.convertSizeToPointValue(this.fontSize);\n }\n /**\n * @returns the font size in `px`.\n */\n get fontSizeInPixels() {\n return Font.convertSizeToPixelValue(this.fontSize);\n }\n /**\n * @returns a CSS font-style string (e.g., 'italic').\n */\n get fontStyle() {\n return this.fontInfo.style;\n }\n set fontStyle(style) {\n const fontInfo = this.fontInfo;\n this.setFont(fontInfo.family, fontInfo.size, fontInfo.weight, style);\n }\n /**\n * @returns a CSS font-weight string (e.g., 'bold').\n * As in CSS, font-weight is always returned as a string, even if it was set as a number.\n */\n get fontWeight() {\n return this.fontInfo.weight + '';\n }\n set fontWeight(weight) {\n const fontInfo = this.fontInfo;\n this.setFont(fontInfo.family, fontInfo.size, weight, fontInfo.style);\n }\n}\nElement.ID = 1000;\n/**\n * Default font for text. This is not related to music engraving. Instead, see `Flow.setMusicFont(...fontNames)`\n * to customize the font for musical symbols placed on the score.\n */\nElement.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: Font.SIZE,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Mohit Cheppudira\n// MIT License\nimport { Accidental } from './accidental';\nimport { Annotation, AnnotationHorizontalJustify, AnnotationVerticalJustify } from './annotation';\nimport { Articulation } from './articulation';\nimport { BarNote } from './barnote';\nimport { Beam } from './beam';\nimport { ChordSymbol } from './chordsymbol';\nimport { ClefNote } from './clefnote';\nimport { Curve } from './curve';\nimport { EasyScore } from './easyscore';\nimport { Element } from './element';\nimport { Formatter } from './formatter';\nimport { FretHandFinger } from './frethandfinger';\nimport { GhostNote } from './ghostnote';\nimport { GlyphNote } from './glyphnote';\nimport { GraceNote } from './gracenote';\nimport { GraceNoteGroup } from './gracenotegroup';\nimport { KeySigNote } from './keysignote';\nimport { ModifierContext } from './modifiercontext';\nimport { MultiMeasureRest } from './multimeasurerest';\nimport { NoteSubGroup } from './notesubgroup';\nimport { PedalMarking } from './pedalmarking';\nimport { Renderer } from './renderer';\nimport { RepeatNote } from './repeatnote';\nimport { Stave } from './stave';\nimport { StaveConnector } from './staveconnector';\nimport { StaveLine } from './staveline';\nimport { StaveNote } from './stavenote';\nimport { StaveTie } from './stavetie';\nimport { StringNumber } from './stringnumber';\nimport { System } from './system';\nimport { TabNote } from './tabnote';\nimport { TabStave } from './tabstave';\nimport { TextBracket } from './textbracket';\nimport { TextDynamics } from './textdynamics';\nimport { TextNote } from './textnote';\nimport { TickContext } from './tickcontext';\nimport { TimeSigNote } from './timesignote';\nimport { Tuplet } from './tuplet';\nimport { defined, log, RuntimeError } from './util';\nimport { VibratoBracket } from './vibratobracket';\nimport { Voice } from './voice';\nimport { isHTMLCanvas } from './web';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Factory.DEBUG)\n log('Vex.Flow.Factory', args);\n}\n/**\n * Factory implements a high level API around VexFlow.\n */\nexport class Factory {\n /**\n * Example:\n *\n * Create an SVG renderer and attach it to the DIV element named \"boo\" to render using 1200 and 600\n *\n * `const vf: Factory = new Vex.Flow.Factory({renderer: { elementId: 'boo', width: 1200, height: 600 }});`\n */\n constructor(options = {}) {\n L('New factory: ', options);\n this.options = {\n stave: {\n space: 10,\n },\n renderer: {\n elementId: '',\n width: 500,\n height: 200,\n background: '#FFF',\n },\n font: Factory.TEXT_FONT,\n };\n this.setOptions(options);\n }\n /**\n * Static simplified function to access constructor without providing FactoryOptions\n *\n * Example:\n *\n * Create an SVG renderer and attach it to the DIV element named \"boo\" to render using 1200 and 600\n *\n * `const vf: Factory = Vex.Flow.Factory.newFromElementId('boo', 1200, 600 );`\n */\n static newFromElementId(elementId, width = 500, height = 200) {\n return new Factory({ renderer: { elementId, width, height } });\n }\n reset() {\n this.renderQ = [];\n this.systems = [];\n this.staves = [];\n this.voices = [];\n this.stave = undefined; // current stave\n }\n setOptions(options) {\n this.options = Object.assign(Object.assign({}, this.options), options);\n this.initRenderer();\n this.reset();\n }\n initRenderer() {\n const { elementId, width, height, background } = this.options.renderer;\n if (elementId == null) {\n return;\n }\n if (elementId == '') {\n L(this);\n throw new RuntimeError('renderer.elementId not set in FactoryOptions');\n }\n let backend = this.options.renderer.backend;\n if (backend === undefined) {\n const elem = document.getElementById(elementId);\n // We use a custom type check here, because node-canvas mimics canvas,\n // but is not an instance of window.HTMLCanvasElement.\n // In fact, `window` might be undefined here.\n // See: https://www.npmjs.com/package/canvas\n if (isHTMLCanvas(elem)) {\n backend = Renderer.Backends.CANVAS;\n }\n else {\n backend = Renderer.Backends.SVG;\n }\n }\n this.context = Renderer.buildContext(elementId, backend, width, height, background);\n }\n getContext() {\n return this.context;\n }\n setContext(context) {\n this.context = context;\n return this;\n }\n getStave() {\n return this.stave;\n }\n getVoices() {\n return this.voices;\n }\n /** Return pixels from current stave spacing. */\n Stave(params) {\n const staveSpace = this.options.stave.space;\n const p = Object.assign({ x: 0, y: 0, width: this.options.renderer.width - staveSpace * 1.0, options: { spacing_between_lines_px: staveSpace * 1.0 } }, params);\n const stave = new Stave(p.x, p.y, p.width, p.options);\n this.staves.push(stave);\n stave.setContext(this.context);\n this.stave = stave;\n return stave;\n }\n TabStave(params) {\n const staveSpace = this.options.stave.space;\n const p = Object.assign({ x: 0, y: 0, width: this.options.renderer.width - staveSpace * 1.0, options: { spacing_between_lines_px: staveSpace * 1.3 } }, params);\n const stave = new TabStave(p.x, p.y, p.width, p.options);\n this.staves.push(stave);\n stave.setContext(this.context);\n this.stave = stave;\n return stave;\n }\n StaveNote(noteStruct) {\n const note = new StaveNote(noteStruct);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n GlyphNote(glyph, noteStruct, options) {\n const note = new GlyphNote(glyph, noteStruct, options);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n RepeatNote(type, noteStruct, options) {\n const note = new RepeatNote(type, noteStruct, options);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n GhostNote(noteStruct) {\n const ghostNote = new GhostNote(noteStruct);\n if (this.stave)\n ghostNote.setStave(this.stave);\n ghostNote.setContext(this.context);\n this.renderQ.push(ghostNote);\n return ghostNote;\n }\n TextNote(noteStruct) {\n const textNote = new TextNote(noteStruct);\n if (this.stave)\n textNote.setStave(this.stave);\n textNote.setContext(this.context);\n this.renderQ.push(textNote);\n return textNote;\n }\n BarNote(params = {}) {\n const barNote = new BarNote(params.type);\n if (this.stave)\n barNote.setStave(this.stave);\n barNote.setContext(this.context);\n this.renderQ.push(barNote);\n return barNote;\n }\n ClefNote(params) {\n const p = Object.assign({ type: 'treble', options: {\n size: 'default',\n annotation: undefined,\n } }, params);\n const clefNote = new ClefNote(p.type, p.options.size, p.options.annotation);\n if (this.stave)\n clefNote.setStave(this.stave);\n clefNote.setContext(this.context);\n this.renderQ.push(clefNote);\n return clefNote;\n }\n TimeSigNote(params) {\n const p = Object.assign({ time: '4/4' }, params);\n const timeSigNote = new TimeSigNote(p.time);\n if (this.stave)\n timeSigNote.setStave(this.stave);\n timeSigNote.setContext(this.context);\n this.renderQ.push(timeSigNote);\n return timeSigNote;\n }\n KeySigNote(params) {\n const keySigNote = new KeySigNote(params.key, params.cancelKey, params.alterKey);\n if (this.stave)\n keySigNote.setStave(this.stave);\n keySigNote.setContext(this.context);\n this.renderQ.push(keySigNote);\n return keySigNote;\n }\n TabNote(noteStruct) {\n const note = new TabNote(noteStruct);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n GraceNote(noteStruct) {\n const note = new GraceNote(noteStruct);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n return note;\n }\n GraceNoteGroup(params) {\n const group = new GraceNoteGroup(params.notes, params.slur);\n group.setContext(this.context);\n return group;\n }\n Accidental(params) {\n const accid = new Accidental(params.type);\n accid.setContext(this.context);\n return accid;\n }\n Annotation(params) {\n const p = Object.assign({ text: 'p', hJustify: AnnotationHorizontalJustify.CENTER, vJustify: AnnotationVerticalJustify.BOTTOM }, params);\n const annotation = new Annotation(p.text);\n annotation.setJustification(p.hJustify);\n annotation.setVerticalJustification(p.vJustify);\n annotation.setFont(p.font);\n annotation.setContext(this.context);\n return annotation;\n }\n ChordSymbol(params) {\n const p = Object.assign({ vJustify: 'top', hJustify: 'center', kerning: true, reportWidth: true }, params);\n const chordSymbol = new ChordSymbol();\n chordSymbol.setHorizontal(p.hJustify);\n chordSymbol.setVertical(p.vJustify);\n chordSymbol.setEnableKerning(p.kerning);\n chordSymbol.setReportWidth(p.reportWidth);\n // There is a default font based on the engraving font. Only set then\n // font if it is specific, else use the default\n if (typeof p.fontFamily === 'string' && typeof p.fontSize === 'number') {\n if (typeof p.fontWeight === 'string')\n chordSymbol.setFont(p.fontFamily, p.fontSize, p.fontWeight);\n else\n chordSymbol.setFont(p.fontFamily, p.fontSize, '');\n }\n else if (typeof p.fontSize === 'number') {\n chordSymbol.setFontSize(p.fontSize);\n }\n chordSymbol.setContext(this.context);\n return chordSymbol;\n }\n Articulation(params) {\n const p = Object.assign({ type: 'a.', position: 'above' }, params);\n const articulation = new Articulation(p.type);\n articulation.setPosition(p.position);\n articulation.setContext(this.context);\n return articulation;\n }\n TextDynamics(params) {\n const p = Object.assign({ text: 'p', duration: 'q', dots: 0, line: 0 }, params);\n const text = new TextDynamics({\n text: p.text,\n line: p.line,\n duration: p.duration,\n dots: p.dots,\n });\n if (this.stave)\n text.setStave(this.stave);\n text.setContext(this.context);\n this.renderQ.push(text);\n return text;\n }\n Fingering(params) {\n const p = Object.assign({ number: '0', position: 'left' }, params);\n const fingering = new FretHandFinger(p.number);\n fingering.setPosition(p.position);\n fingering.setContext(this.context);\n return fingering;\n }\n StringNumber(params) {\n const stringNumber = new StringNumber(params.number);\n stringNumber.setPosition(params.position);\n stringNumber.setContext(this.context);\n return stringNumber;\n }\n TickContext() {\n return new TickContext();\n }\n ModifierContext() {\n return new ModifierContext();\n }\n MultiMeasureRest(params) {\n const numMeasures = defined(params.number_of_measures, 'NoNumberOfMeasures');\n const multiMeasureRest = new MultiMeasureRest(numMeasures, params);\n multiMeasureRest.setContext(this.context);\n this.renderQ.push(multiMeasureRest);\n return multiMeasureRest;\n }\n Voice(params) {\n const p = Object.assign({ time: '4/4' }, params);\n const voice = new Voice(p.time, p.options);\n this.voices.push(voice);\n return voice;\n }\n StaveConnector(params) {\n const connector = new StaveConnector(params.top_stave, params.bottom_stave);\n connector.setType(params.type).setContext(this.context);\n this.renderQ.push(connector);\n return connector;\n }\n Formatter(options) {\n return new Formatter(options);\n }\n Tuplet(params) {\n const p = Object.assign({ notes: [], options: {} }, params);\n const tuplet = new Tuplet(p.notes, p.options).setContext(this.context);\n this.renderQ.push(tuplet);\n return tuplet;\n }\n Beam(params) {\n var _a, _b, _c;\n const beam = new Beam(params.notes, (_a = params.options) === null || _a === void 0 ? void 0 : _a.autoStem).setContext(this.context);\n beam.breakSecondaryAt((_c = (_b = params.options) === null || _b === void 0 ? void 0 : _b.secondaryBeamBreaks) !== null && _c !== void 0 ? _c : []);\n this.renderQ.push(beam);\n return beam;\n }\n Curve(params) {\n const curve = new Curve(params.from, params.to, params.options).setContext(this.context);\n this.renderQ.push(curve);\n return curve;\n }\n StaveTie(params) {\n var _a;\n const tie = new StaveTie({\n first_note: params.from,\n last_note: params.to,\n first_indices: params.first_indices,\n last_indices: params.last_indices,\n }, params.text);\n if ((_a = params.options) === null || _a === void 0 ? void 0 : _a.direction)\n tie.setDirection(params.options.direction);\n tie.setContext(this.context);\n this.renderQ.push(tie);\n return tie;\n }\n StaveLine(params) {\n var _a, _b;\n const line = new StaveLine({\n first_note: params.from,\n last_note: params.to,\n first_indices: params.first_indices,\n last_indices: params.last_indices,\n });\n if ((_a = params.options) === null || _a === void 0 ? void 0 : _a.text)\n line.setText(params.options.text);\n if ((_b = params.options) === null || _b === void 0 ? void 0 : _b.font)\n line.setFont(params.options.font);\n line.setContext(this.context);\n this.renderQ.push(line);\n return line;\n }\n VibratoBracket(params) {\n const vibratoBracket = new VibratoBracket({\n start: params.from,\n stop: params.to,\n });\n if (params.options.line)\n vibratoBracket.setLine(params.options.line);\n if (params.options.harsh)\n vibratoBracket.setHarsh(params.options.harsh);\n vibratoBracket.setContext(this.context);\n this.renderQ.push(vibratoBracket);\n return vibratoBracket;\n }\n TextBracket(params) {\n const textBracket = new TextBracket({\n start: params.from,\n stop: params.to,\n text: params.text,\n superscript: params.options.superscript,\n position: params.options.position,\n });\n if (params.options.line)\n textBracket.setLine(params.options.line);\n if (params.options.font)\n textBracket.setFont(params.options.font);\n textBracket.setContext(this.context);\n this.renderQ.push(textBracket);\n return textBracket;\n }\n System(params = {}) {\n params.factory = this;\n const system = new System(params).setContext(this.context);\n this.systems.push(system);\n return system;\n }\n /**\n * Creates EasyScore. Normally the first step after constructing a Factory. For example:\n * ```\n * const vf: Factory = new Vex.Flow.Factory({renderer: { elementId: 'boo', width: 1200, height: 600 }});\n * const score: EasyScore = vf.EasyScore();\n * ```\n * @param options.factory optional instance of Factory\n * @param options.builder instance of Builder\n * @param options.commitHooks function to call after a note element is created\n * @param options.throwOnError throw error in case of parsing error\n */\n EasyScore(options = {}) {\n options.factory = this;\n return new EasyScore(options);\n }\n PedalMarking(params) {\n const p = Object.assign({ notes: [], options: {\n style: 'mixed',\n } }, params);\n const pedal = new PedalMarking(p.notes);\n pedal.setType(PedalMarking.typeString[p.options.style]);\n pedal.setContext(this.context);\n this.renderQ.push(pedal);\n return pedal;\n }\n NoteSubGroup(params) {\n const p = Object.assign({ notes: [] }, params);\n const group = new NoteSubGroup(p.notes);\n group.setContext(this.context);\n return group;\n }\n /** Render the score. */\n draw() {\n const ctx = this.context;\n this.systems.forEach((s) => s.setContext(ctx).format());\n this.staves.forEach((s) => s.setContext(ctx).draw());\n this.voices.forEach((v) => v.setContext(ctx).draw());\n this.renderQ.forEach((e) => {\n if (!e.isRendered())\n e.setContext(ctx).draw();\n });\n this.systems.forEach((s) => s.setContext(ctx).draw());\n this.reset();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Factory.DEBUG` to `true`. */\nFactory.DEBUG = false;\n/** Default text font. */\nFactory.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { Accidental } from './accidental';\nimport { Annotation } from './annotation';\nimport { Articulation } from './articulation';\nimport { BarNote } from './barnote';\nimport { Beam } from './beam';\nimport { Bend } from './bend';\nimport { BoundingBox } from './boundingbox';\nimport { BoundingBoxComputation } from './boundingboxcomputation';\nimport { CanvasContext } from './canvascontext';\nimport { ChordSymbol } from './chordsymbol';\nimport { Clef } from './clef';\nimport { ClefNote } from './clefnote';\nimport { Crescendo } from './crescendo';\nimport { Curve } from './curve';\nimport { Dot } from './dot';\nimport { EasyScore } from './easyscore';\nimport { Element } from './element';\nimport { Factory } from './factory';\nimport { Font } from './font';\nimport { Formatter } from './formatter';\nimport { Fraction } from './fraction';\nimport { FretHandFinger } from './frethandfinger';\nimport { GhostNote } from './ghostnote';\nimport { Glyph } from './glyph';\nimport { GlyphNote } from './glyphnote';\nimport { GraceNote } from './gracenote';\nimport { GraceNoteGroup } from './gracenotegroup';\nimport { GraceTabNote } from './gracetabnote';\nimport { KeyManager } from './keymanager';\nimport { KeySignature } from './keysignature';\nimport { KeySigNote } from './keysignote';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { ModifierContext } from './modifiercontext';\nimport { MultiMeasureRest } from './multimeasurerest';\nimport { Music } from './music';\nimport { Note } from './note';\nimport { NoteHead } from './notehead';\nimport { NoteSubGroup } from './notesubgroup';\nimport { Ornament } from './ornament';\nimport { Parenthesis } from './parenthesis';\nimport { Parser } from './parser';\nimport { PedalMarking } from './pedalmarking';\nimport { Registry } from './registry';\nimport { RenderContext } from './rendercontext';\nimport { Renderer } from './renderer';\nimport { RepeatNote } from './repeatnote';\nimport { Stave } from './stave';\nimport { Barline, BarlineType } from './stavebarline';\nimport { StaveConnector } from './staveconnector';\nimport { StaveHairpin } from './stavehairpin';\nimport { StaveLine } from './staveline';\nimport { StaveModifier } from './stavemodifier';\nimport { StaveNote } from './stavenote';\nimport { Repetition } from './staverepetition';\nimport { StaveTempo } from './stavetempo';\nimport { StaveText } from './stavetext';\nimport { StaveTie } from './stavetie';\nimport { Volta } from './stavevolta';\nimport { Stem } from './stem';\nimport { StringNumber } from './stringnumber';\nimport { Stroke } from './strokes';\nimport { SVGContext } from './svgcontext';\nimport { System } from './system';\nimport { Tables } from './tables';\nimport { TabNote } from './tabnote';\nimport { TabSlide } from './tabslide';\nimport { TabStave } from './tabstave';\nimport { TabTie } from './tabtie';\nimport { TextBracket } from './textbracket';\nimport { TextDynamics } from './textdynamics';\nimport { TextFormatter } from './textformatter';\nimport { TextNote } from './textnote';\nimport { TickContext } from './tickcontext';\nimport { TimeSignature } from './timesignature';\nimport { TimeSigNote } from './timesignote';\nimport { Tremolo } from './tremolo';\nimport { Tuning } from './tuning';\nimport { Tuplet } from './tuplet';\nimport { DATE, ID, VERSION } from './version';\nimport { Vibrato } from './vibrato';\nimport { VibratoBracket } from './vibratobracket';\nimport { Voice } from './voice';\nexport class Flow {\n static get BUILD() {\n return {\n /** version number. */\n VERSION: VERSION,\n /** git commit ID that this library was built from. */\n ID: ID,\n /** The date when this library was compiled. */\n DATE: DATE,\n };\n }\n static get Flow() {\n // This (circular reference) provides a handy shortcut for importing VexFlow via `require()`.\n // For example:\n // const Vex = require('vexflow');\n // const { Flow, Stave, StaveNote, Formatter, Renderer } = Vex.Flow;\n return Flow;\n }\n // ... more to come ...\n /**\n * Examples:\n * ```\n * Vex.Flow.setMusicFont('Petaluma');\n * Vex.Flow.setMusicFont('Bravura', 'Gonville');\n * ```\n *\n * **CASE 1**: You are using `vexflow.js`, which includes all music fonts (Bravura, Gonville, Petaluma, Custom).\n * In this case, calling this method is optional, since VexFlow already defaults to a music font stack of:\n * 'Bravura', 'Gonville', 'Custom'.\n *\n * **CASE 2**: You are using `vexflow-bravura.js` or `vexflow-petaluma.js` or `vexflow-gonville.js`,\n * which includes a single music font. Calling this method is unnecessary.\n *\n * **CASE 3**: You are using the light weight `vexflow-core.js` to take advantage of lazy loading for fonts.\n * In this case, the default music font stack is empty.\n * Example:\n * ```\n * await Vex.Flow.fetchMusicFont('Petaluma');\n * Vex.Flow.setMusicFont('Petaluma');\n * ... (do VexFlow stuff) ...\n * ```\n * See `demos/fonts/` for more examples.\n *\n * @returns an array of Font objects corresponding to the provided `fontNames`.\n */\n static setMusicFont(...fontNames) {\n // Convert the array of font names into an array of Font objects.\n const fonts = fontNames.map((fontName) => Font.load(fontName));\n Tables.MUSIC_FONT_STACK = fonts;\n Glyph.MUSIC_FONT_STACK = fonts.slice();\n Glyph.CURRENT_CACHE_KEY = fontNames.join(',');\n return fonts;\n }\n /**\n * Used with vexflow-core which supports dynamic font loading.\n */\n // eslint-disable-next-line\n static fetchMusicFont(fontName, fontModuleOrPath) {\n return __awaiter(this, void 0, void 0, function* () {\n // The default implementation does nothing.\n // See vexflow-core.ts for the implementation that vexflow-core.js uses.\n });\n }\n static getMusicFont() {\n const fonts = Tables.MUSIC_FONT_STACK;\n return fonts.map((font) => font.getName());\n }\n static get NOTATION_FONT_SCALE() {\n return Tables.NOTATION_FONT_SCALE;\n }\n static set NOTATION_FONT_SCALE(value) {\n Tables.NOTATION_FONT_SCALE = value;\n }\n static get TABLATURE_FONT_SCALE() {\n return Tables.TABLATURE_FONT_SCALE;\n }\n static set TABLATURE_FONT_SCALE(value) {\n Tables.TABLATURE_FONT_SCALE = value;\n }\n static get RESOLUTION() {\n return Tables.RESOLUTION;\n }\n static set RESOLUTION(value) {\n Tables.RESOLUTION = value;\n }\n static get SLASH_NOTEHEAD_WIDTH() {\n return Tables.SLASH_NOTEHEAD_WIDTH;\n }\n static set SLASH_NOTEHEAD_WIDTH(value) {\n Tables.SLASH_NOTEHEAD_WIDTH = value;\n }\n static get STAVE_LINE_DISTANCE() {\n return Tables.STAVE_LINE_DISTANCE;\n }\n static set STAVE_LINE_DISTANCE(value) {\n Tables.STAVE_LINE_DISTANCE = value;\n }\n static get STAVE_LINE_THICKNESS() {\n return Tables.STAVE_LINE_THICKNESS;\n }\n static set STAVE_LINE_THICKNESS(value) {\n Tables.STAVE_LINE_THICKNESS = value;\n }\n static get STEM_HEIGHT() {\n return Tables.STEM_HEIGHT;\n }\n static set STEM_HEIGHT(value) {\n Tables.STEM_HEIGHT = value;\n }\n static get STEM_WIDTH() {\n return Tables.STEM_WIDTH;\n }\n static set STEM_WIDTH(value) {\n Tables.STEM_WIDTH = value;\n }\n static get TIME4_4() {\n return Tables.TIME4_4;\n }\n static get accidentalMap() {\n return Tables.accidentalMap;\n }\n static get unicode() {\n return Tables.unicode;\n }\n static keySignature(spec) {\n return Tables.keySignature(spec);\n }\n static hasKeySignature(spec) {\n return Tables.hasKeySignature(spec);\n }\n static getKeySignatures() {\n return Tables.getKeySignatures();\n }\n static clefProperties(clef) {\n return Tables.clefProperties(clef);\n }\n // eslint-disable-next-line\n static keyProperties(key, clef, params) {\n return Tables.keyProperties(key, clef, params);\n }\n static durationToTicks(duration) {\n return Tables.durationToTicks(duration);\n }\n}\nFlow.Accidental = Accidental;\nFlow.Annotation = Annotation;\nFlow.Articulation = Articulation;\nFlow.Barline = Barline;\nFlow.BarNote = BarNote;\nFlow.Beam = Beam;\nFlow.Bend = Bend;\nFlow.BoundingBox = BoundingBox;\nFlow.BoundingBoxComputation = BoundingBoxComputation;\nFlow.CanvasContext = CanvasContext;\nFlow.ChordSymbol = ChordSymbol;\nFlow.Clef = Clef;\nFlow.ClefNote = ClefNote;\nFlow.Crescendo = Crescendo;\nFlow.Curve = Curve;\nFlow.Dot = Dot;\nFlow.EasyScore = EasyScore;\nFlow.Element = Element;\nFlow.Factory = Factory;\nFlow.Font = Font;\nFlow.Formatter = Formatter;\nFlow.Fraction = Fraction;\nFlow.FretHandFinger = FretHandFinger;\nFlow.GhostNote = GhostNote;\nFlow.Glyph = Glyph;\nFlow.GlyphNote = GlyphNote;\nFlow.GraceNote = GraceNote;\nFlow.GraceNoteGroup = GraceNoteGroup;\nFlow.GraceTabNote = GraceTabNote;\nFlow.KeyManager = KeyManager;\nFlow.KeySignature = KeySignature;\nFlow.KeySigNote = KeySigNote;\nFlow.Modifier = Modifier;\nFlow.ModifierContext = ModifierContext;\nFlow.MultiMeasureRest = MultiMeasureRest;\nFlow.Music = Music;\nFlow.Note = Note;\nFlow.NoteHead = NoteHead;\nFlow.NoteSubGroup = NoteSubGroup;\nFlow.Ornament = Ornament;\nFlow.Parenthesis = Parenthesis;\nFlow.Parser = Parser;\nFlow.PedalMarking = PedalMarking;\nFlow.Registry = Registry;\nFlow.RenderContext = RenderContext;\nFlow.Renderer = Renderer;\nFlow.RepeatNote = RepeatNote;\nFlow.Repetition = Repetition;\nFlow.Stave = Stave;\nFlow.StaveConnector = StaveConnector;\nFlow.StaveHairpin = StaveHairpin;\nFlow.StaveLine = StaveLine;\nFlow.StaveModifier = StaveModifier;\nFlow.StaveNote = StaveNote;\nFlow.StaveTempo = StaveTempo;\nFlow.StaveText = StaveText;\nFlow.StaveTie = StaveTie;\nFlow.Stem = Stem;\nFlow.StringNumber = StringNumber;\nFlow.Stroke = Stroke;\nFlow.SVGContext = SVGContext;\nFlow.System = System;\nFlow.TabNote = TabNote;\nFlow.TabSlide = TabSlide;\nFlow.TabStave = TabStave;\nFlow.TabTie = TabTie;\nFlow.TextBracket = TextBracket;\nFlow.TextDynamics = TextDynamics;\nFlow.TextFormatter = TextFormatter;\nFlow.TextNote = TextNote;\nFlow.TickContext = TickContext;\nFlow.TimeSignature = TimeSignature;\nFlow.TimeSigNote = TimeSigNote;\nFlow.Tremolo = Tremolo;\nFlow.Tuning = Tuning;\nFlow.Tuplet = Tuplet;\nFlow.Vibrato = Vibrato;\nFlow.VibratoBracket = VibratoBracket;\nFlow.Voice = Voice;\nFlow.Volta = Volta;\n// enums need to be exported too!\nFlow.BarlineType = BarlineType;\nFlow.ModifierPosition = ModifierPosition;\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { defined } from './util';\nexport var FontWeight;\n(function (FontWeight) {\n FontWeight[\"NORMAL\"] = \"normal\";\n FontWeight[\"BOLD\"] = \"bold\";\n})(FontWeight || (FontWeight = {}));\nexport var FontStyle;\n(function (FontStyle) {\n FontStyle[\"NORMAL\"] = \"normal\";\n FontStyle[\"ITALIC\"] = \"italic\";\n})(FontStyle || (FontStyle = {}));\n// Internal element for parsing CSS font shorthand strings.\nlet fontParser;\nconst Fonts = {};\nexport class Font {\n /**\n * Use `Font.load(fontName)` to get a Font object.\n * Do not call this constructor directly.\n */\n constructor(fontName) {\n this.name = fontName;\n }\n /**\n * @param fontSize a font size to convert. Can be specified as a CSS length string (e.g., '16pt', '1em')\n * or as a number (the unit is assumed to be 'pt'). See `Font.scaleToPxFrom` for the supported\n * units (e.g., pt, em, %).\n * @returns the number of pixels that is equivalent to `fontSize`\n */\n static convertSizeToPixelValue(fontSize = Font.SIZE) {\n var _a;\n if (typeof fontSize === 'number') {\n // Assume the numeric fontSize is specified in pt.\n return fontSize * Font.scaleToPxFrom.pt;\n }\n else {\n const value = parseFloat(fontSize);\n if (isNaN(value)) {\n return 0;\n }\n const unit = fontSize.replace(/[\\d.\\s]/g, '').toLowerCase(); // Extract the unit by removing all numbers, dots, spaces.\n const conversionFactor = (_a = Font.scaleToPxFrom[unit]) !== null && _a !== void 0 ? _a : 1;\n return value * conversionFactor;\n }\n }\n /**\n * @param fontSize a font size to convert. Can be specified as a CSS length string (e.g., '16pt', '1em')\n * or as a number (the unit is assumed to be 'pt'). See `Font.scaleToPxFrom` for the supported\n * units (e.g., pt, em, %).\n * @returns the number of points that is equivalent to `fontSize`\n */\n static convertSizeToPointValue(fontSize = Font.SIZE) {\n var _a;\n if (typeof fontSize === 'number') {\n // Assume the numeric fontSize is specified in pt.\n return fontSize;\n }\n else {\n const value = parseFloat(fontSize);\n if (isNaN(value)) {\n return 0;\n }\n const unit = fontSize.replace(/[\\d.\\s]/g, '').toLowerCase(); // Extract the unit by removing all numbers, dots, spaces.\n const conversionFactor = ((_a = Font.scaleToPxFrom[unit]) !== null && _a !== void 0 ? _a : 1) / Font.scaleToPxFrom.pt;\n return value * conversionFactor;\n }\n }\n /**\n * @param f\n * @param size\n * @param weight\n * @param style\n * @returns the `size` field will include the units (e.g., '12pt', '16px').\n */\n static validate(f, size, weight, style) {\n // If f is a string but all other arguments are undefined, we assume that\n // f is CSS font shorthand (e.g., 'italic bold 10pt Arial').\n if (typeof f === 'string' && size === undefined && weight === undefined && style === undefined) {\n return Font.fromCSSString(f);\n }\n let family;\n if (typeof f === 'object') {\n // f is a FontInfo object, so we extract its fields.\n family = f.family;\n size = f.size;\n weight = f.weight;\n style = f.style;\n }\n else {\n // f is a string representing the font family name or undefined.\n family = f;\n }\n family = family !== null && family !== void 0 ? family : Font.SANS_SERIF;\n size = size !== null && size !== void 0 ? size : Font.SIZE + 'pt';\n weight = weight !== null && weight !== void 0 ? weight : FontWeight.NORMAL;\n style = style !== null && style !== void 0 ? style : FontStyle.NORMAL;\n if (weight === '') {\n weight = FontWeight.NORMAL;\n }\n if (style === '') {\n style = FontStyle.NORMAL;\n }\n // If size is a number, we assume the unit is `pt`.\n if (typeof size === 'number') {\n size = `${size}pt`;\n }\n // If weight is a number (e.g., 900), turn it into a string representation of that number.\n if (typeof weight === 'number') {\n weight = weight.toString();\n }\n // At this point, `family`, `size`, `weight`, and `style` are all strings.\n return { family, size, weight, style };\n }\n /**\n * @param cssFontShorthand a string formatted as CSS font shorthand (e.g., 'italic bold 15pt Arial').\n */\n static fromCSSString(cssFontShorthand) {\n // Let the browser parse this string for us.\n // First, create a span element.\n // Then, set its style.font and extract it back out.\n if (!fontParser) {\n fontParser = document.createElement('span');\n }\n fontParser.style.font = cssFontShorthand;\n const { fontFamily, fontSize, fontWeight, fontStyle } = fontParser.style;\n return { family: fontFamily, size: fontSize, weight: fontWeight, style: fontStyle };\n }\n /**\n * @returns a CSS font shorthand string of the form `italic bold 16pt Arial`.\n */\n static toCSSString(fontInfo) {\n var _a;\n if (!fontInfo) {\n return '';\n }\n let style;\n const st = fontInfo.style;\n if (st === FontStyle.NORMAL || st === '' || st === undefined) {\n style = ''; // no space! Omit the style section.\n }\n else {\n style = st.trim() + ' ';\n }\n let weight;\n const wt = fontInfo.weight;\n if (wt === FontWeight.NORMAL || wt === '' || wt === undefined) {\n weight = ''; // no space! Omit the weight section.\n }\n else if (typeof wt === 'number') {\n weight = wt + ' ';\n }\n else {\n weight = wt.trim() + ' ';\n }\n let size;\n const sz = fontInfo.size;\n if (sz === undefined) {\n size = Font.SIZE + 'pt ';\n }\n else if (typeof sz === 'number') {\n size = sz + 'pt ';\n }\n else {\n // size is already a string.\n size = sz.trim() + ' ';\n }\n const family = (_a = fontInfo.family) !== null && _a !== void 0 ? _a : Font.SANS_SERIF;\n return `${style}${weight}${size}${family}`;\n }\n /**\n * @param fontSize a number representing a font size, or a string font size with units.\n * @param scaleFactor multiply the size by this factor.\n * @returns size * scaleFactor (e.g., 16pt * 3 = 48pt, 8px * 0.5 = 4px, 24 * 2 = 48).\n * If the fontSize argument was a number, the return value will be a number.\n * If the fontSize argument was a string, the return value will be a string.\n */\n static scaleSize(fontSize, scaleFactor) {\n if (typeof fontSize === 'number') {\n return (fontSize * scaleFactor);\n }\n else {\n const value = parseFloat(fontSize);\n const unit = fontSize.replace(/[\\d.\\s]/g, ''); // Remove all numbers, dots, spaces.\n return `${value * scaleFactor}${unit}`;\n }\n }\n /**\n * @param weight a string (e.g., 'bold') or a number (e.g., 600 / semi-bold in the OpenType spec).\n * @returns true if the font weight indicates bold.\n */\n static isBold(weight) {\n if (!weight) {\n return false;\n }\n else if (typeof weight === 'number') {\n return weight >= 600;\n }\n else {\n // a string can be 'bold' or '700'\n const parsedWeight = parseInt(weight, 10);\n if (isNaN(parsedWeight)) {\n return weight.toLowerCase() === 'bold';\n }\n else {\n return parsedWeight >= 600;\n }\n }\n }\n /**\n * @param style\n * @returns true if the font style indicates 'italic'.\n */\n static isItalic(style) {\n if (!style) {\n return false;\n }\n else {\n return style.toLowerCase() === FontStyle.ITALIC;\n }\n }\n /**\n * @param fontName\n * @param woffURL The absolute or relative URL to the woff file.\n * @param includeWoff2 If true, we assume that a woff2 file is in\n * the same folder as the woff file, and will append a `2` to the url.\n */\n // Support distributions of the typescript compiler that do not yet include the FontFace API declarations.\n // eslint-disable-next-line\n // @ts-ignore\n static loadWebFont(fontName, woffURL, includeWoff2 = true) {\n return __awaiter(this, void 0, void 0, function* () {\n const woff2URL = includeWoff2 ? `url(${woffURL}2) format('woff2'), ` : '';\n const woff1URL = `url(${woffURL}) format('woff')`;\n const woffURLs = woff2URL + woff1URL;\n // eslint-disable-next-line\n // @ts-ignore\n const fontFace = new FontFace(fontName, woffURLs);\n yield fontFace.load();\n // eslint-disable-next-line\n // @ts-ignore\n document.fonts.add(fontFace);\n return fontFace;\n });\n }\n /**\n * Load the web fonts that are used by ChordSymbol. For example, `flow.html` calls:\n * `await Vex.Flow.Font.loadWebFonts();`\n * Alternatively, you may load web fonts with a stylesheet link (e.g., from Google Fonts),\n * and a @font-face { font-family: ... } rule in your CSS.\n * If you do not load either of these fonts, ChordSymbol will fall back to Times or Arial,\n * depending on the current music engraving font.\n *\n * You can customize `Font.WEB_FONT_HOST` and `Font.WEB_FONT_FILES` to load different fonts\n * for your app.\n */\n static loadWebFonts() {\n return __awaiter(this, void 0, void 0, function* () {\n const host = Font.WEB_FONT_HOST;\n const files = Font.WEB_FONT_FILES;\n for (const fontName in files) {\n const fontPath = files[fontName];\n Font.loadWebFont(fontName, host + fontPath);\n }\n });\n }\n static loadTextFonts() {\n //\n }\n /**\n * @param fontName\n * @param data optionally set the Font object's `.data` property.\n * This is usually done when setting up a font for the first time.\n * @param metrics optionally set the Font object's `.metrics` property.\n * This is usually done when setting up a font for the first time.\n * @returns a Font object with the given `fontName`.\n * Reuse an existing Font object if a matching one is found.\n */\n static load(fontName, data, metrics) {\n let font = Fonts[fontName];\n if (!font) {\n font = new Font(fontName);\n Fonts[fontName] = font;\n }\n if (data) {\n font.setData(data);\n }\n if (metrics) {\n font.setMetrics(metrics);\n }\n return font;\n }\n getName() {\n return this.name;\n }\n getData() {\n return defined(this.data, 'FontError', 'Missing font data');\n }\n getMetrics() {\n return defined(this.metrics, 'FontError', 'Missing metrics');\n }\n setData(data) {\n this.data = data;\n }\n setMetrics(metrics) {\n this.metrics = metrics;\n }\n hasData() {\n return this.data !== undefined;\n }\n getResolution() {\n return this.getData().resolution;\n }\n getGlyphs() {\n return this.getData().glyphs;\n }\n /**\n * Use the provided key to look up a value in this font's metrics file (e.g., bravura_metrics.ts, petaluma_metrics.ts).\n * @param key is a string separated by periods (e.g., stave.endPaddingMax, clef.lineCount.'5'.shiftY).\n * @param defaultValue is returned if the lookup fails.\n * @returns the retrieved value (or `defaultValue` if the lookup fails).\n */\n // eslint-disable-next-line\n lookupMetric(key, defaultValue) {\n const keyParts = key.split('.');\n // Start with the top level font metrics object, and keep looking deeper into the object (via each part of the period-delimited key).\n let currObj = this.getMetrics();\n for (let i = 0; i < keyParts.length; i++) {\n const keyPart = keyParts[i];\n const value = currObj[keyPart];\n if (value === undefined) {\n // If the key lookup fails, we fall back to the defaultValue.\n return defaultValue;\n }\n // The most recent lookup succeeded, so we drill deeper into the object.\n currObj = value;\n }\n // After checking every part of the key (i.e., the loop completed), return the most recently retrieved value.\n return currObj;\n }\n /** For debugging. */\n toString() {\n return '[' + this.name + ' Font]';\n }\n}\n//////////////////////////////////////////////////////////////////////////////////////////////////\n// STATIC MEMBERS\n/** Default sans-serif font family. */\nFont.SANS_SERIF = 'Arial, sans-serif';\n/** Default serif font family. */\nFont.SERIF = 'Times New Roman, serif';\n/** Default font size in `pt`. */\nFont.SIZE = 10;\n// CSS Font Sizes: 36pt == 48px == 3em == 300% == 0.5in\n/** Given a length (for units: pt, px, em, %, in, mm, cm) what is the scale factor to convert it to px? */\nFont.scaleToPxFrom = {\n pt: 4 / 3,\n px: 1,\n em: 16,\n '%': 4 / 25,\n in: 96,\n mm: 96 / 25.4,\n cm: 96 / 2.54,\n};\n/**\n * Customize this field to specify a different CDN for delivering web fonts.\n * Alternative: https://cdn.jsdelivr.net/npm/vexflow-fonts@1.0.3/\n * Or you can use your own host.\n */\nFont.WEB_FONT_HOST = 'https://unpkg.com/vexflow-fonts@1.0.3/';\n/**\n * These font files will be loaded from the CDN specified by `Font.WEB_FONT_HOST` when\n * `await Font.loadWebFonts()` is called. Customize this field to specify a different\n * set of fonts to load. See: `Font.loadWebFonts()`.\n */\nFont.WEB_FONT_FILES = {\n 'Roboto Slab': 'robotoslab/RobotoSlab-Medium_2.001.woff',\n PetalumaScript: 'petaluma/PetalumaScript_1.10_FS.woff',\n};\n","export const BravuraFont = {\n glyphs: {\n bracketTop: {\n x_min: 0,\n x_max: 469,\n y_min: 0,\n y_max: 295,\n ha: 295,\n o: 'm 0 0 l 180 0 b 674 390 410 43 616 150 b 675 405 675 396 675 400 b 664 425 675 416 671 422 b 628 405 651 425 635 415 b 157 179 613 389 432 199 l 12 179 b 0 168 3 179 0 177 z',\n },\n bracketBottom: {\n x_min: 0,\n x_max: 469,\n y_min: -295,\n y_max: 0,\n ha: 295,\n o: 'm 0 -168 b 12 -179 0 -177 3 -179 l 157 -179 b 628 -405 432 -199 613 -389 b 664 -425 635 -415 651 -425 b 675 -405 671 -422 675 -416 b 674 -390 675 -400 675 -396 b 180 0 616 -150 410 -43 l 0 0 z',\n },\n barlineTick: {\n x_min: 0,\n x_max: 36,\n y_min: 868,\n y_max: 1120,\n ha: 252,\n o: 'm 52 1250 l 52 1613 l 0 1613 l 0 1250 z',\n },\n breathMarkTick: {\n x_min: 0,\n x_max: 500,\n y_min: 0,\n y_max: 502,\n ha: 502,\n o: 'm 9 367 b 0 374 6 372 3 374 b 9 334 0 367 0 343 b 179 19 40 312 164 121 b 192 0 179 3 186 0 b 210 19 197 0 207 6 b 698 701 245 197 507 658 b 720 714 714 704 720 711 b 698 723 720 720 711 723 b 197 186 455 714 210 202 b 186 176 194 179 189 176 b 176 186 179 176 176 186 b 9 367 143 266 27 359 z',\n },\n segno: {\n x_min: 4,\n x_max: 550,\n y_min: -27,\n y_max: 759,\n ha: 786,\n o: 'm 194 958 b 217 939 203 958 213 955 l 220 929 b 325 805 230 890 252 805 b 425 901 384 805 425 840 b 413 969 425 923 420 946 b 220 1060 390 1035 294 1060 b 6 793 120 1060 6 936 b 29 687 6 759 13 723 b 295 449 75 582 284 454 b 304 438 301 446 304 444 b 295 415 304 432 301 425 b 78 22 285 395 78 22 b 73 3 75 16 73 9 b 114 -39 73 -20 91 -39 b 150 -17 128 -39 143 -30 b 377 395 150 -17 373 386 b 395 402 377 393 389 402 b 704 176 416 397 704 312 b 621 75 704 120 670 82 l 616 73 b 562 138 586 73 562 94 l 562 154 b 485 249 562 209 526 249 b 468 246 480 249 474 248 b 366 153 415 233 366 210 b 540 -12 366 65 455 -12 b 600 -1 559 -12 579 -9 b 792 251 716 37 792 131 b 789 292 792 264 791 278 b 523 588 768 451 540 579 b 498 611 505 598 498 603 b 501 619 498 613 500 616 b 732 1032 508 631 732 1032 b 737 1053 736 1040 737 1045 b 697 1093 737 1076 719 1093 b 661 1073 683 1093 668 1086 b 423 647 661 1073 432 660 b 410 635 419 639 416 635 b 396 639 406 635 402 636 b 128 792 383 644 166 727 b 108 868 120 808 108 838 b 186 958 108 907 125 948 z m 598 671 b 680 589 598 626 635 589 b 762 671 726 589 762 626 b 680 753 762 717 726 753 b 598 671 635 753 598 717 z m 202 380 b 120 462 202 425 166 462 b 37 380 75 462 37 425 b 120 298 37 334 75 298 b 202 380 166 298 202 334 z',\n },\n coda: {\n x_min: -4,\n x_max: 955,\n y_min: -158,\n y_max: 898,\n ha: 1056,\n o: 'm 1349 576 l 1178 576 b 729 1083 1164 847 962 1064 l 729 1269 b 694 1293 729 1287 713 1293 b 660 1269 675 1293 660 1287 l 660 1083 b 210 576 426 1064 226 848 l 20 576 b -6 541 0 576 -6 560 b 20 507 -6 523 0 507 l 210 507 b 660 0 226 238 426 19 l 660 -202 b 694 -228 660 -222 675 -228 b 729 -202 713 -228 729 -222 l 729 0 b 1178 507 962 19 1164 238 l 1349 507 b 1375 541 1369 507 1375 523 b 1349 576 1375 560 1369 576 z m 940 576 l 729 576 l 729 1002 b 940 576 930 985 940 809 z m 660 1002 l 660 576 l 455 576 b 660 1002 455 809 455 985 z m 455 507 l 660 507 l 660 69 b 455 507 474 91 456 285 z m 729 69 l 729 507 l 940 507 b 729 69 936 287 909 91 z',\n },\n gClef: {\n x_min: 0,\n x_max: 671,\n y_min: -658,\n y_max: 1098,\n ha: 1756,\n o: 'm 541 598 b 550 625 539 615 541 616 b 824 1174 706 770 824 953 b 730 1509 824 1299 789 1423 b 655 1581 708 1541 671 1581 b 562 1512 635 1581 590 1544 b 420 1064 455 1394 420 1214 b 441 828 420 981 431 887 b 428 793 444 811 445 808 b 0 125 220 622 0 416 b 524 -363 0 -125 171 -363 b 624 -354 557 -363 595 -360 b 645 -367 639 -351 642 -350 b 684 -657 662 -464 684 -589 b 455 -896 684 -870 540 -896 b 340 -854 377 -896 340 -873 b 386 -829 340 -844 353 -840 b 482 -694 431 -816 482 -778 b 344 -547 482 -615 432 -547 b 190 -713 248 -547 190 -624 b 464 -948 190 -806 246 -948 b 747 -660 560 -948 747 -904 b 706 -351 747 -577 721 -441 b 724 -327 703 -334 704 -336 b 966 16 870 -269 966 -147 b 619 363 966 200 831 363 b 577 389 582 363 582 363 z m 677 1358 b 763 1240 724 1358 763 1319 b 513 851 763 1080 626 950 b 494 863 503 842 497 844 b 485 995 488 900 485 949 b 677 1358 485 1220 589 1358 z m 520 377 b 498 343 524 350 524 351 b 289 63 372 300 289 186 b 455 -192 289 -66 357 -158 b 494 -200 467 -196 484 -200 b 511 -184 505 -200 511 -193 b 490 -166 511 -174 500 -170 b 386 -12 429 -140 386 -78 b 530 157 386 71 442 132 b 559 145 553 163 556 161 l 631 -284 b 611 -304 634 -300 632 -300 b 530 -311 588 -308 559 -311 b 115 29 278 -311 115 -171 b 249 363 115 114 130 228 b 469 567 336 459 402 513 b 490 562 484 579 487 577 z m 619 148 b 635 168 616 166 618 170 b 848 -66 752 158 848 60 b 713 -271 848 -157 793 -230 b 690 -262 696 -279 693 -279 z',\n },\n cClef: {\n x_min: 0,\n x_max: 699,\n y_min: -506,\n y_max: 506,\n ha: 1012,\n o: 'm 331 694 b 301 724 331 714 321 724 l 300 724 b 269 694 279 724 269 714 l 269 -694 b 300 -724 269 -714 279 -724 l 301 -724 b 331 -694 321 -724 331 -714 l 331 -63 b 344 -55 331 -52 338 -53 b 472 -265 382 -65 442 -102 b 500 -301 477 -288 485 -301 b 530 -262 516 -301 523 -287 b 684 -128 549 -199 582 -128 b 804 -409 778 -128 804 -220 b 651 -683 804 -598 770 -683 b 528 -644 631 -683 528 -674 b 567 -622 528 -636 552 -628 b 625 -528 596 -612 625 -583 b 527 -429 625 -465 583 -429 b 416 -547 465 -429 416 -471 b 667 -729 416 -638 495 -729 b 1007 -413 903 -729 1007 -563 b 706 -76 1007 -215 897 -76 b 618 -89 664 -76 636 -84 b 576 -88 603 -94 589 -96 b 524 0 556 -75 524 -29 b 576 88 524 29 556 75 b 618 89 589 96 603 94 b 706 76 636 84 664 76 b 1007 413 897 76 1007 215 b 667 729 1007 563 903 729 b 416 547 495 729 416 638 b 527 429 416 471 465 429 b 625 528 583 429 625 465 b 567 622 625 583 596 612 b 528 644 552 628 528 636 b 651 683 528 674 631 683 b 804 409 770 683 804 598 b 684 128 804 220 778 128 b 530 262 582 128 549 199 b 500 301 523 287 516 301 b 472 265 485 301 477 288 b 344 55 442 102 382 65 b 331 63 338 53 331 52 z m 30 724 b 0 694 10 724 0 714 l 0 -694 b 30 -724 0 -714 10 -724 l 154 -724 b 184 -694 174 -724 184 -714 l 184 694 b 154 724 184 714 174 724 z',\n },\n fClef: {\n x_min: -5,\n x_max: 684,\n y_min: -635,\n y_max: 262,\n ha: 897,\n o: 'm 363 377 b 0 56 112 377 0 194 b 177 -158 0 -59 60 -158 b 330 -6 268 -158 330 -95 b 192 144 330 86 262 144 b 120 134 153 144 138 134 b 96 160 101 134 96 145 b 330 323 96 217 183 323 b 549 -53 482 323 549 173 b 14 -871 549 -455 350 -680 b -7 -897 1 -878 -7 -886 b 12 -914 -7 -906 -1 -914 b 36 -907 19 -914 27 -912 b 765 -40 390 -734 765 -478 b 363 377 765 210 612 377 z m 906 259 b 827 180 861 259 827 225 b 906 101 827 135 861 101 b 985 180 950 101 985 135 b 906 259 985 225 950 259 z m 907 -102 b 829 -180 863 -102 829 -135 b 907 -258 829 -225 863 -258 b 985 -180 952 -258 985 -225 b 907 -102 985 -135 952 -102 z',\n },\n unpitchedPercussionClef1: {\n x_min: 0,\n x_max: 382,\n y_min: -250,\n y_max: 250,\n ha: 500,\n o: 'm 230 -338 l 230 338 b 210 360 230 350 222 360 l 20 360 b 0 338 9 360 0 350 l 0 -338 b 20 -360 0 -350 9 -360 l 210 -360 b 230 -338 222 -360 230 -350 z m 550 338 b 530 360 550 350 541 360 l 340 360 b 320 338 328 360 320 350 l 320 -338 b 340 -360 320 -350 328 -360 l 530 -360 b 550 -338 541 -360 550 -350 z',\n },\n '6stringTabClef': {\n x_min: -3,\n x_max: 408,\n y_min: -748,\n y_max: 764,\n ha: 1512,\n o: 'm 557 1024 l 557 1100 l 26 1100 l 26 1024 l 249 1024 l 249 422 l 336 422 l 336 1024 z m 588 -328 l 350 348 l 238 348 l -4 -328 l 88 -328 l 160 -125 l 420 -125 l 491 -328 z m 397 -52 l 181 -52 l 292 256 z m 544 -883 b 420 -719 544 -802 507 -752 b 514 -572 482 -690 514 -639 b 314 -399 514 -472 442 -399 l 39 -399 l 39 -1077 l 344 -1077 b 544 -883 467 -1077 544 -995 z m 428 -583 b 292 -691 428 -652 389 -691 l 125 -691 l 125 -475 l 292 -475 b 428 -583 389 -475 428 -514 z m 458 -884 b 337 -1001 458 -949 418 -1001 l 125 -1001 l 125 -768 l 337 -768 b 458 -884 418 -768 458 -818 z',\n },\n timeSig0: {\n x_min: 20,\n x_max: 450,\n y_min: -250,\n y_max: 251,\n ha: 501,\n o: 'm 648 0 b 338 361 648 200 510 361 b 29 0 167 361 29 200 b 338 -360 29 -199 167 -360 b 648 0 510 -360 648 -199 z m 338 317 b 446 10 397 317 446 180 b 338 -295 446 -158 397 -295 b 230 10 278 -295 230 -158 b 338 317 230 180 278 317 z',\n },\n timeSig1: {\n x_min: 20,\n x_max: 314,\n y_min: -250,\n y_max: 251,\n ha: 501,\n o: 'm 35 19 b 29 0 35 19 29 10 b 45 -20 29 -7 33 -16 b 58 -23 50 -22 56 -23 b 78 -10 72 -23 78 -10 b 156 117 78 -10 140 89 b 170 131 161 127 167 131 b 179 111 176 131 179 120 l 179 -261 b 115 -315 179 -294 145 -315 b 91 -337 105 -315 91 -320 b 122 -360 91 -353 104 -360 l 429 -360 b 452 -337 452 -360 452 -337 b 431 -315 452 -337 452 -315 b 384 -265 410 -315 384 -289 l 384 328 b 356 361 384 351 376 360 b 281 356 336 361 300 356 b 206 360 253 356 228 357 b 199 361 203 360 200 361 b 173 334 184 361 179 347 z',\n },\n timeSig2: {\n x_min: 20,\n x_max: 426,\n y_min: -257,\n y_max: 254,\n ha: 511,\n o: 'm 606 -131 b 589 -111 606 -114 599 -111 b 570 -127 577 -111 573 -117 l 569 -128 b 513 -192 554 -164 543 -192 b 488 -187 505 -192 498 -190 b 445 -171 469 -180 459 -179 b 289 -137 416 -160 348 -137 b 236 -145 271 -137 252 -140 b 422 -42 268 -94 390 -50 b 613 147 523 -14 613 27 b 330 366 613 300 464 366 b 69 275 229 366 140 357 b 29 170 45 245 29 209 b 42 108 29 150 33 130 b 160 29 63 63 108 29 b 261 156 248 29 261 120 b 161 275 261 242 161 246 b 275 330 164 295 190 330 b 405 192 403 330 405 233 b 193 -102 405 60 297 -39 b 33 -317 114 -153 58 -223 l 32 -321 b 69 -370 32 -340 48 -370 b 203 -282 101 -370 118 -282 b 410 -360 261 -282 282 -360 b 606 -131 472 -360 583 -354 z',\n },\n timeSig3: {\n x_min: 20,\n x_max: 401,\n y_min: -251,\n y_max: 249,\n ha: 500,\n o: 'm 307 357 b 301 357 305 357 304 357 l 291 359 b 285 359 289 359 287 359 b 37 200 161 359 37 276 b 154 84 37 153 65 89 l 161 84 b 256 177 225 84 256 130 l 256 189 b 209 248 252 242 216 245 b 180 268 202 251 180 248 l 180 274 b 240 310 183 298 228 310 b 374 199 363 310 374 233 l 374 189 b 199 36 374 82 289 40 b 164 12 184 35 164 27 b 200 -6 164 -6 189 -6 b 379 -137 366 -6 379 -118 b 269 -307 379 -289 301 -307 b 256 -305 264 -307 258 -305 b 216 -282 245 -304 217 -304 l 216 -275 b 249 -180 216 -243 248 -222 b 145 -76 249 -120 207 -76 b 130 -78 140 -76 135 -76 b 60 -115 105 -82 78 -96 b 29 -203 36 -137 29 -171 b 275 -361 32 -315 134 -359 l 288 -361 b 577 -161 431 -361 577 -288 l 577 -151 b 537 -50 575 -109 564 -82 b 503 -20 528 -39 517 -29 l 472 -3 l 425 10 b 410 17 418 12 413 12 b 409 24 409 20 409 22 b 415 37 409 30 410 36 b 459 50 431 42 446 43 b 547 181 517 78 547 115 b 307 357 547 314 367 353 z',\n },\n timeSig4: {\n x_min: 20,\n x_max: 450,\n y_min: -250,\n y_max: 251,\n ha: 501,\n o: 'm 521 -107 l 521 202 b 504 226 521 213 520 226 b 475 213 491 226 484 223 l 338 48 b 325 14 333 40 325 32 l 325 -107 l 131 -107 b 481 336 246 -9 477 318 l 482 340 b 461 361 482 353 472 361 b 363 359 448 361 389 359 b 261 361 337 359 272 361 b 228 334 248 361 228 357 b 43 -105 228 156 86 -45 l 35 -117 b 35 -118 35 -117 35 -118 l 33 -120 b 29 -137 30 -127 29 -132 b 58 -161 29 -151 40 -161 l 325 -161 l 325 -252 b 268 -302 325 -291 294 -302 b 235 -330 245 -302 235 -315 b 262 -360 235 -344 240 -360 l 569 -360 b 598 -330 583 -360 598 -350 b 566 -301 598 -310 580 -301 b 521 -246 552 -301 521 -292 l 521 -161 l 626 -161 b 648 -134 641 -161 648 -151 b 626 -107 648 -117 642 -107 z',\n },\n timeSig5: {\n x_min: 20,\n x_max: 383,\n y_min: -251,\n y_max: 246,\n ha: 497,\n o: 'm 109 85 b 117 179 109 85 115 166 b 138 197 118 190 125 197 l 144 197 b 285 184 158 194 226 184 b 492 323 485 184 492 300 b 472 353 492 341 488 353 b 295 340 454 353 341 340 b 101 354 249 340 125 351 b 66 330 75 354 68 341 l 50 10 l 50 7 b 79 -14 50 -12 65 -14 b 111 14 94 -14 95 -1 b 209 62 125 29 160 62 b 357 -125 258 62 357 35 b 235 -304 357 -284 272 -304 b 202 -300 223 -304 212 -304 b 184 -279 194 -295 186 -289 b 202 -259 184 -269 194 -264 b 256 -163 235 -239 256 -203 b 144 -50 256 -99 206 -50 b 30 -157 66 -50 35 -107 b 29 -183 29 -166 29 -174 b 284 -361 29 -302 107 -361 b 552 -125 456 -361 552 -255 b 314 112 552 6 445 112 b 122 71 230 112 168 98 b 115 69 120 69 117 69 b 109 79 109 69 109 75 z',\n },\n timeSig6: {\n x_min: 20,\n x_max: 414,\n y_min: -249,\n y_max: 251,\n ha: 500,\n o: 'm 439 120 b 554 229 500 120 554 167 b 553 245 554 235 554 239 b 348 361 539 337 426 361 b 85 209 239 360 137 307 b 29 4 53 148 29 72 l 29 -1 b 73 -200 30 -68 42 -143 b 324 -359 132 -307 203 -359 b 513 -307 389 -359 461 -348 b 596 -137 563 -266 596 -202 b 379 72 596 -24 490 72 b 248 22 333 72 285 55 b 239 19 245 19 242 19 b 226 53 230 19 226 30 b 346 327 230 320 315 327 b 393 305 374 327 393 320 b 357 251 393 285 366 268 b 347 209 350 238 347 223 b 369 150 347 187 354 166 b 439 120 379 131 420 120 z m 320 3 b 405 -158 366 3 405 -69 b 320 -320 405 -248 366 -320 b 236 -158 274 -320 236 -248 b 320 3 236 -69 274 3 z',\n },\n timeSig7: {\n x_min: 20,\n x_max: 421,\n y_min: -250,\n y_max: 249,\n ha: 499,\n o: 'm 606 294 b 582 351 606 333 606 351 b 552 336 580 351 557 346 b 485 236 541 318 521 236 b 262 359 449 236 382 359 b 137 307 179 359 157 325 b 98 281 117 288 108 282 b 60 315 86 281 68 301 b 43 325 58 321 50 325 b 29 308 36 325 29 321 l 29 71 b 45 48 29 71 30 48 b 66 76 56 48 60 60 b 164 196 81 112 99 196 b 374 88 222 196 291 88 b 446 118 415 88 435 109 b 459 124 451 121 456 124 b 469 111 465 124 468 120 b 272 -112 469 71 359 -10 b 173 -315 217 -176 173 -259 b 200 -360 173 -346 173 -360 b 294 -347 226 -360 258 -347 b 412 -360 330 -347 397 -360 b 435 -307 426 -360 435 -348 b 606 288 435 -66 606 140 z',\n },\n timeSig8: {\n x_min: 20,\n x_max: 416,\n y_min: -259,\n y_max: 259,\n ha: 518,\n o: 'm 481 52 b 567 204 533 85 567 132 b 317 373 567 351 356 373 b 36 176 150 373 36 297 b 161 -16 36 76 92 23 b 29 -190 86 -52 29 -99 b 301 -373 29 -315 158 -373 b 599 -117 445 -373 599 -311 b 481 52 599 -30 549 17 z m 406 85 b 168 240 291 125 168 150 b 314 331 168 301 251 331 b 482 207 360 331 482 308 b 406 85 482 150 454 112 z m 295 -325 b 111 -183 199 -325 111 -276 b 225 -48 111 -125 161 -72 b 436 -219 330 -94 436 -124 b 295 -325 436 -276 392 -325 z',\n },\n timeSig9: {\n x_min: 20,\n x_max: 414,\n y_min: -249,\n y_max: 251,\n ha: 500,\n o: 'm 186 -117 b 71 -226 125 -117 71 -164 b 72 -242 71 -232 71 -236 b 276 -359 86 -334 199 -359 b 540 -206 386 -357 488 -304 b 596 -1 572 -145 596 -69 l 596 4 b 552 203 595 71 583 145 b 301 361 492 310 422 361 b 112 310 236 361 164 351 b 29 140 62 269 29 204 b 246 -69 29 27 135 -69 b 377 -19 292 -69 340 -52 b 386 -16 380 -16 383 -16 b 399 -50 395 -16 399 -27 b 279 -324 395 -317 310 -324 b 232 -302 251 -324 232 -317 b 268 -248 232 -282 259 -265 b 278 -206 275 -235 278 -220 b 256 -147 278 -184 271 -163 b 186 -117 246 -128 204 -117 z m 305 0 b 220 161 259 0 220 72 b 305 323 220 251 259 323 b 389 161 351 323 389 251 b 305 0 389 72 351 0 z',\n },\n timeSigCommon: {\n x_min: 5,\n x_max: 424,\n y_min: -249,\n y_max: 251,\n ha: 500,\n o: 'm 336 361 b 7 -14 131 361 7 180 b 101 -262 7 -108 42 -190 b 321 -359 156 -328 235 -359 b 611 -88 573 -359 611 -130 b 589 -56 611 -56 595 -56 b 567 -82 577 -56 567 -58 b 363 -311 567 -268 409 -311 b 184 40 246 -311 184 -197 b 372 327 184 278 294 327 b 477 278 446 327 477 292 b 451 246 477 265 472 246 b 360 140 393 246 360 184 b 471 32 360 58 431 32 b 580 156 471 32 580 36 b 336 361 580 344 363 361 z',\n },\n timeSigCutCommon: {\n x_min: 0,\n x_max: 418,\n y_min: -359,\n y_max: 361,\n ha: 720,\n o: 'm 573 -58 b 559 -82 567 -58 559 -60 b 354 -310 559 -266 400 -310 b 317 -305 340 -310 328 -308 b 302 -284 311 -304 302 -295 l 302 287 b 338 323 302 297 328 321 b 363 324 347 324 356 324 b 468 275 436 324 468 289 b 442 243 468 264 464 243 b 351 137 384 243 351 181 b 462 30 351 56 422 30 b 572 154 462 30 572 35 b 318 357 572 295 441 357 b 302 390 310 359 302 383 l 302 495 b 276 520 302 507 292 520 b 252 495 265 520 252 507 l 252 369 b 235 346 252 359 238 346 l 196 331 b 0 -14 66 275 0 122 b 225 -346 0 -150 86 -310 b 252 -382 235 -350 252 -369 l 252 -492 b 276 -517 252 -505 265 -517 b 302 -492 292 -517 302 -505 l 302 -379 b 318 -359 302 -370 308 -363 b 602 -85 563 -354 602 -130 b 579 -58 600 -58 586 -58 z m 252 -235 b 243 -252 252 -248 248 -252 b 236 -248 240 -252 238 -251 b 177 37 197 -193 177 -96 b 232 259 177 147 200 215 b 236 262 233 262 235 262 b 252 239 243 262 252 251 z',\n },\n timeSigPlus: {\n x_min: -1,\n x_max: 499,\n y_min: -250,\n y_max: 250,\n ha: 500,\n o: 'm 432 53 b 413 79 420 53 413 65 l 413 340 b 392 360 413 350 405 360 l 325 360 b 305 340 312 360 305 350 l 305 79 b 284 53 305 66 292 53 l 19 53 b -1 33 9 53 -1 46 l -1 -33 b 19 -55 -1 -46 9 -55 l 284 -55 b 305 -75 298 -55 305 -68 l 305 -340 b 325 -360 305 -350 312 -360 l 392 -360 b 413 -340 405 -360 413 -350 l 413 -78 b 433 -55 413 -63 423 -55 l 698 -55 b 719 -33 708 -55 719 -46 l 719 33 b 698 53 719 46 708 53 z',\n },\n timeSigPlusSmall: {\n x_min: -1,\n x_max: 255,\n y_min: -133,\n y_max: 123,\n ha: 256,\n o: 'm 220 20 b 210 33 215 20 210 26 l 210 166 b 200 177 210 171 206 177 l 166 177 b 156 166 160 177 156 171 l 156 33 b 145 20 156 27 150 20 l 10 20 b -1 10 4 20 -1 16 l -1 -24 b 10 -35 -1 -30 4 -35 l 145 -35 b 156 -46 153 -35 156 -42 l 156 -180 b 166 -192 156 -186 160 -192 l 200 -192 b 210 -180 206 -192 210 -186 l 210 -48 b 222 -35 210 -39 216 -35 l 356 -35 b 367 -24 361 -35 367 -30 l 367 10 b 356 20 367 16 361 20 z',\n },\n timeSigMinus: {\n x_min: 0,\n x_max: 448,\n y_min: -35,\n y_max: 40,\n ha: 75,\n o: 'm 645 39 b 619 58 645 49 634 58 l 27 58 b 0 39 12 58 0 49 l 0 -32 b 27 -50 0 -42 12 -50 l 619 -50 b 645 -32 634 -50 645 -42 z',\n },\n timeSigParensRight: {\n x_min: 0,\n x_max: 184,\n y_min: -489,\n y_max: 491,\n ha: 980,\n o: 'm 0 -696 b 3 -704 0 -698 1 -704 b 7 -703 4 -704 6 -704 b 265 1 187 -530 265 -282 b 12 701 265 289 187 531 b 4 707 12 701 6 707 b 0 696 1 707 0 703 l 0 665 b 4 644 0 665 0 651 b 167 1 112 503 167 315 b 6 -641 167 -311 109 -497 b 0 -658 3 -644 0 -651 z',\n },\n timeSigParensRightSmall: {\n x_min: 0,\n x_max: 110,\n y_min: -251,\n y_max: 249,\n ha: 500,\n o: 'm 0 -356 b 3 -361 0 -357 1 -361 b 158 0 112 -272 158 -145 b 4 359 158 147 109 272 b 0 353 3 359 0 357 l 0 338 b 3 327 0 338 0 330 b 91 0 60 246 91 160 b 4 -328 91 -160 62 -249 b 0 -337 3 -330 0 -333 z',\n },\n timeSigParensLeft: {\n x_min: 0,\n x_max: 184,\n y_min: -489,\n y_max: 491,\n ha: 980,\n o: 'm 265 -658 b 259 -641 265 -651 262 -644 b 98 1 156 -497 98 -311 b 261 644 98 315 153 503 b 265 665 265 651 265 665 l 265 696 b 261 707 265 703 264 707 b 253 701 259 707 253 701 b 0 1 78 531 0 289 b 258 -703 0 -282 78 -530 b 262 -704 259 -704 261 -704 b 265 -696 264 -704 265 -698 z',\n },\n timeSigParensLeftSmall: {\n x_min: 0,\n x_max: 110,\n y_min: -251,\n y_max: 249,\n ha: 500,\n o: 'm 158 -337 b 154 -328 158 -333 156 -330 b 68 0 96 -249 68 -160 b 156 327 68 160 98 246 b 158 338 158 330 158 338 l 158 353 b 154 359 158 357 156 359 b 0 0 49 272 0 147 b 156 -361 0 -145 46 -272 b 158 -356 157 -361 158 -357 z',\n },\n noteheadDoubleWhole: {\n x_min: 0,\n x_max: 599,\n y_min: -155,\n y_max: 155,\n ha: 310,\n o: 'm 13 223 b 0 212 4 223 0 217 l 0 -213 b 13 -223 0 -219 4 -223 l 32 -223 b 45 -213 39 -223 45 -219 l 45 212 b 32 223 45 217 39 223 z m 96 223 b 82 212 88 223 82 217 l 82 -213 b 96 -223 82 -219 88 -223 l 114 -223 b 128 -213 121 -223 128 -219 l 128 212 b 114 223 128 217 121 223 z m 747 223 b 733 212 740 223 733 217 l 733 -213 b 747 -223 733 -219 740 -223 l 766 -223 b 780 -213 773 -223 780 -219 l 780 212 b 766 223 780 217 773 223 z m 829 223 b 815 212 824 223 815 217 l 815 -213 b 829 -223 815 -219 824 -223 l 848 -223 b 863 -213 857 -223 863 -219 l 863 212 b 848 223 863 217 857 223 z m 438 180 b 130 1 248 180 130 101 b 423 -180 130 -92 210 -180 b 733 1 657 -180 733 -98 b 438 180 733 104 572 180 z m 469 -145 b 331 -71 409 -145 369 -112 b 284 58 305 -37 284 12 b 400 147 284 131 333 147 b 577 -45 498 147 577 42 b 469 -145 577 -115 533 -145 z',\n },\n noteheadWhole: {\n x_min: 0,\n x_max: 422,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 311 180 b 0 3 120 180 0 101 b 297 -180 0 -94 82 -180 b 608 3 533 -180 608 -98 b 311 180 608 105 445 180 z m 160 91 b 274 148 176 141 229 148 b 452 -45 373 148 452 42 b 386 -141 452 -89 433 -130 b 341 -147 372 -145 356 -147 b 206 -72 289 -147 236 -112 b 156 56 177 -39 156 10 b 160 91 156 68 157 79 z',\n },\n noteheadHalf: {\n x_min: 0,\n x_max: 295,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 140 -180 b 425 60 377 -180 425 13 b 282 180 425 134 366 180 b 0 -60 68 180 0 14 b 140 -180 0 -137 60 -180 z m 108 -125 b 50 -92 78 -125 60 -109 b 42 -63 46 -84 42 -73 b 318 121 42 7 251 121 b 372 91 346 121 361 108 b 380 63 376 82 380 73 b 108 -125 380 1 177 -125 z',\n },\n noteheadBlack: {\n x_min: 0,\n x_max: 295,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 140 -180 b 425 60 268 -180 425 -62 b 285 180 425 134 367 180 b 0 -60 127 180 0 63 b 140 -180 0 -135 62 -180 z',\n },\n noteheadXWhole: {\n x_min: 0,\n x_max: 377,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 272 -95 l 364 -171 b 384 -180 370 -177 377 -180 l 511 -180 b 543 -148 528 -180 543 -164 b 531 -124 543 -140 539 -131 l 412 0 l 531 124 b 541 148 539 131 541 140 b 513 180 541 164 528 180 l 384 180 b 364 171 377 180 370 177 l 272 94 l 179 171 b 158 180 173 177 166 180 l 30 180 b 0 148 16 180 0 164 b 12 124 0 140 4 131 l 132 0 l 12 -124 b 1 -148 4 -131 1 -140 b 32 -180 1 -164 14 -180 l 158 -180 b 179 -171 166 -180 173 -177 z m 386 -141 l 272 -45 l 157 -141 l 88 -141 l 245 0 l 88 141 l 157 141 l 272 45 l 386 141 l 456 141 l 300 0 l 456 -141 z',\n },\n noteheadXHalf: {\n x_min: 0,\n x_max: 334,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 295 180 b 271 170 287 180 278 177 l 209 98 l 115 171 b 95 180 109 177 104 180 l 36 180 b 4 148 19 180 4 164 b 14 124 4 140 7 132 l 140 22 l 7 -127 b 0 -148 3 -131 0 -138 b 32 -180 0 -166 14 -180 l 184 -180 b 209 -170 193 -180 203 -177 l 271 -99 l 363 -171 b 384 -180 370 -176 377 -180 l 445 -180 b 478 -147 461 -180 478 -163 b 465 -125 478 -138 474 -131 l 341 -22 l 474 127 b 481 148 480 131 481 138 b 448 180 481 166 468 180 z m 36 148 l 95 148 l 233 33 l 334 148 l 410 148 l 274 -6 l 445 -148 l 384 -148 l 248 -35 l 147 -148 l 71 -148 l 206 4 z',\n },\n noteheadXBlack: {\n x_min: 0,\n x_max: 290,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 410 -143 l 239 0 l 410 144 b 418 160 415 147 418 154 b 399 180 418 171 408 180 b 389 177 396 180 392 179 l 207 26 l 29 177 b 17 180 26 179 22 180 b 0 161 7 180 0 170 b 7 144 0 156 3 148 l 179 0 l 7 -143 b 0 -158 1 -147 0 -153 b 19 -180 0 -170 7 -180 b 29 -176 23 -180 26 -179 l 207 -24 l 389 -176 b 399 -180 392 -179 396 -180 b 418 -160 410 -180 418 -168 b 410 -143 418 -153 415 -147 z',\n },\n noteheadCircleX: {\n x_min: 0,\n x_max: 249,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 179 180 b 0 0 81 180 0 99 b 179 -180 0 -99 81 -180 b 359 0 278 -180 359 -99 b 179 180 359 99 278 180 z m 261 112 l 180 30 l 98 112 b 179 138 121 128 148 138 b 261 112 210 138 238 128 z m 317 0 b 292 -82 317 -30 308 -59 l 209 1 l 291 84 b 317 0 307 60 317 30 z m 40 0 b 69 84 40 32 50 60 l 151 1 l 68 -84 b 40 0 49 -60 40 -30 z m 95 -111 l 180 -27 l 262 -111 b 179 -138 239 -128 210 -138 b 95 -111 148 -138 120 -128 z',\n },\n noteheadTriangleUpWhole: {\n x_min: 0,\n x_max: 319,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 445 -180 b 459 -166 454 -180 459 -173 b 458 -158 459 -163 458 -160 l 239 173 b 228 180 238 177 233 180 b 216 173 225 180 219 177 l 1 -158 b 0 -166 1 -160 0 -163 b 14 -180 0 -173 6 -180 z m 170 -137 b 145 -96 157 -137 145 -109 b 228 108 145 -17 197 56 b 310 -98 259 55 310 -17 b 288 -137 310 -111 301 -137 z',\n },\n noteheadTriangleUpHalf: {\n x_min: 0,\n x_max: 285,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 215 180 b 202 173 210 180 204 177 l 3 -157 b 0 -166 1 -160 0 -163 b 14 -180 0 -173 7 -180 l 396 -180 b 410 -166 406 -180 410 -173 b 409 -158 410 -163 410 -161 l 228 173 b 215 180 226 174 220 180 z m 246 -138 l 115 -138 l 232 76 l 297 -37 z',\n },\n noteheadTriangleUpBlack: {\n x_min: 0,\n x_max: 293,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 422 -180 l 207 180 l 0 -180 z',\n },\n noteheadDiamondWhole: {\n x_min: 0,\n x_max: 270,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 386 -23 b 389 -16 387 -20 389 -19 b 383 -7 389 -13 386 -9 l 130 179 b 122 180 128 180 125 180 b 115 177 120 180 117 180 l 3 23 b 0 17 1 20 0 19 b 4 7 0 16 3 10 l 258 -179 b 264 -180 261 -179 262 -180 b 272 -176 268 -180 271 -179 z m 66 40 b 62 48 65 42 62 45 l 109 111 b 112 112 109 112 111 112 b 118 111 115 112 117 111 l 320 -37 b 324 -46 323 -39 324 -42 b 275 -111 278 -111 276 -111 b 268 -108 272 -111 271 -109 z',\n },\n noteheadDiamondHalf: {\n x_min: 0,\n x_max: 251,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 359 -7 b 361 0 360 -6 361 -3 b 359 7 361 3 360 4 l 189 177 b 180 180 186 179 183 180 b 174 177 179 180 176 179 l 4 7 b 0 0 1 4 0 3 b 4 -7 0 -3 1 -6 l 174 -177 b 180 -180 176 -180 179 -180 b 189 -177 183 -180 186 -180 z m 266 26 b 138 -71 266 -12 176 -71 b 96 -50 121 -71 108 -63 b 88 -24 89 -43 88 -32 b 215 73 88 13 177 73 b 266 26 238 73 266 50 z',\n },\n noteheadDiamondBlack: {\n x_min: 0,\n x_max: 250,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 357 -6 b 360 1 359 -4 360 -1 b 357 9 360 4 359 7 l 189 177 b 180 180 187 179 184 180 b 171 177 177 180 173 179 l 3 9 b 0 1 0 6 0 4 b 4 -7 0 -1 1 -4 l 173 -177 b 180 -180 176 -180 177 -180 b 187 -177 181 -180 184 -180 z',\n },\n noteheadSquareWhite: {\n x_min: 0,\n x_max: 313,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 451 -180 l 451 180 l 0 180 l 0 -180 z m 40 -138 l 40 140 l 410 140 l 410 -138 z',\n },\n noteheadSquareBlack: {\n x_min: 0,\n x_max: 313,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 451 -180 l 451 180 l 0 180 l 0 -180 z',\n },\n noteheadParenthesis: {\n x_min: -73,\n x_max: 368,\n y_min: -180,\n y_max: 182,\n ha: 362,\n o: 'm 52 -249 b -30 -144 3 -212 -14 -190 b -52 4 -45 -102 -52 -56 b 52 252 -52 118 -36 179 l 46 262 b -105 3 -49 197 -105 124 b 45 -259 -105 -109 -48 -200 z m 382 -259 b 530 3 474 -202 530 -108 b 379 262 530 122 474 200 l 373 252 b 478 4 462 180 478 118 b 456 -144 478 -56 471 -102 b 373 -249 439 -190 422 -212 z',\n },\n noteheadParenthesisRight: {\n x_min: -36,\n x_max: 73,\n y_min: -181,\n y_max: 181,\n ha: 362,\n o: 'm -43 -261 b 105 1 49 -203 105 -109 b -46 261 105 121 49 199 l -52 251 b 53 3 37 179 53 117 b 32 -145 53 -58 46 -104 b -52 -251 14 -192 -3 -213 z',\n },\n noteheadParenthesisLeft: {\n x_min: 0,\n x_max: 109,\n y_min: -181,\n y_max: 181,\n ha: 362,\n o: 'm 157 -251 b 75 -145 108 -213 91 -192 b 53 3 60 -104 53 -58 b 157 251 53 117 69 177 l 151 261 b 0 1 56 196 0 122 b 150 -261 0 -111 58 -202 z',\n },\n augmentationDot: {\n x_min: 0,\n x_max: 100,\n y_min: -50,\n y_max: 50,\n ha: 100,\n o: 'm 144 0 b 72 72 144 40 112 72 b 0 0 32 72 0 40 b 72 -72 0 -40 32 -72 b 144 0 112 -72 144 -40 z',\n },\n tremolo1: {\n x_min: -150,\n x_max: 150,\n y_min: -93,\n y_max: 94,\n ha: 187,\n o: 'm 216 -45 l 216 135 l -216 46 l -216 -134 z',\n },\n flag8thUp: {\n x_min: 0,\n x_max: 264,\n y_min: -810.1921176545985,\n y_max: 9,\n ha: 819.1921176545985,\n o: 'm 343 -1138 b 380 -888 343 -1138 380 -1001 b 215 -395 380 -708 305 -539 b 58 -19 141 -281 81 -157 b 27 13 53 4 42 13 b 0 -9 12 13 0 9 l 0 -353 b 284 -688 95 -370 232 -566 b 318 -904 305 -737 318 -819 b 284 -1102 318 -969 308 -1037 b 279 -1123 281 -1110 279 -1117 b 302 -1165 279 -1146 294 -1159 b 343 -1138 311 -1171 336 -1162 z',\n },\n flag8thDown: {\n x_min: 0,\n x_max: 306,\n y_min: -14,\n y_max: 808,\n ha: 822,\n o: 'm 346 1094 b 376 897 366 1034 376 962 b 318 642 376 812 340 691 b 0 340 265 521 193 405 l 0 1 b 23 -20 0 -13 12 -20 b 58 12 36 -20 55 -12 b 262 387 82 148 189 274 b 441 881 353 530 441 701 b 400 1142 441 994 412 1096 b 377 1164 396 1158 387 1164 b 346 1094 356 1164 331 1136 z',\n },\n flag16thUp: {\n x_min: 0,\n x_max: 279,\n y_min: -813,\n y_max: 2,\n ha: 815,\n o: 'm 392 -1146 b 402 -988 397 -1139 402 -1057 l 402 -956 b 360 -783 402 -896 386 -837 b 359 -770 360 -779 359 -776 b 360 -760 359 -768 359 -765 b 396 -577 364 -752 396 -665 b 392 -526 396 -559 395 -543 b 236 -275 377 -428 340 -387 b 53 -16 158 -192 78 -168 b 24 3 50 0 33 3 b 0 -12 16 3 0 -1 l 0 -570 l 7 -570 b 298 -778 96 -573 199 -576 b 344 -992 331 -847 344 -917 b 333 -1120 344 -1034 340 -1077 b 331 -1133 331 -1126 331 -1129 b 363 -1171 331 -1152 343 -1171 b 392 -1146 373 -1171 383 -1165 z m 301 -661 b 223 -562 278 -625 253 -596 b 59 -331 156 -484 89 -449 b 58 -327 58 -330 58 -328 b 78 -312 58 -321 66 -312 l 89 -312 b 302 -464 177 -312 255 -393 b 341 -592 328 -501 341 -546 b 340 -621 341 -602 341 -611 b 330 -658 337 -632 337 -647 b 311 -667 328 -662 318 -667 b 301 -661 307 -667 304 -665 z',\n },\n flag16thDown: {\n x_min: 0,\n x_max: 290.8951581511223,\n y_min: -9,\n y_max: 812.0064,\n ha: 821.0064,\n o: 'm 346 1132 b 312 768 367 1011 367 880 b 7 559 213 566 96 562 l 0 559 l 0 1 b 24 -13 0 -6 10 -13 b 53 6 35 -13 50 -10 b 406 516 88 228 372 289 b 410 567 409 531 410 549 b 374 750 410 655 379 742 b 373 760 373 753 373 756 b 374 773 373 766 374 769 b 405 1138 426 881 428 1022 b 370 1169 397 1171 387 1169 b 346 1132 353 1168 341 1156 z m 325 657 b 344 647 333 657 343 652 b 354 611 351 636 351 622 b 356 582 356 600 356 590 b 317 454 356 534 343 491 b 89 302 269 383 177 302 l 78 302 b 58 317 66 302 58 310 b 59 321 58 318 58 320 b 238 552 89 439 170 472 b 315 651 268 585 292 613 b 325 657 318 655 321 657 z',\n },\n flag32ndUp: {\n x_min: 0,\n x_max: 261,\n y_min: -812,\n y_max: 149,\n ha: 961,\n o: 'm 374 -969 b 337 -806 372 -913 359 -858 b 336 -796 336 -804 336 -801 b 337 -788 336 -793 336 -791 b 370 -616 340 -778 370 -698 b 340 -482 370 -570 360 -524 b 369 -330 353 -445 369 -386 b 366 -289 369 -315 369 -302 b 220 -58 350 -202 317 -163 b 46 187 148 20 71 43 b 20 215 45 200 35 215 b 0 197 12 215 0 207 l 0 -609 l 7 -609 b 278 -802 91 -612 186 -615 b 323 -999 310 -865 323 -930 b 311 -1122 323 -1040 318 -1080 b 310 -1132 311 -1126 310 -1129 b 328 -1166 310 -1149 318 -1162 b 337 -1169 331 -1168 334 -1169 b 366 -1146 346 -1169 356 -1162 b 376 -1009 370 -1138 376 -1071 b 374 -969 376 -995 374 -982 z m 300 -261 b 321 -330 315 -289 321 -311 b 317 -360 321 -341 318 -350 b 300 -423 314 -374 307 -399 b 220 -334 279 -397 253 -370 b 56 -92 150 -256 79 -232 b 300 -261 135 -92 220 -127 z m 315 -657 b 308 -690 312 -668 312 -680 b 292 -698 307 -694 300 -698 b 282 -693 288 -698 284 -697 b 216 -608 261 -661 240 -636 l 209 -600 b 56 -390 147 -527 88 -495 b 73 -367 53 -380 60 -367 b 318 -622 189 -367 318 -505 b 315 -657 318 -634 317 -645 z',\n },\n flag32ndDown: {\n x_min: 0,\n x_max: 273,\n y_min: -172,\n y_max: 812,\n ha: 984,\n o: 'm 393 973 b 333 1169 393 1002 383 1169 b 324 1168 330 1169 327 1169 b 304 1130 314 1164 304 1149 b 305 1120 304 1128 305 1125 b 334 962 317 1056 334 1011 b 289 821 334 922 323 880 b 0 619 180 625 88 622 l 0 -229 b 20 -248 0 -242 9 -248 b 48 -219 35 -248 46 -232 b 229 36 72 -69 154 -46 b 380 278 330 145 364 186 b 383 320 383 291 383 305 b 351 484 383 382 364 445 b 384 629 374 526 384 580 b 356 780 384 704 361 766 b 356 783 356 782 356 783 l 351 791 b 356 804 351 796 353 799 l 361 814 b 393 958 380 850 387 865 z m 56 386 b 217 609 86 501 153 533 b 292 706 246 642 269 670 b 304 711 295 710 300 711 b 321 703 311 711 320 707 b 328 670 325 693 325 681 b 331 634 330 658 331 645 b 82 367 331 516 199 367 l 75 367 b 56 386 62 367 56 379 z m 330 350 b 334 320 331 340 334 331 b 311 248 334 301 328 278 b 59 72 229 109 141 72 b 56 76 56 73 56 75 b 229 331 81 226 154 249 b 310 423 264 369 289 397 b 330 350 318 396 325 366 z',\n },\n flag64thUp: {\n x_min: 0,\n x_max: 261,\n y_min: -812,\n y_max: 347,\n ha: 1159,\n o: 'm 374 -969 b 337 -806 372 -913 359 -858 b 336 -796 336 -804 336 -801 b 337 -788 336 -793 336 -791 b 370 -616 340 -778 370 -698 b 340 -482 370 -570 360 -524 b 369 -330 353 -445 369 -386 b 337 -203 369 -287 359 -242 b 369 -43 350 -167 369 -104 b 366 -4 369 -30 367 -17 b 220 228 350 84 317 122 b 46 472 148 305 71 328 b 20 500 45 485 32 500 b 0 482 10 500 0 492 l 0 -609 l 7 -609 b 278 -802 91 -612 186 -615 b 323 -999 310 -865 323 -930 b 311 -1122 323 -1040 318 -1080 b 310 -1132 311 -1126 310 -1129 b 328 -1166 310 -1149 318 -1162 b 337 -1169 331 -1168 334 -1169 b 366 -1146 346 -1169 356 -1162 b 376 -1009 370 -1138 376 -1071 b 374 -969 376 -995 374 -982 z m 300 24 b 321 -45 315 -4 321 -26 b 317 -75 321 -56 318 -65 l 298 -145 b 220 -58 278 -121 253 -94 b 58 187 148 20 82 43 b 56 193 58 189 58 192 b 300 24 138 193 220 157 z m 300 -261 b 321 -330 315 -289 321 -311 b 317 -360 321 -341 318 -350 b 300 -423 314 -374 307 -399 b 220 -334 279 -397 253 -370 b 56 -92 150 -256 79 -232 b 300 -261 135 -92 220 -127 z m 315 -657 b 308 -690 312 -668 312 -680 b 292 -698 307 -694 300 -698 b 282 -693 288 -698 284 -697 b 216 -608 261 -661 240 -636 l 209 -600 b 55 -386 147 -527 84 -497 b 73 -367 52 -376 63 -367 b 318 -622 189 -367 318 -505 b 315 -657 318 -634 317 -645 z',\n },\n flag64thDown: {\n x_min: 0,\n x_max: 273,\n y_min: -376,\n y_max: 812,\n ha: 1188,\n o: 'm 393 973 b 333 1169 393 1002 383 1169 b 324 1168 330 1169 327 1169 b 304 1130 314 1164 304 1149 b 305 1120 304 1128 305 1125 b 334 962 317 1056 334 1011 b 289 821 334 922 323 880 b 0 619 180 625 88 622 l 0 -523 b 20 -541 0 -534 9 -541 b 48 -513 35 -541 46 -526 b 229 -258 72 -363 154 -340 b 380 -16 330 -148 364 -108 b 384 27 383 -1 384 13 b 351 189 384 88 366 151 b 380 278 366 216 374 243 b 383 320 383 291 383 305 b 351 484 383 382 364 445 b 384 629 374 526 384 580 b 356 780 384 704 361 766 b 356 783 356 782 356 783 l 351 791 b 356 804 351 796 353 799 l 361 814 b 393 958 380 850 387 865 z m 56 386 b 217 609 86 501 153 533 b 292 706 246 642 269 670 b 304 711 295 710 300 711 b 321 703 311 711 320 707 b 328 670 325 693 325 681 b 331 634 330 658 331 645 b 82 367 331 516 199 367 l 75 367 b 56 386 62 367 56 379 z m 330 350 b 334 320 331 340 334 331 b 311 248 334 301 328 278 b 59 72 229 109 141 72 b 56 76 56 73 56 75 b 229 331 81 226 154 249 b 310 423 264 369 289 397 b 330 350 318 396 325 366 z m 330 56 b 334 26 331 46 334 37 b 311 -46 334 7 328 -16 b 56 -222 229 -184 137 -222 b 229 36 75 -86 145 -55 b 311 128 264 73 289 102 z',\n },\n flag128thUp: {\n x_min: 0,\n x_max: 261,\n y_min: -812,\n y_max: 533,\n ha: 1345,\n o: 'm 374 -969 b 337 -806 372 -913 359 -858 b 336 -796 336 -804 336 -801 b 337 -788 336 -793 336 -791 b 370 -616 340 -778 370 -698 b 340 -482 370 -570 360 -524 b 369 -330 353 -445 369 -386 b 337 -203 369 -287 359 -242 b 369 -43 350 -167 369 -104 b 366 -4 369 -30 367 -17 b 341 75 360 26 353 50 b 369 222 354 111 369 167 b 366 264 369 236 369 251 b 220 495 350 351 317 390 b 46 740 148 573 71 596 b 22 768 45 753 35 768 b 0 750 10 768 0 760 l 0 -609 l 7 -609 b 278 -802 91 -612 186 -615 b 323 -999 310 -865 323 -930 b 311 -1122 323 -1040 318 -1080 b 310 -1132 311 -1126 310 -1129 b 328 -1166 310 -1149 318 -1162 b 337 -1169 331 -1168 334 -1169 b 366 -1146 346 -1169 356 -1162 b 376 -1009 370 -1138 376 -1071 b 374 -969 376 -995 374 -982 z m 300 292 b 321 223 315 264 321 242 b 317 193 321 212 318 203 b 301 135 314 180 308 158 b 220 228 281 161 255 190 b 55 461 151 304 79 327 b 300 292 134 461 220 426 z m 300 24 b 321 -45 315 -4 321 -26 b 317 -75 321 -56 318 -65 l 298 -145 b 220 -58 278 -121 253 -94 b 56 187 148 20 81 43 b 55 193 56 189 56 192 b 300 24 137 193 220 157 z m 300 -261 b 321 -330 315 -289 321 -311 b 317 -360 321 -341 318 -350 b 300 -423 314 -374 307 -399 b 220 -334 279 -397 253 -370 b 56 -92 150 -256 79 -232 b 300 -261 135 -92 220 -127 z m 315 -657 b 308 -690 312 -668 312 -680 b 292 -698 307 -694 300 -698 b 282 -693 288 -698 284 -697 b 216 -608 261 -661 240 -636 l 209 -600 b 55 -386 147 -527 84 -497 b 73 -367 53 -376 62 -367 b 318 -622 189 -367 318 -505 b 315 -657 318 -634 317 -645 z',\n },\n flag128thDown: {\n x_min: 0,\n x_max: 273,\n y_min: -580,\n y_max: 812,\n ha: 1392,\n o: 'm 393 973 b 333 1169 393 1002 383 1169 b 324 1168 330 1169 327 1169 b 304 1130 314 1164 304 1149 b 305 1120 304 1128 305 1125 b 334 962 317 1056 334 1011 b 289 821 334 922 323 880 b 0 619 180 625 88 622 l 0 -816 b 20 -835 0 -828 7 -835 b 48 -806 33 -835 46 -819 b 229 -552 72 -657 154 -634 b 380 -310 330 -442 364 -402 b 384 -266 383 -295 384 -281 b 351 -105 384 -206 366 -143 b 384 27 372 -66 384 -16 b 351 189 384 88 366 151 b 380 278 366 216 374 243 b 383 320 383 291 383 305 b 351 484 383 382 364 445 b 384 629 374 526 384 580 b 356 780 384 704 361 766 b 356 783 356 782 356 783 l 351 791 b 356 804 351 796 353 799 l 361 814 b 393 958 380 850 387 865 z m 56 386 b 217 609 86 501 153 533 b 292 706 246 642 269 670 b 304 711 295 710 300 711 b 321 703 311 711 320 707 b 328 670 325 693 325 681 b 331 634 330 658 331 645 b 82 367 331 516 199 367 l 75 367 b 56 386 62 367 56 379 z m 330 350 b 334 320 331 340 334 331 b 311 248 334 301 328 278 b 59 72 229 109 141 72 b 56 76 56 73 56 75 b 229 331 81 226 154 249 b 310 423 264 369 289 397 b 330 350 318 396 325 366 z m 330 56 b 334 26 331 46 334 37 b 311 -46 334 7 328 -16 b 56 -222 229 -184 137 -222 b 229 36 75 -86 145 -55 b 311 128 264 73 289 102 z m 330 -238 b 334 -268 331 -248 334 -256 b 311 -340 334 -287 328 -310 b 56 -516 229 -478 137 -516 b 229 -258 75 -380 145 -348 b 311 -166 264 -220 289 -192 z',\n },\n accidentalFlat: {\n x_min: 0,\n x_max: 226,\n y_min: -175,\n y_max: 439,\n ha: 614,\n o: 'm 17 -245 b 30 -252 22 -251 26 -252 b 39 -249 35 -252 39 -249 b 153 -161 82 -225 117 -186 b 325 82 281 -72 325 16 b 196 220 325 164 262 216 b 117 196 171 220 137 209 b 85 176 108 189 92 176 b 78 177 82 176 81 176 b 62 202 68 181 62 192 b 72 608 63 233 72 579 b 45 632 72 624 59 632 b 0 592 24 632 1 618 b 17 -245 0 592 6 -230 z m 68 -117 b 63 27 68 -117 63 -30 b 66 73 63 50 65 68 b 167 144 76 102 134 144 b 226 60 209 144 226 96 b 98 -134 226 -17 160 -95 b 84 -138 92 -137 88 -138 b 68 -117 71 -138 68 -124 z',\n },\n accidentalNatural: {\n x_min: 0,\n x_max: 168,\n y_min: -335,\n y_max: 341,\n ha: 676,\n o: 'm 203 261 b 197 259 200 261 199 259 b 68 226 197 259 105 226 b 53 233 59 226 53 228 l 53 474 b 36 491 53 484 45 491 l 17 491 b 0 474 7 491 0 484 l 0 -268 b 13 -281 0 -276 4 -281 l 16 -279 b 22 -278 17 -279 20 -279 b 164 -235 42 -269 122 -235 b 189 -251 179 -235 189 -239 l 189 -465 b 206 -482 189 -475 196 -482 l 225 -482 b 242 -465 233 -482 242 -475 l 242 258 b 230 269 242 265 236 269 b 225 268 229 269 226 269 z m 53 56 b 176 114 53 76 141 114 b 189 107 184 114 189 112 l 189 -42 b 71 -101 189 -68 107 -101 b 53 -92 60 -101 53 -98 z',\n },\n accidentalSharp: {\n x_min: 0,\n x_max: 249,\n y_min: -348,\n y_max: 350,\n ha: 698,\n o: 'm 341 170 b 359 194 351 174 359 186 l 359 297 b 348 308 359 304 354 308 b 341 307 346 308 344 308 b 305 294 341 307 312 295 b 285 312 295 294 285 301 l 285 488 b 265 504 285 497 276 504 b 242 488 251 504 242 497 l 242 301 b 223 259 240 287 236 268 b 132 223 206 249 157 229 b 115 252 120 223 115 240 l 115 425 b 95 441 115 433 105 441 b 72 425 81 441 72 433 l 72 230 b 55 192 72 210 63 196 b 17 176 46 187 17 176 b 0 153 7 173 0 161 l 0 50 b 13 37 0 42 4 37 l 16 39 b 50 53 17 39 39 48 l 52 55 b 72 29 63 55 72 40 l 72 -114 b 56 -147 72 -130 65 -143 b 17 -163 48 -150 17 -163 b 0 -186 7 -166 0 -177 l 0 -288 b 13 -301 0 -297 4 -301 l 16 -300 b 50 -287 17 -300 37 -291 b 55 -285 52 -285 53 -285 b 72 -308 65 -285 72 -301 l 72 -485 b 91 -501 72 -494 81 -501 b 115 -485 105 -501 115 -494 l 115 -285 b 130 -253 115 -266 122 -256 l 217 -217 b 219 -217 217 -217 219 -217 l 222 -216 b 242 -242 235 -216 242 -233 l 242 -422 b 261 -438 242 -431 251 -438 b 285 -422 276 -438 285 -431 l 285 -217 b 301 -184 285 -206 291 -189 b 341 -168 311 -180 341 -168 b 359 -144 351 -164 359 -153 l 359 -42 b 348 -30 359 -35 354 -30 b 341 -32 346 -30 344 -30 l 304 -46 b 285 -20 295 -46 285 -37 l 285 114 b 304 156 285 124 292 151 z m 242 -65 b 132 -122 233 -94 166 -122 b 115 -115 124 -122 117 -120 b 111 -43 112 -109 111 -78 b 115 63 111 1 112 52 b 220 118 118 88 184 118 b 242 109 230 118 239 115 b 248 27 245 102 248 66 b 242 -65 248 -12 245 -52 z',\n },\n accidentalDoubleSharp: {\n x_min: 0,\n x_max: 247,\n y_min: -125,\n y_max: 127,\n ha: 252,\n o: 'm 274 -46 b 206 1 258 -37 206 -9 b 274 50 206 22 253 43 b 278 50 275 50 276 50 l 287 49 b 346 63 304 49 331 52 b 356 115 353 71 356 92 b 292 183 356 174 351 183 b 233 173 266 183 240 180 b 226 117 228 168 226 143 b 179 49 219 101 196 49 b 130 117 158 49 135 96 b 118 173 130 141 125 167 b 66 183 112 180 89 183 b 7 173 42 183 16 180 b 0 120 3 170 0 145 b 7 63 0 94 3 68 b 68 49 17 55 43 49 b 82 50 73 49 78 50 b 150 3 98 42 150 13 b 84 -46 150 -16 104 -39 l 69 -46 b 7 -56 43 -46 16 -49 b 0 -111 3 -60 0 -85 b 7 -166 0 -137 3 -163 b 65 -180 17 -174 40 -180 b 118 -166 86 -180 109 -176 b 130 -111 127 -158 130 -134 b 132 -105 130 -109 131 -107 b 177 -45 141 -85 158 -45 b 226 -111 196 -45 220 -91 b 233 -166 226 -137 228 -161 b 291 -180 243 -174 266 -180 b 356 -114 346 -180 356 -166 b 346 -56 356 -89 351 -63 b 288 -46 338 -49 312 -46 z',\n },\n accidentalDoubleFlat: {\n x_min: 0,\n x_max: 411,\n y_min: -175,\n y_max: 437,\n ha: 612,\n o: 'm 452 217 b 384 194 426 217 408 207 b 350 176 374 189 363 176 b 343 177 347 176 344 176 b 328 202 333 180 328 190 b 337 606 328 232 337 579 b 310 629 337 622 324 629 b 265 592 291 629 268 616 b 269 194 265 592 266 395 b 196 217 248 209 223 217 l 187 217 b 120 194 160 217 143 207 b 85 176 108 189 98 176 b 78 177 82 176 81 176 b 62 202 68 180 62 190 b 72 606 62 232 72 579 b 45 629 72 622 59 629 b 0 592 24 629 1 616 b 17 -245 0 592 7 -232 b 30 -252 22 -251 26 -252 b 39 -249 35 -252 39 -249 b 153 -161 84 -226 120 -186 b 274 -50 206 -124 246 -85 b 284 -245 276 -158 279 -240 b 295 -252 288 -251 292 -252 b 304 -249 300 -252 304 -249 b 416 -163 348 -226 383 -186 b 592 82 546 -72 592 16 b 461 217 592 163 528 216 z m 96 -134 b 84 -138 92 -137 86 -138 b 68 -115 72 -138 68 -124 b 63 26 68 -115 63 -30 b 66 72 63 49 65 66 b 168 144 75 101 134 144 b 226 59 212 144 226 95 b 96 -134 226 -22 161 -94 z m 361 -134 b 348 -138 356 -137 351 -138 b 333 -115 337 -138 333 -124 b 328 39 333 -115 328 -16 b 330 72 328 55 328 68 b 433 144 338 101 399 144 b 468 130 448 144 459 140 b 490 59 481 112 490 88 b 361 -134 490 -22 426 -94 z',\n },\n accidentalParensLeft: {\n x_min: 0,\n x_max: 141,\n y_min: -248,\n y_max: 247,\n ha: 495,\n o: 'm 203 331 l 203 351 b 202 356 203 354 203 356 b 0 0 60 281 0 140 b 199 -357 0 -144 60 -269 b 203 -354 200 -357 203 -356 l 203 -333 b 200 -327 203 -330 202 -328 b 86 0 118 -253 86 -160 b 200 324 86 158 120 251 b 203 331 202 325 203 327 z',\n },\n accidentalParensRight: {\n x_min: 0,\n x_max: 141,\n y_min: -248,\n y_max: 247,\n ha: 495,\n o: 'm 0 331 b 3 324 0 327 1 325 b 117 0 84 251 117 158 b 3 -327 117 -160 85 -253 b 0 -333 1 -328 0 -330 l 0 -354 b 4 -357 0 -356 3 -357 b 203 0 143 -269 203 -144 b 1 356 203 140 143 281 b 0 351 0 356 0 354 z',\n },\n accidentalQuarterToneFlatStein: {\n x_min: 1,\n x_max: 227,\n y_min: -175,\n y_max: 439,\n ha: 614,\n o: 'm 310 -245 b 327 592 321 -230 327 592 b 282 632 325 618 302 632 b 255 608 268 632 255 624 b 265 202 255 579 264 233 b 249 177 265 192 259 181 b 242 176 246 176 245 176 b 210 196 235 176 219 189 b 131 220 190 209 156 220 b 1 85 65 216 1 164 b 174 -161 1 16 46 -72 b 288 -249 210 -186 245 -225 b 297 -252 288 -249 292 -252 b 310 -245 301 -252 305 -251 z m 259 -117 b 243 -138 259 -124 256 -138 b 229 -134 239 -138 235 -137 b 101 60 167 -95 101 -17 b 160 144 101 96 118 144 b 261 73 193 144 251 102 b 264 27 262 68 264 50 b 259 -117 264 -30 259 -117 z',\n },\n accidentalThreeQuarterTonesFlatZimmermann: {\n x_min: 1,\n x_max: 466,\n y_min: -175,\n y_max: 439,\n ha: 614,\n o: 'm 363 -245 b 376 -252 367 -251 372 -252 b 384 -249 380 -252 384 -249 b 497 -161 428 -226 464 -186 b 671 84 625 -72 671 16 b 541 220 671 164 606 217 b 513 217 531 220 523 219 b 464 196 495 212 480 206 b 431 176 452 189 442 176 b 423 177 428 176 426 176 b 408 202 413 180 408 190 l 419 608 b 392 632 419 625 406 632 b 346 592 372 632 347 618 b 363 -245 346 592 351 -230 z m 289 -249 b 297 -252 289 -249 292 -252 b 310 -245 300 -252 305 -251 b 328 592 321 -230 328 592 b 282 631 327 618 302 631 b 255 608 268 631 255 624 l 266 202 b 251 177 266 190 261 180 b 243 176 248 176 246 176 b 210 196 232 176 222 189 b 164 216 196 204 180 210 l 163 217 b 132 220 151 219 143 220 b 1 84 65 217 1 163 b 177 -163 1 16 48 -72 b 289 -249 210 -186 245 -226 z m 262 72 b 265 26 264 66 265 49 b 261 -115 265 -30 261 -115 b 245 -138 261 -124 258 -138 b 230 -134 240 -138 236 -137 b 102 60 166 -92 102 -20 b 124 128 102 88 111 112 b 161 144 134 138 147 144 b 199 134 173 144 184 141 b 262 72 219 122 256 92 z m 413 -115 b 409 26 413 -115 409 -30 b 412 72 409 49 410 66 b 514 144 420 102 480 144 b 570 60 557 144 570 96 b 442 -134 570 -23 508 -91 b 429 -138 436 -137 433 -138 b 413 -115 418 -138 413 -124 z',\n },\n accidentalQuarterToneSharpStein: {\n x_min: 0,\n x_max: 179,\n y_min: -353,\n y_max: 307,\n ha: 660,\n o: 'm 258 240 b 246 252 258 248 252 252 b 240 251 245 252 242 252 b 168 225 240 251 171 225 b 150 253 156 225 150 240 l 150 426 b 130 442 150 435 141 442 b 105 418 108 442 105 429 l 105 230 b 91 193 105 219 101 202 b 17 161 65 183 42 171 b 0 138 9 158 0 147 l 0 36 b 13 23 0 27 4 23 l 16 24 b 86 53 17 24 73 49 l 88 55 b 107 30 98 55 107 42 l 107 -114 b 92 -145 107 -130 101 -143 l 17 -177 b 0 -200 9 -180 0 -192 l 0 -302 b 13 -315 0 -311 4 -315 l 16 -314 b 85 -285 17 -314 72 -291 b 105 -312 92 -282 105 -301 l 105 -492 b 125 -508 105 -501 114 -508 b 150 -484 147 -508 150 -498 l 150 -285 b 151 -274 150 -281 150 -278 b 164 -253 153 -265 158 -256 b 240 -225 176 -251 240 -225 b 258 -202 249 -222 258 -210 l 258 -99 b 245 -86 258 -91 253 -86 l 242 -88 b 240 -88 242 -88 240 -88 l 240 -86 b 168 -115 240 -86 174 -114 b 148 -91 158 -115 148 -107 l 148 43 b 167 85 148 55 156 81 b 240 114 180 91 240 114 b 258 138 249 118 258 128 z',\n },\n accidentalThreeQuarterTonesSharpStein: {\n x_min: 3,\n x_max: 317,\n y_min: -347,\n y_max: 369,\n ha: 716,\n o: 'm 456 324 b 448 336 456 330 454 336 b 393 317 445 336 400 320 b 389 315 392 315 390 315 b 383 325 386 315 383 318 l 383 508 b 360 531 383 528 379 531 b 337 508 341 531 337 527 l 337 318 b 325 291 337 300 334 294 b 268 268 320 288 287 276 b 253 281 256 268 253 274 l 253 464 b 230 487 253 484 249 487 b 207 464 212 487 207 482 l 207 264 b 194 240 207 253 204 245 l 132 217 b 131 217 132 217 132 217 l 130 216 b 118 229 122 216 118 220 l 118 420 b 95 444 118 439 114 444 b 72 420 76 444 72 439 l 72 212 b 60 190 72 197 68 193 l 16 173 b 4 161 9 170 4 167 l 4 50 b 13 39 4 45 9 39 b 58 55 16 39 46 49 b 63 56 60 56 62 56 b 72 42 71 56 72 50 l 72 -125 b 58 -150 72 -137 65 -147 l 16 -166 b 4 -177 9 -168 4 -171 l 4 -289 b 14 -301 4 -295 9 -301 b 53 -287 16 -301 40 -291 b 62 -285 56 -285 59 -285 b 72 -298 69 -285 72 -289 l 72 -477 b 95 -500 72 -495 76 -500 b 118 -477 114 -500 118 -495 l 118 -278 b 127 -259 118 -269 121 -261 l 196 -232 b 207 -243 204 -232 207 -235 l 207 -432 b 230 -455 207 -452 212 -455 b 253 -432 249 -455 253 -451 l 253 -228 b 268 -204 253 -216 259 -207 l 320 -186 b 328 -183 323 -184 325 -183 b 337 -194 334 -183 337 -187 l 337 -387 b 360 -410 337 -408 341 -410 b 383 -387 379 -410 383 -406 l 383 -174 b 395 -157 383 -166 390 -158 l 445 -138 b 456 -127 452 -135 456 -132 l 456 -14 b 448 -3 456 -10 454 -3 b 397 -22 445 -3 408 -17 l 396 -23 b 383 -6 387 -23 383 -16 l 383 163 b 392 181 383 173 384 179 b 445 202 397 183 445 202 b 456 213 452 203 456 207 z m 337 -45 b 266 -78 333 -56 287 -78 b 258 -75 262 -78 259 -76 b 253 19 255 -71 253 -27 b 258 130 253 69 255 122 b 333 163 264 141 315 163 b 337 161 334 163 337 161 b 341 78 340 157 341 120 b 337 -45 341 24 340 -37 z m 118 -127 b 114 -48 114 -121 114 -86 b 118 78 114 6 115 68 b 200 114 122 91 180 114 b 207 111 204 114 206 112 b 212 22 210 107 212 66 b 207 -94 212 -29 210 -85 b 127 -130 203 -108 148 -130 b 118 -127 122 -130 120 -128 z',\n },\n accidentalBuyukMucennebFlat: {\n x_min: 1,\n x_max: 287,\n y_min: -174,\n y_max: 438,\n ha: 612,\n o: 'm 379 452 b 370 464 379 458 377 464 b 164 389 366 464 170 392 b 156 396 163 389 156 393 b 157 436 157 409 157 428 b 167 452 157 445 161 449 b 366 526 173 455 366 526 b 379 540 374 528 379 534 l 379 611 b 370 622 379 616 377 622 b 170 550 366 622 174 552 b 160 557 163 550 160 554 b 161 608 160 585 161 602 b 134 631 161 624 148 631 b 89 590 114 631 91 616 l 89 528 b 81 517 89 526 88 518 b 16 491 76 514 16 491 b 1 480 6 490 1 485 l 1 406 b 13 395 1 400 4 395 l 14 396 b 79 419 16 396 72 415 b 89 412 86 419 89 415 b 91 376 89 399 89 386 b 82 359 91 364 89 361 b 16 331 76 356 16 331 b 1 321 6 331 1 328 l 1 248 b 13 236 1 242 4 236 b 79 262 16 236 71 258 b 92 251 89 262 92 256 b 107 -242 95 23 101 -236 b 120 -251 111 -249 115 -251 b 128 -248 124 -251 128 -248 b 240 -160 171 -225 207 -184 b 413 84 367 -71 413 16 b 284 220 413 166 350 216 b 207 196 259 220 229 209 b 170 176 196 190 184 176 l 168 177 b 151 203 157 181 151 192 b 153 269 151 210 151 236 b 163 292 153 275 153 289 b 366 367 173 297 366 367 b 379 383 374 370 379 376 z m 186 -132 b 173 -137 180 -135 176 -137 b 157 -114 161 -137 157 -122 b 153 35 157 -114 153 -22 b 154 73 153 53 153 68 b 219 135 160 92 197 124 b 255 144 232 141 243 144 b 292 130 269 144 282 140 b 314 62 305 114 314 91 b 186 -132 314 -17 251 -94 z',\n },\n accidentalBakiyeFlat: {\n x_min: -1,\n x_max: 286,\n y_min: -175,\n y_max: 439,\n ha: 614,\n o: 'm 377 454 b 369 467 377 458 376 467 b 363 465 367 467 364 467 b 161 390 363 465 167 393 b 153 399 154 390 153 395 b 157 608 154 494 157 593 b 130 632 157 624 144 632 b 86 592 111 632 88 618 b 88 377 86 592 86 501 b 76 356 88 373 88 360 l 12 331 b -1 320 3 330 -1 327 l -1 248 b 9 236 -1 242 1 236 b 81 264 12 236 78 261 b 89 258 86 264 89 261 b 104 -245 92 30 96 -236 b 115 -252 108 -251 112 -252 b 124 -249 120 -252 124 -249 b 239 -161 167 -226 203 -186 b 412 84 367 -72 412 17 b 282 220 412 166 348 216 b 255 216 274 220 264 219 b 203 196 238 212 222 206 b 171 177 193 189 177 177 b 163 179 168 177 166 177 b 147 202 153 181 147 192 b 147 216 147 204 147 209 l 150 262 b 150 276 150 269 150 275 b 158 291 150 287 154 289 b 363 370 163 292 363 370 b 377 384 373 373 377 379 z m 181 -134 b 167 -138 176 -137 171 -138 b 153 -117 156 -138 153 -125 b 148 27 153 -117 148 -30 b 151 73 148 50 150 68 b 255 144 161 105 219 144 b 312 62 298 144 312 99 b 181 -134 312 -19 249 -96 z',\n },\n accidentalKomaSharp: {\n x_min: 0,\n x_max: 229,\n y_min: -337,\n y_max: 322,\n ha: 659,\n o: 'm 312 151 b 330 176 323 156 330 166 l 330 278 b 320 289 330 285 327 289 b 312 288 318 289 315 289 b 200 246 312 288 203 248 b 181 275 187 246 181 264 l 181 448 b 163 464 181 456 173 464 b 138 441 140 464 138 452 l 138 253 b 122 215 137 240 132 225 b 17 177 92 203 45 177 b 0 153 7 173 0 163 l 0 50 b 10 39 0 43 4 39 b 17 40 13 39 14 39 l 128 81 b 138 52 138 81 138 63 l 138 -91 b 124 -124 138 -107 132 -120 b 17 -167 115 -127 17 -167 b 0 -192 7 -171 0 -181 l 0 -294 b 10 -305 0 -301 4 -305 b 17 -304 13 -305 14 -305 b 128 -261 17 -304 117 -264 l 130 -259 b 138 -276 137 -259 138 -268 l 138 -469 b 157 -485 138 -478 147 -485 b 181 -462 179 -485 181 -475 l 181 -262 b 183 -252 181 -258 181 -255 b 197 -232 186 -243 190 -235 b 312 -187 207 -228 312 -187 b 330 -163 323 -183 330 -173 l 330 -60 b 320 -49 330 -53 327 -49 b 312 -50 318 -49 315 -49 l 200 -94 b 193 -95 197 -95 194 -95 b 181 -68 183 -95 181 -85 l 181 66 b 200 108 181 92 189 104 z',\n },\n accidentalKucukMucennebSharp: {\n x_min: -1,\n x_max: 339,\n y_min: -338,\n y_max: 321,\n ha: 659,\n o: 'm 264 92 b 271 102 264 98 265 99 l 395 150 b 412 174 405 154 412 164 l 412 276 b 402 288 412 284 409 288 b 395 287 400 288 397 288 b 282 245 395 287 285 246 b 264 274 269 245 264 262 l 264 446 b 245 462 264 455 255 462 b 220 439 222 462 220 451 l 220 252 b 204 213 219 239 215 223 b 99 176 174 202 127 176 b 82 151 89 171 82 161 l 82 49 b 92 37 82 42 86 37 b 99 39 95 37 96 37 l 210 79 b 216 81 212 81 215 81 b 220 78 219 81 220 79 l 220 56 b 216 46 220 52 220 48 b 16 -29 210 45 16 -29 b -1 -45 4 -32 -1 -36 l -1 -138 b 12 -154 -1 -145 3 -154 l 215 -79 b 220 -84 219 -79 220 -81 l 220 -105 b 210 -122 220 -115 219 -120 b 99 -168 202 -127 99 -168 b 82 -193 89 -173 82 -183 l 82 -295 b 92 -307 82 -302 86 -307 b 99 -305 95 -307 96 -307 b 210 -262 99 -305 199 -265 l 212 -261 b 220 -278 219 -261 220 -269 l 220 -471 b 239 -487 220 -480 229 -487 b 264 -464 261 -487 264 -477 l 264 -264 b 265 -253 264 -259 264 -256 b 279 -233 268 -245 272 -236 b 395 -189 289 -229 395 -189 b 412 -164 405 -184 412 -174 l 412 -62 b 402 -50 412 -55 409 -50 b 395 -52 400 -50 397 -50 l 278 -96 b 264 -86 268 -96 264 -94 l 264 -68 b 269 -59 264 -62 265 -60 b 471 17 274 -58 471 17 b 488 36 484 22 488 27 l 488 127 b 475 144 488 134 487 144 l 472 141 b 471 141 472 141 471 141 l 471 143 b 272 68 471 143 282 71 l 269 66 b 264 71 264 66 264 69 z',\n },\n accidentalKoron: {\n x_min: 0,\n x_max: 300,\n y_min: -472,\n y_max: 157,\n ha: 629,\n o: 'm 432 -4 b 415 10 432 1 418 9 l 4 226 b 0 223 1 226 0 225 l 0 -672 b 7 -680 0 -677 3 -680 l 45 -680 b 52 -672 49 -680 52 -677 l 52 -193 l 415 -22 b 432 -4 418 -20 432 -13 z m 52 -137 l 52 144 l 327 -7 z',\n },\n accidentalSori: {\n x_min: 0,\n x_max: 421,\n y_min: -318,\n y_max: 328,\n ha: 646,\n o: 'm 606 10 b 589 23 606 16 592 22 l 382 109 l 382 465 b 374 472 382 469 379 472 l 337 472 b 330 465 333 472 330 469 l 330 132 l 183 194 l 183 425 b 176 432 183 429 180 432 l 138 432 b 131 425 134 432 131 429 l 131 216 l 3 269 b 0 265 0 269 0 266 l 0 223 b 3 213 0 216 0 215 l 131 160 l 131 -150 l 3 -203 b 0 -212 0 -204 0 -206 l 0 -255 b 3 -259 0 -258 1 -259 l 131 -204 l 131 -451 b 138 -458 131 -455 134 -458 l 176 -458 b 183 -451 180 -458 183 -455 l 183 -183 l 330 -120 l 330 -410 b 337 -418 330 -415 333 -418 l 374 -418 b 382 -410 379 -418 382 -415 l 382 -98 l 589 -9 b 606 10 592 -9 606 0 z m 183 -128 l 183 138 l 330 76 l 330 -66 z m 382 -45 l 382 55 l 501 6 z',\n },\n articAccentAbove: {\n x_min: 0,\n x_max: 339,\n y_min: 1,\n y_max: 245,\n ha: 244,\n o: 'm 469 151 b 488 177 488 156 488 166 b 469 203 488 189 488 197 l 37 350 b 24 353 32 351 26 353 b 3 333 12 353 7 344 b 0 318 1 327 0 323 b 20 298 0 311 4 304 b 346 187 20 298 331 193 b 356 177 353 186 356 181 b 344 167 356 173 353 170 b 20 58 328 163 20 58 b 0 36 4 50 0 43 b 3 23 0 32 1 27 b 23 1 7 13 13 1 b 29 3 24 1 27 1 z',\n },\n articAccentBelow: {\n x_min: 0,\n x_max: 339,\n y_min: -244,\n y_max: 0,\n ha: 244,\n o: 'm 469 -202 b 488 -176 488 -197 488 -187 b 469 -150 488 -164 488 -156 l 37 -3 b 24 0 32 -1 26 0 b 3 -20 12 0 7 -9 b 0 -35 1 -26 0 -30 b 20 -55 0 -42 4 -49 b 346 -166 20 -55 331 -160 b 356 -176 353 -167 356 -171 b 344 -186 356 -180 353 -183 b 20 -295 328 -190 20 -295 b 0 -317 4 -302 0 -310 b 3 -330 0 -321 1 -325 b 23 -351 7 -340 13 -351 b 29 -350 24 -351 27 -351 z',\n },\n articTenutoAbove: {\n x_min: -1,\n x_max: 338,\n y_min: 0,\n y_max: 48,\n ha: 48,\n o: 'm 452 0 b 487 35 485 0 487 16 b 452 69 487 53 487 69 l 33 69 b -1 35 -1 69 -1 53 b 33 0 -1 16 -1 0 z',\n },\n articTenutoBelow: {\n x_min: -1,\n x_max: 338,\n y_min: -48,\n y_max: 0,\n ha: 48,\n o: 'm 452 -69 b 487 -35 485 -69 487 -53 b 452 0 487 -16 487 0 l 33 0 b -1 -35 -1 0 -1 -16 b 33 -69 -1 -53 -1 -69 z',\n },\n articStaccatoAbove: {\n x_min: 0,\n x_max: 84,\n y_min: 0,\n y_max: 84,\n ha: 84,\n o: 'm 121 60 b 60 121 121 94 94 121 b 0 60 27 121 0 94 b 60 0 0 27 27 0 b 121 60 94 0 121 27 z',\n },\n articStaccatoBelow: {\n x_min: 0,\n x_max: 84,\n y_min: -84,\n y_max: 0,\n ha: 84,\n o: 'm 121 -60 b 60 0 121 -27 94 0 b 0 -60 27 0 0 -27 b 60 -121 0 -94 27 -121 b 121 -60 94 -121 121 -94 z',\n },\n articStaccatissimoAbove: {\n x_min: 1,\n x_max: 100,\n y_min: -2,\n y_max: 293,\n ha: 295,\n o: 'm 72 422 b 1 390 35 422 3 409 b 72 -3 1 369 39 -3 b 144 389 108 -3 144 356 b 72 422 144 410 111 422 z',\n },\n articStaccatissimoBelow: {\n x_min: 1,\n x_max: 100,\n y_min: -295,\n y_max: 0,\n ha: 295,\n o: 'm 72 -425 b 144 -392 111 -425 144 -413 b 72 0 144 -359 108 0 b 1 -393 39 0 1 -372 b 72 -425 3 -412 35 -425 z',\n },\n articMarcatoAbove: {\n x_min: -1,\n x_max: 235,\n y_min: -1,\n y_max: 253,\n ha: 254,\n o: 'm 181 356 b 167 364 177 361 173 364 b 153 356 157 364 153 356 l 0 23 b -1 16 -1 20 -1 19 b 9 0 -1 9 1 1 b 16 -1 10 -1 14 -1 b 32 9 22 -1 29 1 b 112 186 32 9 109 180 b 118 190 114 189 115 190 b 127 186 121 190 124 189 b 209 9 128 180 209 9 b 225 0 213 3 219 0 l 323 0 b 338 16 333 1 338 7 b 337 23 338 19 338 22 z',\n },\n articMarcatoBelow: {\n x_min: -1,\n x_max: 235,\n y_min: -254,\n y_max: 0,\n ha: 254,\n o: 'm 156 -357 b 170 -366 160 -363 164 -366 b 184 -357 180 -366 184 -357 l 337 -24 b 338 -17 338 -22 338 -20 b 328 -1 338 -10 336 -3 b 321 0 327 0 323 0 b 305 -10 315 0 308 -3 b 225 -187 305 -10 228 -181 b 219 -192 223 -190 222 -192 b 210 -187 216 -192 213 -190 b 128 -10 209 -181 128 -10 b 112 -1 124 -4 118 -1 l 14 -1 b -1 -17 4 -3 -1 -9 b 0 -24 -1 -20 -1 -23 z',\n },\n fermataAbove: {\n x_min: 3,\n x_max: 605,\n y_min: -3,\n y_max: 329,\n ha: 332,\n o: 'm 435 318 b 818 36 742 318 804 91 b 821 26 819 32 819 27 b 851 -4 831 6 837 -4 b 871 16 864 -4 871 1 b 870 30 871 20 871 24 b 438 474 780 471 480 474 b 6 30 392 474 94 471 b 4 14 4 24 4 19 b 23 -4 4 0 12 -4 b 52 26 36 -4 43 6 b 56 39 53 27 55 33 b 435 318 73 98 138 318 z m 516 75 b 436 153 516 117 480 153 b 359 75 395 153 359 117 b 436 -4 359 32 395 -4 b 516 75 480 -4 516 32 z',\n },\n fermataBelow: {\n x_min: 3,\n x_max: 605,\n y_min: -332,\n y_max: 0,\n ha: 332,\n o: 'm 435 -323 b 56 -43 138 -323 73 -102 b 52 -30 55 -37 53 -32 b 23 0 43 -10 36 0 b 4 -19 12 0 4 -4 b 6 -35 4 -23 4 -29 b 438 -478 94 -475 392 -478 b 870 -35 480 -478 780 -475 b 871 -20 871 -29 871 -24 b 851 0 871 -6 864 0 b 821 -30 837 0 831 -10 b 818 -40 819 -32 819 -36 b 435 -323 804 -95 742 -323 z m 516 -79 b 436 0 516 -36 480 0 b 359 -79 395 0 359 -36 b 436 -157 359 -121 395 -157 b 516 -79 480 -157 516 -121 z',\n },\n breathMarkComma: {\n x_min: 1,\n x_max: 152,\n y_min: 2,\n y_max: 251,\n ha: 249,\n o: 'm 104 361 b 1 271 42 361 1 321 b 82 190 1 222 35 190 b 122 160 118 190 122 160 b 125 144 124 154 125 150 b 102 88 125 124 115 105 b 37 32 78 56 40 35 b 26 17 32 29 26 26 l 27 16 b 37 3 29 6 33 3 b 181 102 85 3 158 66 b 219 239 210 147 219 197 l 219 249 b 104 361 219 317 170 361 z',\n },\n breathMarkUpbow: {\n x_min: 1,\n x_max: 249,\n y_min: 1,\n y_max: 495,\n ha: 494,\n o: 'm 181 1 b 206 22 193 1 203 10 l 359 683 l 359 688 b 338 713 359 700 351 710 l 333 713 b 308 694 321 713 311 706 l 180 140 l 53 694 b 27 713 49 706 39 713 l 22 713 b 1 690 10 710 1 700 b 3 683 1 687 1 685 l 154 22 b 181 1 157 10 167 1 z',\n },\n caesura: {\n x_min: 0,\n x_max: 384,\n y_min: -1,\n y_max: 532,\n ha: 533,\n o: 'm 40 -1 b 78 26 58 -1 72 9 l 321 713 b 323 726 323 717 323 721 b 282 766 323 747 304 766 b 245 739 265 766 251 756 l 3 52 b 0 37 1 48 0 42 b 27 1 0 22 10 7 b 40 -1 32 -1 36 -1 z m 308 26 l 552 713 b 553 726 553 717 553 721 b 513 766 553 747 534 766 b 475 739 495 766 481 756 l 232 52 b 230 39 230 48 230 43 b 258 1 230 23 240 7 b 271 -1 262 -1 266 -1 b 308 26 287 -1 302 9 z',\n },\n caesuraCurved: {\n x_min: 0,\n x_max: 373,\n y_min: 0,\n y_max: 530,\n ha: 530,\n o: 'm 491 763 b 445 719 468 763 446 744 b 252 98 432 507 340 295 l 226 39 b 223 27 225 35 223 32 b 252 0 223 13 233 0 b 276 16 262 0 272 6 b 537 716 386 230 537 478 b 491 763 537 742 518 763 z m 29 0 b 53 16 39 0 48 6 l 82 69 b 314 716 187 264 314 498 b 268 763 314 742 295 763 b 222 719 245 763 223 744 b 29 98 209 507 117 295 l 3 39 b 0 29 1 36 0 33 b 29 0 0 14 12 0 z',\n },\n restMaxima: {\n x_min: 0,\n x_max: 381,\n y_min: -249,\n y_max: 250,\n ha: 499,\n o: 'm 180 -330 l 180 331 b 156 360 180 356 170 360 l 23 360 b 0 331 10 360 0 356 l 0 -330 b 23 -359 0 -354 10 -359 l 156 -359 b 180 -330 170 -359 180 -354 z m 549 -330 l 549 331 b 524 360 549 356 539 360 l 392 360 b 369 331 379 360 369 356 l 369 -330 b 392 -359 369 -354 379 -359 l 524 -359 b 549 -330 539 -359 549 -354 z',\n },\n restDoubleWhole: {\n x_min: 0,\n x_max: 125,\n y_min: 0,\n y_max: 250,\n ha: 250,\n o: 'm 180 22 l 180 338 b 156 360 180 350 170 360 l 23 360 b 0 338 10 360 0 350 l 0 22 b 23 0 0 10 10 0 l 156 0 b 180 22 170 0 180 10 z',\n },\n restWhole: {\n x_min: 0,\n x_max: 282,\n y_min: -135,\n y_max: 9,\n ha: 144,\n o: 'm 406 -157 l 406 -24 b 369 13 406 -3 389 13 l 37 13 b 0 -24 16 13 0 -3 l 0 -157 b 37 -194 0 -177 16 -194 l 369 -194 b 406 -157 389 -194 406 -177 z',\n },\n restHalf: {\n x_min: 0,\n x_max: 282,\n y_min: -2,\n y_max: 142,\n ha: 144,\n o: 'm 406 35 l 406 167 b 369 204 406 189 389 204 l 37 204 b 0 167 16 204 0 189 l 0 35 b 37 -3 0 14 16 -3 l 369 -3 b 406 35 389 -3 406 14 z',\n },\n restQuarter: {\n x_min: 1,\n x_max: 270,\n y_min: -375,\n y_max: 373,\n ha: 748,\n o: 'm 112 -55 b 174 -141 135 -84 156 -111 b 183 -161 177 -147 183 -158 b 181 -167 183 -163 183 -166 b 166 -174 179 -173 173 -174 b 143 -170 160 -174 148 -171 b 137 -170 141 -170 138 -170 l 125 -166 b 1 -304 50 -166 1 -233 b 168 -527 1 -376 63 -446 b 206 -540 180 -536 194 -540 b 228 -531 216 -540 226 -537 b 230 -521 229 -527 230 -524 b 207 -487 230 -508 219 -497 b 170 -435 189 -487 173 -448 b 164 -397 166 -423 164 -410 b 255 -292 164 -338 194 -292 b 369 -317 297 -292 344 -308 l 370 -318 b 382 -320 376 -320 379 -320 b 389 -314 386 -320 389 -318 b 336 -232 389 -297 351 -249 b 236 -32 281 -166 236 -112 b 236 -27 236 -30 236 -29 l 238 -17 b 238 -13 238 -16 238 -14 b 333 199 243 71 295 140 b 338 220 337 206 338 213 b 333 248 338 235 333 248 b 95 526 333 248 120 501 b 69 537 88 533 78 537 b 40 507 55 537 40 527 b 46 484 40 500 42 492 b 134 291 52 468 134 395 b 48 108 134 238 112 176 b 27 66 33 94 27 78 b 42 32 27 46 42 32 z',\n },\n rest8th: {\n x_min: 0,\n x_max: 247,\n y_min: -251,\n y_max: 174,\n ha: 425,\n o: 'm 193 154 b 96 251 193 207 150 251 b 0 154 43 251 0 207 b 39 81 0 124 17 98 b 117 56 62 65 89 56 b 173 66 137 56 157 60 b 225 88 193 72 206 78 b 232 89 228 89 230 89 b 239 76 238 89 239 84 b 238 60 239 72 239 66 b 104 -343 233 39 130 -248 b 145 -361 104 -360 137 -361 b 196 -347 161 -361 181 -359 b 341 161 200 -344 341 161 b 356 217 347 187 354 210 b 338 240 356 232 341 239 b 323 235 336 240 331 240 b 193 140 312 226 240 140 z',\n },\n rest16th: {\n x_min: 0,\n x_max: 320,\n y_min: -500,\n y_max: 179,\n ha: 679,\n o: 'm 300 160 b 202 258 300 215 256 258 b 104 160 148 258 104 215 b 219 62 104 101 164 62 b 331 94 258 62 298 75 b 341 96 336 95 338 96 b 348 86 346 96 348 94 b 265 -173 348 63 275 -151 b 194 -217 253 -200 215 -217 b 196 -203 196 -212 196 -207 b 98 -105 196 -148 151 -105 b 0 -203 43 -105 0 -148 b 115 -301 0 -262 60 -301 b 223 -271 153 -301 190 -288 b 229 -279 226 -271 229 -274 l 228 -281 b 228 -282 228 -282 228 -282 l 91 -690 b 91 -691 91 -690 91 -691 l 89 -693 b 134 -720 89 -706 102 -720 b 189 -687 176 -720 183 -703 l 356 -138 b 420 81 393 -16 420 81 b 459 226 420 81 456 207 b 461 232 459 229 461 230 b 446 248 461 240 449 246 b 431 242 439 248 435 245 b 300 145 420 233 348 147 z',\n },\n rest32nd: {\n x_min: 0,\n x_max: 363,\n y_min: -500,\n y_max: 426,\n ha: 926,\n o: 'm 508 603 b 492 598 501 603 497 600 b 361 503 482 590 410 503 l 361 516 b 264 613 361 570 318 613 b 166 516 210 613 166 570 b 206 444 166 487 183 461 b 246 423 217 433 232 428 b 284 418 258 420 269 418 b 393 449 321 418 360 432 b 399 451 395 451 397 451 b 415 426 409 451 415 436 l 413 423 b 413 422 413 423 413 422 l 357 192 b 279 140 350 168 302 140 b 281 153 281 144 281 148 b 183 251 281 207 236 251 b 85 153 128 251 85 207 b 125 81 85 124 102 98 b 164 60 137 71 150 65 b 203 55 176 58 189 55 b 311 86 240 55 278 69 b 315 88 312 88 314 88 b 325 69 323 88 325 76 l 268 -167 b 194 -217 261 -197 216 -216 b 196 -203 196 -212 196 -207 b 98 -105 196 -148 153 -105 b 0 -203 45 -105 0 -148 b 115 -301 0 -262 60 -301 b 228 -269 154 -301 194 -288 b 232 -268 229 -268 230 -268 b 240 -276 236 -268 240 -272 b 138 -688 240 -282 141 -678 b 137 -697 137 -691 137 -694 b 176 -720 137 -708 145 -720 b 232 -690 222 -720 226 -706 b 484 436 236 -672 484 436 b 521 582 484 436 518 564 b 523 588 521 585 523 586 b 508 603 523 600 511 603 z',\n },\n rest64th: {\n x_min: 0,\n x_max: 423,\n y_min: -753,\n y_max: 430,\n ha: 1183,\n o: 'm 596 609 b 580 603 589 609 585 606 b 448 507 569 595 497 507 b 449 521 449 511 449 516 b 351 619 449 575 405 619 b 253 521 297 619 253 575 b 372 422 253 461 317 422 b 481 454 410 422 446 438 b 491 456 484 455 488 456 b 504 441 498 456 504 451 b 501 426 504 436 503 432 b 445 202 500 422 451 217 b 359 144 435 174 383 144 l 359 158 b 261 256 359 212 315 256 b 163 158 207 256 163 212 b 243 65 163 112 202 78 b 279 60 255 62 266 60 b 397 91 320 60 360 73 b 403 92 400 92 402 92 b 412 79 409 92 412 86 b 410 72 412 76 412 75 b 351 -161 408 59 356 -150 b 281 -212 340 -199 301 -212 l 281 -197 b 183 -99 281 -144 238 -99 b 85 -197 130 -99 85 -144 b 125 -271 85 -228 102 -253 b 166 -291 138 -279 151 -287 b 204 -297 177 -294 192 -297 b 262 -287 225 -297 245 -292 b 305 -265 282 -279 287 -274 b 310 -264 307 -264 308 -264 b 318 -284 317 -264 318 -275 b 317 -295 318 -288 317 -294 b 259 -524 315 -302 265 -508 b 194 -567 251 -554 213 -567 b 196 -554 196 -563 196 -559 b 98 -456 196 -500 153 -456 b 0 -554 45 -456 0 -500 b 40 -626 0 -583 17 -609 b 118 -652 60 -644 92 -652 b 210 -629 145 -652 186 -642 b 216 -628 213 -628 215 -628 b 228 -647 226 -628 228 -639 l 226 -651 b 226 -652 226 -651 226 -652 l 122 -1054 b 121 -1064 121 -1058 121 -1061 b 167 -1084 121 -1077 134 -1084 b 215 -1060 202 -1084 209 -1076 b 402 -278 217 -1047 229 -1021 b 436 -135 403 -278 431 -161 l 570 441 b 609 588 570 441 605 569 b 596 609 609 603 602 608 z',\n },\n rest128th: {\n x_min: 0,\n x_max: 485,\n y_min: -750,\n y_max: 689,\n ha: 1439,\n o: 'm 537 894 b 439 992 537 949 494 992 b 341 894 386 992 341 949 b 382 822 341 865 359 840 b 459 796 402 805 433 796 b 518 806 480 796 501 801 l 520 808 b 569 828 539 814 552 819 b 580 831 572 829 577 831 b 598 812 589 831 598 825 b 596 801 598 809 598 805 b 540 575 590 773 546 595 b 448 510 534 553 475 510 l 448 524 b 350 622 448 577 405 622 b 252 524 297 622 252 577 b 292 451 252 494 269 468 b 369 426 318 433 337 426 b 429 435 389 426 412 429 b 494 464 449 442 475 455 b 498 465 495 465 497 465 b 505 446 504 465 505 456 b 503 426 505 439 504 432 l 446 202 b 366 144 439 173 389 144 l 366 158 b 268 256 366 212 323 256 b 170 158 215 256 170 212 b 289 59 170 98 235 59 b 347 69 310 59 330 63 b 397 91 367 76 379 82 b 406 94 400 92 403 94 b 415 79 412 94 415 88 b 412 63 415 75 413 69 b 357 -157 408 42 364 -134 b 281 -212 346 -196 302 -212 b 282 -197 281 -207 282 -203 b 184 -99 282 -144 238 -99 b 86 -197 130 -99 86 -144 b 204 -297 86 -258 150 -297 b 262 -287 225 -297 245 -292 b 312 -265 282 -279 294 -274 b 318 -264 314 -264 317 -264 b 327 -275 324 -264 327 -269 b 266 -517 324 -287 278 -490 b 200 -569 248 -566 220 -567 l 196 -554 b 98 -456 196 -500 153 -456 b 0 -554 45 -456 0 -500 b 118 -652 0 -615 63 -652 b 177 -642 138 -652 160 -648 l 179 -641 b 229 -621 197 -635 210 -629 l 230 -619 b 239 -626 236 -619 239 -622 b 238 -632 239 -628 239 -631 b 131 -1057 235 -642 134 -1050 b 173 -1080 131 -1071 140 -1080 b 230 -1057 219 -1080 225 -1074 l 658 815 b 697 960 658 815 694 942 b 698 966 697 963 698 965 b 684 982 698 975 687 981 b 668 976 677 982 672 979 b 537 880 658 969 586 881 z',\n },\n dynamicPiano: {\n x_min: -89,\n x_max: 366,\n y_min: -142,\n y_max: 274,\n ha: 416,\n o: 'm 395 395 b 292 357 350 395 318 380 b 262 328 272 340 268 328 b 246 363 255 328 259 338 b 177 393 236 380 215 393 b 1 251 92 393 46 333 b -9 223 -6 238 -9 230 b 7 207 -9 213 -1 207 b 30 229 17 207 23 216 b 127 338 72 301 101 338 b 143 321 138 338 143 331 b 134 285 143 310 138 295 l -43 -154 b -65 -168 -48 -166 -50 -168 l -109 -168 b -128 -187 -122 -168 -128 -174 b -111 -204 -128 -199 -122 -204 l 167 -204 b 186 -186 180 -204 186 -199 b 168 -168 186 -174 180 -168 l 111 -168 b 98 -164 102 -168 98 -168 b 101 -154 98 -163 99 -158 l 166 7 b 179 24 168 14 171 24 b 213 -1 186 24 190 10 b 276 -14 233 -12 252 -14 b 527 266 415 -14 527 130 b 395 395 527 350 475 395 z m 356 341 b 389 288 380 341 389 320 b 243 35 389 217 312 35 b 207 81 219 35 207 50 b 235 180 207 111 219 140 l 264 251 b 356 341 284 300 321 341 z',\n },\n dynamicMezzo: {\n x_min: -20,\n x_max: 446,\n y_min: -10,\n y_max: 274,\n ha: 284,\n o: 'm 528 395 b 431 350 487 395 454 374 b 409 330 416 336 415 330 b 397 360 402 330 406 341 b 334 395 389 379 370 395 b 236 350 292 395 259 374 b 215 330 222 336 220 330 b 203 360 207 330 212 340 b 147 393 194 379 174 393 b -19 251 71 393 26 331 b -29 223 -26 238 -29 230 b -13 207 -29 213 -22 207 b 9 226 -3 207 1 215 b 107 338 52 300 81 338 b 122 321 118 338 122 331 b 114 285 122 310 118 295 l 9 24 b 4 9 6 17 4 13 b 20 0 4 3 9 0 l 91 0 b 114 17 104 0 108 3 l 207 251 b 287 323 225 292 255 323 b 308 302 304 323 308 314 b 294 249 308 285 302 269 b 203 24 294 248 292 248 b 199 9 200 17 199 13 b 215 0 199 3 203 0 l 285 0 b 308 17 298 0 302 3 l 402 251 b 481 323 419 292 449 323 b 503 302 498 323 503 314 b 413 43 503 252 413 104 b 478 -14 413 6 436 -14 b 629 102 533 -14 583 26 b 642 132 638 117 642 125 b 629 145 642 141 636 145 b 608 127 619 145 615 138 b 534 49 580 84 553 49 b 523 62 526 49 523 53 b 606 317 523 112 606 238 b 528 395 606 353 588 395 z',\n },\n dynamicForte: {\n x_min: -141,\n x_max: 364,\n y_min: -152,\n y_max: 444,\n ha: 596,\n o: 'm 23 380 b 0 357 7 380 0 373 b 22 336 0 343 7 336 l 105 336 b 117 330 114 336 117 336 b 114 315 117 327 115 323 l 23 0 b -101 -187 -17 -141 -43 -187 b -127 -174 -120 -187 -127 -181 b -92 -156 -127 -163 -114 -170 b -63 -102 -75 -144 -63 -125 b -128 -43 -63 -65 -89 -43 b -203 -122 -171 -43 -203 -78 b -95 -219 -203 -186 -156 -219 b 161 17 14 -219 82 -145 b 269 317 203 105 235 194 l 271 318 b 289 336 271 323 282 336 l 383 336 b 406 359 399 336 406 343 b 384 380 406 373 399 380 l 298 380 b 284 387 288 380 284 380 b 287 405 284 392 285 396 b 419 606 315 530 347 606 b 442 595 431 606 442 603 b 419 580 442 586 435 588 b 389 526 400 572 389 552 b 454 465 389 485 418 465 b 524 543 491 465 524 490 b 400 639 524 596 491 639 b 135 402 261 639 183 540 b 107 380 128 380 127 380 z',\n },\n dynamicRinforzando: {\n x_min: -20,\n x_max: 277,\n y_min: 0,\n y_max: 274,\n ha: 274,\n o: 'm 324 395 b 235 350 287 395 256 374 b 215 330 222 336 220 330 b 203 360 207 330 213 337 b 145 393 194 379 174 393 b -19 251 75 393 27 337 b -29 223 -26 238 -29 230 b -13 207 -29 213 -22 207 b 9 226 -3 207 3 215 b 107 338 52 301 81 338 b 122 321 118 338 122 331 b 114 285 122 310 118 295 l 9 24 b 4 9 6 17 4 13 b 20 0 4 3 9 0 l 91 0 b 114 17 104 0 108 3 l 207 251 b 304 351 226 298 272 351 b 318 343 312 351 318 348 b 287 285 318 330 287 325 b 338 239 287 256 308 239 b 399 318 373 239 399 268 b 324 395 399 360 377 395 z',\n },\n dynamicSforzando: {\n x_min: 0,\n x_max: 229,\n y_min: -10,\n y_max: 273,\n ha: 283,\n o: 'm 212 393 b 68 274 127 393 68 350 b 145 161 68 223 95 196 b 200 85 187 132 200 114 b 127 20 200 53 173 20 b 66 42 91 20 66 32 b 91 56 66 49 75 46 b 111 98 104 65 111 79 b 59 145 111 127 86 145 b 0 78 24 145 0 117 b 125 -14 0 30 49 -14 b 291 120 219 -14 291 36 b 220 232 291 160 276 190 b 151 314 168 271 151 287 b 213 361 151 337 168 361 b 258 346 238 361 258 356 b 240 333 258 340 251 340 b 226 298 232 325 226 314 b 276 252 226 269 248 252 b 330 307 311 252 330 279 b 212 393 330 360 285 393 z',\n },\n dynamicZ: {\n x_min: -30,\n x_max: 244,\n y_min: -10,\n y_max: 268,\n ha: 278,\n o: 'm 333 386 b 298 377 321 386 314 382 b 239 370 282 373 259 370 b 94 383 153 370 111 383 b 68 364 79 383 72 377 l 33 264 b 29 242 30 255 29 248 b 45 228 29 232 36 228 b 66 249 55 228 60 236 l 81 279 b 96 297 85 288 88 297 b 168 292 102 297 127 292 b 223 302 194 292 215 302 b 196 269 229 302 197 271 l -26 45 b -43 16 -37 33 -43 27 b -24 -1 -43 6 -36 -1 b 4 16 -12 -1 -3 10 b 39 30 16 24 27 30 b 179 -14 79 30 108 -14 b 297 102 259 -14 297 43 b 245 166 297 147 271 166 b 197 115 219 166 197 145 b 236 72 197 88 216 72 b 259 79 251 72 255 79 b 264 75 262 79 264 78 b 258 60 264 72 261 66 b 229 45 252 50 242 45 b 117 95 186 45 173 95 b 85 86 98 95 89 86 b 102 111 85 86 95 104 l 333 338 b 351 370 344 350 351 359 b 333 386 351 380 343 386 z',\n },\n ornamentTrill: {\n x_min: 0,\n x_max: 521,\n y_min: -10,\n y_max: 390,\n ha: 400,\n o: 'm 383 562 b 364 557 377 562 369 559 l 294 534 b 269 511 281 530 275 526 l 217 384 b 206 367 212 370 210 367 b 179 380 200 367 192 374 b 118 393 158 389 140 393 b 0 292 50 393 0 353 b 95 210 0 248 30 210 b 140 213 112 210 131 213 b 144 209 143 213 144 212 b 140 194 144 206 143 202 l 124 156 b 96 58 108 117 96 88 b 179 -14 96 17 124 -14 b 325 153 253 -14 325 46 b 307 251 325 187 320 219 b 302 265 304 258 302 261 b 334 294 302 274 311 281 l 343 298 b 455 348 393 328 428 348 b 474 327 468 348 474 344 b 465 285 474 312 469 295 l 360 24 b 356 9 357 17 356 13 b 372 0 356 3 360 0 l 442 0 b 465 17 455 0 459 3 l 559 251 b 655 351 577 298 624 351 b 670 343 664 351 670 348 b 638 285 670 330 638 325 b 690 239 638 256 660 239 b 750 318 724 239 750 268 b 675 395 750 360 729 395 b 586 350 638 395 608 374 b 566 330 573 336 572 330 b 553 361 559 330 564 340 b 490 393 543 380 521 393 b 347 348 432 393 377 364 b 312 333 328 338 320 333 b 308 337 310 333 308 334 b 315 359 308 343 312 351 l 387 537 b 392 553 390 544 392 549 b 383 562 392 559 389 562 z m 118 360 b 192 325 134 360 192 347 b 186 307 192 321 189 314 l 180 292 b 148 265 173 274 167 269 b 98 258 130 261 112 258 b 39 301 50 258 39 281 b 118 360 39 327 60 360 z m 272 240 b 292 151 285 240 292 164 b 212 30 292 88 253 30 b 196 48 200 30 196 37 b 207 92 196 59 202 78 b 264 230 207 94 209 94 b 272 240 266 238 268 240 z',\n },\n ornamentTurn: {\n x_min: 0,\n x_max: 460,\n y_min: 0,\n y_max: 218,\n ha: 218,\n o: 'm 534 314 b 454 251 490 314 454 294 b 505 199 454 219 475 199 b 579 232 547 199 549 232 b 626 164 603 232 626 202 b 533 72 626 102 583 72 b 377 180 487 72 439 111 b 150 312 307 258 243 312 b 0 148 55 312 0 240 b 128 0 0 45 66 0 b 209 63 173 0 209 20 b 157 115 209 95 187 115 b 84 82 115 115 114 82 b 36 150 59 82 36 112 b 130 242 36 212 79 242 b 285 134 176 242 223 203 b 513 1 356 56 419 1 b 662 166 608 1 662 73 b 534 314 662 269 596 314 z',\n },\n ornamentTurnSlash: {\n x_min: 0,\n x_max: 460,\n y_min: -90,\n y_max: 306,\n ha: 396,\n o: 'm 333 441 b 310 418 315 441 310 433 l 310 274 b 302 252 310 258 308 252 b 261 278 294 252 287 262 b 150 311 228 298 192 311 b 0 147 55 311 0 239 b 128 -1 0 43 66 -1 b 209 62 173 -1 209 19 b 157 114 209 94 187 114 b 84 81 115 114 114 81 b 36 148 59 81 36 111 b 130 240 36 210 79 240 b 285 128 176 240 222 197 b 307 79 304 108 307 105 l 307 -107 b 330 -130 307 -122 312 -130 b 353 -107 347 -130 353 -122 l 353 37 b 360 59 353 53 353 59 b 402 33 369 59 376 49 b 513 0 435 13 471 0 b 662 164 608 0 662 72 b 534 312 662 268 596 312 b 454 249 490 312 454 292 b 505 197 454 217 475 197 b 579 230 547 197 549 230 b 626 163 603 230 626 200 b 533 71 626 101 583 71 b 377 183 487 71 441 114 b 356 232 359 203 356 206 l 356 418 b 333 441 356 433 350 441 z',\n },\n ornamentMordent: {\n x_min: 1,\n x_max: 729,\n y_min: -73,\n y_max: 319,\n ha: 392,\n o: 'm 546 265 l 546 459 l 501 459 l 501 216 l 459 167 b 439 167 454 160 445 160 b 302 327 387 228 310 317 b 258 353 291 338 282 351 b 226 340 245 353 238 348 l 20 107 b 1 73 12 98 1 84 b 30 59 1 65 9 59 b 88 94 53 59 73 79 b 144 143 107 109 124 127 b 176 161 158 154 168 161 b 197 144 183 161 189 156 l 323 10 b 351 0 328 3 340 0 b 377 9 361 0 372 3 b 498 114 392 17 475 94 l 498 -105 l 544 -105 l 544 153 b 562 160 550 157 556 160 b 585 144 569 160 576 156 b 710 10 590 135 697 24 b 737 0 716 3 727 0 b 765 9 749 0 759 3 b 1030 295 776 17 1011 274 l 1032 300 b 1050 328 1041 308 1050 318 b 1012 353 1050 343 1024 353 b 986 343 1002 353 994 348 b 854 190 971 330 871 206 b 828 176 842 180 835 176 b 802 190 818 176 809 183 b 681 333 791 202 696 320 b 645 353 668 344 657 353 b 613 340 634 353 626 350 b 580 304 600 330 590 315 z',\n },\n ornamentShortTrill: {\n x_min: 0,\n x_max: 725,\n y_min: 0,\n y_max: 245,\n ha: 245,\n o: 'm 429 167 l 301 325 b 256 353 291 338 282 350 b 225 340 246 353 238 350 b 16 105 158 268 88 186 b 0 72 9 96 0 86 b 29 58 0 63 7 58 b 71 76 42 58 55 62 l 158 154 b 174 160 163 158 168 160 b 197 143 181 160 187 154 b 321 10 203 135 310 24 b 350 0 327 3 338 0 b 377 7 361 0 372 3 l 533 148 b 554 160 543 158 550 160 b 577 143 562 160 566 156 b 703 10 585 135 690 24 b 732 0 708 3 720 0 b 759 7 743 0 753 3 b 1024 294 769 16 1005 272 b 1044 327 1032 305 1044 321 b 1005 353 1044 341 1018 353 b 979 343 996 353 988 348 b 848 189 963 330 864 204 b 821 174 837 179 828 174 b 796 189 811 174 804 181 b 674 331 783 202 688 318 b 641 351 662 343 651 351 b 606 340 628 351 619 350 b 573 304 593 328 583 315 b 444 167 533 259 491 213 b 429 167 439 161 433 161 z',\n },\n ornamentTremblement: {\n x_min: 1,\n x_max: 985,\n y_min: 0,\n y_max: 244,\n ha: 244,\n o: 'm 678 325 b 634 351 667 338 657 350 b 602 338 621 351 613 348 l 448 167 b 439 167 446 164 441 164 l 302 325 b 258 351 291 338 281 350 b 228 338 245 351 238 348 b 193 304 215 328 204 315 l 19 107 b 1 72 13 96 1 76 b 30 58 1 63 9 58 b 89 92 52 58 73 78 l 144 141 b 148 144 145 143 147 143 b 176 160 160 153 170 160 b 199 143 183 160 189 154 b 324 10 204 134 311 23 b 351 0 330 3 340 0 b 379 7 363 0 373 3 l 530 148 b 552 160 536 154 546 160 b 575 143 559 160 564 154 b 698 10 580 134 687 23 b 727 0 704 3 716 0 b 755 7 739 0 749 3 l 907 147 b 930 160 922 158 923 160 b 952 143 937 160 943 154 l 1077 10 b 1107 0 1084 3 1096 0 b 1133 7 1117 0 1128 3 b 1398 294 1143 16 1380 272 b 1418 327 1407 305 1418 321 b 1381 351 1418 343 1394 351 b 1354 341 1371 351 1362 348 b 1223 189 1338 328 1238 204 b 1195 174 1211 179 1202 174 b 1171 189 1185 174 1178 181 b 1048 331 1158 200 1063 318 b 1012 351 1035 343 1024 351 b 981 338 1002 351 994 350 b 948 304 968 328 958 315 b 827 166 907 258 865 212 b 815 166 824 163 818 163 b 678 325 760 226 732 264 z',\n },\n ornamentPrecompAppoggTrill: {\n x_min: 0,\n x_max: 1119,\n y_min: 0,\n y_max: 481,\n ha: 481,\n o: 'm 1015 163 b 873 328 963 223 880 318 b 828 354 860 344 847 353 b 796 341 816 354 809 351 b 763 305 783 331 773 317 b 642 168 721 261 681 215 b 636 163 641 167 639 164 b 494 328 585 223 501 318 b 449 354 481 344 468 353 b 418 341 438 354 431 351 b 384 305 405 331 395 317 b 264 168 343 261 302 215 l 242 144 b 144 88 232 124 171 88 b 79 197 81 88 79 189 l 79 648 b 60 693 79 683 71 693 b 52 691 58 693 55 693 b 0 616 3 672 0 625 l 0 207 b 121 0 0 40 68 0 b 249 68 168 0 232 53 b 279 94 262 75 271 86 b 336 144 298 111 315 128 b 367 163 350 156 360 163 b 389 145 374 163 380 157 b 514 12 395 137 501 26 b 543 1 520 4 531 1 b 569 9 553 1 563 4 b 636 73 576 14 605 43 l 658 94 b 714 144 677 111 694 128 b 746 163 729 156 739 163 b 768 145 753 163 759 157 b 893 12 773 137 880 26 b 922 1 899 4 910 1 b 948 9 932 1 942 4 l 1012 71 b 1037 94 1022 78 1030 86 b 1092 144 1054 111 1073 128 b 1123 161 1106 156 1115 161 b 1146 145 1130 161 1136 157 b 1270 12 1152 137 1259 26 b 1299 1 1276 4 1287 1 b 1326 9 1310 1 1320 4 b 1591 297 1336 19 1572 275 b 1611 328 1600 307 1611 320 b 1574 354 1611 343 1585 354 b 1548 344 1565 354 1555 350 b 1416 192 1532 331 1431 206 b 1388 177 1404 181 1395 177 b 1365 190 1380 177 1371 184 b 1243 333 1352 203 1256 321 b 1205 354 1228 346 1217 354 b 1174 341 1195 354 1187 351 b 1140 305 1161 330 1152 317 z',\n },\n ornamentPrecompSlideTrillDAnglebert: {\n x_min: 2,\n x_max: 1150,\n y_min: -367,\n y_max: 245,\n ha: 612,\n o: 'm 1058 160 b 916 327 1007 220 923 317 b 871 353 903 343 890 351 b 840 340 860 353 852 350 b 806 304 827 330 816 315 b 685 167 765 259 724 213 l 680 160 l 615 235 b 419 344 582 275 523 344 b 3 -144 258 344 3 26 b 4 -168 3 -153 3 -160 b 246 -482 24 -315 99 -422 b 458 -528 340 -521 410 -528 b 514 -526 485 -528 504 -526 b 552 -508 531 -526 552 -517 b 514 -497 552 -503 541 -498 l 503 -497 b 194 -390 432 -494 298 -488 b 69 -151 194 -390 69 -279 b 184 96 69 -60 128 27 b 328 183 202 118 258 183 b 477 96 413 183 454 118 b 559 10 510 62 552 19 b 588 0 566 3 576 0 b 613 7 598 0 609 3 b 723 112 622 14 681 73 b 789 161 733 122 776 161 b 811 144 796 161 802 156 b 936 10 816 135 923 24 b 965 0 942 3 953 0 b 991 7 975 0 985 3 b 1051 66 996 12 1022 37 b 1081 92 1063 73 1073 84 b 1136 143 1099 109 1117 127 b 1168 160 1151 154 1159 160 b 1191 144 1175 160 1181 156 b 1315 10 1197 135 1303 24 b 1344 0 1320 3 1332 0 b 1371 7 1355 0 1365 3 b 1636 295 1381 17 1617 274 b 1656 327 1644 305 1656 318 b 1619 353 1656 341 1630 353 b 1593 343 1610 353 1600 348 b 1460 190 1577 330 1476 204 b 1433 176 1449 180 1440 176 b 1410 189 1424 176 1416 183 b 1287 331 1397 202 1300 320 b 1250 353 1273 344 1261 353 b 1218 340 1240 353 1231 350 b 1185 304 1205 328 1197 315 z',\n },\n ornamentPrecompSlideTrillBach: {\n x_min: 0,\n x_max: 1048,\n y_min: -367,\n y_max: 331,\n ha: 698,\n o: 'm 1038 477 l 979 477 l 979 238 l 912 160 b 769 327 858 220 775 317 b 724 353 756 343 743 351 b 693 340 713 353 706 350 b 660 304 680 330 670 315 b 539 167 618 259 577 213 b 533 161 536 166 534 163 b 390 327 480 220 396 317 b 346 353 377 343 364 351 l 340 353 b 308 340 330 353 321 350 b 275 304 295 330 285 315 b 117 122 220 243 168 186 b 0 -144 68 62 0 -48 b 1 -168 0 -153 0 -160 b 243 -482 22 -315 96 -422 b 455 -528 337 -521 408 -528 b 511 -526 482 -528 501 -526 b 549 -508 528 -526 549 -517 b 511 -497 549 -503 539 -498 l 500 -497 b 192 -390 429 -494 295 -488 b 68 -177 192 -390 84 -298 b 66 -151 66 -168 66 -160 b 189 105 66 -58 127 35 b 232 143 203 118 216 131 b 264 161 246 154 256 161 b 285 144 271 161 276 156 b 410 10 291 135 397 24 b 439 0 416 3 428 0 b 465 7 449 0 459 3 l 531 72 b 554 92 540 78 547 86 b 611 143 573 109 590 127 b 642 161 625 154 635 161 b 664 144 649 161 655 156 b 789 10 670 135 776 24 b 818 0 795 3 806 0 b 844 7 828 0 838 3 b 904 66 850 12 876 37 b 935 92 916 73 924 84 b 979 134 949 107 963 121 l 979 -88 l 1037 -88 l 1037 151 l 1044 144 b 1168 10 1050 135 1156 24 b 1197 0 1174 3 1185 0 b 1224 7 1208 0 1218 3 b 1489 295 1234 17 1470 274 b 1509 327 1498 305 1509 318 b 1472 353 1509 341 1483 353 b 1446 343 1463 353 1453 348 b 1313 190 1430 330 1329 204 b 1286 176 1302 180 1293 176 b 1263 189 1277 176 1269 183 b 1140 331 1250 202 1153 320 b 1103 353 1126 344 1115 353 b 1071 340 1093 353 1084 350 b 1038 304 1058 328 1050 315 z',\n },\n ornamentPrecompTrillSuffixDandrieu: {\n x_min: 0,\n x_max: 949,\n y_min: 0,\n y_max: 381,\n ha: 381,\n o: 'm 1367 314 b 1250 521 1367 419 1318 482 b 1107 549 1211 537 1145 549 b 1083 546 1096 549 1087 549 b 1066 528 1071 540 1066 534 b 1079 520 1066 524 1070 520 b 1323 351 1187 517 1323 487 b 1201 171 1323 269 1260 219 b 1194 166 1201 171 1198 168 b 1056 327 1142 226 1063 317 b 1011 353 1043 343 1030 351 b 979 340 999 353 992 350 b 946 304 966 330 956 315 b 825 167 904 259 864 213 l 821 161 b 678 327 768 222 685 317 b 634 353 665 343 652 351 b 602 340 622 353 615 350 b 569 304 589 330 579 315 b 448 167 527 259 487 213 l 444 161 b 301 327 390 222 308 317 b 256 353 288 343 275 351 b 225 340 245 353 238 350 b 192 304 212 330 202 315 b 71 167 150 259 109 213 b 17 105 52 147 36 127 b 0 73 10 98 0 84 b 29 58 0 65 7 58 b 86 92 56 59 72 79 b 143 143 105 109 122 127 b 174 161 157 154 167 161 b 196 144 181 161 187 156 b 321 10 202 135 308 24 b 350 0 327 3 338 0 b 376 7 360 0 370 3 b 485 112 384 14 444 73 b 552 161 495 122 539 161 b 573 144 559 161 564 156 b 698 10 579 135 685 24 b 727 0 704 3 716 0 b 753 7 737 0 747 3 b 863 112 762 14 821 73 b 929 161 873 122 916 161 b 950 144 936 161 942 156 b 1076 10 956 135 1063 24 b 1104 0 1081 3 1093 0 b 1130 7 1115 0 1125 3 b 1236 108 1139 14 1195 69 b 1367 314 1297 160 1367 233 z',\n },\n ornamentPrecompDoubleCadenceUpperPrefix: {\n x_min: 0,\n x_max: 1278,\n y_min: 0,\n y_max: 247,\n ha: 247,\n o: 'm 1801 356 b 1776 346 1793 356 1783 351 b 1642 192 1760 333 1659 206 b 1614 177 1630 181 1621 177 b 1591 190 1606 177 1597 184 b 1469 334 1578 203 1482 323 b 1430 356 1453 347 1441 356 b 1398 343 1420 356 1411 353 b 1365 307 1385 331 1377 318 l 1240 164 b 1097 330 1187 226 1104 320 b 1053 356 1084 346 1071 354 b 1021 343 1041 356 1034 353 b 988 307 1008 333 998 318 b 865 168 946 262 904 216 l 861 163 b 717 330 808 223 724 320 b 672 356 704 346 691 354 b 641 343 661 356 654 353 b 608 307 628 333 618 318 b 485 168 566 262 524 216 l 455 134 b 284 46 409 88 351 46 b 16 285 148 46 32 265 b 3 295 9 292 4 295 b 0 291 1 295 0 292 b 1 285 0 288 1 285 b 308 0 42 190 157 0 b 530 120 415 1 482 63 b 559 144 539 128 549 137 b 590 163 573 156 583 163 b 612 145 598 163 603 157 b 739 10 618 137 724 24 b 768 0 744 3 756 0 b 793 7 778 0 788 3 b 903 114 802 14 861 75 l 939 144 b 971 163 953 156 963 163 b 992 145 978 163 984 157 b 1119 10 998 137 1106 24 b 1148 0 1125 3 1136 0 b 1174 7 1158 0 1168 3 b 1284 114 1182 14 1241 75 b 1316 144 1282 115 1312 141 b 1348 161 1331 156 1339 161 b 1371 145 1355 161 1361 157 b 1496 10 1377 137 1485 24 b 1525 0 1502 3 1513 0 b 1552 7 1536 0 1547 3 b 1819 298 1562 17 1800 276 b 1840 330 1829 308 1840 320 b 1832 344 1840 334 1837 340 b 1801 356 1820 351 1810 356 z',\n },\n ornamentPrecompDoubleCadenceUpperPrefixTurn: {\n x_min: 0,\n x_max: 1277,\n y_min: -62,\n y_max: 333,\n ha: 395,\n o: 'm 1273 202 l 1273 480 l 1230 480 l 1230 174 l 1097 328 b 1053 354 1084 344 1071 353 b 1021 341 1041 354 1034 351 b 988 305 1008 331 998 317 b 865 167 945 261 904 215 l 861 161 b 717 328 808 222 724 318 b 672 354 704 344 691 353 b 641 341 661 354 654 351 b 608 305 628 331 618 317 b 485 167 564 261 524 215 b 455 132 474 156 465 144 b 284 45 410 88 350 45 b 14 284 148 45 30 264 b 3 294 9 291 4 294 b 0 289 1 294 0 291 b 1 284 0 287 1 284 b 308 -1 42 189 157 -1 b 530 118 415 0 481 62 b 557 143 539 127 547 135 b 590 161 572 154 582 161 b 612 144 598 161 603 156 b 737 9 618 135 724 24 b 768 -1 743 1 755 -1 b 793 6 778 -1 788 1 b 903 112 802 13 861 73 l 937 143 b 971 161 953 154 963 161 b 992 144 978 161 984 156 b 1117 9 998 135 1104 24 b 1148 -1 1123 1 1136 -1 b 1174 6 1158 -1 1168 1 l 1230 60 l 1230 -89 l 1273 -89 l 1273 102 l 1283 112 b 1348 160 1295 125 1332 160 b 1371 144 1355 160 1361 156 b 1496 9 1377 135 1483 24 b 1525 -1 1502 1 1513 -1 b 1552 6 1536 -1 1547 1 b 1819 297 1562 16 1800 275 b 1839 328 1827 307 1839 320 b 1801 354 1839 343 1813 354 b 1776 344 1793 354 1783 350 b 1642 190 1760 331 1657 206 b 1614 176 1630 180 1621 176 b 1591 189 1606 176 1597 183 b 1467 333 1578 203 1480 321 b 1430 354 1453 346 1441 354 b 1398 341 1420 354 1411 351 b 1365 305 1385 330 1377 317 z',\n },\n ornamentPrecompTrillLowerSuffix: {\n x_min: 0,\n x_max: 859,\n y_min: -222,\n y_max: 246,\n ha: 468,\n o: 'm 1164 217 b 1031 351 1138 259 1063 351 b 1011 337 1020 351 1024 347 b 828 167 952 291 886 217 l 824 164 b 683 328 772 225 690 318 b 638 354 670 344 657 353 b 606 341 626 354 619 351 b 573 305 593 331 583 317 b 451 167 530 261 490 215 l 446 161 b 302 328 393 222 310 318 b 258 354 289 344 276 353 b 226 341 246 354 239 351 b 193 305 213 331 203 317 b 71 167 150 261 109 215 b 17 105 52 147 36 127 b 0 73 10 98 0 84 b 29 58 0 65 7 58 b 86 92 56 59 72 79 b 143 143 105 109 122 127 b 176 161 157 154 168 161 b 197 144 183 161 189 156 b 323 9 203 135 310 23 b 353 -1 328 1 340 -1 b 379 6 363 -1 373 1 b 488 112 387 13 446 73 l 523 143 b 556 161 539 154 549 161 b 577 144 563 161 569 156 b 703 9 583 135 690 23 b 733 -1 708 1 721 -1 b 759 6 743 -1 753 1 b 868 112 768 13 827 73 b 955 183 878 122 943 183 b 1081 107 965 183 1031 153 b 1156 -89 1128 63 1156 6 l 1156 -102 b 948 -297 1156 -204 1048 -297 b 806 -271 904 -297 850 -282 l 792 -266 b 801 -288 792 -268 795 -282 b 948 -320 809 -297 880 -320 b 1237 -50 1092 -320 1237 -199 b 1164 217 1237 75 1218 122 z',\n },\n brassScoop: {\n x_min: 1,\n x_max: 320,\n y_min: -373,\n y_max: 13,\n ha: 386,\n o: 'm 35 -537 b 461 -12 194 -518 461 -289 b 438 19 461 13 451 19 b 410 -9 425 19 413 9 b 35 -425 357 -366 92 -403 b 1 -482 13 -433 1 -438 l 1 -505 b 26 -537 1 -526 3 -537 z',\n },\n brassDoitMedium: {\n x_min: 0,\n x_max: 489,\n y_min: -40,\n y_max: 346,\n ha: 386,\n o: 'm 33 -58 b 704 468 255 -58 683 186 b 681 498 704 494 693 498 b 654 471 668 498 658 488 b 33 55 550 118 91 76 b 0 -3 12 46 0 42 l 0 -26 b 24 -58 0 -46 1 -58 z',\n },\n brassFallLipShort: {\n x_min: 1,\n x_max: 293,\n y_min: -345,\n y_max: 42,\n ha: 387,\n o: 'm 22 60 b 1 35 4 60 1 52 l 1 6 b 26 -50 3 -40 10 -43 b 32 -52 27 -50 30 -50 b 376 -469 85 -73 327 -111 b 400 -497 379 -487 387 -497 b 422 -467 412 -497 422 -491 b 32 60 422 -187 177 40 z',\n },\n brassLiftMedium: {\n x_min: 0,\n x_max: 811,\n y_min: 0,\n y_max: 852,\n ha: 852,\n o: 'm 1138 1220 b 1135 1225 1135 1223 1135 1224 b 1129 1227 1133 1227 1130 1227 b 1117 1207 1122 1227 1117 1212 l 1117 1201 b 1109 1164 1117 1187 1117 1172 b 1100 1156 1107 1161 1104 1158 b 959 1104 1058 1128 995 1140 b 929 1032 936 1081 929 1056 b 932 1007 929 1024 930 1015 b 923 976 932 995 930 985 l 914 971 b 773 919 873 942 809 955 b 743 847 750 896 743 870 b 746 821 743 838 744 829 b 737 791 746 809 744 799 l 729 783 b 588 733 687 756 624 769 b 557 661 564 710 557 684 b 560 635 557 652 559 644 b 552 605 560 624 559 612 l 543 598 b 402 547 501 570 438 583 b 372 475 379 524 372 498 b 374 449 372 467 373 458 b 366 419 374 438 373 426 l 357 412 b 216 361 315 384 252 397 b 186 289 193 338 186 312 b 189 264 186 281 187 272 b 180 233 189 252 187 240 b 171 226 177 232 174 229 b 30 176 130 199 66 212 b 0 104 7 153 0 128 b 33 0 0 88 14 0 b 49 17 40 0 49 10 b 71 63 52 35 56 49 b 212 115 102 95 154 59 b 239 186 230 134 239 160 b 236 210 239 194 238 202 b 256 249 239 225 243 236 b 397 301 288 281 340 245 b 425 372 416 320 425 346 b 422 396 425 380 423 387 b 442 435 425 410 429 422 b 583 487 474 467 526 431 b 611 557 602 505 611 531 b 608 582 611 566 609 573 b 628 621 611 596 615 608 b 769 672 660 652 711 618 b 796 743 788 691 796 717 b 793 768 796 752 795 759 b 814 806 796 782 801 793 b 955 858 845 838 897 804 b 982 929 973 877 982 903 b 979 953 982 937 981 945 b 999 992 982 968 986 979 b 1140 1045 1031 1024 1083 989 b 1168 1116 1161 1066 1168 1090 b 1138 1220 1168 1162 1145 1207 z',\n },\n brassFallRoughMedium: {\n x_min: 0,\n x_max: 811,\n y_min: 0,\n y_max: 852,\n ha: 852,\n o: 'm 30 1220 b 0 1116 23 1207 0 1162 b 27 1045 0 1090 7 1066 b 168 992 85 989 137 1024 b 189 953 181 979 186 968 b 186 929 187 945 186 937 b 213 858 186 903 194 877 b 354 806 271 804 323 838 b 374 768 367 793 372 782 b 372 743 373 759 372 752 b 399 672 372 717 380 691 b 540 621 456 618 508 652 b 560 582 553 608 557 596 b 557 557 559 573 557 566 b 585 487 557 531 566 505 b 726 435 642 431 694 467 b 746 396 739 422 743 410 b 743 372 744 387 743 380 b 770 301 743 346 752 320 b 912 249 828 245 880 281 b 932 210 924 236 929 225 b 929 186 930 202 929 194 b 956 115 929 160 937 134 b 1097 63 1014 59 1066 95 b 1119 17 1112 49 1116 35 b 1135 0 1119 10 1128 0 b 1168 104 1153 0 1168 91 b 1138 176 1168 128 1161 153 b 996 226 1102 212 1038 199 b 988 233 994 229 991 232 b 979 264 981 240 979 252 b 982 289 981 272 982 281 b 952 361 982 312 975 338 b 811 412 916 397 852 384 l 802 419 b 793 449 795 426 793 438 b 796 475 795 458 796 467 b 766 547 796 498 789 524 b 625 598 730 583 667 570 l 616 605 b 608 635 609 612 608 624 b 611 661 609 644 611 652 b 580 733 611 684 603 710 b 439 783 544 769 481 756 l 431 791 b 422 821 423 799 422 809 b 425 847 423 829 425 838 b 395 919 425 870 418 896 b 253 971 359 955 295 942 l 245 976 b 236 1007 238 985 236 995 b 239 1032 238 1015 239 1024 b 209 1104 239 1056 232 1081 b 68 1156 173 1140 109 1128 b 59 1164 63 1158 60 1161 b 50 1201 50 1172 50 1187 l 50 1207 b 39 1227 50 1212 46 1227 b 33 1225 37 1227 35 1227 b 30 1220 33 1224 33 1223 z',\n },\n brassBend: {\n x_min: 0,\n x_max: 392,\n y_min: 0,\n y_max: 282,\n ha: 282,\n o: 'm 282 0 b 552 72 369 0 456 23 b 564 92 560 75 564 84 l 564 383 b 541 406 564 395 554 406 b 518 383 528 406 518 395 l 518 107 b 282 46 435 65 357 46 b 46 107 207 46 130 65 l 46 383 b 23 406 46 395 36 406 b 0 383 10 406 0 395 l 0 92 b 13 72 0 84 4 75 b 282 0 108 23 196 0 z',\n },\n brassMuteClosed: {\n x_min: 0,\n x_max: 272,\n y_min: 0,\n y_max: 272,\n ha: 272,\n o: 'm 392 219 l 219 219 l 219 392 l 173 392 l 173 219 l 0 219 l 0 173 l 173 173 l 173 0 l 219 0 l 219 173 l 392 173 z',\n },\n brassMuteOpen: {\n x_min: 0,\n x_max: 304,\n y_min: 0,\n y_max: 304,\n ha: 304,\n o: 'm 219 0 b 438 219 340 0 438 98 b 219 438 438 340 340 438 b 0 219 98 438 0 340 b 219 0 0 98 98 0 z m 219 392 b 392 219 314 392 392 314 b 219 46 392 124 314 46 b 46 219 124 46 46 124 b 219 392 46 314 124 392 z',\n },\n brassFlip: {\n x_min: 0,\n x_max: 379,\n y_min: 0,\n y_max: 282,\n ha: 282,\n o: 'm 523 0 b 541 9 530 0 536 3 b 546 22 544 13 546 17 b 536 42 546 29 541 36 l 36 402 b 23 406 33 405 27 406 b 0 383 12 406 0 395 l 0 23 b 23 0 0 10 10 0 b 46 23 36 0 46 10 l 46 337 l 508 4 b 523 0 513 1 517 0 z',\n },\n brassJazzTurn: {\n x_min: 0,\n x_max: 620,\n y_min: 0,\n y_max: 245,\n ha: 245,\n o: 'm 792 190 b 765 176 780 179 772 176 b 740 190 755 176 747 183 b 629 325 727 202 644 312 b 593 347 616 338 605 347 b 562 334 583 346 575 344 b 528 298 549 323 539 310 l 406 176 b 389 168 406 176 399 168 b 374 176 384 168 379 170 b 245 325 360 192 245 325 b 200 353 232 343 219 351 b 168 340 190 353 181 350 l 17 156 b 0 121 10 147 0 132 b 16 107 0 114 4 108 b 84 143 26 107 76 137 b 118 160 92 150 108 160 b 141 143 125 160 131 154 b 265 10 147 135 253 24 b 294 0 271 3 282 0 b 321 7 305 0 315 3 b 498 160 321 7 478 158 b 521 143 505 160 513 154 b 647 10 528 135 635 24 b 675 0 652 3 664 0 b 703 7 687 0 697 3 b 874 186 713 16 855 164 b 893 220 881 196 893 212 b 873 245 890 235 883 243 b 796 194 847 245 815 213 z',\n },\n brassSmear: {\n x_min: 1,\n x_max: 306,\n y_min: 0,\n y_max: 170,\n ha: 170,\n o: 'm 193 79 b 308 0 219 50 264 0 b 439 117 396 0 438 102 b 439 120 439 118 439 118 l 441 125 b 441 128 441 127 441 127 b 433 141 441 135 439 141 b 416 130 429 141 423 137 b 343 94 390 107 370 94 b 269 153 315 94 294 121 l 265 158 b 144 245 239 190 180 245 b 6 134 62 245 10 143 b 1 114 3 125 1 118 b 7 107 1 108 4 107 b 36 122 13 107 22 112 b 92 151 55 137 65 151 b 183 89 125 151 161 112 b 189 84 184 88 187 86 z',\n },\n stringsDownBow: {\n x_min: 0,\n x_max: 312,\n y_min: 0,\n y_max: 318,\n ha: 318,\n o: 'm 37 458 b 0 420 17 458 0 441 l 0 17 b 17 0 0 7 9 0 l 37 0 b 55 17 46 0 55 7 l 55 253 b 225 278 55 269 140 278 b 395 253 310 278 395 269 l 395 17 b 413 0 395 7 403 0 l 432 0 b 449 17 441 0 449 7 l 449 420 b 412 458 449 441 432 458 z',\n },\n stringsUpBow: {\n x_min: 1,\n x_max: 249,\n y_min: 1,\n y_max: 495,\n ha: 494,\n o: 'm 181 1 b 206 22 193 1 203 10 l 359 683 l 359 688 b 338 713 359 700 351 710 l 333 713 b 308 694 321 713 311 706 l 180 140 l 53 694 b 27 713 49 706 39 713 l 22 713 b 1 690 10 710 1 700 b 3 683 1 687 1 685 l 154 22 b 181 1 157 10 167 1 z',\n },\n stringsHarmonic: {\n x_min: 0,\n x_max: 200,\n y_min: 0,\n y_max: 200,\n ha: 200,\n o: 'm 288 144 b 144 288 288 225 223 288 b 0 144 65 288 0 225 b 144 0 0 65 65 0 b 288 144 223 0 288 65 z m 144 249 b 249 144 203 249 249 203 b 144 39 249 86 203 39 b 39 144 86 39 39 86 b 144 249 39 203 86 249 z',\n },\n pluckedSnapPizzicatoAbove: {\n x_min: 0,\n x_max: 200,\n y_min: 0,\n y_max: 300,\n ha: 300,\n o: 'm 0 144 b 144 0 0 63 65 0 b 288 144 223 0 288 63 b 167 285 288 215 235 275 l 167 432 l 121 432 l 121 285 b 0 144 52 275 0 215 z m 121 246 l 121 144 l 167 144 l 167 246 b 249 144 213 236 249 193 b 144 39 249 85 202 39 b 39 144 85 39 39 85 b 121 246 39 193 73 236 z',\n },\n pluckedSnapPizzicatoBelow: {\n x_min: 0,\n x_max: 200,\n y_min: 0,\n y_max: 300,\n ha: 300,\n o: 'm 288 288 b 144 432 288 369 223 432 b 0 288 65 432 0 369 b 121 145 0 216 52 157 l 121 0 l 167 0 l 167 145 b 288 288 235 157 288 216 z m 167 186 l 167 288 l 121 288 l 121 186 b 39 288 75 196 39 238 b 144 393 39 347 86 393 b 249 288 203 393 249 347 b 167 186 249 238 215 196 z',\n },\n pluckedLeftHandPizzicato: {\n x_min: 0,\n x_max: 272,\n y_min: 0,\n y_max: 272,\n ha: 272,\n o: 'm 392 219 l 219 219 l 219 392 l 173 392 l 173 219 l 0 219 l 0 173 l 173 173 l 173 0 l 219 0 l 219 173 l 392 173 z',\n },\n keyboardPedalPed: {\n x_min: 0,\n x_max: 1019,\n y_min: -8,\n y_max: 555,\n ha: 563,\n o: 'm 413 799 b 179 749 327 798 261 789 b 0 517 107 713 0 632 b 122 376 0 454 37 376 b 240 540 189 376 240 452 b 225 586 240 579 233 586 b 204 549 213 586 212 573 b 138 480 199 527 181 480 b 85 549 96 480 85 517 l 85 554 b 353 762 89 690 230 762 b 373 752 364 762 373 760 b 351 708 373 740 360 723 b 274 546 330 675 274 585 b 353 416 274 508 333 444 b 412 304 372 390 412 351 b 382 228 412 275 403 256 b 334 190 363 202 361 200 b 147 29 271 167 147 88 b 196 -12 147 4 171 -12 b 343 108 239 -12 279 33 l 363 132 b 387 150 370 141 376 150 b 543 -4 445 150 467 -4 b 631 42 567 -4 586 0 l 668 78 b 685 89 674 84 680 89 b 696 75 688 89 690 86 b 809 -9 717 29 753 -9 b 946 66 854 -9 894 13 b 988 107 971 92 981 107 b 1002 89 994 107 996 99 b 1152 -4 1030 36 1077 -4 b 1329 248 1238 -4 1329 82 b 792 717 1329 556 1047 665 b 766 720 785 719 775 720 b 747 703 752 720 747 711 b 780 680 747 693 756 685 b 1223 222 1028 621 1223 504 b 1152 39 1223 122 1205 39 b 1073 229 1104 39 1073 132 b 1132 423 1073 314 1086 377 b 1142 442 1140 432 1142 436 b 1126 458 1142 451 1136 458 b 1093 446 1119 458 1109 455 b 975 216 1022 408 975 337 l 975 190 b 943 121 975 160 972 150 b 852 69 899 76 877 69 b 776 148 816 69 786 117 b 773 163 775 154 773 158 b 786 177 773 167 776 170 l 801 187 b 937 366 867 235 937 284 b 844 454 937 422 900 454 b 665 217 711 454 665 331 b 671 153 665 197 667 176 l 671 147 b 662 134 671 143 670 140 b 605 111 639 118 625 111 b 521 160 572 111 546 135 b 451 203 497 184 474 197 b 426 212 435 207 426 206 b 436 230 426 216 429 220 b 510 389 464 269 510 340 b 429 521 510 435 480 462 b 369 629 387 570 369 599 b 402 720 369 648 384 691 b 462 763 425 759 446 763 b 611 624 540 763 611 704 b 564 575 611 592 590 575 b 501 602 540 575 520 582 b 474 622 492 611 487 622 b 459 603 465 622 459 615 b 603 471 459 570 510 471 b 711 588 670 471 711 524 b 422 799 711 742 554 799 z m 815 403 b 848 343 838 403 848 383 b 780 226 848 295 824 261 b 765 217 773 220 768 217 b 759 228 762 217 759 220 b 756 282 757 245 756 262 b 815 403 756 346 772 403 z m 1405 124 b 1344 62 1369 124 1344 98 b 1405 0 1344 26 1369 0 b 1467 62 1441 0 1467 26 b 1405 124 1467 98 1441 124 z',\n },\n keyboardPedalUp: {\n x_min: 0,\n x_max: 450,\n y_min: 0,\n y_max: 450,\n ha: 450,\n o: 'm 582 396 b 516 367 554 396 533 384 b 465 340 495 347 487 340 l 458 340 b 412 377 432 340 412 348 b 432 409 412 387 419 396 l 438 415 b 490 429 451 428 464 429 b 575 501 534 429 575 452 b 501 575 575 541 541 575 b 429 490 452 575 429 534 b 415 438 429 464 428 451 l 409 432 b 377 412 396 419 387 412 b 340 458 348 412 340 432 l 340 465 b 367 516 340 487 347 495 b 396 582 384 533 396 554 b 324 648 396 625 363 648 b 252 582 285 648 252 625 b 281 516 252 554 264 533 b 308 465 301 495 308 487 l 308 458 b 271 412 308 432 300 412 b 239 432 261 412 252 419 l 233 438 b 219 490 220 451 219 464 b 147 575 219 534 196 575 b 73 501 107 575 73 541 b 158 429 73 452 114 429 b 210 415 184 429 197 428 l 216 409 b 236 377 229 396 236 387 b 190 340 236 348 216 340 l 183 340 b 132 367 161 340 153 347 b 66 396 115 384 94 396 b 0 324 23 396 0 363 b 66 252 0 285 23 252 b 132 281 94 252 115 264 b 183 308 153 301 161 308 l 190 308 b 236 271 216 308 236 300 b 216 239 236 261 229 252 l 210 233 b 158 219 197 220 184 219 b 73 147 114 219 73 196 b 147 73 73 107 107 73 b 219 158 196 73 219 114 b 233 210 219 184 220 197 l 239 216 b 271 236 252 229 261 236 b 308 190 300 236 308 216 l 308 183 b 281 132 308 161 301 153 b 252 66 264 115 252 94 b 324 0 252 23 285 0 b 396 66 363 0 396 23 b 367 132 396 94 384 115 b 340 183 347 153 340 161 l 340 190 b 377 236 340 216 348 236 b 409 216 387 236 396 229 l 415 210 b 429 158 428 197 429 184 b 501 73 429 114 452 73 b 575 147 541 73 575 107 b 490 219 575 196 534 219 b 438 233 464 219 451 220 l 432 239 b 412 271 419 252 412 261 b 458 308 412 300 432 308 l 465 308 b 516 281 487 308 495 301 b 582 252 533 264 554 252 b 648 324 625 252 648 285 b 582 396 648 363 625 396 z m 324 271 b 271 324 291 271 271 291 b 324 377 271 357 291 377 b 377 324 357 377 377 357 b 324 271 377 291 357 271 z',\n },\n pictChokeCymbal: {\n x_min: 1,\n x_max: 152,\n y_min: 2,\n y_max: 251,\n ha: 249,\n o: 'm 104 361 b 1 271 42 361 1 321 b 82 190 1 222 35 190 b 122 160 118 190 122 160 b 125 144 124 154 125 150 b 102 88 125 124 115 105 b 37 32 78 56 40 35 b 26 17 32 29 26 26 l 27 16 b 37 3 29 6 33 3 b 181 102 85 3 158 66 b 219 239 210 147 219 197 l 219 249 b 104 361 219 317 170 361 z',\n },\n wiggleArpeggiatoUp: {\n x_min: -33,\n x_max: 292,\n y_min: 0,\n y_max: 119,\n ha: 119,\n o: 'm 130 171 b -39 68 16 171 -14 91 b -48 53 -45 62 -48 58 b -29 42 -48 46 -39 42 b -10 46 -23 42 -16 43 b 56 63 12 56 29 63 b 248 0 121 63 135 0 b 419 127 361 0 410 104 b 420 132 420 130 420 131 b 412 140 420 137 416 140 b 386 130 403 140 392 134 b 334 107 367 117 353 107 b 318 108 330 107 324 107 b 240 138 289 112 265 128 b 130 171 209 153 168 171 z',\n },\n arrowheadBlackUp: {\n x_min: 0,\n x_max: 228,\n y_min: 0,\n y_max: 299,\n ha: 299,\n o: 'm 166 431 b 0 20 111 274 0 30 b 16 0 0 12 6 0 l 17 1 b 166 50 43 16 160 50 b 310 1 171 50 289 13 l 311 0 b 328 20 321 0 328 12 b 166 431 328 30 220 274 z',\n },\n arrowheadBlackDown: {\n x_min: 0,\n x_max: 228,\n y_min: 0,\n y_max: 299,\n ha: 299,\n o: 'm 166 0 b 328 410 220 157 328 400 b 311 431 328 419 321 431 l 310 429 b 166 380 289 418 171 380 b 17 429 160 380 43 415 l 16 431 b 0 410 6 431 0 419 b 166 0 0 400 111 157 z',\n },\n arpeggiatoUp: {\n x_min: 1,\n x_max: 229,\n y_min: 7,\n y_max: 1511,\n ha: 1504,\n o: 'm 219 1848 l 330 1848 l 164 2176 l 1 1848 l 121 1848 b 92 1778 115 1822 101 1800 l 89 1773 b 59 1668 75 1741 59 1702 b 96 1555 59 1614 76 1580 b 99 1551 98 1554 99 1551 l 102 1547 b 124 1496 115 1531 124 1515 b 122 1482 124 1492 124 1488 b 92 1404 118 1453 102 1428 b 59 1293 78 1372 59 1332 b 105 1172 59 1234 81 1198 b 124 1120 118 1155 124 1143 l 122 1113 b 122 1110 122 1113 122 1112 b 92 1032 118 1081 102 1057 b 59 922 78 1001 59 960 b 115 792 59 855 86 816 b 124 760 121 782 124 773 b 122 744 124 756 124 750 b 92 667 118 716 102 693 b 59 556 78 635 59 595 b 108 433 59 495 82 458 b 124 389 117 420 124 408 b 122 374 124 384 124 379 b 92 298 118 346 102 323 l 89 292 b 59 186 75 261 59 222 b 163 19 59 73 140 42 b 177 10 168 13 173 10 b 189 29 184 10 189 19 b 184 48 189 35 187 42 b 167 114 174 69 167 85 b 230 305 167 179 229 193 b 181 423 230 357 209 396 b 167 484 173 442 167 458 b 230 675 167 547 229 563 b 179 796 230 729 206 769 b 167 850 171 812 167 827 b 230 1040 167 913 229 929 b 183 1158 230 1092 209 1130 b 167 1220 173 1178 167 1194 b 230 1411 167 1284 229 1300 b 186 1526 230 1462 210 1499 b 167 1594 176 1529 167 1584 b 230 1786 167 1659 229 1673 b 219 1848 230 1809 226 1829 z',\n },\n arpeggiatoDown: {\n x_min: 1,\n x_max: 229,\n y_min: -4,\n y_max: 1500,\n ha: 1504,\n o: 'm 219 323 b 230 384 226 341 230 361 b 167 576 229 497 167 511 b 186 644 167 586 176 641 b 230 759 210 671 230 708 b 167 950 229 870 167 886 b 183 1012 167 976 173 992 b 230 1130 209 1040 230 1079 b 167 1320 229 1241 167 1257 b 179 1374 167 1344 171 1358 b 230 1495 206 1401 230 1441 b 167 1686 229 1607 167 1623 b 181 1747 167 1712 173 1728 b 230 1865 209 1774 230 1813 b 167 2056 229 1977 167 1992 b 184 2123 167 2085 174 2101 b 189 2141 187 2128 189 2136 b 177 2160 189 2151 184 2160 b 163 2151 173 2160 168 2157 b 59 1984 140 2128 59 2097 b 89 1878 59 1948 75 1909 l 92 1872 b 122 1796 102 1848 118 1824 b 124 1781 124 1791 124 1786 b 108 1737 124 1763 117 1750 b 59 1614 82 1712 59 1675 b 92 1503 59 1575 78 1535 b 122 1426 102 1477 118 1454 b 124 1410 124 1420 124 1414 b 115 1378 124 1397 121 1388 b 59 1248 86 1354 59 1315 b 92 1138 59 1210 78 1169 b 122 1060 102 1113 118 1089 b 122 1057 122 1058 122 1058 l 124 1050 b 105 998 124 1027 118 1015 b 59 877 81 972 59 936 b 92 766 59 838 78 798 b 122 688 102 742 118 717 b 124 674 124 683 124 678 b 102 624 124 655 115 639 l 99 619 b 96 615 99 619 98 616 b 59 503 76 590 59 556 b 89 397 59 468 75 429 l 92 392 b 121 323 101 370 115 348 l 1 323 l 164 -6 l 330 323 z',\n },\n repeat1Bar: {\n x_min: 0,\n x_max: 532,\n y_min: -250,\n y_max: 279,\n ha: 529,\n o: 'm 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z m 89 288 b 0 197 40 288 0 248 b 89 108 0 148 40 108 b 180 197 140 108 180 148 b 89 288 180 248 140 288 z m 675 -71 b 586 -161 626 -71 586 -111 b 675 -251 586 -210 626 -251 b 766 -161 726 -251 766 -210 b 675 -71 766 -111 726 -71 z',\n },\n repeat2Bars: {\n x_min: 0,\n x_max: 762,\n y_min: -250,\n y_max: 279,\n ha: 529,\n o: 'm 1090 380 b 1097 395 1094 386 1097 390 b 1089 402 1097 399 1094 402 l 936 402 b 910 380 927 402 920 393 l 336 -340 b 331 -350 333 -343 331 -347 b 343 -360 331 -356 336 -360 l 485 -360 b 516 -340 498 -360 508 -348 z m 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z m 89 288 b 0 197 40 288 0 248 b 89 108 0 148 40 108 b 180 197 140 108 180 148 b 89 288 180 248 140 288 z m 1007 -71 b 917 -161 958 -71 917 -111 b 1007 -251 917 -210 958 -251 b 1097 -161 1057 -251 1097 -210 b 1007 -71 1097 -111 1057 -71 z',\n },\n repeat4Bars: {\n x_min: 0,\n x_max: 1232,\n y_min: -250,\n y_max: 279,\n ha: 529,\n o: 'm 1767 380 b 1774 395 1771 386 1774 390 b 1765 402 1774 399 1771 402 l 1613 402 b 1587 380 1604 402 1597 393 l 1012 -340 b 1008 -350 1009 -343 1008 -347 b 1020 -360 1008 -356 1012 -360 l 1162 -360 b 1192 -340 1175 -360 1185 -348 z m 1436 380 b 1443 395 1440 386 1443 390 b 1434 402 1443 399 1440 402 l 1282 402 b 1256 380 1273 402 1266 393 l 681 -340 b 677 -350 678 -343 677 -347 b 688 -360 677 -356 681 -360 l 831 -360 b 861 -340 844 -360 854 -348 z m 1090 380 b 1097 395 1094 386 1097 390 b 1089 402 1097 399 1094 402 l 936 402 b 910 380 927 402 920 393 l 336 -340 b 331 -350 333 -343 331 -347 b 343 -360 331 -356 336 -360 l 485 -360 b 516 -340 498 -360 508 -348 z m 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z m 89 288 b 0 197 40 288 0 248 b 89 108 0 148 40 108 b 180 197 140 108 180 148 b 89 288 180 248 140 288 z m 1683 -71 b 1594 -161 1634 -71 1594 -111 b 1683 -251 1594 -210 1634 -251 b 1774 -161 1734 -251 1774 -210 b 1683 -71 1774 -111 1734 -71 z',\n },\n repeatBarSlash: {\n x_min: 0,\n x_max: 532,\n y_min: -250,\n y_max: 279,\n ha: 529,\n o: 'm 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z',\n },\n csymDiminished: {\n x_min: 0,\n x_max: 473,\n y_min: 0,\n y_max: 473,\n ha: 473,\n o: 'm 341 681 b 0 341 153 681 0 530 b 341 0 0 153 153 0 b 681 341 530 0 681 153 b 341 681 681 530 530 681 z m 341 618 b 618 341 495 618 618 495 b 341 63 618 189 494 63 b 63 341 187 63 63 187 b 341 618 63 494 189 618 z',\n },\n csymHalfDiminished: {\n x_min: -16,\n x_max: 488,\n y_min: -15,\n y_max: 489,\n ha: 504,\n o: 'm 703 660 l 658 704 l 557 603 b 340 681 498 652 422 681 b -1 341 151 681 -1 530 b 78 124 -1 259 29 183 l -23 23 l 22 -22 l 122 79 b 340 0 181 30 258 0 b 680 341 528 0 680 153 b 602 559 680 423 651 500 z m 62 341 b 340 618 62 494 187 618 b 513 559 403 618 464 598 l 122 168 b 62 341 84 217 62 278 z m 616 341 b 340 63 616 189 492 63 b 167 124 276 63 216 85 l 557 514 b 616 341 596 465 616 405 z',\n },\n csymAugmented: {\n x_min: 0,\n x_max: 395,\n y_min: 1,\n y_max: 396,\n ha: 395,\n o: 'm 569 318 l 317 318 l 317 570 l 253 570 l 253 318 l 0 318 l 0 255 l 253 255 l 253 1 l 317 1 l 317 255 l 569 255 z',\n },\n csymMajorSeventh: {\n x_min: 0,\n x_max: 558,\n y_min: 1,\n y_max: 477,\n ha: 476,\n o: 'm 402 687 l 0 1 l 804 1 z m 402 562 l 693 65 l 111 65 z',\n },\n csymMinor: {\n x_min: 0,\n x_max: 325,\n y_min: 216,\n y_max: 260,\n ha: 44,\n o: 'm 468 374 l 0 374 l 0 311 l 468 311 z',\n },\n csymParensLeftTall: {\n x_min: 1,\n x_max: 185,\n y_min: 0,\n y_max: 997,\n ha: 997,\n o: 'm 266 48 b 261 65 266 55 264 62 b 92 719 157 212 92 400 b 262 1371 92 1037 154 1228 b 266 1394 266 1378 266 1394 l 266 1424 b 264 1436 266 1431 266 1436 b 259 1434 262 1436 259 1434 b 1 719 84 1261 1 1011 b 259 1 1 429 79 177 b 264 0 261 0 262 0 b 266 9 265 0 266 6 z',\n },\n csymParensRightTall: {\n x_min: -20,\n x_max: 164,\n y_min: 0,\n y_max: 997,\n ha: 997,\n o: 'm -29 9 b -26 0 -29 6 -27 0 b -22 1 -24 0 -23 0 b 236 719 158 177 236 429 b -22 1434 236 1011 154 1261 b -26 1436 -22 1434 -24 1436 b -29 1424 -29 1436 -29 1431 l -29 1394 b -24 1371 -29 1394 -29 1378 b 145 719 84 1228 145 1037 b -23 65 145 400 81 212 b -29 48 -26 62 -29 55 z',\n },\n csymBracketLeftTall: {\n x_min: 0,\n x_max: 155,\n y_min: 0,\n y_max: 1000,\n ha: 1000,\n o: 'm 217 0 b 223 9 220 0 223 4 l 223 37 b 217 46 223 42 220 46 l 92 46 l 92 1394 l 217 1394 b 223 1403 220 1394 223 1398 l 223 1431 b 217 1440 223 1436 220 1440 l 6 1440 b 0 1436 3 1440 0 1439 l 0 4 b 6 0 0 1 3 0 z',\n },\n csymBracketRightTall: {\n x_min: 1,\n x_max: 156,\n y_min: 0,\n y_max: 1000,\n ha: 1000,\n o: 'm 219 0 b 225 4 222 0 225 1 l 225 1436 b 219 1440 225 1439 222 1440 l 7 1440 b 1 1431 4 1440 1 1436 l 1 1403 b 7 1394 1 1398 4 1394 l 132 1394 l 132 46 l 7 46 b 1 37 4 46 1 42 l 1 9 b 7 0 1 4 4 0 z',\n },\n csymParensLeftVeryTall: {\n x_min: 0,\n x_max: 122,\n y_min: 0,\n y_max: 993,\n ha: 993,\n o: 'm 176 32 b 171 49 176 39 174 46 b 60 716 104 194 60 399 b 173 1382 60 1032 101 1241 b 176 1405 176 1390 176 1405 l 176 1427 b 173 1430 176 1428 174 1430 b 0 716 40 1297 0 978 b 170 3 0 428 50 179 b 171 0 170 1 170 0 b 176 6 173 0 176 4 z',\n },\n csymParensRightVeryTall: {\n x_min: -15,\n x_max: 107,\n y_min: 0,\n y_max: 993,\n ha: 993,\n o: 'm -22 6 b -17 0 -22 4 -19 0 b -16 3 -16 0 -16 1 b 154 716 104 179 154 428 b -19 1430 154 978 114 1297 b -22 1427 -20 1430 -22 1428 l -22 1405 b -19 1382 -22 1405 -22 1390 b 94 716 53 1241 94 1032 b -17 49 94 399 50 194 b -22 32 -20 46 -22 39 z',\n },\n csymDiagonalArrangementSlash: {\n x_min: 0,\n x_max: 999,\n y_min: 0,\n y_max: 1000,\n ha: 1000,\n o: 'm 1439 1380 l 1377 1440 l 0 60 l 62 0 z',\n },\n accSagittal5v7KleismaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -35 b 135 -112 68 -86 99 -112 b 225 68 194 -112 225 -53 l 180 68 b 144 -4 180 20 168 -4 b 122 0 138 -4 131 -3 b 23 248 86 14 52 96 l 0 248 z',\n },\n accSagittal5v7KleismaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 b 122 0 52 -96 86 -14 b 144 4 131 3 138 4 b 180 -68 168 4 180 -20 l 225 -68 b 135 112 225 53 194 112 b 45 35 99 112 68 86 l 45 517 l 0 517 z',\n },\n accSagittal5CommaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 225 -517 l 225 248 l 203 248 l 0 -112 l 0 -284 l 180 33 l 180 -517 z',\n },\n accSagittal5CommaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 180 517 l 180 -33 l 0 284 l 0 112 l 203 -248 l 225 -248 l 225 517 z',\n },\n accSagittal7CommaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 248 l 0 -517 l 45 -517 l 45 112 l 89 112 b 180 -68 150 112 180 53 l 180 -248 l 225 -248 l 225 68 b 135 248 225 187 194 248 z',\n },\n accSagittal7CommaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 135 -248 b 225 -68 194 -248 225 -187 l 225 248 l 180 248 l 180 68 b 89 -112 180 -53 150 -112 l 45 -112 l 45 517 l 0 517 l 0 -248 z',\n },\n accSagittal25SmallDiesisUp: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -157 l 0 -259 l 315 -89 l 315 -517 l 360 -517 l 360 248 l 337 248 l 0 68 l 0 -33 l 315 135 l 315 10 z',\n },\n accSagittal25SmallDiesisDown: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 315 -10 l 315 -135 l 0 33 l 0 -68 l 337 -248 l 360 -248 l 360 517 l 315 517 l 315 89 l 0 259 l 0 157 z',\n },\n accSagittal35MediumDiesisUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -284 l 180 33 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -68 330 112 360 53 l 360 -248 l 405 -248 l 405 68 b 315 248 405 187 374 248 l 203 248 l 0 -112 z',\n },\n accSagittal35MediumDiesisDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 203 -248 l 315 -248 b 405 -68 374 -248 405 -187 l 405 248 l 360 248 l 360 68 b 271 -112 360 -53 330 -112 l 225 -112 l 225 517 l 180 517 l 180 -33 l 0 284 z',\n },\n accSagittal11MediumDiesisUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 225 53 l 225 -517 l 271 -517 l 271 53 l 495 -248 l 495 -89 l 248 248 l 0 -89 l 0 -248 z',\n },\n accSagittal11MediumDiesisDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 248 l 0 89 l 248 -248 l 495 89 l 495 248 l 271 -53 l 271 517 l 225 517 l 225 -53 z',\n },\n accSagittal11LargeDiesisUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 112 l 315 112 b 449 -68 405 112 449 53 l 449 -248 l 495 -248 l 495 68 b 360 248 495 187 449 248 l 135 248 b 0 68 45 248 0 187 z',\n },\n accSagittal11LargeDiesisDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 360 -248 b 495 -68 449 -248 495 -187 l 495 248 l 449 248 l 449 68 b 315 -112 449 -53 405 -112 l 271 -112 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittal35LargeDiesisUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 248 -248 l 540 112 l 540 274 l 271 -58 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittal35LargeDiesisDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 248 -248 l 540 112 l 540 274 l 269 -58 l 269 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittalSharp25SDown: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 112 -112 0 -53 36 -112 l 135 -112 l 135 -517 l 180 -517 l 180 -89 b 248 26 206 -65 229 -27 b 315 -89 264 -27 287 -65 l 315 -517 l 360 -517 l 360 -112 l 383 -112 b 495 68 458 -112 495 -53 l 449 68 b 399 -4 449 20 433 -4 b 248 248 297 -4 261 171 b 122 0 216 96 176 14 b 94 -4 112 -3 102 -4 b 45 68 60 -4 45 20 z',\n },\n accSagittalFlat25SUp: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 94 4 45 -20 60 4 b 122 0 102 4 112 3 b 248 -248 176 -14 216 -96 b 399 4 261 -171 297 4 b 449 -68 433 4 449 -20 l 495 -68 b 383 112 495 53 458 112 l 360 112 l 360 517 l 315 517 l 315 89 b 248 -26 287 65 264 27 b 180 89 229 27 206 65 l 180 517 l 135 517 l 135 112 l 112 112 b 0 -68 36 112 0 53 z',\n },\n accSagittalSharp7CDown: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 112 l 89 112 b 180 104 124 112 154 109 l 180 -517 l 225 -517 l 225 89 b 315 -68 285 60 315 9 l 315 -248 l 360 -248 l 360 68 b 135 248 360 187 285 248 l 0 248 z',\n },\n accSagittalFlat7CUp: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 135 -248 b 360 -68 285 -248 360 -187 l 360 248 l 315 248 l 315 68 b 225 -89 315 -9 285 -60 l 225 517 l 180 517 l 180 -104 b 89 -112 154 -109 124 -112 l 45 -112 l 45 517 l 0 517 z',\n },\n accSagittalSharp5CDown: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -517 l 45 71 l 180 -56 l 180 -517 l 225 -517 l 225 -98 l 405 -268 l 405 -112 l 23 248 l 0 248 l 0 -517 z',\n },\n accSagittalFlat5CUp: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 517 l 0 -248 l 23 -248 l 405 112 l 405 268 l 225 98 l 225 517 l 180 517 l 180 56 l 45 -71 l 45 517 z',\n },\n accSagittalSharp5v7kDown: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -276 l 135 -82 l 135 -517 l 180 -517 l 180 -17 l 271 112 l 315 112 l 315 -517 l 360 -517 l 360 107 b 449 -68 420 89 449 30 l 449 -248 l 495 -248 l 495 68 b 360 248 495 189 449 248 l 248 248 z',\n },\n accSagittalFlat5v7kUp: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 248 -248 l 360 -248 b 495 -68 449 -248 495 -189 l 495 248 l 449 248 l 449 68 b 360 -107 449 -30 420 -89 l 360 517 l 315 517 l 315 -112 l 271 -112 l 180 17 l 180 517 l 135 517 l 135 82 l 0 276 l 0 112 z',\n },\n accSagittalSharp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 180 -53 l 180 -517 l 225 -517 l 225 0 l 292 85 l 360 0 l 360 -517 l 405 -517 l 405 -53 l 585 -274 l 585 -112 l 292 248 l 0 -112 l 0 -274 z',\n },\n accSagittalFlat: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 274 l 0 112 l 292 -248 l 585 112 l 585 274 l 405 53 l 405 517 l 360 517 l 360 0 l 292 -85 l 225 0 l 225 517 l 180 517 l 180 53 z',\n },\n accSagittalSharp5v7kUp: {\n x_min: 0,\n x_max: 312,\n y_min: -361,\n y_max: 172,\n ha: 533,\n o: 'm 45 -517 l 45 -10 b 135 -92 68 -48 98 -75 l 135 -520 l 180 -520 l 180 -108 b 248 -115 203 -112 225 -115 b 271 -112 256 -115 264 -115 l 271 -517 l 315 -517 l 315 -107 b 449 68 405 -89 449 -30 l 405 68 b 297 -4 405 19 369 -4 b 23 248 131 -4 56 85 l 0 248 l 0 -517 z',\n },\n accSagittalFlat5v7kDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 361,\n ha: 533,\n o: 'm 0 517 l 0 -248 l 23 -248 b 297 4 56 -85 131 4 b 405 -68 369 4 405 -19 l 449 -68 b 315 107 449 30 405 89 l 315 517 l 271 517 l 271 112 b 248 115 264 115 256 115 b 180 108 225 115 203 112 l 180 520 l 135 520 l 135 92 b 45 10 98 75 68 48 l 45 517 z',\n },\n accSagittalSharp5CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -266 l 135 -153 l 135 -517 l 180 -517 l 180 -115 l 271 -39 l 271 -517 l 315 -517 l 315 0 l 405 75 l 405 -517 l 449 -517 l 449 248 l 428 248 l 0 -112 z',\n },\n accSagittalFlat5CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 428 -248 l 449 -248 l 449 517 l 405 517 l 405 -75 l 315 0 l 315 517 l 271 517 l 271 39 l 180 115 l 180 517 l 135 517 l 135 153 l 0 266 z',\n },\n accSagittalSharp7CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 112 l 135 112 l 135 -517 l 180 -517 l 180 108 b 271 89 213 105 243 99 l 271 -517 l 315 -517 l 315 73 b 405 -68 374 45 405 -3 l 405 -248 l 449 -248 l 449 68 b 135 248 449 187 346 248 l 0 248 z',\n },\n accSagittalFlat7CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 135 -248 b 449 -68 346 -248 449 -187 l 449 248 l 405 248 l 405 68 b 315 -73 405 3 374 -45 l 315 517 l 271 517 l 271 -89 b 180 -108 243 -99 213 -105 l 180 517 l 135 517 l 135 -112 l 45 -112 l 45 517 l 0 517 z',\n },\n accSagittalSharp25SUp: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -30 l 495 143 l 495 14 l 0 -157 l 0 -255 l 225 -177 l 225 -517 l 271 -517 l 271 -161 l 360 -130 l 360 -517 l 405 -517 l 405 -115 l 495 -84 l 495 -517 l 540 -517 l 540 248 l 517 248 l 0 68 z',\n },\n accSagittalFlat25SDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 l 517 -248 l 540 -248 l 540 517 l 495 517 l 495 84 l 405 115 l 405 517 l 360 517 l 360 130 l 271 161 l 271 517 l 225 517 l 225 177 l 0 255 l 0 157 l 495 -14 l 495 -143 l 0 30 z',\n },\n accSagittalSharp35MUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -274 l 135 -108 l 135 -517 l 180 -517 l 180 -53 l 271 58 l 271 -517 l 315 -517 l 315 112 l 360 112 b 405 109 376 112 390 112 l 405 -517 l 449 -517 l 449 96 b 540 -68 510 72 540 17 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 z',\n },\n accSagittalFlat35MDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 292 -248 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 449 -96 540 -17 510 -72 l 449 517 l 405 517 l 405 -109 b 360 -112 390 -112 376 -112 l 315 -112 l 315 517 l 271 517 l 271 -58 l 180 53 l 180 517 l 135 517 l 135 108 l 0 274 l 0 112 z',\n },\n accSagittalSharp11MUp: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -271 l 180 -79 l 180 -517 l 225 -517 l 225 -30 l 315 65 l 315 -517 l 360 -517 l 360 65 l 449 -30 l 449 -517 l 495 -517 l 495 -79 l 675 -271 l 675 -112 l 337 248 z',\n },\n accSagittalFlat11MDown: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 337 -248 l 675 112 l 675 271 l 495 79 l 495 517 l 449 517 l 449 30 l 360 -65 l 360 517 l 315 517 l 315 -65 l 225 30 l 225 517 l 180 517 l 180 79 l 0 271 l 0 112 z',\n },\n accSagittalSharp11LUp: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 112 l 449 112 l 449 -517 l 495 -517 l 495 104 b 631 -68 585 82 631 26 l 631 -248 l 675 -248 l 675 68 b 449 248 675 187 600 248 l 225 248 b 0 68 75 248 0 187 z',\n },\n accSagittalFlat11LDown: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 449 -248 b 675 -68 600 -248 675 -187 l 675 248 l 631 248 l 631 68 b 495 -104 631 -26 585 -82 l 495 517 l 449 517 l 449 -112 l 360 -112 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z',\n },\n accSagittalSharp35LUp: {\n x_min: 0,\n x_max: 500,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 71 l 452 -17 l 452 -517 l 495 -517 l 495 -56 l 720 -268 l 720 -112 l 337 248 l 225 248 b 0 68 75 248 0 187 z',\n },\n accSagittalFlat35LDown: {\n x_min: 0,\n x_max: 500,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 337 -248 l 720 112 l 720 268 l 495 56 l 495 517 l 452 517 l 452 17 l 360 -71 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z',\n },\n accSagittalDoubleSharp25SDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 135 -112 0 -53 45 -112 b 243 -62 180 -112 215 -95 l 89 -503 l 143 -517 l 292 -82 l 445 -517 l 495 -503 l 343 -62 b 449 -112 372 -95 408 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 315 148 b 112 -4 274 148 236 -4 b 45 68 68 -4 45 20 z',\n },\n accSagittalDoubleFlat25SUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 112 4 45 -20 68 4 b 292 -248 236 4 274 -148 b 475 4 315 -148 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 b 343 62 408 112 372 95 l 495 503 l 445 517 l 292 82 l 143 517 l 89 503 l 243 62 b 135 112 215 95 180 112 b 0 -68 45 112 0 53 z',\n },\n accSagittalDoubleSharp7CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -503 l 52 -517 l 203 -82 l 354 -517 l 405 -503 l 230 0 l 271 108 b 495 -68 420 92 495 35 l 495 -248 l 540 -248 l 540 68 b 225 248 540 187 435 248 l 89 248 l 89 112 l 135 112 l 174 0 z m 213 112 l 203 82 l 192 112 z',\n },\n accSagittalDoubleFlat7CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 174 0 l 135 -112 l 89 -112 l 89 -248 l 225 -248 b 540 -68 435 -248 540 -187 l 540 248 l 495 248 l 495 68 b 271 -108 495 -35 420 -92 l 230 0 l 405 503 l 354 517 l 203 82 l 52 517 l 0 503 z m 192 -112 l 203 -82 l 213 -112 z',\n },\n accSagittalDoubleSharp5CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 405 -503 l 230 0 l 232 4 l 585 -264 l 585 -112 l 112 248 l 89 248 l 89 112 l 151 68 l 174 0 l 0 -503 l 52 -517 l 203 -82 l 354 -517 z',\n },\n accSagittalDoubleFlat5CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 354 517 l 203 82 l 52 517 l 0 503 l 174 0 l 151 -68 l 89 -112 l 89 -248 l 112 -248 l 585 112 l 585 264 l 232 -4 l 230 0 l 405 503 z',\n },\n accSagittalDoubleSharp5v7kDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -274 l 252 35 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 360 112 b 540 -68 480 112 540 53 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 l 0 -112 z',\n },\n accSagittalDoubleFlat5v7kUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 292 -248 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 360 -112 540 -53 480 -112 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 252 -35 l 0 274 z',\n },\n accSagittalDoubleSharp: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 540 -503 l 366 0 l 380 45 l 675 -271 l 675 -112 l 337 248 l 0 -112 l 0 -271 l 295 45 l 310 0 l 135 -503 l 186 -517 l 337 -82 l 488 -517 z',\n },\n accSagittalDoubleFlat: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 488 517 l 337 82 l 186 517 l 135 503 l 310 0 l 295 -45 l 0 271 l 0 112 l 337 -248 l 675 112 l 675 271 l 380 -45 l 366 0 l 540 503 z',\n },\n accSagittal7v11KleismaUp: {\n x_min: 0,\n x_max: 219,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 68 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 -45 b 248 -112 200 -89 225 -112 b 315 68 292 -112 315 -53 l 271 68 b 248 -4 271 20 264 -4 b 236 0 245 -4 240 -3 b 157 248 213 14 187 96 b 78 0 127 96 101 14 b 65 -4 73 -3 68 -4 b 45 68 50 -4 45 20 l 0 68 b 68 -112 0 -53 23 -112 z',\n },\n accSagittal7v11KleismaDown: {\n x_min: 0,\n x_max: 219,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 68 112 b 0 -68 23 112 0 53 l 45 -68 b 65 4 45 -20 50 4 b 78 0 68 4 73 3 b 157 -248 101 -14 127 -96 b 236 0 187 -96 213 -14 b 248 4 240 3 245 4 b 271 -68 264 4 271 -20 l 315 -68 b 248 112 315 53 292 112 b 180 45 225 112 200 89 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 z',\n },\n accSagittal17CommaUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 -40 b 315 -118 248 -92 279 -118 b 405 62 374 -118 405 -59 l 360 62 b 324 -10 360 14 348 -10 b 302 -6 318 -10 311 -9 b 206 217 268 9 235 84 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z',\n },\n accSagittal17CommaDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 206 -217 b 302 6 235 -84 268 -9 b 324 10 311 9 318 10 b 360 -62 348 10 360 -14 l 405 -62 b 315 118 405 59 374 118 b 225 40 279 118 248 92 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z',\n },\n accSagittal55CommaUp: {\n x_min: 0,\n x_max: 219,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 248 l 0 -517 l 45 -517 l 45 58 l 315 -274 l 315 -112 l 23 248 z',\n },\n accSagittal55CommaDown: {\n x_min: 0,\n x_max: 219,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 23 -248 l 315 112 l 315 274 l 45 -58 l 45 517 l 0 517 l 0 -248 z',\n },\n accSagittal7v11CommaUp: {\n x_min: 0,\n x_max: 188,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 248 l 135 248 b 0 68 45 248 0 187 z',\n },\n accSagittal7v11CommaDown: {\n x_min: 0,\n x_max: 188,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 271 -248 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittal5v11SmallDiesisUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 73 l 0 -248 l 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 -40 b 360 -118 295 -92 325 -118 b 449 62 420 -118 449 -59 l 405 62 b 369 -10 405 14 393 -10 b 348 -6 363 -10 356 -9 b 251 217 312 9 279 84 l 248 248 l 135 248 b 0 73 45 248 0 189 z',\n },\n accSagittal5v11SmallDiesisDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -73 b 135 -248 0 -189 45 -248 l 248 -248 l 251 -217 b 348 6 279 -84 312 -9 b 369 10 356 9 363 10 b 405 -62 393 10 405 -14 l 449 -62 b 360 118 449 59 420 118 b 271 40 325 118 295 92 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittalSharp5v11SDown: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 112 -23 45 -84 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 b 242 37 203 -23 225 -3 b 315 -89 262 -23 285 -63 l 315 -517 l 360 -517 l 360 -112 l 383 -112 b 495 68 458 -112 495 -53 l 449 68 b 399 -4 449 20 433 -4 b 248 248 297 -4 261 171 b 157 68 222 127 192 68 l 89 68 b 0 -203 30 68 0 -23 z',\n },\n accSagittalFlat5v11SUp: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 89 -68 0 23 30 -68 l 157 -68 b 248 -248 192 -68 222 -127 b 399 4 261 -171 297 4 b 449 -68 433 4 449 -20 l 495 -68 b 383 112 495 53 458 112 l 360 112 l 360 517 l 315 517 l 315 89 b 242 -37 285 63 262 23 b 180 23 225 3 203 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 84 z',\n },\n accSagittalSharp7v11CDown: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 89 -112 l 89 -517 l 135 -517 l 135 -95 b 206 37 163 -73 187 -30 b 271 -23 225 -3 248 -23 l 271 -517 l 315 -517 l 315 -23 l 383 -23 b 449 -203 428 -23 449 -84 l 495 -203 b 405 68 495 -23 465 68 l 292 68 b 203 248 258 68 228 127 b 101 0 173 98 138 16 b 81 -3 94 0 86 -3 b 45 68 56 -3 45 20 l 0 68 b 89 -112 0 -52 30 -112 z',\n },\n accSagittalFlat7v11CUp: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 112 b 0 -68 30 112 0 52 l 45 -68 b 81 3 45 -20 56 3 b 101 0 86 3 94 0 b 203 -248 138 -16 173 -98 b 292 -68 228 -127 258 -68 l 405 -68 b 495 203 465 -68 495 23 l 449 203 b 383 23 449 84 428 23 l 315 23 l 315 517 l 271 517 l 271 23 b 206 -37 248 23 225 3 b 135 95 187 30 163 73 l 135 517 l 89 517 z',\n },\n accSagittalSharp55CDown: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -271 l 135 -125 l 135 -517 l 180 -517 l 180 -78 l 315 65 l 315 -517 l 360 -517 l 360 248 l 337 248 l 0 -112 z',\n },\n accSagittalFlat55CUp: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 337 -248 l 360 -248 l 360 517 l 315 517 l 315 -65 l 180 78 l 180 517 l 135 517 l 135 125 l 0 271 z',\n },\n accSagittalSharp17CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -248 l 45 -68 b 180 109 45 36 89 95 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -89 292 13 321 -55 l 360 -517 l 405 -517 l 405 -112 l 428 -112 b 540 68 504 -112 540 -53 l 495 68 b 445 -4 495 20 480 -4 b 292 248 343 -4 307 171 l 180 248 b 0 68 60 248 0 187 l 0 -248 z',\n },\n accSagittalFlat17CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 248 l 0 -68 b 180 -248 0 -187 60 -248 l 292 -248 b 445 4 307 -171 343 4 b 495 -68 480 4 495 -20 l 540 -68 b 428 112 540 53 504 112 l 405 112 l 405 517 l 360 517 l 360 89 b 271 -112 321 55 292 -13 l 225 -112 l 225 517 l 180 517 l 180 -109 b 45 68 89 -95 45 -36 l 45 248 z',\n },\n accSagittalSharp7v11kDown: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -32 l 405 138 l 405 13 l 0 -157 l 0 -256 l 225 -161 l 225 -517 l 271 -517 l 271 -144 l 405 -86 l 405 -517 l 449 -517 l 449 248 l 428 248 l 0 68 z',\n },\n accSagittalFlat7v11kUp: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 l 428 -248 l 449 -248 l 449 517 l 405 517 l 405 86 l 271 144 l 271 517 l 225 517 l 225 161 l 0 256 l 0 157 l 405 -13 l 405 -138 l 0 32 z',\n },\n accSagittalSharp7v11kUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 135 -112 l 135 -517 l 180 -517 l 180 -105 b 271 -23 217 -94 248 -65 l 271 -517 l 315 -517 l 315 -23 b 405 -105 337 -65 369 -94 l 405 -517 l 449 -517 l 449 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 315 148 b 112 -4 274 148 236 -4 b 45 68 68 -4 45 20 l 0 68 b 135 -112 0 -53 45 -112 z',\n },\n accSagittalFlat7v11kDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 135 112 b 0 -68 45 112 0 53 l 45 -68 b 112 4 45 -20 68 4 b 292 -248 236 4 274 -148 b 475 4 315 -148 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 l 449 517 l 405 517 l 405 105 b 315 23 369 94 337 65 l 315 517 l 271 517 l 271 23 b 180 105 248 65 217 94 l 180 517 l 135 517 z',\n },\n accSagittalSharp17CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 203 -23 b 271 14 229 -23 251 -10 l 271 -517 l 315 -517 l 315 -23 b 405 -105 337 -65 369 -94 l 405 -517 l 449 -517 l 449 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 312 150 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalFlat17CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 b 475 4 312 -150 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 l 449 517 l 405 517 l 405 105 b 315 23 369 94 337 65 l 315 517 l 271 517 l 271 -14 b 203 23 251 10 229 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalSharp55CUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -517 l 45 78 l 135 10 l 135 -517 l 180 -517 l 180 -23 l 271 -92 l 271 -517 l 315 -517 l 315 -127 l 495 -264 l 495 -112 l 23 248 l 0 248 l 0 -517 z',\n },\n accSagittalFlat55CDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 517 l 0 -248 l 23 -248 l 495 112 l 495 264 l 315 127 l 315 517 l 271 517 l 271 92 l 180 23 l 180 517 l 135 517 l 135 -10 l 45 -78 l 45 517 z',\n },\n accSagittalSharp7v11CUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 86 45 6 89 58 l 180 -517 l 225 -517 l 225 98 b 315 109 252 104 282 108 l 315 -517 l 360 -517 l 360 112 l 449 112 l 449 -517 l 495 -517 l 495 248 l 360 248 b 0 68 121 248 0 189 z',\n },\n accSagittalFlat7v11CDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 360 -248 0 -189 121 -248 l 495 -248 l 495 517 l 449 517 l 449 -112 l 360 -112 l 360 517 l 315 517 l 315 -109 b 225 -98 282 -108 252 -104 l 225 517 l 180 517 l 180 -86 b 45 68 89 -58 45 -6 l 45 248 l 0 248 z',\n },\n accSagittalSharp5v11SUp: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 -23 b 449 -105 383 -65 415 -94 l 449 -517 l 495 -517 l 495 -112 b 631 68 585 -112 631 -53 l 585 68 b 520 -4 585 20 563 -4 b 337 248 396 -4 360 150 l 225 248 b 0 68 76 248 0 187 z',\n },\n accSagittalFlat5v11SDown: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 225 -248 0 -187 76 -248 l 337 -248 b 520 4 360 -150 396 4 b 585 -68 563 4 585 -20 l 631 -68 b 495 112 631 53 585 112 l 495 517 l 449 517 l 449 105 b 360 23 415 94 383 65 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z',\n },\n accSagittalDoubleSharp5v11SDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 203 -23 b 262 4 225 -23 245 -13 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 341 -60 b 449 -112 370 -95 405 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 312 150 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalDoubleFlat5v11SUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 b 475 4 312 -150 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 b 341 60 405 112 370 95 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 262 -4 b 203 23 245 13 225 23 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalDoubleSharp7v11CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 112 -112 b 193 -73 143 -112 170 -99 l 45 -501 l 95 -517 l 248 -81 l 397 -517 l 449 -503 l 275 0 l 278 4 b 337 -23 295 -13 315 -23 l 405 -23 b 495 -203 465 -23 495 -84 l 540 -203 b 428 68 540 -23 503 68 l 360 68 b 248 248 310 68 271 127 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 112 -112 0 -52 36 -112 z',\n },\n accSagittalDoubleFlat7v11CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 112 112 b 0 -68 36 112 0 52 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 b 360 -68 271 -127 310 -68 l 428 -68 b 540 203 503 -68 540 23 l 495 203 b 405 23 495 84 465 23 l 337 23 b 278 -4 315 23 295 13 l 275 0 l 449 503 l 397 517 l 248 81 l 95 517 l 45 501 l 193 73 b 112 112 170 99 143 112 z',\n },\n accSagittalDoubleSharp55CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 428 248 l 0 -112 l 0 -266 l 307 -7 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 366 0 l 386 59 l 449 112 l 449 248 z',\n },\n accSagittalDoubleFlat55CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 449 -248 l 449 -112 l 386 -59 l 366 0 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 307 7 l 0 266 l 0 112 l 428 -248 z',\n },\n accSagittalDoubleSharp17CDown: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -248 l 45 -68 b 271 112 45 53 120 112 l 310 0 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 387 -62 b 495 -112 416 -95 452 -112 b 631 68 585 -112 631 -53 l 585 68 b 520 -4 585 20 563 -4 b 337 248 396 -4 360 150 l 225 248 b 0 68 76 248 0 187 l 0 -248 z',\n },\n accSagittalDoubleFlat17CUp: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 248 l 0 -68 b 225 -248 0 -187 76 -248 l 337 -248 b 520 4 360 -150 396 4 b 585 -68 563 4 585 -20 l 631 -68 b 495 112 631 53 585 112 b 387 62 452 112 416 95 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 310 0 l 271 -112 b 45 68 120 -112 45 -53 l 45 248 z',\n },\n accSagittalDoubleSharp7v11kDown: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -30 l 366 96 l 399 0 l 392 -23 l 0 -157 l 0 -255 l 353 -135 l 225 -503 l 276 -517 l 428 -82 l 579 -517 l 631 -503 l 455 0 l 507 145 l 540 157 l 540 248 l 517 248 z m 416 115 l 442 124 l 428 82 z',\n },\n accSagittalDoubleFlat7v11kUp: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 517 -248 l 540 -248 l 540 -157 l 507 -145 l 455 0 l 631 503 l 579 517 l 428 82 l 276 517 l 225 503 l 353 135 l 0 255 l 0 157 l 392 23 l 399 0 l 366 -96 l 0 30 l 0 -68 z m 428 -82 l 442 -124 l 416 -115 z',\n },\n accSagittal23CommaUp: {\n x_min: 0,\n x_max: 188,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -4 b 68 -23 53 -17 60 -23 l 180 -23 b 225 -203 210 -23 225 -82 l 271 -203 b 206 68 271 -23 248 68 l 89 68 b 23 248 71 68 48 127 l 0 248 z',\n },\n accSagittal23CommaDown: {\n x_min: 0,\n x_max: 188,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 b 89 -68 48 -127 71 -68 l 206 -68 b 271 203 248 -68 271 23 l 225 203 b 180 23 225 82 210 23 l 68 23 b 45 4 60 23 53 17 l 45 517 l 0 517 z',\n },\n accSagittal5v19CommaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -284 l 180 33 l 180 -517 l 225 -517 l 225 248 l 203 248 b 86 112 151 157 112 112 b 45 157 59 112 45 127 l 0 157 b 76 23 0 72 26 27 l 0 -112 z',\n },\n accSagittal5v19CommaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 76 -23 b 0 -157 26 -27 0 -72 l 45 -157 b 86 -112 45 -127 59 -112 b 203 -248 112 -112 151 -157 l 225 -248 l 225 517 l 180 517 l 180 -33 l 0 284 z',\n },\n accSagittal5v23SmallDiesisUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -284 l 180 33 l 180 -517 l 225 -517 l 225 -4 b 248 -23 233 -17 240 -23 l 360 -23 b 405 -203 390 -23 405 -82 l 449 -203 b 386 68 449 -23 428 68 l 271 68 b 203 248 251 68 228 127 l 0 -112 z',\n },\n accSagittal5v23SmallDiesisDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 203 -248 b 271 -68 228 -127 251 -68 l 386 -68 b 449 203 428 -68 449 23 l 405 203 b 360 23 405 82 390 23 l 248 23 b 225 4 240 23 233 17 l 225 517 l 180 517 l 180 -33 l 0 284 z',\n },\n accSagittalSharp5v23SDown: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 6 b 89 -23 59 -13 73 -23 l 180 -23 l 180 -517 l 225 -517 l 225 -23 l 292 -23 b 360 -203 337 -23 360 -84 l 405 -203 b 315 68 405 -23 374 68 l 112 68 b 23 248 78 68 48 127 l 0 248 z',\n },\n accSagittalFlat5v23SUp: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 b 112 -68 48 -127 78 -68 l 315 -68 b 405 203 374 -68 405 23 l 360 203 b 292 23 360 84 337 23 l 225 23 l 225 517 l 180 517 l 180 23 l 89 23 b 45 -6 73 23 59 13 l 45 517 l 0 517 z',\n },\n accSagittalSharp5v19CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 89 -112 0 -52 30 -112 l 89 -517 l 135 -517 l 135 -95 b 225 112 173 -65 203 4 l 271 112 l 271 -517 l 315 -517 l 315 107 b 405 -68 374 89 405 30 l 405 -248 l 449 -248 l 449 68 b 315 248 449 189 405 248 l 203 248 b 101 0 173 98 138 16 b 81 -3 94 0 86 -3 b 45 68 56 -3 45 23 z',\n },\n accSagittalFlat5v19CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 81 3 45 -23 56 3 b 101 0 86 3 94 0 b 203 -248 138 -16 173 -98 l 315 -248 b 449 -68 405 -248 449 -189 l 449 248 l 405 248 l 405 68 b 315 -107 405 -30 374 -89 l 315 517 l 271 517 l 271 -112 l 225 -112 b 135 95 203 -4 173 65 l 135 517 l 89 517 l 89 112 b 0 -68 30 112 0 52 z',\n },\n accSagittalSharp23CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 135 -82 l 135 -517 l 180 -517 l 180 -17 l 239 68 b 315 -23 261 7 287 -23 l 315 -517 l 360 -517 l 360 -23 l 428 -23 b 495 -203 472 -23 495 -84 l 540 -203 b 449 68 540 -23 510 68 l 337 68 b 248 248 302 68 271 127 l 0 -112 l 0 -276 z',\n },\n accSagittalFlat23CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 276 l 0 112 l 248 -248 b 337 -68 271 -127 302 -68 l 449 -68 b 540 203 510 -68 540 23 l 495 203 b 428 23 495 84 472 23 l 360 23 l 360 517 l 315 517 l 315 23 b 239 -68 287 23 261 -7 l 180 17 l 180 517 l 135 517 l 135 82 z',\n },\n accSagittalSharp23CUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 14 b 112 -23 63 -10 86 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 l 271 -517 l 315 -517 l 315 -23 l 360 -23 b 449 -203 420 -23 449 -84 l 495 -203 b 383 68 495 -23 458 68 l 135 68 b 23 248 85 68 48 127 l 0 248 z',\n },\n accSagittalFlat23CDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 b 135 -68 48 -127 85 -68 l 383 -68 b 495 203 458 -68 495 23 l 449 203 b 360 23 449 84 420 23 l 315 23 l 315 517 l 271 517 l 271 23 l 180 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 -14 86 23 63 10 l 45 517 l 0 517 z',\n },\n accSagittalSharp5v19CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -266 l 135 -153 l 135 -517 l 180 -517 l 180 -115 l 271 -39 l 271 -517 l 315 -517 l 315 0 l 405 75 l 405 -517 l 449 -517 l 449 248 l 428 248 b 130 68 285 127 186 68 b 45 157 73 68 45 98 l 0 157 b 112 -20 0 53 37 -6 z',\n },\n accSagittalFlat5v19CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 112 20 b 0 -157 37 6 0 -53 l 45 -157 b 130 -68 45 -98 73 -68 b 428 -248 186 -68 285 -127 l 449 -248 l 449 517 l 405 517 l 405 -75 l 315 0 l 315 517 l 271 517 l 271 39 l 180 115 l 180 517 l 135 517 l 135 153 l 0 266 l 0 112 z',\n },\n accSagittalSharp5v23SUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 135 -108 l 135 -517 l 180 -517 l 180 -53 l 271 58 l 271 -517 l 315 -517 l 315 14 b 383 -23 334 -10 357 -23 l 405 -23 l 405 -517 l 449 -517 l 449 -23 b 540 -203 510 -23 540 -84 l 585 -203 b 472 68 585 -23 547 68 l 405 68 b 292 248 356 68 318 127 l 0 -112 l 0 -274 z',\n },\n accSagittalFlat5v23SDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 274 l 0 112 l 292 -248 b 405 -68 318 -127 356 -68 l 472 -68 b 585 203 547 -68 585 23 l 540 203 b 449 23 540 84 510 23 l 449 517 l 405 517 l 405 23 l 383 23 b 315 -14 357 23 334 10 l 315 517 l 271 517 l 271 -58 l 180 53 l 180 517 l 135 517 l 135 108 z',\n },\n accSagittalDoubleSharp5v23SDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 52 -517 l 203 -81 l 354 -517 l 405 -503 l 239 -23 l 449 -23 b 540 -203 510 -23 540 -84 l 585 -203 b 472 68 585 -23 547 68 l 225 68 b 112 248 176 68 138 127 l 89 248 l 89 112 b 170 -14 109 45 135 0 l 0 -501 z',\n },\n accSagittalDoubleFlat5v23SUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 501 l 170 14 b 89 -112 135 0 109 -45 l 89 -248 l 112 -248 b 225 -68 138 -127 176 -68 l 472 -68 b 585 203 547 -68 585 23 l 540 203 b 449 23 540 84 510 23 l 239 23 l 405 503 l 354 517 l 203 81 l 52 517 z',\n },\n accSagittalDoubleSharp5v19CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 112 -112 0 -52 36 -112 b 193 -73 143 -112 170 -99 l 45 -501 l 95 -517 l 248 -81 l 397 -517 l 449 -501 l 275 0 l 315 112 b 495 -68 435 112 495 53 l 495 -248 l 540 -248 l 540 68 b 360 248 540 189 480 248 l 248 248 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 z',\n },\n accSagittalDoubleFlat5v19CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 l 360 -248 b 540 -68 480 -248 540 -189 l 540 248 l 495 248 l 495 68 b 315 -112 495 -53 435 -112 l 275 0 l 449 501 l 397 517 l 248 81 l 95 517 l 45 501 l 193 73 b 112 112 170 99 143 112 b 0 -68 36 112 0 52 z',\n },\n accSagittalDoubleSharp23CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 252 35 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 323 4 b 383 -23 340 -13 360 -23 l 449 -23 b 540 -203 510 -23 540 -84 l 585 -203 b 472 68 585 -23 547 68 l 405 68 b 292 248 356 68 318 127 l 0 -112 l 0 -274 z',\n },\n accSagittalDoubleFlat23CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 274 l 0 112 l 292 -248 b 405 -68 318 -127 356 -68 l 472 -68 b 585 203 547 -68 585 23 l 540 203 b 449 23 540 84 510 23 l 383 23 b 323 -4 360 23 340 13 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 252 -35 z',\n },\n accSagittal19SchismaUp: {\n x_min: 0,\n x_max: 125,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 68 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 248 l 157 248 b 79 0 127 98 101 16 b 68 -3 73 0 68 -3 b 45 68 52 -3 45 20 l 0 68 b 68 -112 0 -52 23 -112 z',\n },\n accSagittal19SchismaDown: {\n x_min: 0,\n x_max: 125,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 68 112 b 0 -68 23 112 0 52 l 45 -68 b 68 3 45 -20 52 3 b 79 0 68 3 73 0 b 157 -248 101 -16 127 -98 l 180 -248 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 z',\n },\n accSagittal17KleismaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 248 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z',\n },\n accSagittal17KleismaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 225 -248 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z',\n },\n accSagittal143CommaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -203 l 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 248 l 203 248 b 135 68 177 127 154 68 l 105 68 b 45 157 65 68 45 98 l 0 157 b 23 20 0 95 7 50 b 0 -203 7 -23 0 -98 z',\n },\n accSagittal143CommaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 23 -20 0 98 7 23 b 0 -157 7 -50 0 -95 l 45 -157 b 105 -68 45 -98 65 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 225 -248 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z',\n },\n accSagittal11v49CommaUp: {\n x_min: 0,\n x_max: 188,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -292 b 89 -157 45 -203 60 -157 l 203 -157 b 225 -143 210 -157 217 -153 l 225 -517 l 271 -517 l 271 248 l 248 248 b 180 157 233 187 210 157 l 68 157 b 0 -68 23 157 0 82 l 45 -68 b 89 68 45 23 60 68 l 203 68 b 225 84 209 68 216 72 l 225 -36 b 180 -68 213 -58 199 -68 l 68 -68 b 0 -292 23 -68 0 -143 z',\n },\n accSagittal11v49CommaDown: {\n x_min: 0,\n x_max: 188,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 292 b 68 68 0 143 23 68 l 180 68 b 225 36 199 68 213 58 l 225 -84 b 203 -68 216 -72 209 -68 l 89 -68 b 45 68 60 -68 45 -23 l 0 68 b 68 -157 0 -82 23 -157 l 180 -157 b 248 -248 210 -157 233 -187 l 271 -248 l 271 517 l 225 517 l 225 143 b 203 157 217 153 210 157 l 89 157 b 45 292 60 157 45 203 z',\n },\n accSagittal19CommaUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 68 -112 0 -52 23 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 -4 b 203 -23 187 -17 196 -23 l 315 -23 b 360 -203 346 -23 360 -82 l 405 -203 b 341 68 405 -23 383 68 l 225 68 b 157 248 206 68 183 127 b 79 0 127 98 101 16 b 68 -3 73 0 68 -3 b 45 68 52 -3 45 20 z',\n },\n accSagittal19CommaDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 68 3 45 -20 52 3 b 79 0 68 3 73 0 b 157 -248 101 -16 127 -98 b 225 -68 183 -127 206 -68 l 341 -68 b 405 203 383 -68 405 23 l 360 203 b 315 23 360 82 346 23 l 203 23 b 180 4 196 23 187 17 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 b 0 -68 23 112 0 52 z',\n },\n accSagittal7v19CommaUp: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 68 -112 0 -52 23 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 112 l 225 112 b 315 -68 285 112 315 53 l 315 -248 l 360 -248 l 360 68 b 271 248 360 187 330 248 l 157 248 b 79 0 127 98 101 16 b 68 -3 73 0 68 -3 b 45 68 52 -3 45 20 z',\n },\n accSagittal7v19CommaDown: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 68 3 45 -20 52 3 b 79 0 68 3 73 0 b 157 -248 101 -16 127 -98 l 271 -248 b 360 -68 330 -248 360 -187 l 360 248 l 315 248 l 315 68 b 225 -112 315 -53 285 -112 l 180 -112 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 b 0 -68 23 112 0 52 z',\n },\n accSagittal49SmallDiesisUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -203 l 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -68 330 112 360 53 l 360 -248 l 405 -248 l 405 68 b 315 248 405 187 374 248 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z',\n },\n accSagittal49SmallDiesisDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 315 -248 b 405 -68 374 -248 405 -187 l 405 248 l 360 248 l 360 68 b 271 -112 360 -53 330 -112 l 225 -112 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z',\n },\n accSagittal23SmallDiesisUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 58 l 495 -274 l 495 -112 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z',\n },\n accSagittal23SmallDiesisDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 495 112 l 495 274 l 225 -58 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z',\n },\n accSagittal5v13MediumDiesisUp: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -259 l 315 -89 l 315 -517 l 360 -517 l 360 248 l 337 248 b 128 180 253 203 184 180 b 45 248 73 180 45 203 l 0 248 b 52 95 0 170 17 120 l 0 68 l 0 -33 l 315 135 l 315 10 l 0 -157 z',\n },\n accSagittal5v13MediumDiesisDown: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 157 l 315 -10 l 315 -135 l 0 33 l 0 -68 l 52 -95 b 0 -248 17 -120 0 -170 l 45 -248 b 128 -180 45 -203 73 -180 b 337 -248 184 -180 253 -203 l 360 -248 l 360 517 l 315 517 l 315 89 l 0 259 z',\n },\n accSagittal11v19MediumDiesisUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 -4 b 292 -23 278 -17 285 -23 l 405 -23 b 449 -203 435 -23 449 -82 l 495 -203 b 431 68 495 -23 472 68 l 315 68 b 248 248 295 68 271 127 l 135 248 b 0 68 45 248 0 187 l 0 -248 z',\n },\n accSagittal11v19MediumDiesisDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 248 l 0 -68 b 135 -248 0 -187 45 -248 l 248 -248 b 315 -68 271 -127 295 -68 l 431 -68 b 495 203 472 -68 495 23 l 449 203 b 405 23 449 82 435 23 l 292 23 b 271 4 285 23 278 17 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 z',\n },\n accSagittal49MediumDiesisUp: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -68 l 0 -248 l 45 -248 l 315 -94 l 315 -517 l 360 -517 l 360 248 l 225 248 b 0 -68 75 248 0 143 z m 45 -68 b 225 112 45 53 105 112 l 315 112 l 315 10 l 45 -145 z',\n },\n accSagittal49MediumDiesisDown: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 68 b 225 -248 0 -143 75 -248 l 360 -248 l 360 517 l 315 517 l 315 94 l 45 248 l 0 248 z m 45 145 l 315 -10 l 315 -112 l 225 -112 b 45 68 105 -112 45 -53 z',\n },\n accSagittal5v49MediumDiesisUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -89 l 0 -248 l 225 53 l 225 -517 l 271 -517 l 271 53 l 495 -248 l 495 -89 l 248 248 b 89 89 170 143 118 89 b 45 157 60 89 45 112 l 0 157 b 68 3 0 68 23 16 z',\n },\n accSagittal5v49MediumDiesisDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 68 -3 b 0 -157 23 -16 0 -68 l 45 -157 b 89 -89 45 -112 60 -89 b 248 -248 118 -89 170 -143 l 495 89 l 495 248 l 271 -53 l 271 517 l 225 517 l 225 -53 l 0 248 l 0 89 z',\n },\n accSagittal49LargeDiesisUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -89 l 360 -248 l 405 -248 l 405 -68 b 180 248 405 143 330 248 l 0 248 z m 45 12 l 45 112 l 180 112 b 360 -68 300 112 360 53 l 360 -147 z',\n },\n accSagittal49LargeDiesisDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 180 -248 b 405 68 330 -248 405 -143 l 405 248 l 360 248 l 45 89 l 45 517 l 0 517 z m 360 147 l 360 68 b 180 -112 360 -53 300 -112 l 45 -112 l 45 -12 z',\n },\n accSagittal11v19LargeDiesisUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -86 l 449 -256 l 449 -157 l 45 13 l 45 138 l 449 -30 l 449 68 l 23 248 l 0 248 z',\n },\n accSagittal11v19LargeDiesisDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 l 449 -68 l 449 30 l 45 -138 l 45 -13 l 449 157 l 449 256 l 45 86 l 45 517 l 0 517 z',\n },\n accSagittal5v13LargeDiesisUp: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 89 -112 0 -52 30 -112 b 180 -35 125 -112 157 -86 l 180 -517 l 225 -517 l 225 -86 l 631 -256 l 631 -157 l 225 13 l 225 138 l 631 -30 l 631 68 l 203 248 b 101 0 173 98 138 16 b 81 -3 94 0 86 -3 b 45 68 56 -3 45 20 z',\n },\n accSagittal5v13LargeDiesisDown: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 81 3 45 -20 56 3 b 101 0 86 3 94 0 b 203 -248 138 -16 173 -98 l 631 -68 l 631 30 l 225 -138 l 225 -13 l 631 157 l 631 256 l 225 86 l 225 517 l 180 517 l 180 35 b 89 112 157 86 125 112 b 0 -68 30 112 0 52 z',\n },\n accSagittalSharp23SDown: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -203 l 45 -203 b 112 -23 45 -84 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 b 315 6 287 -23 301 -13 l 315 -517 l 360 -517 l 360 248 l 337 248 b 248 68 312 127 282 68 l 194 68 b 89 157 125 68 89 98 l 45 157 b 60 59 45 118 50 85 b 0 -203 20 30 0 -56 z',\n },\n accSagittalFlat23SUp: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 60 -59 0 56 20 -30 b 45 -157 50 -85 45 -118 l 89 -157 b 194 -68 89 -98 125 -68 l 248 -68 b 337 -248 282 -68 312 -127 l 360 -248 l 360 517 l 315 517 l 315 -6 b 271 23 301 13 287 23 l 180 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 84 z',\n },\n accSagittalSharp49SDown: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -292 l 45 -292 b 112 -157 45 -203 68 -157 l 135 -157 l 135 -517 l 180 -517 l 180 -157 l 271 -157 b 315 -135 285 -157 300 -150 l 315 -517 l 360 -517 l 360 248 l 337 248 b 248 157 323 187 292 157 l 89 157 b 0 -68 30 157 0 82 l 45 -68 b 112 68 45 23 68 68 l 271 68 b 315 89 284 68 300 75 l 315 -32 b 248 -68 298 -56 275 -68 l 89 -68 b 0 -292 29 -68 0 -143 z',\n },\n accSagittalFlat49SUp: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 292 b 89 68 0 143 29 68 l 248 68 b 315 32 275 68 298 56 l 315 -89 b 271 -68 300 -75 284 -68 l 112 -68 b 45 68 68 -68 45 -23 l 0 68 b 89 -157 0 -82 30 -157 l 248 -157 b 337 -248 292 -157 323 -187 l 360 -248 l 360 517 l 315 517 l 315 135 b 271 157 300 150 285 157 l 180 157 l 180 517 l 135 517 l 135 157 l 112 157 b 45 292 68 157 45 203 z',\n },\n accSagittalSharp7v19CDown: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -271 l 135 -125 l 135 -517 l 180 -517 l 180 -78 l 315 65 l 315 -517 l 360 -517 l 360 248 l 337 248 b 118 89 239 143 166 89 b 45 157 68 89 45 112 l 0 157 b 89 -20 0 53 29 -6 z',\n },\n accSagittalFlat7v19CUp: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 20 b 0 -157 29 6 0 -53 l 45 -157 b 118 -89 45 -112 68 -89 b 337 -248 166 -89 239 -143 l 360 -248 l 360 517 l 315 517 l 315 -65 l 180 78 l 180 517 l 135 517 l 135 125 l 0 271 l 0 112 z',\n },\n accSagittalSharp19CDown: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 180 96 45 17 89 72 l 180 -517 l 225 -517 l 225 107 b 315 112 252 112 282 112 l 360 112 l 360 -517 l 405 -517 l 405 248 l 271 248 b 0 68 89 248 0 187 z',\n },\n accSagittalFlat19CUp: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 271 -248 0 -187 89 -248 l 405 -248 l 405 517 l 360 517 l 360 -112 l 315 -112 b 225 -107 282 -112 252 -112 l 225 517 l 180 517 l 180 -96 b 45 68 89 -72 45 -17 l 45 248 l 0 248 z',\n },\n accSagittalSharp11v49CDown: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 112 -23 45 -82 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 b 271 112 215 -23 245 23 l 315 112 l 315 -517 l 360 -517 l 360 107 b 449 -68 420 89 449 30 l 449 -248 l 495 -248 l 495 68 b 360 248 495 189 449 248 l 248 248 b 157 68 222 128 192 68 l 89 68 b 0 -203 30 68 0 -23 z',\n },\n accSagittalFlat11v49CUp: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 89 -68 0 23 30 -68 l 157 -68 b 248 -248 192 -68 222 -128 l 360 -248 b 495 -68 449 -248 495 -189 l 495 248 l 449 248 l 449 68 b 360 -107 449 -30 420 -89 l 360 517 l 315 517 l 315 -112 l 271 -112 b 180 23 245 -23 215 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 82 z',\n },\n accSagittalSharp143CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 112 -23 45 -84 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 b 259 76 210 -23 236 10 l 315 17 l 315 -517 l 360 -517 l 360 -30 l 585 -271 l 585 -112 l 248 248 b 157 68 222 127 192 68 l 89 68 b 0 -203 30 68 0 -23 z',\n },\n accSagittalFlat143CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 89 -68 0 23 30 -68 l 157 -68 b 248 -248 192 -68 222 -127 l 585 112 l 585 271 l 360 30 l 360 517 l 315 517 l 315 -17 l 259 -76 b 180 23 236 -10 210 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 84 z',\n },\n accSagittalSharp17kDown: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -157 l 0 -256 l 225 -161 l 225 -517 l 271 -517 l 271 -144 l 405 -86 l 405 -517 l 449 -517 l 449 248 l 428 248 b 145 171 305 196 210 171 b 45 248 78 171 45 196 l 0 248 b 79 101 0 170 26 121 l 0 68 l 0 -32 l 405 138 l 405 13 z',\n },\n accSagittalFlat17kUp: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 405 -13 l 405 -138 l 0 32 l 0 -68 l 79 -101 b 0 -248 26 -121 0 -170 l 45 -248 b 145 -171 45 -196 78 -171 b 428 -248 210 -171 305 -196 l 449 -248 l 449 517 l 405 517 l 405 86 l 271 144 l 271 517 l 225 517 l 225 161 l 0 256 l 0 157 z',\n },\n accSagittalSharp19sDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 180 109 45 36 89 95 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -23 295 23 325 -23 l 360 -517 l 405 -517 l 405 -23 l 472 -23 b 540 -203 517 -23 540 -84 l 585 -203 b 495 68 585 -23 554 68 l 383 68 b 292 248 348 68 318 127 l 180 248 b 0 68 60 248 0 187 z',\n },\n accSagittalFlat19sUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 180 -248 0 -187 60 -248 l 292 -248 b 383 -68 318 -127 348 -68 l 495 -68 b 585 203 554 -68 585 23 l 540 203 b 472 23 540 84 517 23 l 405 23 l 405 517 l 360 517 l 360 23 b 271 -112 325 23 295 -23 l 225 -112 l 225 517 l 180 517 l 180 -109 b 45 68 89 -95 45 -36 l 45 248 l 0 248 z',\n },\n accSagittalSharp19sUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 89 -96 l 89 -517 l 135 -517 l 135 -108 b 180 -112 148 -112 163 -112 b 225 -108 196 -112 210 -112 l 225 -517 l 271 -517 l 271 -94 b 360 -12 305 -78 337 -50 l 360 -517 l 405 -517 l 405 248 l 383 248 b 190 0 353 98 288 16 b 138 -3 171 0 153 -3 b 45 68 75 -3 45 20 l 0 68 b 89 -96 0 -17 30 -72 z',\n },\n accSagittalFlat19sDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 96 b 0 -68 30 72 0 17 l 45 -68 b 138 3 45 -20 75 3 b 190 0 153 3 171 0 b 383 -248 288 -16 353 -98 l 405 -248 l 405 517 l 360 517 l 360 12 b 271 94 337 50 305 78 l 271 517 l 225 517 l 225 108 b 180 112 210 112 196 112 b 135 108 163 112 148 112 l 135 517 l 89 517 z',\n },\n accSagittalSharp17kUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 l 271 -517 l 315 -517 l 315 -23 l 337 -23 b 405 14 363 -23 386 -10 l 405 -517 l 449 -517 l 449 248 l 428 248 b 315 68 402 127 364 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalFlat17kDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 315 -68 b 428 -248 364 -68 402 -127 l 449 -248 l 449 517 l 405 517 l 405 -14 b 337 23 386 10 363 23 l 315 23 l 315 517 l 271 517 l 271 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalSharp143CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 l 271 -517 l 315 -517 l 315 -23 l 337 -23 b 405 14 363 -23 386 -10 l 405 -517 l 449 -517 l 449 248 l 428 248 b 315 68 402 127 364 68 l 240 68 b 89 157 140 68 89 98 l 45 157 b 68 53 45 115 52 81 b 0 -203 23 23 0 -63 z',\n },\n accSagittalFlat143CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -53 0 63 23 -23 b 45 -157 52 -81 45 -115 l 89 -157 b 240 -68 89 -98 140 -68 l 315 -68 b 428 -248 364 -68 402 -127 l 449 -248 l 449 517 l 405 517 l 405 -14 b 337 23 386 10 363 23 l 315 23 l 315 517 l 271 517 l 271 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalSharp11v49CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -68 b 135 68 45 23 76 68 l 337 68 b 405 95 363 68 386 76 l 405 -27 b 315 -68 386 -55 356 -68 l 112 -68 b 0 -292 37 -68 0 -143 l 45 -292 b 135 -157 45 -203 75 -157 l 135 -517 l 180 -517 l 180 -157 l 271 -157 l 271 -517 l 315 -517 l 315 -157 l 337 -157 b 405 -130 360 -157 383 -148 l 405 -517 l 449 -517 l 449 248 l 428 248 b 315 157 413 187 376 157 l 112 157 b 0 -68 37 157 0 82 z',\n },\n accSagittalFlat11v49CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 68 b 112 -157 0 -82 37 -157 l 315 -157 b 428 -248 376 -157 413 -187 l 449 -248 l 449 517 l 405 517 l 405 130 b 337 157 383 148 360 157 l 315 157 l 315 517 l 271 517 l 271 157 l 180 157 l 180 517 l 135 517 l 135 157 b 45 292 75 157 45 203 l 0 292 b 112 68 0 143 37 68 l 315 68 b 405 27 356 68 386 55 l 405 -95 b 337 -68 386 -76 363 -68 l 135 -68 b 45 68 76 -68 45 -23 z',\n },\n accSagittalSharp19CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 89 -109 l 89 -517 l 135 -517 l 135 -109 b 225 -27 170 -102 200 -75 l 225 -517 l 271 -517 l 271 14 b 337 -23 289 -10 311 -23 l 360 -23 l 360 -517 l 405 -517 l 405 -23 b 495 -203 465 -23 495 -82 l 540 -203 b 428 68 540 -23 503 68 l 360 68 b 248 248 310 68 271 128 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 89 -109 0 -39 30 -98 z',\n },\n accSagittalFlat19CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 109 b 0 -68 30 98 0 39 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 b 360 -68 271 -128 310 -68 l 428 -68 b 540 203 503 -68 540 23 l 495 203 b 405 23 495 82 465 23 l 405 517 l 360 517 l 360 23 l 337 23 b 271 -14 311 23 289 10 l 271 517 l 225 517 l 225 27 b 135 109 200 75 170 102 l 135 517 l 89 517 z',\n },\n accSagittalSharp7v19CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 89 -109 l 89 -517 l 135 -517 l 135 -109 b 225 -27 170 -102 200 -75 l 225 -517 l 271 -517 l 271 112 l 315 112 b 360 109 331 112 346 112 l 360 -517 l 405 -517 l 405 98 b 495 -68 465 73 495 19 l 495 -248 l 540 -248 l 540 68 b 360 248 540 189 480 248 l 248 248 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 89 -109 0 -39 30 -98 z',\n },\n accSagittalFlat7v19CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 109 b 0 -68 30 98 0 39 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 l 360 -248 b 540 -68 480 -248 540 -189 l 540 248 l 495 248 l 495 68 b 405 -98 495 -19 465 -73 l 405 517 l 360 517 l 360 -109 b 315 -112 346 -112 331 -112 l 271 -112 l 271 517 l 225 517 l 225 27 b 135 109 200 75 170 102 l 135 517 l 89 517 z',\n },\n accSagittalSharp49SUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 203 -23 b 271 14 229 -23 251 -10 l 271 -517 l 315 -517 l 315 112 l 360 112 b 405 109 376 112 390 112 l 405 -517 l 449 -517 l 449 96 b 540 -68 510 72 540 17 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalFlat49SDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 449 -96 540 -17 510 -72 l 449 517 l 405 517 l 405 -109 b 360 -112 390 -112 376 -112 l 315 -112 l 315 517 l 271 517 l 271 -14 b 203 23 251 10 229 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalSharp23SUp: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 203 -23 b 271 14 229 -23 251 -10 l 271 -517 l 315 -517 l 315 71 l 405 -14 l 405 -517 l 449 -517 l 449 -56 l 675 -268 l 675 -112 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalFlat23SDown: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 675 112 l 675 268 l 449 56 l 449 517 l 405 517 l 405 14 l 315 -71 l 315 517 l 271 517 l 271 -14 b 203 23 251 10 229 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalSharp5v13MUp: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 495 141 l 495 14 l 0 -157 l 0 -256 l 225 -180 l 225 -517 l 271 -517 l 271 -161 l 360 -130 l 360 -517 l 405 -517 l 405 -115 l 495 -84 l 495 -517 l 540 -517 l 540 248 l 517 248 b 167 168 366 194 248 168 b 45 248 85 168 45 194 l 0 248 b 95 99 0 170 30 120 l 0 68 l 0 -30 z',\n },\n accSagittalFlat5v13MDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 30 l 0 -68 l 95 -99 b 0 -248 30 -120 0 -170 l 45 -248 b 167 -168 45 -194 85 -168 b 517 -248 248 -168 366 -194 l 540 -248 l 540 517 l 495 517 l 495 84 l 405 115 l 405 517 l 360 517 l 360 130 l 271 161 l 271 517 l 225 517 l 225 180 l 0 256 l 0 157 l 495 -14 l 495 -141 z',\n },\n accSagittalSharp11v19MUp: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 14 b 428 -23 379 -10 402 -23 l 449 -23 l 449 -517 l 495 -517 l 495 -23 b 585 -203 554 -23 585 -84 l 631 -203 b 517 68 631 -23 593 68 l 449 68 b 337 248 400 68 363 127 l 225 248 b 0 68 75 248 0 187 z',\n },\n accSagittalFlat11v19MDown: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 337 -248 b 449 -68 363 -127 400 -68 l 517 -68 b 631 203 593 -68 631 23 l 585 203 b 495 23 585 84 554 23 l 495 517 l 449 517 l 449 23 l 428 23 b 360 -14 402 23 379 10 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z',\n },\n accSagittalSharp49MUp: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 225 -180 l 225 -517 l 271 -517 l 271 -166 l 360 -132 l 360 -517 l 405 -517 l 405 -117 l 495 -84 l 495 -517 l 540 -517 l 540 248 l 360 248 b 0 -68 120 248 0 143 z m 45 -145 l 45 -68 b 360 112 45 53 150 112 l 495 112 l 495 14 z',\n },\n accSagittalFlat49MDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 68 b 360 -248 0 -143 120 -248 l 540 -248 l 540 517 l 495 517 l 495 84 l 405 117 l 405 517 l 360 517 l 360 132 l 271 166 l 271 517 l 225 517 l 225 180 l 45 248 l 0 248 z m 495 -14 l 495 -112 l 360 -112 b 45 68 150 -112 45 -53 l 45 145 z',\n },\n accSagittalSharp5v49MUp: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -271 l 180 -79 l 180 -517 l 225 -517 l 225 -30 l 315 65 l 315 -517 l 360 -517 l 360 65 l 449 -30 l 449 -517 l 495 -517 l 495 -79 l 675 -271 l 675 -112 l 337 248 b 118 89 239 143 166 89 b 45 157 68 89 45 112 l 0 157 b 107 0 0 62 36 10 l 0 -112 z',\n },\n accSagittalFlat5v49MDown: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 107 0 b 0 -157 36 -10 0 -62 l 45 -157 b 118 -89 45 -112 68 -89 b 337 -248 166 -89 239 -143 l 675 112 l 675 271 l 495 79 l 495 517 l 449 517 l 449 30 l 360 -65 l 360 517 l 315 517 l 315 -65 l 225 30 l 225 517 l 180 517 l 180 79 l 0 271 z',\n },\n accSagittalSharp49LUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -82 l 135 -112 l 135 -517 l 180 -517 l 180 -127 l 271 -157 l 271 -517 l 315 -517 l 315 -173 l 540 -248 l 585 -248 l 585 -68 b 180 248 585 143 449 248 l 0 248 z m 45 112 l 180 112 b 540 -68 420 112 540 53 l 540 -145 l 45 16 z',\n },\n accSagittalFlat49LDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 180 -248 b 585 68 449 -248 585 -143 l 585 248 l 540 248 l 315 173 l 315 517 l 271 517 l 271 157 l 180 127 l 180 517 l 135 517 l 135 112 l 45 82 l 45 517 l 0 517 z m 45 -16 l 540 145 l 540 68 b 180 -112 540 -53 420 -112 l 45 -112 z',\n },\n accSagittalSharp11v19LUp: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -81 l 135 -108 l 135 -517 l 180 -517 l 180 -121 l 271 -148 l 271 -517 l 315 -517 l 315 -161 l 631 -255 l 631 -157 l 45 16 l 45 144 l 631 -30 l 631 68 l 23 248 l 0 248 z',\n },\n accSagittalFlat11v19LDown: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 l 631 -68 l 631 30 l 45 -144 l 45 -16 l 631 157 l 631 255 l 315 161 l 315 517 l 271 517 l 271 148 l 180 121 l 180 517 l 135 517 l 135 108 l 45 81 l 45 517 l 0 517 z',\n },\n accSagittalSharp5v13LUp: {\n x_min: 0,\n x_max: 500,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 89 -109 l 89 -517 l 135 -517 l 135 -109 b 225 -27 170 -102 200 -75 l 225 -517 l 271 -517 l 271 -85 l 360 -120 l 360 -517 l 405 -517 l 405 -135 l 720 -256 l 720 -157 l 271 14 l 271 141 l 720 -30 l 720 68 l 248 248 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 89 -109 0 -39 30 -98 z',\n },\n accSagittalFlat5v13LDown: {\n x_min: 0,\n x_max: 500,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 109 b 0 -68 30 98 0 39 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 l 720 -68 l 720 30 l 271 -141 l 271 -14 l 720 157 l 720 256 l 405 135 l 405 517 l 360 517 l 360 120 l 271 85 l 271 517 l 225 517 l 225 27 b 135 109 200 75 170 102 l 135 517 l 89 517 z',\n },\n accSagittalDoubleSharp23SDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -203 l 45 -203 b 135 -23 45 -82 76 -23 l 301 -23 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 370 -14 b 449 112 423 10 449 53 l 449 248 l 428 248 b 315 68 402 127 364 68 l 240 68 b 89 157 140 68 89 98 l 45 157 b 68 53 45 115 52 81 b 0 -203 23 23 0 -63 z',\n },\n accSagittalDoubleFlat23SUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -53 0 63 23 -23 b 45 -157 52 -81 45 -115 l 89 -157 b 240 -68 89 -98 140 -68 l 315 -68 b 428 -248 364 -68 402 -127 l 449 -248 l 449 -112 b 370 14 449 -53 423 -10 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 301 23 l 135 23 b 45 203 76 23 45 82 z',\n },\n accSagittalDoubleSharp49SDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -292 l 45 -292 b 112 -157 45 -203 68 -157 l 256 -157 l 135 -503 l 187 -517 l 337 -82 l 490 -517 l 540 -503 l 366 0 l 396 89 b 449 157 416 102 435 125 l 449 248 l 428 248 b 315 157 413 187 376 157 l 112 157 b 0 -68 39 157 0 82 l 45 -68 b 135 68 45 23 76 68 l 287 68 l 311 0 l 288 -68 l 89 -68 b 0 -292 32 -68 0 -144 z',\n },\n accSagittalDoubleFlat49SUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 292 b 89 68 0 144 32 68 l 288 68 l 311 0 l 287 -68 l 135 -68 b 45 68 76 -68 45 -23 l 0 68 b 112 -157 0 -82 39 -157 l 315 -157 b 428 -248 376 -157 413 -187 l 449 -248 l 449 -157 b 396 -89 435 -125 416 -102 l 366 0 l 540 503 l 490 517 l 337 82 l 187 517 l 135 503 l 256 157 l 112 157 b 45 292 68 157 45 203 z',\n },\n accSagittalDoubleSharp7v19CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -266 l 307 -7 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 366 0 l 386 59 l 449 112 l 449 248 l 428 248 b 130 68 285 127 186 68 b 45 157 73 68 45 98 l 0 157 b 112 -20 0 53 37 -6 z',\n },\n accSagittalDoubleFlat7v19CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 112 20 b 0 -157 37 6 0 -53 l 45 -157 b 130 -68 45 -98 73 -68 b 428 -248 186 -68 285 -127 l 449 -248 l 449 -112 l 386 -59 l 366 0 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 307 7 l 0 266 l 0 112 z',\n },\n accSagittalDoubleSharp19CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 315 109 45 36 135 95 l 354 0 l 180 -503 l 232 -517 l 383 -82 l 534 -517 l 585 -503 l 410 0 l 449 112 l 495 112 l 495 248 l 360 248 b 0 68 120 248 0 187 z m 372 112 l 393 112 l 383 82 z',\n },\n accSagittalDoubleFlat19CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 360 -248 0 -187 120 -248 l 495 -248 l 495 -112 l 449 -112 l 410 0 l 585 503 l 534 517 l 383 82 l 232 517 l 180 503 l 354 0 l 315 -109 b 45 68 135 -95 45 -36 l 45 248 l 0 248 z m 383 -82 l 393 -112 l 372 -112 z',\n },\n accSagittalDoubleSharp11v49CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 203 -23 b 262 4 225 -23 245 -13 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 360 112 b 540 -68 480 112 540 53 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalDoubleFlat11v49CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 360 -112 540 -53 480 -112 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 262 -4 b 203 23 245 13 225 23 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalDoubleSharp143CDown: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 203 -23 b 262 4 225 -23 245 -13 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 337 49 l 675 -268 l 675 -112 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalDoubleFlat143CUp: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 675 112 l 675 268 l 337 -49 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 262 -4 b 203 23 245 13 225 23 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalDoubleSharp17kDown: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 248 b 95 101 0 170 30 121 l 0 68 l 0 -30 l 364 96 l 399 0 l 390 -23 l 0 -157 l 0 -255 l 353 -135 l 225 -503 l 275 -517 l 428 -82 l 577 -517 l 631 -503 l 455 0 l 507 145 l 540 157 l 540 248 l 517 248 b 167 168 366 194 248 168 b 45 248 85 168 45 194 z m 416 115 l 442 124 l 428 82 z',\n },\n accSagittalDoubleFlat17kUp: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -248 b 167 -168 45 -194 85 -168 b 517 -248 248 -168 366 -194 l 540 -248 l 540 -157 l 507 -145 l 455 0 l 631 503 l 577 517 l 428 82 l 275 517 l 225 503 l 353 135 l 0 255 l 0 157 l 390 23 l 399 0 l 364 -96 l 0 30 l 0 -68 l 95 -101 b 0 -248 30 -121 0 -170 z m 428 -82 l 442 -124 l 416 -115 z',\n },\n accSagittalDoubleSharp19sDown: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 271 112 45 53 120 112 l 310 0 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 366 0 l 367 4 b 428 -23 386 -13 405 -23 l 495 -23 b 585 -203 554 -23 585 -84 l 631 -203 b 517 68 631 -23 593 68 l 449 68 b 337 248 400 68 363 127 l 225 248 b 0 68 75 248 0 187 z',\n },\n accSagittalDoubleFlat19sUp: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 337 -248 b 449 -68 363 -127 400 -68 l 517 -68 b 631 203 593 -68 631 23 l 585 203 b 495 23 585 84 554 23 l 428 23 b 367 -4 405 23 386 13 l 366 0 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 310 0 l 271 -112 b 45 68 120 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittalShaftUp: {\n x_min: 0,\n x_max: 31,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 112 l 0 -517 l 45 -517 l 45 112 l 23 248 z',\n },\n accSagittalShaftDown: {\n x_min: 0,\n x_max: 31,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 23 -248 l 45 -112 l 45 517 l 0 517 l 0 -112 z',\n },\n accSagittalAcute: {\n x_min: 0,\n x_max: 125,\n y_min: -62,\n y_max: 125,\n ha: 187,\n o: 'm 0 0 l 0 -89 l 180 89 l 180 180 z',\n },\n accSagittalGrave: {\n x_min: 0,\n x_max: 125,\n y_min: -125,\n y_max: 62,\n ha: 187,\n o: 'm 180 -180 l 180 -89 l 0 89 l 0 0 z',\n },\n accSagittal1MinaUp: {\n x_min: -7,\n x_max: 124,\n y_min: 16,\n y_max: 106.31676725154982,\n ha: 90.31676725154982,\n o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 134 150 179 112 163 135 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z',\n },\n accSagittal1MinaDown: {\n x_min: -7,\n x_max: 124,\n y_min: -106.31676725154983,\n y_max: -16,\n ha: 90.31676725154983,\n o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 179 -23 163 -135 179 -112 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z',\n },\n accSagittal2MinasUp: {\n x_min: -7,\n x_max: 218,\n y_min: 16,\n y_max: 106.31676725154982,\n ha: 90.31676725154982,\n o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 207 65 179 23 200 55 b 252 107 223 86 240 107 b 271 23 264 107 272 86 l 314 23 b 269 150 314 112 298 135 b 203 130 252 158 220 150 b 173 92 190 115 181 104 b 134 150 167 127 154 140 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z',\n },\n accSagittal2MinasDown: {\n x_min: -7,\n x_max: 218,\n y_min: -106.31676725154983,\n y_max: -16,\n ha: 90.31676725154983,\n o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 173 -92 154 -140 167 -127 b 203 -130 181 -104 190 -115 b 269 -150 220 -150 252 -158 b 314 -23 298 -135 314 -112 l 271 -23 b 252 -107 272 -86 264 -107 b 207 -65 240 -107 223 -86 b 179 -23 200 -55 179 -23 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z',\n },\n accSagittal1TinaUp: {\n x_min: 0,\n x_max: 93,\n y_min: 16,\n y_max: 107,\n ha: 91,\n o: 'm 134 154 l 91 154 b 81 76 91 101 91 86 b 0 68 73 69 48 68 l 0 23 b 134 154 122 23 134 36 z',\n },\n accSagittal1TinaDown: {\n x_min: 0,\n x_max: 93,\n y_min: -107,\n y_max: -16,\n ha: 91,\n o: 'm 134 -154 b 0 -23 134 -36 122 -23 l 0 -68 b 81 -76 48 -68 73 -69 b 91 -154 91 -86 91 -101 z',\n },\n accSagittal2TinasUp: {\n x_min: 0,\n x_max: 94,\n y_min: 16,\n y_max: 107,\n ha: 91,\n o: 'm 135 68 b 89 154 94 68 89 124 l 46 154 b 36 92 45 131 42 105 b 0 68 32 82 23 68 l 0 23 b 68 63 29 23 53 40 b 135 23 84 39 104 23 z',\n },\n accSagittal2TinasDown: {\n x_min: 0,\n x_max: 94,\n y_min: -107,\n y_max: -16,\n ha: 91,\n o: 'm 135 -23 b 68 -63 104 -23 84 -39 b 0 -23 53 -40 29 -23 l 0 -68 b 36 -92 23 -68 32 -82 b 46 -154 42 -105 45 -131 l 89 -154 b 135 -68 89 -124 94 -68 z',\n },\n accSagittal3TinasUp: {\n x_min: -7,\n x_max: 124,\n y_min: 16,\n y_max: 106.31676725154982,\n ha: 90.31676725154982,\n o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 134 150 179 112 163 135 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z',\n },\n accSagittal3TinasDown: {\n x_min: -7,\n x_max: 124,\n y_min: -106.31676725154983,\n y_max: -16,\n ha: 90.31676725154983,\n o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 179 -23 163 -135 179 -112 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z',\n },\n accSagittal4TinasUp: {\n x_min: 0,\n x_max: 187,\n y_min: 16,\n y_max: 106.69999999999997,\n ha: 90.69999999999997,\n o: 'm 0 68 l 0 23 b 143 45 105 23 124 26 b 203 107 153 55 183 107 b 226 23 216 107 226 86 l 269 23 b 225 150 269 112 253 135 b 160 132 207 158 181 153 b 115 81 138 112 124 88 b 0 68 104 71 94 68 z',\n },\n accSagittal4TinasDown: {\n x_min: 0,\n x_max: 187,\n y_min: -106.69999999999999,\n y_max: -16,\n ha: 90.69999999999999,\n o: 'm 0 -68 b 115 -81 94 -68 104 -71 b 160 -132 124 -88 138 -112 b 225 -150 181 -153 207 -158 b 269 -23 253 -135 269 -112 l 226 -23 b 203 -107 226 -86 216 -107 b 143 -45 183 -107 153 -55 b 0 -23 124 -26 105 -23 z',\n },\n accSagittal5TinasUp: {\n x_min: 0,\n x_max: 218,\n y_min: 16,\n y_max: 107,\n ha: 91,\n o: 'm 135 23 b 187 45 156 23 168 26 b 249 107 197 55 228 107 b 271 23 262 107 271 86 l 314 23 b 269 150 314 112 298 135 b 204 132 252 158 226 153 b 160 81 183 112 168 88 b 135 68 148 71 147 68 b 89 154 94 68 89 124 l 46 154 b 36 92 45 131 42 105 b 0 68 32 82 23 68 l 0 23 b 68 63 29 23 53 40 b 135 23 84 39 104 23 z',\n },\n accSagittal5TinasDown: {\n x_min: 0,\n x_max: 218,\n y_min: -107,\n y_max: -16,\n ha: 91,\n o: 'm 135 -23 b 68 -63 104 -23 84 -39 b 0 -23 53 -40 29 -23 l 0 -68 b 36 -92 23 -68 32 -82 b 46 -154 42 -105 45 -131 l 89 -154 b 135 -68 89 -124 94 -68 b 160 -81 147 -68 148 -71 b 204 -132 168 -88 183 -112 b 269 -150 226 -153 252 -158 b 314 -23 298 -135 314 -112 l 271 -23 b 249 -107 271 -86 262 -107 b 187 -45 228 -107 197 -55 b 135 -23 168 -26 156 -23 z',\n },\n accSagittal6TinasUp: {\n x_min: -7,\n x_max: 218,\n y_min: 16,\n y_max: 106.31676725154982,\n ha: 90.31676725154982,\n o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 207 65 179 23 200 55 b 252 107 223 86 240 107 b 271 23 264 107 272 86 l 314 23 b 269 150 314 112 298 135 b 203 130 252 158 220 150 b 173 92 190 115 181 104 b 134 150 167 127 154 140 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z',\n },\n accSagittal6TinasDown: {\n x_min: -7,\n x_max: 218,\n y_min: -106.31676725154983,\n y_max: -16,\n ha: 90.31676725154983,\n o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 173 -92 154 -140 167 -127 b 203 -130 181 -104 190 -115 b 269 -150 220 -150 252 -158 b 314 -23 298 -135 314 -112 l 271 -23 b 252 -107 272 -86 264 -107 b 207 -65 240 -107 223 -86 b 179 -23 200 -55 179 -23 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z',\n },\n accSagittal7TinasUp: {\n x_min: 0,\n x_max: 281,\n y_min: 16,\n y_max: 106.69999999999997,\n ha: 90.69999999999997,\n o: 'm 0 68 l 0 23 b 143 45 105 23 124 26 b 203 107 153 55 183 107 b 226 23 216 107 226 86 l 269 23 b 298 65 269 23 291 55 b 343 107 314 86 331 107 b 361 23 354 107 363 86 l 405 23 b 360 150 405 112 389 135 b 294 130 343 158 311 150 b 264 92 281 115 272 104 b 225 150 258 127 245 140 b 160 132 207 158 181 153 b 115 81 138 112 124 88 b 0 68 104 71 94 68 z',\n },\n accSagittal7TinasDown: {\n x_min: 0,\n x_max: 281,\n y_min: -106.69999999999999,\n y_max: -16,\n ha: 90.69999999999999,\n o: 'm 0 -68 b 115 -81 94 -68 104 -71 b 160 -132 124 -88 138 -112 b 225 -150 181 -153 207 -158 b 264 -92 245 -140 258 -127 b 294 -130 272 -104 281 -115 b 360 -150 311 -150 343 -158 b 405 -23 389 -135 405 -112 l 361 -23 b 343 -107 363 -86 354 -107 b 298 -65 331 -107 314 -86 b 269 -23 291 -55 269 -23 l 226 -23 b 203 -107 226 -86 216 -107 b 143 -45 183 -107 153 -55 b 0 -23 124 -26 105 -23 z',\n },\n accSagittal8TinasUp: {\n x_min: 0,\n x_max: 312,\n y_min: 16,\n y_max: 107,\n ha: 91,\n o: 'm 135 23 b 187 45 156 23 168 26 b 249 107 197 55 228 107 b 271 23 262 107 271 86 l 314 23 b 343 65 314 23 336 55 b 387 107 359 86 376 107 b 406 23 399 107 408 86 l 449 23 b 405 150 449 112 433 135 b 338 130 387 158 356 150 b 308 92 325 115 317 104 b 269 150 302 127 289 140 b 204 132 252 158 226 153 b 160 81 183 112 168 88 b 135 68 148 71 147 68 b 89 154 94 68 89 124 l 46 154 b 36 92 45 131 42 105 b 0 68 32 82 23 68 l 0 23 b 68 63 29 23 53 40 b 135 23 84 39 104 23 z',\n },\n accSagittal8TinasDown: {\n x_min: 0,\n x_max: 312,\n y_min: -107,\n y_max: -16,\n ha: 91,\n o: 'm 135 -23 b 68 -63 104 -23 84 -39 b 0 -23 53 -40 29 -23 l 0 -68 b 36 -92 23 -68 32 -82 b 46 -154 42 -105 45 -131 l 89 -154 b 135 -68 89 -124 94 -68 b 160 -81 147 -68 148 -71 b 204 -132 168 -88 183 -112 b 269 -150 226 -153 252 -158 b 308 -92 289 -140 302 -127 b 338 -130 317 -104 325 -115 b 405 -150 356 -150 387 -158 b 449 -23 433 -135 449 -112 l 406 -23 b 387 -107 408 -86 399 -107 b 343 -65 376 -107 359 -86 b 314 -23 336 -55 314 -23 l 271 -23 b 249 -107 271 -86 262 -107 b 187 -45 228 -107 197 -55 b 135 -23 168 -26 156 -23 z',\n },\n accSagittal9TinasUp: {\n x_min: -7,\n x_max: 312,\n y_min: 16,\n y_max: 106.31676725154982,\n ha: 90.31676725154982,\n o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 207 65 179 23 200 55 b 252 107 223 86 240 107 b 271 23 264 107 272 86 l 314 23 b 343 65 314 23 336 55 b 387 107 359 86 376 107 b 406 23 399 107 408 86 l 449 23 b 405 150 449 112 433 135 b 338 130 387 158 356 150 b 308 92 325 115 317 104 b 269 150 302 127 289 140 b 203 130 252 158 220 150 b 173 92 190 115 181 104 b 134 150 167 127 154 140 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z',\n },\n accSagittal9TinasDown: {\n x_min: -7,\n x_max: 312,\n y_min: -106.31676725154983,\n y_max: -16,\n ha: 90.31676725154983,\n o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 173 -92 154 -140 167 -127 b 203 -130 181 -104 190 -115 b 269 -150 220 -150 252 -158 b 308 -92 289 -140 302 -127 b 338 -130 317 -104 325 -115 b 405 -150 356 -150 387 -158 b 449 -23 433 -135 449 -112 l 406 -23 b 387 -107 408 -86 399 -107 b 343 -65 376 -107 359 -86 b 314 -23 336 -55 314 -23 l 271 -23 b 252 -107 272 -86 264 -107 b 207 -65 240 -107 223 -86 b 179 -23 200 -55 179 -23 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z',\n },\n accSagittalFractionalTinaUp: {\n x_min: -3,\n x_max: 35,\n y_min: 73,\n y_max: 111,\n ha: 38,\n o: 'm -4 132 b 23 105 -4 118 9 105 b 50 132 37 105 50 118 b 23 160 50 147 37 160 b -4 132 9 160 -4 147 z',\n },\n accSagittalFractionalTinaDown: {\n x_min: -3,\n x_max: 35,\n y_min: -111,\n y_max: -73,\n ha: 38,\n o: 'm -4 -132 b 23 -160 -4 -147 9 -160 b 50 -132 37 -160 50 -147 b 23 -105 50 -118 37 -105 b -4 -132 9 -105 -4 -118 z',\n },\n accidentalNarrowReversedFlat: {\n x_min: 0,\n x_max: 164,\n y_min: -194,\n y_max: 421,\n ha: 615,\n o: 'm 236 -279 l 236 606 l 192 606 l 192 179 b 85 243 150 222 114 243 b 0 84 23 243 0 134 b 112 -158 0 3 37 -78 z m 192 112 l 192 -163 l 135 -98 b 82 40 101 -50 82 -3 b 138 144 82 73 96 144 b 192 112 153 144 170 132 z',\n },\n accidentalNarrowReversedFlatAndFlat: {\n x_min: 0,\n x_max: 414,\n y_min: -194,\n y_max: 421,\n ha: 615,\n o: 'm 281 606 l 281 -268 l 438 -158 b 596 84 547 -82 596 3 b 475 243 596 154 556 243 b 325 179 435 243 384 222 l 325 606 z m 235 -279 l 235 606 l 190 606 l 190 179 b 85 243 148 222 114 243 b 12 158 52 243 27 215 b 0 84 3 134 0 108 b 112 -158 0 3 37 -78 z m 325 111 b 410 144 359 132 386 144 b 498 36 462 144 498 84 b 413 -107 498 -9 469 -58 l 325 -173 z m 192 112 l 192 -163 l 135 -98 b 81 40 99 -50 81 -3 b 91 94 81 59 84 76 b 137 144 102 127 118 144 b 192 112 153 144 170 132 z',\n },\n accidentalWilsonPlus: {\n x_min: 0,\n x_max: 281,\n y_min: -203,\n y_max: 203,\n ha: 406,\n o: 'm 405 268 l 225 98 l 225 292 l 180 292 l 180 56 l 0 -112 l 0 -268 l 180 -98 l 180 -292 l 225 -292 l 225 -56 l 405 112 z',\n },\n accidentalWilsonMinus: {\n x_min: 0,\n x_max: 281,\n y_min: -186,\n y_max: 186,\n ha: 372,\n o: 'm 0 112 l 405 -268 l 405 -112 l 0 268 z',\n },\n },\n fontFamily: 'Bravura',\n resolution: 1000,\n generatedOn: '2021-12-06T21:04:30.234Z',\n};\n","/**\n * The Bravura font was created by Daniel Spreadbury @ Steinberg.\n * https://github.com/steinbergmedia/bravura/\n */\nexport const BravuraMetrics = {\n name: 'Bravura',\n smufl: true,\n stave: {\n padding: 12,\n endPaddingMax: 10,\n endPaddingMin: 5,\n unalignedNotePadding: 10,\n },\n accidental: {\n noteheadAccidentalPadding: 1,\n leftPadding: 2,\n accidentalSpacing: 3,\n },\n clef: {\n default: {\n point: 32,\n width: 26,\n },\n small: {\n point: 26,\n width: 20,\n },\n annotations: {\n '8va': {\n smuflCode: 'timeSig8',\n default: {\n point: 18,\n treble: {\n line: -1.4,\n shiftX: 12,\n },\n },\n small: {\n point: 16,\n treble: {\n line: -0.2,\n shiftX: 8,\n },\n },\n },\n '8vb': {\n smuflCode: 'timeSig8',\n default: {\n point: 18,\n treble: {\n line: 6,\n shiftX: 10,\n },\n bass: {\n line: 3.5,\n shiftX: 1,\n },\n },\n small: {\n point: 16,\n treble: {\n line: 5.3,\n shiftX: 6,\n },\n bass: {\n line: 3.1,\n shiftX: 0.5,\n },\n },\n },\n },\n // These may no longer be necessary\n lineCount: {\n '8': { point: 55, shiftY: 14 },\n '7': { point: 47, shiftY: 8 },\n '6': { point: 32, shiftY: 1 },\n '5': { point: 30, shiftY: -6 },\n '4': { point: 23, shiftY: -12 },\n },\n },\n parenthesis: {\n default: {\n point: 39,\n width: 7,\n },\n gracenote: {\n point: (39 * 3) / 5,\n width: 3,\n },\n },\n pedalMarking: {\n up: {\n point: 40,\n },\n down: {\n point: 34,\n },\n },\n // These are for numeric digits, such as in time signatures\n digits: {\n // used by timesig\n shiftLine: -1,\n point: 34,\n // used by tuplets\n tupletPoint: 22,\n shiftY: -6,\n },\n articulation: {\n articStaccatissimoAbove: {\n padding: 2,\n },\n articStaccatissimoBelow: {\n padding: 2,\n },\n },\n tremolo: {\n default: {\n point: 25,\n spacing: 5,\n offsetYStemUp: -5,\n offsetYStemDown: 5,\n offsetXStemUp: 11,\n offsetXStemDown: 1,\n },\n grace: {\n point: 18,\n spacing: 4,\n offsetYStemUp: -5,\n offsetYStemDown: 5,\n offsetXStemUp: 7,\n offsetXStemDown: 1,\n },\n },\n staveRepetition: {\n default: {\n offsetY: 25,\n offsetSymbol: 12,\n spacing: 5,\n },\n },\n // noteHead: {\n // },\n stem: {\n heightAdjustmentForFlag: -3,\n // These are stem (Y) offsets to the note heads. To shift the\n // noteheads (x-position) themselves, see glyphs.notehead.custom.\n noteHead: {\n noteheadTriangleUpHalf: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpBlack: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpWhole: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadXHalf: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXBlack: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXWhole: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadHalf: {\n offsetYBaseStemUp: -2.55,\n offsetYBaseStemDown: 2.65,\n },\n noteheadBlack: {\n offsetYBaseStemUp: -2,\n offsetYBaseStemDown: 2,\n },\n noteheadSquareWhite: {\n offsetYBaseStemDown: -5,\n offsetYBaseStemUp: 5,\n },\n },\n },\n // Values under here are used by the Glyph class to reposition and rescale\n // glyphs based on their category. This should be the first stop for\n // custom font glyph repositioning.\n //\n // The glyph loader first looks up a specific set of settings based on the\n // glyph code, and if not found, uses the defaults from the category. See\n // glyphs.textNote for an example of this.\n //\n // Details in Glyph.lookupFontMetrics.\n glyphs: {\n coda: {\n point: 20,\n shiftX: -7,\n shiftY: 8,\n },\n segno: {\n shiftX: -7,\n },\n flag: {\n shiftX: -0.75,\n tabStem: {\n shiftX: -1.75,\n },\n staveTempo: {\n shiftX: -1,\n },\n },\n clef: {\n gClef: {\n default: { scale: 1.1, shiftY: 1 },\n small: { shiftY: 1.5 },\n },\n fClef: {\n default: { shiftY: -0.5 },\n },\n },\n ornament: {\n ornamentTurn: {\n scale: 1.2,\n },\n ornamentTurnSlash: {\n scale: 1.2,\n },\n },\n stringNumber: {\n verticalPadding: 8,\n stemPadding: 2,\n leftPadding: 5,\n rightPadding: 6,\n },\n stroke: {\n arrowheadBlackDown: {\n straight: {\n shiftX: -4.5,\n },\n wiggly: {\n shiftX: -1,\n shiftY: 1,\n },\n },\n arrowheadBlackUp: {\n straight: {\n shiftX: -0.85,\n },\n wiggly: {\n shiftX: -1,\n shiftY: 1,\n },\n },\n },\n textNote: {\n point: 34,\n breathMarkTick: {\n point: 36,\n shiftY: 9,\n },\n breathMarkComma: {\n point: 36,\n },\n segno: {\n point: 30,\n shiftX: -7,\n shiftY: 8,\n },\n coda: {\n point: 20,\n shiftX: -7,\n shiftY: 8,\n },\n ornamentTrill: {\n shiftX: -8,\n shiftY: 8,\n },\n ornamentTurn: {\n point: 42,\n },\n ornamentTurnSlash: {\n point: 42,\n },\n ornamentMordent: {\n shiftX: -8,\n },\n ornamentShortTrill: {\n shiftX: -8,\n },\n },\n noteHead: {\n minPadding: 2,\n standard: {\n restQuarterStemUp: {\n point: 35,\n },\n restQuarterStemDown: {\n point: 35,\n },\n },\n custom: {\n noteheadCircleXStemUp: {\n shiftX: 1.5,\n },\n noteheadCircleXStemDown: {\n shiftX: 0.25,\n },\n noteheadDiamondHalfStemUp: {\n shiftX: 1.5,\n },\n noteheadDiamondBlackStemUp: {\n shiftX: 1.5,\n },\n noteheadDiamondWholeStemUp: {\n shiftX: 1,\n },\n noteheadXHalfStemUp: {\n shiftX: -2,\n },\n noteheadXHalfStemDown: {\n shiftX: 1,\n },\n noteheadXWholeStemUp: {\n shiftX: -4,\n },\n noteheadXWholeStemDown: {\n shiftX: 1,\n },\n noteheadSquareWhiteStemDown: {\n shiftX: 0.25,\n },\n noteheadSquareWhiteStemUp: {\n shiftX: -0.75,\n },\n noteheadSquareBlackStemUp: {\n shiftX: -0.75,\n },\n noteheadTriangleUpWholeStemUp: {\n shiftX: -0.75,\n },\n },\n },\n chordSymbol: {\n global: {\n superscriptOffset: -400,\n subscriptOffset: 300,\n kerningOffset: -250,\n lowerKerningText: ['D', 'F', 'P', 'T', 'V', 'Y'],\n upperKerningText: ['A', 'L'],\n spacing: 100,\n superSubRatio: 0.66,\n },\n csymDiminished: {\n scale: 0.8,\n leftSideBearing: -32,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymHalfDiminished: {\n scale: 0.8,\n leftSideBearing: -32,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymAugmented: {\n scale: 1,\n leftSideBearing: 0,\n advanceWidth: 530,\n yOffset: 0,\n },\n csymParensLeftTall: {\n scale: 0.8,\n leftSideBearing: -20,\n advanceWidth: 184,\n yOffset: 250,\n },\n csymParensRightTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 189,\n yOffset: 250,\n },\n csymBracketLeftTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 328,\n yOffset: 0,\n },\n csymBracketRightTall: {\n scale: 0.8,\n leftSideBearing: 1,\n advanceWidth: 600,\n yOffset: 0,\n },\n csymParensLeftVeryTall: {\n scale: 0.9,\n leftSideBearing: 50,\n advanceWidth: 121,\n yOffset: 350,\n },\n csymParensRightVeryTall: {\n scale: 0.9,\n leftSideBearing: 0,\n advanceWidth: 111,\n yOffset: 350,\n },\n csymDiagonalArrangementSlash: {\n scale: 0.6,\n leftSideBearing: -1,\n advanceWidth: 990,\n yOffset: 0,\n },\n csymMinor: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 482,\n yOffset: 0,\n },\n csymMajorSeventh: {\n scale: 0.9,\n leftSideBearing: 200,\n yOffset: 0,\n advanceWidth: 600,\n },\n accidentalSharp: {\n scale: 0.75,\n leftSideBearing: 20,\n advanceWidth: 250,\n yOffset: -302,\n },\n accidentalFlat: {\n scale: 0.9,\n leftSideBearing: -20,\n advanceWidth: 226,\n yOffset: -184,\n },\n },\n jazzOrnaments: {\n brassScoop: {\n scale: 1.0,\n xOffset: -12,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 10,\n },\n brassDoitMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 15,\n },\n brassFallLipShort: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassLiftMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 5,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassFallRoughMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 28,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassBend: {\n scale: 1.0,\n xOffset: 2,\n yOffset: -8,\n stemUpYOffset: 25,\n reportedWidth: 5,\n },\n brassMuteClosed: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -8,\n stemUpYOffset: 25,\n reportedWidth: 5,\n },\n brassMuteOpen: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -7,\n stemUpYOffset: 25,\n reportedWidth: 5,\n },\n brassFlip: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassJazzTurn: {\n scale: 1.0,\n xOffset: 6,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassSmear: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n },\n tuplet: {\n noteHeadOffset: 20,\n stemOffset: 10,\n bottomLine: 4,\n topModifierOffset: 15,\n },\n },\n};\n","export const CustomFont = {\n resolution: 1000,\n fontFamily: 'VexFlowCustom',\n glyphs: {\n noteheadSquareWhite: {\n x_min: 0,\n x_max: 430.75,\n ha: 386,\n o: 'm 0 200 l 0 -200 l 430 -200 l 430 200 l 0 200 l 50 150 l 380 150 l 380 -150 l 50 -150 l 50 150 ',\n },\n noteheadSquareBlack: {\n x_min: 0,\n x_max: 430.75,\n ha: 386,\n o: 'm 0 200 l 0 -200 l 430 -200 l 430 200 l 0 200 ',\n },\n accidentalBuyukMucennebFlat: {\n x_min: -171.5,\n x_max: 251.8125,\n ha: 257,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 553 20 616 20 614 b 20 491 20 503 20 491 l 20 491 b 153 535 47 501 149 535 b 174 514 167 535 174 524 b 164 496 174 508 171 501 b 92 470 164 495 132 484 l 20 445 l 20 390 b 20 363 20 378 20 370 b 20 333 20 340 20 333 l 20 333 b 153 377 47 344 149 377 b 174 356 167 377 174 367 b 164 338 174 349 171 342 b 92 312 164 338 132 326 l 20 288 l 20 219 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 30 -21 -212 -21 -212 b -21 273 -21 163 -21 273 b -84 252 -21 273 -50 263 b -152 230 -133 234 -145 230 b -157 231 -155 230 -156 231 b -171 252 -166 234 -171 244 b -160 270 -171 259 -167 266 b -27 316 -159 270 -93 294 l -21 319 l -21 374 b -21 431 -21 406 -21 431 b -84 409 -21 431 -50 421 b -152 388 -133 392 -145 388 b -157 390 -155 388 -156 388 b -171 409 -166 392 -171 401 b -160 428 -171 417 -167 424 b -27 474 -159 428 -93 451 l -21 476 l -21 546 b -20 620 -21 614 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ',\n },\n accidentalBakiyeFlat: {\n x_min: -176.9375,\n x_max: 251.8125,\n ha: 257,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 503 20 616 20 614 b 20 391 20 442 20 391 b 84 424 20 391 49 406 l 147 456 l 152 456 b 153 456 153 456 153 456 b 175 435 166 456 175 446 b 172 427 175 433 174 430 b 92 380 170 420 172 421 l 20 342 l 20 245 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 54 -21 -212 -21 -212 b -21 322 -21 201 -21 322 b -85 290 -21 322 -50 308 l -148 256 l -153 256 b -155 256 -155 256 -155 256 b -176 277 -167 256 -176 266 b -174 285 -176 280 -175 283 b -93 333 -171 294 -174 292 l -21 370 l -21 494 b -20 620 -21 616 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ',\n },\n accidentalKucukMucennebSharp: {\n x_min: -1.359375,\n x_max: 255.890625,\n ha: 261,\n o: 'm 118 514 b 127 517 121 517 122 517 b 147 505 136 517 142 513 l 148 502 l 148 403 b 148 306 148 351 148 306 b 174 315 149 306 160 310 l 200 324 l 205 323 b 223 312 213 323 220 319 l 225 308 l 225 260 b 225 245 225 255 225 249 b 220 204 225 208 224 209 b 179 188 216 199 215 199 l 148 177 l 148 124 l 148 70 l 189 84 b 236 98 219 94 230 98 b 247 94 240 98 243 97 b 255 52 254 88 255 87 b 255 33 255 47 255 40 l 254 -12 l 253 -15 b 249 -22 253 -18 250 -20 l 245 -24 l 196 -41 l 148 -58 l 148 -108 b 148 -158 148 -136 148 -158 b 174 -148 148 -158 160 -154 b 204 -140 198 -140 200 -140 l 204 -140 b 224 -152 213 -140 221 -145 b 225 -201 224 -155 225 -177 b 224 -254 225 -226 224 -251 b 157 -284 220 -262 220 -262 l 148 -288 l 148 -395 l 148 -503 l 147 -506 b 127 -519 142 -514 134 -519 b 107 -506 119 -519 111 -514 l 106 -503 l 106 -403 b 106 -303 106 -316 106 -303 b 104 -303 104 -303 104 -303 b 88 -310 104 -303 96 -306 l 63 -319 b 51 -322 59 -320 55 -322 b 36 -315 46 -322 40 -319 b 31 -273 32 -309 31 -312 b 31 -258 31 -269 31 -263 l 31 -210 l 34 -206 b 40 -198 35 -204 38 -199 b 74 -186 42 -197 57 -191 l 106 -173 l 106 -123 b 106 -97 106 -112 106 -104 b 106 -72 106 -76 106 -72 b 104 -72 106 -72 106 -72 b 20 -99 89 -79 23 -99 b 0 -84 10 -99 2 -93 b -1 -37 0 -81 -1 -59 b 0 11 -1 -15 0 9 b 58 40 4 22 2 22 l 106 56 l 106 109 b 106 123 106 115 106 119 b 106 162 106 147 106 162 b 81 155 106 162 93 159 b 50 147 65 149 55 147 b 36 152 43 147 40 148 b 31 194 32 158 31 156 b 31 209 31 198 31 204 l 31 256 l 34 260 b 76 281 38 269 38 269 l 106 292 l 106 396 l 106 502 l 107 505 b 118 514 110 509 114 513 ',\n },\n accidentalKoron: {\n x_min: -20,\n x_max: 320,\n ha: 257,\n o: 'm -8 200 b -8 210 8 200 16 200 l 20 148 -199 l 23 -615 b 0 -629 9 -629 6 -629 l -21 -612 l -21 -201 l -21 216 l -20 200 m 16 200 l 310 0 l 240 0 l 16 140 l 16 -120 l 240 0 l 310 0 l 16 -200 ',\n },\n accidentalSori: {\n x_min: -10.890625,\n x_max: 299.4375,\n ha: 294,\n o: 'm 44 174 b 51 174 47 174 49 174 b 68 173 55 174 61 174 l 287 112 l 551 40 b 615 20 617 22 609 23 b 626 0 622 16 626 8 b 615 -22 626 -9 622 -18 b 613 -23 613 -23 613 -23 b 613 -23 613 -23 613 -23 b 287 -113 613 -24 597 -29 l 68 -174 b 53 -176 61 -176 57 -176 b 39 -172 47 -176 43 -174 b 27 -151 31 -167 27 -159 b 39 -129 27 -141 31 -133 b 230 -74 43 -124 20 -131 l 370 -36 l 468 -9 b 498 0 484 -4 498 -1 b 468 8 498 0 484 2 l 370 34 l 230 73 b 40 126 28 129 43 124 b 27 149 31 131 27 140 b 44 174 27 161 34 170 m 205 110 l 205 300 b 205 330 245 330 245 300 l 245 300 l 245 -300 b 245 -330 205 -330 205 -300 l 205 -300 l 205 110 l 345 90 m 345 90 l 345 330 b 345 360 385 360 385 330 l 385 330 l 385 -270 b 385 -300 345 -300 345 -270 l 345 -270 l 345 90 ',\n },\n vexAccidentalMicrotonal2: {\n x_min: -1.359375,\n x_max: 386.5625,\n ha: 394,\n o: 'm 249 535 b 257 537 251 537 253 537 b 276 524 266 537 273 533 l 277 521 l 279 419 l 279 316 l 304 323 b 337 328 319 326 330 328 b 353 316 347 328 349 324 b 355 266 355 315 355 290 b 353 215 355 241 355 217 b 319 198 349 206 347 205 b 279 187 284 190 279 188 b 279 156 279 187 279 174 b 279 136 279 151 279 144 l 279 84 l 289 87 l 330 98 b 367 105 352 102 362 105 b 378 101 372 105 375 104 b 386 61 385 95 386 94 b 386 40 386 55 386 48 l 386 -5 l 385 -8 b 374 -19 383 -12 378 -18 b 291 -40 372 -19 347 -26 b 279 -43 284 -41 279 -43 b 279 -83 279 -43 279 -59 b 279 -95 279 -87 279 -91 l 279 -145 l 304 -140 b 337 -133 321 -136 330 -133 b 349 -140 343 -133 347 -136 b 355 -181 355 -145 355 -142 l 355 -197 l 355 -210 b 349 -252 355 -249 355 -247 b 300 -269 345 -258 347 -258 b 280 -274 291 -272 281 -273 l 279 -274 l 277 -378 l 277 -483 l 276 -487 b 257 -499 273 -495 265 -499 b 238 -487 249 -499 242 -495 l 236 -483 l 236 -384 l 236 -285 l 235 -285 l 212 -291 l 170 -301 b 148 -308 159 -305 148 -306 b 147 -415 147 -308 147 -313 l 147 -523 l 145 -526 b 126 -538 141 -534 133 -538 b 106 -526 118 -538 110 -534 l 104 -523 l 104 -420 b 103 -317 104 -326 104 -317 b 103 -317 103 -317 103 -317 b 50 -330 92 -322 54 -330 b 31 -317 42 -330 35 -326 b 29 -267 29 -315 29 -315 l 29 -219 l 32 -216 b 92 -192 36 -206 36 -206 l 104 -190 l 104 -138 b 103 -87 104 -91 104 -87 b 103 -87 103 -87 103 -87 b 88 -91 103 -87 96 -88 l 49 -101 b 17 -106 32 -105 23 -106 b 6 -102 13 -106 10 -105 b -1 -62 0 -97 -1 -95 b 0 -41 -1 -56 0 -49 l 0 4 l 1 6 b 10 16 2 11 6 15 b 91 37 12 18 38 24 l 104 41 l 104 93 b 103 144 104 140 104 144 b 103 144 103 144 103 144 b 50 131 92 141 54 131 b 31 144 42 131 35 137 b 29 195 29 147 29 148 l 29 242 l 32 245 b 92 269 36 255 36 255 l 104 273 l 104 377 l 104 481 l 106 485 b 126 498 110 492 118 498 b 134 495 129 498 132 496 b 145 485 138 494 142 489 l 147 481 l 147 383 l 147 283 l 152 284 b 190 294 155 285 171 290 l 230 303 l 236 305 l 236 413 l 236 521 l 238 524 b 249 535 240 528 243 533 m 236 126 b 235 177 236 154 236 177 l 235 177 b 213 172 235 177 225 174 l 170 161 b 147 155 157 158 147 155 b 147 124 147 155 147 142 b 147 102 147 117 147 111 l 147 52 l 153 54 l 228 72 l 236 74 l 236 126 m 236 -105 b 235 -54 236 -65 236 -54 l 235 -54 b 231 -55 235 -54 234 -54 b 172 -69 227 -55 204 -62 l 149 -76 l 147 -76 l 147 -127 l 147 -179 l 152 -177 b 190 -167 155 -177 171 -173 l 230 -158 l 236 -156 l 236 -105 ',\n },\n vexAccidentalMicrotonal3: {\n x_min: 0,\n x_max: 430.75,\n ha: 360,\n o: 'm -146 537 b -138 538 -143 538 -141 538 b -118 525 -129 538 -121 533 b -117 390 -117 522 -117 521 b -115 259 -117 268 -117 259 b -115 259 -115 259 -115 259 b -59 272 -104 263 -62 272 b -39 259 -50 272 -42 267 b -37 209 -38 257 -37 233 b -39 159 -37 185 -38 162 b -85 138 -43 149 -44 149 l -117 131 l -117 21 b -115 -88 -117 -80 -117 -88 b -115 -88 -115 -88 -115 -88 b -59 -75 -104 -84 -62 -75 b -44 -81 -52 -75 -48 -77 b -38 -124 -38 -87 -38 -85 b -38 -138 -38 -124 -38 -138 b -38 -152 -38 -138 -38 -152 b -44 -195 -38 -191 -38 -190 b -85 -209 -48 -200 -48 -200 l -117 -217 l -117 -349 b -118 -486 -117 -481 -117 -482 b -138 -499 -121 -494 -129 -499 b -153 -493 -143 -499 -149 -497 b -159 -415 -158 -487 -159 -496 b -159 -355 -159 -398 -159 -379 b -159 -227 -159 -284 -159 -227 b -205 -238 -159 -227 -180 -232 b -250 -249 -230 -244 -250 -249 b -251 -386 -251 -249 -251 -311 b -252 -525 -251 -521 -251 -522 b -272 -538 -255 -534 -264 -538 b -287 -532 -277 -538 -283 -536 b -293 -452 -292 -527 -293 -536 b -293 -391 -293 -436 -293 -415 b -294 -260 -293 -269 -293 -260 b -294 -260 -294 -260 -294 -260 b -348 -272 -306 -264 -345 -272 b -368 -259 -357 -272 -365 -267 b -369 -209 -369 -257 -369 -233 b -368 -159 -369 -185 -369 -162 b -323 -139 -364 -149 -362 -148 l -293 -131 l -293 -22 b -294 87 -293 80 -293 87 b -294 87 -294 87 -294 87 b -348 75 -306 84 -345 75 b -368 88 -357 75 -365 80 b -369 138 -369 91 -369 114 b -368 188 -369 162 -369 186 b -323 209 -364 198 -362 199 l -293 216 l -293 349 b -292 486 -293 481 -293 482 b -272 499 -288 494 -280 499 b -257 493 -266 499 -261 497 b -251 414 -251 487 -251 496 b -251 354 -251 398 -251 378 b -251 226 -251 284 -251 226 b -205 238 -250 226 -230 231 b -159 249 -180 244 -159 249 b -159 385 -159 249 -159 310 b -157 525 -159 521 -159 522 b -146 537 -156 530 -151 535 z m -159 11 b -159 120 -159 98 -159 120 l -159 120 b -175 116 -160 120 -167 119 b -221 105 -184 114 -204 109 l -251 98 l -251 -12 b -251 -121 -251 -72 -251 -121 b -205 -110 -250 -121 -230 -116 b -159 -99 -180 -104 -159 -99 b -159 11 -159 -99 -159 -49 z m 89 517 b 97 519 92 518 94 519 b 117 505 106 519 114 513 b 119 376 119 502 119 501 l 119 249 l 145 258 b 176 267 169 266 172 267 b 177 267 176 267 177 267 b 196 255 186 267 192 263 l 197 252 l 197 205 b 197 181 197 195 197 187 b 193 149 197 153 197 153 b 152 131 190 144 187 143 l 119 120 l 119 10 b 119 -100 119 -62 119 -100 b 145 -91 120 -100 131 -96 b 173 -82 159 -86 171 -82 b 176 -81 174 -81 175 -81 b 196 -94 185 -81 193 -87 b 198 -151 197 -97 198 -125 b 197 -194 198 -172 197 -192 b 153 -218 193 -203 192 -204 l 119 -230 l 119 -367 l 118 -504 l 117 -507 b 97 -519 113 -514 105 -519 b 82 -512 92 -519 87 -517 b 76 -434 77 -507 76 -516 b 76 -374 76 -418 76 -398 b 76 -245 76 -303 76 -245 b 52 -254 76 -245 65 -249 b 19 -263 34 -260 25 -263 b 6 -257 13 -263 10 -261 b 0 -214 0 -251 0 -253 b 0 -200 0 -210 0 -205 b 0 -188 0 -196 0 -192 b 6 -143 0 -147 0 -149 b 46 -126 10 -139 10 -139 l 76 -115 l 76 -5 b 76 106 76 56 76 106 b 51 98 76 106 64 102 b 18 89 34 92 25 89 b 6 95 13 89 10 91 b 0 139 0 101 0 99 b 0 153 0 143 0 148 b 0 179 0 163 0 172 b 44 225 0 215 3 211 l 76 236 l 76 369 b 78 505 76 501 76 502 b 89 517 80 510 85 515 z ',\n },\n vexAccidentalMicrotonal4: {\n x_min: 0,\n x_max: 430.75,\n ha: 360,\n o: 'm 283 633 b 291 634 286 634 289 634 b 311 621 300 634 308 629 b 313 505 313 618 313 617 b 313 393 313 443 313 393 b 378 425 313 393 343 407 l 443 458 l 448 458 b 449 458 449 458 449 458 b 471 437 462 458 471 448 b 469 429 471 434 470 432 b 387 382 466 421 469 423 l 313 344 l 313 247 l 313 150 l 315 152 b 433 201 353 184 394 201 b 479 193 448 201 464 198 b 549 86 524 177 549 135 b 526 1 549 59 541 29 b 395 -143 504 -39 475 -71 b 316 -214 351 -182 341 -191 b 292 -229 302 -228 300 -229 b 272 -216 283 -229 275 -224 b 271 55 271 -212 271 -212 b 270 323 271 203 270 323 b 205 291 270 323 241 308 l 140 258 l 135 258 b 134 258 135 258 134 258 b 112 279 121 258 112 267 b 114 287 112 281 113 284 b 196 334 117 295 114 293 l 271 371 l 271 495 b 272 621 271 617 271 618 b 283 633 274 626 279 631 z m 404 133 b 391 134 400 134 395 134 b 384 134 388 134 386 134 b 318 88 358 130 335 114 l 313 81 l 313 -37 l 313 -156 l 316 -152 b 439 83 391 -71 439 22 l 439 84 b 404 133 439 115 430 128 z m -8 633 l -8 633 b 0 634 -6 634 -3 634 b 20 621 8 634 17 629 b 21 384 21 618 21 617 l 21 150 l 24 152 b 141 201 62 184 102 201 b 187 193 157 201 172 198 b 257 86 232 177 257 135 b 234 1 257 59 250 29 b 103 -143 212 -39 183 -71 b 24 -214 60 -182 49 -191 b 0 -229 10 -228 8 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 203 l -21 618 l -20 621 b -8 633 -18 626 -13 631 z m 113 133 l 113 133 b 99 134 109 134 103 134 b 93 134 97 134 94 134 b 26 88 66 130 43 114 l 21 81 l 21 -37 l 21 -156 l 25 -152 b 148 83 99 -71 148 22 l 148 84 b 113 133 148 115 138 128 z ',\n },\n vexNoteHeadRectBlack: {\n x_min: 0,\n x_max: 430.75,\n ha: 360,\n o: 'm 0 150 l 0 -150 l 430 -150 l 430 150 l 0 150 ',\n },\n vexNoteHeadRectWhite: {\n x_min: 0,\n x_max: 430.75,\n ha: 360,\n o: 'm 0 150 l 0 -150 l 430 -150 l 430 150 l 0 150 l 50 100 l 380 100 l 380 -100 l 50 -100 l 50 100',\n },\n },\n};\n","export const CustomMetrics = {\n name: 'VexFlowCustom',\n smufl: false,\n glyphs: {},\n};\n","export const GonvilleFont = {\n glyphs: {\n bracketTop: {\n x_min: 0,\n x_max: 559.421875,\n ha: 571,\n o: 'm 544 204 b 548 204 545 204 547 204 b 559 194 555 204 559 199 b 559 190 559 192 559 191 b 530 156 559 188 556 184 b 462 86 510 134 481 104 b 453 76 458 81 454 77 l 446 70 l 441 65 b 434 59 439 63 436 61 l 427 54 b 409 37 426 51 416 44 b 392 23 398 29 394 26 b 387 19 389 22 387 20 b 379 13 386 19 383 16 l 371 8 l 367 5 l 359 -1 l 337 -16 b 285 -48 319 -29 298 -41 l 279 -52 b 186 -95 255 -66 210 -87 l 175 -99 b 23 -129 127 -117 68 -129 b 17 -129 20 -129 19 -129 b 1 -123 2 -129 2 -129 b 0 -49 0 -122 0 -83 b 0 4 0 -22 0 1 b 27 11 2 9 4 9 b 185 31 78 12 145 20 b 198 34 186 31 193 33 b 314 73 234 44 277 58 b 349 88 328 79 340 84 b 353 90 352 90 353 90 b 363 94 353 90 357 93 b 371 98 367 97 371 98 b 428 129 372 98 413 120 b 461 148 441 136 454 144 b 468 151 464 149 466 151 b 472 154 469 152 470 154 b 481 161 473 155 477 158 b 525 190 490 166 518 186 l 534 197 b 540 201 536 198 539 199 b 544 204 541 202 544 204 ',\n },\n bracketBottom: {\n x_min: 0,\n x_max: 559.421875,\n ha: 571,\n o: 'm 5 127 b 14 127 6 127 9 127 b 51 126 25 127 43 127 b 175 98 93 122 138 112 l 186 94 b 279 51 210 86 255 65 b 285 47 280 51 283 48 b 319 27 291 44 311 31 l 326 22 b 359 0 332 19 352 4 l 367 -6 b 371 -9 368 -6 370 -8 l 379 -15 b 387 -22 383 -18 386 -20 l 398 -30 l 411 -40 l 417 -47 l 427 -55 l 434 -61 b 441 -66 436 -62 439 -65 l 446 -72 l 453 -77 l 462 -87 b 558 -188 490 -113 549 -176 b 559 -195 559 -191 559 -194 b 548 -205 559 -201 555 -205 b 541 -204 547 -205 544 -205 b 534 -198 539 -201 536 -199 l 525 -191 b 481 -162 518 -187 490 -167 b 472 -155 477 -159 472 -156 b 468 -152 470 -155 469 -154 b 461 -149 466 -152 464 -151 b 428 -130 454 -145 441 -137 b 371 -99 413 -122 372 -99 b 363 -95 371 -99 367 -98 b 353 -91 357 -94 353 -91 b 348 -90 353 -91 352 -91 b 332 -81 343 -87 341 -86 b 27 -12 230 -37 127 -13 b 0 -5 4 -11 2 -11 b 0 58 0 -2 0 27 b 0 122 0 88 0 120 b 5 127 1 124 4 126 ',\n },\n barlineTick: {\n x_min: -80.3125,\n x_max: 78.9375,\n ha: 81,\n o: 'm 63 191 b 69 192 65 192 66 192 b 77 188 72 192 76 191 b 78 183 78 187 78 186 b 74 158 78 179 77 172 l 66 115 b 9 -161 49 30 10 -158 b -10 -187 6 -172 -1 -181 b -34 -194 -17 -191 -25 -194 b -80 -147 -58 -194 -80 -174 b -80 -141 -80 -144 -80 -142 b 9 70 -80 -134 -73 -117 l 49 163 b 63 191 59 188 61 190 ',\n },\n breathMarkTick: {\n x_min: -80.3125,\n x_max: 78.9375,\n ha: 81,\n o: 'm 63 191 b 69 192 65 192 66 192 b 77 188 72 192 76 191 b 78 183 78 187 78 186 b 74 158 78 179 77 172 l 66 115 b 9 -161 49 30 10 -158 b -10 -187 6 -172 -1 -181 b -34 -194 -17 -191 -25 -194 b -80 -147 -58 -194 -80 -174 b -80 -141 -80 -144 -80 -142 b 9 70 -80 -134 -73 -117 l 49 163 b 63 191 59 188 61 190 ',\n },\n segno: {\n x_min: -330.75,\n x_max: 329.390625,\n ha: 336,\n o: 'm -133 483 b -117 484 -127 484 -122 484 b 31 373 -51 484 9 440 b 35 348 34 365 35 356 b -25 285 35 313 10 285 b -87 331 -55 285 -76 302 b -167 402 -100 376 -133 402 b -191 398 -175 402 -183 401 b -227 341 -215 388 -227 369 b -225 320 -227 334 -227 327 b -13 74 -209 230 -125 133 b 6 65 -4 70 5 66 l 9 63 l 10 65 b 117 231 12 68 40 112 l 189 341 l 242 424 b 268 460 262 456 264 458 b 283 464 273 463 277 464 b 308 438 296 464 308 453 l 308 437 b 287 396 308 430 308 428 l 95 98 l 59 43 l 58 41 l 65 37 b 253 -156 151 -8 217 -77 b 281 -285 272 -199 281 -244 b 148 -481 281 -381 231 -463 b 115 -485 137 -484 126 -485 b -32 -376 51 -485 -9 -442 b -36 -349 -35 -366 -36 -358 b 25 -287 -36 -315 -12 -287 b 85 -333 54 -287 74 -302 b 166 -403 99 -377 133 -403 b 190 -399 174 -403 182 -402 b 225 -342 215 -390 225 -370 b 224 -322 225 -335 225 -328 b 12 -76 208 -231 125 -134 b -8 -66 2 -72 -6 -68 l -10 -65 l -12 -66 b -118 -231 -13 -68 -42 -113 l -190 -342 l -243 -426 b -269 -462 -264 -458 -265 -458 b -284 -466 -274 -464 -279 -466 b -310 -440 -298 -466 -310 -455 l -310 -438 b -288 -398 -310 -430 -308 -430 l -96 -99 l -59 -44 l -59 -43 l -66 -38 b -281 284 -198 33 -281 158 l -281 284 b -133 483 -281 392 -220 474 m 254 177 b 266 179 258 177 262 179 b 319 149 287 179 307 167 b 329 115 326 140 329 127 b 319 79 329 102 326 90 b 268 51 307 61 287 51 b 221 72 250 51 234 58 b 205 115 210 84 205 99 b 254 177 205 142 223 170 m -281 -54 b -269 -52 -277 -52 -273 -52 b -223 -73 -253 -52 -235 -59 b -206 -116 -212 -84 -206 -101 b -216 -151 -206 -129 -209 -141 b -269 -179 -228 -170 -249 -179 b -314 -159 -285 -179 -302 -173 b -330 -116 -325 -147 -330 -131 b -281 -54 -330 -88 -313 -61 ',\n },\n coda: {\n x_min: -311.6875,\n x_max: 310.328125,\n ha: 317,\n o: 'm -9 388 b -2 390 -8 390 -5 390 b 5 388 1 390 4 390 b 19 378 10 387 16 383 b 23 333 23 371 23 371 b 24 298 23 299 24 298 b 81 276 34 298 65 285 b 213 91 145 240 190 177 b 224 24 217 76 224 36 b 257 24 224 24 235 24 b 299 19 292 24 292 24 b 310 -1 306 15 310 6 b 299 -23 310 -11 306 -19 b 257 -27 292 -27 292 -27 b 224 -29 235 -27 224 -29 b 213 -95 224 -40 217 -80 b 81 -280 190 -181 145 -244 b 24 -301 65 -290 34 -301 b 23 -335 24 -301 23 -303 l 23 -340 b 17 -381 23 -374 23 -374 b -1 -391 13 -388 5 -391 b -21 -381 -9 -391 -17 -388 b -27 -340 -27 -374 -27 -374 l -27 -335 b -28 -301 -27 -303 -27 -301 b -85 -280 -38 -301 -69 -290 b -217 -95 -149 -244 -194 -181 b -228 -29 -221 -80 -228 -40 b -259 -27 -228 -29 -238 -27 b -300 -23 -294 -27 -294 -27 b -311 -2 -307 -19 -311 -11 b -294 23 -311 8 -304 19 b -259 24 -291 23 -284 24 b -228 24 -239 24 -228 24 b -217 91 -228 36 -221 76 b -85 276 -194 177 -149 240 b -28 298 -69 285 -38 298 b -27 333 -27 298 -27 299 b -27 371 -27 362 -27 369 b -9 388 -24 378 -17 385 m -27 136 b -28 247 -27 197 -28 247 b -61 216 -31 247 -53 226 b -123 33 -95 172 -121 98 l -125 24 l -76 24 l -27 24 l -27 136 m 29 242 b 24 247 27 245 24 247 b 23 136 24 247 23 197 l 23 24 l 72 24 l 121 24 l 119 33 b 29 242 115 116 77 206 m -27 -140 l -27 -27 l -76 -27 l -125 -27 l -123 -36 b -61 -220 -121 -102 -95 -176 b -28 -251 -53 -230 -31 -251 b -27 -140 -28 -251 -27 -201 m 119 -36 l 121 -27 l 72 -27 l 23 -27 l 23 -140 b 24 -251 23 -201 24 -251 b 57 -220 27 -251 49 -230 b 119 -36 91 -176 117 -102 ',\n },\n gClef: {\n x_min: -1.359375,\n x_max: 847.96875,\n ha: 865,\n o: 'm 488 1499 b 495 1500 490 1500 492 1500 b 541 1465 507 1500 521 1490 b 679 1078 622 1372 679 1210 b 677 1050 679 1068 677 1060 b 477 642 668 893 604 764 l 443 609 l 431 596 l 431 592 l 438 562 l 449 508 l 460 458 b 481 355 475 390 481 355 b 481 355 481 355 481 355 b 490 356 481 355 485 355 b 528 358 495 356 511 358 b 558 356 540 358 552 356 b 839 95 699 338 808 237 b 847 22 845 72 847 47 b 631 -303 847 -113 766 -242 b 620 -309 623 -308 620 -309 l 620 -310 b 631 -359 620 -310 626 -333 l 646 -435 l 660 -496 b 672 -588 668 -535 672 -563 b 664 -653 672 -610 669 -630 b 383 -875 630 -792 509 -875 b 201 -810 321 -875 257 -855 b 129 -680 151 -768 129 -730 b 274 -530 129 -592 200 -530 b 351 -553 300 -530 326 -538 b 412 -669 393 -582 412 -626 b 287 -805 412 -735 366 -800 l 279 -805 l 285 -809 b 383 -830 318 -823 351 -830 b 586 -718 464 -830 540 -789 b 626 -584 612 -678 626 -631 b 619 -528 626 -566 623 -548 b 612 -495 619 -526 616 -510 b 577 -324 590 -387 577 -324 b 577 -324 577 -324 577 -324 b 568 -326 575 -324 571 -324 b 528 -334 558 -328 537 -333 b 465 -338 506 -337 485 -338 b 24 -11 269 -338 87 -206 b -1 145 8 41 -1 93 b 96 442 -1 249 32 351 b 322 714 166 541 236 626 l 352 745 l 345 782 l 332 843 l 315 921 b 303 984 310 950 304 978 b 295 1082 298 1017 295 1049 b 413 1426 295 1208 336 1329 b 488 1499 436 1456 477 1496 m 549 1301 b 541 1301 547 1301 544 1301 b 411 1207 500 1301 447 1263 b 355 1004 374 1152 355 1079 b 359 942 355 984 356 963 b 371 881 362 927 363 917 l 385 818 b 392 782 389 799 392 784 l 392 782 b 434 828 393 782 424 816 b 607 1165 534 941 594 1060 b 608 1193 608 1175 608 1183 b 597 1270 608 1224 604 1254 b 549 1301 589 1286 571 1299 m 398 528 b 393 555 396 542 393 553 b 392 555 393 555 393 555 b 317 470 390 555 347 505 b 190 298 266 408 212 334 b 127 70 148 227 127 148 b 155 -77 127 19 137 -30 b 468 -303 209 -216 333 -303 b 519 -299 484 -303 502 -302 b 568 -284 541 -295 568 -287 l 568 -284 b 563 -263 568 -284 566 -274 l 534 -120 l 511 -13 l 496 61 l 480 133 b 469 187 472 176 469 187 b 468 188 469 187 469 188 b 416 162 462 188 430 172 b 337 13 364 126 337 69 b 413 -124 337 -40 363 -93 b 428 -144 424 -131 428 -137 b 428 -149 428 -145 428 -148 b 409 -166 426 -161 419 -166 b 394 -162 405 -166 400 -165 b 240 77 302 -122 240 -27 l 240 77 b 430 342 240 197 315 301 l 436 344 l 426 394 l 398 528 m 548 194 b 526 195 540 195 532 195 b 519 195 524 195 521 195 l 514 195 l 518 177 l 539 79 l 552 15 l 566 -48 l 594 -187 l 605 -240 b 612 -266 609 -254 611 -266 b 612 -266 612 -266 612 -266 b 641 -248 613 -266 630 -256 b 744 -98 692 -212 730 -156 b 751 -40 749 -79 751 -59 b 548 194 751 76 665 181 ',\n },\n cClef: {\n x_min: 0,\n x_max: 873.828125,\n ha: 892,\n o: 'm 0 0 l 0 703 l 81 703 l 164 703 l 164 0 l 164 -705 l 81 -705 l 0 -705 l 0 0 m 225 0 l 225 703 l 246 703 l 268 703 l 268 366 l 268 30 l 274 36 b 314 79 284 44 302 63 b 413 302 357 137 392 213 b 432 327 419 324 421 327 b 449 306 443 327 447 322 b 611 115 457 195 529 115 b 651 122 624 115 638 117 b 728 316 705 140 724 188 b 729 388 728 342 729 366 b 671 635 729 533 711 602 b 581 662 649 652 616 662 b 477 637 545 662 510 653 l 475 635 l 477 634 b 503 627 488 632 495 631 b 545 556 532 612 545 584 b 491 480 545 524 526 491 b 465 474 481 476 473 474 b 379 563 417 474 379 516 b 389 602 379 576 382 588 b 541 691 409 641 479 681 b 582 694 555 692 568 694 b 865 462 714 694 834 598 b 873 392 871 440 873 416 b 865 317 873 367 871 341 b 639 84 839 194 748 101 b 612 83 630 83 620 83 b 511 116 577 83 543 94 b 504 120 509 119 506 120 b 504 120 504 120 504 120 b 469 59 504 120 488 93 l 432 -1 l 469 -61 b 504 -122 488 -94 504 -122 b 504 -122 504 -122 504 -122 b 511 -117 506 -122 509 -120 b 612 -84 543 -95 577 -84 b 665 -91 630 -84 647 -87 b 869 -338 771 -122 850 -216 b 873 -392 872 -356 873 -374 b 798 -595 873 -469 847 -539 b 581 -695 741 -662 660 -695 b 406 -626 517 -695 454 -671 b 381 -563 389 -607 381 -585 b 465 -477 381 -519 413 -477 b 545 -559 514 -477 545 -519 b 503 -628 545 -587 532 -613 b 477 -635 495 -632 488 -634 l 475 -637 l 477 -638 b 581 -663 510 -655 545 -663 b 671 -637 616 -663 649 -653 b 729 -391 711 -603 729 -534 b 728 -317 729 -367 728 -344 b 623 -117 722 -173 698 -124 b 611 -116 619 -116 615 -116 b 449 -308 528 -116 457 -198 b 432 -328 447 -323 443 -328 b 413 -303 421 -328 419 -326 b 314 -80 392 -215 357 -138 b 274 -37 302 -65 284 -45 l 268 -31 l 268 -367 l 268 -705 l 246 -705 l 225 -705 l 225 0 ',\n },\n fClef: {\n x_min: -1.359375,\n x_max: 899.703125,\n ha: 918,\n o: 'm 307 349 b 332 351 315 351 323 351 b 443 340 367 351 408 347 b 741 47 607 306 720 195 b 744 0 743 31 744 16 b 660 -303 744 -90 713 -206 b 28 -755 534 -531 304 -695 b 14 -756 23 -755 19 -756 b -1 -741 4 -756 -1 -750 b 21 -720 -1 -731 1 -728 b 567 -56 337 -601 548 -344 b 568 -11 568 -41 568 -24 b 442 285 568 129 525 233 b 325 319 406 308 367 319 b 93 177 232 319 137 266 b 84 154 91 170 84 155 b 84 154 84 154 84 154 b 88 156 84 154 85 155 b 159 177 110 170 134 177 b 257 134 194 177 231 162 b 294 41 281 108 294 73 b 171 -97 294 -24 246 -90 b 156 -98 166 -97 161 -98 b 6 74 73 -98 6 -22 b 6 80 6 76 6 79 b 307 349 10 223 141 340 m 839 215 b 845 216 841 216 842 216 b 862 213 852 216 860 215 b 899 163 887 206 899 184 b 872 117 899 145 890 127 b 847 111 865 112 856 111 b 808 130 833 111 818 117 b 796 162 800 140 796 151 b 839 215 796 187 812 212 m 839 -112 b 845 -112 841 -112 842 -112 b 862 -115 852 -112 860 -113 b 899 -165 887 -122 899 -144 b 872 -210 899 -183 890 -201 b 847 -217 865 -215 856 -217 b 808 -198 833 -217 818 -210 b 796 -165 800 -188 796 -177 b 839 -112 796 -140 812 -116 ',\n },\n unpitchedPercussionClef1: {\n x_min: 0,\n x_max: 464.140625,\n ha: 474,\n o: 'm 0 0 l 0 347 l 76 347 l 153 347 l 153 0 l 153 -348 l 76 -348 l 0 -348 l 0 0 m 308 -1 l 308 347 l 386 347 l 464 347 l 464 -1 l 464 -348 l 386 -348 l 308 -348 l 308 -1 ',\n },\n '6stringTabClef': {\n x_min: -1.359375,\n x_max: 680.5625,\n ha: 694,\n o: 'm 597 1042 b 604 1042 600 1042 602 1042 b 642 1002 627 1042 642 1022 b 619 966 642 988 635 974 b 439 927 574 942 503 927 l 426 927 l 426 921 b 430 838 428 893 430 866 b 345 480 430 696 398 560 b 179 391 307 423 249 391 b 156 392 171 391 164 392 b 138 394 149 394 142 394 b 103 434 115 396 103 416 b 129 471 103 451 111 466 b 141 474 133 473 137 474 b 172 459 153 474 164 469 b 181 455 175 456 176 455 b 187 456 182 455 185 455 b 253 520 212 460 234 483 b 315 836 294 605 315 714 b 311 928 315 867 314 898 b 302 945 310 943 311 942 b 245 953 283 950 262 953 b 130 891 193 953 149 931 b 84 860 119 870 102 860 b 36 905 61 860 39 877 b 36 910 36 907 36 909 b 80 970 36 931 50 949 b 249 1017 125 1000 187 1017 b 322 1009 273 1017 299 1014 l 341 1003 b 436 991 372 995 406 991 b 577 1031 495 991 545 1004 b 597 1042 583 1038 590 1041 m 416 360 b 424 360 419 360 421 360 b 481 309 454 360 479 338 b 503 145 484 280 495 199 b 585 -185 525 16 555 -106 b 630 -245 596 -213 613 -237 l 634 -247 l 638 -245 b 647 -244 641 -245 645 -244 b 680 -278 666 -244 680 -262 b 664 -308 680 -290 675 -301 b 638 -312 658 -310 650 -312 b 613 -309 631 -312 623 -310 b 477 -201 555 -303 502 -260 b 417 -2 460 -159 434 -72 b 416 5 417 1 416 5 b 416 5 416 5 416 5 b 411 -5 415 5 413 0 b 359 -97 397 -33 377 -70 b 353 -106 355 -102 353 -105 b 359 -112 353 -108 355 -109 b 409 -130 375 -123 390 -129 b 426 -134 420 -130 421 -131 b 431 -147 428 -137 431 -141 b 420 -162 431 -152 427 -159 b 382 -169 409 -166 396 -169 b 323 -155 363 -169 341 -165 l 317 -152 l 314 -155 b 62 -303 240 -240 148 -295 b 36 -305 55 -305 44 -305 b 23 -303 29 -305 24 -305 b -1 -273 6 -299 -1 -287 b 31 -240 -1 -256 10 -240 b 36 -240 32 -240 34 -240 b 42 -241 38 -241 39 -241 b 134 -204 63 -241 99 -226 b 367 288 265 -115 357 81 b 375 330 368 313 370 320 b 416 360 383 347 400 358 m 360 -359 b 379 -359 363 -359 371 -359 b 424 -360 396 -359 416 -359 b 646 -502 536 -373 624 -430 b 649 -527 649 -510 649 -519 b 530 -673 649 -578 604 -635 l 521 -677 l 529 -681 b 653 -811 592 -714 637 -762 b 660 -853 658 -827 660 -839 b 645 -911 660 -873 656 -892 b 426 -1021 608 -981 519 -1021 b 283 -989 377 -1021 328 -1011 b 235 -949 249 -972 239 -964 b 234 -936 234 -946 234 -941 b 234 -928 234 -934 234 -931 l 235 -925 l 234 -927 l 225 -934 b 87 -982 186 -966 138 -982 b 80 -982 85 -982 83 -982 b 55 -981 70 -981 58 -981 b 17 -943 32 -981 17 -964 b 54 -904 17 -921 35 -904 b 78 -914 62 -904 72 -909 l 83 -918 l 88 -918 b 190 -831 122 -918 166 -881 b 269 -506 242 -727 269 -612 b 268 -462 269 -492 269 -477 b 266 -449 266 -458 266 -452 b 265 -444 266 -445 266 -444 b 257 -446 264 -444 261 -445 b 132 -545 196 -470 152 -505 b 88 -573 122 -563 104 -573 b 39 -523 63 -573 39 -553 b 63 -476 39 -505 44 -494 b 360 -359 136 -408 235 -369 m 419 -424 b 393 -423 411 -423 406 -423 l 375 -423 l 377 -426 b 379 -439 377 -427 378 -434 b 383 -510 382 -463 383 -487 b 314 -811 383 -609 360 -710 b 266 -893 296 -850 285 -870 b 264 -898 265 -896 264 -898 l 264 -898 b 264 -898 264 -898 264 -898 b 268 -898 264 -898 266 -898 b 273 -898 270 -898 272 -898 b 300 -909 283 -898 291 -900 b 426 -957 340 -941 385 -957 b 476 -949 443 -957 460 -954 b 547 -853 522 -931 547 -893 b 485 -745 547 -816 526 -775 b 397 -707 460 -727 432 -714 b 366 -675 375 -703 366 -692 b 396 -642 366 -657 377 -645 b 530 -557 455 -637 511 -601 b 536 -527 534 -548 536 -537 b 419 -424 536 -480 490 -437 ',\n },\n timeSig0: {\n x_min: 0,\n x_max: 514.5,\n ha: 525,\n o: 'm 236 648 b 246 648 238 648 242 648 b 288 646 261 648 283 648 b 472 513 364 634 428 587 b 514 347 502 464 514 413 b 462 163 514 272 499 217 b 257 44 409 83 333 44 b 50 163 181 44 103 83 b 0 347 14 217 0 272 b 40 513 0 413 12 464 b 236 648 87 591 155 638 m 277 614 b 253 616 273 616 261 616 b 242 616 247 616 243 616 b 170 499 193 609 181 589 b 159 348 163 446 159 398 b 166 222 159 308 161 266 b 201 91 174 138 183 106 b 257 76 215 81 235 76 b 311 91 277 76 299 81 b 347 222 330 106 338 138 b 353 348 352 266 353 308 b 344 499 353 398 351 446 b 277 614 333 587 322 606 m 257 -1 l 258 -1 l 255 -1 l 257 -1 m 257 673 l 258 673 l 255 673 l 257 673 ',\n },\n timeSig1: {\n x_min: -1.359375,\n x_max: 344.359375,\n ha: 351,\n o: 'm 126 637 l 129 638 l 198 638 l 266 638 l 269 635 b 274 631 272 634 273 632 l 277 627 l 277 395 b 279 156 277 230 277 161 b 329 88 281 123 295 106 b 344 69 341 81 344 79 b 337 55 344 62 343 59 l 333 54 l 197 54 l 61 54 l 58 55 b 50 69 53 59 50 62 b 65 88 50 79 53 81 b 80 97 72 91 74 93 b 117 156 103 113 112 129 b 117 345 117 161 117 222 l 117 528 l 100 503 l 38 406 b 14 383 24 384 23 383 b -1 398 5 383 -1 390 b 4 415 -1 403 1 409 b 16 437 5 416 10 426 l 72 539 l 100 596 b 121 632 119 631 119 631 b 126 637 122 634 125 635 m 171 -1 l 172 -1 l 170 -1 l 171 -1 m 171 673 l 172 673 l 170 673 l 171 673 ',\n },\n timeSig2: {\n x_min: -1.359375,\n x_max: 458.6875,\n ha: 468,\n o: 'm 197 648 b 216 648 201 648 208 648 b 258 646 232 648 253 648 b 419 546 333 637 393 599 b 432 489 428 528 432 509 b 356 342 432 440 405 384 b 235 278 322 313 288 295 b 69 170 166 256 107 217 b 69 169 69 170 69 169 b 69 169 69 169 69 169 b 74 173 69 169 72 170 b 209 222 112 204 163 222 b 310 195 247 222 274 215 b 371 179 332 184 352 179 b 396 181 379 179 387 179 b 428 202 409 184 423 194 b 442 212 431 209 436 212 b 458 197 450 212 458 206 b 441 148 458 190 449 165 b 299 44 409 84 353 44 b 288 45 295 44 292 44 b 250 61 274 45 268 49 b 122 99 212 86 164 99 b 73 91 104 99 88 97 b 28 63 53 84 34 72 b 14 54 25 56 20 54 b 1 62 9 54 4 56 l -1 65 l -1 79 b 0 99 -1 91 0 95 b 2 113 1 102 2 108 b 164 309 20 197 81 272 b 285 470 232 341 277 398 b 287 487 287 476 287 481 b 171 595 287 551 239 595 b 155 595 166 595 160 595 b 142 592 145 594 142 594 b 145 589 142 592 142 591 b 179 527 168 576 179 551 b 132 455 179 496 163 467 b 104 451 122 452 112 451 b 27 530 62 451 27 487 b 29 555 27 538 27 546 b 197 648 44 601 115 639 m 228 -1 l 230 -1 l 227 -1 l 228 -1 m 228 673 l 230 673 l 227 673 l 228 673 ',\n },\n timeSig3: {\n x_min: -1.359375,\n x_max: 409.6875,\n ha: 418,\n o: 'm 174 648 b 191 648 176 648 183 648 b 225 648 204 648 220 648 b 402 523 317 638 389 588 b 404 503 404 517 404 510 b 402 484 404 495 404 488 b 264 373 389 437 334 394 b 257 370 259 371 257 371 b 257 370 257 370 257 370 b 264 369 258 370 261 369 b 409 202 359 334 409 267 b 318 72 409 152 381 104 b 200 43 281 52 240 43 b 23 113 134 43 69 68 b 0 169 6 129 0 149 b 77 249 0 210 29 249 l 77 249 b 152 174 125 249 152 212 b 103 102 152 145 137 116 b 103 102 103 102 103 102 b 147 94 103 101 132 95 b 153 94 149 94 151 94 b 265 206 219 94 265 141 b 264 226 265 213 265 219 b 147 355 253 299 204 353 b 126 371 133 356 126 362 b 147 388 126 383 132 388 b 254 474 196 391 238 424 b 259 502 258 484 259 494 b 182 592 259 544 228 582 b 156 595 175 595 166 595 b 115 592 142 595 129 594 l 111 591 l 115 588 b 152 524 141 574 152 549 b 92 449 152 491 130 458 b 76 448 87 448 81 448 b -1 530 32 448 -1 488 b 20 581 -1 548 5 566 b 174 648 55 619 108 641 m 204 -1 l 205 -1 l 202 -1 l 204 -1 m 204 673 l 205 673 l 202 673 l 204 673 ',\n },\n timeSig4: {\n x_min: 0,\n x_max: 468.21875,\n ha: 478,\n o: 'm 174 637 b 232 638 175 638 189 638 b 277 638 245 638 259 638 l 378 638 l 381 635 b 389 623 386 632 389 627 b 382 609 389 617 386 613 b 366 589 381 606 372 598 l 313 528 l 245 451 l 209 410 l 155 348 l 84 267 b 59 240 72 252 59 240 b 59 240 59 240 59 240 b 151 238 59 238 68 238 l 242 238 l 242 303 b 243 371 242 369 242 370 b 289 426 245 374 254 385 l 303 441 l 317 456 l 338 483 l 360 506 l 371 520 b 386 527 375 526 381 527 b 400 519 392 527 397 524 b 401 440 401 516 401 514 b 401 377 401 423 401 402 l 401 238 l 426 238 b 453 237 449 238 450 238 b 465 217 461 234 465 226 b 460 202 465 212 464 206 b 426 197 454 197 453 197 l 401 197 l 401 180 b 451 88 402 129 412 109 b 468 69 465 81 468 79 b 461 55 468 62 466 59 l 458 54 l 321 54 l 185 54 l 182 55 b 175 69 176 59 175 62 b 191 88 175 79 176 81 b 240 180 230 109 240 129 l 240 197 l 125 197 b 73 195 104 195 87 195 b 8 197 10 195 9 197 b 0 212 2 199 0 205 b 0 212 0 212 0 212 b 20 242 0 219 0 219 b 163 610 104 344 163 492 b 174 637 163 628 166 634 m 234 -1 l 235 -1 l 232 -1 l 234 -1 m 234 673 l 235 673 l 232 673 l 234 673 ',\n },\n timeSig5: {\n x_min: 0,\n x_max: 409.6875,\n ha: 418,\n o: 'm 47 637 b 53 638 49 638 50 638 b 69 634 55 638 61 637 b 210 610 114 619 161 610 b 363 634 259 610 311 619 b 382 638 372 637 378 638 b 392 634 386 638 389 637 b 397 623 396 630 397 627 b 393 610 397 620 396 616 b 298 505 368 552 338 520 b 212 494 277 498 246 494 b 65 517 163 494 106 502 b 61 517 62 517 61 517 b 61 517 61 517 61 517 b 51 408 61 517 51 412 b 51 408 51 408 51 408 b 51 408 51 408 51 408 b 61 412 53 408 55 409 b 125 434 80 421 103 430 b 185 441 145 440 166 441 b 409 244 310 441 409 353 b 401 191 409 227 406 209 b 197 43 375 105 287 43 b 159 47 183 43 171 44 b 23 123 112 56 61 86 b 0 180 6 140 0 159 b 76 260 0 220 31 260 b 92 259 81 260 87 259 b 152 183 132 251 152 216 b 100 112 152 152 134 122 b 95 111 98 112 95 111 b 95 111 95 111 95 111 b 129 98 95 109 119 101 b 148 97 136 97 141 97 b 264 235 206 97 261 158 b 265 248 265 240 265 244 b 210 398 265 312 243 373 b 179 408 201 406 194 408 b 174 408 178 408 176 408 b 53 369 130 408 88 394 b 34 359 39 359 38 359 b 17 374 24 359 17 365 b 39 628 17 384 38 625 b 47 637 40 631 43 635 m 204 -1 l 205 -1 l 202 -1 l 204 -1 m 204 673 l 205 673 l 202 673 l 204 673 ',\n },\n timeSig6: {\n x_min: 0,\n x_max: 475.03125,\n ha: 485,\n o: 'm 255 648 b 274 648 259 648 266 648 b 314 646 288 648 307 648 b 450 555 374 637 438 594 b 454 530 453 546 454 538 b 375 451 454 485 416 451 b 328 467 359 451 343 455 b 300 526 310 483 300 503 b 352 598 300 557 319 589 b 356 599 355 598 356 599 b 352 602 356 599 355 601 b 288 616 330 612 308 616 b 210 584 257 616 230 605 b 164 433 189 559 174 508 b 160 374 163 415 160 381 b 160 374 160 374 160 374 b 160 374 160 374 160 374 b 168 377 160 374 164 376 b 258 395 200 390 228 395 b 366 367 294 395 328 387 b 475 223 436 333 475 283 b 472 197 475 215 473 206 b 349 65 462 141 419 95 b 259 43 317 51 288 43 b 167 69 230 43 200 52 b 4 290 80 113 20 195 b 0 349 1 309 0 328 b 20 467 0 391 6 433 b 255 648 58 563 155 637 m 269 363 b 257 363 265 363 261 363 b 210 345 236 363 220 356 b 186 226 196 324 186 272 b 187 198 186 216 186 206 b 213 95 191 151 202 112 b 257 76 221 83 238 76 b 270 77 261 76 266 76 b 321 156 299 81 310 99 b 329 229 326 183 329 206 b 321 301 329 252 326 274 b 269 363 311 342 298 359 m 236 -1 l 238 -1 l 235 -1 l 236 -1 m 236 673 l 238 673 l 235 673 l 236 673 ',\n },\n timeSig7: {\n x_min: 0,\n x_max: 442.359375,\n ha: 451,\n o: 'm 147 648 b 166 649 153 649 160 649 b 313 598 217 649 273 630 b 340 587 323 588 328 587 l 341 587 b 412 628 367 587 390 601 b 427 638 416 635 421 638 b 439 632 431 638 435 637 b 442 623 441 630 442 628 b 430 569 442 616 439 603 b 352 369 408 492 377 410 b 300 259 325 324 313 298 b 273 84 283 205 273 140 b 265 55 273 65 272 59 l 261 54 l 181 54 l 99 54 l 96 55 b 91 61 95 56 92 59 l 89 63 l 89 77 b 147 263 89 133 111 202 b 261 401 176 313 212 355 b 378 541 315 449 349 489 l 382 548 l 375 544 b 240 495 333 512 285 495 b 129 535 198 495 160 509 b 84 560 108 552 95 560 b 76 559 81 560 78 560 b 31 487 59 555 43 530 b 14 470 27 473 24 470 b 1 477 8 470 4 471 l 0 480 l 0 553 l 0 627 l 1 630 b 16 638 4 635 9 638 b 23 635 17 638 20 637 b 49 626 36 626 39 626 b 96 638 59 626 80 630 b 104 639 99 638 102 639 b 117 644 107 641 112 642 b 147 648 125 645 137 648 m 220 -1 l 221 -1 l 219 -1 l 220 -1 m 220 673 l 221 673 l 219 673 l 220 673 ',\n },\n timeSig8: {\n x_min: 0,\n x_max: 488.640625,\n ha: 499,\n o: 'm 217 648 b 245 649 225 648 235 649 b 453 516 343 649 430 595 b 458 478 455 503 458 491 b 412 370 458 440 441 398 b 411 369 412 369 411 369 b 415 365 411 367 412 367 b 488 231 462 331 488 281 b 472 165 488 208 483 186 b 243 43 434 86 338 43 b 63 104 178 43 112 62 b 0 233 20 140 0 186 b 73 365 0 283 24 331 l 77 369 l 72 374 b 29 476 42 406 29 441 b 217 648 29 557 103 635 m 258 605 b 242 606 253 605 247 606 b 157 552 198 606 157 580 b 160 541 157 548 159 544 b 319 413 176 503 242 452 l 337 403 l 338 406 b 359 476 352 428 359 452 b 258 605 359 537 318 595 m 138 326 b 130 330 134 328 130 330 b 130 330 130 330 130 330 b 107 305 127 330 112 313 b 84 231 91 281 84 256 b 243 86 84 156 151 86 b 249 87 245 86 246 87 b 347 156 303 88 347 120 b 344 172 347 162 345 167 b 156 319 325 227 257 281 b 138 326 151 322 144 324 m 243 -1 l 245 -1 l 242 -1 l 243 -1 m 243 673 l 245 673 l 242 673 l 243 673 ',\n },\n timeSig9: {\n x_min: 0,\n x_max: 475.03125,\n ha: 485,\n o: 'm 191 646 b 212 649 198 648 205 649 b 255 644 227 649 243 646 b 458 448 348 616 428 539 b 475 342 469 415 475 378 b 460 244 475 308 469 274 b 193 44 421 124 303 44 b 91 69 157 44 122 51 b 19 161 43 97 19 126 b 21 181 19 167 20 174 b 98 241 32 220 65 241 b 170 186 129 241 160 223 b 172 166 171 179 172 173 b 121 94 172 134 152 102 b 117 93 118 94 117 93 b 121 90 117 93 118 91 b 185 76 142 80 164 76 b 270 119 220 76 251 91 b 308 259 287 145 300 194 b 313 317 310 277 313 310 b 313 317 313 317 313 317 b 313 317 313 317 313 317 b 304 315 313 317 308 316 b 216 295 273 302 245 295 b 145 308 193 295 170 299 b 19 398 88 327 42 360 b 0 469 5 420 0 444 b 24 551 0 496 8 526 b 191 646 54 596 125 637 m 227 614 b 215 616 224 616 220 616 b 202 614 210 616 206 616 b 152 535 174 610 163 592 b 144 463 147 509 144 485 b 152 391 144 440 147 417 b 216 328 163 344 179 328 b 280 391 253 328 269 344 b 288 463 285 417 288 440 b 280 535 288 485 285 509 b 227 614 269 594 258 610 m 236 -1 l 238 -1 l 235 -1 l 236 -1 m 236 673 l 238 673 l 235 673 l 236 673 ',\n },\n timeSigCommon: {\n x_min: -1.359375,\n x_max: 556.6875,\n ha: 568,\n o: 'm 294 322 b 318 323 299 322 308 323 b 360 320 334 323 352 322 b 526 217 430 310 490 273 b 543 166 537 202 543 184 b 447 70 543 117 503 70 b 445 70 447 70 446 70 b 359 159 394 72 359 113 b 368 201 359 173 362 187 b 442 245 382 229 412 245 b 455 244 446 245 451 245 b 460 244 458 244 460 244 b 460 244 460 244 460 244 b 454 248 460 244 458 245 b 325 291 417 276 372 291 b 285 287 313 291 299 290 b 144 -2 183 269 144 190 b 281 -290 144 -208 179 -280 b 304 -291 289 -291 298 -291 b 524 -105 412 -291 506 -212 b 541 -84 526 -88 530 -84 b 556 -101 551 -84 556 -90 b 549 -138 556 -111 553 -122 b 334 -322 521 -237 435 -310 b 302 -324 323 -323 313 -324 b 13 -101 172 -324 54 -234 b -1 -1 4 -68 -1 -34 b 294 322 -1 161 121 303 ',\n },\n timeSigCutCommon: {\n x_min: 0,\n x_max: 556.6875,\n ha: 568,\n o: 'm 289 545 b 298 546 292 545 295 546 b 318 533 306 546 315 541 b 319 428 319 530 319 528 l 319 327 l 334 327 b 526 223 412 326 485 285 b 543 172 537 206 543 190 b 447 76 543 122 503 76 b 445 76 446 76 446 76 b 359 165 394 77 359 119 b 368 205 359 179 362 192 b 441 251 382 233 412 251 b 455 249 446 251 451 251 b 460 248 458 249 460 248 b 460 248 460 248 460 248 b 454 254 460 249 458 251 b 334 295 419 280 378 294 l 319 295 l 319 4 l 319 -287 l 321 -285 b 328 -285 322 -285 325 -285 b 524 -99 424 -277 507 -198 b 541 -79 526 -84 530 -79 b 556 -97 551 -79 556 -84 b 548 -133 556 -105 553 -117 b 334 -317 521 -233 434 -306 b 322 -319 329 -317 323 -317 l 319 -319 l 319 -424 b 319 -471 319 -444 319 -459 b 313 -541 319 -544 318 -535 b 298 -548 308 -545 303 -548 b 279 -534 289 -548 281 -542 b 277 -424 277 -531 277 -530 l 277 -317 l 273 -317 b 13 -95 153 -305 51 -217 b 0 2 4 -62 0 -29 b 182 295 0 126 66 238 b 274 324 210 309 249 320 l 277 324 l 277 427 b 279 533 277 528 277 530 b 289 545 281 538 285 542 m 277 2 b 277 291 277 161 277 291 b 268 288 277 291 273 290 b 144 1 179 265 144 184 b 276 -284 144 -199 175 -267 l 277 -285 l 277 2 ',\n },\n timeSigPlus: {\n x_min: 0,\n x_max: 319.859375,\n ha: 326,\n o: 'm 149 508 b 159 509 152 509 155 509 b 186 494 170 509 181 503 b 190 440 190 487 190 488 l 190 430 l 190 377 l 242 377 l 251 377 b 303 373 298 377 296 377 b 319 345 314 367 319 356 b 304 319 319 335 314 324 b 250 315 296 315 299 315 l 242 315 l 190 315 l 190 262 l 190 252 b 186 198 190 204 190 205 b 159 183 179 188 170 183 b 132 198 148 183 138 188 b 127 252 127 205 127 204 l 127 262 l 127 315 l 76 315 l 68 315 b 14 319 20 315 21 315 b 0 347 4 324 0 335 b 14 373 0 356 4 367 b 68 377 21 377 20 377 l 76 377 l 127 377 l 127 430 l 127 440 b 132 494 127 488 127 487 b 149 508 136 501 142 505 ',\n },\n timeSigPlusSmall: {\n x_min: 0,\n x_max: 319.859375,\n ha: 326,\n o: 'm 149 508 b 159 509 152 509 155 509 b 186 494 170 509 181 503 b 190 440 190 487 190 488 l 190 430 l 190 377 l 242 377 l 251 377 b 303 373 298 377 296 377 b 319 345 314 367 319 356 b 304 319 319 335 314 324 b 250 315 296 315 299 315 l 242 315 l 190 315 l 190 262 l 190 252 b 186 198 190 204 190 205 b 159 183 179 188 170 183 b 132 198 148 183 138 188 b 127 252 127 205 127 204 l 127 262 l 127 315 l 76 315 l 68 315 b 14 319 20 315 21 315 b 0 347 4 324 0 335 b 14 373 0 356 4 367 b 68 377 21 377 20 377 l 76 377 l 127 377 l 127 430 l 127 440 b 132 494 127 488 127 487 b 149 508 136 501 142 505 ',\n },\n timeSigMinus: {\n x_min: 0,\n x_max: 318.5,\n ha: 325,\n o: 'm 20 376 b 167 377 23 377 96 377 b 296 376 231 377 294 377 b 318 347 311 371 318 359 b 296 316 318 333 311 320 b 159 315 294 315 227 315 b 21 316 91 315 24 315 b 0 345 6 320 0 333 b 20 376 0 359 6 371 ',\n },\n timeSigParensRight: {\n x_min: 25.859375,\n x_max: 164.6875,\n ha: 168,\n o: 'm 34 369 b 40 370 35 370 38 370 b 59 353 49 370 50 367 b 164 40 122 254 155 158 b 164 0 164 33 164 16 b 164 -40 164 -16 164 -34 b 59 -353 155 -158 122 -254 b 40 -371 53 -366 47 -371 b 34 -370 38 -371 36 -370 b 25 -358 28 -367 25 -363 b 31 -337 25 -352 27 -347 b 92 0 72 -234 92 -117 b 31 335 92 116 72 233 b 25 356 27 345 25 352 b 34 369 25 363 28 366 ',\n },\n timeSigParensRightSmall: {\n x_min: 25.859375,\n x_max: 164.6875,\n ha: 168,\n o: 'm 34 369 b 40 370 35 370 38 370 b 59 353 49 370 50 367 b 164 40 122 254 155 158 b 164 0 164 33 164 16 b 164 -40 164 -16 164 -34 b 59 -353 155 -158 122 -254 b 40 -371 53 -366 47 -371 b 34 -370 38 -371 36 -370 b 25 -358 28 -367 25 -363 b 31 -337 25 -352 27 -347 b 92 0 72 -234 92 -117 b 31 335 92 116 72 233 b 25 356 27 345 25 352 b 34 369 25 363 28 366 ',\n },\n timeSigParensLeft: {\n x_min: -166.0625,\n x_max: -25.859375,\n ha: 0,\n o: 'm -49 369 b -42 370 -46 369 -44 370 b -27 360 -36 370 -29 366 b -25 355 -27 359 -25 358 b -32 335 -25 351 -28 347 b -92 52 -66 248 -87 159 b -93 -1 -93 43 -93 20 b -92 -54 -93 -23 -93 -45 b -32 -337 -85 -162 -66 -251 b -25 -355 -27 -349 -25 -352 b -42 -371 -25 -365 -32 -371 b -61 -353 -50 -371 -51 -369 b -163 -63 -119 -262 -153 -165 b -166 -1 -166 -37 -166 -31 b -163 62 -166 30 -166 36 b -61 352 -153 163 -119 260 b -49 369 -54 365 -51 366 ',\n },\n timeSigParensLeftSmall: {\n x_min: -166.0625,\n x_max: -25.859375,\n ha: 0,\n o: 'm -49 369 b -42 370 -46 369 -44 370 b -27 360 -36 370 -29 366 b -25 355 -27 359 -25 358 b -32 335 -25 351 -28 347 b -92 52 -66 248 -87 159 b -93 -1 -93 43 -93 20 b -92 -54 -93 -23 -93 -45 b -32 -337 -85 -162 -66 -251 b -25 -355 -27 -349 -25 -352 b -42 -371 -25 -365 -32 -371 b -61 -353 -50 -371 -51 -369 b -163 -63 -119 -262 -153 -165 b -166 -1 -166 -37 -166 -31 b -163 62 -166 30 -166 36 b -61 352 -153 163 -119 260 b -49 369 -54 365 -51 366 ',\n },\n noteheadDoubleWhole: {\n x_min: 0,\n x_max: 902.421875,\n ha: 921,\n o: 'm 17 240 b 24 241 19 241 21 241 b 32 240 28 241 31 241 b 46 229 38 238 43 234 b 50 88 50 223 50 237 b 50 -1 50 63 50 34 b 50 -90 50 -36 50 -65 b 46 -231 50 -238 50 -224 b 25 -242 42 -238 34 -242 b 0 -224 14 -242 4 -235 b 0 2 0 -222 0 -108 b 0 223 0 112 0 220 b 17 240 2 230 9 237 m 110 240 b 118 241 111 241 114 241 b 126 240 121 241 123 241 b 142 223 133 237 140 230 b 144 123 144 220 144 205 b 144 29 144 45 144 29 b 144 29 144 29 144 29 b 393 183 166 106 264 167 b 450 186 412 184 431 186 b 756 29 600 186 732 120 b 756 29 756 29 756 29 b 758 123 758 29 758 45 b 760 227 758 226 758 223 b 784 241 766 237 774 241 b 804 229 792 241 800 237 b 809 88 808 223 809 237 l 809 -1 l 809 -90 b 804 -231 809 -238 808 -224 b 784 -242 800 -238 792 -242 b 762 -231 775 -242 766 -238 b 758 -124 756 -224 758 -231 b 756 -30 758 -47 758 -30 b 756 -30 756 -30 756 -30 b 509 -184 736 -108 637 -169 b 450 -187 488 -187 469 -187 b 144 -30 300 -187 168 -122 b 144 -30 144 -30 144 -30 b 144 -124 144 -30 144 -47 b 140 -231 144 -231 144 -224 b 118 -242 134 -238 126 -242 b 92 -224 107 -242 96 -235 b 92 2 92 -222 92 -108 b 92 223 92 112 92 220 b 110 240 95 230 102 237 m 432 161 b 413 162 426 162 420 162 b 313 41 351 162 313 109 b 347 -73 313 5 323 -34 b 487 -163 385 -133 439 -163 b 578 -97 526 -163 562 -142 b 588 -43 585 -80 588 -62 b 432 161 588 47 518 147 m 868 240 b 876 241 869 241 872 241 b 884 240 879 241 882 241 b 898 229 890 238 894 234 b 902 88 902 223 902 237 l 902 -1 l 902 -90 b 898 -231 902 -238 902 -224 b 876 -242 892 -238 884 -242 b 852 -224 865 -242 854 -235 b 850 2 850 -222 850 -108 b 852 223 850 112 850 220 b 868 240 853 230 860 237 ',\n },\n noteheadWhole: {\n x_min: 0,\n x_max: 619.3125,\n ha: 632,\n o: 'm 274 184 b 307 186 285 186 296 186 b 616 22 465 186 597 116 b 619 -1 617 13 619 5 b 308 -187 619 -104 483 -187 b 0 -1 133 -187 0 -102 b 5 36 0 11 1 23 b 274 184 29 115 141 176 m 289 161 b 272 162 284 162 277 162 b 171 41 209 162 171 108 b 205 -73 171 5 182 -34 b 345 -163 243 -133 298 -163 b 436 -98 385 -163 420 -142 b 446 -43 443 -80 446 -62 b 289 161 446 47 377 147 ',\n },\n noteheadHalf: {\n x_min: 0,\n x_max: 428.75,\n ha: 438,\n o: 'm 262 186 b 273 186 266 186 272 186 b 274 186 273 186 274 186 b 285 186 274 186 280 186 b 428 48 375 181 428 122 b 386 -68 428 12 416 -29 b 155 -187 329 -145 236 -187 b 12 -111 92 -187 38 -162 b 0 -51 4 -91 0 -72 b 262 186 0 58 122 179 m 366 131 b 352 134 362 133 357 134 b 219 81 321 134 269 115 b 47 -111 126 23 50 -62 b 47 -112 47 -111 47 -112 b 77 -136 47 -129 58 -136 b 264 -45 118 -136 194 -101 b 382 109 336 12 382 76 b 366 131 382 120 377 129 ',\n },\n noteheadBlack: {\n x_min: 0,\n x_max: 428.75,\n ha: 438,\n o: 'm 262 186 b 273 186 266 186 272 186 b 274 186 273 186 274 186 b 285 186 274 186 280 186 b 428 48 375 181 428 122 b 386 -68 428 12 416 -29 b 155 -187 329 -145 236 -187 b 12 -111 92 -187 38 -162 b 0 -51 4 -91 0 -72 b 262 186 0 58 122 179 ',\n },\n noteheadXWhole: {\n x_min: 0,\n x_max: 598.890625,\n ha: 611,\n o: 'm 62 181 b 77 183 66 183 72 183 b 91 181 83 183 88 183 b 202 131 100 180 106 177 l 299 87 l 394 131 b 517 183 499 181 502 183 b 519 183 517 183 518 183 b 598 104 567 183 598 144 b 577 49 598 84 592 65 b 518 15 567 38 563 37 b 484 0 499 6 484 0 b 518 -16 484 -1 499 -8 b 577 -51 563 -38 567 -40 b 598 -105 592 -66 598 -86 b 519 -184 598 -145 567 -184 b 517 -184 518 -184 517 -184 b 394 -133 502 -184 499 -183 l 299 -88 l 202 -133 b 81 -184 99 -183 95 -184 b 77 -184 80 -184 78 -184 b 0 -105 29 -184 0 -145 b 20 -51 0 -86 5 -66 b 80 -16 29 -40 34 -38 b 114 -1 98 -8 114 -1 b 80 15 114 0 98 6 b 20 49 34 37 29 38 b 0 104 6 65 0 84 b 62 181 0 140 23 174 m 88 134 b 74 136 85 134 80 136 b 68 134 72 136 69 136 b 46 104 54 130 46 117 b 55 81 46 95 49 88 b 149 34 59 76 53 80 b 224 -1 190 15 224 0 b 144 -38 224 -1 187 -18 b 54 -84 59 -79 58 -79 b 46 -105 49 -90 46 -98 b 76 -137 46 -122 58 -137 b 78 -137 77 -137 77 -137 b 194 -86 87 -137 76 -141 b 298 -36 250 -58 298 -36 b 298 -36 298 -36 298 -36 b 402 -84 299 -36 345 -58 b 518 -137 522 -141 510 -137 b 521 -137 519 -137 519 -137 b 551 -105 539 -137 551 -122 b 541 -83 551 -98 548 -90 b 447 -36 537 -77 544 -81 b 374 -1 406 -16 374 -1 b 447 34 374 0 406 15 b 541 81 544 80 537 76 b 551 104 548 88 551 97 b 521 136 551 120 539 136 b 518 136 519 136 519 136 b 517 136 518 136 517 136 l 517 136 b 402 83 511 136 511 136 b 298 34 345 56 299 34 b 298 34 298 34 298 34 b 194 84 298 34 250 56 b 88 134 137 111 89 133 ',\n },\n noteheadXHalf: {\n x_min: 0,\n x_max: 406.96875,\n ha: 415,\n o: 'm 55 181 b 70 183 61 183 66 183 b 111 170 85 183 99 179 b 160 130 115 167 137 149 l 202 95 l 245 130 b 319 181 299 176 302 179 b 334 183 325 183 330 183 b 406 109 375 183 406 148 b 401 81 406 99 405 91 b 348 24 394 65 390 59 b 318 -1 332 11 318 0 b 348 -26 318 -1 332 -12 b 401 -83 390 -61 394 -66 b 406 -111 405 -93 406 -101 b 334 -184 406 -149 375 -184 b 319 -183 330 -184 325 -184 b 245 -131 302 -180 299 -177 l 202 -97 l 160 -131 b 85 -183 107 -177 103 -180 b 70 -184 80 -184 76 -184 b 0 -111 31 -184 0 -149 b 4 -83 0 -101 1 -93 b 58 -26 10 -66 16 -61 b 88 -1 74 -12 88 -1 b 58 24 88 0 74 11 b 10 69 23 54 17 59 b 0 109 2 81 0 95 b 55 181 0 142 21 173 m 83 133 b 72 136 78 136 76 136 b 57 131 66 136 61 134 b 46 109 49 126 46 117 b 50 93 46 104 47 98 b 107 45 51 91 77 70 b 160 0 137 20 160 0 b 107 -47 160 -1 137 -22 b 50 -94 77 -72 51 -93 b 46 -111 47 -99 46 -105 b 59 -134 46 -120 50 -130 b 72 -137 62 -136 68 -137 b 83 -136 76 -137 80 -136 b 144 -84 84 -134 107 -116 b 202 -36 176 -58 202 -36 b 261 -84 202 -36 230 -58 b 323 -136 299 -116 321 -134 b 334 -137 326 -136 330 -137 b 345 -134 338 -137 343 -136 b 360 -111 355 -130 360 -120 b 355 -94 360 -105 359 -99 b 299 -47 353 -93 329 -72 b 245 0 269 -22 245 -1 b 299 45 245 0 269 20 b 355 93 329 70 353 91 b 360 109 359 98 360 104 b 345 133 360 119 355 129 b 334 136 343 134 338 136 b 323 134 330 136 326 134 b 261 83 321 133 299 115 b 202 34 230 56 202 34 b 144 83 202 34 176 56 b 83 133 106 115 84 133 ',\n },\n noteheadXBlack: {\n x_min: 0,\n x_max: 406.96875,\n ha: 415,\n o: 'm 21 183 b 28 183 24 183 25 183 b 42 181 34 183 39 183 b 127 108 47 179 47 179 b 202 41 168 72 202 41 b 279 108 204 41 238 72 b 357 177 321 145 356 176 b 375 183 363 181 370 183 b 406 151 392 183 406 169 b 404 137 406 147 405 141 b 322 62 401 131 398 129 b 251 0 284 27 251 0 b 322 -63 251 -1 284 -29 b 404 -138 398 -130 401 -133 b 406 -152 405 -142 406 -148 b 375 -184 406 -170 392 -184 b 357 -179 370 -184 363 -183 b 279 -109 356 -177 321 -147 b 202 -43 238 -73 204 -43 b 127 -109 202 -43 168 -73 b 49 -179 85 -147 50 -177 b 31 -184 43 -183 36 -184 b 0 -152 13 -184 0 -170 b 2 -138 0 -148 0 -142 b 83 -63 5 -133 8 -130 b 155 0 122 -29 155 -1 b 83 62 155 0 122 27 b 8 129 43 97 10 127 b 0 151 2 136 0 144 b 21 183 0 165 8 177 ',\n },\n noteheadCircleX: {\n x_min: 0,\n x_max: 484.5625,\n ha: 494,\n o: 'm 228 245 b 239 247 234 247 239 247 b 243 247 240 247 242 247 b 303 238 257 247 287 242 b 484 -2 417 208 484 104 b 412 -177 484 -65 461 -127 b 243 -248 363 -226 303 -248 b 6 -63 138 -248 36 -180 b 0 -1 1 -41 0 -20 b 228 245 0 127 98 240 m 255 181 b 240 183 247 183 245 183 b 232 181 238 183 235 183 b 142 152 200 180 168 170 l 138 149 l 190 97 l 242 44 l 294 97 l 345 149 l 340 152 b 255 181 315 169 284 180 m 147 -54 l 197 -1 l 147 51 l 95 104 l 91 99 b 62 -1 72 70 62 34 b 66 -43 62 -15 63 -29 b 91 -101 72 -63 80 -84 l 95 -106 l 147 -54 m 393 99 b 389 104 390 102 389 104 b 337 51 389 104 366 80 l 285 -1 l 337 -54 l 389 -106 l 393 -101 b 421 -1 412 -72 421 -36 b 393 99 421 34 412 69 m 294 -98 b 242 -45 265 -69 242 -45 b 190 -98 242 -45 219 -69 l 138 -151 l 142 -154 b 242 -184 172 -174 206 -184 b 340 -154 276 -184 311 -174 l 345 -151 l 294 -98 ',\n },\n noteheadTriangleUpWhole: {\n x_min: 0,\n x_max: 630.203125,\n ha: 643,\n o: 'm 308 204 b 314 205 310 205 313 205 b 326 201 319 205 323 204 b 355 154 328 199 338 180 b 401 83 362 142 392 95 l 409 72 b 431 41 412 66 424 49 b 619 -174 498 -51 570 -134 b 630 -192 626 -180 630 -186 b 626 -202 630 -195 628 -199 b 616 -206 623 -205 620 -206 b 552 -188 608 -206 592 -202 b 310 -155 488 -169 392 -155 b 268 -156 295 -155 281 -155 b 77 -188 197 -161 126 -173 b 13 -206 35 -202 20 -206 b 9 -206 12 -206 10 -206 b 0 -191 2 -202 0 -197 b 8 -176 0 -186 2 -180 b 204 49 58 -136 138 -43 l 220 72 l 227 83 b 295 188 245 108 281 166 b 308 204 299 197 304 202 m 315 147 b 314 147 315 147 314 147 b 314 147 314 147 314 147 b 306 129 314 145 310 138 l 296 105 b 281 72 292 97 284 77 l 274 56 b 181 -123 247 -4 212 -72 l 174 -134 l 176 -133 b 314 -123 215 -127 272 -123 b 451 -133 356 -123 413 -127 l 454 -134 l 449 -123 b 353 56 417 -72 381 -4 l 347 72 b 332 105 344 77 336 97 l 322 129 b 315 147 318 138 315 145 ',\n },\n noteheadTriangleUpHalf: {\n x_min: 0,\n x_max: 438.28125,\n ha: 447,\n o: 'm 212 205 b 219 205 213 205 216 205 b 239 183 228 205 231 204 b 421 -163 298 40 363 -83 b 438 -191 434 -180 438 -186 b 436 -197 438 -192 438 -195 b 424 -206 434 -204 431 -206 b 406 -201 420 -206 415 -205 b 216 -156 347 -172 281 -156 b 23 -205 148 -156 80 -173 b 14 -206 20 -206 17 -206 b 0 -191 6 -206 0 -201 b 6 -176 0 -187 1 -183 b 202 192 63 -104 142 45 b 212 205 205 199 208 202 m 264 48 l 249 81 l 243 94 l 242 91 b 89 -126 208 36 137 -66 b 81 -138 85 -133 81 -138 b 81 -138 81 -138 81 -138 b 81 -138 81 -138 81 -138 b 95 -133 81 -138 87 -136 b 280 -94 156 -108 221 -94 b 334 -98 299 -94 317 -95 b 343 -99 338 -99 343 -99 b 343 -99 343 -99 343 -99 b 338 -94 343 -99 341 -97 b 264 48 318 -58 287 1 ',\n },\n noteheadTriangleUpBlack: {\n x_min: -1.359375,\n x_max: 436.921875,\n ha: 446,\n o: 'm 213 205 b 217 205 215 205 216 205 b 234 194 224 205 234 199 b 236 187 234 194 235 190 l 245 167 l 261 129 l 270 106 b 355 -61 294 54 329 -13 b 420 -163 381 -105 402 -138 b 436 -188 435 -184 436 -184 b 436 -191 436 -190 436 -190 b 421 -206 436 -201 431 -206 l 421 -206 l 416 -206 l 405 -201 b 217 -158 347 -172 283 -158 b 31 -201 153 -158 88 -172 l 20 -206 l 14 -206 l 14 -206 b 0 -191 5 -206 0 -201 b -1 -188 0 -190 -1 -190 b 14 -163 -1 -186 0 -184 b 95 -34 36 -136 72 -77 b 166 106 119 8 148 68 l 175 129 l 183 148 l 200 188 b 213 205 205 199 208 202 ',\n },\n noteheadDiamondWhole: {\n x_min: 0,\n x_max: 627.46875,\n ha: 640,\n o: 'm 306 190 b 314 191 308 191 311 191 b 326 184 318 191 322 190 l 336 173 b 510 52 377 127 442 80 b 515 49 513 51 515 49 b 611 16 537 40 579 24 b 627 0 624 13 627 9 b 607 -18 627 -11 624 -13 b 330 -181 490 -49 389 -109 b 314 -192 323 -190 319 -192 b 306 -191 311 -192 308 -192 b 294 -177 302 -188 302 -188 b 257 -140 287 -170 265 -148 b 19 -18 193 -84 114 -44 b 0 0 2 -13 0 -11 b 16 16 0 9 2 13 b 110 49 47 24 89 40 b 117 52 111 49 114 51 b 145 65 126 56 130 58 b 281 163 200 93 245 124 b 300 186 288 170 291 174 b 306 190 300 187 303 188 m 317 137 b 313 142 315 141 314 142 b 308 137 313 142 311 141 b 161 4 276 84 220 33 b 155 0 159 1 155 0 b 163 -4 155 0 159 -2 b 308 -138 220 -34 276 -84 b 313 -142 311 -141 313 -142 b 317 -138 314 -142 315 -141 b 464 -4 351 -84 406 -34 b 470 0 468 -2 470 0 b 464 4 470 0 468 1 b 317 137 406 33 351 84 ',\n },\n noteheadDiamondHalf: {\n x_min: 0,\n x_max: 438.28125,\n ha: 447,\n o: 'm 212 190 b 219 191 213 191 216 191 b 236 176 225 191 228 190 b 419 18 277 105 341 49 b 436 5 431 13 434 11 b 438 -1 438 4 438 1 b 424 -16 438 -8 432 -13 b 356 -49 409 -20 379 -36 b 234 -180 306 -83 258 -133 b 219 -192 230 -188 224 -192 b 200 -176 213 -192 206 -187 b 9 -15 157 -102 89 -45 b 0 0 2 -12 0 -6 b 16 18 0 9 2 12 b 200 176 93 48 159 104 b 212 190 205 186 208 188 m 239 113 b 236 117 238 116 238 117 b 230 108 235 117 234 115 b 92 -15 196 58 140 8 b 88 -18 91 -16 88 -18 b 92 -20 88 -18 91 -19 b 198 -116 130 -43 166 -74 b 200 -117 200 -117 200 -117 b 201 -117 200 -117 201 -117 b 264 -43 212 -98 242 -62 b 345 15 288 -19 321 4 b 348 18 347 16 348 16 b 344 20 348 18 347 19 b 239 113 307 41 266 79 ',\n },\n noteheadDiamondBlack: {\n x_min: 0,\n x_max: 432.828125,\n ha: 442,\n o: 'm 209 186 b 213 187 210 187 212 187 b 216 187 215 187 216 187 b 224 174 216 186 220 180 b 420 -1 269 105 338 43 b 432 -12 431 -8 432 -9 b 421 -23 432 -15 432 -16 b 228 -180 345 -70 264 -137 b 219 -188 221 -188 221 -188 l 219 -188 b 208 -177 215 -188 215 -188 b 10 1 163 -106 93 -44 b 0 11 0 6 0 8 b 10 22 0 13 0 15 b 202 179 87 69 167 136 b 209 186 206 183 209 186 ',\n },\n augmentationDot: {\n x_min: 0,\n x_max: 133.390625,\n ha: 136,\n o: 'm 54 66 b 65 68 58 68 61 68 b 122 37 88 68 110 56 b 133 -1 130 26 133 12 b 104 -58 133 -23 123 -44 b 66 -69 92 -65 78 -69 b 10 -38 44 -69 23 -58 b 0 -1 2 -27 0 -13 b 54 66 0 30 20 61 ',\n },\n tremolo1: {\n x_min: -206.890625,\n x_max: 428.75,\n ha: 438,\n o: 'm 389 -351 b 394 -351 390 -351 393 -351 b 428 -385 413 -351 428 -367 b 428 -394 428 -388 428 -391 b 394 -428 426 -406 421 -410 l 332 -473 l 269 -516 l 205 -560 l 141 -603 l 77 -648 l 13 -692 l -50 -737 l -114 -780 l -145 -802 b -171 -813 -157 -810 -163 -813 b -175 -813 -172 -813 -174 -813 b -206 -777 -194 -811 -206 -795 b -202 -760 -206 -771 -205 -766 b -87 -675 -197 -752 -206 -757 l -34 -639 l 83 -557 l 145 -514 l 209 -470 l 272 -427 b 389 -351 375 -356 381 -352 ',\n },\n flag8thUp: {\n x_min: -24.5,\n x_max: 317.140625,\n ha: 324,\n o: 'm -24 -161 l -24 -5 l -20 -5 b 0 -24 -9 -5 -2 -12 b 171 -315 21 -124 84 -233 b 317 -660 268 -406 317 -531 b 187 -1014 317 -782 274 -909 b 161 -1034 172 -1034 171 -1034 b 141 -1013 149 -1034 141 -1025 b 152 -991 141 -1004 142 -1002 b 266 -682 228 -899 266 -788 b 174 -430 266 -588 236 -498 b -23 -317 136 -388 66 -348 b -24 -161 -23 -316 -24 -285 ',\n },\n flag8thDown: {\n x_min: -21.78125,\n x_max: 367.5,\n ha: 375,\n o: 'm 230 1031 b 238 1032 232 1032 235 1032 b 259 1014 245 1032 251 1027 b 367 662 330 906 367 782 b 364 602 367 641 367 621 b 232 317 352 488 304 384 b 57 120 155 245 103 187 b -1 18 31 84 6 40 b -19 4 -4 11 -12 4 l -21 4 l -21 159 l -21 315 l -16 315 b 96 335 10 315 62 324 b 315 695 227 380 315 527 b 313 738 315 709 314 724 b 224 991 304 825 273 916 b 216 1013 219 999 216 1007 b 230 1031 216 1021 220 1028 ',\n },\n flag16thUp: {\n x_min: -24.5,\n x_max: 317.140625,\n ha: 324,\n o: 'm -24 -147 l -24 -5 l -20 -5 b -1 -19 -12 -5 -4 -11 b 58 -123 6 -43 31 -86 b 196 -278 93 -173 134 -219 b 317 -570 274 -356 317 -460 b 294 -713 317 -617 308 -666 l 289 -724 l 294 -735 b 317 -873 308 -780 317 -827 b 235 -1132 317 -963 288 -1054 b 209 -1165 228 -1140 224 -1146 b 189 -1177 204 -1172 196 -1177 b 171 -1164 182 -1177 175 -1172 b 168 -1154 170 -1161 168 -1159 b 181 -1132 168 -1149 172 -1142 b 269 -891 238 -1064 269 -975 b 269 -881 269 -886 269 -884 b 262 -814 269 -857 265 -827 b 258 -800 261 -811 259 -806 b 142 -628 240 -731 198 -667 b -8 -589 112 -606 47 -589 b -20 -589 -13 -589 -19 -589 l -24 -589 l -24 -449 l -24 -308 l -20 -308 b -1 -322 -12 -308 -4 -313 b 58 -424 6 -345 31 -388 b 194 -580 93 -476 136 -523 b 259 -660 221 -606 245 -635 b 261 -663 259 -662 261 -663 b 264 -656 262 -663 262 -660 b 269 -587 268 -632 269 -610 b 264 -521 269 -566 268 -544 b 262 -512 264 -517 262 -513 b 258 -498 261 -509 259 -503 b 142 -326 240 -428 198 -365 b -8 -287 112 -303 47 -288 b -20 -287 -13 -287 -19 -287 l -24 -287 l -24 -147 ',\n },\n flag16thDown: {\n x_min: -21.78125,\n x_max: 362.0625,\n ha: 369,\n o: 'm 302 1031 b 308 1032 304 1032 307 1032 b 330 1016 318 1032 325 1027 b 362 867 351 970 362 920 b 340 738 362 824 353 780 l 336 727 l 340 717 b 362 591 355 677 362 634 b 257 323 362 496 325 401 b 204 272 243 306 227 290 b 20 56 129 206 66 133 b -1 18 12 44 0 22 b -19 4 -4 9 -12 4 l -21 4 l -21 140 l -21 276 l -12 277 b 167 333 61 288 127 309 b 319 598 262 388 319 491 b 311 664 319 620 317 642 l 310 673 l 304 664 b 204 548 279 620 250 587 b 20 333 129 483 66 409 b -1 292 12 320 0 298 b -19 280 -4 285 -12 280 l -21 280 l -21 416 l -21 552 l -12 553 b 167 609 61 564 127 585 b 319 874 264 666 319 770 b 294 992 319 914 311 954 b 288 1011 288 1004 288 1007 b 302 1031 288 1021 294 1028 ',\n },\n flag32ndUp: {\n x_min: -24.5,\n x_max: 315.78125,\n ha: 322,\n o: 'm -24 -145 l -24 -5 l -20 -5 b 1 -26 -10 -5 -6 -9 b 175 -241 31 -86 96 -166 b 314 -548 259 -323 304 -420 b 315 -589 315 -555 315 -571 b 314 -630 315 -606 315 -623 b 298 -730 311 -664 306 -699 l 295 -742 l 296 -748 b 314 -850 304 -778 311 -813 b 315 -892 315 -857 315 -874 b 314 -932 315 -909 315 -925 b 298 -1032 311 -967 306 -1002 l 295 -1045 l 296 -1050 b 314 -1153 304 -1081 311 -1115 b 315 -1193 315 -1160 315 -1177 b 314 -1235 315 -1211 315 -1228 b 217 -1526 306 -1338 270 -1444 b 201 -1533 213 -1532 208 -1533 b 182 -1522 193 -1533 185 -1529 b 179 -1514 181 -1518 179 -1517 b 189 -1489 179 -1508 182 -1501 b 266 -1217 240 -1403 266 -1308 b 262 -1156 266 -1196 265 -1177 b 110 -907 247 -1043 190 -950 b 0 -889 87 -895 50 -889 l -1 -889 l -24 -889 l -24 -749 l -24 -610 l -20 -610 b 1 -631 -10 -610 -6 -614 b 175 -846 31 -691 96 -771 b 259 -956 213 -884 236 -914 b 265 -966 262 -961 264 -966 b 265 -966 265 -966 265 -966 b 265 -953 265 -964 265 -959 b 266 -920 266 -943 266 -932 b 262 -853 266 -898 265 -873 b 110 -605 247 -741 190 -648 b 0 -587 87 -592 50 -587 l -1 -587 l -24 -587 l -24 -448 l -24 -308 l -20 -308 b 1 -328 -10 -308 -6 -312 b 175 -544 31 -388 96 -469 b 259 -655 213 -581 236 -612 b 265 -663 262 -659 264 -663 b 265 -663 265 -663 265 -663 b 265 -650 265 -663 265 -657 b 266 -617 266 -641 266 -630 b 262 -551 266 -595 265 -570 b 110 -303 247 -438 190 -345 b 0 -284 87 -290 50 -284 l -1 -284 l -24 -284 l -24 -145 ',\n },\n flag32ndDown: {\n x_min: -21.78125,\n x_max: 366.140625,\n ha: 374,\n o: 'm 276 1378 b 284 1379 279 1379 281 1379 b 306 1360 292 1379 298 1374 b 352 1247 326 1326 343 1286 b 366 1139 362 1213 366 1175 b 347 1009 366 1093 359 1049 l 344 1002 l 347 992 b 352 971 348 986 351 977 b 366 863 362 936 366 899 b 347 732 366 818 359 773 l 344 725 l 347 716 b 352 695 348 710 351 700 b 366 588 362 659 366 623 b 223 262 366 464 314 345 b 189 233 212 252 212 252 b 35 76 126 183 73 129 b -1 16 20 56 2 27 b -19 4 -4 9 -12 4 l -21 4 l -21 137 l -21 270 l -17 270 b 186 344 59 281 134 308 b 319 606 270 399 319 499 b 317 650 319 620 319 635 l 315 659 l 314 655 b 223 537 288 607 258 570 b 189 509 212 528 212 528 b 35 352 126 459 73 405 b -1 292 20 333 2 303 b -19 280 -4 285 -12 280 l -21 280 l -21 413 l -21 546 l -17 546 b 186 620 59 557 134 584 b 319 882 270 675 319 775 b 317 925 319 896 319 911 l 315 935 l 314 931 b 223 813 288 884 258 846 b 189 785 212 805 212 805 b 35 628 126 735 73 681 b -1 569 20 609 2 580 b -19 556 -4 562 -12 556 l -21 556 l -21 689 l -21 823 l -17 823 b 202 907 68 835 152 867 b 319 1157 280 968 319 1061 b 270 1338 319 1218 303 1281 b 262 1358 264 1349 262 1353 b 262 1364 262 1360 262 1363 b 276 1378 265 1371 269 1376 ',\n },\n flag64thUp: {\n x_min: -24.5,\n x_max: 314.421875,\n ha: 321,\n o: 'm -24 -145 l -24 -5 l -20 -5 b 0 -23 -9 -5 -2 -12 b 27 -87 4 -38 14 -66 b 138 -220 53 -136 88 -177 b 235 -328 179 -255 208 -288 b 314 -592 287 -409 314 -501 b 292 -732 314 -639 307 -687 l 289 -742 l 294 -756 b 314 -896 307 -802 314 -849 b 292 -1035 314 -943 307 -991 l 289 -1045 l 294 -1057 b 314 -1197 307 -1104 314 -1152 b 292 -1338 314 -1246 307 -1292 l 289 -1347 l 294 -1360 b 314 -1500 307 -1407 314 -1454 b 273 -1689 314 -1565 300 -1628 b 250 -1712 265 -1710 261 -1712 b 228 -1691 236 -1712 228 -1704 l 228 -1685 l 234 -1675 b 270 -1507 258 -1621 270 -1564 b 98 -1193 270 -1381 209 -1261 b 40 -1174 76 -1179 58 -1174 b -10 -1189 24 -1174 8 -1178 b -20 -1192 -14 -1192 -16 -1192 l -24 -1192 l -24 -1052 l -24 -913 l -20 -913 b 0 -931 -9 -913 -2 -920 b 27 -995 4 -946 14 -974 b 138 -1128 53 -1043 88 -1085 b 257 -1275 190 -1172 228 -1220 b 262 -1283 259 -1279 262 -1283 l 262 -1283 b 269 -1249 264 -1282 268 -1260 b 270 -1206 270 -1233 270 -1220 b 98 -891 270 -1075 206 -957 b 40 -871 76 -877 58 -871 b -10 -886 24 -871 8 -875 b -20 -889 -14 -889 -16 -889 l -24 -889 l -24 -749 l -24 -610 l -20 -610 b 0 -628 -9 -610 -2 -617 b 27 -692 4 -644 14 -671 b 138 -825 53 -741 88 -782 b 257 -973 190 -870 228 -917 b 262 -981 259 -977 262 -981 l 262 -981 b 269 -946 264 -979 268 -957 b 270 -903 270 -931 270 -917 b 98 -588 270 -774 206 -655 b 40 -569 76 -574 58 -569 b -10 -584 24 -569 8 -574 b -20 -587 -14 -587 -16 -587 l -24 -587 l -24 -448 l -24 -308 l -20 -308 b 0 -326 -9 -308 -2 -315 b 27 -390 4 -341 14 -369 b 138 -523 53 -438 88 -480 b 257 -670 190 -567 228 -614 b 262 -678 259 -674 262 -678 b 262 -678 262 -678 262 -678 b 269 -644 264 -677 268 -656 b 270 -601 270 -628 270 -614 b 98 -285 270 -471 206 -352 b 40 -266 76 -273 58 -266 b -10 -281 24 -266 8 -272 b -20 -284 -14 -284 -16 -284 l -24 -284 l -24 -145 ',\n },\n flag64thDown: {\n x_min: -21.78125,\n x_max: 367.5,\n ha: 375,\n o: 'm 259 1553 b 265 1553 261 1553 264 1553 b 288 1540 272 1553 277 1550 b 367 1351 340 1493 367 1424 b 336 1221 367 1308 357 1263 l 332 1211 l 333 1208 b 367 1077 356 1170 367 1124 b 336 945 367 1032 357 986 l 332 935 l 333 932 b 367 800 356 893 367 848 b 336 669 367 756 357 710 l 332 659 l 333 656 b 367 523 356 617 367 571 b 345 412 367 485 360 446 b 231 273 322 356 284 310 b -1 19 121 195 27 93 b -17 4 -4 11 -10 5 l -21 4 l -21 134 l -21 265 l -17 265 b 133 291 20 265 96 278 b 318 537 245 328 318 433 b 307 603 318 559 315 582 b 303 614 304 612 304 614 b 298 609 302 614 300 613 b 231 549 281 589 258 567 b -1 295 121 471 27 369 b -17 280 -4 287 -10 281 l -21 280 l -21 410 l -21 541 l -17 541 b 133 567 20 541 96 555 b 318 813 245 605 318 709 b 307 880 318 835 315 859 b 303 891 304 888 304 891 b 298 885 302 891 300 888 b 231 825 281 866 258 843 b -1 571 121 748 27 645 b -17 556 -4 563 -10 557 l -21 556 l -21 687 l -21 817 l -17 817 b 133 843 20 817 96 830 b 318 1089 245 881 318 985 b 307 1156 318 1111 315 1134 b 303 1167 304 1164 304 1167 b 298 1161 302 1167 300 1164 b 231 1102 281 1140 258 1120 b -1 848 121 1024 27 921 b -17 832 -4 839 -10 834 l -21 832 l -21 963 l -21 1093 l -17 1093 b 114 1113 12 1093 78 1103 b 313 1314 215 1142 289 1218 b 318 1364 317 1331 318 1347 b 255 1511 318 1422 295 1478 b 243 1532 247 1519 243 1525 b 259 1553 243 1540 250 1550 ',\n },\n flag128thUp: {\n x_min: -24.5,\n x_max: 313.0625,\n ha: 319,\n o: 'm -24 -133 l -24 -5 l -20 -5 b -1 -19 -12 -5 -4 -11 b 142 -213 13 -61 74 -144 b 258 -376 196 -269 230 -315 b 313 -605 295 -449 313 -528 b 292 -742 313 -652 306 -699 b 288 -752 289 -748 288 -752 b 288 -752 288 -752 288 -752 b 292 -764 289 -753 291 -757 b 313 -907 306 -811 313 -860 b 292 -1045 313 -954 306 -1002 b 288 -1054 289 -1050 288 -1054 b 288 -1054 288 -1054 288 -1054 b 292 -1067 289 -1054 291 -1060 b 313 -1210 306 -1113 313 -1161 b 292 -1346 313 -1257 306 -1304 b 288 -1357 289 -1353 288 -1357 b 288 -1357 288 -1357 288 -1357 b 292 -1368 289 -1357 291 -1363 b 313 -1512 306 -1415 313 -1464 b 292 -1648 313 -1560 306 -1605 b 288 -1660 289 -1654 288 -1660 b 288 -1660 288 -1660 288 -1660 b 292 -1671 289 -1660 291 -1665 b 313 -1814 306 -1719 313 -1766 b 250 -2040 313 -1897 291 -1977 b 232 -2062 238 -2057 236 -2059 b 221 -2065 230 -2063 225 -2065 b 200 -2045 210 -2065 201 -2057 b 200 -2043 200 -2044 200 -2044 b 208 -2026 200 -2037 202 -2034 b 269 -1826 249 -1966 269 -1897 b 153 -1544 269 -1726 230 -1625 b -9 -1472 115 -1506 58 -1481 b -21 -1471 -14 -1471 -19 -1471 l -24 -1471 l -24 -1343 l -24 -1215 l -20 -1215 b -1 -1229 -12 -1215 -4 -1221 b 142 -1424 13 -1270 74 -1353 b 257 -1582 196 -1478 228 -1524 b 264 -1594 261 -1589 264 -1594 l 264 -1594 b 265 -1582 264 -1594 264 -1589 b 270 -1525 268 -1562 270 -1544 b 153 -1243 270 -1424 228 -1321 b -9 -1170 115 -1203 58 -1178 b -21 -1168 -14 -1170 -19 -1168 l -24 -1168 l -24 -1041 l -24 -913 l -20 -913 b -1 -927 -12 -913 -4 -918 b 142 -1121 13 -967 74 -1050 b 257 -1281 196 -1175 228 -1221 b 264 -1292 261 -1286 264 -1292 l 264 -1292 b 265 -1279 264 -1292 264 -1286 b 270 -1222 268 -1261 270 -1242 b 153 -941 270 -1121 228 -1018 b -9 -867 115 -900 58 -875 b -21 -866 -14 -867 -19 -866 l -24 -866 l -24 -738 l -24 -610 l -20 -610 b -1 -624 -12 -610 -4 -616 b 142 -818 13 -664 74 -749 b 257 -978 196 -873 228 -918 b 264 -989 261 -984 264 -989 l 264 -989 b 265 -977 264 -989 264 -984 b 270 -920 268 -959 270 -939 b 153 -638 270 -818 228 -716 b -9 -564 115 -598 58 -573 b -21 -563 -14 -564 -19 -563 l -24 -563 l -24 -435 l -24 -308 l -20 -308 b -1 -322 -12 -308 -4 -313 b 142 -516 13 -363 74 -446 b 257 -675 196 -571 228 -616 b 264 -687 261 -681 264 -687 l 264 -687 b 265 -674 264 -687 264 -681 b 270 -617 268 -656 270 -637 b 153 -335 270 -516 228 -413 b -9 -262 115 -295 58 -270 b -21 -260 -14 -262 -19 -260 l -24 -260 l -24 -133 ',\n },\n flag128thDown: {\n x_min: -21.78125,\n x_max: 367.5,\n ha: 375,\n o: 'm 276 1900 b 284 1901 279 1900 281 1901 b 306 1883 291 1901 298 1896 b 367 1686 347 1825 367 1757 b 343 1558 367 1643 359 1600 l 338 1549 l 343 1537 b 367 1411 359 1497 367 1454 b 343 1282 367 1367 359 1324 l 338 1272 l 343 1261 b 367 1135 359 1221 367 1178 b 343 1007 367 1090 359 1047 l 338 996 l 343 985 b 367 859 359 945 367 902 b 343 731 367 814 359 771 l 338 720 l 343 709 b 367 582 359 667 367 626 b 289 362 367 503 340 426 b 239 312 276 345 259 330 b 29 77 152 237 76 152 b -1 18 14 54 2 30 b -19 4 -4 11 -12 4 l -21 4 l -21 133 l -20 260 l -13 262 b 98 299 17 269 62 284 b 111 305 103 302 110 305 b 167 334 123 310 156 327 b 319 595 264 391 319 491 b 313 659 319 616 318 638 b 310 667 311 664 311 667 b 307 663 310 667 308 666 b 240 588 289 637 269 614 b 16 331 141 505 62 413 b -1 294 8 316 1 302 b -19 280 -4 287 -12 280 l -21 280 l -21 408 l -20 537 l -13 538 b 98 576 17 545 62 560 b 111 581 103 578 110 581 b 167 610 123 587 156 603 b 319 871 264 667 319 767 b 313 935 319 892 318 913 b 310 942 311 941 311 942 b 307 939 310 942 308 941 b 240 864 289 913 269 889 b 16 607 141 781 62 689 b -1 570 8 592 1 578 b -19 556 -4 563 -12 556 l -21 556 l -21 684 l -20 813 l -13 814 b 98 852 17 821 62 836 b 111 857 103 855 110 857 b 167 886 123 863 156 880 b 319 1147 264 943 319 1043 b 313 1211 319 1168 318 1189 b 310 1218 311 1217 311 1218 b 307 1215 310 1218 308 1217 b 240 1140 289 1188 269 1165 b 16 884 141 1057 62 966 b -1 846 8 868 1 855 b -19 832 -4 839 -12 832 l -21 832 l -21 960 l -20 1089 l -13 1090 b 98 1128 17 1097 62 1111 b 111 1134 103 1131 110 1134 b 167 1163 123 1139 156 1156 b 319 1424 264 1220 319 1320 b 313 1486 319 1444 318 1465 b 310 1494 311 1493 311 1494 b 307 1492 310 1494 308 1493 b 240 1417 289 1464 269 1442 b 16 1160 141 1333 62 1242 b -1 1121 8 1145 1 1131 b -19 1109 -4 1115 -12 1109 l -21 1109 l -21 1236 l -20 1365 l -13 1367 b 98 1404 17 1374 62 1388 b 111 1410 103 1407 110 1410 b 250 1508 172 1437 215 1467 b 319 1701 296 1564 319 1633 b 270 1859 319 1757 303 1814 b 262 1882 265 1868 262 1875 b 276 1900 262 1890 266 1896 ',\n },\n accidentalFlat: {\n x_min: -21.78125,\n x_max: 251.8125,\n ha: 257,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 383 20 616 20 616 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 201 l -21 616 l -20 620 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ',\n },\n accidentalNatural: {\n x_min: 0,\n x_max: 239.5625,\n ha: 244,\n o: 'm 10 460 b 20 462 13 462 14 462 b 39 449 28 462 35 458 l 40 446 l 40 326 b 40 205 40 259 40 205 b 127 227 40 205 80 215 b 220 249 196 244 213 249 b 227 247 224 249 225 248 b 238 237 231 245 235 241 l 239 233 l 239 -106 l 239 -448 l 238 -451 b 219 -463 234 -459 225 -463 b 198 -451 210 -463 202 -459 l 197 -448 l 197 -324 b 197 -201 197 -248 197 -201 b 110 -223 196 -201 157 -210 b 17 -245 42 -240 24 -245 b 10 -242 13 -245 13 -244 b 0 -233 6 -241 2 -237 l 0 -230 l 0 108 l 0 446 l 0 449 b 10 460 2 453 6 458 m 197 22 b 197 70 197 41 197 58 b 196 116 197 113 197 116 l 196 116 b 118 97 196 116 160 106 l 40 77 l 40 -18 b 40 -112 40 -69 40 -112 l 119 -93 l 197 -73 l 197 22 ',\n },\n accidentalSharp: {\n x_min: 0,\n x_max: 323.9375,\n ha: 331,\n o: 'm 217 535 b 225 537 220 537 221 537 b 245 524 235 537 242 533 l 246 521 l 247 390 l 247 258 l 273 265 b 306 270 288 269 299 270 b 322 259 315 270 319 267 b 323 208 323 256 323 233 b 322 158 323 184 323 159 b 288 140 318 148 315 147 b 247 130 254 131 247 130 b 247 65 247 130 247 104 b 247 20 247 51 247 36 l 247 -88 l 273 -81 b 306 -76 289 -77 299 -76 b 318 -81 311 -76 315 -77 b 323 -123 323 -87 323 -86 l 323 -138 l 323 -154 b 318 -195 323 -191 323 -190 b 269 -210 314 -199 315 -199 b 249 -216 259 -213 250 -216 l 247 -216 l 247 -349 l 246 -483 l 245 -487 b 225 -499 242 -495 234 -499 b 206 -487 219 -499 210 -495 l 205 -483 l 205 -355 l 205 -227 l 204 -227 l 181 -233 l 138 -244 b 117 -249 127 -247 117 -249 b 115 -385 115 -249 115 -256 l 115 -523 l 114 -526 b 95 -538 110 -534 102 -538 b 74 -526 87 -538 78 -534 l 73 -523 l 73 -391 b 72 -260 73 -269 73 -260 b 72 -260 72 -260 72 -260 b 19 -273 61 -263 23 -273 b 0 -260 10 -273 4 -267 b 0 -209 0 -256 0 -256 l 0 -162 l 1 -158 b 61 -134 5 -148 5 -148 l 73 -131 l 73 -22 b 72 86 73 79 73 86 b 72 86 72 86 72 86 b 19 74 61 83 23 74 b 0 86 10 74 4 79 b 0 137 0 90 0 90 l 0 184 l 1 188 b 61 212 5 198 5 198 l 73 215 l 73 348 l 73 481 l 74 485 b 95 498 78 492 87 498 b 103 495 98 498 100 496 b 114 485 107 494 111 489 l 115 481 l 115 353 l 115 226 l 121 226 b 159 235 123 227 141 231 l 198 247 l 205 248 l 205 384 l 205 521 l 206 524 b 217 535 209 528 212 533 m 205 9 b 205 119 205 70 205 119 l 205 119 b 182 113 204 119 194 116 l 138 102 b 117 97 127 99 117 97 b 115 -12 115 97 115 91 l 115 -122 l 121 -120 b 159 -111 123 -119 141 -115 l 198 -101 l 205 -98 l 205 9 ',\n },\n accidentalDoubleSharp: {\n x_min: 0,\n x_max: 367.5,\n ha: 375,\n o: 'm 0 124 l 0 187 l 61 187 l 122 187 l 122 138 l 122 91 l 153 61 l 183 30 l 213 61 l 243 91 l 243 138 l 243 187 l 306 187 l 367 187 l 367 124 l 367 61 l 321 61 l 274 61 l 243 30 l 213 0 l 243 -31 l 274 -62 l 321 -62 l 367 -62 l 367 -124 l 367 -188 l 306 -188 l 243 -188 l 243 -140 l 243 -93 l 213 -62 l 183 -31 l 153 -62 l 122 -93 l 122 -140 l 122 -188 l 61 -188 l 0 -188 l 0 -124 l 0 -62 l 46 -62 l 92 -62 l 123 -31 l 153 0 l 123 30 l 92 61 l 46 61 l 0 61 l 0 124 ',\n },\n accidentalDoubleFlat: {\n x_min: -21.78125,\n x_max: 483.1875,\n ha: 493,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 383 20 616 20 616 l 20 148 l 21 151 b 140 199 59 183 102 199 b 206 179 164 199 187 192 l 210 176 l 210 396 l 210 617 l 212 621 b 231 632 216 628 223 632 b 250 620 239 632 247 628 b 251 383 251 616 251 616 l 251 148 l 254 151 b 370 199 291 183 332 199 b 415 191 385 199 400 197 b 483 84 458 176 483 134 b 461 0 483 58 476 29 b 332 -142 439 -40 411 -72 l 255 -215 b 231 -229 240 -229 239 -229 b 216 -223 224 -229 220 -227 b 210 -158 210 -217 210 -223 b 210 -120 210 -148 210 -136 l 210 -29 l 205 -34 b 100 -142 182 -65 159 -88 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 201 l -21 616 l -20 620 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 m 341 131 b 328 133 337 133 332 133 b 322 133 326 133 323 133 b 257 87 296 129 273 113 l 251 80 l 251 -37 l 251 -156 l 255 -152 b 375 81 328 -72 375 20 l 375 83 b 341 131 375 113 367 126 ',\n },\n accidentalParensLeft: {\n x_min: -166.0625,\n x_max: -25.859375,\n ha: 0,\n o: 'm -49 369 b -42 370 -46 369 -44 370 b -27 360 -36 370 -29 366 b -25 355 -27 359 -25 358 b -32 335 -25 351 -28 347 b -92 52 -66 248 -87 159 b -93 -1 -93 43 -93 20 b -92 -54 -93 -23 -93 -45 b -32 -337 -85 -162 -66 -251 b -25 -355 -27 -349 -25 -352 b -42 -371 -25 -365 -32 -371 b -61 -353 -50 -371 -51 -369 b -163 -63 -119 -262 -153 -165 b -166 -1 -166 -37 -166 -31 b -163 62 -166 30 -166 36 b -61 352 -153 163 -119 260 b -49 369 -54 365 -51 366 ',\n },\n accidentalParensRight: {\n x_min: 25.859375,\n x_max: 164.6875,\n ha: 168,\n o: 'm 34 369 b 40 370 35 370 38 370 b 59 353 49 370 50 367 b 164 40 122 254 155 158 b 164 0 164 33 164 16 b 164 -40 164 -16 164 -34 b 59 -353 155 -158 122 -254 b 40 -371 53 -366 47 -371 b 34 -370 38 -371 36 -370 b 25 -358 28 -367 25 -363 b 31 -337 25 -352 27 -347 b 92 0 72 -234 92 -117 b 31 335 92 116 72 233 b 25 356 27 345 25 352 b 34 369 25 363 28 366 ',\n },\n accidentalQuarterToneFlatStein: {\n x_min: 0,\n x_max: 272.21875,\n ha: 278,\n o: 'm 243 631 b 250 632 246 632 249 632 b 270 620 259 632 268 628 l 272 616 l 272 201 l 272 -212 l 270 -216 b 251 -229 268 -224 259 -229 b 227 -215 243 -229 240 -229 l 151 -142 b 32 -16 81 -80 53 -49 b 0 84 9 18 0 52 b 111 199 0 149 42 199 b 137 197 119 199 127 198 b 228 151 168 191 197 177 l 231 148 l 231 383 b 232 620 231 616 231 616 b 243 631 234 624 238 630 m 168 131 b 152 133 163 133 157 133 b 107 102 130 133 111 120 b 106 86 107 97 106 91 b 111 41 106 73 108 56 b 227 -152 125 -13 171 -90 l 231 -156 l 231 -37 l 231 80 l 225 87 b 168 131 210 111 190 126 ',\n },\n accidentalThreeQuarterTonesFlatZimmermann: {\n x_min: 0,\n x_max: 607.0625,\n ha: 619,\n o: 'm 243 631 b 250 632 246 632 249 632 b 270 620 259 632 268 628 l 272 616 l 272 201 l 272 -212 l 270 -216 b 251 -229 268 -224 259 -229 b 227 -215 243 -229 240 -229 l 151 -142 b 32 -16 81 -80 53 -49 b 0 84 9 18 0 52 b 111 199 0 149 42 199 b 137 197 119 199 127 198 b 228 151 168 191 197 177 l 231 148 l 231 383 b 232 620 231 616 231 616 b 243 631 234 624 238 630 m 168 131 b 152 133 163 133 157 133 b 107 102 130 133 111 120 b 106 86 107 97 106 91 b 111 41 106 73 108 56 b 227 -152 125 -13 171 -90 l 231 -156 l 231 -37 l 231 80 l 225 87 b 168 131 210 111 190 126 m 347 631 b 353 632 348 632 351 632 b 374 620 363 632 371 628 b 375 383 375 616 375 616 l 375 148 l 377 151 b 492 199 415 183 454 199 b 537 191 507 199 522 197 b 607 84 582 176 607 134 b 583 0 607 58 598 29 b 455 -142 562 -40 533 -72 l 378 -215 b 355 -229 364 -229 362 -229 b 334 -216 345 -229 337 -224 l 333 -212 l 333 201 l 333 616 l 334 620 b 347 631 337 624 341 630 m 465 131 b 451 133 461 133 455 133 b 445 133 449 133 446 133 b 379 87 419 129 396 113 l 375 80 l 375 -37 l 375 -156 l 378 -152 b 499 81 451 -72 499 20 l 499 83 b 465 131 499 113 490 126 ',\n },\n accidentalQuarterToneSharpStein: {\n x_min: 0,\n x_max: 193.28125,\n ha: 197,\n o: 'm 85 514 b 95 517 88 517 89 517 b 114 505 103 517 110 513 l 115 502 l 115 376 b 115 249 115 306 115 249 b 141 258 117 249 127 252 l 167 266 l 172 266 b 190 254 181 265 187 262 l 193 251 l 193 202 l 193 188 b 187 147 193 149 191 152 b 147 130 183 142 182 141 l 115 119 l 115 9 b 115 -99 115 -51 115 -99 b 141 -91 115 -99 127 -95 b 171 -81 166 -81 167 -81 l 171 -81 b 191 -94 181 -81 189 -87 b 193 -142 191 -97 193 -120 b 191 -195 193 -167 191 -194 b 125 -227 187 -205 187 -204 l 115 -230 l 115 -366 l 115 -503 l 114 -506 b 95 -519 110 -514 102 -519 b 74 -506 87 -519 78 -514 l 73 -503 l 73 -374 b 73 -245 73 -260 73 -245 b 73 -245 73 -245 73 -245 b 55 -252 72 -245 63 -249 l 32 -260 b 19 -263 27 -262 23 -263 b 4 -256 13 -263 8 -260 b 0 -215 0 -251 0 -254 b 0 -199 0 -210 0 -206 l 0 -152 l 1 -149 b 8 -140 2 -145 5 -141 b 42 -127 9 -140 24 -133 l 73 -116 l 73 -5 b 73 23 73 4 73 15 b 73 105 73 70 73 105 b 49 97 73 105 61 101 b 17 88 32 91 23 88 b 4 95 10 88 8 91 b 0 137 0 101 0 98 b 0 151 0 141 0 145 l 0 199 l 1 202 b 43 224 5 212 5 212 l 73 234 l 73 367 l 73 502 l 74 505 b 85 514 77 509 81 513 ',\n },\n accidentalThreeQuarterTonesSharpStein: {\n x_min: -1.359375,\n x_max: 455.96875,\n ha: 465,\n o: 'm 352 541 b 357 542 353 542 355 542 b 377 530 364 542 372 537 l 378 526 l 378 394 l 379 262 l 404 266 b 436 270 420 269 430 270 b 450 265 443 270 446 269 b 455 220 455 259 455 260 l 455 208 l 455 161 l 454 156 b 411 140 449 147 447 147 b 378 133 393 137 379 134 b 378 68 378 133 378 106 b 378 22 378 54 378 38 l 379 -87 l 404 -83 b 436 -79 420 -80 430 -79 b 450 -84 443 -79 446 -80 b 455 -129 455 -90 455 -88 l 455 -141 l 455 -188 l 454 -192 b 413 -209 449 -202 447 -202 b 382 -215 398 -212 383 -215 l 378 -215 l 378 -345 l 378 -380 b 375 -485 378 -484 378 -480 b 357 -494 371 -491 364 -494 b 340 -485 351 -494 344 -491 b 336 -383 337 -480 336 -484 l 336 -349 l 336 -223 l 334 -223 b 291 -231 334 -223 314 -227 l 247 -240 l 247 -371 l 246 -503 l 245 -506 b 225 -519 242 -514 234 -519 b 206 -506 219 -519 210 -514 l 205 -503 l 205 -376 l 205 -248 l 160 -256 l 115 -265 l 115 -396 l 115 -527 l 114 -531 b 95 -544 110 -539 102 -544 b 76 -531 87 -544 78 -539 l 73 -527 l 73 -399 b 73 -273 73 -330 73 -273 b 49 -277 73 -273 61 -274 b 17 -281 32 -280 24 -281 b 4 -276 10 -281 8 -280 b -1 -234 0 -269 -1 -272 b 0 -219 -1 -229 0 -224 l 0 -170 l 1 -167 b 10 -158 2 -163 6 -159 b 49 -149 13 -156 16 -155 l 73 -145 l 73 -34 b 73 76 73 26 73 76 b 49 72 73 76 61 74 b 17 68 32 69 24 68 b 4 73 10 68 8 69 b -1 115 0 80 -1 77 b 0 130 -1 120 0 124 l 0 179 l 1 181 b 10 191 2 186 6 190 b 49 199 13 192 16 194 l 73 204 l 73 338 b 73 374 73 352 73 365 b 77 483 73 484 73 477 b 95 492 81 489 88 492 b 111 483 100 492 107 489 b 115 378 115 477 115 483 l 115 342 b 117 212 115 223 115 212 b 204 229 117 212 200 227 l 205 229 l 205 365 l 205 502 l 206 505 b 225 517 210 513 219 517 b 245 505 234 517 242 513 l 246 502 l 247 369 l 247 237 l 249 237 b 336 254 253 238 336 254 b 337 390 336 254 337 302 l 337 526 l 338 530 b 352 541 341 535 347 539 m 336 15 b 336 126 336 102 336 126 l 336 126 b 291 117 336 126 315 122 l 247 109 l 247 -1 l 247 -112 l 249 -112 b 336 -95 253 -111 336 -95 b 336 15 336 -95 336 -56 m 205 -120 b 205 -55 205 -120 205 -93 b 205 -9 205 -41 205 -24 l 205 101 l 160 93 l 115 84 l 115 -26 b 115 -83 115 -49 115 -69 b 117 -137 115 -133 115 -137 b 205 -120 118 -137 204 -120 ',\n },\n accidentalBuyukMucennebFlat: {\n x_min: -171.5,\n x_max: 251.8125,\n ha: 257,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 553 20 616 20 614 b 20 491 20 503 20 491 l 20 491 b 153 535 47 501 149 535 b 174 514 167 535 174 524 b 164 496 174 508 171 501 b 92 470 164 495 132 484 l 20 445 l 20 390 b 20 363 20 378 20 370 b 20 333 20 340 20 333 l 20 333 b 153 377 47 344 149 377 b 174 356 167 377 174 367 b 164 338 174 349 171 342 b 92 312 164 338 132 326 l 20 288 l 20 219 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 30 -21 -212 -21 -212 b -21 273 -21 163 -21 273 b -84 252 -21 273 -50 263 b -152 230 -133 234 -145 230 b -157 231 -155 230 -156 231 b -171 252 -166 234 -171 244 b -160 270 -171 259 -167 266 b -27 316 -159 270 -93 294 l -21 319 l -21 374 b -21 431 -21 406 -21 431 b -84 409 -21 431 -50 421 b -152 388 -133 392 -145 388 b -157 390 -155 388 -156 388 b -171 409 -166 392 -171 401 b -160 428 -171 417 -167 424 b -27 474 -159 428 -93 451 l -21 476 l -21 546 b -20 620 -21 614 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ',\n },\n accidentalBakiyeFlat: {\n x_min: -176.9375,\n x_max: 251.8125,\n ha: 257,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 503 20 616 20 614 b 20 391 20 442 20 391 b 84 424 20 391 49 406 l 147 456 l 152 456 b 153 456 153 456 153 456 b 175 435 166 456 175 446 b 172 427 175 433 174 430 b 92 380 170 420 172 421 l 20 342 l 20 245 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 54 -21 -212 -21 -212 b -21 322 -21 201 -21 322 b -85 290 -21 322 -50 308 l -148 256 l -153 256 b -155 256 -155 256 -155 256 b -176 277 -167 256 -176 266 b -174 285 -176 280 -175 283 b -93 333 -171 294 -174 292 l -21 370 l -21 494 b -20 620 -21 616 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ',\n },\n accidentalKomaSharp: {\n x_min: -1.359375,\n x_max: 455.96875,\n ha: 465,\n o: 'm 352 541 b 357 542 353 542 355 542 b 377 530 364 542 372 537 l 378 526 l 378 394 l 379 262 l 404 266 b 436 270 420 269 430 270 b 450 265 443 270 446 269 b 455 220 455 259 455 260 l 455 208 l 455 161 l 454 156 b 411 140 449 147 447 147 b 378 133 393 137 379 134 b 378 68 378 133 378 106 b 378 22 378 54 378 38 l 379 -87 l 404 -83 b 436 -79 420 -80 430 -79 b 450 -84 443 -79 446 -80 b 455 -129 455 -90 455 -88 l 455 -141 l 455 -188 l 454 -192 b 413 -209 449 -202 447 -202 b 382 -215 398 -212 383 -215 l 378 -215 l 378 -345 l 378 -380 b 375 -485 378 -484 378 -480 b 357 -494 371 -491 364 -494 b 340 -485 351 -494 344 -491 b 336 -383 337 -480 336 -484 l 336 -349 l 336 -223 l 334 -223 b 291 -231 334 -223 314 -227 l 247 -240 l 247 -371 l 246 -503 l 245 -506 b 225 -519 242 -514 234 -519 b 206 -506 219 -519 210 -514 l 205 -503 l 205 -376 l 205 -248 l 160 -256 l 115 -265 l 115 -396 l 115 -527 l 114 -531 b 95 -544 110 -539 102 -544 b 76 -531 87 -544 78 -539 l 73 -527 l 73 -399 b 73 -273 73 -330 73 -273 b 49 -277 73 -273 61 -274 b 17 -281 32 -280 24 -281 b 4 -276 10 -281 8 -280 b -1 -234 0 -269 -1 -272 b 0 -219 -1 -229 0 -224 l 0 -170 l 1 -167 b 10 -158 2 -163 6 -159 b 49 -149 13 -156 16 -155 l 73 -145 l 73 -34 b 73 76 73 26 73 76 b 49 72 73 76 61 74 b 17 68 32 69 24 68 b 4 73 10 68 8 69 b -1 115 0 80 -1 77 b 0 130 -1 120 0 124 l 0 179 l 1 181 b 10 191 2 186 6 190 b 49 199 13 192 16 194 l 73 204 l 73 338 b 73 374 73 352 73 365 b 77 483 73 484 73 477 b 95 492 81 489 88 492 b 111 483 100 492 107 489 b 115 378 115 477 115 483 l 115 342 b 117 212 115 223 115 212 b 204 229 117 212 200 227 l 205 229 l 205 365 l 205 502 l 206 505 b 225 517 210 513 219 517 b 245 505 234 517 242 513 l 246 502 l 247 369 l 247 237 l 249 237 b 336 254 253 238 336 254 b 337 390 336 254 337 302 l 337 526 l 338 530 b 352 541 341 535 347 539 m 336 15 b 336 126 336 102 336 126 l 336 126 b 291 117 336 126 315 122 l 247 109 l 247 -1 l 247 -112 l 249 -112 b 336 -95 253 -111 336 -95 b 336 15 336 -95 336 -56 m 205 -120 b 205 -55 205 -120 205 -93 b 205 -9 205 -41 205 -24 l 205 101 l 160 93 l 115 84 l 115 -26 b 115 -83 115 -49 115 -69 b 117 -137 115 -133 115 -137 b 205 -120 118 -137 204 -120 ',\n },\n accidentalKucukMucennebSharp: {\n x_min: -1.359375,\n x_max: 255.890625,\n ha: 261,\n o: 'm 118 514 b 127 517 121 517 122 517 b 147 505 136 517 142 513 l 148 502 l 148 403 b 148 306 148 351 148 306 b 174 315 149 306 160 310 l 200 324 l 205 323 b 223 312 213 323 220 319 l 225 308 l 225 260 b 225 245 225 255 225 249 b 220 204 225 208 224 209 b 179 188 216 199 215 199 l 148 177 l 148 124 l 148 70 l 189 84 b 236 98 219 94 230 98 b 247 94 240 98 243 97 b 255 52 254 88 255 87 b 255 33 255 47 255 40 l 254 -12 l 253 -15 b 249 -22 253 -18 250 -20 l 245 -24 l 196 -41 l 148 -58 l 148 -108 b 148 -158 148 -136 148 -158 b 174 -148 148 -158 160 -154 b 204 -140 198 -140 200 -140 l 204 -140 b 224 -152 213 -140 221 -145 b 225 -201 224 -155 225 -177 b 224 -254 225 -226 224 -251 b 157 -284 220 -262 220 -262 l 148 -288 l 148 -395 l 148 -503 l 147 -506 b 127 -519 142 -514 134 -519 b 107 -506 119 -519 111 -514 l 106 -503 l 106 -403 b 106 -303 106 -316 106 -303 b 104 -303 104 -303 104 -303 b 88 -310 104 -303 96 -306 l 63 -319 b 51 -322 59 -320 55 -322 b 36 -315 46 -322 40 -319 b 31 -273 32 -309 31 -312 b 31 -258 31 -269 31 -263 l 31 -210 l 34 -206 b 40 -198 35 -204 38 -199 b 74 -186 42 -197 57 -191 l 106 -173 l 106 -123 b 106 -97 106 -112 106 -104 b 106 -72 106 -76 106 -72 b 104 -72 106 -72 106 -72 b 20 -99 89 -79 23 -99 b 0 -84 10 -99 2 -93 b -1 -37 0 -81 -1 -59 b 0 11 -1 -15 0 9 b 58 40 4 22 2 22 l 106 56 l 106 109 b 106 123 106 115 106 119 b 106 162 106 147 106 162 b 81 155 106 162 93 159 b 50 147 65 149 55 147 b 36 152 43 147 40 148 b 31 194 32 158 31 156 b 31 209 31 198 31 204 l 31 256 l 34 260 b 76 281 38 269 38 269 l 106 292 l 106 396 l 106 502 l 107 505 b 118 514 110 509 114 513 ',\n },\n articAccentAbove: {\n x_min: -348.4375,\n x_max: 24.5,\n ha: 25,\n o: 'm -330 155 b -322 156 -329 156 -326 156 b -315 156 -319 156 -317 156 b -298 147 -311 155 -308 154 b -19 30 -224 98 -122 55 l 2 26 b 24 -1 17 22 24 13 b 2 -27 24 -15 17 -23 l -19 -31 b -298 -148 -122 -56 -224 -99 b -322 -158 -313 -158 -315 -158 b -348 -131 -338 -158 -348 -145 b -344 -117 -348 -127 -347 -122 b -328 -104 -341 -112 -338 -111 b -127 -8 -269 -65 -202 -33 b -106 0 -115 -4 -106 -1 b -127 6 -106 0 -115 2 b -328 102 -202 31 -269 63 b -344 116 -338 109 -341 111 b -348 130 -347 120 -348 124 b -330 155 -348 141 -341 152 ',\n },\n articAccentBelow: {\n x_min: -348.4375,\n x_max: 24.5,\n ha: 25,\n o: 'm -330 155 b -322 156 -329 156 -326 156 b -315 156 -319 156 -317 156 b -298 147 -311 155 -308 154 b -19 30 -224 98 -122 55 l 2 26 b 24 -1 17 22 24 13 b 2 -27 24 -15 17 -23 l -19 -31 b -298 -148 -122 -56 -224 -99 b -322 -158 -313 -158 -315 -158 b -348 -131 -338 -158 -348 -145 b -344 -117 -348 -127 -347 -122 b -328 -104 -341 -112 -338 -111 b -127 -8 -269 -65 -202 -33 b -106 0 -115 -4 -106 -1 b -127 6 -106 0 -115 2 b -328 102 -202 31 -269 63 b -344 116 -338 109 -341 111 b -348 130 -347 120 -348 124 b -330 155 -348 141 -341 152 ',\n },\n articTenutoAbove: {\n x_min: 0,\n x_max: 318.5,\n ha: 325,\n o: 'm 20 376 b 167 377 23 377 96 377 b 296 376 231 377 294 377 b 318 347 311 371 318 359 b 296 316 318 333 311 320 b 159 315 294 315 227 315 b 21 316 91 315 24 315 b 0 345 6 320 0 333 b 20 376 0 359 6 371 ',\n },\n articTenutoBelow: {\n x_min: 0,\n x_max: 318.5,\n ha: 325,\n o: 'm 20 376 b 167 377 23 377 96 377 b 296 376 231 377 294 377 b 318 347 311 371 318 359 b 296 316 318 333 311 320 b 159 315 294 315 227 315 b 21 316 91 315 24 315 b 0 345 6 320 0 333 b 20 376 0 359 6 371 ',\n },\n articStaccatoAbove: {\n x_min: 0,\n x_max: 133.390625,\n ha: 136,\n o: 'm 54 66 b 65 68 58 68 61 68 b 122 37 88 68 110 56 b 133 -1 130 26 133 12 b 104 -58 133 -23 123 -44 b 66 -69 92 -65 78 -69 b 10 -38 44 -69 23 -58 b 0 -1 2 -27 0 -13 b 54 66 0 30 20 61 ',\n },\n articStaccatoBelow: {\n x_min: 0,\n x_max: 133.390625,\n ha: 136,\n o: 'm 54 66 b 65 68 58 68 61 68 b 122 37 88 68 110 56 b 133 -1 130 26 133 12 b 104 -58 133 -23 123 -44 b 66 -69 92 -65 78 -69 b 10 -38 44 -69 23 -58 b 0 -1 2 -27 0 -13 b 54 66 0 30 20 61 ',\n },\n articStaccatissimoAbove: {\n x_min: -73.5,\n x_max: 72.140625,\n ha: 74,\n o: 'm -72 252 l -73 254 l 0 254 l 72 254 l 70 252 b 0 -1 70 248 0 -1 b -72 252 -1 -1 -72 248 ',\n },\n articStaccatissimoBelow: {\n x_min: -73.5,\n x_max: 72.140625,\n ha: 74,\n o: 'm -72 252 l -73 254 l 0 254 l 72 254 l 70 252 b 0 -1 70 248 0 -1 b -72 252 -1 -1 -72 248 ',\n },\n articMarcatoAbove: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -8 -1 b -1 0 -5 -1 -4 0 b 16 -11 5 0 13 -4 b 83 -186 17 -12 47 -90 l 148 -358 l 148 -363 b 127 -385 148 -376 138 -385 b 112 -378 122 -385 118 -383 b 54 -226 110 -374 114 -385 b 0 -81 24 -147 0 -81 b -55 -226 -1 -81 -25 -147 b -114 -378 -115 -385 -111 -374 b -129 -385 -119 -383 -123 -385 b -149 -363 -140 -385 -149 -376 l -149 -358 l -84 -186 b -19 -11 -49 -90 -19 -12 b -8 -1 -17 -8 -12 -4 ',\n },\n articMarcatoBelow: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -8 -1 b -1 0 -5 -1 -4 0 b 16 -11 5 0 13 -4 b 83 -186 17 -12 47 -90 l 148 -358 l 148 -363 b 127 -385 148 -376 138 -385 b 112 -378 122 -385 118 -383 b 54 -226 110 -374 114 -385 b 0 -81 24 -147 0 -81 b -55 -226 -1 -81 -25 -147 b -114 -378 -115 -385 -111 -374 b -129 -385 -119 -383 -123 -385 b -149 -363 -140 -385 -149 -376 l -149 -358 l -84 -186 b -19 -11 -49 -90 -19 -12 b -8 -1 -17 -8 -12 -4 ',\n },\n fermataAbove: {\n x_min: -442.359375,\n x_max: 441,\n ha: 450,\n o: 'm -31 487 b -1 488 -21 488 -10 488 b 434 104 216 488 397 330 b 441 27 438 79 441 47 b 439 12 441 20 439 15 b 419 0 435 4 427 0 b 404 5 413 0 408 1 b 398 30 400 11 398 13 b 0 351 390 213 213 351 b -59 348 -20 351 -39 349 b -400 30 -251 324 -393 191 b -405 5 -400 13 -401 11 b -420 0 -409 1 -415 0 b -441 12 -428 0 -436 4 b -442 27 -441 15 -442 20 b -435 104 -442 47 -439 79 b -31 487 -401 316 -235 474 m -13 131 b -1 133 -9 133 -5 133 b 51 105 19 133 39 123 b 61 70 58 95 61 83 b 51 34 61 58 58 45 b -1 6 39 16 19 6 b -46 27 -17 6 -34 13 b -62 69 -57 38 -62 54 b -13 131 -62 98 -44 124 ',\n },\n fermataBelow: {\n x_min: -441,\n x_max: 439.640625,\n ha: 449,\n o: 'm -428 -2 b -421 0 -427 -1 -424 0 b -406 -6 -416 0 -409 -2 b -400 -31 -401 -12 -400 -15 b -1 -352 -392 -215 -215 -352 b 58 -349 19 -352 38 -351 b 398 -31 250 -326 392 -192 b 404 -6 398 -15 400 -12 b 419 -1 408 -2 413 -1 b 439 -13 427 -1 435 -5 b 439 -29 439 -16 439 -22 b 434 -105 439 -48 438 -80 b 0 -489 397 -333 213 -489 b -68 -484 -23 -489 -44 -488 b -441 -36 -280 -452 -436 -263 b -441 -30 -441 -34 -441 -31 b -428 -2 -441 -11 -439 -5 m -13 -9 b -1 -8 -9 -8 -5 -8 b 50 -36 19 -8 39 -19 b 61 -72 57 -47 61 -59 b 50 -106 61 -84 57 -97 b -1 -134 39 -124 19 -134 b -46 -115 -17 -134 -34 -129 b -62 -72 -57 -102 -62 -87 b -13 -9 -62 -44 -44 -16 ',\n },\n breathMarkComma: {\n x_min: -1.359375,\n x_max: 193.28125,\n ha: 197,\n o: 'm 78 233 b 87 233 81 233 84 233 b 187 140 132 233 174 195 b 193 102 190 127 193 115 b 43 -113 193 22 136 -62 b 27 -119 36 -116 31 -119 b 19 -108 21 -119 19 -115 b 29 -97 19 -102 20 -101 b 102 13 73 -72 102 -27 b 92 51 102 26 98 40 l 91 54 l 84 54 b 8 104 53 54 21 74 b -1 142 1 116 -1 130 b 78 233 -1 187 31 227 ',\n },\n breathMarkUpbow: {\n x_min: -170.140625,\n x_max: 168.78125,\n ha: 172,\n o: 'm -160 567 b -122 567 -159 567 -149 567 l -87 567 l -84 566 b -74 553 -78 563 -77 560 b -20 366 -73 551 -49 466 b 31 186 8 267 31 186 b 85 371 31 186 55 269 b 140 559 114 473 138 557 b 153 567 141 564 148 567 b 168 559 159 567 166 564 b 168 555 168 557 168 557 b 92 281 168 548 159 513 b 14 13 50 134 14 13 b 0 0 14 6 6 0 b -17 15 -8 0 -17 8 b -93 283 -17 15 -51 136 b -170 552 -166 533 -170 548 b -170 553 -170 552 -170 552 b -160 567 -170 560 -167 564 ',\n },\n caesura: {\n x_min: 0,\n x_max: 622.03125,\n ha: 635,\n o: 'm 398 417 b 406 419 401 419 404 419 b 427 398 417 419 427 409 b 427 391 427 395 427 392 b 34 -274 424 385 38 -272 b 20 -280 29 -278 25 -280 b 0 -259 9 -280 0 -270 b 0 -252 0 -256 0 -254 b 393 413 2 -247 389 410 b 398 417 394 415 397 416 m 592 417 b 600 419 594 419 597 419 b 622 398 611 419 622 409 b 620 391 622 395 620 392 b 227 -274 617 385 231 -272 b 213 -280 223 -278 219 -280 b 193 -259 202 -280 193 -270 b 194 -252 193 -256 193 -254 b 586 413 196 -247 582 410 b 592 417 588 415 590 416 ',\n },\n caesuraCurved: {\n x_min: 0,\n x_max: 503.609375,\n ha: 514,\n o: 'm 274 430 b 277 430 276 430 277 430 b 310 394 296 430 310 415 b 308 383 310 391 308 387 b 306 367 307 381 307 374 b 236 120 298 305 272 210 b 40 -273 189 -5 125 -134 b 20 -287 35 -283 27 -287 b 5 -281 14 -287 9 -285 b 0 -267 1 -277 0 -273 b 9 -242 0 -262 2 -255 b 246 395 137 -12 232 242 b 274 430 249 416 257 427 m 468 430 b 472 430 469 430 470 430 b 503 394 490 430 503 415 b 502 383 503 391 503 387 b 499 367 502 381 500 374 b 431 120 491 305 465 210 b 234 -273 382 -5 318 -134 b 213 -287 228 -283 220 -287 b 198 -281 208 -287 202 -285 b 193 -267 194 -277 193 -273 b 202 -242 193 -262 196 -255 b 439 395 330 -12 426 242 b 468 430 442 416 451 427 ',\n },\n restMaxima: {\n x_min: 0,\n x_max: 464.140625,\n ha: 474,\n o: 'm 0 0 l 0 347 l 76 347 l 153 347 l 153 0 l 153 -348 l 76 -348 l 0 -348 l 0 0 m 308 -1 l 308 347 l 386 347 l 464 347 l 464 -1 l 464 -348 l 386 -348 l 308 -348 l 308 -1 ',\n },\n restDoubleWhole: {\n x_min: 0,\n x_max: 386.5625,\n ha: 394,\n o: 'm 0 173 l 0 347 l 193 347 l 386 347 l 386 173 l 386 0 l 193 0 l 0 0 l 0 173 ',\n },\n restWhole: {\n x_min: 0,\n x_max: 447.8125,\n ha: 457,\n o: 'm 0 -87 l 0 0 l 223 0 l 447 0 l 447 -87 l 447 -174 l 223 -174 l 0 -174 l 0 -87 ',\n },\n restHalf: {\n x_min: 0,\n x_max: 447.8125,\n ha: 457,\n o: 'm 0 86 l 0 173 l 223 173 l 447 173 l 447 86 l 447 0 l 223 0 l 0 0 l 0 86 ',\n },\n restQuarter: {\n x_min: 0,\n x_max: 300.8125,\n ha: 307,\n o: 'm 49 505 b 53 506 50 505 51 506 b 70 496 58 506 62 503 b 81 485 73 492 78 488 l 96 473 l 111 459 l 122 449 l 134 438 l 182 396 l 255 330 b 292 291 292 298 292 298 l 292 290 l 292 284 l 283 270 b 209 36 234 197 209 113 b 288 -170 209 -44 235 -119 b 299 -184 295 -179 299 -181 b 300 -191 300 -187 300 -188 b 285 -206 300 -199 294 -206 b 280 -206 283 -206 281 -206 b 247 -201 270 -202 259 -201 b 176 -222 223 -201 197 -208 b 114 -340 136 -249 114 -292 b 172 -471 114 -384 134 -433 b 185 -492 182 -481 185 -487 b 181 -502 185 -496 183 -499 b 171 -508 176 -505 174 -508 b 152 -498 166 -508 160 -503 b 0 -284 65 -428 12 -352 b 0 -260 0 -278 0 -270 b 1 -238 0 -252 0 -242 b 148 -140 16 -177 73 -140 b 209 -148 167 -140 189 -142 b 215 -149 212 -148 215 -149 b 215 -149 215 -149 215 -149 l 215 -149 b 201 -136 215 -148 209 -142 l 157 -97 l 96 -41 b 17 34 21 24 17 29 b 17 37 17 36 17 36 b 17 38 17 37 17 38 b 25 56 17 44 17 44 b 110 298 81 131 110 219 b 46 474 110 367 88 431 b 38 491 40 480 38 487 b 49 505 38 498 42 502 ',\n },\n rest8th: {\n x_min: 0,\n x_max: 349.8125,\n ha: 357,\n o: 'm 88 302 b 103 303 93 302 98 303 b 202 224 149 303 191 270 b 205 199 204 216 205 208 b 178 129 205 173 196 147 l 175 126 l 182 127 b 307 249 236 142 284 190 b 313 259 308 254 311 258 b 329 267 317 265 323 267 b 349 247 340 267 349 259 b 201 -263 349 242 204 -258 b 182 -273 197 -270 190 -273 b 163 -260 174 -273 166 -269 b 161 -256 161 -259 161 -258 b 217 -59 161 -248 170 -220 b 272 129 247 43 272 127 b 272 129 272 129 272 129 b 264 122 272 129 268 126 b 140 80 227 94 183 80 b 36 115 102 80 65 91 b 0 194 10 136 0 165 b 88 302 0 244 32 292 ',\n },\n rest16th: {\n x_min: 0,\n x_max: 450.53125,\n ha: 460,\n o: 'm 189 302 b 204 303 193 302 198 303 b 303 224 250 303 292 270 b 306 199 304 216 306 208 b 279 129 306 173 296 147 l 276 126 l 281 127 b 408 249 337 142 385 190 b 412 259 409 254 412 258 b 430 267 417 265 423 267 b 450 247 441 267 450 259 b 200 -605 450 242 204 -599 b 182 -616 197 -612 190 -616 b 163 -602 174 -616 166 -610 b 161 -598 161 -601 161 -601 b 217 -402 161 -589 170 -562 b 272 -213 247 -298 272 -213 b 272 -213 272 -213 272 -213 b 264 -219 272 -213 268 -216 b 140 -262 227 -247 182 -262 b 36 -226 102 -262 65 -249 b 0 -145 12 -206 0 -176 b 17 -84 0 -124 5 -104 b 103 -38 38 -54 70 -38 b 191 -91 137 -38 172 -56 b 205 -141 201 -106 205 -124 b 178 -212 205 -167 196 -194 l 175 -215 l 182 -213 b 307 -93 236 -198 284 -151 b 372 129 308 -88 372 127 b 372 129 372 129 372 129 b 364 122 372 129 368 126 b 240 80 328 94 283 80 b 137 115 202 80 166 91 b 99 194 111 136 99 165 b 189 302 99 244 133 292 ',\n },\n rest32nd: {\n x_min: 0,\n x_max: 551.25,\n ha: 563,\n o: 'm 289 644 b 304 645 294 645 299 645 b 404 566 349 645 392 613 b 406 541 405 557 406 549 b 379 471 406 514 397 489 l 377 467 l 382 470 b 509 591 438 485 485 531 b 513 601 510 595 513 599 b 530 609 518 607 524 609 b 551 588 540 609 551 602 b 200 -605 551 584 204 -599 b 182 -616 197 -612 190 -616 b 163 -602 174 -616 166 -610 b 161 -598 161 -601 161 -601 b 217 -402 161 -589 170 -562 b 272 -213 247 -298 272 -213 b 272 -213 272 -213 272 -213 b 264 -219 272 -213 268 -216 b 140 -262 227 -247 182 -262 b 36 -226 102 -262 65 -249 b 0 -145 12 -206 0 -176 b 17 -84 0 -124 5 -104 b 103 -38 38 -54 70 -38 b 191 -91 137 -38 172 -56 b 205 -141 201 -106 205 -124 b 178 -212 205 -167 196 -194 l 175 -215 l 182 -213 b 307 -93 236 -198 284 -151 b 372 129 308 -88 372 127 b 372 129 372 129 372 129 b 364 122 372 129 368 126 b 240 80 328 94 283 80 b 137 115 202 80 166 91 b 99 195 112 136 99 165 b 118 256 99 217 106 238 b 204 303 138 287 171 303 b 292 249 238 303 273 285 b 306 199 302 234 306 217 b 279 129 306 173 296 148 l 276 126 l 281 127 b 408 248 336 142 385 190 b 473 470 409 254 473 469 b 473 470 473 470 473 470 b 465 464 473 470 469 467 b 341 421 428 435 383 421 b 236 458 303 421 266 433 b 200 537 212 478 200 508 b 289 644 200 585 234 635 ',\n },\n rest64th: {\n x_min: -1.359375,\n x_max: 651.96875,\n ha: 665,\n o: 'm 389 644 b 405 645 394 645 400 645 b 504 566 450 645 492 613 b 507 541 506 557 507 549 b 480 471 507 514 498 489 l 477 467 l 483 470 b 609 591 539 485 586 531 b 613 601 611 595 613 599 b 631 609 619 607 624 609 b 651 588 641 609 651 602 b 200 -946 651 584 204 -941 b 182 -957 197 -953 190 -957 b 163 -945 174 -957 166 -953 b 161 -939 161 -942 161 -942 b 217 -743 161 -931 170 -904 b 272 -555 247 -639 272 -555 b 272 -555 272 -555 272 -555 b 264 -560 272 -555 268 -557 b 140 -603 227 -589 182 -603 b 36 -567 102 -603 65 -592 b -1 -487 12 -548 -1 -517 b 17 -427 -1 -466 5 -445 b 103 -380 38 -395 70 -380 b 191 -433 137 -380 172 -398 b 205 -484 201 -448 205 -466 b 178 -553 205 -509 196 -535 l 175 -557 l 182 -555 b 307 -435 236 -539 284 -494 b 372 -213 308 -430 372 -215 b 372 -213 372 -213 372 -213 b 364 -219 372 -213 368 -216 b 240 -262 328 -247 283 -262 b 137 -226 202 -262 166 -249 b 99 -145 112 -206 99 -176 b 118 -84 99 -124 106 -104 b 204 -38 138 -54 171 -38 b 292 -91 238 -38 273 -56 b 306 -141 302 -106 306 -124 b 279 -212 306 -167 296 -194 l 276 -215 l 281 -213 b 408 -93 336 -198 385 -151 b 473 129 409 -88 473 127 b 473 129 473 129 473 129 b 465 122 473 129 469 126 b 341 80 428 94 383 80 b 236 115 303 80 266 91 b 200 195 213 136 200 165 b 217 256 200 217 206 238 b 304 303 239 287 272 303 b 393 249 338 303 374 285 b 406 199 402 234 406 217 b 379 129 406 173 397 148 l 377 126 l 382 127 b 509 248 436 142 485 190 b 574 470 510 254 574 469 b 574 470 574 470 574 470 b 566 464 574 470 570 467 b 442 421 529 435 484 421 b 337 458 404 421 367 433 b 300 537 313 478 300 508 b 389 644 300 585 334 635 ',\n },\n rest128th: {\n x_min: -1.359375,\n x_max: 752.703125,\n ha: 768,\n o: 'm 490 985 b 504 986 495 986 500 986 b 604 907 551 986 593 954 b 607 884 607 900 607 892 b 581 813 607 857 597 831 l 578 810 l 583 811 b 710 932 638 827 687 873 b 714 943 711 936 713 942 b 730 952 720 949 725 952 b 752 931 741 952 752 943 b 200 -946 752 927 204 -941 b 182 -957 197 -953 190 -957 b 163 -945 174 -957 166 -953 b 161 -939 161 -942 161 -942 b 217 -743 161 -931 170 -904 b 272 -555 247 -639 272 -555 b 272 -555 272 -555 272 -555 b 264 -560 272 -555 268 -557 b 140 -603 227 -589 182 -603 b 36 -567 102 -603 65 -592 b -1 -487 12 -548 -1 -517 b 17 -427 -1 -466 5 -445 b 103 -380 38 -395 70 -380 b 191 -433 137 -380 172 -398 b 205 -484 201 -448 205 -466 b 178 -553 205 -509 196 -535 l 175 -557 l 182 -555 b 307 -435 236 -539 284 -494 b 372 -213 308 -430 372 -215 b 372 -213 372 -213 372 -213 b 364 -219 372 -213 368 -216 b 240 -262 328 -247 283 -262 b 137 -226 202 -262 166 -249 b 99 -145 112 -206 99 -176 b 118 -84 99 -124 106 -104 b 204 -38 138 -54 171 -38 b 292 -91 238 -38 273 -56 b 306 -141 302 -106 306 -124 b 279 -212 306 -167 296 -194 l 276 -215 l 281 -213 b 408 -93 336 -198 385 -151 b 473 129 409 -88 473 127 b 473 129 473 129 473 129 b 465 122 473 129 469 126 b 341 80 428 94 383 80 b 236 115 303 80 266 91 b 200 195 213 136 200 165 b 217 256 200 217 206 238 b 304 303 239 287 272 303 b 393 249 338 303 374 285 b 406 199 402 234 406 217 b 379 129 406 173 397 148 l 377 126 l 382 127 b 509 248 436 142 485 190 b 574 470 510 254 574 469 b 574 470 574 470 574 470 b 566 464 574 470 570 467 b 442 421 529 435 484 421 b 337 458 404 421 367 433 b 300 538 314 477 300 508 b 318 598 300 559 306 580 b 404 645 340 630 372 645 b 494 592 439 645 475 627 b 507 541 502 577 507 559 b 480 471 507 516 498 489 l 477 467 l 483 470 b 608 589 537 485 586 531 b 675 811 611 595 675 810 b 675 811 675 811 675 811 b 666 806 675 811 671 809 b 543 763 628 777 585 763 b 438 799 504 763 468 775 b 401 878 412 820 401 849 b 490 985 401 928 434 977 ',\n },\n dynamicPiano: {\n x_min: -53.078125,\n x_max: 513.140625,\n ha: 485,\n o: 'm 185 383 b 196 384 187 383 191 384 b 277 334 230 384 259 365 b 288 301 281 324 288 306 b 288 297 288 298 288 297 b 294 302 289 297 291 299 b 394 370 323 338 367 367 b 404 371 398 370 401 371 b 510 272 453 371 498 328 b 513 237 513 262 513 251 b 507 172 513 217 511 192 b 326 -34 487 59 412 -26 b 314 -36 322 -36 318 -36 b 274 -24 298 -36 283 -31 l 265 -16 b 224 44 246 -1 232 20 b 223 49 224 47 223 49 b 223 49 223 49 223 49 b 149 -197 221 48 149 -194 b 149 -198 149 -197 149 -198 b 170 -210 149 -202 155 -205 b 187 -215 174 -210 175 -212 b 204 -231 201 -219 204 -222 b 197 -245 204 -240 202 -242 l 194 -248 l 76 -248 l -42 -248 l -46 -245 b -53 -231 -51 -242 -53 -240 b -35 -215 -53 -222 -49 -217 b -13 -210 -21 -212 -20 -212 b -6 -208 -10 -209 -8 -208 b 0 -206 -6 -208 -2 -206 b 25 -188 13 -201 21 -195 b 163 280 28 -183 163 276 b 166 291 163 283 164 287 b 167 302 167 295 167 299 b 155 324 167 315 161 324 b 155 324 155 324 155 324 b 65 230 125 322 85 280 b 53 215 61 217 58 215 b 51 215 53 215 51 215 b 42 224 46 215 42 217 b 57 263 42 231 47 244 b 140 360 77 305 104 337 b 152 370 144 365 149 369 b 185 383 157 376 172 381 m 374 306 b 366 308 371 308 368 308 b 300 273 348 308 321 294 b 284 254 288 262 287 259 b 280 242 283 249 281 245 b 257 169 279 240 270 213 l 236 98 l 236 93 b 251 48 238 77 243 61 b 279 27 258 37 272 27 b 281 27 279 27 280 27 b 291 31 281 27 287 30 b 396 170 334 52 378 109 b 406 247 402 197 406 224 b 401 277 406 259 405 270 b 374 306 397 290 383 303 ',\n },\n dynamicMezzo: {\n x_min: 46.28125,\n x_max: 669.671875,\n ha: 563,\n o: 'm 183 376 b 189 376 185 376 187 376 b 212 374 197 376 208 376 b 265 337 234 369 253 355 b 274 317 268 331 273 320 b 274 316 274 317 274 316 b 280 323 276 316 276 319 b 311 358 288 337 299 348 b 319 366 315 360 318 365 b 356 376 326 373 340 376 b 382 371 364 376 374 374 b 428 337 400 366 417 352 b 436 317 431 331 436 320 b 438 316 436 317 436 316 b 442 323 438 316 439 319 b 475 358 451 337 462 348 b 483 366 477 360 481 365 b 518 376 488 373 503 376 b 544 373 528 376 536 376 b 604 285 579 360 604 326 b 597 249 604 273 601 258 b 543 63 596 247 544 70 b 541 54 543 61 541 55 b 540 44 540 51 540 47 b 552 23 540 33 545 23 b 552 23 552 23 552 23 b 647 126 586 29 627 72 b 658 138 651 136 653 138 b 660 138 660 138 660 138 b 669 129 666 137 669 136 b 654 88 669 122 665 109 b 562 -12 631 43 602 9 l 549 -19 b 521 -27 540 -24 530 -27 b 447 30 490 -27 458 -4 b 443 58 445 38 443 48 b 450 93 443 72 446 84 b 504 278 453 97 504 272 b 507 288 506 283 506 287 b 509 298 507 292 509 295 b 491 326 509 310 502 320 b 487 327 490 327 488 327 b 479 324 484 327 483 326 b 441 270 462 316 443 288 b 435 249 441 265 436 254 b 398 127 434 248 419 195 b 362 4 379 61 362 5 b 328 -1 359 -1 362 -1 b 314 -1 323 -1 319 -1 b 302 -1 310 -1 306 -1 b 266 4 266 -1 269 -1 b 265 6 265 5 265 5 b 303 144 265 13 272 34 b 343 278 325 216 343 276 b 344 288 343 281 344 285 b 345 298 345 291 345 295 b 330 326 345 310 340 320 b 323 327 328 327 325 327 b 317 324 322 327 321 326 b 279 270 300 316 281 288 b 273 249 279 265 274 254 b 236 127 272 248 255 195 b 200 4 216 61 200 5 b 164 -1 197 -1 198 -1 b 151 -1 161 -1 156 -1 b 140 -1 147 -1 142 -1 b 103 4 104 -1 106 -1 b 103 6 103 5 103 5 b 141 144 103 13 108 34 b 181 278 161 216 179 276 b 182 288 181 281 181 285 b 183 298 182 291 183 295 b 168 324 183 310 178 320 b 160 327 166 326 163 327 b 141 320 156 327 151 324 b 69 230 112 305 85 272 b 57 215 65 217 62 215 b 55 215 57 215 55 215 b 46 224 49 215 46 217 b 59 260 46 231 50 242 b 151 363 81 306 112 341 b 161 369 155 365 160 367 b 183 376 166 371 174 374 ',\n },\n dynamicForte: {\n x_min: -118.421875,\n x_max: 597.53125,\n ha: 381,\n o: 'm 460 574 b 464 574 461 574 462 574 b 488 574 470 574 481 574 b 500 573 491 574 498 574 b 594 503 543 570 588 538 b 597 488 596 498 597 494 b 528 417 597 449 564 417 b 502 423 519 417 510 419 b 465 481 477 434 465 458 b 488 528 465 499 472 516 b 490 530 490 530 490 530 b 490 530 490 530 490 530 b 468 517 488 530 475 523 b 349 340 419 485 377 420 b 347 330 348 334 347 330 b 383 328 347 328 363 328 b 428 326 423 328 424 328 b 442 302 438 320 442 312 b 430 281 442 294 438 285 b 385 276 424 277 426 276 l 377 276 l 332 276 l 330 269 b 178 -117 303 126 250 -9 b 1 -249 129 -194 69 -237 b -20 -251 -6 -251 -13 -251 b -114 -187 -65 -251 -100 -227 b -118 -156 -117 -177 -118 -166 b -51 -84 -118 -116 -91 -84 b -31 -87 -46 -84 -39 -86 b 16 -152 0 -95 16 -124 b -12 -205 16 -173 8 -194 b -16 -208 -14 -206 -16 -208 b -14 -208 -16 -208 -14 -208 b -9 -206 -14 -208 -12 -208 b 74 -124 23 -197 54 -166 b 172 224 98 -79 125 22 b 185 276 178 252 183 274 b 185 276 185 276 185 276 b 141 276 185 276 181 276 b 91 280 96 276 96 276 b 77 302 83 285 77 294 b 91 326 77 312 83 320 b 148 328 95 328 96 328 l 198 330 l 202 341 b 460 574 249 473 351 566 ',\n },\n dynamicRinforzando: {\n x_min: 78.9375,\n x_max: 485.921875,\n ha: 417,\n o: 'm 362 378 b 378 380 367 380 372 380 b 472 348 415 380 453 367 b 485 315 481 338 485 327 b 462 273 485 298 477 281 b 439 267 454 269 446 267 b 398 290 424 267 409 274 b 344 319 385 309 364 319 b 281 269 315 319 289 301 b 279 262 280 266 279 262 b 276 256 279 260 277 258 b 274 249 276 254 274 251 b 238 127 273 248 257 192 b 201 4 217 61 201 5 b 166 -1 198 -1 200 -1 b 153 -1 163 -1 157 -1 b 141 -1 148 -1 144 -1 b 104 4 106 -1 107 -1 b 104 6 104 5 104 5 b 142 144 104 13 110 34 b 182 278 164 219 181 276 b 183 288 182 281 182 285 b 185 302 185 292 185 298 b 164 330 185 317 176 328 b 159 330 163 330 161 330 b 102 302 140 330 119 320 b 91 294 95 295 93 294 b 88 294 91 294 89 294 b 78 303 83 294 78 298 b 81 312 78 306 78 309 b 200 373 106 347 160 373 b 215 371 205 373 209 371 b 266 335 235 367 254 353 b 269 331 268 333 269 331 b 269 331 269 331 269 331 b 273 335 269 331 270 334 b 362 378 298 359 330 376 ',\n },\n dynamicSforzando: {\n x_min: 70.78125,\n x_max: 378.390625,\n ha: 315,\n o: 'm 246 373 b 254 373 249 373 251 373 b 372 324 303 373 360 351 b 378 302 377 317 378 309 b 338 251 378 278 362 255 b 328 249 334 249 332 249 b 283 294 303 249 283 270 b 288 315 283 301 284 308 b 289 319 289 317 289 319 b 289 319 289 319 289 319 b 283 320 289 320 287 320 b 270 322 279 322 274 322 b 206 288 242 322 215 308 b 206 283 206 287 206 285 b 257 223 206 267 230 238 b 284 206 272 213 277 210 b 351 90 328 173 351 130 b 340 47 351 74 348 59 b 205 -30 314 -2 264 -30 b 182 -29 198 -30 190 -30 b 84 15 147 -24 103 -5 b 70 48 74 24 70 36 b 108 99 70 70 85 94 b 121 102 112 101 117 102 b 167 56 147 102 167 80 b 159 31 167 48 164 40 l 156 26 l 157 26 b 190 20 167 22 178 20 b 220 26 201 20 212 22 b 258 65 243 34 258 51 b 257 70 258 66 258 69 b 204 126 249 94 234 109 b 114 258 148 158 114 209 b 125 302 114 273 118 288 b 246 373 147 342 193 370 ',\n },\n dynamicZ: {\n x_min: 29.9375,\n x_max: 420.578125,\n ha: 371,\n o: 'm 115 345 b 221 347 117 345 166 347 b 411 345 306 347 409 345 b 420 330 416 342 420 335 b 415 319 420 326 419 321 b 178 118 397 303 179 118 b 178 117 178 118 178 117 b 181 117 178 117 178 117 b 189 117 182 117 185 117 b 193 117 190 117 191 117 b 247 98 215 117 232 111 b 296 75 266 83 280 76 b 302 75 299 75 300 75 b 322 91 311 75 315 79 b 322 91 322 91 322 91 b 322 91 322 91 322 91 b 319 91 322 91 321 91 b 313 90 318 90 315 90 b 283 107 300 90 288 97 b 277 126 279 114 277 121 b 319 167 277 149 295 167 b 319 167 319 167 319 167 b 362 118 347 167 362 147 b 355 82 362 108 359 96 b 311 33 349 65 340 55 b 224 1 284 12 253 1 b 194 5 213 1 204 2 b 168 18 183 8 178 11 b 110 36 151 30 130 36 b 57 15 88 36 68 29 b 47 11 54 12 51 11 b 31 20 40 11 34 13 b 29 26 31 22 29 25 b 68 66 29 36 39 45 b 285 250 73 71 281 248 b 285 250 285 250 285 250 b 231 252 285 252 261 252 b 137 250 190 252 141 250 b 93 227 122 248 110 241 b 78 220 88 222 83 220 b 66 227 74 220 70 222 b 63 234 65 229 63 231 b 85 291 63 241 69 252 b 115 345 108 342 108 344 ',\n },\n ornamentTrill: {\n x_min: -340.28125,\n x_max: 338.921875,\n ha: 346,\n o: 'm -32 520 b -29 521 -31 520 -31 521 b -23 519 -27 521 -24 520 b -20 513 -21 517 -20 516 b -21 506 -20 512 -20 509 b -31 474 -23 502 -27 488 l -53 402 l -66 352 l -68 349 l -57 349 b -32 351 -51 349 -40 351 b 123 370 19 352 74 359 b 137 371 127 370 133 371 b 170 356 152 371 164 366 b 171 355 170 355 170 355 b 216 366 174 355 183 358 b 280 378 268 377 266 377 b 287 378 283 378 284 378 b 332 349 307 378 322 369 b 338 319 336 341 338 330 b 332 301 338 310 336 302 b 242 280 329 299 246 280 b 242 280 242 280 242 280 b 235 288 236 280 235 283 b 235 292 235 290 235 291 b 236 302 236 297 236 299 b 220 337 236 316 230 330 l 216 340 l 210 335 b 159 276 189 322 172 301 b 118 149 152 265 156 274 b 81 34 84 36 85 36 b -8 13 78 33 -4 13 b -8 13 -8 13 -8 13 b -14 20 -12 15 -14 15 b -8 44 -14 24 -12 31 b -2 66 -5 55 -2 65 b -2 66 -2 66 -2 66 l -2 66 b -43 41 -2 66 -21 55 b -114 4 -98 8 -98 8 b -144 0 -123 0 -134 0 b -242 99 -197 0 -242 43 b -242 109 -242 102 -242 105 b -212 219 -240 122 -242 116 b -185 312 -197 270 -185 312 l -185 312 b -189 312 -185 312 -186 312 b -259 312 -200 312 -227 312 b -321 310 -291 312 -310 310 b -334 312 -330 310 -334 312 b -340 319 -338 313 -340 316 b -336 326 -340 322 -338 324 b -291 337 -334 326 -314 331 l -247 347 l -210 348 b -172 348 -190 348 -172 348 b -168 363 -172 348 -171 355 b -145 442 -151 424 -145 441 b -133 452 -144 444 -140 446 l -77 489 b -32 520 -53 506 -32 520 m 57 334 b 53 335 55 335 54 335 b 44 334 50 335 49 335 b -70 316 8 326 -28 320 b -78 309 -78 316 -78 316 b -108 202 -80 305 -88 274 b -141 81 -136 112 -141 93 b -140 74 -141 79 -141 77 b -117 49 -137 59 -127 49 b -107 52 -114 49 -110 51 b 16 127 -106 54 14 126 b 42 217 16 127 42 215 b 49 241 42 222 44 229 b 73 320 53 251 73 317 b 57 334 73 327 65 333 ',\n },\n ornamentTurn: {\n x_min: -423.3125,\n x_max: 421.9375,\n ha: 431,\n o: 'm -262 197 b -247 197 -257 197 -253 197 b -118 162 -210 197 -163 184 b 40 45 -61 134 -13 98 b 277 -95 119 -33 200 -81 b 289 -97 281 -97 285 -97 b 378 0 332 -97 371 -55 b 378 11 378 4 378 6 b 302 83 378 55 345 83 b 242 66 283 83 262 77 b 208 56 231 59 219 56 b 148 120 175 56 148 81 b 201 186 148 151 164 172 b 261 198 220 194 240 198 b 420 45 341 198 411 136 b 421 22 421 37 421 29 b 245 -199 421 -93 338 -199 b 238 -198 243 -199 240 -199 b -44 -47 148 -194 50 -141 b -250 86 -114 22 -183 66 b -295 94 -270 91 -283 94 b -315 91 -302 94 -307 94 b -381 4 -356 81 -381 43 b -355 -56 -381 -18 -372 -40 b -298 -81 -338 -73 -319 -81 b -246 -68 -283 -81 -265 -77 b -212 -58 -234 -61 -223 -58 b -178 -69 -200 -58 -189 -62 b -151 -122 -160 -81 -151 -101 b -171 -167 -151 -138 -157 -155 b -239 -195 -185 -181 -213 -192 b -257 -197 -245 -197 -250 -197 b -423 -5 -352 -197 -423 -109 b -412 65 -423 16 -419 40 b -262 197 -389 137 -329 188 ',\n },\n ornamentTurnSlash: {\n x_min: -423.3125,\n x_max: 421.9375,\n ha: 431,\n o: 'm -10 276 b -2 277 -8 277 -5 277 b 17 265 5 277 13 273 b 19 163 19 260 19 260 l 19 68 l 39 45 b 277 -95 122 -34 200 -81 b 289 -97 281 -97 285 -97 b 378 0 332 -97 371 -54 b 378 11 378 4 378 6 b 302 83 378 55 345 83 b 242 66 283 83 262 77 b 208 56 231 59 219 56 b 148 120 175 56 148 81 b 200 186 148 151 164 172 b 261 198 220 194 240 198 b 420 45 341 198 411 137 b 421 22 421 37 421 29 b 257 -198 421 -86 347 -188 b 242 -198 251 -198 247 -198 b 20 -105 181 -198 95 -163 l 19 -104 l 19 -183 b 19 -216 19 -195 19 -206 b 12 -273 19 -272 17 -267 b -2 -278 8 -277 2 -278 b -21 -266 -10 -278 -19 -274 b -23 -165 -23 -263 -23 -262 l -23 -69 l -44 -47 b -250 86 -117 23 -183 66 b -295 94 -270 93 -284 94 b -315 91 -302 94 -308 94 b -381 5 -356 81 -381 43 b -355 -56 -381 -16 -372 -40 b -299 -81 -338 -73 -319 -81 b -246 -68 -283 -81 -265 -77 b -212 -58 -234 -61 -223 -58 b -168 -77 -196 -58 -179 -65 b -151 -122 -156 -90 -151 -105 b -179 -174 -151 -141 -160 -162 b -239 -195 -194 -184 -217 -192 b -257 -197 -245 -195 -250 -197 b -423 -5 -349 -197 -423 -113 b -423 0 -423 -4 -423 -1 b -277 194 -420 97 -362 173 b -247 197 -268 197 -258 197 b -24 104 -185 197 -100 162 l -23 102 l -23 181 b -21 265 -23 260 -23 260 b -10 276 -20 269 -14 274 ',\n },\n ornamentMordent: {\n x_min: -402.890625,\n x_max: 401.53125,\n ha: 410,\n o: 'm -10 273 b -4 274 -9 273 -6 274 b 16 262 4 274 12 269 b 17 158 17 259 17 259 l 17 56 l 62 112 b 117 174 110 172 110 172 b 122 174 118 174 119 174 b 132 173 125 174 129 173 b 295 11 134 172 171 134 l 307 -1 l 336 34 b 374 76 366 72 368 74 b 381 77 375 77 378 77 b 401 56 392 77 401 68 b 400 48 401 54 401 51 b 223 -172 397 41 230 -166 b 210 -176 220 -174 215 -176 b 201 -174 206 -176 204 -176 b 112 -87 198 -173 178 -152 b 27 0 65 -38 27 0 b 21 -6 27 0 24 -2 l 17 -12 l 17 -147 b 17 -210 17 -173 17 -194 b 10 -292 17 -297 16 -287 b -2 -299 6 -297 2 -299 b -21 -287 -10 -299 -19 -295 b -24 -174 -23 -284 -23 -284 l -24 -63 l -66 -117 b -121 -176 -110 -170 -114 -176 b -125 -176 -122 -176 -123 -176 b -296 -12 -134 -174 -125 -184 l -308 0 l -337 -34 b -375 -77 -367 -73 -370 -76 b -382 -79 -377 -79 -379 -79 b -402 -58 -393 -79 -402 -69 b -401 -49 -402 -55 -402 -52 b -224 170 -398 -43 -231 165 b -212 174 -221 173 -216 174 b -202 173 -208 174 -205 174 b -39 11 -200 172 -151 122 l -28 -1 l -25 1 l -24 4 l -24 130 b -23 260 -24 256 -24 258 b -10 273 -20 266 -16 270 ',\n },\n ornamentShortTrill: {\n x_min: -402.890625,\n x_max: 401.53125,\n ha: 410,\n o: 'm -219 173 b -213 174 -217 174 -215 174 b -202 173 -209 174 -205 173 b -114 86 -200 172 -179 151 b -28 0 -66 37 -28 0 b 40 84 -28 0 2 37 b 117 174 111 173 110 172 b 122 174 118 174 119 174 b 132 173 125 174 129 173 b 295 11 134 172 171 134 l 307 -1 l 336 34 b 374 76 366 72 368 74 b 381 77 375 77 378 77 b 401 56 392 77 401 68 b 400 48 401 54 401 51 b 223 -172 397 41 230 -166 b 210 -176 220 -174 215 -176 b 201 -174 206 -176 204 -176 b 112 -87 198 -173 178 -152 b 27 0 65 -38 27 0 b -42 -86 27 0 -4 -38 b -118 -174 -112 -174 -111 -173 b -123 -176 -119 -176 -121 -176 b -133 -174 -126 -176 -130 -174 b -296 -12 -136 -173 -172 -137 l -308 0 l -337 -34 b -375 -77 -367 -73 -370 -76 b -382 -79 -377 -79 -379 -79 b -402 -58 -393 -79 -402 -69 b -401 -49 -402 -55 -402 -52 b -224 172 -398 -43 -228 167 b -219 173 -223 172 -220 173 ',\n },\n ornamentTremblement: {\n x_min: -571.671875,\n x_max: 570.3125,\n ha: 582,\n o: 'm -386 173 b -381 174 -385 174 -383 174 b -370 173 -377 174 -372 173 b -281 86 -367 172 -347 151 b -196 0 -235 37 -196 0 b -126 84 -196 0 -164 37 b -50 174 -55 173 -57 172 b -44 174 -49 174 -47 174 b -35 173 -42 174 -38 173 b 53 86 -32 172 -12 151 b 138 0 100 37 138 0 b 208 84 140 0 170 37 b 284 174 279 173 277 172 b 289 174 285 174 288 174 b 299 173 294 174 298 173 b 462 11 303 172 338 134 l 475 -1 l 503 34 b 541 76 534 72 536 74 b 548 77 544 77 545 77 b 570 56 560 77 570 68 b 567 48 570 54 568 51 b 392 -172 564 41 397 -166 b 378 -176 387 -174 382 -176 b 368 -174 374 -176 371 -176 b 280 -87 367 -173 345 -152 b 194 0 234 -38 194 0 b 125 -86 194 0 163 -38 b 49 -174 54 -174 55 -173 b 43 -176 47 -176 46 -176 b 34 -174 40 -176 36 -174 b -54 -87 31 -173 10 -152 b -140 0 -102 -38 -140 0 b -209 -86 -141 0 -171 -38 b -285 -174 -280 -174 -279 -173 b -291 -176 -287 -176 -289 -176 b -300 -174 -295 -176 -299 -174 b -464 -12 -304 -173 -340 -137 l -476 0 l -504 -34 b -543 -77 -534 -73 -537 -76 b -549 -79 -545 -79 -547 -79 b -571 -58 -562 -79 -571 -69 b -568 -49 -571 -55 -570 -52 b -392 172 -566 -43 -396 167 b -386 173 -390 172 -387 173 ',\n },\n ornamentPrecompAppoggTrill: {\n x_min: -571.671875,\n x_max: 570.3125,\n ha: 582,\n o: 'm -559 351 b -551 352 -556 352 -553 352 b -530 338 -543 352 -533 348 b -529 169 -530 337 -529 291 l -529 1 l -507 27 l -441 112 b -382 174 -394 169 -390 174 b -378 174 -381 174 -379 174 b -281 86 -370 174 -375 179 b -196 0 -234 37 -196 0 b -126 84 -196 0 -164 37 b -50 174 -55 173 -57 172 b -44 174 -49 174 -47 174 b -35 173 -42 174 -38 173 b 53 86 -32 172 -12 151 b 138 0 100 37 138 0 b 208 84 140 0 170 37 b 284 174 279 173 279 172 b 289 174 285 174 288 174 b 300 173 294 174 298 173 b 462 11 303 172 340 134 l 475 -1 l 503 34 b 541 76 534 72 536 74 b 548 77 544 77 545 77 b 570 56 560 77 570 68 b 567 48 570 54 568 51 b 392 -172 564 41 397 -166 b 378 -176 387 -174 382 -176 b 368 -174 375 -176 371 -176 b 280 -87 367 -173 347 -152 b 194 0 234 -38 194 0 b 126 -86 194 0 163 -38 b 49 -174 54 -174 55 -173 b 44 -176 47 -176 46 -176 b 34 -174 40 -176 36 -174 b -54 -87 31 -173 10 -152 b -140 0 -102 -38 -140 0 b -209 -86 -140 0 -171 -38 b -285 -174 -280 -174 -279 -173 b -291 -176 -287 -176 -288 -176 b -300 -174 -294 -176 -298 -174 b -464 -11 -303 -173 -374 -102 l -476 0 l -506 -37 b -539 -76 -528 -65 -537 -74 b -551 -80 -543 -79 -547 -80 b -570 -68 -558 -80 -566 -76 l -571 -65 l -571 136 b -570 340 -571 331 -571 337 b -559 351 -568 344 -564 348 ',\n },\n ornamentPrecompSlideTrillDAnglebert: {\n x_min: -590.71875,\n x_max: 589.359375,\n ha: 601,\n o: 'm -367 173 b -362 174 -366 174 -364 174 b -351 173 -357 174 -353 173 b -262 86 -348 172 -328 151 b -176 0 -216 37 -176 0 b -107 84 -176 0 -145 37 b -31 174 -36 173 -38 172 b -25 174 -29 174 -28 174 b -16 173 -23 174 -19 173 b 72 86 -13 172 6 151 b 157 0 119 37 157 0 b 227 84 159 0 189 37 b 303 174 298 173 296 172 b 308 174 304 174 307 174 b 318 173 313 174 317 173 b 481 11 322 172 357 134 l 494 -1 l 522 34 b 560 76 553 72 555 74 b 567 77 563 77 564 77 b 589 56 579 77 589 68 b 586 48 589 54 588 51 b 411 -172 583 41 416 -166 b 397 -176 406 -174 401 -176 b 387 -174 393 -176 390 -176 b 299 -87 386 -173 366 -152 b 213 0 253 -38 213 0 b 144 -86 213 0 182 -38 b 68 -174 73 -174 74 -173 b 62 -176 66 -176 65 -176 b 53 -174 59 -176 55 -174 b -35 -87 50 -173 29 -152 b -121 0 -83 -38 -121 0 b -190 -86 -122 0 -152 -38 b -266 -174 -261 -174 -259 -173 b -272 -176 -268 -176 -270 -176 b -281 -174 -276 -176 -280 -174 b -371 -86 -284 -173 -304 -152 b -457 0 -417 -38 -457 0 l -457 0 b -477 -26 -457 0 -470 -16 b -548 -227 -524 -88 -548 -161 b -536 -303 -548 -254 -544 -280 b -533 -317 -534 -309 -533 -313 b -553 -338 -533 -330 -541 -338 b -577 -315 -566 -338 -571 -333 b -590 -227 -586 -287 -590 -258 b -518 -9 -590 -154 -564 -77 b -465 56 -509 2 -504 8 l -402 134 b -367 173 -375 169 -372 172 ',\n },\n ornamentPrecompSlideTrillBach: {\n x_min: -590.71875,\n x_max: 589.359375,\n ha: 601,\n o: 'm 175 273 b 182 274 178 273 181 274 b 202 262 190 274 198 269 b 204 158 204 259 204 259 l 204 56 l 250 112 b 303 174 296 172 298 172 b 308 174 304 174 307 174 b 318 173 313 174 317 173 b 481 11 322 172 357 134 l 494 -1 l 522 34 b 560 76 553 72 555 74 b 567 77 563 77 564 77 b 589 56 579 77 589 68 b 586 48 589 54 588 51 b 411 -172 583 41 416 -166 b 397 -176 406 -174 401 -176 b 387 -174 393 -176 390 -176 b 299 -87 386 -173 366 -152 b 213 0 253 -38 213 0 b 208 -6 213 0 210 -2 l 204 -12 l 204 -147 b 204 -210 204 -173 204 -194 b 198 -292 204 -297 204 -287 b 183 -299 194 -297 189 -299 b 164 -287 175 -299 167 -295 b 163 -174 163 -284 163 -284 l 161 -63 l 119 -117 b 65 -176 76 -170 73 -176 b 61 -176 63 -176 62 -176 b -35 -87 51 -174 57 -180 b -121 0 -83 -38 -121 0 b -190 -86 -122 0 -152 -38 b -266 -174 -261 -174 -259 -173 b -272 -176 -268 -176 -270 -176 b -281 -174 -276 -176 -280 -174 b -371 -86 -284 -173 -304 -152 b -457 0 -417 -38 -457 0 l -457 0 b -477 -26 -457 0 -470 -16 b -548 -227 -524 -88 -548 -161 b -536 -303 -548 -254 -544 -280 b -533 -317 -534 -309 -533 -313 b -553 -338 -533 -330 -541 -338 b -577 -315 -566 -338 -571 -333 b -590 -227 -586 -287 -590 -258 b -518 -9 -590 -154 -564 -77 b -465 56 -509 2 -504 8 l -402 134 b -363 174 -374 170 -371 174 b -359 174 -362 174 -360 174 b -262 86 -351 174 -356 179 b -176 0 -216 37 -176 0 b -107 84 -176 0 -145 37 b -31 174 -36 173 -38 172 b -25 174 -29 174 -28 174 b -16 173 -23 174 -19 173 b 147 11 -13 172 35 123 l 157 -1 l 160 1 l 163 4 l 163 130 b 164 260 163 256 163 258 b 175 273 166 266 170 270 ',\n },\n ornamentPrecompTrillSuffixDandrieu: {\n x_min: -590.71875,\n x_max: 589.359375,\n ha: 601,\n o: 'm 544 335 b 553 337 548 337 551 337 b 575 313 563 337 570 330 b 589 226 583 285 589 256 b 517 8 589 152 563 76 b 464 -58 507 -4 503 -9 l 401 -136 b 362 -176 372 -172 370 -176 b 357 -176 360 -176 359 -176 b 261 -87 349 -174 355 -180 b 175 0 215 -38 175 0 b 106 -86 175 0 144 -38 b 29 -174 35 -174 36 -173 b 24 -176 28 -176 27 -176 b 14 -174 21 -176 17 -174 b -73 -87 12 -173 -8 -152 b -159 0 -121 -38 -159 0 b -228 -86 -160 0 -190 -38 b -304 -174 -299 -174 -298 -173 b -310 -176 -306 -176 -308 -176 b -319 -174 -314 -176 -318 -174 b -483 -12 -323 -173 -359 -137 l -495 0 l -524 -34 b -562 -77 -553 -73 -556 -76 b -568 -79 -564 -79 -566 -79 b -590 -58 -581 -79 -590 -69 b -588 -49 -590 -55 -589 -52 b -412 170 -585 -43 -417 165 b -398 174 -408 173 -402 174 b -389 173 -394 174 -392 174 b -300 86 -387 172 -366 151 b -215 -1 -254 37 -215 -1 b -145 84 -215 -1 -183 37 b -69 173 -74 173 -76 172 b -63 174 -68 174 -66 174 b -54 173 -61 174 -57 173 b 34 86 -51 172 -31 151 b 119 -1 81 37 119 -1 b 189 84 121 -1 151 37 b 265 173 259 173 258 172 b 270 174 266 174 269 174 b 280 173 274 174 279 173 b 370 84 283 172 303 151 b 455 -1 416 37 455 -1 l 455 -1 b 476 24 455 -1 469 15 b 547 226 522 87 547 159 b 534 302 547 252 543 278 b 532 317 533 308 532 313 b 544 335 532 326 536 333 ',\n },\n ornamentPrecompDoubleCadenceUpperPrefix: {\n x_min: -597.53125,\n x_max: 596.171875,\n ha: 608,\n o: 'm -533 324 b -525 327 -530 326 -528 327 b -504 305 -514 327 -504 317 b -504 305 -504 305 -504 305 b -513 284 -504 299 -504 299 b -556 112 -541 226 -556 167 b -545 33 -556 84 -552 58 b -524 -20 -541 15 -532 -9 l -522 -23 l -491 15 l -413 111 b -355 174 -367 169 -363 174 b -351 174 -353 174 -352 174 b -254 86 -343 174 -348 179 b -168 -1 -208 37 -168 -1 b -100 84 -168 -1 -137 37 b -23 173 -28 173 -29 172 b -19 174 -21 174 -20 174 b -8 173 -14 174 -10 173 b 80 86 -5 172 13 151 b 166 -1 127 37 166 -1 b 235 84 166 -1 197 37 b 311 173 306 173 304 172 b 317 174 313 174 314 174 b 326 173 319 174 323 173 b 490 11 329 172 366 134 l 502 -1 l 530 34 b 568 76 560 72 563 74 b 575 77 570 77 573 77 b 596 56 586 77 596 68 b 594 48 596 54 596 51 b 417 -172 592 41 424 -166 b 405 -176 415 -174 409 -176 b 396 -174 401 -176 398 -176 b 307 -87 393 -173 372 -152 b 221 -1 259 -38 221 -1 b 152 -86 221 -1 190 -38 b 76 -176 81 -174 83 -173 b 70 -176 74 -176 73 -176 b 61 -174 66 -176 62 -174 b -27 -87 58 -173 38 -152 b -114 -1 -74 -38 -112 -1 b -182 -86 -114 -1 -145 -38 b -258 -176 -253 -174 -253 -173 b -264 -176 -259 -176 -262 -176 b -274 -174 -268 -176 -272 -174 b -438 -11 -277 -173 -348 -102 l -449 0 l -479 -37 b -524 -80 -513 -80 -514 -80 l -524 -80 b -553 -52 -534 -80 -540 -74 b -597 109 -583 -8 -597 48 b -560 280 -597 165 -585 224 b -533 324 -548 310 -540 322 ',\n },\n ornamentPrecompDoubleCadenceUpperPrefixTurn: {\n x_min: -597.53125,\n x_max: 596.171875,\n ha: 608,\n o: 'm -533 324 b -525 327 -530 326 -528 327 b -504 305 -514 327 -504 317 b -504 305 -504 305 -504 305 b -513 284 -504 299 -504 299 b -556 112 -541 226 -556 167 b -545 33 -556 84 -552 58 b -524 -20 -541 15 -532 -9 l -522 -23 l -491 15 l -413 111 b -355 174 -367 169 -363 174 b -351 174 -353 174 -352 174 b -254 86 -343 174 -348 179 b -168 -1 -208 37 -168 -1 b -100 84 -168 -1 -137 37 b -23 173 -28 173 -29 172 b -19 174 -21 174 -20 174 b -8 173 -14 174 -10 173 b 155 11 -5 172 43 123 l 166 -1 l 168 1 l 170 4 l 170 130 b 171 260 170 256 170 258 b 191 274 175 269 183 274 b 205 267 196 274 201 272 b 212 158 212 262 210 273 l 212 56 l 257 112 b 311 173 304 172 304 172 b 317 174 313 174 314 174 b 326 173 319 174 323 173 b 490 11 329 172 366 134 l 502 -1 l 530 34 b 568 76 560 72 563 74 b 575 77 570 77 573 77 b 596 56 586 77 596 68 b 594 48 596 54 596 51 b 417 -172 592 41 424 -166 b 405 -176 415 -174 409 -176 b 396 -174 401 -176 398 -176 b 307 -87 393 -173 372 -152 b 221 -1 259 -38 221 -1 b 216 -6 221 -1 219 -2 l 212 -12 l 212 -147 b 212 -210 212 -173 212 -194 b 205 -292 212 -297 210 -287 b 191 -299 201 -297 196 -299 b 172 -287 183 -299 175 -295 b 170 -174 171 -284 171 -284 l 170 -63 l 127 -117 b 73 -176 84 -170 80 -176 b 68 -176 72 -176 70 -176 b -27 -87 59 -174 65 -180 b -114 0 -74 -38 -112 0 b -182 -86 -114 0 -145 -38 b -258 -174 -253 -174 -253 -173 b -264 -176 -259 -176 -262 -176 b -274 -174 -268 -176 -272 -174 b -438 -11 -277 -173 -348 -102 l -449 0 l -479 -37 b -524 -80 -513 -80 -514 -80 l -524 -80 b -553 -52 -534 -80 -540 -74 b -597 109 -583 -8 -597 48 b -560 280 -597 165 -585 224 b -533 324 -548 310 -540 322 ',\n },\n ornamentPrecompTrillLowerSuffix: {\n x_min: -597.53125,\n x_max: 596.171875,\n ha: 608,\n o: 'm -413 173 b -408 174 -412 174 -409 174 b -397 173 -404 174 -400 173 b -308 86 -394 172 -374 151 b -223 0 -261 37 -223 0 b -153 84 -223 0 -191 37 b -77 174 -83 173 -84 172 b -72 174 -76 174 -74 174 b -62 173 -68 174 -63 173 b 25 86 -59 172 -39 151 b 112 0 73 37 111 0 b 181 84 112 0 144 37 b 257 174 251 173 251 172 b 262 174 258 174 261 174 b 273 173 266 174 270 173 b 436 9 276 172 347 101 l 447 -1 l 477 36 b 522 79 511 79 513 79 l 522 79 b 552 51 533 79 539 73 b 596 -112 582 6 596 -51 b 567 -262 596 -161 586 -213 b 539 -322 558 -287 544 -316 b 524 -327 534 -326 529 -327 b 504 -315 515 -327 507 -323 b 503 -308 503 -312 503 -309 b 511 -285 503 -302 504 -297 b 555 -113 540 -227 555 -169 b 544 -34 555 -86 551 -59 b 522 19 540 -16 530 8 l 521 22 l 481 -26 l 405 -122 b 353 -176 366 -172 362 -176 b 349 -176 352 -176 351 -176 b 253 -87 341 -176 347 -180 b 167 0 206 -38 167 0 b 99 -86 167 0 136 -38 b 21 -174 27 -174 28 -173 b 17 -176 20 -176 19 -176 b 6 -174 13 -176 9 -174 b -81 -87 4 -173 -14 -152 b -167 0 -129 -38 -167 0 b -236 -86 -167 0 -198 -38 b -313 -174 -307 -174 -306 -173 b -318 -176 -314 -176 -315 -176 b -328 -174 -321 -176 -325 -174 b -491 -12 -330 -173 -367 -137 l -503 0 l -530 -34 b -570 -77 -562 -73 -564 -76 b -577 -79 -571 -79 -574 -79 b -597 -58 -588 -79 -597 -69 b -596 -49 -597 -55 -597 -52 b -417 172 -593 -43 -423 167 b -413 173 -417 172 -415 173 ',\n },\n stringsDownBow: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -9 215 b 0 217 -6 217 -4 217 b 19 205 8 217 14 213 b 20 142 20 202 20 201 l 20 84 l 23 84 b 144 -27 81 74 129 30 b 148 -66 147 -40 148 -54 b 36 -213 148 -134 103 -197 b 0 -219 24 -217 12 -219 b -145 -104 -68 -219 -129 -173 b -149 -68 -148 -91 -149 -79 b -24 84 -149 6 -98 74 l -21 84 l -21 142 b -19 205 -20 201 -20 202 b -9 215 -17 209 -13 213 m -21 -15 b -23 41 -21 37 -21 41 b -23 41 -23 41 -23 41 b -76 11 -35 40 -62 26 b -108 -65 -98 -11 -108 -38 b -1 -176 -108 -122 -65 -176 b 107 -65 63 -176 107 -122 b 74 11 107 -38 96 -11 b 20 41 61 26 32 41 b 20 -15 20 41 20 15 b 19 -74 20 -72 20 -72 b 0 -87 14 -83 6 -87 b -19 -74 -8 -87 -16 -83 b -21 -15 -20 -72 -20 -72 ',\n },\n stringsUpBow: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -137 381 b -130 383 -134 383 -133 383 b -111 371 -122 383 -114 378 b -55 224 -110 370 -85 305 b 0 80 -25 145 -1 80 b 54 224 0 80 24 145 b 112 377 114 384 110 373 b 127 384 118 381 122 384 b 148 362 138 384 148 374 l 148 356 l 83 183 b 16 9 47 88 17 11 b -1 0 12 2 5 0 b -14 5 -5 0 -10 1 b -84 183 -19 9 -13 -6 l -149 356 l -149 362 b -137 381 -149 371 -145 378 ',\n },\n stringsHarmonic: {\n x_min: -122.5,\n x_max: 121.140625,\n ha: 124,\n o: 'm -16 145 b 0 147 -10 147 -5 147 b 121 -1 66 147 121 77 b 114 -49 121 -16 118 -33 b -1 -148 95 -112 47 -148 b -85 -106 -31 -148 -61 -134 b -122 -1 -110 -76 -122 -38 b -16 145 -122 68 -81 134 m 12 111 b 0 113 8 113 4 113 b -68 22 -29 113 -61 73 b -70 0 -69 15 -70 6 b -13 -113 -70 -49 -47 -98 b -1 -115 -9 -115 -5 -115 b 63 -40 24 -115 53 -83 b 68 -1 66 -27 68 -15 b 12 111 68 48 46 97 ',\n },\n pluckedSnapPizzicatoAbove: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -9 215 b 0 217 -6 217 -4 217 b 19 205 8 217 14 213 b 20 142 20 202 20 201 l 20 84 l 23 84 b 144 -27 81 74 129 30 b 148 -66 147 -40 148 -54 b 36 -213 148 -134 103 -197 b 0 -219 24 -217 12 -219 b -145 -104 -68 -219 -129 -173 b -149 -68 -148 -91 -149 -79 b -24 84 -149 6 -98 74 l -21 84 l -21 142 b -19 205 -20 201 -20 202 b -9 215 -17 209 -13 213 m -21 -15 b -23 41 -21 37 -21 41 b -23 41 -23 41 -23 41 b -76 11 -35 40 -62 26 b -108 -65 -98 -11 -108 -38 b -1 -176 -108 -122 -65 -176 b 107 -65 63 -176 107 -122 b 74 11 107 -38 96 -11 b 20 41 61 26 32 41 b 20 -15 20 41 20 15 b 19 -74 20 -72 20 -72 b 0 -87 14 -83 6 -87 b -19 -74 -8 -87 -16 -83 b -21 -15 -20 -72 -20 -72 ',\n },\n pluckedSnapPizzicatoBelow: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -9 215 b 0 217 -6 217 -4 217 b 19 205 8 217 14 213 b 20 142 20 202 20 201 l 20 84 l 23 84 b 144 -27 81 74 129 30 b 148 -66 147 -40 148 -54 b 36 -213 148 -134 103 -197 b 0 -219 24 -217 12 -219 b -145 -104 -68 -219 -129 -173 b -149 -68 -148 -91 -149 -79 b -24 84 -149 6 -98 74 l -21 84 l -21 142 b -19 205 -20 201 -20 202 b -9 215 -17 209 -13 213 m -21 -15 b -23 41 -21 37 -21 41 b -23 41 -23 41 -23 41 b -76 11 -35 40 -62 26 b -108 -65 -98 -11 -108 -38 b -1 -176 -108 -122 -65 -176 b 107 -65 63 -176 107 -122 b 74 11 107 -38 96 -11 b 20 41 61 26 32 41 b 20 -15 20 41 20 15 b 19 -74 20 -72 20 -72 b 0 -87 14 -83 6 -87 b -19 -74 -8 -87 -16 -83 b -21 -15 -20 -72 -20 -72 ',\n },\n pluckedLeftHandPizzicato: {\n x_min: 0,\n x_max: 319.859375,\n ha: 326,\n o: 'm 149 508 b 159 509 152 509 155 509 b 186 494 170 509 181 503 b 190 440 190 487 190 488 l 190 430 l 190 377 l 242 377 l 251 377 b 303 373 298 377 296 377 b 319 345 314 367 319 356 b 304 319 319 335 314 324 b 250 315 296 315 299 315 l 242 315 l 190 315 l 190 262 l 190 252 b 186 198 190 204 190 205 b 159 183 179 188 170 183 b 132 198 148 183 138 188 b 127 252 127 205 127 204 l 127 262 l 127 315 l 76 315 l 68 315 b 14 319 20 315 21 315 b 0 347 4 324 0 335 b 14 373 0 356 4 367 b 68 377 21 377 20 377 l 76 377 l 127 377 l 127 430 l 127 440 b 132 494 127 488 127 487 b 149 508 136 501 142 505 ',\n },\n keyboardPedalPed: {\n x_min: -1.359375,\n x_max: 1064.390625,\n ha: 1086,\n o: 'm 296 692 b 314 694 302 694 307 694 b 386 685 337 694 366 689 b 548 498 480 660 548 580 b 548 481 548 492 548 487 b 455 395 541 426 499 395 b 370 462 420 395 383 417 b 362 496 364 477 362 488 b 377 514 362 509 367 514 b 393 501 386 514 390 510 b 432 474 397 484 413 474 b 470 487 445 474 458 478 b 491 530 484 496 491 510 b 490 544 491 534 491 539 b 333 660 479 606 411 657 l 323 662 l 315 646 b 269 524 285 591 269 556 b 321 431 269 492 287 466 b 349 395 338 413 343 408 b 363 342 359 378 363 362 b 359 312 363 333 362 322 b 285 158 348 266 318 206 b 281 152 283 155 281 152 b 281 152 281 152 281 152 b 287 154 283 152 284 152 b 318 155 298 154 308 155 b 461 98 371 155 419 136 l 464 97 l 483 112 b 503 129 494 120 503 127 b 504 130 503 129 504 129 b 503 138 504 131 503 134 b 500 180 500 152 500 166 b 553 326 500 238 518 288 b 604 366 560 331 592 358 b 649 381 617 376 632 381 b 696 362 665 381 681 374 b 724 302 714 347 724 324 b 695 238 724 278 714 255 b 660 210 691 234 662 212 b 579 148 658 209 582 151 b 579 148 579 148 579 148 b 596 106 579 144 589 119 b 622 77 604 88 609 83 b 657 69 632 72 645 69 b 748 112 688 69 721 84 b 755 123 754 117 755 120 b 755 127 755 124 755 126 b 751 165 752 137 751 151 b 758 219 751 183 754 202 b 894 387 774 290 820 347 b 896 390 896 388 896 388 b 891 398 896 391 895 392 b 622 560 827 477 730 535 b 600 580 605 564 600 569 b 617 596 600 591 607 596 b 628 595 622 596 624 596 b 1057 248 846 552 1020 412 b 1064 191 1061 229 1064 209 b 922 0 1064 94 1005 9 b 902 -1 916 -1 909 -1 b 774 76 847 -1 800 26 b 769 83 770 81 770 83 b 769 81 769 83 769 83 b 627 -1 733 29 677 -1 b 548 27 597 -1 570 8 b 515 88 537 37 525 61 l 513 95 l 510 93 l 453 45 b 390 0 396 0 396 0 b 390 0 390 0 390 0 b 374 15 381 0 377 4 b 268 105 359 69 314 105 b 250 104 262 105 257 105 l 243 102 l 234 90 b 155 1 201 49 159 2 b 147 -1 152 0 149 -1 b 130 15 138 -1 130 6 b 132 20 130 18 132 19 b 136 31 133 22 134 27 b 220 131 149 74 178 109 b 231 137 225 134 230 136 b 302 278 280 202 302 244 b 265 335 302 299 295 309 b 209 442 234 363 213 402 b 209 455 209 446 209 451 b 279 648 209 502 232 564 l 285 659 l 283 659 b 176 627 238 653 210 645 b 57 477 111 594 66 538 b 55 459 55 471 55 464 b 72 409 55 437 61 415 b 93 403 78 405 87 403 b 152 467 123 403 151 431 b 168 488 153 483 157 488 b 185 462 181 488 185 483 l 185 460 b 137 344 183 409 168 369 b 78 322 119 328 98 322 b 13 360 50 322 25 335 b -1 426 4 380 -1 402 b 89 610 -1 488 32 559 b 296 692 147 659 210 685 m 926 348 b 921 353 924 351 922 353 b 914 348 920 353 918 351 b 823 167 857 306 823 237 b 828 124 823 154 826 138 b 890 31 837 79 862 40 b 896 31 892 31 894 31 b 956 104 916 31 940 59 b 970 191 965 129 970 159 b 966 241 970 208 969 224 b 926 348 959 277 945 313 m 627 326 b 619 326 624 326 622 326 b 598 316 611 326 604 323 b 568 215 579 288 568 255 b 568 208 568 213 568 210 b 571 183 570 195 570 184 l 571 183 b 594 201 571 183 582 191 l 634 231 b 660 259 653 247 656 248 b 664 278 662 266 664 272 b 627 326 664 299 649 320 ',\n },\n keyboardPedalUp: {\n x_min: -1.359375,\n x_max: 592.078125,\n ha: 604,\n o: 'm 280 692 b 295 694 283 692 289 694 b 310 692 300 694 307 692 b 357 630 340 684 357 657 b 336 580 357 612 351 594 b 311 538 321 566 311 549 b 352 492 311 512 330 492 b 366 495 357 492 362 492 b 397 553 390 503 397 517 b 415 603 397 576 402 591 b 460 623 427 617 443 623 b 509 599 479 623 498 614 b 522 559 518 587 522 573 b 494 506 522 538 513 519 b 451 495 481 498 473 496 b 415 488 432 495 426 494 b 394 449 404 483 394 464 b 394 448 394 448 394 448 l 394 440 l 397 433 b 428 409 404 420 413 413 b 438 408 431 408 435 408 b 479 431 450 408 462 415 b 528 455 495 448 510 455 b 548 452 534 455 541 453 b 592 391 577 442 592 416 b 549 331 592 365 577 340 b 528 327 541 328 534 327 b 479 351 510 327 495 335 b 438 374 464 367 450 374 b 417 369 431 374 424 373 b 394 333 402 360 394 348 b 400 312 394 326 396 319 b 451 287 408 294 420 288 b 513 258 484 285 499 278 b 522 223 519 247 522 234 b 461 159 522 190 496 159 b 449 161 457 159 453 159 b 397 229 416 167 397 191 b 366 288 397 265 390 278 b 352 290 362 290 357 290 b 315 262 336 290 321 280 b 311 245 313 256 311 251 b 334 204 311 233 318 220 b 355 170 348 190 351 184 b 357 152 356 166 357 159 b 355 136 357 147 356 140 b 295 88 345 104 321 88 b 232 152 264 88 232 112 b 255 204 232 174 238 186 b 279 244 273 222 279 231 l 279 245 b 238 290 279 270 259 290 b 224 288 234 290 228 290 b 193 229 200 278 193 265 b 141 161 193 191 174 167 b 129 159 137 159 133 159 b 68 223 93 159 68 190 b 77 258 68 234 70 247 b 138 287 91 278 106 285 b 185 302 166 287 175 291 b 196 333 193 312 196 323 b 174 369 196 347 187 360 b 152 374 166 373 159 374 b 111 351 140 374 126 367 b 62 327 95 335 80 327 b 51 328 58 327 54 327 b -1 391 16 334 -1 363 b 53 455 -1 420 17 449 b 62 455 57 455 59 455 b 111 431 80 455 95 448 b 152 408 127 415 140 408 b 161 409 155 408 159 408 b 193 433 176 413 186 420 l 196 440 l 196 448 b 196 451 196 449 196 449 b 190 471 196 459 194 463 b 137 495 182 489 167 495 l 134 495 l 134 495 b 68 560 95 495 68 521 b 129 623 68 596 95 623 b 144 621 134 623 138 623 b 193 553 175 614 193 589 b 224 495 193 517 200 503 b 238 492 228 492 234 492 b 279 538 259 492 279 512 b 254 580 279 549 269 566 b 232 630 239 594 232 612 b 280 692 232 657 250 684 m 307 456 b 295 458 303 458 299 458 b 230 391 258 458 230 426 b 236 360 230 381 231 371 b 295 324 249 337 272 324 b 353 360 318 324 341 337 b 360 391 357 370 360 381 b 307 456 360 421 340 451 ',\n },\n pictChokeCymbal: {\n x_min: 0,\n x_max: 227.3125,\n ha: 232,\n o: 'm 91 213 b 100 215 93 215 96 215 b 227 58 167 215 224 144 b 227 52 227 56 227 54 b 61 -201 227 -43 164 -138 b 29 -216 44 -212 36 -216 b 23 -210 27 -216 24 -213 b 21 -205 21 -208 21 -206 b 34 -192 21 -201 25 -197 b 122 -55 89 -161 122 -106 b 104 6 122 -33 117 -12 l 103 9 l 96 9 b 4 79 57 9 17 38 b 0 112 1 90 0 101 b 91 213 0 163 36 209 ',\n },\n wiggleArpeggiatoUp: {\n x_min: 58.53125,\n x_max: 228.671875,\n ha: 294,\n o: 'm 138 371 b 142 373 140 371 141 373 b 178 342 149 373 156 366 b 228 251 217 297 228 278 b 228 244 228 248 228 247 b 176 147 227 212 212 184 b 123 73 152 122 132 93 b 121 62 122 70 121 66 b 145 13 121 48 129 31 b 153 -2 151 6 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 145 -11 b 129 -1 140 -11 136 -8 b 61 87 89 37 68 68 b 58 113 59 95 58 105 b 110 215 58 144 74 177 b 163 287 134 240 155 269 b 166 299 166 291 166 295 b 141 348 166 313 157 330 b 133 360 134 356 133 358 b 133 363 133 362 133 362 b 138 371 133 367 136 370 ',\n },\n arrowheadBlackUp: {\n x_min: -10.890625,\n x_max: 299.4375,\n ha: 294,\n o: 'm 136 460 b 142 462 137 462 140 462 b 166 449 152 462 161 456 b 171 428 168 446 168 445 b 288 131 194 322 238 209 b 298 115 295 120 296 117 b 299 106 298 112 299 109 b 273 81 299 91 287 81 b 255 86 268 81 261 83 b 155 116 225 104 183 116 l 152 116 l 149 108 b 141 83 148 102 144 91 b 134 48 137 69 134 58 b 149 9 134 34 140 24 b 153 -1 152 5 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 147 -11 b 122 2 138 -11 133 -6 b 95 61 104 20 95 38 b 107 108 95 74 99 90 b 108 113 107 111 108 112 b 107 113 108 113 108 113 b 102 113 106 113 104 113 b 31 86 76 108 53 98 b 14 80 24 81 20 80 b -10 106 0 80 -10 91 b 0 131 -10 115 -9 116 b 115 430 49 209 91 317 b 136 460 119 451 123 456 ',\n },\n arrowheadBlackDown: {\n x_min: -10.890625,\n x_max: 298.078125,\n ha: 294,\n o: 'm 138 473 b 142 474 140 473 141 474 b 164 459 148 474 153 470 b 191 402 183 442 191 423 b 181 353 191 388 187 371 b 178 349 179 352 178 349 b 179 348 178 348 179 348 b 185 349 181 348 182 348 b 255 376 210 355 234 363 b 272 381 264 381 266 381 b 298 355 287 381 298 370 b 288 330 298 348 298 345 b 171 34 238 254 194 141 b 166 13 168 16 168 16 b 144 1 161 5 152 1 b 121 15 134 1 125 5 b 115 33 119 18 117 24 b 0 330 91 145 49 252 b -10 355 -9 345 -10 348 b 13 381 -10 371 0 381 b 31 376 19 381 25 380 b 132 345 61 358 103 345 l 136 345 l 137 355 b 145 378 138 359 142 370 b 152 415 149 394 152 405 b 137 452 152 427 148 438 b 133 464 134 458 133 460 b 138 473 133 467 134 470 ',\n },\n vexAccidentalMicrotonal1: {\n x_min: -171.5,\n x_max: 483.1875,\n ha: 493,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 495 20 616 20 616 b 20 373 20 427 20 373 b 115 410 20 373 63 390 l 210 448 l 210 531 b 212 620 210 614 210 616 b 231 632 215 628 223 632 b 246 627 236 632 242 631 b 251 541 251 620 251 628 l 251 463 l 315 489 b 387 514 368 509 381 514 b 393 513 390 514 392 514 b 406 494 402 510 406 502 b 397 476 406 487 404 480 b 323 446 396 474 363 462 l 251 417 l 251 283 l 251 148 l 254 151 b 370 199 291 183 332 199 b 415 191 385 199 400 197 b 483 84 458 176 483 134 b 461 0 483 58 476 29 b 332 -142 439 -40 411 -72 l 255 -215 b 231 -229 240 -229 239 -229 b 216 -223 224 -229 220 -227 b 210 -158 210 -217 210 -223 b 210 -120 210 -148 210 -136 l 210 -29 l 205 -34 b 100 -142 182 -65 159 -88 l 23 -215 b -1 -229 9 -229 6 -229 b -19 -217 -9 -229 -16 -224 l -20 -215 l -21 48 l -21 310 l -83 287 b -152 262 -133 266 -145 262 b -157 263 -153 262 -155 262 b -171 283 -166 266 -171 274 b -161 301 -171 290 -167 297 b -91 328 -160 302 -129 315 l -21 356 l -21 487 l -20 617 l -19 621 b -8 631 -17 626 -12 630 m 210 288 b 210 401 210 351 210 401 b 114 365 209 401 167 384 l 20 327 l 20 238 l 20 148 l 21 151 b 140 199 59 183 102 199 b 206 180 164 199 187 192 l 209 177 b 209 177 209 177 209 177 b 210 288 210 177 210 199 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 m 341 131 b 328 133 337 133 332 133 b 322 133 326 133 323 133 b 257 87 296 129 273 113 l 251 80 l 251 -37 l 251 -156 l 255 -152 b 375 81 328 -72 375 20 l 375 83 b 341 131 375 113 367 126 ',\n },\n vexAccidentalMicrotonal2: {\n x_min: -1.359375,\n x_max: 386.5625,\n ha: 394,\n o: 'm 249 535 b 257 537 251 537 253 537 b 276 524 266 537 273 533 l 277 521 l 279 419 l 279 316 l 304 323 b 337 328 319 326 330 328 b 353 316 347 328 349 324 b 355 266 355 315 355 290 b 353 215 355 241 355 217 b 319 198 349 206 347 205 b 279 187 284 190 279 188 b 279 156 279 187 279 174 b 279 136 279 151 279 144 l 279 84 l 289 87 l 330 98 b 367 105 352 102 362 105 b 378 101 372 105 375 104 b 386 61 385 95 386 94 b 386 40 386 55 386 48 l 386 -5 l 385 -8 b 374 -19 383 -12 378 -18 b 291 -40 372 -19 347 -26 b 279 -43 284 -41 279 -43 b 279 -83 279 -43 279 -59 b 279 -95 279 -87 279 -91 l 279 -145 l 304 -140 b 337 -133 321 -136 330 -133 b 349 -140 343 -133 347 -136 b 355 -181 355 -145 355 -142 l 355 -197 l 355 -210 b 349 -252 355 -249 355 -247 b 300 -269 345 -258 347 -258 b 280 -274 291 -272 281 -273 l 279 -274 l 277 -378 l 277 -483 l 276 -487 b 257 -499 273 -495 265 -499 b 238 -487 249 -499 242 -495 l 236 -483 l 236 -384 l 236 -285 l 235 -285 l 212 -291 l 170 -301 b 148 -308 159 -305 148 -306 b 147 -415 147 -308 147 -313 l 147 -523 l 145 -526 b 126 -538 141 -534 133 -538 b 106 -526 118 -538 110 -534 l 104 -523 l 104 -420 b 103 -317 104 -326 104 -317 b 103 -317 103 -317 103 -317 b 50 -330 92 -322 54 -330 b 31 -317 42 -330 35 -326 b 29 -267 29 -315 29 -315 l 29 -219 l 32 -216 b 92 -192 36 -206 36 -206 l 104 -190 l 104 -138 b 103 -87 104 -91 104 -87 b 103 -87 103 -87 103 -87 b 88 -91 103 -87 96 -88 l 49 -101 b 17 -106 32 -105 23 -106 b 6 -102 13 -106 10 -105 b -1 -62 0 -97 -1 -95 b 0 -41 -1 -56 0 -49 l 0 4 l 1 6 b 10 16 2 11 6 15 b 91 37 12 18 38 24 l 104 41 l 104 93 b 103 144 104 140 104 144 b 103 144 103 144 103 144 b 50 131 92 141 54 131 b 31 144 42 131 35 137 b 29 195 29 147 29 148 l 29 242 l 32 245 b 92 269 36 255 36 255 l 104 273 l 104 377 l 104 481 l 106 485 b 126 498 110 492 118 498 b 134 495 129 498 132 496 b 145 485 138 494 142 489 l 147 481 l 147 383 l 147 283 l 152 284 b 190 294 155 285 171 290 l 230 303 l 236 305 l 236 413 l 236 521 l 238 524 b 249 535 240 528 243 533 m 236 126 b 235 177 236 154 236 177 l 235 177 b 213 172 235 177 225 174 l 170 161 b 147 155 157 158 147 155 b 147 124 147 155 147 142 b 147 102 147 117 147 111 l 147 52 l 153 54 l 228 72 l 236 74 l 236 126 m 236 -105 b 235 -54 236 -65 236 -54 l 235 -54 b 231 -55 235 -54 234 -54 b 172 -69 227 -55 204 -62 l 149 -76 l 147 -76 l 147 -127 l 147 -179 l 152 -177 b 190 -167 155 -177 171 -173 l 230 -158 l 236 -156 l 236 -105 ',\n },\n vexWiggleArpeggioUp: {\n x_min: 58.53125,\n x_max: 228.671875,\n ha: 294,\n o: 'm 138 371 b 142 373 140 371 141 373 b 178 342 149 373 156 366 b 228 251 217 297 228 278 b 228 244 228 248 228 247 b 176 147 227 212 212 184 b 123 73 152 122 132 93 b 121 62 122 70 121 66 b 145 13 121 48 129 31 b 153 -2 151 6 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 145 -11 b 129 -1 140 -11 136 -8 b 61 87 89 37 68 68 b 58 113 59 95 58 105 b 110 215 58 144 74 177 b 163 287 134 240 155 269 b 166 299 166 291 166 295 b 141 348 166 313 157 330 b 133 360 134 356 133 358 b 133 363 133 362 133 362 b 138 371 133 367 136 370 ',\n },\n vexNoteHeadMutedBreve: {\n x_min: 0,\n x_max: 370.21875,\n ha: 378,\n o: 'm 0 0 l 0 277 l 61 277 l 122 277 l 122 0 l 122 -278 l 61 -278 l 0 -278 l 0 0 m 246 -1 l 246 277 l 308 277 l 370 277 l 370 -1 l 370 -278 l 308 -278 l 246 -278 l 246 -1 ',\n },\n },\n cssFontWeight: 'normal',\n ascender: 1903,\n underlinePosition: -125,\n cssFontStyle: 'normal',\n boundingBox: {\n yMin: -2065.375,\n xMin: -695.53125,\n yMax: 1901.578125,\n xMax: 1159.671875,\n },\n resolution: 1000,\n original_font_information: {\n postscript_name: 'Gonville-18',\n version_string: 'Version 0.1.8904 ',\n vendor_url: '',\n full_font_name: 'Gonville-18',\n font_family_name: 'Gonville-18',\n copyright: 'No copyright is claimed on this font file.',\n description: '',\n trademark: '',\n designer: '',\n designer_url: '',\n unique_font_identifier: 'FontForge 2.0 : Gonville-18 : 17-3-2010',\n license_url: '',\n license_description: '',\n manufacturer_name: '',\n font_sub_family_name: '18',\n },\n descender: -2066,\n fontFamily: 'Gonville-18',\n lineHeight: 4093,\n underlineThickness: 50,\n};\n","/**\n * The Gonville font was created by Simon Tatham.\n * https://www.chiark.greenend.org.uk/~sgtatham/gonville/\n */\nexport const GonvilleMetrics = {\n name: 'Gonville',\n smufl: false,\n stave: {\n padding: 12,\n endPaddingMax: 10,\n endPaddingMin: 5,\n unalignedNotePadding: 10,\n },\n accidental: {\n noteheadAccidentalPadding: 1,\n leftPadding: 2,\n accidentalSpacing: 3,\n },\n clef: {\n default: {\n point: 40,\n width: 26,\n },\n small: {\n point: 32,\n width: 20,\n },\n annotations: {\n '8va': {\n smuflCode: 'timeSig8',\n default: {\n point: 20,\n treble: {\n line: -1.2,\n shiftX: 11,\n },\n },\n small: {\n point: 18,\n treble: {\n line: -0.4,\n shiftX: 8,\n },\n },\n },\n '8vb': {\n smuflCode: 'timeSig8',\n default: {\n point: 20,\n treble: {\n line: 6.3,\n shiftX: 10,\n },\n bass: {\n line: 4,\n shiftX: 1,\n },\n },\n small: {\n point: 18,\n treble: {\n line: 5.8,\n shiftX: 6,\n },\n bass: {\n line: 3.5,\n shiftX: 0.5,\n },\n },\n },\n },\n // May not need these anymore\n lineCount: {\n '8': { point: 55, shiftY: 14 },\n '7': { point: 47, shiftY: 8 },\n '6': { point: 40, shiftY: 1 },\n '5': { point: 30, shiftY: -6 },\n '4': { point: 23, shiftY: -12 },\n },\n },\n parenthesis: {\n default: {\n point: 39,\n width: 7,\n },\n gracenote: {\n point: (39 * 3) / 5,\n width: 3,\n },\n },\n pedalMarking: {\n up: {\n point: 40,\n },\n down: {\n point: 40,\n },\n },\n // These are for numeric digits, such as in time signatures\n digits: {\n point: 40,\n tupletPoint: 28,\n },\n // articulation: {\n // },\n tremolo: {\n default: {\n point: 25,\n spacing: 4,\n offsetYStemUp: -7,\n offsetYStemDown: 7,\n offsetXStemUp: 9,\n offsetXStemDown: -0.5,\n },\n grace: {\n point: 15,\n spacing: 4,\n offsetYStemUp: -7,\n offsetYStemDown: 7,\n offsetXStemUp: 6.5,\n offsetXStemDown: -0.5,\n },\n },\n staveRepetition: {\n default: {\n offsetY: 25,\n offsetSymbol: 12,\n spacing: 5,\n },\n },\n // noteHead: {\n // },\n stem: {\n heightAdjustmentForFlag: -3,\n // These are stem (Y) offsets to the note heads. To shift the\n // noteheads (x-position) themselves, see glyphs.notehead.custom.\n noteHead: {\n noteheadTriangleUpHalf: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpBlack: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpWhole: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadXHalf: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXBlack: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXWhole: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadHalf: {\n offsetYBaseStemUp: -1.5,\n offsetYBaseStemDown: 1.5,\n },\n noteheadBlack: {\n offsetYBaseStemUp: -1.5,\n offsetYBaseStemDown: 1.5,\n },\n noteheadSquareWhite: {\n offsetYBaseStemDown: -5,\n offsetYBaseStemUp: 5,\n },\n },\n },\n glyphs: {\n flag: {\n shiftX: -0.08,\n flag8thDown: {\n shiftX: -0.16,\n },\n flag16thDown: {\n shiftX: -0.16,\n },\n flag32ndDown: {\n shiftX: -0.16,\n shiftY: 9,\n },\n flag64thDown: {\n shiftX: -0.16,\n shiftY: 13,\n },\n flag128thDown: {\n shiftX: -0.16,\n shiftY: 22,\n },\n flag32ndUp: {\n shiftY: -9,\n },\n flag64thUp: {\n shiftY: -13,\n },\n flag128thUp: {\n shiftY: -22,\n },\n },\n stringNumber: {\n verticalPadding: 8,\n stemPadding: 2,\n leftPadding: 5,\n rightPadding: 6,\n },\n textNote: {\n point: 40,\n default: {},\n ornamentTrill: {\n shiftX: -5,\n shiftY: 4,\n },\n },\n noteHead: {\n minPadding: 2,\n custom: {\n noteheadDiamondWholeStemUp: {\n shiftX: -6,\n },\n noteheadCircleXStemUp: {\n shiftX: -1.5,\n },\n noteheadXWholeStemUp: {\n shiftX: -5,\n },\n noteheadTriangleUpWholeStemUp: {\n shiftX: -6,\n },\n },\n },\n chordSymbol: {\n global: {\n superscriptOffset: -400,\n subscriptOffset: 300,\n kerningOffset: -250,\n lowerKerningText: ['D', 'F', 'P', 'T', 'V', 'Y'],\n upperKerningText: ['A', 'L'],\n spacing: 100,\n superSubRatio: 0.66,\n },\n csymDiminished: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymHalfDiminished: {\n scale: 0.8,\n leftSideBearing: -32,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymAugmented: {\n scale: 1,\n leftSideBearing: 0,\n advanceWidth: 530,\n yOffset: 0,\n },\n csymParensLeftTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 155,\n yOffset: 250,\n },\n csymParensRightTall: {\n scale: 0.8,\n leftSideBearing: -40,\n advanceWidth: 189,\n yOffset: 250,\n },\n csymBracketLeftTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 328,\n yOffset: 0,\n },\n csymBracketRightTall: {\n scale: 0.8,\n leftSideBearing: 1,\n advanceWidth: 600,\n yOffset: 0,\n },\n csymParensLeftVeryTall: {\n scale: 0.9,\n leftSideBearing: 0,\n advanceWidth: 121,\n yOffset: 350,\n },\n csymParensRightVeryTall: {\n scale: 0.9,\n leftSideBearing: 50,\n advanceWidth: 111,\n yOffset: 350,\n },\n csymDiagonalArrangementSlash: {\n scale: 0.6,\n leftSideBearing: -1,\n advanceWidth: 990,\n yOffset: 0,\n },\n csymMinor: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 482,\n yOffset: 0,\n },\n csymMajorSeventh: {\n scale: 0.9,\n leftSideBearing: 200,\n yOffset: 0,\n advanceWidth: 600,\n },\n accidentalSharp: {\n scale: 0.75,\n leftSideBearing: 40,\n advanceWidth: 250,\n yOffset: -402,\n },\n accidentalFlat: {\n scale: 0.95,\n leftSideBearing: -50,\n advanceWidth: 208,\n yOffset: -184,\n },\n },\n jazzOrnaments: {\n brassScoop: {\n scale: 1.0,\n xOffset: -12,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 10,\n },\n brassDoitMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassFallLipShort: {\n scale: 1.0,\n xOffset: 17,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassLiftMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 5,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassFallRoughMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 28,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassBend: {\n scale: 1.0,\n xOffset: 2,\n yOffset: -8,\n stemUpYOffset: 24,\n reportedWidth: 5,\n },\n brassMuteClosed: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -9,\n stemUpYOffset: 24,\n reportedWidth: 5,\n },\n brassMuteOpen: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -7,\n stemUpYOffset: 25,\n reportedWidth: 5,\n },\n brassFlip: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassJazzTurn: {\n scale: 1.0,\n xOffset: 6,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassSmear: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n },\n tremolo: {\n default: {\n shiftY: -10,\n },\n grace: {\n shiftY: -5,\n },\n },\n tuplet: {\n noteHeadOffset: 20,\n stemOffset: 10,\n bottomLine: 4,\n topModifierOffset: 15,\n },\n },\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// vexflow.js statically bundles & preloads all of our music engraving fonts.\nimport { loadBravura } from './load_bravura';\nimport { loadCustom } from './load_custom';\nimport { loadGonville } from './load_gonville';\nimport { loadPetaluma } from './load_petaluma';\n// ADD_MUSIC_FONT\n// import { loadXXX } from './load_xxx';\n// Populate our font \"database\" with all our music fonts.\nexport function loadAllMusicFonts() {\n loadBravura();\n loadGonville();\n loadPetaluma();\n loadCustom();\n // ADD_MUSIC_FONT\n // loadXXX();\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// If you are adding a new music engraving font, search for instances of ADD_MUSIC_FONT throughout the code base.\n// To compile your new font into vexflow.js, take a look at src/fonts/load_all.ts\n// You can export a font module which can be dynamically loaded by vexflow-core.js (see: Gruntfile.js).\n// ADD_MUSIC_FONT\n// To add a new music engraving font XXX, make a copy of this file and name it load_xxx.ts.\n// Then you will need to generate xxx_glyphs.ts and xxx_metrics.ts.\n// xxx_glyphs.ts is created by tools/fonts/fontgen_smufl.js\n// xxx_metrics.ts is created by hand. You could copy bravura_metrics.ts and modify/remove/add entries where necessary.\nimport { Font } from '../font';\nimport { BravuraFont } from './bravura_glyphs';\nimport { BravuraMetrics } from './bravura_metrics';\nexport function loadBravura() {\n Font.load('Bravura', BravuraFont, BravuraMetrics);\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from '../font';\nimport { CustomFont } from './custom_glyphs';\nimport { CustomMetrics } from './custom_metrics';\nexport function loadCustom() {\n Font.load('Custom', CustomFont, CustomMetrics);\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from '../font';\nimport { GonvilleFont } from './gonville_glyphs';\nimport { GonvilleMetrics } from './gonville_metrics';\nexport function loadGonville() {\n Font.load('Gonville', GonvilleFont, GonvilleMetrics);\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from '../font';\nimport { PetalumaFont } from './petaluma_glyphs';\nimport { PetalumaMetrics } from './petaluma_metrics';\nexport function loadPetaluma() {\n Font.load('Petaluma', PetalumaFont, PetalumaMetrics);\n}\n","export const PetalumaFont = {\n glyphs: {\n bracketTop: {\n x_min: 0,\n x_max: 508,\n y_min: 0,\n y_max: 370,\n ha: 370,\n o: 'm 22 0 b 122 0 55 1 89 0 l 157 0 b 713 376 425 0 622 137 b 732 467 724 406 732 436 b 726 514 732 482 730 498 b 711 533 723 528 719 533 b 693 526 707 533 700 530 b 674 498 683 520 678 508 b 635 406 662 467 652 435 b 310 164 560 281 458 193 b 154 151 258 154 206 151 b 39 154 117 151 78 154 b 1 120 17 154 4 145 b 0 84 0 108 0 96 b 0 20 0 63 1 40 b 22 0 0 4 7 0 z',\n },\n bracketBottom: {\n x_min: 0,\n x_max: 496,\n y_min: -393,\n y_max: 0,\n ha: 393,\n o: 'm 696 -566 b 711 -539 713 -566 708 -549 b 714 -521 713 -533 714 -527 b 713 -508 714 -517 713 -513 b 661 -327 706 -445 688 -384 b 392 -42 603 -203 513 -109 b 206 0 331 -7 266 0 b 160 -1 190 0 174 -1 b 26 -1 107 -1 66 -3 b 0 -19 12 -1 0 -4 l 0 -23 b 3 -50 1 -32 3 -42 b 1 -86 3 -62 1 -73 b 4 -118 1 -96 1 -108 b 45 -151 10 -145 23 -154 b 180 -143 89 -144 135 -145 b 621 -419 392 -135 523 -236 b 662 -539 641 -456 655 -497 b 696 -566 667 -557 680 -566 z',\n },\n barlineTick: {\n x_min: 0,\n x_max: 56.036101509664164,\n y_min: 876.905249806889,\n y_max: 1121.5430338167066,\n ha: 244.63778400981766,\n o: 'm 42 1263 b 66 1287 62 1261 66 1272 b 81 1583 65 1387 72 1485 b 35 1614 82 1610 53 1610 b 14 1591 17 1619 16 1604 b 0 1408 7 1525 0 1459 l 0 1292 b 42 1263 1 1263 23 1266 z',\n },\n breathMarkTick: {\n x_min: 0,\n x_max: 568,\n y_min: 0,\n y_max: 621,\n ha: 621,\n o: 'm 258 0 b 278 39 276 0 274 24 b 279 56 279 45 279 50 l 279 73 b 278 117 279 88 278 102 b 281 148 278 127 279 138 b 536 600 312 330 387 487 b 744 719 600 651 670 690 b 815 779 775 730 808 740 b 818 824 818 793 818 808 b 815 868 818 838 818 852 b 796 894 814 881 808 894 b 779 888 791 894 786 893 b 719 864 760 878 739 871 b 372 602 580 806 459 724 b 229 252 298 498 251 383 b 220 268 225 262 222 264 b 209 302 217 279 213 291 b 75 527 181 387 143 467 b 16 563 58 543 39 573 b 0 539 3 557 0 549 b 12 492 0 524 9 507 b 56 400 19 459 22 425 b 163 269 104 367 138 323 b 238 36 197 194 216 115 b 258 0 242 22 243 0 z',\n },\n segno: {\n x_min: 0,\n x_max: 798,\n y_min: -65,\n y_max: 806,\n ha: 871,\n o: 'm 16 -94 b 66 -69 39 -92 53 -85 b 177 59 102 -26 138 17 b 543 456 298 192 420 324 b 726 300 615 420 680 373 b 753 217 744 271 753 243 b 655 112 753 170 719 131 b 599 104 636 107 618 104 b 461 173 544 104 495 128 b 432 190 454 183 444 190 b 409 179 425 190 418 187 b 359 118 390 160 373 141 b 341 72 347 101 341 86 b 373 24 341 56 351 40 b 409 6 384 17 396 10 b 550 -13 454 -12 501 -14 b 599 -6 566 -12 583 -10 b 864 213 720 27 806 104 b 886 300 878 242 886 271 b 857 395 886 331 877 363 b 799 467 840 420 821 445 b 648 572 755 513 704 546 b 1110 1083 802 743 955 914 b 1140 1129 1123 1097 1136 1110 b 1149 1148 1142 1135 1149 1142 b 1145 1153 1149 1149 1148 1152 b 1123 1161 1139 1158 1130 1161 b 1109 1156 1119 1161 1113 1159 b 1089 1138 1102 1151 1094 1145 b 946 988 1040 1089 989 1041 b 595 602 834 855 711 732 l 590 598 l 549 615 b 432 793 462 647 432 723 b 534 888 432 851 474 888 b 671 834 588 888 631 864 b 710 818 684 824 696 818 b 724 821 714 818 719 819 b 809 883 757 834 788 852 b 816 901 814 890 816 896 b 802 923 816 910 812 916 b 706 984 770 945 742 971 b 593 1011 668 998 631 1011 b 516 991 567 1011 541 1005 b 333 799 433 949 380 876 b 302 693 312 765 302 729 b 330 589 302 658 311 624 b 469 488 360 533 415 511 b 485 482 475 487 480 485 b 266 249 412 405 338 327 b 121 88 217 196 170 141 b 9 -65 78 40 37 -7 b 0 -85 4 -72 0 -79 b 16 -94 0 -91 4 -94 z m 861 536 b 927 575 890 539 909 557 b 965 628 952 598 965 613 b 926 680 965 644 952 658 b 865 713 900 701 883 713 b 805 667 845 713 828 698 b 768 611 791 649 770 631 b 812 564 766 589 798 582 b 861 536 824 550 840 537 z m 251 350 b 363 436 285 348 353 403 b 354 456 366 448 360 452 b 271 518 327 477 298 497 b 243 528 261 526 252 528 b 210 513 232 528 222 523 b 157 454 190 494 176 472 b 141 428 147 444 141 436 b 158 406 141 420 147 413 b 216 361 180 393 197 376 b 245 350 225 356 235 350 z',\n },\n coda: {\n x_min: 0,\n x_max: 1380,\n y_min: -196,\n y_max: 1037,\n ha: 1233,\n o: 'm 1028 -282 b 1057 -245 1045 -282 1053 -261 b 1060 -203 1060 -232 1060 -217 b 1063 9 1060 -132 1061 -62 b 1390 194 1192 22 1303 81 b 1531 543 1467 298 1512 415 b 1532 556 1531 547 1532 552 b 1904 559 1656 557 1780 559 b 1950 582 1920 559 1941 569 b 1987 674 1970 609 1987 638 b 1984 698 1987 681 1986 690 b 1950 700 1973 698 1961 700 l 1941 700 l 1545 696 b 1535 776 1545 723 1541 749 b 1103 1113 1477 996 1326 1107 b 1080 1115 1096 1115 1087 1115 b 1081 1322 1080 1184 1080 1253 b 1079 1467 1083 1371 1081 1418 b 1061 1493 1079 1476 1080 1493 l 1060 1493 b 1028 1467 1044 1490 1031 1485 b 1020 1403 1025 1446 1020 1424 b 1017 1110 1020 1305 1018 1208 l 962 1106 b 569 914 808 1087 671 1035 b 451 683 510 844 472 766 l 161 678 b 118 680 148 678 132 680 b 79 670 101 680 86 678 b 0 544 48 636 29 592 l 37 544 l 429 549 b 428 518 428 539 428 528 b 488 285 428 435 458 360 b 681 81 526 192 593 124 b 946 9 763 40 854 19 b 1008 6 966 7 988 6 b 1005 -137 1008 -42 1005 -89 b 1012 -243 1005 -173 1005 -209 b 1028 -282 1015 -258 1011 -282 z m 1074 690 b 1079 935 1077 772 1077 852 b 1326 855 1166 932 1250 909 b 1446 694 1385 814 1426 759 b 1269 693 1387 694 1328 693 b 1074 690 1204 693 1139 691 z m 577 684 b 766 874 618 763 678 828 b 989 932 837 912 913 923 b 1015 933 998 932 1007 933 b 1014 822 1015 896 1014 860 b 1011 688 1012 791 1012 743 z m 1067 184 b 1071 553 1070 307 1068 429 b 1439 556 1194 553 1316 554 b 1437 554 1439 554 1437 554 b 1341 337 1413 478 1387 402 b 1119 192 1286 261 1211 212 b 1067 184 1102 189 1084 186 z m 1008 180 b 660 264 886 181 770 212 b 524 471 570 305 524 374 b 528 524 524 488 526 505 l 533 549 b 792 552 619 550 706 550 b 1009 553 865 553 937 552 b 1008 180 1009 428 1008 288 z',\n },\n gClef: {\n x_min: 0,\n x_max: 664,\n y_min: -559,\n y_max: 1009,\n ha: 1568,\n o: 'm 343 -805 b 366 -801 350 -805 357 -804 b 409 -773 383 -795 397 -786 b 582 -328 528 -648 577 -497 b 583 -294 582 -315 583 -294 b 612 -279 583 -294 603 -282 b 747 -197 660 -256 706 -230 b 949 143 857 -109 920 10 b 956 206 955 164 956 186 b 791 384 956 297 906 363 b 704 393 762 390 733 393 b 498 336 632 393 563 374 b 481 325 490 331 481 325 l 444 465 b 442 485 442 472 442 485 b 609 880 442 485 589 746 b 619 996 616 919 619 958 b 613 1084 619 1027 618 1056 b 534 1387 599 1188 560 1286 b 482 1453 527 1417 517 1453 b 422 1407 456 1453 438 1428 b 305 1063 348 1305 312 1188 b 304 1002 304 1043 304 1022 b 338 654 304 886 323 769 b 343 629 338 645 341 636 b 144 356 278 537 206 451 b 23 144 101 288 53 220 b 0 20 7 107 0 63 b 82 -210 0 -69 30 -160 b 207 -288 112 -239 160 -271 b 410 -328 274 -312 340 -328 b 474 -324 431 -328 452 -327 l 491 -321 b 491 -341 491 -321 492 -334 b 402 -585 475 -428 454 -513 b 294 -668 374 -622 348 -664 b 271 -693 278 -670 271 -680 b 274 -708 271 -698 272 -703 b 302 -775 282 -730 292 -753 b 343 -805 311 -795 325 -805 z m 400 717 b 382 922 389 786 382 854 b 481 1286 382 1047 408 1169 b 507 1125 498 1233 507 1179 b 500 1040 507 1097 504 1068 b 400 717 481 927 455 818 z m 252 -135 b 196 -121 232 -134 215 -127 b 117 -69 158 -108 127 -94 b 111 -32 112 -58 111 -45 b 117 19 111 -16 114 1 b 130 56 118 27 127 52 b 324 337 186 156 253 246 l 384 416 l 395 384 b 416 291 406 348 416 291 b 350 213 416 291 376 239 b 243 -42 278 143 243 55 b 251 -117 243 -66 246 -91 b 252 -135 252 -122 252 -127 z m 563 -91 b 510 168 552 3 530 78 b 513 192 508 179 508 186 b 624 202 550 199 586 202 b 730 192 660 202 694 199 b 850 141 773 183 816 176 b 858 134 852 138 855 135 b 595 -121 801 19 716 -68 l 569 -131 z m 410 -160 b 311 -147 360 -160 311 -147 b 307 -98 311 -147 307 -127 b 314 -33 307 -79 308 -56 b 429 131 328 36 377 85 b 441 138 433 135 438 138 b 449 122 446 138 448 132 b 490 -131 462 37 484 -46 b 490 -153 491 -140 490 -153 b 410 -160 490 -153 452 -163 z',\n },\n cClef: {\n x_min: 0,\n x_max: 731,\n y_min: -543,\n y_max: 543,\n ha: 1086,\n o: 'm 131 -782 b 141 -755 138 -782 140 -773 b 147 -490 143 -667 145 -577 b 160 207 150 -258 153 -24 b 168 618 164 344 158 481 b 81 768 173 690 132 732 b 45 782 66 778 55 782 b 3 740 26 782 13 768 b 0 724 1 736 0 730 l 1 710 b 4 596 4 672 4 634 l 4 382 b 9 102 4 288 4 196 b 17 -301 13 -32 10 -166 l 17 -672 b 50 -736 17 -701 27 -720 b 109 -772 69 -749 91 -759 b 131 -782 120 -778 127 -782 z m 615 -770 b 881 -684 710 -770 801 -739 b 1020 -395 986 -612 1020 -510 b 1017 -334 1020 -374 1018 -354 b 769 -62 1007 -209 896 -75 b 746 -60 762 -60 755 -60 b 639 -73 710 -60 675 -69 b 524 -109 598 -79 560 -92 b 528 -36 526 -85 528 -60 b 527 -4 528 -26 528 -14 b 528 39 527 10 528 24 b 526 99 528 59 527 79 b 592 94 549 95 570 94 b 648 99 611 94 629 95 b 912 157 744 94 844 117 b 1053 377 1009 215 1053 284 b 1050 425 1053 393 1053 409 b 914 665 1037 521 986 602 b 717 753 855 717 791 753 b 626 734 688 753 658 747 l 462 665 b 347 500 374 628 347 580 b 350 449 347 484 348 468 b 392 419 353 428 367 416 b 492 438 425 425 459 428 b 541 498 524 448 541 468 b 540 514 541 503 541 508 b 537 546 537 524 537 536 b 573 639 537 580 550 611 b 606 657 582 649 593 657 l 609 657 b 716 622 647 652 684 647 b 834 372 801 556 834 469 b 831 323 834 356 832 338 b 743 187 825 266 795 217 b 710 176 732 180 720 176 b 694 179 704 176 700 177 b 527 223 638 193 582 206 b 495 229 516 228 505 229 b 454 220 481 229 468 225 b 395 189 432 213 415 200 b 363 180 384 186 374 181 b 348 168 356 179 348 176 b 340 161 343 167 340 164 b 347 150 340 157 343 154 b 356 147 348 148 353 147 b 364 92 361 130 363 111 b 369 -37 367 49 369 6 b 363 -154 369 -76 367 -115 b 357 -236 360 -183 357 -210 b 376 -264 357 -253 361 -259 b 456 -289 402 -284 429 -289 b 521 -282 478 -289 500 -285 b 549 -255 537 -279 546 -271 b 598 -177 556 -225 577 -202 b 622 -164 605 -168 613 -164 b 636 -167 626 -164 631 -166 b 749 -225 678 -177 714 -199 b 848 -405 814 -276 848 -337 b 824 -507 848 -436 840 -471 b 657 -657 792 -582 730 -625 b 608 -668 638 -664 622 -668 b 534 -602 572 -668 547 -645 b 513 -575 530 -589 523 -575 b 507 -576 510 -575 508 -575 b 478 -582 497 -580 488 -582 b 405 -570 454 -582 428 -570 b 389 -572 399 -570 395 -570 l 363 -572 b 321 -575 348 -572 333 -569 l 321 631 b 323 662 323 641 323 652 b 315 716 323 681 321 698 b 304 736 314 723 317 736 l 302 736 b 281 716 294 734 285 729 b 275 665 276 700 275 683 l 275 382 b 276 99 275 288 275 193 b 279 -170 278 10 276 -81 b 284 -399 282 -246 284 -323 b 282 -629 284 -475 282 -553 b 289 -721 282 -660 289 -690 b 300 -736 289 -727 291 -736 b 312 -724 307 -736 310 -730 b 321 -667 323 -706 321 -687 l 321 -632 l 328 -644 l 340 -657 b 510 -757 386 -707 445 -740 b 615 -770 546 -766 580 -770 z',\n },\n fClef: {\n x_min: 0,\n x_max: 776,\n y_min: -496,\n y_max: 216,\n ha: 712,\n o: 'm 402 -706 b 804 -405 592 -678 716 -566 b 876 -53 861 -298 874 -183 b 868 33 876 -32 873 1 b 560 311 845 217 723 311 b 524 310 549 311 536 311 b 131 134 373 297 239 242 b 17 -29 84 86 37 39 b 9 -89 12 -50 9 -71 b 112 -238 9 -154 43 -206 b 124 -243 117 -239 120 -242 b 186 -261 145 -255 166 -261 b 268 -228 215 -261 242 -249 b 351 -59 325 -181 351 -124 b 343 10 351 -36 348 -13 b 340 36 341 19 340 27 b 409 105 340 75 363 102 b 441 107 420 107 431 107 b 624 36 510 107 573 86 b 744 -200 688 -27 724 -109 b 747 -230 747 -210 747 -222 b 717 -323 747 -264 736 -292 b 608 -445 688 -370 654 -410 b 307 -541 518 -513 415 -541 l 213 -541 b 39 -521 154 -541 96 -539 b 0 -552 17 -514 0 -531 b 1 -564 0 -556 0 -560 b 17 -611 6 -580 10 -596 b 101 -694 35 -648 50 -684 b 288 -714 164 -707 225 -714 b 402 -706 325 -714 363 -711 z m 1018 92 b 1080 118 1041 91 1068 96 b 1117 219 1099 150 1117 180 b 1113 252 1117 229 1116 240 b 1045 288 1102 297 1068 276 b 1017 262 1028 297 1024 274 b 984 124 989 220 996 170 b 1008 91 979 108 986 91 z m 972 -281 b 1070 -148 1024 -279 1070 -210 b 1025 -105 1070 -105 1045 -112 b 989 -127 1004 -96 998 -114 b 949 -249 963 -164 963 -209 b 969 -281 943 -265 949 -281 z',\n },\n unpitchedPercussionClef1: {\n x_min: 0,\n x_max: 379.13761966945304,\n y_min: -250,\n y_max: 250,\n ha: 500,\n o: 'm 481 -360 b 507 -357 491 -360 500 -360 b 546 -295 541 -346 547 -325 b 536 79 543 -170 540 -46 b 523 311 533 157 534 235 b 475 359 518 340 508 359 b 425 360 459 359 442 360 b 400 359 416 360 409 360 b 337 294 348 353 340 347 l 337 -73 b 336 -264 337 -137 337 -200 b 343 -294 336 -274 338 -284 b 481 -360 359 -330 431 -360 z m 144 -341 b 207 -320 167 -341 189 -331 b 217 -301 215 -315 217 -308 b 210 -262 217 -289 210 -275 b 228 187 212 -112 209 37 b 228 287 228 220 229 253 b 174 353 228 336 222 343 b 120 359 157 357 138 359 b 48 357 96 359 72 356 b 17 323 29 357 19 344 b 7 120 16 255 9 187 b 6 -109 6 43 6 -33 l 6 -204 b 0 -251 6 -220 0 -235 b 3 -269 0 -256 0 -262 b 127 -340 24 -330 79 -328 b 144 -341 132 -341 138 -341 z',\n },\n '6stringTabClef': {\n x_min: 0,\n x_max: 438,\n y_min: -768,\n y_max: 767,\n ha: 1535,\n o: 'm 369 438 b 374 439 370 438 372 438 b 384 462 383 444 384 452 l 384 474 b 390 697 386 547 390 622 b 373 1002 390 799 390 901 l 533 1002 b 560 1001 541 1004 552 1001 b 573 1007 567 1001 572 1002 b 546 1050 579 1025 559 1038 b 536 1056 543 1053 539 1053 b 324 1104 472 1102 397 1104 b 72 1090 238 1104 154 1099 b 55 1093 66 1090 60 1092 b 37 1073 46 1093 37 1089 b 60 1045 37 1061 48 1051 b 203 1001 105 1022 151 1001 b 233 1004 213 1001 223 1002 b 246 1005 238 1004 243 1005 b 272 975 264 1005 272 996 l 272 965 b 258 596 264 842 265 719 b 315 474 253 540 272 504 l 343 455 b 369 438 351 448 357 438 z m 114 -320 b 127 -304 120 -320 124 -315 b 171 -174 141 -261 158 -219 b 222 -135 179 -147 196 -137 b 426 -122 289 -131 359 -128 b 498 -164 462 -120 482 -127 b 628 -301 521 -226 575 -264 b 631 -288 631 -295 631 -291 b 628 -269 631 -281 629 -276 b 569 -134 616 -220 589 -179 b 408 225 514 -14 462 107 b 314 357 384 274 351 318 b 278 380 298 372 288 379 b 251 351 268 380 261 372 b 4 -209 156 171 75 -17 b 0 -228 1 -215 0 -222 b 19 -258 0 -240 7 -249 b 102 -314 45 -279 75 -294 b 114 -320 107 -318 111 -320 z m 425 6 b 360 20 403 17 382 20 b 274 14 331 20 302 14 l 246 14 l 340 206 b 425 6 369 137 395 75 z m 245 -1106 b 281 -1104 256 -1106 269 -1106 b 511 -888 400 -1094 511 -1035 b 454 -688 511 -814 504 -744 b 448 -678 449 -685 448 -681 b 454 -667 448 -675 449 -671 b 504 -497 503 -619 507 -559 b 324 -288 500 -383 436 -308 b 295 -287 314 -287 304 -287 l 282 -287 b 115 -330 223 -287 168 -307 b 94 -366 102 -336 94 -348 l 94 -370 b 96 -435 96 -392 96 -413 b 73 -858 89 -576 71 -717 b 78 -919 73 -878 78 -899 b 72 -950 78 -930 76 -940 b 63 -992 66 -965 63 -978 b 66 -1015 63 -999 65 -1008 b 173 -1104 84 -1106 84 -1106 b 245 -1106 197 -1104 220 -1104 z m 161 -622 b 147 -618 156 -622 151 -621 b 140 -600 141 -612 140 -606 b 144 -564 140 -589 144 -575 b 143 -554 144 -560 144 -557 l 143 -546 b 220 -451 144 -467 143 -465 b 278 -445 239 -446 259 -444 b 418 -497 328 -445 376 -461 b 429 -516 426 -504 429 -510 b 415 -533 429 -521 423 -527 b 219 -608 357 -579 287 -590 b 215 -609 217 -608 216 -609 b 161 -622 197 -609 177 -622 z m 154 -953 b 130 -933 135 -953 130 -948 l 130 -865 l 128 -865 b 135 -788 130 -838 124 -808 b 203 -769 145 -769 180 -776 b 259 -762 223 -765 242 -762 b 441 -852 330 -762 386 -805 b 449 -867 446 -858 449 -863 b 436 -884 449 -874 444 -878 b 318 -942 402 -914 363 -935 b 154 -953 264 -950 209 -953 z',\n },\n timeSig0: {\n x_min: 20,\n x_max: 513,\n y_min: -358.159536277652,\n y_max: 359,\n ha: 717.159536277652,\n o: 'm 341 -516 b 420 -510 367 -516 395 -514 b 675 -338 533 -494 622 -448 b 737 -92 716 -256 734 -171 b 739 -35 739 -73 739 -53 b 680 305 739 86 720 207 b 400 517 622 449 537 517 b 337 514 380 517 359 517 b 289 507 321 511 305 513 b 91 317 192 477 127 412 b 29 9 50 212 29 108 b 217 -458 29 -157 88 -312 b 341 -516 251 -494 291 -518 z m 412 -452 b 359 -425 393 -452 376 -444 b 187 14 242 -301 179 -158 b 268 334 193 127 212 235 b 387 448 295 383 330 428 b 406 452 395 451 400 452 b 428 444 413 452 420 449 b 517 324 471 413 497 372 b 586 -29 560 222 586 86 b 556 -271 586 -112 585 -193 b 468 -422 536 -327 508 -377 b 412 -452 449 -442 431 -452 z',\n },\n timeSig1: {\n x_min: 20,\n x_max: 283,\n y_min: -364,\n y_max: 366,\n ha: 730,\n o: 'm 264 -524 b 357 -510 297 -524 325 -516 b 374 -490 369 -508 374 -501 b 380 -438 376 -472 380 -455 l 406 246 b 408 301 408 265 408 282 b 400 445 408 348 405 396 b 288 527 395 491 338 527 b 253 520 276 527 264 526 b 240 508 249 517 245 513 b 49 409 192 445 127 413 b 29 396 33 408 29 403 b 32 380 29 392 30 386 b 59 363 36 366 49 364 b 164 348 95 356 130 348 b 222 357 183 348 203 351 b 238 361 228 360 233 360 b 252 334 248 361 252 353 b 243 59 252 242 249 150 b 219 -490 229 -124 233 -307 b 264 -524 217 -516 232 -524 z',\n },\n timeSig2: {\n x_min: 20,\n x_max: 660.4636303241031,\n y_min: -378.7201231608281,\n y_max: 382,\n ha: 760.720123160828,\n o: 'm 99 -543 b 130 -533 111 -550 121 -540 b 255 -448 168 -501 213 -475 b 338 -425 282 -431 310 -425 b 392 -431 356 -425 374 -426 b 485 -462 423 -438 454 -451 b 648 -497 540 -482 595 -497 b 834 -441 711 -497 773 -480 b 950 -242 906 -395 958 -334 b 942 -210 950 -230 950 -215 b 912 -220 932 -204 920 -213 b 861 -264 894 -235 877 -248 b 775 -317 835 -289 808 -305 b 675 -334 742 -328 708 -334 b 510 -295 619 -334 563 -318 b 372 -264 465 -278 420 -264 b 305 -272 350 -264 328 -266 b 331 -242 318 -256 324 -249 b 490 -73 386 -187 438 -131 b 675 340 595 43 664 180 b 677 369 677 350 677 360 b 556 536 677 461 638 508 b 468 550 526 546 497 550 b 297 508 409 550 353 533 b 111 354 220 475 168 412 b 29 197 65 308 29 261 b 32 164 29 187 29 176 b 29 140 33 157 29 147 b 43 125 29 132 32 125 b 73 147 55 125 65 138 b 86 163 79 153 82 158 b 238 320 134 219 183 272 b 425 389 292 367 360 389 b 575 341 480 389 531 373 b 606 298 590 330 606 317 b 600 278 606 292 603 285 b 501 107 576 217 544 158 b 304 -104 439 33 372 -35 b 111 -356 230 -180 167 -265 b 84 -446 92 -386 84 -415 b 86 -481 84 -458 85 -469 b 88 -514 88 -491 88 -503 b 99 -543 89 -526 91 -537 z',\n },\n timeSig3: {\n x_min: 19.824321427094187,\n x_max: 540,\n y_min: -392,\n y_max: 392,\n ha: 784,\n o: 'm 216 -540 b 354 -564 264 -556 310 -564 b 605 -465 445 -564 530 -530 b 729 -161 697 -383 729 -275 b 724 -82 729 -135 727 -108 b 589 95 716 -1 670 62 b 523 114 567 102 546 108 b 750 418 606 213 677 315 b 778 503 769 444 778 472 b 773 540 778 514 776 527 b 750 564 769 557 762 564 b 736 562 746 564 742 563 b 641 552 704 553 672 552 b 402 554 562 552 481 554 l 346 554 b 84 546 258 554 170 554 b 36 501 55 543 40 531 b 29 412 30 472 32 442 b 52 384 27 393 32 384 l 56 384 b 210 392 107 389 158 392 l 602 392 b 354 108 523 285 445 192 b 246 -65 300 58 246 12 b 252 -108 246 -78 248 -92 l 252 -111 b 264 -141 251 -122 251 -135 b 291 -132 274 -145 284 -140 b 425 -72 328 -95 377 -84 b 475 -65 442 -68 459 -65 b 592 -108 517 -65 557 -79 b 645 -179 615 -125 645 -147 b 642 -194 645 -184 644 -189 b 485 -376 616 -278 569 -344 b 361 -399 444 -392 402 -399 b 151 -340 289 -399 219 -376 b 88 -275 122 -323 98 -310 b 71 -249 86 -268 85 -249 b 63 -251 68 -249 66 -249 b 36 -288 48 -255 36 -266 b 55 -423 33 -336 45 -377 b 101 -482 60 -448 78 -468 b 216 -540 138 -504 174 -526 z',\n },\n timeSig4: {\n x_min: 20,\n x_max: 633.0785282750762,\n y_min: -489.59088556716864,\n y_max: 491.18559127100053,\n ha: 980.7764768381692,\n o: 'm 608 -704 b 641 -684 622 -708 634 -696 b 667 -602 660 -660 662 -631 b 685 -190 683 -465 680 -327 l 685 -176 b 831 -127 736 -166 783 -148 b 912 0 901 -94 913 -76 b 886 53 912 36 904 52 b 848 40 877 53 864 49 l 838 36 b 687 -13 789 14 739 -3 b 681 177 687 50 684 114 b 672 338 678 230 677 285 b 654 373 671 350 672 373 b 622 340 636 373 624 361 b 615 262 621 314 613 288 b 619 -22 616 167 619 72 b 569 -22 602 -23 585 -23 b 305 -3 481 -16 395 -1 b 210 -9 274 -3 242 -4 b 301 163 242 52 268 108 b 513 552 377 288 459 412 b 536 652 526 585 536 618 b 533 683 536 662 534 672 b 520 707 531 691 531 707 b 487 693 508 708 494 704 b 474 668 482 684 477 677 b 384 490 454 603 418 547 b 253 281 343 419 295 351 b 73 -13 194 181 145 78 b 29 -108 50 -42 29 -72 b 37 -147 29 -121 32 -134 b 50 -186 43 -160 50 -173 b 68 -216 52 -207 56 -215 b 92 -207 73 -216 82 -213 b 288 -166 156 -180 220 -166 b 556 -186 377 -166 467 -180 b 586 -189 566 -187 576 -187 b 616 -186 596 -189 606 -189 b 606 -432 613 -268 612 -350 b 596 -625 603 -495 596 -559 b 598 -670 596 -641 596 -655 b 608 -704 598 -683 596 -700 z',\n },\n timeSig5: {\n x_min: 19.663871085403297,\n x_max: 583,\n y_min: -389,\n y_max: 389,\n ha: 778,\n o: 'm 132 -536 b 249 -560 168 -553 209 -559 b 507 -462 351 -560 454 -514 b 677 -183 588 -384 642 -289 b 694 -85 688 -150 694 -117 b 540 138 694 12 642 94 b 422 173 501 154 462 167 b 400 187 408 174 400 177 b 405 202 400 190 402 196 b 428 284 416 228 426 255 b 469 312 431 307 442 312 b 757 372 569 312 662 343 b 840 490 821 392 840 432 b 812 560 840 540 834 560 b 763 546 801 560 785 556 b 757 543 762 546 759 544 b 465 484 665 505 570 484 b 396 484 452 484 425 487 b 353 454 377 482 366 474 b 281 300 323 405 304 351 b 245 164 262 255 245 212 b 246 144 245 158 246 151 b 233 63 249 115 243 89 b 225 35 228 50 225 40 b 264 14 225 22 236 19 b 445 -26 325 7 387 0 b 569 -151 501 -52 547 -89 b 575 -180 573 -161 575 -170 b 527 -275 575 -217 547 -245 b 347 -367 484 -334 419 -367 b 261 -351 318 -367 289 -363 b 95 -300 206 -333 154 -307 b 55 -321 73 -297 65 -302 b 29 -468 29 -367 40 -419 b 56 -505 26 -482 36 -500 b 132 -536 82 -514 108 -524 z',\n },\n timeSig6: {\n x_min: 20,\n x_max: 565,\n y_min: -363,\n y_max: 363,\n ha: 726,\n o: 'm 390 -518 b 621 -458 469 -507 549 -494 b 814 -134 753 -390 814 -281 b 652 59 814 -16 750 58 b 580 48 629 59 606 55 b 233 -334 392 -9 276 -138 b 115 -228 181 -314 143 -278 b 98 -160 104 -206 98 -183 b 107 -109 98 -144 101 -127 b 167 37 124 -59 145 -12 b 508 340 236 189 347 292 b 575 353 530 347 553 353 b 648 327 600 353 625 346 b 665 320 654 321 661 320 b 687 336 674 320 681 325 b 703 405 697 359 703 382 b 684 472 703 429 697 451 b 593 523 664 504 631 521 b 576 521 588 523 582 523 b 297 403 472 508 380 465 b 115 177 217 344 164 264 b 29 -121 60 82 29 -17 b 53 -278 29 -173 36 -225 b 226 -497 82 -374 131 -454 b 347 -523 265 -514 305 -523 b 390 -518 361 -523 376 -521 z m 351 -357 b 312 -351 337 -356 320 -363 b 325 -315 304 -340 320 -327 b 543 -120 373 -222 448 -158 b 622 -104 570 -108 596 -102 b 717 -132 655 -104 687 -112 b 740 -167 732 -143 740 -153 b 730 -196 740 -176 737 -184 b 563 -321 690 -258 634 -300 b 359 -357 497 -341 428 -354 z',\n },\n timeSig7: {\n x_min: 20.3617407597707,\n x_max: 592,\n y_min: -345,\n y_max: 345,\n ha: 690,\n o: 'm 253 -497 b 318 -485 276 -497 297 -487 b 366 -441 348 -482 360 -468 b 487 -104 390 -323 433 -210 b 835 403 580 82 701 246 b 852 436 847 416 852 428 b 815 467 852 451 840 461 b 762 474 798 471 779 474 b 674 445 732 474 701 465 b 603 410 652 431 628 420 b 383 360 533 379 459 360 b 200 435 315 360 249 382 b 88 494 168 469 131 485 b 66 497 81 495 73 497 b 33 484 52 497 39 492 b 50 436 22 469 39 451 b 295 310 114 360 199 324 b 406 301 331 304 369 301 b 593 324 468 301 530 308 b 585 307 589 314 588 310 b 265 -249 451 137 338 -46 b 207 -442 242 -312 223 -377 b 204 -462 206 -449 204 -456 b 253 -497 204 -487 220 -497 z',\n },\n timeSig8: {\n x_min: 20,\n x_max: 504.15101530718516,\n y_min: -428,\n y_max: 428,\n ha: 856,\n o: 'm 265 -616 b 289 -615 274 -616 281 -616 b 710 -271 492 -592 657 -485 b 726 -148 721 -229 727 -187 b 585 108 726 -48 687 42 b 572 127 576 114 573 120 b 576 144 572 132 575 138 b 598 301 590 196 598 249 b 586 413 598 338 593 376 b 356 616 559 531 467 616 b 233 582 317 616 275 606 b 29 233 101 505 29 384 b 104 9 29 153 46 72 b 189 -48 127 -16 160 -27 b 92 -158 141 -73 114 -114 b 37 -343 63 -217 50 -279 b 33 -390 35 -359 33 -374 b 265 -616 33 -524 148 -616 z m 258 105 b 124 148 215 105 167 117 b 96 196 105 163 96 177 b 99 217 96 202 96 209 b 197 384 120 281 151 337 b 350 451 242 429 297 451 b 516 364 412 451 472 422 b 530 331 523 354 530 343 l 530 327 l 530 320 b 468 151 520 261 507 200 b 419 122 455 135 442 125 b 258 105 370 117 320 105 z m 328 -438 b 158 -276 233 -436 160 -359 b 166 -239 158 -264 161 -252 b 230 -157 176 -203 202 -179 b 367 -72 274 -125 320 -98 b 448 -49 396 -56 423 -49 b 562 -118 491 -49 528 -72 b 611 -251 590 -157 611 -199 b 569 -341 611 -288 595 -318 b 328 -438 500 -402 416 -432 z',\n },\n timeSig9: {\n x_min: 20,\n x_max: 494,\n y_min: -421,\n y_max: 421,\n ha: 842,\n o: 'm 235 -606 b 361 -564 275 -606 318 -593 b 619 -229 487 -482 566 -366 b 706 127 664 -114 694 4 b 711 233 708 163 711 197 b 700 346 711 271 708 308 b 389 606 658 517 530 606 b 351 605 376 606 364 606 b 56 272 171 586 56 441 b 96 98 56 216 69 156 b 334 -53 144 -3 238 -53 b 544 36 408 -53 484 -24 b 652 176 586 78 622 124 b 631 71 645 141 639 105 b 467 -302 599 -63 562 -196 b 271 -442 412 -364 354 -422 b 225 -448 255 -446 239 -448 b 95 -305 148 -448 98 -395 b 89 -255 95 -288 94 -271 b 73 -233 86 -246 85 -233 b 52 -248 65 -233 56 -239 b 29 -317 42 -271 30 -291 b 49 -448 29 -361 40 -405 b 235 -606 69 -541 144 -606 z m 340 104 b 144 209 264 108 194 141 b 127 258 132 225 127 240 b 137 297 127 271 130 284 b 366 449 184 396 269 449 b 517 408 415 449 467 436 b 595 348 546 392 572 372 b 616 305 608 336 616 321 b 609 281 616 298 613 289 b 340 104 557 184 477 104 z',\n },\n timeSigCommon: {\n x_min: 20,\n x_max: 585,\n y_min: -298,\n y_max: 294.49658092772603,\n ha: 592.496580927726,\n o: 'm 444 -405 b 829 -45 626 -346 740 -207 b 842 26 842 -23 842 1 b 821 58 842 39 841 58 b 795 40 811 58 802 48 b 765 3 785 29 773 16 b 469 -223 690 -104 596 -183 b 354 -242 431 -235 392 -242 b 180 -177 292 -242 235 -223 b 135 -99 154 -157 140 -131 b 132 -59 134 -85 132 -72 b 141 7 132 -37 135 -16 b 449 274 189 160 297 243 b 477 278 459 276 468 276 b 546 203 517 278 539 253 b 517 157 550 177 533 166 b 485 143 507 153 497 143 l 482 143 b 467 148 478 143 472 144 b 374 183 438 170 406 181 b 264 118 333 183 292 161 b 238 48 246 92 238 69 b 261 -9 238 29 245 10 b 383 -73 287 -39 337 -73 b 412 -68 392 -73 402 -72 b 631 164 526 -27 586 59 b 649 252 644 193 649 222 b 636 328 649 278 645 304 b 504 423 615 400 579 429 b 242 318 408 415 317 387 b 29 -158 104 190 29 33 b 30 -176 29 -164 29 -170 b 115 -364 42 -246 52 -315 b 307 -429 177 -410 240 -429 b 444 -405 351 -429 397 -420 z',\n },\n timeSigCutCommon: {\n x_min: 20,\n x_max: 695,\n y_min: -687.0379164869064,\n y_max: 687,\n ha: 1374.0379164869064,\n o: 'm 564 -989 b 595 -945 585 -991 589 -963 l 599 -922 b 605 -628 600 -824 603 -726 l 609 -399 b 878 -251 706 -363 798 -320 b 996 -85 932 -204 976 -153 b 1001 -63 998 -78 1001 -71 b 989 -46 1001 -56 998 -49 b 978 -43 985 -45 982 -43 b 950 -59 968 -43 959 -49 b 733 -216 894 -132 815 -177 b 611 -259 694 -235 652 -249 b 616 -20 612 -179 615 -99 b 680 29 642 -7 665 9 b 698 43 685 36 690 40 b 870 251 792 82 840 160 b 877 294 874 265 877 279 b 818 410 877 338 855 382 b 683 458 779 442 730 448 b 625 468 664 462 644 465 l 625 514 b 638 958 626 662 636 811 b 626 989 638 979 635 989 b 603 981 621 989 613 986 b 422 840 534 945 481 888 b 412 805 412 832 413 818 b 426 713 410 773 420 743 b 445 678 429 690 435 678 b 474 691 452 678 461 683 b 563 755 503 710 530 732 b 564 724 564 740 564 733 b 559 469 563 639 560 554 b 462 454 526 469 494 464 b 112 143 302 399 199 281 b 33 -94 66 71 45 -10 b 29 -148 30 -112 29 -131 b 105 -351 29 -223 52 -291 b 359 -455 171 -426 258 -451 b 517 -431 409 -451 464 -446 l 539 -422 l 539 -477 b 533 -739 536 -563 539 -651 b 530 -824 531 -768 530 -795 b 546 -948 530 -865 533 -907 b 564 -989 552 -962 543 -989 z m 410 -288 b 193 -197 328 -288 253 -264 b 141 -60 160 -161 141 -108 b 157 6 141 -35 147 -12 b 259 158 189 58 217 112 b 438 291 311 215 364 266 b 528 305 468 301 498 305 b 554 304 537 305 546 304 b 553 212 554 274 554 242 b 426 115 498 199 446 164 b 416 68 419 99 416 84 b 425 12 416 49 420 30 b 474 -39 432 -17 448 -32 b 513 -43 487 -42 498 -43 b 547 -40 524 -43 536 -42 l 543 -272 b 461 -285 516 -278 488 -281 b 410 -288 444 -287 426 -288 z m 694 197 b 668 203 685 197 677 199 b 621 216 654 210 638 215 b 622 294 622 242 622 268 b 706 268 651 287 678 278 b 746 235 721 261 734 249 b 752 222 749 230 752 226 b 743 213 752 219 749 215 b 694 197 727 206 711 197 z',\n },\n timeSigPlus: {\n x_min: 0,\n x_max: 661,\n y_min: -358,\n y_max: 358,\n ha: 716,\n o: 'm 605 -516 b 629 -490 624 -516 629 -507 b 628 -475 629 -485 628 -481 b 613 -131 624 -405 616 -174 b 612 -96 612 -114 612 -96 l 647 -98 b 897 -115 730 -99 814 -109 b 940 -89 919 -117 935 -109 b 952 -24 946 -69 952 -46 b 948 9 952 -14 950 -3 b 912 39 942 26 933 37 b 609 60 822 48 609 60 b 616 392 609 60 608 291 b 567 488 619 436 605 467 b 511 516 550 498 531 514 b 498 511 507 516 503 514 b 478 446 475 501 480 469 b 467 150 474 348 469 249 b 465 59 465 121 465 59 l 372 49 b 73 14 272 36 173 24 b 49 13 65 13 56 13 b 0 -33 9 13 0 6 b 60 -141 0 -117 6 -140 b 112 -135 73 -141 91 -140 b 413 -102 213 -125 314 -112 b 464 -98 441 -99 464 -98 l 464 -145 b 477 -456 464 -249 468 -353 b 526 -510 478 -488 491 -507 b 589 -513 546 -511 569 -510 b 605 -516 595 -514 600 -516 z',\n },\n timeSigPlusSmall: {\n x_min: 0,\n x_max: 418,\n y_min: -197,\n y_max: 199,\n ha: 396,\n o: 'm 301 -284 b 330 -238 320 -284 324 -255 b 348 -46 350 -176 341 -111 b 374 -20 351 -27 356 -23 b 481 -17 409 -16 445 -17 b 566 -9 510 -17 537 -16 b 602 3 579 -7 602 -16 b 566 29 602 19 582 24 b 526 33 553 32 539 33 b 384 39 478 36 432 39 b 356 62 363 39 356 42 l 356 68 b 359 177 359 104 359 141 l 359 251 b 341 287 359 264 361 285 b 311 255 324 287 314 272 b 310 228 311 246 310 236 l 301 69 b 275 39 301 49 295 39 l 271 39 b 210 40 251 40 230 40 b 167 39 196 40 181 40 b 89 40 141 37 115 40 b 24 30 68 40 46 37 b 0 17 17 27 0 30 l 0 13 b 27 -17 3 0 7 -13 b 91 -22 49 -22 71 -22 b 153 -22 115 -22 137 -20 l 275 -22 b 295 -40 289 -22 295 -27 l 295 -48 b 288 -235 288 -109 287 -171 b 287 -264 288 -243 287 -253 b 301 -284 287 -275 289 -284 z',\n },\n timeSigMinus: {\n x_min: 0,\n x_max: 662,\n y_min: -54,\n y_max: 55,\n ha: 109,\n o: 'm 39 -78 b 49 -76 42 -78 45 -76 b 452 -75 94 -75 272 -75 b 861 -76 632 -75 814 -76 b 953 -20 927 -79 953 -66 b 948 27 953 -7 950 9 b 946 37 948 30 948 35 b 896 79 940 63 929 79 b 471 78 827 78 648 78 l 42 78 b 0 37 14 78 0 69 b 23 -66 0 0 17 -32 b 39 -78 24 -75 32 -76 z',\n },\n timeSigParensRight: {\n x_min: 0,\n x_max: 274.26483738379414,\n y_min: -722.6326530612245,\n y_max: 725,\n ha: 1447.6326530612246,\n o: 'm 37 -1038 b 69 -1031 48 -1044 59 -1038 b 88 -1015 76 -1027 82 -1021 b 164 -886 120 -976 147 -933 b 333 -351 233 -711 292 -534 b 395 118 366 -204 399 -59 b 389 245 392 144 392 194 b 120 996 369 521 265 766 b 68 1044 99 1030 84 1044 b 19 988 50 1044 36 1024 b 0 922 7 965 0 945 b 20 858 0 901 6 881 b 259 215 141 660 236 449 b 271 -1 266 143 271 71 b 252 -239 271 -82 265 -161 b 148 -667 228 -384 183 -524 b 39 -1009 120 -785 66 -893 b 33 -1031 37 -1017 33 -1024 b 37 -1038 33 -1034 35 -1037 z',\n },\n timeSigParensRightSmall: {\n x_min: 0,\n x_max: 154.4025307335204,\n y_min: -422,\n y_max: 422,\n ha: 844,\n o: 'm 43 -608 b 60 -598 48 -608 53 -605 b 117 -511 82 -572 102 -543 b 222 23 193 -350 219 -177 b 213 166 225 55 216 109 b 115 531 206 294 174 416 b 45 603 99 562 76 588 b 30 608 39 606 35 608 b 10 598 23 608 17 603 b 0 546 3 590 0 570 b 23 451 0 507 9 458 b 102 351 66 429 84 390 b 167 42 150 252 167 148 b 163 -49 167 12 166 -19 b 35 -449 151 -192 121 -330 b 14 -504 22 -467 14 -485 b 17 -527 14 -511 16 -520 l 30 -590 b 43 -608 33 -603 37 -608 z',\n },\n timeSigParensLeft: {\n x_min: 0.5555555555555556,\n x_max: 399.6216117372966,\n y_min: -728,\n y_max: 728,\n ha: 1456,\n o: 'm 562 -1048 b 573 -1043 566 -1048 570 -1047 b 553 -988 582 -1025 564 -1004 b 472 -884 527 -952 497 -920 b 210 -354 366 -717 275 -541 b 148 -6 170 -240 148 -124 b 160 148 148 45 153 96 b 315 678 189 331 242 508 b 431 901 350 755 380 834 b 459 950 451 926 461 939 b 435 995 459 962 451 972 b 364 1048 405 1034 383 1048 b 305 996 343 1048 325 1028 b 127 624 226 881 174 753 b 1 30 56 432 9 235 b 1 -32 1 9 0 -12 b 180 -629 13 -245 92 -438 b 363 -936 230 -739 298 -835 b 526 -1041 402 -995 448 -1041 b 562 -1048 537 -1040 552 -1048 z',\n },\n timeSigParensLeftSmall: {\n x_min: 0,\n x_max: 173.45497224367904,\n y_min: -405,\n y_max: 404,\n ha: 809,\n o: 'm 197 -583 b 222 -553 212 -582 219 -566 b 229 -497 226 -534 229 -516 b 213 -425 229 -472 225 -448 b 102 -177 173 -344 132 -262 b 62 30 78 -111 58 -42 b 91 183 66 82 75 134 b 215 426 118 271 156 356 b 249 552 246 465 252 505 b 230 582 249 563 246 582 b 197 563 219 582 206 576 b 71 356 144 500 105 429 b 0 50 26 259 3 158 b 13 -112 4 -3 7 -58 b 176 -559 29 -275 105 -416 b 196 -583 180 -569 186 -583 z',\n },\n noteheadDoubleWhole: {\n x_min: -0.4444444444444444,\n x_max: 614.1875,\n y_min: -223.03296670127517,\n y_max: 223,\n ha: 446.0329667012752,\n o: 'm 35 -321 b 62 -266 58 -318 58 -288 l 62 -194 b 63 50 62 -114 63 -32 b 60 189 63 96 63 143 b 43 300 59 226 60 265 b 29 321 40 308 39 321 l 26 321 b 0 292 13 318 0 310 b 0 248 0 278 -1 262 b 6 147 4 215 6 181 b 4 48 6 114 4 81 b 6 0 4 32 6 16 b 7 -36 7 -12 7 -24 l 7 -52 b 6 -156 7 -86 6 -121 b 19 -275 6 -196 9 -236 b 35 -321 23 -291 16 -323 z m 847 -314 b 871 -288 860 -315 867 -300 b 884 -187 881 -255 886 -222 b 876 115 878 -86 876 14 b 877 255 876 161 876 209 b 868 291 877 268 873 279 b 855 304 867 301 863 304 b 844 301 852 304 848 304 b 822 265 825 292 822 278 b 824 251 822 259 822 255 b 822 170 822 225 822 197 l 822 -20 b 835 -284 827 -86 825 -186 b 847 -314 837 -295 835 -311 z m 757 -291 b 793 -171 796 -255 792 -212 b 795 -49 795 -131 795 -91 b 786 207 795 36 791 121 b 779 240 786 217 783 229 b 766 258 776 246 776 258 b 762 256 765 258 763 256 b 739 236 752 253 740 252 b 733 177 737 216 732 197 b 737 20 737 125 739 73 l 737 -107 b 740 -202 737 -138 739 -170 b 757 -291 740 -230 743 -261 z m 128 -261 b 144 -251 135 -264 141 -256 b 158 -203 156 -236 157 -220 b 161 -137 161 -181 161 -158 b 157 30 161 -81 157 -26 b 158 76 157 45 157 60 l 158 101 b 156 225 158 141 158 183 b 137 253 156 235 154 253 l 134 253 b 109 222 120 251 109 242 b 104 91 108 179 104 134 b 108 -58 104 42 109 -9 b 107 -105 108 -73 108 -89 b 105 -127 107 -112 107 -120 b 118 -245 105 -167 114 -204 b 128 -261 118 -252 121 -259 z m 488 -242 b 693 -79 595 -249 685 -166 l 693 -55 b 690 0 693 -36 691 -17 b 540 187 684 84 621 164 b 449 200 508 196 480 200 b 210 104 363 200 282 163 b 186 56 196 92 186 76 b 207 -82 186 9 192 -37 b 300 -204 225 -132 248 -181 b 488 -242 356 -229 415 -240 z m 490 -88 b 449 -86 477 -88 464 -88 b 287 -56 399 -85 341 -78 b 258 -33 275 -52 258 -48 b 282 -7 258 -20 272 -13 b 458 43 340 23 399 43 b 580 14 497 43 537 35 b 618 -20 606 1 619 -9 b 592 -58 618 -30 609 -42 b 490 -88 562 -82 528 -88 z',\n },\n noteheadWhole: {\n x_min: 0,\n x_max: 380.16649762501584,\n y_min: -186.17102907059297,\n y_max: 165,\n ha: 351.17102907059297,\n o: 'm 547 40 b 223 -268 543 -151 367 -259 b 102 -233 180 -271 143 -248 l 62 -216 b 0 -127 22 -197 0 -166 b 6 -91 0 -115 1 -104 b 122 141 33 -9 69 71 b 327 238 170 204 249 238 b 514 158 397 238 467 212 b 547 40 544 125 549 84 z m 248 -107 b 384 -63 295 -102 341 -88 b 426 -23 402 -53 415 -40 b 435 3 432 -14 435 -6 b 413 32 435 14 428 24 b 301 73 376 49 343 73 b 272 69 291 73 282 72 b 121 -35 207 53 157 20 b 111 -58 117 -42 111 -50 b 125 -75 111 -65 115 -71 b 248 -107 164 -89 202 -107 z',\n },\n noteheadHalf: {\n x_min: 0,\n x_max: 334,\n y_min: -174,\n y_max: 175,\n ha: 349,\n o: 'm 480 56 b 167 -251 478 -115 331 -251 b 94 -242 143 -251 118 -248 b 9 -141 43 -229 20 -192 b 0 -68 3 -115 0 -91 b 284 249 0 95 127 200 b 304 252 289 251 297 252 b 481 78 374 252 481 170 b 480 56 481 71 481 63 z m 213 -102 b 399 6 274 -81 341 -48 b 402 17 400 7 402 13 b 399 27 402 22 400 26 b 311 94 373 53 353 88 b 292 95 305 95 300 95 b 130 27 230 95 181 55 b 69 -62 98 9 62 -29 b 161 -98 76 -98 128 -91 b 213 -102 174 -101 186 -101 z',\n },\n noteheadBlack: {\n x_min: 0,\n x_max: 334.04644433966797,\n y_min: -164,\n y_max: 164,\n ha: 328,\n o: 'm 112 -233 b 141 -236 122 -235 131 -236 b 481 104 279 -236 485 -48 b 403 222 477 141 478 192 b 334 236 382 232 359 236 b 1 -59 180 236 13 59 b 0 -85 1 -68 0 -76 b 112 -233 0 -157 32 -215 z',\n },\n noteheadXWhole: {\n x_min: 0,\n x_max: 506,\n y_min: -143.0823320899293,\n y_max: 144,\n ha: 287.0823320899293,\n o: 'm 53 -206 b 219 -163 117 -207 170 -196 b 314 -102 249 -141 282 -122 b 377 -63 334 -89 356 -76 b 514 -161 422 -96 468 -128 b 576 -196 534 -174 552 -196 b 589 -193 580 -196 585 -196 b 688 -174 625 -194 657 -181 b 711 -158 698 -171 711 -173 b 696 -143 711 -151 701 -147 b 503 -9 632 -98 567 -52 l 485 4 b 704 145 559 49 634 95 b 729 164 711 150 729 151 l 729 168 b 696 196 726 183 710 193 b 621 207 671 202 645 207 b 528 177 589 207 557 200 b 373 76 480 140 426 108 b 246 164 330 104 287 132 b 122 206 207 193 167 203 b 66 192 102 207 72 207 b 99 147 58 173 85 158 b 274 14 157 102 215 58 b 16 -164 184 -42 96 -98 b 0 -179 12 -168 0 -170 b 1 -183 0 -180 0 -183 b 26 -204 6 -193 12 -204 b 53 -206 37 -206 49 -206 z m 611 -177 b 376 -9 530 -118 452 -63 l 164 -143 b 104 -164 147 -154 130 -164 b 82 -161 96 -164 89 -164 b 230 -65 137 -125 183 -95 l 347 12 b 327 26 341 16 334 22 l 196 121 b 163 147 184 128 173 137 b 140 173 154 154 140 163 b 143 180 140 176 141 177 b 179 166 154 194 167 174 l 372 27 l 566 153 b 613 171 580 161 596 170 b 635 160 624 171 635 174 b 621 147 635 153 626 150 l 429 24 b 400 6 419 19 409 13 b 569 -117 456 -35 513 -75 b 611 -177 588 -130 608 -143 z',\n },\n noteheadXHalf: {\n x_min: 0,\n x_max: 421,\n y_min: -145.51844828189743,\n y_max: 151,\n ha: 296.51844828189746,\n o: 'm 490 -209 b 539 -207 505 -207 521 -207 b 606 -209 560 -207 583 -209 b 598 -196 602 -203 600 -199 l 406 -19 l 540 130 b 547 144 546 135 547 140 b 536 156 547 148 543 153 b 488 192 518 166 503 176 b 416 217 471 209 444 217 b 323 180 380 217 344 204 l 264 115 b 239 138 256 122 248 131 b 33 197 180 196 108 200 b 3 186 23 197 6 193 b 19 154 -1 174 10 163 b 171 12 69 107 120 59 b 19 -157 120 -45 69 -101 b 0 -177 14 -163 0 -166 b 1 -181 0 -179 0 -180 b 39 -203 9 -197 22 -203 l 186 -203 b 197 -202 190 -202 193 -200 l 213 -202 b 262 -180 228 -202 246 -199 l 314 -122 b 490 -209 363 -170 412 -216 z m 435 -148 b 291 -30 379 -112 337 -69 l 213 -118 b 190 -137 207 -125 202 -137 b 145 -111 173 -130 154 -127 b 160 -79 137 -98 151 -88 b 238 16 184 -48 212 -16 b 141 99 204 43 173 72 l 124 117 b 115 132 121 121 115 127 b 118 137 115 134 117 137 b 141 132 127 147 135 138 l 253 36 b 347 150 285 75 315 112 b 370 164 354 160 363 163 b 403 145 382 164 393 156 b 416 127 412 140 416 132 b 405 102 416 118 412 111 l 307 -10 b 413 -105 343 -42 379 -73 b 435 -148 425 -115 436 -125 z',\n },\n noteheadXBlack: {\n x_min: 0,\n x_max: 289,\n y_min: -156,\n y_max: 157,\n ha: 313,\n o: 'm 23 -225 b 69 -204 40 -223 56 -219 b 137 -131 92 -180 115 -157 l 209 -50 b 377 -197 264 -101 321 -148 b 403 -210 384 -203 393 -210 l 408 -210 b 416 -192 416 -207 416 -199 l 416 -186 b 403 -148 416 -171 413 -158 b 344 -81 384 -125 367 -101 b 252 -1 312 -55 282 -29 b 377 157 297 49 340 101 b 402 202 387 170 402 187 b 395 217 402 207 400 213 b 376 226 389 223 382 226 b 334 192 360 226 346 204 b 206 42 289 143 248 94 b 96 161 167 81 131 120 b 60 193 86 174 76 189 b 33 206 52 196 42 206 b 22 199 29 206 26 204 b 10 173 14 190 10 181 b 22 147 10 166 14 157 b 148 7 62 98 104 52 b 164 -7 154 1 158 -3 b 10 -189 111 -66 55 -122 b 0 -212 6 -197 0 -203 b 1 -217 0 -213 0 -216 b 23 -225 4 -226 14 -222 z',\n },\n noteheadCircleX: {\n x_min: 0,\n x_max: 344,\n y_min: -179,\n y_max: 175.12551922594866,\n ha: 354.12551922594866,\n o: 'm 99 -210 b 236 -258 137 -242 186 -258 b 418 -183 305 -258 374 -230 b 495 33 475 -120 495 -48 b 494 66 495 45 494 55 b 302 252 487 183 405 256 b 181 243 262 249 222 248 b 46 171 128 236 79 219 b 0 19 14 127 0 73 b 99 -210 0 -68 35 -156 z m 245 42 l 124 156 b 200 176 145 166 170 173 b 337 183 245 181 291 184 b 377 176 351 183 364 180 b 245 42 333 131 288 86 z m 392 -99 l 285 3 l 400 121 b 418 154 409 131 418 140 b 465 50 448 130 465 94 b 405 -112 462 -17 439 -73 z m 89 -120 b 48 0 56 -82 48 -42 b 89 112 48 35 59 76 b 109 101 96 111 102 108 l 210 7 l 187 -17 b 89 -120 151 -53 125 -82 z m 176 -183 b 127 -163 158 -179 141 -171 l 252 -32 l 372 -144 b 233 -189 334 -173 285 -189 b 176 -183 215 -189 196 -187 z',\n },\n noteheadTriangleUpWhole: {\n x_min: 0,\n x_max: 366,\n y_min: -145,\n y_max: 138,\n ha: 283,\n o: 'm 504 -209 b 527 -199 520 -209 527 -206 b 520 -180 527 -193 524 -187 b 459 -94 501 -151 480 -122 b 279 170 400 -6 341 82 b 242 199 266 190 253 199 b 206 167 230 199 219 189 b 10 -145 140 63 76 -42 b 0 -171 3 -156 0 -164 b 23 -200 0 -183 9 -192 b 55 -209 33 -206 45 -209 z m 202 -161 b 176 -137 183 -163 176 -156 b 187 -62 176 -111 179 -86 b 253 95 206 -10 228 42 b 337 -132 307 24 334 -49 b 311 -161 338 -153 334 -161 b 256 -160 294 -161 275 -160 b 202 -161 238 -160 220 -161 z',\n },\n noteheadTriangleUpHalf: {\n x_min: 0,\n x_max: 341.0833130378007,\n y_min: -159,\n y_max: 159,\n ha: 318,\n o: 'm 458 -226 b 478 -229 462 -223 469 -229 b 490 -222 482 -229 487 -228 b 477 -184 495 -207 484 -196 b 281 176 410 -65 346 56 b 238 225 269 194 261 213 b 225 229 232 226 228 228 b 209 215 217 229 213 225 b 4 -153 141 92 73 -30 b 0 -170 1 -158 0 -164 b 12 -189 0 -177 4 -183 b 66 -215 27 -202 43 -213 b 458 -226 194 -217 323 -222 z m 151 -167 b 298 75 204 -89 240 -1 b 301 82 300 76 301 79 l 357 -22 b 344 -43 353 -27 350 -37 b 285 -163 317 -79 312 -127 b 278 -170 282 -166 279 -167 z',\n },\n noteheadTriangleUpBlack: {\n x_min: 0,\n x_max: 346,\n y_min: -149,\n y_max: 149,\n ha: 298,\n o: 'm 481 -215 b 498 -209 487 -215 492 -215 b 482 -173 498 -194 488 -184 l 284 173 b 259 202 278 184 269 194 b 229 215 248 210 238 215 b 196 189 216 215 206 206 l 13 -150 b 3 -168 9 -156 6 -163 b 0 -180 1 -173 0 -177 b 12 -197 0 -187 4 -193 b 63 -213 29 -206 45 -213 b 481 -215 203 -213 343 -215 z',\n },\n noteheadDiamondWhole: {\n x_min: 0,\n x_max: 271,\n y_min: -132,\n y_max: 132,\n ha: 264,\n o: 'm 230 -177 b 256 -190 240 -186 249 -190 b 281 -173 265 -190 272 -184 b 382 -29 314 -124 347 -76 b 390 -10 387 -22 390 -14 b 376 12 390 -3 386 4 b 173 177 308 66 240 121 b 144 190 166 183 160 190 b 98 153 127 186 112 170 b 13 40 69 115 42 76 b 0 13 4 29 0 20 b 22 -19 0 3 7 -9 b 230 -177 92 -69 163 -122 z m 279 -128 b 261 -122 274 -134 266 -127 l 66 30 b 56 45 59 35 56 39 b 62 56 56 48 59 52 b 122 122 91 101 105 122 b 194 76 138 122 158 107 l 320 -26 b 336 -50 325 -32 336 -35 b 279 -128 318 -75 300 -102 z',\n },\n noteheadDiamondHalf: {\n x_min: 0,\n x_max: 295,\n y_min: -148,\n y_max: 148,\n ha: 296,\n o: 'm 228 -207 b 245 -213 235 -210 240 -213 b 264 -203 252 -213 258 -210 b 415 -46 314 -150 364 -98 b 425 -27 420 -40 425 -35 b 416 -10 425 -22 422 -16 b 217 200 350 60 284 131 b 194 213 212 207 204 213 b 170 196 181 213 177 203 b 14 33 118 143 68 86 b 0 7 4 23 0 16 b 17 -20 0 -1 6 -10 b 118 -114 52 -50 82 -85 b 228 -207 156 -144 184 -184 z m 209 -157 b 134 -69 177 -138 141 -115 b 130 -26 131 -55 130 -40 b 215 148 130 42 160 99 b 225 156 217 151 220 156 b 230 153 226 156 228 156 b 323 -26 276 104 321 55 b 298 -75 324 -42 315 -59 b 265 -109 287 -86 276 -99 b 209 -157 245 -125 228 -167 z',\n },\n noteheadDiamondBlack: {\n x_min: 0,\n x_max: 310,\n y_min: -146,\n y_max: 146,\n ha: 292,\n o: 'm 266 -210 b 289 -194 278 -209 284 -200 b 406 -76 330 -156 367 -115 b 446 -23 433 -49 446 -36 b 412 29 446 -10 435 3 b 405 36 409 30 408 33 b 252 196 354 89 304 143 b 225 210 243 204 235 210 b 204 202 219 210 212 209 b 10 24 141 141 75 82 b 0 9 4 19 0 14 b 9 -6 0 4 3 0 l 232 -192 b 266 -210 242 -200 256 -204 z',\n },\n noteheadSquareWhite: {\n x_min: 0,\n x_max: 350,\n y_min: -131,\n y_max: 131,\n ha: 262,\n o: 'm 468 -189 b 485 -187 474 -189 480 -189 b 500 -176 495 -187 500 -183 b 498 -168 500 -174 498 -171 b 497 -166 498 -167 497 -167 l 498 -164 b 504 -154 503 -163 504 -158 b 503 -138 504 -150 503 -144 l 503 -135 l 503 -94 b 492 66 500 -45 494 10 b 488 135 492 89 488 112 b 484 150 488 141 485 145 b 482 154 482 151 482 153 b 429 189 472 177 456 189 b 53 184 304 186 179 186 l 39 184 b 33 181 36 183 35 183 b 12 160 20 181 12 177 b 0 -109 9 71 4 -19 b 19 -137 0 -125 7 -134 b 23 -151 19 -141 20 -145 b 85 -187 37 -173 55 -187 b 468 -189 212 -187 340 -187 z m 246 -125 l 63 -125 b 66 -111 65 -122 66 -117 b 73 72 69 -50 71 10 l 73 130 b 88 128 78 128 82 128 b 148 130 108 130 128 130 b 271 128 190 130 230 128 l 271 130 l 420 130 b 428 20 425 92 425 56 l 436 -127 l 246 -127 z',\n },\n noteheadSquareBlack: {\n x_min: 0,\n x_max: 342,\n y_min: -129.98961937716263,\n y_max: 132.44444444444446,\n ha: 262.4340638216071,\n o: 'm 217 190 b 439 186 304 190 372 190 b 467 180 448 184 458 183 b 492 145 484 176 492 167 b 490 -124 490 56 490 -33 b 488 -141 490 -130 488 -135 b 456 -170 488 -163 478 -168 b 118 -183 344 -176 230 -181 b 29 -184 89 -183 60 -192 b 0 -148 4 -180 0 -168 b 1 29 1 -89 1 -30 l 1 156 b 36 190 3 187 4 190 b 217 190 102 192 168 190 z',\n },\n noteheadParenthesis: {\n x_min: -70.190112022022,\n x_max: 329,\n y_min: -196,\n y_max: 201,\n ha: 397,\n o: 'm 344 -279 b 382 -262 361 -288 370 -272 b 405 -233 390 -255 399 -245 b 474 9 455 -158 468 -73 b 416 228 474 78 448 174 b 364 282 403 249 387 271 b 344 289 359 285 350 288 b 331 279 338 289 333 287 b 325 248 328 269 325 258 b 338 225 325 238 328 229 b 412 138 379 207 396 174 b 445 1 433 92 445 45 b 346 -217 445 -81 410 -154 b 336 -252 340 -223 336 -238 b 344 -279 336 -265 338 -276 z m 19 -274 b 35 -282 24 -279 30 -281 b 49 -265 42 -282 46 -275 b 52 -243 50 -256 52 -249 b 36 -210 52 -230 49 -220 b -60 -59 -16 -173 -35 -114 b -73 9 -69 -39 -73 -16 b 33 223 -73 92 -24 189 b 50 265 43 229 50 249 b 33 288 50 278 46 289 b 4 272 23 288 14 275 b -9 261 0 269 -4 265 b -101 23 -58 193 -105 124 b -37 -206 -104 -52 -75 -130 b 19 -274 -23 -232 -6 -255 z',\n },\n noteheadParenthesisRight: {\n x_min: -30,\n x_max: 82,\n y_min: -199.08429092881173,\n y_max: 206,\n ha: 405.0842909288117,\n o: 'm -17 -282 b 24 -264 -6 -297 12 -272 b 60 -219 40 -253 52 -236 b 117 1 96 -150 112 -75 b 118 16 118 6 118 12 b 109 73 118 36 112 55 b 4 279 99 154 68 226 b -23 297 -4 287 -13 297 b -37 289 -27 297 -32 294 b -43 266 -42 285 -43 276 b -32 225 -43 251 -37 229 b 84 -7 48 170 84 82 b 32 -184 84 -69 65 -132 b -10 -222 22 -200 4 -209 b -24 -258 -20 -232 -24 -245 b -17 -282 -24 -266 -22 -276 z',\n },\n noteheadParenthesisLeft: {\n x_min: 0,\n x_max: 106,\n y_min: -197,\n y_max: 197,\n ha: 394,\n o: 'm 134 -284 b 138 -281 135 -284 137 -284 b 145 -268 144 -278 145 -274 l 144 -253 b 107 -180 138 -225 121 -204 b 42 13 71 -120 42 -56 b 49 73 42 32 43 52 b 137 210 62 128 95 171 b 153 255 147 219 153 239 b 145 278 153 265 151 274 b 130 284 140 281 135 284 b 98 259 117 284 108 268 b 0 37 35 203 1 131 b 118 -268 9 -69 53 -173 b 134 -284 121 -274 127 -284 z',\n },\n augmentationDot: {\n x_min: 0,\n x_max: 96,\n y_min: -57,\n y_max: 57,\n ha: 114,\n o: 'm 13 -82 b 16 -81 14 -82 14 -82 b 105 -73 46 -76 75 -76 b 131 -48 121 -72 131 -60 b 138 26 134 -24 138 0 b 137 48 138 33 138 40 b 108 82 134 71 125 82 b 95 81 104 82 99 82 b 33 71 75 78 53 75 b 4 46 20 68 6 62 b 0 -66 1 9 0 -29 b 13 -82 0 -73 1 -82 z',\n },\n tremolo1: {\n x_min: -158,\n x_max: 156.19381479578487,\n y_min: -88,\n y_max: 88,\n ha: 176,\n o: 'm -206 -127 b -194 -125 -203 -127 -199 -127 b 173 -36 -72 -94 50 -65 b 220 16 202 -29 215 -12 b 225 50 223 30 225 45 b 216 107 226 76 222 91 b 194 127 210 120 204 127 b 183 124 192 127 189 127 l -192 33 b -226 -9 -213 27 -222 14 b -228 -32 -226 -16 -228 -23 b -222 -108 -228 -58 -222 -82 b -206 -127 -222 -120 -217 -127 z',\n },\n flag8thUp: {\n x_min: 0,\n x_max: 261,\n y_min: -819,\n y_max: 0,\n ha: 819,\n o: 'm 265 -1171 b 351 -1035 301 -1130 336 -1087 b 376 -867 369 -979 376 -923 b 367 -755 376 -829 373 -792 b 233 -422 350 -632 311 -520 b 131 -291 199 -379 166 -334 b 65 -125 91 -239 66 -192 b 62 -75 65 -112 62 -91 b 42 0 62 -49 52 -24 l 35 0 b 0 -63 6 -13 0 -36 l 0 -144 b 96 -445 0 -255 29 -356 b 177 -547 124 -478 150 -514 b 308 -831 246 -629 298 -721 b 317 -890 310 -851 317 -871 b 311 -919 317 -900 315 -910 b 256 -1005 297 -950 282 -984 b 228 -1068 233 -1024 228 -1045 b 230 -1106 228 -1080 229 -1093 b 240 -1162 232 -1125 239 -1143 b 251 -1179 242 -1174 246 -1179 b 265 -1171 255 -1179 259 -1176 z',\n },\n flag8thDown: {\n x_min: 0,\n x_max: 261,\n y_min: 0,\n y_max: 819,\n ha: 819,\n o: 'm 265 1171 b 251 1179 259 1176 255 1179 b 240 1162 246 1179 242 1174 b 230 1106 239 1143 232 1125 b 228 1068 229 1093 228 1080 b 256 1005 228 1045 233 1024 b 311 919 282 984 297 950 b 317 890 315 910 317 900 b 308 831 317 871 310 851 b 177 547 298 721 246 629 b 96 445 150 514 124 478 b 0 144 29 356 0 255 l 0 63 b 35 0 0 36 6 13 l 42 0 b 62 75 52 24 62 49 b 59 117 62 91 59 104 b 131 291 60 183 91 239 b 233 422 166 334 199 379 b 367 755 311 520 350 632 b 376 867 373 792 376 829 b 351 1035 376 923 369 979 b 265 1171 336 1087 301 1130 z',\n },\n flag16thUp: {\n x_min: 0,\n x_max: 327.1591498636094,\n y_min: -819.3972596310256,\n y_max: 0,\n ha: 819.3972596310256,\n o: 'm 415 -1179 b 435 -1168 423 -1182 429 -1174 b 451 -1138 442 -1159 446 -1149 b 465 -1020 464 -1102 467 -1064 b 461 -962 464 -1004 464 -984 b 471 -821 467 -916 472 -870 b 465 -721 472 -791 467 -756 b 415 -520 459 -651 441 -585 b 200 -245 370 -408 284 -327 b 96 -114 160 -206 118 -168 b 75 -24 84 -85 85 -53 b 59 0 72 -16 72 0 b 53 -1 58 0 56 -1 b 27 -32 40 -6 27 -10 b 29 -68 27 -43 29 -55 b 10 -79 20 -69 13 -72 b 1 -109 6 -89 1 -99 b 0 -170 0 -130 0 -148 b 35 -410 0 -252 12 -333 b 258 -793 76 -557 156 -681 b 409 -1158 350 -896 410 -1014 b 415 -1179 409 -1165 405 -1175 z m 413 -816 b 331 -681 392 -769 364 -723 b 145 -420 266 -596 189 -521 b 86 -281 125 -374 102 -330 b 156 -370 105 -312 128 -343 b 318 -539 210 -425 269 -478 b 413 -816 383 -621 420 -713 z',\n },\n flag16thDown: {\n x_min: 0,\n x_max: 327.1591498636094,\n y_min: 0,\n y_max: 819,\n ha: 819,\n o: 'm 59 0 b 75 24 72 0 72 16 b 96 114 85 53 84 85 b 200 245 118 168 160 206 b 415 520 284 327 370 408 b 465 721 441 585 459 651 b 471 821 467 756 472 791 b 461 962 472 870 467 916 b 465 1020 464 984 464 1004 b 451 1138 467 1064 464 1102 b 435 1168 446 1149 442 1159 b 418 1179 431 1172 425 1179 l 415 1179 b 408 1169 409 1176 408 1174 b 409 1158 408 1165 409 1161 b 258 793 410 1014 350 896 b 35 410 156 681 76 557 b 0 170 12 333 0 252 l 0 88 b 29 7 0 71 6 23 b 59 0 33 4 58 0 z m 86 281 b 145 420 102 330 125 374 b 331 681 189 521 266 596 b 413 816 364 723 392 769 b 415 791 413 808 415 799 b 318 539 415 698 377 613 b 156 370 269 478 210 425 b 86 281 128 343 105 312 z',\n },\n flag32ndUp: {\n x_min: -0.19862981551275186,\n x_max: 268.0942440943661,\n y_min: -849.4710740978672,\n y_max: 149.0769891455102,\n ha: 998.5480632433774,\n o: 'm 323 -1223 b 351 -1198 337 -1227 344 -1210 b 359 -1184 354 -1194 356 -1188 b 386 -999 377 -1122 387 -1060 b 341 -783 386 -927 372 -855 b 330 -736 334 -769 330 -753 b 333 -708 330 -727 330 -717 b 344 -621 340 -678 344 -649 b 341 -579 344 -608 343 -593 b 328 -500 338 -553 328 -526 b 331 -475 328 -491 328 -484 b 347 -370 343 -438 348 -402 b 151 27 348 -212 288 -56 b 53 176 98 59 50 102 b 45 197 53 183 48 192 b 33 215 40 203 40 216 l 30 215 b 6 194 22 212 9 209 b 0 120 3 170 -1 145 b 0 -43 4 65 0 13 b 0 -98 0 -60 1 -79 b 4 -276 0 -157 6 -216 b 7 -456 4 -337 7 -397 b 66 -638 7 -523 22 -585 b 158 -724 94 -671 127 -697 b 318 -1011 246 -801 295 -899 b 321 -1044 321 -1021 321 -1032 b 312 -1152 321 -1080 312 -1116 b 317 -1192 312 -1165 314 -1179 b 323 -1223 320 -1202 311 -1220 z m 285 -376 b 121 -180 249 -289 173 -245 b 91 -105 104 -158 92 -135 b 288 -354 181 -144 288 -269 b 285 -376 288 -363 287 -370 z m 275 -657 b 111 -492 226 -589 163 -547 b 65 -376 78 -456 66 -418 b 71 -323 65 -360 68 -341 b 275 -657 164 -418 265 -504 z',\n },\n flag32ndDown: {\n x_min: -2.800802874905624,\n x_max: 268.09424409436605,\n y_min: -169.07698914551014,\n y_max: 829.4710740978672,\n ha: 998.5480632433773,\n o: 'm 323 1194 b 317 1164 311 1191 320 1174 b 312 1123 314 1151 312 1136 b 321 1015 312 1087 321 1051 b 318 982 321 1004 321 992 b 158 696 295 870 246 772 b 66 609 127 668 94 642 b 7 428 22 556 7 494 b 4 248 7 369 4 308 b -1 78 6 187 -10 137 b 0 14 0 59 0 32 l 0 -148 b 6 -223 0 -174 3 -199 b 30 -243 9 -238 22 -240 l 33 -243 b 45 -226 40 -245 40 -232 b 53 -204 48 -220 53 -212 b 151 -56 50 -131 98 -88 b 347 341 288 27 348 183 b 331 446 348 373 343 409 b 328 471 328 455 328 462 b 341 550 328 497 338 524 b 344 592 343 564 344 579 b 333 680 344 621 340 649 b 330 707 330 688 330 698 b 341 755 330 724 334 740 b 386 971 372 827 386 899 b 359 1155 387 1031 377 1093 b 351 1169 356 1159 354 1165 b 323 1194 344 1181 337 1198 z m 275 628 b 71 294 265 475 164 389 b 65 347 68 312 65 331 b 111 464 66 389 78 428 b 275 628 163 518 226 560 z m 285 347 b 288 325 287 341 288 334 b 91 76 288 240 181 115 b 121 151 92 107 104 130 b 285 347 173 216 249 261 z',\n },\n flag64thUp: {\n x_min: -4,\n x_max: 282,\n y_min: -823.5430338167067,\n y_max: 347,\n ha: 1170.5430338167066,\n o: 'm 350 -1185 b 380 -1162 364 -1189 374 -1175 b 406 -1022 399 -1119 406 -1071 b 359 -798 406 -945 384 -871 b 348 -756 353 -785 348 -772 b 350 -744 348 -753 350 -749 b 363 -621 356 -704 363 -664 b 360 -580 363 -608 363 -593 b 359 -560 359 -573 359 -567 b 373 -490 359 -536 366 -513 b 393 -346 386 -444 393 -395 b 387 -269 393 -320 390 -294 b 348 -127 382 -219 348 -173 b 351 -104 348 -120 348 -111 b 353 -65 351 -91 353 -78 b 341 37 353 -26 348 6 b 226 215 323 108 278 164 b 86 336 181 258 127 288 b 62 395 72 353 62 370 b 42 481 62 423 55 454 b 27 500 37 488 36 500 b 24 498 26 500 26 500 b -1 480 14 497 1 492 b -6 444 -4 467 -6 455 l -6 435 b -1 341 -1 403 -1 372 l -1 266 b 6 156 -1 230 0 193 b 13 35 12 117 13 75 l 13 -35 b 14 -85 13 -52 14 -68 b 29 -276 19 -150 33 -213 b 20 -448 24 -334 20 -392 b 24 -534 20 -477 22 -505 b 114 -708 30 -605 59 -664 b 197 -780 143 -732 171 -755 b 344 -1153 301 -884 341 -1011 b 343 -1172 344 -1159 343 -1166 b 350 -1185 343 -1176 344 -1182 z m 287 -88 b 62 193 186 -17 79 48 b 229 52 121 144 174 98 b 289 -33 256 29 274 -3 b 295 -56 294 -42 295 -49 b 287 -88 295 -66 292 -76 z m 298 -410 b 118 -235 238 -351 176 -295 b 76 -88 82 -197 78 -147 b 268 -252 137 -153 203 -202 b 330 -360 304 -279 330 -315 b 323 -402 330 -373 327 -387 b 311 -418 318 -413 315 -418 b 298 -410 307 -418 302 -415 z m 300 -691 b 117 -508 243 -616 168 -575 b 82 -408 94 -480 82 -448 b 84 -379 82 -397 82 -387 b 259 -553 135 -451 206 -492 b 301 -667 287 -583 301 -619 b 300 -691 301 -674 301 -683 z',\n },\n flag64thDown: {\n x_min: -5,\n x_max: 281,\n y_min: -375,\n y_max: 795.5430338167066,\n ha: 1170.5430338167066,\n o: 'm 348 1145 b 341 1132 343 1142 341 1136 b 343 1113 341 1126 343 1119 b 196 740 340 971 300 844 b 112 668 170 714 141 691 b 23 494 58 624 29 564 b 19 408 20 465 19 436 b 27 236 19 351 23 294 b 13 45 32 173 17 109 b 12 -6 13 27 12 12 l 12 -75 b 4 -196 12 -115 10 -157 b -3 -307 -1 -233 -3 -271 l -3 -382 b -7 -475 -3 -412 -3 -444 l -7 -484 b -3 -520 -7 -495 -6 -507 b 23 -539 0 -533 13 -537 b 26 -540 24 -540 24 -540 b 40 -521 35 -540 36 -528 b 60 -435 53 -494 60 -464 b 85 -376 60 -410 71 -393 b 225 -255 125 -328 180 -298 b 340 -78 276 -204 321 -148 b 351 24 347 -46 351 -14 b 350 63 351 37 350 50 b 347 86 347 71 347 79 b 386 229 347 132 380 179 b 392 305 389 253 392 279 b 372 449 392 354 384 403 b 357 520 364 472 357 495 b 359 540 357 527 357 533 b 361 580 361 553 361 567 b 348 704 361 624 354 664 b 347 716 348 708 347 713 b 357 757 347 732 351 744 b 405 982 383 831 405 904 b 379 1122 405 1031 397 1079 b 348 1145 373 1135 363 1149 z m 298 651 b 300 626 300 642 300 634 b 258 513 300 579 285 543 b 82 338 204 452 134 410 b 81 367 81 347 81 357 b 115 468 81 408 92 439 b 298 651 167 534 242 576 z m 297 370 b 310 377 301 374 305 377 b 321 361 314 377 317 373 b 328 320 325 347 328 333 b 266 212 328 275 302 239 b 75 48 202 161 135 112 b 117 194 76 107 81 157 b 297 370 174 255 236 311 z m 285 48 b 294 16 291 36 294 26 b 288 -7 294 9 292 1 b 228 -92 272 -37 255 -69 b 60 -233 173 -138 120 -184 b 285 48 78 -88 184 -23 z',\n },\n flag128thUp: {\n x_min: 0,\n x_max: 252,\n y_min: -804,\n y_max: 530,\n ha: 1334,\n o: 'm 298 -1158 b 328 -1126 312 -1158 320 -1139 b 330 -1116 330 -1123 330 -1119 b 347 -996 343 -1076 347 -1037 b 328 -837 347 -943 338 -890 b 320 -778 324 -816 320 -798 b 330 -733 320 -763 323 -749 b 340 -665 338 -714 337 -688 b 341 -645 340 -660 341 -652 b 333 -534 341 -609 333 -572 b 343 -471 333 -513 334 -492 b 361 -366 356 -436 361 -402 b 331 -202 361 -311 348 -256 b 328 -187 330 -197 328 -193 b 331 -179 328 -184 328 -181 b 363 -55 353 -137 363 -96 b 337 79 363 -12 351 33 b 327 114 333 92 327 104 b 344 144 327 124 331 132 b 359 174 353 150 357 163 b 361 228 360 193 361 210 b 243 517 361 337 325 435 b 147 596 213 546 179 569 b 75 708 111 626 75 655 b 62 744 75 723 68 733 b 50 763 58 752 58 763 b 46 762 49 763 48 762 b 17 742 36 757 22 757 b 0 697 14 726 0 711 b 1 595 0 662 3 631 b 0 469 0 552 0 511 b 1 429 0 456 0 442 b 22 289 6 382 22 337 b 24 128 22 238 24 184 b 22 66 24 108 23 86 b 19 -19 20 37 19 10 b 20 -132 19 -56 20 -95 b 13 -276 20 -180 19 -229 b 9 -359 10 -304 9 -330 b 12 -487 9 -402 12 -445 b 56 -582 12 -526 29 -554 b 197 -742 107 -632 160 -681 b 288 -1100 265 -851 276 -976 b 288 -1122 288 -1107 287 -1115 b 287 -1145 289 -1129 287 -1138 b 298 -1158 287 -1153 288 -1158 z m 304 150 b 75 475 229 256 112 334 b 304 150 233 357 305 287 z m 271 -73 b 127 72 233 -14 179 26 b 81 167 96 98 81 127 b 84 194 81 176 82 184 b 271 -73 148 102 242 39 z m 279 -396 b 132 -223 233 -330 180 -279 b 81 -112 104 -192 81 -156 b 82 -91 81 -105 81 -98 b 279 -396 167 -125 269 -281 z m 249 -609 b 69 -357 197 -520 88 -471 b 249 -609 131 -441 229 -498 z',\n },\n flag128thDown: {\n x_min: -0.8888888888888888,\n x_max: 252,\n y_min: -580,\n y_max: 754,\n ha: 1334,\n o: 'm 298 1086 b 287 1073 288 1086 287 1081 b 288 1050 287 1066 289 1057 b 288 1028 287 1043 288 1035 b 197 670 276 904 265 779 b 56 510 160 609 107 560 b 12 415 29 482 12 454 b 9 287 12 373 9 330 b 13 204 9 258 10 232 b 20 60 19 157 20 108 b 19 -53 20 23 19 -16 b 22 -138 19 -82 20 -109 b 24 -200 23 -158 24 -180 b 22 -361 24 -256 22 -310 b 1 -501 22 -409 6 -454 b 0 -541 0 -514 0 -528 b 0 -667 0 -583 -3 -624 b 0 -809 0 -675 -3 -791 b 46 -834 4 -825 36 -829 b 50 -835 48 -834 49 -835 b 62 -816 58 -835 58 -824 b 75 -780 68 -805 75 -795 b 147 -668 75 -727 111 -698 b 243 -589 179 -641 213 -618 b 361 -300 325 -507 361 -409 b 359 -246 361 -282 360 -265 b 344 -216 357 -235 353 -222 b 327 -186 331 -204 327 -196 b 337 -151 327 -176 333 -164 b 363 -17 351 -105 363 -60 b 331 107 363 24 353 65 b 328 115 328 109 328 112 b 331 130 328 121 330 125 b 361 294 348 184 361 239 b 343 399 361 330 356 364 b 333 462 334 420 333 441 b 341 573 333 500 341 537 b 340 593 341 580 340 588 b 330 661 337 616 338 642 b 320 706 323 677 320 691 b 328 765 320 726 324 744 b 347 924 338 818 347 871 b 330 1044 347 965 343 1004 b 328 1054 330 1047 330 1051 b 298 1086 320 1067 312 1086 z m 249 537 b 69 285 229 426 131 369 b 249 537 88 399 197 448 z m 279 324 b 82 19 269 209 167 53 b 81 40 81 26 81 33 b 132 151 81 84 104 120 b 279 324 180 207 233 258 z m 271 1 b 84 -266 242 -111 148 -174 b 81 -239 82 -256 81 -248 b 127 -144 81 -199 96 -170 b 271 1 179 -98 233 -58 z m 304 -222 b 75 -547 305 -359 233 -429 b 304 -222 112 -406 229 -328 z',\n },\n accidentalFlat: {\n x_min: 1,\n x_max: 209,\n y_min: -208,\n y_max: 472,\n ha: 680,\n o: 'm 29 -300 b 46 -289 33 -300 39 -297 b 107 -243 65 -274 86 -258 b 301 127 233 -153 301 -30 b 298 186 301 147 301 166 b 190 297 291 256 251 297 b 147 289 177 297 163 294 b 86 265 127 284 107 274 l 85 264 l 85 301 b 91 465 85 356 88 410 b 94 559 91 497 94 527 b 84 651 94 589 91 621 b 66 680 81 661 81 680 l 65 680 b 37 645 49 678 37 665 b 33 523 36 605 32 563 l 33 478 b 26 223 33 393 29 308 b 1 -141 22 101 1 -19 b 17 -287 1 -189 4 -239 b 29 -300 20 -295 23 -300 z m 68 -105 b 76 12 71 -68 72 -29 b 81 107 79 43 81 75 l 86 109 b 171 135 114 121 141 135 b 204 128 181 135 193 132 b 238 92 228 120 239 108 b 230 63 238 84 236 75 b 68 -105 193 -10 132 -59 z',\n },\n accidentalNatural: {\n x_min: 0,\n x_max: 213.5,\n y_min: -456,\n y_max: 462,\n ha: 918,\n o: 'm 255 -657 b 281 -624 271 -657 275 -636 b 285 -599 282 -615 285 -608 b 292 -300 288 -500 289 -400 b 289 -161 292 -253 289 -207 b 300 128 292 -65 297 32 b 304 168 300 128 302 150 l 304 173 l 305 190 l 305 199 l 307 225 b 304 259 307 229 310 246 b 272 298 297 274 302 305 b 63 266 204 279 134 272 b 72 514 68 348 72 432 b 71 595 72 541 72 567 b 56 665 71 619 66 642 b 17 579 9 651 17 608 b 3 144 19 433 7 289 b 0 -7 1 94 0 43 b 3 -134 0 -50 1 -92 b 7 -219 3 -163 7 -192 b 35 -251 7 -243 17 -251 b 49 -249 39 -251 43 -251 l 223 -223 l 230 -222 l 230 -359 b 223 -516 230 -410 223 -464 b 236 -619 223 -550 226 -585 b 255 -657 240 -634 236 -657 z m 58 -63 b 55 81 56 -14 53 33 l 56 99 b 85 99 65 99 75 98 b 232 108 134 104 183 107 l 240 109 l 236 66 b 232 -48 235 29 232 -10 b 58 -81 174 -63 115 -73 z',\n },\n accidentalSharp: {\n x_min: -22,\n x_max: 390,\n y_min: -384,\n y_max: 383,\n ha: 767,\n o: 'm 202 -553 b 219 -526 213 -552 216 -536 b 226 -471 225 -507 226 -488 b 225 -425 226 -455 225 -441 b 226 -392 225 -415 225 -402 b 233 -305 229 -363 232 -334 l 297 -292 b 331 -469 300 -353 311 -412 b 347 -485 333 -477 338 -485 b 363 -469 356 -487 359 -477 b 374 -418 373 -454 374 -435 b 376 -382 376 -405 376 -393 b 372 -276 376 -347 373 -311 l 455 -259 b 550 -156 534 -243 544 -232 b 550 -109 550 -137 552 -124 b 526 -78 549 -91 541 -78 l 523 -78 b 507 -79 517 -78 513 -78 b 403 -101 474 -88 438 -95 l 379 -105 b 382 -42 380 -85 380 -63 b 384 96 383 4 384 50 b 503 131 425 107 464 118 b 549 173 524 138 543 150 b 562 249 554 199 562 223 b 554 294 562 264 560 279 b 536 315 549 308 544 315 l 533 315 b 517 312 528 315 523 315 b 382 266 472 294 428 279 l 377 344 b 359 531 374 406 372 469 b 348 552 356 539 357 552 l 347 552 l 343 552 b 315 528 331 549 317 544 l 315 501 b 320 249 315 416 318 333 l 243 232 b 239 361 243 275 242 318 b 226 425 238 383 238 403 b 199 359 194 409 199 382 b 193 223 196 312 194 268 b 72 202 153 215 112 209 b 4 118 13 192 4 183 b 10 66 0 102 12 84 b 33 29 7 39 14 30 b 48 32 37 29 42 30 b 187 55 95 39 141 46 l 183 -75 b 176 -145 181 -99 179 -122 b 16 -179 122 -156 69 -166 b -32 -232 -14 -186 -32 -197 b -17 -331 -32 -266 -19 -298 b -1 -356 -17 -347 -13 -354 b 12 -353 1 -356 6 -354 b 167 -320 63 -341 115 -331 b 166 -377 166 -338 166 -357 b 189 -526 166 -428 171 -477 b 202 -553 192 -536 189 -553 z m 240 -132 b 243 -37 242 -101 242 -69 b 245 65 245 -3 245 30 b 315 79 269 69 292 73 b 301 -120 308 13 305 -53 z',\n },\n accidentalDoubleSharp: {\n x_min: 0,\n x_max: 287,\n y_min: -159,\n y_max: 159,\n ha: 318,\n o: 'm 84 -229 b 107 -216 91 -229 98 -225 b 200 -125 138 -186 167 -154 b 232 -95 212 -115 222 -105 b 347 -189 271 -125 310 -157 b 370 -200 356 -196 363 -200 b 396 -179 380 -200 389 -192 b 412 -102 410 -154 406 -125 b 377 -27 410 -69 400 -46 l 325 14 b 402 91 350 42 374 68 b 413 127 410 96 413 107 b 382 200 409 148 397 176 b 350 229 370 220 360 229 b 314 210 340 229 328 223 b 274 174 300 199 285 187 b 212 104 252 151 232 128 b 92 187 173 132 132 161 b 78 193 86 192 82 193 b 68 190 75 193 72 193 b 48 179 62 186 53 187 b 40 137 43 168 40 154 b 81 16 40 92 56 32 b 107 -3 89 10 98 4 b 14 -94 76 -32 45 -62 b 0 -124 6 -102 0 -114 b 12 -154 0 -134 3 -144 b 62 -215 26 -176 48 -193 b 84 -229 69 -225 76 -229 z',\n },\n accidentalDoubleFlat: {\n x_min: 0,\n x_max: 359,\n y_min: -220,\n y_max: 446,\n ha: 666,\n o: 'm 43 -317 b 72 -301 55 -317 63 -310 b 160 -186 108 -268 134 -226 b 236 -60 186 -145 212 -102 b 233 -131 235 -85 233 -108 b 239 -220 233 -161 235 -190 b 259 -246 240 -233 239 -240 b 301 -228 284 -252 291 -238 b 465 -7 369 -163 416 -85 b 517 173 500 48 517 108 b 451 307 517 229 505 284 b 409 315 436 312 422 315 b 331 287 382 315 356 305 b 311 274 324 282 320 274 l 310 274 l 310 566 b 305 621 310 585 312 603 b 294 642 301 628 305 642 l 292 642 b 264 622 282 641 266 636 b 253 575 259 606 256 590 b 246 418 248 523 246 471 b 248 243 246 360 248 302 l 248 187 b 164 238 220 225 193 238 b 85 213 140 238 112 226 b 84 229 85 220 84 225 b 86 315 85 258 86 287 b 81 528 86 386 82 458 b 71 582 81 547 78 566 b 56 603 66 590 68 603 l 53 603 b 23 580 40 600 26 598 b 19 537 20 566 19 552 b 20 514 19 530 19 521 b 26 390 24 472 26 432 b 14 66 26 282 16 174 b 0 -168 13 -12 0 -91 b 12 -279 0 -206 3 -242 b 30 -314 16 -294 14 -308 b 43 -317 35 -317 39 -317 z m 301 -72 b 302 7 302 -45 302 -19 l 302 86 b 351 158 304 121 321 145 b 383 166 361 163 373 166 b 435 143 402 166 419 157 b 445 127 441 138 445 132 b 441 114 445 122 444 118 b 301 -72 397 49 354 -14 z m 75 -147 b 73 30 75 -86 75 -29 b 118 82 73 62 92 76 b 132 84 124 84 128 84 b 190 52 156 84 174 69 b 193 40 192 49 193 45 b 192 33 193 37 193 35 b 75 -147 157 -30 125 -95 z',\n },\n accidentalParensLeft: {\n x_min: 0,\n x_max: 130.18934911242604,\n y_min: -270,\n y_max: 267.6082500723851,\n ha: 537.6082500723851,\n o: 'm 107 -389 b 127 -374 114 -389 120 -384 b 141 -347 132 -367 137 -357 b 151 -294 148 -330 151 -311 b 122 -207 151 -265 141 -236 b 63 -65 94 -164 72 -117 b 59 -10 60 -46 59 -27 b 145 223 59 78 94 153 b 187 354 176 262 189 305 b 177 384 187 364 190 380 b 143 373 166 387 153 383 b 124 354 137 367 130 361 b 0 -35 33 240 0 108 l 0 -92 b 85 -372 4 -193 27 -287 b 107 -389 92 -383 99 -389 z',\n },\n accidentalParensRight: {\n x_min: -0.4444444444444445,\n x_max: 139,\n y_min: -275,\n y_max: 277,\n ha: 552,\n o: 'm 58 -396 b 96 -354 75 -396 85 -370 b 200 13 168 -238 200 -111 b 153 268 200 109 184 190 b 49 392 131 320 101 364 b 26 399 40 397 33 399 b 0 366 10 399 0 387 b 0 318 -1 350 0 334 l 0 291 b 27 238 -3 266 7 253 b 143 9 105 180 143 98 b 141 -20 143 -1 143 -10 b 63 -225 135 -92 108 -164 b 36 -307 45 -251 36 -278 b 40 -344 36 -320 37 -331 b 42 -356 42 -347 42 -351 b 58 -396 42 -374 37 -396 z',\n },\n accidentalQuarterToneFlatStein: {\n x_min: 0,\n x_max: 208,\n y_min: -240,\n y_max: 440,\n ha: 680,\n o: 'm 272 -346 b 284 -333 278 -346 281 -341 b 300 -187 297 -285 300 -235 b 275 177 300 -65 279 55 b 268 432 272 262 268 347 l 268 477 b 264 599 269 517 265 559 b 236 634 264 619 252 632 l 235 634 b 217 605 220 634 220 615 b 207 513 210 575 207 543 b 210 419 207 481 210 451 b 216 255 213 364 216 310 l 216 217 l 215 219 b 154 243 194 228 174 238 b 111 251 138 248 124 251 b 3 140 50 251 10 210 b 0 81 0 120 0 101 b 194 -289 0 -76 68 -199 b 255 -336 215 -304 236 -320 b 272 -346 262 -343 268 -346 z m 233 -151 b 71 17 168 -105 108 -56 b 63 46 65 29 63 37 b 96 82 62 62 73 73 b 130 89 108 86 120 89 b 215 63 160 89 187 75 l 220 60 b 225 -35 220 29 222 -3 b 233 -151 229 -75 230 -114 z',\n },\n accidentalThreeQuarterTonesFlatZimmermann: {\n x_min: 0,\n x_max: 422,\n y_min: -240,\n y_max: 440,\n ha: 680,\n o: 'm 272 -346 b 284 -333 278 -346 281 -341 b 300 -187 297 -285 300 -235 b 275 177 300 -65 279 55 b 268 432 272 262 268 347 l 268 477 b 264 599 269 517 265 559 b 236 634 264 619 252 632 l 235 634 b 217 605 220 634 220 615 b 207 513 210 575 207 543 b 210 419 207 481 210 451 b 216 255 213 364 216 310 l 216 217 l 215 219 b 154 243 194 228 174 238 b 111 251 138 248 124 251 b 3 140 50 251 10 210 b 0 81 0 120 0 101 b 194 -289 0 -76 68 -199 b 255 -336 215 -304 236 -320 b 272 -346 262 -343 268 -346 z m 336 -346 b 353 -336 340 -346 346 -343 b 413 -289 372 -320 393 -304 b 608 81 540 -199 608 -76 b 605 140 608 101 608 120 b 497 251 598 210 557 251 b 454 243 484 251 469 248 b 393 219 433 238 413 228 l 392 217 l 392 255 b 397 419 392 310 395 364 b 400 513 397 451 400 481 b 390 605 400 543 397 575 b 373 634 387 615 387 634 l 372 634 b 344 599 356 632 344 619 b 340 477 343 559 338 517 l 340 432 b 333 177 340 347 336 262 b 308 -187 328 55 308 -65 b 324 -333 308 -235 311 -285 b 336 -346 327 -341 330 -346 z m 233 -151 b 71 17 168 -105 108 -56 b 63 46 65 29 63 37 b 96 82 62 62 73 73 b 130 89 108 86 120 89 b 215 63 160 89 187 75 l 220 60 b 225 -35 220 29 222 -3 b 233 -151 229 -75 230 -114 z m 374 -151 b 383 -35 377 -114 379 -75 b 387 60 386 -3 387 29 l 393 63 b 478 89 420 75 448 89 b 511 82 488 89 500 86 b 544 46 534 73 546 62 b 537 17 544 37 543 29 b 374 -151 500 -56 439 -105 z',\n },\n accidentalQuarterToneSharpStein: {\n x_min: 0,\n x_max: 300,\n y_min: -338,\n y_max: 351,\n ha: 689,\n o: 'm 194 -487 b 225 -432 215 -469 223 -452 b 238 -232 229 -366 236 -298 b 377 -199 285 -220 331 -209 b 418 -164 397 -193 410 -181 b 432 -88 428 -138 432 -114 b 412 -42 432 -55 428 -42 b 389 -46 406 -42 399 -43 l 235 -85 b 233 -20 235 -63 233 -42 b 233 105 232 22 233 63 b 312 121 259 111 285 117 b 406 226 390 134 400 145 b 373 284 409 268 402 284 b 344 281 364 284 356 282 b 232 258 307 276 269 266 b 230 308 232 275 232 291 b 210 505 229 374 232 441 b 183 471 189 501 184 490 b 180 406 181 449 180 428 b 184 246 180 353 184 300 b 48 222 140 236 94 228 b 0 168 6 216 0 209 b 7 86 1 141 4 114 b 27 66 9 73 13 66 l 35 66 b 184 94 85 66 135 84 b 187 -1 184 62 186 30 b 190 -96 189 -33 190 -65 l 112 -114 b 35 -213 27 -132 35 -132 b 33 -253 35 -226 35 -240 b 49 -276 33 -269 37 -276 b 62 -275 52 -276 56 -276 l 186 -245 l 186 -256 b 179 -387 180 -300 177 -343 b 194 -487 180 -419 179 -454 z',\n },\n accidentalThreeQuarterTonesSharpStein: {\n x_min: -23,\n x_max: 388,\n y_min: -373,\n y_max: 445,\n ha: 818,\n o: 'm 114 -537 b 138 -475 137 -518 138 -495 b 147 -292 138 -413 144 -353 b 212 -278 168 -287 190 -282 b 243 -444 215 -333 225 -389 b 261 -467 248 -454 251 -465 b 281 -446 272 -469 276 -455 b 292 -347 292 -416 288 -384 b 288 -262 289 -320 288 -291 l 374 -245 b 376 -311 374 -266 374 -288 b 390 -456 379 -357 379 -405 b 416 -396 412 -436 415 -418 b 423 -287 420 -360 423 -323 b 422 -235 423 -269 423 -252 b 451 -229 432 -233 441 -232 b 547 -98 524 -215 547 -199 l 547 -89 b 521 -49 546 -59 540 -49 b 497 -52 516 -49 507 -49 b 418 -68 469 -56 444 -63 b 423 52 419 -29 422 12 b 426 140 425 81 425 109 b 495 160 449 145 472 153 b 552 219 526 170 546 189 b 559 279 557 240 553 262 b 530 341 559 324 552 341 b 490 331 520 341 507 338 b 432 311 471 324 452 318 b 449 552 436 392 442 471 b 452 588 451 563 452 575 b 446 622 452 599 451 611 b 436 641 444 629 448 641 b 418 628 428 641 420 636 b 409 602 413 621 410 611 b 386 297 396 501 390 399 b 297 274 356 288 327 281 b 291 403 295 317 294 360 b 274 550 288 452 284 501 b 259 569 271 564 265 569 b 240 559 253 569 248 563 b 230 537 232 554 230 546 l 230 488 b 233 369 230 448 232 409 b 236 261 236 333 238 297 b 156 245 210 255 183 251 b 154 396 154 295 154 346 b 150 416 154 403 153 410 b 140 438 145 423 150 438 l 138 438 b 118 413 128 436 118 428 b 112 354 118 393 114 374 b 109 238 109 315 109 276 b 49 226 89 233 69 230 b 3 163 16 222 3 202 b 7 91 3 138 9 114 b 29 62 7 69 13 62 b 39 63 32 62 35 63 b 104 73 60 66 82 71 b 101 -10 104 46 102 17 l 92 -132 l 10 -150 b -33 -204 -19 -157 -33 -170 b -19 -310 -32 -240 -19 -274 b -6 -324 -19 -321 -13 -324 b 6 -323 -1 -324 1 -324 b 82 -307 32 -317 58 -311 b 81 -376 82 -330 81 -353 b 114 -537 81 -431 94 -484 z m 294 -92 b 297 -37 295 -73 295 -56 b 300 49 300 -9 300 20 l 300 108 b 379 127 325 114 353 120 b 374 -76 376 59 374 -9 b 294 -92 347 -82 320 -86 z m 154 -120 b 157 20 154 -73 156 -26 b 158 82 158 40 158 62 b 230 95 183 86 206 89 b 225 0 229 63 226 32 b 217 -107 223 -35 220 -71 z',\n },\n accidentalBuyukMucennebFlat: {\n x_min: 1.8692317181955784,\n x_max: 287,\n y_min: -248,\n y_max: 432.4720949426819,\n ha: 680.4720949426819,\n o: 'm 410 128 b 302 239 403 199 363 239 b 259 232 289 239 275 236 b 199 207 239 226 219 216 l 197 206 l 197 243 l 197 251 b 347 317 248 272 298 295 b 376 347 360 324 372 334 b 389 435 387 376 393 405 b 348 454 384 462 377 465 b 202 387 300 432 251 409 b 203 408 203 395 203 402 l 203 431 b 347 490 252 451 300 469 b 376 517 360 495 372 505 b 389 599 387 546 393 572 b 348 616 384 625 377 628 l 203 556 b 196 593 202 569 199 582 b 179 622 193 603 193 622 l 177 622 b 150 588 161 621 150 608 b 147 533 150 570 148 552 b 29 488 108 517 69 503 b 3 455 12 482 3 472 b 12 353 1 422 9 389 b 145 408 56 372 101 389 b 145 363 145 392 145 377 l 29 315 b 3 281 12 310 3 298 b 12 170 1 245 9 209 l 141 226 b 138 166 140 206 138 186 b 114 -199 134 43 115 -76 b 130 -344 114 -246 117 -297 b 141 -357 132 -353 135 -357 b 158 -347 145 -357 151 -354 b 219 -301 177 -331 199 -315 b 413 69 346 -210 413 -88 b 410 128 413 89 413 108 z m 350 35 b 343 6 350 26 348 17 b 180 -163 308 -69 245 -117 b 189 -46 183 -125 184 -86 b 193 49 192 -14 193 17 l 199 52 b 284 78 226 63 253 78 b 317 71 294 78 305 75 b 350 35 340 62 351 50 z',\n },\n accidentalBakiyeFlat: {\n x_min: 1.8692317181955784,\n x_max: 287,\n y_min: -236,\n y_max: 444,\n ha: 680,\n o: 'm 141 -340 b 158 -330 145 -340 151 -337 b 219 -284 177 -314 199 -298 b 413 86 346 -193 413 -71 b 410 145 413 107 413 125 b 302 256 403 216 363 256 b 259 249 289 256 275 253 b 199 225 239 243 219 233 l 197 223 l 197 261 b 199 334 197 285 199 310 b 347 406 249 357 298 382 b 376 439 360 413 372 425 b 390 516 384 465 390 490 b 389 537 390 523 390 530 b 372 564 384 556 382 564 b 348 557 367 564 359 562 b 204 487 300 537 253 510 b 206 518 206 497 206 507 b 196 611 206 549 203 580 b 179 639 193 621 193 639 l 177 639 b 150 605 161 638 150 625 b 145 482 148 564 144 523 l 145 458 b 29 405 107 439 68 420 b 3 366 12 397 3 386 b 12 243 1 325 9 287 b 143 307 56 265 99 285 l 138 183 b 114 -181 134 60 114 -59 b 130 -327 114 -229 117 -279 b 141 -340 132 -336 135 -340 z m 180 -145 b 189 -29 183 -108 184 -69 b 193 66 192 3 193 35 l 199 69 b 284 95 226 81 253 95 b 317 88 294 95 305 92 b 350 52 340 79 351 68 b 343 23 350 43 348 35 b 180 -145 305 -50 245 -99 z',\n },\n accidentalKomaSharp: {\n x_min: 0,\n x_max: 300,\n y_min: -338,\n y_max: 351,\n ha: 689,\n o: 'm 194 -487 b 225 -432 215 -469 223 -452 b 238 -232 229 -366 236 -298 b 377 -199 285 -220 331 -209 b 418 -164 397 -193 410 -181 b 432 -88 428 -138 432 -114 b 412 -42 432 -55 428 -42 b 389 -46 406 -42 399 -43 l 235 -85 b 233 -20 235 -63 233 -42 b 233 105 232 22 233 63 b 312 121 259 111 285 117 b 406 226 390 134 400 145 b 373 284 409 268 402 284 b 344 281 364 284 356 282 b 232 258 307 276 269 266 b 230 308 232 275 232 291 b 210 505 229 374 232 441 b 183 471 189 501 184 490 b 180 406 181 449 180 428 b 184 246 180 353 184 300 b 48 222 140 236 94 228 b 0 168 6 216 0 209 b 7 86 1 141 4 114 b 27 66 9 73 13 66 l 35 66 b 184 94 85 66 135 84 b 187 -1 184 62 186 30 b 190 -96 189 -33 190 -65 l 112 -114 b 35 -213 27 -132 35 -132 b 33 -253 35 -226 35 -240 b 49 -276 33 -269 37 -276 b 62 -275 52 -276 56 -276 l 186 -245 l 186 -256 b 179 -387 180 -300 177 -343 b 194 -487 180 -419 179 -454 z',\n },\n accidentalKucukMucennebSharp: {\n x_min: -0.15206251809627475,\n x_max: 359,\n y_min: -420,\n y_max: 343,\n ha: 763,\n o: 'm 236 -605 b 262 -543 256 -583 261 -564 b 269 -423 268 -503 269 -464 b 266 -340 269 -396 268 -367 l 361 -318 b 405 -276 384 -312 399 -298 b 413 -189 412 -248 416 -219 b 395 -164 412 -171 409 -164 b 382 -166 392 -164 387 -164 b 264 -193 343 -176 304 -184 b 269 -102 265 -163 268 -132 b 454 -62 331 -89 392 -78 b 501 -23 477 -58 494 -45 b 517 62 511 6 517 33 b 487 112 517 95 513 112 b 471 111 482 112 477 112 b 274 66 406 95 340 81 b 276 138 275 91 276 114 b 350 154 301 144 325 148 b 402 203 377 160 396 176 b 412 284 408 230 412 258 b 392 311 412 302 406 311 b 372 308 386 311 379 310 b 287 291 343 301 314 297 l 295 405 b 298 441 297 416 298 428 b 292 475 298 452 297 464 b 282 494 289 482 294 494 b 264 481 274 494 266 490 b 255 455 259 474 256 464 b 239 282 248 397 243 340 b 148 268 209 278 179 274 b 62 164 62 252 62 253 l 62 132 b 79 108 60 117 65 108 l 86 108 l 230 130 b 229 92 230 118 229 105 b 228 56 228 79 228 68 b 66 20 173 43 120 32 b 0 -59 6 7 3 1 l 0 -138 b 14 -160 -1 -156 4 -160 b 27 -158 19 -160 23 -160 b 222 -112 92 -141 157 -127 b 220 -203 220 -143 220 -173 b 147 -217 196 -207 171 -213 b 89 -288 92 -228 89 -229 b 95 -347 85 -305 96 -325 b 112 -374 92 -366 98 -374 b 125 -373 117 -374 121 -374 l 220 -351 b 222 -458 220 -386 220 -422 b 236 -605 223 -504 225 -552 z',\n },\n accidentalKoron: {\n x_min: 0,\n x_max: 303,\n y_min: -462.4598053473055,\n y_max: 180,\n ha: 642.4598053473055,\n o: 'm 59 -665 b 72 -649 69 -662 72 -657 b 69 -626 72 -642 69 -634 b 69 -622 69 -625 69 -624 l 69 -600 b 55 -156 60 -456 68 -311 b 86 -170 66 -166 76 -170 b 112 -163 95 -170 104 -166 b 390 -35 204 -120 298 -78 b 436 -1 409 -27 436 -27 b 396 46 436 22 413 33 l 382 55 b 46 243 271 121 157 179 b 12 259 29 253 17 259 b 0 219 1 259 0 248 b 3 -372 0 22 3 -176 b 6 -616 3 -454 6 -536 b 59 -665 6 -638 40 -671 z m 55 199 b 363 24 156 141 258 84 b 55 -118 259 -24 160 -69 z',\n },\n accidentalSori: {\n x_min: 0,\n x_max: 434,\n y_min: -295,\n y_max: 325,\n ha: 620,\n o: 'm 194 -425 b 196 -409 194 -418 196 -413 b 194 -194 196 -337 196 -266 b 364 -127 251 -171 308 -150 b 361 -321 363 -192 364 -256 b 410 -387 360 -357 373 -377 b 413 -373 412 -382 413 -377 b 418 -114 418 -287 418 -200 l 418 -105 b 595 -35 477 -82 536 -59 b 625 0 612 -27 625 -22 b 593 48 624 23 618 39 l 419 117 b 423 370 419 202 423 285 b 426 403 423 382 426 393 b 418 436 426 415 425 426 b 384 468 409 449 399 468 b 369 448 370 468 369 459 b 369 436 369 444 369 441 l 369 428 l 369 423 b 367 138 369 328 367 233 l 353 143 l 192 207 l 192 367 b 173 406 192 383 184 396 b 151 422 167 413 160 422 b 144 420 148 422 147 422 b 137 403 138 416 137 410 l 137 392 l 137 229 b 33 271 102 243 68 256 b 13 276 26 274 19 276 b 0 262 6 276 0 272 b 35 199 1 239 0 212 l 138 160 b 140 -148 138 58 138 -45 b 56 -181 111 -158 84 -170 b 24 -215 35 -189 24 -199 b 29 -235 24 -220 26 -228 b 49 -253 35 -249 42 -253 b 78 -240 59 -253 69 -243 b 140 -216 98 -233 120 -225 l 140 -356 b 194 -425 140 -406 141 -406 z m 194 -125 b 193 138 194 -37 193 50 b 315 89 233 122 275 107 b 366 71 333 84 350 76 b 364 -58 366 27 366 -16 b 194 -125 308 -81 251 -104 z m 419 49 l 526 7 l 485 -10 l 419 -36 z',\n },\n articAccentAbove: {\n x_min: 0,\n x_max: 425,\n y_min: 0,\n y_max: 326,\n ha: 326,\n o: 'm 27 1 b 78 12 46 0 62 6 b 347 112 168 45 253 91 b 521 184 409 128 459 167 b 608 259 557 194 589 220 b 612 274 611 265 612 271 b 598 292 612 281 608 287 b 477 347 559 312 518 331 b 176 465 374 384 275 425 b 156 469 168 468 161 469 b 125 456 145 469 137 465 b 53 370 96 432 78 399 b 45 353 48 363 45 357 b 68 333 45 344 52 337 b 360 225 166 298 262 261 b 192 154 302 203 249 171 b 13 36 120 132 53 105 b 0 13 9 29 0 22 l 0 9 b 16 0 3 1 10 0 l 26 0 b 27 1 27 0 27 0 z',\n },\n articAccentBelow: {\n x_min: 0,\n x_max: 425,\n y_min: -326,\n y_max: 0,\n ha: 326,\n o: 'm 26 -469 l 27 -469 b 78 -458 46 -469 62 -464 b 347 -357 168 -426 253 -380 b 521 -285 409 -341 459 -302 b 608 -210 557 -276 589 -249 b 612 -196 611 -204 612 -200 b 598 -179 612 -189 608 -183 b 477 -122 559 -157 518 -138 b 176 -4 374 -85 275 -45 b 156 0 168 -1 161 0 b 125 -13 145 0 137 -4 b 53 -99 96 -37 78 -71 b 45 -117 48 -107 45 -112 b 68 -137 45 -125 52 -132 b 360 -245 166 -171 262 -209 b 192 -315 302 -266 249 -300 b 13 -433 120 -337 53 -366 b 0 -456 9 -442 0 -448 l 0 -461 b 16 -469 3 -468 10 -469 z',\n },\n articTenutoAbove: {\n x_min: 0.35192668236256364,\n x_max: 471.1238660564107,\n y_min: 0,\n y_max: 56,\n ha: 56,\n o: 'm 137 0 b 197 1 156 0 179 1 b 409 6 268 1 338 6 b 482 4 432 6 459 6 b 556 0 508 3 534 0 b 651 10 588 0 621 3 b 678 27 662 12 678 10 b 654 59 680 45 672 53 b 511 75 606 73 560 73 b 255 81 426 78 341 81 b 160 79 222 81 193 79 l 36 79 b 1 71 24 78 7 85 b 19 32 -3 56 9 43 b 45 16 26 24 36 20 b 137 0 76 3 108 0 z',\n },\n articTenutoBelow: {\n x_min: 0.35192668236256364,\n x_max: 471.1238660564107,\n y_min: -59,\n y_max: -3,\n ha: 56,\n o: 'm 137 -85 b 197 -84 156 -85 179 -84 b 409 -79 268 -84 338 -79 b 482 -81 432 -79 459 -79 b 556 -85 508 -82 534 -85 b 651 -75 588 -85 621 -82 b 678 -58 662 -73 678 -75 b 654 -26 680 -40 672 -32 b 511 -10 606 -12 560 -12 b 255 -4 426 -7 341 -4 b 160 -6 222 -4 193 -6 l 36 -6 b 1 -14 24 -7 7 0 b 19 -53 -3 -29 9 -42 b 45 -69 26 -60 36 -65 b 137 -85 76 -82 108 -85 z',\n },\n articStaccatoAbove: {\n x_min: 1.4151102965496913,\n x_max: 112,\n y_min: 0,\n y_max: 156,\n ha: 156,\n o: 'm 98 0 b 132 23 109 0 122 7 b 161 112 150 50 161 79 b 158 148 161 124 161 137 b 125 186 154 167 131 167 b 63 225 117 215 85 216 b 23 197 45 222 30 219 b 3 91 12 163 12 127 b 19 66 0 79 4 69 b 65 27 40 62 53 46 b 98 0 76 9 88 0 z',\n },\n articStaccatoBelow: {\n x_min: 1.4151102965496913,\n x_max: 112.08403222864916,\n y_min: -156,\n y_max: 0,\n ha: 156,\n o: 'm 132 -202 b 161 -112 151 -174 163 -145 b 158 -76 161 -101 161 -88 b 125 -39 153 -58 131 -58 b 63 0 115 -10 85 -9 b 23 -27 45 -3 30 -6 b 3 -134 12 -62 10 -98 b 19 -158 0 -145 4 -156 b 65 -197 40 -164 53 -179 b 98 -225 75 -216 88 -225 b 132 -202 109 -225 122 -217 z',\n },\n articStaccatissimoAbove: {\n x_min: 0,\n x_max: 139,\n y_min: 0,\n y_max: 411,\n ha: 411,\n o: 'm 104 0 b 144 115 143 29 138 75 b 197 423 158 217 180 320 b 200 454 199 433 200 444 b 181 540 200 482 193 513 b 112 592 167 573 141 592 b 55 567 92 592 72 585 b 0 490 32 546 3 527 l 0 484 b 27 279 14 416 14 347 b 84 20 43 193 52 104 b 96 0 86 13 92 6 z',\n },\n articStaccatissimoBelow: {\n x_min: 0,\n x_max: 139,\n y_min: -411,\n y_max: 0,\n ha: 411,\n o: 'm 88 -592 b 145 -567 108 -592 128 -585 b 200 -490 168 -546 197 -527 l 200 -484 b 173 -279 186 -416 186 -347 b 117 -20 157 -193 148 -104 b 104 0 114 -13 108 -6 l 96 0 b 56 -115 58 -29 62 -75 b 3 -423 42 -217 20 -320 b 0 -454 1 -433 0 -444 b 19 -540 0 -482 7 -513 b 88 -592 33 -573 59 -592 z',\n },\n articMarcatoAbove: {\n x_min: 0.04121419527862119,\n x_max: 396,\n y_min: 0,\n y_max: 328.0000000000001,\n ha: 328.0000000000001,\n o: 'm 477 0 b 510 13 488 0 500 6 b 570 124 546 40 563 81 b 547 183 570 147 560 166 b 356 422 487 265 405 330 b 346 442 354 429 350 436 l 346 444 b 318 465 340 456 330 464 l 312 469 b 274 449 294 480 284 461 b 242 413 262 438 253 425 b 56 196 177 343 112 274 b 1 56 26 154 13 105 b 27 20 -4 35 9 20 b 42 23 32 20 37 20 b 84 53 59 29 72 39 b 255 269 141 125 193 200 b 275 229 262 255 266 242 b 448 14 324 151 390 86 b 477 0 456 4 467 0 z',\n },\n articMarcatoBelow: {\n x_min: 0,\n x_max: 395.9587858047214,\n y_min: -328.0000000000001,\n y_max: 0,\n ha: 328.0000000000001,\n o: 'm 258 -469 b 297 -449 276 -480 287 -461 b 328 -413 308 -438 317 -425 b 514 -196 393 -343 458 -274 b 569 -56 544 -154 557 -105 b 543 -20 575 -35 562 -20 b 528 -23 539 -20 533 -20 b 487 -53 511 -29 498 -39 b 315 -269 429 -125 377 -200 b 295 -229 308 -255 304 -242 b 122 -14 246 -151 180 -86 b 94 0 114 -4 104 0 b 60 -13 82 0 71 -6 b 0 -124 24 -40 7 -81 b 23 -183 0 -147 10 -166 b 215 -422 84 -265 166 -330 b 225 -442 216 -429 220 -436 l 225 -444 b 252 -465 230 -456 240 -464 z',\n },\n fermataAbove: {\n x_min: -0.04550444040404433,\n x_max: 472,\n y_min: 2.015071727506986,\n y_max: 454,\n ha: 451.984928272493,\n o: 'm 39 10 b 78 108 66 37 71 73 b 163 311 92 181 111 252 b 284 423 199 353 239 392 b 373 458 312 444 340 454 b 433 431 395 458 410 446 b 603 153 530 361 596 276 b 595 121 603 144 595 131 l 595 88 b 602 50 596 75 589 55 b 639 73 619 43 631 60 b 651 102 645 82 648 92 b 667 194 660 132 662 163 b 680 278 671 222 672 248 b 560 567 680 386 638 481 b 396 654 508 625 452 649 b 291 632 364 654 325 644 b 161 526 235 613 200 566 b 4 249 85 446 26 357 b 4 174 0 222 -3 196 b 10 19 4 124 4 69 b 29 4 12 6 16 0 b 39 10 35 4 33 4 z m 338 37 b 370 40 350 36 357 36 b 380 75 387 40 380 43 b 389 94 382 79 382 85 b 356 132 389 111 374 122 b 269 154 328 147 300 156 b 225 125 252 154 228 157 b 261 48 222 81 232 56 b 338 37 287 40 312 40 z',\n },\n fermataBelow: {\n x_min: -0.310835055998654,\n x_max: 518.570567335755,\n y_min: -430,\n y_max: -0.9161449836506543,\n ha: 429.08385501634933,\n o: 'm 344 -615 b 500 -543 402 -602 452 -576 b 713 -253 605 -471 661 -364 b 746 -98 737 -204 750 -153 b 727 -59 744 -82 744 -59 b 688 -88 711 -59 694 -68 b 678 -109 687 -96 683 -102 b 562 -314 648 -183 611 -252 b 387 -439 516 -373 458 -416 b 328 -449 367 -446 347 -449 b 180 -386 274 -449 225 -423 b 69 -179 111 -330 69 -262 b 75 -121 69 -160 71 -141 b 84 -58 78 -101 84 -79 b 82 -39 84 -52 84 -45 b 68 -1 79 -26 82 -4 b 26 -32 49 0 33 -12 b 20 -52 24 -39 22 -45 b 0 -223 9 -107 -3 -161 b 141 -553 1 -348 27 -468 b 304 -619 192 -590 243 -619 b 344 -615 317 -619 330 -618 z m 415 -190 b 435 -157 429 -192 435 -184 b 308 -27 435 -86 379 -27 b 271 -46 287 -27 272 -35 b 269 -69 269 -55 269 -62 b 364 -183 269 -128 302 -170 z',\n },\n breathMarkComma: {\n x_min: 0,\n x_max: 148,\n y_min: 0,\n y_max: 275,\n ha: 275,\n o: 'm 120 0 b 187 78 156 20 174 48 b 213 209 206 121 213 164 b 206 294 213 238 210 265 b 140 390 200 337 171 367 b 122 396 134 395 128 396 b 68 382 105 396 85 384 b 46 379 60 382 53 382 b 0 328 12 369 0 357 b 1 311 0 323 1 317 b 30 210 4 275 22 243 b 66 167 39 179 46 167 b 94 171 73 167 82 168 b 143 180 109 174 124 180 b 160 179 148 180 154 180 b 120 66 124 145 120 107 b 120 0 120 45 121 23 z',\n },\n breathMarkUpbow: {\n x_min: 0,\n x_max: 254,\n y_min: 0,\n y_max: 595,\n ha: 595,\n o: 'm 233 0 b 256 48 251 14 253 30 b 272 183 264 92 265 138 b 311 455 289 274 295 364 b 350 716 327 541 341 628 b 366 815 354 749 366 782 b 359 857 366 829 363 842 b 327 815 334 852 330 832 b 302 674 315 769 310 721 b 248 357 288 567 269 462 b 225 226 240 314 242 268 b 210 251 212 232 213 243 b 69 721 163 408 117 564 b 32 835 58 760 53 801 b 20 851 29 841 27 851 b 14 850 19 851 16 851 b 0 828 6 847 0 838 l 0 825 b 12 765 1 804 7 785 b 194 125 73 552 132 338 b 233 0 206 84 213 42 z',\n },\n caesura: {\n x_min: 0,\n x_max: 565.5831864753837,\n y_min: -0.09016994374947417,\n y_max: 562.4481112129314,\n ha: 562.5382811566809,\n o: 'm 0 76 b 49 122 24 92 37 107 b 444 613 180 287 305 455 b 528 770 484 660 518 708 b 531 792 530 778 531 785 b 524 808 531 799 530 805 b 490 792 513 815 498 802 b 390 683 456 756 420 721 b 48 262 275 543 164 400 b 0 76 0 207 7 145 z m 226 1 b 248 13 238 -4 243 7 l 353 137 b 759 638 490 302 632 464 b 814 805 795 688 819 740 b 779 786 796 805 788 796 b 628 609 724 732 678 668 b 310 242 523 485 416 363 b 217 69 265 190 217 140 b 222 30 217 58 219 45 b 222 23 222 29 220 26 b 220 12 222 20 220 16 b 226 1 220 7 222 3 z',\n },\n caesuraCurved: {\n x_min: 0,\n x_max: 386,\n y_min: -10,\n y_max: 584,\n ha: 594,\n o: 'm 180 -14 b 246 14 213 -13 230 0 b 347 144 288 52 315 99 b 526 471 420 246 488 350 b 556 671 546 537 556 603 b 543 798 556 713 553 756 b 504 837 537 822 521 828 b 490 841 500 840 494 841 b 472 832 482 841 477 838 b 406 678 436 785 406 737 b 410 638 406 665 408 652 b 425 511 419 595 425 553 b 315 186 425 395 387 287 b 180 -14 271 122 228 58 z m 14 24 b 49 39 29 24 40 32 b 120 114 76 60 99 85 b 216 276 156 166 184 223 b 317 626 281 384 317 501 b 315 664 317 639 317 651 b 301 773 314 701 311 737 b 262 808 295 795 278 808 b 245 799 256 808 249 805 b 170 641 209 750 170 706 b 171 621 170 634 170 628 b 177 511 176 585 177 549 b 114 229 177 415 160 320 b 0 26 79 161 42 95 b 14 24 6 24 10 24 z',\n },\n restMaxima: {\n x_min: 0,\n x_max: 366,\n y_min: -255,\n y_max: 255,\n ha: 510,\n o: 'm 397 -367 b 504 -343 436 -367 468 -347 b 518 -318 516 -341 518 -330 b 527 -30 518 -217 527 -117 b 526 33 527 -7 527 13 l 526 301 b 501 350 526 323 520 341 b 428 367 477 361 452 367 b 374 359 410 367 393 364 b 357 333 361 354 357 347 b 356 91 357 252 356 171 l 356 30 b 340 -307 357 -82 346 -194 b 397 -367 337 -354 350 -367 z m 46 -357 b 58 -356 49 -357 53 -357 b 154 -333 91 -351 121 -338 b 173 -305 168 -330 173 -320 l 173 302 b 132 356 173 330 157 348 b 68 364 112 363 89 364 b 3 304 19 363 1 348 l 3 4 l 0 4 b 1 -302 0 -98 0 -200 b 46 -357 1 -331 16 -357 z',\n },\n restDoubleWhole: {\n x_min: 0,\n x_max: 122,\n y_min: 0,\n y_max: 249,\n ha: 249,\n o: 'm 43 0 b 58 1 48 0 52 0 b 124 20 81 6 102 17 b 176 96 173 27 176 58 b 173 220 174 138 173 179 b 176 304 173 248 176 276 b 140 353 176 331 163 346 b 95 359 125 356 111 359 b 32 346 73 359 52 354 b 0 315 20 340 0 337 b 1 243 0 291 1 268 l 1 174 l 4 174 l 4 48 b 43 0 4 16 17 0 z',\n },\n restWhole: {\n x_min: 0.8908513171538642,\n x_max: 500,\n y_min: -120,\n y_max: 14,\n ha: 134,\n o: 'm 356 -173 l 356 -171 l 642 -171 b 719 -115 680 -171 717 -145 b 720 -82 719 -104 720 -92 b 711 -20 720 -60 719 -40 b 672 17 704 0 694 10 b 649 20 664 20 657 20 b 605 17 634 20 621 17 b 92 19 433 17 262 17 b 29 7 69 20 49 12 b 9 -17 12 4 9 -6 b 10 -43 9 -26 10 -35 b 1 -84 10 -58 3 -72 b 76 -173 0 -147 7 -173 z',\n },\n restHalf: {\n x_min: 0,\n x_max: 518.3998530468286,\n y_min: 0,\n y_max: 162,\n ha: 162,\n o: 'm 98 0 l 556 0 b 665 1 592 0 629 0 b 746 82 720 3 743 29 b 736 174 749 114 740 144 b 670 232 729 215 708 232 b 570 229 636 232 603 229 b 356 233 498 229 426 233 l 73 233 b 0 179 19 233 0 220 b 1 154 0 171 0 164 b 6 95 4 135 6 115 b 98 0 3 27 29 0 z',\n },\n restQuarter: {\n x_min: -0.3784452492533808,\n x_max: 263,\n y_min: -415,\n y_max: 415,\n ha: 830,\n o: 'm 151 -596 b 164 -563 163 -589 161 -575 b 160 -546 164 -557 161 -552 b 124 -396 148 -495 135 -446 b 122 -380 122 -390 122 -384 b 199 -255 122 -331 158 -272 b 228 -256 209 -249 217 -253 b 324 -346 274 -271 298 -310 b 353 -369 331 -356 341 -369 b 360 -367 356 -369 357 -369 b 379 -336 373 -361 379 -348 l 377 -325 b 344 -232 372 -292 366 -258 b 249 -58 301 -180 278 -117 b 242 -36 245 -49 242 -42 b 258 -7 242 -26 248 -17 b 328 78 284 20 311 45 b 354 158 344 104 354 131 b 337 216 354 177 350 196 b 213 435 294 288 249 359 b 115 575 189 487 158 536 b 78 598 105 585 92 598 b 59 592 72 598 66 596 b 39 562 45 583 39 572 b 53 527 39 550 45 539 b 168 344 98 469 125 402 b 187 307 181 328 187 317 b 153 269 187 294 176 284 b 62 213 122 252 91 235 b 40 180 48 203 40 192 b 46 158 40 173 43 166 b 99 65 60 125 79 95 b 183 -79 131 20 160 -29 b 156 -86 173 -88 164 -85 b 0 -261 58 -99 -7 -173 b 96 -557 10 -366 49 -464 b 124 -585 102 -569 109 -580 b 145 -598 132 -588 138 -598 b 151 -596 147 -598 150 -598 z',\n },\n rest8th: {\n x_min: 0,\n x_max: 289,\n y_min: -260,\n y_max: 261,\n ha: 521,\n o: 'm 164 -374 b 212 -340 190 -373 203 -357 b 276 -190 238 -292 258 -242 b 410 285 333 -36 359 128 b 416 314 413 294 416 304 l 416 321 b 393 354 415 341 410 354 b 382 353 389 354 386 354 b 292 311 347 347 315 333 b 174 225 256 276 216 251 b 157 219 168 222 163 219 b 140 228 151 219 145 222 b 131 246 134 233 131 240 b 135 262 131 252 132 256 b 147 298 141 272 147 285 b 127 367 147 323 154 354 b 94 376 114 373 102 376 b 48 336 75 376 63 363 b 3 181 20 288 12 235 b 0 150 1 170 0 160 b 109 24 0 84 35 24 b 171 36 127 24 148 27 b 289 101 213 52 248 75 b 164 -374 256 -62 193 -213 z',\n },\n rest16th: {\n x_min: 0,\n x_max: 333,\n y_min: -328.283950617284,\n y_max: 244,\n ha: 572.2839506172841,\n o: 'm 209 -471 b 246 -458 222 -477 236 -468 b 307 -338 279 -425 300 -384 b 324 -226 312 -301 317 -262 b 428 161 350 -94 386 35 b 480 318 445 215 480 259 b 467 347 480 331 477 341 b 445 351 461 350 454 351 b 408 337 432 351 419 347 b 402 333 405 336 403 334 b 223 215 344 294 294 245 b 236 259 229 233 235 246 b 238 276 238 265 238 271 b 212 338 238 302 226 334 b 193 341 206 340 199 341 b 86 289 156 341 104 317 b 59 180 66 255 59 217 b 156 27 59 76 92 27 b 236 46 179 27 204 35 b 338 101 271 59 298 82 b 289 -49 312 49 302 0 b 196 -122 276 -99 235 -107 b 176 -114 187 -127 176 -127 l 176 -111 b 157 -53 177 -88 164 -72 b 69 -9 141 -7 101 -16 b 17 -48 43 -3 29 -27 b 0 -127 4 -73 0 -99 b 6 -186 0 -147 1 -167 b 82 -294 17 -262 37 -294 b 160 -276 102 -294 128 -289 b 219 -242 181 -268 203 -259 b 236 -230 223 -236 229 -230 b 243 -232 239 -230 240 -230 b 235 -275 248 -246 239 -261 b 202 -456 220 -334 202 -395 b 209 -471 202 -462 203 -468 z',\n },\n rest32nd: {\n x_min: 0,\n x_max: 347,\n y_min: -497.5023916875033,\n y_max: 483,\n ha: 980.5023916875033,\n o: 'm 177 -716 b 217 -690 194 -720 209 -704 b 233 -655 225 -680 230 -668 b 292 -390 253 -567 275 -480 b 361 -48 312 -275 336 -161 b 452 400 393 102 422 252 b 497 629 467 477 482 553 b 500 647 498 635 500 641 b 480 691 500 665 492 684 b 464 696 475 694 469 696 b 418 674 448 696 431 685 l 361 626 b 333 611 353 618 343 612 b 308 629 325 611 317 616 b 239 667 292 651 265 661 b 204 670 228 668 216 670 b 86 559 141 670 95 628 b 85 537 86 552 85 544 b 107 416 85 495 95 455 b 161 372 114 389 134 372 b 174 373 166 372 170 372 b 226 383 192 374 209 377 b 387 478 285 402 330 444 b 364 386 379 444 364 415 b 276 271 364 323 320 298 b 265 266 272 268 268 266 b 252 276 261 266 256 269 b 143 333 229 311 186 333 b 107 327 130 333 118 330 b 43 243 62 314 46 291 b 58 145 43 210 52 179 b 150 63 68 92 99 63 b 315 132 213 63 259 98 b 266 -58 297 63 281 4 b 207 -101 259 -91 230 -96 b 186 -66 186 -107 199 -75 b 180 -50 181 -63 183 -55 b 101 -3 160 -23 135 -3 b 9 -66 59 -3 20 -32 b 0 -118 3 -84 0 -101 b 10 -196 0 -144 6 -170 b 104 -287 20 -256 52 -287 b 137 -282 114 -287 125 -287 b 184 -269 151 -281 171 -269 b 196 -275 190 -269 193 -271 b 199 -287 197 -278 199 -282 b 184 -343 199 -304 189 -325 b 181 -348 184 -346 183 -347 b 134 -595 158 -429 131 -508 b 156 -677 134 -624 150 -648 b 177 -716 158 -693 160 -713 z',\n },\n rest64th: {\n x_min: 0,\n x_max: 428,\n y_min: -720,\n y_max: 473.6797408388932,\n ha: 1193.6797408388932,\n o: 'm 200 -1037 b 229 -1012 215 -1037 222 -1025 b 238 -984 233 -1004 236 -994 b 282 -780 248 -914 265 -848 b 386 -369 317 -644 354 -507 b 491 104 422 -212 451 -53 b 600 541 528 249 550 399 b 616 629 611 570 616 599 b 600 680 616 648 615 671 b 550 665 586 687 566 677 b 480 618 527 649 501 635 b 464 611 474 613 468 611 b 448 622 458 611 454 615 b 366 662 425 651 397 662 b 331 658 354 662 343 661 b 242 572 285 647 253 619 b 236 528 239 557 236 543 b 266 400 236 484 251 442 b 325 373 274 377 301 373 b 436 409 366 373 403 383 l 494 452 b 474 360 485 416 474 389 b 383 248 474 297 435 269 b 320 328 377 288 351 310 b 276 341 305 337 291 341 b 186 269 235 341 194 311 b 181 230 183 256 181 243 b 187 153 181 204 186 179 b 279 63 192 86 233 63 b 304 65 288 63 295 63 b 416 115 344 72 379 92 b 387 -14 406 69 397 27 b 320 -95 380 -52 369 -86 b 318 -79 320 -89 320 -84 b 223 0 305 -29 271 0 b 122 -81 171 0 135 -30 b 118 -127 120 -96 118 -112 l 118 -196 b 137 -242 118 -215 125 -229 b 209 -275 157 -266 181 -275 b 249 -269 222 -275 235 -274 b 318 -248 272 -264 294 -255 b 281 -390 315 -301 292 -344 b 276 -400 279 -393 279 -397 b 259 -420 272 -408 266 -416 b 246 -429 255 -425 251 -429 b 233 -415 242 -429 238 -426 b 176 -359 225 -389 200 -372 b 121 -346 158 -348 140 -346 b 14 -408 73 -346 27 -370 b 0 -498 4 -438 0 -468 b 6 -564 0 -520 3 -543 b 91 -635 12 -611 45 -635 b 131 -629 104 -635 117 -634 b 223 -590 163 -622 190 -603 b 166 -824 203 -671 189 -747 b 148 -912 157 -852 148 -881 b 156 -955 148 -926 150 -940 b 177 -1008 161 -972 170 -991 b 200 -1037 181 -1020 183 -1037 z',\n },\n rest128th: {\n x_min: 0.6717818579024267,\n x_max: 491,\n y_min: -711,\n y_max: 719,\n ha: 1430,\n o: 'm 233 -1015 b 271 -956 256 -1002 266 -981 l 314 -723 b 393 -350 337 -598 366 -474 b 543 312 442 -128 492 91 b 687 841 583 490 635 665 b 707 958 698 880 707 919 b 706 986 707 968 707 976 b 688 1025 704 999 704 1024 b 670 1027 683 1025 677 1027 b 629 1007 655 1027 639 1022 b 559 945 613 981 586 968 b 541 1004 553 968 559 991 b 456 1035 516 1024 488 1035 b 419 1030 444 1035 431 1034 b 344 953 379 1018 353 995 b 340 900 341 936 340 917 b 341 847 340 881 341 864 b 380 779 340 815 354 793 b 464 763 406 765 435 762 b 592 814 510 763 549 786 b 546 660 575 757 556 710 b 480 585 537 619 517 598 b 478 599 480 590 478 595 b 386 678 472 641 428 678 b 294 612 343 678 304 651 b 279 477 282 567 278 521 b 363 395 281 428 317 395 b 380 396 369 395 374 395 b 488 436 416 403 449 419 b 384 233 469 357 468 275 b 359 291 373 252 377 276 b 282 318 337 310 310 318 b 181 264 243 318 203 298 b 154 107 153 216 154 161 b 242 6 154 42 187 6 b 278 10 253 6 265 7 b 408 88 330 22 366 55 b 387 -1 400 56 393 27 b 301 -112 379 -55 354 -94 b 289 -65 297 -95 302 -79 b 219 -32 269 -42 245 -32 b 183 -37 207 -32 196 -35 b 112 -109 144 -46 121 -71 b 105 -219 104 -145 108 -183 b 186 -315 101 -276 134 -315 b 230 -307 199 -315 215 -312 b 324 -256 264 -295 292 -275 b 180 -491 323 -383 266 -471 b 183 -459 180 -480 180 -469 b 184 -442 184 -454 184 -448 l 184 -436 b 135 -369 184 -403 170 -383 b 102 -363 125 -364 114 -363 b 29 -399 73 -363 45 -376 b 1 -556 -4 -448 6 -503 b 109 -670 -4 -625 43 -670 b 140 -667 118 -670 130 -668 b 253 -616 180 -658 213 -638 b 238 -688 248 -644 242 -665 b 192 -959 220 -779 192 -867 b 193 -992 192 -971 192 -981 b 210 -1024 194 -1014 199 -1024 b 233 -1015 216 -1024 223 -1021 z',\n },\n dynamicPiano: {\n x_min: -49,\n x_max: 326.5019318364244,\n y_min: -142,\n y_max: 515,\n ha: 657,\n o: 'm -56 -204 b -42 -202 -52 -204 -46 -203 b -19 -194 -35 -202 -26 -197 b 147 -138 35 -170 91 -151 b 249 -58 194 -127 223 -95 b 262 -29 255 -50 262 -39 b 258 -17 262 -24 261 -20 b 232 -7 252 -10 242 -7 b 210 -12 225 -7 217 -9 b 125 -40 184 -23 157 -30 b 183 140 153 19 171 79 b 251 167 207 144 230 153 b 469 518 383 262 480 382 b 357 687 472 626 420 687 b 315 678 344 687 330 684 b 204 600 279 664 240 634 b 210 704 206 635 209 670 b 215 721 212 710 215 716 b 206 733 215 727 212 730 b 180 742 197 736 189 742 b 164 734 176 742 170 740 b 1 575 108 684 36 645 b -7 557 -1 569 -7 563 b -6 553 -7 556 -7 554 b 7 547 -3 547 3 547 l 17 547 b 82 575 43 547 59 567 l 82 452 b 56 46 82 317 81 180 b 17 -66 49 7 46 -36 b -62 -173 -13 -99 -37 -135 b -71 -192 -66 -179 -71 -184 b -68 -199 -71 -193 -69 -196 b -56 -204 -65 -203 -60 -204 z m 196 258 b 197 266 197 261 197 264 b 200 510 200 347 199 429 b 233 543 210 521 222 533 b 281 560 249 554 266 560 b 340 503 310 560 333 540 b 344 461 343 488 344 474 b 321 323 344 413 333 369 b 268 272 315 300 295 281 b 196 258 245 265 220 261 z',\n },\n dynamicMezzo: {\n x_min: -18,\n x_max: 559,\n y_min: -50,\n y_max: 365,\n ha: 415,\n o: 'm 43 -71 b 160 19 86 -71 143 -26 b 230 264 189 99 200 184 b 282 363 243 297 259 327 b 287 320 285 347 287 333 b 284 279 287 305 285 292 l 249 -12 b 275 -43 248 -29 245 -43 b 395 45 321 -43 389 3 b 462 271 406 124 436 197 b 523 387 475 310 490 348 l 523 346 b 504 130 521 274 513 202 b 501 81 501 114 501 98 b 510 3 501 55 504 29 b 580 -72 521 -48 543 -72 b 625 -63 593 -72 608 -69 b 789 50 690 -43 744 -3 b 805 72 795 56 805 63 b 798 85 805 76 802 81 b 778 94 792 91 785 94 b 755 85 770 94 763 91 l 693 40 b 675 33 685 36 680 33 b 658 52 668 33 662 39 b 645 144 651 82 645 112 b 658 448 641 246 660 346 b 606 507 658 485 638 507 b 583 504 599 507 592 505 b 495 446 547 497 521 471 b 420 373 471 423 448 399 b 413 458 418 406 418 432 b 361 507 408 490 386 507 b 320 491 347 507 333 501 b 160 307 256 444 207 382 l 160 337 b 174 488 160 387 174 438 b 156 521 174 501 173 513 b 137 526 148 524 143 526 b 109 513 127 526 118 520 b -16 399 66 477 23 439 b -26 383 -20 395 -26 389 l -26 379 b -14 370 -24 372 -20 370 b -6 372 -12 370 -9 372 b 19 376 4 374 12 376 b 36 359 32 376 36 370 b 30 330 36 350 35 341 l 30 323 b 9 -35 23 203 17 85 b 43 -71 6 -65 19 -71 z',\n },\n dynamicForte: {\n x_min: -144,\n x_max: 311.30112136775,\n y_min: -115.3876295915697,\n y_max: 504,\n ha: 619.3876295915697,\n o: 'm -101 -166 b 173 76 7 -153 150 -30 b 206 344 192 164 202 253 b 268 338 226 343 246 341 b 384 395 317 333 353 361 b 397 419 393 405 397 412 b 367 442 397 429 387 436 b 350 444 361 444 356 444 b 206 455 302 449 255 454 l 206 474 b 202 540 204 495 202 518 b 209 593 202 557 203 576 b 236 624 215 613 225 624 b 265 612 245 624 253 619 b 308 552 287 596 302 577 b 336 533 312 534 323 533 b 448 611 366 533 444 583 b 399 696 452 648 423 671 b 382 706 395 700 387 703 b 308 726 357 720 333 726 b 207 684 272 726 239 711 b 60 455 135 622 60 560 l 10 455 b -23 448 -1 455 -13 454 b -102 372 -55 426 -76 397 b -109 357 -108 367 -109 361 b -95 347 -109 353 -105 348 b -63 346 -84 346 -73 346 b 0 344 -43 344 -22 344 l 63 344 b 53 186 63 291 59 239 b 23 0 46 124 42 60 b -35 -60 10 -42 -6 -60 b -73 -52 -45 -60 -58 -58 b -91 -48 -79 -49 -85 -48 b -109 -53 -96 -48 -102 -49 b -199 -124 -143 -72 -168 -99 b -207 -137 -203 -128 -207 -132 b -194 -148 -207 -141 -203 -145 b -101 -166 -164 -160 -132 -168 z',\n },\n dynamicRinforzando: {\n x_min: -75,\n x_max: 322.0960720195126,\n y_min: -90,\n y_max: 325,\n ha: 415,\n o: 'm 23 -130 b 40 -125 27 -130 33 -128 b 128 -9 81 -114 125 -53 b 145 200 132 62 141 130 b 148 238 147 212 148 225 b 308 321 184 291 245 321 b 363 314 325 321 344 318 b 377 310 369 312 373 310 b 384 311 380 310 382 310 b 464 415 410 317 464 389 b 446 433 465 429 455 429 b 390 445 428 441 409 445 b 305 429 361 445 334 438 b 167 346 252 413 202 393 b 153 325 163 338 158 333 b 148 438 154 363 151 399 b 121 468 147 456 134 468 b 101 458 115 468 108 465 b -63 310 46 409 -16 367 b -108 240 -78 289 -98 271 b 32 330 -50 256 -13 297 b 37 304 37 320 37 312 l 37 292 b 10 -101 27 161 20 30 b 23 -130 9 -120 12 -130 z',\n },\n dynamicSforzando: {\n x_min: 0,\n x_max: 296,\n y_min: 0,\n y_max: 379,\n ha: 379,\n o: 'm 151 0 b 174 1 160 0 166 0 b 392 158 272 14 346 71 b 405 207 400 174 405 190 b 359 287 405 236 389 265 b 261 325 328 308 294 315 b 168 413 216 340 181 366 b 166 426 167 418 166 423 b 176 438 166 432 167 436 b 199 441 183 441 190 441 b 310 393 238 441 295 422 b 334 370 317 376 325 370 b 363 386 343 370 353 379 b 422 445 386 402 408 420 b 426 458 425 449 426 454 b 422 469 426 462 425 465 b 274 546 395 518 333 546 b 161 503 232 546 190 531 b 86 405 132 472 108 439 b 71 347 75 387 71 367 b 112 256 71 312 85 279 b 209 215 141 232 176 226 b 284 168 238 206 266 197 b 300 131 291 157 300 144 b 298 120 300 127 298 122 b 278 107 294 109 285 108 b 262 108 271 107 266 108 l 259 108 b 114 157 200 107 156 125 b 96 181 104 163 96 170 l 96 184 b 102 202 96 190 102 196 b 96 209 102 204 101 207 b 63 194 82 215 72 204 b 7 109 42 168 26 138 b 0 86 3 101 0 94 b 13 60 0 78 4 68 b 151 0 53 23 101 0 z',\n },\n dynamicZ: {\n x_min: -42.73880183193087,\n x_max: 331,\n y_min: 0,\n y_max: 328,\n ha: 328,\n o: 'm -45 0 b -6 16 -32 0 -17 10 b 3 20 -3 16 0 19 b 144 60 49 48 96 60 b 284 22 190 60 238 46 b 348 4 305 10 327 4 b 461 75 393 4 435 30 b 468 91 464 81 467 86 b 456 104 468 95 465 99 b 287 173 402 131 348 167 b 239 176 271 174 255 176 b 168 174 217 176 194 174 b 367 340 236 236 298 294 b 459 423 402 363 432 392 b 477 454 467 431 475 442 b 474 462 477 456 475 459 b 454 472 469 469 462 472 b 432 468 446 472 439 469 b 356 448 406 461 380 455 b 210 422 307 433 258 422 b 109 442 177 422 144 428 b 94 445 104 444 99 445 b 69 433 85 445 76 442 b 27 390 56 419 39 406 b -9 343 16 373 -17 357 b 63 311 3 320 36 314 l 78 311 b 132 307 95 308 114 307 b 240 314 168 307 203 311 l 193 271 b -37 50 117 196 19 145 b -59 7 -46 36 -69 20 b -45 0 -55 3 -50 0 z',\n },\n ornamentTrill: {\n x_min: 1,\n x_max: 551,\n y_min: -18,\n y_max: 539,\n ha: 557,\n o: 'm 321 612 b 190 602 278 605 235 605 l 190 638 b 187 693 190 652 190 667 b 161 776 184 717 193 776 b 137 747 150 776 137 766 b 130 654 135 716 131 685 l 130 596 l 52 588 b 4 539 23 585 7 570 b 1 477 3 530 1 500 b 3 448 1 461 3 448 l 3 452 b 53 432 6 436 23 432 b 134 435 75 432 102 433 b 151 117 138 328 147 223 b 170 13 153 82 157 46 b 209 -26 179 -10 193 -26 b 222 -22 213 -26 217 -24 b 269 -17 233 -16 253 -27 b 343 135 325 19 346 66 b 343 158 343 147 344 147 b 323 192 341 171 337 187 b 291 176 311 194 300 184 l 264 148 b 229 131 261 145 238 131 b 212 170 209 131 213 154 b 194 438 203 259 199 348 l 272 442 b 284 452 276 441 279 441 b 305 462 287 461 295 462 l 312 462 b 346 477 325 462 340 464 b 366 560 357 503 366 531 b 321 612 366 598 356 618 z m 759 588 b 711 560 749 592 733 570 b 588 500 671 541 631 521 b 583 533 586 514 586 524 b 560 576 577 549 577 572 b 517 550 541 582 528 564 b 416 423 482 508 452 462 b 382 353 392 397 384 370 b 387 305 380 341 386 318 b 392 275 389 295 392 285 b 409 243 393 262 393 243 b 431 262 419 243 425 255 b 521 373 459 298 488 333 b 523 354 521 366 523 360 b 520 337 523 346 521 340 b 508 295 513 323 508 310 b 530 102 508 279 524 122 b 549 66 533 88 530 66 b 577 99 563 66 572 84 b 580 131 580 109 580 121 l 580 302 b 600 347 580 318 582 337 b 701 392 632 364 665 384 b 793 518 785 409 793 435 b 759 588 793 559 785 576 z',\n },\n ornamentTurn: {\n x_min: 0,\n x_max: 574,\n y_min: 0,\n y_max: 312,\n ha: 312,\n o: 'm 651 0 b 816 132 727 0 796 46 b 827 223 822 163 827 193 b 808 340 827 262 821 301 b 665 449 785 408 729 449 b 636 446 655 449 647 448 b 589 384 600 441 586 422 l 602 300 b 611 285 603 291 605 285 b 621 288 613 285 616 287 b 655 295 632 294 644 295 b 711 284 674 295 693 289 b 773 209 740 275 773 232 b 697 156 773 184 734 160 b 664 154 685 154 675 154 b 579 168 635 154 608 158 b 455 242 533 186 495 213 b 261 400 387 291 331 354 b 160 432 225 422 190 432 b 20 328 98 432 49 392 b 0 229 6 295 0 262 b 30 71 0 176 14 122 b 144 3 43 29 96 3 b 168 6 153 3 160 4 b 248 122 233 20 248 39 b 246 147 248 124 248 135 b 226 177 243 164 239 177 b 206 170 220 177 215 174 b 144 154 186 158 166 154 b 79 170 122 154 101 160 b 53 202 62 179 53 189 b 60 228 53 209 55 217 b 161 281 81 261 120 281 b 183 279 168 281 176 281 b 325 190 243 269 284 229 b 572 16 402 124 475 53 b 651 0 598 6 625 0 z',\n },\n ornamentTurnSlash: {\n x_min: 0,\n x_max: 574,\n y_min: -106,\n y_max: 405,\n ha: 511,\n o: 'm 441 -153 b 456 -60 455 -118 456 -89 b 455 81 455 -14 455 33 b 572 14 491 55 530 30 b 651 -1 598 4 625 -1 b 816 131 727 -1 796 45 b 827 222 822 161 827 192 b 808 338 827 261 821 300 b 665 448 785 406 729 448 b 636 445 655 448 647 446 b 589 383 600 439 586 420 l 602 298 b 611 284 603 289 605 284 b 621 287 613 284 616 285 b 655 294 632 292 644 294 b 711 282 674 294 693 288 b 773 207 740 274 773 230 b 697 154 773 183 734 158 b 664 153 685 153 675 153 b 579 167 635 153 608 157 b 455 240 533 183 495 212 b 454 242 455 240 455 242 l 454 337 b 452 488 454 386 452 439 b 433 570 452 517 451 546 b 425 583 431 575 431 583 l 422 583 b 403 566 415 582 408 573 b 402 546 400 560 402 553 l 397 287 b 261 399 353 325 310 366 b 160 431 225 420 190 431 b 20 327 98 431 48 390 b 0 228 6 294 0 261 b 30 69 0 174 14 121 b 144 1 43 27 96 1 b 168 4 153 1 160 3 b 248 121 233 19 248 37 b 246 145 248 122 248 134 b 226 176 243 163 239 176 b 206 168 220 176 215 173 b 144 153 186 157 166 153 b 79 168 122 153 101 158 b 53 200 62 177 53 187 b 60 226 53 207 55 216 b 161 279 79 259 120 279 b 183 278 168 279 176 279 b 325 189 243 266 282 226 b 395 130 348 168 372 148 b 393 71 393 109 393 89 b 441 -153 390 -6 402 -78 z',\n },\n ornamentMordent: {\n x_min: 0,\n x_max: 700,\n y_min: 0,\n y_max: 497,\n ha: 497,\n o: 'm 513 0 b 528 39 526 14 527 27 b 531 72 531 50 531 60 b 528 138 531 94 528 117 l 528 347 b 552 359 537 354 544 359 b 579 338 560 359 569 353 b 674 217 609 297 639 255 b 719 190 690 200 704 190 b 759 215 732 190 744 197 b 940 395 815 279 877 337 b 1001 490 968 422 986 455 b 1008 513 1004 495 1008 505 b 1002 524 1008 517 1007 521 b 968 516 994 530 978 524 b 960 508 965 513 963 510 b 798 356 900 464 848 410 b 778 341 791 347 783 341 b 757 354 772 341 765 346 b 661 475 720 392 690 432 b 611 517 644 504 629 517 b 563 498 598 517 583 511 b 527 471 550 490 539 481 l 527 570 b 492 716 526 619 523 671 b 472 677 480 704 472 694 b 465 399 474 585 468 491 b 439 366 456 387 448 376 b 384 320 415 336 399 320 b 330 367 369 320 354 336 b 325 376 328 369 327 373 b 226 490 291 413 265 456 b 189 505 213 500 202 505 b 157 491 177 505 167 500 b 0 229 75 420 0 346 b 1 202 0 220 0 212 b 22 215 12 203 16 209 b 124 327 55 252 89 289 b 147 343 132 337 140 343 b 171 323 156 343 164 336 b 266 197 196 276 232 236 b 337 157 291 170 314 157 b 410 207 361 157 386 174 b 461 274 428 229 444 252 b 462 166 461 238 461 202 b 513 0 465 108 487 55 z',\n },\n ornamentShortTrill: {\n x_min: 0,\n x_max: 747,\n y_min: 0,\n y_max: 243,\n ha: 243,\n o: 'm 379 0 b 428 14 395 0 410 4 b 474 56 445 26 461 39 b 552 157 500 89 526 122 b 566 168 556 163 560 168 b 575 157 569 168 572 166 b 664 36 592 107 628 72 b 733 1 685 13 710 1 b 802 35 757 1 780 13 b 1007 249 871 105 940 177 b 1067 324 1028 272 1054 295 b 1076 340 1068 330 1076 334 b 1073 346 1076 341 1076 343 b 1057 350 1068 348 1063 350 b 1047 347 1053 350 1050 350 b 1001 310 1031 336 1015 324 l 857 157 b 844 143 852 153 848 143 b 835 150 841 143 838 144 b 757 242 815 186 780 209 b 685 298 739 268 713 284 b 641 310 670 305 655 310 b 590 288 625 310 608 304 b 497 179 554 256 527 215 b 480 164 490 170 485 164 b 462 179 474 164 469 168 b 372 295 436 220 405 258 b 278 344 346 324 312 344 b 199 310 252 344 226 334 b 92 196 161 274 128 233 b 0 24 46 148 23 89 b 42 48 22 27 32 37 b 156 168 84 85 114 132 b 196 192 174 184 186 192 b 228 158 206 192 215 181 b 312 36 252 114 282 75 b 379 0 331 12 354 0 z',\n },\n ornamentTremblement: {\n x_min: 0,\n x_max: 982.17691453624,\n y_min: 0,\n y_max: 224,\n ha: 224,\n o: 'm 0 0 b 63 36 30 12 48 23 b 157 124 94 66 125 94 b 177 135 164 131 170 135 b 196 122 183 135 189 131 b 268 40 217 94 245 68 b 323 6 288 16 304 6 b 369 20 336 6 350 10 b 412 53 384 29 399 40 b 501 145 442 84 472 114 b 523 158 508 154 516 158 b 543 145 528 158 536 154 b 641 45 576 112 608 78 b 698 17 658 27 677 17 b 729 23 708 17 719 20 b 804 65 756 32 780 46 b 904 154 837 95 871 124 b 920 163 910 160 916 163 b 936 153 924 163 930 160 b 1024 60 965 121 996 92 b 1112 13 1053 29 1080 13 b 1184 39 1135 13 1158 22 b 1359 194 1248 84 1305 138 b 1413 301 1388 223 1403 261 b 1404 323 1417 315 1413 323 b 1391 320 1400 323 1395 321 b 1344 294 1375 314 1358 307 b 1224 186 1305 258 1269 216 b 1194 173 1212 179 1202 173 b 1165 193 1184 173 1175 179 b 1096 271 1145 222 1122 248 b 1001 318 1061 302 1031 318 b 903 268 969 318 937 301 b 806 186 871 239 841 210 b 782 174 796 179 789 174 b 756 193 773 174 765 180 b 652 291 729 232 693 266 b 596 308 634 302 615 308 b 530 278 573 308 552 298 l 415 168 b 393 157 408 161 400 157 b 373 171 387 157 380 161 b 305 245 353 197 330 222 b 248 276 285 266 266 278 b 189 245 229 276 210 266 b 81 144 156 209 120 174 b 0 0 33 109 26 56 z',\n },\n ornamentPrecompAppoggTrill: {\n x_min: -0.11067192132025548,\n x_max: 1066,\n y_min: -50,\n y_max: 533.1706452421108,\n ha: 583.1706452421108,\n o: 'm 187 -46 b 213 -14 197 -37 204 -26 b 285 151 251 36 266 94 b 304 189 294 177 297 189 b 337 168 311 189 320 181 b 458 33 386 131 415 76 b 495 12 472 19 484 12 b 531 40 508 12 518 22 b 580 168 557 79 569 124 b 622 235 592 213 603 235 b 683 194 636 235 655 222 b 838 26 737 140 791 86 b 919 -33 860 -1 881 -39 b 984 53 960 -27 971 19 b 1022 156 998 86 1008 122 b 1054 190 1032 179 1041 190 b 1089 167 1063 190 1074 183 b 1208 32 1129 122 1171 78 b 1244 10 1221 17 1231 10 b 1273 22 1253 10 1263 14 b 1496 206 1352 78 1427 137 b 1535 310 1526 236 1535 272 b 1531 359 1535 325 1534 343 b 1496 343 1515 360 1506 351 l 1309 192 b 1269 167 1289 176 1279 167 b 1234 199 1260 167 1251 177 b 1122 324 1200 243 1168 289 b 1074 344 1106 337 1089 344 b 1014 301 1051 344 1030 328 b 952 144 985 252 971 197 b 933 121 946 128 940 121 b 910 137 927 121 920 125 b 850 210 888 161 870 186 b 687 369 799 266 750 325 b 631 390 665 383 647 390 b 567 327 602 390 580 369 b 527 199 554 284 543 242 b 508 168 520 179 514 168 b 482 192 503 168 495 177 b 353 328 444 240 405 292 b 312 343 338 338 324 343 b 266 297 292 343 276 327 b 204 125 248 239 232 180 b 143 79 193 102 173 79 b 92 122 117 79 105 102 b 81 154 86 131 84 143 b 48 423 59 242 50 333 b 45 544 46 464 45 504 b 53 730 45 606 48 668 b 40 768 55 744 52 766 b 13 730 19 770 14 747 b 0 514 7 658 -1 586 b 26 122 3 383 6 252 b 75 -36 35 66 40 10 b 134 -72 92 -59 112 -72 b 187 -46 151 -72 170 -63 z',\n },\n ornamentPrecompSlideTrillDAnglebert: {\n x_min: 0,\n x_max: 1088,\n y_min: -380,\n y_max: 252,\n ha: 632,\n o: 'm 560 -539 b 439 -481 527 -497 484 -485 b 354 -461 409 -478 380 -477 b 131 -154 236 -389 161 -285 b 124 -98 127 -135 124 -117 b 196 55 124 -40 148 10 b 308 99 230 86 268 99 b 399 81 337 99 367 92 b 514 22 441 66 477 43 b 619 -30 567 -9 590 -30 b 719 17 642 -30 670 -16 b 861 131 769 52 818 88 b 899 150 874 144 887 150 b 936 117 913 150 926 138 b 965 43 948 94 956 68 b 1007 -1 973 24 978 -1 b 1048 30 1025 -1 1037 16 b 1070 65 1057 40 1064 52 b 1110 148 1084 92 1096 121 b 1145 190 1120 164 1120 190 b 1191 153 1169 192 1179 168 b 1256 29 1218 115 1231 68 b 1292 1 1267 10 1277 1 b 1320 10 1300 1 1309 4 b 1369 48 1339 19 1355 33 b 1515 196 1418 96 1464 148 b 1567 343 1558 238 1567 287 b 1555 363 1565 357 1562 363 b 1539 356 1551 363 1547 360 b 1433 268 1502 330 1466 301 b 1335 171 1401 236 1374 199 b 1310 163 1325 166 1318 163 b 1286 183 1302 163 1293 168 b 1218 311 1264 226 1247 272 b 1164 351 1200 337 1182 351 b 1110 308 1146 351 1128 337 b 1031 176 1084 265 1058 219 b 1015 161 1025 166 1021 161 b 999 179 1009 161 1005 167 b 955 279 985 213 973 248 b 913 307 943 300 930 307 b 887 302 904 307 896 305 b 852 281 874 298 863 291 b 693 167 804 236 747 204 b 612 140 667 150 639 140 b 549 157 592 140 570 145 b 403 220 503 181 452 202 b 271 248 360 236 315 248 b 179 229 239 248 209 242 b 0 -29 65 180 0 85 b 9 -104 0 -53 3 -78 b 397 -526 56 -317 183 -464 b 505 -547 432 -536 468 -547 b 560 -539 524 -547 541 -544 z',\n },\n ornamentPrecompSlideTrillBach: {\n x_min: 0,\n x_max: 1185,\n y_min: -380,\n y_max: 465,\n ha: 845,\n o: 'm 624 -544 b 642 -528 638 -543 642 -537 b 639 -514 642 -524 642 -520 b 590 -444 629 -487 609 -467 b 523 -413 573 -422 553 -410 b 498 -415 514 -415 507 -415 b 399 -389 464 -415 431 -405 b 89 -157 281 -330 176 -255 b 72 -117 78 -144 72 -131 b 73 -101 72 -111 72 -107 b 187 186 91 3 147 91 b 246 230 200 216 222 230 b 300 209 262 230 281 223 b 456 48 359 163 403 101 b 540 -10 494 10 518 -10 b 625 59 566 -10 589 13 b 690 148 648 88 668 118 b 711 167 697 160 704 167 b 733 153 719 167 724 163 b 844 14 769 105 808 60 b 903 -42 873 -23 886 -42 b 973 -1 919 -42 937 -27 b 1008 33 986 7 996 20 b 1048 81 1021 48 1035 65 b 1050 37 1048 66 1050 52 b 1047 -24 1050 17 1048 -3 b 1038 -275 1038 -108 1040 -192 l 1037 -289 b 1045 -302 1037 -295 1038 -301 b 1068 -284 1056 -304 1064 -292 b 1084 -242 1076 -271 1081 -256 b 1099 -109 1096 -199 1099 -154 b 1106 158 1099 -19 1106 71 b 1128 187 1113 167 1120 177 b 1168 223 1143 212 1155 223 b 1210 193 1179 223 1191 213 b 1220 183 1214 190 1215 186 b 1329 36 1261 138 1292 84 b 1374 7 1345 16 1358 7 b 1411 20 1384 7 1395 12 b 1479 84 1437 37 1459 59 b 1610 235 1521 135 1564 186 b 1706 403 1655 282 1695 334 b 1614 346 1663 400 1637 373 b 1464 170 1564 287 1515 228 b 1440 150 1453 156 1447 150 b 1414 173 1433 150 1426 158 b 1283 336 1371 228 1333 288 b 1220 366 1261 356 1240 366 b 1148 318 1194 366 1169 350 b 1103 255 1133 297 1119 275 b 1097 301 1102 271 1100 285 b 1099 334 1099 312 1099 324 b 1092 428 1099 367 1094 397 b 1071 647 1087 501 1079 575 b 1058 670 1071 657 1071 670 b 1035 648 1047 670 1038 661 b 1018 516 1024 605 1015 560 b 1041 203 1025 412 1037 307 b 1043 180 1041 196 1043 187 b 992 127 1027 161 1009 143 b 965 111 981 117 972 111 b 936 132 955 111 946 120 b 829 268 900 179 867 225 b 760 317 801 301 780 317 b 691 258 739 317 719 297 b 605 147 664 219 641 177 b 589 138 599 141 593 138 b 572 148 583 138 579 141 b 415 317 520 206 467 261 b 327 372 390 343 366 366 b 300 373 317 373 308 373 b 154 295 239 373 190 348 b 55 138 120 243 85 192 b 0 -53 22 79 0 13 b 160 -317 0 -156 49 -252 b 209 -354 177 -327 192 -343 b 510 -531 305 -419 397 -495 b 593 -547 537 -540 564 -547 b 624 -544 603 -547 613 -546 z',\n },\n ornamentPrecompTrillSuffixDandrieu: {\n x_min: 0,\n x_max: 1003,\n y_min: -20,\n y_max: 521,\n ha: 541,\n o: 'm 791 -16 b 844 33 812 -3 829 14 b 981 271 900 107 937 190 b 994 288 984 278 985 288 b 1009 269 1004 288 1007 278 b 1077 112 1034 217 1051 163 b 1158 43 1103 62 1129 43 b 1231 69 1179 43 1204 55 b 1348 189 1280 98 1315 143 b 1444 451 1407 271 1444 357 b 1431 547 1444 482 1440 514 b 1188 750 1401 665 1299 750 b 1158 747 1178 750 1168 749 b 1079 684 1119 742 1089 727 b 1063 632 1076 665 1071 648 b 1056 609 1058 622 1056 615 b 1071 599 1056 602 1060 599 b 1086 600 1076 599 1080 600 b 1130 605 1102 603 1116 605 b 1244 569 1171 605 1210 595 b 1349 346 1322 511 1349 433 b 1348 312 1349 334 1349 324 b 1289 197 1345 266 1325 228 b 1238 174 1270 181 1253 174 b 1188 215 1220 174 1202 187 b 1145 308 1172 245 1159 276 b 1096 413 1129 343 1120 382 b 1053 438 1084 431 1068 438 b 1011 413 1038 438 1022 431 b 955 324 989 384 971 354 b 850 127 920 258 886 192 b 838 112 847 121 842 112 b 824 128 828 109 825 121 b 802 193 815 150 809 171 b 730 400 779 264 766 337 b 688 431 719 420 703 431 b 647 403 674 431 660 422 b 606 338 632 383 619 361 b 513 167 575 282 546 223 b 480 122 503 150 498 122 b 452 171 459 122 459 153 b 420 255 442 199 432 228 b 337 408 399 308 380 364 b 276 436 317 428 297 436 b 215 397 253 436 230 423 b 23 72 148 289 81 184 b 0 29 17 59 0 40 b 7 17 0 23 1 20 b 59 58 26 7 46 39 b 190 276 111 127 143 206 b 216 301 202 292 207 301 b 245 279 223 301 232 294 b 311 166 278 248 292 206 b 367 16 331 117 346 65 b 402 -19 377 -7 387 -19 b 438 -4 412 -19 423 -13 b 518 88 474 17 495 55 b 628 284 562 150 592 216 b 657 223 648 266 651 243 b 717 13 677 154 696 84 b 755 -29 726 -16 737 -29 b 791 -16 765 -29 776 -24 z',\n },\n ornamentPrecompDoubleCadenceUpperPrefix: {\n x_min: 0,\n x_max: 1246,\n y_min: -30,\n y_max: 296.0302860502196,\n ha: 326.0302860502196,\n o: 'm 360 -43 b 559 59 445 -43 503 7 b 698 236 615 111 652 179 b 714 248 704 243 710 248 b 727 235 719 248 721 243 l 848 42 b 883 12 860 22 870 12 b 917 32 891 12 903 19 b 946 62 927 42 939 50 b 1037 192 972 108 1009 147 b 1057 210 1044 204 1051 210 b 1076 190 1063 210 1068 203 l 1176 12 b 1215 -19 1188 -9 1201 -19 b 1250 -6 1225 -19 1237 -14 b 1284 27 1264 3 1274 16 b 1380 190 1323 78 1351 135 b 1395 210 1384 197 1385 210 b 1413 190 1405 210 1410 197 b 1508 40 1436 134 1467 85 b 1564 3 1529 14 1547 3 b 1617 32 1580 3 1597 12 b 1767 238 1678 92 1719 167 b 1794 310 1781 259 1791 282 b 1752 294 1776 317 1764 304 b 1656 164 1711 258 1689 206 b 1629 144 1646 151 1637 144 b 1603 161 1620 144 1613 150 b 1502 315 1562 207 1525 258 b 1452 357 1490 344 1470 357 b 1397 320 1431 357 1411 344 b 1316 170 1368 271 1345 219 b 1280 127 1306 154 1303 127 b 1244 171 1256 127 1254 154 b 1145 337 1210 226 1179 282 b 1110 363 1135 354 1122 363 b 1070 338 1097 363 1084 354 b 1050 311 1063 330 1057 320 b 959 181 1017 271 992 223 b 939 167 950 173 945 167 b 920 184 933 167 927 173 b 818 343 887 238 852 291 b 759 395 795 377 778 395 b 701 344 742 395 724 377 b 698 338 700 341 700 340 b 544 154 652 272 605 207 b 412 98 501 117 458 98 b 304 130 377 98 341 108 b 95 373 204 187 144 275 b 58 426 85 393 82 428 b 19 366 26 426 26 389 b 0 307 13 346 0 327 b 4 287 0 300 1 294 b 174 36 49 194 91 102 b 360 -43 230 -9 289 -43 z',\n },\n ornamentPrecompDoubleCadenceUpperPrefixTurn: {\n x_min: 0,\n x_max: 1226,\n y_min: -237,\n y_max: 436,\n ha: 673,\n o: 'm 1279 -341 b 1293 -252 1293 -307 1295 -278 b 1277 36 1287 -156 1282 -59 l 1273 118 b 1318 176 1289 137 1303 157 b 1349 203 1332 193 1342 203 b 1378 168 1359 203 1367 192 b 1456 35 1401 122 1428 78 b 1511 -12 1476 3 1493 -12 b 1568 23 1526 -12 1544 0 b 1597 53 1578 32 1588 42 b 1705 186 1629 101 1669 143 b 1761 284 1728 216 1751 246 b 1765 300 1763 288 1765 295 b 1763 307 1765 302 1765 305 b 1737 302 1754 311 1744 308 b 1718 287 1729 298 1725 292 b 1598 145 1673 245 1637 194 b 1578 130 1590 135 1584 130 b 1557 147 1571 130 1565 135 b 1447 321 1516 202 1488 265 b 1403 351 1433 341 1417 351 b 1358 323 1388 351 1372 341 b 1269 209 1329 285 1299 248 b 1254 521 1264 314 1259 418 b 1228 616 1253 554 1247 588 b 1218 628 1224 621 1223 628 l 1215 628 b 1201 613 1210 626 1202 619 b 1200 600 1200 609 1200 605 l 1200 586 b 1211 348 1204 507 1207 428 b 1217 166 1214 288 1215 226 b 1202 181 1212 168 1208 174 b 1094 334 1168 233 1130 284 b 1048 366 1079 356 1064 366 b 1004 331 1034 366 1018 354 b 904 154 969 275 930 220 b 873 202 887 171 880 187 b 778 356 845 256 819 311 b 737 379 763 372 750 379 b 698 353 724 379 711 370 l 621 232 b 415 114 570 154 495 114 b 302 138 377 114 340 121 b 73 400 187 192 117 284 b 55 420 69 415 62 420 b 42 410 50 420 45 416 b 0 292 23 373 0 334 b 4 262 0 282 1 272 b 168 39 32 168 92 99 b 359 -26 225 -6 292 -26 b 585 76 446 -26 530 10 b 668 202 616 115 641 160 b 693 228 680 219 687 228 b 720 203 700 228 707 219 b 801 63 752 160 775 111 b 844 7 812 42 818 7 b 910 66 877 6 894 39 b 923 94 916 75 919 85 b 995 219 945 137 968 179 b 1025 184 1009 210 1017 197 b 1119 56 1054 141 1087 98 b 1166 20 1138 32 1152 20 b 1215 50 1181 20 1195 30 b 1221 56 1217 52 1218 55 b 1228 -163 1223 -17 1225 -89 b 1279 -341 1231 -223 1251 -278 z',\n },\n ornamentPrecompTrillLowerSuffix: {\n x_min: 0,\n x_max: 833,\n y_min: -309,\n y_max: 319,\n ha: 628,\n o: 'm 778 -444 b 801 -445 785 -444 793 -445 b 1037 -338 894 -445 969 -397 b 1200 37 1149 -240 1200 -109 b 1084 406 1200 171 1172 300 b 1024 444 1064 431 1043 444 b 960 390 999 444 978 426 b 841 163 923 314 886 236 b 812 128 832 150 827 128 b 786 167 796 130 793 153 b 660 418 744 251 716 341 b 599 459 639 445 619 459 b 541 410 577 459 557 444 b 439 197 507 340 474 269 b 422 179 435 190 435 179 b 338 393 392 251 379 328 b 275 439 320 423 298 439 b 212 396 253 439 230 425 b 71 219 170 333 128 268 b 0 45 17 173 16 112 b 68 98 32 62 50 78 b 194 264 112 150 153 209 b 230 292 209 282 219 292 b 264 261 240 292 251 282 b 274 242 268 255 269 248 b 346 46 304 179 325 112 b 376 10 351 32 354 10 b 412 35 392 10 403 22 b 452 107 429 56 441 82 b 541 291 481 168 511 230 b 556 307 547 302 552 307 b 573 295 562 307 567 302 b 624 217 595 272 611 246 b 721 1 657 145 685 72 b 755 -27 732 -19 742 -27 b 786 -16 765 -27 775 -24 b 857 73 819 7 840 39 b 952 256 887 134 920 194 b 978 289 963 279 969 289 b 1009 262 985 289 994 281 b 1030 235 1017 253 1024 245 b 1110 -4 1071 161 1099 81 b 1116 -68 1113 -26 1116 -48 b 1009 -243 1116 -140 1090 -200 b 848 -291 956 -272 901 -291 b 730 -261 809 -291 770 -282 b 696 -248 714 -252 703 -248 b 671 -284 684 -248 678 -258 l 662 -312 b 657 -357 658 -330 657 -344 b 744 -439 657 -403 683 -425 z',\n },\n brassScoop: {\n x_min: -0.4444444444444445,\n x_max: 312,\n y_min: -390,\n y_max: 28,\n ha: 418,\n o: 'm 0 -562 b 393 -256 171 -504 307 -412 b 449 -39 431 -189 449 -115 b 448 -1 449 -26 449 -14 b 433 40 446 14 448 40 b 408 -3 410 40 412 14 b 396 -66 403 -23 402 -46 b 45 -397 346 -243 209 -337 b 0 -451 13 -409 1 -423 b 0 -562 -1 -485 0 -520 z',\n },\n brassDoitMedium: {\n x_min: -0.32815253965710617,\n x_max: 476.21251177608565,\n y_min: -50,\n y_max: 333.1535583875376,\n ha: 383.1535583875376,\n o: 'm 16 -72 b 27 -71 19 -72 23 -72 b 215 -33 89 -56 153 -48 b 521 114 327 -7 435 35 b 685 432 615 199 691 295 b 670 480 684 449 688 475 b 642 441 654 482 648 456 b 403 183 599 321 513 240 b 79 89 301 130 192 105 b 0 -1 -12 76 0 76 b 0 -50 0 -17 1 -33 b 16 -72 0 -65 3 -72 z',\n },\n brassFallLipShort: {\n x_min: 0,\n x_max: 298,\n y_min: -344,\n y_max: 65,\n ha: 409,\n o: 'm 396 -495 b 420 -461 412 -487 418 -474 b 429 -382 428 -435 429 -409 b 426 -330 429 -364 428 -347 b 285 -6 410 -209 356 -104 b 98 94 239 59 173 94 b 39 86 79 94 58 92 b 0 49 20 81 0 73 l 0 -52 b 10 -69 0 -62 1 -69 b 20 -68 13 -69 16 -69 b 88 -56 45 -59 66 -56 b 261 -160 156 -56 213 -95 b 396 -495 333 -259 382 -369 z',\n },\n brassLiftMedium: {\n x_min: 0,\n x_max: 807,\n y_min: 0,\n y_max: 838,\n ha: 838,\n o: 'm 50 0 b 55 1 52 0 53 0 b 58 23 65 7 59 16 b 55 58 56 36 55 48 b 130 117 55 99 75 112 b 220 213 202 121 220 141 b 315 308 220 289 238 308 l 336 308 b 408 380 393 310 406 321 b 461 452 409 438 416 452 b 485 451 468 452 477 451 b 569 510 531 448 556 464 b 573 543 572 520 572 531 b 657 619 580 605 595 618 b 698 621 670 619 684 619 b 788 700 749 625 778 649 b 798 778 792 726 793 752 b 873 857 806 841 809 845 b 985 950 927 867 973 887 b 1084 1047 1002 1035 1004 1034 b 1162 1128 1133 1056 1162 1087 b 1146 1182 1162 1145 1158 1164 b 1125 1207 1140 1191 1136 1207 l 1122 1207 b 1110 1191 1113 1205 1110 1198 b 1112 1174 1110 1185 1112 1178 b 1048 1110 1109 1126 1096 1113 b 1028 1109 1043 1110 1035 1109 b 939 1022 969 1102 948 1081 b 845 922 929 949 917 936 b 746 812 773 909 753 886 b 744 780 744 802 744 791 b 635 681 737 700 717 683 b 524 583 553 680 536 665 b 439 510 514 520 503 510 b 357 431 377 510 360 492 l 357 406 b 314 364 356 379 343 364 b 238 361 288 364 264 364 b 173 300 202 357 180 334 b 167 245 168 281 167 262 b 105 174 166 192 157 180 b 75 171 95 173 85 171 b 6 112 30 166 14 153 b 0 73 1 98 0 85 b 37 10 0 45 13 26 b 50 0 42 7 46 0 z',\n },\n brassFallRoughMedium: {\n x_min: 0,\n x_max: 791,\n y_min: 0,\n y_max: 819,\n ha: 819,\n o: 'm 1117 0 b 1139 101 1129 26 1139 71 b 1138 121 1139 109 1139 115 b 1084 193 1125 171 1110 193 b 1044 183 1073 193 1060 189 b 1022 177 1035 179 1028 177 b 1007 209 1012 177 1008 186 b 876 324 1004 292 959 330 b 799 317 850 321 825 320 b 759 354 772 314 755 320 b 760 373 760 360 760 366 b 759 392 760 379 760 384 b 681 477 753 451 730 477 b 654 474 672 477 664 475 b 606 467 638 471 622 468 b 586 465 599 465 592 465 b 564 481 570 465 564 469 b 569 505 564 487 566 495 b 575 553 572 521 575 537 b 572 585 575 564 573 575 b 481 665 560 657 539 668 b 412 665 458 664 435 665 b 382 690 392 667 382 672 b 383 700 382 693 383 696 b 386 773 387 724 387 749 b 297 858 382 828 351 857 b 229 861 274 858 251 858 b 190 897 207 863 193 871 b 163 1012 186 936 180 976 b 79 1084 145 1050 124 1084 b 66 1083 75 1084 71 1083 b 43 1096 49 1081 43 1087 b 48 1112 43 1100 45 1106 b 53 1130 52 1119 53 1125 b 39 1169 53 1145 45 1158 b 26 1179 36 1175 30 1179 b 16 1171 22 1179 17 1176 b 0 1103 10 1149 0 1126 b 9 1067 0 1092 1 1079 b 91 1021 26 1031 52 1018 b 145 978 122 1024 141 1011 b 156 913 147 956 151 935 b 291 795 170 831 210 795 b 346 768 337 795 346 796 b 344 743 346 760 344 753 b 343 716 344 733 343 724 b 455 600 343 651 390 602 b 505 605 471 599 490 605 b 528 598 514 605 523 603 b 536 579 534 592 536 586 b 524 523 536 562 526 541 b 523 505 524 517 523 511 b 621 405 523 442 560 405 b 639 406 626 405 634 406 b 677 413 652 408 664 410 b 701 416 687 415 696 416 b 721 392 716 416 721 410 b 720 373 721 386 720 380 b 831 255 714 301 759 252 b 897 261 854 255 876 261 b 926 262 909 261 919 262 b 969 197 963 262 965 252 b 971 184 969 193 971 189 b 1031 115 979 137 998 115 b 1071 122 1043 115 1056 118 b 1096 130 1079 125 1086 127 b 1087 59 1094 107 1087 82 b 1117 0 1087 37 1094 17 z',\n },\n brassBend: {\n x_min: 0,\n x_max: 381,\n y_min: 0,\n y_max: 367,\n ha: 367,\n o: 'm 298 0 b 472 50 359 0 418 14 b 537 135 501 71 530 92 b 543 216 543 163 543 190 l 543 266 b 544 308 543 281 543 295 b 549 433 546 354 549 395 b 543 507 549 459 547 482 b 533 528 541 516 544 528 b 511 508 524 528 514 520 b 508 478 510 498 508 488 b 504 318 507 425 504 372 b 505 264 504 300 505 282 b 446 181 505 220 484 199 b 294 150 396 160 344 150 b 92 194 226 150 158 167 b 45 269 62 207 45 230 b 46 359 46 300 46 328 b 37 497 46 405 45 451 b 27 523 36 507 37 523 b 4 498 14 524 6 513 b 3 481 3 492 3 487 b 0 409 1 456 0 433 b 4 228 0 348 4 288 b 3 177 4 210 4 194 b 68 53 1 125 20 84 b 200 10 108 27 154 17 b 298 0 233 4 266 0 z',\n },\n brassMuteClosed: {\n x_min: 0,\n x_max: 274,\n y_min: 0,\n y_max: 260,\n ha: 260,\n o: 'm 203 0 b 209 1 206 0 207 0 b 216 13 215 4 216 9 l 215 27 l 215 153 b 216 161 216 156 216 158 b 372 164 268 163 318 164 b 395 184 383 164 395 166 l 395 189 b 357 229 392 209 386 229 b 219 228 311 229 265 228 l 223 310 b 209 357 225 328 219 344 b 189 374 203 364 197 374 b 184 373 187 374 186 373 b 177 359 179 372 177 366 l 177 348 l 173 222 l 39 222 b 0 206 12 222 0 219 b 10 174 0 199 3 189 b 46 157 19 157 30 157 b 108 160 68 158 88 160 b 171 161 130 161 150 161 l 167 58 b 184 16 167 40 171 26 b 203 0 192 12 196 0 z',\n },\n brassMuteOpen: {\n x_min: 1,\n x_max: 313.01193341111656,\n y_min: 0,\n y_max: 309,\n ha: 309,\n o: 'm 265 0 b 451 189 363 7 452 88 l 451 215 b 348 383 441 285 405 343 b 209 445 288 426 248 445 b 84 379 168 445 132 420 b 69 364 79 373 73 369 b 1 213 30 323 1 275 b 230 0 1 88 94 0 z m 210 62 b 128 73 181 62 154 66 b 40 171 71 91 42 125 b 52 226 40 187 45 206 b 197 374 79 295 130 344 b 228 382 207 380 217 382 b 300 361 252 382 276 370 b 374 308 328 350 353 331 b 410 223 397 284 410 253 b 393 163 410 202 405 181 b 210 62 354 91 288 63 z',\n },\n brassFlip: {\n x_min: 0,\n x_max: 402,\n y_min: 0,\n y_max: 361,\n ha: 361,\n o: 'm 579 0 b 511 153 579 68 557 117 b 52 504 359 271 206 387 b 29 520 45 510 39 520 b 20 517 26 520 23 518 b 0 477 3 510 0 494 l 0 125 b 17 20 1 92 1 56 b 40 84 37 40 40 60 b 42 287 40 151 42 219 l 42 363 z',\n },\n brassJazzTurn: {\n x_min: 0,\n x_max: 646,\n y_min: 0,\n y_max: 212,\n ha: 212,\n o: 'm 310 0 b 367 33 327 0 344 10 b 389 55 374 40 382 49 b 490 145 423 85 456 114 b 507 154 495 151 501 154 b 524 144 513 154 517 151 b 598 72 547 120 575 98 b 700 24 625 42 662 24 b 765 43 721 24 744 30 b 893 147 812 72 855 105 b 930 212 910 166 923 186 b 912 215 923 213 917 215 b 871 199 896 215 883 209 b 812 153 852 183 832 167 b 789 144 805 148 796 144 b 773 156 782 144 776 147 b 691 251 757 199 720 222 b 603 301 658 282 631 301 b 527 258 580 301 556 288 b 420 156 494 222 455 190 b 399 143 412 147 405 143 b 377 157 392 143 386 147 b 259 282 340 200 300 242 b 219 305 245 298 232 305 b 177 279 204 305 192 297 b 55 127 137 228 95 177 b 0 52 36 104 20 79 b 14 50 6 50 10 50 b 53 66 32 50 45 58 b 115 131 75 88 98 108 b 135 148 124 143 130 148 b 157 132 141 148 148 143 b 252 33 186 96 219 65 b 310 0 275 12 292 0 z',\n },\n brassSmear: {\n x_min: 0,\n x_max: 334,\n y_min: 0,\n y_max: 151,\n ha: 151,\n o: 'm 321 0 b 475 125 390 0 436 43 b 481 143 478 131 481 137 b 475 154 481 147 480 151 b 449 148 468 158 458 154 b 395 132 432 137 413 132 b 343 140 377 132 360 137 b 229 194 301 148 266 173 b 168 217 206 209 186 217 b 109 192 148 217 130 209 b 0 26 59 148 32 89 b 59 63 32 29 45 48 b 98 84 72 78 84 84 b 130 73 108 84 118 81 b 213 26 157 58 183 37 b 321 0 255 9 289 0 z',\n },\n stringsDownBow: {\n x_min: 0,\n x_max: 306,\n y_min: -0.09607201951262866,\n y_max: 366,\n ha: 366.09607201951263,\n o: 'm 405 0 b 425 17 413 -1 420 9 b 439 66 435 32 439 48 b 441 268 439 137 441 202 b 436 412 441 314 439 361 l 435 413 b 423 469 435 436 431 456 b 344 508 406 501 373 501 b 204 527 298 520 251 527 b 60 498 156 527 108 518 b 7 438 32 485 10 468 l 7 426 b 4 337 7 396 7 367 b 0 140 0 272 0 206 b 1 42 0 107 0 73 b 13 3 1 27 -3 4 b 40 39 29 3 35 24 b 42 53 42 43 40 49 b 49 141 48 84 49 112 b 48 215 49 167 48 192 b 49 252 48 228 48 240 l 49 312 b 130 343 72 331 99 340 b 206 347 156 346 180 347 b 372 314 262 347 318 338 l 390 307 l 390 245 b 390 138 392 212 390 176 b 397 23 390 101 392 62 b 405 0 399 14 393 1 z',\n },\n stringsUpBow: {\n x_min: 0,\n x_max: 219.2842808242076,\n y_min: 0,\n y_max: 489,\n ha: 489,\n o: 'm 151 0 b 184 42 170 12 180 26 b 297 554 223 212 261 382 b 315 690 305 598 318 645 b 304 704 315 697 311 704 b 276 670 288 704 282 697 b 157 131 236 490 196 311 l 157 144 b 73 526 134 276 104 396 b 30 677 60 576 52 638 b 13 694 26 684 22 694 b 0 674 9 694 0 691 l 0 671 b 10 603 3 649 6 626 b 105 174 42 461 72 317 b 150 0 117 117 128 58 z',\n },\n stringsHarmonic: {\n x_min: 0,\n x_max: 191,\n y_min: 0,\n y_max: 202,\n ha: 202,\n o: 'm 143 0 b 275 122 217 0 275 53 b 127 291 275 206 202 291 b 0 154 63 291 0 222 b 143 0 0 76 71 0 z m 122 68 b 43 105 89 66 59 75 b 39 124 40 111 39 117 b 79 199 39 148 56 180 b 145 226 101 216 122 226 b 199 210 163 226 180 220 b 235 150 223 196 235 173 b 203 92 235 128 225 107 b 122 68 181 76 150 68 z',\n },\n pluckedSnapPizzicatoAbove: {\n x_min: 0,\n x_max: 201,\n y_min: 0,\n y_max: 325,\n ha: 325,\n o: 'm 171 0 b 289 99 240 0 289 45 b 258 183 289 130 274 156 b 174 269 236 217 203 240 l 174 408 b 174 429 174 415 176 422 b 131 468 168 451 153 468 b 117 451 120 468 117 461 b 118 429 117 444 118 435 b 115 307 117 389 115 347 b 0 166 59 295 0 223 b 171 0 0 85 89 0 z m 134 55 b 52 131 84 55 52 85 b 115 233 52 179 81 209 b 114 192 114 220 114 206 b 174 120 114 137 114 137 l 174 228 b 233 148 200 207 223 183 b 236 130 235 143 236 135 b 197 72 236 105 223 85 b 134 55 177 60 157 55 z',\n },\n pluckedSnapPizzicatoBelow: {\n x_min: 0,\n x_max: 211,\n y_min: 0,\n y_max: 307,\n ha: 307,\n o: 'm 145 7 b 163 0 153 3 158 0 b 173 23 170 0 173 7 l 173 140 l 170 140 l 170 163 l 171 163 b 206 170 179 164 193 166 b 304 287 264 186 304 233 b 281 354 304 308 297 333 b 118 442 240 412 186 439 b 0 324 69 442 0 370 b 115 176 0 266 55 202 l 115 56 b 145 7 114 33 125 19 z m 115 220 b 62 256 92 223 73 230 b 53 292 56 269 53 281 b 78 344 53 311 60 328 b 168 384 105 372 135 384 b 213 376 183 384 199 382 b 253 321 239 366 253 346 b 246 291 253 311 251 301 b 170 226 230 256 203 236 l 170 258 b 148 305 171 278 163 292 b 128 315 143 310 135 315 l 124 315 b 115 301 117 314 115 308 z',\n },\n pluckedLeftHandPizzicato: {\n x_min: 0,\n x_max: 271,\n y_min: 0,\n y_max: 284,\n ha: 284,\n o: 'm 213 0 b 223 14 222 0 223 7 b 222 35 223 22 222 29 l 222 176 b 373 170 272 174 323 170 b 390 180 382 170 390 171 l 390 184 b 347 232 386 207 382 232 b 219 238 307 233 266 235 l 219 364 b 171 409 219 395 193 409 b 156 393 160 409 156 402 b 158 370 156 384 158 376 l 158 240 b 16 239 115 240 66 239 b 0 226 7 239 0 238 l 0 223 b 50 179 1 203 29 179 b 158 177 86 179 122 179 l 158 63 b 161 29 158 52 158 40 b 213 0 166 -1 194 1 z',\n },\n keyboardPedalPed: {\n x_min: 0,\n x_max: 944,\n y_min: -13,\n y_max: 550,\n ha: 563,\n o: 'm 22 0 b 109 78 53 0 105 46 l 144 333 b 163 376 147 347 140 372 b 364 465 238 390 301 426 b 454 599 416 497 454 540 b 452 618 454 605 454 612 b 320 770 442 694 396 747 b 248 779 295 778 272 779 b 193 778 229 779 212 779 b 160 780 181 778 167 775 b 137 792 153 789 144 791 b 109 789 128 792 118 789 b 7 719 59 789 48 737 b 23 708 16 714 20 708 b 36 710 29 710 33 710 b 53 684 52 710 53 698 l 53 674 b 43 386 53 577 53 482 b 20 164 36 312 30 238 b 1 30 14 120 7 75 b 0 19 0 26 0 22 b 22 0 0 9 4 0 z m 171 425 b 156 442 160 425 156 429 b 157 475 157 452 157 464 b 164 602 161 517 164 560 b 161 698 164 635 163 667 b 184 729 161 720 167 729 l 193 729 b 348 563 278 719 348 641 b 346 539 348 554 347 547 b 171 425 328 459 229 422 z m 979 6 b 1008 13 986 6 995 9 b 1081 101 1047 29 1079 46 b 1116 449 1087 217 1104 333 b 1143 654 1123 518 1133 586 b 1148 685 1145 664 1148 675 b 1140 704 1148 693 1146 700 b 1107 716 1130 713 1119 716 b 1056 706 1092 716 1073 710 b 1037 671 1035 703 1038 685 b 1004 439 1025 595 1014 517 b 986 419 1001 428 999 419 b 979 419 985 419 982 420 b 935 426 965 423 949 425 b 795 376 884 426 838 405 b 664 153 714 323 664 249 b 665 130 664 145 665 138 b 753 29 671 65 704 29 b 815 40 773 29 792 33 b 975 147 873 65 923 101 b 965 45 971 108 968 76 b 979 6 963 17 966 6 z m 393 -17 b 634 145 494 16 579 52 b 638 160 636 151 638 156 b 625 168 638 166 634 168 b 621 167 624 168 622 168 b 524 118 582 164 544 160 b 495 79 517 104 505 92 b 435 33 471 49 452 33 b 380 96 416 33 397 55 b 369 145 373 114 369 131 b 442 225 369 186 395 213 b 468 232 451 228 459 229 b 654 344 539 255 606 285 b 677 395 667 360 677 376 b 672 415 677 402 675 408 b 612 459 661 442 639 455 b 589 461 602 461 592 461 b 348 328 500 461 409 408 b 269 120 302 268 269 199 b 379 -19 269 45 318 -19 b 393 -17 383 -19 389 -19 z m 395 240 b 494 383 418 300 452 344 l 521 405 b 544 419 528 409 536 418 b 554 415 547 419 550 418 b 570 383 564 406 570 396 l 570 379 b 552 331 570 360 562 344 b 395 240 511 285 462 253 z m 827 89 b 792 111 815 89 804 96 b 766 204 775 131 766 158 b 845 360 772 256 799 314 b 871 372 854 369 863 372 b 897 366 880 372 888 369 b 978 279 942 353 963 320 b 976 259 981 272 981 265 b 858 104 942 203 909 147 b 827 89 847 94 837 89 z m 1282 12 b 1336 35 1303 14 1320 23 b 1359 71 1351 45 1359 58 b 1338 102 1359 82 1352 95 b 1254 130 1312 118 1284 130 b 1187 88 1223 130 1202 109 b 1178 65 1182 81 1178 72 b 1195 37 1178 55 1182 45 b 1282 12 1223 23 1253 19 z',\n },\n keyboardPedalUp: {\n x_min: 0,\n x_max: 436.6015132318337,\n y_min: 0,\n y_max: 461,\n ha: 461,\n o: 'm 330 0 b 334 1 331 0 333 0 b 340 12 338 4 340 7 l 338 26 b 340 264 338 105 338 184 b 526 95 400 206 461 148 b 559 71 536 88 547 71 b 564 72 560 71 563 71 b 580 121 580 79 580 102 l 580 127 b 543 203 585 158 573 184 b 472 259 518 219 495 238 l 445 285 b 590 292 494 288 541 291 b 622 318 609 294 618 302 b 628 359 625 331 626 346 b 586 402 632 393 621 405 b 464 395 546 399 504 396 l 559 491 b 567 524 567 500 567 510 b 564 543 567 527 567 536 b 539 596 559 563 560 590 b 494 564 521 600 508 577 b 340 413 442 514 390 464 l 340 560 b 287 664 340 600 321 632 b 271 518 274 612 272 566 b 268 445 269 494 269 469 b 117 569 219 488 168 530 b 96 579 109 575 102 579 b 85 560 89 579 85 573 b 124 446 85 518 82 477 b 209 380 153 426 181 403 b 45 374 154 377 99 376 b 0 324 9 374 0 359 b 63 266 0 265 1 265 b 144 272 89 269 117 272 l 196 272 b 108 193 167 246 138 219 b 60 135 76 164 60 151 b 99 73 60 121 73 105 b 104 68 101 72 102 71 b 114 58 107 60 111 58 b 130 66 120 58 124 62 b 259 186 173 107 217 145 b 256 117 259 163 256 140 b 311 13 256 72 271 37 b 330 0 317 10 323 0 z',\n },\n pictChokeCymbal: {\n x_min: 1,\n x_max: 147,\n y_min: 0,\n y_max: 242,\n ha: 242,\n o: 'm 79 4 b 207 158 153 32 192 88 b 212 200 210 173 212 187 b 143 336 212 253 187 298 b 98 348 131 344 115 348 b 4 295 60 348 16 327 b 1 276 1 289 1 282 b 9 249 1 266 3 258 b 121 183 35 206 72 183 b 156 186 132 183 144 183 b 26 53 134 115 91 73 b 7 39 13 49 7 45 b 19 20 7 33 12 27 b 59 0 30 9 43 0 b 79 4 65 0 72 1 z',\n },\n wiggleArpeggiatoUp: {\n x_min: -22,\n x_max: 300,\n y_min: 0,\n y_max: 176,\n ha: 176,\n o: 'm 173 4 b 196 0 180 1 189 0 b 246 26 215 0 230 9 b 301 117 271 53 285 85 b 312 131 305 125 307 131 b 327 124 315 131 321 128 b 373 86 341 112 353 101 b 412 69 389 75 402 69 b 432 94 425 69 432 79 b 373 181 432 117 413 154 b 235 252 323 216 285 245 b 220 253 229 253 225 253 b 168 215 196 253 181 240 b 111 112 151 180 140 141 b 94 102 105 105 99 102 b 78 111 89 102 84 105 b 0 181 55 135 35 160 b -32 153 -20 194 -32 168 b 0 86 -32 124 -32 109 b 94 36 22 71 73 46 b 173 4 134 16 131 17 z',\n },\n arpeggiatoUp: {\n x_min: 0,\n x_max: 262,\n y_min: 0,\n y_max: 1459,\n ha: 1459,\n o: 'm 190 0 b 160 63 187 29 170 45 b 145 108 150 81 145 95 b 183 163 145 128 157 145 b 300 246 222 190 262 216 b 347 318 333 272 347 295 b 301 393 347 341 331 364 b 258 413 289 403 272 408 b 145 449 220 425 183 436 b 117 464 135 452 120 452 b 140 491 115 477 128 484 b 294 593 192 526 243 557 b 330 647 318 611 330 626 b 314 693 330 660 324 675 b 262 736 302 714 285 729 b 170 763 230 744 200 753 b 122 783 153 768 125 768 b 160 831 120 804 143 818 b 288 922 202 861 246 890 b 333 999 318 945 333 972 b 266 1083 333 1032 310 1064 b 189 1115 240 1094 215 1103 b 122 1178 145 1133 122 1153 b 168 1250 122 1200 138 1223 l 180 1257 b 269 1333 210 1283 240 1306 b 305 1405 294 1356 305 1381 b 284 1469 305 1426 298 1447 b 228 1525 269 1492 251 1511 b 183 1600 197 1545 183 1571 b 190 1640 183 1613 184 1626 b 197 1670 193 1650 194 1660 b 272 1735 213 1719 230 1735 b 295 1734 279 1735 287 1735 b 323 1732 305 1732 314 1732 b 350 1731 333 1732 341 1732 b 377 1742 369 1729 377 1732 b 370 1761 377 1747 374 1754 l 301 1898 b 217 2066 274 1954 248 2012 b 186 2101 204 2089 196 2101 b 154 2069 177 2101 167 2091 b 12 1824 105 1987 59 1907 b 0 1787 4 1810 0 1797 b 59 1744 0 1761 20 1745 b 160 1738 92 1744 125 1740 b 145 1692 156 1721 151 1706 b 135 1633 138 1672 135 1652 b 184 1518 135 1591 151 1552 b 229 1475 199 1503 213 1488 b 259 1431 249 1456 259 1444 b 229 1388 259 1420 249 1407 b 151 1325 203 1365 177 1345 b 105 1279 134 1310 118 1296 b 73 1202 84 1251 73 1227 b 108 1123 73 1176 85 1152 b 255 1031 148 1077 199 1051 b 282 1014 274 1025 282 1021 b 262 991 282 1008 275 1001 b 151 914 226 963 189 939 b 79 851 125 896 99 877 b 63 809 69 837 63 824 b 79 769 63 796 68 783 b 202 697 111 729 154 710 b 266 670 225 690 266 688 b 210 622 266 648 232 635 b 82 534 167 593 120 570 b 55 491 63 518 55 505 b 79 448 55 478 63 465 b 255 361 127 395 192 380 b 288 343 269 359 288 357 b 266 312 288 331 275 320 b 144 223 229 278 184 253 b 85 134 104 193 85 166 b 118 53 85 111 96 85 b 190 0 135 29 160 14 z',\n },\n arpeggiatoDown: {\n x_min: 0,\n x_max: 218,\n y_min: 0,\n y_max: 1440,\n ha: 1440,\n o: 'm 161 16 b 310 261 210 98 259 180 b 314 275 312 266 314 271 b 302 295 314 282 310 289 b 252 311 287 308 269 311 b 217 310 240 311 229 310 b 190 333 202 310 194 315 b 151 412 186 363 171 389 b 102 501 120 452 102 477 b 150 588 102 524 118 547 b 161 603 154 592 158 598 b 181 661 176 622 181 641 b 173 704 181 675 179 690 b 86 795 156 746 121 770 b 53 829 63 811 53 819 b 78 868 53 840 62 851 b 102 888 85 876 94 883 b 180 956 128 912 156 933 b 216 1028 204 979 216 1002 b 203 1081 216 1044 212 1061 b 115 1171 186 1123 148 1145 b 75 1221 88 1191 75 1207 b 114 1272 75 1237 88 1251 b 173 1308 132 1284 154 1296 b 226 1339 190 1318 209 1328 b 265 1405 253 1359 265 1380 b 258 1447 265 1418 264 1431 b 154 1541 242 1499 199 1521 b 109 1581 124 1555 109 1567 b 141 1627 109 1594 121 1608 b 204 1680 163 1646 184 1662 b 233 1742 223 1699 233 1719 b 226 1777 233 1752 230 1764 b 135 1862 210 1822 173 1840 b 104 1895 114 1875 104 1884 b 118 1930 104 1904 109 1914 b 192 2006 135 1961 161 1986 b 206 2029 203 2013 206 2022 b 192 2064 206 2040 197 2052 b 180 2074 187 2071 184 2074 b 156 2061 171 2074 163 2065 b 84 1983 125 2040 102 2013 b 65 1921 71 1961 65 1941 b 88 1853 65 1899 72 1876 b 171 1784 108 1820 138 1801 b 190 1764 184 1777 190 1770 b 174 1741 190 1757 184 1750 b 107 1683 153 1722 128 1704 b 68 1610 81 1659 68 1636 b 88 1548 68 1591 75 1571 b 177 1470 109 1512 141 1489 b 223 1431 209 1453 223 1443 b 179 1390 223 1420 209 1408 b 128 1361 163 1380 145 1371 b 71 1322 108 1348 88 1338 b 32 1253 45 1300 32 1277 b 48 1198 32 1236 37 1218 b 147 1090 71 1152 108 1120 b 174 1057 166 1076 174 1067 b 153 1022 174 1047 167 1037 b 109 982 140 1008 124 995 b 37 919 85 962 59 942 b 9 860 17 899 9 880 b 26 806 9 844 14 827 b 120 717 50 769 84 740 b 138 691 132 708 138 700 b 130 668 138 684 135 677 b 92 618 118 651 105 635 b 59 531 71 589 59 560 b 84 455 59 507 68 481 b 132 386 98 431 115 408 b 148 341 144 372 148 357 b 144 317 148 333 147 324 b 121 305 140 307 131 305 l 98 305 b 82 304 94 304 88 304 l 32 304 b 0 292 10 304 0 302 b 12 266 0 287 4 279 b 60 164 32 233 46 199 b 127 20 84 117 105 68 b 144 0 132 9 137 0 b 161 16 150 0 154 4 z',\n },\n repeat1Bar: {\n x_min: 0,\n x_max: 599.1057280164835,\n y_min: -250,\n y_max: 175,\n ha: 425,\n o: 'm 216 98 b 255 75 236 84 246 75 b 291 104 265 75 274 85 b 323 147 304 117 327 125 b 289 215 323 168 314 184 b 238 252 269 239 253 252 b 187 222 222 252 207 242 b 173 206 183 216 177 212 b 157 170 163 194 157 183 b 174 138 157 160 161 150 b 216 98 189 127 200 109 z m 76 -334 b 181 -285 111 -315 148 -302 b 831 52 396 -168 613 -58 b 863 114 855 63 864 82 b 828 202 855 140 855 176 b 808 213 821 209 815 213 b 793 209 804 213 799 212 l 422 19 b 26 -179 291 -48 164 -124 b 0 -213 10 -186 0 -196 b 3 -232 0 -219 0 -225 b 52 -325 14 -265 37 -294 b 66 -337 55 -331 59 -337 b 76 -334 69 -337 72 -336 z m 769 -360 b 829 -264 779 -360 829 -284 b 769 -176 822 -232 799 -200 b 742 -163 760 -167 750 -163 b 716 -184 733 -163 723 -168 b 683 -228 708 -202 693 -213 b 672 -253 675 -236 672 -245 b 683 -281 672 -262 675 -271 b 752 -353 703 -308 732 -327 b 769 -360 756 -357 763 -360 z',\n },\n repeat2Bars: {\n x_min: 0.008571918423331715,\n x_max: 775,\n y_min: -246.92374029115243,\n y_max: 362.82068246705313,\n ha: 609.7444227582056,\n o: 'm 909 412 b 873 351 906 384 893 367 b 436 50 729 249 585 147 l 91 -179 b 62 -174 76 -189 68 -183 b 12 -96 48 -147 24 -125 b 36 -16 -7 -53 -6 -43 b 220 104 96 24 158 65 b 819 507 425 232 624 369 b 881 495 852 530 861 528 b 909 412 899 469 900 439 z m 333 338 b 302 240 330 307 317 274 b 276 235 297 225 287 228 l 233 269 b 203 376 186 307 183 318 b 225 441 212 397 217 419 b 246 454 228 452 232 458 b 333 338 284 441 333 380 z m 1116 228 b 1067 158 1115 192 1092 174 b 910 59 1015 125 963 92 b 478 -240 762 -33 622 -140 b 311 -350 423 -279 366 -314 b 285 -344 298 -360 289 -356 b 239 -258 272 -314 251 -288 b 261 -196 228 -228 235 -210 b 517 -29 348 -144 436 -91 b 1030 321 681 98 861 202 b 1093 307 1060 343 1076 340 b 1116 228 1107 281 1109 252 z m 1070 -105 b 1020 -210 1057 -143 1038 -176 b 998 -210 1014 -219 1004 -215 l 924 -153 b 913 -88 899 -135 897 -112 b 949 -22 926 -66 939 -45 b 998 -7 960 6 976 9 b 1070 -105 1032 -32 1058 -63 z',\n },\n repeat4Bars: {\n x_min: 0,\n x_max: 1374,\n y_min: -304,\n y_max: 304,\n ha: 608,\n o: 'm 78 -266 b 92 -258 82 -266 88 -264 b 114 -240 98 -251 107 -246 b 638 107 289 -125 467 -14 b 873 271 716 161 793 216 b 907 337 894 285 906 305 b 887 400 901 354 897 379 b 852 438 877 426 867 438 b 814 420 842 438 829 432 b 135 -33 592 262 366 111 b 12 -121 92 -60 48 -84 b 0 -144 4 -128 0 -135 b 4 -160 0 -148 1 -154 b 63 -255 17 -196 45 -223 b 78 -266 68 -262 72 -266 z m 291 148 b 325 223 302 148 308 170 b 333 256 328 235 330 246 b 264 363 330 305 298 336 b 242 373 255 369 248 373 b 220 347 232 373 225 364 b 202 288 216 327 213 305 b 190 252 193 275 190 262 b 222 200 190 232 202 215 b 291 148 264 170 279 148 z m 815 -367 b 829 -359 819 -367 824 -364 b 851 -343 835 -353 844 -347 b 1375 6 1027 -228 1205 -117 l 1610 170 b 1644 235 1632 184 1643 203 b 1626 300 1639 253 1634 276 b 1590 337 1614 325 1604 337 b 1551 320 1580 337 1567 330 b 873 -135 1329 161 1103 10 b 749 -222 829 -161 785 -184 b 737 -245 742 -230 737 -238 b 742 -261 737 -249 739 -255 b 802 -357 755 -297 782 -325 b 815 -367 805 -363 809 -367 z m 396 -360 b 408 -356 400 -360 403 -359 b 609 -223 471 -307 543 -269 b 896 -19 706 -156 795 -81 b 1164 154 985 37 1074 96 b 1214 223 1189 170 1211 187 b 1176 321 1204 253 1205 292 b 1159 330 1169 327 1165 330 b 1145 324 1155 330 1151 328 b 1048 258 1113 302 1081 278 b 357 -202 809 117 598 -65 b 333 -238 341 -212 333 -223 b 338 -262 333 -245 334 -253 b 384 -350 350 -294 372 -318 b 396 -360 386 -354 390 -360 z m 1162 -438 b 1174 -433 1166 -438 1169 -436 b 1374 -300 1237 -384 1309 -346 b 1660 -96 1470 -233 1561 -158 b 1930 76 1751 -39 1840 19 b 1979 147 1954 92 1977 109 b 1943 243 1968 177 1971 216 b 1924 253 1935 251 1930 253 b 1911 248 1920 253 1915 252 b 1814 181 1878 225 1848 202 b 1123 -279 1575 40 1364 -141 b 1099 -315 1106 -289 1099 -300 b 1103 -338 1099 -321 1100 -330 b 1149 -426 1115 -370 1138 -396 b 1162 -438 1151 -432 1156 -438 z m 1875 -295 b 1882 -291 1878 -295 1879 -294 b 1934 -189 1904 -258 1921 -223 b 1872 -96 1925 -147 1901 -120 b 1840 -78 1858 -84 1848 -78 b 1812 -109 1830 -78 1823 -88 l 1777 -173 b 1770 -199 1773 -181 1770 -190 b 1786 -230 1770 -210 1774 -220 b 1862 -289 1809 -253 1837 -269 b 1875 -295 1865 -292 1871 -295 z',\n },\n repeatBarSlash: {\n x_min: 0,\n x_max: 630,\n y_min: -225.19160170741762,\n y_max: 265.12618221237005,\n ha: 490.31778391978764,\n o: 'm 78 -324 b 92 -314 82 -325 88 -321 b 114 -298 96 -307 107 -302 b 638 49 289 -183 467 -72 b 873 215 716 104 792 161 b 907 279 894 229 906 248 b 887 344 901 298 897 321 b 852 382 877 369 867 380 b 814 363 842 383 829 376 b 135 -91 603 192 364 55 b 12 -177 92 -118 45 -137 b 0 -202 4 -186 0 -192 b 4 -217 0 -206 1 -212 b 63 -312 17 -253 42 -284 b 78 -324 68 -318 72 -323 z',\n },\n csymDiminished: {\n x_min: 0,\n x_max: 506,\n y_min: -0.011036179317259481,\n y_max: 500,\n ha: 500.0110361793173,\n o: 'm 397 0 b 729 265 576 -1 729 95 b 711 367 729 297 723 331 b 472 670 668 498 586 595 b 315 720 423 701 372 720 b 253 713 295 720 275 719 b 32 514 144 687 75 615 b 0 374 12 468 0 420 b 27 251 0 333 9 292 b 140 117 52 196 92 153 b 397 0 223 52 317 4 z m 340 95 b 132 314 233 84 122 216 b 324 589 145 438 200 539 b 415 611 360 603 389 611 b 544 505 469 611 505 576 b 590 392 564 471 583 432 b 596 343 593 374 596 359 b 340 95 596 210 485 96 z',\n },\n csymHalfDiminished: {\n x_min: -32,\n x_max: 496,\n y_min: -33,\n y_max: 492,\n ha: 525,\n o: 'm -29 -48 b 0 -36 -19 -48 -9 -40 b 17 -20 7 -32 12 -24 b 134 94 56 19 95 56 b 372 0 207 43 282 0 b 455 13 397 0 426 4 b 677 258 556 45 671 141 b 678 289 677 268 678 278 b 593 539 678 380 654 467 b 592 541 593 540 592 540 l 684 632 b 713 678 700 647 711 665 b 714 691 714 684 714 688 b 707 704 714 698 711 701 b 691 708 701 707 696 708 b 660 691 680 708 670 701 l 552 585 b 478 634 530 606 507 624 b 361 684 438 648 397 661 b 301 703 341 697 320 703 b 226 677 275 703 251 693 b 27 449 140 618 72 543 b 0 324 9 410 -4 370 b 88 128 -1 243 30 177 b -30 -7 43 86 0 46 b -46 -33 -35 -16 -46 -24 b -42 -42 -46 -36 -45 -39 b -29 -48 -37 -46 -33 -48 z m 141 179 b 121 251 128 200 121 225 b 128 297 121 265 124 281 b 351 575 163 420 248 505 b 377 582 359 579 369 580 b 501 536 422 586 468 567 b 141 179 382 416 261 298 z m 281 105 b 179 137 240 105 206 117 b 210 168 189 147 200 157 l 537 487 b 547 455 541 477 544 467 b 556 370 552 426 556 397 b 429 154 556 274 503 207 b 281 105 384 122 336 105 z',\n },\n csymAugmented: {\n x_min: 0,\n x_max: 530,\n y_min: 0,\n y_max: 539,\n ha: 539,\n o: 'm 380 0 b 393 14 384 4 390 9 b 397 46 397 24 397 36 l 397 333 b 736 327 511 331 624 330 b 763 343 755 327 763 333 b 755 361 763 348 760 354 b 635 431 726 402 688 431 l 390 431 l 390 485 b 386 606 392 526 386 566 b 392 664 386 625 387 645 b 395 690 393 672 395 681 b 376 753 395 711 389 734 b 357 776 372 762 369 776 b 350 775 354 776 353 776 b 327 740 337 769 327 759 b 327 621 328 700 327 661 b 330 438 328 559 328 498 l 29 438 b 4 431 20 438 7 442 b 0 413 3 425 0 419 b 7 399 0 408 1 403 b 131 338 45 369 85 340 b 331 334 199 336 265 334 b 333 163 333 276 333 220 b 366 13 333 109 348 63 b 380 0 367 7 374 4 z',\n },\n csymMajorSeventh: {\n x_min: 0,\n x_max: 593.1050509327923,\n y_min: 0,\n y_max: 569,\n ha: 569,\n o: 'm 124 1 l 497 27 b 819 50 605 35 711 43 b 854 98 847 52 855 63 b 812 200 845 128 835 166 b 564 585 730 328 648 456 b 435 786 521 652 480 720 b 397 819 419 809 408 819 b 369 792 387 819 379 811 b 7 173 248 585 128 379 b 0 150 3 166 0 158 b 7 128 0 143 3 135 b 89 10 30 86 65 50 b 109 0 95 1 102 0 z m 163 147 b 153 153 158 147 156 148 b 164 179 147 163 158 170 b 426 644 251 334 338 488 b 442 660 432 655 436 660 b 458 645 446 660 452 655 b 727 220 547 503 636 361 b 736 202 732 213 736 206 b 714 190 736 196 730 192 b 179 148 537 177 359 163 b 163 147 174 150 168 147 z',\n },\n csymMinor: {\n x_min: 0,\n x_max: 481.64484584675915,\n y_min: 193,\n y_max: 265.20435472429375,\n ha: 72.20435472429375,\n o: 'm 168 278 b 197 279 177 278 187 278 b 431 292 275 287 353 288 l 431 291 b 661 302 508 295 585 300 b 693 311 672 304 688 300 b 674 346 697 324 685 338 b 564 382 641 366 606 384 l 27 360 b 0 347 17 360 1 366 b 19 314 0 333 3 321 b 168 278 66 291 115 278 z',\n },\n csymParensLeftTall: {\n x_min: 0,\n x_max: 185,\n y_min: 0,\n y_max: 1034,\n ha: 1034,\n o: 'm 215 0 b 226 17 223 1 223 10 b 229 37 229 24 229 32 b 220 81 229 52 225 66 b 167 203 206 124 181 160 b 86 616 124 338 89 474 b 82 765 85 665 82 716 b 91 886 82 805 84 845 b 245 1319 120 1038 171 1184 b 266 1397 259 1346 266 1371 b 259 1443 266 1411 264 1427 b 226 1489 253 1463 248 1489 b 193 1454 212 1489 203 1467 b 114 1292 158 1404 140 1346 b 0 806 40 1138 0 978 b 3 721 0 779 0 750 b 1 677 1 707 1 693 b 36 418 1 593 16 504 b 144 96 62 307 95 199 b 196 12 158 66 179 39 b 212 0 200 7 204 0 z',\n },\n csymParensRightTall: {\n x_min: -40,\n x_max: 188.5411603861406,\n y_min: 0.20204102886728756,\n y_max: 1058,\n ha: 1057.7979589711326,\n o: 'm 30 1 b 63 14 42 -3 55 6 b 122 99 86 40 108 68 b 189 258 145 153 166 204 b 271 667 239 379 268 503 b 246 852 275 708 261 780 b 10 1495 197 1077 128 1295 b -14 1524 4 1505 1 1524 b -16 1522 -14 1524 -16 1524 b -46 1489 -33 1521 -43 1503 b -58 1417 -53 1464 -58 1440 b -36 1335 -58 1390 -52 1364 b 68 1138 0 1270 35 1204 b 163 883 108 1056 137 969 b 206 668 184 814 200 742 b 207 631 207 655 207 642 b 166 426 207 560 192 492 b 46 143 130 330 111 228 b 19 29 19 109 17 69 b 30 1 20 19 24 3 z',\n },\n csymBracketLeftTall: {\n x_min: 0,\n x_max: 328,\n y_min: 2,\n y_max: 807,\n ha: 805,\n o: 'm 68 3 b 76 4 71 3 73 3 b 186 13 112 12 150 13 b 240 13 204 13 222 13 l 287 13 b 379 17 317 13 348 13 b 472 121 435 24 472 69 b 467 156 472 132 469 144 b 446 174 462 168 456 174 l 439 174 b 327 166 402 167 364 166 b 265 167 307 166 285 167 l 209 167 b 187 475 199 269 189 372 b 166 985 186 645 187 815 l 377 1002 b 415 1001 389 1002 402 1001 b 456 1027 432 1001 448 1005 b 472 1096 467 1048 472 1073 b 464 1146 472 1113 469 1130 b 439 1162 459 1161 452 1162 b 40 1129 305 1151 173 1139 b 1 1093 17 1128 1 1120 b 0 1009 0 1064 0 1037 b 13 975 0 991 3 981 b 30 670 23 873 30 772 b 29 608 30 649 29 628 l 29 563 b 56 88 29 405 49 246 b 53 22 55 66 55 43 b 68 3 53 12 56 3 z',\n },\n csymBracketRightTall: {\n x_min: 0.8519422934604696,\n x_max: 306,\n y_min: -0.17180889215212544,\n y_max: 829.1037519824849,\n ha: 829.2755608746371,\n o: 'm 117 0 b 372 29 203 -3 287 20 l 373 29 b 406 32 383 30 395 30 b 436 60 428 33 432 43 b 441 109 439 76 441 92 b 433 200 441 140 436 170 b 409 696 422 366 409 530 b 416 887 409 763 416 831 b 415 920 416 899 415 910 l 415 1106 b 412 1135 415 1116 415 1126 l 412 1145 b 373 1189 413 1171 408 1192 b 321 1189 356 1189 338 1189 l 215 1189 l 215 1194 l 56 1194 b 6 1153 27 1195 10 1187 b 1 1064 3 1123 4 1093 b 22 1043 0 1050 6 1043 b 84 1044 42 1044 63 1044 b 264 1038 144 1044 203 1040 b 265 958 264 1011 265 985 b 262 845 265 920 264 883 b 259 710 259 801 259 755 b 279 243 259 554 271 399 b 285 170 281 219 284 194 b 95 151 222 161 158 156 b 29 81 27 147 27 147 l 29 73 b 105 0 33 0 33 0 z',\n },\n csymParensLeftVeryTall: {\n x_min: 0,\n x_max: 116,\n y_min: 0,\n y_max: 934.1531437146923,\n ha: 934.1531437146923,\n o: 'm 128 0 b 147 17 137 0 144 9 b 167 102 160 45 167 73 b 158 154 167 120 164 137 b 117 307 141 204 130 256 b 63 698 84 435 71 567 b 62 788 62 729 62 757 b 69 916 62 829 63 873 b 109 1172 81 1001 94 1087 b 132 1320 118 1221 137 1269 b 124 1345 131 1329 134 1342 b 96 1332 114 1346 102 1341 b 71 1269 82 1313 75 1292 b 39 1104 59 1214 48 1159 b 0 742 19 988 0 871 b 10 559 3 688 6 624 b 58 226 16 446 33 336 b 112 20 73 157 94 89 b 128 0 115 13 118 0 z',\n },\n csymParensRightVeryTall: {\n x_min: -20,\n x_max: 111.4332498248095,\n y_min: -0.07657185734616112,\n y_max: 1009,\n ha: 1009.0765718573462,\n o: 'm -3 0 b 20 22 9 -1 14 12 b 36 56 26 33 32 45 b 99 274 58 128 84 199 b 160 788 135 439 163 605 b 122 1181 164 912 145 1047 b 50 1431 108 1267 86 1351 b 36 1453 48 1439 46 1453 l 35 1453 l 30 1453 b 7 1423 17 1449 7 1440 b 27 1287 9 1377 10 1331 b 96 963 71 1184 85 1074 b 105 818 102 914 105 867 b 91 624 105 753 99 688 b -4 213 72 484 48 344 b -29 101 -19 174 -29 138 b -16 27 -29 76 -24 52 b -3 0 -13 17 -14 3 z',\n },\n csymDiagonalArrangementSlash: {\n x_min: -0.19862981551275186,\n x_max: 990,\n y_min: -26.946823529189132,\n y_max: 1027.5514326488437,\n ha: 1054.4982561780328,\n o: 'm 14 -37 b 58 -9 35 -45 46 -22 b 392 333 170 105 279 217 l 765 711 b 1372 1329 968 916 1168 1125 b 1424 1439 1403 1359 1417 1397 b 1426 1457 1424 1444 1426 1450 b 1416 1477 1426 1466 1423 1475 b 1374 1462 1400 1485 1385 1473 b 1181 1269 1309 1397 1246 1331 b 736 831 1031 1122 884 979 b 356 452 609 704 485 576 b 32 132 246 347 143 236 b 0 50 7 109 1 84 b 6 9 -1 37 3 23 b 14 -37 10 -9 0 -32 z',\n },\n accidentalNarrowReversedFlat: {\n x_min: 0,\n x_max: 208,\n y_min: -231,\n y_max: 449,\n ha: 680,\n o: 'm 272 -333 b 284 -320 278 -333 281 -328 b 300 -174 297 -272 300 -222 b 275 190 298 -52 279 68 b 268 445 272 275 268 360 l 268 490 b 264 612 269 530 265 572 b 236 647 264 632 252 645 l 235 647 b 217 618 220 647 220 628 b 207 526 210 588 207 556 b 210 432 207 494 210 464 b 216 268 213 377 215 323 l 216 230 l 215 232 b 154 256 194 240 174 251 b 111 264 138 261 124 264 b 3 153 50 264 10 223 b 0 94 0 132 0 114 b 194 -276 0 -63 68 -186 b 255 -323 215 -291 236 -307 b 272 -333 262 -330 268 -333 z m 233 -138 b 71 30 168 -92 105 -45 b 63 59 65 42 63 50 b 96 95 62 75 73 86 b 130 102 108 99 120 102 b 215 76 160 102 187 88 l 220 73 b 225 -22 220 42 222 10 b 233 -138 229 -62 230 -101 z',\n },\n accidentalNarrowReversedFlatAndFlat: {\n x_min: 0,\n x_max: 335,\n y_min: -231,\n y_max: 449,\n ha: 680,\n o: 'm 151 490 b 148 612 151 530 150 572 b 132 647 148 632 141 645 b 122 618 124 647 124 628 b 117 526 118 588 117 556 b 118 432 117 494 118 464 b 121 268 120 377 121 323 l 121 232 b 86 256 109 240 98 251 b 62 264 78 261 69 264 b 1 153 29 264 6 223 b 0 94 0 132 0 114 b 109 -276 0 -63 37 -186 b 144 -323 121 -291 132 -307 b 153 -333 147 -330 151 -333 b 160 -320 157 -333 158 -328 b 168 -174 167 -272 168 -222 b 154 190 168 -52 157 68 b 151 445 153 275 151 360 z m 480 153 b 372 264 472 223 432 264 b 328 256 359 264 344 261 b 268 232 308 251 288 240 l 266 230 l 266 268 b 272 432 266 323 269 377 b 275 526 272 464 275 494 b 265 618 275 556 272 588 b 248 647 262 628 262 647 l 246 647 b 219 612 230 645 219 632 b 215 490 217 572 213 530 l 215 445 b 207 190 215 360 210 275 b 183 -174 203 68 183 -52 b 199 -320 183 -222 186 -272 b 210 -333 202 -328 204 -333 b 228 -323 215 -333 220 -330 b 288 -276 246 -307 268 -291 b 482 94 415 -186 482 -63 b 480 153 482 114 482 132 z m 40 30 b 36 59 36 42 36 50 b 55 95 35 75 42 86 b 73 102 60 99 68 102 b 121 76 89 102 105 88 l 124 73 b 127 -22 124 42 125 10 l 131 -138 b 40 30 95 -92 60 -43 z m 419 59 b 412 30 419 50 418 42 b 249 -138 374 -43 314 -92 b 258 -22 252 -101 253 -62 b 262 73 261 10 262 42 l 268 76 b 353 102 295 88 323 102 b 386 95 363 102 374 99 b 419 59 409 86 420 75 z',\n },\n accidentalWilsonPlus: {\n x_min: 0,\n x_max: 298,\n y_min: -218,\n y_max: 218,\n ha: 436,\n o: 'm 232 -314 b 236 -301 236 -310 236 -305 l 236 -295 b 243 -52 239 -213 242 -132 l 369 62 b 429 200 413 101 425 147 b 416 243 429 216 428 236 b 383 225 406 251 393 232 l 377 220 b 246 98 336 177 291 138 b 249 242 248 145 246 193 b 225 304 251 265 242 287 b 209 314 220 308 215 314 b 204 312 207 314 206 312 b 196 292 196 310 196 300 b 193 184 194 256 194 220 b 187 48 192 140 190 94 b 46 -72 141 7 94 -32 b 0 -163 13 -98 0 -127 b 1 -187 0 -170 0 -179 b 10 -235 4 -203 6 -219 b 20 -255 12 -242 14 -251 b 36 -245 26 -259 30 -249 b 181 -109 85 -200 132 -154 b 176 -258 180 -158 176 -209 b 232 -314 176 -298 186 -307 z',\n },\n accidentalWilsonMinus: {\n x_min: 0,\n x_max: 284.2093390143919,\n y_min: -163,\n y_max: 163,\n ha: 326,\n o: 'm 386 -232 b 409 -163 415 -222 408 -180 b 382 -69 410 -120 408 -89 b 32 228 264 30 141 118 b 17 235 26 233 22 235 b 3 219 9 235 3 228 b 0 157 3 199 0 179 b 29 69 0 125 6 95 b 323 -194 115 -29 222 -111 b 374 -235 338 -206 353 -235 b 386 -232 377 -235 382 -233 z',\n },\n },\n fontFamily: 'Petaluma',\n resolution: 1000,\n generatedOn: '2021-12-06T21:04:23.441Z',\n};\n","/**\n * The Petaluma font was created by Steinberg Media.\n * https://github.com/steinbergmedia/petaluma\n */\nexport const PetalumaMetrics = {\n name: 'Petaluma',\n smufl: true,\n stave: {\n padding: 15,\n endPaddingMax: 15,\n endPaddingMin: 7,\n unalignedNotePadding: 12,\n },\n accidental: {\n noteheadAccidentalPadding: 1,\n leftPadding: 2,\n accidentalSpacing: 3,\n },\n clef: {\n default: {\n point: 32,\n width: 26,\n },\n small: {\n point: 26,\n width: 20,\n },\n annotations: {\n '8va': {\n smuflCode: 'timeSig8',\n default: {\n point: 18,\n treble: {\n line: -1.4,\n shiftX: 12,\n },\n },\n small: {\n point: 16,\n treble: {\n line: -0.2,\n shiftX: 8,\n },\n },\n },\n '8vb': {\n smuflCode: 'timeSig8',\n default: {\n point: 18,\n treble: {\n line: 6,\n shiftX: 10,\n },\n bass: {\n line: 3.5,\n shiftX: 1,\n },\n },\n small: {\n point: 16,\n treble: {\n line: 5.3,\n shiftX: 6,\n },\n bass: {\n line: 3.1,\n shiftX: 0.5,\n },\n },\n },\n },\n // These may no longer be necessary\n lineCount: {\n '8': { point: 55, shiftY: 14 },\n '7': { point: 47, shiftY: 8 },\n '6': { point: 32, shiftY: 1 },\n '5': { point: 30, shiftY: -6 },\n '4': { point: 23, shiftY: -12 },\n },\n },\n parenthesis: {\n default: {\n point: 39,\n width: 7,\n },\n gracenote: {\n point: (39 * 3) / 5,\n width: 3,\n },\n },\n pedalMarking: {\n up: {\n point: 40,\n },\n down: {\n point: 34,\n },\n },\n // These are for numeric digits, such as in time signatures\n digits: {\n // used by timesig\n shiftLine: -1,\n point: 22,\n // used by tuplets\n tupletPoint: 16,\n shiftY: -2,\n },\n articulation: {\n articStaccatissimoAbove: {\n padding: 2,\n },\n articStaccatissimoBelow: {\n padding: 2,\n },\n },\n tremolo: {\n default: {\n point: 25,\n spacing: 5,\n offsetYStemUp: -5,\n offsetYStemDown: 5,\n offsetXStemUp: 13,\n offsetXStemDown: 1,\n },\n grace: {\n point: 18,\n spacing: 4,\n offsetYStemUp: -5,\n offsetYStemDown: 5,\n offsetXStemUp: 8,\n offsetXStemDown: 1,\n },\n },\n staveRepetition: {\n default: {\n offsetY: 25,\n offsetSymbol: 12,\n spacing: 5,\n },\n },\n noteHead: {\n displaced: {\n shiftX: -2,\n },\n },\n stem: {\n heightAdjustmentForFlag: -3,\n // These are stem (Y) offsets to the note heads. To shift the\n // noteheads (x-position) themselves, see glyphs.notehead.custom.\n noteHead: {\n noteheadTriangleUpHalf: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpBlack: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpWhole: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadXHalf: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXBlack: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXWhole: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadHalf: {\n offsetYBaseStemDown: 1.8,\n offsetYBaseStemUp: -1.8,\n },\n noteheadBlack: {\n offsetYBaseStemDown: 2,\n offsetYBaseStemUp: -2,\n },\n noteheadSquareWhite: {\n offsetYBaseStemDown: -5,\n offsetYBaseStemUp: 5,\n },\n },\n },\n // Values under here are used by the Glyph class to reposition and rescale\n // glyphs based on their category. This should be the first stop for\n // custom font glyph repositioning.\n //\n // The glyph loader first looks up a specific set of settings based on the\n // glyph code, and if not found, uses the defaults from the category. See\n // glyphs.textNote for an example of this.\n //\n // Details in Glyph.lookupFontMetrics.\n glyphs: {\n coda: {\n point: 20,\n shiftX: -7,\n shiftY: 8,\n },\n segno: {\n shiftX: -7,\n },\n flag: {\n shiftX: -0.77,\n flag16thUp: {\n shiftX: -0.75,\n },\n flag32ndUp: {\n shiftX: -0.85,\n },\n flag64thUp: {\n shiftX: -1.55,\n },\n flag128thUp: {\n shiftX: -1.3,\n },\n flag16thDown: {\n shiftX: -0.75,\n },\n flag32ndDown: {\n shiftX: -0.76,\n },\n flag64thDown: {\n shiftX: -1.5,\n },\n flag128thDown: {\n shiftX: -1.2,\n },\n tabStem: {\n shiftX: -1.75,\n },\n staveTempo: {\n shiftX: -1,\n },\n },\n clef: {\n gClef: {\n default: { scale: 1.1, shiftY: 1 },\n small: { shiftY: 1.5 },\n },\n fClef: {\n default: { shiftY: -0.5 },\n },\n },\n ornament: {\n ornamentTurn: {\n scale: 1.2,\n },\n ornamentTurnSlash: {\n scale: 1.2,\n },\n },\n stringNumber: {\n verticalPadding: 8,\n stemPadding: 2,\n leftPadding: 5,\n rightPadding: 6,\n },\n stroke: {\n arrowheadBlackDown: {\n straight: {\n shiftX: -4.5,\n },\n wiggly: {\n shiftX: -1,\n shiftY: 1,\n },\n },\n arrowheadBlackUp: {\n straight: {\n shiftX: -0.85,\n },\n wiggly: {\n shiftX: -1,\n shiftY: 1,\n },\n },\n },\n textNote: {\n point: 34,\n breathMarkTick: {\n point: 36,\n shiftY: 9,\n },\n breathMarkComma: {\n point: 36,\n },\n segno: {\n point: 30,\n shiftX: -7,\n shiftY: 8,\n },\n coda: {\n point: 20,\n shiftX: -7,\n shiftY: 8,\n },\n ornamentTrill: {\n shiftX: -10,\n shiftY: 8,\n },\n ornamentMordent: {\n shiftX: -8,\n },\n ornamentShortTrill: {\n shiftX: -8,\n },\n },\n noteHead: {\n minPadding: 2,\n standard: {\n noteheadBlackStemUp: {\n shiftX: 0.5,\n },\n noteheadHalfStemUp: {\n shiftX: 0.725,\n },\n noteheadWholeStemUp: {\n shiftX: 1,\n },\n },\n custom: {\n noteheadCircleXStemUp: {\n shiftX: -1,\n },\n noteheadCircleXStemDown: {\n shiftX: 0.25,\n },\n noteheadDiamondHalfStemUp: {\n shiftX: 1.5,\n },\n noteheadDiamondBlackStemUp: {\n shiftX: 1.5,\n },\n noteheadDiamondWholeStemUp: {\n shiftX: 1,\n },\n noteheadXBlackStemUp: {\n shiftX: 1,\n },\n noteheadXHalfStemUp: {\n shiftX: -3,\n },\n noteheadXHalfStemDown: {\n shiftX: 1,\n },\n noteheadXWholeStemUp: {\n shiftX: -7,\n },\n noteheadXWholeStemDown: {\n shiftX: 1,\n },\n noteheadSquareWhiteStemDown: {\n shiftX: 0.25,\n },\n noteheadSquareWhiteStemUp: {\n shiftX: -0.75,\n },\n noteheadSquareBlackStemUp: {\n shiftX: -0.75,\n },\n noteheadTriangleUpWholeStemUp: {\n shiftX: -0.75,\n },\n },\n },\n chordSymbol: {\n global: {\n superscriptOffset: -400,\n subscriptOffset: 300,\n kerningOffset: -150,\n lowerKerningText: ['D', 'F', 'P', 'T', 'V', 'Y'],\n upperKerningText: ['L'],\n spacing: 20,\n superSubRatio: 0.73,\n },\n csymDiminished: {\n scale: 0.8,\n leftSideBearing: -95,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymHalfDiminished: {\n scale: 0.8,\n leftSideBearing: -32,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymAugmented: {\n scale: 1,\n leftSideBearing: -25,\n advanceWidth: 530,\n yOffset: 0,\n },\n csymParensLeftTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 155,\n yOffset: 150,\n },\n csymParensRightTall: {\n scale: 0.8,\n leftSideBearing: 40,\n advanceWidth: 189,\n yOffset: 150,\n },\n csymBracketLeftTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 328,\n yOffset: 0,\n },\n csymBracketRightTall: {\n scale: 0.8,\n leftSideBearing: 1,\n advanceWidth: 600,\n yOffset: 0,\n },\n csymParensLeftVeryTall: {\n scale: 0.95,\n leftSideBearing: 0,\n advanceWidth: 210,\n yOffset: 250,\n },\n csymParensRightVeryTall: {\n scale: 0.9,\n leftSideBearing: -100,\n advanceWidth: 111,\n yOffset: 250,\n },\n csymDiagonalArrangementSlash: {\n scale: 0.6,\n leftSideBearing: -1,\n advanceWidth: 990,\n yOffset: 0,\n },\n csymMinor: {\n scale: 0.7,\n leftSideBearing: 0,\n advanceWidth: 482,\n yOffset: 0,\n },\n csymMajorSeventh: {\n scale: 0.8,\n leftSideBearing: 100,\n yOffset: 0,\n advanceWidth: 600,\n },\n accidentalSharp: {\n scale: 0.7,\n leftSideBearing: 0,\n advanceWidth: 425,\n yOffset: -422,\n },\n accidentalFlat: {\n scale: 0.8,\n leftSideBearing: -10,\n advanceWidth: 228,\n yOffset: -284,\n },\n },\n jazzOrnaments: {\n brassScoop: {\n scale: 1.0,\n xOffset: -12,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 10,\n },\n brassDoitMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassFallLipShort: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassLiftMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 5,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassFallRoughMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 26,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassBend: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -8,\n stemUpYOffset: 28,\n reportedWidth: 5,\n },\n brassMuteClosed: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -8,\n stemUpYOffset: 26,\n reportedWidth: 5,\n },\n brassMuteOpen: {\n scale: 1.0,\n xOffset: 4,\n yOffset: -8,\n stemUpYOffset: 27,\n reportedWidth: 5,\n },\n brassFlip: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassJazzTurn: {\n scale: 1.0,\n xOffset: 6,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassSmear: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n },\n tuplet: {\n noteHeadOffset: 20,\n stemOffset: 10,\n bottomLine: 4,\n topModifierOffset: 20,\n },\n },\n};\n","export const PetalumaScriptFont = {\n spacing: 50,\n glyphs: {\n ' ': {\n x_min: 0,\n x_max: 250,\n y_min: 0,\n y_max: 500,\n ha: 500,\n leftSideBearing: 0,\n advanceWidth: 250,\n },\n '0': {\n x_min: 33,\n x_max: 534,\n y_min: -13,\n y_max: 751,\n ha: 764,\n leftSideBearing: 33,\n advanceWidth: 570,\n },\n '1': {\n x_min: 48,\n x_max: 235,\n y_min: -17,\n y_max: 734,\n ha: 751,\n leftSideBearing: 48,\n advanceWidth: 286,\n },\n '2': {\n x_min: 56,\n x_max: 571,\n y_min: -19,\n y_max: 741,\n ha: 760,\n leftSideBearing: 56,\n advanceWidth: 626,\n },\n '3': {\n x_min: 50,\n x_max: 528,\n y_min: -7,\n y_max: 731,\n ha: 738,\n leftSideBearing: 50,\n advanceWidth: 589,\n },\n '4': {\n x_min: 38,\n x_max: 564,\n y_min: -13,\n y_max: 743,\n ha: 756,\n leftSideBearing: 38,\n advanceWidth: 614,\n },\n '5': {\n x_min: 42,\n x_max: 601,\n y_min: -34,\n y_max: 743,\n ha: 777,\n leftSideBearing: 42,\n advanceWidth: 648,\n },\n '6': {\n x_min: 47,\n x_max: 606,\n y_min: -16,\n y_max: 743,\n ha: 759,\n leftSideBearing: 47,\n advanceWidth: 667,\n },\n '7': {\n x_min: 47,\n x_max: 567,\n y_min: 5,\n y_max: 739,\n ha: 734,\n leftSideBearing: 0,\n advanceWidth: 615,\n },\n '8': {\n x_min: 40,\n x_max: 541,\n y_min: -15,\n y_max: 752,\n ha: 767,\n leftSideBearing: 40,\n advanceWidth: 585,\n },\n '9': {\n x_min: 40,\n x_max: 537,\n y_min: -52,\n y_max: 736,\n ha: 788,\n leftSideBearing: 40,\n advanceWidth: 592,\n },\n '!': {\n x_min: 49,\n x_max: 180,\n y_min: -7,\n y_max: 761,\n ha: 768,\n leftSideBearing: 49,\n advanceWidth: 230,\n },\n '\"': {\n x_min: 39,\n x_max: 304,\n y_min: 596,\n y_max: 804,\n ha: 208,\n leftSideBearing: 39,\n advanceWidth: 353,\n },\n '#': {\n x_min: 33,\n x_max: 599,\n y_min: -8,\n y_max: 765,\n ha: 773,\n leftSideBearing: 33,\n advanceWidth: 648,\n },\n $: {\n x_min: 53,\n x_max: 495,\n y_min: -111,\n y_max: 823,\n ha: 934,\n leftSideBearing: 53,\n advanceWidth: 560,\n },\n '%': {\n x_min: 35,\n x_max: 656,\n y_min: -128,\n y_max: 808,\n ha: 936,\n leftSideBearing: 35,\n advanceWidth: 711,\n },\n '&': {\n x_min: 53,\n x_max: 441,\n y_min: -3,\n y_max: 753,\n ha: 756,\n leftSideBearing: 53,\n advanceWidth: 500,\n },\n \"'\": {\n x_min: 43,\n x_max: 161,\n y_min: 590,\n y_max: 811,\n ha: 221,\n leftSideBearing: 43,\n advanceWidth: 217,\n },\n '(': {\n x_min: 41,\n x_max: 311,\n y_min: -36,\n y_max: 845,\n ha: 881,\n leftSideBearing: 41,\n advanceWidth: 308,\n },\n ')': {\n x_min: -8,\n x_max: 257,\n y_min: -21,\n y_max: 852,\n ha: 873,\n leftSideBearing: -8,\n advanceWidth: 280,\n },\n '*': {\n x_min: 59,\n x_max: 539,\n y_min: 175,\n y_max: 589,\n ha: 414,\n leftSideBearing: 59,\n advanceWidth: 601,\n },\n '+': {\n x_min: 33,\n x_max: 361,\n y_min: 180,\n y_max: 587,\n ha: 407,\n leftSideBearing: 33,\n advanceWidth: 400,\n },\n ',': {\n x_min: 15,\n x_max: 176,\n y_min: -129,\n y_max: 92,\n ha: 221,\n leftSideBearing: 15,\n advanceWidth: 205,\n },\n '-': {\n x_min: 40,\n x_max: 380,\n y_min: 317,\n y_max: 452,\n ha: 135,\n leftSideBearing: 40,\n advanceWidth: 422,\n },\n '.': {\n x_min: 48,\n x_max: 185,\n y_min: -56,\n y_max: 84,\n ha: 140,\n leftSideBearing: 48,\n advanceWidth: 227,\n },\n '/': {\n x_min: -58,\n x_max: 654,\n y_min: -122,\n y_max: 844,\n ha: 966,\n leftSideBearing: -58,\n advanceWidth: 626,\n },\n ':': {\n x_min: 65,\n x_max: 225,\n y_min: 97,\n y_max: 536,\n ha: 439,\n leftSideBearing: 65,\n advanceWidth: 302,\n },\n ';': {\n x_min: 13,\n x_max: 295,\n y_min: -139,\n y_max: 536,\n ha: 675,\n leftSideBearing: 13,\n advanceWidth: 334,\n },\n '<': {\n x_min: 28,\n x_max: 438,\n y_min: -1,\n y_max: 607,\n ha: 608,\n leftSideBearing: 28,\n advanceWidth: 475,\n },\n '=': {\n x_min: 40,\n x_max: 383,\n y_min: 199.9598640852289,\n y_max: 541,\n ha: 341.0401359147711,\n leftSideBearing: 40,\n advanceWidth: 422,\n },\n '>': {\n x_min: 35,\n x_max: 421,\n y_min: 28,\n y_max: 632,\n ha: 604,\n leftSideBearing: 35,\n advanceWidth: 466,\n },\n '?': {\n x_min: 45,\n x_max: 548,\n y_min: -17,\n y_max: 767,\n ha: 784,\n leftSideBearing: 45,\n advanceWidth: 592,\n },\n '@': {\n x_min: 51,\n x_max: 730,\n y_min: -78,\n y_max: 753,\n ha: 831,\n leftSideBearing: 51,\n advanceWidth: 781,\n },\n A: {\n x_min: 37,\n x_max: 554,\n y_min: -4,\n y_max: 746,\n ha: 750,\n leftSideBearing: 37,\n advanceWidth: 617,\n },\n B: {\n x_min: 37,\n x_max: 532,\n y_min: 3,\n y_max: 783,\n ha: 780,\n leftSideBearing: 37,\n advanceWidth: 579,\n },\n C: {\n x_min: 37,\n x_max: 583,\n y_min: -3,\n y_max: 775,\n ha: 778,\n leftSideBearing: 37,\n advanceWidth: 623,\n },\n D: {\n x_min: 50,\n x_max: 530,\n y_min: -15,\n y_max: 749,\n ha: 764,\n leftSideBearing: 50,\n advanceWidth: 579,\n },\n E: {\n x_min: 45,\n x_max: 531,\n y_min: -1,\n y_max: 743,\n ha: 744,\n leftSideBearing: 45,\n advanceWidth: 585,\n },\n F: {\n x_min: 45,\n x_max: 459,\n y_min: 23,\n y_max: 727,\n ha: 704,\n leftSideBearing: 45,\n advanceWidth: 510,\n },\n G: {\n x_min: 31,\n x_max: 577,\n y_min: -8,\n y_max: 733,\n ha: 741,\n leftSideBearing: 31,\n advanceWidth: 611,\n },\n H: {\n x_min: 37,\n x_max: 493,\n y_min: -22,\n y_max: 758,\n ha: 780,\n leftSideBearing: 37,\n advanceWidth: 535,\n },\n I: {\n x_min: 47,\n x_max: 501,\n y_min: -3,\n y_max: 731,\n ha: 734,\n leftSideBearing: 47,\n advanceWidth: 541,\n },\n J: {\n x_min: 33,\n x_max: 531,\n y_min: -23,\n y_max: 725,\n ha: 748,\n leftSideBearing: 33,\n advanceWidth: 573,\n },\n K: {\n x_min: 43,\n x_max: 505,\n y_min: -10,\n y_max: 740,\n ha: 750,\n leftSideBearing: 43,\n advanceWidth: 560,\n },\n L: {\n x_min: 49,\n x_max: 457,\n y_min: -2,\n y_max: 746,\n ha: 748,\n leftSideBearing: 49,\n advanceWidth: 510,\n },\n M: {\n x_min: 35,\n x_max: 699,\n y_min: 1,\n y_max: 744,\n ha: 743,\n leftSideBearing: 35,\n advanceWidth: 743,\n },\n N: {\n x_min: 34,\n x_max: 533,\n y_min: -17,\n y_max: 761,\n ha: 778,\n leftSideBearing: 34,\n advanceWidth: 579,\n },\n O: {\n x_min: 41,\n x_max: 608,\n y_min: -5,\n y_max: 735,\n ha: 740,\n leftSideBearing: 41,\n advanceWidth: 667,\n },\n P: {\n x_min: 53,\n x_max: 451,\n y_min: -18,\n y_max: 735,\n ha: 753,\n leftSideBearing: 53,\n advanceWidth: 497,\n },\n Q: {\n x_min: 40,\n x_max: 599,\n y_min: -67,\n y_max: 744,\n ha: 811,\n leftSideBearing: 40,\n advanceWidth: 648,\n },\n R: {\n x_min: 39,\n x_max: 487,\n y_min: 16,\n y_max: 735,\n ha: 719,\n leftSideBearing: 39,\n advanceWidth: 535,\n },\n S: {\n x_min: 35,\n x_max: 552,\n y_min: -47,\n y_max: 708,\n ha: 755,\n leftSideBearing: 35,\n advanceWidth: 604,\n },\n T: {\n x_min: 26,\n x_max: 656,\n y_min: -13,\n y_max: 718,\n ha: 731,\n leftSideBearing: 26,\n advanceWidth: 705,\n },\n U: {\n x_min: 41,\n x_max: 518,\n y_min: -20,\n y_max: 748,\n ha: 768,\n leftSideBearing: 41,\n advanceWidth: 567,\n },\n V: {\n x_min: 47,\n x_max: 509,\n y_min: -26,\n y_max: 744,\n ha: 770,\n leftSideBearing: 47,\n advanceWidth: 567,\n },\n W: {\n x_min: 44,\n x_max: 789,\n y_min: -35,\n y_max: 720,\n ha: 755,\n leftSideBearing: 44,\n advanceWidth: 833,\n },\n X: {\n x_min: 63,\n x_max: 635,\n y_min: -10,\n y_max: 745,\n ha: 755,\n leftSideBearing: 63,\n advanceWidth: 680,\n },\n Y: {\n x_min: 43,\n x_max: 503,\n y_min: -21,\n y_max: 734,\n ha: 755,\n leftSideBearing: 43,\n advanceWidth: 541,\n },\n Z: {\n x_min: 42,\n x_max: 584,\n y_min: -10,\n y_max: 739,\n ha: 749,\n leftSideBearing: 42,\n advanceWidth: 629,\n },\n '[': {\n x_min: 46,\n x_max: 346,\n y_min: -150,\n y_max: 884,\n ha: 1034,\n leftSideBearing: 46,\n advanceWidth: 291,\n },\n '\\\\': {\n x_min: 20,\n x_max: 616,\n y_min: -100,\n y_max: 797,\n ha: 897,\n leftSideBearing: 20,\n advanceWidth: 645,\n },\n ']': {\n x_min: -76,\n x_max: 226,\n y_min: -150,\n y_max: 881,\n ha: 1031,\n leftSideBearing: -76,\n advanceWidth: 297,\n },\n '^': {\n x_min: 43,\n x_max: 437,\n y_min: 517,\n y_max: 812,\n ha: 295,\n leftSideBearing: 43,\n advanceWidth: 478,\n },\n _: {\n x_min: 29,\n x_max: 563,\n y_min: -110,\n y_max: -1,\n ha: 109,\n leftSideBearing: 29,\n advanceWidth: 598,\n },\n '`': {\n x_min: 54,\n x_max: 321,\n y_min: 540,\n y_max: 747,\n ha: 207,\n leftSideBearing: 54,\n advanceWidth: 368,\n },\n a: {\n x_min: 20,\n x_max: 447,\n y_min: -17,\n y_max: 495,\n ha: 512,\n leftSideBearing: 20,\n advanceWidth: 494,\n },\n b: {\n x_min: 37,\n x_max: 466,\n y_min: -27,\n y_max: 770,\n ha: 797,\n leftSideBearing: 37,\n advanceWidth: 510,\n },\n c: {\n x_min: 35,\n x_max: 456,\n y_min: -9,\n y_max: 507,\n ha: 516,\n leftSideBearing: 35,\n advanceWidth: 460,\n },\n d: {\n x_min: 45,\n x_max: 520,\n y_min: -15,\n y_max: 764,\n ha: 779,\n leftSideBearing: 45,\n advanceWidth: 560,\n },\n e: {\n x_min: 33,\n x_max: 370,\n y_min: -5,\n y_max: 501,\n ha: 506,\n leftSideBearing: 33,\n advanceWidth: 397,\n },\n f: {\n x_min: 35,\n x_max: 411,\n y_min: -13,\n y_max: 695,\n ha: 708,\n leftSideBearing: 35,\n advanceWidth: 453,\n },\n g: {\n x_min: 33,\n x_max: 551,\n y_min: -257,\n y_max: 505,\n ha: 762,\n leftSideBearing: 33,\n advanceWidth: 611,\n },\n h: {\n x_min: 32,\n x_max: 458,\n y_min: -29,\n y_max: 743,\n ha: 772,\n leftSideBearing: 32,\n advanceWidth: 491,\n },\n i: {\n x_min: 45,\n x_max: 167,\n y_min: -13,\n y_max: 631,\n ha: 644,\n leftSideBearing: 45,\n advanceWidth: 220,\n },\n j: {\n x_min: -127,\n x_max: 261,\n y_min: -231,\n y_max: 601,\n ha: 832,\n leftSideBearing: -127,\n advanceWidth: 308,\n },\n k: {\n x_min: 39,\n x_max: 443,\n y_min: -3,\n y_max: 700,\n ha: 703,\n leftSideBearing: 39,\n advanceWidth: 497,\n },\n l: {\n x_min: 58,\n x_max: 168,\n y_min: -8,\n y_max: 686,\n ha: 694,\n leftSideBearing: 58,\n advanceWidth: 227,\n },\n m: {\n x_min: 39,\n x_max: 688,\n y_min: -14,\n y_max: 501,\n ha: 515,\n leftSideBearing: 39,\n advanceWidth: 718,\n },\n n: {\n x_min: 45,\n x_max: 491,\n y_min: -32,\n y_max: 512,\n ha: 544,\n leftSideBearing: 45,\n advanceWidth: 541,\n },\n o: {\n x_min: 41,\n x_max: 424,\n y_min: -12,\n y_max: 493,\n ha: 505,\n leftSideBearing: 41,\n advanceWidth: 447,\n },\n p: {\n x_min: 25,\n x_max: 529,\n y_min: -260,\n y_max: 500,\n ha: 760,\n leftSideBearing: 25,\n advanceWidth: 573,\n },\n q: {\n x_min: 53,\n x_max: 603,\n y_min: -235,\n y_max: 514,\n ha: 749,\n leftSideBearing: 53,\n advanceWidth: 623,\n },\n r: {\n x_min: 32,\n x_max: 407,\n y_min: -7,\n y_max: 492,\n ha: 499,\n leftSideBearing: 32,\n advanceWidth: 460,\n },\n s: {\n x_min: 49,\n x_max: 416,\n y_min: -12,\n y_max: 519,\n ha: 531,\n leftSideBearing: 49,\n advanceWidth: 460,\n },\n t: {\n x_min: 32,\n x_max: 442,\n y_min: -5,\n y_max: 684,\n ha: 689,\n leftSideBearing: 32,\n advanceWidth: 469,\n },\n u: {\n x_min: 41,\n x_max: 487,\n y_min: -5,\n y_max: 507,\n ha: 512,\n leftSideBearing: 41,\n advanceWidth: 510,\n },\n v: {\n x_min: 16,\n x_max: 441,\n y_min: -20,\n y_max: 542,\n ha: 562,\n leftSideBearing: 16,\n advanceWidth: 456,\n },\n w: {\n x_min: 39,\n x_max: 639,\n y_min: -22,\n y_max: 505,\n ha: 527,\n leftSideBearing: 39,\n advanceWidth: 661,\n },\n x: {\n x_min: 15,\n x_max: 505,\n y_min: -39,\n y_max: 539,\n ha: 578,\n leftSideBearing: 15,\n advanceWidth: 541,\n },\n y: {\n x_min: -98,\n x_max: 501,\n y_min: -242,\n y_max: 511,\n ha: 753,\n leftSideBearing: -98,\n advanceWidth: 548,\n },\n z: {\n x_min: 27,\n x_max: 479,\n y_min: -3,\n y_max: 494,\n ha: 497,\n leftSideBearing: 27,\n advanceWidth: 494,\n },\n '{': {\n x_min: 0,\n x_max: 0,\n y_min: 0,\n y_max: 0,\n ha: 0,\n leftSideBearing: 0,\n advanceWidth: 308,\n },\n '|': {\n x_min: 0,\n x_max: 0,\n y_min: 0,\n y_max: 0,\n ha: 0,\n leftSideBearing: 0,\n advanceWidth: 308,\n },\n '}': {\n x_min: 0,\n x_max: 0,\n y_min: 0,\n y_max: 0,\n ha: 0,\n leftSideBearing: 0,\n advanceWidth: 308,\n },\n '~': {\n x_min: 0,\n x_max: 0,\n y_min: 0,\n y_max: 0,\n ha: 0,\n leftSideBearing: 0,\n advanceWidth: 308,\n },\n },\n fontFamily: 'PetalumaScript',\n resolution: 1000,\n generatedOn: '2020-06-14T18:33:25.407Z',\n};\n","export const RobotoSlabFont = {\n spacing: 50,\n glyphs: {\n ' ': {\n x_min: 0,\n x_max: 509,\n y_min: 0,\n y_max: 2000,\n ha: 2000,\n leftSideBearing: 0,\n advanceWidth: 509,\n },\n '0': {\n x_min: 121,\n x_max: 1048,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 121,\n advanceWidth: 1168,\n },\n '1': {\n x_min: 117,\n x_max: 767,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 117,\n advanceWidth: 844,\n },\n '2': {\n x_min: 75.8474576645637,\n x_max: 1040,\n y_min: 0,\n y_max: 1477,\n ha: 1477,\n leftSideBearing: 75,\n advanceWidth: 1131,\n },\n '3': {\n x_min: 74.85365853658536,\n x_max: 994,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 74,\n advanceWidth: 1106,\n },\n '4': {\n x_min: 63,\n x_max: 1114,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 63,\n advanceWidth: 1187,\n },\n '5': {\n x_min: 96.8448275474953,\n x_max: 982,\n y_min: -21,\n y_max: 1456,\n ha: 1477,\n leftSideBearing: 96,\n advanceWidth: 1081,\n },\n '6': {\n x_min: 121,\n x_max: 1067,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 121,\n advanceWidth: 1144,\n },\n '7': {\n x_min: 76,\n x_max: 1060,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: -30,\n advanceWidth: 1128,\n },\n '8': {\n x_min: 92,\n x_max: 1039,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 92,\n advanceWidth: 1131,\n },\n '9': {\n x_min: 84,\n x_max: 1026,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 84,\n advanceWidth: 1154,\n },\n '!': {\n x_min: 143,\n x_max: 340,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 143,\n advanceWidth: 483,\n },\n '\"': {\n x_min: 166,\n x_max: 634,\n y_min: 1055,\n y_max: 1560,\n ha: 505,\n leftSideBearing: 166,\n advanceWidth: 770,\n },\n '#': {\n x_min: 63,\n x_max: 1179,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 63,\n advanceWidth: 1246,\n },\n $: {\n x_min: 81.92156915727656,\n x_max: 1012,\n y_min: -208,\n y_max: 1693,\n ha: 1901,\n leftSideBearing: 81,\n advanceWidth: 1110,\n },\n '%': {\n x_min: 77,\n x_max: 1384,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 77,\n advanceWidth: 1460,\n },\n '&': {\n x_min: 74,\n x_max: 1242,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 74,\n advanceWidth: 1289,\n },\n \"'\": {\n x_min: 166,\n x_max: 324,\n y_min: 1055,\n y_max: 1560,\n ha: 505,\n leftSideBearing: 166,\n advanceWidth: 460,\n },\n '(': {\n x_min: 114,\n x_max: 650,\n y_min: -463,\n y_max: 1636,\n ha: 2099,\n leftSideBearing: 114,\n advanceWidth: 662,\n },\n ')': {\n x_min: 11,\n x_max: 547,\n y_min: -463,\n y_max: 1636,\n ha: 2099,\n leftSideBearing: 11,\n advanceWidth: 654,\n },\n '*': {\n x_min: 66,\n x_max: 893,\n y_min: 607,\n y_max: 1456,\n ha: 849,\n leftSideBearing: 66,\n advanceWidth: 958,\n },\n '+': {\n x_min: 73,\n x_max: 1071,\n y_min: 146,\n y_max: 1206,\n ha: 1060,\n leftSideBearing: 73,\n advanceWidth: 1145,\n },\n ',': {\n x_min: 23,\n x_max: 315,\n y_min: -311,\n y_max: 221,\n ha: 532,\n leftSideBearing: 23,\n advanceWidth: 404,\n },\n '-': {\n x_min: 154,\n x_max: 643,\n y_min: 538,\n y_max: 692,\n ha: 154,\n leftSideBearing: 154,\n advanceWidth: 797,\n },\n '.': {\n x_min: 145,\n x_max: 342,\n y_min: 0,\n y_max: 202,\n ha: 202,\n leftSideBearing: 145,\n advanceWidth: 493,\n },\n '/': {\n x_min: 0,\n x_max: 774,\n y_min: -125,\n y_max: 1456,\n ha: 1581,\n leftSideBearing: 0,\n advanceWidth: 824,\n },\n ':': {\n x_min: 145,\n x_max: 342,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 145,\n advanceWidth: 419,\n },\n ';': {\n x_min: 53,\n x_max: 345,\n y_min: -311,\n y_max: 1082,\n ha: 1393,\n leftSideBearing: 53,\n advanceWidth: 424,\n },\n '<': {\n x_min: 76,\n x_max: 892,\n y_min: 107,\n y_max: 1013,\n ha: 906,\n leftSideBearing: 76,\n advanceWidth: 1017,\n },\n '=': {\n x_min: 147,\n x_max: 981,\n y_min: 407,\n y_max: 987,\n ha: 580,\n leftSideBearing: 147,\n advanceWidth: 1127,\n },\n '>': {\n x_min: 125,\n x_max: 980,\n y_min: 87,\n y_max: 993,\n ha: 906,\n leftSideBearing: 125,\n advanceWidth: 1060,\n },\n '?': {\n x_min: 65.92660602419838,\n x_max: 890,\n y_min: 0,\n y_max: 1477,\n ha: 1477,\n leftSideBearing: 65,\n advanceWidth: 953,\n },\n '@': {\n x_min: 84.3592218305664,\n x_max: 1705.2346925277395,\n y_min: -453,\n y_max: 1431,\n ha: 1884,\n leftSideBearing: 84,\n advanceWidth: 1821,\n },\n A: {\n x_min: 70,\n x_max: 1463,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 70,\n advanceWidth: 1533,\n },\n B: {\n x_min: 81,\n x_max: 1253,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1322,\n },\n C: {\n x_min: 80,\n x_max: 1174,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 80,\n advanceWidth: 1290,\n },\n D: {\n x_min: 81,\n x_max: 1291,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1356,\n },\n E: {\n x_min: 81,\n x_max: 1190,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1306,\n },\n F: {\n x_min: 81,\n x_max: 1176,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1256,\n },\n G: {\n x_min: 80,\n x_max: 1226,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 80,\n advanceWidth: 1346,\n },\n H: {\n x_min: 81,\n x_max: 1497,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1578,\n },\n I: {\n x_min: 81,\n x_max: 604,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 685,\n },\n J: {\n x_min: 60,\n x_max: 1100,\n y_min: -21,\n y_max: 1456,\n ha: 1477,\n leftSideBearing: 60,\n advanceWidth: 1169,\n },\n K: {\n x_min: 81,\n x_max: 1427,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1501,\n },\n L: {\n x_min: 81,\n x_max: 1130,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1210,\n },\n M: {\n x_min: 94,\n x_max: 1888,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 94,\n advanceWidth: 1982,\n },\n N: {\n x_min: 83,\n x_max: 1509,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 83,\n advanceWidth: 1592,\n },\n O: {\n x_min: 70,\n x_max: 1281,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 70,\n advanceWidth: 1351,\n },\n P: {\n x_min: 81,\n x_max: 1242,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1297,\n },\n Q: {\n x_min: 70,\n x_max: 1348,\n y_min: -245,\n y_max: 1477,\n ha: 1722,\n leftSideBearing: 70,\n advanceWidth: 1376,\n },\n R: {\n x_min: 81,\n x_max: 1285,\n y_min: 0,\n y_max: 1455,\n ha: 1455,\n leftSideBearing: 81,\n advanceWidth: 1385,\n },\n S: {\n x_min: 115,\n x_max: 1116,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 115,\n advanceWidth: 1206,\n },\n T: {\n x_min: 96,\n x_max: 1306,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 96,\n advanceWidth: 1406,\n },\n U: {\n x_min: 70,\n x_max: 1452,\n y_min: -21,\n y_max: 1456,\n ha: 1477,\n leftSideBearing: 70,\n advanceWidth: 1522,\n },\n V: {\n x_min: 65,\n x_max: 1443,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 65,\n advanceWidth: 1508,\n },\n W: {\n x_min: 72,\n x_max: 2057,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 72,\n advanceWidth: 2129,\n },\n X: {\n x_min: 80,\n x_max: 1449,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 80,\n advanceWidth: 1529,\n },\n Y: {\n x_min: 65,\n x_max: 1396,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 65,\n advanceWidth: 1461,\n },\n Z: {\n x_min: 90,\n x_max: 1107,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 90,\n advanceWidth: 1197,\n },\n '[': {\n x_min: 157,\n x_max: 541,\n y_min: -312,\n y_max: 1664,\n ha: 1976,\n leftSideBearing: 157,\n advanceWidth: 573,\n },\n '\\\\': {\n x_min: 36,\n x_max: 830,\n y_min: -125,\n y_max: 1456,\n ha: 1581,\n leftSideBearing: 36,\n advanceWidth: 841,\n },\n ']': {\n x_min: 23,\n x_max: 408,\n y_min: -312,\n y_max: 1664,\n ha: 1976,\n leftSideBearing: 23,\n advanceWidth: 552,\n },\n '^': {\n x_min: 71,\n x_max: 802,\n y_min: 729,\n y_max: 1456,\n ha: 727,\n leftSideBearing: 71,\n advanceWidth: 864,\n },\n _: {\n x_min: 119,\n x_max: 1041,\n y_min: -154,\n y_max: 0,\n ha: 154,\n leftSideBearing: 119,\n advanceWidth: 1168,\n },\n '`': {\n x_min: 40,\n x_max: 456,\n y_min: 1288,\n y_max: 1560,\n ha: 272,\n leftSideBearing: 40,\n advanceWidth: 496,\n },\n a: {\n x_min: 79,\n x_max: 1053,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 79,\n advanceWidth: 1132,\n },\n b: {\n x_min: -16,\n x_max: 1071,\n y_min: -21,\n y_max: 1560,\n ha: 1581,\n leftSideBearing: -16,\n advanceWidth: 1145,\n },\n c: {\n x_min: 78,\n x_max: 988,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 78,\n advanceWidth: 1067,\n },\n d: {\n x_min: 78,\n x_max: 1156,\n y_min: -21,\n y_max: 1560,\n ha: 1581,\n leftSideBearing: 78,\n advanceWidth: 1218,\n },\n e: {\n x_min: 74,\n x_max: 980,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 74,\n advanceWidth: 1059,\n },\n f: {\n x_min: 64,\n x_max: 731,\n y_min: 0,\n y_max: 1581,\n ha: 1581,\n leftSideBearing: 64,\n advanceWidth: 725,\n },\n g: {\n x_min: 78,\n x_max: 1133,\n y_min: -437,\n y_max: 1102,\n ha: 1539,\n leftSideBearing: 78,\n advanceWidth: 1157,\n },\n h: {\n x_min: 49,\n x_max: 1255,\n y_min: 0,\n y_max: 1560,\n ha: 1560,\n leftSideBearing: 49,\n advanceWidth: 1315,\n },\n i: {\n x_min: 67,\n x_max: 590,\n y_min: 0,\n y_max: 1560,\n ha: 1560,\n leftSideBearing: 67,\n advanceWidth: 652,\n },\n j: {\n x_min: -56,\n x_max: 381,\n y_min: -437,\n y_max: 1560,\n ha: 1997,\n leftSideBearing: -56,\n advanceWidth: 525,\n },\n k: {\n x_min: 64,\n x_max: 1248,\n y_min: 0,\n y_max: 1560,\n ha: 1560,\n leftSideBearing: 64,\n advanceWidth: 1287,\n },\n l: {\n x_min: 64,\n x_max: 587,\n y_min: 0,\n y_max: 1560,\n ha: 1560,\n leftSideBearing: 64,\n advanceWidth: 653,\n },\n m: {\n x_min: 74,\n x_max: 1905,\n y_min: 0,\n y_max: 1102,\n ha: 1102,\n leftSideBearing: 74,\n advanceWidth: 1977,\n },\n n: {\n x_min: 74,\n x_max: 1278,\n y_min: 0,\n y_max: 1102,\n ha: 1102,\n leftSideBearing: 74,\n advanceWidth: 1343,\n },\n o: {\n x_min: 78,\n x_max: 1046,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 78,\n advanceWidth: 1124,\n },\n p: {\n x_min: 34,\n x_max: 1119,\n y_min: -416,\n y_max: 1102,\n ha: 1518,\n leftSideBearing: 34,\n advanceWidth: 1197,\n },\n q: {\n x_min: 78,\n x_max: 1135,\n y_min: -416,\n y_max: 1102,\n ha: 1518,\n leftSideBearing: 78,\n advanceWidth: 1139,\n },\n r: {\n x_min: 72,\n x_max: 808,\n y_min: 0,\n y_max: 1102,\n ha: 1102,\n leftSideBearing: 72,\n advanceWidth: 854,\n },\n s: {\n x_min: 104,\n x_max: 933,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 104,\n advanceWidth: 1022,\n },\n t: {\n x_min: 24,\n x_max: 678,\n y_min: -17,\n y_max: 1343,\n ha: 1360,\n leftSideBearing: 24,\n advanceWidth: 730,\n },\n u: {\n x_min: 52,\n x_max: 1181,\n y_min: -21,\n y_max: 1082,\n ha: 1103,\n leftSideBearing: 52,\n advanceWidth: 1245,\n },\n v: {\n x_min: 26,\n x_max: 1176,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 26,\n advanceWidth: 1206,\n },\n w: {\n x_min: 52,\n x_max: 1777,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 52,\n advanceWidth: 1823,\n },\n x: {\n x_min: 42,\n x_max: 1163,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 42,\n advanceWidth: 1203,\n },\n y: {\n x_min: 24,\n x_max: 1172,\n y_min: -437,\n y_max: 1082,\n ha: 1519,\n leftSideBearing: 24,\n advanceWidth: 1192,\n },\n z: {\n x_min: 88,\n x_max: 960,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 88,\n advanceWidth: 1032,\n },\n '{': {\n x_min: 63,\n x_max: 671,\n y_min: -364,\n y_max: 1597,\n ha: 1961,\n leftSideBearing: 63,\n advanceWidth: 701,\n },\n '|': {\n x_min: 150,\n x_max: 307,\n y_min: -270,\n y_max: 1456,\n ha: 1726,\n leftSideBearing: 150,\n advanceWidth: 451,\n },\n '}': {\n x_min: 27,\n x_max: 635,\n y_min: -364,\n y_max: 1597,\n ha: 1961,\n leftSideBearing: 27,\n advanceWidth: 701,\n },\n '~': {\n x_min: 121,\n x_max: 1257,\n y_min: 401,\n y_max: 803,\n ha: 402,\n leftSideBearing: 121,\n advanceWidth: 1386,\n },\n },\n fontFamily: 'Roboto Slab',\n resolution: 2048,\n generatedOn: '2020-06-15T19:12:58.120Z',\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from '../font';\nimport { TextFormatter } from '../textformatter';\nimport { PetalumaScriptFont } from './petalumascript_glyphs';\nimport { RobotoSlabFont } from './robotoslab_glyphs';\nexport function loadTextFonts() {\n // Roboto Slab\n {\n const fontData = RobotoSlabFont;\n const { fontFamily, resolution, glyphs } = fontData;\n Font.load(fontFamily, fontData);\n // Previously we used 'H', but it isn't actually the tallest or the widest.\n // Interestingly, the lowercase 'b' is the tallest glyph.\n const maxSizeGlyph = 'b';\n TextFormatter.registerInfo({\n family: fontFamily,\n resolution,\n glyphs,\n maxSizeGlyph,\n monospaced: false,\n bold: false,\n italic: false,\n superscriptOffset: 0.66,\n subscriptOffset: 0.66,\n serifs: true,\n description: 'Text font to pair with the Bravura / Gonville music fonts.',\n });\n }\n // PetalumaScript\n {\n const fontData = PetalumaScriptFont;\n const { fontFamily, resolution, glyphs } = fontData;\n Font.load(fontFamily, fontData);\n // M is wider, but H is taller. :-)\n // Lowercase b is also taller in this font.\n const maxSizeGlyph = 'b';\n TextFormatter.registerInfo({\n family: fontFamily,\n resolution,\n glyphs,\n maxSizeGlyph,\n monospaced: false,\n bold: false,\n italic: false,\n superscriptOffset: 0.66,\n subscriptOffset: 0.66,\n serifs: false,\n description: 'Text font to pair with the Petaluma music font.',\n });\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Beam } from './beam';\nimport { Font } from './font';\nimport { Fraction } from './fraction';\nimport { ModifierContext } from './modifiercontext';\nimport { Stave } from './stave';\nimport { StaveConnector } from './staveconnector';\nimport { Tables } from './tables';\nimport { TickContext } from './tickcontext';\nimport { isNote, isStaveNote } from './typeguard';\nimport { defined, log, midLine, RuntimeError } from './util';\nimport { Voice } from './voice';\n// Helper function\nconst sumArray = (arr) => arr.reduce((a, b) => a + b, 0);\n/**\n * Create `Alignment`s for each tick in `voices`. Also calculate the\n * total number of ticks in voices.\n */\nfunction createContexts(voices, makeContext, addToContext) {\n const resolutionMultiplier = Formatter.getResolutionMultiplier(voices);\n // Initialize tick maps.\n const tickToContextMap = {};\n const tickList = [];\n const contexts = [];\n // For each voice, extract notes and create a context for every\n // new tick that hasn't been seen before.\n voices.forEach((voice, voiceIndex) => {\n // Use resolution multiplier as denominator so that no additional expansion\n // of fractional tick values is needed.\n const ticksUsed = new Fraction(0, resolutionMultiplier);\n voice.getTickables().forEach((tickable) => {\n const integerTicks = ticksUsed.numerator;\n // If we have no tick context for this tick, create one.\n if (!tickToContextMap[integerTicks]) {\n const newContext = makeContext({ tickID: integerTicks });\n contexts.push(newContext);\n tickToContextMap[integerTicks] = newContext;\n // Maintain a list of unique integerTicks.\n tickList.push(integerTicks);\n }\n // Add this tickable to the TickContext.\n addToContext(tickable, tickToContextMap[integerTicks], voiceIndex);\n ticksUsed.add(tickable.getTicks());\n });\n });\n return {\n map: tickToContextMap,\n array: contexts,\n list: tickList.sort((a, b) => a - b),\n resolutionMultiplier,\n };\n}\n// eslint-disable-next-line\nfunction L(...args) {\n if (Formatter.DEBUG)\n log('Vex.Flow.Formatter', args);\n}\n/**\n * Get the rest line number of the next non-rest note(s).\n * @param notes array of Notes\n * @param currRestLine\n * @param currNoteIndex current note index\n * @param compare if true, return the midpoint between the current rest line and the next rest line\n * @returns a line number, which determines the vertical position of a rest.\n */\nfunction getRestLineForNextNoteGroup(notes, currRestLine, currNoteIndex, compare) {\n // If no valid next note group, nextRestLine is same as current.\n let nextRestLine = currRestLine;\n // Start with the next note and keep going until we find a valid non-rest note group.\n for (let noteIndex = currNoteIndex + 1; noteIndex < notes.length; noteIndex++) {\n const note = notes[noteIndex];\n if (isNote(note) && !note.isRest() && !note.shouldIgnoreTicks()) {\n nextRestLine = note.getLineForRest();\n break;\n }\n }\n // Locate the mid point between two lines.\n if (compare && currRestLine !== nextRestLine) {\n const top = Math.max(currRestLine, nextRestLine);\n const bot = Math.min(currRestLine, nextRestLine);\n nextRestLine = midLine(top, bot);\n }\n return nextRestLine;\n}\n/**\n * Format implements the formatting and layout algorithms that are used\n * to position notes in a voice. The algorithm can align multiple voices both\n * within a stave, and across multiple staves.\n *\n * To do this, the formatter breaks up voices into a grid of rational-valued\n * `ticks`, to which each note is assigned. Then, minimum widths are assigned\n * to each tick based on the widths of the notes and modifiers in that tick. This\n * establishes the smallest amount of space required for each tick.\n *\n * Finally, the formatter distributes the left over space proportionally to\n * all the ticks, setting the `x` values of the notes in each tick.\n *\n * See `tests/formatter_tests.ts` for usage examples. The helper functions included\n * here (`FormatAndDraw`, `FormatAndDrawTab`) also serve as useful usage examples.\n */\nexport class Formatter {\n constructor(options) {\n this.formatterOptions = Object.assign({ globalSoftmax: false, softmaxFactor: 100, maxIterations: 5 }, options);\n this.justifyWidth = 0;\n this.totalCost = 0;\n this.totalShift = 0;\n this.durationStats = {};\n // Minimum width required to render all the notes in the voices.\n this.minTotalWidth = 0;\n // This is set to `true` after `minTotalWidth` is calculated.\n this.hasMinTotalWidth = false;\n // Arrays of tick and modifier contexts.\n this.tickContexts = undefined;\n this.modifierContexts = undefined;\n // Gaps between contexts, for free movement of notes post\n // formatting.\n this.contextGaps = {\n total: 0,\n gaps: [],\n };\n this.voices = [];\n this.lossHistory = [];\n }\n /**\n * Helper function to layout \"notes\" one after the other without\n * regard for proportions. Useful for tests and debugging.\n */\n static SimpleFormat(notes, x = 0, { paddingBetween = 10 } = {}) {\n notes.reduce((accumulator, note) => {\n note.addToModifierContext(new ModifierContext());\n const tick = new TickContext().addTickable(note).preFormat();\n const metrics = tick.getMetrics();\n tick.setX(accumulator + metrics.totalLeftPx);\n return accumulator + tick.getWidth() + metrics.totalRightPx + paddingBetween;\n }, x);\n }\n /** Helper function to plot formatter debug info. */\n static plotDebugging(ctx, formatter, xPos, y1, y2, options) {\n options = Object.assign({ stavePadding: Tables.currentMusicFont().lookupMetric('stave.padding') }, options);\n const x = xPos + options.stavePadding;\n const contextGaps = formatter.contextGaps;\n function stroke(x1, x2, color) {\n ctx.beginPath();\n ctx.setStrokeStyle(color);\n ctx.setFillStyle(color);\n ctx.setLineWidth(1);\n ctx.fillRect(x1, y1, Math.max(x2 - x1, 0), y2 - y1);\n }\n ctx.save();\n ctx.setFont(Font.SANS_SERIF, 8);\n contextGaps.gaps.forEach((gap) => {\n stroke(x + gap.x1, x + gap.x2, 'rgba(100,200,100,0.4)');\n ctx.setFillStyle('green');\n ctx.fillText(Math.round(gap.x2 - gap.x1).toString(), x + gap.x1, y2 + 12);\n });\n ctx.setFillStyle('red');\n ctx.fillText(`Loss: ${(formatter.totalCost || 0).toFixed(2)} Shift: ${(formatter.totalShift || 0).toFixed(2)} Gap: ${contextGaps.total.toFixed(2)}`, x - 20, y2 + 27);\n ctx.restore();\n }\n /**\n * Helper function to format and draw a single voice. Returns a bounding\n * box for the notation.\n * @param ctx the rendering context\n * @param stave the stave to which to draw (`Stave` or `TabStave`)\n * @param notes array of `Note` instances (`Note`, `TextNote`, `TabNote`, etc.)\n * @param params one of below:\n * * Setting `autobeam` only `(context, stave, notes, true)` or\n * `(ctx, stave, notes, {autobeam: true})`\n * * Setting `align_rests` a struct is needed `(context, stave, notes, {align_rests: true})`\n * * Setting both a struct is needed `(context, stave, notes, {\n * autobeam: true, align_rests: true})`\n * * `autobeam` automatically generates beams for the notes.\n * * `align_rests` aligns rests with nearby notes.\n */\n static FormatAndDraw(ctx, stave, notes, params) {\n let options = {\n auto_beam: false,\n align_rests: false,\n };\n if (typeof params === 'object') {\n options = Object.assign(Object.assign({}, options), params);\n }\n else if (typeof params === 'boolean') {\n options.auto_beam = params;\n }\n // Start by creating a voice and adding all the notes to it.\n const voice = new Voice(Tables.TIME4_4).setMode(Voice.Mode.SOFT).addTickables(notes);\n // Then create beams, if requested.\n const beams = options.auto_beam ? Beam.applyAndGetBeams(voice) : [];\n // Instantiate a `Formatter` and format the notes.\n new Formatter()\n .joinVoices([voice]) // , { align_rests: options.align_rests })\n .formatToStave([voice], stave, { align_rests: options.align_rests, stave });\n // Render the voice and beams to the stave.\n voice.setStave(stave).draw(ctx, stave);\n beams.forEach((beam) => beam.setContext(ctx).draw());\n // Return the bounding box of the voice.\n return voice.getBoundingBox();\n }\n /**\n * Helper function to format and draw aligned tab and stave notes in two\n * separate staves.\n * @param ctx the rendering context\n * @param tabstave a `TabStave` instance on which to render `TabNote`s.\n * @param stave a `Stave` instance on which to render `Note`s.\n * @param notes array of `Note` instances for the stave (`Note`, `BarNote`, etc.)\n * @param tabnotes array of `Note` instances for the tab stave (`TabNote`, `BarNote`, etc.)\n * @param autobeam automatically generate beams.\n * @param params a configuration object:\n * * `autobeam` automatically generates beams for the notes.\n * * `align_rests` aligns rests with nearby notes.\n */\n static FormatAndDrawTab(ctx, tabstave, stave, tabnotes, notes, autobeam, params) {\n let opts = {\n auto_beam: autobeam,\n align_rests: false,\n };\n if (typeof params === 'object') {\n opts = Object.assign(Object.assign({}, opts), params);\n }\n else if (typeof params === 'boolean') {\n opts.auto_beam = params;\n }\n // Create a `4/4` voice for `notes`.\n const notevoice = new Voice(Tables.TIME4_4).setMode(Voice.Mode.SOFT).addTickables(notes);\n // Create a `4/4` voice for `tabnotes`.\n const tabvoice = new Voice(Tables.TIME4_4).setMode(Voice.Mode.SOFT).addTickables(tabnotes);\n // Then create beams, if requested.\n const beams = opts.auto_beam ? Beam.applyAndGetBeams(notevoice) : [];\n // Instantiate a `Formatter` and align tab and stave notes.\n new Formatter()\n .joinVoices([notevoice]) // , { align_rests: opts.align_rests })\n .joinVoices([tabvoice])\n .formatToStave([notevoice, tabvoice], stave, { align_rests: opts.align_rests });\n // Render voices and beams to staves.\n notevoice.draw(ctx, stave);\n tabvoice.draw(ctx, tabstave);\n beams.forEach((beam) => beam.setContext(ctx).draw());\n // Draw a connector between tab and note staves.\n new StaveConnector(stave, tabstave).setContext(ctx).draw();\n }\n /**\n * Automatically set the vertical position of rests based on previous/next note positions.\n * @param tickables an array of Tickables.\n * @param alignAllNotes If `false`, only align rests that are within a group of beamed notes.\n * @param alignTuplets If `false`, ignores tuplets.\n */\n static AlignRestsToNotes(tickables, alignAllNotes, alignTuplets) {\n tickables.forEach((currTickable, index) => {\n if (isStaveNote(currTickable) && currTickable.isRest()) {\n if (currTickable.getTuplet() && !alignTuplets) {\n return;\n }\n // If activated rests not on default can be rendered as specified.\n const position = currTickable.getGlyph().position.toUpperCase();\n if (position !== 'R/4' && position !== 'B/4') {\n return;\n }\n if (alignAllNotes || currTickable.getBeam()) {\n // Align rests with previous/next notes.\n const props = currTickable.getKeyProps()[0];\n if (index === 0) {\n props.line = getRestLineForNextNoteGroup(tickables, props.line, index, false);\n }\n else if (index > 0 && index < tickables.length) {\n // If previous tickable is a rest, use its line number.\n const prevTickable = tickables[index - 1];\n if (isStaveNote(prevTickable)) {\n if (prevTickable.isRest()) {\n props.line = prevTickable.getKeyProps()[0].line;\n }\n else {\n const restLine = prevTickable.getLineForRest();\n // Get the rest line for next valid non-rest note group.\n props.line = getRestLineForNextNoteGroup(tickables, restLine, index, true);\n }\n }\n }\n currTickable.setKeyLine(0, props.line);\n }\n }\n });\n }\n /**\n * Find all the rests in each of the `voices` and align them to neighboring notes.\n *\n * @param voices\n * @param alignAllNotes If `false`, only align rests within beamed groups of notes. If `true`, align all rests.\n */\n alignRests(voices, alignAllNotes) {\n if (!voices || !voices.length) {\n throw new RuntimeError('BadArgument', 'No voices to format rests');\n }\n voices.forEach((voice) => Formatter.AlignRestsToNotes(voice.getTickables(), alignAllNotes));\n }\n /**\n * Estimate the width required to render 'voices'. This is done by:\n * 1. Sum the widths of all the tick contexts\n * 2. Estimate the padding.\n * The latter is done by calculating the padding 3 different ways, and taking the\n * greatest value:\n * 1. the padding required for unaligned notes in different voices\n * 2. the padding based on the stddev of the tickable widths\n * 3. the padding based on the stddev of the tickable durations.\n *\n * The last 2 quantities estimate a 'width entropy', where notes might need more\n * room than the proportional formatting gives them. A measure of all same duration\n * and width will need no extra padding, and all these quantities will be\n * zero in that case.\n *\n * @param voices the voices that contain the notes\n * @returns the estimated width in pixels\n */\n preCalculateMinTotalWidth(voices) {\n const unalignedPadding = Tables.currentMusicFont().lookupMetric('stave.unalignedNotePadding');\n // Calculate additional padding based on 3 methods:\n // 1) unaligned beats in voices, 2) variance of width, 3) variance of durations\n let unalignedCtxCount = 0;\n let wsum = 0;\n let dsum = 0;\n const widths = [];\n const durations = [];\n // Cache results.\n if (this.hasMinTotalWidth)\n return this.minTotalWidth;\n // Create tick contexts if not already created.\n if (!this.tickContexts) {\n if (!voices) {\n throw new RuntimeError('BadArgument', \"'voices' required to run preCalculateMinTotalWidth\");\n }\n this.createTickContexts(voices);\n }\n // eslint-disable-next-line\n const { list: contextList, map: contextMap } = this.tickContexts;\n this.minTotalWidth = 0;\n // Go through each tick context and calculate total width,\n // and also accumulate values used in padding hints\n contextList.forEach((tick) => {\n const context = contextMap[tick];\n context.preFormat();\n // If this TC doesn't have all the voices on it, it's unaligned.\n // so increment the unaligned padding accumulator\n if (context.getTickables().length < voices.length) {\n unalignedCtxCount += 1;\n }\n // Calculate the 'width entropy' over all the Tickables.\n context.getTickables().forEach((t) => {\n wsum += t.getMetrics().width;\n dsum += t.getTicks().value();\n widths.push(t.getMetrics().width);\n durations.push(t.getTicks().value());\n });\n const width = context.getWidth();\n this.minTotalWidth += width;\n });\n this.hasMinTotalWidth = true;\n // normalized (0-1) STDDEV of widths/durations gives us padding hints.\n const wavg = wsum > 0 ? wsum / widths.length : 1 / widths.length;\n const wvar = sumArray(widths.map((ll) => Math.pow(ll - wavg, 2)));\n const wpads = Math.pow(wvar / widths.length, 0.5) / wavg;\n const davg = dsum / durations.length;\n const dvar = sumArray(durations.map((ll) => Math.pow(ll - davg, 2)));\n const dpads = Math.pow(dvar / durations.length, 0.5) / davg;\n // Find max of 3 methods pad the width with that\n const padmax = Math.max(dpads, wpads) * contextList.length * unalignedPadding;\n const unalignedPad = unalignedPadding * unalignedCtxCount;\n return this.minTotalWidth + Math.max(unalignedPad, padmax);\n }\n /**\n * Get minimum width required to render all voices. Either `format` or\n * `preCalculateMinTotalWidth` must be called before this method.\n */\n getMinTotalWidth() {\n if (!this.hasMinTotalWidth) {\n throw new RuntimeError('NoMinTotalWidth', \"Call 'preCalculateMinTotalWidth' or 'preFormat' before calling 'getMinTotalWidth'\");\n }\n return this.minTotalWidth;\n }\n /** Calculate the resolution multiplier for `voices`. */\n static getResolutionMultiplier(voices) {\n if (!voices || !voices.length) {\n throw new RuntimeError('BadArgument', 'No voices to format');\n }\n const totalTicks = voices[0].getTotalTicks();\n const resolutionMultiplier = voices.reduce((accumulator, voice) => {\n if (!voice.getTotalTicks().equals(totalTicks)) {\n throw new RuntimeError('TickMismatch', 'Voices should have same total note duration in ticks.');\n }\n if (voice.getMode() === Voice.Mode.STRICT && !voice.isComplete()) {\n throw new RuntimeError('IncompleteVoice', 'Voice does not have enough notes.');\n }\n return Math.max(accumulator, Fraction.LCM(accumulator, voice.getResolutionMultiplier()));\n }, 1);\n return resolutionMultiplier;\n }\n /** Create a `ModifierContext` for each tick in `voices`. */\n createModifierContexts(voices) {\n const fn = (tickable, context) => tickable.addToModifierContext(context);\n const contexts = createContexts(voices, () => new ModifierContext(), fn);\n this.modifierContexts = contexts;\n return contexts;\n }\n /**\n * Create a `TickContext` for each tick in `voices`. Also calculate the\n * total number of ticks in voices.\n */\n createTickContexts(voices) {\n const fn = (tickable, context, voiceIndex) => context.addTickable(tickable, voiceIndex);\n const contexts = createContexts(voices, (tick) => new TickContext(tick), fn);\n this.tickContexts = contexts;\n const contextArray = this.tickContexts.array;\n contextArray.forEach((context) => {\n context.tContexts = contextArray;\n });\n return contexts;\n }\n /**\n * This is the core formatter logic. Format voices and justify them\n * to `justifyWidth` pixels. `renderingContext` is required to justify elements\n * that can't retreive widths without a canvas. This method sets the `x` positions\n * of all the tickables/notes in the formatter.\n */\n preFormat(justifyWidth = 0, renderingContext, voicesParam, stave) {\n // Initialize context maps.\n const contexts = this.tickContexts;\n if (!contexts) {\n throw new RuntimeError('NoTickContexts', 'preFormat requires TickContexts');\n }\n const { list: contextList, map: contextMap } = contexts;\n // Reset loss history for evaluator.\n this.lossHistory = [];\n // If voices and a stave were provided, set the Stave for each voice\n // and preFormat to apply Y values to the notes;\n if (voicesParam && stave) {\n voicesParam.forEach((voice) => voice.setStave(stave).preFormat());\n }\n // Now distribute the ticks to each tick context, and assign them their\n // own X positions.\n let x = 0;\n let shift = 0;\n this.minTotalWidth = 0;\n let totalTicks = 0;\n // Pass 1: Give each note maximum width requested by context.\n contextList.forEach((tick) => {\n const context = contextMap[tick];\n // Make sure that all tickables in this context have calculated their\n // space requirements.\n context.preFormat();\n const width = context.getWidth();\n this.minTotalWidth += width;\n const maxTicks = context.getMaxTicks().value();\n totalTicks += maxTicks;\n const metrics = context.getMetrics();\n x = x + shift + metrics.totalLeftPx;\n context.setX(x);\n // Calculate shift for the next tick.\n shift = width - metrics.totalLeftPx;\n });\n // Use softmax based on all notes across all staves. (options.globalSoftmax)\n const { globalSoftmax, softmaxFactor, maxIterations } = this.formatterOptions;\n const exp = (tick) => Math.pow(softmaxFactor, (contextMap[tick].getMaxTicks().value() / totalTicks));\n const expTicksUsed = sumArray(contextList.map(exp));\n this.minTotalWidth = x + shift;\n this.hasMinTotalWidth = true;\n // No justification needed. End formatting.\n if (justifyWidth <= 0)\n return this.evaluate();\n // Start justification. Subtract the right extra pixels of the final context because the formatter\n // justifies based on the context's X position, which is the left-most part of the note head.\n const firstContext = contextMap[contextList[0]];\n const lastContext = contextMap[contextList[contextList.length - 1]];\n // Calculate the \"distance error\" between the tick contexts. The expected distance is the spacing proportional to\n // the softmax of the ticks.\n function calculateIdealDistances(adjustedJustifyWidth) {\n const distances = contextList.map((tick, i) => {\n const context = contextMap[tick];\n const voices = context.getTickablesByVoice();\n let backTickable;\n if (i > 0) {\n const prevContext = contextMap[contextList[i - 1]];\n // Go through each tickable and search backwards for another tickable\n // in the same voice. If found, use that duration (ticks) to calculate\n // the expected distance.\n for (let j = i - 1; j >= 0; j--) {\n const backTick = contextMap[contextList[j]];\n const backVoices = backTick.getTickablesByVoice();\n // Look for matching voices between tick contexts.\n const matchingVoices = [];\n Object.keys(voices).forEach((v) => {\n if (backVoices[v]) {\n matchingVoices.push(v);\n }\n });\n if (matchingVoices.length > 0) {\n // Found matching voices, get largest duration\n let maxTicks = 0;\n let maxNegativeShiftPx = Infinity;\n let expectedDistance = 0;\n matchingVoices.forEach((v) => {\n const ticks = backVoices[v].getTicks().value();\n if (ticks > maxTicks) {\n backTickable = backVoices[v];\n maxTicks = ticks;\n }\n // Calculate the limits of the shift based on modifiers, etc.\n const thisTickable = voices[v];\n const insideLeftEdge = thisTickable.getX() -\n (thisTickable.getMetrics().modLeftPx + thisTickable.getMetrics().leftDisplacedHeadPx);\n const backMetrics = backVoices[v].getMetrics();\n const insideRightEdge = backVoices[v].getX() + backMetrics.notePx + backMetrics.modRightPx + backMetrics.rightDisplacedHeadPx;\n // Don't allow shifting if notes in the same voice can collide\n maxNegativeShiftPx = Math.min(maxNegativeShiftPx, insideLeftEdge - insideRightEdge);\n });\n // Don't shift further left than the notehead of the last context. Actually, stay at most 5% to the right\n // so that two different tick contexts don't align across staves.\n maxNegativeShiftPx = Math.min(maxNegativeShiftPx, context.getX() - (prevContext.getX() + adjustedJustifyWidth * 0.05));\n // Calculate the expected distance of the current context from the last matching tickable. The\n // distance is scaled down by the softmax for the voice.\n if (globalSoftmax) {\n const t = totalTicks;\n expectedDistance = (Math.pow(softmaxFactor, (maxTicks / t)) / expTicksUsed) * adjustedJustifyWidth;\n }\n else if (typeof backTickable !== 'undefined') {\n expectedDistance = backTickable.getVoice().softmax(maxTicks) * adjustedJustifyWidth;\n }\n return {\n expectedDistance,\n maxNegativeShiftPx,\n fromTickable: backTickable,\n };\n }\n }\n }\n return { expectedDistance: 0, fromTickablePx: 0, maxNegativeShiftPx: 0 };\n });\n return distances;\n }\n function shiftToIdealDistances(idealDistances) {\n // Distribute ticks to the contexts based on the calculated distance error.\n const centerX = adjustedJustifyWidth / 2;\n let spaceAccum = 0;\n contextList.forEach((tick, index) => {\n const context = contextMap[tick];\n if (index > 0) {\n const contextX = context.getX();\n const ideal = idealDistances[index];\n const errorPx = defined(ideal.fromTickable).getX() + ideal.expectedDistance - (contextX + spaceAccum);\n let negativeShiftPx = 0;\n if (errorPx > 0) {\n spaceAccum += errorPx;\n }\n else if (errorPx < 0) {\n negativeShiftPx = Math.min(ideal.maxNegativeShiftPx, Math.abs(errorPx));\n spaceAccum += -negativeShiftPx;\n }\n context.setX(contextX + spaceAccum);\n }\n // Move center aligned tickables to middle\n context.getCenterAlignedTickables().forEach((tickable) => {\n tickable.setCenterXShift(centerX - context.getX());\n });\n });\n return lastContext.getX() - firstContext.getX();\n }\n const adjustedJustifyWidth = justifyWidth -\n lastContext.getMetrics().notePx -\n lastContext.getMetrics().totalRightPx -\n firstContext.getMetrics().totalLeftPx;\n const musicFont = Tables.currentMusicFont();\n const configMinPadding = musicFont.lookupMetric('stave.endPaddingMin');\n const configMaxPadding = musicFont.lookupMetric('stave.endPaddingMax');\n let targetWidth = adjustedJustifyWidth;\n const distances = calculateIdealDistances(targetWidth);\n let actualWidth = shiftToIdealDistances(distances);\n // Calculate right justification by finding max of (configured value, min distance between tickables)\n // so measures with lots of white space use it evenly, and crowded measures use at least the configured\n // space.\n const calcMinDistance = (targetWidth, distances) => {\n let mdCalc = targetWidth / 2;\n if (distances.length > 1) {\n for (let di = 1; di < distances.length; ++di) {\n mdCalc = Math.min(distances[di].expectedDistance / 2, mdCalc);\n }\n }\n return mdCalc;\n };\n const minDistance = calcMinDistance(targetWidth, distances);\n // Just one context. Done formatting.\n if (contextList.length === 1)\n return 0;\n // right justify to either the configured padding, or the min distance between notes, whichever is greatest.\n // This * 2 keeps the existing formatting unless there is 'a lot' of extra whitespace, which won't break\n // existing visual regression tests.\n const paddingMax = configMaxPadding * 2 < minDistance ? minDistance : configMaxPadding;\n const paddingMin = paddingMax - (configMaxPadding - configMinPadding);\n const maxX = adjustedJustifyWidth - paddingMin;\n let iterations = maxIterations;\n // Adjust justification width until the right margin is as close as possible to the calculated padding,\n // without going over\n while ((actualWidth > maxX && iterations > 0) || (actualWidth + paddingMax < maxX && iterations > 1)) {\n targetWidth -= actualWidth - maxX;\n actualWidth = shiftToIdealDistances(calculateIdealDistances(targetWidth));\n iterations--;\n }\n this.justifyWidth = justifyWidth;\n return this.evaluate();\n }\n /** Calculate the total cost of this formatting decision. */\n evaluate() {\n if (!this.tickContexts)\n return 0;\n const contexts = this.tickContexts;\n const justifyWidth = this.justifyWidth;\n // Calculate available slack per tick context. This works out how much freedom\n // to move a context has in either direction, without affecting other notes.\n this.contextGaps = { total: 0, gaps: [] };\n contexts.list.forEach((tick, index) => {\n if (index === 0)\n return;\n const prevTick = contexts.list[index - 1];\n const prevContext = contexts.map[prevTick];\n const context = contexts.map[tick];\n const prevMetrics = prevContext.getMetrics();\n const currMetrics = context.getMetrics();\n // Calculate X position of right edge of previous note\n const insideRightEdge = prevContext.getX() + prevMetrics.notePx + prevMetrics.totalRightPx;\n // Calculate X position of left edge of current note\n const insideLeftEdge = context.getX() - currMetrics.totalLeftPx;\n const gap = insideLeftEdge - insideRightEdge;\n this.contextGaps.total += gap;\n this.contextGaps.gaps.push({ x1: insideRightEdge, x2: insideLeftEdge });\n // Tell the tick contexts how much they can reposition themselves.\n context.getFormatterMetrics().freedom.left = gap;\n prevContext.getFormatterMetrics().freedom.right = gap;\n });\n // Calculate mean distance in each voice for each duration type, then calculate\n // how far each note is from the mean.\n this.durationStats = {};\n const durationStats = this.durationStats;\n function updateStats(duration, space) {\n const stats = durationStats[duration];\n if (stats === undefined) {\n durationStats[duration] = { mean: space, count: 1 };\n }\n else {\n stats.count += 1;\n stats.mean = (stats.mean + space) / 2;\n }\n }\n this.voices.forEach((voice) => {\n voice.getTickables().forEach((note, i, notes) => {\n const duration = note.getTicks().clone().simplify().toString();\n const metrics = note.getMetrics();\n const formatterMetrics = note.getFormatterMetrics();\n const leftNoteEdge = note.getX() + metrics.notePx + metrics.modRightPx + metrics.rightDisplacedHeadPx;\n let space = 0;\n if (i < notes.length - 1) {\n const rightNote = notes[i + 1];\n const rightMetrics = rightNote.getMetrics();\n const rightNoteEdge = rightNote.getX() - rightMetrics.modLeftPx - rightMetrics.leftDisplacedHeadPx;\n space = rightNoteEdge - leftNoteEdge;\n formatterMetrics.space.used = rightNote.getX() - note.getX();\n rightNote.getFormatterMetrics().freedom.left = space;\n }\n else {\n space = justifyWidth - leftNoteEdge;\n formatterMetrics.space.used = justifyWidth - note.getX();\n }\n formatterMetrics.freedom.right = space;\n updateStats(duration, formatterMetrics.space.used);\n });\n });\n // Calculate how much each note deviates from the mean. Loss function is square\n // root of the sum of squared deviations.\n let totalDeviation = 0;\n this.voices.forEach((voice) => {\n voice.getTickables().forEach((note) => {\n const duration = note.getTicks().clone().simplify().toString();\n const metrics = note.getFormatterMetrics();\n metrics.space.mean = durationStats[duration].mean;\n metrics.duration = duration;\n metrics.iterations += 1;\n metrics.space.deviation = metrics.space.used - metrics.space.mean;\n totalDeviation += Math.pow(metrics.space.deviation, 2);\n });\n });\n this.totalCost = Math.sqrt(totalDeviation);\n this.lossHistory.push(this.totalCost);\n return this.totalCost;\n }\n /**\n * Run a single iteration of rejustification. At a high level, this method calculates\n * the overall \"loss\" (or cost) of this layout, and repositions tickcontexts in an\n * attempt to reduce the cost. You can call this method multiple times until it finds\n * and oscillates around a global minimum.\n * @param alpha the \"learning rate\" for the formatter. It determines how much of a shift\n * the formatter should make based on its cost function.\n */\n tune(options) {\n var _a;\n const contexts = this.tickContexts;\n if (!contexts) {\n return 0;\n }\n const alpha = (_a = options === null || options === void 0 ? void 0 : options.alpha) !== null && _a !== void 0 ? _a : 0.5;\n // Move `current` tickcontext by `shift` pixels, and adjust the freedom\n // on adjacent tickcontexts.\n function move(current, shift, prev, next) {\n current.setX(current.getX() + shift);\n current.getFormatterMetrics().freedom.left += shift;\n current.getFormatterMetrics().freedom.right -= shift;\n if (prev)\n prev.getFormatterMetrics().freedom.right += shift;\n if (next)\n next.getFormatterMetrics().freedom.left -= shift;\n }\n let shift = 0;\n this.totalShift = 0;\n contexts.list.forEach((tick, index, list) => {\n const context = contexts.map[tick];\n const prevContext = index > 0 ? contexts.map[list[index - 1]] : undefined;\n const nextContext = index < list.length - 1 ? contexts.map[list[index + 1]] : undefined;\n move(context, shift, prevContext, nextContext);\n const cost = -sumArray(context.getTickables().map((t) => t.getFormatterMetrics().space.deviation));\n if (cost > 0) {\n shift = -Math.min(context.getFormatterMetrics().freedom.right, Math.abs(cost));\n }\n else if (cost < 0) {\n if (nextContext) {\n shift = Math.min(nextContext.getFormatterMetrics().freedom.right, Math.abs(cost));\n }\n else {\n shift = 0;\n }\n }\n shift *= alpha;\n this.totalShift += shift;\n });\n return this.evaluate();\n }\n /**\n * This is the top-level call for all formatting logic completed\n * after `x` *and* `y` values have been computed for the notes\n * in the voices.\n */\n postFormat() {\n const postFormatContexts = (contexts) => contexts.list.forEach((tick) => contexts.map[tick].postFormat());\n if (this.modifierContexts)\n postFormatContexts(this.modifierContexts);\n if (this.tickContexts)\n postFormatContexts(this.tickContexts);\n return this;\n }\n /**\n * Take all `voices` and create `ModifierContext`s out of them. This tells\n * the formatters that the voices belong on a single stave.\n */\n joinVoices(voices) {\n this.createModifierContexts(voices);\n this.hasMinTotalWidth = false;\n return this;\n }\n /**\n * Align rests in voices, justify the contexts, and position the notes\n * so voices are aligned and ready to render onto the stave. This method\n * mutates the `x` positions of all tickables in `voices`.\n *\n * Voices are full justified to fit in `justifyWidth` pixels.\n *\n * Set `options.context` to the rendering context. Set `options.align_rests`\n * to true to enable rest alignment.\n */\n format(voices, justifyWidth, options) {\n const opts = Object.assign({ align_rests: false }, options);\n this.voices = voices;\n const softmaxFactor = this.formatterOptions.softmaxFactor;\n if (softmaxFactor) {\n this.voices.forEach((v) => v.setSoftmaxFactor(softmaxFactor));\n }\n this.alignRests(voices, opts.align_rests);\n this.createTickContexts(voices);\n this.preFormat(justifyWidth, opts.context, voices, opts.stave);\n // Only postFormat if a stave was supplied for y value formatting\n if (opts.stave)\n this.postFormat();\n return this;\n }\n // This method is just like `format` except that the `justifyWidth` is inferred from the `stave`.\n formatToStave(voices, stave, optionsParam) {\n const options = Object.assign({ context: stave.getContext() }, optionsParam);\n // eslint-disable-next-line\n const justifyWidth = stave.getNoteEndX() - stave.getNoteStartX() - Stave.defaultPadding;\n L('Formatting voices to width: ', justifyWidth);\n return this.format(voices, justifyWidth, options);\n }\n getTickContext(tick) {\n var _a;\n return (_a = this.tickContexts) === null || _a === void 0 ? void 0 : _a.map[tick];\n }\n}\n// To enable logging for this class. Set `Vex.Flow.Formatter.DEBUG` to `true`.\nFormatter.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Author: Joshua Koo / @zz85\n// Author: @incompleteopus\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\n/** Fraction represents a rational number. */\nexport class Fraction {\n /** Set the numerator and denominator. */\n constructor(numerator, denominator) {\n this.numerator = 1;\n this.denominator = 1;\n this.set(numerator, denominator);\n }\n static get CATEGORY() {\n return Category.Fraction;\n }\n /**\n * GCD: Greatest common divisor using the Euclidean algorithm.\n * Note: GCD(0, 0) => 0 and GCD(0, n) => n.\n */\n static GCD(a, b) {\n if (typeof a !== 'number' || Number.isNaN(a) || typeof b !== 'number' || Number.isNaN(b)) {\n throw new RuntimeError('BadArgument', `Invalid numbers: ${a}, ${b}`);\n }\n let t;\n while (b !== 0) {\n t = b;\n b = a % b;\n a = t;\n }\n return a;\n }\n /** LCM: Lowest common multiple. */\n static LCM(a, b) {\n return (a * b) / Fraction.GCD(a, b);\n }\n /** Lowest common multiple for more than two numbers. */\n static LCMM(args) {\n if (args.length === 0) {\n return 0;\n }\n else if (args.length === 1) {\n return args[0];\n }\n else if (args.length === 2) {\n return Fraction.LCM(args[0], args[1]);\n }\n else {\n // args.shift() removes the first number.\n // LCM the first number with the rest of the numbers.\n return Fraction.LCM(args.shift(), Fraction.LCMM(args));\n }\n }\n /** Set the numerator and denominator. */\n set(numerator = 1, denominator = 1) {\n this.numerator = numerator;\n this.denominator = denominator;\n return this;\n }\n /** Return the value of the fraction. */\n value() {\n return this.numerator / this.denominator;\n }\n /** Simplify numerator and denominator using GCD. */\n simplify() {\n let u = this.numerator;\n let d = this.denominator;\n const gcd = Fraction.GCD(u, d);\n u /= gcd;\n d /= gcd;\n if (d < 0) {\n d = -d;\n u = -u;\n }\n return this.set(u, d);\n }\n /** Add value of another fraction. */\n add(param1 = 0, param2 = 1) {\n const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2);\n const lcm = Fraction.LCM(this.denominator, otherDenominator);\n const a = lcm / this.denominator;\n const b = lcm / otherDenominator;\n const u = this.numerator * a + otherNumerator * b;\n return this.set(u, lcm);\n }\n /** Substract value of another fraction. */\n subtract(param1 = 0, param2 = 1) {\n const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2);\n const lcm = Fraction.LCM(this.denominator, otherDenominator);\n const a = lcm / this.denominator;\n const b = lcm / otherDenominator;\n const u = this.numerator * a - otherNumerator * b;\n return this.set(u, lcm);\n }\n /** Multiply by value of another fraction. */\n multiply(param1 = 1, param2 = 1) {\n const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2);\n return this.set(this.numerator * otherNumerator, this.denominator * otherDenominator);\n }\n /** Divide by value of another Fraction. */\n divide(param1 = 1, param2 = 1) {\n const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2);\n return this.set(this.numerator * otherDenominator, this.denominator * otherNumerator);\n }\n /** Simplify both sides and check if they are equal. */\n equals(compare) {\n const a = Fraction.__staticFractionA.copy(compare).simplify();\n const b = Fraction.__staticFractionB.copy(this).simplify();\n return a.numerator === b.numerator && a.denominator === b.denominator;\n }\n /** Greater than operator. */\n greaterThan(compare) {\n const a = Fraction.__staticFractionB.copy(this);\n a.subtract(compare);\n return a.numerator > 0;\n }\n /** Greater than or equals operator. */\n greaterThanEquals(compare) {\n const a = Fraction.__staticFractionB.copy(this);\n a.subtract(compare);\n return a.numerator >= 0;\n }\n /** Less than operator. */\n lessThan(compare) {\n return !this.greaterThanEquals(compare);\n }\n /** Less than or equals operator. */\n lessThanEquals(compare) {\n return !this.greaterThan(compare);\n }\n /** Return a new copy with current values. */\n clone() {\n return new Fraction(this.numerator, this.denominator);\n }\n /** Copy value of another fraction. */\n copy(other) {\n if (typeof other === 'number') {\n return this.set(other, 1);\n }\n else {\n return this.set(other.numerator, other.denominator);\n }\n }\n /** Return the integer component (eg. 5/2 => 2). */\n quotient() {\n return Math.floor(this.numerator / this.denominator);\n }\n /** Return the remainder component (eg. 5/2 => 1). */\n remainder() {\n return this.numerator % this.denominator;\n }\n /** Calculate absolute value. */\n makeAbs() {\n this.denominator = Math.abs(this.denominator);\n this.numerator = Math.abs(this.numerator);\n return this;\n }\n /** Return a raw string representation (eg. \"5/2\"). */\n toString() {\n return `${this.numerator}/${this.denominator}`;\n }\n /** Return a simplified string respresentation. */\n toSimplifiedString() {\n return Fraction.__staticFractionTmp.copy(this).simplify().toString();\n }\n /** Return string representation in mixed form. */\n toMixedString() {\n let s = '';\n const q = this.quotient();\n const f = Fraction.__staticFractionTmp.copy(this);\n if (q < 0) {\n f.makeAbs();\n }\n if (q !== 0) {\n s += q;\n if (f.numerator !== 0) {\n s += ` ${f.toSimplifiedString()}`;\n }\n }\n else if (f.numerator === 0) {\n s = '0';\n }\n else {\n s = f.toSimplifiedString();\n }\n return s;\n }\n /** Parse a fraction string. */\n parse(str) {\n const i = str.split('/');\n const n = parseInt(i[0], 10);\n const d = i[1] ? parseInt(i[1], 10) : 1;\n return this.set(n, d);\n }\n}\n// Cached objects for comparisons.\nFraction.__staticFractionA = new Fraction();\nFraction.__staticFractionB = new Fraction();\nFraction.__staticFractionTmp = new Fraction();\n/** Helper function to extract the numerator and denominator from another fraction. */\nfunction getNumeratorAndDenominator(n, d = 1) {\n if (typeof n === 'number') {\n // Both params are numbers, so we return them as [numerator, denominator].\n return [n, d];\n }\n else {\n // First param is a Fraction object. We ignore the second param.\n return [n.numerator, n.denominator];\n }\n}\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n// Author Larry Kuhns 2013\n// Class to draws string numbers into the notation.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { Tables } from './tables';\nimport { TextFormatter } from './textformatter';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class FretHandFinger extends Modifier {\n constructor(finger) {\n super();\n this.finger = finger;\n this.width = 7;\n this.position = Modifier.Position.LEFT; // Default position above stem or note head\n this.x_shift = 0;\n this.y_shift = 0;\n this.x_offset = 0; // Horizontal offset from default\n this.y_offset = 0; // Vertical offset from default\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.FretHandFinger;\n }\n // Arrange fingerings inside a ModifierContext.\n static format(nums, state) {\n const { left_shift, right_shift } = state;\n const num_spacing = 1;\n if (!nums || nums.length === 0)\n return false;\n const nums_list = [];\n let prev_note = null;\n let shiftLeft = 0;\n let shiftRight = 0;\n for (let i = 0; i < nums.length; ++i) {\n const num = nums[i];\n const note = num.getNote();\n const pos = num.getPosition();\n const index = num.checkIndex();\n const props = note.getKeyProps()[index];\n const textFormatter = TextFormatter.create(num.textFont);\n const textHeight = textFormatter.maxHeight;\n if (num.position === ModifierPosition.ABOVE) {\n state.top_text_line += textHeight / Tables.STAVE_LINE_DISTANCE + 0.5;\n }\n if (num.position === ModifierPosition.BELOW) {\n state.text_line += textHeight / Tables.STAVE_LINE_DISTANCE + 0.5;\n }\n if (note !== prev_note) {\n for (let n = 0; n < note.keys.length; ++n) {\n if (left_shift === 0) {\n shiftLeft = Math.max(note.getLeftDisplacedHeadPx(), shiftLeft);\n }\n if (right_shift === 0) {\n shiftRight = Math.max(note.getRightDisplacedHeadPx(), shiftRight);\n }\n }\n prev_note = note;\n }\n nums_list.push({\n note,\n num,\n pos,\n line: props.line,\n shiftL: shiftLeft,\n shiftR: shiftRight,\n });\n }\n // Sort fingernumbers by line number.\n nums_list.sort((a, b) => b.line - a.line);\n let numShiftL = 0;\n let numShiftR = 0;\n let xWidthL = 0;\n let xWidthR = 0;\n let lastLine = null;\n let lastNote = null;\n for (let i = 0; i < nums_list.length; ++i) {\n let num_shift = 0;\n const { note, pos, num, line, shiftL, shiftR } = nums_list[i];\n // Reset the position of the string number every line.\n if (line !== lastLine || note !== lastNote) {\n numShiftL = left_shift + shiftL;\n numShiftR = right_shift + shiftR;\n }\n const numWidth = num.getWidth() + num_spacing;\n if (pos === Modifier.Position.LEFT) {\n num.setXShift(left_shift + numShiftL);\n num_shift = left_shift + numWidth; // spacing\n xWidthL = num_shift > xWidthL ? num_shift : xWidthL;\n }\n else if (pos === Modifier.Position.RIGHT) {\n num.setXShift(numShiftR);\n num_shift = shiftRight + numWidth; // spacing\n xWidthR = num_shift > xWidthR ? num_shift : xWidthR;\n }\n lastLine = line;\n lastNote = note;\n }\n state.left_shift += xWidthL;\n state.right_shift += xWidthR;\n return true;\n }\n static easyScoreHook({ fingerings } = {}, note, builder) {\n fingerings === null || fingerings === void 0 ? void 0 : fingerings.split(',').map((fingeringString) => {\n const split = fingeringString.trim().split('.');\n const params = { number: split[0] };\n if (split[1])\n params.position = split[1];\n return builder.getFactory().Fingering(params);\n }).map((fingering, index) => note.addModifier(fingering, index));\n }\n setFretHandFinger(finger) {\n this.finger = finger;\n return this;\n }\n getFretHandFinger() {\n return this.finger;\n }\n setOffsetX(x) {\n this.x_offset = x;\n return this;\n }\n setOffsetY(y) {\n this.y_offset = y;\n return this;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(this.position, this.index);\n let dot_x = start.x + this.x_shift + this.x_offset;\n let dot_y = start.y + this.y_shift + this.y_offset + 5;\n switch (this.position) {\n case Modifier.Position.ABOVE:\n dot_x -= 4;\n dot_y -= 12;\n break;\n case Modifier.Position.BELOW:\n dot_x -= 2;\n dot_y += 10;\n break;\n case Modifier.Position.LEFT:\n dot_x -= this.width;\n break;\n case Modifier.Position.RIGHT:\n dot_x += 1;\n break;\n default:\n throw new RuntimeError('InvalidPosition', `The position ${this.position} does not exist`);\n }\n ctx.save();\n ctx.setFont(this.textFont);\n ctx.fillText('' + this.finger, dot_x, dot_y);\n ctx.restore();\n }\n}\nFretHandFinger.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 9,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\nimport { StemmableNote } from './stemmablenote';\nimport { Category, isAnnotation } from './typeguard';\nimport { RuntimeError } from './util';\nconst ERROR_MSG = 'Ghost note must have valid initialization data to identify duration.';\nexport class GhostNote extends StemmableNote {\n static get CATEGORY() {\n return Category.GhostNote;\n }\n constructor(parameter) {\n if (!parameter) {\n throw new RuntimeError('BadArguments', ERROR_MSG);\n }\n let noteStruct;\n if (typeof parameter === 'string') {\n // Preserve backwards-compatibility\n noteStruct = { duration: parameter };\n }\n else if (typeof parameter === 'object') {\n noteStruct = parameter;\n }\n else {\n throw new RuntimeError('BadArguments', ERROR_MSG);\n }\n super(noteStruct);\n // Note properties\n this.setWidth(0);\n }\n /**\n * @returns true if this note is a type of rest. Rests don't have pitches, but take up space in the score.\n */\n isRest() {\n return true;\n }\n setStave(stave) {\n super.setStave(stave);\n return this;\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n draw() {\n // Draw Annotations\n this.setRendered();\n for (let i = 0; i < this.modifiers.length; ++i) {\n const modifier = this.modifiers[i];\n if (isAnnotation(modifier)) {\n modifier.setContext(this.getContext());\n modifier.drawWithStyle();\n }\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { BoundingBox } from './boundingbox';\nimport { BoundingBoxComputation } from './boundingboxcomputation';\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nexport var OutlineCode;\n(function (OutlineCode) {\n OutlineCode[OutlineCode[\"MOVE\"] = 0] = \"MOVE\";\n OutlineCode[OutlineCode[\"LINE\"] = 1] = \"LINE\";\n OutlineCode[OutlineCode[\"QUADRATIC\"] = 2] = \"QUADRATIC\";\n OutlineCode[OutlineCode[\"BEZIER\"] = 3] = \"BEZIER\";\n})(OutlineCode || (OutlineCode = {}));\nclass GlyphCacheEntry {\n constructor(fontStack, code, category) {\n this.point = -1;\n this.metrics = Glyph.loadMetrics(fontStack, code, category);\n this.bbox = Glyph.getOutlineBoundingBox(this.metrics.outline, this.metrics.scale, this.metrics.x_shift, this.metrics.y_shift);\n if (category) {\n this.point = Glyph.lookupFontMetric(this.metrics.font, category, code, 'point', -1);\n }\n }\n}\nclass GlyphCache {\n constructor() {\n this.cache = new Map();\n }\n lookup(code, category) {\n let entries = this.cache.get(Glyph.CURRENT_CACHE_KEY);\n if (entries === undefined) {\n entries = {};\n this.cache.set(Glyph.CURRENT_CACHE_KEY, entries);\n }\n const key = category ? `${code}%${category}` : code;\n let entry = entries[key];\n if (entry === undefined) {\n entry = new GlyphCacheEntry(Glyph.MUSIC_FONT_STACK, code, category);\n entries[key] = entry;\n }\n return entry;\n }\n}\nclass GlyphOutline {\n constructor(outline, originX, originY, scale) {\n this.outline = outline;\n this.originX = originX;\n this.originY = originY;\n this.scale = scale;\n this.i = 0;\n // Automatically assign private properties: this.outline, this.originX, this.originY, and this.scale.\n }\n done() {\n return this.i >= this.outline.length;\n }\n next() {\n return this.outline[this.i++];\n }\n nextX() {\n return this.originX + this.outline[this.i++] * this.scale;\n }\n nextY() {\n return this.originY - this.outline[this.i++] * this.scale;\n }\n static parse(str) {\n const result = [];\n const parts = str.split(' ');\n let i = 0;\n while (i < parts.length) {\n switch (parts[i++]) {\n case 'm':\n result.push(OutlineCode.MOVE, parseInt(parts[i++]), parseInt(parts[i++]));\n break;\n case 'l':\n result.push(OutlineCode.LINE, parseInt(parts[i++]), parseInt(parts[i++]));\n break;\n case 'q':\n result.push(OutlineCode.QUADRATIC, parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]));\n break;\n case 'b':\n result.push(OutlineCode.BEZIER, parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]));\n break;\n }\n }\n return result;\n }\n}\nexport class Glyph extends Element {\n /**\n * @param code\n * @param point\n * @param options\n */\n constructor(code, point, options) {\n super();\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // INSTANCE MEMBERS\n this.bbox = new BoundingBox(0, 0, 0, 0);\n this.topGlyphs = [];\n this.botGlyphs = [];\n this.options = {};\n this.scale = 1;\n this.code = code;\n this.point = point;\n this.originShift = { x: 0, y: 0 };\n this.x_shift = 0;\n this.y_shift = 0;\n if (options) {\n this.setOptions(options);\n }\n else {\n this.reset();\n }\n }\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // STATIC MEMBERS\n static get CATEGORY() {\n return Category.Glyph;\n }\n /**\n * Pass a key of the form `glyphs.{category}.{code}.{key}` to Font.lookupMetric(). If the initial lookup fails,\n * try again with the path `glyphs.{category}.{key}`. If the second lookup fails, return the defaultValue.\n *\n * @param font\n * @param category any metric path under 'glyphs', so 'stem.up' could resolve to glyphs.stem.up.shiftX, glyphs.stem.up.shiftY, etc.\n * @param code\n * @param key\n * @param defaultValue\n */\n static lookupFontMetric(font, category, code, key, defaultValue) {\n let value = font.lookupMetric(`glyphs.${category}.${code}.${key}`, undefined);\n if (value === undefined) {\n // The first lookup failed, so we omit .${code} and try again (with a defaultValue this time).\n value = font.lookupMetric(`glyphs.${category}.${key}`, defaultValue);\n }\n return value;\n }\n static lookupGlyph(fontStack, code) {\n defined(fontStack, 'BadFontStack', 'Font stack is misconfigured');\n let glyph;\n let font;\n for (let i = 0; i < fontStack.length; i++) {\n font = fontStack[i];\n glyph = font.getGlyphs()[code];\n if (glyph)\n return { glyph, font };\n }\n throw new RuntimeError('BadGlyph', `Glyph ${code} does not exist in font.`);\n }\n static loadMetrics(fontStack, code, category) {\n const { glyph, font } = Glyph.lookupGlyph(fontStack, code);\n if (!glyph.o)\n throw new RuntimeError('BadGlyph', `Glyph ${code} has no outline defined.`);\n let x_shift = 0;\n let y_shift = 0;\n let scale = 1;\n if (category && font) {\n x_shift = Glyph.lookupFontMetric(font, category, code, 'shiftX', 0);\n y_shift = Glyph.lookupFontMetric(font, category, code, 'shiftY', 0);\n scale = Glyph.lookupFontMetric(font, category, code, 'scale', 1);\n }\n const x_min = glyph.x_min;\n const x_max = glyph.x_max;\n const ha = glyph.ha;\n if (!glyph.cached_outline) {\n glyph.cached_outline = GlyphOutline.parse(glyph.o);\n }\n return {\n x_min,\n x_max,\n x_shift,\n y_shift,\n scale,\n ha,\n outline: glyph.cached_outline,\n font,\n width: x_max - x_min,\n height: ha,\n };\n }\n /**\n * Renders glyphs from the default font stack.\n *\n * @param ctx Canvas or SVG context\n * @param x_pos x coordinate\n * @param y_pos y coordinate\n * @param point the point size of the font\n * @param code the glyph code in font.getGlyphs()\n * @param options\n * @returns\n */\n static renderGlyph(ctx, x_pos, y_pos, point, code, options) {\n var _a;\n const data = Glyph.cache.lookup(code, options === null || options === void 0 ? void 0 : options.category);\n const metrics = data.metrics;\n if (data.point != -1) {\n point = data.point;\n }\n const customScale = (_a = options === null || options === void 0 ? void 0 : options.scale) !== null && _a !== void 0 ? _a : 1;\n const scale = ((point * 72.0) / (metrics.font.getResolution() * 100.0)) * metrics.scale * customScale;\n Glyph.renderOutline(ctx, metrics.outline, scale, x_pos + metrics.x_shift * customScale, y_pos + metrics.y_shift * customScale);\n return metrics;\n }\n static renderOutline(ctx, outline, scale, x_pos, y_pos) {\n const go = new GlyphOutline(outline, x_pos, y_pos, scale);\n ctx.beginPath();\n let x, y;\n while (!go.done()) {\n switch (go.next()) {\n case OutlineCode.MOVE:\n ctx.moveTo(go.nextX(), go.nextY());\n break;\n case OutlineCode.LINE:\n ctx.lineTo(go.nextX(), go.nextY());\n break;\n case OutlineCode.QUADRATIC:\n x = go.nextX();\n y = go.nextY();\n ctx.quadraticCurveTo(go.nextX(), go.nextY(), x, y);\n break;\n case OutlineCode.BEZIER:\n x = go.nextX();\n y = go.nextY();\n ctx.bezierCurveTo(go.nextX(), go.nextY(), go.nextX(), go.nextY(), x, y);\n break;\n }\n }\n ctx.fill();\n }\n static getOutlineBoundingBox(outline, scale, x_pos, y_pos) {\n const go = new GlyphOutline(outline, x_pos, y_pos, scale);\n const bboxComp = new BoundingBoxComputation();\n // (penX, penY) hold the pen position: the start of each stroke.\n let penX = x_pos;\n let penY = y_pos;\n let x, y;\n while (!go.done()) {\n switch (go.next()) {\n case OutlineCode.MOVE:\n // Note that we don't add any points to the bounding box until a srroke is actually drawn.\n penX = go.nextX();\n penY = go.nextY();\n break;\n case OutlineCode.LINE:\n bboxComp.addPoint(penX, penY);\n penX = go.nextX();\n penY = go.nextY();\n bboxComp.addPoint(penX, penY);\n break;\n case OutlineCode.QUADRATIC:\n x = go.nextX();\n y = go.nextY();\n bboxComp.addQuadraticCurve(penX, penY, go.nextX(), go.nextY(), x, y);\n penX = x;\n penY = y;\n break;\n case OutlineCode.BEZIER:\n x = go.nextX();\n y = go.nextY();\n bboxComp.addBezierCurve(penX, penY, go.nextX(), go.nextY(), go.nextX(), go.nextY(), x, y);\n penX = x;\n penY = y;\n break;\n }\n }\n return new BoundingBox(bboxComp.getX1(), bboxComp.getY1(), bboxComp.width(), bboxComp.height());\n }\n static getWidth(code, point, category) {\n const data = Glyph.cache.lookup(code, category);\n if (data.point != -1) {\n point = data.point;\n }\n const scale = (point * 72) / (data.metrics.font.getResolution() * 100);\n return data.bbox.getW() * scale;\n }\n // eslint-disable-next-line\n draw(...args) {\n // DO NOTHING.\n }\n getCode() {\n return this.code;\n }\n // eslint-disable-next-line\n setOptions(options) {\n this.options = Object.assign(Object.assign({}, this.options), options);\n this.reset();\n }\n setPoint(point) {\n this.point = point;\n return this;\n }\n setStave(stave) {\n this.stave = stave;\n return this;\n }\n setXShift(x_shift) {\n this.x_shift = x_shift;\n return this;\n }\n setYShift(y_shift) {\n this.y_shift = y_shift;\n return this;\n }\n reset() {\n const data = Glyph.cache.lookup(this.code, this.options.category);\n this.metrics = data.metrics;\n // Override point from metrics file\n if (data.point != -1) {\n this.point = data.point;\n }\n this.scale = (this.point * 72) / (this.metrics.font.getResolution() * 100);\n this.bbox = new BoundingBox(data.bbox.getX() * this.scale, data.bbox.getY() * this.scale, data.bbox.getW() * this.scale, data.bbox.getH() * this.scale);\n }\n checkMetrics() {\n return defined(this.metrics, 'BadGlyph', `Glyph ${this.code} is not initialized.`);\n }\n getMetrics() {\n const metrics = this.checkMetrics();\n const metricsScale = metrics.scale;\n return {\n x_min: metrics.x_min * this.scale * metricsScale,\n x_max: metrics.x_max * this.scale * metricsScale,\n width: this.bbox.getW(),\n height: this.bbox.getH(),\n scale: this.scale * metricsScale,\n x_shift: metrics.x_shift,\n y_shift: metrics.y_shift,\n outline: metrics.outline,\n font: metrics.font,\n ha: metrics.ha,\n };\n }\n setOriginX(x) {\n const { bbox } = this;\n const originX = Math.abs(bbox.getX() / bbox.getW());\n const xShift = (x - originX) * bbox.getW();\n this.originShift.x = -xShift;\n }\n setOriginY(y) {\n const { bbox } = this;\n const originY = Math.abs(bbox.getY() / bbox.getH());\n const yShift = (y - originY) * bbox.getH();\n this.originShift.y = -yShift;\n }\n setOrigin(x, y) {\n this.setOriginX(x);\n this.setOriginY(y);\n }\n render(ctx, x, y) {\n const metrics = this.checkMetrics();\n const outline = metrics.outline;\n const scale = this.scale * metrics.scale;\n this.setRendered();\n this.applyStyle(ctx);\n const xPos = x + this.originShift.x + metrics.x_shift;\n const yPos = y + this.originShift.y + metrics.y_shift;\n Glyph.renderOutline(ctx, outline, scale, xPos, yPos);\n this.restoreStyle(ctx);\n }\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n renderToStave(x) {\n const context = this.checkContext();\n const metrics = this.checkMetrics();\n const stave = this.checkStave();\n const outline = metrics.outline;\n const scale = this.scale * metrics.scale;\n this.setRendered();\n this.applyStyle();\n const xPos = x + this.x_shift + metrics.x_shift;\n const yPos = stave.getYForGlyphs() + this.y_shift + metrics.y_shift;\n Glyph.renderOutline(context, outline, scale, xPos, yPos);\n this.restoreStyle();\n }\n}\nGlyph.cache = new GlyphCache();\n// The current cache key for GlyphCache above.\n// Computed when Flow.setMusicFont(...) is called.\n// It is set to a comma separated list of font names.\nGlyph.CURRENT_CACHE_KEY = '';\n// Used by the GlyphCache above.\n// Set when Flow.setMusicFont(...) is called.\nGlyph.MUSIC_FONT_STACK = [];\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { Note } from './note';\nimport { Category } from './typeguard';\nexport class GlyphNote extends Note {\n constructor(glyph, noteStruct, options) {\n super(noteStruct);\n this.options = Object.assign({ ignoreTicks: false, line: 2 }, options);\n // Note properties\n this.ignore_ticks = this.options.ignoreTicks;\n if (glyph) {\n this.setGlyph(glyph);\n }\n }\n static get CATEGORY() {\n return Category.GlyphNote;\n }\n setGlyph(glyph) {\n this.glyph = glyph;\n this.setWidth(this.glyph.getMetrics().width);\n return this;\n }\n getBoundingBox() {\n return this.glyph.getBoundingBox();\n }\n preFormat() {\n if (!this.preFormatted && this.modifierContext) {\n this.modifierContext.preFormat();\n }\n this.preFormatted = true;\n return this;\n }\n drawModifiers() {\n const ctx = this.checkContext();\n ctx.openGroup('modifiers');\n for (let i = 0; i < this.modifiers.length; i++) {\n const modifier = this.modifiers[i];\n modifier.setContext(ctx);\n modifier.drawWithStyle();\n }\n ctx.closeGroup();\n }\n draw() {\n const stave = this.checkStave();\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.openGroup('glyphNote', this.getAttribute('id'));\n // Context is set when setStave is called on Note\n const glyph = this.glyph;\n if (!glyph.getContext()) {\n glyph.setContext(ctx);\n }\n glyph.setStave(stave);\n glyph.setYShift(stave.getYForLine(this.options.line) - stave.getYForGlyphs());\n const x = this.isCenterAligned() ? this.getAbsoluteX() - this.getWidth() / 2 : this.getAbsoluteX();\n glyph.renderToStave(x);\n this.drawModifiers();\n ctx.closeGroup();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { StaveNote } from './stavenote';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class GraceNote extends StaveNote {\n constructor(noteStruct) {\n super(Object.assign({ glyph_font_scale: Tables.NOTATION_FONT_SCALE * GraceNote.SCALE, stroke_px: GraceNote.LEDGER_LINE_OFFSET }, noteStruct));\n this.slash = noteStruct.slash || false;\n this.slur = true;\n this.buildNoteHeads();\n this.width = 3;\n }\n static get CATEGORY() {\n return Category.GraceNote;\n }\n static get LEDGER_LINE_OFFSET() {\n return 2;\n }\n static get SCALE() {\n return 0.66;\n }\n getStemExtension() {\n if (this.stem_extension_override) {\n return this.stem_extension_override;\n }\n const glyph = this.getGlyph();\n if (glyph) {\n let ret = super.getStemExtension();\n if (glyph.stem) {\n const staveNoteScale = this.getStaveNoteScale();\n ret = (Stem.HEIGHT + ret) * staveNoteScale - Stem.HEIGHT;\n }\n return ret;\n }\n return 0;\n }\n // FIXME: move this to more basic class.\n getStaveNoteScale() {\n return this.render_options.glyph_font_scale / Tables.NOTATION_FONT_SCALE;\n }\n draw() {\n super.draw();\n this.setRendered();\n const stem = this.stem;\n if (this.slash && stem) {\n const staveNoteScale = this.getStaveNoteScale();\n // some magic numbers are based on the staveNoteScale 0.66.\n const offsetScale = staveNoteScale / 0.66;\n let slashBBox = undefined;\n const beam = this.beam;\n if (beam) {\n // FIXME: should render slash after beam?\n if (!beam.postFormatted) {\n beam.postFormat();\n }\n slashBBox = this.calcBeamedNotesSlashBBox(8 * offsetScale, 8 * offsetScale, {\n stem: 6 * offsetScale,\n beam: 5 * offsetScale,\n });\n }\n else {\n const stem_direction = this.getStemDirection();\n const noteHeadBounds = this.getNoteHeadBounds();\n const noteStemHeight = stem.getHeight();\n let x = this.getAbsoluteX();\n let y = stem_direction === Stem.DOWN\n ? noteHeadBounds.y_top - noteStemHeight\n : noteHeadBounds.y_bottom - noteStemHeight;\n let defaultOffsetY = Tables.STEM_HEIGHT;\n defaultOffsetY -= defaultOffsetY / 2.8;\n y += defaultOffsetY * staveNoteScale * stem_direction;\n const offsets = stem_direction === Stem.UP\n ? {\n x1: 1,\n y1: 0,\n x2: 13,\n y2: -9,\n }\n : {\n x1: -4,\n y1: 1,\n x2: 13,\n y2: 9,\n };\n x += offsets.x1 * offsetScale;\n y += offsets.y1 * offsetScale;\n slashBBox = {\n x1: x,\n y1: y,\n x2: x + offsets.x2 * offsetScale,\n y2: y + offsets.y2 * offsetScale,\n };\n }\n // FIXME: avoid staff lines, ledger lines or others.\n const ctx = this.checkContext();\n ctx.save();\n ctx.setLineWidth(1 * offsetScale); // FIXME: use more appropriate value.\n ctx.beginPath();\n ctx.moveTo(slashBBox.x1, slashBBox.y1);\n ctx.lineTo(slashBBox.x2, slashBBox.y2);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n }\n }\n calcBeamedNotesSlashBBox(slashStemOffset, slashBeamOffset, protrusions) {\n const beam = this.beam;\n if (!beam)\n throw new RuntimeError('NoBeam', \"Can't calculate without a beam.\");\n const beam_slope = beam.slope;\n const isBeamEndNote = beam.notes[beam.notes.length - 1] === this;\n const scaleX = isBeamEndNote ? -1 : 1;\n const beam_angle = Math.atan(beam_slope * scaleX);\n // slash line intersecting point on beam.\n const iPointOnBeam = {\n dx: Math.cos(beam_angle) * slashBeamOffset,\n dy: Math.sin(beam_angle) * slashBeamOffset,\n };\n slashStemOffset *= this.getStemDirection();\n const slash_angle = Math.atan((iPointOnBeam.dy - slashStemOffset) / iPointOnBeam.dx);\n const protrusion_stem_dx = Math.cos(slash_angle) * protrusions.stem * scaleX;\n const protrusion_stem_dy = Math.sin(slash_angle) * protrusions.stem;\n const protrusion_beam_dx = Math.cos(slash_angle) * protrusions.beam * scaleX;\n const protrusion_beam_dy = Math.sin(slash_angle) * protrusions.beam;\n const stemX = this.getStemX();\n const stem0X = beam.notes[0].getStemX();\n const stemY = beam.getBeamYToDraw() + (stemX - stem0X) * beam_slope;\n const ret = {\n x1: stemX - protrusion_stem_dx,\n y1: stemY + slashStemOffset - protrusion_stem_dy,\n x2: stemX + iPointOnBeam.dx * scaleX + protrusion_beam_dx,\n y2: stemY + iPointOnBeam.dy + protrusion_beam_dy,\n };\n return ret;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements `GraceNoteGroup` which is used to format and\n// render grace notes.\nimport { Beam } from './beam';\nimport { Formatter } from './formatter';\nimport { Modifier } from './modifier';\nimport { StaveTie } from './stavetie';\nimport { Tables } from './tables';\nimport { TabTie } from './tabtie';\nimport { Category, isStaveNote } from './typeguard';\nimport { log } from './util';\nimport { Voice } from './voice';\n// To enable logging for this class. Set `GraceNoteGroup.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (GraceNoteGroup.DEBUG)\n log('Vex.Flow.GraceNoteGroup', args);\n}\n/** GraceNoteGroup is used to format and render grace notes. */\nexport class GraceNoteGroup extends Modifier {\n //** `GraceNoteGroup` inherits from `Modifier` and is placed inside a `ModifierContext`. */\n constructor(grace_notes, show_slur) {\n super();\n this.preFormatted = false;\n this.position = Modifier.Position.LEFT;\n this.grace_notes = grace_notes;\n this.width = 0;\n this.show_slur = show_slur;\n this.slur = undefined;\n this.voice = new Voice({\n num_beats: 4,\n beat_value: 4,\n resolution: Tables.RESOLUTION,\n }).setStrict(false);\n this.render_options = {\n slur_y_shift: 0,\n };\n this.beams = [];\n this.voice.addTickables(this.grace_notes);\n return this;\n }\n static get CATEGORY() {\n return Category.GraceNoteGroup;\n }\n /** Arranges groups inside a `ModifierContext`. */\n static format(gracenote_groups, state) {\n const group_spacing_stave = 4;\n const group_spacing_tab = 0;\n if (!gracenote_groups || gracenote_groups.length === 0)\n return false;\n const group_list = [];\n let prev_note = null;\n let shiftL = 0;\n for (let i = 0; i < gracenote_groups.length; ++i) {\n const gracenote_group = gracenote_groups[i];\n const note = gracenote_group.getNote();\n const is_stavenote = isStaveNote(note);\n const spacing = is_stavenote ? group_spacing_stave : group_spacing_tab;\n if (is_stavenote && note !== prev_note) {\n // Iterate through all notes to get the displaced pixels\n for (let n = 0; n < note.keys.length; ++n) {\n shiftL = Math.max(note.getLeftDisplacedHeadPx(), shiftL);\n }\n prev_note = note;\n }\n group_list.push({ shift: shiftL, gracenote_group, spacing });\n }\n // If first note left shift in case it is displaced\n let group_shift = group_list[0].shift;\n let formatWidth;\n for (let i = 0; i < group_list.length; ++i) {\n const gracenote_group = group_list[i].gracenote_group;\n gracenote_group.preFormat();\n formatWidth = gracenote_group.getWidth() + group_list[i].spacing;\n group_shift = Math.max(formatWidth, group_shift);\n }\n for (let i = 0; i < group_list.length; ++i) {\n const gracenote_group = group_list[i].gracenote_group;\n formatWidth = gracenote_group.getWidth() + group_list[i].spacing;\n gracenote_group.setSpacingFromNextModifier(group_shift - Math.min(formatWidth, group_shift));\n }\n state.left_shift += group_shift;\n return true;\n }\n preFormat() {\n if (this.preFormatted)\n return;\n if (!this.formatter) {\n this.formatter = new Formatter();\n }\n this.formatter.joinVoices([this.voice]).format([this.voice], 0, {});\n this.setWidth(this.formatter.getMinTotalWidth());\n this.preFormatted = true;\n }\n beamNotes(grace_notes) {\n grace_notes = grace_notes || this.grace_notes;\n if (grace_notes.length > 1) {\n const beam = new Beam(grace_notes);\n beam.render_options.beam_width = 3;\n beam.render_options.partial_beam_length = 4;\n this.beams.push(beam);\n }\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n getWidth() {\n return this.width;\n }\n getGraceNotes() {\n return this.grace_notes;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n L('Drawing grace note group for:', note);\n this.alignSubNotesWithNote(this.getGraceNotes(), note); // Modifier function\n // Draw grace notes.\n this.grace_notes.forEach((graceNote) => graceNote.setContext(ctx).draw());\n // Draw beams.\n this.beams.forEach((beam) => beam.setContext(ctx).draw());\n if (this.show_slur) {\n // Create and draw slur.\n const is_stavenote = isStaveNote(note);\n const TieClass = is_stavenote ? StaveTie : TabTie;\n this.slur = new TieClass({\n last_note: this.grace_notes[0],\n first_note: note,\n first_indices: [0],\n last_indices: [0],\n });\n this.slur.render_options.cp2 = 12;\n this.slur.render_options.y_shift = (is_stavenote ? 7 : 5) + this.render_options.slur_y_shift;\n this.slur.setContext(ctx).draw();\n }\n }\n}\nGraceNoteGroup.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Balazs Forian-Szabo\n//\n// ## Description\n//\n// A basic implementation of grace notes\n// to be rendered on a tab stave.\n//\n// See `tests/gracetabnote_tests.ts` for usage examples.\nimport { Font } from './font';\nimport { TabNote } from './tabnote';\nimport { Category } from './typeguard';\nexport class GraceTabNote extends TabNote {\n static get CATEGORY() {\n return Category.GraceTabNote;\n }\n constructor(noteStruct) {\n super(noteStruct, false);\n this.render_options = Object.assign(Object.assign({}, this.render_options), { \n // vertical shift from stave line\n y_shift: 0.3, \n // grace glyph scale\n scale: 0.6, \n // grace tablature font\n font: `7.5pt ${Font.SANS_SERIF}` });\n this.updateWidth();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Vex } from './vex';\nexport * from './accidental';\nexport * from './annotation';\nexport * from './articulation';\nexport * from './barnote';\nexport * from './beam';\nexport * from './bend';\nexport * from './boundingbox';\nexport * from './boundingboxcomputation';\nexport * from './canvascontext';\nexport * from './chordsymbol';\nexport * from './clef';\nexport * from './clefnote';\nexport * from './crescendo';\nexport * from './curve';\nexport * from './dot';\nexport * from './easyscore';\nexport * from './element';\nexport * from './factory';\nexport * from './flow';\nexport * from './font';\n// Do not export './fonts/*' because they are used by the entry/* files.\nexport * from './formatter';\nexport * from './fraction';\nexport * from './frethandfinger';\nexport * from './ghostnote';\nexport * from './glyph';\nexport * from './glyphnote';\nexport * from './gracenote';\nexport * from './gracenotegroup';\nexport * from './gracetabnote';\nexport * from './keymanager';\nexport * from './keysignature';\nexport * from './keysignote';\nexport * from './modifier';\nexport * from './modifiercontext';\nexport * from './multimeasurerest';\nexport * from './music';\nexport * from './note';\nexport * from './notehead';\nexport * from './notesubgroup';\nexport * from './ornament';\nexport * from './parenthesis';\nexport * from './parser';\nexport * from './pedalmarking';\nexport * from './registry';\nexport * from './rendercontext';\nexport * from './renderer';\nexport * from './repeatnote';\nexport * from './stave';\nexport * from './stavebarline';\nexport * from './staveconnector';\nexport * from './stavehairpin';\nexport * from './staveline';\nexport * from './stavemodifier';\nexport * from './stavenote';\nexport * from './staverepetition';\nexport * from './stavesection';\nexport * from './stavetempo';\nexport * from './stavetext';\nexport * from './stavetie';\nexport * from './stavevolta';\nexport * from './stem';\nexport * from './stemmablenote';\nexport * from './stringnumber';\nexport * from './strokes';\nexport * from './svgcontext';\nexport * from './system';\n// Do not export './tables' because it is internal. Its public API is accessible via Vex.Flow.*.\nexport * from './tabnote';\nexport * from './tabslide';\nexport * from './tabstave';\nexport * from './tabtie';\nexport * from './textbracket';\nexport * from './textdynamics';\nexport * from './textformatter';\nexport * from './textnote';\nexport * from './tickable';\nexport * from './tickcontext';\nexport * from './timesigglyph';\nexport * from './timesignature';\nexport * from './timesignote';\nexport * from './tremolo';\nexport * from './tuning';\nexport * from './tuplet';\nexport * from './typeguard';\nexport * from './util';\n// Do not export './version'. It is accessible via Vex.Flow.VERSION & Vex.Flow.BUILD.\nexport * from './vibrato';\nexport * from './vibratobracket';\nexport * from './voice';\nexport * from './web';\n// Export Vex as a named export AND as a default export, to support both ways of importing.\nexport { Vex };\nexport default Vex;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This class implements diatonic key management.\nimport { Music } from './music';\nimport { RuntimeError } from './util';\nexport class KeyManager {\n constructor(key) {\n this.music = new Music();\n this.setKey(key);\n }\n setKey(key) {\n this.key = key;\n this.reset();\n return this;\n }\n getKey() {\n return this.key;\n }\n reset() {\n this.keyParts = this.music.getKeyParts(this.key);\n this.keyString = this.keyParts.root;\n if (this.keyParts.accidental)\n this.keyString += this.keyParts.accidental;\n const is_supported_type = Music.scaleTypes[this.keyParts.type];\n if (!is_supported_type) {\n throw new RuntimeError('BadArguments', `Unsupported key type: ${this.key}`);\n }\n this.scale = this.music.getScaleTones(this.music.getNoteValue(this.keyString), Music.scaleTypes[this.keyParts.type]);\n this.scaleMap = {};\n this.scaleMapByValue = {};\n this.originalScaleMapByValue = {};\n const noteLocation = Music.root_indices[this.keyParts.root];\n for (let i = 0; i < Music.roots.length; ++i) {\n const index = (noteLocation + i) % Music.roots.length;\n const rootName = Music.roots[index];\n const noteName = this.music.getRelativeNoteName(rootName, this.scale[i]);\n this.scaleMap[rootName] = noteName;\n this.scaleMapByValue[this.scale[i]] = noteName;\n this.originalScaleMapByValue[this.scale[i]] = noteName;\n }\n return this;\n }\n getAccidental(key) {\n const root = this.music.getKeyParts(key).root;\n const parts = this.music.getNoteParts(this.scaleMap[root]);\n return {\n note: this.scaleMap[root],\n accidental: parts.accidental,\n };\n }\n selectNote(note) {\n note = note.toLowerCase();\n const parts = this.music.getNoteParts(note);\n // First look for matching note in our altered scale\n const scaleNote = this.scaleMap[parts.root];\n const modparts = this.music.getNoteParts(scaleNote);\n if (scaleNote === note) {\n return {\n note: scaleNote,\n accidental: parts.accidental,\n change: false,\n };\n }\n // Then search for a note of equivalent value in our altered scale\n const valueNote = this.scaleMapByValue[this.music.getNoteValue(note)];\n if (valueNote != null) {\n return {\n note: valueNote,\n accidental: this.music.getNoteParts(valueNote).accidental,\n change: false,\n };\n }\n // Then search for a note of equivalent value in the original scale\n const originalValueNote = this.originalScaleMapByValue[this.music.getNoteValue(note)];\n if (originalValueNote != null) {\n this.scaleMap[modparts.root] = originalValueNote;\n delete this.scaleMapByValue[this.music.getNoteValue(scaleNote)];\n this.scaleMapByValue[this.music.getNoteValue(note)] = originalValueNote;\n return {\n note: originalValueNote,\n accidental: this.music.getNoteParts(originalValueNote).accidental,\n change: true,\n };\n }\n // Then try to unmodify a currently modified note.\n if (modparts.root === note) {\n delete this.scaleMapByValue[this.music.getNoteValue(this.scaleMap[parts.root])];\n this.scaleMapByValue[this.music.getNoteValue(modparts.root)] = modparts.root;\n this.scaleMap[modparts.root] = modparts.root;\n return {\n note: modparts.root,\n accidental: undefined,\n change: true,\n };\n }\n // Last resort -- shitshoot\n delete this.scaleMapByValue[this.music.getNoteValue(this.scaleMap[parts.root])];\n this.scaleMapByValue[this.music.getNoteValue(note)] = note;\n delete this.scaleMap[modparts.root];\n this.scaleMap[modparts.root] = note;\n return {\n note,\n accidental: parts.accidental,\n change: true,\n };\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Cyril Silverman\n//\n// ## Description\n//\n// This file implements key signatures. A key signature sits on a stave\n// and indicates the notes with implicit accidentals.\nimport { Glyph } from './glyph';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined } from './util';\nexport class KeySignature extends StaveModifier {\n // Create a new Key Signature based on a `key_spec`\n constructor(keySpec, cancelKeySpec, alterKeySpec) {\n super();\n this.accList = [];\n this.setKeySig(keySpec, cancelKeySpec, alterKeySpec);\n this.setPosition(StaveModifierPosition.BEGIN);\n this.glyphFontScale = 38; // TODO(0xFE): Should this match StaveNote?\n this.glyphs = [];\n this.xPositions = []; // relative to this.x\n this.paddingForced = false;\n }\n static get CATEGORY() {\n return Category.KeySignature;\n }\n // Add an accidental glyph to the `KeySignature` instance which represents\n // the provided `acc`. If `nextAcc` is also provided, the appropriate\n // spacing will be included in the glyph's position\n convertToGlyph(acc, nextAcc) {\n const accGlyphData = Tables.accidentalCodes(acc.type);\n const glyph = new Glyph(accGlyphData.code, this.glyphFontScale);\n // Determine spacing between current accidental and the next accidental\n let extraWidth = 1;\n if (acc.type === 'n' && nextAcc) {\n const spacing = KeySignature.accidentalSpacing[nextAcc.type];\n if (spacing) {\n const isAbove = nextAcc.line >= acc.line;\n extraWidth = isAbove ? spacing.above : spacing.below;\n }\n }\n // Place the glyph on the stave\n this.placeGlyphOnLine(glyph, this.checkStave(), acc.line);\n this.glyphs.push(glyph);\n const xPosition = this.xPositions[this.xPositions.length - 1];\n const glyphWidth = glyph.getMetrics().width + extraWidth;\n // Store the next accidental's x position\n this.xPositions.push(xPosition + glyphWidth);\n // Expand size of key signature\n this.width += glyphWidth;\n }\n // Cancel out a key signature provided in the `spec` parameter. This will\n // place appropriate natural accidentals before the key signature.\n cancelKey(spec) {\n this.formatted = false;\n this.cancelKeySpec = spec;\n return this;\n }\n convertToCancelAccList(spec) {\n // Get the accidental list for the cancelled key signature\n const cancel_accList = Tables.keySignature(spec);\n // If the cancelled key has a different accidental type, ie: # vs b\n const different_types = this.accList.length > 0 && cancel_accList.length > 0 && cancel_accList[0].type !== this.accList[0].type;\n // Determine how many naturals needed to add\n const naturals = different_types ? cancel_accList.length : cancel_accList.length - this.accList.length;\n // Return if no naturals needed\n if (naturals < 1)\n return undefined;\n // Get the line position for each natural\n const cancelled = [];\n for (let i = 0; i < naturals; i++) {\n let index = i;\n if (!different_types) {\n index = cancel_accList.length - naturals + i;\n }\n const acc = cancel_accList[index];\n cancelled.push({ type: 'n', line: acc.line });\n }\n // Combine naturals with main accidental list for the key signature\n this.accList = cancelled.concat(this.accList);\n return {\n accList: cancelled,\n type: cancel_accList[0].type,\n };\n }\n // Deprecated\n addToStave(stave) {\n this.paddingForced = true;\n stave.addModifier(this);\n return this;\n }\n // Apply the accidental staff line placement based on the `clef` and\n // the accidental `type` for the key signature ('# or 'b').\n convertAccLines(clef, type, accList = this.accList) {\n let offset = 0.0; // if clef === \"treble\"\n let customLines; // when clef doesn't follow treble key sig shape\n switch (clef) {\n // Treble & Subbass both have offsets of 0, so are not included.\n case 'soprano':\n if (type === '#')\n customLines = [2.5, 0.5, 2, 0, 1.5, -0.5, 1];\n else\n offset = -1;\n break;\n case 'mezzo-soprano':\n if (type === 'b')\n customLines = [0, 2, 0.5, 2.5, 1, 3, 1.5];\n else\n offset = 1.5;\n break;\n case 'alto':\n offset = 0.5;\n break;\n case 'tenor':\n if (type === '#')\n customLines = [3, 1, 2.5, 0.5, 2, 0, 1.5];\n else\n offset = -0.5;\n break;\n case 'baritone-f':\n case 'baritone-c':\n if (type === 'b')\n customLines = [0.5, 2.5, 1, 3, 1.5, 3.5, 2];\n else\n offset = 2;\n break;\n case 'bass':\n case 'french':\n offset = 1;\n break;\n default:\n break;\n }\n // If there's a special case, assign those lines/spaces:\n let i;\n if (typeof customLines !== 'undefined') {\n for (i = 0; i < accList.length; ++i) {\n accList[i].line = customLines[i];\n }\n }\n else if (offset !== 0) {\n for (i = 0; i < accList.length; ++i) {\n accList[i].line += offset;\n }\n }\n }\n getPadding(index) {\n if (!this.formatted)\n this.format();\n return this.glyphs.length === 0 || (!this.paddingForced && index < 2) ? 0 : this.padding;\n }\n getWidth() {\n if (!this.formatted)\n this.format();\n return this.width;\n }\n setKeySig(keySpec, cancelKeySpec, alterKeySpec) {\n this.formatted = false;\n this.keySpec = keySpec;\n this.cancelKeySpec = cancelKeySpec;\n this.alterKeySpec = alterKeySpec;\n return this;\n }\n // Alter the accidentals of a key spec one by one.\n // Each alteration is a new accidental that replaces the\n // original accidental (or the canceled one).\n alterKey(alterKeySpec) {\n this.formatted = false;\n this.alterKeySpec = alterKeySpec;\n return this;\n }\n convertToAlterAccList(alterKeySpec) {\n const max = Math.min(alterKeySpec.length, this.accList.length);\n for (let i = 0; i < max; ++i) {\n if (alterKeySpec[i]) {\n this.accList[i].type = alterKeySpec[i];\n }\n }\n }\n format() {\n const stave = this.checkStave();\n this.width = 0;\n this.glyphs = [];\n this.xPositions = [0]; // initialize with initial x position\n this.accList = Tables.keySignature(defined(this.keySpec));\n const accList = this.accList;\n const firstAccidentalType = accList.length > 0 ? accList[0].type : undefined;\n let cancelAccList;\n if (this.cancelKeySpec) {\n cancelAccList = this.convertToCancelAccList(this.cancelKeySpec);\n }\n if (this.alterKeySpec) {\n this.convertToAlterAccList(this.alterKeySpec);\n }\n if (this.accList.length > 0) {\n const clef = (this.position === StaveModifierPosition.END ? stave.getEndClef() : stave.getClef()) || stave.getClef();\n if (cancelAccList) {\n this.convertAccLines(clef, cancelAccList.type, cancelAccList.accList);\n }\n this.convertAccLines(clef, firstAccidentalType, accList);\n for (let i = 0; i < this.accList.length; ++i) {\n this.convertToGlyph(this.accList[i], this.accList[i + 1]);\n }\n }\n this.formatted = true;\n }\n draw() {\n const stave = this.checkStave();\n const ctx = stave.checkContext();\n if (!this.formatted)\n this.format();\n this.setRendered();\n ctx.openGroup('keysignature', this.getAttribute('id'));\n for (let i = 0; i < this.glyphs.length; i++) {\n const glyph = this.glyphs[i];\n const x = this.x + this.xPositions[i];\n glyph.setStave(stave);\n glyph.setContext(ctx);\n glyph.renderToStave(x);\n }\n ctx.closeGroup();\n }\n}\n// Space between natural and following accidental depending\n// on vertical position\nKeySignature.accidentalSpacing = {\n '#': {\n above: 6,\n below: 4,\n },\n b: {\n above: 4,\n below: 7,\n },\n n: {\n above: 4,\n below: 1,\n },\n '##': {\n above: 6,\n below: 4,\n },\n bb: {\n above: 4,\n below: 7,\n },\n db: {\n above: 4,\n below: 7,\n },\n d: {\n above: 4,\n below: 7,\n },\n bbs: {\n above: 4,\n below: 7,\n },\n '++': {\n above: 6,\n below: 4,\n },\n '+': {\n above: 6,\n below: 4,\n },\n '+-': {\n above: 6,\n below: 4,\n },\n '++-': {\n above: 6,\n below: 4,\n },\n bs: {\n above: 4,\n below: 10,\n },\n bss: {\n above: 4,\n below: 10,\n },\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Mark Meeus 2019\nimport { KeySignature } from './keysignature';\nimport { Note } from './note';\nimport { Category } from './typeguard';\nexport class KeySigNote extends Note {\n constructor(keySpec, cancelKeySpec, alterKeySpec) {\n super({ duration: 'b' });\n this.keySignature = new KeySignature(keySpec, cancelKeySpec, alterKeySpec);\n // Note properties\n this.ignore_ticks = true;\n }\n static get CATEGORY() {\n return Category.KeySigNote;\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n preFormat() {\n this.preFormatted = true;\n this.keySignature.setStave(this.checkStave());\n this.setWidth(this.keySignature.getWidth());\n return this;\n }\n draw() {\n const ctx = this.checkStave().checkContext();\n this.setRendered();\n this.keySignature.setX(this.getAbsoluteX());\n this.keySignature.setContext(ctx);\n this.keySignature.draw();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nexport var ModifierPosition;\n(function (ModifierPosition) {\n ModifierPosition[ModifierPosition[\"CENTER\"] = 0] = \"CENTER\";\n ModifierPosition[ModifierPosition[\"LEFT\"] = 1] = \"LEFT\";\n ModifierPosition[ModifierPosition[\"RIGHT\"] = 2] = \"RIGHT\";\n ModifierPosition[ModifierPosition[\"ABOVE\"] = 3] = \"ABOVE\";\n ModifierPosition[ModifierPosition[\"BELOW\"] = 4] = \"BELOW\";\n})(ModifierPosition || (ModifierPosition = {}));\n// To enable logging for this class. Set `Vex.Flow.Modifier.DEBUG` to `true`.\n// function L(...args) { if (Modifier.DEBUG) log('Vex.Flow.Modifier', args); }\n/**\n * `Modifier` is an abstract interface for notational elements that modify\n * a `Note`. Examples of modifiers are `Accidental`, `Annotation`, `Stroke`, etc.\n *\n * For a `Modifier` instance to be positioned correctly, it must be part of\n * a `ModifierContext`. All modifiers in the same context are rendered relative to\n * one another.\n *\n * Typically, all modifiers to a note are part of the same `ModifierContext` instance. Also,\n * in multi-voice staves, all modifiers to notes on the same `tick` are part of the same\n * `ModifierContext`. This ensures that multiple voices don't trample all over each other.\n */\nexport class Modifier extends Element {\n constructor() {\n super();\n this.width = 0;\n // The `text_line` is reserved space above or below a stave.\n this.text_line = 0;\n this.position = Modifier.Position.LEFT;\n this.x_shift = 0;\n this.y_shift = 0;\n this.spacingFromNextModifier = 0;\n }\n /**\n * Modifiers category string. Every modifier has a different category.\n * The `ModifierContext` uses this to determine the type and order of the modifiers.\n */\n static get CATEGORY() {\n return Category.Modifier;\n }\n /** Modifiers can be positioned almost anywhere, relative to a note. */\n static get Position() {\n return ModifierPosition;\n }\n static get PositionString() {\n return {\n center: ModifierPosition.CENTER,\n above: ModifierPosition.ABOVE,\n below: ModifierPosition.BELOW,\n left: ModifierPosition.LEFT,\n right: ModifierPosition.RIGHT,\n };\n }\n /** Called when position changes. */\n reset() {\n // DO NOTHING.\n }\n /** Get modifier widths. */\n getWidth() {\n return this.width;\n }\n /** Set modifier widths. */\n setWidth(width) {\n this.width = width;\n return this;\n }\n /** Get attached note (`StaveNote`, `TabNote`, etc.) */\n getNote() {\n return defined(this.note, 'NoNote', 'Modifier has no note.');\n }\n /**\n * Used in draw() to check and get the attached note (`StaveNote`, `TabNote`, etc.).\n * Also verifies that the index is valid.\n */\n checkAttachedNote() {\n const category = this.getCategory();\n defined(this.index, 'NoIndex', `Can't draw ${category} without an index.`);\n return defined(this.note, 'NoNote', `Can't draw ${category} without a note.`);\n }\n /**\n * Set attached note.\n * @param note (`StaveNote`, `TabNote`, etc.)\n */\n setNote(note) {\n this.note = note;\n return this;\n }\n /** Get note index, which is a specific note in a chord. */\n getIndex() {\n return this.index;\n }\n /** Check and get note index, which is a specific note in a chord. */\n checkIndex() {\n return defined(this.index, 'NoIndex', 'Modifier has an invalid index.');\n }\n /** Set note index, which is a specific note in a chord. */\n setIndex(index) {\n this.index = index;\n return this;\n }\n /** Get `ModifierContext`. */\n getModifierContext() {\n return this.modifierContext;\n }\n /** Check and get `ModifierContext`. */\n checkModifierContext() {\n return defined(this.modifierContext, 'NoModifierContext', 'Modifier Context Required');\n }\n /** Every modifier must be part of a `ModifierContext`. */\n setModifierContext(c) {\n this.modifierContext = c;\n return this;\n }\n /** Get position. */\n getPosition() {\n return this.position;\n }\n /**\n * Set position.\n * @param position CENTER | LEFT | RIGHT | ABOVE | BELOW\n */\n setPosition(position) {\n this.position = typeof position === 'string' ? Modifier.PositionString[position] : position;\n this.reset();\n return this;\n }\n /** Set the `text_line` for the modifier. */\n setTextLine(line) {\n this.text_line = line;\n return this;\n }\n /** Shift modifier down `y` pixels. Negative values shift up. */\n setYShift(y) {\n this.y_shift = y;\n return this;\n }\n /** Set spacing from next modifier. */\n setSpacingFromNextModifier(x) {\n this.spacingFromNextModifier = x;\n }\n /** Get spacing from next modifier. */\n getSpacingFromNextModifier() {\n return this.spacingFromNextModifier;\n }\n /**\n * Shift modifier `x` pixels in the direction of the modifier. Negative values\n * shift reverse.\n */\n setXShift(x) {\n this.x_shift = 0;\n if (this.position === Modifier.Position.LEFT) {\n this.x_shift -= x;\n }\n else {\n this.x_shift += x;\n }\n return this;\n }\n /** Get shift modifier `x` */\n getXShift() {\n return this.x_shift;\n }\n /** Render the modifier onto the canvas. */\n draw() {\n this.checkContext();\n throw new RuntimeError('NotImplemented', 'draw() not implemented for this modifier.');\n }\n // aligns sub notes of NoteSubGroup (or GraceNoteGroup) to the main note with correct x-offset\n alignSubNotesWithNote(subNotes, note) {\n // Shift over the tick contexts of each note\n const tickContext = note.getTickContext();\n const metrics = tickContext.getMetrics();\n const stave = note.getStave();\n const subNoteXOffset = tickContext.getX() - metrics.modLeftPx - metrics.modRightPx + this.getSpacingFromNextModifier();\n subNotes.forEach((subNote) => {\n const subTickContext = subNote.getTickContext();\n if (stave)\n subNote.setStave(stave);\n subTickContext.setXOffset(subNoteXOffset); // don't touch baseX to avoid shift each render\n });\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This class implements various types of members to notes (e.g. bends,\n// fingering positions etc.)\nimport { Accidental } from './accidental';\nimport { Annotation } from './annotation';\nimport { Articulation } from './articulation';\nimport { Bend } from './bend';\nimport { ChordSymbol } from './chordsymbol';\nimport { Dot } from './dot';\nimport { FretHandFinger } from './frethandfinger';\nimport { GraceNoteGroup } from './gracenotegroup';\nimport { NoteSubGroup } from './notesubgroup';\nimport { Ornament } from './ornament';\nimport { Parenthesis } from './parenthesis';\nimport { StaveNote } from './stavenote';\nimport { StringNumber } from './stringnumber';\nimport { Stroke } from './strokes';\nimport { Category } from './typeguard';\nimport { log, RuntimeError } from './util';\nimport { Vibrato } from './vibrato';\n// To enable logging for this class. Set `Vex.Flow.ModifierContext.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (ModifierContext.DEBUG)\n log('Vex.Flow.ModifierContext', args);\n}\nexport class ModifierContext {\n constructor() {\n // Formatting data.\n this.state = {\n left_shift: 0,\n right_shift: 0,\n text_line: 0,\n top_text_line: 0,\n };\n // Current members\n this.members = {};\n this.preFormatted = false;\n this.postFormatted = false;\n this.formatted = false;\n this.width = 0;\n this.spacing = 0;\n }\n addModifier(member) {\n L('addModifier is deprecated, use addMember instead.');\n return this.addMember(member);\n }\n /**\n * this.members maps CATEGORY strings to arrays of Tickable | Modifier | StaveNote | TabNote.\n * Here we add a new member to this.members, and create a new array if needed.\n * @param member\n * @returns this\n */\n addMember(member) {\n const category = member.getCategory();\n if (!this.members[category]) {\n this.members[category] = [];\n }\n this.members[category].push(member);\n member.setModifierContext(this);\n this.preFormatted = false;\n return this;\n }\n /**\n * @deprecated\n */\n getModifiers(category) {\n L('getModifiers is deprecated, use getMembers instead.');\n return this.getMembers(category);\n }\n getMembers(category) {\n var _a;\n return (_a = this.members[category]) !== null && _a !== void 0 ? _a : [];\n }\n getWidth() {\n return this.width;\n }\n getLeftShift() {\n return this.state.left_shift;\n }\n getRightShift() {\n return this.state.right_shift;\n }\n getState() {\n return this.state;\n }\n getMetrics() {\n if (!this.formatted) {\n throw new RuntimeError('UnformattedMember', 'Unformatted member has no metrics.');\n }\n return {\n width: this.state.left_shift + this.state.right_shift + this.spacing,\n spacing: this.spacing,\n };\n }\n preFormat() {\n if (this.preFormatted)\n return;\n L('Preformatting ModifierContext');\n const state = this.state;\n const members = this.members;\n // The ordering below determines when different members are formatted and rendered.\n StaveNote.format(members[Category.StaveNote], state);\n Parenthesis.format(members[Category.Parenthesis], state);\n Dot.format(members[Category.Dot], state);\n FretHandFinger.format(members[Category.FretHandFinger], state);\n Accidental.format(members[Category.Accidental], state);\n Stroke.format(members[Category.Stroke], state);\n GraceNoteGroup.format(members[Category.GraceNoteGroup], state);\n NoteSubGroup.format(members[Category.NoteSubGroup], state);\n StringNumber.format(members[Category.StringNumber], state);\n Articulation.format(members[Category.Articulation], state);\n Ornament.format(members[Category.Ornament], state);\n Annotation.format(members[Category.Annotation], state);\n ChordSymbol.format(members[Category.ChordSymbol], state);\n Bend.format(members[Category.Bend], state);\n Vibrato.format(members[Category.Vibrato], state, this);\n // Update width of this member context\n this.width = state.left_shift + state.right_shift;\n this.preFormatted = true;\n }\n postFormat() {\n if (this.postFormatted)\n return;\n L('Postformatting ModifierContext');\n // If post-formatting is required for an element, add more lines below.\n StaveNote.postFormat(this.getMembers(Category.StaveNote));\n }\n}\nModifierContext.DEBUG = false;\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n//\n// This class implements multiple measure rests.\nimport { Element } from './element';\nimport { Glyph } from './glyph';\nimport { NoteHead } from './notehead';\nimport { StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { TimeSignature } from './timesignature';\nimport { Category, isBarline } from './typeguard';\nimport { defined } from './util';\nlet semibreve_rest;\nfunction get_semibreve_rest() {\n if (!semibreve_rest) {\n const noteHead = new NoteHead({ duration: 'w', note_type: 'r' });\n semibreve_rest = {\n glyph_font_scale: noteHead.render_options.glyph_font_scale,\n glyph_code: noteHead.glyph_code,\n width: noteHead.getWidth(),\n };\n }\n return semibreve_rest;\n}\nexport class MultiMeasureRest extends Element {\n /**\n *\n * @param number_of_measures Number of measures.\n * @param options The options object.\n */\n constructor(number_of_measures, options) {\n super();\n this.xs = { left: NaN, right: NaN };\n this.hasPaddingLeft = false;\n this.hasPaddingRight = false;\n this.hasLineThickness = false;\n this.hasSymbolSpacing = false;\n this.number_of_measures = number_of_measures;\n // Keep track of whether these four options were provided.\n this.hasPaddingLeft = typeof options.padding_left === 'number';\n this.hasPaddingRight = typeof options.padding_right === 'number';\n this.hasLineThickness = typeof options.line_thickness === 'number';\n this.hasSymbolSpacing = typeof options.symbol_spacing === 'number';\n const musicFont = Tables.currentMusicFont();\n this.render_options = Object.assign({ use_symbols: false, show_number: true, number_line: -0.5, number_glyph_point: musicFont.lookupMetric('digits.point'), line: 2, spacing_between_lines_px: Tables.STAVE_LINE_DISTANCE, serif_thickness: 2, semibreve_rest_glyph_scale: Tables.NOTATION_FONT_SCALE, padding_left: 0, padding_right: 0, line_thickness: 5, symbol_spacing: 0 }, options);\n const fontLineShift = musicFont.lookupMetric('digits.shiftLine', 0);\n this.render_options.number_line += fontLineShift;\n }\n static get CATEGORY() {\n return Category.MultiMeasureRest;\n }\n getXs() {\n return this.xs;\n }\n setStave(stave) {\n this.stave = stave;\n return this;\n }\n getStave() {\n return this.stave;\n }\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n drawLine(stave, ctx, left, right, spacingBetweenLines) {\n const options = this.render_options;\n const y = stave.getYForLine(options.line);\n const padding = (right - left) * 0.1;\n left += padding;\n right -= padding;\n let lineThicknessHalf;\n if (this.hasLineThickness) {\n lineThicknessHalf = options.line_thickness * 0.5;\n }\n else {\n lineThicknessHalf = spacingBetweenLines * 0.25;\n }\n const serifThickness = options.serif_thickness;\n const top = y - spacingBetweenLines;\n const bot = y + spacingBetweenLines;\n const leftIndented = left + serifThickness;\n const rightIndented = right - serifThickness;\n const lineTop = y - lineThicknessHalf;\n const lineBottom = y + lineThicknessHalf;\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(left, top);\n ctx.lineTo(leftIndented, top);\n ctx.lineTo(leftIndented, lineTop);\n ctx.lineTo(rightIndented, lineTop);\n ctx.lineTo(rightIndented, top);\n ctx.lineTo(right, top);\n ctx.lineTo(right, bot);\n ctx.lineTo(rightIndented, bot);\n ctx.lineTo(rightIndented, lineBottom);\n ctx.lineTo(leftIndented, lineBottom);\n ctx.lineTo(leftIndented, bot);\n ctx.lineTo(left, bot);\n ctx.closePath();\n ctx.fill();\n }\n drawSymbols(stave, ctx, left, right, spacingBetweenLines) {\n const n4 = Math.floor(this.number_of_measures / 4);\n const n = this.number_of_measures % 4;\n const n2 = Math.floor(n / 2);\n const n1 = n % 2;\n const options = this.render_options;\n // FIXME: TODO: invalidate semibreve_rest at the appropriate time\n // (e.g., if the system font settings are changed).\n semibreve_rest = undefined;\n const rest = get_semibreve_rest();\n const rest_scale = options.semibreve_rest_glyph_scale;\n const rest_width = rest.width * (rest_scale / rest.glyph_font_scale);\n const glyphs = {\n 2: {\n width: rest_width * 0.5,\n height: spacingBetweenLines,\n },\n 1: {\n width: rest_width,\n },\n };\n /* 10: normal spacingBetweenLines */\n const spacing = this.hasSymbolSpacing ? options.symbol_spacing : 10;\n const width = n4 * glyphs[2].width + n2 * glyphs[2].width + n1 * glyphs[1].width + (n4 + n2 + n1 - 1) * spacing;\n let x = left + (right - left) * 0.5 - width * 0.5;\n const line = options.line;\n const yTop = stave.getYForLine(line - 1);\n const yMiddle = stave.getYForLine(line);\n const yBottom = stave.getYForLine(line + 1);\n ctx.save();\n ctx.setStrokeStyle('none');\n ctx.setLineWidth(0);\n for (let i = 0; i < n4; ++i) {\n ctx.fillRect(x, yMiddle - glyphs[2].height, glyphs[2].width, glyphs[2].height);\n ctx.fillRect(x, yBottom - glyphs[2].height, glyphs[2].width, glyphs[2].height);\n x += glyphs[2].width + spacing;\n }\n for (let i = 0; i < n2; ++i) {\n ctx.fillRect(x, yMiddle - glyphs[2].height, glyphs[2].width, glyphs[2].height);\n x += glyphs[2].width + spacing;\n }\n for (let i = 0; i < n1; ++i) {\n Glyph.renderGlyph(ctx, x, yTop, rest_scale, rest.glyph_code);\n x += glyphs[1].width + spacing;\n }\n ctx.restore();\n }\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n const stave = this.checkStave();\n let left = stave.getNoteStartX();\n let right = stave.getNoteEndX();\n // FIXME: getNoteStartX() returns x + 5(barline width)\n // getNoteEndX() returns x + width(no barline width)\n // See Stave constructor. How do we fix this?\n // Here, we subtract the barline width.\n const begModifiers = stave.getModifiers(StaveModifierPosition.BEGIN);\n if (begModifiers.length === 1 && isBarline(begModifiers[0])) {\n left -= begModifiers[0].getWidth();\n }\n const options = this.render_options;\n if (this.hasPaddingLeft) {\n left = stave.getX() + options.padding_left;\n }\n if (this.hasPaddingRight) {\n right = stave.getX() + stave.getWidth() - options.padding_right;\n }\n this.xs.left = left;\n this.xs.right = right;\n const spacingBetweenLines = options.spacing_between_lines_px;\n if (options.use_symbols) {\n this.drawSymbols(stave, ctx, left, right, spacingBetweenLines);\n }\n else {\n this.drawLine(stave, ctx, left, right, spacingBetweenLines);\n }\n if (options.show_number) {\n const timeSpec = '/' + this.number_of_measures;\n const timeSig = new TimeSignature(timeSpec, 0, false);\n timeSig.point = options.number_glyph_point;\n timeSig.setTimeSig(timeSpec);\n timeSig.setStave(stave);\n timeSig.setX(left + (right - left) * 0.5 - timeSig.getInfo().glyph.getMetrics().width * 0.5);\n timeSig.bottomLine = options.number_line;\n timeSig.setContext(ctx).draw();\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { RuntimeError } from './util';\n/** Music implements some standard music theory routines. */\nexport class Music {\n /** Number of an canonical notes (12). */\n static get NUM_TONES() {\n return this.canonical_notes.length;\n }\n /** Names of root notes ('c', 'd',...) */\n static get roots() {\n return ['c', 'd', 'e', 'f', 'g', 'a', 'b'];\n }\n /** Values of the root notes.*/\n static get root_values() {\n return [0, 2, 4, 5, 7, 9, 11];\n }\n /** Indices of the root notes.*/\n static get root_indices() {\n return {\n c: 0,\n d: 1,\n e: 2,\n f: 3,\n g: 4,\n a: 5,\n b: 6,\n };\n }\n /** Names of canonical notes ('c', 'c#', 'd',...). */\n static get canonical_notes() {\n return ['c', 'c#', 'd', 'd#', 'e', 'f', 'f#', 'g', 'g#', 'a', 'a#', 'b'];\n }\n /** Names of diatonic intervals ('unison', 'm2', 'M2',...). */\n static get diatonic_intervals() {\n return ['unison', 'm2', 'M2', 'm3', 'M3', 'p4', 'dim5', 'p5', 'm6', 'M6', 'b7', 'M7', 'octave'];\n }\n /** NoteAccidental associated to diatonic intervals. */\n static get diatonic_accidentals() {\n return {\n unison: { note: 0, accidental: 0 },\n m2: { note: 1, accidental: -1 },\n M2: { note: 1, accidental: 0 },\n m3: { note: 2, accidental: -1 },\n M3: { note: 2, accidental: 0 },\n p4: { note: 3, accidental: 0 },\n dim5: { note: 4, accidental: -1 },\n p5: { note: 4, accidental: 0 },\n m6: { note: 5, accidental: -1 },\n M6: { note: 5, accidental: 0 },\n b7: { note: 6, accidental: -1 },\n M7: { note: 6, accidental: 0 },\n octave: { note: 7, accidental: 0 },\n };\n }\n /** Semitones shift associated to intervals .*/\n static get intervals() {\n return {\n u: 0,\n unison: 0,\n m2: 1,\n b2: 1,\n min2: 1,\n S: 1,\n H: 1,\n 2: 2,\n M2: 2,\n maj2: 2,\n T: 2,\n W: 2,\n m3: 3,\n b3: 3,\n min3: 3,\n M3: 4,\n 3: 4,\n maj3: 4,\n 4: 5,\n p4: 5,\n '#4': 6,\n b5: 6,\n aug4: 6,\n dim5: 6,\n 5: 7,\n p5: 7,\n '#5': 8,\n b6: 8,\n aug5: 8,\n 6: 9,\n M6: 9,\n maj6: 9,\n b7: 10,\n m7: 10,\n min7: 10,\n dom7: 10,\n M7: 11,\n maj7: 11,\n 8: 12,\n octave: 12,\n };\n }\n /** Semitones shifts associated with scales. */\n static get scales() {\n return {\n major: [2, 2, 1, 2, 2, 2, 1],\n minor: [2, 1, 2, 2, 1, 2, 2],\n ionian: [2, 2, 1, 2, 2, 2, 1],\n dorian: [2, 1, 2, 2, 2, 1, 2],\n phyrgian: [1, 2, 2, 2, 1, 2, 2],\n lydian: [2, 2, 2, 1, 2, 2, 1],\n mixolydian: [2, 2, 1, 2, 2, 1, 2],\n aeolian: [2, 1, 2, 2, 1, 2, 2],\n locrian: [1, 2, 2, 1, 2, 2, 2],\n };\n }\n /** Scales associated with m (minor) and M (major). */\n static get scaleTypes() {\n return {\n M: Music.scales.major,\n m: Music.scales.minor,\n };\n }\n /** Accidentals abbreviations. */\n static get accidentals() {\n return ['bb', 'b', 'n', '#', '##'];\n }\n /** Note values. */\n static get noteValues() {\n return {\n c: { root_index: 0, int_val: 0 },\n cn: { root_index: 0, int_val: 0 },\n 'c#': { root_index: 0, int_val: 1 },\n 'c##': { root_index: 0, int_val: 2 },\n cb: { root_index: 0, int_val: 11 },\n cbb: { root_index: 0, int_val: 10 },\n d: { root_index: 1, int_val: 2 },\n dn: { root_index: 1, int_val: 2 },\n 'd#': { root_index: 1, int_val: 3 },\n 'd##': { root_index: 1, int_val: 4 },\n db: { root_index: 1, int_val: 1 },\n dbb: { root_index: 1, int_val: 0 },\n e: { root_index: 2, int_val: 4 },\n en: { root_index: 2, int_val: 4 },\n 'e#': { root_index: 2, int_val: 5 },\n 'e##': { root_index: 2, int_val: 6 },\n eb: { root_index: 2, int_val: 3 },\n ebb: { root_index: 2, int_val: 2 },\n f: { root_index: 3, int_val: 5 },\n fn: { root_index: 3, int_val: 5 },\n 'f#': { root_index: 3, int_val: 6 },\n 'f##': { root_index: 3, int_val: 7 },\n fb: { root_index: 3, int_val: 4 },\n fbb: { root_index: 3, int_val: 3 },\n g: { root_index: 4, int_val: 7 },\n gn: { root_index: 4, int_val: 7 },\n 'g#': { root_index: 4, int_val: 8 },\n 'g##': { root_index: 4, int_val: 9 },\n gb: { root_index: 4, int_val: 6 },\n gbb: { root_index: 4, int_val: 5 },\n a: { root_index: 5, int_val: 9 },\n an: { root_index: 5, int_val: 9 },\n 'a#': { root_index: 5, int_val: 10 },\n 'a##': { root_index: 5, int_val: 11 },\n ab: { root_index: 5, int_val: 8 },\n abb: { root_index: 5, int_val: 7 },\n b: { root_index: 6, int_val: 11 },\n bn: { root_index: 6, int_val: 11 },\n 'b#': { root_index: 6, int_val: 0 },\n 'b##': { root_index: 6, int_val: 1 },\n bb: { root_index: 6, int_val: 10 },\n bbb: { root_index: 6, int_val: 9 },\n };\n }\n isValidNoteValue(note) {\n return note >= 0 && note < Music.canonical_notes.length;\n }\n isValidIntervalValue(interval) {\n return interval >= 0 && interval < Music.diatonic_intervals.length;\n }\n /** Return root and accidental associated to a note. */\n getNoteParts(noteString) {\n if (!noteString || noteString.length < 1) {\n throw new RuntimeError('BadArguments', 'Invalid note name: ' + noteString);\n }\n if (noteString.length > 3) {\n throw new RuntimeError('BadArguments', 'Invalid note name: ' + noteString);\n }\n const note = noteString.toLowerCase();\n const regex = /^([cdefgab])(b|bb|n|#|##)?$/;\n const match = regex.exec(note);\n if (match !== null) {\n const root = match[1];\n const accidental = match[2];\n return {\n root,\n accidental,\n };\n }\n else {\n throw new RuntimeError('BadArguments', 'Invalid note name: ' + noteString);\n }\n }\n /** Return root, accidental and type associated to a key. */\n getKeyParts(keyString) {\n if (!keyString || keyString.length < 1) {\n throw new RuntimeError('BadArguments', 'Invalid key: ' + keyString);\n }\n const key = keyString.toLowerCase();\n // Support Major, Minor, Melodic Minor, and Harmonic Minor key types.\n const regex = /^([cdefgab])(b|#)?(mel|harm|m|M)?$/;\n const match = regex.exec(key);\n if (match !== null) {\n const root = match[1];\n const accidental = match[2];\n let type = match[3];\n // Unspecified type implies major\n if (!type)\n type = 'M';\n return {\n root,\n accidental,\n type,\n };\n }\n else {\n throw new RuntimeError('BadArguments', `Invalid key: ${keyString}`);\n }\n }\n /** Note value associated to a note name. */\n getNoteValue(noteString) {\n const value = Music.noteValues[noteString];\n if (value === undefined) {\n throw new RuntimeError('BadArguments', `Invalid note name: ${noteString}`);\n }\n return value.int_val;\n }\n /** Interval value associated to an interval name. */\n getIntervalValue(intervalString) {\n const value = Music.intervals[intervalString];\n if (value === undefined) {\n throw new RuntimeError('BadArguments', `Invalid interval name: ${intervalString}`);\n }\n return value;\n }\n /** Canonical note name associated to a value. */\n getCanonicalNoteName(noteValue) {\n if (!this.isValidNoteValue(noteValue)) {\n throw new RuntimeError('BadArguments', `Invalid note value: ${noteValue}`);\n }\n return Music.canonical_notes[noteValue];\n }\n /** Interval name associated to a value. */\n getCanonicalIntervalName(intervalValue) {\n if (!this.isValidIntervalValue(intervalValue)) {\n throw new RuntimeError('BadArguments', `Invalid interval value: ${intervalValue}`);\n }\n return Music.diatonic_intervals[intervalValue];\n }\n /**\n * Given a note, interval, and interval direction, produce the relative note.\n */\n getRelativeNoteValue(noteValue, intervalValue, direction = 1) {\n if (direction !== 1 && direction !== -1) {\n throw new RuntimeError('BadArguments', `Invalid direction: ${direction}`);\n }\n let sum = (noteValue + direction * intervalValue) % Music.NUM_TONES;\n if (sum < 0)\n sum += Music.NUM_TONES;\n return sum;\n }\n /**\n * Given a root and note value, produce the relative note name.\n */\n getRelativeNoteName(root, noteValue) {\n const parts = this.getNoteParts(root);\n const rootValue = this.getNoteValue(parts.root);\n let interval = noteValue - rootValue;\n if (Math.abs(interval) > Music.NUM_TONES - 3) {\n let multiplier = 1;\n if (interval > 0)\n multiplier = -1;\n // Possibly wrap around. (Add +1 for modulo operator)\n const reverse_interval = ((noteValue + 1 + (rootValue + 1)) % Music.NUM_TONES) * multiplier;\n if (Math.abs(reverse_interval) > 2) {\n throw new RuntimeError('BadArguments', `Notes not related: ${root}, ${noteValue})`);\n }\n else {\n interval = reverse_interval;\n }\n }\n if (Math.abs(interval) > 2) {\n throw new RuntimeError('BadArguments', `Notes not related: ${root}, ${noteValue})`);\n }\n let relativeNoteName = parts.root;\n if (interval > 0) {\n for (let i = 1; i <= interval; ++i) {\n relativeNoteName += '#';\n }\n }\n else if (interval < 0) {\n for (let i = -1; i >= interval; --i) {\n relativeNoteName += 'b';\n }\n }\n return relativeNoteName;\n }\n /**\n * Return scale tones, given intervals. Each successive interval is\n * relative to the previous one, e.g., Major Scale:\n *\n * TTSTTTS = [2,2,1,2,2,2,1]\n *\n * When used with key = 0, returns C scale (which is isomorphic to\n * interval list).\n */\n getScaleTones(key, intervals) {\n const tones = [key];\n let nextNote = key;\n for (let i = 0; i < intervals.length; i++) {\n nextNote = this.getRelativeNoteValue(nextNote, intervals[i]);\n if (nextNote !== key)\n tones.push(nextNote);\n }\n return tones;\n }\n /**\n * Return the interval of a note, given a diatonic scale.\n * e.g., given the scale C, and the note E, returns M3.\n */\n getIntervalBetween(note1, note2, direction = 1) {\n if (direction !== 1 && direction !== -1) {\n throw new RuntimeError('BadArguments', `Invalid direction: ${direction}`);\n }\n if (!this.isValidNoteValue(note1) || !this.isValidNoteValue(note2)) {\n throw new RuntimeError('BadArguments', `Invalid notes: ${note1}, ${note2}`);\n }\n let difference = direction === 1 ? note2 - note1 : note1 - note2;\n if (difference < 0)\n difference += Music.NUM_TONES;\n return difference;\n }\n /**\n * Create a scale map that represents the pitch state for a\n * `keySignature`. For example, passing a `G` to `keySignature` would\n * return a scale map with every note naturalized except for `F` which\n * has an `F#` state.\n */\n createScaleMap(keySignature) {\n const keySigParts = this.getKeyParts(keySignature);\n if (!keySigParts.type)\n throw new RuntimeError('BadArguments', 'Unsupported key type: undefined');\n const scaleName = Music.scaleTypes[keySigParts.type];\n let keySigString = keySigParts.root;\n if (keySigParts.accidental)\n keySigString += keySigParts.accidental;\n if (!scaleName)\n throw new RuntimeError('BadArguments', 'Unsupported key type: ' + keySignature);\n const scale = this.getScaleTones(this.getNoteValue(keySigString), scaleName);\n const noteLocation = Music.root_indices[keySigParts.root];\n const scaleMap = {};\n for (let i = 0; i < Music.roots.length; ++i) {\n const index = (noteLocation + i) % Music.roots.length;\n const rootName = Music.roots[index];\n let noteName = this.getRelativeNoteName(rootName, scale[i]);\n if (noteName.length === 1) {\n noteName += 'n';\n }\n scaleMap[rootName] = noteName;\n }\n return scaleMap;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from './font';\nimport { drawDot } from './rendercontext';\nimport { Tables } from './tables';\nimport { Tickable } from './tickable';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\n/**\n * Note implements an abstract interface for notes and chords that\n * are rendered on a stave. Notes have some common properties: All of them\n * have a value (e.g., pitch, fret, etc.) and a duration (quarter, half, etc.)\n *\n * Some notes have stems, heads, dots, etc. Most notational elements that\n * surround a note are called *modifiers*, and every note has an associated\n * array of them. All notes also have a rendering context and belong to a stave.\n */\nexport class Note extends Tickable {\n /**\n * Every note is a tickable, i.e., it can be mutated by the `Formatter` class for\n * positioning and layout.\n *\n * @param noteStruct To create a new note you need to provide a `noteStruct`.\n */\n constructor(noteStruct) {\n super();\n if (!noteStruct) {\n throw new RuntimeError('BadArguments', 'Note must have valid initialization data to identify duration and type.');\n }\n /** Parses `noteStruct` and get note properties. */\n const parsedNoteStruct = Note.parseNoteStruct(noteStruct);\n if (!parsedNoteStruct) {\n throw new RuntimeError('BadArguments', `Invalid note initialization object: ${JSON.stringify(noteStruct)}`);\n }\n // Set note properties from parameters.\n this.keys = noteStruct.keys || [];\n // per-pitch properties\n this.keyProps = [];\n this.duration = parsedNoteStruct.duration;\n this.noteType = parsedNoteStruct.type;\n this.customTypes = parsedNoteStruct.customTypes;\n if (noteStruct.duration_override) {\n // Custom duration\n this.setDuration(noteStruct.duration_override);\n }\n else {\n // Default duration\n this.setIntrinsicTicks(parsedNoteStruct.ticks);\n }\n this.modifiers = [];\n // Get the glyph code for this note from the font.\n this.glyph = Tables.getGlyphProps(this.duration, this.noteType);\n this.customGlyphs = this.customTypes.map((t) => Tables.getGlyphProps(this.duration, t));\n // Note to play for audio players.\n this.playNote = undefined;\n // Positioning contexts used by the Formatter.\n this.ignore_ticks = false;\n // Positioning variables\n this.width = 0; // Width in pixels calculated after preFormat\n this.leftDisplacedHeadPx = 0; // Extra room on left for displaced note head\n this.rightDisplacedHeadPx = 0; // Extra room on right for displaced note head\n this.x_shift = 0; // X shift from tick context X\n this.ys = []; // list of y coordinates for each note\n // we need to hold on to these for ties and beams.\n if (noteStruct.align_center) {\n this.setCenterAlignment(noteStruct.align_center);\n }\n // The render surface.\n this.render_options = {\n annotation_spacing: 5,\n glyph_font_scale: 1,\n stroke_px: 1,\n scale: 1,\n font: '',\n y_shift: 0,\n };\n }\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // STATIC MEMBERS\n static get CATEGORY() {\n return Category.Note;\n }\n /** Debug helper. Displays various note metrics for the given note. */\n static plotMetrics(ctx, note, yPos) {\n const metrics = note.getMetrics();\n const xStart = note.getAbsoluteX() - metrics.modLeftPx - metrics.leftDisplacedHeadPx;\n const xPre1 = note.getAbsoluteX() - metrics.leftDisplacedHeadPx;\n const xAbs = note.getAbsoluteX();\n const xPost1 = note.getAbsoluteX() + metrics.notePx;\n const xPost2 = note.getAbsoluteX() + metrics.notePx + metrics.rightDisplacedHeadPx;\n const xEnd = note.getAbsoluteX() + metrics.notePx + metrics.rightDisplacedHeadPx + metrics.modRightPx;\n const xFreedomRight = xEnd + (note.getFormatterMetrics().freedom.right || 0);\n const xWidth = xEnd - xStart;\n ctx.save();\n ctx.setFont(Font.SANS_SERIF, 8);\n ctx.fillText(Math.round(xWidth) + 'px', xStart + note.getXShift(), yPos);\n const y = yPos + 7;\n function stroke(x1, x2, color, yy = y) {\n ctx.beginPath();\n ctx.setStrokeStyle(color);\n ctx.setFillStyle(color);\n ctx.setLineWidth(3);\n ctx.moveTo(x1 + note.getXShift(), yy);\n ctx.lineTo(x2 + note.getXShift(), yy);\n ctx.stroke();\n }\n stroke(xStart, xPre1, 'red');\n stroke(xPre1, xAbs, '#999');\n stroke(xAbs, xPost1, 'green');\n stroke(xPost1, xPost2, '#999');\n stroke(xPost2, xEnd, 'red');\n stroke(xEnd, xFreedomRight, '#DD0');\n stroke(xStart - note.getXShift(), xStart, '#BBB'); // Shift\n drawDot(ctx, xAbs + note.getXShift(), y, 'blue');\n const formatterMetrics = note.getFormatterMetrics();\n if (formatterMetrics.iterations > 0) {\n const spaceDeviation = formatterMetrics.space.deviation;\n const prefix = spaceDeviation >= 0 ? '+' : '';\n ctx.setFillStyle('red');\n ctx.fillText(prefix + Math.round(spaceDeviation), xAbs + note.getXShift(), yPos - 10);\n }\n ctx.restore();\n }\n static parseDuration(durationString) {\n if (!durationString) {\n return undefined;\n }\n const regexp = /(\\d*\\/?\\d+|[a-z])(d*)([nrhms]|$)/;\n const result = regexp.exec(durationString);\n if (!result) {\n return undefined;\n }\n const duration = result[1];\n const dots = result[2].length;\n const type = result[3] || 'n';\n return { duration, dots, type };\n }\n static parseNoteStruct(noteStruct) {\n // Preserve backwards-compatibility\n const durationProps = Note.parseDuration(noteStruct.duration);\n if (!durationProps) {\n return undefined;\n }\n // If specified type is invalid, return undefined.\n let type = noteStruct.type;\n if (type && !Tables.validTypes[type]) {\n return undefined;\n }\n // If no type specified, check duration or custom types\n const customTypes = [];\n if (!type) {\n type = durationProps.type || 'n';\n // If we have keys, try and check if we've got a custom glyph\n if (noteStruct.keys !== undefined) {\n noteStruct.keys.forEach((k, i) => {\n const result = k.split('/');\n // We have a custom glyph specified after the note eg. /X2\n customTypes[i] = (result && result.length === 3 ? result[2] : type);\n });\n }\n }\n // Calculate the tick duration of the note\n let ticks = Tables.durationToTicks(durationProps.duration);\n if (!ticks) {\n return undefined;\n }\n // Are there any dots?\n const dots = noteStruct.dots ? noteStruct.dots : durationProps.dots;\n if (typeof dots !== 'number') {\n return undefined;\n }\n // Add ticks as necessary depending on the numbr of dots\n let currentTicks = ticks;\n for (let i = 0; i < dots; i++) {\n if (currentTicks <= 1)\n return undefined;\n currentTicks = currentTicks / 2;\n ticks += currentTicks;\n }\n return {\n duration: durationProps.duration,\n type,\n customTypes,\n dots,\n ticks,\n };\n }\n /**\n * Get the play note, which is arbitrary data that can be used by an\n * audio player.\n */\n getPlayNote() {\n return this.playNote;\n }\n /**\n * Set the play note, which is arbitrary data that can be used by an\n * audio player.\n */\n setPlayNote(note) {\n this.playNote = note;\n return this;\n }\n /**\n * @returns true if this note is a type of rest.\n *\n * Rests don't have pitches, but take up space in the score.\n * Subclasses should override this default implementation.\n */\n isRest() {\n return false;\n }\n /** Add stroke. */\n addStroke(index, stroke) {\n stroke.setNote(this);\n stroke.setIndex(index);\n this.modifiers.push(stroke);\n this.preFormatted = false;\n return this;\n }\n /** Get the target stave. */\n getStave() {\n return this.stave;\n }\n /** Check and get the target stave. */\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n /** Set the target stave. */\n setStave(stave) {\n this.stave = stave;\n this.setYs([stave.getYForLine(0)]); // Update Y values if the stave is changed.\n this.setContext(this.stave.getContext());\n return this;\n }\n /** Get spacing to the left of the notes. */\n getLeftDisplacedHeadPx() {\n return this.leftDisplacedHeadPx;\n }\n /** Get spacing to the right of the notes. */\n getRightDisplacedHeadPx() {\n return this.rightDisplacedHeadPx;\n }\n /** Set spacing to the left of the notes. */\n setLeftDisplacedHeadPx(x) {\n this.leftDisplacedHeadPx = x;\n return this;\n }\n /** Set spacing to the right of the notes. */\n setRightDisplacedHeadPx(x) {\n this.rightDisplacedHeadPx = x;\n return this;\n }\n /** True if this note has no duration (e.g., bar notes, spacers, etc.). */\n shouldIgnoreTicks() {\n return this.ignore_ticks;\n }\n /** Get the stave line number for the note. */\n // eslint-disable-next-line\n getLineNumber(isTopNote) {\n return 0;\n }\n /** Get the stave line number for rest. */\n getLineForRest() {\n return 0;\n }\n /** Get the glyph associated with this note. */\n // eslint-disable-next-line\n getGlyph() {\n return this.glyph;\n }\n /** Get the glyph width. */\n getGlyphWidth() {\n // TODO: FIXME (multiple potential values for this.glyph)\n if (this.glyph) {\n if (this.glyph.getMetrics) {\n return this.glyph.getMetrics().width;\n }\n else if (this.glyph.getWidth) {\n return this.glyph.getWidth(this.render_options.glyph_font_scale);\n }\n }\n return 0;\n }\n /**\n * Set Y positions for this note. Each Y value is associated with\n * an individual pitch/key within the note/chord.\n */\n setYs(ys) {\n this.ys = ys;\n return this;\n }\n /**\n * Get Y positions for this note. Each Y value is associated with\n * an individual pitch/key within the note/chord.\n */\n getYs() {\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', 'No Y-values calculated for this note.');\n }\n return this.ys;\n }\n /**\n * Get the Y position of the space above the stave onto which text can\n * be rendered.\n */\n getYForTopText(text_line) {\n return this.checkStave().getYForTopText(text_line);\n }\n /** Return the voice that this note belongs in. */\n getVoice() {\n if (!this.voice)\n throw new RuntimeError('NoVoice', 'Note has no voice.');\n return this.voice;\n }\n /** Attach this note to `voice`. */\n setVoice(voice) {\n this.voice = voice;\n this.preFormatted = false;\n return this;\n }\n /** Get the `TickContext` for this note. */\n getTickContext() {\n return this.checkTickContext();\n }\n /** Set the `TickContext` for this note. */\n setTickContext(tc) {\n this.tickContext = tc;\n this.preFormatted = false;\n return this;\n }\n /** Accessor to duration. */\n getDuration() {\n return this.duration;\n }\n /** Accessor to isDotted. */\n isDotted() {\n return this.getModifiersByType('Dot').length > 0;\n }\n /** Accessor to hasStem. */\n hasStem() {\n return false;\n }\n /** Accessor to note type. */\n getNoteType() {\n return this.noteType;\n }\n /** Get the beam. */\n getBeam() {\n return this.beam;\n }\n /** Check and get the beam. */\n checkBeam() {\n return defined(this.beam, 'NoBeam', 'No beam attached to instance');\n }\n /** Check it has a beam. */\n hasBeam() {\n return this.beam != undefined;\n }\n /** Set the beam. */\n setBeam(beam) {\n this.beam = beam;\n return this;\n }\n /**\n * Attach a modifier to this note.\n * @param modifier the Modifier to add.\n * @param index of the key to modify.\n * @returns this\n */\n addModifier(modifier, index = 0) {\n const signature = 'Note.addModifier(modifier: Modifier, index: number=0)';\n // Backwards compatibility with 3.0.9.\n if (typeof index === 'string') {\n index = parseInt(index);\n // eslint-disable-next-line\n console.warn(signature + ' expected a number for `index`, but received a string.');\n }\n // Some versions of VexFlow had the two parameters reversed.\n // Check here and throw an error if the argument types are not correct.\n if (typeof modifier !== 'object' || typeof index !== 'number') {\n throw new RuntimeError('WrongParams', 'Incorrect call signature. Use ' + signature + ' instead.');\n }\n modifier.setNote(this);\n modifier.setIndex(index);\n super.addModifier(modifier);\n return this;\n }\n // Get all modifiers of a specific type in the `ModifierContext`\n getModifiersByType(type) {\n return this.checkModifierContext().getMembers(type);\n }\n /** Get the coordinates for where modifiers begin. */\n // eslint-disable-next-line\n getModifierStartXY(position, index, options) {\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call GetModifierStartXY on an unformatted note\");\n }\n return {\n x: this.getAbsoluteX(),\n y: this.ys[0],\n };\n }\n getRightParenthesisPx(index) {\n const props = this.getKeyProps()[index];\n return props.displaced ? this.getRightDisplacedHeadPx() : 0;\n }\n getLeftParenthesisPx(index) {\n const props = this.getKeyProps()[index];\n return props.displaced ? this.getLeftDisplacedHeadPx() : 0;\n }\n getFirstDotPx() {\n let px = this.getRightDisplacedHeadPx();\n if (this.checkModifierContext().getMembers('Parenthesis').length !== 0)\n px += Tables.currentMusicFont().lookupMetric('parenthesis.default.width');\n return px;\n }\n /** Get the metrics for this note. */\n getMetrics() {\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call getMetrics on an unformatted note.\");\n }\n const modLeftPx = this.modifierContext ? this.modifierContext.getState().left_shift : 0;\n const modRightPx = this.modifierContext ? this.modifierContext.getState().right_shift : 0;\n const width = this.getWidth();\n const glyphWidth = this.getGlyphWidth();\n const notePx = width -\n modLeftPx - // subtract left modifiers\n modRightPx - // subtract right modifiers\n this.leftDisplacedHeadPx - // subtract left displaced head\n this.rightDisplacedHeadPx; // subtract right displaced head\n // NOTE: If you change this, remember to update MockTickable.getMetrics() in the tests/ directory.\n return {\n width,\n glyphWidth,\n notePx,\n // Modifier spacing.\n modLeftPx,\n modRightPx,\n // Displaced note head on left or right.\n leftDisplacedHeadPx: this.leftDisplacedHeadPx,\n rightDisplacedHeadPx: this.rightDisplacedHeadPx,\n glyphPx: 0,\n };\n }\n /**\n * Get the absolute `X` position of this note's tick context. This\n * excludes x_shift, so you'll need to factor it in if you're\n * looking for the post-formatted x-position.\n */\n getAbsoluteX() {\n const tickContext = this.checkTickContext(`Can't getAbsoluteX() without a TickContext.`);\n // Position note to left edge of tick context.\n let x = tickContext.getX();\n if (this.stave) {\n x += this.stave.getNoteStartX() + Tables.currentMusicFont().lookupMetric('stave.padding');\n }\n if (this.isCenterAligned()) {\n x += this.getCenterXShift();\n }\n return x;\n }\n /** Get the direction of the stem. */\n getStemDirection() {\n throw new RuntimeError('NoStem', 'No stem attached to this note.');\n }\n /** Get the top and bottom `y` values of the stem. */\n getStemExtents() {\n throw new RuntimeError('NoStem', 'No stem attached to this note.');\n }\n /** Get the `x` coordinate to the right of the note. */\n getTieRightX() {\n let tieStartX = this.getAbsoluteX();\n const note_glyph_width = this.glyph.getWidth();\n tieStartX += note_glyph_width / 2;\n tieStartX += -this.width / 2 + this.width + 2;\n return tieStartX;\n }\n /** Get the `x` coordinate to the left of the note. */\n getTieLeftX() {\n let tieEndX = this.getAbsoluteX();\n const note_glyph_width = this.glyph.getWidth();\n tieEndX += note_glyph_width / 2;\n tieEndX -= this.width / 2 + 2;\n return tieEndX;\n }\n // Get the pitches in the note\n getKeys() {\n return this.keys;\n }\n // Get the properties for all the keys in the note\n getKeyProps() {\n return this.keyProps;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { BoundingBox } from './boundingbox';\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (NoteHead.DEBUG)\n log('Vex.Flow.NoteHead', args);\n}\n/**\n * Draw slashnote head manually. No glyph exists for this.\n * @param ctx the Canvas context\n * @param duration the duration of the note. ex: \"4\"\n * @param x the x coordinate to draw at\n * @param y the y coordinate to draw at\n * @param stem_direction the direction of the stem\n */\nfunction drawSlashNoteHead(ctx, duration, x, y, stem_direction, staveSpace) {\n const width = Tables.SLASH_NOTEHEAD_WIDTH;\n ctx.save();\n ctx.setLineWidth(Tables.STEM_WIDTH);\n let fill = false;\n if (Tables.durationToNumber(duration) > 2) {\n fill = true;\n }\n if (!fill)\n x -= (Tables.STEM_WIDTH / 2) * stem_direction;\n ctx.beginPath();\n ctx.moveTo(x, y + staveSpace);\n ctx.lineTo(x, y + 1);\n ctx.lineTo(x + width, y - staveSpace);\n ctx.lineTo(x + width, y);\n ctx.lineTo(x, y + staveSpace);\n ctx.closePath();\n if (fill) {\n ctx.fill();\n }\n else {\n ctx.stroke();\n }\n if (Tables.durationToFraction(duration).equals(0.5)) {\n const breve_lines = [-3, -1, width + 1, width + 3];\n for (let i = 0; i < breve_lines.length; i++) {\n ctx.beginPath();\n ctx.moveTo(x + breve_lines[i], y - 10);\n ctx.lineTo(x + breve_lines[i], y + 11);\n ctx.stroke();\n }\n }\n ctx.restore();\n}\n/**\n * `NoteHeads` are typically not manipulated\n * directly, but used internally in `StaveNote`.\n *\n * See `tests/notehead_tests.ts` for usage examples.\n */\nexport class NoteHead extends Note {\n constructor(noteStruct) {\n super(noteStruct);\n this.custom_glyph = false;\n this.stem_up_x_offset = 0;\n this.stem_down_x_offset = 0;\n this.index = noteStruct.index;\n this.x = noteStruct.x || 0;\n this.y = noteStruct.y || 0;\n if (noteStruct.note_type)\n this.noteType = noteStruct.note_type;\n this.displaced = noteStruct.displaced || false;\n this.stem_direction = noteStruct.stem_direction || Stem.UP;\n this.line = noteStruct.line || 0;\n // Get glyph code based on duration and note type. This could be\n // regular notes, rests, or other custom codes.\n this.glyph = Tables.getGlyphProps(this.duration, this.noteType);\n defined(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`);\n this.glyph_code = this.glyph.code_head;\n this.x_shift = noteStruct.x_shift || 0;\n if (noteStruct.custom_glyph_code) {\n this.custom_glyph = true;\n this.glyph_code = noteStruct.custom_glyph_code;\n this.stem_up_x_offset = noteStruct.stem_up_x_offset || 0;\n this.stem_down_x_offset = noteStruct.stem_down_x_offset || 0;\n }\n this.style = noteStruct.style;\n this.slashed = noteStruct.slashed || false;\n this.render_options = Object.assign(Object.assign({}, this.render_options), { \n // font size for note heads\n glyph_font_scale: noteStruct.glyph_font_scale || Tables.NOTATION_FONT_SCALE });\n this.setWidth(this.glyph.getWidth(this.render_options.glyph_font_scale));\n }\n static get CATEGORY() {\n return Category.NoteHead;\n }\n /** Get the width of the notehead. */\n getWidth() {\n return this.width;\n }\n /** Determine if the notehead is displaced. */\n isDisplaced() {\n return this.displaced === true;\n }\n /** Get the glyph data. */\n getGlyph() {\n return this.glyph;\n }\n /** Set the X coordinate. */\n setX(x) {\n this.x = x;\n return this;\n }\n /** Get the Y coordinate. */\n getY() {\n return this.y;\n }\n /** Set the Y coordinate. */\n setY(y) {\n this.y = y;\n return this;\n }\n /** Get the stave line the notehead is placed on. */\n getLine() {\n return this.line;\n }\n /** Set the stave line the notehead is placed on. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Get the canvas `x` coordinate position of the notehead. */\n getAbsoluteX() {\n // If the note has not been preformatted, then get the static x value\n // Otherwise, it's been formatted and we should use it's x value relative\n // to its tick context\n const x = !this.preFormatted ? this.x : super.getAbsoluteX();\n // For a more natural displaced notehead, we adjust the displacement amount\n // by half the stem width in order to maintain a slight overlap with the stem\n const displacementStemAdjustment = Stem.WIDTH / 2;\n const musicFont = Tables.currentMusicFont();\n const fontShift = musicFont.lookupMetric('notehead.shiftX', 0) * this.stem_direction;\n const displacedFontShift = musicFont.lookupMetric('noteHead.displaced.shiftX', 0) * this.stem_direction;\n return (x +\n fontShift +\n (this.displaced ? (this.width - displacementStemAdjustment) * this.stem_direction + displacedFontShift : 0));\n }\n /** Get the `BoundingBox` for the `NoteHead`. */\n getBoundingBox() {\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call getBoundingBox on an unformatted note.\");\n }\n const spacing = this.checkStave().getSpacingBetweenLines();\n const half_spacing = spacing / 2;\n const min_y = this.y - half_spacing;\n return new BoundingBox(this.getAbsoluteX(), min_y, this.width, spacing);\n }\n /** Set notehead to a provided `stave`. */\n setStave(stave) {\n const line = this.getLine();\n this.stave = stave;\n if (this.stave) {\n this.setY(this.stave.getYForNote(line));\n this.setContext(this.stave.getContext());\n }\n return this;\n }\n /** Pre-render formatting. */\n preFormat() {\n if (this.preFormatted)\n return this;\n const width = this.getWidth() + this.leftDisplacedHeadPx + this.rightDisplacedHeadPx;\n this.setWidth(width);\n this.preFormatted = true;\n return this;\n }\n /** Draw the notehead. */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n let head_x = this.getAbsoluteX();\n if (this.custom_glyph) {\n // head_x += this.x_shift;\n head_x += this.stem_direction === Stem.UP ? this.stem_up_x_offset : this.stem_down_x_offset;\n }\n const y = this.y;\n L(\"Drawing note head '\", this.noteType, this.duration, \"' at\", head_x, y);\n // Begin and end positions for head.\n const stem_direction = this.stem_direction;\n const glyph_font_scale = this.render_options.glyph_font_scale;\n if (this.style) {\n this.applyStyle(ctx);\n }\n const categorySuffix = `${this.glyph_code}Stem${stem_direction === Stem.UP ? 'Up' : 'Down'}`;\n if (this.noteType === 's') {\n const staveSpace = this.checkStave().getSpacingBetweenLines();\n drawSlashNoteHead(ctx, this.duration, head_x, y, stem_direction, staveSpace);\n }\n else {\n Glyph.renderGlyph(ctx, head_x, y, glyph_font_scale, this.glyph_code, {\n category: this.custom_glyph ? `noteHead.custom.${categorySuffix}` : `noteHead.standard.${categorySuffix}`,\n });\n }\n if (this.style) {\n this.restoreStyle(ctx);\n }\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.NoteHead.DEBUG` to `true`. */\nNoteHead.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2016\n//\n// ## Description\n//\n// This file implements `NoteSubGroup` which is used to format and\n// render notes as a `Modifier`\n// ex) ClefNote, TimeSigNote and BarNote.\nimport { Formatter } from './formatter';\nimport { Modifier } from './modifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { Voice } from './voice';\nexport class NoteSubGroup extends Modifier {\n constructor(subNotes) {\n super();\n this.preFormatted = false;\n this.position = Modifier.Position.LEFT;\n this.subNotes = subNotes;\n this.subNotes.forEach((subNote) => {\n subNote.setIgnoreTicks(false);\n });\n this.width = 0;\n this.formatter = new Formatter();\n this.voice = new Voice({\n num_beats: 4,\n beat_value: 4,\n resolution: Tables.RESOLUTION,\n }).setStrict(false);\n this.voice.addTickables(this.subNotes);\n }\n static get CATEGORY() {\n return Category.NoteSubGroup;\n }\n // Arrange groups inside a `ModifierContext`\n static format(groups, state) {\n if (!groups || groups.length === 0)\n return false;\n let width = 0;\n for (let i = 0; i < groups.length; ++i) {\n const group = groups[i];\n group.preFormat();\n width += group.getWidth();\n }\n state.left_shift += width;\n return true;\n }\n preFormat() {\n if (this.preFormatted)\n return;\n this.formatter.joinVoices([this.voice]).format([this.voice], 0);\n this.setWidth(this.formatter.getMinTotalWidth());\n this.preFormatted = true;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n getWidth() {\n return this.width;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n this.alignSubNotesWithNote(this.subNotes, note); // Modifier function\n this.subNotes.forEach((subNote) => subNote.setContext(ctx).drawWithStyle());\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Cyril Silverman\n// MIT License\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { TickContext } from './tickcontext';\nimport { Category, isTabNote } from './typeguard';\nimport { defined, log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Ornament.DEBUG)\n log('Vex.Flow.Ornament', args);\n}\n/**\n * Ornament implements ornaments as modifiers that can be\n * attached to notes. The complete list of ornaments is available in\n * `tables.ts` under `Vex.Flow.ornamentCodes`.\n *\n * See `tests/ornament_tests.ts` for usage examples.\n */\nexport class Ornament extends Modifier {\n /**\n * Create a new ornament of type `type`, which is an entry in\n * `Vex.Flow.ornamentCodes` in `tables.ts`.\n */\n constructor(type) {\n super();\n this.type = type;\n this.delayed = false;\n this.render_options = {\n font_scale: 38,\n accidentalLowerPadding: 3,\n accidentalUpperPadding: 3,\n };\n this.ornament = Tables.ornamentCodes(this.type);\n // new ornaments have their origin at the origin, and have more specific\n // metrics. Legacy ornaments do some\n // x scaling, and have hard-coded metrics\n const metrics = this.getMetrics();\n // some jazz ornaments are above or below depending on stem direction.\n this.adjustForStemDirection = false;\n // some jazz ornaments like falls are supposed to overlap with future bars\n // and so we report a different width than they actually take up.\n this.reportedWidth = metrics && metrics.reportedWidth ? metrics.reportedWidth : 0;\n this.stemUpYOffset = metrics && metrics.stemUpYOffset ? metrics.stemUpYOffset : 0;\n this.ornamentAlignWithNoteHead = Ornament.ornamentAlignWithNoteHead.indexOf(this.type) >= 0;\n if (!this.ornament) {\n throw new RuntimeError('ArgumentError', `Ornament not found: '${this.type}'`);\n }\n this.x_shift = metrics ? metrics.xOffset : 0;\n this.y_shift = metrics ? metrics.yOffset : 0;\n this.glyph = new Glyph(this.ornament.code, this.render_options.font_scale, {\n category: `ornament.${this.ornament.code}`,\n });\n // Is this a jazz ornament that goes between this note and the next note.\n if (Ornament.ornamentNoteTransition.indexOf(this.type) >= 0) {\n this.delayed = true;\n }\n // Legacy ornaments need this. I don't know why, but horizontal spacing issues\n // happen if I don't set it.\n if (!metrics) {\n this.glyph.setOrigin(0.5, 1.0); // FIXME: SMuFL won't require a vertical origin shift\n }\n }\n /** Ornaments category string. */\n static get CATEGORY() {\n return Category.Ornament;\n }\n /** Arrange ornaments inside `ModifierContext` */\n static format(ornaments, state) {\n if (!ornaments || ornaments.length === 0)\n return false;\n let width = 0; // width is used by ornaments, which are always centered on the note head\n let right_shift = state.right_shift; // jazz ornaments calculate r/l shift separately\n let left_shift = state.left_shift;\n let yOffset = 0;\n for (let i = 0; i < ornaments.length; ++i) {\n const ornament = ornaments[i];\n const increment = 2;\n if (Ornament.ornamentRelease.indexOf(ornament.type) >= 0) {\n ornament.x_shift += right_shift + 2;\n }\n if (Ornament.ornamentAttack.indexOf(ornament.type) >= 0) {\n ornament.x_shift -= left_shift + 2;\n }\n if (ornament.reportedWidth && ornament.x_shift < 0) {\n left_shift += ornament.reportedWidth;\n }\n else if (ornament.reportedWidth && ornament.x_shift > 0) {\n right_shift += ornament.reportedWidth;\n }\n else {\n width = Math.max(ornament.getWidth(), width);\n }\n // articulations above/below the line can be stacked.\n if (Ornament.ornamentArticulation.indexOf(ornament.type) >= 0) {\n // Unfortunately we don't know the stem direction. So we base it\n // on the line number, but also allow it to be overridden.\n const ornamentNote = defined(ornament.note, 'NoAttachedNote');\n if (ornamentNote.getLineNumber() >= 3 || ornament.getPosition() === Modifier.Position.ABOVE) {\n state.top_text_line += increment;\n ornament.y_shift += yOffset;\n yOffset -= ornament.glyph.bbox.getH();\n }\n else {\n state.text_line += increment;\n ornament.y_shift += yOffset;\n yOffset += ornament.glyph.bbox.getH();\n }\n }\n else {\n if (ornament.getPosition() === Modifier.Position.ABOVE) {\n ornament.setTextLine(state.top_text_line);\n state.top_text_line += increment;\n }\n else {\n ornament.setTextLine(state.text_line);\n state.text_line += increment;\n }\n }\n }\n // Note: 'legit' ornaments don't consider other modifiers when calculating their\n // X position, but jazz ornaments sometimes need to.\n state.left_shift = left_shift + width / 2;\n state.right_shift = right_shift + width / 2;\n return true;\n }\n /**\n * ornamentNoteTransition means the jazz ornament represents an effect from one note to another,\n * these are generally on the top of the staff.\n */\n static get ornamentNoteTransition() {\n return ['flip', 'jazzTurn', 'smear'];\n }\n /**\n * ornamentAttack indicates something that happens in the attach, placed before the note and\n * any accidentals\n */\n static get ornamentAttack() {\n return ['scoop'];\n }\n /**\n * The ornament is aligned based on the note head, but without regard to whether the\n * stem goes up or down.\n */\n static get ornamentAlignWithNoteHead() {\n return ['doit', 'fall', 'fallLong', 'doitLong', 'bend', 'plungerClosed', 'plungerOpen', 'scoop'];\n }\n /**\n * An ornament that happens on the release of the note, generally placed after the\n * note and overlapping the next beat/measure..\n */\n static get ornamentRelease() {\n return ['doit', 'fall', 'fallLong', 'doitLong', 'jazzTurn', 'smear', 'flip'];\n }\n /** ornamentArticulation goes above/below the note based on space availablity */\n static get ornamentArticulation() {\n return ['bend', 'plungerClosed', 'plungerOpen'];\n }\n /**\n * Legacy ornaments have hard-coded metrics. If additional ornament types are\n * added, get their metrics here.\n */\n // eslint-disable-next-line\n getMetrics() {\n return Tables.currentMusicFont().getMetrics().glyphs.jazzOrnaments[this.ornament.code];\n }\n /** Set whether the ornament is to be delayed. */\n setDelayed(delayed) {\n this.delayed = delayed;\n return this;\n }\n /** Set the upper accidental for the ornament. */\n setUpperAccidental(accid) {\n const scale = this.render_options.font_scale / 1.3;\n this.accidentalUpper = new Glyph(Tables.accidentalCodes(accid).code, scale);\n this.accidentalUpper.setOrigin(0.5, 1.0);\n return this;\n }\n /** Set the lower accidental for the ornament. */\n setLowerAccidental(accid) {\n const scale = this.render_options.font_scale / 1.3;\n this.accidentalLower = new Glyph(Tables.accidentalCodes(accid).code, scale);\n this.accidentalLower.setOrigin(0.5, 1.0);\n return this;\n }\n /** Render ornament in position next to note. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const stemDir = note.getStemDirection();\n const stave = note.checkStave();\n const classString = Object.keys(this.getAttribute('classes')).join(' ');\n ctx.openGroup(classString, this.getAttribute('id'));\n // Get stem extents\n const stemExtents = note.checkStem().getExtents();\n let y = stemDir === Stem.DOWN ? stemExtents.baseY : stemExtents.topY;\n // TabNotes don't have stems attached to them. Tab stems are rendered outside the stave.\n if (isTabNote(note)) {\n if (note.hasStem()) {\n if (stemDir === Stem.DOWN) {\n y = stave.getYForTopText(this.text_line);\n }\n }\n else {\n // Without a stem\n y = stave.getYForTopText(this.text_line);\n }\n }\n const isPlacedOnNoteheadSide = stemDir === Stem.DOWN;\n const spacing = stave.getSpacingBetweenLines();\n let lineSpacing = 1;\n // Beamed stems are longer than quarter note stems, adjust accordingly\n if (!isPlacedOnNoteheadSide && note.hasBeam()) {\n lineSpacing += 0.5;\n }\n const totalSpacing = spacing * (this.text_line + lineSpacing);\n const glyphYBetweenLines = y - totalSpacing;\n // Get initial coordinates for the modifier position\n const start = note.getModifierStartXY(this.position, this.index);\n let glyphX = start.x;\n // If the ornament is aligned with the note head, don't consider the stave y\n // but use the 'natural' modifier y\n let glyphY = this.ornamentAlignWithNoteHead\n ? start.y\n : Math.min(stave.getYForTopText(this.text_line), glyphYBetweenLines);\n glyphY += this.y_shift;\n // Ajdust x position if ornament is delayed\n if (this.delayed) {\n let delayXShift = 0;\n const startX = glyphX - (stave.getX() - 10);\n if (this.delayXShift !== undefined) {\n delayXShift = this.delayXShift;\n }\n else {\n delayXShift += this.glyph.getMetrics().width / 2;\n const nextContext = TickContext.getNextContext(note.getTickContext());\n if (nextContext) {\n delayXShift += (nextContext.getX() - startX) * 0.5;\n }\n else {\n delayXShift += (stave.getX() + stave.getWidth() - startX) * 0.5;\n }\n this.delayXShift = delayXShift;\n }\n glyphX += delayXShift;\n }\n L('Rendering ornament: ', this.ornament, glyphX, glyphY);\n if (this.accidentalLower) {\n this.accidentalLower.render(ctx, glyphX, glyphY);\n glyphY -= this.accidentalLower.getMetrics().height;\n glyphY -= this.render_options.accidentalLowerPadding;\n }\n if (this.stemUpYOffset && note.hasStem() && note.getStemDirection() === 1) {\n glyphY += this.stemUpYOffset;\n }\n if (note.getLineNumber() < 5 && Ornament.ornamentNoteTransition.indexOf(this.type) >= 0) {\n glyphY = note.checkStave().getBoundingBox().getY() + 40;\n }\n this.glyph.render(ctx, glyphX + this.x_shift, glyphY);\n if (this.accidentalUpper) {\n glyphY -= this.glyph.getMetrics().height + this.render_options.accidentalUpperPadding;\n this.accidentalUpper.render(ctx, glyphX, glyphY);\n }\n ctx.closeGroup();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Ornament.DEBUG` to `true`. */\nOrnament.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Rodrigo Vilar\n// MIT License\nimport { Glyph } from './glyph';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { Tables } from './tables';\nimport { Category, isGraceNote } from './typeguard';\n/** Parenthesis implements parenthesis modifiers for notes. */\nexport class Parenthesis extends Modifier {\n /**\n * Constructor\n *\n * @param position Modifier.Position.LEFT (default) or Modifier.Position.RIGHT\n */\n constructor(position) {\n super();\n this.position = position !== null && position !== void 0 ? position : Modifier.Position.LEFT;\n this.point = Tables.currentMusicFont().lookupMetric('parenthesis.default.point');\n this.setWidth(Tables.currentMusicFont().lookupMetric('parenthesis.default.width'));\n }\n static get CATEGORY() {\n return Category.Parenthesis;\n }\n /** Add parentheses to the notes. */\n static buildAndAttach(notes) {\n for (const note of notes) {\n for (let i = 0; i < note.keys.length; i++) {\n note.addModifier(new Parenthesis(ModifierPosition.LEFT), i);\n note.addModifier(new Parenthesis(ModifierPosition.RIGHT), i);\n }\n }\n }\n /** Arrange parentheses inside a ModifierContext. */\n static format(parentheses, state) {\n if (!parentheses || parentheses.length === 0)\n return false;\n let x_widthL = 0;\n let x_widthR = 0;\n for (let i = 0; i < parentheses.length; ++i) {\n const parenthesis = parentheses[i];\n const note = parenthesis.getNote();\n const pos = parenthesis.getPosition();\n const index = parenthesis.checkIndex();\n let shift = 0;\n if (pos === ModifierPosition.RIGHT) {\n shift = note.getRightParenthesisPx(index);\n x_widthR = x_widthR > shift + parenthesis.width ? x_widthR : shift + parenthesis.width;\n }\n if (pos === ModifierPosition.LEFT) {\n shift = note.getLeftParenthesisPx(index);\n x_widthL = x_widthL > shift + parenthesis.width ? x_widthL : shift + parenthesis.width;\n }\n parenthesis.setXShift(shift);\n }\n state.left_shift += x_widthL;\n state.right_shift += x_widthR;\n return true;\n }\n /** Set the associated note. */\n setNote(note) {\n this.note = note;\n this.point = Tables.currentMusicFont().lookupMetric('parenthesis.default.point');\n this.setWidth(Tables.currentMusicFont().lookupMetric('parenthesis.default.width'));\n if (isGraceNote(note)) {\n this.point = Tables.currentMusicFont().lookupMetric('parenthesis.gracenote.point');\n this.setWidth(Tables.currentMusicFont().lookupMetric('parenthesis.gracenote.width'));\n }\n return this;\n }\n /** Render the parenthesis. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(this.position, this.index, { forceFlagRight: true });\n const x = start.x + this.x_shift;\n const y = start.y + this.y_shift;\n if (this.position == Modifier.Position.RIGHT) {\n Glyph.renderGlyph(ctx, x + 1, y, this.point, 'noteheadParenthesisRight', {\n category: `noteHead.standard.noteheadParenthesisRight`,\n });\n }\n else if (this.position == Modifier.Position.LEFT) {\n Glyph.renderGlyph(ctx, x - 2, y, this.point, 'noteheadParenthesisLeft', {\n category: `noteHead.standard.noteheadParenthesisLeft`,\n });\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// A generic text parsing class for VexFlow.\nimport { log, RuntimeError } from './util';\n// To enable logging for this class. Set `Vex.Flow.Parser.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (Parser.DEBUG)\n log('Vex.Flow.Parser', args);\n}\nconst NO_ERROR_POS = -1;\n// Converts parser results into an easy to reference list that can be\n// used in triggers. This function returns:\n// - nested array in which the leaf elements are string or null\n// - string (including empty strings)\n// - null\nfunction flattenMatches(r) {\n if ('matchedString' in r)\n return r.matchedString; // string\n if ('results' in r)\n return flattenMatches(r.results);\n const results = r;\n if (results.length === 1)\n return flattenMatches(results[0]);\n if (results.length === 0)\n return null;\n return results.map(flattenMatches); // nested array\n}\n// This is the base parser class. Given an arbitrary context-free grammar, it\n// can parse any line and execute code when specific rules are met (e.g.,\n// when a string is terminated.)\nexport class Parser {\n // For an example of a simple grammar, take a look at tests/parser_tests.ts or\n // the EasyScore grammar in easyscore.ts.\n constructor(grammar) {\n this.grammar = grammar;\n this.line = '';\n this.pos = 0;\n this.errorPos = NO_ERROR_POS;\n }\n // Parse `line` using current grammar. Returns `{success: true}` if the\n // line parsed correctly, otherwise returns `{success: false, errorPos: N}`\n // where `errorPos` is the location of the error in the string.\n parse(line) {\n this.line = line;\n this.pos = 0;\n this.errorPos = NO_ERROR_POS;\n const result = this.expect(this.grammar.begin());\n result.errorPos = this.errorPos;\n return result;\n }\n matchFail(returnPos) {\n if (this.errorPos === NO_ERROR_POS)\n this.errorPos = this.pos;\n this.pos = returnPos;\n }\n matchSuccess() {\n this.errorPos = NO_ERROR_POS;\n }\n // Look for `token` in this.line[this.pos], and return success\n // if one is found. `token` is specified as a regular expression.\n matchToken(token, noSpace = false) {\n const regexp = noSpace ? new RegExp('^((' + token + '))') : new RegExp('^((' + token + ')\\\\s*)');\n const workingLine = this.line.slice(this.pos);\n const result = workingLine.match(regexp);\n if (result !== null) {\n return {\n success: true,\n matchedString: result[2],\n incrementPos: result[1].length,\n pos: this.pos,\n };\n }\n else {\n return { success: false, pos: this.pos };\n }\n }\n // Execute rule to match a sequence of tokens (or rules). If `maybe` is\n // set, then return success even if the token is not found, but reset\n // the position before exiting.\n // TODO: expectOne(...) is never called with the `maybe` parameter.\n expectOne(rule, maybe = false) {\n const results = [];\n const pos = this.pos;\n let allMatches = true;\n let oneMatch = false;\n maybe = maybe === true || rule.maybe === true;\n // Execute all sub rules in sequence.\n if (rule.expect) {\n for (const next of rule.expect) {\n const localPos = this.pos;\n const result = this.expect(next);\n // If `rule.or` is set, then return success if any one\n // of the subrules match, else all subrules must match.\n if (result.success) {\n results.push(result);\n oneMatch = true;\n if (rule.or)\n break;\n }\n else {\n allMatches = false;\n if (!rule.or) {\n this.pos = localPos;\n break;\n }\n }\n }\n }\n const gotOne = (rule.or && oneMatch) || allMatches;\n const success = gotOne || maybe === true;\n const numMatches = gotOne ? 1 : 0;\n if (maybe && !gotOne)\n this.pos = pos;\n if (success) {\n this.matchSuccess();\n }\n else {\n this.matchFail(pos);\n }\n return { success, results, numMatches };\n }\n // Try to match multiple (one or more) instances of the rule. If `maybe` is set,\n // then a failed match is also a success (but the position is reset).\n expectOneOrMore(rule, maybe = false) {\n const results = [];\n const pos = this.pos;\n let numMatches = 0;\n let more = true;\n do {\n const result = this.expectOne(rule);\n if (result.success && result.results) {\n numMatches++;\n results.push(result.results);\n }\n else {\n more = false;\n }\n } while (more);\n const success = numMatches > 0 || maybe === true;\n if (maybe && !(numMatches > 0))\n this.pos = pos;\n if (success) {\n this.matchSuccess();\n }\n else {\n this.matchFail(pos);\n }\n return { success, results, numMatches };\n }\n // Match zero or more instances of `rule`. Offloads to `expectOneOrMore`.\n expectZeroOrMore(rule) {\n return this.expectOneOrMore(rule, true);\n }\n // Execute the rule produced by the provided `rules` function. This\n // offloads to one of the above matchers and consolidates the results. It is also\n // responsible for executing any code triggered by the rule (in `rule.run`.)\n expect(ruleFunc) {\n L('Evaluating rule function:', ruleFunc);\n if (!ruleFunc) {\n throw new RuntimeError('Invalid rule function');\n }\n let result;\n // Get rule from Grammar class.\n // expect(...) handles both lexing & parsing:\n // - lexer rules produce tokens.\n // - parser rules produce expressions which may trigger code via the\n // { run: () => ... } trigger functions in easyscore.ts.\n // These functions build the VexFlow objects that are displayed on screen.\n const rule = ruleFunc.bind(this.grammar)();\n if (rule.token) {\n // A lexer rule has a `token` property.\n // Base case: parse the regex and throw an error if the\n // line doesn't match.\n result = this.matchToken(rule.token, rule.noSpace === true);\n if (result.success) {\n // Token match! Update position and throw away parsed portion\n // of string.\n this.pos += result.incrementPos;\n }\n }\n else if (rule.expect) {\n // A parser rule has an `expect` property.\n if (rule.oneOrMore) {\n result = this.expectOneOrMore(rule);\n }\n else if (rule.zeroOrMore) {\n result = this.expectZeroOrMore(rule);\n }\n else {\n result = this.expectOne(rule);\n }\n }\n else {\n L(rule);\n throw new RuntimeError('Bad grammar! No `token` or `expect` property ' + rule);\n }\n // If there's a trigger attached to this rule, then run it.\n // Make the matches accessible through `state.matches` in the\n // `run: (state) => ...` trigger.\n const matches = [];\n result.matches = matches;\n if (result.results) {\n result.results.forEach((r) => matches.push(flattenMatches(r)));\n }\n if (rule.run && result.success) {\n rule.run({ matches });\n }\n return result;\n }\n}\nParser.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (PedalMarking.DEBUG)\n log('Vex.Flow.PedalMarking', args);\n}\n/**\n * Draws a pedal glyph with the provided `name` on a rendering `context`\n * at the coordinates `x` and `y. Takes into account the glyph data\n * coordinate shifts.\n */\nfunction drawPedalGlyph(name, context, x, y, point) {\n const glyph_data = PedalMarking.GLYPHS[name];\n const glyph = new Glyph(glyph_data.code, point, { category: 'pedalMarking' });\n glyph.render(context, x + glyph_data.x_shift, y + glyph_data.y_shift);\n}\n/**\n * PedalMarking implements different types of pedal markings. These notation\n * elements indicate to the performer when to depress and release the a pedal.\n *\n * In order to create \"Sostenuto\", and \"una corda\" markings, you must set\n * custom text for the release/depress pedal markings.\n */\nexport class PedalMarking extends Element {\n constructor(notes) {\n super();\n this.notes = notes;\n this.type = PedalMarking.type.TEXT;\n this.line = 0;\n // Custom text for the release/depress markings\n this.custom_depress_text = '';\n this.custom_release_text = '';\n this.resetFont();\n this.render_options = {\n bracket_height: 10,\n text_margin_right: 6,\n bracket_line_width: 1,\n color: 'black',\n };\n }\n static get CATEGORY() {\n return Category.PedalMarking;\n }\n /**\n * Create a sustain pedal marking. Returns the defaults PedalMarking.\n * Which uses the traditional \"Ped\" and \"*\"\" markings.\n */\n static createSustain(notes) {\n const pedal = new PedalMarking(notes);\n return pedal;\n }\n /** Create a sostenuto pedal marking */\n static createSostenuto(notes) {\n const pedal = new PedalMarking(notes);\n pedal.setType(PedalMarking.type.MIXED);\n pedal.setCustomText('Sost. Ped.');\n return pedal;\n }\n /** Create an una corda pedal marking */\n static createUnaCorda(notes) {\n const pedal = new PedalMarking(notes);\n pedal.setType(PedalMarking.type.TEXT);\n pedal.setCustomText('una corda', 'tre corda');\n return pedal;\n }\n /** Set pedal type. */\n setType(type) {\n type = typeof type === 'string' ? PedalMarking.typeString[type] : type;\n if (type >= PedalMarking.type.TEXT && type <= PedalMarking.type.MIXED) {\n this.type = type;\n }\n return this;\n }\n /**\n * Set custom text for the `depress`/`release` pedal markings. No text is\n * set if the parameter is falsy.\n */\n setCustomText(depress, release) {\n this.custom_depress_text = depress || '';\n this.custom_release_text = release || '';\n return this;\n }\n /** Set the staff line to render the markings on. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Draw the bracket based pedal markings. */\n drawBracketed() {\n const ctx = this.checkContext();\n let is_pedal_depressed = false;\n let prev_x;\n let prev_y;\n // Iterate through each note\n this.notes.forEach((note, index, notes) => {\n // Each note triggers the opposite pedal action\n is_pedal_depressed = !is_pedal_depressed;\n // Get the initial coordinates for the note\n const x = note.getAbsoluteX();\n const y = note.checkStave().getYForBottomText(this.line + 3);\n // Throw if current note is positioned before the previous note\n if (x < prev_x) {\n throw new RuntimeError('InvalidConfiguration', 'The notes provided must be in order of ascending x positions');\n }\n // Determine if the previous or next note are the same\n // as the current note. We need to keep track of this for\n // when adjustments are made for the release+depress action\n const next_is_same = notes[index + 1] === note;\n const prev_is_same = notes[index - 1] === note;\n let x_shift = 0;\n const point = Tables.currentMusicFont().lookupMetric(`pedalMarking.${is_pedal_depressed ? 'down' : 'up'}.point`);\n if (is_pedal_depressed) {\n // Adjustment for release+depress\n x_shift = prev_is_same ? 5 : 0;\n if (this.type === PedalMarking.type.MIXED && !prev_is_same) {\n // For MIXED style, start with text instead of bracket\n if (this.custom_depress_text) {\n // If we have custom text, use instead of the default \"Ped\" glyph\n const text_width = ctx.measureText(this.custom_depress_text).width;\n ctx.fillText(this.custom_depress_text, x - text_width / 2, y);\n x_shift = text_width / 2 + this.render_options.text_margin_right;\n }\n else {\n // Render the Ped glyph in position\n drawPedalGlyph('pedal_depress', ctx, x, y, point);\n x_shift = 20 + this.render_options.text_margin_right;\n }\n }\n else {\n // Draw start bracket\n ctx.beginPath();\n ctx.moveTo(x, y - this.render_options.bracket_height);\n ctx.lineTo(x + x_shift, y);\n ctx.stroke();\n ctx.closePath();\n }\n }\n else {\n // Adjustment for release+depress\n x_shift = next_is_same ? -5 : 0;\n // Draw end bracket\n ctx.beginPath();\n ctx.moveTo(prev_x, prev_y);\n ctx.lineTo(x + x_shift, y);\n ctx.lineTo(x, y - this.render_options.bracket_height);\n ctx.stroke();\n ctx.closePath();\n }\n // Store previous coordinates\n prev_x = x + x_shift;\n prev_y = y;\n });\n }\n /**\n * Draw the text based pedal markings. This defaults to the traditional\n * \"Ped\" and \"*\"\" symbols if no custom text has been provided.\n */\n drawText() {\n const ctx = this.checkContext();\n let is_pedal_depressed = false;\n // Iterate through each note, placing glyphs or custom text accordingly\n this.notes.forEach((note) => {\n is_pedal_depressed = !is_pedal_depressed;\n const stave = note.checkStave();\n const x = note.getAbsoluteX();\n const y = stave.getYForBottomText(this.line + 3);\n const point = Tables.currentMusicFont().lookupMetric(`pedalMarking.${is_pedal_depressed ? 'down' : 'up'}.point`);\n let text_width = 0;\n if (is_pedal_depressed) {\n if (this.custom_depress_text) {\n text_width = ctx.measureText(this.custom_depress_text).width;\n ctx.fillText(this.custom_depress_text, x - text_width / 2, y);\n }\n else {\n drawPedalGlyph('pedal_depress', ctx, x, y, point);\n }\n }\n else {\n if (this.custom_release_text) {\n text_width = ctx.measureText(this.custom_release_text).width;\n ctx.fillText(this.custom_release_text, x - text_width / 2, y);\n }\n else {\n drawPedalGlyph('pedal_release', ctx, x, y, point);\n }\n }\n });\n }\n /** Render the pedal marking in position on the rendering context. */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n ctx.save();\n ctx.setStrokeStyle(this.render_options.color);\n ctx.setFillStyle(this.render_options.color);\n ctx.setFont(this.textFont);\n L('Rendering Pedal Marking');\n if (this.type === PedalMarking.type.BRACKET || this.type === PedalMarking.type.MIXED) {\n ctx.setLineWidth(this.render_options.bracket_line_width);\n this.drawBracketed();\n }\n else if (this.type === PedalMarking.type.TEXT) {\n this.drawText();\n }\n ctx.restore();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.PedalMarking.DEBUG` to `true`. */\nPedalMarking.DEBUG = false;\nPedalMarking.TEXT_FONT = {\n family: Font.SERIF,\n size: 12,\n weight: FontWeight.BOLD,\n style: FontStyle.ITALIC,\n};\n/** Glyph data */\nPedalMarking.GLYPHS = {\n pedal_depress: {\n code: 'keyboardPedalPed',\n x_shift: -10,\n y_shift: 0,\n },\n pedal_release: {\n code: 'keyboardPedalUp',\n x_shift: -2,\n y_shift: 3,\n },\n};\n/** Pedal type as number. */\nPedalMarking.type = {\n TEXT: 1,\n BRACKET: 2,\n MIXED: 3,\n};\n/** Pedal type as string. */\nPedalMarking.typeString = {\n text: PedalMarking.type.TEXT,\n bracket: PedalMarking.type.BRACKET,\n mixed: PedalMarking.type.MIXED,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Mohit Cheppudira\n//\n// ## Description\n//\n// This file implements a registry for VexFlow elements. It allows users\n// to track, query, and manage some subset of generated elements, and\n// dynamically get and set attributes.\n//\n// There are two ways to register with a registry:\n//\n// 1) Explicitly call `registry.register(elem:Element, id?:string)`, or,\n// 2) Call `Registry.enableDefaultRegistry(registry)` when ready, and all future\n// elements will automatically register with it.\n//\n// Once an element is registered, selected attributes are tracked and indexed by\n// the registry. This allows fast look up of elements by attributes like id, type,\n// and class.\nimport { RuntimeError } from './util';\n// Indexes are represented as maps of maps of maps. This allows\n// for both multi-labeling (e.g., an element can have multiple classes)\n// and efficient lookup.\nclass Index {\n constructor() {\n this.id = {};\n this.type = {};\n this.class = {};\n }\n}\nexport class Registry {\n constructor() {\n this.index = new Index();\n }\n static getDefaultRegistry() {\n return Registry.defaultRegistry;\n }\n // If you call `enableDefaultRegistry`, any new elements will auto-register with\n // the provided registry as soon as they're constructed.\n static enableDefaultRegistry(registry) {\n Registry.defaultRegistry = registry;\n }\n static disableDefaultRegistry() {\n Registry.defaultRegistry = undefined;\n }\n clear() {\n this.index = new Index();\n return this;\n }\n setIndexValue(name, value, id, elem) {\n const index = this.index;\n if (!index[name][value]) {\n index[name][value] = {};\n }\n index[name][value][id] = elem;\n }\n // Updates the indexes for element 'id'. If an element's attribute changes\n // from A -> B, make sure to remove the element from A.\n updateIndex({ id, name, value, oldValue }) {\n const elem = this.getElementById(id);\n if (oldValue !== undefined && this.index[name][oldValue]) {\n delete this.index[name][oldValue][id];\n }\n if (value && elem) {\n this.setIndexValue(name, value, elem.getAttribute('id'), elem);\n }\n }\n /**\n * Register element `elem` with this registry.\n * This adds the element to its index and watches it for attribute changes.\n * @param elem\n * @param id\n * @returns this\n */\n register(elem, id) {\n id = id || elem.getAttribute('id');\n if (!id) {\n throw new RuntimeError(\"Can't add element without `id` attribute to registry\");\n }\n // Manually add id to index, then update other indexes.\n elem.setAttribute('id', id);\n this.setIndexValue('id', id, id, elem);\n this.updateIndex({ id, name: 'type', value: elem.getAttribute('type'), oldValue: undefined });\n elem.onRegister(this);\n return this;\n }\n getElementById(id) {\n var _a, _b;\n return (_b = (_a = this.index.id) === null || _a === void 0 ? void 0 : _a[id]) === null || _b === void 0 ? void 0 : _b[id]; // return undefined if the id is not found.\n }\n getElementsByAttribute(attribute, value) {\n const index_attr = this.index[attribute];\n if (index_attr) {\n const index_attr_val = index_attr[value];\n if (index_attr_val) {\n const keys = Object.keys(index_attr_val);\n return keys.map((k) => index_attr_val[k]);\n }\n }\n return [];\n }\n getElementsByType(type) {\n return this.getElementsByAttribute('type', type);\n }\n getElementsByClass(className) {\n return this.getElementsByAttribute('class', className);\n }\n // This is called by the element when an attribute value changes. If an indexed\n // attribute changes, then update the local index.\n onUpdate(info) {\n const allowedNames = ['id', 'type', 'class'];\n if (allowedNames.includes(info.name)) {\n this.updateIndex(info);\n }\n return this;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2021.\n// MIT License\nimport { Category } from './typeguard';\nexport class RenderContext {\n static get CATEGORY() {\n return Category.RenderContext;\n }\n set font(f) {\n this.setFont(f);\n }\n get font() {\n return this.getFont();\n }\n /**\n * This is kept for backwards compatibility with 3.0.9.\n * @deprecated use `setFont(...)` instead since it now supports CSS font shorthand.\n */\n setRawFont(f) {\n this.setFont(f);\n return this;\n }\n}\n/**\n * Draw a tiny dot marker on the specified context. A great debugging aid.\n * @param ctx context\n * @param x dot x coordinate\n * @param y dot y coordinate\n * @param color\n */\nexport function drawDot(ctx, x, y, color = '#F55') {\n ctx.save();\n ctx.setFillStyle(color);\n // draw a circle\n ctx.beginPath();\n ctx.arc(x, y, 3, 0, Math.PI * 2, true);\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { CanvasContext } from './canvascontext';\nimport { SVGContext } from './svgcontext';\nimport { isRenderContext } from './typeguard';\nimport { RuntimeError } from './util';\nimport { isHTMLCanvas, isHTMLDiv } from './web';\nexport var RendererBackends;\n(function (RendererBackends) {\n RendererBackends[RendererBackends[\"CANVAS\"] = 1] = \"CANVAS\";\n RendererBackends[RendererBackends[\"SVG\"] = 2] = \"SVG\";\n})(RendererBackends || (RendererBackends = {}));\n// End of line types\nexport var RendererLineEndType;\n(function (RendererLineEndType) {\n RendererLineEndType[RendererLineEndType[\"NONE\"] = 1] = \"NONE\";\n RendererLineEndType[RendererLineEndType[\"UP\"] = 2] = \"UP\";\n RendererLineEndType[RendererLineEndType[\"DOWN\"] = 3] = \"DOWN\";\n})(RendererLineEndType || (RendererLineEndType = {}));\n/**\n * Support Canvas & SVG rendering contexts.\n */\nexport class Renderer {\n constructor(arg0, arg1) {\n if (isRenderContext(arg0)) {\n // The user has provided what looks like a RenderContext, let's just use it.\n this.ctx = arg0;\n }\n else {\n if (arg1 === undefined) {\n // The backend must be specified if the render context isn't directly provided.\n throw new RuntimeError('InvalidArgument', 'Missing backend argument');\n }\n const backend = arg1;\n let element;\n if (typeof arg0 == 'string') {\n const maybeElement = document.getElementById(arg0);\n if (!maybeElement) {\n throw new RuntimeError('BadElementId', `Can't find element with ID \"${maybeElement}\"`);\n }\n element = maybeElement;\n }\n else {\n element = arg0;\n }\n // Verify backend and create context\n if (backend === Renderer.Backends.CANVAS) {\n if (!isHTMLCanvas(element)) {\n throw new RuntimeError('BadElement', 'CANVAS context requires an HTMLCanvasElement.');\n }\n const context = element.getContext('2d');\n if (!context) {\n throw new RuntimeError('BadElement', \"Can't get canvas context\");\n }\n this.ctx = new CanvasContext(context);\n }\n else if (backend === Renderer.Backends.SVG) {\n if (!isHTMLDiv(element)) {\n throw new RuntimeError('BadElement', 'SVG context requires an HTMLDivElement.');\n }\n this.ctx = new SVGContext(element);\n }\n else {\n throw new RuntimeError('InvalidBackend', `No support for backend: ${backend}`);\n }\n }\n }\n static buildContext(elementId, backend, width, height, background = '#FFF') {\n const renderer = new Renderer(elementId, backend);\n if (width && height) {\n renderer.resize(width, height);\n }\n const ctx = renderer.getContext();\n ctx.setBackgroundFillStyle(background);\n Renderer.lastContext = ctx;\n return ctx;\n }\n static getCanvasContext(elementId, width, height, background) {\n return Renderer.buildContext(elementId, Renderer.Backends.CANVAS, width, height, background);\n }\n static getSVGContext(elementId, width, height, background) {\n return Renderer.buildContext(elementId, Renderer.Backends.SVG, width, height, background);\n }\n // Draw a dashed line (horizontal, vertical or diagonal\n // dashPattern = [3,3] draws a 3 pixel dash followed by a three pixel space.\n // setting the second number to 0 draws a solid line.\n static drawDashedLine(context, fromX, fromY, toX, toY, dashPattern) {\n context.beginPath();\n const dx = toX - fromX;\n const dy = toY - fromY;\n const angle = Math.atan2(dy, dx);\n let x = fromX;\n let y = fromY;\n context.moveTo(fromX, fromY);\n let idx = 0;\n let draw = true;\n while (!((dx < 0 ? x <= toX : x >= toX) && (dy < 0 ? y <= toY : y >= toY))) {\n const dashLength = dashPattern[idx++ % dashPattern.length];\n const nx = x + Math.cos(angle) * dashLength;\n x = dx < 0 ? Math.max(toX, nx) : Math.min(toX, nx);\n const ny = y + Math.sin(angle) * dashLength;\n y = dy < 0 ? Math.max(toY, ny) : Math.min(toY, ny);\n if (draw) {\n context.lineTo(x, y);\n }\n else {\n context.moveTo(x, y);\n }\n draw = !draw;\n }\n context.closePath();\n context.stroke();\n }\n resize(width, height) {\n this.ctx.resize(width, height);\n return this;\n }\n getContext() {\n return this.ctx;\n }\n}\nRenderer.Backends = RendererBackends;\nRenderer.LineEndType = RendererLineEndType;\n// Used by vexflow_test_helpers.ts\n// Should this be private?\n// Can we do this in a cleaner way?\nRenderer.lastContext = undefined;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { Glyph } from './glyph';\nimport { GlyphNote } from './glyphnote';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\n// Map `type` to SMuFL glyph code.\nconst CODES = {\n '1': 'repeat1Bar',\n '2': 'repeat2Bars',\n '4': 'repeat4Bars',\n slash: 'repeatBarSlash',\n};\nexport class RepeatNote extends GlyphNote {\n static get CATEGORY() {\n return Category.RepeatNote;\n }\n constructor(type, noteStruct, options) {\n super(undefined, Object.assign({ duration: 'q', align_center: type !== 'slash' }, noteStruct), options);\n const glyphCode = CODES[type] || 'repeat1Bar';\n const glyph = new Glyph(glyphCode, Tables.currentMusicFont().lookupMetric('repeatNote.point', 40), {\n category: 'repeatNote',\n });\n this.setGlyph(glyph);\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { BoundingBox } from './boundingbox';\nimport { Clef } from './clef';\nimport { Element } from './element';\nimport { Font, FontStyle, FontWeight } from './font';\nimport { KeySignature } from './keysignature';\nimport { Barline, BarlineType } from './stavebarline';\nimport { StaveModifierPosition } from './stavemodifier';\nimport { Repetition } from './staverepetition';\nimport { StaveSection } from './stavesection';\nimport { StaveTempo } from './stavetempo';\nimport { StaveText } from './stavetext';\nimport { Volta } from './stavevolta';\nimport { Tables } from './tables';\nimport { TimeSignature } from './timesignature';\nimport { Category, isBarline } from './typeguard';\nimport { RuntimeError } from './util';\n// Used by Stave.format() to sort the modifiers at the beginning and end of a stave.\n// The keys (computed property names) match the CATEGORY property in the\n// Barline, Clef, KeySignature, TimeSignature classes.\nconst SORT_ORDER_BEG_MODIFIERS = {\n [Barline.CATEGORY]: 0,\n [Clef.CATEGORY]: 1,\n [KeySignature.CATEGORY]: 2,\n [TimeSignature.CATEGORY]: 3,\n};\nconst SORT_ORDER_END_MODIFIERS = {\n [TimeSignature.CATEGORY]: 0,\n [KeySignature.CATEGORY]: 1,\n [Barline.CATEGORY]: 2,\n [Clef.CATEGORY]: 3,\n};\nexport class Stave extends Element {\n constructor(x, y, width, options) {\n super();\n // Initialized by the constructor via this.resetLines().\n this.height = 0;\n this.x = x;\n this.y = y;\n this.width = width;\n this.formatted = false;\n this.start_x = x + 5;\n this.end_x = x + width;\n this.modifiers = []; // stave modifiers (clef, key, time, barlines, coda, segno, etc.)\n this.measure = 0;\n this.clef = 'treble';\n this.endClef = undefined;\n this.resetFont();\n this.options = Object.assign({ vertical_bar_width: 10, num_lines: 5, fill_style: '#999999', left_bar: true, right_bar: true, spacing_between_lines_px: Tables.STAVE_LINE_DISTANCE, space_above_staff_ln: 4, space_below_staff_ln: 4, top_text_position: 1, bottom_text_position: 4, line_config: [] }, options);\n this.bounds = { x: this.x, y: this.y, w: this.width, h: 0 };\n this.defaultLedgerLineStyle = { strokeStyle: '#444', lineWidth: 1.4 };\n this.resetLines();\n // beg bar\n this.addModifier(new Barline(this.options.left_bar ? BarlineType.SINGLE : BarlineType.NONE));\n // end bar\n this.addEndModifier(new Barline(this.options.right_bar ? BarlineType.SINGLE : BarlineType.NONE));\n }\n static get CATEGORY() {\n return Category.Stave;\n }\n // This is the sum of the padding that normally goes on left + right of a stave during\n // drawing. Used to size staves correctly with content width.\n static get defaultPadding() {\n const musicFont = Tables.currentMusicFont();\n return musicFont.lookupMetric('stave.padding') + musicFont.lookupMetric('stave.endPaddingMax');\n }\n // Right padding, used by system if startX is already determined.\n static get rightPadding() {\n const musicFont = Tables.currentMusicFont();\n return musicFont.lookupMetric('stave.endPaddingMax');\n }\n /** Set default style for ledger lines. */\n setDefaultLedgerLineStyle(style) {\n this.defaultLedgerLineStyle = style;\n }\n /** Get default style for ledger lines. */\n getDefaultLedgerLineStyle() {\n return Object.assign(Object.assign({}, this.getStyle()), this.defaultLedgerLineStyle);\n }\n space(spacing) {\n return this.options.spacing_between_lines_px * spacing;\n }\n resetLines() {\n this.options.line_config = [];\n for (let i = 0; i < this.options.num_lines; i++) {\n this.options.line_config.push({ visible: true });\n }\n this.height = (this.options.num_lines + this.options.space_above_staff_ln) * this.options.spacing_between_lines_px;\n this.options.bottom_text_position = this.options.num_lines;\n }\n setNoteStartX(x) {\n if (!this.formatted)\n this.format();\n this.start_x = x;\n const begBarline = this.modifiers[0];\n begBarline.setX(this.start_x - begBarline.getWidth());\n return this;\n }\n getNoteStartX() {\n if (!this.formatted)\n this.format();\n return this.start_x;\n }\n getNoteEndX() {\n if (!this.formatted)\n this.format();\n return this.end_x;\n }\n getTieStartX() {\n return this.start_x;\n }\n getTieEndX() {\n return this.end_x;\n }\n getX() {\n return this.x;\n }\n getNumLines() {\n return this.options.num_lines;\n }\n setNumLines(n) {\n this.options.num_lines = n;\n this.resetLines();\n return this;\n }\n setY(y) {\n this.y = y;\n return this;\n }\n getY() {\n return this.y;\n }\n getTopLineTopY() {\n return this.getYForLine(0) - Tables.STAVE_LINE_THICKNESS / 2;\n }\n getBottomLineBottomY() {\n return this.getYForLine(this.getNumLines() - 1) + Tables.STAVE_LINE_THICKNESS / 2;\n }\n setX(x) {\n const shift = x - this.x;\n this.formatted = false;\n this.x = x;\n this.start_x += shift;\n this.end_x += shift;\n for (let i = 0; i < this.modifiers.length; i++) {\n const mod = this.modifiers[i];\n mod.setX(mod.getX() + shift);\n }\n return this;\n }\n setWidth(width) {\n this.formatted = false;\n this.width = width;\n this.end_x = this.x + width;\n // reset the x position of the end barline (TODO(0xfe): This makes no sense)\n // this.modifiers[1].setX(this.end_x);\n return this;\n }\n getWidth() {\n return this.width;\n }\n getStyle() {\n return Object.assign({ fillStyle: this.options.fill_style, strokeStyle: this.options.fill_style, lineWidth: Tables.STAVE_LINE_THICKNESS }, this.style);\n }\n setMeasure(measure) {\n this.measure = measure;\n return this;\n }\n /**\n * Gets the pixels to shift from the beginning of the stave\n * following the modifier at the provided index\n * @param {Number} index The index from which to determine the shift\n * @return {Number} The amount of pixels shifted\n */\n getModifierXShift(index = 0) {\n if (typeof index !== 'number') {\n throw new RuntimeError('InvalidIndex', 'Must be of number type');\n }\n if (!this.formatted)\n this.format();\n if (this.getModifiers(StaveModifierPosition.BEGIN).length === 1) {\n return 0;\n }\n // for right position modifiers zero shift seems correct, see 'Volta + Modifier Measure Test'\n if (this.modifiers[index].getPosition() === StaveModifierPosition.RIGHT) {\n return 0;\n }\n let start_x = this.start_x - this.x;\n const begBarline = this.modifiers[0];\n if (begBarline.getType() === BarlineType.REPEAT_BEGIN && start_x > begBarline.getWidth()) {\n start_x -= begBarline.getWidth();\n }\n return start_x;\n }\n /** Coda & Segno Symbol functions */\n setRepetitionType(type, yShift = 0) {\n this.modifiers.push(new Repetition(type, this.x, yShift));\n return this;\n }\n // Volta functions\n setVoltaType(type, number_t, y) {\n this.modifiers.push(new Volta(type, number_t, this.x, y));\n return this;\n }\n // Section functions\n setSection(section, y, xOffset = 0, fontSize) {\n const staveSection = new StaveSection(section, this.x + xOffset, y);\n if (fontSize)\n staveSection.setFontSize(fontSize);\n this.modifiers.push(staveSection);\n return this;\n }\n // Tempo functions\n setTempo(tempo, y) {\n this.modifiers.push(new StaveTempo(tempo, this.x, y));\n return this;\n }\n // Text functions\n setText(text, position, options = {}) {\n this.modifiers.push(new StaveText(text, position, options));\n return this;\n }\n getHeight() {\n return this.height;\n }\n getSpacingBetweenLines() {\n return this.options.spacing_between_lines_px;\n }\n getBoundingBox() {\n return new BoundingBox(this.x, this.y, this.width, this.getBottomY() - this.y);\n }\n getBottomY() {\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const score_bottom = this.getYForLine(options.num_lines) + options.space_below_staff_ln * spacing;\n return score_bottom;\n }\n getBottomLineY() {\n return this.getYForLine(this.options.num_lines);\n }\n // This returns\n /** @returns the y for the *center* of a staff line */\n getYForLine(line) {\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const headroom = options.space_above_staff_ln;\n const y = this.y + line * spacing + headroom * spacing;\n return y;\n }\n getLineForY(y) {\n // Does the reverse of getYForLine - somewhat dumb and just calls\n // getYForLine until the right value is reaches\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const headroom = options.space_above_staff_ln;\n return (y - this.y) / spacing - headroom;\n }\n getYForTopText(line = 0) {\n return this.getYForLine(-line - this.options.top_text_position);\n }\n getYForBottomText(line = 0) {\n return this.getYForLine(this.options.bottom_text_position + line);\n }\n getYForNote(line) {\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const headroom = options.space_above_staff_ln;\n return this.y + headroom * spacing + 5 * spacing - line * spacing;\n }\n getYForGlyphs() {\n return this.getYForLine(3);\n }\n // This method adds a stave modifier to the stave. Note that the first two\n // modifiers (BarLines) are automatically added upon construction.\n addModifier(modifier, position) {\n if (position !== undefined) {\n modifier.setPosition(position);\n }\n modifier.setStave(this);\n this.formatted = false;\n this.modifiers.push(modifier);\n return this;\n }\n addEndModifier(modifier) {\n this.addModifier(modifier, StaveModifierPosition.END);\n return this;\n }\n // Bar Line functions\n setBegBarType(type) {\n // Only valid bar types at beginning of stave is none, single or begin repeat\n const { SINGLE, REPEAT_BEGIN, NONE } = BarlineType;\n if (type === SINGLE || type === REPEAT_BEGIN || type === NONE) {\n this.modifiers[0].setType(type);\n this.formatted = false;\n }\n return this;\n }\n setEndBarType(type) {\n // Repeat end not valid at end of stave\n if (type !== BarlineType.REPEAT_BEGIN) {\n this.modifiers[1].setType(type);\n this.formatted = false;\n }\n return this;\n }\n setClef(clefSpec, size, annotation, position) {\n if (position === undefined) {\n position = StaveModifierPosition.BEGIN;\n }\n if (position === StaveModifierPosition.END) {\n this.endClef = clefSpec;\n }\n else {\n this.clef = clefSpec;\n }\n const clefs = this.getModifiers(position, Clef.CATEGORY);\n if (clefs.length === 0) {\n this.addClef(clefSpec, size, annotation, position);\n }\n else {\n clefs[0].setType(clefSpec, size, annotation);\n }\n return this;\n }\n getClef() {\n return this.clef;\n }\n setEndClef(clefSpec, size, annotation) {\n this.setClef(clefSpec, size, annotation, StaveModifierPosition.END);\n return this;\n }\n getEndClef() {\n return this.endClef;\n }\n setKeySignature(keySpec, cancelKeySpec, position) {\n if (position === undefined) {\n position = StaveModifierPosition.BEGIN;\n }\n const keySignatures = this.getModifiers(position, KeySignature.CATEGORY);\n if (keySignatures.length === 0) {\n this.addKeySignature(keySpec, cancelKeySpec, position);\n }\n else {\n keySignatures[0].setKeySig(keySpec, cancelKeySpec);\n }\n return this;\n }\n setEndKeySignature(keySpec, cancelKeySpec) {\n this.setKeySignature(keySpec, cancelKeySpec, StaveModifierPosition.END);\n return this;\n }\n setTimeSignature(timeSpec, customPadding, position) {\n if (position === undefined) {\n position = StaveModifierPosition.BEGIN;\n }\n const timeSignatures = this.getModifiers(position, TimeSignature.CATEGORY);\n if (timeSignatures.length === 0) {\n this.addTimeSignature(timeSpec, customPadding, position);\n }\n else {\n timeSignatures[0].setTimeSig(timeSpec);\n }\n return this;\n }\n setEndTimeSignature(timeSpec, customPadding) {\n this.setTimeSignature(timeSpec, customPadding, StaveModifierPosition.END);\n return this;\n }\n /**\n * Add a key signature to the stave.\n *\n * Example:\n * `stave.addKeySignature('Db');`\n * @param keySpec new key specification `[A-G][b|#]?`\n * @param cancelKeySpec\n * @param position\n * @returns\n */\n addKeySignature(keySpec, cancelKeySpec, position) {\n if (position === undefined) {\n position = StaveModifierPosition.BEGIN;\n }\n this.addModifier(new KeySignature(keySpec, cancelKeySpec).setPosition(position), position);\n return this;\n }\n /**\n * Add a clef to the stave.\n *\n * Example:\n *\n * stave.addClef('treble')\n * @param clef clef (treble|bass|...) see {@link Clef.types}\n * @param size\n * @param annotation\n * @param position\n * @returns\n */\n addClef(clef, size, annotation, position) {\n if (position === undefined || position === StaveModifierPosition.BEGIN) {\n this.clef = clef;\n }\n else if (position === StaveModifierPosition.END) {\n this.endClef = clef;\n }\n this.addModifier(new Clef(clef, size, annotation), position);\n return this;\n }\n addEndClef(clef, size, annotation) {\n this.addClef(clef, size, annotation, StaveModifierPosition.END);\n return this;\n }\n /**\n * Add a time signature to the stave\n *\n * Example:\n *\n * `stave.addTimeSignature('4/4');`\n * @param timeSpec time signature specification `(C\\||C|\\d\\/\\d)`\n * @param customPadding\n * @param position\n * @returns\n */\n addTimeSignature(timeSpec, customPadding, position) {\n this.addModifier(new TimeSignature(timeSpec, customPadding), position);\n return this;\n }\n addEndTimeSignature(timeSpec, customPadding) {\n this.addTimeSignature(timeSpec, customPadding, StaveModifierPosition.END);\n return this;\n }\n // Deprecated\n addTrebleGlyph() {\n this.addClef('treble');\n return this;\n }\n /**\n * @param position\n * @param category\n * @returns array of StaveModifiers that match the provided position and category.\n */\n getModifiers(position, category) {\n const noPosition = position === undefined;\n const noCategory = category === undefined;\n if (noPosition && noCategory) {\n return this.modifiers;\n }\n else if (noPosition) {\n // A category was provided.\n return this.modifiers.filter((m) => category === m.getCategory());\n }\n else if (noCategory) {\n // A position was provided.\n return this.modifiers.filter((m) => position === m.getPosition());\n }\n else {\n // Both position and category were provided!\n return this.modifiers.filter((m) => position === m.getPosition() && category === m.getCategory());\n }\n }\n /**\n * Use the modifier's `getCategory()` as a key for the `order` array.\n * The retrieved value is used to sort modifiers from left to right (0 to to 3).\n */\n sortByCategory(items, order) {\n for (let i = items.length - 1; i >= 0; i--) {\n for (let j = 0; j < i; j++) {\n if (order[items[j].getCategory()] > order[items[j + 1].getCategory()]) {\n const temp = items[j];\n items[j] = items[j + 1];\n items[j + 1] = temp;\n }\n }\n }\n }\n format() {\n const begBarline = this.modifiers[0];\n const endBarline = this.modifiers[1];\n const begModifiers = this.getModifiers(StaveModifierPosition.BEGIN);\n const endModifiers = this.getModifiers(StaveModifierPosition.END);\n this.sortByCategory(begModifiers, SORT_ORDER_BEG_MODIFIERS);\n this.sortByCategory(endModifiers, SORT_ORDER_END_MODIFIERS);\n if (begModifiers.length > 1 && begBarline.getType() === BarlineType.REPEAT_BEGIN) {\n begModifiers.push(begModifiers.splice(0, 1)[0]);\n begModifiers.splice(0, 0, new Barline(BarlineType.SINGLE));\n }\n if (endModifiers.indexOf(endBarline) > 0) {\n endModifiers.splice(0, 0, new Barline(BarlineType.NONE));\n }\n let width;\n let padding;\n let modifier;\n let offset = 0;\n let x = this.x;\n for (let i = 0; i < begModifiers.length; i++) {\n modifier = begModifiers[i];\n padding = modifier.getPadding(i + offset);\n width = modifier.getWidth();\n x += padding;\n modifier.setX(x);\n x += width;\n if (padding + width === 0)\n offset--;\n }\n this.start_x = x;\n x = this.x + this.width;\n const widths = {\n left: 0,\n right: 0,\n paddingRight: 0,\n paddingLeft: 0,\n };\n let lastBarlineIdx = 0;\n for (let i = 0; i < endModifiers.length; i++) {\n modifier = endModifiers[i];\n lastBarlineIdx = isBarline(modifier) ? i : lastBarlineIdx;\n widths.right = 0;\n widths.left = 0;\n widths.paddingRight = 0;\n widths.paddingLeft = 0;\n const layoutMetrics = modifier.getLayoutMetrics();\n if (layoutMetrics) {\n if (i !== 0) {\n widths.right = layoutMetrics.xMax || 0;\n widths.paddingRight = layoutMetrics.paddingRight || 0;\n }\n widths.left = -layoutMetrics.xMin || 0;\n widths.paddingLeft = layoutMetrics.paddingLeft || 0;\n if (i === endModifiers.length - 1) {\n widths.paddingLeft = 0;\n }\n }\n else {\n widths.paddingRight = modifier.getPadding(i - lastBarlineIdx);\n if (i !== 0) {\n widths.right = modifier.getWidth();\n }\n if (i === 0) {\n widths.left = modifier.getWidth();\n }\n }\n x -= widths.paddingRight;\n x -= widths.right;\n modifier.setX(x);\n x -= widths.left;\n x -= widths.paddingLeft;\n }\n this.end_x = endModifiers.length === 1 ? this.x + this.width : x;\n this.formatted = true;\n }\n /**\n * All drawing functions below need the context to be set.\n */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n ctx.openGroup('stave', this.getAttribute('id'));\n if (!this.formatted)\n this.format();\n const num_lines = this.options.num_lines;\n const width = this.width;\n const x = this.x;\n let y;\n // Render lines\n for (let line = 0; line < num_lines; line++) {\n y = this.getYForLine(line);\n this.applyStyle();\n if (this.options.line_config[line].visible) {\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(x + width, y);\n ctx.stroke();\n }\n this.restoreStyle();\n }\n // Draw the modifiers (bar lines, coda, segno, repeat brackets, etc.)\n for (let i = 0; i < this.modifiers.length; i++) {\n const modifier = this.modifiers[i];\n // Only draw modifier if it has a draw function\n if (typeof modifier.draw === 'function') {\n modifier.applyStyle(ctx);\n modifier.draw(this, this.getModifierXShift(i));\n modifier.restoreStyle(ctx);\n }\n }\n // Render measure numbers\n if (this.measure > 0) {\n ctx.save();\n ctx.setFont(this.textFont);\n const textWidth = ctx.measureText('' + this.measure).width;\n y = this.getYForTopText(0) + 3;\n ctx.fillText('' + this.measure, this.x - textWidth / 2, y);\n ctx.restore();\n }\n ctx.closeGroup();\n return this;\n }\n getVerticalBarWidth() {\n return this.options.vertical_bar_width;\n }\n /**\n * Get the current configuration for the Stave.\n * @return {Array} An array of configuration objects.\n */\n getConfigForLines() {\n return this.options.line_config;\n }\n /**\n * Configure properties of the lines in the Stave\n * @param line_number The index of the line to configure.\n * @param line_config An configuration object for the specified line.\n * @throws RuntimeError \"StaveConfigError\" When the specified line number is out of\n * range of the number of lines specified in the constructor.\n */\n setConfigForLine(line_number, line_config) {\n if (line_number >= this.options.num_lines || line_number < 0) {\n throw new RuntimeError('StaveConfigError', 'The line number must be within the range of the number of lines in the Stave.');\n }\n if (line_config.visible === undefined) {\n throw new RuntimeError('StaveConfigError', \"The line configuration object is missing the 'visible' property.\");\n }\n if (typeof line_config.visible !== 'boolean') {\n throw new RuntimeError('StaveConfigError', \"The line configuration objects 'visible' property must be true or false.\");\n }\n this.options.line_config[line_number] = line_config;\n return this;\n }\n /**\n * Set the staff line configuration array for all of the lines at once.\n * @param lines_configuration An array of line configuration objects. These objects\n * are of the same format as the single one passed in to setLineConfiguration().\n * The caller can set null for any line config entry if it is desired that the default be used\n * @throws RuntimeError \"StaveConfigError\" When the lines_configuration array does not have\n * exactly the same number of elements as the num_lines configuration object set in\n * the constructor.\n */\n setConfigForLines(lines_configuration) {\n if (lines_configuration.length !== this.options.num_lines) {\n throw new RuntimeError('StaveConfigError', 'The length of the lines configuration array must match the number of lines in the Stave');\n }\n // Make sure the defaults are present in case an incomplete set of\n // configuration options were supplied.\n // eslint-disable-next-line\n for (const line_config in lines_configuration) {\n // Allow '{}' to be used if the caller just wants the default for a particular node.\n if (lines_configuration[line_config].visible == undefined) {\n lines_configuration[line_config] = this.options.line_config[line_config];\n }\n this.options.line_config[line_config] = Object.assign(Object.assign({}, this.options.line_config[line_config]), lines_configuration[line_config]);\n }\n this.options.line_config = lines_configuration;\n return this;\n }\n}\nStave.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 8,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// Author Larry Kuhns 2011\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nexport var BarlineType;\n(function (BarlineType) {\n BarlineType[BarlineType[\"SINGLE\"] = 1] = \"SINGLE\";\n BarlineType[BarlineType[\"DOUBLE\"] = 2] = \"DOUBLE\";\n BarlineType[BarlineType[\"END\"] = 3] = \"END\";\n BarlineType[BarlineType[\"REPEAT_BEGIN\"] = 4] = \"REPEAT_BEGIN\";\n BarlineType[BarlineType[\"REPEAT_END\"] = 5] = \"REPEAT_END\";\n BarlineType[BarlineType[\"REPEAT_BOTH\"] = 6] = \"REPEAT_BOTH\";\n BarlineType[BarlineType[\"NONE\"] = 7] = \"NONE\";\n})(BarlineType || (BarlineType = {}));\nexport class Barline extends StaveModifier {\n constructor(type) {\n super();\n this.thickness = Tables.STAVE_LINE_THICKNESS;\n const TYPE = BarlineType;\n this.widths = {};\n this.widths[TYPE.SINGLE] = 5;\n this.widths[TYPE.DOUBLE] = 5;\n this.widths[TYPE.END] = 5;\n this.widths[TYPE.REPEAT_BEGIN] = 5;\n this.widths[TYPE.REPEAT_END] = 5;\n this.widths[TYPE.REPEAT_BOTH] = 5;\n this.widths[TYPE.NONE] = 5;\n this.paddings = {};\n this.paddings[TYPE.SINGLE] = 0;\n this.paddings[TYPE.DOUBLE] = 0;\n this.paddings[TYPE.END] = 0;\n this.paddings[TYPE.REPEAT_BEGIN] = 15;\n this.paddings[TYPE.REPEAT_END] = 15;\n this.paddings[TYPE.REPEAT_BOTH] = 15;\n this.paddings[TYPE.NONE] = 0;\n this.layoutMetricsMap = {};\n this.layoutMetricsMap[TYPE.SINGLE] = {\n xMin: 0,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.DOUBLE] = {\n xMin: -3,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.END] = {\n xMin: -5,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.REPEAT_END] = {\n xMin: -10,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.REPEAT_BEGIN] = {\n xMin: -2,\n xMax: 10,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.REPEAT_BOTH] = {\n xMin: -10,\n xMax: 10,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.NONE] = {\n xMin: 0,\n xMax: 0,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.setPosition(StaveModifierPosition.BEGIN);\n this.setType(type);\n }\n static get CATEGORY() {\n return Category.Barline;\n }\n static get type() {\n return BarlineType;\n }\n static get typeString() {\n return {\n single: BarlineType.SINGLE,\n double: BarlineType.DOUBLE,\n end: BarlineType.END,\n repeatBegin: BarlineType.REPEAT_BEGIN,\n repeatEnd: BarlineType.REPEAT_END,\n repeatBoth: BarlineType.REPEAT_BOTH,\n none: BarlineType.NONE,\n };\n }\n getType() {\n return this.type;\n }\n setType(type) {\n this.type = typeof type === 'string' ? Barline.typeString[type] : type;\n this.setWidth(this.widths[this.type]);\n this.setPadding(this.paddings[this.type]);\n this.setLayoutMetrics(this.layoutMetricsMap[this.type]);\n return this;\n }\n // Draw barlines\n draw(stave) {\n stave.checkContext();\n this.setRendered();\n switch (this.type) {\n case BarlineType.SINGLE:\n this.drawVerticalBar(stave, this.x, false);\n break;\n case BarlineType.DOUBLE:\n this.drawVerticalBar(stave, this.x, true);\n break;\n case BarlineType.END:\n this.drawVerticalEndBar(stave, this.x);\n break;\n case BarlineType.REPEAT_BEGIN:\n // If the barline is shifted over (in front of clef/time/key)\n // Draw vertical bar at the beginning.\n this.drawRepeatBar(stave, this.x, true);\n if (stave.getX() !== this.x) {\n this.drawVerticalBar(stave, stave.getX());\n }\n break;\n case BarlineType.REPEAT_END:\n this.drawRepeatBar(stave, this.x, false);\n break;\n case BarlineType.REPEAT_BOTH:\n this.drawRepeatBar(stave, this.x, false);\n this.drawRepeatBar(stave, this.x, true);\n break;\n default:\n // Default is NONE, so nothing to draw\n break;\n }\n }\n drawVerticalBar(stave, x, double_bar) {\n const staveCtx = stave.checkContext();\n const topY = stave.getTopLineTopY();\n const botY = stave.getBottomLineBottomY();\n if (double_bar) {\n staveCtx.fillRect(x - 3, topY, 1, botY - topY);\n }\n staveCtx.fillRect(x, topY, 1, botY - topY);\n }\n drawVerticalEndBar(stave, x) {\n const staveCtx = stave.checkContext();\n const topY = stave.getTopLineTopY();\n const botY = stave.getBottomLineBottomY();\n staveCtx.fillRect(x - 5, topY, 1, botY - topY);\n staveCtx.fillRect(x - 2, topY, 3, botY - topY);\n }\n drawRepeatBar(stave, x, begin) {\n const staveCtx = stave.checkContext();\n const topY = stave.getTopLineTopY();\n const botY = stave.getBottomLineBottomY();\n let x_shift = 3;\n if (!begin) {\n x_shift = -5;\n }\n staveCtx.fillRect(x + x_shift, topY, 1, botY - topY);\n staveCtx.fillRect(x - 2, topY, 3, botY - topY);\n const dot_radius = 2;\n // Shift dots left or right\n if (begin) {\n x_shift += 4;\n }\n else {\n x_shift -= 4;\n }\n const dot_x = x + x_shift + dot_radius / 2;\n // calculate the y offset based on number of stave lines\n let y_offset = (stave.getNumLines() - 1) * stave.getSpacingBetweenLines();\n y_offset = y_offset / 2 - stave.getSpacingBetweenLines() / 2;\n let dot_y = topY + y_offset + dot_radius / 2;\n // draw the top repeat dot\n staveCtx.beginPath();\n staveCtx.arc(dot_x, dot_y, dot_radius, 0, Math.PI * 2, false);\n staveCtx.fill();\n // draw the bottom repeat dot\n dot_y += stave.getSpacingBetweenLines();\n staveCtx.beginPath();\n staveCtx.arc(dot_x, dot_y, dot_radius, 0, Math.PI * 2, false);\n staveCtx.fill();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nfunction drawBoldDoubleLine(ctx, type, topX, topY, botY) {\n if (type !== StaveConnector.type.BOLD_DOUBLE_LEFT && type !== StaveConnector.type.BOLD_DOUBLE_RIGHT) {\n throw new RuntimeError('InvalidConnector', 'A REPEAT_BEGIN or REPEAT_END type must be provided.');\n }\n let x_shift = 3;\n let variableWidth = 3.5; // Width for avoiding anti-aliasing width issues\n const thickLineOffset = 2; // For aesthetics\n if (type === StaveConnector.type.BOLD_DOUBLE_RIGHT) {\n x_shift = -5; // Flips the side of the thin line\n variableWidth = 3;\n }\n // Thin line\n ctx.fillRect(topX + x_shift, topY, 1, botY - topY);\n // Thick line\n ctx.fillRect(topX - thickLineOffset, topY, variableWidth, botY - topY);\n}\n/** StaveConnector implements the connector lines between staves of a system. */\nexport class StaveConnector extends Element {\n constructor(top_stave, bottom_stave) {\n super();\n this.thickness = Tables.STAVE_LINE_THICKNESS;\n this.width = 3;\n this.top_stave = top_stave;\n this.bottom_stave = bottom_stave;\n this.type = StaveConnector.type.DOUBLE;\n this.resetFont();\n // 1. Offset Bold Double Left to align with offset Repeat Begin bars\n // 2. Offset BRACE type not to overlap with another StaveConnector\n this.x_shift = 0;\n this.texts = [];\n }\n static get CATEGORY() {\n return Category.StaveConnector;\n }\n /**\n * Set type.\n * @param type see {@link StaveConnector.type} & {@link StaveConnector.typeString}\n */\n setType(type) {\n type = typeof type === 'string' ? StaveConnector.typeString[type] : type;\n if (type >= StaveConnector.type.SINGLE_RIGHT && type <= StaveConnector.type.NONE) {\n this.type = type;\n }\n return this;\n }\n /** Set optional associated Text. */\n setText(text, options = {}) {\n this.texts.push({\n content: text,\n options: Object.assign({ shift_x: 0, shift_y: 0 }, options),\n });\n return this;\n }\n setXShift(x_shift) {\n if (typeof x_shift !== 'number') {\n throw new RuntimeError('InvalidType', 'x_shift must be a Number');\n }\n this.x_shift = x_shift;\n return this;\n }\n getXShift() {\n return this.x_shift;\n }\n /** Render connector and associated text. */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n let topY = this.top_stave.getYForLine(0);\n let botY = this.bottom_stave.getYForLine(this.bottom_stave.getNumLines() - 1) + this.thickness;\n let width = this.width;\n let topX = this.top_stave.getX();\n const isRightSidedConnector = this.type === StaveConnector.type.SINGLE_RIGHT ||\n this.type === StaveConnector.type.BOLD_DOUBLE_RIGHT ||\n this.type === StaveConnector.type.THIN_DOUBLE;\n if (isRightSidedConnector) {\n topX = this.top_stave.getX() + this.top_stave.getWidth();\n }\n let attachment_height = botY - topY;\n switch (this.type) {\n case StaveConnector.type.SINGLE:\n width = 1;\n break;\n case StaveConnector.type.SINGLE_LEFT:\n width = 1;\n break;\n case StaveConnector.type.SINGLE_RIGHT:\n width = 1;\n break;\n case StaveConnector.type.DOUBLE:\n topX -= this.width + 2;\n topY -= this.thickness;\n attachment_height += 0.5;\n break;\n case StaveConnector.type.BRACE: {\n width = 12;\n // May need additional code to draw brace\n const x1 = this.top_stave.getX() - 2 + this.x_shift;\n const y1 = topY;\n const x3 = x1;\n const y3 = botY;\n const x2 = x1 - width;\n const y2 = y1 + attachment_height / 2.0;\n const cpx1 = x2 - 0.9 * width;\n const cpy1 = y1 + 0.2 * attachment_height;\n const cpx2 = x1 + 1.1 * width;\n const cpy2 = y2 - 0.135 * attachment_height;\n const cpx3 = cpx2;\n const cpy3 = y2 + 0.135 * attachment_height;\n const cpx4 = cpx1;\n const cpy4 = y3 - 0.2 * attachment_height;\n const cpx5 = x2 - width;\n const cpy5 = cpy4;\n const cpx6 = x1 + 0.4 * width;\n const cpy6 = y2 + 0.135 * attachment_height;\n const cpx7 = cpx6;\n const cpy7 = y2 - 0.135 * attachment_height;\n const cpx8 = cpx5;\n const cpy8 = cpy1;\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, x2, y2);\n ctx.bezierCurveTo(cpx3, cpy3, cpx4, cpy4, x3, y3);\n ctx.bezierCurveTo(cpx5, cpy5, cpx6, cpy6, x2, y2);\n ctx.bezierCurveTo(cpx7, cpy7, cpx8, cpy8, x1, y1);\n ctx.fill();\n ctx.stroke();\n break;\n }\n case StaveConnector.type.BRACKET:\n topY -= 6;\n botY += 6;\n attachment_height = botY - topY;\n Glyph.renderGlyph(ctx, topX - 5, topY, 40, 'bracketTop');\n Glyph.renderGlyph(ctx, topX - 5, botY, 40, 'bracketBottom');\n topX -= this.width + 2;\n break;\n case StaveConnector.type.BOLD_DOUBLE_LEFT:\n drawBoldDoubleLine(ctx, this.type, topX + this.x_shift, topY, botY - this.thickness);\n break;\n case StaveConnector.type.BOLD_DOUBLE_RIGHT:\n drawBoldDoubleLine(ctx, this.type, topX, topY, botY - this.thickness);\n break;\n case StaveConnector.type.THIN_DOUBLE:\n width = 1;\n attachment_height -= this.thickness;\n break;\n case StaveConnector.type.NONE:\n break;\n default:\n throw new RuntimeError('InvalidType', `The provided StaveConnector.type (${this.type}) is invalid.`);\n }\n if (this.type !== StaveConnector.type.BRACE &&\n this.type !== StaveConnector.type.BOLD_DOUBLE_LEFT &&\n this.type !== StaveConnector.type.BOLD_DOUBLE_RIGHT &&\n this.type !== StaveConnector.type.NONE) {\n ctx.fillRect(topX, topY, width, attachment_height);\n }\n // If the connector is a thin double barline, draw the paralell line\n if (this.type === StaveConnector.type.THIN_DOUBLE) {\n ctx.fillRect(topX - 3, topY, width, attachment_height);\n }\n ctx.save();\n ctx.setLineWidth(2);\n ctx.setFont(this.textFont);\n // Add stave connector text\n for (let i = 0; i < this.texts.length; i++) {\n const text = this.texts[i];\n const text_width = ctx.measureText('' + text.content).width;\n const x = this.top_stave.getX() - text_width - 24 + text.options.shift_x;\n const y = (this.top_stave.getYForLine(0) + this.bottom_stave.getBottomLineY()) / 2 + text.options.shift_y;\n ctx.fillText('' + text.content, x, y + 4);\n }\n ctx.restore();\n }\n}\nStaveConnector.TEXT_FONT = {\n family: Font.SERIF,\n size: 16,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n/**\n * SINGLE_LEFT and SINGLE are the same value for compatibility\n * with older versions of vexflow which didn't have right sided\n * stave connectors.\n */\nStaveConnector.type = {\n SINGLE_RIGHT: 0,\n SINGLE_LEFT: 1,\n SINGLE: 1,\n DOUBLE: 2,\n BRACE: 3,\n BRACKET: 4,\n BOLD_DOUBLE_LEFT: 5,\n BOLD_DOUBLE_RIGHT: 6,\n THIN_DOUBLE: 7,\n NONE: 8,\n};\n/**\n * Connector type:\n * * \"singleRight\"\n * * \"singleLeft\"\n * * \"single\"\n * * \"double\"\n * * \"brace\"\n * * \"bracket\"\n * * \"boldDoubleLeft\"\n * * \"boldDoubleRight\"\n * * \"thinDouble\"\n * * \"none\"\n */\nStaveConnector.typeString = {\n singleRight: StaveConnector.type.SINGLE_RIGHT,\n singleLeft: StaveConnector.type.SINGLE_LEFT,\n single: StaveConnector.type.SINGLE,\n double: StaveConnector.type.DOUBLE,\n brace: StaveConnector.type.BRACE,\n bracket: StaveConnector.type.BRACKET,\n boldDoubleLeft: StaveConnector.type.BOLD_DOUBLE_LEFT,\n boldDoubleRight: StaveConnector.type.BOLD_DOUBLE_RIGHT,\n thinDouble: StaveConnector.type.THIN_DOUBLE,\n none: StaveConnector.type.NONE,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// Author: Raffaele Viglianti, 2012 http://itisnotsound.wordpress.com/\n//\n// This class implements hairpins between notes.\n// Hairpins can be either crescendo or decrescendo.\nimport { Element } from './element';\nimport { Modifier } from './modifier';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StaveHairpin extends Element {\n /**\n * Create a new hairpin from the specified notes.\n *\n * @param {!Object} notes The notes to tie up.\n * Notes is a struct that has:\n *\n * {\n * first_note: Note,\n * last_note: Note,\n * }\n * @param {!Object} type The type of hairpin\n */\n constructor(notes, type) {\n super();\n this.setNotes(notes);\n this.hairpin = type;\n this.position = Modifier.Position.BELOW;\n this.render_options = {\n height: 10,\n y_shift: 0,\n left_shift_px: 0,\n right_shift_px: 0,\n right_shift_ticks: 0,\n left_shift_ticks: 0,\n };\n }\n static get CATEGORY() {\n return Category.StaveHairpin;\n }\n /* Helper function to convert ticks into pixels.\n * Requires a Formatter with voices joined and formatted (to\n * get pixels per tick)\n *\n * options is struct that has:\n *\n * {\n * height: px,\n * y_shift: px, // vertical offset\n * left_shift_ticks: 0, // left horizontal offset expressed in ticks\n * right_shift_ticks: 0 // right horizontal offset expressed in ticks\n * }\n *\n **/\n static FormatByTicksAndDraw(ctx, formatter, notes, type, position, options) {\n var _a, _b;\n const ppt = formatter.pixelsPerTick;\n if (ppt == null) {\n throw new RuntimeError('BadArguments', 'A valid Formatter must be provide to draw offsets by ticks.');\n }\n const l_shift_px = ppt * ((_a = options.left_shift_ticks) !== null && _a !== void 0 ? _a : 0);\n const r_shift_px = ppt * ((_b = options.right_shift_ticks) !== null && _b !== void 0 ? _b : 0);\n const hairpin_options = {\n height: options.height,\n y_shift: options.y_shift,\n left_shift_px: l_shift_px,\n right_shift_px: r_shift_px,\n right_shift_ticks: 0,\n left_shift_ticks: 0,\n };\n new StaveHairpin({\n first_note: notes.first_note,\n last_note: notes.last_note,\n }, type)\n .setContext(ctx)\n .setRenderOptions(hairpin_options)\n .setPosition(position)\n .draw();\n }\n setPosition(position) {\n if (position === Modifier.Position.ABOVE || position === Modifier.Position.BELOW) {\n this.position = position;\n }\n return this;\n }\n setRenderOptions(options) {\n if (options.height != null &&\n options.y_shift != null &&\n options.left_shift_px != null &&\n options.right_shift_px != null) {\n this.render_options = options;\n }\n return this;\n }\n /**\n * Set the notes to attach this hairpin to.\n *\n * @param {!Object} notes The start and end notes.\n */\n setNotes(notes) {\n if (!notes.first_note && !notes.last_note) {\n throw new RuntimeError('BadArguments', 'Hairpin needs to have either first_note or last_note set.');\n }\n this.notes = notes;\n this.first_note = notes.first_note;\n this.last_note = notes.last_note;\n return this;\n }\n renderHairpin(params) {\n const ctx = this.checkContext();\n let dis = this.render_options.y_shift + 20;\n let y_shift = params.first_y;\n if (this.position === Modifier.Position.ABOVE) {\n dis = -dis + 30;\n y_shift = params.first_y - params.staff_height;\n }\n const l_shift = this.render_options.left_shift_px;\n const r_shift = this.render_options.right_shift_px;\n ctx.beginPath();\n switch (this.hairpin) {\n case StaveHairpin.type.CRESC:\n ctx.moveTo(params.last_x + r_shift, y_shift + dis);\n ctx.lineTo(params.first_x + l_shift, y_shift + this.render_options.height / 2 + dis);\n ctx.lineTo(params.last_x + r_shift, y_shift + this.render_options.height + dis);\n break;\n case StaveHairpin.type.DECRESC:\n ctx.moveTo(params.first_x + l_shift, y_shift + dis);\n ctx.lineTo(params.last_x + r_shift, y_shift + this.render_options.height / 2 + dis);\n ctx.lineTo(params.first_x + l_shift, y_shift + this.render_options.height + dis);\n break;\n default:\n // Default is NONE, so nothing to draw\n break;\n }\n ctx.stroke();\n ctx.closePath();\n }\n draw() {\n this.checkContext();\n this.setRendered();\n const firstNote = this.first_note;\n const lastNote = this.last_note;\n if (!firstNote || !lastNote)\n throw new RuntimeError('NoNote', 'Notes required to draw');\n const start = firstNote.getModifierStartXY(this.position, 0);\n const end = lastNote.getModifierStartXY(this.position, 0);\n this.renderHairpin({\n first_x: start.x,\n last_x: end.x,\n first_y: firstNote.checkStave().getY() + firstNote.checkStave().getHeight(),\n last_y: lastNote.checkStave().getY() + lastNote.checkStave().getHeight(),\n staff_height: firstNote.checkStave().getHeight(),\n });\n }\n}\nStaveHairpin.type = {\n CRESC: 1,\n DECRESC: 2,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements `StaveLine` which are simply lines that connect\n// two notes. This object is highly configurable, see the `render_options`.\n// A simple line is often used for notating glissando articulations, but you\n// can format a `StaveLine` with arrows or colors for more pedagogical\n// purposes, such as diagrams.\nimport { Element } from './element';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\n// Attribution: Arrow rendering implementations based off of\n// Patrick Horgan's article, \"Drawing lines and arcs with\n// arrow heads on HTML5 Canvas\"\n//\n// Draw an arrow head that connects between 3 coordinates.\nfunction drawArrowHead(ctx, x0, y0, x1, y1, x2, y2) {\n // all cases do this.\n ctx.beginPath();\n ctx.moveTo(x0, y0);\n ctx.lineTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.lineTo(x0, y0);\n ctx.closePath();\n ctx.fill();\n}\nexport class StaveLine extends Element {\n // Initialize the StaveLine with the given `notes`.\n //\n // `notes` is a struct that has:\n //\n // ```\n // {\n // first_note: Note,\n // last_note: Note,\n // first_indices: [n1, n2, n3],\n // last_indices: [n1, n2, n3]\n // }\n // ```\n constructor(notes) {\n super();\n this.setNotes(notes);\n this.text = '';\n this.resetFont();\n this.render_options = {\n // Space to add to the left or the right\n padding_left: 4,\n padding_right: 3,\n // The width of the line in pixels\n line_width: 1,\n // An array of line/space lengths. (TODO/QUESTION: Is this supported in SVG?).\n line_dash: undefined,\n // Can draw rounded line end, instead of a square. (TODO/QUESTION: Is this supported in SVG?).\n rounded_end: true,\n // The color of the line and arrowheads\n color: undefined,\n // Flags to draw arrows on each end of the line\n draw_start_arrow: false,\n draw_end_arrow: false,\n // The length of the arrowhead sides\n arrowhead_length: 10,\n // The angle of the arrowhead\n arrowhead_angle: Math.PI / 8,\n // The position of the text\n text_position_vertical: StaveLine.TextVerticalPosition.TOP,\n text_justification: StaveLine.TextJustification.CENTER,\n };\n }\n static get CATEGORY() {\n return Category.StaveLine;\n }\n // The the annotation for the `StaveLine`\n setText(text) {\n this.text = text;\n return this;\n }\n // Set the notes for the `StaveLine`\n setNotes(notes) {\n if (!notes.first_note && !notes.last_note) {\n throw new RuntimeError('BadArguments', 'Notes needs to have either first_note or last_note set.');\n }\n if (!notes.first_indices)\n notes.first_indices = [0];\n if (!notes.last_indices)\n notes.last_indices = [0];\n if (notes.first_indices.length !== notes.last_indices.length) {\n throw new RuntimeError('BadArguments', 'Connected notes must have same number of indices.');\n }\n this.notes = notes;\n this.first_note = notes.first_note;\n this.first_indices = notes.first_indices;\n this.last_note = notes.last_note;\n this.last_indices = notes.last_indices;\n return this;\n }\n // Apply the style of the `StaveLine` to the context\n applyLineStyle() {\n const ctx = this.checkContext();\n const render_options = this.render_options;\n if (render_options.line_dash) {\n ctx.setLineDash(render_options.line_dash);\n }\n if (render_options.line_width) {\n ctx.setLineWidth(render_options.line_width);\n }\n if (render_options.rounded_end) {\n ctx.setLineCap('round');\n }\n else {\n ctx.setLineCap('square');\n }\n }\n // Apply the text styling to the context\n applyFontStyle() {\n const ctx = this.checkContext();\n ctx.setFont(this.textFont);\n const render_options = this.render_options;\n const color = render_options.color;\n if (color) {\n ctx.setStrokeStyle(color);\n ctx.setFillStyle(color);\n }\n }\n // Helper function to draw a line with arrow heads\n drawArrowLine(ctx, pt1, pt2) {\n const both_arrows = this.render_options.draw_start_arrow && this.render_options.draw_end_arrow;\n const x1 = pt1.x;\n const y1 = pt1.y;\n const x2 = pt2.x;\n const y2 = pt2.y;\n // For ends with arrow we actually want to stop before we get to the arrow\n // so that wide lines won't put a flat end on the arrow.\n const distance = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));\n const ratio = (distance - this.render_options.arrowhead_length / 3) / distance;\n let end_x;\n let end_y;\n let start_x;\n let start_y;\n if (this.render_options.draw_end_arrow || both_arrows) {\n end_x = Math.round(x1 + (x2 - x1) * ratio);\n end_y = Math.round(y1 + (y2 - y1) * ratio);\n }\n else {\n end_x = x2;\n end_y = y2;\n }\n if (this.render_options.draw_start_arrow || both_arrows) {\n start_x = x1 + (x2 - x1) * (1 - ratio);\n start_y = y1 + (y2 - y1) * (1 - ratio);\n }\n else {\n start_x = x1;\n start_y = y1;\n }\n if (this.render_options.color) {\n ctx.setStrokeStyle(this.render_options.color);\n ctx.setFillStyle(this.render_options.color);\n }\n // Draw the shaft of the arrow\n ctx.beginPath();\n ctx.moveTo(start_x, start_y);\n ctx.lineTo(end_x, end_y);\n ctx.stroke();\n ctx.closePath();\n // calculate the angle of the line\n const line_angle = Math.atan2(y2 - y1, x2 - x1);\n // h is the line length of a side of the arrow head\n const h = Math.abs(this.render_options.arrowhead_length / Math.cos(this.render_options.arrowhead_angle));\n let angle1;\n let angle2;\n let top_x;\n let top_y;\n let bottom_x;\n let bottom_y;\n if (this.render_options.draw_end_arrow || both_arrows) {\n angle1 = line_angle + Math.PI + this.render_options.arrowhead_angle;\n top_x = x2 + Math.cos(angle1) * h;\n top_y = y2 + Math.sin(angle1) * h;\n angle2 = line_angle + Math.PI - this.render_options.arrowhead_angle;\n bottom_x = x2 + Math.cos(angle2) * h;\n bottom_y = y2 + Math.sin(angle2) * h;\n drawArrowHead(ctx, top_x, top_y, x2, y2, bottom_x, bottom_y);\n }\n if (this.render_options.draw_start_arrow || both_arrows) {\n angle1 = line_angle + this.render_options.arrowhead_angle;\n top_x = x1 + Math.cos(angle1) * h;\n top_y = y1 + Math.sin(angle1) * h;\n angle2 = line_angle - this.render_options.arrowhead_angle;\n bottom_x = x1 + Math.cos(angle2) * h;\n bottom_y = y1 + Math.sin(angle2) * h;\n drawArrowHead(ctx, top_x, top_y, x1, y1, bottom_x, bottom_y);\n }\n }\n // Renders the `StaveLine` on the context\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n const first_note = this.first_note;\n const last_note = this.last_note;\n const render_options = this.render_options;\n ctx.save();\n this.applyLineStyle();\n // Cycle through each set of indices and draw lines\n let start_position = { x: 0, y: 0 };\n let end_position = { x: 0, y: 0 };\n this.first_indices.forEach((first_index, i) => {\n const last_index = this.last_indices[i];\n // Get initial coordinates for the start/end of the line\n start_position = first_note.getModifierStartXY(2, first_index);\n end_position = last_note.getModifierStartXY(1, last_index);\n const upwards_slope = start_position.y > end_position.y;\n // Adjust `x` coordinates for modifiers\n start_position.x += first_note.getMetrics().modRightPx + render_options.padding_left;\n end_position.x -= last_note.getMetrics().modLeftPx + render_options.padding_right;\n // Adjust first `x` coordinates for displacements\n const notehead_width = first_note.getGlyph().getWidth();\n const first_displaced = first_note.getKeyProps()[first_index].displaced;\n if (first_displaced && first_note.getStemDirection() === 1) {\n start_position.x += notehead_width + render_options.padding_left;\n }\n // Adjust last `x` coordinates for displacements\n const last_displaced = last_note.getKeyProps()[last_index].displaced;\n if (last_displaced && last_note.getStemDirection() === -1) {\n end_position.x -= notehead_width + render_options.padding_right;\n }\n // Adjust y position better if it's not coming from the center of the note\n start_position.y += upwards_slope ? -3 : 1;\n end_position.y += upwards_slope ? 2 : 0;\n this.drawArrowLine(ctx, start_position, end_position);\n });\n ctx.restore();\n // Determine the x coordinate where to start the text\n const text_width = ctx.measureText(this.text).width;\n const justification = render_options.text_justification;\n let x = 0;\n if (justification === StaveLine.TextJustification.LEFT) {\n x = start_position.x;\n }\n else if (justification === StaveLine.TextJustification.CENTER) {\n const delta_x = end_position.x - start_position.x;\n const center_x = delta_x / 2 + start_position.x;\n x = center_x - text_width / 2;\n }\n else if (justification === StaveLine.TextJustification.RIGHT) {\n x = end_position.x - text_width;\n }\n // Determine the y value to start the text\n let y = 0;\n const vertical_position = render_options.text_position_vertical;\n if (vertical_position === StaveLine.TextVerticalPosition.TOP) {\n y = first_note.checkStave().getYForTopText();\n }\n else if (vertical_position === StaveLine.TextVerticalPosition.BOTTOM) {\n y = first_note.checkStave().getYForBottomText(Tables.TEXT_HEIGHT_OFFSET_HACK);\n }\n // Draw the text\n ctx.save();\n this.applyFontStyle();\n ctx.fillText(this.text, x, y);\n ctx.restore();\n return this;\n }\n}\n/** Default text font. */\nStaveLine.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n// Text Positioning\nStaveLine.TextVerticalPosition = {\n TOP: 1,\n BOTTOM: 2,\n};\nStaveLine.TextJustification = {\n LEFT: 1,\n CENTER: 2,\n RIGHT: 3,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// A base class for stave modifiers (e.g. clefs, key signatures)\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { defined } from './util';\nexport var StaveModifierPosition;\n(function (StaveModifierPosition) {\n StaveModifierPosition[StaveModifierPosition[\"CENTER\"] = 0] = \"CENTER\";\n StaveModifierPosition[StaveModifierPosition[\"LEFT\"] = 1] = \"LEFT\";\n StaveModifierPosition[StaveModifierPosition[\"RIGHT\"] = 2] = \"RIGHT\";\n StaveModifierPosition[StaveModifierPosition[\"ABOVE\"] = 3] = \"ABOVE\";\n StaveModifierPosition[StaveModifierPosition[\"BELOW\"] = 4] = \"BELOW\";\n StaveModifierPosition[StaveModifierPosition[\"BEGIN\"] = 5] = \"BEGIN\";\n StaveModifierPosition[StaveModifierPosition[\"END\"] = 6] = \"END\";\n})(StaveModifierPosition || (StaveModifierPosition = {}));\nexport class StaveModifier extends Element {\n constructor() {\n super();\n this.width = 0;\n this.x = 0;\n this.padding = 10;\n this.position = StaveModifierPosition.ABOVE;\n }\n static get CATEGORY() {\n return Category.StaveModifier;\n }\n static get Position() {\n return StaveModifierPosition;\n }\n getPosition() {\n return this.position;\n }\n setPosition(position) {\n this.position = position;\n return this;\n }\n getStave() {\n return this.stave;\n }\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n setStave(stave) {\n this.stave = stave;\n return this;\n }\n getWidth() {\n return this.width;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n getX() {\n return this.x;\n }\n setX(x) {\n this.x = x;\n return this;\n }\n placeGlyphOnLine(glyph, stave, line, customShift = 0) {\n glyph.setYShift(stave.getYForLine(line !== null && line !== void 0 ? line : 0) - stave.getYForGlyphs() + customShift);\n }\n getPadding(index) {\n return index !== undefined && index < 2 ? 0 : this.padding;\n }\n setPadding(padding) {\n this.padding = padding;\n return this;\n }\n setLayoutMetrics(layoutMetrics) {\n this.layoutMetrics = layoutMetrics;\n return this;\n }\n getLayoutMetrics() {\n return this.layoutMetrics;\n }\n // eslint-disable-next-line\n draw(...args) {\n // DO NOTHING.\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// This file implements notes for standard notation. This consists of one or\n// more `NoteHeads`, an optional stem, and an optional flag.\n//\n// Throughout these comments, a \"note\" refers to the entire `StaveNote`,\n// and a \"key\" refers to a specific pitch/notehead within a note.\n//\n// See `tests/stavenote_tests.ts` for usage examples.\nimport { BoundingBox } from './boundingbox';\nimport { Modifier } from './modifier';\nimport { NoteHead } from './notehead';\nimport { Stem } from './stem';\nimport { StemmableNote } from './stemmablenote';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, log, midLine, RuntimeError, warn } from './util';\nfunction showDeprecationWarningForNoteHeads() {\n // eslint-disable-next-line\n console.warn('StaveNote.note_heads is deprecated. Use StaveNote.noteHeads instead.', 'This accessor will be removed in VexFlow 5.0.');\n}\n// To enable logging for this class. Set `Vex.Flow.StaveNote.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (StaveNote.DEBUG)\n log('Vex.Flow.StaveNote', args);\n}\nconst isInnerNoteIndex = (note, index) => index === (note.getStemDirection() === Stem.UP ? note.keyProps.length - 1 : 0);\n// Helper methods for rest positioning in ModifierContext.\nfunction shiftRestVertical(rest, note, dir) {\n const delta = dir;\n rest.line += delta;\n rest.maxLine += delta;\n rest.minLine += delta;\n rest.note.setKeyLine(0, rest.note.getKeyLine(0) + delta);\n}\n// Called from formatNotes :: center a rest between two notes\nfunction centerRest(rest, noteU, noteL) {\n const delta = rest.line - midLine(noteU.minLine, noteL.maxLine);\n rest.note.setKeyLine(0, rest.note.getKeyLine(0) - delta);\n rest.line -= delta;\n rest.maxLine -= delta;\n rest.minLine -= delta;\n}\nexport class StaveNote extends StemmableNote {\n constructor(noteStruct) {\n var _a, _b, _c;\n super(noteStruct);\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // INSTANCE MEMBERS\n this.minLine = 0;\n this.maxLine = 0;\n this.ledgerLineStyle = {};\n this.clef = (_a = noteStruct.clef) !== null && _a !== void 0 ? _a : 'treble';\n this.octave_shift = (_b = noteStruct.octave_shift) !== null && _b !== void 0 ? _b : 0;\n // Pull note rendering properties.\n this.glyph = Tables.getGlyphProps(this.duration, this.noteType);\n defined(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`);\n // if true, displace note to right\n this.displaced = false;\n this.dot_shiftY = 0;\n // for displaced ledger lines\n this.use_default_head_x = false;\n // Drawing\n this._noteHeads = [];\n this.modifiers = [];\n this.render_options = Object.assign(Object.assign({}, this.render_options), { \n // font size for note heads and rests\n glyph_font_scale: noteStruct.glyph_font_scale || Tables.NOTATION_FONT_SCALE, \n // number of stroke px to the left and right of head\n stroke_px: noteStruct.stroke_px || StaveNote.LEDGER_LINE_OFFSET });\n this.calculateKeyProps();\n this.buildStem();\n // Set the stem direction\n if (noteStruct.auto_stem) {\n this.autoStem();\n }\n else {\n this.setStemDirection((_c = noteStruct.stem_direction) !== null && _c !== void 0 ? _c : Stem.UP);\n }\n this.reset();\n this.buildFlag();\n }\n static get CATEGORY() {\n return Category.StaveNote;\n }\n /**\n * @deprecated Use Stem.UP.\n */\n static get STEM_UP() {\n return Stem.UP;\n }\n /**\n * @deprecated Use Stem.DOWN.\n */\n static get STEM_DOWN() {\n return Stem.DOWN;\n }\n static get LEDGER_LINE_OFFSET() {\n return 3;\n }\n static get minNoteheadPadding() {\n const musicFont = Tables.currentMusicFont();\n return musicFont.lookupMetric('glyphs.noteHead.minPadding');\n }\n /** Format notes inside a ModifierContext. */\n static format(notes, state) {\n if (!notes || notes.length < 2)\n return false;\n const notesList = [];\n for (let i = 0; i < notes.length; i++) {\n const props = notes[i].getKeyProps();\n const line = props[0].line;\n let minL = props[props.length - 1].line;\n const stemDirection = notes[i].getStemDirection();\n const stemMax = notes[i].getStemLength() / 10;\n const stemMin = notes[i].getStemMinimumLength() / 10;\n let maxL;\n if (notes[i].isRest()) {\n maxL = line + notes[i].glyph.line_above;\n minL = line - notes[i].glyph.line_below;\n }\n else {\n maxL = stemDirection === 1 ? props[props.length - 1].line + stemMax : props[props.length - 1].line;\n minL = stemDirection === 1 ? props[0].line : props[0].line - stemMax;\n }\n notesList.push({\n line: props[0].line,\n maxLine: maxL,\n minLine: minL,\n isrest: notes[i].isRest(),\n stemDirection: stemDirection,\n stemMax,\n stemMin,\n voice_shift: notes[i].getVoiceShiftWidth(),\n is_displaced: notes[i].isDisplaced(),\n note: notes[i],\n });\n }\n const voices = notesList.length;\n let noteU = notesList[0];\n const noteM = voices > 2 ? notesList[1] : undefined;\n let noteL = voices > 2 ? notesList[2] : notesList[1];\n // for two voice backward compatibility, ensure upper voice is stems up\n // for three voices, the voices must be in order (upper, middle, lower)\n if (voices === 2 && noteU.stemDirection === -1 && noteL.stemDirection === 1) {\n noteU = notesList[1];\n noteL = notesList[0];\n }\n const voiceXShift = Math.max(noteU.voice_shift, noteL.voice_shift);\n let xShift = 0;\n // Test for two voice note intersection\n if (voices === 2) {\n const lineSpacing = noteU.stemDirection === noteL.stemDirection ? 0.0 : 0.5;\n if (noteU.minLine <= noteL.maxLine + lineSpacing) {\n if (noteU.isrest) {\n // shift rest up\n shiftRestVertical(noteU, noteL, 1);\n }\n else if (noteL.isrest) {\n // shift rest down\n shiftRestVertical(noteL, noteU, -1);\n }\n else if (noteU.stemDirection === noteL.stemDirection) {\n // upper voice is middle voice, so shift it right\n xShift = voiceXShift + 2;\n noteU.note.setXShift(xShift);\n }\n else {\n // shift lower voice right\n xShift = voiceXShift + 2;\n noteL.note.setXShift(xShift);\n }\n }\n // format complete\n state.right_shift += xShift;\n return true;\n }\n if (!noteM)\n throw new RuntimeError('InvalidState', 'noteM not defined.');\n // For three voices, test if rests can be repositioned\n //\n // Special case 1 :: middle voice rest between two notes\n //\n if (noteM.isrest && !noteU.isrest && !noteL.isrest) {\n if (noteU.minLine <= noteM.maxLine || noteM.minLine <= noteL.maxLine) {\n const restHeight = noteM.maxLine - noteM.minLine;\n const space = noteU.minLine - noteL.maxLine;\n if (restHeight < space) {\n // center middle voice rest between the upper and lower voices\n centerRest(noteM, noteU, noteL);\n }\n else {\n xShift = voiceXShift + 2; // shift middle rest right\n noteM.note.setXShift(xShift);\n if (noteL.note.hasBeam() === false) {\n noteL.stemDirection = -1;\n noteL.note.setStemDirection(-1);\n }\n if (noteU.minLine <= noteL.maxLine && noteU.note.hasBeam() === false) {\n noteU.stemDirection = 1;\n noteU.note.setStemDirection(1);\n }\n }\n // format complete\n state.right_shift += xShift;\n return true;\n }\n }\n // Special case 2 :: all voices are rests\n if (noteU.isrest && noteM.isrest && noteL.isrest) {\n // Shift upper voice rest up\n shiftRestVertical(noteU, noteM, 1);\n // Shift lower voice rest down\n shiftRestVertical(noteL, noteM, -1);\n // format complete\n state.right_shift += xShift;\n return true;\n }\n // Test if any other rests can be repositioned\n if (noteM.isrest && noteU.isrest && noteM.minLine <= noteL.maxLine) {\n // Shift middle voice rest up\n shiftRestVertical(noteM, noteL, 1);\n }\n if (noteM.isrest && noteL.isrest && noteU.minLine <= noteM.maxLine) {\n // Shift middle voice rest down\n shiftRestVertical(noteM, noteU, -1);\n }\n if (noteU.isrest && noteU.minLine <= noteM.maxLine) {\n // shift upper voice rest up;\n shiftRestVertical(noteU, noteM, 1);\n }\n if (noteL.isrest && noteM.minLine <= noteL.maxLine) {\n // shift lower voice rest down\n shiftRestVertical(noteL, noteM, -1);\n }\n // If middle voice intersects upper or lower voice\n if (noteU.minLine <= noteM.maxLine + 0.5 || noteM.minLine <= noteL.maxLine) {\n // shift middle note right\n xShift = voiceXShift + 2;\n noteM.note.setXShift(xShift);\n if (noteL.note.hasBeam() === false) {\n noteL.stemDirection = -1;\n noteL.note.setStemDirection(-1);\n }\n if (noteU.minLine <= noteL.maxLine && noteU.note.hasBeam() === false) {\n noteU.stemDirection = 1;\n noteU.note.setStemDirection(1);\n }\n }\n state.right_shift += xShift;\n return true;\n }\n static postFormat(notes) {\n if (!notes)\n return false;\n notes.forEach((note) => note.postFormat());\n return true;\n }\n reset() {\n super.reset();\n // Save prior noteHead styles & reapply them after making new noteheads.\n const noteHeadStyles = this._noteHeads.map((noteHead) => noteHead.getStyle());\n this.buildNoteHeads();\n this._noteHeads.forEach((noteHead, index) => {\n const noteHeadStyle = noteHeadStyles[index];\n if (noteHeadStyle)\n noteHead.setStyle(noteHeadStyle);\n });\n const stave = this.stave;\n if (stave) {\n this._noteHeads.forEach((head) => head.setStave(stave));\n }\n this.calcNoteDisplacements();\n return this;\n }\n setBeam(beam) {\n this.beam = beam;\n this.calcNoteDisplacements();\n // Update stem extension is a beam is assigned.\n if (this.stem) {\n this.stem.setExtension(this.getStemExtension());\n }\n return this;\n }\n // Builds a `Stem` for the note\n buildStem() {\n this.setStem(new Stem({ hide: !!this.isRest() }));\n return this;\n }\n // Builds a `NoteHead` for each key in the note\n buildNoteHeads() {\n this._noteHeads = [];\n const stemDirection = this.getStemDirection();\n const keys = this.getKeys();\n let lastLine = undefined;\n let lineDiff = undefined;\n let displaced = false;\n // Draw notes from bottom to top.\n // For down-stem notes, we draw from top to bottom.\n let start;\n let end;\n let step;\n if (stemDirection === Stem.UP) {\n start = 0;\n end = keys.length;\n step = 1;\n }\n else {\n start = keys.length - 1;\n end = -1;\n step = -1;\n }\n for (let i = start; i !== end; i += step) {\n const noteProps = this.keyProps[i];\n const line = noteProps.line;\n // Keep track of last line with a note head, so that consecutive heads\n // are correctly displaced.\n if (lastLine === undefined) {\n lastLine = line;\n }\n else {\n lineDiff = Math.abs(lastLine - line);\n if (lineDiff === 0 || lineDiff === 0.5) {\n displaced = !displaced;\n }\n else {\n displaced = false;\n this.use_default_head_x = true;\n }\n }\n lastLine = line;\n const notehead = new NoteHead({\n duration: this.duration,\n note_type: this.noteType,\n displaced,\n stem_direction: stemDirection,\n custom_glyph_code: noteProps.code,\n glyph_font_scale: this.render_options.glyph_font_scale,\n x_shift: noteProps.shift_right,\n stem_up_x_offset: noteProps.stem_up_x_offset,\n stem_down_x_offset: noteProps.stem_down_x_offset,\n line: noteProps.line,\n });\n this._noteHeads[i] = notehead;\n }\n }\n // Automatically sets the stem direction based on the keys in the note\n autoStem() {\n this.setStemDirection(this.calculateOptimalStemDirection());\n }\n calculateOptimalStemDirection() {\n // Figure out optimal stem direction based on given notes\n this.minLine = this.keyProps[0].line;\n this.maxLine = this.keyProps[this.keyProps.length - 1].line;\n const MIDDLE_LINE = 3;\n const decider = (this.minLine + this.maxLine) / 2;\n const stemDirection = decider < MIDDLE_LINE ? Stem.UP : Stem.DOWN;\n return stemDirection;\n }\n // Calculates and stores the properties for each key in the note\n calculateKeyProps() {\n let lastLine;\n for (let i = 0; i < this.keys.length; ++i) {\n const key = this.keys[i];\n // All rests use the same position on the line.\n // if (this.glyph.rest) key = this.glyph.position;\n if (this.glyph.rest)\n this.glyph.position = key;\n const options = { octave_shift: this.octave_shift || 0 };\n const props = Tables.keyProperties(key, this.clef, options);\n if (!props) {\n throw new RuntimeError('BadArguments', `Invalid key for note properties: ${key}`);\n }\n // Override line placement for default rests\n if (props.key === 'R') {\n if (this.duration === '1' || this.duration === 'w') {\n props.line = 4;\n }\n else {\n props.line = 3;\n }\n }\n // Calculate displacement of this note\n const line = props.line;\n if (lastLine == undefined) {\n lastLine = line;\n }\n else {\n if (Math.abs(lastLine - line) === 0.5) {\n this.displaced = true;\n props.displaced = true;\n // Have to mark the previous note as\n // displaced as well, for modifier placement\n if (this.keyProps.length > 0) {\n this.keyProps[i - 1].displaced = true;\n }\n }\n }\n lastLine = line;\n this.keyProps.push(props);\n }\n // Sort the notes from lowest line to highest line\n lastLine = undefined;\n this.keyProps.forEach((key) => {\n if (lastLine && key.line < lastLine) {\n warn('Unsorted keys in note will be sorted. ' + 'See https://github.com/0xfe/vexflow/issues/104 for details.');\n }\n lastLine = key.line;\n });\n this.keyProps.sort((a, b) => a.line - b.line);\n }\n // Get the `BoundingBox` for the entire note\n getBoundingBox() {\n var _a, _b;\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call getBoundingBox on an unformatted note.\");\n }\n const { width: w, modLeftPx, leftDisplacedHeadPx } = this.getMetrics();\n const x = this.getAbsoluteX() - modLeftPx - leftDisplacedHeadPx;\n let minY = 0;\n let maxY = 0;\n const halfLineSpacing = ((_b = (_a = this.getStave()) === null || _a === void 0 ? void 0 : _a.getSpacingBetweenLines()) !== null && _b !== void 0 ? _b : 0) / 2;\n const lineSpacing = halfLineSpacing * 2;\n if (this.isRest()) {\n const y = this.ys[0];\n const frac = Tables.durationToFraction(this.duration);\n if (frac.equals(1) || frac.equals(2)) {\n minY = y - halfLineSpacing;\n maxY = y + halfLineSpacing;\n }\n else {\n minY = y - this.glyph.line_above * lineSpacing;\n maxY = y + this.glyph.line_below * lineSpacing;\n }\n }\n else if (this.glyph.stem) {\n const ys = this.getStemExtents();\n ys.baseY += halfLineSpacing * this.getStemDirection();\n minY = Math.min(ys.topY, ys.baseY);\n maxY = Math.max(ys.topY, ys.baseY);\n }\n else {\n minY = 0;\n maxY = 0;\n for (let i = 0; i < this.ys.length; ++i) {\n const yy = this.ys[i];\n if (i === 0) {\n minY = yy;\n maxY = yy;\n }\n else {\n minY = Math.min(yy, minY);\n maxY = Math.max(yy, maxY);\n }\n }\n minY -= halfLineSpacing;\n maxY += halfLineSpacing;\n }\n return new BoundingBox(x, minY, w, maxY - minY);\n }\n // Gets the line number of the bottom note in the chord.\n // If `isTopNote` is `true` then get the top note's line number instead\n getLineNumber(isTopNote) {\n if (!this.keyProps.length) {\n throw new RuntimeError('NoKeyProps', \"Can't get bottom note line, because note is not initialized properly.\");\n }\n let resultLine = this.keyProps[0].line;\n // No precondition assumed for sortedness of keyProps array\n for (let i = 0; i < this.keyProps.length; i++) {\n const thisLine = this.keyProps[i].line;\n if (isTopNote) {\n if (thisLine > resultLine)\n resultLine = thisLine;\n }\n else {\n if (thisLine < resultLine)\n resultLine = thisLine;\n }\n }\n return resultLine;\n }\n /**\n * @returns true if this note is a type of rest. Rests don't have pitches, but take up space in the score.\n */\n isRest() {\n return this.glyph.rest;\n }\n // Determine if the current note is a chord\n isChord() {\n return !this.isRest() && this.keys.length > 1;\n }\n // Determine if the `StaveNote` has a stem\n hasStem() {\n return this.glyph.stem;\n }\n hasFlag() {\n return super.hasFlag() && !this.isRest();\n }\n getStemX() {\n if (this.noteType === 'r') {\n return this.getCenterGlyphX();\n }\n else {\n // We adjust the origin of the stem because we want the stem left-aligned\n // with the notehead if stemmed-down, and right-aligned if stemmed-up\n return super.getStemX() + (this.stem_direction ? Stem.WIDTH / (2 * -this.stem_direction) : 0);\n }\n }\n // Get the `y` coordinate for text placed on the top/bottom of a\n // note at a desired `text_line`\n getYForTopText(textLine) {\n const extents = this.getStemExtents();\n return Math.min(this.checkStave().getYForTopText(textLine), extents.topY - this.render_options.annotation_spacing * (textLine + 1));\n }\n getYForBottomText(textLine) {\n const extents = this.getStemExtents();\n return Math.max(this.checkStave().getYForTopText(textLine), extents.baseY + this.render_options.annotation_spacing * textLine);\n }\n // Sets the current note to the provided `stave`. This applies\n // `y` values to the `NoteHeads`.\n setStave(stave) {\n super.setStave(stave);\n const ys = this._noteHeads.map((notehead) => {\n notehead.setStave(stave);\n return notehead.getY();\n });\n this.setYs(ys);\n if (this.stem) {\n const { y_top, y_bottom } = this.getNoteHeadBounds();\n this.stem.setYBounds(y_top, y_bottom);\n }\n return this;\n }\n // Check if note is shifted to the right\n isDisplaced() {\n return this.displaced;\n }\n // Sets whether shift note to the right. `displaced` is a `boolean`\n setNoteDisplaced(displaced) {\n this.displaced = displaced;\n return this;\n }\n // Get the starting `x` coordinate for a `StaveTie`\n getTieRightX() {\n let tieStartX = this.getAbsoluteX();\n tieStartX += this.getGlyphWidth() + this.x_shift + this.rightDisplacedHeadPx;\n if (this.modifierContext)\n tieStartX += this.modifierContext.getRightShift();\n return tieStartX;\n }\n // Get the ending `x` coordinate for a `StaveTie`\n getTieLeftX() {\n let tieEndX = this.getAbsoluteX();\n tieEndX += this.x_shift - this.leftDisplacedHeadPx;\n return tieEndX;\n }\n // Get the stave line on which to place a rest\n getLineForRest() {\n let restLine = this.keyProps[0].line;\n if (this.keyProps.length > 1) {\n const lastLine = this.keyProps[this.keyProps.length - 1].line;\n const top = Math.max(restLine, lastLine);\n const bot = Math.min(restLine, lastLine);\n restLine = midLine(top, bot);\n }\n return restLine;\n }\n // Get the default `x` and `y` coordinates for the provided `position`\n // and key `index`\n getModifierStartXY(position, index, options = {}) {\n var _a, _b;\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call GetModifierStartXY on an unformatted note\");\n }\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', 'No Y-Values calculated for this note.');\n }\n const { ABOVE, BELOW, LEFT, RIGHT } = Modifier.Position;\n let x = 0;\n if (position === LEFT) {\n // FIXME: Left modifier padding, move to font file\n x = -1 * 2;\n }\n else if (position === RIGHT) {\n // FIXME: Right modifier padding, move to font file\n x = this.getGlyphWidth() + this.x_shift + 2;\n if (this.stem_direction === Stem.UP &&\n this.hasFlag() &&\n (options.forceFlagRight || isInnerNoteIndex(this, index))) {\n x += (_b = (_a = this === null || this === void 0 ? void 0 : this.flag) === null || _a === void 0 ? void 0 : _a.getMetrics().width) !== null && _b !== void 0 ? _b : 0;\n }\n }\n else if (position === BELOW || position === ABOVE) {\n x = this.getGlyphWidth() / 2;\n }\n return {\n x: this.getAbsoluteX() + x,\n y: this.ys[index],\n };\n }\n // Sets the style of the complete StaveNote, including all keys\n // and the stem.\n setStyle(style) {\n var _a;\n super.setStyle(style);\n this._noteHeads.forEach((notehead) => notehead.setStyle(style));\n (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setStyle(style);\n return this;\n }\n setStemStyle(style) {\n const stem = this.getStem();\n stem === null || stem === void 0 ? void 0 : stem.setStyle(style);\n return this;\n }\n getStemStyle() {\n var _a;\n return (_a = this.stem) === null || _a === void 0 ? void 0 : _a.getStyle();\n }\n setLedgerLineStyle(style) {\n this.ledgerLineStyle = style;\n }\n getLedgerLineStyle() {\n return this.ledgerLineStyle;\n }\n setFlagStyle(style) {\n this.flagStyle = style;\n }\n getFlagStyle() {\n return this.flagStyle;\n }\n // Sets the notehead at `index` to the provided coloring `style`.\n //\n // `style` is an `object` with the following properties: `shadowColor`,\n // `shadowBlur`, `fillStyle`, `strokeStyle`\n setKeyStyle(index, style) {\n this._noteHeads[index].setStyle(style);\n return this;\n }\n setKeyLine(index, line) {\n this.keyProps[index].line = line;\n this.reset();\n return this;\n }\n getKeyLine(index) {\n return this.keyProps[index].line;\n }\n // Get the width of the note if it is displaced. Used for `Voice`\n // formatting\n getVoiceShiftWidth() {\n // TODO: may need to accomodate for dot here.\n return this.getGlyphWidth() * (this.displaced ? 2 : 1);\n }\n // Calculates and sets the extra pixels to the left or right\n // if the note is displaced.\n calcNoteDisplacements() {\n this.setLeftDisplacedHeadPx(this.displaced && this.stem_direction === Stem.DOWN ? this.getGlyphWidth() : 0);\n // For upstems with flags, the extra space is unnecessary, since it's taken\n // up by the flag.\n this.setRightDisplacedHeadPx(!this.hasFlag() && this.displaced && this.stem_direction === Stem.UP ? this.getGlyphWidth() : 0);\n }\n // Pre-render formatting\n preFormat() {\n if (this.preFormatted)\n return;\n let noteHeadPadding = 0;\n if (this.modifierContext) {\n this.modifierContext.preFormat();\n // If there are no modifiers on this note, make sure there is adequate padding\n // between the notes.\n if (this.modifierContext.getWidth() === 0) {\n noteHeadPadding = StaveNote.minNoteheadPadding;\n }\n }\n let width = this.getGlyphWidth() + this.leftDisplacedHeadPx + this.rightDisplacedHeadPx + noteHeadPadding;\n // For upward flagged notes, the width of the flag needs to be added\n if (this.shouldDrawFlag() && this.stem_direction === Stem.UP) {\n width += this.getGlyphWidth();\n // TODO: Add flag width as a separate metric\n }\n this.setWidth(width);\n this.preFormatted = true;\n }\n /**\n * @typedef {Object} noteHeadBounds\n * @property {number} y_top the highest notehead bound\n * @property {number} y_bottom the lowest notehead bound\n * @property {number|Null} displaced_x the starting x for displaced noteheads\n * @property {number|Null} non_displaced_x the starting x for non-displaced noteheads\n * @property {number} highest_line the highest notehead line in traditional music line\n * numbering (bottom line = 1, top line = 5)\n * @property {number} lowest_line the lowest notehead line\n * @property {number|false} highest_displaced_line the highest staff line number\n * for a displaced notehead\n * @property {number|false} lowest_displaced_line\n * @property {number} highest_non_displaced_line\n * @property {number} lowest_non_displaced_line\n */\n /**\n * Get the staff line and y value for the highest & lowest noteheads\n * @returns {noteHeadBounds}\n */\n getNoteHeadBounds() {\n // Top and bottom Y values for stem.\n let yTop = +Infinity;\n let yBottom = -Infinity;\n let nonDisplacedX;\n let displacedX;\n let highestLine = this.checkStave().getNumLines();\n let lowestLine = 1;\n let highestDisplacedLine;\n let lowestDisplacedLine;\n let highestNonDisplacedLine = highestLine;\n let lowestNonDisplacedLine = lowestLine;\n this._noteHeads.forEach((notehead) => {\n const line = notehead.getLine();\n const y = notehead.getY();\n yTop = Math.min(y, yTop);\n yBottom = Math.max(y, yBottom);\n if (displacedX === undefined && notehead.isDisplaced()) {\n displacedX = notehead.getAbsoluteX();\n }\n if (nonDisplacedX === undefined && !notehead.isDisplaced()) {\n nonDisplacedX = notehead.getAbsoluteX();\n }\n highestLine = Math.max(line, highestLine);\n lowestLine = Math.min(line, lowestLine);\n if (notehead.isDisplaced()) {\n highestDisplacedLine = highestDisplacedLine === undefined ? line : Math.max(line, highestDisplacedLine);\n lowestDisplacedLine = lowestDisplacedLine === undefined ? line : Math.min(line, lowestDisplacedLine);\n }\n else {\n highestNonDisplacedLine = Math.max(line, highestNonDisplacedLine);\n lowestNonDisplacedLine = Math.min(line, lowestNonDisplacedLine);\n }\n }, this);\n return {\n y_top: yTop,\n y_bottom: yBottom,\n displaced_x: displacedX,\n non_displaced_x: nonDisplacedX,\n highest_line: highestLine,\n lowest_line: lowestLine,\n highest_displaced_line: highestDisplacedLine,\n lowest_displaced_line: lowestDisplacedLine,\n highest_non_displaced_line: highestNonDisplacedLine,\n lowest_non_displaced_line: lowestNonDisplacedLine,\n };\n }\n // Get the starting `x` coordinate for the noteheads\n getNoteHeadBeginX() {\n return this.getAbsoluteX() + this.x_shift;\n }\n // Get the ending `x` coordinate for the noteheads\n getNoteHeadEndX() {\n const xBegin = this.getNoteHeadBeginX();\n return xBegin + this.getGlyphWidth();\n }\n get noteHeads() {\n return this._noteHeads.slice();\n }\n /** @deprecated use StaveNote.noteHeads instead. */\n get note_heads() {\n showDeprecationWarningForNoteHeads();\n return this.noteHeads;\n }\n // Draw the ledger lines between the stave and the highest/lowest keys\n drawLedgerLines() {\n const stave = this.checkStave();\n const { glyph, render_options: { stroke_px }, } = this;\n const ctx = this.checkContext();\n const width = glyph.getWidth() + stroke_px * 2;\n const doubleWidth = 2 * (glyph.getWidth() + stroke_px) - Stem.WIDTH / 2;\n if (this.isRest())\n return;\n if (!ctx) {\n throw new RuntimeError('NoCanvasContext', \"Can't draw without a canvas context.\");\n }\n const { highest_line, lowest_line, highest_displaced_line, highest_non_displaced_line, lowest_displaced_line, lowest_non_displaced_line, displaced_x, non_displaced_x, } = this.getNoteHeadBounds();\n // Early out if there are no ledger lines to draw.\n if (highest_line < 6 && lowest_line > 0)\n return;\n const min_x = Math.min(displaced_x !== null && displaced_x !== void 0 ? displaced_x : 0, non_displaced_x !== null && non_displaced_x !== void 0 ? non_displaced_x : 0);\n const drawLedgerLine = (y, normal, displaced) => {\n let x;\n if (displaced && normal)\n x = min_x - stroke_px;\n else if (normal)\n x = (non_displaced_x !== null && non_displaced_x !== void 0 ? non_displaced_x : 0) - stroke_px;\n else\n x = (displaced_x !== null && displaced_x !== void 0 ? displaced_x : 0) - stroke_px;\n const ledgerWidth = normal && displaced ? doubleWidth : width;\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(x + ledgerWidth, y);\n ctx.stroke();\n };\n const style = Object.assign(Object.assign({}, stave.getDefaultLedgerLineStyle()), this.getLedgerLineStyle());\n this.applyStyle(ctx, style);\n // Draw ledger lines below the staff:\n for (let line = 6; line <= highest_line; ++line) {\n const normal = non_displaced_x !== undefined && line <= highest_non_displaced_line;\n const displaced = highest_displaced_line !== undefined && line <= highest_displaced_line;\n drawLedgerLine(stave.getYForNote(line), normal, displaced);\n }\n // Draw ledger lines above the staff:\n for (let line = 0; line >= lowest_line; --line) {\n const normal = non_displaced_x !== undefined && line >= lowest_non_displaced_line;\n const displaced = lowest_displaced_line !== undefined && line >= lowest_displaced_line;\n drawLedgerLine(stave.getYForNote(line), normal, displaced);\n }\n this.restoreStyle(ctx, style);\n }\n // Draw all key modifiers\n drawModifiers() {\n const ctx = this.checkContext();\n ctx.openGroup('modifiers');\n for (let i = 0; i < this.modifiers.length; i++) {\n const modifier = this.modifiers[i];\n const index = modifier.checkIndex();\n const notehead = this._noteHeads[index];\n const noteheadStyle = notehead.getStyle();\n notehead.applyStyle(ctx, noteheadStyle);\n modifier.setContext(ctx);\n modifier.drawWithStyle();\n notehead.restoreStyle(ctx, noteheadStyle);\n }\n ctx.closeGroup();\n }\n shouldDrawFlag() {\n const hasStem = this.stem !== undefined;\n const hasFlag = this.glyph.flag; // specified in tables.js\n const hasNoBeam = this.beam === undefined;\n return hasStem && hasFlag && hasNoBeam;\n }\n // Draw the flag for the note\n drawFlag() {\n var _a;\n const ctx = this.checkContext();\n if (!ctx) {\n throw new RuntimeError('NoCanvasContext', \"Can't draw without a canvas context.\");\n }\n if (this.shouldDrawFlag()) {\n const { y_top, y_bottom } = this.getNoteHeadBounds();\n // eslint-disable-next-line\n const noteStemHeight = this.stem.getHeight();\n const flagX = this.getStemX();\n // FIXME: What's with the magic +/- 2\n // ANSWER: a corner of the note stem pokes out beyond the tip of the flag.\n // The extra +/- 2 pushes the flag glyph outward so it covers the stem entirely.\n // Alternatively, we could shorten the stem.\n const extension = this.flag !== undefined ? this.flag.checkMetrics().y_shift : 0;\n const flagY = this.getStemDirection() === Stem.DOWN\n ? // Down stems are below the note head and have flags on the right.\n y_top - noteStemHeight + 2 - extension\n : // Up stems are above the note head and have flags on the right.\n y_bottom - noteStemHeight - 2 - extension;\n // Draw the Flag\n ctx.openGroup('flag', undefined, { pointerBBox: true });\n this.applyStyle(ctx, this.getFlagStyle());\n (_a = this.flag) === null || _a === void 0 ? void 0 : _a.render(ctx, flagX, flagY);\n this.restoreStyle(ctx, this.getFlagStyle());\n ctx.closeGroup();\n }\n }\n // Draw the NoteHeads\n drawNoteHeads() {\n const ctx = this.checkContext();\n this._noteHeads.forEach((notehead) => {\n ctx.openGroup('notehead', undefined, { pointerBBox: true });\n notehead.setContext(ctx).draw();\n ctx.closeGroup();\n });\n }\n drawStem(stemOptions) {\n var _a;\n // GCR TODO: I can't find any context in which this is called with the stemStruct\n // argument in the codebase or tests. Nor can I find a case where super.drawStem\n // is called at all. Perhaps these should be removed?\n const ctx = this.checkContext();\n if (stemOptions) {\n this.setStem(new Stem(stemOptions));\n }\n // If we will render a flag, we shorten the stem so that the tip\n // does not poke through the flag.\n if (this.shouldDrawFlag() && this.stem) {\n this.stem.adjustHeightForFlag();\n }\n ctx.openGroup('stem', undefined, { pointerBBox: true });\n (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setContext(ctx).draw();\n ctx.closeGroup();\n }\n /**\n * Override stemmablenote stem extension to adjust for distance from middle line.\n */\n getStemExtension() {\n const super_stem_extension = super.getStemExtension();\n if (!this.glyph.stem) {\n return super_stem_extension;\n }\n const stem_direction = this.getStemDirection();\n if (stem_direction !== this.calculateOptimalStemDirection()) {\n return super_stem_extension; // no adjustment for manually set stem direction.\n }\n let mid_line_distance;\n const MIDDLE_LINE = 3;\n if (stem_direction === Stem.UP) {\n // Note that the use of maxLine here instead of minLine might\n // seem counterintuitive, but in the case of (say) treble clef\n // chord(F2, E4) stem up, we do not want to extend the stem because\n // of F2, when a normal octave-length stem above E4 is fine.\n //\n // maxLine and minLine are set in calculateOptimalStemDirection() so\n // will be known.\n mid_line_distance = MIDDLE_LINE - this.maxLine;\n }\n else {\n mid_line_distance = this.minLine - MIDDLE_LINE;\n }\n // how many lines more than an octave is the relevant notehead?\n const lines_over_octave_from_mid_line = mid_line_distance - 3.5;\n if (lines_over_octave_from_mid_line <= 0) {\n return super_stem_extension;\n }\n const stave = this.getStave();\n let spacing_between_lines = 10;\n if (stave != undefined) {\n spacing_between_lines = stave.getSpacingBetweenLines();\n }\n return super_stem_extension + lines_over_octave_from_mid_line * spacing_between_lines;\n }\n // Draws all the `StaveNote` parts. This is the main drawing method.\n draw() {\n var _a;\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', \"Can't draw note without Y values.\");\n }\n const ctx = this.checkContext();\n const xBegin = this.getNoteHeadBeginX();\n const shouldRenderStem = this.hasStem() && !this.beam;\n // Format note head x positions\n this._noteHeads.forEach((notehead) => notehead.setX(xBegin));\n // Format stem x positions\n const stemX = this.getStemX();\n (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setNoteHeadXBounds(stemX, stemX);\n L('Rendering ', this.isChord() ? 'chord :' : 'note :', this.keys);\n // Apply the overall style -- may be contradicted by local settings:\n this.applyStyle();\n this.setAttribute('el', ctx.openGroup('stavenote', this.getAttribute('id')));\n this.drawLedgerLines();\n ctx.openGroup('note', undefined, { pointerBBox: true });\n if (shouldRenderStem)\n this.drawStem();\n this.drawNoteHeads();\n this.drawFlag();\n ctx.closeGroup();\n this.drawModifiers();\n ctx.closeGroup();\n this.restoreStyle();\n this.setRendered();\n }\n}\nStaveNote.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Larry Kuhns 2011\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { StaveModifier } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nexport class Repetition extends StaveModifier {\n constructor(type, x, y_shift) {\n super();\n this.symbol_type = type;\n this.x = x;\n this.x_shift = 0;\n this.y_shift = y_shift;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.Repetition;\n }\n setShiftX(x) {\n this.x_shift = x;\n return this;\n }\n setShiftY(y) {\n this.y_shift = y;\n return this;\n }\n draw(stave, x) {\n this.setRendered();\n switch (this.symbol_type) {\n case Repetition.type.CODA_RIGHT:\n this.drawCodaFixed(stave, x + stave.getWidth());\n break;\n case Repetition.type.CODA_LEFT:\n this.drawSymbolText(stave, x, 'Coda', true);\n break;\n case Repetition.type.SEGNO_LEFT:\n this.drawSignoFixed(stave, x);\n break;\n case Repetition.type.SEGNO_RIGHT:\n this.drawSignoFixed(stave, x + stave.getWidth());\n break;\n case Repetition.type.DC:\n this.drawSymbolText(stave, x, 'D.C.', false);\n break;\n case Repetition.type.DC_AL_CODA:\n this.drawSymbolText(stave, x, 'D.C. al', true);\n break;\n case Repetition.type.DC_AL_FINE:\n this.drawSymbolText(stave, x, 'D.C. al Fine', false);\n break;\n case Repetition.type.DS:\n this.drawSymbolText(stave, x, 'D.S.', false);\n break;\n case Repetition.type.DS_AL_CODA:\n this.drawSymbolText(stave, x, 'D.S. al', true);\n break;\n case Repetition.type.DS_AL_FINE:\n this.drawSymbolText(stave, x, 'D.S. al Fine', false);\n break;\n case Repetition.type.FINE:\n this.drawSymbolText(stave, x, 'Fine', false);\n break;\n case Repetition.type.TO_CODA:\n this.drawSymbolText(stave, x, 'To', true);\n break;\n default:\n break;\n }\n return this;\n }\n drawCodaFixed(stave, x) {\n const y = stave.getYForTopText(stave.getNumLines()) + this.y_shift;\n Glyph.renderGlyph(stave.checkContext(), this.x + x + this.x_shift, y + Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY'), 40, 'coda', { category: 'coda' });\n return this;\n }\n drawSignoFixed(stave, x) {\n const y = stave.getYForTopText(stave.getNumLines()) + this.y_shift;\n Glyph.renderGlyph(stave.checkContext(), this.x + x + this.x_shift, y + Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY'), 30, 'segno', { category: 'segno' });\n return this;\n }\n drawSymbolText(stave, x, text, draw_coda) {\n const ctx = stave.checkContext();\n ctx.save();\n ctx.setFont(this.textFont);\n let text_x = 0;\n let symbol_x = 0;\n const modifierWidth = stave.getNoteStartX() - this.x;\n switch (this.symbol_type) {\n // To the left with symbol\n case Repetition.type.CODA_LEFT:\n // Offset Coda text to right of stave beginning\n text_x = this.x + stave.getVerticalBarWidth();\n symbol_x =\n text_x +\n ctx.measureText(text).width +\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol');\n break;\n // To the right without symbol\n case Repetition.type.DC:\n case Repetition.type.DC_AL_FINE:\n case Repetition.type.DS:\n case Repetition.type.DS_AL_FINE:\n case Repetition.type.FINE:\n text_x =\n this.x +\n x +\n this.x_shift +\n stave.getWidth() -\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.spacing') -\n modifierWidth -\n ctx.measureText(text).width;\n break;\n // To the right with symbol\n default:\n text_x =\n this.x +\n x +\n this.x_shift +\n stave.getWidth() -\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.spacing') -\n modifierWidth -\n ctx.measureText(text).width -\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol');\n symbol_x =\n text_x +\n ctx.measureText(text).width +\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol');\n break;\n }\n const y = stave.getYForTopText(stave.getNumLines()) +\n this.y_shift +\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY');\n if (draw_coda) {\n Glyph.renderGlyph(ctx, symbol_x, y, 40, 'coda', { category: 'coda' });\n }\n ctx.fillText(text, text_x, y + 5);\n ctx.restore();\n return this;\n }\n}\nRepetition.TEXT_FONT = {\n family: Font.SERIF,\n size: 12,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\nRepetition.type = {\n NONE: 1,\n CODA_LEFT: 2,\n CODA_RIGHT: 3,\n SEGNO_LEFT: 4,\n SEGNO_RIGHT: 5,\n DC: 6,\n DC_AL_CODA: 7,\n DC_AL_FINE: 8,\n DS: 9,\n DS_AL_CODA: 10,\n DS_AL_FINE: 11,\n FINE: 12,\n TO_CODA: 13, // To Coda at end of stave\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Larry Kuhns 2011\nimport { Font, FontStyle, FontWeight } from './font';\nimport { StaveModifier } from './stavemodifier';\nimport { Category } from './typeguard';\nexport class StaveSection extends StaveModifier {\n constructor(section, x, shift_y) {\n super();\n this.setWidth(16);\n this.section = section;\n this.x = x;\n this.shift_x = 0;\n this.shift_y = shift_y;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StaveSection;\n }\n setStaveSection(section) {\n this.section = section;\n return this;\n }\n setShiftX(x) {\n this.shift_x = x;\n return this;\n }\n setShiftY(y) {\n this.shift_y = y;\n return this;\n }\n draw(stave, shift_x) {\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.save();\n ctx.setLineWidth(2);\n ctx.setFont(this.textFont);\n const paddingX = 2;\n const paddingY = 2;\n const rectWidth = 2;\n const textMeasurements = ctx.measureText(this.section);\n const textWidth = textMeasurements.width;\n const textHeight = textMeasurements.height;\n const width = textWidth + 2 * paddingX; // add left & right padding\n const height = textHeight + 2 * paddingY; // add top & bottom padding\n // Seems to be a good default y\n const y = stave.getYForTopText(2) + this.shift_y;\n const x = this.x + shift_x;\n ctx.beginPath();\n ctx.setLineWidth(rectWidth);\n ctx.rect(x, y + textMeasurements.y - paddingY, width, height);\n ctx.stroke();\n ctx.fillText(this.section, x + paddingX, y);\n ctx.restore();\n return this;\n }\n}\nStaveSection.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 10,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Radosaw Eichler 2012\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nexport class StaveTempo extends StaveModifier {\n constructor(tempo, x, shift_y) {\n super();\n /** Font size for note. */\n this.render_options = { glyph_font_scale: 30 };\n this.tempo = tempo;\n this.position = StaveModifierPosition.ABOVE;\n this.x = x;\n this.shift_x = 10;\n this.shift_y = shift_y;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StaveTempo;\n }\n setTempo(tempo) {\n this.tempo = tempo;\n return this;\n }\n setShiftX(x) {\n this.shift_x = x;\n return this;\n }\n setShiftY(y) {\n this.shift_y = y;\n return this;\n }\n draw(stave, shift_x) {\n const ctx = stave.checkContext();\n this.setRendered();\n const options = this.render_options;\n // FIXME: What does the '38' mean? Why 38? Is that supposed to\n // be the default font size for standard notation?\n const scale = options.glyph_font_scale / 38;\n const name = this.tempo.name;\n const duration = this.tempo.duration;\n const dots = this.tempo.dots || 0;\n const bpm = this.tempo.bpm;\n let x = this.x + this.shift_x + shift_x;\n const y = stave.getYForTopText(1) + this.shift_y;\n ctx.save();\n if (name) {\n ctx.setFont(this.textFont);\n ctx.fillText(name, x, y);\n x += ctx.measureText(name).width;\n }\n if (duration && bpm) {\n // Override the weight and style.\n ctx.setFont(Object.assign(Object.assign({}, this.textFont), { weight: 'normal', style: 'normal' }));\n if (name) {\n x += ctx.measureText(' ').width;\n ctx.fillText('(', x, y);\n x += ctx.measureText('(').width;\n }\n const code = Tables.getGlyphProps(duration);\n x += 3 * scale;\n Glyph.renderGlyph(ctx, x, y, options.glyph_font_scale, code.code_head);\n x += code.getWidth() * scale;\n // Draw stem and flags\n if (code.stem) {\n let stem_height = 30;\n if (code.beam_count)\n stem_height += 3 * (code.beam_count - 1);\n stem_height *= scale;\n const y_top = y - stem_height;\n ctx.fillRect(x - scale, y_top, scale, stem_height);\n if (code.flag) {\n Glyph.renderGlyph(ctx, x, y_top, options.glyph_font_scale, code.code_flag_upstem, {\n category: 'flag.staveTempo',\n });\n if (!dots)\n x += 6 * scale;\n }\n }\n // Draw dot\n for (let i = 0; i < dots; i++) {\n x += 6 * scale;\n ctx.beginPath();\n ctx.arc(x, y + 2 * scale, 2 * scale, 0, Math.PI * 2, false);\n ctx.fill();\n }\n ctx.fillText(' = ' + bpm + (name ? ')' : ''), x + 3 * scale, y);\n }\n ctx.restore();\n return this;\n }\n}\nStaveTempo.TEXT_FONT = {\n family: Font.SERIF,\n size: 14,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2014\nimport { Font, FontStyle, FontWeight } from './font';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Justification, TextNote } from './textnote';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StaveText extends StaveModifier {\n constructor(text, position, options = {}) {\n super();\n this.setWidth(16);\n this.text = text;\n this.position = position;\n this.options = Object.assign({ shift_x: 0, shift_y: 0, justification: TextNote.Justification.CENTER }, options);\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StaveText;\n }\n setStaveText(text) {\n this.text = text;\n return this;\n }\n setShiftX(x) {\n this.shift_x = x;\n return this;\n }\n setShiftY(y) {\n this.shift_y = y;\n return this;\n }\n setText(text) {\n this.text = text;\n return this;\n }\n draw(stave) {\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.save();\n ctx.setLineWidth(2);\n ctx.setFont(this.textFont);\n const text_width = ctx.measureText('' + this.text).width;\n let x;\n let y;\n switch (this.position) {\n case StaveModifierPosition.LEFT:\n case StaveModifierPosition.RIGHT:\n y = (stave.getYForLine(0) + stave.getBottomLineY()) / 2 + this.options.shift_y;\n if (this.position === StaveModifierPosition.LEFT) {\n x = stave.getX() - text_width - 24 + this.options.shift_x;\n }\n else {\n x = stave.getX() + stave.getWidth() + 24 + this.options.shift_x;\n }\n break;\n case StaveModifierPosition.ABOVE:\n case StaveModifierPosition.BELOW:\n x = stave.getX() + this.options.shift_x;\n if (this.options.justification === Justification.CENTER) {\n x += stave.getWidth() / 2 - text_width / 2;\n }\n else if (this.options.justification === Justification.RIGHT) {\n x += stave.getWidth() - text_width;\n }\n if (this.position === StaveModifierPosition.ABOVE) {\n y = stave.getYForTopText(2) + this.options.shift_y;\n }\n else {\n y = stave.getYForBottomText(2) + this.options.shift_y;\n }\n break;\n default:\n throw new RuntimeError('InvalidPosition', 'Value Must be in Modifier.Position.');\n }\n ctx.fillText('' + this.text, x, y + 4);\n ctx.restore();\n return this;\n }\n}\nStaveText.TEXT_FONT = {\n family: Font.SERIF,\n size: 16,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// This class implements varies types of ties between contiguous notes. The\n// ties include: regular ties, hammer ons, pull offs, and slides.\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StaveTie extends Element {\n /**\n * @param notes is a struct that has:\n *\n * {\n * first_note: Note,\n * last_note: Note,\n * first_indices: [n1, n2, n3],\n * last_indices: [n1, n2, n3]\n * }\n *\n * @param text\n */\n constructor(notes, text) {\n super();\n this.setNotes(notes);\n this.text = text;\n this.render_options = {\n cp1: 8,\n cp2: 12,\n text_shift_x: 0,\n first_x_shift: 0,\n last_x_shift: 0,\n y_shift: 7,\n tie_spacing: 0,\n };\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StaveTie;\n }\n setDirection(direction) {\n this.direction = direction;\n return this;\n }\n /**\n * Set the notes to attach this tie to.\n *\n * @param {!Object} notes The notes to tie up.\n */\n setNotes(notes) {\n if (!notes.first_note && !notes.last_note) {\n throw new RuntimeError('BadArguments', 'Tie needs to have either first_note or last_note set.');\n }\n if (!notes.first_indices) {\n notes.first_indices = [0];\n }\n if (!notes.last_indices) {\n notes.last_indices = [0];\n }\n if (notes.first_indices.length !== notes.last_indices.length) {\n throw new RuntimeError('BadArguments', 'Tied notes must have same number of indices.');\n }\n this.notes = notes;\n return this;\n }\n /**\n * @return {boolean} Returns true if this is a partial bar.\n */\n isPartial() {\n return !this.notes.first_note || !this.notes.last_note;\n }\n renderTie(params) {\n if (params.first_ys.length === 0 || params.last_ys.length === 0) {\n throw new RuntimeError('BadArguments', 'No Y-values to render');\n }\n const ctx = this.checkContext();\n let cp1 = this.render_options.cp1;\n let cp2 = this.render_options.cp2;\n if (Math.abs(params.last_x_px - params.first_x_px) < 10) {\n cp1 = 2;\n cp2 = 8;\n }\n const first_x_shift = this.render_options.first_x_shift;\n const last_x_shift = this.render_options.last_x_shift;\n const y_shift = this.render_options.y_shift * params.direction;\n // setNotes(...) verified that first_indices and last_indices are not undefined.\n // As a result, we use the ! non-null assertion operator here.\n // eslint-disable-next-line\n const first_indices = this.notes.first_indices;\n // eslint-disable-next-line\n const last_indices = this.notes.last_indices;\n for (let i = 0; i < first_indices.length; ++i) {\n const cp_x = (params.last_x_px + last_x_shift + (params.first_x_px + first_x_shift)) / 2;\n const first_y_px = params.first_ys[first_indices[i]] + y_shift;\n const last_y_px = params.last_ys[last_indices[i]] + y_shift;\n if (isNaN(first_y_px) || isNaN(last_y_px)) {\n throw new RuntimeError('BadArguments', 'Bad indices for tie rendering.');\n }\n const top_cp_y = (first_y_px + last_y_px) / 2 + cp1 * params.direction;\n const bottom_cp_y = (first_y_px + last_y_px) / 2 + cp2 * params.direction;\n ctx.beginPath();\n ctx.moveTo(params.first_x_px + first_x_shift, first_y_px);\n ctx.quadraticCurveTo(cp_x, top_cp_y, params.last_x_px + last_x_shift, last_y_px);\n ctx.quadraticCurveTo(cp_x, bottom_cp_y, params.first_x_px + first_x_shift, first_y_px);\n ctx.closePath();\n ctx.fill();\n }\n }\n renderText(first_x_px, last_x_px) {\n var _a, _b, _c;\n if (!this.text)\n return;\n const ctx = this.checkContext();\n let center_x = (first_x_px + last_x_px) / 2;\n center_x -= ctx.measureText(this.text).width / 2;\n const stave = (_b = (_a = this.notes.first_note) === null || _a === void 0 ? void 0 : _a.checkStave()) !== null && _b !== void 0 ? _b : (_c = this.notes.last_note) === null || _c === void 0 ? void 0 : _c.checkStave();\n if (stave) {\n ctx.save();\n ctx.setFont(this.textFont);\n ctx.fillText(this.text, center_x + this.render_options.text_shift_x, stave.getYForTopText() - 1);\n ctx.restore();\n }\n }\n draw() {\n this.checkContext();\n this.setRendered();\n const first_note = this.notes.first_note;\n const last_note = this.notes.last_note;\n // Provide some default values so the compiler doesn't complain.\n let first_x_px = 0;\n let last_x_px = 0;\n let first_ys = [0];\n let last_ys = [0];\n let stem_direction = 0;\n if (first_note) {\n first_x_px = first_note.getTieRightX() + this.render_options.tie_spacing;\n stem_direction = first_note.getStemDirection();\n first_ys = first_note.getYs();\n }\n else if (last_note) {\n const stave = last_note.checkStave();\n first_x_px = stave.getTieStartX();\n first_ys = last_note.getYs();\n this.notes.first_indices = this.notes.last_indices;\n }\n if (last_note) {\n last_x_px = last_note.getTieLeftX() + this.render_options.tie_spacing;\n stem_direction = last_note.getStemDirection();\n last_ys = last_note.getYs();\n }\n else if (first_note) {\n const stave = first_note.checkStave();\n last_x_px = stave.getTieEndX();\n last_ys = first_note.getYs();\n this.notes.last_indices = this.notes.first_indices;\n }\n if (this.direction) {\n stem_direction = this.direction;\n }\n this.renderTie({\n first_x_px,\n last_x_px,\n first_ys,\n last_ys,\n direction: stem_direction,\n });\n this.renderText(first_x_px, last_x_px);\n return true;\n }\n}\n/** Default text font. */\nStaveTie.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Larry Kuhns 2011\nimport { Font, FontStyle, FontWeight } from './font';\nimport { StaveModifier } from './stavemodifier';\nimport { Category } from './typeguard';\nexport var VoltaType;\n(function (VoltaType) {\n VoltaType[VoltaType[\"NONE\"] = 1] = \"NONE\";\n VoltaType[VoltaType[\"BEGIN\"] = 2] = \"BEGIN\";\n VoltaType[VoltaType[\"MID\"] = 3] = \"MID\";\n VoltaType[VoltaType[\"END\"] = 4] = \"END\";\n VoltaType[VoltaType[\"BEGIN_END\"] = 5] = \"BEGIN_END\";\n})(VoltaType || (VoltaType = {}));\nexport class Volta extends StaveModifier {\n constructor(type, number, x, y_shift) {\n super();\n this.volta = type;\n this.x = x;\n this.y_shift = y_shift;\n this.number = number;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.Volta;\n }\n static get type() {\n return VoltaType;\n }\n setShiftY(y) {\n this.y_shift = y;\n return this;\n }\n draw(stave, x) {\n const ctx = stave.checkContext();\n this.setRendered();\n let width = stave.getWidth() - x; // don't include x (offset) for width\n const top_y = stave.getYForTopText(stave.getNumLines()) + this.y_shift;\n const vert_height = 1.5 * stave.getSpacingBetweenLines();\n switch (this.volta) {\n case VoltaType.BEGIN:\n ctx.fillRect(this.x + x, top_y, 1, vert_height);\n break;\n case VoltaType.END:\n width -= 5;\n ctx.fillRect(this.x + x + width, top_y, 1, vert_height);\n break;\n case VoltaType.BEGIN_END:\n width -= 3;\n ctx.fillRect(this.x + x, top_y, 1, vert_height);\n ctx.fillRect(this.x + x + width, top_y, 1, vert_height);\n break;\n default:\n break;\n }\n // If the beginning of a volta, draw measure number\n if (this.volta === VoltaType.BEGIN || this.volta === VoltaType.BEGIN_END) {\n ctx.save();\n ctx.setFont(this.textFont);\n ctx.fillText(this.number, this.x + x + 5, top_y + 15);\n ctx.restore();\n }\n ctx.fillRect(this.x + x, top_y, width, 1);\n return this;\n }\n}\nVolta.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 9,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This file implements the `Stem` object. Generally this object is handled\n// by its parent `StemmableNote`.\nimport { Element } from './element';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Stem.DEBUG)\n log('Vex.Flow.Stem', args);\n}\nexport class Stem extends Element {\n constructor(options) {\n super();\n this.stem_up_y_offset = 0;\n this.stem_down_y_offset = 0;\n this.stem_up_y_base_offset = 0;\n this.stem_down_y_base_offset = 0;\n // Default notehead x bounds\n this.x_begin = (options === null || options === void 0 ? void 0 : options.x_begin) || 0;\n this.x_end = (options === null || options === void 0 ? void 0 : options.x_end) || 0;\n // Y bounds for top/bottom most notehead\n this.y_top = (options === null || options === void 0 ? void 0 : options.y_top) || 0;\n this.y_bottom = (options === null || options === void 0 ? void 0 : options.y_bottom) || 0;\n // Stem top extension\n this.stem_extension = (options === null || options === void 0 ? void 0 : options.stem_extension) || 0;\n // Direction of the stem\n this.stem_direction = (options === null || options === void 0 ? void 0 : options.stem_direction) || 0;\n // Flag to override all draw calls\n this.hide = (options === null || options === void 0 ? void 0 : options.hide) || false;\n this.isStemlet = (options === null || options === void 0 ? void 0 : options.isStemlet) || false;\n this.stemletHeight = (options === null || options === void 0 ? void 0 : options.stemletHeight) || 0;\n // Use to adjust the rendered height without affecting\n // the results of `.getExtents()`\n this.renderHeightAdjustment = 0;\n this.setOptions(options);\n }\n static get CATEGORY() {\n return Category.Stem;\n }\n // Stem directions\n static get UP() {\n return 1;\n }\n static get DOWN() {\n return -1;\n }\n // Theme\n static get WIDTH() {\n return Tables.STEM_WIDTH;\n }\n static get HEIGHT() {\n return Tables.STEM_HEIGHT;\n }\n setOptions(options) {\n // Changing where the stem meets the head\n this.stem_up_y_offset = (options === null || options === void 0 ? void 0 : options.stem_up_y_offset) || 0;\n this.stem_down_y_offset = (options === null || options === void 0 ? void 0 : options.stem_down_y_offset) || 0;\n this.stem_up_y_base_offset = (options === null || options === void 0 ? void 0 : options.stem_up_y_base_offset) || 0;\n this.stem_down_y_base_offset = (options === null || options === void 0 ? void 0 : options.stem_down_y_base_offset) || 0;\n }\n // Set the x bounds for the default notehead\n setNoteHeadXBounds(x_begin, x_end) {\n this.x_begin = x_begin;\n this.x_end = x_end;\n return this;\n }\n // Set the direction of the stem in relation to the noteheads\n setDirection(direction) {\n this.stem_direction = direction;\n }\n // Set the extension for the stem, generally for flags or beams\n setExtension(ext) {\n this.stem_extension = ext;\n }\n getExtension() {\n return this.stem_extension;\n }\n // The the y bounds for the top and bottom noteheads\n setYBounds(y_top, y_bottom) {\n this.y_top = y_top;\n this.y_bottom = y_bottom;\n }\n // Gets the entire height for the stem\n getHeight() {\n const y_offset = this.stem_direction === Stem.UP ? this.stem_up_y_offset : this.stem_down_y_offset;\n const unsigned_height = this.y_bottom - this.y_top + (Stem.HEIGHT - y_offset + this.stem_extension); // parentheses just for grouping.\n return unsigned_height * this.stem_direction;\n }\n getBoundingBox() {\n throw new RuntimeError('NotImplemented', 'getBoundingBox() not implemented.');\n }\n // Get the y coordinates for the very base of the stem to the top of\n // the extension\n getExtents() {\n const isStemUp = this.stem_direction === Stem.UP;\n const ys = [this.y_top, this.y_bottom];\n const stemHeight = Stem.HEIGHT + this.stem_extension;\n const innerMostNoteheadY = (isStemUp ? Math.min : Math.max)(...ys);\n const outerMostNoteheadY = (isStemUp ? Math.max : Math.min)(...ys);\n const stemTipY = innerMostNoteheadY + stemHeight * -this.stem_direction;\n return { topY: stemTipY, baseY: outerMostNoteheadY };\n }\n setVisibility(isVisible) {\n this.hide = !isVisible;\n return this;\n }\n setStemlet(isStemlet, stemletHeight) {\n this.isStemlet = isStemlet;\n this.stemletHeight = stemletHeight;\n return this;\n }\n adjustHeightForFlag() {\n this.renderHeightAdjustment = Tables.currentMusicFont().lookupMetric('stem.heightAdjustmentForFlag', -3);\n }\n adjustHeightForBeam() {\n this.renderHeightAdjustment = -Stem.WIDTH / 2;\n }\n // Render the stem onto the canvas\n draw() {\n this.setRendered();\n if (this.hide)\n return;\n const ctx = this.checkContext();\n let stem_x;\n let stem_y;\n const stem_direction = this.stem_direction;\n let y_base_offset = 0;\n if (stem_direction === Stem.DOWN) {\n // Down stems are rendered to the left of the head.\n stem_x = this.x_begin;\n stem_y = this.y_top + this.stem_down_y_offset;\n y_base_offset = this.stem_down_y_base_offset;\n }\n else {\n // Up stems are rendered to the right of the head.\n stem_x = this.x_end;\n stem_y = this.y_bottom - this.stem_up_y_offset;\n y_base_offset = this.stem_up_y_base_offset;\n }\n const stemHeight = this.getHeight();\n L('Rendering stem - ', 'Top Y: ', this.y_top, 'Bottom Y: ', this.y_bottom);\n // The offset from the stem's base which is required fo satisfy the stemlet height\n const stemletYOffset = this.isStemlet ? stemHeight - this.stemletHeight * this.stem_direction : 0;\n // Draw the stem\n ctx.save();\n this.applyStyle(ctx);\n ctx.beginPath();\n ctx.setLineWidth(Stem.WIDTH);\n ctx.moveTo(stem_x, stem_y - stemletYOffset + y_base_offset);\n ctx.lineTo(stem_x, stem_y - stemHeight - this.renderHeightAdjustment * stem_direction);\n ctx.stroke();\n this.restoreStyle(ctx);\n ctx.restore();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Stem.DEBUG` to `true`. */\nStem.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// `StemmableNote` is an abstract interface for notes with optional stems.\n// Examples of stemmable notes are `StaveNote` and `TabNote`\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StemmableNote extends Note {\n constructor(noteStruct) {\n super(noteStruct);\n }\n static get CATEGORY() {\n return Category.StemmableNote;\n }\n // Get and set the note's `Stem`\n getStem() {\n return this.stem;\n }\n checkStem() {\n if (!this.stem) {\n throw new RuntimeError('NoStem', 'No stem attached to instance');\n }\n return this.stem;\n }\n setStem(stem) {\n this.stem = stem;\n return this;\n }\n // Builds and sets a new stem\n buildStem() {\n const stem = new Stem();\n this.setStem(stem);\n return this;\n }\n buildFlag(category = 'flag') {\n const { glyph } = this;\n if (this.hasFlag()) {\n const flagCode = this.getStemDirection() === Stem.DOWN ? glyph.code_flag_downstem : glyph.code_flag_upstem;\n this.flag = new Glyph(flagCode, this.render_options.glyph_font_scale, { category });\n }\n }\n // Get the custom glyph associated with the outer note head on the base of the stem.\n getBaseCustomNoteHeadGlyph() {\n if (this.getStemDirection() === Stem.DOWN) {\n return this.customGlyphs[this.customGlyphs.length - 1];\n }\n else {\n return this.customGlyphs[0];\n }\n }\n // Get the full length of stem\n getStemLength() {\n return Stem.HEIGHT + this.getStemExtension();\n }\n // Get the number of beams for this duration\n getBeamCount() {\n const glyph = this.getGlyph();\n if (glyph) {\n return glyph.beam_count;\n }\n else {\n return 0;\n }\n }\n // Get the minimum length of stem\n getStemMinimumLength() {\n const frac = Tables.durationToFraction(this.duration);\n let length = frac.value() <= 1 ? 0 : 20;\n // if note is flagged, cannot shorten beam\n switch (this.duration) {\n case '8':\n if (this.beam == undefined)\n length = 35;\n break;\n case '16':\n length = this.beam == undefined ? 35 : 25;\n break;\n case '32':\n length = this.beam == undefined ? 45 : 35;\n break;\n case '64':\n length = this.beam == undefined ? 50 : 40;\n break;\n case '128':\n length = this.beam == undefined ? 55 : 45;\n break;\n default:\n break;\n }\n return length;\n }\n // Get/set the direction of the stem\n getStemDirection() {\n if (!this.stem_direction)\n throw new RuntimeError('NoStem', 'No stem attached to this note.');\n return this.stem_direction;\n }\n setStemDirection(direction) {\n if (!direction)\n direction = Stem.UP;\n if (direction !== Stem.UP && direction !== Stem.DOWN) {\n throw new RuntimeError('BadArgument', `Invalid stem direction: ${direction}`);\n }\n this.stem_direction = direction;\n // Reset and reformat everything. Flag has to be built before calling getStemExtension.\n this.reset();\n if (this.hasFlag()) {\n this.buildFlag();\n }\n this.beam = undefined;\n if (this.stem) {\n this.stem.setDirection(direction);\n this.stem.setExtension(this.getStemExtension());\n // Lookup the base custom notehead (closest to the base of the stem) to extend or shorten\n // the stem appropriately. If there's no custom note head, lookup the standard notehead.\n const glyph = this.getBaseCustomNoteHeadGlyph() || this.getGlyph();\n // Get the font-specific customizations for the note heads.\n const offsets = Tables.currentMusicFont().lookupMetric(`stem.noteHead.${glyph.code_head}`, {\n offsetYBaseStemUp: 0,\n offsetYTopStemUp: 0,\n offsetYBaseStemDown: 0,\n offsetYTopStemDown: 0,\n });\n // Configure the stem to use these offsets.\n this.stem.setOptions({\n stem_up_y_offset: offsets.offsetYTopStemUp,\n stem_down_y_offset: offsets.offsetYTopStemDown,\n stem_up_y_base_offset: offsets.offsetYBaseStemUp,\n stem_down_y_base_offset: offsets.offsetYBaseStemDown, // glyph.stem_down_y_base_offset,\n });\n }\n if (this.preFormatted) {\n this.preFormat();\n }\n return this;\n }\n // Get the `x` coordinate of the stem\n getStemX() {\n const x_begin = this.getAbsoluteX() + this.x_shift;\n const x_end = this.getAbsoluteX() + this.x_shift + this.getGlyphWidth();\n const stem_x = this.stem_direction === Stem.DOWN ? x_begin : x_end;\n return stem_x;\n }\n // Get the `x` coordinate for the center of the glyph.\n // Used for `TabNote` stems and stemlets over rests\n getCenterGlyphX() {\n return this.getAbsoluteX() + this.x_shift + this.getGlyphWidth() / 2;\n }\n // Get the stem extension for the current duration\n getStemExtension() {\n const glyph = this.getGlyph();\n if (this.stem_extension_override != undefined) {\n return this.stem_extension_override;\n }\n // Use stem_beam_extension with beams\n if (this.beam) {\n return glyph.stem_beam_extension;\n }\n const flagCode = this.getStemDirection() === Stem.DOWN ? this.glyph.code_flag_downstem : this.glyph.code_flag_upstem;\n return Math.abs(Tables.currentMusicFont().lookupMetric(`glyphs.flag.${flagCode}.shiftY`, 0));\n }\n // Set the stem length to a specific. Will override the default length.\n setStemLength(height) {\n this.stem_extension_override = height - Stem.HEIGHT;\n return this;\n }\n // Get the top and bottom `y` values of the stem.\n getStemExtents() {\n if (!this.stem)\n throw new RuntimeError('NoStem', 'No stem attached to this note.');\n return this.stem.getExtents();\n }\n /** Gets the `y` value for the top modifiers at a specific `textLine`. */\n getYForTopText(textLine) {\n const stave = this.checkStave();\n if (this.hasStem()) {\n const extents = this.getStemExtents();\n if (!extents)\n throw new RuntimeError('InvalidState', 'Stem does not have extents.');\n return Math.min(stave.getYForTopText(textLine), extents.topY - this.render_options.annotation_spacing * (textLine + 1));\n }\n else {\n return stave.getYForTopText(textLine);\n }\n }\n /** Gets the `y` value for the bottom modifiers at a specific `textLine`. */\n getYForBottomText(textLine) {\n const stave = this.checkStave();\n if (this.hasStem()) {\n const extents = this.getStemExtents();\n if (!extents)\n throw new RuntimeError('InvalidState', 'Stem does not have extents.');\n return Math.max(stave.getYForTopText(textLine), extents.baseY + this.render_options.annotation_spacing * textLine);\n }\n else {\n return stave.getYForBottomText(textLine);\n }\n }\n hasFlag() {\n return Tables.getGlyphProps(this.duration).flag && !this.beam;\n }\n /** Post formats the note. */\n postFormat() {\n var _a;\n (_a = this.beam) === null || _a === void 0 ? void 0 : _a.postFormat();\n this.postFormatted = true;\n return this;\n }\n /** Renders the stem onto the canvas. */\n drawStem(stemOptions) {\n var _a;\n this.checkContext();\n this.setRendered();\n this.setStem(new Stem(stemOptions));\n (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setContext(this.getContext()).draw();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Larry Kuhns\n//\n// This file implements the `StringNumber` class which renders string\n// number annotations beside notes.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { Renderer } from './renderer';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category, isStaveNote, isStemmableNote } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StringNumber extends Modifier {\n constructor(number) {\n super();\n this.string_number = number;\n this.setWidth(20); // ???\n this.position = Modifier.Position.ABOVE; // Default position above stem or note head\n this.x_shift = 0;\n this.y_shift = 0;\n this.text_line = 0;\n this.stem_offset = 0;\n this.x_offset = 0; // Horizontal offset from default\n this.y_offset = 0; // Vertical offset from default\n this.dashed = true; // true - draw dashed extension false - no extension\n this.leg = Renderer.LineEndType.NONE; // draw upward/downward leg at the of extension line\n this.radius = 8;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StringNumber;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static get metrics() {\n return Tables.currentMusicFont().getMetrics().glyphs.stringNumber;\n }\n // ## Static Methods\n // Arrange string numbers inside a `ModifierContext`\n static format(nums, state) {\n const left_shift = state.left_shift;\n const right_shift = state.right_shift;\n const num_spacing = 1;\n if (!nums || nums.length === 0)\n return false;\n const nums_list = [];\n let prev_note = null;\n let shift_left = 0;\n let shift_right = 0;\n const modLines = 0;\n for (let i = 0; i < nums.length; ++i) {\n const num = nums[i];\n const note = num.getNote();\n const pos = num.getPosition();\n if (!isStaveNote(note)) {\n throw new RuntimeError('NoStaveNote');\n }\n const index = num.checkIndex();\n const props = note.getKeyProps()[index];\n const mc = note.getModifierContext();\n const verticalSpaceNeeded = (num.radius * 2) / Tables.STAVE_LINE_DISTANCE + 0.5;\n if (mc) {\n if (pos === ModifierPosition.ABOVE) {\n num.text_line = mc.getState().top_text_line;\n state.top_text_line += verticalSpaceNeeded;\n }\n else if (pos === ModifierPosition.BELOW) {\n num.text_line = mc.getState().text_line;\n state.text_line += verticalSpaceNeeded;\n }\n }\n if (note !== prev_note) {\n for (let n = 0; n < note.keys.length; ++n) {\n if (left_shift === 0) {\n shift_left = Math.max(note.getLeftDisplacedHeadPx(), shift_left);\n }\n if (right_shift === 0) {\n shift_right = Math.max(note.getRightDisplacedHeadPx(), shift_right);\n }\n }\n prev_note = note;\n }\n const glyphLine = modLines === 0 ? props.line : modLines;\n nums_list.push({\n pos,\n note,\n num,\n line: glyphLine,\n shiftL: shift_left,\n shiftR: shift_right,\n });\n }\n // Sort string numbers by line number.\n nums_list.sort((a, b) => b.line - a.line);\n let num_shiftR = 0;\n let x_widthL = 0;\n let x_widthR = 0;\n let last_line = null;\n let last_note = null;\n for (let i = 0; i < nums_list.length; ++i) {\n let num_shift = 0;\n const note = nums_list[i].note;\n const pos = nums_list[i].pos;\n const num = nums_list[i].num;\n const line = nums_list[i].line;\n const shiftR = nums_list[i].shiftR;\n // Reset the position of the string number every line.\n if (line !== last_line || note !== last_note) {\n num_shiftR = right_shift + shiftR;\n }\n const num_width = num.getWidth() + num_spacing;\n if (pos === Modifier.Position.LEFT) {\n num.setXShift(left_shift);\n num_shift = shift_left + num_width; // spacing\n x_widthL = num_shift > x_widthL ? num_shift : x_widthL;\n }\n else if (pos === Modifier.Position.RIGHT) {\n num.setXShift(num_shiftR);\n num_shift += num_width; // spacing\n x_widthR = num_shift > x_widthR ? num_shift : x_widthR;\n }\n last_line = line;\n last_note = note;\n }\n state.left_shift += x_widthL;\n state.right_shift += x_widthR;\n return true;\n }\n setLineEndType(leg) {\n if (leg >= Renderer.LineEndType.NONE && leg <= Renderer.LineEndType.DOWN) {\n this.leg = leg;\n }\n return this;\n }\n setStringNumber(number) {\n this.string_number = number;\n return this;\n }\n setOffsetX(x) {\n this.x_offset = x;\n return this;\n }\n setOffsetY(y) {\n this.y_offset = y;\n return this;\n }\n setLastNote(note) {\n this.last_note = note;\n return this;\n }\n setDashed(dashed) {\n this.dashed = dashed;\n return this;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(this.position, this.index);\n const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP;\n let dot_x = start.x + this.x_shift + this.x_offset;\n let stem_ext = {};\n if (note.hasStem()) {\n stem_ext = note.checkStem().getExtents();\n }\n let dot_y = start.y + this.y_shift + this.y_offset;\n switch (this.position) {\n case Modifier.Position.ABOVE:\n {\n const ys = note.getYs();\n dot_y = ys.reduce((a, b) => (a < b ? a : b));\n if (note.hasStem() && stemDirection == Stem.UP) {\n dot_y = stem_ext.topY + StringNumber.metrics.stemPadding;\n }\n dot_y -= this.radius + StringNumber.metrics.verticalPadding + this.text_line * Tables.STAVE_LINE_DISTANCE;\n }\n break;\n case Modifier.Position.BELOW:\n {\n const ys = note.getYs();\n dot_y = ys.reduce((a, b) => (a > b ? a : b));\n if (note.hasStem() && stemDirection == Stem.DOWN) {\n dot_y = stem_ext.topY - StringNumber.metrics.stemPadding;\n }\n dot_y += this.radius + StringNumber.metrics.verticalPadding + this.text_line * Tables.STAVE_LINE_DISTANCE;\n }\n break;\n case Modifier.Position.LEFT:\n dot_x -= this.radius / 2 + StringNumber.metrics.leftPadding;\n break;\n case Modifier.Position.RIGHT:\n dot_x += this.radius / 2 + StringNumber.metrics.rightPadding;\n break;\n default:\n throw new RuntimeError('InvalidPosition', `The position ${this.position} is invalid`);\n }\n ctx.save();\n ctx.beginPath();\n ctx.arc(dot_x, dot_y, this.radius, 0, Math.PI * 2, false);\n ctx.setLineWidth(1.5);\n ctx.stroke();\n ctx.setFont(this.textFont);\n const x = dot_x - ctx.measureText(this.string_number).width / 2;\n ctx.fillText('' + this.string_number, x, dot_y + 4.5);\n const lastNote = this.last_note;\n if (isStemmableNote(lastNote)) {\n // Only StemmableNote objects have getStemX().\n const end = lastNote.getStemX() - note.getX() + 5;\n ctx.setStrokeStyle('#000000');\n ctx.setLineCap('round');\n ctx.setLineWidth(0.6);\n if (this.dashed) {\n Renderer.drawDashedLine(ctx, dot_x + 10, dot_y, dot_x + end, dot_y, [3, 3]);\n }\n else {\n Renderer.drawDashedLine(ctx, dot_x + 10, dot_y, dot_x + end, dot_y, [3, 0]);\n }\n let len;\n let pattern;\n switch (this.leg) {\n case Renderer.LineEndType.UP:\n len = -10;\n pattern = this.dashed ? [3, 3] : [3, 0];\n Renderer.drawDashedLine(ctx, dot_x + end, dot_y, dot_x + end, dot_y + len, pattern);\n break;\n case Renderer.LineEndType.DOWN:\n len = 10;\n pattern = this.dashed ? [3, 3] : [3, 0];\n Renderer.drawDashedLine(ctx, dot_x + end, dot_y, dot_x + end, dot_y + len, pattern);\n break;\n default:\n break;\n }\n }\n ctx.restore();\n }\n}\nStringNumber.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: Font.SIZE,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Larry Kuhns\n//\n// This file implements the `Stroke` class which renders chord strokes\n// that can be arpeggiated, brushed, rasquedo, etc.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Category, isNote, isStaveNote, isTabNote } from './typeguard';\nimport { RuntimeError } from './util';\nexport class Stroke extends Modifier {\n constructor(type, options) {\n super();\n this.options = Object.assign({ all_voices: true }, options);\n // multi voice - span stroke across all voices if true\n this.all_voices = this.options.all_voices;\n // multi voice - end note of stroke, set in draw()\n this.type = type;\n this.position = Modifier.Position.LEFT;\n this.render_options = {\n font_scale: 38,\n };\n this.resetFont();\n this.setXShift(0);\n this.setWidth(10);\n }\n static get CATEGORY() {\n return Category.Stroke;\n }\n // Arrange strokes inside `ModifierContext`\n static format(strokes, state) {\n const left_shift = state.left_shift;\n const stroke_spacing = 0;\n if (!strokes || strokes.length === 0)\n return false;\n const strokeList = strokes.map((stroke) => {\n const note = stroke.getNote();\n const index = stroke.checkIndex();\n if (isStaveNote(note)) {\n // Only StaveNote objects have getKeyProps().\n const { line } = note.getKeyProps()[index];\n const shift = note.getLeftDisplacedHeadPx();\n return { line, shift, stroke };\n }\n else if (isTabNote(note)) {\n // Only TabNote objects have getPositions().\n const { str: string } = note.getPositions()[index];\n return { line: string, shift: 0, stroke };\n }\n else {\n throw new RuntimeError('Internal', 'Unexpected instance.');\n }\n });\n const strokeShift = left_shift;\n // There can only be one stroke .. if more than one, they overlay each other\n const xShift = strokeList.reduce((xShift, { stroke, shift }) => {\n stroke.setXShift(strokeShift + shift);\n return Math.max(stroke.getWidth() + stroke_spacing, xShift);\n }, 0);\n state.left_shift += xShift;\n return true;\n }\n getPosition() {\n return this.position;\n }\n addEndNote(note) {\n this.note_end = note;\n return this;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(this.position, this.index);\n let ys = note.getYs();\n let topY = start.y;\n let botY = start.y;\n const x = start.x - 5;\n const line_space = note.checkStave().getSpacingBetweenLines();\n const notes = this.checkModifierContext().getMembers(note.getCategory());\n for (let i = 0; i < notes.length; i++) {\n const note = notes[i];\n if (isNote(note)) {\n // Only Note objects have getYs().\n // note is an instance of either StaveNote or TabNote.\n ys = note.getYs();\n for (let n = 0; n < ys.length; n++) {\n if (this.note === notes[i] || this.all_voices) {\n topY = Math.min(topY, ys[n]);\n botY = Math.max(botY, ys[n]);\n }\n }\n }\n }\n let arrow = '';\n let arrow_shift_x = 0;\n let arrow_y = 0;\n let text_shift_x = 0;\n let text_y = 0;\n switch (this.type) {\n case Stroke.Type.BRUSH_DOWN:\n arrow = 'arrowheadBlackUp';\n arrow_shift_x = -3;\n arrow_y = topY - line_space / 2 + 10;\n botY += line_space / 2;\n break;\n case Stroke.Type.BRUSH_UP:\n arrow = 'arrowheadBlackDown';\n arrow_shift_x = 0.5;\n arrow_y = botY + line_space / 2;\n topY -= line_space / 2;\n break;\n case Stroke.Type.ROLL_DOWN:\n case Stroke.Type.RASQUEDO_DOWN:\n arrow = 'arrowheadBlackUp';\n arrow_shift_x = -3;\n text_shift_x = this.x_shift + arrow_shift_x - 2;\n if (isStaveNote(note)) {\n topY += 1.5 * line_space;\n if ((botY - topY) % 2 !== 0) {\n botY += 0.5 * line_space;\n }\n else {\n botY += line_space;\n }\n arrow_y = topY - line_space;\n text_y = botY + line_space + 2;\n }\n else {\n topY += 1.5 * line_space;\n botY += line_space;\n arrow_y = topY - 0.75 * line_space;\n text_y = botY + 0.25 * line_space;\n }\n break;\n case Stroke.Type.ROLL_UP:\n case Stroke.Type.RASQUEDO_UP:\n arrow = 'arrowheadBlackDown';\n arrow_shift_x = -4;\n text_shift_x = this.x_shift + arrow_shift_x - 1;\n if (isStaveNote(note)) {\n arrow_y = line_space / 2;\n topY += 0.5 * line_space;\n if ((botY - topY) % 2 === 0) {\n botY += line_space / 2;\n }\n arrow_y = botY + 0.5 * line_space;\n text_y = topY - 1.25 * line_space;\n }\n else {\n topY += 0.25 * line_space;\n botY += 0.5 * line_space;\n arrow_y = botY + 0.25 * line_space;\n text_y = topY - line_space;\n }\n break;\n case Stroke.Type.ARPEGGIO_DIRECTIONLESS:\n topY += 0.5 * line_space;\n botY += line_space; // * 0.5 can lead to slight underlap instead of overlap sometimes\n break;\n default:\n throw new RuntimeError('InvalidType', `The stroke type ${this.type} does not exist`);\n }\n let strokeLine = 'straight';\n // Draw the stroke\n if (this.type === Stroke.Type.BRUSH_DOWN || this.type === Stroke.Type.BRUSH_UP) {\n ctx.fillRect(x + this.x_shift, topY, 1, botY - topY);\n }\n else {\n strokeLine = 'wiggly';\n if (isStaveNote(note)) {\n for (let i = topY; i <= botY; i += line_space) {\n Glyph.renderGlyph(ctx, x + this.x_shift - 4, i, this.render_options.font_scale, 'vexWiggleArpeggioUp');\n }\n }\n else {\n let i;\n for (i = topY; i <= botY; i += 10) {\n Glyph.renderGlyph(ctx, x + this.x_shift - 4, i, this.render_options.font_scale, 'vexWiggleArpeggioUp');\n }\n if (this.type === Stroke.Type.RASQUEDO_DOWN) {\n text_y = i + 0.25 * line_space;\n }\n }\n }\n if (this.type === Stroke.Type.ARPEGGIO_DIRECTIONLESS) {\n return; // skip drawing arrow heads or text\n }\n // Draw the arrow head\n Glyph.renderGlyph(ctx, x + this.x_shift + arrow_shift_x, arrow_y, this.render_options.font_scale, arrow, {\n category: `stroke.${arrow}.${strokeLine}`,\n });\n // Draw the rasquedo \"R\"\n if (this.type === Stroke.Type.RASQUEDO_DOWN || this.type === Stroke.Type.RASQUEDO_UP) {\n ctx.save();\n ctx.setFont(this.textFont);\n ctx.fillText('R', x + text_shift_x, text_y);\n ctx.restore();\n }\n }\n}\nStroke.Type = {\n BRUSH_DOWN: 1,\n BRUSH_UP: 2,\n ROLL_DOWN: 3,\n ROLL_UP: 4,\n RASQUEDO_DOWN: 5,\n RASQUEDO_UP: 6,\n ARPEGGIO_DIRECTIONLESS: 7, // Arpeggiated chord without upwards or downwards arrow\n};\nStroke.TEXT_FONT = {\n family: Font.SERIF,\n size: Font.SIZE,\n weight: FontWeight.BOLD,\n style: FontStyle.ITALIC,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// @author Gregory Ristow (2015)\nimport { Font, FontStyle, FontWeight } from './font';\nimport { RenderContext } from './rendercontext';\nimport { normalizeAngle, prefix, RuntimeError } from './util';\n/** For a particular element type (e.g., rect), we will not apply certain presentation attributes. */\nconst ATTRIBUTES_TO_IGNORE = {\n path: {\n x: true,\n y: true,\n width: true,\n height: true,\n 'font-family': true,\n 'font-weight': true,\n 'font-style': true,\n 'font-size': true,\n },\n rect: {\n 'font-family': true,\n 'font-weight': true,\n 'font-style': true,\n 'font-size': true,\n },\n text: {\n width: true,\n height: true,\n },\n};\n/** Create the SVG in the SVG namespace. */\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst TWO_PI = 2 * Math.PI;\nclass MeasureTextCache {\n constructor() {\n // The cache is keyed first by the text string, then by the font attributes\n // joined together.\n this.cache = {};\n }\n lookup(text, svg, attributes) {\n let entries = this.cache[text];\n if (entries === undefined) {\n entries = {};\n this.cache[text] = entries;\n }\n const family = attributes['font-family'];\n const size = attributes['font-size'];\n const weight = attributes['font-weight'];\n const style = attributes['font-style'];\n const key = `${family}%${size}%${weight}%${style}`;\n let entry = entries[key];\n if (entry === undefined) {\n entry = this.measureImpl(text, svg, attributes);\n entries[key] = entry;\n }\n return entry;\n }\n measureImpl(text, svg, attributes) {\n let txt = this.txt;\n if (!txt) {\n // Create the SVG text element that will be used to measure text in the event\n // of a cache miss.\n txt = document.createElementNS(SVG_NS, 'text');\n this.txt = txt;\n }\n txt.textContent = text;\n txt.setAttributeNS(null, 'font-family', attributes['font-family']);\n txt.setAttributeNS(null, 'font-size', attributes['font-size']);\n txt.setAttributeNS(null, 'font-style', attributes['font-style']);\n txt.setAttributeNS(null, 'font-weight', attributes['font-weight']);\n svg.appendChild(txt);\n const bbox = txt.getBBox();\n svg.removeChild(txt);\n return { x: bbox.x, y: bbox.y, width: bbox.width, height: bbox.height };\n }\n}\n/**\n * SVG rendering context with an API similar to CanvasRenderingContext2D.\n */\nexport class SVGContext extends RenderContext {\n constructor(element) {\n super();\n this.width = 0;\n this.height = 0;\n this.backgroundFillStyle = 'white';\n /** Formatted as CSS font shorthand (e.g., 'italic bold 12pt Arial') */\n this.fontCSSString = '';\n this.element = element;\n // Create a SVG element and add it to the container element.\n const svg = this.create('svg');\n this.element.appendChild(svg);\n this.svg = svg;\n this.parent = this.svg;\n this.groups = [this.svg];\n this.path = '';\n this.pen = { x: NaN, y: NaN };\n this.lineWidth = 1.0;\n const defaultFontAttributes = {\n 'font-family': Font.SANS_SERIF,\n 'font-size': Font.SIZE + 'pt',\n 'font-weight': FontWeight.NORMAL,\n 'font-style': FontStyle.NORMAL,\n };\n this.state = Object.assign({ scale: { x: 1, y: 1 } }, defaultFontAttributes);\n this.attributes = Object.assign({ 'stroke-width': 0.3, 'stroke-dasharray': 'none', fill: 'black', stroke: 'black' }, defaultFontAttributes);\n this.shadow_attributes = {\n width: 0,\n color: 'black',\n };\n this.state_stack = [];\n }\n create(svgElementType) {\n return document.createElementNS(SVG_NS, svgElementType);\n }\n // Allow grouping elements in containers for interactivity.\n openGroup(cls, id, attrs) {\n const group = this.create('g');\n this.groups.push(group);\n this.parent.appendChild(group);\n this.parent = group;\n if (cls)\n group.setAttribute('class', prefix(cls));\n if (id)\n group.setAttribute('id', prefix(id));\n if (attrs && attrs.pointerBBox) {\n group.setAttribute('pointer-events', 'bounding-box');\n }\n return group;\n }\n closeGroup() {\n this.groups.pop();\n this.parent = this.groups[this.groups.length - 1];\n }\n add(elem) {\n this.parent.appendChild(elem);\n }\n setFillStyle(style) {\n this.attributes.fill = style;\n return this;\n }\n /**\n * Used to set the fill color for `clearRect()`. This allows us to simulate\n * cutting a \"hole\" into the SVG drawing.\n */\n setBackgroundFillStyle(style) {\n this.backgroundFillStyle = style;\n return this;\n }\n setStrokeStyle(style) {\n this.attributes.stroke = style;\n return this;\n }\n setShadowColor(color) {\n this.shadow_attributes.color = color;\n return this;\n }\n /**\n * @param blur A non-negative float specifying the level of shadow blur, where 0\n * represents no blur and larger numbers represent increasingly more blur.\n * @returns this\n */\n setShadowBlur(blur) {\n this.shadow_attributes.width = blur;\n return this;\n }\n /**\n * @param width\n * @returns this\n */\n setLineWidth(width) {\n this.attributes['stroke-width'] = width;\n this.lineWidth = width;\n return this;\n }\n /**\n * @param lineDash an array of integers in the form of [dash, space, dash, space, etc...]\n * @returns this\n *\n * See: [SVG `stroke-dasharray` attribute](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray)\n */\n setLineDash(lineDash) {\n if (Object.prototype.toString.call(lineDash) === '[object Array]') {\n this.attributes['stroke-dasharray'] = lineDash.join(',');\n return this;\n }\n else {\n throw new RuntimeError('ArgumentError', 'lineDash must be an array of integers.');\n }\n }\n /**\n * @param capType\n * @returns this\n */\n setLineCap(capType) {\n this.attributes['stroke-linecap'] = capType;\n return this;\n }\n // ### Sizing & Scaling Methods:\n // TODO (GCR): See note at scale() -- separate our internal\n // conception of pixel-based width/height from the style.width\n // and style.height properties eventually to allow users to\n // apply responsive sizing attributes to the SVG.\n resize(width, height) {\n this.width = width;\n this.height = height;\n this.element.style.width = width.toString();\n this.svg.style.width = width.toString();\n this.svg.style.height = height.toString();\n const attributes = {\n width,\n height,\n };\n this.applyAttributes(this.svg, attributes);\n this.scale(this.state.scale.x, this.state.scale.y);\n return this;\n }\n scale(x, y) {\n // uses viewBox to scale\n // TODO (GCR): we may at some point want to distinguish the\n // style.width / style.height properties that are applied to\n // the SVG object from our internal conception of the SVG\n // width/height. This would allow us to create automatically\n // scaling SVG's that filled their containers, for instance.\n //\n // As this isn't implemented in Canvas contexts,\n // I've left as is for now, but in using the viewBox to\n // handle internal scaling, am trying to make it possible\n // for us to eventually move in that direction.\n this.state.scale = { x, y };\n const visibleWidth = this.width / x;\n const visibleHeight = this.height / y;\n this.setViewBox(0, 0, visibleWidth, visibleHeight);\n return this;\n }\n /**\n * 1 arg: string in the \"x y w h\" format\n * 4 args: x:number, y:number, w:number, h:number\n */\n setViewBox(viewBox_or_minX, minY, width, height) {\n if (typeof viewBox_or_minX === 'string') {\n this.svg.setAttribute('viewBox', viewBox_or_minX);\n }\n else {\n const viewBoxString = viewBox_or_minX + ' ' + minY + ' ' + width + ' ' + height;\n this.svg.setAttribute('viewBox', viewBoxString);\n }\n }\n // ### Drawing helper methods:\n applyAttributes(element, attributes) {\n const attrNamesToIgnore = ATTRIBUTES_TO_IGNORE[element.nodeName];\n for (const attrName in attributes) {\n if (attrNamesToIgnore && attrNamesToIgnore[attrName]) {\n continue;\n }\n element.setAttributeNS(null, attrName, attributes[attrName]);\n }\n return element;\n }\n // ### Shape & Path Methods:\n clear() {\n // Clear the SVG by removing all inner children.\n // (This approach is usually slightly more efficient\n // than removing the old SVG & adding a new one to\n // the container element, since it does not cause the\n // container to resize twice. Also, the resize\n // triggered by removing the entire SVG can trigger\n // a touchcancel event when the element resizes away\n // from a touch point.)\n while (this.svg.lastChild) {\n this.svg.removeChild(this.svg.lastChild);\n }\n // Replace the viewbox attribute we just removed.\n this.scale(this.state.scale.x, this.state.scale.y);\n }\n // ## Rectangles:\n rect(x, y, width, height, attributes) {\n // Avoid invalid negative height attributes by flipping the rectangle on its head:\n if (height < 0) {\n y += height;\n height *= -1;\n }\n const rectangle = this.create('rect');\n attributes = attributes !== null && attributes !== void 0 ? attributes : { fill: 'none', 'stroke-width': this.lineWidth, stroke: 'black' };\n this.applyAttributes(rectangle, Object.assign({ x, y, width, height }, attributes));\n this.add(rectangle);\n return this;\n }\n fillRect(x, y, width, height) {\n const attributes = { fill: this.attributes.fill };\n this.rect(x, y, width, height, attributes);\n return this;\n }\n clearRect(x, y, width, height) {\n // Currently this fills a rect with the backgroundFillStyle, rather\n // than \"cut a hole\" into the existing shapes.\n //\n // Since tabNote seems to be the only module that makes use of this\n // it may be worth creating a separate tabStave that would\n // draw lines around locations of tablature fingering.\n this.rect(x, y, width, height, { 'stroke-width': 0, fill: this.backgroundFillStyle });\n return this;\n }\n // ## Paths:\n beginPath() {\n this.path = '';\n this.pen.x = NaN;\n this.pen.y = NaN;\n return this;\n }\n moveTo(x, y) {\n this.path += 'M' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n lineTo(x, y) {\n this.path += 'L' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n bezierCurveTo(x1, y1, x2, y2, x, y) {\n this.path += 'C' + x1 + ' ' + y1 + ',' + x2 + ' ' + y2 + ',' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n quadraticCurveTo(x1, y1, x, y) {\n this.path += 'Q' + x1 + ' ' + y1 + ',' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n arc(x, y, radius, startAngle, endAngle, counterclockwise) {\n const x0 = x + radius * Math.cos(startAngle);\n const y0 = y + radius * Math.sin(startAngle);\n // Handle the edge case where arc length is greater than or equal to\n // the circle's circumference:\n // https://html.spec.whatwg.org/multipage/canvas.html#ellipse-method-steps\n if ((!counterclockwise && endAngle - startAngle >= TWO_PI) ||\n (counterclockwise && startAngle - endAngle >= TWO_PI)) {\n const x1 = x + radius * Math.cos(startAngle + Math.PI);\n const y1 = y + radius * Math.sin(startAngle + Math.PI);\n // There's no way to specify a completely circular arc in SVG so we have to\n // use two semi-circular arcs.\n this.path += `M${x0} ${y0} A${radius} ${radius} 0 0 0 ${x1} ${y1} `;\n this.path += `A${radius} ${radius} 0 0 0 ${x0} ${y0}`;\n this.pen.x = x0;\n this.pen.y = y0;\n }\n else {\n const x1 = x + radius * Math.cos(endAngle);\n const y1 = y + radius * Math.sin(endAngle);\n startAngle = normalizeAngle(startAngle);\n endAngle = normalizeAngle(endAngle);\n let large;\n if (Math.abs(endAngle - startAngle) < Math.PI) {\n large = counterclockwise;\n }\n else {\n large = !counterclockwise;\n }\n if (startAngle > endAngle) {\n large = !large;\n }\n const sweep = !counterclockwise;\n this.path += `M${x0} ${y0} A${radius} ${radius} 0 ${+large} ${+sweep} ${x1} ${y1}`;\n this.pen.x = x1;\n this.pen.y = y1;\n }\n return this;\n }\n closePath() {\n this.path += 'Z';\n return this;\n }\n getShadowStyle() {\n const sa = this.shadow_attributes;\n // A CSS drop-shadow filter blur looks different than a canvas shadowBlur\n // of the same radius, so we scale the drop-shadow radius here to make it\n // look close to the canvas shadow.\n return `filter: drop-shadow(0 0 ${sa.width / 1.5}px ${sa.color})`;\n }\n fill(attributes) {\n const path = this.create('path');\n if (typeof attributes === 'undefined') {\n attributes = Object.assign(Object.assign({}, this.attributes), { stroke: 'none' });\n }\n attributes.d = this.path;\n if (this.shadow_attributes.width > 0) {\n attributes.style = this.getShadowStyle();\n }\n this.applyAttributes(path, attributes);\n this.add(path);\n return this;\n }\n stroke() {\n const path = this.create('path');\n const attributes = Object.assign(Object.assign({}, this.attributes), { fill: 'none', 'stroke-width': this.lineWidth, d: this.path });\n if (this.shadow_attributes.width > 0) {\n attributes.style = this.getShadowStyle();\n }\n this.applyAttributes(path, attributes);\n this.add(path);\n return this;\n }\n // ## Text Methods:\n measureText(text) {\n return SVGContext.measureTextCache.lookup(text, this.svg, this.attributes);\n }\n fillText(text, x, y) {\n if (!text || text.length <= 0) {\n return this;\n }\n const attributes = Object.assign(Object.assign({}, this.attributes), { stroke: 'none', x,\n y });\n const txt = this.create('text');\n txt.textContent = text;\n this.applyAttributes(txt, attributes);\n this.add(txt);\n return this;\n }\n // TODO: State should be deep-copied.\n save() {\n this.state_stack.push({\n state: {\n 'font-family': this.state['font-family'],\n 'font-weight': this.state['font-weight'],\n 'font-style': this.state['font-style'],\n 'font-size': this.state['font-size'],\n scale: this.state.scale,\n },\n attributes: {\n 'font-family': this.attributes['font-family'],\n 'font-weight': this.attributes['font-weight'],\n 'font-style': this.attributes['font-style'],\n 'font-size': this.attributes['font-size'],\n fill: this.attributes.fill,\n stroke: this.attributes.stroke,\n 'stroke-width': this.attributes['stroke-width'],\n 'stroke-dasharray': this.attributes['stroke-dasharray'],\n },\n shadow_attributes: {\n width: this.shadow_attributes.width,\n color: this.shadow_attributes.color,\n },\n lineWidth: this.lineWidth,\n });\n return this;\n }\n // TODO: State should be deep-restored.\n restore() {\n const savedState = this.state_stack.pop();\n if (savedState) {\n const state = savedState;\n this.state['font-family'] = state.state['font-family'];\n this.state['font-weight'] = state.state['font-weight'];\n this.state['font-style'] = state.state['font-style'];\n this.state['font-size'] = state.state['font-size'];\n this.state.scale = state.state.scale;\n this.attributes['font-family'] = state.attributes['font-family'];\n this.attributes['font-weight'] = state.attributes['font-weight'];\n this.attributes['font-style'] = state.attributes['font-style'];\n this.attributes['font-size'] = state.attributes['font-size'];\n this.attributes.fill = state.attributes.fill;\n this.attributes.stroke = state.attributes.stroke;\n this.attributes['stroke-width'] = state.attributes['stroke-width'];\n this.attributes['stroke-dasharray'] = state.attributes['stroke-dasharray'];\n this.shadow_attributes.width = state.shadow_attributes.width;\n this.shadow_attributes.color = state.shadow_attributes.color;\n this.lineWidth = state.lineWidth;\n }\n return this;\n }\n set fillStyle(style) {\n this.setFillStyle(style);\n }\n get fillStyle() {\n return this.attributes.fill;\n }\n set strokeStyle(style) {\n this.setStrokeStyle(style);\n }\n get strokeStyle() {\n return this.attributes.stroke;\n }\n /**\n * @param f is 1) a `FontInfo` object or\n * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or\n * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided).\n * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt').\n * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900). It is inserted\n * into the font-weight attribute (e.g., font-weight=\"bold\")\n * @param style is a string (e.g., 'italic', 'normal') that is inserted into the\n * font-style attribute (e.g., font-style=\"italic\")\n */\n setFont(f, size, weight, style) {\n const fontInfo = Font.validate(f, size, weight, style);\n this.fontCSSString = Font.toCSSString(fontInfo);\n const fontAttributes = {\n 'font-family': fontInfo.family,\n 'font-size': fontInfo.size,\n 'font-weight': fontInfo.weight,\n 'font-style': fontInfo.style,\n };\n this.attributes = Object.assign(Object.assign({}, this.attributes), fontAttributes);\n this.state = Object.assign(Object.assign({}, this.state), fontAttributes);\n return this;\n }\n /** Return a string of the form `'italic bold 15pt Arial'` */\n getFont() {\n return this.fontCSSString;\n }\n}\nSVGContext.measureTextCache = new MeasureTextCache();\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { BoundingBox } from './boundingbox';\nimport { Element } from './element';\nimport { Formatter } from './formatter';\nimport { Note } from './note';\nimport { Stave } from './stave';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\n/**\n * System implements a musical system, which is a collection of staves,\n * each which can have one or more voices. All voices across all staves in\n * the system are formatted together.\n */\nexport class System extends Element {\n constructor(params = {}) {\n super();\n this.setOptions(params);\n this.parts = [];\n }\n static get CATEGORY() {\n return Category.System;\n }\n /** Set formatting options. */\n setOptions(options = {}) {\n if (!options.factory) {\n throw new RuntimeError('NoFactory', 'System.setOptions(options) requires a factory.');\n }\n this.factory = options.factory;\n this.options = Object.assign(Object.assign({ factory: this.factory, x: 10, y: 10, width: 500, spaceBetweenStaves: 12, autoWidth: false, noJustification: false, debugFormatter: false, formatIterations: 0, noPadding: false }, options), { details: Object.assign({ alpha: 0.5 }, options.details), formatOptions: Object.assign({}, options.formatOptions) });\n if (this.options.noJustification === false && typeof options.width === 'undefined') {\n this.options.autoWidth = true;\n }\n }\n /** Set associated context. */\n setContext(context) {\n super.setContext(context);\n this.factory.setContext(context);\n return this;\n }\n /**\n * Add connector between staves.\n * @param type see {@link StaveConnector.typeString}\n */\n addConnector(type = 'double') {\n this.connector = this.factory.StaveConnector({\n top_stave: this.parts[0].stave,\n bottom_stave: this.parts[this.parts.length - 1].stave,\n type,\n });\n return this.connector;\n }\n /**\n * Add a stave to the system.\n *\n * Example (one voice):\n *\n * `system.addStave({voices: [score.voice(score.notes('C#5/q, B4, A4, G#4'))]});`\n *\n * Example (two voices):\n *\n * `system.addStave({voices: [`\n * `score.voice(score.notes('C#5/q, B4, A4, G#4', {stem: 'up'})),`\n * `score.voice(score.notes('C#4/h, C#4', {stem: 'down'}))`\n * `]});`\n */\n addStave(params) {\n var _a;\n const staveOptions = Object.assign({ left_bar: false }, params.options);\n const stave = (_a = params.stave) !== null && _a !== void 0 ? _a : this.factory.Stave({ x: this.options.x, y: this.options.y, width: this.options.width, options: staveOptions });\n const p = Object.assign(Object.assign({ stave, \n /* voices: [], */\n spaceAbove: 0, spaceBelow: 0, debugNoteMetrics: false, noJustification: false }, params), { options: staveOptions });\n const ctx = this.getContext();\n p.voices.forEach((voice) => voice\n .setContext(ctx)\n .setStave(stave)\n .getTickables()\n .forEach((tickable) => tickable.setStave(stave)));\n this.parts.push(p);\n return stave;\n }\n /** Format the system. */\n format() {\n const options_details = this.options.details;\n let justifyWidth = 0;\n const formatter = new Formatter(options_details);\n this.formatter = formatter;\n let y = this.options.y;\n let startX = 0;\n let allVoices = [];\n const debugNoteMetricsYs = [];\n // Join the voices for each stave.\n this.parts.forEach((part) => {\n y = y + part.stave.space(part.spaceAbove);\n part.stave.setY(y);\n if (this.options.autoWidth) {\n part.voices.forEach((voice) => {\n formatter.joinVoices([voice]);\n });\n }\n else {\n formatter.joinVoices(part.voices);\n }\n y = y + part.stave.space(part.spaceBelow);\n y = y + part.stave.space(this.options.spaceBetweenStaves);\n if (part.debugNoteMetrics) {\n debugNoteMetricsYs.push({ y, voice: part.voices[0] });\n y += 15;\n }\n allVoices = allVoices.concat(part.voices);\n startX = Math.max(startX, part.stave.getNoteStartX());\n });\n // Update the start position of all staves.\n this.parts.forEach((part) => part.stave.setNoteStartX(startX));\n if (this.options.autoWidth) {\n justifyWidth = formatter.preCalculateMinTotalWidth(allVoices);\n this.parts.forEach((part) => {\n part.stave.setWidth(justifyWidth + Stave.rightPadding + (startX - this.options.x));\n });\n }\n else {\n justifyWidth = this.options.noPadding\n ? this.options.width - this.options.x\n : this.options.width - (startX - this.options.x) - Stave.defaultPadding;\n }\n formatter.format(allVoices, this.options.noJustification ? 0 : justifyWidth, this.options.formatOptions);\n for (let i = 0; i < this.options.formatIterations; i++) {\n formatter.tune(options_details);\n }\n this.startX = startX;\n this.debugNoteMetricsYs = debugNoteMetricsYs;\n this.lastY = y;\n this.boundingBox = new BoundingBox(this.options.x, this.options.y, this.options.width, this.lastY - this.options.y);\n }\n /** Render the system. */\n draw() {\n // Render debugging information, if requested.\n const ctx = this.checkContext();\n if (!this.formatter || !this.startX || !this.lastY || !this.debugNoteMetricsYs) {\n throw new RuntimeError('NoFormatter', 'format() must be called before draw()');\n }\n this.setRendered();\n if (this.options.debugFormatter) {\n Formatter.plotDebugging(ctx, this.formatter, this.startX, this.options.y, this.lastY);\n }\n this.debugNoteMetricsYs.forEach((d) => {\n d.voice.getTickables().forEach((tickable) => Note.plotMetrics(ctx, tickable, d.y));\n });\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { Fraction } from './fraction';\nimport { Glyph } from './glyph';\nimport { RuntimeError } from './util';\nconst RESOLUTION = 16384;\n/**\n * Map duration numbers to 'ticks', the unit of duration used throughout VexFlow.\n * For example, a quarter note is 4, so it maps to RESOLUTION / 4 = 4096 ticks.\n */\nconst durations = {\n '1/2': RESOLUTION * 2,\n 1: RESOLUTION / 1,\n 2: RESOLUTION / 2,\n 4: RESOLUTION / 4,\n 8: RESOLUTION / 8,\n 16: RESOLUTION / 16,\n 32: RESOLUTION / 32,\n 64: RESOLUTION / 64,\n 128: RESOLUTION / 128,\n 256: RESOLUTION / 256,\n};\nconst durationAliases = {\n w: '1',\n h: '2',\n q: '4',\n // This is the default duration used to render bars (BarNote). Bars no longer\n // consume ticks, so this should be a no-op.\n // TODO(0xfe): This needs to be cleaned up.\n b: '256',\n};\nconst keySignatures = {\n C: { num: 0 },\n Am: { num: 0 },\n F: { acc: 'b', num: 1 },\n Dm: { acc: 'b', num: 1 },\n Bb: { acc: 'b', num: 2 },\n Gm: { acc: 'b', num: 2 },\n Eb: { acc: 'b', num: 3 },\n Cm: { acc: 'b', num: 3 },\n Ab: { acc: 'b', num: 4 },\n Fm: { acc: 'b', num: 4 },\n Db: { acc: 'b', num: 5 },\n Bbm: { acc: 'b', num: 5 },\n Gb: { acc: 'b', num: 6 },\n Ebm: { acc: 'b', num: 6 },\n Cb: { acc: 'b', num: 7 },\n Abm: { acc: 'b', num: 7 },\n G: { acc: '#', num: 1 },\n Em: { acc: '#', num: 1 },\n D: { acc: '#', num: 2 },\n Bm: { acc: '#', num: 2 },\n A: { acc: '#', num: 3 },\n 'F#m': { acc: '#', num: 3 },\n E: { acc: '#', num: 4 },\n 'C#m': { acc: '#', num: 4 },\n B: { acc: '#', num: 5 },\n 'G#m': { acc: '#', num: 5 },\n 'F#': { acc: '#', num: 6 },\n 'D#m': { acc: '#', num: 6 },\n 'C#': { acc: '#', num: 7 },\n 'A#m': { acc: '#', num: 7 },\n};\nconst clefs = {\n treble: { line_shift: 0 },\n bass: { line_shift: 6 },\n tenor: { line_shift: 4 },\n alto: { line_shift: 3 },\n soprano: { line_shift: 1 },\n percussion: { line_shift: 0 },\n 'mezzo-soprano': { line_shift: 2 },\n 'baritone-c': { line_shift: 5 },\n 'baritone-f': { line_shift: 5 },\n subbass: { line_shift: 7 },\n french: { line_shift: -1 },\n};\nconst notesInfo = {\n C: { index: 0, int_val: 0 },\n CN: { index: 0, int_val: 0, accidental: 'n' },\n 'C#': { index: 0, int_val: 1, accidental: '#' },\n 'C##': { index: 0, int_val: 2, accidental: '##' },\n CB: { index: 0, int_val: 11, accidental: 'b' },\n CBB: { index: 0, int_val: 10, accidental: 'bb' },\n D: { index: 1, int_val: 2 },\n DN: { index: 1, int_val: 2, accidental: 'n' },\n 'D#': { index: 1, int_val: 3, accidental: '#' },\n 'D##': { index: 1, int_val: 4, accidental: '##' },\n DB: { index: 1, int_val: 1, accidental: 'b' },\n DBB: { index: 1, int_val: 0, accidental: 'bb' },\n E: { index: 2, int_val: 4 },\n EN: { index: 2, int_val: 4, accidental: 'n' },\n 'E#': { index: 2, int_val: 5, accidental: '#' },\n 'E##': { index: 2, int_val: 6, accidental: '##' },\n EB: { index: 2, int_val: 3, accidental: 'b' },\n EBB: { index: 2, int_val: 2, accidental: 'bb' },\n F: { index: 3, int_val: 5 },\n FN: { index: 3, int_val: 5, accidental: 'n' },\n 'F#': { index: 3, int_val: 6, accidental: '#' },\n 'F##': { index: 3, int_val: 7, accidental: '##' },\n FB: { index: 3, int_val: 4, accidental: 'b' },\n FBB: { index: 3, int_val: 3, accidental: 'bb' },\n G: { index: 4, int_val: 7 },\n GN: { index: 4, int_val: 7, accidental: 'n' },\n 'G#': { index: 4, int_val: 8, accidental: '#' },\n 'G##': { index: 4, int_val: 9, accidental: '##' },\n GB: { index: 4, int_val: 6, accidental: 'b' },\n GBB: { index: 4, int_val: 5, accidental: 'bb' },\n A: { index: 5, int_val: 9 },\n AN: { index: 5, int_val: 9, accidental: 'n' },\n 'A#': { index: 5, int_val: 10, accidental: '#' },\n 'A##': { index: 5, int_val: 11, accidental: '##' },\n AB: { index: 5, int_val: 8, accidental: 'b' },\n ABB: { index: 5, int_val: 7, accidental: 'bb' },\n B: { index: 6, int_val: 11 },\n BN: { index: 6, int_val: 11, accidental: 'n' },\n 'B#': { index: 6, int_val: 12, accidental: '#' },\n 'B##': { index: 6, int_val: 13, accidental: '##' },\n BB: { index: 6, int_val: 10, accidental: 'b' },\n BBB: { index: 6, int_val: 9, accidental: 'bb' },\n R: { index: 6, rest: true },\n X: {\n index: 6,\n accidental: '',\n octave: 4,\n code: 'noteheadXBlack',\n shift_right: 5.5,\n },\n};\nconst validNoteTypes = {\n n: { name: 'note' },\n r: { name: 'rest' },\n h: { name: 'harmonic' },\n m: { name: 'muted' },\n s: { name: 'slash' },\n g: { name: 'ghost' },\n};\nconst customNoteHeads = {\n /* Diamond */\n D0: { code: 'noteheadDiamondWhole' },\n D1: { code: 'noteheadDiamondHalf' },\n D2: { code: 'noteheadDiamondBlack' },\n D3: { code: 'noteheadDiamondBlack' },\n /* Triangle */\n T0: { code: 'noteheadTriangleUpWhole' },\n T1: { code: 'noteheadTriangleUpHalf' },\n T2: { code: 'noteheadTriangleUpBlack' },\n T3: { code: 'noteheadTriangleUpBlack' },\n /* Cross */\n X0: { code: 'noteheadXWhole' },\n X1: { code: 'noteheadXHalf' },\n X2: { code: 'noteheadXBlack' },\n X3: { code: 'noteheadCircleX' },\n /* Square */\n S1: { code: 'noteheadSquareWhite' },\n S2: { code: 'noteheadSquareBlack' },\n /* Rectangle */\n R1: { code: 'vexNoteHeadRectWhite' },\n R2: { code: 'vexNoteHeadRectBlack' }, // no smufl code\n};\nconst accidentals = {\n '#': { code: 'accidentalSharp', parenRightPaddingAdjustment: -1 },\n '##': { code: 'accidentalDoubleSharp', parenRightPaddingAdjustment: -1 },\n b: { code: 'accidentalFlat', parenRightPaddingAdjustment: -2 },\n bb: { code: 'accidentalDoubleFlat', parenRightPaddingAdjustment: -2 },\n n: { code: 'accidentalNatural', parenRightPaddingAdjustment: -1 },\n '{': { code: 'accidentalParensLeft', parenRightPaddingAdjustment: -1 },\n '}': { code: 'accidentalParensRight', parenRightPaddingAdjustment: -1 },\n db: { code: 'accidentalThreeQuarterTonesFlatZimmermann', parenRightPaddingAdjustment: -1 },\n d: { code: 'accidentalQuarterToneFlatStein', parenRightPaddingAdjustment: 0 },\n '++': { code: 'accidentalThreeQuarterTonesSharpStein', parenRightPaddingAdjustment: -1 },\n '+': { code: 'accidentalQuarterToneSharpStein', parenRightPaddingAdjustment: -1 },\n '+-': { code: 'accidentalKucukMucennebSharp', parenRightPaddingAdjustment: -1 },\n bs: { code: 'accidentalBakiyeFlat', parenRightPaddingAdjustment: -1 },\n bss: { code: 'accidentalBuyukMucennebFlat', parenRightPaddingAdjustment: -1 },\n o: { code: 'accidentalSori', parenRightPaddingAdjustment: -1 },\n k: { code: 'accidentalKoron', parenRightPaddingAdjustment: -1 },\n bbs: { code: 'vexAccidentalMicrotonal1', parenRightPaddingAdjustment: -1 },\n '++-': { code: 'vexAccidentalMicrotonal2', parenRightPaddingAdjustment: -1 },\n ashs: { code: 'vexAccidentalMicrotonal3', parenRightPaddingAdjustment: -1 },\n afhf: { code: 'vexAccidentalMicrotonal4', parenRightPaddingAdjustment: -1 },\n accSagittal5v7KleismaUp: { code: 'accSagittal5v7KleismaUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v7KleismaDown: { code: 'accSagittal5v7KleismaDown', parenRightPaddingAdjustment: -1 },\n accSagittal5CommaUp: { code: 'accSagittal5CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal5CommaDown: { code: 'accSagittal5CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal7CommaUp: { code: 'accSagittal7CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal7CommaDown: { code: 'accSagittal7CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal25SmallDiesisUp: { code: 'accSagittal25SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal25SmallDiesisDown: { code: 'accSagittal25SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal35MediumDiesisUp: { code: 'accSagittal35MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal35MediumDiesisDown: { code: 'accSagittal35MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal11MediumDiesisUp: { code: 'accSagittal11MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal11MediumDiesisDown: { code: 'accSagittal11MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal11LargeDiesisUp: { code: 'accSagittal11LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal11LargeDiesisDown: { code: 'accSagittal11LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal35LargeDiesisUp: { code: 'accSagittal35LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal35LargeDiesisDown: { code: 'accSagittal35LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp25SDown: { code: 'accSagittalSharp25SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat25SUp: { code: 'accSagittalFlat25SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7CDown: { code: 'accSagittalSharp7CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7CUp: { code: 'accSagittalFlat7CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5CDown: { code: 'accSagittalSharp5CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5CUp: { code: 'accSagittalFlat5CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v7kDown: { code: 'accSagittalSharp5v7kDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v7kUp: { code: 'accSagittalFlat5v7kUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp: { code: 'accSagittalSharp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat: { code: 'accSagittalFlat', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v7kUp: { code: 'accSagittalSharp5v7kUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v7kDown: { code: 'accSagittalFlat5v7kDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5CUp: { code: 'accSagittalSharp5CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5CDown: { code: 'accSagittalFlat5CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7CUp: { code: 'accSagittalSharp7CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7CDown: { code: 'accSagittalFlat7CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp25SUp: { code: 'accSagittalSharp25SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat25SDown: { code: 'accSagittalFlat25SDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp35MUp: { code: 'accSagittalSharp35MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat35MDown: { code: 'accSagittalFlat35MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11MUp: { code: 'accSagittalSharp11MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11MDown: { code: 'accSagittalFlat11MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11LUp: { code: 'accSagittalSharp11LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11LDown: { code: 'accSagittalFlat11LDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp35LUp: { code: 'accSagittalSharp35LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat35LDown: { code: 'accSagittalFlat35LDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp25SDown: { code: 'accSagittalDoubleSharp25SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat25SUp: { code: 'accSagittalDoubleFlat25SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp7CDown: { code: 'accSagittalDoubleSharp7CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat7CUp: { code: 'accSagittalDoubleFlat7CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5CDown: { code: 'accSagittalDoubleSharp5CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5CUp: { code: 'accSagittalDoubleFlat5CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5v7kDown: { code: 'accSagittalDoubleSharp5v7kDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5v7kUp: { code: 'accSagittalDoubleFlat5v7kUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp: { code: 'accSagittalDoubleSharp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat: { code: 'accSagittalDoubleFlat', parenRightPaddingAdjustment: -1 },\n accSagittal7v11KleismaUp: { code: 'accSagittal7v11KleismaUp', parenRightPaddingAdjustment: -1 },\n accSagittal7v11KleismaDown: { code: 'accSagittal7v11KleismaDown', parenRightPaddingAdjustment: -1 },\n accSagittal17CommaUp: { code: 'accSagittal17CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal17CommaDown: { code: 'accSagittal17CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal55CommaUp: { code: 'accSagittal55CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal55CommaDown: { code: 'accSagittal55CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal7v11CommaUp: { code: 'accSagittal7v11CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal7v11CommaDown: { code: 'accSagittal7v11CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v11SmallDiesisUp: { code: 'accSagittal5v11SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v11SmallDiesisDown: { code: 'accSagittal5v11SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v11SDown: { code: 'accSagittalSharp5v11SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v11SUp: { code: 'accSagittalFlat5v11SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v11CDown: { code: 'accSagittalSharp7v11CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v11CUp: { code: 'accSagittalFlat7v11CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp55CDown: { code: 'accSagittalSharp55CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat55CUp: { code: 'accSagittalFlat55CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp17CDown: { code: 'accSagittalSharp17CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat17CUp: { code: 'accSagittalFlat17CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v11kDown: { code: 'accSagittalSharp7v11kDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v11kUp: { code: 'accSagittalFlat7v11kUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v11kUp: { code: 'accSagittalSharp7v11kUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v11kDown: { code: 'accSagittalFlat7v11kDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp17CUp: { code: 'accSagittalSharp17CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat17CDown: { code: 'accSagittalFlat17CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp55CUp: { code: 'accSagittalSharp55CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat55CDown: { code: 'accSagittalFlat55CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v11CUp: { code: 'accSagittalSharp7v11CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v11CDown: { code: 'accSagittalFlat7v11CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v11SUp: { code: 'accSagittalSharp5v11SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v11SDown: { code: 'accSagittalFlat5v11SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5v11SDown: { code: 'accSagittalDoubleSharp5v11SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5v11SUp: { code: 'accSagittalDoubleFlat5v11SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp7v11CDown: { code: 'accSagittalDoubleSharp7v11CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat7v11CUp: { code: 'accSagittalDoubleFlat7v11CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp55CDown: { code: 'accSagittalDoubleSharp55CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat55CUp: { code: 'accSagittalDoubleFlat55CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp17CDown: { code: 'accSagittalDoubleSharp17CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat17CUp: { code: 'accSagittalDoubleFlat17CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp7v11kDown: { code: 'accSagittalDoubleSharp7v11kDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat7v11kUp: { code: 'accSagittalDoubleFlat7v11kUp', parenRightPaddingAdjustment: -1 },\n accSagittal23CommaUp: { code: 'accSagittal23CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal23CommaDown: { code: 'accSagittal23CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v19CommaUp: { code: 'accSagittal5v19CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v19CommaDown: { code: 'accSagittal5v19CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v23SmallDiesisUp: { code: 'accSagittal5v23SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v23SmallDiesisDown: { code: 'accSagittal5v23SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v23SDown: { code: 'accSagittalSharp5v23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v23SUp: { code: 'accSagittalFlat5v23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v19CDown: { code: 'accSagittalSharp5v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v19CUp: { code: 'accSagittalFlat5v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp23CDown: { code: 'accSagittalSharp23CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat23CUp: { code: 'accSagittalFlat23CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp23CUp: { code: 'accSagittalSharp23CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat23CDown: { code: 'accSagittalFlat23CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v19CUp: { code: 'accSagittalSharp5v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v19CDown: { code: 'accSagittalFlat5v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v23SUp: { code: 'accSagittalSharp5v23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v23SDown: { code: 'accSagittalFlat5v23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5v23SDown: { code: 'accSagittalDoubleSharp5v23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5v23SUp: { code: 'accSagittalDoubleFlat5v23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5v19CDown: { code: 'accSagittalDoubleSharp5v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5v19CUp: { code: 'accSagittalDoubleFlat5v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp23CDown: { code: 'accSagittalDoubleSharp23CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat23CUp: { code: 'accSagittalDoubleFlat23CUp', parenRightPaddingAdjustment: -1 },\n accSagittal19SchismaUp: { code: 'accSagittal19SchismaUp', parenRightPaddingAdjustment: -1 },\n accSagittal19SchismaDown: { code: 'accSagittal19SchismaDown', parenRightPaddingAdjustment: -1 },\n accSagittal17KleismaUp: { code: 'accSagittal17KleismaUp', parenRightPaddingAdjustment: -1 },\n accSagittal17KleismaDown: { code: 'accSagittal17KleismaDown', parenRightPaddingAdjustment: -1 },\n accSagittal143CommaUp: { code: 'accSagittal143CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal143CommaDown: { code: 'accSagittal143CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal11v49CommaUp: { code: 'accSagittal11v49CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal11v49CommaDown: { code: 'accSagittal11v49CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal19CommaUp: { code: 'accSagittal19CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal19CommaDown: { code: 'accSagittal19CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal7v19CommaUp: { code: 'accSagittal7v19CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal7v19CommaDown: { code: 'accSagittal7v19CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal49SmallDiesisUp: { code: 'accSagittal49SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal49SmallDiesisDown: { code: 'accSagittal49SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal23SmallDiesisUp: { code: 'accSagittal23SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal23SmallDiesisDown: { code: 'accSagittal23SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v13MediumDiesisUp: { code: 'accSagittal5v13MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v13MediumDiesisDown: { code: 'accSagittal5v13MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal11v19MediumDiesisUp: { code: 'accSagittal11v19MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal11v19MediumDiesisDown: { code: 'accSagittal11v19MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal49MediumDiesisUp: { code: 'accSagittal49MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal49MediumDiesisDown: { code: 'accSagittal49MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v49MediumDiesisUp: { code: 'accSagittal5v49MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v49MediumDiesisDown: { code: 'accSagittal5v49MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal49LargeDiesisUp: { code: 'accSagittal49LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal49LargeDiesisDown: { code: 'accSagittal49LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal11v19LargeDiesisUp: { code: 'accSagittal11v19LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal11v19LargeDiesisDown: { code: 'accSagittal11v19LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v13LargeDiesisUp: { code: 'accSagittal5v13LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v13LargeDiesisDown: { code: 'accSagittal5v13LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp23SDown: { code: 'accSagittalSharp23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat23SUp: { code: 'accSagittalFlat23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp49SDown: { code: 'accSagittalSharp49SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat49SUp: { code: 'accSagittalFlat49SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v19CDown: { code: 'accSagittalSharp7v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v19CUp: { code: 'accSagittalFlat7v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp19CDown: { code: 'accSagittalSharp19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat19CUp: { code: 'accSagittalFlat19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11v49CDown: { code: 'accSagittalSharp11v49CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11v49CUp: { code: 'accSagittalFlat11v49CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp143CDown: { code: 'accSagittalSharp143CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat143CUp: { code: 'accSagittalFlat143CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp17kDown: { code: 'accSagittalSharp17kDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat17kUp: { code: 'accSagittalFlat17kUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp19sDown: { code: 'accSagittalSharp19sDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat19sUp: { code: 'accSagittalFlat19sUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp19sUp: { code: 'accSagittalSharp19sUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat19sDown: { code: 'accSagittalFlat19sDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp17kUp: { code: 'accSagittalSharp17kUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat17kDown: { code: 'accSagittalFlat17kDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp143CUp: { code: 'accSagittalSharp143CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat143CDown: { code: 'accSagittalFlat143CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11v49CUp: { code: 'accSagittalSharp11v49CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11v49CDown: { code: 'accSagittalFlat11v49CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp19CUp: { code: 'accSagittalSharp19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat19CDown: { code: 'accSagittalFlat19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v19CUp: { code: 'accSagittalSharp7v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v19CDown: { code: 'accSagittalFlat7v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp49SUp: { code: 'accSagittalSharp49SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat49SDown: { code: 'accSagittalFlat49SDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp23SUp: { code: 'accSagittalSharp23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat23SDown: { code: 'accSagittalFlat23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v13MUp: { code: 'accSagittalSharp5v13MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v13MDown: { code: 'accSagittalFlat5v13MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11v19MUp: { code: 'accSagittalSharp11v19MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11v19MDown: { code: 'accSagittalFlat11v19MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp49MUp: { code: 'accSagittalSharp49MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat49MDown: { code: 'accSagittalFlat49MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v49MUp: { code: 'accSagittalSharp5v49MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v49MDown: { code: 'accSagittalFlat5v49MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp49LUp: { code: 'accSagittalSharp49LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat49LDown: { code: 'accSagittalFlat49LDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11v19LUp: { code: 'accSagittalSharp11v19LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11v19LDown: { code: 'accSagittalFlat11v19LDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v13LUp: { code: 'accSagittalSharp5v13LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v13LDown: { code: 'accSagittalFlat5v13LDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp23SDown: { code: 'accSagittalDoubleSharp23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat23SUp: { code: 'accSagittalDoubleFlat23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp49SDown: { code: 'accSagittalDoubleSharp49SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat49SUp: { code: 'accSagittalDoubleFlat49SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp7v19CDown: { code: 'accSagittalDoubleSharp7v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat7v19CUp: { code: 'accSagittalDoubleFlat7v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp19CDown: { code: 'accSagittalDoubleSharp19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat19CUp: { code: 'accSagittalDoubleFlat19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp11v49CDown: { code: 'accSagittalDoubleSharp11v49CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat11v49CUp: { code: 'accSagittalDoubleFlat11v49CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp143CDown: { code: 'accSagittalDoubleSharp143CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat143CUp: { code: 'accSagittalDoubleFlat143CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp17kDown: { code: 'accSagittalDoubleSharp17kDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat17kUp: { code: 'accSagittalDoubleFlat17kUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp19sDown: { code: 'accSagittalDoubleSharp19sDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat19sUp: { code: 'accSagittalDoubleFlat19sUp', parenRightPaddingAdjustment: -1 },\n accSagittalShaftUp: { code: 'accSagittalShaftUp', parenRightPaddingAdjustment: -1 },\n accSagittalShaftDown: { code: 'accSagittalShaftDown', parenRightPaddingAdjustment: -1 },\n accSagittalAcute: { code: 'accSagittalAcute', parenRightPaddingAdjustment: -1 },\n accSagittalGrave: { code: 'accSagittalGrave', parenRightPaddingAdjustment: -1 },\n accSagittal1MinaUp: { code: 'accSagittal1MinaUp', parenRightPaddingAdjustment: -1 },\n accSagittal1MinaDown: { code: 'accSagittal1MinaDown', parenRightPaddingAdjustment: -1 },\n accSagittal2MinasUp: { code: 'accSagittal2MinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal2MinasDown: { code: 'accSagittal2MinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal1TinaUp: { code: 'accSagittal1TinaUp', parenRightPaddingAdjustment: -1 },\n accSagittal1TinaDown: { code: 'accSagittal1TinaDown', parenRightPaddingAdjustment: -1 },\n accSagittal2TinasUp: { code: 'accSagittal2TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal2TinasDown: { code: 'accSagittal2TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal3TinasUp: { code: 'accSagittal3TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal3TinasDown: { code: 'accSagittal3TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal4TinasUp: { code: 'accSagittal4TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal4TinasDown: { code: 'accSagittal4TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal5TinasUp: { code: 'accSagittal5TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal5TinasDown: { code: 'accSagittal5TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal6TinasUp: { code: 'accSagittal6TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal6TinasDown: { code: 'accSagittal6TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal7TinasUp: { code: 'accSagittal7TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal7TinasDown: { code: 'accSagittal7TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal8TinasUp: { code: 'accSagittal8TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal8TinasDown: { code: 'accSagittal8TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal9TinasUp: { code: 'accSagittal9TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal9TinasDown: { code: 'accSagittal9TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittalFractionalTinaUp: { code: 'accSagittalFractionalTinaUp', parenRightPaddingAdjustment: -1 },\n accSagittalFractionalTinaDown: { code: 'accSagittalFractionalTinaDown', parenRightPaddingAdjustment: -1 },\n accidentalNarrowReversedFlat: { code: 'accidentalNarrowReversedFlat', parenRightPaddingAdjustment: -1 },\n accidentalNarrowReversedFlatAndFlat: {\n code: 'accidentalNarrowReversedFlatAndFlat',\n parenRightPaddingAdjustment: -1,\n },\n accidentalWilsonPlus: { code: 'accidentalWilsonPlus', parenRightPaddingAdjustment: -1 },\n accidentalWilsonMinus: { code: 'accidentalWilsonMinus', parenRightPaddingAdjustment: -1 },\n};\n// Helps determine the layout of accidentals.\nconst accidentalColumns = {\n 1: {\n a: [1],\n b: [1],\n },\n 2: {\n a: [1, 2],\n },\n 3: {\n a: [1, 3, 2],\n b: [1, 2, 1],\n second_on_bottom: [1, 2, 3],\n },\n 4: {\n a: [1, 3, 4, 2],\n b: [1, 2, 3, 1],\n spaced_out_tetrachord: [1, 2, 1, 2],\n },\n 5: {\n a: [1, 3, 5, 4, 2],\n b: [1, 2, 4, 3, 1],\n spaced_out_pentachord: [1, 2, 3, 2, 1],\n very_spaced_out_pentachord: [1, 2, 1, 2, 1],\n },\n 6: {\n a: [1, 3, 5, 6, 4, 2],\n b: [1, 2, 4, 5, 3, 1],\n spaced_out_hexachord: [1, 3, 2, 1, 3, 2],\n very_spaced_out_hexachord: [1, 2, 1, 2, 1, 2],\n },\n};\nconst articulations = {\n 'a.': { code: 'augmentationDot', between_lines: true },\n av: {\n aboveCode: 'articStaccatissimoAbove',\n belowCode: 'articStaccatissimoBelow',\n between_lines: true,\n },\n 'a>': {\n aboveCode: 'articAccentAbove',\n belowCode: 'articAccentBelow',\n between_lines: true,\n },\n 'a-': {\n aboveCode: 'articTenutoAbove',\n belowCode: 'articTenutoBelow',\n between_lines: true,\n },\n 'a^': {\n aboveCode: 'articMarcatoAbove',\n belowCode: 'articMarcatoBelow',\n between_lines: false,\n },\n 'a+': { code: 'pluckedLeftHandPizzicato', between_lines: false },\n ao: {\n aboveCode: 'pluckedSnapPizzicatoAbove',\n belowCode: 'pluckedSnapPizzicatoBelow',\n between_lines: false,\n },\n ah: { code: 'stringsHarmonic', between_lines: false },\n 'a@': { aboveCode: 'fermataAbove', belowCode: 'fermataBelow', between_lines: false },\n 'a@a': { code: 'fermataAbove', between_lines: false },\n 'a@u': { code: 'fermataBelow', between_lines: false },\n 'a|': { code: 'stringsUpBow', between_lines: false },\n am: { code: 'stringsDownBow', between_lines: false },\n 'a,': { code: 'pictChokeCymbal', between_lines: false }, // Choked\n};\nconst ornaments = {\n mordent: { code: 'ornamentShortTrill' },\n mordent_inverted: { code: 'ornamentMordent' },\n turn: { code: 'ornamentTurn' },\n turn_inverted: { code: 'ornamentTurnSlash' },\n tr: { code: 'ornamentTrill' },\n upprall: { code: 'ornamentPrecompSlideTrillDAnglebert' },\n downprall: { code: 'ornamentPrecompDoubleCadenceUpperPrefix' },\n prallup: { code: 'ornamentPrecompTrillSuffixDandrieu' },\n pralldown: { code: 'ornamentPrecompTrillLowerSuffix' },\n upmordent: { code: 'ornamentPrecompSlideTrillBach' },\n downmordent: { code: 'ornamentPrecompDoubleCadenceUpperPrefixTurn' },\n lineprall: { code: 'ornamentPrecompAppoggTrill' },\n prallprall: { code: 'ornamentTremblement' },\n scoop: { code: 'brassScoop' },\n doit: { code: 'brassDoitMedium' },\n fall: { code: 'brassFallLipShort' },\n doitLong: { code: 'brassLiftMedium' },\n fallLong: { code: 'brassFallRoughMedium' },\n bend: { code: 'brassBend' },\n plungerClosed: { code: 'brassMuteClosed' },\n plungerOpen: { code: 'brassMuteOpen' },\n flip: { code: 'brassFlip' },\n jazzTurn: { code: 'brassJazzTurn' },\n smear: { code: 'brassSmear' },\n};\nexport class Tables {\n /**\n * @returns the `Font` object at the head of the music font stack.\n */\n static currentMusicFont() {\n if (Tables.MUSIC_FONT_STACK.length === 0) {\n throw new RuntimeError('NoFonts', 'The font stack is empty. See: await Flow.fetchMusicFont(...); Flow.setMusicFont(...).');\n }\n else {\n return Tables.MUSIC_FONT_STACK[0];\n }\n }\n static clefProperties(clef) {\n if (!clef || !(clef in clefs))\n throw new RuntimeError('BadArgument', 'Invalid clef: ' + clef);\n return clefs[clef];\n }\n /**\n * @param keyOctaveGlyph a string in the format \"key/octave\" (e.g., \"c/5\") or \"key/octave/custom-note-head-code\" (e.g., \"g/5/t3\").\n * @param clef\n * @param params a struct with one option, `octave_shift` for clef ottavation (0 = default; 1 = 8va; -1 = 8vb, etc.).\n * @returns properties for the specified note.\n */\n // eslint-disable-next-line\n static keyProperties(keyOctaveGlyph, clef = 'treble', params) {\n let options = { octave_shift: 0 };\n if (typeof params === 'object') {\n options = Object.assign(Object.assign({}, options), params);\n }\n const pieces = keyOctaveGlyph.split('/');\n if (pieces.length < 2) {\n throw new RuntimeError('BadArguments', `First argument must be note/octave or note/octave/glyph-code: ${keyOctaveGlyph}`);\n }\n const key = pieces[0].toUpperCase();\n const value = notesInfo[key];\n if (!value)\n throw new RuntimeError('BadArguments', 'Invalid key name: ' + key);\n if (value.octave)\n pieces[1] = value.octave.toString();\n let octave = parseInt(pieces[1], 10);\n // Octave_shift is the shift to compensate for clef 8va/8vb.\n octave += -1 * options.octave_shift;\n const baseIndex = octave * 7 - 4 * 7;\n let line = (baseIndex + value.index) / 2;\n line += Tables.clefProperties(clef).line_shift;\n let stroke = 0;\n if (line <= 0 && (line * 2) % 2 === 0)\n stroke = 1; // stroke up\n if (line >= 6 && (line * 2) % 2 === 0)\n stroke = -1; // stroke down\n // Integer value for note arithmetic.\n const int_value = typeof value.int_val !== 'undefined' ? octave * 12 + value.int_val : undefined;\n // If the user specified a glyph, overwrite the glyph code.\n const code = value.code;\n const shift_right = value.shift_right;\n let customNoteHeadProps = {};\n if (pieces.length > 2 && pieces[2]) {\n const glyphName = pieces[2].toUpperCase();\n customNoteHeadProps = customNoteHeads[glyphName] || {};\n }\n return Object.assign({ key,\n octave,\n line,\n int_value, accidental: value.accidental, code,\n stroke,\n shift_right, displaced: false }, customNoteHeadProps);\n }\n static integerToNote(integer) {\n if (typeof integer === 'undefined' || integer < 0 || integer > 11) {\n throw new RuntimeError('BadArguments', `integerToNote() requires an integer in the range [0, 11]: ${integer}`);\n }\n const table = {\n 0: 'C',\n 1: 'C#',\n 2: 'D',\n 3: 'D#',\n 4: 'E',\n 5: 'F',\n 6: 'F#',\n 7: 'G',\n 8: 'G#',\n 9: 'A',\n 10: 'A#',\n 11: 'B',\n };\n const noteValue = table[integer];\n if (!noteValue) {\n throw new RuntimeError('BadArguments', `Unknown note value for integer: ${integer}`);\n }\n return noteValue;\n }\n static tabToGlyph(fret, scale = 1.0) {\n let glyph = undefined;\n let width = 0;\n let shift_y = 0;\n if (fret.toUpperCase() === 'X') {\n const glyphMetrics = new Glyph('accidentalDoubleSharp', Tables.TABLATURE_FONT_SCALE).getMetrics();\n glyph = 'accidentalDoubleSharp';\n if (glyphMetrics.width == undefined || glyphMetrics.height == undefined)\n throw new RuntimeError('InvalidMetrics', 'Width and height required');\n width = glyphMetrics.width;\n shift_y = -glyphMetrics.height / 2;\n }\n else {\n width = Tables.textWidth(fret);\n }\n return {\n text: fret,\n code: glyph,\n getWidth: () => width * scale,\n shift_y,\n };\n }\n // Used by annotation.ts and bend.ts. Clearly this implementation only works for the default font size.\n // TODO: The actual width depends on the font family, size, weight, style.\n static textWidth(text) {\n return 7 * text.toString().length;\n }\n static articulationCodes(artic) {\n return articulations[artic];\n }\n static accidentalCodes(acc) {\n return accidentals[acc];\n }\n static ornamentCodes(acc) {\n return ornaments[acc];\n }\n static keySignature(spec) {\n const keySpec = keySignatures[spec];\n if (!keySpec) {\n throw new RuntimeError('BadKeySignature', `Bad key signature spec: '${spec}'`);\n }\n if (!keySpec.acc) {\n return [];\n }\n const accidentalList = {\n b: [2, 0.5, 2.5, 1, 3, 1.5, 3.5],\n '#': [0, 1.5, -0.5, 1, 2.5, 0.5, 2],\n };\n const notes = accidentalList[keySpec.acc];\n const acc_list = [];\n for (let i = 0; i < keySpec.num; ++i) {\n const line = notes[i];\n acc_list.push({ type: keySpec.acc, line });\n }\n return acc_list;\n }\n static getKeySignatures() {\n return keySignatures;\n }\n static hasKeySignature(spec) {\n return spec in keySignatures;\n }\n /**\n * Convert duration aliases to the number based duration.\n * If the input isn't an alias, simply return the input.\n * @param duration\n * @returns Example: 'q' -> '4', '8' -> '8'\n */\n static sanitizeDuration(duration) {\n const durationNumber = durationAliases[duration];\n if (durationNumber !== undefined) {\n duration = durationNumber;\n }\n if (durations[duration] === undefined) {\n throw new RuntimeError('BadArguments', `The provided duration is not valid: ${duration}`);\n }\n return duration;\n }\n /** Convert the `duration` to a fraction. */\n static durationToFraction(duration) {\n return new Fraction().parse(Tables.sanitizeDuration(duration));\n }\n /** Convert the `duration` to a number. */\n static durationToNumber(duration) {\n return Tables.durationToFraction(duration).value();\n }\n /* Convert the `duration` to total ticks. */\n static durationToTicks(duration) {\n duration = Tables.sanitizeDuration(duration);\n const ticks = durations[duration];\n if (ticks === undefined) {\n throw new RuntimeError('InvalidDuration');\n }\n return ticks;\n }\n // Return a glyph given duration and type. The type can be a custom glyph code from customNoteHeads.\n // The default type is a regular note ('n').\n // eslint-disable-next-line\n static getGlyphProps(duration, type = 'n') {\n duration = Tables.sanitizeDuration(duration);\n // Lookup duration for default glyph head code\n const code = durationCodes[duration];\n if (code === undefined) {\n return undefined;\n }\n // Get glyph properties for 'type' from duration string (note, rest, harmonic, muted, slash)\n let glyphTypeProperties = code.type[type];\n // If this isn't a standard type, then lookup the custom note head map.\n if (glyphTypeProperties === undefined) {\n // Try and get it from the custom list of note heads\n const customGlyphTypeProperties = customNoteHeads[type.toUpperCase()];\n // If not, then return with nothing.\n if (customGlyphTypeProperties === undefined) {\n return undefined;\n }\n // Otherwise set it as the code_head value\n glyphTypeProperties = Object.assign({ code_head: customGlyphTypeProperties.code }, customGlyphTypeProperties);\n }\n const code_head = glyphTypeProperties.code_head;\n // The default implementation of getWidth() calls Glyph.getWidth(code_head, scale).\n // This can be overridden by an individual glyph type (see slash noteheads below: Tables.SLASH_NOTEHEAD_WIDTH).\n const getWidth = (scale = Tables.NOTATION_FONT_SCALE) => Glyph.getWidth(code_head, scale);\n // Merge duration props for 'duration' with the note head properties.\n return Object.assign(Object.assign(Object.assign({}, code.common), { getWidth: getWidth }), glyphTypeProperties);\n }\n}\nTables.STEM_WIDTH = 1.5;\nTables.STEM_HEIGHT = 35;\nTables.STAVE_LINE_THICKNESS = 1;\nTables.RESOLUTION = RESOLUTION;\n/**\n * Customize this by calling Flow.setMusicFont(...fontNames);\n */\nTables.MUSIC_FONT_STACK = [];\nTables.NOTATION_FONT_SCALE = 39;\nTables.TABLATURE_FONT_SCALE = 39;\nTables.SLASH_NOTEHEAD_WIDTH = 15;\nTables.STAVE_LINE_DISTANCE = 10;\n// HACK:\n// Since text origins are positioned at the baseline, we must\n// compensate for the ascender of the text. Of course, 1 staff space is\n// a very poor approximation.\n//\n// This will be deprecated in the future. This is a temporary solution until\n// we have more robust text metrics.\nTables.TEXT_HEIGHT_OFFSET_HACK = 1;\nTables.accidentalMap = accidentals;\nTables.accidentalColumnsTable = accidentalColumns;\nTables.unicode = {\n // ♯ accidental sharp\n sharp: String.fromCharCode(0x266f),\n // ♭ accidental flat\n flat: String.fromCharCode(0x266d),\n // ♮ accidental natural\n natural: String.fromCharCode(0x266e),\n // △ major seventh\n triangle: String.fromCharCode(0x25b3),\n // ø half-diminished\n 'o-with-slash': String.fromCharCode(0x00f8),\n // ° diminished\n degrees: String.fromCharCode(0x00b0),\n // ○ diminished\n circle: String.fromCharCode(0x25cb),\n};\n/* The list of valid note types. Used by note.ts during parseNoteStruct(). */\nTables.validTypes = validNoteTypes;\n// Default time signature.\nTables.TIME4_4 = {\n num_beats: 4,\n beat_value: 4,\n resolution: RESOLUTION,\n};\n// 1/2, 1, 2, 4, 8, 16, 32, 64, 128\n// NOTE: There is no 256 here! However, there are other mentions of 256 in this file.\n// For example, in durations has a 256 key, and sanitizeDuration() can return 256.\n// The sanitizeDuration() bit may need to be removed by 0xfe.\n// eslint-disable-next-line\nconst durationCodes = {\n '1/2': {\n common: {\n stem: false,\n stem_offset: 0,\n flag: false,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Breve note\n code_head: 'noteheadDoubleWhole',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDoubleWhole', scale);\n // },\n },\n h: {\n // Breve note harmonic\n code_head: 'unpitchedPercussionClef1',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('unpitchedPercussionClef1', scale);\n // },\n },\n m: {\n // Breve note muted\n code_head: 'vexNoteHeadMutedBreve',\n stem_offset: 0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('vexNoteHeadMutedBreve', scale);\n // },\n },\n r: {\n // Breve rest\n code_head: 'restDoubleWhole',\n rest: true,\n position: 'B/5',\n dot_shiftY: 0.5,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('restDoubleWhole', scale);\n // },\n },\n s: {\n // Breve note slash -\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadDoubleWhole',\n },\n },\n },\n 1: {\n common: {\n stem: false,\n stem_offset: 0,\n flag: false,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Whole note\n code_head: 'noteheadWhole',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadWhole', scale);\n // },\n },\n h: {\n // Whole note harmonic\n code_head: 'noteheadDiamondWhole',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondWhole', scale);\n // },\n },\n m: {\n // Whole note muted\n code_head: 'noteheadXWhole',\n stem_offset: -3,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXWhole', scale);\n // },\n },\n r: {\n // Whole rest\n code_head: 'restWhole',\n rest: true,\n position: 'D/5',\n dot_shiftY: 0.5,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('restWhole', scale);\n // },\n },\n s: {\n // Whole note slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadWhole',\n },\n },\n },\n 2: {\n common: {\n stem: true,\n stem_offset: 0,\n flag: false,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Half note\n code_head: 'noteheadHalf',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadHalf', scale);\n // },\n },\n h: {\n // Half note harmonic\n code_head: 'noteheadDiamondHalf',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondHalf', scale);\n // },\n },\n m: {\n // Half note muted\n code_head: 'noteheadXHalf',\n stem_offset: -3,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXHalf', scale);\n // },\n },\n r: {\n // Half rest\n code_head: 'restHalf',\n stem: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('restHalf', scale);\n // },\n },\n s: {\n // Half note slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadHalf',\n },\n },\n },\n 4: {\n common: {\n stem: true,\n stem_offset: 0,\n flag: false,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Quarter note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Quarter harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Quarter muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Quarter rest\n code_head: 'restQuarter',\n stem: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n line_above: 1.5,\n line_below: 1.5,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('restQuarter', scale);\n // },\n },\n s: {\n // Quarter slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 8: {\n common: {\n stem: true,\n stem_offset: 0,\n flag: true,\n beam_count: 1,\n stem_beam_extension: 0,\n code_flag_upstem: 'flag8thUp',\n code_flag_downstem: 'flag8thDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Eighth note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Eighth note harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Eighth note muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Eighth rest\n code_head: 'rest8th',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n line_above: 1.0,\n line_below: 1.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest8th', scale);\n // },\n },\n s: {\n // Eighth slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 16: {\n common: {\n beam_count: 2,\n stem_beam_extension: 0,\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'flag16thUp',\n code_flag_downstem: 'flag16thDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Sixteenth note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Sixteenth note harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Sixteenth note muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Sixteenth rest\n code_head: 'rest16th',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n line_above: 1.0,\n line_below: 2.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest16th', scale);\n // },\n },\n s: {\n // Sixteenth slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 32: {\n common: {\n beam_count: 3,\n stem_beam_extension: 7.5,\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'flag32ndUp',\n code_flag_downstem: 'flag32ndDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Thirty-second note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Thirty-second harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Thirty-second muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Thirty-second rest\n code_head: 'rest32nd',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -1.5,\n line_above: 2.0,\n line_below: 2.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest32nd', scale);\n // },\n },\n s: {\n // Thirty-second slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 64: {\n common: {\n beam_count: 4,\n stem_beam_extension: 15,\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'flag64thUp',\n code_flag_downstem: 'flag64thDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Sixty-fourth note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Sixty-fourth harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Sixty-fourth muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Sixty-fourth rest\n code_head: 'rest64th',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -1.5,\n line_above: 2.0,\n line_below: 3.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest64th', scale);\n // },\n },\n s: {\n // Sixty-fourth slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 128: {\n common: {\n beam_count: 5,\n stem_beam_extension: 22.5,\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'flag128thUp',\n code_flag_downstem: 'flag128thDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Hundred-twenty-eight note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Hundred-twenty-eight harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Hundred-twenty-eight muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Hundred-twenty-eight rest\n code_head: 'rest128th',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -2.5,\n line_above: 3.0,\n line_below: 3.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest128th', scale);\n // },\n },\n s: {\n // Hundred-twenty-eight slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// The file implements notes for Tablature notation. This consists of one or\n// more fret positions, and can either be drawn with or without stems.\n//\n// See `tests/tabnote_tests.ts` for usage examples.\nimport { Font } from './font';\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { StemmableNote } from './stemmablenote';\nimport { Tables } from './tables';\nimport { Category, isDot } from './typeguard';\nimport { defined, RuntimeError } from './util';\n// Gets the unused strings grouped together if consecutive.\n//\n// Parameters:\n// * num_lines - The number of lines\n// * strings_used - An array of numbers representing which strings have fret positions\nfunction getUnusedStringGroups(num_lines, strings_used) {\n const stem_through = [];\n let group = [];\n for (let string = 1; string <= num_lines; string++) {\n const is_used = strings_used.indexOf(string) > -1;\n if (!is_used) {\n group.push(string);\n }\n else {\n stem_through.push(group);\n group = [];\n }\n }\n if (group.length > 0)\n stem_through.push(group);\n return stem_through;\n}\n// Gets groups of points that outline the partial stem lines\n// between fret positions\n//\n// Parameters:\n// * stem_Y - The `y` coordinate the stem is located on\n// * unused_strings - An array of groups of unused strings\n// * stave - The stave to use for reference\n// * stem_direction - The direction of the stem\nfunction getPartialStemLines(stem_y, unused_strings, stave, stem_direction) {\n const up_stem = stem_direction !== 1;\n const down_stem = stem_direction !== -1;\n const line_spacing = stave.getSpacingBetweenLines();\n const total_lines = stave.getNumLines();\n const stem_lines = [];\n unused_strings.forEach((strings) => {\n const containsLastString = strings.indexOf(total_lines) > -1;\n const containsFirstString = strings.indexOf(1) > -1;\n if ((up_stem && containsFirstString) || (down_stem && containsLastString)) {\n return;\n }\n // If there's only one string in the group, push a duplicate value.\n // We do this because we need 2 strings to convert into upper/lower y\n // values.\n if (strings.length === 1) {\n strings.push(strings[0]);\n }\n const line_ys = [];\n // Iterate through each group string and store it's y position\n strings.forEach((string, index, strings) => {\n const isTopBound = string === 1;\n const isBottomBound = string === total_lines;\n // Get the y value for the appropriate staff line,\n // we adjust for a 0 index array, since string numbers are index 1\n let y = stave.getYForLine(string - 1);\n // Unless the string is the first or last, add padding to each side\n // of the line\n if (index === 0 && !isTopBound) {\n y -= line_spacing / 2 - 1;\n }\n else if (index === strings.length - 1 && !isBottomBound) {\n y += line_spacing / 2 - 1;\n }\n // Store the y value\n line_ys.push(y);\n // Store a subsequent y value connecting this group to the main\n // stem above/below the stave if it's the top/bottom string\n if (stem_direction === 1 && isTopBound) {\n line_ys.push(stem_y - 2);\n }\n else if (stem_direction === -1 && isBottomBound) {\n line_ys.push(stem_y + 2);\n }\n });\n // Add the sorted y values to the\n stem_lines.push(line_ys.sort((a, b) => a - b));\n });\n return stem_lines;\n}\nexport class TabNote extends StemmableNote {\n // Initialize the TabNote with a `noteStruct` full of properties\n // and whether to `draw_stem` when rendering the note\n constructor(noteStruct, draw_stem = false) {\n super(noteStruct);\n this.glyphs = [];\n // Return the number of the greatest string, which is the string lowest on the display\n this.greatestString = () => {\n return this.positions.map((x) => x.str).reduce((a, b) => (a > b ? a : b));\n };\n // Return the number of the least string, which is the string highest on the display\n this.leastString = () => {\n return this.positions.map((x) => x.str).reduce((a, b) => (a < b ? a : b));\n };\n this.ghost = false; // Renders parenthesis around notes\n // Note properties\n // The fret positions in the note. An array of `{ str: X, fret: X }`\n this.positions = noteStruct.positions || [];\n // Render Options\n this.render_options = Object.assign(Object.assign({}, this.render_options), { \n // font size for note heads and rests\n glyph_font_scale: Tables.TABLATURE_FONT_SCALE, \n // Flag to draw a stem\n draw_stem, \n // Flag to draw dot modifiers\n draw_dots: draw_stem, \n // Flag to extend the main stem through the stave and fret positions\n draw_stem_through_stave: false, \n // vertical shift from stave line\n y_shift: 0, \n // normal glyph scale\n scale: 1.0, \n // default tablature font\n font: `${Font.SIZE}pt ${Font.SANS_SERIF}` });\n this.glyph = Tables.getGlyphProps(this.duration, this.noteType);\n defined(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`);\n this.buildStem();\n if (noteStruct.stem_direction) {\n this.setStemDirection(noteStruct.stem_direction);\n }\n else {\n this.setStemDirection(Stem.UP);\n }\n // Renders parenthesis around notes\n this.ghost = false;\n this.updateWidth();\n }\n static get CATEGORY() {\n return Category.TabNote;\n }\n reset() {\n super.reset();\n if (this.stave)\n this.setStave(this.stave);\n return this;\n }\n // Set as ghost `TabNote`, surrounds the fret positions with parenthesis.\n // Often used for indicating frets that are being bent to\n setGhost(ghost) {\n this.ghost = ghost;\n this.updateWidth();\n return this;\n }\n // Determine if the note has a stem\n hasStem() {\n if (this.render_options.draw_stem)\n return true;\n return false;\n }\n // Get the default stem extension for the note\n getStemExtension() {\n if (this.stem_extension_override != null) {\n return this.stem_extension_override;\n }\n if (this.flag) {\n return this.getStemDirection() === 1 ? -this.flag.checkMetrics().y_shift : this.flag.checkMetrics().y_shift;\n }\n return 0;\n }\n // Calculate and store the width of the note\n updateWidth() {\n this.glyphs = [];\n this.width = 0;\n for (let i = 0; i < this.positions.length; ++i) {\n let fret = this.positions[i].fret;\n if (this.ghost)\n fret = '(' + fret + ')';\n const glyph = Tables.tabToGlyph(fret.toString(), this.render_options.scale);\n this.glyphs.push(glyph);\n this.width = Math.max(glyph.getWidth(), this.width);\n }\n // For some reason we associate a notehead glyph with a TabNote, and this\n // glyph is used for certain width calculations. Of course, this is totally\n // incorrect since a notehead is a poor approximation for the dimensions of\n // a fret number which can have multiple digits. As a result, we must\n // overwrite getWidth() to return the correct width\n this.glyph.getWidth = () => this.width;\n }\n // Set the `stave` to the note\n setStave(stave) {\n super.setStave(stave);\n const ctx = stave.getContext();\n this.setContext(ctx);\n // Calculate the fret number width based on font used\n if (ctx) {\n this.width = 0;\n for (let i = 0; i < this.glyphs.length; ++i) {\n const glyph = this.glyphs[i];\n const text = '' + glyph.text;\n if (text.toUpperCase() !== 'X') {\n ctx.save();\n ctx.setFont(this.render_options.font);\n glyph.width = ctx.measureText(text).width;\n ctx.restore();\n glyph.getWidth = () => glyph.width;\n }\n this.width = Math.max(glyph.getWidth(), this.width);\n }\n this.glyph.getWidth = () => this.width;\n }\n // we subtract 1 from `line` because getYForLine expects a 0-based index,\n // while the position.str is a 1-based index\n const ys = this.positions.map(({ str: line }) => stave.getYForLine(Number(line) - 1));\n this.setYs(ys);\n if (this.stem) {\n this.stem.setYBounds(this.getStemY(), this.getStemY());\n }\n return this;\n }\n // Get the fret positions for the note\n getPositions() {\n return this.positions;\n }\n // Get the default `x` and `y` coordinates for a modifier at a specific\n // `position` at a fret position `index`\n getModifierStartXY(position, index) {\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call GetModifierStartXY on an unformatted note\");\n }\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', 'No Y-Values calculated for this note.');\n }\n let x = 0;\n if (position === Modifier.Position.LEFT) {\n x = -1 * 2; // FIXME: modifier padding, move to font file\n }\n else if (position === Modifier.Position.RIGHT) {\n x = this.width + 2; // FIXME: modifier padding, move to font file\n }\n else if (position === Modifier.Position.BELOW || position === Modifier.Position.ABOVE) {\n const note_glyph_width = this.glyph.getWidth();\n x = note_glyph_width / 2;\n }\n return {\n x: this.getAbsoluteX() + x,\n y: this.ys[index],\n };\n }\n // Get the default line for rest\n getLineForRest() {\n return Number(this.positions[0].str);\n }\n // Pre-render formatting\n preFormat() {\n if (this.preFormatted)\n return;\n if (this.modifierContext)\n this.modifierContext.preFormat();\n // width is already set during init()\n this.preFormatted = true;\n }\n // Get the x position for the stem\n getStemX() {\n return this.getCenterGlyphX();\n }\n // Get the y position for the stem\n getStemY() {\n const num_lines = this.checkStave().getNumLines();\n // The decimal staff line amounts provide optimal spacing between the\n // fret number and the stem\n const stemUpLine = -0.5;\n const stemDownLine = num_lines - 0.5;\n const stemStartLine = Stem.UP === this.stem_direction ? stemUpLine : stemDownLine;\n return this.checkStave().getYForLine(stemStartLine);\n }\n // Get the stem extents for the tabnote\n getStemExtents() {\n return this.checkStem().getExtents();\n }\n // Draw the fal onto the context\n drawFlag() {\n const { beam, glyph, stem_direction, render_options: { draw_stem, glyph_font_scale }, } = this;\n const context = this.checkContext();\n const shouldDrawFlag = beam == undefined && draw_stem;\n // Now it's the flag's turn.\n if (glyph.flag && shouldDrawFlag) {\n const flag_x = this.getStemX() + 1;\n const flag_y = this.getStemY() - this.checkStem().getHeight();\n const flag_code = stem_direction === Stem.DOWN\n ? glyph.code_flag_downstem // Down stems have flags on the left.\n : glyph.code_flag_upstem;\n // Draw the Flag\n Glyph.renderGlyph(context, flag_x, flag_y, glyph_font_scale, flag_code, { category: 'flag.tabStem' });\n }\n }\n // Render the modifiers onto the context.\n drawModifiers() {\n this.modifiers.forEach((modifier) => {\n // Only draw the dots if enabled.\n if (isDot(modifier) && !this.render_options.draw_dots) {\n return;\n }\n modifier.setContext(this.getContext());\n modifier.drawWithStyle();\n });\n }\n // Render the stem extension through the fret positions\n drawStemThrough() {\n const stemX = this.getStemX();\n const stemY = this.getStemY();\n const ctx = this.checkContext();\n const drawStem = this.render_options.draw_stem;\n const stemThrough = this.render_options.draw_stem_through_stave;\n if (drawStem && stemThrough) {\n const numLines = this.checkStave().getNumLines();\n const stringsUsed = this.positions.map((position) => Number(position.str));\n const unusedStrings = getUnusedStringGroups(numLines, stringsUsed);\n const stemLines = getPartialStemLines(stemY, unusedStrings, this.checkStave(), this.getStemDirection());\n ctx.save();\n ctx.setLineWidth(Stem.WIDTH);\n stemLines.forEach((bounds) => {\n if (bounds.length === 0)\n return;\n ctx.beginPath();\n ctx.moveTo(stemX, bounds[0]);\n ctx.lineTo(stemX, bounds[bounds.length - 1]);\n ctx.stroke();\n ctx.closePath();\n });\n ctx.restore();\n }\n }\n // Render the fret positions onto the context\n drawPositions() {\n const ctx = this.checkContext();\n const x = this.getAbsoluteX();\n const ys = this.ys;\n for (let i = 0; i < this.positions.length; ++i) {\n const y = ys[i] + this.render_options.y_shift;\n const glyph = this.glyphs[i];\n // Center the fret text beneath the notation note head\n const note_glyph_width = this.glyph.getWidth();\n const tab_x = x + note_glyph_width / 2 - glyph.getWidth() / 2;\n // FIXME: Magic numbers.\n ctx.clearRect(tab_x - 2, y - 3, glyph.getWidth() + 4, 6);\n if (glyph.code) {\n Glyph.renderGlyph(ctx, tab_x, y, this.render_options.glyph_font_scale * this.render_options.scale, glyph.code);\n }\n else {\n ctx.save();\n ctx.setFont(this.render_options.font);\n const text = glyph.text.toString();\n ctx.fillText(text, tab_x, y + 5 * this.render_options.scale);\n ctx.restore();\n }\n }\n }\n // The main rendering function for the entire note.\n draw() {\n const ctx = this.checkContext();\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', \"Can't draw note without Y values.\");\n }\n this.setRendered();\n const render_stem = this.beam == undefined && this.render_options.draw_stem;\n ctx.openGroup('tabnote', undefined, { pointerBBox: true });\n this.drawPositions();\n this.drawStemThrough();\n if (this.stem && render_stem) {\n const stem_x = this.getStemX();\n this.stem.setNoteHeadXBounds(stem_x, stem_x);\n ctx.openGroup('stem', undefined, { pointerBBox: true });\n this.stem.setContext(ctx).draw();\n ctx.closeGroup();\n }\n this.drawFlag();\n this.drawModifiers();\n ctx.closeGroup();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// This class implements varies types of ties between contiguous notes. The\n// ties include: regular ties, hammer ons, pull offs, and slides.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { TabTie } from './tabtie';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class TabSlide extends TabTie {\n /**\n * @param notes is a struct of the form:\n * {\n * first_note: Note,\n * last_note: Note,\n * first_indices: [n1, n2, n3],\n * last_indices: [n1, n2, n3]\n * }\n * @param notes.first_note the starting note of the slide\n * @param notes.last_note the ending note of the slide\n * @param notes.first_indices specifies which string + fret positions of the TabNote are used in this slide. zero indexed.\n * @param notes.last_indices currently unused. we assume it's the same as first_indices.\n *\n * @param direction TabSlide.SLIDE_UP or TabSlide.SLIDE_DOWN\n */\n constructor(notes, direction) {\n super(notes, 'sl.');\n // Determine the direction automatically if it is not provided.\n if (!direction) {\n let first_fret = notes.first_note.getPositions()[0].fret;\n if (typeof first_fret === 'string') {\n first_fret = parseInt(first_fret, 10);\n }\n let last_fret = notes.last_note.getPositions()[0].fret;\n if (typeof last_fret === 'string') {\n last_fret = parseInt(last_fret, 10);\n }\n // If either of the frets are 'X', parseInt() above will return NaN.\n // Choose TabSlide.SLIDE_UP by default.\n if (isNaN(first_fret) || isNaN(last_fret)) {\n direction = TabSlide.SLIDE_UP;\n }\n else {\n direction = first_fret > last_fret ? TabSlide.SLIDE_DOWN : TabSlide.SLIDE_UP;\n }\n }\n this.direction = direction;\n this.render_options.cp1 = 11;\n this.render_options.cp2 = 14;\n this.render_options.y_shift = 0.5;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.TabSlide;\n }\n static get SLIDE_UP() {\n return 1;\n }\n static get SLIDE_DOWN() {\n return -1;\n }\n static createSlideUp(notes) {\n return new TabSlide(notes, TabSlide.SLIDE_UP);\n }\n static createSlideDown(notes) {\n return new TabSlide(notes, TabSlide.SLIDE_DOWN);\n }\n renderTie(params) {\n if (params.first_ys.length === 0 || params.last_ys.length === 0) {\n throw new RuntimeError('BadArguments', 'No Y-values to render');\n }\n const ctx = this.checkContext();\n const first_x_px = params.first_x_px;\n const first_ys = params.first_ys;\n const last_x_px = params.last_x_px;\n const direction = params.direction;\n if (direction !== TabSlide.SLIDE_UP && direction !== TabSlide.SLIDE_DOWN) {\n throw new RuntimeError('BadSlide', 'Invalid slide direction');\n }\n // eslint-disable-next-line\n const first_indices = this.notes.first_indices;\n for (let i = 0; i < first_indices.length; ++i) {\n const slide_y = first_ys[first_indices[i]] + this.render_options.y_shift;\n if (isNaN(slide_y)) {\n throw new RuntimeError('BadArguments', 'Bad indices for slide rendering.');\n }\n ctx.beginPath();\n ctx.moveTo(first_x_px, slide_y + 3 * direction);\n ctx.lineTo(last_x_px, slide_y - 3 * direction);\n ctx.closePath();\n ctx.stroke();\n }\n this.setRendered();\n }\n}\nTabSlide.TEXT_FONT = {\n family: Font.SERIF,\n size: 10,\n weight: FontWeight.BOLD,\n style: FontStyle.ITALIC,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { Stave } from './stave';\nimport { Category } from './typeguard';\nexport class TabStave extends Stave {\n static get CATEGORY() {\n return Category.TabStave;\n }\n constructor(x, y, width, options) {\n const tab_options = Object.assign({ spacing_between_lines_px: 13, num_lines: 6, top_text_position: 1 }, options);\n super(x, y, width, tab_options);\n }\n getYForGlyphs() {\n return this.getYForLine(2.5);\n }\n // Deprecated\n addTabGlyph() {\n this.addClef('tab');\n return this;\n }\n}\n","// / [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This class implements varies types of ties between contiguous notes. The\n// ties include: regular ties, hammer ons, pull offs, and slides.\nimport { StaveTie } from './stavetie';\nimport { Category } from './typeguard';\nexport class TabTie extends StaveTie {\n static get CATEGORY() {\n return Category.TabTie;\n }\n static createHammeron(notes) {\n return new TabTie(notes, 'H');\n }\n static createPulloff(notes) {\n return new TabTie(notes, 'P');\n }\n /**\n * @param notes is a struct that has:\n * {\n * first_note: Note,\n * last_note: Note,\n * first_indices: [n1, n2, n3],\n * last_indices: [n1, n2, n3]\n * }\n *\n * @param text\n */\n constructor(notes, text) {\n super(notes, text);\n this.render_options.cp1 = 9;\n this.render_options.cp2 = 11;\n this.render_options.y_shift = 3;\n this.direction = -1; // Tab tie's are always face up.\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Cyril Silverman\n//\n// This file implements `TextBrackets` which extend between two notes.\n// The octave transposition markings (8va, 8vb, 15va, 15vb) can be created\n// using this class.\nimport { Element } from './element';\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Renderer } from './renderer';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { log, RuntimeError } from './util';\n// To enable logging for this class. Set `Vex.Flow.TextBracket.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (TextBracket.DEBUG)\n log('Vex.Flow.TextBracket', args);\n}\nexport var TextBracketPosition;\n(function (TextBracketPosition) {\n TextBracketPosition[TextBracketPosition[\"TOP\"] = 1] = \"TOP\";\n TextBracketPosition[TextBracketPosition[\"BOTTOM\"] = -1] = \"BOTTOM\";\n})(TextBracketPosition || (TextBracketPosition = {}));\nexport class TextBracket extends Element {\n constructor({ start, stop, text = '', superscript = '', position = TextBracketPosition.TOP }) {\n super();\n this.start = start;\n this.stop = stop;\n this.text = text;\n this.superscript = superscript;\n this.position = typeof position === 'string' ? TextBracket.PositionString[position] : position;\n this.line = 1;\n this.resetFont();\n this.render_options = {\n dashed: true,\n dash: [5],\n color: 'black',\n line_width: 1,\n show_bracket: true,\n bracket_height: 8,\n // In the BOTTOM position, the bracket line can extend\n // under the superscript.\n underline_superscript: true,\n };\n }\n static get CATEGORY() {\n return Category.TextBracket;\n }\n static get Position() {\n return TextBracketPosition;\n }\n static get PositionString() {\n return {\n top: TextBracketPosition.TOP,\n bottom: TextBracketPosition.BOTTOM,\n };\n }\n /**\n * @deprecated Use `TextBracket.Position` instead.\n */\n static get Positions() {\n L('Positions is deprecated, use TextBracketPosition instead.');\n return TextBracketPosition;\n }\n /**\n * @deprecated Use `TextBracket.PositionString` instead.\n */\n static get PositionsString() {\n L('PositionsString is deprecated, use PositionString instead.');\n return TextBracket.PositionString;\n }\n /**\n * Apply the text backet styling to the provided context.\n * @param ctx\n * @returns this\n */\n applyStyle(ctx) {\n ctx.setFont(this.font);\n const options = this.render_options;\n ctx.setStrokeStyle(options.color);\n ctx.setFillStyle(options.color);\n ctx.setLineWidth(options.line_width);\n return this;\n }\n // Set whether the bracket line should be `dashed`. You can also\n // optionally set the `dash` pattern by passing in an array of numbers\n setDashed(dashed, dash) {\n this.render_options.dashed = dashed;\n if (dash)\n this.render_options.dash = dash;\n return this;\n }\n // Set the rendering `context` for the octave bracket\n setLine(line) {\n this.line = line;\n return this;\n }\n // Draw the octave bracket on the rendering context\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n let y = 0;\n switch (this.position) {\n case TextBracketPosition.TOP:\n y = this.start.checkStave().getYForTopText(this.line);\n break;\n case TextBracketPosition.BOTTOM:\n y = this.start.checkStave().getYForBottomText(this.line + Tables.TEXT_HEIGHT_OFFSET_HACK);\n break;\n default:\n throw new RuntimeError('InvalidPosition', `The position ${this.position} is invalid.`);\n }\n // Get the preliminary start and stop coordintates for the bracket\n const start = { x: this.start.getAbsoluteX(), y };\n const stop = { x: this.stop.getAbsoluteX(), y };\n L('Rendering TextBracket: start:', start, 'stop:', stop, 'y:', y);\n const bracket_height = this.render_options.bracket_height * this.position;\n ctx.save();\n this.applyStyle(ctx);\n // Draw text\n ctx.fillText(this.text, start.x, start.y);\n // Get the width and height for the octave number\n const main_measure = ctx.measureText(this.text);\n const main_width = main_measure.width;\n const main_height = main_measure.height;\n // Calculate the y position for the super script\n const super_y = start.y - main_height / 2.5;\n // We called this.resetFont() in the constructor, so we know this.textFont is available.\n // eslint-disable-next-line\n const { family, size, weight, style } = this.textFont;\n // To draw the superscript, we scale the font size by 1/1.4.\n const smallerFontSize = Font.scaleSize(size, 0.714286);\n ctx.setFont(family, smallerFontSize, weight, style);\n ctx.fillText(this.superscript, start.x + main_width + 1, super_y);\n // Determine width and height of the superscript\n const super_measure = ctx.measureText(this.superscript);\n const super_width = super_measure.width;\n const super_height = super_measure.height;\n // Setup initial coordinates for the bracket line\n let start_x = start.x;\n let line_y = super_y;\n const end_x = stop.x + this.stop.getGlyph().getWidth();\n // Adjust x and y coordinates based on position\n if (this.position === TextBracketPosition.TOP) {\n start_x += main_width + super_width + 5;\n line_y -= super_height / 2.7;\n }\n else if (this.position === TextBracketPosition.BOTTOM) {\n line_y += super_height / 2.7;\n start_x += main_width + 2;\n if (!this.render_options.underline_superscript) {\n start_x += super_width;\n }\n }\n if (this.render_options.dashed) {\n // Main line\n Renderer.drawDashedLine(ctx, start_x, line_y, end_x, line_y, this.render_options.dash);\n // Ending Bracket\n if (this.render_options.show_bracket) {\n Renderer.drawDashedLine(ctx, end_x, line_y + 1 * this.position, end_x, line_y + bracket_height, this.render_options.dash);\n }\n }\n else {\n ctx.beginPath();\n ctx.moveTo(start_x, line_y);\n // Main line\n ctx.lineTo(end_x, line_y);\n if (this.render_options.show_bracket) {\n // Ending bracket\n ctx.lineTo(end_x, line_y + bracket_height);\n }\n ctx.stroke();\n ctx.closePath();\n }\n ctx.restore();\n }\n}\nTextBracket.DEBUG = false;\nTextBracket.TEXT_FONT = {\n family: Font.SERIF,\n size: 15,\n weight: FontWeight.NORMAL,\n style: FontStyle.ITALIC,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Category } from './typeguard';\nimport { defined, log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (TextDynamics.DEBUG)\n log('Vex.Flow.TextDynamics', args);\n}\n/**\n * `TextDynamics` renders traditional\n * text dynamics markings, **ie: p, f, sfz, rfz, ppp**\n *\n * You can render any dynamics string that contains a combination of\n * the following letters: P, M, F, Z, R, S\n */\nexport class TextDynamics extends Note {\n /**\n * Create the dynamics marking.\n *\n * A `TextDynamics` object inherits from `Note` so that it can be formatted\n * within a `Voice`.\n *\n * @param noteStruct an object that contains a `duration` property and a\n * `sequence` of letters that represents the letters to render.\n */\n constructor(noteStruct) {\n super(noteStruct);\n this.sequence = (noteStruct.text || '').toLowerCase();\n this.line = noteStruct.line || 0;\n this.glyphs = [];\n this.render_options = Object.assign(Object.assign({}, this.render_options), { glyph_font_size: 40 });\n L('New Dynamics Text: ', this.sequence);\n }\n static get CATEGORY() {\n return Category.TextDynamics;\n }\n /** The glyph data for each dynamics letter. */\n static get GLYPHS() {\n return {\n f: {\n code: 'dynamicForte',\n width: 12,\n },\n p: {\n code: 'dynamicPiano',\n width: 14,\n },\n m: {\n code: 'dynamicMezzo',\n width: 17,\n },\n s: {\n code: 'dynamicSforzando',\n width: 10,\n },\n z: {\n code: 'dynamicZ',\n width: 12,\n },\n r: {\n code: 'dynamicRinforzando',\n width: 12,\n },\n };\n }\n /** Set the Stave line on which the note should be placed. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Preformat the dynamics text. */\n preFormat() {\n let total_width = 0;\n // length of this.glyphs must be <=\n // length of this.sequence, so if we're formatted before\n // create new glyphs.\n this.glyphs = [];\n // Iterate through each letter\n this.sequence.split('').forEach((letter) => {\n // Get the glyph data for the letter\n const glyph_data = TextDynamics.GLYPHS[letter];\n if (!glyph_data)\n throw new RuntimeError('Invalid dynamics character: ' + letter);\n const size = defined(this.render_options.glyph_font_size);\n const glyph = new Glyph(glyph_data.code, size, { category: 'textNote' });\n // Add the glyph\n this.glyphs.push(glyph);\n total_width += glyph_data.width;\n });\n // Store the width of the text\n this.setWidth(total_width);\n this.preFormatted = true;\n return this;\n }\n /** Draw the dynamics text on the rendering context. */\n draw() {\n this.setRendered();\n const x = this.getAbsoluteX();\n const y = this.checkStave().getYForLine(this.line + -3);\n L('Rendering Dynamics: ', this.sequence);\n let letter_x = x;\n this.glyphs.forEach((glyph, index) => {\n const current_letter = this.sequence[index];\n glyph.render(this.checkContext(), letter_x, y);\n letter_x += TextDynamics.GLYPHS[current_letter].width;\n });\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.TextDynamics.DEBUG` to `true`. */\nTextDynamics.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font, FontStyle, FontWeight } from './font';\nimport { log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (TextFormatter.DEBUG)\n log('Vex.Flow.TextFormatter', args);\n}\n/**\n * Text widths are stored in a cache, so we don't have to recompute widths\n * for the same font + string combination.\n *\n * The cache is first keyed by the font information. The key is of the form:\n * `${family}-${size}-${weight}-${style}`\n * The second level key is the specific text to be measured.\n *\n * The stored value is the measured width in `em` units.\n * textWidth == textWidthCache[cacheKey][textToMeasure]\n */\nconst textWidthCache = {};\n/**\n * Applications may register additional fonts via `TextFormatter.registerInfo(info)`.\n * The metrics for those fonts will be made available to the application.\n */\nconst registry = {};\nexport class TextFormatter {\n /**\n * Use `TextFormatter.create(...)` to build an instance from information previously\n * registered via `TextFormatter.registerInfo(info)`.\n */\n constructor(formatterInfo) {\n /** Font family. */\n this.family = '';\n /** Specified in `pt` units. */\n this.size = 14;\n /** Font metrics are extracted at 1000 upem (units per em). */\n this.resolution = 1000;\n /**\n * For text formatting, we do not require glyph outlines, but instead rely on glyph\n * bounding box metrics such as:\n * ```\n * {\n * x_min: 48,\n * x_max: 235,\n * y_min: -17,\n * y_max: 734,\n * ha: 751,\n * leftSideBearing: 48,\n * advanceWidth: 286,\n * }\n * ```\n */\n this.glyphs = {};\n this.serifs = false;\n this.monospaced = false;\n this.italic = false;\n this.bold = false;\n this.superscriptOffset = 0;\n this.subscriptOffset = 0;\n this.maxSizeGlyph = 'H';\n // This is an internal key used to index the `textWidthCache`.\n this.cacheKey = '';\n this.updateParams(formatterInfo);\n }\n /**\n * Return all registered font families.\n */\n static getFontFamilies() {\n const registeredFonts = [];\n for (const fontFamily in registry) {\n const formatterInfo = registry[fontFamily];\n registeredFonts.push(Object.assign({}, formatterInfo));\n }\n return registeredFonts;\n }\n /**\n * Call `TextFormatter.registerInfo(info)` to register font information before using this method.\n *\n * This method creates a formatter for the font that most closely matches the requested font.\n * We compare font family, bold, and italic attributes.\n * This method will return a fallback formatter if there are no matches.\n */\n static create(requestedFont = {}) {\n L('create: ', requestedFont);\n if (!requestedFont.family) {\n requestedFont.family = Font.SANS_SERIF;\n }\n // TODO: One potential (small) optimization is to cache the TextFormatter object\n // returned for each font info. We would probably want to clear the cache if\n // the registry is ever updated.\n const candidates = [];\n // The incoming font family is a string of comma-separated font family names.\n // (e.g., `PetalumaScript, Arial, sans-serif`).\n const requestedFamilies = requestedFont.family.split(/\\s*,\\s*/);\n for (const requestedFamily of requestedFamilies) {\n for (const fontFamily in registry) {\n // Support cases where the registry contains 'Roboto Slab Medium',\n // but the requestedFont.family is 'Roboto Slab'.\n if (fontFamily.startsWith(requestedFamily)) {\n candidates.push(registry[fontFamily]);\n }\n }\n if (candidates.length > 0) {\n break;\n }\n }\n let formatter;\n if (candidates.length === 0) {\n // No match, so return a fallback text formatter.\n formatter = new TextFormatter(Object.values(registry)[0]);\n }\n else if (candidates.length === 1) {\n formatter = new TextFormatter(candidates[0]);\n }\n else {\n const bold = Font.isBold(requestedFont.weight);\n const italic = Font.isItalic(requestedFont.style);\n const perfectMatch = candidates.find((f) => f.bold === bold && f.italic === italic);\n if (perfectMatch) {\n formatter = new TextFormatter(perfectMatch);\n }\n else {\n const partialMatch = candidates.find((f) => f.italic === italic || f.bold === bold);\n if (partialMatch) {\n formatter = new TextFormatter(partialMatch);\n }\n else {\n formatter = new TextFormatter(candidates[0]);\n }\n }\n }\n const fontSize = requestedFont.size;\n if (typeof fontSize !== 'undefined') {\n const fontSizeInPt = Font.convertSizeToPointValue(fontSize);\n formatter.setFontSize(fontSizeInPt);\n }\n return formatter;\n }\n /**\n * @param fontFamily used as a key to the font registry.\n * @returns the same info object that was passed in via `TextFormatter.registerInfo(info)`\n */\n static getInfo(fontFamily) {\n return registry[fontFamily];\n }\n /**\n * Apps may register their own fonts and metrics, and those metrics\n * will be available to the app for formatting.\n *\n * Metrics can be generated from a font file using fontgen_text.js in the tools/fonts directory.\n * @param info\n * @param overwrite\n */\n static registerInfo(info, overwrite = false) {\n L('registerInfo: ', info, overwrite);\n const fontFamily = info.family;\n const currFontInfo = registry[fontFamily];\n if (currFontInfo === undefined || overwrite) {\n registry[fontFamily] = info;\n }\n }\n updateParams(params) {\n if (params.family)\n this.family = params.family;\n if (params.resolution)\n this.resolution = params.resolution;\n if (params.glyphs)\n this.glyphs = params.glyphs;\n if (params.serifs)\n this.serifs = params.serifs;\n if (params.monospaced)\n this.monospaced = params.monospaced;\n if (params.italic)\n this.italic = params.italic;\n if (params.bold)\n this.bold = params.bold;\n if (params.maxSizeGlyph)\n this.maxSizeGlyph = params.maxSizeGlyph;\n if (params.superscriptOffset)\n this.superscriptOffset = params.superscriptOffset;\n if (params.subscriptOffset)\n this.subscriptOffset = params.subscriptOffset;\n this.updateCacheKey();\n }\n /** Create a hash with the current font data, so we can cache computed widths. */\n updateCacheKey() {\n const family = this.family.replace(/\\s+/g, '_');\n const size = this.size;\n const weight = this.bold ? FontWeight.BOLD : FontWeight.NORMAL;\n const style = this.italic ? FontStyle.ITALIC : FontStyle.NORMAL;\n // Use the same key format as SVGContext.\n this.cacheKey = `${family}%${size}%${weight}%${style}`;\n }\n /**\n * The glyphs table is indexed by the character (e.g., 'C', '@').\n * See: robotoslab_glyphs.ts & petalumascript_glyphs.ts.\n */\n getGlyphMetrics(character) {\n if (this.glyphs[character]) {\n return this.glyphs[character];\n }\n else {\n return this.glyphs[this.maxSizeGlyph];\n }\n }\n get maxHeight() {\n const metrics = this.getGlyphMetrics(this.maxSizeGlyph);\n return (metrics.ha / this.resolution) * this.fontSizeInPixels;\n }\n /**\n * Retrieve the character's advanceWidth as a fraction of an `em` unit.\n * For the space character ' ' as defined in the:\n * petalumascript_glyphs.ts: 250 advanceWidth in the 1000 unitsPerEm font returns 0.25.\n * robotoslab_glyphs.ts: 509 advanceWidth in the 2048 unitsPerEm font returns 0.2485.\n */\n getWidthForCharacterInEm(c) {\n var _a;\n const metrics = this.getGlyphMetrics(c);\n if (!metrics) {\n // An arbitrary number, close to the `em` width of the '#' and '5' characters in PetalumaScript.\n return 0.65;\n }\n else {\n const advanceWidth = (_a = metrics.advanceWidth) !== null && _a !== void 0 ? _a : 0;\n return advanceWidth / this.resolution;\n }\n }\n /**\n * Retrieve the total width of `text` in `em` units.\n */\n getWidthForTextInEm(text) {\n const key = this.cacheKey;\n // Get the cache for this specific font family, size, weight, style combination.\n // The cache contains previously computed widths for different `text` strings.\n let cachedWidths = textWidthCache[key];\n if (cachedWidths === undefined) {\n cachedWidths = {};\n textWidthCache[key] = cachedWidths;\n }\n let width = cachedWidths[text];\n if (width === undefined) {\n width = 0;\n for (let i = 0; i < text.length; ++i) {\n width += this.getWidthForCharacterInEm(text[i]);\n }\n cachedWidths[text] = width;\n }\n return width;\n }\n /** The width of the text (in `em`) is scaled by the font size (in `px`). */\n getWidthForTextInPx(text) {\n return this.getWidthForTextInEm(text) * this.fontSizeInPixels;\n }\n /**\n * @param size in pt.\n */\n setFontSize(size) {\n this.size = size;\n // The width cache key depends on the current font size.\n this.updateCacheKey();\n return this;\n }\n /** `this.size` is specified in points. Convert to pixels. */\n get fontSizeInPixels() {\n return this.size * Font.scaleToPxFrom.pt;\n }\n getResolution() {\n return this.resolution;\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.TextFormatter.DEBUG` to `true`. */\nTextFormatter.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport var Justification;\n(function (Justification) {\n Justification[Justification[\"LEFT\"] = 1] = \"LEFT\";\n Justification[Justification[\"CENTER\"] = 2] = \"CENTER\";\n Justification[Justification[\"RIGHT\"] = 3] = \"RIGHT\";\n})(Justification || (Justification = {}));\n/**\n * `TextNote` is a notation element that is positioned in time. Generally\n * meant for objects that sit above/below the staff and inline with each other.\n * `TextNote` has to be assigned to a `Stave` before rendering by means of `setStave`.\n * Examples of this would be such as dynamics, lyrics, chord changes, etc.\n */\nexport class TextNote extends Note {\n constructor(noteStruct) {\n super(noteStruct);\n this.text = noteStruct.text || '';\n this.superscript = noteStruct.superscript;\n this.subscript = noteStruct.subscript;\n this.setFont(noteStruct.font);\n this.line = noteStruct.line || 0;\n this.smooth = noteStruct.smooth || false;\n this.ignore_ticks = noteStruct.ignore_ticks || false;\n this.justification = Justification.LEFT;\n // Determine and set initial note width. Note that the text width is\n // an approximation and isn't very accurate. The only way to accurately\n // measure the length of text is with `CanvasRenderingContext2D.measureText()`.\n if (noteStruct.glyph) {\n const struct = TextNote.GLYPHS[noteStruct.glyph];\n if (!struct)\n throw new RuntimeError('Invalid glyph type: ' + noteStruct.glyph);\n this.glyph = new Glyph(struct.code, 40, { category: 'textNote' });\n this.setWidth(this.glyph.getMetrics().width);\n }\n else {\n this.glyph = undefined;\n }\n }\n static get CATEGORY() {\n return Category.TextNote;\n }\n static get Justification() {\n return Justification;\n }\n /** Glyph data. */\n static get GLYPHS() {\n return {\n segno: {\n code: 'segno',\n },\n tr: {\n code: 'ornamentTrill',\n },\n mordent: {\n code: 'ornamentMordent',\n },\n mordent_upper: {\n code: 'ornamentShortTrill',\n },\n mordent_lower: {\n code: 'ornamentMordent',\n },\n f: {\n code: 'dynamicForte',\n },\n p: {\n code: 'dynamicPiano',\n },\n m: {\n code: 'dynamicMezzo',\n },\n s: {\n code: 'dynamicSforzando',\n },\n z: {\n code: 'dynamicZ',\n },\n coda: {\n code: 'coda',\n },\n pedal_open: {\n code: 'keyboardPedalPed',\n },\n pedal_close: {\n code: 'keyboardPedalUp',\n },\n caesura_straight: {\n code: 'caesura',\n },\n caesura_curved: {\n code: 'caesuraCurved',\n },\n breath: {\n code: 'breathMarkComma',\n },\n tick: {\n code: 'breathMarkTick',\n },\n turn: {\n code: 'ornamentTurn',\n },\n turn_inverted: {\n code: 'ornamentTurnSlash',\n },\n };\n }\n /** Set the horizontal justification of the TextNote. */\n setJustification(just) {\n this.justification = just;\n return this;\n }\n /** Set the Stave line on which the note should be placed. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Pre-render formatting. */\n preFormat() {\n if (this.preFormatted)\n return;\n const tickContext = this.checkTickContext(`Can't preformat without a TickContext.`);\n if (this.smooth) {\n this.setWidth(0);\n }\n else {\n if (this.glyph) {\n // Width already set.\n }\n else {\n const ctx = this.checkContext();\n ctx.setFont(this.textFont);\n this.setWidth(ctx.measureText(this.text).width);\n }\n }\n if (this.justification === Justification.CENTER) {\n this.leftDisplacedHeadPx = this.width / 2;\n }\n else if (this.justification === Justification.RIGHT) {\n this.leftDisplacedHeadPx = this.width;\n }\n // We reposition to the center of the note head\n this.rightDisplacedHeadPx = tickContext.getMetrics().glyphPx / 2;\n this.preFormatted = true;\n }\n /**\n * Renders the TextNote.\n * `TextNote` has to be assigned to a `Stave` before rendering by means of `setStave`.\n */\n draw() {\n const ctx = this.checkContext();\n const stave = this.checkStave();\n const tickContext = this.checkTickContext(`Can't draw without a TickContext.`);\n this.setRendered();\n // Reposition to center of note head\n let x = this.getAbsoluteX() + tickContext.getMetrics().glyphPx / 2;\n // Align based on tick-context width.\n const width = this.getWidth();\n if (this.justification === Justification.CENTER) {\n x -= width / 2;\n }\n else if (this.justification === Justification.RIGHT) {\n x -= width;\n }\n let y;\n if (this.glyph) {\n y = stave.getYForLine(this.line + -3);\n this.glyph.render(ctx, x, y);\n }\n else {\n y = stave.getYForLine(this.line + -3);\n this.applyStyle(ctx);\n ctx.setFont(this.textFont);\n ctx.fillText(this.text, x, y);\n const height = ctx.measureText(this.text).height;\n // We called this.setFont(...) in the constructor, so we know this.textFont is available.\n // eslint-disable-next-line\n const { family, size, weight, style } = this.textFont;\n // Scale the font size by 1/1.3.\n const smallerFontSize = Font.scaleSize(size, 0.769231);\n if (this.superscript) {\n ctx.setFont(family, smallerFontSize, weight, style);\n ctx.fillText(this.superscript, x + this.width + 2, y - height / 2.2);\n }\n if (this.subscript) {\n ctx.setFont(family, smallerFontSize, weight, style);\n ctx.fillText(this.subscript, x + this.width + 2, y + height / 2.2 - 1);\n }\n this.restoreStyle(ctx);\n }\n }\n}\nTextNote.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 12,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Fraction } from './fraction';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\n/**\n * Tickable represents a element that sit on a score and\n * has a duration, i.e., Tickables occupy space in the musical rendering dimension.\n */\nexport class Tickable extends Element {\n constructor() {\n super();\n this._preFormatted = false;\n this._postFormatted = false;\n // These properties represent the duration of\n // this tickable element.\n this.ticks = new Fraction(0, 1); // Fractional value of ticks\n this.intrinsicTicks = 0; // Floating point value of ticks\n this.tickMultiplier = new Fraction(1, 1);\n // Formatter metrics\n this.width = 0;\n this.x_shift = 0; // Shift from tick context\n this.modifiers = [];\n this.tupletStack = [];\n this.align_center = false;\n this.center_x_shift = 0; // Shift from tick context if center aligned\n // This flag tells the formatter to ignore this tickable during\n // formatting and justification. It is set by tickables such as BarNote.\n this.ignore_ticks = false;\n // This is a space for an external formatting class or function to maintain\n // metrics.\n this.formatterMetrics = {\n // The freedom of a tickable is the distance it can move without colliding\n // with neighboring elements. A formatter can set these values during its\n // formatting pass, which a different formatter can then use to fine tune.\n freedom: { left: 0, right: 0 },\n // The simplified rational duration of this tick as a string. It can be\n // used as an index to a map or hashtable.\n duration: '',\n // The number of formatting iterations undergone.\n iterations: 0,\n // The space in pixels allocated by this formatter, along with the mean space\n // for tickables of this duration, and the deviation from the mean.\n space: {\n used: 0,\n mean: 0,\n deviation: 0,\n },\n };\n }\n static get CATEGORY() {\n return Category.Tickable;\n }\n /** Reset the Tickable, this function will be overloaded. */\n reset() {\n return this;\n }\n /** Return the ticks. */\n getTicks() {\n return this.ticks;\n }\n /** Check if it ignores the ticks. */\n shouldIgnoreTicks() {\n return this.ignore_ticks;\n }\n /** Ignore the ticks. */\n setIgnoreTicks(flag) {\n this.ignore_ticks = flag;\n return this;\n }\n /** Set width of note. Used by the formatter for positioning. */\n setWidth(width) {\n this.width = width;\n }\n /** Get width of note. Used by the formatter for positioning. */\n getWidth() {\n if (!this._preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call GetWidth on an unformatted note.\");\n }\n return this.width + (this.modifierContext ? this.modifierContext.getWidth() : 0);\n }\n /** Displace note by `x` pixels. Used by the formatter. */\n setXShift(x) {\n this.x_shift = x;\n return this;\n }\n /** Get the `x` displaced pixels of the note. */\n getXShift() {\n return this.x_shift;\n }\n /** Get `x` position of this tick context. */\n getX() {\n const tickContext = this.checkTickContext(`Can't getX() without a TickContext.`);\n return tickContext.getX() + this.x_shift;\n }\n /** Return the formatterMetrics. */\n getFormatterMetrics() {\n return this.formatterMetrics;\n }\n /** Return the center `x` shift. */\n getCenterXShift() {\n if (this.isCenterAligned()) {\n return this.center_x_shift;\n }\n return 0;\n }\n /** Set the center `x` shift. */\n setCenterXShift(centerXShift) {\n this.center_x_shift = centerXShift;\n return this;\n }\n // Check if tickable is center aligned. */\n isCenterAligned() {\n return this.align_center;\n }\n // Set/unset center alignment. */\n setCenterAlignment(align_center) {\n this.align_center = align_center;\n return this;\n }\n /**\n * Return the associated voice. Every tickable must be associated with a voice.\n * This allows formatters and preFormatter to associate them with the right modifierContexts.\n */\n getVoice() {\n return defined(this.voice, 'NoVoice', 'Tickable has no voice.');\n }\n /** Set the associated voice. */\n setVoice(voice) {\n this.voice = voice;\n }\n /** Get the tuplet. */\n getTuplet() {\n return this.tuplet;\n }\n /** Return the intrinsic ticks. */\n getTupletStack() {\n return this.tupletStack;\n }\n /**\n * Reset the specific Tuplet if this is not provided, all tuplets are reset.\n * Remove any prior tuplets from the tick calculation and\n * reset the intrinsic tick value.\n */\n resetTuplet(tuplet) {\n let noteCount;\n let notesOccupied;\n if (tuplet) {\n const i = this.tupletStack.indexOf(tuplet);\n if (i !== -1) {\n this.tupletStack.splice(i, 1);\n noteCount = tuplet.getNoteCount();\n notesOccupied = tuplet.getNotesOccupied();\n // Revert old multiplier by inverting numerator & denom.:\n this.applyTickMultiplier(noteCount, notesOccupied);\n }\n return this;\n }\n while (this.tupletStack.length) {\n tuplet = this.tupletStack.pop();\n noteCount = tuplet.getNoteCount();\n notesOccupied = tuplet.getNotesOccupied();\n // Revert old multiplier by inverting numerator & denom.:\n this.applyTickMultiplier(noteCount, notesOccupied);\n }\n return this;\n }\n /** Attach to new tuplet. */\n setTuplet(tuplet) {\n if (tuplet) {\n this.tupletStack.push(tuplet);\n const noteCount = tuplet.getNoteCount();\n const notesOccupied = tuplet.getNotesOccupied();\n this.applyTickMultiplier(notesOccupied, noteCount);\n }\n this.tuplet = tuplet;\n return this;\n }\n /**\n * Add self to the provided ModifierContext `mc`.\n * If this tickable has modifiers, set modifierContext.\n * @returns this\n */\n addToModifierContext(mc) {\n this.modifierContext = mc;\n for (let i = 0; i < this.modifiers.length; ++i) {\n this.modifierContext.addMember(this.modifiers[i]);\n }\n this.modifierContext.addMember(this);\n this._preFormatted = false;\n return this;\n }\n /**\n * Optional, if tickable has modifiers, associate a Modifier.\n * @param mod the modifier\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n addModifier(modifier, index = 0) {\n this.modifiers.push(modifier);\n this._preFormatted = false;\n return this;\n }\n /** Get the list of associated modifiers. */\n getModifiers() {\n return this.modifiers;\n }\n /** Set the Tick Context. */\n setTickContext(tc) {\n this.tickContext = tc;\n this._preFormatted = false;\n }\n checkTickContext(message = 'Tickable has no tick context.') {\n return defined(this.tickContext, 'NoTickContext', message);\n }\n /** Preformat the Tickable. */\n preFormat() {\n if (this._preFormatted)\n return;\n this.width = 0;\n if (this.modifierContext) {\n this.modifierContext.preFormat();\n this.width += this.modifierContext.getWidth();\n }\n }\n /** Set preformatted status. */\n set preFormatted(value) {\n this._preFormatted = value;\n }\n get preFormatted() {\n return this._preFormatted;\n }\n /** Postformat the Tickable. */\n postFormat() {\n if (this._postFormatted)\n return this;\n this._postFormatted = true;\n return this;\n }\n /** Set postformatted status. */\n set postFormatted(value) {\n this._postFormatted = value;\n }\n get postFormatted() {\n return this._postFormatted;\n }\n /** Return the intrinsic ticks. */\n getIntrinsicTicks() {\n return this.intrinsicTicks;\n }\n /** Set the intrinsic ticks. */\n setIntrinsicTicks(intrinsicTicks) {\n this.intrinsicTicks = intrinsicTicks;\n this.ticks = this.tickMultiplier.clone().multiply(this.intrinsicTicks);\n }\n /** Get the tick multiplier. */\n getTickMultiplier() {\n return this.tickMultiplier;\n }\n /** Apply a tick multiplier. */\n applyTickMultiplier(numerator, denominator) {\n this.tickMultiplier.multiply(numerator, denominator);\n this.ticks = this.tickMultiplier.clone().multiply(this.intrinsicTicks);\n }\n /** Set the duration. */\n setDuration(duration) {\n const ticks = duration.numerator * (Tables.RESOLUTION / duration.denominator);\n this.ticks = this.tickMultiplier.clone().multiply(ticks);\n this.intrinsicTicks = this.ticks.value();\n }\n getAbsoluteX() {\n const tickContext = this.checkTickContext(`Can't getAbsoluteX() without a TickContext.`);\n return tickContext.getX();\n }\n /** Attach this note to a modifier context. */\n setModifierContext(mc) {\n this.modifierContext = mc;\n return this;\n }\n /** Get `ModifierContext`. */\n getModifierContext() {\n return this.modifierContext;\n }\n /** Check and get `ModifierContext`. */\n checkModifierContext() {\n return defined(this.modifierContext, 'NoModifierContext', 'No modifier context attached to this tickable.');\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// A formatter for abstract tickable objects, such as notes, chords,\n// tabs, etc.\nimport { Fraction } from './fraction';\nimport { RuntimeError } from './util';\n/**\n * TickContext formats abstract tickable objects, such as notes, chords, tabs, etc.\n */\nexport class TickContext {\n constructor(options) {\n this.preFormatted = false;\n this.postFormatted = false;\n this.tickID = options && options.tickID ? options.tickID : 0;\n this.currentTick = new Fraction(0, 1);\n this.maxTicks = new Fraction(0, 1);\n this.maxTickable = undefined; // Biggest tickable\n this.minTicks = undefined; // this can remian null if all tickables have ignore_ticks\n this.minTickable = undefined;\n this.padding = 1; // padding on each side (width += padding * 2)\n this.x = 0;\n this.xBase = 0; // base x position without xOffset\n this.xOffset = 0; // xBase and xOffset are an alternative way to describe x (x = xB + xO)\n this.tickables = []; // Notes, tabs, chords, lyrics.\n this.tickablesByVoice = {}; // Tickables indexed by voice number\n // Formatting metrics\n this.notePx = 0; // width of widest note in this context\n this.glyphPx = 0; // width of glyph (note head)\n this.leftDisplacedHeadPx = 0; // Extra left pixels for displaced notes\n this.rightDisplacedHeadPx = 0; // Extra right pixels for displaced notes\n this.modLeftPx = 0; // Left modifier pixels\n this.modRightPx = 0; // Right modifier pixels\n this.totalLeftPx = 0; // Total left pixels\n this.totalRightPx = 0; // Total right pixels\n this.tContexts = []; // Parent array of tick contexts\n this.width = 0;\n this.formatterMetrics = {\n // The freedom of a tickcontext is the distance it can move without colliding\n // with neighboring elements. A formatter can set these values during its\n // formatting pass, which a different formatter can then use to fine tune.\n freedom: { left: 0, right: 0 },\n };\n }\n static getNextContext(tContext) {\n const contexts = tContext.tContexts;\n const index = contexts.indexOf(tContext);\n if (index + 1 < contexts.length)\n return contexts[index + 1];\n }\n getTickID() {\n return this.tickID;\n }\n getX() {\n return this.x;\n }\n setX(x) {\n this.x = x;\n this.xBase = x;\n this.xOffset = 0;\n return this;\n }\n getXBase() {\n return this.xBase;\n } // use of xBase and xOffset is optional, avoids offset creep\n setXBase(xBase) {\n this.xBase = xBase;\n this.x = xBase + this.xOffset;\n }\n getXOffset() {\n return this.xOffset;\n }\n setXOffset(xOffset) {\n this.xOffset = xOffset;\n this.x = this.xBase + xOffset;\n }\n getWidth() {\n return this.width + this.padding * 2;\n }\n setPadding(padding) {\n this.padding = padding;\n return this;\n }\n getMaxTicks() {\n return this.maxTicks;\n }\n getMinTicks() {\n return this.minTicks;\n }\n getMaxTickable() {\n return this.maxTickable;\n }\n getMinTickable() {\n return this.minTickable;\n }\n getTickables() {\n return this.tickables;\n }\n /**\n * Introduced on 2020-04-17 as getTickablesForVoice(voiceIndex).\n * https://github.com/0xfe/vexflow/blame/dc97b0cc5bb93171c0038638c34362dc958222ca/src/tickcontext.js#L63\n * Renamed on 2021-08-05 to getTickableForVoice(voiceIndex). Method renamed to singular, since it returns one Tickable.\n */\n getTickableForVoice(voiceIndex) {\n return this.tickablesByVoice[voiceIndex];\n }\n getTickablesByVoice() {\n return this.tickablesByVoice;\n }\n getCenterAlignedTickables() {\n return this.tickables.filter((tickable) => tickable.isCenterAligned());\n }\n /** Gets widths context, note and left/right modifiers for formatting. */\n getMetrics() {\n const { width, glyphPx, notePx, leftDisplacedHeadPx, rightDisplacedHeadPx, modLeftPx, modRightPx, totalLeftPx, totalRightPx, } = this;\n return {\n width,\n glyphPx,\n notePx,\n leftDisplacedHeadPx,\n rightDisplacedHeadPx,\n modLeftPx,\n modRightPx,\n totalLeftPx,\n totalRightPx,\n };\n }\n getCurrentTick() {\n return this.currentTick;\n }\n setCurrentTick(tick) {\n this.currentTick = tick;\n this.preFormatted = false;\n }\n addTickable(tickable, voiceIndex) {\n if (!tickable) {\n throw new RuntimeError('BadArgument', 'Invalid tickable added.');\n }\n if (!tickable.shouldIgnoreTicks()) {\n const ticks = tickable.getTicks();\n if (ticks.greaterThan(this.maxTicks)) {\n this.maxTicks = ticks.clone();\n this.maxTickable = tickable;\n }\n if (this.minTicks == null) {\n this.minTicks = ticks.clone();\n this.minTickable = tickable;\n }\n else if (ticks.lessThan(this.minTicks)) {\n this.minTicks = ticks.clone();\n this.minTickable = tickable;\n }\n }\n tickable.setTickContext(this);\n this.tickables.push(tickable);\n this.tickablesByVoice[voiceIndex || 0] = tickable;\n this.preFormatted = false;\n return this;\n }\n preFormat() {\n if (this.preFormatted)\n return this;\n for (let i = 0; i < this.tickables.length; ++i) {\n const tickable = this.tickables[i];\n tickable.preFormat();\n const metrics = tickable.getMetrics();\n // Maintain max displaced head pixels from all tickables in the context\n this.leftDisplacedHeadPx = Math.max(this.leftDisplacedHeadPx, metrics.leftDisplacedHeadPx);\n this.rightDisplacedHeadPx = Math.max(this.rightDisplacedHeadPx, metrics.rightDisplacedHeadPx);\n // Maintain the widest note for all tickables in the context\n this.notePx = Math.max(this.notePx, metrics.notePx);\n // Maintain the widest note head\n this.glyphPx = Math.max(this.glyphPx, metrics.glyphWidth || 0);\n // Total modifier shift\n this.modLeftPx = Math.max(this.modLeftPx, metrics.modLeftPx);\n this.modRightPx = Math.max(this.modRightPx, metrics.modRightPx);\n // Total shift\n this.totalLeftPx = Math.max(this.totalLeftPx, metrics.modLeftPx + metrics.leftDisplacedHeadPx);\n this.totalRightPx = Math.max(this.totalRightPx, metrics.modRightPx + metrics.rightDisplacedHeadPx);\n // Recalculate the tick context total width\n this.width = this.notePx + this.totalLeftPx + this.totalRightPx;\n }\n return this;\n }\n postFormat() {\n if (this.postFormatted)\n return this;\n this.postFormatted = true;\n return this;\n }\n getFormatterMetrics() {\n return this.formatterMetrics;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// Renders time signatures glyphs for staffs\n// This class is used by TimeSignature to render the associated glyphs\nimport { Glyph } from './glyph';\nimport { defined } from './util';\nexport class TimeSignatureGlyph extends Glyph {\n constructor(timeSignature, topDigits, botDigits, code, point, options) {\n var _a;\n super(code, point, options);\n this.timeSignature = timeSignature;\n this.topGlyphs = [];\n this.botGlyphs = [];\n let topWidth = 0;\n for (let i = 0; i < topDigits.length; ++i) {\n let timeSigType = topDigits[i];\n switch (topDigits[i]) {\n case '-':\n timeSigType = 'Minus';\n break;\n case '+':\n timeSigType = botDigits.length > 0 ? 'PlusSmall' : 'Plus';\n break;\n case '(':\n timeSigType = botDigits.length > 0 ? 'ParensLeftSmall' : 'ParensLeft';\n break;\n case ')':\n timeSigType = botDigits.length > 0 ? 'ParensRightSmall' : 'ParensRight';\n break;\n }\n const topGlyph = new Glyph('timeSig' + timeSigType, this.timeSignature.point);\n this.topGlyphs.push(topGlyph);\n topWidth += (_a = topGlyph.getMetrics().width) !== null && _a !== void 0 ? _a : 0;\n }\n let botWidth = 0;\n for (let i = 0; i < botDigits.length; ++i) {\n let timeSigType = botDigits[i];\n switch (botDigits[i]) {\n case '+':\n timeSigType = 'PlusSmall';\n break;\n case '(':\n timeSigType = 'ParensLeftSmall';\n break;\n case ')':\n timeSigType = 'ParensRightSmall';\n break;\n }\n const botGlyph = new Glyph('timeSig' + timeSigType, this.timeSignature.point);\n this.botGlyphs.push(botGlyph);\n botWidth += defined(botGlyph.getMetrics().width);\n }\n this.width = Math.max(topWidth, botWidth);\n this.xMin = this.getMetrics().x_min;\n this.topStartX = (this.width - topWidth) / 2.0;\n this.botStartX = (this.width - botWidth) / 2.0;\n this.reset();\n }\n getMetrics() {\n return {\n x_min: this.xMin,\n x_max: this.xMin + this.width,\n width: this.width,\n };\n }\n renderToStave(x) {\n const stave = this.checkStave();\n const ctx = this.checkContext();\n let start_x = x + this.topStartX;\n let y = 0;\n if (this.botGlyphs.length > 0)\n y = stave.getYForLine(this.timeSignature.topLine);\n else\n y = (stave.getYForLine(this.timeSignature.topLine) + stave.getYForLine(this.timeSignature.bottomLine)) / 2;\n for (let i = 0; i < this.topGlyphs.length; ++i) {\n const glyph = this.topGlyphs[i];\n Glyph.renderOutline(ctx, glyph.getMetrics().outline, this.scale, start_x + this.x_shift, y);\n start_x += defined(glyph.getMetrics().width);\n }\n start_x = x + this.botStartX;\n y = stave.getYForLine(this.timeSignature.bottomLine);\n for (let i = 0; i < this.botGlyphs.length; ++i) {\n const glyph = this.botGlyphs[i];\n this.timeSignature.placeGlyphOnLine(glyph, stave, 0);\n Glyph.renderOutline(ctx, glyph.getMetrics().outline, this.scale, start_x + glyph.getMetrics().x_shift, y);\n start_x += defined(glyph.getMetrics().width);\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// Implements time signatures glyphs for staffs\n// See tables.js for the internal time signatures\n// representation\nimport { Glyph } from './glyph';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { TimeSignatureGlyph } from './timesigglyph';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nconst assertIsValidTimeSig = (timeSpec) => {\n const numbers = timeSpec.split('/');\n if (numbers.length !== 2 && numbers[0] !== '+' && numbers[0] !== '-') {\n throw new RuntimeError('BadTimeSignature', `Invalid time spec: ${timeSpec}. Must be in the form \"/\"`);\n }\n numbers.forEach((number) => {\n // Characters consisting in number 0..9, '+', '-', '(' or ')'\n if (/^[0-9+\\-()]+$/.test(number) == false) {\n throw new RuntimeError('BadTimeSignature', `Invalid time spec: ${timeSpec}. Must contain valid signatures.`);\n }\n });\n};\nexport class TimeSignature extends StaveModifier {\n constructor(timeSpec = '4/4', customPadding = 15, validate_args = true) {\n super();\n this.validate_args = validate_args;\n const padding = customPadding;\n const musicFont = Tables.currentMusicFont();\n this.point = musicFont.lookupMetric('digits.point');\n const fontLineShift = musicFont.lookupMetric('digits.shiftLine', 0);\n this.topLine = 2 + fontLineShift;\n this.bottomLine = 4 + fontLineShift;\n this.setPosition(StaveModifierPosition.BEGIN);\n this.info = this.parseTimeSpec(timeSpec);\n this.setWidth(defined(this.info.glyph.getMetrics().width));\n this.setPadding(padding);\n }\n static get CATEGORY() {\n return Category.TimeSignature;\n }\n static get glyphs() {\n return {\n C: {\n code: 'timeSigCommon',\n point: 40,\n line: 2,\n },\n 'C|': {\n code: 'timeSigCutCommon',\n point: 40,\n line: 2,\n },\n };\n }\n parseTimeSpec(timeSpec) {\n var _a, _b;\n if (timeSpec === 'C' || timeSpec === 'C|') {\n const { line, code, point } = TimeSignature.glyphs[timeSpec];\n return {\n line,\n num: false,\n glyph: new Glyph(code, point),\n };\n }\n if (this.validate_args) {\n assertIsValidTimeSig(timeSpec);\n }\n const parts = timeSpec.split('/');\n return {\n num: true,\n glyph: this.makeTimeSignatureGlyph((_a = parts[0]) !== null && _a !== void 0 ? _a : '', (_b = parts[1]) !== null && _b !== void 0 ? _b : ''),\n };\n }\n makeTimeSignatureGlyph(topDigits, botDigits) {\n return new TimeSignatureGlyph(this, topDigits, botDigits, 'timeSig0', this.point);\n }\n getInfo() {\n return this.info;\n }\n setTimeSig(timeSpec) {\n this.info = this.parseTimeSpec(timeSpec);\n return this;\n }\n draw() {\n const stave = this.checkStave();\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.openGroup('timesignature', this.getAttribute('id'));\n this.info.glyph.setStave(stave);\n this.info.glyph.setContext(ctx);\n this.placeGlyphOnLine(this.info.glyph, stave, this.info.line);\n this.info.glyph.renderToStave(this.x);\n ctx.closeGroup();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2014\nimport { Note } from './note';\nimport { TimeSignature } from './timesignature';\nimport { Category } from './typeguard';\nexport class TimeSigNote extends Note {\n constructor(timeSpec, customPadding) {\n super({ duration: 'b' });\n const timeSignature = new TimeSignature(timeSpec, customPadding);\n this.timeSigInfo = timeSignature.getInfo();\n this.setWidth(this.timeSigInfo.glyph.getMetrics().width);\n // Note properties\n this.ignore_ticks = true;\n }\n static get CATEGORY() {\n return Category.TimeSigNote;\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n draw() {\n const stave = this.checkStave();\n const ctx = this.checkContext();\n this.setRendered();\n if (!this.timeSigInfo.glyph.getContext()) {\n this.timeSigInfo.glyph.setContext(ctx);\n }\n this.timeSigInfo.glyph.setStave(stave);\n this.timeSigInfo.glyph.setYShift(stave.getYForLine(2) - stave.getYForGlyphs());\n this.timeSigInfo.glyph.renderToStave(this.getAbsoluteX());\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Mike Corrigan \n// MIT License\nimport { Glyph } from './glyph';\nimport { GraceNote } from './gracenote';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category, isGraceNote } from './typeguard';\n/** Tremolo implements tremolo notation. */\nexport class Tremolo extends Modifier {\n /**\n * @param num number of bars\n */\n constructor(num) {\n super();\n this.num = num;\n this.position = Modifier.Position.CENTER;\n this.code = 'tremolo1';\n // big strokes scales initialised to 1 (no scale)\n this.y_spacing_scale = 1;\n this.extra_stroke_scale = 1;\n }\n static get CATEGORY() {\n return Category.Tremolo;\n }\n /** Draw the tremolo on the rendering context. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const stemDirection = note.getStemDirection();\n const start = note.getModifierStartXY(this.position, this.index);\n let x = start.x;\n const gn = isGraceNote(note);\n const scale = gn ? GraceNote.SCALE : 1;\n const category = `tremolo.${gn ? 'grace' : 'default'}`;\n const musicFont = Tables.currentMusicFont();\n let y_spacing = musicFont.lookupMetric(`${category}.spacing`) * stemDirection;\n // add y_spacing_scale for big strokes (#1258)\n y_spacing *= this.y_spacing_scale;\n const height = this.num * y_spacing;\n let y = note.getStemExtents().baseY - height;\n if (stemDirection < 0) {\n y += musicFont.lookupMetric(`${category}.offsetYStemDown`) * scale;\n }\n else {\n y += musicFont.lookupMetric(`${category}.offsetYStemUp`) * scale;\n }\n const fontScale = musicFont.lookupMetric(`${category}.point`);\n x += musicFont.lookupMetric(`${category}.offsetXStem${stemDirection === Stem.UP ? 'Up' : 'Down'}`);\n for (let i = 0; i < this.num; ++i) {\n Glyph.renderGlyph(ctx, x, y, fontScale, this.code, { category, scale: this.extra_stroke_scale });\n y += y_spacing;\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Tables } from './tables';\nimport { RuntimeError } from './util';\n/** `Tuning` implements varies types of tunings for tablature. */\nexport class Tuning {\n /**\n * Constructor.\n * @param tuningString tuning name (eg. 'dagdad') or comma separated note strings\n */\n constructor(tuningString = 'E/5,B/4,G/4,D/4,A/3,E/3,B/2,E/2') {\n this.tuningValues = [];\n // Default to standard tuning.\n this.setTuning(tuningString);\n }\n static get names() {\n return {\n standard: 'E/5,B/4,G/4,D/4,A/3,E/3',\n dagdad: 'D/5,A/4,G/4,D/4,A/3,D/3',\n dropd: 'E/5,B/4,G/4,D/4,A/3,D/3',\n eb: 'Eb/5,Bb/4,Gb/4,Db/4,Ab/3,Db/3',\n standardBanjo: 'D/5,B/4,G/4,D/4,G/5',\n };\n }\n /** Return the note number associated to the note string. */\n noteToInteger(noteString) {\n return Tables.keyProperties(noteString).int_value;\n }\n /**\n * Set tuning identified by tuning name (eg. 'dagdad')\n * @param tuningString tuning name (eg. 'dagdad') or comma separated note strings\n */\n setTuning(tuningString) {\n if (Tuning.names[tuningString]) {\n tuningString = Tuning.names[tuningString];\n }\n this.tuningValues = [];\n const keys = tuningString.split(/\\s*,\\s*/);\n if (keys.length === 0) {\n throw new RuntimeError('BadArguments', `Invalid tuning string: ${tuningString}`);\n }\n for (let i = 0; i < keys.length; ++i) {\n this.tuningValues[i] = this.noteToInteger(keys[i]);\n }\n }\n /** Return the note number associated with a tablature string. */\n getValueForString(stringNum) {\n const s = Number(stringNum);\n if (s < 1 || s > this.tuningValues.length) {\n throw new RuntimeError('BadArguments', `String number must be between 1 and ${this.tuningValues.length}:${stringNum}`);\n }\n return this.tuningValues[s - 1];\n }\n /** Return the note number associated with a tablature string and fret. */\n getValueForFret(fretNum, stringNum) {\n const stringValue = this.getValueForString(stringNum);\n const f = Number(fretNum);\n if (f < 0) {\n throw new RuntimeError('BadArguments', `Fret number must be 0 or higher: ${fretNum}`);\n }\n return stringValue + f;\n }\n /** Return the note string associated with tablature string and fret. */\n getNoteForFret(fretNum, stringNum) {\n const noteValue = this.getValueForFret(fretNum, stringNum);\n const octave = Math.floor(noteValue / 12);\n const value = noteValue % 12;\n return `${Tables.integerToNote(value)}/${octave}`;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n/**\n * ## Description\n *\n * Create a new tuplet from the specified notes. The notes must\n * be part of the same voice. If they are of different rhythmic\n * values, then options.num_notes must be set.\n *\n * @constructor\n * @param {Array.} A set of notes: staveNotes,\n * notes, etc... any class that inherits stemmableNote at some\n * point in its prototype chain.\n * @param options: object {\n *\n * num_notes: fit this many notes into...\n * notes_occupied: ...the space of this many notes\n *\n * Together, these two properties make up the tuplet ratio\n * in the form of num_notes : notes_occupied.\n * num_notes defaults to the number of notes passed in, so\n * it is important that if you omit this property, all of\n * the notes passed should be of the same note value.\n * notes_occupied defaults to 2 -- so you should almost\n * certainly pass this parameter for anything other than\n * a basic triplet.\n *\n * location:\n * default 1, which is above the notes: ┌─── 3 ───┐\n * -1 is below the notes └─── 3 ───┘\n *\n * bracketed: boolean, draw a bracket around the tuplet number\n * when true: ┌─── 3 ───┐ when false: 3\n * defaults to true if notes are not beamed, false otherwise\n *\n * ratioed: boolean\n * when true: ┌─── 7:8 ───┐, when false: ┌─── 7 ───┐\n * defaults to true if the difference between num_notes and\n * notes_occupied is greater than 1.\n *\n * y_offset: int, default 0\n * manually offset a tuplet, for instance to avoid collisions\n * with articulations, etc...\n * }\n */\nimport { Element } from './element';\nimport { Formatter } from './formatter';\nimport { Glyph } from './glyph';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nexport var TupletLocation;\n(function (TupletLocation) {\n TupletLocation[TupletLocation[\"BOTTOM\"] = -1] = \"BOTTOM\";\n TupletLocation[TupletLocation[\"TOP\"] = 1] = \"TOP\";\n})(TupletLocation || (TupletLocation = {}));\nexport class Tuplet extends Element {\n constructor(notes, options = {}) {\n super();\n this.numerator_glyphs = [];\n this.denom_glyphs = [];\n if (!notes || !notes.length) {\n throw new RuntimeError('BadArguments', 'No notes provided for tuplet.');\n }\n this.options = options;\n this.notes = notes;\n this.num_notes = this.options.num_notes != undefined ? this.options.num_notes : notes.length;\n // We accept beats_occupied, but warn that it's deprecated:\n // the preferred property name is now notes_occupied.\n if (this.options.beats_occupied) {\n this.beatsOccupiedDeprecationWarning();\n }\n this.notes_occupied = this.options.notes_occupied || this.options.beats_occupied || 2;\n if (this.options.bracketed != undefined) {\n this.bracketed = this.options.bracketed;\n }\n else {\n this.bracketed = notes.some((note) => !note.hasBeam());\n }\n this.ratioed =\n this.options.ratioed != undefined ? this.options.ratioed : Math.abs(this.notes_occupied - this.num_notes) > 1;\n this.point = Tables.currentMusicFont().lookupMetric('digits.tupletPoint');\n this.y_pos = 16;\n this.x_pos = 100;\n this.width = 200;\n this.setTupletLocation(this.options.location || Tuplet.LOCATION_TOP);\n Formatter.AlignRestsToNotes(notes, true, true);\n this.resolveGlyphs();\n this.attach();\n }\n static get CATEGORY() {\n return Category.Tuplet;\n }\n static get LOCATION_TOP() {\n return TupletLocation.TOP;\n }\n static get LOCATION_BOTTOM() {\n return TupletLocation.BOTTOM;\n }\n static get NESTING_OFFSET() {\n return 15;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static get metrics() {\n return Tables.currentMusicFont().getMetrics().glyphs.tuplet;\n }\n attach() {\n for (let i = 0; i < this.notes.length; i++) {\n const note = this.notes[i];\n note.setTuplet(this);\n }\n }\n detach() {\n for (let i = 0; i < this.notes.length; i++) {\n const note = this.notes[i];\n note.resetTuplet(this);\n }\n }\n /**\n * Set whether or not the bracket is drawn.\n */\n setBracketed(bracketed) {\n this.bracketed = !!bracketed;\n return this;\n }\n /**\n * Set whether or not the ratio is shown.\n */\n setRatioed(ratioed) {\n this.ratioed = !!ratioed;\n return this;\n }\n /**\n * Set the tuplet indicator to be displayed either on the top or bottom of the stave.\n */\n setTupletLocation(location) {\n if (location !== Tuplet.LOCATION_TOP && location !== Tuplet.LOCATION_BOTTOM) {\n // eslint-disable-next-line\n console.warn(`Invalid tuplet location [${location}]. Using Tuplet.LOCATION_TOP.`);\n location = Tuplet.LOCATION_TOP;\n }\n this.location = location;\n return this;\n }\n getNotes() {\n return this.notes;\n }\n getNoteCount() {\n return this.num_notes;\n }\n beatsOccupiedDeprecationWarning() {\n // eslint-disable-next-line\n console.warn('beats_occupied has been deprecated as an option for tuplets. Please use notes_occupied instead.', 'Calls to getBeatsOccupied / setBeatsOccupied should now be routed to getNotesOccupied / setNotesOccupied.', 'The old methods will be removed in VexFlow 5.0.');\n }\n getBeatsOccupied() {\n this.beatsOccupiedDeprecationWarning();\n return this.getNotesOccupied();\n }\n setBeatsOccupied(beats) {\n this.beatsOccupiedDeprecationWarning();\n return this.setNotesOccupied(beats);\n }\n getNotesOccupied() {\n return this.notes_occupied;\n }\n setNotesOccupied(notes) {\n this.detach();\n this.notes_occupied = notes;\n this.resolveGlyphs();\n this.attach();\n }\n resolveGlyphs() {\n this.numerator_glyphs = [];\n let n = this.num_notes;\n while (n >= 1) {\n this.numerator_glyphs.unshift(new Glyph('timeSig' + (n % 10), this.point));\n n = parseInt((n / 10).toString(), 10);\n }\n this.denom_glyphs = [];\n n = this.notes_occupied;\n while (n >= 1) {\n this.denom_glyphs.unshift(new Glyph('timeSig' + (n % 10), this.point));\n n = parseInt((n / 10).toString(), 10);\n }\n }\n // determine how many tuplets are nested within this tuplet\n // on the same side (above/below), to calculate a y\n // offset for this tuplet:\n getNestedTupletCount() {\n const location = this.location;\n const first_note = this.notes[0];\n let maxTupletCount = countTuplets(first_note, location);\n let minTupletCount = countTuplets(first_note, location);\n // Count the tuplets that are on the same side (above/below)\n // as this tuplet:\n function countTuplets(note, location) {\n return note.getTupletStack().filter((tuplet) => tuplet.location === location).length;\n }\n this.notes.forEach((note) => {\n const tupletCount = countTuplets(note, location);\n maxTupletCount = tupletCount > maxTupletCount ? tupletCount : maxTupletCount;\n minTupletCount = tupletCount < minTupletCount ? tupletCount : minTupletCount;\n });\n return maxTupletCount - minTupletCount;\n }\n // determine the y position of the tuplet:\n getYPosition() {\n // offset the tuplet for any nested tuplets between\n // it and the notes:\n const nested_tuplet_y_offset = this.getNestedTupletCount() * Tuplet.NESTING_OFFSET * -this.location;\n // offset the tuplet for any manual y_offset:\n const y_offset = this.options.y_offset || 0;\n // now iterate through the notes and find our highest\n // or lowest locations, to form a base y_pos\n const first_note = this.notes[0];\n let y_pos;\n if (this.location === Tuplet.LOCATION_TOP) {\n y_pos = first_note.checkStave().getYForLine(0) - Tuplet.metrics.topModifierOffset;\n // check modifiers above note to see if they will collide with tuplet beam\n for (let i = 0; i < this.notes.length; ++i) {\n const note = this.notes[i];\n let modLines = 0;\n const mc = note.getModifierContext();\n if (mc) {\n modLines = Math.max(modLines, mc.getState().top_text_line);\n }\n const modY = note.getYForTopText(modLines) - Tuplet.metrics.noteHeadOffset;\n if (note.hasStem() || note.isRest()) {\n const top_y = note.getStemDirection() === Stem.UP\n ? note.getStemExtents().topY - Tuplet.metrics.stemOffset\n : note.getStemExtents().baseY - Tuplet.metrics.noteHeadOffset;\n y_pos = Math.min(top_y, y_pos);\n if (modLines > 0) {\n y_pos = Math.min(modY, y_pos);\n }\n }\n }\n }\n else {\n let lineCheck = Tuplet.metrics.bottomLine; // tuplet default on line 4\n // check modifiers below note to see if they will collide with tuplet beam\n this.notes.forEach((nn) => {\n const mc = nn.getModifierContext();\n if (mc) {\n lineCheck = Math.max(lineCheck, mc.getState().text_line + 1);\n }\n });\n y_pos = first_note.checkStave().getYForLine(lineCheck) + Tuplet.metrics.noteHeadOffset;\n for (let i = 0; i < this.notes.length; ++i) {\n if (this.notes[i].hasStem() || this.notes[i].isRest()) {\n const bottom_y = this.notes[i].getStemDirection() === Stem.UP\n ? this.notes[i].getStemExtents().baseY + Tuplet.metrics.noteHeadOffset\n : this.notes[i].getStemExtents().topY + Tuplet.metrics.stemOffset;\n if (bottom_y > y_pos) {\n y_pos = bottom_y;\n }\n }\n }\n }\n return y_pos + nested_tuplet_y_offset + y_offset;\n }\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n // determine x value of left bound of tuplet\n const first_note = this.notes[0];\n const last_note = this.notes[this.notes.length - 1];\n if (!this.bracketed) {\n this.x_pos = first_note.getStemX();\n this.width = last_note.getStemX() - this.x_pos;\n }\n else {\n this.x_pos = first_note.getTieLeftX() - 5;\n this.width = last_note.getTieRightX() - this.x_pos + 5;\n }\n // determine y value for tuplet\n this.y_pos = this.getYPosition();\n const addGlyphWidth = (width, glyph) => width + defined(glyph.getMetrics().width);\n // calculate total width of tuplet notation\n let width = this.numerator_glyphs.reduce(addGlyphWidth, 0);\n if (this.ratioed) {\n width = this.denom_glyphs.reduce(addGlyphWidth, width);\n width += this.point * 0.32;\n }\n const notation_center_x = this.x_pos + this.width / 2;\n const notation_start_x = notation_center_x - width / 2;\n // draw bracket if the tuplet is not beamed\n if (this.bracketed) {\n const line_width = this.width / 2 - width / 2 - 5;\n // only draw the bracket if it has positive length\n if (line_width > 0) {\n ctx.fillRect(this.x_pos, this.y_pos, line_width, 1);\n ctx.fillRect(this.x_pos + this.width / 2 + width / 2 + 5, this.y_pos, line_width, 1);\n ctx.fillRect(this.x_pos, this.y_pos + (this.location === Tuplet.LOCATION_BOTTOM ? 1 : 0), 1, this.location * 10);\n ctx.fillRect(this.x_pos + this.width, this.y_pos + (this.location === Tuplet.LOCATION_BOTTOM ? 1 : 0), 1, this.location * 10);\n }\n }\n // draw numerator glyphs\n const shiftY = Tables.currentMusicFont().lookupMetric('digits.shiftY', 0);\n let x_offset = 0;\n this.numerator_glyphs.forEach((glyph) => {\n glyph.render(ctx, notation_start_x + x_offset, this.y_pos + this.point / 3 - 2 + shiftY);\n x_offset += defined(glyph.getMetrics().width);\n });\n // display colon and denominator if the ratio is to be shown\n if (this.ratioed) {\n const colon_x = notation_start_x + x_offset + this.point * 0.16;\n const colon_radius = this.point * 0.06;\n ctx.beginPath();\n ctx.arc(colon_x, this.y_pos - this.point * 0.08, colon_radius, 0, Math.PI * 2, true);\n ctx.closePath();\n ctx.fill();\n ctx.beginPath();\n ctx.arc(colon_x, this.y_pos + this.point * 0.12, colon_radius, 0, Math.PI * 2, true);\n ctx.closePath();\n ctx.fill();\n x_offset += this.point * 0.32;\n this.denom_glyphs.forEach((glyph) => {\n glyph.render(ctx, notation_start_x + x_offset, this.y_pos + this.point / 3 - 2 + shiftY);\n x_offset += defined(glyph.getMetrics().width);\n });\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Ron B. Yeh\n// MIT License\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * Use instead of `instanceof` as a more flexible type guard.\n * @param obj check if this object's CATEGORY matches the provided category.\n * @param category a string representing a category of VexFlow objects.\n * @param checkAncestors defaults to `true`, so we walk up the prototype chain to look for a matching `CATEGORY`.\n * If `false`, we do not check the superclass or other ancestors.\n * @returns true if `obj` has a static `CATEGORY` property that matches `category`.\n */\nexport function isCategory(obj, category, checkAncestors = true) {\n // obj is undefined, a number, a primitive string, or null.\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n // `obj.constructor` is a reference to the constructor function that created the `obj` instance.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor\n let constructorFcn = obj.constructor;\n // Check if the object's static .CATEGORY matches the provided category.\n if (checkAncestors) {\n // Walk up the prototype chain to look for a matching obj.constructor.CATEGORY.\n while (obj !== null) {\n constructorFcn = obj.constructor;\n if ('CATEGORY' in constructorFcn && constructorFcn.CATEGORY === category) {\n return true;\n }\n obj = Object.getPrototypeOf(obj);\n }\n return false;\n }\n else {\n // Do not walk up the prototype chain. Just check this particular object's static .CATEGORY string.\n return 'CATEGORY' in constructorFcn && constructorFcn.CATEGORY === category;\n }\n}\nexport const isAccidental = (obj) => isCategory(obj, Category.Accidental);\nexport const isAnnotation = (obj) => isCategory(obj, Category.Annotation);\nexport const isBarline = (obj) => isCategory(obj, Category.Barline);\nexport const isDot = (obj) => isCategory(obj, Category.Dot);\nexport const isGraceNote = (obj) => isCategory(obj, Category.GraceNote);\nexport const isGraceNoteGroup = (obj) => isCategory(obj, Category.GraceNoteGroup);\nexport const isNote = (obj) => isCategory(obj, Category.Note);\nexport const isRenderContext = (obj) => isCategory(obj, Category.RenderContext);\nexport const isStaveNote = (obj) => isCategory(obj, Category.StaveNote);\nexport const isStemmableNote = (obj) => isCategory(obj, Category.StemmableNote);\nexport const isTabNote = (obj) => isCategory(obj, Category.TabNote);\n// 'const' enums are erased by the TypeScript compiler. The string values are inlined at all the use sites.\n// See: https://www.typescriptlang.org/docs/handbook/enums.html#const-enums\nexport var Category;\n(function (Category) {\n Category[\"Accidental\"] = \"Accidental\";\n Category[\"Annotation\"] = \"Annotation\";\n Category[\"Articulation\"] = \"Articulation\";\n Category[\"Barline\"] = \"Barline\";\n Category[\"BarNote\"] = \"BarNote\";\n Category[\"Beam\"] = \"Beam\";\n Category[\"Bend\"] = \"Bend\";\n Category[\"ChordSymbol\"] = \"ChordSymbol\";\n Category[\"Clef\"] = \"Clef\";\n Category[\"ClefNote\"] = \"ClefNote\";\n Category[\"Crescendo\"] = \"Crescendo\";\n Category[\"Curve\"] = \"Curve\";\n Category[\"Dot\"] = \"Dot\";\n Category[\"Element\"] = \"Element\";\n Category[\"Fraction\"] = \"Fraction\";\n Category[\"FretHandFinger\"] = \"FretHandFinger\";\n Category[\"GhostNote\"] = \"GhostNote\";\n Category[\"Glyph\"] = \"Glyph\";\n Category[\"GlyphNote\"] = \"GlyphNote\";\n Category[\"GraceNote\"] = \"GraceNote\";\n Category[\"GraceNoteGroup\"] = \"GraceNoteGroup\";\n Category[\"GraceTabNote\"] = \"GraceTabNote\";\n Category[\"KeySignature\"] = \"KeySignature\";\n Category[\"KeySigNote\"] = \"KeySigNote\";\n Category[\"Modifier\"] = \"Modifier\";\n Category[\"MultiMeasureRest\"] = \"MultiMeasureRest\";\n Category[\"Note\"] = \"Note\";\n Category[\"NoteHead\"] = \"NoteHead\";\n Category[\"NoteSubGroup\"] = \"NoteSubGroup\";\n Category[\"Ornament\"] = \"Ornament\";\n Category[\"Parenthesis\"] = \"Parenthesis\";\n Category[\"PedalMarking\"] = \"PedalMarking\";\n Category[\"RenderContext\"] = \"RenderContext\";\n Category[\"RepeatNote\"] = \"RepeatNote\";\n Category[\"Repetition\"] = \"Repetition\";\n Category[\"Stave\"] = \"Stave\";\n Category[\"StaveConnector\"] = \"StaveConnector\";\n Category[\"StaveHairpin\"] = \"StaveHairpin\";\n Category[\"StaveLine\"] = \"StaveLine\";\n Category[\"StaveModifier\"] = \"StaveModifier\";\n Category[\"StaveNote\"] = \"StaveNote\";\n Category[\"StaveSection\"] = \"StaveSection\";\n Category[\"StaveTempo\"] = \"StaveTempo\";\n Category[\"StaveText\"] = \"StaveText\";\n Category[\"StaveTie\"] = \"StaveTie\";\n Category[\"Stem\"] = \"Stem\";\n Category[\"StemmableNote\"] = \"StemmableNote\";\n Category[\"StringNumber\"] = \"StringNumber\";\n Category[\"Stroke\"] = \"Stroke\";\n Category[\"System\"] = \"System\";\n Category[\"TabNote\"] = \"TabNote\";\n Category[\"TabSlide\"] = \"TabSlide\";\n Category[\"TabStave\"] = \"TabStave\";\n Category[\"TabTie\"] = \"TabTie\";\n Category[\"TextBracket\"] = \"TextBracket\";\n Category[\"TextDynamics\"] = \"TextDynamics\";\n Category[\"TextNote\"] = \"TextNote\";\n Category[\"Tickable\"] = \"Tickable\";\n Category[\"TimeSignature\"] = \"TimeSignature\";\n Category[\"TimeSigNote\"] = \"TimeSigNote\";\n Category[\"Tremolo\"] = \"Tremolo\";\n Category[\"Tuplet\"] = \"Tuplet\";\n Category[\"Vibrato\"] = \"Vibrato\";\n Category[\"VibratoBracket\"] = \"VibratoBracket\";\n Category[\"Voice\"] = \"Voice\";\n Category[\"Volta\"] = \"Volta\";\n})(Category || (Category = {}));\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// Note: Keep this module free of imports to reduce the chance of circular dependencies.\n/** `RuntimeError` will be thrown by VexFlow classes in case of error. */\nexport class RuntimeError extends Error {\n constructor(code, message = '') {\n super('[RuntimeError] ' + code + ': ' + message);\n this.code = code;\n }\n}\n/** VexFlow can be used outside of the browser (e.g., Node) where `window` may not be defined. */\n// eslint-disable-next-line\nexport function globalObject() {\n if (typeof globalThis !== 'undefined') {\n return globalThis;\n }\n if (typeof self !== 'undefined') {\n return self;\n }\n if (typeof window !== 'undefined') {\n return window;\n }\n if (typeof global !== 'undefined') {\n return global;\n }\n return Function('return this')();\n}\n/**\n * Check that `x` is of type `T` and not `undefined`.\n * If `x` is `undefined`, throw a RuntimeError with the optionally provided error code and message.\n */\nexport function defined(x, code = 'undefined', message = '') {\n if (x === undefined) {\n throw new RuntimeError(code, message);\n }\n return x;\n}\n/** Default log function sends all arguments to console. */\n// eslint-disable-next-line\nexport function log(block, ...args) {\n if (!args)\n return;\n const line = Array.prototype.slice.call(args).join(' ');\n globalObject().console.log(block + ': ' + line);\n}\n/** Dump warning to console. */\n// eslint-disable-next-line\nexport function warn(...args) {\n const line = args.join(' ');\n const err = new Error();\n globalObject().console.log('Warning: ', line, err.stack);\n}\n/** Round number to nearest fractional value (`.5`, `.25`, etc.) */\nfunction roundN(x, n) {\n return x % n >= n / 2 ? parseInt(`${x / n}`, 10) * n + n : parseInt(`${x / n}`, 10) * n;\n}\n/** Locate the mid point between stave lines. Returns a fractional line if a space. */\nexport function midLine(a, b) {\n let mid_line = b + (a - b) / 2;\n if (mid_line % 2 > 0) {\n mid_line = roundN(mid_line * 10, 5) / 10;\n }\n return mid_line;\n}\n/**\n * Used by various classes (e.g., SVGContext) to provide a\n * unique prefix to element names (or other keys in shared namespaces).\n */\nexport function prefix(text) {\n return `vf-${text}`;\n}\n/**\n * Convert an arbitrary angle in radians to the equivalent one in the range [0, pi).\n */\nexport function normalizeAngle(a) {\n a = a % (2 * Math.PI);\n if (a < 0) {\n a += 2 * Math.PI;\n }\n return a;\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// Utility methods used by the rest of the VexFlow codebase.\nimport { Flow } from './flow';\nimport { log, RuntimeError } from './util';\nexport class Vex {\n // Users of `Vex.forEach(a, fn)` should use `Array.prototype.forEach()` instead.\n // static forEach(arr: T[], callbackFn: (value: T, index: number, array: T[]) => void) {\n // arr.forEach(callbackFn);\n // }\n /**\n * Take `arr` and return a new list consisting of the sorted, unique,\n * contents of arr. Does not modify `arr`.\n */\n // eslint-disable-next-line\n static sortAndUnique(arr, cmp, eq) {\n if (arr.length > 1) {\n const newArr = [];\n let last;\n arr.sort(cmp);\n for (let i = 0; i < arr.length; ++i) {\n if (i === 0 || !eq(arr[i], last)) {\n newArr.push(arr[i]);\n }\n last = arr[i];\n }\n return newArr;\n }\n else {\n return arr;\n }\n }\n /** Check if array `arr` contains `obj`. */\n // eslint-disable-next-line\n static contains(arr, obj) {\n let i = arr.length;\n while (i--) {\n if (arr[i] === obj) {\n return true;\n }\n }\n return false;\n }\n // Get the 2D Canvas context from DOM element `canvas_sel`.\n static getCanvasContext(canvasSelector) {\n if (!canvasSelector) {\n throw new RuntimeError('BadArgument', 'Invalid canvas selector: ' + canvasSelector);\n }\n const canvas = document.getElementById(canvasSelector);\n if (!(canvas && canvas.getContext)) {\n throw new RuntimeError('UnsupportedBrowserError', 'This browser does not support HTML5 Canvas');\n }\n return canvas.getContext('2d');\n }\n /** Benchmark. Run function `f` once and report time elapsed shifted by `s` milliseconds. */\n // eslint-disable-next-line\n static benchmark(s, f) {\n const start_time = new Date().getTime();\n f();\n const elapsed = new Date().getTime() - start_time;\n log(s, elapsed + 'ms');\n }\n // Get stack trace.\n static stackTrace() {\n const err = new Error();\n return err.stack;\n }\n}\nVex.Flow = Flow;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Bend } from './bend';\nimport { Modifier } from './modifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\n/** `Vibrato` implements diverse vibratos. */\nexport class Vibrato extends Modifier {\n constructor() {\n super();\n this.position = Modifier.Position.RIGHT;\n this.render_options = {\n harsh: false,\n vibrato_width: 20,\n wave_height: 6,\n wave_width: 4,\n wave_girth: 2,\n };\n this.setVibratoWidth(this.render_options.vibrato_width);\n }\n static get CATEGORY() {\n return Category.Vibrato;\n }\n /** Arrange vibratos inside a `ModifierContext`. */\n static format(vibratos, state, context) {\n if (!vibratos || vibratos.length === 0)\n return false;\n // Vibratos are always on top.\n let text_line = state.top_text_line;\n let width = 0;\n let shift = state.right_shift - 7;\n // If there's a bend, drop the text line\n const bends = context.getMembers(Bend.CATEGORY);\n if (bends && bends.length > 0) {\n const bendHeight = bends.map((bb) => bb.getTextHeight()).reduce((a, b) => (a > b ? a : b)) / Tables.STAVE_LINE_DISTANCE;\n text_line = text_line - (bendHeight + 1);\n }\n else {\n state.top_text_line += 1;\n }\n // Format Vibratos\n for (let i = 0; i < vibratos.length; ++i) {\n const vibrato = vibratos[i];\n vibrato.setXShift(shift);\n vibrato.setTextLine(text_line);\n width += vibrato.getWidth();\n shift += width;\n }\n state.right_shift += width;\n return true;\n }\n /** Set harsh vibrato. */\n setHarsh(harsh) {\n this.render_options.harsh = harsh;\n return this;\n }\n /** Set vibrato width in pixels. */\n setVibratoWidth(width) {\n this.render_options.vibrato_width = width;\n this.setWidth(width);\n return this;\n }\n /** Draw the vibrato on the rendering context. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(Modifier.Position.RIGHT, this.index);\n const vx = start.x + this.x_shift;\n const vy = note.getYForTopText(this.text_line) + 2;\n Vibrato.renderVibrato(ctx, vx, vy, this.render_options);\n }\n /**\n * Static rendering method that can be called from\n * other classes (e.g. VibratoBracket).\n */\n static renderVibrato(ctx, x, y, opts) {\n const { harsh, vibrato_width, wave_width, wave_girth, wave_height } = opts;\n const num_waves = vibrato_width / wave_width;\n ctx.beginPath();\n let i;\n if (harsh) {\n ctx.moveTo(x, y + wave_girth + 1);\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.lineTo(x + wave_width, y - wave_height / 2);\n x += wave_width;\n ctx.lineTo(x + wave_width, y + wave_height / 2);\n x += wave_width;\n }\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.lineTo(x - wave_width, y - wave_height / 2 + wave_girth + 1);\n x -= wave_width;\n ctx.lineTo(x - wave_width, y + wave_height / 2 + wave_girth + 1);\n x -= wave_width;\n }\n ctx.fill();\n }\n else {\n ctx.moveTo(x, y + wave_girth);\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.quadraticCurveTo(x + wave_width / 2, y - wave_height / 2, x + wave_width, y);\n x += wave_width;\n ctx.quadraticCurveTo(x + wave_width / 2, y + wave_height / 2, x + wave_width, y);\n x += wave_width;\n }\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.quadraticCurveTo(x - wave_width / 2, y + wave_height / 2 + wave_girth, x - wave_width, y + wave_girth);\n x -= wave_width;\n ctx.quadraticCurveTo(x - wave_width / 2, y - wave_height / 2 + wave_girth, x - wave_width, y + wave_girth);\n x -= wave_width;\n }\n ctx.fill();\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Balazs Forian-Szabo\n// MIT License\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { log } from './util';\nimport { Vibrato } from './vibrato';\n// eslint-disable-next-line\nfunction L(...args) {\n if (VibratoBracket.DEBUG)\n log('Vex.Flow.VibratoBracket', args);\n}\n/** `VibratoBracket` renders vibrato effect between two notes. */\nexport class VibratoBracket extends Element {\n /**\n * Either the stop or start note must be set, or both of them.\n * An undefined value for the start or stop note indicates that the vibrato\n * is drawn from the beginning or until the end of the stave accordingly.\n */\n constructor(bracket_data) {\n super();\n if (bracket_data.start)\n this.start = bracket_data.start;\n if (bracket_data.stop)\n this.stop = bracket_data.stop;\n this.line = 1;\n this.render_options = {\n harsh: false,\n wave_height: 6,\n wave_width: 4,\n wave_girth: 2,\n vibrato_width: 0,\n };\n }\n static get CATEGORY() {\n return Category.VibratoBracket;\n }\n /** Set line position of the vibrato bracket. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Set harsh vibrato bracket. */\n setHarsh(harsh) {\n this.render_options.harsh = harsh;\n return this;\n }\n /** Draw the vibrato bracket on the rendering context. */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n const y = (this.start && this.start.checkStave().getYForTopText(this.line)) ||\n (this.stop && this.stop.checkStave().getYForTopText(this.line)) ||\n 0;\n // If start note is not set then vibrato will be drawn\n // from the beginning of the stave\n const start_x = (this.start && this.start.getAbsoluteX()) || (this.stop && this.stop.checkStave().getTieStartX()) || 0;\n // If stop note is not set then vibrato will be drawn\n // until the end of the stave\n const stop_x = (this.stop && this.stop.getAbsoluteX() - this.stop.getWidth() - 5) ||\n (this.start && this.start.checkStave().getTieEndX() - 10) ||\n 0;\n this.render_options.vibrato_width = stop_x - start_x;\n L('Rendering VibratoBracket: start_x:', start_x, 'stop_x:', stop_x, 'y:', y);\n Vibrato.renderVibrato(ctx, start_x, y, this.render_options);\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.VibratoBracket.DEBUG` to `true`. */\nVibratoBracket.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Fraction } from './fraction';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nexport var VoiceMode;\n(function (VoiceMode) {\n VoiceMode[VoiceMode[\"STRICT\"] = 1] = \"STRICT\";\n VoiceMode[VoiceMode[\"SOFT\"] = 2] = \"SOFT\";\n VoiceMode[VoiceMode[\"FULL\"] = 3] = \"FULL\";\n})(VoiceMode || (VoiceMode = {}));\n/**\n * `Voice` is mainly a container object to group `Tickables` for formatting.\n */\nexport class Voice extends Element {\n constructor(time, options) {\n super();\n this.resolutionMultiplier = 1;\n this.mode = VoiceMode.STRICT;\n this.preFormatted = false;\n this.ticksUsed = new Fraction(0, 1);\n this.largestTickWidth = 0;\n this.tickables = [];\n this.options = Object.assign({ softmaxFactor: 100 }, options);\n // Convert the `time` string into a VoiceTime object if necessary.\n let voiceTime;\n if (typeof time === 'string') {\n // Time signature shortcut: \"4/4\", \"3/8\", etc.\n const match = time.match(/(\\d+)\\/(\\d+)/);\n if (match) {\n voiceTime = {\n num_beats: parseInt(match[1]),\n beat_value: parseInt(match[2]),\n };\n }\n }\n else {\n voiceTime = time;\n }\n // Default time signature is 4/4.\n this.time = Object.assign({ num_beats: 4, beat_value: 4, resolution: Tables.RESOLUTION }, voiceTime);\n // Recalculate total ticks.\n this.totalTicks = new Fraction(this.time.num_beats * (this.time.resolution / this.time.beat_value), 1);\n this.smallestTickCount = this.totalTicks.clone();\n }\n static get CATEGORY() {\n return Category.Voice;\n }\n /**\n * Modes allow the addition of ticks in three different ways:\n * - STRICT: This is the default. Ticks must fill the voice.\n * - SOFT: Ticks can be added without restrictions.\n * - FULL: Ticks do not need to fill the voice, but can't exceed the maximum tick length.\n */\n static get Mode() {\n return VoiceMode;\n }\n /** Get the total ticks in the voice. */\n getTotalTicks() {\n return this.totalTicks;\n }\n /** Get the total ticks used in the voice by all the tickables. */\n getTicksUsed() {\n return this.ticksUsed;\n }\n /** Get the largest width of all the tickables. */\n getLargestTickWidth() {\n return this.largestTickWidth;\n }\n /** Get the tick count for the shortest tickable */\n getSmallestTickCount() {\n return this.smallestTickCount;\n }\n /** Get the tickables in the voice. */\n getTickables() {\n return this.tickables;\n }\n /** Get the voice mode. */\n getMode() {\n return this.mode;\n }\n /**\n * Set the voice mode.\n * @param mode value from `VoiceMode`\n */\n setMode(mode) {\n this.mode = mode;\n return this;\n }\n /** Get the resolution multiplier for the voice. */\n getResolutionMultiplier() {\n return this.resolutionMultiplier;\n }\n /** Get the actual tick resolution for the voice. */\n getActualResolution() {\n return this.resolutionMultiplier * this.time.resolution;\n }\n /** Set the voice's stave. */\n setStave(stave) {\n this.stave = stave;\n // Reset the bounding box so we can reformat.\n this.boundingBox = undefined;\n return this;\n }\n getStave() {\n return this.stave;\n }\n /** Get the bounding box for the voice. */\n getBoundingBox() {\n if (!this.boundingBox) {\n const stave = this.checkStave();\n let boundingBox = undefined;\n for (let i = 0; i < this.tickables.length; ++i) {\n const tickable = this.tickables[i];\n tickable.setStave(stave);\n const bb = tickable.getBoundingBox();\n if (bb) {\n boundingBox = boundingBox ? boundingBox.mergeWith(bb) : bb;\n }\n }\n this.boundingBox = boundingBox;\n }\n return this.boundingBox;\n }\n /** Set the voice mode to strict or soft. */\n setStrict(strict) {\n this.mode = strict ? VoiceMode.STRICT : VoiceMode.SOFT;\n return this;\n }\n /** Determine if the voice is complete according to the voice mode. */\n isComplete() {\n if (this.mode === VoiceMode.STRICT || this.mode === VoiceMode.FULL) {\n return this.ticksUsed.equals(this.totalTicks);\n }\n else {\n return true;\n }\n }\n /**\n * We use softmax to layout the tickables proportional to the exponent of\n * their duration. The softmax factor is used to determine the 'linearness' of\n * the layout.\n *\n * The softmax of all the tickables in this voice should sum to 1.\n */\n setSoftmaxFactor(factor) {\n this.options.softmaxFactor = factor;\n return this;\n }\n /**\n * Calculate the sum of the exponents of all the ticks in this voice to use\n * as the denominator of softmax.\n */\n reCalculateExpTicksUsed() {\n const totalTicks = this.ticksUsed.value();\n const exp = (tickable) => Math.pow(this.options.softmaxFactor, tickable.getTicks().value() / totalTicks);\n this.expTicksUsed = this.tickables.map(exp).reduce((a, b) => a + b, 0);\n return this.expTicksUsed;\n }\n /** Get the softmax-scaled value of a tick duration. 'tickValue' is a number. */\n softmax(tickValue) {\n if (!this.expTicksUsed) {\n this.expTicksUsed = this.reCalculateExpTicksUsed();\n }\n const totalTicks = this.ticksUsed.value();\n const exp = (v) => Math.pow(this.options.softmaxFactor, v / totalTicks);\n const sm = exp(tickValue) / this.expTicksUsed;\n return sm;\n }\n /** Add a tickable to the voice. */\n addTickable(tickable) {\n if (!tickable.shouldIgnoreTicks()) {\n const ticks = tickable.getTicks();\n // Update the total ticks for this line.\n this.ticksUsed.add(ticks);\n this.expTicksUsed = 0; // reset\n if ((this.mode === VoiceMode.STRICT || this.mode === VoiceMode.FULL) &&\n this.ticksUsed.greaterThan(this.totalTicks)) {\n this.ticksUsed.subtract(ticks);\n throw new RuntimeError('BadArgument', 'Too many ticks.');\n }\n // Track the smallest tickable for formatting.\n if (ticks.lessThan(this.smallestTickCount)) {\n this.smallestTickCount = ticks.clone();\n }\n this.resolutionMultiplier = this.ticksUsed.denominator;\n // Expand total ticks using denominator from ticks used.\n this.totalTicks.add(0, this.ticksUsed.denominator);\n }\n // Add the tickable to the line.\n this.tickables.push(tickable);\n tickable.setVoice(this);\n return this;\n }\n /** Add an array of tickables to the voice. */\n addTickables(tickables) {\n for (let i = 0; i < tickables.length; ++i) {\n this.addTickable(tickables[i]);\n }\n return this;\n }\n /** Preformat the voice by applying the voice's stave to each note. */\n preFormat() {\n if (this.preFormatted)\n return this;\n const stave = this.checkStave();\n this.tickables.forEach((tickable) => {\n if (!tickable.getStave()) {\n tickable.setStave(stave);\n }\n });\n this.preFormatted = true;\n return this;\n }\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n /**\n * Render the voice onto the canvas `context` and an optional `stave`.\n * If `stave` is omitted, it is expected that the notes have staves\n * already set.\n *\n * This method also calculates the voice's boundingBox while drawing\n * the notes. Note the similarities with this.getBoundingBox().\n */\n draw(context = this.checkContext(), stave) {\n stave = stave !== null && stave !== void 0 ? stave : this.stave;\n this.setRendered();\n let boundingBox = undefined;\n for (let i = 0; i < this.tickables.length; ++i) {\n const tickable = this.tickables[i];\n // Set the stave if provided.\n if (stave) {\n tickable.setStave(stave);\n }\n defined(tickable.getStave(), 'MissingStave', 'The voice cannot draw tickables without staves.');\n const bb = tickable.getBoundingBox();\n if (bb) {\n boundingBox = boundingBox ? boundingBox.mergeWith(bb) : bb;\n }\n tickable.setContext(context);\n tickable.drawWithStyle();\n }\n this.boundingBox = boundingBox;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Ron B. Yeh\n// MIT License\n//\n// Utilities for working with Web APIs.\n// See: https://developer.mozilla.org/en-US/docs/Web/API\nimport { globalObject } from './util';\n// eslint-disable-next-line\nexport function isHTMLCanvas(element) {\n if (!element)\n return false;\n const global = globalObject();\n return (\n // It's either an instance of the HTMLCanvasElement class,\n (typeof global.HTMLCanvasElement === 'function' && element instanceof global.HTMLCanvasElement) ||\n // OR it's pretending to be a element. Good enough!\n // Do not rely on .tagName, because node-canvas doesn't provide a tagName.\n (typeof element.getContext === 'function' && typeof element.toDataURL === 'function'));\n}\n// eslint-disable-next-line\nexport function isHTMLDiv(element) {\n if (!element)\n return false;\n const global = globalObject();\n return (\n // It's either an instance of the HTMLDivElement class.\n (typeof global.HTMLDivElement === 'function' && element instanceof global.HTMLDivElement) ||\n // OR it's pretending to be a
. See: svgcontext.ts.\n (typeof element.appendChild === 'function' && typeof element.style === 'object'));\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// vexflow-debug.ts is the entry point for the build output file vexflow-debug.js.\n// It statically bundles all the music engraving fonts.\n// Currently, it just imports vexflow.ts, but the webpack config inside Gruntfile.js\n// sets the webpack mode to 'development' to produce an unminified build.\n// In the future, we could do something different with this entry file, such as turn on flags for logging.\nimport { Vex } from './vexflow';\nexport * from '../src/index';\nexport default Vex;\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/build/cjs/vexflow-font-bravura.js b/build/cjs/vexflow-font-bravura.js new file mode 100644 index 0000000000..aec65b3bfe --- /dev/null +++ b/build/cjs/vexflow-font-bravura.js @@ -0,0 +1,2 @@ +!function(b,l){"object"==typeof exports&&"object"==typeof module?module.exports=l():"function"==typeof define&&define.amd?define([],l):"object"==typeof exports?exports.VexFlowFont=l():(b.VexFlowFont=b.VexFlowFont||{},b.VexFlowFont.Bravura=l())}("undefined"!=typeof window?window:"undefined"!=typeof globalThis?globalThis:this,(function(){return(()=>{"use strict";var b={d:(l,a)=>{for(var m in a)b.o(a,m)&&!b.o(l,m)&&Object.defineProperty(l,m,{enumerable:!0,get:a[m]})},o:(b,l)=>Object.prototype.hasOwnProperty.call(b,l)},l={};b.d(l,{default:()=>a});const a={data:{glyphs:{bracketTop:{x_min:0,x_max:469,y_min:0,y_max:295,ha:295,o:"m 0 0 l 180 0 b 674 390 410 43 616 150 b 675 405 675 396 675 400 b 664 425 675 416 671 422 b 628 405 651 425 635 415 b 157 179 613 389 432 199 l 12 179 b 0 168 3 179 0 177 z"},bracketBottom:{x_min:0,x_max:469,y_min:-295,y_max:0,ha:295,o:"m 0 -168 b 12 -179 0 -177 3 -179 l 157 -179 b 628 -405 432 -199 613 -389 b 664 -425 635 -415 651 -425 b 675 -405 671 -422 675 -416 b 674 -390 675 -400 675 -396 b 180 0 616 -150 410 -43 l 0 0 z"},barlineTick:{x_min:0,x_max:36,y_min:868,y_max:1120,ha:252,o:"m 52 1250 l 52 1613 l 0 1613 l 0 1250 z"},breathMarkTick:{x_min:0,x_max:500,y_min:0,y_max:502,ha:502,o:"m 9 367 b 0 374 6 372 3 374 b 9 334 0 367 0 343 b 179 19 40 312 164 121 b 192 0 179 3 186 0 b 210 19 197 0 207 6 b 698 701 245 197 507 658 b 720 714 714 704 720 711 b 698 723 720 720 711 723 b 197 186 455 714 210 202 b 186 176 194 179 189 176 b 176 186 179 176 176 186 b 9 367 143 266 27 359 z"},segno:{x_min:4,x_max:550,y_min:-27,y_max:759,ha:786,o:"m 194 958 b 217 939 203 958 213 955 l 220 929 b 325 805 230 890 252 805 b 425 901 384 805 425 840 b 413 969 425 923 420 946 b 220 1060 390 1035 294 1060 b 6 793 120 1060 6 936 b 29 687 6 759 13 723 b 295 449 75 582 284 454 b 304 438 301 446 304 444 b 295 415 304 432 301 425 b 78 22 285 395 78 22 b 73 3 75 16 73 9 b 114 -39 73 -20 91 -39 b 150 -17 128 -39 143 -30 b 377 395 150 -17 373 386 b 395 402 377 393 389 402 b 704 176 416 397 704 312 b 621 75 704 120 670 82 l 616 73 b 562 138 586 73 562 94 l 562 154 b 485 249 562 209 526 249 b 468 246 480 249 474 248 b 366 153 415 233 366 210 b 540 -12 366 65 455 -12 b 600 -1 559 -12 579 -9 b 792 251 716 37 792 131 b 789 292 792 264 791 278 b 523 588 768 451 540 579 b 498 611 505 598 498 603 b 501 619 498 613 500 616 b 732 1032 508 631 732 1032 b 737 1053 736 1040 737 1045 b 697 1093 737 1076 719 1093 b 661 1073 683 1093 668 1086 b 423 647 661 1073 432 660 b 410 635 419 639 416 635 b 396 639 406 635 402 636 b 128 792 383 644 166 727 b 108 868 120 808 108 838 b 186 958 108 907 125 948 z m 598 671 b 680 589 598 626 635 589 b 762 671 726 589 762 626 b 680 753 762 717 726 753 b 598 671 635 753 598 717 z m 202 380 b 120 462 202 425 166 462 b 37 380 75 462 37 425 b 120 298 37 334 75 298 b 202 380 166 298 202 334 z"},coda:{x_min:-4,x_max:955,y_min:-158,y_max:898,ha:1056,o:"m 1349 576 l 1178 576 b 729 1083 1164 847 962 1064 l 729 1269 b 694 1293 729 1287 713 1293 b 660 1269 675 1293 660 1287 l 660 1083 b 210 576 426 1064 226 848 l 20 576 b -6 541 0 576 -6 560 b 20 507 -6 523 0 507 l 210 507 b 660 0 226 238 426 19 l 660 -202 b 694 -228 660 -222 675 -228 b 729 -202 713 -228 729 -222 l 729 0 b 1178 507 962 19 1164 238 l 1349 507 b 1375 541 1369 507 1375 523 b 1349 576 1375 560 1369 576 z m 940 576 l 729 576 l 729 1002 b 940 576 930 985 940 809 z m 660 1002 l 660 576 l 455 576 b 660 1002 455 809 455 985 z m 455 507 l 660 507 l 660 69 b 455 507 474 91 456 285 z m 729 69 l 729 507 l 940 507 b 729 69 936 287 909 91 z"},gClef:{x_min:0,x_max:671,y_min:-658,y_max:1098,ha:1756,o:"m 541 598 b 550 625 539 615 541 616 b 824 1174 706 770 824 953 b 730 1509 824 1299 789 1423 b 655 1581 708 1541 671 1581 b 562 1512 635 1581 590 1544 b 420 1064 455 1394 420 1214 b 441 828 420 981 431 887 b 428 793 444 811 445 808 b 0 125 220 622 0 416 b 524 -363 0 -125 171 -363 b 624 -354 557 -363 595 -360 b 645 -367 639 -351 642 -350 b 684 -657 662 -464 684 -589 b 455 -896 684 -870 540 -896 b 340 -854 377 -896 340 -873 b 386 -829 340 -844 353 -840 b 482 -694 431 -816 482 -778 b 344 -547 482 -615 432 -547 b 190 -713 248 -547 190 -624 b 464 -948 190 -806 246 -948 b 747 -660 560 -948 747 -904 b 706 -351 747 -577 721 -441 b 724 -327 703 -334 704 -336 b 966 16 870 -269 966 -147 b 619 363 966 200 831 363 b 577 389 582 363 582 363 z m 677 1358 b 763 1240 724 1358 763 1319 b 513 851 763 1080 626 950 b 494 863 503 842 497 844 b 485 995 488 900 485 949 b 677 1358 485 1220 589 1358 z m 520 377 b 498 343 524 350 524 351 b 289 63 372 300 289 186 b 455 -192 289 -66 357 -158 b 494 -200 467 -196 484 -200 b 511 -184 505 -200 511 -193 b 490 -166 511 -174 500 -170 b 386 -12 429 -140 386 -78 b 530 157 386 71 442 132 b 559 145 553 163 556 161 l 631 -284 b 611 -304 634 -300 632 -300 b 530 -311 588 -308 559 -311 b 115 29 278 -311 115 -171 b 249 363 115 114 130 228 b 469 567 336 459 402 513 b 490 562 484 579 487 577 z m 619 148 b 635 168 616 166 618 170 b 848 -66 752 158 848 60 b 713 -271 848 -157 793 -230 b 690 -262 696 -279 693 -279 z"},cClef:{x_min:0,x_max:699,y_min:-506,y_max:506,ha:1012,o:"m 331 694 b 301 724 331 714 321 724 l 300 724 b 269 694 279 724 269 714 l 269 -694 b 300 -724 269 -714 279 -724 l 301 -724 b 331 -694 321 -724 331 -714 l 331 -63 b 344 -55 331 -52 338 -53 b 472 -265 382 -65 442 -102 b 500 -301 477 -288 485 -301 b 530 -262 516 -301 523 -287 b 684 -128 549 -199 582 -128 b 804 -409 778 -128 804 -220 b 651 -683 804 -598 770 -683 b 528 -644 631 -683 528 -674 b 567 -622 528 -636 552 -628 b 625 -528 596 -612 625 -583 b 527 -429 625 -465 583 -429 b 416 -547 465 -429 416 -471 b 667 -729 416 -638 495 -729 b 1007 -413 903 -729 1007 -563 b 706 -76 1007 -215 897 -76 b 618 -89 664 -76 636 -84 b 576 -88 603 -94 589 -96 b 524 0 556 -75 524 -29 b 576 88 524 29 556 75 b 618 89 589 96 603 94 b 706 76 636 84 664 76 b 1007 413 897 76 1007 215 b 667 729 1007 563 903 729 b 416 547 495 729 416 638 b 527 429 416 471 465 429 b 625 528 583 429 625 465 b 567 622 625 583 596 612 b 528 644 552 628 528 636 b 651 683 528 674 631 683 b 804 409 770 683 804 598 b 684 128 804 220 778 128 b 530 262 582 128 549 199 b 500 301 523 287 516 301 b 472 265 485 301 477 288 b 344 55 442 102 382 65 b 331 63 338 53 331 52 z m 30 724 b 0 694 10 724 0 714 l 0 -694 b 30 -724 0 -714 10 -724 l 154 -724 b 184 -694 174 -724 184 -714 l 184 694 b 154 724 184 714 174 724 z"},fClef:{x_min:-5,x_max:684,y_min:-635,y_max:262,ha:897,o:"m 363 377 b 0 56 112 377 0 194 b 177 -158 0 -59 60 -158 b 330 -6 268 -158 330 -95 b 192 144 330 86 262 144 b 120 134 153 144 138 134 b 96 160 101 134 96 145 b 330 323 96 217 183 323 b 549 -53 482 323 549 173 b 14 -871 549 -455 350 -680 b -7 -897 1 -878 -7 -886 b 12 -914 -7 -906 -1 -914 b 36 -907 19 -914 27 -912 b 765 -40 390 -734 765 -478 b 363 377 765 210 612 377 z m 906 259 b 827 180 861 259 827 225 b 906 101 827 135 861 101 b 985 180 950 101 985 135 b 906 259 985 225 950 259 z m 907 -102 b 829 -180 863 -102 829 -135 b 907 -258 829 -225 863 -258 b 985 -180 952 -258 985 -225 b 907 -102 985 -135 952 -102 z"},unpitchedPercussionClef1:{x_min:0,x_max:382,y_min:-250,y_max:250,ha:500,o:"m 230 -338 l 230 338 b 210 360 230 350 222 360 l 20 360 b 0 338 9 360 0 350 l 0 -338 b 20 -360 0 -350 9 -360 l 210 -360 b 230 -338 222 -360 230 -350 z m 550 338 b 530 360 550 350 541 360 l 340 360 b 320 338 328 360 320 350 l 320 -338 b 340 -360 320 -350 328 -360 l 530 -360 b 550 -338 541 -360 550 -350 z"},"6stringTabClef":{x_min:-3,x_max:408,y_min:-748,y_max:764,ha:1512,o:"m 557 1024 l 557 1100 l 26 1100 l 26 1024 l 249 1024 l 249 422 l 336 422 l 336 1024 z m 588 -328 l 350 348 l 238 348 l -4 -328 l 88 -328 l 160 -125 l 420 -125 l 491 -328 z m 397 -52 l 181 -52 l 292 256 z m 544 -883 b 420 -719 544 -802 507 -752 b 514 -572 482 -690 514 -639 b 314 -399 514 -472 442 -399 l 39 -399 l 39 -1077 l 344 -1077 b 544 -883 467 -1077 544 -995 z m 428 -583 b 292 -691 428 -652 389 -691 l 125 -691 l 125 -475 l 292 -475 b 428 -583 389 -475 428 -514 z m 458 -884 b 337 -1001 458 -949 418 -1001 l 125 -1001 l 125 -768 l 337 -768 b 458 -884 418 -768 458 -818 z"},timeSig0:{x_min:20,x_max:450,y_min:-250,y_max:251,ha:501,o:"m 648 0 b 338 361 648 200 510 361 b 29 0 167 361 29 200 b 338 -360 29 -199 167 -360 b 648 0 510 -360 648 -199 z m 338 317 b 446 10 397 317 446 180 b 338 -295 446 -158 397 -295 b 230 10 278 -295 230 -158 b 338 317 230 180 278 317 z"},timeSig1:{x_min:20,x_max:314,y_min:-250,y_max:251,ha:501,o:"m 35 19 b 29 0 35 19 29 10 b 45 -20 29 -7 33 -16 b 58 -23 50 -22 56 -23 b 78 -10 72 -23 78 -10 b 156 117 78 -10 140 89 b 170 131 161 127 167 131 b 179 111 176 131 179 120 l 179 -261 b 115 -315 179 -294 145 -315 b 91 -337 105 -315 91 -320 b 122 -360 91 -353 104 -360 l 429 -360 b 452 -337 452 -360 452 -337 b 431 -315 452 -337 452 -315 b 384 -265 410 -315 384 -289 l 384 328 b 356 361 384 351 376 360 b 281 356 336 361 300 356 b 206 360 253 356 228 357 b 199 361 203 360 200 361 b 173 334 184 361 179 347 z"},timeSig2:{x_min:20,x_max:426,y_min:-257,y_max:254,ha:511,o:"m 606 -131 b 589 -111 606 -114 599 -111 b 570 -127 577 -111 573 -117 l 569 -128 b 513 -192 554 -164 543 -192 b 488 -187 505 -192 498 -190 b 445 -171 469 -180 459 -179 b 289 -137 416 -160 348 -137 b 236 -145 271 -137 252 -140 b 422 -42 268 -94 390 -50 b 613 147 523 -14 613 27 b 330 366 613 300 464 366 b 69 275 229 366 140 357 b 29 170 45 245 29 209 b 42 108 29 150 33 130 b 160 29 63 63 108 29 b 261 156 248 29 261 120 b 161 275 261 242 161 246 b 275 330 164 295 190 330 b 405 192 403 330 405 233 b 193 -102 405 60 297 -39 b 33 -317 114 -153 58 -223 l 32 -321 b 69 -370 32 -340 48 -370 b 203 -282 101 -370 118 -282 b 410 -360 261 -282 282 -360 b 606 -131 472 -360 583 -354 z"},timeSig3:{x_min:20,x_max:401,y_min:-251,y_max:249,ha:500,o:"m 307 357 b 301 357 305 357 304 357 l 291 359 b 285 359 289 359 287 359 b 37 200 161 359 37 276 b 154 84 37 153 65 89 l 161 84 b 256 177 225 84 256 130 l 256 189 b 209 248 252 242 216 245 b 180 268 202 251 180 248 l 180 274 b 240 310 183 298 228 310 b 374 199 363 310 374 233 l 374 189 b 199 36 374 82 289 40 b 164 12 184 35 164 27 b 200 -6 164 -6 189 -6 b 379 -137 366 -6 379 -118 b 269 -307 379 -289 301 -307 b 256 -305 264 -307 258 -305 b 216 -282 245 -304 217 -304 l 216 -275 b 249 -180 216 -243 248 -222 b 145 -76 249 -120 207 -76 b 130 -78 140 -76 135 -76 b 60 -115 105 -82 78 -96 b 29 -203 36 -137 29 -171 b 275 -361 32 -315 134 -359 l 288 -361 b 577 -161 431 -361 577 -288 l 577 -151 b 537 -50 575 -109 564 -82 b 503 -20 528 -39 517 -29 l 472 -3 l 425 10 b 410 17 418 12 413 12 b 409 24 409 20 409 22 b 415 37 409 30 410 36 b 459 50 431 42 446 43 b 547 181 517 78 547 115 b 307 357 547 314 367 353 z"},timeSig4:{x_min:20,x_max:450,y_min:-250,y_max:251,ha:501,o:"m 521 -107 l 521 202 b 504 226 521 213 520 226 b 475 213 491 226 484 223 l 338 48 b 325 14 333 40 325 32 l 325 -107 l 131 -107 b 481 336 246 -9 477 318 l 482 340 b 461 361 482 353 472 361 b 363 359 448 361 389 359 b 261 361 337 359 272 361 b 228 334 248 361 228 357 b 43 -105 228 156 86 -45 l 35 -117 b 35 -118 35 -117 35 -118 l 33 -120 b 29 -137 30 -127 29 -132 b 58 -161 29 -151 40 -161 l 325 -161 l 325 -252 b 268 -302 325 -291 294 -302 b 235 -330 245 -302 235 -315 b 262 -360 235 -344 240 -360 l 569 -360 b 598 -330 583 -360 598 -350 b 566 -301 598 -310 580 -301 b 521 -246 552 -301 521 -292 l 521 -161 l 626 -161 b 648 -134 641 -161 648 -151 b 626 -107 648 -117 642 -107 z"},timeSig5:{x_min:20,x_max:383,y_min:-251,y_max:246,ha:497,o:"m 109 85 b 117 179 109 85 115 166 b 138 197 118 190 125 197 l 144 197 b 285 184 158 194 226 184 b 492 323 485 184 492 300 b 472 353 492 341 488 353 b 295 340 454 353 341 340 b 101 354 249 340 125 351 b 66 330 75 354 68 341 l 50 10 l 50 7 b 79 -14 50 -12 65 -14 b 111 14 94 -14 95 -1 b 209 62 125 29 160 62 b 357 -125 258 62 357 35 b 235 -304 357 -284 272 -304 b 202 -300 223 -304 212 -304 b 184 -279 194 -295 186 -289 b 202 -259 184 -269 194 -264 b 256 -163 235 -239 256 -203 b 144 -50 256 -99 206 -50 b 30 -157 66 -50 35 -107 b 29 -183 29 -166 29 -174 b 284 -361 29 -302 107 -361 b 552 -125 456 -361 552 -255 b 314 112 552 6 445 112 b 122 71 230 112 168 98 b 115 69 120 69 117 69 b 109 79 109 69 109 75 z"},timeSig6:{x_min:20,x_max:414,y_min:-249,y_max:251,ha:500,o:"m 439 120 b 554 229 500 120 554 167 b 553 245 554 235 554 239 b 348 361 539 337 426 361 b 85 209 239 360 137 307 b 29 4 53 148 29 72 l 29 -1 b 73 -200 30 -68 42 -143 b 324 -359 132 -307 203 -359 b 513 -307 389 -359 461 -348 b 596 -137 563 -266 596 -202 b 379 72 596 -24 490 72 b 248 22 333 72 285 55 b 239 19 245 19 242 19 b 226 53 230 19 226 30 b 346 327 230 320 315 327 b 393 305 374 327 393 320 b 357 251 393 285 366 268 b 347 209 350 238 347 223 b 369 150 347 187 354 166 b 439 120 379 131 420 120 z m 320 3 b 405 -158 366 3 405 -69 b 320 -320 405 -248 366 -320 b 236 -158 274 -320 236 -248 b 320 3 236 -69 274 3 z"},timeSig7:{x_min:20,x_max:421,y_min:-250,y_max:249,ha:499,o:"m 606 294 b 582 351 606 333 606 351 b 552 336 580 351 557 346 b 485 236 541 318 521 236 b 262 359 449 236 382 359 b 137 307 179 359 157 325 b 98 281 117 288 108 282 b 60 315 86 281 68 301 b 43 325 58 321 50 325 b 29 308 36 325 29 321 l 29 71 b 45 48 29 71 30 48 b 66 76 56 48 60 60 b 164 196 81 112 99 196 b 374 88 222 196 291 88 b 446 118 415 88 435 109 b 459 124 451 121 456 124 b 469 111 465 124 468 120 b 272 -112 469 71 359 -10 b 173 -315 217 -176 173 -259 b 200 -360 173 -346 173 -360 b 294 -347 226 -360 258 -347 b 412 -360 330 -347 397 -360 b 435 -307 426 -360 435 -348 b 606 288 435 -66 606 140 z"},timeSig8:{x_min:20,x_max:416,y_min:-259,y_max:259,ha:518,o:"m 481 52 b 567 204 533 85 567 132 b 317 373 567 351 356 373 b 36 176 150 373 36 297 b 161 -16 36 76 92 23 b 29 -190 86 -52 29 -99 b 301 -373 29 -315 158 -373 b 599 -117 445 -373 599 -311 b 481 52 599 -30 549 17 z m 406 85 b 168 240 291 125 168 150 b 314 331 168 301 251 331 b 482 207 360 331 482 308 b 406 85 482 150 454 112 z m 295 -325 b 111 -183 199 -325 111 -276 b 225 -48 111 -125 161 -72 b 436 -219 330 -94 436 -124 b 295 -325 436 -276 392 -325 z"},timeSig9:{x_min:20,x_max:414,y_min:-249,y_max:251,ha:500,o:"m 186 -117 b 71 -226 125 -117 71 -164 b 72 -242 71 -232 71 -236 b 276 -359 86 -334 199 -359 b 540 -206 386 -357 488 -304 b 596 -1 572 -145 596 -69 l 596 4 b 552 203 595 71 583 145 b 301 361 492 310 422 361 b 112 310 236 361 164 351 b 29 140 62 269 29 204 b 246 -69 29 27 135 -69 b 377 -19 292 -69 340 -52 b 386 -16 380 -16 383 -16 b 399 -50 395 -16 399 -27 b 279 -324 395 -317 310 -324 b 232 -302 251 -324 232 -317 b 268 -248 232 -282 259 -265 b 278 -206 275 -235 278 -220 b 256 -147 278 -184 271 -163 b 186 -117 246 -128 204 -117 z m 305 0 b 220 161 259 0 220 72 b 305 323 220 251 259 323 b 389 161 351 323 389 251 b 305 0 389 72 351 0 z"},timeSigCommon:{x_min:5,x_max:424,y_min:-249,y_max:251,ha:500,o:"m 336 361 b 7 -14 131 361 7 180 b 101 -262 7 -108 42 -190 b 321 -359 156 -328 235 -359 b 611 -88 573 -359 611 -130 b 589 -56 611 -56 595 -56 b 567 -82 577 -56 567 -58 b 363 -311 567 -268 409 -311 b 184 40 246 -311 184 -197 b 372 327 184 278 294 327 b 477 278 446 327 477 292 b 451 246 477 265 472 246 b 360 140 393 246 360 184 b 471 32 360 58 431 32 b 580 156 471 32 580 36 b 336 361 580 344 363 361 z"},timeSigCutCommon:{x_min:0,x_max:418,y_min:-359,y_max:361,ha:720,o:"m 573 -58 b 559 -82 567 -58 559 -60 b 354 -310 559 -266 400 -310 b 317 -305 340 -310 328 -308 b 302 -284 311 -304 302 -295 l 302 287 b 338 323 302 297 328 321 b 363 324 347 324 356 324 b 468 275 436 324 468 289 b 442 243 468 264 464 243 b 351 137 384 243 351 181 b 462 30 351 56 422 30 b 572 154 462 30 572 35 b 318 357 572 295 441 357 b 302 390 310 359 302 383 l 302 495 b 276 520 302 507 292 520 b 252 495 265 520 252 507 l 252 369 b 235 346 252 359 238 346 l 196 331 b 0 -14 66 275 0 122 b 225 -346 0 -150 86 -310 b 252 -382 235 -350 252 -369 l 252 -492 b 276 -517 252 -505 265 -517 b 302 -492 292 -517 302 -505 l 302 -379 b 318 -359 302 -370 308 -363 b 602 -85 563 -354 602 -130 b 579 -58 600 -58 586 -58 z m 252 -235 b 243 -252 252 -248 248 -252 b 236 -248 240 -252 238 -251 b 177 37 197 -193 177 -96 b 232 259 177 147 200 215 b 236 262 233 262 235 262 b 252 239 243 262 252 251 z"},timeSigPlus:{x_min:-1,x_max:499,y_min:-250,y_max:250,ha:500,o:"m 432 53 b 413 79 420 53 413 65 l 413 340 b 392 360 413 350 405 360 l 325 360 b 305 340 312 360 305 350 l 305 79 b 284 53 305 66 292 53 l 19 53 b -1 33 9 53 -1 46 l -1 -33 b 19 -55 -1 -46 9 -55 l 284 -55 b 305 -75 298 -55 305 -68 l 305 -340 b 325 -360 305 -350 312 -360 l 392 -360 b 413 -340 405 -360 413 -350 l 413 -78 b 433 -55 413 -63 423 -55 l 698 -55 b 719 -33 708 -55 719 -46 l 719 33 b 698 53 719 46 708 53 z"},timeSigPlusSmall:{x_min:-1,x_max:255,y_min:-133,y_max:123,ha:256,o:"m 220 20 b 210 33 215 20 210 26 l 210 166 b 200 177 210 171 206 177 l 166 177 b 156 166 160 177 156 171 l 156 33 b 145 20 156 27 150 20 l 10 20 b -1 10 4 20 -1 16 l -1 -24 b 10 -35 -1 -30 4 -35 l 145 -35 b 156 -46 153 -35 156 -42 l 156 -180 b 166 -192 156 -186 160 -192 l 200 -192 b 210 -180 206 -192 210 -186 l 210 -48 b 222 -35 210 -39 216 -35 l 356 -35 b 367 -24 361 -35 367 -30 l 367 10 b 356 20 367 16 361 20 z"},timeSigMinus:{x_min:0,x_max:448,y_min:-35,y_max:40,ha:75,o:"m 645 39 b 619 58 645 49 634 58 l 27 58 b 0 39 12 58 0 49 l 0 -32 b 27 -50 0 -42 12 -50 l 619 -50 b 645 -32 634 -50 645 -42 z"},timeSigParensRight:{x_min:0,x_max:184,y_min:-489,y_max:491,ha:980,o:"m 0 -696 b 3 -704 0 -698 1 -704 b 7 -703 4 -704 6 -704 b 265 1 187 -530 265 -282 b 12 701 265 289 187 531 b 4 707 12 701 6 707 b 0 696 1 707 0 703 l 0 665 b 4 644 0 665 0 651 b 167 1 112 503 167 315 b 6 -641 167 -311 109 -497 b 0 -658 3 -644 0 -651 z"},timeSigParensRightSmall:{x_min:0,x_max:110,y_min:-251,y_max:249,ha:500,o:"m 0 -356 b 3 -361 0 -357 1 -361 b 158 0 112 -272 158 -145 b 4 359 158 147 109 272 b 0 353 3 359 0 357 l 0 338 b 3 327 0 338 0 330 b 91 0 60 246 91 160 b 4 -328 91 -160 62 -249 b 0 -337 3 -330 0 -333 z"},timeSigParensLeft:{x_min:0,x_max:184,y_min:-489,y_max:491,ha:980,o:"m 265 -658 b 259 -641 265 -651 262 -644 b 98 1 156 -497 98 -311 b 261 644 98 315 153 503 b 265 665 265 651 265 665 l 265 696 b 261 707 265 703 264 707 b 253 701 259 707 253 701 b 0 1 78 531 0 289 b 258 -703 0 -282 78 -530 b 262 -704 259 -704 261 -704 b 265 -696 264 -704 265 -698 z"},timeSigParensLeftSmall:{x_min:0,x_max:110,y_min:-251,y_max:249,ha:500,o:"m 158 -337 b 154 -328 158 -333 156 -330 b 68 0 96 -249 68 -160 b 156 327 68 160 98 246 b 158 338 158 330 158 338 l 158 353 b 154 359 158 357 156 359 b 0 0 49 272 0 147 b 156 -361 0 -145 46 -272 b 158 -356 157 -361 158 -357 z"},noteheadDoubleWhole:{x_min:0,x_max:599,y_min:-155,y_max:155,ha:310,o:"m 13 223 b 0 212 4 223 0 217 l 0 -213 b 13 -223 0 -219 4 -223 l 32 -223 b 45 -213 39 -223 45 -219 l 45 212 b 32 223 45 217 39 223 z m 96 223 b 82 212 88 223 82 217 l 82 -213 b 96 -223 82 -219 88 -223 l 114 -223 b 128 -213 121 -223 128 -219 l 128 212 b 114 223 128 217 121 223 z m 747 223 b 733 212 740 223 733 217 l 733 -213 b 747 -223 733 -219 740 -223 l 766 -223 b 780 -213 773 -223 780 -219 l 780 212 b 766 223 780 217 773 223 z m 829 223 b 815 212 824 223 815 217 l 815 -213 b 829 -223 815 -219 824 -223 l 848 -223 b 863 -213 857 -223 863 -219 l 863 212 b 848 223 863 217 857 223 z m 438 180 b 130 1 248 180 130 101 b 423 -180 130 -92 210 -180 b 733 1 657 -180 733 -98 b 438 180 733 104 572 180 z m 469 -145 b 331 -71 409 -145 369 -112 b 284 58 305 -37 284 12 b 400 147 284 131 333 147 b 577 -45 498 147 577 42 b 469 -145 577 -115 533 -145 z"},noteheadWhole:{x_min:0,x_max:422,y_min:-125,y_max:125,ha:250,o:"m 311 180 b 0 3 120 180 0 101 b 297 -180 0 -94 82 -180 b 608 3 533 -180 608 -98 b 311 180 608 105 445 180 z m 160 91 b 274 148 176 141 229 148 b 452 -45 373 148 452 42 b 386 -141 452 -89 433 -130 b 341 -147 372 -145 356 -147 b 206 -72 289 -147 236 -112 b 156 56 177 -39 156 10 b 160 91 156 68 157 79 z"},noteheadHalf:{x_min:0,x_max:295,y_min:-125,y_max:125,ha:250,o:"m 140 -180 b 425 60 377 -180 425 13 b 282 180 425 134 366 180 b 0 -60 68 180 0 14 b 140 -180 0 -137 60 -180 z m 108 -125 b 50 -92 78 -125 60 -109 b 42 -63 46 -84 42 -73 b 318 121 42 7 251 121 b 372 91 346 121 361 108 b 380 63 376 82 380 73 b 108 -125 380 1 177 -125 z"},noteheadBlack:{x_min:0,x_max:295,y_min:-125,y_max:125,ha:250,o:"m 140 -180 b 425 60 268 -180 425 -62 b 285 180 425 134 367 180 b 0 -60 127 180 0 63 b 140 -180 0 -135 62 -180 z"},noteheadXWhole:{x_min:0,x_max:377,y_min:-125,y_max:125,ha:250,o:"m 272 -95 l 364 -171 b 384 -180 370 -177 377 -180 l 511 -180 b 543 -148 528 -180 543 -164 b 531 -124 543 -140 539 -131 l 412 0 l 531 124 b 541 148 539 131 541 140 b 513 180 541 164 528 180 l 384 180 b 364 171 377 180 370 177 l 272 94 l 179 171 b 158 180 173 177 166 180 l 30 180 b 0 148 16 180 0 164 b 12 124 0 140 4 131 l 132 0 l 12 -124 b 1 -148 4 -131 1 -140 b 32 -180 1 -164 14 -180 l 158 -180 b 179 -171 166 -180 173 -177 z m 386 -141 l 272 -45 l 157 -141 l 88 -141 l 245 0 l 88 141 l 157 141 l 272 45 l 386 141 l 456 141 l 300 0 l 456 -141 z"},noteheadXHalf:{x_min:0,x_max:334,y_min:-125,y_max:125,ha:250,o:"m 295 180 b 271 170 287 180 278 177 l 209 98 l 115 171 b 95 180 109 177 104 180 l 36 180 b 4 148 19 180 4 164 b 14 124 4 140 7 132 l 140 22 l 7 -127 b 0 -148 3 -131 0 -138 b 32 -180 0 -166 14 -180 l 184 -180 b 209 -170 193 -180 203 -177 l 271 -99 l 363 -171 b 384 -180 370 -176 377 -180 l 445 -180 b 478 -147 461 -180 478 -163 b 465 -125 478 -138 474 -131 l 341 -22 l 474 127 b 481 148 480 131 481 138 b 448 180 481 166 468 180 z m 36 148 l 95 148 l 233 33 l 334 148 l 410 148 l 274 -6 l 445 -148 l 384 -148 l 248 -35 l 147 -148 l 71 -148 l 206 4 z"},noteheadXBlack:{x_min:0,x_max:290,y_min:-125,y_max:125,ha:250,o:"m 410 -143 l 239 0 l 410 144 b 418 160 415 147 418 154 b 399 180 418 171 408 180 b 389 177 396 180 392 179 l 207 26 l 29 177 b 17 180 26 179 22 180 b 0 161 7 180 0 170 b 7 144 0 156 3 148 l 179 0 l 7 -143 b 0 -158 1 -147 0 -153 b 19 -180 0 -170 7 -180 b 29 -176 23 -180 26 -179 l 207 -24 l 389 -176 b 399 -180 392 -179 396 -180 b 418 -160 410 -180 418 -168 b 410 -143 418 -153 415 -147 z"},noteheadCircleX:{x_min:0,x_max:249,y_min:-125,y_max:125,ha:250,o:"m 179 180 b 0 0 81 180 0 99 b 179 -180 0 -99 81 -180 b 359 0 278 -180 359 -99 b 179 180 359 99 278 180 z m 261 112 l 180 30 l 98 112 b 179 138 121 128 148 138 b 261 112 210 138 238 128 z m 317 0 b 292 -82 317 -30 308 -59 l 209 1 l 291 84 b 317 0 307 60 317 30 z m 40 0 b 69 84 40 32 50 60 l 151 1 l 68 -84 b 40 0 49 -60 40 -30 z m 95 -111 l 180 -27 l 262 -111 b 179 -138 239 -128 210 -138 b 95 -111 148 -138 120 -128 z"},noteheadTriangleUpWhole:{x_min:0,x_max:319,y_min:-125,y_max:125,ha:250,o:"m 445 -180 b 459 -166 454 -180 459 -173 b 458 -158 459 -163 458 -160 l 239 173 b 228 180 238 177 233 180 b 216 173 225 180 219 177 l 1 -158 b 0 -166 1 -160 0 -163 b 14 -180 0 -173 6 -180 z m 170 -137 b 145 -96 157 -137 145 -109 b 228 108 145 -17 197 56 b 310 -98 259 55 310 -17 b 288 -137 310 -111 301 -137 z"},noteheadTriangleUpHalf:{x_min:0,x_max:285,y_min:-125,y_max:125,ha:250,o:"m 215 180 b 202 173 210 180 204 177 l 3 -157 b 0 -166 1 -160 0 -163 b 14 -180 0 -173 7 -180 l 396 -180 b 410 -166 406 -180 410 -173 b 409 -158 410 -163 410 -161 l 228 173 b 215 180 226 174 220 180 z m 246 -138 l 115 -138 l 232 76 l 297 -37 z"},noteheadTriangleUpBlack:{x_min:0,x_max:293,y_min:-125,y_max:125,ha:250,o:"m 422 -180 l 207 180 l 0 -180 z"},noteheadDiamondWhole:{x_min:0,x_max:270,y_min:-125,y_max:125,ha:250,o:"m 386 -23 b 389 -16 387 -20 389 -19 b 383 -7 389 -13 386 -9 l 130 179 b 122 180 128 180 125 180 b 115 177 120 180 117 180 l 3 23 b 0 17 1 20 0 19 b 4 7 0 16 3 10 l 258 -179 b 264 -180 261 -179 262 -180 b 272 -176 268 -180 271 -179 z m 66 40 b 62 48 65 42 62 45 l 109 111 b 112 112 109 112 111 112 b 118 111 115 112 117 111 l 320 -37 b 324 -46 323 -39 324 -42 b 275 -111 278 -111 276 -111 b 268 -108 272 -111 271 -109 z"},noteheadDiamondHalf:{x_min:0,x_max:251,y_min:-125,y_max:125,ha:250,o:"m 359 -7 b 361 0 360 -6 361 -3 b 359 7 361 3 360 4 l 189 177 b 180 180 186 179 183 180 b 174 177 179 180 176 179 l 4 7 b 0 0 1 4 0 3 b 4 -7 0 -3 1 -6 l 174 -177 b 180 -180 176 -180 179 -180 b 189 -177 183 -180 186 -180 z m 266 26 b 138 -71 266 -12 176 -71 b 96 -50 121 -71 108 -63 b 88 -24 89 -43 88 -32 b 215 73 88 13 177 73 b 266 26 238 73 266 50 z"},noteheadDiamondBlack:{x_min:0,x_max:250,y_min:-125,y_max:125,ha:250,o:"m 357 -6 b 360 1 359 -4 360 -1 b 357 9 360 4 359 7 l 189 177 b 180 180 187 179 184 180 b 171 177 177 180 173 179 l 3 9 b 0 1 0 6 0 4 b 4 -7 0 -1 1 -4 l 173 -177 b 180 -180 176 -180 177 -180 b 187 -177 181 -180 184 -180 z"},noteheadSquareWhite:{x_min:0,x_max:313,y_min:-125,y_max:125,ha:250,o:"m 451 -180 l 451 180 l 0 180 l 0 -180 z m 40 -138 l 40 140 l 410 140 l 410 -138 z"},noteheadSquareBlack:{x_min:0,x_max:313,y_min:-125,y_max:125,ha:250,o:"m 451 -180 l 451 180 l 0 180 l 0 -180 z"},noteheadParenthesis:{x_min:-73,x_max:368,y_min:-180,y_max:182,ha:362,o:"m 52 -249 b -30 -144 3 -212 -14 -190 b -52 4 -45 -102 -52 -56 b 52 252 -52 118 -36 179 l 46 262 b -105 3 -49 197 -105 124 b 45 -259 -105 -109 -48 -200 z m 382 -259 b 530 3 474 -202 530 -108 b 379 262 530 122 474 200 l 373 252 b 478 4 462 180 478 118 b 456 -144 478 -56 471 -102 b 373 -249 439 -190 422 -212 z"},noteheadParenthesisRight:{x_min:-36,x_max:73,y_min:-181,y_max:181,ha:362,o:"m -43 -261 b 105 1 49 -203 105 -109 b -46 261 105 121 49 199 l -52 251 b 53 3 37 179 53 117 b 32 -145 53 -58 46 -104 b -52 -251 14 -192 -3 -213 z"},noteheadParenthesisLeft:{x_min:0,x_max:109,y_min:-181,y_max:181,ha:362,o:"m 157 -251 b 75 -145 108 -213 91 -192 b 53 3 60 -104 53 -58 b 157 251 53 117 69 177 l 151 261 b 0 1 56 196 0 122 b 150 -261 0 -111 58 -202 z"},augmentationDot:{x_min:0,x_max:100,y_min:-50,y_max:50,ha:100,o:"m 144 0 b 72 72 144 40 112 72 b 0 0 32 72 0 40 b 72 -72 0 -40 32 -72 b 144 0 112 -72 144 -40 z"},tremolo1:{x_min:-150,x_max:150,y_min:-93,y_max:94,ha:187,o:"m 216 -45 l 216 135 l -216 46 l -216 -134 z"},flag8thUp:{x_min:0,x_max:264,y_min:-810.1921176545985,y_max:9,ha:819.1921176545985,o:"m 343 -1138 b 380 -888 343 -1138 380 -1001 b 215 -395 380 -708 305 -539 b 58 -19 141 -281 81 -157 b 27 13 53 4 42 13 b 0 -9 12 13 0 9 l 0 -353 b 284 -688 95 -370 232 -566 b 318 -904 305 -737 318 -819 b 284 -1102 318 -969 308 -1037 b 279 -1123 281 -1110 279 -1117 b 302 -1165 279 -1146 294 -1159 b 343 -1138 311 -1171 336 -1162 z"},flag8thDown:{x_min:0,x_max:306,y_min:-14,y_max:808,ha:822,o:"m 346 1094 b 376 897 366 1034 376 962 b 318 642 376 812 340 691 b 0 340 265 521 193 405 l 0 1 b 23 -20 0 -13 12 -20 b 58 12 36 -20 55 -12 b 262 387 82 148 189 274 b 441 881 353 530 441 701 b 400 1142 441 994 412 1096 b 377 1164 396 1158 387 1164 b 346 1094 356 1164 331 1136 z"},flag16thUp:{x_min:0,x_max:279,y_min:-813,y_max:2,ha:815,o:"m 392 -1146 b 402 -988 397 -1139 402 -1057 l 402 -956 b 360 -783 402 -896 386 -837 b 359 -770 360 -779 359 -776 b 360 -760 359 -768 359 -765 b 396 -577 364 -752 396 -665 b 392 -526 396 -559 395 -543 b 236 -275 377 -428 340 -387 b 53 -16 158 -192 78 -168 b 24 3 50 0 33 3 b 0 -12 16 3 0 -1 l 0 -570 l 7 -570 b 298 -778 96 -573 199 -576 b 344 -992 331 -847 344 -917 b 333 -1120 344 -1034 340 -1077 b 331 -1133 331 -1126 331 -1129 b 363 -1171 331 -1152 343 -1171 b 392 -1146 373 -1171 383 -1165 z m 301 -661 b 223 -562 278 -625 253 -596 b 59 -331 156 -484 89 -449 b 58 -327 58 -330 58 -328 b 78 -312 58 -321 66 -312 l 89 -312 b 302 -464 177 -312 255 -393 b 341 -592 328 -501 341 -546 b 340 -621 341 -602 341 -611 b 330 -658 337 -632 337 -647 b 311 -667 328 -662 318 -667 b 301 -661 307 -667 304 -665 z"},flag16thDown:{x_min:0,x_max:290.8951581511223,y_min:-9,y_max:812.0064,ha:821.0064,o:"m 346 1132 b 312 768 367 1011 367 880 b 7 559 213 566 96 562 l 0 559 l 0 1 b 24 -13 0 -6 10 -13 b 53 6 35 -13 50 -10 b 406 516 88 228 372 289 b 410 567 409 531 410 549 b 374 750 410 655 379 742 b 373 760 373 753 373 756 b 374 773 373 766 374 769 b 405 1138 426 881 428 1022 b 370 1169 397 1171 387 1169 b 346 1132 353 1168 341 1156 z m 325 657 b 344 647 333 657 343 652 b 354 611 351 636 351 622 b 356 582 356 600 356 590 b 317 454 356 534 343 491 b 89 302 269 383 177 302 l 78 302 b 58 317 66 302 58 310 b 59 321 58 318 58 320 b 238 552 89 439 170 472 b 315 651 268 585 292 613 b 325 657 318 655 321 657 z"},flag32ndUp:{x_min:0,x_max:261,y_min:-812,y_max:149,ha:961,o:"m 374 -969 b 337 -806 372 -913 359 -858 b 336 -796 336 -804 336 -801 b 337 -788 336 -793 336 -791 b 370 -616 340 -778 370 -698 b 340 -482 370 -570 360 -524 b 369 -330 353 -445 369 -386 b 366 -289 369 -315 369 -302 b 220 -58 350 -202 317 -163 b 46 187 148 20 71 43 b 20 215 45 200 35 215 b 0 197 12 215 0 207 l 0 -609 l 7 -609 b 278 -802 91 -612 186 -615 b 323 -999 310 -865 323 -930 b 311 -1122 323 -1040 318 -1080 b 310 -1132 311 -1126 310 -1129 b 328 -1166 310 -1149 318 -1162 b 337 -1169 331 -1168 334 -1169 b 366 -1146 346 -1169 356 -1162 b 376 -1009 370 -1138 376 -1071 b 374 -969 376 -995 374 -982 z m 300 -261 b 321 -330 315 -289 321 -311 b 317 -360 321 -341 318 -350 b 300 -423 314 -374 307 -399 b 220 -334 279 -397 253 -370 b 56 -92 150 -256 79 -232 b 300 -261 135 -92 220 -127 z m 315 -657 b 308 -690 312 -668 312 -680 b 292 -698 307 -694 300 -698 b 282 -693 288 -698 284 -697 b 216 -608 261 -661 240 -636 l 209 -600 b 56 -390 147 -527 88 -495 b 73 -367 53 -380 60 -367 b 318 -622 189 -367 318 -505 b 315 -657 318 -634 317 -645 z"},flag32ndDown:{x_min:0,x_max:273,y_min:-172,y_max:812,ha:984,o:"m 393 973 b 333 1169 393 1002 383 1169 b 324 1168 330 1169 327 1169 b 304 1130 314 1164 304 1149 b 305 1120 304 1128 305 1125 b 334 962 317 1056 334 1011 b 289 821 334 922 323 880 b 0 619 180 625 88 622 l 0 -229 b 20 -248 0 -242 9 -248 b 48 -219 35 -248 46 -232 b 229 36 72 -69 154 -46 b 380 278 330 145 364 186 b 383 320 383 291 383 305 b 351 484 383 382 364 445 b 384 629 374 526 384 580 b 356 780 384 704 361 766 b 356 783 356 782 356 783 l 351 791 b 356 804 351 796 353 799 l 361 814 b 393 958 380 850 387 865 z m 56 386 b 217 609 86 501 153 533 b 292 706 246 642 269 670 b 304 711 295 710 300 711 b 321 703 311 711 320 707 b 328 670 325 693 325 681 b 331 634 330 658 331 645 b 82 367 331 516 199 367 l 75 367 b 56 386 62 367 56 379 z m 330 350 b 334 320 331 340 334 331 b 311 248 334 301 328 278 b 59 72 229 109 141 72 b 56 76 56 73 56 75 b 229 331 81 226 154 249 b 310 423 264 369 289 397 b 330 350 318 396 325 366 z"},flag64thUp:{x_min:0,x_max:261,y_min:-812,y_max:347,ha:1159,o:"m 374 -969 b 337 -806 372 -913 359 -858 b 336 -796 336 -804 336 -801 b 337 -788 336 -793 336 -791 b 370 -616 340 -778 370 -698 b 340 -482 370 -570 360 -524 b 369 -330 353 -445 369 -386 b 337 -203 369 -287 359 -242 b 369 -43 350 -167 369 -104 b 366 -4 369 -30 367 -17 b 220 228 350 84 317 122 b 46 472 148 305 71 328 b 20 500 45 485 32 500 b 0 482 10 500 0 492 l 0 -609 l 7 -609 b 278 -802 91 -612 186 -615 b 323 -999 310 -865 323 -930 b 311 -1122 323 -1040 318 -1080 b 310 -1132 311 -1126 310 -1129 b 328 -1166 310 -1149 318 -1162 b 337 -1169 331 -1168 334 -1169 b 366 -1146 346 -1169 356 -1162 b 376 -1009 370 -1138 376 -1071 b 374 -969 376 -995 374 -982 z m 300 24 b 321 -45 315 -4 321 -26 b 317 -75 321 -56 318 -65 l 298 -145 b 220 -58 278 -121 253 -94 b 58 187 148 20 82 43 b 56 193 58 189 58 192 b 300 24 138 193 220 157 z m 300 -261 b 321 -330 315 -289 321 -311 b 317 -360 321 -341 318 -350 b 300 -423 314 -374 307 -399 b 220 -334 279 -397 253 -370 b 56 -92 150 -256 79 -232 b 300 -261 135 -92 220 -127 z m 315 -657 b 308 -690 312 -668 312 -680 b 292 -698 307 -694 300 -698 b 282 -693 288 -698 284 -697 b 216 -608 261 -661 240 -636 l 209 -600 b 55 -386 147 -527 84 -497 b 73 -367 52 -376 63 -367 b 318 -622 189 -367 318 -505 b 315 -657 318 -634 317 -645 z"},flag64thDown:{x_min:0,x_max:273,y_min:-376,y_max:812,ha:1188,o:"m 393 973 b 333 1169 393 1002 383 1169 b 324 1168 330 1169 327 1169 b 304 1130 314 1164 304 1149 b 305 1120 304 1128 305 1125 b 334 962 317 1056 334 1011 b 289 821 334 922 323 880 b 0 619 180 625 88 622 l 0 -523 b 20 -541 0 -534 9 -541 b 48 -513 35 -541 46 -526 b 229 -258 72 -363 154 -340 b 380 -16 330 -148 364 -108 b 384 27 383 -1 384 13 b 351 189 384 88 366 151 b 380 278 366 216 374 243 b 383 320 383 291 383 305 b 351 484 383 382 364 445 b 384 629 374 526 384 580 b 356 780 384 704 361 766 b 356 783 356 782 356 783 l 351 791 b 356 804 351 796 353 799 l 361 814 b 393 958 380 850 387 865 z m 56 386 b 217 609 86 501 153 533 b 292 706 246 642 269 670 b 304 711 295 710 300 711 b 321 703 311 711 320 707 b 328 670 325 693 325 681 b 331 634 330 658 331 645 b 82 367 331 516 199 367 l 75 367 b 56 386 62 367 56 379 z m 330 350 b 334 320 331 340 334 331 b 311 248 334 301 328 278 b 59 72 229 109 141 72 b 56 76 56 73 56 75 b 229 331 81 226 154 249 b 310 423 264 369 289 397 b 330 350 318 396 325 366 z m 330 56 b 334 26 331 46 334 37 b 311 -46 334 7 328 -16 b 56 -222 229 -184 137 -222 b 229 36 75 -86 145 -55 b 311 128 264 73 289 102 z"},flag128thUp:{x_min:0,x_max:261,y_min:-812,y_max:533,ha:1345,o:"m 374 -969 b 337 -806 372 -913 359 -858 b 336 -796 336 -804 336 -801 b 337 -788 336 -793 336 -791 b 370 -616 340 -778 370 -698 b 340 -482 370 -570 360 -524 b 369 -330 353 -445 369 -386 b 337 -203 369 -287 359 -242 b 369 -43 350 -167 369 -104 b 366 -4 369 -30 367 -17 b 341 75 360 26 353 50 b 369 222 354 111 369 167 b 366 264 369 236 369 251 b 220 495 350 351 317 390 b 46 740 148 573 71 596 b 22 768 45 753 35 768 b 0 750 10 768 0 760 l 0 -609 l 7 -609 b 278 -802 91 -612 186 -615 b 323 -999 310 -865 323 -930 b 311 -1122 323 -1040 318 -1080 b 310 -1132 311 -1126 310 -1129 b 328 -1166 310 -1149 318 -1162 b 337 -1169 331 -1168 334 -1169 b 366 -1146 346 -1169 356 -1162 b 376 -1009 370 -1138 376 -1071 b 374 -969 376 -995 374 -982 z m 300 292 b 321 223 315 264 321 242 b 317 193 321 212 318 203 b 301 135 314 180 308 158 b 220 228 281 161 255 190 b 55 461 151 304 79 327 b 300 292 134 461 220 426 z m 300 24 b 321 -45 315 -4 321 -26 b 317 -75 321 -56 318 -65 l 298 -145 b 220 -58 278 -121 253 -94 b 56 187 148 20 81 43 b 55 193 56 189 56 192 b 300 24 137 193 220 157 z m 300 -261 b 321 -330 315 -289 321 -311 b 317 -360 321 -341 318 -350 b 300 -423 314 -374 307 -399 b 220 -334 279 -397 253 -370 b 56 -92 150 -256 79 -232 b 300 -261 135 -92 220 -127 z m 315 -657 b 308 -690 312 -668 312 -680 b 292 -698 307 -694 300 -698 b 282 -693 288 -698 284 -697 b 216 -608 261 -661 240 -636 l 209 -600 b 55 -386 147 -527 84 -497 b 73 -367 53 -376 62 -367 b 318 -622 189 -367 318 -505 b 315 -657 318 -634 317 -645 z"},flag128thDown:{x_min:0,x_max:273,y_min:-580,y_max:812,ha:1392,o:"m 393 973 b 333 1169 393 1002 383 1169 b 324 1168 330 1169 327 1169 b 304 1130 314 1164 304 1149 b 305 1120 304 1128 305 1125 b 334 962 317 1056 334 1011 b 289 821 334 922 323 880 b 0 619 180 625 88 622 l 0 -816 b 20 -835 0 -828 7 -835 b 48 -806 33 -835 46 -819 b 229 -552 72 -657 154 -634 b 380 -310 330 -442 364 -402 b 384 -266 383 -295 384 -281 b 351 -105 384 -206 366 -143 b 384 27 372 -66 384 -16 b 351 189 384 88 366 151 b 380 278 366 216 374 243 b 383 320 383 291 383 305 b 351 484 383 382 364 445 b 384 629 374 526 384 580 b 356 780 384 704 361 766 b 356 783 356 782 356 783 l 351 791 b 356 804 351 796 353 799 l 361 814 b 393 958 380 850 387 865 z m 56 386 b 217 609 86 501 153 533 b 292 706 246 642 269 670 b 304 711 295 710 300 711 b 321 703 311 711 320 707 b 328 670 325 693 325 681 b 331 634 330 658 331 645 b 82 367 331 516 199 367 l 75 367 b 56 386 62 367 56 379 z m 330 350 b 334 320 331 340 334 331 b 311 248 334 301 328 278 b 59 72 229 109 141 72 b 56 76 56 73 56 75 b 229 331 81 226 154 249 b 310 423 264 369 289 397 b 330 350 318 396 325 366 z m 330 56 b 334 26 331 46 334 37 b 311 -46 334 7 328 -16 b 56 -222 229 -184 137 -222 b 229 36 75 -86 145 -55 b 311 128 264 73 289 102 z m 330 -238 b 334 -268 331 -248 334 -256 b 311 -340 334 -287 328 -310 b 56 -516 229 -478 137 -516 b 229 -258 75 -380 145 -348 b 311 -166 264 -220 289 -192 z"},accidentalFlat:{x_min:0,x_max:226,y_min:-175,y_max:439,ha:614,o:"m 17 -245 b 30 -252 22 -251 26 -252 b 39 -249 35 -252 39 -249 b 153 -161 82 -225 117 -186 b 325 82 281 -72 325 16 b 196 220 325 164 262 216 b 117 196 171 220 137 209 b 85 176 108 189 92 176 b 78 177 82 176 81 176 b 62 202 68 181 62 192 b 72 608 63 233 72 579 b 45 632 72 624 59 632 b 0 592 24 632 1 618 b 17 -245 0 592 6 -230 z m 68 -117 b 63 27 68 -117 63 -30 b 66 73 63 50 65 68 b 167 144 76 102 134 144 b 226 60 209 144 226 96 b 98 -134 226 -17 160 -95 b 84 -138 92 -137 88 -138 b 68 -117 71 -138 68 -124 z"},accidentalNatural:{x_min:0,x_max:168,y_min:-335,y_max:341,ha:676,o:"m 203 261 b 197 259 200 261 199 259 b 68 226 197 259 105 226 b 53 233 59 226 53 228 l 53 474 b 36 491 53 484 45 491 l 17 491 b 0 474 7 491 0 484 l 0 -268 b 13 -281 0 -276 4 -281 l 16 -279 b 22 -278 17 -279 20 -279 b 164 -235 42 -269 122 -235 b 189 -251 179 -235 189 -239 l 189 -465 b 206 -482 189 -475 196 -482 l 225 -482 b 242 -465 233 -482 242 -475 l 242 258 b 230 269 242 265 236 269 b 225 268 229 269 226 269 z m 53 56 b 176 114 53 76 141 114 b 189 107 184 114 189 112 l 189 -42 b 71 -101 189 -68 107 -101 b 53 -92 60 -101 53 -98 z"},accidentalSharp:{x_min:0,x_max:249,y_min:-348,y_max:350,ha:698,o:"m 341 170 b 359 194 351 174 359 186 l 359 297 b 348 308 359 304 354 308 b 341 307 346 308 344 308 b 305 294 341 307 312 295 b 285 312 295 294 285 301 l 285 488 b 265 504 285 497 276 504 b 242 488 251 504 242 497 l 242 301 b 223 259 240 287 236 268 b 132 223 206 249 157 229 b 115 252 120 223 115 240 l 115 425 b 95 441 115 433 105 441 b 72 425 81 441 72 433 l 72 230 b 55 192 72 210 63 196 b 17 176 46 187 17 176 b 0 153 7 173 0 161 l 0 50 b 13 37 0 42 4 37 l 16 39 b 50 53 17 39 39 48 l 52 55 b 72 29 63 55 72 40 l 72 -114 b 56 -147 72 -130 65 -143 b 17 -163 48 -150 17 -163 b 0 -186 7 -166 0 -177 l 0 -288 b 13 -301 0 -297 4 -301 l 16 -300 b 50 -287 17 -300 37 -291 b 55 -285 52 -285 53 -285 b 72 -308 65 -285 72 -301 l 72 -485 b 91 -501 72 -494 81 -501 b 115 -485 105 -501 115 -494 l 115 -285 b 130 -253 115 -266 122 -256 l 217 -217 b 219 -217 217 -217 219 -217 l 222 -216 b 242 -242 235 -216 242 -233 l 242 -422 b 261 -438 242 -431 251 -438 b 285 -422 276 -438 285 -431 l 285 -217 b 301 -184 285 -206 291 -189 b 341 -168 311 -180 341 -168 b 359 -144 351 -164 359 -153 l 359 -42 b 348 -30 359 -35 354 -30 b 341 -32 346 -30 344 -30 l 304 -46 b 285 -20 295 -46 285 -37 l 285 114 b 304 156 285 124 292 151 z m 242 -65 b 132 -122 233 -94 166 -122 b 115 -115 124 -122 117 -120 b 111 -43 112 -109 111 -78 b 115 63 111 1 112 52 b 220 118 118 88 184 118 b 242 109 230 118 239 115 b 248 27 245 102 248 66 b 242 -65 248 -12 245 -52 z"},accidentalDoubleSharp:{x_min:0,x_max:247,y_min:-125,y_max:127,ha:252,o:"m 274 -46 b 206 1 258 -37 206 -9 b 274 50 206 22 253 43 b 278 50 275 50 276 50 l 287 49 b 346 63 304 49 331 52 b 356 115 353 71 356 92 b 292 183 356 174 351 183 b 233 173 266 183 240 180 b 226 117 228 168 226 143 b 179 49 219 101 196 49 b 130 117 158 49 135 96 b 118 173 130 141 125 167 b 66 183 112 180 89 183 b 7 173 42 183 16 180 b 0 120 3 170 0 145 b 7 63 0 94 3 68 b 68 49 17 55 43 49 b 82 50 73 49 78 50 b 150 3 98 42 150 13 b 84 -46 150 -16 104 -39 l 69 -46 b 7 -56 43 -46 16 -49 b 0 -111 3 -60 0 -85 b 7 -166 0 -137 3 -163 b 65 -180 17 -174 40 -180 b 118 -166 86 -180 109 -176 b 130 -111 127 -158 130 -134 b 132 -105 130 -109 131 -107 b 177 -45 141 -85 158 -45 b 226 -111 196 -45 220 -91 b 233 -166 226 -137 228 -161 b 291 -180 243 -174 266 -180 b 356 -114 346 -180 356 -166 b 346 -56 356 -89 351 -63 b 288 -46 338 -49 312 -46 z"},accidentalDoubleFlat:{x_min:0,x_max:411,y_min:-175,y_max:437,ha:612,o:"m 452 217 b 384 194 426 217 408 207 b 350 176 374 189 363 176 b 343 177 347 176 344 176 b 328 202 333 180 328 190 b 337 606 328 232 337 579 b 310 629 337 622 324 629 b 265 592 291 629 268 616 b 269 194 265 592 266 395 b 196 217 248 209 223 217 l 187 217 b 120 194 160 217 143 207 b 85 176 108 189 98 176 b 78 177 82 176 81 176 b 62 202 68 180 62 190 b 72 606 62 232 72 579 b 45 629 72 622 59 629 b 0 592 24 629 1 616 b 17 -245 0 592 7 -232 b 30 -252 22 -251 26 -252 b 39 -249 35 -252 39 -249 b 153 -161 84 -226 120 -186 b 274 -50 206 -124 246 -85 b 284 -245 276 -158 279 -240 b 295 -252 288 -251 292 -252 b 304 -249 300 -252 304 -249 b 416 -163 348 -226 383 -186 b 592 82 546 -72 592 16 b 461 217 592 163 528 216 z m 96 -134 b 84 -138 92 -137 86 -138 b 68 -115 72 -138 68 -124 b 63 26 68 -115 63 -30 b 66 72 63 49 65 66 b 168 144 75 101 134 144 b 226 59 212 144 226 95 b 96 -134 226 -22 161 -94 z m 361 -134 b 348 -138 356 -137 351 -138 b 333 -115 337 -138 333 -124 b 328 39 333 -115 328 -16 b 330 72 328 55 328 68 b 433 144 338 101 399 144 b 468 130 448 144 459 140 b 490 59 481 112 490 88 b 361 -134 490 -22 426 -94 z"},accidentalParensLeft:{x_min:0,x_max:141,y_min:-248,y_max:247,ha:495,o:"m 203 331 l 203 351 b 202 356 203 354 203 356 b 0 0 60 281 0 140 b 199 -357 0 -144 60 -269 b 203 -354 200 -357 203 -356 l 203 -333 b 200 -327 203 -330 202 -328 b 86 0 118 -253 86 -160 b 200 324 86 158 120 251 b 203 331 202 325 203 327 z"},accidentalParensRight:{x_min:0,x_max:141,y_min:-248,y_max:247,ha:495,o:"m 0 331 b 3 324 0 327 1 325 b 117 0 84 251 117 158 b 3 -327 117 -160 85 -253 b 0 -333 1 -328 0 -330 l 0 -354 b 4 -357 0 -356 3 -357 b 203 0 143 -269 203 -144 b 1 356 203 140 143 281 b 0 351 0 356 0 354 z"},accidentalQuarterToneFlatStein:{x_min:1,x_max:227,y_min:-175,y_max:439,ha:614,o:"m 310 -245 b 327 592 321 -230 327 592 b 282 632 325 618 302 632 b 255 608 268 632 255 624 b 265 202 255 579 264 233 b 249 177 265 192 259 181 b 242 176 246 176 245 176 b 210 196 235 176 219 189 b 131 220 190 209 156 220 b 1 85 65 216 1 164 b 174 -161 1 16 46 -72 b 288 -249 210 -186 245 -225 b 297 -252 288 -249 292 -252 b 310 -245 301 -252 305 -251 z m 259 -117 b 243 -138 259 -124 256 -138 b 229 -134 239 -138 235 -137 b 101 60 167 -95 101 -17 b 160 144 101 96 118 144 b 261 73 193 144 251 102 b 264 27 262 68 264 50 b 259 -117 264 -30 259 -117 z"},accidentalThreeQuarterTonesFlatZimmermann:{x_min:1,x_max:466,y_min:-175,y_max:439,ha:614,o:"m 363 -245 b 376 -252 367 -251 372 -252 b 384 -249 380 -252 384 -249 b 497 -161 428 -226 464 -186 b 671 84 625 -72 671 16 b 541 220 671 164 606 217 b 513 217 531 220 523 219 b 464 196 495 212 480 206 b 431 176 452 189 442 176 b 423 177 428 176 426 176 b 408 202 413 180 408 190 l 419 608 b 392 632 419 625 406 632 b 346 592 372 632 347 618 b 363 -245 346 592 351 -230 z m 289 -249 b 297 -252 289 -249 292 -252 b 310 -245 300 -252 305 -251 b 328 592 321 -230 328 592 b 282 631 327 618 302 631 b 255 608 268 631 255 624 l 266 202 b 251 177 266 190 261 180 b 243 176 248 176 246 176 b 210 196 232 176 222 189 b 164 216 196 204 180 210 l 163 217 b 132 220 151 219 143 220 b 1 84 65 217 1 163 b 177 -163 1 16 48 -72 b 289 -249 210 -186 245 -226 z m 262 72 b 265 26 264 66 265 49 b 261 -115 265 -30 261 -115 b 245 -138 261 -124 258 -138 b 230 -134 240 -138 236 -137 b 102 60 166 -92 102 -20 b 124 128 102 88 111 112 b 161 144 134 138 147 144 b 199 134 173 144 184 141 b 262 72 219 122 256 92 z m 413 -115 b 409 26 413 -115 409 -30 b 412 72 409 49 410 66 b 514 144 420 102 480 144 b 570 60 557 144 570 96 b 442 -134 570 -23 508 -91 b 429 -138 436 -137 433 -138 b 413 -115 418 -138 413 -124 z"},accidentalQuarterToneSharpStein:{x_min:0,x_max:179,y_min:-353,y_max:307,ha:660,o:"m 258 240 b 246 252 258 248 252 252 b 240 251 245 252 242 252 b 168 225 240 251 171 225 b 150 253 156 225 150 240 l 150 426 b 130 442 150 435 141 442 b 105 418 108 442 105 429 l 105 230 b 91 193 105 219 101 202 b 17 161 65 183 42 171 b 0 138 9 158 0 147 l 0 36 b 13 23 0 27 4 23 l 16 24 b 86 53 17 24 73 49 l 88 55 b 107 30 98 55 107 42 l 107 -114 b 92 -145 107 -130 101 -143 l 17 -177 b 0 -200 9 -180 0 -192 l 0 -302 b 13 -315 0 -311 4 -315 l 16 -314 b 85 -285 17 -314 72 -291 b 105 -312 92 -282 105 -301 l 105 -492 b 125 -508 105 -501 114 -508 b 150 -484 147 -508 150 -498 l 150 -285 b 151 -274 150 -281 150 -278 b 164 -253 153 -265 158 -256 b 240 -225 176 -251 240 -225 b 258 -202 249 -222 258 -210 l 258 -99 b 245 -86 258 -91 253 -86 l 242 -88 b 240 -88 242 -88 240 -88 l 240 -86 b 168 -115 240 -86 174 -114 b 148 -91 158 -115 148 -107 l 148 43 b 167 85 148 55 156 81 b 240 114 180 91 240 114 b 258 138 249 118 258 128 z"},accidentalThreeQuarterTonesSharpStein:{x_min:3,x_max:317,y_min:-347,y_max:369,ha:716,o:"m 456 324 b 448 336 456 330 454 336 b 393 317 445 336 400 320 b 389 315 392 315 390 315 b 383 325 386 315 383 318 l 383 508 b 360 531 383 528 379 531 b 337 508 341 531 337 527 l 337 318 b 325 291 337 300 334 294 b 268 268 320 288 287 276 b 253 281 256 268 253 274 l 253 464 b 230 487 253 484 249 487 b 207 464 212 487 207 482 l 207 264 b 194 240 207 253 204 245 l 132 217 b 131 217 132 217 132 217 l 130 216 b 118 229 122 216 118 220 l 118 420 b 95 444 118 439 114 444 b 72 420 76 444 72 439 l 72 212 b 60 190 72 197 68 193 l 16 173 b 4 161 9 170 4 167 l 4 50 b 13 39 4 45 9 39 b 58 55 16 39 46 49 b 63 56 60 56 62 56 b 72 42 71 56 72 50 l 72 -125 b 58 -150 72 -137 65 -147 l 16 -166 b 4 -177 9 -168 4 -171 l 4 -289 b 14 -301 4 -295 9 -301 b 53 -287 16 -301 40 -291 b 62 -285 56 -285 59 -285 b 72 -298 69 -285 72 -289 l 72 -477 b 95 -500 72 -495 76 -500 b 118 -477 114 -500 118 -495 l 118 -278 b 127 -259 118 -269 121 -261 l 196 -232 b 207 -243 204 -232 207 -235 l 207 -432 b 230 -455 207 -452 212 -455 b 253 -432 249 -455 253 -451 l 253 -228 b 268 -204 253 -216 259 -207 l 320 -186 b 328 -183 323 -184 325 -183 b 337 -194 334 -183 337 -187 l 337 -387 b 360 -410 337 -408 341 -410 b 383 -387 379 -410 383 -406 l 383 -174 b 395 -157 383 -166 390 -158 l 445 -138 b 456 -127 452 -135 456 -132 l 456 -14 b 448 -3 456 -10 454 -3 b 397 -22 445 -3 408 -17 l 396 -23 b 383 -6 387 -23 383 -16 l 383 163 b 392 181 383 173 384 179 b 445 202 397 183 445 202 b 456 213 452 203 456 207 z m 337 -45 b 266 -78 333 -56 287 -78 b 258 -75 262 -78 259 -76 b 253 19 255 -71 253 -27 b 258 130 253 69 255 122 b 333 163 264 141 315 163 b 337 161 334 163 337 161 b 341 78 340 157 341 120 b 337 -45 341 24 340 -37 z m 118 -127 b 114 -48 114 -121 114 -86 b 118 78 114 6 115 68 b 200 114 122 91 180 114 b 207 111 204 114 206 112 b 212 22 210 107 212 66 b 207 -94 212 -29 210 -85 b 127 -130 203 -108 148 -130 b 118 -127 122 -130 120 -128 z"},accidentalBuyukMucennebFlat:{x_min:1,x_max:287,y_min:-174,y_max:438,ha:612,o:"m 379 452 b 370 464 379 458 377 464 b 164 389 366 464 170 392 b 156 396 163 389 156 393 b 157 436 157 409 157 428 b 167 452 157 445 161 449 b 366 526 173 455 366 526 b 379 540 374 528 379 534 l 379 611 b 370 622 379 616 377 622 b 170 550 366 622 174 552 b 160 557 163 550 160 554 b 161 608 160 585 161 602 b 134 631 161 624 148 631 b 89 590 114 631 91 616 l 89 528 b 81 517 89 526 88 518 b 16 491 76 514 16 491 b 1 480 6 490 1 485 l 1 406 b 13 395 1 400 4 395 l 14 396 b 79 419 16 396 72 415 b 89 412 86 419 89 415 b 91 376 89 399 89 386 b 82 359 91 364 89 361 b 16 331 76 356 16 331 b 1 321 6 331 1 328 l 1 248 b 13 236 1 242 4 236 b 79 262 16 236 71 258 b 92 251 89 262 92 256 b 107 -242 95 23 101 -236 b 120 -251 111 -249 115 -251 b 128 -248 124 -251 128 -248 b 240 -160 171 -225 207 -184 b 413 84 367 -71 413 16 b 284 220 413 166 350 216 b 207 196 259 220 229 209 b 170 176 196 190 184 176 l 168 177 b 151 203 157 181 151 192 b 153 269 151 210 151 236 b 163 292 153 275 153 289 b 366 367 173 297 366 367 b 379 383 374 370 379 376 z m 186 -132 b 173 -137 180 -135 176 -137 b 157 -114 161 -137 157 -122 b 153 35 157 -114 153 -22 b 154 73 153 53 153 68 b 219 135 160 92 197 124 b 255 144 232 141 243 144 b 292 130 269 144 282 140 b 314 62 305 114 314 91 b 186 -132 314 -17 251 -94 z"},accidentalBakiyeFlat:{x_min:-1,x_max:286,y_min:-175,y_max:439,ha:614,o:"m 377 454 b 369 467 377 458 376 467 b 363 465 367 467 364 467 b 161 390 363 465 167 393 b 153 399 154 390 153 395 b 157 608 154 494 157 593 b 130 632 157 624 144 632 b 86 592 111 632 88 618 b 88 377 86 592 86 501 b 76 356 88 373 88 360 l 12 331 b -1 320 3 330 -1 327 l -1 248 b 9 236 -1 242 1 236 b 81 264 12 236 78 261 b 89 258 86 264 89 261 b 104 -245 92 30 96 -236 b 115 -252 108 -251 112 -252 b 124 -249 120 -252 124 -249 b 239 -161 167 -226 203 -186 b 412 84 367 -72 412 17 b 282 220 412 166 348 216 b 255 216 274 220 264 219 b 203 196 238 212 222 206 b 171 177 193 189 177 177 b 163 179 168 177 166 177 b 147 202 153 181 147 192 b 147 216 147 204 147 209 l 150 262 b 150 276 150 269 150 275 b 158 291 150 287 154 289 b 363 370 163 292 363 370 b 377 384 373 373 377 379 z m 181 -134 b 167 -138 176 -137 171 -138 b 153 -117 156 -138 153 -125 b 148 27 153 -117 148 -30 b 151 73 148 50 150 68 b 255 144 161 105 219 144 b 312 62 298 144 312 99 b 181 -134 312 -19 249 -96 z"},accidentalKomaSharp:{x_min:0,x_max:229,y_min:-337,y_max:322,ha:659,o:"m 312 151 b 330 176 323 156 330 166 l 330 278 b 320 289 330 285 327 289 b 312 288 318 289 315 289 b 200 246 312 288 203 248 b 181 275 187 246 181 264 l 181 448 b 163 464 181 456 173 464 b 138 441 140 464 138 452 l 138 253 b 122 215 137 240 132 225 b 17 177 92 203 45 177 b 0 153 7 173 0 163 l 0 50 b 10 39 0 43 4 39 b 17 40 13 39 14 39 l 128 81 b 138 52 138 81 138 63 l 138 -91 b 124 -124 138 -107 132 -120 b 17 -167 115 -127 17 -167 b 0 -192 7 -171 0 -181 l 0 -294 b 10 -305 0 -301 4 -305 b 17 -304 13 -305 14 -305 b 128 -261 17 -304 117 -264 l 130 -259 b 138 -276 137 -259 138 -268 l 138 -469 b 157 -485 138 -478 147 -485 b 181 -462 179 -485 181 -475 l 181 -262 b 183 -252 181 -258 181 -255 b 197 -232 186 -243 190 -235 b 312 -187 207 -228 312 -187 b 330 -163 323 -183 330 -173 l 330 -60 b 320 -49 330 -53 327 -49 b 312 -50 318 -49 315 -49 l 200 -94 b 193 -95 197 -95 194 -95 b 181 -68 183 -95 181 -85 l 181 66 b 200 108 181 92 189 104 z"},accidentalKucukMucennebSharp:{x_min:-1,x_max:339,y_min:-338,y_max:321,ha:659,o:"m 264 92 b 271 102 264 98 265 99 l 395 150 b 412 174 405 154 412 164 l 412 276 b 402 288 412 284 409 288 b 395 287 400 288 397 288 b 282 245 395 287 285 246 b 264 274 269 245 264 262 l 264 446 b 245 462 264 455 255 462 b 220 439 222 462 220 451 l 220 252 b 204 213 219 239 215 223 b 99 176 174 202 127 176 b 82 151 89 171 82 161 l 82 49 b 92 37 82 42 86 37 b 99 39 95 37 96 37 l 210 79 b 216 81 212 81 215 81 b 220 78 219 81 220 79 l 220 56 b 216 46 220 52 220 48 b 16 -29 210 45 16 -29 b -1 -45 4 -32 -1 -36 l -1 -138 b 12 -154 -1 -145 3 -154 l 215 -79 b 220 -84 219 -79 220 -81 l 220 -105 b 210 -122 220 -115 219 -120 b 99 -168 202 -127 99 -168 b 82 -193 89 -173 82 -183 l 82 -295 b 92 -307 82 -302 86 -307 b 99 -305 95 -307 96 -307 b 210 -262 99 -305 199 -265 l 212 -261 b 220 -278 219 -261 220 -269 l 220 -471 b 239 -487 220 -480 229 -487 b 264 -464 261 -487 264 -477 l 264 -264 b 265 -253 264 -259 264 -256 b 279 -233 268 -245 272 -236 b 395 -189 289 -229 395 -189 b 412 -164 405 -184 412 -174 l 412 -62 b 402 -50 412 -55 409 -50 b 395 -52 400 -50 397 -50 l 278 -96 b 264 -86 268 -96 264 -94 l 264 -68 b 269 -59 264 -62 265 -60 b 471 17 274 -58 471 17 b 488 36 484 22 488 27 l 488 127 b 475 144 488 134 487 144 l 472 141 b 471 141 472 141 471 141 l 471 143 b 272 68 471 143 282 71 l 269 66 b 264 71 264 66 264 69 z"},accidentalKoron:{x_min:0,x_max:300,y_min:-472,y_max:157,ha:629,o:"m 432 -4 b 415 10 432 1 418 9 l 4 226 b 0 223 1 226 0 225 l 0 -672 b 7 -680 0 -677 3 -680 l 45 -680 b 52 -672 49 -680 52 -677 l 52 -193 l 415 -22 b 432 -4 418 -20 432 -13 z m 52 -137 l 52 144 l 327 -7 z"},accidentalSori:{x_min:0,x_max:421,y_min:-318,y_max:328,ha:646,o:"m 606 10 b 589 23 606 16 592 22 l 382 109 l 382 465 b 374 472 382 469 379 472 l 337 472 b 330 465 333 472 330 469 l 330 132 l 183 194 l 183 425 b 176 432 183 429 180 432 l 138 432 b 131 425 134 432 131 429 l 131 216 l 3 269 b 0 265 0 269 0 266 l 0 223 b 3 213 0 216 0 215 l 131 160 l 131 -150 l 3 -203 b 0 -212 0 -204 0 -206 l 0 -255 b 3 -259 0 -258 1 -259 l 131 -204 l 131 -451 b 138 -458 131 -455 134 -458 l 176 -458 b 183 -451 180 -458 183 -455 l 183 -183 l 330 -120 l 330 -410 b 337 -418 330 -415 333 -418 l 374 -418 b 382 -410 379 -418 382 -415 l 382 -98 l 589 -9 b 606 10 592 -9 606 0 z m 183 -128 l 183 138 l 330 76 l 330 -66 z m 382 -45 l 382 55 l 501 6 z"},articAccentAbove:{x_min:0,x_max:339,y_min:1,y_max:245,ha:244,o:"m 469 151 b 488 177 488 156 488 166 b 469 203 488 189 488 197 l 37 350 b 24 353 32 351 26 353 b 3 333 12 353 7 344 b 0 318 1 327 0 323 b 20 298 0 311 4 304 b 346 187 20 298 331 193 b 356 177 353 186 356 181 b 344 167 356 173 353 170 b 20 58 328 163 20 58 b 0 36 4 50 0 43 b 3 23 0 32 1 27 b 23 1 7 13 13 1 b 29 3 24 1 27 1 z"},articAccentBelow:{x_min:0,x_max:339,y_min:-244,y_max:0,ha:244,o:"m 469 -202 b 488 -176 488 -197 488 -187 b 469 -150 488 -164 488 -156 l 37 -3 b 24 0 32 -1 26 0 b 3 -20 12 0 7 -9 b 0 -35 1 -26 0 -30 b 20 -55 0 -42 4 -49 b 346 -166 20 -55 331 -160 b 356 -176 353 -167 356 -171 b 344 -186 356 -180 353 -183 b 20 -295 328 -190 20 -295 b 0 -317 4 -302 0 -310 b 3 -330 0 -321 1 -325 b 23 -351 7 -340 13 -351 b 29 -350 24 -351 27 -351 z"},articTenutoAbove:{x_min:-1,x_max:338,y_min:0,y_max:48,ha:48,o:"m 452 0 b 487 35 485 0 487 16 b 452 69 487 53 487 69 l 33 69 b -1 35 -1 69 -1 53 b 33 0 -1 16 -1 0 z"},articTenutoBelow:{x_min:-1,x_max:338,y_min:-48,y_max:0,ha:48,o:"m 452 -69 b 487 -35 485 -69 487 -53 b 452 0 487 -16 487 0 l 33 0 b -1 -35 -1 0 -1 -16 b 33 -69 -1 -53 -1 -69 z"},articStaccatoAbove:{x_min:0,x_max:84,y_min:0,y_max:84,ha:84,o:"m 121 60 b 60 121 121 94 94 121 b 0 60 27 121 0 94 b 60 0 0 27 27 0 b 121 60 94 0 121 27 z"},articStaccatoBelow:{x_min:0,x_max:84,y_min:-84,y_max:0,ha:84,o:"m 121 -60 b 60 0 121 -27 94 0 b 0 -60 27 0 0 -27 b 60 -121 0 -94 27 -121 b 121 -60 94 -121 121 -94 z"},articStaccatissimoAbove:{x_min:1,x_max:100,y_min:-2,y_max:293,ha:295,o:"m 72 422 b 1 390 35 422 3 409 b 72 -3 1 369 39 -3 b 144 389 108 -3 144 356 b 72 422 144 410 111 422 z"},articStaccatissimoBelow:{x_min:1,x_max:100,y_min:-295,y_max:0,ha:295,o:"m 72 -425 b 144 -392 111 -425 144 -413 b 72 0 144 -359 108 0 b 1 -393 39 0 1 -372 b 72 -425 3 -412 35 -425 z"},articMarcatoAbove:{x_min:-1,x_max:235,y_min:-1,y_max:253,ha:254,o:"m 181 356 b 167 364 177 361 173 364 b 153 356 157 364 153 356 l 0 23 b -1 16 -1 20 -1 19 b 9 0 -1 9 1 1 b 16 -1 10 -1 14 -1 b 32 9 22 -1 29 1 b 112 186 32 9 109 180 b 118 190 114 189 115 190 b 127 186 121 190 124 189 b 209 9 128 180 209 9 b 225 0 213 3 219 0 l 323 0 b 338 16 333 1 338 7 b 337 23 338 19 338 22 z"},articMarcatoBelow:{x_min:-1,x_max:235,y_min:-254,y_max:0,ha:254,o:"m 156 -357 b 170 -366 160 -363 164 -366 b 184 -357 180 -366 184 -357 l 337 -24 b 338 -17 338 -22 338 -20 b 328 -1 338 -10 336 -3 b 321 0 327 0 323 0 b 305 -10 315 0 308 -3 b 225 -187 305 -10 228 -181 b 219 -192 223 -190 222 -192 b 210 -187 216 -192 213 -190 b 128 -10 209 -181 128 -10 b 112 -1 124 -4 118 -1 l 14 -1 b -1 -17 4 -3 -1 -9 b 0 -24 -1 -20 -1 -23 z"},fermataAbove:{x_min:3,x_max:605,y_min:-3,y_max:329,ha:332,o:"m 435 318 b 818 36 742 318 804 91 b 821 26 819 32 819 27 b 851 -4 831 6 837 -4 b 871 16 864 -4 871 1 b 870 30 871 20 871 24 b 438 474 780 471 480 474 b 6 30 392 474 94 471 b 4 14 4 24 4 19 b 23 -4 4 0 12 -4 b 52 26 36 -4 43 6 b 56 39 53 27 55 33 b 435 318 73 98 138 318 z m 516 75 b 436 153 516 117 480 153 b 359 75 395 153 359 117 b 436 -4 359 32 395 -4 b 516 75 480 -4 516 32 z"},fermataBelow:{x_min:3,x_max:605,y_min:-332,y_max:0,ha:332,o:"m 435 -323 b 56 -43 138 -323 73 -102 b 52 -30 55 -37 53 -32 b 23 0 43 -10 36 0 b 4 -19 12 0 4 -4 b 6 -35 4 -23 4 -29 b 438 -478 94 -475 392 -478 b 870 -35 480 -478 780 -475 b 871 -20 871 -29 871 -24 b 851 0 871 -6 864 0 b 821 -30 837 0 831 -10 b 818 -40 819 -32 819 -36 b 435 -323 804 -95 742 -323 z m 516 -79 b 436 0 516 -36 480 0 b 359 -79 395 0 359 -36 b 436 -157 359 -121 395 -157 b 516 -79 480 -157 516 -121 z"},breathMarkComma:{x_min:1,x_max:152,y_min:2,y_max:251,ha:249,o:"m 104 361 b 1 271 42 361 1 321 b 82 190 1 222 35 190 b 122 160 118 190 122 160 b 125 144 124 154 125 150 b 102 88 125 124 115 105 b 37 32 78 56 40 35 b 26 17 32 29 26 26 l 27 16 b 37 3 29 6 33 3 b 181 102 85 3 158 66 b 219 239 210 147 219 197 l 219 249 b 104 361 219 317 170 361 z"},breathMarkUpbow:{x_min:1,x_max:249,y_min:1,y_max:495,ha:494,o:"m 181 1 b 206 22 193 1 203 10 l 359 683 l 359 688 b 338 713 359 700 351 710 l 333 713 b 308 694 321 713 311 706 l 180 140 l 53 694 b 27 713 49 706 39 713 l 22 713 b 1 690 10 710 1 700 b 3 683 1 687 1 685 l 154 22 b 181 1 157 10 167 1 z"},caesura:{x_min:0,x_max:384,y_min:-1,y_max:532,ha:533,o:"m 40 -1 b 78 26 58 -1 72 9 l 321 713 b 323 726 323 717 323 721 b 282 766 323 747 304 766 b 245 739 265 766 251 756 l 3 52 b 0 37 1 48 0 42 b 27 1 0 22 10 7 b 40 -1 32 -1 36 -1 z m 308 26 l 552 713 b 553 726 553 717 553 721 b 513 766 553 747 534 766 b 475 739 495 766 481 756 l 232 52 b 230 39 230 48 230 43 b 258 1 230 23 240 7 b 271 -1 262 -1 266 -1 b 308 26 287 -1 302 9 z"},caesuraCurved:{x_min:0,x_max:373,y_min:0,y_max:530,ha:530,o:"m 491 763 b 445 719 468 763 446 744 b 252 98 432 507 340 295 l 226 39 b 223 27 225 35 223 32 b 252 0 223 13 233 0 b 276 16 262 0 272 6 b 537 716 386 230 537 478 b 491 763 537 742 518 763 z m 29 0 b 53 16 39 0 48 6 l 82 69 b 314 716 187 264 314 498 b 268 763 314 742 295 763 b 222 719 245 763 223 744 b 29 98 209 507 117 295 l 3 39 b 0 29 1 36 0 33 b 29 0 0 14 12 0 z"},restMaxima:{x_min:0,x_max:381,y_min:-249,y_max:250,ha:499,o:"m 180 -330 l 180 331 b 156 360 180 356 170 360 l 23 360 b 0 331 10 360 0 356 l 0 -330 b 23 -359 0 -354 10 -359 l 156 -359 b 180 -330 170 -359 180 -354 z m 549 -330 l 549 331 b 524 360 549 356 539 360 l 392 360 b 369 331 379 360 369 356 l 369 -330 b 392 -359 369 -354 379 -359 l 524 -359 b 549 -330 539 -359 549 -354 z"},restDoubleWhole:{x_min:0,x_max:125,y_min:0,y_max:250,ha:250,o:"m 180 22 l 180 338 b 156 360 180 350 170 360 l 23 360 b 0 338 10 360 0 350 l 0 22 b 23 0 0 10 10 0 l 156 0 b 180 22 170 0 180 10 z"},restWhole:{x_min:0,x_max:282,y_min:-135,y_max:9,ha:144,o:"m 406 -157 l 406 -24 b 369 13 406 -3 389 13 l 37 13 b 0 -24 16 13 0 -3 l 0 -157 b 37 -194 0 -177 16 -194 l 369 -194 b 406 -157 389 -194 406 -177 z"},restHalf:{x_min:0,x_max:282,y_min:-2,y_max:142,ha:144,o:"m 406 35 l 406 167 b 369 204 406 189 389 204 l 37 204 b 0 167 16 204 0 189 l 0 35 b 37 -3 0 14 16 -3 l 369 -3 b 406 35 389 -3 406 14 z"},restQuarter:{x_min:1,x_max:270,y_min:-375,y_max:373,ha:748,o:"m 112 -55 b 174 -141 135 -84 156 -111 b 183 -161 177 -147 183 -158 b 181 -167 183 -163 183 -166 b 166 -174 179 -173 173 -174 b 143 -170 160 -174 148 -171 b 137 -170 141 -170 138 -170 l 125 -166 b 1 -304 50 -166 1 -233 b 168 -527 1 -376 63 -446 b 206 -540 180 -536 194 -540 b 228 -531 216 -540 226 -537 b 230 -521 229 -527 230 -524 b 207 -487 230 -508 219 -497 b 170 -435 189 -487 173 -448 b 164 -397 166 -423 164 -410 b 255 -292 164 -338 194 -292 b 369 -317 297 -292 344 -308 l 370 -318 b 382 -320 376 -320 379 -320 b 389 -314 386 -320 389 -318 b 336 -232 389 -297 351 -249 b 236 -32 281 -166 236 -112 b 236 -27 236 -30 236 -29 l 238 -17 b 238 -13 238 -16 238 -14 b 333 199 243 71 295 140 b 338 220 337 206 338 213 b 333 248 338 235 333 248 b 95 526 333 248 120 501 b 69 537 88 533 78 537 b 40 507 55 537 40 527 b 46 484 40 500 42 492 b 134 291 52 468 134 395 b 48 108 134 238 112 176 b 27 66 33 94 27 78 b 42 32 27 46 42 32 z"},rest8th:{x_min:0,x_max:247,y_min:-251,y_max:174,ha:425,o:"m 193 154 b 96 251 193 207 150 251 b 0 154 43 251 0 207 b 39 81 0 124 17 98 b 117 56 62 65 89 56 b 173 66 137 56 157 60 b 225 88 193 72 206 78 b 232 89 228 89 230 89 b 239 76 238 89 239 84 b 238 60 239 72 239 66 b 104 -343 233 39 130 -248 b 145 -361 104 -360 137 -361 b 196 -347 161 -361 181 -359 b 341 161 200 -344 341 161 b 356 217 347 187 354 210 b 338 240 356 232 341 239 b 323 235 336 240 331 240 b 193 140 312 226 240 140 z"},rest16th:{x_min:0,x_max:320,y_min:-500,y_max:179,ha:679,o:"m 300 160 b 202 258 300 215 256 258 b 104 160 148 258 104 215 b 219 62 104 101 164 62 b 331 94 258 62 298 75 b 341 96 336 95 338 96 b 348 86 346 96 348 94 b 265 -173 348 63 275 -151 b 194 -217 253 -200 215 -217 b 196 -203 196 -212 196 -207 b 98 -105 196 -148 151 -105 b 0 -203 43 -105 0 -148 b 115 -301 0 -262 60 -301 b 223 -271 153 -301 190 -288 b 229 -279 226 -271 229 -274 l 228 -281 b 228 -282 228 -282 228 -282 l 91 -690 b 91 -691 91 -690 91 -691 l 89 -693 b 134 -720 89 -706 102 -720 b 189 -687 176 -720 183 -703 l 356 -138 b 420 81 393 -16 420 81 b 459 226 420 81 456 207 b 461 232 459 229 461 230 b 446 248 461 240 449 246 b 431 242 439 248 435 245 b 300 145 420 233 348 147 z"},rest32nd:{x_min:0,x_max:363,y_min:-500,y_max:426,ha:926,o:"m 508 603 b 492 598 501 603 497 600 b 361 503 482 590 410 503 l 361 516 b 264 613 361 570 318 613 b 166 516 210 613 166 570 b 206 444 166 487 183 461 b 246 423 217 433 232 428 b 284 418 258 420 269 418 b 393 449 321 418 360 432 b 399 451 395 451 397 451 b 415 426 409 451 415 436 l 413 423 b 413 422 413 423 413 422 l 357 192 b 279 140 350 168 302 140 b 281 153 281 144 281 148 b 183 251 281 207 236 251 b 85 153 128 251 85 207 b 125 81 85 124 102 98 b 164 60 137 71 150 65 b 203 55 176 58 189 55 b 311 86 240 55 278 69 b 315 88 312 88 314 88 b 325 69 323 88 325 76 l 268 -167 b 194 -217 261 -197 216 -216 b 196 -203 196 -212 196 -207 b 98 -105 196 -148 153 -105 b 0 -203 45 -105 0 -148 b 115 -301 0 -262 60 -301 b 228 -269 154 -301 194 -288 b 232 -268 229 -268 230 -268 b 240 -276 236 -268 240 -272 b 138 -688 240 -282 141 -678 b 137 -697 137 -691 137 -694 b 176 -720 137 -708 145 -720 b 232 -690 222 -720 226 -706 b 484 436 236 -672 484 436 b 521 582 484 436 518 564 b 523 588 521 585 523 586 b 508 603 523 600 511 603 z"},rest64th:{x_min:0,x_max:423,y_min:-753,y_max:430,ha:1183,o:"m 596 609 b 580 603 589 609 585 606 b 448 507 569 595 497 507 b 449 521 449 511 449 516 b 351 619 449 575 405 619 b 253 521 297 619 253 575 b 372 422 253 461 317 422 b 481 454 410 422 446 438 b 491 456 484 455 488 456 b 504 441 498 456 504 451 b 501 426 504 436 503 432 b 445 202 500 422 451 217 b 359 144 435 174 383 144 l 359 158 b 261 256 359 212 315 256 b 163 158 207 256 163 212 b 243 65 163 112 202 78 b 279 60 255 62 266 60 b 397 91 320 60 360 73 b 403 92 400 92 402 92 b 412 79 409 92 412 86 b 410 72 412 76 412 75 b 351 -161 408 59 356 -150 b 281 -212 340 -199 301 -212 l 281 -197 b 183 -99 281 -144 238 -99 b 85 -197 130 -99 85 -144 b 125 -271 85 -228 102 -253 b 166 -291 138 -279 151 -287 b 204 -297 177 -294 192 -297 b 262 -287 225 -297 245 -292 b 305 -265 282 -279 287 -274 b 310 -264 307 -264 308 -264 b 318 -284 317 -264 318 -275 b 317 -295 318 -288 317 -294 b 259 -524 315 -302 265 -508 b 194 -567 251 -554 213 -567 b 196 -554 196 -563 196 -559 b 98 -456 196 -500 153 -456 b 0 -554 45 -456 0 -500 b 40 -626 0 -583 17 -609 b 118 -652 60 -644 92 -652 b 210 -629 145 -652 186 -642 b 216 -628 213 -628 215 -628 b 228 -647 226 -628 228 -639 l 226 -651 b 226 -652 226 -651 226 -652 l 122 -1054 b 121 -1064 121 -1058 121 -1061 b 167 -1084 121 -1077 134 -1084 b 215 -1060 202 -1084 209 -1076 b 402 -278 217 -1047 229 -1021 b 436 -135 403 -278 431 -161 l 570 441 b 609 588 570 441 605 569 b 596 609 609 603 602 608 z"},rest128th:{x_min:0,x_max:485,y_min:-750,y_max:689,ha:1439,o:"m 537 894 b 439 992 537 949 494 992 b 341 894 386 992 341 949 b 382 822 341 865 359 840 b 459 796 402 805 433 796 b 518 806 480 796 501 801 l 520 808 b 569 828 539 814 552 819 b 580 831 572 829 577 831 b 598 812 589 831 598 825 b 596 801 598 809 598 805 b 540 575 590 773 546 595 b 448 510 534 553 475 510 l 448 524 b 350 622 448 577 405 622 b 252 524 297 622 252 577 b 292 451 252 494 269 468 b 369 426 318 433 337 426 b 429 435 389 426 412 429 b 494 464 449 442 475 455 b 498 465 495 465 497 465 b 505 446 504 465 505 456 b 503 426 505 439 504 432 l 446 202 b 366 144 439 173 389 144 l 366 158 b 268 256 366 212 323 256 b 170 158 215 256 170 212 b 289 59 170 98 235 59 b 347 69 310 59 330 63 b 397 91 367 76 379 82 b 406 94 400 92 403 94 b 415 79 412 94 415 88 b 412 63 415 75 413 69 b 357 -157 408 42 364 -134 b 281 -212 346 -196 302 -212 b 282 -197 281 -207 282 -203 b 184 -99 282 -144 238 -99 b 86 -197 130 -99 86 -144 b 204 -297 86 -258 150 -297 b 262 -287 225 -297 245 -292 b 312 -265 282 -279 294 -274 b 318 -264 314 -264 317 -264 b 327 -275 324 -264 327 -269 b 266 -517 324 -287 278 -490 b 200 -569 248 -566 220 -567 l 196 -554 b 98 -456 196 -500 153 -456 b 0 -554 45 -456 0 -500 b 118 -652 0 -615 63 -652 b 177 -642 138 -652 160 -648 l 179 -641 b 229 -621 197 -635 210 -629 l 230 -619 b 239 -626 236 -619 239 -622 b 238 -632 239 -628 239 -631 b 131 -1057 235 -642 134 -1050 b 173 -1080 131 -1071 140 -1080 b 230 -1057 219 -1080 225 -1074 l 658 815 b 697 960 658 815 694 942 b 698 966 697 963 698 965 b 684 982 698 975 687 981 b 668 976 677 982 672 979 b 537 880 658 969 586 881 z"},dynamicPiano:{x_min:-89,x_max:366,y_min:-142,y_max:274,ha:416,o:"m 395 395 b 292 357 350 395 318 380 b 262 328 272 340 268 328 b 246 363 255 328 259 338 b 177 393 236 380 215 393 b 1 251 92 393 46 333 b -9 223 -6 238 -9 230 b 7 207 -9 213 -1 207 b 30 229 17 207 23 216 b 127 338 72 301 101 338 b 143 321 138 338 143 331 b 134 285 143 310 138 295 l -43 -154 b -65 -168 -48 -166 -50 -168 l -109 -168 b -128 -187 -122 -168 -128 -174 b -111 -204 -128 -199 -122 -204 l 167 -204 b 186 -186 180 -204 186 -199 b 168 -168 186 -174 180 -168 l 111 -168 b 98 -164 102 -168 98 -168 b 101 -154 98 -163 99 -158 l 166 7 b 179 24 168 14 171 24 b 213 -1 186 24 190 10 b 276 -14 233 -12 252 -14 b 527 266 415 -14 527 130 b 395 395 527 350 475 395 z m 356 341 b 389 288 380 341 389 320 b 243 35 389 217 312 35 b 207 81 219 35 207 50 b 235 180 207 111 219 140 l 264 251 b 356 341 284 300 321 341 z"},dynamicMezzo:{x_min:-20,x_max:446,y_min:-10,y_max:274,ha:284,o:"m 528 395 b 431 350 487 395 454 374 b 409 330 416 336 415 330 b 397 360 402 330 406 341 b 334 395 389 379 370 395 b 236 350 292 395 259 374 b 215 330 222 336 220 330 b 203 360 207 330 212 340 b 147 393 194 379 174 393 b -19 251 71 393 26 331 b -29 223 -26 238 -29 230 b -13 207 -29 213 -22 207 b 9 226 -3 207 1 215 b 107 338 52 300 81 338 b 122 321 118 338 122 331 b 114 285 122 310 118 295 l 9 24 b 4 9 6 17 4 13 b 20 0 4 3 9 0 l 91 0 b 114 17 104 0 108 3 l 207 251 b 287 323 225 292 255 323 b 308 302 304 323 308 314 b 294 249 308 285 302 269 b 203 24 294 248 292 248 b 199 9 200 17 199 13 b 215 0 199 3 203 0 l 285 0 b 308 17 298 0 302 3 l 402 251 b 481 323 419 292 449 323 b 503 302 498 323 503 314 b 413 43 503 252 413 104 b 478 -14 413 6 436 -14 b 629 102 533 -14 583 26 b 642 132 638 117 642 125 b 629 145 642 141 636 145 b 608 127 619 145 615 138 b 534 49 580 84 553 49 b 523 62 526 49 523 53 b 606 317 523 112 606 238 b 528 395 606 353 588 395 z"},dynamicForte:{x_min:-141,x_max:364,y_min:-152,y_max:444,ha:596,o:"m 23 380 b 0 357 7 380 0 373 b 22 336 0 343 7 336 l 105 336 b 117 330 114 336 117 336 b 114 315 117 327 115 323 l 23 0 b -101 -187 -17 -141 -43 -187 b -127 -174 -120 -187 -127 -181 b -92 -156 -127 -163 -114 -170 b -63 -102 -75 -144 -63 -125 b -128 -43 -63 -65 -89 -43 b -203 -122 -171 -43 -203 -78 b -95 -219 -203 -186 -156 -219 b 161 17 14 -219 82 -145 b 269 317 203 105 235 194 l 271 318 b 289 336 271 323 282 336 l 383 336 b 406 359 399 336 406 343 b 384 380 406 373 399 380 l 298 380 b 284 387 288 380 284 380 b 287 405 284 392 285 396 b 419 606 315 530 347 606 b 442 595 431 606 442 603 b 419 580 442 586 435 588 b 389 526 400 572 389 552 b 454 465 389 485 418 465 b 524 543 491 465 524 490 b 400 639 524 596 491 639 b 135 402 261 639 183 540 b 107 380 128 380 127 380 z"},dynamicRinforzando:{x_min:-20,x_max:277,y_min:0,y_max:274,ha:274,o:"m 324 395 b 235 350 287 395 256 374 b 215 330 222 336 220 330 b 203 360 207 330 213 337 b 145 393 194 379 174 393 b -19 251 75 393 27 337 b -29 223 -26 238 -29 230 b -13 207 -29 213 -22 207 b 9 226 -3 207 3 215 b 107 338 52 301 81 338 b 122 321 118 338 122 331 b 114 285 122 310 118 295 l 9 24 b 4 9 6 17 4 13 b 20 0 4 3 9 0 l 91 0 b 114 17 104 0 108 3 l 207 251 b 304 351 226 298 272 351 b 318 343 312 351 318 348 b 287 285 318 330 287 325 b 338 239 287 256 308 239 b 399 318 373 239 399 268 b 324 395 399 360 377 395 z"},dynamicSforzando:{x_min:0,x_max:229,y_min:-10,y_max:273,ha:283,o:"m 212 393 b 68 274 127 393 68 350 b 145 161 68 223 95 196 b 200 85 187 132 200 114 b 127 20 200 53 173 20 b 66 42 91 20 66 32 b 91 56 66 49 75 46 b 111 98 104 65 111 79 b 59 145 111 127 86 145 b 0 78 24 145 0 117 b 125 -14 0 30 49 -14 b 291 120 219 -14 291 36 b 220 232 291 160 276 190 b 151 314 168 271 151 287 b 213 361 151 337 168 361 b 258 346 238 361 258 356 b 240 333 258 340 251 340 b 226 298 232 325 226 314 b 276 252 226 269 248 252 b 330 307 311 252 330 279 b 212 393 330 360 285 393 z"},dynamicZ:{x_min:-30,x_max:244,y_min:-10,y_max:268,ha:278,o:"m 333 386 b 298 377 321 386 314 382 b 239 370 282 373 259 370 b 94 383 153 370 111 383 b 68 364 79 383 72 377 l 33 264 b 29 242 30 255 29 248 b 45 228 29 232 36 228 b 66 249 55 228 60 236 l 81 279 b 96 297 85 288 88 297 b 168 292 102 297 127 292 b 223 302 194 292 215 302 b 196 269 229 302 197 271 l -26 45 b -43 16 -37 33 -43 27 b -24 -1 -43 6 -36 -1 b 4 16 -12 -1 -3 10 b 39 30 16 24 27 30 b 179 -14 79 30 108 -14 b 297 102 259 -14 297 43 b 245 166 297 147 271 166 b 197 115 219 166 197 145 b 236 72 197 88 216 72 b 259 79 251 72 255 79 b 264 75 262 79 264 78 b 258 60 264 72 261 66 b 229 45 252 50 242 45 b 117 95 186 45 173 95 b 85 86 98 95 89 86 b 102 111 85 86 95 104 l 333 338 b 351 370 344 350 351 359 b 333 386 351 380 343 386 z"},ornamentTrill:{x_min:0,x_max:521,y_min:-10,y_max:390,ha:400,o:"m 383 562 b 364 557 377 562 369 559 l 294 534 b 269 511 281 530 275 526 l 217 384 b 206 367 212 370 210 367 b 179 380 200 367 192 374 b 118 393 158 389 140 393 b 0 292 50 393 0 353 b 95 210 0 248 30 210 b 140 213 112 210 131 213 b 144 209 143 213 144 212 b 140 194 144 206 143 202 l 124 156 b 96 58 108 117 96 88 b 179 -14 96 17 124 -14 b 325 153 253 -14 325 46 b 307 251 325 187 320 219 b 302 265 304 258 302 261 b 334 294 302 274 311 281 l 343 298 b 455 348 393 328 428 348 b 474 327 468 348 474 344 b 465 285 474 312 469 295 l 360 24 b 356 9 357 17 356 13 b 372 0 356 3 360 0 l 442 0 b 465 17 455 0 459 3 l 559 251 b 655 351 577 298 624 351 b 670 343 664 351 670 348 b 638 285 670 330 638 325 b 690 239 638 256 660 239 b 750 318 724 239 750 268 b 675 395 750 360 729 395 b 586 350 638 395 608 374 b 566 330 573 336 572 330 b 553 361 559 330 564 340 b 490 393 543 380 521 393 b 347 348 432 393 377 364 b 312 333 328 338 320 333 b 308 337 310 333 308 334 b 315 359 308 343 312 351 l 387 537 b 392 553 390 544 392 549 b 383 562 392 559 389 562 z m 118 360 b 192 325 134 360 192 347 b 186 307 192 321 189 314 l 180 292 b 148 265 173 274 167 269 b 98 258 130 261 112 258 b 39 301 50 258 39 281 b 118 360 39 327 60 360 z m 272 240 b 292 151 285 240 292 164 b 212 30 292 88 253 30 b 196 48 200 30 196 37 b 207 92 196 59 202 78 b 264 230 207 94 209 94 b 272 240 266 238 268 240 z"},ornamentTurn:{x_min:0,x_max:460,y_min:0,y_max:218,ha:218,o:"m 534 314 b 454 251 490 314 454 294 b 505 199 454 219 475 199 b 579 232 547 199 549 232 b 626 164 603 232 626 202 b 533 72 626 102 583 72 b 377 180 487 72 439 111 b 150 312 307 258 243 312 b 0 148 55 312 0 240 b 128 0 0 45 66 0 b 209 63 173 0 209 20 b 157 115 209 95 187 115 b 84 82 115 115 114 82 b 36 150 59 82 36 112 b 130 242 36 212 79 242 b 285 134 176 242 223 203 b 513 1 356 56 419 1 b 662 166 608 1 662 73 b 534 314 662 269 596 314 z"},ornamentTurnSlash:{x_min:0,x_max:460,y_min:-90,y_max:306,ha:396,o:"m 333 441 b 310 418 315 441 310 433 l 310 274 b 302 252 310 258 308 252 b 261 278 294 252 287 262 b 150 311 228 298 192 311 b 0 147 55 311 0 239 b 128 -1 0 43 66 -1 b 209 62 173 -1 209 19 b 157 114 209 94 187 114 b 84 81 115 114 114 81 b 36 148 59 81 36 111 b 130 240 36 210 79 240 b 285 128 176 240 222 197 b 307 79 304 108 307 105 l 307 -107 b 330 -130 307 -122 312 -130 b 353 -107 347 -130 353 -122 l 353 37 b 360 59 353 53 353 59 b 402 33 369 59 376 49 b 513 0 435 13 471 0 b 662 164 608 0 662 72 b 534 312 662 268 596 312 b 454 249 490 312 454 292 b 505 197 454 217 475 197 b 579 230 547 197 549 230 b 626 163 603 230 626 200 b 533 71 626 101 583 71 b 377 183 487 71 441 114 b 356 232 359 203 356 206 l 356 418 b 333 441 356 433 350 441 z"},ornamentMordent:{x_min:1,x_max:729,y_min:-73,y_max:319,ha:392,o:"m 546 265 l 546 459 l 501 459 l 501 216 l 459 167 b 439 167 454 160 445 160 b 302 327 387 228 310 317 b 258 353 291 338 282 351 b 226 340 245 353 238 348 l 20 107 b 1 73 12 98 1 84 b 30 59 1 65 9 59 b 88 94 53 59 73 79 b 144 143 107 109 124 127 b 176 161 158 154 168 161 b 197 144 183 161 189 156 l 323 10 b 351 0 328 3 340 0 b 377 9 361 0 372 3 b 498 114 392 17 475 94 l 498 -105 l 544 -105 l 544 153 b 562 160 550 157 556 160 b 585 144 569 160 576 156 b 710 10 590 135 697 24 b 737 0 716 3 727 0 b 765 9 749 0 759 3 b 1030 295 776 17 1011 274 l 1032 300 b 1050 328 1041 308 1050 318 b 1012 353 1050 343 1024 353 b 986 343 1002 353 994 348 b 854 190 971 330 871 206 b 828 176 842 180 835 176 b 802 190 818 176 809 183 b 681 333 791 202 696 320 b 645 353 668 344 657 353 b 613 340 634 353 626 350 b 580 304 600 330 590 315 z"},ornamentShortTrill:{x_min:0,x_max:725,y_min:0,y_max:245,ha:245,o:"m 429 167 l 301 325 b 256 353 291 338 282 350 b 225 340 246 353 238 350 b 16 105 158 268 88 186 b 0 72 9 96 0 86 b 29 58 0 63 7 58 b 71 76 42 58 55 62 l 158 154 b 174 160 163 158 168 160 b 197 143 181 160 187 154 b 321 10 203 135 310 24 b 350 0 327 3 338 0 b 377 7 361 0 372 3 l 533 148 b 554 160 543 158 550 160 b 577 143 562 160 566 156 b 703 10 585 135 690 24 b 732 0 708 3 720 0 b 759 7 743 0 753 3 b 1024 294 769 16 1005 272 b 1044 327 1032 305 1044 321 b 1005 353 1044 341 1018 353 b 979 343 996 353 988 348 b 848 189 963 330 864 204 b 821 174 837 179 828 174 b 796 189 811 174 804 181 b 674 331 783 202 688 318 b 641 351 662 343 651 351 b 606 340 628 351 619 350 b 573 304 593 328 583 315 b 444 167 533 259 491 213 b 429 167 439 161 433 161 z"},ornamentTremblement:{x_min:1,x_max:985,y_min:0,y_max:244,ha:244,o:"m 678 325 b 634 351 667 338 657 350 b 602 338 621 351 613 348 l 448 167 b 439 167 446 164 441 164 l 302 325 b 258 351 291 338 281 350 b 228 338 245 351 238 348 b 193 304 215 328 204 315 l 19 107 b 1 72 13 96 1 76 b 30 58 1 63 9 58 b 89 92 52 58 73 78 l 144 141 b 148 144 145 143 147 143 b 176 160 160 153 170 160 b 199 143 183 160 189 154 b 324 10 204 134 311 23 b 351 0 330 3 340 0 b 379 7 363 0 373 3 l 530 148 b 552 160 536 154 546 160 b 575 143 559 160 564 154 b 698 10 580 134 687 23 b 727 0 704 3 716 0 b 755 7 739 0 749 3 l 907 147 b 930 160 922 158 923 160 b 952 143 937 160 943 154 l 1077 10 b 1107 0 1084 3 1096 0 b 1133 7 1117 0 1128 3 b 1398 294 1143 16 1380 272 b 1418 327 1407 305 1418 321 b 1381 351 1418 343 1394 351 b 1354 341 1371 351 1362 348 b 1223 189 1338 328 1238 204 b 1195 174 1211 179 1202 174 b 1171 189 1185 174 1178 181 b 1048 331 1158 200 1063 318 b 1012 351 1035 343 1024 351 b 981 338 1002 351 994 350 b 948 304 968 328 958 315 b 827 166 907 258 865 212 b 815 166 824 163 818 163 b 678 325 760 226 732 264 z"},ornamentPrecompAppoggTrill:{x_min:0,x_max:1119,y_min:0,y_max:481,ha:481,o:"m 1015 163 b 873 328 963 223 880 318 b 828 354 860 344 847 353 b 796 341 816 354 809 351 b 763 305 783 331 773 317 b 642 168 721 261 681 215 b 636 163 641 167 639 164 b 494 328 585 223 501 318 b 449 354 481 344 468 353 b 418 341 438 354 431 351 b 384 305 405 331 395 317 b 264 168 343 261 302 215 l 242 144 b 144 88 232 124 171 88 b 79 197 81 88 79 189 l 79 648 b 60 693 79 683 71 693 b 52 691 58 693 55 693 b 0 616 3 672 0 625 l 0 207 b 121 0 0 40 68 0 b 249 68 168 0 232 53 b 279 94 262 75 271 86 b 336 144 298 111 315 128 b 367 163 350 156 360 163 b 389 145 374 163 380 157 b 514 12 395 137 501 26 b 543 1 520 4 531 1 b 569 9 553 1 563 4 b 636 73 576 14 605 43 l 658 94 b 714 144 677 111 694 128 b 746 163 729 156 739 163 b 768 145 753 163 759 157 b 893 12 773 137 880 26 b 922 1 899 4 910 1 b 948 9 932 1 942 4 l 1012 71 b 1037 94 1022 78 1030 86 b 1092 144 1054 111 1073 128 b 1123 161 1106 156 1115 161 b 1146 145 1130 161 1136 157 b 1270 12 1152 137 1259 26 b 1299 1 1276 4 1287 1 b 1326 9 1310 1 1320 4 b 1591 297 1336 19 1572 275 b 1611 328 1600 307 1611 320 b 1574 354 1611 343 1585 354 b 1548 344 1565 354 1555 350 b 1416 192 1532 331 1431 206 b 1388 177 1404 181 1395 177 b 1365 190 1380 177 1371 184 b 1243 333 1352 203 1256 321 b 1205 354 1228 346 1217 354 b 1174 341 1195 354 1187 351 b 1140 305 1161 330 1152 317 z"},ornamentPrecompSlideTrillDAnglebert:{x_min:2,x_max:1150,y_min:-367,y_max:245,ha:612,o:"m 1058 160 b 916 327 1007 220 923 317 b 871 353 903 343 890 351 b 840 340 860 353 852 350 b 806 304 827 330 816 315 b 685 167 765 259 724 213 l 680 160 l 615 235 b 419 344 582 275 523 344 b 3 -144 258 344 3 26 b 4 -168 3 -153 3 -160 b 246 -482 24 -315 99 -422 b 458 -528 340 -521 410 -528 b 514 -526 485 -528 504 -526 b 552 -508 531 -526 552 -517 b 514 -497 552 -503 541 -498 l 503 -497 b 194 -390 432 -494 298 -488 b 69 -151 194 -390 69 -279 b 184 96 69 -60 128 27 b 328 183 202 118 258 183 b 477 96 413 183 454 118 b 559 10 510 62 552 19 b 588 0 566 3 576 0 b 613 7 598 0 609 3 b 723 112 622 14 681 73 b 789 161 733 122 776 161 b 811 144 796 161 802 156 b 936 10 816 135 923 24 b 965 0 942 3 953 0 b 991 7 975 0 985 3 b 1051 66 996 12 1022 37 b 1081 92 1063 73 1073 84 b 1136 143 1099 109 1117 127 b 1168 160 1151 154 1159 160 b 1191 144 1175 160 1181 156 b 1315 10 1197 135 1303 24 b 1344 0 1320 3 1332 0 b 1371 7 1355 0 1365 3 b 1636 295 1381 17 1617 274 b 1656 327 1644 305 1656 318 b 1619 353 1656 341 1630 353 b 1593 343 1610 353 1600 348 b 1460 190 1577 330 1476 204 b 1433 176 1449 180 1440 176 b 1410 189 1424 176 1416 183 b 1287 331 1397 202 1300 320 b 1250 353 1273 344 1261 353 b 1218 340 1240 353 1231 350 b 1185 304 1205 328 1197 315 z"},ornamentPrecompSlideTrillBach:{x_min:0,x_max:1048,y_min:-367,y_max:331,ha:698,o:"m 1038 477 l 979 477 l 979 238 l 912 160 b 769 327 858 220 775 317 b 724 353 756 343 743 351 b 693 340 713 353 706 350 b 660 304 680 330 670 315 b 539 167 618 259 577 213 b 533 161 536 166 534 163 b 390 327 480 220 396 317 b 346 353 377 343 364 351 l 340 353 b 308 340 330 353 321 350 b 275 304 295 330 285 315 b 117 122 220 243 168 186 b 0 -144 68 62 0 -48 b 1 -168 0 -153 0 -160 b 243 -482 22 -315 96 -422 b 455 -528 337 -521 408 -528 b 511 -526 482 -528 501 -526 b 549 -508 528 -526 549 -517 b 511 -497 549 -503 539 -498 l 500 -497 b 192 -390 429 -494 295 -488 b 68 -177 192 -390 84 -298 b 66 -151 66 -168 66 -160 b 189 105 66 -58 127 35 b 232 143 203 118 216 131 b 264 161 246 154 256 161 b 285 144 271 161 276 156 b 410 10 291 135 397 24 b 439 0 416 3 428 0 b 465 7 449 0 459 3 l 531 72 b 554 92 540 78 547 86 b 611 143 573 109 590 127 b 642 161 625 154 635 161 b 664 144 649 161 655 156 b 789 10 670 135 776 24 b 818 0 795 3 806 0 b 844 7 828 0 838 3 b 904 66 850 12 876 37 b 935 92 916 73 924 84 b 979 134 949 107 963 121 l 979 -88 l 1037 -88 l 1037 151 l 1044 144 b 1168 10 1050 135 1156 24 b 1197 0 1174 3 1185 0 b 1224 7 1208 0 1218 3 b 1489 295 1234 17 1470 274 b 1509 327 1498 305 1509 318 b 1472 353 1509 341 1483 353 b 1446 343 1463 353 1453 348 b 1313 190 1430 330 1329 204 b 1286 176 1302 180 1293 176 b 1263 189 1277 176 1269 183 b 1140 331 1250 202 1153 320 b 1103 353 1126 344 1115 353 b 1071 340 1093 353 1084 350 b 1038 304 1058 328 1050 315 z"},ornamentPrecompTrillSuffixDandrieu:{x_min:0,x_max:949,y_min:0,y_max:381,ha:381,o:"m 1367 314 b 1250 521 1367 419 1318 482 b 1107 549 1211 537 1145 549 b 1083 546 1096 549 1087 549 b 1066 528 1071 540 1066 534 b 1079 520 1066 524 1070 520 b 1323 351 1187 517 1323 487 b 1201 171 1323 269 1260 219 b 1194 166 1201 171 1198 168 b 1056 327 1142 226 1063 317 b 1011 353 1043 343 1030 351 b 979 340 999 353 992 350 b 946 304 966 330 956 315 b 825 167 904 259 864 213 l 821 161 b 678 327 768 222 685 317 b 634 353 665 343 652 351 b 602 340 622 353 615 350 b 569 304 589 330 579 315 b 448 167 527 259 487 213 l 444 161 b 301 327 390 222 308 317 b 256 353 288 343 275 351 b 225 340 245 353 238 350 b 192 304 212 330 202 315 b 71 167 150 259 109 213 b 17 105 52 147 36 127 b 0 73 10 98 0 84 b 29 58 0 65 7 58 b 86 92 56 59 72 79 b 143 143 105 109 122 127 b 174 161 157 154 167 161 b 196 144 181 161 187 156 b 321 10 202 135 308 24 b 350 0 327 3 338 0 b 376 7 360 0 370 3 b 485 112 384 14 444 73 b 552 161 495 122 539 161 b 573 144 559 161 564 156 b 698 10 579 135 685 24 b 727 0 704 3 716 0 b 753 7 737 0 747 3 b 863 112 762 14 821 73 b 929 161 873 122 916 161 b 950 144 936 161 942 156 b 1076 10 956 135 1063 24 b 1104 0 1081 3 1093 0 b 1130 7 1115 0 1125 3 b 1236 108 1139 14 1195 69 b 1367 314 1297 160 1367 233 z"},ornamentPrecompDoubleCadenceUpperPrefix:{x_min:0,x_max:1278,y_min:0,y_max:247,ha:247,o:"m 1801 356 b 1776 346 1793 356 1783 351 b 1642 192 1760 333 1659 206 b 1614 177 1630 181 1621 177 b 1591 190 1606 177 1597 184 b 1469 334 1578 203 1482 323 b 1430 356 1453 347 1441 356 b 1398 343 1420 356 1411 353 b 1365 307 1385 331 1377 318 l 1240 164 b 1097 330 1187 226 1104 320 b 1053 356 1084 346 1071 354 b 1021 343 1041 356 1034 353 b 988 307 1008 333 998 318 b 865 168 946 262 904 216 l 861 163 b 717 330 808 223 724 320 b 672 356 704 346 691 354 b 641 343 661 356 654 353 b 608 307 628 333 618 318 b 485 168 566 262 524 216 l 455 134 b 284 46 409 88 351 46 b 16 285 148 46 32 265 b 3 295 9 292 4 295 b 0 291 1 295 0 292 b 1 285 0 288 1 285 b 308 0 42 190 157 0 b 530 120 415 1 482 63 b 559 144 539 128 549 137 b 590 163 573 156 583 163 b 612 145 598 163 603 157 b 739 10 618 137 724 24 b 768 0 744 3 756 0 b 793 7 778 0 788 3 b 903 114 802 14 861 75 l 939 144 b 971 163 953 156 963 163 b 992 145 978 163 984 157 b 1119 10 998 137 1106 24 b 1148 0 1125 3 1136 0 b 1174 7 1158 0 1168 3 b 1284 114 1182 14 1241 75 b 1316 144 1282 115 1312 141 b 1348 161 1331 156 1339 161 b 1371 145 1355 161 1361 157 b 1496 10 1377 137 1485 24 b 1525 0 1502 3 1513 0 b 1552 7 1536 0 1547 3 b 1819 298 1562 17 1800 276 b 1840 330 1829 308 1840 320 b 1832 344 1840 334 1837 340 b 1801 356 1820 351 1810 356 z"},ornamentPrecompDoubleCadenceUpperPrefixTurn:{x_min:0,x_max:1277,y_min:-62,y_max:333,ha:395,o:"m 1273 202 l 1273 480 l 1230 480 l 1230 174 l 1097 328 b 1053 354 1084 344 1071 353 b 1021 341 1041 354 1034 351 b 988 305 1008 331 998 317 b 865 167 945 261 904 215 l 861 161 b 717 328 808 222 724 318 b 672 354 704 344 691 353 b 641 341 661 354 654 351 b 608 305 628 331 618 317 b 485 167 564 261 524 215 b 455 132 474 156 465 144 b 284 45 410 88 350 45 b 14 284 148 45 30 264 b 3 294 9 291 4 294 b 0 289 1 294 0 291 b 1 284 0 287 1 284 b 308 -1 42 189 157 -1 b 530 118 415 0 481 62 b 557 143 539 127 547 135 b 590 161 572 154 582 161 b 612 144 598 161 603 156 b 737 9 618 135 724 24 b 768 -1 743 1 755 -1 b 793 6 778 -1 788 1 b 903 112 802 13 861 73 l 937 143 b 971 161 953 154 963 161 b 992 144 978 161 984 156 b 1117 9 998 135 1104 24 b 1148 -1 1123 1 1136 -1 b 1174 6 1158 -1 1168 1 l 1230 60 l 1230 -89 l 1273 -89 l 1273 102 l 1283 112 b 1348 160 1295 125 1332 160 b 1371 144 1355 160 1361 156 b 1496 9 1377 135 1483 24 b 1525 -1 1502 1 1513 -1 b 1552 6 1536 -1 1547 1 b 1819 297 1562 16 1800 275 b 1839 328 1827 307 1839 320 b 1801 354 1839 343 1813 354 b 1776 344 1793 354 1783 350 b 1642 190 1760 331 1657 206 b 1614 176 1630 180 1621 176 b 1591 189 1606 176 1597 183 b 1467 333 1578 203 1480 321 b 1430 354 1453 346 1441 354 b 1398 341 1420 354 1411 351 b 1365 305 1385 330 1377 317 z"},ornamentPrecompTrillLowerSuffix:{x_min:0,x_max:859,y_min:-222,y_max:246,ha:468,o:"m 1164 217 b 1031 351 1138 259 1063 351 b 1011 337 1020 351 1024 347 b 828 167 952 291 886 217 l 824 164 b 683 328 772 225 690 318 b 638 354 670 344 657 353 b 606 341 626 354 619 351 b 573 305 593 331 583 317 b 451 167 530 261 490 215 l 446 161 b 302 328 393 222 310 318 b 258 354 289 344 276 353 b 226 341 246 354 239 351 b 193 305 213 331 203 317 b 71 167 150 261 109 215 b 17 105 52 147 36 127 b 0 73 10 98 0 84 b 29 58 0 65 7 58 b 86 92 56 59 72 79 b 143 143 105 109 122 127 b 176 161 157 154 168 161 b 197 144 183 161 189 156 b 323 9 203 135 310 23 b 353 -1 328 1 340 -1 b 379 6 363 -1 373 1 b 488 112 387 13 446 73 l 523 143 b 556 161 539 154 549 161 b 577 144 563 161 569 156 b 703 9 583 135 690 23 b 733 -1 708 1 721 -1 b 759 6 743 -1 753 1 b 868 112 768 13 827 73 b 955 183 878 122 943 183 b 1081 107 965 183 1031 153 b 1156 -89 1128 63 1156 6 l 1156 -102 b 948 -297 1156 -204 1048 -297 b 806 -271 904 -297 850 -282 l 792 -266 b 801 -288 792 -268 795 -282 b 948 -320 809 -297 880 -320 b 1237 -50 1092 -320 1237 -199 b 1164 217 1237 75 1218 122 z"},brassScoop:{x_min:1,x_max:320,y_min:-373,y_max:13,ha:386,o:"m 35 -537 b 461 -12 194 -518 461 -289 b 438 19 461 13 451 19 b 410 -9 425 19 413 9 b 35 -425 357 -366 92 -403 b 1 -482 13 -433 1 -438 l 1 -505 b 26 -537 1 -526 3 -537 z"},brassDoitMedium:{x_min:0,x_max:489,y_min:-40,y_max:346,ha:386,o:"m 33 -58 b 704 468 255 -58 683 186 b 681 498 704 494 693 498 b 654 471 668 498 658 488 b 33 55 550 118 91 76 b 0 -3 12 46 0 42 l 0 -26 b 24 -58 0 -46 1 -58 z"},brassFallLipShort:{x_min:1,x_max:293,y_min:-345,y_max:42,ha:387,o:"m 22 60 b 1 35 4 60 1 52 l 1 6 b 26 -50 3 -40 10 -43 b 32 -52 27 -50 30 -50 b 376 -469 85 -73 327 -111 b 400 -497 379 -487 387 -497 b 422 -467 412 -497 422 -491 b 32 60 422 -187 177 40 z"},brassLiftMedium:{x_min:0,x_max:811,y_min:0,y_max:852,ha:852,o:"m 1138 1220 b 1135 1225 1135 1223 1135 1224 b 1129 1227 1133 1227 1130 1227 b 1117 1207 1122 1227 1117 1212 l 1117 1201 b 1109 1164 1117 1187 1117 1172 b 1100 1156 1107 1161 1104 1158 b 959 1104 1058 1128 995 1140 b 929 1032 936 1081 929 1056 b 932 1007 929 1024 930 1015 b 923 976 932 995 930 985 l 914 971 b 773 919 873 942 809 955 b 743 847 750 896 743 870 b 746 821 743 838 744 829 b 737 791 746 809 744 799 l 729 783 b 588 733 687 756 624 769 b 557 661 564 710 557 684 b 560 635 557 652 559 644 b 552 605 560 624 559 612 l 543 598 b 402 547 501 570 438 583 b 372 475 379 524 372 498 b 374 449 372 467 373 458 b 366 419 374 438 373 426 l 357 412 b 216 361 315 384 252 397 b 186 289 193 338 186 312 b 189 264 186 281 187 272 b 180 233 189 252 187 240 b 171 226 177 232 174 229 b 30 176 130 199 66 212 b 0 104 7 153 0 128 b 33 0 0 88 14 0 b 49 17 40 0 49 10 b 71 63 52 35 56 49 b 212 115 102 95 154 59 b 239 186 230 134 239 160 b 236 210 239 194 238 202 b 256 249 239 225 243 236 b 397 301 288 281 340 245 b 425 372 416 320 425 346 b 422 396 425 380 423 387 b 442 435 425 410 429 422 b 583 487 474 467 526 431 b 611 557 602 505 611 531 b 608 582 611 566 609 573 b 628 621 611 596 615 608 b 769 672 660 652 711 618 b 796 743 788 691 796 717 b 793 768 796 752 795 759 b 814 806 796 782 801 793 b 955 858 845 838 897 804 b 982 929 973 877 982 903 b 979 953 982 937 981 945 b 999 992 982 968 986 979 b 1140 1045 1031 1024 1083 989 b 1168 1116 1161 1066 1168 1090 b 1138 1220 1168 1162 1145 1207 z"},brassFallRoughMedium:{x_min:0,x_max:811,y_min:0,y_max:852,ha:852,o:"m 30 1220 b 0 1116 23 1207 0 1162 b 27 1045 0 1090 7 1066 b 168 992 85 989 137 1024 b 189 953 181 979 186 968 b 186 929 187 945 186 937 b 213 858 186 903 194 877 b 354 806 271 804 323 838 b 374 768 367 793 372 782 b 372 743 373 759 372 752 b 399 672 372 717 380 691 b 540 621 456 618 508 652 b 560 582 553 608 557 596 b 557 557 559 573 557 566 b 585 487 557 531 566 505 b 726 435 642 431 694 467 b 746 396 739 422 743 410 b 743 372 744 387 743 380 b 770 301 743 346 752 320 b 912 249 828 245 880 281 b 932 210 924 236 929 225 b 929 186 930 202 929 194 b 956 115 929 160 937 134 b 1097 63 1014 59 1066 95 b 1119 17 1112 49 1116 35 b 1135 0 1119 10 1128 0 b 1168 104 1153 0 1168 91 b 1138 176 1168 128 1161 153 b 996 226 1102 212 1038 199 b 988 233 994 229 991 232 b 979 264 981 240 979 252 b 982 289 981 272 982 281 b 952 361 982 312 975 338 b 811 412 916 397 852 384 l 802 419 b 793 449 795 426 793 438 b 796 475 795 458 796 467 b 766 547 796 498 789 524 b 625 598 730 583 667 570 l 616 605 b 608 635 609 612 608 624 b 611 661 609 644 611 652 b 580 733 611 684 603 710 b 439 783 544 769 481 756 l 431 791 b 422 821 423 799 422 809 b 425 847 423 829 425 838 b 395 919 425 870 418 896 b 253 971 359 955 295 942 l 245 976 b 236 1007 238 985 236 995 b 239 1032 238 1015 239 1024 b 209 1104 239 1056 232 1081 b 68 1156 173 1140 109 1128 b 59 1164 63 1158 60 1161 b 50 1201 50 1172 50 1187 l 50 1207 b 39 1227 50 1212 46 1227 b 33 1225 37 1227 35 1227 b 30 1220 33 1224 33 1223 z"},brassBend:{x_min:0,x_max:392,y_min:0,y_max:282,ha:282,o:"m 282 0 b 552 72 369 0 456 23 b 564 92 560 75 564 84 l 564 383 b 541 406 564 395 554 406 b 518 383 528 406 518 395 l 518 107 b 282 46 435 65 357 46 b 46 107 207 46 130 65 l 46 383 b 23 406 46 395 36 406 b 0 383 10 406 0 395 l 0 92 b 13 72 0 84 4 75 b 282 0 108 23 196 0 z"},brassMuteClosed:{x_min:0,x_max:272,y_min:0,y_max:272,ha:272,o:"m 392 219 l 219 219 l 219 392 l 173 392 l 173 219 l 0 219 l 0 173 l 173 173 l 173 0 l 219 0 l 219 173 l 392 173 z"},brassMuteOpen:{x_min:0,x_max:304,y_min:0,y_max:304,ha:304,o:"m 219 0 b 438 219 340 0 438 98 b 219 438 438 340 340 438 b 0 219 98 438 0 340 b 219 0 0 98 98 0 z m 219 392 b 392 219 314 392 392 314 b 219 46 392 124 314 46 b 46 219 124 46 46 124 b 219 392 46 314 124 392 z"},brassFlip:{x_min:0,x_max:379,y_min:0,y_max:282,ha:282,o:"m 523 0 b 541 9 530 0 536 3 b 546 22 544 13 546 17 b 536 42 546 29 541 36 l 36 402 b 23 406 33 405 27 406 b 0 383 12 406 0 395 l 0 23 b 23 0 0 10 10 0 b 46 23 36 0 46 10 l 46 337 l 508 4 b 523 0 513 1 517 0 z"},brassJazzTurn:{x_min:0,x_max:620,y_min:0,y_max:245,ha:245,o:"m 792 190 b 765 176 780 179 772 176 b 740 190 755 176 747 183 b 629 325 727 202 644 312 b 593 347 616 338 605 347 b 562 334 583 346 575 344 b 528 298 549 323 539 310 l 406 176 b 389 168 406 176 399 168 b 374 176 384 168 379 170 b 245 325 360 192 245 325 b 200 353 232 343 219 351 b 168 340 190 353 181 350 l 17 156 b 0 121 10 147 0 132 b 16 107 0 114 4 108 b 84 143 26 107 76 137 b 118 160 92 150 108 160 b 141 143 125 160 131 154 b 265 10 147 135 253 24 b 294 0 271 3 282 0 b 321 7 305 0 315 3 b 498 160 321 7 478 158 b 521 143 505 160 513 154 b 647 10 528 135 635 24 b 675 0 652 3 664 0 b 703 7 687 0 697 3 b 874 186 713 16 855 164 b 893 220 881 196 893 212 b 873 245 890 235 883 243 b 796 194 847 245 815 213 z"},brassSmear:{x_min:1,x_max:306,y_min:0,y_max:170,ha:170,o:"m 193 79 b 308 0 219 50 264 0 b 439 117 396 0 438 102 b 439 120 439 118 439 118 l 441 125 b 441 128 441 127 441 127 b 433 141 441 135 439 141 b 416 130 429 141 423 137 b 343 94 390 107 370 94 b 269 153 315 94 294 121 l 265 158 b 144 245 239 190 180 245 b 6 134 62 245 10 143 b 1 114 3 125 1 118 b 7 107 1 108 4 107 b 36 122 13 107 22 112 b 92 151 55 137 65 151 b 183 89 125 151 161 112 b 189 84 184 88 187 86 z"},stringsDownBow:{x_min:0,x_max:312,y_min:0,y_max:318,ha:318,o:"m 37 458 b 0 420 17 458 0 441 l 0 17 b 17 0 0 7 9 0 l 37 0 b 55 17 46 0 55 7 l 55 253 b 225 278 55 269 140 278 b 395 253 310 278 395 269 l 395 17 b 413 0 395 7 403 0 l 432 0 b 449 17 441 0 449 7 l 449 420 b 412 458 449 441 432 458 z"},stringsUpBow:{x_min:1,x_max:249,y_min:1,y_max:495,ha:494,o:"m 181 1 b 206 22 193 1 203 10 l 359 683 l 359 688 b 338 713 359 700 351 710 l 333 713 b 308 694 321 713 311 706 l 180 140 l 53 694 b 27 713 49 706 39 713 l 22 713 b 1 690 10 710 1 700 b 3 683 1 687 1 685 l 154 22 b 181 1 157 10 167 1 z"},stringsHarmonic:{x_min:0,x_max:200,y_min:0,y_max:200,ha:200,o:"m 288 144 b 144 288 288 225 223 288 b 0 144 65 288 0 225 b 144 0 0 65 65 0 b 288 144 223 0 288 65 z m 144 249 b 249 144 203 249 249 203 b 144 39 249 86 203 39 b 39 144 86 39 39 86 b 144 249 39 203 86 249 z"},pluckedSnapPizzicatoAbove:{x_min:0,x_max:200,y_min:0,y_max:300,ha:300,o:"m 0 144 b 144 0 0 63 65 0 b 288 144 223 0 288 63 b 167 285 288 215 235 275 l 167 432 l 121 432 l 121 285 b 0 144 52 275 0 215 z m 121 246 l 121 144 l 167 144 l 167 246 b 249 144 213 236 249 193 b 144 39 249 85 202 39 b 39 144 85 39 39 85 b 121 246 39 193 73 236 z"},pluckedSnapPizzicatoBelow:{x_min:0,x_max:200,y_min:0,y_max:300,ha:300,o:"m 288 288 b 144 432 288 369 223 432 b 0 288 65 432 0 369 b 121 145 0 216 52 157 l 121 0 l 167 0 l 167 145 b 288 288 235 157 288 216 z m 167 186 l 167 288 l 121 288 l 121 186 b 39 288 75 196 39 238 b 144 393 39 347 86 393 b 249 288 203 393 249 347 b 167 186 249 238 215 196 z"},pluckedLeftHandPizzicato:{x_min:0,x_max:272,y_min:0,y_max:272,ha:272,o:"m 392 219 l 219 219 l 219 392 l 173 392 l 173 219 l 0 219 l 0 173 l 173 173 l 173 0 l 219 0 l 219 173 l 392 173 z"},keyboardPedalPed:{x_min:0,x_max:1019,y_min:-8,y_max:555,ha:563,o:"m 413 799 b 179 749 327 798 261 789 b 0 517 107 713 0 632 b 122 376 0 454 37 376 b 240 540 189 376 240 452 b 225 586 240 579 233 586 b 204 549 213 586 212 573 b 138 480 199 527 181 480 b 85 549 96 480 85 517 l 85 554 b 353 762 89 690 230 762 b 373 752 364 762 373 760 b 351 708 373 740 360 723 b 274 546 330 675 274 585 b 353 416 274 508 333 444 b 412 304 372 390 412 351 b 382 228 412 275 403 256 b 334 190 363 202 361 200 b 147 29 271 167 147 88 b 196 -12 147 4 171 -12 b 343 108 239 -12 279 33 l 363 132 b 387 150 370 141 376 150 b 543 -4 445 150 467 -4 b 631 42 567 -4 586 0 l 668 78 b 685 89 674 84 680 89 b 696 75 688 89 690 86 b 809 -9 717 29 753 -9 b 946 66 854 -9 894 13 b 988 107 971 92 981 107 b 1002 89 994 107 996 99 b 1152 -4 1030 36 1077 -4 b 1329 248 1238 -4 1329 82 b 792 717 1329 556 1047 665 b 766 720 785 719 775 720 b 747 703 752 720 747 711 b 780 680 747 693 756 685 b 1223 222 1028 621 1223 504 b 1152 39 1223 122 1205 39 b 1073 229 1104 39 1073 132 b 1132 423 1073 314 1086 377 b 1142 442 1140 432 1142 436 b 1126 458 1142 451 1136 458 b 1093 446 1119 458 1109 455 b 975 216 1022 408 975 337 l 975 190 b 943 121 975 160 972 150 b 852 69 899 76 877 69 b 776 148 816 69 786 117 b 773 163 775 154 773 158 b 786 177 773 167 776 170 l 801 187 b 937 366 867 235 937 284 b 844 454 937 422 900 454 b 665 217 711 454 665 331 b 671 153 665 197 667 176 l 671 147 b 662 134 671 143 670 140 b 605 111 639 118 625 111 b 521 160 572 111 546 135 b 451 203 497 184 474 197 b 426 212 435 207 426 206 b 436 230 426 216 429 220 b 510 389 464 269 510 340 b 429 521 510 435 480 462 b 369 629 387 570 369 599 b 402 720 369 648 384 691 b 462 763 425 759 446 763 b 611 624 540 763 611 704 b 564 575 611 592 590 575 b 501 602 540 575 520 582 b 474 622 492 611 487 622 b 459 603 465 622 459 615 b 603 471 459 570 510 471 b 711 588 670 471 711 524 b 422 799 711 742 554 799 z m 815 403 b 848 343 838 403 848 383 b 780 226 848 295 824 261 b 765 217 773 220 768 217 b 759 228 762 217 759 220 b 756 282 757 245 756 262 b 815 403 756 346 772 403 z m 1405 124 b 1344 62 1369 124 1344 98 b 1405 0 1344 26 1369 0 b 1467 62 1441 0 1467 26 b 1405 124 1467 98 1441 124 z"},keyboardPedalUp:{x_min:0,x_max:450,y_min:0,y_max:450,ha:450,o:"m 582 396 b 516 367 554 396 533 384 b 465 340 495 347 487 340 l 458 340 b 412 377 432 340 412 348 b 432 409 412 387 419 396 l 438 415 b 490 429 451 428 464 429 b 575 501 534 429 575 452 b 501 575 575 541 541 575 b 429 490 452 575 429 534 b 415 438 429 464 428 451 l 409 432 b 377 412 396 419 387 412 b 340 458 348 412 340 432 l 340 465 b 367 516 340 487 347 495 b 396 582 384 533 396 554 b 324 648 396 625 363 648 b 252 582 285 648 252 625 b 281 516 252 554 264 533 b 308 465 301 495 308 487 l 308 458 b 271 412 308 432 300 412 b 239 432 261 412 252 419 l 233 438 b 219 490 220 451 219 464 b 147 575 219 534 196 575 b 73 501 107 575 73 541 b 158 429 73 452 114 429 b 210 415 184 429 197 428 l 216 409 b 236 377 229 396 236 387 b 190 340 236 348 216 340 l 183 340 b 132 367 161 340 153 347 b 66 396 115 384 94 396 b 0 324 23 396 0 363 b 66 252 0 285 23 252 b 132 281 94 252 115 264 b 183 308 153 301 161 308 l 190 308 b 236 271 216 308 236 300 b 216 239 236 261 229 252 l 210 233 b 158 219 197 220 184 219 b 73 147 114 219 73 196 b 147 73 73 107 107 73 b 219 158 196 73 219 114 b 233 210 219 184 220 197 l 239 216 b 271 236 252 229 261 236 b 308 190 300 236 308 216 l 308 183 b 281 132 308 161 301 153 b 252 66 264 115 252 94 b 324 0 252 23 285 0 b 396 66 363 0 396 23 b 367 132 396 94 384 115 b 340 183 347 153 340 161 l 340 190 b 377 236 340 216 348 236 b 409 216 387 236 396 229 l 415 210 b 429 158 428 197 429 184 b 501 73 429 114 452 73 b 575 147 541 73 575 107 b 490 219 575 196 534 219 b 438 233 464 219 451 220 l 432 239 b 412 271 419 252 412 261 b 458 308 412 300 432 308 l 465 308 b 516 281 487 308 495 301 b 582 252 533 264 554 252 b 648 324 625 252 648 285 b 582 396 648 363 625 396 z m 324 271 b 271 324 291 271 271 291 b 324 377 271 357 291 377 b 377 324 357 377 377 357 b 324 271 377 291 357 271 z"},pictChokeCymbal:{x_min:1,x_max:152,y_min:2,y_max:251,ha:249,o:"m 104 361 b 1 271 42 361 1 321 b 82 190 1 222 35 190 b 122 160 118 190 122 160 b 125 144 124 154 125 150 b 102 88 125 124 115 105 b 37 32 78 56 40 35 b 26 17 32 29 26 26 l 27 16 b 37 3 29 6 33 3 b 181 102 85 3 158 66 b 219 239 210 147 219 197 l 219 249 b 104 361 219 317 170 361 z"},wiggleArpeggiatoUp:{x_min:-33,x_max:292,y_min:0,y_max:119,ha:119,o:"m 130 171 b -39 68 16 171 -14 91 b -48 53 -45 62 -48 58 b -29 42 -48 46 -39 42 b -10 46 -23 42 -16 43 b 56 63 12 56 29 63 b 248 0 121 63 135 0 b 419 127 361 0 410 104 b 420 132 420 130 420 131 b 412 140 420 137 416 140 b 386 130 403 140 392 134 b 334 107 367 117 353 107 b 318 108 330 107 324 107 b 240 138 289 112 265 128 b 130 171 209 153 168 171 z"},arrowheadBlackUp:{x_min:0,x_max:228,y_min:0,y_max:299,ha:299,o:"m 166 431 b 0 20 111 274 0 30 b 16 0 0 12 6 0 l 17 1 b 166 50 43 16 160 50 b 310 1 171 50 289 13 l 311 0 b 328 20 321 0 328 12 b 166 431 328 30 220 274 z"},arrowheadBlackDown:{x_min:0,x_max:228,y_min:0,y_max:299,ha:299,o:"m 166 0 b 328 410 220 157 328 400 b 311 431 328 419 321 431 l 310 429 b 166 380 289 418 171 380 b 17 429 160 380 43 415 l 16 431 b 0 410 6 431 0 419 b 166 0 0 400 111 157 z"},arpeggiatoUp:{x_min:1,x_max:229,y_min:7,y_max:1511,ha:1504,o:"m 219 1848 l 330 1848 l 164 2176 l 1 1848 l 121 1848 b 92 1778 115 1822 101 1800 l 89 1773 b 59 1668 75 1741 59 1702 b 96 1555 59 1614 76 1580 b 99 1551 98 1554 99 1551 l 102 1547 b 124 1496 115 1531 124 1515 b 122 1482 124 1492 124 1488 b 92 1404 118 1453 102 1428 b 59 1293 78 1372 59 1332 b 105 1172 59 1234 81 1198 b 124 1120 118 1155 124 1143 l 122 1113 b 122 1110 122 1113 122 1112 b 92 1032 118 1081 102 1057 b 59 922 78 1001 59 960 b 115 792 59 855 86 816 b 124 760 121 782 124 773 b 122 744 124 756 124 750 b 92 667 118 716 102 693 b 59 556 78 635 59 595 b 108 433 59 495 82 458 b 124 389 117 420 124 408 b 122 374 124 384 124 379 b 92 298 118 346 102 323 l 89 292 b 59 186 75 261 59 222 b 163 19 59 73 140 42 b 177 10 168 13 173 10 b 189 29 184 10 189 19 b 184 48 189 35 187 42 b 167 114 174 69 167 85 b 230 305 167 179 229 193 b 181 423 230 357 209 396 b 167 484 173 442 167 458 b 230 675 167 547 229 563 b 179 796 230 729 206 769 b 167 850 171 812 167 827 b 230 1040 167 913 229 929 b 183 1158 230 1092 209 1130 b 167 1220 173 1178 167 1194 b 230 1411 167 1284 229 1300 b 186 1526 230 1462 210 1499 b 167 1594 176 1529 167 1584 b 230 1786 167 1659 229 1673 b 219 1848 230 1809 226 1829 z"},arpeggiatoDown:{x_min:1,x_max:229,y_min:-4,y_max:1500,ha:1504,o:"m 219 323 b 230 384 226 341 230 361 b 167 576 229 497 167 511 b 186 644 167 586 176 641 b 230 759 210 671 230 708 b 167 950 229 870 167 886 b 183 1012 167 976 173 992 b 230 1130 209 1040 230 1079 b 167 1320 229 1241 167 1257 b 179 1374 167 1344 171 1358 b 230 1495 206 1401 230 1441 b 167 1686 229 1607 167 1623 b 181 1747 167 1712 173 1728 b 230 1865 209 1774 230 1813 b 167 2056 229 1977 167 1992 b 184 2123 167 2085 174 2101 b 189 2141 187 2128 189 2136 b 177 2160 189 2151 184 2160 b 163 2151 173 2160 168 2157 b 59 1984 140 2128 59 2097 b 89 1878 59 1948 75 1909 l 92 1872 b 122 1796 102 1848 118 1824 b 124 1781 124 1791 124 1786 b 108 1737 124 1763 117 1750 b 59 1614 82 1712 59 1675 b 92 1503 59 1575 78 1535 b 122 1426 102 1477 118 1454 b 124 1410 124 1420 124 1414 b 115 1378 124 1397 121 1388 b 59 1248 86 1354 59 1315 b 92 1138 59 1210 78 1169 b 122 1060 102 1113 118 1089 b 122 1057 122 1058 122 1058 l 124 1050 b 105 998 124 1027 118 1015 b 59 877 81 972 59 936 b 92 766 59 838 78 798 b 122 688 102 742 118 717 b 124 674 124 683 124 678 b 102 624 124 655 115 639 l 99 619 b 96 615 99 619 98 616 b 59 503 76 590 59 556 b 89 397 59 468 75 429 l 92 392 b 121 323 101 370 115 348 l 1 323 l 164 -6 l 330 323 z"},repeat1Bar:{x_min:0,x_max:532,y_min:-250,y_max:279,ha:529,o:"m 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z m 89 288 b 0 197 40 288 0 248 b 89 108 0 148 40 108 b 180 197 140 108 180 148 b 89 288 180 248 140 288 z m 675 -71 b 586 -161 626 -71 586 -111 b 675 -251 586 -210 626 -251 b 766 -161 726 -251 766 -210 b 675 -71 766 -111 726 -71 z"},repeat2Bars:{x_min:0,x_max:762,y_min:-250,y_max:279,ha:529,o:"m 1090 380 b 1097 395 1094 386 1097 390 b 1089 402 1097 399 1094 402 l 936 402 b 910 380 927 402 920 393 l 336 -340 b 331 -350 333 -343 331 -347 b 343 -360 331 -356 336 -360 l 485 -360 b 516 -340 498 -360 508 -348 z m 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z m 89 288 b 0 197 40 288 0 248 b 89 108 0 148 40 108 b 180 197 140 108 180 148 b 89 288 180 248 140 288 z m 1007 -71 b 917 -161 958 -71 917 -111 b 1007 -251 917 -210 958 -251 b 1097 -161 1057 -251 1097 -210 b 1007 -71 1097 -111 1057 -71 z"},repeat4Bars:{x_min:0,x_max:1232,y_min:-250,y_max:279,ha:529,o:"m 1767 380 b 1774 395 1771 386 1774 390 b 1765 402 1774 399 1771 402 l 1613 402 b 1587 380 1604 402 1597 393 l 1012 -340 b 1008 -350 1009 -343 1008 -347 b 1020 -360 1008 -356 1012 -360 l 1162 -360 b 1192 -340 1175 -360 1185 -348 z m 1436 380 b 1443 395 1440 386 1443 390 b 1434 402 1443 399 1440 402 l 1282 402 b 1256 380 1273 402 1266 393 l 681 -340 b 677 -350 678 -343 677 -347 b 688 -360 677 -356 681 -360 l 831 -360 b 861 -340 844 -360 854 -348 z m 1090 380 b 1097 395 1094 386 1097 390 b 1089 402 1097 399 1094 402 l 936 402 b 910 380 927 402 920 393 l 336 -340 b 331 -350 333 -343 331 -347 b 343 -360 331 -356 336 -360 l 485 -360 b 516 -340 498 -360 508 -348 z m 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z m 89 288 b 0 197 40 288 0 248 b 89 108 0 148 40 108 b 180 197 140 108 180 148 b 89 288 180 248 140 288 z m 1683 -71 b 1594 -161 1634 -71 1594 -111 b 1683 -251 1594 -210 1634 -251 b 1774 -161 1734 -251 1774 -210 b 1683 -71 1774 -111 1734 -71 z"},repeatBarSlash:{x_min:0,x_max:532,y_min:-250,y_max:279,ha:529,o:"m 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z"},csymDiminished:{x_min:0,x_max:473,y_min:0,y_max:473,ha:473,o:"m 341 681 b 0 341 153 681 0 530 b 341 0 0 153 153 0 b 681 341 530 0 681 153 b 341 681 681 530 530 681 z m 341 618 b 618 341 495 618 618 495 b 341 63 618 189 494 63 b 63 341 187 63 63 187 b 341 618 63 494 189 618 z"},csymHalfDiminished:{x_min:-16,x_max:488,y_min:-15,y_max:489,ha:504,o:"m 703 660 l 658 704 l 557 603 b 340 681 498 652 422 681 b -1 341 151 681 -1 530 b 78 124 -1 259 29 183 l -23 23 l 22 -22 l 122 79 b 340 0 181 30 258 0 b 680 341 528 0 680 153 b 602 559 680 423 651 500 z m 62 341 b 340 618 62 494 187 618 b 513 559 403 618 464 598 l 122 168 b 62 341 84 217 62 278 z m 616 341 b 340 63 616 189 492 63 b 167 124 276 63 216 85 l 557 514 b 616 341 596 465 616 405 z"},csymAugmented:{x_min:0,x_max:395,y_min:1,y_max:396,ha:395,o:"m 569 318 l 317 318 l 317 570 l 253 570 l 253 318 l 0 318 l 0 255 l 253 255 l 253 1 l 317 1 l 317 255 l 569 255 z"},csymMajorSeventh:{x_min:0,x_max:558,y_min:1,y_max:477,ha:476,o:"m 402 687 l 0 1 l 804 1 z m 402 562 l 693 65 l 111 65 z"},csymMinor:{x_min:0,x_max:325,y_min:216,y_max:260,ha:44,o:"m 468 374 l 0 374 l 0 311 l 468 311 z"},csymParensLeftTall:{x_min:1,x_max:185,y_min:0,y_max:997,ha:997,o:"m 266 48 b 261 65 266 55 264 62 b 92 719 157 212 92 400 b 262 1371 92 1037 154 1228 b 266 1394 266 1378 266 1394 l 266 1424 b 264 1436 266 1431 266 1436 b 259 1434 262 1436 259 1434 b 1 719 84 1261 1 1011 b 259 1 1 429 79 177 b 264 0 261 0 262 0 b 266 9 265 0 266 6 z"},csymParensRightTall:{x_min:-20,x_max:164,y_min:0,y_max:997,ha:997,o:"m -29 9 b -26 0 -29 6 -27 0 b -22 1 -24 0 -23 0 b 236 719 158 177 236 429 b -22 1434 236 1011 154 1261 b -26 1436 -22 1434 -24 1436 b -29 1424 -29 1436 -29 1431 l -29 1394 b -24 1371 -29 1394 -29 1378 b 145 719 84 1228 145 1037 b -23 65 145 400 81 212 b -29 48 -26 62 -29 55 z"},csymBracketLeftTall:{x_min:0,x_max:155,y_min:0,y_max:1e3,ha:1e3,o:"m 217 0 b 223 9 220 0 223 4 l 223 37 b 217 46 223 42 220 46 l 92 46 l 92 1394 l 217 1394 b 223 1403 220 1394 223 1398 l 223 1431 b 217 1440 223 1436 220 1440 l 6 1440 b 0 1436 3 1440 0 1439 l 0 4 b 6 0 0 1 3 0 z"},csymBracketRightTall:{x_min:1,x_max:156,y_min:0,y_max:1e3,ha:1e3,o:"m 219 0 b 225 4 222 0 225 1 l 225 1436 b 219 1440 225 1439 222 1440 l 7 1440 b 1 1431 4 1440 1 1436 l 1 1403 b 7 1394 1 1398 4 1394 l 132 1394 l 132 46 l 7 46 b 1 37 4 46 1 42 l 1 9 b 7 0 1 4 4 0 z"},csymParensLeftVeryTall:{x_min:0,x_max:122,y_min:0,y_max:993,ha:993,o:"m 176 32 b 171 49 176 39 174 46 b 60 716 104 194 60 399 b 173 1382 60 1032 101 1241 b 176 1405 176 1390 176 1405 l 176 1427 b 173 1430 176 1428 174 1430 b 0 716 40 1297 0 978 b 170 3 0 428 50 179 b 171 0 170 1 170 0 b 176 6 173 0 176 4 z"},csymParensRightVeryTall:{x_min:-15,x_max:107,y_min:0,y_max:993,ha:993,o:"m -22 6 b -17 0 -22 4 -19 0 b -16 3 -16 0 -16 1 b 154 716 104 179 154 428 b -19 1430 154 978 114 1297 b -22 1427 -20 1430 -22 1428 l -22 1405 b -19 1382 -22 1405 -22 1390 b 94 716 53 1241 94 1032 b -17 49 94 399 50 194 b -22 32 -20 46 -22 39 z"},csymDiagonalArrangementSlash:{x_min:0,x_max:999,y_min:0,y_max:1e3,ha:1e3,o:"m 1439 1380 l 1377 1440 l 0 60 l 62 0 z"},accSagittal5v7KleismaUp:{x_min:0,x_max:156,y_min:-359,y_max:172,ha:531,o:"m 0 -517 l 45 -517 l 45 -35 b 135 -112 68 -86 99 -112 b 225 68 194 -112 225 -53 l 180 68 b 144 -4 180 20 168 -4 b 122 0 138 -4 131 -3 b 23 248 86 14 52 96 l 0 248 z"},accSagittal5v7KleismaDown:{x_min:0,x_max:156,y_min:-172,y_max:359,ha:531,o:"m 0 -248 l 23 -248 b 122 0 52 -96 86 -14 b 144 4 131 3 138 4 b 180 -68 168 4 180 -20 l 225 -68 b 135 112 225 53 194 112 b 45 35 99 112 68 86 l 45 517 l 0 517 z"},accSagittal5CommaUp:{x_min:0,x_max:156,y_min:-359,y_max:172,ha:531,o:"m 225 -517 l 225 248 l 203 248 l 0 -112 l 0 -284 l 180 33 l 180 -517 z"},accSagittal5CommaDown:{x_min:0,x_max:156,y_min:-172,y_max:359,ha:531,o:"m 180 517 l 180 -33 l 0 284 l 0 112 l 203 -248 l 225 -248 l 225 517 z"},accSagittal7CommaUp:{x_min:0,x_max:156,y_min:-359,y_max:172,ha:531,o:"m 0 248 l 0 -517 l 45 -517 l 45 112 l 89 112 b 180 -68 150 112 180 53 l 180 -248 l 225 -248 l 225 68 b 135 248 225 187 194 248 z"},accSagittal7CommaDown:{x_min:0,x_max:156,y_min:-172,y_max:359,ha:531,o:"m 135 -248 b 225 -68 194 -248 225 -187 l 225 248 l 180 248 l 180 68 b 89 -112 180 -53 150 -112 l 45 -112 l 45 517 l 0 517 l 0 -248 z"},accSagittal25SmallDiesisUp:{x_min:0,x_max:250,y_min:-359,y_max:172,ha:531,o:"m 0 -157 l 0 -259 l 315 -89 l 315 -517 l 360 -517 l 360 248 l 337 248 l 0 68 l 0 -33 l 315 135 l 315 10 z"},accSagittal25SmallDiesisDown:{x_min:0,x_max:250,y_min:-172,y_max:359,ha:531,o:"m 315 -10 l 315 -135 l 0 33 l 0 -68 l 337 -248 l 360 -248 l 360 517 l 315 517 l 315 89 l 0 259 l 0 157 z"},accSagittal35MediumDiesisUp:{x_min:0,x_max:281,y_min:-359,y_max:172,ha:531,o:"m 0 -284 l 180 33 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -68 330 112 360 53 l 360 -248 l 405 -248 l 405 68 b 315 248 405 187 374 248 l 203 248 l 0 -112 z"},accSagittal35MediumDiesisDown:{x_min:0,x_max:281,y_min:-172,y_max:359,ha:531,o:"m 0 112 l 203 -248 l 315 -248 b 405 -68 374 -248 405 -187 l 405 248 l 360 248 l 360 68 b 271 -112 360 -53 330 -112 l 225 -112 l 225 517 l 180 517 l 180 -33 l 0 284 z"},accSagittal11MediumDiesisUp:{x_min:0,x_max:344,y_min:-359,y_max:172,ha:531,o:"m 225 53 l 225 -517 l 271 -517 l 271 53 l 495 -248 l 495 -89 l 248 248 l 0 -89 l 0 -248 z"},accSagittal11MediumDiesisDown:{x_min:0,x_max:344,y_min:-172,y_max:359,ha:531,o:"m 0 248 l 0 89 l 248 -248 l 495 89 l 495 248 l 271 -53 l 271 517 l 225 517 l 225 -53 z"},accSagittal11LargeDiesisUp:{x_min:0,x_max:344,y_min:-359,y_max:172,ha:531,o:"m 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 112 l 315 112 b 449 -68 405 112 449 53 l 449 -248 l 495 -248 l 495 68 b 360 248 495 187 449 248 l 135 248 b 0 68 45 248 0 187 z"},accSagittal11LargeDiesisDown:{x_min:0,x_max:344,y_min:-172,y_max:359,ha:531,o:"m 0 -68 b 135 -248 0 -187 45 -248 l 360 -248 b 495 -68 449 -248 495 -187 l 495 248 l 449 248 l 449 68 b 315 -112 449 -53 405 -112 l 271 -112 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z"},accSagittal35LargeDiesisUp:{x_min:0,x_max:375,y_min:-172,y_max:359,ha:531,o:"m 0 -68 b 135 -248 0 -187 45 -248 l 248 -248 l 540 112 l 540 274 l 271 -58 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z"},accSagittal35LargeDiesisDown:{x_min:0,x_max:375,y_min:-172,y_max:359,ha:531,o:"m 0 -68 b 135 -248 0 -187 45 -248 l 248 -248 l 540 112 l 540 274 l 269 -58 l 269 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z"},accSagittalSharp25SDown:{x_min:0,x_max:344,y_min:-359,y_max:172,ha:531,o:"m 0 68 b 112 -112 0 -53 36 -112 l 135 -112 l 135 -517 l 180 -517 l 180 -89 b 248 26 206 -65 229 -27 b 315 -89 264 -27 287 -65 l 315 -517 l 360 -517 l 360 -112 l 383 -112 b 495 68 458 -112 495 -53 l 449 68 b 399 -4 449 20 433 -4 b 248 248 297 -4 261 171 b 122 0 216 96 176 14 b 94 -4 112 -3 102 -4 b 45 68 60 -4 45 20 z"},accSagittalFlat25SUp:{x_min:0,x_max:344,y_min:-172,y_max:359,ha:531,o:"m 45 -68 b 94 4 45 -20 60 4 b 122 0 102 4 112 3 b 248 -248 176 -14 216 -96 b 399 4 261 -171 297 4 b 449 -68 433 4 449 -20 l 495 -68 b 383 112 495 53 458 112 l 360 112 l 360 517 l 315 517 l 315 89 b 248 -26 287 65 264 27 b 180 89 229 27 206 65 l 180 517 l 135 517 l 135 112 l 112 112 b 0 -68 36 112 0 53 z"},accSagittalSharp7CDown:{x_min:0,x_max:250,y_min:-359,y_max:172,ha:531,o:"m 0 -517 l 45 -517 l 45 112 l 89 112 b 180 104 124 112 154 109 l 180 -517 l 225 -517 l 225 89 b 315 -68 285 60 315 9 l 315 -248 l 360 -248 l 360 68 b 135 248 360 187 285 248 l 0 248 z"},accSagittalFlat7CUp:{x_min:0,x_max:250,y_min:-172,y_max:359,ha:531,o:"m 0 -248 l 135 -248 b 360 -68 285 -248 360 -187 l 360 248 l 315 248 l 315 68 b 225 -89 315 -9 285 -60 l 225 517 l 180 517 l 180 -104 b 89 -112 154 -109 124 -112 l 45 -112 l 45 517 l 0 517 z"},accSagittalSharp5CDown:{x_min:0,x_max:281,y_min:-359,y_max:172,ha:531,o:"m 45 -517 l 45 71 l 180 -56 l 180 -517 l 225 -517 l 225 -98 l 405 -268 l 405 -112 l 23 248 l 0 248 l 0 -517 z"},accSagittalFlat5CUp:{x_min:0,x_max:281,y_min:-172,y_max:359,ha:531,o:"m 0 517 l 0 -248 l 23 -248 l 405 112 l 405 268 l 225 98 l 225 517 l 180 517 l 180 56 l 45 -71 l 45 517 z"},accSagittalSharp5v7kDown:{x_min:0,x_max:344,y_min:-359,y_max:172,ha:531,o:"m 0 -112 l 0 -276 l 135 -82 l 135 -517 l 180 -517 l 180 -17 l 271 112 l 315 112 l 315 -517 l 360 -517 l 360 107 b 449 -68 420 89 449 30 l 449 -248 l 495 -248 l 495 68 b 360 248 495 189 449 248 l 248 248 z"},accSagittalFlat5v7kUp:{x_min:0,x_max:344,y_min:-172,y_max:359,ha:531,o:"m 248 -248 l 360 -248 b 495 -68 449 -248 495 -189 l 495 248 l 449 248 l 449 68 b 360 -107 449 -30 420 -89 l 360 517 l 315 517 l 315 -112 l 271 -112 l 180 17 l 180 517 l 135 517 l 135 82 l 0 276 l 0 112 z"},accSagittalSharp:{x_min:0,x_max:406,y_min:-359,y_max:172,ha:531,o:"m 180 -53 l 180 -517 l 225 -517 l 225 0 l 292 85 l 360 0 l 360 -517 l 405 -517 l 405 -53 l 585 -274 l 585 -112 l 292 248 l 0 -112 l 0 -274 z"},accSagittalFlat:{x_min:0,x_max:406,y_min:-172,y_max:359,ha:531,o:"m 0 274 l 0 112 l 292 -248 l 585 112 l 585 274 l 405 53 l 405 517 l 360 517 l 360 0 l 292 -85 l 225 0 l 225 517 l 180 517 l 180 53 z"},accSagittalSharp5v7kUp:{x_min:0,x_max:312,y_min:-361,y_max:172,ha:533,o:"m 45 -517 l 45 -10 b 135 -92 68 -48 98 -75 l 135 -520 l 180 -520 l 180 -108 b 248 -115 203 -112 225 -115 b 271 -112 256 -115 264 -115 l 271 -517 l 315 -517 l 315 -107 b 449 68 405 -89 449 -30 l 405 68 b 297 -4 405 19 369 -4 b 23 248 131 -4 56 85 l 0 248 l 0 -517 z"},accSagittalFlat5v7kDown:{x_min:0,x_max:312,y_min:-172,y_max:361,ha:533,o:"m 0 517 l 0 -248 l 23 -248 b 297 4 56 -85 131 4 b 405 -68 369 4 405 -19 l 449 -68 b 315 107 449 30 405 89 l 315 517 l 271 517 l 271 112 b 248 115 264 115 256 115 b 180 108 225 115 203 112 l 180 520 l 135 520 l 135 92 b 45 10 98 75 68 48 l 45 517 z"},accSagittalSharp5CUp:{x_min:0,x_max:312,y_min:-359,y_max:172,ha:531,o:"m 0 -266 l 135 -153 l 135 -517 l 180 -517 l 180 -115 l 271 -39 l 271 -517 l 315 -517 l 315 0 l 405 75 l 405 -517 l 449 -517 l 449 248 l 428 248 l 0 -112 z"},accSagittalFlat5CDown:{x_min:0,x_max:312,y_min:-172,y_max:359,ha:531,o:"m 0 112 l 428 -248 l 449 -248 l 449 517 l 405 517 l 405 -75 l 315 0 l 315 517 l 271 517 l 271 39 l 180 115 l 180 517 l 135 517 l 135 153 l 0 266 z"},accSagittalSharp7CUp:{x_min:0,x_max:312,y_min:-359,y_max:172,ha:531,o:"m 0 -517 l 45 -517 l 45 112 l 135 112 l 135 -517 l 180 -517 l 180 108 b 271 89 213 105 243 99 l 271 -517 l 315 -517 l 315 73 b 405 -68 374 45 405 -3 l 405 -248 l 449 -248 l 449 68 b 135 248 449 187 346 248 l 0 248 z"},accSagittalFlat7CDown:{x_min:0,x_max:312,y_min:-172,y_max:359,ha:531,o:"m 0 -248 l 135 -248 b 449 -68 346 -248 449 -187 l 449 248 l 405 248 l 405 68 b 315 -73 405 3 374 -45 l 315 517 l 271 517 l 271 -89 b 180 -108 243 -99 213 -105 l 180 517 l 135 517 l 135 -112 l 45 -112 l 45 517 l 0 517 z"},accSagittalSharp25SUp:{x_min:0,x_max:375,y_min:-359,y_max:172,ha:531,o:"m 0 -30 l 495 143 l 495 14 l 0 -157 l 0 -255 l 225 -177 l 225 -517 l 271 -517 l 271 -161 l 360 -130 l 360 -517 l 405 -517 l 405 -115 l 495 -84 l 495 -517 l 540 -517 l 540 248 l 517 248 l 0 68 z"},accSagittalFlat25SDown:{x_min:0,x_max:375,y_min:-172,y_max:359,ha:531,o:"m 0 -68 l 517 -248 l 540 -248 l 540 517 l 495 517 l 495 84 l 405 115 l 405 517 l 360 517 l 360 130 l 271 161 l 271 517 l 225 517 l 225 177 l 0 255 l 0 157 l 495 -14 l 495 -143 l 0 30 z"},accSagittalSharp35MUp:{x_min:0,x_max:406,y_min:-359,y_max:172,ha:531,o:"m 0 -112 l 0 -274 l 135 -108 l 135 -517 l 180 -517 l 180 -53 l 271 58 l 271 -517 l 315 -517 l 315 112 l 360 112 b 405 109 376 112 390 112 l 405 -517 l 449 -517 l 449 96 b 540 -68 510 72 540 17 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 z"},accSagittalFlat35MDown:{x_min:0,x_max:406,y_min:-172,y_max:359,ha:531,o:"m 292 -248 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 449 -96 540 -17 510 -72 l 449 517 l 405 517 l 405 -109 b 360 -112 390 -112 376 -112 l 315 -112 l 315 517 l 271 517 l 271 -58 l 180 53 l 180 517 l 135 517 l 135 108 l 0 274 l 0 112 z"},accSagittalSharp11MUp:{x_min:0,x_max:469,y_min:-359,y_max:172,ha:531,o:"m 0 -112 l 0 -271 l 180 -79 l 180 -517 l 225 -517 l 225 -30 l 315 65 l 315 -517 l 360 -517 l 360 65 l 449 -30 l 449 -517 l 495 -517 l 495 -79 l 675 -271 l 675 -112 l 337 248 z"},accSagittalFlat11MDown:{x_min:0,x_max:469,y_min:-172,y_max:359,ha:531,o:"m 337 -248 l 675 112 l 675 271 l 495 79 l 495 517 l 449 517 l 449 30 l 360 -65 l 360 517 l 315 517 l 315 -65 l 225 30 l 225 517 l 180 517 l 180 79 l 0 271 l 0 112 z"},accSagittalSharp11LUp:{x_min:0,x_max:469,y_min:-359,y_max:172,ha:531,o:"m 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 112 l 449 112 l 449 -517 l 495 -517 l 495 104 b 631 -68 585 82 631 26 l 631 -248 l 675 -248 l 675 68 b 449 248 675 187 600 248 l 225 248 b 0 68 75 248 0 187 z"},accSagittalFlat11LDown:{x_min:0,x_max:469,y_min:-172,y_max:359,ha:531,o:"m 0 -68 b 225 -248 0 -187 75 -248 l 449 -248 b 675 -68 600 -248 675 -187 l 675 248 l 631 248 l 631 68 b 495 -104 631 -26 585 -82 l 495 517 l 449 517 l 449 -112 l 360 -112 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z"},accSagittalSharp35LUp:{x_min:0,x_max:500,y_min:-359,y_max:172,ha:531,o:"m 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 71 l 452 -17 l 452 -517 l 495 -517 l 495 -56 l 720 -268 l 720 -112 l 337 248 l 225 248 b 0 68 75 248 0 187 z"},accSagittalFlat35LDown:{x_min:0,x_max:500,y_min:-172,y_max:359,ha:531,o:"m 0 -68 b 225 -248 0 -187 75 -248 l 337 -248 l 720 112 l 720 268 l 495 56 l 495 517 l 452 517 l 452 17 l 360 -71 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z"},accSagittalDoubleSharp25SDown:{x_min:0,x_max:406,y_min:-359,y_max:172,ha:531,o:"m 0 68 b 135 -112 0 -53 45 -112 b 243 -62 180 -112 215 -95 l 89 -503 l 143 -517 l 292 -82 l 445 -517 l 495 -503 l 343 -62 b 449 -112 372 -95 408 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 315 148 b 112 -4 274 148 236 -4 b 45 68 68 -4 45 20 z"},accSagittalDoubleFlat25SUp:{x_min:0,x_max:406,y_min:-172,y_max:359,ha:531,o:"m 45 -68 b 112 4 45 -20 68 4 b 292 -248 236 4 274 -148 b 475 4 315 -148 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 b 343 62 408 112 372 95 l 495 503 l 445 517 l 292 82 l 143 517 l 89 503 l 243 62 b 135 112 215 95 180 112 b 0 -68 45 112 0 53 z"},accSagittalDoubleSharp7CDown:{x_min:0,x_max:375,y_min:-359,y_max:172,ha:531,o:"m 0 -503 l 52 -517 l 203 -82 l 354 -517 l 405 -503 l 230 0 l 271 108 b 495 -68 420 92 495 35 l 495 -248 l 540 -248 l 540 68 b 225 248 540 187 435 248 l 89 248 l 89 112 l 135 112 l 174 0 z m 213 112 l 203 82 l 192 112 z"},accSagittalDoubleFlat7CUp:{x_min:0,x_max:375,y_min:-172,y_max:359,ha:531,o:"m 174 0 l 135 -112 l 89 -112 l 89 -248 l 225 -248 b 540 -68 435 -248 540 -187 l 540 248 l 495 248 l 495 68 b 271 -108 495 -35 420 -92 l 230 0 l 405 503 l 354 517 l 203 82 l 52 517 l 0 503 z m 192 -112 l 203 -82 l 213 -112 z"},accSagittalDoubleSharp5CDown:{x_min:0,x_max:406,y_min:-359,y_max:172,ha:531,o:"m 405 -503 l 230 0 l 232 4 l 585 -264 l 585 -112 l 112 248 l 89 248 l 89 112 l 151 68 l 174 0 l 0 -503 l 52 -517 l 203 -82 l 354 -517 z"},accSagittalDoubleFlat5CUp:{x_min:0,x_max:406,y_min:-172,y_max:359,ha:531,o:"m 354 517 l 203 82 l 52 517 l 0 503 l 174 0 l 151 -68 l 89 -112 l 89 -248 l 112 -248 l 585 112 l 585 264 l 232 -4 l 230 0 l 405 503 z"},accSagittalDoubleSharp5v7kDown:{x_min:0,x_max:406,y_min:-359,y_max:172,ha:531,o:"m 0 -274 l 252 35 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 360 112 b 540 -68 480 112 540 53 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 l 0 -112 z"},accSagittalDoubleFlat5v7kUp:{x_min:0,x_max:406,y_min:-172,y_max:359,ha:531,o:"m 0 112 l 292 -248 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 360 -112 540 -53 480 -112 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 252 -35 l 0 274 z"},accSagittalDoubleSharp:{x_min:0,x_max:469,y_min:-359,y_max:172,ha:531,o:"m 540 -503 l 366 0 l 380 45 l 675 -271 l 675 -112 l 337 248 l 0 -112 l 0 -271 l 295 45 l 310 0 l 135 -503 l 186 -517 l 337 -82 l 488 -517 z"},accSagittalDoubleFlat:{x_min:0,x_max:469,y_min:-172,y_max:359,ha:531,o:"m 488 517 l 337 82 l 186 517 l 135 503 l 310 0 l 295 -45 l 0 271 l 0 112 l 337 -248 l 675 112 l 675 271 l 380 -45 l 366 0 l 540 503 z"},accSagittal7v11KleismaUp:{x_min:0,x_max:219,y_min:-359,y_max:172,ha:531,o:"m 68 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 -45 b 248 -112 200 -89 225 -112 b 315 68 292 -112 315 -53 l 271 68 b 248 -4 271 20 264 -4 b 236 0 245 -4 240 -3 b 157 248 213 14 187 96 b 78 0 127 96 101 14 b 65 -4 73 -3 68 -4 b 45 68 50 -4 45 20 l 0 68 b 68 -112 0 -53 23 -112 z"},accSagittal7v11KleismaDown:{x_min:0,x_max:219,y_min:-172,y_max:359,ha:531,o:"m 68 112 b 0 -68 23 112 0 53 l 45 -68 b 65 4 45 -20 50 4 b 78 0 68 4 73 3 b 157 -248 101 -14 127 -96 b 236 0 187 -96 213 -14 b 248 4 240 3 245 4 b 271 -68 264 4 271 -20 l 315 -68 b 248 112 315 53 292 112 b 180 45 225 112 200 89 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 z"},accSagittal17CommaUp:{x_min:0,x_max:281,y_min:-359,y_max:172,ha:531,o:"m 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 -40 b 315 -118 248 -92 279 -118 b 405 62 374 -118 405 -59 l 360 62 b 324 -10 360 14 348 -10 b 302 -6 318 -10 311 -9 b 206 217 268 9 235 84 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z"},accSagittal17CommaDown:{x_min:0,x_max:281,y_min:-172,y_max:359,ha:531,o:"m 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 206 -217 b 302 6 235 -84 268 -9 b 324 10 311 9 318 10 b 360 -62 348 10 360 -14 l 405 -62 b 315 118 405 59 374 118 b 225 40 279 118 248 92 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z"},accSagittal55CommaUp:{x_min:0,x_max:219,y_min:-359,y_max:172,ha:531,o:"m 0 248 l 0 -517 l 45 -517 l 45 58 l 315 -274 l 315 -112 l 23 248 z"},accSagittal55CommaDown:{x_min:0,x_max:219,y_min:-172,y_max:359,ha:531,o:"m 23 -248 l 315 112 l 315 274 l 45 -58 l 45 517 l 0 517 l 0 -248 z"},accSagittal7v11CommaUp:{x_min:0,x_max:188,y_min:-359,y_max:172,ha:531,o:"m 0 -248 l 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 248 l 135 248 b 0 68 45 248 0 187 z"},accSagittal7v11CommaDown:{x_min:0,x_max:188,y_min:-172,y_max:359,ha:531,o:"m 0 -68 b 135 -248 0 -187 45 -248 l 271 -248 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z"},accSagittal5v11SmallDiesisUp:{x_min:0,x_max:312,y_min:-359,y_max:172,ha:531,o:"m 0 73 l 0 -248 l 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 -40 b 360 -118 295 -92 325 -118 b 449 62 420 -118 449 -59 l 405 62 b 369 -10 405 14 393 -10 b 348 -6 363 -10 356 -9 b 251 217 312 9 279 84 l 248 248 l 135 248 b 0 73 45 248 0 189 z"},accSagittal5v11SmallDiesisDown:{x_min:0,x_max:312,y_min:-172,y_max:359,ha:531,o:"m 0 -73 b 135 -248 0 -189 45 -248 l 248 -248 l 251 -217 b 348 6 279 -84 312 -9 b 369 10 356 9 363 10 b 405 -62 393 10 405 -14 l 449 -62 b 360 118 449 59 420 118 b 271 40 325 118 295 92 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z"},accSagittalSharp5v11SDown:{x_min:0,x_max:344,y_min:-359,y_max:172,ha:531,o:"m 45 -203 b 112 -23 45 -84 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 b 242 37 203 -23 225 -3 b 315 -89 262 -23 285 -63 l 315 -517 l 360 -517 l 360 -112 l 383 -112 b 495 68 458 -112 495 -53 l 449 68 b 399 -4 449 20 433 -4 b 248 248 297 -4 261 171 b 157 68 222 127 192 68 l 89 68 b 0 -203 30 68 0 -23 z"},accSagittalFlat5v11SUp:{x_min:0,x_max:344,y_min:-172,y_max:359,ha:531,o:"m 0 203 b 89 -68 0 23 30 -68 l 157 -68 b 248 -248 192 -68 222 -127 b 399 4 261 -171 297 4 b 449 -68 433 4 449 -20 l 495 -68 b 383 112 495 53 458 112 l 360 112 l 360 517 l 315 517 l 315 89 b 242 -37 285 63 262 23 b 180 23 225 3 203 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 84 z"},accSagittalSharp7v11CDown:{x_min:0,x_max:344,y_min:-359,y_max:172,ha:531,o:"m 89 -112 l 89 -517 l 135 -517 l 135 -95 b 206 37 163 -73 187 -30 b 271 -23 225 -3 248 -23 l 271 -517 l 315 -517 l 315 -23 l 383 -23 b 449 -203 428 -23 449 -84 l 495 -203 b 405 68 495 -23 465 68 l 292 68 b 203 248 258 68 228 127 b 101 0 173 98 138 16 b 81 -3 94 0 86 -3 b 45 68 56 -3 45 20 l 0 68 b 89 -112 0 -52 30 -112 z"},accSagittalFlat7v11CUp:{x_min:0,x_max:344,y_min:-172,y_max:359,ha:531,o:"m 89 112 b 0 -68 30 112 0 52 l 45 -68 b 81 3 45 -20 56 3 b 101 0 86 3 94 0 b 203 -248 138 -16 173 -98 b 292 -68 228 -127 258 -68 l 405 -68 b 495 203 465 -68 495 23 l 449 203 b 383 23 449 84 428 23 l 315 23 l 315 517 l 271 517 l 271 23 b 206 -37 248 23 225 3 b 135 95 187 30 163 73 l 135 517 l 89 517 z"},accSagittalSharp55CDown:{x_min:0,x_max:250,y_min:-359,y_max:172,ha:531,o:"m 0 -271 l 135 -125 l 135 -517 l 180 -517 l 180 -78 l 315 65 l 315 -517 l 360 -517 l 360 248 l 337 248 l 0 -112 z"},accSagittalFlat55CUp:{x_min:0,x_max:250,y_min:-172,y_max:359,ha:531,o:"m 0 112 l 337 -248 l 360 -248 l 360 517 l 315 517 l 315 -65 l 180 78 l 180 517 l 135 517 l 135 125 l 0 271 z"},accSagittalSharp17CDown:{x_min:0,x_max:375,y_min:-359,y_max:172,ha:531,o:"m 45 -248 l 45 -68 b 180 109 45 36 89 95 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -89 292 13 321 -55 l 360 -517 l 405 -517 l 405 -112 l 428 -112 b 540 68 504 -112 540 -53 l 495 68 b 445 -4 495 20 480 -4 b 292 248 343 -4 307 171 l 180 248 b 0 68 60 248 0 187 l 0 -248 z"},accSagittalFlat17CUp:{x_min:0,x_max:375,y_min:-172,y_max:359,ha:531,o:"m 0 248 l 0 -68 b 180 -248 0 -187 60 -248 l 292 -248 b 445 4 307 -171 343 4 b 495 -68 480 4 495 -20 l 540 -68 b 428 112 540 53 504 112 l 405 112 l 405 517 l 360 517 l 360 89 b 271 -112 321 55 292 -13 l 225 -112 l 225 517 l 180 517 l 180 -109 b 45 68 89 -95 45 -36 l 45 248 z"},accSagittalSharp7v11kDown:{x_min:0,x_max:312,y_min:-359,y_max:172,ha:531,o:"m 0 -32 l 405 138 l 405 13 l 0 -157 l 0 -256 l 225 -161 l 225 -517 l 271 -517 l 271 -144 l 405 -86 l 405 -517 l 449 -517 l 449 248 l 428 248 l 0 68 z"},accSagittalFlat7v11kUp:{x_min:0,x_max:312,y_min:-172,y_max:359,ha:531,o:"m 0 -68 l 428 -248 l 449 -248 l 449 517 l 405 517 l 405 86 l 271 144 l 271 517 l 225 517 l 225 161 l 0 256 l 0 157 l 405 -13 l 405 -138 l 0 32 z"},accSagittalSharp7v11kUp:{x_min:0,x_max:406,y_min:-359,y_max:172,ha:531,o:"m 135 -112 l 135 -517 l 180 -517 l 180 -105 b 271 -23 217 -94 248 -65 l 271 -517 l 315 -517 l 315 -23 b 405 -105 337 -65 369 -94 l 405 -517 l 449 -517 l 449 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 315 148 b 112 -4 274 148 236 -4 b 45 68 68 -4 45 20 l 0 68 b 135 -112 0 -53 45 -112 z"},accSagittalFlat7v11kDown:{x_min:0,x_max:406,y_min:-172,y_max:359,ha:531,o:"m 135 112 b 0 -68 45 112 0 53 l 45 -68 b 112 4 45 -20 68 4 b 292 -248 236 4 274 -148 b 475 4 315 -148 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 l 449 517 l 405 517 l 405 105 b 315 23 369 94 337 65 l 315 517 l 271 517 l 271 23 b 180 105 248 65 217 94 l 180 517 l 135 517 z"},accSagittalSharp17CUp:{x_min:0,x_max:406,y_min:-359,y_max:172,ha:531,o:"m 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 203 -23 b 271 14 229 -23 251 -10 l 271 -517 l 315 -517 l 315 -23 b 405 -105 337 -65 369 -94 l 405 -517 l 449 -517 l 449 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 312 150 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z"},accSagittalFlat17CDown:{x_min:0,x_max:406,y_min:-172,y_max:359,ha:531,o:"m 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 b 475 4 312 -150 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 l 449 517 l 405 517 l 405 105 b 315 23 369 94 337 65 l 315 517 l 271 517 l 271 -14 b 203 23 251 10 229 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z"},accSagittalSharp55CUp:{x_min:0,x_max:344,y_min:-359,y_max:172,ha:531,o:"m 45 -517 l 45 78 l 135 10 l 135 -517 l 180 -517 l 180 -23 l 271 -92 l 271 -517 l 315 -517 l 315 -127 l 495 -264 l 495 -112 l 23 248 l 0 248 l 0 -517 z"},accSagittalFlat55CDown:{x_min:0,x_max:344,y_min:-172,y_max:359,ha:531,o:"m 0 517 l 0 -248 l 23 -248 l 495 112 l 495 264 l 315 127 l 315 517 l 271 517 l 271 92 l 180 23 l 180 517 l 135 517 l 135 -10 l 45 -78 l 45 517 z"},accSagittalSharp7v11CUp:{x_min:0,x_max:344,y_min:-359,y_max:172,ha:531,o:"m 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 86 45 6 89 58 l 180 -517 l 225 -517 l 225 98 b 315 109 252 104 282 108 l 315 -517 l 360 -517 l 360 112 l 449 112 l 449 -517 l 495 -517 l 495 248 l 360 248 b 0 68 121 248 0 189 z"},accSagittalFlat7v11CDown:{x_min:0,x_max:344,y_min:-172,y_max:359,ha:531,o:"m 0 -68 b 360 -248 0 -189 121 -248 l 495 -248 l 495 517 l 449 517 l 449 -112 l 360 -112 l 360 517 l 315 517 l 315 -109 b 225 -98 282 -108 252 -104 l 225 517 l 180 517 l 180 -86 b 45 68 89 -58 45 -6 l 45 248 l 0 248 z"},accSagittalSharp5v11SUp:{x_min:0,x_max:438,y_min:-359,y_max:172,ha:531,o:"m 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 -23 b 449 -105 383 -65 415 -94 l 449 -517 l 495 -517 l 495 -112 b 631 68 585 -112 631 -53 l 585 68 b 520 -4 585 20 563 -4 b 337 248 396 -4 360 150 l 225 248 b 0 68 76 248 0 187 z"},accSagittalFlat5v11SDown:{x_min:0,x_max:438,y_min:-172,y_max:359,ha:531,o:"m 0 -68 b 225 -248 0 -187 76 -248 l 337 -248 b 520 4 360 -150 396 4 b 585 -68 563 4 585 -20 l 631 -68 b 495 112 631 53 585 112 l 495 517 l 449 517 l 449 105 b 360 23 415 94 383 65 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z"},accSagittalDoubleSharp5v11SDown:{x_min:0,x_max:406,y_min:-359,y_max:172,ha:531,o:"m 45 -203 b 135 -23 45 -84 75 -23 l 203 -23 b 262 4 225 -23 245 -13 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 341 -60 b 449 -112 370 -95 405 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 312 150 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z"},accSagittalDoubleFlat5v11SUp:{x_min:0,x_max:406,y_min:-172,y_max:359,ha:531,o:"m 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 b 475 4 312 -150 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 b 341 60 405 112 370 95 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 262 -4 b 203 23 245 13 225 23 l 135 23 b 45 203 75 23 45 84 z"},accSagittalDoubleSharp7v11CDown:{x_min:0,x_max:375,y_min:-359,y_max:172,ha:531,o:"m 112 -112 b 193 -73 143 -112 170 -99 l 45 -501 l 95 -517 l 248 -81 l 397 -517 l 449 -503 l 275 0 l 278 4 b 337 -23 295 -13 315 -23 l 405 -23 b 495 -203 465 -23 495 -84 l 540 -203 b 428 68 540 -23 503 68 l 360 68 b 248 248 310 68 271 127 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 112 -112 0 -52 36 -112 z"},accSagittalDoubleFlat7v11CUp:{x_min:0,x_max:375,y_min:-172,y_max:359,ha:531,o:"m 112 112 b 0 -68 36 112 0 52 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 b 360 -68 271 -127 310 -68 l 428 -68 b 540 203 503 -68 540 23 l 495 203 b 405 23 495 84 465 23 l 337 23 b 278 -4 315 23 295 13 l 275 0 l 449 503 l 397 517 l 248 81 l 95 517 l 45 501 l 193 73 b 112 112 170 99 143 112 z"},accSagittalDoubleSharp55CDown:{x_min:0,x_max:375,y_min:-359,y_max:172,ha:531,o:"m 428 248 l 0 -112 l 0 -266 l 307 -7 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 366 0 l 386 59 l 449 112 l 449 248 z"},accSagittalDoubleFlat55CUp:{x_min:0,x_max:375,y_min:-172,y_max:359,ha:531,o:"m 449 -248 l 449 -112 l 386 -59 l 366 0 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 307 7 l 0 266 l 0 112 l 428 -248 z"},accSagittalDoubleSharp17CDown:{x_min:0,x_max:438,y_min:-359,y_max:172,ha:531,o:"m 45 -248 l 45 -68 b 271 112 45 53 120 112 l 310 0 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 387 -62 b 495 -112 416 -95 452 -112 b 631 68 585 -112 631 -53 l 585 68 b 520 -4 585 20 563 -4 b 337 248 396 -4 360 150 l 225 248 b 0 68 76 248 0 187 l 0 -248 z"},accSagittalDoubleFlat17CUp:{x_min:0,x_max:438,y_min:-172,y_max:359,ha:531,o:"m 0 248 l 0 -68 b 225 -248 0 -187 76 -248 l 337 -248 b 520 4 360 -150 396 4 b 585 -68 563 4 585 -20 l 631 -68 b 495 112 631 53 585 112 b 387 62 452 112 416 95 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 310 0 l 271 -112 b 45 68 120 -112 45 -53 l 45 248 z"},accSagittalDoubleSharp7v11kDown:{x_min:0,x_max:438,y_min:-359,y_max:172,ha:531,o:"m 0 68 l 0 -30 l 366 96 l 399 0 l 392 -23 l 0 -157 l 0 -255 l 353 -135 l 225 -503 l 276 -517 l 428 -82 l 579 -517 l 631 -503 l 455 0 l 507 145 l 540 157 l 540 248 l 517 248 z m 416 115 l 442 124 l 428 82 z"},accSagittalDoubleFlat7v11kUp:{x_min:0,x_max:438,y_min:-172,y_max:359,ha:531,o:"m 517 -248 l 540 -248 l 540 -157 l 507 -145 l 455 0 l 631 503 l 579 517 l 428 82 l 276 517 l 225 503 l 353 135 l 0 255 l 0 157 l 392 23 l 399 0 l 366 -96 l 0 30 l 0 -68 z m 428 -82 l 442 -124 l 416 -115 z"},accSagittal23CommaUp:{x_min:0,x_max:188,y_min:-359,y_max:172,ha:531,o:"m 0 -517 l 45 -517 l 45 -4 b 68 -23 53 -17 60 -23 l 180 -23 b 225 -203 210 -23 225 -82 l 271 -203 b 206 68 271 -23 248 68 l 89 68 b 23 248 71 68 48 127 l 0 248 z"},accSagittal23CommaDown:{x_min:0,x_max:188,y_min:-172,y_max:359,ha:531,o:"m 0 -248 l 23 -248 b 89 -68 48 -127 71 -68 l 206 -68 b 271 203 248 -68 271 23 l 225 203 b 180 23 225 82 210 23 l 68 23 b 45 4 60 23 53 17 l 45 517 l 0 517 z"},accSagittal5v19CommaUp:{x_min:0,x_max:156,y_min:-359,y_max:172,ha:531,o:"m 0 -284 l 180 33 l 180 -517 l 225 -517 l 225 248 l 203 248 b 86 112 151 157 112 112 b 45 157 59 112 45 127 l 0 157 b 76 23 0 72 26 27 l 0 -112 z"},accSagittal5v19CommaDown:{x_min:0,x_max:156,y_min:-172,y_max:359,ha:531,o:"m 0 112 l 76 -23 b 0 -157 26 -27 0 -72 l 45 -157 b 86 -112 45 -127 59 -112 b 203 -248 112 -112 151 -157 l 225 -248 l 225 517 l 180 517 l 180 -33 l 0 284 z"},accSagittal5v23SmallDiesisUp:{x_min:0,x_max:312,y_min:-359,y_max:172,ha:531,o:"m 0 -284 l 180 33 l 180 -517 l 225 -517 l 225 -4 b 248 -23 233 -17 240 -23 l 360 -23 b 405 -203 390 -23 405 -82 l 449 -203 b 386 68 449 -23 428 68 l 271 68 b 203 248 251 68 228 127 l 0 -112 z"},accSagittal5v23SmallDiesisDown:{x_min:0,x_max:312,y_min:-172,y_max:359,ha:531,o:"m 0 112 l 203 -248 b 271 -68 228 -127 251 -68 l 386 -68 b 449 203 428 -68 449 23 l 405 203 b 360 23 405 82 390 23 l 248 23 b 225 4 240 23 233 17 l 225 517 l 180 517 l 180 -33 l 0 284 z"},accSagittalSharp5v23SDown:{x_min:0,x_max:281,y_min:-359,y_max:172,ha:531,o:"m 0 -517 l 45 -517 l 45 6 b 89 -23 59 -13 73 -23 l 180 -23 l 180 -517 l 225 -517 l 225 -23 l 292 -23 b 360 -203 337 -23 360 -84 l 405 -203 b 315 68 405 -23 374 68 l 112 68 b 23 248 78 68 48 127 l 0 248 z"},accSagittalFlat5v23SUp:{x_min:0,x_max:281,y_min:-172,y_max:359,ha:531,o:"m 0 -248 l 23 -248 b 112 -68 48 -127 78 -68 l 315 -68 b 405 203 374 -68 405 23 l 360 203 b 292 23 360 84 337 23 l 225 23 l 225 517 l 180 517 l 180 23 l 89 23 b 45 -6 73 23 59 13 l 45 517 l 0 517 z"},accSagittalSharp5v19CDown:{x_min:0,x_max:312,y_min:-359,y_max:172,ha:531,o:"m 0 68 b 89 -112 0 -52 30 -112 l 89 -517 l 135 -517 l 135 -95 b 225 112 173 -65 203 4 l 271 112 l 271 -517 l 315 -517 l 315 107 b 405 -68 374 89 405 30 l 405 -248 l 449 -248 l 449 68 b 315 248 449 189 405 248 l 203 248 b 101 0 173 98 138 16 b 81 -3 94 0 86 -3 b 45 68 56 -3 45 23 z"},accSagittalFlat5v19CUp:{x_min:0,x_max:312,y_min:-172,y_max:359,ha:531,o:"m 45 -68 b 81 3 45 -23 56 3 b 101 0 86 3 94 0 b 203 -248 138 -16 173 -98 l 315 -248 b 449 -68 405 -248 449 -189 l 449 248 l 405 248 l 405 68 b 315 -107 405 -30 374 -89 l 315 517 l 271 517 l 271 -112 l 225 -112 b 135 95 203 -4 173 65 l 135 517 l 89 517 l 89 112 b 0 -68 30 112 0 52 z"},accSagittalSharp23CDown:{x_min:0,x_max:375,y_min:-359,y_max:172,ha:531,o:"m 135 -82 l 135 -517 l 180 -517 l 180 -17 l 239 68 b 315 -23 261 7 287 -23 l 315 -517 l 360 -517 l 360 -23 l 428 -23 b 495 -203 472 -23 495 -84 l 540 -203 b 449 68 540 -23 510 68 l 337 68 b 248 248 302 68 271 127 l 0 -112 l 0 -276 z"},accSagittalFlat23CUp:{x_min:0,x_max:375,y_min:-172,y_max:359,ha:531,o:"m 0 276 l 0 112 l 248 -248 b 337 -68 271 -127 302 -68 l 449 -68 b 540 203 510 -68 540 23 l 495 203 b 428 23 495 84 472 23 l 360 23 l 360 517 l 315 517 l 315 23 b 239 -68 287 23 261 -7 l 180 17 l 180 517 l 135 517 l 135 82 z"},accSagittalSharp23CUp:{x_min:0,x_max:344,y_min:-359,y_max:172,ha:531,o:"m 0 -517 l 45 -517 l 45 14 b 112 -23 63 -10 86 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 l 271 -517 l 315 -517 l 315 -23 l 360 -23 b 449 -203 420 -23 449 -84 l 495 -203 b 383 68 495 -23 458 68 l 135 68 b 23 248 85 68 48 127 l 0 248 z"},accSagittalFlat23CDown:{x_min:0,x_max:344,y_min:-172,y_max:359,ha:531,o:"m 0 -248 l 23 -248 b 135 -68 48 -127 85 -68 l 383 -68 b 495 203 458 -68 495 23 l 449 203 b 360 23 449 84 420 23 l 315 23 l 315 517 l 271 517 l 271 23 l 180 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 -14 86 23 63 10 l 45 517 l 0 517 z"},accSagittalSharp5v19CUp:{x_min:0,x_max:312,y_min:-359,y_max:172,ha:531,o:"m 0 -112 l 0 -266 l 135 -153 l 135 -517 l 180 -517 l 180 -115 l 271 -39 l 271 -517 l 315 -517 l 315 0 l 405 75 l 405 -517 l 449 -517 l 449 248 l 428 248 b 130 68 285 127 186 68 b 45 157 73 68 45 98 l 0 157 b 112 -20 0 53 37 -6 z"},accSagittalFlat5v19CDown:{x_min:0,x_max:312,y_min:-172,y_max:359,ha:531,o:"m 112 20 b 0 -157 37 6 0 -53 l 45 -157 b 130 -68 45 -98 73 -68 b 428 -248 186 -68 285 -127 l 449 -248 l 449 517 l 405 517 l 405 -75 l 315 0 l 315 517 l 271 517 l 271 39 l 180 115 l 180 517 l 135 517 l 135 153 l 0 266 l 0 112 z"},accSagittalSharp5v23SUp:{x_min:0,x_max:406,y_min:-359,y_max:172,ha:531,o:"m 135 -108 l 135 -517 l 180 -517 l 180 -53 l 271 58 l 271 -517 l 315 -517 l 315 14 b 383 -23 334 -10 357 -23 l 405 -23 l 405 -517 l 449 -517 l 449 -23 b 540 -203 510 -23 540 -84 l 585 -203 b 472 68 585 -23 547 68 l 405 68 b 292 248 356 68 318 127 l 0 -112 l 0 -274 z"},accSagittalFlat5v23SDown:{x_min:0,x_max:406,y_min:-172,y_max:359,ha:531,o:"m 0 274 l 0 112 l 292 -248 b 405 -68 318 -127 356 -68 l 472 -68 b 585 203 547 -68 585 23 l 540 203 b 449 23 540 84 510 23 l 449 517 l 405 517 l 405 23 l 383 23 b 315 -14 357 23 334 10 l 315 517 l 271 517 l 271 -58 l 180 53 l 180 517 l 135 517 l 135 108 z"},accSagittalDoubleSharp5v23SDown:{x_min:0,x_max:406,y_min:-359,y_max:172,ha:531,o:"m 52 -517 l 203 -81 l 354 -517 l 405 -503 l 239 -23 l 449 -23 b 540 -203 510 -23 540 -84 l 585 -203 b 472 68 585 -23 547 68 l 225 68 b 112 248 176 68 138 127 l 89 248 l 89 112 b 170 -14 109 45 135 0 l 0 -501 z"},accSagittalDoubleFlat5v23SUp:{x_min:0,x_max:406,y_min:-172,y_max:359,ha:531,o:"m 0 501 l 170 14 b 89 -112 135 0 109 -45 l 89 -248 l 112 -248 b 225 -68 138 -127 176 -68 l 472 -68 b 585 203 547 -68 585 23 l 540 203 b 449 23 540 84 510 23 l 239 23 l 405 503 l 354 517 l 203 81 l 52 517 z"},accSagittalDoubleSharp5v19CDown:{x_min:0,x_max:375,y_min:-359,y_max:172,ha:531,o:"m 0 68 b 112 -112 0 -52 36 -112 b 193 -73 143 -112 170 -99 l 45 -501 l 95 -517 l 248 -81 l 397 -517 l 449 -501 l 275 0 l 315 112 b 495 -68 435 112 495 53 l 495 -248 l 540 -248 l 540 68 b 360 248 540 189 480 248 l 248 248 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 z"},accSagittalDoubleFlat5v19CUp:{x_min:0,x_max:375,y_min:-172,y_max:359,ha:531,o:"m 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 l 360 -248 b 540 -68 480 -248 540 -189 l 540 248 l 495 248 l 495 68 b 315 -112 495 -53 435 -112 l 275 0 l 449 501 l 397 517 l 248 81 l 95 517 l 45 501 l 193 73 b 112 112 170 99 143 112 b 0 -68 36 112 0 52 z"},accSagittalDoubleSharp23CDown:{x_min:0,x_max:406,y_min:-359,y_max:172,ha:531,o:"m 252 35 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 323 4 b 383 -23 340 -13 360 -23 l 449 -23 b 540 -203 510 -23 540 -84 l 585 -203 b 472 68 585 -23 547 68 l 405 68 b 292 248 356 68 318 127 l 0 -112 l 0 -274 z"},accSagittalDoubleFlat23CUp:{x_min:0,x_max:406,y_min:-172,y_max:359,ha:531,o:"m 0 274 l 0 112 l 292 -248 b 405 -68 318 -127 356 -68 l 472 -68 b 585 203 547 -68 585 23 l 540 203 b 449 23 540 84 510 23 l 383 23 b 323 -4 360 23 340 13 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 252 -35 z"},accSagittal19SchismaUp:{x_min:0,x_max:125,y_min:-359,y_max:172,ha:531,o:"m 68 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 248 l 157 248 b 79 0 127 98 101 16 b 68 -3 73 0 68 -3 b 45 68 52 -3 45 20 l 0 68 b 68 -112 0 -52 23 -112 z"},accSagittal19SchismaDown:{x_min:0,x_max:125,y_min:-172,y_max:359,ha:531,o:"m 68 112 b 0 -68 23 112 0 52 l 45 -68 b 68 3 45 -20 52 3 b 79 0 68 3 73 0 b 157 -248 101 -16 127 -98 l 180 -248 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 z"},accSagittal17KleismaUp:{x_min:0,x_max:156,y_min:-359,y_max:172,ha:531,o:"m 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 248 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z"},accSagittal17KleismaDown:{x_min:0,x_max:156,y_min:-172,y_max:359,ha:531,o:"m 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 225 -248 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z"},accSagittal143CommaUp:{x_min:0,x_max:156,y_min:-359,y_max:172,ha:531,o:"m 0 -203 l 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 248 l 203 248 b 135 68 177 127 154 68 l 105 68 b 45 157 65 68 45 98 l 0 157 b 23 20 0 95 7 50 b 0 -203 7 -23 0 -98 z"},accSagittal143CommaDown:{x_min:0,x_max:156,y_min:-172,y_max:359,ha:531,o:"m 0 203 b 23 -20 0 98 7 23 b 0 -157 7 -50 0 -95 l 45 -157 b 105 -68 45 -98 65 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 225 -248 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z"},accSagittal11v49CommaUp:{x_min:0,x_max:188,y_min:-359,y_max:172,ha:531,o:"m 45 -292 b 89 -157 45 -203 60 -157 l 203 -157 b 225 -143 210 -157 217 -153 l 225 -517 l 271 -517 l 271 248 l 248 248 b 180 157 233 187 210 157 l 68 157 b 0 -68 23 157 0 82 l 45 -68 b 89 68 45 23 60 68 l 203 68 b 225 84 209 68 216 72 l 225 -36 b 180 -68 213 -58 199 -68 l 68 -68 b 0 -292 23 -68 0 -143 z"},accSagittal11v49CommaDown:{x_min:0,x_max:188,y_min:-172,y_max:359,ha:531,o:"m 0 292 b 68 68 0 143 23 68 l 180 68 b 225 36 199 68 213 58 l 225 -84 b 203 -68 216 -72 209 -68 l 89 -68 b 45 68 60 -68 45 -23 l 0 68 b 68 -157 0 -82 23 -157 l 180 -157 b 248 -248 210 -157 233 -187 l 271 -248 l 271 517 l 225 517 l 225 143 b 203 157 217 153 210 157 l 89 157 b 45 292 60 157 45 203 z"},accSagittal19CommaUp:{x_min:0,x_max:281,y_min:-359,y_max:172,ha:531,o:"m 0 68 b 68 -112 0 -52 23 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 -4 b 203 -23 187 -17 196 -23 l 315 -23 b 360 -203 346 -23 360 -82 l 405 -203 b 341 68 405 -23 383 68 l 225 68 b 157 248 206 68 183 127 b 79 0 127 98 101 16 b 68 -3 73 0 68 -3 b 45 68 52 -3 45 20 z"},accSagittal19CommaDown:{x_min:0,x_max:281,y_min:-172,y_max:359,ha:531,o:"m 45 -68 b 68 3 45 -20 52 3 b 79 0 68 3 73 0 b 157 -248 101 -16 127 -98 b 225 -68 183 -127 206 -68 l 341 -68 b 405 203 383 -68 405 23 l 360 203 b 315 23 360 82 346 23 l 203 23 b 180 4 196 23 187 17 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 b 0 -68 23 112 0 52 z"},accSagittal7v19CommaUp:{x_min:0,x_max:250,y_min:-359,y_max:172,ha:531,o:"m 0 68 b 68 -112 0 -52 23 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 112 l 225 112 b 315 -68 285 112 315 53 l 315 -248 l 360 -248 l 360 68 b 271 248 360 187 330 248 l 157 248 b 79 0 127 98 101 16 b 68 -3 73 0 68 -3 b 45 68 52 -3 45 20 z"},accSagittal7v19CommaDown:{x_min:0,x_max:250,y_min:-172,y_max:359,ha:531,o:"m 45 -68 b 68 3 45 -20 52 3 b 79 0 68 3 73 0 b 157 -248 101 -16 127 -98 l 271 -248 b 360 -68 330 -248 360 -187 l 360 248 l 315 248 l 315 68 b 225 -112 315 -53 285 -112 l 180 -112 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 b 0 -68 23 112 0 52 z"},accSagittal49SmallDiesisUp:{x_min:0,x_max:281,y_min:-359,y_max:172,ha:531,o:"m 0 -203 l 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -68 330 112 360 53 l 360 -248 l 405 -248 l 405 68 b 315 248 405 187 374 248 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z"},accSagittal49SmallDiesisDown:{x_min:0,x_max:281,y_min:-172,y_max:359,ha:531,o:"m 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 315 -248 b 405 -68 374 -248 405 -187 l 405 248 l 360 248 l 360 68 b 271 -112 360 -53 330 -112 l 225 -112 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z"},accSagittal23SmallDiesisUp:{x_min:0,x_max:344,y_min:-359,y_max:172,ha:531,o:"m 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 58 l 495 -274 l 495 -112 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z"},accSagittal23SmallDiesisDown:{x_min:0,x_max:344,y_min:-172,y_max:359,ha:531,o:"m 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 495 112 l 495 274 l 225 -58 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z"},accSagittal5v13MediumDiesisUp:{x_min:0,x_max:250,y_min:-359,y_max:172,ha:531,o:"m 0 -259 l 315 -89 l 315 -517 l 360 -517 l 360 248 l 337 248 b 128 180 253 203 184 180 b 45 248 73 180 45 203 l 0 248 b 52 95 0 170 17 120 l 0 68 l 0 -33 l 315 135 l 315 10 l 0 -157 z"},accSagittal5v13MediumDiesisDown:{x_min:0,x_max:250,y_min:-172,y_max:359,ha:531,o:"m 0 157 l 315 -10 l 315 -135 l 0 33 l 0 -68 l 52 -95 b 0 -248 17 -120 0 -170 l 45 -248 b 128 -180 45 -203 73 -180 b 337 -248 184 -180 253 -203 l 360 -248 l 360 517 l 315 517 l 315 89 l 0 259 z"},accSagittal11v19MediumDiesisUp:{x_min:0,x_max:344,y_min:-359,y_max:172,ha:531,o:"m 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 -4 b 292 -23 278 -17 285 -23 l 405 -23 b 449 -203 435 -23 449 -82 l 495 -203 b 431 68 495 -23 472 68 l 315 68 b 248 248 295 68 271 127 l 135 248 b 0 68 45 248 0 187 l 0 -248 z"},accSagittal11v19MediumDiesisDown:{x_min:0,x_max:344,y_min:-172,y_max:359,ha:531,o:"m 0 248 l 0 -68 b 135 -248 0 -187 45 -248 l 248 -248 b 315 -68 271 -127 295 -68 l 431 -68 b 495 203 472 -68 495 23 l 449 203 b 405 23 449 82 435 23 l 292 23 b 271 4 285 23 278 17 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 z"},accSagittal49MediumDiesisUp:{x_min:0,x_max:250,y_min:-359,y_max:172,ha:531,o:"m 0 -68 l 0 -248 l 45 -248 l 315 -94 l 315 -517 l 360 -517 l 360 248 l 225 248 b 0 -68 75 248 0 143 z m 45 -68 b 225 112 45 53 105 112 l 315 112 l 315 10 l 45 -145 z"},accSagittal49MediumDiesisDown:{x_min:0,x_max:250,y_min:-172,y_max:359,ha:531,o:"m 0 68 b 225 -248 0 -143 75 -248 l 360 -248 l 360 517 l 315 517 l 315 94 l 45 248 l 0 248 z m 45 145 l 315 -10 l 315 -112 l 225 -112 b 45 68 105 -112 45 -53 z"},accSagittal5v49MediumDiesisUp:{x_min:0,x_max:344,y_min:-359,y_max:172,ha:531,o:"m 0 -89 l 0 -248 l 225 53 l 225 -517 l 271 -517 l 271 53 l 495 -248 l 495 -89 l 248 248 b 89 89 170 143 118 89 b 45 157 60 89 45 112 l 0 157 b 68 3 0 68 23 16 z"},accSagittal5v49MediumDiesisDown:{x_min:0,x_max:344,y_min:-172,y_max:359,ha:531,o:"m 68 -3 b 0 -157 23 -16 0 -68 l 45 -157 b 89 -89 45 -112 60 -89 b 248 -248 118 -89 170 -143 l 495 89 l 495 248 l 271 -53 l 271 517 l 225 517 l 225 -53 l 0 248 l 0 89 z"},accSagittal49LargeDiesisUp:{x_min:0,x_max:281,y_min:-359,y_max:172,ha:531,o:"m 0 -517 l 45 -517 l 45 -89 l 360 -248 l 405 -248 l 405 -68 b 180 248 405 143 330 248 l 0 248 z m 45 12 l 45 112 l 180 112 b 360 -68 300 112 360 53 l 360 -147 z"},accSagittal49LargeDiesisDown:{x_min:0,x_max:281,y_min:-172,y_max:359,ha:531,o:"m 0 -248 l 180 -248 b 405 68 330 -248 405 -143 l 405 248 l 360 248 l 45 89 l 45 517 l 0 517 z m 360 147 l 360 68 b 180 -112 360 -53 300 -112 l 45 -112 l 45 -12 z"},accSagittal11v19LargeDiesisUp:{x_min:0,x_max:312,y_min:-359,y_max:172,ha:531,o:"m 0 -517 l 45 -517 l 45 -86 l 449 -256 l 449 -157 l 45 13 l 45 138 l 449 -30 l 449 68 l 23 248 l 0 248 z"},accSagittal11v19LargeDiesisDown:{x_min:0,x_max:312,y_min:-172,y_max:359,ha:531,o:"m 0 -248 l 23 -248 l 449 -68 l 449 30 l 45 -138 l 45 -13 l 449 157 l 449 256 l 45 86 l 45 517 l 0 517 z"},accSagittal5v13LargeDiesisUp:{x_min:0,x_max:438,y_min:-359,y_max:172,ha:531,o:"m 0 68 b 89 -112 0 -52 30 -112 b 180 -35 125 -112 157 -86 l 180 -517 l 225 -517 l 225 -86 l 631 -256 l 631 -157 l 225 13 l 225 138 l 631 -30 l 631 68 l 203 248 b 101 0 173 98 138 16 b 81 -3 94 0 86 -3 b 45 68 56 -3 45 20 z"},accSagittal5v13LargeDiesisDown:{x_min:0,x_max:438,y_min:-172,y_max:359,ha:531,o:"m 45 -68 b 81 3 45 -20 56 3 b 101 0 86 3 94 0 b 203 -248 138 -16 173 -98 l 631 -68 l 631 30 l 225 -138 l 225 -13 l 631 157 l 631 256 l 225 86 l 225 517 l 180 517 l 180 35 b 89 112 157 86 125 112 b 0 -68 30 112 0 52 z"},accSagittalSharp23SDown:{x_min:0,x_max:250,y_min:-359,y_max:172,ha:531,o:"m 0 -203 l 45 -203 b 112 -23 45 -84 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 b 315 6 287 -23 301 -13 l 315 -517 l 360 -517 l 360 248 l 337 248 b 248 68 312 127 282 68 l 194 68 b 89 157 125 68 89 98 l 45 157 b 60 59 45 118 50 85 b 0 -203 20 30 0 -56 z"},accSagittalFlat23SUp:{x_min:0,x_max:250,y_min:-172,y_max:359,ha:531,o:"m 0 203 b 60 -59 0 56 20 -30 b 45 -157 50 -85 45 -118 l 89 -157 b 194 -68 89 -98 125 -68 l 248 -68 b 337 -248 282 -68 312 -127 l 360 -248 l 360 517 l 315 517 l 315 -6 b 271 23 301 13 287 23 l 180 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 84 z"},accSagittalSharp49SDown:{x_min:0,x_max:250,y_min:-359,y_max:172,ha:531,o:"m 0 -292 l 45 -292 b 112 -157 45 -203 68 -157 l 135 -157 l 135 -517 l 180 -517 l 180 -157 l 271 -157 b 315 -135 285 -157 300 -150 l 315 -517 l 360 -517 l 360 248 l 337 248 b 248 157 323 187 292 157 l 89 157 b 0 -68 30 157 0 82 l 45 -68 b 112 68 45 23 68 68 l 271 68 b 315 89 284 68 300 75 l 315 -32 b 248 -68 298 -56 275 -68 l 89 -68 b 0 -292 29 -68 0 -143 z"},accSagittalFlat49SUp:{x_min:0,x_max:250,y_min:-172,y_max:359,ha:531,o:"m 0 292 b 89 68 0 143 29 68 l 248 68 b 315 32 275 68 298 56 l 315 -89 b 271 -68 300 -75 284 -68 l 112 -68 b 45 68 68 -68 45 -23 l 0 68 b 89 -157 0 -82 30 -157 l 248 -157 b 337 -248 292 -157 323 -187 l 360 -248 l 360 517 l 315 517 l 315 135 b 271 157 300 150 285 157 l 180 157 l 180 517 l 135 517 l 135 157 l 112 157 b 45 292 68 157 45 203 z"},accSagittalSharp7v19CDown:{x_min:0,x_max:250,y_min:-359,y_max:172,ha:531,o:"m 0 -112 l 0 -271 l 135 -125 l 135 -517 l 180 -517 l 180 -78 l 315 65 l 315 -517 l 360 -517 l 360 248 l 337 248 b 118 89 239 143 166 89 b 45 157 68 89 45 112 l 0 157 b 89 -20 0 53 29 -6 z"},accSagittalFlat7v19CUp:{x_min:0,x_max:250,y_min:-172,y_max:359,ha:531,o:"m 89 20 b 0 -157 29 6 0 -53 l 45 -157 b 118 -89 45 -112 68 -89 b 337 -248 166 -89 239 -143 l 360 -248 l 360 517 l 315 517 l 315 -65 l 180 78 l 180 517 l 135 517 l 135 125 l 0 271 l 0 112 z"},accSagittalSharp19CDown:{x_min:0,x_max:281,y_min:-359,y_max:172,ha:531,o:"m 0 -248 l 45 -248 l 45 -68 b 180 96 45 17 89 72 l 180 -517 l 225 -517 l 225 107 b 315 112 252 112 282 112 l 360 112 l 360 -517 l 405 -517 l 405 248 l 271 248 b 0 68 89 248 0 187 z"},accSagittalFlat19CUp:{x_min:0,x_max:281,y_min:-172,y_max:359,ha:531,o:"m 0 -68 b 271 -248 0 -187 89 -248 l 405 -248 l 405 517 l 360 517 l 360 -112 l 315 -112 b 225 -107 282 -112 252 -112 l 225 517 l 180 517 l 180 -96 b 45 68 89 -72 45 -17 l 45 248 l 0 248 z"},accSagittalSharp11v49CDown:{x_min:0,x_max:344,y_min:-359,y_max:172,ha:531,o:"m 45 -203 b 112 -23 45 -82 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 b 271 112 215 -23 245 23 l 315 112 l 315 -517 l 360 -517 l 360 107 b 449 -68 420 89 449 30 l 449 -248 l 495 -248 l 495 68 b 360 248 495 189 449 248 l 248 248 b 157 68 222 128 192 68 l 89 68 b 0 -203 30 68 0 -23 z"},accSagittalFlat11v49CUp:{x_min:0,x_max:344,y_min:-172,y_max:359,ha:531,o:"m 0 203 b 89 -68 0 23 30 -68 l 157 -68 b 248 -248 192 -68 222 -128 l 360 -248 b 495 -68 449 -248 495 -189 l 495 248 l 449 248 l 449 68 b 360 -107 449 -30 420 -89 l 360 517 l 315 517 l 315 -112 l 271 -112 b 180 23 245 -23 215 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 82 z"},accSagittalSharp143CDown:{x_min:0,x_max:406,y_min:-359,y_max:172,ha:531,o:"m 45 -203 b 112 -23 45 -84 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 b 259 76 210 -23 236 10 l 315 17 l 315 -517 l 360 -517 l 360 -30 l 585 -271 l 585 -112 l 248 248 b 157 68 222 127 192 68 l 89 68 b 0 -203 30 68 0 -23 z"},accSagittalFlat143CUp:{x_min:0,x_max:406,y_min:-172,y_max:359,ha:531,o:"m 0 203 b 89 -68 0 23 30 -68 l 157 -68 b 248 -248 192 -68 222 -127 l 585 112 l 585 271 l 360 30 l 360 517 l 315 517 l 315 -17 l 259 -76 b 180 23 236 -10 210 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 84 z"},accSagittalSharp17kDown:{x_min:0,x_max:312,y_min:-359,y_max:172,ha:531,o:"m 0 -157 l 0 -256 l 225 -161 l 225 -517 l 271 -517 l 271 -144 l 405 -86 l 405 -517 l 449 -517 l 449 248 l 428 248 b 145 171 305 196 210 171 b 45 248 78 171 45 196 l 0 248 b 79 101 0 170 26 121 l 0 68 l 0 -32 l 405 138 l 405 13 z"},accSagittalFlat17kUp:{x_min:0,x_max:312,y_min:-172,y_max:359,ha:531,o:"m 405 -13 l 405 -138 l 0 32 l 0 -68 l 79 -101 b 0 -248 26 -121 0 -170 l 45 -248 b 145 -171 45 -196 78 -171 b 428 -248 210 -171 305 -196 l 449 -248 l 449 517 l 405 517 l 405 86 l 271 144 l 271 517 l 225 517 l 225 161 l 0 256 l 0 157 z"},accSagittalSharp19sDown:{x_min:0,x_max:406,y_min:-359,y_max:172,ha:531,o:"m 0 -248 l 45 -248 l 45 -68 b 180 109 45 36 89 95 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -23 295 23 325 -23 l 360 -517 l 405 -517 l 405 -23 l 472 -23 b 540 -203 517 -23 540 -84 l 585 -203 b 495 68 585 -23 554 68 l 383 68 b 292 248 348 68 318 127 l 180 248 b 0 68 60 248 0 187 z"},accSagittalFlat19sUp:{x_min:0,x_max:406,y_min:-172,y_max:359,ha:531,o:"m 0 -68 b 180 -248 0 -187 60 -248 l 292 -248 b 383 -68 318 -127 348 -68 l 495 -68 b 585 203 554 -68 585 23 l 540 203 b 472 23 540 84 517 23 l 405 23 l 405 517 l 360 517 l 360 23 b 271 -112 325 23 295 -23 l 225 -112 l 225 517 l 180 517 l 180 -109 b 45 68 89 -95 45 -36 l 45 248 l 0 248 z"},accSagittalSharp19sUp:{x_min:0,x_max:281,y_min:-359,y_max:172,ha:531,o:"m 89 -96 l 89 -517 l 135 -517 l 135 -108 b 180 -112 148 -112 163 -112 b 225 -108 196 -112 210 -112 l 225 -517 l 271 -517 l 271 -94 b 360 -12 305 -78 337 -50 l 360 -517 l 405 -517 l 405 248 l 383 248 b 190 0 353 98 288 16 b 138 -3 171 0 153 -3 b 45 68 75 -3 45 20 l 0 68 b 89 -96 0 -17 30 -72 z"},accSagittalFlat19sDown:{x_min:0,x_max:281,y_min:-172,y_max:359,ha:531,o:"m 89 96 b 0 -68 30 72 0 17 l 45 -68 b 138 3 45 -20 75 3 b 190 0 153 3 171 0 b 383 -248 288 -16 353 -98 l 405 -248 l 405 517 l 360 517 l 360 12 b 271 94 337 50 305 78 l 271 517 l 225 517 l 225 108 b 180 112 210 112 196 112 b 135 108 163 112 148 112 l 135 517 l 89 517 z"},accSagittalSharp17kUp:{x_min:0,x_max:312,y_min:-359,y_max:172,ha:531,o:"m 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 l 271 -517 l 315 -517 l 315 -23 l 337 -23 b 405 14 363 -23 386 -10 l 405 -517 l 449 -517 l 449 248 l 428 248 b 315 68 402 127 364 68 l 112 68 b 0 -203 37 68 0 -23 z"},accSagittalFlat17kDown:{x_min:0,x_max:312,y_min:-172,y_max:359,ha:531,o:"m 0 203 b 112 -68 0 23 37 -68 l 315 -68 b 428 -248 364 -68 402 -127 l 449 -248 l 449 517 l 405 517 l 405 -14 b 337 23 386 10 363 23 l 315 23 l 315 517 l 271 517 l 271 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z"},accSagittalSharp143CUp:{x_min:0,x_max:312,y_min:-359,y_max:172,ha:531,o:"m 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 l 271 -517 l 315 -517 l 315 -23 l 337 -23 b 405 14 363 -23 386 -10 l 405 -517 l 449 -517 l 449 248 l 428 248 b 315 68 402 127 364 68 l 240 68 b 89 157 140 68 89 98 l 45 157 b 68 53 45 115 52 81 b 0 -203 23 23 0 -63 z"},accSagittalFlat143CDown:{x_min:0,x_max:312,y_min:-172,y_max:359,ha:531,o:"m 0 203 b 68 -53 0 63 23 -23 b 45 -157 52 -81 45 -115 l 89 -157 b 240 -68 89 -98 140 -68 l 315 -68 b 428 -248 364 -68 402 -127 l 449 -248 l 449 517 l 405 517 l 405 -14 b 337 23 386 10 363 23 l 315 23 l 315 517 l 271 517 l 271 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z"},accSagittalSharp11v49CUp:{x_min:0,x_max:312,y_min:-359,y_max:172,ha:531,o:"m 45 -68 b 135 68 45 23 76 68 l 337 68 b 405 95 363 68 386 76 l 405 -27 b 315 -68 386 -55 356 -68 l 112 -68 b 0 -292 37 -68 0 -143 l 45 -292 b 135 -157 45 -203 75 -157 l 135 -517 l 180 -517 l 180 -157 l 271 -157 l 271 -517 l 315 -517 l 315 -157 l 337 -157 b 405 -130 360 -157 383 -148 l 405 -517 l 449 -517 l 449 248 l 428 248 b 315 157 413 187 376 157 l 112 157 b 0 -68 37 157 0 82 z"},accSagittalFlat11v49CDown:{x_min:0,x_max:312,y_min:-172,y_max:359,ha:531,o:"m 0 68 b 112 -157 0 -82 37 -157 l 315 -157 b 428 -248 376 -157 413 -187 l 449 -248 l 449 517 l 405 517 l 405 130 b 337 157 383 148 360 157 l 315 157 l 315 517 l 271 517 l 271 157 l 180 157 l 180 517 l 135 517 l 135 157 b 45 292 75 157 45 203 l 0 292 b 112 68 0 143 37 68 l 315 68 b 405 27 356 68 386 55 l 405 -95 b 337 -68 386 -76 363 -68 l 135 -68 b 45 68 76 -68 45 -23 z"},accSagittalSharp19CUp:{x_min:0,x_max:375,y_min:-359,y_max:172,ha:531,o:"m 89 -109 l 89 -517 l 135 -517 l 135 -109 b 225 -27 170 -102 200 -75 l 225 -517 l 271 -517 l 271 14 b 337 -23 289 -10 311 -23 l 360 -23 l 360 -517 l 405 -517 l 405 -23 b 495 -203 465 -23 495 -82 l 540 -203 b 428 68 540 -23 503 68 l 360 68 b 248 248 310 68 271 128 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 89 -109 0 -39 30 -98 z"},accSagittalFlat19CDown:{x_min:0,x_max:375,y_min:-172,y_max:359,ha:531,o:"m 89 109 b 0 -68 30 98 0 39 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 b 360 -68 271 -128 310 -68 l 428 -68 b 540 203 503 -68 540 23 l 495 203 b 405 23 495 82 465 23 l 405 517 l 360 517 l 360 23 l 337 23 b 271 -14 311 23 289 10 l 271 517 l 225 517 l 225 27 b 135 109 200 75 170 102 l 135 517 l 89 517 z"},accSagittalSharp7v19CUp:{x_min:0,x_max:375,y_min:-359,y_max:172,ha:531,o:"m 89 -109 l 89 -517 l 135 -517 l 135 -109 b 225 -27 170 -102 200 -75 l 225 -517 l 271 -517 l 271 112 l 315 112 b 360 109 331 112 346 112 l 360 -517 l 405 -517 l 405 98 b 495 -68 465 73 495 19 l 495 -248 l 540 -248 l 540 68 b 360 248 540 189 480 248 l 248 248 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 89 -109 0 -39 30 -98 z"},accSagittalFlat7v19CDown:{x_min:0,x_max:375,y_min:-172,y_max:359,ha:531,o:"m 89 109 b 0 -68 30 98 0 39 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 l 360 -248 b 540 -68 480 -248 540 -189 l 540 248 l 495 248 l 495 68 b 405 -98 495 -19 465 -73 l 405 517 l 360 517 l 360 -109 b 315 -112 346 -112 331 -112 l 271 -112 l 271 517 l 225 517 l 225 27 b 135 109 200 75 170 102 l 135 517 l 89 517 z"},accSagittalSharp49SUp:{x_min:0,x_max:406,y_min:-359,y_max:172,ha:531,o:"m 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 203 -23 b 271 14 229 -23 251 -10 l 271 -517 l 315 -517 l 315 112 l 360 112 b 405 109 376 112 390 112 l 405 -517 l 449 -517 l 449 96 b 540 -68 510 72 540 17 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z"},accSagittalFlat49SDown:{x_min:0,x_max:406,y_min:-172,y_max:359,ha:531,o:"m 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 449 -96 540 -17 510 -72 l 449 517 l 405 517 l 405 -109 b 360 -112 390 -112 376 -112 l 315 -112 l 315 517 l 271 517 l 271 -14 b 203 23 251 10 229 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z"},accSagittalSharp23SUp:{x_min:0,x_max:469,y_min:-359,y_max:172,ha:531,o:"m 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 203 -23 b 271 14 229 -23 251 -10 l 271 -517 l 315 -517 l 315 71 l 405 -14 l 405 -517 l 449 -517 l 449 -56 l 675 -268 l 675 -112 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z"},accSagittalFlat23SDown:{x_min:0,x_max:469,y_min:-172,y_max:359,ha:531,o:"m 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 675 112 l 675 268 l 449 56 l 449 517 l 405 517 l 405 14 l 315 -71 l 315 517 l 271 517 l 271 -14 b 203 23 251 10 229 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z"},accSagittalSharp5v13MUp:{x_min:0,x_max:375,y_min:-359,y_max:172,ha:531,o:"m 495 141 l 495 14 l 0 -157 l 0 -256 l 225 -180 l 225 -517 l 271 -517 l 271 -161 l 360 -130 l 360 -517 l 405 -517 l 405 -115 l 495 -84 l 495 -517 l 540 -517 l 540 248 l 517 248 b 167 168 366 194 248 168 b 45 248 85 168 45 194 l 0 248 b 95 99 0 170 30 120 l 0 68 l 0 -30 z"},accSagittalFlat5v13MDown:{x_min:0,x_max:375,y_min:-172,y_max:359,ha:531,o:"m 0 30 l 0 -68 l 95 -99 b 0 -248 30 -120 0 -170 l 45 -248 b 167 -168 45 -194 85 -168 b 517 -248 248 -168 366 -194 l 540 -248 l 540 517 l 495 517 l 495 84 l 405 115 l 405 517 l 360 517 l 360 130 l 271 161 l 271 517 l 225 517 l 225 180 l 0 256 l 0 157 l 495 -14 l 495 -141 z"},accSagittalSharp11v19MUp:{x_min:0,x_max:438,y_min:-359,y_max:172,ha:531,o:"m 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 14 b 428 -23 379 -10 402 -23 l 449 -23 l 449 -517 l 495 -517 l 495 -23 b 585 -203 554 -23 585 -84 l 631 -203 b 517 68 631 -23 593 68 l 449 68 b 337 248 400 68 363 127 l 225 248 b 0 68 75 248 0 187 z"},accSagittalFlat11v19MDown:{x_min:0,x_max:438,y_min:-172,y_max:359,ha:531,o:"m 0 -68 b 225 -248 0 -187 75 -248 l 337 -248 b 449 -68 363 -127 400 -68 l 517 -68 b 631 203 593 -68 631 23 l 585 203 b 495 23 585 84 554 23 l 495 517 l 449 517 l 449 23 l 428 23 b 360 -14 402 23 379 10 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z"},accSagittalSharp49MUp:{x_min:0,x_max:375,y_min:-359,y_max:172,ha:531,o:"m 0 -248 l 45 -248 l 225 -180 l 225 -517 l 271 -517 l 271 -166 l 360 -132 l 360 -517 l 405 -517 l 405 -117 l 495 -84 l 495 -517 l 540 -517 l 540 248 l 360 248 b 0 -68 120 248 0 143 z m 45 -145 l 45 -68 b 360 112 45 53 150 112 l 495 112 l 495 14 z"},accSagittalFlat49MDown:{x_min:0,x_max:375,y_min:-172,y_max:359,ha:531,o:"m 0 68 b 360 -248 0 -143 120 -248 l 540 -248 l 540 517 l 495 517 l 495 84 l 405 117 l 405 517 l 360 517 l 360 132 l 271 166 l 271 517 l 225 517 l 225 180 l 45 248 l 0 248 z m 495 -14 l 495 -112 l 360 -112 b 45 68 150 -112 45 -53 l 45 145 z"},accSagittalSharp5v49MUp:{x_min:0,x_max:469,y_min:-359,y_max:172,ha:531,o:"m 0 -271 l 180 -79 l 180 -517 l 225 -517 l 225 -30 l 315 65 l 315 -517 l 360 -517 l 360 65 l 449 -30 l 449 -517 l 495 -517 l 495 -79 l 675 -271 l 675 -112 l 337 248 b 118 89 239 143 166 89 b 45 157 68 89 45 112 l 0 157 b 107 0 0 62 36 10 l 0 -112 z"},accSagittalFlat5v49MDown:{x_min:0,x_max:469,y_min:-172,y_max:359,ha:531,o:"m 0 112 l 107 0 b 0 -157 36 -10 0 -62 l 45 -157 b 118 -89 45 -112 68 -89 b 337 -248 166 -89 239 -143 l 675 112 l 675 271 l 495 79 l 495 517 l 449 517 l 449 30 l 360 -65 l 360 517 l 315 517 l 315 -65 l 225 30 l 225 517 l 180 517 l 180 79 l 0 271 z"},accSagittalSharp49LUp:{x_min:0,x_max:406,y_min:-359,y_max:172,ha:531,o:"m 0 -517 l 45 -517 l 45 -82 l 135 -112 l 135 -517 l 180 -517 l 180 -127 l 271 -157 l 271 -517 l 315 -517 l 315 -173 l 540 -248 l 585 -248 l 585 -68 b 180 248 585 143 449 248 l 0 248 z m 45 112 l 180 112 b 540 -68 420 112 540 53 l 540 -145 l 45 16 z"},accSagittalFlat49LDown:{x_min:0,x_max:406,y_min:-172,y_max:359,ha:531,o:"m 0 -248 l 180 -248 b 585 68 449 -248 585 -143 l 585 248 l 540 248 l 315 173 l 315 517 l 271 517 l 271 157 l 180 127 l 180 517 l 135 517 l 135 112 l 45 82 l 45 517 l 0 517 z m 45 -16 l 540 145 l 540 68 b 180 -112 540 -53 420 -112 l 45 -112 z"},accSagittalSharp11v19LUp:{x_min:0,x_max:438,y_min:-359,y_max:172,ha:531,o:"m 0 -517 l 45 -517 l 45 -81 l 135 -108 l 135 -517 l 180 -517 l 180 -121 l 271 -148 l 271 -517 l 315 -517 l 315 -161 l 631 -255 l 631 -157 l 45 16 l 45 144 l 631 -30 l 631 68 l 23 248 l 0 248 z"},accSagittalFlat11v19LDown:{x_min:0,x_max:438,y_min:-172,y_max:359,ha:531,o:"m 0 -248 l 23 -248 l 631 -68 l 631 30 l 45 -144 l 45 -16 l 631 157 l 631 255 l 315 161 l 315 517 l 271 517 l 271 148 l 180 121 l 180 517 l 135 517 l 135 108 l 45 81 l 45 517 l 0 517 z"},accSagittalSharp5v13LUp:{x_min:0,x_max:500,y_min:-359,y_max:172,ha:531,o:"m 89 -109 l 89 -517 l 135 -517 l 135 -109 b 225 -27 170 -102 200 -75 l 225 -517 l 271 -517 l 271 -85 l 360 -120 l 360 -517 l 405 -517 l 405 -135 l 720 -256 l 720 -157 l 271 14 l 271 141 l 720 -30 l 720 68 l 248 248 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 89 -109 0 -39 30 -98 z"},accSagittalFlat5v13LDown:{x_min:0,x_max:500,y_min:-172,y_max:359,ha:531,o:"m 89 109 b 0 -68 30 98 0 39 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 l 720 -68 l 720 30 l 271 -141 l 271 -14 l 720 157 l 720 256 l 405 135 l 405 517 l 360 517 l 360 120 l 271 85 l 271 517 l 225 517 l 225 27 b 135 109 200 75 170 102 l 135 517 l 89 517 z"},accSagittalDoubleSharp23SDown:{x_min:0,x_max:375,y_min:-359,y_max:172,ha:531,o:"m 0 -203 l 45 -203 b 135 -23 45 -82 76 -23 l 301 -23 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 370 -14 b 449 112 423 10 449 53 l 449 248 l 428 248 b 315 68 402 127 364 68 l 240 68 b 89 157 140 68 89 98 l 45 157 b 68 53 45 115 52 81 b 0 -203 23 23 0 -63 z"},accSagittalDoubleFlat23SUp:{x_min:0,x_max:375,y_min:-172,y_max:359,ha:531,o:"m 0 203 b 68 -53 0 63 23 -23 b 45 -157 52 -81 45 -115 l 89 -157 b 240 -68 89 -98 140 -68 l 315 -68 b 428 -248 364 -68 402 -127 l 449 -248 l 449 -112 b 370 14 449 -53 423 -10 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 301 23 l 135 23 b 45 203 76 23 45 82 z"},accSagittalDoubleSharp49SDown:{x_min:0,x_max:375,y_min:-359,y_max:172,ha:531,o:"m 0 -292 l 45 -292 b 112 -157 45 -203 68 -157 l 256 -157 l 135 -503 l 187 -517 l 337 -82 l 490 -517 l 540 -503 l 366 0 l 396 89 b 449 157 416 102 435 125 l 449 248 l 428 248 b 315 157 413 187 376 157 l 112 157 b 0 -68 39 157 0 82 l 45 -68 b 135 68 45 23 76 68 l 287 68 l 311 0 l 288 -68 l 89 -68 b 0 -292 32 -68 0 -144 z"},accSagittalDoubleFlat49SUp:{x_min:0,x_max:375,y_min:-172,y_max:359,ha:531,o:"m 0 292 b 89 68 0 144 32 68 l 288 68 l 311 0 l 287 -68 l 135 -68 b 45 68 76 -68 45 -23 l 0 68 b 112 -157 0 -82 39 -157 l 315 -157 b 428 -248 376 -157 413 -187 l 449 -248 l 449 -157 b 396 -89 435 -125 416 -102 l 366 0 l 540 503 l 490 517 l 337 82 l 187 517 l 135 503 l 256 157 l 112 157 b 45 292 68 157 45 203 z"},accSagittalDoubleSharp7v19CDown:{x_min:0,x_max:375,y_min:-359,y_max:172,ha:531,o:"m 0 -112 l 0 -266 l 307 -7 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 366 0 l 386 59 l 449 112 l 449 248 l 428 248 b 130 68 285 127 186 68 b 45 157 73 68 45 98 l 0 157 b 112 -20 0 53 37 -6 z"},accSagittalDoubleFlat7v19CUp:{x_min:0,x_max:375,y_min:-172,y_max:359,ha:531,o:"m 112 20 b 0 -157 37 6 0 -53 l 45 -157 b 130 -68 45 -98 73 -68 b 428 -248 186 -68 285 -127 l 449 -248 l 449 -112 l 386 -59 l 366 0 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 307 7 l 0 266 l 0 112 z"},accSagittalDoubleSharp19CDown:{x_min:0,x_max:406,y_min:-359,y_max:172,ha:531,o:"m 0 68 l 0 -248 l 45 -248 l 45 -68 b 315 109 45 36 135 95 l 354 0 l 180 -503 l 232 -517 l 383 -82 l 534 -517 l 585 -503 l 410 0 l 449 112 l 495 112 l 495 248 l 360 248 b 0 68 120 248 0 187 z m 372 112 l 393 112 l 383 82 z"},accSagittalDoubleFlat19CUp:{x_min:0,x_max:406,y_min:-172,y_max:359,ha:531,o:"m 0 -68 b 360 -248 0 -187 120 -248 l 495 -248 l 495 -112 l 449 -112 l 410 0 l 585 503 l 534 517 l 383 82 l 232 517 l 180 503 l 354 0 l 315 -109 b 45 68 135 -95 45 -36 l 45 248 l 0 248 z m 383 -82 l 393 -112 l 372 -112 z"},accSagittalDoubleSharp11v49CDown:{x_min:0,x_max:406,y_min:-359,y_max:172,ha:531,o:"m 45 -203 b 135 -23 45 -84 75 -23 l 203 -23 b 262 4 225 -23 245 -13 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 360 112 b 540 -68 480 112 540 53 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z"},accSagittalDoubleFlat11v49CUp:{x_min:0,x_max:406,y_min:-172,y_max:359,ha:531,o:"m 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 360 -112 540 -53 480 -112 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 262 -4 b 203 23 245 13 225 23 l 135 23 b 45 203 75 23 45 84 z"},accSagittalDoubleSharp143CDown:{x_min:0,x_max:469,y_min:-359,y_max:172,ha:531,o:"m 45 -203 b 135 -23 45 -84 75 -23 l 203 -23 b 262 4 225 -23 245 -13 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 337 49 l 675 -268 l 675 -112 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z"},accSagittalDoubleFlat143CUp:{x_min:0,x_max:469,y_min:-172,y_max:359,ha:531,o:"m 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 675 112 l 675 268 l 337 -49 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 262 -4 b 203 23 245 13 225 23 l 135 23 b 45 203 75 23 45 84 z"},accSagittalDoubleSharp17kDown:{x_min:0,x_max:438,y_min:-359,y_max:172,ha:531,o:"m 0 248 b 95 101 0 170 30 121 l 0 68 l 0 -30 l 364 96 l 399 0 l 390 -23 l 0 -157 l 0 -255 l 353 -135 l 225 -503 l 275 -517 l 428 -82 l 577 -517 l 631 -503 l 455 0 l 507 145 l 540 157 l 540 248 l 517 248 b 167 168 366 194 248 168 b 45 248 85 168 45 194 z m 416 115 l 442 124 l 428 82 z"},accSagittalDoubleFlat17kUp:{x_min:0,x_max:438,y_min:-172,y_max:359,ha:531,o:"m 45 -248 b 167 -168 45 -194 85 -168 b 517 -248 248 -168 366 -194 l 540 -248 l 540 -157 l 507 -145 l 455 0 l 631 503 l 577 517 l 428 82 l 275 517 l 225 503 l 353 135 l 0 255 l 0 157 l 390 23 l 399 0 l 364 -96 l 0 30 l 0 -68 l 95 -101 b 0 -248 30 -121 0 -170 z m 428 -82 l 442 -124 l 416 -115 z"},accSagittalDoubleSharp19sDown:{x_min:0,x_max:438,y_min:-359,y_max:172,ha:531,o:"m 0 -248 l 45 -248 l 45 -68 b 271 112 45 53 120 112 l 310 0 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 366 0 l 367 4 b 428 -23 386 -13 405 -23 l 495 -23 b 585 -203 554 -23 585 -84 l 631 -203 b 517 68 631 -23 593 68 l 449 68 b 337 248 400 68 363 127 l 225 248 b 0 68 75 248 0 187 z"},accSagittalDoubleFlat19sUp:{x_min:0,x_max:438,y_min:-172,y_max:359,ha:531,o:"m 0 -68 b 225 -248 0 -187 75 -248 l 337 -248 b 449 -68 363 -127 400 -68 l 517 -68 b 631 203 593 -68 631 23 l 585 203 b 495 23 585 84 554 23 l 428 23 b 367 -4 405 23 386 13 l 366 0 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 310 0 l 271 -112 b 45 68 120 -112 45 -53 l 45 248 l 0 248 z"},accSagittalShaftUp:{x_min:0,x_max:31,y_min:-359,y_max:172,ha:531,o:"m 0 112 l 0 -517 l 45 -517 l 45 112 l 23 248 z"},accSagittalShaftDown:{x_min:0,x_max:31,y_min:-172,y_max:359,ha:531,o:"m 23 -248 l 45 -112 l 45 517 l 0 517 l 0 -112 z"},accSagittalAcute:{x_min:0,x_max:125,y_min:-62,y_max:125,ha:187,o:"m 0 0 l 0 -89 l 180 89 l 180 180 z"},accSagittalGrave:{x_min:0,x_max:125,y_min:-125,y_max:62,ha:187,o:"m 180 -180 l 180 -89 l 0 89 l 0 0 z"},accSagittal1MinaUp:{x_min:-7,x_max:124,y_min:16,y_max:106.31676725154982,ha:90.31676725154982,o:"m -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 134 150 179 112 163 135 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z"},accSagittal1MinaDown:{x_min:-7,x_max:124,y_min:-106.31676725154983,y_max:-16,ha:90.31676725154983,o:"m -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 179 -23 163 -135 179 -112 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z"},accSagittal2MinasUp:{x_min:-7,x_max:218,y_min:16,y_max:106.31676725154982,ha:90.31676725154982,o:"m -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 207 65 179 23 200 55 b 252 107 223 86 240 107 b 271 23 264 107 272 86 l 314 23 b 269 150 314 112 298 135 b 203 130 252 158 220 150 b 173 92 190 115 181 104 b 134 150 167 127 154 140 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z"},accSagittal2MinasDown:{x_min:-7,x_max:218,y_min:-106.31676725154983,y_max:-16,ha:90.31676725154983,o:"m -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 173 -92 154 -140 167 -127 b 203 -130 181 -104 190 -115 b 269 -150 220 -150 252 -158 b 314 -23 298 -135 314 -112 l 271 -23 b 252 -107 272 -86 264 -107 b 207 -65 240 -107 223 -86 b 179 -23 200 -55 179 -23 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z"},accSagittal1TinaUp:{x_min:0,x_max:93,y_min:16,y_max:107,ha:91,o:"m 134 154 l 91 154 b 81 76 91 101 91 86 b 0 68 73 69 48 68 l 0 23 b 134 154 122 23 134 36 z"},accSagittal1TinaDown:{x_min:0,x_max:93,y_min:-107,y_max:-16,ha:91,o:"m 134 -154 b 0 -23 134 -36 122 -23 l 0 -68 b 81 -76 48 -68 73 -69 b 91 -154 91 -86 91 -101 z"},accSagittal2TinasUp:{x_min:0,x_max:94,y_min:16,y_max:107,ha:91,o:"m 135 68 b 89 154 94 68 89 124 l 46 154 b 36 92 45 131 42 105 b 0 68 32 82 23 68 l 0 23 b 68 63 29 23 53 40 b 135 23 84 39 104 23 z"},accSagittal2TinasDown:{x_min:0,x_max:94,y_min:-107,y_max:-16,ha:91,o:"m 135 -23 b 68 -63 104 -23 84 -39 b 0 -23 53 -40 29 -23 l 0 -68 b 36 -92 23 -68 32 -82 b 46 -154 42 -105 45 -131 l 89 -154 b 135 -68 89 -124 94 -68 z"},accSagittal3TinasUp:{x_min:-7,x_max:124,y_min:16,y_max:106.31676725154982,ha:90.31676725154982,o:"m -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 134 150 179 112 163 135 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z"},accSagittal3TinasDown:{x_min:-7,x_max:124,y_min:-106.31676725154983,y_max:-16,ha:90.31676725154983,o:"m -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 179 -23 163 -135 179 -112 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z"},accSagittal4TinasUp:{x_min:0,x_max:187,y_min:16,y_max:106.69999999999997,ha:90.69999999999997,o:"m 0 68 l 0 23 b 143 45 105 23 124 26 b 203 107 153 55 183 107 b 226 23 216 107 226 86 l 269 23 b 225 150 269 112 253 135 b 160 132 207 158 181 153 b 115 81 138 112 124 88 b 0 68 104 71 94 68 z"},accSagittal4TinasDown:{x_min:0,x_max:187,y_min:-106.69999999999999,y_max:-16,ha:90.69999999999999,o:"m 0 -68 b 115 -81 94 -68 104 -71 b 160 -132 124 -88 138 -112 b 225 -150 181 -153 207 -158 b 269 -23 253 -135 269 -112 l 226 -23 b 203 -107 226 -86 216 -107 b 143 -45 183 -107 153 -55 b 0 -23 124 -26 105 -23 z"},accSagittal5TinasUp:{x_min:0,x_max:218,y_min:16,y_max:107,ha:91,o:"m 135 23 b 187 45 156 23 168 26 b 249 107 197 55 228 107 b 271 23 262 107 271 86 l 314 23 b 269 150 314 112 298 135 b 204 132 252 158 226 153 b 160 81 183 112 168 88 b 135 68 148 71 147 68 b 89 154 94 68 89 124 l 46 154 b 36 92 45 131 42 105 b 0 68 32 82 23 68 l 0 23 b 68 63 29 23 53 40 b 135 23 84 39 104 23 z"},accSagittal5TinasDown:{x_min:0,x_max:218,y_min:-107,y_max:-16,ha:91,o:"m 135 -23 b 68 -63 104 -23 84 -39 b 0 -23 53 -40 29 -23 l 0 -68 b 36 -92 23 -68 32 -82 b 46 -154 42 -105 45 -131 l 89 -154 b 135 -68 89 -124 94 -68 b 160 -81 147 -68 148 -71 b 204 -132 168 -88 183 -112 b 269 -150 226 -153 252 -158 b 314 -23 298 -135 314 -112 l 271 -23 b 249 -107 271 -86 262 -107 b 187 -45 228 -107 197 -55 b 135 -23 168 -26 156 -23 z"},accSagittal6TinasUp:{x_min:-7,x_max:218,y_min:16,y_max:106.31676725154982,ha:90.31676725154982,o:"m -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 207 65 179 23 200 55 b 252 107 223 86 240 107 b 271 23 264 107 272 86 l 314 23 b 269 150 314 112 298 135 b 203 130 252 158 220 150 b 173 92 190 115 181 104 b 134 150 167 127 154 140 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z"},accSagittal6TinasDown:{x_min:-7,x_max:218,y_min:-106.31676725154983,y_max:-16,ha:90.31676725154983,o:"m -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 173 -92 154 -140 167 -127 b 203 -130 181 -104 190 -115 b 269 -150 220 -150 252 -158 b 314 -23 298 -135 314 -112 l 271 -23 b 252 -107 272 -86 264 -107 b 207 -65 240 -107 223 -86 b 179 -23 200 -55 179 -23 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z"},accSagittal7TinasUp:{x_min:0,x_max:281,y_min:16,y_max:106.69999999999997,ha:90.69999999999997,o:"m 0 68 l 0 23 b 143 45 105 23 124 26 b 203 107 153 55 183 107 b 226 23 216 107 226 86 l 269 23 b 298 65 269 23 291 55 b 343 107 314 86 331 107 b 361 23 354 107 363 86 l 405 23 b 360 150 405 112 389 135 b 294 130 343 158 311 150 b 264 92 281 115 272 104 b 225 150 258 127 245 140 b 160 132 207 158 181 153 b 115 81 138 112 124 88 b 0 68 104 71 94 68 z"},accSagittal7TinasDown:{x_min:0,x_max:281,y_min:-106.69999999999999,y_max:-16,ha:90.69999999999999,o:"m 0 -68 b 115 -81 94 -68 104 -71 b 160 -132 124 -88 138 -112 b 225 -150 181 -153 207 -158 b 264 -92 245 -140 258 -127 b 294 -130 272 -104 281 -115 b 360 -150 311 -150 343 -158 b 405 -23 389 -135 405 -112 l 361 -23 b 343 -107 363 -86 354 -107 b 298 -65 331 -107 314 -86 b 269 -23 291 -55 269 -23 l 226 -23 b 203 -107 226 -86 216 -107 b 143 -45 183 -107 153 -55 b 0 -23 124 -26 105 -23 z"},accSagittal8TinasUp:{x_min:0,x_max:312,y_min:16,y_max:107,ha:91,o:"m 135 23 b 187 45 156 23 168 26 b 249 107 197 55 228 107 b 271 23 262 107 271 86 l 314 23 b 343 65 314 23 336 55 b 387 107 359 86 376 107 b 406 23 399 107 408 86 l 449 23 b 405 150 449 112 433 135 b 338 130 387 158 356 150 b 308 92 325 115 317 104 b 269 150 302 127 289 140 b 204 132 252 158 226 153 b 160 81 183 112 168 88 b 135 68 148 71 147 68 b 89 154 94 68 89 124 l 46 154 b 36 92 45 131 42 105 b 0 68 32 82 23 68 l 0 23 b 68 63 29 23 53 40 b 135 23 84 39 104 23 z"},accSagittal8TinasDown:{x_min:0,x_max:312,y_min:-107,y_max:-16,ha:91,o:"m 135 -23 b 68 -63 104 -23 84 -39 b 0 -23 53 -40 29 -23 l 0 -68 b 36 -92 23 -68 32 -82 b 46 -154 42 -105 45 -131 l 89 -154 b 135 -68 89 -124 94 -68 b 160 -81 147 -68 148 -71 b 204 -132 168 -88 183 -112 b 269 -150 226 -153 252 -158 b 308 -92 289 -140 302 -127 b 338 -130 317 -104 325 -115 b 405 -150 356 -150 387 -158 b 449 -23 433 -135 449 -112 l 406 -23 b 387 -107 408 -86 399 -107 b 343 -65 376 -107 359 -86 b 314 -23 336 -55 314 -23 l 271 -23 b 249 -107 271 -86 262 -107 b 187 -45 228 -107 197 -55 b 135 -23 168 -26 156 -23 z"},accSagittal9TinasUp:{x_min:-7,x_max:312,y_min:16,y_max:106.31676725154982,ha:90.31676725154982,o:"m -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 207 65 179 23 200 55 b 252 107 223 86 240 107 b 271 23 264 107 272 86 l 314 23 b 343 65 314 23 336 55 b 387 107 359 86 376 107 b 406 23 399 107 408 86 l 449 23 b 405 150 449 112 433 135 b 338 130 387 158 356 150 b 308 92 325 115 317 104 b 269 150 302 127 289 140 b 203 130 252 158 220 150 b 173 92 190 115 181 104 b 134 150 167 127 154 140 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z"},accSagittal9TinasDown:{x_min:-7,x_max:312,y_min:-106.31676725154983,y_max:-16,ha:90.31676725154983,o:"m -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 173 -92 154 -140 167 -127 b 203 -130 181 -104 190 -115 b 269 -150 220 -150 252 -158 b 308 -92 289 -140 302 -127 b 338 -130 317 -104 325 -115 b 405 -150 356 -150 387 -158 b 449 -23 433 -135 449 -112 l 406 -23 b 387 -107 408 -86 399 -107 b 343 -65 376 -107 359 -86 b 314 -23 336 -55 314 -23 l 271 -23 b 252 -107 272 -86 264 -107 b 207 -65 240 -107 223 -86 b 179 -23 200 -55 179 -23 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z"},accSagittalFractionalTinaUp:{x_min:-3,x_max:35,y_min:73,y_max:111,ha:38,o:"m -4 132 b 23 105 -4 118 9 105 b 50 132 37 105 50 118 b 23 160 50 147 37 160 b -4 132 9 160 -4 147 z"},accSagittalFractionalTinaDown:{x_min:-3,x_max:35,y_min:-111,y_max:-73,ha:38,o:"m -4 -132 b 23 -160 -4 -147 9 -160 b 50 -132 37 -160 50 -147 b 23 -105 50 -118 37 -105 b -4 -132 9 -105 -4 -118 z"},accidentalNarrowReversedFlat:{x_min:0,x_max:164,y_min:-194,y_max:421,ha:615,o:"m 236 -279 l 236 606 l 192 606 l 192 179 b 85 243 150 222 114 243 b 0 84 23 243 0 134 b 112 -158 0 3 37 -78 z m 192 112 l 192 -163 l 135 -98 b 82 40 101 -50 82 -3 b 138 144 82 73 96 144 b 192 112 153 144 170 132 z"},accidentalNarrowReversedFlatAndFlat:{x_min:0,x_max:414,y_min:-194,y_max:421,ha:615,o:"m 281 606 l 281 -268 l 438 -158 b 596 84 547 -82 596 3 b 475 243 596 154 556 243 b 325 179 435 243 384 222 l 325 606 z m 235 -279 l 235 606 l 190 606 l 190 179 b 85 243 148 222 114 243 b 12 158 52 243 27 215 b 0 84 3 134 0 108 b 112 -158 0 3 37 -78 z m 325 111 b 410 144 359 132 386 144 b 498 36 462 144 498 84 b 413 -107 498 -9 469 -58 l 325 -173 z m 192 112 l 192 -163 l 135 -98 b 81 40 99 -50 81 -3 b 91 94 81 59 84 76 b 137 144 102 127 118 144 b 192 112 153 144 170 132 z"},accidentalWilsonPlus:{x_min:0,x_max:281,y_min:-203,y_max:203,ha:406,o:"m 405 268 l 225 98 l 225 292 l 180 292 l 180 56 l 0 -112 l 0 -268 l 180 -98 l 180 -292 l 225 -292 l 225 -56 l 405 112 z"},accidentalWilsonMinus:{x_min:0,x_max:281,y_min:-186,y_max:186,ha:372,o:"m 0 112 l 405 -268 l 405 -112 l 0 268 z"}},fontFamily:"Bravura",resolution:1e3,generatedOn:"2021-12-06T21:04:30.234Z"},metrics:{name:"Bravura",smufl:!0,stave:{padding:12,endPaddingMax:10,endPaddingMin:5,unalignedNotePadding:10},accidental:{noteheadAccidentalPadding:1,leftPadding:2,accidentalSpacing:3},clef:{default:{point:32,width:26},small:{point:26,width:20},annotations:{"8va":{smuflCode:"timeSig8",default:{point:18,treble:{line:-1.4,shiftX:12}},small:{point:16,treble:{line:-.2,shiftX:8}}},"8vb":{smuflCode:"timeSig8",default:{point:18,treble:{line:6,shiftX:10},bass:{line:3.5,shiftX:1}},small:{point:16,treble:{line:5.3,shiftX:6},bass:{line:3.1,shiftX:.5}}}},lineCount:{8:{point:55,shiftY:14},7:{point:47,shiftY:8},6:{point:32,shiftY:1},5:{point:30,shiftY:-6},4:{point:23,shiftY:-12}}},parenthesis:{default:{point:39,width:7},gracenote:{point:23.4,width:3}},pedalMarking:{up:{point:40},down:{point:34}},digits:{shiftLine:-1,point:34,tupletPoint:22,shiftY:-6},articulation:{articStaccatissimoAbove:{padding:2},articStaccatissimoBelow:{padding:2}},tremolo:{default:{point:25,spacing:5,offsetYStemUp:-5,offsetYStemDown:5,offsetXStemUp:11,offsetXStemDown:1},grace:{point:18,spacing:4,offsetYStemUp:-5,offsetYStemDown:5,offsetXStemUp:7,offsetXStemDown:1}},staveRepetition:{default:{offsetY:25,offsetSymbol:12,spacing:5}},stem:{heightAdjustmentForFlag:-3,noteHead:{noteheadTriangleUpHalf:{offsetYBaseStemUp:5,offsetYBaseStemDown:4},noteheadTriangleUpBlack:{offsetYBaseStemUp:5,offsetYBaseStemDown:4},noteheadTriangleUpWhole:{offsetYBaseStemUp:5,offsetYBaseStemDown:4},noteheadXHalf:{offsetYBaseStemUp:-4,offsetYBaseStemDown:4},noteheadXBlack:{offsetYBaseStemUp:-4,offsetYBaseStemDown:4},noteheadXWhole:{offsetYBaseStemUp:-4,offsetYBaseStemDown:4},noteheadHalf:{offsetYBaseStemUp:-2.55,offsetYBaseStemDown:2.65},noteheadBlack:{offsetYBaseStemUp:-2,offsetYBaseStemDown:2},noteheadSquareWhite:{offsetYBaseStemDown:-5,offsetYBaseStemUp:5}}},glyphs:{coda:{point:20,shiftX:-7,shiftY:8},segno:{shiftX:-7},flag:{shiftX:-.75,tabStem:{shiftX:-1.75},staveTempo:{shiftX:-1}},clef:{gClef:{default:{scale:1.1,shiftY:1},small:{shiftY:1.5}},fClef:{default:{shiftY:-.5}}},ornament:{ornamentTurn:{scale:1.2},ornamentTurnSlash:{scale:1.2}},stringNumber:{verticalPadding:8,stemPadding:2,leftPadding:5,rightPadding:6},stroke:{arrowheadBlackDown:{straight:{shiftX:-4.5},wiggly:{shiftX:-1,shiftY:1}},arrowheadBlackUp:{straight:{shiftX:-.85},wiggly:{shiftX:-1,shiftY:1}}},textNote:{point:34,breathMarkTick:{point:36,shiftY:9},breathMarkComma:{point:36},segno:{point:30,shiftX:-7,shiftY:8},coda:{point:20,shiftX:-7,shiftY:8},ornamentTrill:{shiftX:-8,shiftY:8},ornamentTurn:{point:42},ornamentTurnSlash:{point:42},ornamentMordent:{shiftX:-8},ornamentShortTrill:{shiftX:-8}},noteHead:{minPadding:2,standard:{restQuarterStemUp:{point:35},restQuarterStemDown:{point:35}},custom:{noteheadCircleXStemUp:{shiftX:1.5},noteheadCircleXStemDown:{shiftX:.25},noteheadDiamondHalfStemUp:{shiftX:1.5},noteheadDiamondBlackStemUp:{shiftX:1.5},noteheadDiamondWholeStemUp:{shiftX:1},noteheadXHalfStemUp:{shiftX:-2},noteheadXHalfStemDown:{shiftX:1},noteheadXWholeStemUp:{shiftX:-4},noteheadXWholeStemDown:{shiftX:1},noteheadSquareWhiteStemDown:{shiftX:.25},noteheadSquareWhiteStemUp:{shiftX:-.75},noteheadSquareBlackStemUp:{shiftX:-.75},noteheadTriangleUpWholeStemUp:{shiftX:-.75}}},chordSymbol:{global:{superscriptOffset:-400,subscriptOffset:300,kerningOffset:-250,lowerKerningText:["D","F","P","T","V","Y"],upperKerningText:["A","L"],spacing:100,superSubRatio:.66},csymDiminished:{scale:.8,leftSideBearing:-32,advanceWidth:506,yOffset:0},csymHalfDiminished:{scale:.8,leftSideBearing:-32,advanceWidth:506,yOffset:0},csymAugmented:{scale:1,leftSideBearing:0,advanceWidth:530,yOffset:0},csymParensLeftTall:{scale:.8,leftSideBearing:-20,advanceWidth:184,yOffset:250},csymParensRightTall:{scale:.8,leftSideBearing:0,advanceWidth:189,yOffset:250},csymBracketLeftTall:{scale:.8,leftSideBearing:0,advanceWidth:328,yOffset:0},csymBracketRightTall:{scale:.8,leftSideBearing:1,advanceWidth:600,yOffset:0},csymParensLeftVeryTall:{scale:.9,leftSideBearing:50,advanceWidth:121,yOffset:350},csymParensRightVeryTall:{scale:.9,leftSideBearing:0,advanceWidth:111,yOffset:350},csymDiagonalArrangementSlash:{scale:.6,leftSideBearing:-1,advanceWidth:990,yOffset:0},csymMinor:{scale:.8,leftSideBearing:0,advanceWidth:482,yOffset:0},csymMajorSeventh:{scale:.9,leftSideBearing:200,yOffset:0,advanceWidth:600},accidentalSharp:{scale:.75,leftSideBearing:20,advanceWidth:250,yOffset:-302},accidentalFlat:{scale:.9,leftSideBearing:-20,advanceWidth:226,yOffset:-184}},jazzOrnaments:{brassScoop:{scale:1,xOffset:-12,yOffset:0,stemUpYOffset:0,reportedWidth:10},brassDoitMedium:{scale:1,xOffset:16,yOffset:0,stemUpYOffset:0,reportedWidth:15},brassFallLipShort:{scale:1,xOffset:16,yOffset:0,stemUpYOffset:0,reportedWidth:5},brassLiftMedium:{scale:1,xOffset:16,yOffset:5,stemUpYOffset:0,reportedWidth:5},brassFallRoughMedium:{scale:1,xOffset:16,yOffset:28,stemUpYOffset:0,reportedWidth:5},brassBend:{scale:1,xOffset:2,yOffset:-8,stemUpYOffset:25,reportedWidth:5},brassMuteClosed:{scale:1,xOffset:3,yOffset:-8,stemUpYOffset:25,reportedWidth:5},brassMuteOpen:{scale:1,xOffset:3,yOffset:-7,stemUpYOffset:25,reportedWidth:5},brassFlip:{scale:1,xOffset:10,yOffset:-4,stemUpYOffset:0,reportedWidth:5},brassJazzTurn:{scale:1,xOffset:6,yOffset:-4,stemUpYOffset:0,reportedWidth:5},brassSmear:{scale:1,xOffset:10,yOffset:-4,stemUpYOffset:0,reportedWidth:5}},tuplet:{noteHeadOffset:20,stemOffset:10,bottomLine:4,topModifierOffset:15}}}};return l=l.default})()})); +//# sourceMappingURL=vexflow-font-bravura.js.map \ No newline at end of file diff --git a/build/cjs/vexflow-font-bravura.js.map b/build/cjs/vexflow-font-bravura.js.map new file mode 100644 index 0000000000..8f62053912 --- /dev/null +++ b/build/cjs/vexflow-font-bravura.js.map @@ -0,0 +1 @@ +{"version":3,"file":"vexflow-font-bravura.js","mappings":"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","sources":["webpack://VexFlowFont.Bravura/webpack/universalModuleDefinition","webpack://VexFlowFont.Bravura/webpack/bootstrap","webpack://VexFlowFont.Bravura/webpack/runtime/define property getters","webpack://VexFlowFont.Bravura/webpack/runtime/hasOwnProperty shorthand","webpack://VexFlowFont.Bravura/./src/fonts/bravura_glyphs.ts","webpack://VexFlowFont.Bravura/./entry/vexflow-font-bravura.ts","webpack://VexFlowFont.Bravura/./src/fonts/bravura_metrics.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"VexFlowFont\"] = factory();\n\telse\n\t\troot[\"VexFlowFont\"] = root[\"VexFlowFont\"] || {}, root[\"VexFlowFont\"][\"Bravura\"] = factory();\n})((typeof window !== 'undefined' ? window : typeof globalThis !== 'undefined' ? globalThis : this), function() {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","export const BravuraFont = {\n glyphs: {\n bracketTop: {\n x_min: 0,\n x_max: 469,\n y_min: 0,\n y_max: 295,\n ha: 295,\n o: 'm 0 0 l 180 0 b 674 390 410 43 616 150 b 675 405 675 396 675 400 b 664 425 675 416 671 422 b 628 405 651 425 635 415 b 157 179 613 389 432 199 l 12 179 b 0 168 3 179 0 177 z',\n },\n bracketBottom: {\n x_min: 0,\n x_max: 469,\n y_min: -295,\n y_max: 0,\n ha: 295,\n o: 'm 0 -168 b 12 -179 0 -177 3 -179 l 157 -179 b 628 -405 432 -199 613 -389 b 664 -425 635 -415 651 -425 b 675 -405 671 -422 675 -416 b 674 -390 675 -400 675 -396 b 180 0 616 -150 410 -43 l 0 0 z',\n },\n barlineTick: {\n x_min: 0,\n x_max: 36,\n y_min: 868,\n y_max: 1120,\n ha: 252,\n o: 'm 52 1250 l 52 1613 l 0 1613 l 0 1250 z',\n },\n breathMarkTick: {\n x_min: 0,\n x_max: 500,\n y_min: 0,\n y_max: 502,\n ha: 502,\n o: 'm 9 367 b 0 374 6 372 3 374 b 9 334 0 367 0 343 b 179 19 40 312 164 121 b 192 0 179 3 186 0 b 210 19 197 0 207 6 b 698 701 245 197 507 658 b 720 714 714 704 720 711 b 698 723 720 720 711 723 b 197 186 455 714 210 202 b 186 176 194 179 189 176 b 176 186 179 176 176 186 b 9 367 143 266 27 359 z',\n },\n segno: {\n x_min: 4,\n x_max: 550,\n y_min: -27,\n y_max: 759,\n ha: 786,\n o: 'm 194 958 b 217 939 203 958 213 955 l 220 929 b 325 805 230 890 252 805 b 425 901 384 805 425 840 b 413 969 425 923 420 946 b 220 1060 390 1035 294 1060 b 6 793 120 1060 6 936 b 29 687 6 759 13 723 b 295 449 75 582 284 454 b 304 438 301 446 304 444 b 295 415 304 432 301 425 b 78 22 285 395 78 22 b 73 3 75 16 73 9 b 114 -39 73 -20 91 -39 b 150 -17 128 -39 143 -30 b 377 395 150 -17 373 386 b 395 402 377 393 389 402 b 704 176 416 397 704 312 b 621 75 704 120 670 82 l 616 73 b 562 138 586 73 562 94 l 562 154 b 485 249 562 209 526 249 b 468 246 480 249 474 248 b 366 153 415 233 366 210 b 540 -12 366 65 455 -12 b 600 -1 559 -12 579 -9 b 792 251 716 37 792 131 b 789 292 792 264 791 278 b 523 588 768 451 540 579 b 498 611 505 598 498 603 b 501 619 498 613 500 616 b 732 1032 508 631 732 1032 b 737 1053 736 1040 737 1045 b 697 1093 737 1076 719 1093 b 661 1073 683 1093 668 1086 b 423 647 661 1073 432 660 b 410 635 419 639 416 635 b 396 639 406 635 402 636 b 128 792 383 644 166 727 b 108 868 120 808 108 838 b 186 958 108 907 125 948 z m 598 671 b 680 589 598 626 635 589 b 762 671 726 589 762 626 b 680 753 762 717 726 753 b 598 671 635 753 598 717 z m 202 380 b 120 462 202 425 166 462 b 37 380 75 462 37 425 b 120 298 37 334 75 298 b 202 380 166 298 202 334 z',\n },\n coda: {\n x_min: -4,\n x_max: 955,\n y_min: -158,\n y_max: 898,\n ha: 1056,\n o: 'm 1349 576 l 1178 576 b 729 1083 1164 847 962 1064 l 729 1269 b 694 1293 729 1287 713 1293 b 660 1269 675 1293 660 1287 l 660 1083 b 210 576 426 1064 226 848 l 20 576 b -6 541 0 576 -6 560 b 20 507 -6 523 0 507 l 210 507 b 660 0 226 238 426 19 l 660 -202 b 694 -228 660 -222 675 -228 b 729 -202 713 -228 729 -222 l 729 0 b 1178 507 962 19 1164 238 l 1349 507 b 1375 541 1369 507 1375 523 b 1349 576 1375 560 1369 576 z m 940 576 l 729 576 l 729 1002 b 940 576 930 985 940 809 z m 660 1002 l 660 576 l 455 576 b 660 1002 455 809 455 985 z m 455 507 l 660 507 l 660 69 b 455 507 474 91 456 285 z m 729 69 l 729 507 l 940 507 b 729 69 936 287 909 91 z',\n },\n gClef: {\n x_min: 0,\n x_max: 671,\n y_min: -658,\n y_max: 1098,\n ha: 1756,\n o: 'm 541 598 b 550 625 539 615 541 616 b 824 1174 706 770 824 953 b 730 1509 824 1299 789 1423 b 655 1581 708 1541 671 1581 b 562 1512 635 1581 590 1544 b 420 1064 455 1394 420 1214 b 441 828 420 981 431 887 b 428 793 444 811 445 808 b 0 125 220 622 0 416 b 524 -363 0 -125 171 -363 b 624 -354 557 -363 595 -360 b 645 -367 639 -351 642 -350 b 684 -657 662 -464 684 -589 b 455 -896 684 -870 540 -896 b 340 -854 377 -896 340 -873 b 386 -829 340 -844 353 -840 b 482 -694 431 -816 482 -778 b 344 -547 482 -615 432 -547 b 190 -713 248 -547 190 -624 b 464 -948 190 -806 246 -948 b 747 -660 560 -948 747 -904 b 706 -351 747 -577 721 -441 b 724 -327 703 -334 704 -336 b 966 16 870 -269 966 -147 b 619 363 966 200 831 363 b 577 389 582 363 582 363 z m 677 1358 b 763 1240 724 1358 763 1319 b 513 851 763 1080 626 950 b 494 863 503 842 497 844 b 485 995 488 900 485 949 b 677 1358 485 1220 589 1358 z m 520 377 b 498 343 524 350 524 351 b 289 63 372 300 289 186 b 455 -192 289 -66 357 -158 b 494 -200 467 -196 484 -200 b 511 -184 505 -200 511 -193 b 490 -166 511 -174 500 -170 b 386 -12 429 -140 386 -78 b 530 157 386 71 442 132 b 559 145 553 163 556 161 l 631 -284 b 611 -304 634 -300 632 -300 b 530 -311 588 -308 559 -311 b 115 29 278 -311 115 -171 b 249 363 115 114 130 228 b 469 567 336 459 402 513 b 490 562 484 579 487 577 z m 619 148 b 635 168 616 166 618 170 b 848 -66 752 158 848 60 b 713 -271 848 -157 793 -230 b 690 -262 696 -279 693 -279 z',\n },\n cClef: {\n x_min: 0,\n x_max: 699,\n y_min: -506,\n y_max: 506,\n ha: 1012,\n o: 'm 331 694 b 301 724 331 714 321 724 l 300 724 b 269 694 279 724 269 714 l 269 -694 b 300 -724 269 -714 279 -724 l 301 -724 b 331 -694 321 -724 331 -714 l 331 -63 b 344 -55 331 -52 338 -53 b 472 -265 382 -65 442 -102 b 500 -301 477 -288 485 -301 b 530 -262 516 -301 523 -287 b 684 -128 549 -199 582 -128 b 804 -409 778 -128 804 -220 b 651 -683 804 -598 770 -683 b 528 -644 631 -683 528 -674 b 567 -622 528 -636 552 -628 b 625 -528 596 -612 625 -583 b 527 -429 625 -465 583 -429 b 416 -547 465 -429 416 -471 b 667 -729 416 -638 495 -729 b 1007 -413 903 -729 1007 -563 b 706 -76 1007 -215 897 -76 b 618 -89 664 -76 636 -84 b 576 -88 603 -94 589 -96 b 524 0 556 -75 524 -29 b 576 88 524 29 556 75 b 618 89 589 96 603 94 b 706 76 636 84 664 76 b 1007 413 897 76 1007 215 b 667 729 1007 563 903 729 b 416 547 495 729 416 638 b 527 429 416 471 465 429 b 625 528 583 429 625 465 b 567 622 625 583 596 612 b 528 644 552 628 528 636 b 651 683 528 674 631 683 b 804 409 770 683 804 598 b 684 128 804 220 778 128 b 530 262 582 128 549 199 b 500 301 523 287 516 301 b 472 265 485 301 477 288 b 344 55 442 102 382 65 b 331 63 338 53 331 52 z m 30 724 b 0 694 10 724 0 714 l 0 -694 b 30 -724 0 -714 10 -724 l 154 -724 b 184 -694 174 -724 184 -714 l 184 694 b 154 724 184 714 174 724 z',\n },\n fClef: {\n x_min: -5,\n x_max: 684,\n y_min: -635,\n y_max: 262,\n ha: 897,\n o: 'm 363 377 b 0 56 112 377 0 194 b 177 -158 0 -59 60 -158 b 330 -6 268 -158 330 -95 b 192 144 330 86 262 144 b 120 134 153 144 138 134 b 96 160 101 134 96 145 b 330 323 96 217 183 323 b 549 -53 482 323 549 173 b 14 -871 549 -455 350 -680 b -7 -897 1 -878 -7 -886 b 12 -914 -7 -906 -1 -914 b 36 -907 19 -914 27 -912 b 765 -40 390 -734 765 -478 b 363 377 765 210 612 377 z m 906 259 b 827 180 861 259 827 225 b 906 101 827 135 861 101 b 985 180 950 101 985 135 b 906 259 985 225 950 259 z m 907 -102 b 829 -180 863 -102 829 -135 b 907 -258 829 -225 863 -258 b 985 -180 952 -258 985 -225 b 907 -102 985 -135 952 -102 z',\n },\n unpitchedPercussionClef1: {\n x_min: 0,\n x_max: 382,\n y_min: -250,\n y_max: 250,\n ha: 500,\n o: 'm 230 -338 l 230 338 b 210 360 230 350 222 360 l 20 360 b 0 338 9 360 0 350 l 0 -338 b 20 -360 0 -350 9 -360 l 210 -360 b 230 -338 222 -360 230 -350 z m 550 338 b 530 360 550 350 541 360 l 340 360 b 320 338 328 360 320 350 l 320 -338 b 340 -360 320 -350 328 -360 l 530 -360 b 550 -338 541 -360 550 -350 z',\n },\n '6stringTabClef': {\n x_min: -3,\n x_max: 408,\n y_min: -748,\n y_max: 764,\n ha: 1512,\n o: 'm 557 1024 l 557 1100 l 26 1100 l 26 1024 l 249 1024 l 249 422 l 336 422 l 336 1024 z m 588 -328 l 350 348 l 238 348 l -4 -328 l 88 -328 l 160 -125 l 420 -125 l 491 -328 z m 397 -52 l 181 -52 l 292 256 z m 544 -883 b 420 -719 544 -802 507 -752 b 514 -572 482 -690 514 -639 b 314 -399 514 -472 442 -399 l 39 -399 l 39 -1077 l 344 -1077 b 544 -883 467 -1077 544 -995 z m 428 -583 b 292 -691 428 -652 389 -691 l 125 -691 l 125 -475 l 292 -475 b 428 -583 389 -475 428 -514 z m 458 -884 b 337 -1001 458 -949 418 -1001 l 125 -1001 l 125 -768 l 337 -768 b 458 -884 418 -768 458 -818 z',\n },\n timeSig0: {\n x_min: 20,\n x_max: 450,\n y_min: -250,\n y_max: 251,\n ha: 501,\n o: 'm 648 0 b 338 361 648 200 510 361 b 29 0 167 361 29 200 b 338 -360 29 -199 167 -360 b 648 0 510 -360 648 -199 z m 338 317 b 446 10 397 317 446 180 b 338 -295 446 -158 397 -295 b 230 10 278 -295 230 -158 b 338 317 230 180 278 317 z',\n },\n timeSig1: {\n x_min: 20,\n x_max: 314,\n y_min: -250,\n y_max: 251,\n ha: 501,\n o: 'm 35 19 b 29 0 35 19 29 10 b 45 -20 29 -7 33 -16 b 58 -23 50 -22 56 -23 b 78 -10 72 -23 78 -10 b 156 117 78 -10 140 89 b 170 131 161 127 167 131 b 179 111 176 131 179 120 l 179 -261 b 115 -315 179 -294 145 -315 b 91 -337 105 -315 91 -320 b 122 -360 91 -353 104 -360 l 429 -360 b 452 -337 452 -360 452 -337 b 431 -315 452 -337 452 -315 b 384 -265 410 -315 384 -289 l 384 328 b 356 361 384 351 376 360 b 281 356 336 361 300 356 b 206 360 253 356 228 357 b 199 361 203 360 200 361 b 173 334 184 361 179 347 z',\n },\n timeSig2: {\n x_min: 20,\n x_max: 426,\n y_min: -257,\n y_max: 254,\n ha: 511,\n o: 'm 606 -131 b 589 -111 606 -114 599 -111 b 570 -127 577 -111 573 -117 l 569 -128 b 513 -192 554 -164 543 -192 b 488 -187 505 -192 498 -190 b 445 -171 469 -180 459 -179 b 289 -137 416 -160 348 -137 b 236 -145 271 -137 252 -140 b 422 -42 268 -94 390 -50 b 613 147 523 -14 613 27 b 330 366 613 300 464 366 b 69 275 229 366 140 357 b 29 170 45 245 29 209 b 42 108 29 150 33 130 b 160 29 63 63 108 29 b 261 156 248 29 261 120 b 161 275 261 242 161 246 b 275 330 164 295 190 330 b 405 192 403 330 405 233 b 193 -102 405 60 297 -39 b 33 -317 114 -153 58 -223 l 32 -321 b 69 -370 32 -340 48 -370 b 203 -282 101 -370 118 -282 b 410 -360 261 -282 282 -360 b 606 -131 472 -360 583 -354 z',\n },\n timeSig3: {\n x_min: 20,\n x_max: 401,\n y_min: -251,\n y_max: 249,\n ha: 500,\n o: 'm 307 357 b 301 357 305 357 304 357 l 291 359 b 285 359 289 359 287 359 b 37 200 161 359 37 276 b 154 84 37 153 65 89 l 161 84 b 256 177 225 84 256 130 l 256 189 b 209 248 252 242 216 245 b 180 268 202 251 180 248 l 180 274 b 240 310 183 298 228 310 b 374 199 363 310 374 233 l 374 189 b 199 36 374 82 289 40 b 164 12 184 35 164 27 b 200 -6 164 -6 189 -6 b 379 -137 366 -6 379 -118 b 269 -307 379 -289 301 -307 b 256 -305 264 -307 258 -305 b 216 -282 245 -304 217 -304 l 216 -275 b 249 -180 216 -243 248 -222 b 145 -76 249 -120 207 -76 b 130 -78 140 -76 135 -76 b 60 -115 105 -82 78 -96 b 29 -203 36 -137 29 -171 b 275 -361 32 -315 134 -359 l 288 -361 b 577 -161 431 -361 577 -288 l 577 -151 b 537 -50 575 -109 564 -82 b 503 -20 528 -39 517 -29 l 472 -3 l 425 10 b 410 17 418 12 413 12 b 409 24 409 20 409 22 b 415 37 409 30 410 36 b 459 50 431 42 446 43 b 547 181 517 78 547 115 b 307 357 547 314 367 353 z',\n },\n timeSig4: {\n x_min: 20,\n x_max: 450,\n y_min: -250,\n y_max: 251,\n ha: 501,\n o: 'm 521 -107 l 521 202 b 504 226 521 213 520 226 b 475 213 491 226 484 223 l 338 48 b 325 14 333 40 325 32 l 325 -107 l 131 -107 b 481 336 246 -9 477 318 l 482 340 b 461 361 482 353 472 361 b 363 359 448 361 389 359 b 261 361 337 359 272 361 b 228 334 248 361 228 357 b 43 -105 228 156 86 -45 l 35 -117 b 35 -118 35 -117 35 -118 l 33 -120 b 29 -137 30 -127 29 -132 b 58 -161 29 -151 40 -161 l 325 -161 l 325 -252 b 268 -302 325 -291 294 -302 b 235 -330 245 -302 235 -315 b 262 -360 235 -344 240 -360 l 569 -360 b 598 -330 583 -360 598 -350 b 566 -301 598 -310 580 -301 b 521 -246 552 -301 521 -292 l 521 -161 l 626 -161 b 648 -134 641 -161 648 -151 b 626 -107 648 -117 642 -107 z',\n },\n timeSig5: {\n x_min: 20,\n x_max: 383,\n y_min: -251,\n y_max: 246,\n ha: 497,\n o: 'm 109 85 b 117 179 109 85 115 166 b 138 197 118 190 125 197 l 144 197 b 285 184 158 194 226 184 b 492 323 485 184 492 300 b 472 353 492 341 488 353 b 295 340 454 353 341 340 b 101 354 249 340 125 351 b 66 330 75 354 68 341 l 50 10 l 50 7 b 79 -14 50 -12 65 -14 b 111 14 94 -14 95 -1 b 209 62 125 29 160 62 b 357 -125 258 62 357 35 b 235 -304 357 -284 272 -304 b 202 -300 223 -304 212 -304 b 184 -279 194 -295 186 -289 b 202 -259 184 -269 194 -264 b 256 -163 235 -239 256 -203 b 144 -50 256 -99 206 -50 b 30 -157 66 -50 35 -107 b 29 -183 29 -166 29 -174 b 284 -361 29 -302 107 -361 b 552 -125 456 -361 552 -255 b 314 112 552 6 445 112 b 122 71 230 112 168 98 b 115 69 120 69 117 69 b 109 79 109 69 109 75 z',\n },\n timeSig6: {\n x_min: 20,\n x_max: 414,\n y_min: -249,\n y_max: 251,\n ha: 500,\n o: 'm 439 120 b 554 229 500 120 554 167 b 553 245 554 235 554 239 b 348 361 539 337 426 361 b 85 209 239 360 137 307 b 29 4 53 148 29 72 l 29 -1 b 73 -200 30 -68 42 -143 b 324 -359 132 -307 203 -359 b 513 -307 389 -359 461 -348 b 596 -137 563 -266 596 -202 b 379 72 596 -24 490 72 b 248 22 333 72 285 55 b 239 19 245 19 242 19 b 226 53 230 19 226 30 b 346 327 230 320 315 327 b 393 305 374 327 393 320 b 357 251 393 285 366 268 b 347 209 350 238 347 223 b 369 150 347 187 354 166 b 439 120 379 131 420 120 z m 320 3 b 405 -158 366 3 405 -69 b 320 -320 405 -248 366 -320 b 236 -158 274 -320 236 -248 b 320 3 236 -69 274 3 z',\n },\n timeSig7: {\n x_min: 20,\n x_max: 421,\n y_min: -250,\n y_max: 249,\n ha: 499,\n o: 'm 606 294 b 582 351 606 333 606 351 b 552 336 580 351 557 346 b 485 236 541 318 521 236 b 262 359 449 236 382 359 b 137 307 179 359 157 325 b 98 281 117 288 108 282 b 60 315 86 281 68 301 b 43 325 58 321 50 325 b 29 308 36 325 29 321 l 29 71 b 45 48 29 71 30 48 b 66 76 56 48 60 60 b 164 196 81 112 99 196 b 374 88 222 196 291 88 b 446 118 415 88 435 109 b 459 124 451 121 456 124 b 469 111 465 124 468 120 b 272 -112 469 71 359 -10 b 173 -315 217 -176 173 -259 b 200 -360 173 -346 173 -360 b 294 -347 226 -360 258 -347 b 412 -360 330 -347 397 -360 b 435 -307 426 -360 435 -348 b 606 288 435 -66 606 140 z',\n },\n timeSig8: {\n x_min: 20,\n x_max: 416,\n y_min: -259,\n y_max: 259,\n ha: 518,\n o: 'm 481 52 b 567 204 533 85 567 132 b 317 373 567 351 356 373 b 36 176 150 373 36 297 b 161 -16 36 76 92 23 b 29 -190 86 -52 29 -99 b 301 -373 29 -315 158 -373 b 599 -117 445 -373 599 -311 b 481 52 599 -30 549 17 z m 406 85 b 168 240 291 125 168 150 b 314 331 168 301 251 331 b 482 207 360 331 482 308 b 406 85 482 150 454 112 z m 295 -325 b 111 -183 199 -325 111 -276 b 225 -48 111 -125 161 -72 b 436 -219 330 -94 436 -124 b 295 -325 436 -276 392 -325 z',\n },\n timeSig9: {\n x_min: 20,\n x_max: 414,\n y_min: -249,\n y_max: 251,\n ha: 500,\n o: 'm 186 -117 b 71 -226 125 -117 71 -164 b 72 -242 71 -232 71 -236 b 276 -359 86 -334 199 -359 b 540 -206 386 -357 488 -304 b 596 -1 572 -145 596 -69 l 596 4 b 552 203 595 71 583 145 b 301 361 492 310 422 361 b 112 310 236 361 164 351 b 29 140 62 269 29 204 b 246 -69 29 27 135 -69 b 377 -19 292 -69 340 -52 b 386 -16 380 -16 383 -16 b 399 -50 395 -16 399 -27 b 279 -324 395 -317 310 -324 b 232 -302 251 -324 232 -317 b 268 -248 232 -282 259 -265 b 278 -206 275 -235 278 -220 b 256 -147 278 -184 271 -163 b 186 -117 246 -128 204 -117 z m 305 0 b 220 161 259 0 220 72 b 305 323 220 251 259 323 b 389 161 351 323 389 251 b 305 0 389 72 351 0 z',\n },\n timeSigCommon: {\n x_min: 5,\n x_max: 424,\n y_min: -249,\n y_max: 251,\n ha: 500,\n o: 'm 336 361 b 7 -14 131 361 7 180 b 101 -262 7 -108 42 -190 b 321 -359 156 -328 235 -359 b 611 -88 573 -359 611 -130 b 589 -56 611 -56 595 -56 b 567 -82 577 -56 567 -58 b 363 -311 567 -268 409 -311 b 184 40 246 -311 184 -197 b 372 327 184 278 294 327 b 477 278 446 327 477 292 b 451 246 477 265 472 246 b 360 140 393 246 360 184 b 471 32 360 58 431 32 b 580 156 471 32 580 36 b 336 361 580 344 363 361 z',\n },\n timeSigCutCommon: {\n x_min: 0,\n x_max: 418,\n y_min: -359,\n y_max: 361,\n ha: 720,\n o: 'm 573 -58 b 559 -82 567 -58 559 -60 b 354 -310 559 -266 400 -310 b 317 -305 340 -310 328 -308 b 302 -284 311 -304 302 -295 l 302 287 b 338 323 302 297 328 321 b 363 324 347 324 356 324 b 468 275 436 324 468 289 b 442 243 468 264 464 243 b 351 137 384 243 351 181 b 462 30 351 56 422 30 b 572 154 462 30 572 35 b 318 357 572 295 441 357 b 302 390 310 359 302 383 l 302 495 b 276 520 302 507 292 520 b 252 495 265 520 252 507 l 252 369 b 235 346 252 359 238 346 l 196 331 b 0 -14 66 275 0 122 b 225 -346 0 -150 86 -310 b 252 -382 235 -350 252 -369 l 252 -492 b 276 -517 252 -505 265 -517 b 302 -492 292 -517 302 -505 l 302 -379 b 318 -359 302 -370 308 -363 b 602 -85 563 -354 602 -130 b 579 -58 600 -58 586 -58 z m 252 -235 b 243 -252 252 -248 248 -252 b 236 -248 240 -252 238 -251 b 177 37 197 -193 177 -96 b 232 259 177 147 200 215 b 236 262 233 262 235 262 b 252 239 243 262 252 251 z',\n },\n timeSigPlus: {\n x_min: -1,\n x_max: 499,\n y_min: -250,\n y_max: 250,\n ha: 500,\n o: 'm 432 53 b 413 79 420 53 413 65 l 413 340 b 392 360 413 350 405 360 l 325 360 b 305 340 312 360 305 350 l 305 79 b 284 53 305 66 292 53 l 19 53 b -1 33 9 53 -1 46 l -1 -33 b 19 -55 -1 -46 9 -55 l 284 -55 b 305 -75 298 -55 305 -68 l 305 -340 b 325 -360 305 -350 312 -360 l 392 -360 b 413 -340 405 -360 413 -350 l 413 -78 b 433 -55 413 -63 423 -55 l 698 -55 b 719 -33 708 -55 719 -46 l 719 33 b 698 53 719 46 708 53 z',\n },\n timeSigPlusSmall: {\n x_min: -1,\n x_max: 255,\n y_min: -133,\n y_max: 123,\n ha: 256,\n o: 'm 220 20 b 210 33 215 20 210 26 l 210 166 b 200 177 210 171 206 177 l 166 177 b 156 166 160 177 156 171 l 156 33 b 145 20 156 27 150 20 l 10 20 b -1 10 4 20 -1 16 l -1 -24 b 10 -35 -1 -30 4 -35 l 145 -35 b 156 -46 153 -35 156 -42 l 156 -180 b 166 -192 156 -186 160 -192 l 200 -192 b 210 -180 206 -192 210 -186 l 210 -48 b 222 -35 210 -39 216 -35 l 356 -35 b 367 -24 361 -35 367 -30 l 367 10 b 356 20 367 16 361 20 z',\n },\n timeSigMinus: {\n x_min: 0,\n x_max: 448,\n y_min: -35,\n y_max: 40,\n ha: 75,\n o: 'm 645 39 b 619 58 645 49 634 58 l 27 58 b 0 39 12 58 0 49 l 0 -32 b 27 -50 0 -42 12 -50 l 619 -50 b 645 -32 634 -50 645 -42 z',\n },\n timeSigParensRight: {\n x_min: 0,\n x_max: 184,\n y_min: -489,\n y_max: 491,\n ha: 980,\n o: 'm 0 -696 b 3 -704 0 -698 1 -704 b 7 -703 4 -704 6 -704 b 265 1 187 -530 265 -282 b 12 701 265 289 187 531 b 4 707 12 701 6 707 b 0 696 1 707 0 703 l 0 665 b 4 644 0 665 0 651 b 167 1 112 503 167 315 b 6 -641 167 -311 109 -497 b 0 -658 3 -644 0 -651 z',\n },\n timeSigParensRightSmall: {\n x_min: 0,\n x_max: 110,\n y_min: -251,\n y_max: 249,\n ha: 500,\n o: 'm 0 -356 b 3 -361 0 -357 1 -361 b 158 0 112 -272 158 -145 b 4 359 158 147 109 272 b 0 353 3 359 0 357 l 0 338 b 3 327 0 338 0 330 b 91 0 60 246 91 160 b 4 -328 91 -160 62 -249 b 0 -337 3 -330 0 -333 z',\n },\n timeSigParensLeft: {\n x_min: 0,\n x_max: 184,\n y_min: -489,\n y_max: 491,\n ha: 980,\n o: 'm 265 -658 b 259 -641 265 -651 262 -644 b 98 1 156 -497 98 -311 b 261 644 98 315 153 503 b 265 665 265 651 265 665 l 265 696 b 261 707 265 703 264 707 b 253 701 259 707 253 701 b 0 1 78 531 0 289 b 258 -703 0 -282 78 -530 b 262 -704 259 -704 261 -704 b 265 -696 264 -704 265 -698 z',\n },\n timeSigParensLeftSmall: {\n x_min: 0,\n x_max: 110,\n y_min: -251,\n y_max: 249,\n ha: 500,\n o: 'm 158 -337 b 154 -328 158 -333 156 -330 b 68 0 96 -249 68 -160 b 156 327 68 160 98 246 b 158 338 158 330 158 338 l 158 353 b 154 359 158 357 156 359 b 0 0 49 272 0 147 b 156 -361 0 -145 46 -272 b 158 -356 157 -361 158 -357 z',\n },\n noteheadDoubleWhole: {\n x_min: 0,\n x_max: 599,\n y_min: -155,\n y_max: 155,\n ha: 310,\n o: 'm 13 223 b 0 212 4 223 0 217 l 0 -213 b 13 -223 0 -219 4 -223 l 32 -223 b 45 -213 39 -223 45 -219 l 45 212 b 32 223 45 217 39 223 z m 96 223 b 82 212 88 223 82 217 l 82 -213 b 96 -223 82 -219 88 -223 l 114 -223 b 128 -213 121 -223 128 -219 l 128 212 b 114 223 128 217 121 223 z m 747 223 b 733 212 740 223 733 217 l 733 -213 b 747 -223 733 -219 740 -223 l 766 -223 b 780 -213 773 -223 780 -219 l 780 212 b 766 223 780 217 773 223 z m 829 223 b 815 212 824 223 815 217 l 815 -213 b 829 -223 815 -219 824 -223 l 848 -223 b 863 -213 857 -223 863 -219 l 863 212 b 848 223 863 217 857 223 z m 438 180 b 130 1 248 180 130 101 b 423 -180 130 -92 210 -180 b 733 1 657 -180 733 -98 b 438 180 733 104 572 180 z m 469 -145 b 331 -71 409 -145 369 -112 b 284 58 305 -37 284 12 b 400 147 284 131 333 147 b 577 -45 498 147 577 42 b 469 -145 577 -115 533 -145 z',\n },\n noteheadWhole: {\n x_min: 0,\n x_max: 422,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 311 180 b 0 3 120 180 0 101 b 297 -180 0 -94 82 -180 b 608 3 533 -180 608 -98 b 311 180 608 105 445 180 z m 160 91 b 274 148 176 141 229 148 b 452 -45 373 148 452 42 b 386 -141 452 -89 433 -130 b 341 -147 372 -145 356 -147 b 206 -72 289 -147 236 -112 b 156 56 177 -39 156 10 b 160 91 156 68 157 79 z',\n },\n noteheadHalf: {\n x_min: 0,\n x_max: 295,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 140 -180 b 425 60 377 -180 425 13 b 282 180 425 134 366 180 b 0 -60 68 180 0 14 b 140 -180 0 -137 60 -180 z m 108 -125 b 50 -92 78 -125 60 -109 b 42 -63 46 -84 42 -73 b 318 121 42 7 251 121 b 372 91 346 121 361 108 b 380 63 376 82 380 73 b 108 -125 380 1 177 -125 z',\n },\n noteheadBlack: {\n x_min: 0,\n x_max: 295,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 140 -180 b 425 60 268 -180 425 -62 b 285 180 425 134 367 180 b 0 -60 127 180 0 63 b 140 -180 0 -135 62 -180 z',\n },\n noteheadXWhole: {\n x_min: 0,\n x_max: 377,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 272 -95 l 364 -171 b 384 -180 370 -177 377 -180 l 511 -180 b 543 -148 528 -180 543 -164 b 531 -124 543 -140 539 -131 l 412 0 l 531 124 b 541 148 539 131 541 140 b 513 180 541 164 528 180 l 384 180 b 364 171 377 180 370 177 l 272 94 l 179 171 b 158 180 173 177 166 180 l 30 180 b 0 148 16 180 0 164 b 12 124 0 140 4 131 l 132 0 l 12 -124 b 1 -148 4 -131 1 -140 b 32 -180 1 -164 14 -180 l 158 -180 b 179 -171 166 -180 173 -177 z m 386 -141 l 272 -45 l 157 -141 l 88 -141 l 245 0 l 88 141 l 157 141 l 272 45 l 386 141 l 456 141 l 300 0 l 456 -141 z',\n },\n noteheadXHalf: {\n x_min: 0,\n x_max: 334,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 295 180 b 271 170 287 180 278 177 l 209 98 l 115 171 b 95 180 109 177 104 180 l 36 180 b 4 148 19 180 4 164 b 14 124 4 140 7 132 l 140 22 l 7 -127 b 0 -148 3 -131 0 -138 b 32 -180 0 -166 14 -180 l 184 -180 b 209 -170 193 -180 203 -177 l 271 -99 l 363 -171 b 384 -180 370 -176 377 -180 l 445 -180 b 478 -147 461 -180 478 -163 b 465 -125 478 -138 474 -131 l 341 -22 l 474 127 b 481 148 480 131 481 138 b 448 180 481 166 468 180 z m 36 148 l 95 148 l 233 33 l 334 148 l 410 148 l 274 -6 l 445 -148 l 384 -148 l 248 -35 l 147 -148 l 71 -148 l 206 4 z',\n },\n noteheadXBlack: {\n x_min: 0,\n x_max: 290,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 410 -143 l 239 0 l 410 144 b 418 160 415 147 418 154 b 399 180 418 171 408 180 b 389 177 396 180 392 179 l 207 26 l 29 177 b 17 180 26 179 22 180 b 0 161 7 180 0 170 b 7 144 0 156 3 148 l 179 0 l 7 -143 b 0 -158 1 -147 0 -153 b 19 -180 0 -170 7 -180 b 29 -176 23 -180 26 -179 l 207 -24 l 389 -176 b 399 -180 392 -179 396 -180 b 418 -160 410 -180 418 -168 b 410 -143 418 -153 415 -147 z',\n },\n noteheadCircleX: {\n x_min: 0,\n x_max: 249,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 179 180 b 0 0 81 180 0 99 b 179 -180 0 -99 81 -180 b 359 0 278 -180 359 -99 b 179 180 359 99 278 180 z m 261 112 l 180 30 l 98 112 b 179 138 121 128 148 138 b 261 112 210 138 238 128 z m 317 0 b 292 -82 317 -30 308 -59 l 209 1 l 291 84 b 317 0 307 60 317 30 z m 40 0 b 69 84 40 32 50 60 l 151 1 l 68 -84 b 40 0 49 -60 40 -30 z m 95 -111 l 180 -27 l 262 -111 b 179 -138 239 -128 210 -138 b 95 -111 148 -138 120 -128 z',\n },\n noteheadTriangleUpWhole: {\n x_min: 0,\n x_max: 319,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 445 -180 b 459 -166 454 -180 459 -173 b 458 -158 459 -163 458 -160 l 239 173 b 228 180 238 177 233 180 b 216 173 225 180 219 177 l 1 -158 b 0 -166 1 -160 0 -163 b 14 -180 0 -173 6 -180 z m 170 -137 b 145 -96 157 -137 145 -109 b 228 108 145 -17 197 56 b 310 -98 259 55 310 -17 b 288 -137 310 -111 301 -137 z',\n },\n noteheadTriangleUpHalf: {\n x_min: 0,\n x_max: 285,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 215 180 b 202 173 210 180 204 177 l 3 -157 b 0 -166 1 -160 0 -163 b 14 -180 0 -173 7 -180 l 396 -180 b 410 -166 406 -180 410 -173 b 409 -158 410 -163 410 -161 l 228 173 b 215 180 226 174 220 180 z m 246 -138 l 115 -138 l 232 76 l 297 -37 z',\n },\n noteheadTriangleUpBlack: {\n x_min: 0,\n x_max: 293,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 422 -180 l 207 180 l 0 -180 z',\n },\n noteheadDiamondWhole: {\n x_min: 0,\n x_max: 270,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 386 -23 b 389 -16 387 -20 389 -19 b 383 -7 389 -13 386 -9 l 130 179 b 122 180 128 180 125 180 b 115 177 120 180 117 180 l 3 23 b 0 17 1 20 0 19 b 4 7 0 16 3 10 l 258 -179 b 264 -180 261 -179 262 -180 b 272 -176 268 -180 271 -179 z m 66 40 b 62 48 65 42 62 45 l 109 111 b 112 112 109 112 111 112 b 118 111 115 112 117 111 l 320 -37 b 324 -46 323 -39 324 -42 b 275 -111 278 -111 276 -111 b 268 -108 272 -111 271 -109 z',\n },\n noteheadDiamondHalf: {\n x_min: 0,\n x_max: 251,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 359 -7 b 361 0 360 -6 361 -3 b 359 7 361 3 360 4 l 189 177 b 180 180 186 179 183 180 b 174 177 179 180 176 179 l 4 7 b 0 0 1 4 0 3 b 4 -7 0 -3 1 -6 l 174 -177 b 180 -180 176 -180 179 -180 b 189 -177 183 -180 186 -180 z m 266 26 b 138 -71 266 -12 176 -71 b 96 -50 121 -71 108 -63 b 88 -24 89 -43 88 -32 b 215 73 88 13 177 73 b 266 26 238 73 266 50 z',\n },\n noteheadDiamondBlack: {\n x_min: 0,\n x_max: 250,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 357 -6 b 360 1 359 -4 360 -1 b 357 9 360 4 359 7 l 189 177 b 180 180 187 179 184 180 b 171 177 177 180 173 179 l 3 9 b 0 1 0 6 0 4 b 4 -7 0 -1 1 -4 l 173 -177 b 180 -180 176 -180 177 -180 b 187 -177 181 -180 184 -180 z',\n },\n noteheadSquareWhite: {\n x_min: 0,\n x_max: 313,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 451 -180 l 451 180 l 0 180 l 0 -180 z m 40 -138 l 40 140 l 410 140 l 410 -138 z',\n },\n noteheadSquareBlack: {\n x_min: 0,\n x_max: 313,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 451 -180 l 451 180 l 0 180 l 0 -180 z',\n },\n noteheadParenthesis: {\n x_min: -73,\n x_max: 368,\n y_min: -180,\n y_max: 182,\n ha: 362,\n o: 'm 52 -249 b -30 -144 3 -212 -14 -190 b -52 4 -45 -102 -52 -56 b 52 252 -52 118 -36 179 l 46 262 b -105 3 -49 197 -105 124 b 45 -259 -105 -109 -48 -200 z m 382 -259 b 530 3 474 -202 530 -108 b 379 262 530 122 474 200 l 373 252 b 478 4 462 180 478 118 b 456 -144 478 -56 471 -102 b 373 -249 439 -190 422 -212 z',\n },\n noteheadParenthesisRight: {\n x_min: -36,\n x_max: 73,\n y_min: -181,\n y_max: 181,\n ha: 362,\n o: 'm -43 -261 b 105 1 49 -203 105 -109 b -46 261 105 121 49 199 l -52 251 b 53 3 37 179 53 117 b 32 -145 53 -58 46 -104 b -52 -251 14 -192 -3 -213 z',\n },\n noteheadParenthesisLeft: {\n x_min: 0,\n x_max: 109,\n y_min: -181,\n y_max: 181,\n ha: 362,\n o: 'm 157 -251 b 75 -145 108 -213 91 -192 b 53 3 60 -104 53 -58 b 157 251 53 117 69 177 l 151 261 b 0 1 56 196 0 122 b 150 -261 0 -111 58 -202 z',\n },\n augmentationDot: {\n x_min: 0,\n x_max: 100,\n y_min: -50,\n y_max: 50,\n ha: 100,\n o: 'm 144 0 b 72 72 144 40 112 72 b 0 0 32 72 0 40 b 72 -72 0 -40 32 -72 b 144 0 112 -72 144 -40 z',\n },\n tremolo1: {\n x_min: -150,\n x_max: 150,\n y_min: -93,\n y_max: 94,\n ha: 187,\n o: 'm 216 -45 l 216 135 l -216 46 l -216 -134 z',\n },\n flag8thUp: {\n x_min: 0,\n x_max: 264,\n y_min: -810.1921176545985,\n y_max: 9,\n ha: 819.1921176545985,\n o: 'm 343 -1138 b 380 -888 343 -1138 380 -1001 b 215 -395 380 -708 305 -539 b 58 -19 141 -281 81 -157 b 27 13 53 4 42 13 b 0 -9 12 13 0 9 l 0 -353 b 284 -688 95 -370 232 -566 b 318 -904 305 -737 318 -819 b 284 -1102 318 -969 308 -1037 b 279 -1123 281 -1110 279 -1117 b 302 -1165 279 -1146 294 -1159 b 343 -1138 311 -1171 336 -1162 z',\n },\n flag8thDown: {\n x_min: 0,\n x_max: 306,\n y_min: -14,\n y_max: 808,\n ha: 822,\n o: 'm 346 1094 b 376 897 366 1034 376 962 b 318 642 376 812 340 691 b 0 340 265 521 193 405 l 0 1 b 23 -20 0 -13 12 -20 b 58 12 36 -20 55 -12 b 262 387 82 148 189 274 b 441 881 353 530 441 701 b 400 1142 441 994 412 1096 b 377 1164 396 1158 387 1164 b 346 1094 356 1164 331 1136 z',\n },\n flag16thUp: {\n x_min: 0,\n x_max: 279,\n y_min: -813,\n y_max: 2,\n ha: 815,\n o: 'm 392 -1146 b 402 -988 397 -1139 402 -1057 l 402 -956 b 360 -783 402 -896 386 -837 b 359 -770 360 -779 359 -776 b 360 -760 359 -768 359 -765 b 396 -577 364 -752 396 -665 b 392 -526 396 -559 395 -543 b 236 -275 377 -428 340 -387 b 53 -16 158 -192 78 -168 b 24 3 50 0 33 3 b 0 -12 16 3 0 -1 l 0 -570 l 7 -570 b 298 -778 96 -573 199 -576 b 344 -992 331 -847 344 -917 b 333 -1120 344 -1034 340 -1077 b 331 -1133 331 -1126 331 -1129 b 363 -1171 331 -1152 343 -1171 b 392 -1146 373 -1171 383 -1165 z m 301 -661 b 223 -562 278 -625 253 -596 b 59 -331 156 -484 89 -449 b 58 -327 58 -330 58 -328 b 78 -312 58 -321 66 -312 l 89 -312 b 302 -464 177 -312 255 -393 b 341 -592 328 -501 341 -546 b 340 -621 341 -602 341 -611 b 330 -658 337 -632 337 -647 b 311 -667 328 -662 318 -667 b 301 -661 307 -667 304 -665 z',\n },\n flag16thDown: {\n x_min: 0,\n x_max: 290.8951581511223,\n y_min: -9,\n y_max: 812.0064,\n ha: 821.0064,\n o: 'm 346 1132 b 312 768 367 1011 367 880 b 7 559 213 566 96 562 l 0 559 l 0 1 b 24 -13 0 -6 10 -13 b 53 6 35 -13 50 -10 b 406 516 88 228 372 289 b 410 567 409 531 410 549 b 374 750 410 655 379 742 b 373 760 373 753 373 756 b 374 773 373 766 374 769 b 405 1138 426 881 428 1022 b 370 1169 397 1171 387 1169 b 346 1132 353 1168 341 1156 z m 325 657 b 344 647 333 657 343 652 b 354 611 351 636 351 622 b 356 582 356 600 356 590 b 317 454 356 534 343 491 b 89 302 269 383 177 302 l 78 302 b 58 317 66 302 58 310 b 59 321 58 318 58 320 b 238 552 89 439 170 472 b 315 651 268 585 292 613 b 325 657 318 655 321 657 z',\n },\n flag32ndUp: {\n x_min: 0,\n x_max: 261,\n y_min: -812,\n y_max: 149,\n ha: 961,\n o: 'm 374 -969 b 337 -806 372 -913 359 -858 b 336 -796 336 -804 336 -801 b 337 -788 336 -793 336 -791 b 370 -616 340 -778 370 -698 b 340 -482 370 -570 360 -524 b 369 -330 353 -445 369 -386 b 366 -289 369 -315 369 -302 b 220 -58 350 -202 317 -163 b 46 187 148 20 71 43 b 20 215 45 200 35 215 b 0 197 12 215 0 207 l 0 -609 l 7 -609 b 278 -802 91 -612 186 -615 b 323 -999 310 -865 323 -930 b 311 -1122 323 -1040 318 -1080 b 310 -1132 311 -1126 310 -1129 b 328 -1166 310 -1149 318 -1162 b 337 -1169 331 -1168 334 -1169 b 366 -1146 346 -1169 356 -1162 b 376 -1009 370 -1138 376 -1071 b 374 -969 376 -995 374 -982 z m 300 -261 b 321 -330 315 -289 321 -311 b 317 -360 321 -341 318 -350 b 300 -423 314 -374 307 -399 b 220 -334 279 -397 253 -370 b 56 -92 150 -256 79 -232 b 300 -261 135 -92 220 -127 z m 315 -657 b 308 -690 312 -668 312 -680 b 292 -698 307 -694 300 -698 b 282 -693 288 -698 284 -697 b 216 -608 261 -661 240 -636 l 209 -600 b 56 -390 147 -527 88 -495 b 73 -367 53 -380 60 -367 b 318 -622 189 -367 318 -505 b 315 -657 318 -634 317 -645 z',\n },\n flag32ndDown: {\n x_min: 0,\n x_max: 273,\n y_min: -172,\n y_max: 812,\n ha: 984,\n o: 'm 393 973 b 333 1169 393 1002 383 1169 b 324 1168 330 1169 327 1169 b 304 1130 314 1164 304 1149 b 305 1120 304 1128 305 1125 b 334 962 317 1056 334 1011 b 289 821 334 922 323 880 b 0 619 180 625 88 622 l 0 -229 b 20 -248 0 -242 9 -248 b 48 -219 35 -248 46 -232 b 229 36 72 -69 154 -46 b 380 278 330 145 364 186 b 383 320 383 291 383 305 b 351 484 383 382 364 445 b 384 629 374 526 384 580 b 356 780 384 704 361 766 b 356 783 356 782 356 783 l 351 791 b 356 804 351 796 353 799 l 361 814 b 393 958 380 850 387 865 z m 56 386 b 217 609 86 501 153 533 b 292 706 246 642 269 670 b 304 711 295 710 300 711 b 321 703 311 711 320 707 b 328 670 325 693 325 681 b 331 634 330 658 331 645 b 82 367 331 516 199 367 l 75 367 b 56 386 62 367 56 379 z m 330 350 b 334 320 331 340 334 331 b 311 248 334 301 328 278 b 59 72 229 109 141 72 b 56 76 56 73 56 75 b 229 331 81 226 154 249 b 310 423 264 369 289 397 b 330 350 318 396 325 366 z',\n },\n flag64thUp: {\n x_min: 0,\n x_max: 261,\n y_min: -812,\n y_max: 347,\n ha: 1159,\n o: 'm 374 -969 b 337 -806 372 -913 359 -858 b 336 -796 336 -804 336 -801 b 337 -788 336 -793 336 -791 b 370 -616 340 -778 370 -698 b 340 -482 370 -570 360 -524 b 369 -330 353 -445 369 -386 b 337 -203 369 -287 359 -242 b 369 -43 350 -167 369 -104 b 366 -4 369 -30 367 -17 b 220 228 350 84 317 122 b 46 472 148 305 71 328 b 20 500 45 485 32 500 b 0 482 10 500 0 492 l 0 -609 l 7 -609 b 278 -802 91 -612 186 -615 b 323 -999 310 -865 323 -930 b 311 -1122 323 -1040 318 -1080 b 310 -1132 311 -1126 310 -1129 b 328 -1166 310 -1149 318 -1162 b 337 -1169 331 -1168 334 -1169 b 366 -1146 346 -1169 356 -1162 b 376 -1009 370 -1138 376 -1071 b 374 -969 376 -995 374 -982 z m 300 24 b 321 -45 315 -4 321 -26 b 317 -75 321 -56 318 -65 l 298 -145 b 220 -58 278 -121 253 -94 b 58 187 148 20 82 43 b 56 193 58 189 58 192 b 300 24 138 193 220 157 z m 300 -261 b 321 -330 315 -289 321 -311 b 317 -360 321 -341 318 -350 b 300 -423 314 -374 307 -399 b 220 -334 279 -397 253 -370 b 56 -92 150 -256 79 -232 b 300 -261 135 -92 220 -127 z m 315 -657 b 308 -690 312 -668 312 -680 b 292 -698 307 -694 300 -698 b 282 -693 288 -698 284 -697 b 216 -608 261 -661 240 -636 l 209 -600 b 55 -386 147 -527 84 -497 b 73 -367 52 -376 63 -367 b 318 -622 189 -367 318 -505 b 315 -657 318 -634 317 -645 z',\n },\n flag64thDown: {\n x_min: 0,\n x_max: 273,\n y_min: -376,\n y_max: 812,\n ha: 1188,\n o: 'm 393 973 b 333 1169 393 1002 383 1169 b 324 1168 330 1169 327 1169 b 304 1130 314 1164 304 1149 b 305 1120 304 1128 305 1125 b 334 962 317 1056 334 1011 b 289 821 334 922 323 880 b 0 619 180 625 88 622 l 0 -523 b 20 -541 0 -534 9 -541 b 48 -513 35 -541 46 -526 b 229 -258 72 -363 154 -340 b 380 -16 330 -148 364 -108 b 384 27 383 -1 384 13 b 351 189 384 88 366 151 b 380 278 366 216 374 243 b 383 320 383 291 383 305 b 351 484 383 382 364 445 b 384 629 374 526 384 580 b 356 780 384 704 361 766 b 356 783 356 782 356 783 l 351 791 b 356 804 351 796 353 799 l 361 814 b 393 958 380 850 387 865 z m 56 386 b 217 609 86 501 153 533 b 292 706 246 642 269 670 b 304 711 295 710 300 711 b 321 703 311 711 320 707 b 328 670 325 693 325 681 b 331 634 330 658 331 645 b 82 367 331 516 199 367 l 75 367 b 56 386 62 367 56 379 z m 330 350 b 334 320 331 340 334 331 b 311 248 334 301 328 278 b 59 72 229 109 141 72 b 56 76 56 73 56 75 b 229 331 81 226 154 249 b 310 423 264 369 289 397 b 330 350 318 396 325 366 z m 330 56 b 334 26 331 46 334 37 b 311 -46 334 7 328 -16 b 56 -222 229 -184 137 -222 b 229 36 75 -86 145 -55 b 311 128 264 73 289 102 z',\n },\n flag128thUp: {\n x_min: 0,\n x_max: 261,\n y_min: -812,\n y_max: 533,\n ha: 1345,\n o: 'm 374 -969 b 337 -806 372 -913 359 -858 b 336 -796 336 -804 336 -801 b 337 -788 336 -793 336 -791 b 370 -616 340 -778 370 -698 b 340 -482 370 -570 360 -524 b 369 -330 353 -445 369 -386 b 337 -203 369 -287 359 -242 b 369 -43 350 -167 369 -104 b 366 -4 369 -30 367 -17 b 341 75 360 26 353 50 b 369 222 354 111 369 167 b 366 264 369 236 369 251 b 220 495 350 351 317 390 b 46 740 148 573 71 596 b 22 768 45 753 35 768 b 0 750 10 768 0 760 l 0 -609 l 7 -609 b 278 -802 91 -612 186 -615 b 323 -999 310 -865 323 -930 b 311 -1122 323 -1040 318 -1080 b 310 -1132 311 -1126 310 -1129 b 328 -1166 310 -1149 318 -1162 b 337 -1169 331 -1168 334 -1169 b 366 -1146 346 -1169 356 -1162 b 376 -1009 370 -1138 376 -1071 b 374 -969 376 -995 374 -982 z m 300 292 b 321 223 315 264 321 242 b 317 193 321 212 318 203 b 301 135 314 180 308 158 b 220 228 281 161 255 190 b 55 461 151 304 79 327 b 300 292 134 461 220 426 z m 300 24 b 321 -45 315 -4 321 -26 b 317 -75 321 -56 318 -65 l 298 -145 b 220 -58 278 -121 253 -94 b 56 187 148 20 81 43 b 55 193 56 189 56 192 b 300 24 137 193 220 157 z m 300 -261 b 321 -330 315 -289 321 -311 b 317 -360 321 -341 318 -350 b 300 -423 314 -374 307 -399 b 220 -334 279 -397 253 -370 b 56 -92 150 -256 79 -232 b 300 -261 135 -92 220 -127 z m 315 -657 b 308 -690 312 -668 312 -680 b 292 -698 307 -694 300 -698 b 282 -693 288 -698 284 -697 b 216 -608 261 -661 240 -636 l 209 -600 b 55 -386 147 -527 84 -497 b 73 -367 53 -376 62 -367 b 318 -622 189 -367 318 -505 b 315 -657 318 -634 317 -645 z',\n },\n flag128thDown: {\n x_min: 0,\n x_max: 273,\n y_min: -580,\n y_max: 812,\n ha: 1392,\n o: 'm 393 973 b 333 1169 393 1002 383 1169 b 324 1168 330 1169 327 1169 b 304 1130 314 1164 304 1149 b 305 1120 304 1128 305 1125 b 334 962 317 1056 334 1011 b 289 821 334 922 323 880 b 0 619 180 625 88 622 l 0 -816 b 20 -835 0 -828 7 -835 b 48 -806 33 -835 46 -819 b 229 -552 72 -657 154 -634 b 380 -310 330 -442 364 -402 b 384 -266 383 -295 384 -281 b 351 -105 384 -206 366 -143 b 384 27 372 -66 384 -16 b 351 189 384 88 366 151 b 380 278 366 216 374 243 b 383 320 383 291 383 305 b 351 484 383 382 364 445 b 384 629 374 526 384 580 b 356 780 384 704 361 766 b 356 783 356 782 356 783 l 351 791 b 356 804 351 796 353 799 l 361 814 b 393 958 380 850 387 865 z m 56 386 b 217 609 86 501 153 533 b 292 706 246 642 269 670 b 304 711 295 710 300 711 b 321 703 311 711 320 707 b 328 670 325 693 325 681 b 331 634 330 658 331 645 b 82 367 331 516 199 367 l 75 367 b 56 386 62 367 56 379 z m 330 350 b 334 320 331 340 334 331 b 311 248 334 301 328 278 b 59 72 229 109 141 72 b 56 76 56 73 56 75 b 229 331 81 226 154 249 b 310 423 264 369 289 397 b 330 350 318 396 325 366 z m 330 56 b 334 26 331 46 334 37 b 311 -46 334 7 328 -16 b 56 -222 229 -184 137 -222 b 229 36 75 -86 145 -55 b 311 128 264 73 289 102 z m 330 -238 b 334 -268 331 -248 334 -256 b 311 -340 334 -287 328 -310 b 56 -516 229 -478 137 -516 b 229 -258 75 -380 145 -348 b 311 -166 264 -220 289 -192 z',\n },\n accidentalFlat: {\n x_min: 0,\n x_max: 226,\n y_min: -175,\n y_max: 439,\n ha: 614,\n o: 'm 17 -245 b 30 -252 22 -251 26 -252 b 39 -249 35 -252 39 -249 b 153 -161 82 -225 117 -186 b 325 82 281 -72 325 16 b 196 220 325 164 262 216 b 117 196 171 220 137 209 b 85 176 108 189 92 176 b 78 177 82 176 81 176 b 62 202 68 181 62 192 b 72 608 63 233 72 579 b 45 632 72 624 59 632 b 0 592 24 632 1 618 b 17 -245 0 592 6 -230 z m 68 -117 b 63 27 68 -117 63 -30 b 66 73 63 50 65 68 b 167 144 76 102 134 144 b 226 60 209 144 226 96 b 98 -134 226 -17 160 -95 b 84 -138 92 -137 88 -138 b 68 -117 71 -138 68 -124 z',\n },\n accidentalNatural: {\n x_min: 0,\n x_max: 168,\n y_min: -335,\n y_max: 341,\n ha: 676,\n o: 'm 203 261 b 197 259 200 261 199 259 b 68 226 197 259 105 226 b 53 233 59 226 53 228 l 53 474 b 36 491 53 484 45 491 l 17 491 b 0 474 7 491 0 484 l 0 -268 b 13 -281 0 -276 4 -281 l 16 -279 b 22 -278 17 -279 20 -279 b 164 -235 42 -269 122 -235 b 189 -251 179 -235 189 -239 l 189 -465 b 206 -482 189 -475 196 -482 l 225 -482 b 242 -465 233 -482 242 -475 l 242 258 b 230 269 242 265 236 269 b 225 268 229 269 226 269 z m 53 56 b 176 114 53 76 141 114 b 189 107 184 114 189 112 l 189 -42 b 71 -101 189 -68 107 -101 b 53 -92 60 -101 53 -98 z',\n },\n accidentalSharp: {\n x_min: 0,\n x_max: 249,\n y_min: -348,\n y_max: 350,\n ha: 698,\n o: 'm 341 170 b 359 194 351 174 359 186 l 359 297 b 348 308 359 304 354 308 b 341 307 346 308 344 308 b 305 294 341 307 312 295 b 285 312 295 294 285 301 l 285 488 b 265 504 285 497 276 504 b 242 488 251 504 242 497 l 242 301 b 223 259 240 287 236 268 b 132 223 206 249 157 229 b 115 252 120 223 115 240 l 115 425 b 95 441 115 433 105 441 b 72 425 81 441 72 433 l 72 230 b 55 192 72 210 63 196 b 17 176 46 187 17 176 b 0 153 7 173 0 161 l 0 50 b 13 37 0 42 4 37 l 16 39 b 50 53 17 39 39 48 l 52 55 b 72 29 63 55 72 40 l 72 -114 b 56 -147 72 -130 65 -143 b 17 -163 48 -150 17 -163 b 0 -186 7 -166 0 -177 l 0 -288 b 13 -301 0 -297 4 -301 l 16 -300 b 50 -287 17 -300 37 -291 b 55 -285 52 -285 53 -285 b 72 -308 65 -285 72 -301 l 72 -485 b 91 -501 72 -494 81 -501 b 115 -485 105 -501 115 -494 l 115 -285 b 130 -253 115 -266 122 -256 l 217 -217 b 219 -217 217 -217 219 -217 l 222 -216 b 242 -242 235 -216 242 -233 l 242 -422 b 261 -438 242 -431 251 -438 b 285 -422 276 -438 285 -431 l 285 -217 b 301 -184 285 -206 291 -189 b 341 -168 311 -180 341 -168 b 359 -144 351 -164 359 -153 l 359 -42 b 348 -30 359 -35 354 -30 b 341 -32 346 -30 344 -30 l 304 -46 b 285 -20 295 -46 285 -37 l 285 114 b 304 156 285 124 292 151 z m 242 -65 b 132 -122 233 -94 166 -122 b 115 -115 124 -122 117 -120 b 111 -43 112 -109 111 -78 b 115 63 111 1 112 52 b 220 118 118 88 184 118 b 242 109 230 118 239 115 b 248 27 245 102 248 66 b 242 -65 248 -12 245 -52 z',\n },\n accidentalDoubleSharp: {\n x_min: 0,\n x_max: 247,\n y_min: -125,\n y_max: 127,\n ha: 252,\n o: 'm 274 -46 b 206 1 258 -37 206 -9 b 274 50 206 22 253 43 b 278 50 275 50 276 50 l 287 49 b 346 63 304 49 331 52 b 356 115 353 71 356 92 b 292 183 356 174 351 183 b 233 173 266 183 240 180 b 226 117 228 168 226 143 b 179 49 219 101 196 49 b 130 117 158 49 135 96 b 118 173 130 141 125 167 b 66 183 112 180 89 183 b 7 173 42 183 16 180 b 0 120 3 170 0 145 b 7 63 0 94 3 68 b 68 49 17 55 43 49 b 82 50 73 49 78 50 b 150 3 98 42 150 13 b 84 -46 150 -16 104 -39 l 69 -46 b 7 -56 43 -46 16 -49 b 0 -111 3 -60 0 -85 b 7 -166 0 -137 3 -163 b 65 -180 17 -174 40 -180 b 118 -166 86 -180 109 -176 b 130 -111 127 -158 130 -134 b 132 -105 130 -109 131 -107 b 177 -45 141 -85 158 -45 b 226 -111 196 -45 220 -91 b 233 -166 226 -137 228 -161 b 291 -180 243 -174 266 -180 b 356 -114 346 -180 356 -166 b 346 -56 356 -89 351 -63 b 288 -46 338 -49 312 -46 z',\n },\n accidentalDoubleFlat: {\n x_min: 0,\n x_max: 411,\n y_min: -175,\n y_max: 437,\n ha: 612,\n o: 'm 452 217 b 384 194 426 217 408 207 b 350 176 374 189 363 176 b 343 177 347 176 344 176 b 328 202 333 180 328 190 b 337 606 328 232 337 579 b 310 629 337 622 324 629 b 265 592 291 629 268 616 b 269 194 265 592 266 395 b 196 217 248 209 223 217 l 187 217 b 120 194 160 217 143 207 b 85 176 108 189 98 176 b 78 177 82 176 81 176 b 62 202 68 180 62 190 b 72 606 62 232 72 579 b 45 629 72 622 59 629 b 0 592 24 629 1 616 b 17 -245 0 592 7 -232 b 30 -252 22 -251 26 -252 b 39 -249 35 -252 39 -249 b 153 -161 84 -226 120 -186 b 274 -50 206 -124 246 -85 b 284 -245 276 -158 279 -240 b 295 -252 288 -251 292 -252 b 304 -249 300 -252 304 -249 b 416 -163 348 -226 383 -186 b 592 82 546 -72 592 16 b 461 217 592 163 528 216 z m 96 -134 b 84 -138 92 -137 86 -138 b 68 -115 72 -138 68 -124 b 63 26 68 -115 63 -30 b 66 72 63 49 65 66 b 168 144 75 101 134 144 b 226 59 212 144 226 95 b 96 -134 226 -22 161 -94 z m 361 -134 b 348 -138 356 -137 351 -138 b 333 -115 337 -138 333 -124 b 328 39 333 -115 328 -16 b 330 72 328 55 328 68 b 433 144 338 101 399 144 b 468 130 448 144 459 140 b 490 59 481 112 490 88 b 361 -134 490 -22 426 -94 z',\n },\n accidentalParensLeft: {\n x_min: 0,\n x_max: 141,\n y_min: -248,\n y_max: 247,\n ha: 495,\n o: 'm 203 331 l 203 351 b 202 356 203 354 203 356 b 0 0 60 281 0 140 b 199 -357 0 -144 60 -269 b 203 -354 200 -357 203 -356 l 203 -333 b 200 -327 203 -330 202 -328 b 86 0 118 -253 86 -160 b 200 324 86 158 120 251 b 203 331 202 325 203 327 z',\n },\n accidentalParensRight: {\n x_min: 0,\n x_max: 141,\n y_min: -248,\n y_max: 247,\n ha: 495,\n o: 'm 0 331 b 3 324 0 327 1 325 b 117 0 84 251 117 158 b 3 -327 117 -160 85 -253 b 0 -333 1 -328 0 -330 l 0 -354 b 4 -357 0 -356 3 -357 b 203 0 143 -269 203 -144 b 1 356 203 140 143 281 b 0 351 0 356 0 354 z',\n },\n accidentalQuarterToneFlatStein: {\n x_min: 1,\n x_max: 227,\n y_min: -175,\n y_max: 439,\n ha: 614,\n o: 'm 310 -245 b 327 592 321 -230 327 592 b 282 632 325 618 302 632 b 255 608 268 632 255 624 b 265 202 255 579 264 233 b 249 177 265 192 259 181 b 242 176 246 176 245 176 b 210 196 235 176 219 189 b 131 220 190 209 156 220 b 1 85 65 216 1 164 b 174 -161 1 16 46 -72 b 288 -249 210 -186 245 -225 b 297 -252 288 -249 292 -252 b 310 -245 301 -252 305 -251 z m 259 -117 b 243 -138 259 -124 256 -138 b 229 -134 239 -138 235 -137 b 101 60 167 -95 101 -17 b 160 144 101 96 118 144 b 261 73 193 144 251 102 b 264 27 262 68 264 50 b 259 -117 264 -30 259 -117 z',\n },\n accidentalThreeQuarterTonesFlatZimmermann: {\n x_min: 1,\n x_max: 466,\n y_min: -175,\n y_max: 439,\n ha: 614,\n o: 'm 363 -245 b 376 -252 367 -251 372 -252 b 384 -249 380 -252 384 -249 b 497 -161 428 -226 464 -186 b 671 84 625 -72 671 16 b 541 220 671 164 606 217 b 513 217 531 220 523 219 b 464 196 495 212 480 206 b 431 176 452 189 442 176 b 423 177 428 176 426 176 b 408 202 413 180 408 190 l 419 608 b 392 632 419 625 406 632 b 346 592 372 632 347 618 b 363 -245 346 592 351 -230 z m 289 -249 b 297 -252 289 -249 292 -252 b 310 -245 300 -252 305 -251 b 328 592 321 -230 328 592 b 282 631 327 618 302 631 b 255 608 268 631 255 624 l 266 202 b 251 177 266 190 261 180 b 243 176 248 176 246 176 b 210 196 232 176 222 189 b 164 216 196 204 180 210 l 163 217 b 132 220 151 219 143 220 b 1 84 65 217 1 163 b 177 -163 1 16 48 -72 b 289 -249 210 -186 245 -226 z m 262 72 b 265 26 264 66 265 49 b 261 -115 265 -30 261 -115 b 245 -138 261 -124 258 -138 b 230 -134 240 -138 236 -137 b 102 60 166 -92 102 -20 b 124 128 102 88 111 112 b 161 144 134 138 147 144 b 199 134 173 144 184 141 b 262 72 219 122 256 92 z m 413 -115 b 409 26 413 -115 409 -30 b 412 72 409 49 410 66 b 514 144 420 102 480 144 b 570 60 557 144 570 96 b 442 -134 570 -23 508 -91 b 429 -138 436 -137 433 -138 b 413 -115 418 -138 413 -124 z',\n },\n accidentalQuarterToneSharpStein: {\n x_min: 0,\n x_max: 179,\n y_min: -353,\n y_max: 307,\n ha: 660,\n o: 'm 258 240 b 246 252 258 248 252 252 b 240 251 245 252 242 252 b 168 225 240 251 171 225 b 150 253 156 225 150 240 l 150 426 b 130 442 150 435 141 442 b 105 418 108 442 105 429 l 105 230 b 91 193 105 219 101 202 b 17 161 65 183 42 171 b 0 138 9 158 0 147 l 0 36 b 13 23 0 27 4 23 l 16 24 b 86 53 17 24 73 49 l 88 55 b 107 30 98 55 107 42 l 107 -114 b 92 -145 107 -130 101 -143 l 17 -177 b 0 -200 9 -180 0 -192 l 0 -302 b 13 -315 0 -311 4 -315 l 16 -314 b 85 -285 17 -314 72 -291 b 105 -312 92 -282 105 -301 l 105 -492 b 125 -508 105 -501 114 -508 b 150 -484 147 -508 150 -498 l 150 -285 b 151 -274 150 -281 150 -278 b 164 -253 153 -265 158 -256 b 240 -225 176 -251 240 -225 b 258 -202 249 -222 258 -210 l 258 -99 b 245 -86 258 -91 253 -86 l 242 -88 b 240 -88 242 -88 240 -88 l 240 -86 b 168 -115 240 -86 174 -114 b 148 -91 158 -115 148 -107 l 148 43 b 167 85 148 55 156 81 b 240 114 180 91 240 114 b 258 138 249 118 258 128 z',\n },\n accidentalThreeQuarterTonesSharpStein: {\n x_min: 3,\n x_max: 317,\n y_min: -347,\n y_max: 369,\n ha: 716,\n o: 'm 456 324 b 448 336 456 330 454 336 b 393 317 445 336 400 320 b 389 315 392 315 390 315 b 383 325 386 315 383 318 l 383 508 b 360 531 383 528 379 531 b 337 508 341 531 337 527 l 337 318 b 325 291 337 300 334 294 b 268 268 320 288 287 276 b 253 281 256 268 253 274 l 253 464 b 230 487 253 484 249 487 b 207 464 212 487 207 482 l 207 264 b 194 240 207 253 204 245 l 132 217 b 131 217 132 217 132 217 l 130 216 b 118 229 122 216 118 220 l 118 420 b 95 444 118 439 114 444 b 72 420 76 444 72 439 l 72 212 b 60 190 72 197 68 193 l 16 173 b 4 161 9 170 4 167 l 4 50 b 13 39 4 45 9 39 b 58 55 16 39 46 49 b 63 56 60 56 62 56 b 72 42 71 56 72 50 l 72 -125 b 58 -150 72 -137 65 -147 l 16 -166 b 4 -177 9 -168 4 -171 l 4 -289 b 14 -301 4 -295 9 -301 b 53 -287 16 -301 40 -291 b 62 -285 56 -285 59 -285 b 72 -298 69 -285 72 -289 l 72 -477 b 95 -500 72 -495 76 -500 b 118 -477 114 -500 118 -495 l 118 -278 b 127 -259 118 -269 121 -261 l 196 -232 b 207 -243 204 -232 207 -235 l 207 -432 b 230 -455 207 -452 212 -455 b 253 -432 249 -455 253 -451 l 253 -228 b 268 -204 253 -216 259 -207 l 320 -186 b 328 -183 323 -184 325 -183 b 337 -194 334 -183 337 -187 l 337 -387 b 360 -410 337 -408 341 -410 b 383 -387 379 -410 383 -406 l 383 -174 b 395 -157 383 -166 390 -158 l 445 -138 b 456 -127 452 -135 456 -132 l 456 -14 b 448 -3 456 -10 454 -3 b 397 -22 445 -3 408 -17 l 396 -23 b 383 -6 387 -23 383 -16 l 383 163 b 392 181 383 173 384 179 b 445 202 397 183 445 202 b 456 213 452 203 456 207 z m 337 -45 b 266 -78 333 -56 287 -78 b 258 -75 262 -78 259 -76 b 253 19 255 -71 253 -27 b 258 130 253 69 255 122 b 333 163 264 141 315 163 b 337 161 334 163 337 161 b 341 78 340 157 341 120 b 337 -45 341 24 340 -37 z m 118 -127 b 114 -48 114 -121 114 -86 b 118 78 114 6 115 68 b 200 114 122 91 180 114 b 207 111 204 114 206 112 b 212 22 210 107 212 66 b 207 -94 212 -29 210 -85 b 127 -130 203 -108 148 -130 b 118 -127 122 -130 120 -128 z',\n },\n accidentalBuyukMucennebFlat: {\n x_min: 1,\n x_max: 287,\n y_min: -174,\n y_max: 438,\n ha: 612,\n o: 'm 379 452 b 370 464 379 458 377 464 b 164 389 366 464 170 392 b 156 396 163 389 156 393 b 157 436 157 409 157 428 b 167 452 157 445 161 449 b 366 526 173 455 366 526 b 379 540 374 528 379 534 l 379 611 b 370 622 379 616 377 622 b 170 550 366 622 174 552 b 160 557 163 550 160 554 b 161 608 160 585 161 602 b 134 631 161 624 148 631 b 89 590 114 631 91 616 l 89 528 b 81 517 89 526 88 518 b 16 491 76 514 16 491 b 1 480 6 490 1 485 l 1 406 b 13 395 1 400 4 395 l 14 396 b 79 419 16 396 72 415 b 89 412 86 419 89 415 b 91 376 89 399 89 386 b 82 359 91 364 89 361 b 16 331 76 356 16 331 b 1 321 6 331 1 328 l 1 248 b 13 236 1 242 4 236 b 79 262 16 236 71 258 b 92 251 89 262 92 256 b 107 -242 95 23 101 -236 b 120 -251 111 -249 115 -251 b 128 -248 124 -251 128 -248 b 240 -160 171 -225 207 -184 b 413 84 367 -71 413 16 b 284 220 413 166 350 216 b 207 196 259 220 229 209 b 170 176 196 190 184 176 l 168 177 b 151 203 157 181 151 192 b 153 269 151 210 151 236 b 163 292 153 275 153 289 b 366 367 173 297 366 367 b 379 383 374 370 379 376 z m 186 -132 b 173 -137 180 -135 176 -137 b 157 -114 161 -137 157 -122 b 153 35 157 -114 153 -22 b 154 73 153 53 153 68 b 219 135 160 92 197 124 b 255 144 232 141 243 144 b 292 130 269 144 282 140 b 314 62 305 114 314 91 b 186 -132 314 -17 251 -94 z',\n },\n accidentalBakiyeFlat: {\n x_min: -1,\n x_max: 286,\n y_min: -175,\n y_max: 439,\n ha: 614,\n o: 'm 377 454 b 369 467 377 458 376 467 b 363 465 367 467 364 467 b 161 390 363 465 167 393 b 153 399 154 390 153 395 b 157 608 154 494 157 593 b 130 632 157 624 144 632 b 86 592 111 632 88 618 b 88 377 86 592 86 501 b 76 356 88 373 88 360 l 12 331 b -1 320 3 330 -1 327 l -1 248 b 9 236 -1 242 1 236 b 81 264 12 236 78 261 b 89 258 86 264 89 261 b 104 -245 92 30 96 -236 b 115 -252 108 -251 112 -252 b 124 -249 120 -252 124 -249 b 239 -161 167 -226 203 -186 b 412 84 367 -72 412 17 b 282 220 412 166 348 216 b 255 216 274 220 264 219 b 203 196 238 212 222 206 b 171 177 193 189 177 177 b 163 179 168 177 166 177 b 147 202 153 181 147 192 b 147 216 147 204 147 209 l 150 262 b 150 276 150 269 150 275 b 158 291 150 287 154 289 b 363 370 163 292 363 370 b 377 384 373 373 377 379 z m 181 -134 b 167 -138 176 -137 171 -138 b 153 -117 156 -138 153 -125 b 148 27 153 -117 148 -30 b 151 73 148 50 150 68 b 255 144 161 105 219 144 b 312 62 298 144 312 99 b 181 -134 312 -19 249 -96 z',\n },\n accidentalKomaSharp: {\n x_min: 0,\n x_max: 229,\n y_min: -337,\n y_max: 322,\n ha: 659,\n o: 'm 312 151 b 330 176 323 156 330 166 l 330 278 b 320 289 330 285 327 289 b 312 288 318 289 315 289 b 200 246 312 288 203 248 b 181 275 187 246 181 264 l 181 448 b 163 464 181 456 173 464 b 138 441 140 464 138 452 l 138 253 b 122 215 137 240 132 225 b 17 177 92 203 45 177 b 0 153 7 173 0 163 l 0 50 b 10 39 0 43 4 39 b 17 40 13 39 14 39 l 128 81 b 138 52 138 81 138 63 l 138 -91 b 124 -124 138 -107 132 -120 b 17 -167 115 -127 17 -167 b 0 -192 7 -171 0 -181 l 0 -294 b 10 -305 0 -301 4 -305 b 17 -304 13 -305 14 -305 b 128 -261 17 -304 117 -264 l 130 -259 b 138 -276 137 -259 138 -268 l 138 -469 b 157 -485 138 -478 147 -485 b 181 -462 179 -485 181 -475 l 181 -262 b 183 -252 181 -258 181 -255 b 197 -232 186 -243 190 -235 b 312 -187 207 -228 312 -187 b 330 -163 323 -183 330 -173 l 330 -60 b 320 -49 330 -53 327 -49 b 312 -50 318 -49 315 -49 l 200 -94 b 193 -95 197 -95 194 -95 b 181 -68 183 -95 181 -85 l 181 66 b 200 108 181 92 189 104 z',\n },\n accidentalKucukMucennebSharp: {\n x_min: -1,\n x_max: 339,\n y_min: -338,\n y_max: 321,\n ha: 659,\n o: 'm 264 92 b 271 102 264 98 265 99 l 395 150 b 412 174 405 154 412 164 l 412 276 b 402 288 412 284 409 288 b 395 287 400 288 397 288 b 282 245 395 287 285 246 b 264 274 269 245 264 262 l 264 446 b 245 462 264 455 255 462 b 220 439 222 462 220 451 l 220 252 b 204 213 219 239 215 223 b 99 176 174 202 127 176 b 82 151 89 171 82 161 l 82 49 b 92 37 82 42 86 37 b 99 39 95 37 96 37 l 210 79 b 216 81 212 81 215 81 b 220 78 219 81 220 79 l 220 56 b 216 46 220 52 220 48 b 16 -29 210 45 16 -29 b -1 -45 4 -32 -1 -36 l -1 -138 b 12 -154 -1 -145 3 -154 l 215 -79 b 220 -84 219 -79 220 -81 l 220 -105 b 210 -122 220 -115 219 -120 b 99 -168 202 -127 99 -168 b 82 -193 89 -173 82 -183 l 82 -295 b 92 -307 82 -302 86 -307 b 99 -305 95 -307 96 -307 b 210 -262 99 -305 199 -265 l 212 -261 b 220 -278 219 -261 220 -269 l 220 -471 b 239 -487 220 -480 229 -487 b 264 -464 261 -487 264 -477 l 264 -264 b 265 -253 264 -259 264 -256 b 279 -233 268 -245 272 -236 b 395 -189 289 -229 395 -189 b 412 -164 405 -184 412 -174 l 412 -62 b 402 -50 412 -55 409 -50 b 395 -52 400 -50 397 -50 l 278 -96 b 264 -86 268 -96 264 -94 l 264 -68 b 269 -59 264 -62 265 -60 b 471 17 274 -58 471 17 b 488 36 484 22 488 27 l 488 127 b 475 144 488 134 487 144 l 472 141 b 471 141 472 141 471 141 l 471 143 b 272 68 471 143 282 71 l 269 66 b 264 71 264 66 264 69 z',\n },\n accidentalKoron: {\n x_min: 0,\n x_max: 300,\n y_min: -472,\n y_max: 157,\n ha: 629,\n o: 'm 432 -4 b 415 10 432 1 418 9 l 4 226 b 0 223 1 226 0 225 l 0 -672 b 7 -680 0 -677 3 -680 l 45 -680 b 52 -672 49 -680 52 -677 l 52 -193 l 415 -22 b 432 -4 418 -20 432 -13 z m 52 -137 l 52 144 l 327 -7 z',\n },\n accidentalSori: {\n x_min: 0,\n x_max: 421,\n y_min: -318,\n y_max: 328,\n ha: 646,\n o: 'm 606 10 b 589 23 606 16 592 22 l 382 109 l 382 465 b 374 472 382 469 379 472 l 337 472 b 330 465 333 472 330 469 l 330 132 l 183 194 l 183 425 b 176 432 183 429 180 432 l 138 432 b 131 425 134 432 131 429 l 131 216 l 3 269 b 0 265 0 269 0 266 l 0 223 b 3 213 0 216 0 215 l 131 160 l 131 -150 l 3 -203 b 0 -212 0 -204 0 -206 l 0 -255 b 3 -259 0 -258 1 -259 l 131 -204 l 131 -451 b 138 -458 131 -455 134 -458 l 176 -458 b 183 -451 180 -458 183 -455 l 183 -183 l 330 -120 l 330 -410 b 337 -418 330 -415 333 -418 l 374 -418 b 382 -410 379 -418 382 -415 l 382 -98 l 589 -9 b 606 10 592 -9 606 0 z m 183 -128 l 183 138 l 330 76 l 330 -66 z m 382 -45 l 382 55 l 501 6 z',\n },\n articAccentAbove: {\n x_min: 0,\n x_max: 339,\n y_min: 1,\n y_max: 245,\n ha: 244,\n o: 'm 469 151 b 488 177 488 156 488 166 b 469 203 488 189 488 197 l 37 350 b 24 353 32 351 26 353 b 3 333 12 353 7 344 b 0 318 1 327 0 323 b 20 298 0 311 4 304 b 346 187 20 298 331 193 b 356 177 353 186 356 181 b 344 167 356 173 353 170 b 20 58 328 163 20 58 b 0 36 4 50 0 43 b 3 23 0 32 1 27 b 23 1 7 13 13 1 b 29 3 24 1 27 1 z',\n },\n articAccentBelow: {\n x_min: 0,\n x_max: 339,\n y_min: -244,\n y_max: 0,\n ha: 244,\n o: 'm 469 -202 b 488 -176 488 -197 488 -187 b 469 -150 488 -164 488 -156 l 37 -3 b 24 0 32 -1 26 0 b 3 -20 12 0 7 -9 b 0 -35 1 -26 0 -30 b 20 -55 0 -42 4 -49 b 346 -166 20 -55 331 -160 b 356 -176 353 -167 356 -171 b 344 -186 356 -180 353 -183 b 20 -295 328 -190 20 -295 b 0 -317 4 -302 0 -310 b 3 -330 0 -321 1 -325 b 23 -351 7 -340 13 -351 b 29 -350 24 -351 27 -351 z',\n },\n articTenutoAbove: {\n x_min: -1,\n x_max: 338,\n y_min: 0,\n y_max: 48,\n ha: 48,\n o: 'm 452 0 b 487 35 485 0 487 16 b 452 69 487 53 487 69 l 33 69 b -1 35 -1 69 -1 53 b 33 0 -1 16 -1 0 z',\n },\n articTenutoBelow: {\n x_min: -1,\n x_max: 338,\n y_min: -48,\n y_max: 0,\n ha: 48,\n o: 'm 452 -69 b 487 -35 485 -69 487 -53 b 452 0 487 -16 487 0 l 33 0 b -1 -35 -1 0 -1 -16 b 33 -69 -1 -53 -1 -69 z',\n },\n articStaccatoAbove: {\n x_min: 0,\n x_max: 84,\n y_min: 0,\n y_max: 84,\n ha: 84,\n o: 'm 121 60 b 60 121 121 94 94 121 b 0 60 27 121 0 94 b 60 0 0 27 27 0 b 121 60 94 0 121 27 z',\n },\n articStaccatoBelow: {\n x_min: 0,\n x_max: 84,\n y_min: -84,\n y_max: 0,\n ha: 84,\n o: 'm 121 -60 b 60 0 121 -27 94 0 b 0 -60 27 0 0 -27 b 60 -121 0 -94 27 -121 b 121 -60 94 -121 121 -94 z',\n },\n articStaccatissimoAbove: {\n x_min: 1,\n x_max: 100,\n y_min: -2,\n y_max: 293,\n ha: 295,\n o: 'm 72 422 b 1 390 35 422 3 409 b 72 -3 1 369 39 -3 b 144 389 108 -3 144 356 b 72 422 144 410 111 422 z',\n },\n articStaccatissimoBelow: {\n x_min: 1,\n x_max: 100,\n y_min: -295,\n y_max: 0,\n ha: 295,\n o: 'm 72 -425 b 144 -392 111 -425 144 -413 b 72 0 144 -359 108 0 b 1 -393 39 0 1 -372 b 72 -425 3 -412 35 -425 z',\n },\n articMarcatoAbove: {\n x_min: -1,\n x_max: 235,\n y_min: -1,\n y_max: 253,\n ha: 254,\n o: 'm 181 356 b 167 364 177 361 173 364 b 153 356 157 364 153 356 l 0 23 b -1 16 -1 20 -1 19 b 9 0 -1 9 1 1 b 16 -1 10 -1 14 -1 b 32 9 22 -1 29 1 b 112 186 32 9 109 180 b 118 190 114 189 115 190 b 127 186 121 190 124 189 b 209 9 128 180 209 9 b 225 0 213 3 219 0 l 323 0 b 338 16 333 1 338 7 b 337 23 338 19 338 22 z',\n },\n articMarcatoBelow: {\n x_min: -1,\n x_max: 235,\n y_min: -254,\n y_max: 0,\n ha: 254,\n o: 'm 156 -357 b 170 -366 160 -363 164 -366 b 184 -357 180 -366 184 -357 l 337 -24 b 338 -17 338 -22 338 -20 b 328 -1 338 -10 336 -3 b 321 0 327 0 323 0 b 305 -10 315 0 308 -3 b 225 -187 305 -10 228 -181 b 219 -192 223 -190 222 -192 b 210 -187 216 -192 213 -190 b 128 -10 209 -181 128 -10 b 112 -1 124 -4 118 -1 l 14 -1 b -1 -17 4 -3 -1 -9 b 0 -24 -1 -20 -1 -23 z',\n },\n fermataAbove: {\n x_min: 3,\n x_max: 605,\n y_min: -3,\n y_max: 329,\n ha: 332,\n o: 'm 435 318 b 818 36 742 318 804 91 b 821 26 819 32 819 27 b 851 -4 831 6 837 -4 b 871 16 864 -4 871 1 b 870 30 871 20 871 24 b 438 474 780 471 480 474 b 6 30 392 474 94 471 b 4 14 4 24 4 19 b 23 -4 4 0 12 -4 b 52 26 36 -4 43 6 b 56 39 53 27 55 33 b 435 318 73 98 138 318 z m 516 75 b 436 153 516 117 480 153 b 359 75 395 153 359 117 b 436 -4 359 32 395 -4 b 516 75 480 -4 516 32 z',\n },\n fermataBelow: {\n x_min: 3,\n x_max: 605,\n y_min: -332,\n y_max: 0,\n ha: 332,\n o: 'm 435 -323 b 56 -43 138 -323 73 -102 b 52 -30 55 -37 53 -32 b 23 0 43 -10 36 0 b 4 -19 12 0 4 -4 b 6 -35 4 -23 4 -29 b 438 -478 94 -475 392 -478 b 870 -35 480 -478 780 -475 b 871 -20 871 -29 871 -24 b 851 0 871 -6 864 0 b 821 -30 837 0 831 -10 b 818 -40 819 -32 819 -36 b 435 -323 804 -95 742 -323 z m 516 -79 b 436 0 516 -36 480 0 b 359 -79 395 0 359 -36 b 436 -157 359 -121 395 -157 b 516 -79 480 -157 516 -121 z',\n },\n breathMarkComma: {\n x_min: 1,\n x_max: 152,\n y_min: 2,\n y_max: 251,\n ha: 249,\n o: 'm 104 361 b 1 271 42 361 1 321 b 82 190 1 222 35 190 b 122 160 118 190 122 160 b 125 144 124 154 125 150 b 102 88 125 124 115 105 b 37 32 78 56 40 35 b 26 17 32 29 26 26 l 27 16 b 37 3 29 6 33 3 b 181 102 85 3 158 66 b 219 239 210 147 219 197 l 219 249 b 104 361 219 317 170 361 z',\n },\n breathMarkUpbow: {\n x_min: 1,\n x_max: 249,\n y_min: 1,\n y_max: 495,\n ha: 494,\n o: 'm 181 1 b 206 22 193 1 203 10 l 359 683 l 359 688 b 338 713 359 700 351 710 l 333 713 b 308 694 321 713 311 706 l 180 140 l 53 694 b 27 713 49 706 39 713 l 22 713 b 1 690 10 710 1 700 b 3 683 1 687 1 685 l 154 22 b 181 1 157 10 167 1 z',\n },\n caesura: {\n x_min: 0,\n x_max: 384,\n y_min: -1,\n y_max: 532,\n ha: 533,\n o: 'm 40 -1 b 78 26 58 -1 72 9 l 321 713 b 323 726 323 717 323 721 b 282 766 323 747 304 766 b 245 739 265 766 251 756 l 3 52 b 0 37 1 48 0 42 b 27 1 0 22 10 7 b 40 -1 32 -1 36 -1 z m 308 26 l 552 713 b 553 726 553 717 553 721 b 513 766 553 747 534 766 b 475 739 495 766 481 756 l 232 52 b 230 39 230 48 230 43 b 258 1 230 23 240 7 b 271 -1 262 -1 266 -1 b 308 26 287 -1 302 9 z',\n },\n caesuraCurved: {\n x_min: 0,\n x_max: 373,\n y_min: 0,\n y_max: 530,\n ha: 530,\n o: 'm 491 763 b 445 719 468 763 446 744 b 252 98 432 507 340 295 l 226 39 b 223 27 225 35 223 32 b 252 0 223 13 233 0 b 276 16 262 0 272 6 b 537 716 386 230 537 478 b 491 763 537 742 518 763 z m 29 0 b 53 16 39 0 48 6 l 82 69 b 314 716 187 264 314 498 b 268 763 314 742 295 763 b 222 719 245 763 223 744 b 29 98 209 507 117 295 l 3 39 b 0 29 1 36 0 33 b 29 0 0 14 12 0 z',\n },\n restMaxima: {\n x_min: 0,\n x_max: 381,\n y_min: -249,\n y_max: 250,\n ha: 499,\n o: 'm 180 -330 l 180 331 b 156 360 180 356 170 360 l 23 360 b 0 331 10 360 0 356 l 0 -330 b 23 -359 0 -354 10 -359 l 156 -359 b 180 -330 170 -359 180 -354 z m 549 -330 l 549 331 b 524 360 549 356 539 360 l 392 360 b 369 331 379 360 369 356 l 369 -330 b 392 -359 369 -354 379 -359 l 524 -359 b 549 -330 539 -359 549 -354 z',\n },\n restDoubleWhole: {\n x_min: 0,\n x_max: 125,\n y_min: 0,\n y_max: 250,\n ha: 250,\n o: 'm 180 22 l 180 338 b 156 360 180 350 170 360 l 23 360 b 0 338 10 360 0 350 l 0 22 b 23 0 0 10 10 0 l 156 0 b 180 22 170 0 180 10 z',\n },\n restWhole: {\n x_min: 0,\n x_max: 282,\n y_min: -135,\n y_max: 9,\n ha: 144,\n o: 'm 406 -157 l 406 -24 b 369 13 406 -3 389 13 l 37 13 b 0 -24 16 13 0 -3 l 0 -157 b 37 -194 0 -177 16 -194 l 369 -194 b 406 -157 389 -194 406 -177 z',\n },\n restHalf: {\n x_min: 0,\n x_max: 282,\n y_min: -2,\n y_max: 142,\n ha: 144,\n o: 'm 406 35 l 406 167 b 369 204 406 189 389 204 l 37 204 b 0 167 16 204 0 189 l 0 35 b 37 -3 0 14 16 -3 l 369 -3 b 406 35 389 -3 406 14 z',\n },\n restQuarter: {\n x_min: 1,\n x_max: 270,\n y_min: -375,\n y_max: 373,\n ha: 748,\n o: 'm 112 -55 b 174 -141 135 -84 156 -111 b 183 -161 177 -147 183 -158 b 181 -167 183 -163 183 -166 b 166 -174 179 -173 173 -174 b 143 -170 160 -174 148 -171 b 137 -170 141 -170 138 -170 l 125 -166 b 1 -304 50 -166 1 -233 b 168 -527 1 -376 63 -446 b 206 -540 180 -536 194 -540 b 228 -531 216 -540 226 -537 b 230 -521 229 -527 230 -524 b 207 -487 230 -508 219 -497 b 170 -435 189 -487 173 -448 b 164 -397 166 -423 164 -410 b 255 -292 164 -338 194 -292 b 369 -317 297 -292 344 -308 l 370 -318 b 382 -320 376 -320 379 -320 b 389 -314 386 -320 389 -318 b 336 -232 389 -297 351 -249 b 236 -32 281 -166 236 -112 b 236 -27 236 -30 236 -29 l 238 -17 b 238 -13 238 -16 238 -14 b 333 199 243 71 295 140 b 338 220 337 206 338 213 b 333 248 338 235 333 248 b 95 526 333 248 120 501 b 69 537 88 533 78 537 b 40 507 55 537 40 527 b 46 484 40 500 42 492 b 134 291 52 468 134 395 b 48 108 134 238 112 176 b 27 66 33 94 27 78 b 42 32 27 46 42 32 z',\n },\n rest8th: {\n x_min: 0,\n x_max: 247,\n y_min: -251,\n y_max: 174,\n ha: 425,\n o: 'm 193 154 b 96 251 193 207 150 251 b 0 154 43 251 0 207 b 39 81 0 124 17 98 b 117 56 62 65 89 56 b 173 66 137 56 157 60 b 225 88 193 72 206 78 b 232 89 228 89 230 89 b 239 76 238 89 239 84 b 238 60 239 72 239 66 b 104 -343 233 39 130 -248 b 145 -361 104 -360 137 -361 b 196 -347 161 -361 181 -359 b 341 161 200 -344 341 161 b 356 217 347 187 354 210 b 338 240 356 232 341 239 b 323 235 336 240 331 240 b 193 140 312 226 240 140 z',\n },\n rest16th: {\n x_min: 0,\n x_max: 320,\n y_min: -500,\n y_max: 179,\n ha: 679,\n o: 'm 300 160 b 202 258 300 215 256 258 b 104 160 148 258 104 215 b 219 62 104 101 164 62 b 331 94 258 62 298 75 b 341 96 336 95 338 96 b 348 86 346 96 348 94 b 265 -173 348 63 275 -151 b 194 -217 253 -200 215 -217 b 196 -203 196 -212 196 -207 b 98 -105 196 -148 151 -105 b 0 -203 43 -105 0 -148 b 115 -301 0 -262 60 -301 b 223 -271 153 -301 190 -288 b 229 -279 226 -271 229 -274 l 228 -281 b 228 -282 228 -282 228 -282 l 91 -690 b 91 -691 91 -690 91 -691 l 89 -693 b 134 -720 89 -706 102 -720 b 189 -687 176 -720 183 -703 l 356 -138 b 420 81 393 -16 420 81 b 459 226 420 81 456 207 b 461 232 459 229 461 230 b 446 248 461 240 449 246 b 431 242 439 248 435 245 b 300 145 420 233 348 147 z',\n },\n rest32nd: {\n x_min: 0,\n x_max: 363,\n y_min: -500,\n y_max: 426,\n ha: 926,\n o: 'm 508 603 b 492 598 501 603 497 600 b 361 503 482 590 410 503 l 361 516 b 264 613 361 570 318 613 b 166 516 210 613 166 570 b 206 444 166 487 183 461 b 246 423 217 433 232 428 b 284 418 258 420 269 418 b 393 449 321 418 360 432 b 399 451 395 451 397 451 b 415 426 409 451 415 436 l 413 423 b 413 422 413 423 413 422 l 357 192 b 279 140 350 168 302 140 b 281 153 281 144 281 148 b 183 251 281 207 236 251 b 85 153 128 251 85 207 b 125 81 85 124 102 98 b 164 60 137 71 150 65 b 203 55 176 58 189 55 b 311 86 240 55 278 69 b 315 88 312 88 314 88 b 325 69 323 88 325 76 l 268 -167 b 194 -217 261 -197 216 -216 b 196 -203 196 -212 196 -207 b 98 -105 196 -148 153 -105 b 0 -203 45 -105 0 -148 b 115 -301 0 -262 60 -301 b 228 -269 154 -301 194 -288 b 232 -268 229 -268 230 -268 b 240 -276 236 -268 240 -272 b 138 -688 240 -282 141 -678 b 137 -697 137 -691 137 -694 b 176 -720 137 -708 145 -720 b 232 -690 222 -720 226 -706 b 484 436 236 -672 484 436 b 521 582 484 436 518 564 b 523 588 521 585 523 586 b 508 603 523 600 511 603 z',\n },\n rest64th: {\n x_min: 0,\n x_max: 423,\n y_min: -753,\n y_max: 430,\n ha: 1183,\n o: 'm 596 609 b 580 603 589 609 585 606 b 448 507 569 595 497 507 b 449 521 449 511 449 516 b 351 619 449 575 405 619 b 253 521 297 619 253 575 b 372 422 253 461 317 422 b 481 454 410 422 446 438 b 491 456 484 455 488 456 b 504 441 498 456 504 451 b 501 426 504 436 503 432 b 445 202 500 422 451 217 b 359 144 435 174 383 144 l 359 158 b 261 256 359 212 315 256 b 163 158 207 256 163 212 b 243 65 163 112 202 78 b 279 60 255 62 266 60 b 397 91 320 60 360 73 b 403 92 400 92 402 92 b 412 79 409 92 412 86 b 410 72 412 76 412 75 b 351 -161 408 59 356 -150 b 281 -212 340 -199 301 -212 l 281 -197 b 183 -99 281 -144 238 -99 b 85 -197 130 -99 85 -144 b 125 -271 85 -228 102 -253 b 166 -291 138 -279 151 -287 b 204 -297 177 -294 192 -297 b 262 -287 225 -297 245 -292 b 305 -265 282 -279 287 -274 b 310 -264 307 -264 308 -264 b 318 -284 317 -264 318 -275 b 317 -295 318 -288 317 -294 b 259 -524 315 -302 265 -508 b 194 -567 251 -554 213 -567 b 196 -554 196 -563 196 -559 b 98 -456 196 -500 153 -456 b 0 -554 45 -456 0 -500 b 40 -626 0 -583 17 -609 b 118 -652 60 -644 92 -652 b 210 -629 145 -652 186 -642 b 216 -628 213 -628 215 -628 b 228 -647 226 -628 228 -639 l 226 -651 b 226 -652 226 -651 226 -652 l 122 -1054 b 121 -1064 121 -1058 121 -1061 b 167 -1084 121 -1077 134 -1084 b 215 -1060 202 -1084 209 -1076 b 402 -278 217 -1047 229 -1021 b 436 -135 403 -278 431 -161 l 570 441 b 609 588 570 441 605 569 b 596 609 609 603 602 608 z',\n },\n rest128th: {\n x_min: 0,\n x_max: 485,\n y_min: -750,\n y_max: 689,\n ha: 1439,\n o: 'm 537 894 b 439 992 537 949 494 992 b 341 894 386 992 341 949 b 382 822 341 865 359 840 b 459 796 402 805 433 796 b 518 806 480 796 501 801 l 520 808 b 569 828 539 814 552 819 b 580 831 572 829 577 831 b 598 812 589 831 598 825 b 596 801 598 809 598 805 b 540 575 590 773 546 595 b 448 510 534 553 475 510 l 448 524 b 350 622 448 577 405 622 b 252 524 297 622 252 577 b 292 451 252 494 269 468 b 369 426 318 433 337 426 b 429 435 389 426 412 429 b 494 464 449 442 475 455 b 498 465 495 465 497 465 b 505 446 504 465 505 456 b 503 426 505 439 504 432 l 446 202 b 366 144 439 173 389 144 l 366 158 b 268 256 366 212 323 256 b 170 158 215 256 170 212 b 289 59 170 98 235 59 b 347 69 310 59 330 63 b 397 91 367 76 379 82 b 406 94 400 92 403 94 b 415 79 412 94 415 88 b 412 63 415 75 413 69 b 357 -157 408 42 364 -134 b 281 -212 346 -196 302 -212 b 282 -197 281 -207 282 -203 b 184 -99 282 -144 238 -99 b 86 -197 130 -99 86 -144 b 204 -297 86 -258 150 -297 b 262 -287 225 -297 245 -292 b 312 -265 282 -279 294 -274 b 318 -264 314 -264 317 -264 b 327 -275 324 -264 327 -269 b 266 -517 324 -287 278 -490 b 200 -569 248 -566 220 -567 l 196 -554 b 98 -456 196 -500 153 -456 b 0 -554 45 -456 0 -500 b 118 -652 0 -615 63 -652 b 177 -642 138 -652 160 -648 l 179 -641 b 229 -621 197 -635 210 -629 l 230 -619 b 239 -626 236 -619 239 -622 b 238 -632 239 -628 239 -631 b 131 -1057 235 -642 134 -1050 b 173 -1080 131 -1071 140 -1080 b 230 -1057 219 -1080 225 -1074 l 658 815 b 697 960 658 815 694 942 b 698 966 697 963 698 965 b 684 982 698 975 687 981 b 668 976 677 982 672 979 b 537 880 658 969 586 881 z',\n },\n dynamicPiano: {\n x_min: -89,\n x_max: 366,\n y_min: -142,\n y_max: 274,\n ha: 416,\n o: 'm 395 395 b 292 357 350 395 318 380 b 262 328 272 340 268 328 b 246 363 255 328 259 338 b 177 393 236 380 215 393 b 1 251 92 393 46 333 b -9 223 -6 238 -9 230 b 7 207 -9 213 -1 207 b 30 229 17 207 23 216 b 127 338 72 301 101 338 b 143 321 138 338 143 331 b 134 285 143 310 138 295 l -43 -154 b -65 -168 -48 -166 -50 -168 l -109 -168 b -128 -187 -122 -168 -128 -174 b -111 -204 -128 -199 -122 -204 l 167 -204 b 186 -186 180 -204 186 -199 b 168 -168 186 -174 180 -168 l 111 -168 b 98 -164 102 -168 98 -168 b 101 -154 98 -163 99 -158 l 166 7 b 179 24 168 14 171 24 b 213 -1 186 24 190 10 b 276 -14 233 -12 252 -14 b 527 266 415 -14 527 130 b 395 395 527 350 475 395 z m 356 341 b 389 288 380 341 389 320 b 243 35 389 217 312 35 b 207 81 219 35 207 50 b 235 180 207 111 219 140 l 264 251 b 356 341 284 300 321 341 z',\n },\n dynamicMezzo: {\n x_min: -20,\n x_max: 446,\n y_min: -10,\n y_max: 274,\n ha: 284,\n o: 'm 528 395 b 431 350 487 395 454 374 b 409 330 416 336 415 330 b 397 360 402 330 406 341 b 334 395 389 379 370 395 b 236 350 292 395 259 374 b 215 330 222 336 220 330 b 203 360 207 330 212 340 b 147 393 194 379 174 393 b -19 251 71 393 26 331 b -29 223 -26 238 -29 230 b -13 207 -29 213 -22 207 b 9 226 -3 207 1 215 b 107 338 52 300 81 338 b 122 321 118 338 122 331 b 114 285 122 310 118 295 l 9 24 b 4 9 6 17 4 13 b 20 0 4 3 9 0 l 91 0 b 114 17 104 0 108 3 l 207 251 b 287 323 225 292 255 323 b 308 302 304 323 308 314 b 294 249 308 285 302 269 b 203 24 294 248 292 248 b 199 9 200 17 199 13 b 215 0 199 3 203 0 l 285 0 b 308 17 298 0 302 3 l 402 251 b 481 323 419 292 449 323 b 503 302 498 323 503 314 b 413 43 503 252 413 104 b 478 -14 413 6 436 -14 b 629 102 533 -14 583 26 b 642 132 638 117 642 125 b 629 145 642 141 636 145 b 608 127 619 145 615 138 b 534 49 580 84 553 49 b 523 62 526 49 523 53 b 606 317 523 112 606 238 b 528 395 606 353 588 395 z',\n },\n dynamicForte: {\n x_min: -141,\n x_max: 364,\n y_min: -152,\n y_max: 444,\n ha: 596,\n o: 'm 23 380 b 0 357 7 380 0 373 b 22 336 0 343 7 336 l 105 336 b 117 330 114 336 117 336 b 114 315 117 327 115 323 l 23 0 b -101 -187 -17 -141 -43 -187 b -127 -174 -120 -187 -127 -181 b -92 -156 -127 -163 -114 -170 b -63 -102 -75 -144 -63 -125 b -128 -43 -63 -65 -89 -43 b -203 -122 -171 -43 -203 -78 b -95 -219 -203 -186 -156 -219 b 161 17 14 -219 82 -145 b 269 317 203 105 235 194 l 271 318 b 289 336 271 323 282 336 l 383 336 b 406 359 399 336 406 343 b 384 380 406 373 399 380 l 298 380 b 284 387 288 380 284 380 b 287 405 284 392 285 396 b 419 606 315 530 347 606 b 442 595 431 606 442 603 b 419 580 442 586 435 588 b 389 526 400 572 389 552 b 454 465 389 485 418 465 b 524 543 491 465 524 490 b 400 639 524 596 491 639 b 135 402 261 639 183 540 b 107 380 128 380 127 380 z',\n },\n dynamicRinforzando: {\n x_min: -20,\n x_max: 277,\n y_min: 0,\n y_max: 274,\n ha: 274,\n o: 'm 324 395 b 235 350 287 395 256 374 b 215 330 222 336 220 330 b 203 360 207 330 213 337 b 145 393 194 379 174 393 b -19 251 75 393 27 337 b -29 223 -26 238 -29 230 b -13 207 -29 213 -22 207 b 9 226 -3 207 3 215 b 107 338 52 301 81 338 b 122 321 118 338 122 331 b 114 285 122 310 118 295 l 9 24 b 4 9 6 17 4 13 b 20 0 4 3 9 0 l 91 0 b 114 17 104 0 108 3 l 207 251 b 304 351 226 298 272 351 b 318 343 312 351 318 348 b 287 285 318 330 287 325 b 338 239 287 256 308 239 b 399 318 373 239 399 268 b 324 395 399 360 377 395 z',\n },\n dynamicSforzando: {\n x_min: 0,\n x_max: 229,\n y_min: -10,\n y_max: 273,\n ha: 283,\n o: 'm 212 393 b 68 274 127 393 68 350 b 145 161 68 223 95 196 b 200 85 187 132 200 114 b 127 20 200 53 173 20 b 66 42 91 20 66 32 b 91 56 66 49 75 46 b 111 98 104 65 111 79 b 59 145 111 127 86 145 b 0 78 24 145 0 117 b 125 -14 0 30 49 -14 b 291 120 219 -14 291 36 b 220 232 291 160 276 190 b 151 314 168 271 151 287 b 213 361 151 337 168 361 b 258 346 238 361 258 356 b 240 333 258 340 251 340 b 226 298 232 325 226 314 b 276 252 226 269 248 252 b 330 307 311 252 330 279 b 212 393 330 360 285 393 z',\n },\n dynamicZ: {\n x_min: -30,\n x_max: 244,\n y_min: -10,\n y_max: 268,\n ha: 278,\n o: 'm 333 386 b 298 377 321 386 314 382 b 239 370 282 373 259 370 b 94 383 153 370 111 383 b 68 364 79 383 72 377 l 33 264 b 29 242 30 255 29 248 b 45 228 29 232 36 228 b 66 249 55 228 60 236 l 81 279 b 96 297 85 288 88 297 b 168 292 102 297 127 292 b 223 302 194 292 215 302 b 196 269 229 302 197 271 l -26 45 b -43 16 -37 33 -43 27 b -24 -1 -43 6 -36 -1 b 4 16 -12 -1 -3 10 b 39 30 16 24 27 30 b 179 -14 79 30 108 -14 b 297 102 259 -14 297 43 b 245 166 297 147 271 166 b 197 115 219 166 197 145 b 236 72 197 88 216 72 b 259 79 251 72 255 79 b 264 75 262 79 264 78 b 258 60 264 72 261 66 b 229 45 252 50 242 45 b 117 95 186 45 173 95 b 85 86 98 95 89 86 b 102 111 85 86 95 104 l 333 338 b 351 370 344 350 351 359 b 333 386 351 380 343 386 z',\n },\n ornamentTrill: {\n x_min: 0,\n x_max: 521,\n y_min: -10,\n y_max: 390,\n ha: 400,\n o: 'm 383 562 b 364 557 377 562 369 559 l 294 534 b 269 511 281 530 275 526 l 217 384 b 206 367 212 370 210 367 b 179 380 200 367 192 374 b 118 393 158 389 140 393 b 0 292 50 393 0 353 b 95 210 0 248 30 210 b 140 213 112 210 131 213 b 144 209 143 213 144 212 b 140 194 144 206 143 202 l 124 156 b 96 58 108 117 96 88 b 179 -14 96 17 124 -14 b 325 153 253 -14 325 46 b 307 251 325 187 320 219 b 302 265 304 258 302 261 b 334 294 302 274 311 281 l 343 298 b 455 348 393 328 428 348 b 474 327 468 348 474 344 b 465 285 474 312 469 295 l 360 24 b 356 9 357 17 356 13 b 372 0 356 3 360 0 l 442 0 b 465 17 455 0 459 3 l 559 251 b 655 351 577 298 624 351 b 670 343 664 351 670 348 b 638 285 670 330 638 325 b 690 239 638 256 660 239 b 750 318 724 239 750 268 b 675 395 750 360 729 395 b 586 350 638 395 608 374 b 566 330 573 336 572 330 b 553 361 559 330 564 340 b 490 393 543 380 521 393 b 347 348 432 393 377 364 b 312 333 328 338 320 333 b 308 337 310 333 308 334 b 315 359 308 343 312 351 l 387 537 b 392 553 390 544 392 549 b 383 562 392 559 389 562 z m 118 360 b 192 325 134 360 192 347 b 186 307 192 321 189 314 l 180 292 b 148 265 173 274 167 269 b 98 258 130 261 112 258 b 39 301 50 258 39 281 b 118 360 39 327 60 360 z m 272 240 b 292 151 285 240 292 164 b 212 30 292 88 253 30 b 196 48 200 30 196 37 b 207 92 196 59 202 78 b 264 230 207 94 209 94 b 272 240 266 238 268 240 z',\n },\n ornamentTurn: {\n x_min: 0,\n x_max: 460,\n y_min: 0,\n y_max: 218,\n ha: 218,\n o: 'm 534 314 b 454 251 490 314 454 294 b 505 199 454 219 475 199 b 579 232 547 199 549 232 b 626 164 603 232 626 202 b 533 72 626 102 583 72 b 377 180 487 72 439 111 b 150 312 307 258 243 312 b 0 148 55 312 0 240 b 128 0 0 45 66 0 b 209 63 173 0 209 20 b 157 115 209 95 187 115 b 84 82 115 115 114 82 b 36 150 59 82 36 112 b 130 242 36 212 79 242 b 285 134 176 242 223 203 b 513 1 356 56 419 1 b 662 166 608 1 662 73 b 534 314 662 269 596 314 z',\n },\n ornamentTurnSlash: {\n x_min: 0,\n x_max: 460,\n y_min: -90,\n y_max: 306,\n ha: 396,\n o: 'm 333 441 b 310 418 315 441 310 433 l 310 274 b 302 252 310 258 308 252 b 261 278 294 252 287 262 b 150 311 228 298 192 311 b 0 147 55 311 0 239 b 128 -1 0 43 66 -1 b 209 62 173 -1 209 19 b 157 114 209 94 187 114 b 84 81 115 114 114 81 b 36 148 59 81 36 111 b 130 240 36 210 79 240 b 285 128 176 240 222 197 b 307 79 304 108 307 105 l 307 -107 b 330 -130 307 -122 312 -130 b 353 -107 347 -130 353 -122 l 353 37 b 360 59 353 53 353 59 b 402 33 369 59 376 49 b 513 0 435 13 471 0 b 662 164 608 0 662 72 b 534 312 662 268 596 312 b 454 249 490 312 454 292 b 505 197 454 217 475 197 b 579 230 547 197 549 230 b 626 163 603 230 626 200 b 533 71 626 101 583 71 b 377 183 487 71 441 114 b 356 232 359 203 356 206 l 356 418 b 333 441 356 433 350 441 z',\n },\n ornamentMordent: {\n x_min: 1,\n x_max: 729,\n y_min: -73,\n y_max: 319,\n ha: 392,\n o: 'm 546 265 l 546 459 l 501 459 l 501 216 l 459 167 b 439 167 454 160 445 160 b 302 327 387 228 310 317 b 258 353 291 338 282 351 b 226 340 245 353 238 348 l 20 107 b 1 73 12 98 1 84 b 30 59 1 65 9 59 b 88 94 53 59 73 79 b 144 143 107 109 124 127 b 176 161 158 154 168 161 b 197 144 183 161 189 156 l 323 10 b 351 0 328 3 340 0 b 377 9 361 0 372 3 b 498 114 392 17 475 94 l 498 -105 l 544 -105 l 544 153 b 562 160 550 157 556 160 b 585 144 569 160 576 156 b 710 10 590 135 697 24 b 737 0 716 3 727 0 b 765 9 749 0 759 3 b 1030 295 776 17 1011 274 l 1032 300 b 1050 328 1041 308 1050 318 b 1012 353 1050 343 1024 353 b 986 343 1002 353 994 348 b 854 190 971 330 871 206 b 828 176 842 180 835 176 b 802 190 818 176 809 183 b 681 333 791 202 696 320 b 645 353 668 344 657 353 b 613 340 634 353 626 350 b 580 304 600 330 590 315 z',\n },\n ornamentShortTrill: {\n x_min: 0,\n x_max: 725,\n y_min: 0,\n y_max: 245,\n ha: 245,\n o: 'm 429 167 l 301 325 b 256 353 291 338 282 350 b 225 340 246 353 238 350 b 16 105 158 268 88 186 b 0 72 9 96 0 86 b 29 58 0 63 7 58 b 71 76 42 58 55 62 l 158 154 b 174 160 163 158 168 160 b 197 143 181 160 187 154 b 321 10 203 135 310 24 b 350 0 327 3 338 0 b 377 7 361 0 372 3 l 533 148 b 554 160 543 158 550 160 b 577 143 562 160 566 156 b 703 10 585 135 690 24 b 732 0 708 3 720 0 b 759 7 743 0 753 3 b 1024 294 769 16 1005 272 b 1044 327 1032 305 1044 321 b 1005 353 1044 341 1018 353 b 979 343 996 353 988 348 b 848 189 963 330 864 204 b 821 174 837 179 828 174 b 796 189 811 174 804 181 b 674 331 783 202 688 318 b 641 351 662 343 651 351 b 606 340 628 351 619 350 b 573 304 593 328 583 315 b 444 167 533 259 491 213 b 429 167 439 161 433 161 z',\n },\n ornamentTremblement: {\n x_min: 1,\n x_max: 985,\n y_min: 0,\n y_max: 244,\n ha: 244,\n o: 'm 678 325 b 634 351 667 338 657 350 b 602 338 621 351 613 348 l 448 167 b 439 167 446 164 441 164 l 302 325 b 258 351 291 338 281 350 b 228 338 245 351 238 348 b 193 304 215 328 204 315 l 19 107 b 1 72 13 96 1 76 b 30 58 1 63 9 58 b 89 92 52 58 73 78 l 144 141 b 148 144 145 143 147 143 b 176 160 160 153 170 160 b 199 143 183 160 189 154 b 324 10 204 134 311 23 b 351 0 330 3 340 0 b 379 7 363 0 373 3 l 530 148 b 552 160 536 154 546 160 b 575 143 559 160 564 154 b 698 10 580 134 687 23 b 727 0 704 3 716 0 b 755 7 739 0 749 3 l 907 147 b 930 160 922 158 923 160 b 952 143 937 160 943 154 l 1077 10 b 1107 0 1084 3 1096 0 b 1133 7 1117 0 1128 3 b 1398 294 1143 16 1380 272 b 1418 327 1407 305 1418 321 b 1381 351 1418 343 1394 351 b 1354 341 1371 351 1362 348 b 1223 189 1338 328 1238 204 b 1195 174 1211 179 1202 174 b 1171 189 1185 174 1178 181 b 1048 331 1158 200 1063 318 b 1012 351 1035 343 1024 351 b 981 338 1002 351 994 350 b 948 304 968 328 958 315 b 827 166 907 258 865 212 b 815 166 824 163 818 163 b 678 325 760 226 732 264 z',\n },\n ornamentPrecompAppoggTrill: {\n x_min: 0,\n x_max: 1119,\n y_min: 0,\n y_max: 481,\n ha: 481,\n o: 'm 1015 163 b 873 328 963 223 880 318 b 828 354 860 344 847 353 b 796 341 816 354 809 351 b 763 305 783 331 773 317 b 642 168 721 261 681 215 b 636 163 641 167 639 164 b 494 328 585 223 501 318 b 449 354 481 344 468 353 b 418 341 438 354 431 351 b 384 305 405 331 395 317 b 264 168 343 261 302 215 l 242 144 b 144 88 232 124 171 88 b 79 197 81 88 79 189 l 79 648 b 60 693 79 683 71 693 b 52 691 58 693 55 693 b 0 616 3 672 0 625 l 0 207 b 121 0 0 40 68 0 b 249 68 168 0 232 53 b 279 94 262 75 271 86 b 336 144 298 111 315 128 b 367 163 350 156 360 163 b 389 145 374 163 380 157 b 514 12 395 137 501 26 b 543 1 520 4 531 1 b 569 9 553 1 563 4 b 636 73 576 14 605 43 l 658 94 b 714 144 677 111 694 128 b 746 163 729 156 739 163 b 768 145 753 163 759 157 b 893 12 773 137 880 26 b 922 1 899 4 910 1 b 948 9 932 1 942 4 l 1012 71 b 1037 94 1022 78 1030 86 b 1092 144 1054 111 1073 128 b 1123 161 1106 156 1115 161 b 1146 145 1130 161 1136 157 b 1270 12 1152 137 1259 26 b 1299 1 1276 4 1287 1 b 1326 9 1310 1 1320 4 b 1591 297 1336 19 1572 275 b 1611 328 1600 307 1611 320 b 1574 354 1611 343 1585 354 b 1548 344 1565 354 1555 350 b 1416 192 1532 331 1431 206 b 1388 177 1404 181 1395 177 b 1365 190 1380 177 1371 184 b 1243 333 1352 203 1256 321 b 1205 354 1228 346 1217 354 b 1174 341 1195 354 1187 351 b 1140 305 1161 330 1152 317 z',\n },\n ornamentPrecompSlideTrillDAnglebert: {\n x_min: 2,\n x_max: 1150,\n y_min: -367,\n y_max: 245,\n ha: 612,\n o: 'm 1058 160 b 916 327 1007 220 923 317 b 871 353 903 343 890 351 b 840 340 860 353 852 350 b 806 304 827 330 816 315 b 685 167 765 259 724 213 l 680 160 l 615 235 b 419 344 582 275 523 344 b 3 -144 258 344 3 26 b 4 -168 3 -153 3 -160 b 246 -482 24 -315 99 -422 b 458 -528 340 -521 410 -528 b 514 -526 485 -528 504 -526 b 552 -508 531 -526 552 -517 b 514 -497 552 -503 541 -498 l 503 -497 b 194 -390 432 -494 298 -488 b 69 -151 194 -390 69 -279 b 184 96 69 -60 128 27 b 328 183 202 118 258 183 b 477 96 413 183 454 118 b 559 10 510 62 552 19 b 588 0 566 3 576 0 b 613 7 598 0 609 3 b 723 112 622 14 681 73 b 789 161 733 122 776 161 b 811 144 796 161 802 156 b 936 10 816 135 923 24 b 965 0 942 3 953 0 b 991 7 975 0 985 3 b 1051 66 996 12 1022 37 b 1081 92 1063 73 1073 84 b 1136 143 1099 109 1117 127 b 1168 160 1151 154 1159 160 b 1191 144 1175 160 1181 156 b 1315 10 1197 135 1303 24 b 1344 0 1320 3 1332 0 b 1371 7 1355 0 1365 3 b 1636 295 1381 17 1617 274 b 1656 327 1644 305 1656 318 b 1619 353 1656 341 1630 353 b 1593 343 1610 353 1600 348 b 1460 190 1577 330 1476 204 b 1433 176 1449 180 1440 176 b 1410 189 1424 176 1416 183 b 1287 331 1397 202 1300 320 b 1250 353 1273 344 1261 353 b 1218 340 1240 353 1231 350 b 1185 304 1205 328 1197 315 z',\n },\n ornamentPrecompSlideTrillBach: {\n x_min: 0,\n x_max: 1048,\n y_min: -367,\n y_max: 331,\n ha: 698,\n o: 'm 1038 477 l 979 477 l 979 238 l 912 160 b 769 327 858 220 775 317 b 724 353 756 343 743 351 b 693 340 713 353 706 350 b 660 304 680 330 670 315 b 539 167 618 259 577 213 b 533 161 536 166 534 163 b 390 327 480 220 396 317 b 346 353 377 343 364 351 l 340 353 b 308 340 330 353 321 350 b 275 304 295 330 285 315 b 117 122 220 243 168 186 b 0 -144 68 62 0 -48 b 1 -168 0 -153 0 -160 b 243 -482 22 -315 96 -422 b 455 -528 337 -521 408 -528 b 511 -526 482 -528 501 -526 b 549 -508 528 -526 549 -517 b 511 -497 549 -503 539 -498 l 500 -497 b 192 -390 429 -494 295 -488 b 68 -177 192 -390 84 -298 b 66 -151 66 -168 66 -160 b 189 105 66 -58 127 35 b 232 143 203 118 216 131 b 264 161 246 154 256 161 b 285 144 271 161 276 156 b 410 10 291 135 397 24 b 439 0 416 3 428 0 b 465 7 449 0 459 3 l 531 72 b 554 92 540 78 547 86 b 611 143 573 109 590 127 b 642 161 625 154 635 161 b 664 144 649 161 655 156 b 789 10 670 135 776 24 b 818 0 795 3 806 0 b 844 7 828 0 838 3 b 904 66 850 12 876 37 b 935 92 916 73 924 84 b 979 134 949 107 963 121 l 979 -88 l 1037 -88 l 1037 151 l 1044 144 b 1168 10 1050 135 1156 24 b 1197 0 1174 3 1185 0 b 1224 7 1208 0 1218 3 b 1489 295 1234 17 1470 274 b 1509 327 1498 305 1509 318 b 1472 353 1509 341 1483 353 b 1446 343 1463 353 1453 348 b 1313 190 1430 330 1329 204 b 1286 176 1302 180 1293 176 b 1263 189 1277 176 1269 183 b 1140 331 1250 202 1153 320 b 1103 353 1126 344 1115 353 b 1071 340 1093 353 1084 350 b 1038 304 1058 328 1050 315 z',\n },\n ornamentPrecompTrillSuffixDandrieu: {\n x_min: 0,\n x_max: 949,\n y_min: 0,\n y_max: 381,\n ha: 381,\n o: 'm 1367 314 b 1250 521 1367 419 1318 482 b 1107 549 1211 537 1145 549 b 1083 546 1096 549 1087 549 b 1066 528 1071 540 1066 534 b 1079 520 1066 524 1070 520 b 1323 351 1187 517 1323 487 b 1201 171 1323 269 1260 219 b 1194 166 1201 171 1198 168 b 1056 327 1142 226 1063 317 b 1011 353 1043 343 1030 351 b 979 340 999 353 992 350 b 946 304 966 330 956 315 b 825 167 904 259 864 213 l 821 161 b 678 327 768 222 685 317 b 634 353 665 343 652 351 b 602 340 622 353 615 350 b 569 304 589 330 579 315 b 448 167 527 259 487 213 l 444 161 b 301 327 390 222 308 317 b 256 353 288 343 275 351 b 225 340 245 353 238 350 b 192 304 212 330 202 315 b 71 167 150 259 109 213 b 17 105 52 147 36 127 b 0 73 10 98 0 84 b 29 58 0 65 7 58 b 86 92 56 59 72 79 b 143 143 105 109 122 127 b 174 161 157 154 167 161 b 196 144 181 161 187 156 b 321 10 202 135 308 24 b 350 0 327 3 338 0 b 376 7 360 0 370 3 b 485 112 384 14 444 73 b 552 161 495 122 539 161 b 573 144 559 161 564 156 b 698 10 579 135 685 24 b 727 0 704 3 716 0 b 753 7 737 0 747 3 b 863 112 762 14 821 73 b 929 161 873 122 916 161 b 950 144 936 161 942 156 b 1076 10 956 135 1063 24 b 1104 0 1081 3 1093 0 b 1130 7 1115 0 1125 3 b 1236 108 1139 14 1195 69 b 1367 314 1297 160 1367 233 z',\n },\n ornamentPrecompDoubleCadenceUpperPrefix: {\n x_min: 0,\n x_max: 1278,\n y_min: 0,\n y_max: 247,\n ha: 247,\n o: 'm 1801 356 b 1776 346 1793 356 1783 351 b 1642 192 1760 333 1659 206 b 1614 177 1630 181 1621 177 b 1591 190 1606 177 1597 184 b 1469 334 1578 203 1482 323 b 1430 356 1453 347 1441 356 b 1398 343 1420 356 1411 353 b 1365 307 1385 331 1377 318 l 1240 164 b 1097 330 1187 226 1104 320 b 1053 356 1084 346 1071 354 b 1021 343 1041 356 1034 353 b 988 307 1008 333 998 318 b 865 168 946 262 904 216 l 861 163 b 717 330 808 223 724 320 b 672 356 704 346 691 354 b 641 343 661 356 654 353 b 608 307 628 333 618 318 b 485 168 566 262 524 216 l 455 134 b 284 46 409 88 351 46 b 16 285 148 46 32 265 b 3 295 9 292 4 295 b 0 291 1 295 0 292 b 1 285 0 288 1 285 b 308 0 42 190 157 0 b 530 120 415 1 482 63 b 559 144 539 128 549 137 b 590 163 573 156 583 163 b 612 145 598 163 603 157 b 739 10 618 137 724 24 b 768 0 744 3 756 0 b 793 7 778 0 788 3 b 903 114 802 14 861 75 l 939 144 b 971 163 953 156 963 163 b 992 145 978 163 984 157 b 1119 10 998 137 1106 24 b 1148 0 1125 3 1136 0 b 1174 7 1158 0 1168 3 b 1284 114 1182 14 1241 75 b 1316 144 1282 115 1312 141 b 1348 161 1331 156 1339 161 b 1371 145 1355 161 1361 157 b 1496 10 1377 137 1485 24 b 1525 0 1502 3 1513 0 b 1552 7 1536 0 1547 3 b 1819 298 1562 17 1800 276 b 1840 330 1829 308 1840 320 b 1832 344 1840 334 1837 340 b 1801 356 1820 351 1810 356 z',\n },\n ornamentPrecompDoubleCadenceUpperPrefixTurn: {\n x_min: 0,\n x_max: 1277,\n y_min: -62,\n y_max: 333,\n ha: 395,\n o: 'm 1273 202 l 1273 480 l 1230 480 l 1230 174 l 1097 328 b 1053 354 1084 344 1071 353 b 1021 341 1041 354 1034 351 b 988 305 1008 331 998 317 b 865 167 945 261 904 215 l 861 161 b 717 328 808 222 724 318 b 672 354 704 344 691 353 b 641 341 661 354 654 351 b 608 305 628 331 618 317 b 485 167 564 261 524 215 b 455 132 474 156 465 144 b 284 45 410 88 350 45 b 14 284 148 45 30 264 b 3 294 9 291 4 294 b 0 289 1 294 0 291 b 1 284 0 287 1 284 b 308 -1 42 189 157 -1 b 530 118 415 0 481 62 b 557 143 539 127 547 135 b 590 161 572 154 582 161 b 612 144 598 161 603 156 b 737 9 618 135 724 24 b 768 -1 743 1 755 -1 b 793 6 778 -1 788 1 b 903 112 802 13 861 73 l 937 143 b 971 161 953 154 963 161 b 992 144 978 161 984 156 b 1117 9 998 135 1104 24 b 1148 -1 1123 1 1136 -1 b 1174 6 1158 -1 1168 1 l 1230 60 l 1230 -89 l 1273 -89 l 1273 102 l 1283 112 b 1348 160 1295 125 1332 160 b 1371 144 1355 160 1361 156 b 1496 9 1377 135 1483 24 b 1525 -1 1502 1 1513 -1 b 1552 6 1536 -1 1547 1 b 1819 297 1562 16 1800 275 b 1839 328 1827 307 1839 320 b 1801 354 1839 343 1813 354 b 1776 344 1793 354 1783 350 b 1642 190 1760 331 1657 206 b 1614 176 1630 180 1621 176 b 1591 189 1606 176 1597 183 b 1467 333 1578 203 1480 321 b 1430 354 1453 346 1441 354 b 1398 341 1420 354 1411 351 b 1365 305 1385 330 1377 317 z',\n },\n ornamentPrecompTrillLowerSuffix: {\n x_min: 0,\n x_max: 859,\n y_min: -222,\n y_max: 246,\n ha: 468,\n o: 'm 1164 217 b 1031 351 1138 259 1063 351 b 1011 337 1020 351 1024 347 b 828 167 952 291 886 217 l 824 164 b 683 328 772 225 690 318 b 638 354 670 344 657 353 b 606 341 626 354 619 351 b 573 305 593 331 583 317 b 451 167 530 261 490 215 l 446 161 b 302 328 393 222 310 318 b 258 354 289 344 276 353 b 226 341 246 354 239 351 b 193 305 213 331 203 317 b 71 167 150 261 109 215 b 17 105 52 147 36 127 b 0 73 10 98 0 84 b 29 58 0 65 7 58 b 86 92 56 59 72 79 b 143 143 105 109 122 127 b 176 161 157 154 168 161 b 197 144 183 161 189 156 b 323 9 203 135 310 23 b 353 -1 328 1 340 -1 b 379 6 363 -1 373 1 b 488 112 387 13 446 73 l 523 143 b 556 161 539 154 549 161 b 577 144 563 161 569 156 b 703 9 583 135 690 23 b 733 -1 708 1 721 -1 b 759 6 743 -1 753 1 b 868 112 768 13 827 73 b 955 183 878 122 943 183 b 1081 107 965 183 1031 153 b 1156 -89 1128 63 1156 6 l 1156 -102 b 948 -297 1156 -204 1048 -297 b 806 -271 904 -297 850 -282 l 792 -266 b 801 -288 792 -268 795 -282 b 948 -320 809 -297 880 -320 b 1237 -50 1092 -320 1237 -199 b 1164 217 1237 75 1218 122 z',\n },\n brassScoop: {\n x_min: 1,\n x_max: 320,\n y_min: -373,\n y_max: 13,\n ha: 386,\n o: 'm 35 -537 b 461 -12 194 -518 461 -289 b 438 19 461 13 451 19 b 410 -9 425 19 413 9 b 35 -425 357 -366 92 -403 b 1 -482 13 -433 1 -438 l 1 -505 b 26 -537 1 -526 3 -537 z',\n },\n brassDoitMedium: {\n x_min: 0,\n x_max: 489,\n y_min: -40,\n y_max: 346,\n ha: 386,\n o: 'm 33 -58 b 704 468 255 -58 683 186 b 681 498 704 494 693 498 b 654 471 668 498 658 488 b 33 55 550 118 91 76 b 0 -3 12 46 0 42 l 0 -26 b 24 -58 0 -46 1 -58 z',\n },\n brassFallLipShort: {\n x_min: 1,\n x_max: 293,\n y_min: -345,\n y_max: 42,\n ha: 387,\n o: 'm 22 60 b 1 35 4 60 1 52 l 1 6 b 26 -50 3 -40 10 -43 b 32 -52 27 -50 30 -50 b 376 -469 85 -73 327 -111 b 400 -497 379 -487 387 -497 b 422 -467 412 -497 422 -491 b 32 60 422 -187 177 40 z',\n },\n brassLiftMedium: {\n x_min: 0,\n x_max: 811,\n y_min: 0,\n y_max: 852,\n ha: 852,\n o: 'm 1138 1220 b 1135 1225 1135 1223 1135 1224 b 1129 1227 1133 1227 1130 1227 b 1117 1207 1122 1227 1117 1212 l 1117 1201 b 1109 1164 1117 1187 1117 1172 b 1100 1156 1107 1161 1104 1158 b 959 1104 1058 1128 995 1140 b 929 1032 936 1081 929 1056 b 932 1007 929 1024 930 1015 b 923 976 932 995 930 985 l 914 971 b 773 919 873 942 809 955 b 743 847 750 896 743 870 b 746 821 743 838 744 829 b 737 791 746 809 744 799 l 729 783 b 588 733 687 756 624 769 b 557 661 564 710 557 684 b 560 635 557 652 559 644 b 552 605 560 624 559 612 l 543 598 b 402 547 501 570 438 583 b 372 475 379 524 372 498 b 374 449 372 467 373 458 b 366 419 374 438 373 426 l 357 412 b 216 361 315 384 252 397 b 186 289 193 338 186 312 b 189 264 186 281 187 272 b 180 233 189 252 187 240 b 171 226 177 232 174 229 b 30 176 130 199 66 212 b 0 104 7 153 0 128 b 33 0 0 88 14 0 b 49 17 40 0 49 10 b 71 63 52 35 56 49 b 212 115 102 95 154 59 b 239 186 230 134 239 160 b 236 210 239 194 238 202 b 256 249 239 225 243 236 b 397 301 288 281 340 245 b 425 372 416 320 425 346 b 422 396 425 380 423 387 b 442 435 425 410 429 422 b 583 487 474 467 526 431 b 611 557 602 505 611 531 b 608 582 611 566 609 573 b 628 621 611 596 615 608 b 769 672 660 652 711 618 b 796 743 788 691 796 717 b 793 768 796 752 795 759 b 814 806 796 782 801 793 b 955 858 845 838 897 804 b 982 929 973 877 982 903 b 979 953 982 937 981 945 b 999 992 982 968 986 979 b 1140 1045 1031 1024 1083 989 b 1168 1116 1161 1066 1168 1090 b 1138 1220 1168 1162 1145 1207 z',\n },\n brassFallRoughMedium: {\n x_min: 0,\n x_max: 811,\n y_min: 0,\n y_max: 852,\n ha: 852,\n o: 'm 30 1220 b 0 1116 23 1207 0 1162 b 27 1045 0 1090 7 1066 b 168 992 85 989 137 1024 b 189 953 181 979 186 968 b 186 929 187 945 186 937 b 213 858 186 903 194 877 b 354 806 271 804 323 838 b 374 768 367 793 372 782 b 372 743 373 759 372 752 b 399 672 372 717 380 691 b 540 621 456 618 508 652 b 560 582 553 608 557 596 b 557 557 559 573 557 566 b 585 487 557 531 566 505 b 726 435 642 431 694 467 b 746 396 739 422 743 410 b 743 372 744 387 743 380 b 770 301 743 346 752 320 b 912 249 828 245 880 281 b 932 210 924 236 929 225 b 929 186 930 202 929 194 b 956 115 929 160 937 134 b 1097 63 1014 59 1066 95 b 1119 17 1112 49 1116 35 b 1135 0 1119 10 1128 0 b 1168 104 1153 0 1168 91 b 1138 176 1168 128 1161 153 b 996 226 1102 212 1038 199 b 988 233 994 229 991 232 b 979 264 981 240 979 252 b 982 289 981 272 982 281 b 952 361 982 312 975 338 b 811 412 916 397 852 384 l 802 419 b 793 449 795 426 793 438 b 796 475 795 458 796 467 b 766 547 796 498 789 524 b 625 598 730 583 667 570 l 616 605 b 608 635 609 612 608 624 b 611 661 609 644 611 652 b 580 733 611 684 603 710 b 439 783 544 769 481 756 l 431 791 b 422 821 423 799 422 809 b 425 847 423 829 425 838 b 395 919 425 870 418 896 b 253 971 359 955 295 942 l 245 976 b 236 1007 238 985 236 995 b 239 1032 238 1015 239 1024 b 209 1104 239 1056 232 1081 b 68 1156 173 1140 109 1128 b 59 1164 63 1158 60 1161 b 50 1201 50 1172 50 1187 l 50 1207 b 39 1227 50 1212 46 1227 b 33 1225 37 1227 35 1227 b 30 1220 33 1224 33 1223 z',\n },\n brassBend: {\n x_min: 0,\n x_max: 392,\n y_min: 0,\n y_max: 282,\n ha: 282,\n o: 'm 282 0 b 552 72 369 0 456 23 b 564 92 560 75 564 84 l 564 383 b 541 406 564 395 554 406 b 518 383 528 406 518 395 l 518 107 b 282 46 435 65 357 46 b 46 107 207 46 130 65 l 46 383 b 23 406 46 395 36 406 b 0 383 10 406 0 395 l 0 92 b 13 72 0 84 4 75 b 282 0 108 23 196 0 z',\n },\n brassMuteClosed: {\n x_min: 0,\n x_max: 272,\n y_min: 0,\n y_max: 272,\n ha: 272,\n o: 'm 392 219 l 219 219 l 219 392 l 173 392 l 173 219 l 0 219 l 0 173 l 173 173 l 173 0 l 219 0 l 219 173 l 392 173 z',\n },\n brassMuteOpen: {\n x_min: 0,\n x_max: 304,\n y_min: 0,\n y_max: 304,\n ha: 304,\n o: 'm 219 0 b 438 219 340 0 438 98 b 219 438 438 340 340 438 b 0 219 98 438 0 340 b 219 0 0 98 98 0 z m 219 392 b 392 219 314 392 392 314 b 219 46 392 124 314 46 b 46 219 124 46 46 124 b 219 392 46 314 124 392 z',\n },\n brassFlip: {\n x_min: 0,\n x_max: 379,\n y_min: 0,\n y_max: 282,\n ha: 282,\n o: 'm 523 0 b 541 9 530 0 536 3 b 546 22 544 13 546 17 b 536 42 546 29 541 36 l 36 402 b 23 406 33 405 27 406 b 0 383 12 406 0 395 l 0 23 b 23 0 0 10 10 0 b 46 23 36 0 46 10 l 46 337 l 508 4 b 523 0 513 1 517 0 z',\n },\n brassJazzTurn: {\n x_min: 0,\n x_max: 620,\n y_min: 0,\n y_max: 245,\n ha: 245,\n o: 'm 792 190 b 765 176 780 179 772 176 b 740 190 755 176 747 183 b 629 325 727 202 644 312 b 593 347 616 338 605 347 b 562 334 583 346 575 344 b 528 298 549 323 539 310 l 406 176 b 389 168 406 176 399 168 b 374 176 384 168 379 170 b 245 325 360 192 245 325 b 200 353 232 343 219 351 b 168 340 190 353 181 350 l 17 156 b 0 121 10 147 0 132 b 16 107 0 114 4 108 b 84 143 26 107 76 137 b 118 160 92 150 108 160 b 141 143 125 160 131 154 b 265 10 147 135 253 24 b 294 0 271 3 282 0 b 321 7 305 0 315 3 b 498 160 321 7 478 158 b 521 143 505 160 513 154 b 647 10 528 135 635 24 b 675 0 652 3 664 0 b 703 7 687 0 697 3 b 874 186 713 16 855 164 b 893 220 881 196 893 212 b 873 245 890 235 883 243 b 796 194 847 245 815 213 z',\n },\n brassSmear: {\n x_min: 1,\n x_max: 306,\n y_min: 0,\n y_max: 170,\n ha: 170,\n o: 'm 193 79 b 308 0 219 50 264 0 b 439 117 396 0 438 102 b 439 120 439 118 439 118 l 441 125 b 441 128 441 127 441 127 b 433 141 441 135 439 141 b 416 130 429 141 423 137 b 343 94 390 107 370 94 b 269 153 315 94 294 121 l 265 158 b 144 245 239 190 180 245 b 6 134 62 245 10 143 b 1 114 3 125 1 118 b 7 107 1 108 4 107 b 36 122 13 107 22 112 b 92 151 55 137 65 151 b 183 89 125 151 161 112 b 189 84 184 88 187 86 z',\n },\n stringsDownBow: {\n x_min: 0,\n x_max: 312,\n y_min: 0,\n y_max: 318,\n ha: 318,\n o: 'm 37 458 b 0 420 17 458 0 441 l 0 17 b 17 0 0 7 9 0 l 37 0 b 55 17 46 0 55 7 l 55 253 b 225 278 55 269 140 278 b 395 253 310 278 395 269 l 395 17 b 413 0 395 7 403 0 l 432 0 b 449 17 441 0 449 7 l 449 420 b 412 458 449 441 432 458 z',\n },\n stringsUpBow: {\n x_min: 1,\n x_max: 249,\n y_min: 1,\n y_max: 495,\n ha: 494,\n o: 'm 181 1 b 206 22 193 1 203 10 l 359 683 l 359 688 b 338 713 359 700 351 710 l 333 713 b 308 694 321 713 311 706 l 180 140 l 53 694 b 27 713 49 706 39 713 l 22 713 b 1 690 10 710 1 700 b 3 683 1 687 1 685 l 154 22 b 181 1 157 10 167 1 z',\n },\n stringsHarmonic: {\n x_min: 0,\n x_max: 200,\n y_min: 0,\n y_max: 200,\n ha: 200,\n o: 'm 288 144 b 144 288 288 225 223 288 b 0 144 65 288 0 225 b 144 0 0 65 65 0 b 288 144 223 0 288 65 z m 144 249 b 249 144 203 249 249 203 b 144 39 249 86 203 39 b 39 144 86 39 39 86 b 144 249 39 203 86 249 z',\n },\n pluckedSnapPizzicatoAbove: {\n x_min: 0,\n x_max: 200,\n y_min: 0,\n y_max: 300,\n ha: 300,\n o: 'm 0 144 b 144 0 0 63 65 0 b 288 144 223 0 288 63 b 167 285 288 215 235 275 l 167 432 l 121 432 l 121 285 b 0 144 52 275 0 215 z m 121 246 l 121 144 l 167 144 l 167 246 b 249 144 213 236 249 193 b 144 39 249 85 202 39 b 39 144 85 39 39 85 b 121 246 39 193 73 236 z',\n },\n pluckedSnapPizzicatoBelow: {\n x_min: 0,\n x_max: 200,\n y_min: 0,\n y_max: 300,\n ha: 300,\n o: 'm 288 288 b 144 432 288 369 223 432 b 0 288 65 432 0 369 b 121 145 0 216 52 157 l 121 0 l 167 0 l 167 145 b 288 288 235 157 288 216 z m 167 186 l 167 288 l 121 288 l 121 186 b 39 288 75 196 39 238 b 144 393 39 347 86 393 b 249 288 203 393 249 347 b 167 186 249 238 215 196 z',\n },\n pluckedLeftHandPizzicato: {\n x_min: 0,\n x_max: 272,\n y_min: 0,\n y_max: 272,\n ha: 272,\n o: 'm 392 219 l 219 219 l 219 392 l 173 392 l 173 219 l 0 219 l 0 173 l 173 173 l 173 0 l 219 0 l 219 173 l 392 173 z',\n },\n keyboardPedalPed: {\n x_min: 0,\n x_max: 1019,\n y_min: -8,\n y_max: 555,\n ha: 563,\n o: 'm 413 799 b 179 749 327 798 261 789 b 0 517 107 713 0 632 b 122 376 0 454 37 376 b 240 540 189 376 240 452 b 225 586 240 579 233 586 b 204 549 213 586 212 573 b 138 480 199 527 181 480 b 85 549 96 480 85 517 l 85 554 b 353 762 89 690 230 762 b 373 752 364 762 373 760 b 351 708 373 740 360 723 b 274 546 330 675 274 585 b 353 416 274 508 333 444 b 412 304 372 390 412 351 b 382 228 412 275 403 256 b 334 190 363 202 361 200 b 147 29 271 167 147 88 b 196 -12 147 4 171 -12 b 343 108 239 -12 279 33 l 363 132 b 387 150 370 141 376 150 b 543 -4 445 150 467 -4 b 631 42 567 -4 586 0 l 668 78 b 685 89 674 84 680 89 b 696 75 688 89 690 86 b 809 -9 717 29 753 -9 b 946 66 854 -9 894 13 b 988 107 971 92 981 107 b 1002 89 994 107 996 99 b 1152 -4 1030 36 1077 -4 b 1329 248 1238 -4 1329 82 b 792 717 1329 556 1047 665 b 766 720 785 719 775 720 b 747 703 752 720 747 711 b 780 680 747 693 756 685 b 1223 222 1028 621 1223 504 b 1152 39 1223 122 1205 39 b 1073 229 1104 39 1073 132 b 1132 423 1073 314 1086 377 b 1142 442 1140 432 1142 436 b 1126 458 1142 451 1136 458 b 1093 446 1119 458 1109 455 b 975 216 1022 408 975 337 l 975 190 b 943 121 975 160 972 150 b 852 69 899 76 877 69 b 776 148 816 69 786 117 b 773 163 775 154 773 158 b 786 177 773 167 776 170 l 801 187 b 937 366 867 235 937 284 b 844 454 937 422 900 454 b 665 217 711 454 665 331 b 671 153 665 197 667 176 l 671 147 b 662 134 671 143 670 140 b 605 111 639 118 625 111 b 521 160 572 111 546 135 b 451 203 497 184 474 197 b 426 212 435 207 426 206 b 436 230 426 216 429 220 b 510 389 464 269 510 340 b 429 521 510 435 480 462 b 369 629 387 570 369 599 b 402 720 369 648 384 691 b 462 763 425 759 446 763 b 611 624 540 763 611 704 b 564 575 611 592 590 575 b 501 602 540 575 520 582 b 474 622 492 611 487 622 b 459 603 465 622 459 615 b 603 471 459 570 510 471 b 711 588 670 471 711 524 b 422 799 711 742 554 799 z m 815 403 b 848 343 838 403 848 383 b 780 226 848 295 824 261 b 765 217 773 220 768 217 b 759 228 762 217 759 220 b 756 282 757 245 756 262 b 815 403 756 346 772 403 z m 1405 124 b 1344 62 1369 124 1344 98 b 1405 0 1344 26 1369 0 b 1467 62 1441 0 1467 26 b 1405 124 1467 98 1441 124 z',\n },\n keyboardPedalUp: {\n x_min: 0,\n x_max: 450,\n y_min: 0,\n y_max: 450,\n ha: 450,\n o: 'm 582 396 b 516 367 554 396 533 384 b 465 340 495 347 487 340 l 458 340 b 412 377 432 340 412 348 b 432 409 412 387 419 396 l 438 415 b 490 429 451 428 464 429 b 575 501 534 429 575 452 b 501 575 575 541 541 575 b 429 490 452 575 429 534 b 415 438 429 464 428 451 l 409 432 b 377 412 396 419 387 412 b 340 458 348 412 340 432 l 340 465 b 367 516 340 487 347 495 b 396 582 384 533 396 554 b 324 648 396 625 363 648 b 252 582 285 648 252 625 b 281 516 252 554 264 533 b 308 465 301 495 308 487 l 308 458 b 271 412 308 432 300 412 b 239 432 261 412 252 419 l 233 438 b 219 490 220 451 219 464 b 147 575 219 534 196 575 b 73 501 107 575 73 541 b 158 429 73 452 114 429 b 210 415 184 429 197 428 l 216 409 b 236 377 229 396 236 387 b 190 340 236 348 216 340 l 183 340 b 132 367 161 340 153 347 b 66 396 115 384 94 396 b 0 324 23 396 0 363 b 66 252 0 285 23 252 b 132 281 94 252 115 264 b 183 308 153 301 161 308 l 190 308 b 236 271 216 308 236 300 b 216 239 236 261 229 252 l 210 233 b 158 219 197 220 184 219 b 73 147 114 219 73 196 b 147 73 73 107 107 73 b 219 158 196 73 219 114 b 233 210 219 184 220 197 l 239 216 b 271 236 252 229 261 236 b 308 190 300 236 308 216 l 308 183 b 281 132 308 161 301 153 b 252 66 264 115 252 94 b 324 0 252 23 285 0 b 396 66 363 0 396 23 b 367 132 396 94 384 115 b 340 183 347 153 340 161 l 340 190 b 377 236 340 216 348 236 b 409 216 387 236 396 229 l 415 210 b 429 158 428 197 429 184 b 501 73 429 114 452 73 b 575 147 541 73 575 107 b 490 219 575 196 534 219 b 438 233 464 219 451 220 l 432 239 b 412 271 419 252 412 261 b 458 308 412 300 432 308 l 465 308 b 516 281 487 308 495 301 b 582 252 533 264 554 252 b 648 324 625 252 648 285 b 582 396 648 363 625 396 z m 324 271 b 271 324 291 271 271 291 b 324 377 271 357 291 377 b 377 324 357 377 377 357 b 324 271 377 291 357 271 z',\n },\n pictChokeCymbal: {\n x_min: 1,\n x_max: 152,\n y_min: 2,\n y_max: 251,\n ha: 249,\n o: 'm 104 361 b 1 271 42 361 1 321 b 82 190 1 222 35 190 b 122 160 118 190 122 160 b 125 144 124 154 125 150 b 102 88 125 124 115 105 b 37 32 78 56 40 35 b 26 17 32 29 26 26 l 27 16 b 37 3 29 6 33 3 b 181 102 85 3 158 66 b 219 239 210 147 219 197 l 219 249 b 104 361 219 317 170 361 z',\n },\n wiggleArpeggiatoUp: {\n x_min: -33,\n x_max: 292,\n y_min: 0,\n y_max: 119,\n ha: 119,\n o: 'm 130 171 b -39 68 16 171 -14 91 b -48 53 -45 62 -48 58 b -29 42 -48 46 -39 42 b -10 46 -23 42 -16 43 b 56 63 12 56 29 63 b 248 0 121 63 135 0 b 419 127 361 0 410 104 b 420 132 420 130 420 131 b 412 140 420 137 416 140 b 386 130 403 140 392 134 b 334 107 367 117 353 107 b 318 108 330 107 324 107 b 240 138 289 112 265 128 b 130 171 209 153 168 171 z',\n },\n arrowheadBlackUp: {\n x_min: 0,\n x_max: 228,\n y_min: 0,\n y_max: 299,\n ha: 299,\n o: 'm 166 431 b 0 20 111 274 0 30 b 16 0 0 12 6 0 l 17 1 b 166 50 43 16 160 50 b 310 1 171 50 289 13 l 311 0 b 328 20 321 0 328 12 b 166 431 328 30 220 274 z',\n },\n arrowheadBlackDown: {\n x_min: 0,\n x_max: 228,\n y_min: 0,\n y_max: 299,\n ha: 299,\n o: 'm 166 0 b 328 410 220 157 328 400 b 311 431 328 419 321 431 l 310 429 b 166 380 289 418 171 380 b 17 429 160 380 43 415 l 16 431 b 0 410 6 431 0 419 b 166 0 0 400 111 157 z',\n },\n arpeggiatoUp: {\n x_min: 1,\n x_max: 229,\n y_min: 7,\n y_max: 1511,\n ha: 1504,\n o: 'm 219 1848 l 330 1848 l 164 2176 l 1 1848 l 121 1848 b 92 1778 115 1822 101 1800 l 89 1773 b 59 1668 75 1741 59 1702 b 96 1555 59 1614 76 1580 b 99 1551 98 1554 99 1551 l 102 1547 b 124 1496 115 1531 124 1515 b 122 1482 124 1492 124 1488 b 92 1404 118 1453 102 1428 b 59 1293 78 1372 59 1332 b 105 1172 59 1234 81 1198 b 124 1120 118 1155 124 1143 l 122 1113 b 122 1110 122 1113 122 1112 b 92 1032 118 1081 102 1057 b 59 922 78 1001 59 960 b 115 792 59 855 86 816 b 124 760 121 782 124 773 b 122 744 124 756 124 750 b 92 667 118 716 102 693 b 59 556 78 635 59 595 b 108 433 59 495 82 458 b 124 389 117 420 124 408 b 122 374 124 384 124 379 b 92 298 118 346 102 323 l 89 292 b 59 186 75 261 59 222 b 163 19 59 73 140 42 b 177 10 168 13 173 10 b 189 29 184 10 189 19 b 184 48 189 35 187 42 b 167 114 174 69 167 85 b 230 305 167 179 229 193 b 181 423 230 357 209 396 b 167 484 173 442 167 458 b 230 675 167 547 229 563 b 179 796 230 729 206 769 b 167 850 171 812 167 827 b 230 1040 167 913 229 929 b 183 1158 230 1092 209 1130 b 167 1220 173 1178 167 1194 b 230 1411 167 1284 229 1300 b 186 1526 230 1462 210 1499 b 167 1594 176 1529 167 1584 b 230 1786 167 1659 229 1673 b 219 1848 230 1809 226 1829 z',\n },\n arpeggiatoDown: {\n x_min: 1,\n x_max: 229,\n y_min: -4,\n y_max: 1500,\n ha: 1504,\n o: 'm 219 323 b 230 384 226 341 230 361 b 167 576 229 497 167 511 b 186 644 167 586 176 641 b 230 759 210 671 230 708 b 167 950 229 870 167 886 b 183 1012 167 976 173 992 b 230 1130 209 1040 230 1079 b 167 1320 229 1241 167 1257 b 179 1374 167 1344 171 1358 b 230 1495 206 1401 230 1441 b 167 1686 229 1607 167 1623 b 181 1747 167 1712 173 1728 b 230 1865 209 1774 230 1813 b 167 2056 229 1977 167 1992 b 184 2123 167 2085 174 2101 b 189 2141 187 2128 189 2136 b 177 2160 189 2151 184 2160 b 163 2151 173 2160 168 2157 b 59 1984 140 2128 59 2097 b 89 1878 59 1948 75 1909 l 92 1872 b 122 1796 102 1848 118 1824 b 124 1781 124 1791 124 1786 b 108 1737 124 1763 117 1750 b 59 1614 82 1712 59 1675 b 92 1503 59 1575 78 1535 b 122 1426 102 1477 118 1454 b 124 1410 124 1420 124 1414 b 115 1378 124 1397 121 1388 b 59 1248 86 1354 59 1315 b 92 1138 59 1210 78 1169 b 122 1060 102 1113 118 1089 b 122 1057 122 1058 122 1058 l 124 1050 b 105 998 124 1027 118 1015 b 59 877 81 972 59 936 b 92 766 59 838 78 798 b 122 688 102 742 118 717 b 124 674 124 683 124 678 b 102 624 124 655 115 639 l 99 619 b 96 615 99 619 98 616 b 59 503 76 590 59 556 b 89 397 59 468 75 429 l 92 392 b 121 323 101 370 115 348 l 1 323 l 164 -6 l 330 323 z',\n },\n repeat1Bar: {\n x_min: 0,\n x_max: 532,\n y_min: -250,\n y_max: 279,\n ha: 529,\n o: 'm 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z m 89 288 b 0 197 40 288 0 248 b 89 108 0 148 40 108 b 180 197 140 108 180 148 b 89 288 180 248 140 288 z m 675 -71 b 586 -161 626 -71 586 -111 b 675 -251 586 -210 626 -251 b 766 -161 726 -251 766 -210 b 675 -71 766 -111 726 -71 z',\n },\n repeat2Bars: {\n x_min: 0,\n x_max: 762,\n y_min: -250,\n y_max: 279,\n ha: 529,\n o: 'm 1090 380 b 1097 395 1094 386 1097 390 b 1089 402 1097 399 1094 402 l 936 402 b 910 380 927 402 920 393 l 336 -340 b 331 -350 333 -343 331 -347 b 343 -360 331 -356 336 -360 l 485 -360 b 516 -340 498 -360 508 -348 z m 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z m 89 288 b 0 197 40 288 0 248 b 89 108 0 148 40 108 b 180 197 140 108 180 148 b 89 288 180 248 140 288 z m 1007 -71 b 917 -161 958 -71 917 -111 b 1007 -251 917 -210 958 -251 b 1097 -161 1057 -251 1097 -210 b 1007 -71 1097 -111 1057 -71 z',\n },\n repeat4Bars: {\n x_min: 0,\n x_max: 1232,\n y_min: -250,\n y_max: 279,\n ha: 529,\n o: 'm 1767 380 b 1774 395 1771 386 1774 390 b 1765 402 1774 399 1771 402 l 1613 402 b 1587 380 1604 402 1597 393 l 1012 -340 b 1008 -350 1009 -343 1008 -347 b 1020 -360 1008 -356 1012 -360 l 1162 -360 b 1192 -340 1175 -360 1185 -348 z m 1436 380 b 1443 395 1440 386 1443 390 b 1434 402 1443 399 1440 402 l 1282 402 b 1256 380 1273 402 1266 393 l 681 -340 b 677 -350 678 -343 677 -347 b 688 -360 677 -356 681 -360 l 831 -360 b 861 -340 844 -360 854 -348 z m 1090 380 b 1097 395 1094 386 1097 390 b 1089 402 1097 399 1094 402 l 936 402 b 910 380 927 402 920 393 l 336 -340 b 331 -350 333 -343 331 -347 b 343 -360 331 -356 336 -360 l 485 -360 b 516 -340 498 -360 508 -348 z m 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z m 89 288 b 0 197 40 288 0 248 b 89 108 0 148 40 108 b 180 197 140 108 180 148 b 89 288 180 248 140 288 z m 1683 -71 b 1594 -161 1634 -71 1594 -111 b 1683 -251 1594 -210 1634 -251 b 1774 -161 1734 -251 1774 -210 b 1683 -71 1774 -111 1734 -71 z',\n },\n repeatBarSlash: {\n x_min: 0,\n x_max: 532,\n y_min: -250,\n y_max: 279,\n ha: 529,\n o: 'm 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z',\n },\n csymDiminished: {\n x_min: 0,\n x_max: 473,\n y_min: 0,\n y_max: 473,\n ha: 473,\n o: 'm 341 681 b 0 341 153 681 0 530 b 341 0 0 153 153 0 b 681 341 530 0 681 153 b 341 681 681 530 530 681 z m 341 618 b 618 341 495 618 618 495 b 341 63 618 189 494 63 b 63 341 187 63 63 187 b 341 618 63 494 189 618 z',\n },\n csymHalfDiminished: {\n x_min: -16,\n x_max: 488,\n y_min: -15,\n y_max: 489,\n ha: 504,\n o: 'm 703 660 l 658 704 l 557 603 b 340 681 498 652 422 681 b -1 341 151 681 -1 530 b 78 124 -1 259 29 183 l -23 23 l 22 -22 l 122 79 b 340 0 181 30 258 0 b 680 341 528 0 680 153 b 602 559 680 423 651 500 z m 62 341 b 340 618 62 494 187 618 b 513 559 403 618 464 598 l 122 168 b 62 341 84 217 62 278 z m 616 341 b 340 63 616 189 492 63 b 167 124 276 63 216 85 l 557 514 b 616 341 596 465 616 405 z',\n },\n csymAugmented: {\n x_min: 0,\n x_max: 395,\n y_min: 1,\n y_max: 396,\n ha: 395,\n o: 'm 569 318 l 317 318 l 317 570 l 253 570 l 253 318 l 0 318 l 0 255 l 253 255 l 253 1 l 317 1 l 317 255 l 569 255 z',\n },\n csymMajorSeventh: {\n x_min: 0,\n x_max: 558,\n y_min: 1,\n y_max: 477,\n ha: 476,\n o: 'm 402 687 l 0 1 l 804 1 z m 402 562 l 693 65 l 111 65 z',\n },\n csymMinor: {\n x_min: 0,\n x_max: 325,\n y_min: 216,\n y_max: 260,\n ha: 44,\n o: 'm 468 374 l 0 374 l 0 311 l 468 311 z',\n },\n csymParensLeftTall: {\n x_min: 1,\n x_max: 185,\n y_min: 0,\n y_max: 997,\n ha: 997,\n o: 'm 266 48 b 261 65 266 55 264 62 b 92 719 157 212 92 400 b 262 1371 92 1037 154 1228 b 266 1394 266 1378 266 1394 l 266 1424 b 264 1436 266 1431 266 1436 b 259 1434 262 1436 259 1434 b 1 719 84 1261 1 1011 b 259 1 1 429 79 177 b 264 0 261 0 262 0 b 266 9 265 0 266 6 z',\n },\n csymParensRightTall: {\n x_min: -20,\n x_max: 164,\n y_min: 0,\n y_max: 997,\n ha: 997,\n o: 'm -29 9 b -26 0 -29 6 -27 0 b -22 1 -24 0 -23 0 b 236 719 158 177 236 429 b -22 1434 236 1011 154 1261 b -26 1436 -22 1434 -24 1436 b -29 1424 -29 1436 -29 1431 l -29 1394 b -24 1371 -29 1394 -29 1378 b 145 719 84 1228 145 1037 b -23 65 145 400 81 212 b -29 48 -26 62 -29 55 z',\n },\n csymBracketLeftTall: {\n x_min: 0,\n x_max: 155,\n y_min: 0,\n y_max: 1000,\n ha: 1000,\n o: 'm 217 0 b 223 9 220 0 223 4 l 223 37 b 217 46 223 42 220 46 l 92 46 l 92 1394 l 217 1394 b 223 1403 220 1394 223 1398 l 223 1431 b 217 1440 223 1436 220 1440 l 6 1440 b 0 1436 3 1440 0 1439 l 0 4 b 6 0 0 1 3 0 z',\n },\n csymBracketRightTall: {\n x_min: 1,\n x_max: 156,\n y_min: 0,\n y_max: 1000,\n ha: 1000,\n o: 'm 219 0 b 225 4 222 0 225 1 l 225 1436 b 219 1440 225 1439 222 1440 l 7 1440 b 1 1431 4 1440 1 1436 l 1 1403 b 7 1394 1 1398 4 1394 l 132 1394 l 132 46 l 7 46 b 1 37 4 46 1 42 l 1 9 b 7 0 1 4 4 0 z',\n },\n csymParensLeftVeryTall: {\n x_min: 0,\n x_max: 122,\n y_min: 0,\n y_max: 993,\n ha: 993,\n o: 'm 176 32 b 171 49 176 39 174 46 b 60 716 104 194 60 399 b 173 1382 60 1032 101 1241 b 176 1405 176 1390 176 1405 l 176 1427 b 173 1430 176 1428 174 1430 b 0 716 40 1297 0 978 b 170 3 0 428 50 179 b 171 0 170 1 170 0 b 176 6 173 0 176 4 z',\n },\n csymParensRightVeryTall: {\n x_min: -15,\n x_max: 107,\n y_min: 0,\n y_max: 993,\n ha: 993,\n o: 'm -22 6 b -17 0 -22 4 -19 0 b -16 3 -16 0 -16 1 b 154 716 104 179 154 428 b -19 1430 154 978 114 1297 b -22 1427 -20 1430 -22 1428 l -22 1405 b -19 1382 -22 1405 -22 1390 b 94 716 53 1241 94 1032 b -17 49 94 399 50 194 b -22 32 -20 46 -22 39 z',\n },\n csymDiagonalArrangementSlash: {\n x_min: 0,\n x_max: 999,\n y_min: 0,\n y_max: 1000,\n ha: 1000,\n o: 'm 1439 1380 l 1377 1440 l 0 60 l 62 0 z',\n },\n accSagittal5v7KleismaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -35 b 135 -112 68 -86 99 -112 b 225 68 194 -112 225 -53 l 180 68 b 144 -4 180 20 168 -4 b 122 0 138 -4 131 -3 b 23 248 86 14 52 96 l 0 248 z',\n },\n accSagittal5v7KleismaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 b 122 0 52 -96 86 -14 b 144 4 131 3 138 4 b 180 -68 168 4 180 -20 l 225 -68 b 135 112 225 53 194 112 b 45 35 99 112 68 86 l 45 517 l 0 517 z',\n },\n accSagittal5CommaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 225 -517 l 225 248 l 203 248 l 0 -112 l 0 -284 l 180 33 l 180 -517 z',\n },\n accSagittal5CommaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 180 517 l 180 -33 l 0 284 l 0 112 l 203 -248 l 225 -248 l 225 517 z',\n },\n accSagittal7CommaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 248 l 0 -517 l 45 -517 l 45 112 l 89 112 b 180 -68 150 112 180 53 l 180 -248 l 225 -248 l 225 68 b 135 248 225 187 194 248 z',\n },\n accSagittal7CommaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 135 -248 b 225 -68 194 -248 225 -187 l 225 248 l 180 248 l 180 68 b 89 -112 180 -53 150 -112 l 45 -112 l 45 517 l 0 517 l 0 -248 z',\n },\n accSagittal25SmallDiesisUp: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -157 l 0 -259 l 315 -89 l 315 -517 l 360 -517 l 360 248 l 337 248 l 0 68 l 0 -33 l 315 135 l 315 10 z',\n },\n accSagittal25SmallDiesisDown: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 315 -10 l 315 -135 l 0 33 l 0 -68 l 337 -248 l 360 -248 l 360 517 l 315 517 l 315 89 l 0 259 l 0 157 z',\n },\n accSagittal35MediumDiesisUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -284 l 180 33 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -68 330 112 360 53 l 360 -248 l 405 -248 l 405 68 b 315 248 405 187 374 248 l 203 248 l 0 -112 z',\n },\n accSagittal35MediumDiesisDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 203 -248 l 315 -248 b 405 -68 374 -248 405 -187 l 405 248 l 360 248 l 360 68 b 271 -112 360 -53 330 -112 l 225 -112 l 225 517 l 180 517 l 180 -33 l 0 284 z',\n },\n accSagittal11MediumDiesisUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 225 53 l 225 -517 l 271 -517 l 271 53 l 495 -248 l 495 -89 l 248 248 l 0 -89 l 0 -248 z',\n },\n accSagittal11MediumDiesisDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 248 l 0 89 l 248 -248 l 495 89 l 495 248 l 271 -53 l 271 517 l 225 517 l 225 -53 z',\n },\n accSagittal11LargeDiesisUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 112 l 315 112 b 449 -68 405 112 449 53 l 449 -248 l 495 -248 l 495 68 b 360 248 495 187 449 248 l 135 248 b 0 68 45 248 0 187 z',\n },\n accSagittal11LargeDiesisDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 360 -248 b 495 -68 449 -248 495 -187 l 495 248 l 449 248 l 449 68 b 315 -112 449 -53 405 -112 l 271 -112 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittal35LargeDiesisUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 248 -248 l 540 112 l 540 274 l 271 -58 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittal35LargeDiesisDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 248 -248 l 540 112 l 540 274 l 269 -58 l 269 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittalSharp25SDown: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 112 -112 0 -53 36 -112 l 135 -112 l 135 -517 l 180 -517 l 180 -89 b 248 26 206 -65 229 -27 b 315 -89 264 -27 287 -65 l 315 -517 l 360 -517 l 360 -112 l 383 -112 b 495 68 458 -112 495 -53 l 449 68 b 399 -4 449 20 433 -4 b 248 248 297 -4 261 171 b 122 0 216 96 176 14 b 94 -4 112 -3 102 -4 b 45 68 60 -4 45 20 z',\n },\n accSagittalFlat25SUp: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 94 4 45 -20 60 4 b 122 0 102 4 112 3 b 248 -248 176 -14 216 -96 b 399 4 261 -171 297 4 b 449 -68 433 4 449 -20 l 495 -68 b 383 112 495 53 458 112 l 360 112 l 360 517 l 315 517 l 315 89 b 248 -26 287 65 264 27 b 180 89 229 27 206 65 l 180 517 l 135 517 l 135 112 l 112 112 b 0 -68 36 112 0 53 z',\n },\n accSagittalSharp7CDown: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 112 l 89 112 b 180 104 124 112 154 109 l 180 -517 l 225 -517 l 225 89 b 315 -68 285 60 315 9 l 315 -248 l 360 -248 l 360 68 b 135 248 360 187 285 248 l 0 248 z',\n },\n accSagittalFlat7CUp: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 135 -248 b 360 -68 285 -248 360 -187 l 360 248 l 315 248 l 315 68 b 225 -89 315 -9 285 -60 l 225 517 l 180 517 l 180 -104 b 89 -112 154 -109 124 -112 l 45 -112 l 45 517 l 0 517 z',\n },\n accSagittalSharp5CDown: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -517 l 45 71 l 180 -56 l 180 -517 l 225 -517 l 225 -98 l 405 -268 l 405 -112 l 23 248 l 0 248 l 0 -517 z',\n },\n accSagittalFlat5CUp: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 517 l 0 -248 l 23 -248 l 405 112 l 405 268 l 225 98 l 225 517 l 180 517 l 180 56 l 45 -71 l 45 517 z',\n },\n accSagittalSharp5v7kDown: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -276 l 135 -82 l 135 -517 l 180 -517 l 180 -17 l 271 112 l 315 112 l 315 -517 l 360 -517 l 360 107 b 449 -68 420 89 449 30 l 449 -248 l 495 -248 l 495 68 b 360 248 495 189 449 248 l 248 248 z',\n },\n accSagittalFlat5v7kUp: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 248 -248 l 360 -248 b 495 -68 449 -248 495 -189 l 495 248 l 449 248 l 449 68 b 360 -107 449 -30 420 -89 l 360 517 l 315 517 l 315 -112 l 271 -112 l 180 17 l 180 517 l 135 517 l 135 82 l 0 276 l 0 112 z',\n },\n accSagittalSharp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 180 -53 l 180 -517 l 225 -517 l 225 0 l 292 85 l 360 0 l 360 -517 l 405 -517 l 405 -53 l 585 -274 l 585 -112 l 292 248 l 0 -112 l 0 -274 z',\n },\n accSagittalFlat: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 274 l 0 112 l 292 -248 l 585 112 l 585 274 l 405 53 l 405 517 l 360 517 l 360 0 l 292 -85 l 225 0 l 225 517 l 180 517 l 180 53 z',\n },\n accSagittalSharp5v7kUp: {\n x_min: 0,\n x_max: 312,\n y_min: -361,\n y_max: 172,\n ha: 533,\n o: 'm 45 -517 l 45 -10 b 135 -92 68 -48 98 -75 l 135 -520 l 180 -520 l 180 -108 b 248 -115 203 -112 225 -115 b 271 -112 256 -115 264 -115 l 271 -517 l 315 -517 l 315 -107 b 449 68 405 -89 449 -30 l 405 68 b 297 -4 405 19 369 -4 b 23 248 131 -4 56 85 l 0 248 l 0 -517 z',\n },\n accSagittalFlat5v7kDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 361,\n ha: 533,\n o: 'm 0 517 l 0 -248 l 23 -248 b 297 4 56 -85 131 4 b 405 -68 369 4 405 -19 l 449 -68 b 315 107 449 30 405 89 l 315 517 l 271 517 l 271 112 b 248 115 264 115 256 115 b 180 108 225 115 203 112 l 180 520 l 135 520 l 135 92 b 45 10 98 75 68 48 l 45 517 z',\n },\n accSagittalSharp5CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -266 l 135 -153 l 135 -517 l 180 -517 l 180 -115 l 271 -39 l 271 -517 l 315 -517 l 315 0 l 405 75 l 405 -517 l 449 -517 l 449 248 l 428 248 l 0 -112 z',\n },\n accSagittalFlat5CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 428 -248 l 449 -248 l 449 517 l 405 517 l 405 -75 l 315 0 l 315 517 l 271 517 l 271 39 l 180 115 l 180 517 l 135 517 l 135 153 l 0 266 z',\n },\n accSagittalSharp7CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 112 l 135 112 l 135 -517 l 180 -517 l 180 108 b 271 89 213 105 243 99 l 271 -517 l 315 -517 l 315 73 b 405 -68 374 45 405 -3 l 405 -248 l 449 -248 l 449 68 b 135 248 449 187 346 248 l 0 248 z',\n },\n accSagittalFlat7CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 135 -248 b 449 -68 346 -248 449 -187 l 449 248 l 405 248 l 405 68 b 315 -73 405 3 374 -45 l 315 517 l 271 517 l 271 -89 b 180 -108 243 -99 213 -105 l 180 517 l 135 517 l 135 -112 l 45 -112 l 45 517 l 0 517 z',\n },\n accSagittalSharp25SUp: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -30 l 495 143 l 495 14 l 0 -157 l 0 -255 l 225 -177 l 225 -517 l 271 -517 l 271 -161 l 360 -130 l 360 -517 l 405 -517 l 405 -115 l 495 -84 l 495 -517 l 540 -517 l 540 248 l 517 248 l 0 68 z',\n },\n accSagittalFlat25SDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 l 517 -248 l 540 -248 l 540 517 l 495 517 l 495 84 l 405 115 l 405 517 l 360 517 l 360 130 l 271 161 l 271 517 l 225 517 l 225 177 l 0 255 l 0 157 l 495 -14 l 495 -143 l 0 30 z',\n },\n accSagittalSharp35MUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -274 l 135 -108 l 135 -517 l 180 -517 l 180 -53 l 271 58 l 271 -517 l 315 -517 l 315 112 l 360 112 b 405 109 376 112 390 112 l 405 -517 l 449 -517 l 449 96 b 540 -68 510 72 540 17 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 z',\n },\n accSagittalFlat35MDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 292 -248 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 449 -96 540 -17 510 -72 l 449 517 l 405 517 l 405 -109 b 360 -112 390 -112 376 -112 l 315 -112 l 315 517 l 271 517 l 271 -58 l 180 53 l 180 517 l 135 517 l 135 108 l 0 274 l 0 112 z',\n },\n accSagittalSharp11MUp: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -271 l 180 -79 l 180 -517 l 225 -517 l 225 -30 l 315 65 l 315 -517 l 360 -517 l 360 65 l 449 -30 l 449 -517 l 495 -517 l 495 -79 l 675 -271 l 675 -112 l 337 248 z',\n },\n accSagittalFlat11MDown: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 337 -248 l 675 112 l 675 271 l 495 79 l 495 517 l 449 517 l 449 30 l 360 -65 l 360 517 l 315 517 l 315 -65 l 225 30 l 225 517 l 180 517 l 180 79 l 0 271 l 0 112 z',\n },\n accSagittalSharp11LUp: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 112 l 449 112 l 449 -517 l 495 -517 l 495 104 b 631 -68 585 82 631 26 l 631 -248 l 675 -248 l 675 68 b 449 248 675 187 600 248 l 225 248 b 0 68 75 248 0 187 z',\n },\n accSagittalFlat11LDown: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 449 -248 b 675 -68 600 -248 675 -187 l 675 248 l 631 248 l 631 68 b 495 -104 631 -26 585 -82 l 495 517 l 449 517 l 449 -112 l 360 -112 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z',\n },\n accSagittalSharp35LUp: {\n x_min: 0,\n x_max: 500,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 71 l 452 -17 l 452 -517 l 495 -517 l 495 -56 l 720 -268 l 720 -112 l 337 248 l 225 248 b 0 68 75 248 0 187 z',\n },\n accSagittalFlat35LDown: {\n x_min: 0,\n x_max: 500,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 337 -248 l 720 112 l 720 268 l 495 56 l 495 517 l 452 517 l 452 17 l 360 -71 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z',\n },\n accSagittalDoubleSharp25SDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 135 -112 0 -53 45 -112 b 243 -62 180 -112 215 -95 l 89 -503 l 143 -517 l 292 -82 l 445 -517 l 495 -503 l 343 -62 b 449 -112 372 -95 408 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 315 148 b 112 -4 274 148 236 -4 b 45 68 68 -4 45 20 z',\n },\n accSagittalDoubleFlat25SUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 112 4 45 -20 68 4 b 292 -248 236 4 274 -148 b 475 4 315 -148 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 b 343 62 408 112 372 95 l 495 503 l 445 517 l 292 82 l 143 517 l 89 503 l 243 62 b 135 112 215 95 180 112 b 0 -68 45 112 0 53 z',\n },\n accSagittalDoubleSharp7CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -503 l 52 -517 l 203 -82 l 354 -517 l 405 -503 l 230 0 l 271 108 b 495 -68 420 92 495 35 l 495 -248 l 540 -248 l 540 68 b 225 248 540 187 435 248 l 89 248 l 89 112 l 135 112 l 174 0 z m 213 112 l 203 82 l 192 112 z',\n },\n accSagittalDoubleFlat7CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 174 0 l 135 -112 l 89 -112 l 89 -248 l 225 -248 b 540 -68 435 -248 540 -187 l 540 248 l 495 248 l 495 68 b 271 -108 495 -35 420 -92 l 230 0 l 405 503 l 354 517 l 203 82 l 52 517 l 0 503 z m 192 -112 l 203 -82 l 213 -112 z',\n },\n accSagittalDoubleSharp5CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 405 -503 l 230 0 l 232 4 l 585 -264 l 585 -112 l 112 248 l 89 248 l 89 112 l 151 68 l 174 0 l 0 -503 l 52 -517 l 203 -82 l 354 -517 z',\n },\n accSagittalDoubleFlat5CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 354 517 l 203 82 l 52 517 l 0 503 l 174 0 l 151 -68 l 89 -112 l 89 -248 l 112 -248 l 585 112 l 585 264 l 232 -4 l 230 0 l 405 503 z',\n },\n accSagittalDoubleSharp5v7kDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -274 l 252 35 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 360 112 b 540 -68 480 112 540 53 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 l 0 -112 z',\n },\n accSagittalDoubleFlat5v7kUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 292 -248 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 360 -112 540 -53 480 -112 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 252 -35 l 0 274 z',\n },\n accSagittalDoubleSharp: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 540 -503 l 366 0 l 380 45 l 675 -271 l 675 -112 l 337 248 l 0 -112 l 0 -271 l 295 45 l 310 0 l 135 -503 l 186 -517 l 337 -82 l 488 -517 z',\n },\n accSagittalDoubleFlat: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 488 517 l 337 82 l 186 517 l 135 503 l 310 0 l 295 -45 l 0 271 l 0 112 l 337 -248 l 675 112 l 675 271 l 380 -45 l 366 0 l 540 503 z',\n },\n accSagittal7v11KleismaUp: {\n x_min: 0,\n x_max: 219,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 68 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 -45 b 248 -112 200 -89 225 -112 b 315 68 292 -112 315 -53 l 271 68 b 248 -4 271 20 264 -4 b 236 0 245 -4 240 -3 b 157 248 213 14 187 96 b 78 0 127 96 101 14 b 65 -4 73 -3 68 -4 b 45 68 50 -4 45 20 l 0 68 b 68 -112 0 -53 23 -112 z',\n },\n accSagittal7v11KleismaDown: {\n x_min: 0,\n x_max: 219,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 68 112 b 0 -68 23 112 0 53 l 45 -68 b 65 4 45 -20 50 4 b 78 0 68 4 73 3 b 157 -248 101 -14 127 -96 b 236 0 187 -96 213 -14 b 248 4 240 3 245 4 b 271 -68 264 4 271 -20 l 315 -68 b 248 112 315 53 292 112 b 180 45 225 112 200 89 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 z',\n },\n accSagittal17CommaUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 -40 b 315 -118 248 -92 279 -118 b 405 62 374 -118 405 -59 l 360 62 b 324 -10 360 14 348 -10 b 302 -6 318 -10 311 -9 b 206 217 268 9 235 84 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z',\n },\n accSagittal17CommaDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 206 -217 b 302 6 235 -84 268 -9 b 324 10 311 9 318 10 b 360 -62 348 10 360 -14 l 405 -62 b 315 118 405 59 374 118 b 225 40 279 118 248 92 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z',\n },\n accSagittal55CommaUp: {\n x_min: 0,\n x_max: 219,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 248 l 0 -517 l 45 -517 l 45 58 l 315 -274 l 315 -112 l 23 248 z',\n },\n accSagittal55CommaDown: {\n x_min: 0,\n x_max: 219,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 23 -248 l 315 112 l 315 274 l 45 -58 l 45 517 l 0 517 l 0 -248 z',\n },\n accSagittal7v11CommaUp: {\n x_min: 0,\n x_max: 188,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 248 l 135 248 b 0 68 45 248 0 187 z',\n },\n accSagittal7v11CommaDown: {\n x_min: 0,\n x_max: 188,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 271 -248 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittal5v11SmallDiesisUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 73 l 0 -248 l 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 -40 b 360 -118 295 -92 325 -118 b 449 62 420 -118 449 -59 l 405 62 b 369 -10 405 14 393 -10 b 348 -6 363 -10 356 -9 b 251 217 312 9 279 84 l 248 248 l 135 248 b 0 73 45 248 0 189 z',\n },\n accSagittal5v11SmallDiesisDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -73 b 135 -248 0 -189 45 -248 l 248 -248 l 251 -217 b 348 6 279 -84 312 -9 b 369 10 356 9 363 10 b 405 -62 393 10 405 -14 l 449 -62 b 360 118 449 59 420 118 b 271 40 325 118 295 92 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittalSharp5v11SDown: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 112 -23 45 -84 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 b 242 37 203 -23 225 -3 b 315 -89 262 -23 285 -63 l 315 -517 l 360 -517 l 360 -112 l 383 -112 b 495 68 458 -112 495 -53 l 449 68 b 399 -4 449 20 433 -4 b 248 248 297 -4 261 171 b 157 68 222 127 192 68 l 89 68 b 0 -203 30 68 0 -23 z',\n },\n accSagittalFlat5v11SUp: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 89 -68 0 23 30 -68 l 157 -68 b 248 -248 192 -68 222 -127 b 399 4 261 -171 297 4 b 449 -68 433 4 449 -20 l 495 -68 b 383 112 495 53 458 112 l 360 112 l 360 517 l 315 517 l 315 89 b 242 -37 285 63 262 23 b 180 23 225 3 203 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 84 z',\n },\n accSagittalSharp7v11CDown: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 89 -112 l 89 -517 l 135 -517 l 135 -95 b 206 37 163 -73 187 -30 b 271 -23 225 -3 248 -23 l 271 -517 l 315 -517 l 315 -23 l 383 -23 b 449 -203 428 -23 449 -84 l 495 -203 b 405 68 495 -23 465 68 l 292 68 b 203 248 258 68 228 127 b 101 0 173 98 138 16 b 81 -3 94 0 86 -3 b 45 68 56 -3 45 20 l 0 68 b 89 -112 0 -52 30 -112 z',\n },\n accSagittalFlat7v11CUp: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 112 b 0 -68 30 112 0 52 l 45 -68 b 81 3 45 -20 56 3 b 101 0 86 3 94 0 b 203 -248 138 -16 173 -98 b 292 -68 228 -127 258 -68 l 405 -68 b 495 203 465 -68 495 23 l 449 203 b 383 23 449 84 428 23 l 315 23 l 315 517 l 271 517 l 271 23 b 206 -37 248 23 225 3 b 135 95 187 30 163 73 l 135 517 l 89 517 z',\n },\n accSagittalSharp55CDown: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -271 l 135 -125 l 135 -517 l 180 -517 l 180 -78 l 315 65 l 315 -517 l 360 -517 l 360 248 l 337 248 l 0 -112 z',\n },\n accSagittalFlat55CUp: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 337 -248 l 360 -248 l 360 517 l 315 517 l 315 -65 l 180 78 l 180 517 l 135 517 l 135 125 l 0 271 z',\n },\n accSagittalSharp17CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -248 l 45 -68 b 180 109 45 36 89 95 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -89 292 13 321 -55 l 360 -517 l 405 -517 l 405 -112 l 428 -112 b 540 68 504 -112 540 -53 l 495 68 b 445 -4 495 20 480 -4 b 292 248 343 -4 307 171 l 180 248 b 0 68 60 248 0 187 l 0 -248 z',\n },\n accSagittalFlat17CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 248 l 0 -68 b 180 -248 0 -187 60 -248 l 292 -248 b 445 4 307 -171 343 4 b 495 -68 480 4 495 -20 l 540 -68 b 428 112 540 53 504 112 l 405 112 l 405 517 l 360 517 l 360 89 b 271 -112 321 55 292 -13 l 225 -112 l 225 517 l 180 517 l 180 -109 b 45 68 89 -95 45 -36 l 45 248 z',\n },\n accSagittalSharp7v11kDown: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -32 l 405 138 l 405 13 l 0 -157 l 0 -256 l 225 -161 l 225 -517 l 271 -517 l 271 -144 l 405 -86 l 405 -517 l 449 -517 l 449 248 l 428 248 l 0 68 z',\n },\n accSagittalFlat7v11kUp: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 l 428 -248 l 449 -248 l 449 517 l 405 517 l 405 86 l 271 144 l 271 517 l 225 517 l 225 161 l 0 256 l 0 157 l 405 -13 l 405 -138 l 0 32 z',\n },\n accSagittalSharp7v11kUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 135 -112 l 135 -517 l 180 -517 l 180 -105 b 271 -23 217 -94 248 -65 l 271 -517 l 315 -517 l 315 -23 b 405 -105 337 -65 369 -94 l 405 -517 l 449 -517 l 449 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 315 148 b 112 -4 274 148 236 -4 b 45 68 68 -4 45 20 l 0 68 b 135 -112 0 -53 45 -112 z',\n },\n accSagittalFlat7v11kDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 135 112 b 0 -68 45 112 0 53 l 45 -68 b 112 4 45 -20 68 4 b 292 -248 236 4 274 -148 b 475 4 315 -148 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 l 449 517 l 405 517 l 405 105 b 315 23 369 94 337 65 l 315 517 l 271 517 l 271 23 b 180 105 248 65 217 94 l 180 517 l 135 517 z',\n },\n accSagittalSharp17CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 203 -23 b 271 14 229 -23 251 -10 l 271 -517 l 315 -517 l 315 -23 b 405 -105 337 -65 369 -94 l 405 -517 l 449 -517 l 449 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 312 150 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalFlat17CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 b 475 4 312 -150 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 l 449 517 l 405 517 l 405 105 b 315 23 369 94 337 65 l 315 517 l 271 517 l 271 -14 b 203 23 251 10 229 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalSharp55CUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -517 l 45 78 l 135 10 l 135 -517 l 180 -517 l 180 -23 l 271 -92 l 271 -517 l 315 -517 l 315 -127 l 495 -264 l 495 -112 l 23 248 l 0 248 l 0 -517 z',\n },\n accSagittalFlat55CDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 517 l 0 -248 l 23 -248 l 495 112 l 495 264 l 315 127 l 315 517 l 271 517 l 271 92 l 180 23 l 180 517 l 135 517 l 135 -10 l 45 -78 l 45 517 z',\n },\n accSagittalSharp7v11CUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 86 45 6 89 58 l 180 -517 l 225 -517 l 225 98 b 315 109 252 104 282 108 l 315 -517 l 360 -517 l 360 112 l 449 112 l 449 -517 l 495 -517 l 495 248 l 360 248 b 0 68 121 248 0 189 z',\n },\n accSagittalFlat7v11CDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 360 -248 0 -189 121 -248 l 495 -248 l 495 517 l 449 517 l 449 -112 l 360 -112 l 360 517 l 315 517 l 315 -109 b 225 -98 282 -108 252 -104 l 225 517 l 180 517 l 180 -86 b 45 68 89 -58 45 -6 l 45 248 l 0 248 z',\n },\n accSagittalSharp5v11SUp: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 -23 b 449 -105 383 -65 415 -94 l 449 -517 l 495 -517 l 495 -112 b 631 68 585 -112 631 -53 l 585 68 b 520 -4 585 20 563 -4 b 337 248 396 -4 360 150 l 225 248 b 0 68 76 248 0 187 z',\n },\n accSagittalFlat5v11SDown: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 225 -248 0 -187 76 -248 l 337 -248 b 520 4 360 -150 396 4 b 585 -68 563 4 585 -20 l 631 -68 b 495 112 631 53 585 112 l 495 517 l 449 517 l 449 105 b 360 23 415 94 383 65 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z',\n },\n accSagittalDoubleSharp5v11SDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 203 -23 b 262 4 225 -23 245 -13 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 341 -60 b 449 -112 370 -95 405 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 312 150 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalDoubleFlat5v11SUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 b 475 4 312 -150 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 b 341 60 405 112 370 95 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 262 -4 b 203 23 245 13 225 23 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalDoubleSharp7v11CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 112 -112 b 193 -73 143 -112 170 -99 l 45 -501 l 95 -517 l 248 -81 l 397 -517 l 449 -503 l 275 0 l 278 4 b 337 -23 295 -13 315 -23 l 405 -23 b 495 -203 465 -23 495 -84 l 540 -203 b 428 68 540 -23 503 68 l 360 68 b 248 248 310 68 271 127 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 112 -112 0 -52 36 -112 z',\n },\n accSagittalDoubleFlat7v11CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 112 112 b 0 -68 36 112 0 52 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 b 360 -68 271 -127 310 -68 l 428 -68 b 540 203 503 -68 540 23 l 495 203 b 405 23 495 84 465 23 l 337 23 b 278 -4 315 23 295 13 l 275 0 l 449 503 l 397 517 l 248 81 l 95 517 l 45 501 l 193 73 b 112 112 170 99 143 112 z',\n },\n accSagittalDoubleSharp55CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 428 248 l 0 -112 l 0 -266 l 307 -7 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 366 0 l 386 59 l 449 112 l 449 248 z',\n },\n accSagittalDoubleFlat55CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 449 -248 l 449 -112 l 386 -59 l 366 0 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 307 7 l 0 266 l 0 112 l 428 -248 z',\n },\n accSagittalDoubleSharp17CDown: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -248 l 45 -68 b 271 112 45 53 120 112 l 310 0 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 387 -62 b 495 -112 416 -95 452 -112 b 631 68 585 -112 631 -53 l 585 68 b 520 -4 585 20 563 -4 b 337 248 396 -4 360 150 l 225 248 b 0 68 76 248 0 187 l 0 -248 z',\n },\n accSagittalDoubleFlat17CUp: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 248 l 0 -68 b 225 -248 0 -187 76 -248 l 337 -248 b 520 4 360 -150 396 4 b 585 -68 563 4 585 -20 l 631 -68 b 495 112 631 53 585 112 b 387 62 452 112 416 95 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 310 0 l 271 -112 b 45 68 120 -112 45 -53 l 45 248 z',\n },\n accSagittalDoubleSharp7v11kDown: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -30 l 366 96 l 399 0 l 392 -23 l 0 -157 l 0 -255 l 353 -135 l 225 -503 l 276 -517 l 428 -82 l 579 -517 l 631 -503 l 455 0 l 507 145 l 540 157 l 540 248 l 517 248 z m 416 115 l 442 124 l 428 82 z',\n },\n accSagittalDoubleFlat7v11kUp: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 517 -248 l 540 -248 l 540 -157 l 507 -145 l 455 0 l 631 503 l 579 517 l 428 82 l 276 517 l 225 503 l 353 135 l 0 255 l 0 157 l 392 23 l 399 0 l 366 -96 l 0 30 l 0 -68 z m 428 -82 l 442 -124 l 416 -115 z',\n },\n accSagittal23CommaUp: {\n x_min: 0,\n x_max: 188,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -4 b 68 -23 53 -17 60 -23 l 180 -23 b 225 -203 210 -23 225 -82 l 271 -203 b 206 68 271 -23 248 68 l 89 68 b 23 248 71 68 48 127 l 0 248 z',\n },\n accSagittal23CommaDown: {\n x_min: 0,\n x_max: 188,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 b 89 -68 48 -127 71 -68 l 206 -68 b 271 203 248 -68 271 23 l 225 203 b 180 23 225 82 210 23 l 68 23 b 45 4 60 23 53 17 l 45 517 l 0 517 z',\n },\n accSagittal5v19CommaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -284 l 180 33 l 180 -517 l 225 -517 l 225 248 l 203 248 b 86 112 151 157 112 112 b 45 157 59 112 45 127 l 0 157 b 76 23 0 72 26 27 l 0 -112 z',\n },\n accSagittal5v19CommaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 76 -23 b 0 -157 26 -27 0 -72 l 45 -157 b 86 -112 45 -127 59 -112 b 203 -248 112 -112 151 -157 l 225 -248 l 225 517 l 180 517 l 180 -33 l 0 284 z',\n },\n accSagittal5v23SmallDiesisUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -284 l 180 33 l 180 -517 l 225 -517 l 225 -4 b 248 -23 233 -17 240 -23 l 360 -23 b 405 -203 390 -23 405 -82 l 449 -203 b 386 68 449 -23 428 68 l 271 68 b 203 248 251 68 228 127 l 0 -112 z',\n },\n accSagittal5v23SmallDiesisDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 203 -248 b 271 -68 228 -127 251 -68 l 386 -68 b 449 203 428 -68 449 23 l 405 203 b 360 23 405 82 390 23 l 248 23 b 225 4 240 23 233 17 l 225 517 l 180 517 l 180 -33 l 0 284 z',\n },\n accSagittalSharp5v23SDown: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 6 b 89 -23 59 -13 73 -23 l 180 -23 l 180 -517 l 225 -517 l 225 -23 l 292 -23 b 360 -203 337 -23 360 -84 l 405 -203 b 315 68 405 -23 374 68 l 112 68 b 23 248 78 68 48 127 l 0 248 z',\n },\n accSagittalFlat5v23SUp: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 b 112 -68 48 -127 78 -68 l 315 -68 b 405 203 374 -68 405 23 l 360 203 b 292 23 360 84 337 23 l 225 23 l 225 517 l 180 517 l 180 23 l 89 23 b 45 -6 73 23 59 13 l 45 517 l 0 517 z',\n },\n accSagittalSharp5v19CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 89 -112 0 -52 30 -112 l 89 -517 l 135 -517 l 135 -95 b 225 112 173 -65 203 4 l 271 112 l 271 -517 l 315 -517 l 315 107 b 405 -68 374 89 405 30 l 405 -248 l 449 -248 l 449 68 b 315 248 449 189 405 248 l 203 248 b 101 0 173 98 138 16 b 81 -3 94 0 86 -3 b 45 68 56 -3 45 23 z',\n },\n accSagittalFlat5v19CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 81 3 45 -23 56 3 b 101 0 86 3 94 0 b 203 -248 138 -16 173 -98 l 315 -248 b 449 -68 405 -248 449 -189 l 449 248 l 405 248 l 405 68 b 315 -107 405 -30 374 -89 l 315 517 l 271 517 l 271 -112 l 225 -112 b 135 95 203 -4 173 65 l 135 517 l 89 517 l 89 112 b 0 -68 30 112 0 52 z',\n },\n accSagittalSharp23CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 135 -82 l 135 -517 l 180 -517 l 180 -17 l 239 68 b 315 -23 261 7 287 -23 l 315 -517 l 360 -517 l 360 -23 l 428 -23 b 495 -203 472 -23 495 -84 l 540 -203 b 449 68 540 -23 510 68 l 337 68 b 248 248 302 68 271 127 l 0 -112 l 0 -276 z',\n },\n accSagittalFlat23CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 276 l 0 112 l 248 -248 b 337 -68 271 -127 302 -68 l 449 -68 b 540 203 510 -68 540 23 l 495 203 b 428 23 495 84 472 23 l 360 23 l 360 517 l 315 517 l 315 23 b 239 -68 287 23 261 -7 l 180 17 l 180 517 l 135 517 l 135 82 z',\n },\n accSagittalSharp23CUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 14 b 112 -23 63 -10 86 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 l 271 -517 l 315 -517 l 315 -23 l 360 -23 b 449 -203 420 -23 449 -84 l 495 -203 b 383 68 495 -23 458 68 l 135 68 b 23 248 85 68 48 127 l 0 248 z',\n },\n accSagittalFlat23CDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 b 135 -68 48 -127 85 -68 l 383 -68 b 495 203 458 -68 495 23 l 449 203 b 360 23 449 84 420 23 l 315 23 l 315 517 l 271 517 l 271 23 l 180 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 -14 86 23 63 10 l 45 517 l 0 517 z',\n },\n accSagittalSharp5v19CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -266 l 135 -153 l 135 -517 l 180 -517 l 180 -115 l 271 -39 l 271 -517 l 315 -517 l 315 0 l 405 75 l 405 -517 l 449 -517 l 449 248 l 428 248 b 130 68 285 127 186 68 b 45 157 73 68 45 98 l 0 157 b 112 -20 0 53 37 -6 z',\n },\n accSagittalFlat5v19CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 112 20 b 0 -157 37 6 0 -53 l 45 -157 b 130 -68 45 -98 73 -68 b 428 -248 186 -68 285 -127 l 449 -248 l 449 517 l 405 517 l 405 -75 l 315 0 l 315 517 l 271 517 l 271 39 l 180 115 l 180 517 l 135 517 l 135 153 l 0 266 l 0 112 z',\n },\n accSagittalSharp5v23SUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 135 -108 l 135 -517 l 180 -517 l 180 -53 l 271 58 l 271 -517 l 315 -517 l 315 14 b 383 -23 334 -10 357 -23 l 405 -23 l 405 -517 l 449 -517 l 449 -23 b 540 -203 510 -23 540 -84 l 585 -203 b 472 68 585 -23 547 68 l 405 68 b 292 248 356 68 318 127 l 0 -112 l 0 -274 z',\n },\n accSagittalFlat5v23SDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 274 l 0 112 l 292 -248 b 405 -68 318 -127 356 -68 l 472 -68 b 585 203 547 -68 585 23 l 540 203 b 449 23 540 84 510 23 l 449 517 l 405 517 l 405 23 l 383 23 b 315 -14 357 23 334 10 l 315 517 l 271 517 l 271 -58 l 180 53 l 180 517 l 135 517 l 135 108 z',\n },\n accSagittalDoubleSharp5v23SDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 52 -517 l 203 -81 l 354 -517 l 405 -503 l 239 -23 l 449 -23 b 540 -203 510 -23 540 -84 l 585 -203 b 472 68 585 -23 547 68 l 225 68 b 112 248 176 68 138 127 l 89 248 l 89 112 b 170 -14 109 45 135 0 l 0 -501 z',\n },\n accSagittalDoubleFlat5v23SUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 501 l 170 14 b 89 -112 135 0 109 -45 l 89 -248 l 112 -248 b 225 -68 138 -127 176 -68 l 472 -68 b 585 203 547 -68 585 23 l 540 203 b 449 23 540 84 510 23 l 239 23 l 405 503 l 354 517 l 203 81 l 52 517 z',\n },\n accSagittalDoubleSharp5v19CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 112 -112 0 -52 36 -112 b 193 -73 143 -112 170 -99 l 45 -501 l 95 -517 l 248 -81 l 397 -517 l 449 -501 l 275 0 l 315 112 b 495 -68 435 112 495 53 l 495 -248 l 540 -248 l 540 68 b 360 248 540 189 480 248 l 248 248 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 z',\n },\n accSagittalDoubleFlat5v19CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 l 360 -248 b 540 -68 480 -248 540 -189 l 540 248 l 495 248 l 495 68 b 315 -112 495 -53 435 -112 l 275 0 l 449 501 l 397 517 l 248 81 l 95 517 l 45 501 l 193 73 b 112 112 170 99 143 112 b 0 -68 36 112 0 52 z',\n },\n accSagittalDoubleSharp23CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 252 35 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 323 4 b 383 -23 340 -13 360 -23 l 449 -23 b 540 -203 510 -23 540 -84 l 585 -203 b 472 68 585 -23 547 68 l 405 68 b 292 248 356 68 318 127 l 0 -112 l 0 -274 z',\n },\n accSagittalDoubleFlat23CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 274 l 0 112 l 292 -248 b 405 -68 318 -127 356 -68 l 472 -68 b 585 203 547 -68 585 23 l 540 203 b 449 23 540 84 510 23 l 383 23 b 323 -4 360 23 340 13 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 252 -35 z',\n },\n accSagittal19SchismaUp: {\n x_min: 0,\n x_max: 125,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 68 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 248 l 157 248 b 79 0 127 98 101 16 b 68 -3 73 0 68 -3 b 45 68 52 -3 45 20 l 0 68 b 68 -112 0 -52 23 -112 z',\n },\n accSagittal19SchismaDown: {\n x_min: 0,\n x_max: 125,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 68 112 b 0 -68 23 112 0 52 l 45 -68 b 68 3 45 -20 52 3 b 79 0 68 3 73 0 b 157 -248 101 -16 127 -98 l 180 -248 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 z',\n },\n accSagittal17KleismaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 248 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z',\n },\n accSagittal17KleismaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 225 -248 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z',\n },\n accSagittal143CommaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -203 l 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 248 l 203 248 b 135 68 177 127 154 68 l 105 68 b 45 157 65 68 45 98 l 0 157 b 23 20 0 95 7 50 b 0 -203 7 -23 0 -98 z',\n },\n accSagittal143CommaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 23 -20 0 98 7 23 b 0 -157 7 -50 0 -95 l 45 -157 b 105 -68 45 -98 65 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 225 -248 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z',\n },\n accSagittal11v49CommaUp: {\n x_min: 0,\n x_max: 188,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -292 b 89 -157 45 -203 60 -157 l 203 -157 b 225 -143 210 -157 217 -153 l 225 -517 l 271 -517 l 271 248 l 248 248 b 180 157 233 187 210 157 l 68 157 b 0 -68 23 157 0 82 l 45 -68 b 89 68 45 23 60 68 l 203 68 b 225 84 209 68 216 72 l 225 -36 b 180 -68 213 -58 199 -68 l 68 -68 b 0 -292 23 -68 0 -143 z',\n },\n accSagittal11v49CommaDown: {\n x_min: 0,\n x_max: 188,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 292 b 68 68 0 143 23 68 l 180 68 b 225 36 199 68 213 58 l 225 -84 b 203 -68 216 -72 209 -68 l 89 -68 b 45 68 60 -68 45 -23 l 0 68 b 68 -157 0 -82 23 -157 l 180 -157 b 248 -248 210 -157 233 -187 l 271 -248 l 271 517 l 225 517 l 225 143 b 203 157 217 153 210 157 l 89 157 b 45 292 60 157 45 203 z',\n },\n accSagittal19CommaUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 68 -112 0 -52 23 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 -4 b 203 -23 187 -17 196 -23 l 315 -23 b 360 -203 346 -23 360 -82 l 405 -203 b 341 68 405 -23 383 68 l 225 68 b 157 248 206 68 183 127 b 79 0 127 98 101 16 b 68 -3 73 0 68 -3 b 45 68 52 -3 45 20 z',\n },\n accSagittal19CommaDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 68 3 45 -20 52 3 b 79 0 68 3 73 0 b 157 -248 101 -16 127 -98 b 225 -68 183 -127 206 -68 l 341 -68 b 405 203 383 -68 405 23 l 360 203 b 315 23 360 82 346 23 l 203 23 b 180 4 196 23 187 17 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 b 0 -68 23 112 0 52 z',\n },\n accSagittal7v19CommaUp: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 68 -112 0 -52 23 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 112 l 225 112 b 315 -68 285 112 315 53 l 315 -248 l 360 -248 l 360 68 b 271 248 360 187 330 248 l 157 248 b 79 0 127 98 101 16 b 68 -3 73 0 68 -3 b 45 68 52 -3 45 20 z',\n },\n accSagittal7v19CommaDown: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 68 3 45 -20 52 3 b 79 0 68 3 73 0 b 157 -248 101 -16 127 -98 l 271 -248 b 360 -68 330 -248 360 -187 l 360 248 l 315 248 l 315 68 b 225 -112 315 -53 285 -112 l 180 -112 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 b 0 -68 23 112 0 52 z',\n },\n accSagittal49SmallDiesisUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -203 l 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -68 330 112 360 53 l 360 -248 l 405 -248 l 405 68 b 315 248 405 187 374 248 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z',\n },\n accSagittal49SmallDiesisDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 315 -248 b 405 -68 374 -248 405 -187 l 405 248 l 360 248 l 360 68 b 271 -112 360 -53 330 -112 l 225 -112 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z',\n },\n accSagittal23SmallDiesisUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 58 l 495 -274 l 495 -112 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z',\n },\n accSagittal23SmallDiesisDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 495 112 l 495 274 l 225 -58 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z',\n },\n accSagittal5v13MediumDiesisUp: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -259 l 315 -89 l 315 -517 l 360 -517 l 360 248 l 337 248 b 128 180 253 203 184 180 b 45 248 73 180 45 203 l 0 248 b 52 95 0 170 17 120 l 0 68 l 0 -33 l 315 135 l 315 10 l 0 -157 z',\n },\n accSagittal5v13MediumDiesisDown: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 157 l 315 -10 l 315 -135 l 0 33 l 0 -68 l 52 -95 b 0 -248 17 -120 0 -170 l 45 -248 b 128 -180 45 -203 73 -180 b 337 -248 184 -180 253 -203 l 360 -248 l 360 517 l 315 517 l 315 89 l 0 259 z',\n },\n accSagittal11v19MediumDiesisUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 -4 b 292 -23 278 -17 285 -23 l 405 -23 b 449 -203 435 -23 449 -82 l 495 -203 b 431 68 495 -23 472 68 l 315 68 b 248 248 295 68 271 127 l 135 248 b 0 68 45 248 0 187 l 0 -248 z',\n },\n accSagittal11v19MediumDiesisDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 248 l 0 -68 b 135 -248 0 -187 45 -248 l 248 -248 b 315 -68 271 -127 295 -68 l 431 -68 b 495 203 472 -68 495 23 l 449 203 b 405 23 449 82 435 23 l 292 23 b 271 4 285 23 278 17 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 z',\n },\n accSagittal49MediumDiesisUp: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -68 l 0 -248 l 45 -248 l 315 -94 l 315 -517 l 360 -517 l 360 248 l 225 248 b 0 -68 75 248 0 143 z m 45 -68 b 225 112 45 53 105 112 l 315 112 l 315 10 l 45 -145 z',\n },\n accSagittal49MediumDiesisDown: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 68 b 225 -248 0 -143 75 -248 l 360 -248 l 360 517 l 315 517 l 315 94 l 45 248 l 0 248 z m 45 145 l 315 -10 l 315 -112 l 225 -112 b 45 68 105 -112 45 -53 z',\n },\n accSagittal5v49MediumDiesisUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -89 l 0 -248 l 225 53 l 225 -517 l 271 -517 l 271 53 l 495 -248 l 495 -89 l 248 248 b 89 89 170 143 118 89 b 45 157 60 89 45 112 l 0 157 b 68 3 0 68 23 16 z',\n },\n accSagittal5v49MediumDiesisDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 68 -3 b 0 -157 23 -16 0 -68 l 45 -157 b 89 -89 45 -112 60 -89 b 248 -248 118 -89 170 -143 l 495 89 l 495 248 l 271 -53 l 271 517 l 225 517 l 225 -53 l 0 248 l 0 89 z',\n },\n accSagittal49LargeDiesisUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -89 l 360 -248 l 405 -248 l 405 -68 b 180 248 405 143 330 248 l 0 248 z m 45 12 l 45 112 l 180 112 b 360 -68 300 112 360 53 l 360 -147 z',\n },\n accSagittal49LargeDiesisDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 180 -248 b 405 68 330 -248 405 -143 l 405 248 l 360 248 l 45 89 l 45 517 l 0 517 z m 360 147 l 360 68 b 180 -112 360 -53 300 -112 l 45 -112 l 45 -12 z',\n },\n accSagittal11v19LargeDiesisUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -86 l 449 -256 l 449 -157 l 45 13 l 45 138 l 449 -30 l 449 68 l 23 248 l 0 248 z',\n },\n accSagittal11v19LargeDiesisDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 l 449 -68 l 449 30 l 45 -138 l 45 -13 l 449 157 l 449 256 l 45 86 l 45 517 l 0 517 z',\n },\n accSagittal5v13LargeDiesisUp: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 89 -112 0 -52 30 -112 b 180 -35 125 -112 157 -86 l 180 -517 l 225 -517 l 225 -86 l 631 -256 l 631 -157 l 225 13 l 225 138 l 631 -30 l 631 68 l 203 248 b 101 0 173 98 138 16 b 81 -3 94 0 86 -3 b 45 68 56 -3 45 20 z',\n },\n accSagittal5v13LargeDiesisDown: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 81 3 45 -20 56 3 b 101 0 86 3 94 0 b 203 -248 138 -16 173 -98 l 631 -68 l 631 30 l 225 -138 l 225 -13 l 631 157 l 631 256 l 225 86 l 225 517 l 180 517 l 180 35 b 89 112 157 86 125 112 b 0 -68 30 112 0 52 z',\n },\n accSagittalSharp23SDown: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -203 l 45 -203 b 112 -23 45 -84 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 b 315 6 287 -23 301 -13 l 315 -517 l 360 -517 l 360 248 l 337 248 b 248 68 312 127 282 68 l 194 68 b 89 157 125 68 89 98 l 45 157 b 60 59 45 118 50 85 b 0 -203 20 30 0 -56 z',\n },\n accSagittalFlat23SUp: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 60 -59 0 56 20 -30 b 45 -157 50 -85 45 -118 l 89 -157 b 194 -68 89 -98 125 -68 l 248 -68 b 337 -248 282 -68 312 -127 l 360 -248 l 360 517 l 315 517 l 315 -6 b 271 23 301 13 287 23 l 180 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 84 z',\n },\n accSagittalSharp49SDown: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -292 l 45 -292 b 112 -157 45 -203 68 -157 l 135 -157 l 135 -517 l 180 -517 l 180 -157 l 271 -157 b 315 -135 285 -157 300 -150 l 315 -517 l 360 -517 l 360 248 l 337 248 b 248 157 323 187 292 157 l 89 157 b 0 -68 30 157 0 82 l 45 -68 b 112 68 45 23 68 68 l 271 68 b 315 89 284 68 300 75 l 315 -32 b 248 -68 298 -56 275 -68 l 89 -68 b 0 -292 29 -68 0 -143 z',\n },\n accSagittalFlat49SUp: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 292 b 89 68 0 143 29 68 l 248 68 b 315 32 275 68 298 56 l 315 -89 b 271 -68 300 -75 284 -68 l 112 -68 b 45 68 68 -68 45 -23 l 0 68 b 89 -157 0 -82 30 -157 l 248 -157 b 337 -248 292 -157 323 -187 l 360 -248 l 360 517 l 315 517 l 315 135 b 271 157 300 150 285 157 l 180 157 l 180 517 l 135 517 l 135 157 l 112 157 b 45 292 68 157 45 203 z',\n },\n accSagittalSharp7v19CDown: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -271 l 135 -125 l 135 -517 l 180 -517 l 180 -78 l 315 65 l 315 -517 l 360 -517 l 360 248 l 337 248 b 118 89 239 143 166 89 b 45 157 68 89 45 112 l 0 157 b 89 -20 0 53 29 -6 z',\n },\n accSagittalFlat7v19CUp: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 20 b 0 -157 29 6 0 -53 l 45 -157 b 118 -89 45 -112 68 -89 b 337 -248 166 -89 239 -143 l 360 -248 l 360 517 l 315 517 l 315 -65 l 180 78 l 180 517 l 135 517 l 135 125 l 0 271 l 0 112 z',\n },\n accSagittalSharp19CDown: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 180 96 45 17 89 72 l 180 -517 l 225 -517 l 225 107 b 315 112 252 112 282 112 l 360 112 l 360 -517 l 405 -517 l 405 248 l 271 248 b 0 68 89 248 0 187 z',\n },\n accSagittalFlat19CUp: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 271 -248 0 -187 89 -248 l 405 -248 l 405 517 l 360 517 l 360 -112 l 315 -112 b 225 -107 282 -112 252 -112 l 225 517 l 180 517 l 180 -96 b 45 68 89 -72 45 -17 l 45 248 l 0 248 z',\n },\n accSagittalSharp11v49CDown: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 112 -23 45 -82 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 b 271 112 215 -23 245 23 l 315 112 l 315 -517 l 360 -517 l 360 107 b 449 -68 420 89 449 30 l 449 -248 l 495 -248 l 495 68 b 360 248 495 189 449 248 l 248 248 b 157 68 222 128 192 68 l 89 68 b 0 -203 30 68 0 -23 z',\n },\n accSagittalFlat11v49CUp: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 89 -68 0 23 30 -68 l 157 -68 b 248 -248 192 -68 222 -128 l 360 -248 b 495 -68 449 -248 495 -189 l 495 248 l 449 248 l 449 68 b 360 -107 449 -30 420 -89 l 360 517 l 315 517 l 315 -112 l 271 -112 b 180 23 245 -23 215 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 82 z',\n },\n accSagittalSharp143CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 112 -23 45 -84 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 b 259 76 210 -23 236 10 l 315 17 l 315 -517 l 360 -517 l 360 -30 l 585 -271 l 585 -112 l 248 248 b 157 68 222 127 192 68 l 89 68 b 0 -203 30 68 0 -23 z',\n },\n accSagittalFlat143CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 89 -68 0 23 30 -68 l 157 -68 b 248 -248 192 -68 222 -127 l 585 112 l 585 271 l 360 30 l 360 517 l 315 517 l 315 -17 l 259 -76 b 180 23 236 -10 210 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 84 z',\n },\n accSagittalSharp17kDown: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -157 l 0 -256 l 225 -161 l 225 -517 l 271 -517 l 271 -144 l 405 -86 l 405 -517 l 449 -517 l 449 248 l 428 248 b 145 171 305 196 210 171 b 45 248 78 171 45 196 l 0 248 b 79 101 0 170 26 121 l 0 68 l 0 -32 l 405 138 l 405 13 z',\n },\n accSagittalFlat17kUp: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 405 -13 l 405 -138 l 0 32 l 0 -68 l 79 -101 b 0 -248 26 -121 0 -170 l 45 -248 b 145 -171 45 -196 78 -171 b 428 -248 210 -171 305 -196 l 449 -248 l 449 517 l 405 517 l 405 86 l 271 144 l 271 517 l 225 517 l 225 161 l 0 256 l 0 157 z',\n },\n accSagittalSharp19sDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 180 109 45 36 89 95 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -23 295 23 325 -23 l 360 -517 l 405 -517 l 405 -23 l 472 -23 b 540 -203 517 -23 540 -84 l 585 -203 b 495 68 585 -23 554 68 l 383 68 b 292 248 348 68 318 127 l 180 248 b 0 68 60 248 0 187 z',\n },\n accSagittalFlat19sUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 180 -248 0 -187 60 -248 l 292 -248 b 383 -68 318 -127 348 -68 l 495 -68 b 585 203 554 -68 585 23 l 540 203 b 472 23 540 84 517 23 l 405 23 l 405 517 l 360 517 l 360 23 b 271 -112 325 23 295 -23 l 225 -112 l 225 517 l 180 517 l 180 -109 b 45 68 89 -95 45 -36 l 45 248 l 0 248 z',\n },\n accSagittalSharp19sUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 89 -96 l 89 -517 l 135 -517 l 135 -108 b 180 -112 148 -112 163 -112 b 225 -108 196 -112 210 -112 l 225 -517 l 271 -517 l 271 -94 b 360 -12 305 -78 337 -50 l 360 -517 l 405 -517 l 405 248 l 383 248 b 190 0 353 98 288 16 b 138 -3 171 0 153 -3 b 45 68 75 -3 45 20 l 0 68 b 89 -96 0 -17 30 -72 z',\n },\n accSagittalFlat19sDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 96 b 0 -68 30 72 0 17 l 45 -68 b 138 3 45 -20 75 3 b 190 0 153 3 171 0 b 383 -248 288 -16 353 -98 l 405 -248 l 405 517 l 360 517 l 360 12 b 271 94 337 50 305 78 l 271 517 l 225 517 l 225 108 b 180 112 210 112 196 112 b 135 108 163 112 148 112 l 135 517 l 89 517 z',\n },\n accSagittalSharp17kUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 l 271 -517 l 315 -517 l 315 -23 l 337 -23 b 405 14 363 -23 386 -10 l 405 -517 l 449 -517 l 449 248 l 428 248 b 315 68 402 127 364 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalFlat17kDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 315 -68 b 428 -248 364 -68 402 -127 l 449 -248 l 449 517 l 405 517 l 405 -14 b 337 23 386 10 363 23 l 315 23 l 315 517 l 271 517 l 271 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalSharp143CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 l 271 -517 l 315 -517 l 315 -23 l 337 -23 b 405 14 363 -23 386 -10 l 405 -517 l 449 -517 l 449 248 l 428 248 b 315 68 402 127 364 68 l 240 68 b 89 157 140 68 89 98 l 45 157 b 68 53 45 115 52 81 b 0 -203 23 23 0 -63 z',\n },\n accSagittalFlat143CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -53 0 63 23 -23 b 45 -157 52 -81 45 -115 l 89 -157 b 240 -68 89 -98 140 -68 l 315 -68 b 428 -248 364 -68 402 -127 l 449 -248 l 449 517 l 405 517 l 405 -14 b 337 23 386 10 363 23 l 315 23 l 315 517 l 271 517 l 271 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalSharp11v49CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -68 b 135 68 45 23 76 68 l 337 68 b 405 95 363 68 386 76 l 405 -27 b 315 -68 386 -55 356 -68 l 112 -68 b 0 -292 37 -68 0 -143 l 45 -292 b 135 -157 45 -203 75 -157 l 135 -517 l 180 -517 l 180 -157 l 271 -157 l 271 -517 l 315 -517 l 315 -157 l 337 -157 b 405 -130 360 -157 383 -148 l 405 -517 l 449 -517 l 449 248 l 428 248 b 315 157 413 187 376 157 l 112 157 b 0 -68 37 157 0 82 z',\n },\n accSagittalFlat11v49CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 68 b 112 -157 0 -82 37 -157 l 315 -157 b 428 -248 376 -157 413 -187 l 449 -248 l 449 517 l 405 517 l 405 130 b 337 157 383 148 360 157 l 315 157 l 315 517 l 271 517 l 271 157 l 180 157 l 180 517 l 135 517 l 135 157 b 45 292 75 157 45 203 l 0 292 b 112 68 0 143 37 68 l 315 68 b 405 27 356 68 386 55 l 405 -95 b 337 -68 386 -76 363 -68 l 135 -68 b 45 68 76 -68 45 -23 z',\n },\n accSagittalSharp19CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 89 -109 l 89 -517 l 135 -517 l 135 -109 b 225 -27 170 -102 200 -75 l 225 -517 l 271 -517 l 271 14 b 337 -23 289 -10 311 -23 l 360 -23 l 360 -517 l 405 -517 l 405 -23 b 495 -203 465 -23 495 -82 l 540 -203 b 428 68 540 -23 503 68 l 360 68 b 248 248 310 68 271 128 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 89 -109 0 -39 30 -98 z',\n },\n accSagittalFlat19CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 109 b 0 -68 30 98 0 39 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 b 360 -68 271 -128 310 -68 l 428 -68 b 540 203 503 -68 540 23 l 495 203 b 405 23 495 82 465 23 l 405 517 l 360 517 l 360 23 l 337 23 b 271 -14 311 23 289 10 l 271 517 l 225 517 l 225 27 b 135 109 200 75 170 102 l 135 517 l 89 517 z',\n },\n accSagittalSharp7v19CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 89 -109 l 89 -517 l 135 -517 l 135 -109 b 225 -27 170 -102 200 -75 l 225 -517 l 271 -517 l 271 112 l 315 112 b 360 109 331 112 346 112 l 360 -517 l 405 -517 l 405 98 b 495 -68 465 73 495 19 l 495 -248 l 540 -248 l 540 68 b 360 248 540 189 480 248 l 248 248 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 89 -109 0 -39 30 -98 z',\n },\n accSagittalFlat7v19CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 109 b 0 -68 30 98 0 39 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 l 360 -248 b 540 -68 480 -248 540 -189 l 540 248 l 495 248 l 495 68 b 405 -98 495 -19 465 -73 l 405 517 l 360 517 l 360 -109 b 315 -112 346 -112 331 -112 l 271 -112 l 271 517 l 225 517 l 225 27 b 135 109 200 75 170 102 l 135 517 l 89 517 z',\n },\n accSagittalSharp49SUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 203 -23 b 271 14 229 -23 251 -10 l 271 -517 l 315 -517 l 315 112 l 360 112 b 405 109 376 112 390 112 l 405 -517 l 449 -517 l 449 96 b 540 -68 510 72 540 17 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalFlat49SDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 449 -96 540 -17 510 -72 l 449 517 l 405 517 l 405 -109 b 360 -112 390 -112 376 -112 l 315 -112 l 315 517 l 271 517 l 271 -14 b 203 23 251 10 229 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalSharp23SUp: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 203 -23 b 271 14 229 -23 251 -10 l 271 -517 l 315 -517 l 315 71 l 405 -14 l 405 -517 l 449 -517 l 449 -56 l 675 -268 l 675 -112 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalFlat23SDown: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 675 112 l 675 268 l 449 56 l 449 517 l 405 517 l 405 14 l 315 -71 l 315 517 l 271 517 l 271 -14 b 203 23 251 10 229 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalSharp5v13MUp: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 495 141 l 495 14 l 0 -157 l 0 -256 l 225 -180 l 225 -517 l 271 -517 l 271 -161 l 360 -130 l 360 -517 l 405 -517 l 405 -115 l 495 -84 l 495 -517 l 540 -517 l 540 248 l 517 248 b 167 168 366 194 248 168 b 45 248 85 168 45 194 l 0 248 b 95 99 0 170 30 120 l 0 68 l 0 -30 z',\n },\n accSagittalFlat5v13MDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 30 l 0 -68 l 95 -99 b 0 -248 30 -120 0 -170 l 45 -248 b 167 -168 45 -194 85 -168 b 517 -248 248 -168 366 -194 l 540 -248 l 540 517 l 495 517 l 495 84 l 405 115 l 405 517 l 360 517 l 360 130 l 271 161 l 271 517 l 225 517 l 225 180 l 0 256 l 0 157 l 495 -14 l 495 -141 z',\n },\n accSagittalSharp11v19MUp: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 14 b 428 -23 379 -10 402 -23 l 449 -23 l 449 -517 l 495 -517 l 495 -23 b 585 -203 554 -23 585 -84 l 631 -203 b 517 68 631 -23 593 68 l 449 68 b 337 248 400 68 363 127 l 225 248 b 0 68 75 248 0 187 z',\n },\n accSagittalFlat11v19MDown: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 337 -248 b 449 -68 363 -127 400 -68 l 517 -68 b 631 203 593 -68 631 23 l 585 203 b 495 23 585 84 554 23 l 495 517 l 449 517 l 449 23 l 428 23 b 360 -14 402 23 379 10 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z',\n },\n accSagittalSharp49MUp: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 225 -180 l 225 -517 l 271 -517 l 271 -166 l 360 -132 l 360 -517 l 405 -517 l 405 -117 l 495 -84 l 495 -517 l 540 -517 l 540 248 l 360 248 b 0 -68 120 248 0 143 z m 45 -145 l 45 -68 b 360 112 45 53 150 112 l 495 112 l 495 14 z',\n },\n accSagittalFlat49MDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 68 b 360 -248 0 -143 120 -248 l 540 -248 l 540 517 l 495 517 l 495 84 l 405 117 l 405 517 l 360 517 l 360 132 l 271 166 l 271 517 l 225 517 l 225 180 l 45 248 l 0 248 z m 495 -14 l 495 -112 l 360 -112 b 45 68 150 -112 45 -53 l 45 145 z',\n },\n accSagittalSharp5v49MUp: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -271 l 180 -79 l 180 -517 l 225 -517 l 225 -30 l 315 65 l 315 -517 l 360 -517 l 360 65 l 449 -30 l 449 -517 l 495 -517 l 495 -79 l 675 -271 l 675 -112 l 337 248 b 118 89 239 143 166 89 b 45 157 68 89 45 112 l 0 157 b 107 0 0 62 36 10 l 0 -112 z',\n },\n accSagittalFlat5v49MDown: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 107 0 b 0 -157 36 -10 0 -62 l 45 -157 b 118 -89 45 -112 68 -89 b 337 -248 166 -89 239 -143 l 675 112 l 675 271 l 495 79 l 495 517 l 449 517 l 449 30 l 360 -65 l 360 517 l 315 517 l 315 -65 l 225 30 l 225 517 l 180 517 l 180 79 l 0 271 z',\n },\n accSagittalSharp49LUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -82 l 135 -112 l 135 -517 l 180 -517 l 180 -127 l 271 -157 l 271 -517 l 315 -517 l 315 -173 l 540 -248 l 585 -248 l 585 -68 b 180 248 585 143 449 248 l 0 248 z m 45 112 l 180 112 b 540 -68 420 112 540 53 l 540 -145 l 45 16 z',\n },\n accSagittalFlat49LDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 180 -248 b 585 68 449 -248 585 -143 l 585 248 l 540 248 l 315 173 l 315 517 l 271 517 l 271 157 l 180 127 l 180 517 l 135 517 l 135 112 l 45 82 l 45 517 l 0 517 z m 45 -16 l 540 145 l 540 68 b 180 -112 540 -53 420 -112 l 45 -112 z',\n },\n accSagittalSharp11v19LUp: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -81 l 135 -108 l 135 -517 l 180 -517 l 180 -121 l 271 -148 l 271 -517 l 315 -517 l 315 -161 l 631 -255 l 631 -157 l 45 16 l 45 144 l 631 -30 l 631 68 l 23 248 l 0 248 z',\n },\n accSagittalFlat11v19LDown: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 l 631 -68 l 631 30 l 45 -144 l 45 -16 l 631 157 l 631 255 l 315 161 l 315 517 l 271 517 l 271 148 l 180 121 l 180 517 l 135 517 l 135 108 l 45 81 l 45 517 l 0 517 z',\n },\n accSagittalSharp5v13LUp: {\n x_min: 0,\n x_max: 500,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 89 -109 l 89 -517 l 135 -517 l 135 -109 b 225 -27 170 -102 200 -75 l 225 -517 l 271 -517 l 271 -85 l 360 -120 l 360 -517 l 405 -517 l 405 -135 l 720 -256 l 720 -157 l 271 14 l 271 141 l 720 -30 l 720 68 l 248 248 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 89 -109 0 -39 30 -98 z',\n },\n accSagittalFlat5v13LDown: {\n x_min: 0,\n x_max: 500,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 109 b 0 -68 30 98 0 39 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 l 720 -68 l 720 30 l 271 -141 l 271 -14 l 720 157 l 720 256 l 405 135 l 405 517 l 360 517 l 360 120 l 271 85 l 271 517 l 225 517 l 225 27 b 135 109 200 75 170 102 l 135 517 l 89 517 z',\n },\n accSagittalDoubleSharp23SDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -203 l 45 -203 b 135 -23 45 -82 76 -23 l 301 -23 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 370 -14 b 449 112 423 10 449 53 l 449 248 l 428 248 b 315 68 402 127 364 68 l 240 68 b 89 157 140 68 89 98 l 45 157 b 68 53 45 115 52 81 b 0 -203 23 23 0 -63 z',\n },\n accSagittalDoubleFlat23SUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -53 0 63 23 -23 b 45 -157 52 -81 45 -115 l 89 -157 b 240 -68 89 -98 140 -68 l 315 -68 b 428 -248 364 -68 402 -127 l 449 -248 l 449 -112 b 370 14 449 -53 423 -10 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 301 23 l 135 23 b 45 203 76 23 45 82 z',\n },\n accSagittalDoubleSharp49SDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -292 l 45 -292 b 112 -157 45 -203 68 -157 l 256 -157 l 135 -503 l 187 -517 l 337 -82 l 490 -517 l 540 -503 l 366 0 l 396 89 b 449 157 416 102 435 125 l 449 248 l 428 248 b 315 157 413 187 376 157 l 112 157 b 0 -68 39 157 0 82 l 45 -68 b 135 68 45 23 76 68 l 287 68 l 311 0 l 288 -68 l 89 -68 b 0 -292 32 -68 0 -144 z',\n },\n accSagittalDoubleFlat49SUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 292 b 89 68 0 144 32 68 l 288 68 l 311 0 l 287 -68 l 135 -68 b 45 68 76 -68 45 -23 l 0 68 b 112 -157 0 -82 39 -157 l 315 -157 b 428 -248 376 -157 413 -187 l 449 -248 l 449 -157 b 396 -89 435 -125 416 -102 l 366 0 l 540 503 l 490 517 l 337 82 l 187 517 l 135 503 l 256 157 l 112 157 b 45 292 68 157 45 203 z',\n },\n accSagittalDoubleSharp7v19CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -266 l 307 -7 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 366 0 l 386 59 l 449 112 l 449 248 l 428 248 b 130 68 285 127 186 68 b 45 157 73 68 45 98 l 0 157 b 112 -20 0 53 37 -6 z',\n },\n accSagittalDoubleFlat7v19CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 112 20 b 0 -157 37 6 0 -53 l 45 -157 b 130 -68 45 -98 73 -68 b 428 -248 186 -68 285 -127 l 449 -248 l 449 -112 l 386 -59 l 366 0 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 307 7 l 0 266 l 0 112 z',\n },\n accSagittalDoubleSharp19CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 315 109 45 36 135 95 l 354 0 l 180 -503 l 232 -517 l 383 -82 l 534 -517 l 585 -503 l 410 0 l 449 112 l 495 112 l 495 248 l 360 248 b 0 68 120 248 0 187 z m 372 112 l 393 112 l 383 82 z',\n },\n accSagittalDoubleFlat19CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 360 -248 0 -187 120 -248 l 495 -248 l 495 -112 l 449 -112 l 410 0 l 585 503 l 534 517 l 383 82 l 232 517 l 180 503 l 354 0 l 315 -109 b 45 68 135 -95 45 -36 l 45 248 l 0 248 z m 383 -82 l 393 -112 l 372 -112 z',\n },\n accSagittalDoubleSharp11v49CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 203 -23 b 262 4 225 -23 245 -13 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 360 112 b 540 -68 480 112 540 53 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalDoubleFlat11v49CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 360 -112 540 -53 480 -112 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 262 -4 b 203 23 245 13 225 23 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalDoubleSharp143CDown: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 203 -23 b 262 4 225 -23 245 -13 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 337 49 l 675 -268 l 675 -112 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalDoubleFlat143CUp: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 675 112 l 675 268 l 337 -49 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 262 -4 b 203 23 245 13 225 23 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalDoubleSharp17kDown: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 248 b 95 101 0 170 30 121 l 0 68 l 0 -30 l 364 96 l 399 0 l 390 -23 l 0 -157 l 0 -255 l 353 -135 l 225 -503 l 275 -517 l 428 -82 l 577 -517 l 631 -503 l 455 0 l 507 145 l 540 157 l 540 248 l 517 248 b 167 168 366 194 248 168 b 45 248 85 168 45 194 z m 416 115 l 442 124 l 428 82 z',\n },\n accSagittalDoubleFlat17kUp: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -248 b 167 -168 45 -194 85 -168 b 517 -248 248 -168 366 -194 l 540 -248 l 540 -157 l 507 -145 l 455 0 l 631 503 l 577 517 l 428 82 l 275 517 l 225 503 l 353 135 l 0 255 l 0 157 l 390 23 l 399 0 l 364 -96 l 0 30 l 0 -68 l 95 -101 b 0 -248 30 -121 0 -170 z m 428 -82 l 442 -124 l 416 -115 z',\n },\n accSagittalDoubleSharp19sDown: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 271 112 45 53 120 112 l 310 0 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 366 0 l 367 4 b 428 -23 386 -13 405 -23 l 495 -23 b 585 -203 554 -23 585 -84 l 631 -203 b 517 68 631 -23 593 68 l 449 68 b 337 248 400 68 363 127 l 225 248 b 0 68 75 248 0 187 z',\n },\n accSagittalDoubleFlat19sUp: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 337 -248 b 449 -68 363 -127 400 -68 l 517 -68 b 631 203 593 -68 631 23 l 585 203 b 495 23 585 84 554 23 l 428 23 b 367 -4 405 23 386 13 l 366 0 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 310 0 l 271 -112 b 45 68 120 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittalShaftUp: {\n x_min: 0,\n x_max: 31,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 112 l 0 -517 l 45 -517 l 45 112 l 23 248 z',\n },\n accSagittalShaftDown: {\n x_min: 0,\n x_max: 31,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 23 -248 l 45 -112 l 45 517 l 0 517 l 0 -112 z',\n },\n accSagittalAcute: {\n x_min: 0,\n x_max: 125,\n y_min: -62,\n y_max: 125,\n ha: 187,\n o: 'm 0 0 l 0 -89 l 180 89 l 180 180 z',\n },\n accSagittalGrave: {\n x_min: 0,\n x_max: 125,\n y_min: -125,\n y_max: 62,\n ha: 187,\n o: 'm 180 -180 l 180 -89 l 0 89 l 0 0 z',\n },\n accSagittal1MinaUp: {\n x_min: -7,\n x_max: 124,\n y_min: 16,\n y_max: 106.31676725154982,\n ha: 90.31676725154982,\n o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 134 150 179 112 163 135 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z',\n },\n accSagittal1MinaDown: {\n x_min: -7,\n x_max: 124,\n y_min: -106.31676725154983,\n y_max: -16,\n ha: 90.31676725154983,\n o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 179 -23 163 -135 179 -112 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z',\n },\n accSagittal2MinasUp: {\n x_min: -7,\n x_max: 218,\n y_min: 16,\n y_max: 106.31676725154982,\n ha: 90.31676725154982,\n o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 207 65 179 23 200 55 b 252 107 223 86 240 107 b 271 23 264 107 272 86 l 314 23 b 269 150 314 112 298 135 b 203 130 252 158 220 150 b 173 92 190 115 181 104 b 134 150 167 127 154 140 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z',\n },\n accSagittal2MinasDown: {\n x_min: -7,\n x_max: 218,\n y_min: -106.31676725154983,\n y_max: -16,\n ha: 90.31676725154983,\n o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 173 -92 154 -140 167 -127 b 203 -130 181 -104 190 -115 b 269 -150 220 -150 252 -158 b 314 -23 298 -135 314 -112 l 271 -23 b 252 -107 272 -86 264 -107 b 207 -65 240 -107 223 -86 b 179 -23 200 -55 179 -23 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z',\n },\n accSagittal1TinaUp: {\n x_min: 0,\n x_max: 93,\n y_min: 16,\n y_max: 107,\n ha: 91,\n o: 'm 134 154 l 91 154 b 81 76 91 101 91 86 b 0 68 73 69 48 68 l 0 23 b 134 154 122 23 134 36 z',\n },\n accSagittal1TinaDown: {\n x_min: 0,\n x_max: 93,\n y_min: -107,\n y_max: -16,\n ha: 91,\n o: 'm 134 -154 b 0 -23 134 -36 122 -23 l 0 -68 b 81 -76 48 -68 73 -69 b 91 -154 91 -86 91 -101 z',\n },\n accSagittal2TinasUp: {\n x_min: 0,\n x_max: 94,\n y_min: 16,\n y_max: 107,\n ha: 91,\n o: 'm 135 68 b 89 154 94 68 89 124 l 46 154 b 36 92 45 131 42 105 b 0 68 32 82 23 68 l 0 23 b 68 63 29 23 53 40 b 135 23 84 39 104 23 z',\n },\n accSagittal2TinasDown: {\n x_min: 0,\n x_max: 94,\n y_min: -107,\n y_max: -16,\n ha: 91,\n o: 'm 135 -23 b 68 -63 104 -23 84 -39 b 0 -23 53 -40 29 -23 l 0 -68 b 36 -92 23 -68 32 -82 b 46 -154 42 -105 45 -131 l 89 -154 b 135 -68 89 -124 94 -68 z',\n },\n accSagittal3TinasUp: {\n x_min: -7,\n x_max: 124,\n y_min: 16,\n y_max: 106.31676725154982,\n ha: 90.31676725154982,\n o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 134 150 179 112 163 135 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z',\n },\n accSagittal3TinasDown: {\n x_min: -7,\n x_max: 124,\n y_min: -106.31676725154983,\n y_max: -16,\n ha: 90.31676725154983,\n o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 179 -23 163 -135 179 -112 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z',\n },\n accSagittal4TinasUp: {\n x_min: 0,\n x_max: 187,\n y_min: 16,\n y_max: 106.69999999999997,\n ha: 90.69999999999997,\n o: 'm 0 68 l 0 23 b 143 45 105 23 124 26 b 203 107 153 55 183 107 b 226 23 216 107 226 86 l 269 23 b 225 150 269 112 253 135 b 160 132 207 158 181 153 b 115 81 138 112 124 88 b 0 68 104 71 94 68 z',\n },\n accSagittal4TinasDown: {\n x_min: 0,\n x_max: 187,\n y_min: -106.69999999999999,\n y_max: -16,\n ha: 90.69999999999999,\n o: 'm 0 -68 b 115 -81 94 -68 104 -71 b 160 -132 124 -88 138 -112 b 225 -150 181 -153 207 -158 b 269 -23 253 -135 269 -112 l 226 -23 b 203 -107 226 -86 216 -107 b 143 -45 183 -107 153 -55 b 0 -23 124 -26 105 -23 z',\n },\n accSagittal5TinasUp: {\n x_min: 0,\n x_max: 218,\n y_min: 16,\n y_max: 107,\n ha: 91,\n o: 'm 135 23 b 187 45 156 23 168 26 b 249 107 197 55 228 107 b 271 23 262 107 271 86 l 314 23 b 269 150 314 112 298 135 b 204 132 252 158 226 153 b 160 81 183 112 168 88 b 135 68 148 71 147 68 b 89 154 94 68 89 124 l 46 154 b 36 92 45 131 42 105 b 0 68 32 82 23 68 l 0 23 b 68 63 29 23 53 40 b 135 23 84 39 104 23 z',\n },\n accSagittal5TinasDown: {\n x_min: 0,\n x_max: 218,\n y_min: -107,\n y_max: -16,\n ha: 91,\n o: 'm 135 -23 b 68 -63 104 -23 84 -39 b 0 -23 53 -40 29 -23 l 0 -68 b 36 -92 23 -68 32 -82 b 46 -154 42 -105 45 -131 l 89 -154 b 135 -68 89 -124 94 -68 b 160 -81 147 -68 148 -71 b 204 -132 168 -88 183 -112 b 269 -150 226 -153 252 -158 b 314 -23 298 -135 314 -112 l 271 -23 b 249 -107 271 -86 262 -107 b 187 -45 228 -107 197 -55 b 135 -23 168 -26 156 -23 z',\n },\n accSagittal6TinasUp: {\n x_min: -7,\n x_max: 218,\n y_min: 16,\n y_max: 106.31676725154982,\n ha: 90.31676725154982,\n o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 207 65 179 23 200 55 b 252 107 223 86 240 107 b 271 23 264 107 272 86 l 314 23 b 269 150 314 112 298 135 b 203 130 252 158 220 150 b 173 92 190 115 181 104 b 134 150 167 127 154 140 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z',\n },\n accSagittal6TinasDown: {\n x_min: -7,\n x_max: 218,\n y_min: -106.31676725154983,\n y_max: -16,\n ha: 90.31676725154983,\n o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 173 -92 154 -140 167 -127 b 203 -130 181 -104 190 -115 b 269 -150 220 -150 252 -158 b 314 -23 298 -135 314 -112 l 271 -23 b 252 -107 272 -86 264 -107 b 207 -65 240 -107 223 -86 b 179 -23 200 -55 179 -23 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z',\n },\n accSagittal7TinasUp: {\n x_min: 0,\n x_max: 281,\n y_min: 16,\n y_max: 106.69999999999997,\n ha: 90.69999999999997,\n o: 'm 0 68 l 0 23 b 143 45 105 23 124 26 b 203 107 153 55 183 107 b 226 23 216 107 226 86 l 269 23 b 298 65 269 23 291 55 b 343 107 314 86 331 107 b 361 23 354 107 363 86 l 405 23 b 360 150 405 112 389 135 b 294 130 343 158 311 150 b 264 92 281 115 272 104 b 225 150 258 127 245 140 b 160 132 207 158 181 153 b 115 81 138 112 124 88 b 0 68 104 71 94 68 z',\n },\n accSagittal7TinasDown: {\n x_min: 0,\n x_max: 281,\n y_min: -106.69999999999999,\n y_max: -16,\n ha: 90.69999999999999,\n o: 'm 0 -68 b 115 -81 94 -68 104 -71 b 160 -132 124 -88 138 -112 b 225 -150 181 -153 207 -158 b 264 -92 245 -140 258 -127 b 294 -130 272 -104 281 -115 b 360 -150 311 -150 343 -158 b 405 -23 389 -135 405 -112 l 361 -23 b 343 -107 363 -86 354 -107 b 298 -65 331 -107 314 -86 b 269 -23 291 -55 269 -23 l 226 -23 b 203 -107 226 -86 216 -107 b 143 -45 183 -107 153 -55 b 0 -23 124 -26 105 -23 z',\n },\n accSagittal8TinasUp: {\n x_min: 0,\n x_max: 312,\n y_min: 16,\n y_max: 107,\n ha: 91,\n o: 'm 135 23 b 187 45 156 23 168 26 b 249 107 197 55 228 107 b 271 23 262 107 271 86 l 314 23 b 343 65 314 23 336 55 b 387 107 359 86 376 107 b 406 23 399 107 408 86 l 449 23 b 405 150 449 112 433 135 b 338 130 387 158 356 150 b 308 92 325 115 317 104 b 269 150 302 127 289 140 b 204 132 252 158 226 153 b 160 81 183 112 168 88 b 135 68 148 71 147 68 b 89 154 94 68 89 124 l 46 154 b 36 92 45 131 42 105 b 0 68 32 82 23 68 l 0 23 b 68 63 29 23 53 40 b 135 23 84 39 104 23 z',\n },\n accSagittal8TinasDown: {\n x_min: 0,\n x_max: 312,\n y_min: -107,\n y_max: -16,\n ha: 91,\n o: 'm 135 -23 b 68 -63 104 -23 84 -39 b 0 -23 53 -40 29 -23 l 0 -68 b 36 -92 23 -68 32 -82 b 46 -154 42 -105 45 -131 l 89 -154 b 135 -68 89 -124 94 -68 b 160 -81 147 -68 148 -71 b 204 -132 168 -88 183 -112 b 269 -150 226 -153 252 -158 b 308 -92 289 -140 302 -127 b 338 -130 317 -104 325 -115 b 405 -150 356 -150 387 -158 b 449 -23 433 -135 449 -112 l 406 -23 b 387 -107 408 -86 399 -107 b 343 -65 376 -107 359 -86 b 314 -23 336 -55 314 -23 l 271 -23 b 249 -107 271 -86 262 -107 b 187 -45 228 -107 197 -55 b 135 -23 168 -26 156 -23 z',\n },\n accSagittal9TinasUp: {\n x_min: -7,\n x_max: 312,\n y_min: 16,\n y_max: 106.31676725154982,\n ha: 90.31676725154982,\n o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 207 65 179 23 200 55 b 252 107 223 86 240 107 b 271 23 264 107 272 86 l 314 23 b 343 65 314 23 336 55 b 387 107 359 86 376 107 b 406 23 399 107 408 86 l 449 23 b 405 150 449 112 433 135 b 338 130 387 158 356 150 b 308 92 325 115 317 104 b 269 150 302 127 289 140 b 203 130 252 158 220 150 b 173 92 190 115 181 104 b 134 150 167 127 154 140 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z',\n },\n accSagittal9TinasDown: {\n x_min: -7,\n x_max: 312,\n y_min: -106.31676725154983,\n y_max: -16,\n ha: 90.31676725154983,\n o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 173 -92 154 -140 167 -127 b 203 -130 181 -104 190 -115 b 269 -150 220 -150 252 -158 b 308 -92 289 -140 302 -127 b 338 -130 317 -104 325 -115 b 405 -150 356 -150 387 -158 b 449 -23 433 -135 449 -112 l 406 -23 b 387 -107 408 -86 399 -107 b 343 -65 376 -107 359 -86 b 314 -23 336 -55 314 -23 l 271 -23 b 252 -107 272 -86 264 -107 b 207 -65 240 -107 223 -86 b 179 -23 200 -55 179 -23 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z',\n },\n accSagittalFractionalTinaUp: {\n x_min: -3,\n x_max: 35,\n y_min: 73,\n y_max: 111,\n ha: 38,\n o: 'm -4 132 b 23 105 -4 118 9 105 b 50 132 37 105 50 118 b 23 160 50 147 37 160 b -4 132 9 160 -4 147 z',\n },\n accSagittalFractionalTinaDown: {\n x_min: -3,\n x_max: 35,\n y_min: -111,\n y_max: -73,\n ha: 38,\n o: 'm -4 -132 b 23 -160 -4 -147 9 -160 b 50 -132 37 -160 50 -147 b 23 -105 50 -118 37 -105 b -4 -132 9 -105 -4 -118 z',\n },\n accidentalNarrowReversedFlat: {\n x_min: 0,\n x_max: 164,\n y_min: -194,\n y_max: 421,\n ha: 615,\n o: 'm 236 -279 l 236 606 l 192 606 l 192 179 b 85 243 150 222 114 243 b 0 84 23 243 0 134 b 112 -158 0 3 37 -78 z m 192 112 l 192 -163 l 135 -98 b 82 40 101 -50 82 -3 b 138 144 82 73 96 144 b 192 112 153 144 170 132 z',\n },\n accidentalNarrowReversedFlatAndFlat: {\n x_min: 0,\n x_max: 414,\n y_min: -194,\n y_max: 421,\n ha: 615,\n o: 'm 281 606 l 281 -268 l 438 -158 b 596 84 547 -82 596 3 b 475 243 596 154 556 243 b 325 179 435 243 384 222 l 325 606 z m 235 -279 l 235 606 l 190 606 l 190 179 b 85 243 148 222 114 243 b 12 158 52 243 27 215 b 0 84 3 134 0 108 b 112 -158 0 3 37 -78 z m 325 111 b 410 144 359 132 386 144 b 498 36 462 144 498 84 b 413 -107 498 -9 469 -58 l 325 -173 z m 192 112 l 192 -163 l 135 -98 b 81 40 99 -50 81 -3 b 91 94 81 59 84 76 b 137 144 102 127 118 144 b 192 112 153 144 170 132 z',\n },\n accidentalWilsonPlus: {\n x_min: 0,\n x_max: 281,\n y_min: -203,\n y_max: 203,\n ha: 406,\n o: 'm 405 268 l 225 98 l 225 292 l 180 292 l 180 56 l 0 -112 l 0 -268 l 180 -98 l 180 -292 l 225 -292 l 225 -56 l 405 112 z',\n },\n accidentalWilsonMinus: {\n x_min: 0,\n x_max: 281,\n y_min: -186,\n y_max: 186,\n ha: 372,\n o: 'm 0 112 l 405 -268 l 405 -112 l 0 268 z',\n },\n },\n fontFamily: 'Bravura',\n resolution: 1000,\n generatedOn: '2021-12-06T21:04:30.234Z',\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// This entry file will be exported as a font module that can be dynamically loaded by vexflow-core.js.\n// Search for 'vexflow-font-bravura' in Gruntfile.js.\n// ADD_MUSIC_FONT\n// To add a new music engraving font named XXX, make a copy of this file and name it vexflow-font-xxx.ts.\n// Then you will need to import the xxx_glyphs.ts and xxx_metrics.ts files.\nimport { BravuraFont } from '../src/fonts/bravura_glyphs';\nimport { BravuraMetrics } from '../src/fonts/bravura_metrics';\nexport const Font = {\n data: BravuraFont,\n metrics: BravuraMetrics,\n};\nexport default Font;\n","/**\n * The Bravura font was created by Daniel Spreadbury @ Steinberg.\n * https://github.com/steinbergmedia/bravura/\n */\nexport const BravuraMetrics = {\n name: 'Bravura',\n smufl: true,\n stave: {\n padding: 12,\n endPaddingMax: 10,\n endPaddingMin: 5,\n unalignedNotePadding: 10,\n },\n accidental: {\n noteheadAccidentalPadding: 1,\n leftPadding: 2,\n accidentalSpacing: 3,\n },\n clef: {\n default: {\n point: 32,\n width: 26,\n },\n small: {\n point: 26,\n width: 20,\n },\n annotations: {\n '8va': {\n smuflCode: 'timeSig8',\n default: {\n point: 18,\n treble: {\n line: -1.4,\n shiftX: 12,\n },\n },\n small: {\n point: 16,\n treble: {\n line: -0.2,\n shiftX: 8,\n },\n },\n },\n '8vb': {\n smuflCode: 'timeSig8',\n default: {\n point: 18,\n treble: {\n line: 6,\n shiftX: 10,\n },\n bass: {\n line: 3.5,\n shiftX: 1,\n },\n },\n small: {\n point: 16,\n treble: {\n line: 5.3,\n shiftX: 6,\n },\n bass: {\n line: 3.1,\n shiftX: 0.5,\n },\n },\n },\n },\n // These may no longer be necessary\n lineCount: {\n '8': { point: 55, shiftY: 14 },\n '7': { point: 47, shiftY: 8 },\n '6': { point: 32, shiftY: 1 },\n '5': { point: 30, shiftY: -6 },\n '4': { point: 23, shiftY: -12 },\n },\n },\n parenthesis: {\n default: {\n point: 39,\n width: 7,\n },\n gracenote: {\n point: (39 * 3) / 5,\n width: 3,\n },\n },\n pedalMarking: {\n up: {\n point: 40,\n },\n down: {\n point: 34,\n },\n },\n // These are for numeric digits, such as in time signatures\n digits: {\n // used by timesig\n shiftLine: -1,\n point: 34,\n // used by tuplets\n tupletPoint: 22,\n shiftY: -6,\n },\n articulation: {\n articStaccatissimoAbove: {\n padding: 2,\n },\n articStaccatissimoBelow: {\n padding: 2,\n },\n },\n tremolo: {\n default: {\n point: 25,\n spacing: 5,\n offsetYStemUp: -5,\n offsetYStemDown: 5,\n offsetXStemUp: 11,\n offsetXStemDown: 1,\n },\n grace: {\n point: 18,\n spacing: 4,\n offsetYStemUp: -5,\n offsetYStemDown: 5,\n offsetXStemUp: 7,\n offsetXStemDown: 1,\n },\n },\n staveRepetition: {\n default: {\n offsetY: 25,\n offsetSymbol: 12,\n spacing: 5,\n },\n },\n // noteHead: {\n // },\n stem: {\n heightAdjustmentForFlag: -3,\n // These are stem (Y) offsets to the note heads. To shift the\n // noteheads (x-position) themselves, see glyphs.notehead.custom.\n noteHead: {\n noteheadTriangleUpHalf: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpBlack: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpWhole: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadXHalf: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXBlack: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXWhole: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadHalf: {\n offsetYBaseStemUp: -2.55,\n offsetYBaseStemDown: 2.65,\n },\n noteheadBlack: {\n offsetYBaseStemUp: -2,\n offsetYBaseStemDown: 2,\n },\n noteheadSquareWhite: {\n offsetYBaseStemDown: -5,\n offsetYBaseStemUp: 5,\n },\n },\n },\n // Values under here are used by the Glyph class to reposition and rescale\n // glyphs based on their category. This should be the first stop for\n // custom font glyph repositioning.\n //\n // The glyph loader first looks up a specific set of settings based on the\n // glyph code, and if not found, uses the defaults from the category. See\n // glyphs.textNote for an example of this.\n //\n // Details in Glyph.lookupFontMetrics.\n glyphs: {\n coda: {\n point: 20,\n shiftX: -7,\n shiftY: 8,\n },\n segno: {\n shiftX: -7,\n },\n flag: {\n shiftX: -0.75,\n tabStem: {\n shiftX: -1.75,\n },\n staveTempo: {\n shiftX: -1,\n },\n },\n clef: {\n gClef: {\n default: { scale: 1.1, shiftY: 1 },\n small: { shiftY: 1.5 },\n },\n fClef: {\n default: { shiftY: -0.5 },\n },\n },\n ornament: {\n ornamentTurn: {\n scale: 1.2,\n },\n ornamentTurnSlash: {\n scale: 1.2,\n },\n },\n stringNumber: {\n verticalPadding: 8,\n stemPadding: 2,\n leftPadding: 5,\n rightPadding: 6,\n },\n stroke: {\n arrowheadBlackDown: {\n straight: {\n shiftX: -4.5,\n },\n wiggly: {\n shiftX: -1,\n shiftY: 1,\n },\n },\n arrowheadBlackUp: {\n straight: {\n shiftX: -0.85,\n },\n wiggly: {\n shiftX: -1,\n shiftY: 1,\n },\n },\n },\n textNote: {\n point: 34,\n breathMarkTick: {\n point: 36,\n shiftY: 9,\n },\n breathMarkComma: {\n point: 36,\n },\n segno: {\n point: 30,\n shiftX: -7,\n shiftY: 8,\n },\n coda: {\n point: 20,\n shiftX: -7,\n shiftY: 8,\n },\n ornamentTrill: {\n shiftX: -8,\n shiftY: 8,\n },\n ornamentTurn: {\n point: 42,\n },\n ornamentTurnSlash: {\n point: 42,\n },\n ornamentMordent: {\n shiftX: -8,\n },\n ornamentShortTrill: {\n shiftX: -8,\n },\n },\n noteHead: {\n minPadding: 2,\n standard: {\n restQuarterStemUp: {\n point: 35,\n },\n restQuarterStemDown: {\n point: 35,\n },\n },\n custom: {\n noteheadCircleXStemUp: {\n shiftX: 1.5,\n },\n noteheadCircleXStemDown: {\n shiftX: 0.25,\n },\n noteheadDiamondHalfStemUp: {\n shiftX: 1.5,\n },\n noteheadDiamondBlackStemUp: {\n shiftX: 1.5,\n },\n noteheadDiamondWholeStemUp: {\n shiftX: 1,\n },\n noteheadXHalfStemUp: {\n shiftX: -2,\n },\n noteheadXHalfStemDown: {\n shiftX: 1,\n },\n noteheadXWholeStemUp: {\n shiftX: -4,\n },\n noteheadXWholeStemDown: {\n shiftX: 1,\n },\n noteheadSquareWhiteStemDown: {\n shiftX: 0.25,\n },\n noteheadSquareWhiteStemUp: {\n shiftX: -0.75,\n },\n noteheadSquareBlackStemUp: {\n shiftX: -0.75,\n },\n noteheadTriangleUpWholeStemUp: {\n shiftX: -0.75,\n },\n },\n },\n chordSymbol: {\n global: {\n superscriptOffset: -400,\n subscriptOffset: 300,\n kerningOffset: -250,\n lowerKerningText: ['D', 'F', 'P', 'T', 'V', 'Y'],\n upperKerningText: ['A', 'L'],\n spacing: 100,\n superSubRatio: 0.66,\n },\n csymDiminished: {\n scale: 0.8,\n leftSideBearing: -32,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymHalfDiminished: {\n scale: 0.8,\n leftSideBearing: -32,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymAugmented: {\n scale: 1,\n leftSideBearing: 0,\n advanceWidth: 530,\n yOffset: 0,\n },\n csymParensLeftTall: {\n scale: 0.8,\n leftSideBearing: -20,\n advanceWidth: 184,\n yOffset: 250,\n },\n csymParensRightTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 189,\n yOffset: 250,\n },\n csymBracketLeftTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 328,\n yOffset: 0,\n },\n csymBracketRightTall: {\n scale: 0.8,\n leftSideBearing: 1,\n advanceWidth: 600,\n yOffset: 0,\n },\n csymParensLeftVeryTall: {\n scale: 0.9,\n leftSideBearing: 50,\n advanceWidth: 121,\n yOffset: 350,\n },\n csymParensRightVeryTall: {\n scale: 0.9,\n leftSideBearing: 0,\n advanceWidth: 111,\n yOffset: 350,\n },\n csymDiagonalArrangementSlash: {\n scale: 0.6,\n leftSideBearing: -1,\n advanceWidth: 990,\n yOffset: 0,\n },\n csymMinor: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 482,\n yOffset: 0,\n },\n csymMajorSeventh: {\n scale: 0.9,\n leftSideBearing: 200,\n yOffset: 0,\n advanceWidth: 600,\n },\n accidentalSharp: {\n scale: 0.75,\n leftSideBearing: 20,\n advanceWidth: 250,\n yOffset: -302,\n },\n accidentalFlat: {\n scale: 0.9,\n leftSideBearing: -20,\n advanceWidth: 226,\n yOffset: -184,\n },\n },\n jazzOrnaments: {\n brassScoop: {\n scale: 1.0,\n xOffset: -12,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 10,\n },\n brassDoitMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 15,\n },\n brassFallLipShort: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassLiftMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 5,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassFallRoughMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 28,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassBend: {\n scale: 1.0,\n xOffset: 2,\n yOffset: -8,\n stemUpYOffset: 25,\n reportedWidth: 5,\n },\n brassMuteClosed: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -8,\n stemUpYOffset: 25,\n reportedWidth: 5,\n },\n brassMuteOpen: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -7,\n stemUpYOffset: 25,\n reportedWidth: 5,\n },\n brassFlip: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassJazzTurn: {\n scale: 1.0,\n xOffset: 6,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassSmear: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n },\n tuplet: {\n noteHeadOffset: 20,\n stemOffset: 10,\n bottomLine: 4,\n topModifierOffset: 15,\n },\n },\n};\n"],"names":["root","factory","exports","module","define","amd","window","globalThis","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","data","glyphs","bracketTop","x_min","x_max","y_min","y_max","ha","bracketBottom","barlineTick","breathMarkTick","segno","coda","gClef","cClef","fClef","unpitchedPercussionClef1","timeSig0","timeSig1","timeSig2","timeSig3","timeSig4","timeSig5","timeSig6","timeSig7","timeSig8","timeSig9","timeSigCommon","timeSigCutCommon","timeSigPlus","timeSigPlusSmall","timeSigMinus","timeSigParensRight","timeSigParensRightSmall","timeSigParensLeft","timeSigParensLeftSmall","noteheadDoubleWhole","noteheadWhole","noteheadHalf","noteheadBlack","noteheadXWhole","noteheadXHalf","noteheadXBlack","noteheadCircleX","noteheadTriangleUpWhole","noteheadTriangleUpHalf","noteheadTriangleUpBlack","noteheadDiamondWhole","noteheadDiamondHalf","noteheadDiamondBlack","noteheadSquareWhite","noteheadSquareBlack","noteheadParenthesis","noteheadParenthesisRight","noteheadParenthesisLeft","augmentationDot","tremolo1","flag8thUp","flag8thDown","flag16thUp","flag16thDown","flag32ndUp","flag32ndDown","flag64thUp","flag64thDown","flag128thUp","flag128thDown","accidentalFlat","accidentalNatural","accidentalSharp","accidentalDoubleSharp","accidentalDoubleFlat","accidentalParensLeft","accidentalParensRight","accidentalQuarterToneFlatStein","accidentalThreeQuarterTonesFlatZimmermann","accidentalQuarterToneSharpStein","accidentalThreeQuarterTonesSharpStein","accidentalBuyukMucennebFlat","accidentalBakiyeFlat","accidentalKomaSharp","accidentalKucukMucennebSharp","accidentalKoron","accidentalSori","articAccentAbove","articAccentBelow","articTenutoAbove","articTenutoBelow","articStaccatoAbove","articStaccatoBelow","articStaccatissimoAbove","articStaccatissimoBelow","articMarcatoAbove","articMarcatoBelow","fermataAbove","fermataBelow","breathMarkComma","breathMarkUpbow","caesura","caesuraCurved","restMaxima","restDoubleWhole","restWhole","restHalf","restQuarter","rest8th","rest16th","rest32nd","rest64th","rest128th","dynamicPiano","dynamicMezzo","dynamicForte","dynamicRinforzando","dynamicSforzando","dynamicZ","ornamentTrill","ornamentTurn","ornamentTurnSlash","ornamentMordent","ornamentShortTrill","ornamentTremblement","ornamentPrecompAppoggTrill","ornamentPrecompSlideTrillDAnglebert","ornamentPrecompSlideTrillBach","ornamentPrecompTrillSuffixDandrieu","ornamentPrecompDoubleCadenceUpperPrefix","ornamentPrecompDoubleCadenceUpperPrefixTurn","ornamentPrecompTrillLowerSuffix","brassScoop","brassDoitMedium","brassFallLipShort","brassLiftMedium","brassFallRoughMedium","brassBend","brassMuteClosed","brassMuteOpen","brassFlip","brassJazzTurn","brassSmear","stringsDownBow","stringsUpBow","stringsHarmonic","pluckedSnapPizzicatoAbove","pluckedSnapPizzicatoBelow","pluckedLeftHandPizzicato","keyboardPedalPed","keyboardPedalUp","pictChokeCymbal","wiggleArpeggiatoUp","arrowheadBlackUp","arrowheadBlackDown","arpeggiatoUp","arpeggiatoDown","repeat1Bar","repeat2Bars","repeat4Bars","repeatBarSlash","csymDiminished","csymHalfDiminished","csymAugmented","csymMajorSeventh","csymMinor","csymParensLeftTall","csymParensRightTall","csymBracketLeftTall","csymBracketRightTall","csymParensLeftVeryTall","csymParensRightVeryTall","csymDiagonalArrangementSlash","accSagittal5v7KleismaUp","accSagittal5v7KleismaDown","accSagittal5CommaUp","accSagittal5CommaDown","accSagittal7CommaUp","accSagittal7CommaDown","accSagittal25SmallDiesisUp","accSagittal25SmallDiesisDown","accSagittal35MediumDiesisUp","accSagittal35MediumDiesisDown","accSagittal11MediumDiesisUp","accSagittal11MediumDiesisDown","accSagittal11LargeDiesisUp","accSagittal11LargeDiesisDown","accSagittal35LargeDiesisUp","accSagittal35LargeDiesisDown","accSagittalSharp25SDown","accSagittalFlat25SUp","accSagittalSharp7CDown","accSagittalFlat7CUp","accSagittalSharp5CDown","accSagittalFlat5CUp","accSagittalSharp5v7kDown","accSagittalFlat5v7kUp","accSagittalSharp","accSagittalFlat","accSagittalSharp5v7kUp","accSagittalFlat5v7kDown","accSagittalSharp5CUp","accSagittalFlat5CDown","accSagittalSharp7CUp","accSagittalFlat7CDown","accSagittalSharp25SUp","accSagittalFlat25SDown","accSagittalSharp35MUp","accSagittalFlat35MDown","accSagittalSharp11MUp","accSagittalFlat11MDown","accSagittalSharp11LUp","accSagittalFlat11LDown","accSagittalSharp35LUp","accSagittalFlat35LDown","accSagittalDoubleSharp25SDown","accSagittalDoubleFlat25SUp","accSagittalDoubleSharp7CDown","accSagittalDoubleFlat7CUp","accSagittalDoubleSharp5CDown","accSagittalDoubleFlat5CUp","accSagittalDoubleSharp5v7kDown","accSagittalDoubleFlat5v7kUp","accSagittalDoubleSharp","accSagittalDoubleFlat","accSagittal7v11KleismaUp","accSagittal7v11KleismaDown","accSagittal17CommaUp","accSagittal17CommaDown","accSagittal55CommaUp","accSagittal55CommaDown","accSagittal7v11CommaUp","accSagittal7v11CommaDown","accSagittal5v11SmallDiesisUp","accSagittal5v11SmallDiesisDown","accSagittalSharp5v11SDown","accSagittalFlat5v11SUp","accSagittalSharp7v11CDown","accSagittalFlat7v11CUp","accSagittalSharp55CDown","accSagittalFlat55CUp","accSagittalSharp17CDown","accSagittalFlat17CUp","accSagittalSharp7v11kDown","accSagittalFlat7v11kUp","accSagittalSharp7v11kUp","accSagittalFlat7v11kDown","accSagittalSharp17CUp","accSagittalFlat17CDown","accSagittalSharp55CUp","accSagittalFlat55CDown","accSagittalSharp7v11CUp","accSagittalFlat7v11CDown","accSagittalSharp5v11SUp","accSagittalFlat5v11SDown","accSagittalDoubleSharp5v11SDown","accSagittalDoubleFlat5v11SUp","accSagittalDoubleSharp7v11CDown","accSagittalDoubleFlat7v11CUp","accSagittalDoubleSharp55CDown","accSagittalDoubleFlat55CUp","accSagittalDoubleSharp17CDown","accSagittalDoubleFlat17CUp","accSagittalDoubleSharp7v11kDown","accSagittalDoubleFlat7v11kUp","accSagittal23CommaUp","accSagittal23CommaDown","accSagittal5v19CommaUp","accSagittal5v19CommaDown","accSagittal5v23SmallDiesisUp","accSagittal5v23SmallDiesisDown","accSagittalSharp5v23SDown","accSagittalFlat5v23SUp","accSagittalSharp5v19CDown","accSagittalFlat5v19CUp","accSagittalSharp23CDown","accSagittalFlat23CUp","accSagittalSharp23CUp","accSagittalFlat23CDown","accSagittalSharp5v19CUp","accSagittalFlat5v19CDown","accSagittalSharp5v23SUp","accSagittalFlat5v23SDown","accSagittalDoubleSharp5v23SDown","accSagittalDoubleFlat5v23SUp","accSagittalDoubleSharp5v19CDown","accSagittalDoubleFlat5v19CUp","accSagittalDoubleSharp23CDown","accSagittalDoubleFlat23CUp","accSagittal19SchismaUp","accSagittal19SchismaDown","accSagittal17KleismaUp","accSagittal17KleismaDown","accSagittal143CommaUp","accSagittal143CommaDown","accSagittal11v49CommaUp","accSagittal11v49CommaDown","accSagittal19CommaUp","accSagittal19CommaDown","accSagittal7v19CommaUp","accSagittal7v19CommaDown","accSagittal49SmallDiesisUp","accSagittal49SmallDiesisDown","accSagittal23SmallDiesisUp","accSagittal23SmallDiesisDown","accSagittal5v13MediumDiesisUp","accSagittal5v13MediumDiesisDown","accSagittal11v19MediumDiesisUp","accSagittal11v19MediumDiesisDown","accSagittal49MediumDiesisUp","accSagittal49MediumDiesisDown","accSagittal5v49MediumDiesisUp","accSagittal5v49MediumDiesisDown","accSagittal49LargeDiesisUp","accSagittal49LargeDiesisDown","accSagittal11v19LargeDiesisUp","accSagittal11v19LargeDiesisDown","accSagittal5v13LargeDiesisUp","accSagittal5v13LargeDiesisDown","accSagittalSharp23SDown","accSagittalFlat23SUp","accSagittalSharp49SDown","accSagittalFlat49SUp","accSagittalSharp7v19CDown","accSagittalFlat7v19CUp","accSagittalSharp19CDown","accSagittalFlat19CUp","accSagittalSharp11v49CDown","accSagittalFlat11v49CUp","accSagittalSharp143CDown","accSagittalFlat143CUp","accSagittalSharp17kDown","accSagittalFlat17kUp","accSagittalSharp19sDown","accSagittalFlat19sUp","accSagittalSharp19sUp","accSagittalFlat19sDown","accSagittalSharp17kUp","accSagittalFlat17kDown","accSagittalSharp143CUp","accSagittalFlat143CDown","accSagittalSharp11v49CUp","accSagittalFlat11v49CDown","accSagittalSharp19CUp","accSagittalFlat19CDown","accSagittalSharp7v19CUp","accSagittalFlat7v19CDown","accSagittalSharp49SUp","accSagittalFlat49SDown","accSagittalSharp23SUp","accSagittalFlat23SDown","accSagittalSharp5v13MUp","accSagittalFlat5v13MDown","accSagittalSharp11v19MUp","accSagittalFlat11v19MDown","accSagittalSharp49MUp","accSagittalFlat49MDown","accSagittalSharp5v49MUp","accSagittalFlat5v49MDown","accSagittalSharp49LUp","accSagittalFlat49LDown","accSagittalSharp11v19LUp","accSagittalFlat11v19LDown","accSagittalSharp5v13LUp","accSagittalFlat5v13LDown","accSagittalDoubleSharp23SDown","accSagittalDoubleFlat23SUp","accSagittalDoubleSharp49SDown","accSagittalDoubleFlat49SUp","accSagittalDoubleSharp7v19CDown","accSagittalDoubleFlat7v19CUp","accSagittalDoubleSharp19CDown","accSagittalDoubleFlat19CUp","accSagittalDoubleSharp11v49CDown","accSagittalDoubleFlat11v49CUp","accSagittalDoubleSharp143CDown","accSagittalDoubleFlat143CUp","accSagittalDoubleSharp17kDown","accSagittalDoubleFlat17kUp","accSagittalDoubleSharp19sDown","accSagittalDoubleFlat19sUp","accSagittalShaftUp","accSagittalShaftDown","accSagittalAcute","accSagittalGrave","accSagittal1MinaUp","accSagittal1MinaDown","accSagittal2MinasUp","accSagittal2MinasDown","accSagittal1TinaUp","accSagittal1TinaDown","accSagittal2TinasUp","accSagittal2TinasDown","accSagittal3TinasUp","accSagittal3TinasDown","accSagittal4TinasUp","accSagittal4TinasDown","accSagittal5TinasUp","accSagittal5TinasDown","accSagittal6TinasUp","accSagittal6TinasDown","accSagittal7TinasUp","accSagittal7TinasDown","accSagittal8TinasUp","accSagittal8TinasDown","accSagittal9TinasUp","accSagittal9TinasDown","accSagittalFractionalTinaUp","accSagittalFractionalTinaDown","accidentalNarrowReversedFlat","accidentalNarrowReversedFlatAndFlat","accidentalWilsonPlus","accidentalWilsonMinus","fontFamily","resolution","generatedOn","metrics","name","smufl","stave","padding","endPaddingMax","endPaddingMin","unalignedNotePadding","accidental","noteheadAccidentalPadding","leftPadding","accidentalSpacing","clef","default","point","width","small","annotations","smuflCode","treble","line","shiftX","bass","lineCount","shiftY","parenthesis","gracenote","pedalMarking","up","down","digits","shiftLine","tupletPoint","articulation","tremolo","spacing","offsetYStemUp","offsetYStemDown","offsetXStemUp","offsetXStemDown","grace","staveRepetition","offsetY","offsetSymbol","stem","heightAdjustmentForFlag","noteHead","offsetYBaseStemUp","offsetYBaseStemDown","flag","tabStem","staveTempo","scale","ornament","stringNumber","verticalPadding","stemPadding","rightPadding","stroke","straight","wiggly","textNote","minPadding","standard","restQuarterStemUp","restQuarterStemDown","custom","noteheadCircleXStemUp","noteheadCircleXStemDown","noteheadDiamondHalfStemUp","noteheadDiamondBlackStemUp","noteheadDiamondWholeStemUp","noteheadXHalfStemUp","noteheadXHalfStemDown","noteheadXWholeStemUp","noteheadXWholeStemDown","noteheadSquareWhiteStemDown","noteheadSquareWhiteStemUp","noteheadSquareBlackStemUp","noteheadTriangleUpWholeStemUp","chordSymbol","global","superscriptOffset","subscriptOffset","kerningOffset","lowerKerningText","upperKerningText","superSubRatio","leftSideBearing","advanceWidth","yOffset","jazzOrnaments","xOffset","stemUpYOffset","reportedWidth","tuplet","noteHeadOffset","stemOffset","bottomLine","topModifierOffset"],"sourceRoot":""} \ No newline at end of file diff --git a/build/cjs/vexflow-font-custom.js b/build/cjs/vexflow-font-custom.js new file mode 100644 index 0000000000..3027b2a1ec --- /dev/null +++ b/build/cjs/vexflow-font-custom.js @@ -0,0 +1,2 @@ +!function(b,l){"object"==typeof exports&&"object"==typeof module?module.exports=l():"function"==typeof define&&define.amd?define([],l):"object"==typeof exports?exports.VexFlowFont=l():(b.VexFlowFont=b.VexFlowFont||{},b.VexFlowFont.Custom=l())}("undefined"!=typeof window?window:"undefined"!=typeof globalThis?globalThis:this,(function(){return(()=>{"use strict";var b={d:(l,e)=>{for(var o in e)b.o(e,o)&&!b.o(l,o)&&Object.defineProperty(l,o,{enumerable:!0,get:e[o]})},o:(b,l)=>Object.prototype.hasOwnProperty.call(b,l)},l={};b.d(l,{default:()=>e});const e={data:{resolution:1e3,fontFamily:"VexFlowCustom",glyphs:{noteheadSquareWhite:{x_min:0,x_max:430.75,ha:386,o:"m 0 200 l 0 -200 l 430 -200 l 430 200 l 0 200 l 50 150 l 380 150 l 380 -150 l 50 -150 l 50 150 "},noteheadSquareBlack:{x_min:0,x_max:430.75,ha:386,o:"m 0 200 l 0 -200 l 430 -200 l 430 200 l 0 200 "},accidentalBuyukMucennebFlat:{x_min:-171.5,x_max:251.8125,ha:257,o:"m -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 553 20 616 20 614 b 20 491 20 503 20 491 l 20 491 b 153 535 47 501 149 535 b 174 514 167 535 174 524 b 164 496 174 508 171 501 b 92 470 164 495 132 484 l 20 445 l 20 390 b 20 363 20 378 20 370 b 20 333 20 340 20 333 l 20 333 b 153 377 47 344 149 377 b 174 356 167 377 174 367 b 164 338 174 349 171 342 b 92 312 164 338 132 326 l 20 288 l 20 219 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 30 -21 -212 -21 -212 b -21 273 -21 163 -21 273 b -84 252 -21 273 -50 263 b -152 230 -133 234 -145 230 b -157 231 -155 230 -156 231 b -171 252 -166 234 -171 244 b -160 270 -171 259 -167 266 b -27 316 -159 270 -93 294 l -21 319 l -21 374 b -21 431 -21 406 -21 431 b -84 409 -21 431 -50 421 b -152 388 -133 392 -145 388 b -157 390 -155 388 -156 388 b -171 409 -166 392 -171 401 b -160 428 -171 417 -167 424 b -27 474 -159 428 -93 451 l -21 476 l -21 546 b -20 620 -21 614 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 "},accidentalBakiyeFlat:{x_min:-176.9375,x_max:251.8125,ha:257,o:"m -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 503 20 616 20 614 b 20 391 20 442 20 391 b 84 424 20 391 49 406 l 147 456 l 152 456 b 153 456 153 456 153 456 b 175 435 166 456 175 446 b 172 427 175 433 174 430 b 92 380 170 420 172 421 l 20 342 l 20 245 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 54 -21 -212 -21 -212 b -21 322 -21 201 -21 322 b -85 290 -21 322 -50 308 l -148 256 l -153 256 b -155 256 -155 256 -155 256 b -176 277 -167 256 -176 266 b -174 285 -176 280 -175 283 b -93 333 -171 294 -174 292 l -21 370 l -21 494 b -20 620 -21 616 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 "},accidentalKucukMucennebSharp:{x_min:-1.359375,x_max:255.890625,ha:261,o:"m 118 514 b 127 517 121 517 122 517 b 147 505 136 517 142 513 l 148 502 l 148 403 b 148 306 148 351 148 306 b 174 315 149 306 160 310 l 200 324 l 205 323 b 223 312 213 323 220 319 l 225 308 l 225 260 b 225 245 225 255 225 249 b 220 204 225 208 224 209 b 179 188 216 199 215 199 l 148 177 l 148 124 l 148 70 l 189 84 b 236 98 219 94 230 98 b 247 94 240 98 243 97 b 255 52 254 88 255 87 b 255 33 255 47 255 40 l 254 -12 l 253 -15 b 249 -22 253 -18 250 -20 l 245 -24 l 196 -41 l 148 -58 l 148 -108 b 148 -158 148 -136 148 -158 b 174 -148 148 -158 160 -154 b 204 -140 198 -140 200 -140 l 204 -140 b 224 -152 213 -140 221 -145 b 225 -201 224 -155 225 -177 b 224 -254 225 -226 224 -251 b 157 -284 220 -262 220 -262 l 148 -288 l 148 -395 l 148 -503 l 147 -506 b 127 -519 142 -514 134 -519 b 107 -506 119 -519 111 -514 l 106 -503 l 106 -403 b 106 -303 106 -316 106 -303 b 104 -303 104 -303 104 -303 b 88 -310 104 -303 96 -306 l 63 -319 b 51 -322 59 -320 55 -322 b 36 -315 46 -322 40 -319 b 31 -273 32 -309 31 -312 b 31 -258 31 -269 31 -263 l 31 -210 l 34 -206 b 40 -198 35 -204 38 -199 b 74 -186 42 -197 57 -191 l 106 -173 l 106 -123 b 106 -97 106 -112 106 -104 b 106 -72 106 -76 106 -72 b 104 -72 106 -72 106 -72 b 20 -99 89 -79 23 -99 b 0 -84 10 -99 2 -93 b -1 -37 0 -81 -1 -59 b 0 11 -1 -15 0 9 b 58 40 4 22 2 22 l 106 56 l 106 109 b 106 123 106 115 106 119 b 106 162 106 147 106 162 b 81 155 106 162 93 159 b 50 147 65 149 55 147 b 36 152 43 147 40 148 b 31 194 32 158 31 156 b 31 209 31 198 31 204 l 31 256 l 34 260 b 76 281 38 269 38 269 l 106 292 l 106 396 l 106 502 l 107 505 b 118 514 110 509 114 513 "},accidentalKoron:{x_min:-20,x_max:320,ha:257,o:"m -8 200 b -8 210 8 200 16 200 l 20 148 -199 l 23 -615 b 0 -629 9 -629 6 -629 l -21 -612 l -21 -201 l -21 216 l -20 200 m 16 200 l 310 0 l 240 0 l 16 140 l 16 -120 l 240 0 l 310 0 l 16 -200 "},accidentalSori:{x_min:-10.890625,x_max:299.4375,ha:294,o:"m 44 174 b 51 174 47 174 49 174 b 68 173 55 174 61 174 l 287 112 l 551 40 b 615 20 617 22 609 23 b 626 0 622 16 626 8 b 615 -22 626 -9 622 -18 b 613 -23 613 -23 613 -23 b 613 -23 613 -23 613 -23 b 287 -113 613 -24 597 -29 l 68 -174 b 53 -176 61 -176 57 -176 b 39 -172 47 -176 43 -174 b 27 -151 31 -167 27 -159 b 39 -129 27 -141 31 -133 b 230 -74 43 -124 20 -131 l 370 -36 l 468 -9 b 498 0 484 -4 498 -1 b 468 8 498 0 484 2 l 370 34 l 230 73 b 40 126 28 129 43 124 b 27 149 31 131 27 140 b 44 174 27 161 34 170 m 205 110 l 205 300 b 205 330 245 330 245 300 l 245 300 l 245 -300 b 245 -330 205 -330 205 -300 l 205 -300 l 205 110 l 345 90 m 345 90 l 345 330 b 345 360 385 360 385 330 l 385 330 l 385 -270 b 385 -300 345 -300 345 -270 l 345 -270 l 345 90 "},vexAccidentalMicrotonal2:{x_min:-1.359375,x_max:386.5625,ha:394,o:"m 249 535 b 257 537 251 537 253 537 b 276 524 266 537 273 533 l 277 521 l 279 419 l 279 316 l 304 323 b 337 328 319 326 330 328 b 353 316 347 328 349 324 b 355 266 355 315 355 290 b 353 215 355 241 355 217 b 319 198 349 206 347 205 b 279 187 284 190 279 188 b 279 156 279 187 279 174 b 279 136 279 151 279 144 l 279 84 l 289 87 l 330 98 b 367 105 352 102 362 105 b 378 101 372 105 375 104 b 386 61 385 95 386 94 b 386 40 386 55 386 48 l 386 -5 l 385 -8 b 374 -19 383 -12 378 -18 b 291 -40 372 -19 347 -26 b 279 -43 284 -41 279 -43 b 279 -83 279 -43 279 -59 b 279 -95 279 -87 279 -91 l 279 -145 l 304 -140 b 337 -133 321 -136 330 -133 b 349 -140 343 -133 347 -136 b 355 -181 355 -145 355 -142 l 355 -197 l 355 -210 b 349 -252 355 -249 355 -247 b 300 -269 345 -258 347 -258 b 280 -274 291 -272 281 -273 l 279 -274 l 277 -378 l 277 -483 l 276 -487 b 257 -499 273 -495 265 -499 b 238 -487 249 -499 242 -495 l 236 -483 l 236 -384 l 236 -285 l 235 -285 l 212 -291 l 170 -301 b 148 -308 159 -305 148 -306 b 147 -415 147 -308 147 -313 l 147 -523 l 145 -526 b 126 -538 141 -534 133 -538 b 106 -526 118 -538 110 -534 l 104 -523 l 104 -420 b 103 -317 104 -326 104 -317 b 103 -317 103 -317 103 -317 b 50 -330 92 -322 54 -330 b 31 -317 42 -330 35 -326 b 29 -267 29 -315 29 -315 l 29 -219 l 32 -216 b 92 -192 36 -206 36 -206 l 104 -190 l 104 -138 b 103 -87 104 -91 104 -87 b 103 -87 103 -87 103 -87 b 88 -91 103 -87 96 -88 l 49 -101 b 17 -106 32 -105 23 -106 b 6 -102 13 -106 10 -105 b -1 -62 0 -97 -1 -95 b 0 -41 -1 -56 0 -49 l 0 4 l 1 6 b 10 16 2 11 6 15 b 91 37 12 18 38 24 l 104 41 l 104 93 b 103 144 104 140 104 144 b 103 144 103 144 103 144 b 50 131 92 141 54 131 b 31 144 42 131 35 137 b 29 195 29 147 29 148 l 29 242 l 32 245 b 92 269 36 255 36 255 l 104 273 l 104 377 l 104 481 l 106 485 b 126 498 110 492 118 498 b 134 495 129 498 132 496 b 145 485 138 494 142 489 l 147 481 l 147 383 l 147 283 l 152 284 b 190 294 155 285 171 290 l 230 303 l 236 305 l 236 413 l 236 521 l 238 524 b 249 535 240 528 243 533 m 236 126 b 235 177 236 154 236 177 l 235 177 b 213 172 235 177 225 174 l 170 161 b 147 155 157 158 147 155 b 147 124 147 155 147 142 b 147 102 147 117 147 111 l 147 52 l 153 54 l 228 72 l 236 74 l 236 126 m 236 -105 b 235 -54 236 -65 236 -54 l 235 -54 b 231 -55 235 -54 234 -54 b 172 -69 227 -55 204 -62 l 149 -76 l 147 -76 l 147 -127 l 147 -179 l 152 -177 b 190 -167 155 -177 171 -173 l 230 -158 l 236 -156 l 236 -105 "},vexAccidentalMicrotonal3:{x_min:0,x_max:430.75,ha:360,o:"m -146 537 b -138 538 -143 538 -141 538 b -118 525 -129 538 -121 533 b -117 390 -117 522 -117 521 b -115 259 -117 268 -117 259 b -115 259 -115 259 -115 259 b -59 272 -104 263 -62 272 b -39 259 -50 272 -42 267 b -37 209 -38 257 -37 233 b -39 159 -37 185 -38 162 b -85 138 -43 149 -44 149 l -117 131 l -117 21 b -115 -88 -117 -80 -117 -88 b -115 -88 -115 -88 -115 -88 b -59 -75 -104 -84 -62 -75 b -44 -81 -52 -75 -48 -77 b -38 -124 -38 -87 -38 -85 b -38 -138 -38 -124 -38 -138 b -38 -152 -38 -138 -38 -152 b -44 -195 -38 -191 -38 -190 b -85 -209 -48 -200 -48 -200 l -117 -217 l -117 -349 b -118 -486 -117 -481 -117 -482 b -138 -499 -121 -494 -129 -499 b -153 -493 -143 -499 -149 -497 b -159 -415 -158 -487 -159 -496 b -159 -355 -159 -398 -159 -379 b -159 -227 -159 -284 -159 -227 b -205 -238 -159 -227 -180 -232 b -250 -249 -230 -244 -250 -249 b -251 -386 -251 -249 -251 -311 b -252 -525 -251 -521 -251 -522 b -272 -538 -255 -534 -264 -538 b -287 -532 -277 -538 -283 -536 b -293 -452 -292 -527 -293 -536 b -293 -391 -293 -436 -293 -415 b -294 -260 -293 -269 -293 -260 b -294 -260 -294 -260 -294 -260 b -348 -272 -306 -264 -345 -272 b -368 -259 -357 -272 -365 -267 b -369 -209 -369 -257 -369 -233 b -368 -159 -369 -185 -369 -162 b -323 -139 -364 -149 -362 -148 l -293 -131 l -293 -22 b -294 87 -293 80 -293 87 b -294 87 -294 87 -294 87 b -348 75 -306 84 -345 75 b -368 88 -357 75 -365 80 b -369 138 -369 91 -369 114 b -368 188 -369 162 -369 186 b -323 209 -364 198 -362 199 l -293 216 l -293 349 b -292 486 -293 481 -293 482 b -272 499 -288 494 -280 499 b -257 493 -266 499 -261 497 b -251 414 -251 487 -251 496 b -251 354 -251 398 -251 378 b -251 226 -251 284 -251 226 b -205 238 -250 226 -230 231 b -159 249 -180 244 -159 249 b -159 385 -159 249 -159 310 b -157 525 -159 521 -159 522 b -146 537 -156 530 -151 535 z m -159 11 b -159 120 -159 98 -159 120 l -159 120 b -175 116 -160 120 -167 119 b -221 105 -184 114 -204 109 l -251 98 l -251 -12 b -251 -121 -251 -72 -251 -121 b -205 -110 -250 -121 -230 -116 b -159 -99 -180 -104 -159 -99 b -159 11 -159 -99 -159 -49 z m 89 517 b 97 519 92 518 94 519 b 117 505 106 519 114 513 b 119 376 119 502 119 501 l 119 249 l 145 258 b 176 267 169 266 172 267 b 177 267 176 267 177 267 b 196 255 186 267 192 263 l 197 252 l 197 205 b 197 181 197 195 197 187 b 193 149 197 153 197 153 b 152 131 190 144 187 143 l 119 120 l 119 10 b 119 -100 119 -62 119 -100 b 145 -91 120 -100 131 -96 b 173 -82 159 -86 171 -82 b 176 -81 174 -81 175 -81 b 196 -94 185 -81 193 -87 b 198 -151 197 -97 198 -125 b 197 -194 198 -172 197 -192 b 153 -218 193 -203 192 -204 l 119 -230 l 119 -367 l 118 -504 l 117 -507 b 97 -519 113 -514 105 -519 b 82 -512 92 -519 87 -517 b 76 -434 77 -507 76 -516 b 76 -374 76 -418 76 -398 b 76 -245 76 -303 76 -245 b 52 -254 76 -245 65 -249 b 19 -263 34 -260 25 -263 b 6 -257 13 -263 10 -261 b 0 -214 0 -251 0 -253 b 0 -200 0 -210 0 -205 b 0 -188 0 -196 0 -192 b 6 -143 0 -147 0 -149 b 46 -126 10 -139 10 -139 l 76 -115 l 76 -5 b 76 106 76 56 76 106 b 51 98 76 106 64 102 b 18 89 34 92 25 89 b 6 95 13 89 10 91 b 0 139 0 101 0 99 b 0 153 0 143 0 148 b 0 179 0 163 0 172 b 44 225 0 215 3 211 l 76 236 l 76 369 b 78 505 76 501 76 502 b 89 517 80 510 85 515 z "},vexAccidentalMicrotonal4:{x_min:0,x_max:430.75,ha:360,o:"m 283 633 b 291 634 286 634 289 634 b 311 621 300 634 308 629 b 313 505 313 618 313 617 b 313 393 313 443 313 393 b 378 425 313 393 343 407 l 443 458 l 448 458 b 449 458 449 458 449 458 b 471 437 462 458 471 448 b 469 429 471 434 470 432 b 387 382 466 421 469 423 l 313 344 l 313 247 l 313 150 l 315 152 b 433 201 353 184 394 201 b 479 193 448 201 464 198 b 549 86 524 177 549 135 b 526 1 549 59 541 29 b 395 -143 504 -39 475 -71 b 316 -214 351 -182 341 -191 b 292 -229 302 -228 300 -229 b 272 -216 283 -229 275 -224 b 271 55 271 -212 271 -212 b 270 323 271 203 270 323 b 205 291 270 323 241 308 l 140 258 l 135 258 b 134 258 135 258 134 258 b 112 279 121 258 112 267 b 114 287 112 281 113 284 b 196 334 117 295 114 293 l 271 371 l 271 495 b 272 621 271 617 271 618 b 283 633 274 626 279 631 z m 404 133 b 391 134 400 134 395 134 b 384 134 388 134 386 134 b 318 88 358 130 335 114 l 313 81 l 313 -37 l 313 -156 l 316 -152 b 439 83 391 -71 439 22 l 439 84 b 404 133 439 115 430 128 z m -8 633 l -8 633 b 0 634 -6 634 -3 634 b 20 621 8 634 17 629 b 21 384 21 618 21 617 l 21 150 l 24 152 b 141 201 62 184 102 201 b 187 193 157 201 172 198 b 257 86 232 177 257 135 b 234 1 257 59 250 29 b 103 -143 212 -39 183 -71 b 24 -214 60 -182 49 -191 b 0 -229 10 -228 8 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 203 l -21 618 l -20 621 b -8 633 -18 626 -13 631 z m 113 133 l 113 133 b 99 134 109 134 103 134 b 93 134 97 134 94 134 b 26 88 66 130 43 114 l 21 81 l 21 -37 l 21 -156 l 25 -152 b 148 83 99 -71 148 22 l 148 84 b 113 133 148 115 138 128 z "},vexNoteHeadRectBlack:{x_min:0,x_max:430.75,ha:360,o:"m 0 150 l 0 -150 l 430 -150 l 430 150 l 0 150 "},vexNoteHeadRectWhite:{x_min:0,x_max:430.75,ha:360,o:"m 0 150 l 0 -150 l 430 -150 l 430 150 l 0 150 l 50 100 l 380 100 l 380 -100 l 50 -100 l 50 100"}}},metrics:{name:"VexFlowCustom",smufl:!1,glyphs:{}}};return l=l.default})()})); +//# sourceMappingURL=vexflow-font-custom.js.map \ No newline at end of file diff --git a/build/cjs/vexflow-font-custom.js.map b/build/cjs/vexflow-font-custom.js.map new file mode 100644 index 0000000000..43527eb659 --- /dev/null +++ b/build/cjs/vexflow-font-custom.js.map @@ -0,0 +1 @@ +{"version":3,"file":"vexflow-font-custom.js","mappings":"CAAA,SAA2CA,EAAMC,GAC1B,iBAAZC,SAA0C,iBAAXC,OACxCA,OAAOD,QAAUD,IACQ,mBAAXG,QAAyBA,OAAOC,IAC9CD,OAAO,GAAIH,GACe,iBAAZC,QACdA,QAAqB,YAAID,KAEzBD,EAAkB,YAAIA,EAAkB,aAAK,GAAIA,EAAkB,YAAU,OAAIC,KARnF,CASsB,oBAAXK,OAAyBA,OAA+B,oBAAfC,WAA6BA,WAAaC,MAAO,WACrG,M,mBCTA,IAAIC,EAAsB,CCA1BA,EAAwB,CAACP,EAASQ,KACjC,IAAI,IAAIC,KAAOD,EACXD,EAAoBG,EAAEF,EAAYC,KAASF,EAAoBG,EAAEV,EAASS,IAC5EE,OAAOC,eAAeZ,EAASS,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,MCJ3EF,EAAwB,CAACQ,EAAKC,IAAUL,OAAOM,UAAUC,eAAeC,KAAKJ,EAAKC,I,4BCA3E,MCQP,EAJoB,CAChBI,KDLsB,CACtBC,WAAY,IACZC,WAAY,gBACZC,OAAQ,CACJC,oBAAqB,CACjBC,MAAO,EACPC,MAAO,OACPC,GAAI,IACJjB,EAAG,mGAEPkB,oBAAqB,CACjBH,MAAO,EACPC,MAAO,OACPC,GAAI,IACJjB,EAAG,kDAEPmB,4BAA6B,CACzBJ,OAAQ,MACRC,MAAO,SACPC,GAAI,IACJjB,EAAG,+wCAEPoB,qBAAsB,CAClBL,OAAQ,SACRC,MAAO,SACPC,GAAI,IACJjB,EAAG,q6BAEPqB,6BAA8B,CAC1BN,OAAQ,SACRC,MAAO,WACPC,GAAI,IACJjB,EAAG,skDAEPsB,gBAAiB,CACbP,OAAQ,GACRC,MAAO,IACPC,GAAI,IACJjB,EAAG,kMAEPuB,eAAgB,CACZR,OAAQ,UACRC,MAAO,SACPC,GAAI,IACJjB,EAAG,mvBAEPwB,yBAA0B,CACtBT,OAAQ,SACRC,MAAO,SACPC,GAAI,IACJjB,EAAG,23EAEPyB,yBAA0B,CACtBV,MAAO,EACPC,MAAO,OACPC,GAAI,IACJjB,EAAG,qoGAEP0B,yBAA0B,CACtBX,MAAO,EACPC,MAAO,OACPC,GAAI,IACJjB,EAAG,4gDAEP2B,qBAAsB,CAClBZ,MAAO,EACPC,MAAO,OACPC,GAAI,IACJjB,EAAG,kDAEP4B,qBAAsB,CAClBb,MAAO,EACPC,MAAO,OACPC,GAAI,IACJjB,EAAG,oGCpEX6B,QCNyB,CACzBC,KAAM,gBACNC,OAAO,EACPlB,OAAQ,K","sources":["webpack://VexFlowFont.Custom/webpack/universalModuleDefinition","webpack://VexFlowFont.Custom/webpack/bootstrap","webpack://VexFlowFont.Custom/webpack/runtime/define property getters","webpack://VexFlowFont.Custom/webpack/runtime/hasOwnProperty shorthand","webpack://VexFlowFont.Custom/./src/fonts/custom_glyphs.ts","webpack://VexFlowFont.Custom/./entry/vexflow-font-custom.ts","webpack://VexFlowFont.Custom/./src/fonts/custom_metrics.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"VexFlowFont\"] = factory();\n\telse\n\t\troot[\"VexFlowFont\"] = root[\"VexFlowFont\"] || {}, root[\"VexFlowFont\"][\"Custom\"] = factory();\n})((typeof window !== 'undefined' ? window : typeof globalThis !== 'undefined' ? globalThis : this), function() {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","export const CustomFont = {\n resolution: 1000,\n fontFamily: 'VexFlowCustom',\n glyphs: {\n noteheadSquareWhite: {\n x_min: 0,\n x_max: 430.75,\n ha: 386,\n o: 'm 0 200 l 0 -200 l 430 -200 l 430 200 l 0 200 l 50 150 l 380 150 l 380 -150 l 50 -150 l 50 150 ',\n },\n noteheadSquareBlack: {\n x_min: 0,\n x_max: 430.75,\n ha: 386,\n o: 'm 0 200 l 0 -200 l 430 -200 l 430 200 l 0 200 ',\n },\n accidentalBuyukMucennebFlat: {\n x_min: -171.5,\n x_max: 251.8125,\n ha: 257,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 553 20 616 20 614 b 20 491 20 503 20 491 l 20 491 b 153 535 47 501 149 535 b 174 514 167 535 174 524 b 164 496 174 508 171 501 b 92 470 164 495 132 484 l 20 445 l 20 390 b 20 363 20 378 20 370 b 20 333 20 340 20 333 l 20 333 b 153 377 47 344 149 377 b 174 356 167 377 174 367 b 164 338 174 349 171 342 b 92 312 164 338 132 326 l 20 288 l 20 219 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 30 -21 -212 -21 -212 b -21 273 -21 163 -21 273 b -84 252 -21 273 -50 263 b -152 230 -133 234 -145 230 b -157 231 -155 230 -156 231 b -171 252 -166 234 -171 244 b -160 270 -171 259 -167 266 b -27 316 -159 270 -93 294 l -21 319 l -21 374 b -21 431 -21 406 -21 431 b -84 409 -21 431 -50 421 b -152 388 -133 392 -145 388 b -157 390 -155 388 -156 388 b -171 409 -166 392 -171 401 b -160 428 -171 417 -167 424 b -27 474 -159 428 -93 451 l -21 476 l -21 546 b -20 620 -21 614 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ',\n },\n accidentalBakiyeFlat: {\n x_min: -176.9375,\n x_max: 251.8125,\n ha: 257,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 503 20 616 20 614 b 20 391 20 442 20 391 b 84 424 20 391 49 406 l 147 456 l 152 456 b 153 456 153 456 153 456 b 175 435 166 456 175 446 b 172 427 175 433 174 430 b 92 380 170 420 172 421 l 20 342 l 20 245 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 54 -21 -212 -21 -212 b -21 322 -21 201 -21 322 b -85 290 -21 322 -50 308 l -148 256 l -153 256 b -155 256 -155 256 -155 256 b -176 277 -167 256 -176 266 b -174 285 -176 280 -175 283 b -93 333 -171 294 -174 292 l -21 370 l -21 494 b -20 620 -21 616 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ',\n },\n accidentalKucukMucennebSharp: {\n x_min: -1.359375,\n x_max: 255.890625,\n ha: 261,\n o: 'm 118 514 b 127 517 121 517 122 517 b 147 505 136 517 142 513 l 148 502 l 148 403 b 148 306 148 351 148 306 b 174 315 149 306 160 310 l 200 324 l 205 323 b 223 312 213 323 220 319 l 225 308 l 225 260 b 225 245 225 255 225 249 b 220 204 225 208 224 209 b 179 188 216 199 215 199 l 148 177 l 148 124 l 148 70 l 189 84 b 236 98 219 94 230 98 b 247 94 240 98 243 97 b 255 52 254 88 255 87 b 255 33 255 47 255 40 l 254 -12 l 253 -15 b 249 -22 253 -18 250 -20 l 245 -24 l 196 -41 l 148 -58 l 148 -108 b 148 -158 148 -136 148 -158 b 174 -148 148 -158 160 -154 b 204 -140 198 -140 200 -140 l 204 -140 b 224 -152 213 -140 221 -145 b 225 -201 224 -155 225 -177 b 224 -254 225 -226 224 -251 b 157 -284 220 -262 220 -262 l 148 -288 l 148 -395 l 148 -503 l 147 -506 b 127 -519 142 -514 134 -519 b 107 -506 119 -519 111 -514 l 106 -503 l 106 -403 b 106 -303 106 -316 106 -303 b 104 -303 104 -303 104 -303 b 88 -310 104 -303 96 -306 l 63 -319 b 51 -322 59 -320 55 -322 b 36 -315 46 -322 40 -319 b 31 -273 32 -309 31 -312 b 31 -258 31 -269 31 -263 l 31 -210 l 34 -206 b 40 -198 35 -204 38 -199 b 74 -186 42 -197 57 -191 l 106 -173 l 106 -123 b 106 -97 106 -112 106 -104 b 106 -72 106 -76 106 -72 b 104 -72 106 -72 106 -72 b 20 -99 89 -79 23 -99 b 0 -84 10 -99 2 -93 b -1 -37 0 -81 -1 -59 b 0 11 -1 -15 0 9 b 58 40 4 22 2 22 l 106 56 l 106 109 b 106 123 106 115 106 119 b 106 162 106 147 106 162 b 81 155 106 162 93 159 b 50 147 65 149 55 147 b 36 152 43 147 40 148 b 31 194 32 158 31 156 b 31 209 31 198 31 204 l 31 256 l 34 260 b 76 281 38 269 38 269 l 106 292 l 106 396 l 106 502 l 107 505 b 118 514 110 509 114 513 ',\n },\n accidentalKoron: {\n x_min: -20,\n x_max: 320,\n ha: 257,\n o: 'm -8 200 b -8 210 8 200 16 200 l 20 148 -199 l 23 -615 b 0 -629 9 -629 6 -629 l -21 -612 l -21 -201 l -21 216 l -20 200 m 16 200 l 310 0 l 240 0 l 16 140 l 16 -120 l 240 0 l 310 0 l 16 -200 ',\n },\n accidentalSori: {\n x_min: -10.890625,\n x_max: 299.4375,\n ha: 294,\n o: 'm 44 174 b 51 174 47 174 49 174 b 68 173 55 174 61 174 l 287 112 l 551 40 b 615 20 617 22 609 23 b 626 0 622 16 626 8 b 615 -22 626 -9 622 -18 b 613 -23 613 -23 613 -23 b 613 -23 613 -23 613 -23 b 287 -113 613 -24 597 -29 l 68 -174 b 53 -176 61 -176 57 -176 b 39 -172 47 -176 43 -174 b 27 -151 31 -167 27 -159 b 39 -129 27 -141 31 -133 b 230 -74 43 -124 20 -131 l 370 -36 l 468 -9 b 498 0 484 -4 498 -1 b 468 8 498 0 484 2 l 370 34 l 230 73 b 40 126 28 129 43 124 b 27 149 31 131 27 140 b 44 174 27 161 34 170 m 205 110 l 205 300 b 205 330 245 330 245 300 l 245 300 l 245 -300 b 245 -330 205 -330 205 -300 l 205 -300 l 205 110 l 345 90 m 345 90 l 345 330 b 345 360 385 360 385 330 l 385 330 l 385 -270 b 385 -300 345 -300 345 -270 l 345 -270 l 345 90 ',\n },\n vexAccidentalMicrotonal2: {\n x_min: -1.359375,\n x_max: 386.5625,\n ha: 394,\n o: 'm 249 535 b 257 537 251 537 253 537 b 276 524 266 537 273 533 l 277 521 l 279 419 l 279 316 l 304 323 b 337 328 319 326 330 328 b 353 316 347 328 349 324 b 355 266 355 315 355 290 b 353 215 355 241 355 217 b 319 198 349 206 347 205 b 279 187 284 190 279 188 b 279 156 279 187 279 174 b 279 136 279 151 279 144 l 279 84 l 289 87 l 330 98 b 367 105 352 102 362 105 b 378 101 372 105 375 104 b 386 61 385 95 386 94 b 386 40 386 55 386 48 l 386 -5 l 385 -8 b 374 -19 383 -12 378 -18 b 291 -40 372 -19 347 -26 b 279 -43 284 -41 279 -43 b 279 -83 279 -43 279 -59 b 279 -95 279 -87 279 -91 l 279 -145 l 304 -140 b 337 -133 321 -136 330 -133 b 349 -140 343 -133 347 -136 b 355 -181 355 -145 355 -142 l 355 -197 l 355 -210 b 349 -252 355 -249 355 -247 b 300 -269 345 -258 347 -258 b 280 -274 291 -272 281 -273 l 279 -274 l 277 -378 l 277 -483 l 276 -487 b 257 -499 273 -495 265 -499 b 238 -487 249 -499 242 -495 l 236 -483 l 236 -384 l 236 -285 l 235 -285 l 212 -291 l 170 -301 b 148 -308 159 -305 148 -306 b 147 -415 147 -308 147 -313 l 147 -523 l 145 -526 b 126 -538 141 -534 133 -538 b 106 -526 118 -538 110 -534 l 104 -523 l 104 -420 b 103 -317 104 -326 104 -317 b 103 -317 103 -317 103 -317 b 50 -330 92 -322 54 -330 b 31 -317 42 -330 35 -326 b 29 -267 29 -315 29 -315 l 29 -219 l 32 -216 b 92 -192 36 -206 36 -206 l 104 -190 l 104 -138 b 103 -87 104 -91 104 -87 b 103 -87 103 -87 103 -87 b 88 -91 103 -87 96 -88 l 49 -101 b 17 -106 32 -105 23 -106 b 6 -102 13 -106 10 -105 b -1 -62 0 -97 -1 -95 b 0 -41 -1 -56 0 -49 l 0 4 l 1 6 b 10 16 2 11 6 15 b 91 37 12 18 38 24 l 104 41 l 104 93 b 103 144 104 140 104 144 b 103 144 103 144 103 144 b 50 131 92 141 54 131 b 31 144 42 131 35 137 b 29 195 29 147 29 148 l 29 242 l 32 245 b 92 269 36 255 36 255 l 104 273 l 104 377 l 104 481 l 106 485 b 126 498 110 492 118 498 b 134 495 129 498 132 496 b 145 485 138 494 142 489 l 147 481 l 147 383 l 147 283 l 152 284 b 190 294 155 285 171 290 l 230 303 l 236 305 l 236 413 l 236 521 l 238 524 b 249 535 240 528 243 533 m 236 126 b 235 177 236 154 236 177 l 235 177 b 213 172 235 177 225 174 l 170 161 b 147 155 157 158 147 155 b 147 124 147 155 147 142 b 147 102 147 117 147 111 l 147 52 l 153 54 l 228 72 l 236 74 l 236 126 m 236 -105 b 235 -54 236 -65 236 -54 l 235 -54 b 231 -55 235 -54 234 -54 b 172 -69 227 -55 204 -62 l 149 -76 l 147 -76 l 147 -127 l 147 -179 l 152 -177 b 190 -167 155 -177 171 -173 l 230 -158 l 236 -156 l 236 -105 ',\n },\n vexAccidentalMicrotonal3: {\n x_min: 0,\n x_max: 430.75,\n ha: 360,\n o: 'm -146 537 b -138 538 -143 538 -141 538 b -118 525 -129 538 -121 533 b -117 390 -117 522 -117 521 b -115 259 -117 268 -117 259 b -115 259 -115 259 -115 259 b -59 272 -104 263 -62 272 b -39 259 -50 272 -42 267 b -37 209 -38 257 -37 233 b -39 159 -37 185 -38 162 b -85 138 -43 149 -44 149 l -117 131 l -117 21 b -115 -88 -117 -80 -117 -88 b -115 -88 -115 -88 -115 -88 b -59 -75 -104 -84 -62 -75 b -44 -81 -52 -75 -48 -77 b -38 -124 -38 -87 -38 -85 b -38 -138 -38 -124 -38 -138 b -38 -152 -38 -138 -38 -152 b -44 -195 -38 -191 -38 -190 b -85 -209 -48 -200 -48 -200 l -117 -217 l -117 -349 b -118 -486 -117 -481 -117 -482 b -138 -499 -121 -494 -129 -499 b -153 -493 -143 -499 -149 -497 b -159 -415 -158 -487 -159 -496 b -159 -355 -159 -398 -159 -379 b -159 -227 -159 -284 -159 -227 b -205 -238 -159 -227 -180 -232 b -250 -249 -230 -244 -250 -249 b -251 -386 -251 -249 -251 -311 b -252 -525 -251 -521 -251 -522 b -272 -538 -255 -534 -264 -538 b -287 -532 -277 -538 -283 -536 b -293 -452 -292 -527 -293 -536 b -293 -391 -293 -436 -293 -415 b -294 -260 -293 -269 -293 -260 b -294 -260 -294 -260 -294 -260 b -348 -272 -306 -264 -345 -272 b -368 -259 -357 -272 -365 -267 b -369 -209 -369 -257 -369 -233 b -368 -159 -369 -185 -369 -162 b -323 -139 -364 -149 -362 -148 l -293 -131 l -293 -22 b -294 87 -293 80 -293 87 b -294 87 -294 87 -294 87 b -348 75 -306 84 -345 75 b -368 88 -357 75 -365 80 b -369 138 -369 91 -369 114 b -368 188 -369 162 -369 186 b -323 209 -364 198 -362 199 l -293 216 l -293 349 b -292 486 -293 481 -293 482 b -272 499 -288 494 -280 499 b -257 493 -266 499 -261 497 b -251 414 -251 487 -251 496 b -251 354 -251 398 -251 378 b -251 226 -251 284 -251 226 b -205 238 -250 226 -230 231 b -159 249 -180 244 -159 249 b -159 385 -159 249 -159 310 b -157 525 -159 521 -159 522 b -146 537 -156 530 -151 535 z m -159 11 b -159 120 -159 98 -159 120 l -159 120 b -175 116 -160 120 -167 119 b -221 105 -184 114 -204 109 l -251 98 l -251 -12 b -251 -121 -251 -72 -251 -121 b -205 -110 -250 -121 -230 -116 b -159 -99 -180 -104 -159 -99 b -159 11 -159 -99 -159 -49 z m 89 517 b 97 519 92 518 94 519 b 117 505 106 519 114 513 b 119 376 119 502 119 501 l 119 249 l 145 258 b 176 267 169 266 172 267 b 177 267 176 267 177 267 b 196 255 186 267 192 263 l 197 252 l 197 205 b 197 181 197 195 197 187 b 193 149 197 153 197 153 b 152 131 190 144 187 143 l 119 120 l 119 10 b 119 -100 119 -62 119 -100 b 145 -91 120 -100 131 -96 b 173 -82 159 -86 171 -82 b 176 -81 174 -81 175 -81 b 196 -94 185 -81 193 -87 b 198 -151 197 -97 198 -125 b 197 -194 198 -172 197 -192 b 153 -218 193 -203 192 -204 l 119 -230 l 119 -367 l 118 -504 l 117 -507 b 97 -519 113 -514 105 -519 b 82 -512 92 -519 87 -517 b 76 -434 77 -507 76 -516 b 76 -374 76 -418 76 -398 b 76 -245 76 -303 76 -245 b 52 -254 76 -245 65 -249 b 19 -263 34 -260 25 -263 b 6 -257 13 -263 10 -261 b 0 -214 0 -251 0 -253 b 0 -200 0 -210 0 -205 b 0 -188 0 -196 0 -192 b 6 -143 0 -147 0 -149 b 46 -126 10 -139 10 -139 l 76 -115 l 76 -5 b 76 106 76 56 76 106 b 51 98 76 106 64 102 b 18 89 34 92 25 89 b 6 95 13 89 10 91 b 0 139 0 101 0 99 b 0 153 0 143 0 148 b 0 179 0 163 0 172 b 44 225 0 215 3 211 l 76 236 l 76 369 b 78 505 76 501 76 502 b 89 517 80 510 85 515 z ',\n },\n vexAccidentalMicrotonal4: {\n x_min: 0,\n x_max: 430.75,\n ha: 360,\n o: 'm 283 633 b 291 634 286 634 289 634 b 311 621 300 634 308 629 b 313 505 313 618 313 617 b 313 393 313 443 313 393 b 378 425 313 393 343 407 l 443 458 l 448 458 b 449 458 449 458 449 458 b 471 437 462 458 471 448 b 469 429 471 434 470 432 b 387 382 466 421 469 423 l 313 344 l 313 247 l 313 150 l 315 152 b 433 201 353 184 394 201 b 479 193 448 201 464 198 b 549 86 524 177 549 135 b 526 1 549 59 541 29 b 395 -143 504 -39 475 -71 b 316 -214 351 -182 341 -191 b 292 -229 302 -228 300 -229 b 272 -216 283 -229 275 -224 b 271 55 271 -212 271 -212 b 270 323 271 203 270 323 b 205 291 270 323 241 308 l 140 258 l 135 258 b 134 258 135 258 134 258 b 112 279 121 258 112 267 b 114 287 112 281 113 284 b 196 334 117 295 114 293 l 271 371 l 271 495 b 272 621 271 617 271 618 b 283 633 274 626 279 631 z m 404 133 b 391 134 400 134 395 134 b 384 134 388 134 386 134 b 318 88 358 130 335 114 l 313 81 l 313 -37 l 313 -156 l 316 -152 b 439 83 391 -71 439 22 l 439 84 b 404 133 439 115 430 128 z m -8 633 l -8 633 b 0 634 -6 634 -3 634 b 20 621 8 634 17 629 b 21 384 21 618 21 617 l 21 150 l 24 152 b 141 201 62 184 102 201 b 187 193 157 201 172 198 b 257 86 232 177 257 135 b 234 1 257 59 250 29 b 103 -143 212 -39 183 -71 b 24 -214 60 -182 49 -191 b 0 -229 10 -228 8 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 203 l -21 618 l -20 621 b -8 633 -18 626 -13 631 z m 113 133 l 113 133 b 99 134 109 134 103 134 b 93 134 97 134 94 134 b 26 88 66 130 43 114 l 21 81 l 21 -37 l 21 -156 l 25 -152 b 148 83 99 -71 148 22 l 148 84 b 113 133 148 115 138 128 z ',\n },\n vexNoteHeadRectBlack: {\n x_min: 0,\n x_max: 430.75,\n ha: 360,\n o: 'm 0 150 l 0 -150 l 430 -150 l 430 150 l 0 150 ',\n },\n vexNoteHeadRectWhite: {\n x_min: 0,\n x_max: 430.75,\n ha: 360,\n o: 'm 0 150 l 0 -150 l 430 -150 l 430 150 l 0 150 l 50 100 l 380 100 l 380 -100 l 50 -100 l 50 100',\n },\n },\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { CustomFont } from '../src/fonts/custom_glyphs';\nimport { CustomMetrics } from '../src/fonts/custom_metrics';\nexport const Font = {\n data: CustomFont,\n metrics: CustomMetrics,\n};\nexport default Font;\n","export const CustomMetrics = {\n name: 'VexFlowCustom',\n smufl: false,\n glyphs: {},\n};\n"],"names":["root","factory","exports","module","define","amd","window","globalThis","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","data","resolution","fontFamily","glyphs","noteheadSquareWhite","x_min","x_max","ha","noteheadSquareBlack","accidentalBuyukMucennebFlat","accidentalBakiyeFlat","accidentalKucukMucennebSharp","accidentalKoron","accidentalSori","vexAccidentalMicrotonal2","vexAccidentalMicrotonal3","vexAccidentalMicrotonal4","vexNoteHeadRectBlack","vexNoteHeadRectWhite","metrics","name","smufl"],"sourceRoot":""} \ No newline at end of file diff --git a/build/cjs/vexflow-font-gonville.js b/build/cjs/vexflow-font-gonville.js new file mode 100644 index 0000000000..7472f8dec1 --- /dev/null +++ b/build/cjs/vexflow-font-gonville.js @@ -0,0 +1,2 @@ +!function(b,l){"object"==typeof exports&&"object"==typeof module?module.exports=l():"function"==typeof define&&define.amd?define([],l):"object"==typeof exports?exports.VexFlowFont=l():(b.VexFlowFont=b.VexFlowFont||{},b.VexFlowFont.Gonville=l())}("undefined"!=typeof window?window:"undefined"!=typeof globalThis?globalThis:this,(function(){return(()=>{"use strict";var b={d:(l,e)=>{for(var a in e)b.o(e,a)&&!b.o(l,a)&&Object.defineProperty(l,a,{enumerable:!0,get:e[a]})},o:(b,l)=>Object.prototype.hasOwnProperty.call(b,l)},l={};b.d(l,{default:()=>e});const e={data:{glyphs:{bracketTop:{x_min:0,x_max:559.421875,ha:571,o:"m 544 204 b 548 204 545 204 547 204 b 559 194 555 204 559 199 b 559 190 559 192 559 191 b 530 156 559 188 556 184 b 462 86 510 134 481 104 b 453 76 458 81 454 77 l 446 70 l 441 65 b 434 59 439 63 436 61 l 427 54 b 409 37 426 51 416 44 b 392 23 398 29 394 26 b 387 19 389 22 387 20 b 379 13 386 19 383 16 l 371 8 l 367 5 l 359 -1 l 337 -16 b 285 -48 319 -29 298 -41 l 279 -52 b 186 -95 255 -66 210 -87 l 175 -99 b 23 -129 127 -117 68 -129 b 17 -129 20 -129 19 -129 b 1 -123 2 -129 2 -129 b 0 -49 0 -122 0 -83 b 0 4 0 -22 0 1 b 27 11 2 9 4 9 b 185 31 78 12 145 20 b 198 34 186 31 193 33 b 314 73 234 44 277 58 b 349 88 328 79 340 84 b 353 90 352 90 353 90 b 363 94 353 90 357 93 b 371 98 367 97 371 98 b 428 129 372 98 413 120 b 461 148 441 136 454 144 b 468 151 464 149 466 151 b 472 154 469 152 470 154 b 481 161 473 155 477 158 b 525 190 490 166 518 186 l 534 197 b 540 201 536 198 539 199 b 544 204 541 202 544 204 "},bracketBottom:{x_min:0,x_max:559.421875,ha:571,o:"m 5 127 b 14 127 6 127 9 127 b 51 126 25 127 43 127 b 175 98 93 122 138 112 l 186 94 b 279 51 210 86 255 65 b 285 47 280 51 283 48 b 319 27 291 44 311 31 l 326 22 b 359 0 332 19 352 4 l 367 -6 b 371 -9 368 -6 370 -8 l 379 -15 b 387 -22 383 -18 386 -20 l 398 -30 l 411 -40 l 417 -47 l 427 -55 l 434 -61 b 441 -66 436 -62 439 -65 l 446 -72 l 453 -77 l 462 -87 b 558 -188 490 -113 549 -176 b 559 -195 559 -191 559 -194 b 548 -205 559 -201 555 -205 b 541 -204 547 -205 544 -205 b 534 -198 539 -201 536 -199 l 525 -191 b 481 -162 518 -187 490 -167 b 472 -155 477 -159 472 -156 b 468 -152 470 -155 469 -154 b 461 -149 466 -152 464 -151 b 428 -130 454 -145 441 -137 b 371 -99 413 -122 372 -99 b 363 -95 371 -99 367 -98 b 353 -91 357 -94 353 -91 b 348 -90 353 -91 352 -91 b 332 -81 343 -87 341 -86 b 27 -12 230 -37 127 -13 b 0 -5 4 -11 2 -11 b 0 58 0 -2 0 27 b 0 122 0 88 0 120 b 5 127 1 124 4 126 "},barlineTick:{x_min:-80.3125,x_max:78.9375,ha:81,o:"m 63 191 b 69 192 65 192 66 192 b 77 188 72 192 76 191 b 78 183 78 187 78 186 b 74 158 78 179 77 172 l 66 115 b 9 -161 49 30 10 -158 b -10 -187 6 -172 -1 -181 b -34 -194 -17 -191 -25 -194 b -80 -147 -58 -194 -80 -174 b -80 -141 -80 -144 -80 -142 b 9 70 -80 -134 -73 -117 l 49 163 b 63 191 59 188 61 190 "},breathMarkTick:{x_min:-80.3125,x_max:78.9375,ha:81,o:"m 63 191 b 69 192 65 192 66 192 b 77 188 72 192 76 191 b 78 183 78 187 78 186 b 74 158 78 179 77 172 l 66 115 b 9 -161 49 30 10 -158 b -10 -187 6 -172 -1 -181 b -34 -194 -17 -191 -25 -194 b -80 -147 -58 -194 -80 -174 b -80 -141 -80 -144 -80 -142 b 9 70 -80 -134 -73 -117 l 49 163 b 63 191 59 188 61 190 "},segno:{x_min:-330.75,x_max:329.390625,ha:336,o:"m -133 483 b -117 484 -127 484 -122 484 b 31 373 -51 484 9 440 b 35 348 34 365 35 356 b -25 285 35 313 10 285 b -87 331 -55 285 -76 302 b -167 402 -100 376 -133 402 b -191 398 -175 402 -183 401 b -227 341 -215 388 -227 369 b -225 320 -227 334 -227 327 b -13 74 -209 230 -125 133 b 6 65 -4 70 5 66 l 9 63 l 10 65 b 117 231 12 68 40 112 l 189 341 l 242 424 b 268 460 262 456 264 458 b 283 464 273 463 277 464 b 308 438 296 464 308 453 l 308 437 b 287 396 308 430 308 428 l 95 98 l 59 43 l 58 41 l 65 37 b 253 -156 151 -8 217 -77 b 281 -285 272 -199 281 -244 b 148 -481 281 -381 231 -463 b 115 -485 137 -484 126 -485 b -32 -376 51 -485 -9 -442 b -36 -349 -35 -366 -36 -358 b 25 -287 -36 -315 -12 -287 b 85 -333 54 -287 74 -302 b 166 -403 99 -377 133 -403 b 190 -399 174 -403 182 -402 b 225 -342 215 -390 225 -370 b 224 -322 225 -335 225 -328 b 12 -76 208 -231 125 -134 b -8 -66 2 -72 -6 -68 l -10 -65 l -12 -66 b -118 -231 -13 -68 -42 -113 l -190 -342 l -243 -426 b -269 -462 -264 -458 -265 -458 b -284 -466 -274 -464 -279 -466 b -310 -440 -298 -466 -310 -455 l -310 -438 b -288 -398 -310 -430 -308 -430 l -96 -99 l -59 -44 l -59 -43 l -66 -38 b -281 284 -198 33 -281 158 l -281 284 b -133 483 -281 392 -220 474 m 254 177 b 266 179 258 177 262 179 b 319 149 287 179 307 167 b 329 115 326 140 329 127 b 319 79 329 102 326 90 b 268 51 307 61 287 51 b 221 72 250 51 234 58 b 205 115 210 84 205 99 b 254 177 205 142 223 170 m -281 -54 b -269 -52 -277 -52 -273 -52 b -223 -73 -253 -52 -235 -59 b -206 -116 -212 -84 -206 -101 b -216 -151 -206 -129 -209 -141 b -269 -179 -228 -170 -249 -179 b -314 -159 -285 -179 -302 -173 b -330 -116 -325 -147 -330 -131 b -281 -54 -330 -88 -313 -61 "},coda:{x_min:-311.6875,x_max:310.328125,ha:317,o:"m -9 388 b -2 390 -8 390 -5 390 b 5 388 1 390 4 390 b 19 378 10 387 16 383 b 23 333 23 371 23 371 b 24 298 23 299 24 298 b 81 276 34 298 65 285 b 213 91 145 240 190 177 b 224 24 217 76 224 36 b 257 24 224 24 235 24 b 299 19 292 24 292 24 b 310 -1 306 15 310 6 b 299 -23 310 -11 306 -19 b 257 -27 292 -27 292 -27 b 224 -29 235 -27 224 -29 b 213 -95 224 -40 217 -80 b 81 -280 190 -181 145 -244 b 24 -301 65 -290 34 -301 b 23 -335 24 -301 23 -303 l 23 -340 b 17 -381 23 -374 23 -374 b -1 -391 13 -388 5 -391 b -21 -381 -9 -391 -17 -388 b -27 -340 -27 -374 -27 -374 l -27 -335 b -28 -301 -27 -303 -27 -301 b -85 -280 -38 -301 -69 -290 b -217 -95 -149 -244 -194 -181 b -228 -29 -221 -80 -228 -40 b -259 -27 -228 -29 -238 -27 b -300 -23 -294 -27 -294 -27 b -311 -2 -307 -19 -311 -11 b -294 23 -311 8 -304 19 b -259 24 -291 23 -284 24 b -228 24 -239 24 -228 24 b -217 91 -228 36 -221 76 b -85 276 -194 177 -149 240 b -28 298 -69 285 -38 298 b -27 333 -27 298 -27 299 b -27 371 -27 362 -27 369 b -9 388 -24 378 -17 385 m -27 136 b -28 247 -27 197 -28 247 b -61 216 -31 247 -53 226 b -123 33 -95 172 -121 98 l -125 24 l -76 24 l -27 24 l -27 136 m 29 242 b 24 247 27 245 24 247 b 23 136 24 247 23 197 l 23 24 l 72 24 l 121 24 l 119 33 b 29 242 115 116 77 206 m -27 -140 l -27 -27 l -76 -27 l -125 -27 l -123 -36 b -61 -220 -121 -102 -95 -176 b -28 -251 -53 -230 -31 -251 b -27 -140 -28 -251 -27 -201 m 119 -36 l 121 -27 l 72 -27 l 23 -27 l 23 -140 b 24 -251 23 -201 24 -251 b 57 -220 27 -251 49 -230 b 119 -36 91 -176 117 -102 "},gClef:{x_min:-1.359375,x_max:847.96875,ha:865,o:"m 488 1499 b 495 1500 490 1500 492 1500 b 541 1465 507 1500 521 1490 b 679 1078 622 1372 679 1210 b 677 1050 679 1068 677 1060 b 477 642 668 893 604 764 l 443 609 l 431 596 l 431 592 l 438 562 l 449 508 l 460 458 b 481 355 475 390 481 355 b 481 355 481 355 481 355 b 490 356 481 355 485 355 b 528 358 495 356 511 358 b 558 356 540 358 552 356 b 839 95 699 338 808 237 b 847 22 845 72 847 47 b 631 -303 847 -113 766 -242 b 620 -309 623 -308 620 -309 l 620 -310 b 631 -359 620 -310 626 -333 l 646 -435 l 660 -496 b 672 -588 668 -535 672 -563 b 664 -653 672 -610 669 -630 b 383 -875 630 -792 509 -875 b 201 -810 321 -875 257 -855 b 129 -680 151 -768 129 -730 b 274 -530 129 -592 200 -530 b 351 -553 300 -530 326 -538 b 412 -669 393 -582 412 -626 b 287 -805 412 -735 366 -800 l 279 -805 l 285 -809 b 383 -830 318 -823 351 -830 b 586 -718 464 -830 540 -789 b 626 -584 612 -678 626 -631 b 619 -528 626 -566 623 -548 b 612 -495 619 -526 616 -510 b 577 -324 590 -387 577 -324 b 577 -324 577 -324 577 -324 b 568 -326 575 -324 571 -324 b 528 -334 558 -328 537 -333 b 465 -338 506 -337 485 -338 b 24 -11 269 -338 87 -206 b -1 145 8 41 -1 93 b 96 442 -1 249 32 351 b 322 714 166 541 236 626 l 352 745 l 345 782 l 332 843 l 315 921 b 303 984 310 950 304 978 b 295 1082 298 1017 295 1049 b 413 1426 295 1208 336 1329 b 488 1499 436 1456 477 1496 m 549 1301 b 541 1301 547 1301 544 1301 b 411 1207 500 1301 447 1263 b 355 1004 374 1152 355 1079 b 359 942 355 984 356 963 b 371 881 362 927 363 917 l 385 818 b 392 782 389 799 392 784 l 392 782 b 434 828 393 782 424 816 b 607 1165 534 941 594 1060 b 608 1193 608 1175 608 1183 b 597 1270 608 1224 604 1254 b 549 1301 589 1286 571 1299 m 398 528 b 393 555 396 542 393 553 b 392 555 393 555 393 555 b 317 470 390 555 347 505 b 190 298 266 408 212 334 b 127 70 148 227 127 148 b 155 -77 127 19 137 -30 b 468 -303 209 -216 333 -303 b 519 -299 484 -303 502 -302 b 568 -284 541 -295 568 -287 l 568 -284 b 563 -263 568 -284 566 -274 l 534 -120 l 511 -13 l 496 61 l 480 133 b 469 187 472 176 469 187 b 468 188 469 187 469 188 b 416 162 462 188 430 172 b 337 13 364 126 337 69 b 413 -124 337 -40 363 -93 b 428 -144 424 -131 428 -137 b 428 -149 428 -145 428 -148 b 409 -166 426 -161 419 -166 b 394 -162 405 -166 400 -165 b 240 77 302 -122 240 -27 l 240 77 b 430 342 240 197 315 301 l 436 344 l 426 394 l 398 528 m 548 194 b 526 195 540 195 532 195 b 519 195 524 195 521 195 l 514 195 l 518 177 l 539 79 l 552 15 l 566 -48 l 594 -187 l 605 -240 b 612 -266 609 -254 611 -266 b 612 -266 612 -266 612 -266 b 641 -248 613 -266 630 -256 b 744 -98 692 -212 730 -156 b 751 -40 749 -79 751 -59 b 548 194 751 76 665 181 "},cClef:{x_min:0,x_max:873.828125,ha:892,o:"m 0 0 l 0 703 l 81 703 l 164 703 l 164 0 l 164 -705 l 81 -705 l 0 -705 l 0 0 m 225 0 l 225 703 l 246 703 l 268 703 l 268 366 l 268 30 l 274 36 b 314 79 284 44 302 63 b 413 302 357 137 392 213 b 432 327 419 324 421 327 b 449 306 443 327 447 322 b 611 115 457 195 529 115 b 651 122 624 115 638 117 b 728 316 705 140 724 188 b 729 388 728 342 729 366 b 671 635 729 533 711 602 b 581 662 649 652 616 662 b 477 637 545 662 510 653 l 475 635 l 477 634 b 503 627 488 632 495 631 b 545 556 532 612 545 584 b 491 480 545 524 526 491 b 465 474 481 476 473 474 b 379 563 417 474 379 516 b 389 602 379 576 382 588 b 541 691 409 641 479 681 b 582 694 555 692 568 694 b 865 462 714 694 834 598 b 873 392 871 440 873 416 b 865 317 873 367 871 341 b 639 84 839 194 748 101 b 612 83 630 83 620 83 b 511 116 577 83 543 94 b 504 120 509 119 506 120 b 504 120 504 120 504 120 b 469 59 504 120 488 93 l 432 -1 l 469 -61 b 504 -122 488 -94 504 -122 b 504 -122 504 -122 504 -122 b 511 -117 506 -122 509 -120 b 612 -84 543 -95 577 -84 b 665 -91 630 -84 647 -87 b 869 -338 771 -122 850 -216 b 873 -392 872 -356 873 -374 b 798 -595 873 -469 847 -539 b 581 -695 741 -662 660 -695 b 406 -626 517 -695 454 -671 b 381 -563 389 -607 381 -585 b 465 -477 381 -519 413 -477 b 545 -559 514 -477 545 -519 b 503 -628 545 -587 532 -613 b 477 -635 495 -632 488 -634 l 475 -637 l 477 -638 b 581 -663 510 -655 545 -663 b 671 -637 616 -663 649 -653 b 729 -391 711 -603 729 -534 b 728 -317 729 -367 728 -344 b 623 -117 722 -173 698 -124 b 611 -116 619 -116 615 -116 b 449 -308 528 -116 457 -198 b 432 -328 447 -323 443 -328 b 413 -303 421 -328 419 -326 b 314 -80 392 -215 357 -138 b 274 -37 302 -65 284 -45 l 268 -31 l 268 -367 l 268 -705 l 246 -705 l 225 -705 l 225 0 "},fClef:{x_min:-1.359375,x_max:899.703125,ha:918,o:"m 307 349 b 332 351 315 351 323 351 b 443 340 367 351 408 347 b 741 47 607 306 720 195 b 744 0 743 31 744 16 b 660 -303 744 -90 713 -206 b 28 -755 534 -531 304 -695 b 14 -756 23 -755 19 -756 b -1 -741 4 -756 -1 -750 b 21 -720 -1 -731 1 -728 b 567 -56 337 -601 548 -344 b 568 -11 568 -41 568 -24 b 442 285 568 129 525 233 b 325 319 406 308 367 319 b 93 177 232 319 137 266 b 84 154 91 170 84 155 b 84 154 84 154 84 154 b 88 156 84 154 85 155 b 159 177 110 170 134 177 b 257 134 194 177 231 162 b 294 41 281 108 294 73 b 171 -97 294 -24 246 -90 b 156 -98 166 -97 161 -98 b 6 74 73 -98 6 -22 b 6 80 6 76 6 79 b 307 349 10 223 141 340 m 839 215 b 845 216 841 216 842 216 b 862 213 852 216 860 215 b 899 163 887 206 899 184 b 872 117 899 145 890 127 b 847 111 865 112 856 111 b 808 130 833 111 818 117 b 796 162 800 140 796 151 b 839 215 796 187 812 212 m 839 -112 b 845 -112 841 -112 842 -112 b 862 -115 852 -112 860 -113 b 899 -165 887 -122 899 -144 b 872 -210 899 -183 890 -201 b 847 -217 865 -215 856 -217 b 808 -198 833 -217 818 -210 b 796 -165 800 -188 796 -177 b 839 -112 796 -140 812 -116 "},unpitchedPercussionClef1:{x_min:0,x_max:464.140625,ha:474,o:"m 0 0 l 0 347 l 76 347 l 153 347 l 153 0 l 153 -348 l 76 -348 l 0 -348 l 0 0 m 308 -1 l 308 347 l 386 347 l 464 347 l 464 -1 l 464 -348 l 386 -348 l 308 -348 l 308 -1 "},"6stringTabClef":{x_min:-1.359375,x_max:680.5625,ha:694,o:"m 597 1042 b 604 1042 600 1042 602 1042 b 642 1002 627 1042 642 1022 b 619 966 642 988 635 974 b 439 927 574 942 503 927 l 426 927 l 426 921 b 430 838 428 893 430 866 b 345 480 430 696 398 560 b 179 391 307 423 249 391 b 156 392 171 391 164 392 b 138 394 149 394 142 394 b 103 434 115 396 103 416 b 129 471 103 451 111 466 b 141 474 133 473 137 474 b 172 459 153 474 164 469 b 181 455 175 456 176 455 b 187 456 182 455 185 455 b 253 520 212 460 234 483 b 315 836 294 605 315 714 b 311 928 315 867 314 898 b 302 945 310 943 311 942 b 245 953 283 950 262 953 b 130 891 193 953 149 931 b 84 860 119 870 102 860 b 36 905 61 860 39 877 b 36 910 36 907 36 909 b 80 970 36 931 50 949 b 249 1017 125 1000 187 1017 b 322 1009 273 1017 299 1014 l 341 1003 b 436 991 372 995 406 991 b 577 1031 495 991 545 1004 b 597 1042 583 1038 590 1041 m 416 360 b 424 360 419 360 421 360 b 481 309 454 360 479 338 b 503 145 484 280 495 199 b 585 -185 525 16 555 -106 b 630 -245 596 -213 613 -237 l 634 -247 l 638 -245 b 647 -244 641 -245 645 -244 b 680 -278 666 -244 680 -262 b 664 -308 680 -290 675 -301 b 638 -312 658 -310 650 -312 b 613 -309 631 -312 623 -310 b 477 -201 555 -303 502 -260 b 417 -2 460 -159 434 -72 b 416 5 417 1 416 5 b 416 5 416 5 416 5 b 411 -5 415 5 413 0 b 359 -97 397 -33 377 -70 b 353 -106 355 -102 353 -105 b 359 -112 353 -108 355 -109 b 409 -130 375 -123 390 -129 b 426 -134 420 -130 421 -131 b 431 -147 428 -137 431 -141 b 420 -162 431 -152 427 -159 b 382 -169 409 -166 396 -169 b 323 -155 363 -169 341 -165 l 317 -152 l 314 -155 b 62 -303 240 -240 148 -295 b 36 -305 55 -305 44 -305 b 23 -303 29 -305 24 -305 b -1 -273 6 -299 -1 -287 b 31 -240 -1 -256 10 -240 b 36 -240 32 -240 34 -240 b 42 -241 38 -241 39 -241 b 134 -204 63 -241 99 -226 b 367 288 265 -115 357 81 b 375 330 368 313 370 320 b 416 360 383 347 400 358 m 360 -359 b 379 -359 363 -359 371 -359 b 424 -360 396 -359 416 -359 b 646 -502 536 -373 624 -430 b 649 -527 649 -510 649 -519 b 530 -673 649 -578 604 -635 l 521 -677 l 529 -681 b 653 -811 592 -714 637 -762 b 660 -853 658 -827 660 -839 b 645 -911 660 -873 656 -892 b 426 -1021 608 -981 519 -1021 b 283 -989 377 -1021 328 -1011 b 235 -949 249 -972 239 -964 b 234 -936 234 -946 234 -941 b 234 -928 234 -934 234 -931 l 235 -925 l 234 -927 l 225 -934 b 87 -982 186 -966 138 -982 b 80 -982 85 -982 83 -982 b 55 -981 70 -981 58 -981 b 17 -943 32 -981 17 -964 b 54 -904 17 -921 35 -904 b 78 -914 62 -904 72 -909 l 83 -918 l 88 -918 b 190 -831 122 -918 166 -881 b 269 -506 242 -727 269 -612 b 268 -462 269 -492 269 -477 b 266 -449 266 -458 266 -452 b 265 -444 266 -445 266 -444 b 257 -446 264 -444 261 -445 b 132 -545 196 -470 152 -505 b 88 -573 122 -563 104 -573 b 39 -523 63 -573 39 -553 b 63 -476 39 -505 44 -494 b 360 -359 136 -408 235 -369 m 419 -424 b 393 -423 411 -423 406 -423 l 375 -423 l 377 -426 b 379 -439 377 -427 378 -434 b 383 -510 382 -463 383 -487 b 314 -811 383 -609 360 -710 b 266 -893 296 -850 285 -870 b 264 -898 265 -896 264 -898 l 264 -898 b 264 -898 264 -898 264 -898 b 268 -898 264 -898 266 -898 b 273 -898 270 -898 272 -898 b 300 -909 283 -898 291 -900 b 426 -957 340 -941 385 -957 b 476 -949 443 -957 460 -954 b 547 -853 522 -931 547 -893 b 485 -745 547 -816 526 -775 b 397 -707 460 -727 432 -714 b 366 -675 375 -703 366 -692 b 396 -642 366 -657 377 -645 b 530 -557 455 -637 511 -601 b 536 -527 534 -548 536 -537 b 419 -424 536 -480 490 -437 "},timeSig0:{x_min:0,x_max:514.5,ha:525,o:"m 236 648 b 246 648 238 648 242 648 b 288 646 261 648 283 648 b 472 513 364 634 428 587 b 514 347 502 464 514 413 b 462 163 514 272 499 217 b 257 44 409 83 333 44 b 50 163 181 44 103 83 b 0 347 14 217 0 272 b 40 513 0 413 12 464 b 236 648 87 591 155 638 m 277 614 b 253 616 273 616 261 616 b 242 616 247 616 243 616 b 170 499 193 609 181 589 b 159 348 163 446 159 398 b 166 222 159 308 161 266 b 201 91 174 138 183 106 b 257 76 215 81 235 76 b 311 91 277 76 299 81 b 347 222 330 106 338 138 b 353 348 352 266 353 308 b 344 499 353 398 351 446 b 277 614 333 587 322 606 m 257 -1 l 258 -1 l 255 -1 l 257 -1 m 257 673 l 258 673 l 255 673 l 257 673 "},timeSig1:{x_min:-1.359375,x_max:344.359375,ha:351,o:"m 126 637 l 129 638 l 198 638 l 266 638 l 269 635 b 274 631 272 634 273 632 l 277 627 l 277 395 b 279 156 277 230 277 161 b 329 88 281 123 295 106 b 344 69 341 81 344 79 b 337 55 344 62 343 59 l 333 54 l 197 54 l 61 54 l 58 55 b 50 69 53 59 50 62 b 65 88 50 79 53 81 b 80 97 72 91 74 93 b 117 156 103 113 112 129 b 117 345 117 161 117 222 l 117 528 l 100 503 l 38 406 b 14 383 24 384 23 383 b -1 398 5 383 -1 390 b 4 415 -1 403 1 409 b 16 437 5 416 10 426 l 72 539 l 100 596 b 121 632 119 631 119 631 b 126 637 122 634 125 635 m 171 -1 l 172 -1 l 170 -1 l 171 -1 m 171 673 l 172 673 l 170 673 l 171 673 "},timeSig2:{x_min:-1.359375,x_max:458.6875,ha:468,o:"m 197 648 b 216 648 201 648 208 648 b 258 646 232 648 253 648 b 419 546 333 637 393 599 b 432 489 428 528 432 509 b 356 342 432 440 405 384 b 235 278 322 313 288 295 b 69 170 166 256 107 217 b 69 169 69 170 69 169 b 69 169 69 169 69 169 b 74 173 69 169 72 170 b 209 222 112 204 163 222 b 310 195 247 222 274 215 b 371 179 332 184 352 179 b 396 181 379 179 387 179 b 428 202 409 184 423 194 b 442 212 431 209 436 212 b 458 197 450 212 458 206 b 441 148 458 190 449 165 b 299 44 409 84 353 44 b 288 45 295 44 292 44 b 250 61 274 45 268 49 b 122 99 212 86 164 99 b 73 91 104 99 88 97 b 28 63 53 84 34 72 b 14 54 25 56 20 54 b 1 62 9 54 4 56 l -1 65 l -1 79 b 0 99 -1 91 0 95 b 2 113 1 102 2 108 b 164 309 20 197 81 272 b 285 470 232 341 277 398 b 287 487 287 476 287 481 b 171 595 287 551 239 595 b 155 595 166 595 160 595 b 142 592 145 594 142 594 b 145 589 142 592 142 591 b 179 527 168 576 179 551 b 132 455 179 496 163 467 b 104 451 122 452 112 451 b 27 530 62 451 27 487 b 29 555 27 538 27 546 b 197 648 44 601 115 639 m 228 -1 l 230 -1 l 227 -1 l 228 -1 m 228 673 l 230 673 l 227 673 l 228 673 "},timeSig3:{x_min:-1.359375,x_max:409.6875,ha:418,o:"m 174 648 b 191 648 176 648 183 648 b 225 648 204 648 220 648 b 402 523 317 638 389 588 b 404 503 404 517 404 510 b 402 484 404 495 404 488 b 264 373 389 437 334 394 b 257 370 259 371 257 371 b 257 370 257 370 257 370 b 264 369 258 370 261 369 b 409 202 359 334 409 267 b 318 72 409 152 381 104 b 200 43 281 52 240 43 b 23 113 134 43 69 68 b 0 169 6 129 0 149 b 77 249 0 210 29 249 l 77 249 b 152 174 125 249 152 212 b 103 102 152 145 137 116 b 103 102 103 102 103 102 b 147 94 103 101 132 95 b 153 94 149 94 151 94 b 265 206 219 94 265 141 b 264 226 265 213 265 219 b 147 355 253 299 204 353 b 126 371 133 356 126 362 b 147 388 126 383 132 388 b 254 474 196 391 238 424 b 259 502 258 484 259 494 b 182 592 259 544 228 582 b 156 595 175 595 166 595 b 115 592 142 595 129 594 l 111 591 l 115 588 b 152 524 141 574 152 549 b 92 449 152 491 130 458 b 76 448 87 448 81 448 b -1 530 32 448 -1 488 b 20 581 -1 548 5 566 b 174 648 55 619 108 641 m 204 -1 l 205 -1 l 202 -1 l 204 -1 m 204 673 l 205 673 l 202 673 l 204 673 "},timeSig4:{x_min:0,x_max:468.21875,ha:478,o:"m 174 637 b 232 638 175 638 189 638 b 277 638 245 638 259 638 l 378 638 l 381 635 b 389 623 386 632 389 627 b 382 609 389 617 386 613 b 366 589 381 606 372 598 l 313 528 l 245 451 l 209 410 l 155 348 l 84 267 b 59 240 72 252 59 240 b 59 240 59 240 59 240 b 151 238 59 238 68 238 l 242 238 l 242 303 b 243 371 242 369 242 370 b 289 426 245 374 254 385 l 303 441 l 317 456 l 338 483 l 360 506 l 371 520 b 386 527 375 526 381 527 b 400 519 392 527 397 524 b 401 440 401 516 401 514 b 401 377 401 423 401 402 l 401 238 l 426 238 b 453 237 449 238 450 238 b 465 217 461 234 465 226 b 460 202 465 212 464 206 b 426 197 454 197 453 197 l 401 197 l 401 180 b 451 88 402 129 412 109 b 468 69 465 81 468 79 b 461 55 468 62 466 59 l 458 54 l 321 54 l 185 54 l 182 55 b 175 69 176 59 175 62 b 191 88 175 79 176 81 b 240 180 230 109 240 129 l 240 197 l 125 197 b 73 195 104 195 87 195 b 8 197 10 195 9 197 b 0 212 2 199 0 205 b 0 212 0 212 0 212 b 20 242 0 219 0 219 b 163 610 104 344 163 492 b 174 637 163 628 166 634 m 234 -1 l 235 -1 l 232 -1 l 234 -1 m 234 673 l 235 673 l 232 673 l 234 673 "},timeSig5:{x_min:0,x_max:409.6875,ha:418,o:"m 47 637 b 53 638 49 638 50 638 b 69 634 55 638 61 637 b 210 610 114 619 161 610 b 363 634 259 610 311 619 b 382 638 372 637 378 638 b 392 634 386 638 389 637 b 397 623 396 630 397 627 b 393 610 397 620 396 616 b 298 505 368 552 338 520 b 212 494 277 498 246 494 b 65 517 163 494 106 502 b 61 517 62 517 61 517 b 61 517 61 517 61 517 b 51 408 61 517 51 412 b 51 408 51 408 51 408 b 51 408 51 408 51 408 b 61 412 53 408 55 409 b 125 434 80 421 103 430 b 185 441 145 440 166 441 b 409 244 310 441 409 353 b 401 191 409 227 406 209 b 197 43 375 105 287 43 b 159 47 183 43 171 44 b 23 123 112 56 61 86 b 0 180 6 140 0 159 b 76 260 0 220 31 260 b 92 259 81 260 87 259 b 152 183 132 251 152 216 b 100 112 152 152 134 122 b 95 111 98 112 95 111 b 95 111 95 111 95 111 b 129 98 95 109 119 101 b 148 97 136 97 141 97 b 264 235 206 97 261 158 b 265 248 265 240 265 244 b 210 398 265 312 243 373 b 179 408 201 406 194 408 b 174 408 178 408 176 408 b 53 369 130 408 88 394 b 34 359 39 359 38 359 b 17 374 24 359 17 365 b 39 628 17 384 38 625 b 47 637 40 631 43 635 m 204 -1 l 205 -1 l 202 -1 l 204 -1 m 204 673 l 205 673 l 202 673 l 204 673 "},timeSig6:{x_min:0,x_max:475.03125,ha:485,o:"m 255 648 b 274 648 259 648 266 648 b 314 646 288 648 307 648 b 450 555 374 637 438 594 b 454 530 453 546 454 538 b 375 451 454 485 416 451 b 328 467 359 451 343 455 b 300 526 310 483 300 503 b 352 598 300 557 319 589 b 356 599 355 598 356 599 b 352 602 356 599 355 601 b 288 616 330 612 308 616 b 210 584 257 616 230 605 b 164 433 189 559 174 508 b 160 374 163 415 160 381 b 160 374 160 374 160 374 b 160 374 160 374 160 374 b 168 377 160 374 164 376 b 258 395 200 390 228 395 b 366 367 294 395 328 387 b 475 223 436 333 475 283 b 472 197 475 215 473 206 b 349 65 462 141 419 95 b 259 43 317 51 288 43 b 167 69 230 43 200 52 b 4 290 80 113 20 195 b 0 349 1 309 0 328 b 20 467 0 391 6 433 b 255 648 58 563 155 637 m 269 363 b 257 363 265 363 261 363 b 210 345 236 363 220 356 b 186 226 196 324 186 272 b 187 198 186 216 186 206 b 213 95 191 151 202 112 b 257 76 221 83 238 76 b 270 77 261 76 266 76 b 321 156 299 81 310 99 b 329 229 326 183 329 206 b 321 301 329 252 326 274 b 269 363 311 342 298 359 m 236 -1 l 238 -1 l 235 -1 l 236 -1 m 236 673 l 238 673 l 235 673 l 236 673 "},timeSig7:{x_min:0,x_max:442.359375,ha:451,o:"m 147 648 b 166 649 153 649 160 649 b 313 598 217 649 273 630 b 340 587 323 588 328 587 l 341 587 b 412 628 367 587 390 601 b 427 638 416 635 421 638 b 439 632 431 638 435 637 b 442 623 441 630 442 628 b 430 569 442 616 439 603 b 352 369 408 492 377 410 b 300 259 325 324 313 298 b 273 84 283 205 273 140 b 265 55 273 65 272 59 l 261 54 l 181 54 l 99 54 l 96 55 b 91 61 95 56 92 59 l 89 63 l 89 77 b 147 263 89 133 111 202 b 261 401 176 313 212 355 b 378 541 315 449 349 489 l 382 548 l 375 544 b 240 495 333 512 285 495 b 129 535 198 495 160 509 b 84 560 108 552 95 560 b 76 559 81 560 78 560 b 31 487 59 555 43 530 b 14 470 27 473 24 470 b 1 477 8 470 4 471 l 0 480 l 0 553 l 0 627 l 1 630 b 16 638 4 635 9 638 b 23 635 17 638 20 637 b 49 626 36 626 39 626 b 96 638 59 626 80 630 b 104 639 99 638 102 639 b 117 644 107 641 112 642 b 147 648 125 645 137 648 m 220 -1 l 221 -1 l 219 -1 l 220 -1 m 220 673 l 221 673 l 219 673 l 220 673 "},timeSig8:{x_min:0,x_max:488.640625,ha:499,o:"m 217 648 b 245 649 225 648 235 649 b 453 516 343 649 430 595 b 458 478 455 503 458 491 b 412 370 458 440 441 398 b 411 369 412 369 411 369 b 415 365 411 367 412 367 b 488 231 462 331 488 281 b 472 165 488 208 483 186 b 243 43 434 86 338 43 b 63 104 178 43 112 62 b 0 233 20 140 0 186 b 73 365 0 283 24 331 l 77 369 l 72 374 b 29 476 42 406 29 441 b 217 648 29 557 103 635 m 258 605 b 242 606 253 605 247 606 b 157 552 198 606 157 580 b 160 541 157 548 159 544 b 319 413 176 503 242 452 l 337 403 l 338 406 b 359 476 352 428 359 452 b 258 605 359 537 318 595 m 138 326 b 130 330 134 328 130 330 b 130 330 130 330 130 330 b 107 305 127 330 112 313 b 84 231 91 281 84 256 b 243 86 84 156 151 86 b 249 87 245 86 246 87 b 347 156 303 88 347 120 b 344 172 347 162 345 167 b 156 319 325 227 257 281 b 138 326 151 322 144 324 m 243 -1 l 245 -1 l 242 -1 l 243 -1 m 243 673 l 245 673 l 242 673 l 243 673 "},timeSig9:{x_min:0,x_max:475.03125,ha:485,o:"m 191 646 b 212 649 198 648 205 649 b 255 644 227 649 243 646 b 458 448 348 616 428 539 b 475 342 469 415 475 378 b 460 244 475 308 469 274 b 193 44 421 124 303 44 b 91 69 157 44 122 51 b 19 161 43 97 19 126 b 21 181 19 167 20 174 b 98 241 32 220 65 241 b 170 186 129 241 160 223 b 172 166 171 179 172 173 b 121 94 172 134 152 102 b 117 93 118 94 117 93 b 121 90 117 93 118 91 b 185 76 142 80 164 76 b 270 119 220 76 251 91 b 308 259 287 145 300 194 b 313 317 310 277 313 310 b 313 317 313 317 313 317 b 313 317 313 317 313 317 b 304 315 313 317 308 316 b 216 295 273 302 245 295 b 145 308 193 295 170 299 b 19 398 88 327 42 360 b 0 469 5 420 0 444 b 24 551 0 496 8 526 b 191 646 54 596 125 637 m 227 614 b 215 616 224 616 220 616 b 202 614 210 616 206 616 b 152 535 174 610 163 592 b 144 463 147 509 144 485 b 152 391 144 440 147 417 b 216 328 163 344 179 328 b 280 391 253 328 269 344 b 288 463 285 417 288 440 b 280 535 288 485 285 509 b 227 614 269 594 258 610 m 236 -1 l 238 -1 l 235 -1 l 236 -1 m 236 673 l 238 673 l 235 673 l 236 673 "},timeSigCommon:{x_min:-1.359375,x_max:556.6875,ha:568,o:"m 294 322 b 318 323 299 322 308 323 b 360 320 334 323 352 322 b 526 217 430 310 490 273 b 543 166 537 202 543 184 b 447 70 543 117 503 70 b 445 70 447 70 446 70 b 359 159 394 72 359 113 b 368 201 359 173 362 187 b 442 245 382 229 412 245 b 455 244 446 245 451 245 b 460 244 458 244 460 244 b 460 244 460 244 460 244 b 454 248 460 244 458 245 b 325 291 417 276 372 291 b 285 287 313 291 299 290 b 144 -2 183 269 144 190 b 281 -290 144 -208 179 -280 b 304 -291 289 -291 298 -291 b 524 -105 412 -291 506 -212 b 541 -84 526 -88 530 -84 b 556 -101 551 -84 556 -90 b 549 -138 556 -111 553 -122 b 334 -322 521 -237 435 -310 b 302 -324 323 -323 313 -324 b 13 -101 172 -324 54 -234 b -1 -1 4 -68 -1 -34 b 294 322 -1 161 121 303 "},timeSigCutCommon:{x_min:0,x_max:556.6875,ha:568,o:"m 289 545 b 298 546 292 545 295 546 b 318 533 306 546 315 541 b 319 428 319 530 319 528 l 319 327 l 334 327 b 526 223 412 326 485 285 b 543 172 537 206 543 190 b 447 76 543 122 503 76 b 445 76 446 76 446 76 b 359 165 394 77 359 119 b 368 205 359 179 362 192 b 441 251 382 233 412 251 b 455 249 446 251 451 251 b 460 248 458 249 460 248 b 460 248 460 248 460 248 b 454 254 460 249 458 251 b 334 295 419 280 378 294 l 319 295 l 319 4 l 319 -287 l 321 -285 b 328 -285 322 -285 325 -285 b 524 -99 424 -277 507 -198 b 541 -79 526 -84 530 -79 b 556 -97 551 -79 556 -84 b 548 -133 556 -105 553 -117 b 334 -317 521 -233 434 -306 b 322 -319 329 -317 323 -317 l 319 -319 l 319 -424 b 319 -471 319 -444 319 -459 b 313 -541 319 -544 318 -535 b 298 -548 308 -545 303 -548 b 279 -534 289 -548 281 -542 b 277 -424 277 -531 277 -530 l 277 -317 l 273 -317 b 13 -95 153 -305 51 -217 b 0 2 4 -62 0 -29 b 182 295 0 126 66 238 b 274 324 210 309 249 320 l 277 324 l 277 427 b 279 533 277 528 277 530 b 289 545 281 538 285 542 m 277 2 b 277 291 277 161 277 291 b 268 288 277 291 273 290 b 144 1 179 265 144 184 b 276 -284 144 -199 175 -267 l 277 -285 l 277 2 "},timeSigPlus:{x_min:0,x_max:319.859375,ha:326,o:"m 149 508 b 159 509 152 509 155 509 b 186 494 170 509 181 503 b 190 440 190 487 190 488 l 190 430 l 190 377 l 242 377 l 251 377 b 303 373 298 377 296 377 b 319 345 314 367 319 356 b 304 319 319 335 314 324 b 250 315 296 315 299 315 l 242 315 l 190 315 l 190 262 l 190 252 b 186 198 190 204 190 205 b 159 183 179 188 170 183 b 132 198 148 183 138 188 b 127 252 127 205 127 204 l 127 262 l 127 315 l 76 315 l 68 315 b 14 319 20 315 21 315 b 0 347 4 324 0 335 b 14 373 0 356 4 367 b 68 377 21 377 20 377 l 76 377 l 127 377 l 127 430 l 127 440 b 132 494 127 488 127 487 b 149 508 136 501 142 505 "},timeSigPlusSmall:{x_min:0,x_max:319.859375,ha:326,o:"m 149 508 b 159 509 152 509 155 509 b 186 494 170 509 181 503 b 190 440 190 487 190 488 l 190 430 l 190 377 l 242 377 l 251 377 b 303 373 298 377 296 377 b 319 345 314 367 319 356 b 304 319 319 335 314 324 b 250 315 296 315 299 315 l 242 315 l 190 315 l 190 262 l 190 252 b 186 198 190 204 190 205 b 159 183 179 188 170 183 b 132 198 148 183 138 188 b 127 252 127 205 127 204 l 127 262 l 127 315 l 76 315 l 68 315 b 14 319 20 315 21 315 b 0 347 4 324 0 335 b 14 373 0 356 4 367 b 68 377 21 377 20 377 l 76 377 l 127 377 l 127 430 l 127 440 b 132 494 127 488 127 487 b 149 508 136 501 142 505 "},timeSigMinus:{x_min:0,x_max:318.5,ha:325,o:"m 20 376 b 167 377 23 377 96 377 b 296 376 231 377 294 377 b 318 347 311 371 318 359 b 296 316 318 333 311 320 b 159 315 294 315 227 315 b 21 316 91 315 24 315 b 0 345 6 320 0 333 b 20 376 0 359 6 371 "},timeSigParensRight:{x_min:25.859375,x_max:164.6875,ha:168,o:"m 34 369 b 40 370 35 370 38 370 b 59 353 49 370 50 367 b 164 40 122 254 155 158 b 164 0 164 33 164 16 b 164 -40 164 -16 164 -34 b 59 -353 155 -158 122 -254 b 40 -371 53 -366 47 -371 b 34 -370 38 -371 36 -370 b 25 -358 28 -367 25 -363 b 31 -337 25 -352 27 -347 b 92 0 72 -234 92 -117 b 31 335 92 116 72 233 b 25 356 27 345 25 352 b 34 369 25 363 28 366 "},timeSigParensRightSmall:{x_min:25.859375,x_max:164.6875,ha:168,o:"m 34 369 b 40 370 35 370 38 370 b 59 353 49 370 50 367 b 164 40 122 254 155 158 b 164 0 164 33 164 16 b 164 -40 164 -16 164 -34 b 59 -353 155 -158 122 -254 b 40 -371 53 -366 47 -371 b 34 -370 38 -371 36 -370 b 25 -358 28 -367 25 -363 b 31 -337 25 -352 27 -347 b 92 0 72 -234 92 -117 b 31 335 92 116 72 233 b 25 356 27 345 25 352 b 34 369 25 363 28 366 "},timeSigParensLeft:{x_min:-166.0625,x_max:-25.859375,ha:0,o:"m -49 369 b -42 370 -46 369 -44 370 b -27 360 -36 370 -29 366 b -25 355 -27 359 -25 358 b -32 335 -25 351 -28 347 b -92 52 -66 248 -87 159 b -93 -1 -93 43 -93 20 b -92 -54 -93 -23 -93 -45 b -32 -337 -85 -162 -66 -251 b -25 -355 -27 -349 -25 -352 b -42 -371 -25 -365 -32 -371 b -61 -353 -50 -371 -51 -369 b -163 -63 -119 -262 -153 -165 b -166 -1 -166 -37 -166 -31 b -163 62 -166 30 -166 36 b -61 352 -153 163 -119 260 b -49 369 -54 365 -51 366 "},timeSigParensLeftSmall:{x_min:-166.0625,x_max:-25.859375,ha:0,o:"m -49 369 b -42 370 -46 369 -44 370 b -27 360 -36 370 -29 366 b -25 355 -27 359 -25 358 b -32 335 -25 351 -28 347 b -92 52 -66 248 -87 159 b -93 -1 -93 43 -93 20 b -92 -54 -93 -23 -93 -45 b -32 -337 -85 -162 -66 -251 b -25 -355 -27 -349 -25 -352 b -42 -371 -25 -365 -32 -371 b -61 -353 -50 -371 -51 -369 b -163 -63 -119 -262 -153 -165 b -166 -1 -166 -37 -166 -31 b -163 62 -166 30 -166 36 b -61 352 -153 163 -119 260 b -49 369 -54 365 -51 366 "},noteheadDoubleWhole:{x_min:0,x_max:902.421875,ha:921,o:"m 17 240 b 24 241 19 241 21 241 b 32 240 28 241 31 241 b 46 229 38 238 43 234 b 50 88 50 223 50 237 b 50 -1 50 63 50 34 b 50 -90 50 -36 50 -65 b 46 -231 50 -238 50 -224 b 25 -242 42 -238 34 -242 b 0 -224 14 -242 4 -235 b 0 2 0 -222 0 -108 b 0 223 0 112 0 220 b 17 240 2 230 9 237 m 110 240 b 118 241 111 241 114 241 b 126 240 121 241 123 241 b 142 223 133 237 140 230 b 144 123 144 220 144 205 b 144 29 144 45 144 29 b 144 29 144 29 144 29 b 393 183 166 106 264 167 b 450 186 412 184 431 186 b 756 29 600 186 732 120 b 756 29 756 29 756 29 b 758 123 758 29 758 45 b 760 227 758 226 758 223 b 784 241 766 237 774 241 b 804 229 792 241 800 237 b 809 88 808 223 809 237 l 809 -1 l 809 -90 b 804 -231 809 -238 808 -224 b 784 -242 800 -238 792 -242 b 762 -231 775 -242 766 -238 b 758 -124 756 -224 758 -231 b 756 -30 758 -47 758 -30 b 756 -30 756 -30 756 -30 b 509 -184 736 -108 637 -169 b 450 -187 488 -187 469 -187 b 144 -30 300 -187 168 -122 b 144 -30 144 -30 144 -30 b 144 -124 144 -30 144 -47 b 140 -231 144 -231 144 -224 b 118 -242 134 -238 126 -242 b 92 -224 107 -242 96 -235 b 92 2 92 -222 92 -108 b 92 223 92 112 92 220 b 110 240 95 230 102 237 m 432 161 b 413 162 426 162 420 162 b 313 41 351 162 313 109 b 347 -73 313 5 323 -34 b 487 -163 385 -133 439 -163 b 578 -97 526 -163 562 -142 b 588 -43 585 -80 588 -62 b 432 161 588 47 518 147 m 868 240 b 876 241 869 241 872 241 b 884 240 879 241 882 241 b 898 229 890 238 894 234 b 902 88 902 223 902 237 l 902 -1 l 902 -90 b 898 -231 902 -238 902 -224 b 876 -242 892 -238 884 -242 b 852 -224 865 -242 854 -235 b 850 2 850 -222 850 -108 b 852 223 850 112 850 220 b 868 240 853 230 860 237 "},noteheadWhole:{x_min:0,x_max:619.3125,ha:632,o:"m 274 184 b 307 186 285 186 296 186 b 616 22 465 186 597 116 b 619 -1 617 13 619 5 b 308 -187 619 -104 483 -187 b 0 -1 133 -187 0 -102 b 5 36 0 11 1 23 b 274 184 29 115 141 176 m 289 161 b 272 162 284 162 277 162 b 171 41 209 162 171 108 b 205 -73 171 5 182 -34 b 345 -163 243 -133 298 -163 b 436 -98 385 -163 420 -142 b 446 -43 443 -80 446 -62 b 289 161 446 47 377 147 "},noteheadHalf:{x_min:0,x_max:428.75,ha:438,o:"m 262 186 b 273 186 266 186 272 186 b 274 186 273 186 274 186 b 285 186 274 186 280 186 b 428 48 375 181 428 122 b 386 -68 428 12 416 -29 b 155 -187 329 -145 236 -187 b 12 -111 92 -187 38 -162 b 0 -51 4 -91 0 -72 b 262 186 0 58 122 179 m 366 131 b 352 134 362 133 357 134 b 219 81 321 134 269 115 b 47 -111 126 23 50 -62 b 47 -112 47 -111 47 -112 b 77 -136 47 -129 58 -136 b 264 -45 118 -136 194 -101 b 382 109 336 12 382 76 b 366 131 382 120 377 129 "},noteheadBlack:{x_min:0,x_max:428.75,ha:438,o:"m 262 186 b 273 186 266 186 272 186 b 274 186 273 186 274 186 b 285 186 274 186 280 186 b 428 48 375 181 428 122 b 386 -68 428 12 416 -29 b 155 -187 329 -145 236 -187 b 12 -111 92 -187 38 -162 b 0 -51 4 -91 0 -72 b 262 186 0 58 122 179 "},noteheadXWhole:{x_min:0,x_max:598.890625,ha:611,o:"m 62 181 b 77 183 66 183 72 183 b 91 181 83 183 88 183 b 202 131 100 180 106 177 l 299 87 l 394 131 b 517 183 499 181 502 183 b 519 183 517 183 518 183 b 598 104 567 183 598 144 b 577 49 598 84 592 65 b 518 15 567 38 563 37 b 484 0 499 6 484 0 b 518 -16 484 -1 499 -8 b 577 -51 563 -38 567 -40 b 598 -105 592 -66 598 -86 b 519 -184 598 -145 567 -184 b 517 -184 518 -184 517 -184 b 394 -133 502 -184 499 -183 l 299 -88 l 202 -133 b 81 -184 99 -183 95 -184 b 77 -184 80 -184 78 -184 b 0 -105 29 -184 0 -145 b 20 -51 0 -86 5 -66 b 80 -16 29 -40 34 -38 b 114 -1 98 -8 114 -1 b 80 15 114 0 98 6 b 20 49 34 37 29 38 b 0 104 6 65 0 84 b 62 181 0 140 23 174 m 88 134 b 74 136 85 134 80 136 b 68 134 72 136 69 136 b 46 104 54 130 46 117 b 55 81 46 95 49 88 b 149 34 59 76 53 80 b 224 -1 190 15 224 0 b 144 -38 224 -1 187 -18 b 54 -84 59 -79 58 -79 b 46 -105 49 -90 46 -98 b 76 -137 46 -122 58 -137 b 78 -137 77 -137 77 -137 b 194 -86 87 -137 76 -141 b 298 -36 250 -58 298 -36 b 298 -36 298 -36 298 -36 b 402 -84 299 -36 345 -58 b 518 -137 522 -141 510 -137 b 521 -137 519 -137 519 -137 b 551 -105 539 -137 551 -122 b 541 -83 551 -98 548 -90 b 447 -36 537 -77 544 -81 b 374 -1 406 -16 374 -1 b 447 34 374 0 406 15 b 541 81 544 80 537 76 b 551 104 548 88 551 97 b 521 136 551 120 539 136 b 518 136 519 136 519 136 b 517 136 518 136 517 136 l 517 136 b 402 83 511 136 511 136 b 298 34 345 56 299 34 b 298 34 298 34 298 34 b 194 84 298 34 250 56 b 88 134 137 111 89 133 "},noteheadXHalf:{x_min:0,x_max:406.96875,ha:415,o:"m 55 181 b 70 183 61 183 66 183 b 111 170 85 183 99 179 b 160 130 115 167 137 149 l 202 95 l 245 130 b 319 181 299 176 302 179 b 334 183 325 183 330 183 b 406 109 375 183 406 148 b 401 81 406 99 405 91 b 348 24 394 65 390 59 b 318 -1 332 11 318 0 b 348 -26 318 -1 332 -12 b 401 -83 390 -61 394 -66 b 406 -111 405 -93 406 -101 b 334 -184 406 -149 375 -184 b 319 -183 330 -184 325 -184 b 245 -131 302 -180 299 -177 l 202 -97 l 160 -131 b 85 -183 107 -177 103 -180 b 70 -184 80 -184 76 -184 b 0 -111 31 -184 0 -149 b 4 -83 0 -101 1 -93 b 58 -26 10 -66 16 -61 b 88 -1 74 -12 88 -1 b 58 24 88 0 74 11 b 10 69 23 54 17 59 b 0 109 2 81 0 95 b 55 181 0 142 21 173 m 83 133 b 72 136 78 136 76 136 b 57 131 66 136 61 134 b 46 109 49 126 46 117 b 50 93 46 104 47 98 b 107 45 51 91 77 70 b 160 0 137 20 160 0 b 107 -47 160 -1 137 -22 b 50 -94 77 -72 51 -93 b 46 -111 47 -99 46 -105 b 59 -134 46 -120 50 -130 b 72 -137 62 -136 68 -137 b 83 -136 76 -137 80 -136 b 144 -84 84 -134 107 -116 b 202 -36 176 -58 202 -36 b 261 -84 202 -36 230 -58 b 323 -136 299 -116 321 -134 b 334 -137 326 -136 330 -137 b 345 -134 338 -137 343 -136 b 360 -111 355 -130 360 -120 b 355 -94 360 -105 359 -99 b 299 -47 353 -93 329 -72 b 245 0 269 -22 245 -1 b 299 45 245 0 269 20 b 355 93 329 70 353 91 b 360 109 359 98 360 104 b 345 133 360 119 355 129 b 334 136 343 134 338 136 b 323 134 330 136 326 134 b 261 83 321 133 299 115 b 202 34 230 56 202 34 b 144 83 202 34 176 56 b 83 133 106 115 84 133 "},noteheadXBlack:{x_min:0,x_max:406.96875,ha:415,o:"m 21 183 b 28 183 24 183 25 183 b 42 181 34 183 39 183 b 127 108 47 179 47 179 b 202 41 168 72 202 41 b 279 108 204 41 238 72 b 357 177 321 145 356 176 b 375 183 363 181 370 183 b 406 151 392 183 406 169 b 404 137 406 147 405 141 b 322 62 401 131 398 129 b 251 0 284 27 251 0 b 322 -63 251 -1 284 -29 b 404 -138 398 -130 401 -133 b 406 -152 405 -142 406 -148 b 375 -184 406 -170 392 -184 b 357 -179 370 -184 363 -183 b 279 -109 356 -177 321 -147 b 202 -43 238 -73 204 -43 b 127 -109 202 -43 168 -73 b 49 -179 85 -147 50 -177 b 31 -184 43 -183 36 -184 b 0 -152 13 -184 0 -170 b 2 -138 0 -148 0 -142 b 83 -63 5 -133 8 -130 b 155 0 122 -29 155 -1 b 83 62 155 0 122 27 b 8 129 43 97 10 127 b 0 151 2 136 0 144 b 21 183 0 165 8 177 "},noteheadCircleX:{x_min:0,x_max:484.5625,ha:494,o:"m 228 245 b 239 247 234 247 239 247 b 243 247 240 247 242 247 b 303 238 257 247 287 242 b 484 -2 417 208 484 104 b 412 -177 484 -65 461 -127 b 243 -248 363 -226 303 -248 b 6 -63 138 -248 36 -180 b 0 -1 1 -41 0 -20 b 228 245 0 127 98 240 m 255 181 b 240 183 247 183 245 183 b 232 181 238 183 235 183 b 142 152 200 180 168 170 l 138 149 l 190 97 l 242 44 l 294 97 l 345 149 l 340 152 b 255 181 315 169 284 180 m 147 -54 l 197 -1 l 147 51 l 95 104 l 91 99 b 62 -1 72 70 62 34 b 66 -43 62 -15 63 -29 b 91 -101 72 -63 80 -84 l 95 -106 l 147 -54 m 393 99 b 389 104 390 102 389 104 b 337 51 389 104 366 80 l 285 -1 l 337 -54 l 389 -106 l 393 -101 b 421 -1 412 -72 421 -36 b 393 99 421 34 412 69 m 294 -98 b 242 -45 265 -69 242 -45 b 190 -98 242 -45 219 -69 l 138 -151 l 142 -154 b 242 -184 172 -174 206 -184 b 340 -154 276 -184 311 -174 l 345 -151 l 294 -98 "},noteheadTriangleUpWhole:{x_min:0,x_max:630.203125,ha:643,o:"m 308 204 b 314 205 310 205 313 205 b 326 201 319 205 323 204 b 355 154 328 199 338 180 b 401 83 362 142 392 95 l 409 72 b 431 41 412 66 424 49 b 619 -174 498 -51 570 -134 b 630 -192 626 -180 630 -186 b 626 -202 630 -195 628 -199 b 616 -206 623 -205 620 -206 b 552 -188 608 -206 592 -202 b 310 -155 488 -169 392 -155 b 268 -156 295 -155 281 -155 b 77 -188 197 -161 126 -173 b 13 -206 35 -202 20 -206 b 9 -206 12 -206 10 -206 b 0 -191 2 -202 0 -197 b 8 -176 0 -186 2 -180 b 204 49 58 -136 138 -43 l 220 72 l 227 83 b 295 188 245 108 281 166 b 308 204 299 197 304 202 m 315 147 b 314 147 315 147 314 147 b 314 147 314 147 314 147 b 306 129 314 145 310 138 l 296 105 b 281 72 292 97 284 77 l 274 56 b 181 -123 247 -4 212 -72 l 174 -134 l 176 -133 b 314 -123 215 -127 272 -123 b 451 -133 356 -123 413 -127 l 454 -134 l 449 -123 b 353 56 417 -72 381 -4 l 347 72 b 332 105 344 77 336 97 l 322 129 b 315 147 318 138 315 145 "},noteheadTriangleUpHalf:{x_min:0,x_max:438.28125,ha:447,o:"m 212 205 b 219 205 213 205 216 205 b 239 183 228 205 231 204 b 421 -163 298 40 363 -83 b 438 -191 434 -180 438 -186 b 436 -197 438 -192 438 -195 b 424 -206 434 -204 431 -206 b 406 -201 420 -206 415 -205 b 216 -156 347 -172 281 -156 b 23 -205 148 -156 80 -173 b 14 -206 20 -206 17 -206 b 0 -191 6 -206 0 -201 b 6 -176 0 -187 1 -183 b 202 192 63 -104 142 45 b 212 205 205 199 208 202 m 264 48 l 249 81 l 243 94 l 242 91 b 89 -126 208 36 137 -66 b 81 -138 85 -133 81 -138 b 81 -138 81 -138 81 -138 b 81 -138 81 -138 81 -138 b 95 -133 81 -138 87 -136 b 280 -94 156 -108 221 -94 b 334 -98 299 -94 317 -95 b 343 -99 338 -99 343 -99 b 343 -99 343 -99 343 -99 b 338 -94 343 -99 341 -97 b 264 48 318 -58 287 1 "},noteheadTriangleUpBlack:{x_min:-1.359375,x_max:436.921875,ha:446,o:"m 213 205 b 217 205 215 205 216 205 b 234 194 224 205 234 199 b 236 187 234 194 235 190 l 245 167 l 261 129 l 270 106 b 355 -61 294 54 329 -13 b 420 -163 381 -105 402 -138 b 436 -188 435 -184 436 -184 b 436 -191 436 -190 436 -190 b 421 -206 436 -201 431 -206 l 421 -206 l 416 -206 l 405 -201 b 217 -158 347 -172 283 -158 b 31 -201 153 -158 88 -172 l 20 -206 l 14 -206 l 14 -206 b 0 -191 5 -206 0 -201 b -1 -188 0 -190 -1 -190 b 14 -163 -1 -186 0 -184 b 95 -34 36 -136 72 -77 b 166 106 119 8 148 68 l 175 129 l 183 148 l 200 188 b 213 205 205 199 208 202 "},noteheadDiamondWhole:{x_min:0,x_max:627.46875,ha:640,o:"m 306 190 b 314 191 308 191 311 191 b 326 184 318 191 322 190 l 336 173 b 510 52 377 127 442 80 b 515 49 513 51 515 49 b 611 16 537 40 579 24 b 627 0 624 13 627 9 b 607 -18 627 -11 624 -13 b 330 -181 490 -49 389 -109 b 314 -192 323 -190 319 -192 b 306 -191 311 -192 308 -192 b 294 -177 302 -188 302 -188 b 257 -140 287 -170 265 -148 b 19 -18 193 -84 114 -44 b 0 0 2 -13 0 -11 b 16 16 0 9 2 13 b 110 49 47 24 89 40 b 117 52 111 49 114 51 b 145 65 126 56 130 58 b 281 163 200 93 245 124 b 300 186 288 170 291 174 b 306 190 300 187 303 188 m 317 137 b 313 142 315 141 314 142 b 308 137 313 142 311 141 b 161 4 276 84 220 33 b 155 0 159 1 155 0 b 163 -4 155 0 159 -2 b 308 -138 220 -34 276 -84 b 313 -142 311 -141 313 -142 b 317 -138 314 -142 315 -141 b 464 -4 351 -84 406 -34 b 470 0 468 -2 470 0 b 464 4 470 0 468 1 b 317 137 406 33 351 84 "},noteheadDiamondHalf:{x_min:0,x_max:438.28125,ha:447,o:"m 212 190 b 219 191 213 191 216 191 b 236 176 225 191 228 190 b 419 18 277 105 341 49 b 436 5 431 13 434 11 b 438 -1 438 4 438 1 b 424 -16 438 -8 432 -13 b 356 -49 409 -20 379 -36 b 234 -180 306 -83 258 -133 b 219 -192 230 -188 224 -192 b 200 -176 213 -192 206 -187 b 9 -15 157 -102 89 -45 b 0 0 2 -12 0 -6 b 16 18 0 9 2 12 b 200 176 93 48 159 104 b 212 190 205 186 208 188 m 239 113 b 236 117 238 116 238 117 b 230 108 235 117 234 115 b 92 -15 196 58 140 8 b 88 -18 91 -16 88 -18 b 92 -20 88 -18 91 -19 b 198 -116 130 -43 166 -74 b 200 -117 200 -117 200 -117 b 201 -117 200 -117 201 -117 b 264 -43 212 -98 242 -62 b 345 15 288 -19 321 4 b 348 18 347 16 348 16 b 344 20 348 18 347 19 b 239 113 307 41 266 79 "},noteheadDiamondBlack:{x_min:0,x_max:432.828125,ha:442,o:"m 209 186 b 213 187 210 187 212 187 b 216 187 215 187 216 187 b 224 174 216 186 220 180 b 420 -1 269 105 338 43 b 432 -12 431 -8 432 -9 b 421 -23 432 -15 432 -16 b 228 -180 345 -70 264 -137 b 219 -188 221 -188 221 -188 l 219 -188 b 208 -177 215 -188 215 -188 b 10 1 163 -106 93 -44 b 0 11 0 6 0 8 b 10 22 0 13 0 15 b 202 179 87 69 167 136 b 209 186 206 183 209 186 "},augmentationDot:{x_min:0,x_max:133.390625,ha:136,o:"m 54 66 b 65 68 58 68 61 68 b 122 37 88 68 110 56 b 133 -1 130 26 133 12 b 104 -58 133 -23 123 -44 b 66 -69 92 -65 78 -69 b 10 -38 44 -69 23 -58 b 0 -1 2 -27 0 -13 b 54 66 0 30 20 61 "},tremolo1:{x_min:-206.890625,x_max:428.75,ha:438,o:"m 389 -351 b 394 -351 390 -351 393 -351 b 428 -385 413 -351 428 -367 b 428 -394 428 -388 428 -391 b 394 -428 426 -406 421 -410 l 332 -473 l 269 -516 l 205 -560 l 141 -603 l 77 -648 l 13 -692 l -50 -737 l -114 -780 l -145 -802 b -171 -813 -157 -810 -163 -813 b -175 -813 -172 -813 -174 -813 b -206 -777 -194 -811 -206 -795 b -202 -760 -206 -771 -205 -766 b -87 -675 -197 -752 -206 -757 l -34 -639 l 83 -557 l 145 -514 l 209 -470 l 272 -427 b 389 -351 375 -356 381 -352 "},flag8thUp:{x_min:-24.5,x_max:317.140625,ha:324,o:"m -24 -161 l -24 -5 l -20 -5 b 0 -24 -9 -5 -2 -12 b 171 -315 21 -124 84 -233 b 317 -660 268 -406 317 -531 b 187 -1014 317 -782 274 -909 b 161 -1034 172 -1034 171 -1034 b 141 -1013 149 -1034 141 -1025 b 152 -991 141 -1004 142 -1002 b 266 -682 228 -899 266 -788 b 174 -430 266 -588 236 -498 b -23 -317 136 -388 66 -348 b -24 -161 -23 -316 -24 -285 "},flag8thDown:{x_min:-21.78125,x_max:367.5,ha:375,o:"m 230 1031 b 238 1032 232 1032 235 1032 b 259 1014 245 1032 251 1027 b 367 662 330 906 367 782 b 364 602 367 641 367 621 b 232 317 352 488 304 384 b 57 120 155 245 103 187 b -1 18 31 84 6 40 b -19 4 -4 11 -12 4 l -21 4 l -21 159 l -21 315 l -16 315 b 96 335 10 315 62 324 b 315 695 227 380 315 527 b 313 738 315 709 314 724 b 224 991 304 825 273 916 b 216 1013 219 999 216 1007 b 230 1031 216 1021 220 1028 "},flag16thUp:{x_min:-24.5,x_max:317.140625,ha:324,o:"m -24 -147 l -24 -5 l -20 -5 b -1 -19 -12 -5 -4 -11 b 58 -123 6 -43 31 -86 b 196 -278 93 -173 134 -219 b 317 -570 274 -356 317 -460 b 294 -713 317 -617 308 -666 l 289 -724 l 294 -735 b 317 -873 308 -780 317 -827 b 235 -1132 317 -963 288 -1054 b 209 -1165 228 -1140 224 -1146 b 189 -1177 204 -1172 196 -1177 b 171 -1164 182 -1177 175 -1172 b 168 -1154 170 -1161 168 -1159 b 181 -1132 168 -1149 172 -1142 b 269 -891 238 -1064 269 -975 b 269 -881 269 -886 269 -884 b 262 -814 269 -857 265 -827 b 258 -800 261 -811 259 -806 b 142 -628 240 -731 198 -667 b -8 -589 112 -606 47 -589 b -20 -589 -13 -589 -19 -589 l -24 -589 l -24 -449 l -24 -308 l -20 -308 b -1 -322 -12 -308 -4 -313 b 58 -424 6 -345 31 -388 b 194 -580 93 -476 136 -523 b 259 -660 221 -606 245 -635 b 261 -663 259 -662 261 -663 b 264 -656 262 -663 262 -660 b 269 -587 268 -632 269 -610 b 264 -521 269 -566 268 -544 b 262 -512 264 -517 262 -513 b 258 -498 261 -509 259 -503 b 142 -326 240 -428 198 -365 b -8 -287 112 -303 47 -288 b -20 -287 -13 -287 -19 -287 l -24 -287 l -24 -147 "},flag16thDown:{x_min:-21.78125,x_max:362.0625,ha:369,o:"m 302 1031 b 308 1032 304 1032 307 1032 b 330 1016 318 1032 325 1027 b 362 867 351 970 362 920 b 340 738 362 824 353 780 l 336 727 l 340 717 b 362 591 355 677 362 634 b 257 323 362 496 325 401 b 204 272 243 306 227 290 b 20 56 129 206 66 133 b -1 18 12 44 0 22 b -19 4 -4 9 -12 4 l -21 4 l -21 140 l -21 276 l -12 277 b 167 333 61 288 127 309 b 319 598 262 388 319 491 b 311 664 319 620 317 642 l 310 673 l 304 664 b 204 548 279 620 250 587 b 20 333 129 483 66 409 b -1 292 12 320 0 298 b -19 280 -4 285 -12 280 l -21 280 l -21 416 l -21 552 l -12 553 b 167 609 61 564 127 585 b 319 874 264 666 319 770 b 294 992 319 914 311 954 b 288 1011 288 1004 288 1007 b 302 1031 288 1021 294 1028 "},flag32ndUp:{x_min:-24.5,x_max:315.78125,ha:322,o:"m -24 -145 l -24 -5 l -20 -5 b 1 -26 -10 -5 -6 -9 b 175 -241 31 -86 96 -166 b 314 -548 259 -323 304 -420 b 315 -589 315 -555 315 -571 b 314 -630 315 -606 315 -623 b 298 -730 311 -664 306 -699 l 295 -742 l 296 -748 b 314 -850 304 -778 311 -813 b 315 -892 315 -857 315 -874 b 314 -932 315 -909 315 -925 b 298 -1032 311 -967 306 -1002 l 295 -1045 l 296 -1050 b 314 -1153 304 -1081 311 -1115 b 315 -1193 315 -1160 315 -1177 b 314 -1235 315 -1211 315 -1228 b 217 -1526 306 -1338 270 -1444 b 201 -1533 213 -1532 208 -1533 b 182 -1522 193 -1533 185 -1529 b 179 -1514 181 -1518 179 -1517 b 189 -1489 179 -1508 182 -1501 b 266 -1217 240 -1403 266 -1308 b 262 -1156 266 -1196 265 -1177 b 110 -907 247 -1043 190 -950 b 0 -889 87 -895 50 -889 l -1 -889 l -24 -889 l -24 -749 l -24 -610 l -20 -610 b 1 -631 -10 -610 -6 -614 b 175 -846 31 -691 96 -771 b 259 -956 213 -884 236 -914 b 265 -966 262 -961 264 -966 b 265 -966 265 -966 265 -966 b 265 -953 265 -964 265 -959 b 266 -920 266 -943 266 -932 b 262 -853 266 -898 265 -873 b 110 -605 247 -741 190 -648 b 0 -587 87 -592 50 -587 l -1 -587 l -24 -587 l -24 -448 l -24 -308 l -20 -308 b 1 -328 -10 -308 -6 -312 b 175 -544 31 -388 96 -469 b 259 -655 213 -581 236 -612 b 265 -663 262 -659 264 -663 b 265 -663 265 -663 265 -663 b 265 -650 265 -663 265 -657 b 266 -617 266 -641 266 -630 b 262 -551 266 -595 265 -570 b 110 -303 247 -438 190 -345 b 0 -284 87 -290 50 -284 l -1 -284 l -24 -284 l -24 -145 "},flag32ndDown:{x_min:-21.78125,x_max:366.140625,ha:374,o:"m 276 1378 b 284 1379 279 1379 281 1379 b 306 1360 292 1379 298 1374 b 352 1247 326 1326 343 1286 b 366 1139 362 1213 366 1175 b 347 1009 366 1093 359 1049 l 344 1002 l 347 992 b 352 971 348 986 351 977 b 366 863 362 936 366 899 b 347 732 366 818 359 773 l 344 725 l 347 716 b 352 695 348 710 351 700 b 366 588 362 659 366 623 b 223 262 366 464 314 345 b 189 233 212 252 212 252 b 35 76 126 183 73 129 b -1 16 20 56 2 27 b -19 4 -4 9 -12 4 l -21 4 l -21 137 l -21 270 l -17 270 b 186 344 59 281 134 308 b 319 606 270 399 319 499 b 317 650 319 620 319 635 l 315 659 l 314 655 b 223 537 288 607 258 570 b 189 509 212 528 212 528 b 35 352 126 459 73 405 b -1 292 20 333 2 303 b -19 280 -4 285 -12 280 l -21 280 l -21 413 l -21 546 l -17 546 b 186 620 59 557 134 584 b 319 882 270 675 319 775 b 317 925 319 896 319 911 l 315 935 l 314 931 b 223 813 288 884 258 846 b 189 785 212 805 212 805 b 35 628 126 735 73 681 b -1 569 20 609 2 580 b -19 556 -4 562 -12 556 l -21 556 l -21 689 l -21 823 l -17 823 b 202 907 68 835 152 867 b 319 1157 280 968 319 1061 b 270 1338 319 1218 303 1281 b 262 1358 264 1349 262 1353 b 262 1364 262 1360 262 1363 b 276 1378 265 1371 269 1376 "},flag64thUp:{x_min:-24.5,x_max:314.421875,ha:321,o:"m -24 -145 l -24 -5 l -20 -5 b 0 -23 -9 -5 -2 -12 b 27 -87 4 -38 14 -66 b 138 -220 53 -136 88 -177 b 235 -328 179 -255 208 -288 b 314 -592 287 -409 314 -501 b 292 -732 314 -639 307 -687 l 289 -742 l 294 -756 b 314 -896 307 -802 314 -849 b 292 -1035 314 -943 307 -991 l 289 -1045 l 294 -1057 b 314 -1197 307 -1104 314 -1152 b 292 -1338 314 -1246 307 -1292 l 289 -1347 l 294 -1360 b 314 -1500 307 -1407 314 -1454 b 273 -1689 314 -1565 300 -1628 b 250 -1712 265 -1710 261 -1712 b 228 -1691 236 -1712 228 -1704 l 228 -1685 l 234 -1675 b 270 -1507 258 -1621 270 -1564 b 98 -1193 270 -1381 209 -1261 b 40 -1174 76 -1179 58 -1174 b -10 -1189 24 -1174 8 -1178 b -20 -1192 -14 -1192 -16 -1192 l -24 -1192 l -24 -1052 l -24 -913 l -20 -913 b 0 -931 -9 -913 -2 -920 b 27 -995 4 -946 14 -974 b 138 -1128 53 -1043 88 -1085 b 257 -1275 190 -1172 228 -1220 b 262 -1283 259 -1279 262 -1283 l 262 -1283 b 269 -1249 264 -1282 268 -1260 b 270 -1206 270 -1233 270 -1220 b 98 -891 270 -1075 206 -957 b 40 -871 76 -877 58 -871 b -10 -886 24 -871 8 -875 b -20 -889 -14 -889 -16 -889 l -24 -889 l -24 -749 l -24 -610 l -20 -610 b 0 -628 -9 -610 -2 -617 b 27 -692 4 -644 14 -671 b 138 -825 53 -741 88 -782 b 257 -973 190 -870 228 -917 b 262 -981 259 -977 262 -981 l 262 -981 b 269 -946 264 -979 268 -957 b 270 -903 270 -931 270 -917 b 98 -588 270 -774 206 -655 b 40 -569 76 -574 58 -569 b -10 -584 24 -569 8 -574 b -20 -587 -14 -587 -16 -587 l -24 -587 l -24 -448 l -24 -308 l -20 -308 b 0 -326 -9 -308 -2 -315 b 27 -390 4 -341 14 -369 b 138 -523 53 -438 88 -480 b 257 -670 190 -567 228 -614 b 262 -678 259 -674 262 -678 b 262 -678 262 -678 262 -678 b 269 -644 264 -677 268 -656 b 270 -601 270 -628 270 -614 b 98 -285 270 -471 206 -352 b 40 -266 76 -273 58 -266 b -10 -281 24 -266 8 -272 b -20 -284 -14 -284 -16 -284 l -24 -284 l -24 -145 "},flag64thDown:{x_min:-21.78125,x_max:367.5,ha:375,o:"m 259 1553 b 265 1553 261 1553 264 1553 b 288 1540 272 1553 277 1550 b 367 1351 340 1493 367 1424 b 336 1221 367 1308 357 1263 l 332 1211 l 333 1208 b 367 1077 356 1170 367 1124 b 336 945 367 1032 357 986 l 332 935 l 333 932 b 367 800 356 893 367 848 b 336 669 367 756 357 710 l 332 659 l 333 656 b 367 523 356 617 367 571 b 345 412 367 485 360 446 b 231 273 322 356 284 310 b -1 19 121 195 27 93 b -17 4 -4 11 -10 5 l -21 4 l -21 134 l -21 265 l -17 265 b 133 291 20 265 96 278 b 318 537 245 328 318 433 b 307 603 318 559 315 582 b 303 614 304 612 304 614 b 298 609 302 614 300 613 b 231 549 281 589 258 567 b -1 295 121 471 27 369 b -17 280 -4 287 -10 281 l -21 280 l -21 410 l -21 541 l -17 541 b 133 567 20 541 96 555 b 318 813 245 605 318 709 b 307 880 318 835 315 859 b 303 891 304 888 304 891 b 298 885 302 891 300 888 b 231 825 281 866 258 843 b -1 571 121 748 27 645 b -17 556 -4 563 -10 557 l -21 556 l -21 687 l -21 817 l -17 817 b 133 843 20 817 96 830 b 318 1089 245 881 318 985 b 307 1156 318 1111 315 1134 b 303 1167 304 1164 304 1167 b 298 1161 302 1167 300 1164 b 231 1102 281 1140 258 1120 b -1 848 121 1024 27 921 b -17 832 -4 839 -10 834 l -21 832 l -21 963 l -21 1093 l -17 1093 b 114 1113 12 1093 78 1103 b 313 1314 215 1142 289 1218 b 318 1364 317 1331 318 1347 b 255 1511 318 1422 295 1478 b 243 1532 247 1519 243 1525 b 259 1553 243 1540 250 1550 "},flag128thUp:{x_min:-24.5,x_max:313.0625,ha:319,o:"m -24 -133 l -24 -5 l -20 -5 b -1 -19 -12 -5 -4 -11 b 142 -213 13 -61 74 -144 b 258 -376 196 -269 230 -315 b 313 -605 295 -449 313 -528 b 292 -742 313 -652 306 -699 b 288 -752 289 -748 288 -752 b 288 -752 288 -752 288 -752 b 292 -764 289 -753 291 -757 b 313 -907 306 -811 313 -860 b 292 -1045 313 -954 306 -1002 b 288 -1054 289 -1050 288 -1054 b 288 -1054 288 -1054 288 -1054 b 292 -1067 289 -1054 291 -1060 b 313 -1210 306 -1113 313 -1161 b 292 -1346 313 -1257 306 -1304 b 288 -1357 289 -1353 288 -1357 b 288 -1357 288 -1357 288 -1357 b 292 -1368 289 -1357 291 -1363 b 313 -1512 306 -1415 313 -1464 b 292 -1648 313 -1560 306 -1605 b 288 -1660 289 -1654 288 -1660 b 288 -1660 288 -1660 288 -1660 b 292 -1671 289 -1660 291 -1665 b 313 -1814 306 -1719 313 -1766 b 250 -2040 313 -1897 291 -1977 b 232 -2062 238 -2057 236 -2059 b 221 -2065 230 -2063 225 -2065 b 200 -2045 210 -2065 201 -2057 b 200 -2043 200 -2044 200 -2044 b 208 -2026 200 -2037 202 -2034 b 269 -1826 249 -1966 269 -1897 b 153 -1544 269 -1726 230 -1625 b -9 -1472 115 -1506 58 -1481 b -21 -1471 -14 -1471 -19 -1471 l -24 -1471 l -24 -1343 l -24 -1215 l -20 -1215 b -1 -1229 -12 -1215 -4 -1221 b 142 -1424 13 -1270 74 -1353 b 257 -1582 196 -1478 228 -1524 b 264 -1594 261 -1589 264 -1594 l 264 -1594 b 265 -1582 264 -1594 264 -1589 b 270 -1525 268 -1562 270 -1544 b 153 -1243 270 -1424 228 -1321 b -9 -1170 115 -1203 58 -1178 b -21 -1168 -14 -1170 -19 -1168 l -24 -1168 l -24 -1041 l -24 -913 l -20 -913 b -1 -927 -12 -913 -4 -918 b 142 -1121 13 -967 74 -1050 b 257 -1281 196 -1175 228 -1221 b 264 -1292 261 -1286 264 -1292 l 264 -1292 b 265 -1279 264 -1292 264 -1286 b 270 -1222 268 -1261 270 -1242 b 153 -941 270 -1121 228 -1018 b -9 -867 115 -900 58 -875 b -21 -866 -14 -867 -19 -866 l -24 -866 l -24 -738 l -24 -610 l -20 -610 b -1 -624 -12 -610 -4 -616 b 142 -818 13 -664 74 -749 b 257 -978 196 -873 228 -918 b 264 -989 261 -984 264 -989 l 264 -989 b 265 -977 264 -989 264 -984 b 270 -920 268 -959 270 -939 b 153 -638 270 -818 228 -716 b -9 -564 115 -598 58 -573 b -21 -563 -14 -564 -19 -563 l -24 -563 l -24 -435 l -24 -308 l -20 -308 b -1 -322 -12 -308 -4 -313 b 142 -516 13 -363 74 -446 b 257 -675 196 -571 228 -616 b 264 -687 261 -681 264 -687 l 264 -687 b 265 -674 264 -687 264 -681 b 270 -617 268 -656 270 -637 b 153 -335 270 -516 228 -413 b -9 -262 115 -295 58 -270 b -21 -260 -14 -262 -19 -260 l -24 -260 l -24 -133 "},flag128thDown:{x_min:-21.78125,x_max:367.5,ha:375,o:"m 276 1900 b 284 1901 279 1900 281 1901 b 306 1883 291 1901 298 1896 b 367 1686 347 1825 367 1757 b 343 1558 367 1643 359 1600 l 338 1549 l 343 1537 b 367 1411 359 1497 367 1454 b 343 1282 367 1367 359 1324 l 338 1272 l 343 1261 b 367 1135 359 1221 367 1178 b 343 1007 367 1090 359 1047 l 338 996 l 343 985 b 367 859 359 945 367 902 b 343 731 367 814 359 771 l 338 720 l 343 709 b 367 582 359 667 367 626 b 289 362 367 503 340 426 b 239 312 276 345 259 330 b 29 77 152 237 76 152 b -1 18 14 54 2 30 b -19 4 -4 11 -12 4 l -21 4 l -21 133 l -20 260 l -13 262 b 98 299 17 269 62 284 b 111 305 103 302 110 305 b 167 334 123 310 156 327 b 319 595 264 391 319 491 b 313 659 319 616 318 638 b 310 667 311 664 311 667 b 307 663 310 667 308 666 b 240 588 289 637 269 614 b 16 331 141 505 62 413 b -1 294 8 316 1 302 b -19 280 -4 287 -12 280 l -21 280 l -21 408 l -20 537 l -13 538 b 98 576 17 545 62 560 b 111 581 103 578 110 581 b 167 610 123 587 156 603 b 319 871 264 667 319 767 b 313 935 319 892 318 913 b 310 942 311 941 311 942 b 307 939 310 942 308 941 b 240 864 289 913 269 889 b 16 607 141 781 62 689 b -1 570 8 592 1 578 b -19 556 -4 563 -12 556 l -21 556 l -21 684 l -20 813 l -13 814 b 98 852 17 821 62 836 b 111 857 103 855 110 857 b 167 886 123 863 156 880 b 319 1147 264 943 319 1043 b 313 1211 319 1168 318 1189 b 310 1218 311 1217 311 1218 b 307 1215 310 1218 308 1217 b 240 1140 289 1188 269 1165 b 16 884 141 1057 62 966 b -1 846 8 868 1 855 b -19 832 -4 839 -12 832 l -21 832 l -21 960 l -20 1089 l -13 1090 b 98 1128 17 1097 62 1111 b 111 1134 103 1131 110 1134 b 167 1163 123 1139 156 1156 b 319 1424 264 1220 319 1320 b 313 1486 319 1444 318 1465 b 310 1494 311 1493 311 1494 b 307 1492 310 1494 308 1493 b 240 1417 289 1464 269 1442 b 16 1160 141 1333 62 1242 b -1 1121 8 1145 1 1131 b -19 1109 -4 1115 -12 1109 l -21 1109 l -21 1236 l -20 1365 l -13 1367 b 98 1404 17 1374 62 1388 b 111 1410 103 1407 110 1410 b 250 1508 172 1437 215 1467 b 319 1701 296 1564 319 1633 b 270 1859 319 1757 303 1814 b 262 1882 265 1868 262 1875 b 276 1900 262 1890 266 1896 "},accidentalFlat:{x_min:-21.78125,x_max:251.8125,ha:257,o:"m -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 383 20 616 20 616 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 201 l -21 616 l -20 620 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 "},accidentalNatural:{x_min:0,x_max:239.5625,ha:244,o:"m 10 460 b 20 462 13 462 14 462 b 39 449 28 462 35 458 l 40 446 l 40 326 b 40 205 40 259 40 205 b 127 227 40 205 80 215 b 220 249 196 244 213 249 b 227 247 224 249 225 248 b 238 237 231 245 235 241 l 239 233 l 239 -106 l 239 -448 l 238 -451 b 219 -463 234 -459 225 -463 b 198 -451 210 -463 202 -459 l 197 -448 l 197 -324 b 197 -201 197 -248 197 -201 b 110 -223 196 -201 157 -210 b 17 -245 42 -240 24 -245 b 10 -242 13 -245 13 -244 b 0 -233 6 -241 2 -237 l 0 -230 l 0 108 l 0 446 l 0 449 b 10 460 2 453 6 458 m 197 22 b 197 70 197 41 197 58 b 196 116 197 113 197 116 l 196 116 b 118 97 196 116 160 106 l 40 77 l 40 -18 b 40 -112 40 -69 40 -112 l 119 -93 l 197 -73 l 197 22 "},accidentalSharp:{x_min:0,x_max:323.9375,ha:331,o:"m 217 535 b 225 537 220 537 221 537 b 245 524 235 537 242 533 l 246 521 l 247 390 l 247 258 l 273 265 b 306 270 288 269 299 270 b 322 259 315 270 319 267 b 323 208 323 256 323 233 b 322 158 323 184 323 159 b 288 140 318 148 315 147 b 247 130 254 131 247 130 b 247 65 247 130 247 104 b 247 20 247 51 247 36 l 247 -88 l 273 -81 b 306 -76 289 -77 299 -76 b 318 -81 311 -76 315 -77 b 323 -123 323 -87 323 -86 l 323 -138 l 323 -154 b 318 -195 323 -191 323 -190 b 269 -210 314 -199 315 -199 b 249 -216 259 -213 250 -216 l 247 -216 l 247 -349 l 246 -483 l 245 -487 b 225 -499 242 -495 234 -499 b 206 -487 219 -499 210 -495 l 205 -483 l 205 -355 l 205 -227 l 204 -227 l 181 -233 l 138 -244 b 117 -249 127 -247 117 -249 b 115 -385 115 -249 115 -256 l 115 -523 l 114 -526 b 95 -538 110 -534 102 -538 b 74 -526 87 -538 78 -534 l 73 -523 l 73 -391 b 72 -260 73 -269 73 -260 b 72 -260 72 -260 72 -260 b 19 -273 61 -263 23 -273 b 0 -260 10 -273 4 -267 b 0 -209 0 -256 0 -256 l 0 -162 l 1 -158 b 61 -134 5 -148 5 -148 l 73 -131 l 73 -22 b 72 86 73 79 73 86 b 72 86 72 86 72 86 b 19 74 61 83 23 74 b 0 86 10 74 4 79 b 0 137 0 90 0 90 l 0 184 l 1 188 b 61 212 5 198 5 198 l 73 215 l 73 348 l 73 481 l 74 485 b 95 498 78 492 87 498 b 103 495 98 498 100 496 b 114 485 107 494 111 489 l 115 481 l 115 353 l 115 226 l 121 226 b 159 235 123 227 141 231 l 198 247 l 205 248 l 205 384 l 205 521 l 206 524 b 217 535 209 528 212 533 m 205 9 b 205 119 205 70 205 119 l 205 119 b 182 113 204 119 194 116 l 138 102 b 117 97 127 99 117 97 b 115 -12 115 97 115 91 l 115 -122 l 121 -120 b 159 -111 123 -119 141 -115 l 198 -101 l 205 -98 l 205 9 "},accidentalDoubleSharp:{x_min:0,x_max:367.5,ha:375,o:"m 0 124 l 0 187 l 61 187 l 122 187 l 122 138 l 122 91 l 153 61 l 183 30 l 213 61 l 243 91 l 243 138 l 243 187 l 306 187 l 367 187 l 367 124 l 367 61 l 321 61 l 274 61 l 243 30 l 213 0 l 243 -31 l 274 -62 l 321 -62 l 367 -62 l 367 -124 l 367 -188 l 306 -188 l 243 -188 l 243 -140 l 243 -93 l 213 -62 l 183 -31 l 153 -62 l 122 -93 l 122 -140 l 122 -188 l 61 -188 l 0 -188 l 0 -124 l 0 -62 l 46 -62 l 92 -62 l 123 -31 l 153 0 l 123 30 l 92 61 l 46 61 l 0 61 l 0 124 "},accidentalDoubleFlat:{x_min:-21.78125,x_max:483.1875,ha:493,o:"m -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 383 20 616 20 616 l 20 148 l 21 151 b 140 199 59 183 102 199 b 206 179 164 199 187 192 l 210 176 l 210 396 l 210 617 l 212 621 b 231 632 216 628 223 632 b 250 620 239 632 247 628 b 251 383 251 616 251 616 l 251 148 l 254 151 b 370 199 291 183 332 199 b 415 191 385 199 400 197 b 483 84 458 176 483 134 b 461 0 483 58 476 29 b 332 -142 439 -40 411 -72 l 255 -215 b 231 -229 240 -229 239 -229 b 216 -223 224 -229 220 -227 b 210 -158 210 -217 210 -223 b 210 -120 210 -148 210 -136 l 210 -29 l 205 -34 b 100 -142 182 -65 159 -88 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 201 l -21 616 l -20 620 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 m 341 131 b 328 133 337 133 332 133 b 322 133 326 133 323 133 b 257 87 296 129 273 113 l 251 80 l 251 -37 l 251 -156 l 255 -152 b 375 81 328 -72 375 20 l 375 83 b 341 131 375 113 367 126 "},accidentalParensLeft:{x_min:-166.0625,x_max:-25.859375,ha:0,o:"m -49 369 b -42 370 -46 369 -44 370 b -27 360 -36 370 -29 366 b -25 355 -27 359 -25 358 b -32 335 -25 351 -28 347 b -92 52 -66 248 -87 159 b -93 -1 -93 43 -93 20 b -92 -54 -93 -23 -93 -45 b -32 -337 -85 -162 -66 -251 b -25 -355 -27 -349 -25 -352 b -42 -371 -25 -365 -32 -371 b -61 -353 -50 -371 -51 -369 b -163 -63 -119 -262 -153 -165 b -166 -1 -166 -37 -166 -31 b -163 62 -166 30 -166 36 b -61 352 -153 163 -119 260 b -49 369 -54 365 -51 366 "},accidentalParensRight:{x_min:25.859375,x_max:164.6875,ha:168,o:"m 34 369 b 40 370 35 370 38 370 b 59 353 49 370 50 367 b 164 40 122 254 155 158 b 164 0 164 33 164 16 b 164 -40 164 -16 164 -34 b 59 -353 155 -158 122 -254 b 40 -371 53 -366 47 -371 b 34 -370 38 -371 36 -370 b 25 -358 28 -367 25 -363 b 31 -337 25 -352 27 -347 b 92 0 72 -234 92 -117 b 31 335 92 116 72 233 b 25 356 27 345 25 352 b 34 369 25 363 28 366 "},accidentalQuarterToneFlatStein:{x_min:0,x_max:272.21875,ha:278,o:"m 243 631 b 250 632 246 632 249 632 b 270 620 259 632 268 628 l 272 616 l 272 201 l 272 -212 l 270 -216 b 251 -229 268 -224 259 -229 b 227 -215 243 -229 240 -229 l 151 -142 b 32 -16 81 -80 53 -49 b 0 84 9 18 0 52 b 111 199 0 149 42 199 b 137 197 119 199 127 198 b 228 151 168 191 197 177 l 231 148 l 231 383 b 232 620 231 616 231 616 b 243 631 234 624 238 630 m 168 131 b 152 133 163 133 157 133 b 107 102 130 133 111 120 b 106 86 107 97 106 91 b 111 41 106 73 108 56 b 227 -152 125 -13 171 -90 l 231 -156 l 231 -37 l 231 80 l 225 87 b 168 131 210 111 190 126 "},accidentalThreeQuarterTonesFlatZimmermann:{x_min:0,x_max:607.0625,ha:619,o:"m 243 631 b 250 632 246 632 249 632 b 270 620 259 632 268 628 l 272 616 l 272 201 l 272 -212 l 270 -216 b 251 -229 268 -224 259 -229 b 227 -215 243 -229 240 -229 l 151 -142 b 32 -16 81 -80 53 -49 b 0 84 9 18 0 52 b 111 199 0 149 42 199 b 137 197 119 199 127 198 b 228 151 168 191 197 177 l 231 148 l 231 383 b 232 620 231 616 231 616 b 243 631 234 624 238 630 m 168 131 b 152 133 163 133 157 133 b 107 102 130 133 111 120 b 106 86 107 97 106 91 b 111 41 106 73 108 56 b 227 -152 125 -13 171 -90 l 231 -156 l 231 -37 l 231 80 l 225 87 b 168 131 210 111 190 126 m 347 631 b 353 632 348 632 351 632 b 374 620 363 632 371 628 b 375 383 375 616 375 616 l 375 148 l 377 151 b 492 199 415 183 454 199 b 537 191 507 199 522 197 b 607 84 582 176 607 134 b 583 0 607 58 598 29 b 455 -142 562 -40 533 -72 l 378 -215 b 355 -229 364 -229 362 -229 b 334 -216 345 -229 337 -224 l 333 -212 l 333 201 l 333 616 l 334 620 b 347 631 337 624 341 630 m 465 131 b 451 133 461 133 455 133 b 445 133 449 133 446 133 b 379 87 419 129 396 113 l 375 80 l 375 -37 l 375 -156 l 378 -152 b 499 81 451 -72 499 20 l 499 83 b 465 131 499 113 490 126 "},accidentalQuarterToneSharpStein:{x_min:0,x_max:193.28125,ha:197,o:"m 85 514 b 95 517 88 517 89 517 b 114 505 103 517 110 513 l 115 502 l 115 376 b 115 249 115 306 115 249 b 141 258 117 249 127 252 l 167 266 l 172 266 b 190 254 181 265 187 262 l 193 251 l 193 202 l 193 188 b 187 147 193 149 191 152 b 147 130 183 142 182 141 l 115 119 l 115 9 b 115 -99 115 -51 115 -99 b 141 -91 115 -99 127 -95 b 171 -81 166 -81 167 -81 l 171 -81 b 191 -94 181 -81 189 -87 b 193 -142 191 -97 193 -120 b 191 -195 193 -167 191 -194 b 125 -227 187 -205 187 -204 l 115 -230 l 115 -366 l 115 -503 l 114 -506 b 95 -519 110 -514 102 -519 b 74 -506 87 -519 78 -514 l 73 -503 l 73 -374 b 73 -245 73 -260 73 -245 b 73 -245 73 -245 73 -245 b 55 -252 72 -245 63 -249 l 32 -260 b 19 -263 27 -262 23 -263 b 4 -256 13 -263 8 -260 b 0 -215 0 -251 0 -254 b 0 -199 0 -210 0 -206 l 0 -152 l 1 -149 b 8 -140 2 -145 5 -141 b 42 -127 9 -140 24 -133 l 73 -116 l 73 -5 b 73 23 73 4 73 15 b 73 105 73 70 73 105 b 49 97 73 105 61 101 b 17 88 32 91 23 88 b 4 95 10 88 8 91 b 0 137 0 101 0 98 b 0 151 0 141 0 145 l 0 199 l 1 202 b 43 224 5 212 5 212 l 73 234 l 73 367 l 73 502 l 74 505 b 85 514 77 509 81 513 "},accidentalThreeQuarterTonesSharpStein:{x_min:-1.359375,x_max:455.96875,ha:465,o:"m 352 541 b 357 542 353 542 355 542 b 377 530 364 542 372 537 l 378 526 l 378 394 l 379 262 l 404 266 b 436 270 420 269 430 270 b 450 265 443 270 446 269 b 455 220 455 259 455 260 l 455 208 l 455 161 l 454 156 b 411 140 449 147 447 147 b 378 133 393 137 379 134 b 378 68 378 133 378 106 b 378 22 378 54 378 38 l 379 -87 l 404 -83 b 436 -79 420 -80 430 -79 b 450 -84 443 -79 446 -80 b 455 -129 455 -90 455 -88 l 455 -141 l 455 -188 l 454 -192 b 413 -209 449 -202 447 -202 b 382 -215 398 -212 383 -215 l 378 -215 l 378 -345 l 378 -380 b 375 -485 378 -484 378 -480 b 357 -494 371 -491 364 -494 b 340 -485 351 -494 344 -491 b 336 -383 337 -480 336 -484 l 336 -349 l 336 -223 l 334 -223 b 291 -231 334 -223 314 -227 l 247 -240 l 247 -371 l 246 -503 l 245 -506 b 225 -519 242 -514 234 -519 b 206 -506 219 -519 210 -514 l 205 -503 l 205 -376 l 205 -248 l 160 -256 l 115 -265 l 115 -396 l 115 -527 l 114 -531 b 95 -544 110 -539 102 -544 b 76 -531 87 -544 78 -539 l 73 -527 l 73 -399 b 73 -273 73 -330 73 -273 b 49 -277 73 -273 61 -274 b 17 -281 32 -280 24 -281 b 4 -276 10 -281 8 -280 b -1 -234 0 -269 -1 -272 b 0 -219 -1 -229 0 -224 l 0 -170 l 1 -167 b 10 -158 2 -163 6 -159 b 49 -149 13 -156 16 -155 l 73 -145 l 73 -34 b 73 76 73 26 73 76 b 49 72 73 76 61 74 b 17 68 32 69 24 68 b 4 73 10 68 8 69 b -1 115 0 80 -1 77 b 0 130 -1 120 0 124 l 0 179 l 1 181 b 10 191 2 186 6 190 b 49 199 13 192 16 194 l 73 204 l 73 338 b 73 374 73 352 73 365 b 77 483 73 484 73 477 b 95 492 81 489 88 492 b 111 483 100 492 107 489 b 115 378 115 477 115 483 l 115 342 b 117 212 115 223 115 212 b 204 229 117 212 200 227 l 205 229 l 205 365 l 205 502 l 206 505 b 225 517 210 513 219 517 b 245 505 234 517 242 513 l 246 502 l 247 369 l 247 237 l 249 237 b 336 254 253 238 336 254 b 337 390 336 254 337 302 l 337 526 l 338 530 b 352 541 341 535 347 539 m 336 15 b 336 126 336 102 336 126 l 336 126 b 291 117 336 126 315 122 l 247 109 l 247 -1 l 247 -112 l 249 -112 b 336 -95 253 -111 336 -95 b 336 15 336 -95 336 -56 m 205 -120 b 205 -55 205 -120 205 -93 b 205 -9 205 -41 205 -24 l 205 101 l 160 93 l 115 84 l 115 -26 b 115 -83 115 -49 115 -69 b 117 -137 115 -133 115 -137 b 205 -120 118 -137 204 -120 "},accidentalBuyukMucennebFlat:{x_min:-171.5,x_max:251.8125,ha:257,o:"m -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 553 20 616 20 614 b 20 491 20 503 20 491 l 20 491 b 153 535 47 501 149 535 b 174 514 167 535 174 524 b 164 496 174 508 171 501 b 92 470 164 495 132 484 l 20 445 l 20 390 b 20 363 20 378 20 370 b 20 333 20 340 20 333 l 20 333 b 153 377 47 344 149 377 b 174 356 167 377 174 367 b 164 338 174 349 171 342 b 92 312 164 338 132 326 l 20 288 l 20 219 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 30 -21 -212 -21 -212 b -21 273 -21 163 -21 273 b -84 252 -21 273 -50 263 b -152 230 -133 234 -145 230 b -157 231 -155 230 -156 231 b -171 252 -166 234 -171 244 b -160 270 -171 259 -167 266 b -27 316 -159 270 -93 294 l -21 319 l -21 374 b -21 431 -21 406 -21 431 b -84 409 -21 431 -50 421 b -152 388 -133 392 -145 388 b -157 390 -155 388 -156 388 b -171 409 -166 392 -171 401 b -160 428 -171 417 -167 424 b -27 474 -159 428 -93 451 l -21 476 l -21 546 b -20 620 -21 614 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 "},accidentalBakiyeFlat:{x_min:-176.9375,x_max:251.8125,ha:257,o:"m -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 503 20 616 20 614 b 20 391 20 442 20 391 b 84 424 20 391 49 406 l 147 456 l 152 456 b 153 456 153 456 153 456 b 175 435 166 456 175 446 b 172 427 175 433 174 430 b 92 380 170 420 172 421 l 20 342 l 20 245 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 54 -21 -212 -21 -212 b -21 322 -21 201 -21 322 b -85 290 -21 322 -50 308 l -148 256 l -153 256 b -155 256 -155 256 -155 256 b -176 277 -167 256 -176 266 b -174 285 -176 280 -175 283 b -93 333 -171 294 -174 292 l -21 370 l -21 494 b -20 620 -21 616 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 "},accidentalKomaSharp:{x_min:-1.359375,x_max:455.96875,ha:465,o:"m 352 541 b 357 542 353 542 355 542 b 377 530 364 542 372 537 l 378 526 l 378 394 l 379 262 l 404 266 b 436 270 420 269 430 270 b 450 265 443 270 446 269 b 455 220 455 259 455 260 l 455 208 l 455 161 l 454 156 b 411 140 449 147 447 147 b 378 133 393 137 379 134 b 378 68 378 133 378 106 b 378 22 378 54 378 38 l 379 -87 l 404 -83 b 436 -79 420 -80 430 -79 b 450 -84 443 -79 446 -80 b 455 -129 455 -90 455 -88 l 455 -141 l 455 -188 l 454 -192 b 413 -209 449 -202 447 -202 b 382 -215 398 -212 383 -215 l 378 -215 l 378 -345 l 378 -380 b 375 -485 378 -484 378 -480 b 357 -494 371 -491 364 -494 b 340 -485 351 -494 344 -491 b 336 -383 337 -480 336 -484 l 336 -349 l 336 -223 l 334 -223 b 291 -231 334 -223 314 -227 l 247 -240 l 247 -371 l 246 -503 l 245 -506 b 225 -519 242 -514 234 -519 b 206 -506 219 -519 210 -514 l 205 -503 l 205 -376 l 205 -248 l 160 -256 l 115 -265 l 115 -396 l 115 -527 l 114 -531 b 95 -544 110 -539 102 -544 b 76 -531 87 -544 78 -539 l 73 -527 l 73 -399 b 73 -273 73 -330 73 -273 b 49 -277 73 -273 61 -274 b 17 -281 32 -280 24 -281 b 4 -276 10 -281 8 -280 b -1 -234 0 -269 -1 -272 b 0 -219 -1 -229 0 -224 l 0 -170 l 1 -167 b 10 -158 2 -163 6 -159 b 49 -149 13 -156 16 -155 l 73 -145 l 73 -34 b 73 76 73 26 73 76 b 49 72 73 76 61 74 b 17 68 32 69 24 68 b 4 73 10 68 8 69 b -1 115 0 80 -1 77 b 0 130 -1 120 0 124 l 0 179 l 1 181 b 10 191 2 186 6 190 b 49 199 13 192 16 194 l 73 204 l 73 338 b 73 374 73 352 73 365 b 77 483 73 484 73 477 b 95 492 81 489 88 492 b 111 483 100 492 107 489 b 115 378 115 477 115 483 l 115 342 b 117 212 115 223 115 212 b 204 229 117 212 200 227 l 205 229 l 205 365 l 205 502 l 206 505 b 225 517 210 513 219 517 b 245 505 234 517 242 513 l 246 502 l 247 369 l 247 237 l 249 237 b 336 254 253 238 336 254 b 337 390 336 254 337 302 l 337 526 l 338 530 b 352 541 341 535 347 539 m 336 15 b 336 126 336 102 336 126 l 336 126 b 291 117 336 126 315 122 l 247 109 l 247 -1 l 247 -112 l 249 -112 b 336 -95 253 -111 336 -95 b 336 15 336 -95 336 -56 m 205 -120 b 205 -55 205 -120 205 -93 b 205 -9 205 -41 205 -24 l 205 101 l 160 93 l 115 84 l 115 -26 b 115 -83 115 -49 115 -69 b 117 -137 115 -133 115 -137 b 205 -120 118 -137 204 -120 "},accidentalKucukMucennebSharp:{x_min:-1.359375,x_max:255.890625,ha:261,o:"m 118 514 b 127 517 121 517 122 517 b 147 505 136 517 142 513 l 148 502 l 148 403 b 148 306 148 351 148 306 b 174 315 149 306 160 310 l 200 324 l 205 323 b 223 312 213 323 220 319 l 225 308 l 225 260 b 225 245 225 255 225 249 b 220 204 225 208 224 209 b 179 188 216 199 215 199 l 148 177 l 148 124 l 148 70 l 189 84 b 236 98 219 94 230 98 b 247 94 240 98 243 97 b 255 52 254 88 255 87 b 255 33 255 47 255 40 l 254 -12 l 253 -15 b 249 -22 253 -18 250 -20 l 245 -24 l 196 -41 l 148 -58 l 148 -108 b 148 -158 148 -136 148 -158 b 174 -148 148 -158 160 -154 b 204 -140 198 -140 200 -140 l 204 -140 b 224 -152 213 -140 221 -145 b 225 -201 224 -155 225 -177 b 224 -254 225 -226 224 -251 b 157 -284 220 -262 220 -262 l 148 -288 l 148 -395 l 148 -503 l 147 -506 b 127 -519 142 -514 134 -519 b 107 -506 119 -519 111 -514 l 106 -503 l 106 -403 b 106 -303 106 -316 106 -303 b 104 -303 104 -303 104 -303 b 88 -310 104 -303 96 -306 l 63 -319 b 51 -322 59 -320 55 -322 b 36 -315 46 -322 40 -319 b 31 -273 32 -309 31 -312 b 31 -258 31 -269 31 -263 l 31 -210 l 34 -206 b 40 -198 35 -204 38 -199 b 74 -186 42 -197 57 -191 l 106 -173 l 106 -123 b 106 -97 106 -112 106 -104 b 106 -72 106 -76 106 -72 b 104 -72 106 -72 106 -72 b 20 -99 89 -79 23 -99 b 0 -84 10 -99 2 -93 b -1 -37 0 -81 -1 -59 b 0 11 -1 -15 0 9 b 58 40 4 22 2 22 l 106 56 l 106 109 b 106 123 106 115 106 119 b 106 162 106 147 106 162 b 81 155 106 162 93 159 b 50 147 65 149 55 147 b 36 152 43 147 40 148 b 31 194 32 158 31 156 b 31 209 31 198 31 204 l 31 256 l 34 260 b 76 281 38 269 38 269 l 106 292 l 106 396 l 106 502 l 107 505 b 118 514 110 509 114 513 "},articAccentAbove:{x_min:-348.4375,x_max:24.5,ha:25,o:"m -330 155 b -322 156 -329 156 -326 156 b -315 156 -319 156 -317 156 b -298 147 -311 155 -308 154 b -19 30 -224 98 -122 55 l 2 26 b 24 -1 17 22 24 13 b 2 -27 24 -15 17 -23 l -19 -31 b -298 -148 -122 -56 -224 -99 b -322 -158 -313 -158 -315 -158 b -348 -131 -338 -158 -348 -145 b -344 -117 -348 -127 -347 -122 b -328 -104 -341 -112 -338 -111 b -127 -8 -269 -65 -202 -33 b -106 0 -115 -4 -106 -1 b -127 6 -106 0 -115 2 b -328 102 -202 31 -269 63 b -344 116 -338 109 -341 111 b -348 130 -347 120 -348 124 b -330 155 -348 141 -341 152 "},articAccentBelow:{x_min:-348.4375,x_max:24.5,ha:25,o:"m -330 155 b -322 156 -329 156 -326 156 b -315 156 -319 156 -317 156 b -298 147 -311 155 -308 154 b -19 30 -224 98 -122 55 l 2 26 b 24 -1 17 22 24 13 b 2 -27 24 -15 17 -23 l -19 -31 b -298 -148 -122 -56 -224 -99 b -322 -158 -313 -158 -315 -158 b -348 -131 -338 -158 -348 -145 b -344 -117 -348 -127 -347 -122 b -328 -104 -341 -112 -338 -111 b -127 -8 -269 -65 -202 -33 b -106 0 -115 -4 -106 -1 b -127 6 -106 0 -115 2 b -328 102 -202 31 -269 63 b -344 116 -338 109 -341 111 b -348 130 -347 120 -348 124 b -330 155 -348 141 -341 152 "},articTenutoAbove:{x_min:0,x_max:318.5,ha:325,o:"m 20 376 b 167 377 23 377 96 377 b 296 376 231 377 294 377 b 318 347 311 371 318 359 b 296 316 318 333 311 320 b 159 315 294 315 227 315 b 21 316 91 315 24 315 b 0 345 6 320 0 333 b 20 376 0 359 6 371 "},articTenutoBelow:{x_min:0,x_max:318.5,ha:325,o:"m 20 376 b 167 377 23 377 96 377 b 296 376 231 377 294 377 b 318 347 311 371 318 359 b 296 316 318 333 311 320 b 159 315 294 315 227 315 b 21 316 91 315 24 315 b 0 345 6 320 0 333 b 20 376 0 359 6 371 "},articStaccatoAbove:{x_min:0,x_max:133.390625,ha:136,o:"m 54 66 b 65 68 58 68 61 68 b 122 37 88 68 110 56 b 133 -1 130 26 133 12 b 104 -58 133 -23 123 -44 b 66 -69 92 -65 78 -69 b 10 -38 44 -69 23 -58 b 0 -1 2 -27 0 -13 b 54 66 0 30 20 61 "},articStaccatoBelow:{x_min:0,x_max:133.390625,ha:136,o:"m 54 66 b 65 68 58 68 61 68 b 122 37 88 68 110 56 b 133 -1 130 26 133 12 b 104 -58 133 -23 123 -44 b 66 -69 92 -65 78 -69 b 10 -38 44 -69 23 -58 b 0 -1 2 -27 0 -13 b 54 66 0 30 20 61 "},articStaccatissimoAbove:{x_min:-73.5,x_max:72.140625,ha:74,o:"m -72 252 l -73 254 l 0 254 l 72 254 l 70 252 b 0 -1 70 248 0 -1 b -72 252 -1 -1 -72 248 "},articStaccatissimoBelow:{x_min:-73.5,x_max:72.140625,ha:74,o:"m -72 252 l -73 254 l 0 254 l 72 254 l 70 252 b 0 -1 70 248 0 -1 b -72 252 -1 -1 -72 248 "},articMarcatoAbove:{x_min:-149.71875,x_max:148.359375,ha:151,o:"m -8 -1 b -1 0 -5 -1 -4 0 b 16 -11 5 0 13 -4 b 83 -186 17 -12 47 -90 l 148 -358 l 148 -363 b 127 -385 148 -376 138 -385 b 112 -378 122 -385 118 -383 b 54 -226 110 -374 114 -385 b 0 -81 24 -147 0 -81 b -55 -226 -1 -81 -25 -147 b -114 -378 -115 -385 -111 -374 b -129 -385 -119 -383 -123 -385 b -149 -363 -140 -385 -149 -376 l -149 -358 l -84 -186 b -19 -11 -49 -90 -19 -12 b -8 -1 -17 -8 -12 -4 "},articMarcatoBelow:{x_min:-149.71875,x_max:148.359375,ha:151,o:"m -8 -1 b -1 0 -5 -1 -4 0 b 16 -11 5 0 13 -4 b 83 -186 17 -12 47 -90 l 148 -358 l 148 -363 b 127 -385 148 -376 138 -385 b 112 -378 122 -385 118 -383 b 54 -226 110 -374 114 -385 b 0 -81 24 -147 0 -81 b -55 -226 -1 -81 -25 -147 b -114 -378 -115 -385 -111 -374 b -129 -385 -119 -383 -123 -385 b -149 -363 -140 -385 -149 -376 l -149 -358 l -84 -186 b -19 -11 -49 -90 -19 -12 b -8 -1 -17 -8 -12 -4 "},fermataAbove:{x_min:-442.359375,x_max:441,ha:450,o:"m -31 487 b -1 488 -21 488 -10 488 b 434 104 216 488 397 330 b 441 27 438 79 441 47 b 439 12 441 20 439 15 b 419 0 435 4 427 0 b 404 5 413 0 408 1 b 398 30 400 11 398 13 b 0 351 390 213 213 351 b -59 348 -20 351 -39 349 b -400 30 -251 324 -393 191 b -405 5 -400 13 -401 11 b -420 0 -409 1 -415 0 b -441 12 -428 0 -436 4 b -442 27 -441 15 -442 20 b -435 104 -442 47 -439 79 b -31 487 -401 316 -235 474 m -13 131 b -1 133 -9 133 -5 133 b 51 105 19 133 39 123 b 61 70 58 95 61 83 b 51 34 61 58 58 45 b -1 6 39 16 19 6 b -46 27 -17 6 -34 13 b -62 69 -57 38 -62 54 b -13 131 -62 98 -44 124 "},fermataBelow:{x_min:-441,x_max:439.640625,ha:449,o:"m -428 -2 b -421 0 -427 -1 -424 0 b -406 -6 -416 0 -409 -2 b -400 -31 -401 -12 -400 -15 b -1 -352 -392 -215 -215 -352 b 58 -349 19 -352 38 -351 b 398 -31 250 -326 392 -192 b 404 -6 398 -15 400 -12 b 419 -1 408 -2 413 -1 b 439 -13 427 -1 435 -5 b 439 -29 439 -16 439 -22 b 434 -105 439 -48 438 -80 b 0 -489 397 -333 213 -489 b -68 -484 -23 -489 -44 -488 b -441 -36 -280 -452 -436 -263 b -441 -30 -441 -34 -441 -31 b -428 -2 -441 -11 -439 -5 m -13 -9 b -1 -8 -9 -8 -5 -8 b 50 -36 19 -8 39 -19 b 61 -72 57 -47 61 -59 b 50 -106 61 -84 57 -97 b -1 -134 39 -124 19 -134 b -46 -115 -17 -134 -34 -129 b -62 -72 -57 -102 -62 -87 b -13 -9 -62 -44 -44 -16 "},breathMarkComma:{x_min:-1.359375,x_max:193.28125,ha:197,o:"m 78 233 b 87 233 81 233 84 233 b 187 140 132 233 174 195 b 193 102 190 127 193 115 b 43 -113 193 22 136 -62 b 27 -119 36 -116 31 -119 b 19 -108 21 -119 19 -115 b 29 -97 19 -102 20 -101 b 102 13 73 -72 102 -27 b 92 51 102 26 98 40 l 91 54 l 84 54 b 8 104 53 54 21 74 b -1 142 1 116 -1 130 b 78 233 -1 187 31 227 "},breathMarkUpbow:{x_min:-170.140625,x_max:168.78125,ha:172,o:"m -160 567 b -122 567 -159 567 -149 567 l -87 567 l -84 566 b -74 553 -78 563 -77 560 b -20 366 -73 551 -49 466 b 31 186 8 267 31 186 b 85 371 31 186 55 269 b 140 559 114 473 138 557 b 153 567 141 564 148 567 b 168 559 159 567 166 564 b 168 555 168 557 168 557 b 92 281 168 548 159 513 b 14 13 50 134 14 13 b 0 0 14 6 6 0 b -17 15 -8 0 -17 8 b -93 283 -17 15 -51 136 b -170 552 -166 533 -170 548 b -170 553 -170 552 -170 552 b -160 567 -170 560 -167 564 "},caesura:{x_min:0,x_max:622.03125,ha:635,o:"m 398 417 b 406 419 401 419 404 419 b 427 398 417 419 427 409 b 427 391 427 395 427 392 b 34 -274 424 385 38 -272 b 20 -280 29 -278 25 -280 b 0 -259 9 -280 0 -270 b 0 -252 0 -256 0 -254 b 393 413 2 -247 389 410 b 398 417 394 415 397 416 m 592 417 b 600 419 594 419 597 419 b 622 398 611 419 622 409 b 620 391 622 395 620 392 b 227 -274 617 385 231 -272 b 213 -280 223 -278 219 -280 b 193 -259 202 -280 193 -270 b 194 -252 193 -256 193 -254 b 586 413 196 -247 582 410 b 592 417 588 415 590 416 "},caesuraCurved:{x_min:0,x_max:503.609375,ha:514,o:"m 274 430 b 277 430 276 430 277 430 b 310 394 296 430 310 415 b 308 383 310 391 308 387 b 306 367 307 381 307 374 b 236 120 298 305 272 210 b 40 -273 189 -5 125 -134 b 20 -287 35 -283 27 -287 b 5 -281 14 -287 9 -285 b 0 -267 1 -277 0 -273 b 9 -242 0 -262 2 -255 b 246 395 137 -12 232 242 b 274 430 249 416 257 427 m 468 430 b 472 430 469 430 470 430 b 503 394 490 430 503 415 b 502 383 503 391 503 387 b 499 367 502 381 500 374 b 431 120 491 305 465 210 b 234 -273 382 -5 318 -134 b 213 -287 228 -283 220 -287 b 198 -281 208 -287 202 -285 b 193 -267 194 -277 193 -273 b 202 -242 193 -262 196 -255 b 439 395 330 -12 426 242 b 468 430 442 416 451 427 "},restMaxima:{x_min:0,x_max:464.140625,ha:474,o:"m 0 0 l 0 347 l 76 347 l 153 347 l 153 0 l 153 -348 l 76 -348 l 0 -348 l 0 0 m 308 -1 l 308 347 l 386 347 l 464 347 l 464 -1 l 464 -348 l 386 -348 l 308 -348 l 308 -1 "},restDoubleWhole:{x_min:0,x_max:386.5625,ha:394,o:"m 0 173 l 0 347 l 193 347 l 386 347 l 386 173 l 386 0 l 193 0 l 0 0 l 0 173 "},restWhole:{x_min:0,x_max:447.8125,ha:457,o:"m 0 -87 l 0 0 l 223 0 l 447 0 l 447 -87 l 447 -174 l 223 -174 l 0 -174 l 0 -87 "},restHalf:{x_min:0,x_max:447.8125,ha:457,o:"m 0 86 l 0 173 l 223 173 l 447 173 l 447 86 l 447 0 l 223 0 l 0 0 l 0 86 "},restQuarter:{x_min:0,x_max:300.8125,ha:307,o:"m 49 505 b 53 506 50 505 51 506 b 70 496 58 506 62 503 b 81 485 73 492 78 488 l 96 473 l 111 459 l 122 449 l 134 438 l 182 396 l 255 330 b 292 291 292 298 292 298 l 292 290 l 292 284 l 283 270 b 209 36 234 197 209 113 b 288 -170 209 -44 235 -119 b 299 -184 295 -179 299 -181 b 300 -191 300 -187 300 -188 b 285 -206 300 -199 294 -206 b 280 -206 283 -206 281 -206 b 247 -201 270 -202 259 -201 b 176 -222 223 -201 197 -208 b 114 -340 136 -249 114 -292 b 172 -471 114 -384 134 -433 b 185 -492 182 -481 185 -487 b 181 -502 185 -496 183 -499 b 171 -508 176 -505 174 -508 b 152 -498 166 -508 160 -503 b 0 -284 65 -428 12 -352 b 0 -260 0 -278 0 -270 b 1 -238 0 -252 0 -242 b 148 -140 16 -177 73 -140 b 209 -148 167 -140 189 -142 b 215 -149 212 -148 215 -149 b 215 -149 215 -149 215 -149 l 215 -149 b 201 -136 215 -148 209 -142 l 157 -97 l 96 -41 b 17 34 21 24 17 29 b 17 37 17 36 17 36 b 17 38 17 37 17 38 b 25 56 17 44 17 44 b 110 298 81 131 110 219 b 46 474 110 367 88 431 b 38 491 40 480 38 487 b 49 505 38 498 42 502 "},rest8th:{x_min:0,x_max:349.8125,ha:357,o:"m 88 302 b 103 303 93 302 98 303 b 202 224 149 303 191 270 b 205 199 204 216 205 208 b 178 129 205 173 196 147 l 175 126 l 182 127 b 307 249 236 142 284 190 b 313 259 308 254 311 258 b 329 267 317 265 323 267 b 349 247 340 267 349 259 b 201 -263 349 242 204 -258 b 182 -273 197 -270 190 -273 b 163 -260 174 -273 166 -269 b 161 -256 161 -259 161 -258 b 217 -59 161 -248 170 -220 b 272 129 247 43 272 127 b 272 129 272 129 272 129 b 264 122 272 129 268 126 b 140 80 227 94 183 80 b 36 115 102 80 65 91 b 0 194 10 136 0 165 b 88 302 0 244 32 292 "},rest16th:{x_min:0,x_max:450.53125,ha:460,o:"m 189 302 b 204 303 193 302 198 303 b 303 224 250 303 292 270 b 306 199 304 216 306 208 b 279 129 306 173 296 147 l 276 126 l 281 127 b 408 249 337 142 385 190 b 412 259 409 254 412 258 b 430 267 417 265 423 267 b 450 247 441 267 450 259 b 200 -605 450 242 204 -599 b 182 -616 197 -612 190 -616 b 163 -602 174 -616 166 -610 b 161 -598 161 -601 161 -601 b 217 -402 161 -589 170 -562 b 272 -213 247 -298 272 -213 b 272 -213 272 -213 272 -213 b 264 -219 272 -213 268 -216 b 140 -262 227 -247 182 -262 b 36 -226 102 -262 65 -249 b 0 -145 12 -206 0 -176 b 17 -84 0 -124 5 -104 b 103 -38 38 -54 70 -38 b 191 -91 137 -38 172 -56 b 205 -141 201 -106 205 -124 b 178 -212 205 -167 196 -194 l 175 -215 l 182 -213 b 307 -93 236 -198 284 -151 b 372 129 308 -88 372 127 b 372 129 372 129 372 129 b 364 122 372 129 368 126 b 240 80 328 94 283 80 b 137 115 202 80 166 91 b 99 194 111 136 99 165 b 189 302 99 244 133 292 "},rest32nd:{x_min:0,x_max:551.25,ha:563,o:"m 289 644 b 304 645 294 645 299 645 b 404 566 349 645 392 613 b 406 541 405 557 406 549 b 379 471 406 514 397 489 l 377 467 l 382 470 b 509 591 438 485 485 531 b 513 601 510 595 513 599 b 530 609 518 607 524 609 b 551 588 540 609 551 602 b 200 -605 551 584 204 -599 b 182 -616 197 -612 190 -616 b 163 -602 174 -616 166 -610 b 161 -598 161 -601 161 -601 b 217 -402 161 -589 170 -562 b 272 -213 247 -298 272 -213 b 272 -213 272 -213 272 -213 b 264 -219 272 -213 268 -216 b 140 -262 227 -247 182 -262 b 36 -226 102 -262 65 -249 b 0 -145 12 -206 0 -176 b 17 -84 0 -124 5 -104 b 103 -38 38 -54 70 -38 b 191 -91 137 -38 172 -56 b 205 -141 201 -106 205 -124 b 178 -212 205 -167 196 -194 l 175 -215 l 182 -213 b 307 -93 236 -198 284 -151 b 372 129 308 -88 372 127 b 372 129 372 129 372 129 b 364 122 372 129 368 126 b 240 80 328 94 283 80 b 137 115 202 80 166 91 b 99 195 112 136 99 165 b 118 256 99 217 106 238 b 204 303 138 287 171 303 b 292 249 238 303 273 285 b 306 199 302 234 306 217 b 279 129 306 173 296 148 l 276 126 l 281 127 b 408 248 336 142 385 190 b 473 470 409 254 473 469 b 473 470 473 470 473 470 b 465 464 473 470 469 467 b 341 421 428 435 383 421 b 236 458 303 421 266 433 b 200 537 212 478 200 508 b 289 644 200 585 234 635 "},rest64th:{x_min:-1.359375,x_max:651.96875,ha:665,o:"m 389 644 b 405 645 394 645 400 645 b 504 566 450 645 492 613 b 507 541 506 557 507 549 b 480 471 507 514 498 489 l 477 467 l 483 470 b 609 591 539 485 586 531 b 613 601 611 595 613 599 b 631 609 619 607 624 609 b 651 588 641 609 651 602 b 200 -946 651 584 204 -941 b 182 -957 197 -953 190 -957 b 163 -945 174 -957 166 -953 b 161 -939 161 -942 161 -942 b 217 -743 161 -931 170 -904 b 272 -555 247 -639 272 -555 b 272 -555 272 -555 272 -555 b 264 -560 272 -555 268 -557 b 140 -603 227 -589 182 -603 b 36 -567 102 -603 65 -592 b -1 -487 12 -548 -1 -517 b 17 -427 -1 -466 5 -445 b 103 -380 38 -395 70 -380 b 191 -433 137 -380 172 -398 b 205 -484 201 -448 205 -466 b 178 -553 205 -509 196 -535 l 175 -557 l 182 -555 b 307 -435 236 -539 284 -494 b 372 -213 308 -430 372 -215 b 372 -213 372 -213 372 -213 b 364 -219 372 -213 368 -216 b 240 -262 328 -247 283 -262 b 137 -226 202 -262 166 -249 b 99 -145 112 -206 99 -176 b 118 -84 99 -124 106 -104 b 204 -38 138 -54 171 -38 b 292 -91 238 -38 273 -56 b 306 -141 302 -106 306 -124 b 279 -212 306 -167 296 -194 l 276 -215 l 281 -213 b 408 -93 336 -198 385 -151 b 473 129 409 -88 473 127 b 473 129 473 129 473 129 b 465 122 473 129 469 126 b 341 80 428 94 383 80 b 236 115 303 80 266 91 b 200 195 213 136 200 165 b 217 256 200 217 206 238 b 304 303 239 287 272 303 b 393 249 338 303 374 285 b 406 199 402 234 406 217 b 379 129 406 173 397 148 l 377 126 l 382 127 b 509 248 436 142 485 190 b 574 470 510 254 574 469 b 574 470 574 470 574 470 b 566 464 574 470 570 467 b 442 421 529 435 484 421 b 337 458 404 421 367 433 b 300 537 313 478 300 508 b 389 644 300 585 334 635 "},rest128th:{x_min:-1.359375,x_max:752.703125,ha:768,o:"m 490 985 b 504 986 495 986 500 986 b 604 907 551 986 593 954 b 607 884 607 900 607 892 b 581 813 607 857 597 831 l 578 810 l 583 811 b 710 932 638 827 687 873 b 714 943 711 936 713 942 b 730 952 720 949 725 952 b 752 931 741 952 752 943 b 200 -946 752 927 204 -941 b 182 -957 197 -953 190 -957 b 163 -945 174 -957 166 -953 b 161 -939 161 -942 161 -942 b 217 -743 161 -931 170 -904 b 272 -555 247 -639 272 -555 b 272 -555 272 -555 272 -555 b 264 -560 272 -555 268 -557 b 140 -603 227 -589 182 -603 b 36 -567 102 -603 65 -592 b -1 -487 12 -548 -1 -517 b 17 -427 -1 -466 5 -445 b 103 -380 38 -395 70 -380 b 191 -433 137 -380 172 -398 b 205 -484 201 -448 205 -466 b 178 -553 205 -509 196 -535 l 175 -557 l 182 -555 b 307 -435 236 -539 284 -494 b 372 -213 308 -430 372 -215 b 372 -213 372 -213 372 -213 b 364 -219 372 -213 368 -216 b 240 -262 328 -247 283 -262 b 137 -226 202 -262 166 -249 b 99 -145 112 -206 99 -176 b 118 -84 99 -124 106 -104 b 204 -38 138 -54 171 -38 b 292 -91 238 -38 273 -56 b 306 -141 302 -106 306 -124 b 279 -212 306 -167 296 -194 l 276 -215 l 281 -213 b 408 -93 336 -198 385 -151 b 473 129 409 -88 473 127 b 473 129 473 129 473 129 b 465 122 473 129 469 126 b 341 80 428 94 383 80 b 236 115 303 80 266 91 b 200 195 213 136 200 165 b 217 256 200 217 206 238 b 304 303 239 287 272 303 b 393 249 338 303 374 285 b 406 199 402 234 406 217 b 379 129 406 173 397 148 l 377 126 l 382 127 b 509 248 436 142 485 190 b 574 470 510 254 574 469 b 574 470 574 470 574 470 b 566 464 574 470 570 467 b 442 421 529 435 484 421 b 337 458 404 421 367 433 b 300 538 314 477 300 508 b 318 598 300 559 306 580 b 404 645 340 630 372 645 b 494 592 439 645 475 627 b 507 541 502 577 507 559 b 480 471 507 516 498 489 l 477 467 l 483 470 b 608 589 537 485 586 531 b 675 811 611 595 675 810 b 675 811 675 811 675 811 b 666 806 675 811 671 809 b 543 763 628 777 585 763 b 438 799 504 763 468 775 b 401 878 412 820 401 849 b 490 985 401 928 434 977 "},dynamicPiano:{x_min:-53.078125,x_max:513.140625,ha:485,o:"m 185 383 b 196 384 187 383 191 384 b 277 334 230 384 259 365 b 288 301 281 324 288 306 b 288 297 288 298 288 297 b 294 302 289 297 291 299 b 394 370 323 338 367 367 b 404 371 398 370 401 371 b 510 272 453 371 498 328 b 513 237 513 262 513 251 b 507 172 513 217 511 192 b 326 -34 487 59 412 -26 b 314 -36 322 -36 318 -36 b 274 -24 298 -36 283 -31 l 265 -16 b 224 44 246 -1 232 20 b 223 49 224 47 223 49 b 223 49 223 49 223 49 b 149 -197 221 48 149 -194 b 149 -198 149 -197 149 -198 b 170 -210 149 -202 155 -205 b 187 -215 174 -210 175 -212 b 204 -231 201 -219 204 -222 b 197 -245 204 -240 202 -242 l 194 -248 l 76 -248 l -42 -248 l -46 -245 b -53 -231 -51 -242 -53 -240 b -35 -215 -53 -222 -49 -217 b -13 -210 -21 -212 -20 -212 b -6 -208 -10 -209 -8 -208 b 0 -206 -6 -208 -2 -206 b 25 -188 13 -201 21 -195 b 163 280 28 -183 163 276 b 166 291 163 283 164 287 b 167 302 167 295 167 299 b 155 324 167 315 161 324 b 155 324 155 324 155 324 b 65 230 125 322 85 280 b 53 215 61 217 58 215 b 51 215 53 215 51 215 b 42 224 46 215 42 217 b 57 263 42 231 47 244 b 140 360 77 305 104 337 b 152 370 144 365 149 369 b 185 383 157 376 172 381 m 374 306 b 366 308 371 308 368 308 b 300 273 348 308 321 294 b 284 254 288 262 287 259 b 280 242 283 249 281 245 b 257 169 279 240 270 213 l 236 98 l 236 93 b 251 48 238 77 243 61 b 279 27 258 37 272 27 b 281 27 279 27 280 27 b 291 31 281 27 287 30 b 396 170 334 52 378 109 b 406 247 402 197 406 224 b 401 277 406 259 405 270 b 374 306 397 290 383 303 "},dynamicMezzo:{x_min:46.28125,x_max:669.671875,ha:563,o:"m 183 376 b 189 376 185 376 187 376 b 212 374 197 376 208 376 b 265 337 234 369 253 355 b 274 317 268 331 273 320 b 274 316 274 317 274 316 b 280 323 276 316 276 319 b 311 358 288 337 299 348 b 319 366 315 360 318 365 b 356 376 326 373 340 376 b 382 371 364 376 374 374 b 428 337 400 366 417 352 b 436 317 431 331 436 320 b 438 316 436 317 436 316 b 442 323 438 316 439 319 b 475 358 451 337 462 348 b 483 366 477 360 481 365 b 518 376 488 373 503 376 b 544 373 528 376 536 376 b 604 285 579 360 604 326 b 597 249 604 273 601 258 b 543 63 596 247 544 70 b 541 54 543 61 541 55 b 540 44 540 51 540 47 b 552 23 540 33 545 23 b 552 23 552 23 552 23 b 647 126 586 29 627 72 b 658 138 651 136 653 138 b 660 138 660 138 660 138 b 669 129 666 137 669 136 b 654 88 669 122 665 109 b 562 -12 631 43 602 9 l 549 -19 b 521 -27 540 -24 530 -27 b 447 30 490 -27 458 -4 b 443 58 445 38 443 48 b 450 93 443 72 446 84 b 504 278 453 97 504 272 b 507 288 506 283 506 287 b 509 298 507 292 509 295 b 491 326 509 310 502 320 b 487 327 490 327 488 327 b 479 324 484 327 483 326 b 441 270 462 316 443 288 b 435 249 441 265 436 254 b 398 127 434 248 419 195 b 362 4 379 61 362 5 b 328 -1 359 -1 362 -1 b 314 -1 323 -1 319 -1 b 302 -1 310 -1 306 -1 b 266 4 266 -1 269 -1 b 265 6 265 5 265 5 b 303 144 265 13 272 34 b 343 278 325 216 343 276 b 344 288 343 281 344 285 b 345 298 345 291 345 295 b 330 326 345 310 340 320 b 323 327 328 327 325 327 b 317 324 322 327 321 326 b 279 270 300 316 281 288 b 273 249 279 265 274 254 b 236 127 272 248 255 195 b 200 4 216 61 200 5 b 164 -1 197 -1 198 -1 b 151 -1 161 -1 156 -1 b 140 -1 147 -1 142 -1 b 103 4 104 -1 106 -1 b 103 6 103 5 103 5 b 141 144 103 13 108 34 b 181 278 161 216 179 276 b 182 288 181 281 181 285 b 183 298 182 291 183 295 b 168 324 183 310 178 320 b 160 327 166 326 163 327 b 141 320 156 327 151 324 b 69 230 112 305 85 272 b 57 215 65 217 62 215 b 55 215 57 215 55 215 b 46 224 49 215 46 217 b 59 260 46 231 50 242 b 151 363 81 306 112 341 b 161 369 155 365 160 367 b 183 376 166 371 174 374 "},dynamicForte:{x_min:-118.421875,x_max:597.53125,ha:381,o:"m 460 574 b 464 574 461 574 462 574 b 488 574 470 574 481 574 b 500 573 491 574 498 574 b 594 503 543 570 588 538 b 597 488 596 498 597 494 b 528 417 597 449 564 417 b 502 423 519 417 510 419 b 465 481 477 434 465 458 b 488 528 465 499 472 516 b 490 530 490 530 490 530 b 490 530 490 530 490 530 b 468 517 488 530 475 523 b 349 340 419 485 377 420 b 347 330 348 334 347 330 b 383 328 347 328 363 328 b 428 326 423 328 424 328 b 442 302 438 320 442 312 b 430 281 442 294 438 285 b 385 276 424 277 426 276 l 377 276 l 332 276 l 330 269 b 178 -117 303 126 250 -9 b 1 -249 129 -194 69 -237 b -20 -251 -6 -251 -13 -251 b -114 -187 -65 -251 -100 -227 b -118 -156 -117 -177 -118 -166 b -51 -84 -118 -116 -91 -84 b -31 -87 -46 -84 -39 -86 b 16 -152 0 -95 16 -124 b -12 -205 16 -173 8 -194 b -16 -208 -14 -206 -16 -208 b -14 -208 -16 -208 -14 -208 b -9 -206 -14 -208 -12 -208 b 74 -124 23 -197 54 -166 b 172 224 98 -79 125 22 b 185 276 178 252 183 274 b 185 276 185 276 185 276 b 141 276 185 276 181 276 b 91 280 96 276 96 276 b 77 302 83 285 77 294 b 91 326 77 312 83 320 b 148 328 95 328 96 328 l 198 330 l 202 341 b 460 574 249 473 351 566 "},dynamicRinforzando:{x_min:78.9375,x_max:485.921875,ha:417,o:"m 362 378 b 378 380 367 380 372 380 b 472 348 415 380 453 367 b 485 315 481 338 485 327 b 462 273 485 298 477 281 b 439 267 454 269 446 267 b 398 290 424 267 409 274 b 344 319 385 309 364 319 b 281 269 315 319 289 301 b 279 262 280 266 279 262 b 276 256 279 260 277 258 b 274 249 276 254 274 251 b 238 127 273 248 257 192 b 201 4 217 61 201 5 b 166 -1 198 -1 200 -1 b 153 -1 163 -1 157 -1 b 141 -1 148 -1 144 -1 b 104 4 106 -1 107 -1 b 104 6 104 5 104 5 b 142 144 104 13 110 34 b 182 278 164 219 181 276 b 183 288 182 281 182 285 b 185 302 185 292 185 298 b 164 330 185 317 176 328 b 159 330 163 330 161 330 b 102 302 140 330 119 320 b 91 294 95 295 93 294 b 88 294 91 294 89 294 b 78 303 83 294 78 298 b 81 312 78 306 78 309 b 200 373 106 347 160 373 b 215 371 205 373 209 371 b 266 335 235 367 254 353 b 269 331 268 333 269 331 b 269 331 269 331 269 331 b 273 335 269 331 270 334 b 362 378 298 359 330 376 "},dynamicSforzando:{x_min:70.78125,x_max:378.390625,ha:315,o:"m 246 373 b 254 373 249 373 251 373 b 372 324 303 373 360 351 b 378 302 377 317 378 309 b 338 251 378 278 362 255 b 328 249 334 249 332 249 b 283 294 303 249 283 270 b 288 315 283 301 284 308 b 289 319 289 317 289 319 b 289 319 289 319 289 319 b 283 320 289 320 287 320 b 270 322 279 322 274 322 b 206 288 242 322 215 308 b 206 283 206 287 206 285 b 257 223 206 267 230 238 b 284 206 272 213 277 210 b 351 90 328 173 351 130 b 340 47 351 74 348 59 b 205 -30 314 -2 264 -30 b 182 -29 198 -30 190 -30 b 84 15 147 -24 103 -5 b 70 48 74 24 70 36 b 108 99 70 70 85 94 b 121 102 112 101 117 102 b 167 56 147 102 167 80 b 159 31 167 48 164 40 l 156 26 l 157 26 b 190 20 167 22 178 20 b 220 26 201 20 212 22 b 258 65 243 34 258 51 b 257 70 258 66 258 69 b 204 126 249 94 234 109 b 114 258 148 158 114 209 b 125 302 114 273 118 288 b 246 373 147 342 193 370 "},dynamicZ:{x_min:29.9375,x_max:420.578125,ha:371,o:"m 115 345 b 221 347 117 345 166 347 b 411 345 306 347 409 345 b 420 330 416 342 420 335 b 415 319 420 326 419 321 b 178 118 397 303 179 118 b 178 117 178 118 178 117 b 181 117 178 117 178 117 b 189 117 182 117 185 117 b 193 117 190 117 191 117 b 247 98 215 117 232 111 b 296 75 266 83 280 76 b 302 75 299 75 300 75 b 322 91 311 75 315 79 b 322 91 322 91 322 91 b 322 91 322 91 322 91 b 319 91 322 91 321 91 b 313 90 318 90 315 90 b 283 107 300 90 288 97 b 277 126 279 114 277 121 b 319 167 277 149 295 167 b 319 167 319 167 319 167 b 362 118 347 167 362 147 b 355 82 362 108 359 96 b 311 33 349 65 340 55 b 224 1 284 12 253 1 b 194 5 213 1 204 2 b 168 18 183 8 178 11 b 110 36 151 30 130 36 b 57 15 88 36 68 29 b 47 11 54 12 51 11 b 31 20 40 11 34 13 b 29 26 31 22 29 25 b 68 66 29 36 39 45 b 285 250 73 71 281 248 b 285 250 285 250 285 250 b 231 252 285 252 261 252 b 137 250 190 252 141 250 b 93 227 122 248 110 241 b 78 220 88 222 83 220 b 66 227 74 220 70 222 b 63 234 65 229 63 231 b 85 291 63 241 69 252 b 115 345 108 342 108 344 "},ornamentTrill:{x_min:-340.28125,x_max:338.921875,ha:346,o:"m -32 520 b -29 521 -31 520 -31 521 b -23 519 -27 521 -24 520 b -20 513 -21 517 -20 516 b -21 506 -20 512 -20 509 b -31 474 -23 502 -27 488 l -53 402 l -66 352 l -68 349 l -57 349 b -32 351 -51 349 -40 351 b 123 370 19 352 74 359 b 137 371 127 370 133 371 b 170 356 152 371 164 366 b 171 355 170 355 170 355 b 216 366 174 355 183 358 b 280 378 268 377 266 377 b 287 378 283 378 284 378 b 332 349 307 378 322 369 b 338 319 336 341 338 330 b 332 301 338 310 336 302 b 242 280 329 299 246 280 b 242 280 242 280 242 280 b 235 288 236 280 235 283 b 235 292 235 290 235 291 b 236 302 236 297 236 299 b 220 337 236 316 230 330 l 216 340 l 210 335 b 159 276 189 322 172 301 b 118 149 152 265 156 274 b 81 34 84 36 85 36 b -8 13 78 33 -4 13 b -8 13 -8 13 -8 13 b -14 20 -12 15 -14 15 b -8 44 -14 24 -12 31 b -2 66 -5 55 -2 65 b -2 66 -2 66 -2 66 l -2 66 b -43 41 -2 66 -21 55 b -114 4 -98 8 -98 8 b -144 0 -123 0 -134 0 b -242 99 -197 0 -242 43 b -242 109 -242 102 -242 105 b -212 219 -240 122 -242 116 b -185 312 -197 270 -185 312 l -185 312 b -189 312 -185 312 -186 312 b -259 312 -200 312 -227 312 b -321 310 -291 312 -310 310 b -334 312 -330 310 -334 312 b -340 319 -338 313 -340 316 b -336 326 -340 322 -338 324 b -291 337 -334 326 -314 331 l -247 347 l -210 348 b -172 348 -190 348 -172 348 b -168 363 -172 348 -171 355 b -145 442 -151 424 -145 441 b -133 452 -144 444 -140 446 l -77 489 b -32 520 -53 506 -32 520 m 57 334 b 53 335 55 335 54 335 b 44 334 50 335 49 335 b -70 316 8 326 -28 320 b -78 309 -78 316 -78 316 b -108 202 -80 305 -88 274 b -141 81 -136 112 -141 93 b -140 74 -141 79 -141 77 b -117 49 -137 59 -127 49 b -107 52 -114 49 -110 51 b 16 127 -106 54 14 126 b 42 217 16 127 42 215 b 49 241 42 222 44 229 b 73 320 53 251 73 317 b 57 334 73 327 65 333 "},ornamentTurn:{x_min:-423.3125,x_max:421.9375,ha:431,o:"m -262 197 b -247 197 -257 197 -253 197 b -118 162 -210 197 -163 184 b 40 45 -61 134 -13 98 b 277 -95 119 -33 200 -81 b 289 -97 281 -97 285 -97 b 378 0 332 -97 371 -55 b 378 11 378 4 378 6 b 302 83 378 55 345 83 b 242 66 283 83 262 77 b 208 56 231 59 219 56 b 148 120 175 56 148 81 b 201 186 148 151 164 172 b 261 198 220 194 240 198 b 420 45 341 198 411 136 b 421 22 421 37 421 29 b 245 -199 421 -93 338 -199 b 238 -198 243 -199 240 -199 b -44 -47 148 -194 50 -141 b -250 86 -114 22 -183 66 b -295 94 -270 91 -283 94 b -315 91 -302 94 -307 94 b -381 4 -356 81 -381 43 b -355 -56 -381 -18 -372 -40 b -298 -81 -338 -73 -319 -81 b -246 -68 -283 -81 -265 -77 b -212 -58 -234 -61 -223 -58 b -178 -69 -200 -58 -189 -62 b -151 -122 -160 -81 -151 -101 b -171 -167 -151 -138 -157 -155 b -239 -195 -185 -181 -213 -192 b -257 -197 -245 -197 -250 -197 b -423 -5 -352 -197 -423 -109 b -412 65 -423 16 -419 40 b -262 197 -389 137 -329 188 "},ornamentTurnSlash:{x_min:-423.3125,x_max:421.9375,ha:431,o:"m -10 276 b -2 277 -8 277 -5 277 b 17 265 5 277 13 273 b 19 163 19 260 19 260 l 19 68 l 39 45 b 277 -95 122 -34 200 -81 b 289 -97 281 -97 285 -97 b 378 0 332 -97 371 -54 b 378 11 378 4 378 6 b 302 83 378 55 345 83 b 242 66 283 83 262 77 b 208 56 231 59 219 56 b 148 120 175 56 148 81 b 200 186 148 151 164 172 b 261 198 220 194 240 198 b 420 45 341 198 411 137 b 421 22 421 37 421 29 b 257 -198 421 -86 347 -188 b 242 -198 251 -198 247 -198 b 20 -105 181 -198 95 -163 l 19 -104 l 19 -183 b 19 -216 19 -195 19 -206 b 12 -273 19 -272 17 -267 b -2 -278 8 -277 2 -278 b -21 -266 -10 -278 -19 -274 b -23 -165 -23 -263 -23 -262 l -23 -69 l -44 -47 b -250 86 -117 23 -183 66 b -295 94 -270 93 -284 94 b -315 91 -302 94 -308 94 b -381 5 -356 81 -381 43 b -355 -56 -381 -16 -372 -40 b -299 -81 -338 -73 -319 -81 b -246 -68 -283 -81 -265 -77 b -212 -58 -234 -61 -223 -58 b -168 -77 -196 -58 -179 -65 b -151 -122 -156 -90 -151 -105 b -179 -174 -151 -141 -160 -162 b -239 -195 -194 -184 -217 -192 b -257 -197 -245 -195 -250 -197 b -423 -5 -349 -197 -423 -113 b -423 0 -423 -4 -423 -1 b -277 194 -420 97 -362 173 b -247 197 -268 197 -258 197 b -24 104 -185 197 -100 162 l -23 102 l -23 181 b -21 265 -23 260 -23 260 b -10 276 -20 269 -14 274 "},ornamentMordent:{x_min:-402.890625,x_max:401.53125,ha:410,o:"m -10 273 b -4 274 -9 273 -6 274 b 16 262 4 274 12 269 b 17 158 17 259 17 259 l 17 56 l 62 112 b 117 174 110 172 110 172 b 122 174 118 174 119 174 b 132 173 125 174 129 173 b 295 11 134 172 171 134 l 307 -1 l 336 34 b 374 76 366 72 368 74 b 381 77 375 77 378 77 b 401 56 392 77 401 68 b 400 48 401 54 401 51 b 223 -172 397 41 230 -166 b 210 -176 220 -174 215 -176 b 201 -174 206 -176 204 -176 b 112 -87 198 -173 178 -152 b 27 0 65 -38 27 0 b 21 -6 27 0 24 -2 l 17 -12 l 17 -147 b 17 -210 17 -173 17 -194 b 10 -292 17 -297 16 -287 b -2 -299 6 -297 2 -299 b -21 -287 -10 -299 -19 -295 b -24 -174 -23 -284 -23 -284 l -24 -63 l -66 -117 b -121 -176 -110 -170 -114 -176 b -125 -176 -122 -176 -123 -176 b -296 -12 -134 -174 -125 -184 l -308 0 l -337 -34 b -375 -77 -367 -73 -370 -76 b -382 -79 -377 -79 -379 -79 b -402 -58 -393 -79 -402 -69 b -401 -49 -402 -55 -402 -52 b -224 170 -398 -43 -231 165 b -212 174 -221 173 -216 174 b -202 173 -208 174 -205 174 b -39 11 -200 172 -151 122 l -28 -1 l -25 1 l -24 4 l -24 130 b -23 260 -24 256 -24 258 b -10 273 -20 266 -16 270 "},ornamentShortTrill:{x_min:-402.890625,x_max:401.53125,ha:410,o:"m -219 173 b -213 174 -217 174 -215 174 b -202 173 -209 174 -205 173 b -114 86 -200 172 -179 151 b -28 0 -66 37 -28 0 b 40 84 -28 0 2 37 b 117 174 111 173 110 172 b 122 174 118 174 119 174 b 132 173 125 174 129 173 b 295 11 134 172 171 134 l 307 -1 l 336 34 b 374 76 366 72 368 74 b 381 77 375 77 378 77 b 401 56 392 77 401 68 b 400 48 401 54 401 51 b 223 -172 397 41 230 -166 b 210 -176 220 -174 215 -176 b 201 -174 206 -176 204 -176 b 112 -87 198 -173 178 -152 b 27 0 65 -38 27 0 b -42 -86 27 0 -4 -38 b -118 -174 -112 -174 -111 -173 b -123 -176 -119 -176 -121 -176 b -133 -174 -126 -176 -130 -174 b -296 -12 -136 -173 -172 -137 l -308 0 l -337 -34 b -375 -77 -367 -73 -370 -76 b -382 -79 -377 -79 -379 -79 b -402 -58 -393 -79 -402 -69 b -401 -49 -402 -55 -402 -52 b -224 172 -398 -43 -228 167 b -219 173 -223 172 -220 173 "},ornamentTremblement:{x_min:-571.671875,x_max:570.3125,ha:582,o:"m -386 173 b -381 174 -385 174 -383 174 b -370 173 -377 174 -372 173 b -281 86 -367 172 -347 151 b -196 0 -235 37 -196 0 b -126 84 -196 0 -164 37 b -50 174 -55 173 -57 172 b -44 174 -49 174 -47 174 b -35 173 -42 174 -38 173 b 53 86 -32 172 -12 151 b 138 0 100 37 138 0 b 208 84 140 0 170 37 b 284 174 279 173 277 172 b 289 174 285 174 288 174 b 299 173 294 174 298 173 b 462 11 303 172 338 134 l 475 -1 l 503 34 b 541 76 534 72 536 74 b 548 77 544 77 545 77 b 570 56 560 77 570 68 b 567 48 570 54 568 51 b 392 -172 564 41 397 -166 b 378 -176 387 -174 382 -176 b 368 -174 374 -176 371 -176 b 280 -87 367 -173 345 -152 b 194 0 234 -38 194 0 b 125 -86 194 0 163 -38 b 49 -174 54 -174 55 -173 b 43 -176 47 -176 46 -176 b 34 -174 40 -176 36 -174 b -54 -87 31 -173 10 -152 b -140 0 -102 -38 -140 0 b -209 -86 -141 0 -171 -38 b -285 -174 -280 -174 -279 -173 b -291 -176 -287 -176 -289 -176 b -300 -174 -295 -176 -299 -174 b -464 -12 -304 -173 -340 -137 l -476 0 l -504 -34 b -543 -77 -534 -73 -537 -76 b -549 -79 -545 -79 -547 -79 b -571 -58 -562 -79 -571 -69 b -568 -49 -571 -55 -570 -52 b -392 172 -566 -43 -396 167 b -386 173 -390 172 -387 173 "},ornamentPrecompAppoggTrill:{x_min:-571.671875,x_max:570.3125,ha:582,o:"m -559 351 b -551 352 -556 352 -553 352 b -530 338 -543 352 -533 348 b -529 169 -530 337 -529 291 l -529 1 l -507 27 l -441 112 b -382 174 -394 169 -390 174 b -378 174 -381 174 -379 174 b -281 86 -370 174 -375 179 b -196 0 -234 37 -196 0 b -126 84 -196 0 -164 37 b -50 174 -55 173 -57 172 b -44 174 -49 174 -47 174 b -35 173 -42 174 -38 173 b 53 86 -32 172 -12 151 b 138 0 100 37 138 0 b 208 84 140 0 170 37 b 284 174 279 173 279 172 b 289 174 285 174 288 174 b 300 173 294 174 298 173 b 462 11 303 172 340 134 l 475 -1 l 503 34 b 541 76 534 72 536 74 b 548 77 544 77 545 77 b 570 56 560 77 570 68 b 567 48 570 54 568 51 b 392 -172 564 41 397 -166 b 378 -176 387 -174 382 -176 b 368 -174 375 -176 371 -176 b 280 -87 367 -173 347 -152 b 194 0 234 -38 194 0 b 126 -86 194 0 163 -38 b 49 -174 54 -174 55 -173 b 44 -176 47 -176 46 -176 b 34 -174 40 -176 36 -174 b -54 -87 31 -173 10 -152 b -140 0 -102 -38 -140 0 b -209 -86 -140 0 -171 -38 b -285 -174 -280 -174 -279 -173 b -291 -176 -287 -176 -288 -176 b -300 -174 -294 -176 -298 -174 b -464 -11 -303 -173 -374 -102 l -476 0 l -506 -37 b -539 -76 -528 -65 -537 -74 b -551 -80 -543 -79 -547 -80 b -570 -68 -558 -80 -566 -76 l -571 -65 l -571 136 b -570 340 -571 331 -571 337 b -559 351 -568 344 -564 348 "},ornamentPrecompSlideTrillDAnglebert:{x_min:-590.71875,x_max:589.359375,ha:601,o:"m -367 173 b -362 174 -366 174 -364 174 b -351 173 -357 174 -353 173 b -262 86 -348 172 -328 151 b -176 0 -216 37 -176 0 b -107 84 -176 0 -145 37 b -31 174 -36 173 -38 172 b -25 174 -29 174 -28 174 b -16 173 -23 174 -19 173 b 72 86 -13 172 6 151 b 157 0 119 37 157 0 b 227 84 159 0 189 37 b 303 174 298 173 296 172 b 308 174 304 174 307 174 b 318 173 313 174 317 173 b 481 11 322 172 357 134 l 494 -1 l 522 34 b 560 76 553 72 555 74 b 567 77 563 77 564 77 b 589 56 579 77 589 68 b 586 48 589 54 588 51 b 411 -172 583 41 416 -166 b 397 -176 406 -174 401 -176 b 387 -174 393 -176 390 -176 b 299 -87 386 -173 366 -152 b 213 0 253 -38 213 0 b 144 -86 213 0 182 -38 b 68 -174 73 -174 74 -173 b 62 -176 66 -176 65 -176 b 53 -174 59 -176 55 -174 b -35 -87 50 -173 29 -152 b -121 0 -83 -38 -121 0 b -190 -86 -122 0 -152 -38 b -266 -174 -261 -174 -259 -173 b -272 -176 -268 -176 -270 -176 b -281 -174 -276 -176 -280 -174 b -371 -86 -284 -173 -304 -152 b -457 0 -417 -38 -457 0 l -457 0 b -477 -26 -457 0 -470 -16 b -548 -227 -524 -88 -548 -161 b -536 -303 -548 -254 -544 -280 b -533 -317 -534 -309 -533 -313 b -553 -338 -533 -330 -541 -338 b -577 -315 -566 -338 -571 -333 b -590 -227 -586 -287 -590 -258 b -518 -9 -590 -154 -564 -77 b -465 56 -509 2 -504 8 l -402 134 b -367 173 -375 169 -372 172 "},ornamentPrecompSlideTrillBach:{x_min:-590.71875,x_max:589.359375,ha:601,o:"m 175 273 b 182 274 178 273 181 274 b 202 262 190 274 198 269 b 204 158 204 259 204 259 l 204 56 l 250 112 b 303 174 296 172 298 172 b 308 174 304 174 307 174 b 318 173 313 174 317 173 b 481 11 322 172 357 134 l 494 -1 l 522 34 b 560 76 553 72 555 74 b 567 77 563 77 564 77 b 589 56 579 77 589 68 b 586 48 589 54 588 51 b 411 -172 583 41 416 -166 b 397 -176 406 -174 401 -176 b 387 -174 393 -176 390 -176 b 299 -87 386 -173 366 -152 b 213 0 253 -38 213 0 b 208 -6 213 0 210 -2 l 204 -12 l 204 -147 b 204 -210 204 -173 204 -194 b 198 -292 204 -297 204 -287 b 183 -299 194 -297 189 -299 b 164 -287 175 -299 167 -295 b 163 -174 163 -284 163 -284 l 161 -63 l 119 -117 b 65 -176 76 -170 73 -176 b 61 -176 63 -176 62 -176 b -35 -87 51 -174 57 -180 b -121 0 -83 -38 -121 0 b -190 -86 -122 0 -152 -38 b -266 -174 -261 -174 -259 -173 b -272 -176 -268 -176 -270 -176 b -281 -174 -276 -176 -280 -174 b -371 -86 -284 -173 -304 -152 b -457 0 -417 -38 -457 0 l -457 0 b -477 -26 -457 0 -470 -16 b -548 -227 -524 -88 -548 -161 b -536 -303 -548 -254 -544 -280 b -533 -317 -534 -309 -533 -313 b -553 -338 -533 -330 -541 -338 b -577 -315 -566 -338 -571 -333 b -590 -227 -586 -287 -590 -258 b -518 -9 -590 -154 -564 -77 b -465 56 -509 2 -504 8 l -402 134 b -363 174 -374 170 -371 174 b -359 174 -362 174 -360 174 b -262 86 -351 174 -356 179 b -176 0 -216 37 -176 0 b -107 84 -176 0 -145 37 b -31 174 -36 173 -38 172 b -25 174 -29 174 -28 174 b -16 173 -23 174 -19 173 b 147 11 -13 172 35 123 l 157 -1 l 160 1 l 163 4 l 163 130 b 164 260 163 256 163 258 b 175 273 166 266 170 270 "},ornamentPrecompTrillSuffixDandrieu:{x_min:-590.71875,x_max:589.359375,ha:601,o:"m 544 335 b 553 337 548 337 551 337 b 575 313 563 337 570 330 b 589 226 583 285 589 256 b 517 8 589 152 563 76 b 464 -58 507 -4 503 -9 l 401 -136 b 362 -176 372 -172 370 -176 b 357 -176 360 -176 359 -176 b 261 -87 349 -174 355 -180 b 175 0 215 -38 175 0 b 106 -86 175 0 144 -38 b 29 -174 35 -174 36 -173 b 24 -176 28 -176 27 -176 b 14 -174 21 -176 17 -174 b -73 -87 12 -173 -8 -152 b -159 0 -121 -38 -159 0 b -228 -86 -160 0 -190 -38 b -304 -174 -299 -174 -298 -173 b -310 -176 -306 -176 -308 -176 b -319 -174 -314 -176 -318 -174 b -483 -12 -323 -173 -359 -137 l -495 0 l -524 -34 b -562 -77 -553 -73 -556 -76 b -568 -79 -564 -79 -566 -79 b -590 -58 -581 -79 -590 -69 b -588 -49 -590 -55 -589 -52 b -412 170 -585 -43 -417 165 b -398 174 -408 173 -402 174 b -389 173 -394 174 -392 174 b -300 86 -387 172 -366 151 b -215 -1 -254 37 -215 -1 b -145 84 -215 -1 -183 37 b -69 173 -74 173 -76 172 b -63 174 -68 174 -66 174 b -54 173 -61 174 -57 173 b 34 86 -51 172 -31 151 b 119 -1 81 37 119 -1 b 189 84 121 -1 151 37 b 265 173 259 173 258 172 b 270 174 266 174 269 174 b 280 173 274 174 279 173 b 370 84 283 172 303 151 b 455 -1 416 37 455 -1 l 455 -1 b 476 24 455 -1 469 15 b 547 226 522 87 547 159 b 534 302 547 252 543 278 b 532 317 533 308 532 313 b 544 335 532 326 536 333 "},ornamentPrecompDoubleCadenceUpperPrefix:{x_min:-597.53125,x_max:596.171875,ha:608,o:"m -533 324 b -525 327 -530 326 -528 327 b -504 305 -514 327 -504 317 b -504 305 -504 305 -504 305 b -513 284 -504 299 -504 299 b -556 112 -541 226 -556 167 b -545 33 -556 84 -552 58 b -524 -20 -541 15 -532 -9 l -522 -23 l -491 15 l -413 111 b -355 174 -367 169 -363 174 b -351 174 -353 174 -352 174 b -254 86 -343 174 -348 179 b -168 -1 -208 37 -168 -1 b -100 84 -168 -1 -137 37 b -23 173 -28 173 -29 172 b -19 174 -21 174 -20 174 b -8 173 -14 174 -10 173 b 80 86 -5 172 13 151 b 166 -1 127 37 166 -1 b 235 84 166 -1 197 37 b 311 173 306 173 304 172 b 317 174 313 174 314 174 b 326 173 319 174 323 173 b 490 11 329 172 366 134 l 502 -1 l 530 34 b 568 76 560 72 563 74 b 575 77 570 77 573 77 b 596 56 586 77 596 68 b 594 48 596 54 596 51 b 417 -172 592 41 424 -166 b 405 -176 415 -174 409 -176 b 396 -174 401 -176 398 -176 b 307 -87 393 -173 372 -152 b 221 -1 259 -38 221 -1 b 152 -86 221 -1 190 -38 b 76 -176 81 -174 83 -173 b 70 -176 74 -176 73 -176 b 61 -174 66 -176 62 -174 b -27 -87 58 -173 38 -152 b -114 -1 -74 -38 -112 -1 b -182 -86 -114 -1 -145 -38 b -258 -176 -253 -174 -253 -173 b -264 -176 -259 -176 -262 -176 b -274 -174 -268 -176 -272 -174 b -438 -11 -277 -173 -348 -102 l -449 0 l -479 -37 b -524 -80 -513 -80 -514 -80 l -524 -80 b -553 -52 -534 -80 -540 -74 b -597 109 -583 -8 -597 48 b -560 280 -597 165 -585 224 b -533 324 -548 310 -540 322 "},ornamentPrecompDoubleCadenceUpperPrefixTurn:{x_min:-597.53125,x_max:596.171875,ha:608,o:"m -533 324 b -525 327 -530 326 -528 327 b -504 305 -514 327 -504 317 b -504 305 -504 305 -504 305 b -513 284 -504 299 -504 299 b -556 112 -541 226 -556 167 b -545 33 -556 84 -552 58 b -524 -20 -541 15 -532 -9 l -522 -23 l -491 15 l -413 111 b -355 174 -367 169 -363 174 b -351 174 -353 174 -352 174 b -254 86 -343 174 -348 179 b -168 -1 -208 37 -168 -1 b -100 84 -168 -1 -137 37 b -23 173 -28 173 -29 172 b -19 174 -21 174 -20 174 b -8 173 -14 174 -10 173 b 155 11 -5 172 43 123 l 166 -1 l 168 1 l 170 4 l 170 130 b 171 260 170 256 170 258 b 191 274 175 269 183 274 b 205 267 196 274 201 272 b 212 158 212 262 210 273 l 212 56 l 257 112 b 311 173 304 172 304 172 b 317 174 313 174 314 174 b 326 173 319 174 323 173 b 490 11 329 172 366 134 l 502 -1 l 530 34 b 568 76 560 72 563 74 b 575 77 570 77 573 77 b 596 56 586 77 596 68 b 594 48 596 54 596 51 b 417 -172 592 41 424 -166 b 405 -176 415 -174 409 -176 b 396 -174 401 -176 398 -176 b 307 -87 393 -173 372 -152 b 221 -1 259 -38 221 -1 b 216 -6 221 -1 219 -2 l 212 -12 l 212 -147 b 212 -210 212 -173 212 -194 b 205 -292 212 -297 210 -287 b 191 -299 201 -297 196 -299 b 172 -287 183 -299 175 -295 b 170 -174 171 -284 171 -284 l 170 -63 l 127 -117 b 73 -176 84 -170 80 -176 b 68 -176 72 -176 70 -176 b -27 -87 59 -174 65 -180 b -114 0 -74 -38 -112 0 b -182 -86 -114 0 -145 -38 b -258 -174 -253 -174 -253 -173 b -264 -176 -259 -176 -262 -176 b -274 -174 -268 -176 -272 -174 b -438 -11 -277 -173 -348 -102 l -449 0 l -479 -37 b -524 -80 -513 -80 -514 -80 l -524 -80 b -553 -52 -534 -80 -540 -74 b -597 109 -583 -8 -597 48 b -560 280 -597 165 -585 224 b -533 324 -548 310 -540 322 "},ornamentPrecompTrillLowerSuffix:{x_min:-597.53125,x_max:596.171875,ha:608,o:"m -413 173 b -408 174 -412 174 -409 174 b -397 173 -404 174 -400 173 b -308 86 -394 172 -374 151 b -223 0 -261 37 -223 0 b -153 84 -223 0 -191 37 b -77 174 -83 173 -84 172 b -72 174 -76 174 -74 174 b -62 173 -68 174 -63 173 b 25 86 -59 172 -39 151 b 112 0 73 37 111 0 b 181 84 112 0 144 37 b 257 174 251 173 251 172 b 262 174 258 174 261 174 b 273 173 266 174 270 173 b 436 9 276 172 347 101 l 447 -1 l 477 36 b 522 79 511 79 513 79 l 522 79 b 552 51 533 79 539 73 b 596 -112 582 6 596 -51 b 567 -262 596 -161 586 -213 b 539 -322 558 -287 544 -316 b 524 -327 534 -326 529 -327 b 504 -315 515 -327 507 -323 b 503 -308 503 -312 503 -309 b 511 -285 503 -302 504 -297 b 555 -113 540 -227 555 -169 b 544 -34 555 -86 551 -59 b 522 19 540 -16 530 8 l 521 22 l 481 -26 l 405 -122 b 353 -176 366 -172 362 -176 b 349 -176 352 -176 351 -176 b 253 -87 341 -176 347 -180 b 167 0 206 -38 167 0 b 99 -86 167 0 136 -38 b 21 -174 27 -174 28 -173 b 17 -176 20 -176 19 -176 b 6 -174 13 -176 9 -174 b -81 -87 4 -173 -14 -152 b -167 0 -129 -38 -167 0 b -236 -86 -167 0 -198 -38 b -313 -174 -307 -174 -306 -173 b -318 -176 -314 -176 -315 -176 b -328 -174 -321 -176 -325 -174 b -491 -12 -330 -173 -367 -137 l -503 0 l -530 -34 b -570 -77 -562 -73 -564 -76 b -577 -79 -571 -79 -574 -79 b -597 -58 -588 -79 -597 -69 b -596 -49 -597 -55 -597 -52 b -417 172 -593 -43 -423 167 b -413 173 -417 172 -415 173 "},stringsDownBow:{x_min:-149.71875,x_max:148.359375,ha:151,o:"m -9 215 b 0 217 -6 217 -4 217 b 19 205 8 217 14 213 b 20 142 20 202 20 201 l 20 84 l 23 84 b 144 -27 81 74 129 30 b 148 -66 147 -40 148 -54 b 36 -213 148 -134 103 -197 b 0 -219 24 -217 12 -219 b -145 -104 -68 -219 -129 -173 b -149 -68 -148 -91 -149 -79 b -24 84 -149 6 -98 74 l -21 84 l -21 142 b -19 205 -20 201 -20 202 b -9 215 -17 209 -13 213 m -21 -15 b -23 41 -21 37 -21 41 b -23 41 -23 41 -23 41 b -76 11 -35 40 -62 26 b -108 -65 -98 -11 -108 -38 b -1 -176 -108 -122 -65 -176 b 107 -65 63 -176 107 -122 b 74 11 107 -38 96 -11 b 20 41 61 26 32 41 b 20 -15 20 41 20 15 b 19 -74 20 -72 20 -72 b 0 -87 14 -83 6 -87 b -19 -74 -8 -87 -16 -83 b -21 -15 -20 -72 -20 -72 "},stringsUpBow:{x_min:-149.71875,x_max:148.359375,ha:151,o:"m -137 381 b -130 383 -134 383 -133 383 b -111 371 -122 383 -114 378 b -55 224 -110 370 -85 305 b 0 80 -25 145 -1 80 b 54 224 0 80 24 145 b 112 377 114 384 110 373 b 127 384 118 381 122 384 b 148 362 138 384 148 374 l 148 356 l 83 183 b 16 9 47 88 17 11 b -1 0 12 2 5 0 b -14 5 -5 0 -10 1 b -84 183 -19 9 -13 -6 l -149 356 l -149 362 b -137 381 -149 371 -145 378 "},stringsHarmonic:{x_min:-122.5,x_max:121.140625,ha:124,o:"m -16 145 b 0 147 -10 147 -5 147 b 121 -1 66 147 121 77 b 114 -49 121 -16 118 -33 b -1 -148 95 -112 47 -148 b -85 -106 -31 -148 -61 -134 b -122 -1 -110 -76 -122 -38 b -16 145 -122 68 -81 134 m 12 111 b 0 113 8 113 4 113 b -68 22 -29 113 -61 73 b -70 0 -69 15 -70 6 b -13 -113 -70 -49 -47 -98 b -1 -115 -9 -115 -5 -115 b 63 -40 24 -115 53 -83 b 68 -1 66 -27 68 -15 b 12 111 68 48 46 97 "},pluckedSnapPizzicatoAbove:{x_min:-149.71875,x_max:148.359375,ha:151,o:"m -9 215 b 0 217 -6 217 -4 217 b 19 205 8 217 14 213 b 20 142 20 202 20 201 l 20 84 l 23 84 b 144 -27 81 74 129 30 b 148 -66 147 -40 148 -54 b 36 -213 148 -134 103 -197 b 0 -219 24 -217 12 -219 b -145 -104 -68 -219 -129 -173 b -149 -68 -148 -91 -149 -79 b -24 84 -149 6 -98 74 l -21 84 l -21 142 b -19 205 -20 201 -20 202 b -9 215 -17 209 -13 213 m -21 -15 b -23 41 -21 37 -21 41 b -23 41 -23 41 -23 41 b -76 11 -35 40 -62 26 b -108 -65 -98 -11 -108 -38 b -1 -176 -108 -122 -65 -176 b 107 -65 63 -176 107 -122 b 74 11 107 -38 96 -11 b 20 41 61 26 32 41 b 20 -15 20 41 20 15 b 19 -74 20 -72 20 -72 b 0 -87 14 -83 6 -87 b -19 -74 -8 -87 -16 -83 b -21 -15 -20 -72 -20 -72 "},pluckedSnapPizzicatoBelow:{x_min:-149.71875,x_max:148.359375,ha:151,o:"m -9 215 b 0 217 -6 217 -4 217 b 19 205 8 217 14 213 b 20 142 20 202 20 201 l 20 84 l 23 84 b 144 -27 81 74 129 30 b 148 -66 147 -40 148 -54 b 36 -213 148 -134 103 -197 b 0 -219 24 -217 12 -219 b -145 -104 -68 -219 -129 -173 b -149 -68 -148 -91 -149 -79 b -24 84 -149 6 -98 74 l -21 84 l -21 142 b -19 205 -20 201 -20 202 b -9 215 -17 209 -13 213 m -21 -15 b -23 41 -21 37 -21 41 b -23 41 -23 41 -23 41 b -76 11 -35 40 -62 26 b -108 -65 -98 -11 -108 -38 b -1 -176 -108 -122 -65 -176 b 107 -65 63 -176 107 -122 b 74 11 107 -38 96 -11 b 20 41 61 26 32 41 b 20 -15 20 41 20 15 b 19 -74 20 -72 20 -72 b 0 -87 14 -83 6 -87 b -19 -74 -8 -87 -16 -83 b -21 -15 -20 -72 -20 -72 "},pluckedLeftHandPizzicato:{x_min:0,x_max:319.859375,ha:326,o:"m 149 508 b 159 509 152 509 155 509 b 186 494 170 509 181 503 b 190 440 190 487 190 488 l 190 430 l 190 377 l 242 377 l 251 377 b 303 373 298 377 296 377 b 319 345 314 367 319 356 b 304 319 319 335 314 324 b 250 315 296 315 299 315 l 242 315 l 190 315 l 190 262 l 190 252 b 186 198 190 204 190 205 b 159 183 179 188 170 183 b 132 198 148 183 138 188 b 127 252 127 205 127 204 l 127 262 l 127 315 l 76 315 l 68 315 b 14 319 20 315 21 315 b 0 347 4 324 0 335 b 14 373 0 356 4 367 b 68 377 21 377 20 377 l 76 377 l 127 377 l 127 430 l 127 440 b 132 494 127 488 127 487 b 149 508 136 501 142 505 "},keyboardPedalPed:{x_min:-1.359375,x_max:1064.390625,ha:1086,o:"m 296 692 b 314 694 302 694 307 694 b 386 685 337 694 366 689 b 548 498 480 660 548 580 b 548 481 548 492 548 487 b 455 395 541 426 499 395 b 370 462 420 395 383 417 b 362 496 364 477 362 488 b 377 514 362 509 367 514 b 393 501 386 514 390 510 b 432 474 397 484 413 474 b 470 487 445 474 458 478 b 491 530 484 496 491 510 b 490 544 491 534 491 539 b 333 660 479 606 411 657 l 323 662 l 315 646 b 269 524 285 591 269 556 b 321 431 269 492 287 466 b 349 395 338 413 343 408 b 363 342 359 378 363 362 b 359 312 363 333 362 322 b 285 158 348 266 318 206 b 281 152 283 155 281 152 b 281 152 281 152 281 152 b 287 154 283 152 284 152 b 318 155 298 154 308 155 b 461 98 371 155 419 136 l 464 97 l 483 112 b 503 129 494 120 503 127 b 504 130 503 129 504 129 b 503 138 504 131 503 134 b 500 180 500 152 500 166 b 553 326 500 238 518 288 b 604 366 560 331 592 358 b 649 381 617 376 632 381 b 696 362 665 381 681 374 b 724 302 714 347 724 324 b 695 238 724 278 714 255 b 660 210 691 234 662 212 b 579 148 658 209 582 151 b 579 148 579 148 579 148 b 596 106 579 144 589 119 b 622 77 604 88 609 83 b 657 69 632 72 645 69 b 748 112 688 69 721 84 b 755 123 754 117 755 120 b 755 127 755 124 755 126 b 751 165 752 137 751 151 b 758 219 751 183 754 202 b 894 387 774 290 820 347 b 896 390 896 388 896 388 b 891 398 896 391 895 392 b 622 560 827 477 730 535 b 600 580 605 564 600 569 b 617 596 600 591 607 596 b 628 595 622 596 624 596 b 1057 248 846 552 1020 412 b 1064 191 1061 229 1064 209 b 922 0 1064 94 1005 9 b 902 -1 916 -1 909 -1 b 774 76 847 -1 800 26 b 769 83 770 81 770 83 b 769 81 769 83 769 83 b 627 -1 733 29 677 -1 b 548 27 597 -1 570 8 b 515 88 537 37 525 61 l 513 95 l 510 93 l 453 45 b 390 0 396 0 396 0 b 390 0 390 0 390 0 b 374 15 381 0 377 4 b 268 105 359 69 314 105 b 250 104 262 105 257 105 l 243 102 l 234 90 b 155 1 201 49 159 2 b 147 -1 152 0 149 -1 b 130 15 138 -1 130 6 b 132 20 130 18 132 19 b 136 31 133 22 134 27 b 220 131 149 74 178 109 b 231 137 225 134 230 136 b 302 278 280 202 302 244 b 265 335 302 299 295 309 b 209 442 234 363 213 402 b 209 455 209 446 209 451 b 279 648 209 502 232 564 l 285 659 l 283 659 b 176 627 238 653 210 645 b 57 477 111 594 66 538 b 55 459 55 471 55 464 b 72 409 55 437 61 415 b 93 403 78 405 87 403 b 152 467 123 403 151 431 b 168 488 153 483 157 488 b 185 462 181 488 185 483 l 185 460 b 137 344 183 409 168 369 b 78 322 119 328 98 322 b 13 360 50 322 25 335 b -1 426 4 380 -1 402 b 89 610 -1 488 32 559 b 296 692 147 659 210 685 m 926 348 b 921 353 924 351 922 353 b 914 348 920 353 918 351 b 823 167 857 306 823 237 b 828 124 823 154 826 138 b 890 31 837 79 862 40 b 896 31 892 31 894 31 b 956 104 916 31 940 59 b 970 191 965 129 970 159 b 966 241 970 208 969 224 b 926 348 959 277 945 313 m 627 326 b 619 326 624 326 622 326 b 598 316 611 326 604 323 b 568 215 579 288 568 255 b 568 208 568 213 568 210 b 571 183 570 195 570 184 l 571 183 b 594 201 571 183 582 191 l 634 231 b 660 259 653 247 656 248 b 664 278 662 266 664 272 b 627 326 664 299 649 320 "},keyboardPedalUp:{x_min:-1.359375,x_max:592.078125,ha:604,o:"m 280 692 b 295 694 283 692 289 694 b 310 692 300 694 307 692 b 357 630 340 684 357 657 b 336 580 357 612 351 594 b 311 538 321 566 311 549 b 352 492 311 512 330 492 b 366 495 357 492 362 492 b 397 553 390 503 397 517 b 415 603 397 576 402 591 b 460 623 427 617 443 623 b 509 599 479 623 498 614 b 522 559 518 587 522 573 b 494 506 522 538 513 519 b 451 495 481 498 473 496 b 415 488 432 495 426 494 b 394 449 404 483 394 464 b 394 448 394 448 394 448 l 394 440 l 397 433 b 428 409 404 420 413 413 b 438 408 431 408 435 408 b 479 431 450 408 462 415 b 528 455 495 448 510 455 b 548 452 534 455 541 453 b 592 391 577 442 592 416 b 549 331 592 365 577 340 b 528 327 541 328 534 327 b 479 351 510 327 495 335 b 438 374 464 367 450 374 b 417 369 431 374 424 373 b 394 333 402 360 394 348 b 400 312 394 326 396 319 b 451 287 408 294 420 288 b 513 258 484 285 499 278 b 522 223 519 247 522 234 b 461 159 522 190 496 159 b 449 161 457 159 453 159 b 397 229 416 167 397 191 b 366 288 397 265 390 278 b 352 290 362 290 357 290 b 315 262 336 290 321 280 b 311 245 313 256 311 251 b 334 204 311 233 318 220 b 355 170 348 190 351 184 b 357 152 356 166 357 159 b 355 136 357 147 356 140 b 295 88 345 104 321 88 b 232 152 264 88 232 112 b 255 204 232 174 238 186 b 279 244 273 222 279 231 l 279 245 b 238 290 279 270 259 290 b 224 288 234 290 228 290 b 193 229 200 278 193 265 b 141 161 193 191 174 167 b 129 159 137 159 133 159 b 68 223 93 159 68 190 b 77 258 68 234 70 247 b 138 287 91 278 106 285 b 185 302 166 287 175 291 b 196 333 193 312 196 323 b 174 369 196 347 187 360 b 152 374 166 373 159 374 b 111 351 140 374 126 367 b 62 327 95 335 80 327 b 51 328 58 327 54 327 b -1 391 16 334 -1 363 b 53 455 -1 420 17 449 b 62 455 57 455 59 455 b 111 431 80 455 95 448 b 152 408 127 415 140 408 b 161 409 155 408 159 408 b 193 433 176 413 186 420 l 196 440 l 196 448 b 196 451 196 449 196 449 b 190 471 196 459 194 463 b 137 495 182 489 167 495 l 134 495 l 134 495 b 68 560 95 495 68 521 b 129 623 68 596 95 623 b 144 621 134 623 138 623 b 193 553 175 614 193 589 b 224 495 193 517 200 503 b 238 492 228 492 234 492 b 279 538 259 492 279 512 b 254 580 279 549 269 566 b 232 630 239 594 232 612 b 280 692 232 657 250 684 m 307 456 b 295 458 303 458 299 458 b 230 391 258 458 230 426 b 236 360 230 381 231 371 b 295 324 249 337 272 324 b 353 360 318 324 341 337 b 360 391 357 370 360 381 b 307 456 360 421 340 451 "},pictChokeCymbal:{x_min:0,x_max:227.3125,ha:232,o:"m 91 213 b 100 215 93 215 96 215 b 227 58 167 215 224 144 b 227 52 227 56 227 54 b 61 -201 227 -43 164 -138 b 29 -216 44 -212 36 -216 b 23 -210 27 -216 24 -213 b 21 -205 21 -208 21 -206 b 34 -192 21 -201 25 -197 b 122 -55 89 -161 122 -106 b 104 6 122 -33 117 -12 l 103 9 l 96 9 b 4 79 57 9 17 38 b 0 112 1 90 0 101 b 91 213 0 163 36 209 "},wiggleArpeggiatoUp:{x_min:58.53125,x_max:228.671875,ha:294,o:"m 138 371 b 142 373 140 371 141 373 b 178 342 149 373 156 366 b 228 251 217 297 228 278 b 228 244 228 248 228 247 b 176 147 227 212 212 184 b 123 73 152 122 132 93 b 121 62 122 70 121 66 b 145 13 121 48 129 31 b 153 -2 151 6 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 145 -11 b 129 -1 140 -11 136 -8 b 61 87 89 37 68 68 b 58 113 59 95 58 105 b 110 215 58 144 74 177 b 163 287 134 240 155 269 b 166 299 166 291 166 295 b 141 348 166 313 157 330 b 133 360 134 356 133 358 b 133 363 133 362 133 362 b 138 371 133 367 136 370 "},arrowheadBlackUp:{x_min:-10.890625,x_max:299.4375,ha:294,o:"m 136 460 b 142 462 137 462 140 462 b 166 449 152 462 161 456 b 171 428 168 446 168 445 b 288 131 194 322 238 209 b 298 115 295 120 296 117 b 299 106 298 112 299 109 b 273 81 299 91 287 81 b 255 86 268 81 261 83 b 155 116 225 104 183 116 l 152 116 l 149 108 b 141 83 148 102 144 91 b 134 48 137 69 134 58 b 149 9 134 34 140 24 b 153 -1 152 5 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 147 -11 b 122 2 138 -11 133 -6 b 95 61 104 20 95 38 b 107 108 95 74 99 90 b 108 113 107 111 108 112 b 107 113 108 113 108 113 b 102 113 106 113 104 113 b 31 86 76 108 53 98 b 14 80 24 81 20 80 b -10 106 0 80 -10 91 b 0 131 -10 115 -9 116 b 115 430 49 209 91 317 b 136 460 119 451 123 456 "},arrowheadBlackDown:{x_min:-10.890625,x_max:298.078125,ha:294,o:"m 138 473 b 142 474 140 473 141 474 b 164 459 148 474 153 470 b 191 402 183 442 191 423 b 181 353 191 388 187 371 b 178 349 179 352 178 349 b 179 348 178 348 179 348 b 185 349 181 348 182 348 b 255 376 210 355 234 363 b 272 381 264 381 266 381 b 298 355 287 381 298 370 b 288 330 298 348 298 345 b 171 34 238 254 194 141 b 166 13 168 16 168 16 b 144 1 161 5 152 1 b 121 15 134 1 125 5 b 115 33 119 18 117 24 b 0 330 91 145 49 252 b -10 355 -9 345 -10 348 b 13 381 -10 371 0 381 b 31 376 19 381 25 380 b 132 345 61 358 103 345 l 136 345 l 137 355 b 145 378 138 359 142 370 b 152 415 149 394 152 405 b 137 452 152 427 148 438 b 133 464 134 458 133 460 b 138 473 133 467 134 470 "},vexAccidentalMicrotonal1:{x_min:-171.5,x_max:483.1875,ha:493,o:"m -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 495 20 616 20 616 b 20 373 20 427 20 373 b 115 410 20 373 63 390 l 210 448 l 210 531 b 212 620 210 614 210 616 b 231 632 215 628 223 632 b 246 627 236 632 242 631 b 251 541 251 620 251 628 l 251 463 l 315 489 b 387 514 368 509 381 514 b 393 513 390 514 392 514 b 406 494 402 510 406 502 b 397 476 406 487 404 480 b 323 446 396 474 363 462 l 251 417 l 251 283 l 251 148 l 254 151 b 370 199 291 183 332 199 b 415 191 385 199 400 197 b 483 84 458 176 483 134 b 461 0 483 58 476 29 b 332 -142 439 -40 411 -72 l 255 -215 b 231 -229 240 -229 239 -229 b 216 -223 224 -229 220 -227 b 210 -158 210 -217 210 -223 b 210 -120 210 -148 210 -136 l 210 -29 l 205 -34 b 100 -142 182 -65 159 -88 l 23 -215 b -1 -229 9 -229 6 -229 b -19 -217 -9 -229 -16 -224 l -20 -215 l -21 48 l -21 310 l -83 287 b -152 262 -133 266 -145 262 b -157 263 -153 262 -155 262 b -171 283 -166 266 -171 274 b -161 301 -171 290 -167 297 b -91 328 -160 302 -129 315 l -21 356 l -21 487 l -20 617 l -19 621 b -8 631 -17 626 -12 630 m 210 288 b 210 401 210 351 210 401 b 114 365 209 401 167 384 l 20 327 l 20 238 l 20 148 l 21 151 b 140 199 59 183 102 199 b 206 180 164 199 187 192 l 209 177 b 209 177 209 177 209 177 b 210 288 210 177 210 199 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 m 341 131 b 328 133 337 133 332 133 b 322 133 326 133 323 133 b 257 87 296 129 273 113 l 251 80 l 251 -37 l 251 -156 l 255 -152 b 375 81 328 -72 375 20 l 375 83 b 341 131 375 113 367 126 "},vexAccidentalMicrotonal2:{x_min:-1.359375,x_max:386.5625,ha:394,o:"m 249 535 b 257 537 251 537 253 537 b 276 524 266 537 273 533 l 277 521 l 279 419 l 279 316 l 304 323 b 337 328 319 326 330 328 b 353 316 347 328 349 324 b 355 266 355 315 355 290 b 353 215 355 241 355 217 b 319 198 349 206 347 205 b 279 187 284 190 279 188 b 279 156 279 187 279 174 b 279 136 279 151 279 144 l 279 84 l 289 87 l 330 98 b 367 105 352 102 362 105 b 378 101 372 105 375 104 b 386 61 385 95 386 94 b 386 40 386 55 386 48 l 386 -5 l 385 -8 b 374 -19 383 -12 378 -18 b 291 -40 372 -19 347 -26 b 279 -43 284 -41 279 -43 b 279 -83 279 -43 279 -59 b 279 -95 279 -87 279 -91 l 279 -145 l 304 -140 b 337 -133 321 -136 330 -133 b 349 -140 343 -133 347 -136 b 355 -181 355 -145 355 -142 l 355 -197 l 355 -210 b 349 -252 355 -249 355 -247 b 300 -269 345 -258 347 -258 b 280 -274 291 -272 281 -273 l 279 -274 l 277 -378 l 277 -483 l 276 -487 b 257 -499 273 -495 265 -499 b 238 -487 249 -499 242 -495 l 236 -483 l 236 -384 l 236 -285 l 235 -285 l 212 -291 l 170 -301 b 148 -308 159 -305 148 -306 b 147 -415 147 -308 147 -313 l 147 -523 l 145 -526 b 126 -538 141 -534 133 -538 b 106 -526 118 -538 110 -534 l 104 -523 l 104 -420 b 103 -317 104 -326 104 -317 b 103 -317 103 -317 103 -317 b 50 -330 92 -322 54 -330 b 31 -317 42 -330 35 -326 b 29 -267 29 -315 29 -315 l 29 -219 l 32 -216 b 92 -192 36 -206 36 -206 l 104 -190 l 104 -138 b 103 -87 104 -91 104 -87 b 103 -87 103 -87 103 -87 b 88 -91 103 -87 96 -88 l 49 -101 b 17 -106 32 -105 23 -106 b 6 -102 13 -106 10 -105 b -1 -62 0 -97 -1 -95 b 0 -41 -1 -56 0 -49 l 0 4 l 1 6 b 10 16 2 11 6 15 b 91 37 12 18 38 24 l 104 41 l 104 93 b 103 144 104 140 104 144 b 103 144 103 144 103 144 b 50 131 92 141 54 131 b 31 144 42 131 35 137 b 29 195 29 147 29 148 l 29 242 l 32 245 b 92 269 36 255 36 255 l 104 273 l 104 377 l 104 481 l 106 485 b 126 498 110 492 118 498 b 134 495 129 498 132 496 b 145 485 138 494 142 489 l 147 481 l 147 383 l 147 283 l 152 284 b 190 294 155 285 171 290 l 230 303 l 236 305 l 236 413 l 236 521 l 238 524 b 249 535 240 528 243 533 m 236 126 b 235 177 236 154 236 177 l 235 177 b 213 172 235 177 225 174 l 170 161 b 147 155 157 158 147 155 b 147 124 147 155 147 142 b 147 102 147 117 147 111 l 147 52 l 153 54 l 228 72 l 236 74 l 236 126 m 236 -105 b 235 -54 236 -65 236 -54 l 235 -54 b 231 -55 235 -54 234 -54 b 172 -69 227 -55 204 -62 l 149 -76 l 147 -76 l 147 -127 l 147 -179 l 152 -177 b 190 -167 155 -177 171 -173 l 230 -158 l 236 -156 l 236 -105 "},vexWiggleArpeggioUp:{x_min:58.53125,x_max:228.671875,ha:294,o:"m 138 371 b 142 373 140 371 141 373 b 178 342 149 373 156 366 b 228 251 217 297 228 278 b 228 244 228 248 228 247 b 176 147 227 212 212 184 b 123 73 152 122 132 93 b 121 62 122 70 121 66 b 145 13 121 48 129 31 b 153 -2 151 6 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 145 -11 b 129 -1 140 -11 136 -8 b 61 87 89 37 68 68 b 58 113 59 95 58 105 b 110 215 58 144 74 177 b 163 287 134 240 155 269 b 166 299 166 291 166 295 b 141 348 166 313 157 330 b 133 360 134 356 133 358 b 133 363 133 362 133 362 b 138 371 133 367 136 370 "},vexNoteHeadMutedBreve:{x_min:0,x_max:370.21875,ha:378,o:"m 0 0 l 0 277 l 61 277 l 122 277 l 122 0 l 122 -278 l 61 -278 l 0 -278 l 0 0 m 246 -1 l 246 277 l 308 277 l 370 277 l 370 -1 l 370 -278 l 308 -278 l 246 -278 l 246 -1 "}},cssFontWeight:"normal",ascender:1903,underlinePosition:-125,cssFontStyle:"normal",boundingBox:{yMin:-2065.375,xMin:-695.53125,yMax:1901.578125,xMax:1159.671875},resolution:1e3,original_font_information:{postscript_name:"Gonville-18",version_string:"Version 0.1.8904 ",vendor_url:"",full_font_name:"Gonville-18",font_family_name:"Gonville-18",copyright:"No copyright is claimed on this font file.",description:"",trademark:"",designer:"",designer_url:"",unique_font_identifier:"FontForge 2.0 : Gonville-18 : 17-3-2010",license_url:"",license_description:"",manufacturer_name:"",font_sub_family_name:"18"},descender:-2066,fontFamily:"Gonville-18",lineHeight:4093,underlineThickness:50},metrics:{name:"Gonville",smufl:!1,stave:{padding:12,endPaddingMax:10,endPaddingMin:5,unalignedNotePadding:10},accidental:{noteheadAccidentalPadding:1,leftPadding:2,accidentalSpacing:3},clef:{default:{point:40,width:26},small:{point:32,width:20},annotations:{"8va":{smuflCode:"timeSig8",default:{point:20,treble:{line:-1.2,shiftX:11}},small:{point:18,treble:{line:-.4,shiftX:8}}},"8vb":{smuflCode:"timeSig8",default:{point:20,treble:{line:6.3,shiftX:10},bass:{line:4,shiftX:1}},small:{point:18,treble:{line:5.8,shiftX:6},bass:{line:3.5,shiftX:.5}}}},lineCount:{8:{point:55,shiftY:14},7:{point:47,shiftY:8},6:{point:40,shiftY:1},5:{point:30,shiftY:-6},4:{point:23,shiftY:-12}}},parenthesis:{default:{point:39,width:7},gracenote:{point:23.4,width:3}},pedalMarking:{up:{point:40},down:{point:40}},digits:{point:40,tupletPoint:28},tremolo:{default:{point:25,spacing:4,offsetYStemUp:-7,offsetYStemDown:7,offsetXStemUp:9,offsetXStemDown:-.5},grace:{point:15,spacing:4,offsetYStemUp:-7,offsetYStemDown:7,offsetXStemUp:6.5,offsetXStemDown:-.5}},staveRepetition:{default:{offsetY:25,offsetSymbol:12,spacing:5}},stem:{heightAdjustmentForFlag:-3,noteHead:{noteheadTriangleUpHalf:{offsetYBaseStemUp:5,offsetYBaseStemDown:4},noteheadTriangleUpBlack:{offsetYBaseStemUp:5,offsetYBaseStemDown:4},noteheadTriangleUpWhole:{offsetYBaseStemUp:5,offsetYBaseStemDown:4},noteheadXHalf:{offsetYBaseStemUp:-4,offsetYBaseStemDown:4},noteheadXBlack:{offsetYBaseStemUp:-4,offsetYBaseStemDown:4},noteheadXWhole:{offsetYBaseStemUp:-4,offsetYBaseStemDown:4},noteheadHalf:{offsetYBaseStemUp:-1.5,offsetYBaseStemDown:1.5},noteheadBlack:{offsetYBaseStemUp:-1.5,offsetYBaseStemDown:1.5},noteheadSquareWhite:{offsetYBaseStemDown:-5,offsetYBaseStemUp:5}}},glyphs:{flag:{shiftX:-.08,flag8thDown:{shiftX:-.16},flag16thDown:{shiftX:-.16},flag32ndDown:{shiftX:-.16,shiftY:9},flag64thDown:{shiftX:-.16,shiftY:13},flag128thDown:{shiftX:-.16,shiftY:22},flag32ndUp:{shiftY:-9},flag64thUp:{shiftY:-13},flag128thUp:{shiftY:-22}},stringNumber:{verticalPadding:8,stemPadding:2,leftPadding:5,rightPadding:6},textNote:{point:40,default:{},ornamentTrill:{shiftX:-5,shiftY:4}},noteHead:{minPadding:2,custom:{noteheadDiamondWholeStemUp:{shiftX:-6},noteheadCircleXStemUp:{shiftX:-1.5},noteheadXWholeStemUp:{shiftX:-5},noteheadTriangleUpWholeStemUp:{shiftX:-6}}},chordSymbol:{global:{superscriptOffset:-400,subscriptOffset:300,kerningOffset:-250,lowerKerningText:["D","F","P","T","V","Y"],upperKerningText:["A","L"],spacing:100,superSubRatio:.66},csymDiminished:{scale:.8,leftSideBearing:0,advanceWidth:506,yOffset:0},csymHalfDiminished:{scale:.8,leftSideBearing:-32,advanceWidth:506,yOffset:0},csymAugmented:{scale:1,leftSideBearing:0,advanceWidth:530,yOffset:0},csymParensLeftTall:{scale:.8,leftSideBearing:0,advanceWidth:155,yOffset:250},csymParensRightTall:{scale:.8,leftSideBearing:-40,advanceWidth:189,yOffset:250},csymBracketLeftTall:{scale:.8,leftSideBearing:0,advanceWidth:328,yOffset:0},csymBracketRightTall:{scale:.8,leftSideBearing:1,advanceWidth:600,yOffset:0},csymParensLeftVeryTall:{scale:.9,leftSideBearing:0,advanceWidth:121,yOffset:350},csymParensRightVeryTall:{scale:.9,leftSideBearing:50,advanceWidth:111,yOffset:350},csymDiagonalArrangementSlash:{scale:.6,leftSideBearing:-1,advanceWidth:990,yOffset:0},csymMinor:{scale:.8,leftSideBearing:0,advanceWidth:482,yOffset:0},csymMajorSeventh:{scale:.9,leftSideBearing:200,yOffset:0,advanceWidth:600},accidentalSharp:{scale:.75,leftSideBearing:40,advanceWidth:250,yOffset:-402},accidentalFlat:{scale:.95,leftSideBearing:-50,advanceWidth:208,yOffset:-184}},jazzOrnaments:{brassScoop:{scale:1,xOffset:-12,yOffset:0,stemUpYOffset:0,reportedWidth:10},brassDoitMedium:{scale:1,xOffset:16,yOffset:0,stemUpYOffset:0,reportedWidth:5},brassFallLipShort:{scale:1,xOffset:17,yOffset:0,stemUpYOffset:0,reportedWidth:5},brassLiftMedium:{scale:1,xOffset:16,yOffset:5,stemUpYOffset:0,reportedWidth:5},brassFallRoughMedium:{scale:1,xOffset:16,yOffset:28,stemUpYOffset:0,reportedWidth:5},brassBend:{scale:1,xOffset:2,yOffset:-8,stemUpYOffset:24,reportedWidth:5},brassMuteClosed:{scale:1,xOffset:3,yOffset:-9,stemUpYOffset:24,reportedWidth:5},brassMuteOpen:{scale:1,xOffset:3,yOffset:-7,stemUpYOffset:25,reportedWidth:5},brassFlip:{scale:1,xOffset:10,yOffset:-4,stemUpYOffset:0,reportedWidth:5},brassJazzTurn:{scale:1,xOffset:6,yOffset:-4,stemUpYOffset:0,reportedWidth:5},brassSmear:{scale:1,xOffset:10,yOffset:-4,stemUpYOffset:0,reportedWidth:5}},tremolo:{default:{shiftY:-10},grace:{shiftY:-5}},tuplet:{noteHeadOffset:20,stemOffset:10,bottomLine:4,topModifierOffset:15}}}};return l=l.default})()})); +//# sourceMappingURL=vexflow-font-gonville.js.map \ No newline at end of file diff --git a/build/cjs/vexflow-font-gonville.js.map b/build/cjs/vexflow-font-gonville.js.map new file mode 100644 index 0000000000..8e983fb23f --- /dev/null +++ b/build/cjs/vexflow-font-gonville.js.map @@ -0,0 +1 @@ +{"version":3,"file":"vexflow-font-gonville.js","mappings":"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","sources":["webpack://VexFlowFont.Gonville/webpack/universalModuleDefinition","webpack://VexFlowFont.Gonville/webpack/bootstrap","webpack://VexFlowFont.Gonville/webpack/runtime/define property getters","webpack://VexFlowFont.Gonville/webpack/runtime/hasOwnProperty shorthand","webpack://VexFlowFont.Gonville/./src/fonts/gonville_glyphs.ts","webpack://VexFlowFont.Gonville/./entry/vexflow-font-gonville.ts","webpack://VexFlowFont.Gonville/./src/fonts/gonville_metrics.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"VexFlowFont\"] = factory();\n\telse\n\t\troot[\"VexFlowFont\"] = root[\"VexFlowFont\"] || {}, root[\"VexFlowFont\"][\"Gonville\"] = factory();\n})((typeof window !== 'undefined' ? window : typeof globalThis !== 'undefined' ? globalThis : this), function() {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","export const GonvilleFont = {\n glyphs: {\n bracketTop: {\n x_min: 0,\n x_max: 559.421875,\n ha: 571,\n o: 'm 544 204 b 548 204 545 204 547 204 b 559 194 555 204 559 199 b 559 190 559 192 559 191 b 530 156 559 188 556 184 b 462 86 510 134 481 104 b 453 76 458 81 454 77 l 446 70 l 441 65 b 434 59 439 63 436 61 l 427 54 b 409 37 426 51 416 44 b 392 23 398 29 394 26 b 387 19 389 22 387 20 b 379 13 386 19 383 16 l 371 8 l 367 5 l 359 -1 l 337 -16 b 285 -48 319 -29 298 -41 l 279 -52 b 186 -95 255 -66 210 -87 l 175 -99 b 23 -129 127 -117 68 -129 b 17 -129 20 -129 19 -129 b 1 -123 2 -129 2 -129 b 0 -49 0 -122 0 -83 b 0 4 0 -22 0 1 b 27 11 2 9 4 9 b 185 31 78 12 145 20 b 198 34 186 31 193 33 b 314 73 234 44 277 58 b 349 88 328 79 340 84 b 353 90 352 90 353 90 b 363 94 353 90 357 93 b 371 98 367 97 371 98 b 428 129 372 98 413 120 b 461 148 441 136 454 144 b 468 151 464 149 466 151 b 472 154 469 152 470 154 b 481 161 473 155 477 158 b 525 190 490 166 518 186 l 534 197 b 540 201 536 198 539 199 b 544 204 541 202 544 204 ',\n },\n bracketBottom: {\n x_min: 0,\n x_max: 559.421875,\n ha: 571,\n o: 'm 5 127 b 14 127 6 127 9 127 b 51 126 25 127 43 127 b 175 98 93 122 138 112 l 186 94 b 279 51 210 86 255 65 b 285 47 280 51 283 48 b 319 27 291 44 311 31 l 326 22 b 359 0 332 19 352 4 l 367 -6 b 371 -9 368 -6 370 -8 l 379 -15 b 387 -22 383 -18 386 -20 l 398 -30 l 411 -40 l 417 -47 l 427 -55 l 434 -61 b 441 -66 436 -62 439 -65 l 446 -72 l 453 -77 l 462 -87 b 558 -188 490 -113 549 -176 b 559 -195 559 -191 559 -194 b 548 -205 559 -201 555 -205 b 541 -204 547 -205 544 -205 b 534 -198 539 -201 536 -199 l 525 -191 b 481 -162 518 -187 490 -167 b 472 -155 477 -159 472 -156 b 468 -152 470 -155 469 -154 b 461 -149 466 -152 464 -151 b 428 -130 454 -145 441 -137 b 371 -99 413 -122 372 -99 b 363 -95 371 -99 367 -98 b 353 -91 357 -94 353 -91 b 348 -90 353 -91 352 -91 b 332 -81 343 -87 341 -86 b 27 -12 230 -37 127 -13 b 0 -5 4 -11 2 -11 b 0 58 0 -2 0 27 b 0 122 0 88 0 120 b 5 127 1 124 4 126 ',\n },\n barlineTick: {\n x_min: -80.3125,\n x_max: 78.9375,\n ha: 81,\n o: 'm 63 191 b 69 192 65 192 66 192 b 77 188 72 192 76 191 b 78 183 78 187 78 186 b 74 158 78 179 77 172 l 66 115 b 9 -161 49 30 10 -158 b -10 -187 6 -172 -1 -181 b -34 -194 -17 -191 -25 -194 b -80 -147 -58 -194 -80 -174 b -80 -141 -80 -144 -80 -142 b 9 70 -80 -134 -73 -117 l 49 163 b 63 191 59 188 61 190 ',\n },\n breathMarkTick: {\n x_min: -80.3125,\n x_max: 78.9375,\n ha: 81,\n o: 'm 63 191 b 69 192 65 192 66 192 b 77 188 72 192 76 191 b 78 183 78 187 78 186 b 74 158 78 179 77 172 l 66 115 b 9 -161 49 30 10 -158 b -10 -187 6 -172 -1 -181 b -34 -194 -17 -191 -25 -194 b -80 -147 -58 -194 -80 -174 b -80 -141 -80 -144 -80 -142 b 9 70 -80 -134 -73 -117 l 49 163 b 63 191 59 188 61 190 ',\n },\n segno: {\n x_min: -330.75,\n x_max: 329.390625,\n ha: 336,\n o: 'm -133 483 b -117 484 -127 484 -122 484 b 31 373 -51 484 9 440 b 35 348 34 365 35 356 b -25 285 35 313 10 285 b -87 331 -55 285 -76 302 b -167 402 -100 376 -133 402 b -191 398 -175 402 -183 401 b -227 341 -215 388 -227 369 b -225 320 -227 334 -227 327 b -13 74 -209 230 -125 133 b 6 65 -4 70 5 66 l 9 63 l 10 65 b 117 231 12 68 40 112 l 189 341 l 242 424 b 268 460 262 456 264 458 b 283 464 273 463 277 464 b 308 438 296 464 308 453 l 308 437 b 287 396 308 430 308 428 l 95 98 l 59 43 l 58 41 l 65 37 b 253 -156 151 -8 217 -77 b 281 -285 272 -199 281 -244 b 148 -481 281 -381 231 -463 b 115 -485 137 -484 126 -485 b -32 -376 51 -485 -9 -442 b -36 -349 -35 -366 -36 -358 b 25 -287 -36 -315 -12 -287 b 85 -333 54 -287 74 -302 b 166 -403 99 -377 133 -403 b 190 -399 174 -403 182 -402 b 225 -342 215 -390 225 -370 b 224 -322 225 -335 225 -328 b 12 -76 208 -231 125 -134 b -8 -66 2 -72 -6 -68 l -10 -65 l -12 -66 b -118 -231 -13 -68 -42 -113 l -190 -342 l -243 -426 b -269 -462 -264 -458 -265 -458 b -284 -466 -274 -464 -279 -466 b -310 -440 -298 -466 -310 -455 l -310 -438 b -288 -398 -310 -430 -308 -430 l -96 -99 l -59 -44 l -59 -43 l -66 -38 b -281 284 -198 33 -281 158 l -281 284 b -133 483 -281 392 -220 474 m 254 177 b 266 179 258 177 262 179 b 319 149 287 179 307 167 b 329 115 326 140 329 127 b 319 79 329 102 326 90 b 268 51 307 61 287 51 b 221 72 250 51 234 58 b 205 115 210 84 205 99 b 254 177 205 142 223 170 m -281 -54 b -269 -52 -277 -52 -273 -52 b -223 -73 -253 -52 -235 -59 b -206 -116 -212 -84 -206 -101 b -216 -151 -206 -129 -209 -141 b -269 -179 -228 -170 -249 -179 b -314 -159 -285 -179 -302 -173 b -330 -116 -325 -147 -330 -131 b -281 -54 -330 -88 -313 -61 ',\n },\n coda: {\n x_min: -311.6875,\n x_max: 310.328125,\n ha: 317,\n o: 'm -9 388 b -2 390 -8 390 -5 390 b 5 388 1 390 4 390 b 19 378 10 387 16 383 b 23 333 23 371 23 371 b 24 298 23 299 24 298 b 81 276 34 298 65 285 b 213 91 145 240 190 177 b 224 24 217 76 224 36 b 257 24 224 24 235 24 b 299 19 292 24 292 24 b 310 -1 306 15 310 6 b 299 -23 310 -11 306 -19 b 257 -27 292 -27 292 -27 b 224 -29 235 -27 224 -29 b 213 -95 224 -40 217 -80 b 81 -280 190 -181 145 -244 b 24 -301 65 -290 34 -301 b 23 -335 24 -301 23 -303 l 23 -340 b 17 -381 23 -374 23 -374 b -1 -391 13 -388 5 -391 b -21 -381 -9 -391 -17 -388 b -27 -340 -27 -374 -27 -374 l -27 -335 b -28 -301 -27 -303 -27 -301 b -85 -280 -38 -301 -69 -290 b -217 -95 -149 -244 -194 -181 b -228 -29 -221 -80 -228 -40 b -259 -27 -228 -29 -238 -27 b -300 -23 -294 -27 -294 -27 b -311 -2 -307 -19 -311 -11 b -294 23 -311 8 -304 19 b -259 24 -291 23 -284 24 b -228 24 -239 24 -228 24 b -217 91 -228 36 -221 76 b -85 276 -194 177 -149 240 b -28 298 -69 285 -38 298 b -27 333 -27 298 -27 299 b -27 371 -27 362 -27 369 b -9 388 -24 378 -17 385 m -27 136 b -28 247 -27 197 -28 247 b -61 216 -31 247 -53 226 b -123 33 -95 172 -121 98 l -125 24 l -76 24 l -27 24 l -27 136 m 29 242 b 24 247 27 245 24 247 b 23 136 24 247 23 197 l 23 24 l 72 24 l 121 24 l 119 33 b 29 242 115 116 77 206 m -27 -140 l -27 -27 l -76 -27 l -125 -27 l -123 -36 b -61 -220 -121 -102 -95 -176 b -28 -251 -53 -230 -31 -251 b -27 -140 -28 -251 -27 -201 m 119 -36 l 121 -27 l 72 -27 l 23 -27 l 23 -140 b 24 -251 23 -201 24 -251 b 57 -220 27 -251 49 -230 b 119 -36 91 -176 117 -102 ',\n },\n gClef: {\n x_min: -1.359375,\n x_max: 847.96875,\n ha: 865,\n o: 'm 488 1499 b 495 1500 490 1500 492 1500 b 541 1465 507 1500 521 1490 b 679 1078 622 1372 679 1210 b 677 1050 679 1068 677 1060 b 477 642 668 893 604 764 l 443 609 l 431 596 l 431 592 l 438 562 l 449 508 l 460 458 b 481 355 475 390 481 355 b 481 355 481 355 481 355 b 490 356 481 355 485 355 b 528 358 495 356 511 358 b 558 356 540 358 552 356 b 839 95 699 338 808 237 b 847 22 845 72 847 47 b 631 -303 847 -113 766 -242 b 620 -309 623 -308 620 -309 l 620 -310 b 631 -359 620 -310 626 -333 l 646 -435 l 660 -496 b 672 -588 668 -535 672 -563 b 664 -653 672 -610 669 -630 b 383 -875 630 -792 509 -875 b 201 -810 321 -875 257 -855 b 129 -680 151 -768 129 -730 b 274 -530 129 -592 200 -530 b 351 -553 300 -530 326 -538 b 412 -669 393 -582 412 -626 b 287 -805 412 -735 366 -800 l 279 -805 l 285 -809 b 383 -830 318 -823 351 -830 b 586 -718 464 -830 540 -789 b 626 -584 612 -678 626 -631 b 619 -528 626 -566 623 -548 b 612 -495 619 -526 616 -510 b 577 -324 590 -387 577 -324 b 577 -324 577 -324 577 -324 b 568 -326 575 -324 571 -324 b 528 -334 558 -328 537 -333 b 465 -338 506 -337 485 -338 b 24 -11 269 -338 87 -206 b -1 145 8 41 -1 93 b 96 442 -1 249 32 351 b 322 714 166 541 236 626 l 352 745 l 345 782 l 332 843 l 315 921 b 303 984 310 950 304 978 b 295 1082 298 1017 295 1049 b 413 1426 295 1208 336 1329 b 488 1499 436 1456 477 1496 m 549 1301 b 541 1301 547 1301 544 1301 b 411 1207 500 1301 447 1263 b 355 1004 374 1152 355 1079 b 359 942 355 984 356 963 b 371 881 362 927 363 917 l 385 818 b 392 782 389 799 392 784 l 392 782 b 434 828 393 782 424 816 b 607 1165 534 941 594 1060 b 608 1193 608 1175 608 1183 b 597 1270 608 1224 604 1254 b 549 1301 589 1286 571 1299 m 398 528 b 393 555 396 542 393 553 b 392 555 393 555 393 555 b 317 470 390 555 347 505 b 190 298 266 408 212 334 b 127 70 148 227 127 148 b 155 -77 127 19 137 -30 b 468 -303 209 -216 333 -303 b 519 -299 484 -303 502 -302 b 568 -284 541 -295 568 -287 l 568 -284 b 563 -263 568 -284 566 -274 l 534 -120 l 511 -13 l 496 61 l 480 133 b 469 187 472 176 469 187 b 468 188 469 187 469 188 b 416 162 462 188 430 172 b 337 13 364 126 337 69 b 413 -124 337 -40 363 -93 b 428 -144 424 -131 428 -137 b 428 -149 428 -145 428 -148 b 409 -166 426 -161 419 -166 b 394 -162 405 -166 400 -165 b 240 77 302 -122 240 -27 l 240 77 b 430 342 240 197 315 301 l 436 344 l 426 394 l 398 528 m 548 194 b 526 195 540 195 532 195 b 519 195 524 195 521 195 l 514 195 l 518 177 l 539 79 l 552 15 l 566 -48 l 594 -187 l 605 -240 b 612 -266 609 -254 611 -266 b 612 -266 612 -266 612 -266 b 641 -248 613 -266 630 -256 b 744 -98 692 -212 730 -156 b 751 -40 749 -79 751 -59 b 548 194 751 76 665 181 ',\n },\n cClef: {\n x_min: 0,\n x_max: 873.828125,\n ha: 892,\n o: 'm 0 0 l 0 703 l 81 703 l 164 703 l 164 0 l 164 -705 l 81 -705 l 0 -705 l 0 0 m 225 0 l 225 703 l 246 703 l 268 703 l 268 366 l 268 30 l 274 36 b 314 79 284 44 302 63 b 413 302 357 137 392 213 b 432 327 419 324 421 327 b 449 306 443 327 447 322 b 611 115 457 195 529 115 b 651 122 624 115 638 117 b 728 316 705 140 724 188 b 729 388 728 342 729 366 b 671 635 729 533 711 602 b 581 662 649 652 616 662 b 477 637 545 662 510 653 l 475 635 l 477 634 b 503 627 488 632 495 631 b 545 556 532 612 545 584 b 491 480 545 524 526 491 b 465 474 481 476 473 474 b 379 563 417 474 379 516 b 389 602 379 576 382 588 b 541 691 409 641 479 681 b 582 694 555 692 568 694 b 865 462 714 694 834 598 b 873 392 871 440 873 416 b 865 317 873 367 871 341 b 639 84 839 194 748 101 b 612 83 630 83 620 83 b 511 116 577 83 543 94 b 504 120 509 119 506 120 b 504 120 504 120 504 120 b 469 59 504 120 488 93 l 432 -1 l 469 -61 b 504 -122 488 -94 504 -122 b 504 -122 504 -122 504 -122 b 511 -117 506 -122 509 -120 b 612 -84 543 -95 577 -84 b 665 -91 630 -84 647 -87 b 869 -338 771 -122 850 -216 b 873 -392 872 -356 873 -374 b 798 -595 873 -469 847 -539 b 581 -695 741 -662 660 -695 b 406 -626 517 -695 454 -671 b 381 -563 389 -607 381 -585 b 465 -477 381 -519 413 -477 b 545 -559 514 -477 545 -519 b 503 -628 545 -587 532 -613 b 477 -635 495 -632 488 -634 l 475 -637 l 477 -638 b 581 -663 510 -655 545 -663 b 671 -637 616 -663 649 -653 b 729 -391 711 -603 729 -534 b 728 -317 729 -367 728 -344 b 623 -117 722 -173 698 -124 b 611 -116 619 -116 615 -116 b 449 -308 528 -116 457 -198 b 432 -328 447 -323 443 -328 b 413 -303 421 -328 419 -326 b 314 -80 392 -215 357 -138 b 274 -37 302 -65 284 -45 l 268 -31 l 268 -367 l 268 -705 l 246 -705 l 225 -705 l 225 0 ',\n },\n fClef: {\n x_min: -1.359375,\n x_max: 899.703125,\n ha: 918,\n o: 'm 307 349 b 332 351 315 351 323 351 b 443 340 367 351 408 347 b 741 47 607 306 720 195 b 744 0 743 31 744 16 b 660 -303 744 -90 713 -206 b 28 -755 534 -531 304 -695 b 14 -756 23 -755 19 -756 b -1 -741 4 -756 -1 -750 b 21 -720 -1 -731 1 -728 b 567 -56 337 -601 548 -344 b 568 -11 568 -41 568 -24 b 442 285 568 129 525 233 b 325 319 406 308 367 319 b 93 177 232 319 137 266 b 84 154 91 170 84 155 b 84 154 84 154 84 154 b 88 156 84 154 85 155 b 159 177 110 170 134 177 b 257 134 194 177 231 162 b 294 41 281 108 294 73 b 171 -97 294 -24 246 -90 b 156 -98 166 -97 161 -98 b 6 74 73 -98 6 -22 b 6 80 6 76 6 79 b 307 349 10 223 141 340 m 839 215 b 845 216 841 216 842 216 b 862 213 852 216 860 215 b 899 163 887 206 899 184 b 872 117 899 145 890 127 b 847 111 865 112 856 111 b 808 130 833 111 818 117 b 796 162 800 140 796 151 b 839 215 796 187 812 212 m 839 -112 b 845 -112 841 -112 842 -112 b 862 -115 852 -112 860 -113 b 899 -165 887 -122 899 -144 b 872 -210 899 -183 890 -201 b 847 -217 865 -215 856 -217 b 808 -198 833 -217 818 -210 b 796 -165 800 -188 796 -177 b 839 -112 796 -140 812 -116 ',\n },\n unpitchedPercussionClef1: {\n x_min: 0,\n x_max: 464.140625,\n ha: 474,\n o: 'm 0 0 l 0 347 l 76 347 l 153 347 l 153 0 l 153 -348 l 76 -348 l 0 -348 l 0 0 m 308 -1 l 308 347 l 386 347 l 464 347 l 464 -1 l 464 -348 l 386 -348 l 308 -348 l 308 -1 ',\n },\n '6stringTabClef': {\n x_min: -1.359375,\n x_max: 680.5625,\n ha: 694,\n o: 'm 597 1042 b 604 1042 600 1042 602 1042 b 642 1002 627 1042 642 1022 b 619 966 642 988 635 974 b 439 927 574 942 503 927 l 426 927 l 426 921 b 430 838 428 893 430 866 b 345 480 430 696 398 560 b 179 391 307 423 249 391 b 156 392 171 391 164 392 b 138 394 149 394 142 394 b 103 434 115 396 103 416 b 129 471 103 451 111 466 b 141 474 133 473 137 474 b 172 459 153 474 164 469 b 181 455 175 456 176 455 b 187 456 182 455 185 455 b 253 520 212 460 234 483 b 315 836 294 605 315 714 b 311 928 315 867 314 898 b 302 945 310 943 311 942 b 245 953 283 950 262 953 b 130 891 193 953 149 931 b 84 860 119 870 102 860 b 36 905 61 860 39 877 b 36 910 36 907 36 909 b 80 970 36 931 50 949 b 249 1017 125 1000 187 1017 b 322 1009 273 1017 299 1014 l 341 1003 b 436 991 372 995 406 991 b 577 1031 495 991 545 1004 b 597 1042 583 1038 590 1041 m 416 360 b 424 360 419 360 421 360 b 481 309 454 360 479 338 b 503 145 484 280 495 199 b 585 -185 525 16 555 -106 b 630 -245 596 -213 613 -237 l 634 -247 l 638 -245 b 647 -244 641 -245 645 -244 b 680 -278 666 -244 680 -262 b 664 -308 680 -290 675 -301 b 638 -312 658 -310 650 -312 b 613 -309 631 -312 623 -310 b 477 -201 555 -303 502 -260 b 417 -2 460 -159 434 -72 b 416 5 417 1 416 5 b 416 5 416 5 416 5 b 411 -5 415 5 413 0 b 359 -97 397 -33 377 -70 b 353 -106 355 -102 353 -105 b 359 -112 353 -108 355 -109 b 409 -130 375 -123 390 -129 b 426 -134 420 -130 421 -131 b 431 -147 428 -137 431 -141 b 420 -162 431 -152 427 -159 b 382 -169 409 -166 396 -169 b 323 -155 363 -169 341 -165 l 317 -152 l 314 -155 b 62 -303 240 -240 148 -295 b 36 -305 55 -305 44 -305 b 23 -303 29 -305 24 -305 b -1 -273 6 -299 -1 -287 b 31 -240 -1 -256 10 -240 b 36 -240 32 -240 34 -240 b 42 -241 38 -241 39 -241 b 134 -204 63 -241 99 -226 b 367 288 265 -115 357 81 b 375 330 368 313 370 320 b 416 360 383 347 400 358 m 360 -359 b 379 -359 363 -359 371 -359 b 424 -360 396 -359 416 -359 b 646 -502 536 -373 624 -430 b 649 -527 649 -510 649 -519 b 530 -673 649 -578 604 -635 l 521 -677 l 529 -681 b 653 -811 592 -714 637 -762 b 660 -853 658 -827 660 -839 b 645 -911 660 -873 656 -892 b 426 -1021 608 -981 519 -1021 b 283 -989 377 -1021 328 -1011 b 235 -949 249 -972 239 -964 b 234 -936 234 -946 234 -941 b 234 -928 234 -934 234 -931 l 235 -925 l 234 -927 l 225 -934 b 87 -982 186 -966 138 -982 b 80 -982 85 -982 83 -982 b 55 -981 70 -981 58 -981 b 17 -943 32 -981 17 -964 b 54 -904 17 -921 35 -904 b 78 -914 62 -904 72 -909 l 83 -918 l 88 -918 b 190 -831 122 -918 166 -881 b 269 -506 242 -727 269 -612 b 268 -462 269 -492 269 -477 b 266 -449 266 -458 266 -452 b 265 -444 266 -445 266 -444 b 257 -446 264 -444 261 -445 b 132 -545 196 -470 152 -505 b 88 -573 122 -563 104 -573 b 39 -523 63 -573 39 -553 b 63 -476 39 -505 44 -494 b 360 -359 136 -408 235 -369 m 419 -424 b 393 -423 411 -423 406 -423 l 375 -423 l 377 -426 b 379 -439 377 -427 378 -434 b 383 -510 382 -463 383 -487 b 314 -811 383 -609 360 -710 b 266 -893 296 -850 285 -870 b 264 -898 265 -896 264 -898 l 264 -898 b 264 -898 264 -898 264 -898 b 268 -898 264 -898 266 -898 b 273 -898 270 -898 272 -898 b 300 -909 283 -898 291 -900 b 426 -957 340 -941 385 -957 b 476 -949 443 -957 460 -954 b 547 -853 522 -931 547 -893 b 485 -745 547 -816 526 -775 b 397 -707 460 -727 432 -714 b 366 -675 375 -703 366 -692 b 396 -642 366 -657 377 -645 b 530 -557 455 -637 511 -601 b 536 -527 534 -548 536 -537 b 419 -424 536 -480 490 -437 ',\n },\n timeSig0: {\n x_min: 0,\n x_max: 514.5,\n ha: 525,\n o: 'm 236 648 b 246 648 238 648 242 648 b 288 646 261 648 283 648 b 472 513 364 634 428 587 b 514 347 502 464 514 413 b 462 163 514 272 499 217 b 257 44 409 83 333 44 b 50 163 181 44 103 83 b 0 347 14 217 0 272 b 40 513 0 413 12 464 b 236 648 87 591 155 638 m 277 614 b 253 616 273 616 261 616 b 242 616 247 616 243 616 b 170 499 193 609 181 589 b 159 348 163 446 159 398 b 166 222 159 308 161 266 b 201 91 174 138 183 106 b 257 76 215 81 235 76 b 311 91 277 76 299 81 b 347 222 330 106 338 138 b 353 348 352 266 353 308 b 344 499 353 398 351 446 b 277 614 333 587 322 606 m 257 -1 l 258 -1 l 255 -1 l 257 -1 m 257 673 l 258 673 l 255 673 l 257 673 ',\n },\n timeSig1: {\n x_min: -1.359375,\n x_max: 344.359375,\n ha: 351,\n o: 'm 126 637 l 129 638 l 198 638 l 266 638 l 269 635 b 274 631 272 634 273 632 l 277 627 l 277 395 b 279 156 277 230 277 161 b 329 88 281 123 295 106 b 344 69 341 81 344 79 b 337 55 344 62 343 59 l 333 54 l 197 54 l 61 54 l 58 55 b 50 69 53 59 50 62 b 65 88 50 79 53 81 b 80 97 72 91 74 93 b 117 156 103 113 112 129 b 117 345 117 161 117 222 l 117 528 l 100 503 l 38 406 b 14 383 24 384 23 383 b -1 398 5 383 -1 390 b 4 415 -1 403 1 409 b 16 437 5 416 10 426 l 72 539 l 100 596 b 121 632 119 631 119 631 b 126 637 122 634 125 635 m 171 -1 l 172 -1 l 170 -1 l 171 -1 m 171 673 l 172 673 l 170 673 l 171 673 ',\n },\n timeSig2: {\n x_min: -1.359375,\n x_max: 458.6875,\n ha: 468,\n o: 'm 197 648 b 216 648 201 648 208 648 b 258 646 232 648 253 648 b 419 546 333 637 393 599 b 432 489 428 528 432 509 b 356 342 432 440 405 384 b 235 278 322 313 288 295 b 69 170 166 256 107 217 b 69 169 69 170 69 169 b 69 169 69 169 69 169 b 74 173 69 169 72 170 b 209 222 112 204 163 222 b 310 195 247 222 274 215 b 371 179 332 184 352 179 b 396 181 379 179 387 179 b 428 202 409 184 423 194 b 442 212 431 209 436 212 b 458 197 450 212 458 206 b 441 148 458 190 449 165 b 299 44 409 84 353 44 b 288 45 295 44 292 44 b 250 61 274 45 268 49 b 122 99 212 86 164 99 b 73 91 104 99 88 97 b 28 63 53 84 34 72 b 14 54 25 56 20 54 b 1 62 9 54 4 56 l -1 65 l -1 79 b 0 99 -1 91 0 95 b 2 113 1 102 2 108 b 164 309 20 197 81 272 b 285 470 232 341 277 398 b 287 487 287 476 287 481 b 171 595 287 551 239 595 b 155 595 166 595 160 595 b 142 592 145 594 142 594 b 145 589 142 592 142 591 b 179 527 168 576 179 551 b 132 455 179 496 163 467 b 104 451 122 452 112 451 b 27 530 62 451 27 487 b 29 555 27 538 27 546 b 197 648 44 601 115 639 m 228 -1 l 230 -1 l 227 -1 l 228 -1 m 228 673 l 230 673 l 227 673 l 228 673 ',\n },\n timeSig3: {\n x_min: -1.359375,\n x_max: 409.6875,\n ha: 418,\n o: 'm 174 648 b 191 648 176 648 183 648 b 225 648 204 648 220 648 b 402 523 317 638 389 588 b 404 503 404 517 404 510 b 402 484 404 495 404 488 b 264 373 389 437 334 394 b 257 370 259 371 257 371 b 257 370 257 370 257 370 b 264 369 258 370 261 369 b 409 202 359 334 409 267 b 318 72 409 152 381 104 b 200 43 281 52 240 43 b 23 113 134 43 69 68 b 0 169 6 129 0 149 b 77 249 0 210 29 249 l 77 249 b 152 174 125 249 152 212 b 103 102 152 145 137 116 b 103 102 103 102 103 102 b 147 94 103 101 132 95 b 153 94 149 94 151 94 b 265 206 219 94 265 141 b 264 226 265 213 265 219 b 147 355 253 299 204 353 b 126 371 133 356 126 362 b 147 388 126 383 132 388 b 254 474 196 391 238 424 b 259 502 258 484 259 494 b 182 592 259 544 228 582 b 156 595 175 595 166 595 b 115 592 142 595 129 594 l 111 591 l 115 588 b 152 524 141 574 152 549 b 92 449 152 491 130 458 b 76 448 87 448 81 448 b -1 530 32 448 -1 488 b 20 581 -1 548 5 566 b 174 648 55 619 108 641 m 204 -1 l 205 -1 l 202 -1 l 204 -1 m 204 673 l 205 673 l 202 673 l 204 673 ',\n },\n timeSig4: {\n x_min: 0,\n x_max: 468.21875,\n ha: 478,\n o: 'm 174 637 b 232 638 175 638 189 638 b 277 638 245 638 259 638 l 378 638 l 381 635 b 389 623 386 632 389 627 b 382 609 389 617 386 613 b 366 589 381 606 372 598 l 313 528 l 245 451 l 209 410 l 155 348 l 84 267 b 59 240 72 252 59 240 b 59 240 59 240 59 240 b 151 238 59 238 68 238 l 242 238 l 242 303 b 243 371 242 369 242 370 b 289 426 245 374 254 385 l 303 441 l 317 456 l 338 483 l 360 506 l 371 520 b 386 527 375 526 381 527 b 400 519 392 527 397 524 b 401 440 401 516 401 514 b 401 377 401 423 401 402 l 401 238 l 426 238 b 453 237 449 238 450 238 b 465 217 461 234 465 226 b 460 202 465 212 464 206 b 426 197 454 197 453 197 l 401 197 l 401 180 b 451 88 402 129 412 109 b 468 69 465 81 468 79 b 461 55 468 62 466 59 l 458 54 l 321 54 l 185 54 l 182 55 b 175 69 176 59 175 62 b 191 88 175 79 176 81 b 240 180 230 109 240 129 l 240 197 l 125 197 b 73 195 104 195 87 195 b 8 197 10 195 9 197 b 0 212 2 199 0 205 b 0 212 0 212 0 212 b 20 242 0 219 0 219 b 163 610 104 344 163 492 b 174 637 163 628 166 634 m 234 -1 l 235 -1 l 232 -1 l 234 -1 m 234 673 l 235 673 l 232 673 l 234 673 ',\n },\n timeSig5: {\n x_min: 0,\n x_max: 409.6875,\n ha: 418,\n o: 'm 47 637 b 53 638 49 638 50 638 b 69 634 55 638 61 637 b 210 610 114 619 161 610 b 363 634 259 610 311 619 b 382 638 372 637 378 638 b 392 634 386 638 389 637 b 397 623 396 630 397 627 b 393 610 397 620 396 616 b 298 505 368 552 338 520 b 212 494 277 498 246 494 b 65 517 163 494 106 502 b 61 517 62 517 61 517 b 61 517 61 517 61 517 b 51 408 61 517 51 412 b 51 408 51 408 51 408 b 51 408 51 408 51 408 b 61 412 53 408 55 409 b 125 434 80 421 103 430 b 185 441 145 440 166 441 b 409 244 310 441 409 353 b 401 191 409 227 406 209 b 197 43 375 105 287 43 b 159 47 183 43 171 44 b 23 123 112 56 61 86 b 0 180 6 140 0 159 b 76 260 0 220 31 260 b 92 259 81 260 87 259 b 152 183 132 251 152 216 b 100 112 152 152 134 122 b 95 111 98 112 95 111 b 95 111 95 111 95 111 b 129 98 95 109 119 101 b 148 97 136 97 141 97 b 264 235 206 97 261 158 b 265 248 265 240 265 244 b 210 398 265 312 243 373 b 179 408 201 406 194 408 b 174 408 178 408 176 408 b 53 369 130 408 88 394 b 34 359 39 359 38 359 b 17 374 24 359 17 365 b 39 628 17 384 38 625 b 47 637 40 631 43 635 m 204 -1 l 205 -1 l 202 -1 l 204 -1 m 204 673 l 205 673 l 202 673 l 204 673 ',\n },\n timeSig6: {\n x_min: 0,\n x_max: 475.03125,\n ha: 485,\n o: 'm 255 648 b 274 648 259 648 266 648 b 314 646 288 648 307 648 b 450 555 374 637 438 594 b 454 530 453 546 454 538 b 375 451 454 485 416 451 b 328 467 359 451 343 455 b 300 526 310 483 300 503 b 352 598 300 557 319 589 b 356 599 355 598 356 599 b 352 602 356 599 355 601 b 288 616 330 612 308 616 b 210 584 257 616 230 605 b 164 433 189 559 174 508 b 160 374 163 415 160 381 b 160 374 160 374 160 374 b 160 374 160 374 160 374 b 168 377 160 374 164 376 b 258 395 200 390 228 395 b 366 367 294 395 328 387 b 475 223 436 333 475 283 b 472 197 475 215 473 206 b 349 65 462 141 419 95 b 259 43 317 51 288 43 b 167 69 230 43 200 52 b 4 290 80 113 20 195 b 0 349 1 309 0 328 b 20 467 0 391 6 433 b 255 648 58 563 155 637 m 269 363 b 257 363 265 363 261 363 b 210 345 236 363 220 356 b 186 226 196 324 186 272 b 187 198 186 216 186 206 b 213 95 191 151 202 112 b 257 76 221 83 238 76 b 270 77 261 76 266 76 b 321 156 299 81 310 99 b 329 229 326 183 329 206 b 321 301 329 252 326 274 b 269 363 311 342 298 359 m 236 -1 l 238 -1 l 235 -1 l 236 -1 m 236 673 l 238 673 l 235 673 l 236 673 ',\n },\n timeSig7: {\n x_min: 0,\n x_max: 442.359375,\n ha: 451,\n o: 'm 147 648 b 166 649 153 649 160 649 b 313 598 217 649 273 630 b 340 587 323 588 328 587 l 341 587 b 412 628 367 587 390 601 b 427 638 416 635 421 638 b 439 632 431 638 435 637 b 442 623 441 630 442 628 b 430 569 442 616 439 603 b 352 369 408 492 377 410 b 300 259 325 324 313 298 b 273 84 283 205 273 140 b 265 55 273 65 272 59 l 261 54 l 181 54 l 99 54 l 96 55 b 91 61 95 56 92 59 l 89 63 l 89 77 b 147 263 89 133 111 202 b 261 401 176 313 212 355 b 378 541 315 449 349 489 l 382 548 l 375 544 b 240 495 333 512 285 495 b 129 535 198 495 160 509 b 84 560 108 552 95 560 b 76 559 81 560 78 560 b 31 487 59 555 43 530 b 14 470 27 473 24 470 b 1 477 8 470 4 471 l 0 480 l 0 553 l 0 627 l 1 630 b 16 638 4 635 9 638 b 23 635 17 638 20 637 b 49 626 36 626 39 626 b 96 638 59 626 80 630 b 104 639 99 638 102 639 b 117 644 107 641 112 642 b 147 648 125 645 137 648 m 220 -1 l 221 -1 l 219 -1 l 220 -1 m 220 673 l 221 673 l 219 673 l 220 673 ',\n },\n timeSig8: {\n x_min: 0,\n x_max: 488.640625,\n ha: 499,\n o: 'm 217 648 b 245 649 225 648 235 649 b 453 516 343 649 430 595 b 458 478 455 503 458 491 b 412 370 458 440 441 398 b 411 369 412 369 411 369 b 415 365 411 367 412 367 b 488 231 462 331 488 281 b 472 165 488 208 483 186 b 243 43 434 86 338 43 b 63 104 178 43 112 62 b 0 233 20 140 0 186 b 73 365 0 283 24 331 l 77 369 l 72 374 b 29 476 42 406 29 441 b 217 648 29 557 103 635 m 258 605 b 242 606 253 605 247 606 b 157 552 198 606 157 580 b 160 541 157 548 159 544 b 319 413 176 503 242 452 l 337 403 l 338 406 b 359 476 352 428 359 452 b 258 605 359 537 318 595 m 138 326 b 130 330 134 328 130 330 b 130 330 130 330 130 330 b 107 305 127 330 112 313 b 84 231 91 281 84 256 b 243 86 84 156 151 86 b 249 87 245 86 246 87 b 347 156 303 88 347 120 b 344 172 347 162 345 167 b 156 319 325 227 257 281 b 138 326 151 322 144 324 m 243 -1 l 245 -1 l 242 -1 l 243 -1 m 243 673 l 245 673 l 242 673 l 243 673 ',\n },\n timeSig9: {\n x_min: 0,\n x_max: 475.03125,\n ha: 485,\n o: 'm 191 646 b 212 649 198 648 205 649 b 255 644 227 649 243 646 b 458 448 348 616 428 539 b 475 342 469 415 475 378 b 460 244 475 308 469 274 b 193 44 421 124 303 44 b 91 69 157 44 122 51 b 19 161 43 97 19 126 b 21 181 19 167 20 174 b 98 241 32 220 65 241 b 170 186 129 241 160 223 b 172 166 171 179 172 173 b 121 94 172 134 152 102 b 117 93 118 94 117 93 b 121 90 117 93 118 91 b 185 76 142 80 164 76 b 270 119 220 76 251 91 b 308 259 287 145 300 194 b 313 317 310 277 313 310 b 313 317 313 317 313 317 b 313 317 313 317 313 317 b 304 315 313 317 308 316 b 216 295 273 302 245 295 b 145 308 193 295 170 299 b 19 398 88 327 42 360 b 0 469 5 420 0 444 b 24 551 0 496 8 526 b 191 646 54 596 125 637 m 227 614 b 215 616 224 616 220 616 b 202 614 210 616 206 616 b 152 535 174 610 163 592 b 144 463 147 509 144 485 b 152 391 144 440 147 417 b 216 328 163 344 179 328 b 280 391 253 328 269 344 b 288 463 285 417 288 440 b 280 535 288 485 285 509 b 227 614 269 594 258 610 m 236 -1 l 238 -1 l 235 -1 l 236 -1 m 236 673 l 238 673 l 235 673 l 236 673 ',\n },\n timeSigCommon: {\n x_min: -1.359375,\n x_max: 556.6875,\n ha: 568,\n o: 'm 294 322 b 318 323 299 322 308 323 b 360 320 334 323 352 322 b 526 217 430 310 490 273 b 543 166 537 202 543 184 b 447 70 543 117 503 70 b 445 70 447 70 446 70 b 359 159 394 72 359 113 b 368 201 359 173 362 187 b 442 245 382 229 412 245 b 455 244 446 245 451 245 b 460 244 458 244 460 244 b 460 244 460 244 460 244 b 454 248 460 244 458 245 b 325 291 417 276 372 291 b 285 287 313 291 299 290 b 144 -2 183 269 144 190 b 281 -290 144 -208 179 -280 b 304 -291 289 -291 298 -291 b 524 -105 412 -291 506 -212 b 541 -84 526 -88 530 -84 b 556 -101 551 -84 556 -90 b 549 -138 556 -111 553 -122 b 334 -322 521 -237 435 -310 b 302 -324 323 -323 313 -324 b 13 -101 172 -324 54 -234 b -1 -1 4 -68 -1 -34 b 294 322 -1 161 121 303 ',\n },\n timeSigCutCommon: {\n x_min: 0,\n x_max: 556.6875,\n ha: 568,\n o: 'm 289 545 b 298 546 292 545 295 546 b 318 533 306 546 315 541 b 319 428 319 530 319 528 l 319 327 l 334 327 b 526 223 412 326 485 285 b 543 172 537 206 543 190 b 447 76 543 122 503 76 b 445 76 446 76 446 76 b 359 165 394 77 359 119 b 368 205 359 179 362 192 b 441 251 382 233 412 251 b 455 249 446 251 451 251 b 460 248 458 249 460 248 b 460 248 460 248 460 248 b 454 254 460 249 458 251 b 334 295 419 280 378 294 l 319 295 l 319 4 l 319 -287 l 321 -285 b 328 -285 322 -285 325 -285 b 524 -99 424 -277 507 -198 b 541 -79 526 -84 530 -79 b 556 -97 551 -79 556 -84 b 548 -133 556 -105 553 -117 b 334 -317 521 -233 434 -306 b 322 -319 329 -317 323 -317 l 319 -319 l 319 -424 b 319 -471 319 -444 319 -459 b 313 -541 319 -544 318 -535 b 298 -548 308 -545 303 -548 b 279 -534 289 -548 281 -542 b 277 -424 277 -531 277 -530 l 277 -317 l 273 -317 b 13 -95 153 -305 51 -217 b 0 2 4 -62 0 -29 b 182 295 0 126 66 238 b 274 324 210 309 249 320 l 277 324 l 277 427 b 279 533 277 528 277 530 b 289 545 281 538 285 542 m 277 2 b 277 291 277 161 277 291 b 268 288 277 291 273 290 b 144 1 179 265 144 184 b 276 -284 144 -199 175 -267 l 277 -285 l 277 2 ',\n },\n timeSigPlus: {\n x_min: 0,\n x_max: 319.859375,\n ha: 326,\n o: 'm 149 508 b 159 509 152 509 155 509 b 186 494 170 509 181 503 b 190 440 190 487 190 488 l 190 430 l 190 377 l 242 377 l 251 377 b 303 373 298 377 296 377 b 319 345 314 367 319 356 b 304 319 319 335 314 324 b 250 315 296 315 299 315 l 242 315 l 190 315 l 190 262 l 190 252 b 186 198 190 204 190 205 b 159 183 179 188 170 183 b 132 198 148 183 138 188 b 127 252 127 205 127 204 l 127 262 l 127 315 l 76 315 l 68 315 b 14 319 20 315 21 315 b 0 347 4 324 0 335 b 14 373 0 356 4 367 b 68 377 21 377 20 377 l 76 377 l 127 377 l 127 430 l 127 440 b 132 494 127 488 127 487 b 149 508 136 501 142 505 ',\n },\n timeSigPlusSmall: {\n x_min: 0,\n x_max: 319.859375,\n ha: 326,\n o: 'm 149 508 b 159 509 152 509 155 509 b 186 494 170 509 181 503 b 190 440 190 487 190 488 l 190 430 l 190 377 l 242 377 l 251 377 b 303 373 298 377 296 377 b 319 345 314 367 319 356 b 304 319 319 335 314 324 b 250 315 296 315 299 315 l 242 315 l 190 315 l 190 262 l 190 252 b 186 198 190 204 190 205 b 159 183 179 188 170 183 b 132 198 148 183 138 188 b 127 252 127 205 127 204 l 127 262 l 127 315 l 76 315 l 68 315 b 14 319 20 315 21 315 b 0 347 4 324 0 335 b 14 373 0 356 4 367 b 68 377 21 377 20 377 l 76 377 l 127 377 l 127 430 l 127 440 b 132 494 127 488 127 487 b 149 508 136 501 142 505 ',\n },\n timeSigMinus: {\n x_min: 0,\n x_max: 318.5,\n ha: 325,\n o: 'm 20 376 b 167 377 23 377 96 377 b 296 376 231 377 294 377 b 318 347 311 371 318 359 b 296 316 318 333 311 320 b 159 315 294 315 227 315 b 21 316 91 315 24 315 b 0 345 6 320 0 333 b 20 376 0 359 6 371 ',\n },\n timeSigParensRight: {\n x_min: 25.859375,\n x_max: 164.6875,\n ha: 168,\n o: 'm 34 369 b 40 370 35 370 38 370 b 59 353 49 370 50 367 b 164 40 122 254 155 158 b 164 0 164 33 164 16 b 164 -40 164 -16 164 -34 b 59 -353 155 -158 122 -254 b 40 -371 53 -366 47 -371 b 34 -370 38 -371 36 -370 b 25 -358 28 -367 25 -363 b 31 -337 25 -352 27 -347 b 92 0 72 -234 92 -117 b 31 335 92 116 72 233 b 25 356 27 345 25 352 b 34 369 25 363 28 366 ',\n },\n timeSigParensRightSmall: {\n x_min: 25.859375,\n x_max: 164.6875,\n ha: 168,\n o: 'm 34 369 b 40 370 35 370 38 370 b 59 353 49 370 50 367 b 164 40 122 254 155 158 b 164 0 164 33 164 16 b 164 -40 164 -16 164 -34 b 59 -353 155 -158 122 -254 b 40 -371 53 -366 47 -371 b 34 -370 38 -371 36 -370 b 25 -358 28 -367 25 -363 b 31 -337 25 -352 27 -347 b 92 0 72 -234 92 -117 b 31 335 92 116 72 233 b 25 356 27 345 25 352 b 34 369 25 363 28 366 ',\n },\n timeSigParensLeft: {\n x_min: -166.0625,\n x_max: -25.859375,\n ha: 0,\n o: 'm -49 369 b -42 370 -46 369 -44 370 b -27 360 -36 370 -29 366 b -25 355 -27 359 -25 358 b -32 335 -25 351 -28 347 b -92 52 -66 248 -87 159 b -93 -1 -93 43 -93 20 b -92 -54 -93 -23 -93 -45 b -32 -337 -85 -162 -66 -251 b -25 -355 -27 -349 -25 -352 b -42 -371 -25 -365 -32 -371 b -61 -353 -50 -371 -51 -369 b -163 -63 -119 -262 -153 -165 b -166 -1 -166 -37 -166 -31 b -163 62 -166 30 -166 36 b -61 352 -153 163 -119 260 b -49 369 -54 365 -51 366 ',\n },\n timeSigParensLeftSmall: {\n x_min: -166.0625,\n x_max: -25.859375,\n ha: 0,\n o: 'm -49 369 b -42 370 -46 369 -44 370 b -27 360 -36 370 -29 366 b -25 355 -27 359 -25 358 b -32 335 -25 351 -28 347 b -92 52 -66 248 -87 159 b -93 -1 -93 43 -93 20 b -92 -54 -93 -23 -93 -45 b -32 -337 -85 -162 -66 -251 b -25 -355 -27 -349 -25 -352 b -42 -371 -25 -365 -32 -371 b -61 -353 -50 -371 -51 -369 b -163 -63 -119 -262 -153 -165 b -166 -1 -166 -37 -166 -31 b -163 62 -166 30 -166 36 b -61 352 -153 163 -119 260 b -49 369 -54 365 -51 366 ',\n },\n noteheadDoubleWhole: {\n x_min: 0,\n x_max: 902.421875,\n ha: 921,\n o: 'm 17 240 b 24 241 19 241 21 241 b 32 240 28 241 31 241 b 46 229 38 238 43 234 b 50 88 50 223 50 237 b 50 -1 50 63 50 34 b 50 -90 50 -36 50 -65 b 46 -231 50 -238 50 -224 b 25 -242 42 -238 34 -242 b 0 -224 14 -242 4 -235 b 0 2 0 -222 0 -108 b 0 223 0 112 0 220 b 17 240 2 230 9 237 m 110 240 b 118 241 111 241 114 241 b 126 240 121 241 123 241 b 142 223 133 237 140 230 b 144 123 144 220 144 205 b 144 29 144 45 144 29 b 144 29 144 29 144 29 b 393 183 166 106 264 167 b 450 186 412 184 431 186 b 756 29 600 186 732 120 b 756 29 756 29 756 29 b 758 123 758 29 758 45 b 760 227 758 226 758 223 b 784 241 766 237 774 241 b 804 229 792 241 800 237 b 809 88 808 223 809 237 l 809 -1 l 809 -90 b 804 -231 809 -238 808 -224 b 784 -242 800 -238 792 -242 b 762 -231 775 -242 766 -238 b 758 -124 756 -224 758 -231 b 756 -30 758 -47 758 -30 b 756 -30 756 -30 756 -30 b 509 -184 736 -108 637 -169 b 450 -187 488 -187 469 -187 b 144 -30 300 -187 168 -122 b 144 -30 144 -30 144 -30 b 144 -124 144 -30 144 -47 b 140 -231 144 -231 144 -224 b 118 -242 134 -238 126 -242 b 92 -224 107 -242 96 -235 b 92 2 92 -222 92 -108 b 92 223 92 112 92 220 b 110 240 95 230 102 237 m 432 161 b 413 162 426 162 420 162 b 313 41 351 162 313 109 b 347 -73 313 5 323 -34 b 487 -163 385 -133 439 -163 b 578 -97 526 -163 562 -142 b 588 -43 585 -80 588 -62 b 432 161 588 47 518 147 m 868 240 b 876 241 869 241 872 241 b 884 240 879 241 882 241 b 898 229 890 238 894 234 b 902 88 902 223 902 237 l 902 -1 l 902 -90 b 898 -231 902 -238 902 -224 b 876 -242 892 -238 884 -242 b 852 -224 865 -242 854 -235 b 850 2 850 -222 850 -108 b 852 223 850 112 850 220 b 868 240 853 230 860 237 ',\n },\n noteheadWhole: {\n x_min: 0,\n x_max: 619.3125,\n ha: 632,\n o: 'm 274 184 b 307 186 285 186 296 186 b 616 22 465 186 597 116 b 619 -1 617 13 619 5 b 308 -187 619 -104 483 -187 b 0 -1 133 -187 0 -102 b 5 36 0 11 1 23 b 274 184 29 115 141 176 m 289 161 b 272 162 284 162 277 162 b 171 41 209 162 171 108 b 205 -73 171 5 182 -34 b 345 -163 243 -133 298 -163 b 436 -98 385 -163 420 -142 b 446 -43 443 -80 446 -62 b 289 161 446 47 377 147 ',\n },\n noteheadHalf: {\n x_min: 0,\n x_max: 428.75,\n ha: 438,\n o: 'm 262 186 b 273 186 266 186 272 186 b 274 186 273 186 274 186 b 285 186 274 186 280 186 b 428 48 375 181 428 122 b 386 -68 428 12 416 -29 b 155 -187 329 -145 236 -187 b 12 -111 92 -187 38 -162 b 0 -51 4 -91 0 -72 b 262 186 0 58 122 179 m 366 131 b 352 134 362 133 357 134 b 219 81 321 134 269 115 b 47 -111 126 23 50 -62 b 47 -112 47 -111 47 -112 b 77 -136 47 -129 58 -136 b 264 -45 118 -136 194 -101 b 382 109 336 12 382 76 b 366 131 382 120 377 129 ',\n },\n noteheadBlack: {\n x_min: 0,\n x_max: 428.75,\n ha: 438,\n o: 'm 262 186 b 273 186 266 186 272 186 b 274 186 273 186 274 186 b 285 186 274 186 280 186 b 428 48 375 181 428 122 b 386 -68 428 12 416 -29 b 155 -187 329 -145 236 -187 b 12 -111 92 -187 38 -162 b 0 -51 4 -91 0 -72 b 262 186 0 58 122 179 ',\n },\n noteheadXWhole: {\n x_min: 0,\n x_max: 598.890625,\n ha: 611,\n o: 'm 62 181 b 77 183 66 183 72 183 b 91 181 83 183 88 183 b 202 131 100 180 106 177 l 299 87 l 394 131 b 517 183 499 181 502 183 b 519 183 517 183 518 183 b 598 104 567 183 598 144 b 577 49 598 84 592 65 b 518 15 567 38 563 37 b 484 0 499 6 484 0 b 518 -16 484 -1 499 -8 b 577 -51 563 -38 567 -40 b 598 -105 592 -66 598 -86 b 519 -184 598 -145 567 -184 b 517 -184 518 -184 517 -184 b 394 -133 502 -184 499 -183 l 299 -88 l 202 -133 b 81 -184 99 -183 95 -184 b 77 -184 80 -184 78 -184 b 0 -105 29 -184 0 -145 b 20 -51 0 -86 5 -66 b 80 -16 29 -40 34 -38 b 114 -1 98 -8 114 -1 b 80 15 114 0 98 6 b 20 49 34 37 29 38 b 0 104 6 65 0 84 b 62 181 0 140 23 174 m 88 134 b 74 136 85 134 80 136 b 68 134 72 136 69 136 b 46 104 54 130 46 117 b 55 81 46 95 49 88 b 149 34 59 76 53 80 b 224 -1 190 15 224 0 b 144 -38 224 -1 187 -18 b 54 -84 59 -79 58 -79 b 46 -105 49 -90 46 -98 b 76 -137 46 -122 58 -137 b 78 -137 77 -137 77 -137 b 194 -86 87 -137 76 -141 b 298 -36 250 -58 298 -36 b 298 -36 298 -36 298 -36 b 402 -84 299 -36 345 -58 b 518 -137 522 -141 510 -137 b 521 -137 519 -137 519 -137 b 551 -105 539 -137 551 -122 b 541 -83 551 -98 548 -90 b 447 -36 537 -77 544 -81 b 374 -1 406 -16 374 -1 b 447 34 374 0 406 15 b 541 81 544 80 537 76 b 551 104 548 88 551 97 b 521 136 551 120 539 136 b 518 136 519 136 519 136 b 517 136 518 136 517 136 l 517 136 b 402 83 511 136 511 136 b 298 34 345 56 299 34 b 298 34 298 34 298 34 b 194 84 298 34 250 56 b 88 134 137 111 89 133 ',\n },\n noteheadXHalf: {\n x_min: 0,\n x_max: 406.96875,\n ha: 415,\n o: 'm 55 181 b 70 183 61 183 66 183 b 111 170 85 183 99 179 b 160 130 115 167 137 149 l 202 95 l 245 130 b 319 181 299 176 302 179 b 334 183 325 183 330 183 b 406 109 375 183 406 148 b 401 81 406 99 405 91 b 348 24 394 65 390 59 b 318 -1 332 11 318 0 b 348 -26 318 -1 332 -12 b 401 -83 390 -61 394 -66 b 406 -111 405 -93 406 -101 b 334 -184 406 -149 375 -184 b 319 -183 330 -184 325 -184 b 245 -131 302 -180 299 -177 l 202 -97 l 160 -131 b 85 -183 107 -177 103 -180 b 70 -184 80 -184 76 -184 b 0 -111 31 -184 0 -149 b 4 -83 0 -101 1 -93 b 58 -26 10 -66 16 -61 b 88 -1 74 -12 88 -1 b 58 24 88 0 74 11 b 10 69 23 54 17 59 b 0 109 2 81 0 95 b 55 181 0 142 21 173 m 83 133 b 72 136 78 136 76 136 b 57 131 66 136 61 134 b 46 109 49 126 46 117 b 50 93 46 104 47 98 b 107 45 51 91 77 70 b 160 0 137 20 160 0 b 107 -47 160 -1 137 -22 b 50 -94 77 -72 51 -93 b 46 -111 47 -99 46 -105 b 59 -134 46 -120 50 -130 b 72 -137 62 -136 68 -137 b 83 -136 76 -137 80 -136 b 144 -84 84 -134 107 -116 b 202 -36 176 -58 202 -36 b 261 -84 202 -36 230 -58 b 323 -136 299 -116 321 -134 b 334 -137 326 -136 330 -137 b 345 -134 338 -137 343 -136 b 360 -111 355 -130 360 -120 b 355 -94 360 -105 359 -99 b 299 -47 353 -93 329 -72 b 245 0 269 -22 245 -1 b 299 45 245 0 269 20 b 355 93 329 70 353 91 b 360 109 359 98 360 104 b 345 133 360 119 355 129 b 334 136 343 134 338 136 b 323 134 330 136 326 134 b 261 83 321 133 299 115 b 202 34 230 56 202 34 b 144 83 202 34 176 56 b 83 133 106 115 84 133 ',\n },\n noteheadXBlack: {\n x_min: 0,\n x_max: 406.96875,\n ha: 415,\n o: 'm 21 183 b 28 183 24 183 25 183 b 42 181 34 183 39 183 b 127 108 47 179 47 179 b 202 41 168 72 202 41 b 279 108 204 41 238 72 b 357 177 321 145 356 176 b 375 183 363 181 370 183 b 406 151 392 183 406 169 b 404 137 406 147 405 141 b 322 62 401 131 398 129 b 251 0 284 27 251 0 b 322 -63 251 -1 284 -29 b 404 -138 398 -130 401 -133 b 406 -152 405 -142 406 -148 b 375 -184 406 -170 392 -184 b 357 -179 370 -184 363 -183 b 279 -109 356 -177 321 -147 b 202 -43 238 -73 204 -43 b 127 -109 202 -43 168 -73 b 49 -179 85 -147 50 -177 b 31 -184 43 -183 36 -184 b 0 -152 13 -184 0 -170 b 2 -138 0 -148 0 -142 b 83 -63 5 -133 8 -130 b 155 0 122 -29 155 -1 b 83 62 155 0 122 27 b 8 129 43 97 10 127 b 0 151 2 136 0 144 b 21 183 0 165 8 177 ',\n },\n noteheadCircleX: {\n x_min: 0,\n x_max: 484.5625,\n ha: 494,\n o: 'm 228 245 b 239 247 234 247 239 247 b 243 247 240 247 242 247 b 303 238 257 247 287 242 b 484 -2 417 208 484 104 b 412 -177 484 -65 461 -127 b 243 -248 363 -226 303 -248 b 6 -63 138 -248 36 -180 b 0 -1 1 -41 0 -20 b 228 245 0 127 98 240 m 255 181 b 240 183 247 183 245 183 b 232 181 238 183 235 183 b 142 152 200 180 168 170 l 138 149 l 190 97 l 242 44 l 294 97 l 345 149 l 340 152 b 255 181 315 169 284 180 m 147 -54 l 197 -1 l 147 51 l 95 104 l 91 99 b 62 -1 72 70 62 34 b 66 -43 62 -15 63 -29 b 91 -101 72 -63 80 -84 l 95 -106 l 147 -54 m 393 99 b 389 104 390 102 389 104 b 337 51 389 104 366 80 l 285 -1 l 337 -54 l 389 -106 l 393 -101 b 421 -1 412 -72 421 -36 b 393 99 421 34 412 69 m 294 -98 b 242 -45 265 -69 242 -45 b 190 -98 242 -45 219 -69 l 138 -151 l 142 -154 b 242 -184 172 -174 206 -184 b 340 -154 276 -184 311 -174 l 345 -151 l 294 -98 ',\n },\n noteheadTriangleUpWhole: {\n x_min: 0,\n x_max: 630.203125,\n ha: 643,\n o: 'm 308 204 b 314 205 310 205 313 205 b 326 201 319 205 323 204 b 355 154 328 199 338 180 b 401 83 362 142 392 95 l 409 72 b 431 41 412 66 424 49 b 619 -174 498 -51 570 -134 b 630 -192 626 -180 630 -186 b 626 -202 630 -195 628 -199 b 616 -206 623 -205 620 -206 b 552 -188 608 -206 592 -202 b 310 -155 488 -169 392 -155 b 268 -156 295 -155 281 -155 b 77 -188 197 -161 126 -173 b 13 -206 35 -202 20 -206 b 9 -206 12 -206 10 -206 b 0 -191 2 -202 0 -197 b 8 -176 0 -186 2 -180 b 204 49 58 -136 138 -43 l 220 72 l 227 83 b 295 188 245 108 281 166 b 308 204 299 197 304 202 m 315 147 b 314 147 315 147 314 147 b 314 147 314 147 314 147 b 306 129 314 145 310 138 l 296 105 b 281 72 292 97 284 77 l 274 56 b 181 -123 247 -4 212 -72 l 174 -134 l 176 -133 b 314 -123 215 -127 272 -123 b 451 -133 356 -123 413 -127 l 454 -134 l 449 -123 b 353 56 417 -72 381 -4 l 347 72 b 332 105 344 77 336 97 l 322 129 b 315 147 318 138 315 145 ',\n },\n noteheadTriangleUpHalf: {\n x_min: 0,\n x_max: 438.28125,\n ha: 447,\n o: 'm 212 205 b 219 205 213 205 216 205 b 239 183 228 205 231 204 b 421 -163 298 40 363 -83 b 438 -191 434 -180 438 -186 b 436 -197 438 -192 438 -195 b 424 -206 434 -204 431 -206 b 406 -201 420 -206 415 -205 b 216 -156 347 -172 281 -156 b 23 -205 148 -156 80 -173 b 14 -206 20 -206 17 -206 b 0 -191 6 -206 0 -201 b 6 -176 0 -187 1 -183 b 202 192 63 -104 142 45 b 212 205 205 199 208 202 m 264 48 l 249 81 l 243 94 l 242 91 b 89 -126 208 36 137 -66 b 81 -138 85 -133 81 -138 b 81 -138 81 -138 81 -138 b 81 -138 81 -138 81 -138 b 95 -133 81 -138 87 -136 b 280 -94 156 -108 221 -94 b 334 -98 299 -94 317 -95 b 343 -99 338 -99 343 -99 b 343 -99 343 -99 343 -99 b 338 -94 343 -99 341 -97 b 264 48 318 -58 287 1 ',\n },\n noteheadTriangleUpBlack: {\n x_min: -1.359375,\n x_max: 436.921875,\n ha: 446,\n o: 'm 213 205 b 217 205 215 205 216 205 b 234 194 224 205 234 199 b 236 187 234 194 235 190 l 245 167 l 261 129 l 270 106 b 355 -61 294 54 329 -13 b 420 -163 381 -105 402 -138 b 436 -188 435 -184 436 -184 b 436 -191 436 -190 436 -190 b 421 -206 436 -201 431 -206 l 421 -206 l 416 -206 l 405 -201 b 217 -158 347 -172 283 -158 b 31 -201 153 -158 88 -172 l 20 -206 l 14 -206 l 14 -206 b 0 -191 5 -206 0 -201 b -1 -188 0 -190 -1 -190 b 14 -163 -1 -186 0 -184 b 95 -34 36 -136 72 -77 b 166 106 119 8 148 68 l 175 129 l 183 148 l 200 188 b 213 205 205 199 208 202 ',\n },\n noteheadDiamondWhole: {\n x_min: 0,\n x_max: 627.46875,\n ha: 640,\n o: 'm 306 190 b 314 191 308 191 311 191 b 326 184 318 191 322 190 l 336 173 b 510 52 377 127 442 80 b 515 49 513 51 515 49 b 611 16 537 40 579 24 b 627 0 624 13 627 9 b 607 -18 627 -11 624 -13 b 330 -181 490 -49 389 -109 b 314 -192 323 -190 319 -192 b 306 -191 311 -192 308 -192 b 294 -177 302 -188 302 -188 b 257 -140 287 -170 265 -148 b 19 -18 193 -84 114 -44 b 0 0 2 -13 0 -11 b 16 16 0 9 2 13 b 110 49 47 24 89 40 b 117 52 111 49 114 51 b 145 65 126 56 130 58 b 281 163 200 93 245 124 b 300 186 288 170 291 174 b 306 190 300 187 303 188 m 317 137 b 313 142 315 141 314 142 b 308 137 313 142 311 141 b 161 4 276 84 220 33 b 155 0 159 1 155 0 b 163 -4 155 0 159 -2 b 308 -138 220 -34 276 -84 b 313 -142 311 -141 313 -142 b 317 -138 314 -142 315 -141 b 464 -4 351 -84 406 -34 b 470 0 468 -2 470 0 b 464 4 470 0 468 1 b 317 137 406 33 351 84 ',\n },\n noteheadDiamondHalf: {\n x_min: 0,\n x_max: 438.28125,\n ha: 447,\n o: 'm 212 190 b 219 191 213 191 216 191 b 236 176 225 191 228 190 b 419 18 277 105 341 49 b 436 5 431 13 434 11 b 438 -1 438 4 438 1 b 424 -16 438 -8 432 -13 b 356 -49 409 -20 379 -36 b 234 -180 306 -83 258 -133 b 219 -192 230 -188 224 -192 b 200 -176 213 -192 206 -187 b 9 -15 157 -102 89 -45 b 0 0 2 -12 0 -6 b 16 18 0 9 2 12 b 200 176 93 48 159 104 b 212 190 205 186 208 188 m 239 113 b 236 117 238 116 238 117 b 230 108 235 117 234 115 b 92 -15 196 58 140 8 b 88 -18 91 -16 88 -18 b 92 -20 88 -18 91 -19 b 198 -116 130 -43 166 -74 b 200 -117 200 -117 200 -117 b 201 -117 200 -117 201 -117 b 264 -43 212 -98 242 -62 b 345 15 288 -19 321 4 b 348 18 347 16 348 16 b 344 20 348 18 347 19 b 239 113 307 41 266 79 ',\n },\n noteheadDiamondBlack: {\n x_min: 0,\n x_max: 432.828125,\n ha: 442,\n o: 'm 209 186 b 213 187 210 187 212 187 b 216 187 215 187 216 187 b 224 174 216 186 220 180 b 420 -1 269 105 338 43 b 432 -12 431 -8 432 -9 b 421 -23 432 -15 432 -16 b 228 -180 345 -70 264 -137 b 219 -188 221 -188 221 -188 l 219 -188 b 208 -177 215 -188 215 -188 b 10 1 163 -106 93 -44 b 0 11 0 6 0 8 b 10 22 0 13 0 15 b 202 179 87 69 167 136 b 209 186 206 183 209 186 ',\n },\n augmentationDot: {\n x_min: 0,\n x_max: 133.390625,\n ha: 136,\n o: 'm 54 66 b 65 68 58 68 61 68 b 122 37 88 68 110 56 b 133 -1 130 26 133 12 b 104 -58 133 -23 123 -44 b 66 -69 92 -65 78 -69 b 10 -38 44 -69 23 -58 b 0 -1 2 -27 0 -13 b 54 66 0 30 20 61 ',\n },\n tremolo1: {\n x_min: -206.890625,\n x_max: 428.75,\n ha: 438,\n o: 'm 389 -351 b 394 -351 390 -351 393 -351 b 428 -385 413 -351 428 -367 b 428 -394 428 -388 428 -391 b 394 -428 426 -406 421 -410 l 332 -473 l 269 -516 l 205 -560 l 141 -603 l 77 -648 l 13 -692 l -50 -737 l -114 -780 l -145 -802 b -171 -813 -157 -810 -163 -813 b -175 -813 -172 -813 -174 -813 b -206 -777 -194 -811 -206 -795 b -202 -760 -206 -771 -205 -766 b -87 -675 -197 -752 -206 -757 l -34 -639 l 83 -557 l 145 -514 l 209 -470 l 272 -427 b 389 -351 375 -356 381 -352 ',\n },\n flag8thUp: {\n x_min: -24.5,\n x_max: 317.140625,\n ha: 324,\n o: 'm -24 -161 l -24 -5 l -20 -5 b 0 -24 -9 -5 -2 -12 b 171 -315 21 -124 84 -233 b 317 -660 268 -406 317 -531 b 187 -1014 317 -782 274 -909 b 161 -1034 172 -1034 171 -1034 b 141 -1013 149 -1034 141 -1025 b 152 -991 141 -1004 142 -1002 b 266 -682 228 -899 266 -788 b 174 -430 266 -588 236 -498 b -23 -317 136 -388 66 -348 b -24 -161 -23 -316 -24 -285 ',\n },\n flag8thDown: {\n x_min: -21.78125,\n x_max: 367.5,\n ha: 375,\n o: 'm 230 1031 b 238 1032 232 1032 235 1032 b 259 1014 245 1032 251 1027 b 367 662 330 906 367 782 b 364 602 367 641 367 621 b 232 317 352 488 304 384 b 57 120 155 245 103 187 b -1 18 31 84 6 40 b -19 4 -4 11 -12 4 l -21 4 l -21 159 l -21 315 l -16 315 b 96 335 10 315 62 324 b 315 695 227 380 315 527 b 313 738 315 709 314 724 b 224 991 304 825 273 916 b 216 1013 219 999 216 1007 b 230 1031 216 1021 220 1028 ',\n },\n flag16thUp: {\n x_min: -24.5,\n x_max: 317.140625,\n ha: 324,\n o: 'm -24 -147 l -24 -5 l -20 -5 b -1 -19 -12 -5 -4 -11 b 58 -123 6 -43 31 -86 b 196 -278 93 -173 134 -219 b 317 -570 274 -356 317 -460 b 294 -713 317 -617 308 -666 l 289 -724 l 294 -735 b 317 -873 308 -780 317 -827 b 235 -1132 317 -963 288 -1054 b 209 -1165 228 -1140 224 -1146 b 189 -1177 204 -1172 196 -1177 b 171 -1164 182 -1177 175 -1172 b 168 -1154 170 -1161 168 -1159 b 181 -1132 168 -1149 172 -1142 b 269 -891 238 -1064 269 -975 b 269 -881 269 -886 269 -884 b 262 -814 269 -857 265 -827 b 258 -800 261 -811 259 -806 b 142 -628 240 -731 198 -667 b -8 -589 112 -606 47 -589 b -20 -589 -13 -589 -19 -589 l -24 -589 l -24 -449 l -24 -308 l -20 -308 b -1 -322 -12 -308 -4 -313 b 58 -424 6 -345 31 -388 b 194 -580 93 -476 136 -523 b 259 -660 221 -606 245 -635 b 261 -663 259 -662 261 -663 b 264 -656 262 -663 262 -660 b 269 -587 268 -632 269 -610 b 264 -521 269 -566 268 -544 b 262 -512 264 -517 262 -513 b 258 -498 261 -509 259 -503 b 142 -326 240 -428 198 -365 b -8 -287 112 -303 47 -288 b -20 -287 -13 -287 -19 -287 l -24 -287 l -24 -147 ',\n },\n flag16thDown: {\n x_min: -21.78125,\n x_max: 362.0625,\n ha: 369,\n o: 'm 302 1031 b 308 1032 304 1032 307 1032 b 330 1016 318 1032 325 1027 b 362 867 351 970 362 920 b 340 738 362 824 353 780 l 336 727 l 340 717 b 362 591 355 677 362 634 b 257 323 362 496 325 401 b 204 272 243 306 227 290 b 20 56 129 206 66 133 b -1 18 12 44 0 22 b -19 4 -4 9 -12 4 l -21 4 l -21 140 l -21 276 l -12 277 b 167 333 61 288 127 309 b 319 598 262 388 319 491 b 311 664 319 620 317 642 l 310 673 l 304 664 b 204 548 279 620 250 587 b 20 333 129 483 66 409 b -1 292 12 320 0 298 b -19 280 -4 285 -12 280 l -21 280 l -21 416 l -21 552 l -12 553 b 167 609 61 564 127 585 b 319 874 264 666 319 770 b 294 992 319 914 311 954 b 288 1011 288 1004 288 1007 b 302 1031 288 1021 294 1028 ',\n },\n flag32ndUp: {\n x_min: -24.5,\n x_max: 315.78125,\n ha: 322,\n o: 'm -24 -145 l -24 -5 l -20 -5 b 1 -26 -10 -5 -6 -9 b 175 -241 31 -86 96 -166 b 314 -548 259 -323 304 -420 b 315 -589 315 -555 315 -571 b 314 -630 315 -606 315 -623 b 298 -730 311 -664 306 -699 l 295 -742 l 296 -748 b 314 -850 304 -778 311 -813 b 315 -892 315 -857 315 -874 b 314 -932 315 -909 315 -925 b 298 -1032 311 -967 306 -1002 l 295 -1045 l 296 -1050 b 314 -1153 304 -1081 311 -1115 b 315 -1193 315 -1160 315 -1177 b 314 -1235 315 -1211 315 -1228 b 217 -1526 306 -1338 270 -1444 b 201 -1533 213 -1532 208 -1533 b 182 -1522 193 -1533 185 -1529 b 179 -1514 181 -1518 179 -1517 b 189 -1489 179 -1508 182 -1501 b 266 -1217 240 -1403 266 -1308 b 262 -1156 266 -1196 265 -1177 b 110 -907 247 -1043 190 -950 b 0 -889 87 -895 50 -889 l -1 -889 l -24 -889 l -24 -749 l -24 -610 l -20 -610 b 1 -631 -10 -610 -6 -614 b 175 -846 31 -691 96 -771 b 259 -956 213 -884 236 -914 b 265 -966 262 -961 264 -966 b 265 -966 265 -966 265 -966 b 265 -953 265 -964 265 -959 b 266 -920 266 -943 266 -932 b 262 -853 266 -898 265 -873 b 110 -605 247 -741 190 -648 b 0 -587 87 -592 50 -587 l -1 -587 l -24 -587 l -24 -448 l -24 -308 l -20 -308 b 1 -328 -10 -308 -6 -312 b 175 -544 31 -388 96 -469 b 259 -655 213 -581 236 -612 b 265 -663 262 -659 264 -663 b 265 -663 265 -663 265 -663 b 265 -650 265 -663 265 -657 b 266 -617 266 -641 266 -630 b 262 -551 266 -595 265 -570 b 110 -303 247 -438 190 -345 b 0 -284 87 -290 50 -284 l -1 -284 l -24 -284 l -24 -145 ',\n },\n flag32ndDown: {\n x_min: -21.78125,\n x_max: 366.140625,\n ha: 374,\n o: 'm 276 1378 b 284 1379 279 1379 281 1379 b 306 1360 292 1379 298 1374 b 352 1247 326 1326 343 1286 b 366 1139 362 1213 366 1175 b 347 1009 366 1093 359 1049 l 344 1002 l 347 992 b 352 971 348 986 351 977 b 366 863 362 936 366 899 b 347 732 366 818 359 773 l 344 725 l 347 716 b 352 695 348 710 351 700 b 366 588 362 659 366 623 b 223 262 366 464 314 345 b 189 233 212 252 212 252 b 35 76 126 183 73 129 b -1 16 20 56 2 27 b -19 4 -4 9 -12 4 l -21 4 l -21 137 l -21 270 l -17 270 b 186 344 59 281 134 308 b 319 606 270 399 319 499 b 317 650 319 620 319 635 l 315 659 l 314 655 b 223 537 288 607 258 570 b 189 509 212 528 212 528 b 35 352 126 459 73 405 b -1 292 20 333 2 303 b -19 280 -4 285 -12 280 l -21 280 l -21 413 l -21 546 l -17 546 b 186 620 59 557 134 584 b 319 882 270 675 319 775 b 317 925 319 896 319 911 l 315 935 l 314 931 b 223 813 288 884 258 846 b 189 785 212 805 212 805 b 35 628 126 735 73 681 b -1 569 20 609 2 580 b -19 556 -4 562 -12 556 l -21 556 l -21 689 l -21 823 l -17 823 b 202 907 68 835 152 867 b 319 1157 280 968 319 1061 b 270 1338 319 1218 303 1281 b 262 1358 264 1349 262 1353 b 262 1364 262 1360 262 1363 b 276 1378 265 1371 269 1376 ',\n },\n flag64thUp: {\n x_min: -24.5,\n x_max: 314.421875,\n ha: 321,\n o: 'm -24 -145 l -24 -5 l -20 -5 b 0 -23 -9 -5 -2 -12 b 27 -87 4 -38 14 -66 b 138 -220 53 -136 88 -177 b 235 -328 179 -255 208 -288 b 314 -592 287 -409 314 -501 b 292 -732 314 -639 307 -687 l 289 -742 l 294 -756 b 314 -896 307 -802 314 -849 b 292 -1035 314 -943 307 -991 l 289 -1045 l 294 -1057 b 314 -1197 307 -1104 314 -1152 b 292 -1338 314 -1246 307 -1292 l 289 -1347 l 294 -1360 b 314 -1500 307 -1407 314 -1454 b 273 -1689 314 -1565 300 -1628 b 250 -1712 265 -1710 261 -1712 b 228 -1691 236 -1712 228 -1704 l 228 -1685 l 234 -1675 b 270 -1507 258 -1621 270 -1564 b 98 -1193 270 -1381 209 -1261 b 40 -1174 76 -1179 58 -1174 b -10 -1189 24 -1174 8 -1178 b -20 -1192 -14 -1192 -16 -1192 l -24 -1192 l -24 -1052 l -24 -913 l -20 -913 b 0 -931 -9 -913 -2 -920 b 27 -995 4 -946 14 -974 b 138 -1128 53 -1043 88 -1085 b 257 -1275 190 -1172 228 -1220 b 262 -1283 259 -1279 262 -1283 l 262 -1283 b 269 -1249 264 -1282 268 -1260 b 270 -1206 270 -1233 270 -1220 b 98 -891 270 -1075 206 -957 b 40 -871 76 -877 58 -871 b -10 -886 24 -871 8 -875 b -20 -889 -14 -889 -16 -889 l -24 -889 l -24 -749 l -24 -610 l -20 -610 b 0 -628 -9 -610 -2 -617 b 27 -692 4 -644 14 -671 b 138 -825 53 -741 88 -782 b 257 -973 190 -870 228 -917 b 262 -981 259 -977 262 -981 l 262 -981 b 269 -946 264 -979 268 -957 b 270 -903 270 -931 270 -917 b 98 -588 270 -774 206 -655 b 40 -569 76 -574 58 -569 b -10 -584 24 -569 8 -574 b -20 -587 -14 -587 -16 -587 l -24 -587 l -24 -448 l -24 -308 l -20 -308 b 0 -326 -9 -308 -2 -315 b 27 -390 4 -341 14 -369 b 138 -523 53 -438 88 -480 b 257 -670 190 -567 228 -614 b 262 -678 259 -674 262 -678 b 262 -678 262 -678 262 -678 b 269 -644 264 -677 268 -656 b 270 -601 270 -628 270 -614 b 98 -285 270 -471 206 -352 b 40 -266 76 -273 58 -266 b -10 -281 24 -266 8 -272 b -20 -284 -14 -284 -16 -284 l -24 -284 l -24 -145 ',\n },\n flag64thDown: {\n x_min: -21.78125,\n x_max: 367.5,\n ha: 375,\n o: 'm 259 1553 b 265 1553 261 1553 264 1553 b 288 1540 272 1553 277 1550 b 367 1351 340 1493 367 1424 b 336 1221 367 1308 357 1263 l 332 1211 l 333 1208 b 367 1077 356 1170 367 1124 b 336 945 367 1032 357 986 l 332 935 l 333 932 b 367 800 356 893 367 848 b 336 669 367 756 357 710 l 332 659 l 333 656 b 367 523 356 617 367 571 b 345 412 367 485 360 446 b 231 273 322 356 284 310 b -1 19 121 195 27 93 b -17 4 -4 11 -10 5 l -21 4 l -21 134 l -21 265 l -17 265 b 133 291 20 265 96 278 b 318 537 245 328 318 433 b 307 603 318 559 315 582 b 303 614 304 612 304 614 b 298 609 302 614 300 613 b 231 549 281 589 258 567 b -1 295 121 471 27 369 b -17 280 -4 287 -10 281 l -21 280 l -21 410 l -21 541 l -17 541 b 133 567 20 541 96 555 b 318 813 245 605 318 709 b 307 880 318 835 315 859 b 303 891 304 888 304 891 b 298 885 302 891 300 888 b 231 825 281 866 258 843 b -1 571 121 748 27 645 b -17 556 -4 563 -10 557 l -21 556 l -21 687 l -21 817 l -17 817 b 133 843 20 817 96 830 b 318 1089 245 881 318 985 b 307 1156 318 1111 315 1134 b 303 1167 304 1164 304 1167 b 298 1161 302 1167 300 1164 b 231 1102 281 1140 258 1120 b -1 848 121 1024 27 921 b -17 832 -4 839 -10 834 l -21 832 l -21 963 l -21 1093 l -17 1093 b 114 1113 12 1093 78 1103 b 313 1314 215 1142 289 1218 b 318 1364 317 1331 318 1347 b 255 1511 318 1422 295 1478 b 243 1532 247 1519 243 1525 b 259 1553 243 1540 250 1550 ',\n },\n flag128thUp: {\n x_min: -24.5,\n x_max: 313.0625,\n ha: 319,\n o: 'm -24 -133 l -24 -5 l -20 -5 b -1 -19 -12 -5 -4 -11 b 142 -213 13 -61 74 -144 b 258 -376 196 -269 230 -315 b 313 -605 295 -449 313 -528 b 292 -742 313 -652 306 -699 b 288 -752 289 -748 288 -752 b 288 -752 288 -752 288 -752 b 292 -764 289 -753 291 -757 b 313 -907 306 -811 313 -860 b 292 -1045 313 -954 306 -1002 b 288 -1054 289 -1050 288 -1054 b 288 -1054 288 -1054 288 -1054 b 292 -1067 289 -1054 291 -1060 b 313 -1210 306 -1113 313 -1161 b 292 -1346 313 -1257 306 -1304 b 288 -1357 289 -1353 288 -1357 b 288 -1357 288 -1357 288 -1357 b 292 -1368 289 -1357 291 -1363 b 313 -1512 306 -1415 313 -1464 b 292 -1648 313 -1560 306 -1605 b 288 -1660 289 -1654 288 -1660 b 288 -1660 288 -1660 288 -1660 b 292 -1671 289 -1660 291 -1665 b 313 -1814 306 -1719 313 -1766 b 250 -2040 313 -1897 291 -1977 b 232 -2062 238 -2057 236 -2059 b 221 -2065 230 -2063 225 -2065 b 200 -2045 210 -2065 201 -2057 b 200 -2043 200 -2044 200 -2044 b 208 -2026 200 -2037 202 -2034 b 269 -1826 249 -1966 269 -1897 b 153 -1544 269 -1726 230 -1625 b -9 -1472 115 -1506 58 -1481 b -21 -1471 -14 -1471 -19 -1471 l -24 -1471 l -24 -1343 l -24 -1215 l -20 -1215 b -1 -1229 -12 -1215 -4 -1221 b 142 -1424 13 -1270 74 -1353 b 257 -1582 196 -1478 228 -1524 b 264 -1594 261 -1589 264 -1594 l 264 -1594 b 265 -1582 264 -1594 264 -1589 b 270 -1525 268 -1562 270 -1544 b 153 -1243 270 -1424 228 -1321 b -9 -1170 115 -1203 58 -1178 b -21 -1168 -14 -1170 -19 -1168 l -24 -1168 l -24 -1041 l -24 -913 l -20 -913 b -1 -927 -12 -913 -4 -918 b 142 -1121 13 -967 74 -1050 b 257 -1281 196 -1175 228 -1221 b 264 -1292 261 -1286 264 -1292 l 264 -1292 b 265 -1279 264 -1292 264 -1286 b 270 -1222 268 -1261 270 -1242 b 153 -941 270 -1121 228 -1018 b -9 -867 115 -900 58 -875 b -21 -866 -14 -867 -19 -866 l -24 -866 l -24 -738 l -24 -610 l -20 -610 b -1 -624 -12 -610 -4 -616 b 142 -818 13 -664 74 -749 b 257 -978 196 -873 228 -918 b 264 -989 261 -984 264 -989 l 264 -989 b 265 -977 264 -989 264 -984 b 270 -920 268 -959 270 -939 b 153 -638 270 -818 228 -716 b -9 -564 115 -598 58 -573 b -21 -563 -14 -564 -19 -563 l -24 -563 l -24 -435 l -24 -308 l -20 -308 b -1 -322 -12 -308 -4 -313 b 142 -516 13 -363 74 -446 b 257 -675 196 -571 228 -616 b 264 -687 261 -681 264 -687 l 264 -687 b 265 -674 264 -687 264 -681 b 270 -617 268 -656 270 -637 b 153 -335 270 -516 228 -413 b -9 -262 115 -295 58 -270 b -21 -260 -14 -262 -19 -260 l -24 -260 l -24 -133 ',\n },\n flag128thDown: {\n x_min: -21.78125,\n x_max: 367.5,\n ha: 375,\n o: 'm 276 1900 b 284 1901 279 1900 281 1901 b 306 1883 291 1901 298 1896 b 367 1686 347 1825 367 1757 b 343 1558 367 1643 359 1600 l 338 1549 l 343 1537 b 367 1411 359 1497 367 1454 b 343 1282 367 1367 359 1324 l 338 1272 l 343 1261 b 367 1135 359 1221 367 1178 b 343 1007 367 1090 359 1047 l 338 996 l 343 985 b 367 859 359 945 367 902 b 343 731 367 814 359 771 l 338 720 l 343 709 b 367 582 359 667 367 626 b 289 362 367 503 340 426 b 239 312 276 345 259 330 b 29 77 152 237 76 152 b -1 18 14 54 2 30 b -19 4 -4 11 -12 4 l -21 4 l -21 133 l -20 260 l -13 262 b 98 299 17 269 62 284 b 111 305 103 302 110 305 b 167 334 123 310 156 327 b 319 595 264 391 319 491 b 313 659 319 616 318 638 b 310 667 311 664 311 667 b 307 663 310 667 308 666 b 240 588 289 637 269 614 b 16 331 141 505 62 413 b -1 294 8 316 1 302 b -19 280 -4 287 -12 280 l -21 280 l -21 408 l -20 537 l -13 538 b 98 576 17 545 62 560 b 111 581 103 578 110 581 b 167 610 123 587 156 603 b 319 871 264 667 319 767 b 313 935 319 892 318 913 b 310 942 311 941 311 942 b 307 939 310 942 308 941 b 240 864 289 913 269 889 b 16 607 141 781 62 689 b -1 570 8 592 1 578 b -19 556 -4 563 -12 556 l -21 556 l -21 684 l -20 813 l -13 814 b 98 852 17 821 62 836 b 111 857 103 855 110 857 b 167 886 123 863 156 880 b 319 1147 264 943 319 1043 b 313 1211 319 1168 318 1189 b 310 1218 311 1217 311 1218 b 307 1215 310 1218 308 1217 b 240 1140 289 1188 269 1165 b 16 884 141 1057 62 966 b -1 846 8 868 1 855 b -19 832 -4 839 -12 832 l -21 832 l -21 960 l -20 1089 l -13 1090 b 98 1128 17 1097 62 1111 b 111 1134 103 1131 110 1134 b 167 1163 123 1139 156 1156 b 319 1424 264 1220 319 1320 b 313 1486 319 1444 318 1465 b 310 1494 311 1493 311 1494 b 307 1492 310 1494 308 1493 b 240 1417 289 1464 269 1442 b 16 1160 141 1333 62 1242 b -1 1121 8 1145 1 1131 b -19 1109 -4 1115 -12 1109 l -21 1109 l -21 1236 l -20 1365 l -13 1367 b 98 1404 17 1374 62 1388 b 111 1410 103 1407 110 1410 b 250 1508 172 1437 215 1467 b 319 1701 296 1564 319 1633 b 270 1859 319 1757 303 1814 b 262 1882 265 1868 262 1875 b 276 1900 262 1890 266 1896 ',\n },\n accidentalFlat: {\n x_min: -21.78125,\n x_max: 251.8125,\n ha: 257,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 383 20 616 20 616 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 201 l -21 616 l -20 620 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ',\n },\n accidentalNatural: {\n x_min: 0,\n x_max: 239.5625,\n ha: 244,\n o: 'm 10 460 b 20 462 13 462 14 462 b 39 449 28 462 35 458 l 40 446 l 40 326 b 40 205 40 259 40 205 b 127 227 40 205 80 215 b 220 249 196 244 213 249 b 227 247 224 249 225 248 b 238 237 231 245 235 241 l 239 233 l 239 -106 l 239 -448 l 238 -451 b 219 -463 234 -459 225 -463 b 198 -451 210 -463 202 -459 l 197 -448 l 197 -324 b 197 -201 197 -248 197 -201 b 110 -223 196 -201 157 -210 b 17 -245 42 -240 24 -245 b 10 -242 13 -245 13 -244 b 0 -233 6 -241 2 -237 l 0 -230 l 0 108 l 0 446 l 0 449 b 10 460 2 453 6 458 m 197 22 b 197 70 197 41 197 58 b 196 116 197 113 197 116 l 196 116 b 118 97 196 116 160 106 l 40 77 l 40 -18 b 40 -112 40 -69 40 -112 l 119 -93 l 197 -73 l 197 22 ',\n },\n accidentalSharp: {\n x_min: 0,\n x_max: 323.9375,\n ha: 331,\n o: 'm 217 535 b 225 537 220 537 221 537 b 245 524 235 537 242 533 l 246 521 l 247 390 l 247 258 l 273 265 b 306 270 288 269 299 270 b 322 259 315 270 319 267 b 323 208 323 256 323 233 b 322 158 323 184 323 159 b 288 140 318 148 315 147 b 247 130 254 131 247 130 b 247 65 247 130 247 104 b 247 20 247 51 247 36 l 247 -88 l 273 -81 b 306 -76 289 -77 299 -76 b 318 -81 311 -76 315 -77 b 323 -123 323 -87 323 -86 l 323 -138 l 323 -154 b 318 -195 323 -191 323 -190 b 269 -210 314 -199 315 -199 b 249 -216 259 -213 250 -216 l 247 -216 l 247 -349 l 246 -483 l 245 -487 b 225 -499 242 -495 234 -499 b 206 -487 219 -499 210 -495 l 205 -483 l 205 -355 l 205 -227 l 204 -227 l 181 -233 l 138 -244 b 117 -249 127 -247 117 -249 b 115 -385 115 -249 115 -256 l 115 -523 l 114 -526 b 95 -538 110 -534 102 -538 b 74 -526 87 -538 78 -534 l 73 -523 l 73 -391 b 72 -260 73 -269 73 -260 b 72 -260 72 -260 72 -260 b 19 -273 61 -263 23 -273 b 0 -260 10 -273 4 -267 b 0 -209 0 -256 0 -256 l 0 -162 l 1 -158 b 61 -134 5 -148 5 -148 l 73 -131 l 73 -22 b 72 86 73 79 73 86 b 72 86 72 86 72 86 b 19 74 61 83 23 74 b 0 86 10 74 4 79 b 0 137 0 90 0 90 l 0 184 l 1 188 b 61 212 5 198 5 198 l 73 215 l 73 348 l 73 481 l 74 485 b 95 498 78 492 87 498 b 103 495 98 498 100 496 b 114 485 107 494 111 489 l 115 481 l 115 353 l 115 226 l 121 226 b 159 235 123 227 141 231 l 198 247 l 205 248 l 205 384 l 205 521 l 206 524 b 217 535 209 528 212 533 m 205 9 b 205 119 205 70 205 119 l 205 119 b 182 113 204 119 194 116 l 138 102 b 117 97 127 99 117 97 b 115 -12 115 97 115 91 l 115 -122 l 121 -120 b 159 -111 123 -119 141 -115 l 198 -101 l 205 -98 l 205 9 ',\n },\n accidentalDoubleSharp: {\n x_min: 0,\n x_max: 367.5,\n ha: 375,\n o: 'm 0 124 l 0 187 l 61 187 l 122 187 l 122 138 l 122 91 l 153 61 l 183 30 l 213 61 l 243 91 l 243 138 l 243 187 l 306 187 l 367 187 l 367 124 l 367 61 l 321 61 l 274 61 l 243 30 l 213 0 l 243 -31 l 274 -62 l 321 -62 l 367 -62 l 367 -124 l 367 -188 l 306 -188 l 243 -188 l 243 -140 l 243 -93 l 213 -62 l 183 -31 l 153 -62 l 122 -93 l 122 -140 l 122 -188 l 61 -188 l 0 -188 l 0 -124 l 0 -62 l 46 -62 l 92 -62 l 123 -31 l 153 0 l 123 30 l 92 61 l 46 61 l 0 61 l 0 124 ',\n },\n accidentalDoubleFlat: {\n x_min: -21.78125,\n x_max: 483.1875,\n ha: 493,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 383 20 616 20 616 l 20 148 l 21 151 b 140 199 59 183 102 199 b 206 179 164 199 187 192 l 210 176 l 210 396 l 210 617 l 212 621 b 231 632 216 628 223 632 b 250 620 239 632 247 628 b 251 383 251 616 251 616 l 251 148 l 254 151 b 370 199 291 183 332 199 b 415 191 385 199 400 197 b 483 84 458 176 483 134 b 461 0 483 58 476 29 b 332 -142 439 -40 411 -72 l 255 -215 b 231 -229 240 -229 239 -229 b 216 -223 224 -229 220 -227 b 210 -158 210 -217 210 -223 b 210 -120 210 -148 210 -136 l 210 -29 l 205 -34 b 100 -142 182 -65 159 -88 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 201 l -21 616 l -20 620 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 m 341 131 b 328 133 337 133 332 133 b 322 133 326 133 323 133 b 257 87 296 129 273 113 l 251 80 l 251 -37 l 251 -156 l 255 -152 b 375 81 328 -72 375 20 l 375 83 b 341 131 375 113 367 126 ',\n },\n accidentalParensLeft: {\n x_min: -166.0625,\n x_max: -25.859375,\n ha: 0,\n o: 'm -49 369 b -42 370 -46 369 -44 370 b -27 360 -36 370 -29 366 b -25 355 -27 359 -25 358 b -32 335 -25 351 -28 347 b -92 52 -66 248 -87 159 b -93 -1 -93 43 -93 20 b -92 -54 -93 -23 -93 -45 b -32 -337 -85 -162 -66 -251 b -25 -355 -27 -349 -25 -352 b -42 -371 -25 -365 -32 -371 b -61 -353 -50 -371 -51 -369 b -163 -63 -119 -262 -153 -165 b -166 -1 -166 -37 -166 -31 b -163 62 -166 30 -166 36 b -61 352 -153 163 -119 260 b -49 369 -54 365 -51 366 ',\n },\n accidentalParensRight: {\n x_min: 25.859375,\n x_max: 164.6875,\n ha: 168,\n o: 'm 34 369 b 40 370 35 370 38 370 b 59 353 49 370 50 367 b 164 40 122 254 155 158 b 164 0 164 33 164 16 b 164 -40 164 -16 164 -34 b 59 -353 155 -158 122 -254 b 40 -371 53 -366 47 -371 b 34 -370 38 -371 36 -370 b 25 -358 28 -367 25 -363 b 31 -337 25 -352 27 -347 b 92 0 72 -234 92 -117 b 31 335 92 116 72 233 b 25 356 27 345 25 352 b 34 369 25 363 28 366 ',\n },\n accidentalQuarterToneFlatStein: {\n x_min: 0,\n x_max: 272.21875,\n ha: 278,\n o: 'm 243 631 b 250 632 246 632 249 632 b 270 620 259 632 268 628 l 272 616 l 272 201 l 272 -212 l 270 -216 b 251 -229 268 -224 259 -229 b 227 -215 243 -229 240 -229 l 151 -142 b 32 -16 81 -80 53 -49 b 0 84 9 18 0 52 b 111 199 0 149 42 199 b 137 197 119 199 127 198 b 228 151 168 191 197 177 l 231 148 l 231 383 b 232 620 231 616 231 616 b 243 631 234 624 238 630 m 168 131 b 152 133 163 133 157 133 b 107 102 130 133 111 120 b 106 86 107 97 106 91 b 111 41 106 73 108 56 b 227 -152 125 -13 171 -90 l 231 -156 l 231 -37 l 231 80 l 225 87 b 168 131 210 111 190 126 ',\n },\n accidentalThreeQuarterTonesFlatZimmermann: {\n x_min: 0,\n x_max: 607.0625,\n ha: 619,\n o: 'm 243 631 b 250 632 246 632 249 632 b 270 620 259 632 268 628 l 272 616 l 272 201 l 272 -212 l 270 -216 b 251 -229 268 -224 259 -229 b 227 -215 243 -229 240 -229 l 151 -142 b 32 -16 81 -80 53 -49 b 0 84 9 18 0 52 b 111 199 0 149 42 199 b 137 197 119 199 127 198 b 228 151 168 191 197 177 l 231 148 l 231 383 b 232 620 231 616 231 616 b 243 631 234 624 238 630 m 168 131 b 152 133 163 133 157 133 b 107 102 130 133 111 120 b 106 86 107 97 106 91 b 111 41 106 73 108 56 b 227 -152 125 -13 171 -90 l 231 -156 l 231 -37 l 231 80 l 225 87 b 168 131 210 111 190 126 m 347 631 b 353 632 348 632 351 632 b 374 620 363 632 371 628 b 375 383 375 616 375 616 l 375 148 l 377 151 b 492 199 415 183 454 199 b 537 191 507 199 522 197 b 607 84 582 176 607 134 b 583 0 607 58 598 29 b 455 -142 562 -40 533 -72 l 378 -215 b 355 -229 364 -229 362 -229 b 334 -216 345 -229 337 -224 l 333 -212 l 333 201 l 333 616 l 334 620 b 347 631 337 624 341 630 m 465 131 b 451 133 461 133 455 133 b 445 133 449 133 446 133 b 379 87 419 129 396 113 l 375 80 l 375 -37 l 375 -156 l 378 -152 b 499 81 451 -72 499 20 l 499 83 b 465 131 499 113 490 126 ',\n },\n accidentalQuarterToneSharpStein: {\n x_min: 0,\n x_max: 193.28125,\n ha: 197,\n o: 'm 85 514 b 95 517 88 517 89 517 b 114 505 103 517 110 513 l 115 502 l 115 376 b 115 249 115 306 115 249 b 141 258 117 249 127 252 l 167 266 l 172 266 b 190 254 181 265 187 262 l 193 251 l 193 202 l 193 188 b 187 147 193 149 191 152 b 147 130 183 142 182 141 l 115 119 l 115 9 b 115 -99 115 -51 115 -99 b 141 -91 115 -99 127 -95 b 171 -81 166 -81 167 -81 l 171 -81 b 191 -94 181 -81 189 -87 b 193 -142 191 -97 193 -120 b 191 -195 193 -167 191 -194 b 125 -227 187 -205 187 -204 l 115 -230 l 115 -366 l 115 -503 l 114 -506 b 95 -519 110 -514 102 -519 b 74 -506 87 -519 78 -514 l 73 -503 l 73 -374 b 73 -245 73 -260 73 -245 b 73 -245 73 -245 73 -245 b 55 -252 72 -245 63 -249 l 32 -260 b 19 -263 27 -262 23 -263 b 4 -256 13 -263 8 -260 b 0 -215 0 -251 0 -254 b 0 -199 0 -210 0 -206 l 0 -152 l 1 -149 b 8 -140 2 -145 5 -141 b 42 -127 9 -140 24 -133 l 73 -116 l 73 -5 b 73 23 73 4 73 15 b 73 105 73 70 73 105 b 49 97 73 105 61 101 b 17 88 32 91 23 88 b 4 95 10 88 8 91 b 0 137 0 101 0 98 b 0 151 0 141 0 145 l 0 199 l 1 202 b 43 224 5 212 5 212 l 73 234 l 73 367 l 73 502 l 74 505 b 85 514 77 509 81 513 ',\n },\n accidentalThreeQuarterTonesSharpStein: {\n x_min: -1.359375,\n x_max: 455.96875,\n ha: 465,\n o: 'm 352 541 b 357 542 353 542 355 542 b 377 530 364 542 372 537 l 378 526 l 378 394 l 379 262 l 404 266 b 436 270 420 269 430 270 b 450 265 443 270 446 269 b 455 220 455 259 455 260 l 455 208 l 455 161 l 454 156 b 411 140 449 147 447 147 b 378 133 393 137 379 134 b 378 68 378 133 378 106 b 378 22 378 54 378 38 l 379 -87 l 404 -83 b 436 -79 420 -80 430 -79 b 450 -84 443 -79 446 -80 b 455 -129 455 -90 455 -88 l 455 -141 l 455 -188 l 454 -192 b 413 -209 449 -202 447 -202 b 382 -215 398 -212 383 -215 l 378 -215 l 378 -345 l 378 -380 b 375 -485 378 -484 378 -480 b 357 -494 371 -491 364 -494 b 340 -485 351 -494 344 -491 b 336 -383 337 -480 336 -484 l 336 -349 l 336 -223 l 334 -223 b 291 -231 334 -223 314 -227 l 247 -240 l 247 -371 l 246 -503 l 245 -506 b 225 -519 242 -514 234 -519 b 206 -506 219 -519 210 -514 l 205 -503 l 205 -376 l 205 -248 l 160 -256 l 115 -265 l 115 -396 l 115 -527 l 114 -531 b 95 -544 110 -539 102 -544 b 76 -531 87 -544 78 -539 l 73 -527 l 73 -399 b 73 -273 73 -330 73 -273 b 49 -277 73 -273 61 -274 b 17 -281 32 -280 24 -281 b 4 -276 10 -281 8 -280 b -1 -234 0 -269 -1 -272 b 0 -219 -1 -229 0 -224 l 0 -170 l 1 -167 b 10 -158 2 -163 6 -159 b 49 -149 13 -156 16 -155 l 73 -145 l 73 -34 b 73 76 73 26 73 76 b 49 72 73 76 61 74 b 17 68 32 69 24 68 b 4 73 10 68 8 69 b -1 115 0 80 -1 77 b 0 130 -1 120 0 124 l 0 179 l 1 181 b 10 191 2 186 6 190 b 49 199 13 192 16 194 l 73 204 l 73 338 b 73 374 73 352 73 365 b 77 483 73 484 73 477 b 95 492 81 489 88 492 b 111 483 100 492 107 489 b 115 378 115 477 115 483 l 115 342 b 117 212 115 223 115 212 b 204 229 117 212 200 227 l 205 229 l 205 365 l 205 502 l 206 505 b 225 517 210 513 219 517 b 245 505 234 517 242 513 l 246 502 l 247 369 l 247 237 l 249 237 b 336 254 253 238 336 254 b 337 390 336 254 337 302 l 337 526 l 338 530 b 352 541 341 535 347 539 m 336 15 b 336 126 336 102 336 126 l 336 126 b 291 117 336 126 315 122 l 247 109 l 247 -1 l 247 -112 l 249 -112 b 336 -95 253 -111 336 -95 b 336 15 336 -95 336 -56 m 205 -120 b 205 -55 205 -120 205 -93 b 205 -9 205 -41 205 -24 l 205 101 l 160 93 l 115 84 l 115 -26 b 115 -83 115 -49 115 -69 b 117 -137 115 -133 115 -137 b 205 -120 118 -137 204 -120 ',\n },\n accidentalBuyukMucennebFlat: {\n x_min: -171.5,\n x_max: 251.8125,\n ha: 257,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 553 20 616 20 614 b 20 491 20 503 20 491 l 20 491 b 153 535 47 501 149 535 b 174 514 167 535 174 524 b 164 496 174 508 171 501 b 92 470 164 495 132 484 l 20 445 l 20 390 b 20 363 20 378 20 370 b 20 333 20 340 20 333 l 20 333 b 153 377 47 344 149 377 b 174 356 167 377 174 367 b 164 338 174 349 171 342 b 92 312 164 338 132 326 l 20 288 l 20 219 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 30 -21 -212 -21 -212 b -21 273 -21 163 -21 273 b -84 252 -21 273 -50 263 b -152 230 -133 234 -145 230 b -157 231 -155 230 -156 231 b -171 252 -166 234 -171 244 b -160 270 -171 259 -167 266 b -27 316 -159 270 -93 294 l -21 319 l -21 374 b -21 431 -21 406 -21 431 b -84 409 -21 431 -50 421 b -152 388 -133 392 -145 388 b -157 390 -155 388 -156 388 b -171 409 -166 392 -171 401 b -160 428 -171 417 -167 424 b -27 474 -159 428 -93 451 l -21 476 l -21 546 b -20 620 -21 614 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ',\n },\n accidentalBakiyeFlat: {\n x_min: -176.9375,\n x_max: 251.8125,\n ha: 257,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 503 20 616 20 614 b 20 391 20 442 20 391 b 84 424 20 391 49 406 l 147 456 l 152 456 b 153 456 153 456 153 456 b 175 435 166 456 175 446 b 172 427 175 433 174 430 b 92 380 170 420 172 421 l 20 342 l 20 245 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 54 -21 -212 -21 -212 b -21 322 -21 201 -21 322 b -85 290 -21 322 -50 308 l -148 256 l -153 256 b -155 256 -155 256 -155 256 b -176 277 -167 256 -176 266 b -174 285 -176 280 -175 283 b -93 333 -171 294 -174 292 l -21 370 l -21 494 b -20 620 -21 616 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ',\n },\n accidentalKomaSharp: {\n x_min: -1.359375,\n x_max: 455.96875,\n ha: 465,\n o: 'm 352 541 b 357 542 353 542 355 542 b 377 530 364 542 372 537 l 378 526 l 378 394 l 379 262 l 404 266 b 436 270 420 269 430 270 b 450 265 443 270 446 269 b 455 220 455 259 455 260 l 455 208 l 455 161 l 454 156 b 411 140 449 147 447 147 b 378 133 393 137 379 134 b 378 68 378 133 378 106 b 378 22 378 54 378 38 l 379 -87 l 404 -83 b 436 -79 420 -80 430 -79 b 450 -84 443 -79 446 -80 b 455 -129 455 -90 455 -88 l 455 -141 l 455 -188 l 454 -192 b 413 -209 449 -202 447 -202 b 382 -215 398 -212 383 -215 l 378 -215 l 378 -345 l 378 -380 b 375 -485 378 -484 378 -480 b 357 -494 371 -491 364 -494 b 340 -485 351 -494 344 -491 b 336 -383 337 -480 336 -484 l 336 -349 l 336 -223 l 334 -223 b 291 -231 334 -223 314 -227 l 247 -240 l 247 -371 l 246 -503 l 245 -506 b 225 -519 242 -514 234 -519 b 206 -506 219 -519 210 -514 l 205 -503 l 205 -376 l 205 -248 l 160 -256 l 115 -265 l 115 -396 l 115 -527 l 114 -531 b 95 -544 110 -539 102 -544 b 76 -531 87 -544 78 -539 l 73 -527 l 73 -399 b 73 -273 73 -330 73 -273 b 49 -277 73 -273 61 -274 b 17 -281 32 -280 24 -281 b 4 -276 10 -281 8 -280 b -1 -234 0 -269 -1 -272 b 0 -219 -1 -229 0 -224 l 0 -170 l 1 -167 b 10 -158 2 -163 6 -159 b 49 -149 13 -156 16 -155 l 73 -145 l 73 -34 b 73 76 73 26 73 76 b 49 72 73 76 61 74 b 17 68 32 69 24 68 b 4 73 10 68 8 69 b -1 115 0 80 -1 77 b 0 130 -1 120 0 124 l 0 179 l 1 181 b 10 191 2 186 6 190 b 49 199 13 192 16 194 l 73 204 l 73 338 b 73 374 73 352 73 365 b 77 483 73 484 73 477 b 95 492 81 489 88 492 b 111 483 100 492 107 489 b 115 378 115 477 115 483 l 115 342 b 117 212 115 223 115 212 b 204 229 117 212 200 227 l 205 229 l 205 365 l 205 502 l 206 505 b 225 517 210 513 219 517 b 245 505 234 517 242 513 l 246 502 l 247 369 l 247 237 l 249 237 b 336 254 253 238 336 254 b 337 390 336 254 337 302 l 337 526 l 338 530 b 352 541 341 535 347 539 m 336 15 b 336 126 336 102 336 126 l 336 126 b 291 117 336 126 315 122 l 247 109 l 247 -1 l 247 -112 l 249 -112 b 336 -95 253 -111 336 -95 b 336 15 336 -95 336 -56 m 205 -120 b 205 -55 205 -120 205 -93 b 205 -9 205 -41 205 -24 l 205 101 l 160 93 l 115 84 l 115 -26 b 115 -83 115 -49 115 -69 b 117 -137 115 -133 115 -137 b 205 -120 118 -137 204 -120 ',\n },\n accidentalKucukMucennebSharp: {\n x_min: -1.359375,\n x_max: 255.890625,\n ha: 261,\n o: 'm 118 514 b 127 517 121 517 122 517 b 147 505 136 517 142 513 l 148 502 l 148 403 b 148 306 148 351 148 306 b 174 315 149 306 160 310 l 200 324 l 205 323 b 223 312 213 323 220 319 l 225 308 l 225 260 b 225 245 225 255 225 249 b 220 204 225 208 224 209 b 179 188 216 199 215 199 l 148 177 l 148 124 l 148 70 l 189 84 b 236 98 219 94 230 98 b 247 94 240 98 243 97 b 255 52 254 88 255 87 b 255 33 255 47 255 40 l 254 -12 l 253 -15 b 249 -22 253 -18 250 -20 l 245 -24 l 196 -41 l 148 -58 l 148 -108 b 148 -158 148 -136 148 -158 b 174 -148 148 -158 160 -154 b 204 -140 198 -140 200 -140 l 204 -140 b 224 -152 213 -140 221 -145 b 225 -201 224 -155 225 -177 b 224 -254 225 -226 224 -251 b 157 -284 220 -262 220 -262 l 148 -288 l 148 -395 l 148 -503 l 147 -506 b 127 -519 142 -514 134 -519 b 107 -506 119 -519 111 -514 l 106 -503 l 106 -403 b 106 -303 106 -316 106 -303 b 104 -303 104 -303 104 -303 b 88 -310 104 -303 96 -306 l 63 -319 b 51 -322 59 -320 55 -322 b 36 -315 46 -322 40 -319 b 31 -273 32 -309 31 -312 b 31 -258 31 -269 31 -263 l 31 -210 l 34 -206 b 40 -198 35 -204 38 -199 b 74 -186 42 -197 57 -191 l 106 -173 l 106 -123 b 106 -97 106 -112 106 -104 b 106 -72 106 -76 106 -72 b 104 -72 106 -72 106 -72 b 20 -99 89 -79 23 -99 b 0 -84 10 -99 2 -93 b -1 -37 0 -81 -1 -59 b 0 11 -1 -15 0 9 b 58 40 4 22 2 22 l 106 56 l 106 109 b 106 123 106 115 106 119 b 106 162 106 147 106 162 b 81 155 106 162 93 159 b 50 147 65 149 55 147 b 36 152 43 147 40 148 b 31 194 32 158 31 156 b 31 209 31 198 31 204 l 31 256 l 34 260 b 76 281 38 269 38 269 l 106 292 l 106 396 l 106 502 l 107 505 b 118 514 110 509 114 513 ',\n },\n articAccentAbove: {\n x_min: -348.4375,\n x_max: 24.5,\n ha: 25,\n o: 'm -330 155 b -322 156 -329 156 -326 156 b -315 156 -319 156 -317 156 b -298 147 -311 155 -308 154 b -19 30 -224 98 -122 55 l 2 26 b 24 -1 17 22 24 13 b 2 -27 24 -15 17 -23 l -19 -31 b -298 -148 -122 -56 -224 -99 b -322 -158 -313 -158 -315 -158 b -348 -131 -338 -158 -348 -145 b -344 -117 -348 -127 -347 -122 b -328 -104 -341 -112 -338 -111 b -127 -8 -269 -65 -202 -33 b -106 0 -115 -4 -106 -1 b -127 6 -106 0 -115 2 b -328 102 -202 31 -269 63 b -344 116 -338 109 -341 111 b -348 130 -347 120 -348 124 b -330 155 -348 141 -341 152 ',\n },\n articAccentBelow: {\n x_min: -348.4375,\n x_max: 24.5,\n ha: 25,\n o: 'm -330 155 b -322 156 -329 156 -326 156 b -315 156 -319 156 -317 156 b -298 147 -311 155 -308 154 b -19 30 -224 98 -122 55 l 2 26 b 24 -1 17 22 24 13 b 2 -27 24 -15 17 -23 l -19 -31 b -298 -148 -122 -56 -224 -99 b -322 -158 -313 -158 -315 -158 b -348 -131 -338 -158 -348 -145 b -344 -117 -348 -127 -347 -122 b -328 -104 -341 -112 -338 -111 b -127 -8 -269 -65 -202 -33 b -106 0 -115 -4 -106 -1 b -127 6 -106 0 -115 2 b -328 102 -202 31 -269 63 b -344 116 -338 109 -341 111 b -348 130 -347 120 -348 124 b -330 155 -348 141 -341 152 ',\n },\n articTenutoAbove: {\n x_min: 0,\n x_max: 318.5,\n ha: 325,\n o: 'm 20 376 b 167 377 23 377 96 377 b 296 376 231 377 294 377 b 318 347 311 371 318 359 b 296 316 318 333 311 320 b 159 315 294 315 227 315 b 21 316 91 315 24 315 b 0 345 6 320 0 333 b 20 376 0 359 6 371 ',\n },\n articTenutoBelow: {\n x_min: 0,\n x_max: 318.5,\n ha: 325,\n o: 'm 20 376 b 167 377 23 377 96 377 b 296 376 231 377 294 377 b 318 347 311 371 318 359 b 296 316 318 333 311 320 b 159 315 294 315 227 315 b 21 316 91 315 24 315 b 0 345 6 320 0 333 b 20 376 0 359 6 371 ',\n },\n articStaccatoAbove: {\n x_min: 0,\n x_max: 133.390625,\n ha: 136,\n o: 'm 54 66 b 65 68 58 68 61 68 b 122 37 88 68 110 56 b 133 -1 130 26 133 12 b 104 -58 133 -23 123 -44 b 66 -69 92 -65 78 -69 b 10 -38 44 -69 23 -58 b 0 -1 2 -27 0 -13 b 54 66 0 30 20 61 ',\n },\n articStaccatoBelow: {\n x_min: 0,\n x_max: 133.390625,\n ha: 136,\n o: 'm 54 66 b 65 68 58 68 61 68 b 122 37 88 68 110 56 b 133 -1 130 26 133 12 b 104 -58 133 -23 123 -44 b 66 -69 92 -65 78 -69 b 10 -38 44 -69 23 -58 b 0 -1 2 -27 0 -13 b 54 66 0 30 20 61 ',\n },\n articStaccatissimoAbove: {\n x_min: -73.5,\n x_max: 72.140625,\n ha: 74,\n o: 'm -72 252 l -73 254 l 0 254 l 72 254 l 70 252 b 0 -1 70 248 0 -1 b -72 252 -1 -1 -72 248 ',\n },\n articStaccatissimoBelow: {\n x_min: -73.5,\n x_max: 72.140625,\n ha: 74,\n o: 'm -72 252 l -73 254 l 0 254 l 72 254 l 70 252 b 0 -1 70 248 0 -1 b -72 252 -1 -1 -72 248 ',\n },\n articMarcatoAbove: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -8 -1 b -1 0 -5 -1 -4 0 b 16 -11 5 0 13 -4 b 83 -186 17 -12 47 -90 l 148 -358 l 148 -363 b 127 -385 148 -376 138 -385 b 112 -378 122 -385 118 -383 b 54 -226 110 -374 114 -385 b 0 -81 24 -147 0 -81 b -55 -226 -1 -81 -25 -147 b -114 -378 -115 -385 -111 -374 b -129 -385 -119 -383 -123 -385 b -149 -363 -140 -385 -149 -376 l -149 -358 l -84 -186 b -19 -11 -49 -90 -19 -12 b -8 -1 -17 -8 -12 -4 ',\n },\n articMarcatoBelow: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -8 -1 b -1 0 -5 -1 -4 0 b 16 -11 5 0 13 -4 b 83 -186 17 -12 47 -90 l 148 -358 l 148 -363 b 127 -385 148 -376 138 -385 b 112 -378 122 -385 118 -383 b 54 -226 110 -374 114 -385 b 0 -81 24 -147 0 -81 b -55 -226 -1 -81 -25 -147 b -114 -378 -115 -385 -111 -374 b -129 -385 -119 -383 -123 -385 b -149 -363 -140 -385 -149 -376 l -149 -358 l -84 -186 b -19 -11 -49 -90 -19 -12 b -8 -1 -17 -8 -12 -4 ',\n },\n fermataAbove: {\n x_min: -442.359375,\n x_max: 441,\n ha: 450,\n o: 'm -31 487 b -1 488 -21 488 -10 488 b 434 104 216 488 397 330 b 441 27 438 79 441 47 b 439 12 441 20 439 15 b 419 0 435 4 427 0 b 404 5 413 0 408 1 b 398 30 400 11 398 13 b 0 351 390 213 213 351 b -59 348 -20 351 -39 349 b -400 30 -251 324 -393 191 b -405 5 -400 13 -401 11 b -420 0 -409 1 -415 0 b -441 12 -428 0 -436 4 b -442 27 -441 15 -442 20 b -435 104 -442 47 -439 79 b -31 487 -401 316 -235 474 m -13 131 b -1 133 -9 133 -5 133 b 51 105 19 133 39 123 b 61 70 58 95 61 83 b 51 34 61 58 58 45 b -1 6 39 16 19 6 b -46 27 -17 6 -34 13 b -62 69 -57 38 -62 54 b -13 131 -62 98 -44 124 ',\n },\n fermataBelow: {\n x_min: -441,\n x_max: 439.640625,\n ha: 449,\n o: 'm -428 -2 b -421 0 -427 -1 -424 0 b -406 -6 -416 0 -409 -2 b -400 -31 -401 -12 -400 -15 b -1 -352 -392 -215 -215 -352 b 58 -349 19 -352 38 -351 b 398 -31 250 -326 392 -192 b 404 -6 398 -15 400 -12 b 419 -1 408 -2 413 -1 b 439 -13 427 -1 435 -5 b 439 -29 439 -16 439 -22 b 434 -105 439 -48 438 -80 b 0 -489 397 -333 213 -489 b -68 -484 -23 -489 -44 -488 b -441 -36 -280 -452 -436 -263 b -441 -30 -441 -34 -441 -31 b -428 -2 -441 -11 -439 -5 m -13 -9 b -1 -8 -9 -8 -5 -8 b 50 -36 19 -8 39 -19 b 61 -72 57 -47 61 -59 b 50 -106 61 -84 57 -97 b -1 -134 39 -124 19 -134 b -46 -115 -17 -134 -34 -129 b -62 -72 -57 -102 -62 -87 b -13 -9 -62 -44 -44 -16 ',\n },\n breathMarkComma: {\n x_min: -1.359375,\n x_max: 193.28125,\n ha: 197,\n o: 'm 78 233 b 87 233 81 233 84 233 b 187 140 132 233 174 195 b 193 102 190 127 193 115 b 43 -113 193 22 136 -62 b 27 -119 36 -116 31 -119 b 19 -108 21 -119 19 -115 b 29 -97 19 -102 20 -101 b 102 13 73 -72 102 -27 b 92 51 102 26 98 40 l 91 54 l 84 54 b 8 104 53 54 21 74 b -1 142 1 116 -1 130 b 78 233 -1 187 31 227 ',\n },\n breathMarkUpbow: {\n x_min: -170.140625,\n x_max: 168.78125,\n ha: 172,\n o: 'm -160 567 b -122 567 -159 567 -149 567 l -87 567 l -84 566 b -74 553 -78 563 -77 560 b -20 366 -73 551 -49 466 b 31 186 8 267 31 186 b 85 371 31 186 55 269 b 140 559 114 473 138 557 b 153 567 141 564 148 567 b 168 559 159 567 166 564 b 168 555 168 557 168 557 b 92 281 168 548 159 513 b 14 13 50 134 14 13 b 0 0 14 6 6 0 b -17 15 -8 0 -17 8 b -93 283 -17 15 -51 136 b -170 552 -166 533 -170 548 b -170 553 -170 552 -170 552 b -160 567 -170 560 -167 564 ',\n },\n caesura: {\n x_min: 0,\n x_max: 622.03125,\n ha: 635,\n o: 'm 398 417 b 406 419 401 419 404 419 b 427 398 417 419 427 409 b 427 391 427 395 427 392 b 34 -274 424 385 38 -272 b 20 -280 29 -278 25 -280 b 0 -259 9 -280 0 -270 b 0 -252 0 -256 0 -254 b 393 413 2 -247 389 410 b 398 417 394 415 397 416 m 592 417 b 600 419 594 419 597 419 b 622 398 611 419 622 409 b 620 391 622 395 620 392 b 227 -274 617 385 231 -272 b 213 -280 223 -278 219 -280 b 193 -259 202 -280 193 -270 b 194 -252 193 -256 193 -254 b 586 413 196 -247 582 410 b 592 417 588 415 590 416 ',\n },\n caesuraCurved: {\n x_min: 0,\n x_max: 503.609375,\n ha: 514,\n o: 'm 274 430 b 277 430 276 430 277 430 b 310 394 296 430 310 415 b 308 383 310 391 308 387 b 306 367 307 381 307 374 b 236 120 298 305 272 210 b 40 -273 189 -5 125 -134 b 20 -287 35 -283 27 -287 b 5 -281 14 -287 9 -285 b 0 -267 1 -277 0 -273 b 9 -242 0 -262 2 -255 b 246 395 137 -12 232 242 b 274 430 249 416 257 427 m 468 430 b 472 430 469 430 470 430 b 503 394 490 430 503 415 b 502 383 503 391 503 387 b 499 367 502 381 500 374 b 431 120 491 305 465 210 b 234 -273 382 -5 318 -134 b 213 -287 228 -283 220 -287 b 198 -281 208 -287 202 -285 b 193 -267 194 -277 193 -273 b 202 -242 193 -262 196 -255 b 439 395 330 -12 426 242 b 468 430 442 416 451 427 ',\n },\n restMaxima: {\n x_min: 0,\n x_max: 464.140625,\n ha: 474,\n o: 'm 0 0 l 0 347 l 76 347 l 153 347 l 153 0 l 153 -348 l 76 -348 l 0 -348 l 0 0 m 308 -1 l 308 347 l 386 347 l 464 347 l 464 -1 l 464 -348 l 386 -348 l 308 -348 l 308 -1 ',\n },\n restDoubleWhole: {\n x_min: 0,\n x_max: 386.5625,\n ha: 394,\n o: 'm 0 173 l 0 347 l 193 347 l 386 347 l 386 173 l 386 0 l 193 0 l 0 0 l 0 173 ',\n },\n restWhole: {\n x_min: 0,\n x_max: 447.8125,\n ha: 457,\n o: 'm 0 -87 l 0 0 l 223 0 l 447 0 l 447 -87 l 447 -174 l 223 -174 l 0 -174 l 0 -87 ',\n },\n restHalf: {\n x_min: 0,\n x_max: 447.8125,\n ha: 457,\n o: 'm 0 86 l 0 173 l 223 173 l 447 173 l 447 86 l 447 0 l 223 0 l 0 0 l 0 86 ',\n },\n restQuarter: {\n x_min: 0,\n x_max: 300.8125,\n ha: 307,\n o: 'm 49 505 b 53 506 50 505 51 506 b 70 496 58 506 62 503 b 81 485 73 492 78 488 l 96 473 l 111 459 l 122 449 l 134 438 l 182 396 l 255 330 b 292 291 292 298 292 298 l 292 290 l 292 284 l 283 270 b 209 36 234 197 209 113 b 288 -170 209 -44 235 -119 b 299 -184 295 -179 299 -181 b 300 -191 300 -187 300 -188 b 285 -206 300 -199 294 -206 b 280 -206 283 -206 281 -206 b 247 -201 270 -202 259 -201 b 176 -222 223 -201 197 -208 b 114 -340 136 -249 114 -292 b 172 -471 114 -384 134 -433 b 185 -492 182 -481 185 -487 b 181 -502 185 -496 183 -499 b 171 -508 176 -505 174 -508 b 152 -498 166 -508 160 -503 b 0 -284 65 -428 12 -352 b 0 -260 0 -278 0 -270 b 1 -238 0 -252 0 -242 b 148 -140 16 -177 73 -140 b 209 -148 167 -140 189 -142 b 215 -149 212 -148 215 -149 b 215 -149 215 -149 215 -149 l 215 -149 b 201 -136 215 -148 209 -142 l 157 -97 l 96 -41 b 17 34 21 24 17 29 b 17 37 17 36 17 36 b 17 38 17 37 17 38 b 25 56 17 44 17 44 b 110 298 81 131 110 219 b 46 474 110 367 88 431 b 38 491 40 480 38 487 b 49 505 38 498 42 502 ',\n },\n rest8th: {\n x_min: 0,\n x_max: 349.8125,\n ha: 357,\n o: 'm 88 302 b 103 303 93 302 98 303 b 202 224 149 303 191 270 b 205 199 204 216 205 208 b 178 129 205 173 196 147 l 175 126 l 182 127 b 307 249 236 142 284 190 b 313 259 308 254 311 258 b 329 267 317 265 323 267 b 349 247 340 267 349 259 b 201 -263 349 242 204 -258 b 182 -273 197 -270 190 -273 b 163 -260 174 -273 166 -269 b 161 -256 161 -259 161 -258 b 217 -59 161 -248 170 -220 b 272 129 247 43 272 127 b 272 129 272 129 272 129 b 264 122 272 129 268 126 b 140 80 227 94 183 80 b 36 115 102 80 65 91 b 0 194 10 136 0 165 b 88 302 0 244 32 292 ',\n },\n rest16th: {\n x_min: 0,\n x_max: 450.53125,\n ha: 460,\n o: 'm 189 302 b 204 303 193 302 198 303 b 303 224 250 303 292 270 b 306 199 304 216 306 208 b 279 129 306 173 296 147 l 276 126 l 281 127 b 408 249 337 142 385 190 b 412 259 409 254 412 258 b 430 267 417 265 423 267 b 450 247 441 267 450 259 b 200 -605 450 242 204 -599 b 182 -616 197 -612 190 -616 b 163 -602 174 -616 166 -610 b 161 -598 161 -601 161 -601 b 217 -402 161 -589 170 -562 b 272 -213 247 -298 272 -213 b 272 -213 272 -213 272 -213 b 264 -219 272 -213 268 -216 b 140 -262 227 -247 182 -262 b 36 -226 102 -262 65 -249 b 0 -145 12 -206 0 -176 b 17 -84 0 -124 5 -104 b 103 -38 38 -54 70 -38 b 191 -91 137 -38 172 -56 b 205 -141 201 -106 205 -124 b 178 -212 205 -167 196 -194 l 175 -215 l 182 -213 b 307 -93 236 -198 284 -151 b 372 129 308 -88 372 127 b 372 129 372 129 372 129 b 364 122 372 129 368 126 b 240 80 328 94 283 80 b 137 115 202 80 166 91 b 99 194 111 136 99 165 b 189 302 99 244 133 292 ',\n },\n rest32nd: {\n x_min: 0,\n x_max: 551.25,\n ha: 563,\n o: 'm 289 644 b 304 645 294 645 299 645 b 404 566 349 645 392 613 b 406 541 405 557 406 549 b 379 471 406 514 397 489 l 377 467 l 382 470 b 509 591 438 485 485 531 b 513 601 510 595 513 599 b 530 609 518 607 524 609 b 551 588 540 609 551 602 b 200 -605 551 584 204 -599 b 182 -616 197 -612 190 -616 b 163 -602 174 -616 166 -610 b 161 -598 161 -601 161 -601 b 217 -402 161 -589 170 -562 b 272 -213 247 -298 272 -213 b 272 -213 272 -213 272 -213 b 264 -219 272 -213 268 -216 b 140 -262 227 -247 182 -262 b 36 -226 102 -262 65 -249 b 0 -145 12 -206 0 -176 b 17 -84 0 -124 5 -104 b 103 -38 38 -54 70 -38 b 191 -91 137 -38 172 -56 b 205 -141 201 -106 205 -124 b 178 -212 205 -167 196 -194 l 175 -215 l 182 -213 b 307 -93 236 -198 284 -151 b 372 129 308 -88 372 127 b 372 129 372 129 372 129 b 364 122 372 129 368 126 b 240 80 328 94 283 80 b 137 115 202 80 166 91 b 99 195 112 136 99 165 b 118 256 99 217 106 238 b 204 303 138 287 171 303 b 292 249 238 303 273 285 b 306 199 302 234 306 217 b 279 129 306 173 296 148 l 276 126 l 281 127 b 408 248 336 142 385 190 b 473 470 409 254 473 469 b 473 470 473 470 473 470 b 465 464 473 470 469 467 b 341 421 428 435 383 421 b 236 458 303 421 266 433 b 200 537 212 478 200 508 b 289 644 200 585 234 635 ',\n },\n rest64th: {\n x_min: -1.359375,\n x_max: 651.96875,\n ha: 665,\n o: 'm 389 644 b 405 645 394 645 400 645 b 504 566 450 645 492 613 b 507 541 506 557 507 549 b 480 471 507 514 498 489 l 477 467 l 483 470 b 609 591 539 485 586 531 b 613 601 611 595 613 599 b 631 609 619 607 624 609 b 651 588 641 609 651 602 b 200 -946 651 584 204 -941 b 182 -957 197 -953 190 -957 b 163 -945 174 -957 166 -953 b 161 -939 161 -942 161 -942 b 217 -743 161 -931 170 -904 b 272 -555 247 -639 272 -555 b 272 -555 272 -555 272 -555 b 264 -560 272 -555 268 -557 b 140 -603 227 -589 182 -603 b 36 -567 102 -603 65 -592 b -1 -487 12 -548 -1 -517 b 17 -427 -1 -466 5 -445 b 103 -380 38 -395 70 -380 b 191 -433 137 -380 172 -398 b 205 -484 201 -448 205 -466 b 178 -553 205 -509 196 -535 l 175 -557 l 182 -555 b 307 -435 236 -539 284 -494 b 372 -213 308 -430 372 -215 b 372 -213 372 -213 372 -213 b 364 -219 372 -213 368 -216 b 240 -262 328 -247 283 -262 b 137 -226 202 -262 166 -249 b 99 -145 112 -206 99 -176 b 118 -84 99 -124 106 -104 b 204 -38 138 -54 171 -38 b 292 -91 238 -38 273 -56 b 306 -141 302 -106 306 -124 b 279 -212 306 -167 296 -194 l 276 -215 l 281 -213 b 408 -93 336 -198 385 -151 b 473 129 409 -88 473 127 b 473 129 473 129 473 129 b 465 122 473 129 469 126 b 341 80 428 94 383 80 b 236 115 303 80 266 91 b 200 195 213 136 200 165 b 217 256 200 217 206 238 b 304 303 239 287 272 303 b 393 249 338 303 374 285 b 406 199 402 234 406 217 b 379 129 406 173 397 148 l 377 126 l 382 127 b 509 248 436 142 485 190 b 574 470 510 254 574 469 b 574 470 574 470 574 470 b 566 464 574 470 570 467 b 442 421 529 435 484 421 b 337 458 404 421 367 433 b 300 537 313 478 300 508 b 389 644 300 585 334 635 ',\n },\n rest128th: {\n x_min: -1.359375,\n x_max: 752.703125,\n ha: 768,\n o: 'm 490 985 b 504 986 495 986 500 986 b 604 907 551 986 593 954 b 607 884 607 900 607 892 b 581 813 607 857 597 831 l 578 810 l 583 811 b 710 932 638 827 687 873 b 714 943 711 936 713 942 b 730 952 720 949 725 952 b 752 931 741 952 752 943 b 200 -946 752 927 204 -941 b 182 -957 197 -953 190 -957 b 163 -945 174 -957 166 -953 b 161 -939 161 -942 161 -942 b 217 -743 161 -931 170 -904 b 272 -555 247 -639 272 -555 b 272 -555 272 -555 272 -555 b 264 -560 272 -555 268 -557 b 140 -603 227 -589 182 -603 b 36 -567 102 -603 65 -592 b -1 -487 12 -548 -1 -517 b 17 -427 -1 -466 5 -445 b 103 -380 38 -395 70 -380 b 191 -433 137 -380 172 -398 b 205 -484 201 -448 205 -466 b 178 -553 205 -509 196 -535 l 175 -557 l 182 -555 b 307 -435 236 -539 284 -494 b 372 -213 308 -430 372 -215 b 372 -213 372 -213 372 -213 b 364 -219 372 -213 368 -216 b 240 -262 328 -247 283 -262 b 137 -226 202 -262 166 -249 b 99 -145 112 -206 99 -176 b 118 -84 99 -124 106 -104 b 204 -38 138 -54 171 -38 b 292 -91 238 -38 273 -56 b 306 -141 302 -106 306 -124 b 279 -212 306 -167 296 -194 l 276 -215 l 281 -213 b 408 -93 336 -198 385 -151 b 473 129 409 -88 473 127 b 473 129 473 129 473 129 b 465 122 473 129 469 126 b 341 80 428 94 383 80 b 236 115 303 80 266 91 b 200 195 213 136 200 165 b 217 256 200 217 206 238 b 304 303 239 287 272 303 b 393 249 338 303 374 285 b 406 199 402 234 406 217 b 379 129 406 173 397 148 l 377 126 l 382 127 b 509 248 436 142 485 190 b 574 470 510 254 574 469 b 574 470 574 470 574 470 b 566 464 574 470 570 467 b 442 421 529 435 484 421 b 337 458 404 421 367 433 b 300 538 314 477 300 508 b 318 598 300 559 306 580 b 404 645 340 630 372 645 b 494 592 439 645 475 627 b 507 541 502 577 507 559 b 480 471 507 516 498 489 l 477 467 l 483 470 b 608 589 537 485 586 531 b 675 811 611 595 675 810 b 675 811 675 811 675 811 b 666 806 675 811 671 809 b 543 763 628 777 585 763 b 438 799 504 763 468 775 b 401 878 412 820 401 849 b 490 985 401 928 434 977 ',\n },\n dynamicPiano: {\n x_min: -53.078125,\n x_max: 513.140625,\n ha: 485,\n o: 'm 185 383 b 196 384 187 383 191 384 b 277 334 230 384 259 365 b 288 301 281 324 288 306 b 288 297 288 298 288 297 b 294 302 289 297 291 299 b 394 370 323 338 367 367 b 404 371 398 370 401 371 b 510 272 453 371 498 328 b 513 237 513 262 513 251 b 507 172 513 217 511 192 b 326 -34 487 59 412 -26 b 314 -36 322 -36 318 -36 b 274 -24 298 -36 283 -31 l 265 -16 b 224 44 246 -1 232 20 b 223 49 224 47 223 49 b 223 49 223 49 223 49 b 149 -197 221 48 149 -194 b 149 -198 149 -197 149 -198 b 170 -210 149 -202 155 -205 b 187 -215 174 -210 175 -212 b 204 -231 201 -219 204 -222 b 197 -245 204 -240 202 -242 l 194 -248 l 76 -248 l -42 -248 l -46 -245 b -53 -231 -51 -242 -53 -240 b -35 -215 -53 -222 -49 -217 b -13 -210 -21 -212 -20 -212 b -6 -208 -10 -209 -8 -208 b 0 -206 -6 -208 -2 -206 b 25 -188 13 -201 21 -195 b 163 280 28 -183 163 276 b 166 291 163 283 164 287 b 167 302 167 295 167 299 b 155 324 167 315 161 324 b 155 324 155 324 155 324 b 65 230 125 322 85 280 b 53 215 61 217 58 215 b 51 215 53 215 51 215 b 42 224 46 215 42 217 b 57 263 42 231 47 244 b 140 360 77 305 104 337 b 152 370 144 365 149 369 b 185 383 157 376 172 381 m 374 306 b 366 308 371 308 368 308 b 300 273 348 308 321 294 b 284 254 288 262 287 259 b 280 242 283 249 281 245 b 257 169 279 240 270 213 l 236 98 l 236 93 b 251 48 238 77 243 61 b 279 27 258 37 272 27 b 281 27 279 27 280 27 b 291 31 281 27 287 30 b 396 170 334 52 378 109 b 406 247 402 197 406 224 b 401 277 406 259 405 270 b 374 306 397 290 383 303 ',\n },\n dynamicMezzo: {\n x_min: 46.28125,\n x_max: 669.671875,\n ha: 563,\n o: 'm 183 376 b 189 376 185 376 187 376 b 212 374 197 376 208 376 b 265 337 234 369 253 355 b 274 317 268 331 273 320 b 274 316 274 317 274 316 b 280 323 276 316 276 319 b 311 358 288 337 299 348 b 319 366 315 360 318 365 b 356 376 326 373 340 376 b 382 371 364 376 374 374 b 428 337 400 366 417 352 b 436 317 431 331 436 320 b 438 316 436 317 436 316 b 442 323 438 316 439 319 b 475 358 451 337 462 348 b 483 366 477 360 481 365 b 518 376 488 373 503 376 b 544 373 528 376 536 376 b 604 285 579 360 604 326 b 597 249 604 273 601 258 b 543 63 596 247 544 70 b 541 54 543 61 541 55 b 540 44 540 51 540 47 b 552 23 540 33 545 23 b 552 23 552 23 552 23 b 647 126 586 29 627 72 b 658 138 651 136 653 138 b 660 138 660 138 660 138 b 669 129 666 137 669 136 b 654 88 669 122 665 109 b 562 -12 631 43 602 9 l 549 -19 b 521 -27 540 -24 530 -27 b 447 30 490 -27 458 -4 b 443 58 445 38 443 48 b 450 93 443 72 446 84 b 504 278 453 97 504 272 b 507 288 506 283 506 287 b 509 298 507 292 509 295 b 491 326 509 310 502 320 b 487 327 490 327 488 327 b 479 324 484 327 483 326 b 441 270 462 316 443 288 b 435 249 441 265 436 254 b 398 127 434 248 419 195 b 362 4 379 61 362 5 b 328 -1 359 -1 362 -1 b 314 -1 323 -1 319 -1 b 302 -1 310 -1 306 -1 b 266 4 266 -1 269 -1 b 265 6 265 5 265 5 b 303 144 265 13 272 34 b 343 278 325 216 343 276 b 344 288 343 281 344 285 b 345 298 345 291 345 295 b 330 326 345 310 340 320 b 323 327 328 327 325 327 b 317 324 322 327 321 326 b 279 270 300 316 281 288 b 273 249 279 265 274 254 b 236 127 272 248 255 195 b 200 4 216 61 200 5 b 164 -1 197 -1 198 -1 b 151 -1 161 -1 156 -1 b 140 -1 147 -1 142 -1 b 103 4 104 -1 106 -1 b 103 6 103 5 103 5 b 141 144 103 13 108 34 b 181 278 161 216 179 276 b 182 288 181 281 181 285 b 183 298 182 291 183 295 b 168 324 183 310 178 320 b 160 327 166 326 163 327 b 141 320 156 327 151 324 b 69 230 112 305 85 272 b 57 215 65 217 62 215 b 55 215 57 215 55 215 b 46 224 49 215 46 217 b 59 260 46 231 50 242 b 151 363 81 306 112 341 b 161 369 155 365 160 367 b 183 376 166 371 174 374 ',\n },\n dynamicForte: {\n x_min: -118.421875,\n x_max: 597.53125,\n ha: 381,\n o: 'm 460 574 b 464 574 461 574 462 574 b 488 574 470 574 481 574 b 500 573 491 574 498 574 b 594 503 543 570 588 538 b 597 488 596 498 597 494 b 528 417 597 449 564 417 b 502 423 519 417 510 419 b 465 481 477 434 465 458 b 488 528 465 499 472 516 b 490 530 490 530 490 530 b 490 530 490 530 490 530 b 468 517 488 530 475 523 b 349 340 419 485 377 420 b 347 330 348 334 347 330 b 383 328 347 328 363 328 b 428 326 423 328 424 328 b 442 302 438 320 442 312 b 430 281 442 294 438 285 b 385 276 424 277 426 276 l 377 276 l 332 276 l 330 269 b 178 -117 303 126 250 -9 b 1 -249 129 -194 69 -237 b -20 -251 -6 -251 -13 -251 b -114 -187 -65 -251 -100 -227 b -118 -156 -117 -177 -118 -166 b -51 -84 -118 -116 -91 -84 b -31 -87 -46 -84 -39 -86 b 16 -152 0 -95 16 -124 b -12 -205 16 -173 8 -194 b -16 -208 -14 -206 -16 -208 b -14 -208 -16 -208 -14 -208 b -9 -206 -14 -208 -12 -208 b 74 -124 23 -197 54 -166 b 172 224 98 -79 125 22 b 185 276 178 252 183 274 b 185 276 185 276 185 276 b 141 276 185 276 181 276 b 91 280 96 276 96 276 b 77 302 83 285 77 294 b 91 326 77 312 83 320 b 148 328 95 328 96 328 l 198 330 l 202 341 b 460 574 249 473 351 566 ',\n },\n dynamicRinforzando: {\n x_min: 78.9375,\n x_max: 485.921875,\n ha: 417,\n o: 'm 362 378 b 378 380 367 380 372 380 b 472 348 415 380 453 367 b 485 315 481 338 485 327 b 462 273 485 298 477 281 b 439 267 454 269 446 267 b 398 290 424 267 409 274 b 344 319 385 309 364 319 b 281 269 315 319 289 301 b 279 262 280 266 279 262 b 276 256 279 260 277 258 b 274 249 276 254 274 251 b 238 127 273 248 257 192 b 201 4 217 61 201 5 b 166 -1 198 -1 200 -1 b 153 -1 163 -1 157 -1 b 141 -1 148 -1 144 -1 b 104 4 106 -1 107 -1 b 104 6 104 5 104 5 b 142 144 104 13 110 34 b 182 278 164 219 181 276 b 183 288 182 281 182 285 b 185 302 185 292 185 298 b 164 330 185 317 176 328 b 159 330 163 330 161 330 b 102 302 140 330 119 320 b 91 294 95 295 93 294 b 88 294 91 294 89 294 b 78 303 83 294 78 298 b 81 312 78 306 78 309 b 200 373 106 347 160 373 b 215 371 205 373 209 371 b 266 335 235 367 254 353 b 269 331 268 333 269 331 b 269 331 269 331 269 331 b 273 335 269 331 270 334 b 362 378 298 359 330 376 ',\n },\n dynamicSforzando: {\n x_min: 70.78125,\n x_max: 378.390625,\n ha: 315,\n o: 'm 246 373 b 254 373 249 373 251 373 b 372 324 303 373 360 351 b 378 302 377 317 378 309 b 338 251 378 278 362 255 b 328 249 334 249 332 249 b 283 294 303 249 283 270 b 288 315 283 301 284 308 b 289 319 289 317 289 319 b 289 319 289 319 289 319 b 283 320 289 320 287 320 b 270 322 279 322 274 322 b 206 288 242 322 215 308 b 206 283 206 287 206 285 b 257 223 206 267 230 238 b 284 206 272 213 277 210 b 351 90 328 173 351 130 b 340 47 351 74 348 59 b 205 -30 314 -2 264 -30 b 182 -29 198 -30 190 -30 b 84 15 147 -24 103 -5 b 70 48 74 24 70 36 b 108 99 70 70 85 94 b 121 102 112 101 117 102 b 167 56 147 102 167 80 b 159 31 167 48 164 40 l 156 26 l 157 26 b 190 20 167 22 178 20 b 220 26 201 20 212 22 b 258 65 243 34 258 51 b 257 70 258 66 258 69 b 204 126 249 94 234 109 b 114 258 148 158 114 209 b 125 302 114 273 118 288 b 246 373 147 342 193 370 ',\n },\n dynamicZ: {\n x_min: 29.9375,\n x_max: 420.578125,\n ha: 371,\n o: 'm 115 345 b 221 347 117 345 166 347 b 411 345 306 347 409 345 b 420 330 416 342 420 335 b 415 319 420 326 419 321 b 178 118 397 303 179 118 b 178 117 178 118 178 117 b 181 117 178 117 178 117 b 189 117 182 117 185 117 b 193 117 190 117 191 117 b 247 98 215 117 232 111 b 296 75 266 83 280 76 b 302 75 299 75 300 75 b 322 91 311 75 315 79 b 322 91 322 91 322 91 b 322 91 322 91 322 91 b 319 91 322 91 321 91 b 313 90 318 90 315 90 b 283 107 300 90 288 97 b 277 126 279 114 277 121 b 319 167 277 149 295 167 b 319 167 319 167 319 167 b 362 118 347 167 362 147 b 355 82 362 108 359 96 b 311 33 349 65 340 55 b 224 1 284 12 253 1 b 194 5 213 1 204 2 b 168 18 183 8 178 11 b 110 36 151 30 130 36 b 57 15 88 36 68 29 b 47 11 54 12 51 11 b 31 20 40 11 34 13 b 29 26 31 22 29 25 b 68 66 29 36 39 45 b 285 250 73 71 281 248 b 285 250 285 250 285 250 b 231 252 285 252 261 252 b 137 250 190 252 141 250 b 93 227 122 248 110 241 b 78 220 88 222 83 220 b 66 227 74 220 70 222 b 63 234 65 229 63 231 b 85 291 63 241 69 252 b 115 345 108 342 108 344 ',\n },\n ornamentTrill: {\n x_min: -340.28125,\n x_max: 338.921875,\n ha: 346,\n o: 'm -32 520 b -29 521 -31 520 -31 521 b -23 519 -27 521 -24 520 b -20 513 -21 517 -20 516 b -21 506 -20 512 -20 509 b -31 474 -23 502 -27 488 l -53 402 l -66 352 l -68 349 l -57 349 b -32 351 -51 349 -40 351 b 123 370 19 352 74 359 b 137 371 127 370 133 371 b 170 356 152 371 164 366 b 171 355 170 355 170 355 b 216 366 174 355 183 358 b 280 378 268 377 266 377 b 287 378 283 378 284 378 b 332 349 307 378 322 369 b 338 319 336 341 338 330 b 332 301 338 310 336 302 b 242 280 329 299 246 280 b 242 280 242 280 242 280 b 235 288 236 280 235 283 b 235 292 235 290 235 291 b 236 302 236 297 236 299 b 220 337 236 316 230 330 l 216 340 l 210 335 b 159 276 189 322 172 301 b 118 149 152 265 156 274 b 81 34 84 36 85 36 b -8 13 78 33 -4 13 b -8 13 -8 13 -8 13 b -14 20 -12 15 -14 15 b -8 44 -14 24 -12 31 b -2 66 -5 55 -2 65 b -2 66 -2 66 -2 66 l -2 66 b -43 41 -2 66 -21 55 b -114 4 -98 8 -98 8 b -144 0 -123 0 -134 0 b -242 99 -197 0 -242 43 b -242 109 -242 102 -242 105 b -212 219 -240 122 -242 116 b -185 312 -197 270 -185 312 l -185 312 b -189 312 -185 312 -186 312 b -259 312 -200 312 -227 312 b -321 310 -291 312 -310 310 b -334 312 -330 310 -334 312 b -340 319 -338 313 -340 316 b -336 326 -340 322 -338 324 b -291 337 -334 326 -314 331 l -247 347 l -210 348 b -172 348 -190 348 -172 348 b -168 363 -172 348 -171 355 b -145 442 -151 424 -145 441 b -133 452 -144 444 -140 446 l -77 489 b -32 520 -53 506 -32 520 m 57 334 b 53 335 55 335 54 335 b 44 334 50 335 49 335 b -70 316 8 326 -28 320 b -78 309 -78 316 -78 316 b -108 202 -80 305 -88 274 b -141 81 -136 112 -141 93 b -140 74 -141 79 -141 77 b -117 49 -137 59 -127 49 b -107 52 -114 49 -110 51 b 16 127 -106 54 14 126 b 42 217 16 127 42 215 b 49 241 42 222 44 229 b 73 320 53 251 73 317 b 57 334 73 327 65 333 ',\n },\n ornamentTurn: {\n x_min: -423.3125,\n x_max: 421.9375,\n ha: 431,\n o: 'm -262 197 b -247 197 -257 197 -253 197 b -118 162 -210 197 -163 184 b 40 45 -61 134 -13 98 b 277 -95 119 -33 200 -81 b 289 -97 281 -97 285 -97 b 378 0 332 -97 371 -55 b 378 11 378 4 378 6 b 302 83 378 55 345 83 b 242 66 283 83 262 77 b 208 56 231 59 219 56 b 148 120 175 56 148 81 b 201 186 148 151 164 172 b 261 198 220 194 240 198 b 420 45 341 198 411 136 b 421 22 421 37 421 29 b 245 -199 421 -93 338 -199 b 238 -198 243 -199 240 -199 b -44 -47 148 -194 50 -141 b -250 86 -114 22 -183 66 b -295 94 -270 91 -283 94 b -315 91 -302 94 -307 94 b -381 4 -356 81 -381 43 b -355 -56 -381 -18 -372 -40 b -298 -81 -338 -73 -319 -81 b -246 -68 -283 -81 -265 -77 b -212 -58 -234 -61 -223 -58 b -178 -69 -200 -58 -189 -62 b -151 -122 -160 -81 -151 -101 b -171 -167 -151 -138 -157 -155 b -239 -195 -185 -181 -213 -192 b -257 -197 -245 -197 -250 -197 b -423 -5 -352 -197 -423 -109 b -412 65 -423 16 -419 40 b -262 197 -389 137 -329 188 ',\n },\n ornamentTurnSlash: {\n x_min: -423.3125,\n x_max: 421.9375,\n ha: 431,\n o: 'm -10 276 b -2 277 -8 277 -5 277 b 17 265 5 277 13 273 b 19 163 19 260 19 260 l 19 68 l 39 45 b 277 -95 122 -34 200 -81 b 289 -97 281 -97 285 -97 b 378 0 332 -97 371 -54 b 378 11 378 4 378 6 b 302 83 378 55 345 83 b 242 66 283 83 262 77 b 208 56 231 59 219 56 b 148 120 175 56 148 81 b 200 186 148 151 164 172 b 261 198 220 194 240 198 b 420 45 341 198 411 137 b 421 22 421 37 421 29 b 257 -198 421 -86 347 -188 b 242 -198 251 -198 247 -198 b 20 -105 181 -198 95 -163 l 19 -104 l 19 -183 b 19 -216 19 -195 19 -206 b 12 -273 19 -272 17 -267 b -2 -278 8 -277 2 -278 b -21 -266 -10 -278 -19 -274 b -23 -165 -23 -263 -23 -262 l -23 -69 l -44 -47 b -250 86 -117 23 -183 66 b -295 94 -270 93 -284 94 b -315 91 -302 94 -308 94 b -381 5 -356 81 -381 43 b -355 -56 -381 -16 -372 -40 b -299 -81 -338 -73 -319 -81 b -246 -68 -283 -81 -265 -77 b -212 -58 -234 -61 -223 -58 b -168 -77 -196 -58 -179 -65 b -151 -122 -156 -90 -151 -105 b -179 -174 -151 -141 -160 -162 b -239 -195 -194 -184 -217 -192 b -257 -197 -245 -195 -250 -197 b -423 -5 -349 -197 -423 -113 b -423 0 -423 -4 -423 -1 b -277 194 -420 97 -362 173 b -247 197 -268 197 -258 197 b -24 104 -185 197 -100 162 l -23 102 l -23 181 b -21 265 -23 260 -23 260 b -10 276 -20 269 -14 274 ',\n },\n ornamentMordent: {\n x_min: -402.890625,\n x_max: 401.53125,\n ha: 410,\n o: 'm -10 273 b -4 274 -9 273 -6 274 b 16 262 4 274 12 269 b 17 158 17 259 17 259 l 17 56 l 62 112 b 117 174 110 172 110 172 b 122 174 118 174 119 174 b 132 173 125 174 129 173 b 295 11 134 172 171 134 l 307 -1 l 336 34 b 374 76 366 72 368 74 b 381 77 375 77 378 77 b 401 56 392 77 401 68 b 400 48 401 54 401 51 b 223 -172 397 41 230 -166 b 210 -176 220 -174 215 -176 b 201 -174 206 -176 204 -176 b 112 -87 198 -173 178 -152 b 27 0 65 -38 27 0 b 21 -6 27 0 24 -2 l 17 -12 l 17 -147 b 17 -210 17 -173 17 -194 b 10 -292 17 -297 16 -287 b -2 -299 6 -297 2 -299 b -21 -287 -10 -299 -19 -295 b -24 -174 -23 -284 -23 -284 l -24 -63 l -66 -117 b -121 -176 -110 -170 -114 -176 b -125 -176 -122 -176 -123 -176 b -296 -12 -134 -174 -125 -184 l -308 0 l -337 -34 b -375 -77 -367 -73 -370 -76 b -382 -79 -377 -79 -379 -79 b -402 -58 -393 -79 -402 -69 b -401 -49 -402 -55 -402 -52 b -224 170 -398 -43 -231 165 b -212 174 -221 173 -216 174 b -202 173 -208 174 -205 174 b -39 11 -200 172 -151 122 l -28 -1 l -25 1 l -24 4 l -24 130 b -23 260 -24 256 -24 258 b -10 273 -20 266 -16 270 ',\n },\n ornamentShortTrill: {\n x_min: -402.890625,\n x_max: 401.53125,\n ha: 410,\n o: 'm -219 173 b -213 174 -217 174 -215 174 b -202 173 -209 174 -205 173 b -114 86 -200 172 -179 151 b -28 0 -66 37 -28 0 b 40 84 -28 0 2 37 b 117 174 111 173 110 172 b 122 174 118 174 119 174 b 132 173 125 174 129 173 b 295 11 134 172 171 134 l 307 -1 l 336 34 b 374 76 366 72 368 74 b 381 77 375 77 378 77 b 401 56 392 77 401 68 b 400 48 401 54 401 51 b 223 -172 397 41 230 -166 b 210 -176 220 -174 215 -176 b 201 -174 206 -176 204 -176 b 112 -87 198 -173 178 -152 b 27 0 65 -38 27 0 b -42 -86 27 0 -4 -38 b -118 -174 -112 -174 -111 -173 b -123 -176 -119 -176 -121 -176 b -133 -174 -126 -176 -130 -174 b -296 -12 -136 -173 -172 -137 l -308 0 l -337 -34 b -375 -77 -367 -73 -370 -76 b -382 -79 -377 -79 -379 -79 b -402 -58 -393 -79 -402 -69 b -401 -49 -402 -55 -402 -52 b -224 172 -398 -43 -228 167 b -219 173 -223 172 -220 173 ',\n },\n ornamentTremblement: {\n x_min: -571.671875,\n x_max: 570.3125,\n ha: 582,\n o: 'm -386 173 b -381 174 -385 174 -383 174 b -370 173 -377 174 -372 173 b -281 86 -367 172 -347 151 b -196 0 -235 37 -196 0 b -126 84 -196 0 -164 37 b -50 174 -55 173 -57 172 b -44 174 -49 174 -47 174 b -35 173 -42 174 -38 173 b 53 86 -32 172 -12 151 b 138 0 100 37 138 0 b 208 84 140 0 170 37 b 284 174 279 173 277 172 b 289 174 285 174 288 174 b 299 173 294 174 298 173 b 462 11 303 172 338 134 l 475 -1 l 503 34 b 541 76 534 72 536 74 b 548 77 544 77 545 77 b 570 56 560 77 570 68 b 567 48 570 54 568 51 b 392 -172 564 41 397 -166 b 378 -176 387 -174 382 -176 b 368 -174 374 -176 371 -176 b 280 -87 367 -173 345 -152 b 194 0 234 -38 194 0 b 125 -86 194 0 163 -38 b 49 -174 54 -174 55 -173 b 43 -176 47 -176 46 -176 b 34 -174 40 -176 36 -174 b -54 -87 31 -173 10 -152 b -140 0 -102 -38 -140 0 b -209 -86 -141 0 -171 -38 b -285 -174 -280 -174 -279 -173 b -291 -176 -287 -176 -289 -176 b -300 -174 -295 -176 -299 -174 b -464 -12 -304 -173 -340 -137 l -476 0 l -504 -34 b -543 -77 -534 -73 -537 -76 b -549 -79 -545 -79 -547 -79 b -571 -58 -562 -79 -571 -69 b -568 -49 -571 -55 -570 -52 b -392 172 -566 -43 -396 167 b -386 173 -390 172 -387 173 ',\n },\n ornamentPrecompAppoggTrill: {\n x_min: -571.671875,\n x_max: 570.3125,\n ha: 582,\n o: 'm -559 351 b -551 352 -556 352 -553 352 b -530 338 -543 352 -533 348 b -529 169 -530 337 -529 291 l -529 1 l -507 27 l -441 112 b -382 174 -394 169 -390 174 b -378 174 -381 174 -379 174 b -281 86 -370 174 -375 179 b -196 0 -234 37 -196 0 b -126 84 -196 0 -164 37 b -50 174 -55 173 -57 172 b -44 174 -49 174 -47 174 b -35 173 -42 174 -38 173 b 53 86 -32 172 -12 151 b 138 0 100 37 138 0 b 208 84 140 0 170 37 b 284 174 279 173 279 172 b 289 174 285 174 288 174 b 300 173 294 174 298 173 b 462 11 303 172 340 134 l 475 -1 l 503 34 b 541 76 534 72 536 74 b 548 77 544 77 545 77 b 570 56 560 77 570 68 b 567 48 570 54 568 51 b 392 -172 564 41 397 -166 b 378 -176 387 -174 382 -176 b 368 -174 375 -176 371 -176 b 280 -87 367 -173 347 -152 b 194 0 234 -38 194 0 b 126 -86 194 0 163 -38 b 49 -174 54 -174 55 -173 b 44 -176 47 -176 46 -176 b 34 -174 40 -176 36 -174 b -54 -87 31 -173 10 -152 b -140 0 -102 -38 -140 0 b -209 -86 -140 0 -171 -38 b -285 -174 -280 -174 -279 -173 b -291 -176 -287 -176 -288 -176 b -300 -174 -294 -176 -298 -174 b -464 -11 -303 -173 -374 -102 l -476 0 l -506 -37 b -539 -76 -528 -65 -537 -74 b -551 -80 -543 -79 -547 -80 b -570 -68 -558 -80 -566 -76 l -571 -65 l -571 136 b -570 340 -571 331 -571 337 b -559 351 -568 344 -564 348 ',\n },\n ornamentPrecompSlideTrillDAnglebert: {\n x_min: -590.71875,\n x_max: 589.359375,\n ha: 601,\n o: 'm -367 173 b -362 174 -366 174 -364 174 b -351 173 -357 174 -353 173 b -262 86 -348 172 -328 151 b -176 0 -216 37 -176 0 b -107 84 -176 0 -145 37 b -31 174 -36 173 -38 172 b -25 174 -29 174 -28 174 b -16 173 -23 174 -19 173 b 72 86 -13 172 6 151 b 157 0 119 37 157 0 b 227 84 159 0 189 37 b 303 174 298 173 296 172 b 308 174 304 174 307 174 b 318 173 313 174 317 173 b 481 11 322 172 357 134 l 494 -1 l 522 34 b 560 76 553 72 555 74 b 567 77 563 77 564 77 b 589 56 579 77 589 68 b 586 48 589 54 588 51 b 411 -172 583 41 416 -166 b 397 -176 406 -174 401 -176 b 387 -174 393 -176 390 -176 b 299 -87 386 -173 366 -152 b 213 0 253 -38 213 0 b 144 -86 213 0 182 -38 b 68 -174 73 -174 74 -173 b 62 -176 66 -176 65 -176 b 53 -174 59 -176 55 -174 b -35 -87 50 -173 29 -152 b -121 0 -83 -38 -121 0 b -190 -86 -122 0 -152 -38 b -266 -174 -261 -174 -259 -173 b -272 -176 -268 -176 -270 -176 b -281 -174 -276 -176 -280 -174 b -371 -86 -284 -173 -304 -152 b -457 0 -417 -38 -457 0 l -457 0 b -477 -26 -457 0 -470 -16 b -548 -227 -524 -88 -548 -161 b -536 -303 -548 -254 -544 -280 b -533 -317 -534 -309 -533 -313 b -553 -338 -533 -330 -541 -338 b -577 -315 -566 -338 -571 -333 b -590 -227 -586 -287 -590 -258 b -518 -9 -590 -154 -564 -77 b -465 56 -509 2 -504 8 l -402 134 b -367 173 -375 169 -372 172 ',\n },\n ornamentPrecompSlideTrillBach: {\n x_min: -590.71875,\n x_max: 589.359375,\n ha: 601,\n o: 'm 175 273 b 182 274 178 273 181 274 b 202 262 190 274 198 269 b 204 158 204 259 204 259 l 204 56 l 250 112 b 303 174 296 172 298 172 b 308 174 304 174 307 174 b 318 173 313 174 317 173 b 481 11 322 172 357 134 l 494 -1 l 522 34 b 560 76 553 72 555 74 b 567 77 563 77 564 77 b 589 56 579 77 589 68 b 586 48 589 54 588 51 b 411 -172 583 41 416 -166 b 397 -176 406 -174 401 -176 b 387 -174 393 -176 390 -176 b 299 -87 386 -173 366 -152 b 213 0 253 -38 213 0 b 208 -6 213 0 210 -2 l 204 -12 l 204 -147 b 204 -210 204 -173 204 -194 b 198 -292 204 -297 204 -287 b 183 -299 194 -297 189 -299 b 164 -287 175 -299 167 -295 b 163 -174 163 -284 163 -284 l 161 -63 l 119 -117 b 65 -176 76 -170 73 -176 b 61 -176 63 -176 62 -176 b -35 -87 51 -174 57 -180 b -121 0 -83 -38 -121 0 b -190 -86 -122 0 -152 -38 b -266 -174 -261 -174 -259 -173 b -272 -176 -268 -176 -270 -176 b -281 -174 -276 -176 -280 -174 b -371 -86 -284 -173 -304 -152 b -457 0 -417 -38 -457 0 l -457 0 b -477 -26 -457 0 -470 -16 b -548 -227 -524 -88 -548 -161 b -536 -303 -548 -254 -544 -280 b -533 -317 -534 -309 -533 -313 b -553 -338 -533 -330 -541 -338 b -577 -315 -566 -338 -571 -333 b -590 -227 -586 -287 -590 -258 b -518 -9 -590 -154 -564 -77 b -465 56 -509 2 -504 8 l -402 134 b -363 174 -374 170 -371 174 b -359 174 -362 174 -360 174 b -262 86 -351 174 -356 179 b -176 0 -216 37 -176 0 b -107 84 -176 0 -145 37 b -31 174 -36 173 -38 172 b -25 174 -29 174 -28 174 b -16 173 -23 174 -19 173 b 147 11 -13 172 35 123 l 157 -1 l 160 1 l 163 4 l 163 130 b 164 260 163 256 163 258 b 175 273 166 266 170 270 ',\n },\n ornamentPrecompTrillSuffixDandrieu: {\n x_min: -590.71875,\n x_max: 589.359375,\n ha: 601,\n o: 'm 544 335 b 553 337 548 337 551 337 b 575 313 563 337 570 330 b 589 226 583 285 589 256 b 517 8 589 152 563 76 b 464 -58 507 -4 503 -9 l 401 -136 b 362 -176 372 -172 370 -176 b 357 -176 360 -176 359 -176 b 261 -87 349 -174 355 -180 b 175 0 215 -38 175 0 b 106 -86 175 0 144 -38 b 29 -174 35 -174 36 -173 b 24 -176 28 -176 27 -176 b 14 -174 21 -176 17 -174 b -73 -87 12 -173 -8 -152 b -159 0 -121 -38 -159 0 b -228 -86 -160 0 -190 -38 b -304 -174 -299 -174 -298 -173 b -310 -176 -306 -176 -308 -176 b -319 -174 -314 -176 -318 -174 b -483 -12 -323 -173 -359 -137 l -495 0 l -524 -34 b -562 -77 -553 -73 -556 -76 b -568 -79 -564 -79 -566 -79 b -590 -58 -581 -79 -590 -69 b -588 -49 -590 -55 -589 -52 b -412 170 -585 -43 -417 165 b -398 174 -408 173 -402 174 b -389 173 -394 174 -392 174 b -300 86 -387 172 -366 151 b -215 -1 -254 37 -215 -1 b -145 84 -215 -1 -183 37 b -69 173 -74 173 -76 172 b -63 174 -68 174 -66 174 b -54 173 -61 174 -57 173 b 34 86 -51 172 -31 151 b 119 -1 81 37 119 -1 b 189 84 121 -1 151 37 b 265 173 259 173 258 172 b 270 174 266 174 269 174 b 280 173 274 174 279 173 b 370 84 283 172 303 151 b 455 -1 416 37 455 -1 l 455 -1 b 476 24 455 -1 469 15 b 547 226 522 87 547 159 b 534 302 547 252 543 278 b 532 317 533 308 532 313 b 544 335 532 326 536 333 ',\n },\n ornamentPrecompDoubleCadenceUpperPrefix: {\n x_min: -597.53125,\n x_max: 596.171875,\n ha: 608,\n o: 'm -533 324 b -525 327 -530 326 -528 327 b -504 305 -514 327 -504 317 b -504 305 -504 305 -504 305 b -513 284 -504 299 -504 299 b -556 112 -541 226 -556 167 b -545 33 -556 84 -552 58 b -524 -20 -541 15 -532 -9 l -522 -23 l -491 15 l -413 111 b -355 174 -367 169 -363 174 b -351 174 -353 174 -352 174 b -254 86 -343 174 -348 179 b -168 -1 -208 37 -168 -1 b -100 84 -168 -1 -137 37 b -23 173 -28 173 -29 172 b -19 174 -21 174 -20 174 b -8 173 -14 174 -10 173 b 80 86 -5 172 13 151 b 166 -1 127 37 166 -1 b 235 84 166 -1 197 37 b 311 173 306 173 304 172 b 317 174 313 174 314 174 b 326 173 319 174 323 173 b 490 11 329 172 366 134 l 502 -1 l 530 34 b 568 76 560 72 563 74 b 575 77 570 77 573 77 b 596 56 586 77 596 68 b 594 48 596 54 596 51 b 417 -172 592 41 424 -166 b 405 -176 415 -174 409 -176 b 396 -174 401 -176 398 -176 b 307 -87 393 -173 372 -152 b 221 -1 259 -38 221 -1 b 152 -86 221 -1 190 -38 b 76 -176 81 -174 83 -173 b 70 -176 74 -176 73 -176 b 61 -174 66 -176 62 -174 b -27 -87 58 -173 38 -152 b -114 -1 -74 -38 -112 -1 b -182 -86 -114 -1 -145 -38 b -258 -176 -253 -174 -253 -173 b -264 -176 -259 -176 -262 -176 b -274 -174 -268 -176 -272 -174 b -438 -11 -277 -173 -348 -102 l -449 0 l -479 -37 b -524 -80 -513 -80 -514 -80 l -524 -80 b -553 -52 -534 -80 -540 -74 b -597 109 -583 -8 -597 48 b -560 280 -597 165 -585 224 b -533 324 -548 310 -540 322 ',\n },\n ornamentPrecompDoubleCadenceUpperPrefixTurn: {\n x_min: -597.53125,\n x_max: 596.171875,\n ha: 608,\n o: 'm -533 324 b -525 327 -530 326 -528 327 b -504 305 -514 327 -504 317 b -504 305 -504 305 -504 305 b -513 284 -504 299 -504 299 b -556 112 -541 226 -556 167 b -545 33 -556 84 -552 58 b -524 -20 -541 15 -532 -9 l -522 -23 l -491 15 l -413 111 b -355 174 -367 169 -363 174 b -351 174 -353 174 -352 174 b -254 86 -343 174 -348 179 b -168 -1 -208 37 -168 -1 b -100 84 -168 -1 -137 37 b -23 173 -28 173 -29 172 b -19 174 -21 174 -20 174 b -8 173 -14 174 -10 173 b 155 11 -5 172 43 123 l 166 -1 l 168 1 l 170 4 l 170 130 b 171 260 170 256 170 258 b 191 274 175 269 183 274 b 205 267 196 274 201 272 b 212 158 212 262 210 273 l 212 56 l 257 112 b 311 173 304 172 304 172 b 317 174 313 174 314 174 b 326 173 319 174 323 173 b 490 11 329 172 366 134 l 502 -1 l 530 34 b 568 76 560 72 563 74 b 575 77 570 77 573 77 b 596 56 586 77 596 68 b 594 48 596 54 596 51 b 417 -172 592 41 424 -166 b 405 -176 415 -174 409 -176 b 396 -174 401 -176 398 -176 b 307 -87 393 -173 372 -152 b 221 -1 259 -38 221 -1 b 216 -6 221 -1 219 -2 l 212 -12 l 212 -147 b 212 -210 212 -173 212 -194 b 205 -292 212 -297 210 -287 b 191 -299 201 -297 196 -299 b 172 -287 183 -299 175 -295 b 170 -174 171 -284 171 -284 l 170 -63 l 127 -117 b 73 -176 84 -170 80 -176 b 68 -176 72 -176 70 -176 b -27 -87 59 -174 65 -180 b -114 0 -74 -38 -112 0 b -182 -86 -114 0 -145 -38 b -258 -174 -253 -174 -253 -173 b -264 -176 -259 -176 -262 -176 b -274 -174 -268 -176 -272 -174 b -438 -11 -277 -173 -348 -102 l -449 0 l -479 -37 b -524 -80 -513 -80 -514 -80 l -524 -80 b -553 -52 -534 -80 -540 -74 b -597 109 -583 -8 -597 48 b -560 280 -597 165 -585 224 b -533 324 -548 310 -540 322 ',\n },\n ornamentPrecompTrillLowerSuffix: {\n x_min: -597.53125,\n x_max: 596.171875,\n ha: 608,\n o: 'm -413 173 b -408 174 -412 174 -409 174 b -397 173 -404 174 -400 173 b -308 86 -394 172 -374 151 b -223 0 -261 37 -223 0 b -153 84 -223 0 -191 37 b -77 174 -83 173 -84 172 b -72 174 -76 174 -74 174 b -62 173 -68 174 -63 173 b 25 86 -59 172 -39 151 b 112 0 73 37 111 0 b 181 84 112 0 144 37 b 257 174 251 173 251 172 b 262 174 258 174 261 174 b 273 173 266 174 270 173 b 436 9 276 172 347 101 l 447 -1 l 477 36 b 522 79 511 79 513 79 l 522 79 b 552 51 533 79 539 73 b 596 -112 582 6 596 -51 b 567 -262 596 -161 586 -213 b 539 -322 558 -287 544 -316 b 524 -327 534 -326 529 -327 b 504 -315 515 -327 507 -323 b 503 -308 503 -312 503 -309 b 511 -285 503 -302 504 -297 b 555 -113 540 -227 555 -169 b 544 -34 555 -86 551 -59 b 522 19 540 -16 530 8 l 521 22 l 481 -26 l 405 -122 b 353 -176 366 -172 362 -176 b 349 -176 352 -176 351 -176 b 253 -87 341 -176 347 -180 b 167 0 206 -38 167 0 b 99 -86 167 0 136 -38 b 21 -174 27 -174 28 -173 b 17 -176 20 -176 19 -176 b 6 -174 13 -176 9 -174 b -81 -87 4 -173 -14 -152 b -167 0 -129 -38 -167 0 b -236 -86 -167 0 -198 -38 b -313 -174 -307 -174 -306 -173 b -318 -176 -314 -176 -315 -176 b -328 -174 -321 -176 -325 -174 b -491 -12 -330 -173 -367 -137 l -503 0 l -530 -34 b -570 -77 -562 -73 -564 -76 b -577 -79 -571 -79 -574 -79 b -597 -58 -588 -79 -597 -69 b -596 -49 -597 -55 -597 -52 b -417 172 -593 -43 -423 167 b -413 173 -417 172 -415 173 ',\n },\n stringsDownBow: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -9 215 b 0 217 -6 217 -4 217 b 19 205 8 217 14 213 b 20 142 20 202 20 201 l 20 84 l 23 84 b 144 -27 81 74 129 30 b 148 -66 147 -40 148 -54 b 36 -213 148 -134 103 -197 b 0 -219 24 -217 12 -219 b -145 -104 -68 -219 -129 -173 b -149 -68 -148 -91 -149 -79 b -24 84 -149 6 -98 74 l -21 84 l -21 142 b -19 205 -20 201 -20 202 b -9 215 -17 209 -13 213 m -21 -15 b -23 41 -21 37 -21 41 b -23 41 -23 41 -23 41 b -76 11 -35 40 -62 26 b -108 -65 -98 -11 -108 -38 b -1 -176 -108 -122 -65 -176 b 107 -65 63 -176 107 -122 b 74 11 107 -38 96 -11 b 20 41 61 26 32 41 b 20 -15 20 41 20 15 b 19 -74 20 -72 20 -72 b 0 -87 14 -83 6 -87 b -19 -74 -8 -87 -16 -83 b -21 -15 -20 -72 -20 -72 ',\n },\n stringsUpBow: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -137 381 b -130 383 -134 383 -133 383 b -111 371 -122 383 -114 378 b -55 224 -110 370 -85 305 b 0 80 -25 145 -1 80 b 54 224 0 80 24 145 b 112 377 114 384 110 373 b 127 384 118 381 122 384 b 148 362 138 384 148 374 l 148 356 l 83 183 b 16 9 47 88 17 11 b -1 0 12 2 5 0 b -14 5 -5 0 -10 1 b -84 183 -19 9 -13 -6 l -149 356 l -149 362 b -137 381 -149 371 -145 378 ',\n },\n stringsHarmonic: {\n x_min: -122.5,\n x_max: 121.140625,\n ha: 124,\n o: 'm -16 145 b 0 147 -10 147 -5 147 b 121 -1 66 147 121 77 b 114 -49 121 -16 118 -33 b -1 -148 95 -112 47 -148 b -85 -106 -31 -148 -61 -134 b -122 -1 -110 -76 -122 -38 b -16 145 -122 68 -81 134 m 12 111 b 0 113 8 113 4 113 b -68 22 -29 113 -61 73 b -70 0 -69 15 -70 6 b -13 -113 -70 -49 -47 -98 b -1 -115 -9 -115 -5 -115 b 63 -40 24 -115 53 -83 b 68 -1 66 -27 68 -15 b 12 111 68 48 46 97 ',\n },\n pluckedSnapPizzicatoAbove: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -9 215 b 0 217 -6 217 -4 217 b 19 205 8 217 14 213 b 20 142 20 202 20 201 l 20 84 l 23 84 b 144 -27 81 74 129 30 b 148 -66 147 -40 148 -54 b 36 -213 148 -134 103 -197 b 0 -219 24 -217 12 -219 b -145 -104 -68 -219 -129 -173 b -149 -68 -148 -91 -149 -79 b -24 84 -149 6 -98 74 l -21 84 l -21 142 b -19 205 -20 201 -20 202 b -9 215 -17 209 -13 213 m -21 -15 b -23 41 -21 37 -21 41 b -23 41 -23 41 -23 41 b -76 11 -35 40 -62 26 b -108 -65 -98 -11 -108 -38 b -1 -176 -108 -122 -65 -176 b 107 -65 63 -176 107 -122 b 74 11 107 -38 96 -11 b 20 41 61 26 32 41 b 20 -15 20 41 20 15 b 19 -74 20 -72 20 -72 b 0 -87 14 -83 6 -87 b -19 -74 -8 -87 -16 -83 b -21 -15 -20 -72 -20 -72 ',\n },\n pluckedSnapPizzicatoBelow: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -9 215 b 0 217 -6 217 -4 217 b 19 205 8 217 14 213 b 20 142 20 202 20 201 l 20 84 l 23 84 b 144 -27 81 74 129 30 b 148 -66 147 -40 148 -54 b 36 -213 148 -134 103 -197 b 0 -219 24 -217 12 -219 b -145 -104 -68 -219 -129 -173 b -149 -68 -148 -91 -149 -79 b -24 84 -149 6 -98 74 l -21 84 l -21 142 b -19 205 -20 201 -20 202 b -9 215 -17 209 -13 213 m -21 -15 b -23 41 -21 37 -21 41 b -23 41 -23 41 -23 41 b -76 11 -35 40 -62 26 b -108 -65 -98 -11 -108 -38 b -1 -176 -108 -122 -65 -176 b 107 -65 63 -176 107 -122 b 74 11 107 -38 96 -11 b 20 41 61 26 32 41 b 20 -15 20 41 20 15 b 19 -74 20 -72 20 -72 b 0 -87 14 -83 6 -87 b -19 -74 -8 -87 -16 -83 b -21 -15 -20 -72 -20 -72 ',\n },\n pluckedLeftHandPizzicato: {\n x_min: 0,\n x_max: 319.859375,\n ha: 326,\n o: 'm 149 508 b 159 509 152 509 155 509 b 186 494 170 509 181 503 b 190 440 190 487 190 488 l 190 430 l 190 377 l 242 377 l 251 377 b 303 373 298 377 296 377 b 319 345 314 367 319 356 b 304 319 319 335 314 324 b 250 315 296 315 299 315 l 242 315 l 190 315 l 190 262 l 190 252 b 186 198 190 204 190 205 b 159 183 179 188 170 183 b 132 198 148 183 138 188 b 127 252 127 205 127 204 l 127 262 l 127 315 l 76 315 l 68 315 b 14 319 20 315 21 315 b 0 347 4 324 0 335 b 14 373 0 356 4 367 b 68 377 21 377 20 377 l 76 377 l 127 377 l 127 430 l 127 440 b 132 494 127 488 127 487 b 149 508 136 501 142 505 ',\n },\n keyboardPedalPed: {\n x_min: -1.359375,\n x_max: 1064.390625,\n ha: 1086,\n o: 'm 296 692 b 314 694 302 694 307 694 b 386 685 337 694 366 689 b 548 498 480 660 548 580 b 548 481 548 492 548 487 b 455 395 541 426 499 395 b 370 462 420 395 383 417 b 362 496 364 477 362 488 b 377 514 362 509 367 514 b 393 501 386 514 390 510 b 432 474 397 484 413 474 b 470 487 445 474 458 478 b 491 530 484 496 491 510 b 490 544 491 534 491 539 b 333 660 479 606 411 657 l 323 662 l 315 646 b 269 524 285 591 269 556 b 321 431 269 492 287 466 b 349 395 338 413 343 408 b 363 342 359 378 363 362 b 359 312 363 333 362 322 b 285 158 348 266 318 206 b 281 152 283 155 281 152 b 281 152 281 152 281 152 b 287 154 283 152 284 152 b 318 155 298 154 308 155 b 461 98 371 155 419 136 l 464 97 l 483 112 b 503 129 494 120 503 127 b 504 130 503 129 504 129 b 503 138 504 131 503 134 b 500 180 500 152 500 166 b 553 326 500 238 518 288 b 604 366 560 331 592 358 b 649 381 617 376 632 381 b 696 362 665 381 681 374 b 724 302 714 347 724 324 b 695 238 724 278 714 255 b 660 210 691 234 662 212 b 579 148 658 209 582 151 b 579 148 579 148 579 148 b 596 106 579 144 589 119 b 622 77 604 88 609 83 b 657 69 632 72 645 69 b 748 112 688 69 721 84 b 755 123 754 117 755 120 b 755 127 755 124 755 126 b 751 165 752 137 751 151 b 758 219 751 183 754 202 b 894 387 774 290 820 347 b 896 390 896 388 896 388 b 891 398 896 391 895 392 b 622 560 827 477 730 535 b 600 580 605 564 600 569 b 617 596 600 591 607 596 b 628 595 622 596 624 596 b 1057 248 846 552 1020 412 b 1064 191 1061 229 1064 209 b 922 0 1064 94 1005 9 b 902 -1 916 -1 909 -1 b 774 76 847 -1 800 26 b 769 83 770 81 770 83 b 769 81 769 83 769 83 b 627 -1 733 29 677 -1 b 548 27 597 -1 570 8 b 515 88 537 37 525 61 l 513 95 l 510 93 l 453 45 b 390 0 396 0 396 0 b 390 0 390 0 390 0 b 374 15 381 0 377 4 b 268 105 359 69 314 105 b 250 104 262 105 257 105 l 243 102 l 234 90 b 155 1 201 49 159 2 b 147 -1 152 0 149 -1 b 130 15 138 -1 130 6 b 132 20 130 18 132 19 b 136 31 133 22 134 27 b 220 131 149 74 178 109 b 231 137 225 134 230 136 b 302 278 280 202 302 244 b 265 335 302 299 295 309 b 209 442 234 363 213 402 b 209 455 209 446 209 451 b 279 648 209 502 232 564 l 285 659 l 283 659 b 176 627 238 653 210 645 b 57 477 111 594 66 538 b 55 459 55 471 55 464 b 72 409 55 437 61 415 b 93 403 78 405 87 403 b 152 467 123 403 151 431 b 168 488 153 483 157 488 b 185 462 181 488 185 483 l 185 460 b 137 344 183 409 168 369 b 78 322 119 328 98 322 b 13 360 50 322 25 335 b -1 426 4 380 -1 402 b 89 610 -1 488 32 559 b 296 692 147 659 210 685 m 926 348 b 921 353 924 351 922 353 b 914 348 920 353 918 351 b 823 167 857 306 823 237 b 828 124 823 154 826 138 b 890 31 837 79 862 40 b 896 31 892 31 894 31 b 956 104 916 31 940 59 b 970 191 965 129 970 159 b 966 241 970 208 969 224 b 926 348 959 277 945 313 m 627 326 b 619 326 624 326 622 326 b 598 316 611 326 604 323 b 568 215 579 288 568 255 b 568 208 568 213 568 210 b 571 183 570 195 570 184 l 571 183 b 594 201 571 183 582 191 l 634 231 b 660 259 653 247 656 248 b 664 278 662 266 664 272 b 627 326 664 299 649 320 ',\n },\n keyboardPedalUp: {\n x_min: -1.359375,\n x_max: 592.078125,\n ha: 604,\n o: 'm 280 692 b 295 694 283 692 289 694 b 310 692 300 694 307 692 b 357 630 340 684 357 657 b 336 580 357 612 351 594 b 311 538 321 566 311 549 b 352 492 311 512 330 492 b 366 495 357 492 362 492 b 397 553 390 503 397 517 b 415 603 397 576 402 591 b 460 623 427 617 443 623 b 509 599 479 623 498 614 b 522 559 518 587 522 573 b 494 506 522 538 513 519 b 451 495 481 498 473 496 b 415 488 432 495 426 494 b 394 449 404 483 394 464 b 394 448 394 448 394 448 l 394 440 l 397 433 b 428 409 404 420 413 413 b 438 408 431 408 435 408 b 479 431 450 408 462 415 b 528 455 495 448 510 455 b 548 452 534 455 541 453 b 592 391 577 442 592 416 b 549 331 592 365 577 340 b 528 327 541 328 534 327 b 479 351 510 327 495 335 b 438 374 464 367 450 374 b 417 369 431 374 424 373 b 394 333 402 360 394 348 b 400 312 394 326 396 319 b 451 287 408 294 420 288 b 513 258 484 285 499 278 b 522 223 519 247 522 234 b 461 159 522 190 496 159 b 449 161 457 159 453 159 b 397 229 416 167 397 191 b 366 288 397 265 390 278 b 352 290 362 290 357 290 b 315 262 336 290 321 280 b 311 245 313 256 311 251 b 334 204 311 233 318 220 b 355 170 348 190 351 184 b 357 152 356 166 357 159 b 355 136 357 147 356 140 b 295 88 345 104 321 88 b 232 152 264 88 232 112 b 255 204 232 174 238 186 b 279 244 273 222 279 231 l 279 245 b 238 290 279 270 259 290 b 224 288 234 290 228 290 b 193 229 200 278 193 265 b 141 161 193 191 174 167 b 129 159 137 159 133 159 b 68 223 93 159 68 190 b 77 258 68 234 70 247 b 138 287 91 278 106 285 b 185 302 166 287 175 291 b 196 333 193 312 196 323 b 174 369 196 347 187 360 b 152 374 166 373 159 374 b 111 351 140 374 126 367 b 62 327 95 335 80 327 b 51 328 58 327 54 327 b -1 391 16 334 -1 363 b 53 455 -1 420 17 449 b 62 455 57 455 59 455 b 111 431 80 455 95 448 b 152 408 127 415 140 408 b 161 409 155 408 159 408 b 193 433 176 413 186 420 l 196 440 l 196 448 b 196 451 196 449 196 449 b 190 471 196 459 194 463 b 137 495 182 489 167 495 l 134 495 l 134 495 b 68 560 95 495 68 521 b 129 623 68 596 95 623 b 144 621 134 623 138 623 b 193 553 175 614 193 589 b 224 495 193 517 200 503 b 238 492 228 492 234 492 b 279 538 259 492 279 512 b 254 580 279 549 269 566 b 232 630 239 594 232 612 b 280 692 232 657 250 684 m 307 456 b 295 458 303 458 299 458 b 230 391 258 458 230 426 b 236 360 230 381 231 371 b 295 324 249 337 272 324 b 353 360 318 324 341 337 b 360 391 357 370 360 381 b 307 456 360 421 340 451 ',\n },\n pictChokeCymbal: {\n x_min: 0,\n x_max: 227.3125,\n ha: 232,\n o: 'm 91 213 b 100 215 93 215 96 215 b 227 58 167 215 224 144 b 227 52 227 56 227 54 b 61 -201 227 -43 164 -138 b 29 -216 44 -212 36 -216 b 23 -210 27 -216 24 -213 b 21 -205 21 -208 21 -206 b 34 -192 21 -201 25 -197 b 122 -55 89 -161 122 -106 b 104 6 122 -33 117 -12 l 103 9 l 96 9 b 4 79 57 9 17 38 b 0 112 1 90 0 101 b 91 213 0 163 36 209 ',\n },\n wiggleArpeggiatoUp: {\n x_min: 58.53125,\n x_max: 228.671875,\n ha: 294,\n o: 'm 138 371 b 142 373 140 371 141 373 b 178 342 149 373 156 366 b 228 251 217 297 228 278 b 228 244 228 248 228 247 b 176 147 227 212 212 184 b 123 73 152 122 132 93 b 121 62 122 70 121 66 b 145 13 121 48 129 31 b 153 -2 151 6 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 145 -11 b 129 -1 140 -11 136 -8 b 61 87 89 37 68 68 b 58 113 59 95 58 105 b 110 215 58 144 74 177 b 163 287 134 240 155 269 b 166 299 166 291 166 295 b 141 348 166 313 157 330 b 133 360 134 356 133 358 b 133 363 133 362 133 362 b 138 371 133 367 136 370 ',\n },\n arrowheadBlackUp: {\n x_min: -10.890625,\n x_max: 299.4375,\n ha: 294,\n o: 'm 136 460 b 142 462 137 462 140 462 b 166 449 152 462 161 456 b 171 428 168 446 168 445 b 288 131 194 322 238 209 b 298 115 295 120 296 117 b 299 106 298 112 299 109 b 273 81 299 91 287 81 b 255 86 268 81 261 83 b 155 116 225 104 183 116 l 152 116 l 149 108 b 141 83 148 102 144 91 b 134 48 137 69 134 58 b 149 9 134 34 140 24 b 153 -1 152 5 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 147 -11 b 122 2 138 -11 133 -6 b 95 61 104 20 95 38 b 107 108 95 74 99 90 b 108 113 107 111 108 112 b 107 113 108 113 108 113 b 102 113 106 113 104 113 b 31 86 76 108 53 98 b 14 80 24 81 20 80 b -10 106 0 80 -10 91 b 0 131 -10 115 -9 116 b 115 430 49 209 91 317 b 136 460 119 451 123 456 ',\n },\n arrowheadBlackDown: {\n x_min: -10.890625,\n x_max: 298.078125,\n ha: 294,\n o: 'm 138 473 b 142 474 140 473 141 474 b 164 459 148 474 153 470 b 191 402 183 442 191 423 b 181 353 191 388 187 371 b 178 349 179 352 178 349 b 179 348 178 348 179 348 b 185 349 181 348 182 348 b 255 376 210 355 234 363 b 272 381 264 381 266 381 b 298 355 287 381 298 370 b 288 330 298 348 298 345 b 171 34 238 254 194 141 b 166 13 168 16 168 16 b 144 1 161 5 152 1 b 121 15 134 1 125 5 b 115 33 119 18 117 24 b 0 330 91 145 49 252 b -10 355 -9 345 -10 348 b 13 381 -10 371 0 381 b 31 376 19 381 25 380 b 132 345 61 358 103 345 l 136 345 l 137 355 b 145 378 138 359 142 370 b 152 415 149 394 152 405 b 137 452 152 427 148 438 b 133 464 134 458 133 460 b 138 473 133 467 134 470 ',\n },\n vexAccidentalMicrotonal1: {\n x_min: -171.5,\n x_max: 483.1875,\n ha: 493,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 495 20 616 20 616 b 20 373 20 427 20 373 b 115 410 20 373 63 390 l 210 448 l 210 531 b 212 620 210 614 210 616 b 231 632 215 628 223 632 b 246 627 236 632 242 631 b 251 541 251 620 251 628 l 251 463 l 315 489 b 387 514 368 509 381 514 b 393 513 390 514 392 514 b 406 494 402 510 406 502 b 397 476 406 487 404 480 b 323 446 396 474 363 462 l 251 417 l 251 283 l 251 148 l 254 151 b 370 199 291 183 332 199 b 415 191 385 199 400 197 b 483 84 458 176 483 134 b 461 0 483 58 476 29 b 332 -142 439 -40 411 -72 l 255 -215 b 231 -229 240 -229 239 -229 b 216 -223 224 -229 220 -227 b 210 -158 210 -217 210 -223 b 210 -120 210 -148 210 -136 l 210 -29 l 205 -34 b 100 -142 182 -65 159 -88 l 23 -215 b -1 -229 9 -229 6 -229 b -19 -217 -9 -229 -16 -224 l -20 -215 l -21 48 l -21 310 l -83 287 b -152 262 -133 266 -145 262 b -157 263 -153 262 -155 262 b -171 283 -166 266 -171 274 b -161 301 -171 290 -167 297 b -91 328 -160 302 -129 315 l -21 356 l -21 487 l -20 617 l -19 621 b -8 631 -17 626 -12 630 m 210 288 b 210 401 210 351 210 401 b 114 365 209 401 167 384 l 20 327 l 20 238 l 20 148 l 21 151 b 140 199 59 183 102 199 b 206 180 164 199 187 192 l 209 177 b 209 177 209 177 209 177 b 210 288 210 177 210 199 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 m 341 131 b 328 133 337 133 332 133 b 322 133 326 133 323 133 b 257 87 296 129 273 113 l 251 80 l 251 -37 l 251 -156 l 255 -152 b 375 81 328 -72 375 20 l 375 83 b 341 131 375 113 367 126 ',\n },\n vexAccidentalMicrotonal2: {\n x_min: -1.359375,\n x_max: 386.5625,\n ha: 394,\n o: 'm 249 535 b 257 537 251 537 253 537 b 276 524 266 537 273 533 l 277 521 l 279 419 l 279 316 l 304 323 b 337 328 319 326 330 328 b 353 316 347 328 349 324 b 355 266 355 315 355 290 b 353 215 355 241 355 217 b 319 198 349 206 347 205 b 279 187 284 190 279 188 b 279 156 279 187 279 174 b 279 136 279 151 279 144 l 279 84 l 289 87 l 330 98 b 367 105 352 102 362 105 b 378 101 372 105 375 104 b 386 61 385 95 386 94 b 386 40 386 55 386 48 l 386 -5 l 385 -8 b 374 -19 383 -12 378 -18 b 291 -40 372 -19 347 -26 b 279 -43 284 -41 279 -43 b 279 -83 279 -43 279 -59 b 279 -95 279 -87 279 -91 l 279 -145 l 304 -140 b 337 -133 321 -136 330 -133 b 349 -140 343 -133 347 -136 b 355 -181 355 -145 355 -142 l 355 -197 l 355 -210 b 349 -252 355 -249 355 -247 b 300 -269 345 -258 347 -258 b 280 -274 291 -272 281 -273 l 279 -274 l 277 -378 l 277 -483 l 276 -487 b 257 -499 273 -495 265 -499 b 238 -487 249 -499 242 -495 l 236 -483 l 236 -384 l 236 -285 l 235 -285 l 212 -291 l 170 -301 b 148 -308 159 -305 148 -306 b 147 -415 147 -308 147 -313 l 147 -523 l 145 -526 b 126 -538 141 -534 133 -538 b 106 -526 118 -538 110 -534 l 104 -523 l 104 -420 b 103 -317 104 -326 104 -317 b 103 -317 103 -317 103 -317 b 50 -330 92 -322 54 -330 b 31 -317 42 -330 35 -326 b 29 -267 29 -315 29 -315 l 29 -219 l 32 -216 b 92 -192 36 -206 36 -206 l 104 -190 l 104 -138 b 103 -87 104 -91 104 -87 b 103 -87 103 -87 103 -87 b 88 -91 103 -87 96 -88 l 49 -101 b 17 -106 32 -105 23 -106 b 6 -102 13 -106 10 -105 b -1 -62 0 -97 -1 -95 b 0 -41 -1 -56 0 -49 l 0 4 l 1 6 b 10 16 2 11 6 15 b 91 37 12 18 38 24 l 104 41 l 104 93 b 103 144 104 140 104 144 b 103 144 103 144 103 144 b 50 131 92 141 54 131 b 31 144 42 131 35 137 b 29 195 29 147 29 148 l 29 242 l 32 245 b 92 269 36 255 36 255 l 104 273 l 104 377 l 104 481 l 106 485 b 126 498 110 492 118 498 b 134 495 129 498 132 496 b 145 485 138 494 142 489 l 147 481 l 147 383 l 147 283 l 152 284 b 190 294 155 285 171 290 l 230 303 l 236 305 l 236 413 l 236 521 l 238 524 b 249 535 240 528 243 533 m 236 126 b 235 177 236 154 236 177 l 235 177 b 213 172 235 177 225 174 l 170 161 b 147 155 157 158 147 155 b 147 124 147 155 147 142 b 147 102 147 117 147 111 l 147 52 l 153 54 l 228 72 l 236 74 l 236 126 m 236 -105 b 235 -54 236 -65 236 -54 l 235 -54 b 231 -55 235 -54 234 -54 b 172 -69 227 -55 204 -62 l 149 -76 l 147 -76 l 147 -127 l 147 -179 l 152 -177 b 190 -167 155 -177 171 -173 l 230 -158 l 236 -156 l 236 -105 ',\n },\n vexWiggleArpeggioUp: {\n x_min: 58.53125,\n x_max: 228.671875,\n ha: 294,\n o: 'm 138 371 b 142 373 140 371 141 373 b 178 342 149 373 156 366 b 228 251 217 297 228 278 b 228 244 228 248 228 247 b 176 147 227 212 212 184 b 123 73 152 122 132 93 b 121 62 122 70 121 66 b 145 13 121 48 129 31 b 153 -2 151 6 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 145 -11 b 129 -1 140 -11 136 -8 b 61 87 89 37 68 68 b 58 113 59 95 58 105 b 110 215 58 144 74 177 b 163 287 134 240 155 269 b 166 299 166 291 166 295 b 141 348 166 313 157 330 b 133 360 134 356 133 358 b 133 363 133 362 133 362 b 138 371 133 367 136 370 ',\n },\n vexNoteHeadMutedBreve: {\n x_min: 0,\n x_max: 370.21875,\n ha: 378,\n o: 'm 0 0 l 0 277 l 61 277 l 122 277 l 122 0 l 122 -278 l 61 -278 l 0 -278 l 0 0 m 246 -1 l 246 277 l 308 277 l 370 277 l 370 -1 l 370 -278 l 308 -278 l 246 -278 l 246 -1 ',\n },\n },\n cssFontWeight: 'normal',\n ascender: 1903,\n underlinePosition: -125,\n cssFontStyle: 'normal',\n boundingBox: {\n yMin: -2065.375,\n xMin: -695.53125,\n yMax: 1901.578125,\n xMax: 1159.671875,\n },\n resolution: 1000,\n original_font_information: {\n postscript_name: 'Gonville-18',\n version_string: 'Version 0.1.8904 ',\n vendor_url: '',\n full_font_name: 'Gonville-18',\n font_family_name: 'Gonville-18',\n copyright: 'No copyright is claimed on this font file.',\n description: '',\n trademark: '',\n designer: '',\n designer_url: '',\n unique_font_identifier: 'FontForge 2.0 : Gonville-18 : 17-3-2010',\n license_url: '',\n license_description: '',\n manufacturer_name: '',\n font_sub_family_name: '18',\n },\n descender: -2066,\n fontFamily: 'Gonville-18',\n lineHeight: 4093,\n underlineThickness: 50,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { GonvilleFont } from '../src/fonts/gonville_glyphs';\nimport { GonvilleMetrics } from '../src/fonts/gonville_metrics';\nexport const Font = {\n data: GonvilleFont,\n metrics: GonvilleMetrics,\n};\nexport default Font;\n","/**\n * The Gonville font was created by Simon Tatham.\n * https://www.chiark.greenend.org.uk/~sgtatham/gonville/\n */\nexport const GonvilleMetrics = {\n name: 'Gonville',\n smufl: false,\n stave: {\n padding: 12,\n endPaddingMax: 10,\n endPaddingMin: 5,\n unalignedNotePadding: 10,\n },\n accidental: {\n noteheadAccidentalPadding: 1,\n leftPadding: 2,\n accidentalSpacing: 3,\n },\n clef: {\n default: {\n point: 40,\n width: 26,\n },\n small: {\n point: 32,\n width: 20,\n },\n annotations: {\n '8va': {\n smuflCode: 'timeSig8',\n default: {\n point: 20,\n treble: {\n line: -1.2,\n shiftX: 11,\n },\n },\n small: {\n point: 18,\n treble: {\n line: -0.4,\n shiftX: 8,\n },\n },\n },\n '8vb': {\n smuflCode: 'timeSig8',\n default: {\n point: 20,\n treble: {\n line: 6.3,\n shiftX: 10,\n },\n bass: {\n line: 4,\n shiftX: 1,\n },\n },\n small: {\n point: 18,\n treble: {\n line: 5.8,\n shiftX: 6,\n },\n bass: {\n line: 3.5,\n shiftX: 0.5,\n },\n },\n },\n },\n // May not need these anymore\n lineCount: {\n '8': { point: 55, shiftY: 14 },\n '7': { point: 47, shiftY: 8 },\n '6': { point: 40, shiftY: 1 },\n '5': { point: 30, shiftY: -6 },\n '4': { point: 23, shiftY: -12 },\n },\n },\n parenthesis: {\n default: {\n point: 39,\n width: 7,\n },\n gracenote: {\n point: (39 * 3) / 5,\n width: 3,\n },\n },\n pedalMarking: {\n up: {\n point: 40,\n },\n down: {\n point: 40,\n },\n },\n // These are for numeric digits, such as in time signatures\n digits: {\n point: 40,\n tupletPoint: 28,\n },\n // articulation: {\n // },\n tremolo: {\n default: {\n point: 25,\n spacing: 4,\n offsetYStemUp: -7,\n offsetYStemDown: 7,\n offsetXStemUp: 9,\n offsetXStemDown: -0.5,\n },\n grace: {\n point: 15,\n spacing: 4,\n offsetYStemUp: -7,\n offsetYStemDown: 7,\n offsetXStemUp: 6.5,\n offsetXStemDown: -0.5,\n },\n },\n staveRepetition: {\n default: {\n offsetY: 25,\n offsetSymbol: 12,\n spacing: 5,\n },\n },\n // noteHead: {\n // },\n stem: {\n heightAdjustmentForFlag: -3,\n // These are stem (Y) offsets to the note heads. To shift the\n // noteheads (x-position) themselves, see glyphs.notehead.custom.\n noteHead: {\n noteheadTriangleUpHalf: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpBlack: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpWhole: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadXHalf: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXBlack: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXWhole: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadHalf: {\n offsetYBaseStemUp: -1.5,\n offsetYBaseStemDown: 1.5,\n },\n noteheadBlack: {\n offsetYBaseStemUp: -1.5,\n offsetYBaseStemDown: 1.5,\n },\n noteheadSquareWhite: {\n offsetYBaseStemDown: -5,\n offsetYBaseStemUp: 5,\n },\n },\n },\n glyphs: {\n flag: {\n shiftX: -0.08,\n flag8thDown: {\n shiftX: -0.16,\n },\n flag16thDown: {\n shiftX: -0.16,\n },\n flag32ndDown: {\n shiftX: -0.16,\n shiftY: 9,\n },\n flag64thDown: {\n shiftX: -0.16,\n shiftY: 13,\n },\n flag128thDown: {\n shiftX: -0.16,\n shiftY: 22,\n },\n flag32ndUp: {\n shiftY: -9,\n },\n flag64thUp: {\n shiftY: -13,\n },\n flag128thUp: {\n shiftY: -22,\n },\n },\n stringNumber: {\n verticalPadding: 8,\n stemPadding: 2,\n leftPadding: 5,\n rightPadding: 6,\n },\n textNote: {\n point: 40,\n default: {},\n ornamentTrill: {\n shiftX: -5,\n shiftY: 4,\n },\n },\n noteHead: {\n minPadding: 2,\n custom: {\n noteheadDiamondWholeStemUp: {\n shiftX: -6,\n },\n noteheadCircleXStemUp: {\n shiftX: -1.5,\n },\n noteheadXWholeStemUp: {\n shiftX: -5,\n },\n noteheadTriangleUpWholeStemUp: {\n shiftX: -6,\n },\n },\n },\n chordSymbol: {\n global: {\n superscriptOffset: -400,\n subscriptOffset: 300,\n kerningOffset: -250,\n lowerKerningText: ['D', 'F', 'P', 'T', 'V', 'Y'],\n upperKerningText: ['A', 'L'],\n spacing: 100,\n superSubRatio: 0.66,\n },\n csymDiminished: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymHalfDiminished: {\n scale: 0.8,\n leftSideBearing: -32,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymAugmented: {\n scale: 1,\n leftSideBearing: 0,\n advanceWidth: 530,\n yOffset: 0,\n },\n csymParensLeftTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 155,\n yOffset: 250,\n },\n csymParensRightTall: {\n scale: 0.8,\n leftSideBearing: -40,\n advanceWidth: 189,\n yOffset: 250,\n },\n csymBracketLeftTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 328,\n yOffset: 0,\n },\n csymBracketRightTall: {\n scale: 0.8,\n leftSideBearing: 1,\n advanceWidth: 600,\n yOffset: 0,\n },\n csymParensLeftVeryTall: {\n scale: 0.9,\n leftSideBearing: 0,\n advanceWidth: 121,\n yOffset: 350,\n },\n csymParensRightVeryTall: {\n scale: 0.9,\n leftSideBearing: 50,\n advanceWidth: 111,\n yOffset: 350,\n },\n csymDiagonalArrangementSlash: {\n scale: 0.6,\n leftSideBearing: -1,\n advanceWidth: 990,\n yOffset: 0,\n },\n csymMinor: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 482,\n yOffset: 0,\n },\n csymMajorSeventh: {\n scale: 0.9,\n leftSideBearing: 200,\n yOffset: 0,\n advanceWidth: 600,\n },\n accidentalSharp: {\n scale: 0.75,\n leftSideBearing: 40,\n advanceWidth: 250,\n yOffset: -402,\n },\n accidentalFlat: {\n scale: 0.95,\n leftSideBearing: -50,\n advanceWidth: 208,\n yOffset: -184,\n },\n },\n jazzOrnaments: {\n brassScoop: {\n scale: 1.0,\n xOffset: -12,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 10,\n },\n brassDoitMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassFallLipShort: {\n scale: 1.0,\n xOffset: 17,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassLiftMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 5,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassFallRoughMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 28,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassBend: {\n scale: 1.0,\n xOffset: 2,\n yOffset: -8,\n stemUpYOffset: 24,\n reportedWidth: 5,\n },\n brassMuteClosed: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -9,\n stemUpYOffset: 24,\n reportedWidth: 5,\n },\n brassMuteOpen: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -7,\n stemUpYOffset: 25,\n reportedWidth: 5,\n },\n brassFlip: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassJazzTurn: {\n scale: 1.0,\n xOffset: 6,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassSmear: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n },\n tremolo: {\n default: {\n shiftY: -10,\n },\n grace: {\n shiftY: -5,\n },\n },\n tuplet: {\n noteHeadOffset: 20,\n stemOffset: 10,\n bottomLine: 4,\n topModifierOffset: 15,\n },\n },\n};\n"],"names":["root","factory","exports","module","define","amd","window","globalThis","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","data","glyphs","bracketTop","x_min","x_max","ha","bracketBottom","barlineTick","breathMarkTick","segno","coda","gClef","cClef","fClef","unpitchedPercussionClef1","timeSig0","timeSig1","timeSig2","timeSig3","timeSig4","timeSig5","timeSig6","timeSig7","timeSig8","timeSig9","timeSigCommon","timeSigCutCommon","timeSigPlus","timeSigPlusSmall","timeSigMinus","timeSigParensRight","timeSigParensRightSmall","timeSigParensLeft","timeSigParensLeftSmall","noteheadDoubleWhole","noteheadWhole","noteheadHalf","noteheadBlack","noteheadXWhole","noteheadXHalf","noteheadXBlack","noteheadCircleX","noteheadTriangleUpWhole","noteheadTriangleUpHalf","noteheadTriangleUpBlack","noteheadDiamondWhole","noteheadDiamondHalf","noteheadDiamondBlack","augmentationDot","tremolo1","flag8thUp","flag8thDown","flag16thUp","flag16thDown","flag32ndUp","flag32ndDown","flag64thUp","flag64thDown","flag128thUp","flag128thDown","accidentalFlat","accidentalNatural","accidentalSharp","accidentalDoubleSharp","accidentalDoubleFlat","accidentalParensLeft","accidentalParensRight","accidentalQuarterToneFlatStein","accidentalThreeQuarterTonesFlatZimmermann","accidentalQuarterToneSharpStein","accidentalThreeQuarterTonesSharpStein","accidentalBuyukMucennebFlat","accidentalBakiyeFlat","accidentalKomaSharp","accidentalKucukMucennebSharp","articAccentAbove","articAccentBelow","articTenutoAbove","articTenutoBelow","articStaccatoAbove","articStaccatoBelow","articStaccatissimoAbove","articStaccatissimoBelow","articMarcatoAbove","articMarcatoBelow","fermataAbove","fermataBelow","breathMarkComma","breathMarkUpbow","caesura","caesuraCurved","restMaxima","restDoubleWhole","restWhole","restHalf","restQuarter","rest8th","rest16th","rest32nd","rest64th","rest128th","dynamicPiano","dynamicMezzo","dynamicForte","dynamicRinforzando","dynamicSforzando","dynamicZ","ornamentTrill","ornamentTurn","ornamentTurnSlash","ornamentMordent","ornamentShortTrill","ornamentTremblement","ornamentPrecompAppoggTrill","ornamentPrecompSlideTrillDAnglebert","ornamentPrecompSlideTrillBach","ornamentPrecompTrillSuffixDandrieu","ornamentPrecompDoubleCadenceUpperPrefix","ornamentPrecompDoubleCadenceUpperPrefixTurn","ornamentPrecompTrillLowerSuffix","stringsDownBow","stringsUpBow","stringsHarmonic","pluckedSnapPizzicatoAbove","pluckedSnapPizzicatoBelow","pluckedLeftHandPizzicato","keyboardPedalPed","keyboardPedalUp","pictChokeCymbal","wiggleArpeggiatoUp","arrowheadBlackUp","arrowheadBlackDown","vexAccidentalMicrotonal1","vexAccidentalMicrotonal2","vexWiggleArpeggioUp","vexNoteHeadMutedBreve","cssFontWeight","ascender","underlinePosition","cssFontStyle","boundingBox","yMin","xMin","yMax","xMax","resolution","original_font_information","postscript_name","version_string","vendor_url","full_font_name","font_family_name","copyright","description","trademark","designer","designer_url","unique_font_identifier","license_url","license_description","manufacturer_name","font_sub_family_name","descender","fontFamily","lineHeight","underlineThickness","metrics","name","smufl","stave","padding","endPaddingMax","endPaddingMin","unalignedNotePadding","accidental","noteheadAccidentalPadding","leftPadding","accidentalSpacing","clef","default","point","width","small","annotations","smuflCode","treble","line","shiftX","bass","lineCount","shiftY","parenthesis","gracenote","pedalMarking","up","down","digits","tupletPoint","tremolo","spacing","offsetYStemUp","offsetYStemDown","offsetXStemUp","offsetXStemDown","grace","staveRepetition","offsetY","offsetSymbol","stem","heightAdjustmentForFlag","noteHead","offsetYBaseStemUp","offsetYBaseStemDown","noteheadSquareWhite","flag","stringNumber","verticalPadding","stemPadding","rightPadding","textNote","minPadding","custom","noteheadDiamondWholeStemUp","noteheadCircleXStemUp","noteheadXWholeStemUp","noteheadTriangleUpWholeStemUp","chordSymbol","global","superscriptOffset","subscriptOffset","kerningOffset","lowerKerningText","upperKerningText","superSubRatio","csymDiminished","scale","leftSideBearing","advanceWidth","yOffset","csymHalfDiminished","csymAugmented","csymParensLeftTall","csymParensRightTall","csymBracketLeftTall","csymBracketRightTall","csymParensLeftVeryTall","csymParensRightVeryTall","csymDiagonalArrangementSlash","csymMinor","csymMajorSeventh","jazzOrnaments","brassScoop","xOffset","stemUpYOffset","reportedWidth","brassDoitMedium","brassFallLipShort","brassLiftMedium","brassFallRoughMedium","brassBend","brassMuteClosed","brassMuteOpen","brassFlip","brassJazzTurn","brassSmear","tuplet","noteHeadOffset","stemOffset","bottomLine","topModifierOffset"],"sourceRoot":""} \ No newline at end of file diff --git a/build/cjs/vexflow-font-petaluma.js b/build/cjs/vexflow-font-petaluma.js new file mode 100644 index 0000000000..396c5c2a9c --- /dev/null +++ b/build/cjs/vexflow-font-petaluma.js @@ -0,0 +1,2 @@ +!function(b,m){"object"==typeof exports&&"object"==typeof module?module.exports=m():"function"==typeof define&&define.amd?define([],m):"object"==typeof exports?exports.VexFlowFont=m():(b.VexFlowFont=b.VexFlowFont||{},b.VexFlowFont.Petaluma=m())}("undefined"!=typeof window?window:"undefined"!=typeof globalThis?globalThis:this,(function(){return(()=>{"use strict";var b={d:(m,a)=>{for(var e in a)b.o(a,e)&&!b.o(m,e)&&Object.defineProperty(m,e,{enumerable:!0,get:a[e]})},o:(b,m)=>Object.prototype.hasOwnProperty.call(b,m)},m={};b.d(m,{default:()=>a});const a={data:{glyphs:{bracketTop:{x_min:0,x_max:508,y_min:0,y_max:370,ha:370,o:"m 22 0 b 122 0 55 1 89 0 l 157 0 b 713 376 425 0 622 137 b 732 467 724 406 732 436 b 726 514 732 482 730 498 b 711 533 723 528 719 533 b 693 526 707 533 700 530 b 674 498 683 520 678 508 b 635 406 662 467 652 435 b 310 164 560 281 458 193 b 154 151 258 154 206 151 b 39 154 117 151 78 154 b 1 120 17 154 4 145 b 0 84 0 108 0 96 b 0 20 0 63 1 40 b 22 0 0 4 7 0 z"},bracketBottom:{x_min:0,x_max:496,y_min:-393,y_max:0,ha:393,o:"m 696 -566 b 711 -539 713 -566 708 -549 b 714 -521 713 -533 714 -527 b 713 -508 714 -517 713 -513 b 661 -327 706 -445 688 -384 b 392 -42 603 -203 513 -109 b 206 0 331 -7 266 0 b 160 -1 190 0 174 -1 b 26 -1 107 -1 66 -3 b 0 -19 12 -1 0 -4 l 0 -23 b 3 -50 1 -32 3 -42 b 1 -86 3 -62 1 -73 b 4 -118 1 -96 1 -108 b 45 -151 10 -145 23 -154 b 180 -143 89 -144 135 -145 b 621 -419 392 -135 523 -236 b 662 -539 641 -456 655 -497 b 696 -566 667 -557 680 -566 z"},barlineTick:{x_min:0,x_max:56.036101509664164,y_min:876.905249806889,y_max:1121.5430338167066,ha:244.63778400981766,o:"m 42 1263 b 66 1287 62 1261 66 1272 b 81 1583 65 1387 72 1485 b 35 1614 82 1610 53 1610 b 14 1591 17 1619 16 1604 b 0 1408 7 1525 0 1459 l 0 1292 b 42 1263 1 1263 23 1266 z"},breathMarkTick:{x_min:0,x_max:568,y_min:0,y_max:621,ha:621,o:"m 258 0 b 278 39 276 0 274 24 b 279 56 279 45 279 50 l 279 73 b 278 117 279 88 278 102 b 281 148 278 127 279 138 b 536 600 312 330 387 487 b 744 719 600 651 670 690 b 815 779 775 730 808 740 b 818 824 818 793 818 808 b 815 868 818 838 818 852 b 796 894 814 881 808 894 b 779 888 791 894 786 893 b 719 864 760 878 739 871 b 372 602 580 806 459 724 b 229 252 298 498 251 383 b 220 268 225 262 222 264 b 209 302 217 279 213 291 b 75 527 181 387 143 467 b 16 563 58 543 39 573 b 0 539 3 557 0 549 b 12 492 0 524 9 507 b 56 400 19 459 22 425 b 163 269 104 367 138 323 b 238 36 197 194 216 115 b 258 0 242 22 243 0 z"},segno:{x_min:0,x_max:798,y_min:-65,y_max:806,ha:871,o:"m 16 -94 b 66 -69 39 -92 53 -85 b 177 59 102 -26 138 17 b 543 456 298 192 420 324 b 726 300 615 420 680 373 b 753 217 744 271 753 243 b 655 112 753 170 719 131 b 599 104 636 107 618 104 b 461 173 544 104 495 128 b 432 190 454 183 444 190 b 409 179 425 190 418 187 b 359 118 390 160 373 141 b 341 72 347 101 341 86 b 373 24 341 56 351 40 b 409 6 384 17 396 10 b 550 -13 454 -12 501 -14 b 599 -6 566 -12 583 -10 b 864 213 720 27 806 104 b 886 300 878 242 886 271 b 857 395 886 331 877 363 b 799 467 840 420 821 445 b 648 572 755 513 704 546 b 1110 1083 802 743 955 914 b 1140 1129 1123 1097 1136 1110 b 1149 1148 1142 1135 1149 1142 b 1145 1153 1149 1149 1148 1152 b 1123 1161 1139 1158 1130 1161 b 1109 1156 1119 1161 1113 1159 b 1089 1138 1102 1151 1094 1145 b 946 988 1040 1089 989 1041 b 595 602 834 855 711 732 l 590 598 l 549 615 b 432 793 462 647 432 723 b 534 888 432 851 474 888 b 671 834 588 888 631 864 b 710 818 684 824 696 818 b 724 821 714 818 719 819 b 809 883 757 834 788 852 b 816 901 814 890 816 896 b 802 923 816 910 812 916 b 706 984 770 945 742 971 b 593 1011 668 998 631 1011 b 516 991 567 1011 541 1005 b 333 799 433 949 380 876 b 302 693 312 765 302 729 b 330 589 302 658 311 624 b 469 488 360 533 415 511 b 485 482 475 487 480 485 b 266 249 412 405 338 327 b 121 88 217 196 170 141 b 9 -65 78 40 37 -7 b 0 -85 4 -72 0 -79 b 16 -94 0 -91 4 -94 z m 861 536 b 927 575 890 539 909 557 b 965 628 952 598 965 613 b 926 680 965 644 952 658 b 865 713 900 701 883 713 b 805 667 845 713 828 698 b 768 611 791 649 770 631 b 812 564 766 589 798 582 b 861 536 824 550 840 537 z m 251 350 b 363 436 285 348 353 403 b 354 456 366 448 360 452 b 271 518 327 477 298 497 b 243 528 261 526 252 528 b 210 513 232 528 222 523 b 157 454 190 494 176 472 b 141 428 147 444 141 436 b 158 406 141 420 147 413 b 216 361 180 393 197 376 b 245 350 225 356 235 350 z"},coda:{x_min:0,x_max:1380,y_min:-196,y_max:1037,ha:1233,o:"m 1028 -282 b 1057 -245 1045 -282 1053 -261 b 1060 -203 1060 -232 1060 -217 b 1063 9 1060 -132 1061 -62 b 1390 194 1192 22 1303 81 b 1531 543 1467 298 1512 415 b 1532 556 1531 547 1532 552 b 1904 559 1656 557 1780 559 b 1950 582 1920 559 1941 569 b 1987 674 1970 609 1987 638 b 1984 698 1987 681 1986 690 b 1950 700 1973 698 1961 700 l 1941 700 l 1545 696 b 1535 776 1545 723 1541 749 b 1103 1113 1477 996 1326 1107 b 1080 1115 1096 1115 1087 1115 b 1081 1322 1080 1184 1080 1253 b 1079 1467 1083 1371 1081 1418 b 1061 1493 1079 1476 1080 1493 l 1060 1493 b 1028 1467 1044 1490 1031 1485 b 1020 1403 1025 1446 1020 1424 b 1017 1110 1020 1305 1018 1208 l 962 1106 b 569 914 808 1087 671 1035 b 451 683 510 844 472 766 l 161 678 b 118 680 148 678 132 680 b 79 670 101 680 86 678 b 0 544 48 636 29 592 l 37 544 l 429 549 b 428 518 428 539 428 528 b 488 285 428 435 458 360 b 681 81 526 192 593 124 b 946 9 763 40 854 19 b 1008 6 966 7 988 6 b 1005 -137 1008 -42 1005 -89 b 1012 -243 1005 -173 1005 -209 b 1028 -282 1015 -258 1011 -282 z m 1074 690 b 1079 935 1077 772 1077 852 b 1326 855 1166 932 1250 909 b 1446 694 1385 814 1426 759 b 1269 693 1387 694 1328 693 b 1074 690 1204 693 1139 691 z m 577 684 b 766 874 618 763 678 828 b 989 932 837 912 913 923 b 1015 933 998 932 1007 933 b 1014 822 1015 896 1014 860 b 1011 688 1012 791 1012 743 z m 1067 184 b 1071 553 1070 307 1068 429 b 1439 556 1194 553 1316 554 b 1437 554 1439 554 1437 554 b 1341 337 1413 478 1387 402 b 1119 192 1286 261 1211 212 b 1067 184 1102 189 1084 186 z m 1008 180 b 660 264 886 181 770 212 b 524 471 570 305 524 374 b 528 524 524 488 526 505 l 533 549 b 792 552 619 550 706 550 b 1009 553 865 553 937 552 b 1008 180 1009 428 1008 288 z"},gClef:{x_min:0,x_max:664,y_min:-559,y_max:1009,ha:1568,o:"m 343 -805 b 366 -801 350 -805 357 -804 b 409 -773 383 -795 397 -786 b 582 -328 528 -648 577 -497 b 583 -294 582 -315 583 -294 b 612 -279 583 -294 603 -282 b 747 -197 660 -256 706 -230 b 949 143 857 -109 920 10 b 956 206 955 164 956 186 b 791 384 956 297 906 363 b 704 393 762 390 733 393 b 498 336 632 393 563 374 b 481 325 490 331 481 325 l 444 465 b 442 485 442 472 442 485 b 609 880 442 485 589 746 b 619 996 616 919 619 958 b 613 1084 619 1027 618 1056 b 534 1387 599 1188 560 1286 b 482 1453 527 1417 517 1453 b 422 1407 456 1453 438 1428 b 305 1063 348 1305 312 1188 b 304 1002 304 1043 304 1022 b 338 654 304 886 323 769 b 343 629 338 645 341 636 b 144 356 278 537 206 451 b 23 144 101 288 53 220 b 0 20 7 107 0 63 b 82 -210 0 -69 30 -160 b 207 -288 112 -239 160 -271 b 410 -328 274 -312 340 -328 b 474 -324 431 -328 452 -327 l 491 -321 b 491 -341 491 -321 492 -334 b 402 -585 475 -428 454 -513 b 294 -668 374 -622 348 -664 b 271 -693 278 -670 271 -680 b 274 -708 271 -698 272 -703 b 302 -775 282 -730 292 -753 b 343 -805 311 -795 325 -805 z m 400 717 b 382 922 389 786 382 854 b 481 1286 382 1047 408 1169 b 507 1125 498 1233 507 1179 b 500 1040 507 1097 504 1068 b 400 717 481 927 455 818 z m 252 -135 b 196 -121 232 -134 215 -127 b 117 -69 158 -108 127 -94 b 111 -32 112 -58 111 -45 b 117 19 111 -16 114 1 b 130 56 118 27 127 52 b 324 337 186 156 253 246 l 384 416 l 395 384 b 416 291 406 348 416 291 b 350 213 416 291 376 239 b 243 -42 278 143 243 55 b 251 -117 243 -66 246 -91 b 252 -135 252 -122 252 -127 z m 563 -91 b 510 168 552 3 530 78 b 513 192 508 179 508 186 b 624 202 550 199 586 202 b 730 192 660 202 694 199 b 850 141 773 183 816 176 b 858 134 852 138 855 135 b 595 -121 801 19 716 -68 l 569 -131 z m 410 -160 b 311 -147 360 -160 311 -147 b 307 -98 311 -147 307 -127 b 314 -33 307 -79 308 -56 b 429 131 328 36 377 85 b 441 138 433 135 438 138 b 449 122 446 138 448 132 b 490 -131 462 37 484 -46 b 490 -153 491 -140 490 -153 b 410 -160 490 -153 452 -163 z"},cClef:{x_min:0,x_max:731,y_min:-543,y_max:543,ha:1086,o:"m 131 -782 b 141 -755 138 -782 140 -773 b 147 -490 143 -667 145 -577 b 160 207 150 -258 153 -24 b 168 618 164 344 158 481 b 81 768 173 690 132 732 b 45 782 66 778 55 782 b 3 740 26 782 13 768 b 0 724 1 736 0 730 l 1 710 b 4 596 4 672 4 634 l 4 382 b 9 102 4 288 4 196 b 17 -301 13 -32 10 -166 l 17 -672 b 50 -736 17 -701 27 -720 b 109 -772 69 -749 91 -759 b 131 -782 120 -778 127 -782 z m 615 -770 b 881 -684 710 -770 801 -739 b 1020 -395 986 -612 1020 -510 b 1017 -334 1020 -374 1018 -354 b 769 -62 1007 -209 896 -75 b 746 -60 762 -60 755 -60 b 639 -73 710 -60 675 -69 b 524 -109 598 -79 560 -92 b 528 -36 526 -85 528 -60 b 527 -4 528 -26 528 -14 b 528 39 527 10 528 24 b 526 99 528 59 527 79 b 592 94 549 95 570 94 b 648 99 611 94 629 95 b 912 157 744 94 844 117 b 1053 377 1009 215 1053 284 b 1050 425 1053 393 1053 409 b 914 665 1037 521 986 602 b 717 753 855 717 791 753 b 626 734 688 753 658 747 l 462 665 b 347 500 374 628 347 580 b 350 449 347 484 348 468 b 392 419 353 428 367 416 b 492 438 425 425 459 428 b 541 498 524 448 541 468 b 540 514 541 503 541 508 b 537 546 537 524 537 536 b 573 639 537 580 550 611 b 606 657 582 649 593 657 l 609 657 b 716 622 647 652 684 647 b 834 372 801 556 834 469 b 831 323 834 356 832 338 b 743 187 825 266 795 217 b 710 176 732 180 720 176 b 694 179 704 176 700 177 b 527 223 638 193 582 206 b 495 229 516 228 505 229 b 454 220 481 229 468 225 b 395 189 432 213 415 200 b 363 180 384 186 374 181 b 348 168 356 179 348 176 b 340 161 343 167 340 164 b 347 150 340 157 343 154 b 356 147 348 148 353 147 b 364 92 361 130 363 111 b 369 -37 367 49 369 6 b 363 -154 369 -76 367 -115 b 357 -236 360 -183 357 -210 b 376 -264 357 -253 361 -259 b 456 -289 402 -284 429 -289 b 521 -282 478 -289 500 -285 b 549 -255 537 -279 546 -271 b 598 -177 556 -225 577 -202 b 622 -164 605 -168 613 -164 b 636 -167 626 -164 631 -166 b 749 -225 678 -177 714 -199 b 848 -405 814 -276 848 -337 b 824 -507 848 -436 840 -471 b 657 -657 792 -582 730 -625 b 608 -668 638 -664 622 -668 b 534 -602 572 -668 547 -645 b 513 -575 530 -589 523 -575 b 507 -576 510 -575 508 -575 b 478 -582 497 -580 488 -582 b 405 -570 454 -582 428 -570 b 389 -572 399 -570 395 -570 l 363 -572 b 321 -575 348 -572 333 -569 l 321 631 b 323 662 323 641 323 652 b 315 716 323 681 321 698 b 304 736 314 723 317 736 l 302 736 b 281 716 294 734 285 729 b 275 665 276 700 275 683 l 275 382 b 276 99 275 288 275 193 b 279 -170 278 10 276 -81 b 284 -399 282 -246 284 -323 b 282 -629 284 -475 282 -553 b 289 -721 282 -660 289 -690 b 300 -736 289 -727 291 -736 b 312 -724 307 -736 310 -730 b 321 -667 323 -706 321 -687 l 321 -632 l 328 -644 l 340 -657 b 510 -757 386 -707 445 -740 b 615 -770 546 -766 580 -770 z"},fClef:{x_min:0,x_max:776,y_min:-496,y_max:216,ha:712,o:"m 402 -706 b 804 -405 592 -678 716 -566 b 876 -53 861 -298 874 -183 b 868 33 876 -32 873 1 b 560 311 845 217 723 311 b 524 310 549 311 536 311 b 131 134 373 297 239 242 b 17 -29 84 86 37 39 b 9 -89 12 -50 9 -71 b 112 -238 9 -154 43 -206 b 124 -243 117 -239 120 -242 b 186 -261 145 -255 166 -261 b 268 -228 215 -261 242 -249 b 351 -59 325 -181 351 -124 b 343 10 351 -36 348 -13 b 340 36 341 19 340 27 b 409 105 340 75 363 102 b 441 107 420 107 431 107 b 624 36 510 107 573 86 b 744 -200 688 -27 724 -109 b 747 -230 747 -210 747 -222 b 717 -323 747 -264 736 -292 b 608 -445 688 -370 654 -410 b 307 -541 518 -513 415 -541 l 213 -541 b 39 -521 154 -541 96 -539 b 0 -552 17 -514 0 -531 b 1 -564 0 -556 0 -560 b 17 -611 6 -580 10 -596 b 101 -694 35 -648 50 -684 b 288 -714 164 -707 225 -714 b 402 -706 325 -714 363 -711 z m 1018 92 b 1080 118 1041 91 1068 96 b 1117 219 1099 150 1117 180 b 1113 252 1117 229 1116 240 b 1045 288 1102 297 1068 276 b 1017 262 1028 297 1024 274 b 984 124 989 220 996 170 b 1008 91 979 108 986 91 z m 972 -281 b 1070 -148 1024 -279 1070 -210 b 1025 -105 1070 -105 1045 -112 b 989 -127 1004 -96 998 -114 b 949 -249 963 -164 963 -209 b 969 -281 943 -265 949 -281 z"},unpitchedPercussionClef1:{x_min:0,x_max:379.13761966945304,y_min:-250,y_max:250,ha:500,o:"m 481 -360 b 507 -357 491 -360 500 -360 b 546 -295 541 -346 547 -325 b 536 79 543 -170 540 -46 b 523 311 533 157 534 235 b 475 359 518 340 508 359 b 425 360 459 359 442 360 b 400 359 416 360 409 360 b 337 294 348 353 340 347 l 337 -73 b 336 -264 337 -137 337 -200 b 343 -294 336 -274 338 -284 b 481 -360 359 -330 431 -360 z m 144 -341 b 207 -320 167 -341 189 -331 b 217 -301 215 -315 217 -308 b 210 -262 217 -289 210 -275 b 228 187 212 -112 209 37 b 228 287 228 220 229 253 b 174 353 228 336 222 343 b 120 359 157 357 138 359 b 48 357 96 359 72 356 b 17 323 29 357 19 344 b 7 120 16 255 9 187 b 6 -109 6 43 6 -33 l 6 -204 b 0 -251 6 -220 0 -235 b 3 -269 0 -256 0 -262 b 127 -340 24 -330 79 -328 b 144 -341 132 -341 138 -341 z"},"6stringTabClef":{x_min:0,x_max:438,y_min:-768,y_max:767,ha:1535,o:"m 369 438 b 374 439 370 438 372 438 b 384 462 383 444 384 452 l 384 474 b 390 697 386 547 390 622 b 373 1002 390 799 390 901 l 533 1002 b 560 1001 541 1004 552 1001 b 573 1007 567 1001 572 1002 b 546 1050 579 1025 559 1038 b 536 1056 543 1053 539 1053 b 324 1104 472 1102 397 1104 b 72 1090 238 1104 154 1099 b 55 1093 66 1090 60 1092 b 37 1073 46 1093 37 1089 b 60 1045 37 1061 48 1051 b 203 1001 105 1022 151 1001 b 233 1004 213 1001 223 1002 b 246 1005 238 1004 243 1005 b 272 975 264 1005 272 996 l 272 965 b 258 596 264 842 265 719 b 315 474 253 540 272 504 l 343 455 b 369 438 351 448 357 438 z m 114 -320 b 127 -304 120 -320 124 -315 b 171 -174 141 -261 158 -219 b 222 -135 179 -147 196 -137 b 426 -122 289 -131 359 -128 b 498 -164 462 -120 482 -127 b 628 -301 521 -226 575 -264 b 631 -288 631 -295 631 -291 b 628 -269 631 -281 629 -276 b 569 -134 616 -220 589 -179 b 408 225 514 -14 462 107 b 314 357 384 274 351 318 b 278 380 298 372 288 379 b 251 351 268 380 261 372 b 4 -209 156 171 75 -17 b 0 -228 1 -215 0 -222 b 19 -258 0 -240 7 -249 b 102 -314 45 -279 75 -294 b 114 -320 107 -318 111 -320 z m 425 6 b 360 20 403 17 382 20 b 274 14 331 20 302 14 l 246 14 l 340 206 b 425 6 369 137 395 75 z m 245 -1106 b 281 -1104 256 -1106 269 -1106 b 511 -888 400 -1094 511 -1035 b 454 -688 511 -814 504 -744 b 448 -678 449 -685 448 -681 b 454 -667 448 -675 449 -671 b 504 -497 503 -619 507 -559 b 324 -288 500 -383 436 -308 b 295 -287 314 -287 304 -287 l 282 -287 b 115 -330 223 -287 168 -307 b 94 -366 102 -336 94 -348 l 94 -370 b 96 -435 96 -392 96 -413 b 73 -858 89 -576 71 -717 b 78 -919 73 -878 78 -899 b 72 -950 78 -930 76 -940 b 63 -992 66 -965 63 -978 b 66 -1015 63 -999 65 -1008 b 173 -1104 84 -1106 84 -1106 b 245 -1106 197 -1104 220 -1104 z m 161 -622 b 147 -618 156 -622 151 -621 b 140 -600 141 -612 140 -606 b 144 -564 140 -589 144 -575 b 143 -554 144 -560 144 -557 l 143 -546 b 220 -451 144 -467 143 -465 b 278 -445 239 -446 259 -444 b 418 -497 328 -445 376 -461 b 429 -516 426 -504 429 -510 b 415 -533 429 -521 423 -527 b 219 -608 357 -579 287 -590 b 215 -609 217 -608 216 -609 b 161 -622 197 -609 177 -622 z m 154 -953 b 130 -933 135 -953 130 -948 l 130 -865 l 128 -865 b 135 -788 130 -838 124 -808 b 203 -769 145 -769 180 -776 b 259 -762 223 -765 242 -762 b 441 -852 330 -762 386 -805 b 449 -867 446 -858 449 -863 b 436 -884 449 -874 444 -878 b 318 -942 402 -914 363 -935 b 154 -953 264 -950 209 -953 z"},timeSig0:{x_min:20,x_max:513,y_min:-358.159536277652,y_max:359,ha:717.159536277652,o:"m 341 -516 b 420 -510 367 -516 395 -514 b 675 -338 533 -494 622 -448 b 737 -92 716 -256 734 -171 b 739 -35 739 -73 739 -53 b 680 305 739 86 720 207 b 400 517 622 449 537 517 b 337 514 380 517 359 517 b 289 507 321 511 305 513 b 91 317 192 477 127 412 b 29 9 50 212 29 108 b 217 -458 29 -157 88 -312 b 341 -516 251 -494 291 -518 z m 412 -452 b 359 -425 393 -452 376 -444 b 187 14 242 -301 179 -158 b 268 334 193 127 212 235 b 387 448 295 383 330 428 b 406 452 395 451 400 452 b 428 444 413 452 420 449 b 517 324 471 413 497 372 b 586 -29 560 222 586 86 b 556 -271 586 -112 585 -193 b 468 -422 536 -327 508 -377 b 412 -452 449 -442 431 -452 z"},timeSig1:{x_min:20,x_max:283,y_min:-364,y_max:366,ha:730,o:"m 264 -524 b 357 -510 297 -524 325 -516 b 374 -490 369 -508 374 -501 b 380 -438 376 -472 380 -455 l 406 246 b 408 301 408 265 408 282 b 400 445 408 348 405 396 b 288 527 395 491 338 527 b 253 520 276 527 264 526 b 240 508 249 517 245 513 b 49 409 192 445 127 413 b 29 396 33 408 29 403 b 32 380 29 392 30 386 b 59 363 36 366 49 364 b 164 348 95 356 130 348 b 222 357 183 348 203 351 b 238 361 228 360 233 360 b 252 334 248 361 252 353 b 243 59 252 242 249 150 b 219 -490 229 -124 233 -307 b 264 -524 217 -516 232 -524 z"},timeSig2:{x_min:20,x_max:660.4636303241031,y_min:-378.7201231608281,y_max:382,ha:760.720123160828,o:"m 99 -543 b 130 -533 111 -550 121 -540 b 255 -448 168 -501 213 -475 b 338 -425 282 -431 310 -425 b 392 -431 356 -425 374 -426 b 485 -462 423 -438 454 -451 b 648 -497 540 -482 595 -497 b 834 -441 711 -497 773 -480 b 950 -242 906 -395 958 -334 b 942 -210 950 -230 950 -215 b 912 -220 932 -204 920 -213 b 861 -264 894 -235 877 -248 b 775 -317 835 -289 808 -305 b 675 -334 742 -328 708 -334 b 510 -295 619 -334 563 -318 b 372 -264 465 -278 420 -264 b 305 -272 350 -264 328 -266 b 331 -242 318 -256 324 -249 b 490 -73 386 -187 438 -131 b 675 340 595 43 664 180 b 677 369 677 350 677 360 b 556 536 677 461 638 508 b 468 550 526 546 497 550 b 297 508 409 550 353 533 b 111 354 220 475 168 412 b 29 197 65 308 29 261 b 32 164 29 187 29 176 b 29 140 33 157 29 147 b 43 125 29 132 32 125 b 73 147 55 125 65 138 b 86 163 79 153 82 158 b 238 320 134 219 183 272 b 425 389 292 367 360 389 b 575 341 480 389 531 373 b 606 298 590 330 606 317 b 600 278 606 292 603 285 b 501 107 576 217 544 158 b 304 -104 439 33 372 -35 b 111 -356 230 -180 167 -265 b 84 -446 92 -386 84 -415 b 86 -481 84 -458 85 -469 b 88 -514 88 -491 88 -503 b 99 -543 89 -526 91 -537 z"},timeSig3:{x_min:19.824321427094187,x_max:540,y_min:-392,y_max:392,ha:784,o:"m 216 -540 b 354 -564 264 -556 310 -564 b 605 -465 445 -564 530 -530 b 729 -161 697 -383 729 -275 b 724 -82 729 -135 727 -108 b 589 95 716 -1 670 62 b 523 114 567 102 546 108 b 750 418 606 213 677 315 b 778 503 769 444 778 472 b 773 540 778 514 776 527 b 750 564 769 557 762 564 b 736 562 746 564 742 563 b 641 552 704 553 672 552 b 402 554 562 552 481 554 l 346 554 b 84 546 258 554 170 554 b 36 501 55 543 40 531 b 29 412 30 472 32 442 b 52 384 27 393 32 384 l 56 384 b 210 392 107 389 158 392 l 602 392 b 354 108 523 285 445 192 b 246 -65 300 58 246 12 b 252 -108 246 -78 248 -92 l 252 -111 b 264 -141 251 -122 251 -135 b 291 -132 274 -145 284 -140 b 425 -72 328 -95 377 -84 b 475 -65 442 -68 459 -65 b 592 -108 517 -65 557 -79 b 645 -179 615 -125 645 -147 b 642 -194 645 -184 644 -189 b 485 -376 616 -278 569 -344 b 361 -399 444 -392 402 -399 b 151 -340 289 -399 219 -376 b 88 -275 122 -323 98 -310 b 71 -249 86 -268 85 -249 b 63 -251 68 -249 66 -249 b 36 -288 48 -255 36 -266 b 55 -423 33 -336 45 -377 b 101 -482 60 -448 78 -468 b 216 -540 138 -504 174 -526 z"},timeSig4:{x_min:20,x_max:633.0785282750762,y_min:-489.59088556716864,y_max:491.18559127100053,ha:980.7764768381692,o:"m 608 -704 b 641 -684 622 -708 634 -696 b 667 -602 660 -660 662 -631 b 685 -190 683 -465 680 -327 l 685 -176 b 831 -127 736 -166 783 -148 b 912 0 901 -94 913 -76 b 886 53 912 36 904 52 b 848 40 877 53 864 49 l 838 36 b 687 -13 789 14 739 -3 b 681 177 687 50 684 114 b 672 338 678 230 677 285 b 654 373 671 350 672 373 b 622 340 636 373 624 361 b 615 262 621 314 613 288 b 619 -22 616 167 619 72 b 569 -22 602 -23 585 -23 b 305 -3 481 -16 395 -1 b 210 -9 274 -3 242 -4 b 301 163 242 52 268 108 b 513 552 377 288 459 412 b 536 652 526 585 536 618 b 533 683 536 662 534 672 b 520 707 531 691 531 707 b 487 693 508 708 494 704 b 474 668 482 684 477 677 b 384 490 454 603 418 547 b 253 281 343 419 295 351 b 73 -13 194 181 145 78 b 29 -108 50 -42 29 -72 b 37 -147 29 -121 32 -134 b 50 -186 43 -160 50 -173 b 68 -216 52 -207 56 -215 b 92 -207 73 -216 82 -213 b 288 -166 156 -180 220 -166 b 556 -186 377 -166 467 -180 b 586 -189 566 -187 576 -187 b 616 -186 596 -189 606 -189 b 606 -432 613 -268 612 -350 b 596 -625 603 -495 596 -559 b 598 -670 596 -641 596 -655 b 608 -704 598 -683 596 -700 z"},timeSig5:{x_min:19.663871085403297,x_max:583,y_min:-389,y_max:389,ha:778,o:"m 132 -536 b 249 -560 168 -553 209 -559 b 507 -462 351 -560 454 -514 b 677 -183 588 -384 642 -289 b 694 -85 688 -150 694 -117 b 540 138 694 12 642 94 b 422 173 501 154 462 167 b 400 187 408 174 400 177 b 405 202 400 190 402 196 b 428 284 416 228 426 255 b 469 312 431 307 442 312 b 757 372 569 312 662 343 b 840 490 821 392 840 432 b 812 560 840 540 834 560 b 763 546 801 560 785 556 b 757 543 762 546 759 544 b 465 484 665 505 570 484 b 396 484 452 484 425 487 b 353 454 377 482 366 474 b 281 300 323 405 304 351 b 245 164 262 255 245 212 b 246 144 245 158 246 151 b 233 63 249 115 243 89 b 225 35 228 50 225 40 b 264 14 225 22 236 19 b 445 -26 325 7 387 0 b 569 -151 501 -52 547 -89 b 575 -180 573 -161 575 -170 b 527 -275 575 -217 547 -245 b 347 -367 484 -334 419 -367 b 261 -351 318 -367 289 -363 b 95 -300 206 -333 154 -307 b 55 -321 73 -297 65 -302 b 29 -468 29 -367 40 -419 b 56 -505 26 -482 36 -500 b 132 -536 82 -514 108 -524 z"},timeSig6:{x_min:20,x_max:565,y_min:-363,y_max:363,ha:726,o:"m 390 -518 b 621 -458 469 -507 549 -494 b 814 -134 753 -390 814 -281 b 652 59 814 -16 750 58 b 580 48 629 59 606 55 b 233 -334 392 -9 276 -138 b 115 -228 181 -314 143 -278 b 98 -160 104 -206 98 -183 b 107 -109 98 -144 101 -127 b 167 37 124 -59 145 -12 b 508 340 236 189 347 292 b 575 353 530 347 553 353 b 648 327 600 353 625 346 b 665 320 654 321 661 320 b 687 336 674 320 681 325 b 703 405 697 359 703 382 b 684 472 703 429 697 451 b 593 523 664 504 631 521 b 576 521 588 523 582 523 b 297 403 472 508 380 465 b 115 177 217 344 164 264 b 29 -121 60 82 29 -17 b 53 -278 29 -173 36 -225 b 226 -497 82 -374 131 -454 b 347 -523 265 -514 305 -523 b 390 -518 361 -523 376 -521 z m 351 -357 b 312 -351 337 -356 320 -363 b 325 -315 304 -340 320 -327 b 543 -120 373 -222 448 -158 b 622 -104 570 -108 596 -102 b 717 -132 655 -104 687 -112 b 740 -167 732 -143 740 -153 b 730 -196 740 -176 737 -184 b 563 -321 690 -258 634 -300 b 359 -357 497 -341 428 -354 z"},timeSig7:{x_min:20.3617407597707,x_max:592,y_min:-345,y_max:345,ha:690,o:"m 253 -497 b 318 -485 276 -497 297 -487 b 366 -441 348 -482 360 -468 b 487 -104 390 -323 433 -210 b 835 403 580 82 701 246 b 852 436 847 416 852 428 b 815 467 852 451 840 461 b 762 474 798 471 779 474 b 674 445 732 474 701 465 b 603 410 652 431 628 420 b 383 360 533 379 459 360 b 200 435 315 360 249 382 b 88 494 168 469 131 485 b 66 497 81 495 73 497 b 33 484 52 497 39 492 b 50 436 22 469 39 451 b 295 310 114 360 199 324 b 406 301 331 304 369 301 b 593 324 468 301 530 308 b 585 307 589 314 588 310 b 265 -249 451 137 338 -46 b 207 -442 242 -312 223 -377 b 204 -462 206 -449 204 -456 b 253 -497 204 -487 220 -497 z"},timeSig8:{x_min:20,x_max:504.15101530718516,y_min:-428,y_max:428,ha:856,o:"m 265 -616 b 289 -615 274 -616 281 -616 b 710 -271 492 -592 657 -485 b 726 -148 721 -229 727 -187 b 585 108 726 -48 687 42 b 572 127 576 114 573 120 b 576 144 572 132 575 138 b 598 301 590 196 598 249 b 586 413 598 338 593 376 b 356 616 559 531 467 616 b 233 582 317 616 275 606 b 29 233 101 505 29 384 b 104 9 29 153 46 72 b 189 -48 127 -16 160 -27 b 92 -158 141 -73 114 -114 b 37 -343 63 -217 50 -279 b 33 -390 35 -359 33 -374 b 265 -616 33 -524 148 -616 z m 258 105 b 124 148 215 105 167 117 b 96 196 105 163 96 177 b 99 217 96 202 96 209 b 197 384 120 281 151 337 b 350 451 242 429 297 451 b 516 364 412 451 472 422 b 530 331 523 354 530 343 l 530 327 l 530 320 b 468 151 520 261 507 200 b 419 122 455 135 442 125 b 258 105 370 117 320 105 z m 328 -438 b 158 -276 233 -436 160 -359 b 166 -239 158 -264 161 -252 b 230 -157 176 -203 202 -179 b 367 -72 274 -125 320 -98 b 448 -49 396 -56 423 -49 b 562 -118 491 -49 528 -72 b 611 -251 590 -157 611 -199 b 569 -341 611 -288 595 -318 b 328 -438 500 -402 416 -432 z"},timeSig9:{x_min:20,x_max:494,y_min:-421,y_max:421,ha:842,o:"m 235 -606 b 361 -564 275 -606 318 -593 b 619 -229 487 -482 566 -366 b 706 127 664 -114 694 4 b 711 233 708 163 711 197 b 700 346 711 271 708 308 b 389 606 658 517 530 606 b 351 605 376 606 364 606 b 56 272 171 586 56 441 b 96 98 56 216 69 156 b 334 -53 144 -3 238 -53 b 544 36 408 -53 484 -24 b 652 176 586 78 622 124 b 631 71 645 141 639 105 b 467 -302 599 -63 562 -196 b 271 -442 412 -364 354 -422 b 225 -448 255 -446 239 -448 b 95 -305 148 -448 98 -395 b 89 -255 95 -288 94 -271 b 73 -233 86 -246 85 -233 b 52 -248 65 -233 56 -239 b 29 -317 42 -271 30 -291 b 49 -448 29 -361 40 -405 b 235 -606 69 -541 144 -606 z m 340 104 b 144 209 264 108 194 141 b 127 258 132 225 127 240 b 137 297 127 271 130 284 b 366 449 184 396 269 449 b 517 408 415 449 467 436 b 595 348 546 392 572 372 b 616 305 608 336 616 321 b 609 281 616 298 613 289 b 340 104 557 184 477 104 z"},timeSigCommon:{x_min:20,x_max:585,y_min:-298,y_max:294.49658092772603,ha:592.496580927726,o:"m 444 -405 b 829 -45 626 -346 740 -207 b 842 26 842 -23 842 1 b 821 58 842 39 841 58 b 795 40 811 58 802 48 b 765 3 785 29 773 16 b 469 -223 690 -104 596 -183 b 354 -242 431 -235 392 -242 b 180 -177 292 -242 235 -223 b 135 -99 154 -157 140 -131 b 132 -59 134 -85 132 -72 b 141 7 132 -37 135 -16 b 449 274 189 160 297 243 b 477 278 459 276 468 276 b 546 203 517 278 539 253 b 517 157 550 177 533 166 b 485 143 507 153 497 143 l 482 143 b 467 148 478 143 472 144 b 374 183 438 170 406 181 b 264 118 333 183 292 161 b 238 48 246 92 238 69 b 261 -9 238 29 245 10 b 383 -73 287 -39 337 -73 b 412 -68 392 -73 402 -72 b 631 164 526 -27 586 59 b 649 252 644 193 649 222 b 636 328 649 278 645 304 b 504 423 615 400 579 429 b 242 318 408 415 317 387 b 29 -158 104 190 29 33 b 30 -176 29 -164 29 -170 b 115 -364 42 -246 52 -315 b 307 -429 177 -410 240 -429 b 444 -405 351 -429 397 -420 z"},timeSigCutCommon:{x_min:20,x_max:695,y_min:-687.0379164869064,y_max:687,ha:1374.0379164869064,o:"m 564 -989 b 595 -945 585 -991 589 -963 l 599 -922 b 605 -628 600 -824 603 -726 l 609 -399 b 878 -251 706 -363 798 -320 b 996 -85 932 -204 976 -153 b 1001 -63 998 -78 1001 -71 b 989 -46 1001 -56 998 -49 b 978 -43 985 -45 982 -43 b 950 -59 968 -43 959 -49 b 733 -216 894 -132 815 -177 b 611 -259 694 -235 652 -249 b 616 -20 612 -179 615 -99 b 680 29 642 -7 665 9 b 698 43 685 36 690 40 b 870 251 792 82 840 160 b 877 294 874 265 877 279 b 818 410 877 338 855 382 b 683 458 779 442 730 448 b 625 468 664 462 644 465 l 625 514 b 638 958 626 662 636 811 b 626 989 638 979 635 989 b 603 981 621 989 613 986 b 422 840 534 945 481 888 b 412 805 412 832 413 818 b 426 713 410 773 420 743 b 445 678 429 690 435 678 b 474 691 452 678 461 683 b 563 755 503 710 530 732 b 564 724 564 740 564 733 b 559 469 563 639 560 554 b 462 454 526 469 494 464 b 112 143 302 399 199 281 b 33 -94 66 71 45 -10 b 29 -148 30 -112 29 -131 b 105 -351 29 -223 52 -291 b 359 -455 171 -426 258 -451 b 517 -431 409 -451 464 -446 l 539 -422 l 539 -477 b 533 -739 536 -563 539 -651 b 530 -824 531 -768 530 -795 b 546 -948 530 -865 533 -907 b 564 -989 552 -962 543 -989 z m 410 -288 b 193 -197 328 -288 253 -264 b 141 -60 160 -161 141 -108 b 157 6 141 -35 147 -12 b 259 158 189 58 217 112 b 438 291 311 215 364 266 b 528 305 468 301 498 305 b 554 304 537 305 546 304 b 553 212 554 274 554 242 b 426 115 498 199 446 164 b 416 68 419 99 416 84 b 425 12 416 49 420 30 b 474 -39 432 -17 448 -32 b 513 -43 487 -42 498 -43 b 547 -40 524 -43 536 -42 l 543 -272 b 461 -285 516 -278 488 -281 b 410 -288 444 -287 426 -288 z m 694 197 b 668 203 685 197 677 199 b 621 216 654 210 638 215 b 622 294 622 242 622 268 b 706 268 651 287 678 278 b 746 235 721 261 734 249 b 752 222 749 230 752 226 b 743 213 752 219 749 215 b 694 197 727 206 711 197 z"},timeSigPlus:{x_min:0,x_max:661,y_min:-358,y_max:358,ha:716,o:"m 605 -516 b 629 -490 624 -516 629 -507 b 628 -475 629 -485 628 -481 b 613 -131 624 -405 616 -174 b 612 -96 612 -114 612 -96 l 647 -98 b 897 -115 730 -99 814 -109 b 940 -89 919 -117 935 -109 b 952 -24 946 -69 952 -46 b 948 9 952 -14 950 -3 b 912 39 942 26 933 37 b 609 60 822 48 609 60 b 616 392 609 60 608 291 b 567 488 619 436 605 467 b 511 516 550 498 531 514 b 498 511 507 516 503 514 b 478 446 475 501 480 469 b 467 150 474 348 469 249 b 465 59 465 121 465 59 l 372 49 b 73 14 272 36 173 24 b 49 13 65 13 56 13 b 0 -33 9 13 0 6 b 60 -141 0 -117 6 -140 b 112 -135 73 -141 91 -140 b 413 -102 213 -125 314 -112 b 464 -98 441 -99 464 -98 l 464 -145 b 477 -456 464 -249 468 -353 b 526 -510 478 -488 491 -507 b 589 -513 546 -511 569 -510 b 605 -516 595 -514 600 -516 z"},timeSigPlusSmall:{x_min:0,x_max:418,y_min:-197,y_max:199,ha:396,o:"m 301 -284 b 330 -238 320 -284 324 -255 b 348 -46 350 -176 341 -111 b 374 -20 351 -27 356 -23 b 481 -17 409 -16 445 -17 b 566 -9 510 -17 537 -16 b 602 3 579 -7 602 -16 b 566 29 602 19 582 24 b 526 33 553 32 539 33 b 384 39 478 36 432 39 b 356 62 363 39 356 42 l 356 68 b 359 177 359 104 359 141 l 359 251 b 341 287 359 264 361 285 b 311 255 324 287 314 272 b 310 228 311 246 310 236 l 301 69 b 275 39 301 49 295 39 l 271 39 b 210 40 251 40 230 40 b 167 39 196 40 181 40 b 89 40 141 37 115 40 b 24 30 68 40 46 37 b 0 17 17 27 0 30 l 0 13 b 27 -17 3 0 7 -13 b 91 -22 49 -22 71 -22 b 153 -22 115 -22 137 -20 l 275 -22 b 295 -40 289 -22 295 -27 l 295 -48 b 288 -235 288 -109 287 -171 b 287 -264 288 -243 287 -253 b 301 -284 287 -275 289 -284 z"},timeSigMinus:{x_min:0,x_max:662,y_min:-54,y_max:55,ha:109,o:"m 39 -78 b 49 -76 42 -78 45 -76 b 452 -75 94 -75 272 -75 b 861 -76 632 -75 814 -76 b 953 -20 927 -79 953 -66 b 948 27 953 -7 950 9 b 946 37 948 30 948 35 b 896 79 940 63 929 79 b 471 78 827 78 648 78 l 42 78 b 0 37 14 78 0 69 b 23 -66 0 0 17 -32 b 39 -78 24 -75 32 -76 z"},timeSigParensRight:{x_min:0,x_max:274.26483738379414,y_min:-722.6326530612245,y_max:725,ha:1447.6326530612246,o:"m 37 -1038 b 69 -1031 48 -1044 59 -1038 b 88 -1015 76 -1027 82 -1021 b 164 -886 120 -976 147 -933 b 333 -351 233 -711 292 -534 b 395 118 366 -204 399 -59 b 389 245 392 144 392 194 b 120 996 369 521 265 766 b 68 1044 99 1030 84 1044 b 19 988 50 1044 36 1024 b 0 922 7 965 0 945 b 20 858 0 901 6 881 b 259 215 141 660 236 449 b 271 -1 266 143 271 71 b 252 -239 271 -82 265 -161 b 148 -667 228 -384 183 -524 b 39 -1009 120 -785 66 -893 b 33 -1031 37 -1017 33 -1024 b 37 -1038 33 -1034 35 -1037 z"},timeSigParensRightSmall:{x_min:0,x_max:154.4025307335204,y_min:-422,y_max:422,ha:844,o:"m 43 -608 b 60 -598 48 -608 53 -605 b 117 -511 82 -572 102 -543 b 222 23 193 -350 219 -177 b 213 166 225 55 216 109 b 115 531 206 294 174 416 b 45 603 99 562 76 588 b 30 608 39 606 35 608 b 10 598 23 608 17 603 b 0 546 3 590 0 570 b 23 451 0 507 9 458 b 102 351 66 429 84 390 b 167 42 150 252 167 148 b 163 -49 167 12 166 -19 b 35 -449 151 -192 121 -330 b 14 -504 22 -467 14 -485 b 17 -527 14 -511 16 -520 l 30 -590 b 43 -608 33 -603 37 -608 z"},timeSigParensLeft:{x_min:.5555555555555556,x_max:399.6216117372966,y_min:-728,y_max:728,ha:1456,o:"m 562 -1048 b 573 -1043 566 -1048 570 -1047 b 553 -988 582 -1025 564 -1004 b 472 -884 527 -952 497 -920 b 210 -354 366 -717 275 -541 b 148 -6 170 -240 148 -124 b 160 148 148 45 153 96 b 315 678 189 331 242 508 b 431 901 350 755 380 834 b 459 950 451 926 461 939 b 435 995 459 962 451 972 b 364 1048 405 1034 383 1048 b 305 996 343 1048 325 1028 b 127 624 226 881 174 753 b 1 30 56 432 9 235 b 1 -32 1 9 0 -12 b 180 -629 13 -245 92 -438 b 363 -936 230 -739 298 -835 b 526 -1041 402 -995 448 -1041 b 562 -1048 537 -1040 552 -1048 z"},timeSigParensLeftSmall:{x_min:0,x_max:173.45497224367904,y_min:-405,y_max:404,ha:809,o:"m 197 -583 b 222 -553 212 -582 219 -566 b 229 -497 226 -534 229 -516 b 213 -425 229 -472 225 -448 b 102 -177 173 -344 132 -262 b 62 30 78 -111 58 -42 b 91 183 66 82 75 134 b 215 426 118 271 156 356 b 249 552 246 465 252 505 b 230 582 249 563 246 582 b 197 563 219 582 206 576 b 71 356 144 500 105 429 b 0 50 26 259 3 158 b 13 -112 4 -3 7 -58 b 176 -559 29 -275 105 -416 b 196 -583 180 -569 186 -583 z"},noteheadDoubleWhole:{x_min:-.4444444444444444,x_max:614.1875,y_min:-223.03296670127517,y_max:223,ha:446.0329667012752,o:"m 35 -321 b 62 -266 58 -318 58 -288 l 62 -194 b 63 50 62 -114 63 -32 b 60 189 63 96 63 143 b 43 300 59 226 60 265 b 29 321 40 308 39 321 l 26 321 b 0 292 13 318 0 310 b 0 248 0 278 -1 262 b 6 147 4 215 6 181 b 4 48 6 114 4 81 b 6 0 4 32 6 16 b 7 -36 7 -12 7 -24 l 7 -52 b 6 -156 7 -86 6 -121 b 19 -275 6 -196 9 -236 b 35 -321 23 -291 16 -323 z m 847 -314 b 871 -288 860 -315 867 -300 b 884 -187 881 -255 886 -222 b 876 115 878 -86 876 14 b 877 255 876 161 876 209 b 868 291 877 268 873 279 b 855 304 867 301 863 304 b 844 301 852 304 848 304 b 822 265 825 292 822 278 b 824 251 822 259 822 255 b 822 170 822 225 822 197 l 822 -20 b 835 -284 827 -86 825 -186 b 847 -314 837 -295 835 -311 z m 757 -291 b 793 -171 796 -255 792 -212 b 795 -49 795 -131 795 -91 b 786 207 795 36 791 121 b 779 240 786 217 783 229 b 766 258 776 246 776 258 b 762 256 765 258 763 256 b 739 236 752 253 740 252 b 733 177 737 216 732 197 b 737 20 737 125 739 73 l 737 -107 b 740 -202 737 -138 739 -170 b 757 -291 740 -230 743 -261 z m 128 -261 b 144 -251 135 -264 141 -256 b 158 -203 156 -236 157 -220 b 161 -137 161 -181 161 -158 b 157 30 161 -81 157 -26 b 158 76 157 45 157 60 l 158 101 b 156 225 158 141 158 183 b 137 253 156 235 154 253 l 134 253 b 109 222 120 251 109 242 b 104 91 108 179 104 134 b 108 -58 104 42 109 -9 b 107 -105 108 -73 108 -89 b 105 -127 107 -112 107 -120 b 118 -245 105 -167 114 -204 b 128 -261 118 -252 121 -259 z m 488 -242 b 693 -79 595 -249 685 -166 l 693 -55 b 690 0 693 -36 691 -17 b 540 187 684 84 621 164 b 449 200 508 196 480 200 b 210 104 363 200 282 163 b 186 56 196 92 186 76 b 207 -82 186 9 192 -37 b 300 -204 225 -132 248 -181 b 488 -242 356 -229 415 -240 z m 490 -88 b 449 -86 477 -88 464 -88 b 287 -56 399 -85 341 -78 b 258 -33 275 -52 258 -48 b 282 -7 258 -20 272 -13 b 458 43 340 23 399 43 b 580 14 497 43 537 35 b 618 -20 606 1 619 -9 b 592 -58 618 -30 609 -42 b 490 -88 562 -82 528 -88 z"},noteheadWhole:{x_min:0,x_max:380.16649762501584,y_min:-186.17102907059297,y_max:165,ha:351.17102907059297,o:"m 547 40 b 223 -268 543 -151 367 -259 b 102 -233 180 -271 143 -248 l 62 -216 b 0 -127 22 -197 0 -166 b 6 -91 0 -115 1 -104 b 122 141 33 -9 69 71 b 327 238 170 204 249 238 b 514 158 397 238 467 212 b 547 40 544 125 549 84 z m 248 -107 b 384 -63 295 -102 341 -88 b 426 -23 402 -53 415 -40 b 435 3 432 -14 435 -6 b 413 32 435 14 428 24 b 301 73 376 49 343 73 b 272 69 291 73 282 72 b 121 -35 207 53 157 20 b 111 -58 117 -42 111 -50 b 125 -75 111 -65 115 -71 b 248 -107 164 -89 202 -107 z"},noteheadHalf:{x_min:0,x_max:334,y_min:-174,y_max:175,ha:349,o:"m 480 56 b 167 -251 478 -115 331 -251 b 94 -242 143 -251 118 -248 b 9 -141 43 -229 20 -192 b 0 -68 3 -115 0 -91 b 284 249 0 95 127 200 b 304 252 289 251 297 252 b 481 78 374 252 481 170 b 480 56 481 71 481 63 z m 213 -102 b 399 6 274 -81 341 -48 b 402 17 400 7 402 13 b 399 27 402 22 400 26 b 311 94 373 53 353 88 b 292 95 305 95 300 95 b 130 27 230 95 181 55 b 69 -62 98 9 62 -29 b 161 -98 76 -98 128 -91 b 213 -102 174 -101 186 -101 z"},noteheadBlack:{x_min:0,x_max:334.04644433966797,y_min:-164,y_max:164,ha:328,o:"m 112 -233 b 141 -236 122 -235 131 -236 b 481 104 279 -236 485 -48 b 403 222 477 141 478 192 b 334 236 382 232 359 236 b 1 -59 180 236 13 59 b 0 -85 1 -68 0 -76 b 112 -233 0 -157 32 -215 z"},noteheadXWhole:{x_min:0,x_max:506,y_min:-143.0823320899293,y_max:144,ha:287.0823320899293,o:"m 53 -206 b 219 -163 117 -207 170 -196 b 314 -102 249 -141 282 -122 b 377 -63 334 -89 356 -76 b 514 -161 422 -96 468 -128 b 576 -196 534 -174 552 -196 b 589 -193 580 -196 585 -196 b 688 -174 625 -194 657 -181 b 711 -158 698 -171 711 -173 b 696 -143 711 -151 701 -147 b 503 -9 632 -98 567 -52 l 485 4 b 704 145 559 49 634 95 b 729 164 711 150 729 151 l 729 168 b 696 196 726 183 710 193 b 621 207 671 202 645 207 b 528 177 589 207 557 200 b 373 76 480 140 426 108 b 246 164 330 104 287 132 b 122 206 207 193 167 203 b 66 192 102 207 72 207 b 99 147 58 173 85 158 b 274 14 157 102 215 58 b 16 -164 184 -42 96 -98 b 0 -179 12 -168 0 -170 b 1 -183 0 -180 0 -183 b 26 -204 6 -193 12 -204 b 53 -206 37 -206 49 -206 z m 611 -177 b 376 -9 530 -118 452 -63 l 164 -143 b 104 -164 147 -154 130 -164 b 82 -161 96 -164 89 -164 b 230 -65 137 -125 183 -95 l 347 12 b 327 26 341 16 334 22 l 196 121 b 163 147 184 128 173 137 b 140 173 154 154 140 163 b 143 180 140 176 141 177 b 179 166 154 194 167 174 l 372 27 l 566 153 b 613 171 580 161 596 170 b 635 160 624 171 635 174 b 621 147 635 153 626 150 l 429 24 b 400 6 419 19 409 13 b 569 -117 456 -35 513 -75 b 611 -177 588 -130 608 -143 z"},noteheadXHalf:{x_min:0,x_max:421,y_min:-145.51844828189743,y_max:151,ha:296.51844828189746,o:"m 490 -209 b 539 -207 505 -207 521 -207 b 606 -209 560 -207 583 -209 b 598 -196 602 -203 600 -199 l 406 -19 l 540 130 b 547 144 546 135 547 140 b 536 156 547 148 543 153 b 488 192 518 166 503 176 b 416 217 471 209 444 217 b 323 180 380 217 344 204 l 264 115 b 239 138 256 122 248 131 b 33 197 180 196 108 200 b 3 186 23 197 6 193 b 19 154 -1 174 10 163 b 171 12 69 107 120 59 b 19 -157 120 -45 69 -101 b 0 -177 14 -163 0 -166 b 1 -181 0 -179 0 -180 b 39 -203 9 -197 22 -203 l 186 -203 b 197 -202 190 -202 193 -200 l 213 -202 b 262 -180 228 -202 246 -199 l 314 -122 b 490 -209 363 -170 412 -216 z m 435 -148 b 291 -30 379 -112 337 -69 l 213 -118 b 190 -137 207 -125 202 -137 b 145 -111 173 -130 154 -127 b 160 -79 137 -98 151 -88 b 238 16 184 -48 212 -16 b 141 99 204 43 173 72 l 124 117 b 115 132 121 121 115 127 b 118 137 115 134 117 137 b 141 132 127 147 135 138 l 253 36 b 347 150 285 75 315 112 b 370 164 354 160 363 163 b 403 145 382 164 393 156 b 416 127 412 140 416 132 b 405 102 416 118 412 111 l 307 -10 b 413 -105 343 -42 379 -73 b 435 -148 425 -115 436 -125 z"},noteheadXBlack:{x_min:0,x_max:289,y_min:-156,y_max:157,ha:313,o:"m 23 -225 b 69 -204 40 -223 56 -219 b 137 -131 92 -180 115 -157 l 209 -50 b 377 -197 264 -101 321 -148 b 403 -210 384 -203 393 -210 l 408 -210 b 416 -192 416 -207 416 -199 l 416 -186 b 403 -148 416 -171 413 -158 b 344 -81 384 -125 367 -101 b 252 -1 312 -55 282 -29 b 377 157 297 49 340 101 b 402 202 387 170 402 187 b 395 217 402 207 400 213 b 376 226 389 223 382 226 b 334 192 360 226 346 204 b 206 42 289 143 248 94 b 96 161 167 81 131 120 b 60 193 86 174 76 189 b 33 206 52 196 42 206 b 22 199 29 206 26 204 b 10 173 14 190 10 181 b 22 147 10 166 14 157 b 148 7 62 98 104 52 b 164 -7 154 1 158 -3 b 10 -189 111 -66 55 -122 b 0 -212 6 -197 0 -203 b 1 -217 0 -213 0 -216 b 23 -225 4 -226 14 -222 z"},noteheadCircleX:{x_min:0,x_max:344,y_min:-179,y_max:175.12551922594866,ha:354.12551922594866,o:"m 99 -210 b 236 -258 137 -242 186 -258 b 418 -183 305 -258 374 -230 b 495 33 475 -120 495 -48 b 494 66 495 45 494 55 b 302 252 487 183 405 256 b 181 243 262 249 222 248 b 46 171 128 236 79 219 b 0 19 14 127 0 73 b 99 -210 0 -68 35 -156 z m 245 42 l 124 156 b 200 176 145 166 170 173 b 337 183 245 181 291 184 b 377 176 351 183 364 180 b 245 42 333 131 288 86 z m 392 -99 l 285 3 l 400 121 b 418 154 409 131 418 140 b 465 50 448 130 465 94 b 405 -112 462 -17 439 -73 z m 89 -120 b 48 0 56 -82 48 -42 b 89 112 48 35 59 76 b 109 101 96 111 102 108 l 210 7 l 187 -17 b 89 -120 151 -53 125 -82 z m 176 -183 b 127 -163 158 -179 141 -171 l 252 -32 l 372 -144 b 233 -189 334 -173 285 -189 b 176 -183 215 -189 196 -187 z"},noteheadTriangleUpWhole:{x_min:0,x_max:366,y_min:-145,y_max:138,ha:283,o:"m 504 -209 b 527 -199 520 -209 527 -206 b 520 -180 527 -193 524 -187 b 459 -94 501 -151 480 -122 b 279 170 400 -6 341 82 b 242 199 266 190 253 199 b 206 167 230 199 219 189 b 10 -145 140 63 76 -42 b 0 -171 3 -156 0 -164 b 23 -200 0 -183 9 -192 b 55 -209 33 -206 45 -209 z m 202 -161 b 176 -137 183 -163 176 -156 b 187 -62 176 -111 179 -86 b 253 95 206 -10 228 42 b 337 -132 307 24 334 -49 b 311 -161 338 -153 334 -161 b 256 -160 294 -161 275 -160 b 202 -161 238 -160 220 -161 z"},noteheadTriangleUpHalf:{x_min:0,x_max:341.0833130378007,y_min:-159,y_max:159,ha:318,o:"m 458 -226 b 478 -229 462 -223 469 -229 b 490 -222 482 -229 487 -228 b 477 -184 495 -207 484 -196 b 281 176 410 -65 346 56 b 238 225 269 194 261 213 b 225 229 232 226 228 228 b 209 215 217 229 213 225 b 4 -153 141 92 73 -30 b 0 -170 1 -158 0 -164 b 12 -189 0 -177 4 -183 b 66 -215 27 -202 43 -213 b 458 -226 194 -217 323 -222 z m 151 -167 b 298 75 204 -89 240 -1 b 301 82 300 76 301 79 l 357 -22 b 344 -43 353 -27 350 -37 b 285 -163 317 -79 312 -127 b 278 -170 282 -166 279 -167 z"},noteheadTriangleUpBlack:{x_min:0,x_max:346,y_min:-149,y_max:149,ha:298,o:"m 481 -215 b 498 -209 487 -215 492 -215 b 482 -173 498 -194 488 -184 l 284 173 b 259 202 278 184 269 194 b 229 215 248 210 238 215 b 196 189 216 215 206 206 l 13 -150 b 3 -168 9 -156 6 -163 b 0 -180 1 -173 0 -177 b 12 -197 0 -187 4 -193 b 63 -213 29 -206 45 -213 b 481 -215 203 -213 343 -215 z"},noteheadDiamondWhole:{x_min:0,x_max:271,y_min:-132,y_max:132,ha:264,o:"m 230 -177 b 256 -190 240 -186 249 -190 b 281 -173 265 -190 272 -184 b 382 -29 314 -124 347 -76 b 390 -10 387 -22 390 -14 b 376 12 390 -3 386 4 b 173 177 308 66 240 121 b 144 190 166 183 160 190 b 98 153 127 186 112 170 b 13 40 69 115 42 76 b 0 13 4 29 0 20 b 22 -19 0 3 7 -9 b 230 -177 92 -69 163 -122 z m 279 -128 b 261 -122 274 -134 266 -127 l 66 30 b 56 45 59 35 56 39 b 62 56 56 48 59 52 b 122 122 91 101 105 122 b 194 76 138 122 158 107 l 320 -26 b 336 -50 325 -32 336 -35 b 279 -128 318 -75 300 -102 z"},noteheadDiamondHalf:{x_min:0,x_max:295,y_min:-148,y_max:148,ha:296,o:"m 228 -207 b 245 -213 235 -210 240 -213 b 264 -203 252 -213 258 -210 b 415 -46 314 -150 364 -98 b 425 -27 420 -40 425 -35 b 416 -10 425 -22 422 -16 b 217 200 350 60 284 131 b 194 213 212 207 204 213 b 170 196 181 213 177 203 b 14 33 118 143 68 86 b 0 7 4 23 0 16 b 17 -20 0 -1 6 -10 b 118 -114 52 -50 82 -85 b 228 -207 156 -144 184 -184 z m 209 -157 b 134 -69 177 -138 141 -115 b 130 -26 131 -55 130 -40 b 215 148 130 42 160 99 b 225 156 217 151 220 156 b 230 153 226 156 228 156 b 323 -26 276 104 321 55 b 298 -75 324 -42 315 -59 b 265 -109 287 -86 276 -99 b 209 -157 245 -125 228 -167 z"},noteheadDiamondBlack:{x_min:0,x_max:310,y_min:-146,y_max:146,ha:292,o:"m 266 -210 b 289 -194 278 -209 284 -200 b 406 -76 330 -156 367 -115 b 446 -23 433 -49 446 -36 b 412 29 446 -10 435 3 b 405 36 409 30 408 33 b 252 196 354 89 304 143 b 225 210 243 204 235 210 b 204 202 219 210 212 209 b 10 24 141 141 75 82 b 0 9 4 19 0 14 b 9 -6 0 4 3 0 l 232 -192 b 266 -210 242 -200 256 -204 z"},noteheadSquareWhite:{x_min:0,x_max:350,y_min:-131,y_max:131,ha:262,o:"m 468 -189 b 485 -187 474 -189 480 -189 b 500 -176 495 -187 500 -183 b 498 -168 500 -174 498 -171 b 497 -166 498 -167 497 -167 l 498 -164 b 504 -154 503 -163 504 -158 b 503 -138 504 -150 503 -144 l 503 -135 l 503 -94 b 492 66 500 -45 494 10 b 488 135 492 89 488 112 b 484 150 488 141 485 145 b 482 154 482 151 482 153 b 429 189 472 177 456 189 b 53 184 304 186 179 186 l 39 184 b 33 181 36 183 35 183 b 12 160 20 181 12 177 b 0 -109 9 71 4 -19 b 19 -137 0 -125 7 -134 b 23 -151 19 -141 20 -145 b 85 -187 37 -173 55 -187 b 468 -189 212 -187 340 -187 z m 246 -125 l 63 -125 b 66 -111 65 -122 66 -117 b 73 72 69 -50 71 10 l 73 130 b 88 128 78 128 82 128 b 148 130 108 130 128 130 b 271 128 190 130 230 128 l 271 130 l 420 130 b 428 20 425 92 425 56 l 436 -127 l 246 -127 z"},noteheadSquareBlack:{x_min:0,x_max:342,y_min:-129.98961937716263,y_max:132.44444444444446,ha:262.4340638216071,o:"m 217 190 b 439 186 304 190 372 190 b 467 180 448 184 458 183 b 492 145 484 176 492 167 b 490 -124 490 56 490 -33 b 488 -141 490 -130 488 -135 b 456 -170 488 -163 478 -168 b 118 -183 344 -176 230 -181 b 29 -184 89 -183 60 -192 b 0 -148 4 -180 0 -168 b 1 29 1 -89 1 -30 l 1 156 b 36 190 3 187 4 190 b 217 190 102 192 168 190 z"},noteheadParenthesis:{x_min:-70.190112022022,x_max:329,y_min:-196,y_max:201,ha:397,o:"m 344 -279 b 382 -262 361 -288 370 -272 b 405 -233 390 -255 399 -245 b 474 9 455 -158 468 -73 b 416 228 474 78 448 174 b 364 282 403 249 387 271 b 344 289 359 285 350 288 b 331 279 338 289 333 287 b 325 248 328 269 325 258 b 338 225 325 238 328 229 b 412 138 379 207 396 174 b 445 1 433 92 445 45 b 346 -217 445 -81 410 -154 b 336 -252 340 -223 336 -238 b 344 -279 336 -265 338 -276 z m 19 -274 b 35 -282 24 -279 30 -281 b 49 -265 42 -282 46 -275 b 52 -243 50 -256 52 -249 b 36 -210 52 -230 49 -220 b -60 -59 -16 -173 -35 -114 b -73 9 -69 -39 -73 -16 b 33 223 -73 92 -24 189 b 50 265 43 229 50 249 b 33 288 50 278 46 289 b 4 272 23 288 14 275 b -9 261 0 269 -4 265 b -101 23 -58 193 -105 124 b -37 -206 -104 -52 -75 -130 b 19 -274 -23 -232 -6 -255 z"},noteheadParenthesisRight:{x_min:-30,x_max:82,y_min:-199.08429092881173,y_max:206,ha:405.0842909288117,o:"m -17 -282 b 24 -264 -6 -297 12 -272 b 60 -219 40 -253 52 -236 b 117 1 96 -150 112 -75 b 118 16 118 6 118 12 b 109 73 118 36 112 55 b 4 279 99 154 68 226 b -23 297 -4 287 -13 297 b -37 289 -27 297 -32 294 b -43 266 -42 285 -43 276 b -32 225 -43 251 -37 229 b 84 -7 48 170 84 82 b 32 -184 84 -69 65 -132 b -10 -222 22 -200 4 -209 b -24 -258 -20 -232 -24 -245 b -17 -282 -24 -266 -22 -276 z"},noteheadParenthesisLeft:{x_min:0,x_max:106,y_min:-197,y_max:197,ha:394,o:"m 134 -284 b 138 -281 135 -284 137 -284 b 145 -268 144 -278 145 -274 l 144 -253 b 107 -180 138 -225 121 -204 b 42 13 71 -120 42 -56 b 49 73 42 32 43 52 b 137 210 62 128 95 171 b 153 255 147 219 153 239 b 145 278 153 265 151 274 b 130 284 140 281 135 284 b 98 259 117 284 108 268 b 0 37 35 203 1 131 b 118 -268 9 -69 53 -173 b 134 -284 121 -274 127 -284 z"},augmentationDot:{x_min:0,x_max:96,y_min:-57,y_max:57,ha:114,o:"m 13 -82 b 16 -81 14 -82 14 -82 b 105 -73 46 -76 75 -76 b 131 -48 121 -72 131 -60 b 138 26 134 -24 138 0 b 137 48 138 33 138 40 b 108 82 134 71 125 82 b 95 81 104 82 99 82 b 33 71 75 78 53 75 b 4 46 20 68 6 62 b 0 -66 1 9 0 -29 b 13 -82 0 -73 1 -82 z"},tremolo1:{x_min:-158,x_max:156.19381479578487,y_min:-88,y_max:88,ha:176,o:"m -206 -127 b -194 -125 -203 -127 -199 -127 b 173 -36 -72 -94 50 -65 b 220 16 202 -29 215 -12 b 225 50 223 30 225 45 b 216 107 226 76 222 91 b 194 127 210 120 204 127 b 183 124 192 127 189 127 l -192 33 b -226 -9 -213 27 -222 14 b -228 -32 -226 -16 -228 -23 b -222 -108 -228 -58 -222 -82 b -206 -127 -222 -120 -217 -127 z"},flag8thUp:{x_min:0,x_max:261,y_min:-819,y_max:0,ha:819,o:"m 265 -1171 b 351 -1035 301 -1130 336 -1087 b 376 -867 369 -979 376 -923 b 367 -755 376 -829 373 -792 b 233 -422 350 -632 311 -520 b 131 -291 199 -379 166 -334 b 65 -125 91 -239 66 -192 b 62 -75 65 -112 62 -91 b 42 0 62 -49 52 -24 l 35 0 b 0 -63 6 -13 0 -36 l 0 -144 b 96 -445 0 -255 29 -356 b 177 -547 124 -478 150 -514 b 308 -831 246 -629 298 -721 b 317 -890 310 -851 317 -871 b 311 -919 317 -900 315 -910 b 256 -1005 297 -950 282 -984 b 228 -1068 233 -1024 228 -1045 b 230 -1106 228 -1080 229 -1093 b 240 -1162 232 -1125 239 -1143 b 251 -1179 242 -1174 246 -1179 b 265 -1171 255 -1179 259 -1176 z"},flag8thDown:{x_min:0,x_max:261,y_min:0,y_max:819,ha:819,o:"m 265 1171 b 251 1179 259 1176 255 1179 b 240 1162 246 1179 242 1174 b 230 1106 239 1143 232 1125 b 228 1068 229 1093 228 1080 b 256 1005 228 1045 233 1024 b 311 919 282 984 297 950 b 317 890 315 910 317 900 b 308 831 317 871 310 851 b 177 547 298 721 246 629 b 96 445 150 514 124 478 b 0 144 29 356 0 255 l 0 63 b 35 0 0 36 6 13 l 42 0 b 62 75 52 24 62 49 b 59 117 62 91 59 104 b 131 291 60 183 91 239 b 233 422 166 334 199 379 b 367 755 311 520 350 632 b 376 867 373 792 376 829 b 351 1035 376 923 369 979 b 265 1171 336 1087 301 1130 z"},flag16thUp:{x_min:0,x_max:327.1591498636094,y_min:-819.3972596310256,y_max:0,ha:819.3972596310256,o:"m 415 -1179 b 435 -1168 423 -1182 429 -1174 b 451 -1138 442 -1159 446 -1149 b 465 -1020 464 -1102 467 -1064 b 461 -962 464 -1004 464 -984 b 471 -821 467 -916 472 -870 b 465 -721 472 -791 467 -756 b 415 -520 459 -651 441 -585 b 200 -245 370 -408 284 -327 b 96 -114 160 -206 118 -168 b 75 -24 84 -85 85 -53 b 59 0 72 -16 72 0 b 53 -1 58 0 56 -1 b 27 -32 40 -6 27 -10 b 29 -68 27 -43 29 -55 b 10 -79 20 -69 13 -72 b 1 -109 6 -89 1 -99 b 0 -170 0 -130 0 -148 b 35 -410 0 -252 12 -333 b 258 -793 76 -557 156 -681 b 409 -1158 350 -896 410 -1014 b 415 -1179 409 -1165 405 -1175 z m 413 -816 b 331 -681 392 -769 364 -723 b 145 -420 266 -596 189 -521 b 86 -281 125 -374 102 -330 b 156 -370 105 -312 128 -343 b 318 -539 210 -425 269 -478 b 413 -816 383 -621 420 -713 z"},flag16thDown:{x_min:0,x_max:327.1591498636094,y_min:0,y_max:819,ha:819,o:"m 59 0 b 75 24 72 0 72 16 b 96 114 85 53 84 85 b 200 245 118 168 160 206 b 415 520 284 327 370 408 b 465 721 441 585 459 651 b 471 821 467 756 472 791 b 461 962 472 870 467 916 b 465 1020 464 984 464 1004 b 451 1138 467 1064 464 1102 b 435 1168 446 1149 442 1159 b 418 1179 431 1172 425 1179 l 415 1179 b 408 1169 409 1176 408 1174 b 409 1158 408 1165 409 1161 b 258 793 410 1014 350 896 b 35 410 156 681 76 557 b 0 170 12 333 0 252 l 0 88 b 29 7 0 71 6 23 b 59 0 33 4 58 0 z m 86 281 b 145 420 102 330 125 374 b 331 681 189 521 266 596 b 413 816 364 723 392 769 b 415 791 413 808 415 799 b 318 539 415 698 377 613 b 156 370 269 478 210 425 b 86 281 128 343 105 312 z"},flag32ndUp:{x_min:-.19862981551275186,x_max:268.0942440943661,y_min:-849.4710740978672,y_max:149.0769891455102,ha:998.5480632433774,o:"m 323 -1223 b 351 -1198 337 -1227 344 -1210 b 359 -1184 354 -1194 356 -1188 b 386 -999 377 -1122 387 -1060 b 341 -783 386 -927 372 -855 b 330 -736 334 -769 330 -753 b 333 -708 330 -727 330 -717 b 344 -621 340 -678 344 -649 b 341 -579 344 -608 343 -593 b 328 -500 338 -553 328 -526 b 331 -475 328 -491 328 -484 b 347 -370 343 -438 348 -402 b 151 27 348 -212 288 -56 b 53 176 98 59 50 102 b 45 197 53 183 48 192 b 33 215 40 203 40 216 l 30 215 b 6 194 22 212 9 209 b 0 120 3 170 -1 145 b 0 -43 4 65 0 13 b 0 -98 0 -60 1 -79 b 4 -276 0 -157 6 -216 b 7 -456 4 -337 7 -397 b 66 -638 7 -523 22 -585 b 158 -724 94 -671 127 -697 b 318 -1011 246 -801 295 -899 b 321 -1044 321 -1021 321 -1032 b 312 -1152 321 -1080 312 -1116 b 317 -1192 312 -1165 314 -1179 b 323 -1223 320 -1202 311 -1220 z m 285 -376 b 121 -180 249 -289 173 -245 b 91 -105 104 -158 92 -135 b 288 -354 181 -144 288 -269 b 285 -376 288 -363 287 -370 z m 275 -657 b 111 -492 226 -589 163 -547 b 65 -376 78 -456 66 -418 b 71 -323 65 -360 68 -341 b 275 -657 164 -418 265 -504 z"},flag32ndDown:{x_min:-2.800802874905624,x_max:268.09424409436605,y_min:-169.07698914551014,y_max:829.4710740978672,ha:998.5480632433773,o:"m 323 1194 b 317 1164 311 1191 320 1174 b 312 1123 314 1151 312 1136 b 321 1015 312 1087 321 1051 b 318 982 321 1004 321 992 b 158 696 295 870 246 772 b 66 609 127 668 94 642 b 7 428 22 556 7 494 b 4 248 7 369 4 308 b -1 78 6 187 -10 137 b 0 14 0 59 0 32 l 0 -148 b 6 -223 0 -174 3 -199 b 30 -243 9 -238 22 -240 l 33 -243 b 45 -226 40 -245 40 -232 b 53 -204 48 -220 53 -212 b 151 -56 50 -131 98 -88 b 347 341 288 27 348 183 b 331 446 348 373 343 409 b 328 471 328 455 328 462 b 341 550 328 497 338 524 b 344 592 343 564 344 579 b 333 680 344 621 340 649 b 330 707 330 688 330 698 b 341 755 330 724 334 740 b 386 971 372 827 386 899 b 359 1155 387 1031 377 1093 b 351 1169 356 1159 354 1165 b 323 1194 344 1181 337 1198 z m 275 628 b 71 294 265 475 164 389 b 65 347 68 312 65 331 b 111 464 66 389 78 428 b 275 628 163 518 226 560 z m 285 347 b 288 325 287 341 288 334 b 91 76 288 240 181 115 b 121 151 92 107 104 130 b 285 347 173 216 249 261 z"},flag64thUp:{x_min:-4,x_max:282,y_min:-823.5430338167067,y_max:347,ha:1170.5430338167066,o:"m 350 -1185 b 380 -1162 364 -1189 374 -1175 b 406 -1022 399 -1119 406 -1071 b 359 -798 406 -945 384 -871 b 348 -756 353 -785 348 -772 b 350 -744 348 -753 350 -749 b 363 -621 356 -704 363 -664 b 360 -580 363 -608 363 -593 b 359 -560 359 -573 359 -567 b 373 -490 359 -536 366 -513 b 393 -346 386 -444 393 -395 b 387 -269 393 -320 390 -294 b 348 -127 382 -219 348 -173 b 351 -104 348 -120 348 -111 b 353 -65 351 -91 353 -78 b 341 37 353 -26 348 6 b 226 215 323 108 278 164 b 86 336 181 258 127 288 b 62 395 72 353 62 370 b 42 481 62 423 55 454 b 27 500 37 488 36 500 b 24 498 26 500 26 500 b -1 480 14 497 1 492 b -6 444 -4 467 -6 455 l -6 435 b -1 341 -1 403 -1 372 l -1 266 b 6 156 -1 230 0 193 b 13 35 12 117 13 75 l 13 -35 b 14 -85 13 -52 14 -68 b 29 -276 19 -150 33 -213 b 20 -448 24 -334 20 -392 b 24 -534 20 -477 22 -505 b 114 -708 30 -605 59 -664 b 197 -780 143 -732 171 -755 b 344 -1153 301 -884 341 -1011 b 343 -1172 344 -1159 343 -1166 b 350 -1185 343 -1176 344 -1182 z m 287 -88 b 62 193 186 -17 79 48 b 229 52 121 144 174 98 b 289 -33 256 29 274 -3 b 295 -56 294 -42 295 -49 b 287 -88 295 -66 292 -76 z m 298 -410 b 118 -235 238 -351 176 -295 b 76 -88 82 -197 78 -147 b 268 -252 137 -153 203 -202 b 330 -360 304 -279 330 -315 b 323 -402 330 -373 327 -387 b 311 -418 318 -413 315 -418 b 298 -410 307 -418 302 -415 z m 300 -691 b 117 -508 243 -616 168 -575 b 82 -408 94 -480 82 -448 b 84 -379 82 -397 82 -387 b 259 -553 135 -451 206 -492 b 301 -667 287 -583 301 -619 b 300 -691 301 -674 301 -683 z"},flag64thDown:{x_min:-5,x_max:281,y_min:-375,y_max:795.5430338167066,ha:1170.5430338167066,o:"m 348 1145 b 341 1132 343 1142 341 1136 b 343 1113 341 1126 343 1119 b 196 740 340 971 300 844 b 112 668 170 714 141 691 b 23 494 58 624 29 564 b 19 408 20 465 19 436 b 27 236 19 351 23 294 b 13 45 32 173 17 109 b 12 -6 13 27 12 12 l 12 -75 b 4 -196 12 -115 10 -157 b -3 -307 -1 -233 -3 -271 l -3 -382 b -7 -475 -3 -412 -3 -444 l -7 -484 b -3 -520 -7 -495 -6 -507 b 23 -539 0 -533 13 -537 b 26 -540 24 -540 24 -540 b 40 -521 35 -540 36 -528 b 60 -435 53 -494 60 -464 b 85 -376 60 -410 71 -393 b 225 -255 125 -328 180 -298 b 340 -78 276 -204 321 -148 b 351 24 347 -46 351 -14 b 350 63 351 37 350 50 b 347 86 347 71 347 79 b 386 229 347 132 380 179 b 392 305 389 253 392 279 b 372 449 392 354 384 403 b 357 520 364 472 357 495 b 359 540 357 527 357 533 b 361 580 361 553 361 567 b 348 704 361 624 354 664 b 347 716 348 708 347 713 b 357 757 347 732 351 744 b 405 982 383 831 405 904 b 379 1122 405 1031 397 1079 b 348 1145 373 1135 363 1149 z m 298 651 b 300 626 300 642 300 634 b 258 513 300 579 285 543 b 82 338 204 452 134 410 b 81 367 81 347 81 357 b 115 468 81 408 92 439 b 298 651 167 534 242 576 z m 297 370 b 310 377 301 374 305 377 b 321 361 314 377 317 373 b 328 320 325 347 328 333 b 266 212 328 275 302 239 b 75 48 202 161 135 112 b 117 194 76 107 81 157 b 297 370 174 255 236 311 z m 285 48 b 294 16 291 36 294 26 b 288 -7 294 9 292 1 b 228 -92 272 -37 255 -69 b 60 -233 173 -138 120 -184 b 285 48 78 -88 184 -23 z"},flag128thUp:{x_min:0,x_max:252,y_min:-804,y_max:530,ha:1334,o:"m 298 -1158 b 328 -1126 312 -1158 320 -1139 b 330 -1116 330 -1123 330 -1119 b 347 -996 343 -1076 347 -1037 b 328 -837 347 -943 338 -890 b 320 -778 324 -816 320 -798 b 330 -733 320 -763 323 -749 b 340 -665 338 -714 337 -688 b 341 -645 340 -660 341 -652 b 333 -534 341 -609 333 -572 b 343 -471 333 -513 334 -492 b 361 -366 356 -436 361 -402 b 331 -202 361 -311 348 -256 b 328 -187 330 -197 328 -193 b 331 -179 328 -184 328 -181 b 363 -55 353 -137 363 -96 b 337 79 363 -12 351 33 b 327 114 333 92 327 104 b 344 144 327 124 331 132 b 359 174 353 150 357 163 b 361 228 360 193 361 210 b 243 517 361 337 325 435 b 147 596 213 546 179 569 b 75 708 111 626 75 655 b 62 744 75 723 68 733 b 50 763 58 752 58 763 b 46 762 49 763 48 762 b 17 742 36 757 22 757 b 0 697 14 726 0 711 b 1 595 0 662 3 631 b 0 469 0 552 0 511 b 1 429 0 456 0 442 b 22 289 6 382 22 337 b 24 128 22 238 24 184 b 22 66 24 108 23 86 b 19 -19 20 37 19 10 b 20 -132 19 -56 20 -95 b 13 -276 20 -180 19 -229 b 9 -359 10 -304 9 -330 b 12 -487 9 -402 12 -445 b 56 -582 12 -526 29 -554 b 197 -742 107 -632 160 -681 b 288 -1100 265 -851 276 -976 b 288 -1122 288 -1107 287 -1115 b 287 -1145 289 -1129 287 -1138 b 298 -1158 287 -1153 288 -1158 z m 304 150 b 75 475 229 256 112 334 b 304 150 233 357 305 287 z m 271 -73 b 127 72 233 -14 179 26 b 81 167 96 98 81 127 b 84 194 81 176 82 184 b 271 -73 148 102 242 39 z m 279 -396 b 132 -223 233 -330 180 -279 b 81 -112 104 -192 81 -156 b 82 -91 81 -105 81 -98 b 279 -396 167 -125 269 -281 z m 249 -609 b 69 -357 197 -520 88 -471 b 249 -609 131 -441 229 -498 z"},flag128thDown:{x_min:-.8888888888888888,x_max:252,y_min:-580,y_max:754,ha:1334,o:"m 298 1086 b 287 1073 288 1086 287 1081 b 288 1050 287 1066 289 1057 b 288 1028 287 1043 288 1035 b 197 670 276 904 265 779 b 56 510 160 609 107 560 b 12 415 29 482 12 454 b 9 287 12 373 9 330 b 13 204 9 258 10 232 b 20 60 19 157 20 108 b 19 -53 20 23 19 -16 b 22 -138 19 -82 20 -109 b 24 -200 23 -158 24 -180 b 22 -361 24 -256 22 -310 b 1 -501 22 -409 6 -454 b 0 -541 0 -514 0 -528 b 0 -667 0 -583 -3 -624 b 0 -809 0 -675 -3 -791 b 46 -834 4 -825 36 -829 b 50 -835 48 -834 49 -835 b 62 -816 58 -835 58 -824 b 75 -780 68 -805 75 -795 b 147 -668 75 -727 111 -698 b 243 -589 179 -641 213 -618 b 361 -300 325 -507 361 -409 b 359 -246 361 -282 360 -265 b 344 -216 357 -235 353 -222 b 327 -186 331 -204 327 -196 b 337 -151 327 -176 333 -164 b 363 -17 351 -105 363 -60 b 331 107 363 24 353 65 b 328 115 328 109 328 112 b 331 130 328 121 330 125 b 361 294 348 184 361 239 b 343 399 361 330 356 364 b 333 462 334 420 333 441 b 341 573 333 500 341 537 b 340 593 341 580 340 588 b 330 661 337 616 338 642 b 320 706 323 677 320 691 b 328 765 320 726 324 744 b 347 924 338 818 347 871 b 330 1044 347 965 343 1004 b 328 1054 330 1047 330 1051 b 298 1086 320 1067 312 1086 z m 249 537 b 69 285 229 426 131 369 b 249 537 88 399 197 448 z m 279 324 b 82 19 269 209 167 53 b 81 40 81 26 81 33 b 132 151 81 84 104 120 b 279 324 180 207 233 258 z m 271 1 b 84 -266 242 -111 148 -174 b 81 -239 82 -256 81 -248 b 127 -144 81 -199 96 -170 b 271 1 179 -98 233 -58 z m 304 -222 b 75 -547 305 -359 233 -429 b 304 -222 112 -406 229 -328 z"},accidentalFlat:{x_min:1,x_max:209,y_min:-208,y_max:472,ha:680,o:"m 29 -300 b 46 -289 33 -300 39 -297 b 107 -243 65 -274 86 -258 b 301 127 233 -153 301 -30 b 298 186 301 147 301 166 b 190 297 291 256 251 297 b 147 289 177 297 163 294 b 86 265 127 284 107 274 l 85 264 l 85 301 b 91 465 85 356 88 410 b 94 559 91 497 94 527 b 84 651 94 589 91 621 b 66 680 81 661 81 680 l 65 680 b 37 645 49 678 37 665 b 33 523 36 605 32 563 l 33 478 b 26 223 33 393 29 308 b 1 -141 22 101 1 -19 b 17 -287 1 -189 4 -239 b 29 -300 20 -295 23 -300 z m 68 -105 b 76 12 71 -68 72 -29 b 81 107 79 43 81 75 l 86 109 b 171 135 114 121 141 135 b 204 128 181 135 193 132 b 238 92 228 120 239 108 b 230 63 238 84 236 75 b 68 -105 193 -10 132 -59 z"},accidentalNatural:{x_min:0,x_max:213.5,y_min:-456,y_max:462,ha:918,o:"m 255 -657 b 281 -624 271 -657 275 -636 b 285 -599 282 -615 285 -608 b 292 -300 288 -500 289 -400 b 289 -161 292 -253 289 -207 b 300 128 292 -65 297 32 b 304 168 300 128 302 150 l 304 173 l 305 190 l 305 199 l 307 225 b 304 259 307 229 310 246 b 272 298 297 274 302 305 b 63 266 204 279 134 272 b 72 514 68 348 72 432 b 71 595 72 541 72 567 b 56 665 71 619 66 642 b 17 579 9 651 17 608 b 3 144 19 433 7 289 b 0 -7 1 94 0 43 b 3 -134 0 -50 1 -92 b 7 -219 3 -163 7 -192 b 35 -251 7 -243 17 -251 b 49 -249 39 -251 43 -251 l 223 -223 l 230 -222 l 230 -359 b 223 -516 230 -410 223 -464 b 236 -619 223 -550 226 -585 b 255 -657 240 -634 236 -657 z m 58 -63 b 55 81 56 -14 53 33 l 56 99 b 85 99 65 99 75 98 b 232 108 134 104 183 107 l 240 109 l 236 66 b 232 -48 235 29 232 -10 b 58 -81 174 -63 115 -73 z"},accidentalSharp:{x_min:-22,x_max:390,y_min:-384,y_max:383,ha:767,o:"m 202 -553 b 219 -526 213 -552 216 -536 b 226 -471 225 -507 226 -488 b 225 -425 226 -455 225 -441 b 226 -392 225 -415 225 -402 b 233 -305 229 -363 232 -334 l 297 -292 b 331 -469 300 -353 311 -412 b 347 -485 333 -477 338 -485 b 363 -469 356 -487 359 -477 b 374 -418 373 -454 374 -435 b 376 -382 376 -405 376 -393 b 372 -276 376 -347 373 -311 l 455 -259 b 550 -156 534 -243 544 -232 b 550 -109 550 -137 552 -124 b 526 -78 549 -91 541 -78 l 523 -78 b 507 -79 517 -78 513 -78 b 403 -101 474 -88 438 -95 l 379 -105 b 382 -42 380 -85 380 -63 b 384 96 383 4 384 50 b 503 131 425 107 464 118 b 549 173 524 138 543 150 b 562 249 554 199 562 223 b 554 294 562 264 560 279 b 536 315 549 308 544 315 l 533 315 b 517 312 528 315 523 315 b 382 266 472 294 428 279 l 377 344 b 359 531 374 406 372 469 b 348 552 356 539 357 552 l 347 552 l 343 552 b 315 528 331 549 317 544 l 315 501 b 320 249 315 416 318 333 l 243 232 b 239 361 243 275 242 318 b 226 425 238 383 238 403 b 199 359 194 409 199 382 b 193 223 196 312 194 268 b 72 202 153 215 112 209 b 4 118 13 192 4 183 b 10 66 0 102 12 84 b 33 29 7 39 14 30 b 48 32 37 29 42 30 b 187 55 95 39 141 46 l 183 -75 b 176 -145 181 -99 179 -122 b 16 -179 122 -156 69 -166 b -32 -232 -14 -186 -32 -197 b -17 -331 -32 -266 -19 -298 b -1 -356 -17 -347 -13 -354 b 12 -353 1 -356 6 -354 b 167 -320 63 -341 115 -331 b 166 -377 166 -338 166 -357 b 189 -526 166 -428 171 -477 b 202 -553 192 -536 189 -553 z m 240 -132 b 243 -37 242 -101 242 -69 b 245 65 245 -3 245 30 b 315 79 269 69 292 73 b 301 -120 308 13 305 -53 z"},accidentalDoubleSharp:{x_min:0,x_max:287,y_min:-159,y_max:159,ha:318,o:"m 84 -229 b 107 -216 91 -229 98 -225 b 200 -125 138 -186 167 -154 b 232 -95 212 -115 222 -105 b 347 -189 271 -125 310 -157 b 370 -200 356 -196 363 -200 b 396 -179 380 -200 389 -192 b 412 -102 410 -154 406 -125 b 377 -27 410 -69 400 -46 l 325 14 b 402 91 350 42 374 68 b 413 127 410 96 413 107 b 382 200 409 148 397 176 b 350 229 370 220 360 229 b 314 210 340 229 328 223 b 274 174 300 199 285 187 b 212 104 252 151 232 128 b 92 187 173 132 132 161 b 78 193 86 192 82 193 b 68 190 75 193 72 193 b 48 179 62 186 53 187 b 40 137 43 168 40 154 b 81 16 40 92 56 32 b 107 -3 89 10 98 4 b 14 -94 76 -32 45 -62 b 0 -124 6 -102 0 -114 b 12 -154 0 -134 3 -144 b 62 -215 26 -176 48 -193 b 84 -229 69 -225 76 -229 z"},accidentalDoubleFlat:{x_min:0,x_max:359,y_min:-220,y_max:446,ha:666,o:"m 43 -317 b 72 -301 55 -317 63 -310 b 160 -186 108 -268 134 -226 b 236 -60 186 -145 212 -102 b 233 -131 235 -85 233 -108 b 239 -220 233 -161 235 -190 b 259 -246 240 -233 239 -240 b 301 -228 284 -252 291 -238 b 465 -7 369 -163 416 -85 b 517 173 500 48 517 108 b 451 307 517 229 505 284 b 409 315 436 312 422 315 b 331 287 382 315 356 305 b 311 274 324 282 320 274 l 310 274 l 310 566 b 305 621 310 585 312 603 b 294 642 301 628 305 642 l 292 642 b 264 622 282 641 266 636 b 253 575 259 606 256 590 b 246 418 248 523 246 471 b 248 243 246 360 248 302 l 248 187 b 164 238 220 225 193 238 b 85 213 140 238 112 226 b 84 229 85 220 84 225 b 86 315 85 258 86 287 b 81 528 86 386 82 458 b 71 582 81 547 78 566 b 56 603 66 590 68 603 l 53 603 b 23 580 40 600 26 598 b 19 537 20 566 19 552 b 20 514 19 530 19 521 b 26 390 24 472 26 432 b 14 66 26 282 16 174 b 0 -168 13 -12 0 -91 b 12 -279 0 -206 3 -242 b 30 -314 16 -294 14 -308 b 43 -317 35 -317 39 -317 z m 301 -72 b 302 7 302 -45 302 -19 l 302 86 b 351 158 304 121 321 145 b 383 166 361 163 373 166 b 435 143 402 166 419 157 b 445 127 441 138 445 132 b 441 114 445 122 444 118 b 301 -72 397 49 354 -14 z m 75 -147 b 73 30 75 -86 75 -29 b 118 82 73 62 92 76 b 132 84 124 84 128 84 b 190 52 156 84 174 69 b 193 40 192 49 193 45 b 192 33 193 37 193 35 b 75 -147 157 -30 125 -95 z"},accidentalParensLeft:{x_min:0,x_max:130.18934911242604,y_min:-270,y_max:267.6082500723851,ha:537.6082500723851,o:"m 107 -389 b 127 -374 114 -389 120 -384 b 141 -347 132 -367 137 -357 b 151 -294 148 -330 151 -311 b 122 -207 151 -265 141 -236 b 63 -65 94 -164 72 -117 b 59 -10 60 -46 59 -27 b 145 223 59 78 94 153 b 187 354 176 262 189 305 b 177 384 187 364 190 380 b 143 373 166 387 153 383 b 124 354 137 367 130 361 b 0 -35 33 240 0 108 l 0 -92 b 85 -372 4 -193 27 -287 b 107 -389 92 -383 99 -389 z"},accidentalParensRight:{x_min:-.4444444444444445,x_max:139,y_min:-275,y_max:277,ha:552,o:"m 58 -396 b 96 -354 75 -396 85 -370 b 200 13 168 -238 200 -111 b 153 268 200 109 184 190 b 49 392 131 320 101 364 b 26 399 40 397 33 399 b 0 366 10 399 0 387 b 0 318 -1 350 0 334 l 0 291 b 27 238 -3 266 7 253 b 143 9 105 180 143 98 b 141 -20 143 -1 143 -10 b 63 -225 135 -92 108 -164 b 36 -307 45 -251 36 -278 b 40 -344 36 -320 37 -331 b 42 -356 42 -347 42 -351 b 58 -396 42 -374 37 -396 z"},accidentalQuarterToneFlatStein:{x_min:0,x_max:208,y_min:-240,y_max:440,ha:680,o:"m 272 -346 b 284 -333 278 -346 281 -341 b 300 -187 297 -285 300 -235 b 275 177 300 -65 279 55 b 268 432 272 262 268 347 l 268 477 b 264 599 269 517 265 559 b 236 634 264 619 252 632 l 235 634 b 217 605 220 634 220 615 b 207 513 210 575 207 543 b 210 419 207 481 210 451 b 216 255 213 364 216 310 l 216 217 l 215 219 b 154 243 194 228 174 238 b 111 251 138 248 124 251 b 3 140 50 251 10 210 b 0 81 0 120 0 101 b 194 -289 0 -76 68 -199 b 255 -336 215 -304 236 -320 b 272 -346 262 -343 268 -346 z m 233 -151 b 71 17 168 -105 108 -56 b 63 46 65 29 63 37 b 96 82 62 62 73 73 b 130 89 108 86 120 89 b 215 63 160 89 187 75 l 220 60 b 225 -35 220 29 222 -3 b 233 -151 229 -75 230 -114 z"},accidentalThreeQuarterTonesFlatZimmermann:{x_min:0,x_max:422,y_min:-240,y_max:440,ha:680,o:"m 272 -346 b 284 -333 278 -346 281 -341 b 300 -187 297 -285 300 -235 b 275 177 300 -65 279 55 b 268 432 272 262 268 347 l 268 477 b 264 599 269 517 265 559 b 236 634 264 619 252 632 l 235 634 b 217 605 220 634 220 615 b 207 513 210 575 207 543 b 210 419 207 481 210 451 b 216 255 213 364 216 310 l 216 217 l 215 219 b 154 243 194 228 174 238 b 111 251 138 248 124 251 b 3 140 50 251 10 210 b 0 81 0 120 0 101 b 194 -289 0 -76 68 -199 b 255 -336 215 -304 236 -320 b 272 -346 262 -343 268 -346 z m 336 -346 b 353 -336 340 -346 346 -343 b 413 -289 372 -320 393 -304 b 608 81 540 -199 608 -76 b 605 140 608 101 608 120 b 497 251 598 210 557 251 b 454 243 484 251 469 248 b 393 219 433 238 413 228 l 392 217 l 392 255 b 397 419 392 310 395 364 b 400 513 397 451 400 481 b 390 605 400 543 397 575 b 373 634 387 615 387 634 l 372 634 b 344 599 356 632 344 619 b 340 477 343 559 338 517 l 340 432 b 333 177 340 347 336 262 b 308 -187 328 55 308 -65 b 324 -333 308 -235 311 -285 b 336 -346 327 -341 330 -346 z m 233 -151 b 71 17 168 -105 108 -56 b 63 46 65 29 63 37 b 96 82 62 62 73 73 b 130 89 108 86 120 89 b 215 63 160 89 187 75 l 220 60 b 225 -35 220 29 222 -3 b 233 -151 229 -75 230 -114 z m 374 -151 b 383 -35 377 -114 379 -75 b 387 60 386 -3 387 29 l 393 63 b 478 89 420 75 448 89 b 511 82 488 89 500 86 b 544 46 534 73 546 62 b 537 17 544 37 543 29 b 374 -151 500 -56 439 -105 z"},accidentalQuarterToneSharpStein:{x_min:0,x_max:300,y_min:-338,y_max:351,ha:689,o:"m 194 -487 b 225 -432 215 -469 223 -452 b 238 -232 229 -366 236 -298 b 377 -199 285 -220 331 -209 b 418 -164 397 -193 410 -181 b 432 -88 428 -138 432 -114 b 412 -42 432 -55 428 -42 b 389 -46 406 -42 399 -43 l 235 -85 b 233 -20 235 -63 233 -42 b 233 105 232 22 233 63 b 312 121 259 111 285 117 b 406 226 390 134 400 145 b 373 284 409 268 402 284 b 344 281 364 284 356 282 b 232 258 307 276 269 266 b 230 308 232 275 232 291 b 210 505 229 374 232 441 b 183 471 189 501 184 490 b 180 406 181 449 180 428 b 184 246 180 353 184 300 b 48 222 140 236 94 228 b 0 168 6 216 0 209 b 7 86 1 141 4 114 b 27 66 9 73 13 66 l 35 66 b 184 94 85 66 135 84 b 187 -1 184 62 186 30 b 190 -96 189 -33 190 -65 l 112 -114 b 35 -213 27 -132 35 -132 b 33 -253 35 -226 35 -240 b 49 -276 33 -269 37 -276 b 62 -275 52 -276 56 -276 l 186 -245 l 186 -256 b 179 -387 180 -300 177 -343 b 194 -487 180 -419 179 -454 z"},accidentalThreeQuarterTonesSharpStein:{x_min:-23,x_max:388,y_min:-373,y_max:445,ha:818,o:"m 114 -537 b 138 -475 137 -518 138 -495 b 147 -292 138 -413 144 -353 b 212 -278 168 -287 190 -282 b 243 -444 215 -333 225 -389 b 261 -467 248 -454 251 -465 b 281 -446 272 -469 276 -455 b 292 -347 292 -416 288 -384 b 288 -262 289 -320 288 -291 l 374 -245 b 376 -311 374 -266 374 -288 b 390 -456 379 -357 379 -405 b 416 -396 412 -436 415 -418 b 423 -287 420 -360 423 -323 b 422 -235 423 -269 423 -252 b 451 -229 432 -233 441 -232 b 547 -98 524 -215 547 -199 l 547 -89 b 521 -49 546 -59 540 -49 b 497 -52 516 -49 507 -49 b 418 -68 469 -56 444 -63 b 423 52 419 -29 422 12 b 426 140 425 81 425 109 b 495 160 449 145 472 153 b 552 219 526 170 546 189 b 559 279 557 240 553 262 b 530 341 559 324 552 341 b 490 331 520 341 507 338 b 432 311 471 324 452 318 b 449 552 436 392 442 471 b 452 588 451 563 452 575 b 446 622 452 599 451 611 b 436 641 444 629 448 641 b 418 628 428 641 420 636 b 409 602 413 621 410 611 b 386 297 396 501 390 399 b 297 274 356 288 327 281 b 291 403 295 317 294 360 b 274 550 288 452 284 501 b 259 569 271 564 265 569 b 240 559 253 569 248 563 b 230 537 232 554 230 546 l 230 488 b 233 369 230 448 232 409 b 236 261 236 333 238 297 b 156 245 210 255 183 251 b 154 396 154 295 154 346 b 150 416 154 403 153 410 b 140 438 145 423 150 438 l 138 438 b 118 413 128 436 118 428 b 112 354 118 393 114 374 b 109 238 109 315 109 276 b 49 226 89 233 69 230 b 3 163 16 222 3 202 b 7 91 3 138 9 114 b 29 62 7 69 13 62 b 39 63 32 62 35 63 b 104 73 60 66 82 71 b 101 -10 104 46 102 17 l 92 -132 l 10 -150 b -33 -204 -19 -157 -33 -170 b -19 -310 -32 -240 -19 -274 b -6 -324 -19 -321 -13 -324 b 6 -323 -1 -324 1 -324 b 82 -307 32 -317 58 -311 b 81 -376 82 -330 81 -353 b 114 -537 81 -431 94 -484 z m 294 -92 b 297 -37 295 -73 295 -56 b 300 49 300 -9 300 20 l 300 108 b 379 127 325 114 353 120 b 374 -76 376 59 374 -9 b 294 -92 347 -82 320 -86 z m 154 -120 b 157 20 154 -73 156 -26 b 158 82 158 40 158 62 b 230 95 183 86 206 89 b 225 0 229 63 226 32 b 217 -107 223 -35 220 -71 z"},accidentalBuyukMucennebFlat:{x_min:1.8692317181955784,x_max:287,y_min:-248,y_max:432.4720949426819,ha:680.4720949426819,o:"m 410 128 b 302 239 403 199 363 239 b 259 232 289 239 275 236 b 199 207 239 226 219 216 l 197 206 l 197 243 l 197 251 b 347 317 248 272 298 295 b 376 347 360 324 372 334 b 389 435 387 376 393 405 b 348 454 384 462 377 465 b 202 387 300 432 251 409 b 203 408 203 395 203 402 l 203 431 b 347 490 252 451 300 469 b 376 517 360 495 372 505 b 389 599 387 546 393 572 b 348 616 384 625 377 628 l 203 556 b 196 593 202 569 199 582 b 179 622 193 603 193 622 l 177 622 b 150 588 161 621 150 608 b 147 533 150 570 148 552 b 29 488 108 517 69 503 b 3 455 12 482 3 472 b 12 353 1 422 9 389 b 145 408 56 372 101 389 b 145 363 145 392 145 377 l 29 315 b 3 281 12 310 3 298 b 12 170 1 245 9 209 l 141 226 b 138 166 140 206 138 186 b 114 -199 134 43 115 -76 b 130 -344 114 -246 117 -297 b 141 -357 132 -353 135 -357 b 158 -347 145 -357 151 -354 b 219 -301 177 -331 199 -315 b 413 69 346 -210 413 -88 b 410 128 413 89 413 108 z m 350 35 b 343 6 350 26 348 17 b 180 -163 308 -69 245 -117 b 189 -46 183 -125 184 -86 b 193 49 192 -14 193 17 l 199 52 b 284 78 226 63 253 78 b 317 71 294 78 305 75 b 350 35 340 62 351 50 z"},accidentalBakiyeFlat:{x_min:1.8692317181955784,x_max:287,y_min:-236,y_max:444,ha:680,o:"m 141 -340 b 158 -330 145 -340 151 -337 b 219 -284 177 -314 199 -298 b 413 86 346 -193 413 -71 b 410 145 413 107 413 125 b 302 256 403 216 363 256 b 259 249 289 256 275 253 b 199 225 239 243 219 233 l 197 223 l 197 261 b 199 334 197 285 199 310 b 347 406 249 357 298 382 b 376 439 360 413 372 425 b 390 516 384 465 390 490 b 389 537 390 523 390 530 b 372 564 384 556 382 564 b 348 557 367 564 359 562 b 204 487 300 537 253 510 b 206 518 206 497 206 507 b 196 611 206 549 203 580 b 179 639 193 621 193 639 l 177 639 b 150 605 161 638 150 625 b 145 482 148 564 144 523 l 145 458 b 29 405 107 439 68 420 b 3 366 12 397 3 386 b 12 243 1 325 9 287 b 143 307 56 265 99 285 l 138 183 b 114 -181 134 60 114 -59 b 130 -327 114 -229 117 -279 b 141 -340 132 -336 135 -340 z m 180 -145 b 189 -29 183 -108 184 -69 b 193 66 192 3 193 35 l 199 69 b 284 95 226 81 253 95 b 317 88 294 95 305 92 b 350 52 340 79 351 68 b 343 23 350 43 348 35 b 180 -145 305 -50 245 -99 z"},accidentalKomaSharp:{x_min:0,x_max:300,y_min:-338,y_max:351,ha:689,o:"m 194 -487 b 225 -432 215 -469 223 -452 b 238 -232 229 -366 236 -298 b 377 -199 285 -220 331 -209 b 418 -164 397 -193 410 -181 b 432 -88 428 -138 432 -114 b 412 -42 432 -55 428 -42 b 389 -46 406 -42 399 -43 l 235 -85 b 233 -20 235 -63 233 -42 b 233 105 232 22 233 63 b 312 121 259 111 285 117 b 406 226 390 134 400 145 b 373 284 409 268 402 284 b 344 281 364 284 356 282 b 232 258 307 276 269 266 b 230 308 232 275 232 291 b 210 505 229 374 232 441 b 183 471 189 501 184 490 b 180 406 181 449 180 428 b 184 246 180 353 184 300 b 48 222 140 236 94 228 b 0 168 6 216 0 209 b 7 86 1 141 4 114 b 27 66 9 73 13 66 l 35 66 b 184 94 85 66 135 84 b 187 -1 184 62 186 30 b 190 -96 189 -33 190 -65 l 112 -114 b 35 -213 27 -132 35 -132 b 33 -253 35 -226 35 -240 b 49 -276 33 -269 37 -276 b 62 -275 52 -276 56 -276 l 186 -245 l 186 -256 b 179 -387 180 -300 177 -343 b 194 -487 180 -419 179 -454 z"},accidentalKucukMucennebSharp:{x_min:-.15206251809627475,x_max:359,y_min:-420,y_max:343,ha:763,o:"m 236 -605 b 262 -543 256 -583 261 -564 b 269 -423 268 -503 269 -464 b 266 -340 269 -396 268 -367 l 361 -318 b 405 -276 384 -312 399 -298 b 413 -189 412 -248 416 -219 b 395 -164 412 -171 409 -164 b 382 -166 392 -164 387 -164 b 264 -193 343 -176 304 -184 b 269 -102 265 -163 268 -132 b 454 -62 331 -89 392 -78 b 501 -23 477 -58 494 -45 b 517 62 511 6 517 33 b 487 112 517 95 513 112 b 471 111 482 112 477 112 b 274 66 406 95 340 81 b 276 138 275 91 276 114 b 350 154 301 144 325 148 b 402 203 377 160 396 176 b 412 284 408 230 412 258 b 392 311 412 302 406 311 b 372 308 386 311 379 310 b 287 291 343 301 314 297 l 295 405 b 298 441 297 416 298 428 b 292 475 298 452 297 464 b 282 494 289 482 294 494 b 264 481 274 494 266 490 b 255 455 259 474 256 464 b 239 282 248 397 243 340 b 148 268 209 278 179 274 b 62 164 62 252 62 253 l 62 132 b 79 108 60 117 65 108 l 86 108 l 230 130 b 229 92 230 118 229 105 b 228 56 228 79 228 68 b 66 20 173 43 120 32 b 0 -59 6 7 3 1 l 0 -138 b 14 -160 -1 -156 4 -160 b 27 -158 19 -160 23 -160 b 222 -112 92 -141 157 -127 b 220 -203 220 -143 220 -173 b 147 -217 196 -207 171 -213 b 89 -288 92 -228 89 -229 b 95 -347 85 -305 96 -325 b 112 -374 92 -366 98 -374 b 125 -373 117 -374 121 -374 l 220 -351 b 222 -458 220 -386 220 -422 b 236 -605 223 -504 225 -552 z"},accidentalKoron:{x_min:0,x_max:303,y_min:-462.4598053473055,y_max:180,ha:642.4598053473055,o:"m 59 -665 b 72 -649 69 -662 72 -657 b 69 -626 72 -642 69 -634 b 69 -622 69 -625 69 -624 l 69 -600 b 55 -156 60 -456 68 -311 b 86 -170 66 -166 76 -170 b 112 -163 95 -170 104 -166 b 390 -35 204 -120 298 -78 b 436 -1 409 -27 436 -27 b 396 46 436 22 413 33 l 382 55 b 46 243 271 121 157 179 b 12 259 29 253 17 259 b 0 219 1 259 0 248 b 3 -372 0 22 3 -176 b 6 -616 3 -454 6 -536 b 59 -665 6 -638 40 -671 z m 55 199 b 363 24 156 141 258 84 b 55 -118 259 -24 160 -69 z"},accidentalSori:{x_min:0,x_max:434,y_min:-295,y_max:325,ha:620,o:"m 194 -425 b 196 -409 194 -418 196 -413 b 194 -194 196 -337 196 -266 b 364 -127 251 -171 308 -150 b 361 -321 363 -192 364 -256 b 410 -387 360 -357 373 -377 b 413 -373 412 -382 413 -377 b 418 -114 418 -287 418 -200 l 418 -105 b 595 -35 477 -82 536 -59 b 625 0 612 -27 625 -22 b 593 48 624 23 618 39 l 419 117 b 423 370 419 202 423 285 b 426 403 423 382 426 393 b 418 436 426 415 425 426 b 384 468 409 449 399 468 b 369 448 370 468 369 459 b 369 436 369 444 369 441 l 369 428 l 369 423 b 367 138 369 328 367 233 l 353 143 l 192 207 l 192 367 b 173 406 192 383 184 396 b 151 422 167 413 160 422 b 144 420 148 422 147 422 b 137 403 138 416 137 410 l 137 392 l 137 229 b 33 271 102 243 68 256 b 13 276 26 274 19 276 b 0 262 6 276 0 272 b 35 199 1 239 0 212 l 138 160 b 140 -148 138 58 138 -45 b 56 -181 111 -158 84 -170 b 24 -215 35 -189 24 -199 b 29 -235 24 -220 26 -228 b 49 -253 35 -249 42 -253 b 78 -240 59 -253 69 -243 b 140 -216 98 -233 120 -225 l 140 -356 b 194 -425 140 -406 141 -406 z m 194 -125 b 193 138 194 -37 193 50 b 315 89 233 122 275 107 b 366 71 333 84 350 76 b 364 -58 366 27 366 -16 b 194 -125 308 -81 251 -104 z m 419 49 l 526 7 l 485 -10 l 419 -36 z"},articAccentAbove:{x_min:0,x_max:425,y_min:0,y_max:326,ha:326,o:"m 27 1 b 78 12 46 0 62 6 b 347 112 168 45 253 91 b 521 184 409 128 459 167 b 608 259 557 194 589 220 b 612 274 611 265 612 271 b 598 292 612 281 608 287 b 477 347 559 312 518 331 b 176 465 374 384 275 425 b 156 469 168 468 161 469 b 125 456 145 469 137 465 b 53 370 96 432 78 399 b 45 353 48 363 45 357 b 68 333 45 344 52 337 b 360 225 166 298 262 261 b 192 154 302 203 249 171 b 13 36 120 132 53 105 b 0 13 9 29 0 22 l 0 9 b 16 0 3 1 10 0 l 26 0 b 27 1 27 0 27 0 z"},articAccentBelow:{x_min:0,x_max:425,y_min:-326,y_max:0,ha:326,o:"m 26 -469 l 27 -469 b 78 -458 46 -469 62 -464 b 347 -357 168 -426 253 -380 b 521 -285 409 -341 459 -302 b 608 -210 557 -276 589 -249 b 612 -196 611 -204 612 -200 b 598 -179 612 -189 608 -183 b 477 -122 559 -157 518 -138 b 176 -4 374 -85 275 -45 b 156 0 168 -1 161 0 b 125 -13 145 0 137 -4 b 53 -99 96 -37 78 -71 b 45 -117 48 -107 45 -112 b 68 -137 45 -125 52 -132 b 360 -245 166 -171 262 -209 b 192 -315 302 -266 249 -300 b 13 -433 120 -337 53 -366 b 0 -456 9 -442 0 -448 l 0 -461 b 16 -469 3 -468 10 -469 z"},articTenutoAbove:{x_min:.35192668236256364,x_max:471.1238660564107,y_min:0,y_max:56,ha:56,o:"m 137 0 b 197 1 156 0 179 1 b 409 6 268 1 338 6 b 482 4 432 6 459 6 b 556 0 508 3 534 0 b 651 10 588 0 621 3 b 678 27 662 12 678 10 b 654 59 680 45 672 53 b 511 75 606 73 560 73 b 255 81 426 78 341 81 b 160 79 222 81 193 79 l 36 79 b 1 71 24 78 7 85 b 19 32 -3 56 9 43 b 45 16 26 24 36 20 b 137 0 76 3 108 0 z"},articTenutoBelow:{x_min:.35192668236256364,x_max:471.1238660564107,y_min:-59,y_max:-3,ha:56,o:"m 137 -85 b 197 -84 156 -85 179 -84 b 409 -79 268 -84 338 -79 b 482 -81 432 -79 459 -79 b 556 -85 508 -82 534 -85 b 651 -75 588 -85 621 -82 b 678 -58 662 -73 678 -75 b 654 -26 680 -40 672 -32 b 511 -10 606 -12 560 -12 b 255 -4 426 -7 341 -4 b 160 -6 222 -4 193 -6 l 36 -6 b 1 -14 24 -7 7 0 b 19 -53 -3 -29 9 -42 b 45 -69 26 -60 36 -65 b 137 -85 76 -82 108 -85 z"},articStaccatoAbove:{x_min:1.4151102965496913,x_max:112,y_min:0,y_max:156,ha:156,o:"m 98 0 b 132 23 109 0 122 7 b 161 112 150 50 161 79 b 158 148 161 124 161 137 b 125 186 154 167 131 167 b 63 225 117 215 85 216 b 23 197 45 222 30 219 b 3 91 12 163 12 127 b 19 66 0 79 4 69 b 65 27 40 62 53 46 b 98 0 76 9 88 0 z"},articStaccatoBelow:{x_min:1.4151102965496913,x_max:112.08403222864916,y_min:-156,y_max:0,ha:156,o:"m 132 -202 b 161 -112 151 -174 163 -145 b 158 -76 161 -101 161 -88 b 125 -39 153 -58 131 -58 b 63 0 115 -10 85 -9 b 23 -27 45 -3 30 -6 b 3 -134 12 -62 10 -98 b 19 -158 0 -145 4 -156 b 65 -197 40 -164 53 -179 b 98 -225 75 -216 88 -225 b 132 -202 109 -225 122 -217 z"},articStaccatissimoAbove:{x_min:0,x_max:139,y_min:0,y_max:411,ha:411,o:"m 104 0 b 144 115 143 29 138 75 b 197 423 158 217 180 320 b 200 454 199 433 200 444 b 181 540 200 482 193 513 b 112 592 167 573 141 592 b 55 567 92 592 72 585 b 0 490 32 546 3 527 l 0 484 b 27 279 14 416 14 347 b 84 20 43 193 52 104 b 96 0 86 13 92 6 z"},articStaccatissimoBelow:{x_min:0,x_max:139,y_min:-411,y_max:0,ha:411,o:"m 88 -592 b 145 -567 108 -592 128 -585 b 200 -490 168 -546 197 -527 l 200 -484 b 173 -279 186 -416 186 -347 b 117 -20 157 -193 148 -104 b 104 0 114 -13 108 -6 l 96 0 b 56 -115 58 -29 62 -75 b 3 -423 42 -217 20 -320 b 0 -454 1 -433 0 -444 b 19 -540 0 -482 7 -513 b 88 -592 33 -573 59 -592 z"},articMarcatoAbove:{x_min:.04121419527862119,x_max:396,y_min:0,y_max:328.0000000000001,ha:328.0000000000001,o:"m 477 0 b 510 13 488 0 500 6 b 570 124 546 40 563 81 b 547 183 570 147 560 166 b 356 422 487 265 405 330 b 346 442 354 429 350 436 l 346 444 b 318 465 340 456 330 464 l 312 469 b 274 449 294 480 284 461 b 242 413 262 438 253 425 b 56 196 177 343 112 274 b 1 56 26 154 13 105 b 27 20 -4 35 9 20 b 42 23 32 20 37 20 b 84 53 59 29 72 39 b 255 269 141 125 193 200 b 275 229 262 255 266 242 b 448 14 324 151 390 86 b 477 0 456 4 467 0 z"},articMarcatoBelow:{x_min:0,x_max:395.9587858047214,y_min:-328.0000000000001,y_max:0,ha:328.0000000000001,o:"m 258 -469 b 297 -449 276 -480 287 -461 b 328 -413 308 -438 317 -425 b 514 -196 393 -343 458 -274 b 569 -56 544 -154 557 -105 b 543 -20 575 -35 562 -20 b 528 -23 539 -20 533 -20 b 487 -53 511 -29 498 -39 b 315 -269 429 -125 377 -200 b 295 -229 308 -255 304 -242 b 122 -14 246 -151 180 -86 b 94 0 114 -4 104 0 b 60 -13 82 0 71 -6 b 0 -124 24 -40 7 -81 b 23 -183 0 -147 10 -166 b 215 -422 84 -265 166 -330 b 225 -442 216 -429 220 -436 l 225 -444 b 252 -465 230 -456 240 -464 z"},fermataAbove:{x_min:-.04550444040404433,x_max:472,y_min:2.015071727506986,y_max:454,ha:451.984928272493,o:"m 39 10 b 78 108 66 37 71 73 b 163 311 92 181 111 252 b 284 423 199 353 239 392 b 373 458 312 444 340 454 b 433 431 395 458 410 446 b 603 153 530 361 596 276 b 595 121 603 144 595 131 l 595 88 b 602 50 596 75 589 55 b 639 73 619 43 631 60 b 651 102 645 82 648 92 b 667 194 660 132 662 163 b 680 278 671 222 672 248 b 560 567 680 386 638 481 b 396 654 508 625 452 649 b 291 632 364 654 325 644 b 161 526 235 613 200 566 b 4 249 85 446 26 357 b 4 174 0 222 -3 196 b 10 19 4 124 4 69 b 29 4 12 6 16 0 b 39 10 35 4 33 4 z m 338 37 b 370 40 350 36 357 36 b 380 75 387 40 380 43 b 389 94 382 79 382 85 b 356 132 389 111 374 122 b 269 154 328 147 300 156 b 225 125 252 154 228 157 b 261 48 222 81 232 56 b 338 37 287 40 312 40 z"},fermataBelow:{x_min:-.310835055998654,x_max:518.570567335755,y_min:-430,y_max:-.9161449836506543,ha:429.08385501634933,o:"m 344 -615 b 500 -543 402 -602 452 -576 b 713 -253 605 -471 661 -364 b 746 -98 737 -204 750 -153 b 727 -59 744 -82 744 -59 b 688 -88 711 -59 694 -68 b 678 -109 687 -96 683 -102 b 562 -314 648 -183 611 -252 b 387 -439 516 -373 458 -416 b 328 -449 367 -446 347 -449 b 180 -386 274 -449 225 -423 b 69 -179 111 -330 69 -262 b 75 -121 69 -160 71 -141 b 84 -58 78 -101 84 -79 b 82 -39 84 -52 84 -45 b 68 -1 79 -26 82 -4 b 26 -32 49 0 33 -12 b 20 -52 24 -39 22 -45 b 0 -223 9 -107 -3 -161 b 141 -553 1 -348 27 -468 b 304 -619 192 -590 243 -619 b 344 -615 317 -619 330 -618 z m 415 -190 b 435 -157 429 -192 435 -184 b 308 -27 435 -86 379 -27 b 271 -46 287 -27 272 -35 b 269 -69 269 -55 269 -62 b 364 -183 269 -128 302 -170 z"},breathMarkComma:{x_min:0,x_max:148,y_min:0,y_max:275,ha:275,o:"m 120 0 b 187 78 156 20 174 48 b 213 209 206 121 213 164 b 206 294 213 238 210 265 b 140 390 200 337 171 367 b 122 396 134 395 128 396 b 68 382 105 396 85 384 b 46 379 60 382 53 382 b 0 328 12 369 0 357 b 1 311 0 323 1 317 b 30 210 4 275 22 243 b 66 167 39 179 46 167 b 94 171 73 167 82 168 b 143 180 109 174 124 180 b 160 179 148 180 154 180 b 120 66 124 145 120 107 b 120 0 120 45 121 23 z"},breathMarkUpbow:{x_min:0,x_max:254,y_min:0,y_max:595,ha:595,o:"m 233 0 b 256 48 251 14 253 30 b 272 183 264 92 265 138 b 311 455 289 274 295 364 b 350 716 327 541 341 628 b 366 815 354 749 366 782 b 359 857 366 829 363 842 b 327 815 334 852 330 832 b 302 674 315 769 310 721 b 248 357 288 567 269 462 b 225 226 240 314 242 268 b 210 251 212 232 213 243 b 69 721 163 408 117 564 b 32 835 58 760 53 801 b 20 851 29 841 27 851 b 14 850 19 851 16 851 b 0 828 6 847 0 838 l 0 825 b 12 765 1 804 7 785 b 194 125 73 552 132 338 b 233 0 206 84 213 42 z"},caesura:{x_min:0,x_max:565.5831864753837,y_min:-.09016994374947417,y_max:562.4481112129314,ha:562.5382811566809,o:"m 0 76 b 49 122 24 92 37 107 b 444 613 180 287 305 455 b 528 770 484 660 518 708 b 531 792 530 778 531 785 b 524 808 531 799 530 805 b 490 792 513 815 498 802 b 390 683 456 756 420 721 b 48 262 275 543 164 400 b 0 76 0 207 7 145 z m 226 1 b 248 13 238 -4 243 7 l 353 137 b 759 638 490 302 632 464 b 814 805 795 688 819 740 b 779 786 796 805 788 796 b 628 609 724 732 678 668 b 310 242 523 485 416 363 b 217 69 265 190 217 140 b 222 30 217 58 219 45 b 222 23 222 29 220 26 b 220 12 222 20 220 16 b 226 1 220 7 222 3 z"},caesuraCurved:{x_min:0,x_max:386,y_min:-10,y_max:584,ha:594,o:"m 180 -14 b 246 14 213 -13 230 0 b 347 144 288 52 315 99 b 526 471 420 246 488 350 b 556 671 546 537 556 603 b 543 798 556 713 553 756 b 504 837 537 822 521 828 b 490 841 500 840 494 841 b 472 832 482 841 477 838 b 406 678 436 785 406 737 b 410 638 406 665 408 652 b 425 511 419 595 425 553 b 315 186 425 395 387 287 b 180 -14 271 122 228 58 z m 14 24 b 49 39 29 24 40 32 b 120 114 76 60 99 85 b 216 276 156 166 184 223 b 317 626 281 384 317 501 b 315 664 317 639 317 651 b 301 773 314 701 311 737 b 262 808 295 795 278 808 b 245 799 256 808 249 805 b 170 641 209 750 170 706 b 171 621 170 634 170 628 b 177 511 176 585 177 549 b 114 229 177 415 160 320 b 0 26 79 161 42 95 b 14 24 6 24 10 24 z"},restMaxima:{x_min:0,x_max:366,y_min:-255,y_max:255,ha:510,o:"m 397 -367 b 504 -343 436 -367 468 -347 b 518 -318 516 -341 518 -330 b 527 -30 518 -217 527 -117 b 526 33 527 -7 527 13 l 526 301 b 501 350 526 323 520 341 b 428 367 477 361 452 367 b 374 359 410 367 393 364 b 357 333 361 354 357 347 b 356 91 357 252 356 171 l 356 30 b 340 -307 357 -82 346 -194 b 397 -367 337 -354 350 -367 z m 46 -357 b 58 -356 49 -357 53 -357 b 154 -333 91 -351 121 -338 b 173 -305 168 -330 173 -320 l 173 302 b 132 356 173 330 157 348 b 68 364 112 363 89 364 b 3 304 19 363 1 348 l 3 4 l 0 4 b 1 -302 0 -98 0 -200 b 46 -357 1 -331 16 -357 z"},restDoubleWhole:{x_min:0,x_max:122,y_min:0,y_max:249,ha:249,o:"m 43 0 b 58 1 48 0 52 0 b 124 20 81 6 102 17 b 176 96 173 27 176 58 b 173 220 174 138 173 179 b 176 304 173 248 176 276 b 140 353 176 331 163 346 b 95 359 125 356 111 359 b 32 346 73 359 52 354 b 0 315 20 340 0 337 b 1 243 0 291 1 268 l 1 174 l 4 174 l 4 48 b 43 0 4 16 17 0 z"},restWhole:{x_min:.8908513171538642,x_max:500,y_min:-120,y_max:14,ha:134,o:"m 356 -173 l 356 -171 l 642 -171 b 719 -115 680 -171 717 -145 b 720 -82 719 -104 720 -92 b 711 -20 720 -60 719 -40 b 672 17 704 0 694 10 b 649 20 664 20 657 20 b 605 17 634 20 621 17 b 92 19 433 17 262 17 b 29 7 69 20 49 12 b 9 -17 12 4 9 -6 b 10 -43 9 -26 10 -35 b 1 -84 10 -58 3 -72 b 76 -173 0 -147 7 -173 z"},restHalf:{x_min:0,x_max:518.3998530468286,y_min:0,y_max:162,ha:162,o:"m 98 0 l 556 0 b 665 1 592 0 629 0 b 746 82 720 3 743 29 b 736 174 749 114 740 144 b 670 232 729 215 708 232 b 570 229 636 232 603 229 b 356 233 498 229 426 233 l 73 233 b 0 179 19 233 0 220 b 1 154 0 171 0 164 b 6 95 4 135 6 115 b 98 0 3 27 29 0 z"},restQuarter:{x_min:-.3784452492533808,x_max:263,y_min:-415,y_max:415,ha:830,o:"m 151 -596 b 164 -563 163 -589 161 -575 b 160 -546 164 -557 161 -552 b 124 -396 148 -495 135 -446 b 122 -380 122 -390 122 -384 b 199 -255 122 -331 158 -272 b 228 -256 209 -249 217 -253 b 324 -346 274 -271 298 -310 b 353 -369 331 -356 341 -369 b 360 -367 356 -369 357 -369 b 379 -336 373 -361 379 -348 l 377 -325 b 344 -232 372 -292 366 -258 b 249 -58 301 -180 278 -117 b 242 -36 245 -49 242 -42 b 258 -7 242 -26 248 -17 b 328 78 284 20 311 45 b 354 158 344 104 354 131 b 337 216 354 177 350 196 b 213 435 294 288 249 359 b 115 575 189 487 158 536 b 78 598 105 585 92 598 b 59 592 72 598 66 596 b 39 562 45 583 39 572 b 53 527 39 550 45 539 b 168 344 98 469 125 402 b 187 307 181 328 187 317 b 153 269 187 294 176 284 b 62 213 122 252 91 235 b 40 180 48 203 40 192 b 46 158 40 173 43 166 b 99 65 60 125 79 95 b 183 -79 131 20 160 -29 b 156 -86 173 -88 164 -85 b 0 -261 58 -99 -7 -173 b 96 -557 10 -366 49 -464 b 124 -585 102 -569 109 -580 b 145 -598 132 -588 138 -598 b 151 -596 147 -598 150 -598 z"},rest8th:{x_min:0,x_max:289,y_min:-260,y_max:261,ha:521,o:"m 164 -374 b 212 -340 190 -373 203 -357 b 276 -190 238 -292 258 -242 b 410 285 333 -36 359 128 b 416 314 413 294 416 304 l 416 321 b 393 354 415 341 410 354 b 382 353 389 354 386 354 b 292 311 347 347 315 333 b 174 225 256 276 216 251 b 157 219 168 222 163 219 b 140 228 151 219 145 222 b 131 246 134 233 131 240 b 135 262 131 252 132 256 b 147 298 141 272 147 285 b 127 367 147 323 154 354 b 94 376 114 373 102 376 b 48 336 75 376 63 363 b 3 181 20 288 12 235 b 0 150 1 170 0 160 b 109 24 0 84 35 24 b 171 36 127 24 148 27 b 289 101 213 52 248 75 b 164 -374 256 -62 193 -213 z"},rest16th:{x_min:0,x_max:333,y_min:-328.283950617284,y_max:244,ha:572.2839506172841,o:"m 209 -471 b 246 -458 222 -477 236 -468 b 307 -338 279 -425 300 -384 b 324 -226 312 -301 317 -262 b 428 161 350 -94 386 35 b 480 318 445 215 480 259 b 467 347 480 331 477 341 b 445 351 461 350 454 351 b 408 337 432 351 419 347 b 402 333 405 336 403 334 b 223 215 344 294 294 245 b 236 259 229 233 235 246 b 238 276 238 265 238 271 b 212 338 238 302 226 334 b 193 341 206 340 199 341 b 86 289 156 341 104 317 b 59 180 66 255 59 217 b 156 27 59 76 92 27 b 236 46 179 27 204 35 b 338 101 271 59 298 82 b 289 -49 312 49 302 0 b 196 -122 276 -99 235 -107 b 176 -114 187 -127 176 -127 l 176 -111 b 157 -53 177 -88 164 -72 b 69 -9 141 -7 101 -16 b 17 -48 43 -3 29 -27 b 0 -127 4 -73 0 -99 b 6 -186 0 -147 1 -167 b 82 -294 17 -262 37 -294 b 160 -276 102 -294 128 -289 b 219 -242 181 -268 203 -259 b 236 -230 223 -236 229 -230 b 243 -232 239 -230 240 -230 b 235 -275 248 -246 239 -261 b 202 -456 220 -334 202 -395 b 209 -471 202 -462 203 -468 z"},rest32nd:{x_min:0,x_max:347,y_min:-497.5023916875033,y_max:483,ha:980.5023916875033,o:"m 177 -716 b 217 -690 194 -720 209 -704 b 233 -655 225 -680 230 -668 b 292 -390 253 -567 275 -480 b 361 -48 312 -275 336 -161 b 452 400 393 102 422 252 b 497 629 467 477 482 553 b 500 647 498 635 500 641 b 480 691 500 665 492 684 b 464 696 475 694 469 696 b 418 674 448 696 431 685 l 361 626 b 333 611 353 618 343 612 b 308 629 325 611 317 616 b 239 667 292 651 265 661 b 204 670 228 668 216 670 b 86 559 141 670 95 628 b 85 537 86 552 85 544 b 107 416 85 495 95 455 b 161 372 114 389 134 372 b 174 373 166 372 170 372 b 226 383 192 374 209 377 b 387 478 285 402 330 444 b 364 386 379 444 364 415 b 276 271 364 323 320 298 b 265 266 272 268 268 266 b 252 276 261 266 256 269 b 143 333 229 311 186 333 b 107 327 130 333 118 330 b 43 243 62 314 46 291 b 58 145 43 210 52 179 b 150 63 68 92 99 63 b 315 132 213 63 259 98 b 266 -58 297 63 281 4 b 207 -101 259 -91 230 -96 b 186 -66 186 -107 199 -75 b 180 -50 181 -63 183 -55 b 101 -3 160 -23 135 -3 b 9 -66 59 -3 20 -32 b 0 -118 3 -84 0 -101 b 10 -196 0 -144 6 -170 b 104 -287 20 -256 52 -287 b 137 -282 114 -287 125 -287 b 184 -269 151 -281 171 -269 b 196 -275 190 -269 193 -271 b 199 -287 197 -278 199 -282 b 184 -343 199 -304 189 -325 b 181 -348 184 -346 183 -347 b 134 -595 158 -429 131 -508 b 156 -677 134 -624 150 -648 b 177 -716 158 -693 160 -713 z"},rest64th:{x_min:0,x_max:428,y_min:-720,y_max:473.6797408388932,ha:1193.6797408388932,o:"m 200 -1037 b 229 -1012 215 -1037 222 -1025 b 238 -984 233 -1004 236 -994 b 282 -780 248 -914 265 -848 b 386 -369 317 -644 354 -507 b 491 104 422 -212 451 -53 b 600 541 528 249 550 399 b 616 629 611 570 616 599 b 600 680 616 648 615 671 b 550 665 586 687 566 677 b 480 618 527 649 501 635 b 464 611 474 613 468 611 b 448 622 458 611 454 615 b 366 662 425 651 397 662 b 331 658 354 662 343 661 b 242 572 285 647 253 619 b 236 528 239 557 236 543 b 266 400 236 484 251 442 b 325 373 274 377 301 373 b 436 409 366 373 403 383 l 494 452 b 474 360 485 416 474 389 b 383 248 474 297 435 269 b 320 328 377 288 351 310 b 276 341 305 337 291 341 b 186 269 235 341 194 311 b 181 230 183 256 181 243 b 187 153 181 204 186 179 b 279 63 192 86 233 63 b 304 65 288 63 295 63 b 416 115 344 72 379 92 b 387 -14 406 69 397 27 b 320 -95 380 -52 369 -86 b 318 -79 320 -89 320 -84 b 223 0 305 -29 271 0 b 122 -81 171 0 135 -30 b 118 -127 120 -96 118 -112 l 118 -196 b 137 -242 118 -215 125 -229 b 209 -275 157 -266 181 -275 b 249 -269 222 -275 235 -274 b 318 -248 272 -264 294 -255 b 281 -390 315 -301 292 -344 b 276 -400 279 -393 279 -397 b 259 -420 272 -408 266 -416 b 246 -429 255 -425 251 -429 b 233 -415 242 -429 238 -426 b 176 -359 225 -389 200 -372 b 121 -346 158 -348 140 -346 b 14 -408 73 -346 27 -370 b 0 -498 4 -438 0 -468 b 6 -564 0 -520 3 -543 b 91 -635 12 -611 45 -635 b 131 -629 104 -635 117 -634 b 223 -590 163 -622 190 -603 b 166 -824 203 -671 189 -747 b 148 -912 157 -852 148 -881 b 156 -955 148 -926 150 -940 b 177 -1008 161 -972 170 -991 b 200 -1037 181 -1020 183 -1037 z"},rest128th:{x_min:.6717818579024267,x_max:491,y_min:-711,y_max:719,ha:1430,o:"m 233 -1015 b 271 -956 256 -1002 266 -981 l 314 -723 b 393 -350 337 -598 366 -474 b 543 312 442 -128 492 91 b 687 841 583 490 635 665 b 707 958 698 880 707 919 b 706 986 707 968 707 976 b 688 1025 704 999 704 1024 b 670 1027 683 1025 677 1027 b 629 1007 655 1027 639 1022 b 559 945 613 981 586 968 b 541 1004 553 968 559 991 b 456 1035 516 1024 488 1035 b 419 1030 444 1035 431 1034 b 344 953 379 1018 353 995 b 340 900 341 936 340 917 b 341 847 340 881 341 864 b 380 779 340 815 354 793 b 464 763 406 765 435 762 b 592 814 510 763 549 786 b 546 660 575 757 556 710 b 480 585 537 619 517 598 b 478 599 480 590 478 595 b 386 678 472 641 428 678 b 294 612 343 678 304 651 b 279 477 282 567 278 521 b 363 395 281 428 317 395 b 380 396 369 395 374 395 b 488 436 416 403 449 419 b 384 233 469 357 468 275 b 359 291 373 252 377 276 b 282 318 337 310 310 318 b 181 264 243 318 203 298 b 154 107 153 216 154 161 b 242 6 154 42 187 6 b 278 10 253 6 265 7 b 408 88 330 22 366 55 b 387 -1 400 56 393 27 b 301 -112 379 -55 354 -94 b 289 -65 297 -95 302 -79 b 219 -32 269 -42 245 -32 b 183 -37 207 -32 196 -35 b 112 -109 144 -46 121 -71 b 105 -219 104 -145 108 -183 b 186 -315 101 -276 134 -315 b 230 -307 199 -315 215 -312 b 324 -256 264 -295 292 -275 b 180 -491 323 -383 266 -471 b 183 -459 180 -480 180 -469 b 184 -442 184 -454 184 -448 l 184 -436 b 135 -369 184 -403 170 -383 b 102 -363 125 -364 114 -363 b 29 -399 73 -363 45 -376 b 1 -556 -4 -448 6 -503 b 109 -670 -4 -625 43 -670 b 140 -667 118 -670 130 -668 b 253 -616 180 -658 213 -638 b 238 -688 248 -644 242 -665 b 192 -959 220 -779 192 -867 b 193 -992 192 -971 192 -981 b 210 -1024 194 -1014 199 -1024 b 233 -1015 216 -1024 223 -1021 z"},dynamicPiano:{x_min:-49,x_max:326.5019318364244,y_min:-142,y_max:515,ha:657,o:"m -56 -204 b -42 -202 -52 -204 -46 -203 b -19 -194 -35 -202 -26 -197 b 147 -138 35 -170 91 -151 b 249 -58 194 -127 223 -95 b 262 -29 255 -50 262 -39 b 258 -17 262 -24 261 -20 b 232 -7 252 -10 242 -7 b 210 -12 225 -7 217 -9 b 125 -40 184 -23 157 -30 b 183 140 153 19 171 79 b 251 167 207 144 230 153 b 469 518 383 262 480 382 b 357 687 472 626 420 687 b 315 678 344 687 330 684 b 204 600 279 664 240 634 b 210 704 206 635 209 670 b 215 721 212 710 215 716 b 206 733 215 727 212 730 b 180 742 197 736 189 742 b 164 734 176 742 170 740 b 1 575 108 684 36 645 b -7 557 -1 569 -7 563 b -6 553 -7 556 -7 554 b 7 547 -3 547 3 547 l 17 547 b 82 575 43 547 59 567 l 82 452 b 56 46 82 317 81 180 b 17 -66 49 7 46 -36 b -62 -173 -13 -99 -37 -135 b -71 -192 -66 -179 -71 -184 b -68 -199 -71 -193 -69 -196 b -56 -204 -65 -203 -60 -204 z m 196 258 b 197 266 197 261 197 264 b 200 510 200 347 199 429 b 233 543 210 521 222 533 b 281 560 249 554 266 560 b 340 503 310 560 333 540 b 344 461 343 488 344 474 b 321 323 344 413 333 369 b 268 272 315 300 295 281 b 196 258 245 265 220 261 z"},dynamicMezzo:{x_min:-18,x_max:559,y_min:-50,y_max:365,ha:415,o:"m 43 -71 b 160 19 86 -71 143 -26 b 230 264 189 99 200 184 b 282 363 243 297 259 327 b 287 320 285 347 287 333 b 284 279 287 305 285 292 l 249 -12 b 275 -43 248 -29 245 -43 b 395 45 321 -43 389 3 b 462 271 406 124 436 197 b 523 387 475 310 490 348 l 523 346 b 504 130 521 274 513 202 b 501 81 501 114 501 98 b 510 3 501 55 504 29 b 580 -72 521 -48 543 -72 b 625 -63 593 -72 608 -69 b 789 50 690 -43 744 -3 b 805 72 795 56 805 63 b 798 85 805 76 802 81 b 778 94 792 91 785 94 b 755 85 770 94 763 91 l 693 40 b 675 33 685 36 680 33 b 658 52 668 33 662 39 b 645 144 651 82 645 112 b 658 448 641 246 660 346 b 606 507 658 485 638 507 b 583 504 599 507 592 505 b 495 446 547 497 521 471 b 420 373 471 423 448 399 b 413 458 418 406 418 432 b 361 507 408 490 386 507 b 320 491 347 507 333 501 b 160 307 256 444 207 382 l 160 337 b 174 488 160 387 174 438 b 156 521 174 501 173 513 b 137 526 148 524 143 526 b 109 513 127 526 118 520 b -16 399 66 477 23 439 b -26 383 -20 395 -26 389 l -26 379 b -14 370 -24 372 -20 370 b -6 372 -12 370 -9 372 b 19 376 4 374 12 376 b 36 359 32 376 36 370 b 30 330 36 350 35 341 l 30 323 b 9 -35 23 203 17 85 b 43 -71 6 -65 19 -71 z"},dynamicForte:{x_min:-144,x_max:311.30112136775,y_min:-115.3876295915697,y_max:504,ha:619.3876295915697,o:"m -101 -166 b 173 76 7 -153 150 -30 b 206 344 192 164 202 253 b 268 338 226 343 246 341 b 384 395 317 333 353 361 b 397 419 393 405 397 412 b 367 442 397 429 387 436 b 350 444 361 444 356 444 b 206 455 302 449 255 454 l 206 474 b 202 540 204 495 202 518 b 209 593 202 557 203 576 b 236 624 215 613 225 624 b 265 612 245 624 253 619 b 308 552 287 596 302 577 b 336 533 312 534 323 533 b 448 611 366 533 444 583 b 399 696 452 648 423 671 b 382 706 395 700 387 703 b 308 726 357 720 333 726 b 207 684 272 726 239 711 b 60 455 135 622 60 560 l 10 455 b -23 448 -1 455 -13 454 b -102 372 -55 426 -76 397 b -109 357 -108 367 -109 361 b -95 347 -109 353 -105 348 b -63 346 -84 346 -73 346 b 0 344 -43 344 -22 344 l 63 344 b 53 186 63 291 59 239 b 23 0 46 124 42 60 b -35 -60 10 -42 -6 -60 b -73 -52 -45 -60 -58 -58 b -91 -48 -79 -49 -85 -48 b -109 -53 -96 -48 -102 -49 b -199 -124 -143 -72 -168 -99 b -207 -137 -203 -128 -207 -132 b -194 -148 -207 -141 -203 -145 b -101 -166 -164 -160 -132 -168 z"},dynamicRinforzando:{x_min:-75,x_max:322.0960720195126,y_min:-90,y_max:325,ha:415,o:"m 23 -130 b 40 -125 27 -130 33 -128 b 128 -9 81 -114 125 -53 b 145 200 132 62 141 130 b 148 238 147 212 148 225 b 308 321 184 291 245 321 b 363 314 325 321 344 318 b 377 310 369 312 373 310 b 384 311 380 310 382 310 b 464 415 410 317 464 389 b 446 433 465 429 455 429 b 390 445 428 441 409 445 b 305 429 361 445 334 438 b 167 346 252 413 202 393 b 153 325 163 338 158 333 b 148 438 154 363 151 399 b 121 468 147 456 134 468 b 101 458 115 468 108 465 b -63 310 46 409 -16 367 b -108 240 -78 289 -98 271 b 32 330 -50 256 -13 297 b 37 304 37 320 37 312 l 37 292 b 10 -101 27 161 20 30 b 23 -130 9 -120 12 -130 z"},dynamicSforzando:{x_min:0,x_max:296,y_min:0,y_max:379,ha:379,o:"m 151 0 b 174 1 160 0 166 0 b 392 158 272 14 346 71 b 405 207 400 174 405 190 b 359 287 405 236 389 265 b 261 325 328 308 294 315 b 168 413 216 340 181 366 b 166 426 167 418 166 423 b 176 438 166 432 167 436 b 199 441 183 441 190 441 b 310 393 238 441 295 422 b 334 370 317 376 325 370 b 363 386 343 370 353 379 b 422 445 386 402 408 420 b 426 458 425 449 426 454 b 422 469 426 462 425 465 b 274 546 395 518 333 546 b 161 503 232 546 190 531 b 86 405 132 472 108 439 b 71 347 75 387 71 367 b 112 256 71 312 85 279 b 209 215 141 232 176 226 b 284 168 238 206 266 197 b 300 131 291 157 300 144 b 298 120 300 127 298 122 b 278 107 294 109 285 108 b 262 108 271 107 266 108 l 259 108 b 114 157 200 107 156 125 b 96 181 104 163 96 170 l 96 184 b 102 202 96 190 102 196 b 96 209 102 204 101 207 b 63 194 82 215 72 204 b 7 109 42 168 26 138 b 0 86 3 101 0 94 b 13 60 0 78 4 68 b 151 0 53 23 101 0 z"},dynamicZ:{x_min:-42.73880183193087,x_max:331,y_min:0,y_max:328,ha:328,o:"m -45 0 b -6 16 -32 0 -17 10 b 3 20 -3 16 0 19 b 144 60 49 48 96 60 b 284 22 190 60 238 46 b 348 4 305 10 327 4 b 461 75 393 4 435 30 b 468 91 464 81 467 86 b 456 104 468 95 465 99 b 287 173 402 131 348 167 b 239 176 271 174 255 176 b 168 174 217 176 194 174 b 367 340 236 236 298 294 b 459 423 402 363 432 392 b 477 454 467 431 475 442 b 474 462 477 456 475 459 b 454 472 469 469 462 472 b 432 468 446 472 439 469 b 356 448 406 461 380 455 b 210 422 307 433 258 422 b 109 442 177 422 144 428 b 94 445 104 444 99 445 b 69 433 85 445 76 442 b 27 390 56 419 39 406 b -9 343 16 373 -17 357 b 63 311 3 320 36 314 l 78 311 b 132 307 95 308 114 307 b 240 314 168 307 203 311 l 193 271 b -37 50 117 196 19 145 b -59 7 -46 36 -69 20 b -45 0 -55 3 -50 0 z"},ornamentTrill:{x_min:1,x_max:551,y_min:-18,y_max:539,ha:557,o:"m 321 612 b 190 602 278 605 235 605 l 190 638 b 187 693 190 652 190 667 b 161 776 184 717 193 776 b 137 747 150 776 137 766 b 130 654 135 716 131 685 l 130 596 l 52 588 b 4 539 23 585 7 570 b 1 477 3 530 1 500 b 3 448 1 461 3 448 l 3 452 b 53 432 6 436 23 432 b 134 435 75 432 102 433 b 151 117 138 328 147 223 b 170 13 153 82 157 46 b 209 -26 179 -10 193 -26 b 222 -22 213 -26 217 -24 b 269 -17 233 -16 253 -27 b 343 135 325 19 346 66 b 343 158 343 147 344 147 b 323 192 341 171 337 187 b 291 176 311 194 300 184 l 264 148 b 229 131 261 145 238 131 b 212 170 209 131 213 154 b 194 438 203 259 199 348 l 272 442 b 284 452 276 441 279 441 b 305 462 287 461 295 462 l 312 462 b 346 477 325 462 340 464 b 366 560 357 503 366 531 b 321 612 366 598 356 618 z m 759 588 b 711 560 749 592 733 570 b 588 500 671 541 631 521 b 583 533 586 514 586 524 b 560 576 577 549 577 572 b 517 550 541 582 528 564 b 416 423 482 508 452 462 b 382 353 392 397 384 370 b 387 305 380 341 386 318 b 392 275 389 295 392 285 b 409 243 393 262 393 243 b 431 262 419 243 425 255 b 521 373 459 298 488 333 b 523 354 521 366 523 360 b 520 337 523 346 521 340 b 508 295 513 323 508 310 b 530 102 508 279 524 122 b 549 66 533 88 530 66 b 577 99 563 66 572 84 b 580 131 580 109 580 121 l 580 302 b 600 347 580 318 582 337 b 701 392 632 364 665 384 b 793 518 785 409 793 435 b 759 588 793 559 785 576 z"},ornamentTurn:{x_min:0,x_max:574,y_min:0,y_max:312,ha:312,o:"m 651 0 b 816 132 727 0 796 46 b 827 223 822 163 827 193 b 808 340 827 262 821 301 b 665 449 785 408 729 449 b 636 446 655 449 647 448 b 589 384 600 441 586 422 l 602 300 b 611 285 603 291 605 285 b 621 288 613 285 616 287 b 655 295 632 294 644 295 b 711 284 674 295 693 289 b 773 209 740 275 773 232 b 697 156 773 184 734 160 b 664 154 685 154 675 154 b 579 168 635 154 608 158 b 455 242 533 186 495 213 b 261 400 387 291 331 354 b 160 432 225 422 190 432 b 20 328 98 432 49 392 b 0 229 6 295 0 262 b 30 71 0 176 14 122 b 144 3 43 29 96 3 b 168 6 153 3 160 4 b 248 122 233 20 248 39 b 246 147 248 124 248 135 b 226 177 243 164 239 177 b 206 170 220 177 215 174 b 144 154 186 158 166 154 b 79 170 122 154 101 160 b 53 202 62 179 53 189 b 60 228 53 209 55 217 b 161 281 81 261 120 281 b 183 279 168 281 176 281 b 325 190 243 269 284 229 b 572 16 402 124 475 53 b 651 0 598 6 625 0 z"},ornamentTurnSlash:{x_min:0,x_max:574,y_min:-106,y_max:405,ha:511,o:"m 441 -153 b 456 -60 455 -118 456 -89 b 455 81 455 -14 455 33 b 572 14 491 55 530 30 b 651 -1 598 4 625 -1 b 816 131 727 -1 796 45 b 827 222 822 161 827 192 b 808 338 827 261 821 300 b 665 448 785 406 729 448 b 636 445 655 448 647 446 b 589 383 600 439 586 420 l 602 298 b 611 284 603 289 605 284 b 621 287 613 284 616 285 b 655 294 632 292 644 294 b 711 282 674 294 693 288 b 773 207 740 274 773 230 b 697 154 773 183 734 158 b 664 153 685 153 675 153 b 579 167 635 153 608 157 b 455 240 533 183 495 212 b 454 242 455 240 455 242 l 454 337 b 452 488 454 386 452 439 b 433 570 452 517 451 546 b 425 583 431 575 431 583 l 422 583 b 403 566 415 582 408 573 b 402 546 400 560 402 553 l 397 287 b 261 399 353 325 310 366 b 160 431 225 420 190 431 b 20 327 98 431 48 390 b 0 228 6 294 0 261 b 30 69 0 174 14 121 b 144 1 43 27 96 1 b 168 4 153 1 160 3 b 248 121 233 19 248 37 b 246 145 248 122 248 134 b 226 176 243 163 239 176 b 206 168 220 176 215 173 b 144 153 186 157 166 153 b 79 168 122 153 101 158 b 53 200 62 177 53 187 b 60 226 53 207 55 216 b 161 279 79 259 120 279 b 183 278 168 279 176 279 b 325 189 243 266 282 226 b 395 130 348 168 372 148 b 393 71 393 109 393 89 b 441 -153 390 -6 402 -78 z"},ornamentMordent:{x_min:0,x_max:700,y_min:0,y_max:497,ha:497,o:"m 513 0 b 528 39 526 14 527 27 b 531 72 531 50 531 60 b 528 138 531 94 528 117 l 528 347 b 552 359 537 354 544 359 b 579 338 560 359 569 353 b 674 217 609 297 639 255 b 719 190 690 200 704 190 b 759 215 732 190 744 197 b 940 395 815 279 877 337 b 1001 490 968 422 986 455 b 1008 513 1004 495 1008 505 b 1002 524 1008 517 1007 521 b 968 516 994 530 978 524 b 960 508 965 513 963 510 b 798 356 900 464 848 410 b 778 341 791 347 783 341 b 757 354 772 341 765 346 b 661 475 720 392 690 432 b 611 517 644 504 629 517 b 563 498 598 517 583 511 b 527 471 550 490 539 481 l 527 570 b 492 716 526 619 523 671 b 472 677 480 704 472 694 b 465 399 474 585 468 491 b 439 366 456 387 448 376 b 384 320 415 336 399 320 b 330 367 369 320 354 336 b 325 376 328 369 327 373 b 226 490 291 413 265 456 b 189 505 213 500 202 505 b 157 491 177 505 167 500 b 0 229 75 420 0 346 b 1 202 0 220 0 212 b 22 215 12 203 16 209 b 124 327 55 252 89 289 b 147 343 132 337 140 343 b 171 323 156 343 164 336 b 266 197 196 276 232 236 b 337 157 291 170 314 157 b 410 207 361 157 386 174 b 461 274 428 229 444 252 b 462 166 461 238 461 202 b 513 0 465 108 487 55 z"},ornamentShortTrill:{x_min:0,x_max:747,y_min:0,y_max:243,ha:243,o:"m 379 0 b 428 14 395 0 410 4 b 474 56 445 26 461 39 b 552 157 500 89 526 122 b 566 168 556 163 560 168 b 575 157 569 168 572 166 b 664 36 592 107 628 72 b 733 1 685 13 710 1 b 802 35 757 1 780 13 b 1007 249 871 105 940 177 b 1067 324 1028 272 1054 295 b 1076 340 1068 330 1076 334 b 1073 346 1076 341 1076 343 b 1057 350 1068 348 1063 350 b 1047 347 1053 350 1050 350 b 1001 310 1031 336 1015 324 l 857 157 b 844 143 852 153 848 143 b 835 150 841 143 838 144 b 757 242 815 186 780 209 b 685 298 739 268 713 284 b 641 310 670 305 655 310 b 590 288 625 310 608 304 b 497 179 554 256 527 215 b 480 164 490 170 485 164 b 462 179 474 164 469 168 b 372 295 436 220 405 258 b 278 344 346 324 312 344 b 199 310 252 344 226 334 b 92 196 161 274 128 233 b 0 24 46 148 23 89 b 42 48 22 27 32 37 b 156 168 84 85 114 132 b 196 192 174 184 186 192 b 228 158 206 192 215 181 b 312 36 252 114 282 75 b 379 0 331 12 354 0 z"},ornamentTremblement:{x_min:0,x_max:982.17691453624,y_min:0,y_max:224,ha:224,o:"m 0 0 b 63 36 30 12 48 23 b 157 124 94 66 125 94 b 177 135 164 131 170 135 b 196 122 183 135 189 131 b 268 40 217 94 245 68 b 323 6 288 16 304 6 b 369 20 336 6 350 10 b 412 53 384 29 399 40 b 501 145 442 84 472 114 b 523 158 508 154 516 158 b 543 145 528 158 536 154 b 641 45 576 112 608 78 b 698 17 658 27 677 17 b 729 23 708 17 719 20 b 804 65 756 32 780 46 b 904 154 837 95 871 124 b 920 163 910 160 916 163 b 936 153 924 163 930 160 b 1024 60 965 121 996 92 b 1112 13 1053 29 1080 13 b 1184 39 1135 13 1158 22 b 1359 194 1248 84 1305 138 b 1413 301 1388 223 1403 261 b 1404 323 1417 315 1413 323 b 1391 320 1400 323 1395 321 b 1344 294 1375 314 1358 307 b 1224 186 1305 258 1269 216 b 1194 173 1212 179 1202 173 b 1165 193 1184 173 1175 179 b 1096 271 1145 222 1122 248 b 1001 318 1061 302 1031 318 b 903 268 969 318 937 301 b 806 186 871 239 841 210 b 782 174 796 179 789 174 b 756 193 773 174 765 180 b 652 291 729 232 693 266 b 596 308 634 302 615 308 b 530 278 573 308 552 298 l 415 168 b 393 157 408 161 400 157 b 373 171 387 157 380 161 b 305 245 353 197 330 222 b 248 276 285 266 266 278 b 189 245 229 276 210 266 b 81 144 156 209 120 174 b 0 0 33 109 26 56 z"},ornamentPrecompAppoggTrill:{x_min:-.11067192132025548,x_max:1066,y_min:-50,y_max:533.1706452421108,ha:583.1706452421108,o:"m 187 -46 b 213 -14 197 -37 204 -26 b 285 151 251 36 266 94 b 304 189 294 177 297 189 b 337 168 311 189 320 181 b 458 33 386 131 415 76 b 495 12 472 19 484 12 b 531 40 508 12 518 22 b 580 168 557 79 569 124 b 622 235 592 213 603 235 b 683 194 636 235 655 222 b 838 26 737 140 791 86 b 919 -33 860 -1 881 -39 b 984 53 960 -27 971 19 b 1022 156 998 86 1008 122 b 1054 190 1032 179 1041 190 b 1089 167 1063 190 1074 183 b 1208 32 1129 122 1171 78 b 1244 10 1221 17 1231 10 b 1273 22 1253 10 1263 14 b 1496 206 1352 78 1427 137 b 1535 310 1526 236 1535 272 b 1531 359 1535 325 1534 343 b 1496 343 1515 360 1506 351 l 1309 192 b 1269 167 1289 176 1279 167 b 1234 199 1260 167 1251 177 b 1122 324 1200 243 1168 289 b 1074 344 1106 337 1089 344 b 1014 301 1051 344 1030 328 b 952 144 985 252 971 197 b 933 121 946 128 940 121 b 910 137 927 121 920 125 b 850 210 888 161 870 186 b 687 369 799 266 750 325 b 631 390 665 383 647 390 b 567 327 602 390 580 369 b 527 199 554 284 543 242 b 508 168 520 179 514 168 b 482 192 503 168 495 177 b 353 328 444 240 405 292 b 312 343 338 338 324 343 b 266 297 292 343 276 327 b 204 125 248 239 232 180 b 143 79 193 102 173 79 b 92 122 117 79 105 102 b 81 154 86 131 84 143 b 48 423 59 242 50 333 b 45 544 46 464 45 504 b 53 730 45 606 48 668 b 40 768 55 744 52 766 b 13 730 19 770 14 747 b 0 514 7 658 -1 586 b 26 122 3 383 6 252 b 75 -36 35 66 40 10 b 134 -72 92 -59 112 -72 b 187 -46 151 -72 170 -63 z"},ornamentPrecompSlideTrillDAnglebert:{x_min:0,x_max:1088,y_min:-380,y_max:252,ha:632,o:"m 560 -539 b 439 -481 527 -497 484 -485 b 354 -461 409 -478 380 -477 b 131 -154 236 -389 161 -285 b 124 -98 127 -135 124 -117 b 196 55 124 -40 148 10 b 308 99 230 86 268 99 b 399 81 337 99 367 92 b 514 22 441 66 477 43 b 619 -30 567 -9 590 -30 b 719 17 642 -30 670 -16 b 861 131 769 52 818 88 b 899 150 874 144 887 150 b 936 117 913 150 926 138 b 965 43 948 94 956 68 b 1007 -1 973 24 978 -1 b 1048 30 1025 -1 1037 16 b 1070 65 1057 40 1064 52 b 1110 148 1084 92 1096 121 b 1145 190 1120 164 1120 190 b 1191 153 1169 192 1179 168 b 1256 29 1218 115 1231 68 b 1292 1 1267 10 1277 1 b 1320 10 1300 1 1309 4 b 1369 48 1339 19 1355 33 b 1515 196 1418 96 1464 148 b 1567 343 1558 238 1567 287 b 1555 363 1565 357 1562 363 b 1539 356 1551 363 1547 360 b 1433 268 1502 330 1466 301 b 1335 171 1401 236 1374 199 b 1310 163 1325 166 1318 163 b 1286 183 1302 163 1293 168 b 1218 311 1264 226 1247 272 b 1164 351 1200 337 1182 351 b 1110 308 1146 351 1128 337 b 1031 176 1084 265 1058 219 b 1015 161 1025 166 1021 161 b 999 179 1009 161 1005 167 b 955 279 985 213 973 248 b 913 307 943 300 930 307 b 887 302 904 307 896 305 b 852 281 874 298 863 291 b 693 167 804 236 747 204 b 612 140 667 150 639 140 b 549 157 592 140 570 145 b 403 220 503 181 452 202 b 271 248 360 236 315 248 b 179 229 239 248 209 242 b 0 -29 65 180 0 85 b 9 -104 0 -53 3 -78 b 397 -526 56 -317 183 -464 b 505 -547 432 -536 468 -547 b 560 -539 524 -547 541 -544 z"},ornamentPrecompSlideTrillBach:{x_min:0,x_max:1185,y_min:-380,y_max:465,ha:845,o:"m 624 -544 b 642 -528 638 -543 642 -537 b 639 -514 642 -524 642 -520 b 590 -444 629 -487 609 -467 b 523 -413 573 -422 553 -410 b 498 -415 514 -415 507 -415 b 399 -389 464 -415 431 -405 b 89 -157 281 -330 176 -255 b 72 -117 78 -144 72 -131 b 73 -101 72 -111 72 -107 b 187 186 91 3 147 91 b 246 230 200 216 222 230 b 300 209 262 230 281 223 b 456 48 359 163 403 101 b 540 -10 494 10 518 -10 b 625 59 566 -10 589 13 b 690 148 648 88 668 118 b 711 167 697 160 704 167 b 733 153 719 167 724 163 b 844 14 769 105 808 60 b 903 -42 873 -23 886 -42 b 973 -1 919 -42 937 -27 b 1008 33 986 7 996 20 b 1048 81 1021 48 1035 65 b 1050 37 1048 66 1050 52 b 1047 -24 1050 17 1048 -3 b 1038 -275 1038 -108 1040 -192 l 1037 -289 b 1045 -302 1037 -295 1038 -301 b 1068 -284 1056 -304 1064 -292 b 1084 -242 1076 -271 1081 -256 b 1099 -109 1096 -199 1099 -154 b 1106 158 1099 -19 1106 71 b 1128 187 1113 167 1120 177 b 1168 223 1143 212 1155 223 b 1210 193 1179 223 1191 213 b 1220 183 1214 190 1215 186 b 1329 36 1261 138 1292 84 b 1374 7 1345 16 1358 7 b 1411 20 1384 7 1395 12 b 1479 84 1437 37 1459 59 b 1610 235 1521 135 1564 186 b 1706 403 1655 282 1695 334 b 1614 346 1663 400 1637 373 b 1464 170 1564 287 1515 228 b 1440 150 1453 156 1447 150 b 1414 173 1433 150 1426 158 b 1283 336 1371 228 1333 288 b 1220 366 1261 356 1240 366 b 1148 318 1194 366 1169 350 b 1103 255 1133 297 1119 275 b 1097 301 1102 271 1100 285 b 1099 334 1099 312 1099 324 b 1092 428 1099 367 1094 397 b 1071 647 1087 501 1079 575 b 1058 670 1071 657 1071 670 b 1035 648 1047 670 1038 661 b 1018 516 1024 605 1015 560 b 1041 203 1025 412 1037 307 b 1043 180 1041 196 1043 187 b 992 127 1027 161 1009 143 b 965 111 981 117 972 111 b 936 132 955 111 946 120 b 829 268 900 179 867 225 b 760 317 801 301 780 317 b 691 258 739 317 719 297 b 605 147 664 219 641 177 b 589 138 599 141 593 138 b 572 148 583 138 579 141 b 415 317 520 206 467 261 b 327 372 390 343 366 366 b 300 373 317 373 308 373 b 154 295 239 373 190 348 b 55 138 120 243 85 192 b 0 -53 22 79 0 13 b 160 -317 0 -156 49 -252 b 209 -354 177 -327 192 -343 b 510 -531 305 -419 397 -495 b 593 -547 537 -540 564 -547 b 624 -544 603 -547 613 -546 z"},ornamentPrecompTrillSuffixDandrieu:{x_min:0,x_max:1003,y_min:-20,y_max:521,ha:541,o:"m 791 -16 b 844 33 812 -3 829 14 b 981 271 900 107 937 190 b 994 288 984 278 985 288 b 1009 269 1004 288 1007 278 b 1077 112 1034 217 1051 163 b 1158 43 1103 62 1129 43 b 1231 69 1179 43 1204 55 b 1348 189 1280 98 1315 143 b 1444 451 1407 271 1444 357 b 1431 547 1444 482 1440 514 b 1188 750 1401 665 1299 750 b 1158 747 1178 750 1168 749 b 1079 684 1119 742 1089 727 b 1063 632 1076 665 1071 648 b 1056 609 1058 622 1056 615 b 1071 599 1056 602 1060 599 b 1086 600 1076 599 1080 600 b 1130 605 1102 603 1116 605 b 1244 569 1171 605 1210 595 b 1349 346 1322 511 1349 433 b 1348 312 1349 334 1349 324 b 1289 197 1345 266 1325 228 b 1238 174 1270 181 1253 174 b 1188 215 1220 174 1202 187 b 1145 308 1172 245 1159 276 b 1096 413 1129 343 1120 382 b 1053 438 1084 431 1068 438 b 1011 413 1038 438 1022 431 b 955 324 989 384 971 354 b 850 127 920 258 886 192 b 838 112 847 121 842 112 b 824 128 828 109 825 121 b 802 193 815 150 809 171 b 730 400 779 264 766 337 b 688 431 719 420 703 431 b 647 403 674 431 660 422 b 606 338 632 383 619 361 b 513 167 575 282 546 223 b 480 122 503 150 498 122 b 452 171 459 122 459 153 b 420 255 442 199 432 228 b 337 408 399 308 380 364 b 276 436 317 428 297 436 b 215 397 253 436 230 423 b 23 72 148 289 81 184 b 0 29 17 59 0 40 b 7 17 0 23 1 20 b 59 58 26 7 46 39 b 190 276 111 127 143 206 b 216 301 202 292 207 301 b 245 279 223 301 232 294 b 311 166 278 248 292 206 b 367 16 331 117 346 65 b 402 -19 377 -7 387 -19 b 438 -4 412 -19 423 -13 b 518 88 474 17 495 55 b 628 284 562 150 592 216 b 657 223 648 266 651 243 b 717 13 677 154 696 84 b 755 -29 726 -16 737 -29 b 791 -16 765 -29 776 -24 z"},ornamentPrecompDoubleCadenceUpperPrefix:{x_min:0,x_max:1246,y_min:-30,y_max:296.0302860502196,ha:326.0302860502196,o:"m 360 -43 b 559 59 445 -43 503 7 b 698 236 615 111 652 179 b 714 248 704 243 710 248 b 727 235 719 248 721 243 l 848 42 b 883 12 860 22 870 12 b 917 32 891 12 903 19 b 946 62 927 42 939 50 b 1037 192 972 108 1009 147 b 1057 210 1044 204 1051 210 b 1076 190 1063 210 1068 203 l 1176 12 b 1215 -19 1188 -9 1201 -19 b 1250 -6 1225 -19 1237 -14 b 1284 27 1264 3 1274 16 b 1380 190 1323 78 1351 135 b 1395 210 1384 197 1385 210 b 1413 190 1405 210 1410 197 b 1508 40 1436 134 1467 85 b 1564 3 1529 14 1547 3 b 1617 32 1580 3 1597 12 b 1767 238 1678 92 1719 167 b 1794 310 1781 259 1791 282 b 1752 294 1776 317 1764 304 b 1656 164 1711 258 1689 206 b 1629 144 1646 151 1637 144 b 1603 161 1620 144 1613 150 b 1502 315 1562 207 1525 258 b 1452 357 1490 344 1470 357 b 1397 320 1431 357 1411 344 b 1316 170 1368 271 1345 219 b 1280 127 1306 154 1303 127 b 1244 171 1256 127 1254 154 b 1145 337 1210 226 1179 282 b 1110 363 1135 354 1122 363 b 1070 338 1097 363 1084 354 b 1050 311 1063 330 1057 320 b 959 181 1017 271 992 223 b 939 167 950 173 945 167 b 920 184 933 167 927 173 b 818 343 887 238 852 291 b 759 395 795 377 778 395 b 701 344 742 395 724 377 b 698 338 700 341 700 340 b 544 154 652 272 605 207 b 412 98 501 117 458 98 b 304 130 377 98 341 108 b 95 373 204 187 144 275 b 58 426 85 393 82 428 b 19 366 26 426 26 389 b 0 307 13 346 0 327 b 4 287 0 300 1 294 b 174 36 49 194 91 102 b 360 -43 230 -9 289 -43 z"},ornamentPrecompDoubleCadenceUpperPrefixTurn:{x_min:0,x_max:1226,y_min:-237,y_max:436,ha:673,o:"m 1279 -341 b 1293 -252 1293 -307 1295 -278 b 1277 36 1287 -156 1282 -59 l 1273 118 b 1318 176 1289 137 1303 157 b 1349 203 1332 193 1342 203 b 1378 168 1359 203 1367 192 b 1456 35 1401 122 1428 78 b 1511 -12 1476 3 1493 -12 b 1568 23 1526 -12 1544 0 b 1597 53 1578 32 1588 42 b 1705 186 1629 101 1669 143 b 1761 284 1728 216 1751 246 b 1765 300 1763 288 1765 295 b 1763 307 1765 302 1765 305 b 1737 302 1754 311 1744 308 b 1718 287 1729 298 1725 292 b 1598 145 1673 245 1637 194 b 1578 130 1590 135 1584 130 b 1557 147 1571 130 1565 135 b 1447 321 1516 202 1488 265 b 1403 351 1433 341 1417 351 b 1358 323 1388 351 1372 341 b 1269 209 1329 285 1299 248 b 1254 521 1264 314 1259 418 b 1228 616 1253 554 1247 588 b 1218 628 1224 621 1223 628 l 1215 628 b 1201 613 1210 626 1202 619 b 1200 600 1200 609 1200 605 l 1200 586 b 1211 348 1204 507 1207 428 b 1217 166 1214 288 1215 226 b 1202 181 1212 168 1208 174 b 1094 334 1168 233 1130 284 b 1048 366 1079 356 1064 366 b 1004 331 1034 366 1018 354 b 904 154 969 275 930 220 b 873 202 887 171 880 187 b 778 356 845 256 819 311 b 737 379 763 372 750 379 b 698 353 724 379 711 370 l 621 232 b 415 114 570 154 495 114 b 302 138 377 114 340 121 b 73 400 187 192 117 284 b 55 420 69 415 62 420 b 42 410 50 420 45 416 b 0 292 23 373 0 334 b 4 262 0 282 1 272 b 168 39 32 168 92 99 b 359 -26 225 -6 292 -26 b 585 76 446 -26 530 10 b 668 202 616 115 641 160 b 693 228 680 219 687 228 b 720 203 700 228 707 219 b 801 63 752 160 775 111 b 844 7 812 42 818 7 b 910 66 877 6 894 39 b 923 94 916 75 919 85 b 995 219 945 137 968 179 b 1025 184 1009 210 1017 197 b 1119 56 1054 141 1087 98 b 1166 20 1138 32 1152 20 b 1215 50 1181 20 1195 30 b 1221 56 1217 52 1218 55 b 1228 -163 1223 -17 1225 -89 b 1279 -341 1231 -223 1251 -278 z"},ornamentPrecompTrillLowerSuffix:{x_min:0,x_max:833,y_min:-309,y_max:319,ha:628,o:"m 778 -444 b 801 -445 785 -444 793 -445 b 1037 -338 894 -445 969 -397 b 1200 37 1149 -240 1200 -109 b 1084 406 1200 171 1172 300 b 1024 444 1064 431 1043 444 b 960 390 999 444 978 426 b 841 163 923 314 886 236 b 812 128 832 150 827 128 b 786 167 796 130 793 153 b 660 418 744 251 716 341 b 599 459 639 445 619 459 b 541 410 577 459 557 444 b 439 197 507 340 474 269 b 422 179 435 190 435 179 b 338 393 392 251 379 328 b 275 439 320 423 298 439 b 212 396 253 439 230 425 b 71 219 170 333 128 268 b 0 45 17 173 16 112 b 68 98 32 62 50 78 b 194 264 112 150 153 209 b 230 292 209 282 219 292 b 264 261 240 292 251 282 b 274 242 268 255 269 248 b 346 46 304 179 325 112 b 376 10 351 32 354 10 b 412 35 392 10 403 22 b 452 107 429 56 441 82 b 541 291 481 168 511 230 b 556 307 547 302 552 307 b 573 295 562 307 567 302 b 624 217 595 272 611 246 b 721 1 657 145 685 72 b 755 -27 732 -19 742 -27 b 786 -16 765 -27 775 -24 b 857 73 819 7 840 39 b 952 256 887 134 920 194 b 978 289 963 279 969 289 b 1009 262 985 289 994 281 b 1030 235 1017 253 1024 245 b 1110 -4 1071 161 1099 81 b 1116 -68 1113 -26 1116 -48 b 1009 -243 1116 -140 1090 -200 b 848 -291 956 -272 901 -291 b 730 -261 809 -291 770 -282 b 696 -248 714 -252 703 -248 b 671 -284 684 -248 678 -258 l 662 -312 b 657 -357 658 -330 657 -344 b 744 -439 657 -403 683 -425 z"},brassScoop:{x_min:-.4444444444444445,x_max:312,y_min:-390,y_max:28,ha:418,o:"m 0 -562 b 393 -256 171 -504 307 -412 b 449 -39 431 -189 449 -115 b 448 -1 449 -26 449 -14 b 433 40 446 14 448 40 b 408 -3 410 40 412 14 b 396 -66 403 -23 402 -46 b 45 -397 346 -243 209 -337 b 0 -451 13 -409 1 -423 b 0 -562 -1 -485 0 -520 z"},brassDoitMedium:{x_min:-.32815253965710617,x_max:476.21251177608565,y_min:-50,y_max:333.1535583875376,ha:383.1535583875376,o:"m 16 -72 b 27 -71 19 -72 23 -72 b 215 -33 89 -56 153 -48 b 521 114 327 -7 435 35 b 685 432 615 199 691 295 b 670 480 684 449 688 475 b 642 441 654 482 648 456 b 403 183 599 321 513 240 b 79 89 301 130 192 105 b 0 -1 -12 76 0 76 b 0 -50 0 -17 1 -33 b 16 -72 0 -65 3 -72 z"},brassFallLipShort:{x_min:0,x_max:298,y_min:-344,y_max:65,ha:409,o:"m 396 -495 b 420 -461 412 -487 418 -474 b 429 -382 428 -435 429 -409 b 426 -330 429 -364 428 -347 b 285 -6 410 -209 356 -104 b 98 94 239 59 173 94 b 39 86 79 94 58 92 b 0 49 20 81 0 73 l 0 -52 b 10 -69 0 -62 1 -69 b 20 -68 13 -69 16 -69 b 88 -56 45 -59 66 -56 b 261 -160 156 -56 213 -95 b 396 -495 333 -259 382 -369 z"},brassLiftMedium:{x_min:0,x_max:807,y_min:0,y_max:838,ha:838,o:"m 50 0 b 55 1 52 0 53 0 b 58 23 65 7 59 16 b 55 58 56 36 55 48 b 130 117 55 99 75 112 b 220 213 202 121 220 141 b 315 308 220 289 238 308 l 336 308 b 408 380 393 310 406 321 b 461 452 409 438 416 452 b 485 451 468 452 477 451 b 569 510 531 448 556 464 b 573 543 572 520 572 531 b 657 619 580 605 595 618 b 698 621 670 619 684 619 b 788 700 749 625 778 649 b 798 778 792 726 793 752 b 873 857 806 841 809 845 b 985 950 927 867 973 887 b 1084 1047 1002 1035 1004 1034 b 1162 1128 1133 1056 1162 1087 b 1146 1182 1162 1145 1158 1164 b 1125 1207 1140 1191 1136 1207 l 1122 1207 b 1110 1191 1113 1205 1110 1198 b 1112 1174 1110 1185 1112 1178 b 1048 1110 1109 1126 1096 1113 b 1028 1109 1043 1110 1035 1109 b 939 1022 969 1102 948 1081 b 845 922 929 949 917 936 b 746 812 773 909 753 886 b 744 780 744 802 744 791 b 635 681 737 700 717 683 b 524 583 553 680 536 665 b 439 510 514 520 503 510 b 357 431 377 510 360 492 l 357 406 b 314 364 356 379 343 364 b 238 361 288 364 264 364 b 173 300 202 357 180 334 b 167 245 168 281 167 262 b 105 174 166 192 157 180 b 75 171 95 173 85 171 b 6 112 30 166 14 153 b 0 73 1 98 0 85 b 37 10 0 45 13 26 b 50 0 42 7 46 0 z"},brassFallRoughMedium:{x_min:0,x_max:791,y_min:0,y_max:819,ha:819,o:"m 1117 0 b 1139 101 1129 26 1139 71 b 1138 121 1139 109 1139 115 b 1084 193 1125 171 1110 193 b 1044 183 1073 193 1060 189 b 1022 177 1035 179 1028 177 b 1007 209 1012 177 1008 186 b 876 324 1004 292 959 330 b 799 317 850 321 825 320 b 759 354 772 314 755 320 b 760 373 760 360 760 366 b 759 392 760 379 760 384 b 681 477 753 451 730 477 b 654 474 672 477 664 475 b 606 467 638 471 622 468 b 586 465 599 465 592 465 b 564 481 570 465 564 469 b 569 505 564 487 566 495 b 575 553 572 521 575 537 b 572 585 575 564 573 575 b 481 665 560 657 539 668 b 412 665 458 664 435 665 b 382 690 392 667 382 672 b 383 700 382 693 383 696 b 386 773 387 724 387 749 b 297 858 382 828 351 857 b 229 861 274 858 251 858 b 190 897 207 863 193 871 b 163 1012 186 936 180 976 b 79 1084 145 1050 124 1084 b 66 1083 75 1084 71 1083 b 43 1096 49 1081 43 1087 b 48 1112 43 1100 45 1106 b 53 1130 52 1119 53 1125 b 39 1169 53 1145 45 1158 b 26 1179 36 1175 30 1179 b 16 1171 22 1179 17 1176 b 0 1103 10 1149 0 1126 b 9 1067 0 1092 1 1079 b 91 1021 26 1031 52 1018 b 145 978 122 1024 141 1011 b 156 913 147 956 151 935 b 291 795 170 831 210 795 b 346 768 337 795 346 796 b 344 743 346 760 344 753 b 343 716 344 733 343 724 b 455 600 343 651 390 602 b 505 605 471 599 490 605 b 528 598 514 605 523 603 b 536 579 534 592 536 586 b 524 523 536 562 526 541 b 523 505 524 517 523 511 b 621 405 523 442 560 405 b 639 406 626 405 634 406 b 677 413 652 408 664 410 b 701 416 687 415 696 416 b 721 392 716 416 721 410 b 720 373 721 386 720 380 b 831 255 714 301 759 252 b 897 261 854 255 876 261 b 926 262 909 261 919 262 b 969 197 963 262 965 252 b 971 184 969 193 971 189 b 1031 115 979 137 998 115 b 1071 122 1043 115 1056 118 b 1096 130 1079 125 1086 127 b 1087 59 1094 107 1087 82 b 1117 0 1087 37 1094 17 z"},brassBend:{x_min:0,x_max:381,y_min:0,y_max:367,ha:367,o:"m 298 0 b 472 50 359 0 418 14 b 537 135 501 71 530 92 b 543 216 543 163 543 190 l 543 266 b 544 308 543 281 543 295 b 549 433 546 354 549 395 b 543 507 549 459 547 482 b 533 528 541 516 544 528 b 511 508 524 528 514 520 b 508 478 510 498 508 488 b 504 318 507 425 504 372 b 505 264 504 300 505 282 b 446 181 505 220 484 199 b 294 150 396 160 344 150 b 92 194 226 150 158 167 b 45 269 62 207 45 230 b 46 359 46 300 46 328 b 37 497 46 405 45 451 b 27 523 36 507 37 523 b 4 498 14 524 6 513 b 3 481 3 492 3 487 b 0 409 1 456 0 433 b 4 228 0 348 4 288 b 3 177 4 210 4 194 b 68 53 1 125 20 84 b 200 10 108 27 154 17 b 298 0 233 4 266 0 z"},brassMuteClosed:{x_min:0,x_max:274,y_min:0,y_max:260,ha:260,o:"m 203 0 b 209 1 206 0 207 0 b 216 13 215 4 216 9 l 215 27 l 215 153 b 216 161 216 156 216 158 b 372 164 268 163 318 164 b 395 184 383 164 395 166 l 395 189 b 357 229 392 209 386 229 b 219 228 311 229 265 228 l 223 310 b 209 357 225 328 219 344 b 189 374 203 364 197 374 b 184 373 187 374 186 373 b 177 359 179 372 177 366 l 177 348 l 173 222 l 39 222 b 0 206 12 222 0 219 b 10 174 0 199 3 189 b 46 157 19 157 30 157 b 108 160 68 158 88 160 b 171 161 130 161 150 161 l 167 58 b 184 16 167 40 171 26 b 203 0 192 12 196 0 z"},brassMuteOpen:{x_min:1,x_max:313.01193341111656,y_min:0,y_max:309,ha:309,o:"m 265 0 b 451 189 363 7 452 88 l 451 215 b 348 383 441 285 405 343 b 209 445 288 426 248 445 b 84 379 168 445 132 420 b 69 364 79 373 73 369 b 1 213 30 323 1 275 b 230 0 1 88 94 0 z m 210 62 b 128 73 181 62 154 66 b 40 171 71 91 42 125 b 52 226 40 187 45 206 b 197 374 79 295 130 344 b 228 382 207 380 217 382 b 300 361 252 382 276 370 b 374 308 328 350 353 331 b 410 223 397 284 410 253 b 393 163 410 202 405 181 b 210 62 354 91 288 63 z"},brassFlip:{x_min:0,x_max:402,y_min:0,y_max:361,ha:361,o:"m 579 0 b 511 153 579 68 557 117 b 52 504 359 271 206 387 b 29 520 45 510 39 520 b 20 517 26 520 23 518 b 0 477 3 510 0 494 l 0 125 b 17 20 1 92 1 56 b 40 84 37 40 40 60 b 42 287 40 151 42 219 l 42 363 z"},brassJazzTurn:{x_min:0,x_max:646,y_min:0,y_max:212,ha:212,o:"m 310 0 b 367 33 327 0 344 10 b 389 55 374 40 382 49 b 490 145 423 85 456 114 b 507 154 495 151 501 154 b 524 144 513 154 517 151 b 598 72 547 120 575 98 b 700 24 625 42 662 24 b 765 43 721 24 744 30 b 893 147 812 72 855 105 b 930 212 910 166 923 186 b 912 215 923 213 917 215 b 871 199 896 215 883 209 b 812 153 852 183 832 167 b 789 144 805 148 796 144 b 773 156 782 144 776 147 b 691 251 757 199 720 222 b 603 301 658 282 631 301 b 527 258 580 301 556 288 b 420 156 494 222 455 190 b 399 143 412 147 405 143 b 377 157 392 143 386 147 b 259 282 340 200 300 242 b 219 305 245 298 232 305 b 177 279 204 305 192 297 b 55 127 137 228 95 177 b 0 52 36 104 20 79 b 14 50 6 50 10 50 b 53 66 32 50 45 58 b 115 131 75 88 98 108 b 135 148 124 143 130 148 b 157 132 141 148 148 143 b 252 33 186 96 219 65 b 310 0 275 12 292 0 z"},brassSmear:{x_min:0,x_max:334,y_min:0,y_max:151,ha:151,o:"m 321 0 b 475 125 390 0 436 43 b 481 143 478 131 481 137 b 475 154 481 147 480 151 b 449 148 468 158 458 154 b 395 132 432 137 413 132 b 343 140 377 132 360 137 b 229 194 301 148 266 173 b 168 217 206 209 186 217 b 109 192 148 217 130 209 b 0 26 59 148 32 89 b 59 63 32 29 45 48 b 98 84 72 78 84 84 b 130 73 108 84 118 81 b 213 26 157 58 183 37 b 321 0 255 9 289 0 z"},stringsDownBow:{x_min:0,x_max:306,y_min:-.09607201951262866,y_max:366,ha:366.09607201951263,o:"m 405 0 b 425 17 413 -1 420 9 b 439 66 435 32 439 48 b 441 268 439 137 441 202 b 436 412 441 314 439 361 l 435 413 b 423 469 435 436 431 456 b 344 508 406 501 373 501 b 204 527 298 520 251 527 b 60 498 156 527 108 518 b 7 438 32 485 10 468 l 7 426 b 4 337 7 396 7 367 b 0 140 0 272 0 206 b 1 42 0 107 0 73 b 13 3 1 27 -3 4 b 40 39 29 3 35 24 b 42 53 42 43 40 49 b 49 141 48 84 49 112 b 48 215 49 167 48 192 b 49 252 48 228 48 240 l 49 312 b 130 343 72 331 99 340 b 206 347 156 346 180 347 b 372 314 262 347 318 338 l 390 307 l 390 245 b 390 138 392 212 390 176 b 397 23 390 101 392 62 b 405 0 399 14 393 1 z"},stringsUpBow:{x_min:0,x_max:219.2842808242076,y_min:0,y_max:489,ha:489,o:"m 151 0 b 184 42 170 12 180 26 b 297 554 223 212 261 382 b 315 690 305 598 318 645 b 304 704 315 697 311 704 b 276 670 288 704 282 697 b 157 131 236 490 196 311 l 157 144 b 73 526 134 276 104 396 b 30 677 60 576 52 638 b 13 694 26 684 22 694 b 0 674 9 694 0 691 l 0 671 b 10 603 3 649 6 626 b 105 174 42 461 72 317 b 150 0 117 117 128 58 z"},stringsHarmonic:{x_min:0,x_max:191,y_min:0,y_max:202,ha:202,o:"m 143 0 b 275 122 217 0 275 53 b 127 291 275 206 202 291 b 0 154 63 291 0 222 b 143 0 0 76 71 0 z m 122 68 b 43 105 89 66 59 75 b 39 124 40 111 39 117 b 79 199 39 148 56 180 b 145 226 101 216 122 226 b 199 210 163 226 180 220 b 235 150 223 196 235 173 b 203 92 235 128 225 107 b 122 68 181 76 150 68 z"},pluckedSnapPizzicatoAbove:{x_min:0,x_max:201,y_min:0,y_max:325,ha:325,o:"m 171 0 b 289 99 240 0 289 45 b 258 183 289 130 274 156 b 174 269 236 217 203 240 l 174 408 b 174 429 174 415 176 422 b 131 468 168 451 153 468 b 117 451 120 468 117 461 b 118 429 117 444 118 435 b 115 307 117 389 115 347 b 0 166 59 295 0 223 b 171 0 0 85 89 0 z m 134 55 b 52 131 84 55 52 85 b 115 233 52 179 81 209 b 114 192 114 220 114 206 b 174 120 114 137 114 137 l 174 228 b 233 148 200 207 223 183 b 236 130 235 143 236 135 b 197 72 236 105 223 85 b 134 55 177 60 157 55 z"},pluckedSnapPizzicatoBelow:{x_min:0,x_max:211,y_min:0,y_max:307,ha:307,o:"m 145 7 b 163 0 153 3 158 0 b 173 23 170 0 173 7 l 173 140 l 170 140 l 170 163 l 171 163 b 206 170 179 164 193 166 b 304 287 264 186 304 233 b 281 354 304 308 297 333 b 118 442 240 412 186 439 b 0 324 69 442 0 370 b 115 176 0 266 55 202 l 115 56 b 145 7 114 33 125 19 z m 115 220 b 62 256 92 223 73 230 b 53 292 56 269 53 281 b 78 344 53 311 60 328 b 168 384 105 372 135 384 b 213 376 183 384 199 382 b 253 321 239 366 253 346 b 246 291 253 311 251 301 b 170 226 230 256 203 236 l 170 258 b 148 305 171 278 163 292 b 128 315 143 310 135 315 l 124 315 b 115 301 117 314 115 308 z"},pluckedLeftHandPizzicato:{x_min:0,x_max:271,y_min:0,y_max:284,ha:284,o:"m 213 0 b 223 14 222 0 223 7 b 222 35 223 22 222 29 l 222 176 b 373 170 272 174 323 170 b 390 180 382 170 390 171 l 390 184 b 347 232 386 207 382 232 b 219 238 307 233 266 235 l 219 364 b 171 409 219 395 193 409 b 156 393 160 409 156 402 b 158 370 156 384 158 376 l 158 240 b 16 239 115 240 66 239 b 0 226 7 239 0 238 l 0 223 b 50 179 1 203 29 179 b 158 177 86 179 122 179 l 158 63 b 161 29 158 52 158 40 b 213 0 166 -1 194 1 z"},keyboardPedalPed:{x_min:0,x_max:944,y_min:-13,y_max:550,ha:563,o:"m 22 0 b 109 78 53 0 105 46 l 144 333 b 163 376 147 347 140 372 b 364 465 238 390 301 426 b 454 599 416 497 454 540 b 452 618 454 605 454 612 b 320 770 442 694 396 747 b 248 779 295 778 272 779 b 193 778 229 779 212 779 b 160 780 181 778 167 775 b 137 792 153 789 144 791 b 109 789 128 792 118 789 b 7 719 59 789 48 737 b 23 708 16 714 20 708 b 36 710 29 710 33 710 b 53 684 52 710 53 698 l 53 674 b 43 386 53 577 53 482 b 20 164 36 312 30 238 b 1 30 14 120 7 75 b 0 19 0 26 0 22 b 22 0 0 9 4 0 z m 171 425 b 156 442 160 425 156 429 b 157 475 157 452 157 464 b 164 602 161 517 164 560 b 161 698 164 635 163 667 b 184 729 161 720 167 729 l 193 729 b 348 563 278 719 348 641 b 346 539 348 554 347 547 b 171 425 328 459 229 422 z m 979 6 b 1008 13 986 6 995 9 b 1081 101 1047 29 1079 46 b 1116 449 1087 217 1104 333 b 1143 654 1123 518 1133 586 b 1148 685 1145 664 1148 675 b 1140 704 1148 693 1146 700 b 1107 716 1130 713 1119 716 b 1056 706 1092 716 1073 710 b 1037 671 1035 703 1038 685 b 1004 439 1025 595 1014 517 b 986 419 1001 428 999 419 b 979 419 985 419 982 420 b 935 426 965 423 949 425 b 795 376 884 426 838 405 b 664 153 714 323 664 249 b 665 130 664 145 665 138 b 753 29 671 65 704 29 b 815 40 773 29 792 33 b 975 147 873 65 923 101 b 965 45 971 108 968 76 b 979 6 963 17 966 6 z m 393 -17 b 634 145 494 16 579 52 b 638 160 636 151 638 156 b 625 168 638 166 634 168 b 621 167 624 168 622 168 b 524 118 582 164 544 160 b 495 79 517 104 505 92 b 435 33 471 49 452 33 b 380 96 416 33 397 55 b 369 145 373 114 369 131 b 442 225 369 186 395 213 b 468 232 451 228 459 229 b 654 344 539 255 606 285 b 677 395 667 360 677 376 b 672 415 677 402 675 408 b 612 459 661 442 639 455 b 589 461 602 461 592 461 b 348 328 500 461 409 408 b 269 120 302 268 269 199 b 379 -19 269 45 318 -19 b 393 -17 383 -19 389 -19 z m 395 240 b 494 383 418 300 452 344 l 521 405 b 544 419 528 409 536 418 b 554 415 547 419 550 418 b 570 383 564 406 570 396 l 570 379 b 552 331 570 360 562 344 b 395 240 511 285 462 253 z m 827 89 b 792 111 815 89 804 96 b 766 204 775 131 766 158 b 845 360 772 256 799 314 b 871 372 854 369 863 372 b 897 366 880 372 888 369 b 978 279 942 353 963 320 b 976 259 981 272 981 265 b 858 104 942 203 909 147 b 827 89 847 94 837 89 z m 1282 12 b 1336 35 1303 14 1320 23 b 1359 71 1351 45 1359 58 b 1338 102 1359 82 1352 95 b 1254 130 1312 118 1284 130 b 1187 88 1223 130 1202 109 b 1178 65 1182 81 1178 72 b 1195 37 1178 55 1182 45 b 1282 12 1223 23 1253 19 z"},keyboardPedalUp:{x_min:0,x_max:436.6015132318337,y_min:0,y_max:461,ha:461,o:"m 330 0 b 334 1 331 0 333 0 b 340 12 338 4 340 7 l 338 26 b 340 264 338 105 338 184 b 526 95 400 206 461 148 b 559 71 536 88 547 71 b 564 72 560 71 563 71 b 580 121 580 79 580 102 l 580 127 b 543 203 585 158 573 184 b 472 259 518 219 495 238 l 445 285 b 590 292 494 288 541 291 b 622 318 609 294 618 302 b 628 359 625 331 626 346 b 586 402 632 393 621 405 b 464 395 546 399 504 396 l 559 491 b 567 524 567 500 567 510 b 564 543 567 527 567 536 b 539 596 559 563 560 590 b 494 564 521 600 508 577 b 340 413 442 514 390 464 l 340 560 b 287 664 340 600 321 632 b 271 518 274 612 272 566 b 268 445 269 494 269 469 b 117 569 219 488 168 530 b 96 579 109 575 102 579 b 85 560 89 579 85 573 b 124 446 85 518 82 477 b 209 380 153 426 181 403 b 45 374 154 377 99 376 b 0 324 9 374 0 359 b 63 266 0 265 1 265 b 144 272 89 269 117 272 l 196 272 b 108 193 167 246 138 219 b 60 135 76 164 60 151 b 99 73 60 121 73 105 b 104 68 101 72 102 71 b 114 58 107 60 111 58 b 130 66 120 58 124 62 b 259 186 173 107 217 145 b 256 117 259 163 256 140 b 311 13 256 72 271 37 b 330 0 317 10 323 0 z"},pictChokeCymbal:{x_min:1,x_max:147,y_min:0,y_max:242,ha:242,o:"m 79 4 b 207 158 153 32 192 88 b 212 200 210 173 212 187 b 143 336 212 253 187 298 b 98 348 131 344 115 348 b 4 295 60 348 16 327 b 1 276 1 289 1 282 b 9 249 1 266 3 258 b 121 183 35 206 72 183 b 156 186 132 183 144 183 b 26 53 134 115 91 73 b 7 39 13 49 7 45 b 19 20 7 33 12 27 b 59 0 30 9 43 0 b 79 4 65 0 72 1 z"},wiggleArpeggiatoUp:{x_min:-22,x_max:300,y_min:0,y_max:176,ha:176,o:"m 173 4 b 196 0 180 1 189 0 b 246 26 215 0 230 9 b 301 117 271 53 285 85 b 312 131 305 125 307 131 b 327 124 315 131 321 128 b 373 86 341 112 353 101 b 412 69 389 75 402 69 b 432 94 425 69 432 79 b 373 181 432 117 413 154 b 235 252 323 216 285 245 b 220 253 229 253 225 253 b 168 215 196 253 181 240 b 111 112 151 180 140 141 b 94 102 105 105 99 102 b 78 111 89 102 84 105 b 0 181 55 135 35 160 b -32 153 -20 194 -32 168 b 0 86 -32 124 -32 109 b 94 36 22 71 73 46 b 173 4 134 16 131 17 z"},arpeggiatoUp:{x_min:0,x_max:262,y_min:0,y_max:1459,ha:1459,o:"m 190 0 b 160 63 187 29 170 45 b 145 108 150 81 145 95 b 183 163 145 128 157 145 b 300 246 222 190 262 216 b 347 318 333 272 347 295 b 301 393 347 341 331 364 b 258 413 289 403 272 408 b 145 449 220 425 183 436 b 117 464 135 452 120 452 b 140 491 115 477 128 484 b 294 593 192 526 243 557 b 330 647 318 611 330 626 b 314 693 330 660 324 675 b 262 736 302 714 285 729 b 170 763 230 744 200 753 b 122 783 153 768 125 768 b 160 831 120 804 143 818 b 288 922 202 861 246 890 b 333 999 318 945 333 972 b 266 1083 333 1032 310 1064 b 189 1115 240 1094 215 1103 b 122 1178 145 1133 122 1153 b 168 1250 122 1200 138 1223 l 180 1257 b 269 1333 210 1283 240 1306 b 305 1405 294 1356 305 1381 b 284 1469 305 1426 298 1447 b 228 1525 269 1492 251 1511 b 183 1600 197 1545 183 1571 b 190 1640 183 1613 184 1626 b 197 1670 193 1650 194 1660 b 272 1735 213 1719 230 1735 b 295 1734 279 1735 287 1735 b 323 1732 305 1732 314 1732 b 350 1731 333 1732 341 1732 b 377 1742 369 1729 377 1732 b 370 1761 377 1747 374 1754 l 301 1898 b 217 2066 274 1954 248 2012 b 186 2101 204 2089 196 2101 b 154 2069 177 2101 167 2091 b 12 1824 105 1987 59 1907 b 0 1787 4 1810 0 1797 b 59 1744 0 1761 20 1745 b 160 1738 92 1744 125 1740 b 145 1692 156 1721 151 1706 b 135 1633 138 1672 135 1652 b 184 1518 135 1591 151 1552 b 229 1475 199 1503 213 1488 b 259 1431 249 1456 259 1444 b 229 1388 259 1420 249 1407 b 151 1325 203 1365 177 1345 b 105 1279 134 1310 118 1296 b 73 1202 84 1251 73 1227 b 108 1123 73 1176 85 1152 b 255 1031 148 1077 199 1051 b 282 1014 274 1025 282 1021 b 262 991 282 1008 275 1001 b 151 914 226 963 189 939 b 79 851 125 896 99 877 b 63 809 69 837 63 824 b 79 769 63 796 68 783 b 202 697 111 729 154 710 b 266 670 225 690 266 688 b 210 622 266 648 232 635 b 82 534 167 593 120 570 b 55 491 63 518 55 505 b 79 448 55 478 63 465 b 255 361 127 395 192 380 b 288 343 269 359 288 357 b 266 312 288 331 275 320 b 144 223 229 278 184 253 b 85 134 104 193 85 166 b 118 53 85 111 96 85 b 190 0 135 29 160 14 z"},arpeggiatoDown:{x_min:0,x_max:218,y_min:0,y_max:1440,ha:1440,o:"m 161 16 b 310 261 210 98 259 180 b 314 275 312 266 314 271 b 302 295 314 282 310 289 b 252 311 287 308 269 311 b 217 310 240 311 229 310 b 190 333 202 310 194 315 b 151 412 186 363 171 389 b 102 501 120 452 102 477 b 150 588 102 524 118 547 b 161 603 154 592 158 598 b 181 661 176 622 181 641 b 173 704 181 675 179 690 b 86 795 156 746 121 770 b 53 829 63 811 53 819 b 78 868 53 840 62 851 b 102 888 85 876 94 883 b 180 956 128 912 156 933 b 216 1028 204 979 216 1002 b 203 1081 216 1044 212 1061 b 115 1171 186 1123 148 1145 b 75 1221 88 1191 75 1207 b 114 1272 75 1237 88 1251 b 173 1308 132 1284 154 1296 b 226 1339 190 1318 209 1328 b 265 1405 253 1359 265 1380 b 258 1447 265 1418 264 1431 b 154 1541 242 1499 199 1521 b 109 1581 124 1555 109 1567 b 141 1627 109 1594 121 1608 b 204 1680 163 1646 184 1662 b 233 1742 223 1699 233 1719 b 226 1777 233 1752 230 1764 b 135 1862 210 1822 173 1840 b 104 1895 114 1875 104 1884 b 118 1930 104 1904 109 1914 b 192 2006 135 1961 161 1986 b 206 2029 203 2013 206 2022 b 192 2064 206 2040 197 2052 b 180 2074 187 2071 184 2074 b 156 2061 171 2074 163 2065 b 84 1983 125 2040 102 2013 b 65 1921 71 1961 65 1941 b 88 1853 65 1899 72 1876 b 171 1784 108 1820 138 1801 b 190 1764 184 1777 190 1770 b 174 1741 190 1757 184 1750 b 107 1683 153 1722 128 1704 b 68 1610 81 1659 68 1636 b 88 1548 68 1591 75 1571 b 177 1470 109 1512 141 1489 b 223 1431 209 1453 223 1443 b 179 1390 223 1420 209 1408 b 128 1361 163 1380 145 1371 b 71 1322 108 1348 88 1338 b 32 1253 45 1300 32 1277 b 48 1198 32 1236 37 1218 b 147 1090 71 1152 108 1120 b 174 1057 166 1076 174 1067 b 153 1022 174 1047 167 1037 b 109 982 140 1008 124 995 b 37 919 85 962 59 942 b 9 860 17 899 9 880 b 26 806 9 844 14 827 b 120 717 50 769 84 740 b 138 691 132 708 138 700 b 130 668 138 684 135 677 b 92 618 118 651 105 635 b 59 531 71 589 59 560 b 84 455 59 507 68 481 b 132 386 98 431 115 408 b 148 341 144 372 148 357 b 144 317 148 333 147 324 b 121 305 140 307 131 305 l 98 305 b 82 304 94 304 88 304 l 32 304 b 0 292 10 304 0 302 b 12 266 0 287 4 279 b 60 164 32 233 46 199 b 127 20 84 117 105 68 b 144 0 132 9 137 0 b 161 16 150 0 154 4 z"},repeat1Bar:{x_min:0,x_max:599.1057280164835,y_min:-250,y_max:175,ha:425,o:"m 216 98 b 255 75 236 84 246 75 b 291 104 265 75 274 85 b 323 147 304 117 327 125 b 289 215 323 168 314 184 b 238 252 269 239 253 252 b 187 222 222 252 207 242 b 173 206 183 216 177 212 b 157 170 163 194 157 183 b 174 138 157 160 161 150 b 216 98 189 127 200 109 z m 76 -334 b 181 -285 111 -315 148 -302 b 831 52 396 -168 613 -58 b 863 114 855 63 864 82 b 828 202 855 140 855 176 b 808 213 821 209 815 213 b 793 209 804 213 799 212 l 422 19 b 26 -179 291 -48 164 -124 b 0 -213 10 -186 0 -196 b 3 -232 0 -219 0 -225 b 52 -325 14 -265 37 -294 b 66 -337 55 -331 59 -337 b 76 -334 69 -337 72 -336 z m 769 -360 b 829 -264 779 -360 829 -284 b 769 -176 822 -232 799 -200 b 742 -163 760 -167 750 -163 b 716 -184 733 -163 723 -168 b 683 -228 708 -202 693 -213 b 672 -253 675 -236 672 -245 b 683 -281 672 -262 675 -271 b 752 -353 703 -308 732 -327 b 769 -360 756 -357 763 -360 z"},repeat2Bars:{x_min:.008571918423331715,x_max:775,y_min:-246.92374029115243,y_max:362.82068246705313,ha:609.7444227582056,o:"m 909 412 b 873 351 906 384 893 367 b 436 50 729 249 585 147 l 91 -179 b 62 -174 76 -189 68 -183 b 12 -96 48 -147 24 -125 b 36 -16 -7 -53 -6 -43 b 220 104 96 24 158 65 b 819 507 425 232 624 369 b 881 495 852 530 861 528 b 909 412 899 469 900 439 z m 333 338 b 302 240 330 307 317 274 b 276 235 297 225 287 228 l 233 269 b 203 376 186 307 183 318 b 225 441 212 397 217 419 b 246 454 228 452 232 458 b 333 338 284 441 333 380 z m 1116 228 b 1067 158 1115 192 1092 174 b 910 59 1015 125 963 92 b 478 -240 762 -33 622 -140 b 311 -350 423 -279 366 -314 b 285 -344 298 -360 289 -356 b 239 -258 272 -314 251 -288 b 261 -196 228 -228 235 -210 b 517 -29 348 -144 436 -91 b 1030 321 681 98 861 202 b 1093 307 1060 343 1076 340 b 1116 228 1107 281 1109 252 z m 1070 -105 b 1020 -210 1057 -143 1038 -176 b 998 -210 1014 -219 1004 -215 l 924 -153 b 913 -88 899 -135 897 -112 b 949 -22 926 -66 939 -45 b 998 -7 960 6 976 9 b 1070 -105 1032 -32 1058 -63 z"},repeat4Bars:{x_min:0,x_max:1374,y_min:-304,y_max:304,ha:608,o:"m 78 -266 b 92 -258 82 -266 88 -264 b 114 -240 98 -251 107 -246 b 638 107 289 -125 467 -14 b 873 271 716 161 793 216 b 907 337 894 285 906 305 b 887 400 901 354 897 379 b 852 438 877 426 867 438 b 814 420 842 438 829 432 b 135 -33 592 262 366 111 b 12 -121 92 -60 48 -84 b 0 -144 4 -128 0 -135 b 4 -160 0 -148 1 -154 b 63 -255 17 -196 45 -223 b 78 -266 68 -262 72 -266 z m 291 148 b 325 223 302 148 308 170 b 333 256 328 235 330 246 b 264 363 330 305 298 336 b 242 373 255 369 248 373 b 220 347 232 373 225 364 b 202 288 216 327 213 305 b 190 252 193 275 190 262 b 222 200 190 232 202 215 b 291 148 264 170 279 148 z m 815 -367 b 829 -359 819 -367 824 -364 b 851 -343 835 -353 844 -347 b 1375 6 1027 -228 1205 -117 l 1610 170 b 1644 235 1632 184 1643 203 b 1626 300 1639 253 1634 276 b 1590 337 1614 325 1604 337 b 1551 320 1580 337 1567 330 b 873 -135 1329 161 1103 10 b 749 -222 829 -161 785 -184 b 737 -245 742 -230 737 -238 b 742 -261 737 -249 739 -255 b 802 -357 755 -297 782 -325 b 815 -367 805 -363 809 -367 z m 396 -360 b 408 -356 400 -360 403 -359 b 609 -223 471 -307 543 -269 b 896 -19 706 -156 795 -81 b 1164 154 985 37 1074 96 b 1214 223 1189 170 1211 187 b 1176 321 1204 253 1205 292 b 1159 330 1169 327 1165 330 b 1145 324 1155 330 1151 328 b 1048 258 1113 302 1081 278 b 357 -202 809 117 598 -65 b 333 -238 341 -212 333 -223 b 338 -262 333 -245 334 -253 b 384 -350 350 -294 372 -318 b 396 -360 386 -354 390 -360 z m 1162 -438 b 1174 -433 1166 -438 1169 -436 b 1374 -300 1237 -384 1309 -346 b 1660 -96 1470 -233 1561 -158 b 1930 76 1751 -39 1840 19 b 1979 147 1954 92 1977 109 b 1943 243 1968 177 1971 216 b 1924 253 1935 251 1930 253 b 1911 248 1920 253 1915 252 b 1814 181 1878 225 1848 202 b 1123 -279 1575 40 1364 -141 b 1099 -315 1106 -289 1099 -300 b 1103 -338 1099 -321 1100 -330 b 1149 -426 1115 -370 1138 -396 b 1162 -438 1151 -432 1156 -438 z m 1875 -295 b 1882 -291 1878 -295 1879 -294 b 1934 -189 1904 -258 1921 -223 b 1872 -96 1925 -147 1901 -120 b 1840 -78 1858 -84 1848 -78 b 1812 -109 1830 -78 1823 -88 l 1777 -173 b 1770 -199 1773 -181 1770 -190 b 1786 -230 1770 -210 1774 -220 b 1862 -289 1809 -253 1837 -269 b 1875 -295 1865 -292 1871 -295 z"},repeatBarSlash:{x_min:0,x_max:630,y_min:-225.19160170741762,y_max:265.12618221237005,ha:490.31778391978764,o:"m 78 -324 b 92 -314 82 -325 88 -321 b 114 -298 96 -307 107 -302 b 638 49 289 -183 467 -72 b 873 215 716 104 792 161 b 907 279 894 229 906 248 b 887 344 901 298 897 321 b 852 382 877 369 867 380 b 814 363 842 383 829 376 b 135 -91 603 192 364 55 b 12 -177 92 -118 45 -137 b 0 -202 4 -186 0 -192 b 4 -217 0 -206 1 -212 b 63 -312 17 -253 42 -284 b 78 -324 68 -318 72 -323 z"},csymDiminished:{x_min:0,x_max:506,y_min:-.011036179317259481,y_max:500,ha:500.0110361793173,o:"m 397 0 b 729 265 576 -1 729 95 b 711 367 729 297 723 331 b 472 670 668 498 586 595 b 315 720 423 701 372 720 b 253 713 295 720 275 719 b 32 514 144 687 75 615 b 0 374 12 468 0 420 b 27 251 0 333 9 292 b 140 117 52 196 92 153 b 397 0 223 52 317 4 z m 340 95 b 132 314 233 84 122 216 b 324 589 145 438 200 539 b 415 611 360 603 389 611 b 544 505 469 611 505 576 b 590 392 564 471 583 432 b 596 343 593 374 596 359 b 340 95 596 210 485 96 z"},csymHalfDiminished:{x_min:-32,x_max:496,y_min:-33,y_max:492,ha:525,o:"m -29 -48 b 0 -36 -19 -48 -9 -40 b 17 -20 7 -32 12 -24 b 134 94 56 19 95 56 b 372 0 207 43 282 0 b 455 13 397 0 426 4 b 677 258 556 45 671 141 b 678 289 677 268 678 278 b 593 539 678 380 654 467 b 592 541 593 540 592 540 l 684 632 b 713 678 700 647 711 665 b 714 691 714 684 714 688 b 707 704 714 698 711 701 b 691 708 701 707 696 708 b 660 691 680 708 670 701 l 552 585 b 478 634 530 606 507 624 b 361 684 438 648 397 661 b 301 703 341 697 320 703 b 226 677 275 703 251 693 b 27 449 140 618 72 543 b 0 324 9 410 -4 370 b 88 128 -1 243 30 177 b -30 -7 43 86 0 46 b -46 -33 -35 -16 -46 -24 b -42 -42 -46 -36 -45 -39 b -29 -48 -37 -46 -33 -48 z m 141 179 b 121 251 128 200 121 225 b 128 297 121 265 124 281 b 351 575 163 420 248 505 b 377 582 359 579 369 580 b 501 536 422 586 468 567 b 141 179 382 416 261 298 z m 281 105 b 179 137 240 105 206 117 b 210 168 189 147 200 157 l 537 487 b 547 455 541 477 544 467 b 556 370 552 426 556 397 b 429 154 556 274 503 207 b 281 105 384 122 336 105 z"},csymAugmented:{x_min:0,x_max:530,y_min:0,y_max:539,ha:539,o:"m 380 0 b 393 14 384 4 390 9 b 397 46 397 24 397 36 l 397 333 b 736 327 511 331 624 330 b 763 343 755 327 763 333 b 755 361 763 348 760 354 b 635 431 726 402 688 431 l 390 431 l 390 485 b 386 606 392 526 386 566 b 392 664 386 625 387 645 b 395 690 393 672 395 681 b 376 753 395 711 389 734 b 357 776 372 762 369 776 b 350 775 354 776 353 776 b 327 740 337 769 327 759 b 327 621 328 700 327 661 b 330 438 328 559 328 498 l 29 438 b 4 431 20 438 7 442 b 0 413 3 425 0 419 b 7 399 0 408 1 403 b 131 338 45 369 85 340 b 331 334 199 336 265 334 b 333 163 333 276 333 220 b 366 13 333 109 348 63 b 380 0 367 7 374 4 z"},csymMajorSeventh:{x_min:0,x_max:593.1050509327923,y_min:0,y_max:569,ha:569,o:"m 124 1 l 497 27 b 819 50 605 35 711 43 b 854 98 847 52 855 63 b 812 200 845 128 835 166 b 564 585 730 328 648 456 b 435 786 521 652 480 720 b 397 819 419 809 408 819 b 369 792 387 819 379 811 b 7 173 248 585 128 379 b 0 150 3 166 0 158 b 7 128 0 143 3 135 b 89 10 30 86 65 50 b 109 0 95 1 102 0 z m 163 147 b 153 153 158 147 156 148 b 164 179 147 163 158 170 b 426 644 251 334 338 488 b 442 660 432 655 436 660 b 458 645 446 660 452 655 b 727 220 547 503 636 361 b 736 202 732 213 736 206 b 714 190 736 196 730 192 b 179 148 537 177 359 163 b 163 147 174 150 168 147 z"},csymMinor:{x_min:0,x_max:481.64484584675915,y_min:193,y_max:265.20435472429375,ha:72.20435472429375,o:"m 168 278 b 197 279 177 278 187 278 b 431 292 275 287 353 288 l 431 291 b 661 302 508 295 585 300 b 693 311 672 304 688 300 b 674 346 697 324 685 338 b 564 382 641 366 606 384 l 27 360 b 0 347 17 360 1 366 b 19 314 0 333 3 321 b 168 278 66 291 115 278 z"},csymParensLeftTall:{x_min:0,x_max:185,y_min:0,y_max:1034,ha:1034,o:"m 215 0 b 226 17 223 1 223 10 b 229 37 229 24 229 32 b 220 81 229 52 225 66 b 167 203 206 124 181 160 b 86 616 124 338 89 474 b 82 765 85 665 82 716 b 91 886 82 805 84 845 b 245 1319 120 1038 171 1184 b 266 1397 259 1346 266 1371 b 259 1443 266 1411 264 1427 b 226 1489 253 1463 248 1489 b 193 1454 212 1489 203 1467 b 114 1292 158 1404 140 1346 b 0 806 40 1138 0 978 b 3 721 0 779 0 750 b 1 677 1 707 1 693 b 36 418 1 593 16 504 b 144 96 62 307 95 199 b 196 12 158 66 179 39 b 212 0 200 7 204 0 z"},csymParensRightTall:{x_min:-40,x_max:188.5411603861406,y_min:.20204102886728756,y_max:1058,ha:1057.7979589711326,o:"m 30 1 b 63 14 42 -3 55 6 b 122 99 86 40 108 68 b 189 258 145 153 166 204 b 271 667 239 379 268 503 b 246 852 275 708 261 780 b 10 1495 197 1077 128 1295 b -14 1524 4 1505 1 1524 b -16 1522 -14 1524 -16 1524 b -46 1489 -33 1521 -43 1503 b -58 1417 -53 1464 -58 1440 b -36 1335 -58 1390 -52 1364 b 68 1138 0 1270 35 1204 b 163 883 108 1056 137 969 b 206 668 184 814 200 742 b 207 631 207 655 207 642 b 166 426 207 560 192 492 b 46 143 130 330 111 228 b 19 29 19 109 17 69 b 30 1 20 19 24 3 z"},csymBracketLeftTall:{x_min:0,x_max:328,y_min:2,y_max:807,ha:805,o:"m 68 3 b 76 4 71 3 73 3 b 186 13 112 12 150 13 b 240 13 204 13 222 13 l 287 13 b 379 17 317 13 348 13 b 472 121 435 24 472 69 b 467 156 472 132 469 144 b 446 174 462 168 456 174 l 439 174 b 327 166 402 167 364 166 b 265 167 307 166 285 167 l 209 167 b 187 475 199 269 189 372 b 166 985 186 645 187 815 l 377 1002 b 415 1001 389 1002 402 1001 b 456 1027 432 1001 448 1005 b 472 1096 467 1048 472 1073 b 464 1146 472 1113 469 1130 b 439 1162 459 1161 452 1162 b 40 1129 305 1151 173 1139 b 1 1093 17 1128 1 1120 b 0 1009 0 1064 0 1037 b 13 975 0 991 3 981 b 30 670 23 873 30 772 b 29 608 30 649 29 628 l 29 563 b 56 88 29 405 49 246 b 53 22 55 66 55 43 b 68 3 53 12 56 3 z"},csymBracketRightTall:{x_min:.8519422934604696,x_max:306,y_min:-.17180889215212544,y_max:829.1037519824849,ha:829.2755608746371,o:"m 117 0 b 372 29 203 -3 287 20 l 373 29 b 406 32 383 30 395 30 b 436 60 428 33 432 43 b 441 109 439 76 441 92 b 433 200 441 140 436 170 b 409 696 422 366 409 530 b 416 887 409 763 416 831 b 415 920 416 899 415 910 l 415 1106 b 412 1135 415 1116 415 1126 l 412 1145 b 373 1189 413 1171 408 1192 b 321 1189 356 1189 338 1189 l 215 1189 l 215 1194 l 56 1194 b 6 1153 27 1195 10 1187 b 1 1064 3 1123 4 1093 b 22 1043 0 1050 6 1043 b 84 1044 42 1044 63 1044 b 264 1038 144 1044 203 1040 b 265 958 264 1011 265 985 b 262 845 265 920 264 883 b 259 710 259 801 259 755 b 279 243 259 554 271 399 b 285 170 281 219 284 194 b 95 151 222 161 158 156 b 29 81 27 147 27 147 l 29 73 b 105 0 33 0 33 0 z"},csymParensLeftVeryTall:{x_min:0,x_max:116,y_min:0,y_max:934.1531437146923,ha:934.1531437146923,o:"m 128 0 b 147 17 137 0 144 9 b 167 102 160 45 167 73 b 158 154 167 120 164 137 b 117 307 141 204 130 256 b 63 698 84 435 71 567 b 62 788 62 729 62 757 b 69 916 62 829 63 873 b 109 1172 81 1001 94 1087 b 132 1320 118 1221 137 1269 b 124 1345 131 1329 134 1342 b 96 1332 114 1346 102 1341 b 71 1269 82 1313 75 1292 b 39 1104 59 1214 48 1159 b 0 742 19 988 0 871 b 10 559 3 688 6 624 b 58 226 16 446 33 336 b 112 20 73 157 94 89 b 128 0 115 13 118 0 z"},csymParensRightVeryTall:{x_min:-20,x_max:111.4332498248095,y_min:-.07657185734616112,y_max:1009,ha:1009.0765718573462,o:"m -3 0 b 20 22 9 -1 14 12 b 36 56 26 33 32 45 b 99 274 58 128 84 199 b 160 788 135 439 163 605 b 122 1181 164 912 145 1047 b 50 1431 108 1267 86 1351 b 36 1453 48 1439 46 1453 l 35 1453 l 30 1453 b 7 1423 17 1449 7 1440 b 27 1287 9 1377 10 1331 b 96 963 71 1184 85 1074 b 105 818 102 914 105 867 b 91 624 105 753 99 688 b -4 213 72 484 48 344 b -29 101 -19 174 -29 138 b -16 27 -29 76 -24 52 b -3 0 -13 17 -14 3 z"},csymDiagonalArrangementSlash:{x_min:-.19862981551275186,x_max:990,y_min:-26.946823529189132,y_max:1027.5514326488437,ha:1054.4982561780328,o:"m 14 -37 b 58 -9 35 -45 46 -22 b 392 333 170 105 279 217 l 765 711 b 1372 1329 968 916 1168 1125 b 1424 1439 1403 1359 1417 1397 b 1426 1457 1424 1444 1426 1450 b 1416 1477 1426 1466 1423 1475 b 1374 1462 1400 1485 1385 1473 b 1181 1269 1309 1397 1246 1331 b 736 831 1031 1122 884 979 b 356 452 609 704 485 576 b 32 132 246 347 143 236 b 0 50 7 109 1 84 b 6 9 -1 37 3 23 b 14 -37 10 -9 0 -32 z"},accidentalNarrowReversedFlat:{x_min:0,x_max:208,y_min:-231,y_max:449,ha:680,o:"m 272 -333 b 284 -320 278 -333 281 -328 b 300 -174 297 -272 300 -222 b 275 190 298 -52 279 68 b 268 445 272 275 268 360 l 268 490 b 264 612 269 530 265 572 b 236 647 264 632 252 645 l 235 647 b 217 618 220 647 220 628 b 207 526 210 588 207 556 b 210 432 207 494 210 464 b 216 268 213 377 215 323 l 216 230 l 215 232 b 154 256 194 240 174 251 b 111 264 138 261 124 264 b 3 153 50 264 10 223 b 0 94 0 132 0 114 b 194 -276 0 -63 68 -186 b 255 -323 215 -291 236 -307 b 272 -333 262 -330 268 -333 z m 233 -138 b 71 30 168 -92 105 -45 b 63 59 65 42 63 50 b 96 95 62 75 73 86 b 130 102 108 99 120 102 b 215 76 160 102 187 88 l 220 73 b 225 -22 220 42 222 10 b 233 -138 229 -62 230 -101 z"},accidentalNarrowReversedFlatAndFlat:{x_min:0,x_max:335,y_min:-231,y_max:449,ha:680,o:"m 151 490 b 148 612 151 530 150 572 b 132 647 148 632 141 645 b 122 618 124 647 124 628 b 117 526 118 588 117 556 b 118 432 117 494 118 464 b 121 268 120 377 121 323 l 121 232 b 86 256 109 240 98 251 b 62 264 78 261 69 264 b 1 153 29 264 6 223 b 0 94 0 132 0 114 b 109 -276 0 -63 37 -186 b 144 -323 121 -291 132 -307 b 153 -333 147 -330 151 -333 b 160 -320 157 -333 158 -328 b 168 -174 167 -272 168 -222 b 154 190 168 -52 157 68 b 151 445 153 275 151 360 z m 480 153 b 372 264 472 223 432 264 b 328 256 359 264 344 261 b 268 232 308 251 288 240 l 266 230 l 266 268 b 272 432 266 323 269 377 b 275 526 272 464 275 494 b 265 618 275 556 272 588 b 248 647 262 628 262 647 l 246 647 b 219 612 230 645 219 632 b 215 490 217 572 213 530 l 215 445 b 207 190 215 360 210 275 b 183 -174 203 68 183 -52 b 199 -320 183 -222 186 -272 b 210 -333 202 -328 204 -333 b 228 -323 215 -333 220 -330 b 288 -276 246 -307 268 -291 b 482 94 415 -186 482 -63 b 480 153 482 114 482 132 z m 40 30 b 36 59 36 42 36 50 b 55 95 35 75 42 86 b 73 102 60 99 68 102 b 121 76 89 102 105 88 l 124 73 b 127 -22 124 42 125 10 l 131 -138 b 40 30 95 -92 60 -43 z m 419 59 b 412 30 419 50 418 42 b 249 -138 374 -43 314 -92 b 258 -22 252 -101 253 -62 b 262 73 261 10 262 42 l 268 76 b 353 102 295 88 323 102 b 386 95 363 102 374 99 b 419 59 409 86 420 75 z"},accidentalWilsonPlus:{x_min:0,x_max:298,y_min:-218,y_max:218,ha:436,o:"m 232 -314 b 236 -301 236 -310 236 -305 l 236 -295 b 243 -52 239 -213 242 -132 l 369 62 b 429 200 413 101 425 147 b 416 243 429 216 428 236 b 383 225 406 251 393 232 l 377 220 b 246 98 336 177 291 138 b 249 242 248 145 246 193 b 225 304 251 265 242 287 b 209 314 220 308 215 314 b 204 312 207 314 206 312 b 196 292 196 310 196 300 b 193 184 194 256 194 220 b 187 48 192 140 190 94 b 46 -72 141 7 94 -32 b 0 -163 13 -98 0 -127 b 1 -187 0 -170 0 -179 b 10 -235 4 -203 6 -219 b 20 -255 12 -242 14 -251 b 36 -245 26 -259 30 -249 b 181 -109 85 -200 132 -154 b 176 -258 180 -158 176 -209 b 232 -314 176 -298 186 -307 z"},accidentalWilsonMinus:{x_min:0,x_max:284.2093390143919,y_min:-163,y_max:163,ha:326,o:"m 386 -232 b 409 -163 415 -222 408 -180 b 382 -69 410 -120 408 -89 b 32 228 264 30 141 118 b 17 235 26 233 22 235 b 3 219 9 235 3 228 b 0 157 3 199 0 179 b 29 69 0 125 6 95 b 323 -194 115 -29 222 -111 b 374 -235 338 -206 353 -235 b 386 -232 377 -235 382 -233 z"}},fontFamily:"Petaluma",resolution:1e3,generatedOn:"2021-12-06T21:04:23.441Z"},metrics:{name:"Petaluma",smufl:!0,stave:{padding:15,endPaddingMax:15,endPaddingMin:7,unalignedNotePadding:12},accidental:{noteheadAccidentalPadding:1,leftPadding:2,accidentalSpacing:3},clef:{default:{point:32,width:26},small:{point:26,width:20},annotations:{"8va":{smuflCode:"timeSig8",default:{point:18,treble:{line:-1.4,shiftX:12}},small:{point:16,treble:{line:-.2,shiftX:8}}},"8vb":{smuflCode:"timeSig8",default:{point:18,treble:{line:6,shiftX:10},bass:{line:3.5,shiftX:1}},small:{point:16,treble:{line:5.3,shiftX:6},bass:{line:3.1,shiftX:.5}}}},lineCount:{8:{point:55,shiftY:14},7:{point:47,shiftY:8},6:{point:32,shiftY:1},5:{point:30,shiftY:-6},4:{point:23,shiftY:-12}}},parenthesis:{default:{point:39,width:7},gracenote:{point:23.4,width:3}},pedalMarking:{up:{point:40},down:{point:34}},digits:{shiftLine:-1,point:22,tupletPoint:16,shiftY:-2},articulation:{articStaccatissimoAbove:{padding:2},articStaccatissimoBelow:{padding:2}},tremolo:{default:{point:25,spacing:5,offsetYStemUp:-5,offsetYStemDown:5,offsetXStemUp:13,offsetXStemDown:1},grace:{point:18,spacing:4,offsetYStemUp:-5,offsetYStemDown:5,offsetXStemUp:8,offsetXStemDown:1}},staveRepetition:{default:{offsetY:25,offsetSymbol:12,spacing:5}},noteHead:{displaced:{shiftX:-2}},stem:{heightAdjustmentForFlag:-3,noteHead:{noteheadTriangleUpHalf:{offsetYBaseStemUp:5,offsetYBaseStemDown:4},noteheadTriangleUpBlack:{offsetYBaseStemUp:5,offsetYBaseStemDown:4},noteheadTriangleUpWhole:{offsetYBaseStemUp:5,offsetYBaseStemDown:4},noteheadXHalf:{offsetYBaseStemUp:-4,offsetYBaseStemDown:4},noteheadXBlack:{offsetYBaseStemUp:-4,offsetYBaseStemDown:4},noteheadXWhole:{offsetYBaseStemUp:-4,offsetYBaseStemDown:4},noteheadHalf:{offsetYBaseStemDown:1.8,offsetYBaseStemUp:-1.8},noteheadBlack:{offsetYBaseStemDown:2,offsetYBaseStemUp:-2},noteheadSquareWhite:{offsetYBaseStemDown:-5,offsetYBaseStemUp:5}}},glyphs:{coda:{point:20,shiftX:-7,shiftY:8},segno:{shiftX:-7},flag:{shiftX:-.77,flag16thUp:{shiftX:-.75},flag32ndUp:{shiftX:-.85},flag64thUp:{shiftX:-1.55},flag128thUp:{shiftX:-1.3},flag16thDown:{shiftX:-.75},flag32ndDown:{shiftX:-.76},flag64thDown:{shiftX:-1.5},flag128thDown:{shiftX:-1.2},tabStem:{shiftX:-1.75},staveTempo:{shiftX:-1}},clef:{gClef:{default:{scale:1.1,shiftY:1},small:{shiftY:1.5}},fClef:{default:{shiftY:-.5}}},ornament:{ornamentTurn:{scale:1.2},ornamentTurnSlash:{scale:1.2}},stringNumber:{verticalPadding:8,stemPadding:2,leftPadding:5,rightPadding:6},stroke:{arrowheadBlackDown:{straight:{shiftX:-4.5},wiggly:{shiftX:-1,shiftY:1}},arrowheadBlackUp:{straight:{shiftX:-.85},wiggly:{shiftX:-1,shiftY:1}}},textNote:{point:34,breathMarkTick:{point:36,shiftY:9},breathMarkComma:{point:36},segno:{point:30,shiftX:-7,shiftY:8},coda:{point:20,shiftX:-7,shiftY:8},ornamentTrill:{shiftX:-10,shiftY:8},ornamentMordent:{shiftX:-8},ornamentShortTrill:{shiftX:-8}},noteHead:{minPadding:2,standard:{noteheadBlackStemUp:{shiftX:.5},noteheadHalfStemUp:{shiftX:.725},noteheadWholeStemUp:{shiftX:1}},custom:{noteheadCircleXStemUp:{shiftX:-1},noteheadCircleXStemDown:{shiftX:.25},noteheadDiamondHalfStemUp:{shiftX:1.5},noteheadDiamondBlackStemUp:{shiftX:1.5},noteheadDiamondWholeStemUp:{shiftX:1},noteheadXBlackStemUp:{shiftX:1},noteheadXHalfStemUp:{shiftX:-3},noteheadXHalfStemDown:{shiftX:1},noteheadXWholeStemUp:{shiftX:-7},noteheadXWholeStemDown:{shiftX:1},noteheadSquareWhiteStemDown:{shiftX:.25},noteheadSquareWhiteStemUp:{shiftX:-.75},noteheadSquareBlackStemUp:{shiftX:-.75},noteheadTriangleUpWholeStemUp:{shiftX:-.75}}},chordSymbol:{global:{superscriptOffset:-400,subscriptOffset:300,kerningOffset:-150,lowerKerningText:["D","F","P","T","V","Y"],upperKerningText:["L"],spacing:20,superSubRatio:.73},csymDiminished:{scale:.8,leftSideBearing:-95,advanceWidth:506,yOffset:0},csymHalfDiminished:{scale:.8,leftSideBearing:-32,advanceWidth:506,yOffset:0},csymAugmented:{scale:1,leftSideBearing:-25,advanceWidth:530,yOffset:0},csymParensLeftTall:{scale:.8,leftSideBearing:0,advanceWidth:155,yOffset:150},csymParensRightTall:{scale:.8,leftSideBearing:40,advanceWidth:189,yOffset:150},csymBracketLeftTall:{scale:.8,leftSideBearing:0,advanceWidth:328,yOffset:0},csymBracketRightTall:{scale:.8,leftSideBearing:1,advanceWidth:600,yOffset:0},csymParensLeftVeryTall:{scale:.95,leftSideBearing:0,advanceWidth:210,yOffset:250},csymParensRightVeryTall:{scale:.9,leftSideBearing:-100,advanceWidth:111,yOffset:250},csymDiagonalArrangementSlash:{scale:.6,leftSideBearing:-1,advanceWidth:990,yOffset:0},csymMinor:{scale:.7,leftSideBearing:0,advanceWidth:482,yOffset:0},csymMajorSeventh:{scale:.8,leftSideBearing:100,yOffset:0,advanceWidth:600},accidentalSharp:{scale:.7,leftSideBearing:0,advanceWidth:425,yOffset:-422},accidentalFlat:{scale:.8,leftSideBearing:-10,advanceWidth:228,yOffset:-284}},jazzOrnaments:{brassScoop:{scale:1,xOffset:-12,yOffset:0,stemUpYOffset:0,reportedWidth:10},brassDoitMedium:{scale:1,xOffset:16,yOffset:0,stemUpYOffset:0,reportedWidth:5},brassFallLipShort:{scale:1,xOffset:16,yOffset:0,stemUpYOffset:0,reportedWidth:5},brassLiftMedium:{scale:1,xOffset:16,yOffset:5,stemUpYOffset:0,reportedWidth:5},brassFallRoughMedium:{scale:1,xOffset:16,yOffset:26,stemUpYOffset:0,reportedWidth:5},brassBend:{scale:1,xOffset:3,yOffset:-8,stemUpYOffset:28,reportedWidth:5},brassMuteClosed:{scale:1,xOffset:3,yOffset:-8,stemUpYOffset:26,reportedWidth:5},brassMuteOpen:{scale:1,xOffset:4,yOffset:-8,stemUpYOffset:27,reportedWidth:5},brassFlip:{scale:1,xOffset:10,yOffset:-4,stemUpYOffset:0,reportedWidth:5},brassJazzTurn:{scale:1,xOffset:6,yOffset:-4,stemUpYOffset:0,reportedWidth:5},brassSmear:{scale:1,xOffset:10,yOffset:-4,stemUpYOffset:0,reportedWidth:5}},tuplet:{noteHeadOffset:20,stemOffset:10,bottomLine:4,topModifierOffset:20}}}};return m=m.default})()})); +//# sourceMappingURL=vexflow-font-petaluma.js.map \ No newline at end of file diff --git a/build/cjs/vexflow-font-petaluma.js.map b/build/cjs/vexflow-font-petaluma.js.map new file mode 100644 index 0000000000..5180857e5c --- /dev/null +++ b/build/cjs/vexflow-font-petaluma.js.map @@ -0,0 +1 @@ +{"version":3,"file":"vexflow-font-petaluma.js","mappings":"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","sources":["webpack://VexFlowFont.Petaluma/webpack/universalModuleDefinition","webpack://VexFlowFont.Petaluma/webpack/bootstrap","webpack://VexFlowFont.Petaluma/webpack/runtime/define property getters","webpack://VexFlowFont.Petaluma/webpack/runtime/hasOwnProperty shorthand","webpack://VexFlowFont.Petaluma/./src/fonts/petaluma_glyphs.ts","webpack://VexFlowFont.Petaluma/./entry/vexflow-font-petaluma.ts","webpack://VexFlowFont.Petaluma/./src/fonts/petaluma_metrics.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"VexFlowFont\"] = factory();\n\telse\n\t\troot[\"VexFlowFont\"] = root[\"VexFlowFont\"] || {}, root[\"VexFlowFont\"][\"Petaluma\"] = factory();\n})((typeof window !== 'undefined' ? window : typeof globalThis !== 'undefined' ? globalThis : this), function() {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","export const PetalumaFont = {\n glyphs: {\n bracketTop: {\n x_min: 0,\n x_max: 508,\n y_min: 0,\n y_max: 370,\n ha: 370,\n o: 'm 22 0 b 122 0 55 1 89 0 l 157 0 b 713 376 425 0 622 137 b 732 467 724 406 732 436 b 726 514 732 482 730 498 b 711 533 723 528 719 533 b 693 526 707 533 700 530 b 674 498 683 520 678 508 b 635 406 662 467 652 435 b 310 164 560 281 458 193 b 154 151 258 154 206 151 b 39 154 117 151 78 154 b 1 120 17 154 4 145 b 0 84 0 108 0 96 b 0 20 0 63 1 40 b 22 0 0 4 7 0 z',\n },\n bracketBottom: {\n x_min: 0,\n x_max: 496,\n y_min: -393,\n y_max: 0,\n ha: 393,\n o: 'm 696 -566 b 711 -539 713 -566 708 -549 b 714 -521 713 -533 714 -527 b 713 -508 714 -517 713 -513 b 661 -327 706 -445 688 -384 b 392 -42 603 -203 513 -109 b 206 0 331 -7 266 0 b 160 -1 190 0 174 -1 b 26 -1 107 -1 66 -3 b 0 -19 12 -1 0 -4 l 0 -23 b 3 -50 1 -32 3 -42 b 1 -86 3 -62 1 -73 b 4 -118 1 -96 1 -108 b 45 -151 10 -145 23 -154 b 180 -143 89 -144 135 -145 b 621 -419 392 -135 523 -236 b 662 -539 641 -456 655 -497 b 696 -566 667 -557 680 -566 z',\n },\n barlineTick: {\n x_min: 0,\n x_max: 56.036101509664164,\n y_min: 876.905249806889,\n y_max: 1121.5430338167066,\n ha: 244.63778400981766,\n o: 'm 42 1263 b 66 1287 62 1261 66 1272 b 81 1583 65 1387 72 1485 b 35 1614 82 1610 53 1610 b 14 1591 17 1619 16 1604 b 0 1408 7 1525 0 1459 l 0 1292 b 42 1263 1 1263 23 1266 z',\n },\n breathMarkTick: {\n x_min: 0,\n x_max: 568,\n y_min: 0,\n y_max: 621,\n ha: 621,\n o: 'm 258 0 b 278 39 276 0 274 24 b 279 56 279 45 279 50 l 279 73 b 278 117 279 88 278 102 b 281 148 278 127 279 138 b 536 600 312 330 387 487 b 744 719 600 651 670 690 b 815 779 775 730 808 740 b 818 824 818 793 818 808 b 815 868 818 838 818 852 b 796 894 814 881 808 894 b 779 888 791 894 786 893 b 719 864 760 878 739 871 b 372 602 580 806 459 724 b 229 252 298 498 251 383 b 220 268 225 262 222 264 b 209 302 217 279 213 291 b 75 527 181 387 143 467 b 16 563 58 543 39 573 b 0 539 3 557 0 549 b 12 492 0 524 9 507 b 56 400 19 459 22 425 b 163 269 104 367 138 323 b 238 36 197 194 216 115 b 258 0 242 22 243 0 z',\n },\n segno: {\n x_min: 0,\n x_max: 798,\n y_min: -65,\n y_max: 806,\n ha: 871,\n o: 'm 16 -94 b 66 -69 39 -92 53 -85 b 177 59 102 -26 138 17 b 543 456 298 192 420 324 b 726 300 615 420 680 373 b 753 217 744 271 753 243 b 655 112 753 170 719 131 b 599 104 636 107 618 104 b 461 173 544 104 495 128 b 432 190 454 183 444 190 b 409 179 425 190 418 187 b 359 118 390 160 373 141 b 341 72 347 101 341 86 b 373 24 341 56 351 40 b 409 6 384 17 396 10 b 550 -13 454 -12 501 -14 b 599 -6 566 -12 583 -10 b 864 213 720 27 806 104 b 886 300 878 242 886 271 b 857 395 886 331 877 363 b 799 467 840 420 821 445 b 648 572 755 513 704 546 b 1110 1083 802 743 955 914 b 1140 1129 1123 1097 1136 1110 b 1149 1148 1142 1135 1149 1142 b 1145 1153 1149 1149 1148 1152 b 1123 1161 1139 1158 1130 1161 b 1109 1156 1119 1161 1113 1159 b 1089 1138 1102 1151 1094 1145 b 946 988 1040 1089 989 1041 b 595 602 834 855 711 732 l 590 598 l 549 615 b 432 793 462 647 432 723 b 534 888 432 851 474 888 b 671 834 588 888 631 864 b 710 818 684 824 696 818 b 724 821 714 818 719 819 b 809 883 757 834 788 852 b 816 901 814 890 816 896 b 802 923 816 910 812 916 b 706 984 770 945 742 971 b 593 1011 668 998 631 1011 b 516 991 567 1011 541 1005 b 333 799 433 949 380 876 b 302 693 312 765 302 729 b 330 589 302 658 311 624 b 469 488 360 533 415 511 b 485 482 475 487 480 485 b 266 249 412 405 338 327 b 121 88 217 196 170 141 b 9 -65 78 40 37 -7 b 0 -85 4 -72 0 -79 b 16 -94 0 -91 4 -94 z m 861 536 b 927 575 890 539 909 557 b 965 628 952 598 965 613 b 926 680 965 644 952 658 b 865 713 900 701 883 713 b 805 667 845 713 828 698 b 768 611 791 649 770 631 b 812 564 766 589 798 582 b 861 536 824 550 840 537 z m 251 350 b 363 436 285 348 353 403 b 354 456 366 448 360 452 b 271 518 327 477 298 497 b 243 528 261 526 252 528 b 210 513 232 528 222 523 b 157 454 190 494 176 472 b 141 428 147 444 141 436 b 158 406 141 420 147 413 b 216 361 180 393 197 376 b 245 350 225 356 235 350 z',\n },\n coda: {\n x_min: 0,\n x_max: 1380,\n y_min: -196,\n y_max: 1037,\n ha: 1233,\n o: 'm 1028 -282 b 1057 -245 1045 -282 1053 -261 b 1060 -203 1060 -232 1060 -217 b 1063 9 1060 -132 1061 -62 b 1390 194 1192 22 1303 81 b 1531 543 1467 298 1512 415 b 1532 556 1531 547 1532 552 b 1904 559 1656 557 1780 559 b 1950 582 1920 559 1941 569 b 1987 674 1970 609 1987 638 b 1984 698 1987 681 1986 690 b 1950 700 1973 698 1961 700 l 1941 700 l 1545 696 b 1535 776 1545 723 1541 749 b 1103 1113 1477 996 1326 1107 b 1080 1115 1096 1115 1087 1115 b 1081 1322 1080 1184 1080 1253 b 1079 1467 1083 1371 1081 1418 b 1061 1493 1079 1476 1080 1493 l 1060 1493 b 1028 1467 1044 1490 1031 1485 b 1020 1403 1025 1446 1020 1424 b 1017 1110 1020 1305 1018 1208 l 962 1106 b 569 914 808 1087 671 1035 b 451 683 510 844 472 766 l 161 678 b 118 680 148 678 132 680 b 79 670 101 680 86 678 b 0 544 48 636 29 592 l 37 544 l 429 549 b 428 518 428 539 428 528 b 488 285 428 435 458 360 b 681 81 526 192 593 124 b 946 9 763 40 854 19 b 1008 6 966 7 988 6 b 1005 -137 1008 -42 1005 -89 b 1012 -243 1005 -173 1005 -209 b 1028 -282 1015 -258 1011 -282 z m 1074 690 b 1079 935 1077 772 1077 852 b 1326 855 1166 932 1250 909 b 1446 694 1385 814 1426 759 b 1269 693 1387 694 1328 693 b 1074 690 1204 693 1139 691 z m 577 684 b 766 874 618 763 678 828 b 989 932 837 912 913 923 b 1015 933 998 932 1007 933 b 1014 822 1015 896 1014 860 b 1011 688 1012 791 1012 743 z m 1067 184 b 1071 553 1070 307 1068 429 b 1439 556 1194 553 1316 554 b 1437 554 1439 554 1437 554 b 1341 337 1413 478 1387 402 b 1119 192 1286 261 1211 212 b 1067 184 1102 189 1084 186 z m 1008 180 b 660 264 886 181 770 212 b 524 471 570 305 524 374 b 528 524 524 488 526 505 l 533 549 b 792 552 619 550 706 550 b 1009 553 865 553 937 552 b 1008 180 1009 428 1008 288 z',\n },\n gClef: {\n x_min: 0,\n x_max: 664,\n y_min: -559,\n y_max: 1009,\n ha: 1568,\n o: 'm 343 -805 b 366 -801 350 -805 357 -804 b 409 -773 383 -795 397 -786 b 582 -328 528 -648 577 -497 b 583 -294 582 -315 583 -294 b 612 -279 583 -294 603 -282 b 747 -197 660 -256 706 -230 b 949 143 857 -109 920 10 b 956 206 955 164 956 186 b 791 384 956 297 906 363 b 704 393 762 390 733 393 b 498 336 632 393 563 374 b 481 325 490 331 481 325 l 444 465 b 442 485 442 472 442 485 b 609 880 442 485 589 746 b 619 996 616 919 619 958 b 613 1084 619 1027 618 1056 b 534 1387 599 1188 560 1286 b 482 1453 527 1417 517 1453 b 422 1407 456 1453 438 1428 b 305 1063 348 1305 312 1188 b 304 1002 304 1043 304 1022 b 338 654 304 886 323 769 b 343 629 338 645 341 636 b 144 356 278 537 206 451 b 23 144 101 288 53 220 b 0 20 7 107 0 63 b 82 -210 0 -69 30 -160 b 207 -288 112 -239 160 -271 b 410 -328 274 -312 340 -328 b 474 -324 431 -328 452 -327 l 491 -321 b 491 -341 491 -321 492 -334 b 402 -585 475 -428 454 -513 b 294 -668 374 -622 348 -664 b 271 -693 278 -670 271 -680 b 274 -708 271 -698 272 -703 b 302 -775 282 -730 292 -753 b 343 -805 311 -795 325 -805 z m 400 717 b 382 922 389 786 382 854 b 481 1286 382 1047 408 1169 b 507 1125 498 1233 507 1179 b 500 1040 507 1097 504 1068 b 400 717 481 927 455 818 z m 252 -135 b 196 -121 232 -134 215 -127 b 117 -69 158 -108 127 -94 b 111 -32 112 -58 111 -45 b 117 19 111 -16 114 1 b 130 56 118 27 127 52 b 324 337 186 156 253 246 l 384 416 l 395 384 b 416 291 406 348 416 291 b 350 213 416 291 376 239 b 243 -42 278 143 243 55 b 251 -117 243 -66 246 -91 b 252 -135 252 -122 252 -127 z m 563 -91 b 510 168 552 3 530 78 b 513 192 508 179 508 186 b 624 202 550 199 586 202 b 730 192 660 202 694 199 b 850 141 773 183 816 176 b 858 134 852 138 855 135 b 595 -121 801 19 716 -68 l 569 -131 z m 410 -160 b 311 -147 360 -160 311 -147 b 307 -98 311 -147 307 -127 b 314 -33 307 -79 308 -56 b 429 131 328 36 377 85 b 441 138 433 135 438 138 b 449 122 446 138 448 132 b 490 -131 462 37 484 -46 b 490 -153 491 -140 490 -153 b 410 -160 490 -153 452 -163 z',\n },\n cClef: {\n x_min: 0,\n x_max: 731,\n y_min: -543,\n y_max: 543,\n ha: 1086,\n o: 'm 131 -782 b 141 -755 138 -782 140 -773 b 147 -490 143 -667 145 -577 b 160 207 150 -258 153 -24 b 168 618 164 344 158 481 b 81 768 173 690 132 732 b 45 782 66 778 55 782 b 3 740 26 782 13 768 b 0 724 1 736 0 730 l 1 710 b 4 596 4 672 4 634 l 4 382 b 9 102 4 288 4 196 b 17 -301 13 -32 10 -166 l 17 -672 b 50 -736 17 -701 27 -720 b 109 -772 69 -749 91 -759 b 131 -782 120 -778 127 -782 z m 615 -770 b 881 -684 710 -770 801 -739 b 1020 -395 986 -612 1020 -510 b 1017 -334 1020 -374 1018 -354 b 769 -62 1007 -209 896 -75 b 746 -60 762 -60 755 -60 b 639 -73 710 -60 675 -69 b 524 -109 598 -79 560 -92 b 528 -36 526 -85 528 -60 b 527 -4 528 -26 528 -14 b 528 39 527 10 528 24 b 526 99 528 59 527 79 b 592 94 549 95 570 94 b 648 99 611 94 629 95 b 912 157 744 94 844 117 b 1053 377 1009 215 1053 284 b 1050 425 1053 393 1053 409 b 914 665 1037 521 986 602 b 717 753 855 717 791 753 b 626 734 688 753 658 747 l 462 665 b 347 500 374 628 347 580 b 350 449 347 484 348 468 b 392 419 353 428 367 416 b 492 438 425 425 459 428 b 541 498 524 448 541 468 b 540 514 541 503 541 508 b 537 546 537 524 537 536 b 573 639 537 580 550 611 b 606 657 582 649 593 657 l 609 657 b 716 622 647 652 684 647 b 834 372 801 556 834 469 b 831 323 834 356 832 338 b 743 187 825 266 795 217 b 710 176 732 180 720 176 b 694 179 704 176 700 177 b 527 223 638 193 582 206 b 495 229 516 228 505 229 b 454 220 481 229 468 225 b 395 189 432 213 415 200 b 363 180 384 186 374 181 b 348 168 356 179 348 176 b 340 161 343 167 340 164 b 347 150 340 157 343 154 b 356 147 348 148 353 147 b 364 92 361 130 363 111 b 369 -37 367 49 369 6 b 363 -154 369 -76 367 -115 b 357 -236 360 -183 357 -210 b 376 -264 357 -253 361 -259 b 456 -289 402 -284 429 -289 b 521 -282 478 -289 500 -285 b 549 -255 537 -279 546 -271 b 598 -177 556 -225 577 -202 b 622 -164 605 -168 613 -164 b 636 -167 626 -164 631 -166 b 749 -225 678 -177 714 -199 b 848 -405 814 -276 848 -337 b 824 -507 848 -436 840 -471 b 657 -657 792 -582 730 -625 b 608 -668 638 -664 622 -668 b 534 -602 572 -668 547 -645 b 513 -575 530 -589 523 -575 b 507 -576 510 -575 508 -575 b 478 -582 497 -580 488 -582 b 405 -570 454 -582 428 -570 b 389 -572 399 -570 395 -570 l 363 -572 b 321 -575 348 -572 333 -569 l 321 631 b 323 662 323 641 323 652 b 315 716 323 681 321 698 b 304 736 314 723 317 736 l 302 736 b 281 716 294 734 285 729 b 275 665 276 700 275 683 l 275 382 b 276 99 275 288 275 193 b 279 -170 278 10 276 -81 b 284 -399 282 -246 284 -323 b 282 -629 284 -475 282 -553 b 289 -721 282 -660 289 -690 b 300 -736 289 -727 291 -736 b 312 -724 307 -736 310 -730 b 321 -667 323 -706 321 -687 l 321 -632 l 328 -644 l 340 -657 b 510 -757 386 -707 445 -740 b 615 -770 546 -766 580 -770 z',\n },\n fClef: {\n x_min: 0,\n x_max: 776,\n y_min: -496,\n y_max: 216,\n ha: 712,\n o: 'm 402 -706 b 804 -405 592 -678 716 -566 b 876 -53 861 -298 874 -183 b 868 33 876 -32 873 1 b 560 311 845 217 723 311 b 524 310 549 311 536 311 b 131 134 373 297 239 242 b 17 -29 84 86 37 39 b 9 -89 12 -50 9 -71 b 112 -238 9 -154 43 -206 b 124 -243 117 -239 120 -242 b 186 -261 145 -255 166 -261 b 268 -228 215 -261 242 -249 b 351 -59 325 -181 351 -124 b 343 10 351 -36 348 -13 b 340 36 341 19 340 27 b 409 105 340 75 363 102 b 441 107 420 107 431 107 b 624 36 510 107 573 86 b 744 -200 688 -27 724 -109 b 747 -230 747 -210 747 -222 b 717 -323 747 -264 736 -292 b 608 -445 688 -370 654 -410 b 307 -541 518 -513 415 -541 l 213 -541 b 39 -521 154 -541 96 -539 b 0 -552 17 -514 0 -531 b 1 -564 0 -556 0 -560 b 17 -611 6 -580 10 -596 b 101 -694 35 -648 50 -684 b 288 -714 164 -707 225 -714 b 402 -706 325 -714 363 -711 z m 1018 92 b 1080 118 1041 91 1068 96 b 1117 219 1099 150 1117 180 b 1113 252 1117 229 1116 240 b 1045 288 1102 297 1068 276 b 1017 262 1028 297 1024 274 b 984 124 989 220 996 170 b 1008 91 979 108 986 91 z m 972 -281 b 1070 -148 1024 -279 1070 -210 b 1025 -105 1070 -105 1045 -112 b 989 -127 1004 -96 998 -114 b 949 -249 963 -164 963 -209 b 969 -281 943 -265 949 -281 z',\n },\n unpitchedPercussionClef1: {\n x_min: 0,\n x_max: 379.13761966945304,\n y_min: -250,\n y_max: 250,\n ha: 500,\n o: 'm 481 -360 b 507 -357 491 -360 500 -360 b 546 -295 541 -346 547 -325 b 536 79 543 -170 540 -46 b 523 311 533 157 534 235 b 475 359 518 340 508 359 b 425 360 459 359 442 360 b 400 359 416 360 409 360 b 337 294 348 353 340 347 l 337 -73 b 336 -264 337 -137 337 -200 b 343 -294 336 -274 338 -284 b 481 -360 359 -330 431 -360 z m 144 -341 b 207 -320 167 -341 189 -331 b 217 -301 215 -315 217 -308 b 210 -262 217 -289 210 -275 b 228 187 212 -112 209 37 b 228 287 228 220 229 253 b 174 353 228 336 222 343 b 120 359 157 357 138 359 b 48 357 96 359 72 356 b 17 323 29 357 19 344 b 7 120 16 255 9 187 b 6 -109 6 43 6 -33 l 6 -204 b 0 -251 6 -220 0 -235 b 3 -269 0 -256 0 -262 b 127 -340 24 -330 79 -328 b 144 -341 132 -341 138 -341 z',\n },\n '6stringTabClef': {\n x_min: 0,\n x_max: 438,\n y_min: -768,\n y_max: 767,\n ha: 1535,\n o: 'm 369 438 b 374 439 370 438 372 438 b 384 462 383 444 384 452 l 384 474 b 390 697 386 547 390 622 b 373 1002 390 799 390 901 l 533 1002 b 560 1001 541 1004 552 1001 b 573 1007 567 1001 572 1002 b 546 1050 579 1025 559 1038 b 536 1056 543 1053 539 1053 b 324 1104 472 1102 397 1104 b 72 1090 238 1104 154 1099 b 55 1093 66 1090 60 1092 b 37 1073 46 1093 37 1089 b 60 1045 37 1061 48 1051 b 203 1001 105 1022 151 1001 b 233 1004 213 1001 223 1002 b 246 1005 238 1004 243 1005 b 272 975 264 1005 272 996 l 272 965 b 258 596 264 842 265 719 b 315 474 253 540 272 504 l 343 455 b 369 438 351 448 357 438 z m 114 -320 b 127 -304 120 -320 124 -315 b 171 -174 141 -261 158 -219 b 222 -135 179 -147 196 -137 b 426 -122 289 -131 359 -128 b 498 -164 462 -120 482 -127 b 628 -301 521 -226 575 -264 b 631 -288 631 -295 631 -291 b 628 -269 631 -281 629 -276 b 569 -134 616 -220 589 -179 b 408 225 514 -14 462 107 b 314 357 384 274 351 318 b 278 380 298 372 288 379 b 251 351 268 380 261 372 b 4 -209 156 171 75 -17 b 0 -228 1 -215 0 -222 b 19 -258 0 -240 7 -249 b 102 -314 45 -279 75 -294 b 114 -320 107 -318 111 -320 z m 425 6 b 360 20 403 17 382 20 b 274 14 331 20 302 14 l 246 14 l 340 206 b 425 6 369 137 395 75 z m 245 -1106 b 281 -1104 256 -1106 269 -1106 b 511 -888 400 -1094 511 -1035 b 454 -688 511 -814 504 -744 b 448 -678 449 -685 448 -681 b 454 -667 448 -675 449 -671 b 504 -497 503 -619 507 -559 b 324 -288 500 -383 436 -308 b 295 -287 314 -287 304 -287 l 282 -287 b 115 -330 223 -287 168 -307 b 94 -366 102 -336 94 -348 l 94 -370 b 96 -435 96 -392 96 -413 b 73 -858 89 -576 71 -717 b 78 -919 73 -878 78 -899 b 72 -950 78 -930 76 -940 b 63 -992 66 -965 63 -978 b 66 -1015 63 -999 65 -1008 b 173 -1104 84 -1106 84 -1106 b 245 -1106 197 -1104 220 -1104 z m 161 -622 b 147 -618 156 -622 151 -621 b 140 -600 141 -612 140 -606 b 144 -564 140 -589 144 -575 b 143 -554 144 -560 144 -557 l 143 -546 b 220 -451 144 -467 143 -465 b 278 -445 239 -446 259 -444 b 418 -497 328 -445 376 -461 b 429 -516 426 -504 429 -510 b 415 -533 429 -521 423 -527 b 219 -608 357 -579 287 -590 b 215 -609 217 -608 216 -609 b 161 -622 197 -609 177 -622 z m 154 -953 b 130 -933 135 -953 130 -948 l 130 -865 l 128 -865 b 135 -788 130 -838 124 -808 b 203 -769 145 -769 180 -776 b 259 -762 223 -765 242 -762 b 441 -852 330 -762 386 -805 b 449 -867 446 -858 449 -863 b 436 -884 449 -874 444 -878 b 318 -942 402 -914 363 -935 b 154 -953 264 -950 209 -953 z',\n },\n timeSig0: {\n x_min: 20,\n x_max: 513,\n y_min: -358.159536277652,\n y_max: 359,\n ha: 717.159536277652,\n o: 'm 341 -516 b 420 -510 367 -516 395 -514 b 675 -338 533 -494 622 -448 b 737 -92 716 -256 734 -171 b 739 -35 739 -73 739 -53 b 680 305 739 86 720 207 b 400 517 622 449 537 517 b 337 514 380 517 359 517 b 289 507 321 511 305 513 b 91 317 192 477 127 412 b 29 9 50 212 29 108 b 217 -458 29 -157 88 -312 b 341 -516 251 -494 291 -518 z m 412 -452 b 359 -425 393 -452 376 -444 b 187 14 242 -301 179 -158 b 268 334 193 127 212 235 b 387 448 295 383 330 428 b 406 452 395 451 400 452 b 428 444 413 452 420 449 b 517 324 471 413 497 372 b 586 -29 560 222 586 86 b 556 -271 586 -112 585 -193 b 468 -422 536 -327 508 -377 b 412 -452 449 -442 431 -452 z',\n },\n timeSig1: {\n x_min: 20,\n x_max: 283,\n y_min: -364,\n y_max: 366,\n ha: 730,\n o: 'm 264 -524 b 357 -510 297 -524 325 -516 b 374 -490 369 -508 374 -501 b 380 -438 376 -472 380 -455 l 406 246 b 408 301 408 265 408 282 b 400 445 408 348 405 396 b 288 527 395 491 338 527 b 253 520 276 527 264 526 b 240 508 249 517 245 513 b 49 409 192 445 127 413 b 29 396 33 408 29 403 b 32 380 29 392 30 386 b 59 363 36 366 49 364 b 164 348 95 356 130 348 b 222 357 183 348 203 351 b 238 361 228 360 233 360 b 252 334 248 361 252 353 b 243 59 252 242 249 150 b 219 -490 229 -124 233 -307 b 264 -524 217 -516 232 -524 z',\n },\n timeSig2: {\n x_min: 20,\n x_max: 660.4636303241031,\n y_min: -378.7201231608281,\n y_max: 382,\n ha: 760.720123160828,\n o: 'm 99 -543 b 130 -533 111 -550 121 -540 b 255 -448 168 -501 213 -475 b 338 -425 282 -431 310 -425 b 392 -431 356 -425 374 -426 b 485 -462 423 -438 454 -451 b 648 -497 540 -482 595 -497 b 834 -441 711 -497 773 -480 b 950 -242 906 -395 958 -334 b 942 -210 950 -230 950 -215 b 912 -220 932 -204 920 -213 b 861 -264 894 -235 877 -248 b 775 -317 835 -289 808 -305 b 675 -334 742 -328 708 -334 b 510 -295 619 -334 563 -318 b 372 -264 465 -278 420 -264 b 305 -272 350 -264 328 -266 b 331 -242 318 -256 324 -249 b 490 -73 386 -187 438 -131 b 675 340 595 43 664 180 b 677 369 677 350 677 360 b 556 536 677 461 638 508 b 468 550 526 546 497 550 b 297 508 409 550 353 533 b 111 354 220 475 168 412 b 29 197 65 308 29 261 b 32 164 29 187 29 176 b 29 140 33 157 29 147 b 43 125 29 132 32 125 b 73 147 55 125 65 138 b 86 163 79 153 82 158 b 238 320 134 219 183 272 b 425 389 292 367 360 389 b 575 341 480 389 531 373 b 606 298 590 330 606 317 b 600 278 606 292 603 285 b 501 107 576 217 544 158 b 304 -104 439 33 372 -35 b 111 -356 230 -180 167 -265 b 84 -446 92 -386 84 -415 b 86 -481 84 -458 85 -469 b 88 -514 88 -491 88 -503 b 99 -543 89 -526 91 -537 z',\n },\n timeSig3: {\n x_min: 19.824321427094187,\n x_max: 540,\n y_min: -392,\n y_max: 392,\n ha: 784,\n o: 'm 216 -540 b 354 -564 264 -556 310 -564 b 605 -465 445 -564 530 -530 b 729 -161 697 -383 729 -275 b 724 -82 729 -135 727 -108 b 589 95 716 -1 670 62 b 523 114 567 102 546 108 b 750 418 606 213 677 315 b 778 503 769 444 778 472 b 773 540 778 514 776 527 b 750 564 769 557 762 564 b 736 562 746 564 742 563 b 641 552 704 553 672 552 b 402 554 562 552 481 554 l 346 554 b 84 546 258 554 170 554 b 36 501 55 543 40 531 b 29 412 30 472 32 442 b 52 384 27 393 32 384 l 56 384 b 210 392 107 389 158 392 l 602 392 b 354 108 523 285 445 192 b 246 -65 300 58 246 12 b 252 -108 246 -78 248 -92 l 252 -111 b 264 -141 251 -122 251 -135 b 291 -132 274 -145 284 -140 b 425 -72 328 -95 377 -84 b 475 -65 442 -68 459 -65 b 592 -108 517 -65 557 -79 b 645 -179 615 -125 645 -147 b 642 -194 645 -184 644 -189 b 485 -376 616 -278 569 -344 b 361 -399 444 -392 402 -399 b 151 -340 289 -399 219 -376 b 88 -275 122 -323 98 -310 b 71 -249 86 -268 85 -249 b 63 -251 68 -249 66 -249 b 36 -288 48 -255 36 -266 b 55 -423 33 -336 45 -377 b 101 -482 60 -448 78 -468 b 216 -540 138 -504 174 -526 z',\n },\n timeSig4: {\n x_min: 20,\n x_max: 633.0785282750762,\n y_min: -489.59088556716864,\n y_max: 491.18559127100053,\n ha: 980.7764768381692,\n o: 'm 608 -704 b 641 -684 622 -708 634 -696 b 667 -602 660 -660 662 -631 b 685 -190 683 -465 680 -327 l 685 -176 b 831 -127 736 -166 783 -148 b 912 0 901 -94 913 -76 b 886 53 912 36 904 52 b 848 40 877 53 864 49 l 838 36 b 687 -13 789 14 739 -3 b 681 177 687 50 684 114 b 672 338 678 230 677 285 b 654 373 671 350 672 373 b 622 340 636 373 624 361 b 615 262 621 314 613 288 b 619 -22 616 167 619 72 b 569 -22 602 -23 585 -23 b 305 -3 481 -16 395 -1 b 210 -9 274 -3 242 -4 b 301 163 242 52 268 108 b 513 552 377 288 459 412 b 536 652 526 585 536 618 b 533 683 536 662 534 672 b 520 707 531 691 531 707 b 487 693 508 708 494 704 b 474 668 482 684 477 677 b 384 490 454 603 418 547 b 253 281 343 419 295 351 b 73 -13 194 181 145 78 b 29 -108 50 -42 29 -72 b 37 -147 29 -121 32 -134 b 50 -186 43 -160 50 -173 b 68 -216 52 -207 56 -215 b 92 -207 73 -216 82 -213 b 288 -166 156 -180 220 -166 b 556 -186 377 -166 467 -180 b 586 -189 566 -187 576 -187 b 616 -186 596 -189 606 -189 b 606 -432 613 -268 612 -350 b 596 -625 603 -495 596 -559 b 598 -670 596 -641 596 -655 b 608 -704 598 -683 596 -700 z',\n },\n timeSig5: {\n x_min: 19.663871085403297,\n x_max: 583,\n y_min: -389,\n y_max: 389,\n ha: 778,\n o: 'm 132 -536 b 249 -560 168 -553 209 -559 b 507 -462 351 -560 454 -514 b 677 -183 588 -384 642 -289 b 694 -85 688 -150 694 -117 b 540 138 694 12 642 94 b 422 173 501 154 462 167 b 400 187 408 174 400 177 b 405 202 400 190 402 196 b 428 284 416 228 426 255 b 469 312 431 307 442 312 b 757 372 569 312 662 343 b 840 490 821 392 840 432 b 812 560 840 540 834 560 b 763 546 801 560 785 556 b 757 543 762 546 759 544 b 465 484 665 505 570 484 b 396 484 452 484 425 487 b 353 454 377 482 366 474 b 281 300 323 405 304 351 b 245 164 262 255 245 212 b 246 144 245 158 246 151 b 233 63 249 115 243 89 b 225 35 228 50 225 40 b 264 14 225 22 236 19 b 445 -26 325 7 387 0 b 569 -151 501 -52 547 -89 b 575 -180 573 -161 575 -170 b 527 -275 575 -217 547 -245 b 347 -367 484 -334 419 -367 b 261 -351 318 -367 289 -363 b 95 -300 206 -333 154 -307 b 55 -321 73 -297 65 -302 b 29 -468 29 -367 40 -419 b 56 -505 26 -482 36 -500 b 132 -536 82 -514 108 -524 z',\n },\n timeSig6: {\n x_min: 20,\n x_max: 565,\n y_min: -363,\n y_max: 363,\n ha: 726,\n o: 'm 390 -518 b 621 -458 469 -507 549 -494 b 814 -134 753 -390 814 -281 b 652 59 814 -16 750 58 b 580 48 629 59 606 55 b 233 -334 392 -9 276 -138 b 115 -228 181 -314 143 -278 b 98 -160 104 -206 98 -183 b 107 -109 98 -144 101 -127 b 167 37 124 -59 145 -12 b 508 340 236 189 347 292 b 575 353 530 347 553 353 b 648 327 600 353 625 346 b 665 320 654 321 661 320 b 687 336 674 320 681 325 b 703 405 697 359 703 382 b 684 472 703 429 697 451 b 593 523 664 504 631 521 b 576 521 588 523 582 523 b 297 403 472 508 380 465 b 115 177 217 344 164 264 b 29 -121 60 82 29 -17 b 53 -278 29 -173 36 -225 b 226 -497 82 -374 131 -454 b 347 -523 265 -514 305 -523 b 390 -518 361 -523 376 -521 z m 351 -357 b 312 -351 337 -356 320 -363 b 325 -315 304 -340 320 -327 b 543 -120 373 -222 448 -158 b 622 -104 570 -108 596 -102 b 717 -132 655 -104 687 -112 b 740 -167 732 -143 740 -153 b 730 -196 740 -176 737 -184 b 563 -321 690 -258 634 -300 b 359 -357 497 -341 428 -354 z',\n },\n timeSig7: {\n x_min: 20.3617407597707,\n x_max: 592,\n y_min: -345,\n y_max: 345,\n ha: 690,\n o: 'm 253 -497 b 318 -485 276 -497 297 -487 b 366 -441 348 -482 360 -468 b 487 -104 390 -323 433 -210 b 835 403 580 82 701 246 b 852 436 847 416 852 428 b 815 467 852 451 840 461 b 762 474 798 471 779 474 b 674 445 732 474 701 465 b 603 410 652 431 628 420 b 383 360 533 379 459 360 b 200 435 315 360 249 382 b 88 494 168 469 131 485 b 66 497 81 495 73 497 b 33 484 52 497 39 492 b 50 436 22 469 39 451 b 295 310 114 360 199 324 b 406 301 331 304 369 301 b 593 324 468 301 530 308 b 585 307 589 314 588 310 b 265 -249 451 137 338 -46 b 207 -442 242 -312 223 -377 b 204 -462 206 -449 204 -456 b 253 -497 204 -487 220 -497 z',\n },\n timeSig8: {\n x_min: 20,\n x_max: 504.15101530718516,\n y_min: -428,\n y_max: 428,\n ha: 856,\n o: 'm 265 -616 b 289 -615 274 -616 281 -616 b 710 -271 492 -592 657 -485 b 726 -148 721 -229 727 -187 b 585 108 726 -48 687 42 b 572 127 576 114 573 120 b 576 144 572 132 575 138 b 598 301 590 196 598 249 b 586 413 598 338 593 376 b 356 616 559 531 467 616 b 233 582 317 616 275 606 b 29 233 101 505 29 384 b 104 9 29 153 46 72 b 189 -48 127 -16 160 -27 b 92 -158 141 -73 114 -114 b 37 -343 63 -217 50 -279 b 33 -390 35 -359 33 -374 b 265 -616 33 -524 148 -616 z m 258 105 b 124 148 215 105 167 117 b 96 196 105 163 96 177 b 99 217 96 202 96 209 b 197 384 120 281 151 337 b 350 451 242 429 297 451 b 516 364 412 451 472 422 b 530 331 523 354 530 343 l 530 327 l 530 320 b 468 151 520 261 507 200 b 419 122 455 135 442 125 b 258 105 370 117 320 105 z m 328 -438 b 158 -276 233 -436 160 -359 b 166 -239 158 -264 161 -252 b 230 -157 176 -203 202 -179 b 367 -72 274 -125 320 -98 b 448 -49 396 -56 423 -49 b 562 -118 491 -49 528 -72 b 611 -251 590 -157 611 -199 b 569 -341 611 -288 595 -318 b 328 -438 500 -402 416 -432 z',\n },\n timeSig9: {\n x_min: 20,\n x_max: 494,\n y_min: -421,\n y_max: 421,\n ha: 842,\n o: 'm 235 -606 b 361 -564 275 -606 318 -593 b 619 -229 487 -482 566 -366 b 706 127 664 -114 694 4 b 711 233 708 163 711 197 b 700 346 711 271 708 308 b 389 606 658 517 530 606 b 351 605 376 606 364 606 b 56 272 171 586 56 441 b 96 98 56 216 69 156 b 334 -53 144 -3 238 -53 b 544 36 408 -53 484 -24 b 652 176 586 78 622 124 b 631 71 645 141 639 105 b 467 -302 599 -63 562 -196 b 271 -442 412 -364 354 -422 b 225 -448 255 -446 239 -448 b 95 -305 148 -448 98 -395 b 89 -255 95 -288 94 -271 b 73 -233 86 -246 85 -233 b 52 -248 65 -233 56 -239 b 29 -317 42 -271 30 -291 b 49 -448 29 -361 40 -405 b 235 -606 69 -541 144 -606 z m 340 104 b 144 209 264 108 194 141 b 127 258 132 225 127 240 b 137 297 127 271 130 284 b 366 449 184 396 269 449 b 517 408 415 449 467 436 b 595 348 546 392 572 372 b 616 305 608 336 616 321 b 609 281 616 298 613 289 b 340 104 557 184 477 104 z',\n },\n timeSigCommon: {\n x_min: 20,\n x_max: 585,\n y_min: -298,\n y_max: 294.49658092772603,\n ha: 592.496580927726,\n o: 'm 444 -405 b 829 -45 626 -346 740 -207 b 842 26 842 -23 842 1 b 821 58 842 39 841 58 b 795 40 811 58 802 48 b 765 3 785 29 773 16 b 469 -223 690 -104 596 -183 b 354 -242 431 -235 392 -242 b 180 -177 292 -242 235 -223 b 135 -99 154 -157 140 -131 b 132 -59 134 -85 132 -72 b 141 7 132 -37 135 -16 b 449 274 189 160 297 243 b 477 278 459 276 468 276 b 546 203 517 278 539 253 b 517 157 550 177 533 166 b 485 143 507 153 497 143 l 482 143 b 467 148 478 143 472 144 b 374 183 438 170 406 181 b 264 118 333 183 292 161 b 238 48 246 92 238 69 b 261 -9 238 29 245 10 b 383 -73 287 -39 337 -73 b 412 -68 392 -73 402 -72 b 631 164 526 -27 586 59 b 649 252 644 193 649 222 b 636 328 649 278 645 304 b 504 423 615 400 579 429 b 242 318 408 415 317 387 b 29 -158 104 190 29 33 b 30 -176 29 -164 29 -170 b 115 -364 42 -246 52 -315 b 307 -429 177 -410 240 -429 b 444 -405 351 -429 397 -420 z',\n },\n timeSigCutCommon: {\n x_min: 20,\n x_max: 695,\n y_min: -687.0379164869064,\n y_max: 687,\n ha: 1374.0379164869064,\n o: 'm 564 -989 b 595 -945 585 -991 589 -963 l 599 -922 b 605 -628 600 -824 603 -726 l 609 -399 b 878 -251 706 -363 798 -320 b 996 -85 932 -204 976 -153 b 1001 -63 998 -78 1001 -71 b 989 -46 1001 -56 998 -49 b 978 -43 985 -45 982 -43 b 950 -59 968 -43 959 -49 b 733 -216 894 -132 815 -177 b 611 -259 694 -235 652 -249 b 616 -20 612 -179 615 -99 b 680 29 642 -7 665 9 b 698 43 685 36 690 40 b 870 251 792 82 840 160 b 877 294 874 265 877 279 b 818 410 877 338 855 382 b 683 458 779 442 730 448 b 625 468 664 462 644 465 l 625 514 b 638 958 626 662 636 811 b 626 989 638 979 635 989 b 603 981 621 989 613 986 b 422 840 534 945 481 888 b 412 805 412 832 413 818 b 426 713 410 773 420 743 b 445 678 429 690 435 678 b 474 691 452 678 461 683 b 563 755 503 710 530 732 b 564 724 564 740 564 733 b 559 469 563 639 560 554 b 462 454 526 469 494 464 b 112 143 302 399 199 281 b 33 -94 66 71 45 -10 b 29 -148 30 -112 29 -131 b 105 -351 29 -223 52 -291 b 359 -455 171 -426 258 -451 b 517 -431 409 -451 464 -446 l 539 -422 l 539 -477 b 533 -739 536 -563 539 -651 b 530 -824 531 -768 530 -795 b 546 -948 530 -865 533 -907 b 564 -989 552 -962 543 -989 z m 410 -288 b 193 -197 328 -288 253 -264 b 141 -60 160 -161 141 -108 b 157 6 141 -35 147 -12 b 259 158 189 58 217 112 b 438 291 311 215 364 266 b 528 305 468 301 498 305 b 554 304 537 305 546 304 b 553 212 554 274 554 242 b 426 115 498 199 446 164 b 416 68 419 99 416 84 b 425 12 416 49 420 30 b 474 -39 432 -17 448 -32 b 513 -43 487 -42 498 -43 b 547 -40 524 -43 536 -42 l 543 -272 b 461 -285 516 -278 488 -281 b 410 -288 444 -287 426 -288 z m 694 197 b 668 203 685 197 677 199 b 621 216 654 210 638 215 b 622 294 622 242 622 268 b 706 268 651 287 678 278 b 746 235 721 261 734 249 b 752 222 749 230 752 226 b 743 213 752 219 749 215 b 694 197 727 206 711 197 z',\n },\n timeSigPlus: {\n x_min: 0,\n x_max: 661,\n y_min: -358,\n y_max: 358,\n ha: 716,\n o: 'm 605 -516 b 629 -490 624 -516 629 -507 b 628 -475 629 -485 628 -481 b 613 -131 624 -405 616 -174 b 612 -96 612 -114 612 -96 l 647 -98 b 897 -115 730 -99 814 -109 b 940 -89 919 -117 935 -109 b 952 -24 946 -69 952 -46 b 948 9 952 -14 950 -3 b 912 39 942 26 933 37 b 609 60 822 48 609 60 b 616 392 609 60 608 291 b 567 488 619 436 605 467 b 511 516 550 498 531 514 b 498 511 507 516 503 514 b 478 446 475 501 480 469 b 467 150 474 348 469 249 b 465 59 465 121 465 59 l 372 49 b 73 14 272 36 173 24 b 49 13 65 13 56 13 b 0 -33 9 13 0 6 b 60 -141 0 -117 6 -140 b 112 -135 73 -141 91 -140 b 413 -102 213 -125 314 -112 b 464 -98 441 -99 464 -98 l 464 -145 b 477 -456 464 -249 468 -353 b 526 -510 478 -488 491 -507 b 589 -513 546 -511 569 -510 b 605 -516 595 -514 600 -516 z',\n },\n timeSigPlusSmall: {\n x_min: 0,\n x_max: 418,\n y_min: -197,\n y_max: 199,\n ha: 396,\n o: 'm 301 -284 b 330 -238 320 -284 324 -255 b 348 -46 350 -176 341 -111 b 374 -20 351 -27 356 -23 b 481 -17 409 -16 445 -17 b 566 -9 510 -17 537 -16 b 602 3 579 -7 602 -16 b 566 29 602 19 582 24 b 526 33 553 32 539 33 b 384 39 478 36 432 39 b 356 62 363 39 356 42 l 356 68 b 359 177 359 104 359 141 l 359 251 b 341 287 359 264 361 285 b 311 255 324 287 314 272 b 310 228 311 246 310 236 l 301 69 b 275 39 301 49 295 39 l 271 39 b 210 40 251 40 230 40 b 167 39 196 40 181 40 b 89 40 141 37 115 40 b 24 30 68 40 46 37 b 0 17 17 27 0 30 l 0 13 b 27 -17 3 0 7 -13 b 91 -22 49 -22 71 -22 b 153 -22 115 -22 137 -20 l 275 -22 b 295 -40 289 -22 295 -27 l 295 -48 b 288 -235 288 -109 287 -171 b 287 -264 288 -243 287 -253 b 301 -284 287 -275 289 -284 z',\n },\n timeSigMinus: {\n x_min: 0,\n x_max: 662,\n y_min: -54,\n y_max: 55,\n ha: 109,\n o: 'm 39 -78 b 49 -76 42 -78 45 -76 b 452 -75 94 -75 272 -75 b 861 -76 632 -75 814 -76 b 953 -20 927 -79 953 -66 b 948 27 953 -7 950 9 b 946 37 948 30 948 35 b 896 79 940 63 929 79 b 471 78 827 78 648 78 l 42 78 b 0 37 14 78 0 69 b 23 -66 0 0 17 -32 b 39 -78 24 -75 32 -76 z',\n },\n timeSigParensRight: {\n x_min: 0,\n x_max: 274.26483738379414,\n y_min: -722.6326530612245,\n y_max: 725,\n ha: 1447.6326530612246,\n o: 'm 37 -1038 b 69 -1031 48 -1044 59 -1038 b 88 -1015 76 -1027 82 -1021 b 164 -886 120 -976 147 -933 b 333 -351 233 -711 292 -534 b 395 118 366 -204 399 -59 b 389 245 392 144 392 194 b 120 996 369 521 265 766 b 68 1044 99 1030 84 1044 b 19 988 50 1044 36 1024 b 0 922 7 965 0 945 b 20 858 0 901 6 881 b 259 215 141 660 236 449 b 271 -1 266 143 271 71 b 252 -239 271 -82 265 -161 b 148 -667 228 -384 183 -524 b 39 -1009 120 -785 66 -893 b 33 -1031 37 -1017 33 -1024 b 37 -1038 33 -1034 35 -1037 z',\n },\n timeSigParensRightSmall: {\n x_min: 0,\n x_max: 154.4025307335204,\n y_min: -422,\n y_max: 422,\n ha: 844,\n o: 'm 43 -608 b 60 -598 48 -608 53 -605 b 117 -511 82 -572 102 -543 b 222 23 193 -350 219 -177 b 213 166 225 55 216 109 b 115 531 206 294 174 416 b 45 603 99 562 76 588 b 30 608 39 606 35 608 b 10 598 23 608 17 603 b 0 546 3 590 0 570 b 23 451 0 507 9 458 b 102 351 66 429 84 390 b 167 42 150 252 167 148 b 163 -49 167 12 166 -19 b 35 -449 151 -192 121 -330 b 14 -504 22 -467 14 -485 b 17 -527 14 -511 16 -520 l 30 -590 b 43 -608 33 -603 37 -608 z',\n },\n timeSigParensLeft: {\n x_min: 0.5555555555555556,\n x_max: 399.6216117372966,\n y_min: -728,\n y_max: 728,\n ha: 1456,\n o: 'm 562 -1048 b 573 -1043 566 -1048 570 -1047 b 553 -988 582 -1025 564 -1004 b 472 -884 527 -952 497 -920 b 210 -354 366 -717 275 -541 b 148 -6 170 -240 148 -124 b 160 148 148 45 153 96 b 315 678 189 331 242 508 b 431 901 350 755 380 834 b 459 950 451 926 461 939 b 435 995 459 962 451 972 b 364 1048 405 1034 383 1048 b 305 996 343 1048 325 1028 b 127 624 226 881 174 753 b 1 30 56 432 9 235 b 1 -32 1 9 0 -12 b 180 -629 13 -245 92 -438 b 363 -936 230 -739 298 -835 b 526 -1041 402 -995 448 -1041 b 562 -1048 537 -1040 552 -1048 z',\n },\n timeSigParensLeftSmall: {\n x_min: 0,\n x_max: 173.45497224367904,\n y_min: -405,\n y_max: 404,\n ha: 809,\n o: 'm 197 -583 b 222 -553 212 -582 219 -566 b 229 -497 226 -534 229 -516 b 213 -425 229 -472 225 -448 b 102 -177 173 -344 132 -262 b 62 30 78 -111 58 -42 b 91 183 66 82 75 134 b 215 426 118 271 156 356 b 249 552 246 465 252 505 b 230 582 249 563 246 582 b 197 563 219 582 206 576 b 71 356 144 500 105 429 b 0 50 26 259 3 158 b 13 -112 4 -3 7 -58 b 176 -559 29 -275 105 -416 b 196 -583 180 -569 186 -583 z',\n },\n noteheadDoubleWhole: {\n x_min: -0.4444444444444444,\n x_max: 614.1875,\n y_min: -223.03296670127517,\n y_max: 223,\n ha: 446.0329667012752,\n o: 'm 35 -321 b 62 -266 58 -318 58 -288 l 62 -194 b 63 50 62 -114 63 -32 b 60 189 63 96 63 143 b 43 300 59 226 60 265 b 29 321 40 308 39 321 l 26 321 b 0 292 13 318 0 310 b 0 248 0 278 -1 262 b 6 147 4 215 6 181 b 4 48 6 114 4 81 b 6 0 4 32 6 16 b 7 -36 7 -12 7 -24 l 7 -52 b 6 -156 7 -86 6 -121 b 19 -275 6 -196 9 -236 b 35 -321 23 -291 16 -323 z m 847 -314 b 871 -288 860 -315 867 -300 b 884 -187 881 -255 886 -222 b 876 115 878 -86 876 14 b 877 255 876 161 876 209 b 868 291 877 268 873 279 b 855 304 867 301 863 304 b 844 301 852 304 848 304 b 822 265 825 292 822 278 b 824 251 822 259 822 255 b 822 170 822 225 822 197 l 822 -20 b 835 -284 827 -86 825 -186 b 847 -314 837 -295 835 -311 z m 757 -291 b 793 -171 796 -255 792 -212 b 795 -49 795 -131 795 -91 b 786 207 795 36 791 121 b 779 240 786 217 783 229 b 766 258 776 246 776 258 b 762 256 765 258 763 256 b 739 236 752 253 740 252 b 733 177 737 216 732 197 b 737 20 737 125 739 73 l 737 -107 b 740 -202 737 -138 739 -170 b 757 -291 740 -230 743 -261 z m 128 -261 b 144 -251 135 -264 141 -256 b 158 -203 156 -236 157 -220 b 161 -137 161 -181 161 -158 b 157 30 161 -81 157 -26 b 158 76 157 45 157 60 l 158 101 b 156 225 158 141 158 183 b 137 253 156 235 154 253 l 134 253 b 109 222 120 251 109 242 b 104 91 108 179 104 134 b 108 -58 104 42 109 -9 b 107 -105 108 -73 108 -89 b 105 -127 107 -112 107 -120 b 118 -245 105 -167 114 -204 b 128 -261 118 -252 121 -259 z m 488 -242 b 693 -79 595 -249 685 -166 l 693 -55 b 690 0 693 -36 691 -17 b 540 187 684 84 621 164 b 449 200 508 196 480 200 b 210 104 363 200 282 163 b 186 56 196 92 186 76 b 207 -82 186 9 192 -37 b 300 -204 225 -132 248 -181 b 488 -242 356 -229 415 -240 z m 490 -88 b 449 -86 477 -88 464 -88 b 287 -56 399 -85 341 -78 b 258 -33 275 -52 258 -48 b 282 -7 258 -20 272 -13 b 458 43 340 23 399 43 b 580 14 497 43 537 35 b 618 -20 606 1 619 -9 b 592 -58 618 -30 609 -42 b 490 -88 562 -82 528 -88 z',\n },\n noteheadWhole: {\n x_min: 0,\n x_max: 380.16649762501584,\n y_min: -186.17102907059297,\n y_max: 165,\n ha: 351.17102907059297,\n o: 'm 547 40 b 223 -268 543 -151 367 -259 b 102 -233 180 -271 143 -248 l 62 -216 b 0 -127 22 -197 0 -166 b 6 -91 0 -115 1 -104 b 122 141 33 -9 69 71 b 327 238 170 204 249 238 b 514 158 397 238 467 212 b 547 40 544 125 549 84 z m 248 -107 b 384 -63 295 -102 341 -88 b 426 -23 402 -53 415 -40 b 435 3 432 -14 435 -6 b 413 32 435 14 428 24 b 301 73 376 49 343 73 b 272 69 291 73 282 72 b 121 -35 207 53 157 20 b 111 -58 117 -42 111 -50 b 125 -75 111 -65 115 -71 b 248 -107 164 -89 202 -107 z',\n },\n noteheadHalf: {\n x_min: 0,\n x_max: 334,\n y_min: -174,\n y_max: 175,\n ha: 349,\n o: 'm 480 56 b 167 -251 478 -115 331 -251 b 94 -242 143 -251 118 -248 b 9 -141 43 -229 20 -192 b 0 -68 3 -115 0 -91 b 284 249 0 95 127 200 b 304 252 289 251 297 252 b 481 78 374 252 481 170 b 480 56 481 71 481 63 z m 213 -102 b 399 6 274 -81 341 -48 b 402 17 400 7 402 13 b 399 27 402 22 400 26 b 311 94 373 53 353 88 b 292 95 305 95 300 95 b 130 27 230 95 181 55 b 69 -62 98 9 62 -29 b 161 -98 76 -98 128 -91 b 213 -102 174 -101 186 -101 z',\n },\n noteheadBlack: {\n x_min: 0,\n x_max: 334.04644433966797,\n y_min: -164,\n y_max: 164,\n ha: 328,\n o: 'm 112 -233 b 141 -236 122 -235 131 -236 b 481 104 279 -236 485 -48 b 403 222 477 141 478 192 b 334 236 382 232 359 236 b 1 -59 180 236 13 59 b 0 -85 1 -68 0 -76 b 112 -233 0 -157 32 -215 z',\n },\n noteheadXWhole: {\n x_min: 0,\n x_max: 506,\n y_min: -143.0823320899293,\n y_max: 144,\n ha: 287.0823320899293,\n o: 'm 53 -206 b 219 -163 117 -207 170 -196 b 314 -102 249 -141 282 -122 b 377 -63 334 -89 356 -76 b 514 -161 422 -96 468 -128 b 576 -196 534 -174 552 -196 b 589 -193 580 -196 585 -196 b 688 -174 625 -194 657 -181 b 711 -158 698 -171 711 -173 b 696 -143 711 -151 701 -147 b 503 -9 632 -98 567 -52 l 485 4 b 704 145 559 49 634 95 b 729 164 711 150 729 151 l 729 168 b 696 196 726 183 710 193 b 621 207 671 202 645 207 b 528 177 589 207 557 200 b 373 76 480 140 426 108 b 246 164 330 104 287 132 b 122 206 207 193 167 203 b 66 192 102 207 72 207 b 99 147 58 173 85 158 b 274 14 157 102 215 58 b 16 -164 184 -42 96 -98 b 0 -179 12 -168 0 -170 b 1 -183 0 -180 0 -183 b 26 -204 6 -193 12 -204 b 53 -206 37 -206 49 -206 z m 611 -177 b 376 -9 530 -118 452 -63 l 164 -143 b 104 -164 147 -154 130 -164 b 82 -161 96 -164 89 -164 b 230 -65 137 -125 183 -95 l 347 12 b 327 26 341 16 334 22 l 196 121 b 163 147 184 128 173 137 b 140 173 154 154 140 163 b 143 180 140 176 141 177 b 179 166 154 194 167 174 l 372 27 l 566 153 b 613 171 580 161 596 170 b 635 160 624 171 635 174 b 621 147 635 153 626 150 l 429 24 b 400 6 419 19 409 13 b 569 -117 456 -35 513 -75 b 611 -177 588 -130 608 -143 z',\n },\n noteheadXHalf: {\n x_min: 0,\n x_max: 421,\n y_min: -145.51844828189743,\n y_max: 151,\n ha: 296.51844828189746,\n o: 'm 490 -209 b 539 -207 505 -207 521 -207 b 606 -209 560 -207 583 -209 b 598 -196 602 -203 600 -199 l 406 -19 l 540 130 b 547 144 546 135 547 140 b 536 156 547 148 543 153 b 488 192 518 166 503 176 b 416 217 471 209 444 217 b 323 180 380 217 344 204 l 264 115 b 239 138 256 122 248 131 b 33 197 180 196 108 200 b 3 186 23 197 6 193 b 19 154 -1 174 10 163 b 171 12 69 107 120 59 b 19 -157 120 -45 69 -101 b 0 -177 14 -163 0 -166 b 1 -181 0 -179 0 -180 b 39 -203 9 -197 22 -203 l 186 -203 b 197 -202 190 -202 193 -200 l 213 -202 b 262 -180 228 -202 246 -199 l 314 -122 b 490 -209 363 -170 412 -216 z m 435 -148 b 291 -30 379 -112 337 -69 l 213 -118 b 190 -137 207 -125 202 -137 b 145 -111 173 -130 154 -127 b 160 -79 137 -98 151 -88 b 238 16 184 -48 212 -16 b 141 99 204 43 173 72 l 124 117 b 115 132 121 121 115 127 b 118 137 115 134 117 137 b 141 132 127 147 135 138 l 253 36 b 347 150 285 75 315 112 b 370 164 354 160 363 163 b 403 145 382 164 393 156 b 416 127 412 140 416 132 b 405 102 416 118 412 111 l 307 -10 b 413 -105 343 -42 379 -73 b 435 -148 425 -115 436 -125 z',\n },\n noteheadXBlack: {\n x_min: 0,\n x_max: 289,\n y_min: -156,\n y_max: 157,\n ha: 313,\n o: 'm 23 -225 b 69 -204 40 -223 56 -219 b 137 -131 92 -180 115 -157 l 209 -50 b 377 -197 264 -101 321 -148 b 403 -210 384 -203 393 -210 l 408 -210 b 416 -192 416 -207 416 -199 l 416 -186 b 403 -148 416 -171 413 -158 b 344 -81 384 -125 367 -101 b 252 -1 312 -55 282 -29 b 377 157 297 49 340 101 b 402 202 387 170 402 187 b 395 217 402 207 400 213 b 376 226 389 223 382 226 b 334 192 360 226 346 204 b 206 42 289 143 248 94 b 96 161 167 81 131 120 b 60 193 86 174 76 189 b 33 206 52 196 42 206 b 22 199 29 206 26 204 b 10 173 14 190 10 181 b 22 147 10 166 14 157 b 148 7 62 98 104 52 b 164 -7 154 1 158 -3 b 10 -189 111 -66 55 -122 b 0 -212 6 -197 0 -203 b 1 -217 0 -213 0 -216 b 23 -225 4 -226 14 -222 z',\n },\n noteheadCircleX: {\n x_min: 0,\n x_max: 344,\n y_min: -179,\n y_max: 175.12551922594866,\n ha: 354.12551922594866,\n o: 'm 99 -210 b 236 -258 137 -242 186 -258 b 418 -183 305 -258 374 -230 b 495 33 475 -120 495 -48 b 494 66 495 45 494 55 b 302 252 487 183 405 256 b 181 243 262 249 222 248 b 46 171 128 236 79 219 b 0 19 14 127 0 73 b 99 -210 0 -68 35 -156 z m 245 42 l 124 156 b 200 176 145 166 170 173 b 337 183 245 181 291 184 b 377 176 351 183 364 180 b 245 42 333 131 288 86 z m 392 -99 l 285 3 l 400 121 b 418 154 409 131 418 140 b 465 50 448 130 465 94 b 405 -112 462 -17 439 -73 z m 89 -120 b 48 0 56 -82 48 -42 b 89 112 48 35 59 76 b 109 101 96 111 102 108 l 210 7 l 187 -17 b 89 -120 151 -53 125 -82 z m 176 -183 b 127 -163 158 -179 141 -171 l 252 -32 l 372 -144 b 233 -189 334 -173 285 -189 b 176 -183 215 -189 196 -187 z',\n },\n noteheadTriangleUpWhole: {\n x_min: 0,\n x_max: 366,\n y_min: -145,\n y_max: 138,\n ha: 283,\n o: 'm 504 -209 b 527 -199 520 -209 527 -206 b 520 -180 527 -193 524 -187 b 459 -94 501 -151 480 -122 b 279 170 400 -6 341 82 b 242 199 266 190 253 199 b 206 167 230 199 219 189 b 10 -145 140 63 76 -42 b 0 -171 3 -156 0 -164 b 23 -200 0 -183 9 -192 b 55 -209 33 -206 45 -209 z m 202 -161 b 176 -137 183 -163 176 -156 b 187 -62 176 -111 179 -86 b 253 95 206 -10 228 42 b 337 -132 307 24 334 -49 b 311 -161 338 -153 334 -161 b 256 -160 294 -161 275 -160 b 202 -161 238 -160 220 -161 z',\n },\n noteheadTriangleUpHalf: {\n x_min: 0,\n x_max: 341.0833130378007,\n y_min: -159,\n y_max: 159,\n ha: 318,\n o: 'm 458 -226 b 478 -229 462 -223 469 -229 b 490 -222 482 -229 487 -228 b 477 -184 495 -207 484 -196 b 281 176 410 -65 346 56 b 238 225 269 194 261 213 b 225 229 232 226 228 228 b 209 215 217 229 213 225 b 4 -153 141 92 73 -30 b 0 -170 1 -158 0 -164 b 12 -189 0 -177 4 -183 b 66 -215 27 -202 43 -213 b 458 -226 194 -217 323 -222 z m 151 -167 b 298 75 204 -89 240 -1 b 301 82 300 76 301 79 l 357 -22 b 344 -43 353 -27 350 -37 b 285 -163 317 -79 312 -127 b 278 -170 282 -166 279 -167 z',\n },\n noteheadTriangleUpBlack: {\n x_min: 0,\n x_max: 346,\n y_min: -149,\n y_max: 149,\n ha: 298,\n o: 'm 481 -215 b 498 -209 487 -215 492 -215 b 482 -173 498 -194 488 -184 l 284 173 b 259 202 278 184 269 194 b 229 215 248 210 238 215 b 196 189 216 215 206 206 l 13 -150 b 3 -168 9 -156 6 -163 b 0 -180 1 -173 0 -177 b 12 -197 0 -187 4 -193 b 63 -213 29 -206 45 -213 b 481 -215 203 -213 343 -215 z',\n },\n noteheadDiamondWhole: {\n x_min: 0,\n x_max: 271,\n y_min: -132,\n y_max: 132,\n ha: 264,\n o: 'm 230 -177 b 256 -190 240 -186 249 -190 b 281 -173 265 -190 272 -184 b 382 -29 314 -124 347 -76 b 390 -10 387 -22 390 -14 b 376 12 390 -3 386 4 b 173 177 308 66 240 121 b 144 190 166 183 160 190 b 98 153 127 186 112 170 b 13 40 69 115 42 76 b 0 13 4 29 0 20 b 22 -19 0 3 7 -9 b 230 -177 92 -69 163 -122 z m 279 -128 b 261 -122 274 -134 266 -127 l 66 30 b 56 45 59 35 56 39 b 62 56 56 48 59 52 b 122 122 91 101 105 122 b 194 76 138 122 158 107 l 320 -26 b 336 -50 325 -32 336 -35 b 279 -128 318 -75 300 -102 z',\n },\n noteheadDiamondHalf: {\n x_min: 0,\n x_max: 295,\n y_min: -148,\n y_max: 148,\n ha: 296,\n o: 'm 228 -207 b 245 -213 235 -210 240 -213 b 264 -203 252 -213 258 -210 b 415 -46 314 -150 364 -98 b 425 -27 420 -40 425 -35 b 416 -10 425 -22 422 -16 b 217 200 350 60 284 131 b 194 213 212 207 204 213 b 170 196 181 213 177 203 b 14 33 118 143 68 86 b 0 7 4 23 0 16 b 17 -20 0 -1 6 -10 b 118 -114 52 -50 82 -85 b 228 -207 156 -144 184 -184 z m 209 -157 b 134 -69 177 -138 141 -115 b 130 -26 131 -55 130 -40 b 215 148 130 42 160 99 b 225 156 217 151 220 156 b 230 153 226 156 228 156 b 323 -26 276 104 321 55 b 298 -75 324 -42 315 -59 b 265 -109 287 -86 276 -99 b 209 -157 245 -125 228 -167 z',\n },\n noteheadDiamondBlack: {\n x_min: 0,\n x_max: 310,\n y_min: -146,\n y_max: 146,\n ha: 292,\n o: 'm 266 -210 b 289 -194 278 -209 284 -200 b 406 -76 330 -156 367 -115 b 446 -23 433 -49 446 -36 b 412 29 446 -10 435 3 b 405 36 409 30 408 33 b 252 196 354 89 304 143 b 225 210 243 204 235 210 b 204 202 219 210 212 209 b 10 24 141 141 75 82 b 0 9 4 19 0 14 b 9 -6 0 4 3 0 l 232 -192 b 266 -210 242 -200 256 -204 z',\n },\n noteheadSquareWhite: {\n x_min: 0,\n x_max: 350,\n y_min: -131,\n y_max: 131,\n ha: 262,\n o: 'm 468 -189 b 485 -187 474 -189 480 -189 b 500 -176 495 -187 500 -183 b 498 -168 500 -174 498 -171 b 497 -166 498 -167 497 -167 l 498 -164 b 504 -154 503 -163 504 -158 b 503 -138 504 -150 503 -144 l 503 -135 l 503 -94 b 492 66 500 -45 494 10 b 488 135 492 89 488 112 b 484 150 488 141 485 145 b 482 154 482 151 482 153 b 429 189 472 177 456 189 b 53 184 304 186 179 186 l 39 184 b 33 181 36 183 35 183 b 12 160 20 181 12 177 b 0 -109 9 71 4 -19 b 19 -137 0 -125 7 -134 b 23 -151 19 -141 20 -145 b 85 -187 37 -173 55 -187 b 468 -189 212 -187 340 -187 z m 246 -125 l 63 -125 b 66 -111 65 -122 66 -117 b 73 72 69 -50 71 10 l 73 130 b 88 128 78 128 82 128 b 148 130 108 130 128 130 b 271 128 190 130 230 128 l 271 130 l 420 130 b 428 20 425 92 425 56 l 436 -127 l 246 -127 z',\n },\n noteheadSquareBlack: {\n x_min: 0,\n x_max: 342,\n y_min: -129.98961937716263,\n y_max: 132.44444444444446,\n ha: 262.4340638216071,\n o: 'm 217 190 b 439 186 304 190 372 190 b 467 180 448 184 458 183 b 492 145 484 176 492 167 b 490 -124 490 56 490 -33 b 488 -141 490 -130 488 -135 b 456 -170 488 -163 478 -168 b 118 -183 344 -176 230 -181 b 29 -184 89 -183 60 -192 b 0 -148 4 -180 0 -168 b 1 29 1 -89 1 -30 l 1 156 b 36 190 3 187 4 190 b 217 190 102 192 168 190 z',\n },\n noteheadParenthesis: {\n x_min: -70.190112022022,\n x_max: 329,\n y_min: -196,\n y_max: 201,\n ha: 397,\n o: 'm 344 -279 b 382 -262 361 -288 370 -272 b 405 -233 390 -255 399 -245 b 474 9 455 -158 468 -73 b 416 228 474 78 448 174 b 364 282 403 249 387 271 b 344 289 359 285 350 288 b 331 279 338 289 333 287 b 325 248 328 269 325 258 b 338 225 325 238 328 229 b 412 138 379 207 396 174 b 445 1 433 92 445 45 b 346 -217 445 -81 410 -154 b 336 -252 340 -223 336 -238 b 344 -279 336 -265 338 -276 z m 19 -274 b 35 -282 24 -279 30 -281 b 49 -265 42 -282 46 -275 b 52 -243 50 -256 52 -249 b 36 -210 52 -230 49 -220 b -60 -59 -16 -173 -35 -114 b -73 9 -69 -39 -73 -16 b 33 223 -73 92 -24 189 b 50 265 43 229 50 249 b 33 288 50 278 46 289 b 4 272 23 288 14 275 b -9 261 0 269 -4 265 b -101 23 -58 193 -105 124 b -37 -206 -104 -52 -75 -130 b 19 -274 -23 -232 -6 -255 z',\n },\n noteheadParenthesisRight: {\n x_min: -30,\n x_max: 82,\n y_min: -199.08429092881173,\n y_max: 206,\n ha: 405.0842909288117,\n o: 'm -17 -282 b 24 -264 -6 -297 12 -272 b 60 -219 40 -253 52 -236 b 117 1 96 -150 112 -75 b 118 16 118 6 118 12 b 109 73 118 36 112 55 b 4 279 99 154 68 226 b -23 297 -4 287 -13 297 b -37 289 -27 297 -32 294 b -43 266 -42 285 -43 276 b -32 225 -43 251 -37 229 b 84 -7 48 170 84 82 b 32 -184 84 -69 65 -132 b -10 -222 22 -200 4 -209 b -24 -258 -20 -232 -24 -245 b -17 -282 -24 -266 -22 -276 z',\n },\n noteheadParenthesisLeft: {\n x_min: 0,\n x_max: 106,\n y_min: -197,\n y_max: 197,\n ha: 394,\n o: 'm 134 -284 b 138 -281 135 -284 137 -284 b 145 -268 144 -278 145 -274 l 144 -253 b 107 -180 138 -225 121 -204 b 42 13 71 -120 42 -56 b 49 73 42 32 43 52 b 137 210 62 128 95 171 b 153 255 147 219 153 239 b 145 278 153 265 151 274 b 130 284 140 281 135 284 b 98 259 117 284 108 268 b 0 37 35 203 1 131 b 118 -268 9 -69 53 -173 b 134 -284 121 -274 127 -284 z',\n },\n augmentationDot: {\n x_min: 0,\n x_max: 96,\n y_min: -57,\n y_max: 57,\n ha: 114,\n o: 'm 13 -82 b 16 -81 14 -82 14 -82 b 105 -73 46 -76 75 -76 b 131 -48 121 -72 131 -60 b 138 26 134 -24 138 0 b 137 48 138 33 138 40 b 108 82 134 71 125 82 b 95 81 104 82 99 82 b 33 71 75 78 53 75 b 4 46 20 68 6 62 b 0 -66 1 9 0 -29 b 13 -82 0 -73 1 -82 z',\n },\n tremolo1: {\n x_min: -158,\n x_max: 156.19381479578487,\n y_min: -88,\n y_max: 88,\n ha: 176,\n o: 'm -206 -127 b -194 -125 -203 -127 -199 -127 b 173 -36 -72 -94 50 -65 b 220 16 202 -29 215 -12 b 225 50 223 30 225 45 b 216 107 226 76 222 91 b 194 127 210 120 204 127 b 183 124 192 127 189 127 l -192 33 b -226 -9 -213 27 -222 14 b -228 -32 -226 -16 -228 -23 b -222 -108 -228 -58 -222 -82 b -206 -127 -222 -120 -217 -127 z',\n },\n flag8thUp: {\n x_min: 0,\n x_max: 261,\n y_min: -819,\n y_max: 0,\n ha: 819,\n o: 'm 265 -1171 b 351 -1035 301 -1130 336 -1087 b 376 -867 369 -979 376 -923 b 367 -755 376 -829 373 -792 b 233 -422 350 -632 311 -520 b 131 -291 199 -379 166 -334 b 65 -125 91 -239 66 -192 b 62 -75 65 -112 62 -91 b 42 0 62 -49 52 -24 l 35 0 b 0 -63 6 -13 0 -36 l 0 -144 b 96 -445 0 -255 29 -356 b 177 -547 124 -478 150 -514 b 308 -831 246 -629 298 -721 b 317 -890 310 -851 317 -871 b 311 -919 317 -900 315 -910 b 256 -1005 297 -950 282 -984 b 228 -1068 233 -1024 228 -1045 b 230 -1106 228 -1080 229 -1093 b 240 -1162 232 -1125 239 -1143 b 251 -1179 242 -1174 246 -1179 b 265 -1171 255 -1179 259 -1176 z',\n },\n flag8thDown: {\n x_min: 0,\n x_max: 261,\n y_min: 0,\n y_max: 819,\n ha: 819,\n o: 'm 265 1171 b 251 1179 259 1176 255 1179 b 240 1162 246 1179 242 1174 b 230 1106 239 1143 232 1125 b 228 1068 229 1093 228 1080 b 256 1005 228 1045 233 1024 b 311 919 282 984 297 950 b 317 890 315 910 317 900 b 308 831 317 871 310 851 b 177 547 298 721 246 629 b 96 445 150 514 124 478 b 0 144 29 356 0 255 l 0 63 b 35 0 0 36 6 13 l 42 0 b 62 75 52 24 62 49 b 59 117 62 91 59 104 b 131 291 60 183 91 239 b 233 422 166 334 199 379 b 367 755 311 520 350 632 b 376 867 373 792 376 829 b 351 1035 376 923 369 979 b 265 1171 336 1087 301 1130 z',\n },\n flag16thUp: {\n x_min: 0,\n x_max: 327.1591498636094,\n y_min: -819.3972596310256,\n y_max: 0,\n ha: 819.3972596310256,\n o: 'm 415 -1179 b 435 -1168 423 -1182 429 -1174 b 451 -1138 442 -1159 446 -1149 b 465 -1020 464 -1102 467 -1064 b 461 -962 464 -1004 464 -984 b 471 -821 467 -916 472 -870 b 465 -721 472 -791 467 -756 b 415 -520 459 -651 441 -585 b 200 -245 370 -408 284 -327 b 96 -114 160 -206 118 -168 b 75 -24 84 -85 85 -53 b 59 0 72 -16 72 0 b 53 -1 58 0 56 -1 b 27 -32 40 -6 27 -10 b 29 -68 27 -43 29 -55 b 10 -79 20 -69 13 -72 b 1 -109 6 -89 1 -99 b 0 -170 0 -130 0 -148 b 35 -410 0 -252 12 -333 b 258 -793 76 -557 156 -681 b 409 -1158 350 -896 410 -1014 b 415 -1179 409 -1165 405 -1175 z m 413 -816 b 331 -681 392 -769 364 -723 b 145 -420 266 -596 189 -521 b 86 -281 125 -374 102 -330 b 156 -370 105 -312 128 -343 b 318 -539 210 -425 269 -478 b 413 -816 383 -621 420 -713 z',\n },\n flag16thDown: {\n x_min: 0,\n x_max: 327.1591498636094,\n y_min: 0,\n y_max: 819,\n ha: 819,\n o: 'm 59 0 b 75 24 72 0 72 16 b 96 114 85 53 84 85 b 200 245 118 168 160 206 b 415 520 284 327 370 408 b 465 721 441 585 459 651 b 471 821 467 756 472 791 b 461 962 472 870 467 916 b 465 1020 464 984 464 1004 b 451 1138 467 1064 464 1102 b 435 1168 446 1149 442 1159 b 418 1179 431 1172 425 1179 l 415 1179 b 408 1169 409 1176 408 1174 b 409 1158 408 1165 409 1161 b 258 793 410 1014 350 896 b 35 410 156 681 76 557 b 0 170 12 333 0 252 l 0 88 b 29 7 0 71 6 23 b 59 0 33 4 58 0 z m 86 281 b 145 420 102 330 125 374 b 331 681 189 521 266 596 b 413 816 364 723 392 769 b 415 791 413 808 415 799 b 318 539 415 698 377 613 b 156 370 269 478 210 425 b 86 281 128 343 105 312 z',\n },\n flag32ndUp: {\n x_min: -0.19862981551275186,\n x_max: 268.0942440943661,\n y_min: -849.4710740978672,\n y_max: 149.0769891455102,\n ha: 998.5480632433774,\n o: 'm 323 -1223 b 351 -1198 337 -1227 344 -1210 b 359 -1184 354 -1194 356 -1188 b 386 -999 377 -1122 387 -1060 b 341 -783 386 -927 372 -855 b 330 -736 334 -769 330 -753 b 333 -708 330 -727 330 -717 b 344 -621 340 -678 344 -649 b 341 -579 344 -608 343 -593 b 328 -500 338 -553 328 -526 b 331 -475 328 -491 328 -484 b 347 -370 343 -438 348 -402 b 151 27 348 -212 288 -56 b 53 176 98 59 50 102 b 45 197 53 183 48 192 b 33 215 40 203 40 216 l 30 215 b 6 194 22 212 9 209 b 0 120 3 170 -1 145 b 0 -43 4 65 0 13 b 0 -98 0 -60 1 -79 b 4 -276 0 -157 6 -216 b 7 -456 4 -337 7 -397 b 66 -638 7 -523 22 -585 b 158 -724 94 -671 127 -697 b 318 -1011 246 -801 295 -899 b 321 -1044 321 -1021 321 -1032 b 312 -1152 321 -1080 312 -1116 b 317 -1192 312 -1165 314 -1179 b 323 -1223 320 -1202 311 -1220 z m 285 -376 b 121 -180 249 -289 173 -245 b 91 -105 104 -158 92 -135 b 288 -354 181 -144 288 -269 b 285 -376 288 -363 287 -370 z m 275 -657 b 111 -492 226 -589 163 -547 b 65 -376 78 -456 66 -418 b 71 -323 65 -360 68 -341 b 275 -657 164 -418 265 -504 z',\n },\n flag32ndDown: {\n x_min: -2.800802874905624,\n x_max: 268.09424409436605,\n y_min: -169.07698914551014,\n y_max: 829.4710740978672,\n ha: 998.5480632433773,\n o: 'm 323 1194 b 317 1164 311 1191 320 1174 b 312 1123 314 1151 312 1136 b 321 1015 312 1087 321 1051 b 318 982 321 1004 321 992 b 158 696 295 870 246 772 b 66 609 127 668 94 642 b 7 428 22 556 7 494 b 4 248 7 369 4 308 b -1 78 6 187 -10 137 b 0 14 0 59 0 32 l 0 -148 b 6 -223 0 -174 3 -199 b 30 -243 9 -238 22 -240 l 33 -243 b 45 -226 40 -245 40 -232 b 53 -204 48 -220 53 -212 b 151 -56 50 -131 98 -88 b 347 341 288 27 348 183 b 331 446 348 373 343 409 b 328 471 328 455 328 462 b 341 550 328 497 338 524 b 344 592 343 564 344 579 b 333 680 344 621 340 649 b 330 707 330 688 330 698 b 341 755 330 724 334 740 b 386 971 372 827 386 899 b 359 1155 387 1031 377 1093 b 351 1169 356 1159 354 1165 b 323 1194 344 1181 337 1198 z m 275 628 b 71 294 265 475 164 389 b 65 347 68 312 65 331 b 111 464 66 389 78 428 b 275 628 163 518 226 560 z m 285 347 b 288 325 287 341 288 334 b 91 76 288 240 181 115 b 121 151 92 107 104 130 b 285 347 173 216 249 261 z',\n },\n flag64thUp: {\n x_min: -4,\n x_max: 282,\n y_min: -823.5430338167067,\n y_max: 347,\n ha: 1170.5430338167066,\n o: 'm 350 -1185 b 380 -1162 364 -1189 374 -1175 b 406 -1022 399 -1119 406 -1071 b 359 -798 406 -945 384 -871 b 348 -756 353 -785 348 -772 b 350 -744 348 -753 350 -749 b 363 -621 356 -704 363 -664 b 360 -580 363 -608 363 -593 b 359 -560 359 -573 359 -567 b 373 -490 359 -536 366 -513 b 393 -346 386 -444 393 -395 b 387 -269 393 -320 390 -294 b 348 -127 382 -219 348 -173 b 351 -104 348 -120 348 -111 b 353 -65 351 -91 353 -78 b 341 37 353 -26 348 6 b 226 215 323 108 278 164 b 86 336 181 258 127 288 b 62 395 72 353 62 370 b 42 481 62 423 55 454 b 27 500 37 488 36 500 b 24 498 26 500 26 500 b -1 480 14 497 1 492 b -6 444 -4 467 -6 455 l -6 435 b -1 341 -1 403 -1 372 l -1 266 b 6 156 -1 230 0 193 b 13 35 12 117 13 75 l 13 -35 b 14 -85 13 -52 14 -68 b 29 -276 19 -150 33 -213 b 20 -448 24 -334 20 -392 b 24 -534 20 -477 22 -505 b 114 -708 30 -605 59 -664 b 197 -780 143 -732 171 -755 b 344 -1153 301 -884 341 -1011 b 343 -1172 344 -1159 343 -1166 b 350 -1185 343 -1176 344 -1182 z m 287 -88 b 62 193 186 -17 79 48 b 229 52 121 144 174 98 b 289 -33 256 29 274 -3 b 295 -56 294 -42 295 -49 b 287 -88 295 -66 292 -76 z m 298 -410 b 118 -235 238 -351 176 -295 b 76 -88 82 -197 78 -147 b 268 -252 137 -153 203 -202 b 330 -360 304 -279 330 -315 b 323 -402 330 -373 327 -387 b 311 -418 318 -413 315 -418 b 298 -410 307 -418 302 -415 z m 300 -691 b 117 -508 243 -616 168 -575 b 82 -408 94 -480 82 -448 b 84 -379 82 -397 82 -387 b 259 -553 135 -451 206 -492 b 301 -667 287 -583 301 -619 b 300 -691 301 -674 301 -683 z',\n },\n flag64thDown: {\n x_min: -5,\n x_max: 281,\n y_min: -375,\n y_max: 795.5430338167066,\n ha: 1170.5430338167066,\n o: 'm 348 1145 b 341 1132 343 1142 341 1136 b 343 1113 341 1126 343 1119 b 196 740 340 971 300 844 b 112 668 170 714 141 691 b 23 494 58 624 29 564 b 19 408 20 465 19 436 b 27 236 19 351 23 294 b 13 45 32 173 17 109 b 12 -6 13 27 12 12 l 12 -75 b 4 -196 12 -115 10 -157 b -3 -307 -1 -233 -3 -271 l -3 -382 b -7 -475 -3 -412 -3 -444 l -7 -484 b -3 -520 -7 -495 -6 -507 b 23 -539 0 -533 13 -537 b 26 -540 24 -540 24 -540 b 40 -521 35 -540 36 -528 b 60 -435 53 -494 60 -464 b 85 -376 60 -410 71 -393 b 225 -255 125 -328 180 -298 b 340 -78 276 -204 321 -148 b 351 24 347 -46 351 -14 b 350 63 351 37 350 50 b 347 86 347 71 347 79 b 386 229 347 132 380 179 b 392 305 389 253 392 279 b 372 449 392 354 384 403 b 357 520 364 472 357 495 b 359 540 357 527 357 533 b 361 580 361 553 361 567 b 348 704 361 624 354 664 b 347 716 348 708 347 713 b 357 757 347 732 351 744 b 405 982 383 831 405 904 b 379 1122 405 1031 397 1079 b 348 1145 373 1135 363 1149 z m 298 651 b 300 626 300 642 300 634 b 258 513 300 579 285 543 b 82 338 204 452 134 410 b 81 367 81 347 81 357 b 115 468 81 408 92 439 b 298 651 167 534 242 576 z m 297 370 b 310 377 301 374 305 377 b 321 361 314 377 317 373 b 328 320 325 347 328 333 b 266 212 328 275 302 239 b 75 48 202 161 135 112 b 117 194 76 107 81 157 b 297 370 174 255 236 311 z m 285 48 b 294 16 291 36 294 26 b 288 -7 294 9 292 1 b 228 -92 272 -37 255 -69 b 60 -233 173 -138 120 -184 b 285 48 78 -88 184 -23 z',\n },\n flag128thUp: {\n x_min: 0,\n x_max: 252,\n y_min: -804,\n y_max: 530,\n ha: 1334,\n o: 'm 298 -1158 b 328 -1126 312 -1158 320 -1139 b 330 -1116 330 -1123 330 -1119 b 347 -996 343 -1076 347 -1037 b 328 -837 347 -943 338 -890 b 320 -778 324 -816 320 -798 b 330 -733 320 -763 323 -749 b 340 -665 338 -714 337 -688 b 341 -645 340 -660 341 -652 b 333 -534 341 -609 333 -572 b 343 -471 333 -513 334 -492 b 361 -366 356 -436 361 -402 b 331 -202 361 -311 348 -256 b 328 -187 330 -197 328 -193 b 331 -179 328 -184 328 -181 b 363 -55 353 -137 363 -96 b 337 79 363 -12 351 33 b 327 114 333 92 327 104 b 344 144 327 124 331 132 b 359 174 353 150 357 163 b 361 228 360 193 361 210 b 243 517 361 337 325 435 b 147 596 213 546 179 569 b 75 708 111 626 75 655 b 62 744 75 723 68 733 b 50 763 58 752 58 763 b 46 762 49 763 48 762 b 17 742 36 757 22 757 b 0 697 14 726 0 711 b 1 595 0 662 3 631 b 0 469 0 552 0 511 b 1 429 0 456 0 442 b 22 289 6 382 22 337 b 24 128 22 238 24 184 b 22 66 24 108 23 86 b 19 -19 20 37 19 10 b 20 -132 19 -56 20 -95 b 13 -276 20 -180 19 -229 b 9 -359 10 -304 9 -330 b 12 -487 9 -402 12 -445 b 56 -582 12 -526 29 -554 b 197 -742 107 -632 160 -681 b 288 -1100 265 -851 276 -976 b 288 -1122 288 -1107 287 -1115 b 287 -1145 289 -1129 287 -1138 b 298 -1158 287 -1153 288 -1158 z m 304 150 b 75 475 229 256 112 334 b 304 150 233 357 305 287 z m 271 -73 b 127 72 233 -14 179 26 b 81 167 96 98 81 127 b 84 194 81 176 82 184 b 271 -73 148 102 242 39 z m 279 -396 b 132 -223 233 -330 180 -279 b 81 -112 104 -192 81 -156 b 82 -91 81 -105 81 -98 b 279 -396 167 -125 269 -281 z m 249 -609 b 69 -357 197 -520 88 -471 b 249 -609 131 -441 229 -498 z',\n },\n flag128thDown: {\n x_min: -0.8888888888888888,\n x_max: 252,\n y_min: -580,\n y_max: 754,\n ha: 1334,\n o: 'm 298 1086 b 287 1073 288 1086 287 1081 b 288 1050 287 1066 289 1057 b 288 1028 287 1043 288 1035 b 197 670 276 904 265 779 b 56 510 160 609 107 560 b 12 415 29 482 12 454 b 9 287 12 373 9 330 b 13 204 9 258 10 232 b 20 60 19 157 20 108 b 19 -53 20 23 19 -16 b 22 -138 19 -82 20 -109 b 24 -200 23 -158 24 -180 b 22 -361 24 -256 22 -310 b 1 -501 22 -409 6 -454 b 0 -541 0 -514 0 -528 b 0 -667 0 -583 -3 -624 b 0 -809 0 -675 -3 -791 b 46 -834 4 -825 36 -829 b 50 -835 48 -834 49 -835 b 62 -816 58 -835 58 -824 b 75 -780 68 -805 75 -795 b 147 -668 75 -727 111 -698 b 243 -589 179 -641 213 -618 b 361 -300 325 -507 361 -409 b 359 -246 361 -282 360 -265 b 344 -216 357 -235 353 -222 b 327 -186 331 -204 327 -196 b 337 -151 327 -176 333 -164 b 363 -17 351 -105 363 -60 b 331 107 363 24 353 65 b 328 115 328 109 328 112 b 331 130 328 121 330 125 b 361 294 348 184 361 239 b 343 399 361 330 356 364 b 333 462 334 420 333 441 b 341 573 333 500 341 537 b 340 593 341 580 340 588 b 330 661 337 616 338 642 b 320 706 323 677 320 691 b 328 765 320 726 324 744 b 347 924 338 818 347 871 b 330 1044 347 965 343 1004 b 328 1054 330 1047 330 1051 b 298 1086 320 1067 312 1086 z m 249 537 b 69 285 229 426 131 369 b 249 537 88 399 197 448 z m 279 324 b 82 19 269 209 167 53 b 81 40 81 26 81 33 b 132 151 81 84 104 120 b 279 324 180 207 233 258 z m 271 1 b 84 -266 242 -111 148 -174 b 81 -239 82 -256 81 -248 b 127 -144 81 -199 96 -170 b 271 1 179 -98 233 -58 z m 304 -222 b 75 -547 305 -359 233 -429 b 304 -222 112 -406 229 -328 z',\n },\n accidentalFlat: {\n x_min: 1,\n x_max: 209,\n y_min: -208,\n y_max: 472,\n ha: 680,\n o: 'm 29 -300 b 46 -289 33 -300 39 -297 b 107 -243 65 -274 86 -258 b 301 127 233 -153 301 -30 b 298 186 301 147 301 166 b 190 297 291 256 251 297 b 147 289 177 297 163 294 b 86 265 127 284 107 274 l 85 264 l 85 301 b 91 465 85 356 88 410 b 94 559 91 497 94 527 b 84 651 94 589 91 621 b 66 680 81 661 81 680 l 65 680 b 37 645 49 678 37 665 b 33 523 36 605 32 563 l 33 478 b 26 223 33 393 29 308 b 1 -141 22 101 1 -19 b 17 -287 1 -189 4 -239 b 29 -300 20 -295 23 -300 z m 68 -105 b 76 12 71 -68 72 -29 b 81 107 79 43 81 75 l 86 109 b 171 135 114 121 141 135 b 204 128 181 135 193 132 b 238 92 228 120 239 108 b 230 63 238 84 236 75 b 68 -105 193 -10 132 -59 z',\n },\n accidentalNatural: {\n x_min: 0,\n x_max: 213.5,\n y_min: -456,\n y_max: 462,\n ha: 918,\n o: 'm 255 -657 b 281 -624 271 -657 275 -636 b 285 -599 282 -615 285 -608 b 292 -300 288 -500 289 -400 b 289 -161 292 -253 289 -207 b 300 128 292 -65 297 32 b 304 168 300 128 302 150 l 304 173 l 305 190 l 305 199 l 307 225 b 304 259 307 229 310 246 b 272 298 297 274 302 305 b 63 266 204 279 134 272 b 72 514 68 348 72 432 b 71 595 72 541 72 567 b 56 665 71 619 66 642 b 17 579 9 651 17 608 b 3 144 19 433 7 289 b 0 -7 1 94 0 43 b 3 -134 0 -50 1 -92 b 7 -219 3 -163 7 -192 b 35 -251 7 -243 17 -251 b 49 -249 39 -251 43 -251 l 223 -223 l 230 -222 l 230 -359 b 223 -516 230 -410 223 -464 b 236 -619 223 -550 226 -585 b 255 -657 240 -634 236 -657 z m 58 -63 b 55 81 56 -14 53 33 l 56 99 b 85 99 65 99 75 98 b 232 108 134 104 183 107 l 240 109 l 236 66 b 232 -48 235 29 232 -10 b 58 -81 174 -63 115 -73 z',\n },\n accidentalSharp: {\n x_min: -22,\n x_max: 390,\n y_min: -384,\n y_max: 383,\n ha: 767,\n o: 'm 202 -553 b 219 -526 213 -552 216 -536 b 226 -471 225 -507 226 -488 b 225 -425 226 -455 225 -441 b 226 -392 225 -415 225 -402 b 233 -305 229 -363 232 -334 l 297 -292 b 331 -469 300 -353 311 -412 b 347 -485 333 -477 338 -485 b 363 -469 356 -487 359 -477 b 374 -418 373 -454 374 -435 b 376 -382 376 -405 376 -393 b 372 -276 376 -347 373 -311 l 455 -259 b 550 -156 534 -243 544 -232 b 550 -109 550 -137 552 -124 b 526 -78 549 -91 541 -78 l 523 -78 b 507 -79 517 -78 513 -78 b 403 -101 474 -88 438 -95 l 379 -105 b 382 -42 380 -85 380 -63 b 384 96 383 4 384 50 b 503 131 425 107 464 118 b 549 173 524 138 543 150 b 562 249 554 199 562 223 b 554 294 562 264 560 279 b 536 315 549 308 544 315 l 533 315 b 517 312 528 315 523 315 b 382 266 472 294 428 279 l 377 344 b 359 531 374 406 372 469 b 348 552 356 539 357 552 l 347 552 l 343 552 b 315 528 331 549 317 544 l 315 501 b 320 249 315 416 318 333 l 243 232 b 239 361 243 275 242 318 b 226 425 238 383 238 403 b 199 359 194 409 199 382 b 193 223 196 312 194 268 b 72 202 153 215 112 209 b 4 118 13 192 4 183 b 10 66 0 102 12 84 b 33 29 7 39 14 30 b 48 32 37 29 42 30 b 187 55 95 39 141 46 l 183 -75 b 176 -145 181 -99 179 -122 b 16 -179 122 -156 69 -166 b -32 -232 -14 -186 -32 -197 b -17 -331 -32 -266 -19 -298 b -1 -356 -17 -347 -13 -354 b 12 -353 1 -356 6 -354 b 167 -320 63 -341 115 -331 b 166 -377 166 -338 166 -357 b 189 -526 166 -428 171 -477 b 202 -553 192 -536 189 -553 z m 240 -132 b 243 -37 242 -101 242 -69 b 245 65 245 -3 245 30 b 315 79 269 69 292 73 b 301 -120 308 13 305 -53 z',\n },\n accidentalDoubleSharp: {\n x_min: 0,\n x_max: 287,\n y_min: -159,\n y_max: 159,\n ha: 318,\n o: 'm 84 -229 b 107 -216 91 -229 98 -225 b 200 -125 138 -186 167 -154 b 232 -95 212 -115 222 -105 b 347 -189 271 -125 310 -157 b 370 -200 356 -196 363 -200 b 396 -179 380 -200 389 -192 b 412 -102 410 -154 406 -125 b 377 -27 410 -69 400 -46 l 325 14 b 402 91 350 42 374 68 b 413 127 410 96 413 107 b 382 200 409 148 397 176 b 350 229 370 220 360 229 b 314 210 340 229 328 223 b 274 174 300 199 285 187 b 212 104 252 151 232 128 b 92 187 173 132 132 161 b 78 193 86 192 82 193 b 68 190 75 193 72 193 b 48 179 62 186 53 187 b 40 137 43 168 40 154 b 81 16 40 92 56 32 b 107 -3 89 10 98 4 b 14 -94 76 -32 45 -62 b 0 -124 6 -102 0 -114 b 12 -154 0 -134 3 -144 b 62 -215 26 -176 48 -193 b 84 -229 69 -225 76 -229 z',\n },\n accidentalDoubleFlat: {\n x_min: 0,\n x_max: 359,\n y_min: -220,\n y_max: 446,\n ha: 666,\n o: 'm 43 -317 b 72 -301 55 -317 63 -310 b 160 -186 108 -268 134 -226 b 236 -60 186 -145 212 -102 b 233 -131 235 -85 233 -108 b 239 -220 233 -161 235 -190 b 259 -246 240 -233 239 -240 b 301 -228 284 -252 291 -238 b 465 -7 369 -163 416 -85 b 517 173 500 48 517 108 b 451 307 517 229 505 284 b 409 315 436 312 422 315 b 331 287 382 315 356 305 b 311 274 324 282 320 274 l 310 274 l 310 566 b 305 621 310 585 312 603 b 294 642 301 628 305 642 l 292 642 b 264 622 282 641 266 636 b 253 575 259 606 256 590 b 246 418 248 523 246 471 b 248 243 246 360 248 302 l 248 187 b 164 238 220 225 193 238 b 85 213 140 238 112 226 b 84 229 85 220 84 225 b 86 315 85 258 86 287 b 81 528 86 386 82 458 b 71 582 81 547 78 566 b 56 603 66 590 68 603 l 53 603 b 23 580 40 600 26 598 b 19 537 20 566 19 552 b 20 514 19 530 19 521 b 26 390 24 472 26 432 b 14 66 26 282 16 174 b 0 -168 13 -12 0 -91 b 12 -279 0 -206 3 -242 b 30 -314 16 -294 14 -308 b 43 -317 35 -317 39 -317 z m 301 -72 b 302 7 302 -45 302 -19 l 302 86 b 351 158 304 121 321 145 b 383 166 361 163 373 166 b 435 143 402 166 419 157 b 445 127 441 138 445 132 b 441 114 445 122 444 118 b 301 -72 397 49 354 -14 z m 75 -147 b 73 30 75 -86 75 -29 b 118 82 73 62 92 76 b 132 84 124 84 128 84 b 190 52 156 84 174 69 b 193 40 192 49 193 45 b 192 33 193 37 193 35 b 75 -147 157 -30 125 -95 z',\n },\n accidentalParensLeft: {\n x_min: 0,\n x_max: 130.18934911242604,\n y_min: -270,\n y_max: 267.6082500723851,\n ha: 537.6082500723851,\n o: 'm 107 -389 b 127 -374 114 -389 120 -384 b 141 -347 132 -367 137 -357 b 151 -294 148 -330 151 -311 b 122 -207 151 -265 141 -236 b 63 -65 94 -164 72 -117 b 59 -10 60 -46 59 -27 b 145 223 59 78 94 153 b 187 354 176 262 189 305 b 177 384 187 364 190 380 b 143 373 166 387 153 383 b 124 354 137 367 130 361 b 0 -35 33 240 0 108 l 0 -92 b 85 -372 4 -193 27 -287 b 107 -389 92 -383 99 -389 z',\n },\n accidentalParensRight: {\n x_min: -0.4444444444444445,\n x_max: 139,\n y_min: -275,\n y_max: 277,\n ha: 552,\n o: 'm 58 -396 b 96 -354 75 -396 85 -370 b 200 13 168 -238 200 -111 b 153 268 200 109 184 190 b 49 392 131 320 101 364 b 26 399 40 397 33 399 b 0 366 10 399 0 387 b 0 318 -1 350 0 334 l 0 291 b 27 238 -3 266 7 253 b 143 9 105 180 143 98 b 141 -20 143 -1 143 -10 b 63 -225 135 -92 108 -164 b 36 -307 45 -251 36 -278 b 40 -344 36 -320 37 -331 b 42 -356 42 -347 42 -351 b 58 -396 42 -374 37 -396 z',\n },\n accidentalQuarterToneFlatStein: {\n x_min: 0,\n x_max: 208,\n y_min: -240,\n y_max: 440,\n ha: 680,\n o: 'm 272 -346 b 284 -333 278 -346 281 -341 b 300 -187 297 -285 300 -235 b 275 177 300 -65 279 55 b 268 432 272 262 268 347 l 268 477 b 264 599 269 517 265 559 b 236 634 264 619 252 632 l 235 634 b 217 605 220 634 220 615 b 207 513 210 575 207 543 b 210 419 207 481 210 451 b 216 255 213 364 216 310 l 216 217 l 215 219 b 154 243 194 228 174 238 b 111 251 138 248 124 251 b 3 140 50 251 10 210 b 0 81 0 120 0 101 b 194 -289 0 -76 68 -199 b 255 -336 215 -304 236 -320 b 272 -346 262 -343 268 -346 z m 233 -151 b 71 17 168 -105 108 -56 b 63 46 65 29 63 37 b 96 82 62 62 73 73 b 130 89 108 86 120 89 b 215 63 160 89 187 75 l 220 60 b 225 -35 220 29 222 -3 b 233 -151 229 -75 230 -114 z',\n },\n accidentalThreeQuarterTonesFlatZimmermann: {\n x_min: 0,\n x_max: 422,\n y_min: -240,\n y_max: 440,\n ha: 680,\n o: 'm 272 -346 b 284 -333 278 -346 281 -341 b 300 -187 297 -285 300 -235 b 275 177 300 -65 279 55 b 268 432 272 262 268 347 l 268 477 b 264 599 269 517 265 559 b 236 634 264 619 252 632 l 235 634 b 217 605 220 634 220 615 b 207 513 210 575 207 543 b 210 419 207 481 210 451 b 216 255 213 364 216 310 l 216 217 l 215 219 b 154 243 194 228 174 238 b 111 251 138 248 124 251 b 3 140 50 251 10 210 b 0 81 0 120 0 101 b 194 -289 0 -76 68 -199 b 255 -336 215 -304 236 -320 b 272 -346 262 -343 268 -346 z m 336 -346 b 353 -336 340 -346 346 -343 b 413 -289 372 -320 393 -304 b 608 81 540 -199 608 -76 b 605 140 608 101 608 120 b 497 251 598 210 557 251 b 454 243 484 251 469 248 b 393 219 433 238 413 228 l 392 217 l 392 255 b 397 419 392 310 395 364 b 400 513 397 451 400 481 b 390 605 400 543 397 575 b 373 634 387 615 387 634 l 372 634 b 344 599 356 632 344 619 b 340 477 343 559 338 517 l 340 432 b 333 177 340 347 336 262 b 308 -187 328 55 308 -65 b 324 -333 308 -235 311 -285 b 336 -346 327 -341 330 -346 z m 233 -151 b 71 17 168 -105 108 -56 b 63 46 65 29 63 37 b 96 82 62 62 73 73 b 130 89 108 86 120 89 b 215 63 160 89 187 75 l 220 60 b 225 -35 220 29 222 -3 b 233 -151 229 -75 230 -114 z m 374 -151 b 383 -35 377 -114 379 -75 b 387 60 386 -3 387 29 l 393 63 b 478 89 420 75 448 89 b 511 82 488 89 500 86 b 544 46 534 73 546 62 b 537 17 544 37 543 29 b 374 -151 500 -56 439 -105 z',\n },\n accidentalQuarterToneSharpStein: {\n x_min: 0,\n x_max: 300,\n y_min: -338,\n y_max: 351,\n ha: 689,\n o: 'm 194 -487 b 225 -432 215 -469 223 -452 b 238 -232 229 -366 236 -298 b 377 -199 285 -220 331 -209 b 418 -164 397 -193 410 -181 b 432 -88 428 -138 432 -114 b 412 -42 432 -55 428 -42 b 389 -46 406 -42 399 -43 l 235 -85 b 233 -20 235 -63 233 -42 b 233 105 232 22 233 63 b 312 121 259 111 285 117 b 406 226 390 134 400 145 b 373 284 409 268 402 284 b 344 281 364 284 356 282 b 232 258 307 276 269 266 b 230 308 232 275 232 291 b 210 505 229 374 232 441 b 183 471 189 501 184 490 b 180 406 181 449 180 428 b 184 246 180 353 184 300 b 48 222 140 236 94 228 b 0 168 6 216 0 209 b 7 86 1 141 4 114 b 27 66 9 73 13 66 l 35 66 b 184 94 85 66 135 84 b 187 -1 184 62 186 30 b 190 -96 189 -33 190 -65 l 112 -114 b 35 -213 27 -132 35 -132 b 33 -253 35 -226 35 -240 b 49 -276 33 -269 37 -276 b 62 -275 52 -276 56 -276 l 186 -245 l 186 -256 b 179 -387 180 -300 177 -343 b 194 -487 180 -419 179 -454 z',\n },\n accidentalThreeQuarterTonesSharpStein: {\n x_min: -23,\n x_max: 388,\n y_min: -373,\n y_max: 445,\n ha: 818,\n o: 'm 114 -537 b 138 -475 137 -518 138 -495 b 147 -292 138 -413 144 -353 b 212 -278 168 -287 190 -282 b 243 -444 215 -333 225 -389 b 261 -467 248 -454 251 -465 b 281 -446 272 -469 276 -455 b 292 -347 292 -416 288 -384 b 288 -262 289 -320 288 -291 l 374 -245 b 376 -311 374 -266 374 -288 b 390 -456 379 -357 379 -405 b 416 -396 412 -436 415 -418 b 423 -287 420 -360 423 -323 b 422 -235 423 -269 423 -252 b 451 -229 432 -233 441 -232 b 547 -98 524 -215 547 -199 l 547 -89 b 521 -49 546 -59 540 -49 b 497 -52 516 -49 507 -49 b 418 -68 469 -56 444 -63 b 423 52 419 -29 422 12 b 426 140 425 81 425 109 b 495 160 449 145 472 153 b 552 219 526 170 546 189 b 559 279 557 240 553 262 b 530 341 559 324 552 341 b 490 331 520 341 507 338 b 432 311 471 324 452 318 b 449 552 436 392 442 471 b 452 588 451 563 452 575 b 446 622 452 599 451 611 b 436 641 444 629 448 641 b 418 628 428 641 420 636 b 409 602 413 621 410 611 b 386 297 396 501 390 399 b 297 274 356 288 327 281 b 291 403 295 317 294 360 b 274 550 288 452 284 501 b 259 569 271 564 265 569 b 240 559 253 569 248 563 b 230 537 232 554 230 546 l 230 488 b 233 369 230 448 232 409 b 236 261 236 333 238 297 b 156 245 210 255 183 251 b 154 396 154 295 154 346 b 150 416 154 403 153 410 b 140 438 145 423 150 438 l 138 438 b 118 413 128 436 118 428 b 112 354 118 393 114 374 b 109 238 109 315 109 276 b 49 226 89 233 69 230 b 3 163 16 222 3 202 b 7 91 3 138 9 114 b 29 62 7 69 13 62 b 39 63 32 62 35 63 b 104 73 60 66 82 71 b 101 -10 104 46 102 17 l 92 -132 l 10 -150 b -33 -204 -19 -157 -33 -170 b -19 -310 -32 -240 -19 -274 b -6 -324 -19 -321 -13 -324 b 6 -323 -1 -324 1 -324 b 82 -307 32 -317 58 -311 b 81 -376 82 -330 81 -353 b 114 -537 81 -431 94 -484 z m 294 -92 b 297 -37 295 -73 295 -56 b 300 49 300 -9 300 20 l 300 108 b 379 127 325 114 353 120 b 374 -76 376 59 374 -9 b 294 -92 347 -82 320 -86 z m 154 -120 b 157 20 154 -73 156 -26 b 158 82 158 40 158 62 b 230 95 183 86 206 89 b 225 0 229 63 226 32 b 217 -107 223 -35 220 -71 z',\n },\n accidentalBuyukMucennebFlat: {\n x_min: 1.8692317181955784,\n x_max: 287,\n y_min: -248,\n y_max: 432.4720949426819,\n ha: 680.4720949426819,\n o: 'm 410 128 b 302 239 403 199 363 239 b 259 232 289 239 275 236 b 199 207 239 226 219 216 l 197 206 l 197 243 l 197 251 b 347 317 248 272 298 295 b 376 347 360 324 372 334 b 389 435 387 376 393 405 b 348 454 384 462 377 465 b 202 387 300 432 251 409 b 203 408 203 395 203 402 l 203 431 b 347 490 252 451 300 469 b 376 517 360 495 372 505 b 389 599 387 546 393 572 b 348 616 384 625 377 628 l 203 556 b 196 593 202 569 199 582 b 179 622 193 603 193 622 l 177 622 b 150 588 161 621 150 608 b 147 533 150 570 148 552 b 29 488 108 517 69 503 b 3 455 12 482 3 472 b 12 353 1 422 9 389 b 145 408 56 372 101 389 b 145 363 145 392 145 377 l 29 315 b 3 281 12 310 3 298 b 12 170 1 245 9 209 l 141 226 b 138 166 140 206 138 186 b 114 -199 134 43 115 -76 b 130 -344 114 -246 117 -297 b 141 -357 132 -353 135 -357 b 158 -347 145 -357 151 -354 b 219 -301 177 -331 199 -315 b 413 69 346 -210 413 -88 b 410 128 413 89 413 108 z m 350 35 b 343 6 350 26 348 17 b 180 -163 308 -69 245 -117 b 189 -46 183 -125 184 -86 b 193 49 192 -14 193 17 l 199 52 b 284 78 226 63 253 78 b 317 71 294 78 305 75 b 350 35 340 62 351 50 z',\n },\n accidentalBakiyeFlat: {\n x_min: 1.8692317181955784,\n x_max: 287,\n y_min: -236,\n y_max: 444,\n ha: 680,\n o: 'm 141 -340 b 158 -330 145 -340 151 -337 b 219 -284 177 -314 199 -298 b 413 86 346 -193 413 -71 b 410 145 413 107 413 125 b 302 256 403 216 363 256 b 259 249 289 256 275 253 b 199 225 239 243 219 233 l 197 223 l 197 261 b 199 334 197 285 199 310 b 347 406 249 357 298 382 b 376 439 360 413 372 425 b 390 516 384 465 390 490 b 389 537 390 523 390 530 b 372 564 384 556 382 564 b 348 557 367 564 359 562 b 204 487 300 537 253 510 b 206 518 206 497 206 507 b 196 611 206 549 203 580 b 179 639 193 621 193 639 l 177 639 b 150 605 161 638 150 625 b 145 482 148 564 144 523 l 145 458 b 29 405 107 439 68 420 b 3 366 12 397 3 386 b 12 243 1 325 9 287 b 143 307 56 265 99 285 l 138 183 b 114 -181 134 60 114 -59 b 130 -327 114 -229 117 -279 b 141 -340 132 -336 135 -340 z m 180 -145 b 189 -29 183 -108 184 -69 b 193 66 192 3 193 35 l 199 69 b 284 95 226 81 253 95 b 317 88 294 95 305 92 b 350 52 340 79 351 68 b 343 23 350 43 348 35 b 180 -145 305 -50 245 -99 z',\n },\n accidentalKomaSharp: {\n x_min: 0,\n x_max: 300,\n y_min: -338,\n y_max: 351,\n ha: 689,\n o: 'm 194 -487 b 225 -432 215 -469 223 -452 b 238 -232 229 -366 236 -298 b 377 -199 285 -220 331 -209 b 418 -164 397 -193 410 -181 b 432 -88 428 -138 432 -114 b 412 -42 432 -55 428 -42 b 389 -46 406 -42 399 -43 l 235 -85 b 233 -20 235 -63 233 -42 b 233 105 232 22 233 63 b 312 121 259 111 285 117 b 406 226 390 134 400 145 b 373 284 409 268 402 284 b 344 281 364 284 356 282 b 232 258 307 276 269 266 b 230 308 232 275 232 291 b 210 505 229 374 232 441 b 183 471 189 501 184 490 b 180 406 181 449 180 428 b 184 246 180 353 184 300 b 48 222 140 236 94 228 b 0 168 6 216 0 209 b 7 86 1 141 4 114 b 27 66 9 73 13 66 l 35 66 b 184 94 85 66 135 84 b 187 -1 184 62 186 30 b 190 -96 189 -33 190 -65 l 112 -114 b 35 -213 27 -132 35 -132 b 33 -253 35 -226 35 -240 b 49 -276 33 -269 37 -276 b 62 -275 52 -276 56 -276 l 186 -245 l 186 -256 b 179 -387 180 -300 177 -343 b 194 -487 180 -419 179 -454 z',\n },\n accidentalKucukMucennebSharp: {\n x_min: -0.15206251809627475,\n x_max: 359,\n y_min: -420,\n y_max: 343,\n ha: 763,\n o: 'm 236 -605 b 262 -543 256 -583 261 -564 b 269 -423 268 -503 269 -464 b 266 -340 269 -396 268 -367 l 361 -318 b 405 -276 384 -312 399 -298 b 413 -189 412 -248 416 -219 b 395 -164 412 -171 409 -164 b 382 -166 392 -164 387 -164 b 264 -193 343 -176 304 -184 b 269 -102 265 -163 268 -132 b 454 -62 331 -89 392 -78 b 501 -23 477 -58 494 -45 b 517 62 511 6 517 33 b 487 112 517 95 513 112 b 471 111 482 112 477 112 b 274 66 406 95 340 81 b 276 138 275 91 276 114 b 350 154 301 144 325 148 b 402 203 377 160 396 176 b 412 284 408 230 412 258 b 392 311 412 302 406 311 b 372 308 386 311 379 310 b 287 291 343 301 314 297 l 295 405 b 298 441 297 416 298 428 b 292 475 298 452 297 464 b 282 494 289 482 294 494 b 264 481 274 494 266 490 b 255 455 259 474 256 464 b 239 282 248 397 243 340 b 148 268 209 278 179 274 b 62 164 62 252 62 253 l 62 132 b 79 108 60 117 65 108 l 86 108 l 230 130 b 229 92 230 118 229 105 b 228 56 228 79 228 68 b 66 20 173 43 120 32 b 0 -59 6 7 3 1 l 0 -138 b 14 -160 -1 -156 4 -160 b 27 -158 19 -160 23 -160 b 222 -112 92 -141 157 -127 b 220 -203 220 -143 220 -173 b 147 -217 196 -207 171 -213 b 89 -288 92 -228 89 -229 b 95 -347 85 -305 96 -325 b 112 -374 92 -366 98 -374 b 125 -373 117 -374 121 -374 l 220 -351 b 222 -458 220 -386 220 -422 b 236 -605 223 -504 225 -552 z',\n },\n accidentalKoron: {\n x_min: 0,\n x_max: 303,\n y_min: -462.4598053473055,\n y_max: 180,\n ha: 642.4598053473055,\n o: 'm 59 -665 b 72 -649 69 -662 72 -657 b 69 -626 72 -642 69 -634 b 69 -622 69 -625 69 -624 l 69 -600 b 55 -156 60 -456 68 -311 b 86 -170 66 -166 76 -170 b 112 -163 95 -170 104 -166 b 390 -35 204 -120 298 -78 b 436 -1 409 -27 436 -27 b 396 46 436 22 413 33 l 382 55 b 46 243 271 121 157 179 b 12 259 29 253 17 259 b 0 219 1 259 0 248 b 3 -372 0 22 3 -176 b 6 -616 3 -454 6 -536 b 59 -665 6 -638 40 -671 z m 55 199 b 363 24 156 141 258 84 b 55 -118 259 -24 160 -69 z',\n },\n accidentalSori: {\n x_min: 0,\n x_max: 434,\n y_min: -295,\n y_max: 325,\n ha: 620,\n o: 'm 194 -425 b 196 -409 194 -418 196 -413 b 194 -194 196 -337 196 -266 b 364 -127 251 -171 308 -150 b 361 -321 363 -192 364 -256 b 410 -387 360 -357 373 -377 b 413 -373 412 -382 413 -377 b 418 -114 418 -287 418 -200 l 418 -105 b 595 -35 477 -82 536 -59 b 625 0 612 -27 625 -22 b 593 48 624 23 618 39 l 419 117 b 423 370 419 202 423 285 b 426 403 423 382 426 393 b 418 436 426 415 425 426 b 384 468 409 449 399 468 b 369 448 370 468 369 459 b 369 436 369 444 369 441 l 369 428 l 369 423 b 367 138 369 328 367 233 l 353 143 l 192 207 l 192 367 b 173 406 192 383 184 396 b 151 422 167 413 160 422 b 144 420 148 422 147 422 b 137 403 138 416 137 410 l 137 392 l 137 229 b 33 271 102 243 68 256 b 13 276 26 274 19 276 b 0 262 6 276 0 272 b 35 199 1 239 0 212 l 138 160 b 140 -148 138 58 138 -45 b 56 -181 111 -158 84 -170 b 24 -215 35 -189 24 -199 b 29 -235 24 -220 26 -228 b 49 -253 35 -249 42 -253 b 78 -240 59 -253 69 -243 b 140 -216 98 -233 120 -225 l 140 -356 b 194 -425 140 -406 141 -406 z m 194 -125 b 193 138 194 -37 193 50 b 315 89 233 122 275 107 b 366 71 333 84 350 76 b 364 -58 366 27 366 -16 b 194 -125 308 -81 251 -104 z m 419 49 l 526 7 l 485 -10 l 419 -36 z',\n },\n articAccentAbove: {\n x_min: 0,\n x_max: 425,\n y_min: 0,\n y_max: 326,\n ha: 326,\n o: 'm 27 1 b 78 12 46 0 62 6 b 347 112 168 45 253 91 b 521 184 409 128 459 167 b 608 259 557 194 589 220 b 612 274 611 265 612 271 b 598 292 612 281 608 287 b 477 347 559 312 518 331 b 176 465 374 384 275 425 b 156 469 168 468 161 469 b 125 456 145 469 137 465 b 53 370 96 432 78 399 b 45 353 48 363 45 357 b 68 333 45 344 52 337 b 360 225 166 298 262 261 b 192 154 302 203 249 171 b 13 36 120 132 53 105 b 0 13 9 29 0 22 l 0 9 b 16 0 3 1 10 0 l 26 0 b 27 1 27 0 27 0 z',\n },\n articAccentBelow: {\n x_min: 0,\n x_max: 425,\n y_min: -326,\n y_max: 0,\n ha: 326,\n o: 'm 26 -469 l 27 -469 b 78 -458 46 -469 62 -464 b 347 -357 168 -426 253 -380 b 521 -285 409 -341 459 -302 b 608 -210 557 -276 589 -249 b 612 -196 611 -204 612 -200 b 598 -179 612 -189 608 -183 b 477 -122 559 -157 518 -138 b 176 -4 374 -85 275 -45 b 156 0 168 -1 161 0 b 125 -13 145 0 137 -4 b 53 -99 96 -37 78 -71 b 45 -117 48 -107 45 -112 b 68 -137 45 -125 52 -132 b 360 -245 166 -171 262 -209 b 192 -315 302 -266 249 -300 b 13 -433 120 -337 53 -366 b 0 -456 9 -442 0 -448 l 0 -461 b 16 -469 3 -468 10 -469 z',\n },\n articTenutoAbove: {\n x_min: 0.35192668236256364,\n x_max: 471.1238660564107,\n y_min: 0,\n y_max: 56,\n ha: 56,\n o: 'm 137 0 b 197 1 156 0 179 1 b 409 6 268 1 338 6 b 482 4 432 6 459 6 b 556 0 508 3 534 0 b 651 10 588 0 621 3 b 678 27 662 12 678 10 b 654 59 680 45 672 53 b 511 75 606 73 560 73 b 255 81 426 78 341 81 b 160 79 222 81 193 79 l 36 79 b 1 71 24 78 7 85 b 19 32 -3 56 9 43 b 45 16 26 24 36 20 b 137 0 76 3 108 0 z',\n },\n articTenutoBelow: {\n x_min: 0.35192668236256364,\n x_max: 471.1238660564107,\n y_min: -59,\n y_max: -3,\n ha: 56,\n o: 'm 137 -85 b 197 -84 156 -85 179 -84 b 409 -79 268 -84 338 -79 b 482 -81 432 -79 459 -79 b 556 -85 508 -82 534 -85 b 651 -75 588 -85 621 -82 b 678 -58 662 -73 678 -75 b 654 -26 680 -40 672 -32 b 511 -10 606 -12 560 -12 b 255 -4 426 -7 341 -4 b 160 -6 222 -4 193 -6 l 36 -6 b 1 -14 24 -7 7 0 b 19 -53 -3 -29 9 -42 b 45 -69 26 -60 36 -65 b 137 -85 76 -82 108 -85 z',\n },\n articStaccatoAbove: {\n x_min: 1.4151102965496913,\n x_max: 112,\n y_min: 0,\n y_max: 156,\n ha: 156,\n o: 'm 98 0 b 132 23 109 0 122 7 b 161 112 150 50 161 79 b 158 148 161 124 161 137 b 125 186 154 167 131 167 b 63 225 117 215 85 216 b 23 197 45 222 30 219 b 3 91 12 163 12 127 b 19 66 0 79 4 69 b 65 27 40 62 53 46 b 98 0 76 9 88 0 z',\n },\n articStaccatoBelow: {\n x_min: 1.4151102965496913,\n x_max: 112.08403222864916,\n y_min: -156,\n y_max: 0,\n ha: 156,\n o: 'm 132 -202 b 161 -112 151 -174 163 -145 b 158 -76 161 -101 161 -88 b 125 -39 153 -58 131 -58 b 63 0 115 -10 85 -9 b 23 -27 45 -3 30 -6 b 3 -134 12 -62 10 -98 b 19 -158 0 -145 4 -156 b 65 -197 40 -164 53 -179 b 98 -225 75 -216 88 -225 b 132 -202 109 -225 122 -217 z',\n },\n articStaccatissimoAbove: {\n x_min: 0,\n x_max: 139,\n y_min: 0,\n y_max: 411,\n ha: 411,\n o: 'm 104 0 b 144 115 143 29 138 75 b 197 423 158 217 180 320 b 200 454 199 433 200 444 b 181 540 200 482 193 513 b 112 592 167 573 141 592 b 55 567 92 592 72 585 b 0 490 32 546 3 527 l 0 484 b 27 279 14 416 14 347 b 84 20 43 193 52 104 b 96 0 86 13 92 6 z',\n },\n articStaccatissimoBelow: {\n x_min: 0,\n x_max: 139,\n y_min: -411,\n y_max: 0,\n ha: 411,\n o: 'm 88 -592 b 145 -567 108 -592 128 -585 b 200 -490 168 -546 197 -527 l 200 -484 b 173 -279 186 -416 186 -347 b 117 -20 157 -193 148 -104 b 104 0 114 -13 108 -6 l 96 0 b 56 -115 58 -29 62 -75 b 3 -423 42 -217 20 -320 b 0 -454 1 -433 0 -444 b 19 -540 0 -482 7 -513 b 88 -592 33 -573 59 -592 z',\n },\n articMarcatoAbove: {\n x_min: 0.04121419527862119,\n x_max: 396,\n y_min: 0,\n y_max: 328.0000000000001,\n ha: 328.0000000000001,\n o: 'm 477 0 b 510 13 488 0 500 6 b 570 124 546 40 563 81 b 547 183 570 147 560 166 b 356 422 487 265 405 330 b 346 442 354 429 350 436 l 346 444 b 318 465 340 456 330 464 l 312 469 b 274 449 294 480 284 461 b 242 413 262 438 253 425 b 56 196 177 343 112 274 b 1 56 26 154 13 105 b 27 20 -4 35 9 20 b 42 23 32 20 37 20 b 84 53 59 29 72 39 b 255 269 141 125 193 200 b 275 229 262 255 266 242 b 448 14 324 151 390 86 b 477 0 456 4 467 0 z',\n },\n articMarcatoBelow: {\n x_min: 0,\n x_max: 395.9587858047214,\n y_min: -328.0000000000001,\n y_max: 0,\n ha: 328.0000000000001,\n o: 'm 258 -469 b 297 -449 276 -480 287 -461 b 328 -413 308 -438 317 -425 b 514 -196 393 -343 458 -274 b 569 -56 544 -154 557 -105 b 543 -20 575 -35 562 -20 b 528 -23 539 -20 533 -20 b 487 -53 511 -29 498 -39 b 315 -269 429 -125 377 -200 b 295 -229 308 -255 304 -242 b 122 -14 246 -151 180 -86 b 94 0 114 -4 104 0 b 60 -13 82 0 71 -6 b 0 -124 24 -40 7 -81 b 23 -183 0 -147 10 -166 b 215 -422 84 -265 166 -330 b 225 -442 216 -429 220 -436 l 225 -444 b 252 -465 230 -456 240 -464 z',\n },\n fermataAbove: {\n x_min: -0.04550444040404433,\n x_max: 472,\n y_min: 2.015071727506986,\n y_max: 454,\n ha: 451.984928272493,\n o: 'm 39 10 b 78 108 66 37 71 73 b 163 311 92 181 111 252 b 284 423 199 353 239 392 b 373 458 312 444 340 454 b 433 431 395 458 410 446 b 603 153 530 361 596 276 b 595 121 603 144 595 131 l 595 88 b 602 50 596 75 589 55 b 639 73 619 43 631 60 b 651 102 645 82 648 92 b 667 194 660 132 662 163 b 680 278 671 222 672 248 b 560 567 680 386 638 481 b 396 654 508 625 452 649 b 291 632 364 654 325 644 b 161 526 235 613 200 566 b 4 249 85 446 26 357 b 4 174 0 222 -3 196 b 10 19 4 124 4 69 b 29 4 12 6 16 0 b 39 10 35 4 33 4 z m 338 37 b 370 40 350 36 357 36 b 380 75 387 40 380 43 b 389 94 382 79 382 85 b 356 132 389 111 374 122 b 269 154 328 147 300 156 b 225 125 252 154 228 157 b 261 48 222 81 232 56 b 338 37 287 40 312 40 z',\n },\n fermataBelow: {\n x_min: -0.310835055998654,\n x_max: 518.570567335755,\n y_min: -430,\n y_max: -0.9161449836506543,\n ha: 429.08385501634933,\n o: 'm 344 -615 b 500 -543 402 -602 452 -576 b 713 -253 605 -471 661 -364 b 746 -98 737 -204 750 -153 b 727 -59 744 -82 744 -59 b 688 -88 711 -59 694 -68 b 678 -109 687 -96 683 -102 b 562 -314 648 -183 611 -252 b 387 -439 516 -373 458 -416 b 328 -449 367 -446 347 -449 b 180 -386 274 -449 225 -423 b 69 -179 111 -330 69 -262 b 75 -121 69 -160 71 -141 b 84 -58 78 -101 84 -79 b 82 -39 84 -52 84 -45 b 68 -1 79 -26 82 -4 b 26 -32 49 0 33 -12 b 20 -52 24 -39 22 -45 b 0 -223 9 -107 -3 -161 b 141 -553 1 -348 27 -468 b 304 -619 192 -590 243 -619 b 344 -615 317 -619 330 -618 z m 415 -190 b 435 -157 429 -192 435 -184 b 308 -27 435 -86 379 -27 b 271 -46 287 -27 272 -35 b 269 -69 269 -55 269 -62 b 364 -183 269 -128 302 -170 z',\n },\n breathMarkComma: {\n x_min: 0,\n x_max: 148,\n y_min: 0,\n y_max: 275,\n ha: 275,\n o: 'm 120 0 b 187 78 156 20 174 48 b 213 209 206 121 213 164 b 206 294 213 238 210 265 b 140 390 200 337 171 367 b 122 396 134 395 128 396 b 68 382 105 396 85 384 b 46 379 60 382 53 382 b 0 328 12 369 0 357 b 1 311 0 323 1 317 b 30 210 4 275 22 243 b 66 167 39 179 46 167 b 94 171 73 167 82 168 b 143 180 109 174 124 180 b 160 179 148 180 154 180 b 120 66 124 145 120 107 b 120 0 120 45 121 23 z',\n },\n breathMarkUpbow: {\n x_min: 0,\n x_max: 254,\n y_min: 0,\n y_max: 595,\n ha: 595,\n o: 'm 233 0 b 256 48 251 14 253 30 b 272 183 264 92 265 138 b 311 455 289 274 295 364 b 350 716 327 541 341 628 b 366 815 354 749 366 782 b 359 857 366 829 363 842 b 327 815 334 852 330 832 b 302 674 315 769 310 721 b 248 357 288 567 269 462 b 225 226 240 314 242 268 b 210 251 212 232 213 243 b 69 721 163 408 117 564 b 32 835 58 760 53 801 b 20 851 29 841 27 851 b 14 850 19 851 16 851 b 0 828 6 847 0 838 l 0 825 b 12 765 1 804 7 785 b 194 125 73 552 132 338 b 233 0 206 84 213 42 z',\n },\n caesura: {\n x_min: 0,\n x_max: 565.5831864753837,\n y_min: -0.09016994374947417,\n y_max: 562.4481112129314,\n ha: 562.5382811566809,\n o: 'm 0 76 b 49 122 24 92 37 107 b 444 613 180 287 305 455 b 528 770 484 660 518 708 b 531 792 530 778 531 785 b 524 808 531 799 530 805 b 490 792 513 815 498 802 b 390 683 456 756 420 721 b 48 262 275 543 164 400 b 0 76 0 207 7 145 z m 226 1 b 248 13 238 -4 243 7 l 353 137 b 759 638 490 302 632 464 b 814 805 795 688 819 740 b 779 786 796 805 788 796 b 628 609 724 732 678 668 b 310 242 523 485 416 363 b 217 69 265 190 217 140 b 222 30 217 58 219 45 b 222 23 222 29 220 26 b 220 12 222 20 220 16 b 226 1 220 7 222 3 z',\n },\n caesuraCurved: {\n x_min: 0,\n x_max: 386,\n y_min: -10,\n y_max: 584,\n ha: 594,\n o: 'm 180 -14 b 246 14 213 -13 230 0 b 347 144 288 52 315 99 b 526 471 420 246 488 350 b 556 671 546 537 556 603 b 543 798 556 713 553 756 b 504 837 537 822 521 828 b 490 841 500 840 494 841 b 472 832 482 841 477 838 b 406 678 436 785 406 737 b 410 638 406 665 408 652 b 425 511 419 595 425 553 b 315 186 425 395 387 287 b 180 -14 271 122 228 58 z m 14 24 b 49 39 29 24 40 32 b 120 114 76 60 99 85 b 216 276 156 166 184 223 b 317 626 281 384 317 501 b 315 664 317 639 317 651 b 301 773 314 701 311 737 b 262 808 295 795 278 808 b 245 799 256 808 249 805 b 170 641 209 750 170 706 b 171 621 170 634 170 628 b 177 511 176 585 177 549 b 114 229 177 415 160 320 b 0 26 79 161 42 95 b 14 24 6 24 10 24 z',\n },\n restMaxima: {\n x_min: 0,\n x_max: 366,\n y_min: -255,\n y_max: 255,\n ha: 510,\n o: 'm 397 -367 b 504 -343 436 -367 468 -347 b 518 -318 516 -341 518 -330 b 527 -30 518 -217 527 -117 b 526 33 527 -7 527 13 l 526 301 b 501 350 526 323 520 341 b 428 367 477 361 452 367 b 374 359 410 367 393 364 b 357 333 361 354 357 347 b 356 91 357 252 356 171 l 356 30 b 340 -307 357 -82 346 -194 b 397 -367 337 -354 350 -367 z m 46 -357 b 58 -356 49 -357 53 -357 b 154 -333 91 -351 121 -338 b 173 -305 168 -330 173 -320 l 173 302 b 132 356 173 330 157 348 b 68 364 112 363 89 364 b 3 304 19 363 1 348 l 3 4 l 0 4 b 1 -302 0 -98 0 -200 b 46 -357 1 -331 16 -357 z',\n },\n restDoubleWhole: {\n x_min: 0,\n x_max: 122,\n y_min: 0,\n y_max: 249,\n ha: 249,\n o: 'm 43 0 b 58 1 48 0 52 0 b 124 20 81 6 102 17 b 176 96 173 27 176 58 b 173 220 174 138 173 179 b 176 304 173 248 176 276 b 140 353 176 331 163 346 b 95 359 125 356 111 359 b 32 346 73 359 52 354 b 0 315 20 340 0 337 b 1 243 0 291 1 268 l 1 174 l 4 174 l 4 48 b 43 0 4 16 17 0 z',\n },\n restWhole: {\n x_min: 0.8908513171538642,\n x_max: 500,\n y_min: -120,\n y_max: 14,\n ha: 134,\n o: 'm 356 -173 l 356 -171 l 642 -171 b 719 -115 680 -171 717 -145 b 720 -82 719 -104 720 -92 b 711 -20 720 -60 719 -40 b 672 17 704 0 694 10 b 649 20 664 20 657 20 b 605 17 634 20 621 17 b 92 19 433 17 262 17 b 29 7 69 20 49 12 b 9 -17 12 4 9 -6 b 10 -43 9 -26 10 -35 b 1 -84 10 -58 3 -72 b 76 -173 0 -147 7 -173 z',\n },\n restHalf: {\n x_min: 0,\n x_max: 518.3998530468286,\n y_min: 0,\n y_max: 162,\n ha: 162,\n o: 'm 98 0 l 556 0 b 665 1 592 0 629 0 b 746 82 720 3 743 29 b 736 174 749 114 740 144 b 670 232 729 215 708 232 b 570 229 636 232 603 229 b 356 233 498 229 426 233 l 73 233 b 0 179 19 233 0 220 b 1 154 0 171 0 164 b 6 95 4 135 6 115 b 98 0 3 27 29 0 z',\n },\n restQuarter: {\n x_min: -0.3784452492533808,\n x_max: 263,\n y_min: -415,\n y_max: 415,\n ha: 830,\n o: 'm 151 -596 b 164 -563 163 -589 161 -575 b 160 -546 164 -557 161 -552 b 124 -396 148 -495 135 -446 b 122 -380 122 -390 122 -384 b 199 -255 122 -331 158 -272 b 228 -256 209 -249 217 -253 b 324 -346 274 -271 298 -310 b 353 -369 331 -356 341 -369 b 360 -367 356 -369 357 -369 b 379 -336 373 -361 379 -348 l 377 -325 b 344 -232 372 -292 366 -258 b 249 -58 301 -180 278 -117 b 242 -36 245 -49 242 -42 b 258 -7 242 -26 248 -17 b 328 78 284 20 311 45 b 354 158 344 104 354 131 b 337 216 354 177 350 196 b 213 435 294 288 249 359 b 115 575 189 487 158 536 b 78 598 105 585 92 598 b 59 592 72 598 66 596 b 39 562 45 583 39 572 b 53 527 39 550 45 539 b 168 344 98 469 125 402 b 187 307 181 328 187 317 b 153 269 187 294 176 284 b 62 213 122 252 91 235 b 40 180 48 203 40 192 b 46 158 40 173 43 166 b 99 65 60 125 79 95 b 183 -79 131 20 160 -29 b 156 -86 173 -88 164 -85 b 0 -261 58 -99 -7 -173 b 96 -557 10 -366 49 -464 b 124 -585 102 -569 109 -580 b 145 -598 132 -588 138 -598 b 151 -596 147 -598 150 -598 z',\n },\n rest8th: {\n x_min: 0,\n x_max: 289,\n y_min: -260,\n y_max: 261,\n ha: 521,\n o: 'm 164 -374 b 212 -340 190 -373 203 -357 b 276 -190 238 -292 258 -242 b 410 285 333 -36 359 128 b 416 314 413 294 416 304 l 416 321 b 393 354 415 341 410 354 b 382 353 389 354 386 354 b 292 311 347 347 315 333 b 174 225 256 276 216 251 b 157 219 168 222 163 219 b 140 228 151 219 145 222 b 131 246 134 233 131 240 b 135 262 131 252 132 256 b 147 298 141 272 147 285 b 127 367 147 323 154 354 b 94 376 114 373 102 376 b 48 336 75 376 63 363 b 3 181 20 288 12 235 b 0 150 1 170 0 160 b 109 24 0 84 35 24 b 171 36 127 24 148 27 b 289 101 213 52 248 75 b 164 -374 256 -62 193 -213 z',\n },\n rest16th: {\n x_min: 0,\n x_max: 333,\n y_min: -328.283950617284,\n y_max: 244,\n ha: 572.2839506172841,\n o: 'm 209 -471 b 246 -458 222 -477 236 -468 b 307 -338 279 -425 300 -384 b 324 -226 312 -301 317 -262 b 428 161 350 -94 386 35 b 480 318 445 215 480 259 b 467 347 480 331 477 341 b 445 351 461 350 454 351 b 408 337 432 351 419 347 b 402 333 405 336 403 334 b 223 215 344 294 294 245 b 236 259 229 233 235 246 b 238 276 238 265 238 271 b 212 338 238 302 226 334 b 193 341 206 340 199 341 b 86 289 156 341 104 317 b 59 180 66 255 59 217 b 156 27 59 76 92 27 b 236 46 179 27 204 35 b 338 101 271 59 298 82 b 289 -49 312 49 302 0 b 196 -122 276 -99 235 -107 b 176 -114 187 -127 176 -127 l 176 -111 b 157 -53 177 -88 164 -72 b 69 -9 141 -7 101 -16 b 17 -48 43 -3 29 -27 b 0 -127 4 -73 0 -99 b 6 -186 0 -147 1 -167 b 82 -294 17 -262 37 -294 b 160 -276 102 -294 128 -289 b 219 -242 181 -268 203 -259 b 236 -230 223 -236 229 -230 b 243 -232 239 -230 240 -230 b 235 -275 248 -246 239 -261 b 202 -456 220 -334 202 -395 b 209 -471 202 -462 203 -468 z',\n },\n rest32nd: {\n x_min: 0,\n x_max: 347,\n y_min: -497.5023916875033,\n y_max: 483,\n ha: 980.5023916875033,\n o: 'm 177 -716 b 217 -690 194 -720 209 -704 b 233 -655 225 -680 230 -668 b 292 -390 253 -567 275 -480 b 361 -48 312 -275 336 -161 b 452 400 393 102 422 252 b 497 629 467 477 482 553 b 500 647 498 635 500 641 b 480 691 500 665 492 684 b 464 696 475 694 469 696 b 418 674 448 696 431 685 l 361 626 b 333 611 353 618 343 612 b 308 629 325 611 317 616 b 239 667 292 651 265 661 b 204 670 228 668 216 670 b 86 559 141 670 95 628 b 85 537 86 552 85 544 b 107 416 85 495 95 455 b 161 372 114 389 134 372 b 174 373 166 372 170 372 b 226 383 192 374 209 377 b 387 478 285 402 330 444 b 364 386 379 444 364 415 b 276 271 364 323 320 298 b 265 266 272 268 268 266 b 252 276 261 266 256 269 b 143 333 229 311 186 333 b 107 327 130 333 118 330 b 43 243 62 314 46 291 b 58 145 43 210 52 179 b 150 63 68 92 99 63 b 315 132 213 63 259 98 b 266 -58 297 63 281 4 b 207 -101 259 -91 230 -96 b 186 -66 186 -107 199 -75 b 180 -50 181 -63 183 -55 b 101 -3 160 -23 135 -3 b 9 -66 59 -3 20 -32 b 0 -118 3 -84 0 -101 b 10 -196 0 -144 6 -170 b 104 -287 20 -256 52 -287 b 137 -282 114 -287 125 -287 b 184 -269 151 -281 171 -269 b 196 -275 190 -269 193 -271 b 199 -287 197 -278 199 -282 b 184 -343 199 -304 189 -325 b 181 -348 184 -346 183 -347 b 134 -595 158 -429 131 -508 b 156 -677 134 -624 150 -648 b 177 -716 158 -693 160 -713 z',\n },\n rest64th: {\n x_min: 0,\n x_max: 428,\n y_min: -720,\n y_max: 473.6797408388932,\n ha: 1193.6797408388932,\n o: 'm 200 -1037 b 229 -1012 215 -1037 222 -1025 b 238 -984 233 -1004 236 -994 b 282 -780 248 -914 265 -848 b 386 -369 317 -644 354 -507 b 491 104 422 -212 451 -53 b 600 541 528 249 550 399 b 616 629 611 570 616 599 b 600 680 616 648 615 671 b 550 665 586 687 566 677 b 480 618 527 649 501 635 b 464 611 474 613 468 611 b 448 622 458 611 454 615 b 366 662 425 651 397 662 b 331 658 354 662 343 661 b 242 572 285 647 253 619 b 236 528 239 557 236 543 b 266 400 236 484 251 442 b 325 373 274 377 301 373 b 436 409 366 373 403 383 l 494 452 b 474 360 485 416 474 389 b 383 248 474 297 435 269 b 320 328 377 288 351 310 b 276 341 305 337 291 341 b 186 269 235 341 194 311 b 181 230 183 256 181 243 b 187 153 181 204 186 179 b 279 63 192 86 233 63 b 304 65 288 63 295 63 b 416 115 344 72 379 92 b 387 -14 406 69 397 27 b 320 -95 380 -52 369 -86 b 318 -79 320 -89 320 -84 b 223 0 305 -29 271 0 b 122 -81 171 0 135 -30 b 118 -127 120 -96 118 -112 l 118 -196 b 137 -242 118 -215 125 -229 b 209 -275 157 -266 181 -275 b 249 -269 222 -275 235 -274 b 318 -248 272 -264 294 -255 b 281 -390 315 -301 292 -344 b 276 -400 279 -393 279 -397 b 259 -420 272 -408 266 -416 b 246 -429 255 -425 251 -429 b 233 -415 242 -429 238 -426 b 176 -359 225 -389 200 -372 b 121 -346 158 -348 140 -346 b 14 -408 73 -346 27 -370 b 0 -498 4 -438 0 -468 b 6 -564 0 -520 3 -543 b 91 -635 12 -611 45 -635 b 131 -629 104 -635 117 -634 b 223 -590 163 -622 190 -603 b 166 -824 203 -671 189 -747 b 148 -912 157 -852 148 -881 b 156 -955 148 -926 150 -940 b 177 -1008 161 -972 170 -991 b 200 -1037 181 -1020 183 -1037 z',\n },\n rest128th: {\n x_min: 0.6717818579024267,\n x_max: 491,\n y_min: -711,\n y_max: 719,\n ha: 1430,\n o: 'm 233 -1015 b 271 -956 256 -1002 266 -981 l 314 -723 b 393 -350 337 -598 366 -474 b 543 312 442 -128 492 91 b 687 841 583 490 635 665 b 707 958 698 880 707 919 b 706 986 707 968 707 976 b 688 1025 704 999 704 1024 b 670 1027 683 1025 677 1027 b 629 1007 655 1027 639 1022 b 559 945 613 981 586 968 b 541 1004 553 968 559 991 b 456 1035 516 1024 488 1035 b 419 1030 444 1035 431 1034 b 344 953 379 1018 353 995 b 340 900 341 936 340 917 b 341 847 340 881 341 864 b 380 779 340 815 354 793 b 464 763 406 765 435 762 b 592 814 510 763 549 786 b 546 660 575 757 556 710 b 480 585 537 619 517 598 b 478 599 480 590 478 595 b 386 678 472 641 428 678 b 294 612 343 678 304 651 b 279 477 282 567 278 521 b 363 395 281 428 317 395 b 380 396 369 395 374 395 b 488 436 416 403 449 419 b 384 233 469 357 468 275 b 359 291 373 252 377 276 b 282 318 337 310 310 318 b 181 264 243 318 203 298 b 154 107 153 216 154 161 b 242 6 154 42 187 6 b 278 10 253 6 265 7 b 408 88 330 22 366 55 b 387 -1 400 56 393 27 b 301 -112 379 -55 354 -94 b 289 -65 297 -95 302 -79 b 219 -32 269 -42 245 -32 b 183 -37 207 -32 196 -35 b 112 -109 144 -46 121 -71 b 105 -219 104 -145 108 -183 b 186 -315 101 -276 134 -315 b 230 -307 199 -315 215 -312 b 324 -256 264 -295 292 -275 b 180 -491 323 -383 266 -471 b 183 -459 180 -480 180 -469 b 184 -442 184 -454 184 -448 l 184 -436 b 135 -369 184 -403 170 -383 b 102 -363 125 -364 114 -363 b 29 -399 73 -363 45 -376 b 1 -556 -4 -448 6 -503 b 109 -670 -4 -625 43 -670 b 140 -667 118 -670 130 -668 b 253 -616 180 -658 213 -638 b 238 -688 248 -644 242 -665 b 192 -959 220 -779 192 -867 b 193 -992 192 -971 192 -981 b 210 -1024 194 -1014 199 -1024 b 233 -1015 216 -1024 223 -1021 z',\n },\n dynamicPiano: {\n x_min: -49,\n x_max: 326.5019318364244,\n y_min: -142,\n y_max: 515,\n ha: 657,\n o: 'm -56 -204 b -42 -202 -52 -204 -46 -203 b -19 -194 -35 -202 -26 -197 b 147 -138 35 -170 91 -151 b 249 -58 194 -127 223 -95 b 262 -29 255 -50 262 -39 b 258 -17 262 -24 261 -20 b 232 -7 252 -10 242 -7 b 210 -12 225 -7 217 -9 b 125 -40 184 -23 157 -30 b 183 140 153 19 171 79 b 251 167 207 144 230 153 b 469 518 383 262 480 382 b 357 687 472 626 420 687 b 315 678 344 687 330 684 b 204 600 279 664 240 634 b 210 704 206 635 209 670 b 215 721 212 710 215 716 b 206 733 215 727 212 730 b 180 742 197 736 189 742 b 164 734 176 742 170 740 b 1 575 108 684 36 645 b -7 557 -1 569 -7 563 b -6 553 -7 556 -7 554 b 7 547 -3 547 3 547 l 17 547 b 82 575 43 547 59 567 l 82 452 b 56 46 82 317 81 180 b 17 -66 49 7 46 -36 b -62 -173 -13 -99 -37 -135 b -71 -192 -66 -179 -71 -184 b -68 -199 -71 -193 -69 -196 b -56 -204 -65 -203 -60 -204 z m 196 258 b 197 266 197 261 197 264 b 200 510 200 347 199 429 b 233 543 210 521 222 533 b 281 560 249 554 266 560 b 340 503 310 560 333 540 b 344 461 343 488 344 474 b 321 323 344 413 333 369 b 268 272 315 300 295 281 b 196 258 245 265 220 261 z',\n },\n dynamicMezzo: {\n x_min: -18,\n x_max: 559,\n y_min: -50,\n y_max: 365,\n ha: 415,\n o: 'm 43 -71 b 160 19 86 -71 143 -26 b 230 264 189 99 200 184 b 282 363 243 297 259 327 b 287 320 285 347 287 333 b 284 279 287 305 285 292 l 249 -12 b 275 -43 248 -29 245 -43 b 395 45 321 -43 389 3 b 462 271 406 124 436 197 b 523 387 475 310 490 348 l 523 346 b 504 130 521 274 513 202 b 501 81 501 114 501 98 b 510 3 501 55 504 29 b 580 -72 521 -48 543 -72 b 625 -63 593 -72 608 -69 b 789 50 690 -43 744 -3 b 805 72 795 56 805 63 b 798 85 805 76 802 81 b 778 94 792 91 785 94 b 755 85 770 94 763 91 l 693 40 b 675 33 685 36 680 33 b 658 52 668 33 662 39 b 645 144 651 82 645 112 b 658 448 641 246 660 346 b 606 507 658 485 638 507 b 583 504 599 507 592 505 b 495 446 547 497 521 471 b 420 373 471 423 448 399 b 413 458 418 406 418 432 b 361 507 408 490 386 507 b 320 491 347 507 333 501 b 160 307 256 444 207 382 l 160 337 b 174 488 160 387 174 438 b 156 521 174 501 173 513 b 137 526 148 524 143 526 b 109 513 127 526 118 520 b -16 399 66 477 23 439 b -26 383 -20 395 -26 389 l -26 379 b -14 370 -24 372 -20 370 b -6 372 -12 370 -9 372 b 19 376 4 374 12 376 b 36 359 32 376 36 370 b 30 330 36 350 35 341 l 30 323 b 9 -35 23 203 17 85 b 43 -71 6 -65 19 -71 z',\n },\n dynamicForte: {\n x_min: -144,\n x_max: 311.30112136775,\n y_min: -115.3876295915697,\n y_max: 504,\n ha: 619.3876295915697,\n o: 'm -101 -166 b 173 76 7 -153 150 -30 b 206 344 192 164 202 253 b 268 338 226 343 246 341 b 384 395 317 333 353 361 b 397 419 393 405 397 412 b 367 442 397 429 387 436 b 350 444 361 444 356 444 b 206 455 302 449 255 454 l 206 474 b 202 540 204 495 202 518 b 209 593 202 557 203 576 b 236 624 215 613 225 624 b 265 612 245 624 253 619 b 308 552 287 596 302 577 b 336 533 312 534 323 533 b 448 611 366 533 444 583 b 399 696 452 648 423 671 b 382 706 395 700 387 703 b 308 726 357 720 333 726 b 207 684 272 726 239 711 b 60 455 135 622 60 560 l 10 455 b -23 448 -1 455 -13 454 b -102 372 -55 426 -76 397 b -109 357 -108 367 -109 361 b -95 347 -109 353 -105 348 b -63 346 -84 346 -73 346 b 0 344 -43 344 -22 344 l 63 344 b 53 186 63 291 59 239 b 23 0 46 124 42 60 b -35 -60 10 -42 -6 -60 b -73 -52 -45 -60 -58 -58 b -91 -48 -79 -49 -85 -48 b -109 -53 -96 -48 -102 -49 b -199 -124 -143 -72 -168 -99 b -207 -137 -203 -128 -207 -132 b -194 -148 -207 -141 -203 -145 b -101 -166 -164 -160 -132 -168 z',\n },\n dynamicRinforzando: {\n x_min: -75,\n x_max: 322.0960720195126,\n y_min: -90,\n y_max: 325,\n ha: 415,\n o: 'm 23 -130 b 40 -125 27 -130 33 -128 b 128 -9 81 -114 125 -53 b 145 200 132 62 141 130 b 148 238 147 212 148 225 b 308 321 184 291 245 321 b 363 314 325 321 344 318 b 377 310 369 312 373 310 b 384 311 380 310 382 310 b 464 415 410 317 464 389 b 446 433 465 429 455 429 b 390 445 428 441 409 445 b 305 429 361 445 334 438 b 167 346 252 413 202 393 b 153 325 163 338 158 333 b 148 438 154 363 151 399 b 121 468 147 456 134 468 b 101 458 115 468 108 465 b -63 310 46 409 -16 367 b -108 240 -78 289 -98 271 b 32 330 -50 256 -13 297 b 37 304 37 320 37 312 l 37 292 b 10 -101 27 161 20 30 b 23 -130 9 -120 12 -130 z',\n },\n dynamicSforzando: {\n x_min: 0,\n x_max: 296,\n y_min: 0,\n y_max: 379,\n ha: 379,\n o: 'm 151 0 b 174 1 160 0 166 0 b 392 158 272 14 346 71 b 405 207 400 174 405 190 b 359 287 405 236 389 265 b 261 325 328 308 294 315 b 168 413 216 340 181 366 b 166 426 167 418 166 423 b 176 438 166 432 167 436 b 199 441 183 441 190 441 b 310 393 238 441 295 422 b 334 370 317 376 325 370 b 363 386 343 370 353 379 b 422 445 386 402 408 420 b 426 458 425 449 426 454 b 422 469 426 462 425 465 b 274 546 395 518 333 546 b 161 503 232 546 190 531 b 86 405 132 472 108 439 b 71 347 75 387 71 367 b 112 256 71 312 85 279 b 209 215 141 232 176 226 b 284 168 238 206 266 197 b 300 131 291 157 300 144 b 298 120 300 127 298 122 b 278 107 294 109 285 108 b 262 108 271 107 266 108 l 259 108 b 114 157 200 107 156 125 b 96 181 104 163 96 170 l 96 184 b 102 202 96 190 102 196 b 96 209 102 204 101 207 b 63 194 82 215 72 204 b 7 109 42 168 26 138 b 0 86 3 101 0 94 b 13 60 0 78 4 68 b 151 0 53 23 101 0 z',\n },\n dynamicZ: {\n x_min: -42.73880183193087,\n x_max: 331,\n y_min: 0,\n y_max: 328,\n ha: 328,\n o: 'm -45 0 b -6 16 -32 0 -17 10 b 3 20 -3 16 0 19 b 144 60 49 48 96 60 b 284 22 190 60 238 46 b 348 4 305 10 327 4 b 461 75 393 4 435 30 b 468 91 464 81 467 86 b 456 104 468 95 465 99 b 287 173 402 131 348 167 b 239 176 271 174 255 176 b 168 174 217 176 194 174 b 367 340 236 236 298 294 b 459 423 402 363 432 392 b 477 454 467 431 475 442 b 474 462 477 456 475 459 b 454 472 469 469 462 472 b 432 468 446 472 439 469 b 356 448 406 461 380 455 b 210 422 307 433 258 422 b 109 442 177 422 144 428 b 94 445 104 444 99 445 b 69 433 85 445 76 442 b 27 390 56 419 39 406 b -9 343 16 373 -17 357 b 63 311 3 320 36 314 l 78 311 b 132 307 95 308 114 307 b 240 314 168 307 203 311 l 193 271 b -37 50 117 196 19 145 b -59 7 -46 36 -69 20 b -45 0 -55 3 -50 0 z',\n },\n ornamentTrill: {\n x_min: 1,\n x_max: 551,\n y_min: -18,\n y_max: 539,\n ha: 557,\n o: 'm 321 612 b 190 602 278 605 235 605 l 190 638 b 187 693 190 652 190 667 b 161 776 184 717 193 776 b 137 747 150 776 137 766 b 130 654 135 716 131 685 l 130 596 l 52 588 b 4 539 23 585 7 570 b 1 477 3 530 1 500 b 3 448 1 461 3 448 l 3 452 b 53 432 6 436 23 432 b 134 435 75 432 102 433 b 151 117 138 328 147 223 b 170 13 153 82 157 46 b 209 -26 179 -10 193 -26 b 222 -22 213 -26 217 -24 b 269 -17 233 -16 253 -27 b 343 135 325 19 346 66 b 343 158 343 147 344 147 b 323 192 341 171 337 187 b 291 176 311 194 300 184 l 264 148 b 229 131 261 145 238 131 b 212 170 209 131 213 154 b 194 438 203 259 199 348 l 272 442 b 284 452 276 441 279 441 b 305 462 287 461 295 462 l 312 462 b 346 477 325 462 340 464 b 366 560 357 503 366 531 b 321 612 366 598 356 618 z m 759 588 b 711 560 749 592 733 570 b 588 500 671 541 631 521 b 583 533 586 514 586 524 b 560 576 577 549 577 572 b 517 550 541 582 528 564 b 416 423 482 508 452 462 b 382 353 392 397 384 370 b 387 305 380 341 386 318 b 392 275 389 295 392 285 b 409 243 393 262 393 243 b 431 262 419 243 425 255 b 521 373 459 298 488 333 b 523 354 521 366 523 360 b 520 337 523 346 521 340 b 508 295 513 323 508 310 b 530 102 508 279 524 122 b 549 66 533 88 530 66 b 577 99 563 66 572 84 b 580 131 580 109 580 121 l 580 302 b 600 347 580 318 582 337 b 701 392 632 364 665 384 b 793 518 785 409 793 435 b 759 588 793 559 785 576 z',\n },\n ornamentTurn: {\n x_min: 0,\n x_max: 574,\n y_min: 0,\n y_max: 312,\n ha: 312,\n o: 'm 651 0 b 816 132 727 0 796 46 b 827 223 822 163 827 193 b 808 340 827 262 821 301 b 665 449 785 408 729 449 b 636 446 655 449 647 448 b 589 384 600 441 586 422 l 602 300 b 611 285 603 291 605 285 b 621 288 613 285 616 287 b 655 295 632 294 644 295 b 711 284 674 295 693 289 b 773 209 740 275 773 232 b 697 156 773 184 734 160 b 664 154 685 154 675 154 b 579 168 635 154 608 158 b 455 242 533 186 495 213 b 261 400 387 291 331 354 b 160 432 225 422 190 432 b 20 328 98 432 49 392 b 0 229 6 295 0 262 b 30 71 0 176 14 122 b 144 3 43 29 96 3 b 168 6 153 3 160 4 b 248 122 233 20 248 39 b 246 147 248 124 248 135 b 226 177 243 164 239 177 b 206 170 220 177 215 174 b 144 154 186 158 166 154 b 79 170 122 154 101 160 b 53 202 62 179 53 189 b 60 228 53 209 55 217 b 161 281 81 261 120 281 b 183 279 168 281 176 281 b 325 190 243 269 284 229 b 572 16 402 124 475 53 b 651 0 598 6 625 0 z',\n },\n ornamentTurnSlash: {\n x_min: 0,\n x_max: 574,\n y_min: -106,\n y_max: 405,\n ha: 511,\n o: 'm 441 -153 b 456 -60 455 -118 456 -89 b 455 81 455 -14 455 33 b 572 14 491 55 530 30 b 651 -1 598 4 625 -1 b 816 131 727 -1 796 45 b 827 222 822 161 827 192 b 808 338 827 261 821 300 b 665 448 785 406 729 448 b 636 445 655 448 647 446 b 589 383 600 439 586 420 l 602 298 b 611 284 603 289 605 284 b 621 287 613 284 616 285 b 655 294 632 292 644 294 b 711 282 674 294 693 288 b 773 207 740 274 773 230 b 697 154 773 183 734 158 b 664 153 685 153 675 153 b 579 167 635 153 608 157 b 455 240 533 183 495 212 b 454 242 455 240 455 242 l 454 337 b 452 488 454 386 452 439 b 433 570 452 517 451 546 b 425 583 431 575 431 583 l 422 583 b 403 566 415 582 408 573 b 402 546 400 560 402 553 l 397 287 b 261 399 353 325 310 366 b 160 431 225 420 190 431 b 20 327 98 431 48 390 b 0 228 6 294 0 261 b 30 69 0 174 14 121 b 144 1 43 27 96 1 b 168 4 153 1 160 3 b 248 121 233 19 248 37 b 246 145 248 122 248 134 b 226 176 243 163 239 176 b 206 168 220 176 215 173 b 144 153 186 157 166 153 b 79 168 122 153 101 158 b 53 200 62 177 53 187 b 60 226 53 207 55 216 b 161 279 79 259 120 279 b 183 278 168 279 176 279 b 325 189 243 266 282 226 b 395 130 348 168 372 148 b 393 71 393 109 393 89 b 441 -153 390 -6 402 -78 z',\n },\n ornamentMordent: {\n x_min: 0,\n x_max: 700,\n y_min: 0,\n y_max: 497,\n ha: 497,\n o: 'm 513 0 b 528 39 526 14 527 27 b 531 72 531 50 531 60 b 528 138 531 94 528 117 l 528 347 b 552 359 537 354 544 359 b 579 338 560 359 569 353 b 674 217 609 297 639 255 b 719 190 690 200 704 190 b 759 215 732 190 744 197 b 940 395 815 279 877 337 b 1001 490 968 422 986 455 b 1008 513 1004 495 1008 505 b 1002 524 1008 517 1007 521 b 968 516 994 530 978 524 b 960 508 965 513 963 510 b 798 356 900 464 848 410 b 778 341 791 347 783 341 b 757 354 772 341 765 346 b 661 475 720 392 690 432 b 611 517 644 504 629 517 b 563 498 598 517 583 511 b 527 471 550 490 539 481 l 527 570 b 492 716 526 619 523 671 b 472 677 480 704 472 694 b 465 399 474 585 468 491 b 439 366 456 387 448 376 b 384 320 415 336 399 320 b 330 367 369 320 354 336 b 325 376 328 369 327 373 b 226 490 291 413 265 456 b 189 505 213 500 202 505 b 157 491 177 505 167 500 b 0 229 75 420 0 346 b 1 202 0 220 0 212 b 22 215 12 203 16 209 b 124 327 55 252 89 289 b 147 343 132 337 140 343 b 171 323 156 343 164 336 b 266 197 196 276 232 236 b 337 157 291 170 314 157 b 410 207 361 157 386 174 b 461 274 428 229 444 252 b 462 166 461 238 461 202 b 513 0 465 108 487 55 z',\n },\n ornamentShortTrill: {\n x_min: 0,\n x_max: 747,\n y_min: 0,\n y_max: 243,\n ha: 243,\n o: 'm 379 0 b 428 14 395 0 410 4 b 474 56 445 26 461 39 b 552 157 500 89 526 122 b 566 168 556 163 560 168 b 575 157 569 168 572 166 b 664 36 592 107 628 72 b 733 1 685 13 710 1 b 802 35 757 1 780 13 b 1007 249 871 105 940 177 b 1067 324 1028 272 1054 295 b 1076 340 1068 330 1076 334 b 1073 346 1076 341 1076 343 b 1057 350 1068 348 1063 350 b 1047 347 1053 350 1050 350 b 1001 310 1031 336 1015 324 l 857 157 b 844 143 852 153 848 143 b 835 150 841 143 838 144 b 757 242 815 186 780 209 b 685 298 739 268 713 284 b 641 310 670 305 655 310 b 590 288 625 310 608 304 b 497 179 554 256 527 215 b 480 164 490 170 485 164 b 462 179 474 164 469 168 b 372 295 436 220 405 258 b 278 344 346 324 312 344 b 199 310 252 344 226 334 b 92 196 161 274 128 233 b 0 24 46 148 23 89 b 42 48 22 27 32 37 b 156 168 84 85 114 132 b 196 192 174 184 186 192 b 228 158 206 192 215 181 b 312 36 252 114 282 75 b 379 0 331 12 354 0 z',\n },\n ornamentTremblement: {\n x_min: 0,\n x_max: 982.17691453624,\n y_min: 0,\n y_max: 224,\n ha: 224,\n o: 'm 0 0 b 63 36 30 12 48 23 b 157 124 94 66 125 94 b 177 135 164 131 170 135 b 196 122 183 135 189 131 b 268 40 217 94 245 68 b 323 6 288 16 304 6 b 369 20 336 6 350 10 b 412 53 384 29 399 40 b 501 145 442 84 472 114 b 523 158 508 154 516 158 b 543 145 528 158 536 154 b 641 45 576 112 608 78 b 698 17 658 27 677 17 b 729 23 708 17 719 20 b 804 65 756 32 780 46 b 904 154 837 95 871 124 b 920 163 910 160 916 163 b 936 153 924 163 930 160 b 1024 60 965 121 996 92 b 1112 13 1053 29 1080 13 b 1184 39 1135 13 1158 22 b 1359 194 1248 84 1305 138 b 1413 301 1388 223 1403 261 b 1404 323 1417 315 1413 323 b 1391 320 1400 323 1395 321 b 1344 294 1375 314 1358 307 b 1224 186 1305 258 1269 216 b 1194 173 1212 179 1202 173 b 1165 193 1184 173 1175 179 b 1096 271 1145 222 1122 248 b 1001 318 1061 302 1031 318 b 903 268 969 318 937 301 b 806 186 871 239 841 210 b 782 174 796 179 789 174 b 756 193 773 174 765 180 b 652 291 729 232 693 266 b 596 308 634 302 615 308 b 530 278 573 308 552 298 l 415 168 b 393 157 408 161 400 157 b 373 171 387 157 380 161 b 305 245 353 197 330 222 b 248 276 285 266 266 278 b 189 245 229 276 210 266 b 81 144 156 209 120 174 b 0 0 33 109 26 56 z',\n },\n ornamentPrecompAppoggTrill: {\n x_min: -0.11067192132025548,\n x_max: 1066,\n y_min: -50,\n y_max: 533.1706452421108,\n ha: 583.1706452421108,\n o: 'm 187 -46 b 213 -14 197 -37 204 -26 b 285 151 251 36 266 94 b 304 189 294 177 297 189 b 337 168 311 189 320 181 b 458 33 386 131 415 76 b 495 12 472 19 484 12 b 531 40 508 12 518 22 b 580 168 557 79 569 124 b 622 235 592 213 603 235 b 683 194 636 235 655 222 b 838 26 737 140 791 86 b 919 -33 860 -1 881 -39 b 984 53 960 -27 971 19 b 1022 156 998 86 1008 122 b 1054 190 1032 179 1041 190 b 1089 167 1063 190 1074 183 b 1208 32 1129 122 1171 78 b 1244 10 1221 17 1231 10 b 1273 22 1253 10 1263 14 b 1496 206 1352 78 1427 137 b 1535 310 1526 236 1535 272 b 1531 359 1535 325 1534 343 b 1496 343 1515 360 1506 351 l 1309 192 b 1269 167 1289 176 1279 167 b 1234 199 1260 167 1251 177 b 1122 324 1200 243 1168 289 b 1074 344 1106 337 1089 344 b 1014 301 1051 344 1030 328 b 952 144 985 252 971 197 b 933 121 946 128 940 121 b 910 137 927 121 920 125 b 850 210 888 161 870 186 b 687 369 799 266 750 325 b 631 390 665 383 647 390 b 567 327 602 390 580 369 b 527 199 554 284 543 242 b 508 168 520 179 514 168 b 482 192 503 168 495 177 b 353 328 444 240 405 292 b 312 343 338 338 324 343 b 266 297 292 343 276 327 b 204 125 248 239 232 180 b 143 79 193 102 173 79 b 92 122 117 79 105 102 b 81 154 86 131 84 143 b 48 423 59 242 50 333 b 45 544 46 464 45 504 b 53 730 45 606 48 668 b 40 768 55 744 52 766 b 13 730 19 770 14 747 b 0 514 7 658 -1 586 b 26 122 3 383 6 252 b 75 -36 35 66 40 10 b 134 -72 92 -59 112 -72 b 187 -46 151 -72 170 -63 z',\n },\n ornamentPrecompSlideTrillDAnglebert: {\n x_min: 0,\n x_max: 1088,\n y_min: -380,\n y_max: 252,\n ha: 632,\n o: 'm 560 -539 b 439 -481 527 -497 484 -485 b 354 -461 409 -478 380 -477 b 131 -154 236 -389 161 -285 b 124 -98 127 -135 124 -117 b 196 55 124 -40 148 10 b 308 99 230 86 268 99 b 399 81 337 99 367 92 b 514 22 441 66 477 43 b 619 -30 567 -9 590 -30 b 719 17 642 -30 670 -16 b 861 131 769 52 818 88 b 899 150 874 144 887 150 b 936 117 913 150 926 138 b 965 43 948 94 956 68 b 1007 -1 973 24 978 -1 b 1048 30 1025 -1 1037 16 b 1070 65 1057 40 1064 52 b 1110 148 1084 92 1096 121 b 1145 190 1120 164 1120 190 b 1191 153 1169 192 1179 168 b 1256 29 1218 115 1231 68 b 1292 1 1267 10 1277 1 b 1320 10 1300 1 1309 4 b 1369 48 1339 19 1355 33 b 1515 196 1418 96 1464 148 b 1567 343 1558 238 1567 287 b 1555 363 1565 357 1562 363 b 1539 356 1551 363 1547 360 b 1433 268 1502 330 1466 301 b 1335 171 1401 236 1374 199 b 1310 163 1325 166 1318 163 b 1286 183 1302 163 1293 168 b 1218 311 1264 226 1247 272 b 1164 351 1200 337 1182 351 b 1110 308 1146 351 1128 337 b 1031 176 1084 265 1058 219 b 1015 161 1025 166 1021 161 b 999 179 1009 161 1005 167 b 955 279 985 213 973 248 b 913 307 943 300 930 307 b 887 302 904 307 896 305 b 852 281 874 298 863 291 b 693 167 804 236 747 204 b 612 140 667 150 639 140 b 549 157 592 140 570 145 b 403 220 503 181 452 202 b 271 248 360 236 315 248 b 179 229 239 248 209 242 b 0 -29 65 180 0 85 b 9 -104 0 -53 3 -78 b 397 -526 56 -317 183 -464 b 505 -547 432 -536 468 -547 b 560 -539 524 -547 541 -544 z',\n },\n ornamentPrecompSlideTrillBach: {\n x_min: 0,\n x_max: 1185,\n y_min: -380,\n y_max: 465,\n ha: 845,\n o: 'm 624 -544 b 642 -528 638 -543 642 -537 b 639 -514 642 -524 642 -520 b 590 -444 629 -487 609 -467 b 523 -413 573 -422 553 -410 b 498 -415 514 -415 507 -415 b 399 -389 464 -415 431 -405 b 89 -157 281 -330 176 -255 b 72 -117 78 -144 72 -131 b 73 -101 72 -111 72 -107 b 187 186 91 3 147 91 b 246 230 200 216 222 230 b 300 209 262 230 281 223 b 456 48 359 163 403 101 b 540 -10 494 10 518 -10 b 625 59 566 -10 589 13 b 690 148 648 88 668 118 b 711 167 697 160 704 167 b 733 153 719 167 724 163 b 844 14 769 105 808 60 b 903 -42 873 -23 886 -42 b 973 -1 919 -42 937 -27 b 1008 33 986 7 996 20 b 1048 81 1021 48 1035 65 b 1050 37 1048 66 1050 52 b 1047 -24 1050 17 1048 -3 b 1038 -275 1038 -108 1040 -192 l 1037 -289 b 1045 -302 1037 -295 1038 -301 b 1068 -284 1056 -304 1064 -292 b 1084 -242 1076 -271 1081 -256 b 1099 -109 1096 -199 1099 -154 b 1106 158 1099 -19 1106 71 b 1128 187 1113 167 1120 177 b 1168 223 1143 212 1155 223 b 1210 193 1179 223 1191 213 b 1220 183 1214 190 1215 186 b 1329 36 1261 138 1292 84 b 1374 7 1345 16 1358 7 b 1411 20 1384 7 1395 12 b 1479 84 1437 37 1459 59 b 1610 235 1521 135 1564 186 b 1706 403 1655 282 1695 334 b 1614 346 1663 400 1637 373 b 1464 170 1564 287 1515 228 b 1440 150 1453 156 1447 150 b 1414 173 1433 150 1426 158 b 1283 336 1371 228 1333 288 b 1220 366 1261 356 1240 366 b 1148 318 1194 366 1169 350 b 1103 255 1133 297 1119 275 b 1097 301 1102 271 1100 285 b 1099 334 1099 312 1099 324 b 1092 428 1099 367 1094 397 b 1071 647 1087 501 1079 575 b 1058 670 1071 657 1071 670 b 1035 648 1047 670 1038 661 b 1018 516 1024 605 1015 560 b 1041 203 1025 412 1037 307 b 1043 180 1041 196 1043 187 b 992 127 1027 161 1009 143 b 965 111 981 117 972 111 b 936 132 955 111 946 120 b 829 268 900 179 867 225 b 760 317 801 301 780 317 b 691 258 739 317 719 297 b 605 147 664 219 641 177 b 589 138 599 141 593 138 b 572 148 583 138 579 141 b 415 317 520 206 467 261 b 327 372 390 343 366 366 b 300 373 317 373 308 373 b 154 295 239 373 190 348 b 55 138 120 243 85 192 b 0 -53 22 79 0 13 b 160 -317 0 -156 49 -252 b 209 -354 177 -327 192 -343 b 510 -531 305 -419 397 -495 b 593 -547 537 -540 564 -547 b 624 -544 603 -547 613 -546 z',\n },\n ornamentPrecompTrillSuffixDandrieu: {\n x_min: 0,\n x_max: 1003,\n y_min: -20,\n y_max: 521,\n ha: 541,\n o: 'm 791 -16 b 844 33 812 -3 829 14 b 981 271 900 107 937 190 b 994 288 984 278 985 288 b 1009 269 1004 288 1007 278 b 1077 112 1034 217 1051 163 b 1158 43 1103 62 1129 43 b 1231 69 1179 43 1204 55 b 1348 189 1280 98 1315 143 b 1444 451 1407 271 1444 357 b 1431 547 1444 482 1440 514 b 1188 750 1401 665 1299 750 b 1158 747 1178 750 1168 749 b 1079 684 1119 742 1089 727 b 1063 632 1076 665 1071 648 b 1056 609 1058 622 1056 615 b 1071 599 1056 602 1060 599 b 1086 600 1076 599 1080 600 b 1130 605 1102 603 1116 605 b 1244 569 1171 605 1210 595 b 1349 346 1322 511 1349 433 b 1348 312 1349 334 1349 324 b 1289 197 1345 266 1325 228 b 1238 174 1270 181 1253 174 b 1188 215 1220 174 1202 187 b 1145 308 1172 245 1159 276 b 1096 413 1129 343 1120 382 b 1053 438 1084 431 1068 438 b 1011 413 1038 438 1022 431 b 955 324 989 384 971 354 b 850 127 920 258 886 192 b 838 112 847 121 842 112 b 824 128 828 109 825 121 b 802 193 815 150 809 171 b 730 400 779 264 766 337 b 688 431 719 420 703 431 b 647 403 674 431 660 422 b 606 338 632 383 619 361 b 513 167 575 282 546 223 b 480 122 503 150 498 122 b 452 171 459 122 459 153 b 420 255 442 199 432 228 b 337 408 399 308 380 364 b 276 436 317 428 297 436 b 215 397 253 436 230 423 b 23 72 148 289 81 184 b 0 29 17 59 0 40 b 7 17 0 23 1 20 b 59 58 26 7 46 39 b 190 276 111 127 143 206 b 216 301 202 292 207 301 b 245 279 223 301 232 294 b 311 166 278 248 292 206 b 367 16 331 117 346 65 b 402 -19 377 -7 387 -19 b 438 -4 412 -19 423 -13 b 518 88 474 17 495 55 b 628 284 562 150 592 216 b 657 223 648 266 651 243 b 717 13 677 154 696 84 b 755 -29 726 -16 737 -29 b 791 -16 765 -29 776 -24 z',\n },\n ornamentPrecompDoubleCadenceUpperPrefix: {\n x_min: 0,\n x_max: 1246,\n y_min: -30,\n y_max: 296.0302860502196,\n ha: 326.0302860502196,\n o: 'm 360 -43 b 559 59 445 -43 503 7 b 698 236 615 111 652 179 b 714 248 704 243 710 248 b 727 235 719 248 721 243 l 848 42 b 883 12 860 22 870 12 b 917 32 891 12 903 19 b 946 62 927 42 939 50 b 1037 192 972 108 1009 147 b 1057 210 1044 204 1051 210 b 1076 190 1063 210 1068 203 l 1176 12 b 1215 -19 1188 -9 1201 -19 b 1250 -6 1225 -19 1237 -14 b 1284 27 1264 3 1274 16 b 1380 190 1323 78 1351 135 b 1395 210 1384 197 1385 210 b 1413 190 1405 210 1410 197 b 1508 40 1436 134 1467 85 b 1564 3 1529 14 1547 3 b 1617 32 1580 3 1597 12 b 1767 238 1678 92 1719 167 b 1794 310 1781 259 1791 282 b 1752 294 1776 317 1764 304 b 1656 164 1711 258 1689 206 b 1629 144 1646 151 1637 144 b 1603 161 1620 144 1613 150 b 1502 315 1562 207 1525 258 b 1452 357 1490 344 1470 357 b 1397 320 1431 357 1411 344 b 1316 170 1368 271 1345 219 b 1280 127 1306 154 1303 127 b 1244 171 1256 127 1254 154 b 1145 337 1210 226 1179 282 b 1110 363 1135 354 1122 363 b 1070 338 1097 363 1084 354 b 1050 311 1063 330 1057 320 b 959 181 1017 271 992 223 b 939 167 950 173 945 167 b 920 184 933 167 927 173 b 818 343 887 238 852 291 b 759 395 795 377 778 395 b 701 344 742 395 724 377 b 698 338 700 341 700 340 b 544 154 652 272 605 207 b 412 98 501 117 458 98 b 304 130 377 98 341 108 b 95 373 204 187 144 275 b 58 426 85 393 82 428 b 19 366 26 426 26 389 b 0 307 13 346 0 327 b 4 287 0 300 1 294 b 174 36 49 194 91 102 b 360 -43 230 -9 289 -43 z',\n },\n ornamentPrecompDoubleCadenceUpperPrefixTurn: {\n x_min: 0,\n x_max: 1226,\n y_min: -237,\n y_max: 436,\n ha: 673,\n o: 'm 1279 -341 b 1293 -252 1293 -307 1295 -278 b 1277 36 1287 -156 1282 -59 l 1273 118 b 1318 176 1289 137 1303 157 b 1349 203 1332 193 1342 203 b 1378 168 1359 203 1367 192 b 1456 35 1401 122 1428 78 b 1511 -12 1476 3 1493 -12 b 1568 23 1526 -12 1544 0 b 1597 53 1578 32 1588 42 b 1705 186 1629 101 1669 143 b 1761 284 1728 216 1751 246 b 1765 300 1763 288 1765 295 b 1763 307 1765 302 1765 305 b 1737 302 1754 311 1744 308 b 1718 287 1729 298 1725 292 b 1598 145 1673 245 1637 194 b 1578 130 1590 135 1584 130 b 1557 147 1571 130 1565 135 b 1447 321 1516 202 1488 265 b 1403 351 1433 341 1417 351 b 1358 323 1388 351 1372 341 b 1269 209 1329 285 1299 248 b 1254 521 1264 314 1259 418 b 1228 616 1253 554 1247 588 b 1218 628 1224 621 1223 628 l 1215 628 b 1201 613 1210 626 1202 619 b 1200 600 1200 609 1200 605 l 1200 586 b 1211 348 1204 507 1207 428 b 1217 166 1214 288 1215 226 b 1202 181 1212 168 1208 174 b 1094 334 1168 233 1130 284 b 1048 366 1079 356 1064 366 b 1004 331 1034 366 1018 354 b 904 154 969 275 930 220 b 873 202 887 171 880 187 b 778 356 845 256 819 311 b 737 379 763 372 750 379 b 698 353 724 379 711 370 l 621 232 b 415 114 570 154 495 114 b 302 138 377 114 340 121 b 73 400 187 192 117 284 b 55 420 69 415 62 420 b 42 410 50 420 45 416 b 0 292 23 373 0 334 b 4 262 0 282 1 272 b 168 39 32 168 92 99 b 359 -26 225 -6 292 -26 b 585 76 446 -26 530 10 b 668 202 616 115 641 160 b 693 228 680 219 687 228 b 720 203 700 228 707 219 b 801 63 752 160 775 111 b 844 7 812 42 818 7 b 910 66 877 6 894 39 b 923 94 916 75 919 85 b 995 219 945 137 968 179 b 1025 184 1009 210 1017 197 b 1119 56 1054 141 1087 98 b 1166 20 1138 32 1152 20 b 1215 50 1181 20 1195 30 b 1221 56 1217 52 1218 55 b 1228 -163 1223 -17 1225 -89 b 1279 -341 1231 -223 1251 -278 z',\n },\n ornamentPrecompTrillLowerSuffix: {\n x_min: 0,\n x_max: 833,\n y_min: -309,\n y_max: 319,\n ha: 628,\n o: 'm 778 -444 b 801 -445 785 -444 793 -445 b 1037 -338 894 -445 969 -397 b 1200 37 1149 -240 1200 -109 b 1084 406 1200 171 1172 300 b 1024 444 1064 431 1043 444 b 960 390 999 444 978 426 b 841 163 923 314 886 236 b 812 128 832 150 827 128 b 786 167 796 130 793 153 b 660 418 744 251 716 341 b 599 459 639 445 619 459 b 541 410 577 459 557 444 b 439 197 507 340 474 269 b 422 179 435 190 435 179 b 338 393 392 251 379 328 b 275 439 320 423 298 439 b 212 396 253 439 230 425 b 71 219 170 333 128 268 b 0 45 17 173 16 112 b 68 98 32 62 50 78 b 194 264 112 150 153 209 b 230 292 209 282 219 292 b 264 261 240 292 251 282 b 274 242 268 255 269 248 b 346 46 304 179 325 112 b 376 10 351 32 354 10 b 412 35 392 10 403 22 b 452 107 429 56 441 82 b 541 291 481 168 511 230 b 556 307 547 302 552 307 b 573 295 562 307 567 302 b 624 217 595 272 611 246 b 721 1 657 145 685 72 b 755 -27 732 -19 742 -27 b 786 -16 765 -27 775 -24 b 857 73 819 7 840 39 b 952 256 887 134 920 194 b 978 289 963 279 969 289 b 1009 262 985 289 994 281 b 1030 235 1017 253 1024 245 b 1110 -4 1071 161 1099 81 b 1116 -68 1113 -26 1116 -48 b 1009 -243 1116 -140 1090 -200 b 848 -291 956 -272 901 -291 b 730 -261 809 -291 770 -282 b 696 -248 714 -252 703 -248 b 671 -284 684 -248 678 -258 l 662 -312 b 657 -357 658 -330 657 -344 b 744 -439 657 -403 683 -425 z',\n },\n brassScoop: {\n x_min: -0.4444444444444445,\n x_max: 312,\n y_min: -390,\n y_max: 28,\n ha: 418,\n o: 'm 0 -562 b 393 -256 171 -504 307 -412 b 449 -39 431 -189 449 -115 b 448 -1 449 -26 449 -14 b 433 40 446 14 448 40 b 408 -3 410 40 412 14 b 396 -66 403 -23 402 -46 b 45 -397 346 -243 209 -337 b 0 -451 13 -409 1 -423 b 0 -562 -1 -485 0 -520 z',\n },\n brassDoitMedium: {\n x_min: -0.32815253965710617,\n x_max: 476.21251177608565,\n y_min: -50,\n y_max: 333.1535583875376,\n ha: 383.1535583875376,\n o: 'm 16 -72 b 27 -71 19 -72 23 -72 b 215 -33 89 -56 153 -48 b 521 114 327 -7 435 35 b 685 432 615 199 691 295 b 670 480 684 449 688 475 b 642 441 654 482 648 456 b 403 183 599 321 513 240 b 79 89 301 130 192 105 b 0 -1 -12 76 0 76 b 0 -50 0 -17 1 -33 b 16 -72 0 -65 3 -72 z',\n },\n brassFallLipShort: {\n x_min: 0,\n x_max: 298,\n y_min: -344,\n y_max: 65,\n ha: 409,\n o: 'm 396 -495 b 420 -461 412 -487 418 -474 b 429 -382 428 -435 429 -409 b 426 -330 429 -364 428 -347 b 285 -6 410 -209 356 -104 b 98 94 239 59 173 94 b 39 86 79 94 58 92 b 0 49 20 81 0 73 l 0 -52 b 10 -69 0 -62 1 -69 b 20 -68 13 -69 16 -69 b 88 -56 45 -59 66 -56 b 261 -160 156 -56 213 -95 b 396 -495 333 -259 382 -369 z',\n },\n brassLiftMedium: {\n x_min: 0,\n x_max: 807,\n y_min: 0,\n y_max: 838,\n ha: 838,\n o: 'm 50 0 b 55 1 52 0 53 0 b 58 23 65 7 59 16 b 55 58 56 36 55 48 b 130 117 55 99 75 112 b 220 213 202 121 220 141 b 315 308 220 289 238 308 l 336 308 b 408 380 393 310 406 321 b 461 452 409 438 416 452 b 485 451 468 452 477 451 b 569 510 531 448 556 464 b 573 543 572 520 572 531 b 657 619 580 605 595 618 b 698 621 670 619 684 619 b 788 700 749 625 778 649 b 798 778 792 726 793 752 b 873 857 806 841 809 845 b 985 950 927 867 973 887 b 1084 1047 1002 1035 1004 1034 b 1162 1128 1133 1056 1162 1087 b 1146 1182 1162 1145 1158 1164 b 1125 1207 1140 1191 1136 1207 l 1122 1207 b 1110 1191 1113 1205 1110 1198 b 1112 1174 1110 1185 1112 1178 b 1048 1110 1109 1126 1096 1113 b 1028 1109 1043 1110 1035 1109 b 939 1022 969 1102 948 1081 b 845 922 929 949 917 936 b 746 812 773 909 753 886 b 744 780 744 802 744 791 b 635 681 737 700 717 683 b 524 583 553 680 536 665 b 439 510 514 520 503 510 b 357 431 377 510 360 492 l 357 406 b 314 364 356 379 343 364 b 238 361 288 364 264 364 b 173 300 202 357 180 334 b 167 245 168 281 167 262 b 105 174 166 192 157 180 b 75 171 95 173 85 171 b 6 112 30 166 14 153 b 0 73 1 98 0 85 b 37 10 0 45 13 26 b 50 0 42 7 46 0 z',\n },\n brassFallRoughMedium: {\n x_min: 0,\n x_max: 791,\n y_min: 0,\n y_max: 819,\n ha: 819,\n o: 'm 1117 0 b 1139 101 1129 26 1139 71 b 1138 121 1139 109 1139 115 b 1084 193 1125 171 1110 193 b 1044 183 1073 193 1060 189 b 1022 177 1035 179 1028 177 b 1007 209 1012 177 1008 186 b 876 324 1004 292 959 330 b 799 317 850 321 825 320 b 759 354 772 314 755 320 b 760 373 760 360 760 366 b 759 392 760 379 760 384 b 681 477 753 451 730 477 b 654 474 672 477 664 475 b 606 467 638 471 622 468 b 586 465 599 465 592 465 b 564 481 570 465 564 469 b 569 505 564 487 566 495 b 575 553 572 521 575 537 b 572 585 575 564 573 575 b 481 665 560 657 539 668 b 412 665 458 664 435 665 b 382 690 392 667 382 672 b 383 700 382 693 383 696 b 386 773 387 724 387 749 b 297 858 382 828 351 857 b 229 861 274 858 251 858 b 190 897 207 863 193 871 b 163 1012 186 936 180 976 b 79 1084 145 1050 124 1084 b 66 1083 75 1084 71 1083 b 43 1096 49 1081 43 1087 b 48 1112 43 1100 45 1106 b 53 1130 52 1119 53 1125 b 39 1169 53 1145 45 1158 b 26 1179 36 1175 30 1179 b 16 1171 22 1179 17 1176 b 0 1103 10 1149 0 1126 b 9 1067 0 1092 1 1079 b 91 1021 26 1031 52 1018 b 145 978 122 1024 141 1011 b 156 913 147 956 151 935 b 291 795 170 831 210 795 b 346 768 337 795 346 796 b 344 743 346 760 344 753 b 343 716 344 733 343 724 b 455 600 343 651 390 602 b 505 605 471 599 490 605 b 528 598 514 605 523 603 b 536 579 534 592 536 586 b 524 523 536 562 526 541 b 523 505 524 517 523 511 b 621 405 523 442 560 405 b 639 406 626 405 634 406 b 677 413 652 408 664 410 b 701 416 687 415 696 416 b 721 392 716 416 721 410 b 720 373 721 386 720 380 b 831 255 714 301 759 252 b 897 261 854 255 876 261 b 926 262 909 261 919 262 b 969 197 963 262 965 252 b 971 184 969 193 971 189 b 1031 115 979 137 998 115 b 1071 122 1043 115 1056 118 b 1096 130 1079 125 1086 127 b 1087 59 1094 107 1087 82 b 1117 0 1087 37 1094 17 z',\n },\n brassBend: {\n x_min: 0,\n x_max: 381,\n y_min: 0,\n y_max: 367,\n ha: 367,\n o: 'm 298 0 b 472 50 359 0 418 14 b 537 135 501 71 530 92 b 543 216 543 163 543 190 l 543 266 b 544 308 543 281 543 295 b 549 433 546 354 549 395 b 543 507 549 459 547 482 b 533 528 541 516 544 528 b 511 508 524 528 514 520 b 508 478 510 498 508 488 b 504 318 507 425 504 372 b 505 264 504 300 505 282 b 446 181 505 220 484 199 b 294 150 396 160 344 150 b 92 194 226 150 158 167 b 45 269 62 207 45 230 b 46 359 46 300 46 328 b 37 497 46 405 45 451 b 27 523 36 507 37 523 b 4 498 14 524 6 513 b 3 481 3 492 3 487 b 0 409 1 456 0 433 b 4 228 0 348 4 288 b 3 177 4 210 4 194 b 68 53 1 125 20 84 b 200 10 108 27 154 17 b 298 0 233 4 266 0 z',\n },\n brassMuteClosed: {\n x_min: 0,\n x_max: 274,\n y_min: 0,\n y_max: 260,\n ha: 260,\n o: 'm 203 0 b 209 1 206 0 207 0 b 216 13 215 4 216 9 l 215 27 l 215 153 b 216 161 216 156 216 158 b 372 164 268 163 318 164 b 395 184 383 164 395 166 l 395 189 b 357 229 392 209 386 229 b 219 228 311 229 265 228 l 223 310 b 209 357 225 328 219 344 b 189 374 203 364 197 374 b 184 373 187 374 186 373 b 177 359 179 372 177 366 l 177 348 l 173 222 l 39 222 b 0 206 12 222 0 219 b 10 174 0 199 3 189 b 46 157 19 157 30 157 b 108 160 68 158 88 160 b 171 161 130 161 150 161 l 167 58 b 184 16 167 40 171 26 b 203 0 192 12 196 0 z',\n },\n brassMuteOpen: {\n x_min: 1,\n x_max: 313.01193341111656,\n y_min: 0,\n y_max: 309,\n ha: 309,\n o: 'm 265 0 b 451 189 363 7 452 88 l 451 215 b 348 383 441 285 405 343 b 209 445 288 426 248 445 b 84 379 168 445 132 420 b 69 364 79 373 73 369 b 1 213 30 323 1 275 b 230 0 1 88 94 0 z m 210 62 b 128 73 181 62 154 66 b 40 171 71 91 42 125 b 52 226 40 187 45 206 b 197 374 79 295 130 344 b 228 382 207 380 217 382 b 300 361 252 382 276 370 b 374 308 328 350 353 331 b 410 223 397 284 410 253 b 393 163 410 202 405 181 b 210 62 354 91 288 63 z',\n },\n brassFlip: {\n x_min: 0,\n x_max: 402,\n y_min: 0,\n y_max: 361,\n ha: 361,\n o: 'm 579 0 b 511 153 579 68 557 117 b 52 504 359 271 206 387 b 29 520 45 510 39 520 b 20 517 26 520 23 518 b 0 477 3 510 0 494 l 0 125 b 17 20 1 92 1 56 b 40 84 37 40 40 60 b 42 287 40 151 42 219 l 42 363 z',\n },\n brassJazzTurn: {\n x_min: 0,\n x_max: 646,\n y_min: 0,\n y_max: 212,\n ha: 212,\n o: 'm 310 0 b 367 33 327 0 344 10 b 389 55 374 40 382 49 b 490 145 423 85 456 114 b 507 154 495 151 501 154 b 524 144 513 154 517 151 b 598 72 547 120 575 98 b 700 24 625 42 662 24 b 765 43 721 24 744 30 b 893 147 812 72 855 105 b 930 212 910 166 923 186 b 912 215 923 213 917 215 b 871 199 896 215 883 209 b 812 153 852 183 832 167 b 789 144 805 148 796 144 b 773 156 782 144 776 147 b 691 251 757 199 720 222 b 603 301 658 282 631 301 b 527 258 580 301 556 288 b 420 156 494 222 455 190 b 399 143 412 147 405 143 b 377 157 392 143 386 147 b 259 282 340 200 300 242 b 219 305 245 298 232 305 b 177 279 204 305 192 297 b 55 127 137 228 95 177 b 0 52 36 104 20 79 b 14 50 6 50 10 50 b 53 66 32 50 45 58 b 115 131 75 88 98 108 b 135 148 124 143 130 148 b 157 132 141 148 148 143 b 252 33 186 96 219 65 b 310 0 275 12 292 0 z',\n },\n brassSmear: {\n x_min: 0,\n x_max: 334,\n y_min: 0,\n y_max: 151,\n ha: 151,\n o: 'm 321 0 b 475 125 390 0 436 43 b 481 143 478 131 481 137 b 475 154 481 147 480 151 b 449 148 468 158 458 154 b 395 132 432 137 413 132 b 343 140 377 132 360 137 b 229 194 301 148 266 173 b 168 217 206 209 186 217 b 109 192 148 217 130 209 b 0 26 59 148 32 89 b 59 63 32 29 45 48 b 98 84 72 78 84 84 b 130 73 108 84 118 81 b 213 26 157 58 183 37 b 321 0 255 9 289 0 z',\n },\n stringsDownBow: {\n x_min: 0,\n x_max: 306,\n y_min: -0.09607201951262866,\n y_max: 366,\n ha: 366.09607201951263,\n o: 'm 405 0 b 425 17 413 -1 420 9 b 439 66 435 32 439 48 b 441 268 439 137 441 202 b 436 412 441 314 439 361 l 435 413 b 423 469 435 436 431 456 b 344 508 406 501 373 501 b 204 527 298 520 251 527 b 60 498 156 527 108 518 b 7 438 32 485 10 468 l 7 426 b 4 337 7 396 7 367 b 0 140 0 272 0 206 b 1 42 0 107 0 73 b 13 3 1 27 -3 4 b 40 39 29 3 35 24 b 42 53 42 43 40 49 b 49 141 48 84 49 112 b 48 215 49 167 48 192 b 49 252 48 228 48 240 l 49 312 b 130 343 72 331 99 340 b 206 347 156 346 180 347 b 372 314 262 347 318 338 l 390 307 l 390 245 b 390 138 392 212 390 176 b 397 23 390 101 392 62 b 405 0 399 14 393 1 z',\n },\n stringsUpBow: {\n x_min: 0,\n x_max: 219.2842808242076,\n y_min: 0,\n y_max: 489,\n ha: 489,\n o: 'm 151 0 b 184 42 170 12 180 26 b 297 554 223 212 261 382 b 315 690 305 598 318 645 b 304 704 315 697 311 704 b 276 670 288 704 282 697 b 157 131 236 490 196 311 l 157 144 b 73 526 134 276 104 396 b 30 677 60 576 52 638 b 13 694 26 684 22 694 b 0 674 9 694 0 691 l 0 671 b 10 603 3 649 6 626 b 105 174 42 461 72 317 b 150 0 117 117 128 58 z',\n },\n stringsHarmonic: {\n x_min: 0,\n x_max: 191,\n y_min: 0,\n y_max: 202,\n ha: 202,\n o: 'm 143 0 b 275 122 217 0 275 53 b 127 291 275 206 202 291 b 0 154 63 291 0 222 b 143 0 0 76 71 0 z m 122 68 b 43 105 89 66 59 75 b 39 124 40 111 39 117 b 79 199 39 148 56 180 b 145 226 101 216 122 226 b 199 210 163 226 180 220 b 235 150 223 196 235 173 b 203 92 235 128 225 107 b 122 68 181 76 150 68 z',\n },\n pluckedSnapPizzicatoAbove: {\n x_min: 0,\n x_max: 201,\n y_min: 0,\n y_max: 325,\n ha: 325,\n o: 'm 171 0 b 289 99 240 0 289 45 b 258 183 289 130 274 156 b 174 269 236 217 203 240 l 174 408 b 174 429 174 415 176 422 b 131 468 168 451 153 468 b 117 451 120 468 117 461 b 118 429 117 444 118 435 b 115 307 117 389 115 347 b 0 166 59 295 0 223 b 171 0 0 85 89 0 z m 134 55 b 52 131 84 55 52 85 b 115 233 52 179 81 209 b 114 192 114 220 114 206 b 174 120 114 137 114 137 l 174 228 b 233 148 200 207 223 183 b 236 130 235 143 236 135 b 197 72 236 105 223 85 b 134 55 177 60 157 55 z',\n },\n pluckedSnapPizzicatoBelow: {\n x_min: 0,\n x_max: 211,\n y_min: 0,\n y_max: 307,\n ha: 307,\n o: 'm 145 7 b 163 0 153 3 158 0 b 173 23 170 0 173 7 l 173 140 l 170 140 l 170 163 l 171 163 b 206 170 179 164 193 166 b 304 287 264 186 304 233 b 281 354 304 308 297 333 b 118 442 240 412 186 439 b 0 324 69 442 0 370 b 115 176 0 266 55 202 l 115 56 b 145 7 114 33 125 19 z m 115 220 b 62 256 92 223 73 230 b 53 292 56 269 53 281 b 78 344 53 311 60 328 b 168 384 105 372 135 384 b 213 376 183 384 199 382 b 253 321 239 366 253 346 b 246 291 253 311 251 301 b 170 226 230 256 203 236 l 170 258 b 148 305 171 278 163 292 b 128 315 143 310 135 315 l 124 315 b 115 301 117 314 115 308 z',\n },\n pluckedLeftHandPizzicato: {\n x_min: 0,\n x_max: 271,\n y_min: 0,\n y_max: 284,\n ha: 284,\n o: 'm 213 0 b 223 14 222 0 223 7 b 222 35 223 22 222 29 l 222 176 b 373 170 272 174 323 170 b 390 180 382 170 390 171 l 390 184 b 347 232 386 207 382 232 b 219 238 307 233 266 235 l 219 364 b 171 409 219 395 193 409 b 156 393 160 409 156 402 b 158 370 156 384 158 376 l 158 240 b 16 239 115 240 66 239 b 0 226 7 239 0 238 l 0 223 b 50 179 1 203 29 179 b 158 177 86 179 122 179 l 158 63 b 161 29 158 52 158 40 b 213 0 166 -1 194 1 z',\n },\n keyboardPedalPed: {\n x_min: 0,\n x_max: 944,\n y_min: -13,\n y_max: 550,\n ha: 563,\n o: 'm 22 0 b 109 78 53 0 105 46 l 144 333 b 163 376 147 347 140 372 b 364 465 238 390 301 426 b 454 599 416 497 454 540 b 452 618 454 605 454 612 b 320 770 442 694 396 747 b 248 779 295 778 272 779 b 193 778 229 779 212 779 b 160 780 181 778 167 775 b 137 792 153 789 144 791 b 109 789 128 792 118 789 b 7 719 59 789 48 737 b 23 708 16 714 20 708 b 36 710 29 710 33 710 b 53 684 52 710 53 698 l 53 674 b 43 386 53 577 53 482 b 20 164 36 312 30 238 b 1 30 14 120 7 75 b 0 19 0 26 0 22 b 22 0 0 9 4 0 z m 171 425 b 156 442 160 425 156 429 b 157 475 157 452 157 464 b 164 602 161 517 164 560 b 161 698 164 635 163 667 b 184 729 161 720 167 729 l 193 729 b 348 563 278 719 348 641 b 346 539 348 554 347 547 b 171 425 328 459 229 422 z m 979 6 b 1008 13 986 6 995 9 b 1081 101 1047 29 1079 46 b 1116 449 1087 217 1104 333 b 1143 654 1123 518 1133 586 b 1148 685 1145 664 1148 675 b 1140 704 1148 693 1146 700 b 1107 716 1130 713 1119 716 b 1056 706 1092 716 1073 710 b 1037 671 1035 703 1038 685 b 1004 439 1025 595 1014 517 b 986 419 1001 428 999 419 b 979 419 985 419 982 420 b 935 426 965 423 949 425 b 795 376 884 426 838 405 b 664 153 714 323 664 249 b 665 130 664 145 665 138 b 753 29 671 65 704 29 b 815 40 773 29 792 33 b 975 147 873 65 923 101 b 965 45 971 108 968 76 b 979 6 963 17 966 6 z m 393 -17 b 634 145 494 16 579 52 b 638 160 636 151 638 156 b 625 168 638 166 634 168 b 621 167 624 168 622 168 b 524 118 582 164 544 160 b 495 79 517 104 505 92 b 435 33 471 49 452 33 b 380 96 416 33 397 55 b 369 145 373 114 369 131 b 442 225 369 186 395 213 b 468 232 451 228 459 229 b 654 344 539 255 606 285 b 677 395 667 360 677 376 b 672 415 677 402 675 408 b 612 459 661 442 639 455 b 589 461 602 461 592 461 b 348 328 500 461 409 408 b 269 120 302 268 269 199 b 379 -19 269 45 318 -19 b 393 -17 383 -19 389 -19 z m 395 240 b 494 383 418 300 452 344 l 521 405 b 544 419 528 409 536 418 b 554 415 547 419 550 418 b 570 383 564 406 570 396 l 570 379 b 552 331 570 360 562 344 b 395 240 511 285 462 253 z m 827 89 b 792 111 815 89 804 96 b 766 204 775 131 766 158 b 845 360 772 256 799 314 b 871 372 854 369 863 372 b 897 366 880 372 888 369 b 978 279 942 353 963 320 b 976 259 981 272 981 265 b 858 104 942 203 909 147 b 827 89 847 94 837 89 z m 1282 12 b 1336 35 1303 14 1320 23 b 1359 71 1351 45 1359 58 b 1338 102 1359 82 1352 95 b 1254 130 1312 118 1284 130 b 1187 88 1223 130 1202 109 b 1178 65 1182 81 1178 72 b 1195 37 1178 55 1182 45 b 1282 12 1223 23 1253 19 z',\n },\n keyboardPedalUp: {\n x_min: 0,\n x_max: 436.6015132318337,\n y_min: 0,\n y_max: 461,\n ha: 461,\n o: 'm 330 0 b 334 1 331 0 333 0 b 340 12 338 4 340 7 l 338 26 b 340 264 338 105 338 184 b 526 95 400 206 461 148 b 559 71 536 88 547 71 b 564 72 560 71 563 71 b 580 121 580 79 580 102 l 580 127 b 543 203 585 158 573 184 b 472 259 518 219 495 238 l 445 285 b 590 292 494 288 541 291 b 622 318 609 294 618 302 b 628 359 625 331 626 346 b 586 402 632 393 621 405 b 464 395 546 399 504 396 l 559 491 b 567 524 567 500 567 510 b 564 543 567 527 567 536 b 539 596 559 563 560 590 b 494 564 521 600 508 577 b 340 413 442 514 390 464 l 340 560 b 287 664 340 600 321 632 b 271 518 274 612 272 566 b 268 445 269 494 269 469 b 117 569 219 488 168 530 b 96 579 109 575 102 579 b 85 560 89 579 85 573 b 124 446 85 518 82 477 b 209 380 153 426 181 403 b 45 374 154 377 99 376 b 0 324 9 374 0 359 b 63 266 0 265 1 265 b 144 272 89 269 117 272 l 196 272 b 108 193 167 246 138 219 b 60 135 76 164 60 151 b 99 73 60 121 73 105 b 104 68 101 72 102 71 b 114 58 107 60 111 58 b 130 66 120 58 124 62 b 259 186 173 107 217 145 b 256 117 259 163 256 140 b 311 13 256 72 271 37 b 330 0 317 10 323 0 z',\n },\n pictChokeCymbal: {\n x_min: 1,\n x_max: 147,\n y_min: 0,\n y_max: 242,\n ha: 242,\n o: 'm 79 4 b 207 158 153 32 192 88 b 212 200 210 173 212 187 b 143 336 212 253 187 298 b 98 348 131 344 115 348 b 4 295 60 348 16 327 b 1 276 1 289 1 282 b 9 249 1 266 3 258 b 121 183 35 206 72 183 b 156 186 132 183 144 183 b 26 53 134 115 91 73 b 7 39 13 49 7 45 b 19 20 7 33 12 27 b 59 0 30 9 43 0 b 79 4 65 0 72 1 z',\n },\n wiggleArpeggiatoUp: {\n x_min: -22,\n x_max: 300,\n y_min: 0,\n y_max: 176,\n ha: 176,\n o: 'm 173 4 b 196 0 180 1 189 0 b 246 26 215 0 230 9 b 301 117 271 53 285 85 b 312 131 305 125 307 131 b 327 124 315 131 321 128 b 373 86 341 112 353 101 b 412 69 389 75 402 69 b 432 94 425 69 432 79 b 373 181 432 117 413 154 b 235 252 323 216 285 245 b 220 253 229 253 225 253 b 168 215 196 253 181 240 b 111 112 151 180 140 141 b 94 102 105 105 99 102 b 78 111 89 102 84 105 b 0 181 55 135 35 160 b -32 153 -20 194 -32 168 b 0 86 -32 124 -32 109 b 94 36 22 71 73 46 b 173 4 134 16 131 17 z',\n },\n arpeggiatoUp: {\n x_min: 0,\n x_max: 262,\n y_min: 0,\n y_max: 1459,\n ha: 1459,\n o: 'm 190 0 b 160 63 187 29 170 45 b 145 108 150 81 145 95 b 183 163 145 128 157 145 b 300 246 222 190 262 216 b 347 318 333 272 347 295 b 301 393 347 341 331 364 b 258 413 289 403 272 408 b 145 449 220 425 183 436 b 117 464 135 452 120 452 b 140 491 115 477 128 484 b 294 593 192 526 243 557 b 330 647 318 611 330 626 b 314 693 330 660 324 675 b 262 736 302 714 285 729 b 170 763 230 744 200 753 b 122 783 153 768 125 768 b 160 831 120 804 143 818 b 288 922 202 861 246 890 b 333 999 318 945 333 972 b 266 1083 333 1032 310 1064 b 189 1115 240 1094 215 1103 b 122 1178 145 1133 122 1153 b 168 1250 122 1200 138 1223 l 180 1257 b 269 1333 210 1283 240 1306 b 305 1405 294 1356 305 1381 b 284 1469 305 1426 298 1447 b 228 1525 269 1492 251 1511 b 183 1600 197 1545 183 1571 b 190 1640 183 1613 184 1626 b 197 1670 193 1650 194 1660 b 272 1735 213 1719 230 1735 b 295 1734 279 1735 287 1735 b 323 1732 305 1732 314 1732 b 350 1731 333 1732 341 1732 b 377 1742 369 1729 377 1732 b 370 1761 377 1747 374 1754 l 301 1898 b 217 2066 274 1954 248 2012 b 186 2101 204 2089 196 2101 b 154 2069 177 2101 167 2091 b 12 1824 105 1987 59 1907 b 0 1787 4 1810 0 1797 b 59 1744 0 1761 20 1745 b 160 1738 92 1744 125 1740 b 145 1692 156 1721 151 1706 b 135 1633 138 1672 135 1652 b 184 1518 135 1591 151 1552 b 229 1475 199 1503 213 1488 b 259 1431 249 1456 259 1444 b 229 1388 259 1420 249 1407 b 151 1325 203 1365 177 1345 b 105 1279 134 1310 118 1296 b 73 1202 84 1251 73 1227 b 108 1123 73 1176 85 1152 b 255 1031 148 1077 199 1051 b 282 1014 274 1025 282 1021 b 262 991 282 1008 275 1001 b 151 914 226 963 189 939 b 79 851 125 896 99 877 b 63 809 69 837 63 824 b 79 769 63 796 68 783 b 202 697 111 729 154 710 b 266 670 225 690 266 688 b 210 622 266 648 232 635 b 82 534 167 593 120 570 b 55 491 63 518 55 505 b 79 448 55 478 63 465 b 255 361 127 395 192 380 b 288 343 269 359 288 357 b 266 312 288 331 275 320 b 144 223 229 278 184 253 b 85 134 104 193 85 166 b 118 53 85 111 96 85 b 190 0 135 29 160 14 z',\n },\n arpeggiatoDown: {\n x_min: 0,\n x_max: 218,\n y_min: 0,\n y_max: 1440,\n ha: 1440,\n o: 'm 161 16 b 310 261 210 98 259 180 b 314 275 312 266 314 271 b 302 295 314 282 310 289 b 252 311 287 308 269 311 b 217 310 240 311 229 310 b 190 333 202 310 194 315 b 151 412 186 363 171 389 b 102 501 120 452 102 477 b 150 588 102 524 118 547 b 161 603 154 592 158 598 b 181 661 176 622 181 641 b 173 704 181 675 179 690 b 86 795 156 746 121 770 b 53 829 63 811 53 819 b 78 868 53 840 62 851 b 102 888 85 876 94 883 b 180 956 128 912 156 933 b 216 1028 204 979 216 1002 b 203 1081 216 1044 212 1061 b 115 1171 186 1123 148 1145 b 75 1221 88 1191 75 1207 b 114 1272 75 1237 88 1251 b 173 1308 132 1284 154 1296 b 226 1339 190 1318 209 1328 b 265 1405 253 1359 265 1380 b 258 1447 265 1418 264 1431 b 154 1541 242 1499 199 1521 b 109 1581 124 1555 109 1567 b 141 1627 109 1594 121 1608 b 204 1680 163 1646 184 1662 b 233 1742 223 1699 233 1719 b 226 1777 233 1752 230 1764 b 135 1862 210 1822 173 1840 b 104 1895 114 1875 104 1884 b 118 1930 104 1904 109 1914 b 192 2006 135 1961 161 1986 b 206 2029 203 2013 206 2022 b 192 2064 206 2040 197 2052 b 180 2074 187 2071 184 2074 b 156 2061 171 2074 163 2065 b 84 1983 125 2040 102 2013 b 65 1921 71 1961 65 1941 b 88 1853 65 1899 72 1876 b 171 1784 108 1820 138 1801 b 190 1764 184 1777 190 1770 b 174 1741 190 1757 184 1750 b 107 1683 153 1722 128 1704 b 68 1610 81 1659 68 1636 b 88 1548 68 1591 75 1571 b 177 1470 109 1512 141 1489 b 223 1431 209 1453 223 1443 b 179 1390 223 1420 209 1408 b 128 1361 163 1380 145 1371 b 71 1322 108 1348 88 1338 b 32 1253 45 1300 32 1277 b 48 1198 32 1236 37 1218 b 147 1090 71 1152 108 1120 b 174 1057 166 1076 174 1067 b 153 1022 174 1047 167 1037 b 109 982 140 1008 124 995 b 37 919 85 962 59 942 b 9 860 17 899 9 880 b 26 806 9 844 14 827 b 120 717 50 769 84 740 b 138 691 132 708 138 700 b 130 668 138 684 135 677 b 92 618 118 651 105 635 b 59 531 71 589 59 560 b 84 455 59 507 68 481 b 132 386 98 431 115 408 b 148 341 144 372 148 357 b 144 317 148 333 147 324 b 121 305 140 307 131 305 l 98 305 b 82 304 94 304 88 304 l 32 304 b 0 292 10 304 0 302 b 12 266 0 287 4 279 b 60 164 32 233 46 199 b 127 20 84 117 105 68 b 144 0 132 9 137 0 b 161 16 150 0 154 4 z',\n },\n repeat1Bar: {\n x_min: 0,\n x_max: 599.1057280164835,\n y_min: -250,\n y_max: 175,\n ha: 425,\n o: 'm 216 98 b 255 75 236 84 246 75 b 291 104 265 75 274 85 b 323 147 304 117 327 125 b 289 215 323 168 314 184 b 238 252 269 239 253 252 b 187 222 222 252 207 242 b 173 206 183 216 177 212 b 157 170 163 194 157 183 b 174 138 157 160 161 150 b 216 98 189 127 200 109 z m 76 -334 b 181 -285 111 -315 148 -302 b 831 52 396 -168 613 -58 b 863 114 855 63 864 82 b 828 202 855 140 855 176 b 808 213 821 209 815 213 b 793 209 804 213 799 212 l 422 19 b 26 -179 291 -48 164 -124 b 0 -213 10 -186 0 -196 b 3 -232 0 -219 0 -225 b 52 -325 14 -265 37 -294 b 66 -337 55 -331 59 -337 b 76 -334 69 -337 72 -336 z m 769 -360 b 829 -264 779 -360 829 -284 b 769 -176 822 -232 799 -200 b 742 -163 760 -167 750 -163 b 716 -184 733 -163 723 -168 b 683 -228 708 -202 693 -213 b 672 -253 675 -236 672 -245 b 683 -281 672 -262 675 -271 b 752 -353 703 -308 732 -327 b 769 -360 756 -357 763 -360 z',\n },\n repeat2Bars: {\n x_min: 0.008571918423331715,\n x_max: 775,\n y_min: -246.92374029115243,\n y_max: 362.82068246705313,\n ha: 609.7444227582056,\n o: 'm 909 412 b 873 351 906 384 893 367 b 436 50 729 249 585 147 l 91 -179 b 62 -174 76 -189 68 -183 b 12 -96 48 -147 24 -125 b 36 -16 -7 -53 -6 -43 b 220 104 96 24 158 65 b 819 507 425 232 624 369 b 881 495 852 530 861 528 b 909 412 899 469 900 439 z m 333 338 b 302 240 330 307 317 274 b 276 235 297 225 287 228 l 233 269 b 203 376 186 307 183 318 b 225 441 212 397 217 419 b 246 454 228 452 232 458 b 333 338 284 441 333 380 z m 1116 228 b 1067 158 1115 192 1092 174 b 910 59 1015 125 963 92 b 478 -240 762 -33 622 -140 b 311 -350 423 -279 366 -314 b 285 -344 298 -360 289 -356 b 239 -258 272 -314 251 -288 b 261 -196 228 -228 235 -210 b 517 -29 348 -144 436 -91 b 1030 321 681 98 861 202 b 1093 307 1060 343 1076 340 b 1116 228 1107 281 1109 252 z m 1070 -105 b 1020 -210 1057 -143 1038 -176 b 998 -210 1014 -219 1004 -215 l 924 -153 b 913 -88 899 -135 897 -112 b 949 -22 926 -66 939 -45 b 998 -7 960 6 976 9 b 1070 -105 1032 -32 1058 -63 z',\n },\n repeat4Bars: {\n x_min: 0,\n x_max: 1374,\n y_min: -304,\n y_max: 304,\n ha: 608,\n o: 'm 78 -266 b 92 -258 82 -266 88 -264 b 114 -240 98 -251 107 -246 b 638 107 289 -125 467 -14 b 873 271 716 161 793 216 b 907 337 894 285 906 305 b 887 400 901 354 897 379 b 852 438 877 426 867 438 b 814 420 842 438 829 432 b 135 -33 592 262 366 111 b 12 -121 92 -60 48 -84 b 0 -144 4 -128 0 -135 b 4 -160 0 -148 1 -154 b 63 -255 17 -196 45 -223 b 78 -266 68 -262 72 -266 z m 291 148 b 325 223 302 148 308 170 b 333 256 328 235 330 246 b 264 363 330 305 298 336 b 242 373 255 369 248 373 b 220 347 232 373 225 364 b 202 288 216 327 213 305 b 190 252 193 275 190 262 b 222 200 190 232 202 215 b 291 148 264 170 279 148 z m 815 -367 b 829 -359 819 -367 824 -364 b 851 -343 835 -353 844 -347 b 1375 6 1027 -228 1205 -117 l 1610 170 b 1644 235 1632 184 1643 203 b 1626 300 1639 253 1634 276 b 1590 337 1614 325 1604 337 b 1551 320 1580 337 1567 330 b 873 -135 1329 161 1103 10 b 749 -222 829 -161 785 -184 b 737 -245 742 -230 737 -238 b 742 -261 737 -249 739 -255 b 802 -357 755 -297 782 -325 b 815 -367 805 -363 809 -367 z m 396 -360 b 408 -356 400 -360 403 -359 b 609 -223 471 -307 543 -269 b 896 -19 706 -156 795 -81 b 1164 154 985 37 1074 96 b 1214 223 1189 170 1211 187 b 1176 321 1204 253 1205 292 b 1159 330 1169 327 1165 330 b 1145 324 1155 330 1151 328 b 1048 258 1113 302 1081 278 b 357 -202 809 117 598 -65 b 333 -238 341 -212 333 -223 b 338 -262 333 -245 334 -253 b 384 -350 350 -294 372 -318 b 396 -360 386 -354 390 -360 z m 1162 -438 b 1174 -433 1166 -438 1169 -436 b 1374 -300 1237 -384 1309 -346 b 1660 -96 1470 -233 1561 -158 b 1930 76 1751 -39 1840 19 b 1979 147 1954 92 1977 109 b 1943 243 1968 177 1971 216 b 1924 253 1935 251 1930 253 b 1911 248 1920 253 1915 252 b 1814 181 1878 225 1848 202 b 1123 -279 1575 40 1364 -141 b 1099 -315 1106 -289 1099 -300 b 1103 -338 1099 -321 1100 -330 b 1149 -426 1115 -370 1138 -396 b 1162 -438 1151 -432 1156 -438 z m 1875 -295 b 1882 -291 1878 -295 1879 -294 b 1934 -189 1904 -258 1921 -223 b 1872 -96 1925 -147 1901 -120 b 1840 -78 1858 -84 1848 -78 b 1812 -109 1830 -78 1823 -88 l 1777 -173 b 1770 -199 1773 -181 1770 -190 b 1786 -230 1770 -210 1774 -220 b 1862 -289 1809 -253 1837 -269 b 1875 -295 1865 -292 1871 -295 z',\n },\n repeatBarSlash: {\n x_min: 0,\n x_max: 630,\n y_min: -225.19160170741762,\n y_max: 265.12618221237005,\n ha: 490.31778391978764,\n o: 'm 78 -324 b 92 -314 82 -325 88 -321 b 114 -298 96 -307 107 -302 b 638 49 289 -183 467 -72 b 873 215 716 104 792 161 b 907 279 894 229 906 248 b 887 344 901 298 897 321 b 852 382 877 369 867 380 b 814 363 842 383 829 376 b 135 -91 603 192 364 55 b 12 -177 92 -118 45 -137 b 0 -202 4 -186 0 -192 b 4 -217 0 -206 1 -212 b 63 -312 17 -253 42 -284 b 78 -324 68 -318 72 -323 z',\n },\n csymDiminished: {\n x_min: 0,\n x_max: 506,\n y_min: -0.011036179317259481,\n y_max: 500,\n ha: 500.0110361793173,\n o: 'm 397 0 b 729 265 576 -1 729 95 b 711 367 729 297 723 331 b 472 670 668 498 586 595 b 315 720 423 701 372 720 b 253 713 295 720 275 719 b 32 514 144 687 75 615 b 0 374 12 468 0 420 b 27 251 0 333 9 292 b 140 117 52 196 92 153 b 397 0 223 52 317 4 z m 340 95 b 132 314 233 84 122 216 b 324 589 145 438 200 539 b 415 611 360 603 389 611 b 544 505 469 611 505 576 b 590 392 564 471 583 432 b 596 343 593 374 596 359 b 340 95 596 210 485 96 z',\n },\n csymHalfDiminished: {\n x_min: -32,\n x_max: 496,\n y_min: -33,\n y_max: 492,\n ha: 525,\n o: 'm -29 -48 b 0 -36 -19 -48 -9 -40 b 17 -20 7 -32 12 -24 b 134 94 56 19 95 56 b 372 0 207 43 282 0 b 455 13 397 0 426 4 b 677 258 556 45 671 141 b 678 289 677 268 678 278 b 593 539 678 380 654 467 b 592 541 593 540 592 540 l 684 632 b 713 678 700 647 711 665 b 714 691 714 684 714 688 b 707 704 714 698 711 701 b 691 708 701 707 696 708 b 660 691 680 708 670 701 l 552 585 b 478 634 530 606 507 624 b 361 684 438 648 397 661 b 301 703 341 697 320 703 b 226 677 275 703 251 693 b 27 449 140 618 72 543 b 0 324 9 410 -4 370 b 88 128 -1 243 30 177 b -30 -7 43 86 0 46 b -46 -33 -35 -16 -46 -24 b -42 -42 -46 -36 -45 -39 b -29 -48 -37 -46 -33 -48 z m 141 179 b 121 251 128 200 121 225 b 128 297 121 265 124 281 b 351 575 163 420 248 505 b 377 582 359 579 369 580 b 501 536 422 586 468 567 b 141 179 382 416 261 298 z m 281 105 b 179 137 240 105 206 117 b 210 168 189 147 200 157 l 537 487 b 547 455 541 477 544 467 b 556 370 552 426 556 397 b 429 154 556 274 503 207 b 281 105 384 122 336 105 z',\n },\n csymAugmented: {\n x_min: 0,\n x_max: 530,\n y_min: 0,\n y_max: 539,\n ha: 539,\n o: 'm 380 0 b 393 14 384 4 390 9 b 397 46 397 24 397 36 l 397 333 b 736 327 511 331 624 330 b 763 343 755 327 763 333 b 755 361 763 348 760 354 b 635 431 726 402 688 431 l 390 431 l 390 485 b 386 606 392 526 386 566 b 392 664 386 625 387 645 b 395 690 393 672 395 681 b 376 753 395 711 389 734 b 357 776 372 762 369 776 b 350 775 354 776 353 776 b 327 740 337 769 327 759 b 327 621 328 700 327 661 b 330 438 328 559 328 498 l 29 438 b 4 431 20 438 7 442 b 0 413 3 425 0 419 b 7 399 0 408 1 403 b 131 338 45 369 85 340 b 331 334 199 336 265 334 b 333 163 333 276 333 220 b 366 13 333 109 348 63 b 380 0 367 7 374 4 z',\n },\n csymMajorSeventh: {\n x_min: 0,\n x_max: 593.1050509327923,\n y_min: 0,\n y_max: 569,\n ha: 569,\n o: 'm 124 1 l 497 27 b 819 50 605 35 711 43 b 854 98 847 52 855 63 b 812 200 845 128 835 166 b 564 585 730 328 648 456 b 435 786 521 652 480 720 b 397 819 419 809 408 819 b 369 792 387 819 379 811 b 7 173 248 585 128 379 b 0 150 3 166 0 158 b 7 128 0 143 3 135 b 89 10 30 86 65 50 b 109 0 95 1 102 0 z m 163 147 b 153 153 158 147 156 148 b 164 179 147 163 158 170 b 426 644 251 334 338 488 b 442 660 432 655 436 660 b 458 645 446 660 452 655 b 727 220 547 503 636 361 b 736 202 732 213 736 206 b 714 190 736 196 730 192 b 179 148 537 177 359 163 b 163 147 174 150 168 147 z',\n },\n csymMinor: {\n x_min: 0,\n x_max: 481.64484584675915,\n y_min: 193,\n y_max: 265.20435472429375,\n ha: 72.20435472429375,\n o: 'm 168 278 b 197 279 177 278 187 278 b 431 292 275 287 353 288 l 431 291 b 661 302 508 295 585 300 b 693 311 672 304 688 300 b 674 346 697 324 685 338 b 564 382 641 366 606 384 l 27 360 b 0 347 17 360 1 366 b 19 314 0 333 3 321 b 168 278 66 291 115 278 z',\n },\n csymParensLeftTall: {\n x_min: 0,\n x_max: 185,\n y_min: 0,\n y_max: 1034,\n ha: 1034,\n o: 'm 215 0 b 226 17 223 1 223 10 b 229 37 229 24 229 32 b 220 81 229 52 225 66 b 167 203 206 124 181 160 b 86 616 124 338 89 474 b 82 765 85 665 82 716 b 91 886 82 805 84 845 b 245 1319 120 1038 171 1184 b 266 1397 259 1346 266 1371 b 259 1443 266 1411 264 1427 b 226 1489 253 1463 248 1489 b 193 1454 212 1489 203 1467 b 114 1292 158 1404 140 1346 b 0 806 40 1138 0 978 b 3 721 0 779 0 750 b 1 677 1 707 1 693 b 36 418 1 593 16 504 b 144 96 62 307 95 199 b 196 12 158 66 179 39 b 212 0 200 7 204 0 z',\n },\n csymParensRightTall: {\n x_min: -40,\n x_max: 188.5411603861406,\n y_min: 0.20204102886728756,\n y_max: 1058,\n ha: 1057.7979589711326,\n o: 'm 30 1 b 63 14 42 -3 55 6 b 122 99 86 40 108 68 b 189 258 145 153 166 204 b 271 667 239 379 268 503 b 246 852 275 708 261 780 b 10 1495 197 1077 128 1295 b -14 1524 4 1505 1 1524 b -16 1522 -14 1524 -16 1524 b -46 1489 -33 1521 -43 1503 b -58 1417 -53 1464 -58 1440 b -36 1335 -58 1390 -52 1364 b 68 1138 0 1270 35 1204 b 163 883 108 1056 137 969 b 206 668 184 814 200 742 b 207 631 207 655 207 642 b 166 426 207 560 192 492 b 46 143 130 330 111 228 b 19 29 19 109 17 69 b 30 1 20 19 24 3 z',\n },\n csymBracketLeftTall: {\n x_min: 0,\n x_max: 328,\n y_min: 2,\n y_max: 807,\n ha: 805,\n o: 'm 68 3 b 76 4 71 3 73 3 b 186 13 112 12 150 13 b 240 13 204 13 222 13 l 287 13 b 379 17 317 13 348 13 b 472 121 435 24 472 69 b 467 156 472 132 469 144 b 446 174 462 168 456 174 l 439 174 b 327 166 402 167 364 166 b 265 167 307 166 285 167 l 209 167 b 187 475 199 269 189 372 b 166 985 186 645 187 815 l 377 1002 b 415 1001 389 1002 402 1001 b 456 1027 432 1001 448 1005 b 472 1096 467 1048 472 1073 b 464 1146 472 1113 469 1130 b 439 1162 459 1161 452 1162 b 40 1129 305 1151 173 1139 b 1 1093 17 1128 1 1120 b 0 1009 0 1064 0 1037 b 13 975 0 991 3 981 b 30 670 23 873 30 772 b 29 608 30 649 29 628 l 29 563 b 56 88 29 405 49 246 b 53 22 55 66 55 43 b 68 3 53 12 56 3 z',\n },\n csymBracketRightTall: {\n x_min: 0.8519422934604696,\n x_max: 306,\n y_min: -0.17180889215212544,\n y_max: 829.1037519824849,\n ha: 829.2755608746371,\n o: 'm 117 0 b 372 29 203 -3 287 20 l 373 29 b 406 32 383 30 395 30 b 436 60 428 33 432 43 b 441 109 439 76 441 92 b 433 200 441 140 436 170 b 409 696 422 366 409 530 b 416 887 409 763 416 831 b 415 920 416 899 415 910 l 415 1106 b 412 1135 415 1116 415 1126 l 412 1145 b 373 1189 413 1171 408 1192 b 321 1189 356 1189 338 1189 l 215 1189 l 215 1194 l 56 1194 b 6 1153 27 1195 10 1187 b 1 1064 3 1123 4 1093 b 22 1043 0 1050 6 1043 b 84 1044 42 1044 63 1044 b 264 1038 144 1044 203 1040 b 265 958 264 1011 265 985 b 262 845 265 920 264 883 b 259 710 259 801 259 755 b 279 243 259 554 271 399 b 285 170 281 219 284 194 b 95 151 222 161 158 156 b 29 81 27 147 27 147 l 29 73 b 105 0 33 0 33 0 z',\n },\n csymParensLeftVeryTall: {\n x_min: 0,\n x_max: 116,\n y_min: 0,\n y_max: 934.1531437146923,\n ha: 934.1531437146923,\n o: 'm 128 0 b 147 17 137 0 144 9 b 167 102 160 45 167 73 b 158 154 167 120 164 137 b 117 307 141 204 130 256 b 63 698 84 435 71 567 b 62 788 62 729 62 757 b 69 916 62 829 63 873 b 109 1172 81 1001 94 1087 b 132 1320 118 1221 137 1269 b 124 1345 131 1329 134 1342 b 96 1332 114 1346 102 1341 b 71 1269 82 1313 75 1292 b 39 1104 59 1214 48 1159 b 0 742 19 988 0 871 b 10 559 3 688 6 624 b 58 226 16 446 33 336 b 112 20 73 157 94 89 b 128 0 115 13 118 0 z',\n },\n csymParensRightVeryTall: {\n x_min: -20,\n x_max: 111.4332498248095,\n y_min: -0.07657185734616112,\n y_max: 1009,\n ha: 1009.0765718573462,\n o: 'm -3 0 b 20 22 9 -1 14 12 b 36 56 26 33 32 45 b 99 274 58 128 84 199 b 160 788 135 439 163 605 b 122 1181 164 912 145 1047 b 50 1431 108 1267 86 1351 b 36 1453 48 1439 46 1453 l 35 1453 l 30 1453 b 7 1423 17 1449 7 1440 b 27 1287 9 1377 10 1331 b 96 963 71 1184 85 1074 b 105 818 102 914 105 867 b 91 624 105 753 99 688 b -4 213 72 484 48 344 b -29 101 -19 174 -29 138 b -16 27 -29 76 -24 52 b -3 0 -13 17 -14 3 z',\n },\n csymDiagonalArrangementSlash: {\n x_min: -0.19862981551275186,\n x_max: 990,\n y_min: -26.946823529189132,\n y_max: 1027.5514326488437,\n ha: 1054.4982561780328,\n o: 'm 14 -37 b 58 -9 35 -45 46 -22 b 392 333 170 105 279 217 l 765 711 b 1372 1329 968 916 1168 1125 b 1424 1439 1403 1359 1417 1397 b 1426 1457 1424 1444 1426 1450 b 1416 1477 1426 1466 1423 1475 b 1374 1462 1400 1485 1385 1473 b 1181 1269 1309 1397 1246 1331 b 736 831 1031 1122 884 979 b 356 452 609 704 485 576 b 32 132 246 347 143 236 b 0 50 7 109 1 84 b 6 9 -1 37 3 23 b 14 -37 10 -9 0 -32 z',\n },\n accidentalNarrowReversedFlat: {\n x_min: 0,\n x_max: 208,\n y_min: -231,\n y_max: 449,\n ha: 680,\n o: 'm 272 -333 b 284 -320 278 -333 281 -328 b 300 -174 297 -272 300 -222 b 275 190 298 -52 279 68 b 268 445 272 275 268 360 l 268 490 b 264 612 269 530 265 572 b 236 647 264 632 252 645 l 235 647 b 217 618 220 647 220 628 b 207 526 210 588 207 556 b 210 432 207 494 210 464 b 216 268 213 377 215 323 l 216 230 l 215 232 b 154 256 194 240 174 251 b 111 264 138 261 124 264 b 3 153 50 264 10 223 b 0 94 0 132 0 114 b 194 -276 0 -63 68 -186 b 255 -323 215 -291 236 -307 b 272 -333 262 -330 268 -333 z m 233 -138 b 71 30 168 -92 105 -45 b 63 59 65 42 63 50 b 96 95 62 75 73 86 b 130 102 108 99 120 102 b 215 76 160 102 187 88 l 220 73 b 225 -22 220 42 222 10 b 233 -138 229 -62 230 -101 z',\n },\n accidentalNarrowReversedFlatAndFlat: {\n x_min: 0,\n x_max: 335,\n y_min: -231,\n y_max: 449,\n ha: 680,\n o: 'm 151 490 b 148 612 151 530 150 572 b 132 647 148 632 141 645 b 122 618 124 647 124 628 b 117 526 118 588 117 556 b 118 432 117 494 118 464 b 121 268 120 377 121 323 l 121 232 b 86 256 109 240 98 251 b 62 264 78 261 69 264 b 1 153 29 264 6 223 b 0 94 0 132 0 114 b 109 -276 0 -63 37 -186 b 144 -323 121 -291 132 -307 b 153 -333 147 -330 151 -333 b 160 -320 157 -333 158 -328 b 168 -174 167 -272 168 -222 b 154 190 168 -52 157 68 b 151 445 153 275 151 360 z m 480 153 b 372 264 472 223 432 264 b 328 256 359 264 344 261 b 268 232 308 251 288 240 l 266 230 l 266 268 b 272 432 266 323 269 377 b 275 526 272 464 275 494 b 265 618 275 556 272 588 b 248 647 262 628 262 647 l 246 647 b 219 612 230 645 219 632 b 215 490 217 572 213 530 l 215 445 b 207 190 215 360 210 275 b 183 -174 203 68 183 -52 b 199 -320 183 -222 186 -272 b 210 -333 202 -328 204 -333 b 228 -323 215 -333 220 -330 b 288 -276 246 -307 268 -291 b 482 94 415 -186 482 -63 b 480 153 482 114 482 132 z m 40 30 b 36 59 36 42 36 50 b 55 95 35 75 42 86 b 73 102 60 99 68 102 b 121 76 89 102 105 88 l 124 73 b 127 -22 124 42 125 10 l 131 -138 b 40 30 95 -92 60 -43 z m 419 59 b 412 30 419 50 418 42 b 249 -138 374 -43 314 -92 b 258 -22 252 -101 253 -62 b 262 73 261 10 262 42 l 268 76 b 353 102 295 88 323 102 b 386 95 363 102 374 99 b 419 59 409 86 420 75 z',\n },\n accidentalWilsonPlus: {\n x_min: 0,\n x_max: 298,\n y_min: -218,\n y_max: 218,\n ha: 436,\n o: 'm 232 -314 b 236 -301 236 -310 236 -305 l 236 -295 b 243 -52 239 -213 242 -132 l 369 62 b 429 200 413 101 425 147 b 416 243 429 216 428 236 b 383 225 406 251 393 232 l 377 220 b 246 98 336 177 291 138 b 249 242 248 145 246 193 b 225 304 251 265 242 287 b 209 314 220 308 215 314 b 204 312 207 314 206 312 b 196 292 196 310 196 300 b 193 184 194 256 194 220 b 187 48 192 140 190 94 b 46 -72 141 7 94 -32 b 0 -163 13 -98 0 -127 b 1 -187 0 -170 0 -179 b 10 -235 4 -203 6 -219 b 20 -255 12 -242 14 -251 b 36 -245 26 -259 30 -249 b 181 -109 85 -200 132 -154 b 176 -258 180 -158 176 -209 b 232 -314 176 -298 186 -307 z',\n },\n accidentalWilsonMinus: {\n x_min: 0,\n x_max: 284.2093390143919,\n y_min: -163,\n y_max: 163,\n ha: 326,\n o: 'm 386 -232 b 409 -163 415 -222 408 -180 b 382 -69 410 -120 408 -89 b 32 228 264 30 141 118 b 17 235 26 233 22 235 b 3 219 9 235 3 228 b 0 157 3 199 0 179 b 29 69 0 125 6 95 b 323 -194 115 -29 222 -111 b 374 -235 338 -206 353 -235 b 386 -232 377 -235 382 -233 z',\n },\n },\n fontFamily: 'Petaluma',\n resolution: 1000,\n generatedOn: '2021-12-06T21:04:23.441Z',\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { PetalumaFont } from '../src/fonts/petaluma_glyphs';\nimport { PetalumaMetrics } from '../src/fonts/petaluma_metrics';\nexport const Font = {\n data: PetalumaFont,\n metrics: PetalumaMetrics,\n};\nexport default Font;\n","/**\n * The Petaluma font was created by Steinberg Media.\n * https://github.com/steinbergmedia/petaluma\n */\nexport const PetalumaMetrics = {\n name: 'Petaluma',\n smufl: true,\n stave: {\n padding: 15,\n endPaddingMax: 15,\n endPaddingMin: 7,\n unalignedNotePadding: 12,\n },\n accidental: {\n noteheadAccidentalPadding: 1,\n leftPadding: 2,\n accidentalSpacing: 3,\n },\n clef: {\n default: {\n point: 32,\n width: 26,\n },\n small: {\n point: 26,\n width: 20,\n },\n annotations: {\n '8va': {\n smuflCode: 'timeSig8',\n default: {\n point: 18,\n treble: {\n line: -1.4,\n shiftX: 12,\n },\n },\n small: {\n point: 16,\n treble: {\n line: -0.2,\n shiftX: 8,\n },\n },\n },\n '8vb': {\n smuflCode: 'timeSig8',\n default: {\n point: 18,\n treble: {\n line: 6,\n shiftX: 10,\n },\n bass: {\n line: 3.5,\n shiftX: 1,\n },\n },\n small: {\n point: 16,\n treble: {\n line: 5.3,\n shiftX: 6,\n },\n bass: {\n line: 3.1,\n shiftX: 0.5,\n },\n },\n },\n },\n // These may no longer be necessary\n lineCount: {\n '8': { point: 55, shiftY: 14 },\n '7': { point: 47, shiftY: 8 },\n '6': { point: 32, shiftY: 1 },\n '5': { point: 30, shiftY: -6 },\n '4': { point: 23, shiftY: -12 },\n },\n },\n parenthesis: {\n default: {\n point: 39,\n width: 7,\n },\n gracenote: {\n point: (39 * 3) / 5,\n width: 3,\n },\n },\n pedalMarking: {\n up: {\n point: 40,\n },\n down: {\n point: 34,\n },\n },\n // These are for numeric digits, such as in time signatures\n digits: {\n // used by timesig\n shiftLine: -1,\n point: 22,\n // used by tuplets\n tupletPoint: 16,\n shiftY: -2,\n },\n articulation: {\n articStaccatissimoAbove: {\n padding: 2,\n },\n articStaccatissimoBelow: {\n padding: 2,\n },\n },\n tremolo: {\n default: {\n point: 25,\n spacing: 5,\n offsetYStemUp: -5,\n offsetYStemDown: 5,\n offsetXStemUp: 13,\n offsetXStemDown: 1,\n },\n grace: {\n point: 18,\n spacing: 4,\n offsetYStemUp: -5,\n offsetYStemDown: 5,\n offsetXStemUp: 8,\n offsetXStemDown: 1,\n },\n },\n staveRepetition: {\n default: {\n offsetY: 25,\n offsetSymbol: 12,\n spacing: 5,\n },\n },\n noteHead: {\n displaced: {\n shiftX: -2,\n },\n },\n stem: {\n heightAdjustmentForFlag: -3,\n // These are stem (Y) offsets to the note heads. To shift the\n // noteheads (x-position) themselves, see glyphs.notehead.custom.\n noteHead: {\n noteheadTriangleUpHalf: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpBlack: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpWhole: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadXHalf: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXBlack: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXWhole: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadHalf: {\n offsetYBaseStemDown: 1.8,\n offsetYBaseStemUp: -1.8,\n },\n noteheadBlack: {\n offsetYBaseStemDown: 2,\n offsetYBaseStemUp: -2,\n },\n noteheadSquareWhite: {\n offsetYBaseStemDown: -5,\n offsetYBaseStemUp: 5,\n },\n },\n },\n // Values under here are used by the Glyph class to reposition and rescale\n // glyphs based on their category. This should be the first stop for\n // custom font glyph repositioning.\n //\n // The glyph loader first looks up a specific set of settings based on the\n // glyph code, and if not found, uses the defaults from the category. See\n // glyphs.textNote for an example of this.\n //\n // Details in Glyph.lookupFontMetrics.\n glyphs: {\n coda: {\n point: 20,\n shiftX: -7,\n shiftY: 8,\n },\n segno: {\n shiftX: -7,\n },\n flag: {\n shiftX: -0.77,\n flag16thUp: {\n shiftX: -0.75,\n },\n flag32ndUp: {\n shiftX: -0.85,\n },\n flag64thUp: {\n shiftX: -1.55,\n },\n flag128thUp: {\n shiftX: -1.3,\n },\n flag16thDown: {\n shiftX: -0.75,\n },\n flag32ndDown: {\n shiftX: -0.76,\n },\n flag64thDown: {\n shiftX: -1.5,\n },\n flag128thDown: {\n shiftX: -1.2,\n },\n tabStem: {\n shiftX: -1.75,\n },\n staveTempo: {\n shiftX: -1,\n },\n },\n clef: {\n gClef: {\n default: { scale: 1.1, shiftY: 1 },\n small: { shiftY: 1.5 },\n },\n fClef: {\n default: { shiftY: -0.5 },\n },\n },\n ornament: {\n ornamentTurn: {\n scale: 1.2,\n },\n ornamentTurnSlash: {\n scale: 1.2,\n },\n },\n stringNumber: {\n verticalPadding: 8,\n stemPadding: 2,\n leftPadding: 5,\n rightPadding: 6,\n },\n stroke: {\n arrowheadBlackDown: {\n straight: {\n shiftX: -4.5,\n },\n wiggly: {\n shiftX: -1,\n shiftY: 1,\n },\n },\n arrowheadBlackUp: {\n straight: {\n shiftX: -0.85,\n },\n wiggly: {\n shiftX: -1,\n shiftY: 1,\n },\n },\n },\n textNote: {\n point: 34,\n breathMarkTick: {\n point: 36,\n shiftY: 9,\n },\n breathMarkComma: {\n point: 36,\n },\n segno: {\n point: 30,\n shiftX: -7,\n shiftY: 8,\n },\n coda: {\n point: 20,\n shiftX: -7,\n shiftY: 8,\n },\n ornamentTrill: {\n shiftX: -10,\n shiftY: 8,\n },\n ornamentMordent: {\n shiftX: -8,\n },\n ornamentShortTrill: {\n shiftX: -8,\n },\n },\n noteHead: {\n minPadding: 2,\n standard: {\n noteheadBlackStemUp: {\n shiftX: 0.5,\n },\n noteheadHalfStemUp: {\n shiftX: 0.725,\n },\n noteheadWholeStemUp: {\n shiftX: 1,\n },\n },\n custom: {\n noteheadCircleXStemUp: {\n shiftX: -1,\n },\n noteheadCircleXStemDown: {\n shiftX: 0.25,\n },\n noteheadDiamondHalfStemUp: {\n shiftX: 1.5,\n },\n noteheadDiamondBlackStemUp: {\n shiftX: 1.5,\n },\n noteheadDiamondWholeStemUp: {\n shiftX: 1,\n },\n noteheadXBlackStemUp: {\n shiftX: 1,\n },\n noteheadXHalfStemUp: {\n shiftX: -3,\n },\n noteheadXHalfStemDown: {\n shiftX: 1,\n },\n noteheadXWholeStemUp: {\n shiftX: -7,\n },\n noteheadXWholeStemDown: {\n shiftX: 1,\n },\n noteheadSquareWhiteStemDown: {\n shiftX: 0.25,\n },\n noteheadSquareWhiteStemUp: {\n shiftX: -0.75,\n },\n noteheadSquareBlackStemUp: {\n shiftX: -0.75,\n },\n noteheadTriangleUpWholeStemUp: {\n shiftX: -0.75,\n },\n },\n },\n chordSymbol: {\n global: {\n superscriptOffset: -400,\n subscriptOffset: 300,\n kerningOffset: -150,\n lowerKerningText: ['D', 'F', 'P', 'T', 'V', 'Y'],\n upperKerningText: ['L'],\n spacing: 20,\n superSubRatio: 0.73,\n },\n csymDiminished: {\n scale: 0.8,\n leftSideBearing: -95,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymHalfDiminished: {\n scale: 0.8,\n leftSideBearing: -32,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymAugmented: {\n scale: 1,\n leftSideBearing: -25,\n advanceWidth: 530,\n yOffset: 0,\n },\n csymParensLeftTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 155,\n yOffset: 150,\n },\n csymParensRightTall: {\n scale: 0.8,\n leftSideBearing: 40,\n advanceWidth: 189,\n yOffset: 150,\n },\n csymBracketLeftTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 328,\n yOffset: 0,\n },\n csymBracketRightTall: {\n scale: 0.8,\n leftSideBearing: 1,\n advanceWidth: 600,\n yOffset: 0,\n },\n csymParensLeftVeryTall: {\n scale: 0.95,\n leftSideBearing: 0,\n advanceWidth: 210,\n yOffset: 250,\n },\n csymParensRightVeryTall: {\n scale: 0.9,\n leftSideBearing: -100,\n advanceWidth: 111,\n yOffset: 250,\n },\n csymDiagonalArrangementSlash: {\n scale: 0.6,\n leftSideBearing: -1,\n advanceWidth: 990,\n yOffset: 0,\n },\n csymMinor: {\n scale: 0.7,\n leftSideBearing: 0,\n advanceWidth: 482,\n yOffset: 0,\n },\n csymMajorSeventh: {\n scale: 0.8,\n leftSideBearing: 100,\n yOffset: 0,\n advanceWidth: 600,\n },\n accidentalSharp: {\n scale: 0.7,\n leftSideBearing: 0,\n advanceWidth: 425,\n yOffset: -422,\n },\n accidentalFlat: {\n scale: 0.8,\n leftSideBearing: -10,\n advanceWidth: 228,\n yOffset: -284,\n },\n },\n jazzOrnaments: {\n brassScoop: {\n scale: 1.0,\n xOffset: -12,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 10,\n },\n brassDoitMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassFallLipShort: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassLiftMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 5,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassFallRoughMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 26,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassBend: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -8,\n stemUpYOffset: 28,\n reportedWidth: 5,\n },\n brassMuteClosed: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -8,\n stemUpYOffset: 26,\n reportedWidth: 5,\n },\n brassMuteOpen: {\n scale: 1.0,\n xOffset: 4,\n yOffset: -8,\n stemUpYOffset: 27,\n reportedWidth: 5,\n },\n brassFlip: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassJazzTurn: {\n scale: 1.0,\n xOffset: 6,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassSmear: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n },\n tuplet: {\n noteHeadOffset: 20,\n stemOffset: 10,\n bottomLine: 4,\n topModifierOffset: 20,\n },\n },\n};\n"],"names":["root","factory","exports","module","define","amd","window","globalThis","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","data","glyphs","bracketTop","x_min","x_max","y_min","y_max","ha","bracketBottom","barlineTick","breathMarkTick","segno","coda","gClef","cClef","fClef","unpitchedPercussionClef1","timeSig0","timeSig1","timeSig2","timeSig3","timeSig4","timeSig5","timeSig6","timeSig7","timeSig8","timeSig9","timeSigCommon","timeSigCutCommon","timeSigPlus","timeSigPlusSmall","timeSigMinus","timeSigParensRight","timeSigParensRightSmall","timeSigParensLeft","timeSigParensLeftSmall","noteheadDoubleWhole","noteheadWhole","noteheadHalf","noteheadBlack","noteheadXWhole","noteheadXHalf","noteheadXBlack","noteheadCircleX","noteheadTriangleUpWhole","noteheadTriangleUpHalf","noteheadTriangleUpBlack","noteheadDiamondWhole","noteheadDiamondHalf","noteheadDiamondBlack","noteheadSquareWhite","noteheadSquareBlack","noteheadParenthesis","noteheadParenthesisRight","noteheadParenthesisLeft","augmentationDot","tremolo1","flag8thUp","flag8thDown","flag16thUp","flag16thDown","flag32ndUp","flag32ndDown","flag64thUp","flag64thDown","flag128thUp","flag128thDown","accidentalFlat","accidentalNatural","accidentalSharp","accidentalDoubleSharp","accidentalDoubleFlat","accidentalParensLeft","accidentalParensRight","accidentalQuarterToneFlatStein","accidentalThreeQuarterTonesFlatZimmermann","accidentalQuarterToneSharpStein","accidentalThreeQuarterTonesSharpStein","accidentalBuyukMucennebFlat","accidentalBakiyeFlat","accidentalKomaSharp","accidentalKucukMucennebSharp","accidentalKoron","accidentalSori","articAccentAbove","articAccentBelow","articTenutoAbove","articTenutoBelow","articStaccatoAbove","articStaccatoBelow","articStaccatissimoAbove","articStaccatissimoBelow","articMarcatoAbove","articMarcatoBelow","fermataAbove","fermataBelow","breathMarkComma","breathMarkUpbow","caesura","caesuraCurved","restMaxima","restDoubleWhole","restWhole","restHalf","restQuarter","rest8th","rest16th","rest32nd","rest64th","rest128th","dynamicPiano","dynamicMezzo","dynamicForte","dynamicRinforzando","dynamicSforzando","dynamicZ","ornamentTrill","ornamentTurn","ornamentTurnSlash","ornamentMordent","ornamentShortTrill","ornamentTremblement","ornamentPrecompAppoggTrill","ornamentPrecompSlideTrillDAnglebert","ornamentPrecompSlideTrillBach","ornamentPrecompTrillSuffixDandrieu","ornamentPrecompDoubleCadenceUpperPrefix","ornamentPrecompDoubleCadenceUpperPrefixTurn","ornamentPrecompTrillLowerSuffix","brassScoop","brassDoitMedium","brassFallLipShort","brassLiftMedium","brassFallRoughMedium","brassBend","brassMuteClosed","brassMuteOpen","brassFlip","brassJazzTurn","brassSmear","stringsDownBow","stringsUpBow","stringsHarmonic","pluckedSnapPizzicatoAbove","pluckedSnapPizzicatoBelow","pluckedLeftHandPizzicato","keyboardPedalPed","keyboardPedalUp","pictChokeCymbal","wiggleArpeggiatoUp","arpeggiatoUp","arpeggiatoDown","repeat1Bar","repeat2Bars","repeat4Bars","repeatBarSlash","csymDiminished","csymHalfDiminished","csymAugmented","csymMajorSeventh","csymMinor","csymParensLeftTall","csymParensRightTall","csymBracketLeftTall","csymBracketRightTall","csymParensLeftVeryTall","csymParensRightVeryTall","csymDiagonalArrangementSlash","accidentalNarrowReversedFlat","accidentalNarrowReversedFlatAndFlat","accidentalWilsonPlus","accidentalWilsonMinus","fontFamily","resolution","generatedOn","metrics","name","smufl","stave","padding","endPaddingMax","endPaddingMin","unalignedNotePadding","accidental","noteheadAccidentalPadding","leftPadding","accidentalSpacing","clef","default","point","width","small","annotations","smuflCode","treble","line","shiftX","bass","lineCount","shiftY","parenthesis","gracenote","pedalMarking","up","down","digits","shiftLine","tupletPoint","articulation","tremolo","spacing","offsetYStemUp","offsetYStemDown","offsetXStemUp","offsetXStemDown","grace","staveRepetition","offsetY","offsetSymbol","noteHead","displaced","stem","heightAdjustmentForFlag","offsetYBaseStemUp","offsetYBaseStemDown","flag","tabStem","staveTempo","scale","ornament","stringNumber","verticalPadding","stemPadding","rightPadding","stroke","arrowheadBlackDown","straight","wiggly","arrowheadBlackUp","textNote","minPadding","standard","noteheadBlackStemUp","noteheadHalfStemUp","noteheadWholeStemUp","custom","noteheadCircleXStemUp","noteheadCircleXStemDown","noteheadDiamondHalfStemUp","noteheadDiamondBlackStemUp","noteheadDiamondWholeStemUp","noteheadXBlackStemUp","noteheadXHalfStemUp","noteheadXHalfStemDown","noteheadXWholeStemUp","noteheadXWholeStemDown","noteheadSquareWhiteStemDown","noteheadSquareWhiteStemUp","noteheadSquareBlackStemUp","noteheadTriangleUpWholeStemUp","chordSymbol","global","superscriptOffset","subscriptOffset","kerningOffset","lowerKerningText","upperKerningText","superSubRatio","leftSideBearing","advanceWidth","yOffset","jazzOrnaments","xOffset","stemUpYOffset","reportedWidth","tuplet","noteHeadOffset","stemOffset","bottomLine","topModifierOffset"],"sourceRoot":""} \ No newline at end of file diff --git a/build/cjs/vexflow-gonville.js b/build/cjs/vexflow-gonville.js new file mode 100644 index 0000000000..a6c3e8520b --- /dev/null +++ b/build/cjs/vexflow-gonville.js @@ -0,0 +1,7 @@ +/*! + * VexFlow 4.0.1-alpha.2 2022-02-02T09:30:30.784Z 0df10df6d1fab3a99f5aa306341a31c6e686d659 + * Copyright (c) 2010 Mohit Muthanna Cheppudira + * https://www.vexflow.com https://github.com/0xfe/vexflow + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.Vex=e():t.Vex=e()}("undefined"!=typeof window?window:"undefined"!=typeof globalThis?globalThis:this,(function(){return(()=>{"use strict";var t={d:(e,i)=>{for(var s in i)t.o(i,s)&&!t.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:i[s]})}};t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),t.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var e={};function i(t,e,i=!0){if("object"!=typeof t||null===t)return!1;let s=t.constructor;if(i){for(;null!==t;){if(s=t.constructor,"CATEGORY"in s&&s.CATEGORY===e)return!0;t=Object.getPrototypeOf(t)}return!1}return"CATEGORY"in s&&s.CATEGORY===e}t.d(e,{default:()=>Di});const s=t=>i(t,l.Barline),n=t=>i(t,l.GraceNote),a=t=>i(t,l.Note),o=t=>i(t,l.StaveNote),r=t=>i(t,l.StemmableNote),h=t=>i(t,l.TabNote);var l;!function(t){t.Accidental="Accidental",t.Annotation="Annotation",t.Articulation="Articulation",t.Barline="Barline",t.BarNote="BarNote",t.Beam="Beam",t.Bend="Bend",t.ChordSymbol="ChordSymbol",t.Clef="Clef",t.ClefNote="ClefNote",t.Crescendo="Crescendo",t.Curve="Curve",t.Dot="Dot",t.Element="Element",t.Fraction="Fraction",t.FretHandFinger="FretHandFinger",t.GhostNote="GhostNote",t.Glyph="Glyph",t.GlyphNote="GlyphNote",t.GraceNote="GraceNote",t.GraceNoteGroup="GraceNoteGroup",t.GraceTabNote="GraceTabNote",t.KeySignature="KeySignature",t.KeySigNote="KeySigNote",t.Modifier="Modifier",t.MultiMeasureRest="MultiMeasureRest",t.Note="Note",t.NoteHead="NoteHead",t.NoteSubGroup="NoteSubGroup",t.Ornament="Ornament",t.Parenthesis="Parenthesis",t.PedalMarking="PedalMarking",t.RenderContext="RenderContext",t.RepeatNote="RepeatNote",t.Repetition="Repetition",t.Stave="Stave",t.StaveConnector="StaveConnector",t.StaveHairpin="StaveHairpin",t.StaveLine="StaveLine",t.StaveModifier="StaveModifier",t.StaveNote="StaveNote",t.StaveSection="StaveSection",t.StaveTempo="StaveTempo",t.StaveText="StaveText",t.StaveTie="StaveTie",t.Stem="Stem",t.StemmableNote="StemmableNote",t.StringNumber="StringNumber",t.Stroke="Stroke",t.System="System",t.TabNote="TabNote",t.TabSlide="TabSlide",t.TabStave="TabStave",t.TabTie="TabTie",t.TextBracket="TextBracket",t.TextDynamics="TextDynamics",t.TextNote="TextNote",t.Tickable="Tickable",t.TimeSignature="TimeSignature",t.TimeSigNote="TimeSigNote",t.Tremolo="Tremolo",t.Tuplet="Tuplet",t.Vibrato="Vibrato",t.VibratoBracket="VibratoBracket",t.Voice="Voice",t.Volta="Volta"}(l||(l={}));class c extends Error{constructor(t,e=""){super("[RuntimeError] "+t+": "+e),this.code=t}}function d(){return"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==t.g?t.g:Function("return this")()}function b(t,e="undefined",i=""){if(void 0===t)throw new c(e,i);return t}function g(t,...e){if(!e)return;const i=Array.prototype.slice.call(e).join(" ");d().console.log(t+": "+i)}function m(...t){const e=t.join(" "),i=new Error;d().console.log("Warning: ",e,i.stack)}function u(t,e){let i=e+(t-e)/2;var s,n;return i%2>0&&(i=((s=10*i)%(n=5)>=n/2?parseInt(""+s/n,10)*n+n:parseInt(""+s/n,10)*n)/10),i}function p(t){return`vf-${t}`}function f(t){return(t%=2*Math.PI)<0&&(t+=2*Math.PI),t}class _{constructor(t,e){this.numerator=1,this.denominator=1,this.set(t,e)}static get CATEGORY(){return l.Fraction}static GCD(t,e){if("number"!=typeof t||Number.isNaN(t)||"number"!=typeof e||Number.isNaN(e))throw new c("BadArgument",`Invalid numbers: ${t}, ${e}`);let i;for(;0!==e;)i=e,e=t%e,t=i;return t}static LCM(t,e){return t*e/_.GCD(t,e)}static LCMM(t){return 0===t.length?0:1===t.length?t[0]:2===t.length?_.LCM(t[0],t[1]):_.LCM(t.shift(),_.LCMM(t))}set(t=1,e=1){return this.numerator=t,this.denominator=e,this}value(){return this.numerator/this.denominator}simplify(){let t=this.numerator,e=this.denominator;const i=_.GCD(t,e);return t/=i,e/=i,e<0&&(e=-e,t=-t),this.set(t,e)}add(t=0,e=1){const[i,s]=x(t,e),n=_.LCM(this.denominator,s),a=n/this.denominator,o=n/s,r=this.numerator*a+i*o;return this.set(r,n)}subtract(t=0,e=1){const[i,s]=x(t,e),n=_.LCM(this.denominator,s),a=n/this.denominator,o=n/s,r=this.numerator*a-i*o;return this.set(r,n)}multiply(t=1,e=1){const[i,s]=x(t,e);return this.set(this.numerator*i,this.denominator*s)}divide(t=1,e=1){const[i,s]=x(t,e);return this.set(this.numerator*s,this.denominator*i)}equals(t){const e=_.__staticFractionA.copy(t).simplify(),i=_.__staticFractionB.copy(this).simplify();return e.numerator===i.numerator&&e.denominator===i.denominator}greaterThan(t){const e=_.__staticFractionB.copy(this);return e.subtract(t),e.numerator>0}greaterThanEquals(t){const e=_.__staticFractionB.copy(this);return e.subtract(t),e.numerator>=0}lessThan(t){return!this.greaterThanEquals(t)}lessThanEquals(t){return!this.greaterThan(t)}clone(){return new _(this.numerator,this.denominator)}copy(t){return"number"==typeof t?this.set(t,1):this.set(t.numerator,t.denominator)}quotient(){return Math.floor(this.numerator/this.denominator)}remainder(){return this.numerator%this.denominator}makeAbs(){return this.denominator=Math.abs(this.denominator),this.numerator=Math.abs(this.numerator),this}toString(){return`${this.numerator}/${this.denominator}`}toSimplifiedString(){return _.__staticFractionTmp.copy(this).simplify().toString()}toMixedString(){let t="";const e=this.quotient(),i=_.__staticFractionTmp.copy(this);return e<0&&i.makeAbs(),0!==e?(t+=e,0!==i.numerator&&(t+=` ${i.toSimplifiedString()}`)):t=0===i.numerator?"0":i.toSimplifiedString(),t}parse(t){const e=t.split("/"),i=parseInt(e[0],10),s=e[1]?parseInt(e[1],10):1;return this.set(i,s)}}function x(t,e=1){return"number"==typeof t?[t,e]:[t.numerator,t.denominator]}_.__staticFractionA=new _,_.__staticFractionB=new _,_.__staticFractionTmp=new _;class S{constructor(t,e,i,s){this.x=t,this.y=e,this.w=i,this.h=s}static copy(t){return new S(t.x,t.y,t.w,t.h)}getX(){return this.x}getY(){return this.y}getW(){return this.w}getH(){return this.h}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setW(t){return this.w=t,this}setH(t){return this.h=t,this}move(t,e){return this.x+=t,this.y+=e,this}clone(){return S.copy(this)}mergeWith(t){const e=t,i=this.xthis.x2)&&(this.x2=t),(isNaN(this.y1)||ethis.y2)&&(this.y2=e)}addX(t){this.addPoint(t,this.y1)}addY(t){this.addPoint(this.x1,t)}addQuadraticCurve(t,e,i,s,n,a){this.addPoint(t,e),this.addPoint(n,a);const o=i-t;let r=o-(n-i);if(0!=r){const e=o/r;if(e>0&&e<1){const s=1-e;this.addX(s*s*t+2*s*e*i+e*e*n)}}const h=s-e;if(r=h-(a-s),0!=r){const t=h/r;if(t>0&&t<1){const i=1-t;this.addY(i*i*e+2*i*t*s+t*t*a)}}}addBezierCurve(t,e,i,s,n,a,o,r){const h=[t,e],l=[i,s],c=[n,a],d=[o,r];let b;this.addPoint(h[0],h[1]),this.addPoint(d[0],d[1]);const g=(t,e)=>Math.pow(1-t,3)*h[e]+3*Math.pow(1-t,2)*t*l[e]+3*(1-t)*Math.pow(t,2)*c[e]+Math.pow(t,3)*d[e];for(b=0;b<=1;b++){const t=6*h[b]-12*l[b]+6*c[b],e=-3*h[b]+9*l[b]-9*c[b]+3*d[b],i=3*l[b]-3*h[b];if(0===e){if(0===t)continue;const e=-i/t;0=600;{const e=parseInt(t,10);return isNaN(e)?"bold"===t.toLowerCase():e>=600}}return!1}static isItalic(t){return!!t&&t.toLowerCase()===w.ITALIC}static loadWebFont(t,e,i=!0){return v(this,void 0,void 0,(function*(){const s=new FontFace(t,(i?`url(${e}2) format('woff2'), `:"")+`url(${e}) format('woff')`);return yield s.load(),document.fonts.add(s),s}))}static loadWebFonts(){return v(this,void 0,void 0,(function*(){const t=k.WEB_FONT_HOST,e=k.WEB_FONT_FILES;for(const i in e){const s=e[i];k.loadWebFont(i,t+s)}}))}static loadTextFonts(){}static load(t,e,i){let s=C[t];return s||(s=new k(t),C[t]=s),e&&s.setData(e),i&&s.setMetrics(i),s}getName(){return this.name}getData(){return b(this.data,"FontError","Missing font data")}getMetrics(){return b(this.metrics,"FontError","Missing metrics")}setData(t){this.data=t}setMetrics(t){this.metrics=t}hasData(){return void 0!==this.data}getResolution(){return this.getData().resolution}getGlyphs(){return this.getData().glyphs}lookupMetric(t,e){const i=t.split(".");let s=this.getMetrics();for(let t=0;tt[e]))}}return[]}getElementsByType(t){return this.getElementsByAttribute("type",t)}getElementsByClass(t){return this.getElementsByAttribute("class",t)}onUpdate(t){return["id","type","class"].includes(t.name)&&this.updateIndex(t),this}}class A{constructor(){var t;this.attrs={id:A.newID(),el:void 0,type:this.getCategory(),classes:{}},this.rendered=!1,null===(t=N.getDefaultRegistry())||void 0===t||t.register(this)}static get CATEGORY(){return l.Element}static newID(){return"auto"+A.ID++}getCategory(){return this.constructor.CATEGORY}setStyle(t){return this.style=t,this}getStyle(){return this.style}applyStyle(t=this.context,e=this.getStyle()){return e&&t?(t.save(),e.shadowColor&&t.setShadowColor(e.shadowColor),e.shadowBlur&&t.setShadowBlur(e.shadowBlur),e.fillStyle&&t.setFillStyle(e.fillStyle),e.strokeStyle&&t.setStrokeStyle(e.strokeStyle),e.lineWidth&&t.setLineWidth(e.lineWidth),this):this}restoreStyle(t=this.context,e=this.getStyle()){return e&&t?(t.restore(),this):this}drawWithStyle(){this.checkContext(),this.applyStyle(),this.draw(),this.restoreStyle()}hasClass(t){return!0===this.attrs.classes[t]}addClass(t){var e;return this.attrs.classes[t]=!0,null===(e=this.registry)||void 0===e||e.onUpdate({id:this.attrs.id,name:"class",value:t,oldValue:void 0}),this}removeClass(t){var e;return delete this.attrs.classes[t],null===(e=this.registry)||void 0===e||e.onUpdate({id:this.attrs.id,name:"class",value:void 0,oldValue:t}),this}onRegister(t){return this.registry=t,this}isRendered(){return this.rendered}setRendered(t=!0){return this.rendered=t,this}getAttributes(){return this.attrs}getAttribute(t){return this.attrs[t]}setAttribute(t,e){var i;const s=this.attrs.id,n=this.attrs[t];return this.attrs[t]=e,null===(i=this.registry)||void 0===i||i.onUpdate({id:s,name:t,value:e,oldValue:n}),this}getBoundingBox(){return this.boundingBox}getContext(){return this.context}setContext(t){return this.context=t,this}checkContext(){return b(this.context,"NoContext","No rendering context attached to instance.")}set font(t){this.setFont(t)}get font(){return k.toCSSString(this.textFont)}setFont(t,e,i,s){const n=this.constructor.TEXT_FONT,a="object"==typeof t,o="string"==typeof t,r=void 0===t,h=void 0===e&&void 0===i&&void 0===s;return this.textFont=a?Object.assign(Object.assign({},n),t):o&&h?k.fromCSSString(t):r&&h?Object.assign({},n):k.validate(null!=t?t:n.family,null!=e?e:n.size,null!=i?i:n.weight,null!=s?s:n.style),this}getFont(){return this.textFont||this.resetFont(),k.toCSSString(this.textFont)}resetFont(){this.setFont()}get fontInfo(){return this.textFont||this.resetFont(),Object.assign({},this.textFont)}set fontInfo(t){this.setFont(t)}setFontSize(t){const e=this.fontInfo;return this.setFont(e.family,t,e.weight,e.style),this}getFontSize(){return this.fontSize}set fontSize(t){this.setFontSize(t)}get fontSize(){let t=this.fontInfo.size;return"number"==typeof t&&(t=`${t}pt`),t}get fontSizeInPoints(){return k.convertSizeToPointValue(this.fontSize)}get fontSizeInPixels(){return k.convertSizeToPixelValue(this.fontSize)}get fontStyle(){return this.fontInfo.style}set fontStyle(t){const e=this.fontInfo;this.setFont(e.family,e.size,e.weight,t)}get fontWeight(){return this.fontInfo.weight+""}set fontWeight(t){const e=this.fontInfo;this.setFont(e.family,e.size,t,e.style)}}var P,F;A.ID=1e3,A.TEXT_FONT={family:k.SANS_SERIF,size:k.SIZE,weight:T.NORMAL,style:w.NORMAL},function(t){t[t.MOVE=0]="MOVE",t[t.LINE=1]="LINE",t[t.QUADRATIC=2]="QUADRATIC",t[t.BEZIER=3]="BEZIER"}(P||(P={}));class B{constructor(t,e,i){this.point=-1,this.metrics=R.loadMetrics(t,e,i),this.bbox=R.getOutlineBoundingBox(this.metrics.outline,this.metrics.scale,this.metrics.x_shift,this.metrics.y_shift),i&&(this.point=R.lookupFontMetric(this.metrics.font,i,e,"point",-1))}}class M{constructor(t,e,i,s){this.outline=t,this.originX=e,this.originY=i,this.scale=s,this.i=0}done(){return this.i>=this.outline.length}next(){return this.outline[this.i++]}nextX(){return this.originX+this.outline[this.i++]*this.scale}nextY(){return this.originY-this.outline[this.i++]*this.scale}static parse(t){const e=[],i=t.split(" ");let s=0;for(;s{const e=t.getTickContext();n&&t.setStave(n),e.setXOffset(a)}))}}class L{static get NUM_TONES(){return this.canonical_notes.length}static get roots(){return["c","d","e","f","g","a","b"]}static get root_values(){return[0,2,4,5,7,9,11]}static get root_indices(){return{c:0,d:1,e:2,f:3,g:4,a:5,b:6}}static get canonical_notes(){return["c","c#","d","d#","e","f","f#","g","g#","a","a#","b"]}static get diatonic_intervals(){return["unison","m2","M2","m3","M3","p4","dim5","p5","m6","M6","b7","M7","octave"]}static get diatonic_accidentals(){return{unison:{note:0,accidental:0},m2:{note:1,accidental:-1},M2:{note:1,accidental:0},m3:{note:2,accidental:-1},M3:{note:2,accidental:0},p4:{note:3,accidental:0},dim5:{note:4,accidental:-1},p5:{note:4,accidental:0},m6:{note:5,accidental:-1},M6:{note:5,accidental:0},b7:{note:6,accidental:-1},M7:{note:6,accidental:0},octave:{note:7,accidental:0}}}static get intervals(){return{u:0,unison:0,m2:1,b2:1,min2:1,S:1,H:1,2:2,M2:2,maj2:2,T:2,W:2,m3:3,b3:3,min3:3,M3:4,3:4,maj3:4,4:5,p4:5,"#4":6,b5:6,aug4:6,dim5:6,5:7,p5:7,"#5":8,b6:8,aug5:8,6:9,M6:9,maj6:9,b7:10,m7:10,min7:10,dom7:10,M7:11,maj7:11,8:12,octave:12}}static get scales(){return{major:[2,2,1,2,2,2,1],minor:[2,1,2,2,1,2,2],ionian:[2,2,1,2,2,2,1],dorian:[2,1,2,2,2,1,2],phyrgian:[1,2,2,2,1,2,2],lydian:[2,2,2,1,2,2,1],mixolydian:[2,2,1,2,2,1,2],aeolian:[2,1,2,2,1,2,2],locrian:[1,2,2,1,2,2,2]}}static get scaleTypes(){return{M:L.scales.major,m:L.scales.minor}}static get accidentals(){return["bb","b","n","#","##"]}static get noteValues(){return{c:{root_index:0,int_val:0},cn:{root_index:0,int_val:0},"c#":{root_index:0,int_val:1},"c##":{root_index:0,int_val:2},cb:{root_index:0,int_val:11},cbb:{root_index:0,int_val:10},d:{root_index:1,int_val:2},dn:{root_index:1,int_val:2},"d#":{root_index:1,int_val:3},"d##":{root_index:1,int_val:4},db:{root_index:1,int_val:1},dbb:{root_index:1,int_val:0},e:{root_index:2,int_val:4},en:{root_index:2,int_val:4},"e#":{root_index:2,int_val:5},"e##":{root_index:2,int_val:6},eb:{root_index:2,int_val:3},ebb:{root_index:2,int_val:2},f:{root_index:3,int_val:5},fn:{root_index:3,int_val:5},"f#":{root_index:3,int_val:6},"f##":{root_index:3,int_val:7},fb:{root_index:3,int_val:4},fbb:{root_index:3,int_val:3},g:{root_index:4,int_val:7},gn:{root_index:4,int_val:7},"g#":{root_index:4,int_val:8},"g##":{root_index:4,int_val:9},gb:{root_index:4,int_val:6},gbb:{root_index:4,int_val:5},a:{root_index:5,int_val:9},an:{root_index:5,int_val:9},"a#":{root_index:5,int_val:10},"a##":{root_index:5,int_val:11},ab:{root_index:5,int_val:8},abb:{root_index:5,int_val:7},b:{root_index:6,int_val:11},bn:{root_index:6,int_val:11},"b#":{root_index:6,int_val:0},"b##":{root_index:6,int_val:1},bb:{root_index:6,int_val:10},bbb:{root_index:6,int_val:9}}}isValidNoteValue(t){return t>=0&&t=0&&t3)throw new c("BadArguments","Invalid note name: "+t);const e=t.toLowerCase(),i=/^([cdefgab])(b|bb|n|#|##)?$/.exec(e);if(null!==i){return{root:i[1],accidental:i[2]}}throw new c("BadArguments","Invalid note name: "+t)}getKeyParts(t){if(!t||t.length<1)throw new c("BadArguments","Invalid key: "+t);const e=t.toLowerCase(),i=/^([cdefgab])(b|#)?(mel|harm|m|M)?$/.exec(e);if(null!==i){const t=i[1],e=i[2];let s=i[3];return s||(s="M"),{root:t,accidental:e,type:s}}throw new c("BadArguments",`Invalid key: ${t}`)}getNoteValue(t){const e=L.noteValues[t];if(void 0===e)throw new c("BadArguments",`Invalid note name: ${t}`);return e.int_val}getIntervalValue(t){const e=L.intervals[t];if(void 0===e)throw new c("BadArguments",`Invalid interval name: ${t}`);return e}getCanonicalNoteName(t){if(!this.isValidNoteValue(t))throw new c("BadArguments",`Invalid note value: ${t}`);return L.canonical_notes[t]}getCanonicalIntervalName(t){if(!this.isValidIntervalValue(t))throw new c("BadArguments",`Invalid interval value: ${t}`);return L.diatonic_intervals[t]}getRelativeNoteValue(t,e,i=1){if(1!==i&&-1!==i)throw new c("BadArguments",`Invalid direction: ${i}`);let s=(t+i*e)%L.NUM_TONES;return s<0&&(s+=L.NUM_TONES),s}getRelativeNoteName(t,e){const i=this.getNoteParts(t),s=this.getNoteValue(i.root);let n=e-s;if(Math.abs(n)>L.NUM_TONES-3){let i=1;n>0&&(i=-1);const a=(e+1+(s+1))%L.NUM_TONES*i;if(Math.abs(a)>2)throw new c("BadArguments",`Notes not related: ${t}, ${e})`);n=a}if(Math.abs(n)>2)throw new c("BadArguments",`Notes not related: ${t}, ${e})`);let a=i.root;if(n>0)for(let t=1;t<=n;++t)a+="#";else if(n<0)for(let t=-1;t>=n;--t)a+="b";return a}getScaleTones(t,e){const i=[t];let s=t;for(let n=0;n":{aboveCode:"articAccentAbove",belowCode:"articAccentBelow",between_lines:!0},"a-":{aboveCode:"articTenutoAbove",belowCode:"articTenutoBelow",between_lines:!0},"a^":{aboveCode:"articMarcatoAbove",belowCode:"articMarcatoBelow",between_lines:!1},"a+":{code:"pluckedLeftHandPizzicato",between_lines:!1},ao:{aboveCode:"pluckedSnapPizzicatoAbove",belowCode:"pluckedSnapPizzicatoBelow",between_lines:!1},ah:{code:"stringsHarmonic",between_lines:!1},"a@":{aboveCode:"fermataAbove",belowCode:"fermataBelow",between_lines:!1},"a@a":{code:"fermataAbove",between_lines:!1},"a@u":{code:"fermataBelow",between_lines:!1},"a|":{code:"stringsUpBow",between_lines:!1},am:{code:"stringsDownBow",between_lines:!1},"a,":{code:"pictChokeCymbal",between_lines:!1}},z={mordent:{code:"ornamentShortTrill"},mordent_inverted:{code:"ornamentMordent"},turn:{code:"ornamentTurn"},turn_inverted:{code:"ornamentTurnSlash"},tr:{code:"ornamentTrill"},upprall:{code:"ornamentPrecompSlideTrillDAnglebert"},downprall:{code:"ornamentPrecompDoubleCadenceUpperPrefix"},prallup:{code:"ornamentPrecompTrillSuffixDandrieu"},pralldown:{code:"ornamentPrecompTrillLowerSuffix"},upmordent:{code:"ornamentPrecompSlideTrillBach"},downmordent:{code:"ornamentPrecompDoubleCadenceUpperPrefixTurn"},lineprall:{code:"ornamentPrecompAppoggTrill"},prallprall:{code:"ornamentTremblement"},scoop:{code:"brassScoop"},doit:{code:"brassDoitMedium"},fall:{code:"brassFallLipShort"},doitLong:{code:"brassLiftMedium"},fallLong:{code:"brassFallRoughMedium"},bend:{code:"brassBend"},plungerClosed:{code:"brassMuteClosed"},plungerOpen:{code:"brassMuteOpen"},flip:{code:"brassFlip"},jazzTurn:{code:"brassJazzTurn"},smear:{code:"brassSmear"}};class K{static currentMusicFont(){if(0===K.MUSIC_FONT_STACK.length)throw new c("NoFonts","The font stack is empty. See: await Flow.fetchMusicFont(...); Flow.setMusicFont(...).");return K.MUSIC_FONT_STACK[0]}static clefProperties(t){if(!t||!(t in Y))throw new c("BadArgument","Invalid clef: "+t);return Y[t]}static keyProperties(t,e="treble",i){let s={octave_shift:0};"object"==typeof i&&(s=Object.assign(Object.assign({},s),i));const n=t.split("/");if(n.length<2)throw new c("BadArguments",`First argument must be note/octave or note/octave/glyph-code: ${t}`);const a=n[0].toUpperCase(),o=H[a];if(!o)throw new c("BadArguments","Invalid key name: "+a);o.octave&&(n[1]=o.octave.toString());let r=parseInt(n[1],10);r+=-1*s.octave_shift;let h=(7*r-28+o.index)/2;h+=K.clefProperties(e).line_shift;let l=0;h<=0&&2*h%2==0&&(l=1),h>=6&&2*h%2==0&&(l=-1);const d=void 0!==o.int_val?12*r+o.int_val:void 0,b=o.code,g=o.shift_right;let m={};if(n.length>2&&n[2]){const t=n[2].toUpperCase();m=j[t]||{}}return Object.assign({key:a,octave:r,line:h,int_value:d,accidental:o.accidental,code:b,stroke:l,shift_right:g,displaced:!1},m)}static integerToNote(t){if(void 0===t||t<0||t>11)throw new c("BadArguments",`integerToNote() requires an integer in the range [0, 11]: ${t}`);const e={0:"C",1:"C#",2:"D",3:"D#",4:"E",5:"F",6:"F#",7:"G",8:"G#",9:"A",10:"A#",11:"B"}[t];if(!e)throw new c("BadArguments",`Unknown note value for integer: ${t}`);return e}static tabToGlyph(t,e=1){let i,s=0,n=0;if("X"===t.toUpperCase()){const t=new R("accidentalDoubleSharp",K.TABLATURE_FONT_SCALE).getMetrics();if(i="accidentalDoubleSharp",null==t.width||null==t.height)throw new c("InvalidMetrics","Width and height required");s=t.width,n=-t.height/2}else s=K.textWidth(t);return{text:t,code:i,getWidth:()=>s*e,shift_y:n}}static textWidth(t){return 7*t.toString().length}static articulationCodes(t){return V[t]}static accidentalCodes(t){return X[t]}static ornamentCodes(t){return z[t]}static keySignature(t){const e=G[t];if(!e)throw new c("BadKeySignature",`Bad key signature spec: '${t}'`);if(!e.acc)return[];const i={b:[2,.5,2.5,1,3,1.5,3.5],"#":[0,1.5,-.5,1,2.5,.5,2]}[e.acc],s=[];for(let t=0;tR.getWidth(n,t)}),s)}}K.STEM_WIDTH=1.5,K.STEM_HEIGHT=35,K.STAVE_LINE_THICKNESS=1,K.RESOLUTION=I,K.MUSIC_FONT_STACK=[],K.NOTATION_FONT_SCALE=39,K.TABLATURE_FONT_SCALE=39,K.SLASH_NOTEHEAD_WIDTH=15,K.STAVE_LINE_DISTANCE=10,K.TEXT_HEIGHT_OFFSET_HACK=1,K.accidentalMap=X,K.accidentalColumnsTable={1:{a:[1],b:[1]},2:{a:[1,2]},3:{a:[1,3,2],b:[1,2,1],second_on_bottom:[1,2,3]},4:{a:[1,3,4,2],b:[1,2,3,1],spaced_out_tetrachord:[1,2,1,2]},5:{a:[1,3,5,4,2],b:[1,2,4,3,1],spaced_out_pentachord:[1,2,3,2,1],very_spaced_out_pentachord:[1,2,1,2,1]},6:{a:[1,3,5,6,4,2],b:[1,2,4,5,3,1],spaced_out_hexachord:[1,3,2,1,3,2],very_spaced_out_hexachord:[1,2,1,2,1,2]}},K.unicode={sharp:String.fromCharCode(9839),flat:String.fromCharCode(9837),natural:String.fromCharCode(9838),triangle:String.fromCharCode(9651),"o-with-slash":String.fromCharCode(248),degrees:String.fromCharCode(176),circle:String.fromCharCode(9675)},K.validTypes={n:{name:"note"},r:{name:"rest"},h:{name:"harmonic"},m:{name:"muted"},s:{name:"slash"},g:{name:"ghost"}},K.TIME4_4={num_beats:4,beat_value:4,resolution:I};const $={"1/2":{common:{stem:!1,stem_offset:0,flag:!1,dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadDoubleWhole"},h:{code_head:"unpitchedPercussionClef1"},m:{code_head:"vexNoteHeadMutedBreve",stem_offset:0},r:{code_head:"restDoubleWhole",rest:!0,position:"B/5",dot_shiftY:.5},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadDoubleWhole"}}},1:{common:{stem:!1,stem_offset:0,flag:!1,dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadWhole"},h:{code_head:"noteheadDiamondWhole"},m:{code_head:"noteheadXWhole",stem_offset:-3},r:{code_head:"restWhole",rest:!0,position:"D/5",dot_shiftY:.5},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadWhole"}}},2:{common:{stem:!0,stem_offset:0,flag:!1,dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadHalf"},h:{code_head:"noteheadDiamondHalf"},m:{code_head:"noteheadXHalf",stem_offset:-3},r:{code_head:"restHalf",stem:!1,rest:!0,position:"B/4",dot_shiftY:-.5},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadHalf"}}},4:{common:{stem:!0,stem_offset:0,flag:!1,dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"restQuarter",stem:!1,rest:!0,position:"B/4",dot_shiftY:-.5,line_above:1.5,line_below:1.5},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}},8:{common:{stem:!0,stem_offset:0,flag:!0,beam_count:1,stem_beam_extension:0,code_flag_upstem:"flag8thUp",code_flag_downstem:"flag8thDown",dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"rest8th",stem:!1,flag:!1,rest:!0,position:"B/4",dot_shiftY:-.5,line_above:1,line_below:1},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}},16:{common:{beam_count:2,stem_beam_extension:0,stem:!0,stem_offset:0,flag:!0,code_flag_upstem:"flag16thUp",code_flag_downstem:"flag16thDown",dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"rest16th",stem:!1,flag:!1,rest:!0,position:"B/4",dot_shiftY:-.5,line_above:1,line_below:2},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}},32:{common:{beam_count:3,stem_beam_extension:7.5,stem:!0,stem_offset:0,flag:!0,code_flag_upstem:"flag32ndUp",code_flag_downstem:"flag32ndDown",dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"rest32nd",stem:!1,flag:!1,rest:!0,position:"B/4",dot_shiftY:-1.5,line_above:2,line_below:2},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}},64:{common:{beam_count:4,stem_beam_extension:15,stem:!0,stem_offset:0,flag:!0,code_flag_upstem:"flag64thUp",code_flag_downstem:"flag64thDown",dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"rest64th",stem:!1,flag:!1,rest:!0,position:"B/4",dot_shiftY:-1.5,line_above:2,line_below:3},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}},128:{common:{beam_count:5,stem_beam_extension:22.5,stem:!0,stem_offset:0,flag:!0,code_flag_upstem:"flag128thUp",code_flag_downstem:"flag128thDown",dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"rest128th",stem:!1,flag:!1,rest:!0,position:"B/4",dot_shiftY:-2.5,line_above:3,line_below:3},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}}};function q(...t){J.DEBUG&&g("Vex.Flow.Accidental",t)}class J extends O{constructor(t){super(),q("New accidental: ",t),this.type=t,this.position=O.Position.LEFT,this.render_options={font_scale:38,parenLeftPadding:2,parenRightPadding:2},this.accidental=K.accidentalCodes(this.type),b(this.accidental,"ArgumentError",`Unknown accidental type: ${t}`),this.cautionary=!1,this.reset()}static get CATEGORY(){return l.Accidental}static format(t,e){if(!t||0===t.length)return;const i=K.currentMusicFont(),s=i.lookupMetric("accidental.noteheadAccidentalPadding"),n=e.left_shift+s,a=i.lookupMetric("accidental.accidentalSpacing"),o=i.lookupMetric("accidental.leftPadding"),r=[];let h,l=0;for(let e=0;ee.line-t.line));const c=[];let d,b=0;for(let t=0;tb?e.shift:b,d=e.line}let g=0;for(let t=0;tc[i+t],a=t=>t.map(n),o=(t,e)=>{const[i,s]=a([t,e]).map((t=>t.line));return i-s},r=(...t)=>t.map(a).every((([t,e])=>!this.checkCollision(t,e))),h=s-i+1;let l,d,b=this.checkCollision(c[i],c[s])?"a":"b";switch(h){case 3:"a"===b&&.5===o(1,2)&&.5!==o(0,1)&&(b="second_on_bottom");break;case 4:r([0,2],[1,3])&&(b="spaced_out_tetrachord");break;case 5:"b"===b&&r([1,3])&&(b="spaced_out_pentachord",r([0,2],[2,4])&&(b="very_spaced_out_pentachord"));break;case 6:r([0,3],[1,4],[2,5])&&(b="spaced_out_hexachord"),r([0,2],[2,4],[1,3],[3,5])&&(b="very_spaced_out_hexachord")}if(h>=7){let e=2,i=!0;for(;!0===i;){i=!1;for(let t=0;t+ed?g:d}else for(l=t;l<=s;l++)d=K.accidentalColumnsTable[h][b][l-t],c[l].column=d,g=g>d?g:d;t=s}const m=[],u=[];for(let t=0;t<=g;t++)m[t]=0,u[t]=0;m[0]=b+n,u[0]=b+n,c.forEach((t=>{t.width>m[t.column]&&(m[t.column]=t.width)}));for(let t=1;t{let e=0;const i=f+t.numAcc;for(;f0?(s=e.flatLine||e.dblSharpLine?2.5:3,t.dblSharpLine&&(i-=.5)):(s=t.flatLine||t.dblSharpLine?2.5:3,e.dblSharpLine&&(i-=.5));const n=Math.abs(i){const e=new _(0,1);t.getTickables().forEach((t=>{if(t.shouldIgnoreTicks())return;const i=n[e.value()];i?i.push(t):(s.push(e.value()),n[e.value()]=[t]),e.add(t.getTicks())}))}));const a=new L;e||(e="C");const r=a.createScaleMap(e),h={};s.forEach((t=>{const e=n[t],s=[],c=t=>{if(!o(t)||t.isRest()||t.shouldIgnoreTicks())return;const e=t;e.keys.forEach(((t,n)=>{const o=a.getNoteParts(t.split("/")[0]),c=t.split("/")[1],d=o.accidental||"n",b=o.root+d;h[o.root+c]||(h[o.root+c]=r[o.root]);const g=h[o.root+c]===b,m=s.indexOf(t)>-1;if(e.getModifiers().forEach(((t,s)=>{i(t,l.Accidental)&&t.type==d&&t.getIndex()==n&&e.getModifiers().splice(s,1)})),!g||g&&m){h[o.root+c]=b;const i=new J(d);e.addModifier(i,n),s.push(t)}})),e.getModifiers().forEach((t=>{i(t,l.GraceNoteGroup)&&t.getGraceNotes().forEach(c)}))};e.forEach(c)}))}reset(){const t=this.render_options.font_scale;this.glyph=new R(this.accidental.code,t),this.glyph.setOriginX(1),this.cautionary&&(this.parenLeft=new R(K.accidentalCodes("{").code,t),this.parenRight=new R(K.accidentalCodes("}").code,t),this.parenLeft.setOriginX(1),this.parenRight.setOriginX(1))}getWidth(){if(this.cautionary){const t=b(this.parenLeft),e=b(this.parenRight),i=t.getMetrics().width+e.getMetrics().width+this.render_options.parenLeftPadding+this.render_options.parenRightPadding;return this.glyph.getMetrics().width+i}return this.glyph.getMetrics().width}setNote(t){return b(t,"ArgumentError",`Bad note value: ${t}`),this.note=t,n(t)&&(this.render_options.font_scale=25,this.reset()),this}setAsCautionary(){return this.cautionary=!0,this.render_options.font_scale=28,this.reset(),this}draw(){const{type:t,position:e,index:i,cautionary:s,x_shift:n,y_shift:a,glyph:o,render_options:{parenLeftPadding:r,parenRightPadding:h}}=this,l=this.checkContext(),c=this.checkAttachedNote();this.setRendered();const d=c.getModifierStartXY(e,i);let g=d.x+n;const m=d.y+a;if(q("Rendering: ",t,g,m),s){const t=b(this.parenLeft),e=b(this.parenRight);e.render(l,g,m),g-=e.getMetrics().width,g-=h,g-=this.accidental.parenRightPaddingAdjustment,o.render(l,g,m),g-=o.getMetrics().width,g-=r,t.render(l,g,m)}else o.render(l,g,m)}}J.DEBUG=!1;class Q extends A{constructor(t){super(),this.stem_up_y_offset=0,this.stem_down_y_offset=0,this.stem_up_y_base_offset=0,this.stem_down_y_base_offset=0,this.x_begin=(null==t?void 0:t.x_begin)||0,this.x_end=(null==t?void 0:t.x_end)||0,this.y_top=(null==t?void 0:t.y_top)||0,this.y_bottom=(null==t?void 0:t.y_bottom)||0,this.stem_extension=(null==t?void 0:t.stem_extension)||0,this.stem_direction=(null==t?void 0:t.stem_direction)||0,this.hide=(null==t?void 0:t.hide)||!1,this.isStemlet=(null==t?void 0:t.isStemlet)||!1,this.stemletHeight=(null==t?void 0:t.stemletHeight)||0,this.renderHeightAdjustment=0,this.setOptions(t)}static get CATEGORY(){return l.Stem}static get UP(){return 1}static get DOWN(){return-1}static get WIDTH(){return K.STEM_WIDTH}static get HEIGHT(){return K.STEM_HEIGHT}setOptions(t){this.stem_up_y_offset=(null==t?void 0:t.stem_up_y_offset)||0,this.stem_down_y_offset=(null==t?void 0:t.stem_down_y_offset)||0,this.stem_up_y_base_offset=(null==t?void 0:t.stem_up_y_base_offset)||0,this.stem_down_y_base_offset=(null==t?void 0:t.stem_down_y_base_offset)||0}setNoteHeadXBounds(t,e){return this.x_begin=t,this.x_end=e,this}setDirection(t){this.stem_direction=t}setExtension(t){this.stem_extension=t}getExtension(){return this.stem_extension}setYBounds(t,e){this.y_top=t,this.y_bottom=e}getHeight(){const t=this.stem_direction===Q.UP?this.stem_up_y_offset:this.stem_down_y_offset;return(this.y_bottom-this.y_top+(Q.HEIGHT-t+this.stem_extension))*this.stem_direction}getBoundingBox(){throw new c("NotImplemented","getBoundingBox() not implemented.")}getExtents(){const t=this.stem_direction===Q.UP,e=[this.y_top,this.y_bottom],i=Q.HEIGHT+this.stem_extension,s=(t?Math.min:Math.max)(...e),n=(t?Math.max:Math.min)(...e);return{topY:s+i*-this.stem_direction,baseY:n}}setVisibility(t){return this.hide=!t,this}setStemlet(t,e){return this.isStemlet=t,this.stemletHeight=e,this}adjustHeightForFlag(){this.renderHeightAdjustment=K.currentMusicFont().lookupMetric("stem.heightAdjustmentForFlag",-3)}adjustHeightForBeam(){this.renderHeightAdjustment=-Q.WIDTH/2}draw(){if(this.setRendered(),this.hide)return;const t=this.checkContext();let e,i;const s=this.stem_direction;let n=0;s===Q.DOWN?(e=this.x_begin,i=this.y_top+this.stem_down_y_offset,n=this.stem_down_y_base_offset):(e=this.x_end,i=this.y_bottom-this.stem_up_y_offset,n=this.stem_up_y_base_offset);const a=this.getHeight();!function(...t){Q.DEBUG&&g("Vex.Flow.Stem",t)}("Rendering stem - ","Top Y: ",this.y_top,"Bottom Y: ",this.y_bottom);const o=this.isStemlet?a-this.stemletHeight*this.stem_direction:0;t.save(),this.applyStyle(t),t.beginPath(),t.setLineWidth(Q.WIDTH),t.moveTo(e,i-o+n),t.lineTo(e,i-a-this.renderHeightAdjustment*s),t.stroke(),this.restoreStyle(t),t.restore()}}function Z(...t){it.DEBUG&&g("Vex.Flow.TextFormatter",t)}Q.DEBUG=!1;const tt={},et={};class it{constructor(t){this.family="",this.size=14,this.resolution=1e3,this.glyphs={},this.serifs=!1,this.monospaced=!1,this.italic=!1,this.bold=!1,this.superscriptOffset=0,this.subscriptOffset=0,this.maxSizeGlyph="H",this.cacheKey="",this.updateParams(t)}static getFontFamilies(){const t=[];for(const e in et){const i=et[e];t.push(Object.assign({},i))}return t}static create(t={}){Z("create: ",t),t.family||(t.family=k.SANS_SERIF);const e=[],i=t.family.split(/\s*,\s*/);for(const t of i){for(const i in et)i.startsWith(t)&&e.push(et[i]);if(e.length>0)break}let s;if(0===e.length)s=new it(Object.values(et)[0]);else if(1===e.length)s=new it(e[0]);else{const i=k.isBold(t.weight),n=k.isItalic(t.style),a=e.find((t=>t.bold===i&&t.italic===n));if(a)s=new it(a);else{const t=e.find((t=>t.italic===n||t.bold===i));s=new it(t||e[0])}}const n=t.size;if(void 0!==n){const t=k.convertSizeToPointValue(n);s.setFontSize(t)}return s}static getInfo(t){return et[t]}static registerInfo(t,e=!1){Z("registerInfo: ",t,e);const i=t.family;(void 0===et[i]||e)&&(et[i]=t)}updateParams(t){t.family&&(this.family=t.family),t.resolution&&(this.resolution=t.resolution),t.glyphs&&(this.glyphs=t.glyphs),t.serifs&&(this.serifs=t.serifs),t.monospaced&&(this.monospaced=t.monospaced),t.italic&&(this.italic=t.italic),t.bold&&(this.bold=t.bold),t.maxSizeGlyph&&(this.maxSizeGlyph=t.maxSizeGlyph),t.superscriptOffset&&(this.superscriptOffset=t.superscriptOffset),t.subscriptOffset&&(this.subscriptOffset=t.subscriptOffset),this.updateCacheKey()}updateCacheKey(){const t=this.family.replace(/\s+/g,"_"),e=this.size,i=this.bold?T.BOLD:T.NORMAL,s=this.italic?w.ITALIC:w.NORMAL;this.cacheKey=`${t}%${e}%${i}%${s}`}getGlyphMetrics(t){return this.glyphs[t]?this.glyphs[t]:this.glyphs[this.maxSizeGlyph]}get maxHeight(){return this.getGlyphMetrics(this.maxSizeGlyph).ha/this.resolution*this.fontSizeInPixels}getWidthForCharacterInEm(t){var e;const i=this.getGlyphMetrics(t);if(i){return(null!==(e=i.advanceWidth)&&void 0!==e?e:0)/this.resolution}return.65}getWidthForTextInEm(t){const e=this.cacheKey;let i=tt[e];void 0===i&&(i={},tt[e]=i);let s=i[t];if(void 0===s){s=0;for(let e=0;et>e?t:e)),l+=(this.text_line+1)*K.STAVE_LINE_DISTANCE+r,b&&i===Q.DOWN&&(l=Math.max(l,c.topY+r+d*this.text_line))}else if(this.verticalJustification===nt.CENTER){const t=e.getYForTopText(this.text_line)-1;l=t+(m.getYForBottomText(this.text_line)-t)/2+r/2}else if(this.verticalJustification===nt.TOP)l=e.getYs()[0]-(this.text_line+1)*K.STAVE_LINE_DISTANCE,b&&i===Q.UP&&(d=c.topY=1}function ct(t,e){return lt(t,e)?e===ot?Math.ceil:Math.floor:Math.round}const dt=t=>o(t)||n(t);class bt extends O{constructor(t){super(),this.type=t,this.position=rt,this.render_options={font_scale:38},this.reset()}static get CATEGORY(){return l.Articulation}static format(t,e){if(!t||0===t.length)return!1;const i=(t,e,i)=>ht(ct(e,i),b(t.glyph.getMetrics().height)/10+.5);t.forEach((t=>{const s=t.checkAttachedNote();let n=5;const a=s.hasStem()?s.getStemDirection():Q.UP;let o=0;if(r(s)){const t=s.getStem();t&&(o=Math.abs(t.getHeight())/K.STAVE_LINE_DISTANCE)}const h=s.getStave();if(h&&(n=h.getNumLines()),t.getPosition()===ot){let r=s.getLineNumber(!0);a===Q.UP&&(r+=o);let h=i(t,e.top_text_line,ot);const l=r+e.top_text_line+.5;!t.articulation.between_lines&&lt.getWidth())).reduce(((t,e)=>Math.max(e,t)));return e.left_shift+=s/2,e.right_shift+=s/2,!0}static easyScoreHook({articulations:t},e,i){if(!t)return;const s={staccato:"a.",tenuto:"a-",accent:"a>"};t.split(",").map((t=>t.trim().split("."))).map((([t,e])=>{const n={type:s[t]};return e&&(n.position=O.PositionString[e]),i.getFactory().Articulation(n)})).map((t=>e.addModifier(t,0)))}reset(){this.articulation=K.articulationCodes(this.type);const t=b(this.articulation,"ArgumentError",`Articulation not found: ${this.type}`),e=(this.position===ot?t.aboveCode:t.belowCode)||t.code;this.glyph=new R(null!=e?e:"",this.render_options.font_scale),this.setWidth(b(this.glyph.getMetrics().width))}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=this.checkIndex(),{position:s,glyph:n,text_line:a}=this,o=this.articulation.between_lines,r=e.checkStave(),l=r.getSpacingBetweenLines(),d=h(e),{x:b}=e.getModifierStartXY(s,i),m=!o||d,u=function(t,e){const i=e===ot&&t.getStemDirection()===Q.UP||e===rt&&t.getStemDirection()===Q.DOWN;return dt(t)?t.hasStem()&&i?.5:1:t.hasStem()&&i?1:0}(e,s),p=K.currentMusicFont().lookupMetric(`articulation.${n.getCode()}.padding`,0);let f={[ot]:()=>{n.setOrigin(.5,1);const t=function(t,e){const i=t.getStemDirection(),{topY:s,baseY:n}=t.getStemExtents();if(dt(t))return t.hasStem()?i===Q.UP?s:n:Math.min(...t.getYs());if(h(t))return t.hasStem()&&i===Q.UP?s:t.checkStave().getYForTopText(e);throw new c("UnknownCategory","Only can get the top and bottom ys of stavenotes and tabnotes")}(e,a)-(a+u)*l;return m?Math.min(r.getYForTopText(bt.INITIAL_OFFSET),t):t},[rt]:()=>{n.setOrigin(.5,0);const t=function(t,e){const i=t.getStemDirection(),{topY:s,baseY:n}=t.getStemExtents();if(dt(t))return t.hasStem()?i===Q.UP?n:s:Math.max(...t.getYs());if(h(t))return t.hasStem()?i===Q.UP?t.checkStave().getYForBottomText(e):s:t.checkStave().getYForBottomText(e);throw new c("UnknownCategory","Only can get the top and bottom ys of stavenotes and tabnotes")}(e,a)+(a+u)*l;return m?Math.max(r.getYForBottomText(bt.INITIAL_OFFSET),t):t}}[s]();if(!d){const t=s===ot?-1:1,a=e.getKeyProps()[i].line,r=(e.getYs()[i]-f)/l+Number(a),h=function(t,e,i,s){const n=ht(ct(e,i),e);if(t&<(n,i)&&n%1==0)return n+.5*-s;return n}(o,r,s,t);lt(h,s)&&n.setOrigin(.5,.5),f+=Math.abs(h-r)*l*t+p*t}!function(...t){bt.DEBUG&&g("Vex.Flow.Articulation",t)}(`Rendering articulation at (x: ${b}, y: ${f})`),n.render(t,b,f)}}bt.DEBUG=!1,bt.INITIAL_OFFSET=-.5;class gt{static get CATEGORY(){return l.RenderContext}set font(t){this.setFont(t)}get font(){return this.getFont()}setRawFont(t){return this.setFont(t),this}}class mt extends A{constructor(){super(),this._preFormatted=!1,this._postFormatted=!1,this.ticks=new _(0,1),this.intrinsicTicks=0,this.tickMultiplier=new _(1,1),this.width=0,this.x_shift=0,this.modifiers=[],this.tupletStack=[],this.align_center=!1,this.center_x_shift=0,this.ignore_ticks=!1,this.formatterMetrics={freedom:{left:0,right:0},duration:"",iterations:0,space:{used:0,mean:0,deviation:0}}}static get CATEGORY(){return l.Tickable}reset(){return this}getTicks(){return this.ticks}shouldIgnoreTicks(){return this.ignore_ticks}setIgnoreTicks(t){return this.ignore_ticks=t,this}setWidth(t){this.width=t}getWidth(){if(!this._preFormatted)throw new c("UnformattedNote","Can't call GetWidth on an unformatted note.");return this.width+(this.modifierContext?this.modifierContext.getWidth():0)}setXShift(t){return this.x_shift=t,this}getXShift(){return this.x_shift}getX(){return this.checkTickContext("Can't getX() without a TickContext.").getX()+this.x_shift}getFormatterMetrics(){return this.formatterMetrics}getCenterXShift(){return this.isCenterAligned()?this.center_x_shift:0}setCenterXShift(t){return this.center_x_shift=t,this}isCenterAligned(){return this.align_center}setCenterAlignment(t){return this.align_center=t,this}getVoice(){return b(this.voice,"NoVoice","Tickable has no voice.")}setVoice(t){this.voice=t}getTuplet(){return this.tuplet}getTupletStack(){return this.tupletStack}resetTuplet(t){let e,i;if(t){const s=this.tupletStack.indexOf(t);return-1!==s&&(this.tupletStack.splice(s,1),e=t.getNoteCount(),i=t.getNotesOccupied(),this.applyTickMultiplier(e,i)),this}for(;this.tupletStack.length;)e=(t=this.tupletStack.pop()).getNoteCount(),i=t.getNotesOccupied(),this.applyTickMultiplier(e,i);return this}setTuplet(t){if(t){this.tupletStack.push(t);const e=t.getNoteCount(),i=t.getNotesOccupied();this.applyTickMultiplier(i,e)}return this.tuplet=t,this}addToModifierContext(t){this.modifierContext=t;for(let t=0;tK.getGlyphProps(this.duration,t))),this.playNote=void 0,this.ignore_ticks=!1,this.width=0,this.leftDisplacedHeadPx=0,this.rightDisplacedHeadPx=0,this.x_shift=0,this.ys=[],t.align_center&&this.setCenterAlignment(t.align_center),this.render_options={annotation_spacing:5,glyph_font_scale:1,stroke_px:1,scale:1,font:"",y_shift:0}}static get CATEGORY(){return l.Note}static plotMetrics(t,e,i){const s=e.getMetrics(),n=e.getAbsoluteX()-s.modLeftPx-s.leftDisplacedHeadPx,a=e.getAbsoluteX()-s.leftDisplacedHeadPx,o=e.getAbsoluteX(),r=e.getAbsoluteX()+s.notePx,h=e.getAbsoluteX()+s.notePx+s.rightDisplacedHeadPx,l=e.getAbsoluteX()+s.notePx+s.rightDisplacedHeadPx+s.modRightPx,c=l+(e.getFormatterMetrics().freedom.right||0),d=l-n;t.save(),t.setFont(k.SANS_SERIF,8),t.fillText(Math.round(d)+"px",n+e.getXShift(),i);const b=i+7;function g(i,s,n,a=b){t.beginPath(),t.setStrokeStyle(n),t.setFillStyle(n),t.setLineWidth(3),t.moveTo(i+e.getXShift(),a),t.lineTo(s+e.getXShift(),a),t.stroke()}g(n,a,"red"),g(a,o,"#999"),g(o,r,"green"),g(r,h,"#999"),g(h,l,"red"),g(l,c,"#DD0"),g(n-e.getXShift(),n,"#BBB"),function(t,e,i,s="#F55"){t.save(),t.setFillStyle(s),t.beginPath(),t.arc(e,i,3,0,2*Math.PI,!0),t.closePath(),t.fill(),t.restore()}(t,o+e.getXShift(),b,"blue");const m=e.getFormatterMetrics();if(m.iterations>0){const s=m.space.deviation,n=s>=0?"+":"";t.setFillStyle("red"),t.fillText(n+Math.round(s),o+e.getXShift(),i-10)}t.restore()}static parseDuration(t){if(!t)return;const e=/(\d*\/?\d+|[a-z])(d*)([nrhms]|$)/.exec(t);if(!e)return;return{duration:e[1],dots:e[2].length,type:e[3]||"n"}}static parseNoteStruct(t){const e=ut.parseDuration(t.duration);if(!e)return;let i=t.type;if(i&&!K.validTypes[i])return;const s=[];i||(i=e.type||"n",void 0!==t.keys&&t.keys.forEach(((t,e)=>{const n=t.split("/");s[e]=n&&3===n.length?n[2]:i})));let n=K.durationToTicks(e.duration);if(!n)return;const a=t.dots?t.dots:e.dots;if("number"!=typeof a)return;let o=n;for(let t=0;t0}hasStem(){return!1}getNoteType(){return this.noteType}getBeam(){return this.beam}checkBeam(){return b(this.beam,"NoBeam","No beam attached to instance")}hasBeam(){return null!=this.beam}setBeam(t){return this.beam=t,this}addModifier(t,e=0){const i="Note.addModifier(modifier: Modifier, index: number=0)";if("string"==typeof e&&(e=parseInt(e),console.warn(i+" expected a number for `index`, but received a string.")),"object"!=typeof t||"number"!=typeof e)throw new c("WrongParams","Incorrect call signature. Use "+i+" instead.");return t.setNote(this),t.setIndex(e),super.addModifier(t),this}getModifiersByType(t){return this.checkModifierContext().getMembers(t)}getModifierStartXY(t,e,i){if(!this.preFormatted)throw new c("UnformattedNote","Can't call GetModifierStartXY on an unformatted note");return{x:this.getAbsoluteX(),y:this.ys[0]}}getRightParenthesisPx(t){return this.getKeyProps()[t].displaced?this.getRightDisplacedHeadPx():0}getLeftParenthesisPx(t){return this.getKeyProps()[t].displaced?this.getLeftDisplacedHeadPx():0}getFirstDotPx(){let t=this.getRightDisplacedHeadPx();return 0!==this.checkModifierContext().getMembers("Parenthesis").length&&(t+=K.currentMusicFont().lookupMetric("parenthesis.default.width")),t}getMetrics(){if(!this.preFormatted)throw new c("UnformattedNote","Can't call getMetrics on an unformatted note.");const t=this.modifierContext?this.modifierContext.getState().left_shift:0,e=this.modifierContext?this.modifierContext.getState().right_shift:0,i=this.getWidth();return{width:i,glyphWidth:this.getGlyphWidth(),notePx:i-t-e-this.leftDisplacedHeadPx-this.rightDisplacedHeadPx,modLeftPx:t,modRightPx:e,leftDisplacedHeadPx:this.leftDisplacedHeadPx,rightDisplacedHeadPx:this.rightDisplacedHeadPx,glyphPx:0}}getAbsoluteX(){let t=this.checkTickContext("Can't getAbsoluteX() without a TickContext.").getX();return this.stave&&(t+=this.stave.getNoteStartX()+K.currentMusicFont().lookupMetric("stave.padding")),this.isCenterAligned()&&(t+=this.getCenterXShift()),t}getStemDirection(){throw new c("NoStem","No stem attached to this note.")}getStemExtents(){throw new c("NoStem","No stem attached to this note.")}getTieRightX(){let t=this.getAbsoluteX();return t+=this.glyph.getWidth()/2,t+=-this.width/2+this.width+2,t}getTieLeftX(){let t=this.getAbsoluteX();return t+=this.glyph.getWidth()/2,t-=this.width/2+2,t}getKeys(){return this.keys}getKeyProps(){return this.keyProps}}var pt,ft,_t,xt,St,yt,Tt;!function(t){t[t.CENTER=0]="CENTER",t[t.LEFT=1]="LEFT",t[t.RIGHT=2]="RIGHT",t[t.ABOVE=3]="ABOVE",t[t.BELOW=4]="BELOW",t[t.BEGIN=5]="BEGIN",t[t.END=6]="END"}(pt||(pt={}));class wt extends A{constructor(){super(),this.width=0,this.x=0,this.padding=10,this.position=pt.ABOVE}static get CATEGORY(){return l.StaveModifier}static get Position(){return pt}getPosition(){return this.position}setPosition(t){return this.position=t,this}getStave(){return this.stave}checkStave(){return b(this.stave,"NoStave","No stave attached to instance.")}setStave(t){return this.stave=t,this}getWidth(){return this.width}setWidth(t){return this.width=t,this}getX(){return this.x}setX(t){return this.x=t,this}placeGlyphOnLine(t,e,i,s=0){t.setYShift(e.getYForLine(null!=i?i:0)-e.getYForGlyphs()+s)}getPadding(t){return void 0!==t&&t<2?0:this.padding}setPadding(t){return this.padding=t,this}setLayoutMetrics(t){return this.layoutMetrics=t,this}getLayoutMetrics(){return this.layoutMetrics}draw(...t){}}!function(t){t[t.SINGLE=1]="SINGLE",t[t.DOUBLE=2]="DOUBLE",t[t.END=3]="END",t[t.REPEAT_BEGIN=4]="REPEAT_BEGIN",t[t.REPEAT_END=5]="REPEAT_END",t[t.REPEAT_BOTH=6]="REPEAT_BOTH",t[t.NONE=7]="NONE"}(ft||(ft={}));class vt extends wt{constructor(t){super(),this.thickness=K.STAVE_LINE_THICKNESS;const e=ft;this.widths={},this.widths[e.SINGLE]=5,this.widths[e.DOUBLE]=5,this.widths[e.END]=5,this.widths[e.REPEAT_BEGIN]=5,this.widths[e.REPEAT_END]=5,this.widths[e.REPEAT_BOTH]=5,this.widths[e.NONE]=5,this.paddings={},this.paddings[e.SINGLE]=0,this.paddings[e.DOUBLE]=0,this.paddings[e.END]=0,this.paddings[e.REPEAT_BEGIN]=15,this.paddings[e.REPEAT_END]=15,this.paddings[e.REPEAT_BOTH]=15,this.paddings[e.NONE]=0,this.layoutMetricsMap={},this.layoutMetricsMap[e.SINGLE]={xMin:0,xMax:1,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.DOUBLE]={xMin:-3,xMax:1,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.END]={xMin:-5,xMax:1,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.REPEAT_END]={xMin:-10,xMax:1,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.REPEAT_BEGIN]={xMin:-2,xMax:10,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.REPEAT_BOTH]={xMin:-10,xMax:10,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.NONE]={xMin:0,xMax:0,paddingLeft:5,paddingRight:5},this.setPosition(pt.BEGIN),this.setType(t)}static get CATEGORY(){return l.Barline}static get type(){return ft}static get typeString(){return{single:ft.SINGLE,double:ft.DOUBLE,end:ft.END,repeatBegin:ft.REPEAT_BEGIN,repeatEnd:ft.REPEAT_END,repeatBoth:ft.REPEAT_BOTH,none:ft.NONE}}getType(){return this.type}setType(t){return this.type="string"==typeof t?vt.typeString[t]:t,this.setWidth(this.widths[this.type]),this.setPadding(this.paddings[this.type]),this.setLayoutMetrics(this.layoutMetricsMap[this.type]),this}draw(t){switch(t.checkContext(),this.setRendered(),this.type){case ft.SINGLE:this.drawVerticalBar(t,this.x,!1);break;case ft.DOUBLE:this.drawVerticalBar(t,this.x,!0);break;case ft.END:this.drawVerticalEndBar(t,this.x);break;case ft.REPEAT_BEGIN:this.drawRepeatBar(t,this.x,!0),t.getX()!==this.x&&this.drawVerticalBar(t,t.getX());break;case ft.REPEAT_END:this.drawRepeatBar(t,this.x,!1);break;case ft.REPEAT_BOTH:this.drawRepeatBar(t,this.x,!1),this.drawRepeatBar(t,this.x,!0)}}drawVerticalBar(t,e,i){const s=t.checkContext(),n=t.getTopLineTopY(),a=t.getBottomLineBottomY();i&&s.fillRect(e-3,n,1,a-n),s.fillRect(e,n,1,a-n)}drawVerticalEndBar(t,e){const i=t.checkContext(),s=t.getTopLineTopY(),n=t.getBottomLineBottomY();i.fillRect(e-5,s,1,n-s),i.fillRect(e-2,s,3,n-s)}drawRepeatBar(t,e,i){const s=t.checkContext(),n=t.getTopLineTopY(),a=t.getBottomLineBottomY();let o=3;i||(o=-5),s.fillRect(e+o,n,1,a-n),s.fillRect(e-2,n,3,a-n);i?o+=4:o-=4;const r=e+o+1;let h=(t.getNumLines()-1)*t.getSpacingBetweenLines();h=h/2-t.getSpacingBetweenLines()/2;let l=n+h+1;s.beginPath(),s.arc(r,l,2,0,2*Math.PI,!1),s.fill(),l+=t.getSpacingBetweenLines(),s.beginPath(),s.arc(r,l,2,0,2*Math.PI,!1),s.fill()}}class Et extends ut{constructor(t=ft.SINGLE){super({duration:"b"}),this.metrics={widths:{}};const e=ft;this.metrics.widths={[e.SINGLE]:8,[e.DOUBLE]:12,[e.END]:15,[e.REPEAT_BEGIN]:14,[e.REPEAT_END]:14,[e.REPEAT_BOTH]:18,[e.NONE]:0},this.ignore_ticks=!0,this.setType(t)}static get CATEGORY(){return l.BarNote}getType(){return this.type}setType(t){return this.type="string"==typeof t?vt.typeString[t]:t,this.setWidth(this.metrics.widths[this.type]),this}addToModifierContext(t){return this}preFormat(){return this.preFormatted=!0,this}draw(){const t=this.checkContext();!function(...t){Et.DEBUG&&g("Vex.Flow.BarNote",t)}("Rendering bar line at: ",this.getAbsoluteX()),this.style&&this.applyStyle(t);const e=new vt(this.type);e.setX(this.getAbsoluteX()),e.draw(this.checkStave()),this.style&&this.restoreStyle(t),this.setRendered()}}Et.DEBUG=!1;class Ct extends O{constructor(t,e=!1,i){super(),this.text=t,this.x_shift=0,this.release=e,this.tap="",this.resetFont(),this.render_options={line_width:1.5,line_style:"#777777",bend_width:8,release_width:8},i?this.phrase=i:(this.phrase=[{type:Ct.UP,text:this.text}],this.release&&this.phrase.push({type:Ct.DOWN,text:""})),this.updateWidth()}static get CATEGORY(){return l.Bend}static get UP(){return 0}static get DOWN(){return 1}static format(t,e){if(!t||0===t.length)return!1;let i=0;for(let s=0;st{const a=t+s,o=i;e.save(),e.beginPath(),e.setLineWidth(this.render_options.line_width),e.setStrokeStyle(this.render_options.line_style),e.setFillStyle(this.render_options.line_style),e.moveTo(t,i),e.quadraticCurveTo(a,o,t+s,n),e.stroke(),e.restore()},d=(t,i,s,n)=>{e.save(),e.beginPath(),e.setLineWidth(this.render_options.line_width),e.setStrokeStyle(this.render_options.line_style),e.setFillStyle(this.render_options.line_style),e.moveTo(t,n),e.quadraticCurveTo(t+s,n,t+s,i),e.stroke(),e.restore()},b=(t,i,s)=>{const n=i+4*s;e.beginPath(),e.moveTo(t,i),e.lineTo(t-4,n),e.lineTo(t+4,n),e.closePath(),e.fill()},g=(t,i)=>{e.save(),e.setFont(this.textFont);const s=t-e.measureText(i).width/2;e.fillText(i,s,h),e.restore()};let m,u=0,p=0;if(null===(t=this.tap)||void 0===t?void 0:t.length){g(i.getModifierStartXY(O.Position.CENTER,this.index).x,this.tap)}for(let t=0;t0){const e=o.symbolBlocks[t-1];Dt.isSuperscript(e)||(n=s)}a&&n>0&&(c=!0,e.xShift=e.xShift+(n-s),s=n,n=0,o.setEnableKerning(!1)),i||a||(n=0),e.vAlign=c,s+=e.width}o.updateKerningAdjustments(),o.updateOverBarAdjustments(),o.getVertical()===xt.TOP?(o.setTextLine(e.top_text_line),e.top_text_line+=l):(o.setTextLine(e.text_line+1),e.text_line+=l+1),o.getReportWidth()?a.push(s):a.push(0)}return s=a.reduce(((t,e)=>t+e),0),e.left_shift+=s/2,e.right_shift+=s/2,!0}static get TEXT_FONT(){let t="Roboto Slab, Times, serif";return"Petaluma"===K.currentMusicFont().getName()&&(t="PetalumaScript, Arial, sans-serif"),{family:t,size:12,weight:T.NORMAL,style:w.NORMAL}}get superscriptOffset(){return Dt.superscriptOffset*this.textFormatter.fontSizeInPixels}get subscriptOffset(){return Dt.subscriptOffset*this.textFormatter.fontSizeInPixels}setReportWidth(t){return this.reportWidth=t,this}getReportWidth(){return this.reportWidth}updateOverBarAdjustments(){const t=this.symbolBlocks.findIndex((({symbolType:t,glyph:e})=>t===St.GLYPH&&void 0!==e&&"csymDiagonalArrangementSlash"===e.code));if(t<0)return;const e=this.symbolBlocks[t].width/4,i=.25*this.textFormatter.fontSizeInPixels;let s=0;for(;s0?this.symbolBlocks[t-1]:void 0;let s=0;e.symbolType===St.GLYPH&&void 0!==e.glyph&&e.glyph.code===Dt.glyphs.over.code&&(s+=e.glyph.metrics.x_shift),void 0!==i&&i.symbolType===St.GLYPH&&void 0!==i.glyph&&i.glyph.code===Dt.glyphs.over.code&&(s+=i.glyph.metrics.x_shift);let n=!1,a=!1;void 0!==i&&i.symbolType===St.TEXT&&(n=Dt.upperKerningText.some((t=>t===i.text[i.text.length-1])),a=Dt.lowerKerningText.some((t=>t===i.text[i.text.length-1])));const o=Dt.kerningOffset*this.textFormatter.fontSizeInPixels;return n&&e.symbolModifier===yt.SUPERSCRIPT&&(s+=o),a&&e.symbolType===St.TEXT&&(e.text[0]>="a"&&e.text[0]<="z"&&(s+=o/2),Dt.upperKerningText.some((t=>t===(null==i?void 0:i.text[i.text.length-1])))&&(s+=o/2)),s}getSymbolBlock(t={}){var e,i,s;const n=null!==(e=t.symbolType)&&void 0!==e?e:St.TEXT,a={text:null!==(i=t.text)&&void 0!==i?i:"",symbolType:n,symbolModifier:null!==(s=t.symbolModifier)&&void 0!==s?s:yt.NONE,xShift:0,yShift:0,vAlign:!1,width:0};if(n===St.GLYPH&&"string"==typeof t.glyph){const e=Dt.glyphs[t.glyph],i=20;a.glyph=new R(e.code,i,{category:"chordSymbol"})}else n===St.TEXT?a.width=this.textFormatter.getWidthForTextInEm(a.text):n===St.LINE&&(a.width=t.width);return a}addSymbolBlock(t){return this.symbolBlocks.push(this.getSymbolBlock(t)),this}addText(t,e={}){const i=St.TEXT;return this.addSymbolBlock(Object.assign(Object.assign({},e),{text:t,symbolType:i}))}addTextSuperscript(t){const e=St.TEXT,i=yt.SUPERSCRIPT;return this.addSymbolBlock({text:t,symbolType:e,symbolModifier:i})}addTextSubscript(t){const e=St.TEXT,i=yt.SUBSCRIPT;return this.addSymbolBlock({text:t,symbolType:e,symbolModifier:i})}addGlyphSuperscript(t){const e=St.GLYPH,i=yt.SUPERSCRIPT;return this.addSymbolBlock({glyph:t,symbolType:e,symbolModifier:i})}addGlyph(t,e={}){const i=St.GLYPH;return this.addSymbolBlock(Object.assign(Object.assign({},e),{glyph:t,symbolType:i}))}addGlyphOrText(t,e={}){let i="";for(let s=0;s0&&(this.addText(i,e),i=""),this.addGlyph(n,e)):i+=n}return i.length>0&&this.addText(i,e),this}addLine(t,e={}){const i=St.LINE;return this.addSymbolBlock(Object.assign(Object.assign({},e),{symbolType:i,width:t}))}setFont(t,e,i,s){return super.setFont(t,e,i,s),this.textFormatter=it.create(this.textFont),this}setEnableKerning(t){return this.useKerning=t,this}setVertical(t){return this.vertical="string"==typeof t?Dt.VerticalJustifyString[t]:t,this}getVertical(){return this.vertical}setHorizontal(t){return this.horizontal="string"==typeof t?Dt.HorizontalJustifyString[t]:t,this}getHorizontal(){return this.horizontal}getWidth(){let t=0;return this.symbolBlocks.forEach((e=>{t+=e.vAlign?0:e.width})),t}getYOffsetForText(t){var e;let i=0,s=0;for(s=0;s0?i/n*-1:0}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered(),t.save();const i=Object.keys(this.getAttribute("classes")).join(" ");t.openGroup(i,this.getAttribute("id"));const s=e.getModifierStartXY(O.Position.ABOVE,this.index);let n;t.setFont(this.textFont);const a=e.hasStem(),o=e.checkStave();if(this.vertical===xt.BOTTOM){if(n=o.getYForBottomText(this.text_line+K.TEXT_HEIGHT_OFFSET_HACK),a){const t=e.checkStem().getExtents(),i=o.getSpacingBetweenLines(),s=1===e.getStemDirection()?t.baseY:t.topY;n=Math.max(n,s+i*(this.text_line+2))}}else if(n=Math.min(o.getYForTopText(this.text_line),e.getYs()[0]-10),a){const t=e.checkStem().getExtents(),i=o.getSpacingBetweenLines();n=Math.min(n,t.topY-5-i*this.text_line)}let r=s.x;r=this.horizontal===_t.LEFT?s.x:this.horizontal===_t.RIGHT?s.x+this.getWidth():this.horizontal===_t.CENTER?s.x-this.getWidth()/2:e.getStemX()-this.getWidth()/2,kt("Rendering ChordSymbol: ",this.textFormatter,r,n),this.symbolBlocks.forEach((e=>{const i=Dt.isSuperscript(e),s=Dt.isSubscript(e);let a=n;if(kt("shift was ",e.xShift,e.yShift),kt("curY pre sub ",a),i&&(a+=this.superscriptOffset),s&&(a+=this.subscriptOffset),kt("curY sup/sub ",a),e.symbolType===St.TEXT){if((i||s)&&(t.save(),this.textFont)){const{family:e,size:i,weight:s,style:n}=this.textFont,a=k.scaleSize(i,Dt.superSubRatio);t.setFont(e,a,s,n)}kt("Rendering Text: ",e.text,r+e.xShift,a+e.yShift),t.fillText(e.text,r+e.xShift,a+e.yShift),(i||s)&&t.restore()}else e.symbolType===St.GLYPH&&e.glyph?(a+=e.yShift,kt("Rendering Glyph: ",e.glyph.code,r+e.xShift,a),e.glyph.render(t,r+e.xShift,a)):e.symbolType===St.LINE&&(kt("Rendering Line : ",e.width,r,a),t.beginPath(),t.setLineWidth(1),t.moveTo(r,n),t.lineTo(r+e.width,a),t.stroke());r+=e.width,e.vAlign&&(r+=e.xShift)})),t.closeGroup(),t.restore()}}Dt.DEBUG=!1,Dt.HorizontalJustify=_t,Dt.HorizontalJustifyString={left:_t.LEFT,right:_t.RIGHT,center:_t.CENTER,centerStem:_t.CENTER_STEM},Dt.VerticalJustify=xt,Dt.VerticalJustifyString={top:xt.TOP,above:xt.TOP,below:xt.BOTTOM,bottom:xt.BOTTOM},Dt.glyphs={diminished:{code:"csymDiminished"},dim:{code:"csymDiminished"},halfDiminished:{code:"csymHalfDiminished"},"+":{code:"csymAugmented"},augmented:{code:"csymAugmented"},majorSeventh:{code:"csymMajorSeventh"},minor:{code:"csymMinor"},"-":{code:"csymMinor"},"(":{code:"csymParensLeftTall"},leftParen:{code:"csymParensLeftTall"},")":{code:"csymParensRightTall"},rightParen:{code:"csymParensRightTall"},leftBracket:{code:"csymBracketLeftTall"},rightBracket:{code:"csymBracketRightTall"},leftParenTall:{code:"csymParensLeftVeryTall"},rightParenTall:{code:"csymParensRightVeryTall"},"/":{code:"csymDiagonalArrangementSlash"},over:{code:"csymDiagonalArrangementSlash"},"#":{code:"accidentalSharp"},b:{code:"accidentalFlat"}},Dt.symbolTypes=St,Dt.symbolModifiers=yt,Dt.noFormat=!1;class Nt extends O{constructor(){super(),this.position=O.Position.RIGHT,this.radius=2,this.setWidth(5),this.dot_shiftY=0}static get CATEGORY(){return l.Dot}static getDots(t){return t.getModifiersByType(Nt.CATEGORY)}static buildAndAttach(t,e){for(const i of t)if(null==e?void 0:e.all)for(let t=0;te.line-t.line));let a=i,r=0,l=null,d=null,b=null,g=0;for(let t=0;tr?a:r,l=h,d=i}return e.right_shift+=r,!0}setNote(t){return this.note=t,n(t)&&(this.radius*=.5,this.setWidth(3)),this}setDotShiftY(t){return this.dot_shiftY=t,this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.checkStave().getSpacingBetweenLines(),s=e.getModifierStartXY(this.position,this.index,{forceFlagRight:!0});h(e)&&(s.y=e.getStemExtents().baseY);const n=s.x+this.x_shift+this.width-this.radius,a=s.y+this.y_shift+this.dot_shiftY*i;t.beginPath(),t.arc(n,a,this.radius,0,2*Math.PI,!1),t.fill()}}class At extends O{constructor(t){super(),this.finger=t,this.width=7,this.position=O.Position.LEFT,this.x_shift=0,this.y_shift=0,this.x_offset=0,this.y_offset=0,this.resetFont()}static get CATEGORY(){return l.FretHandFinger}static format(t,e){const{left_shift:i,right_shift:s}=e;if(!t||0===t.length)return!1;const n=[];let a=null,o=0,r=0;for(let h=0;he.line-t.line));let h=0,l=0,c=0,d=0,b=null,g=null;for(let t=0;tc?e:c):o===O.Position.RIGHT&&(m.setXShift(l),e=r+_,d=e>d?e:d),b=u,g=a}return e.left_shift+=c,e.right_shift+=d,!0}static easyScoreHook({fingerings:t}={},e,i){null==t||t.split(",").map((t=>{const e=t.trim().split("."),s={number:e[0]};return e[1]&&(s.position=e[1]),i.getFactory().Fingering(s)})).map(((t,i)=>e.addModifier(t,i)))}setFretHandFinger(t){return this.finger=t,this}getFretHandFinger(){return this.finger}setOffsetX(t){return this.x_offset=t,this}setOffsetY(t){return this.y_offset=t,this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.getModifierStartXY(this.position,this.index);let s=i.x+this.x_shift+this.x_offset,n=i.y+this.y_shift+this.y_offset+5;switch(this.position){case O.Position.ABOVE:s-=4,n-=12;break;case O.Position.BELOW:s-=2,n+=10;break;case O.Position.LEFT:s-=this.width;break;case O.Position.RIGHT:s+=1;break;default:throw new c("InvalidPosition",`The position ${this.position} does not exist`)}t.save(),t.setFont(this.textFont),t.fillText(""+this.finger,s,n),t.restore()}}At.TEXT_FONT={family:k.SANS_SERIF,size:9,weight:T.BOLD,style:w.NORMAL};class Pt extends A{constructor(t,e){super(),this.setNotes(t),this.text=e,this.render_options={cp1:8,cp2:12,text_shift_x:0,first_x_shift:0,last_x_shift:0,y_shift:7,tie_spacing:0},this.resetFont()}static get CATEGORY(){return l.StaveTie}setDirection(t){return this.direction=t,this}setNotes(t){if(!t.first_note&&!t.last_note)throw new c("BadArguments","Tie needs to have either first_note or last_note set.");if(t.first_indices||(t.first_indices=[0]),t.last_indices||(t.last_indices=[0]),t.first_indices.length!==t.last_indices.length)throw new c("BadArguments","Tied notes must have same number of indices.");return this.notes=t,this}isPartial(){return!this.notes.first_note||!this.notes.last_note}renderTie(t){if(0===t.first_ys.length||0===t.last_ys.length)throw new c("BadArguments","No Y-values to render");const e=this.checkContext();let i=this.render_options.cp1,s=this.render_options.cp2;Math.abs(t.last_x_px-t.first_x_px)<10&&(i=2,s=8);const n=this.render_options.first_x_shift,a=this.render_options.last_x_shift,o=this.render_options.y_shift*t.direction,r=this.notes.first_indices,h=this.notes.last_indices;for(let l=0;lMath.pow(this.options.softmaxFactor,e.getTicks().value()/t))).reduce(((t,e)=>t+e),0),this.expTicksUsed}softmax(t){this.expTicksUsed||(this.expTicksUsed=this.reCalculateExpTicksUsed());const e=this.ticksUsed.value();return(t=>Math.pow(this.options.softmaxFactor,t/e))(t)/this.expTicksUsed}addTickable(t){if(!t.shouldIgnoreTicks()){const e=t.getTicks();if(this.ticksUsed.add(e),this.expTicksUsed=0,(this.mode===Tt.STRICT||this.mode===Tt.FULL)&&this.ticksUsed.greaterThan(this.totalTicks))throw this.ticksUsed.subtract(e),new c("BadArgument","Too many ticks.");e.lessThan(this.smallestTickCount)&&(this.smallestTickCount=e.clone()),this.resolutionMultiplier=this.ticksUsed.denominator,this.totalTicks.add(0,this.ticksUsed.denominator)}return this.tickables.push(t),t.setVoice(this),this}addTickables(t){for(let e=0;e{e.getStave()||e.setStave(t)})),this.preFormatted=!0,this}checkStave(){return b(this.stave,"NoStave","No stave attached to instance.")}draw(t=this.checkContext(),e){let i;e=null!=e?e:this.stave,this.setRendered();for(let s=0;s1){const e=new Ne(t);e.render_options.beam_width=3,e.render_options.partial_beam_length=4,this.beams.push(e)}return this}setWidth(t){return this.width=t,this}getWidth(){return this.width}getGraceNotes(){return this.grace_notes}draw(){const t=this.checkContext(),e=this.checkAttachedNote();if(this.setRendered(),function(...t){Mt.DEBUG&&g("Vex.Flow.GraceNoteGroup",t)}("Drawing grace note group for:",e),this.alignSubNotesWithNote(this.getGraceNotes(),e),this.grace_notes.forEach((e=>e.setContext(t).draw())),this.beams.forEach((e=>e.setContext(t).draw())),this.show_slur){const i=o(e),s=i?Pt:Ft;this.slur=new s({last_note:this.grace_notes[0],first_note:e,first_indices:[0],last_indices:[0]}),this.slur.render_options.cp2=12,this.slur.render_options.y_shift=(i?7:5)+this.render_options.slur_y_shift,this.slur.setContext(t).draw()}}}Mt.DEBUG=!1;class Rt extends O{constructor(t){super(),this.preFormatted=!1,this.position=O.Position.LEFT,this.subNotes=t,this.subNotes.forEach((t=>{t.setIgnoreTicks(!1)})),this.width=0,this.formatter=new we,this.voice=new Bt({num_beats:4,beat_value:4,resolution:K.RESOLUTION}).setStrict(!1),this.voice.addTickables(this.subNotes)}static get CATEGORY(){return l.NoteSubGroup}static format(t,e){if(!t||0===t.length)return!1;let i=0;for(let e=0;ee.setContext(t).drawWithStyle()))}}class Ot{constructor(t){this.preFormatted=!1,this.postFormatted=!1,this.tickID=t&&t.tickID?t.tickID:0,this.currentTick=new _(0,1),this.maxTicks=new _(0,1),this.maxTickable=void 0,this.minTicks=void 0,this.minTickable=void 0,this.padding=1,this.x=0,this.xBase=0,this.xOffset=0,this.tickables=[],this.tickablesByVoice={},this.notePx=0,this.glyphPx=0,this.leftDisplacedHeadPx=0,this.rightDisplacedHeadPx=0,this.modLeftPx=0,this.modRightPx=0,this.totalLeftPx=0,this.totalRightPx=0,this.tContexts=[],this.width=0,this.formatterMetrics={freedom:{left:0,right:0}}}static getNextContext(t){const e=t.tContexts,i=e.indexOf(t);if(i+1t.isCenterAligned()))}getMetrics(){const{width:t,glyphPx:e,notePx:i,leftDisplacedHeadPx:s,rightDisplacedHeadPx:n,modLeftPx:a,modRightPx:o,totalLeftPx:r,totalRightPx:h}=this;return{width:t,glyphPx:e,notePx:i,leftDisplacedHeadPx:s,rightDisplacedHeadPx:n,modLeftPx:a,modRightPx:o,totalLeftPx:r,totalRightPx:h}}getCurrentTick(){return this.currentTick}setCurrentTick(t){this.currentTick=t,this.preFormatted=!1}addTickable(t,e){if(!t)throw new c("BadArgument","Invalid tickable added.");if(!t.shouldIgnoreTicks()){const e=t.getTicks();e.greaterThan(this.maxTicks)&&(this.maxTicks=e.clone(),this.maxTickable=t),(null==this.minTicks||e.lessThan(this.minTicks))&&(this.minTicks=e.clone(),this.minTickable=t)}return t.setTickContext(this),this.tickables.push(t),this.tickablesByVoice[e||0]=t,this.preFormatted=!1,this}preFormat(){if(this.preFormatted)return this;for(let t=0;t=0,!this.ornament)throw new c("ArgumentError",`Ornament not found: '${this.type}'`);this.x_shift=e?e.xOffset:0,this.y_shift=e?e.yOffset:0,this.glyph=new R(this.ornament.code,this.render_options.font_scale,{category:`ornament.${this.ornament.code}`}),Lt.ornamentNoteTransition.indexOf(this.type)>=0&&(this.delayed=!0),e||this.glyph.setOrigin(.5,1)}static get CATEGORY(){return l.Ornament}static format(t,e){if(!t||0===t.length)return!1;let i=0,s=e.right_shift,n=e.left_shift,a=0;for(let o=0;o=0&&(r.x_shift+=s+2),Lt.ornamentAttack.indexOf(r.type)>=0&&(r.x_shift-=n+2),r.reportedWidth&&r.x_shift<0?n+=r.reportedWidth:r.reportedWidth&&r.x_shift>0?s+=r.reportedWidth:i=Math.max(r.getWidth(),i),Lt.ornamentArticulation.indexOf(r.type)>=0){b(r.note,"NoAttachedNote").getLineNumber()>=3||r.getPosition()===O.Position.ABOVE?(e.top_text_line+=h,r.y_shift+=a,a-=r.glyph.bbox.getH()):(e.text_line+=h,r.y_shift+=a,a+=r.glyph.bbox.getH())}else r.getPosition()===O.Position.ABOVE?(r.setTextLine(e.top_text_line),e.top_text_line+=h):(r.setTextLine(e.text_line),e.text_line+=h)}return e.left_shift=n+i/2,e.right_shift=s+i/2,!0}static get ornamentNoteTransition(){return["flip","jazzTurn","smear"]}static get ornamentAttack(){return["scoop"]}static get ornamentAlignWithNoteHead(){return["doit","fall","fallLong","doitLong","bend","plungerClosed","plungerOpen","scoop"]}static get ornamentRelease(){return["doit","fall","fallLong","doitLong","jazzTurn","smear","flip"]}static get ornamentArticulation(){return["bend","plungerClosed","plungerOpen"]}getMetrics(){return K.currentMusicFont().getMetrics().glyphs.jazzOrnaments[this.ornament.code]}setDelayed(t){return this.delayed=t,this}setUpperAccidental(t){const e=this.render_options.font_scale/1.3;return this.accidentalUpper=new R(K.accidentalCodes(t).code,e),this.accidentalUpper.setOrigin(.5,1),this}setLowerAccidental(t){const e=this.render_options.font_scale/1.3;return this.accidentalLower=new R(K.accidentalCodes(t).code,e),this.accidentalLower.setOrigin(.5,1),this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.getStemDirection(),s=e.checkStave(),n=Object.keys(this.getAttribute("classes")).join(" ");t.openGroup(n,this.getAttribute("id"));const a=e.checkStem().getExtents();let o=i===Q.DOWN?a.baseY:a.topY;h(e)&&(e.hasStem()?i===Q.DOWN&&(o=s.getYForTopText(this.text_line)):o=s.getYForTopText(this.text_line));const r=i===Q.DOWN,l=s.getSpacingBetweenLines();let c=1;!r&&e.hasBeam()&&(c+=.5);const d=o-l*(this.text_line+c),b=e.getModifierStartXY(this.position,this.index);let m=b.x,u=this.ornamentAlignWithNoteHead?b.y:Math.min(s.getYForTopText(this.text_line),d);if(u+=this.y_shift,this.delayed){let t=0;const i=m-(s.getX()-10);if(void 0!==this.delayXShift)t=this.delayXShift;else{t+=this.glyph.getMetrics().width/2;const n=Ot.getNextContext(e.getTickContext());t+=n?.5*(n.getX()-i):.5*(s.getX()+s.getWidth()-i),this.delayXShift=t}m+=t}!function(...t){Lt.DEBUG&&g("Vex.Flow.Ornament",t)}("Rendering ornament: ",this.ornament,m,u),this.accidentalLower&&(this.accidentalLower.render(t,m,u),u-=this.accidentalLower.getMetrics().height,u-=this.render_options.accidentalLowerPadding),this.stemUpYOffset&&e.hasStem()&&1===e.getStemDirection()&&(u+=this.stemUpYOffset),e.getLineNumber()<5&&Lt.ornamentNoteTransition.indexOf(this.type)>=0&&(u=e.checkStave().getBoundingBox().getY()+40),this.glyph.render(t,m+this.x_shift,u),this.accidentalUpper&&(u-=this.glyph.getMetrics().height+this.render_options.accidentalUpperPadding,this.accidentalUpper.render(t,m,u)),t.closeGroup()}}Lt.DEBUG=!1;class It extends O{constructor(t){super(),this.position=null!=t?t:O.Position.LEFT,this.point=K.currentMusicFont().lookupMetric("parenthesis.default.point"),this.setWidth(K.currentMusicFont().lookupMetric("parenthesis.default.width"))}static get CATEGORY(){return l.Parenthesis}static buildAndAttach(t){for(const e of t)for(let t=0;th+n.width?s:h+n.width),o===F.LEFT&&(h=a.getLeftParenthesisPx(r),i=i>h+n.width?i:h+n.width),n.setXShift(h)}return e.left_shift+=i,e.right_shift+=s,!0}setNote(t){return this.note=t,this.point=K.currentMusicFont().lookupMetric("parenthesis.default.point"),this.setWidth(K.currentMusicFont().lookupMetric("parenthesis.default.width")),n(t)&&(this.point=K.currentMusicFont().lookupMetric("parenthesis.gracenote.point"),this.setWidth(K.currentMusicFont().lookupMetric("parenthesis.gracenote.width"))),this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.getModifierStartXY(this.position,this.index,{forceFlagRight:!0}),s=i.x+this.x_shift,n=i.y+this.y_shift;this.position==O.Position.RIGHT?R.renderGlyph(t,s+1,n,this.point,"noteheadParenthesisRight",{category:"noteHead.standard.noteheadParenthesisRight"}):this.position==O.Position.LEFT&&R.renderGlyph(t,s-2,n,this.point,"noteheadParenthesisLeft",{category:"noteHead.standard.noteheadParenthesisLeft"})}}class Wt extends ut{constructor(t){super(t),this.custom_glyph=!1,this.stem_up_x_offset=0,this.stem_down_x_offset=0,this.index=t.index,this.x=t.x||0,this.y=t.y||0,t.note_type&&(this.noteType=t.note_type),this.displaced=t.displaced||!1,this.stem_direction=t.stem_direction||Q.UP,this.line=t.line||0,this.glyph=K.getGlyphProps(this.duration,this.noteType),b(this.glyph,"BadArguments",`No glyph found for duration '${this.duration}' and type '${this.noteType}'`),this.glyph_code=this.glyph.code_head,this.x_shift=t.x_shift||0,t.custom_glyph_code&&(this.custom_glyph=!0,this.glyph_code=t.custom_glyph_code,this.stem_up_x_offset=t.stem_up_x_offset||0,this.stem_down_x_offset=t.stem_down_x_offset||0),this.style=t.style,this.slashed=t.slashed||!1,this.render_options=Object.assign(Object.assign({},this.render_options),{glyph_font_scale:t.glyph_font_scale||K.NOTATION_FONT_SCALE}),this.setWidth(this.glyph.getWidth(this.render_options.glyph_font_scale))}static get CATEGORY(){return l.NoteHead}getWidth(){return this.width}isDisplaced(){return!0===this.displaced}getGlyph(){return this.glyph}setX(t){return this.x=t,this}getY(){return this.y}setY(t){return this.y=t,this}getLine(){return this.line}setLine(t){return this.line=t,this}getAbsoluteX(){const t=this.preFormatted?super.getAbsoluteX():this.x,e=Q.WIDTH/2,i=K.currentMusicFont(),s=i.lookupMetric("notehead.shiftX",0)*this.stem_direction,n=i.lookupMetric("noteHead.displaced.shiftX",0)*this.stem_direction;return t+s+(this.displaced?(this.width-e)*this.stem_direction+n:0)}getBoundingBox(){if(!this.preFormatted)throw new c("UnformattedNote","Can't call getBoundingBox on an unformatted note.");const t=this.checkStave().getSpacingBetweenLines(),e=t/2,i=this.y-e;return new S(this.getAbsoluteX(),i,this.width,t)}setStave(t){const e=this.getLine();return this.stave=t,this.stave&&(this.setY(this.stave.getYForNote(e)),this.setContext(this.stave.getContext())),this}preFormat(){if(this.preFormatted)return this;const t=this.getWidth()+this.leftDisplacedHeadPx+this.rightDisplacedHeadPx;return this.setWidth(t),this.preFormatted=!0,this}draw(){const t=this.checkContext();this.setRendered();let e=this.getAbsoluteX();this.custom_glyph&&(e+=this.stem_direction===Q.UP?this.stem_up_x_offset:this.stem_down_x_offset);const i=this.y;!function(...t){Wt.DEBUG&&g("Vex.Flow.NoteHead",t)}("Drawing note head '",this.noteType,this.duration,"' at",e,i);const s=this.stem_direction,n=this.render_options.glyph_font_scale;this.style&&this.applyStyle(t);const a=`${this.glyph_code}Stem${s===Q.UP?"Up":"Down"}`;if("s"===this.noteType){const n=this.checkStave().getSpacingBetweenLines();!function(t,e,i,s,n,a){const o=K.SLASH_NOTEHEAD_WIDTH;t.save(),t.setLineWidth(K.STEM_WIDTH);let r=!1;if(K.durationToNumber(e)>2&&(r=!0),r||(i-=K.STEM_WIDTH/2*n),t.beginPath(),t.moveTo(i,s+a),t.lineTo(i,s+1),t.lineTo(i+o,s-a),t.lineTo(i+o,s),t.lineTo(i,s+a),t.closePath(),r?t.fill():t.stroke(),K.durationToFraction(e).equals(.5)){const e=[-3,-1,o+1,o+3];for(let n=0;n2?i[1]:void 0;let o=s>2?i[2]:i[1];2===s&&-1===n.stemDirection&&1===o.stemDirection&&(n=i[1],o=i[0]);const r=Math.max(n.voice_shift,o.voice_shift);let h=0;if(2===s){const t=n.stemDirection===o.stemDirection?0:.5;return n.minLine<=o.maxLine+t&&(n.isrest?Gt(n,0,1):o.isrest?Gt(o,0,-1):n.stemDirection===o.stemDirection?(h=r+2,n.note.setXShift(h)):(h=r+2,o.note.setXShift(h))),e.right_shift+=h,!0}if(!a)throw new c("InvalidState","noteM not defined.");if(a.isrest&&!n.isrest&&!o.isrest&&(n.minLine<=a.maxLine||a.minLine<=o.maxLine)){return a.maxLine-a.minLinet.postFormat())),!0)}reset(){super.reset();const t=this._noteHeads.map((t=>t.getStyle()));this.buildNoteHeads(),this._noteHeads.forEach(((e,i)=>{const s=t[i];s&&e.setStyle(s)}));const e=this.stave;return e&&this._noteHeads.forEach((t=>t.setStave(e))),this.calcNoteDisplacements(),this}setBeam(t){return this.beam=t,this.calcNoteDisplacements(),this.stem&&this.stem.setExtension(this.getStemExtension()),this}buildStem(){return this.setStem(new Q({hide:!!this.isRest()})),this}buildNoteHeads(){this._noteHeads=[];const t=this.getStemDirection(),e=this.getKeys();let i,s,n,a,o,r=!1;t===Q.UP?(n=0,a=e.length,o=1):(n=e.length-1,a=-1,o=-1);for(let e=n;e!==a;e+=o){const n=this.keyProps[e],a=n.line;void 0===i?i=a:(s=Math.abs(i-a),0===s||.5===s?r=!r:(r=!1,this.use_default_head_x=!0)),i=a;const o=new Wt({duration:this.duration,note_type:this.noteType,displaced:r,stem_direction:t,custom_glyph_code:n.code,glyph_font_scale:this.render_options.glyph_font_scale,x_shift:n.shift_right,stem_up_x_offset:n.stem_up_x_offset,stem_down_x_offset:n.stem_down_x_offset,line:n.line});this._noteHeads[e]=o}}autoStem(){this.setStemDirection(this.calculateOptimalStemDirection())}calculateOptimalStemDirection(){this.minLine=this.keyProps[0].line,this.maxLine=this.keyProps[this.keyProps.length-1].line;return(this.minLine+this.maxLine)/2<3?Q.UP:Q.DOWN}calculateKeyProps(){let t;for(let e=0;e0&&(this.keyProps[e-1].displaced=!0)),t=a,this.keyProps.push(n)}t=void 0,this.keyProps.forEach((e=>{t&&e.linet.line-e.line))}getBoundingBox(){var t,e;if(!this.preFormatted)throw new c("UnformattedNote","Can't call getBoundingBox on an unformatted note.");const{width:i,modLeftPx:s,leftDisplacedHeadPx:n}=this.getMetrics(),a=this.getAbsoluteX()-s-n;let o=0,r=0;const h=(null!==(e=null===(t=this.getStave())||void 0===t?void 0:t.getSpacingBetweenLines())&&void 0!==e?e:0)/2,l=2*h;if(this.isRest()){const t=this.ys[0],e=K.durationToFraction(this.duration);e.equals(1)||e.equals(2)?(o=t-h,r=t+h):(o=t-this.glyph.line_above*l,r=t+this.glyph.line_below*l)}else if(this.glyph.stem){const t=this.getStemExtents();t.baseY+=h*this.getStemDirection(),o=Math.min(t.topY,t.baseY),r=Math.max(t.topY,t.baseY)}else{o=0,r=0;for(let t=0;te&&(e=s):s1}hasStem(){return this.glyph.stem}hasFlag(){return super.hasFlag()&&!this.isRest()}getStemX(){return"r"===this.noteType?this.getCenterGlyphX():super.getStemX()+(this.stem_direction?Q.WIDTH/(2*-this.stem_direction):0)}getYForTopText(t){const e=this.getStemExtents();return Math.min(this.checkStave().getYForTopText(t),e.topY-this.render_options.annotation_spacing*(t+1))}getYForBottomText(t){const e=this.getStemExtents();return Math.max(this.checkStave().getYForTopText(t),e.baseY+this.render_options.annotation_spacing*t)}setStave(t){super.setStave(t);const e=this._noteHeads.map((e=>(e.setStave(t),e.getY())));if(this.setYs(e),this.stem){const{y_top:t,y_bottom:e}=this.getNoteHeadBounds();this.stem.setYBounds(t,e)}return this}isDisplaced(){return this.displaced}setNoteDisplaced(t){return this.displaced=t,this}getTieRightX(){let t=this.getAbsoluteX();return t+=this.getGlyphWidth()+this.x_shift+this.rightDisplacedHeadPx,this.modifierContext&&(t+=this.modifierContext.getRightShift()),t}getTieLeftX(){let t=this.getAbsoluteX();return t+=this.x_shift-this.leftDisplacedHeadPx,t}getLineForRest(){let t=this.keyProps[0].line;if(this.keyProps.length>1){const e=this.keyProps[this.keyProps.length-1].line;t=u(Math.max(t,e),Math.min(t,e))}return t}getModifierStartXY(t,e,i={}){var s,n;if(!this.preFormatted)throw new c("UnformattedNote","Can't call GetModifierStartXY on an unformatted note");if(0===this.ys.length)throw new c("NoYValues","No Y-Values calculated for this note.");const{ABOVE:a,BELOW:o,LEFT:r,RIGHT:h}=O.Position;let l=0;return t===r?l=-2:t===h?(l=this.getGlyphWidth()+this.x_shift+2,this.stem_direction===Q.UP&&this.hasFlag()&&(i.forceFlagRight||((t,e)=>e===(t.getStemDirection()===Q.UP?t.keyProps.length-1:0))(this,e))&&(l+=null!==(n=null===(s=null==this?void 0:this.flag)||void 0===s?void 0:s.getMetrics().width)&&void 0!==n?n:0)):t!==o&&t!==a||(l=this.getGlyphWidth()/2),{x:this.getAbsoluteX()+l,y:this.ys[e]}}setStyle(t){var e;return super.setStyle(t),this._noteHeads.forEach((e=>e.setStyle(t))),null===(e=this.stem)||void 0===e||e.setStyle(t),this}setStemStyle(t){const e=this.getStem();return null==e||e.setStyle(t),this}getStemStyle(){var t;return null===(t=this.stem)||void 0===t?void 0:t.getStyle()}setLedgerLineStyle(t){this.ledgerLineStyle=t}getLedgerLineStyle(){return this.ledgerLineStyle}setFlagStyle(t){this.flagStyle=t}getFlagStyle(){return this.flagStyle}setKeyStyle(t,e){return this._noteHeads[t].setStyle(e),this}setKeyLine(t,e){return this.keyProps[t].line=e,this.reset(),this}getKeyLine(t){return this.keyProps[t].line}getVoiceShiftWidth(){return this.getGlyphWidth()*(this.displaced?2:1)}calcNoteDisplacements(){this.setLeftDisplacedHeadPx(this.displaced&&this.stem_direction===Q.DOWN?this.getGlyphWidth():0),this.setRightDisplacedHeadPx(!this.hasFlag()&&this.displaced&&this.stem_direction===Q.UP?this.getGlyphWidth():0)}preFormat(){if(this.preFormatted)return;let t=0;this.modifierContext&&(this.modifierContext.preFormat(),0===this.modifierContext.getWidth()&&(t=Yt.minNoteheadPadding));let e=this.getGlyphWidth()+this.leftDisplacedHeadPx+this.rightDisplacedHeadPx+t;this.shouldDrawFlag()&&this.stem_direction===Q.UP&&(e+=this.getGlyphWidth()),this.setWidth(e),this.preFormatted=!0}getNoteHeadBounds(){let t,e,i,s,n=1/0,a=-1/0,o=this.checkStave().getNumLines(),r=1,h=o,l=r;return this._noteHeads.forEach((c=>{const d=c.getLine(),b=c.getY();n=Math.min(b,n),a=Math.max(b,a),void 0===e&&c.isDisplaced()&&(e=c.getAbsoluteX()),void 0!==t||c.isDisplaced()||(t=c.getAbsoluteX()),o=Math.max(d,o),r=Math.min(d,r),c.isDisplaced()?(i=void 0===i?d:Math.max(d,i),s=void 0===s?d:Math.min(d,s)):(h=Math.max(d,h),l=Math.min(d,l))}),this),{y_top:n,y_bottom:a,displaced_x:e,non_displaced_x:t,highest_line:o,lowest_line:r,highest_displaced_line:i,lowest_displaced_line:s,highest_non_displaced_line:h,lowest_non_displaced_line:l}}getNoteHeadBeginX(){return this.getAbsoluteX()+this.x_shift}getNoteHeadEndX(){return this.getNoteHeadBeginX()+this.getGlyphWidth()}get noteHeads(){return this._noteHeads.slice()}get note_heads(){return console.warn("StaveNote.note_heads is deprecated. Use StaveNote.noteHeads instead.","This accessor will be removed in VexFlow 5.0."),this.noteHeads}drawLedgerLines(){const t=this.checkStave(),{glyph:e,render_options:{stroke_px:i}}=this,s=this.checkContext(),n=e.getWidth()+2*i,a=2*(e.getWidth()+i)-Q.WIDTH/2;if(this.isRest())return;if(!s)throw new c("NoCanvasContext","Can't draw without a canvas context.");const{highest_line:o,lowest_line:r,highest_displaced_line:h,highest_non_displaced_line:l,lowest_displaced_line:d,lowest_non_displaced_line:b,displaced_x:g,non_displaced_x:m}=this.getNoteHeadBounds();if(o<6&&r>0)return;const u=Math.min(null!=g?g:0,null!=m?m:0),p=(t,e,o)=>{let r;r=o&&e?u-i:e?(null!=m?m:0)-i:(null!=g?g:0)-i;const h=e&&o?a:n;s.beginPath(),s.moveTo(r,t),s.lineTo(r+h,t),s.stroke()},f=Object.assign(Object.assign({},t.getDefaultLedgerLineStyle()),this.getLedgerLineStyle());this.applyStyle(s,f);for(let e=6;e<=o;++e){const i=void 0!==m&&e<=l,s=void 0!==h&&e<=h;p(t.getYForNote(e),i,s)}for(let e=0;e>=r;--e){const i=void 0!==m&&e>=b,s=void 0!==d&&e>=d;p(t.getYForNote(e),i,s)}this.restoreStyle(s,f)}drawModifiers(){const t=this.checkContext();t.openGroup("modifiers");for(let e=0;e{t.openGroup("notehead",void 0,{pointerBBox:!0}),e.setContext(t).draw(),t.closeGroup()}))}drawStem(t){var e;const i=this.checkContext();t&&this.setStem(new Q(t)),this.shouldDrawFlag()&&this.stem&&this.stem.adjustHeightForFlag(),i.openGroup("stem",void 0,{pointerBBox:!0}),null===(e=this.stem)||void 0===e||e.setContext(i).draw(),i.closeGroup()}getStemExtension(){const t=super.getStemExtension();if(!this.glyph.stem)return t;const e=this.getStemDirection();if(e!==this.calculateOptimalStemDirection())return t;let i;i=e===Q.UP?3-this.maxLine:this.minLine-3;const s=i-3.5;if(s<=0)return t;const n=this.getStave();let a=10;return null!=n&&(a=n.getSpacingBetweenLines()),t+s*a}draw(){var t;if(0===this.ys.length)throw new c("NoYValues","Can't draw note without Y values.");const e=this.checkContext(),i=this.getNoteHeadBeginX(),s=this.hasStem()&&!this.beam;this._noteHeads.forEach((t=>t.setX(i)));const n=this.getStemX();null===(t=this.stem)||void 0===t||t.setNoteHeadXBounds(n,n),function(...t){Yt.DEBUG&&g("Vex.Flow.StaveNote",t)}("Rendering ",this.isChord()?"chord :":"note :",this.keys),this.applyStyle(),this.setAttribute("el",e.openGroup("stavenote",this.getAttribute("id"))),this.drawLedgerLines(),e.openGroup("note",void 0,{pointerBBox:!0}),s&&this.drawStem(),this.drawNoteHeads(),this.drawFlag(),e.closeGroup(),this.drawModifiers(),e.closeGroup(),this.restoreStyle(),this.setRendered()}}function Ht(t){if(!t)return!1;const e=d();return"function"==typeof e.HTMLCanvasElement&&t instanceof e.HTMLCanvasElement||"function"==typeof t.getContext&&"function"==typeof t.toDataURL}Yt.DEBUG=!1;class jt extends gt{constructor(t){super(),this.textHeight=0,this.context2D=t,t.canvas?this.canvas=t.canvas:this.canvas={width:jt.WIDTH,height:jt.HEIGHT}}static get WIDTH(){return 600}static get HEIGHT(){return 400}static get CANVAS_BROWSER_SIZE_LIMIT(){return 32767}static sanitizeCanvasDims(t,e){const i=this.CANVAS_BROWSER_SIZE_LIMIT;return Math.max(t,e)>i&&(m("Canvas dimensions exceed browser limit. Cropping to "+i),t>i&&(t=i),e>i&&(e=i)),[t,e]}clear(){this.context2D.clearRect(0,0,this.canvas.width,this.canvas.height)}openGroup(t,e,i){}closeGroup(){}add(t){}setFillStyle(t){return this.context2D.fillStyle=t,this}setBackgroundFillStyle(t){return this}setStrokeStyle(t){return this.context2D.strokeStyle=t,this}setShadowColor(t){return this.context2D.shadowColor=t,this}setShadowBlur(t){const e=this.context2D.getTransform(),i=Math.sqrt(e.a*e.a+e.b*e.b+e.c*e.c+e.d*e.d);return this.context2D.shadowBlur=i*t,this}setLineWidth(t){return this.context2D.lineWidth=t,this}setLineCap(t){return this.context2D.lineCap=t,this}setLineDash(t){return this.context2D.setLineDash(t),this}scale(t,e){return this.context2D.scale(t,e),this}resize(t,e){const i=this.context2D.canvas,s=d().devicePixelRatio||1;return[t,e]=jt.sanitizeCanvasDims(t*s,e*s),t=t/s|0,e=e/s|0,i.width=t*s,i.height=e*s,Ht(i)&&(i.style.width=t+"px",i.style.height=e+"px"),this.scale(s,s)}rect(t,e,i,s){return this.context2D.rect(t,e,i,s),this}fillRect(t,e,i,s){return this.context2D.fillRect(t,e,i,s),this}clearRect(t,e,i,s){return this.context2D.clearRect(t,e,i,s),this}beginPath(){return this.context2D.beginPath(),this}moveTo(t,e){return this.context2D.moveTo(t,e),this}lineTo(t,e){return this.context2D.lineTo(t,e),this}bezierCurveTo(t,e,i,s,n,a){return this.context2D.bezierCurveTo(t,e,i,s,n,a),this}quadraticCurveTo(t,e,i,s){return this.context2D.quadraticCurveTo(t,e,i,s),this}arc(t,e,i,s,n,a){return this.context2D.arc(t,e,i,s,n,a),this}fill(){return this.context2D.fill(),this}stroke(){return this.context2D.stroke(),this}closePath(){return this.context2D.closePath(),this}measureText(t){const e=this.context2D.measureText(t);let i=0,s=0;return e.fontBoundingBoxAscent?(i=-e.fontBoundingBoxAscent,s=e.fontBoundingBoxDescent+e.fontBoundingBoxAscent):(i=-e.actualBoundingBoxAscent,s=e.actualBoundingBoxDescent+e.actualBoundingBoxAscent),{x:0,y:i,width:e.width,height:s}}fillText(t,e,i){return this.context2D.fillText(t,e,i),this}save(){return this.context2D.save(),this}restore(){return this.context2D.restore(),this}set fillStyle(t){this.context2D.fillStyle=t}get fillStyle(){return this.context2D.fillStyle}set strokeStyle(t){this.context2D.strokeStyle=t}get strokeStyle(){return this.context2D.strokeStyle}setFont(t,e,i,s){const n=k.validate(t,e,i,s);return this.context2D.font=k.toCSSString(n),this.textHeight=k.convertSizeToPixelValue(n.size),this}getFont(){return this.context2D.font}}const Xt={path:{x:!0,y:!0,width:!0,height:!0,"font-family":!0,"font-weight":!0,"font-style":!0,"font-size":!0},rect:{"font-family":!0,"font-weight":!0,"font-style":!0,"font-size":!0},text:{width:!0,height:!0}},Vt="http://www.w3.org/2000/svg",zt=2*Math.PI;class Kt extends gt{constructor(t){super(),this.width=0,this.height=0,this.backgroundFillStyle="white",this.fontCSSString="",this.element=t;const e=this.create("svg");this.element.appendChild(e),this.svg=e,this.parent=this.svg,this.groups=[this.svg],this.path="",this.pen={x:NaN,y:NaN},this.lineWidth=1;const i={"font-family":k.SANS_SERIF,"font-size":k.SIZE+"pt","font-weight":T.NORMAL,"font-style":w.NORMAL};this.state=Object.assign({scale:{x:1,y:1}},i),this.attributes=Object.assign({"stroke-width":.3,"stroke-dasharray":"none",fill:"black",stroke:"black"},i),this.shadow_attributes={width:0,color:"black"},this.state_stack=[]}create(t){return document.createElementNS(Vt,t)}openGroup(t,e,i){const s=this.create("g");return this.groups.push(s),this.parent.appendChild(s),this.parent=s,t&&s.setAttribute("class",p(t)),e&&s.setAttribute("id",p(e)),i&&i.pointerBBox&&s.setAttribute("pointer-events","bounding-box"),s}closeGroup(){this.groups.pop(),this.parent=this.groups[this.groups.length-1]}add(t){this.parent.appendChild(t)}setFillStyle(t){return this.attributes.fill=t,this}setBackgroundFillStyle(t){return this.backgroundFillStyle=t,this}setStrokeStyle(t){return this.attributes.stroke=t,this}setShadowColor(t){return this.shadow_attributes.color=t,this}setShadowBlur(t){return this.shadow_attributes.width=t,this}setLineWidth(t){return this.attributes["stroke-width"]=t,this.lineWidth=t,this}setLineDash(t){if("[object Array]"===Object.prototype.toString.call(t))return this.attributes["stroke-dasharray"]=t.join(","),this;throw new c("ArgumentError","lineDash must be an array of integers.")}setLineCap(t){return this.attributes["stroke-linecap"]=t,this}resize(t,e){this.width=t,this.height=e,this.element.style.width=t.toString(),this.svg.style.width=t.toString(),this.svg.style.height=e.toString();const i={width:t,height:e};return this.applyAttributes(this.svg,i),this.scale(this.state.scale.x,this.state.scale.y),this}scale(t,e){this.state.scale={x:t,y:e};const i=this.width/t,s=this.height/e;return this.setViewBox(0,0,i,s),this}setViewBox(t,e,i,s){if("string"==typeof t)this.svg.setAttribute("viewBox",t);else{const n=t+" "+e+" "+i+" "+s;this.svg.setAttribute("viewBox",n)}}applyAttributes(t,e){const i=Xt[t.nodeName];for(const s in e)i&&i[s]||t.setAttributeNS(null,s,e[s]);return t}clear(){for(;this.svg.lastChild;)this.svg.removeChild(this.svg.lastChild);this.scale(this.state.scale.x,this.state.scale.y)}rect(t,e,i,s,n){s<0&&(e+=s,s*=-1);const a=this.create("rect");return n=null!=n?n:{fill:"none","stroke-width":this.lineWidth,stroke:"black"},this.applyAttributes(a,Object.assign({x:t,y:e,width:i,height:s},n)),this.add(a),this}fillRect(t,e,i,s){const n={fill:this.attributes.fill};return this.rect(t,e,i,s,n),this}clearRect(t,e,i,s){return this.rect(t,e,i,s,{"stroke-width":0,fill:this.backgroundFillStyle}),this}beginPath(){return this.path="",this.pen.x=NaN,this.pen.y=NaN,this}moveTo(t,e){return this.path+="M"+t+" "+e,this.pen.x=t,this.pen.y=e,this}lineTo(t,e){return this.path+="L"+t+" "+e,this.pen.x=t,this.pen.y=e,this}bezierCurveTo(t,e,i,s,n,a){return this.path+="C"+t+" "+e+","+i+" "+s+","+n+" "+a,this.pen.x=n,this.pen.y=a,this}quadraticCurveTo(t,e,i,s){return this.path+="Q"+t+" "+e+","+i+" "+s,this.pen.x=i,this.pen.y=s,this}arc(t,e,i,s,n,a){const o=t+i*Math.cos(s),r=e+i*Math.sin(s);if(!a&&n-s>=zt||a&&s-n>=zt){const n=t+i*Math.cos(s+Math.PI),a=e+i*Math.sin(s+Math.PI);this.path+=`M${o} ${r} A${i} ${i} 0 0 0 ${n} ${a} `,this.path+=`A${i} ${i} 0 0 0 ${o} ${r}`,this.pen.x=o,this.pen.y=r}else{const h=t+i*Math.cos(n),l=e+i*Math.sin(n);let c;s=f(s),n=f(n),c=Math.abs(n-s)n&&(c=!c);const d=!a;this.path+=`M${o} ${r} A${i} ${i} 0 ${+c} ${+d} ${h} ${l}`,this.pen.x=h,this.pen.y=l}return this}closePath(){return this.path+="Z",this}getShadowStyle(){const t=this.shadow_attributes;return`filter: drop-shadow(0 0 ${t.width/1.5}px ${t.color})`}fill(t){const e=this.create("path");return void 0===t&&(t=Object.assign(Object.assign({},this.attributes),{stroke:"none"})),t.d=this.path,this.shadow_attributes.width>0&&(t.style=this.getShadowStyle()),this.applyAttributes(e,t),this.add(e),this}stroke(){const t=this.create("path"),e=Object.assign(Object.assign({},this.attributes),{fill:"none","stroke-width":this.lineWidth,d:this.path});return this.shadow_attributes.width>0&&(e.style=this.getShadowStyle()),this.applyAttributes(t,e),this.add(t),this}measureText(t){return Kt.measureTextCache.lookup(t,this.svg,this.attributes)}fillText(t,e,i){if(!t||t.length<=0)return this;const s=Object.assign(Object.assign({},this.attributes),{stroke:"none",x:e,y:i}),n=this.create("text");return n.textContent=t,this.applyAttributes(n,s),this.add(n),this}save(){return this.state_stack.push({state:{"font-family":this.state["font-family"],"font-weight":this.state["font-weight"],"font-style":this.state["font-style"],"font-size":this.state["font-size"],scale:this.state.scale},attributes:{"font-family":this.attributes["font-family"],"font-weight":this.attributes["font-weight"],"font-style":this.attributes["font-style"],"font-size":this.attributes["font-size"],fill:this.attributes.fill,stroke:this.attributes.stroke,"stroke-width":this.attributes["stroke-width"],"stroke-dasharray":this.attributes["stroke-dasharray"]},shadow_attributes:{width:this.shadow_attributes.width,color:this.shadow_attributes.color},lineWidth:this.lineWidth}),this}restore(){const t=this.state_stack.pop();if(t){const e=t;this.state["font-family"]=e.state["font-family"],this.state["font-weight"]=e.state["font-weight"],this.state["font-style"]=e.state["font-style"],this.state["font-size"]=e.state["font-size"],this.state.scale=e.state.scale,this.attributes["font-family"]=e.attributes["font-family"],this.attributes["font-weight"]=e.attributes["font-weight"],this.attributes["font-style"]=e.attributes["font-style"],this.attributes["font-size"]=e.attributes["font-size"],this.attributes.fill=e.attributes.fill,this.attributes.stroke=e.attributes.stroke,this.attributes["stroke-width"]=e.attributes["stroke-width"],this.attributes["stroke-dasharray"]=e.attributes["stroke-dasharray"],this.shadow_attributes.width=e.shadow_attributes.width,this.shadow_attributes.color=e.shadow_attributes.color,this.lineWidth=e.lineWidth}return this}set fillStyle(t){this.setFillStyle(t)}get fillStyle(){return this.attributes.fill}set strokeStyle(t){this.setStrokeStyle(t)}get strokeStyle(){return this.attributes.stroke}setFont(t,e,i,s){const n=k.validate(t,e,i,s);this.fontCSSString=k.toCSSString(n);const a={"font-family":n.family,"font-size":n.size,"font-weight":n.weight,"font-style":n.style};return this.attributes=Object.assign(Object.assign({},this.attributes),a),this.state=Object.assign(Object.assign({},this.state),a),this}getFont(){return this.fontCSSString}}var $t,qt,Jt,Qt;Kt.measureTextCache=new class{constructor(){this.cache={}}lookup(t,e,i){let s=this.cache[t];void 0===s&&(s={},this.cache[t]=s);const n=`${i["font-family"]}%${i["font-size"]}%${i["font-weight"]}%${i["font-style"]}`;let a=s[n];return void 0===a&&(a=this.measureImpl(t,e,i),s[n]=a),a}measureImpl(t,e,i){let s=this.txt;s||(s=document.createElementNS(Vt,"text"),this.txt=s),s.textContent=t,s.setAttributeNS(null,"font-family",i["font-family"]),s.setAttributeNS(null,"font-size",i["font-size"]),s.setAttributeNS(null,"font-style",i["font-style"]),s.setAttributeNS(null,"font-weight",i["font-weight"]),e.appendChild(s);const n=s.getBBox();return e.removeChild(s),{x:n.x,y:n.y,width:n.width,height:n.height}}},function(t){t[t.CANVAS=1]="CANVAS",t[t.SVG=2]="SVG"}($t||($t={})),function(t){t[t.NONE=1]="NONE",t[t.UP=2]="UP",t[t.DOWN=3]="DOWN"}(qt||(qt={}));class Zt{constructor(t,e){if(i(t,l.RenderContext))this.ctx=t;else{if(void 0===e)throw new c("InvalidArgument","Missing backend argument");const i=e;let s;if("string"==typeof t){const e=document.getElementById(t);if(!e)throw new c("BadElementId",`Can't find element with ID "${e}"`);s=e}else s=t;if(i===Zt.Backends.CANVAS){if(!Ht(s))throw new c("BadElement","CANVAS context requires an HTMLCanvasElement.");const t=s.getContext("2d");if(!t)throw new c("BadElement","Can't get canvas context");this.ctx=new jt(t)}else{if(i!==Zt.Backends.SVG)throw new c("InvalidBackend",`No support for backend: ${i}`);if(!function(t){if(!t)return!1;const e=d();return"function"==typeof e.HTMLDivElement&&t instanceof e.HTMLDivElement||"function"==typeof t.appendChild&&"object"==typeof t.style}(s))throw new c("BadElement","SVG context requires an HTMLDivElement.");this.ctx=new Kt(s)}}}static buildContext(t,e,i,s,n="#FFF"){const a=new Zt(t,e);i&&s&&a.resize(i,s);const o=a.getContext();return o.setBackgroundFillStyle(n),Zt.lastContext=o,o}static getCanvasContext(t,e,i,s){return Zt.buildContext(t,Zt.Backends.CANVAS,e,i,s)}static getSVGContext(t,e,i,s){return Zt.buildContext(t,Zt.Backends.SVG,e,i,s)}static drawDashedLine(t,e,i,s,n,a){t.beginPath();const o=s-e,r=n-i,h=Math.atan2(r,o);let l=e,c=i;t.moveTo(e,i);let d=0,b=!0;for(;!(o<0?l<=s:l>=s)||!(r<0?c<=n:c>=n);){const e=a[d++%a.length],i=l+Math.cos(h)*e;l=o<0?Math.max(s,i):Math.min(s,i);const g=c+Math.sin(h)*e;c=r<0?Math.max(n,g):Math.min(n,g),b?t.lineTo(l,c):t.moveTo(l,c),b=!b}t.closePath(),t.stroke()}resize(t,e){return this.ctx.resize(t,e),this}getContext(){return this.ctx}}Zt.Backends=$t,Zt.LineEndType=qt,Zt.lastContext=void 0;class te extends O{constructor(t){super(),this.string_number=t,this.setWidth(20),this.position=O.Position.ABOVE,this.x_shift=0,this.y_shift=0,this.text_line=0,this.stem_offset=0,this.x_offset=0,this.y_offset=0,this.dashed=!0,this.leg=Zt.LineEndType.NONE,this.radius=8,this.resetFont()}static get CATEGORY(){return l.StringNumber}static get metrics(){return K.currentMusicFont().getMetrics().glyphs.stringNumber}static format(t,e){const i=e.left_shift,s=e.right_shift;if(!t||0===t.length)return!1;const n=[];let a=null,r=0,h=0;for(let l=0;le.line-t.line));let l=0,d=0,b=0,g=null,m=null;for(let t=0;td?e:d):o===O.Position.RIGHT&&(h.setXShift(l),e+=p,b=e>b?e:b),g=c,m=a}return e.left_shift+=d,e.right_shift+=b,!0}setLineEndType(t){return t>=Zt.LineEndType.NONE&&t<=Zt.LineEndType.DOWN&&(this.leg=t),this}setStringNumber(t){return this.string_number=t,this}setOffsetX(t){return this.x_offset=t,this}setOffsetY(t){return this.y_offset=t,this}setLastNote(t){return this.last_note=t,this}setDashed(t){return this.dashed=t,this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.getModifierStartXY(this.position,this.index),s=e.hasStem()?e.getStemDirection():Q.UP;let n=i.x+this.x_shift+this.x_offset,a={};e.hasStem()&&(a=e.checkStem().getExtents());let o=i.y+this.y_shift+this.y_offset;switch(this.position){case O.Position.ABOVE:o=e.getYs().reduce(((t,e)=>tt>e?t:e)),e.hasStem()&&s==Q.DOWN&&(o=a.topY-te.metrics.stemPadding),o+=this.radius+te.metrics.verticalPadding+this.text_line*K.STAVE_LINE_DISTANCE;break;case O.Position.LEFT:n-=this.radius/2+te.metrics.leftPadding;break;case O.Position.RIGHT:n+=this.radius/2+te.metrics.rightPadding;break;default:throw new c("InvalidPosition",`The position ${this.position} is invalid`)}t.save(),t.beginPath(),t.arc(n,o,this.radius,0,2*Math.PI,!1),t.setLineWidth(1.5),t.stroke(),t.setFont(this.textFont);const h=n-t.measureText(this.string_number).width/2;t.fillText(""+this.string_number,h,o+4.5);const l=this.last_note;if(r(l)){const i=l.getStemX()-e.getX()+5;let s,a;switch(t.setStrokeStyle("#000000"),t.setLineCap("round"),t.setLineWidth(.6),this.dashed?Zt.drawDashedLine(t,n+10,o,n+i,o,[3,3]):Zt.drawDashedLine(t,n+10,o,n+i,o,[3,0]),this.leg){case Zt.LineEndType.UP:s=-10,a=this.dashed?[3,3]:[3,0],Zt.drawDashedLine(t,n+i,o,n+i,o+s,a);break;case Zt.LineEndType.DOWN:s=10,a=this.dashed?[3,3]:[3,0],Zt.drawDashedLine(t,n+i,o,n+i,o+s,a)}}t.restore()}}te.TEXT_FONT={family:k.SANS_SERIF,size:k.SIZE,weight:T.BOLD,style:w.NORMAL};class ee extends O{constructor(t,e){super(),this.options=Object.assign({all_voices:!0},e),this.all_voices=this.options.all_voices,this.type=t,this.position=O.Position.LEFT,this.render_options={font_scale:38},this.resetFont(),this.setXShift(0),this.setWidth(10)}static get CATEGORY(){return l.Stroke}static format(t,e){const i=e.left_shift;if(!t||0===t.length)return!1;const s=t.map((t=>{const e=t.getNote(),i=t.checkIndex();if(o(e)){const{line:s}=e.getKeyProps()[i];return{line:s,shift:e.getLeftDisplacedHeadPx(),stroke:t}}if(h(e)){const{str:s}=e.getPositions()[i];return{line:s,shift:0,stroke:t}}throw new c("Internal","Unexpected instance.")})),n=i,a=s.reduce(((t,{stroke:e,shift:i})=>(e.setXShift(n+i),Math.max(e.getWidth()+0,t))),0);return e.left_shift+=a,!0}getPosition(){return this.position}addEndNote(t){return this.note_end=t,this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.getModifierStartXY(this.position,this.index);let s=e.getYs(),n=i.y,r=i.y;const h=i.x-5,l=e.checkStave().getSpacingBetweenLines(),d=this.checkModifierContext().getMembers(e.getCategory());for(let t=0;t0){s-=o.map((t=>t.getTextHeight())).reduce(((t,e)=>t>e?t:e))/K.STAVE_LINE_DISTANCE+1}else e.top_text_line+=1;for(let e=0;e=t.line?i.above:i.below}}this.placeGlyphOnLine(s,this.checkStave(),t.line),this.glyphs.push(s);const a=this.xPositions[this.xPositions.length-1],o=s.getMetrics().width+n;this.xPositions.push(a+o),this.width+=o}cancelKey(t){return this.formatted=!1,this.cancelKeySpec=t,this}convertToCancelAccList(t){const e=K.keySignature(t),i=this.accList.length>0&&e.length>0&&e[0].type!==this.accList[0].type,s=i?e.length:e.length-this.accList.length;if(s<1)return;const n=[];for(let t=0;t0?e[0].type:void 0;let s;if(this.cancelKeySpec&&(s=this.convertToCancelAccList(this.cancelKeySpec)),this.alterKeySpec&&this.convertToAlterAccList(this.alterKeySpec),this.accList.length>0){const n=(this.position===pt.END?t.getEndClef():t.getClef())||t.getClef();s&&this.convertAccLines(n,s.type,s.accList),this.convertAccLines(n,i,e);for(let t=0;t0?"PlusSmall":"Plus";break;case"(":s=i.length>0?"ParensLeftSmall":"ParensLeft";break;case")":s=i.length>0?"ParensRightSmall":"ParensRight"}const n=new R("timeSig"+s,this.timeSignature.point);this.topGlyphs.push(n),r+=null!==(o=n.getMetrics().width)&&void 0!==o?o:0}let h=0;for(let t=0;t0?e.getYForLine(this.timeSignature.topLine):(e.getYForLine(this.timeSignature.topLine)+e.getYForLine(this.timeSignature.bottomLine))/2;for(let t=0;t{const e=t.split("/");if(2!==e.length&&"+"!==e[0]&&"-"!==e[0])throw new c("BadTimeSignature",`Invalid time spec: ${t}. Must be in the form "/"`);e.forEach((e=>{if(0==/^[0-9+\-()]+$/.test(e))throw new c("BadTimeSignature",`Invalid time spec: ${t}. Must contain valid signatures.`)}))})(t);const s=t.split("/");return{num:!0,glyph:this.makeTimeSignatureGlyph(null!==(e=s[0])&&void 0!==e?e:"",null!==(i=s[1])&&void 0!==i?i:"")}}makeTimeSignatureGlyph(t,e){return new ge(this,t,e,"timeSig0",this.point)}getInfo(){return this.info}setTimeSig(t){return this.info=this.parseTimeSpec(t),this}draw(){const t=this.checkStave(),e=t.checkContext();this.setRendered(),e.openGroup("timesignature",this.getAttribute("id")),this.info.glyph.setStave(t),this.info.glyph.setContext(e),this.placeGlyphOnLine(this.info.glyph,t,this.info.line),this.info.glyph.renderToStave(this.x),e.closeGroup()}}const ue={[vt.CATEGORY]:0,[ae.CATEGORY]:1,[oe.CATEGORY]:2,[me.CATEGORY]:3},pe={[me.CATEGORY]:0,[oe.CATEGORY]:1,[vt.CATEGORY]:2,[ae.CATEGORY]:3};class fe extends A{constructor(t,e,i,s){super(),this.height=0,this.x=t,this.y=e,this.width=i,this.formatted=!1,this.start_x=t+5,this.end_x=t+i,this.modifiers=[],this.measure=0,this.clef="treble",this.endClef=void 0,this.resetFont(),this.options=Object.assign({vertical_bar_width:10,num_lines:5,fill_style:"#999999",left_bar:!0,right_bar:!0,spacing_between_lines_px:K.STAVE_LINE_DISTANCE,space_above_staff_ln:4,space_below_staff_ln:4,top_text_position:1,bottom_text_position:4,line_config:[]},s),this.bounds={x:this.x,y:this.y,w:this.width,h:0},this.defaultLedgerLineStyle={strokeStyle:"#444",lineWidth:1.4},this.resetLines(),this.addModifier(new vt(this.options.left_bar?ft.SINGLE:ft.NONE)),this.addEndModifier(new vt(this.options.right_bar?ft.SINGLE:ft.NONE))}static get CATEGORY(){return l.Stave}static get defaultPadding(){const t=K.currentMusicFont();return t.lookupMetric("stave.padding")+t.lookupMetric("stave.endPaddingMax")}static get rightPadding(){return K.currentMusicFont().lookupMetric("stave.endPaddingMax")}setDefaultLedgerLineStyle(t){this.defaultLedgerLineStyle=t}getDefaultLedgerLineStyle(){return Object.assign(Object.assign({},this.getStyle()),this.defaultLedgerLineStyle)}space(t){return this.options.spacing_between_lines_px*t}resetLines(){this.options.line_config=[];for(let t=0;ti.getWidth()&&(e-=i.getWidth()),e}setRepetitionType(t,e=0){return this.modifiers.push(new re(t,this.x,e)),this}setVoltaType(t,e,i){return this.modifiers.push(new be(t,e,this.x,i)),this}setSection(t,e,i=0,s){const n=new he(t,this.x+i,e);return s&&n.setFontSize(s),this.modifiers.push(n),this}setTempo(t,e){return this.modifiers.push(new le(t,this.x,e)),this}setText(t,e,i={}){return this.modifiers.push(new de(t,e,i)),this}getHeight(){return this.height}getSpacingBetweenLines(){return this.options.spacing_between_lines_px}getBoundingBox(){return new S(this.x,this.y,this.width,this.getBottomY()-this.y)}getBottomY(){const t=this.options,e=t.spacing_between_lines_px;return this.getYForLine(t.num_lines)+t.space_below_staff_ln*e}getBottomLineY(){return this.getYForLine(this.options.num_lines)}getYForLine(t){const e=this.options,i=e.spacing_between_lines_px,s=e.space_above_staff_ln;return this.y+t*i+s*i}getLineForY(t){const e=this.options,i=e.spacing_between_lines_px,s=e.space_above_staff_ln;return(t-this.y)/i-s}getYForTopText(t=0){return this.getYForLine(-t-this.options.top_text_position)}getYForBottomText(t=0){return this.getYForLine(this.options.bottom_text_position+t)}getYForNote(t){const e=this.options,i=e.spacing_between_lines_px,s=e.space_above_staff_ln;return this.y+s*i+5*i-t*i}getYForGlyphs(){return this.getYForLine(3)}addModifier(t,e){return void 0!==e&&t.setPosition(e),t.setStave(this),this.formatted=!1,this.modifiers.push(t),this}addEndModifier(t){return this.addModifier(t,pt.END),this}setBegBarType(t){const{SINGLE:e,REPEAT_BEGIN:i,NONE:s}=ft;return t!==e&&t!==i&&t!==s||(this.modifiers[0].setType(t),this.formatted=!1),this}setEndBarType(t){return t!==ft.REPEAT_BEGIN&&(this.modifiers[1].setType(t),this.formatted=!1),this}setClef(t,e,i,s){void 0===s&&(s=pt.BEGIN),s===pt.END?this.endClef=t:this.clef=t;const n=this.getModifiers(s,ae.CATEGORY);return 0===n.length?this.addClef(t,e,i,s):n[0].setType(t,e,i),this}getClef(){return this.clef}setEndClef(t,e,i){return this.setClef(t,e,i,pt.END),this}getEndClef(){return this.endClef}setKeySignature(t,e,i){void 0===i&&(i=pt.BEGIN);const s=this.getModifiers(i,oe.CATEGORY);return 0===s.length?this.addKeySignature(t,e,i):s[0].setKeySig(t,e),this}setEndKeySignature(t,e){return this.setKeySignature(t,e,pt.END),this}setTimeSignature(t,e,i){void 0===i&&(i=pt.BEGIN);const s=this.getModifiers(i,me.CATEGORY);return 0===s.length?this.addTimeSignature(t,e,i):s[0].setTimeSig(t),this}setEndTimeSignature(t,e){return this.setTimeSignature(t,e,pt.END),this}addKeySignature(t,e,i){return void 0===i&&(i=pt.BEGIN),this.addModifier(new oe(t,e).setPosition(i),i),this}addClef(t,e,i,s){return void 0===s||s===pt.BEGIN?this.clef=t:s===pt.END&&(this.endClef=t),this.addModifier(new ae(t,e,i),s),this}addEndClef(t,e,i){return this.addClef(t,e,i,pt.END),this}addTimeSignature(t,e,i){return this.addModifier(new me(t,e),i),this}addEndTimeSignature(t,e){return this.addTimeSignature(t,e,pt.END),this}addTrebleGlyph(){return this.addClef("treble"),this}getModifiers(t,e){const i=void 0===t,s=void 0===e;return i&&s?this.modifiers:i?this.modifiers.filter((t=>e===t.getCategory())):s?this.modifiers.filter((e=>t===e.getPosition())):this.modifiers.filter((i=>t===i.getPosition()&&e===i.getCategory()))}sortByCategory(t,e){for(let i=t.length-1;i>=0;i--)for(let s=0;se[t[s+1].getCategory()]){const e=t[s];t[s]=t[s+1],t[s+1]=e}}format(){const t=this.modifiers[0],e=this.modifiers[1],i=this.getModifiers(pt.BEGIN),n=this.getModifiers(pt.END);let a,o,r;this.sortByCategory(i,ue),this.sortByCategory(n,pe),i.length>1&&t.getType()===ft.REPEAT_BEGIN&&(i.push(i.splice(0,1)[0]),i.splice(0,0,new vt(ft.SINGLE))),n.indexOf(e)>0&&n.splice(0,0,new vt(ft.NONE));let h=0,l=this.x;for(let t=0;t0){t.save(),t.setFont(this.textFont);const e=t.measureText(""+this.measure).width;n=this.getYForTopText(0)+3,t.fillText(""+this.measure,this.x-e/2,n),t.restore()}return t.closeGroup(),this}getVerticalBarWidth(){return this.options.vertical_bar_width}getConfigForLines(){return this.options.line_config}setConfigForLine(t,e){if(t>=this.options.num_lines||t<0)throw new c("StaveConfigError","The line number must be within the range of the number of lines in the Stave.");if(void 0===e.visible)throw new c("StaveConfigError","The line configuration object is missing the 'visible' property.");if("boolean"!=typeof e.visible)throw new c("StaveConfigError","The line configuration objects 'visible' property must be true or false.");return this.options.line_config[t]=e,this}setConfigForLines(t){if(t.length!==this.options.num_lines)throw new c("StaveConfigError","The length of the lines configuration array must match the number of lines in the Stave");for(const e in t)null==t[e].visible&&(t[e]=this.options.line_config[e]),this.options.line_config[e]=Object.assign(Object.assign({},this.options.line_config[e]),t[e]);return this.options.line_config=t,this}}function _e(t,e,i,s,n){if(e!==xe.type.BOLD_DOUBLE_LEFT&&e!==xe.type.BOLD_DOUBLE_RIGHT)throw new c("InvalidConnector","A REPEAT_BEGIN or REPEAT_END type must be provided.");let a=3,o=3.5;e===xe.type.BOLD_DOUBLE_RIGHT&&(a=-5,o=3),t.fillRect(i+a,s,1,n-s),t.fillRect(i-2,s,o,n-s)}fe.TEXT_FONT={family:k.SANS_SERIF,size:8,weight:T.NORMAL,style:w.NORMAL};class xe extends A{constructor(t,e){super(),this.thickness=K.STAVE_LINE_THICKNESS,this.width=3,this.top_stave=t,this.bottom_stave=e,this.type=xe.type.DOUBLE,this.resetFont(),this.x_shift=0,this.texts=[]}static get CATEGORY(){return l.StaveConnector}setType(t){return(t="string"==typeof t?xe.typeString[t]:t)>=xe.type.SINGLE_RIGHT&&t<=xe.type.NONE&&(this.type=t),this}setText(t,e={}){return this.texts.push({content:t,options:Object.assign({shift_x:0,shift_y:0},e)}),this}setXShift(t){if("number"!=typeof t)throw new c("InvalidType","x_shift must be a Number");return this.x_shift=t,this}getXShift(){return this.x_shift}draw(){const t=this.checkContext();this.setRendered();let e=this.top_stave.getYForLine(0),i=this.bottom_stave.getYForLine(this.bottom_stave.getNumLines()-1)+this.thickness,s=this.width,n=this.top_stave.getX();(this.type===xe.type.SINGLE_RIGHT||this.type===xe.type.BOLD_DOUBLE_RIGHT||this.type===xe.type.THIN_DOUBLE)&&(n=this.top_stave.getX()+this.top_stave.getWidth());let a=i-e;switch(this.type){case xe.type.SINGLE:case xe.type.SINGLE_LEFT:case xe.type.SINGLE_RIGHT:s=1;break;case xe.type.DOUBLE:n-=this.width+2,e-=this.thickness,a+=.5;break;case xe.type.BRACE:{s=12;const n=this.top_stave.getX()-2+this.x_shift,o=e,r=n,h=i,l=n-s,c=o+a/2,d=l-.9*s,b=o+.2*a,g=n+1.1*s,m=c-.135*a,u=g,p=c+.135*a,f=d,_=h-.2*a,x=l-s,S=_,y=n+.4*s,T=c+.135*a,w=y,v=c-.135*a,E=x,C=b;t.beginPath(),t.moveTo(n,o),t.bezierCurveTo(d,b,g,m,l,c),t.bezierCurveTo(u,p,f,_,r,h),t.bezierCurveTo(x,S,y,T,l,c),t.bezierCurveTo(w,v,E,C,n,o),t.fill(),t.stroke();break}case xe.type.BRACKET:e-=6,i+=6,a=i-e,R.renderGlyph(t,n-5,e,40,"bracketTop"),R.renderGlyph(t,n-5,i,40,"bracketBottom"),n-=this.width+2;break;case xe.type.BOLD_DOUBLE_LEFT:_e(t,this.type,n+this.x_shift,e,i-this.thickness);break;case xe.type.BOLD_DOUBLE_RIGHT:_e(t,this.type,n,e,i-this.thickness);break;case xe.type.THIN_DOUBLE:s=1,a-=this.thickness;break;case xe.type.NONE:break;default:throw new c("InvalidType",`The provided StaveConnector.type (${this.type}) is invalid.`)}this.type!==xe.type.BRACE&&this.type!==xe.type.BOLD_DOUBLE_LEFT&&this.type!==xe.type.BOLD_DOUBLE_RIGHT&&this.type!==xe.type.NONE&&t.fillRect(n,e,s,a),this.type===xe.type.THIN_DOUBLE&&t.fillRect(n-3,e,s,a),t.save(),t.setLineWidth(2),t.setFont(this.textFont);for(let e=0;et.reduce(((t,e)=>t+e),0);function ye(t,e,i){const s=we.getResolutionMultiplier(t),n={},a=[],o=[];return t.forEach(((t,r)=>{const h=new _(0,s);t.getTickables().forEach((t=>{const s=h.numerator;if(!n[s]){const t=e({tickID:s});o.push(t),n[s]=t,a.push(s)}i(t,n[s],r),h.add(t.getTicks())}))})),{map:n,array:o,list:a.sort(((t,e)=>t-e)),resolutionMultiplier:s}}function Te(t,e,i,s){let n=e;for(let e=i+1;e{e.addToModifierContext(new ne);const s=(new Ot).addTickable(e).preFormat(),n=s.getMetrics();return s.setX(t+n.totalLeftPx),t+s.getWidth()+n.totalRightPx+i}),e)}static plotDebugging(t,e,i,s,n,a){const o=i+(a=Object.assign({stavePadding:K.currentMusicFont().lookupMetric("stave.padding")},a)).stavePadding,r=e.contextGaps;t.save(),t.setFont(k.SANS_SERIF,8),r.gaps.forEach((e=>{var i,a,r;i=o+e.x1,a=o+e.x2,r="rgba(100,200,100,0.4)",t.beginPath(),t.setStrokeStyle(r),t.setFillStyle(r),t.setLineWidth(1),t.fillRect(i,s,Math.max(a-i,0),n-s),t.setFillStyle("green"),t.fillText(Math.round(e.x2-e.x1).toString(),o+e.x1,n+12)})),t.setFillStyle("red"),t.fillText(`Loss: ${(e.totalCost||0).toFixed(2)} Shift: ${(e.totalShift||0).toFixed(2)} Gap: ${r.total.toFixed(2)}`,o-20,n+27),t.restore()}static FormatAndDraw(t,e,i,s){let n={auto_beam:!1,align_rests:!1};"object"==typeof s?n=Object.assign(Object.assign({},n),s):"boolean"==typeof s&&(n.auto_beam=s);const a=new Bt(K.TIME4_4).setMode(Bt.Mode.SOFT).addTickables(i),o=n.auto_beam?Ne.applyAndGetBeams(a):[];return(new we).joinVoices([a]).formatToStave([a],e,{align_rests:n.align_rests,stave:e}),a.setStave(e).draw(t,e),o.forEach((e=>e.setContext(t).draw())),a.getBoundingBox()}static FormatAndDrawTab(t,e,i,s,n,a,o){let r={auto_beam:a,align_rests:!1};"object"==typeof o?r=Object.assign(Object.assign({},r),o):"boolean"==typeof o&&(r.auto_beam=o);const h=new Bt(K.TIME4_4).setMode(Bt.Mode.SOFT).addTickables(n),l=new Bt(K.TIME4_4).setMode(Bt.Mode.SOFT).addTickables(s),c=r.auto_beam?Ne.applyAndGetBeams(h):[];(new we).joinVoices([h]).joinVoices([l]).formatToStave([h,l],i,{align_rests:r.align_rests}),h.draw(t,i),l.draw(t,e),c.forEach((e=>e.setContext(t).draw())),new xe(i,e).setContext(t).draw()}static AlignRestsToNotes(t,e,i){t.forEach(((s,n)=>{if(o(s)&&s.isRest()){if(s.getTuplet()&&!i)return;const a=s.getGlyph().position.toUpperCase();if("R/4"!==a&&"B/4"!==a)return;if(e||s.getBeam()){const e=s.getKeyProps()[0];if(0===n)e.line=Te(t,e.line,n,!1);else if(n>0&&nwe.AlignRestsToNotes(t.getTickables(),e)))}preCalculateMinTotalWidth(t){const e=K.currentMusicFont().lookupMetric("stave.unalignedNotePadding");let i=0,s=0,n=0;const a=[],o=[];if(this.hasMinTotalWidth)return this.minTotalWidth;if(!this.tickContexts){if(!t)throw new c("BadArgument","'voices' required to run preCalculateMinTotalWidth");this.createTickContexts(t)}const{list:r,map:h}=this.tickContexts;this.minTotalWidth=0,r.forEach((e=>{const r=h[e];r.preFormat(),r.getTickables().length{s+=t.getMetrics().width,n+=t.getTicks().value(),a.push(t.getMetrics().width),o.push(t.getTicks().value())}));const l=r.getWidth();this.minTotalWidth+=l})),this.hasMinTotalWidth=!0;const l=s>0?s/a.length:1/a.length,d=Se(a.map((t=>Math.pow(t-l,2)))),b=Math.pow(d/a.length,.5)/l,g=n/o.length,m=Se(o.map((t=>Math.pow(t-g,2)))),u=Math.pow(m/o.length,.5)/g,p=Math.max(u,b)*r.length*e,f=e*i;return this.minTotalWidth+Math.max(f,p)}getMinTotalWidth(){if(!this.hasMinTotalWidth)throw new c("NoMinTotalWidth","Call 'preCalculateMinTotalWidth' or 'preFormat' before calling 'getMinTotalWidth'");return this.minTotalWidth}static getResolutionMultiplier(t){if(!t||!t.length)throw new c("BadArgument","No voices to format");const e=t[0].getTotalTicks();return t.reduce(((t,i)=>{if(!i.getTotalTicks().equals(e))throw new c("TickMismatch","Voices should have same total note duration in ticks.");if(i.getMode()===Bt.Mode.STRICT&&!i.isComplete())throw new c("IncompleteVoice","Voice does not have enough notes.");return Math.max(t,_.LCM(t,i.getResolutionMultiplier()))}),1)}createModifierContexts(t){const e=ye(t,(()=>new ne),((t,e)=>t.addToModifierContext(e)));return this.modifierContexts=e,e}createTickContexts(t){const e=ye(t,(t=>new Ot(t)),((t,e,i)=>e.addTickable(t,i)));this.tickContexts=e;const i=this.tickContexts.array;return i.forEach((t=>{t.tContexts=i})),e}preFormat(t=0,e,i,s){const n=this.tickContexts;if(!n)throw new c("NoTickContexts","preFormat requires TickContexts");const{list:a,map:o}=n;this.lossHistory=[],i&&s&&i.forEach((t=>t.setStave(s).preFormat()));let r=0,h=0;this.minTotalWidth=0;let l=0;a.forEach((t=>{const e=o[t];e.preFormat();const i=e.getWidth();this.minTotalWidth+=i;const s=e.getMaxTicks().value();l+=s;const n=e.getMetrics();r=r+h+n.totalLeftPx,e.setX(r),h=i-n.totalLeftPx}));const{globalSoftmax:d,softmaxFactor:g,maxIterations:m}=this.formatterOptions,u=Se(a.map((t=>Math.pow(g,o[t].getMaxTicks().value()/l))));if(this.minTotalWidth=r+h,this.hasMinTotalWidth=!0,t<=0)return this.evaluate();const p=o[a[0]],f=o[a[a.length-1]];function _(t){return a.map(((e,i)=>{const s=o[e],n=s.getTickablesByVoice();let r;if(i>0){const e=o[a[i-1]];for(let h=i-1;h>=0;h--){const i=o[a[h]].getTickablesByVoice(),c=[];if(Object.keys(n).forEach((t=>{i[t]&&c.push(t)})),c.length>0){let a=0,o=1/0,h=0;if(c.forEach((t=>{const e=i[t].getTicks().value();e>a&&(r=i[t],a=e);const s=n[t],h=s.getX()-(s.getMetrics().modLeftPx+s.getMetrics().leftDisplacedHeadPx),l=i[t].getMetrics(),c=i[t].getX()+l.notePx+l.modRightPx+l.rightDisplacedHeadPx;o=Math.min(o,h-c)})),o=Math.min(o,s.getX()-(e.getX()+.05*t)),d){const e=l;h=Math.pow(g,a/e)/u*t}else void 0!==r&&(h=r.getVoice().softmax(a)*t);return{expectedDistance:h,maxNegativeShiftPx:o,fromTickable:r}}}}return{expectedDistance:0,fromTickablePx:0,maxNegativeShiftPx:0}}))}function x(t){const e=S/2;let i=0;return a.forEach(((s,n)=>{const a=o[s];if(n>0){const e=a.getX(),s=t[n],o=b(s.fromTickable).getX()+s.expectedDistance-(e+i);let r=0;o>0?i+=o:o<0&&(r=Math.min(s.maxNegativeShiftPx,Math.abs(o)),i+=-r),a.setX(e+i)}a.getCenterAlignedTickables().forEach((t=>{t.setCenterXShift(e-a.getX())}))})),f.getX()-p.getX()}const S=t-f.getMetrics().notePx-f.getMetrics().totalRightPx-p.getMetrics().totalLeftPx,y=K.currentMusicFont(),T=y.lookupMetric("stave.endPaddingMin"),w=y.lookupMetric("stave.endPaddingMax");let v=S;const E=_(v);let C=x(E);const k=((t,e)=>{let i=t/2;if(e.length>1)for(let t=1;tN&&A>0||C+D1;)v-=C-N,C=x(_(v)),A--;return this.justifyWidth=t,this.evaluate()}evaluate(){if(!this.tickContexts)return 0;const t=this.tickContexts,e=this.justifyWidth;this.contextGaps={total:0,gaps:[]},t.list.forEach(((e,i)=>{if(0===i)return;const s=t.list[i-1],n=t.map[s],a=t.map[e],o=n.getMetrics(),r=a.getMetrics(),h=n.getX()+o.notePx+o.totalRightPx,l=a.getX()-r.totalLeftPx,c=l-h;this.contextGaps.total+=c,this.contextGaps.gaps.push({x1:h,x2:l}),a.getFormatterMetrics().freedom.left=c,n.getFormatterMetrics().freedom.right=c})),this.durationStats={};const i=this.durationStats;this.voices.forEach((t=>{t.getTickables().forEach(((t,s,n)=>{const a=t.getTicks().clone().simplify().toString(),o=t.getMetrics(),r=t.getFormatterMetrics(),h=t.getX()+o.notePx+o.modRightPx+o.rightDisplacedHeadPx;let l=0;if(s{t.getTickables().forEach((t=>{const e=t.getTicks().clone().simplify().toString(),n=t.getFormatterMetrics();n.space.mean=i[e].mean,n.duration=e,n.iterations+=1,n.space.deviation=n.space.used-n.space.mean,s+=Math.pow(n.space.deviation,2)}))})),this.totalCost=Math.sqrt(s),this.lossHistory.push(this.totalCost),this.totalCost}tune(t){var e;const i=this.tickContexts;if(!i)return 0;const s=null!==(e=null==t?void 0:t.alpha)&&void 0!==e?e:.5;let n=0;return this.totalShift=0,i.list.forEach(((t,e,a)=>{const o=i.map[t],r=e>0?i.map[a[e-1]]:void 0,h=et.getFormatterMetrics().space.deviation)));l>0?n=-Math.min(o.getFormatterMetrics().freedom.right,Math.abs(l)):l<0&&(n=h?Math.min(h.getFormatterMetrics().freedom.right,Math.abs(l)):0),n*=s,this.totalShift+=n})),this.evaluate()}postFormat(){const t=t=>t.list.forEach((e=>t.map[e].postFormat()));return this.modifierContexts&&t(this.modifierContexts),this.tickContexts&&t(this.tickContexts),this}joinVoices(t){return this.createModifierContexts(t),this.hasMinTotalWidth=!1,this}format(t,e,i){const s=Object.assign({align_rests:!1},i);this.voices=t;const n=this.formatterOptions.softmaxFactor;return n&&this.voices.forEach((t=>t.setSoftmaxFactor(n))),this.alignRests(t,s.align_rests),this.createTickContexts(t),this.preFormat(e,s.context,t,s.stave),s.stave&&this.postFormat(),this}formatToStave(t,e,i){const s=Object.assign({context:e.getContext()},i),n=e.getNoteEndX()-e.getNoteStartX()-fe.defaultPadding;return function(...t){we.DEBUG&&g("Vex.Flow.Formatter",t)}("Formatting voices to width: ",n),this.format(t,n,s)}getTickContext(t){var e;return null===(e=this.tickContexts)||void 0===e?void 0:e.map[t]}}var ve;we.DEBUG=!1,function(t){t[t.BOTTOM=-1]="BOTTOM",t[t.TOP=1]="TOP"}(ve||(ve={}));class Ee extends A{constructor(t,e={}){if(super(),this.numerator_glyphs=[],this.denom_glyphs=[],!t||!t.length)throw new c("BadArguments","No notes provided for tuplet.");this.options=e,this.notes=t,this.num_notes=null!=this.options.num_notes?this.options.num_notes:t.length,this.options.beats_occupied&&this.beatsOccupiedDeprecationWarning(),this.notes_occupied=this.options.notes_occupied||this.options.beats_occupied||2,null!=this.options.bracketed?this.bracketed=this.options.bracketed:this.bracketed=t.some((t=>!t.hasBeam())),this.ratioed=null!=this.options.ratioed?this.options.ratioed:Math.abs(this.notes_occupied-this.num_notes)>1,this.point=K.currentMusicFont().lookupMetric("digits.tupletPoint"),this.y_pos=16,this.x_pos=100,this.width=200,this.setTupletLocation(this.options.location||Ee.LOCATION_TOP),we.AlignRestsToNotes(t,!0,!0),this.resolveGlyphs(),this.attach()}static get CATEGORY(){return l.Tuplet}static get LOCATION_TOP(){return ve.TOP}static get LOCATION_BOTTOM(){return ve.BOTTOM}static get NESTING_OFFSET(){return 15}static get metrics(){return K.currentMusicFont().getMetrics().glyphs.tuplet}attach(){for(let t=0;t=1;)this.numerator_glyphs.unshift(new R("timeSig"+t%10,this.point)),t=parseInt((t/10).toString(),10);for(this.denom_glyphs=[],t=this.notes_occupied;t>=1;)this.denom_glyphs.unshift(new R("timeSig"+t%10,this.point)),t=parseInt((t/10).toString(),10)}getNestedTupletCount(){const t=this.location,e=this.notes[0];let i=n(e,t),s=n(e,t);function n(t,e){return t.getTupletStack().filter((t=>t.location===e)).length}return this.notes.forEach((e=>{const a=n(e,t);i=a>i?a:i,s=a0&&(s=Math.min(a,s))}}}else{let t=Ee.metrics.bottomLine;this.notes.forEach((e=>{const i=e.getModifierContext();i&&(t=Math.max(t,i.getState().text_line+1))})),s=i.checkStave().getYForLine(t)+Ee.metrics.noteHeadOffset;for(let t=0;ts&&(s=e)}}return s+t+e}draw(){const t=this.checkContext();this.setRendered();const e=this.notes[0],i=this.notes[this.notes.length-1];this.bracketed?(this.x_pos=e.getTieLeftX()-5,this.width=i.getTieRightX()-this.x_pos+5):(this.x_pos=e.getStemX(),this.width=i.getStemX()-this.x_pos),this.y_pos=this.getYPosition();const s=(t,e)=>t+b(e.getMetrics().width);let n=this.numerator_glyphs.reduce(s,0);this.ratioed&&(n=this.denom_glyphs.reduce(s,n),n+=.32*this.point);const a=this.x_pos+this.width/2-n/2;if(this.bracketed){const e=this.width/2-n/2-5;e>0&&(t.fillRect(this.x_pos,this.y_pos,e,1),t.fillRect(this.x_pos+this.width/2+n/2+5,this.y_pos,e,1),t.fillRect(this.x_pos,this.y_pos+(this.location===Ee.LOCATION_BOTTOM?1:0),1,10*this.location),t.fillRect(this.x_pos+this.width,this.y_pos+(this.location===Ee.LOCATION_BOTTOM?1:0),1,10*this.location))}const o=K.currentMusicFont().lookupMetric("digits.shiftY",0);let r=0;if(this.numerator_glyphs.forEach((e=>{e.render(t,a+r,this.y_pos+this.point/3-2+o),r+=b(e.getMetrics().width)})),this.ratioed){const e=a+r+.16*this.point,i=.06*this.point;t.beginPath(),t.arc(e,this.y_pos-.08*this.point,i,0,2*Math.PI,!0),t.closePath(),t.fill(),t.beginPath(),t.arc(e,this.y_pos+.12*this.point,i,0,2*Math.PI,!0),t.closePath(),t.fill(),r+=.32*this.point,this.denom_glyphs.forEach((e=>{e.render(t,a+r,this.y_pos+this.point/3-2+o),r+=b(e.getMetrics().width)}))}}}function Ce(t){let e=0;return t.forEach((t=>{t.keyProps&&t.keyProps.forEach((t=>{e+=t.line-3}))})),e>=0?Q.DOWN:Q.UP}const ke="L",De="B";class Ne extends A{constructor(t,e=!1){if(super(),this.slope=0,this.y_shift=0,!t||0===t.length)throw new c("BadArguments","No notes provided for beam.");if(1===t.length)throw new c("BadArguments","Too few notes for beam.");if(this.ticks=t[0].getIntrinsicTicks(),this.ticks>=K.durationToTicks("4"))throw new c("BadArguments","Beams can only be applied to notes shorter than a quarter note.");let i,s;for(this.stem_direction=Q.UP,i=0;it+e.getStemDirection()),0);n=e>-1?Q.UP:Q.DOWN}for(i=0;i(new _).parse(t)));{const e=parseInt(t.split("/")[0],10),i=parseInt(t.split("/")[1],10);if(e%3==0)return[new _(3,i)];if(i>4)return[new _(2,i)];if(i<=4)return[new _(1,i)]}return[new _(1,4)]}static applyAndGetBeams(t,e,i){return Ne.generateBeams(t.getTickables(),{groups:i,stem_direction:e})}static generateBeams(t,e={}){e.groups&&e.groups.length||(e.groups=[new _(2,8)]);const i=e.groups.map((t=>{if(!t.multiply)throw new c("InvalidBeamGroups","The beam groups must be an array of Vex.Flow.Fractions");return t.clone().multiply(K.RESOLUTION,1)})),s=t;let n=0,a=[],o=[];function r(){i.length-1>n?n+=1:n=0}!function(){let t=[],e=new _(0,1);s.forEach((s=>{if(t=[],s.shouldIgnoreTicks())return a.push(o),void(o=t);o.push(s);const h=i[n].clone(),l=(c=o,c.reduce(((t,e)=>e.getTicks().clone().add(t)),new _(0,1))).add(e);var c;const d=K.durationToNumber(s.getDuration())<8;if(d&&s.getTuplet()&&(h.numerator*=2),l.greaterThan(h)){if(!d){const e=o.pop();e&&t.push(e)}a.push(o);do{e=l.subtract(i[n]),r()}while(e.greaterThanEquals(i[n]));o=t}else l.equals(h)&&(a.push(o),e=new _(0,1),o=t,r())})),o.length>0&&a.push(o)}(),function(){const t=[];a.forEach((i=>{let s=[];i.forEach(((i,n,a)=>{const o=0===n||n===a.length-1,r=a[n-1],h=!e.beam_rests&&i.isRest(),l=e.beam_rests&&e.beam_middle_only&&i.isRest()&&o;let c=!1;if(e.maintain_stem_directions&&r&&!i.isRest()&&!r.isRest()){const t=r.getStemDirection();c=i.getStemDirection()!==t}const d=parseInt(i.getDuration(),10)<8;h||l||c||d?(s.length>0&&t.push(s),s=c?[i]:[]):s.push(i)})),s.length>0&&t.push(s)})),a=t}(),a.forEach((t=>{let i;if(e.maintain_stem_directions){const e=function(t){for(let e=0;e{t.setStemDirection(e)}))}(t,i)}));const h=a.filter((t=>{if(t.length>1){let e=!0;return t.forEach((t=>{t.getIntrinsicTicks()>=K.durationToTicks("4")&&(e=!1)})),e}return!1})),l=function(){const t=[];return a.forEach((e=>{let i;e.forEach((e=>{const s=e.getTuplet();s&&i!==s&&(i=s,t.push(i))}))})),t}(),d=[];return h.forEach((t=>{const i=new Ne(t);e.show_stemlets&&(i.render_options.show_stemlets=!0),e.secondary_breaks&&(i.render_options.secondary_break_ticks=K.durationToTicks(e.secondary_breaks)),!0===e.flat_beams&&(i.render_options.flat_beams=!0,i.render_options.flat_beam_offset=e.flat_beam_offset),d.push(i)})),l.forEach((t=>{const e=t.notes[0].stem_direction===Q.DOWN?ve.BOTTOM:ve.TOP;t.setTupletLocation(e);let i=!1;for(let e=0;et.getGlyph().beam_count)).reduce(((t,e)=>e>t?e:t))}breakSecondaryAt(t){return this.break_on_indices=t,this}getSlopeY(t,e,i,s){return i+(t-e)*s}calculateSlope(){const{notes:t,stem_direction:e,render_options:{max_slope:i,min_slope:s,slope_iterations:n,slope_cost:a}}=this,o=t[0],r=function(t,e){const i=t.getStemExtents().topY,s=t.getStemX();return(e.getStemExtents().topY-i)/(e.getStemX()-s)}(o,t[t.length-1]),h=(i-s)/n;let l=Number.MAX_VALUE,c=0,d=0;for(let n=s;n<=i;n+=h){let i=0,s=0;for(let a=1;an)&&(h=n,o=Math.min(...s.getYs()),r=s.getBeamCount())}let l=a/t.length;const c=s+r*(1.5*i),d=o+c*-e;e===Q.DOWN&&ld&&(l=o-c),n?(e===Q.DOWN&&l>n||e===Q.UP&&l=8&&(c=-1!==this.break_on_indices.indexOf(h),this.render_options.secondary_break_ticks&&r>=this.render_options.secondary_break_ticks&&(r=0,c=!0));const d=l.getIntrinsicTicks(){const i=e.getStem();i&&i.setContext(t).draw()}),this)}drawBeamLines(t){const e=["4","8","16","32","64"],i=this.notes[0];let s=this.getBeamYToDraw();const n=i.getStemX(),a=this.render_options.beam_width*this.stem_direction;for(let i=0;i0||!0===e;return!e||n>0||(this.pos=s),o?this.matchSuccess():this.matchFail(s),{success:o,results:i,numMatches:n}}expectZeroOrMore(t){return this.expectOneOrMore(t,!0)}expect(t){if(Me("Evaluating rule function:",t),!t)throw new c("Invalid rule function");let e;const i=t.bind(this.grammar)();if(i.token)e=this.matchToken(i.token,!0===i.noSpace),e.success&&(this.pos+=e.incrementPos);else{if(!i.expect)throw Me(i),new c("Bad grammar! No `token` or `expect` property "+i);e=i.oneOrMore?this.expectOneOrMore(i):i.zeroOrMore?this.expectZeroOrMore(i):this.expectOne(i)}const s=[];return e.matches=s,e.results&&e.results.forEach((t=>s.push(Re(t)))),i.run&&e.success&&i.run({matches:s}),e}}function Le(...t){je.DEBUG&&g("Vex.Flow.EasyScore",t)}Oe.DEBUG=!1;class Ie{constructor(t){this.builder=t}begin(){return this.LINE}LINE(){return{expect:[this.PIECE,this.PIECES,this.EOL]}}PIECE(){return{expect:[this.CHORDORNOTE,this.PARAMS],run:()=>this.builder.commitPiece()}}PIECES(){return{expect:[this.COMMA,this.PIECE],zeroOrMore:!0}}PARAMS(){return{expect:[this.DURATION,this.TYPE,this.DOTS,this.OPTS]}}CHORDORNOTE(){return{expect:[this.CHORD,this.SINGLENOTE],or:!0}}CHORD(){return{expect:[this.LPAREN,this.NOTES,this.RPAREN],run:t=>this.builder.addChord(t.matches[1])}}NOTES(){return{expect:[this.NOTE],oneOrMore:!0}}NOTE(){return{expect:[this.NOTENAME,this.ACCIDENTAL,this.OCTAVE]}}SINGLENOTE(){return{expect:[this.NOTENAME,this.ACCIDENTAL,this.OCTAVE],run:t=>{const e=t;this.builder.addSingleNote(e.matches[0],e.matches[1],e.matches[2])}}}ACCIDENTAL(){return{expect:[this.MICROTONES,this.ACCIDENTALS],maybe:!0,or:!0}}DOTS(){return{expect:[this.DOT],zeroOrMore:!0,run:t=>this.builder.setNoteDots(t.matches)}}TYPE(){return{expect:[this.SLASH,this.MAYBESLASH,this.TYPES],maybe:!0,run:t=>this.builder.setNoteType(t.matches[2])}}DURATION(){return{expect:[this.SLASH,this.DURATIONS],maybe:!0,run:t=>this.builder.setNoteDuration(t.matches[1])}}OPTS(){return{expect:[this.LBRACKET,this.KEYVAL,this.KEYVALS,this.RBRACKET],maybe:!0}}KEYVALS(){return{expect:[this.COMMA,this.KEYVAL],zeroOrMore:!0}}KEYVAL(){return{expect:[this.KEY,this.EQUALS,this.VAL],run:t=>this.builder.addNoteOption(t.matches[0],t.matches[2].slice(1,-1))}}VAL(){return{expect:[this.SVAL,this.DVAL],or:!0}}KEY(){return{token:"[a-zA-Z][a-zA-Z0-9]*"}}DVAL(){return{token:'["][^"]*["]'}}SVAL(){return{token:"['][^']*[']"}}NOTENAME(){return{token:"[a-gA-G]"}}OCTAVE(){return{token:"[0-9]+"}}ACCIDENTALS(){return{token:"bb|b|##|#|n"}}MICROTONES(){return{token:"bbs|bss|bs|db|d|\\+\\+-|\\+-|\\+\\+|\\+|k|o"}}DURATIONS(){return{token:"[0-9whq]+"}}TYPES(){return{token:"[rRsSmMhHgG]"}}LPAREN(){return{token:"[(]"}}RPAREN(){return{token:"[)]"}}COMMA(){return{token:"[,]"}}DOT(){return{token:"[.]"}}SLASH(){return{token:"[/]"}}MAYBESLASH(){return{token:"[/]?"}}EQUALS(){return{token:"[=]"}}LBRACKET(){return{token:"\\["}}RBRACKET(){return{token:"\\]"}}EOL(){return{token:"$"}}}class We{constructor(t){this.chord=[],this.dots=0,this.options={},this.duration=t}}class Ue{constructor(t){this.commitHooks=[],this.factory=t,this.reset()}reset(t){this.options=Object.assign({stem:"auto",clef:"treble"},t),this.elements={notes:[],accidentals:[]},this.rollingDuration="8",this.resetPiece()}getFactory(){return this.factory}getElements(){return this.elements}addCommitHook(t){this.commitHooks.push(t)}resetPiece(){Le("resetPiece"),this.piece=new We(this.rollingDuration)}setNoteDots(t){Le("setNoteDots:",t),t&&(this.piece.dots=t.length)}setNoteDuration(t){Le("setNoteDuration:",t),this.rollingDuration=this.piece.duration=t||this.rollingDuration}setNoteType(t){Le("setNoteType:",t),t&&(this.piece.type=t)}addNoteOption(t,e){Le("addNoteOption: key:",t,"value:",e),this.piece.options[t]=e}addNote(t,e,i){Le("addNote:",t,e,i),this.piece.chord.push({key:t,accid:e,octave:i})}addSingleNote(t,e,i){Le("addSingleNote:",t,e,i),this.addNote(t,e,i)}addChord(t){Le("startChord"),"object"!=typeof t[0]?this.addSingleNote(t[0]):t.forEach((t=>{t&&this.addNote(...t)})),Le("endChord")}commitPiece(){Le("commitPiece");const{factory:t}=this;if(!t)return;const e=Object.assign(Object.assign({},this.options),this.piece.options),i=b(e.stem,"BadArguments","options.stem is not defined").toLowerCase(),s=b(e.clef,"BadArguments","options.clef is not defined").toLowerCase(),{chord:n,duration:a,dots:o,type:r}=this.piece,h=L.accidentals,l=n.map((t=>{var e;return t.key+(h.includes(null!==(e=t.accid)&&void 0!==e?e:"")?t.accid:"")+"/"+t.octave})),c="auto"===i,d="g"==(null==r?void 0:r.toLowerCase())?t.GhostNote({duration:a,dots:o}):t.StaveNote({keys:l,duration:a,dots:o,type:r,clef:s,auto_stem:c});c||d.setStemDirection("up"===i?Q.UP:Q.DOWN);const g=[];n.forEach(((e,i)=>{const s=e.accid;if("string"==typeof s){const e=t.Accidental({type:s});d.addModifier(e,i),g.push(e)}else g.push(void 0)}));for(let t=0;tt(e,d,this))),this.elements.notes.push(d),this.elements.accidentals.push(g),this.resetPiece()}}function Ge(t,e){void 0!==t.id&&e.setAttribute("id",t.id)}const Ye=/\s*,\s*/;function He(t,e){void 0!==t.class&&t.class.split(Ye).forEach((t=>e.addClass(t)))}class je{constructor(t={}){this.defaults={clef:"treble",time:"4/4",stem:"auto"},this.setOptions(t)}set(t){return this.defaults=Object.assign(Object.assign({},this.defaults),t),this}setOptions(t){var e,i;const s=t.factory,n=null!==(e=t.builder)&&void 0!==e?e:new Ue(s);return this.options=Object.assign(Object.assign({commitHooks:[Ge,He,bt.easyScoreHook,At.easyScoreHook],throwOnError:!1},t),{factory:s,builder:n}),this.factory=s,this.builder=n,this.grammar=new Ie(this.builder),this.parser=new Oe(this.grammar),null===(i=this.options.commitHooks)||void 0===i||i.forEach((t=>this.addCommitHook(t))),this}setContext(t){return this.factory.setContext(t),this}parse(t,e={}){this.builder.reset(e);const i=this.parser.parse(t);if(!i.success&&this.options.throwOnError)throw Le(i),new c("Error parsing line: "+t);return i}beam(t,e){return this.factory.Beam({notes:t,options:e}),t}tuplet(t,e){return this.factory.Tuplet({notes:t,options:e}),t}notes(t,e={}){return e=Object.assign({clef:this.defaults.clef,stem:this.defaults.stem},e),this.parse(t,e),this.builder.getElements().notes}voice(t,e={}){return e=Object.assign({time:this.defaults.time},e),this.factory.Voice(e).addTickables(t)}addCommitHook(t){this.builder.addCommitHook(t)}}je.DEBUG=!1;const Xe="Ghost note must have valid initialization data to identify duration.";class Ve extends Ut{static get CATEGORY(){return l.GhostNote}constructor(t){if(!t)throw new c("BadArguments",Xe);let e;if("string"==typeof t)e={duration:t};else{if("object"!=typeof t)throw new c("BadArguments",Xe);e=t}super(e),this.setWidth(0)}isRest(){return!0}setStave(t){return super.setStave(t),this}addToModifierContext(t){return this}preFormat(){return this.preFormatted=!0,this}draw(){this.setRendered();for(let t=0;t=Ze.type.TEXT&&t<=Ze.type.MIXED&&(this.type=t),this}setCustomText(t,e){return this.custom_depress_text=t||"",this.custom_release_text=e||"",this}setLine(t){return this.line=t,this}drawBracketed(){const t=this.checkContext();let e,i,s=!1;this.notes.forEach(((n,a,o)=>{s=!s;const r=n.getAbsoluteX(),h=n.checkStave().getYForBottomText(this.line+3);if(r{e=!e;const s=i.checkStave(),n=i.getAbsoluteX(),a=s.getYForBottomText(this.line+3),o=K.currentMusicFont().lookupMetric(`pedalMarking.${e?"down":"up"}.point`);let r=0;e?this.custom_depress_text?(r=t.measureText(this.custom_depress_text).width,t.fillText(this.custom_depress_text,n-r/2,a)):Qe("pedal_depress",t,n,a,o):this.custom_release_text?(r=t.measureText(this.custom_release_text).width,t.fillText(this.custom_release_text,n-r/2,a)):Qe("pedal_release",t,n,a,o)}))}draw(){const t=this.checkContext();this.setRendered(),t.save(),t.setStrokeStyle(this.render_options.color),t.setFillStyle(this.render_options.color),t.setFont(this.textFont),function(...t){Ze.DEBUG&&g("Vex.Flow.PedalMarking",t)}("Rendering Pedal Marking"),this.type===Ze.type.BRACKET||this.type===Ze.type.MIXED?(t.setLineWidth(this.render_options.bracket_line_width),this.drawBracketed()):this.type===Ze.type.TEXT&&this.drawText(),t.restore()}}Ze.DEBUG=!1,Ze.TEXT_FONT={family:k.SERIF,size:12,weight:T.BOLD,style:w.ITALIC},Ze.GLYPHS={pedal_depress:{code:"keyboardPedalPed",x_shift:-10,y_shift:0},pedal_release:{code:"keyboardPedalUp",x_shift:-2,y_shift:3}},Ze.type={TEXT:1,BRACKET:2,MIXED:3},Ze.typeString={text:Ze.type.TEXT,bracket:Ze.type.BRACKET,mixed:Ze.type.MIXED};const ti={1:"repeat1Bar",2:"repeat2Bars",4:"repeat4Bars",slash:"repeatBarSlash"};class ei extends ze{static get CATEGORY(){return l.RepeatNote}constructor(t,e,i){super(void 0,Object.assign({duration:"q",align_center:"slash"!==t},e),i);const s=new R(ti[t]||"repeat1Bar",K.currentMusicFont().lookupMetric("repeatNote.point",40),{category:"repeatNote"});this.setGlyph(s)}}function ii(t,e,i,s,n,a,o){t.beginPath(),t.moveTo(e,i),t.lineTo(s,n),t.lineTo(a,o),t.lineTo(e,i),t.closePath(),t.fill()}class si extends A{constructor(t){super(),this.setNotes(t),this.text="",this.resetFont(),this.render_options={padding_left:4,padding_right:3,line_width:1,line_dash:void 0,rounded_end:!0,color:void 0,draw_start_arrow:!1,draw_end_arrow:!1,arrowhead_length:10,arrowhead_angle:Math.PI/8,text_position_vertical:si.TextVerticalPosition.TOP,text_justification:si.TextJustification.CENTER}}static get CATEGORY(){return l.StaveLine}setText(t){return this.text=t,this}setNotes(t){if(!t.first_note&&!t.last_note)throw new c("BadArguments","Notes needs to have either first_note or last_note set.");if(t.first_indices||(t.first_indices=[0]),t.last_indices||(t.last_indices=[0]),t.first_indices.length!==t.last_indices.length)throw new c("BadArguments","Connected notes must have same number of indices.");return this.notes=t,this.first_note=t.first_note,this.first_indices=t.first_indices,this.last_note=t.last_note,this.last_indices=t.last_indices,this}applyLineStyle(){const t=this.checkContext(),e=this.render_options;e.line_dash&&t.setLineDash(e.line_dash),e.line_width&&t.setLineWidth(e.line_width),e.rounded_end?t.setLineCap("round"):t.setLineCap("square")}applyFontStyle(){const t=this.checkContext();t.setFont(this.textFont);const e=this.render_options.color;e&&(t.setStrokeStyle(e),t.setFillStyle(e))}drawArrowLine(t,e,i){const s=this.render_options.draw_start_arrow&&this.render_options.draw_end_arrow,n=e.x,a=e.y,o=i.x,r=i.y,h=Math.sqrt((o-n)*(o-n)+(r-a)*(r-a)),l=(h-this.render_options.arrowhead_length/3)/h;let c,d,b,g;this.render_options.draw_end_arrow||s?(c=Math.round(n+(o-n)*l),d=Math.round(a+(r-a)*l)):(c=o,d=r),this.render_options.draw_start_arrow||s?(b=n+(o-n)*(1-l),g=a+(r-a)*(1-l)):(b=n,g=a),this.render_options.color&&(t.setStrokeStyle(this.render_options.color),t.setFillStyle(this.render_options.color)),t.beginPath(),t.moveTo(b,g),t.lineTo(c,d),t.stroke(),t.closePath();const m=Math.atan2(r-a,o-n),u=Math.abs(this.render_options.arrowhead_length/Math.cos(this.render_options.arrowhead_angle));let p,f,_,x,S,y;(this.render_options.draw_end_arrow||s)&&(p=m+Math.PI+this.render_options.arrowhead_angle,_=o+Math.cos(p)*u,x=r+Math.sin(p)*u,f=m+Math.PI-this.render_options.arrowhead_angle,S=o+Math.cos(f)*u,y=r+Math.sin(f)*u,ii(t,_,x,o,r,S,y)),(this.render_options.draw_start_arrow||s)&&(p=m+this.render_options.arrowhead_angle,_=n+Math.cos(p)*u,x=a+Math.sin(p)*u,f=m-this.render_options.arrowhead_angle,S=n+Math.cos(f)*u,y=a+Math.sin(f)*u,ii(t,_,x,n,a,S,y))}draw(){const t=this.checkContext();this.setRendered();const e=this.first_note,i=this.last_note,s=this.render_options;t.save(),this.applyLineStyle();let n={x:0,y:0},a={x:0,y:0};this.first_indices.forEach(((o,r)=>{const h=this.last_indices[r];n=e.getModifierStartXY(2,o),a=i.getModifierStartXY(1,h);const l=n.y>a.y;n.x+=e.getMetrics().modRightPx+s.padding_left,a.x-=i.getMetrics().modLeftPx+s.padding_right;const c=e.getGlyph().getWidth();e.getKeyProps()[o].displaced&&1===e.getStemDirection()&&(n.x+=c+s.padding_left);i.getKeyProps()[h].displaced&&-1===i.getStemDirection()&&(a.x-=c+s.padding_right),n.y+=l?-3:1,a.y+=l?2:0,this.drawArrowLine(t,n,a)})),t.restore();const o=t.measureText(this.text).width,r=s.text_justification;let h=0;if(r===si.TextJustification.LEFT)h=n.x;else if(r===si.TextJustification.CENTER){h=(a.x-n.x)/2+n.x-o/2}else r===si.TextJustification.RIGHT&&(h=a.x-o);let l=0;const c=s.text_position_vertical;return c===si.TextVerticalPosition.TOP?l=e.checkStave().getYForTopText():c===si.TextVerticalPosition.BOTTOM&&(l=e.checkStave().getYForBottomText(K.TEXT_HEIGHT_OFFSET_HACK)),t.save(),this.applyFontStyle(),t.fillText(this.text,h,l),t.restore(),this}}si.TEXT_FONT=Object.assign({},A.TEXT_FONT),si.TextVerticalPosition={TOP:1,BOTTOM:2},si.TextJustification={LEFT:1,CENTER:2,RIGHT:3};class ni extends A{constructor(t={}){super(),this.setOptions(t),this.parts=[]}static get CATEGORY(){return l.System}setOptions(t={}){if(!t.factory)throw new c("NoFactory","System.setOptions(options) requires a factory.");this.factory=t.factory,this.options=Object.assign(Object.assign({factory:this.factory,x:10,y:10,width:500,spaceBetweenStaves:12,autoWidth:!1,noJustification:!1,debugFormatter:!1,formatIterations:0,noPadding:!1},t),{details:Object.assign({alpha:.5},t.details),formatOptions:Object.assign({},t.formatOptions)}),!1===this.options.noJustification&&void 0===t.width&&(this.options.autoWidth=!0)}setContext(t){return super.setContext(t),this.factory.setContext(t),this}addConnector(t="double"){return this.connector=this.factory.StaveConnector({top_stave:this.parts[0].stave,bottom_stave:this.parts[this.parts.length-1].stave,type:t}),this.connector}addStave(t){var e;const i=Object.assign({left_bar:!1},t.options),s=null!==(e=t.stave)&&void 0!==e?e:this.factory.Stave({x:this.options.x,y:this.options.y,width:this.options.width,options:i}),n=Object.assign(Object.assign({stave:s,spaceAbove:0,spaceBelow:0,debugNoteMetrics:!1,noJustification:!1},t),{options:i}),a=this.getContext();return n.voices.forEach((t=>t.setContext(a).setStave(s).getTickables().forEach((t=>t.setStave(s))))),this.parts.push(n),s}format(){const t=this.options.details;let e=0;const i=new we(t);this.formatter=i;let s=this.options.y,n=0,a=[];const o=[];this.parts.forEach((t=>{s+=t.stave.space(t.spaceAbove),t.stave.setY(s),this.options.autoWidth?t.voices.forEach((t=>{i.joinVoices([t])})):i.joinVoices(t.voices),s+=t.stave.space(t.spaceBelow),s+=t.stave.space(this.options.spaceBetweenStaves),t.debugNoteMetrics&&(o.push({y:s,voice:t.voices[0]}),s+=15),a=a.concat(t.voices),n=Math.max(n,t.stave.getNoteStartX())})),this.parts.forEach((t=>t.stave.setNoteStartX(n))),this.options.autoWidth?(e=i.preCalculateMinTotalWidth(a),this.parts.forEach((t=>{t.stave.setWidth(e+fe.rightPadding+(n-this.options.x))}))):e=this.options.noPadding?this.options.width-this.options.x:this.options.width-(n-this.options.x)-fe.defaultPadding,i.format(a,this.options.noJustification?0:e,this.options.formatOptions);for(let e=0;e{e.voice.getTickables().forEach((i=>ut.plotMetrics(t,i,e.y)))}))}}class ai extends Ut{constructor(t,e=!1){super(t),this.glyphs=[],this.greatestString=()=>this.positions.map((t=>t.str)).reduce(((t,e)=>t>e?t:e)),this.leastString=()=>this.positions.map((t=>t.str)).reduce(((t,e)=>tthis.width}setStave(t){super.setStave(t);const e=t.getContext();if(this.setContext(e),e){this.width=0;for(let t=0;ti.width),this.width=Math.max(i.getWidth(),this.width)}this.glyph.getWidth=()=>this.width}const i=this.positions.map((({str:e})=>t.getYForLine(Number(e)-1)));return this.setYs(i),this.stem&&this.stem.setYBounds(this.getStemY(),this.getStemY()),this}getPositions(){return this.positions}getModifierStartXY(t,e){if(!this.preFormatted)throw new c("UnformattedNote","Can't call GetModifierStartXY on an unformatted note");if(0===this.ys.length)throw new c("NoYValues","No Y-Values calculated for this note.");let i=0;if(t===O.Position.LEFT)i=-2;else if(t===O.Position.RIGHT)i=this.width+2;else if(t===O.Position.BELOW||t===O.Position.ABOVE){i=this.glyph.getWidth()/2}return{x:this.getAbsoluteX()+i,y:this.ys[e]}}getLineForRest(){return Number(this.positions[0].str)}preFormat(){this.preFormatted||(this.modifierContext&&this.modifierContext.preFormat(),this.preFormatted=!0)}getStemX(){return this.getCenterGlyphX()}getStemY(){const t=this.checkStave().getNumLines()-.5,e=Q.UP===this.stem_direction?-.5:t;return this.checkStave().getYForLine(e)}getStemExtents(){return this.checkStem().getExtents()}drawFlag(){const{beam:t,glyph:e,stem_direction:i,render_options:{draw_stem:s,glyph_font_scale:n}}=this,a=this.checkContext(),o=null==t&&s;if(e.flag&&o){const t=this.getStemX()+1,s=this.getStemY()-this.checkStem().getHeight(),o=i===Q.DOWN?e.code_flag_downstem:e.code_flag_upstem;R.renderGlyph(a,t,s,n,o,{category:"flag.tabStem"})}}drawModifiers(){this.modifiers.forEach((t=>{i(t,l.Dot)&&!this.render_options.draw_dots||(t.setContext(this.getContext()),t.drawWithStyle())}))}drawStemThrough(){const t=this.getStemX(),e=this.getStemY(),i=this.checkContext(),s=this.render_options.draw_stem,n=this.render_options.draw_stem_through_stave;if(s&&n){const s=function(t,e,i,s){const n=1!==s,a=-1!==s,o=i.getSpacingBetweenLines(),r=i.getNumLines(),h=[];return e.forEach((e=>{const l=e.indexOf(r)>-1,c=e.indexOf(1)>-1;if(n&&c||a&&l)return;1===e.length&&e.push(e[0]);const d=[];e.forEach(((e,n,a)=>{const h=1===e,l=e===r;let c=i.getYForLine(e-1);0!==n||h?n!==a.length-1||l||(c+=o/2-1):c-=o/2-1,d.push(c),1===s&&h?d.push(t-2):-1===s&&l&&d.push(t+2)})),h.push(d.sort(((t,e)=>t-e)))})),h}(e,function(t,e){const i=[];let s=[];for(let n=1;n<=t;n++)e.indexOf(n)>-1?(i.push(s),s=[]):s.push(n);return s.length>0&&i.push(s),i}(this.checkStave().getNumLines(),this.positions.map((t=>Number(t.str)))),this.checkStave(),this.getStemDirection());i.save(),i.setLineWidth(Q.WIDTH),s.forEach((e=>{0!==e.length&&(i.beginPath(),i.moveTo(t,e[0]),i.lineTo(t,e[e.length-1]),i.stroke(),i.closePath())})),i.restore()}}drawPositions(){const t=this.checkContext(),e=this.getAbsoluteX(),i=this.ys;for(let s=0;s{const i=di.GLYPHS[e];if(!i)throw new c("Invalid dynamics character: "+e);const s=b(this.render_options.glyph_font_size),n=new R(i.code,s,{category:"textNote"});this.glyphs.push(n),t+=i.width})),this.setWidth(t),this.preFormatted=!0,this}draw(){this.setRendered();const t=this.getAbsoluteX(),e=this.checkStave().getYForLine(this.line+-3);ci("Rendering Dynamics: ",this.sequence);let i=t;this.glyphs.forEach(((t,s)=>{const n=this.sequence[s];t.render(this.checkContext(),i,e),i+=di.GLYPHS[n].width}))}}di.DEBUG=!1;class bi extends ut{constructor(t,e){super({duration:"b"});const i=new me(t,e);this.timeSigInfo=i.getInfo(),this.setWidth(this.timeSigInfo.glyph.getMetrics().width),this.ignore_ticks=!0}static get CATEGORY(){return l.TimeSigNote}addToModifierContext(t){return this}preFormat(){return this.preFormatted=!0,this}draw(){const t=this.checkStave(),e=this.checkContext();this.setRendered(),this.timeSigInfo.glyph.getContext()||this.timeSigInfo.glyph.setContext(e),this.timeSigInfo.glyph.setStave(t),this.timeSigInfo.glyph.setYShift(t.getYForLine(2)-t.getYForGlyphs()),this.timeSigInfo.glyph.renderToStave(this.getAbsoluteX())}}class gi extends A{constructor(t){super(),t.start&&(this.start=t.start),t.stop&&(this.stop=t.stop),this.line=1,this.render_options={harsh:!1,wave_height:6,wave_width:4,wave_girth:2,vibrato_width:0}}static get CATEGORY(){return l.VibratoBracket}setLine(t){return this.line=t,this}setHarsh(t){return this.render_options.harsh=t,this}draw(){const t=this.checkContext();this.setRendered();const e=this.start&&this.start.checkStave().getYForTopText(this.line)||this.stop&&this.stop.checkStave().getYForTopText(this.line)||0,i=this.start&&this.start.getAbsoluteX()||this.stop&&this.stop.checkStave().getTieStartX()||0,s=this.stop&&this.stop.getAbsoluteX()-this.stop.getWidth()-5||this.start&&this.start.checkStave().getTieEndX()-10||0;this.render_options.vibrato_width=s-i,function(...t){gi.DEBUG&&g("Vex.Flow.VibratoBracket",t)}("Rendering VibratoBracket: start_x:",i,"stop_x:",s,"y:",e),ie.renderVibrato(t,i,e,this.render_options)}}function mi(...t){ui.DEBUG&&g("Vex.Flow.Factory",t)}gi.DEBUG=!1;class ui{constructor(t={}){mi("New factory: ",t),this.options={stave:{space:10},renderer:{elementId:"",width:500,height:200,background:"#FFF"},font:ui.TEXT_FONT},this.setOptions(t)}static newFromElementId(t,e=500,i=200){return new ui({renderer:{elementId:t,width:e,height:i}})}reset(){this.renderQ=[],this.systems=[],this.staves=[],this.voices=[],this.stave=void 0}setOptions(t){this.options=Object.assign(Object.assign({},this.options),t),this.initRenderer(),this.reset()}initRenderer(){const{elementId:t,width:e,height:i,background:s}=this.options.renderer;if(null==t)return;if(""==t)throw mi(this),new c("renderer.elementId not set in FactoryOptions");let n=this.options.renderer.backend;if(void 0===n){n=Ht(document.getElementById(t))?Zt.Backends.CANVAS:Zt.Backends.SVG}this.context=Zt.buildContext(t,n,e,i,s)}getContext(){return this.context}setContext(t){return this.context=t,this}getStave(){return this.stave}getVoices(){return this.voices}Stave(t){const e=this.options.stave.space,i=Object.assign({x:0,y:0,width:this.options.renderer.width-1*e,options:{spacing_between_lines_px:1*e}},t),s=new fe(i.x,i.y,i.width,i.options);return this.staves.push(s),s.setContext(this.context),this.stave=s,s}TabStave(t){const e=this.options.stave.space,i=Object.assign({x:0,y:0,width:this.options.renderer.width-1*e,options:{spacing_between_lines_px:1.3*e}},t),s=new oi(i.x,i.y,i.width,i.options);return this.staves.push(s),s.setContext(this.context),this.stave=s,s}StaveNote(t){const e=new Yt(t);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}GlyphNote(t,e,i){const s=new ze(t,e,i);return this.stave&&s.setStave(this.stave),s.setContext(this.context),this.renderQ.push(s),s}RepeatNote(t,e,i){const s=new ei(t,e,i);return this.stave&&s.setStave(this.stave),s.setContext(this.context),this.renderQ.push(s),s}GhostNote(t){const e=new Ve(t);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}TextNote(t){const e=new ce(t);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}BarNote(t={}){const e=new Et(t.type);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}ClefNote(t){const e=Object.assign({type:"treble",options:{size:"default",annotation:void 0}},t),i=new Ae(e.type,e.options.size,e.options.annotation);return this.stave&&i.setStave(this.stave),i.setContext(this.context),this.renderQ.push(i),i}TimeSigNote(t){const e=Object.assign({time:"4/4"},t),i=new bi(e.time);return this.stave&&i.setStave(this.stave),i.setContext(this.context),this.renderQ.push(i),i}KeySigNote(t){const e=new $e(t.key,t.cancelKey,t.alterKey);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}TabNote(t){const e=new ai(t);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}GraceNote(t){const e=new Ke(t);return this.stave&&e.setStave(this.stave),e.setContext(this.context),e}GraceNoteGroup(t){const e=new Mt(t.notes,t.slur);return e.setContext(this.context),e}Accidental(t){const e=new J(t.type);return e.setContext(this.context),e}Annotation(t){const e=Object.assign({text:"p",hJustify:st.CENTER,vJustify:nt.BOTTOM},t),i=new at(e.text);return i.setJustification(e.hJustify),i.setVerticalJustification(e.vJustify),i.setFont(e.font),i.setContext(this.context),i}ChordSymbol(t){const e=Object.assign({vJustify:"top",hJustify:"center",kerning:!0,reportWidth:!0},t),i=new Dt;return i.setHorizontal(e.hJustify),i.setVertical(e.vJustify),i.setEnableKerning(e.kerning),i.setReportWidth(e.reportWidth),"string"==typeof e.fontFamily&&"number"==typeof e.fontSize?"string"==typeof e.fontWeight?i.setFont(e.fontFamily,e.fontSize,e.fontWeight):i.setFont(e.fontFamily,e.fontSize,""):"number"==typeof e.fontSize&&i.setFontSize(e.fontSize),i.setContext(this.context),i}Articulation(t){const e=Object.assign({type:"a.",position:"above"},t),i=new bt(e.type);return i.setPosition(e.position),i.setContext(this.context),i}TextDynamics(t){const e=Object.assign({text:"p",duration:"q",dots:0,line:0},t),i=new di({text:e.text,line:e.line,duration:e.duration,dots:e.dots});return this.stave&&i.setStave(this.stave),i.setContext(this.context),this.renderQ.push(i),i}Fingering(t){const e=Object.assign({number:"0",position:"left"},t),i=new At(e.number);return i.setPosition(e.position),i.setContext(this.context),i}StringNumber(t){const e=new te(t.number);return e.setPosition(t.position),e.setContext(this.context),e}TickContext(){return new Ot}ModifierContext(){return new ne}MultiMeasureRest(t){const e=b(t.number_of_measures,"NoNumberOfMeasures"),i=new Je(e,t);return i.setContext(this.context),this.renderQ.push(i),i}Voice(t){const e=Object.assign({time:"4/4"},t),i=new Bt(e.time,e.options);return this.voices.push(i),i}StaveConnector(t){const e=new xe(t.top_stave,t.bottom_stave);return e.setType(t.type).setContext(this.context),this.renderQ.push(e),e}Formatter(t){return new we(t)}Tuplet(t){const e=Object.assign({notes:[],options:{}},t),i=new Ee(e.notes,e.options).setContext(this.context);return this.renderQ.push(i),i}Beam(t){var e,i,s;const n=new Ne(t.notes,null===(e=t.options)||void 0===e?void 0:e.autoStem).setContext(this.context);return n.breakSecondaryAt(null!==(s=null===(i=t.options)||void 0===i?void 0:i.secondaryBeamBreaks)&&void 0!==s?s:[]),this.renderQ.push(n),n}Curve(t){const e=new Be(t.from,t.to,t.options).setContext(this.context);return this.renderQ.push(e),e}StaveTie(t){var e;const i=new Pt({first_note:t.from,last_note:t.to,first_indices:t.first_indices,last_indices:t.last_indices},t.text);return(null===(e=t.options)||void 0===e?void 0:e.direction)&&i.setDirection(t.options.direction),i.setContext(this.context),this.renderQ.push(i),i}StaveLine(t){var e,i;const s=new si({first_note:t.from,last_note:t.to,first_indices:t.first_indices,last_indices:t.last_indices});return(null===(e=t.options)||void 0===e?void 0:e.text)&&s.setText(t.options.text),(null===(i=t.options)||void 0===i?void 0:i.font)&&s.setFont(t.options.font),s.setContext(this.context),this.renderQ.push(s),s}VibratoBracket(t){const e=new gi({start:t.from,stop:t.to});return t.options.line&&e.setLine(t.options.line),t.options.harsh&&e.setHarsh(t.options.harsh),e.setContext(this.context),this.renderQ.push(e),e}TextBracket(t){const e=new li({start:t.from,stop:t.to,text:t.text,superscript:t.options.superscript,position:t.options.position});return t.options.line&&e.setLine(t.options.line),t.options.font&&e.setFont(t.options.font),e.setContext(this.context),this.renderQ.push(e),e}System(t={}){t.factory=this;const e=new ni(t).setContext(this.context);return this.systems.push(e),e}EasyScore(t={}){return t.factory=this,new je(t)}PedalMarking(t){const e=Object.assign({notes:[],options:{style:"mixed"}},t),i=new Ze(e.notes);return i.setType(Ze.typeString[e.options.style]),i.setContext(this.context),this.renderQ.push(i),i}NoteSubGroup(t){const e=Object.assign({notes:[]},t),i=new Rt(e.notes);return i.setContext(this.context),i}draw(){const t=this.context;this.systems.forEach((e=>e.setContext(t).format())),this.staves.forEach((e=>e.setContext(t).draw())),this.voices.forEach((e=>e.setContext(t).draw())),this.renderQ.forEach((e=>{e.isRendered()||e.setContext(t).draw()})),this.systems.forEach((e=>e.setContext(t).draw())),this.reset()}}ui.DEBUG=!1,ui.TEXT_FONT=Object.assign({},A.TEXT_FONT);class pi extends A{constructor(t,e){super(),this.setNotes(t),this.hairpin=e,this.position=O.Position.BELOW,this.render_options={height:10,y_shift:0,left_shift_px:0,right_shift_px:0,right_shift_ticks:0,left_shift_ticks:0}}static get CATEGORY(){return l.StaveHairpin}static FormatByTicksAndDraw(t,e,i,s,n,a){var o,r;const h=e.pixelsPerTick;if(null==h)throw new c("BadArguments","A valid Formatter must be provide to draw offsets by ticks.");const l=h*(null!==(o=a.left_shift_ticks)&&void 0!==o?o:0),d=h*(null!==(r=a.right_shift_ticks)&&void 0!==r?r:0),b={height:a.height,y_shift:a.y_shift,left_shift_px:l,right_shift_px:d,right_shift_ticks:0,left_shift_ticks:0};new pi({first_note:i.first_note,last_note:i.last_note},s).setContext(t).setRenderOptions(b).setPosition(n).draw()}setPosition(t){return t!==O.Position.ABOVE&&t!==O.Position.BELOW||(this.position=t),this}setRenderOptions(t){return null!=t.height&&null!=t.y_shift&&null!=t.left_shift_px&&null!=t.right_shift_px&&(this.render_options=t),this}setNotes(t){if(!t.first_note&&!t.last_note)throw new c("BadArguments","Hairpin needs to have either first_note or last_note set.");return this.notes=t,this.first_note=t.first_note,this.last_note=t.last_note,this}renderHairpin(t){const e=this.checkContext();let i=this.render_options.y_shift+20,s=t.first_y;this.position===O.Position.ABOVE&&(i=30-i,s=t.first_y-t.staff_height);const n=this.render_options.left_shift_px,a=this.render_options.right_shift_px;switch(e.beginPath(),this.hairpin){case pi.type.CRESC:e.moveTo(t.last_x+a,s+i),e.lineTo(t.first_x+n,s+this.render_options.height/2+i),e.lineTo(t.last_x+a,s+this.render_options.height+i);break;case pi.type.DECRESC:e.moveTo(t.first_x+n,s+i),e.lineTo(t.last_x+a,s+this.render_options.height/2+i),e.lineTo(t.first_x+n,s+this.render_options.height+i)}e.stroke(),e.closePath()}draw(){this.checkContext(),this.setRendered();const t=this.first_note,e=this.last_note;if(!t||!e)throw new c("NoNote","Notes required to draw");const i=t.getModifierStartXY(this.position,0),s=e.getModifierStartXY(this.position,0);this.renderHairpin({first_x:i.x,last_x:s.x,first_y:t.checkStave().getY()+t.checkStave().getHeight(),last_y:e.checkStave().getY()+e.checkStave().getHeight(),staff_height:t.checkStave().getHeight()})}}pi.type={CRESC:1,DECRESC:2};class fi extends Ft{constructor(t,e){if(super(t,"sl."),!e){let i=t.first_note.getPositions()[0].fret;"string"==typeof i&&(i=parseInt(i,10));let s=t.last_note.getPositions()[0].fret;"string"==typeof s&&(s=parseInt(s,10)),e=isNaN(i)||isNaN(s)?fi.SLIDE_UP:i>s?fi.SLIDE_DOWN:fi.SLIDE_UP}this.direction=e,this.render_options.cp1=11,this.render_options.cp2=14,this.render_options.y_shift=.5,this.resetFont()}static get CATEGORY(){return l.TabSlide}static get SLIDE_UP(){return 1}static get SLIDE_DOWN(){return-1}static createSlideUp(t){return new fi(t,fi.SLIDE_UP)}static createSlideDown(t){return new fi(t,fi.SLIDE_DOWN)}renderTie(t){if(0===t.first_ys.length||0===t.last_ys.length)throw new c("BadArguments","No Y-values to render");const e=this.checkContext(),i=t.first_x_px,s=t.first_ys,n=t.last_x_px,a=t.direction;if(a!==fi.SLIDE_UP&&a!==fi.SLIDE_DOWN)throw new c("BadSlide","Invalid slide direction");const o=this.notes.first_indices;for(let t=0;tthis.tuningValues.length)throw new c("BadArguments",`String number must be between 1 and ${this.tuningValues.length}:${t}`);return this.tuningValues[e-1]}getValueForFret(t,e){const i=this.getValueForString(e),s=Number(t);if(s<0)throw new c("BadArguments",`Fret number must be 0 or higher: ${t}`);return i+s}getNoteForFret(t,e){const i=this.getValueForFret(t,e),s=Math.floor(i/12),n=i%12;return`${K.integerToNote(n)}/${s}`}}var xi=function(t,e,i,s){return new(i||(i=Promise))((function(n,a){function o(t){try{h(s.next(t))}catch(t){a(t)}}function r(t){try{h(s.throw(t))}catch(t){a(t)}}function h(t){var e;t.done?n(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(o,r)}h((s=s.apply(t,e||[])).next())}))};class Si{static get BUILD(){return{VERSION:"4.0.1-alpha.2",ID:"0df10df6d1fab3a99f5aa306341a31c6e686d659",DATE:"2022-02-02T09:30:30.784Z"}}static get Flow(){return Si}static setMusicFont(...t){const e=t.map((t=>k.load(t)));return K.MUSIC_FONT_STACK=e,R.MUSIC_FONT_STACK=e.slice(),R.CURRENT_CACHE_KEY=t.join(","),e}static fetchMusicFont(t,e){return xi(this,void 0,void 0,(function*(){}))}static getMusicFont(){return K.MUSIC_FONT_STACK.map((t=>t.getName()))}static get NOTATION_FONT_SCALE(){return K.NOTATION_FONT_SCALE}static set NOTATION_FONT_SCALE(t){K.NOTATION_FONT_SCALE=t}static get TABLATURE_FONT_SCALE(){return K.TABLATURE_FONT_SCALE}static set TABLATURE_FONT_SCALE(t){K.TABLATURE_FONT_SCALE=t}static get RESOLUTION(){return K.RESOLUTION}static set RESOLUTION(t){K.RESOLUTION=t}static get SLASH_NOTEHEAD_WIDTH(){return K.SLASH_NOTEHEAD_WIDTH}static set SLASH_NOTEHEAD_WIDTH(t){K.SLASH_NOTEHEAD_WIDTH=t}static get STAVE_LINE_DISTANCE(){return K.STAVE_LINE_DISTANCE}static set STAVE_LINE_DISTANCE(t){K.STAVE_LINE_DISTANCE=t}static get STAVE_LINE_THICKNESS(){return K.STAVE_LINE_THICKNESS}static set STAVE_LINE_THICKNESS(t){K.STAVE_LINE_THICKNESS=t}static get STEM_HEIGHT(){return K.STEM_HEIGHT}static set STEM_HEIGHT(t){K.STEM_HEIGHT=t}static get STEM_WIDTH(){return K.STEM_WIDTH}static set STEM_WIDTH(t){K.STEM_WIDTH=t}static get TIME4_4(){return K.TIME4_4}static get accidentalMap(){return K.accidentalMap}static get unicode(){return K.unicode}static keySignature(t){return K.keySignature(t)}static hasKeySignature(t){return K.hasKeySignature(t)}static getKeySignatures(){return K.getKeySignatures()}static clefProperties(t){return K.clefProperties(t)}static keyProperties(t,e,i){return K.keyProperties(t,e,i)}static durationToTicks(t){return K.durationToTicks(t)}}Si.Accidental=J,Si.Annotation=at,Si.Articulation=bt,Si.Barline=vt,Si.BarNote=Et,Si.Beam=Ne,Si.Bend=Ct,Si.BoundingBox=S,Si.BoundingBoxComputation=y,Si.CanvasContext=jt,Si.ChordSymbol=Dt,Si.Clef=ae,Si.ClefNote=Ae,Si.Crescendo=Pe,Si.Curve=Be,Si.Dot=Nt,Si.EasyScore=je,Si.Element=A,Si.Factory=ui,Si.Font=k,Si.Formatter=we,Si.Fraction=_,Si.FretHandFinger=At,Si.GhostNote=Ve,Si.Glyph=R,Si.GlyphNote=ze,Si.GraceNote=Ke,Si.GraceNoteGroup=Mt,Si.GraceTabNote=class extends ai{static get CATEGORY(){return l.GraceTabNote}constructor(t){super(t,!1),this.render_options=Object.assign(Object.assign({},this.render_options),{y_shift:.3,scale:.6,font:`7.5pt ${k.SANS_SERIF}`}),this.updateWidth()}},Si.KeyManager=class{constructor(t){this.music=new L,this.setKey(t)}setKey(t){return this.key=t,this.reset(),this}getKey(){return this.key}reset(){this.keyParts=this.music.getKeyParts(this.key),this.keyString=this.keyParts.root,this.keyParts.accidental&&(this.keyString+=this.keyParts.accidental);if(!L.scaleTypes[this.keyParts.type])throw new c("BadArguments",`Unsupported key type: ${this.key}`);this.scale=this.music.getScaleTones(this.music.getNoteValue(this.keyString),L.scaleTypes[this.keyParts.type]),this.scaleMap={},this.scaleMapByValue={},this.originalScaleMapByValue={};const t=L.root_indices[this.keyParts.root];for(let e=0;e1){const s=[];let n;t.sort(e);for(let e=0;e":{x_min:35,x_max:421,y_min:28,y_max:632,ha:604,leftSideBearing:35,advanceWidth:466},"?":{x_min:45,x_max:548,y_min:-17,y_max:767,ha:784,leftSideBearing:45,advanceWidth:592},"@":{x_min:51,x_max:730,y_min:-78,y_max:753,ha:831,leftSideBearing:51,advanceWidth:781},A:{x_min:37,x_max:554,y_min:-4,y_max:746,ha:750,leftSideBearing:37,advanceWidth:617},B:{x_min:37,x_max:532,y_min:3,y_max:783,ha:780,leftSideBearing:37,advanceWidth:579},C:{x_min:37,x_max:583,y_min:-3,y_max:775,ha:778,leftSideBearing:37,advanceWidth:623},D:{x_min:50,x_max:530,y_min:-15,y_max:749,ha:764,leftSideBearing:50,advanceWidth:579},E:{x_min:45,x_max:531,y_min:-1,y_max:743,ha:744,leftSideBearing:45,advanceWidth:585},F:{x_min:45,x_max:459,y_min:23,y_max:727,ha:704,leftSideBearing:45,advanceWidth:510},G:{x_min:31,x_max:577,y_min:-8,y_max:733,ha:741,leftSideBearing:31,advanceWidth:611},H:{x_min:37,x_max:493,y_min:-22,y_max:758,ha:780,leftSideBearing:37,advanceWidth:535},I:{x_min:47,x_max:501,y_min:-3,y_max:731,ha:734,leftSideBearing:47,advanceWidth:541},J:{x_min:33,x_max:531,y_min:-23,y_max:725,ha:748,leftSideBearing:33,advanceWidth:573},K:{x_min:43,x_max:505,y_min:-10,y_max:740,ha:750,leftSideBearing:43,advanceWidth:560},L:{x_min:49,x_max:457,y_min:-2,y_max:746,ha:748,leftSideBearing:49,advanceWidth:510},M:{x_min:35,x_max:699,y_min:1,y_max:744,ha:743,leftSideBearing:35,advanceWidth:743},N:{x_min:34,x_max:533,y_min:-17,y_max:761,ha:778,leftSideBearing:34,advanceWidth:579},O:{x_min:41,x_max:608,y_min:-5,y_max:735,ha:740,leftSideBearing:41,advanceWidth:667},P:{x_min:53,x_max:451,y_min:-18,y_max:735,ha:753,leftSideBearing:53,advanceWidth:497},Q:{x_min:40,x_max:599,y_min:-67,y_max:744,ha:811,leftSideBearing:40,advanceWidth:648},R:{x_min:39,x_max:487,y_min:16,y_max:735,ha:719,leftSideBearing:39,advanceWidth:535},S:{x_min:35,x_max:552,y_min:-47,y_max:708,ha:755,leftSideBearing:35,advanceWidth:604},T:{x_min:26,x_max:656,y_min:-13,y_max:718,ha:731,leftSideBearing:26,advanceWidth:705},U:{x_min:41,x_max:518,y_min:-20,y_max:748,ha:768,leftSideBearing:41,advanceWidth:567},V:{x_min:47,x_max:509,y_min:-26,y_max:744,ha:770,leftSideBearing:47,advanceWidth:567},W:{x_min:44,x_max:789,y_min:-35,y_max:720,ha:755,leftSideBearing:44,advanceWidth:833},X:{x_min:63,x_max:635,y_min:-10,y_max:745,ha:755,leftSideBearing:63,advanceWidth:680},Y:{x_min:43,x_max:503,y_min:-21,y_max:734,ha:755,leftSideBearing:43,advanceWidth:541},Z:{x_min:42,x_max:584,y_min:-10,y_max:739,ha:749,leftSideBearing:42,advanceWidth:629},"[":{x_min:46,x_max:346,y_min:-150,y_max:884,ha:1034,leftSideBearing:46,advanceWidth:291},"\\":{x_min:20,x_max:616,y_min:-100,y_max:797,ha:897,leftSideBearing:20,advanceWidth:645},"]":{x_min:-76,x_max:226,y_min:-150,y_max:881,ha:1031,leftSideBearing:-76,advanceWidth:297},"^":{x_min:43,x_max:437,y_min:517,y_max:812,ha:295,leftSideBearing:43,advanceWidth:478},_:{x_min:29,x_max:563,y_min:-110,y_max:-1,ha:109,leftSideBearing:29,advanceWidth:598},"`":{x_min:54,x_max:321,y_min:540,y_max:747,ha:207,leftSideBearing:54,advanceWidth:368},a:{x_min:20,x_max:447,y_min:-17,y_max:495,ha:512,leftSideBearing:20,advanceWidth:494},b:{x_min:37,x_max:466,y_min:-27,y_max:770,ha:797,leftSideBearing:37,advanceWidth:510},c:{x_min:35,x_max:456,y_min:-9,y_max:507,ha:516,leftSideBearing:35,advanceWidth:460},d:{x_min:45,x_max:520,y_min:-15,y_max:764,ha:779,leftSideBearing:45,advanceWidth:560},e:{x_min:33,x_max:370,y_min:-5,y_max:501,ha:506,leftSideBearing:33,advanceWidth:397},f:{x_min:35,x_max:411,y_min:-13,y_max:695,ha:708,leftSideBearing:35,advanceWidth:453},g:{x_min:33,x_max:551,y_min:-257,y_max:505,ha:762,leftSideBearing:33,advanceWidth:611},h:{x_min:32,x_max:458,y_min:-29,y_max:743,ha:772,leftSideBearing:32,advanceWidth:491},i:{x_min:45,x_max:167,y_min:-13,y_max:631,ha:644,leftSideBearing:45,advanceWidth:220},j:{x_min:-127,x_max:261,y_min:-231,y_max:601,ha:832,leftSideBearing:-127,advanceWidth:308},k:{x_min:39,x_max:443,y_min:-3,y_max:700,ha:703,leftSideBearing:39,advanceWidth:497},l:{x_min:58,x_max:168,y_min:-8,y_max:686,ha:694,leftSideBearing:58,advanceWidth:227},m:{x_min:39,x_max:688,y_min:-14,y_max:501,ha:515,leftSideBearing:39,advanceWidth:718},n:{x_min:45,x_max:491,y_min:-32,y_max:512,ha:544,leftSideBearing:45,advanceWidth:541},o:{x_min:41,x_max:424,y_min:-12,y_max:493,ha:505,leftSideBearing:41,advanceWidth:447},p:{x_min:25,x_max:529,y_min:-260,y_max:500,ha:760,leftSideBearing:25,advanceWidth:573},q:{x_min:53,x_max:603,y_min:-235,y_max:514,ha:749,leftSideBearing:53,advanceWidth:623},r:{x_min:32,x_max:407,y_min:-7,y_max:492,ha:499,leftSideBearing:32,advanceWidth:460},s:{x_min:49,x_max:416,y_min:-12,y_max:519,ha:531,leftSideBearing:49,advanceWidth:460},t:{x_min:32,x_max:442,y_min:-5,y_max:684,ha:689,leftSideBearing:32,advanceWidth:469},u:{x_min:41,x_max:487,y_min:-5,y_max:507,ha:512,leftSideBearing:41,advanceWidth:510},v:{x_min:16,x_max:441,y_min:-20,y_max:542,ha:562,leftSideBearing:16,advanceWidth:456},w:{x_min:39,x_max:639,y_min:-22,y_max:505,ha:527,leftSideBearing:39,advanceWidth:661},x:{x_min:15,x_max:505,y_min:-39,y_max:539,ha:578,leftSideBearing:15,advanceWidth:541},y:{x_min:-98,x_max:501,y_min:-242,y_max:511,ha:753,leftSideBearing:-98,advanceWidth:548},z:{x_min:27,x_max:479,y_min:-3,y_max:494,ha:497,leftSideBearing:27,advanceWidth:494},"{":{x_min:0,x_max:0,y_min:0,y_max:0,ha:0,leftSideBearing:0,advanceWidth:308},"|":{x_min:0,x_max:0,y_min:0,y_max:0,ha:0,leftSideBearing:0,advanceWidth:308},"}":{x_min:0,x_max:0,y_min:0,y_max:0,ha:0,leftSideBearing:0,advanceWidth:308},"~":{x_min:0,x_max:0,y_min:0,y_max:0,ha:0,leftSideBearing:0,advanceWidth:308}},fontFamily:"PetalumaScript",resolution:1e3,generatedOn:"2020-06-14T18:33:25.407Z"},ki={spacing:50,glyphs:{" ":{x_min:0,x_max:509,y_min:0,y_max:2e3,ha:2e3,leftSideBearing:0,advanceWidth:509},0:{x_min:121,x_max:1048,y_min:-21,y_max:1477,ha:1498,leftSideBearing:121,advanceWidth:1168},1:{x_min:117,x_max:767,y_min:0,y_max:1456,ha:1456,leftSideBearing:117,advanceWidth:844},2:{x_min:75.8474576645637,x_max:1040,y_min:0,y_max:1477,ha:1477,leftSideBearing:75,advanceWidth:1131},3:{x_min:74.85365853658536,x_max:994,y_min:-21,y_max:1477,ha:1498,leftSideBearing:74,advanceWidth:1106},4:{x_min:63,x_max:1114,y_min:0,y_max:1456,ha:1456,leftSideBearing:63,advanceWidth:1187},5:{x_min:96.8448275474953,x_max:982,y_min:-21,y_max:1456,ha:1477,leftSideBearing:96,advanceWidth:1081},6:{x_min:121,x_max:1067,y_min:-21,y_max:1477,ha:1498,leftSideBearing:121,advanceWidth:1144},7:{x_min:76,x_max:1060,y_min:0,y_max:1456,ha:1456,leftSideBearing:-30,advanceWidth:1128},8:{x_min:92,x_max:1039,y_min:-21,y_max:1477,ha:1498,leftSideBearing:92,advanceWidth:1131},9:{x_min:84,x_max:1026,y_min:-21,y_max:1477,ha:1498,leftSideBearing:84,advanceWidth:1154},"!":{x_min:143,x_max:340,y_min:0,y_max:1456,ha:1456,leftSideBearing:143,advanceWidth:483},'"':{x_min:166,x_max:634,y_min:1055,y_max:1560,ha:505,leftSideBearing:166,advanceWidth:770},"#":{x_min:63,x_max:1179,y_min:0,y_max:1456,ha:1456,leftSideBearing:63,advanceWidth:1246},$:{x_min:81.92156915727656,x_max:1012,y_min:-208,y_max:1693,ha:1901,leftSideBearing:81,advanceWidth:1110},"%":{x_min:77,x_max:1384,y_min:-21,y_max:1477,ha:1498,leftSideBearing:77,advanceWidth:1460},"&":{x_min:74,x_max:1242,y_min:-21,y_max:1477,ha:1498,leftSideBearing:74,advanceWidth:1289},"'":{x_min:166,x_max:324,y_min:1055,y_max:1560,ha:505,leftSideBearing:166,advanceWidth:460},"(":{x_min:114,x_max:650,y_min:-463,y_max:1636,ha:2099,leftSideBearing:114,advanceWidth:662},")":{x_min:11,x_max:547,y_min:-463,y_max:1636,ha:2099,leftSideBearing:11,advanceWidth:654},"*":{x_min:66,x_max:893,y_min:607,y_max:1456,ha:849,leftSideBearing:66,advanceWidth:958},"+":{x_min:73,x_max:1071,y_min:146,y_max:1206,ha:1060,leftSideBearing:73,advanceWidth:1145},",":{x_min:23,x_max:315,y_min:-311,y_max:221,ha:532,leftSideBearing:23,advanceWidth:404},"-":{x_min:154,x_max:643,y_min:538,y_max:692,ha:154,leftSideBearing:154,advanceWidth:797},".":{x_min:145,x_max:342,y_min:0,y_max:202,ha:202,leftSideBearing:145,advanceWidth:493},"/":{x_min:0,x_max:774,y_min:-125,y_max:1456,ha:1581,leftSideBearing:0,advanceWidth:824},":":{x_min:145,x_max:342,y_min:0,y_max:1082,ha:1082,leftSideBearing:145,advanceWidth:419},";":{x_min:53,x_max:345,y_min:-311,y_max:1082,ha:1393,leftSideBearing:53,advanceWidth:424},"<":{x_min:76,x_max:892,y_min:107,y_max:1013,ha:906,leftSideBearing:76,advanceWidth:1017},"=":{x_min:147,x_max:981,y_min:407,y_max:987,ha:580,leftSideBearing:147,advanceWidth:1127},">":{x_min:125,x_max:980,y_min:87,y_max:993,ha:906,leftSideBearing:125,advanceWidth:1060},"?":{x_min:65.92660602419838,x_max:890,y_min:0,y_max:1477,ha:1477,leftSideBearing:65,advanceWidth:953},"@":{x_min:84.3592218305664,x_max:1705.2346925277395,y_min:-453,y_max:1431,ha:1884,leftSideBearing:84,advanceWidth:1821},A:{x_min:70,x_max:1463,y_min:0,y_max:1456,ha:1456,leftSideBearing:70,advanceWidth:1533},B:{x_min:81,x_max:1253,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1322},C:{x_min:80,x_max:1174,y_min:-21,y_max:1477,ha:1498,leftSideBearing:80,advanceWidth:1290},D:{x_min:81,x_max:1291,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1356},E:{x_min:81,x_max:1190,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1306},F:{x_min:81,x_max:1176,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1256},G:{x_min:80,x_max:1226,y_min:-21,y_max:1477,ha:1498,leftSideBearing:80,advanceWidth:1346},H:{x_min:81,x_max:1497,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1578},I:{x_min:81,x_max:604,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:685},J:{x_min:60,x_max:1100,y_min:-21,y_max:1456,ha:1477,leftSideBearing:60,advanceWidth:1169},K:{x_min:81,x_max:1427,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1501},L:{x_min:81,x_max:1130,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1210},M:{x_min:94,x_max:1888,y_min:0,y_max:1456,ha:1456,leftSideBearing:94,advanceWidth:1982},N:{x_min:83,x_max:1509,y_min:0,y_max:1456,ha:1456,leftSideBearing:83,advanceWidth:1592},O:{x_min:70,x_max:1281,y_min:-21,y_max:1477,ha:1498,leftSideBearing:70,advanceWidth:1351},P:{x_min:81,x_max:1242,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1297},Q:{x_min:70,x_max:1348,y_min:-245,y_max:1477,ha:1722,leftSideBearing:70,advanceWidth:1376},R:{x_min:81,x_max:1285,y_min:0,y_max:1455,ha:1455,leftSideBearing:81,advanceWidth:1385},S:{x_min:115,x_max:1116,y_min:-21,y_max:1477,ha:1498,leftSideBearing:115,advanceWidth:1206},T:{x_min:96,x_max:1306,y_min:0,y_max:1456,ha:1456,leftSideBearing:96,advanceWidth:1406},U:{x_min:70,x_max:1452,y_min:-21,y_max:1456,ha:1477,leftSideBearing:70,advanceWidth:1522},V:{x_min:65,x_max:1443,y_min:0,y_max:1456,ha:1456,leftSideBearing:65,advanceWidth:1508},W:{x_min:72,x_max:2057,y_min:0,y_max:1456,ha:1456,leftSideBearing:72,advanceWidth:2129},X:{x_min:80,x_max:1449,y_min:0,y_max:1456,ha:1456,leftSideBearing:80,advanceWidth:1529},Y:{x_min:65,x_max:1396,y_min:0,y_max:1456,ha:1456,leftSideBearing:65,advanceWidth:1461},Z:{x_min:90,x_max:1107,y_min:0,y_max:1456,ha:1456,leftSideBearing:90,advanceWidth:1197},"[":{x_min:157,x_max:541,y_min:-312,y_max:1664,ha:1976,leftSideBearing:157,advanceWidth:573},"\\":{x_min:36,x_max:830,y_min:-125,y_max:1456,ha:1581,leftSideBearing:36,advanceWidth:841},"]":{x_min:23,x_max:408,y_min:-312,y_max:1664,ha:1976,leftSideBearing:23,advanceWidth:552},"^":{x_min:71,x_max:802,y_min:729,y_max:1456,ha:727,leftSideBearing:71,advanceWidth:864},_:{x_min:119,x_max:1041,y_min:-154,y_max:0,ha:154,leftSideBearing:119,advanceWidth:1168},"`":{x_min:40,x_max:456,y_min:1288,y_max:1560,ha:272,leftSideBearing:40,advanceWidth:496},a:{x_min:79,x_max:1053,y_min:-21,y_max:1102,ha:1123,leftSideBearing:79,advanceWidth:1132},b:{x_min:-16,x_max:1071,y_min:-21,y_max:1560,ha:1581,leftSideBearing:-16,advanceWidth:1145},c:{x_min:78,x_max:988,y_min:-21,y_max:1102,ha:1123,leftSideBearing:78,advanceWidth:1067},d:{x_min:78,x_max:1156,y_min:-21,y_max:1560,ha:1581,leftSideBearing:78,advanceWidth:1218},e:{x_min:74,x_max:980,y_min:-21,y_max:1102,ha:1123,leftSideBearing:74,advanceWidth:1059},f:{x_min:64,x_max:731,y_min:0,y_max:1581,ha:1581,leftSideBearing:64,advanceWidth:725},g:{x_min:78,x_max:1133,y_min:-437,y_max:1102,ha:1539,leftSideBearing:78,advanceWidth:1157},h:{x_min:49,x_max:1255,y_min:0,y_max:1560,ha:1560,leftSideBearing:49,advanceWidth:1315},i:{x_min:67,x_max:590,y_min:0,y_max:1560,ha:1560,leftSideBearing:67,advanceWidth:652},j:{x_min:-56,x_max:381,y_min:-437,y_max:1560,ha:1997,leftSideBearing:-56,advanceWidth:525},k:{x_min:64,x_max:1248,y_min:0,y_max:1560,ha:1560,leftSideBearing:64,advanceWidth:1287},l:{x_min:64,x_max:587,y_min:0,y_max:1560,ha:1560,leftSideBearing:64,advanceWidth:653},m:{x_min:74,x_max:1905,y_min:0,y_max:1102,ha:1102,leftSideBearing:74,advanceWidth:1977},n:{x_min:74,x_max:1278,y_min:0,y_max:1102,ha:1102,leftSideBearing:74,advanceWidth:1343},o:{x_min:78,x_max:1046,y_min:-21,y_max:1102,ha:1123,leftSideBearing:78,advanceWidth:1124},p:{x_min:34,x_max:1119,y_min:-416,y_max:1102,ha:1518,leftSideBearing:34,advanceWidth:1197},q:{x_min:78,x_max:1135,y_min:-416,y_max:1102,ha:1518,leftSideBearing:78,advanceWidth:1139},r:{x_min:72,x_max:808,y_min:0,y_max:1102,ha:1102,leftSideBearing:72,advanceWidth:854},s:{x_min:104,x_max:933,y_min:-21,y_max:1102,ha:1123,leftSideBearing:104,advanceWidth:1022},t:{x_min:24,x_max:678,y_min:-17,y_max:1343,ha:1360,leftSideBearing:24,advanceWidth:730},u:{x_min:52,x_max:1181,y_min:-21,y_max:1082,ha:1103,leftSideBearing:52,advanceWidth:1245},v:{x_min:26,x_max:1176,y_min:0,y_max:1082,ha:1082,leftSideBearing:26,advanceWidth:1206},w:{x_min:52,x_max:1777,y_min:0,y_max:1082,ha:1082,leftSideBearing:52,advanceWidth:1823},x:{x_min:42,x_max:1163,y_min:0,y_max:1082,ha:1082,leftSideBearing:42,advanceWidth:1203},y:{x_min:24,x_max:1172,y_min:-437,y_max:1082,ha:1519,leftSideBearing:24,advanceWidth:1192},z:{x_min:88,x_max:960,y_min:0,y_max:1082,ha:1082,leftSideBearing:88,advanceWidth:1032},"{":{x_min:63,x_max:671,y_min:-364,y_max:1597,ha:1961,leftSideBearing:63,advanceWidth:701},"|":{x_min:150,x_max:307,y_min:-270,y_max:1456,ha:1726,leftSideBearing:150,advanceWidth:451},"}":{x_min:27,x_max:635,y_min:-364,y_max:1597,ha:1961,leftSideBearing:27,advanceWidth:701},"~":{x_min:121,x_max:1257,y_min:401,y_max:803,ha:402,leftSideBearing:121,advanceWidth:1386}},fontFamily:"Roboto Slab",resolution:2048,generatedOn:"2020-06-15T19:12:58.120Z"};k.load("Gonville",vi,Ei),k.load("Custom",Ti,wi),Si.setMusicFont("Gonville","Custom"),function(){{const t=ki,{fontFamily:e,resolution:i,glyphs:s}=t;k.load(e,t);const n="b";it.registerInfo({family:e,resolution:i,glyphs:s,maxSizeGlyph:n,monospaced:!1,bold:!1,italic:!1,superscriptOffset:.66,subscriptOffset:.66,serifs:!0,description:"Text font to pair with the Bravura / Gonville music fonts."})}{const t=Ci,{fontFamily:e,resolution:i,glyphs:s}=t;k.load(e,t);const n="b";it.registerInfo({family:e,resolution:i,glyphs:s,maxSizeGlyph:n,monospaced:!1,bold:!1,italic:!1,superscriptOffset:.66,subscriptOffset:.66,serifs:!1,description:"Text font to pair with the Petaluma music font."})}}();const Di=yi;return e=e.default})()})); +//# sourceMappingURL=vexflow-gonville.js.map \ No newline at end of file diff --git a/build/cjs/vexflow-gonville.js.map b/build/cjs/vexflow-gonville.js.map new file mode 100644 index 0000000000..c54c47b167 --- /dev/null +++ b/build/cjs/vexflow-gonville.js.map @@ -0,0 +1 @@ +{"version":3,"file":"vexflow-gonville.js","mappings":"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","sources":["webpack://Vex/webpack/universalModuleDefinition","webpack://Vex/webpack/bootstrap","webpack://Vex/webpack/runtime/define property getters","webpack://Vex/webpack/runtime/global","webpack://Vex/webpack/runtime/hasOwnProperty shorthand","webpack://Vex/./src/typeguard.ts","webpack://Vex/./src/util.ts","webpack://Vex/./src/fraction.ts","webpack://Vex/./src/boundingbox.ts","webpack://Vex/./src/boundingboxcomputation.ts","webpack://Vex/./src/font.ts","webpack://Vex/./src/registry.ts","webpack://Vex/./src/element.ts","webpack://Vex/./src/glyph.ts","webpack://Vex/./src/modifier.ts","webpack://Vex/./src/music.ts","webpack://Vex/./src/tables.ts","webpack://Vex/./src/accidental.ts","webpack://Vex/./src/stem.ts","webpack://Vex/./src/textformatter.ts","webpack://Vex/./src/annotation.ts","webpack://Vex/./src/articulation.ts","webpack://Vex/./src/rendercontext.ts","webpack://Vex/./src/tickable.ts","webpack://Vex/./src/note.ts","webpack://Vex/./src/stavemodifier.ts","webpack://Vex/./src/stavebarline.ts","webpack://Vex/./src/chordsymbol.ts","webpack://Vex/./src/voice.ts","webpack://Vex/./src/barnote.ts","webpack://Vex/./src/bend.ts","webpack://Vex/./src/dot.ts","webpack://Vex/./src/frethandfinger.ts","webpack://Vex/./src/stavetie.ts","webpack://Vex/./src/tabtie.ts","webpack://Vex/./src/gracenotegroup.ts","webpack://Vex/./src/notesubgroup.ts","webpack://Vex/./src/tickcontext.ts","webpack://Vex/./src/ornament.ts","webpack://Vex/./src/parenthesis.ts","webpack://Vex/./src/notehead.ts","webpack://Vex/./src/stemmablenote.ts","webpack://Vex/./src/stavenote.ts","webpack://Vex/./src/web.ts","webpack://Vex/./src/canvascontext.ts","webpack://Vex/./src/svgcontext.ts","webpack://Vex/./src/renderer.ts","webpack://Vex/./src/textnote.ts","webpack://Vex/./src/stavevolta.ts","webpack://Vex/./src/stringnumber.ts","webpack://Vex/./src/strokes.ts","webpack://Vex/./src/vibrato.ts","webpack://Vex/./src/modifiercontext.ts","webpack://Vex/./src/clef.ts","webpack://Vex/./src/keysignature.ts","webpack://Vex/./src/staverepetition.ts","webpack://Vex/./src/stavesection.ts","webpack://Vex/./src/stavetempo.ts","webpack://Vex/./src/stavetext.ts","webpack://Vex/./src/timesigglyph.ts","webpack://Vex/./src/timesignature.ts","webpack://Vex/./src/stave.ts","webpack://Vex/./src/staveconnector.ts","webpack://Vex/./src/formatter.ts","webpack://Vex/./src/tuplet.ts","webpack://Vex/./src/beam.ts","webpack://Vex/./src/clefnote.ts","webpack://Vex/./src/crescendo.ts","webpack://Vex/./src/curve.ts","webpack://Vex/./src/parser.ts","webpack://Vex/./src/easyscore.ts","webpack://Vex/./src/ghostnote.ts","webpack://Vex/./src/glyphnote.ts","webpack://Vex/./src/gracenote.ts","webpack://Vex/./src/keysignote.ts","webpack://Vex/./src/multimeasurerest.ts","webpack://Vex/./src/pedalmarking.ts","webpack://Vex/./src/repeatnote.ts","webpack://Vex/./src/staveline.ts","webpack://Vex/./src/system.ts","webpack://Vex/./src/tabnote.ts","webpack://Vex/./src/tabstave.ts","webpack://Vex/./src/textbracket.ts","webpack://Vex/./src/textdynamics.ts","webpack://Vex/./src/timesignote.ts","webpack://Vex/./src/vibratobracket.ts","webpack://Vex/./src/factory.ts","webpack://Vex/./src/stavehairpin.ts","webpack://Vex/./src/tabslide.ts","webpack://Vex/./src/tuning.ts","webpack://Vex/./src/flow.ts","webpack://Vex/./src/version.ts","webpack://Vex/./src/gracetabnote.ts","webpack://Vex/./src/keymanager.ts","webpack://Vex/./src/tremolo.ts","webpack://Vex/./src/vex.ts","webpack://Vex/./src/fonts/custom_glyphs.ts","webpack://Vex/./src/fonts/custom_metrics.ts","webpack://Vex/./src/fonts/gonville_glyphs.ts","webpack://Vex/./src/fonts/gonville_metrics.ts","webpack://Vex/./src/fonts/petalumascript_glyphs.ts","webpack://Vex/./src/fonts/robotoslab_glyphs.ts","webpack://Vex/./src/fonts/load_gonville.ts","webpack://Vex/./src/fonts/load_custom.ts","webpack://Vex/./entry/vexflow-gonville.ts","webpack://Vex/./src/fonts/textfonts.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Vex\"] = factory();\n\telse\n\t\troot[\"Vex\"] = factory();\n})((typeof window !== 'undefined' ? window : typeof globalThis !== 'undefined' ? globalThis : this), function() {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Ron B. Yeh\n// MIT License\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * Use instead of `instanceof` as a more flexible type guard.\n * @param obj check if this object's CATEGORY matches the provided category.\n * @param category a string representing a category of VexFlow objects.\n * @param checkAncestors defaults to `true`, so we walk up the prototype chain to look for a matching `CATEGORY`.\n * If `false`, we do not check the superclass or other ancestors.\n * @returns true if `obj` has a static `CATEGORY` property that matches `category`.\n */\nexport function isCategory(obj, category, checkAncestors = true) {\n // obj is undefined, a number, a primitive string, or null.\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n // `obj.constructor` is a reference to the constructor function that created the `obj` instance.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor\n let constructorFcn = obj.constructor;\n // Check if the object's static .CATEGORY matches the provided category.\n if (checkAncestors) {\n // Walk up the prototype chain to look for a matching obj.constructor.CATEGORY.\n while (obj !== null) {\n constructorFcn = obj.constructor;\n if ('CATEGORY' in constructorFcn && constructorFcn.CATEGORY === category) {\n return true;\n }\n obj = Object.getPrototypeOf(obj);\n }\n return false;\n }\n else {\n // Do not walk up the prototype chain. Just check this particular object's static .CATEGORY string.\n return 'CATEGORY' in constructorFcn && constructorFcn.CATEGORY === category;\n }\n}\nexport const isAccidental = (obj) => isCategory(obj, Category.Accidental);\nexport const isAnnotation = (obj) => isCategory(obj, Category.Annotation);\nexport const isBarline = (obj) => isCategory(obj, Category.Barline);\nexport const isDot = (obj) => isCategory(obj, Category.Dot);\nexport const isGraceNote = (obj) => isCategory(obj, Category.GraceNote);\nexport const isGraceNoteGroup = (obj) => isCategory(obj, Category.GraceNoteGroup);\nexport const isNote = (obj) => isCategory(obj, Category.Note);\nexport const isRenderContext = (obj) => isCategory(obj, Category.RenderContext);\nexport const isStaveNote = (obj) => isCategory(obj, Category.StaveNote);\nexport const isStemmableNote = (obj) => isCategory(obj, Category.StemmableNote);\nexport const isTabNote = (obj) => isCategory(obj, Category.TabNote);\n// 'const' enums are erased by the TypeScript compiler. The string values are inlined at all the use sites.\n// See: https://www.typescriptlang.org/docs/handbook/enums.html#const-enums\nexport var Category;\n(function (Category) {\n Category[\"Accidental\"] = \"Accidental\";\n Category[\"Annotation\"] = \"Annotation\";\n Category[\"Articulation\"] = \"Articulation\";\n Category[\"Barline\"] = \"Barline\";\n Category[\"BarNote\"] = \"BarNote\";\n Category[\"Beam\"] = \"Beam\";\n Category[\"Bend\"] = \"Bend\";\n Category[\"ChordSymbol\"] = \"ChordSymbol\";\n Category[\"Clef\"] = \"Clef\";\n Category[\"ClefNote\"] = \"ClefNote\";\n Category[\"Crescendo\"] = \"Crescendo\";\n Category[\"Curve\"] = \"Curve\";\n Category[\"Dot\"] = \"Dot\";\n Category[\"Element\"] = \"Element\";\n Category[\"Fraction\"] = \"Fraction\";\n Category[\"FretHandFinger\"] = \"FretHandFinger\";\n Category[\"GhostNote\"] = \"GhostNote\";\n Category[\"Glyph\"] = \"Glyph\";\n Category[\"GlyphNote\"] = \"GlyphNote\";\n Category[\"GraceNote\"] = \"GraceNote\";\n Category[\"GraceNoteGroup\"] = \"GraceNoteGroup\";\n Category[\"GraceTabNote\"] = \"GraceTabNote\";\n Category[\"KeySignature\"] = \"KeySignature\";\n Category[\"KeySigNote\"] = \"KeySigNote\";\n Category[\"Modifier\"] = \"Modifier\";\n Category[\"MultiMeasureRest\"] = \"MultiMeasureRest\";\n Category[\"Note\"] = \"Note\";\n Category[\"NoteHead\"] = \"NoteHead\";\n Category[\"NoteSubGroup\"] = \"NoteSubGroup\";\n Category[\"Ornament\"] = \"Ornament\";\n Category[\"Parenthesis\"] = \"Parenthesis\";\n Category[\"PedalMarking\"] = \"PedalMarking\";\n Category[\"RenderContext\"] = \"RenderContext\";\n Category[\"RepeatNote\"] = \"RepeatNote\";\n Category[\"Repetition\"] = \"Repetition\";\n Category[\"Stave\"] = \"Stave\";\n Category[\"StaveConnector\"] = \"StaveConnector\";\n Category[\"StaveHairpin\"] = \"StaveHairpin\";\n Category[\"StaveLine\"] = \"StaveLine\";\n Category[\"StaveModifier\"] = \"StaveModifier\";\n Category[\"StaveNote\"] = \"StaveNote\";\n Category[\"StaveSection\"] = \"StaveSection\";\n Category[\"StaveTempo\"] = \"StaveTempo\";\n Category[\"StaveText\"] = \"StaveText\";\n Category[\"StaveTie\"] = \"StaveTie\";\n Category[\"Stem\"] = \"Stem\";\n Category[\"StemmableNote\"] = \"StemmableNote\";\n Category[\"StringNumber\"] = \"StringNumber\";\n Category[\"Stroke\"] = \"Stroke\";\n Category[\"System\"] = \"System\";\n Category[\"TabNote\"] = \"TabNote\";\n Category[\"TabSlide\"] = \"TabSlide\";\n Category[\"TabStave\"] = \"TabStave\";\n Category[\"TabTie\"] = \"TabTie\";\n Category[\"TextBracket\"] = \"TextBracket\";\n Category[\"TextDynamics\"] = \"TextDynamics\";\n Category[\"TextNote\"] = \"TextNote\";\n Category[\"Tickable\"] = \"Tickable\";\n Category[\"TimeSignature\"] = \"TimeSignature\";\n Category[\"TimeSigNote\"] = \"TimeSigNote\";\n Category[\"Tremolo\"] = \"Tremolo\";\n Category[\"Tuplet\"] = \"Tuplet\";\n Category[\"Vibrato\"] = \"Vibrato\";\n Category[\"VibratoBracket\"] = \"VibratoBracket\";\n Category[\"Voice\"] = \"Voice\";\n Category[\"Volta\"] = \"Volta\";\n})(Category || (Category = {}));\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// Note: Keep this module free of imports to reduce the chance of circular dependencies.\n/** `RuntimeError` will be thrown by VexFlow classes in case of error. */\nexport class RuntimeError extends Error {\n constructor(code, message = '') {\n super('[RuntimeError] ' + code + ': ' + message);\n this.code = code;\n }\n}\n/** VexFlow can be used outside of the browser (e.g., Node) where `window` may not be defined. */\n// eslint-disable-next-line\nexport function globalObject() {\n if (typeof globalThis !== 'undefined') {\n return globalThis;\n }\n if (typeof self !== 'undefined') {\n return self;\n }\n if (typeof window !== 'undefined') {\n return window;\n }\n if (typeof global !== 'undefined') {\n return global;\n }\n return Function('return this')();\n}\n/**\n * Check that `x` is of type `T` and not `undefined`.\n * If `x` is `undefined`, throw a RuntimeError with the optionally provided error code and message.\n */\nexport function defined(x, code = 'undefined', message = '') {\n if (x === undefined) {\n throw new RuntimeError(code, message);\n }\n return x;\n}\n/** Default log function sends all arguments to console. */\n// eslint-disable-next-line\nexport function log(block, ...args) {\n if (!args)\n return;\n const line = Array.prototype.slice.call(args).join(' ');\n globalObject().console.log(block + ': ' + line);\n}\n/** Dump warning to console. */\n// eslint-disable-next-line\nexport function warn(...args) {\n const line = args.join(' ');\n const err = new Error();\n globalObject().console.log('Warning: ', line, err.stack);\n}\n/** Round number to nearest fractional value (`.5`, `.25`, etc.) */\nfunction roundN(x, n) {\n return x % n >= n / 2 ? parseInt(`${x / n}`, 10) * n + n : parseInt(`${x / n}`, 10) * n;\n}\n/** Locate the mid point between stave lines. Returns a fractional line if a space. */\nexport function midLine(a, b) {\n let mid_line = b + (a - b) / 2;\n if (mid_line % 2 > 0) {\n mid_line = roundN(mid_line * 10, 5) / 10;\n }\n return mid_line;\n}\n/**\n * Used by various classes (e.g., SVGContext) to provide a\n * unique prefix to element names (or other keys in shared namespaces).\n */\nexport function prefix(text) {\n return `vf-${text}`;\n}\n/**\n * Convert an arbitrary angle in radians to the equivalent one in the range [0, pi).\n */\nexport function normalizeAngle(a) {\n a = a % (2 * Math.PI);\n if (a < 0) {\n a += 2 * Math.PI;\n }\n return a;\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Author: Joshua Koo / @zz85\n// Author: @incompleteopus\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\n/** Fraction represents a rational number. */\nexport class Fraction {\n /** Set the numerator and denominator. */\n constructor(numerator, denominator) {\n this.numerator = 1;\n this.denominator = 1;\n this.set(numerator, denominator);\n }\n static get CATEGORY() {\n return Category.Fraction;\n }\n /**\n * GCD: Greatest common divisor using the Euclidean algorithm.\n * Note: GCD(0, 0) => 0 and GCD(0, n) => n.\n */\n static GCD(a, b) {\n if (typeof a !== 'number' || Number.isNaN(a) || typeof b !== 'number' || Number.isNaN(b)) {\n throw new RuntimeError('BadArgument', `Invalid numbers: ${a}, ${b}`);\n }\n let t;\n while (b !== 0) {\n t = b;\n b = a % b;\n a = t;\n }\n return a;\n }\n /** LCM: Lowest common multiple. */\n static LCM(a, b) {\n return (a * b) / Fraction.GCD(a, b);\n }\n /** Lowest common multiple for more than two numbers. */\n static LCMM(args) {\n if (args.length === 0) {\n return 0;\n }\n else if (args.length === 1) {\n return args[0];\n }\n else if (args.length === 2) {\n return Fraction.LCM(args[0], args[1]);\n }\n else {\n // args.shift() removes the first number.\n // LCM the first number with the rest of the numbers.\n return Fraction.LCM(args.shift(), Fraction.LCMM(args));\n }\n }\n /** Set the numerator and denominator. */\n set(numerator = 1, denominator = 1) {\n this.numerator = numerator;\n this.denominator = denominator;\n return this;\n }\n /** Return the value of the fraction. */\n value() {\n return this.numerator / this.denominator;\n }\n /** Simplify numerator and denominator using GCD. */\n simplify() {\n let u = this.numerator;\n let d = this.denominator;\n const gcd = Fraction.GCD(u, d);\n u /= gcd;\n d /= gcd;\n if (d < 0) {\n d = -d;\n u = -u;\n }\n return this.set(u, d);\n }\n /** Add value of another fraction. */\n add(param1 = 0, param2 = 1) {\n const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2);\n const lcm = Fraction.LCM(this.denominator, otherDenominator);\n const a = lcm / this.denominator;\n const b = lcm / otherDenominator;\n const u = this.numerator * a + otherNumerator * b;\n return this.set(u, lcm);\n }\n /** Substract value of another fraction. */\n subtract(param1 = 0, param2 = 1) {\n const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2);\n const lcm = Fraction.LCM(this.denominator, otherDenominator);\n const a = lcm / this.denominator;\n const b = lcm / otherDenominator;\n const u = this.numerator * a - otherNumerator * b;\n return this.set(u, lcm);\n }\n /** Multiply by value of another fraction. */\n multiply(param1 = 1, param2 = 1) {\n const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2);\n return this.set(this.numerator * otherNumerator, this.denominator * otherDenominator);\n }\n /** Divide by value of another Fraction. */\n divide(param1 = 1, param2 = 1) {\n const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2);\n return this.set(this.numerator * otherDenominator, this.denominator * otherNumerator);\n }\n /** Simplify both sides and check if they are equal. */\n equals(compare) {\n const a = Fraction.__staticFractionA.copy(compare).simplify();\n const b = Fraction.__staticFractionB.copy(this).simplify();\n return a.numerator === b.numerator && a.denominator === b.denominator;\n }\n /** Greater than operator. */\n greaterThan(compare) {\n const a = Fraction.__staticFractionB.copy(this);\n a.subtract(compare);\n return a.numerator > 0;\n }\n /** Greater than or equals operator. */\n greaterThanEquals(compare) {\n const a = Fraction.__staticFractionB.copy(this);\n a.subtract(compare);\n return a.numerator >= 0;\n }\n /** Less than operator. */\n lessThan(compare) {\n return !this.greaterThanEquals(compare);\n }\n /** Less than or equals operator. */\n lessThanEquals(compare) {\n return !this.greaterThan(compare);\n }\n /** Return a new copy with current values. */\n clone() {\n return new Fraction(this.numerator, this.denominator);\n }\n /** Copy value of another fraction. */\n copy(other) {\n if (typeof other === 'number') {\n return this.set(other, 1);\n }\n else {\n return this.set(other.numerator, other.denominator);\n }\n }\n /** Return the integer component (eg. 5/2 => 2). */\n quotient() {\n return Math.floor(this.numerator / this.denominator);\n }\n /** Return the remainder component (eg. 5/2 => 1). */\n remainder() {\n return this.numerator % this.denominator;\n }\n /** Calculate absolute value. */\n makeAbs() {\n this.denominator = Math.abs(this.denominator);\n this.numerator = Math.abs(this.numerator);\n return this;\n }\n /** Return a raw string representation (eg. \"5/2\"). */\n toString() {\n return `${this.numerator}/${this.denominator}`;\n }\n /** Return a simplified string respresentation. */\n toSimplifiedString() {\n return Fraction.__staticFractionTmp.copy(this).simplify().toString();\n }\n /** Return string representation in mixed form. */\n toMixedString() {\n let s = '';\n const q = this.quotient();\n const f = Fraction.__staticFractionTmp.copy(this);\n if (q < 0) {\n f.makeAbs();\n }\n if (q !== 0) {\n s += q;\n if (f.numerator !== 0) {\n s += ` ${f.toSimplifiedString()}`;\n }\n }\n else if (f.numerator === 0) {\n s = '0';\n }\n else {\n s = f.toSimplifiedString();\n }\n return s;\n }\n /** Parse a fraction string. */\n parse(str) {\n const i = str.split('/');\n const n = parseInt(i[0], 10);\n const d = i[1] ? parseInt(i[1], 10) : 1;\n return this.set(n, d);\n }\n}\n// Cached objects for comparisons.\nFraction.__staticFractionA = new Fraction();\nFraction.__staticFractionB = new Fraction();\nFraction.__staticFractionTmp = new Fraction();\n/** Helper function to extract the numerator and denominator from another fraction. */\nfunction getNumeratorAndDenominator(n, d = 1) {\n if (typeof n === 'number') {\n // Both params are numbers, so we return them as [numerator, denominator].\n return [n, d];\n }\n else {\n // First param is a Fraction object. We ignore the second param.\n return [n.numerator, n.denominator];\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nexport class BoundingBox {\n constructor(x, y, w, h) {\n this.x = x;\n this.y = y;\n this.w = w;\n this.h = h;\n }\n /**\n * Create a new copy.\n */\n static copy(that) {\n return new BoundingBox(that.x, that.y, that.w, that.h);\n }\n /** Get x position. */\n getX() {\n return this.x;\n }\n /** Get y position. */\n getY() {\n return this.y;\n }\n /** Get width. */\n getW() {\n return this.w;\n }\n /** Get height. */\n getH() {\n return this.h;\n }\n /** Set x position. */\n setX(x) {\n this.x = x;\n return this;\n }\n /** Set y position. */\n setY(y) {\n this.y = y;\n return this;\n }\n /** Set width. */\n setW(w) {\n this.w = w;\n return this;\n }\n /** Set height. */\n setH(h) {\n this.h = h;\n return this;\n }\n /** Move to position. */\n move(x, y) {\n this.x += x;\n this.y += y;\n return this;\n }\n /** Clone. */\n clone() {\n return BoundingBox.copy(this);\n }\n /**\n * Merge my box with given box. Creates a bigger bounding box unless\n * the given box is contained in this one.\n */\n mergeWith(boundingBox) {\n const that = boundingBox;\n const new_x = this.x < that.x ? this.x : that.x;\n const new_y = this.y < that.y ? this.y : that.y;\n const new_w = Math.max(this.x + this.w, that.x + that.w) - new_x;\n const new_h = Math.max(this.y + this.h, that.y + that.h) - new_y;\n this.x = new_x;\n this.y = new_y;\n this.w = new_w;\n this.h = new_h;\n return this;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n/**\n * BoundingBoxComputation computes metrics for a bounding box by continuously\n * taking canvas path commands.\n *\n * Warning: This class is merely a crutch to get bounding box information without\n * explicit metadata. This is likely to get deprecated following SMuFL support.\n *\n * based on: https://github.com/canvg/canvg/blob/master/src/BoundingBox.ts (MIT License)\n */\nexport class BoundingBoxComputation {\n constructor() {\n this.x1 = Number.NaN;\n this.y1 = Number.NaN;\n this.x2 = Number.NaN;\n this.y2 = Number.NaN;\n }\n /** Get calculated X1. */\n getX1() {\n return this.x1;\n }\n /** Get calculated Y1. */\n getY1() {\n return this.y1;\n }\n /** Get calculated width. */\n width() {\n return this.x2 - this.x1;\n }\n /** Get calculated height. */\n height() {\n return this.y2 - this.y1;\n }\n /** Add point to BoundingBox. */\n addPoint(x, y) {\n if (isNaN(this.x1) || x < this.x1)\n this.x1 = x;\n if (isNaN(this.x2) || x > this.x2)\n this.x2 = x;\n if (isNaN(this.y1) || y < this.y1)\n this.y1 = y;\n if (isNaN(this.y2) || y > this.y2)\n this.y2 = y;\n }\n /** Add X to BoundingBox. */\n addX(x) {\n this.addPoint(x, this.y1);\n }\n /** Add Y to BoundingBox. */\n addY(y) {\n this.addPoint(this.x1, y);\n }\n /** Add quadratic curve to BoundingBox. */\n addQuadraticCurve(p0x, p0y, p1x, p1y, p2x, p2y) {\n this.addPoint(p0x, p0y);\n this.addPoint(p2x, p2y);\n const p01x = p1x - p0x;\n const p12x = p2x - p1x;\n let denom = p01x - p12x;\n if (denom != 0) {\n const t = p01x / denom;\n if (t > 0 && t < 1) {\n const it = 1 - t;\n this.addX(it * it * p0x + 2 * it * t * p1x + t * t * p2x);\n }\n }\n const p01y = p1y - p0y;\n const p12y = p2y - p1y;\n denom = p01y - p12y;\n if (denom != 0) {\n const t = p01y / denom;\n if (t > 0 && t < 1) {\n const it = 1 - t;\n this.addY(it * it * p0y + 2 * it * t * p1y + t * t * p2y);\n }\n }\n }\n /** Add bezier curve to BoundingBox. */\n addBezierCurve(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) {\n // from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html\n const p0 = [p0x, p0y];\n const p1 = [p1x, p1y];\n const p2 = [p2x, p2y];\n const p3 = [p3x, p3y];\n let i;\n this.addPoint(p0[0], p0[1]);\n this.addPoint(p3[0], p3[1]);\n const f = (t, i) => Math.pow(1 - t, 3) * p0[i] +\n 3 * Math.pow(1 - t, 2) * t * p1[i] +\n 3 * (1 - t) * Math.pow(t, 2) * p2[i] +\n Math.pow(t, 3) * p3[i];\n for (i = 0; i <= 1; i++) {\n const b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i];\n const a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i];\n const c = 3 * p1[i] - 3 * p0[i];\n if (a === 0) {\n if (b === 0)\n continue;\n const t = -c / b;\n if (0 < t && t < 1) {\n if (i === 0)\n this.addX(f(t, i));\n if (i === 1)\n this.addY(f(t, i));\n }\n continue;\n }\n const b2ac = Math.pow(b, 2) - 4 * c * a;\n if (b2ac < 0)\n continue;\n const t1 = (-b + Math.sqrt(b2ac)) / (2 * a);\n if (0 < t1 && t1 < 1) {\n if (i === 0)\n this.addX(f(t1, i));\n if (i === 1)\n this.addY(f(t1, i));\n }\n const t2 = (-b - Math.sqrt(b2ac)) / (2 * a);\n if (0 < t2 && t2 < 1) {\n if (i === 0)\n this.addX(f(t2, i));\n if (i === 1)\n this.addY(f(t2, i));\n }\n }\n }\n}\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { defined } from './util';\nexport var FontWeight;\n(function (FontWeight) {\n FontWeight[\"NORMAL\"] = \"normal\";\n FontWeight[\"BOLD\"] = \"bold\";\n})(FontWeight || (FontWeight = {}));\nexport var FontStyle;\n(function (FontStyle) {\n FontStyle[\"NORMAL\"] = \"normal\";\n FontStyle[\"ITALIC\"] = \"italic\";\n})(FontStyle || (FontStyle = {}));\n// Internal element for parsing CSS font shorthand strings.\nlet fontParser;\nconst Fonts = {};\nexport class Font {\n /**\n * Use `Font.load(fontName)` to get a Font object.\n * Do not call this constructor directly.\n */\n constructor(fontName) {\n this.name = fontName;\n }\n /**\n * @param fontSize a font size to convert. Can be specified as a CSS length string (e.g., '16pt', '1em')\n * or as a number (the unit is assumed to be 'pt'). See `Font.scaleToPxFrom` for the supported\n * units (e.g., pt, em, %).\n * @returns the number of pixels that is equivalent to `fontSize`\n */\n static convertSizeToPixelValue(fontSize = Font.SIZE) {\n var _a;\n if (typeof fontSize === 'number') {\n // Assume the numeric fontSize is specified in pt.\n return fontSize * Font.scaleToPxFrom.pt;\n }\n else {\n const value = parseFloat(fontSize);\n if (isNaN(value)) {\n return 0;\n }\n const unit = fontSize.replace(/[\\d.\\s]/g, '').toLowerCase(); // Extract the unit by removing all numbers, dots, spaces.\n const conversionFactor = (_a = Font.scaleToPxFrom[unit]) !== null && _a !== void 0 ? _a : 1;\n return value * conversionFactor;\n }\n }\n /**\n * @param fontSize a font size to convert. Can be specified as a CSS length string (e.g., '16pt', '1em')\n * or as a number (the unit is assumed to be 'pt'). See `Font.scaleToPxFrom` for the supported\n * units (e.g., pt, em, %).\n * @returns the number of points that is equivalent to `fontSize`\n */\n static convertSizeToPointValue(fontSize = Font.SIZE) {\n var _a;\n if (typeof fontSize === 'number') {\n // Assume the numeric fontSize is specified in pt.\n return fontSize;\n }\n else {\n const value = parseFloat(fontSize);\n if (isNaN(value)) {\n return 0;\n }\n const unit = fontSize.replace(/[\\d.\\s]/g, '').toLowerCase(); // Extract the unit by removing all numbers, dots, spaces.\n const conversionFactor = ((_a = Font.scaleToPxFrom[unit]) !== null && _a !== void 0 ? _a : 1) / Font.scaleToPxFrom.pt;\n return value * conversionFactor;\n }\n }\n /**\n * @param f\n * @param size\n * @param weight\n * @param style\n * @returns the `size` field will include the units (e.g., '12pt', '16px').\n */\n static validate(f, size, weight, style) {\n // If f is a string but all other arguments are undefined, we assume that\n // f is CSS font shorthand (e.g., 'italic bold 10pt Arial').\n if (typeof f === 'string' && size === undefined && weight === undefined && style === undefined) {\n return Font.fromCSSString(f);\n }\n let family;\n if (typeof f === 'object') {\n // f is a FontInfo object, so we extract its fields.\n family = f.family;\n size = f.size;\n weight = f.weight;\n style = f.style;\n }\n else {\n // f is a string representing the font family name or undefined.\n family = f;\n }\n family = family !== null && family !== void 0 ? family : Font.SANS_SERIF;\n size = size !== null && size !== void 0 ? size : Font.SIZE + 'pt';\n weight = weight !== null && weight !== void 0 ? weight : FontWeight.NORMAL;\n style = style !== null && style !== void 0 ? style : FontStyle.NORMAL;\n if (weight === '') {\n weight = FontWeight.NORMAL;\n }\n if (style === '') {\n style = FontStyle.NORMAL;\n }\n // If size is a number, we assume the unit is `pt`.\n if (typeof size === 'number') {\n size = `${size}pt`;\n }\n // If weight is a number (e.g., 900), turn it into a string representation of that number.\n if (typeof weight === 'number') {\n weight = weight.toString();\n }\n // At this point, `family`, `size`, `weight`, and `style` are all strings.\n return { family, size, weight, style };\n }\n /**\n * @param cssFontShorthand a string formatted as CSS font shorthand (e.g., 'italic bold 15pt Arial').\n */\n static fromCSSString(cssFontShorthand) {\n // Let the browser parse this string for us.\n // First, create a span element.\n // Then, set its style.font and extract it back out.\n if (!fontParser) {\n fontParser = document.createElement('span');\n }\n fontParser.style.font = cssFontShorthand;\n const { fontFamily, fontSize, fontWeight, fontStyle } = fontParser.style;\n return { family: fontFamily, size: fontSize, weight: fontWeight, style: fontStyle };\n }\n /**\n * @returns a CSS font shorthand string of the form `italic bold 16pt Arial`.\n */\n static toCSSString(fontInfo) {\n var _a;\n if (!fontInfo) {\n return '';\n }\n let style;\n const st = fontInfo.style;\n if (st === FontStyle.NORMAL || st === '' || st === undefined) {\n style = ''; // no space! Omit the style section.\n }\n else {\n style = st.trim() + ' ';\n }\n let weight;\n const wt = fontInfo.weight;\n if (wt === FontWeight.NORMAL || wt === '' || wt === undefined) {\n weight = ''; // no space! Omit the weight section.\n }\n else if (typeof wt === 'number') {\n weight = wt + ' ';\n }\n else {\n weight = wt.trim() + ' ';\n }\n let size;\n const sz = fontInfo.size;\n if (sz === undefined) {\n size = Font.SIZE + 'pt ';\n }\n else if (typeof sz === 'number') {\n size = sz + 'pt ';\n }\n else {\n // size is already a string.\n size = sz.trim() + ' ';\n }\n const family = (_a = fontInfo.family) !== null && _a !== void 0 ? _a : Font.SANS_SERIF;\n return `${style}${weight}${size}${family}`;\n }\n /**\n * @param fontSize a number representing a font size, or a string font size with units.\n * @param scaleFactor multiply the size by this factor.\n * @returns size * scaleFactor (e.g., 16pt * 3 = 48pt, 8px * 0.5 = 4px, 24 * 2 = 48).\n * If the fontSize argument was a number, the return value will be a number.\n * If the fontSize argument was a string, the return value will be a string.\n */\n static scaleSize(fontSize, scaleFactor) {\n if (typeof fontSize === 'number') {\n return (fontSize * scaleFactor);\n }\n else {\n const value = parseFloat(fontSize);\n const unit = fontSize.replace(/[\\d.\\s]/g, ''); // Remove all numbers, dots, spaces.\n return `${value * scaleFactor}${unit}`;\n }\n }\n /**\n * @param weight a string (e.g., 'bold') or a number (e.g., 600 / semi-bold in the OpenType spec).\n * @returns true if the font weight indicates bold.\n */\n static isBold(weight) {\n if (!weight) {\n return false;\n }\n else if (typeof weight === 'number') {\n return weight >= 600;\n }\n else {\n // a string can be 'bold' or '700'\n const parsedWeight = parseInt(weight, 10);\n if (isNaN(parsedWeight)) {\n return weight.toLowerCase() === 'bold';\n }\n else {\n return parsedWeight >= 600;\n }\n }\n }\n /**\n * @param style\n * @returns true if the font style indicates 'italic'.\n */\n static isItalic(style) {\n if (!style) {\n return false;\n }\n else {\n return style.toLowerCase() === FontStyle.ITALIC;\n }\n }\n /**\n * @param fontName\n * @param woffURL The absolute or relative URL to the woff file.\n * @param includeWoff2 If true, we assume that a woff2 file is in\n * the same folder as the woff file, and will append a `2` to the url.\n */\n // Support distributions of the typescript compiler that do not yet include the FontFace API declarations.\n // eslint-disable-next-line\n // @ts-ignore\n static loadWebFont(fontName, woffURL, includeWoff2 = true) {\n return __awaiter(this, void 0, void 0, function* () {\n const woff2URL = includeWoff2 ? `url(${woffURL}2) format('woff2'), ` : '';\n const woff1URL = `url(${woffURL}) format('woff')`;\n const woffURLs = woff2URL + woff1URL;\n // eslint-disable-next-line\n // @ts-ignore\n const fontFace = new FontFace(fontName, woffURLs);\n yield fontFace.load();\n // eslint-disable-next-line\n // @ts-ignore\n document.fonts.add(fontFace);\n return fontFace;\n });\n }\n /**\n * Load the web fonts that are used by ChordSymbol. For example, `flow.html` calls:\n * `await Vex.Flow.Font.loadWebFonts();`\n * Alternatively, you may load web fonts with a stylesheet link (e.g., from Google Fonts),\n * and a @font-face { font-family: ... } rule in your CSS.\n * If you do not load either of these fonts, ChordSymbol will fall back to Times or Arial,\n * depending on the current music engraving font.\n *\n * You can customize `Font.WEB_FONT_HOST` and `Font.WEB_FONT_FILES` to load different fonts\n * for your app.\n */\n static loadWebFonts() {\n return __awaiter(this, void 0, void 0, function* () {\n const host = Font.WEB_FONT_HOST;\n const files = Font.WEB_FONT_FILES;\n for (const fontName in files) {\n const fontPath = files[fontName];\n Font.loadWebFont(fontName, host + fontPath);\n }\n });\n }\n static loadTextFonts() {\n //\n }\n /**\n * @param fontName\n * @param data optionally set the Font object's `.data` property.\n * This is usually done when setting up a font for the first time.\n * @param metrics optionally set the Font object's `.metrics` property.\n * This is usually done when setting up a font for the first time.\n * @returns a Font object with the given `fontName`.\n * Reuse an existing Font object if a matching one is found.\n */\n static load(fontName, data, metrics) {\n let font = Fonts[fontName];\n if (!font) {\n font = new Font(fontName);\n Fonts[fontName] = font;\n }\n if (data) {\n font.setData(data);\n }\n if (metrics) {\n font.setMetrics(metrics);\n }\n return font;\n }\n getName() {\n return this.name;\n }\n getData() {\n return defined(this.data, 'FontError', 'Missing font data');\n }\n getMetrics() {\n return defined(this.metrics, 'FontError', 'Missing metrics');\n }\n setData(data) {\n this.data = data;\n }\n setMetrics(metrics) {\n this.metrics = metrics;\n }\n hasData() {\n return this.data !== undefined;\n }\n getResolution() {\n return this.getData().resolution;\n }\n getGlyphs() {\n return this.getData().glyphs;\n }\n /**\n * Use the provided key to look up a value in this font's metrics file (e.g., bravura_metrics.ts, petaluma_metrics.ts).\n * @param key is a string separated by periods (e.g., stave.endPaddingMax, clef.lineCount.'5'.shiftY).\n * @param defaultValue is returned if the lookup fails.\n * @returns the retrieved value (or `defaultValue` if the lookup fails).\n */\n // eslint-disable-next-line\n lookupMetric(key, defaultValue) {\n const keyParts = key.split('.');\n // Start with the top level font metrics object, and keep looking deeper into the object (via each part of the period-delimited key).\n let currObj = this.getMetrics();\n for (let i = 0; i < keyParts.length; i++) {\n const keyPart = keyParts[i];\n const value = currObj[keyPart];\n if (value === undefined) {\n // If the key lookup fails, we fall back to the defaultValue.\n return defaultValue;\n }\n // The most recent lookup succeeded, so we drill deeper into the object.\n currObj = value;\n }\n // After checking every part of the key (i.e., the loop completed), return the most recently retrieved value.\n return currObj;\n }\n /** For debugging. */\n toString() {\n return '[' + this.name + ' Font]';\n }\n}\n//////////////////////////////////////////////////////////////////////////////////////////////////\n// STATIC MEMBERS\n/** Default sans-serif font family. */\nFont.SANS_SERIF = 'Arial, sans-serif';\n/** Default serif font family. */\nFont.SERIF = 'Times New Roman, serif';\n/** Default font size in `pt`. */\nFont.SIZE = 10;\n// CSS Font Sizes: 36pt == 48px == 3em == 300% == 0.5in\n/** Given a length (for units: pt, px, em, %, in, mm, cm) what is the scale factor to convert it to px? */\nFont.scaleToPxFrom = {\n pt: 4 / 3,\n px: 1,\n em: 16,\n '%': 4 / 25,\n in: 96,\n mm: 96 / 25.4,\n cm: 96 / 2.54,\n};\n/**\n * Customize this field to specify a different CDN for delivering web fonts.\n * Alternative: https://cdn.jsdelivr.net/npm/vexflow-fonts@1.0.3/\n * Or you can use your own host.\n */\nFont.WEB_FONT_HOST = 'https://unpkg.com/vexflow-fonts@1.0.3/';\n/**\n * These font files will be loaded from the CDN specified by `Font.WEB_FONT_HOST` when\n * `await Font.loadWebFonts()` is called. Customize this field to specify a different\n * set of fonts to load. See: `Font.loadWebFonts()`.\n */\nFont.WEB_FONT_FILES = {\n 'Roboto Slab': 'robotoslab/RobotoSlab-Medium_2.001.woff',\n PetalumaScript: 'petaluma/PetalumaScript_1.10_FS.woff',\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Mohit Cheppudira\n//\n// ## Description\n//\n// This file implements a registry for VexFlow elements. It allows users\n// to track, query, and manage some subset of generated elements, and\n// dynamically get and set attributes.\n//\n// There are two ways to register with a registry:\n//\n// 1) Explicitly call `registry.register(elem:Element, id?:string)`, or,\n// 2) Call `Registry.enableDefaultRegistry(registry)` when ready, and all future\n// elements will automatically register with it.\n//\n// Once an element is registered, selected attributes are tracked and indexed by\n// the registry. This allows fast look up of elements by attributes like id, type,\n// and class.\nimport { RuntimeError } from './util';\n// Indexes are represented as maps of maps of maps. This allows\n// for both multi-labeling (e.g., an element can have multiple classes)\n// and efficient lookup.\nclass Index {\n constructor() {\n this.id = {};\n this.type = {};\n this.class = {};\n }\n}\nexport class Registry {\n constructor() {\n this.index = new Index();\n }\n static getDefaultRegistry() {\n return Registry.defaultRegistry;\n }\n // If you call `enableDefaultRegistry`, any new elements will auto-register with\n // the provided registry as soon as they're constructed.\n static enableDefaultRegistry(registry) {\n Registry.defaultRegistry = registry;\n }\n static disableDefaultRegistry() {\n Registry.defaultRegistry = undefined;\n }\n clear() {\n this.index = new Index();\n return this;\n }\n setIndexValue(name, value, id, elem) {\n const index = this.index;\n if (!index[name][value]) {\n index[name][value] = {};\n }\n index[name][value][id] = elem;\n }\n // Updates the indexes for element 'id'. If an element's attribute changes\n // from A -> B, make sure to remove the element from A.\n updateIndex({ id, name, value, oldValue }) {\n const elem = this.getElementById(id);\n if (oldValue !== undefined && this.index[name][oldValue]) {\n delete this.index[name][oldValue][id];\n }\n if (value && elem) {\n this.setIndexValue(name, value, elem.getAttribute('id'), elem);\n }\n }\n /**\n * Register element `elem` with this registry.\n * This adds the element to its index and watches it for attribute changes.\n * @param elem\n * @param id\n * @returns this\n */\n register(elem, id) {\n id = id || elem.getAttribute('id');\n if (!id) {\n throw new RuntimeError(\"Can't add element without `id` attribute to registry\");\n }\n // Manually add id to index, then update other indexes.\n elem.setAttribute('id', id);\n this.setIndexValue('id', id, id, elem);\n this.updateIndex({ id, name: 'type', value: elem.getAttribute('type'), oldValue: undefined });\n elem.onRegister(this);\n return this;\n }\n getElementById(id) {\n var _a, _b;\n return (_b = (_a = this.index.id) === null || _a === void 0 ? void 0 : _a[id]) === null || _b === void 0 ? void 0 : _b[id]; // return undefined if the id is not found.\n }\n getElementsByAttribute(attribute, value) {\n const index_attr = this.index[attribute];\n if (index_attr) {\n const index_attr_val = index_attr[value];\n if (index_attr_val) {\n const keys = Object.keys(index_attr_val);\n return keys.map((k) => index_attr_val[k]);\n }\n }\n return [];\n }\n getElementsByType(type) {\n return this.getElementsByAttribute('type', type);\n }\n getElementsByClass(className) {\n return this.getElementsByAttribute('class', className);\n }\n // This is called by the element when an attribute value changes. If an indexed\n // attribute changes, then update the local index.\n onUpdate(info) {\n const allowedNames = ['id', 'type', 'class'];\n if (allowedNames.includes(info.name)) {\n this.updateIndex(info);\n }\n return this;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Mohit Cheppudira\n// MIT License\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Registry } from './registry';\nimport { Category } from './typeguard';\nimport { defined } from './util';\n/**\n * Element implements a generic base class for VexFlow, with implementations\n * of general functions and properties that can be inherited by all VexFlow elements.\n */\nexport class Element {\n constructor() {\n var _a;\n this.attrs = {\n id: Element.newID(),\n el: undefined,\n type: this.getCategory(),\n classes: {},\n };\n this.rendered = false;\n // If a default registry exist, then register with it right away.\n (_a = Registry.getDefaultRegistry()) === null || _a === void 0 ? void 0 : _a.register(this);\n }\n static get CATEGORY() {\n return Category.Element;\n }\n static newID() {\n return `auto${Element.ID++}`;\n }\n /** Get element category string. */\n getCategory() {\n return this.constructor.CATEGORY;\n }\n /**\n * Set the element style used to render.\n *\n * Example:\n * ```typescript\n * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' });\n * element.draw();\n * ```\n * Note: If the element draws additional sub-elements (ie.: Modifiers in a Stave),\n * the style can be applied to all of them by means of the context:\n * ```typescript\n * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' });\n * element.getContext().setFillStyle('red');\n * element.getContext().setStrokeStyle('red');\n * element.draw();\n * ```\n * or using drawWithStyle:\n * ```typescript\n * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' });\n * element.drawWithStyle();\n * ```\n */\n setStyle(style) {\n this.style = style;\n return this;\n }\n /** Get the element style used for rendering. */\n getStyle() {\n return this.style;\n }\n /** Apply the element style to `context`. */\n applyStyle(context = this.context, style = this.getStyle()) {\n if (!style)\n return this;\n if (!context)\n return this;\n context.save();\n if (style.shadowColor)\n context.setShadowColor(style.shadowColor);\n if (style.shadowBlur)\n context.setShadowBlur(style.shadowBlur);\n if (style.fillStyle)\n context.setFillStyle(style.fillStyle);\n if (style.strokeStyle)\n context.setStrokeStyle(style.strokeStyle);\n if (style.lineWidth)\n context.setLineWidth(style.lineWidth);\n return this;\n }\n /** Restore the style of `context`. */\n restoreStyle(context = this.context, style = this.getStyle()) {\n if (!style)\n return this;\n if (!context)\n return this;\n context.restore();\n return this;\n }\n /**\n * Draw the element and all its sub-elements (ie.: Modifiers in a Stave)\n * with the element style.\n */\n drawWithStyle() {\n this.checkContext();\n this.applyStyle();\n this.draw();\n this.restoreStyle();\n }\n /** Check if it has a class label (An element can have multiple class labels). */\n hasClass(className) {\n return this.attrs.classes[className] === true;\n }\n /** Add a class label (An element can have multiple class labels). */\n addClass(className) {\n var _a;\n this.attrs.classes[className] = true;\n (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({\n id: this.attrs.id,\n name: 'class',\n value: className,\n oldValue: undefined,\n });\n return this;\n }\n /** Remove a class label (An element can have multiple class labels). */\n removeClass(className) {\n var _a;\n delete this.attrs.classes[className];\n (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({\n id: this.attrs.id,\n name: 'class',\n value: undefined,\n oldValue: className,\n });\n return this;\n }\n /** Call back from registry after the element is registered. */\n onRegister(registry) {\n this.registry = registry;\n return this;\n }\n /** Return the rendered status. */\n isRendered() {\n return this.rendered;\n }\n /** Set the rendered status. */\n setRendered(rendered = true) {\n this.rendered = rendered;\n return this;\n }\n /** Return the element attributes. */\n getAttributes() {\n return this.attrs;\n }\n /** Return an attribute. */\n // eslint-disable-next-line\n getAttribute(name) {\n return this.attrs[name];\n }\n /** Set an attribute. */\n // eslint-disable-next-line\n setAttribute(name, value) {\n var _a;\n const oldID = this.attrs.id;\n const oldValue = this.attrs[name];\n this.attrs[name] = value;\n // Register with old id to support id changes.\n (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({ id: oldID, name, value, oldValue });\n return this;\n }\n /** Get the boundingBox. */\n getBoundingBox() {\n return this.boundingBox;\n }\n /** Return the context. */\n getContext() {\n return this.context;\n }\n /** Set the context. */\n setContext(context) {\n this.context = context;\n return this;\n }\n /** Validate and return the context. */\n checkContext() {\n return defined(this.context, 'NoContext', 'No rendering context attached to instance.');\n }\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // Font Handling\n /**\n * Provide a CSS compatible font string (e.g., 'bold 16px Arial').\n */\n set font(f) {\n this.setFont(f);\n }\n /** Returns the CSS compatible font string. */\n get font() {\n return Font.toCSSString(this.textFont);\n }\n /**\n * Set the element's font family, size, weight, style (e.g., `Arial`, `10pt`, `bold`, `italic`).\n * @param font is 1) a `FontInfo` object or\n * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or\n * 3) a string representing the font family (at least one of `size`, `weight`, or `style` must also be provided).\n * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt').\n * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900).\n * @param style is a string (e.g., 'italic', 'normal').\n * If no arguments are provided, then the font is set to the default font.\n * Each Element subclass may specify its own default by overriding the static `TEXT_FONT` property.\n */\n setFont(font, size, weight, style) {\n // Allow subclasses to override `TEXT_FONT`.\n const defaultTextFont = this.constructor.TEXT_FONT;\n const fontIsObject = typeof font === 'object';\n const fontIsString = typeof font === 'string';\n const fontIsUndefined = font === undefined;\n const sizeWeightStyleAreUndefined = size === undefined && weight === undefined && style === undefined;\n if (fontIsObject) {\n // `font` is case 1) a FontInfo object\n this.textFont = Object.assign(Object.assign({}, defaultTextFont), font);\n }\n else if (fontIsString && sizeWeightStyleAreUndefined) {\n // `font` is case 2) CSS font shorthand.\n this.textFont = Font.fromCSSString(font);\n }\n else if (fontIsUndefined && sizeWeightStyleAreUndefined) {\n // All arguments are undefined. Do not check for `arguments.length === 0`,\n // which fails on the edge case: `setFont(undefined)`.\n // TODO: See if we can remove this case entirely without introducing a visual diff.\n // The else case below seems like it should be equivalent to this case.\n this.textFont = Object.assign({}, defaultTextFont);\n }\n else {\n // `font` is case 3) a font family string (e.g., 'Times New Roman').\n // The other parameters represent the size, weight, and style.\n // It is okay for `font` to be undefined while one or more of the other arguments is provided.\n // Following CSS conventions, unspecified params are reset to the default.\n this.textFont = Font.validate(font !== null && font !== void 0 ? font : defaultTextFont.family, size !== null && size !== void 0 ? size : defaultTextFont.size, weight !== null && weight !== void 0 ? weight : defaultTextFont.weight, style !== null && style !== void 0 ? style : defaultTextFont.style);\n }\n return this;\n }\n getFont() {\n if (!this.textFont) {\n this.resetFont();\n }\n return Font.toCSSString(this.textFont);\n }\n /**\n * Reset the text font to the style indicated by the static `TEXT_FONT` property.\n * Subclasses can call this to initialize `textFont` for the first time.\n */\n resetFont() {\n this.setFont();\n }\n /** Return a copy of the current FontInfo object. */\n get fontInfo() {\n if (!this.textFont) {\n this.resetFont();\n }\n // We can cast to Required here, because\n // we just called resetFont() above to ensure this.textFont is set.\n return Object.assign({}, this.textFont);\n }\n set fontInfo(fontInfo) {\n this.setFont(fontInfo);\n }\n /** Change the font size, while keeping everything else the same. */\n setFontSize(size) {\n const fontInfo = this.fontInfo;\n this.setFont(fontInfo.family, size, fontInfo.weight, fontInfo.style);\n return this;\n }\n /**\n * @returns a CSS font-size string (e.g., '18pt', '12px', '1em').\n * See Element.fontSizeInPixels or Element.fontSizeInPoints if you need to get a number for calculation purposes.\n */\n getFontSize() {\n return this.fontSize;\n }\n /**\n * The size is 1) a string of the form '10pt' or '16px', compatible with the CSS font-size property.\n * or 2) a number, which is interpreted as a point size (i.e. 12 == '12pt').\n */\n set fontSize(size) {\n this.setFontSize(size);\n }\n /**\n * @returns a CSS font-size string (e.g., '18pt', '12px', '1em').\n */\n get fontSize() {\n let size = this.fontInfo.size;\n if (typeof size === 'number') {\n size = `${size}pt`;\n }\n return size;\n }\n /**\n * @returns the font size in `pt`.\n */\n get fontSizeInPoints() {\n return Font.convertSizeToPointValue(this.fontSize);\n }\n /**\n * @returns the font size in `px`.\n */\n get fontSizeInPixels() {\n return Font.convertSizeToPixelValue(this.fontSize);\n }\n /**\n * @returns a CSS font-style string (e.g., 'italic').\n */\n get fontStyle() {\n return this.fontInfo.style;\n }\n set fontStyle(style) {\n const fontInfo = this.fontInfo;\n this.setFont(fontInfo.family, fontInfo.size, fontInfo.weight, style);\n }\n /**\n * @returns a CSS font-weight string (e.g., 'bold').\n * As in CSS, font-weight is always returned as a string, even if it was set as a number.\n */\n get fontWeight() {\n return this.fontInfo.weight + '';\n }\n set fontWeight(weight) {\n const fontInfo = this.fontInfo;\n this.setFont(fontInfo.family, fontInfo.size, weight, fontInfo.style);\n }\n}\nElement.ID = 1000;\n/**\n * Default font for text. This is not related to music engraving. Instead, see `Flow.setMusicFont(...fontNames)`\n * to customize the font for musical symbols placed on the score.\n */\nElement.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: Font.SIZE,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { BoundingBox } from './boundingbox';\nimport { BoundingBoxComputation } from './boundingboxcomputation';\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nexport var OutlineCode;\n(function (OutlineCode) {\n OutlineCode[OutlineCode[\"MOVE\"] = 0] = \"MOVE\";\n OutlineCode[OutlineCode[\"LINE\"] = 1] = \"LINE\";\n OutlineCode[OutlineCode[\"QUADRATIC\"] = 2] = \"QUADRATIC\";\n OutlineCode[OutlineCode[\"BEZIER\"] = 3] = \"BEZIER\";\n})(OutlineCode || (OutlineCode = {}));\nclass GlyphCacheEntry {\n constructor(fontStack, code, category) {\n this.point = -1;\n this.metrics = Glyph.loadMetrics(fontStack, code, category);\n this.bbox = Glyph.getOutlineBoundingBox(this.metrics.outline, this.metrics.scale, this.metrics.x_shift, this.metrics.y_shift);\n if (category) {\n this.point = Glyph.lookupFontMetric(this.metrics.font, category, code, 'point', -1);\n }\n }\n}\nclass GlyphCache {\n constructor() {\n this.cache = new Map();\n }\n lookup(code, category) {\n let entries = this.cache.get(Glyph.CURRENT_CACHE_KEY);\n if (entries === undefined) {\n entries = {};\n this.cache.set(Glyph.CURRENT_CACHE_KEY, entries);\n }\n const key = category ? `${code}%${category}` : code;\n let entry = entries[key];\n if (entry === undefined) {\n entry = new GlyphCacheEntry(Glyph.MUSIC_FONT_STACK, code, category);\n entries[key] = entry;\n }\n return entry;\n }\n}\nclass GlyphOutline {\n constructor(outline, originX, originY, scale) {\n this.outline = outline;\n this.originX = originX;\n this.originY = originY;\n this.scale = scale;\n this.i = 0;\n // Automatically assign private properties: this.outline, this.originX, this.originY, and this.scale.\n }\n done() {\n return this.i >= this.outline.length;\n }\n next() {\n return this.outline[this.i++];\n }\n nextX() {\n return this.originX + this.outline[this.i++] * this.scale;\n }\n nextY() {\n return this.originY - this.outline[this.i++] * this.scale;\n }\n static parse(str) {\n const result = [];\n const parts = str.split(' ');\n let i = 0;\n while (i < parts.length) {\n switch (parts[i++]) {\n case 'm':\n result.push(OutlineCode.MOVE, parseInt(parts[i++]), parseInt(parts[i++]));\n break;\n case 'l':\n result.push(OutlineCode.LINE, parseInt(parts[i++]), parseInt(parts[i++]));\n break;\n case 'q':\n result.push(OutlineCode.QUADRATIC, parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]));\n break;\n case 'b':\n result.push(OutlineCode.BEZIER, parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]));\n break;\n }\n }\n return result;\n }\n}\nexport class Glyph extends Element {\n /**\n * @param code\n * @param point\n * @param options\n */\n constructor(code, point, options) {\n super();\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // INSTANCE MEMBERS\n this.bbox = new BoundingBox(0, 0, 0, 0);\n this.topGlyphs = [];\n this.botGlyphs = [];\n this.options = {};\n this.scale = 1;\n this.code = code;\n this.point = point;\n this.originShift = { x: 0, y: 0 };\n this.x_shift = 0;\n this.y_shift = 0;\n if (options) {\n this.setOptions(options);\n }\n else {\n this.reset();\n }\n }\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // STATIC MEMBERS\n static get CATEGORY() {\n return Category.Glyph;\n }\n /**\n * Pass a key of the form `glyphs.{category}.{code}.{key}` to Font.lookupMetric(). If the initial lookup fails,\n * try again with the path `glyphs.{category}.{key}`. If the second lookup fails, return the defaultValue.\n *\n * @param font\n * @param category any metric path under 'glyphs', so 'stem.up' could resolve to glyphs.stem.up.shiftX, glyphs.stem.up.shiftY, etc.\n * @param code\n * @param key\n * @param defaultValue\n */\n static lookupFontMetric(font, category, code, key, defaultValue) {\n let value = font.lookupMetric(`glyphs.${category}.${code}.${key}`, undefined);\n if (value === undefined) {\n // The first lookup failed, so we omit .${code} and try again (with a defaultValue this time).\n value = font.lookupMetric(`glyphs.${category}.${key}`, defaultValue);\n }\n return value;\n }\n static lookupGlyph(fontStack, code) {\n defined(fontStack, 'BadFontStack', 'Font stack is misconfigured');\n let glyph;\n let font;\n for (let i = 0; i < fontStack.length; i++) {\n font = fontStack[i];\n glyph = font.getGlyphs()[code];\n if (glyph)\n return { glyph, font };\n }\n throw new RuntimeError('BadGlyph', `Glyph ${code} does not exist in font.`);\n }\n static loadMetrics(fontStack, code, category) {\n const { glyph, font } = Glyph.lookupGlyph(fontStack, code);\n if (!glyph.o)\n throw new RuntimeError('BadGlyph', `Glyph ${code} has no outline defined.`);\n let x_shift = 0;\n let y_shift = 0;\n let scale = 1;\n if (category && font) {\n x_shift = Glyph.lookupFontMetric(font, category, code, 'shiftX', 0);\n y_shift = Glyph.lookupFontMetric(font, category, code, 'shiftY', 0);\n scale = Glyph.lookupFontMetric(font, category, code, 'scale', 1);\n }\n const x_min = glyph.x_min;\n const x_max = glyph.x_max;\n const ha = glyph.ha;\n if (!glyph.cached_outline) {\n glyph.cached_outline = GlyphOutline.parse(glyph.o);\n }\n return {\n x_min,\n x_max,\n x_shift,\n y_shift,\n scale,\n ha,\n outline: glyph.cached_outline,\n font,\n width: x_max - x_min,\n height: ha,\n };\n }\n /**\n * Renders glyphs from the default font stack.\n *\n * @param ctx Canvas or SVG context\n * @param x_pos x coordinate\n * @param y_pos y coordinate\n * @param point the point size of the font\n * @param code the glyph code in font.getGlyphs()\n * @param options\n * @returns\n */\n static renderGlyph(ctx, x_pos, y_pos, point, code, options) {\n var _a;\n const data = Glyph.cache.lookup(code, options === null || options === void 0 ? void 0 : options.category);\n const metrics = data.metrics;\n if (data.point != -1) {\n point = data.point;\n }\n const customScale = (_a = options === null || options === void 0 ? void 0 : options.scale) !== null && _a !== void 0 ? _a : 1;\n const scale = ((point * 72.0) / (metrics.font.getResolution() * 100.0)) * metrics.scale * customScale;\n Glyph.renderOutline(ctx, metrics.outline, scale, x_pos + metrics.x_shift * customScale, y_pos + metrics.y_shift * customScale);\n return metrics;\n }\n static renderOutline(ctx, outline, scale, x_pos, y_pos) {\n const go = new GlyphOutline(outline, x_pos, y_pos, scale);\n ctx.beginPath();\n let x, y;\n while (!go.done()) {\n switch (go.next()) {\n case OutlineCode.MOVE:\n ctx.moveTo(go.nextX(), go.nextY());\n break;\n case OutlineCode.LINE:\n ctx.lineTo(go.nextX(), go.nextY());\n break;\n case OutlineCode.QUADRATIC:\n x = go.nextX();\n y = go.nextY();\n ctx.quadraticCurveTo(go.nextX(), go.nextY(), x, y);\n break;\n case OutlineCode.BEZIER:\n x = go.nextX();\n y = go.nextY();\n ctx.bezierCurveTo(go.nextX(), go.nextY(), go.nextX(), go.nextY(), x, y);\n break;\n }\n }\n ctx.fill();\n }\n static getOutlineBoundingBox(outline, scale, x_pos, y_pos) {\n const go = new GlyphOutline(outline, x_pos, y_pos, scale);\n const bboxComp = new BoundingBoxComputation();\n // (penX, penY) hold the pen position: the start of each stroke.\n let penX = x_pos;\n let penY = y_pos;\n let x, y;\n while (!go.done()) {\n switch (go.next()) {\n case OutlineCode.MOVE:\n // Note that we don't add any points to the bounding box until a srroke is actually drawn.\n penX = go.nextX();\n penY = go.nextY();\n break;\n case OutlineCode.LINE:\n bboxComp.addPoint(penX, penY);\n penX = go.nextX();\n penY = go.nextY();\n bboxComp.addPoint(penX, penY);\n break;\n case OutlineCode.QUADRATIC:\n x = go.nextX();\n y = go.nextY();\n bboxComp.addQuadraticCurve(penX, penY, go.nextX(), go.nextY(), x, y);\n penX = x;\n penY = y;\n break;\n case OutlineCode.BEZIER:\n x = go.nextX();\n y = go.nextY();\n bboxComp.addBezierCurve(penX, penY, go.nextX(), go.nextY(), go.nextX(), go.nextY(), x, y);\n penX = x;\n penY = y;\n break;\n }\n }\n return new BoundingBox(bboxComp.getX1(), bboxComp.getY1(), bboxComp.width(), bboxComp.height());\n }\n static getWidth(code, point, category) {\n const data = Glyph.cache.lookup(code, category);\n if (data.point != -1) {\n point = data.point;\n }\n const scale = (point * 72) / (data.metrics.font.getResolution() * 100);\n return data.bbox.getW() * scale;\n }\n // eslint-disable-next-line\n draw(...args) {\n // DO NOTHING.\n }\n getCode() {\n return this.code;\n }\n // eslint-disable-next-line\n setOptions(options) {\n this.options = Object.assign(Object.assign({}, this.options), options);\n this.reset();\n }\n setPoint(point) {\n this.point = point;\n return this;\n }\n setStave(stave) {\n this.stave = stave;\n return this;\n }\n setXShift(x_shift) {\n this.x_shift = x_shift;\n return this;\n }\n setYShift(y_shift) {\n this.y_shift = y_shift;\n return this;\n }\n reset() {\n const data = Glyph.cache.lookup(this.code, this.options.category);\n this.metrics = data.metrics;\n // Override point from metrics file\n if (data.point != -1) {\n this.point = data.point;\n }\n this.scale = (this.point * 72) / (this.metrics.font.getResolution() * 100);\n this.bbox = new BoundingBox(data.bbox.getX() * this.scale, data.bbox.getY() * this.scale, data.bbox.getW() * this.scale, data.bbox.getH() * this.scale);\n }\n checkMetrics() {\n return defined(this.metrics, 'BadGlyph', `Glyph ${this.code} is not initialized.`);\n }\n getMetrics() {\n const metrics = this.checkMetrics();\n const metricsScale = metrics.scale;\n return {\n x_min: metrics.x_min * this.scale * metricsScale,\n x_max: metrics.x_max * this.scale * metricsScale,\n width: this.bbox.getW(),\n height: this.bbox.getH(),\n scale: this.scale * metricsScale,\n x_shift: metrics.x_shift,\n y_shift: metrics.y_shift,\n outline: metrics.outline,\n font: metrics.font,\n ha: metrics.ha,\n };\n }\n setOriginX(x) {\n const { bbox } = this;\n const originX = Math.abs(bbox.getX() / bbox.getW());\n const xShift = (x - originX) * bbox.getW();\n this.originShift.x = -xShift;\n }\n setOriginY(y) {\n const { bbox } = this;\n const originY = Math.abs(bbox.getY() / bbox.getH());\n const yShift = (y - originY) * bbox.getH();\n this.originShift.y = -yShift;\n }\n setOrigin(x, y) {\n this.setOriginX(x);\n this.setOriginY(y);\n }\n render(ctx, x, y) {\n const metrics = this.checkMetrics();\n const outline = metrics.outline;\n const scale = this.scale * metrics.scale;\n this.setRendered();\n this.applyStyle(ctx);\n const xPos = x + this.originShift.x + metrics.x_shift;\n const yPos = y + this.originShift.y + metrics.y_shift;\n Glyph.renderOutline(ctx, outline, scale, xPos, yPos);\n this.restoreStyle(ctx);\n }\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n renderToStave(x) {\n const context = this.checkContext();\n const metrics = this.checkMetrics();\n const stave = this.checkStave();\n const outline = metrics.outline;\n const scale = this.scale * metrics.scale;\n this.setRendered();\n this.applyStyle();\n const xPos = x + this.x_shift + metrics.x_shift;\n const yPos = stave.getYForGlyphs() + this.y_shift + metrics.y_shift;\n Glyph.renderOutline(context, outline, scale, xPos, yPos);\n this.restoreStyle();\n }\n}\nGlyph.cache = new GlyphCache();\n// The current cache key for GlyphCache above.\n// Computed when Flow.setMusicFont(...) is called.\n// It is set to a comma separated list of font names.\nGlyph.CURRENT_CACHE_KEY = '';\n// Used by the GlyphCache above.\n// Set when Flow.setMusicFont(...) is called.\nGlyph.MUSIC_FONT_STACK = [];\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nexport var ModifierPosition;\n(function (ModifierPosition) {\n ModifierPosition[ModifierPosition[\"CENTER\"] = 0] = \"CENTER\";\n ModifierPosition[ModifierPosition[\"LEFT\"] = 1] = \"LEFT\";\n ModifierPosition[ModifierPosition[\"RIGHT\"] = 2] = \"RIGHT\";\n ModifierPosition[ModifierPosition[\"ABOVE\"] = 3] = \"ABOVE\";\n ModifierPosition[ModifierPosition[\"BELOW\"] = 4] = \"BELOW\";\n})(ModifierPosition || (ModifierPosition = {}));\n// To enable logging for this class. Set `Vex.Flow.Modifier.DEBUG` to `true`.\n// function L(...args) { if (Modifier.DEBUG) log('Vex.Flow.Modifier', args); }\n/**\n * `Modifier` is an abstract interface for notational elements that modify\n * a `Note`. Examples of modifiers are `Accidental`, `Annotation`, `Stroke`, etc.\n *\n * For a `Modifier` instance to be positioned correctly, it must be part of\n * a `ModifierContext`. All modifiers in the same context are rendered relative to\n * one another.\n *\n * Typically, all modifiers to a note are part of the same `ModifierContext` instance. Also,\n * in multi-voice staves, all modifiers to notes on the same `tick` are part of the same\n * `ModifierContext`. This ensures that multiple voices don't trample all over each other.\n */\nexport class Modifier extends Element {\n constructor() {\n super();\n this.width = 0;\n // The `text_line` is reserved space above or below a stave.\n this.text_line = 0;\n this.position = Modifier.Position.LEFT;\n this.x_shift = 0;\n this.y_shift = 0;\n this.spacingFromNextModifier = 0;\n }\n /**\n * Modifiers category string. Every modifier has a different category.\n * The `ModifierContext` uses this to determine the type and order of the modifiers.\n */\n static get CATEGORY() {\n return Category.Modifier;\n }\n /** Modifiers can be positioned almost anywhere, relative to a note. */\n static get Position() {\n return ModifierPosition;\n }\n static get PositionString() {\n return {\n center: ModifierPosition.CENTER,\n above: ModifierPosition.ABOVE,\n below: ModifierPosition.BELOW,\n left: ModifierPosition.LEFT,\n right: ModifierPosition.RIGHT,\n };\n }\n /** Called when position changes. */\n reset() {\n // DO NOTHING.\n }\n /** Get modifier widths. */\n getWidth() {\n return this.width;\n }\n /** Set modifier widths. */\n setWidth(width) {\n this.width = width;\n return this;\n }\n /** Get attached note (`StaveNote`, `TabNote`, etc.) */\n getNote() {\n return defined(this.note, 'NoNote', 'Modifier has no note.');\n }\n /**\n * Used in draw() to check and get the attached note (`StaveNote`, `TabNote`, etc.).\n * Also verifies that the index is valid.\n */\n checkAttachedNote() {\n const category = this.getCategory();\n defined(this.index, 'NoIndex', `Can't draw ${category} without an index.`);\n return defined(this.note, 'NoNote', `Can't draw ${category} without a note.`);\n }\n /**\n * Set attached note.\n * @param note (`StaveNote`, `TabNote`, etc.)\n */\n setNote(note) {\n this.note = note;\n return this;\n }\n /** Get note index, which is a specific note in a chord. */\n getIndex() {\n return this.index;\n }\n /** Check and get note index, which is a specific note in a chord. */\n checkIndex() {\n return defined(this.index, 'NoIndex', 'Modifier has an invalid index.');\n }\n /** Set note index, which is a specific note in a chord. */\n setIndex(index) {\n this.index = index;\n return this;\n }\n /** Get `ModifierContext`. */\n getModifierContext() {\n return this.modifierContext;\n }\n /** Check and get `ModifierContext`. */\n checkModifierContext() {\n return defined(this.modifierContext, 'NoModifierContext', 'Modifier Context Required');\n }\n /** Every modifier must be part of a `ModifierContext`. */\n setModifierContext(c) {\n this.modifierContext = c;\n return this;\n }\n /** Get position. */\n getPosition() {\n return this.position;\n }\n /**\n * Set position.\n * @param position CENTER | LEFT | RIGHT | ABOVE | BELOW\n */\n setPosition(position) {\n this.position = typeof position === 'string' ? Modifier.PositionString[position] : position;\n this.reset();\n return this;\n }\n /** Set the `text_line` for the modifier. */\n setTextLine(line) {\n this.text_line = line;\n return this;\n }\n /** Shift modifier down `y` pixels. Negative values shift up. */\n setYShift(y) {\n this.y_shift = y;\n return this;\n }\n /** Set spacing from next modifier. */\n setSpacingFromNextModifier(x) {\n this.spacingFromNextModifier = x;\n }\n /** Get spacing from next modifier. */\n getSpacingFromNextModifier() {\n return this.spacingFromNextModifier;\n }\n /**\n * Shift modifier `x` pixels in the direction of the modifier. Negative values\n * shift reverse.\n */\n setXShift(x) {\n this.x_shift = 0;\n if (this.position === Modifier.Position.LEFT) {\n this.x_shift -= x;\n }\n else {\n this.x_shift += x;\n }\n return this;\n }\n /** Get shift modifier `x` */\n getXShift() {\n return this.x_shift;\n }\n /** Render the modifier onto the canvas. */\n draw() {\n this.checkContext();\n throw new RuntimeError('NotImplemented', 'draw() not implemented for this modifier.');\n }\n // aligns sub notes of NoteSubGroup (or GraceNoteGroup) to the main note with correct x-offset\n alignSubNotesWithNote(subNotes, note) {\n // Shift over the tick contexts of each note\n const tickContext = note.getTickContext();\n const metrics = tickContext.getMetrics();\n const stave = note.getStave();\n const subNoteXOffset = tickContext.getX() - metrics.modLeftPx - metrics.modRightPx + this.getSpacingFromNextModifier();\n subNotes.forEach((subNote) => {\n const subTickContext = subNote.getTickContext();\n if (stave)\n subNote.setStave(stave);\n subTickContext.setXOffset(subNoteXOffset); // don't touch baseX to avoid shift each render\n });\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { RuntimeError } from './util';\n/** Music implements some standard music theory routines. */\nexport class Music {\n /** Number of an canonical notes (12). */\n static get NUM_TONES() {\n return this.canonical_notes.length;\n }\n /** Names of root notes ('c', 'd',...) */\n static get roots() {\n return ['c', 'd', 'e', 'f', 'g', 'a', 'b'];\n }\n /** Values of the root notes.*/\n static get root_values() {\n return [0, 2, 4, 5, 7, 9, 11];\n }\n /** Indices of the root notes.*/\n static get root_indices() {\n return {\n c: 0,\n d: 1,\n e: 2,\n f: 3,\n g: 4,\n a: 5,\n b: 6,\n };\n }\n /** Names of canonical notes ('c', 'c#', 'd',...). */\n static get canonical_notes() {\n return ['c', 'c#', 'd', 'd#', 'e', 'f', 'f#', 'g', 'g#', 'a', 'a#', 'b'];\n }\n /** Names of diatonic intervals ('unison', 'm2', 'M2',...). */\n static get diatonic_intervals() {\n return ['unison', 'm2', 'M2', 'm3', 'M3', 'p4', 'dim5', 'p5', 'm6', 'M6', 'b7', 'M7', 'octave'];\n }\n /** NoteAccidental associated to diatonic intervals. */\n static get diatonic_accidentals() {\n return {\n unison: { note: 0, accidental: 0 },\n m2: { note: 1, accidental: -1 },\n M2: { note: 1, accidental: 0 },\n m3: { note: 2, accidental: -1 },\n M3: { note: 2, accidental: 0 },\n p4: { note: 3, accidental: 0 },\n dim5: { note: 4, accidental: -1 },\n p5: { note: 4, accidental: 0 },\n m6: { note: 5, accidental: -1 },\n M6: { note: 5, accidental: 0 },\n b7: { note: 6, accidental: -1 },\n M7: { note: 6, accidental: 0 },\n octave: { note: 7, accidental: 0 },\n };\n }\n /** Semitones shift associated to intervals .*/\n static get intervals() {\n return {\n u: 0,\n unison: 0,\n m2: 1,\n b2: 1,\n min2: 1,\n S: 1,\n H: 1,\n 2: 2,\n M2: 2,\n maj2: 2,\n T: 2,\n W: 2,\n m3: 3,\n b3: 3,\n min3: 3,\n M3: 4,\n 3: 4,\n maj3: 4,\n 4: 5,\n p4: 5,\n '#4': 6,\n b5: 6,\n aug4: 6,\n dim5: 6,\n 5: 7,\n p5: 7,\n '#5': 8,\n b6: 8,\n aug5: 8,\n 6: 9,\n M6: 9,\n maj6: 9,\n b7: 10,\n m7: 10,\n min7: 10,\n dom7: 10,\n M7: 11,\n maj7: 11,\n 8: 12,\n octave: 12,\n };\n }\n /** Semitones shifts associated with scales. */\n static get scales() {\n return {\n major: [2, 2, 1, 2, 2, 2, 1],\n minor: [2, 1, 2, 2, 1, 2, 2],\n ionian: [2, 2, 1, 2, 2, 2, 1],\n dorian: [2, 1, 2, 2, 2, 1, 2],\n phyrgian: [1, 2, 2, 2, 1, 2, 2],\n lydian: [2, 2, 2, 1, 2, 2, 1],\n mixolydian: [2, 2, 1, 2, 2, 1, 2],\n aeolian: [2, 1, 2, 2, 1, 2, 2],\n locrian: [1, 2, 2, 1, 2, 2, 2],\n };\n }\n /** Scales associated with m (minor) and M (major). */\n static get scaleTypes() {\n return {\n M: Music.scales.major,\n m: Music.scales.minor,\n };\n }\n /** Accidentals abbreviations. */\n static get accidentals() {\n return ['bb', 'b', 'n', '#', '##'];\n }\n /** Note values. */\n static get noteValues() {\n return {\n c: { root_index: 0, int_val: 0 },\n cn: { root_index: 0, int_val: 0 },\n 'c#': { root_index: 0, int_val: 1 },\n 'c##': { root_index: 0, int_val: 2 },\n cb: { root_index: 0, int_val: 11 },\n cbb: { root_index: 0, int_val: 10 },\n d: { root_index: 1, int_val: 2 },\n dn: { root_index: 1, int_val: 2 },\n 'd#': { root_index: 1, int_val: 3 },\n 'd##': { root_index: 1, int_val: 4 },\n db: { root_index: 1, int_val: 1 },\n dbb: { root_index: 1, int_val: 0 },\n e: { root_index: 2, int_val: 4 },\n en: { root_index: 2, int_val: 4 },\n 'e#': { root_index: 2, int_val: 5 },\n 'e##': { root_index: 2, int_val: 6 },\n eb: { root_index: 2, int_val: 3 },\n ebb: { root_index: 2, int_val: 2 },\n f: { root_index: 3, int_val: 5 },\n fn: { root_index: 3, int_val: 5 },\n 'f#': { root_index: 3, int_val: 6 },\n 'f##': { root_index: 3, int_val: 7 },\n fb: { root_index: 3, int_val: 4 },\n fbb: { root_index: 3, int_val: 3 },\n g: { root_index: 4, int_val: 7 },\n gn: { root_index: 4, int_val: 7 },\n 'g#': { root_index: 4, int_val: 8 },\n 'g##': { root_index: 4, int_val: 9 },\n gb: { root_index: 4, int_val: 6 },\n gbb: { root_index: 4, int_val: 5 },\n a: { root_index: 5, int_val: 9 },\n an: { root_index: 5, int_val: 9 },\n 'a#': { root_index: 5, int_val: 10 },\n 'a##': { root_index: 5, int_val: 11 },\n ab: { root_index: 5, int_val: 8 },\n abb: { root_index: 5, int_val: 7 },\n b: { root_index: 6, int_val: 11 },\n bn: { root_index: 6, int_val: 11 },\n 'b#': { root_index: 6, int_val: 0 },\n 'b##': { root_index: 6, int_val: 1 },\n bb: { root_index: 6, int_val: 10 },\n bbb: { root_index: 6, int_val: 9 },\n };\n }\n isValidNoteValue(note) {\n return note >= 0 && note < Music.canonical_notes.length;\n }\n isValidIntervalValue(interval) {\n return interval >= 0 && interval < Music.diatonic_intervals.length;\n }\n /** Return root and accidental associated to a note. */\n getNoteParts(noteString) {\n if (!noteString || noteString.length < 1) {\n throw new RuntimeError('BadArguments', 'Invalid note name: ' + noteString);\n }\n if (noteString.length > 3) {\n throw new RuntimeError('BadArguments', 'Invalid note name: ' + noteString);\n }\n const note = noteString.toLowerCase();\n const regex = /^([cdefgab])(b|bb|n|#|##)?$/;\n const match = regex.exec(note);\n if (match !== null) {\n const root = match[1];\n const accidental = match[2];\n return {\n root,\n accidental,\n };\n }\n else {\n throw new RuntimeError('BadArguments', 'Invalid note name: ' + noteString);\n }\n }\n /** Return root, accidental and type associated to a key. */\n getKeyParts(keyString) {\n if (!keyString || keyString.length < 1) {\n throw new RuntimeError('BadArguments', 'Invalid key: ' + keyString);\n }\n const key = keyString.toLowerCase();\n // Support Major, Minor, Melodic Minor, and Harmonic Minor key types.\n const regex = /^([cdefgab])(b|#)?(mel|harm|m|M)?$/;\n const match = regex.exec(key);\n if (match !== null) {\n const root = match[1];\n const accidental = match[2];\n let type = match[3];\n // Unspecified type implies major\n if (!type)\n type = 'M';\n return {\n root,\n accidental,\n type,\n };\n }\n else {\n throw new RuntimeError('BadArguments', `Invalid key: ${keyString}`);\n }\n }\n /** Note value associated to a note name. */\n getNoteValue(noteString) {\n const value = Music.noteValues[noteString];\n if (value === undefined) {\n throw new RuntimeError('BadArguments', `Invalid note name: ${noteString}`);\n }\n return value.int_val;\n }\n /** Interval value associated to an interval name. */\n getIntervalValue(intervalString) {\n const value = Music.intervals[intervalString];\n if (value === undefined) {\n throw new RuntimeError('BadArguments', `Invalid interval name: ${intervalString}`);\n }\n return value;\n }\n /** Canonical note name associated to a value. */\n getCanonicalNoteName(noteValue) {\n if (!this.isValidNoteValue(noteValue)) {\n throw new RuntimeError('BadArguments', `Invalid note value: ${noteValue}`);\n }\n return Music.canonical_notes[noteValue];\n }\n /** Interval name associated to a value. */\n getCanonicalIntervalName(intervalValue) {\n if (!this.isValidIntervalValue(intervalValue)) {\n throw new RuntimeError('BadArguments', `Invalid interval value: ${intervalValue}`);\n }\n return Music.diatonic_intervals[intervalValue];\n }\n /**\n * Given a note, interval, and interval direction, produce the relative note.\n */\n getRelativeNoteValue(noteValue, intervalValue, direction = 1) {\n if (direction !== 1 && direction !== -1) {\n throw new RuntimeError('BadArguments', `Invalid direction: ${direction}`);\n }\n let sum = (noteValue + direction * intervalValue) % Music.NUM_TONES;\n if (sum < 0)\n sum += Music.NUM_TONES;\n return sum;\n }\n /**\n * Given a root and note value, produce the relative note name.\n */\n getRelativeNoteName(root, noteValue) {\n const parts = this.getNoteParts(root);\n const rootValue = this.getNoteValue(parts.root);\n let interval = noteValue - rootValue;\n if (Math.abs(interval) > Music.NUM_TONES - 3) {\n let multiplier = 1;\n if (interval > 0)\n multiplier = -1;\n // Possibly wrap around. (Add +1 for modulo operator)\n const reverse_interval = ((noteValue + 1 + (rootValue + 1)) % Music.NUM_TONES) * multiplier;\n if (Math.abs(reverse_interval) > 2) {\n throw new RuntimeError('BadArguments', `Notes not related: ${root}, ${noteValue})`);\n }\n else {\n interval = reverse_interval;\n }\n }\n if (Math.abs(interval) > 2) {\n throw new RuntimeError('BadArguments', `Notes not related: ${root}, ${noteValue})`);\n }\n let relativeNoteName = parts.root;\n if (interval > 0) {\n for (let i = 1; i <= interval; ++i) {\n relativeNoteName += '#';\n }\n }\n else if (interval < 0) {\n for (let i = -1; i >= interval; --i) {\n relativeNoteName += 'b';\n }\n }\n return relativeNoteName;\n }\n /**\n * Return scale tones, given intervals. Each successive interval is\n * relative to the previous one, e.g., Major Scale:\n *\n * TTSTTTS = [2,2,1,2,2,2,1]\n *\n * When used with key = 0, returns C scale (which is isomorphic to\n * interval list).\n */\n getScaleTones(key, intervals) {\n const tones = [key];\n let nextNote = key;\n for (let i = 0; i < intervals.length; i++) {\n nextNote = this.getRelativeNoteValue(nextNote, intervals[i]);\n if (nextNote !== key)\n tones.push(nextNote);\n }\n return tones;\n }\n /**\n * Return the interval of a note, given a diatonic scale.\n * e.g., given the scale C, and the note E, returns M3.\n */\n getIntervalBetween(note1, note2, direction = 1) {\n if (direction !== 1 && direction !== -1) {\n throw new RuntimeError('BadArguments', `Invalid direction: ${direction}`);\n }\n if (!this.isValidNoteValue(note1) || !this.isValidNoteValue(note2)) {\n throw new RuntimeError('BadArguments', `Invalid notes: ${note1}, ${note2}`);\n }\n let difference = direction === 1 ? note2 - note1 : note1 - note2;\n if (difference < 0)\n difference += Music.NUM_TONES;\n return difference;\n }\n /**\n * Create a scale map that represents the pitch state for a\n * `keySignature`. For example, passing a `G` to `keySignature` would\n * return a scale map with every note naturalized except for `F` which\n * has an `F#` state.\n */\n createScaleMap(keySignature) {\n const keySigParts = this.getKeyParts(keySignature);\n if (!keySigParts.type)\n throw new RuntimeError('BadArguments', 'Unsupported key type: undefined');\n const scaleName = Music.scaleTypes[keySigParts.type];\n let keySigString = keySigParts.root;\n if (keySigParts.accidental)\n keySigString += keySigParts.accidental;\n if (!scaleName)\n throw new RuntimeError('BadArguments', 'Unsupported key type: ' + keySignature);\n const scale = this.getScaleTones(this.getNoteValue(keySigString), scaleName);\n const noteLocation = Music.root_indices[keySigParts.root];\n const scaleMap = {};\n for (let i = 0; i < Music.roots.length; ++i) {\n const index = (noteLocation + i) % Music.roots.length;\n const rootName = Music.roots[index];\n let noteName = this.getRelativeNoteName(rootName, scale[i]);\n if (noteName.length === 1) {\n noteName += 'n';\n }\n scaleMap[rootName] = noteName;\n }\n return scaleMap;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { Fraction } from './fraction';\nimport { Glyph } from './glyph';\nimport { RuntimeError } from './util';\nconst RESOLUTION = 16384;\n/**\n * Map duration numbers to 'ticks', the unit of duration used throughout VexFlow.\n * For example, a quarter note is 4, so it maps to RESOLUTION / 4 = 4096 ticks.\n */\nconst durations = {\n '1/2': RESOLUTION * 2,\n 1: RESOLUTION / 1,\n 2: RESOLUTION / 2,\n 4: RESOLUTION / 4,\n 8: RESOLUTION / 8,\n 16: RESOLUTION / 16,\n 32: RESOLUTION / 32,\n 64: RESOLUTION / 64,\n 128: RESOLUTION / 128,\n 256: RESOLUTION / 256,\n};\nconst durationAliases = {\n w: '1',\n h: '2',\n q: '4',\n // This is the default duration used to render bars (BarNote). Bars no longer\n // consume ticks, so this should be a no-op.\n // TODO(0xfe): This needs to be cleaned up.\n b: '256',\n};\nconst keySignatures = {\n C: { num: 0 },\n Am: { num: 0 },\n F: { acc: 'b', num: 1 },\n Dm: { acc: 'b', num: 1 },\n Bb: { acc: 'b', num: 2 },\n Gm: { acc: 'b', num: 2 },\n Eb: { acc: 'b', num: 3 },\n Cm: { acc: 'b', num: 3 },\n Ab: { acc: 'b', num: 4 },\n Fm: { acc: 'b', num: 4 },\n Db: { acc: 'b', num: 5 },\n Bbm: { acc: 'b', num: 5 },\n Gb: { acc: 'b', num: 6 },\n Ebm: { acc: 'b', num: 6 },\n Cb: { acc: 'b', num: 7 },\n Abm: { acc: 'b', num: 7 },\n G: { acc: '#', num: 1 },\n Em: { acc: '#', num: 1 },\n D: { acc: '#', num: 2 },\n Bm: { acc: '#', num: 2 },\n A: { acc: '#', num: 3 },\n 'F#m': { acc: '#', num: 3 },\n E: { acc: '#', num: 4 },\n 'C#m': { acc: '#', num: 4 },\n B: { acc: '#', num: 5 },\n 'G#m': { acc: '#', num: 5 },\n 'F#': { acc: '#', num: 6 },\n 'D#m': { acc: '#', num: 6 },\n 'C#': { acc: '#', num: 7 },\n 'A#m': { acc: '#', num: 7 },\n};\nconst clefs = {\n treble: { line_shift: 0 },\n bass: { line_shift: 6 },\n tenor: { line_shift: 4 },\n alto: { line_shift: 3 },\n soprano: { line_shift: 1 },\n percussion: { line_shift: 0 },\n 'mezzo-soprano': { line_shift: 2 },\n 'baritone-c': { line_shift: 5 },\n 'baritone-f': { line_shift: 5 },\n subbass: { line_shift: 7 },\n french: { line_shift: -1 },\n};\nconst notesInfo = {\n C: { index: 0, int_val: 0 },\n CN: { index: 0, int_val: 0, accidental: 'n' },\n 'C#': { index: 0, int_val: 1, accidental: '#' },\n 'C##': { index: 0, int_val: 2, accidental: '##' },\n CB: { index: 0, int_val: 11, accidental: 'b' },\n CBB: { index: 0, int_val: 10, accidental: 'bb' },\n D: { index: 1, int_val: 2 },\n DN: { index: 1, int_val: 2, accidental: 'n' },\n 'D#': { index: 1, int_val: 3, accidental: '#' },\n 'D##': { index: 1, int_val: 4, accidental: '##' },\n DB: { index: 1, int_val: 1, accidental: 'b' },\n DBB: { index: 1, int_val: 0, accidental: 'bb' },\n E: { index: 2, int_val: 4 },\n EN: { index: 2, int_val: 4, accidental: 'n' },\n 'E#': { index: 2, int_val: 5, accidental: '#' },\n 'E##': { index: 2, int_val: 6, accidental: '##' },\n EB: { index: 2, int_val: 3, accidental: 'b' },\n EBB: { index: 2, int_val: 2, accidental: 'bb' },\n F: { index: 3, int_val: 5 },\n FN: { index: 3, int_val: 5, accidental: 'n' },\n 'F#': { index: 3, int_val: 6, accidental: '#' },\n 'F##': { index: 3, int_val: 7, accidental: '##' },\n FB: { index: 3, int_val: 4, accidental: 'b' },\n FBB: { index: 3, int_val: 3, accidental: 'bb' },\n G: { index: 4, int_val: 7 },\n GN: { index: 4, int_val: 7, accidental: 'n' },\n 'G#': { index: 4, int_val: 8, accidental: '#' },\n 'G##': { index: 4, int_val: 9, accidental: '##' },\n GB: { index: 4, int_val: 6, accidental: 'b' },\n GBB: { index: 4, int_val: 5, accidental: 'bb' },\n A: { index: 5, int_val: 9 },\n AN: { index: 5, int_val: 9, accidental: 'n' },\n 'A#': { index: 5, int_val: 10, accidental: '#' },\n 'A##': { index: 5, int_val: 11, accidental: '##' },\n AB: { index: 5, int_val: 8, accidental: 'b' },\n ABB: { index: 5, int_val: 7, accidental: 'bb' },\n B: { index: 6, int_val: 11 },\n BN: { index: 6, int_val: 11, accidental: 'n' },\n 'B#': { index: 6, int_val: 12, accidental: '#' },\n 'B##': { index: 6, int_val: 13, accidental: '##' },\n BB: { index: 6, int_val: 10, accidental: 'b' },\n BBB: { index: 6, int_val: 9, accidental: 'bb' },\n R: { index: 6, rest: true },\n X: {\n index: 6,\n accidental: '',\n octave: 4,\n code: 'noteheadXBlack',\n shift_right: 5.5,\n },\n};\nconst validNoteTypes = {\n n: { name: 'note' },\n r: { name: 'rest' },\n h: { name: 'harmonic' },\n m: { name: 'muted' },\n s: { name: 'slash' },\n g: { name: 'ghost' },\n};\nconst customNoteHeads = {\n /* Diamond */\n D0: { code: 'noteheadDiamondWhole' },\n D1: { code: 'noteheadDiamondHalf' },\n D2: { code: 'noteheadDiamondBlack' },\n D3: { code: 'noteheadDiamondBlack' },\n /* Triangle */\n T0: { code: 'noteheadTriangleUpWhole' },\n T1: { code: 'noteheadTriangleUpHalf' },\n T2: { code: 'noteheadTriangleUpBlack' },\n T3: { code: 'noteheadTriangleUpBlack' },\n /* Cross */\n X0: { code: 'noteheadXWhole' },\n X1: { code: 'noteheadXHalf' },\n X2: { code: 'noteheadXBlack' },\n X3: { code: 'noteheadCircleX' },\n /* Square */\n S1: { code: 'noteheadSquareWhite' },\n S2: { code: 'noteheadSquareBlack' },\n /* Rectangle */\n R1: { code: 'vexNoteHeadRectWhite' },\n R2: { code: 'vexNoteHeadRectBlack' }, // no smufl code\n};\nconst accidentals = {\n '#': { code: 'accidentalSharp', parenRightPaddingAdjustment: -1 },\n '##': { code: 'accidentalDoubleSharp', parenRightPaddingAdjustment: -1 },\n b: { code: 'accidentalFlat', parenRightPaddingAdjustment: -2 },\n bb: { code: 'accidentalDoubleFlat', parenRightPaddingAdjustment: -2 },\n n: { code: 'accidentalNatural', parenRightPaddingAdjustment: -1 },\n '{': { code: 'accidentalParensLeft', parenRightPaddingAdjustment: -1 },\n '}': { code: 'accidentalParensRight', parenRightPaddingAdjustment: -1 },\n db: { code: 'accidentalThreeQuarterTonesFlatZimmermann', parenRightPaddingAdjustment: -1 },\n d: { code: 'accidentalQuarterToneFlatStein', parenRightPaddingAdjustment: 0 },\n '++': { code: 'accidentalThreeQuarterTonesSharpStein', parenRightPaddingAdjustment: -1 },\n '+': { code: 'accidentalQuarterToneSharpStein', parenRightPaddingAdjustment: -1 },\n '+-': { code: 'accidentalKucukMucennebSharp', parenRightPaddingAdjustment: -1 },\n bs: { code: 'accidentalBakiyeFlat', parenRightPaddingAdjustment: -1 },\n bss: { code: 'accidentalBuyukMucennebFlat', parenRightPaddingAdjustment: -1 },\n o: { code: 'accidentalSori', parenRightPaddingAdjustment: -1 },\n k: { code: 'accidentalKoron', parenRightPaddingAdjustment: -1 },\n bbs: { code: 'vexAccidentalMicrotonal1', parenRightPaddingAdjustment: -1 },\n '++-': { code: 'vexAccidentalMicrotonal2', parenRightPaddingAdjustment: -1 },\n ashs: { code: 'vexAccidentalMicrotonal3', parenRightPaddingAdjustment: -1 },\n afhf: { code: 'vexAccidentalMicrotonal4', parenRightPaddingAdjustment: -1 },\n accSagittal5v7KleismaUp: { code: 'accSagittal5v7KleismaUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v7KleismaDown: { code: 'accSagittal5v7KleismaDown', parenRightPaddingAdjustment: -1 },\n accSagittal5CommaUp: { code: 'accSagittal5CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal5CommaDown: { code: 'accSagittal5CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal7CommaUp: { code: 'accSagittal7CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal7CommaDown: { code: 'accSagittal7CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal25SmallDiesisUp: { code: 'accSagittal25SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal25SmallDiesisDown: { code: 'accSagittal25SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal35MediumDiesisUp: { code: 'accSagittal35MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal35MediumDiesisDown: { code: 'accSagittal35MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal11MediumDiesisUp: { code: 'accSagittal11MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal11MediumDiesisDown: { code: 'accSagittal11MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal11LargeDiesisUp: { code: 'accSagittal11LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal11LargeDiesisDown: { code: 'accSagittal11LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal35LargeDiesisUp: { code: 'accSagittal35LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal35LargeDiesisDown: { code: 'accSagittal35LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp25SDown: { code: 'accSagittalSharp25SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat25SUp: { code: 'accSagittalFlat25SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7CDown: { code: 'accSagittalSharp7CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7CUp: { code: 'accSagittalFlat7CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5CDown: { code: 'accSagittalSharp5CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5CUp: { code: 'accSagittalFlat5CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v7kDown: { code: 'accSagittalSharp5v7kDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v7kUp: { code: 'accSagittalFlat5v7kUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp: { code: 'accSagittalSharp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat: { code: 'accSagittalFlat', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v7kUp: { code: 'accSagittalSharp5v7kUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v7kDown: { code: 'accSagittalFlat5v7kDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5CUp: { code: 'accSagittalSharp5CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5CDown: { code: 'accSagittalFlat5CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7CUp: { code: 'accSagittalSharp7CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7CDown: { code: 'accSagittalFlat7CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp25SUp: { code: 'accSagittalSharp25SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat25SDown: { code: 'accSagittalFlat25SDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp35MUp: { code: 'accSagittalSharp35MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat35MDown: { code: 'accSagittalFlat35MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11MUp: { code: 'accSagittalSharp11MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11MDown: { code: 'accSagittalFlat11MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11LUp: { code: 'accSagittalSharp11LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11LDown: { code: 'accSagittalFlat11LDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp35LUp: { code: 'accSagittalSharp35LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat35LDown: { code: 'accSagittalFlat35LDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp25SDown: { code: 'accSagittalDoubleSharp25SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat25SUp: { code: 'accSagittalDoubleFlat25SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp7CDown: { code: 'accSagittalDoubleSharp7CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat7CUp: { code: 'accSagittalDoubleFlat7CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5CDown: { code: 'accSagittalDoubleSharp5CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5CUp: { code: 'accSagittalDoubleFlat5CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5v7kDown: { code: 'accSagittalDoubleSharp5v7kDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5v7kUp: { code: 'accSagittalDoubleFlat5v7kUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp: { code: 'accSagittalDoubleSharp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat: { code: 'accSagittalDoubleFlat', parenRightPaddingAdjustment: -1 },\n accSagittal7v11KleismaUp: { code: 'accSagittal7v11KleismaUp', parenRightPaddingAdjustment: -1 },\n accSagittal7v11KleismaDown: { code: 'accSagittal7v11KleismaDown', parenRightPaddingAdjustment: -1 },\n accSagittal17CommaUp: { code: 'accSagittal17CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal17CommaDown: { code: 'accSagittal17CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal55CommaUp: { code: 'accSagittal55CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal55CommaDown: { code: 'accSagittal55CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal7v11CommaUp: { code: 'accSagittal7v11CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal7v11CommaDown: { code: 'accSagittal7v11CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v11SmallDiesisUp: { code: 'accSagittal5v11SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v11SmallDiesisDown: { code: 'accSagittal5v11SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v11SDown: { code: 'accSagittalSharp5v11SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v11SUp: { code: 'accSagittalFlat5v11SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v11CDown: { code: 'accSagittalSharp7v11CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v11CUp: { code: 'accSagittalFlat7v11CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp55CDown: { code: 'accSagittalSharp55CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat55CUp: { code: 'accSagittalFlat55CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp17CDown: { code: 'accSagittalSharp17CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat17CUp: { code: 'accSagittalFlat17CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v11kDown: { code: 'accSagittalSharp7v11kDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v11kUp: { code: 'accSagittalFlat7v11kUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v11kUp: { code: 'accSagittalSharp7v11kUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v11kDown: { code: 'accSagittalFlat7v11kDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp17CUp: { code: 'accSagittalSharp17CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat17CDown: { code: 'accSagittalFlat17CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp55CUp: { code: 'accSagittalSharp55CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat55CDown: { code: 'accSagittalFlat55CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v11CUp: { code: 'accSagittalSharp7v11CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v11CDown: { code: 'accSagittalFlat7v11CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v11SUp: { code: 'accSagittalSharp5v11SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v11SDown: { code: 'accSagittalFlat5v11SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5v11SDown: { code: 'accSagittalDoubleSharp5v11SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5v11SUp: { code: 'accSagittalDoubleFlat5v11SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp7v11CDown: { code: 'accSagittalDoubleSharp7v11CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat7v11CUp: { code: 'accSagittalDoubleFlat7v11CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp55CDown: { code: 'accSagittalDoubleSharp55CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat55CUp: { code: 'accSagittalDoubleFlat55CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp17CDown: { code: 'accSagittalDoubleSharp17CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat17CUp: { code: 'accSagittalDoubleFlat17CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp7v11kDown: { code: 'accSagittalDoubleSharp7v11kDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat7v11kUp: { code: 'accSagittalDoubleFlat7v11kUp', parenRightPaddingAdjustment: -1 },\n accSagittal23CommaUp: { code: 'accSagittal23CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal23CommaDown: { code: 'accSagittal23CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v19CommaUp: { code: 'accSagittal5v19CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v19CommaDown: { code: 'accSagittal5v19CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v23SmallDiesisUp: { code: 'accSagittal5v23SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v23SmallDiesisDown: { code: 'accSagittal5v23SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v23SDown: { code: 'accSagittalSharp5v23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v23SUp: { code: 'accSagittalFlat5v23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v19CDown: { code: 'accSagittalSharp5v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v19CUp: { code: 'accSagittalFlat5v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp23CDown: { code: 'accSagittalSharp23CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat23CUp: { code: 'accSagittalFlat23CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp23CUp: { code: 'accSagittalSharp23CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat23CDown: { code: 'accSagittalFlat23CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v19CUp: { code: 'accSagittalSharp5v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v19CDown: { code: 'accSagittalFlat5v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v23SUp: { code: 'accSagittalSharp5v23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v23SDown: { code: 'accSagittalFlat5v23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5v23SDown: { code: 'accSagittalDoubleSharp5v23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5v23SUp: { code: 'accSagittalDoubleFlat5v23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5v19CDown: { code: 'accSagittalDoubleSharp5v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5v19CUp: { code: 'accSagittalDoubleFlat5v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp23CDown: { code: 'accSagittalDoubleSharp23CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat23CUp: { code: 'accSagittalDoubleFlat23CUp', parenRightPaddingAdjustment: -1 },\n accSagittal19SchismaUp: { code: 'accSagittal19SchismaUp', parenRightPaddingAdjustment: -1 },\n accSagittal19SchismaDown: { code: 'accSagittal19SchismaDown', parenRightPaddingAdjustment: -1 },\n accSagittal17KleismaUp: { code: 'accSagittal17KleismaUp', parenRightPaddingAdjustment: -1 },\n accSagittal17KleismaDown: { code: 'accSagittal17KleismaDown', parenRightPaddingAdjustment: -1 },\n accSagittal143CommaUp: { code: 'accSagittal143CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal143CommaDown: { code: 'accSagittal143CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal11v49CommaUp: { code: 'accSagittal11v49CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal11v49CommaDown: { code: 'accSagittal11v49CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal19CommaUp: { code: 'accSagittal19CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal19CommaDown: { code: 'accSagittal19CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal7v19CommaUp: { code: 'accSagittal7v19CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal7v19CommaDown: { code: 'accSagittal7v19CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal49SmallDiesisUp: { code: 'accSagittal49SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal49SmallDiesisDown: { code: 'accSagittal49SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal23SmallDiesisUp: { code: 'accSagittal23SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal23SmallDiesisDown: { code: 'accSagittal23SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v13MediumDiesisUp: { code: 'accSagittal5v13MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v13MediumDiesisDown: { code: 'accSagittal5v13MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal11v19MediumDiesisUp: { code: 'accSagittal11v19MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal11v19MediumDiesisDown: { code: 'accSagittal11v19MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal49MediumDiesisUp: { code: 'accSagittal49MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal49MediumDiesisDown: { code: 'accSagittal49MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v49MediumDiesisUp: { code: 'accSagittal5v49MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v49MediumDiesisDown: { code: 'accSagittal5v49MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal49LargeDiesisUp: { code: 'accSagittal49LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal49LargeDiesisDown: { code: 'accSagittal49LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal11v19LargeDiesisUp: { code: 'accSagittal11v19LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal11v19LargeDiesisDown: { code: 'accSagittal11v19LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v13LargeDiesisUp: { code: 'accSagittal5v13LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v13LargeDiesisDown: { code: 'accSagittal5v13LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp23SDown: { code: 'accSagittalSharp23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat23SUp: { code: 'accSagittalFlat23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp49SDown: { code: 'accSagittalSharp49SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat49SUp: { code: 'accSagittalFlat49SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v19CDown: { code: 'accSagittalSharp7v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v19CUp: { code: 'accSagittalFlat7v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp19CDown: { code: 'accSagittalSharp19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat19CUp: { code: 'accSagittalFlat19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11v49CDown: { code: 'accSagittalSharp11v49CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11v49CUp: { code: 'accSagittalFlat11v49CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp143CDown: { code: 'accSagittalSharp143CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat143CUp: { code: 'accSagittalFlat143CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp17kDown: { code: 'accSagittalSharp17kDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat17kUp: { code: 'accSagittalFlat17kUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp19sDown: { code: 'accSagittalSharp19sDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat19sUp: { code: 'accSagittalFlat19sUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp19sUp: { code: 'accSagittalSharp19sUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat19sDown: { code: 'accSagittalFlat19sDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp17kUp: { code: 'accSagittalSharp17kUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat17kDown: { code: 'accSagittalFlat17kDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp143CUp: { code: 'accSagittalSharp143CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat143CDown: { code: 'accSagittalFlat143CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11v49CUp: { code: 'accSagittalSharp11v49CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11v49CDown: { code: 'accSagittalFlat11v49CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp19CUp: { code: 'accSagittalSharp19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat19CDown: { code: 'accSagittalFlat19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v19CUp: { code: 'accSagittalSharp7v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v19CDown: { code: 'accSagittalFlat7v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp49SUp: { code: 'accSagittalSharp49SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat49SDown: { code: 'accSagittalFlat49SDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp23SUp: { code: 'accSagittalSharp23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat23SDown: { code: 'accSagittalFlat23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v13MUp: { code: 'accSagittalSharp5v13MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v13MDown: { code: 'accSagittalFlat5v13MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11v19MUp: { code: 'accSagittalSharp11v19MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11v19MDown: { code: 'accSagittalFlat11v19MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp49MUp: { code: 'accSagittalSharp49MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat49MDown: { code: 'accSagittalFlat49MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v49MUp: { code: 'accSagittalSharp5v49MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v49MDown: { code: 'accSagittalFlat5v49MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp49LUp: { code: 'accSagittalSharp49LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat49LDown: { code: 'accSagittalFlat49LDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11v19LUp: { code: 'accSagittalSharp11v19LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11v19LDown: { code: 'accSagittalFlat11v19LDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v13LUp: { code: 'accSagittalSharp5v13LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v13LDown: { code: 'accSagittalFlat5v13LDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp23SDown: { code: 'accSagittalDoubleSharp23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat23SUp: { code: 'accSagittalDoubleFlat23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp49SDown: { code: 'accSagittalDoubleSharp49SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat49SUp: { code: 'accSagittalDoubleFlat49SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp7v19CDown: { code: 'accSagittalDoubleSharp7v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat7v19CUp: { code: 'accSagittalDoubleFlat7v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp19CDown: { code: 'accSagittalDoubleSharp19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat19CUp: { code: 'accSagittalDoubleFlat19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp11v49CDown: { code: 'accSagittalDoubleSharp11v49CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat11v49CUp: { code: 'accSagittalDoubleFlat11v49CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp143CDown: { code: 'accSagittalDoubleSharp143CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat143CUp: { code: 'accSagittalDoubleFlat143CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp17kDown: { code: 'accSagittalDoubleSharp17kDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat17kUp: { code: 'accSagittalDoubleFlat17kUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp19sDown: { code: 'accSagittalDoubleSharp19sDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat19sUp: { code: 'accSagittalDoubleFlat19sUp', parenRightPaddingAdjustment: -1 },\n accSagittalShaftUp: { code: 'accSagittalShaftUp', parenRightPaddingAdjustment: -1 },\n accSagittalShaftDown: { code: 'accSagittalShaftDown', parenRightPaddingAdjustment: -1 },\n accSagittalAcute: { code: 'accSagittalAcute', parenRightPaddingAdjustment: -1 },\n accSagittalGrave: { code: 'accSagittalGrave', parenRightPaddingAdjustment: -1 },\n accSagittal1MinaUp: { code: 'accSagittal1MinaUp', parenRightPaddingAdjustment: -1 },\n accSagittal1MinaDown: { code: 'accSagittal1MinaDown', parenRightPaddingAdjustment: -1 },\n accSagittal2MinasUp: { code: 'accSagittal2MinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal2MinasDown: { code: 'accSagittal2MinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal1TinaUp: { code: 'accSagittal1TinaUp', parenRightPaddingAdjustment: -1 },\n accSagittal1TinaDown: { code: 'accSagittal1TinaDown', parenRightPaddingAdjustment: -1 },\n accSagittal2TinasUp: { code: 'accSagittal2TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal2TinasDown: { code: 'accSagittal2TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal3TinasUp: { code: 'accSagittal3TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal3TinasDown: { code: 'accSagittal3TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal4TinasUp: { code: 'accSagittal4TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal4TinasDown: { code: 'accSagittal4TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal5TinasUp: { code: 'accSagittal5TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal5TinasDown: { code: 'accSagittal5TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal6TinasUp: { code: 'accSagittal6TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal6TinasDown: { code: 'accSagittal6TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal7TinasUp: { code: 'accSagittal7TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal7TinasDown: { code: 'accSagittal7TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal8TinasUp: { code: 'accSagittal8TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal8TinasDown: { code: 'accSagittal8TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal9TinasUp: { code: 'accSagittal9TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal9TinasDown: { code: 'accSagittal9TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittalFractionalTinaUp: { code: 'accSagittalFractionalTinaUp', parenRightPaddingAdjustment: -1 },\n accSagittalFractionalTinaDown: { code: 'accSagittalFractionalTinaDown', parenRightPaddingAdjustment: -1 },\n accidentalNarrowReversedFlat: { code: 'accidentalNarrowReversedFlat', parenRightPaddingAdjustment: -1 },\n accidentalNarrowReversedFlatAndFlat: {\n code: 'accidentalNarrowReversedFlatAndFlat',\n parenRightPaddingAdjustment: -1,\n },\n accidentalWilsonPlus: { code: 'accidentalWilsonPlus', parenRightPaddingAdjustment: -1 },\n accidentalWilsonMinus: { code: 'accidentalWilsonMinus', parenRightPaddingAdjustment: -1 },\n};\n// Helps determine the layout of accidentals.\nconst accidentalColumns = {\n 1: {\n a: [1],\n b: [1],\n },\n 2: {\n a: [1, 2],\n },\n 3: {\n a: [1, 3, 2],\n b: [1, 2, 1],\n second_on_bottom: [1, 2, 3],\n },\n 4: {\n a: [1, 3, 4, 2],\n b: [1, 2, 3, 1],\n spaced_out_tetrachord: [1, 2, 1, 2],\n },\n 5: {\n a: [1, 3, 5, 4, 2],\n b: [1, 2, 4, 3, 1],\n spaced_out_pentachord: [1, 2, 3, 2, 1],\n very_spaced_out_pentachord: [1, 2, 1, 2, 1],\n },\n 6: {\n a: [1, 3, 5, 6, 4, 2],\n b: [1, 2, 4, 5, 3, 1],\n spaced_out_hexachord: [1, 3, 2, 1, 3, 2],\n very_spaced_out_hexachord: [1, 2, 1, 2, 1, 2],\n },\n};\nconst articulations = {\n 'a.': { code: 'augmentationDot', between_lines: true },\n av: {\n aboveCode: 'articStaccatissimoAbove',\n belowCode: 'articStaccatissimoBelow',\n between_lines: true,\n },\n 'a>': {\n aboveCode: 'articAccentAbove',\n belowCode: 'articAccentBelow',\n between_lines: true,\n },\n 'a-': {\n aboveCode: 'articTenutoAbove',\n belowCode: 'articTenutoBelow',\n between_lines: true,\n },\n 'a^': {\n aboveCode: 'articMarcatoAbove',\n belowCode: 'articMarcatoBelow',\n between_lines: false,\n },\n 'a+': { code: 'pluckedLeftHandPizzicato', between_lines: false },\n ao: {\n aboveCode: 'pluckedSnapPizzicatoAbove',\n belowCode: 'pluckedSnapPizzicatoBelow',\n between_lines: false,\n },\n ah: { code: 'stringsHarmonic', between_lines: false },\n 'a@': { aboveCode: 'fermataAbove', belowCode: 'fermataBelow', between_lines: false },\n 'a@a': { code: 'fermataAbove', between_lines: false },\n 'a@u': { code: 'fermataBelow', between_lines: false },\n 'a|': { code: 'stringsUpBow', between_lines: false },\n am: { code: 'stringsDownBow', between_lines: false },\n 'a,': { code: 'pictChokeCymbal', between_lines: false }, // Choked\n};\nconst ornaments = {\n mordent: { code: 'ornamentShortTrill' },\n mordent_inverted: { code: 'ornamentMordent' },\n turn: { code: 'ornamentTurn' },\n turn_inverted: { code: 'ornamentTurnSlash' },\n tr: { code: 'ornamentTrill' },\n upprall: { code: 'ornamentPrecompSlideTrillDAnglebert' },\n downprall: { code: 'ornamentPrecompDoubleCadenceUpperPrefix' },\n prallup: { code: 'ornamentPrecompTrillSuffixDandrieu' },\n pralldown: { code: 'ornamentPrecompTrillLowerSuffix' },\n upmordent: { code: 'ornamentPrecompSlideTrillBach' },\n downmordent: { code: 'ornamentPrecompDoubleCadenceUpperPrefixTurn' },\n lineprall: { code: 'ornamentPrecompAppoggTrill' },\n prallprall: { code: 'ornamentTremblement' },\n scoop: { code: 'brassScoop' },\n doit: { code: 'brassDoitMedium' },\n fall: { code: 'brassFallLipShort' },\n doitLong: { code: 'brassLiftMedium' },\n fallLong: { code: 'brassFallRoughMedium' },\n bend: { code: 'brassBend' },\n plungerClosed: { code: 'brassMuteClosed' },\n plungerOpen: { code: 'brassMuteOpen' },\n flip: { code: 'brassFlip' },\n jazzTurn: { code: 'brassJazzTurn' },\n smear: { code: 'brassSmear' },\n};\nexport class Tables {\n /**\n * @returns the `Font` object at the head of the music font stack.\n */\n static currentMusicFont() {\n if (Tables.MUSIC_FONT_STACK.length === 0) {\n throw new RuntimeError('NoFonts', 'The font stack is empty. See: await Flow.fetchMusicFont(...); Flow.setMusicFont(...).');\n }\n else {\n return Tables.MUSIC_FONT_STACK[0];\n }\n }\n static clefProperties(clef) {\n if (!clef || !(clef in clefs))\n throw new RuntimeError('BadArgument', 'Invalid clef: ' + clef);\n return clefs[clef];\n }\n /**\n * @param keyOctaveGlyph a string in the format \"key/octave\" (e.g., \"c/5\") or \"key/octave/custom-note-head-code\" (e.g., \"g/5/t3\").\n * @param clef\n * @param params a struct with one option, `octave_shift` for clef ottavation (0 = default; 1 = 8va; -1 = 8vb, etc.).\n * @returns properties for the specified note.\n */\n // eslint-disable-next-line\n static keyProperties(keyOctaveGlyph, clef = 'treble', params) {\n let options = { octave_shift: 0 };\n if (typeof params === 'object') {\n options = Object.assign(Object.assign({}, options), params);\n }\n const pieces = keyOctaveGlyph.split('/');\n if (pieces.length < 2) {\n throw new RuntimeError('BadArguments', `First argument must be note/octave or note/octave/glyph-code: ${keyOctaveGlyph}`);\n }\n const key = pieces[0].toUpperCase();\n const value = notesInfo[key];\n if (!value)\n throw new RuntimeError('BadArguments', 'Invalid key name: ' + key);\n if (value.octave)\n pieces[1] = value.octave.toString();\n let octave = parseInt(pieces[1], 10);\n // Octave_shift is the shift to compensate for clef 8va/8vb.\n octave += -1 * options.octave_shift;\n const baseIndex = octave * 7 - 4 * 7;\n let line = (baseIndex + value.index) / 2;\n line += Tables.clefProperties(clef).line_shift;\n let stroke = 0;\n if (line <= 0 && (line * 2) % 2 === 0)\n stroke = 1; // stroke up\n if (line >= 6 && (line * 2) % 2 === 0)\n stroke = -1; // stroke down\n // Integer value for note arithmetic.\n const int_value = typeof value.int_val !== 'undefined' ? octave * 12 + value.int_val : undefined;\n // If the user specified a glyph, overwrite the glyph code.\n const code = value.code;\n const shift_right = value.shift_right;\n let customNoteHeadProps = {};\n if (pieces.length > 2 && pieces[2]) {\n const glyphName = pieces[2].toUpperCase();\n customNoteHeadProps = customNoteHeads[glyphName] || {};\n }\n return Object.assign({ key,\n octave,\n line,\n int_value, accidental: value.accidental, code,\n stroke,\n shift_right, displaced: false }, customNoteHeadProps);\n }\n static integerToNote(integer) {\n if (typeof integer === 'undefined' || integer < 0 || integer > 11) {\n throw new RuntimeError('BadArguments', `integerToNote() requires an integer in the range [0, 11]: ${integer}`);\n }\n const table = {\n 0: 'C',\n 1: 'C#',\n 2: 'D',\n 3: 'D#',\n 4: 'E',\n 5: 'F',\n 6: 'F#',\n 7: 'G',\n 8: 'G#',\n 9: 'A',\n 10: 'A#',\n 11: 'B',\n };\n const noteValue = table[integer];\n if (!noteValue) {\n throw new RuntimeError('BadArguments', `Unknown note value for integer: ${integer}`);\n }\n return noteValue;\n }\n static tabToGlyph(fret, scale = 1.0) {\n let glyph = undefined;\n let width = 0;\n let shift_y = 0;\n if (fret.toUpperCase() === 'X') {\n const glyphMetrics = new Glyph('accidentalDoubleSharp', Tables.TABLATURE_FONT_SCALE).getMetrics();\n glyph = 'accidentalDoubleSharp';\n if (glyphMetrics.width == undefined || glyphMetrics.height == undefined)\n throw new RuntimeError('InvalidMetrics', 'Width and height required');\n width = glyphMetrics.width;\n shift_y = -glyphMetrics.height / 2;\n }\n else {\n width = Tables.textWidth(fret);\n }\n return {\n text: fret,\n code: glyph,\n getWidth: () => width * scale,\n shift_y,\n };\n }\n // Used by annotation.ts and bend.ts. Clearly this implementation only works for the default font size.\n // TODO: The actual width depends on the font family, size, weight, style.\n static textWidth(text) {\n return 7 * text.toString().length;\n }\n static articulationCodes(artic) {\n return articulations[artic];\n }\n static accidentalCodes(acc) {\n return accidentals[acc];\n }\n static ornamentCodes(acc) {\n return ornaments[acc];\n }\n static keySignature(spec) {\n const keySpec = keySignatures[spec];\n if (!keySpec) {\n throw new RuntimeError('BadKeySignature', `Bad key signature spec: '${spec}'`);\n }\n if (!keySpec.acc) {\n return [];\n }\n const accidentalList = {\n b: [2, 0.5, 2.5, 1, 3, 1.5, 3.5],\n '#': [0, 1.5, -0.5, 1, 2.5, 0.5, 2],\n };\n const notes = accidentalList[keySpec.acc];\n const acc_list = [];\n for (let i = 0; i < keySpec.num; ++i) {\n const line = notes[i];\n acc_list.push({ type: keySpec.acc, line });\n }\n return acc_list;\n }\n static getKeySignatures() {\n return keySignatures;\n }\n static hasKeySignature(spec) {\n return spec in keySignatures;\n }\n /**\n * Convert duration aliases to the number based duration.\n * If the input isn't an alias, simply return the input.\n * @param duration\n * @returns Example: 'q' -> '4', '8' -> '8'\n */\n static sanitizeDuration(duration) {\n const durationNumber = durationAliases[duration];\n if (durationNumber !== undefined) {\n duration = durationNumber;\n }\n if (durations[duration] === undefined) {\n throw new RuntimeError('BadArguments', `The provided duration is not valid: ${duration}`);\n }\n return duration;\n }\n /** Convert the `duration` to a fraction. */\n static durationToFraction(duration) {\n return new Fraction().parse(Tables.sanitizeDuration(duration));\n }\n /** Convert the `duration` to a number. */\n static durationToNumber(duration) {\n return Tables.durationToFraction(duration).value();\n }\n /* Convert the `duration` to total ticks. */\n static durationToTicks(duration) {\n duration = Tables.sanitizeDuration(duration);\n const ticks = durations[duration];\n if (ticks === undefined) {\n throw new RuntimeError('InvalidDuration');\n }\n return ticks;\n }\n // Return a glyph given duration and type. The type can be a custom glyph code from customNoteHeads.\n // The default type is a regular note ('n').\n // eslint-disable-next-line\n static getGlyphProps(duration, type = 'n') {\n duration = Tables.sanitizeDuration(duration);\n // Lookup duration for default glyph head code\n const code = durationCodes[duration];\n if (code === undefined) {\n return undefined;\n }\n // Get glyph properties for 'type' from duration string (note, rest, harmonic, muted, slash)\n let glyphTypeProperties = code.type[type];\n // If this isn't a standard type, then lookup the custom note head map.\n if (glyphTypeProperties === undefined) {\n // Try and get it from the custom list of note heads\n const customGlyphTypeProperties = customNoteHeads[type.toUpperCase()];\n // If not, then return with nothing.\n if (customGlyphTypeProperties === undefined) {\n return undefined;\n }\n // Otherwise set it as the code_head value\n glyphTypeProperties = Object.assign({ code_head: customGlyphTypeProperties.code }, customGlyphTypeProperties);\n }\n const code_head = glyphTypeProperties.code_head;\n // The default implementation of getWidth() calls Glyph.getWidth(code_head, scale).\n // This can be overridden by an individual glyph type (see slash noteheads below: Tables.SLASH_NOTEHEAD_WIDTH).\n const getWidth = (scale = Tables.NOTATION_FONT_SCALE) => Glyph.getWidth(code_head, scale);\n // Merge duration props for 'duration' with the note head properties.\n return Object.assign(Object.assign(Object.assign({}, code.common), { getWidth: getWidth }), glyphTypeProperties);\n }\n}\nTables.STEM_WIDTH = 1.5;\nTables.STEM_HEIGHT = 35;\nTables.STAVE_LINE_THICKNESS = 1;\nTables.RESOLUTION = RESOLUTION;\n/**\n * Customize this by calling Flow.setMusicFont(...fontNames);\n */\nTables.MUSIC_FONT_STACK = [];\nTables.NOTATION_FONT_SCALE = 39;\nTables.TABLATURE_FONT_SCALE = 39;\nTables.SLASH_NOTEHEAD_WIDTH = 15;\nTables.STAVE_LINE_DISTANCE = 10;\n// HACK:\n// Since text origins are positioned at the baseline, we must\n// compensate for the ascender of the text. Of course, 1 staff space is\n// a very poor approximation.\n//\n// This will be deprecated in the future. This is a temporary solution until\n// we have more robust text metrics.\nTables.TEXT_HEIGHT_OFFSET_HACK = 1;\nTables.accidentalMap = accidentals;\nTables.accidentalColumnsTable = accidentalColumns;\nTables.unicode = {\n // ♯ accidental sharp\n sharp: String.fromCharCode(0x266f),\n // ♭ accidental flat\n flat: String.fromCharCode(0x266d),\n // ♮ accidental natural\n natural: String.fromCharCode(0x266e),\n // △ major seventh\n triangle: String.fromCharCode(0x25b3),\n // ø half-diminished\n 'o-with-slash': String.fromCharCode(0x00f8),\n // ° diminished\n degrees: String.fromCharCode(0x00b0),\n // ○ diminished\n circle: String.fromCharCode(0x25cb),\n};\n/* The list of valid note types. Used by note.ts during parseNoteStruct(). */\nTables.validTypes = validNoteTypes;\n// Default time signature.\nTables.TIME4_4 = {\n num_beats: 4,\n beat_value: 4,\n resolution: RESOLUTION,\n};\n// 1/2, 1, 2, 4, 8, 16, 32, 64, 128\n// NOTE: There is no 256 here! However, there are other mentions of 256 in this file.\n// For example, in durations has a 256 key, and sanitizeDuration() can return 256.\n// The sanitizeDuration() bit may need to be removed by 0xfe.\n// eslint-disable-next-line\nconst durationCodes = {\n '1/2': {\n common: {\n stem: false,\n stem_offset: 0,\n flag: false,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Breve note\n code_head: 'noteheadDoubleWhole',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDoubleWhole', scale);\n // },\n },\n h: {\n // Breve note harmonic\n code_head: 'unpitchedPercussionClef1',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('unpitchedPercussionClef1', scale);\n // },\n },\n m: {\n // Breve note muted\n code_head: 'vexNoteHeadMutedBreve',\n stem_offset: 0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('vexNoteHeadMutedBreve', scale);\n // },\n },\n r: {\n // Breve rest\n code_head: 'restDoubleWhole',\n rest: true,\n position: 'B/5',\n dot_shiftY: 0.5,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('restDoubleWhole', scale);\n // },\n },\n s: {\n // Breve note slash -\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadDoubleWhole',\n },\n },\n },\n 1: {\n common: {\n stem: false,\n stem_offset: 0,\n flag: false,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Whole note\n code_head: 'noteheadWhole',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadWhole', scale);\n // },\n },\n h: {\n // Whole note harmonic\n code_head: 'noteheadDiamondWhole',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondWhole', scale);\n // },\n },\n m: {\n // Whole note muted\n code_head: 'noteheadXWhole',\n stem_offset: -3,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXWhole', scale);\n // },\n },\n r: {\n // Whole rest\n code_head: 'restWhole',\n rest: true,\n position: 'D/5',\n dot_shiftY: 0.5,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('restWhole', scale);\n // },\n },\n s: {\n // Whole note slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadWhole',\n },\n },\n },\n 2: {\n common: {\n stem: true,\n stem_offset: 0,\n flag: false,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Half note\n code_head: 'noteheadHalf',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadHalf', scale);\n // },\n },\n h: {\n // Half note harmonic\n code_head: 'noteheadDiamondHalf',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondHalf', scale);\n // },\n },\n m: {\n // Half note muted\n code_head: 'noteheadXHalf',\n stem_offset: -3,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXHalf', scale);\n // },\n },\n r: {\n // Half rest\n code_head: 'restHalf',\n stem: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('restHalf', scale);\n // },\n },\n s: {\n // Half note slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadHalf',\n },\n },\n },\n 4: {\n common: {\n stem: true,\n stem_offset: 0,\n flag: false,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Quarter note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Quarter harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Quarter muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Quarter rest\n code_head: 'restQuarter',\n stem: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n line_above: 1.5,\n line_below: 1.5,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('restQuarter', scale);\n // },\n },\n s: {\n // Quarter slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 8: {\n common: {\n stem: true,\n stem_offset: 0,\n flag: true,\n beam_count: 1,\n stem_beam_extension: 0,\n code_flag_upstem: 'flag8thUp',\n code_flag_downstem: 'flag8thDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Eighth note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Eighth note harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Eighth note muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Eighth rest\n code_head: 'rest8th',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n line_above: 1.0,\n line_below: 1.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest8th', scale);\n // },\n },\n s: {\n // Eighth slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 16: {\n common: {\n beam_count: 2,\n stem_beam_extension: 0,\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'flag16thUp',\n code_flag_downstem: 'flag16thDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Sixteenth note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Sixteenth note harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Sixteenth note muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Sixteenth rest\n code_head: 'rest16th',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n line_above: 1.0,\n line_below: 2.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest16th', scale);\n // },\n },\n s: {\n // Sixteenth slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 32: {\n common: {\n beam_count: 3,\n stem_beam_extension: 7.5,\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'flag32ndUp',\n code_flag_downstem: 'flag32ndDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Thirty-second note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Thirty-second harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Thirty-second muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Thirty-second rest\n code_head: 'rest32nd',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -1.5,\n line_above: 2.0,\n line_below: 2.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest32nd', scale);\n // },\n },\n s: {\n // Thirty-second slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 64: {\n common: {\n beam_count: 4,\n stem_beam_extension: 15,\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'flag64thUp',\n code_flag_downstem: 'flag64thDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Sixty-fourth note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Sixty-fourth harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Sixty-fourth muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Sixty-fourth rest\n code_head: 'rest64th',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -1.5,\n line_above: 2.0,\n line_below: 3.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest64th', scale);\n // },\n },\n s: {\n // Sixty-fourth slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 128: {\n common: {\n beam_count: 5,\n stem_beam_extension: 22.5,\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'flag128thUp',\n code_flag_downstem: 'flag128thDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Hundred-twenty-eight note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Hundred-twenty-eight harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Hundred-twenty-eight muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Hundred-twenty-eight rest\n code_head: 'rest128th',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -2.5,\n line_above: 3.0,\n line_below: 3.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest128th', scale);\n // },\n },\n s: {\n // Hundred-twenty-eight slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// @author Mohit Cheppudira\n// @author Greg Ristow (modifications)\nimport { Fraction } from './fraction';\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Music } from './music';\nimport { Tables } from './tables';\nimport { Category, isAccidental, isGraceNote, isGraceNoteGroup, isStaveNote } from './typeguard';\nimport { defined, log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Accidental.DEBUG)\n log('Vex.Flow.Accidental', args);\n}\n/**\n * An `Accidental` inherits from `Modifier`, and is formatted within a\n * `ModifierContext`. Accidentals are modifiers that can be attached to\n * notes. Support is included for both western and microtonal accidentals.\n *\n * See `tests/accidental_tests.ts` for usage examples.\n */\nexport class Accidental extends Modifier {\n /**\n * Create accidental.\n * @param type value from `Vex.Flow.accidentalCodes.accidentals` table in `tables.ts`.\n * For example: `#`, `##`, `b`, `n`, etc.\n */\n constructor(type) {\n super();\n L('New accidental: ', type);\n this.type = type;\n this.position = Modifier.Position.LEFT;\n this.render_options = {\n // Font size for glyphs\n font_scale: 38,\n // Padding between accidental and parentheses on each side\n parenLeftPadding: 2,\n parenRightPadding: 2,\n };\n this.accidental = Tables.accidentalCodes(this.type);\n defined(this.accidental, 'ArgumentError', `Unknown accidental type: ${type}`);\n // Cautionary accidentals have parentheses around them\n this.cautionary = false;\n this.reset();\n }\n /** Accidentals category string. */\n static get CATEGORY() {\n return Category.Accidental;\n }\n /** Arrange accidentals inside a ModifierContext. */\n static format(accidentals, state) {\n // If there are no accidentals, no need to format their positions.\n if (!accidentals || accidentals.length === 0)\n return;\n const musicFont = Tables.currentMusicFont();\n const noteheadAccidentalPadding = musicFont.lookupMetric('accidental.noteheadAccidentalPadding');\n const leftShift = state.left_shift + noteheadAccidentalPadding;\n const accidentalSpacing = musicFont.lookupMetric('accidental.accidentalSpacing');\n const additionalPadding = musicFont.lookupMetric('accidental.leftPadding'); // padding to the left of all accidentals\n const accList = [];\n let prevNote = undefined;\n let shiftL = 0;\n // First determine the accidentals' Y positions from the note.keys\n for (let i = 0; i < accidentals.length; ++i) {\n const acc = accidentals[i];\n const note = acc.getNote();\n const stave = note.getStave();\n const index = acc.checkIndex();\n const props = note.getKeyProps()[index];\n if (note !== prevNote) {\n // Iterate through all notes to get the displaced pixels\n for (let n = 0; n < note.keys.length; ++n) {\n shiftL = Math.max(note.getLeftDisplacedHeadPx(), shiftL);\n }\n prevNote = note;\n }\n if (stave) {\n const lineSpace = stave.getSpacingBetweenLines();\n const y = stave.getYForLine(props.line);\n const accLine = Math.round((y / lineSpace) * 2) / 2;\n accList.push({ y, line: accLine, shift: shiftL, acc, lineSpace });\n }\n else {\n accList.push({ line: props.line, shift: shiftL, acc });\n }\n }\n // Sort accidentals by line number.\n accList.sort((a, b) => b.line - a.line);\n // FIXME: Confusing name. Each object in this array has a property called `line`.\n // So if this is a list of lines, you end up with: `line.line` which is very awkward.\n const lineList = [];\n // amount by which all accidentals must be shifted right or left for\n // stem flipping, notehead shifting concerns.\n let accShift = 0;\n let previousLine = undefined;\n // Create an array of unique line numbers (lineList) from accList\n for (let i = 0; i < accList.length; i++) {\n const acc = accList[i];\n // if this is the first line, or a new line, add a lineList\n if (previousLine === undefined || previousLine !== acc.line) {\n lineList.push({\n line: acc.line,\n flatLine: true,\n dblSharpLine: true,\n numAcc: 0,\n width: 0,\n column: 0,\n });\n }\n // if this accidental is not a flat, the accidental needs 3.0 lines lower\n // clearance instead of 2.5 lines for b or bb.\n // FIXME: Naming could use work. acc.acc is very awkward\n if (acc.acc.type !== 'b' && acc.acc.type !== 'bb') {\n lineList[lineList.length - 1].flatLine = false;\n }\n // if this accidental is not a double sharp, the accidental needs 3.0 lines above\n if (acc.acc.type !== '##') {\n lineList[lineList.length - 1].dblSharpLine = false;\n }\n // Track how many accidentals are on this line:\n lineList[lineList.length - 1].numAcc++;\n // Track the total x_offset needed for this line which will be needed\n // for formatting lines w/ multiple accidentals:\n // width = accidental width + universal spacing between accidentals\n lineList[lineList.length - 1].width += acc.acc.getWidth() + accidentalSpacing;\n // if this accShift is larger, use it to keep first column accidentals in the same line\n accShift = acc.shift > accShift ? acc.shift : accShift;\n previousLine = acc.line;\n }\n // ### Place Accidentals in Columns\n //\n // Default to a classic triangular layout (middle accidental farthest left),\n // but follow exceptions as outlined in G. Read's _Music Notation_ and\n // Elaine Gould's _Behind Bars_.\n //\n // Additionally, this implements different vertical collision rules for\n // flats (only need 2.5 lines clearance below) and double sharps (only\n // need 2.5 lines of clearance above or below).\n //\n // Classic layouts and exception patterns are found in the 'tables.js'\n // in 'Tables.accidentalColumnsTable'\n //\n // Beyond 6 vertical accidentals, default to the parallel ascending lines approach,\n // using as few columns as possible for the verticle structure.\n //\n // TODO (?): Allow column to be specified for an accidental at run-time?\n let totalColumns = 0;\n // establish the boundaries for a group of notes with clashing accidentals:\n for (let i = 0; i < lineList.length; i++) {\n let noFurtherConflicts = false;\n const groupStart = i;\n let groupEnd = i;\n while (groupEnd + 1 < lineList.length && !noFurtherConflicts) {\n // if this note conflicts with the next:\n if (this.checkCollision(lineList[groupEnd], lineList[groupEnd + 1])) {\n // include the next note in the group:\n groupEnd++;\n }\n else {\n noFurtherConflicts = true;\n }\n }\n // Gets an a line from the `lineList`, relative to the current group\n const getGroupLine = (index) => lineList[groupStart + index];\n const getGroupLines = (indexes) => indexes.map(getGroupLine);\n const lineDifference = (indexA, indexB) => {\n const [a, b] = getGroupLines([indexA, indexB]).map((item) => item.line);\n return a - b;\n };\n const notColliding = (...indexPairs) => indexPairs.map(getGroupLines).every(([line1, line2]) => !this.checkCollision(line1, line2));\n // Set columns for the lines in this group:\n const groupLength = groupEnd - groupStart + 1;\n // Set the accidental column for each line of the group\n let endCase = this.checkCollision(lineList[groupStart], lineList[groupEnd]) ? 'a' : 'b';\n switch (groupLength) {\n case 3:\n if (endCase === 'a' && lineDifference(1, 2) === 0.5 && lineDifference(0, 1) !== 0.5) {\n endCase = 'second_on_bottom';\n }\n break;\n case 4:\n if (notColliding([0, 2], [1, 3])) {\n endCase = 'spaced_out_tetrachord';\n }\n break;\n case 5:\n if (endCase === 'b' && notColliding([1, 3])) {\n endCase = 'spaced_out_pentachord';\n if (notColliding([0, 2], [2, 4])) {\n endCase = 'very_spaced_out_pentachord';\n }\n }\n break;\n case 6:\n if (notColliding([0, 3], [1, 4], [2, 5])) {\n endCase = 'spaced_out_hexachord';\n }\n if (notColliding([0, 2], [2, 4], [1, 3], [3, 5])) {\n endCase = 'very_spaced_out_hexachord';\n }\n break;\n default:\n break;\n }\n let groupMember;\n let column;\n // If the group contains seven members or more, use ascending parallel lines\n // of accidentals, using as few columns as possible while avoiding collisions.\n if (groupLength >= 7) {\n // First, determine how many columns to use:\n let patternLength = 2;\n let collisionDetected = true;\n while (collisionDetected === true) {\n collisionDetected = false;\n for (let line = 0; line + patternLength < lineList.length; line++) {\n if (this.checkCollision(lineList[line], lineList[line + patternLength])) {\n collisionDetected = true;\n patternLength++;\n break;\n }\n }\n }\n // Then, assign a column to each line of accidentals\n for (groupMember = i; groupMember <= groupEnd; groupMember++) {\n column = ((groupMember - i) % patternLength) + 1;\n lineList[groupMember].column = column;\n totalColumns = totalColumns > column ? totalColumns : column;\n }\n }\n else {\n // If the group contains fewer than seven members, use the layouts from\n // the Tables.accidentalColumnsTable (See: tables.ts).\n for (groupMember = i; groupMember <= groupEnd; groupMember++) {\n column = Tables.accidentalColumnsTable[groupLength][endCase][groupMember - i];\n lineList[groupMember].column = column;\n totalColumns = totalColumns > column ? totalColumns : column;\n }\n }\n // Increment i to the last note that was set, so that if a lower set of notes\n // does not conflict at all with this group, it can have its own classic shape.\n i = groupEnd;\n }\n // ### Convert Columns to x_offsets\n //\n // This keeps columns aligned, even if they have different accidentals within them\n // which sometimes results in a larger x_offset than is an accidental might need\n // to preserve the symmetry of the accidental shape.\n //\n // Neither A.C. Vinci nor G. Read address this, and it typically only happens in\n // music with complex chord clusters.\n //\n // TODO (?): Optionally allow closer compression of accidentals, instead of forcing\n // parallel columns.\n // track each column's max width, which will be used as initial shift of later columns:\n const columnWidths = [];\n const columnXOffsets = [];\n for (let i = 0; i <= totalColumns; i++) {\n columnWidths[i] = 0;\n columnXOffsets[i] = 0;\n }\n columnWidths[0] = accShift + leftShift;\n columnXOffsets[0] = accShift + leftShift;\n // Fill columnWidths with widest needed x-space;\n // this is what keeps the columns parallel.\n lineList.forEach((line) => {\n if (line.width > columnWidths[line.column])\n columnWidths[line.column] = line.width;\n });\n for (let i = 1; i < columnWidths.length; i++) {\n // this column's offset = this column's width + previous column's offset\n columnXOffsets[i] = columnWidths[i] + columnXOffsets[i - 1];\n }\n const totalShift = columnXOffsets[columnXOffsets.length - 1];\n // Set the xShift for each accidental according to column offsets:\n let accCount = 0;\n lineList.forEach((line) => {\n let lineWidth = 0;\n const lastAccOnLine = accCount + line.numAcc;\n // handle all of the accidentals on a given line:\n for (accCount; accCount < lastAccOnLine; accCount++) {\n const xShift = columnXOffsets[line.column - 1] + lineWidth;\n accList[accCount].acc.setXShift(xShift);\n // keep track of the width of accidentals we've added so far, so that when\n // we loop, we add space for them.\n lineWidth += accList[accCount].acc.getWidth() + accidentalSpacing;\n L('Line, accCount, shift: ', line.line, accCount, xShift);\n }\n });\n // update the overall layout with the full width of the accidental shapes:\n state.left_shift += totalShift + additionalPadding;\n }\n /** Helper function to determine whether two lines of accidentals collide vertically */\n static checkCollision(line1, line2) {\n let clearance = line2.line - line1.line;\n let clearanceRequired = 3;\n // But less clearance is required for certain accidentals: b, bb and ##.\n if (clearance > 0) {\n // then line 2 is on top\n clearanceRequired = line2.flatLine || line2.dblSharpLine ? 2.5 : 3.0;\n if (line1.dblSharpLine)\n clearance -= 0.5;\n }\n else {\n // line 1 is on top\n clearanceRequired = line1.flatLine || line1.dblSharpLine ? 2.5 : 3.0;\n if (line2.dblSharpLine)\n clearance -= 0.5;\n }\n const collision = Math.abs(clearance) < clearanceRequired;\n L('Line_1, Line_2, Collision: ', line1.line, line2.line, collision);\n return collision;\n }\n /**\n * Use this method to automatically apply accidentals to a set of `voices`.\n * The accidentals will be remembered between all the voices provided.\n * Optionally, you can also provide an initial `keySignature`.\n */\n static applyAccidentals(voices, keySignature) {\n const tickPositions = [];\n const tickNoteMap = {};\n // Sort the tickables in each voice by their tick position in the voice.\n voices.forEach((voice) => {\n const tickPosition = new Fraction(0, 1);\n const tickable = voice.getTickables();\n tickable.forEach((t) => {\n if (t.shouldIgnoreTicks())\n return;\n const notesAtPosition = tickNoteMap[tickPosition.value()];\n if (!notesAtPosition) {\n tickPositions.push(tickPosition.value());\n tickNoteMap[tickPosition.value()] = [t];\n }\n else {\n notesAtPosition.push(t);\n }\n tickPosition.add(t.getTicks());\n });\n });\n const music = new Music();\n // Default key signature is C major.\n if (!keySignature)\n keySignature = 'C';\n // Get the scale map, which represents the current state of each pitch.\n const scaleMapKey = music.createScaleMap(keySignature);\n const scaleMap = {};\n tickPositions.forEach((tickPos) => {\n const tickables = tickNoteMap[tickPos];\n // Array to store all pitches that modified accidental states\n // at this tick position\n const modifiedPitches = [];\n const processNote = (t) => {\n // Only StaveNote implements .addModifier(), which is used below.\n if (!isStaveNote(t) || t.isRest() || t.shouldIgnoreTicks()) {\n return;\n }\n // Go through each key and determine if an accidental should be applied.\n const staveNote = t;\n staveNote.keys.forEach((keyString, keyIndex) => {\n const key = music.getNoteParts(keyString.split('/')[0]);\n const octave = keyString.split('/')[1];\n // Force a natural for every key without an accidental\n const accidentalString = key.accidental || 'n';\n const pitch = key.root + accidentalString;\n // Determine if the current pitch has the same accidental\n // as the scale state\n if (!scaleMap[key.root + octave])\n scaleMap[key.root + octave] = scaleMapKey[key.root];\n const sameAccidental = scaleMap[key.root + octave] === pitch;\n // Determine if an identical pitch in the chord already\n // modified the accidental state\n const previouslyModified = modifiedPitches.indexOf(keyString) > -1;\n // Remove accidentals\n staveNote.getModifiers().forEach((modifier, index) => {\n if (isAccidental(modifier) && modifier.type == accidentalString && modifier.getIndex() == keyIndex) {\n staveNote.getModifiers().splice(index, 1);\n }\n });\n // Add the accidental to the StaveNote\n if (!sameAccidental || (sameAccidental && previouslyModified)) {\n // Modify the scale map so that the root pitch has an\n // updated state\n scaleMap[key.root + octave] = pitch;\n // Create the accidental\n const accidental = new Accidental(accidentalString);\n // Attach the accidental to the StaveNote\n staveNote.addModifier(accidental, keyIndex);\n // Add the pitch to list of pitches that modified accidentals\n modifiedPitches.push(keyString);\n }\n });\n // process grace notes\n staveNote.getModifiers().forEach((modifier) => {\n if (isGraceNoteGroup(modifier)) {\n modifier.getGraceNotes().forEach(processNote);\n }\n });\n };\n tickables.forEach(processNote);\n });\n }\n reset() {\n const fontScale = this.render_options.font_scale;\n this.glyph = new Glyph(this.accidental.code, fontScale);\n this.glyph.setOriginX(1.0);\n if (this.cautionary) {\n this.parenLeft = new Glyph(Tables.accidentalCodes('{').code, fontScale);\n this.parenRight = new Glyph(Tables.accidentalCodes('}').code, fontScale);\n this.parenLeft.setOriginX(1.0);\n this.parenRight.setOriginX(1.0);\n }\n }\n /** Get width in pixels. */\n getWidth() {\n if (this.cautionary) {\n const parenLeft = defined(this.parenLeft);\n const parenRight = defined(this.parenRight);\n const parenWidth = parenLeft.getMetrics().width +\n parenRight.getMetrics().width +\n this.render_options.parenLeftPadding +\n this.render_options.parenRightPadding;\n return this.glyph.getMetrics().width + parenWidth;\n }\n else {\n return this.glyph.getMetrics().width;\n }\n }\n /** Attach this accidental to `note`, which must be a `StaveNote`. */\n setNote(note) {\n defined(note, 'ArgumentError', `Bad note value: ${note}`);\n this.note = note;\n // Accidentals attached to grace notes are rendered smaller.\n if (isGraceNote(note)) {\n this.render_options.font_scale = 25;\n this.reset();\n }\n return this;\n }\n /** If called, draws parenthesis around accidental. */\n setAsCautionary() {\n this.cautionary = true;\n this.render_options.font_scale = 28;\n this.reset();\n return this;\n }\n /** Render accidental onto canvas. */\n draw() {\n const { type, position, index, cautionary, x_shift, y_shift, glyph, render_options: { parenLeftPadding, parenRightPadding }, } = this;\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n // Figure out the start `x` and `y` coordinates for note and index.\n const start = note.getModifierStartXY(position, index);\n let accX = start.x + x_shift;\n const accY = start.y + y_shift;\n L('Rendering: ', type, accX, accY);\n if (!cautionary) {\n glyph.render(ctx, accX, accY);\n }\n else {\n const parenLeft = defined(this.parenLeft);\n const parenRight = defined(this.parenRight);\n // Render the accidental in parentheses.\n parenRight.render(ctx, accX, accY);\n accX -= parenRight.getMetrics().width;\n accX -= parenRightPadding;\n accX -= this.accidental.parenRightPaddingAdjustment;\n glyph.render(ctx, accX, accY);\n accX -= glyph.getMetrics().width;\n accX -= parenLeftPadding;\n parenLeft.render(ctx, accX, accY);\n }\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Accidental.DEBUG` to `true`. */\nAccidental.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This file implements the `Stem` object. Generally this object is handled\n// by its parent `StemmableNote`.\nimport { Element } from './element';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Stem.DEBUG)\n log('Vex.Flow.Stem', args);\n}\nexport class Stem extends Element {\n constructor(options) {\n super();\n this.stem_up_y_offset = 0;\n this.stem_down_y_offset = 0;\n this.stem_up_y_base_offset = 0;\n this.stem_down_y_base_offset = 0;\n // Default notehead x bounds\n this.x_begin = (options === null || options === void 0 ? void 0 : options.x_begin) || 0;\n this.x_end = (options === null || options === void 0 ? void 0 : options.x_end) || 0;\n // Y bounds for top/bottom most notehead\n this.y_top = (options === null || options === void 0 ? void 0 : options.y_top) || 0;\n this.y_bottom = (options === null || options === void 0 ? void 0 : options.y_bottom) || 0;\n // Stem top extension\n this.stem_extension = (options === null || options === void 0 ? void 0 : options.stem_extension) || 0;\n // Direction of the stem\n this.stem_direction = (options === null || options === void 0 ? void 0 : options.stem_direction) || 0;\n // Flag to override all draw calls\n this.hide = (options === null || options === void 0 ? void 0 : options.hide) || false;\n this.isStemlet = (options === null || options === void 0 ? void 0 : options.isStemlet) || false;\n this.stemletHeight = (options === null || options === void 0 ? void 0 : options.stemletHeight) || 0;\n // Use to adjust the rendered height without affecting\n // the results of `.getExtents()`\n this.renderHeightAdjustment = 0;\n this.setOptions(options);\n }\n static get CATEGORY() {\n return Category.Stem;\n }\n // Stem directions\n static get UP() {\n return 1;\n }\n static get DOWN() {\n return -1;\n }\n // Theme\n static get WIDTH() {\n return Tables.STEM_WIDTH;\n }\n static get HEIGHT() {\n return Tables.STEM_HEIGHT;\n }\n setOptions(options) {\n // Changing where the stem meets the head\n this.stem_up_y_offset = (options === null || options === void 0 ? void 0 : options.stem_up_y_offset) || 0;\n this.stem_down_y_offset = (options === null || options === void 0 ? void 0 : options.stem_down_y_offset) || 0;\n this.stem_up_y_base_offset = (options === null || options === void 0 ? void 0 : options.stem_up_y_base_offset) || 0;\n this.stem_down_y_base_offset = (options === null || options === void 0 ? void 0 : options.stem_down_y_base_offset) || 0;\n }\n // Set the x bounds for the default notehead\n setNoteHeadXBounds(x_begin, x_end) {\n this.x_begin = x_begin;\n this.x_end = x_end;\n return this;\n }\n // Set the direction of the stem in relation to the noteheads\n setDirection(direction) {\n this.stem_direction = direction;\n }\n // Set the extension for the stem, generally for flags or beams\n setExtension(ext) {\n this.stem_extension = ext;\n }\n getExtension() {\n return this.stem_extension;\n }\n // The the y bounds for the top and bottom noteheads\n setYBounds(y_top, y_bottom) {\n this.y_top = y_top;\n this.y_bottom = y_bottom;\n }\n // Gets the entire height for the stem\n getHeight() {\n const y_offset = this.stem_direction === Stem.UP ? this.stem_up_y_offset : this.stem_down_y_offset;\n const unsigned_height = this.y_bottom - this.y_top + (Stem.HEIGHT - y_offset + this.stem_extension); // parentheses just for grouping.\n return unsigned_height * this.stem_direction;\n }\n getBoundingBox() {\n throw new RuntimeError('NotImplemented', 'getBoundingBox() not implemented.');\n }\n // Get the y coordinates for the very base of the stem to the top of\n // the extension\n getExtents() {\n const isStemUp = this.stem_direction === Stem.UP;\n const ys = [this.y_top, this.y_bottom];\n const stemHeight = Stem.HEIGHT + this.stem_extension;\n const innerMostNoteheadY = (isStemUp ? Math.min : Math.max)(...ys);\n const outerMostNoteheadY = (isStemUp ? Math.max : Math.min)(...ys);\n const stemTipY = innerMostNoteheadY + stemHeight * -this.stem_direction;\n return { topY: stemTipY, baseY: outerMostNoteheadY };\n }\n setVisibility(isVisible) {\n this.hide = !isVisible;\n return this;\n }\n setStemlet(isStemlet, stemletHeight) {\n this.isStemlet = isStemlet;\n this.stemletHeight = stemletHeight;\n return this;\n }\n adjustHeightForFlag() {\n this.renderHeightAdjustment = Tables.currentMusicFont().lookupMetric('stem.heightAdjustmentForFlag', -3);\n }\n adjustHeightForBeam() {\n this.renderHeightAdjustment = -Stem.WIDTH / 2;\n }\n // Render the stem onto the canvas\n draw() {\n this.setRendered();\n if (this.hide)\n return;\n const ctx = this.checkContext();\n let stem_x;\n let stem_y;\n const stem_direction = this.stem_direction;\n let y_base_offset = 0;\n if (stem_direction === Stem.DOWN) {\n // Down stems are rendered to the left of the head.\n stem_x = this.x_begin;\n stem_y = this.y_top + this.stem_down_y_offset;\n y_base_offset = this.stem_down_y_base_offset;\n }\n else {\n // Up stems are rendered to the right of the head.\n stem_x = this.x_end;\n stem_y = this.y_bottom - this.stem_up_y_offset;\n y_base_offset = this.stem_up_y_base_offset;\n }\n const stemHeight = this.getHeight();\n L('Rendering stem - ', 'Top Y: ', this.y_top, 'Bottom Y: ', this.y_bottom);\n // The offset from the stem's base which is required fo satisfy the stemlet height\n const stemletYOffset = this.isStemlet ? stemHeight - this.stemletHeight * this.stem_direction : 0;\n // Draw the stem\n ctx.save();\n this.applyStyle(ctx);\n ctx.beginPath();\n ctx.setLineWidth(Stem.WIDTH);\n ctx.moveTo(stem_x, stem_y - stemletYOffset + y_base_offset);\n ctx.lineTo(stem_x, stem_y - stemHeight - this.renderHeightAdjustment * stem_direction);\n ctx.stroke();\n this.restoreStyle(ctx);\n ctx.restore();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Stem.DEBUG` to `true`. */\nStem.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font, FontStyle, FontWeight } from './font';\nimport { log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (TextFormatter.DEBUG)\n log('Vex.Flow.TextFormatter', args);\n}\n/**\n * Text widths are stored in a cache, so we don't have to recompute widths\n * for the same font + string combination.\n *\n * The cache is first keyed by the font information. The key is of the form:\n * `${family}-${size}-${weight}-${style}`\n * The second level key is the specific text to be measured.\n *\n * The stored value is the measured width in `em` units.\n * textWidth == textWidthCache[cacheKey][textToMeasure]\n */\nconst textWidthCache = {};\n/**\n * Applications may register additional fonts via `TextFormatter.registerInfo(info)`.\n * The metrics for those fonts will be made available to the application.\n */\nconst registry = {};\nexport class TextFormatter {\n /**\n * Use `TextFormatter.create(...)` to build an instance from information previously\n * registered via `TextFormatter.registerInfo(info)`.\n */\n constructor(formatterInfo) {\n /** Font family. */\n this.family = '';\n /** Specified in `pt` units. */\n this.size = 14;\n /** Font metrics are extracted at 1000 upem (units per em). */\n this.resolution = 1000;\n /**\n * For text formatting, we do not require glyph outlines, but instead rely on glyph\n * bounding box metrics such as:\n * ```\n * {\n * x_min: 48,\n * x_max: 235,\n * y_min: -17,\n * y_max: 734,\n * ha: 751,\n * leftSideBearing: 48,\n * advanceWidth: 286,\n * }\n * ```\n */\n this.glyphs = {};\n this.serifs = false;\n this.monospaced = false;\n this.italic = false;\n this.bold = false;\n this.superscriptOffset = 0;\n this.subscriptOffset = 0;\n this.maxSizeGlyph = 'H';\n // This is an internal key used to index the `textWidthCache`.\n this.cacheKey = '';\n this.updateParams(formatterInfo);\n }\n /**\n * Return all registered font families.\n */\n static getFontFamilies() {\n const registeredFonts = [];\n for (const fontFamily in registry) {\n const formatterInfo = registry[fontFamily];\n registeredFonts.push(Object.assign({}, formatterInfo));\n }\n return registeredFonts;\n }\n /**\n * Call `TextFormatter.registerInfo(info)` to register font information before using this method.\n *\n * This method creates a formatter for the font that most closely matches the requested font.\n * We compare font family, bold, and italic attributes.\n * This method will return a fallback formatter if there are no matches.\n */\n static create(requestedFont = {}) {\n L('create: ', requestedFont);\n if (!requestedFont.family) {\n requestedFont.family = Font.SANS_SERIF;\n }\n // TODO: One potential (small) optimization is to cache the TextFormatter object\n // returned for each font info. We would probably want to clear the cache if\n // the registry is ever updated.\n const candidates = [];\n // The incoming font family is a string of comma-separated font family names.\n // (e.g., `PetalumaScript, Arial, sans-serif`).\n const requestedFamilies = requestedFont.family.split(/\\s*,\\s*/);\n for (const requestedFamily of requestedFamilies) {\n for (const fontFamily in registry) {\n // Support cases where the registry contains 'Roboto Slab Medium',\n // but the requestedFont.family is 'Roboto Slab'.\n if (fontFamily.startsWith(requestedFamily)) {\n candidates.push(registry[fontFamily]);\n }\n }\n if (candidates.length > 0) {\n break;\n }\n }\n let formatter;\n if (candidates.length === 0) {\n // No match, so return a fallback text formatter.\n formatter = new TextFormatter(Object.values(registry)[0]);\n }\n else if (candidates.length === 1) {\n formatter = new TextFormatter(candidates[0]);\n }\n else {\n const bold = Font.isBold(requestedFont.weight);\n const italic = Font.isItalic(requestedFont.style);\n const perfectMatch = candidates.find((f) => f.bold === bold && f.italic === italic);\n if (perfectMatch) {\n formatter = new TextFormatter(perfectMatch);\n }\n else {\n const partialMatch = candidates.find((f) => f.italic === italic || f.bold === bold);\n if (partialMatch) {\n formatter = new TextFormatter(partialMatch);\n }\n else {\n formatter = new TextFormatter(candidates[0]);\n }\n }\n }\n const fontSize = requestedFont.size;\n if (typeof fontSize !== 'undefined') {\n const fontSizeInPt = Font.convertSizeToPointValue(fontSize);\n formatter.setFontSize(fontSizeInPt);\n }\n return formatter;\n }\n /**\n * @param fontFamily used as a key to the font registry.\n * @returns the same info object that was passed in via `TextFormatter.registerInfo(info)`\n */\n static getInfo(fontFamily) {\n return registry[fontFamily];\n }\n /**\n * Apps may register their own fonts and metrics, and those metrics\n * will be available to the app for formatting.\n *\n * Metrics can be generated from a font file using fontgen_text.js in the tools/fonts directory.\n * @param info\n * @param overwrite\n */\n static registerInfo(info, overwrite = false) {\n L('registerInfo: ', info, overwrite);\n const fontFamily = info.family;\n const currFontInfo = registry[fontFamily];\n if (currFontInfo === undefined || overwrite) {\n registry[fontFamily] = info;\n }\n }\n updateParams(params) {\n if (params.family)\n this.family = params.family;\n if (params.resolution)\n this.resolution = params.resolution;\n if (params.glyphs)\n this.glyphs = params.glyphs;\n if (params.serifs)\n this.serifs = params.serifs;\n if (params.monospaced)\n this.monospaced = params.monospaced;\n if (params.italic)\n this.italic = params.italic;\n if (params.bold)\n this.bold = params.bold;\n if (params.maxSizeGlyph)\n this.maxSizeGlyph = params.maxSizeGlyph;\n if (params.superscriptOffset)\n this.superscriptOffset = params.superscriptOffset;\n if (params.subscriptOffset)\n this.subscriptOffset = params.subscriptOffset;\n this.updateCacheKey();\n }\n /** Create a hash with the current font data, so we can cache computed widths. */\n updateCacheKey() {\n const family = this.family.replace(/\\s+/g, '_');\n const size = this.size;\n const weight = this.bold ? FontWeight.BOLD : FontWeight.NORMAL;\n const style = this.italic ? FontStyle.ITALIC : FontStyle.NORMAL;\n // Use the same key format as SVGContext.\n this.cacheKey = `${family}%${size}%${weight}%${style}`;\n }\n /**\n * The glyphs table is indexed by the character (e.g., 'C', '@').\n * See: robotoslab_glyphs.ts & petalumascript_glyphs.ts.\n */\n getGlyphMetrics(character) {\n if (this.glyphs[character]) {\n return this.glyphs[character];\n }\n else {\n return this.glyphs[this.maxSizeGlyph];\n }\n }\n get maxHeight() {\n const metrics = this.getGlyphMetrics(this.maxSizeGlyph);\n return (metrics.ha / this.resolution) * this.fontSizeInPixels;\n }\n /**\n * Retrieve the character's advanceWidth as a fraction of an `em` unit.\n * For the space character ' ' as defined in the:\n * petalumascript_glyphs.ts: 250 advanceWidth in the 1000 unitsPerEm font returns 0.25.\n * robotoslab_glyphs.ts: 509 advanceWidth in the 2048 unitsPerEm font returns 0.2485.\n */\n getWidthForCharacterInEm(c) {\n var _a;\n const metrics = this.getGlyphMetrics(c);\n if (!metrics) {\n // An arbitrary number, close to the `em` width of the '#' and '5' characters in PetalumaScript.\n return 0.65;\n }\n else {\n const advanceWidth = (_a = metrics.advanceWidth) !== null && _a !== void 0 ? _a : 0;\n return advanceWidth / this.resolution;\n }\n }\n /**\n * Retrieve the total width of `text` in `em` units.\n */\n getWidthForTextInEm(text) {\n const key = this.cacheKey;\n // Get the cache for this specific font family, size, weight, style combination.\n // The cache contains previously computed widths for different `text` strings.\n let cachedWidths = textWidthCache[key];\n if (cachedWidths === undefined) {\n cachedWidths = {};\n textWidthCache[key] = cachedWidths;\n }\n let width = cachedWidths[text];\n if (width === undefined) {\n width = 0;\n for (let i = 0; i < text.length; ++i) {\n width += this.getWidthForCharacterInEm(text[i]);\n }\n cachedWidths[text] = width;\n }\n return width;\n }\n /** The width of the text (in `em`) is scaled by the font size (in `px`). */\n getWidthForTextInPx(text) {\n return this.getWidthForTextInEm(text) * this.fontSizeInPixels;\n }\n /**\n * @param size in pt.\n */\n setFontSize(size) {\n this.size = size;\n // The width cache key depends on the current font size.\n this.updateCacheKey();\n return this;\n }\n /** `this.size` is specified in points. Convert to pixels. */\n get fontSizeInPixels() {\n return this.size * Font.scaleToPxFrom.pt;\n }\n getResolution() {\n return this.resolution;\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.TextFormatter.DEBUG` to `true`. */\nTextFormatter.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { TextFormatter } from './textformatter';\nimport { Category, isStemmableNote, isTabNote } from './typeguard';\nimport { log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Annotation.DEBUG)\n log('Vex.Flow.Annotation', args);\n}\nexport var AnnotationHorizontalJustify;\n(function (AnnotationHorizontalJustify) {\n AnnotationHorizontalJustify[AnnotationHorizontalJustify[\"LEFT\"] = 1] = \"LEFT\";\n AnnotationHorizontalJustify[AnnotationHorizontalJustify[\"CENTER\"] = 2] = \"CENTER\";\n AnnotationHorizontalJustify[AnnotationHorizontalJustify[\"RIGHT\"] = 3] = \"RIGHT\";\n AnnotationHorizontalJustify[AnnotationHorizontalJustify[\"CENTER_STEM\"] = 4] = \"CENTER_STEM\";\n})(AnnotationHorizontalJustify || (AnnotationHorizontalJustify = {}));\nexport var AnnotationVerticalJustify;\n(function (AnnotationVerticalJustify) {\n AnnotationVerticalJustify[AnnotationVerticalJustify[\"TOP\"] = 1] = \"TOP\";\n AnnotationVerticalJustify[AnnotationVerticalJustify[\"CENTER\"] = 2] = \"CENTER\";\n AnnotationVerticalJustify[AnnotationVerticalJustify[\"BOTTOM\"] = 3] = \"BOTTOM\";\n AnnotationVerticalJustify[AnnotationVerticalJustify[\"CENTER_STEM\"] = 4] = \"CENTER_STEM\";\n})(AnnotationVerticalJustify || (AnnotationVerticalJustify = {}));\n/**\n * Annotations are modifiers that can be attached to\n * notes.\n *\n * See `tests/annotation_tests.ts` for usage examples.\n */\nexport class Annotation extends Modifier {\n /**\n * Annotations inherit from `Modifier` and is positioned correctly when\n * in a `ModifierContext`.\n * Create a new `Annotation` with the string `text`.\n */\n constructor(text) {\n super();\n this.text = text;\n this.horizontalJustification = AnnotationHorizontalJustify.CENTER;\n // warning: the default in the constructor is TOP, but in the factory the default is BOTTOM.\n // this is to support legacy application that may expect this.\n this.verticalJustification = AnnotationVerticalJustify.TOP;\n this.resetFont();\n // The default width is calculated from the text.\n this.setWidth(Tables.textWidth(text));\n }\n /** Annotations category string. */\n static get CATEGORY() {\n return Category.Annotation;\n }\n /** Arrange annotations within a `ModifierContext` */\n static format(annotations, state) {\n if (!annotations || annotations.length === 0)\n return false;\n let width = 0;\n for (let i = 0; i < annotations.length; ++i) {\n const annotation = annotations[i];\n const textFormatter = TextFormatter.create(annotation.textFont);\n // Text height is expressed in fractional stave spaces.\n const textLines = (5 + textFormatter.maxHeight) / Tables.STAVE_LINE_DISTANCE;\n let verticalSpaceNeeded = textLines;\n const note = annotation.checkAttachedNote();\n const stave = note.getStave();\n const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP;\n let stemHeight = 0;\n let lines = 5;\n if (isTabNote(note)) {\n if (note.render_options.draw_stem) {\n const stem = note.getStem();\n if (stem) {\n stemHeight = Math.abs(stem.getHeight()) / Tables.STAVE_LINE_DISTANCE;\n }\n }\n else {\n stemHeight = 0;\n }\n }\n else if (isStemmableNote(note)) {\n const stem = note.getStem();\n if (stem && note.getNoteType() === 'n') {\n stemHeight = Math.abs(stem.getHeight()) / Tables.STAVE_LINE_DISTANCE;\n }\n }\n if (stave) {\n lines = stave.getNumLines();\n }\n // Get the text width from the font metrics.\n const textWidth = textFormatter.getWidthForTextInPx(annotation.text);\n width = Math.max(width, textWidth);\n if (annotation.verticalJustification === this.VerticalJustify.TOP) {\n let noteLine = note.getLineNumber(true);\n if (isTabNote(note)) {\n noteLine = lines - (note.leastString() - 0.5);\n }\n if (stemDirection === Stem.UP) {\n noteLine += stemHeight;\n }\n const curTop = noteLine + state.top_text_line + 0.5;\n if (curTop < lines) {\n annotation.setTextLine(lines - noteLine);\n verticalSpaceNeeded += lines - noteLine;\n state.top_text_line = verticalSpaceNeeded;\n }\n else {\n annotation.setTextLine(state.top_text_line);\n state.top_text_line += verticalSpaceNeeded;\n }\n }\n else if (annotation.verticalJustification === this.VerticalJustify.BOTTOM) {\n let noteLine = lines - note.getLineNumber();\n if (isTabNote(note)) {\n noteLine = note.greatestString() - 1;\n }\n if (stemDirection === Stem.DOWN) {\n noteLine += stemHeight;\n }\n const curBottom = noteLine + state.text_line + 1;\n if (curBottom < lines) {\n annotation.setTextLine(lines - curBottom);\n verticalSpaceNeeded += lines - curBottom;\n state.text_line = verticalSpaceNeeded;\n }\n else {\n annotation.setTextLine(state.text_line);\n state.text_line += verticalSpaceNeeded;\n }\n }\n else {\n annotation.setTextLine(state.text_line);\n }\n }\n state.left_shift += width / 2;\n state.right_shift += width / 2;\n return true;\n }\n /**\n * Set vertical position of text (above or below stave).\n * @param just value in `AnnotationVerticalJustify`.\n */\n setVerticalJustification(just) {\n this.verticalJustification = typeof just === 'string' ? Annotation.VerticalJustifyString[just] : just;\n return this;\n }\n /**\n * Get horizontal justification.\n */\n getJustification() {\n return this.horizontalJustification;\n }\n /**\n * Set horizontal justification.\n * @param justification value in `Annotation.Justify`.\n */\n setJustification(just) {\n this.horizontalJustification = typeof just === 'string' ? Annotation.HorizontalJustifyString[just] : just;\n return this;\n }\n /** Render text beside the note. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP;\n const textFormatter = TextFormatter.create(this.textFont);\n const start = note.getModifierStartXY(ModifierPosition.ABOVE, this.index);\n this.setRendered();\n // We're changing context parameters. Save current state.\n ctx.save();\n const classString = Object.keys(this.getAttribute('classes')).join(' ');\n ctx.openGroup(classString, this.getAttribute('id'));\n ctx.setFont(this.textFont);\n const text_width = ctx.measureText(this.text).width;\n const text_height = textFormatter.maxHeight + 2;\n let x;\n let y;\n if (this.horizontalJustification === AnnotationHorizontalJustify.LEFT) {\n x = start.x;\n }\n else if (this.horizontalJustification === AnnotationHorizontalJustify.RIGHT) {\n x = start.x - text_width;\n }\n else if (this.horizontalJustification === AnnotationHorizontalJustify.CENTER) {\n x = start.x - text_width / 2;\n } /* CENTER_STEM */\n else {\n x = note.getStemX() - text_width / 2;\n }\n let stem_ext = {};\n let spacing = 0;\n const has_stem = note.hasStem();\n const stave = note.checkStave();\n // The position of the text varies based on whether or not the note\n // has a stem.\n if (has_stem) {\n stem_ext = note.checkStem().getExtents();\n spacing = stave.getSpacingBetweenLines();\n }\n if (this.verticalJustification === AnnotationVerticalJustify.BOTTOM) {\n // Use the largest (lowest) Y value\n const ys = note.getYs();\n y = ys.reduce((a, b) => (a > b ? a : b));\n y += (this.text_line + 1) * Tables.STAVE_LINE_DISTANCE + text_height;\n if (has_stem && stemDirection === Stem.DOWN) {\n y = Math.max(y, stem_ext.topY + text_height + spacing * this.text_line);\n }\n }\n else if (this.verticalJustification === AnnotationVerticalJustify.CENTER) {\n const yt = note.getYForTopText(this.text_line) - 1;\n const yb = stave.getYForBottomText(this.text_line);\n y = yt + (yb - yt) / 2 + text_height / 2;\n }\n else if (this.verticalJustification === AnnotationVerticalJustify.TOP) {\n y = note.getYs()[0] - (this.text_line + 1) * Tables.STAVE_LINE_DISTANCE;\n if (has_stem && stemDirection === Stem.UP) {\n // If the stem is above the stave already, go with default line width vs. actual\n // since the lines between don't really matter.\n spacing = stem_ext.topY < stave.getTopLineTopY() ? Tables.STAVE_LINE_DISTANCE : spacing;\n y = Math.min(y, stem_ext.topY - spacing * (this.text_line + 1));\n }\n } /* CENTER_STEM */\n else {\n const extents = note.getStemExtents();\n y = extents.topY + (extents.baseY - extents.topY) / 2 + text_height / 2;\n }\n L('Rendering annotation: ', this.text, x, y);\n ctx.fillText(this.text, x, y);\n ctx.closeGroup();\n ctx.restore();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Annotation.DEBUG` to `true`. */\nAnnotation.DEBUG = false;\nAnnotation.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n/** Text annotations can be positioned and justified relative to the note. */\nAnnotation.HorizontalJustify = AnnotationHorizontalJustify;\nAnnotation.HorizontalJustifyString = {\n left: AnnotationHorizontalJustify.LEFT,\n right: AnnotationHorizontalJustify.RIGHT,\n center: AnnotationHorizontalJustify.CENTER,\n centerStem: AnnotationHorizontalJustify.CENTER_STEM,\n};\nAnnotation.VerticalJustify = AnnotationVerticalJustify;\nAnnotation.VerticalJustifyString = {\n above: AnnotationVerticalJustify.TOP,\n top: AnnotationVerticalJustify.TOP,\n below: AnnotationVerticalJustify.BOTTOM,\n bottom: AnnotationVerticalJustify.BOTTOM,\n center: AnnotationVerticalJustify.CENTER,\n centerStem: AnnotationVerticalJustify.CENTER_STEM,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Larry Kuhns.\n// MIT License\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category, isGraceNote, isStaveNote, isStemmableNote, isTabNote } from './typeguard';\nimport { defined, log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Articulation.DEBUG)\n log('Vex.Flow.Articulation', args);\n}\nconst { ABOVE, BELOW } = Modifier.Position;\nfunction roundToNearestHalf(mathFn, value) {\n return mathFn(value / 0.5) * 0.5;\n}\n// This includes both staff and ledger lines\nfunction isWithinLines(line, position) {\n return position === ABOVE ? line <= 5 : line >= 1;\n}\nfunction getRoundingFunction(line, position) {\n if (isWithinLines(line, position)) {\n if (position === ABOVE) {\n return Math.ceil;\n }\n else {\n return Math.floor;\n }\n }\n else {\n return Math.round;\n }\n}\nfunction snapLineToStaff(canSitBetweenLines, line, position, offsetDirection) {\n // Initially, snap to nearest staff line or space\n const snappedLine = roundToNearestHalf(getRoundingFunction(line, position), line);\n const canSnapToStaffSpace = canSitBetweenLines && isWithinLines(snappedLine, position);\n const onStaffLine = snappedLine % 1 === 0;\n if (canSnapToStaffSpace && onStaffLine) {\n const HALF_STAFF_SPACE = 0.5;\n return snappedLine + HALF_STAFF_SPACE * -offsetDirection;\n }\n else {\n return snappedLine;\n }\n}\n// Helper function for checking if a Note object is either a StaveNote or a GraceNote.\nconst isStaveOrGraceNote = (note) => isStaveNote(note) || isGraceNote(note);\nfunction getTopY(note, textLine) {\n const stemDirection = note.getStemDirection();\n const { topY: stemTipY, baseY: stemBaseY } = note.getStemExtents();\n if (isStaveOrGraceNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return stemTipY;\n }\n else {\n return stemBaseY;\n }\n }\n else {\n return Math.min(...note.getYs());\n }\n }\n else if (isTabNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return stemTipY;\n }\n else {\n return note.checkStave().getYForTopText(textLine);\n }\n }\n else {\n return note.checkStave().getYForTopText(textLine);\n }\n }\n else {\n throw new RuntimeError('UnknownCategory', 'Only can get the top and bottom ys of stavenotes and tabnotes');\n }\n}\nfunction getBottomY(note, textLine) {\n const stemDirection = note.getStemDirection();\n const { topY: stemTipY, baseY: stemBaseY } = note.getStemExtents();\n if (isStaveOrGraceNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return stemBaseY;\n }\n else {\n return stemTipY;\n }\n }\n else {\n return Math.max(...note.getYs());\n }\n }\n else if (isTabNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return note.checkStave().getYForBottomText(textLine);\n }\n else {\n return stemTipY;\n }\n }\n else {\n return note.checkStave().getYForBottomText(textLine);\n }\n }\n else {\n throw new RuntimeError('UnknownCategory', 'Only can get the top and bottom ys of stavenotes and tabnotes');\n }\n}\n/**\n * Get the initial offset of the articulation from the y value of the starting position.\n * This is required because the top/bottom text positions already have spacing applied to\n * provide a \"visually pleasant\" default position. However the y values provided from\n * the stavenote's top/bottom do *not* have any pre-applied spacing. This function\n * normalizes this asymmetry.\n * @param note\n * @param position\n * @returns\n */\nfunction getInitialOffset(note, position) {\n const isOnStemTip = (position === ABOVE && note.getStemDirection() === Stem.UP) ||\n (position === BELOW && note.getStemDirection() === Stem.DOWN);\n if (isStaveOrGraceNote(note)) {\n if (note.hasStem() && isOnStemTip) {\n return 0.5;\n }\n else {\n // this amount is larger than the stem-tip offset because we start from\n // the center of the notehead\n return 1;\n }\n }\n else {\n if (note.hasStem() && isOnStemTip) {\n return 1;\n }\n else {\n return 0;\n }\n }\n}\n/**\n * Articulations and Accents are modifiers that can be\n * attached to notes. The complete list of articulations is available in\n * `tables.ts` under `Vex.Flow.articulationCodes`.\n *\n * See `tests/articulation_tests.ts` for usage examples.\n */\nexport class Articulation extends Modifier {\n /**\n * Create a new articulation.\n * @param type entry in `Vex.Flow.articulationCodes` in `tables.ts`\n */\n constructor(type) {\n super();\n this.type = type;\n this.position = BELOW;\n this.render_options = {\n font_scale: 38,\n };\n this.reset();\n }\n /** Articulations category string. */\n static get CATEGORY() {\n return Category.Articulation;\n }\n /**\n * FIXME:\n * Most of the complex formatting logic (ie: snapping to space) is\n * actually done in .render(). But that logic belongs in this method.\n *\n * Unfortunately, this isn't possible because, by this point, stem lengths\n * have not yet been finalized. Finalized stem lengths are required to determine the\n * initial position of any stem-side articulation.\n *\n * This indicates that all objects should have their stave set before being\n * formatted. It can't be an optional if you want accurate vertical positioning.\n * Consistently positioned articulations that play nice with other modifiers\n * won't be possible until we stop relying on render-time formatting.\n *\n * Ideally, when this function has completed, the vertical articulation positions\n * should be ready to render without further adjustment. But the current state\n * is far from this ideal.\n */\n static format(articulations, state) {\n if (!articulations || articulations.length === 0)\n return false;\n const margin = 0.5;\n const getIncrement = (articulation, line, position) => roundToNearestHalf(getRoundingFunction(line, position), defined(articulation.glyph.getMetrics().height) / 10 + margin);\n articulations.forEach((articulation) => {\n const note = articulation.checkAttachedNote();\n let lines = 5;\n const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP;\n let stemHeight = 0;\n // Decide if we need to consider beam direction in placement.\n if (isStemmableNote(note)) {\n const stem = note.getStem();\n if (stem) {\n stemHeight = Math.abs(stem.getHeight()) / Tables.STAVE_LINE_DISTANCE;\n }\n }\n const stave = note.getStave();\n if (stave) {\n lines = stave.getNumLines();\n }\n if (articulation.getPosition() === ABOVE) {\n let noteLine = note.getLineNumber(true);\n if (stemDirection === Stem.UP) {\n noteLine += stemHeight;\n }\n let increment = getIncrement(articulation, state.top_text_line, ABOVE);\n const curTop = noteLine + state.top_text_line + 0.5;\n // If articulation must be above stave, add lines between note and stave top\n if (!articulation.articulation.between_lines && curTop < lines) {\n increment += lines - curTop;\n }\n articulation.setTextLine(state.top_text_line);\n state.top_text_line += increment;\n }\n else if (articulation.getPosition() === BELOW) {\n let noteLine = Math.max(lines - note.getLineNumber(), 0);\n if (stemDirection === Stem.DOWN) {\n noteLine += stemHeight;\n }\n let increment = getIncrement(articulation, state.text_line, BELOW);\n const curBottom = noteLine + state.text_line + 0.5;\n // if articulation must be below stave, add lines from note to stave bottom\n if (!articulation.articulation.between_lines && curBottom < lines) {\n increment += lines - curBottom;\n }\n articulation.setTextLine(state.text_line);\n state.text_line += increment;\n }\n });\n const width = articulations\n .map((articulation) => articulation.getWidth())\n .reduce((maxWidth, articWidth) => Math.max(articWidth, maxWidth));\n state.left_shift += width / 2;\n state.right_shift += width / 2;\n return true;\n }\n static easyScoreHook({ articulations }, note, builder) {\n if (!articulations)\n return;\n const articNameToCode = {\n staccato: 'a.',\n tenuto: 'a-',\n accent: 'a>',\n };\n articulations\n .split(',')\n .map((articString) => articString.trim().split('.'))\n .map(([name, position]) => {\n const artic = { type: articNameToCode[name] };\n if (position)\n artic.position = Modifier.PositionString[position];\n return builder.getFactory().Articulation(artic);\n })\n .map((artic) => note.addModifier(artic, 0));\n }\n reset() {\n this.articulation = Tables.articulationCodes(this.type);\n const articulation = defined(this.articulation, 'ArgumentError', `Articulation not found: ${this.type}`);\n const code = (this.position === ABOVE ? articulation.aboveCode : articulation.belowCode) || articulation.code;\n this.glyph = new Glyph(code !== null && code !== void 0 ? code : '', this.render_options.font_scale);\n this.setWidth(defined(this.glyph.getMetrics().width));\n }\n /** Render articulation in position next to note. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const index = this.checkIndex();\n const { position, glyph, text_line: textLine } = this;\n const canSitBetweenLines = this.articulation.between_lines;\n const stave = note.checkStave();\n const staffSpace = stave.getSpacingBetweenLines();\n const isTab = isTabNote(note);\n // Articulations are centered over/under the note head.\n const { x } = note.getModifierStartXY(position, index);\n const shouldSitOutsideStaff = !canSitBetweenLines || isTab;\n const initialOffset = getInitialOffset(note, position);\n const padding = Tables.currentMusicFont().lookupMetric(`articulation.${glyph.getCode()}.padding`, 0);\n let y = {\n [ABOVE]: () => {\n glyph.setOrigin(0.5, 1);\n const y = getTopY(note, textLine) - (textLine + initialOffset) * staffSpace;\n return shouldSitOutsideStaff ? Math.min(stave.getYForTopText(Articulation.INITIAL_OFFSET), y) : y;\n },\n [BELOW]: () => {\n glyph.setOrigin(0.5, 0);\n const y = getBottomY(note, textLine) + (textLine + initialOffset) * staffSpace;\n return shouldSitOutsideStaff ? Math.max(stave.getYForBottomText(Articulation.INITIAL_OFFSET), y) : y;\n },\n }[position]();\n if (!isTab) {\n const offsetDirection = position === ABOVE ? -1 : +1;\n const noteLine = note.getKeyProps()[index].line;\n const distanceFromNote = (note.getYs()[index] - y) / staffSpace;\n const articLine = distanceFromNote + Number(noteLine);\n const snappedLine = snapLineToStaff(canSitBetweenLines, articLine, position, offsetDirection);\n if (isWithinLines(snappedLine, position))\n glyph.setOrigin(0.5, 0.5);\n y += Math.abs(snappedLine - articLine) * staffSpace * offsetDirection + padding * offsetDirection;\n }\n L(`Rendering articulation at (x: ${x}, y: ${y})`);\n glyph.render(ctx, x, y);\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Articulation.DEBUG` to `true`. */\nArticulation.DEBUG = false;\nArticulation.INITIAL_OFFSET = -0.5;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2021.\n// MIT License\nimport { Category } from './typeguard';\nexport class RenderContext {\n static get CATEGORY() {\n return Category.RenderContext;\n }\n set font(f) {\n this.setFont(f);\n }\n get font() {\n return this.getFont();\n }\n /**\n * This is kept for backwards compatibility with 3.0.9.\n * @deprecated use `setFont(...)` instead since it now supports CSS font shorthand.\n */\n setRawFont(f) {\n this.setFont(f);\n return this;\n }\n}\n/**\n * Draw a tiny dot marker on the specified context. A great debugging aid.\n * @param ctx context\n * @param x dot x coordinate\n * @param y dot y coordinate\n * @param color\n */\nexport function drawDot(ctx, x, y, color = '#F55') {\n ctx.save();\n ctx.setFillStyle(color);\n // draw a circle\n ctx.beginPath();\n ctx.arc(x, y, 3, 0, Math.PI * 2, true);\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Fraction } from './fraction';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\n/**\n * Tickable represents a element that sit on a score and\n * has a duration, i.e., Tickables occupy space in the musical rendering dimension.\n */\nexport class Tickable extends Element {\n constructor() {\n super();\n this._preFormatted = false;\n this._postFormatted = false;\n // These properties represent the duration of\n // this tickable element.\n this.ticks = new Fraction(0, 1); // Fractional value of ticks\n this.intrinsicTicks = 0; // Floating point value of ticks\n this.tickMultiplier = new Fraction(1, 1);\n // Formatter metrics\n this.width = 0;\n this.x_shift = 0; // Shift from tick context\n this.modifiers = [];\n this.tupletStack = [];\n this.align_center = false;\n this.center_x_shift = 0; // Shift from tick context if center aligned\n // This flag tells the formatter to ignore this tickable during\n // formatting and justification. It is set by tickables such as BarNote.\n this.ignore_ticks = false;\n // This is a space for an external formatting class or function to maintain\n // metrics.\n this.formatterMetrics = {\n // The freedom of a tickable is the distance it can move without colliding\n // with neighboring elements. A formatter can set these values during its\n // formatting pass, which a different formatter can then use to fine tune.\n freedom: { left: 0, right: 0 },\n // The simplified rational duration of this tick as a string. It can be\n // used as an index to a map or hashtable.\n duration: '',\n // The number of formatting iterations undergone.\n iterations: 0,\n // The space in pixels allocated by this formatter, along with the mean space\n // for tickables of this duration, and the deviation from the mean.\n space: {\n used: 0,\n mean: 0,\n deviation: 0,\n },\n };\n }\n static get CATEGORY() {\n return Category.Tickable;\n }\n /** Reset the Tickable, this function will be overloaded. */\n reset() {\n return this;\n }\n /** Return the ticks. */\n getTicks() {\n return this.ticks;\n }\n /** Check if it ignores the ticks. */\n shouldIgnoreTicks() {\n return this.ignore_ticks;\n }\n /** Ignore the ticks. */\n setIgnoreTicks(flag) {\n this.ignore_ticks = flag;\n return this;\n }\n /** Set width of note. Used by the formatter for positioning. */\n setWidth(width) {\n this.width = width;\n }\n /** Get width of note. Used by the formatter for positioning. */\n getWidth() {\n if (!this._preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call GetWidth on an unformatted note.\");\n }\n return this.width + (this.modifierContext ? this.modifierContext.getWidth() : 0);\n }\n /** Displace note by `x` pixels. Used by the formatter. */\n setXShift(x) {\n this.x_shift = x;\n return this;\n }\n /** Get the `x` displaced pixels of the note. */\n getXShift() {\n return this.x_shift;\n }\n /** Get `x` position of this tick context. */\n getX() {\n const tickContext = this.checkTickContext(`Can't getX() without a TickContext.`);\n return tickContext.getX() + this.x_shift;\n }\n /** Return the formatterMetrics. */\n getFormatterMetrics() {\n return this.formatterMetrics;\n }\n /** Return the center `x` shift. */\n getCenterXShift() {\n if (this.isCenterAligned()) {\n return this.center_x_shift;\n }\n return 0;\n }\n /** Set the center `x` shift. */\n setCenterXShift(centerXShift) {\n this.center_x_shift = centerXShift;\n return this;\n }\n // Check if tickable is center aligned. */\n isCenterAligned() {\n return this.align_center;\n }\n // Set/unset center alignment. */\n setCenterAlignment(align_center) {\n this.align_center = align_center;\n return this;\n }\n /**\n * Return the associated voice. Every tickable must be associated with a voice.\n * This allows formatters and preFormatter to associate them with the right modifierContexts.\n */\n getVoice() {\n return defined(this.voice, 'NoVoice', 'Tickable has no voice.');\n }\n /** Set the associated voice. */\n setVoice(voice) {\n this.voice = voice;\n }\n /** Get the tuplet. */\n getTuplet() {\n return this.tuplet;\n }\n /** Return the intrinsic ticks. */\n getTupletStack() {\n return this.tupletStack;\n }\n /**\n * Reset the specific Tuplet if this is not provided, all tuplets are reset.\n * Remove any prior tuplets from the tick calculation and\n * reset the intrinsic tick value.\n */\n resetTuplet(tuplet) {\n let noteCount;\n let notesOccupied;\n if (tuplet) {\n const i = this.tupletStack.indexOf(tuplet);\n if (i !== -1) {\n this.tupletStack.splice(i, 1);\n noteCount = tuplet.getNoteCount();\n notesOccupied = tuplet.getNotesOccupied();\n // Revert old multiplier by inverting numerator & denom.:\n this.applyTickMultiplier(noteCount, notesOccupied);\n }\n return this;\n }\n while (this.tupletStack.length) {\n tuplet = this.tupletStack.pop();\n noteCount = tuplet.getNoteCount();\n notesOccupied = tuplet.getNotesOccupied();\n // Revert old multiplier by inverting numerator & denom.:\n this.applyTickMultiplier(noteCount, notesOccupied);\n }\n return this;\n }\n /** Attach to new tuplet. */\n setTuplet(tuplet) {\n if (tuplet) {\n this.tupletStack.push(tuplet);\n const noteCount = tuplet.getNoteCount();\n const notesOccupied = tuplet.getNotesOccupied();\n this.applyTickMultiplier(notesOccupied, noteCount);\n }\n this.tuplet = tuplet;\n return this;\n }\n /**\n * Add self to the provided ModifierContext `mc`.\n * If this tickable has modifiers, set modifierContext.\n * @returns this\n */\n addToModifierContext(mc) {\n this.modifierContext = mc;\n for (let i = 0; i < this.modifiers.length; ++i) {\n this.modifierContext.addMember(this.modifiers[i]);\n }\n this.modifierContext.addMember(this);\n this._preFormatted = false;\n return this;\n }\n /**\n * Optional, if tickable has modifiers, associate a Modifier.\n * @param mod the modifier\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n addModifier(modifier, index = 0) {\n this.modifiers.push(modifier);\n this._preFormatted = false;\n return this;\n }\n /** Get the list of associated modifiers. */\n getModifiers() {\n return this.modifiers;\n }\n /** Set the Tick Context. */\n setTickContext(tc) {\n this.tickContext = tc;\n this._preFormatted = false;\n }\n checkTickContext(message = 'Tickable has no tick context.') {\n return defined(this.tickContext, 'NoTickContext', message);\n }\n /** Preformat the Tickable. */\n preFormat() {\n if (this._preFormatted)\n return;\n this.width = 0;\n if (this.modifierContext) {\n this.modifierContext.preFormat();\n this.width += this.modifierContext.getWidth();\n }\n }\n /** Set preformatted status. */\n set preFormatted(value) {\n this._preFormatted = value;\n }\n get preFormatted() {\n return this._preFormatted;\n }\n /** Postformat the Tickable. */\n postFormat() {\n if (this._postFormatted)\n return this;\n this._postFormatted = true;\n return this;\n }\n /** Set postformatted status. */\n set postFormatted(value) {\n this._postFormatted = value;\n }\n get postFormatted() {\n return this._postFormatted;\n }\n /** Return the intrinsic ticks. */\n getIntrinsicTicks() {\n return this.intrinsicTicks;\n }\n /** Set the intrinsic ticks. */\n setIntrinsicTicks(intrinsicTicks) {\n this.intrinsicTicks = intrinsicTicks;\n this.ticks = this.tickMultiplier.clone().multiply(this.intrinsicTicks);\n }\n /** Get the tick multiplier. */\n getTickMultiplier() {\n return this.tickMultiplier;\n }\n /** Apply a tick multiplier. */\n applyTickMultiplier(numerator, denominator) {\n this.tickMultiplier.multiply(numerator, denominator);\n this.ticks = this.tickMultiplier.clone().multiply(this.intrinsicTicks);\n }\n /** Set the duration. */\n setDuration(duration) {\n const ticks = duration.numerator * (Tables.RESOLUTION / duration.denominator);\n this.ticks = this.tickMultiplier.clone().multiply(ticks);\n this.intrinsicTicks = this.ticks.value();\n }\n getAbsoluteX() {\n const tickContext = this.checkTickContext(`Can't getAbsoluteX() without a TickContext.`);\n return tickContext.getX();\n }\n /** Attach this note to a modifier context. */\n setModifierContext(mc) {\n this.modifierContext = mc;\n return this;\n }\n /** Get `ModifierContext`. */\n getModifierContext() {\n return this.modifierContext;\n }\n /** Check and get `ModifierContext`. */\n checkModifierContext() {\n return defined(this.modifierContext, 'NoModifierContext', 'No modifier context attached to this tickable.');\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from './font';\nimport { drawDot } from './rendercontext';\nimport { Tables } from './tables';\nimport { Tickable } from './tickable';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\n/**\n * Note implements an abstract interface for notes and chords that\n * are rendered on a stave. Notes have some common properties: All of them\n * have a value (e.g., pitch, fret, etc.) and a duration (quarter, half, etc.)\n *\n * Some notes have stems, heads, dots, etc. Most notational elements that\n * surround a note are called *modifiers*, and every note has an associated\n * array of them. All notes also have a rendering context and belong to a stave.\n */\nexport class Note extends Tickable {\n /**\n * Every note is a tickable, i.e., it can be mutated by the `Formatter` class for\n * positioning and layout.\n *\n * @param noteStruct To create a new note you need to provide a `noteStruct`.\n */\n constructor(noteStruct) {\n super();\n if (!noteStruct) {\n throw new RuntimeError('BadArguments', 'Note must have valid initialization data to identify duration and type.');\n }\n /** Parses `noteStruct` and get note properties. */\n const parsedNoteStruct = Note.parseNoteStruct(noteStruct);\n if (!parsedNoteStruct) {\n throw new RuntimeError('BadArguments', `Invalid note initialization object: ${JSON.stringify(noteStruct)}`);\n }\n // Set note properties from parameters.\n this.keys = noteStruct.keys || [];\n // per-pitch properties\n this.keyProps = [];\n this.duration = parsedNoteStruct.duration;\n this.noteType = parsedNoteStruct.type;\n this.customTypes = parsedNoteStruct.customTypes;\n if (noteStruct.duration_override) {\n // Custom duration\n this.setDuration(noteStruct.duration_override);\n }\n else {\n // Default duration\n this.setIntrinsicTicks(parsedNoteStruct.ticks);\n }\n this.modifiers = [];\n // Get the glyph code for this note from the font.\n this.glyph = Tables.getGlyphProps(this.duration, this.noteType);\n this.customGlyphs = this.customTypes.map((t) => Tables.getGlyphProps(this.duration, t));\n // Note to play for audio players.\n this.playNote = undefined;\n // Positioning contexts used by the Formatter.\n this.ignore_ticks = false;\n // Positioning variables\n this.width = 0; // Width in pixels calculated after preFormat\n this.leftDisplacedHeadPx = 0; // Extra room on left for displaced note head\n this.rightDisplacedHeadPx = 0; // Extra room on right for displaced note head\n this.x_shift = 0; // X shift from tick context X\n this.ys = []; // list of y coordinates for each note\n // we need to hold on to these for ties and beams.\n if (noteStruct.align_center) {\n this.setCenterAlignment(noteStruct.align_center);\n }\n // The render surface.\n this.render_options = {\n annotation_spacing: 5,\n glyph_font_scale: 1,\n stroke_px: 1,\n scale: 1,\n font: '',\n y_shift: 0,\n };\n }\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // STATIC MEMBERS\n static get CATEGORY() {\n return Category.Note;\n }\n /** Debug helper. Displays various note metrics for the given note. */\n static plotMetrics(ctx, note, yPos) {\n const metrics = note.getMetrics();\n const xStart = note.getAbsoluteX() - metrics.modLeftPx - metrics.leftDisplacedHeadPx;\n const xPre1 = note.getAbsoluteX() - metrics.leftDisplacedHeadPx;\n const xAbs = note.getAbsoluteX();\n const xPost1 = note.getAbsoluteX() + metrics.notePx;\n const xPost2 = note.getAbsoluteX() + metrics.notePx + metrics.rightDisplacedHeadPx;\n const xEnd = note.getAbsoluteX() + metrics.notePx + metrics.rightDisplacedHeadPx + metrics.modRightPx;\n const xFreedomRight = xEnd + (note.getFormatterMetrics().freedom.right || 0);\n const xWidth = xEnd - xStart;\n ctx.save();\n ctx.setFont(Font.SANS_SERIF, 8);\n ctx.fillText(Math.round(xWidth) + 'px', xStart + note.getXShift(), yPos);\n const y = yPos + 7;\n function stroke(x1, x2, color, yy = y) {\n ctx.beginPath();\n ctx.setStrokeStyle(color);\n ctx.setFillStyle(color);\n ctx.setLineWidth(3);\n ctx.moveTo(x1 + note.getXShift(), yy);\n ctx.lineTo(x2 + note.getXShift(), yy);\n ctx.stroke();\n }\n stroke(xStart, xPre1, 'red');\n stroke(xPre1, xAbs, '#999');\n stroke(xAbs, xPost1, 'green');\n stroke(xPost1, xPost2, '#999');\n stroke(xPost2, xEnd, 'red');\n stroke(xEnd, xFreedomRight, '#DD0');\n stroke(xStart - note.getXShift(), xStart, '#BBB'); // Shift\n drawDot(ctx, xAbs + note.getXShift(), y, 'blue');\n const formatterMetrics = note.getFormatterMetrics();\n if (formatterMetrics.iterations > 0) {\n const spaceDeviation = formatterMetrics.space.deviation;\n const prefix = spaceDeviation >= 0 ? '+' : '';\n ctx.setFillStyle('red');\n ctx.fillText(prefix + Math.round(spaceDeviation), xAbs + note.getXShift(), yPos - 10);\n }\n ctx.restore();\n }\n static parseDuration(durationString) {\n if (!durationString) {\n return undefined;\n }\n const regexp = /(\\d*\\/?\\d+|[a-z])(d*)([nrhms]|$)/;\n const result = regexp.exec(durationString);\n if (!result) {\n return undefined;\n }\n const duration = result[1];\n const dots = result[2].length;\n const type = result[3] || 'n';\n return { duration, dots, type };\n }\n static parseNoteStruct(noteStruct) {\n // Preserve backwards-compatibility\n const durationProps = Note.parseDuration(noteStruct.duration);\n if (!durationProps) {\n return undefined;\n }\n // If specified type is invalid, return undefined.\n let type = noteStruct.type;\n if (type && !Tables.validTypes[type]) {\n return undefined;\n }\n // If no type specified, check duration or custom types\n const customTypes = [];\n if (!type) {\n type = durationProps.type || 'n';\n // If we have keys, try and check if we've got a custom glyph\n if (noteStruct.keys !== undefined) {\n noteStruct.keys.forEach((k, i) => {\n const result = k.split('/');\n // We have a custom glyph specified after the note eg. /X2\n customTypes[i] = (result && result.length === 3 ? result[2] : type);\n });\n }\n }\n // Calculate the tick duration of the note\n let ticks = Tables.durationToTicks(durationProps.duration);\n if (!ticks) {\n return undefined;\n }\n // Are there any dots?\n const dots = noteStruct.dots ? noteStruct.dots : durationProps.dots;\n if (typeof dots !== 'number') {\n return undefined;\n }\n // Add ticks as necessary depending on the numbr of dots\n let currentTicks = ticks;\n for (let i = 0; i < dots; i++) {\n if (currentTicks <= 1)\n return undefined;\n currentTicks = currentTicks / 2;\n ticks += currentTicks;\n }\n return {\n duration: durationProps.duration,\n type,\n customTypes,\n dots,\n ticks,\n };\n }\n /**\n * Get the play note, which is arbitrary data that can be used by an\n * audio player.\n */\n getPlayNote() {\n return this.playNote;\n }\n /**\n * Set the play note, which is arbitrary data that can be used by an\n * audio player.\n */\n setPlayNote(note) {\n this.playNote = note;\n return this;\n }\n /**\n * @returns true if this note is a type of rest.\n *\n * Rests don't have pitches, but take up space in the score.\n * Subclasses should override this default implementation.\n */\n isRest() {\n return false;\n }\n /** Add stroke. */\n addStroke(index, stroke) {\n stroke.setNote(this);\n stroke.setIndex(index);\n this.modifiers.push(stroke);\n this.preFormatted = false;\n return this;\n }\n /** Get the target stave. */\n getStave() {\n return this.stave;\n }\n /** Check and get the target stave. */\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n /** Set the target stave. */\n setStave(stave) {\n this.stave = stave;\n this.setYs([stave.getYForLine(0)]); // Update Y values if the stave is changed.\n this.setContext(this.stave.getContext());\n return this;\n }\n /** Get spacing to the left of the notes. */\n getLeftDisplacedHeadPx() {\n return this.leftDisplacedHeadPx;\n }\n /** Get spacing to the right of the notes. */\n getRightDisplacedHeadPx() {\n return this.rightDisplacedHeadPx;\n }\n /** Set spacing to the left of the notes. */\n setLeftDisplacedHeadPx(x) {\n this.leftDisplacedHeadPx = x;\n return this;\n }\n /** Set spacing to the right of the notes. */\n setRightDisplacedHeadPx(x) {\n this.rightDisplacedHeadPx = x;\n return this;\n }\n /** True if this note has no duration (e.g., bar notes, spacers, etc.). */\n shouldIgnoreTicks() {\n return this.ignore_ticks;\n }\n /** Get the stave line number for the note. */\n // eslint-disable-next-line\n getLineNumber(isTopNote) {\n return 0;\n }\n /** Get the stave line number for rest. */\n getLineForRest() {\n return 0;\n }\n /** Get the glyph associated with this note. */\n // eslint-disable-next-line\n getGlyph() {\n return this.glyph;\n }\n /** Get the glyph width. */\n getGlyphWidth() {\n // TODO: FIXME (multiple potential values for this.glyph)\n if (this.glyph) {\n if (this.glyph.getMetrics) {\n return this.glyph.getMetrics().width;\n }\n else if (this.glyph.getWidth) {\n return this.glyph.getWidth(this.render_options.glyph_font_scale);\n }\n }\n return 0;\n }\n /**\n * Set Y positions for this note. Each Y value is associated with\n * an individual pitch/key within the note/chord.\n */\n setYs(ys) {\n this.ys = ys;\n return this;\n }\n /**\n * Get Y positions for this note. Each Y value is associated with\n * an individual pitch/key within the note/chord.\n */\n getYs() {\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', 'No Y-values calculated for this note.');\n }\n return this.ys;\n }\n /**\n * Get the Y position of the space above the stave onto which text can\n * be rendered.\n */\n getYForTopText(text_line) {\n return this.checkStave().getYForTopText(text_line);\n }\n /** Return the voice that this note belongs in. */\n getVoice() {\n if (!this.voice)\n throw new RuntimeError('NoVoice', 'Note has no voice.');\n return this.voice;\n }\n /** Attach this note to `voice`. */\n setVoice(voice) {\n this.voice = voice;\n this.preFormatted = false;\n return this;\n }\n /** Get the `TickContext` for this note. */\n getTickContext() {\n return this.checkTickContext();\n }\n /** Set the `TickContext` for this note. */\n setTickContext(tc) {\n this.tickContext = tc;\n this.preFormatted = false;\n return this;\n }\n /** Accessor to duration. */\n getDuration() {\n return this.duration;\n }\n /** Accessor to isDotted. */\n isDotted() {\n return this.getModifiersByType('Dot').length > 0;\n }\n /** Accessor to hasStem. */\n hasStem() {\n return false;\n }\n /** Accessor to note type. */\n getNoteType() {\n return this.noteType;\n }\n /** Get the beam. */\n getBeam() {\n return this.beam;\n }\n /** Check and get the beam. */\n checkBeam() {\n return defined(this.beam, 'NoBeam', 'No beam attached to instance');\n }\n /** Check it has a beam. */\n hasBeam() {\n return this.beam != undefined;\n }\n /** Set the beam. */\n setBeam(beam) {\n this.beam = beam;\n return this;\n }\n /**\n * Attach a modifier to this note.\n * @param modifier the Modifier to add.\n * @param index of the key to modify.\n * @returns this\n */\n addModifier(modifier, index = 0) {\n const signature = 'Note.addModifier(modifier: Modifier, index: number=0)';\n // Backwards compatibility with 3.0.9.\n if (typeof index === 'string') {\n index = parseInt(index);\n // eslint-disable-next-line\n console.warn(signature + ' expected a number for `index`, but received a string.');\n }\n // Some versions of VexFlow had the two parameters reversed.\n // Check here and throw an error if the argument types are not correct.\n if (typeof modifier !== 'object' || typeof index !== 'number') {\n throw new RuntimeError('WrongParams', 'Incorrect call signature. Use ' + signature + ' instead.');\n }\n modifier.setNote(this);\n modifier.setIndex(index);\n super.addModifier(modifier);\n return this;\n }\n // Get all modifiers of a specific type in the `ModifierContext`\n getModifiersByType(type) {\n return this.checkModifierContext().getMembers(type);\n }\n /** Get the coordinates for where modifiers begin. */\n // eslint-disable-next-line\n getModifierStartXY(position, index, options) {\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call GetModifierStartXY on an unformatted note\");\n }\n return {\n x: this.getAbsoluteX(),\n y: this.ys[0],\n };\n }\n getRightParenthesisPx(index) {\n const props = this.getKeyProps()[index];\n return props.displaced ? this.getRightDisplacedHeadPx() : 0;\n }\n getLeftParenthesisPx(index) {\n const props = this.getKeyProps()[index];\n return props.displaced ? this.getLeftDisplacedHeadPx() : 0;\n }\n getFirstDotPx() {\n let px = this.getRightDisplacedHeadPx();\n if (this.checkModifierContext().getMembers('Parenthesis').length !== 0)\n px += Tables.currentMusicFont().lookupMetric('parenthesis.default.width');\n return px;\n }\n /** Get the metrics for this note. */\n getMetrics() {\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call getMetrics on an unformatted note.\");\n }\n const modLeftPx = this.modifierContext ? this.modifierContext.getState().left_shift : 0;\n const modRightPx = this.modifierContext ? this.modifierContext.getState().right_shift : 0;\n const width = this.getWidth();\n const glyphWidth = this.getGlyphWidth();\n const notePx = width -\n modLeftPx - // subtract left modifiers\n modRightPx - // subtract right modifiers\n this.leftDisplacedHeadPx - // subtract left displaced head\n this.rightDisplacedHeadPx; // subtract right displaced head\n // NOTE: If you change this, remember to update MockTickable.getMetrics() in the tests/ directory.\n return {\n width,\n glyphWidth,\n notePx,\n // Modifier spacing.\n modLeftPx,\n modRightPx,\n // Displaced note head on left or right.\n leftDisplacedHeadPx: this.leftDisplacedHeadPx,\n rightDisplacedHeadPx: this.rightDisplacedHeadPx,\n glyphPx: 0,\n };\n }\n /**\n * Get the absolute `X` position of this note's tick context. This\n * excludes x_shift, so you'll need to factor it in if you're\n * looking for the post-formatted x-position.\n */\n getAbsoluteX() {\n const tickContext = this.checkTickContext(`Can't getAbsoluteX() without a TickContext.`);\n // Position note to left edge of tick context.\n let x = tickContext.getX();\n if (this.stave) {\n x += this.stave.getNoteStartX() + Tables.currentMusicFont().lookupMetric('stave.padding');\n }\n if (this.isCenterAligned()) {\n x += this.getCenterXShift();\n }\n return x;\n }\n /** Get the direction of the stem. */\n getStemDirection() {\n throw new RuntimeError('NoStem', 'No stem attached to this note.');\n }\n /** Get the top and bottom `y` values of the stem. */\n getStemExtents() {\n throw new RuntimeError('NoStem', 'No stem attached to this note.');\n }\n /** Get the `x` coordinate to the right of the note. */\n getTieRightX() {\n let tieStartX = this.getAbsoluteX();\n const note_glyph_width = this.glyph.getWidth();\n tieStartX += note_glyph_width / 2;\n tieStartX += -this.width / 2 + this.width + 2;\n return tieStartX;\n }\n /** Get the `x` coordinate to the left of the note. */\n getTieLeftX() {\n let tieEndX = this.getAbsoluteX();\n const note_glyph_width = this.glyph.getWidth();\n tieEndX += note_glyph_width / 2;\n tieEndX -= this.width / 2 + 2;\n return tieEndX;\n }\n // Get the pitches in the note\n getKeys() {\n return this.keys;\n }\n // Get the properties for all the keys in the note\n getKeyProps() {\n return this.keyProps;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// A base class for stave modifiers (e.g. clefs, key signatures)\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { defined } from './util';\nexport var StaveModifierPosition;\n(function (StaveModifierPosition) {\n StaveModifierPosition[StaveModifierPosition[\"CENTER\"] = 0] = \"CENTER\";\n StaveModifierPosition[StaveModifierPosition[\"LEFT\"] = 1] = \"LEFT\";\n StaveModifierPosition[StaveModifierPosition[\"RIGHT\"] = 2] = \"RIGHT\";\n StaveModifierPosition[StaveModifierPosition[\"ABOVE\"] = 3] = \"ABOVE\";\n StaveModifierPosition[StaveModifierPosition[\"BELOW\"] = 4] = \"BELOW\";\n StaveModifierPosition[StaveModifierPosition[\"BEGIN\"] = 5] = \"BEGIN\";\n StaveModifierPosition[StaveModifierPosition[\"END\"] = 6] = \"END\";\n})(StaveModifierPosition || (StaveModifierPosition = {}));\nexport class StaveModifier extends Element {\n constructor() {\n super();\n this.width = 0;\n this.x = 0;\n this.padding = 10;\n this.position = StaveModifierPosition.ABOVE;\n }\n static get CATEGORY() {\n return Category.StaveModifier;\n }\n static get Position() {\n return StaveModifierPosition;\n }\n getPosition() {\n return this.position;\n }\n setPosition(position) {\n this.position = position;\n return this;\n }\n getStave() {\n return this.stave;\n }\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n setStave(stave) {\n this.stave = stave;\n return this;\n }\n getWidth() {\n return this.width;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n getX() {\n return this.x;\n }\n setX(x) {\n this.x = x;\n return this;\n }\n placeGlyphOnLine(glyph, stave, line, customShift = 0) {\n glyph.setYShift(stave.getYForLine(line !== null && line !== void 0 ? line : 0) - stave.getYForGlyphs() + customShift);\n }\n getPadding(index) {\n return index !== undefined && index < 2 ? 0 : this.padding;\n }\n setPadding(padding) {\n this.padding = padding;\n return this;\n }\n setLayoutMetrics(layoutMetrics) {\n this.layoutMetrics = layoutMetrics;\n return this;\n }\n getLayoutMetrics() {\n return this.layoutMetrics;\n }\n // eslint-disable-next-line\n draw(...args) {\n // DO NOTHING.\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// Author Larry Kuhns 2011\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nexport var BarlineType;\n(function (BarlineType) {\n BarlineType[BarlineType[\"SINGLE\"] = 1] = \"SINGLE\";\n BarlineType[BarlineType[\"DOUBLE\"] = 2] = \"DOUBLE\";\n BarlineType[BarlineType[\"END\"] = 3] = \"END\";\n BarlineType[BarlineType[\"REPEAT_BEGIN\"] = 4] = \"REPEAT_BEGIN\";\n BarlineType[BarlineType[\"REPEAT_END\"] = 5] = \"REPEAT_END\";\n BarlineType[BarlineType[\"REPEAT_BOTH\"] = 6] = \"REPEAT_BOTH\";\n BarlineType[BarlineType[\"NONE\"] = 7] = \"NONE\";\n})(BarlineType || (BarlineType = {}));\nexport class Barline extends StaveModifier {\n constructor(type) {\n super();\n this.thickness = Tables.STAVE_LINE_THICKNESS;\n const TYPE = BarlineType;\n this.widths = {};\n this.widths[TYPE.SINGLE] = 5;\n this.widths[TYPE.DOUBLE] = 5;\n this.widths[TYPE.END] = 5;\n this.widths[TYPE.REPEAT_BEGIN] = 5;\n this.widths[TYPE.REPEAT_END] = 5;\n this.widths[TYPE.REPEAT_BOTH] = 5;\n this.widths[TYPE.NONE] = 5;\n this.paddings = {};\n this.paddings[TYPE.SINGLE] = 0;\n this.paddings[TYPE.DOUBLE] = 0;\n this.paddings[TYPE.END] = 0;\n this.paddings[TYPE.REPEAT_BEGIN] = 15;\n this.paddings[TYPE.REPEAT_END] = 15;\n this.paddings[TYPE.REPEAT_BOTH] = 15;\n this.paddings[TYPE.NONE] = 0;\n this.layoutMetricsMap = {};\n this.layoutMetricsMap[TYPE.SINGLE] = {\n xMin: 0,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.DOUBLE] = {\n xMin: -3,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.END] = {\n xMin: -5,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.REPEAT_END] = {\n xMin: -10,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.REPEAT_BEGIN] = {\n xMin: -2,\n xMax: 10,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.REPEAT_BOTH] = {\n xMin: -10,\n xMax: 10,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.NONE] = {\n xMin: 0,\n xMax: 0,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.setPosition(StaveModifierPosition.BEGIN);\n this.setType(type);\n }\n static get CATEGORY() {\n return Category.Barline;\n }\n static get type() {\n return BarlineType;\n }\n static get typeString() {\n return {\n single: BarlineType.SINGLE,\n double: BarlineType.DOUBLE,\n end: BarlineType.END,\n repeatBegin: BarlineType.REPEAT_BEGIN,\n repeatEnd: BarlineType.REPEAT_END,\n repeatBoth: BarlineType.REPEAT_BOTH,\n none: BarlineType.NONE,\n };\n }\n getType() {\n return this.type;\n }\n setType(type) {\n this.type = typeof type === 'string' ? Barline.typeString[type] : type;\n this.setWidth(this.widths[this.type]);\n this.setPadding(this.paddings[this.type]);\n this.setLayoutMetrics(this.layoutMetricsMap[this.type]);\n return this;\n }\n // Draw barlines\n draw(stave) {\n stave.checkContext();\n this.setRendered();\n switch (this.type) {\n case BarlineType.SINGLE:\n this.drawVerticalBar(stave, this.x, false);\n break;\n case BarlineType.DOUBLE:\n this.drawVerticalBar(stave, this.x, true);\n break;\n case BarlineType.END:\n this.drawVerticalEndBar(stave, this.x);\n break;\n case BarlineType.REPEAT_BEGIN:\n // If the barline is shifted over (in front of clef/time/key)\n // Draw vertical bar at the beginning.\n this.drawRepeatBar(stave, this.x, true);\n if (stave.getX() !== this.x) {\n this.drawVerticalBar(stave, stave.getX());\n }\n break;\n case BarlineType.REPEAT_END:\n this.drawRepeatBar(stave, this.x, false);\n break;\n case BarlineType.REPEAT_BOTH:\n this.drawRepeatBar(stave, this.x, false);\n this.drawRepeatBar(stave, this.x, true);\n break;\n default:\n // Default is NONE, so nothing to draw\n break;\n }\n }\n drawVerticalBar(stave, x, double_bar) {\n const staveCtx = stave.checkContext();\n const topY = stave.getTopLineTopY();\n const botY = stave.getBottomLineBottomY();\n if (double_bar) {\n staveCtx.fillRect(x - 3, topY, 1, botY - topY);\n }\n staveCtx.fillRect(x, topY, 1, botY - topY);\n }\n drawVerticalEndBar(stave, x) {\n const staveCtx = stave.checkContext();\n const topY = stave.getTopLineTopY();\n const botY = stave.getBottomLineBottomY();\n staveCtx.fillRect(x - 5, topY, 1, botY - topY);\n staveCtx.fillRect(x - 2, topY, 3, botY - topY);\n }\n drawRepeatBar(stave, x, begin) {\n const staveCtx = stave.checkContext();\n const topY = stave.getTopLineTopY();\n const botY = stave.getBottomLineBottomY();\n let x_shift = 3;\n if (!begin) {\n x_shift = -5;\n }\n staveCtx.fillRect(x + x_shift, topY, 1, botY - topY);\n staveCtx.fillRect(x - 2, topY, 3, botY - topY);\n const dot_radius = 2;\n // Shift dots left or right\n if (begin) {\n x_shift += 4;\n }\n else {\n x_shift -= 4;\n }\n const dot_x = x + x_shift + dot_radius / 2;\n // calculate the y offset based on number of stave lines\n let y_offset = (stave.getNumLines() - 1) * stave.getSpacingBetweenLines();\n y_offset = y_offset / 2 - stave.getSpacingBetweenLines() / 2;\n let dot_y = topY + y_offset + dot_radius / 2;\n // draw the top repeat dot\n staveCtx.beginPath();\n staveCtx.arc(dot_x, dot_y, dot_radius, 0, Math.PI * 2, false);\n staveCtx.fill();\n // draw the bottom repeat dot\n dot_y += stave.getSpacingBetweenLines();\n staveCtx.beginPath();\n staveCtx.arc(dot_x, dot_y, dot_radius, 0, Math.PI * 2, false);\n staveCtx.fill();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// Author: Aaron (@AaronDavidNewman)\n//\n// This implements chord symbols above/below a chord.\n// Chord symbols are modifiers that can be attached to notes.\n// They can contain multiple 'blocks' which represent text or\n// glyphs with various positioning options.\n//\n// See `tests/chordsymbol_tests.ts` for usage examples.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Tables } from './tables';\nimport { TextFormatter } from './textformatter';\nimport { Category } from './typeguard';\nimport { log } from './util';\n// To enable logging for this class. Set `Vex.Flow.ChordSymbol.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (ChordSymbol.DEBUG)\n log('Vex.Flow.ChordSymbol', args);\n}\nexport var ChordSymbolHorizontalJustify;\n(function (ChordSymbolHorizontalJustify) {\n ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify[\"LEFT\"] = 1] = \"LEFT\";\n ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify[\"CENTER\"] = 2] = \"CENTER\";\n ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify[\"RIGHT\"] = 3] = \"RIGHT\";\n ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify[\"CENTER_STEM\"] = 4] = \"CENTER_STEM\";\n})(ChordSymbolHorizontalJustify || (ChordSymbolHorizontalJustify = {}));\nexport var ChordSymbolVerticalJustify;\n(function (ChordSymbolVerticalJustify) {\n ChordSymbolVerticalJustify[ChordSymbolVerticalJustify[\"TOP\"] = 1] = \"TOP\";\n ChordSymbolVerticalJustify[ChordSymbolVerticalJustify[\"BOTTOM\"] = 2] = \"BOTTOM\";\n})(ChordSymbolVerticalJustify || (ChordSymbolVerticalJustify = {}));\nexport var SymbolTypes;\n(function (SymbolTypes) {\n SymbolTypes[SymbolTypes[\"GLYPH\"] = 1] = \"GLYPH\";\n SymbolTypes[SymbolTypes[\"TEXT\"] = 2] = \"TEXT\";\n SymbolTypes[SymbolTypes[\"LINE\"] = 3] = \"LINE\";\n})(SymbolTypes || (SymbolTypes = {}));\nexport var SymbolModifiers;\n(function (SymbolModifiers) {\n SymbolModifiers[SymbolModifiers[\"NONE\"] = 1] = \"NONE\";\n SymbolModifiers[SymbolModifiers[\"SUBSCRIPT\"] = 2] = \"SUBSCRIPT\";\n SymbolModifiers[SymbolModifiers[\"SUPERSCRIPT\"] = 3] = \"SUPERSCRIPT\";\n})(SymbolModifiers || (SymbolModifiers = {}));\n/**\n * ChordSymbol is a modifier that creates a chord symbol above/below a chord.\n * As a modifier, it is attached to an existing note.\n */\nexport class ChordSymbol extends Modifier {\n constructor() {\n super();\n this.symbolBlocks = [];\n this.horizontal = ChordSymbolHorizontalJustify.LEFT;\n this.vertical = ChordSymbolVerticalJustify.TOP;\n this.useKerning = true;\n this.reportWidth = true;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.ChordSymbol;\n }\n static get superSubRatio() {\n return ChordSymbol.metrics.global.superSubRatio;\n }\n /** Currently unused: Globally turn off text formatting, if the built-in formatting does not work for your font. */\n static set NO_TEXT_FORMAT(val) {\n ChordSymbol.noFormat = val;\n }\n static get NO_TEXT_FORMAT() {\n return ChordSymbol.noFormat;\n }\n // eslint-disable-next-line\n static getMetricForGlyph(glyphCode) {\n if (ChordSymbol.metrics[glyphCode]) {\n return ChordSymbol.metrics[glyphCode];\n }\n return undefined;\n }\n static get engravingFontResolution() {\n return Tables.currentMusicFont().getResolution();\n }\n static get spacingBetweenBlocks() {\n return ChordSymbol.metrics.global.spacing / ChordSymbol.engravingFontResolution;\n }\n static getWidthForGlyph(glyph) {\n const metric = ChordSymbol.getMetricForGlyph(glyph.code);\n if (!metric) {\n return 0.65; // probably should do something here.\n }\n return metric.advanceWidth / ChordSymbol.engravingFontResolution;\n }\n static getYShiftForGlyph(glyph) {\n const metric = ChordSymbol.getMetricForGlyph(glyph.code);\n if (!metric) {\n return 0;\n }\n return metric.yOffset / ChordSymbol.engravingFontResolution;\n }\n static getXShiftForGlyph(glyph) {\n const metric = ChordSymbol.getMetricForGlyph(glyph.code);\n if (!metric) {\n return 0;\n }\n return (-1 * metric.leftSideBearing) / ChordSymbol.engravingFontResolution;\n }\n static get superscriptOffset() {\n return ChordSymbol.metrics.global.superscriptOffset / ChordSymbol.engravingFontResolution;\n }\n static get subscriptOffset() {\n return ChordSymbol.metrics.global.subscriptOffset / ChordSymbol.engravingFontResolution;\n }\n static get kerningOffset() {\n return ChordSymbol.metrics.global.kerningOffset / ChordSymbol.engravingFontResolution;\n }\n // eslint-disable-next-line\n static get metrics() {\n return Tables.currentMusicFont().getMetrics().glyphs.chordSymbol;\n }\n static get lowerKerningText() {\n // For example, see: `bravura_metrics.ts`\n // BravuraMetrics.glyphs.chordSymbol.global.lowerKerningText, which returns an array of letters.\n // ['D', 'F', 'P', 'T', 'V', 'Y']\n return ChordSymbol.metrics.global.lowerKerningText;\n }\n static get upperKerningText() {\n return ChordSymbol.metrics.global.upperKerningText;\n }\n static isSuperscript(block) {\n return block.symbolModifier !== undefined && block.symbolModifier === SymbolModifiers.SUPERSCRIPT;\n }\n static isSubscript(block) {\n return block.symbolModifier !== undefined && block.symbolModifier === SymbolModifiers.SUBSCRIPT;\n }\n /**\n * Estimate the width of the whole chord symbol, based on the sum of the widths of the individual blocks.\n * Estimate how many lines above/below the staff we need.\n */\n static format(symbols, state) {\n var _a;\n if (!symbols || symbols.length === 0)\n return false;\n let width = 0;\n let nonSuperWidth = 0;\n const reportedWidths = [];\n for (const symbol of symbols) {\n const fontSize = Font.convertSizeToPointValue((_a = symbol.textFont) === null || _a === void 0 ? void 0 : _a.size);\n const fontAdj = Font.scaleSize(fontSize, 0.05);\n const glyphAdj = fontAdj * 2;\n let lineSpaces = 1;\n let vAlign = false;\n for (let j = 0; j < symbol.symbolBlocks.length; ++j) {\n const block = symbol.symbolBlocks[j];\n const sup = ChordSymbol.isSuperscript(block);\n const sub = ChordSymbol.isSubscript(block);\n const superSubScale = sup || sub ? ChordSymbol.superSubRatio : 1;\n const adj = block.symbolType === SymbolTypes.GLYPH ? glyphAdj * superSubScale : fontAdj * superSubScale;\n // If there are super/subscripts, they extend beyond the line so\n // assume they take up 2 lines\n if (sup || sub) {\n lineSpaces = 2;\n }\n // If there is a symbol-specific offset, add it but consider font\n // size since font and glyphs will be interspersed.\n const fontSize = symbol.textFormatter.fontSizeInPixels;\n const superSubFontSize = fontSize * superSubScale;\n if (block.symbolType === SymbolTypes.GLYPH && block.glyph !== undefined) {\n block.width = ChordSymbol.getWidthForGlyph(block.glyph) * superSubFontSize;\n block.yShift += ChordSymbol.getYShiftForGlyph(block.glyph) * superSubFontSize;\n block.xShift += ChordSymbol.getXShiftForGlyph(block.glyph) * superSubFontSize;\n block.glyph.scale = block.glyph.scale * adj;\n }\n else if (block.symbolType === SymbolTypes.TEXT) {\n block.width = block.width * superSubFontSize;\n block.yShift += symbol.getYOffsetForText(block.text) * adj;\n }\n if (block.symbolType === SymbolTypes.GLYPH &&\n block.glyph !== undefined &&\n block.glyph.code === ChordSymbol.glyphs.over.code) {\n lineSpaces = 2;\n }\n block.width += ChordSymbol.spacingBetweenBlocks * fontSize * superSubScale;\n // If a subscript immediately follows a superscript block, try to\n // overlay them.\n if (sup && j > 0) {\n const prev = symbol.symbolBlocks[j - 1];\n if (!ChordSymbol.isSuperscript(prev)) {\n nonSuperWidth = width;\n }\n }\n if (sub && nonSuperWidth > 0) {\n vAlign = true;\n // slide the symbol over so it lines up with superscript\n block.xShift = block.xShift + (nonSuperWidth - width);\n width = nonSuperWidth;\n nonSuperWidth = 0;\n // If we have vertically lined up, turn kerning off.\n symbol.setEnableKerning(false);\n }\n if (!sup && !sub) {\n nonSuperWidth = 0;\n }\n block.vAlign = vAlign;\n width += block.width;\n }\n // make kerning adjustments after computing super/subscripts\n symbol.updateKerningAdjustments();\n symbol.updateOverBarAdjustments();\n if (symbol.getVertical() === ChordSymbolVerticalJustify.TOP) {\n symbol.setTextLine(state.top_text_line);\n state.top_text_line += lineSpaces;\n }\n else {\n symbol.setTextLine(state.text_line + 1);\n state.text_line += lineSpaces + 1;\n }\n if (symbol.getReportWidth()) {\n reportedWidths.push(width);\n }\n else {\n reportedWidths.push(0);\n }\n }\n width = reportedWidths.reduce((a, b) => a + b, 0);\n state.left_shift += width / 2;\n state.right_shift += width / 2;\n return true;\n }\n /**\n * Default text font.\n * Choose a font family that works well with the current music engraving font.\n * @override `Element.TEXT_FONT`.\n */\n static get TEXT_FONT() {\n let family = 'Roboto Slab, Times, serif';\n if (Tables.currentMusicFont().getName() === 'Petaluma') {\n // Fixes Issue #1180\n family = 'PetalumaScript, Arial, sans-serif';\n }\n return {\n family,\n size: 12,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n };\n }\n /**\n * The offset is specified in `em`. Scale this value by the font size in pixels.\n */\n get superscriptOffset() {\n return ChordSymbol.superscriptOffset * this.textFormatter.fontSizeInPixels;\n }\n get subscriptOffset() {\n return ChordSymbol.subscriptOffset * this.textFormatter.fontSizeInPixels;\n }\n setReportWidth(value) {\n this.reportWidth = value;\n return this;\n }\n getReportWidth() {\n return this.reportWidth;\n }\n updateOverBarAdjustments() {\n const barIndex = this.symbolBlocks.findIndex(({ symbolType, glyph }) => symbolType === SymbolTypes.GLYPH && glyph !== undefined && glyph.code === 'csymDiagonalArrangementSlash');\n if (barIndex < 0) {\n return;\n }\n const bar = this.symbolBlocks[barIndex];\n const xoff = bar.width / 4;\n const yoff = 0.25 * this.textFormatter.fontSizeInPixels;\n let symIndex = 0;\n for (symIndex === 0; symIndex < barIndex; ++symIndex) {\n const symbol = this.symbolBlocks[symIndex];\n symbol.xShift = symbol.xShift + xoff;\n symbol.yShift = symbol.yShift - yoff;\n }\n for (symIndex = barIndex + 1; symIndex < this.symbolBlocks.length; ++symIndex) {\n const symbol = this.symbolBlocks[symIndex];\n symbol.xShift = symbol.xShift - xoff;\n symbol.yShift = symbol.yShift + yoff;\n }\n }\n updateKerningAdjustments() {\n let accum = 0;\n for (let j = 0; j < this.symbolBlocks.length; ++j) {\n const symbol = this.symbolBlocks[j];\n accum += this.getKerningAdjustment(j);\n symbol.xShift += accum;\n }\n }\n /** Do some basic kerning so that letter chords like 'A' don't have the extensions hanging off to the right. */\n getKerningAdjustment(j) {\n if (!this.useKerning) {\n return 0;\n }\n const currSymbol = this.symbolBlocks[j];\n const prevSymbol = j > 0 ? this.symbolBlocks[j - 1] : undefined;\n let adjustment = 0;\n // Move things into the '/' over bar\n if (currSymbol.symbolType === SymbolTypes.GLYPH &&\n currSymbol.glyph !== undefined &&\n currSymbol.glyph.code === ChordSymbol.glyphs.over.code) {\n adjustment += currSymbol.glyph.metrics.x_shift;\n }\n if (prevSymbol !== undefined &&\n prevSymbol.symbolType === SymbolTypes.GLYPH &&\n prevSymbol.glyph !== undefined &&\n prevSymbol.glyph.code === ChordSymbol.glyphs.over.code) {\n adjustment += prevSymbol.glyph.metrics.x_shift;\n }\n // For superscripts that follow a letter without much top part, move it to the left slightly\n let preKernUpper = false;\n let preKernLower = false;\n if (prevSymbol !== undefined && prevSymbol.symbolType === SymbolTypes.TEXT) {\n preKernUpper = ChordSymbol.upperKerningText.some((xx) => xx === prevSymbol.text[prevSymbol.text.length - 1]);\n preKernLower = ChordSymbol.lowerKerningText.some((xx) => xx === prevSymbol.text[prevSymbol.text.length - 1]);\n }\n const kerningOffsetPixels = ChordSymbol.kerningOffset * this.textFormatter.fontSizeInPixels;\n // TODO: adjust kern for font size.\n // Where should this constant live?\n if (preKernUpper && currSymbol.symbolModifier === SymbolModifiers.SUPERSCRIPT) {\n adjustment += kerningOffsetPixels;\n }\n if (preKernLower && currSymbol.symbolType === SymbolTypes.TEXT) {\n if (currSymbol.text[0] >= 'a' && currSymbol.text[0] <= 'z') {\n adjustment += kerningOffsetPixels / 2;\n }\n if (ChordSymbol.upperKerningText.some((xx) => xx === (prevSymbol === null || prevSymbol === void 0 ? void 0 : prevSymbol.text[prevSymbol.text.length - 1]))) {\n adjustment += kerningOffsetPixels / 2;\n }\n }\n return adjustment;\n }\n /**\n * ChordSymbol allows multiple blocks so we can mix glyphs and font text.\n * Each block can have its own vertical orientation.\n */\n // eslint-disable-next-line\n getSymbolBlock(params = {}) {\n var _a, _b, _c;\n const symbolType = (_a = params.symbolType) !== null && _a !== void 0 ? _a : SymbolTypes.TEXT;\n const symbolBlock = {\n text: (_b = params.text) !== null && _b !== void 0 ? _b : '',\n symbolType,\n symbolModifier: (_c = params.symbolModifier) !== null && _c !== void 0 ? _c : SymbolModifiers.NONE,\n xShift: 0,\n yShift: 0,\n vAlign: false,\n width: 0,\n };\n // Note: symbol widths are resolution and font-independent.\n // We convert to pixel values when we know what the font is.\n if (symbolType === SymbolTypes.GLYPH && typeof params.glyph === 'string') {\n const glyphArgs = ChordSymbol.glyphs[params.glyph];\n const glyphPoints = 20;\n symbolBlock.glyph = new Glyph(glyphArgs.code, glyphPoints, { category: 'chordSymbol' });\n // Beware: glyph.metrics is not the same as glyph.getMetrics() !\n // rv.glyph.point = rv.glyph.point * rv.glyph.metrics.scale;\n // rv.width = rv.glyph.getMetrics().width;\n // don't set yShift here, b/c we need to do it at formatting time after the font is set.\n }\n else if (symbolType === SymbolTypes.TEXT) {\n symbolBlock.width = this.textFormatter.getWidthForTextInEm(symbolBlock.text);\n }\n else if (symbolType === SymbolTypes.LINE) {\n symbolBlock.width = params.width;\n }\n return symbolBlock;\n }\n /** Add a symbol to this chord, could be text, glyph or line. */\n // eslint-disable-next-line\n addSymbolBlock(parameters) {\n this.symbolBlocks.push(this.getSymbolBlock(parameters));\n return this;\n }\n // ### Convenience functions for creating different types of chord symbol parts.\n /** Add a text block. */\n // eslint-disable-next-line\n addText(text, parameters = {}) {\n const symbolType = SymbolTypes.TEXT;\n return this.addSymbolBlock(Object.assign(Object.assign({}, parameters), { text, symbolType }));\n }\n /** Add a text block with superscript modifier. */\n addTextSuperscript(text) {\n const symbolType = SymbolTypes.TEXT;\n const symbolModifier = SymbolModifiers.SUPERSCRIPT;\n return this.addSymbolBlock({ text, symbolType, symbolModifier });\n }\n /** Add a text block with subscript modifier. */\n addTextSubscript(text) {\n const symbolType = SymbolTypes.TEXT;\n const symbolModifier = SymbolModifiers.SUBSCRIPT;\n return this.addSymbolBlock({ text, symbolType, symbolModifier });\n }\n /** Add a glyph block with superscript modifier. */\n addGlyphSuperscript(glyph) {\n const symbolType = SymbolTypes.GLYPH;\n const symbolModifier = SymbolModifiers.SUPERSCRIPT;\n return this.addSymbolBlock({ glyph, symbolType, symbolModifier });\n }\n /** Add a glyph block. */\n // eslint-disable-next-line\n addGlyph(glyph, params = {}) {\n const symbolType = SymbolTypes.GLYPH;\n return this.addSymbolBlock(Object.assign(Object.assign({}, params), { glyph, symbolType }));\n }\n /**\n * Add a glyph for each character in 'text'. If the glyph is not available, use text from the font.\n * e.g. `addGlyphOrText('(+5#11)')` will use text for the '5' and '11', and glyphs for everything else.\n */\n // eslint-disable-next-line\n addGlyphOrText(text, params = {}) {\n let str = '';\n for (let i = 0; i < text.length; ++i) {\n const char = text[i];\n if (ChordSymbol.glyphs[char]) {\n if (str.length > 0) {\n this.addText(str, params);\n str = '';\n }\n this.addGlyph(char, params);\n }\n else {\n // Collect consecutive characters with no glyphs.\n str += char;\n }\n }\n if (str.length > 0) {\n this.addText(str, params);\n }\n return this;\n }\n /** Add a line of the given width, used as a continuation of the previous symbol in analysis, or lyrics, etc. */\n // eslint-disable-next-line\n addLine(width, params = {}) {\n const symbolType = SymbolTypes.LINE;\n return this.addSymbolBlock(Object.assign(Object.assign({}, params), { symbolType, width }));\n }\n /**\n * Set the chord symbol's font family, size, weight, style (e.g., `Arial`, `10pt`, `bold`, `italic`).\n *\n * @param f is 1) a `FontInfo` object or\n * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or\n * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided).\n * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt').\n * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900).\n * @param style is a string (e.g., 'italic', 'normal').\n *\n * @override See: Element.\n */\n setFont(f, size, weight, style) {\n super.setFont(f, size, weight, style);\n this.textFormatter = TextFormatter.create(this.textFont);\n return this;\n }\n setEnableKerning(val) {\n this.useKerning = val;\n return this;\n }\n /** Set vertical position of text (above or below stave). */\n setVertical(vj) {\n this.vertical = typeof vj === 'string' ? ChordSymbol.VerticalJustifyString[vj] : vj;\n return this;\n }\n getVertical() {\n return this.vertical;\n }\n /** Set horizontal justification. */\n setHorizontal(hj) {\n this.horizontal = typeof hj === 'string' ? ChordSymbol.HorizontalJustifyString[hj] : hj;\n return this;\n }\n getHorizontal() {\n return this.horizontal;\n }\n getWidth() {\n let width = 0;\n this.symbolBlocks.forEach((symbol) => {\n width += symbol.vAlign ? 0 : symbol.width;\n });\n return width;\n }\n getYOffsetForText(text) {\n var _a;\n let acc = 0;\n let i = 0;\n for (i = 0; i < text.length; ++i) {\n const metrics = this.textFormatter.getGlyphMetrics(text[i]);\n if (metrics) {\n const yMax = (_a = metrics.y_max) !== null && _a !== void 0 ? _a : 0;\n acc = yMax < acc ? yMax : acc;\n }\n }\n const resolution = this.textFormatter.getResolution();\n return i > 0 ? -1 * (acc / resolution) : 0;\n }\n /** Render text and glyphs above/below the note. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n // We're changing context parameters. Save current state.\n ctx.save();\n const classString = Object.keys(this.getAttribute('classes')).join(' ');\n ctx.openGroup(classString, this.getAttribute('id'));\n const start = note.getModifierStartXY(Modifier.Position.ABOVE, this.index);\n ctx.setFont(this.textFont);\n let y;\n // The position of the text varies based on whether or not the note\n // has a stem.\n const hasStem = note.hasStem();\n const stave = note.checkStave();\n if (this.vertical === ChordSymbolVerticalJustify.BOTTOM) {\n // HACK: We need to compensate for the text's height since its origin is bottom-right.\n y = stave.getYForBottomText(this.text_line + Tables.TEXT_HEIGHT_OFFSET_HACK);\n if (hasStem) {\n const stem_ext = note.checkStem().getExtents();\n const spacing = stave.getSpacingBetweenLines();\n const stem_base = note.getStemDirection() === 1 ? stem_ext.baseY : stem_ext.topY;\n y = Math.max(y, stem_base + spacing * (this.text_line + 2));\n }\n }\n else {\n // (this.vertical === VerticalJustify.TOP)\n y = Math.min(stave.getYForTopText(this.text_line), note.getYs()[0] - 10);\n if (hasStem) {\n const stem_ext = note.checkStem().getExtents();\n const spacing = stave.getSpacingBetweenLines();\n y = Math.min(y, stem_ext.topY - 5 - spacing * this.text_line);\n }\n }\n let x = start.x;\n if (this.horizontal === ChordSymbolHorizontalJustify.LEFT) {\n x = start.x;\n }\n else if (this.horizontal === ChordSymbolHorizontalJustify.RIGHT) {\n x = start.x + this.getWidth();\n }\n else if (this.horizontal === ChordSymbolHorizontalJustify.CENTER) {\n x = start.x - this.getWidth() / 2;\n }\n else {\n // HorizontalJustify.CENTER_STEM\n x = note.getStemX() - this.getWidth() / 2;\n }\n L('Rendering ChordSymbol: ', this.textFormatter, x, y);\n this.symbolBlocks.forEach((symbol) => {\n const isSuper = ChordSymbol.isSuperscript(symbol);\n const isSub = ChordSymbol.isSubscript(symbol);\n let curY = y;\n L('shift was ', symbol.xShift, symbol.yShift);\n L('curY pre sub ', curY);\n if (isSuper) {\n curY += this.superscriptOffset;\n }\n if (isSub) {\n curY += this.subscriptOffset;\n }\n L('curY sup/sub ', curY);\n if (symbol.symbolType === SymbolTypes.TEXT) {\n if (isSuper || isSub) {\n ctx.save();\n if (this.textFont) {\n const { family, size, weight, style } = this.textFont;\n const smallerFontSize = Font.scaleSize(size, ChordSymbol.superSubRatio);\n ctx.setFont(family, smallerFontSize, weight, style);\n }\n }\n // TODO???\n // We estimate the text width, fill it in with the empirical value so the formatting is even.\n // const textDim = ctx.measureText(symbol.text);\n // symbol.width = textDim.width;\n L('Rendering Text: ', symbol.text, x + symbol.xShift, curY + symbol.yShift);\n ctx.fillText(symbol.text, x + symbol.xShift, curY + symbol.yShift);\n if (isSuper || isSub) {\n ctx.restore();\n }\n }\n else if (symbol.symbolType === SymbolTypes.GLYPH && symbol.glyph) {\n curY += symbol.yShift;\n L('Rendering Glyph: ', symbol.glyph.code, x + symbol.xShift, curY);\n symbol.glyph.render(ctx, x + symbol.xShift, curY);\n }\n else if (symbol.symbolType === SymbolTypes.LINE) {\n L('Rendering Line : ', symbol.width, x, curY);\n ctx.beginPath();\n ctx.setLineWidth(1); // ?\n ctx.moveTo(x, y);\n ctx.lineTo(x + symbol.width, curY);\n ctx.stroke();\n }\n x += symbol.width;\n if (symbol.vAlign) {\n x += symbol.xShift;\n }\n });\n ctx.closeGroup();\n ctx.restore();\n }\n}\nChordSymbol.DEBUG = false;\n// Chord symbols can be positioned and justified relative to the note.\nChordSymbol.HorizontalJustify = ChordSymbolHorizontalJustify;\nChordSymbol.HorizontalJustifyString = {\n left: ChordSymbolHorizontalJustify.LEFT,\n right: ChordSymbolHorizontalJustify.RIGHT,\n center: ChordSymbolHorizontalJustify.CENTER,\n centerStem: ChordSymbolHorizontalJustify.CENTER_STEM,\n};\nChordSymbol.VerticalJustify = ChordSymbolVerticalJustify;\nChordSymbol.VerticalJustifyString = {\n top: ChordSymbolVerticalJustify.TOP,\n above: ChordSymbolVerticalJustify.TOP,\n below: ChordSymbolVerticalJustify.BOTTOM,\n bottom: ChordSymbolVerticalJustify.BOTTOM,\n};\n// Glyph data\nChordSymbol.glyphs = {\n diminished: {\n code: 'csymDiminished',\n },\n dim: {\n code: 'csymDiminished',\n },\n halfDiminished: {\n code: 'csymHalfDiminished',\n },\n '+': {\n code: 'csymAugmented',\n },\n augmented: {\n code: 'csymAugmented',\n },\n majorSeventh: {\n code: 'csymMajorSeventh',\n },\n minor: {\n code: 'csymMinor',\n },\n '-': {\n code: 'csymMinor',\n },\n '(': {\n code: 'csymParensLeftTall',\n },\n leftParen: {\n code: 'csymParensLeftTall',\n },\n ')': {\n code: 'csymParensRightTall',\n },\n rightParen: {\n code: 'csymParensRightTall',\n },\n leftBracket: {\n code: 'csymBracketLeftTall',\n },\n rightBracket: {\n code: 'csymBracketRightTall',\n },\n leftParenTall: {\n code: 'csymParensLeftVeryTall',\n },\n rightParenTall: {\n code: 'csymParensRightVeryTall',\n },\n '/': {\n code: 'csymDiagonalArrangementSlash',\n },\n over: {\n code: 'csymDiagonalArrangementSlash',\n },\n '#': {\n code: 'accidentalSharp',\n },\n b: {\n code: 'accidentalFlat',\n },\n};\nChordSymbol.symbolTypes = SymbolTypes;\nChordSymbol.symbolModifiers = SymbolModifiers;\n/** Currently unused. */\nChordSymbol.noFormat = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Fraction } from './fraction';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nexport var VoiceMode;\n(function (VoiceMode) {\n VoiceMode[VoiceMode[\"STRICT\"] = 1] = \"STRICT\";\n VoiceMode[VoiceMode[\"SOFT\"] = 2] = \"SOFT\";\n VoiceMode[VoiceMode[\"FULL\"] = 3] = \"FULL\";\n})(VoiceMode || (VoiceMode = {}));\n/**\n * `Voice` is mainly a container object to group `Tickables` for formatting.\n */\nexport class Voice extends Element {\n constructor(time, options) {\n super();\n this.resolutionMultiplier = 1;\n this.mode = VoiceMode.STRICT;\n this.preFormatted = false;\n this.ticksUsed = new Fraction(0, 1);\n this.largestTickWidth = 0;\n this.tickables = [];\n this.options = Object.assign({ softmaxFactor: 100 }, options);\n // Convert the `time` string into a VoiceTime object if necessary.\n let voiceTime;\n if (typeof time === 'string') {\n // Time signature shortcut: \"4/4\", \"3/8\", etc.\n const match = time.match(/(\\d+)\\/(\\d+)/);\n if (match) {\n voiceTime = {\n num_beats: parseInt(match[1]),\n beat_value: parseInt(match[2]),\n };\n }\n }\n else {\n voiceTime = time;\n }\n // Default time signature is 4/4.\n this.time = Object.assign({ num_beats: 4, beat_value: 4, resolution: Tables.RESOLUTION }, voiceTime);\n // Recalculate total ticks.\n this.totalTicks = new Fraction(this.time.num_beats * (this.time.resolution / this.time.beat_value), 1);\n this.smallestTickCount = this.totalTicks.clone();\n }\n static get CATEGORY() {\n return Category.Voice;\n }\n /**\n * Modes allow the addition of ticks in three different ways:\n * - STRICT: This is the default. Ticks must fill the voice.\n * - SOFT: Ticks can be added without restrictions.\n * - FULL: Ticks do not need to fill the voice, but can't exceed the maximum tick length.\n */\n static get Mode() {\n return VoiceMode;\n }\n /** Get the total ticks in the voice. */\n getTotalTicks() {\n return this.totalTicks;\n }\n /** Get the total ticks used in the voice by all the tickables. */\n getTicksUsed() {\n return this.ticksUsed;\n }\n /** Get the largest width of all the tickables. */\n getLargestTickWidth() {\n return this.largestTickWidth;\n }\n /** Get the tick count for the shortest tickable */\n getSmallestTickCount() {\n return this.smallestTickCount;\n }\n /** Get the tickables in the voice. */\n getTickables() {\n return this.tickables;\n }\n /** Get the voice mode. */\n getMode() {\n return this.mode;\n }\n /**\n * Set the voice mode.\n * @param mode value from `VoiceMode`\n */\n setMode(mode) {\n this.mode = mode;\n return this;\n }\n /** Get the resolution multiplier for the voice. */\n getResolutionMultiplier() {\n return this.resolutionMultiplier;\n }\n /** Get the actual tick resolution for the voice. */\n getActualResolution() {\n return this.resolutionMultiplier * this.time.resolution;\n }\n /** Set the voice's stave. */\n setStave(stave) {\n this.stave = stave;\n // Reset the bounding box so we can reformat.\n this.boundingBox = undefined;\n return this;\n }\n getStave() {\n return this.stave;\n }\n /** Get the bounding box for the voice. */\n getBoundingBox() {\n if (!this.boundingBox) {\n const stave = this.checkStave();\n let boundingBox = undefined;\n for (let i = 0; i < this.tickables.length; ++i) {\n const tickable = this.tickables[i];\n tickable.setStave(stave);\n const bb = tickable.getBoundingBox();\n if (bb) {\n boundingBox = boundingBox ? boundingBox.mergeWith(bb) : bb;\n }\n }\n this.boundingBox = boundingBox;\n }\n return this.boundingBox;\n }\n /** Set the voice mode to strict or soft. */\n setStrict(strict) {\n this.mode = strict ? VoiceMode.STRICT : VoiceMode.SOFT;\n return this;\n }\n /** Determine if the voice is complete according to the voice mode. */\n isComplete() {\n if (this.mode === VoiceMode.STRICT || this.mode === VoiceMode.FULL) {\n return this.ticksUsed.equals(this.totalTicks);\n }\n else {\n return true;\n }\n }\n /**\n * We use softmax to layout the tickables proportional to the exponent of\n * their duration. The softmax factor is used to determine the 'linearness' of\n * the layout.\n *\n * The softmax of all the tickables in this voice should sum to 1.\n */\n setSoftmaxFactor(factor) {\n this.options.softmaxFactor = factor;\n return this;\n }\n /**\n * Calculate the sum of the exponents of all the ticks in this voice to use\n * as the denominator of softmax.\n */\n reCalculateExpTicksUsed() {\n const totalTicks = this.ticksUsed.value();\n const exp = (tickable) => Math.pow(this.options.softmaxFactor, tickable.getTicks().value() / totalTicks);\n this.expTicksUsed = this.tickables.map(exp).reduce((a, b) => a + b, 0);\n return this.expTicksUsed;\n }\n /** Get the softmax-scaled value of a tick duration. 'tickValue' is a number. */\n softmax(tickValue) {\n if (!this.expTicksUsed) {\n this.expTicksUsed = this.reCalculateExpTicksUsed();\n }\n const totalTicks = this.ticksUsed.value();\n const exp = (v) => Math.pow(this.options.softmaxFactor, v / totalTicks);\n const sm = exp(tickValue) / this.expTicksUsed;\n return sm;\n }\n /** Add a tickable to the voice. */\n addTickable(tickable) {\n if (!tickable.shouldIgnoreTicks()) {\n const ticks = tickable.getTicks();\n // Update the total ticks for this line.\n this.ticksUsed.add(ticks);\n this.expTicksUsed = 0; // reset\n if ((this.mode === VoiceMode.STRICT || this.mode === VoiceMode.FULL) &&\n this.ticksUsed.greaterThan(this.totalTicks)) {\n this.ticksUsed.subtract(ticks);\n throw new RuntimeError('BadArgument', 'Too many ticks.');\n }\n // Track the smallest tickable for formatting.\n if (ticks.lessThan(this.smallestTickCount)) {\n this.smallestTickCount = ticks.clone();\n }\n this.resolutionMultiplier = this.ticksUsed.denominator;\n // Expand total ticks using denominator from ticks used.\n this.totalTicks.add(0, this.ticksUsed.denominator);\n }\n // Add the tickable to the line.\n this.tickables.push(tickable);\n tickable.setVoice(this);\n return this;\n }\n /** Add an array of tickables to the voice. */\n addTickables(tickables) {\n for (let i = 0; i < tickables.length; ++i) {\n this.addTickable(tickables[i]);\n }\n return this;\n }\n /** Preformat the voice by applying the voice's stave to each note. */\n preFormat() {\n if (this.preFormatted)\n return this;\n const stave = this.checkStave();\n this.tickables.forEach((tickable) => {\n if (!tickable.getStave()) {\n tickable.setStave(stave);\n }\n });\n this.preFormatted = true;\n return this;\n }\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n /**\n * Render the voice onto the canvas `context` and an optional `stave`.\n * If `stave` is omitted, it is expected that the notes have staves\n * already set.\n *\n * This method also calculates the voice's boundingBox while drawing\n * the notes. Note the similarities with this.getBoundingBox().\n */\n draw(context = this.checkContext(), stave) {\n stave = stave !== null && stave !== void 0 ? stave : this.stave;\n this.setRendered();\n let boundingBox = undefined;\n for (let i = 0; i < this.tickables.length; ++i) {\n const tickable = this.tickables[i];\n // Set the stave if provided.\n if (stave) {\n tickable.setStave(stave);\n }\n defined(tickable.getStave(), 'MissingStave', 'The voice cannot draw tickables without staves.');\n const bb = tickable.getBoundingBox();\n if (bb) {\n boundingBox = boundingBox ? boundingBox.mergeWith(bb) : bb;\n }\n tickable.setContext(context);\n tickable.drawWithStyle();\n }\n this.boundingBox = boundingBox;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Note } from './note';\nimport { Barline, BarlineType } from './stavebarline';\nimport { Category } from './typeguard';\nimport { log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (BarNote.DEBUG)\n log('Vex.Flow.BarNote', args);\n}\n/**\n * A `BarNote` is used to render bar lines (from `barline.ts`). `BarNote`s can\n * be added to a voice and rendered in the middle of a stave. Since it has no\n * duration, it consumes no `tick`s, and is dealt with appropriately by the formatter.\n *\n * See `tests/barnote_tests.ts` for usage examples.\n */\nexport class BarNote extends Note {\n constructor(type = BarlineType.SINGLE) {\n super({ duration: 'b' });\n this.metrics = {\n widths: {},\n };\n const TYPE = BarlineType;\n this.metrics.widths = {\n [TYPE.SINGLE]: 8,\n [TYPE.DOUBLE]: 12,\n [TYPE.END]: 15,\n [TYPE.REPEAT_BEGIN]: 14,\n [TYPE.REPEAT_END]: 14,\n [TYPE.REPEAT_BOTH]: 18,\n [TYPE.NONE]: 0,\n };\n // Tell the formatter that bar notes have no duration.\n this.ignore_ticks = true;\n this.setType(type);\n }\n static get CATEGORY() {\n return Category.BarNote;\n }\n /** Get the type of bar note.*/\n getType() {\n return this.type;\n }\n /** Set the type of bar note. */\n setType(type) {\n this.type = typeof type === 'string' ? Barline.typeString[type] : type;\n // Set width to width of relevant `Barline`.\n this.setWidth(this.metrics.widths[this.type]);\n return this;\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n /** Overridden to ignore. */\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n /** Render note to stave. */\n draw() {\n const ctx = this.checkContext();\n L('Rendering bar line at: ', this.getAbsoluteX());\n if (this.style)\n this.applyStyle(ctx);\n const barline = new Barline(this.type);\n barline.setX(this.getAbsoluteX());\n barline.draw(this.checkStave());\n if (this.style)\n this.restoreStyle(ctx);\n this.setRendered();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.BarNote.DEBUG` to `true`. */\nBarNote.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Modifier } from './modifier';\nimport { TextFormatter } from './textformatter';\nimport { Category, isTabNote } from './typeguard';\nimport { RuntimeError } from './util';\n/** Bend implements tablature bends. */\nexport class Bend extends Modifier {\n /**\n * Example of a phrase:\n * ```\n * [{\n * type: UP,\n * text: \"whole\"\n * width: 8;\n * },\n * {\n * type: DOWN,\n * text: \"whole\"\n * width: 8;\n * },\n * {\n * type: UP,\n * text: \"half\"\n * width: 8;\n * },\n * {\n * type: UP,\n * text: \"whole\"\n * width: 8;\n * },\n * {\n * type: DOWN,\n * text: \"1 1/2\"\n * width: 8;\n * }]\n * ```\n * @param text text for bend (\"Full\", \"Half\", etc.) (DEPRECATED)\n * @param release if true, render a release. (DEPRECATED)\n * @param phrase if set, ignore \"text\" and \"release\", and use the more sophisticated phrase specified\n */\n constructor(text, release = false, phrase) {\n super();\n this.text = text;\n this.x_shift = 0;\n this.release = release;\n this.tap = '';\n this.resetFont();\n this.render_options = {\n line_width: 1.5,\n line_style: '#777777',\n bend_width: 8,\n release_width: 8,\n };\n if (phrase) {\n this.phrase = phrase;\n }\n else {\n // Backward compatibility\n this.phrase = [{ type: Bend.UP, text: this.text }];\n if (this.release)\n this.phrase.push({ type: Bend.DOWN, text: '' });\n }\n this.updateWidth();\n }\n static get CATEGORY() {\n return Category.Bend;\n }\n static get UP() {\n return 0;\n }\n static get DOWN() {\n return 1;\n }\n // Arrange bends in `ModifierContext`\n static format(bends, state) {\n if (!bends || bends.length === 0)\n return false;\n let last_width = 0;\n // Format Bends\n for (let i = 0; i < bends.length; ++i) {\n const bend = bends[i];\n const note = bend.checkAttachedNote();\n if (isTabNote(note)) {\n const stringPos = note.leastString() - 1;\n if (state.top_text_line < stringPos) {\n state.top_text_line = stringPos;\n }\n }\n bend.setXShift(last_width);\n last_width = bend.getWidth();\n bend.setTextLine(state.top_text_line);\n }\n state.right_shift += last_width;\n state.top_text_line += 1;\n return true;\n }\n /** Set horizontal shift in pixels. */\n setXShift(value) {\n this.x_shift = value;\n this.updateWidth();\n return this;\n }\n setTap(value) {\n this.tap = value;\n return this;\n }\n /** Get text provided in the constructor. */\n getText() {\n return this.text;\n }\n getTextHeight() {\n const textFormatter = TextFormatter.create(this.textFont);\n return textFormatter.maxHeight;\n }\n /** Recalculate width. */\n updateWidth() {\n const textFormatter = TextFormatter.create(this.textFont);\n const measureText = (text) => {\n return textFormatter.getWidthForTextInPx(text);\n };\n let totalWidth = 0;\n for (let i = 0; i < this.phrase.length; ++i) {\n const bend = this.phrase[i];\n if (bend.width !== undefined) {\n totalWidth += bend.width;\n }\n else {\n const additional_width = bend.type === Bend.UP ? this.render_options.bend_width : this.render_options.release_width;\n bend.width = Math.max(additional_width, measureText(bend.text)) + 3;\n bend.draw_width = bend.width / 2;\n totalWidth += bend.width;\n }\n }\n this.setWidth(totalWidth + this.x_shift);\n return this;\n }\n /** Draw the bend on the rendering context. */\n draw() {\n var _a;\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(Modifier.Position.RIGHT, this.index);\n start.x += 3;\n start.y += 0.5;\n const x_shift = this.x_shift;\n const stave = note.checkStave();\n const spacing = stave.getSpacingBetweenLines();\n const lowestY = note.getYs().reduce((a, b) => (a < b ? a : b));\n // this.text_line is relative to top string in the group.\n const bend_height = start.y - ((this.text_line + 1) * spacing + start.y - lowestY) + 3;\n const annotation_y = start.y - ((this.text_line + 1) * spacing + start.y - lowestY) - 1;\n const renderBend = (x, y, width, height) => {\n const cp_x = x + width;\n const cp_y = y;\n ctx.save();\n ctx.beginPath();\n ctx.setLineWidth(this.render_options.line_width);\n ctx.setStrokeStyle(this.render_options.line_style);\n ctx.setFillStyle(this.render_options.line_style);\n ctx.moveTo(x, y);\n ctx.quadraticCurveTo(cp_x, cp_y, x + width, height);\n ctx.stroke();\n ctx.restore();\n };\n const renderRelease = (x, y, width, height) => {\n ctx.save();\n ctx.beginPath();\n ctx.setLineWidth(this.render_options.line_width);\n ctx.setStrokeStyle(this.render_options.line_style);\n ctx.setFillStyle(this.render_options.line_style);\n ctx.moveTo(x, height);\n ctx.quadraticCurveTo(x + width, height, x + width, y);\n ctx.stroke();\n ctx.restore();\n };\n const renderArrowHead = (x, y, direction) => {\n const width = 4;\n const yBase = y + width * direction;\n ctx.beginPath();\n ctx.moveTo(x, y); // tip of the arrow\n ctx.lineTo(x - width, yBase);\n ctx.lineTo(x + width, yBase);\n ctx.closePath();\n ctx.fill();\n };\n const renderText = (x, text) => {\n ctx.save();\n ctx.setFont(this.textFont);\n const render_x = x - ctx.measureText(text).width / 2;\n ctx.fillText(text, render_x, annotation_y);\n ctx.restore();\n };\n let last_bend = undefined;\n let last_bend_draw_width = 0;\n let last_drawn_width = 0;\n if ((_a = this.tap) === null || _a === void 0 ? void 0 : _a.length) {\n const tapStart = note.getModifierStartXY(Modifier.Position.CENTER, this.index);\n renderText(tapStart.x, this.tap);\n }\n for (let i = 0; i < this.phrase.length; ++i) {\n const bend = this.phrase[i];\n if (!bend.draw_width)\n bend.draw_width = 0;\n if (i === 0)\n bend.draw_width += x_shift;\n last_drawn_width = bend.draw_width + last_bend_draw_width - (i === 1 ? x_shift : 0);\n if (bend.type === Bend.UP) {\n if (last_bend && last_bend.type === Bend.UP) {\n renderArrowHead(start.x, bend_height, +1);\n }\n renderBend(start.x, start.y, last_drawn_width, bend_height);\n }\n if (bend.type === Bend.DOWN) {\n if (last_bend && last_bend.type === Bend.UP) {\n renderRelease(start.x, start.y, last_drawn_width, bend_height);\n }\n if (last_bend && last_bend.type === Bend.DOWN) {\n renderArrowHead(start.x, start.y, -1);\n renderRelease(start.x, start.y, last_drawn_width, bend_height);\n }\n if (!last_bend) {\n last_drawn_width = bend.draw_width;\n renderRelease(start.x, start.y, last_drawn_width, bend_height);\n }\n }\n renderText(start.x + last_drawn_width, bend.text);\n last_bend = bend;\n last_bend_draw_width = bend.draw_width;\n last_bend.x = start.x;\n start.x += last_drawn_width;\n }\n if (!last_bend || last_bend.x == undefined) {\n throw new RuntimeError('NoLastBendForBend', 'Internal error.');\n }\n // Final arrowhead and text\n if (last_bend.type === Bend.UP) {\n renderArrowHead(last_bend.x + last_drawn_width, bend_height, +1);\n }\n else if (last_bend.type === Bend.DOWN) {\n renderArrowHead(last_bend.x + last_drawn_width, start.y, -1);\n }\n }\n}\n/** Default text font. */\nBend.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n//\n// This class implements dot modifiers for notes.\nimport { Modifier } from './modifier';\nimport { Category, isGraceNote, isStaveNote, isTabNote } from './typeguard';\nimport { RuntimeError } from './util';\nexport class Dot extends Modifier {\n constructor() {\n super();\n this.position = Modifier.Position.RIGHT;\n this.radius = 2;\n this.setWidth(5);\n this.dot_shiftY = 0;\n }\n static get CATEGORY() {\n return Category.Dot;\n }\n /** Returns the dots associated to a Note. */\n static getDots(note) {\n return note.getModifiersByType(Dot.CATEGORY);\n }\n /** Add a dot on the specified keys to the notes. */\n static buildAndAttach(notes, options) {\n for (const note of notes) {\n if (options === null || options === void 0 ? void 0 : options.all) {\n for (let i = 0; i < note.keys.length; i++) {\n const dot = new Dot();\n dot.setDotShiftY(note.glyph.dot_shiftY);\n note.addModifier(dot, i);\n }\n }\n else if ((options === null || options === void 0 ? void 0 : options.index) != undefined) {\n const dot = new Dot();\n dot.setDotShiftY(note.glyph.dot_shiftY);\n note.addModifier(dot, options === null || options === void 0 ? void 0 : options.index);\n }\n else {\n const dot = new Dot();\n dot.setDotShiftY(note.glyph.dot_shiftY);\n note.addModifier(dot, 0);\n }\n }\n }\n // Arrange dots inside a ModifierContext.\n static format(dots, state) {\n const right_shift = state.right_shift;\n const dot_spacing = 1;\n if (!dots || dots.length === 0)\n return false;\n const dot_list = [];\n const max_shift_map = {};\n for (let i = 0; i < dots.length; ++i) {\n const dot = dots[i];\n const note = dot.getNote();\n let props;\n let shift;\n if (isStaveNote(note)) {\n const index = dot.checkIndex();\n props = note.getKeyProps()[index];\n // consider right displaced head with no previous modifier\n shift = note.getFirstDotPx();\n }\n else if (isTabNote(note)) {\n props = { line: 0.5 }; // Shim key props for dot placement\n shift = right_shift;\n }\n else {\n // note object is not StaveNote or TabNote.\n throw new RuntimeError('Internal', 'Unexpected instance.');\n }\n const note_id = note.getAttribute('id');\n dot_list.push({ line: props.line, note, note_id, dot });\n max_shift_map[note_id] = Math.max(max_shift_map[note_id] || shift, shift);\n }\n // Sort dots by line number.\n dot_list.sort((a, b) => b.line - a.line);\n let dot_shift = right_shift;\n let x_width = 0;\n let last_line = null;\n let last_note = null;\n let prev_dotted_space = null;\n let half_shiftY = 0;\n for (let i = 0; i < dot_list.length; ++i) {\n const { dot, note, note_id, line } = dot_list[i];\n // Reset the position of the dot every line.\n if (line !== last_line || note !== last_note) {\n dot_shift = max_shift_map[note_id];\n }\n if (!note.isRest() && line !== last_line) {\n if (Math.abs(line % 1) === 0.5) {\n // note is on a space, so no dot shift\n half_shiftY = 0;\n }\n else {\n // note is on a line, so shift dot to space above the line\n half_shiftY = 0.5;\n if (last_note != null && !last_note.isRest() && last_line != null && last_line - line === 0.5) {\n // previous note on a space, so shift dot to space below the line\n half_shiftY = -0.5;\n }\n else if (line + half_shiftY === prev_dotted_space) {\n // previous space is dotted, so shift dot to space below the line\n half_shiftY = -0.5;\n }\n }\n }\n // convert half_shiftY to a multiplier for dots.draw()\n if (note.isRest()) {\n dot.dot_shiftY += -half_shiftY;\n }\n else {\n dot.dot_shiftY = -half_shiftY;\n }\n prev_dotted_space = line + half_shiftY;\n dot.setXShift(dot_shift);\n dot_shift += dot.getWidth() + dot_spacing; // spacing\n x_width = dot_shift > x_width ? dot_shift : x_width;\n last_line = line;\n last_note = note;\n }\n // Update state.\n state.right_shift += x_width;\n return true;\n }\n setNote(note) {\n this.note = note;\n if (isGraceNote(note)) {\n this.radius *= 0.5;\n this.setWidth(3);\n }\n return this;\n }\n setDotShiftY(y) {\n this.dot_shiftY = y;\n return this;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const stave = note.checkStave();\n const lineSpace = stave.getSpacingBetweenLines();\n const start = note.getModifierStartXY(this.position, this.index, { forceFlagRight: true });\n // Set the starting y coordinate to the base of the stem for TabNotes.\n if (isTabNote(note)) {\n start.y = note.getStemExtents().baseY;\n }\n const x = start.x + this.x_shift + this.width - this.radius;\n const y = start.y + this.y_shift + this.dot_shiftY * lineSpace;\n ctx.beginPath();\n ctx.arc(x, y, this.radius, 0, Math.PI * 2, false);\n ctx.fill();\n }\n}\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n// Author Larry Kuhns 2013\n// Class to draws string numbers into the notation.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { Tables } from './tables';\nimport { TextFormatter } from './textformatter';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class FretHandFinger extends Modifier {\n constructor(finger) {\n super();\n this.finger = finger;\n this.width = 7;\n this.position = Modifier.Position.LEFT; // Default position above stem or note head\n this.x_shift = 0;\n this.y_shift = 0;\n this.x_offset = 0; // Horizontal offset from default\n this.y_offset = 0; // Vertical offset from default\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.FretHandFinger;\n }\n // Arrange fingerings inside a ModifierContext.\n static format(nums, state) {\n const { left_shift, right_shift } = state;\n const num_spacing = 1;\n if (!nums || nums.length === 0)\n return false;\n const nums_list = [];\n let prev_note = null;\n let shiftLeft = 0;\n let shiftRight = 0;\n for (let i = 0; i < nums.length; ++i) {\n const num = nums[i];\n const note = num.getNote();\n const pos = num.getPosition();\n const index = num.checkIndex();\n const props = note.getKeyProps()[index];\n const textFormatter = TextFormatter.create(num.textFont);\n const textHeight = textFormatter.maxHeight;\n if (num.position === ModifierPosition.ABOVE) {\n state.top_text_line += textHeight / Tables.STAVE_LINE_DISTANCE + 0.5;\n }\n if (num.position === ModifierPosition.BELOW) {\n state.text_line += textHeight / Tables.STAVE_LINE_DISTANCE + 0.5;\n }\n if (note !== prev_note) {\n for (let n = 0; n < note.keys.length; ++n) {\n if (left_shift === 0) {\n shiftLeft = Math.max(note.getLeftDisplacedHeadPx(), shiftLeft);\n }\n if (right_shift === 0) {\n shiftRight = Math.max(note.getRightDisplacedHeadPx(), shiftRight);\n }\n }\n prev_note = note;\n }\n nums_list.push({\n note,\n num,\n pos,\n line: props.line,\n shiftL: shiftLeft,\n shiftR: shiftRight,\n });\n }\n // Sort fingernumbers by line number.\n nums_list.sort((a, b) => b.line - a.line);\n let numShiftL = 0;\n let numShiftR = 0;\n let xWidthL = 0;\n let xWidthR = 0;\n let lastLine = null;\n let lastNote = null;\n for (let i = 0; i < nums_list.length; ++i) {\n let num_shift = 0;\n const { note, pos, num, line, shiftL, shiftR } = nums_list[i];\n // Reset the position of the string number every line.\n if (line !== lastLine || note !== lastNote) {\n numShiftL = left_shift + shiftL;\n numShiftR = right_shift + shiftR;\n }\n const numWidth = num.getWidth() + num_spacing;\n if (pos === Modifier.Position.LEFT) {\n num.setXShift(left_shift + numShiftL);\n num_shift = left_shift + numWidth; // spacing\n xWidthL = num_shift > xWidthL ? num_shift : xWidthL;\n }\n else if (pos === Modifier.Position.RIGHT) {\n num.setXShift(numShiftR);\n num_shift = shiftRight + numWidth; // spacing\n xWidthR = num_shift > xWidthR ? num_shift : xWidthR;\n }\n lastLine = line;\n lastNote = note;\n }\n state.left_shift += xWidthL;\n state.right_shift += xWidthR;\n return true;\n }\n static easyScoreHook({ fingerings } = {}, note, builder) {\n fingerings === null || fingerings === void 0 ? void 0 : fingerings.split(',').map((fingeringString) => {\n const split = fingeringString.trim().split('.');\n const params = { number: split[0] };\n if (split[1])\n params.position = split[1];\n return builder.getFactory().Fingering(params);\n }).map((fingering, index) => note.addModifier(fingering, index));\n }\n setFretHandFinger(finger) {\n this.finger = finger;\n return this;\n }\n getFretHandFinger() {\n return this.finger;\n }\n setOffsetX(x) {\n this.x_offset = x;\n return this;\n }\n setOffsetY(y) {\n this.y_offset = y;\n return this;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(this.position, this.index);\n let dot_x = start.x + this.x_shift + this.x_offset;\n let dot_y = start.y + this.y_shift + this.y_offset + 5;\n switch (this.position) {\n case Modifier.Position.ABOVE:\n dot_x -= 4;\n dot_y -= 12;\n break;\n case Modifier.Position.BELOW:\n dot_x -= 2;\n dot_y += 10;\n break;\n case Modifier.Position.LEFT:\n dot_x -= this.width;\n break;\n case Modifier.Position.RIGHT:\n dot_x += 1;\n break;\n default:\n throw new RuntimeError('InvalidPosition', `The position ${this.position} does not exist`);\n }\n ctx.save();\n ctx.setFont(this.textFont);\n ctx.fillText('' + this.finger, dot_x, dot_y);\n ctx.restore();\n }\n}\nFretHandFinger.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 9,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// This class implements varies types of ties between contiguous notes. The\n// ties include: regular ties, hammer ons, pull offs, and slides.\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StaveTie extends Element {\n /**\n * @param notes is a struct that has:\n *\n * {\n * first_note: Note,\n * last_note: Note,\n * first_indices: [n1, n2, n3],\n * last_indices: [n1, n2, n3]\n * }\n *\n * @param text\n */\n constructor(notes, text) {\n super();\n this.setNotes(notes);\n this.text = text;\n this.render_options = {\n cp1: 8,\n cp2: 12,\n text_shift_x: 0,\n first_x_shift: 0,\n last_x_shift: 0,\n y_shift: 7,\n tie_spacing: 0,\n };\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StaveTie;\n }\n setDirection(direction) {\n this.direction = direction;\n return this;\n }\n /**\n * Set the notes to attach this tie to.\n *\n * @param {!Object} notes The notes to tie up.\n */\n setNotes(notes) {\n if (!notes.first_note && !notes.last_note) {\n throw new RuntimeError('BadArguments', 'Tie needs to have either first_note or last_note set.');\n }\n if (!notes.first_indices) {\n notes.first_indices = [0];\n }\n if (!notes.last_indices) {\n notes.last_indices = [0];\n }\n if (notes.first_indices.length !== notes.last_indices.length) {\n throw new RuntimeError('BadArguments', 'Tied notes must have same number of indices.');\n }\n this.notes = notes;\n return this;\n }\n /**\n * @return {boolean} Returns true if this is a partial bar.\n */\n isPartial() {\n return !this.notes.first_note || !this.notes.last_note;\n }\n renderTie(params) {\n if (params.first_ys.length === 0 || params.last_ys.length === 0) {\n throw new RuntimeError('BadArguments', 'No Y-values to render');\n }\n const ctx = this.checkContext();\n let cp1 = this.render_options.cp1;\n let cp2 = this.render_options.cp2;\n if (Math.abs(params.last_x_px - params.first_x_px) < 10) {\n cp1 = 2;\n cp2 = 8;\n }\n const first_x_shift = this.render_options.first_x_shift;\n const last_x_shift = this.render_options.last_x_shift;\n const y_shift = this.render_options.y_shift * params.direction;\n // setNotes(...) verified that first_indices and last_indices are not undefined.\n // As a result, we use the ! non-null assertion operator here.\n // eslint-disable-next-line\n const first_indices = this.notes.first_indices;\n // eslint-disable-next-line\n const last_indices = this.notes.last_indices;\n for (let i = 0; i < first_indices.length; ++i) {\n const cp_x = (params.last_x_px + last_x_shift + (params.first_x_px + first_x_shift)) / 2;\n const first_y_px = params.first_ys[first_indices[i]] + y_shift;\n const last_y_px = params.last_ys[last_indices[i]] + y_shift;\n if (isNaN(first_y_px) || isNaN(last_y_px)) {\n throw new RuntimeError('BadArguments', 'Bad indices for tie rendering.');\n }\n const top_cp_y = (first_y_px + last_y_px) / 2 + cp1 * params.direction;\n const bottom_cp_y = (first_y_px + last_y_px) / 2 + cp2 * params.direction;\n ctx.beginPath();\n ctx.moveTo(params.first_x_px + first_x_shift, first_y_px);\n ctx.quadraticCurveTo(cp_x, top_cp_y, params.last_x_px + last_x_shift, last_y_px);\n ctx.quadraticCurveTo(cp_x, bottom_cp_y, params.first_x_px + first_x_shift, first_y_px);\n ctx.closePath();\n ctx.fill();\n }\n }\n renderText(first_x_px, last_x_px) {\n var _a, _b, _c;\n if (!this.text)\n return;\n const ctx = this.checkContext();\n let center_x = (first_x_px + last_x_px) / 2;\n center_x -= ctx.measureText(this.text).width / 2;\n const stave = (_b = (_a = this.notes.first_note) === null || _a === void 0 ? void 0 : _a.checkStave()) !== null && _b !== void 0 ? _b : (_c = this.notes.last_note) === null || _c === void 0 ? void 0 : _c.checkStave();\n if (stave) {\n ctx.save();\n ctx.setFont(this.textFont);\n ctx.fillText(this.text, center_x + this.render_options.text_shift_x, stave.getYForTopText() - 1);\n ctx.restore();\n }\n }\n draw() {\n this.checkContext();\n this.setRendered();\n const first_note = this.notes.first_note;\n const last_note = this.notes.last_note;\n // Provide some default values so the compiler doesn't complain.\n let first_x_px = 0;\n let last_x_px = 0;\n let first_ys = [0];\n let last_ys = [0];\n let stem_direction = 0;\n if (first_note) {\n first_x_px = first_note.getTieRightX() + this.render_options.tie_spacing;\n stem_direction = first_note.getStemDirection();\n first_ys = first_note.getYs();\n }\n else if (last_note) {\n const stave = last_note.checkStave();\n first_x_px = stave.getTieStartX();\n first_ys = last_note.getYs();\n this.notes.first_indices = this.notes.last_indices;\n }\n if (last_note) {\n last_x_px = last_note.getTieLeftX() + this.render_options.tie_spacing;\n stem_direction = last_note.getStemDirection();\n last_ys = last_note.getYs();\n }\n else if (first_note) {\n const stave = first_note.checkStave();\n last_x_px = stave.getTieEndX();\n last_ys = first_note.getYs();\n this.notes.last_indices = this.notes.first_indices;\n }\n if (this.direction) {\n stem_direction = this.direction;\n }\n this.renderTie({\n first_x_px,\n last_x_px,\n first_ys,\n last_ys,\n direction: stem_direction,\n });\n this.renderText(first_x_px, last_x_px);\n return true;\n }\n}\n/** Default text font. */\nStaveTie.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n","// / [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This class implements varies types of ties between contiguous notes. The\n// ties include: regular ties, hammer ons, pull offs, and slides.\nimport { StaveTie } from './stavetie';\nimport { Category } from './typeguard';\nexport class TabTie extends StaveTie {\n static get CATEGORY() {\n return Category.TabTie;\n }\n static createHammeron(notes) {\n return new TabTie(notes, 'H');\n }\n static createPulloff(notes) {\n return new TabTie(notes, 'P');\n }\n /**\n * @param notes is a struct that has:\n * {\n * first_note: Note,\n * last_note: Note,\n * first_indices: [n1, n2, n3],\n * last_indices: [n1, n2, n3]\n * }\n *\n * @param text\n */\n constructor(notes, text) {\n super(notes, text);\n this.render_options.cp1 = 9;\n this.render_options.cp2 = 11;\n this.render_options.y_shift = 3;\n this.direction = -1; // Tab tie's are always face up.\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements `GraceNoteGroup` which is used to format and\n// render grace notes.\nimport { Beam } from './beam';\nimport { Formatter } from './formatter';\nimport { Modifier } from './modifier';\nimport { StaveTie } from './stavetie';\nimport { Tables } from './tables';\nimport { TabTie } from './tabtie';\nimport { Category, isStaveNote } from './typeguard';\nimport { log } from './util';\nimport { Voice } from './voice';\n// To enable logging for this class. Set `GraceNoteGroup.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (GraceNoteGroup.DEBUG)\n log('Vex.Flow.GraceNoteGroup', args);\n}\n/** GraceNoteGroup is used to format and render grace notes. */\nexport class GraceNoteGroup extends Modifier {\n //** `GraceNoteGroup` inherits from `Modifier` and is placed inside a `ModifierContext`. */\n constructor(grace_notes, show_slur) {\n super();\n this.preFormatted = false;\n this.position = Modifier.Position.LEFT;\n this.grace_notes = grace_notes;\n this.width = 0;\n this.show_slur = show_slur;\n this.slur = undefined;\n this.voice = new Voice({\n num_beats: 4,\n beat_value: 4,\n resolution: Tables.RESOLUTION,\n }).setStrict(false);\n this.render_options = {\n slur_y_shift: 0,\n };\n this.beams = [];\n this.voice.addTickables(this.grace_notes);\n return this;\n }\n static get CATEGORY() {\n return Category.GraceNoteGroup;\n }\n /** Arranges groups inside a `ModifierContext`. */\n static format(gracenote_groups, state) {\n const group_spacing_stave = 4;\n const group_spacing_tab = 0;\n if (!gracenote_groups || gracenote_groups.length === 0)\n return false;\n const group_list = [];\n let prev_note = null;\n let shiftL = 0;\n for (let i = 0; i < gracenote_groups.length; ++i) {\n const gracenote_group = gracenote_groups[i];\n const note = gracenote_group.getNote();\n const is_stavenote = isStaveNote(note);\n const spacing = is_stavenote ? group_spacing_stave : group_spacing_tab;\n if (is_stavenote && note !== prev_note) {\n // Iterate through all notes to get the displaced pixels\n for (let n = 0; n < note.keys.length; ++n) {\n shiftL = Math.max(note.getLeftDisplacedHeadPx(), shiftL);\n }\n prev_note = note;\n }\n group_list.push({ shift: shiftL, gracenote_group, spacing });\n }\n // If first note left shift in case it is displaced\n let group_shift = group_list[0].shift;\n let formatWidth;\n for (let i = 0; i < group_list.length; ++i) {\n const gracenote_group = group_list[i].gracenote_group;\n gracenote_group.preFormat();\n formatWidth = gracenote_group.getWidth() + group_list[i].spacing;\n group_shift = Math.max(formatWidth, group_shift);\n }\n for (let i = 0; i < group_list.length; ++i) {\n const gracenote_group = group_list[i].gracenote_group;\n formatWidth = gracenote_group.getWidth() + group_list[i].spacing;\n gracenote_group.setSpacingFromNextModifier(group_shift - Math.min(formatWidth, group_shift));\n }\n state.left_shift += group_shift;\n return true;\n }\n preFormat() {\n if (this.preFormatted)\n return;\n if (!this.formatter) {\n this.formatter = new Formatter();\n }\n this.formatter.joinVoices([this.voice]).format([this.voice], 0, {});\n this.setWidth(this.formatter.getMinTotalWidth());\n this.preFormatted = true;\n }\n beamNotes(grace_notes) {\n grace_notes = grace_notes || this.grace_notes;\n if (grace_notes.length > 1) {\n const beam = new Beam(grace_notes);\n beam.render_options.beam_width = 3;\n beam.render_options.partial_beam_length = 4;\n this.beams.push(beam);\n }\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n getWidth() {\n return this.width;\n }\n getGraceNotes() {\n return this.grace_notes;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n L('Drawing grace note group for:', note);\n this.alignSubNotesWithNote(this.getGraceNotes(), note); // Modifier function\n // Draw grace notes.\n this.grace_notes.forEach((graceNote) => graceNote.setContext(ctx).draw());\n // Draw beams.\n this.beams.forEach((beam) => beam.setContext(ctx).draw());\n if (this.show_slur) {\n // Create and draw slur.\n const is_stavenote = isStaveNote(note);\n const TieClass = is_stavenote ? StaveTie : TabTie;\n this.slur = new TieClass({\n last_note: this.grace_notes[0],\n first_note: note,\n first_indices: [0],\n last_indices: [0],\n });\n this.slur.render_options.cp2 = 12;\n this.slur.render_options.y_shift = (is_stavenote ? 7 : 5) + this.render_options.slur_y_shift;\n this.slur.setContext(ctx).draw();\n }\n }\n}\nGraceNoteGroup.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2016\n//\n// ## Description\n//\n// This file implements `NoteSubGroup` which is used to format and\n// render notes as a `Modifier`\n// ex) ClefNote, TimeSigNote and BarNote.\nimport { Formatter } from './formatter';\nimport { Modifier } from './modifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { Voice } from './voice';\nexport class NoteSubGroup extends Modifier {\n constructor(subNotes) {\n super();\n this.preFormatted = false;\n this.position = Modifier.Position.LEFT;\n this.subNotes = subNotes;\n this.subNotes.forEach((subNote) => {\n subNote.setIgnoreTicks(false);\n });\n this.width = 0;\n this.formatter = new Formatter();\n this.voice = new Voice({\n num_beats: 4,\n beat_value: 4,\n resolution: Tables.RESOLUTION,\n }).setStrict(false);\n this.voice.addTickables(this.subNotes);\n }\n static get CATEGORY() {\n return Category.NoteSubGroup;\n }\n // Arrange groups inside a `ModifierContext`\n static format(groups, state) {\n if (!groups || groups.length === 0)\n return false;\n let width = 0;\n for (let i = 0; i < groups.length; ++i) {\n const group = groups[i];\n group.preFormat();\n width += group.getWidth();\n }\n state.left_shift += width;\n return true;\n }\n preFormat() {\n if (this.preFormatted)\n return;\n this.formatter.joinVoices([this.voice]).format([this.voice], 0);\n this.setWidth(this.formatter.getMinTotalWidth());\n this.preFormatted = true;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n getWidth() {\n return this.width;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n this.alignSubNotesWithNote(this.subNotes, note); // Modifier function\n this.subNotes.forEach((subNote) => subNote.setContext(ctx).drawWithStyle());\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// A formatter for abstract tickable objects, such as notes, chords,\n// tabs, etc.\nimport { Fraction } from './fraction';\nimport { RuntimeError } from './util';\n/**\n * TickContext formats abstract tickable objects, such as notes, chords, tabs, etc.\n */\nexport class TickContext {\n constructor(options) {\n this.preFormatted = false;\n this.postFormatted = false;\n this.tickID = options && options.tickID ? options.tickID : 0;\n this.currentTick = new Fraction(0, 1);\n this.maxTicks = new Fraction(0, 1);\n this.maxTickable = undefined; // Biggest tickable\n this.minTicks = undefined; // this can remian null if all tickables have ignore_ticks\n this.minTickable = undefined;\n this.padding = 1; // padding on each side (width += padding * 2)\n this.x = 0;\n this.xBase = 0; // base x position without xOffset\n this.xOffset = 0; // xBase and xOffset are an alternative way to describe x (x = xB + xO)\n this.tickables = []; // Notes, tabs, chords, lyrics.\n this.tickablesByVoice = {}; // Tickables indexed by voice number\n // Formatting metrics\n this.notePx = 0; // width of widest note in this context\n this.glyphPx = 0; // width of glyph (note head)\n this.leftDisplacedHeadPx = 0; // Extra left pixels for displaced notes\n this.rightDisplacedHeadPx = 0; // Extra right pixels for displaced notes\n this.modLeftPx = 0; // Left modifier pixels\n this.modRightPx = 0; // Right modifier pixels\n this.totalLeftPx = 0; // Total left pixels\n this.totalRightPx = 0; // Total right pixels\n this.tContexts = []; // Parent array of tick contexts\n this.width = 0;\n this.formatterMetrics = {\n // The freedom of a tickcontext is the distance it can move without colliding\n // with neighboring elements. A formatter can set these values during its\n // formatting pass, which a different formatter can then use to fine tune.\n freedom: { left: 0, right: 0 },\n };\n }\n static getNextContext(tContext) {\n const contexts = tContext.tContexts;\n const index = contexts.indexOf(tContext);\n if (index + 1 < contexts.length)\n return contexts[index + 1];\n }\n getTickID() {\n return this.tickID;\n }\n getX() {\n return this.x;\n }\n setX(x) {\n this.x = x;\n this.xBase = x;\n this.xOffset = 0;\n return this;\n }\n getXBase() {\n return this.xBase;\n } // use of xBase and xOffset is optional, avoids offset creep\n setXBase(xBase) {\n this.xBase = xBase;\n this.x = xBase + this.xOffset;\n }\n getXOffset() {\n return this.xOffset;\n }\n setXOffset(xOffset) {\n this.xOffset = xOffset;\n this.x = this.xBase + xOffset;\n }\n getWidth() {\n return this.width + this.padding * 2;\n }\n setPadding(padding) {\n this.padding = padding;\n return this;\n }\n getMaxTicks() {\n return this.maxTicks;\n }\n getMinTicks() {\n return this.minTicks;\n }\n getMaxTickable() {\n return this.maxTickable;\n }\n getMinTickable() {\n return this.minTickable;\n }\n getTickables() {\n return this.tickables;\n }\n /**\n * Introduced on 2020-04-17 as getTickablesForVoice(voiceIndex).\n * https://github.com/0xfe/vexflow/blame/dc97b0cc5bb93171c0038638c34362dc958222ca/src/tickcontext.js#L63\n * Renamed on 2021-08-05 to getTickableForVoice(voiceIndex). Method renamed to singular, since it returns one Tickable.\n */\n getTickableForVoice(voiceIndex) {\n return this.tickablesByVoice[voiceIndex];\n }\n getTickablesByVoice() {\n return this.tickablesByVoice;\n }\n getCenterAlignedTickables() {\n return this.tickables.filter((tickable) => tickable.isCenterAligned());\n }\n /** Gets widths context, note and left/right modifiers for formatting. */\n getMetrics() {\n const { width, glyphPx, notePx, leftDisplacedHeadPx, rightDisplacedHeadPx, modLeftPx, modRightPx, totalLeftPx, totalRightPx, } = this;\n return {\n width,\n glyphPx,\n notePx,\n leftDisplacedHeadPx,\n rightDisplacedHeadPx,\n modLeftPx,\n modRightPx,\n totalLeftPx,\n totalRightPx,\n };\n }\n getCurrentTick() {\n return this.currentTick;\n }\n setCurrentTick(tick) {\n this.currentTick = tick;\n this.preFormatted = false;\n }\n addTickable(tickable, voiceIndex) {\n if (!tickable) {\n throw new RuntimeError('BadArgument', 'Invalid tickable added.');\n }\n if (!tickable.shouldIgnoreTicks()) {\n const ticks = tickable.getTicks();\n if (ticks.greaterThan(this.maxTicks)) {\n this.maxTicks = ticks.clone();\n this.maxTickable = tickable;\n }\n if (this.minTicks == null) {\n this.minTicks = ticks.clone();\n this.minTickable = tickable;\n }\n else if (ticks.lessThan(this.minTicks)) {\n this.minTicks = ticks.clone();\n this.minTickable = tickable;\n }\n }\n tickable.setTickContext(this);\n this.tickables.push(tickable);\n this.tickablesByVoice[voiceIndex || 0] = tickable;\n this.preFormatted = false;\n return this;\n }\n preFormat() {\n if (this.preFormatted)\n return this;\n for (let i = 0; i < this.tickables.length; ++i) {\n const tickable = this.tickables[i];\n tickable.preFormat();\n const metrics = tickable.getMetrics();\n // Maintain max displaced head pixels from all tickables in the context\n this.leftDisplacedHeadPx = Math.max(this.leftDisplacedHeadPx, metrics.leftDisplacedHeadPx);\n this.rightDisplacedHeadPx = Math.max(this.rightDisplacedHeadPx, metrics.rightDisplacedHeadPx);\n // Maintain the widest note for all tickables in the context\n this.notePx = Math.max(this.notePx, metrics.notePx);\n // Maintain the widest note head\n this.glyphPx = Math.max(this.glyphPx, metrics.glyphWidth || 0);\n // Total modifier shift\n this.modLeftPx = Math.max(this.modLeftPx, metrics.modLeftPx);\n this.modRightPx = Math.max(this.modRightPx, metrics.modRightPx);\n // Total shift\n this.totalLeftPx = Math.max(this.totalLeftPx, metrics.modLeftPx + metrics.leftDisplacedHeadPx);\n this.totalRightPx = Math.max(this.totalRightPx, metrics.modRightPx + metrics.rightDisplacedHeadPx);\n // Recalculate the tick context total width\n this.width = this.notePx + this.totalLeftPx + this.totalRightPx;\n }\n return this;\n }\n postFormat() {\n if (this.postFormatted)\n return this;\n this.postFormatted = true;\n return this;\n }\n getFormatterMetrics() {\n return this.formatterMetrics;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Cyril Silverman\n// MIT License\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { TickContext } from './tickcontext';\nimport { Category, isTabNote } from './typeguard';\nimport { defined, log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Ornament.DEBUG)\n log('Vex.Flow.Ornament', args);\n}\n/**\n * Ornament implements ornaments as modifiers that can be\n * attached to notes. The complete list of ornaments is available in\n * `tables.ts` under `Vex.Flow.ornamentCodes`.\n *\n * See `tests/ornament_tests.ts` for usage examples.\n */\nexport class Ornament extends Modifier {\n /**\n * Create a new ornament of type `type`, which is an entry in\n * `Vex.Flow.ornamentCodes` in `tables.ts`.\n */\n constructor(type) {\n super();\n this.type = type;\n this.delayed = false;\n this.render_options = {\n font_scale: 38,\n accidentalLowerPadding: 3,\n accidentalUpperPadding: 3,\n };\n this.ornament = Tables.ornamentCodes(this.type);\n // new ornaments have their origin at the origin, and have more specific\n // metrics. Legacy ornaments do some\n // x scaling, and have hard-coded metrics\n const metrics = this.getMetrics();\n // some jazz ornaments are above or below depending on stem direction.\n this.adjustForStemDirection = false;\n // some jazz ornaments like falls are supposed to overlap with future bars\n // and so we report a different width than they actually take up.\n this.reportedWidth = metrics && metrics.reportedWidth ? metrics.reportedWidth : 0;\n this.stemUpYOffset = metrics && metrics.stemUpYOffset ? metrics.stemUpYOffset : 0;\n this.ornamentAlignWithNoteHead = Ornament.ornamentAlignWithNoteHead.indexOf(this.type) >= 0;\n if (!this.ornament) {\n throw new RuntimeError('ArgumentError', `Ornament not found: '${this.type}'`);\n }\n this.x_shift = metrics ? metrics.xOffset : 0;\n this.y_shift = metrics ? metrics.yOffset : 0;\n this.glyph = new Glyph(this.ornament.code, this.render_options.font_scale, {\n category: `ornament.${this.ornament.code}`,\n });\n // Is this a jazz ornament that goes between this note and the next note.\n if (Ornament.ornamentNoteTransition.indexOf(this.type) >= 0) {\n this.delayed = true;\n }\n // Legacy ornaments need this. I don't know why, but horizontal spacing issues\n // happen if I don't set it.\n if (!metrics) {\n this.glyph.setOrigin(0.5, 1.0); // FIXME: SMuFL won't require a vertical origin shift\n }\n }\n /** Ornaments category string. */\n static get CATEGORY() {\n return Category.Ornament;\n }\n /** Arrange ornaments inside `ModifierContext` */\n static format(ornaments, state) {\n if (!ornaments || ornaments.length === 0)\n return false;\n let width = 0; // width is used by ornaments, which are always centered on the note head\n let right_shift = state.right_shift; // jazz ornaments calculate r/l shift separately\n let left_shift = state.left_shift;\n let yOffset = 0;\n for (let i = 0; i < ornaments.length; ++i) {\n const ornament = ornaments[i];\n const increment = 2;\n if (Ornament.ornamentRelease.indexOf(ornament.type) >= 0) {\n ornament.x_shift += right_shift + 2;\n }\n if (Ornament.ornamentAttack.indexOf(ornament.type) >= 0) {\n ornament.x_shift -= left_shift + 2;\n }\n if (ornament.reportedWidth && ornament.x_shift < 0) {\n left_shift += ornament.reportedWidth;\n }\n else if (ornament.reportedWidth && ornament.x_shift > 0) {\n right_shift += ornament.reportedWidth;\n }\n else {\n width = Math.max(ornament.getWidth(), width);\n }\n // articulations above/below the line can be stacked.\n if (Ornament.ornamentArticulation.indexOf(ornament.type) >= 0) {\n // Unfortunately we don't know the stem direction. So we base it\n // on the line number, but also allow it to be overridden.\n const ornamentNote = defined(ornament.note, 'NoAttachedNote');\n if (ornamentNote.getLineNumber() >= 3 || ornament.getPosition() === Modifier.Position.ABOVE) {\n state.top_text_line += increment;\n ornament.y_shift += yOffset;\n yOffset -= ornament.glyph.bbox.getH();\n }\n else {\n state.text_line += increment;\n ornament.y_shift += yOffset;\n yOffset += ornament.glyph.bbox.getH();\n }\n }\n else {\n if (ornament.getPosition() === Modifier.Position.ABOVE) {\n ornament.setTextLine(state.top_text_line);\n state.top_text_line += increment;\n }\n else {\n ornament.setTextLine(state.text_line);\n state.text_line += increment;\n }\n }\n }\n // Note: 'legit' ornaments don't consider other modifiers when calculating their\n // X position, but jazz ornaments sometimes need to.\n state.left_shift = left_shift + width / 2;\n state.right_shift = right_shift + width / 2;\n return true;\n }\n /**\n * ornamentNoteTransition means the jazz ornament represents an effect from one note to another,\n * these are generally on the top of the staff.\n */\n static get ornamentNoteTransition() {\n return ['flip', 'jazzTurn', 'smear'];\n }\n /**\n * ornamentAttack indicates something that happens in the attach, placed before the note and\n * any accidentals\n */\n static get ornamentAttack() {\n return ['scoop'];\n }\n /**\n * The ornament is aligned based on the note head, but without regard to whether the\n * stem goes up or down.\n */\n static get ornamentAlignWithNoteHead() {\n return ['doit', 'fall', 'fallLong', 'doitLong', 'bend', 'plungerClosed', 'plungerOpen', 'scoop'];\n }\n /**\n * An ornament that happens on the release of the note, generally placed after the\n * note and overlapping the next beat/measure..\n */\n static get ornamentRelease() {\n return ['doit', 'fall', 'fallLong', 'doitLong', 'jazzTurn', 'smear', 'flip'];\n }\n /** ornamentArticulation goes above/below the note based on space availablity */\n static get ornamentArticulation() {\n return ['bend', 'plungerClosed', 'plungerOpen'];\n }\n /**\n * Legacy ornaments have hard-coded metrics. If additional ornament types are\n * added, get their metrics here.\n */\n // eslint-disable-next-line\n getMetrics() {\n return Tables.currentMusicFont().getMetrics().glyphs.jazzOrnaments[this.ornament.code];\n }\n /** Set whether the ornament is to be delayed. */\n setDelayed(delayed) {\n this.delayed = delayed;\n return this;\n }\n /** Set the upper accidental for the ornament. */\n setUpperAccidental(accid) {\n const scale = this.render_options.font_scale / 1.3;\n this.accidentalUpper = new Glyph(Tables.accidentalCodes(accid).code, scale);\n this.accidentalUpper.setOrigin(0.5, 1.0);\n return this;\n }\n /** Set the lower accidental for the ornament. */\n setLowerAccidental(accid) {\n const scale = this.render_options.font_scale / 1.3;\n this.accidentalLower = new Glyph(Tables.accidentalCodes(accid).code, scale);\n this.accidentalLower.setOrigin(0.5, 1.0);\n return this;\n }\n /** Render ornament in position next to note. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const stemDir = note.getStemDirection();\n const stave = note.checkStave();\n const classString = Object.keys(this.getAttribute('classes')).join(' ');\n ctx.openGroup(classString, this.getAttribute('id'));\n // Get stem extents\n const stemExtents = note.checkStem().getExtents();\n let y = stemDir === Stem.DOWN ? stemExtents.baseY : stemExtents.topY;\n // TabNotes don't have stems attached to them. Tab stems are rendered outside the stave.\n if (isTabNote(note)) {\n if (note.hasStem()) {\n if (stemDir === Stem.DOWN) {\n y = stave.getYForTopText(this.text_line);\n }\n }\n else {\n // Without a stem\n y = stave.getYForTopText(this.text_line);\n }\n }\n const isPlacedOnNoteheadSide = stemDir === Stem.DOWN;\n const spacing = stave.getSpacingBetweenLines();\n let lineSpacing = 1;\n // Beamed stems are longer than quarter note stems, adjust accordingly\n if (!isPlacedOnNoteheadSide && note.hasBeam()) {\n lineSpacing += 0.5;\n }\n const totalSpacing = spacing * (this.text_line + lineSpacing);\n const glyphYBetweenLines = y - totalSpacing;\n // Get initial coordinates for the modifier position\n const start = note.getModifierStartXY(this.position, this.index);\n let glyphX = start.x;\n // If the ornament is aligned with the note head, don't consider the stave y\n // but use the 'natural' modifier y\n let glyphY = this.ornamentAlignWithNoteHead\n ? start.y\n : Math.min(stave.getYForTopText(this.text_line), glyphYBetweenLines);\n glyphY += this.y_shift;\n // Ajdust x position if ornament is delayed\n if (this.delayed) {\n let delayXShift = 0;\n const startX = glyphX - (stave.getX() - 10);\n if (this.delayXShift !== undefined) {\n delayXShift = this.delayXShift;\n }\n else {\n delayXShift += this.glyph.getMetrics().width / 2;\n const nextContext = TickContext.getNextContext(note.getTickContext());\n if (nextContext) {\n delayXShift += (nextContext.getX() - startX) * 0.5;\n }\n else {\n delayXShift += (stave.getX() + stave.getWidth() - startX) * 0.5;\n }\n this.delayXShift = delayXShift;\n }\n glyphX += delayXShift;\n }\n L('Rendering ornament: ', this.ornament, glyphX, glyphY);\n if (this.accidentalLower) {\n this.accidentalLower.render(ctx, glyphX, glyphY);\n glyphY -= this.accidentalLower.getMetrics().height;\n glyphY -= this.render_options.accidentalLowerPadding;\n }\n if (this.stemUpYOffset && note.hasStem() && note.getStemDirection() === 1) {\n glyphY += this.stemUpYOffset;\n }\n if (note.getLineNumber() < 5 && Ornament.ornamentNoteTransition.indexOf(this.type) >= 0) {\n glyphY = note.checkStave().getBoundingBox().getY() + 40;\n }\n this.glyph.render(ctx, glyphX + this.x_shift, glyphY);\n if (this.accidentalUpper) {\n glyphY -= this.glyph.getMetrics().height + this.render_options.accidentalUpperPadding;\n this.accidentalUpper.render(ctx, glyphX, glyphY);\n }\n ctx.closeGroup();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Ornament.DEBUG` to `true`. */\nOrnament.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Rodrigo Vilar\n// MIT License\nimport { Glyph } from './glyph';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { Tables } from './tables';\nimport { Category, isGraceNote } from './typeguard';\n/** Parenthesis implements parenthesis modifiers for notes. */\nexport class Parenthesis extends Modifier {\n /**\n * Constructor\n *\n * @param position Modifier.Position.LEFT (default) or Modifier.Position.RIGHT\n */\n constructor(position) {\n super();\n this.position = position !== null && position !== void 0 ? position : Modifier.Position.LEFT;\n this.point = Tables.currentMusicFont().lookupMetric('parenthesis.default.point');\n this.setWidth(Tables.currentMusicFont().lookupMetric('parenthesis.default.width'));\n }\n static get CATEGORY() {\n return Category.Parenthesis;\n }\n /** Add parentheses to the notes. */\n static buildAndAttach(notes) {\n for (const note of notes) {\n for (let i = 0; i < note.keys.length; i++) {\n note.addModifier(new Parenthesis(ModifierPosition.LEFT), i);\n note.addModifier(new Parenthesis(ModifierPosition.RIGHT), i);\n }\n }\n }\n /** Arrange parentheses inside a ModifierContext. */\n static format(parentheses, state) {\n if (!parentheses || parentheses.length === 0)\n return false;\n let x_widthL = 0;\n let x_widthR = 0;\n for (let i = 0; i < parentheses.length; ++i) {\n const parenthesis = parentheses[i];\n const note = parenthesis.getNote();\n const pos = parenthesis.getPosition();\n const index = parenthesis.checkIndex();\n let shift = 0;\n if (pos === ModifierPosition.RIGHT) {\n shift = note.getRightParenthesisPx(index);\n x_widthR = x_widthR > shift + parenthesis.width ? x_widthR : shift + parenthesis.width;\n }\n if (pos === ModifierPosition.LEFT) {\n shift = note.getLeftParenthesisPx(index);\n x_widthL = x_widthL > shift + parenthesis.width ? x_widthL : shift + parenthesis.width;\n }\n parenthesis.setXShift(shift);\n }\n state.left_shift += x_widthL;\n state.right_shift += x_widthR;\n return true;\n }\n /** Set the associated note. */\n setNote(note) {\n this.note = note;\n this.point = Tables.currentMusicFont().lookupMetric('parenthesis.default.point');\n this.setWidth(Tables.currentMusicFont().lookupMetric('parenthesis.default.width'));\n if (isGraceNote(note)) {\n this.point = Tables.currentMusicFont().lookupMetric('parenthesis.gracenote.point');\n this.setWidth(Tables.currentMusicFont().lookupMetric('parenthesis.gracenote.width'));\n }\n return this;\n }\n /** Render the parenthesis. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(this.position, this.index, { forceFlagRight: true });\n const x = start.x + this.x_shift;\n const y = start.y + this.y_shift;\n if (this.position == Modifier.Position.RIGHT) {\n Glyph.renderGlyph(ctx, x + 1, y, this.point, 'noteheadParenthesisRight', {\n category: `noteHead.standard.noteheadParenthesisRight`,\n });\n }\n else if (this.position == Modifier.Position.LEFT) {\n Glyph.renderGlyph(ctx, x - 2, y, this.point, 'noteheadParenthesisLeft', {\n category: `noteHead.standard.noteheadParenthesisLeft`,\n });\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { BoundingBox } from './boundingbox';\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (NoteHead.DEBUG)\n log('Vex.Flow.NoteHead', args);\n}\n/**\n * Draw slashnote head manually. No glyph exists for this.\n * @param ctx the Canvas context\n * @param duration the duration of the note. ex: \"4\"\n * @param x the x coordinate to draw at\n * @param y the y coordinate to draw at\n * @param stem_direction the direction of the stem\n */\nfunction drawSlashNoteHead(ctx, duration, x, y, stem_direction, staveSpace) {\n const width = Tables.SLASH_NOTEHEAD_WIDTH;\n ctx.save();\n ctx.setLineWidth(Tables.STEM_WIDTH);\n let fill = false;\n if (Tables.durationToNumber(duration) > 2) {\n fill = true;\n }\n if (!fill)\n x -= (Tables.STEM_WIDTH / 2) * stem_direction;\n ctx.beginPath();\n ctx.moveTo(x, y + staveSpace);\n ctx.lineTo(x, y + 1);\n ctx.lineTo(x + width, y - staveSpace);\n ctx.lineTo(x + width, y);\n ctx.lineTo(x, y + staveSpace);\n ctx.closePath();\n if (fill) {\n ctx.fill();\n }\n else {\n ctx.stroke();\n }\n if (Tables.durationToFraction(duration).equals(0.5)) {\n const breve_lines = [-3, -1, width + 1, width + 3];\n for (let i = 0; i < breve_lines.length; i++) {\n ctx.beginPath();\n ctx.moveTo(x + breve_lines[i], y - 10);\n ctx.lineTo(x + breve_lines[i], y + 11);\n ctx.stroke();\n }\n }\n ctx.restore();\n}\n/**\n * `NoteHeads` are typically not manipulated\n * directly, but used internally in `StaveNote`.\n *\n * See `tests/notehead_tests.ts` for usage examples.\n */\nexport class NoteHead extends Note {\n constructor(noteStruct) {\n super(noteStruct);\n this.custom_glyph = false;\n this.stem_up_x_offset = 0;\n this.stem_down_x_offset = 0;\n this.index = noteStruct.index;\n this.x = noteStruct.x || 0;\n this.y = noteStruct.y || 0;\n if (noteStruct.note_type)\n this.noteType = noteStruct.note_type;\n this.displaced = noteStruct.displaced || false;\n this.stem_direction = noteStruct.stem_direction || Stem.UP;\n this.line = noteStruct.line || 0;\n // Get glyph code based on duration and note type. This could be\n // regular notes, rests, or other custom codes.\n this.glyph = Tables.getGlyphProps(this.duration, this.noteType);\n defined(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`);\n this.glyph_code = this.glyph.code_head;\n this.x_shift = noteStruct.x_shift || 0;\n if (noteStruct.custom_glyph_code) {\n this.custom_glyph = true;\n this.glyph_code = noteStruct.custom_glyph_code;\n this.stem_up_x_offset = noteStruct.stem_up_x_offset || 0;\n this.stem_down_x_offset = noteStruct.stem_down_x_offset || 0;\n }\n this.style = noteStruct.style;\n this.slashed = noteStruct.slashed || false;\n this.render_options = Object.assign(Object.assign({}, this.render_options), { \n // font size for note heads\n glyph_font_scale: noteStruct.glyph_font_scale || Tables.NOTATION_FONT_SCALE });\n this.setWidth(this.glyph.getWidth(this.render_options.glyph_font_scale));\n }\n static get CATEGORY() {\n return Category.NoteHead;\n }\n /** Get the width of the notehead. */\n getWidth() {\n return this.width;\n }\n /** Determine if the notehead is displaced. */\n isDisplaced() {\n return this.displaced === true;\n }\n /** Get the glyph data. */\n getGlyph() {\n return this.glyph;\n }\n /** Set the X coordinate. */\n setX(x) {\n this.x = x;\n return this;\n }\n /** Get the Y coordinate. */\n getY() {\n return this.y;\n }\n /** Set the Y coordinate. */\n setY(y) {\n this.y = y;\n return this;\n }\n /** Get the stave line the notehead is placed on. */\n getLine() {\n return this.line;\n }\n /** Set the stave line the notehead is placed on. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Get the canvas `x` coordinate position of the notehead. */\n getAbsoluteX() {\n // If the note has not been preformatted, then get the static x value\n // Otherwise, it's been formatted and we should use it's x value relative\n // to its tick context\n const x = !this.preFormatted ? this.x : super.getAbsoluteX();\n // For a more natural displaced notehead, we adjust the displacement amount\n // by half the stem width in order to maintain a slight overlap with the stem\n const displacementStemAdjustment = Stem.WIDTH / 2;\n const musicFont = Tables.currentMusicFont();\n const fontShift = musicFont.lookupMetric('notehead.shiftX', 0) * this.stem_direction;\n const displacedFontShift = musicFont.lookupMetric('noteHead.displaced.shiftX', 0) * this.stem_direction;\n return (x +\n fontShift +\n (this.displaced ? (this.width - displacementStemAdjustment) * this.stem_direction + displacedFontShift : 0));\n }\n /** Get the `BoundingBox` for the `NoteHead`. */\n getBoundingBox() {\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call getBoundingBox on an unformatted note.\");\n }\n const spacing = this.checkStave().getSpacingBetweenLines();\n const half_spacing = spacing / 2;\n const min_y = this.y - half_spacing;\n return new BoundingBox(this.getAbsoluteX(), min_y, this.width, spacing);\n }\n /** Set notehead to a provided `stave`. */\n setStave(stave) {\n const line = this.getLine();\n this.stave = stave;\n if (this.stave) {\n this.setY(this.stave.getYForNote(line));\n this.setContext(this.stave.getContext());\n }\n return this;\n }\n /** Pre-render formatting. */\n preFormat() {\n if (this.preFormatted)\n return this;\n const width = this.getWidth() + this.leftDisplacedHeadPx + this.rightDisplacedHeadPx;\n this.setWidth(width);\n this.preFormatted = true;\n return this;\n }\n /** Draw the notehead. */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n let head_x = this.getAbsoluteX();\n if (this.custom_glyph) {\n // head_x += this.x_shift;\n head_x += this.stem_direction === Stem.UP ? this.stem_up_x_offset : this.stem_down_x_offset;\n }\n const y = this.y;\n L(\"Drawing note head '\", this.noteType, this.duration, \"' at\", head_x, y);\n // Begin and end positions for head.\n const stem_direction = this.stem_direction;\n const glyph_font_scale = this.render_options.glyph_font_scale;\n if (this.style) {\n this.applyStyle(ctx);\n }\n const categorySuffix = `${this.glyph_code}Stem${stem_direction === Stem.UP ? 'Up' : 'Down'}`;\n if (this.noteType === 's') {\n const staveSpace = this.checkStave().getSpacingBetweenLines();\n drawSlashNoteHead(ctx, this.duration, head_x, y, stem_direction, staveSpace);\n }\n else {\n Glyph.renderGlyph(ctx, head_x, y, glyph_font_scale, this.glyph_code, {\n category: this.custom_glyph ? `noteHead.custom.${categorySuffix}` : `noteHead.standard.${categorySuffix}`,\n });\n }\n if (this.style) {\n this.restoreStyle(ctx);\n }\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.NoteHead.DEBUG` to `true`. */\nNoteHead.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// `StemmableNote` is an abstract interface for notes with optional stems.\n// Examples of stemmable notes are `StaveNote` and `TabNote`\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StemmableNote extends Note {\n constructor(noteStruct) {\n super(noteStruct);\n }\n static get CATEGORY() {\n return Category.StemmableNote;\n }\n // Get and set the note's `Stem`\n getStem() {\n return this.stem;\n }\n checkStem() {\n if (!this.stem) {\n throw new RuntimeError('NoStem', 'No stem attached to instance');\n }\n return this.stem;\n }\n setStem(stem) {\n this.stem = stem;\n return this;\n }\n // Builds and sets a new stem\n buildStem() {\n const stem = new Stem();\n this.setStem(stem);\n return this;\n }\n buildFlag(category = 'flag') {\n const { glyph } = this;\n if (this.hasFlag()) {\n const flagCode = this.getStemDirection() === Stem.DOWN ? glyph.code_flag_downstem : glyph.code_flag_upstem;\n this.flag = new Glyph(flagCode, this.render_options.glyph_font_scale, { category });\n }\n }\n // Get the custom glyph associated with the outer note head on the base of the stem.\n getBaseCustomNoteHeadGlyph() {\n if (this.getStemDirection() === Stem.DOWN) {\n return this.customGlyphs[this.customGlyphs.length - 1];\n }\n else {\n return this.customGlyphs[0];\n }\n }\n // Get the full length of stem\n getStemLength() {\n return Stem.HEIGHT + this.getStemExtension();\n }\n // Get the number of beams for this duration\n getBeamCount() {\n const glyph = this.getGlyph();\n if (glyph) {\n return glyph.beam_count;\n }\n else {\n return 0;\n }\n }\n // Get the minimum length of stem\n getStemMinimumLength() {\n const frac = Tables.durationToFraction(this.duration);\n let length = frac.value() <= 1 ? 0 : 20;\n // if note is flagged, cannot shorten beam\n switch (this.duration) {\n case '8':\n if (this.beam == undefined)\n length = 35;\n break;\n case '16':\n length = this.beam == undefined ? 35 : 25;\n break;\n case '32':\n length = this.beam == undefined ? 45 : 35;\n break;\n case '64':\n length = this.beam == undefined ? 50 : 40;\n break;\n case '128':\n length = this.beam == undefined ? 55 : 45;\n break;\n default:\n break;\n }\n return length;\n }\n // Get/set the direction of the stem\n getStemDirection() {\n if (!this.stem_direction)\n throw new RuntimeError('NoStem', 'No stem attached to this note.');\n return this.stem_direction;\n }\n setStemDirection(direction) {\n if (!direction)\n direction = Stem.UP;\n if (direction !== Stem.UP && direction !== Stem.DOWN) {\n throw new RuntimeError('BadArgument', `Invalid stem direction: ${direction}`);\n }\n this.stem_direction = direction;\n // Reset and reformat everything. Flag has to be built before calling getStemExtension.\n this.reset();\n if (this.hasFlag()) {\n this.buildFlag();\n }\n this.beam = undefined;\n if (this.stem) {\n this.stem.setDirection(direction);\n this.stem.setExtension(this.getStemExtension());\n // Lookup the base custom notehead (closest to the base of the stem) to extend or shorten\n // the stem appropriately. If there's no custom note head, lookup the standard notehead.\n const glyph = this.getBaseCustomNoteHeadGlyph() || this.getGlyph();\n // Get the font-specific customizations for the note heads.\n const offsets = Tables.currentMusicFont().lookupMetric(`stem.noteHead.${glyph.code_head}`, {\n offsetYBaseStemUp: 0,\n offsetYTopStemUp: 0,\n offsetYBaseStemDown: 0,\n offsetYTopStemDown: 0,\n });\n // Configure the stem to use these offsets.\n this.stem.setOptions({\n stem_up_y_offset: offsets.offsetYTopStemUp,\n stem_down_y_offset: offsets.offsetYTopStemDown,\n stem_up_y_base_offset: offsets.offsetYBaseStemUp,\n stem_down_y_base_offset: offsets.offsetYBaseStemDown, // glyph.stem_down_y_base_offset,\n });\n }\n if (this.preFormatted) {\n this.preFormat();\n }\n return this;\n }\n // Get the `x` coordinate of the stem\n getStemX() {\n const x_begin = this.getAbsoluteX() + this.x_shift;\n const x_end = this.getAbsoluteX() + this.x_shift + this.getGlyphWidth();\n const stem_x = this.stem_direction === Stem.DOWN ? x_begin : x_end;\n return stem_x;\n }\n // Get the `x` coordinate for the center of the glyph.\n // Used for `TabNote` stems and stemlets over rests\n getCenterGlyphX() {\n return this.getAbsoluteX() + this.x_shift + this.getGlyphWidth() / 2;\n }\n // Get the stem extension for the current duration\n getStemExtension() {\n const glyph = this.getGlyph();\n if (this.stem_extension_override != undefined) {\n return this.stem_extension_override;\n }\n // Use stem_beam_extension with beams\n if (this.beam) {\n return glyph.stem_beam_extension;\n }\n const flagCode = this.getStemDirection() === Stem.DOWN ? this.glyph.code_flag_downstem : this.glyph.code_flag_upstem;\n return Math.abs(Tables.currentMusicFont().lookupMetric(`glyphs.flag.${flagCode}.shiftY`, 0));\n }\n // Set the stem length to a specific. Will override the default length.\n setStemLength(height) {\n this.stem_extension_override = height - Stem.HEIGHT;\n return this;\n }\n // Get the top and bottom `y` values of the stem.\n getStemExtents() {\n if (!this.stem)\n throw new RuntimeError('NoStem', 'No stem attached to this note.');\n return this.stem.getExtents();\n }\n /** Gets the `y` value for the top modifiers at a specific `textLine`. */\n getYForTopText(textLine) {\n const stave = this.checkStave();\n if (this.hasStem()) {\n const extents = this.getStemExtents();\n if (!extents)\n throw new RuntimeError('InvalidState', 'Stem does not have extents.');\n return Math.min(stave.getYForTopText(textLine), extents.topY - this.render_options.annotation_spacing * (textLine + 1));\n }\n else {\n return stave.getYForTopText(textLine);\n }\n }\n /** Gets the `y` value for the bottom modifiers at a specific `textLine`. */\n getYForBottomText(textLine) {\n const stave = this.checkStave();\n if (this.hasStem()) {\n const extents = this.getStemExtents();\n if (!extents)\n throw new RuntimeError('InvalidState', 'Stem does not have extents.');\n return Math.max(stave.getYForTopText(textLine), extents.baseY + this.render_options.annotation_spacing * textLine);\n }\n else {\n return stave.getYForBottomText(textLine);\n }\n }\n hasFlag() {\n return Tables.getGlyphProps(this.duration).flag && !this.beam;\n }\n /** Post formats the note. */\n postFormat() {\n var _a;\n (_a = this.beam) === null || _a === void 0 ? void 0 : _a.postFormat();\n this.postFormatted = true;\n return this;\n }\n /** Renders the stem onto the canvas. */\n drawStem(stemOptions) {\n var _a;\n this.checkContext();\n this.setRendered();\n this.setStem(new Stem(stemOptions));\n (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setContext(this.getContext()).draw();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// This file implements notes for standard notation. This consists of one or\n// more `NoteHeads`, an optional stem, and an optional flag.\n//\n// Throughout these comments, a \"note\" refers to the entire `StaveNote`,\n// and a \"key\" refers to a specific pitch/notehead within a note.\n//\n// See `tests/stavenote_tests.ts` for usage examples.\nimport { BoundingBox } from './boundingbox';\nimport { Modifier } from './modifier';\nimport { NoteHead } from './notehead';\nimport { Stem } from './stem';\nimport { StemmableNote } from './stemmablenote';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, log, midLine, RuntimeError, warn } from './util';\nfunction showDeprecationWarningForNoteHeads() {\n // eslint-disable-next-line\n console.warn('StaveNote.note_heads is deprecated. Use StaveNote.noteHeads instead.', 'This accessor will be removed in VexFlow 5.0.');\n}\n// To enable logging for this class. Set `Vex.Flow.StaveNote.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (StaveNote.DEBUG)\n log('Vex.Flow.StaveNote', args);\n}\nconst isInnerNoteIndex = (note, index) => index === (note.getStemDirection() === Stem.UP ? note.keyProps.length - 1 : 0);\n// Helper methods for rest positioning in ModifierContext.\nfunction shiftRestVertical(rest, note, dir) {\n const delta = dir;\n rest.line += delta;\n rest.maxLine += delta;\n rest.minLine += delta;\n rest.note.setKeyLine(0, rest.note.getKeyLine(0) + delta);\n}\n// Called from formatNotes :: center a rest between two notes\nfunction centerRest(rest, noteU, noteL) {\n const delta = rest.line - midLine(noteU.minLine, noteL.maxLine);\n rest.note.setKeyLine(0, rest.note.getKeyLine(0) - delta);\n rest.line -= delta;\n rest.maxLine -= delta;\n rest.minLine -= delta;\n}\nexport class StaveNote extends StemmableNote {\n constructor(noteStruct) {\n var _a, _b, _c;\n super(noteStruct);\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // INSTANCE MEMBERS\n this.minLine = 0;\n this.maxLine = 0;\n this.ledgerLineStyle = {};\n this.clef = (_a = noteStruct.clef) !== null && _a !== void 0 ? _a : 'treble';\n this.octave_shift = (_b = noteStruct.octave_shift) !== null && _b !== void 0 ? _b : 0;\n // Pull note rendering properties.\n this.glyph = Tables.getGlyphProps(this.duration, this.noteType);\n defined(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`);\n // if true, displace note to right\n this.displaced = false;\n this.dot_shiftY = 0;\n // for displaced ledger lines\n this.use_default_head_x = false;\n // Drawing\n this._noteHeads = [];\n this.modifiers = [];\n this.render_options = Object.assign(Object.assign({}, this.render_options), { \n // font size for note heads and rests\n glyph_font_scale: noteStruct.glyph_font_scale || Tables.NOTATION_FONT_SCALE, \n // number of stroke px to the left and right of head\n stroke_px: noteStruct.stroke_px || StaveNote.LEDGER_LINE_OFFSET });\n this.calculateKeyProps();\n this.buildStem();\n // Set the stem direction\n if (noteStruct.auto_stem) {\n this.autoStem();\n }\n else {\n this.setStemDirection((_c = noteStruct.stem_direction) !== null && _c !== void 0 ? _c : Stem.UP);\n }\n this.reset();\n this.buildFlag();\n }\n static get CATEGORY() {\n return Category.StaveNote;\n }\n /**\n * @deprecated Use Stem.UP.\n */\n static get STEM_UP() {\n return Stem.UP;\n }\n /**\n * @deprecated Use Stem.DOWN.\n */\n static get STEM_DOWN() {\n return Stem.DOWN;\n }\n static get LEDGER_LINE_OFFSET() {\n return 3;\n }\n static get minNoteheadPadding() {\n const musicFont = Tables.currentMusicFont();\n return musicFont.lookupMetric('glyphs.noteHead.minPadding');\n }\n /** Format notes inside a ModifierContext. */\n static format(notes, state) {\n if (!notes || notes.length < 2)\n return false;\n const notesList = [];\n for (let i = 0; i < notes.length; i++) {\n const props = notes[i].getKeyProps();\n const line = props[0].line;\n let minL = props[props.length - 1].line;\n const stemDirection = notes[i].getStemDirection();\n const stemMax = notes[i].getStemLength() / 10;\n const stemMin = notes[i].getStemMinimumLength() / 10;\n let maxL;\n if (notes[i].isRest()) {\n maxL = line + notes[i].glyph.line_above;\n minL = line - notes[i].glyph.line_below;\n }\n else {\n maxL = stemDirection === 1 ? props[props.length - 1].line + stemMax : props[props.length - 1].line;\n minL = stemDirection === 1 ? props[0].line : props[0].line - stemMax;\n }\n notesList.push({\n line: props[0].line,\n maxLine: maxL,\n minLine: minL,\n isrest: notes[i].isRest(),\n stemDirection: stemDirection,\n stemMax,\n stemMin,\n voice_shift: notes[i].getVoiceShiftWidth(),\n is_displaced: notes[i].isDisplaced(),\n note: notes[i],\n });\n }\n const voices = notesList.length;\n let noteU = notesList[0];\n const noteM = voices > 2 ? notesList[1] : undefined;\n let noteL = voices > 2 ? notesList[2] : notesList[1];\n // for two voice backward compatibility, ensure upper voice is stems up\n // for three voices, the voices must be in order (upper, middle, lower)\n if (voices === 2 && noteU.stemDirection === -1 && noteL.stemDirection === 1) {\n noteU = notesList[1];\n noteL = notesList[0];\n }\n const voiceXShift = Math.max(noteU.voice_shift, noteL.voice_shift);\n let xShift = 0;\n // Test for two voice note intersection\n if (voices === 2) {\n const lineSpacing = noteU.stemDirection === noteL.stemDirection ? 0.0 : 0.5;\n if (noteU.minLine <= noteL.maxLine + lineSpacing) {\n if (noteU.isrest) {\n // shift rest up\n shiftRestVertical(noteU, noteL, 1);\n }\n else if (noteL.isrest) {\n // shift rest down\n shiftRestVertical(noteL, noteU, -1);\n }\n else if (noteU.stemDirection === noteL.stemDirection) {\n // upper voice is middle voice, so shift it right\n xShift = voiceXShift + 2;\n noteU.note.setXShift(xShift);\n }\n else {\n // shift lower voice right\n xShift = voiceXShift + 2;\n noteL.note.setXShift(xShift);\n }\n }\n // format complete\n state.right_shift += xShift;\n return true;\n }\n if (!noteM)\n throw new RuntimeError('InvalidState', 'noteM not defined.');\n // For three voices, test if rests can be repositioned\n //\n // Special case 1 :: middle voice rest between two notes\n //\n if (noteM.isrest && !noteU.isrest && !noteL.isrest) {\n if (noteU.minLine <= noteM.maxLine || noteM.minLine <= noteL.maxLine) {\n const restHeight = noteM.maxLine - noteM.minLine;\n const space = noteU.minLine - noteL.maxLine;\n if (restHeight < space) {\n // center middle voice rest between the upper and lower voices\n centerRest(noteM, noteU, noteL);\n }\n else {\n xShift = voiceXShift + 2; // shift middle rest right\n noteM.note.setXShift(xShift);\n if (noteL.note.hasBeam() === false) {\n noteL.stemDirection = -1;\n noteL.note.setStemDirection(-1);\n }\n if (noteU.minLine <= noteL.maxLine && noteU.note.hasBeam() === false) {\n noteU.stemDirection = 1;\n noteU.note.setStemDirection(1);\n }\n }\n // format complete\n state.right_shift += xShift;\n return true;\n }\n }\n // Special case 2 :: all voices are rests\n if (noteU.isrest && noteM.isrest && noteL.isrest) {\n // Shift upper voice rest up\n shiftRestVertical(noteU, noteM, 1);\n // Shift lower voice rest down\n shiftRestVertical(noteL, noteM, -1);\n // format complete\n state.right_shift += xShift;\n return true;\n }\n // Test if any other rests can be repositioned\n if (noteM.isrest && noteU.isrest && noteM.minLine <= noteL.maxLine) {\n // Shift middle voice rest up\n shiftRestVertical(noteM, noteL, 1);\n }\n if (noteM.isrest && noteL.isrest && noteU.minLine <= noteM.maxLine) {\n // Shift middle voice rest down\n shiftRestVertical(noteM, noteU, -1);\n }\n if (noteU.isrest && noteU.minLine <= noteM.maxLine) {\n // shift upper voice rest up;\n shiftRestVertical(noteU, noteM, 1);\n }\n if (noteL.isrest && noteM.minLine <= noteL.maxLine) {\n // shift lower voice rest down\n shiftRestVertical(noteL, noteM, -1);\n }\n // If middle voice intersects upper or lower voice\n if (noteU.minLine <= noteM.maxLine + 0.5 || noteM.minLine <= noteL.maxLine) {\n // shift middle note right\n xShift = voiceXShift + 2;\n noteM.note.setXShift(xShift);\n if (noteL.note.hasBeam() === false) {\n noteL.stemDirection = -1;\n noteL.note.setStemDirection(-1);\n }\n if (noteU.minLine <= noteL.maxLine && noteU.note.hasBeam() === false) {\n noteU.stemDirection = 1;\n noteU.note.setStemDirection(1);\n }\n }\n state.right_shift += xShift;\n return true;\n }\n static postFormat(notes) {\n if (!notes)\n return false;\n notes.forEach((note) => note.postFormat());\n return true;\n }\n reset() {\n super.reset();\n // Save prior noteHead styles & reapply them after making new noteheads.\n const noteHeadStyles = this._noteHeads.map((noteHead) => noteHead.getStyle());\n this.buildNoteHeads();\n this._noteHeads.forEach((noteHead, index) => {\n const noteHeadStyle = noteHeadStyles[index];\n if (noteHeadStyle)\n noteHead.setStyle(noteHeadStyle);\n });\n const stave = this.stave;\n if (stave) {\n this._noteHeads.forEach((head) => head.setStave(stave));\n }\n this.calcNoteDisplacements();\n return this;\n }\n setBeam(beam) {\n this.beam = beam;\n this.calcNoteDisplacements();\n // Update stem extension is a beam is assigned.\n if (this.stem) {\n this.stem.setExtension(this.getStemExtension());\n }\n return this;\n }\n // Builds a `Stem` for the note\n buildStem() {\n this.setStem(new Stem({ hide: !!this.isRest() }));\n return this;\n }\n // Builds a `NoteHead` for each key in the note\n buildNoteHeads() {\n this._noteHeads = [];\n const stemDirection = this.getStemDirection();\n const keys = this.getKeys();\n let lastLine = undefined;\n let lineDiff = undefined;\n let displaced = false;\n // Draw notes from bottom to top.\n // For down-stem notes, we draw from top to bottom.\n let start;\n let end;\n let step;\n if (stemDirection === Stem.UP) {\n start = 0;\n end = keys.length;\n step = 1;\n }\n else {\n start = keys.length - 1;\n end = -1;\n step = -1;\n }\n for (let i = start; i !== end; i += step) {\n const noteProps = this.keyProps[i];\n const line = noteProps.line;\n // Keep track of last line with a note head, so that consecutive heads\n // are correctly displaced.\n if (lastLine === undefined) {\n lastLine = line;\n }\n else {\n lineDiff = Math.abs(lastLine - line);\n if (lineDiff === 0 || lineDiff === 0.5) {\n displaced = !displaced;\n }\n else {\n displaced = false;\n this.use_default_head_x = true;\n }\n }\n lastLine = line;\n const notehead = new NoteHead({\n duration: this.duration,\n note_type: this.noteType,\n displaced,\n stem_direction: stemDirection,\n custom_glyph_code: noteProps.code,\n glyph_font_scale: this.render_options.glyph_font_scale,\n x_shift: noteProps.shift_right,\n stem_up_x_offset: noteProps.stem_up_x_offset,\n stem_down_x_offset: noteProps.stem_down_x_offset,\n line: noteProps.line,\n });\n this._noteHeads[i] = notehead;\n }\n }\n // Automatically sets the stem direction based on the keys in the note\n autoStem() {\n this.setStemDirection(this.calculateOptimalStemDirection());\n }\n calculateOptimalStemDirection() {\n // Figure out optimal stem direction based on given notes\n this.minLine = this.keyProps[0].line;\n this.maxLine = this.keyProps[this.keyProps.length - 1].line;\n const MIDDLE_LINE = 3;\n const decider = (this.minLine + this.maxLine) / 2;\n const stemDirection = decider < MIDDLE_LINE ? Stem.UP : Stem.DOWN;\n return stemDirection;\n }\n // Calculates and stores the properties for each key in the note\n calculateKeyProps() {\n let lastLine;\n for (let i = 0; i < this.keys.length; ++i) {\n const key = this.keys[i];\n // All rests use the same position on the line.\n // if (this.glyph.rest) key = this.glyph.position;\n if (this.glyph.rest)\n this.glyph.position = key;\n const options = { octave_shift: this.octave_shift || 0 };\n const props = Tables.keyProperties(key, this.clef, options);\n if (!props) {\n throw new RuntimeError('BadArguments', `Invalid key for note properties: ${key}`);\n }\n // Override line placement for default rests\n if (props.key === 'R') {\n if (this.duration === '1' || this.duration === 'w') {\n props.line = 4;\n }\n else {\n props.line = 3;\n }\n }\n // Calculate displacement of this note\n const line = props.line;\n if (lastLine == undefined) {\n lastLine = line;\n }\n else {\n if (Math.abs(lastLine - line) === 0.5) {\n this.displaced = true;\n props.displaced = true;\n // Have to mark the previous note as\n // displaced as well, for modifier placement\n if (this.keyProps.length > 0) {\n this.keyProps[i - 1].displaced = true;\n }\n }\n }\n lastLine = line;\n this.keyProps.push(props);\n }\n // Sort the notes from lowest line to highest line\n lastLine = undefined;\n this.keyProps.forEach((key) => {\n if (lastLine && key.line < lastLine) {\n warn('Unsorted keys in note will be sorted. ' + 'See https://github.com/0xfe/vexflow/issues/104 for details.');\n }\n lastLine = key.line;\n });\n this.keyProps.sort((a, b) => a.line - b.line);\n }\n // Get the `BoundingBox` for the entire note\n getBoundingBox() {\n var _a, _b;\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call getBoundingBox on an unformatted note.\");\n }\n const { width: w, modLeftPx, leftDisplacedHeadPx } = this.getMetrics();\n const x = this.getAbsoluteX() - modLeftPx - leftDisplacedHeadPx;\n let minY = 0;\n let maxY = 0;\n const halfLineSpacing = ((_b = (_a = this.getStave()) === null || _a === void 0 ? void 0 : _a.getSpacingBetweenLines()) !== null && _b !== void 0 ? _b : 0) / 2;\n const lineSpacing = halfLineSpacing * 2;\n if (this.isRest()) {\n const y = this.ys[0];\n const frac = Tables.durationToFraction(this.duration);\n if (frac.equals(1) || frac.equals(2)) {\n minY = y - halfLineSpacing;\n maxY = y + halfLineSpacing;\n }\n else {\n minY = y - this.glyph.line_above * lineSpacing;\n maxY = y + this.glyph.line_below * lineSpacing;\n }\n }\n else if (this.glyph.stem) {\n const ys = this.getStemExtents();\n ys.baseY += halfLineSpacing * this.getStemDirection();\n minY = Math.min(ys.topY, ys.baseY);\n maxY = Math.max(ys.topY, ys.baseY);\n }\n else {\n minY = 0;\n maxY = 0;\n for (let i = 0; i < this.ys.length; ++i) {\n const yy = this.ys[i];\n if (i === 0) {\n minY = yy;\n maxY = yy;\n }\n else {\n minY = Math.min(yy, minY);\n maxY = Math.max(yy, maxY);\n }\n }\n minY -= halfLineSpacing;\n maxY += halfLineSpacing;\n }\n return new BoundingBox(x, minY, w, maxY - minY);\n }\n // Gets the line number of the bottom note in the chord.\n // If `isTopNote` is `true` then get the top note's line number instead\n getLineNumber(isTopNote) {\n if (!this.keyProps.length) {\n throw new RuntimeError('NoKeyProps', \"Can't get bottom note line, because note is not initialized properly.\");\n }\n let resultLine = this.keyProps[0].line;\n // No precondition assumed for sortedness of keyProps array\n for (let i = 0; i < this.keyProps.length; i++) {\n const thisLine = this.keyProps[i].line;\n if (isTopNote) {\n if (thisLine > resultLine)\n resultLine = thisLine;\n }\n else {\n if (thisLine < resultLine)\n resultLine = thisLine;\n }\n }\n return resultLine;\n }\n /**\n * @returns true if this note is a type of rest. Rests don't have pitches, but take up space in the score.\n */\n isRest() {\n return this.glyph.rest;\n }\n // Determine if the current note is a chord\n isChord() {\n return !this.isRest() && this.keys.length > 1;\n }\n // Determine if the `StaveNote` has a stem\n hasStem() {\n return this.glyph.stem;\n }\n hasFlag() {\n return super.hasFlag() && !this.isRest();\n }\n getStemX() {\n if (this.noteType === 'r') {\n return this.getCenterGlyphX();\n }\n else {\n // We adjust the origin of the stem because we want the stem left-aligned\n // with the notehead if stemmed-down, and right-aligned if stemmed-up\n return super.getStemX() + (this.stem_direction ? Stem.WIDTH / (2 * -this.stem_direction) : 0);\n }\n }\n // Get the `y` coordinate for text placed on the top/bottom of a\n // note at a desired `text_line`\n getYForTopText(textLine) {\n const extents = this.getStemExtents();\n return Math.min(this.checkStave().getYForTopText(textLine), extents.topY - this.render_options.annotation_spacing * (textLine + 1));\n }\n getYForBottomText(textLine) {\n const extents = this.getStemExtents();\n return Math.max(this.checkStave().getYForTopText(textLine), extents.baseY + this.render_options.annotation_spacing * textLine);\n }\n // Sets the current note to the provided `stave`. This applies\n // `y` values to the `NoteHeads`.\n setStave(stave) {\n super.setStave(stave);\n const ys = this._noteHeads.map((notehead) => {\n notehead.setStave(stave);\n return notehead.getY();\n });\n this.setYs(ys);\n if (this.stem) {\n const { y_top, y_bottom } = this.getNoteHeadBounds();\n this.stem.setYBounds(y_top, y_bottom);\n }\n return this;\n }\n // Check if note is shifted to the right\n isDisplaced() {\n return this.displaced;\n }\n // Sets whether shift note to the right. `displaced` is a `boolean`\n setNoteDisplaced(displaced) {\n this.displaced = displaced;\n return this;\n }\n // Get the starting `x` coordinate for a `StaveTie`\n getTieRightX() {\n let tieStartX = this.getAbsoluteX();\n tieStartX += this.getGlyphWidth() + this.x_shift + this.rightDisplacedHeadPx;\n if (this.modifierContext)\n tieStartX += this.modifierContext.getRightShift();\n return tieStartX;\n }\n // Get the ending `x` coordinate for a `StaveTie`\n getTieLeftX() {\n let tieEndX = this.getAbsoluteX();\n tieEndX += this.x_shift - this.leftDisplacedHeadPx;\n return tieEndX;\n }\n // Get the stave line on which to place a rest\n getLineForRest() {\n let restLine = this.keyProps[0].line;\n if (this.keyProps.length > 1) {\n const lastLine = this.keyProps[this.keyProps.length - 1].line;\n const top = Math.max(restLine, lastLine);\n const bot = Math.min(restLine, lastLine);\n restLine = midLine(top, bot);\n }\n return restLine;\n }\n // Get the default `x` and `y` coordinates for the provided `position`\n // and key `index`\n getModifierStartXY(position, index, options = {}) {\n var _a, _b;\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call GetModifierStartXY on an unformatted note\");\n }\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', 'No Y-Values calculated for this note.');\n }\n const { ABOVE, BELOW, LEFT, RIGHT } = Modifier.Position;\n let x = 0;\n if (position === LEFT) {\n // FIXME: Left modifier padding, move to font file\n x = -1 * 2;\n }\n else if (position === RIGHT) {\n // FIXME: Right modifier padding, move to font file\n x = this.getGlyphWidth() + this.x_shift + 2;\n if (this.stem_direction === Stem.UP &&\n this.hasFlag() &&\n (options.forceFlagRight || isInnerNoteIndex(this, index))) {\n x += (_b = (_a = this === null || this === void 0 ? void 0 : this.flag) === null || _a === void 0 ? void 0 : _a.getMetrics().width) !== null && _b !== void 0 ? _b : 0;\n }\n }\n else if (position === BELOW || position === ABOVE) {\n x = this.getGlyphWidth() / 2;\n }\n return {\n x: this.getAbsoluteX() + x,\n y: this.ys[index],\n };\n }\n // Sets the style of the complete StaveNote, including all keys\n // and the stem.\n setStyle(style) {\n var _a;\n super.setStyle(style);\n this._noteHeads.forEach((notehead) => notehead.setStyle(style));\n (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setStyle(style);\n return this;\n }\n setStemStyle(style) {\n const stem = this.getStem();\n stem === null || stem === void 0 ? void 0 : stem.setStyle(style);\n return this;\n }\n getStemStyle() {\n var _a;\n return (_a = this.stem) === null || _a === void 0 ? void 0 : _a.getStyle();\n }\n setLedgerLineStyle(style) {\n this.ledgerLineStyle = style;\n }\n getLedgerLineStyle() {\n return this.ledgerLineStyle;\n }\n setFlagStyle(style) {\n this.flagStyle = style;\n }\n getFlagStyle() {\n return this.flagStyle;\n }\n // Sets the notehead at `index` to the provided coloring `style`.\n //\n // `style` is an `object` with the following properties: `shadowColor`,\n // `shadowBlur`, `fillStyle`, `strokeStyle`\n setKeyStyle(index, style) {\n this._noteHeads[index].setStyle(style);\n return this;\n }\n setKeyLine(index, line) {\n this.keyProps[index].line = line;\n this.reset();\n return this;\n }\n getKeyLine(index) {\n return this.keyProps[index].line;\n }\n // Get the width of the note if it is displaced. Used for `Voice`\n // formatting\n getVoiceShiftWidth() {\n // TODO: may need to accomodate for dot here.\n return this.getGlyphWidth() * (this.displaced ? 2 : 1);\n }\n // Calculates and sets the extra pixels to the left or right\n // if the note is displaced.\n calcNoteDisplacements() {\n this.setLeftDisplacedHeadPx(this.displaced && this.stem_direction === Stem.DOWN ? this.getGlyphWidth() : 0);\n // For upstems with flags, the extra space is unnecessary, since it's taken\n // up by the flag.\n this.setRightDisplacedHeadPx(!this.hasFlag() && this.displaced && this.stem_direction === Stem.UP ? this.getGlyphWidth() : 0);\n }\n // Pre-render formatting\n preFormat() {\n if (this.preFormatted)\n return;\n let noteHeadPadding = 0;\n if (this.modifierContext) {\n this.modifierContext.preFormat();\n // If there are no modifiers on this note, make sure there is adequate padding\n // between the notes.\n if (this.modifierContext.getWidth() === 0) {\n noteHeadPadding = StaveNote.minNoteheadPadding;\n }\n }\n let width = this.getGlyphWidth() + this.leftDisplacedHeadPx + this.rightDisplacedHeadPx + noteHeadPadding;\n // For upward flagged notes, the width of the flag needs to be added\n if (this.shouldDrawFlag() && this.stem_direction === Stem.UP) {\n width += this.getGlyphWidth();\n // TODO: Add flag width as a separate metric\n }\n this.setWidth(width);\n this.preFormatted = true;\n }\n /**\n * @typedef {Object} noteHeadBounds\n * @property {number} y_top the highest notehead bound\n * @property {number} y_bottom the lowest notehead bound\n * @property {number|Null} displaced_x the starting x for displaced noteheads\n * @property {number|Null} non_displaced_x the starting x for non-displaced noteheads\n * @property {number} highest_line the highest notehead line in traditional music line\n * numbering (bottom line = 1, top line = 5)\n * @property {number} lowest_line the lowest notehead line\n * @property {number|false} highest_displaced_line the highest staff line number\n * for a displaced notehead\n * @property {number|false} lowest_displaced_line\n * @property {number} highest_non_displaced_line\n * @property {number} lowest_non_displaced_line\n */\n /**\n * Get the staff line and y value for the highest & lowest noteheads\n * @returns {noteHeadBounds}\n */\n getNoteHeadBounds() {\n // Top and bottom Y values for stem.\n let yTop = +Infinity;\n let yBottom = -Infinity;\n let nonDisplacedX;\n let displacedX;\n let highestLine = this.checkStave().getNumLines();\n let lowestLine = 1;\n let highestDisplacedLine;\n let lowestDisplacedLine;\n let highestNonDisplacedLine = highestLine;\n let lowestNonDisplacedLine = lowestLine;\n this._noteHeads.forEach((notehead) => {\n const line = notehead.getLine();\n const y = notehead.getY();\n yTop = Math.min(y, yTop);\n yBottom = Math.max(y, yBottom);\n if (displacedX === undefined && notehead.isDisplaced()) {\n displacedX = notehead.getAbsoluteX();\n }\n if (nonDisplacedX === undefined && !notehead.isDisplaced()) {\n nonDisplacedX = notehead.getAbsoluteX();\n }\n highestLine = Math.max(line, highestLine);\n lowestLine = Math.min(line, lowestLine);\n if (notehead.isDisplaced()) {\n highestDisplacedLine = highestDisplacedLine === undefined ? line : Math.max(line, highestDisplacedLine);\n lowestDisplacedLine = lowestDisplacedLine === undefined ? line : Math.min(line, lowestDisplacedLine);\n }\n else {\n highestNonDisplacedLine = Math.max(line, highestNonDisplacedLine);\n lowestNonDisplacedLine = Math.min(line, lowestNonDisplacedLine);\n }\n }, this);\n return {\n y_top: yTop,\n y_bottom: yBottom,\n displaced_x: displacedX,\n non_displaced_x: nonDisplacedX,\n highest_line: highestLine,\n lowest_line: lowestLine,\n highest_displaced_line: highestDisplacedLine,\n lowest_displaced_line: lowestDisplacedLine,\n highest_non_displaced_line: highestNonDisplacedLine,\n lowest_non_displaced_line: lowestNonDisplacedLine,\n };\n }\n // Get the starting `x` coordinate for the noteheads\n getNoteHeadBeginX() {\n return this.getAbsoluteX() + this.x_shift;\n }\n // Get the ending `x` coordinate for the noteheads\n getNoteHeadEndX() {\n const xBegin = this.getNoteHeadBeginX();\n return xBegin + this.getGlyphWidth();\n }\n get noteHeads() {\n return this._noteHeads.slice();\n }\n /** @deprecated use StaveNote.noteHeads instead. */\n get note_heads() {\n showDeprecationWarningForNoteHeads();\n return this.noteHeads;\n }\n // Draw the ledger lines between the stave and the highest/lowest keys\n drawLedgerLines() {\n const stave = this.checkStave();\n const { glyph, render_options: { stroke_px }, } = this;\n const ctx = this.checkContext();\n const width = glyph.getWidth() + stroke_px * 2;\n const doubleWidth = 2 * (glyph.getWidth() + stroke_px) - Stem.WIDTH / 2;\n if (this.isRest())\n return;\n if (!ctx) {\n throw new RuntimeError('NoCanvasContext', \"Can't draw without a canvas context.\");\n }\n const { highest_line, lowest_line, highest_displaced_line, highest_non_displaced_line, lowest_displaced_line, lowest_non_displaced_line, displaced_x, non_displaced_x, } = this.getNoteHeadBounds();\n // Early out if there are no ledger lines to draw.\n if (highest_line < 6 && lowest_line > 0)\n return;\n const min_x = Math.min(displaced_x !== null && displaced_x !== void 0 ? displaced_x : 0, non_displaced_x !== null && non_displaced_x !== void 0 ? non_displaced_x : 0);\n const drawLedgerLine = (y, normal, displaced) => {\n let x;\n if (displaced && normal)\n x = min_x - stroke_px;\n else if (normal)\n x = (non_displaced_x !== null && non_displaced_x !== void 0 ? non_displaced_x : 0) - stroke_px;\n else\n x = (displaced_x !== null && displaced_x !== void 0 ? displaced_x : 0) - stroke_px;\n const ledgerWidth = normal && displaced ? doubleWidth : width;\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(x + ledgerWidth, y);\n ctx.stroke();\n };\n const style = Object.assign(Object.assign({}, stave.getDefaultLedgerLineStyle()), this.getLedgerLineStyle());\n this.applyStyle(ctx, style);\n // Draw ledger lines below the staff:\n for (let line = 6; line <= highest_line; ++line) {\n const normal = non_displaced_x !== undefined && line <= highest_non_displaced_line;\n const displaced = highest_displaced_line !== undefined && line <= highest_displaced_line;\n drawLedgerLine(stave.getYForNote(line), normal, displaced);\n }\n // Draw ledger lines above the staff:\n for (let line = 0; line >= lowest_line; --line) {\n const normal = non_displaced_x !== undefined && line >= lowest_non_displaced_line;\n const displaced = lowest_displaced_line !== undefined && line >= lowest_displaced_line;\n drawLedgerLine(stave.getYForNote(line), normal, displaced);\n }\n this.restoreStyle(ctx, style);\n }\n // Draw all key modifiers\n drawModifiers() {\n const ctx = this.checkContext();\n ctx.openGroup('modifiers');\n for (let i = 0; i < this.modifiers.length; i++) {\n const modifier = this.modifiers[i];\n const index = modifier.checkIndex();\n const notehead = this._noteHeads[index];\n const noteheadStyle = notehead.getStyle();\n notehead.applyStyle(ctx, noteheadStyle);\n modifier.setContext(ctx);\n modifier.drawWithStyle();\n notehead.restoreStyle(ctx, noteheadStyle);\n }\n ctx.closeGroup();\n }\n shouldDrawFlag() {\n const hasStem = this.stem !== undefined;\n const hasFlag = this.glyph.flag; // specified in tables.js\n const hasNoBeam = this.beam === undefined;\n return hasStem && hasFlag && hasNoBeam;\n }\n // Draw the flag for the note\n drawFlag() {\n var _a;\n const ctx = this.checkContext();\n if (!ctx) {\n throw new RuntimeError('NoCanvasContext', \"Can't draw without a canvas context.\");\n }\n if (this.shouldDrawFlag()) {\n const { y_top, y_bottom } = this.getNoteHeadBounds();\n // eslint-disable-next-line\n const noteStemHeight = this.stem.getHeight();\n const flagX = this.getStemX();\n // FIXME: What's with the magic +/- 2\n // ANSWER: a corner of the note stem pokes out beyond the tip of the flag.\n // The extra +/- 2 pushes the flag glyph outward so it covers the stem entirely.\n // Alternatively, we could shorten the stem.\n const extension = this.flag !== undefined ? this.flag.checkMetrics().y_shift : 0;\n const flagY = this.getStemDirection() === Stem.DOWN\n ? // Down stems are below the note head and have flags on the right.\n y_top - noteStemHeight + 2 - extension\n : // Up stems are above the note head and have flags on the right.\n y_bottom - noteStemHeight - 2 - extension;\n // Draw the Flag\n ctx.openGroup('flag', undefined, { pointerBBox: true });\n this.applyStyle(ctx, this.getFlagStyle());\n (_a = this.flag) === null || _a === void 0 ? void 0 : _a.render(ctx, flagX, flagY);\n this.restoreStyle(ctx, this.getFlagStyle());\n ctx.closeGroup();\n }\n }\n // Draw the NoteHeads\n drawNoteHeads() {\n const ctx = this.checkContext();\n this._noteHeads.forEach((notehead) => {\n ctx.openGroup('notehead', undefined, { pointerBBox: true });\n notehead.setContext(ctx).draw();\n ctx.closeGroup();\n });\n }\n drawStem(stemOptions) {\n var _a;\n // GCR TODO: I can't find any context in which this is called with the stemStruct\n // argument in the codebase or tests. Nor can I find a case where super.drawStem\n // is called at all. Perhaps these should be removed?\n const ctx = this.checkContext();\n if (stemOptions) {\n this.setStem(new Stem(stemOptions));\n }\n // If we will render a flag, we shorten the stem so that the tip\n // does not poke through the flag.\n if (this.shouldDrawFlag() && this.stem) {\n this.stem.adjustHeightForFlag();\n }\n ctx.openGroup('stem', undefined, { pointerBBox: true });\n (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setContext(ctx).draw();\n ctx.closeGroup();\n }\n /**\n * Override stemmablenote stem extension to adjust for distance from middle line.\n */\n getStemExtension() {\n const super_stem_extension = super.getStemExtension();\n if (!this.glyph.stem) {\n return super_stem_extension;\n }\n const stem_direction = this.getStemDirection();\n if (stem_direction !== this.calculateOptimalStemDirection()) {\n return super_stem_extension; // no adjustment for manually set stem direction.\n }\n let mid_line_distance;\n const MIDDLE_LINE = 3;\n if (stem_direction === Stem.UP) {\n // Note that the use of maxLine here instead of minLine might\n // seem counterintuitive, but in the case of (say) treble clef\n // chord(F2, E4) stem up, we do not want to extend the stem because\n // of F2, when a normal octave-length stem above E4 is fine.\n //\n // maxLine and minLine are set in calculateOptimalStemDirection() so\n // will be known.\n mid_line_distance = MIDDLE_LINE - this.maxLine;\n }\n else {\n mid_line_distance = this.minLine - MIDDLE_LINE;\n }\n // how many lines more than an octave is the relevant notehead?\n const lines_over_octave_from_mid_line = mid_line_distance - 3.5;\n if (lines_over_octave_from_mid_line <= 0) {\n return super_stem_extension;\n }\n const stave = this.getStave();\n let spacing_between_lines = 10;\n if (stave != undefined) {\n spacing_between_lines = stave.getSpacingBetweenLines();\n }\n return super_stem_extension + lines_over_octave_from_mid_line * spacing_between_lines;\n }\n // Draws all the `StaveNote` parts. This is the main drawing method.\n draw() {\n var _a;\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', \"Can't draw note without Y values.\");\n }\n const ctx = this.checkContext();\n const xBegin = this.getNoteHeadBeginX();\n const shouldRenderStem = this.hasStem() && !this.beam;\n // Format note head x positions\n this._noteHeads.forEach((notehead) => notehead.setX(xBegin));\n // Format stem x positions\n const stemX = this.getStemX();\n (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setNoteHeadXBounds(stemX, stemX);\n L('Rendering ', this.isChord() ? 'chord :' : 'note :', this.keys);\n // Apply the overall style -- may be contradicted by local settings:\n this.applyStyle();\n this.setAttribute('el', ctx.openGroup('stavenote', this.getAttribute('id')));\n this.drawLedgerLines();\n ctx.openGroup('note', undefined, { pointerBBox: true });\n if (shouldRenderStem)\n this.drawStem();\n this.drawNoteHeads();\n this.drawFlag();\n ctx.closeGroup();\n this.drawModifiers();\n ctx.closeGroup();\n this.restoreStyle();\n this.setRendered();\n }\n}\nStaveNote.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Ron B. Yeh\n// MIT License\n//\n// Utilities for working with Web APIs.\n// See: https://developer.mozilla.org/en-US/docs/Web/API\nimport { globalObject } from './util';\n// eslint-disable-next-line\nexport function isHTMLCanvas(element) {\n if (!element)\n return false;\n const global = globalObject();\n return (\n // It's either an instance of the HTMLCanvasElement class,\n (typeof global.HTMLCanvasElement === 'function' && element instanceof global.HTMLCanvasElement) ||\n // OR it's pretending to be a element. Good enough!\n // Do not rely on .tagName, because node-canvas doesn't provide a tagName.\n (typeof element.getContext === 'function' && typeof element.toDataURL === 'function'));\n}\n// eslint-disable-next-line\nexport function isHTMLDiv(element) {\n if (!element)\n return false;\n const global = globalObject();\n return (\n // It's either an instance of the HTMLDivElement class.\n (typeof global.HTMLDivElement === 'function' && element instanceof global.HTMLDivElement) ||\n // OR it's pretending to be a
. See: svgcontext.ts.\n (typeof element.appendChild === 'function' && typeof element.style === 'object'));\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from './font';\nimport { RenderContext } from './rendercontext';\nimport { globalObject, warn } from './util';\nimport { isHTMLCanvas } from './web';\n/**\n * A rendering context for the Canvas backend. This class serves as a proxy for the\n * underlying CanvasRenderingContext2D object, part of the browser's API.\n */\nexport class CanvasContext extends RenderContext {\n constructor(context) {\n super();\n /** Height of one line of text (in pixels). */\n this.textHeight = 0;\n this.context2D = context;\n if (!context.canvas) {\n this.canvas = {\n width: CanvasContext.WIDTH,\n height: CanvasContext.HEIGHT,\n };\n }\n else {\n this.canvas = context.canvas;\n }\n }\n static get WIDTH() {\n return 600;\n }\n static get HEIGHT() {\n return 400;\n }\n static get CANVAS_BROWSER_SIZE_LIMIT() {\n return 32767; // Chrome/Firefox. Could be determined more precisely by npm module canvas-size.\n }\n /**\n * Ensure that width and height do not exceed the browser limit.\n * @returns array of [width, height] clamped to the browser limit.\n */\n static sanitizeCanvasDims(width, height) {\n const limit = this.CANVAS_BROWSER_SIZE_LIMIT;\n if (Math.max(width, height) > limit) {\n warn('Canvas dimensions exceed browser limit. Cropping to ' + limit);\n if (width > limit) {\n width = limit;\n }\n if (height > limit) {\n height = limit;\n }\n }\n return [width, height];\n }\n /**\n * Set all pixels to transparent black rgba(0,0,0,0).\n */\n clear() {\n this.context2D.clearRect(0, 0, this.canvas.width, this.canvas.height);\n }\n // eslint-disable-next-line\n openGroup(cls, id, attrs) {\n // Containers not implemented.\n }\n closeGroup() {\n // Containers not implemented.\n }\n // eslint-disable-next-line\n add(child) {\n // Containers not implemented.\n }\n setFillStyle(style) {\n this.context2D.fillStyle = style;\n return this;\n }\n /** CanvasContext ignores `setBackgroundFillStyle()`. */\n // eslint-disable-next-line\n setBackgroundFillStyle(style) {\n // DO NOTHING\n return this;\n }\n setStrokeStyle(style) {\n this.context2D.strokeStyle = style;\n return this;\n }\n setShadowColor(color) {\n this.context2D.shadowColor = color;\n return this;\n }\n setShadowBlur(blur) {\n // CanvasRenderingContext2D does not scale the shadow blur by the current\n // transform, so we have to do it manually. We assume uniform scaling\n // (though allow for rotation) because the blur can only be scaled\n // uniformly anyway.\n const t = this.context2D.getTransform();\n const scale = Math.sqrt(t.a * t.a + t.b * t.b + t.c * t.c + t.d * t.d);\n this.context2D.shadowBlur = scale * blur;\n return this;\n }\n setLineWidth(width) {\n this.context2D.lineWidth = width;\n return this;\n }\n setLineCap(capType) {\n this.context2D.lineCap = capType;\n return this;\n }\n setLineDash(dash) {\n this.context2D.setLineDash(dash);\n return this;\n }\n scale(x, y) {\n this.context2D.scale(x, y);\n return this;\n }\n resize(width, height) {\n const canvas = this.context2D.canvas;\n const devicePixelRatio = globalObject().devicePixelRatio || 1;\n // Scale the canvas size by the device pixel ratio clamping to the maximum supported size.\n [width, height] = CanvasContext.sanitizeCanvasDims(width * devicePixelRatio, height * devicePixelRatio);\n // Divide back down by the pixel ratio and convert to integers.\n width = (width / devicePixelRatio) | 0;\n height = (height / devicePixelRatio) | 0;\n canvas.width = width * devicePixelRatio;\n canvas.height = height * devicePixelRatio;\n // The canvas could be an instance of either HTMLCanvasElement or an OffscreenCanvas.\n // Only HTMLCanvasElement has a style attribute.\n if (isHTMLCanvas(canvas)) {\n canvas.style.width = width + 'px';\n canvas.style.height = height + 'px';\n }\n return this.scale(devicePixelRatio, devicePixelRatio);\n }\n rect(x, y, width, height) {\n this.context2D.rect(x, y, width, height);\n return this;\n }\n fillRect(x, y, width, height) {\n this.context2D.fillRect(x, y, width, height);\n return this;\n }\n /**\n * Set the pixels in a rectangular area to transparent black rgba(0,0,0,0).\n */\n clearRect(x, y, width, height) {\n this.context2D.clearRect(x, y, width, height);\n return this;\n }\n beginPath() {\n this.context2D.beginPath();\n return this;\n }\n moveTo(x, y) {\n this.context2D.moveTo(x, y);\n return this;\n }\n lineTo(x, y) {\n this.context2D.lineTo(x, y);\n return this;\n }\n bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) {\n this.context2D.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);\n return this;\n }\n quadraticCurveTo(cpx, cpy, x, y) {\n this.context2D.quadraticCurveTo(cpx, cpy, x, y);\n return this;\n }\n arc(x, y, radius, startAngle, endAngle, counterclockwise) {\n this.context2D.arc(x, y, radius, startAngle, endAngle, counterclockwise);\n return this;\n }\n fill() {\n this.context2D.fill();\n return this;\n }\n stroke() {\n this.context2D.stroke();\n return this;\n }\n closePath() {\n this.context2D.closePath();\n return this;\n }\n measureText(text) {\n const metrics = this.context2D.measureText(text);\n let y = 0;\n let height = 0;\n if (metrics.fontBoundingBoxAscent) {\n y = -metrics.fontBoundingBoxAscent;\n height = metrics.fontBoundingBoxDescent + metrics.fontBoundingBoxAscent;\n }\n else {\n y = -metrics.actualBoundingBoxAscent;\n height = metrics.actualBoundingBoxDescent + metrics.actualBoundingBoxAscent;\n }\n // Return x, y, width & height in the same manner as svg getBBox\n return {\n x: 0,\n y: y,\n width: metrics.width,\n height: height,\n };\n }\n fillText(text, x, y) {\n this.context2D.fillText(text, x, y);\n return this;\n }\n save() {\n this.context2D.save();\n return this;\n }\n restore() {\n this.context2D.restore();\n return this;\n }\n set fillStyle(style) {\n this.context2D.fillStyle = style;\n }\n get fillStyle() {\n return this.context2D.fillStyle;\n }\n set strokeStyle(style) {\n this.context2D.strokeStyle = style;\n }\n get strokeStyle() {\n return this.context2D.strokeStyle;\n }\n /**\n * @param f is 1) a `FontInfo` object or\n * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or\n * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided).\n * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt').\n * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900).\n * @param style is a string (e.g., 'italic', 'normal').\n */\n setFont(f, size, weight, style) {\n const fontInfo = Font.validate(f, size, weight, style);\n this.context2D.font = Font.toCSSString(fontInfo);\n this.textHeight = Font.convertSizeToPixelValue(fontInfo.size);\n return this;\n }\n /** Return a string of the form `'italic bold 15pt Arial'` */\n getFont() {\n return this.context2D.font;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// @author Gregory Ristow (2015)\nimport { Font, FontStyle, FontWeight } from './font';\nimport { RenderContext } from './rendercontext';\nimport { normalizeAngle, prefix, RuntimeError } from './util';\n/** For a particular element type (e.g., rect), we will not apply certain presentation attributes. */\nconst ATTRIBUTES_TO_IGNORE = {\n path: {\n x: true,\n y: true,\n width: true,\n height: true,\n 'font-family': true,\n 'font-weight': true,\n 'font-style': true,\n 'font-size': true,\n },\n rect: {\n 'font-family': true,\n 'font-weight': true,\n 'font-style': true,\n 'font-size': true,\n },\n text: {\n width: true,\n height: true,\n },\n};\n/** Create the SVG in the SVG namespace. */\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst TWO_PI = 2 * Math.PI;\nclass MeasureTextCache {\n constructor() {\n // The cache is keyed first by the text string, then by the font attributes\n // joined together.\n this.cache = {};\n }\n lookup(text, svg, attributes) {\n let entries = this.cache[text];\n if (entries === undefined) {\n entries = {};\n this.cache[text] = entries;\n }\n const family = attributes['font-family'];\n const size = attributes['font-size'];\n const weight = attributes['font-weight'];\n const style = attributes['font-style'];\n const key = `${family}%${size}%${weight}%${style}`;\n let entry = entries[key];\n if (entry === undefined) {\n entry = this.measureImpl(text, svg, attributes);\n entries[key] = entry;\n }\n return entry;\n }\n measureImpl(text, svg, attributes) {\n let txt = this.txt;\n if (!txt) {\n // Create the SVG text element that will be used to measure text in the event\n // of a cache miss.\n txt = document.createElementNS(SVG_NS, 'text');\n this.txt = txt;\n }\n txt.textContent = text;\n txt.setAttributeNS(null, 'font-family', attributes['font-family']);\n txt.setAttributeNS(null, 'font-size', attributes['font-size']);\n txt.setAttributeNS(null, 'font-style', attributes['font-style']);\n txt.setAttributeNS(null, 'font-weight', attributes['font-weight']);\n svg.appendChild(txt);\n const bbox = txt.getBBox();\n svg.removeChild(txt);\n return { x: bbox.x, y: bbox.y, width: bbox.width, height: bbox.height };\n }\n}\n/**\n * SVG rendering context with an API similar to CanvasRenderingContext2D.\n */\nexport class SVGContext extends RenderContext {\n constructor(element) {\n super();\n this.width = 0;\n this.height = 0;\n this.backgroundFillStyle = 'white';\n /** Formatted as CSS font shorthand (e.g., 'italic bold 12pt Arial') */\n this.fontCSSString = '';\n this.element = element;\n // Create a SVG element and add it to the container element.\n const svg = this.create('svg');\n this.element.appendChild(svg);\n this.svg = svg;\n this.parent = this.svg;\n this.groups = [this.svg];\n this.path = '';\n this.pen = { x: NaN, y: NaN };\n this.lineWidth = 1.0;\n const defaultFontAttributes = {\n 'font-family': Font.SANS_SERIF,\n 'font-size': Font.SIZE + 'pt',\n 'font-weight': FontWeight.NORMAL,\n 'font-style': FontStyle.NORMAL,\n };\n this.state = Object.assign({ scale: { x: 1, y: 1 } }, defaultFontAttributes);\n this.attributes = Object.assign({ 'stroke-width': 0.3, 'stroke-dasharray': 'none', fill: 'black', stroke: 'black' }, defaultFontAttributes);\n this.shadow_attributes = {\n width: 0,\n color: 'black',\n };\n this.state_stack = [];\n }\n create(svgElementType) {\n return document.createElementNS(SVG_NS, svgElementType);\n }\n // Allow grouping elements in containers for interactivity.\n openGroup(cls, id, attrs) {\n const group = this.create('g');\n this.groups.push(group);\n this.parent.appendChild(group);\n this.parent = group;\n if (cls)\n group.setAttribute('class', prefix(cls));\n if (id)\n group.setAttribute('id', prefix(id));\n if (attrs && attrs.pointerBBox) {\n group.setAttribute('pointer-events', 'bounding-box');\n }\n return group;\n }\n closeGroup() {\n this.groups.pop();\n this.parent = this.groups[this.groups.length - 1];\n }\n add(elem) {\n this.parent.appendChild(elem);\n }\n setFillStyle(style) {\n this.attributes.fill = style;\n return this;\n }\n /**\n * Used to set the fill color for `clearRect()`. This allows us to simulate\n * cutting a \"hole\" into the SVG drawing.\n */\n setBackgroundFillStyle(style) {\n this.backgroundFillStyle = style;\n return this;\n }\n setStrokeStyle(style) {\n this.attributes.stroke = style;\n return this;\n }\n setShadowColor(color) {\n this.shadow_attributes.color = color;\n return this;\n }\n /**\n * @param blur A non-negative float specifying the level of shadow blur, where 0\n * represents no blur and larger numbers represent increasingly more blur.\n * @returns this\n */\n setShadowBlur(blur) {\n this.shadow_attributes.width = blur;\n return this;\n }\n /**\n * @param width\n * @returns this\n */\n setLineWidth(width) {\n this.attributes['stroke-width'] = width;\n this.lineWidth = width;\n return this;\n }\n /**\n * @param lineDash an array of integers in the form of [dash, space, dash, space, etc...]\n * @returns this\n *\n * See: [SVG `stroke-dasharray` attribute](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray)\n */\n setLineDash(lineDash) {\n if (Object.prototype.toString.call(lineDash) === '[object Array]') {\n this.attributes['stroke-dasharray'] = lineDash.join(',');\n return this;\n }\n else {\n throw new RuntimeError('ArgumentError', 'lineDash must be an array of integers.');\n }\n }\n /**\n * @param capType\n * @returns this\n */\n setLineCap(capType) {\n this.attributes['stroke-linecap'] = capType;\n return this;\n }\n // ### Sizing & Scaling Methods:\n // TODO (GCR): See note at scale() -- separate our internal\n // conception of pixel-based width/height from the style.width\n // and style.height properties eventually to allow users to\n // apply responsive sizing attributes to the SVG.\n resize(width, height) {\n this.width = width;\n this.height = height;\n this.element.style.width = width.toString();\n this.svg.style.width = width.toString();\n this.svg.style.height = height.toString();\n const attributes = {\n width,\n height,\n };\n this.applyAttributes(this.svg, attributes);\n this.scale(this.state.scale.x, this.state.scale.y);\n return this;\n }\n scale(x, y) {\n // uses viewBox to scale\n // TODO (GCR): we may at some point want to distinguish the\n // style.width / style.height properties that are applied to\n // the SVG object from our internal conception of the SVG\n // width/height. This would allow us to create automatically\n // scaling SVG's that filled their containers, for instance.\n //\n // As this isn't implemented in Canvas contexts,\n // I've left as is for now, but in using the viewBox to\n // handle internal scaling, am trying to make it possible\n // for us to eventually move in that direction.\n this.state.scale = { x, y };\n const visibleWidth = this.width / x;\n const visibleHeight = this.height / y;\n this.setViewBox(0, 0, visibleWidth, visibleHeight);\n return this;\n }\n /**\n * 1 arg: string in the \"x y w h\" format\n * 4 args: x:number, y:number, w:number, h:number\n */\n setViewBox(viewBox_or_minX, minY, width, height) {\n if (typeof viewBox_or_minX === 'string') {\n this.svg.setAttribute('viewBox', viewBox_or_minX);\n }\n else {\n const viewBoxString = viewBox_or_minX + ' ' + minY + ' ' + width + ' ' + height;\n this.svg.setAttribute('viewBox', viewBoxString);\n }\n }\n // ### Drawing helper methods:\n applyAttributes(element, attributes) {\n const attrNamesToIgnore = ATTRIBUTES_TO_IGNORE[element.nodeName];\n for (const attrName in attributes) {\n if (attrNamesToIgnore && attrNamesToIgnore[attrName]) {\n continue;\n }\n element.setAttributeNS(null, attrName, attributes[attrName]);\n }\n return element;\n }\n // ### Shape & Path Methods:\n clear() {\n // Clear the SVG by removing all inner children.\n // (This approach is usually slightly more efficient\n // than removing the old SVG & adding a new one to\n // the container element, since it does not cause the\n // container to resize twice. Also, the resize\n // triggered by removing the entire SVG can trigger\n // a touchcancel event when the element resizes away\n // from a touch point.)\n while (this.svg.lastChild) {\n this.svg.removeChild(this.svg.lastChild);\n }\n // Replace the viewbox attribute we just removed.\n this.scale(this.state.scale.x, this.state.scale.y);\n }\n // ## Rectangles:\n rect(x, y, width, height, attributes) {\n // Avoid invalid negative height attributes by flipping the rectangle on its head:\n if (height < 0) {\n y += height;\n height *= -1;\n }\n const rectangle = this.create('rect');\n attributes = attributes !== null && attributes !== void 0 ? attributes : { fill: 'none', 'stroke-width': this.lineWidth, stroke: 'black' };\n this.applyAttributes(rectangle, Object.assign({ x, y, width, height }, attributes));\n this.add(rectangle);\n return this;\n }\n fillRect(x, y, width, height) {\n const attributes = { fill: this.attributes.fill };\n this.rect(x, y, width, height, attributes);\n return this;\n }\n clearRect(x, y, width, height) {\n // Currently this fills a rect with the backgroundFillStyle, rather\n // than \"cut a hole\" into the existing shapes.\n //\n // Since tabNote seems to be the only module that makes use of this\n // it may be worth creating a separate tabStave that would\n // draw lines around locations of tablature fingering.\n this.rect(x, y, width, height, { 'stroke-width': 0, fill: this.backgroundFillStyle });\n return this;\n }\n // ## Paths:\n beginPath() {\n this.path = '';\n this.pen.x = NaN;\n this.pen.y = NaN;\n return this;\n }\n moveTo(x, y) {\n this.path += 'M' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n lineTo(x, y) {\n this.path += 'L' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n bezierCurveTo(x1, y1, x2, y2, x, y) {\n this.path += 'C' + x1 + ' ' + y1 + ',' + x2 + ' ' + y2 + ',' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n quadraticCurveTo(x1, y1, x, y) {\n this.path += 'Q' + x1 + ' ' + y1 + ',' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n arc(x, y, radius, startAngle, endAngle, counterclockwise) {\n const x0 = x + radius * Math.cos(startAngle);\n const y0 = y + radius * Math.sin(startAngle);\n // Handle the edge case where arc length is greater than or equal to\n // the circle's circumference:\n // https://html.spec.whatwg.org/multipage/canvas.html#ellipse-method-steps\n if ((!counterclockwise && endAngle - startAngle >= TWO_PI) ||\n (counterclockwise && startAngle - endAngle >= TWO_PI)) {\n const x1 = x + radius * Math.cos(startAngle + Math.PI);\n const y1 = y + radius * Math.sin(startAngle + Math.PI);\n // There's no way to specify a completely circular arc in SVG so we have to\n // use two semi-circular arcs.\n this.path += `M${x0} ${y0} A${radius} ${radius} 0 0 0 ${x1} ${y1} `;\n this.path += `A${radius} ${radius} 0 0 0 ${x0} ${y0}`;\n this.pen.x = x0;\n this.pen.y = y0;\n }\n else {\n const x1 = x + radius * Math.cos(endAngle);\n const y1 = y + radius * Math.sin(endAngle);\n startAngle = normalizeAngle(startAngle);\n endAngle = normalizeAngle(endAngle);\n let large;\n if (Math.abs(endAngle - startAngle) < Math.PI) {\n large = counterclockwise;\n }\n else {\n large = !counterclockwise;\n }\n if (startAngle > endAngle) {\n large = !large;\n }\n const sweep = !counterclockwise;\n this.path += `M${x0} ${y0} A${radius} ${radius} 0 ${+large} ${+sweep} ${x1} ${y1}`;\n this.pen.x = x1;\n this.pen.y = y1;\n }\n return this;\n }\n closePath() {\n this.path += 'Z';\n return this;\n }\n getShadowStyle() {\n const sa = this.shadow_attributes;\n // A CSS drop-shadow filter blur looks different than a canvas shadowBlur\n // of the same radius, so we scale the drop-shadow radius here to make it\n // look close to the canvas shadow.\n return `filter: drop-shadow(0 0 ${sa.width / 1.5}px ${sa.color})`;\n }\n fill(attributes) {\n const path = this.create('path');\n if (typeof attributes === 'undefined') {\n attributes = Object.assign(Object.assign({}, this.attributes), { stroke: 'none' });\n }\n attributes.d = this.path;\n if (this.shadow_attributes.width > 0) {\n attributes.style = this.getShadowStyle();\n }\n this.applyAttributes(path, attributes);\n this.add(path);\n return this;\n }\n stroke() {\n const path = this.create('path');\n const attributes = Object.assign(Object.assign({}, this.attributes), { fill: 'none', 'stroke-width': this.lineWidth, d: this.path });\n if (this.shadow_attributes.width > 0) {\n attributes.style = this.getShadowStyle();\n }\n this.applyAttributes(path, attributes);\n this.add(path);\n return this;\n }\n // ## Text Methods:\n measureText(text) {\n return SVGContext.measureTextCache.lookup(text, this.svg, this.attributes);\n }\n fillText(text, x, y) {\n if (!text || text.length <= 0) {\n return this;\n }\n const attributes = Object.assign(Object.assign({}, this.attributes), { stroke: 'none', x,\n y });\n const txt = this.create('text');\n txt.textContent = text;\n this.applyAttributes(txt, attributes);\n this.add(txt);\n return this;\n }\n // TODO: State should be deep-copied.\n save() {\n this.state_stack.push({\n state: {\n 'font-family': this.state['font-family'],\n 'font-weight': this.state['font-weight'],\n 'font-style': this.state['font-style'],\n 'font-size': this.state['font-size'],\n scale: this.state.scale,\n },\n attributes: {\n 'font-family': this.attributes['font-family'],\n 'font-weight': this.attributes['font-weight'],\n 'font-style': this.attributes['font-style'],\n 'font-size': this.attributes['font-size'],\n fill: this.attributes.fill,\n stroke: this.attributes.stroke,\n 'stroke-width': this.attributes['stroke-width'],\n 'stroke-dasharray': this.attributes['stroke-dasharray'],\n },\n shadow_attributes: {\n width: this.shadow_attributes.width,\n color: this.shadow_attributes.color,\n },\n lineWidth: this.lineWidth,\n });\n return this;\n }\n // TODO: State should be deep-restored.\n restore() {\n const savedState = this.state_stack.pop();\n if (savedState) {\n const state = savedState;\n this.state['font-family'] = state.state['font-family'];\n this.state['font-weight'] = state.state['font-weight'];\n this.state['font-style'] = state.state['font-style'];\n this.state['font-size'] = state.state['font-size'];\n this.state.scale = state.state.scale;\n this.attributes['font-family'] = state.attributes['font-family'];\n this.attributes['font-weight'] = state.attributes['font-weight'];\n this.attributes['font-style'] = state.attributes['font-style'];\n this.attributes['font-size'] = state.attributes['font-size'];\n this.attributes.fill = state.attributes.fill;\n this.attributes.stroke = state.attributes.stroke;\n this.attributes['stroke-width'] = state.attributes['stroke-width'];\n this.attributes['stroke-dasharray'] = state.attributes['stroke-dasharray'];\n this.shadow_attributes.width = state.shadow_attributes.width;\n this.shadow_attributes.color = state.shadow_attributes.color;\n this.lineWidth = state.lineWidth;\n }\n return this;\n }\n set fillStyle(style) {\n this.setFillStyle(style);\n }\n get fillStyle() {\n return this.attributes.fill;\n }\n set strokeStyle(style) {\n this.setStrokeStyle(style);\n }\n get strokeStyle() {\n return this.attributes.stroke;\n }\n /**\n * @param f is 1) a `FontInfo` object or\n * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or\n * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided).\n * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt').\n * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900). It is inserted\n * into the font-weight attribute (e.g., font-weight=\"bold\")\n * @param style is a string (e.g., 'italic', 'normal') that is inserted into the\n * font-style attribute (e.g., font-style=\"italic\")\n */\n setFont(f, size, weight, style) {\n const fontInfo = Font.validate(f, size, weight, style);\n this.fontCSSString = Font.toCSSString(fontInfo);\n const fontAttributes = {\n 'font-family': fontInfo.family,\n 'font-size': fontInfo.size,\n 'font-weight': fontInfo.weight,\n 'font-style': fontInfo.style,\n };\n this.attributes = Object.assign(Object.assign({}, this.attributes), fontAttributes);\n this.state = Object.assign(Object.assign({}, this.state), fontAttributes);\n return this;\n }\n /** Return a string of the form `'italic bold 15pt Arial'` */\n getFont() {\n return this.fontCSSString;\n }\n}\nSVGContext.measureTextCache = new MeasureTextCache();\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { CanvasContext } from './canvascontext';\nimport { SVGContext } from './svgcontext';\nimport { isRenderContext } from './typeguard';\nimport { RuntimeError } from './util';\nimport { isHTMLCanvas, isHTMLDiv } from './web';\nexport var RendererBackends;\n(function (RendererBackends) {\n RendererBackends[RendererBackends[\"CANVAS\"] = 1] = \"CANVAS\";\n RendererBackends[RendererBackends[\"SVG\"] = 2] = \"SVG\";\n})(RendererBackends || (RendererBackends = {}));\n// End of line types\nexport var RendererLineEndType;\n(function (RendererLineEndType) {\n RendererLineEndType[RendererLineEndType[\"NONE\"] = 1] = \"NONE\";\n RendererLineEndType[RendererLineEndType[\"UP\"] = 2] = \"UP\";\n RendererLineEndType[RendererLineEndType[\"DOWN\"] = 3] = \"DOWN\";\n})(RendererLineEndType || (RendererLineEndType = {}));\n/**\n * Support Canvas & SVG rendering contexts.\n */\nexport class Renderer {\n constructor(arg0, arg1) {\n if (isRenderContext(arg0)) {\n // The user has provided what looks like a RenderContext, let's just use it.\n this.ctx = arg0;\n }\n else {\n if (arg1 === undefined) {\n // The backend must be specified if the render context isn't directly provided.\n throw new RuntimeError('InvalidArgument', 'Missing backend argument');\n }\n const backend = arg1;\n let element;\n if (typeof arg0 == 'string') {\n const maybeElement = document.getElementById(arg0);\n if (!maybeElement) {\n throw new RuntimeError('BadElementId', `Can't find element with ID \"${maybeElement}\"`);\n }\n element = maybeElement;\n }\n else {\n element = arg0;\n }\n // Verify backend and create context\n if (backend === Renderer.Backends.CANVAS) {\n if (!isHTMLCanvas(element)) {\n throw new RuntimeError('BadElement', 'CANVAS context requires an HTMLCanvasElement.');\n }\n const context = element.getContext('2d');\n if (!context) {\n throw new RuntimeError('BadElement', \"Can't get canvas context\");\n }\n this.ctx = new CanvasContext(context);\n }\n else if (backend === Renderer.Backends.SVG) {\n if (!isHTMLDiv(element)) {\n throw new RuntimeError('BadElement', 'SVG context requires an HTMLDivElement.');\n }\n this.ctx = new SVGContext(element);\n }\n else {\n throw new RuntimeError('InvalidBackend', `No support for backend: ${backend}`);\n }\n }\n }\n static buildContext(elementId, backend, width, height, background = '#FFF') {\n const renderer = new Renderer(elementId, backend);\n if (width && height) {\n renderer.resize(width, height);\n }\n const ctx = renderer.getContext();\n ctx.setBackgroundFillStyle(background);\n Renderer.lastContext = ctx;\n return ctx;\n }\n static getCanvasContext(elementId, width, height, background) {\n return Renderer.buildContext(elementId, Renderer.Backends.CANVAS, width, height, background);\n }\n static getSVGContext(elementId, width, height, background) {\n return Renderer.buildContext(elementId, Renderer.Backends.SVG, width, height, background);\n }\n // Draw a dashed line (horizontal, vertical or diagonal\n // dashPattern = [3,3] draws a 3 pixel dash followed by a three pixel space.\n // setting the second number to 0 draws a solid line.\n static drawDashedLine(context, fromX, fromY, toX, toY, dashPattern) {\n context.beginPath();\n const dx = toX - fromX;\n const dy = toY - fromY;\n const angle = Math.atan2(dy, dx);\n let x = fromX;\n let y = fromY;\n context.moveTo(fromX, fromY);\n let idx = 0;\n let draw = true;\n while (!((dx < 0 ? x <= toX : x >= toX) && (dy < 0 ? y <= toY : y >= toY))) {\n const dashLength = dashPattern[idx++ % dashPattern.length];\n const nx = x + Math.cos(angle) * dashLength;\n x = dx < 0 ? Math.max(toX, nx) : Math.min(toX, nx);\n const ny = y + Math.sin(angle) * dashLength;\n y = dy < 0 ? Math.max(toY, ny) : Math.min(toY, ny);\n if (draw) {\n context.lineTo(x, y);\n }\n else {\n context.moveTo(x, y);\n }\n draw = !draw;\n }\n context.closePath();\n context.stroke();\n }\n resize(width, height) {\n this.ctx.resize(width, height);\n return this;\n }\n getContext() {\n return this.ctx;\n }\n}\nRenderer.Backends = RendererBackends;\nRenderer.LineEndType = RendererLineEndType;\n// Used by vexflow_test_helpers.ts\n// Should this be private?\n// Can we do this in a cleaner way?\nRenderer.lastContext = undefined;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport var Justification;\n(function (Justification) {\n Justification[Justification[\"LEFT\"] = 1] = \"LEFT\";\n Justification[Justification[\"CENTER\"] = 2] = \"CENTER\";\n Justification[Justification[\"RIGHT\"] = 3] = \"RIGHT\";\n})(Justification || (Justification = {}));\n/**\n * `TextNote` is a notation element that is positioned in time. Generally\n * meant for objects that sit above/below the staff and inline with each other.\n * `TextNote` has to be assigned to a `Stave` before rendering by means of `setStave`.\n * Examples of this would be such as dynamics, lyrics, chord changes, etc.\n */\nexport class TextNote extends Note {\n constructor(noteStruct) {\n super(noteStruct);\n this.text = noteStruct.text || '';\n this.superscript = noteStruct.superscript;\n this.subscript = noteStruct.subscript;\n this.setFont(noteStruct.font);\n this.line = noteStruct.line || 0;\n this.smooth = noteStruct.smooth || false;\n this.ignore_ticks = noteStruct.ignore_ticks || false;\n this.justification = Justification.LEFT;\n // Determine and set initial note width. Note that the text width is\n // an approximation and isn't very accurate. The only way to accurately\n // measure the length of text is with `CanvasRenderingContext2D.measureText()`.\n if (noteStruct.glyph) {\n const struct = TextNote.GLYPHS[noteStruct.glyph];\n if (!struct)\n throw new RuntimeError('Invalid glyph type: ' + noteStruct.glyph);\n this.glyph = new Glyph(struct.code, 40, { category: 'textNote' });\n this.setWidth(this.glyph.getMetrics().width);\n }\n else {\n this.glyph = undefined;\n }\n }\n static get CATEGORY() {\n return Category.TextNote;\n }\n static get Justification() {\n return Justification;\n }\n /** Glyph data. */\n static get GLYPHS() {\n return {\n segno: {\n code: 'segno',\n },\n tr: {\n code: 'ornamentTrill',\n },\n mordent: {\n code: 'ornamentMordent',\n },\n mordent_upper: {\n code: 'ornamentShortTrill',\n },\n mordent_lower: {\n code: 'ornamentMordent',\n },\n f: {\n code: 'dynamicForte',\n },\n p: {\n code: 'dynamicPiano',\n },\n m: {\n code: 'dynamicMezzo',\n },\n s: {\n code: 'dynamicSforzando',\n },\n z: {\n code: 'dynamicZ',\n },\n coda: {\n code: 'coda',\n },\n pedal_open: {\n code: 'keyboardPedalPed',\n },\n pedal_close: {\n code: 'keyboardPedalUp',\n },\n caesura_straight: {\n code: 'caesura',\n },\n caesura_curved: {\n code: 'caesuraCurved',\n },\n breath: {\n code: 'breathMarkComma',\n },\n tick: {\n code: 'breathMarkTick',\n },\n turn: {\n code: 'ornamentTurn',\n },\n turn_inverted: {\n code: 'ornamentTurnSlash',\n },\n };\n }\n /** Set the horizontal justification of the TextNote. */\n setJustification(just) {\n this.justification = just;\n return this;\n }\n /** Set the Stave line on which the note should be placed. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Pre-render formatting. */\n preFormat() {\n if (this.preFormatted)\n return;\n const tickContext = this.checkTickContext(`Can't preformat without a TickContext.`);\n if (this.smooth) {\n this.setWidth(0);\n }\n else {\n if (this.glyph) {\n // Width already set.\n }\n else {\n const ctx = this.checkContext();\n ctx.setFont(this.textFont);\n this.setWidth(ctx.measureText(this.text).width);\n }\n }\n if (this.justification === Justification.CENTER) {\n this.leftDisplacedHeadPx = this.width / 2;\n }\n else if (this.justification === Justification.RIGHT) {\n this.leftDisplacedHeadPx = this.width;\n }\n // We reposition to the center of the note head\n this.rightDisplacedHeadPx = tickContext.getMetrics().glyphPx / 2;\n this.preFormatted = true;\n }\n /**\n * Renders the TextNote.\n * `TextNote` has to be assigned to a `Stave` before rendering by means of `setStave`.\n */\n draw() {\n const ctx = this.checkContext();\n const stave = this.checkStave();\n const tickContext = this.checkTickContext(`Can't draw without a TickContext.`);\n this.setRendered();\n // Reposition to center of note head\n let x = this.getAbsoluteX() + tickContext.getMetrics().glyphPx / 2;\n // Align based on tick-context width.\n const width = this.getWidth();\n if (this.justification === Justification.CENTER) {\n x -= width / 2;\n }\n else if (this.justification === Justification.RIGHT) {\n x -= width;\n }\n let y;\n if (this.glyph) {\n y = stave.getYForLine(this.line + -3);\n this.glyph.render(ctx, x, y);\n }\n else {\n y = stave.getYForLine(this.line + -3);\n this.applyStyle(ctx);\n ctx.setFont(this.textFont);\n ctx.fillText(this.text, x, y);\n const height = ctx.measureText(this.text).height;\n // We called this.setFont(...) in the constructor, so we know this.textFont is available.\n // eslint-disable-next-line\n const { family, size, weight, style } = this.textFont;\n // Scale the font size by 1/1.3.\n const smallerFontSize = Font.scaleSize(size, 0.769231);\n if (this.superscript) {\n ctx.setFont(family, smallerFontSize, weight, style);\n ctx.fillText(this.superscript, x + this.width + 2, y - height / 2.2);\n }\n if (this.subscript) {\n ctx.setFont(family, smallerFontSize, weight, style);\n ctx.fillText(this.subscript, x + this.width + 2, y + height / 2.2 - 1);\n }\n this.restoreStyle(ctx);\n }\n }\n}\nTextNote.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 12,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Larry Kuhns 2011\nimport { Font, FontStyle, FontWeight } from './font';\nimport { StaveModifier } from './stavemodifier';\nimport { Category } from './typeguard';\nexport var VoltaType;\n(function (VoltaType) {\n VoltaType[VoltaType[\"NONE\"] = 1] = \"NONE\";\n VoltaType[VoltaType[\"BEGIN\"] = 2] = \"BEGIN\";\n VoltaType[VoltaType[\"MID\"] = 3] = \"MID\";\n VoltaType[VoltaType[\"END\"] = 4] = \"END\";\n VoltaType[VoltaType[\"BEGIN_END\"] = 5] = \"BEGIN_END\";\n})(VoltaType || (VoltaType = {}));\nexport class Volta extends StaveModifier {\n constructor(type, number, x, y_shift) {\n super();\n this.volta = type;\n this.x = x;\n this.y_shift = y_shift;\n this.number = number;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.Volta;\n }\n static get type() {\n return VoltaType;\n }\n setShiftY(y) {\n this.y_shift = y;\n return this;\n }\n draw(stave, x) {\n const ctx = stave.checkContext();\n this.setRendered();\n let width = stave.getWidth() - x; // don't include x (offset) for width\n const top_y = stave.getYForTopText(stave.getNumLines()) + this.y_shift;\n const vert_height = 1.5 * stave.getSpacingBetweenLines();\n switch (this.volta) {\n case VoltaType.BEGIN:\n ctx.fillRect(this.x + x, top_y, 1, vert_height);\n break;\n case VoltaType.END:\n width -= 5;\n ctx.fillRect(this.x + x + width, top_y, 1, vert_height);\n break;\n case VoltaType.BEGIN_END:\n width -= 3;\n ctx.fillRect(this.x + x, top_y, 1, vert_height);\n ctx.fillRect(this.x + x + width, top_y, 1, vert_height);\n break;\n default:\n break;\n }\n // If the beginning of a volta, draw measure number\n if (this.volta === VoltaType.BEGIN || this.volta === VoltaType.BEGIN_END) {\n ctx.save();\n ctx.setFont(this.textFont);\n ctx.fillText(this.number, this.x + x + 5, top_y + 15);\n ctx.restore();\n }\n ctx.fillRect(this.x + x, top_y, width, 1);\n return this;\n }\n}\nVolta.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 9,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Larry Kuhns\n//\n// This file implements the `StringNumber` class which renders string\n// number annotations beside notes.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { Renderer } from './renderer';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category, isStaveNote, isStemmableNote } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StringNumber extends Modifier {\n constructor(number) {\n super();\n this.string_number = number;\n this.setWidth(20); // ???\n this.position = Modifier.Position.ABOVE; // Default position above stem or note head\n this.x_shift = 0;\n this.y_shift = 0;\n this.text_line = 0;\n this.stem_offset = 0;\n this.x_offset = 0; // Horizontal offset from default\n this.y_offset = 0; // Vertical offset from default\n this.dashed = true; // true - draw dashed extension false - no extension\n this.leg = Renderer.LineEndType.NONE; // draw upward/downward leg at the of extension line\n this.radius = 8;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StringNumber;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static get metrics() {\n return Tables.currentMusicFont().getMetrics().glyphs.stringNumber;\n }\n // ## Static Methods\n // Arrange string numbers inside a `ModifierContext`\n static format(nums, state) {\n const left_shift = state.left_shift;\n const right_shift = state.right_shift;\n const num_spacing = 1;\n if (!nums || nums.length === 0)\n return false;\n const nums_list = [];\n let prev_note = null;\n let shift_left = 0;\n let shift_right = 0;\n const modLines = 0;\n for (let i = 0; i < nums.length; ++i) {\n const num = nums[i];\n const note = num.getNote();\n const pos = num.getPosition();\n if (!isStaveNote(note)) {\n throw new RuntimeError('NoStaveNote');\n }\n const index = num.checkIndex();\n const props = note.getKeyProps()[index];\n const mc = note.getModifierContext();\n const verticalSpaceNeeded = (num.radius * 2) / Tables.STAVE_LINE_DISTANCE + 0.5;\n if (mc) {\n if (pos === ModifierPosition.ABOVE) {\n num.text_line = mc.getState().top_text_line;\n state.top_text_line += verticalSpaceNeeded;\n }\n else if (pos === ModifierPosition.BELOW) {\n num.text_line = mc.getState().text_line;\n state.text_line += verticalSpaceNeeded;\n }\n }\n if (note !== prev_note) {\n for (let n = 0; n < note.keys.length; ++n) {\n if (left_shift === 0) {\n shift_left = Math.max(note.getLeftDisplacedHeadPx(), shift_left);\n }\n if (right_shift === 0) {\n shift_right = Math.max(note.getRightDisplacedHeadPx(), shift_right);\n }\n }\n prev_note = note;\n }\n const glyphLine = modLines === 0 ? props.line : modLines;\n nums_list.push({\n pos,\n note,\n num,\n line: glyphLine,\n shiftL: shift_left,\n shiftR: shift_right,\n });\n }\n // Sort string numbers by line number.\n nums_list.sort((a, b) => b.line - a.line);\n let num_shiftR = 0;\n let x_widthL = 0;\n let x_widthR = 0;\n let last_line = null;\n let last_note = null;\n for (let i = 0; i < nums_list.length; ++i) {\n let num_shift = 0;\n const note = nums_list[i].note;\n const pos = nums_list[i].pos;\n const num = nums_list[i].num;\n const line = nums_list[i].line;\n const shiftR = nums_list[i].shiftR;\n // Reset the position of the string number every line.\n if (line !== last_line || note !== last_note) {\n num_shiftR = right_shift + shiftR;\n }\n const num_width = num.getWidth() + num_spacing;\n if (pos === Modifier.Position.LEFT) {\n num.setXShift(left_shift);\n num_shift = shift_left + num_width; // spacing\n x_widthL = num_shift > x_widthL ? num_shift : x_widthL;\n }\n else if (pos === Modifier.Position.RIGHT) {\n num.setXShift(num_shiftR);\n num_shift += num_width; // spacing\n x_widthR = num_shift > x_widthR ? num_shift : x_widthR;\n }\n last_line = line;\n last_note = note;\n }\n state.left_shift += x_widthL;\n state.right_shift += x_widthR;\n return true;\n }\n setLineEndType(leg) {\n if (leg >= Renderer.LineEndType.NONE && leg <= Renderer.LineEndType.DOWN) {\n this.leg = leg;\n }\n return this;\n }\n setStringNumber(number) {\n this.string_number = number;\n return this;\n }\n setOffsetX(x) {\n this.x_offset = x;\n return this;\n }\n setOffsetY(y) {\n this.y_offset = y;\n return this;\n }\n setLastNote(note) {\n this.last_note = note;\n return this;\n }\n setDashed(dashed) {\n this.dashed = dashed;\n return this;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(this.position, this.index);\n const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP;\n let dot_x = start.x + this.x_shift + this.x_offset;\n let stem_ext = {};\n if (note.hasStem()) {\n stem_ext = note.checkStem().getExtents();\n }\n let dot_y = start.y + this.y_shift + this.y_offset;\n switch (this.position) {\n case Modifier.Position.ABOVE:\n {\n const ys = note.getYs();\n dot_y = ys.reduce((a, b) => (a < b ? a : b));\n if (note.hasStem() && stemDirection == Stem.UP) {\n dot_y = stem_ext.topY + StringNumber.metrics.stemPadding;\n }\n dot_y -= this.radius + StringNumber.metrics.verticalPadding + this.text_line * Tables.STAVE_LINE_DISTANCE;\n }\n break;\n case Modifier.Position.BELOW:\n {\n const ys = note.getYs();\n dot_y = ys.reduce((a, b) => (a > b ? a : b));\n if (note.hasStem() && stemDirection == Stem.DOWN) {\n dot_y = stem_ext.topY - StringNumber.metrics.stemPadding;\n }\n dot_y += this.radius + StringNumber.metrics.verticalPadding + this.text_line * Tables.STAVE_LINE_DISTANCE;\n }\n break;\n case Modifier.Position.LEFT:\n dot_x -= this.radius / 2 + StringNumber.metrics.leftPadding;\n break;\n case Modifier.Position.RIGHT:\n dot_x += this.radius / 2 + StringNumber.metrics.rightPadding;\n break;\n default:\n throw new RuntimeError('InvalidPosition', `The position ${this.position} is invalid`);\n }\n ctx.save();\n ctx.beginPath();\n ctx.arc(dot_x, dot_y, this.radius, 0, Math.PI * 2, false);\n ctx.setLineWidth(1.5);\n ctx.stroke();\n ctx.setFont(this.textFont);\n const x = dot_x - ctx.measureText(this.string_number).width / 2;\n ctx.fillText('' + this.string_number, x, dot_y + 4.5);\n const lastNote = this.last_note;\n if (isStemmableNote(lastNote)) {\n // Only StemmableNote objects have getStemX().\n const end = lastNote.getStemX() - note.getX() + 5;\n ctx.setStrokeStyle('#000000');\n ctx.setLineCap('round');\n ctx.setLineWidth(0.6);\n if (this.dashed) {\n Renderer.drawDashedLine(ctx, dot_x + 10, dot_y, dot_x + end, dot_y, [3, 3]);\n }\n else {\n Renderer.drawDashedLine(ctx, dot_x + 10, dot_y, dot_x + end, dot_y, [3, 0]);\n }\n let len;\n let pattern;\n switch (this.leg) {\n case Renderer.LineEndType.UP:\n len = -10;\n pattern = this.dashed ? [3, 3] : [3, 0];\n Renderer.drawDashedLine(ctx, dot_x + end, dot_y, dot_x + end, dot_y + len, pattern);\n break;\n case Renderer.LineEndType.DOWN:\n len = 10;\n pattern = this.dashed ? [3, 3] : [3, 0];\n Renderer.drawDashedLine(ctx, dot_x + end, dot_y, dot_x + end, dot_y + len, pattern);\n break;\n default:\n break;\n }\n }\n ctx.restore();\n }\n}\nStringNumber.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: Font.SIZE,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Larry Kuhns\n//\n// This file implements the `Stroke` class which renders chord strokes\n// that can be arpeggiated, brushed, rasquedo, etc.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Category, isNote, isStaveNote, isTabNote } from './typeguard';\nimport { RuntimeError } from './util';\nexport class Stroke extends Modifier {\n constructor(type, options) {\n super();\n this.options = Object.assign({ all_voices: true }, options);\n // multi voice - span stroke across all voices if true\n this.all_voices = this.options.all_voices;\n // multi voice - end note of stroke, set in draw()\n this.type = type;\n this.position = Modifier.Position.LEFT;\n this.render_options = {\n font_scale: 38,\n };\n this.resetFont();\n this.setXShift(0);\n this.setWidth(10);\n }\n static get CATEGORY() {\n return Category.Stroke;\n }\n // Arrange strokes inside `ModifierContext`\n static format(strokes, state) {\n const left_shift = state.left_shift;\n const stroke_spacing = 0;\n if (!strokes || strokes.length === 0)\n return false;\n const strokeList = strokes.map((stroke) => {\n const note = stroke.getNote();\n const index = stroke.checkIndex();\n if (isStaveNote(note)) {\n // Only StaveNote objects have getKeyProps().\n const { line } = note.getKeyProps()[index];\n const shift = note.getLeftDisplacedHeadPx();\n return { line, shift, stroke };\n }\n else if (isTabNote(note)) {\n // Only TabNote objects have getPositions().\n const { str: string } = note.getPositions()[index];\n return { line: string, shift: 0, stroke };\n }\n else {\n throw new RuntimeError('Internal', 'Unexpected instance.');\n }\n });\n const strokeShift = left_shift;\n // There can only be one stroke .. if more than one, they overlay each other\n const xShift = strokeList.reduce((xShift, { stroke, shift }) => {\n stroke.setXShift(strokeShift + shift);\n return Math.max(stroke.getWidth() + stroke_spacing, xShift);\n }, 0);\n state.left_shift += xShift;\n return true;\n }\n getPosition() {\n return this.position;\n }\n addEndNote(note) {\n this.note_end = note;\n return this;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(this.position, this.index);\n let ys = note.getYs();\n let topY = start.y;\n let botY = start.y;\n const x = start.x - 5;\n const line_space = note.checkStave().getSpacingBetweenLines();\n const notes = this.checkModifierContext().getMembers(note.getCategory());\n for (let i = 0; i < notes.length; i++) {\n const note = notes[i];\n if (isNote(note)) {\n // Only Note objects have getYs().\n // note is an instance of either StaveNote or TabNote.\n ys = note.getYs();\n for (let n = 0; n < ys.length; n++) {\n if (this.note === notes[i] || this.all_voices) {\n topY = Math.min(topY, ys[n]);\n botY = Math.max(botY, ys[n]);\n }\n }\n }\n }\n let arrow = '';\n let arrow_shift_x = 0;\n let arrow_y = 0;\n let text_shift_x = 0;\n let text_y = 0;\n switch (this.type) {\n case Stroke.Type.BRUSH_DOWN:\n arrow = 'arrowheadBlackUp';\n arrow_shift_x = -3;\n arrow_y = topY - line_space / 2 + 10;\n botY += line_space / 2;\n break;\n case Stroke.Type.BRUSH_UP:\n arrow = 'arrowheadBlackDown';\n arrow_shift_x = 0.5;\n arrow_y = botY + line_space / 2;\n topY -= line_space / 2;\n break;\n case Stroke.Type.ROLL_DOWN:\n case Stroke.Type.RASQUEDO_DOWN:\n arrow = 'arrowheadBlackUp';\n arrow_shift_x = -3;\n text_shift_x = this.x_shift + arrow_shift_x - 2;\n if (isStaveNote(note)) {\n topY += 1.5 * line_space;\n if ((botY - topY) % 2 !== 0) {\n botY += 0.5 * line_space;\n }\n else {\n botY += line_space;\n }\n arrow_y = topY - line_space;\n text_y = botY + line_space + 2;\n }\n else {\n topY += 1.5 * line_space;\n botY += line_space;\n arrow_y = topY - 0.75 * line_space;\n text_y = botY + 0.25 * line_space;\n }\n break;\n case Stroke.Type.ROLL_UP:\n case Stroke.Type.RASQUEDO_UP:\n arrow = 'arrowheadBlackDown';\n arrow_shift_x = -4;\n text_shift_x = this.x_shift + arrow_shift_x - 1;\n if (isStaveNote(note)) {\n arrow_y = line_space / 2;\n topY += 0.5 * line_space;\n if ((botY - topY) % 2 === 0) {\n botY += line_space / 2;\n }\n arrow_y = botY + 0.5 * line_space;\n text_y = topY - 1.25 * line_space;\n }\n else {\n topY += 0.25 * line_space;\n botY += 0.5 * line_space;\n arrow_y = botY + 0.25 * line_space;\n text_y = topY - line_space;\n }\n break;\n case Stroke.Type.ARPEGGIO_DIRECTIONLESS:\n topY += 0.5 * line_space;\n botY += line_space; // * 0.5 can lead to slight underlap instead of overlap sometimes\n break;\n default:\n throw new RuntimeError('InvalidType', `The stroke type ${this.type} does not exist`);\n }\n let strokeLine = 'straight';\n // Draw the stroke\n if (this.type === Stroke.Type.BRUSH_DOWN || this.type === Stroke.Type.BRUSH_UP) {\n ctx.fillRect(x + this.x_shift, topY, 1, botY - topY);\n }\n else {\n strokeLine = 'wiggly';\n if (isStaveNote(note)) {\n for (let i = topY; i <= botY; i += line_space) {\n Glyph.renderGlyph(ctx, x + this.x_shift - 4, i, this.render_options.font_scale, 'vexWiggleArpeggioUp');\n }\n }\n else {\n let i;\n for (i = topY; i <= botY; i += 10) {\n Glyph.renderGlyph(ctx, x + this.x_shift - 4, i, this.render_options.font_scale, 'vexWiggleArpeggioUp');\n }\n if (this.type === Stroke.Type.RASQUEDO_DOWN) {\n text_y = i + 0.25 * line_space;\n }\n }\n }\n if (this.type === Stroke.Type.ARPEGGIO_DIRECTIONLESS) {\n return; // skip drawing arrow heads or text\n }\n // Draw the arrow head\n Glyph.renderGlyph(ctx, x + this.x_shift + arrow_shift_x, arrow_y, this.render_options.font_scale, arrow, {\n category: `stroke.${arrow}.${strokeLine}`,\n });\n // Draw the rasquedo \"R\"\n if (this.type === Stroke.Type.RASQUEDO_DOWN || this.type === Stroke.Type.RASQUEDO_UP) {\n ctx.save();\n ctx.setFont(this.textFont);\n ctx.fillText('R', x + text_shift_x, text_y);\n ctx.restore();\n }\n }\n}\nStroke.Type = {\n BRUSH_DOWN: 1,\n BRUSH_UP: 2,\n ROLL_DOWN: 3,\n ROLL_UP: 4,\n RASQUEDO_DOWN: 5,\n RASQUEDO_UP: 6,\n ARPEGGIO_DIRECTIONLESS: 7, // Arpeggiated chord without upwards or downwards arrow\n};\nStroke.TEXT_FONT = {\n family: Font.SERIF,\n size: Font.SIZE,\n weight: FontWeight.BOLD,\n style: FontStyle.ITALIC,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Bend } from './bend';\nimport { Modifier } from './modifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\n/** `Vibrato` implements diverse vibratos. */\nexport class Vibrato extends Modifier {\n constructor() {\n super();\n this.position = Modifier.Position.RIGHT;\n this.render_options = {\n harsh: false,\n vibrato_width: 20,\n wave_height: 6,\n wave_width: 4,\n wave_girth: 2,\n };\n this.setVibratoWidth(this.render_options.vibrato_width);\n }\n static get CATEGORY() {\n return Category.Vibrato;\n }\n /** Arrange vibratos inside a `ModifierContext`. */\n static format(vibratos, state, context) {\n if (!vibratos || vibratos.length === 0)\n return false;\n // Vibratos are always on top.\n let text_line = state.top_text_line;\n let width = 0;\n let shift = state.right_shift - 7;\n // If there's a bend, drop the text line\n const bends = context.getMembers(Bend.CATEGORY);\n if (bends && bends.length > 0) {\n const bendHeight = bends.map((bb) => bb.getTextHeight()).reduce((a, b) => (a > b ? a : b)) / Tables.STAVE_LINE_DISTANCE;\n text_line = text_line - (bendHeight + 1);\n }\n else {\n state.top_text_line += 1;\n }\n // Format Vibratos\n for (let i = 0; i < vibratos.length; ++i) {\n const vibrato = vibratos[i];\n vibrato.setXShift(shift);\n vibrato.setTextLine(text_line);\n width += vibrato.getWidth();\n shift += width;\n }\n state.right_shift += width;\n return true;\n }\n /** Set harsh vibrato. */\n setHarsh(harsh) {\n this.render_options.harsh = harsh;\n return this;\n }\n /** Set vibrato width in pixels. */\n setVibratoWidth(width) {\n this.render_options.vibrato_width = width;\n this.setWidth(width);\n return this;\n }\n /** Draw the vibrato on the rendering context. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(Modifier.Position.RIGHT, this.index);\n const vx = start.x + this.x_shift;\n const vy = note.getYForTopText(this.text_line) + 2;\n Vibrato.renderVibrato(ctx, vx, vy, this.render_options);\n }\n /**\n * Static rendering method that can be called from\n * other classes (e.g. VibratoBracket).\n */\n static renderVibrato(ctx, x, y, opts) {\n const { harsh, vibrato_width, wave_width, wave_girth, wave_height } = opts;\n const num_waves = vibrato_width / wave_width;\n ctx.beginPath();\n let i;\n if (harsh) {\n ctx.moveTo(x, y + wave_girth + 1);\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.lineTo(x + wave_width, y - wave_height / 2);\n x += wave_width;\n ctx.lineTo(x + wave_width, y + wave_height / 2);\n x += wave_width;\n }\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.lineTo(x - wave_width, y - wave_height / 2 + wave_girth + 1);\n x -= wave_width;\n ctx.lineTo(x - wave_width, y + wave_height / 2 + wave_girth + 1);\n x -= wave_width;\n }\n ctx.fill();\n }\n else {\n ctx.moveTo(x, y + wave_girth);\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.quadraticCurveTo(x + wave_width / 2, y - wave_height / 2, x + wave_width, y);\n x += wave_width;\n ctx.quadraticCurveTo(x + wave_width / 2, y + wave_height / 2, x + wave_width, y);\n x += wave_width;\n }\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.quadraticCurveTo(x - wave_width / 2, y + wave_height / 2 + wave_girth, x - wave_width, y + wave_girth);\n x -= wave_width;\n ctx.quadraticCurveTo(x - wave_width / 2, y - wave_height / 2 + wave_girth, x - wave_width, y + wave_girth);\n x -= wave_width;\n }\n ctx.fill();\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This class implements various types of members to notes (e.g. bends,\n// fingering positions etc.)\nimport { Accidental } from './accidental';\nimport { Annotation } from './annotation';\nimport { Articulation } from './articulation';\nimport { Bend } from './bend';\nimport { ChordSymbol } from './chordsymbol';\nimport { Dot } from './dot';\nimport { FretHandFinger } from './frethandfinger';\nimport { GraceNoteGroup } from './gracenotegroup';\nimport { NoteSubGroup } from './notesubgroup';\nimport { Ornament } from './ornament';\nimport { Parenthesis } from './parenthesis';\nimport { StaveNote } from './stavenote';\nimport { StringNumber } from './stringnumber';\nimport { Stroke } from './strokes';\nimport { Category } from './typeguard';\nimport { log, RuntimeError } from './util';\nimport { Vibrato } from './vibrato';\n// To enable logging for this class. Set `Vex.Flow.ModifierContext.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (ModifierContext.DEBUG)\n log('Vex.Flow.ModifierContext', args);\n}\nexport class ModifierContext {\n constructor() {\n // Formatting data.\n this.state = {\n left_shift: 0,\n right_shift: 0,\n text_line: 0,\n top_text_line: 0,\n };\n // Current members\n this.members = {};\n this.preFormatted = false;\n this.postFormatted = false;\n this.formatted = false;\n this.width = 0;\n this.spacing = 0;\n }\n addModifier(member) {\n L('addModifier is deprecated, use addMember instead.');\n return this.addMember(member);\n }\n /**\n * this.members maps CATEGORY strings to arrays of Tickable | Modifier | StaveNote | TabNote.\n * Here we add a new member to this.members, and create a new array if needed.\n * @param member\n * @returns this\n */\n addMember(member) {\n const category = member.getCategory();\n if (!this.members[category]) {\n this.members[category] = [];\n }\n this.members[category].push(member);\n member.setModifierContext(this);\n this.preFormatted = false;\n return this;\n }\n /**\n * @deprecated\n */\n getModifiers(category) {\n L('getModifiers is deprecated, use getMembers instead.');\n return this.getMembers(category);\n }\n getMembers(category) {\n var _a;\n return (_a = this.members[category]) !== null && _a !== void 0 ? _a : [];\n }\n getWidth() {\n return this.width;\n }\n getLeftShift() {\n return this.state.left_shift;\n }\n getRightShift() {\n return this.state.right_shift;\n }\n getState() {\n return this.state;\n }\n getMetrics() {\n if (!this.formatted) {\n throw new RuntimeError('UnformattedMember', 'Unformatted member has no metrics.');\n }\n return {\n width: this.state.left_shift + this.state.right_shift + this.spacing,\n spacing: this.spacing,\n };\n }\n preFormat() {\n if (this.preFormatted)\n return;\n L('Preformatting ModifierContext');\n const state = this.state;\n const members = this.members;\n // The ordering below determines when different members are formatted and rendered.\n StaveNote.format(members[Category.StaveNote], state);\n Parenthesis.format(members[Category.Parenthesis], state);\n Dot.format(members[Category.Dot], state);\n FretHandFinger.format(members[Category.FretHandFinger], state);\n Accidental.format(members[Category.Accidental], state);\n Stroke.format(members[Category.Stroke], state);\n GraceNoteGroup.format(members[Category.GraceNoteGroup], state);\n NoteSubGroup.format(members[Category.NoteSubGroup], state);\n StringNumber.format(members[Category.StringNumber], state);\n Articulation.format(members[Category.Articulation], state);\n Ornament.format(members[Category.Ornament], state);\n Annotation.format(members[Category.Annotation], state);\n ChordSymbol.format(members[Category.ChordSymbol], state);\n Bend.format(members[Category.Bend], state);\n Vibrato.format(members[Category.Vibrato], state, this);\n // Update width of this member context\n this.width = state.left_shift + state.right_shift;\n this.preFormatted = true;\n }\n postFormat() {\n if (this.postFormatted)\n return;\n L('Postformatting ModifierContext');\n // If post-formatting is required for an element, add more lines below.\n StaveNote.postFormat(this.getMembers(Category.StaveNote));\n }\n}\nModifierContext.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna Cheppudira 2013.\n// Co-author: Benjamin W. Bohl\n// MIT License\nimport { Glyph } from './glyph';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Clef.DEBUG)\n log('Vex.Flow.Clef', args);\n}\n/**\n * Clef implements various types of clefs that can be rendered on a stave.\n *\n * See `tests/clef_tests.ts` for usage examples.\n */\nexport class Clef extends StaveModifier {\n /** Create a new clef. */\n constructor(type, size, annotation) {\n super();\n /**\n * The attribute `clef` must be a key from\n * `Clef.types`\n */\n this.clef = Clef.types['treble'];\n this.setPosition(StaveModifierPosition.BEGIN);\n this.setType(type, size, annotation);\n this.setWidth(Tables.currentMusicFont().lookupMetric(`clef.${this.size}.width`));\n L('Creating clef:', type);\n }\n static get CATEGORY() {\n return Category.Clef;\n }\n /**\n * Every clef name is associated with a glyph code from the font file\n * and a default stave line number.\n */\n static get types() {\n return {\n treble: {\n code: 'gClef',\n line: 3,\n point: 0,\n },\n bass: {\n code: 'fClef',\n line: 1,\n point: 0,\n },\n alto: {\n code: 'cClef',\n line: 2,\n point: 0,\n },\n tenor: {\n code: 'cClef',\n line: 1,\n point: 0,\n },\n percussion: {\n code: 'restMaxima',\n line: 2,\n point: 0,\n },\n soprano: {\n code: 'cClef',\n line: 4,\n point: 0,\n },\n 'mezzo-soprano': {\n code: 'cClef',\n line: 3,\n point: 0,\n },\n 'baritone-c': {\n code: 'cClef',\n line: 0,\n point: 0,\n },\n 'baritone-f': {\n code: 'fClef',\n line: 2,\n point: 0,\n },\n subbass: {\n code: 'fClef',\n line: 0,\n point: 0,\n },\n french: {\n code: 'gClef',\n line: 4,\n point: 0,\n },\n tab: {\n code: '6stringTabClef',\n point: 0,\n },\n };\n }\n /** Set clef type, size and annotation. */\n setType(type, size, annotation) {\n this.type = type;\n this.clef = Clef.types[type];\n if (size === undefined) {\n this.size = 'default';\n }\n else {\n this.size = size;\n }\n const musicFont = Tables.currentMusicFont();\n this.clef.point = musicFont.lookupMetric(`clef.${this.size}.point`, 0);\n this.glyph = new Glyph(this.clef.code, this.clef.point, {\n category: `clef.${this.clef.code}.${this.size}`,\n });\n // If an annotation, such as 8va, is specified, add it to the Clef object.\n if (annotation !== undefined) {\n const code = musicFont.lookupMetric(`clef.annotations.${annotation}.smuflCode`);\n const point = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.point`);\n const line = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.${this.type}.line`);\n const x_shift = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.${this.type}.shiftX`);\n this.annotation = { code, point, line, x_shift };\n this.attachment = new Glyph(this.annotation.code, this.annotation.point);\n this.attachment.metrics.x_max = 0;\n this.attachment.setXShift(this.annotation.x_shift);\n }\n else {\n this.annotation = undefined;\n }\n return this;\n }\n /** Get clef width. */\n getWidth() {\n if (this.type === 'tab') {\n defined(this.stave, 'ClefError', \"Can't get width without stave.\");\n }\n return this.width;\n }\n /** Set associated stave. */\n setStave(stave) {\n this.stave = stave;\n if (this.type === 'tab') {\n const glyph = defined(this.glyph, 'ClefError', \"Can't set stave without glyph.\");\n const numLines = this.stave.getNumLines();\n const musicFont = Tables.currentMusicFont();\n const point = musicFont.lookupMetric(`clef.lineCount.${numLines}.point`);\n const shiftY = musicFont.lookupMetric(`clef.lineCount.${numLines}.shiftY`);\n glyph.setPoint(point);\n glyph.setYShift(shiftY);\n }\n return this;\n }\n /** Render clef. */\n draw() {\n const glyph = defined(this.glyph, 'ClefError', \"Can't draw clef without glyph.\");\n const stave = this.checkStave();\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.openGroup('clef', this.getAttribute('id'));\n glyph.setStave(stave);\n glyph.setContext(ctx);\n if (this.clef.line !== undefined) {\n this.placeGlyphOnLine(glyph, stave, this.clef.line);\n }\n glyph.renderToStave(this.x);\n if (this.annotation !== undefined && this.attachment !== undefined) {\n this.placeGlyphOnLine(this.attachment, stave, this.annotation.line);\n this.attachment.setStave(stave);\n this.attachment.setContext(ctx);\n this.attachment.renderToStave(this.x);\n }\n ctx.closeGroup();\n }\n}\n/** To enable logging for this class, set `Vex.Flow.Clef.DEBUG` to `true`. */\nClef.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Cyril Silverman\n//\n// ## Description\n//\n// This file implements key signatures. A key signature sits on a stave\n// and indicates the notes with implicit accidentals.\nimport { Glyph } from './glyph';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined } from './util';\nexport class KeySignature extends StaveModifier {\n // Create a new Key Signature based on a `key_spec`\n constructor(keySpec, cancelKeySpec, alterKeySpec) {\n super();\n this.accList = [];\n this.setKeySig(keySpec, cancelKeySpec, alterKeySpec);\n this.setPosition(StaveModifierPosition.BEGIN);\n this.glyphFontScale = 38; // TODO(0xFE): Should this match StaveNote?\n this.glyphs = [];\n this.xPositions = []; // relative to this.x\n this.paddingForced = false;\n }\n static get CATEGORY() {\n return Category.KeySignature;\n }\n // Add an accidental glyph to the `KeySignature` instance which represents\n // the provided `acc`. If `nextAcc` is also provided, the appropriate\n // spacing will be included in the glyph's position\n convertToGlyph(acc, nextAcc) {\n const accGlyphData = Tables.accidentalCodes(acc.type);\n const glyph = new Glyph(accGlyphData.code, this.glyphFontScale);\n // Determine spacing between current accidental and the next accidental\n let extraWidth = 1;\n if (acc.type === 'n' && nextAcc) {\n const spacing = KeySignature.accidentalSpacing[nextAcc.type];\n if (spacing) {\n const isAbove = nextAcc.line >= acc.line;\n extraWidth = isAbove ? spacing.above : spacing.below;\n }\n }\n // Place the glyph on the stave\n this.placeGlyphOnLine(glyph, this.checkStave(), acc.line);\n this.glyphs.push(glyph);\n const xPosition = this.xPositions[this.xPositions.length - 1];\n const glyphWidth = glyph.getMetrics().width + extraWidth;\n // Store the next accidental's x position\n this.xPositions.push(xPosition + glyphWidth);\n // Expand size of key signature\n this.width += glyphWidth;\n }\n // Cancel out a key signature provided in the `spec` parameter. This will\n // place appropriate natural accidentals before the key signature.\n cancelKey(spec) {\n this.formatted = false;\n this.cancelKeySpec = spec;\n return this;\n }\n convertToCancelAccList(spec) {\n // Get the accidental list for the cancelled key signature\n const cancel_accList = Tables.keySignature(spec);\n // If the cancelled key has a different accidental type, ie: # vs b\n const different_types = this.accList.length > 0 && cancel_accList.length > 0 && cancel_accList[0].type !== this.accList[0].type;\n // Determine how many naturals needed to add\n const naturals = different_types ? cancel_accList.length : cancel_accList.length - this.accList.length;\n // Return if no naturals needed\n if (naturals < 1)\n return undefined;\n // Get the line position for each natural\n const cancelled = [];\n for (let i = 0; i < naturals; i++) {\n let index = i;\n if (!different_types) {\n index = cancel_accList.length - naturals + i;\n }\n const acc = cancel_accList[index];\n cancelled.push({ type: 'n', line: acc.line });\n }\n // Combine naturals with main accidental list for the key signature\n this.accList = cancelled.concat(this.accList);\n return {\n accList: cancelled,\n type: cancel_accList[0].type,\n };\n }\n // Deprecated\n addToStave(stave) {\n this.paddingForced = true;\n stave.addModifier(this);\n return this;\n }\n // Apply the accidental staff line placement based on the `clef` and\n // the accidental `type` for the key signature ('# or 'b').\n convertAccLines(clef, type, accList = this.accList) {\n let offset = 0.0; // if clef === \"treble\"\n let customLines; // when clef doesn't follow treble key sig shape\n switch (clef) {\n // Treble & Subbass both have offsets of 0, so are not included.\n case 'soprano':\n if (type === '#')\n customLines = [2.5, 0.5, 2, 0, 1.5, -0.5, 1];\n else\n offset = -1;\n break;\n case 'mezzo-soprano':\n if (type === 'b')\n customLines = [0, 2, 0.5, 2.5, 1, 3, 1.5];\n else\n offset = 1.5;\n break;\n case 'alto':\n offset = 0.5;\n break;\n case 'tenor':\n if (type === '#')\n customLines = [3, 1, 2.5, 0.5, 2, 0, 1.5];\n else\n offset = -0.5;\n break;\n case 'baritone-f':\n case 'baritone-c':\n if (type === 'b')\n customLines = [0.5, 2.5, 1, 3, 1.5, 3.5, 2];\n else\n offset = 2;\n break;\n case 'bass':\n case 'french':\n offset = 1;\n break;\n default:\n break;\n }\n // If there's a special case, assign those lines/spaces:\n let i;\n if (typeof customLines !== 'undefined') {\n for (i = 0; i < accList.length; ++i) {\n accList[i].line = customLines[i];\n }\n }\n else if (offset !== 0) {\n for (i = 0; i < accList.length; ++i) {\n accList[i].line += offset;\n }\n }\n }\n getPadding(index) {\n if (!this.formatted)\n this.format();\n return this.glyphs.length === 0 || (!this.paddingForced && index < 2) ? 0 : this.padding;\n }\n getWidth() {\n if (!this.formatted)\n this.format();\n return this.width;\n }\n setKeySig(keySpec, cancelKeySpec, alterKeySpec) {\n this.formatted = false;\n this.keySpec = keySpec;\n this.cancelKeySpec = cancelKeySpec;\n this.alterKeySpec = alterKeySpec;\n return this;\n }\n // Alter the accidentals of a key spec one by one.\n // Each alteration is a new accidental that replaces the\n // original accidental (or the canceled one).\n alterKey(alterKeySpec) {\n this.formatted = false;\n this.alterKeySpec = alterKeySpec;\n return this;\n }\n convertToAlterAccList(alterKeySpec) {\n const max = Math.min(alterKeySpec.length, this.accList.length);\n for (let i = 0; i < max; ++i) {\n if (alterKeySpec[i]) {\n this.accList[i].type = alterKeySpec[i];\n }\n }\n }\n format() {\n const stave = this.checkStave();\n this.width = 0;\n this.glyphs = [];\n this.xPositions = [0]; // initialize with initial x position\n this.accList = Tables.keySignature(defined(this.keySpec));\n const accList = this.accList;\n const firstAccidentalType = accList.length > 0 ? accList[0].type : undefined;\n let cancelAccList;\n if (this.cancelKeySpec) {\n cancelAccList = this.convertToCancelAccList(this.cancelKeySpec);\n }\n if (this.alterKeySpec) {\n this.convertToAlterAccList(this.alterKeySpec);\n }\n if (this.accList.length > 0) {\n const clef = (this.position === StaveModifierPosition.END ? stave.getEndClef() : stave.getClef()) || stave.getClef();\n if (cancelAccList) {\n this.convertAccLines(clef, cancelAccList.type, cancelAccList.accList);\n }\n this.convertAccLines(clef, firstAccidentalType, accList);\n for (let i = 0; i < this.accList.length; ++i) {\n this.convertToGlyph(this.accList[i], this.accList[i + 1]);\n }\n }\n this.formatted = true;\n }\n draw() {\n const stave = this.checkStave();\n const ctx = stave.checkContext();\n if (!this.formatted)\n this.format();\n this.setRendered();\n ctx.openGroup('keysignature', this.getAttribute('id'));\n for (let i = 0; i < this.glyphs.length; i++) {\n const glyph = this.glyphs[i];\n const x = this.x + this.xPositions[i];\n glyph.setStave(stave);\n glyph.setContext(ctx);\n glyph.renderToStave(x);\n }\n ctx.closeGroup();\n }\n}\n// Space between natural and following accidental depending\n// on vertical position\nKeySignature.accidentalSpacing = {\n '#': {\n above: 6,\n below: 4,\n },\n b: {\n above: 4,\n below: 7,\n },\n n: {\n above: 4,\n below: 1,\n },\n '##': {\n above: 6,\n below: 4,\n },\n bb: {\n above: 4,\n below: 7,\n },\n db: {\n above: 4,\n below: 7,\n },\n d: {\n above: 4,\n below: 7,\n },\n bbs: {\n above: 4,\n below: 7,\n },\n '++': {\n above: 6,\n below: 4,\n },\n '+': {\n above: 6,\n below: 4,\n },\n '+-': {\n above: 6,\n below: 4,\n },\n '++-': {\n above: 6,\n below: 4,\n },\n bs: {\n above: 4,\n below: 10,\n },\n bss: {\n above: 4,\n below: 10,\n },\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Larry Kuhns 2011\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { StaveModifier } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nexport class Repetition extends StaveModifier {\n constructor(type, x, y_shift) {\n super();\n this.symbol_type = type;\n this.x = x;\n this.x_shift = 0;\n this.y_shift = y_shift;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.Repetition;\n }\n setShiftX(x) {\n this.x_shift = x;\n return this;\n }\n setShiftY(y) {\n this.y_shift = y;\n return this;\n }\n draw(stave, x) {\n this.setRendered();\n switch (this.symbol_type) {\n case Repetition.type.CODA_RIGHT:\n this.drawCodaFixed(stave, x + stave.getWidth());\n break;\n case Repetition.type.CODA_LEFT:\n this.drawSymbolText(stave, x, 'Coda', true);\n break;\n case Repetition.type.SEGNO_LEFT:\n this.drawSignoFixed(stave, x);\n break;\n case Repetition.type.SEGNO_RIGHT:\n this.drawSignoFixed(stave, x + stave.getWidth());\n break;\n case Repetition.type.DC:\n this.drawSymbolText(stave, x, 'D.C.', false);\n break;\n case Repetition.type.DC_AL_CODA:\n this.drawSymbolText(stave, x, 'D.C. al', true);\n break;\n case Repetition.type.DC_AL_FINE:\n this.drawSymbolText(stave, x, 'D.C. al Fine', false);\n break;\n case Repetition.type.DS:\n this.drawSymbolText(stave, x, 'D.S.', false);\n break;\n case Repetition.type.DS_AL_CODA:\n this.drawSymbolText(stave, x, 'D.S. al', true);\n break;\n case Repetition.type.DS_AL_FINE:\n this.drawSymbolText(stave, x, 'D.S. al Fine', false);\n break;\n case Repetition.type.FINE:\n this.drawSymbolText(stave, x, 'Fine', false);\n break;\n case Repetition.type.TO_CODA:\n this.drawSymbolText(stave, x, 'To', true);\n break;\n default:\n break;\n }\n return this;\n }\n drawCodaFixed(stave, x) {\n const y = stave.getYForTopText(stave.getNumLines()) + this.y_shift;\n Glyph.renderGlyph(stave.checkContext(), this.x + x + this.x_shift, y + Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY'), 40, 'coda', { category: 'coda' });\n return this;\n }\n drawSignoFixed(stave, x) {\n const y = stave.getYForTopText(stave.getNumLines()) + this.y_shift;\n Glyph.renderGlyph(stave.checkContext(), this.x + x + this.x_shift, y + Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY'), 30, 'segno', { category: 'segno' });\n return this;\n }\n drawSymbolText(stave, x, text, draw_coda) {\n const ctx = stave.checkContext();\n ctx.save();\n ctx.setFont(this.textFont);\n let text_x = 0;\n let symbol_x = 0;\n const modifierWidth = stave.getNoteStartX() - this.x;\n switch (this.symbol_type) {\n // To the left with symbol\n case Repetition.type.CODA_LEFT:\n // Offset Coda text to right of stave beginning\n text_x = this.x + stave.getVerticalBarWidth();\n symbol_x =\n text_x +\n ctx.measureText(text).width +\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol');\n break;\n // To the right without symbol\n case Repetition.type.DC:\n case Repetition.type.DC_AL_FINE:\n case Repetition.type.DS:\n case Repetition.type.DS_AL_FINE:\n case Repetition.type.FINE:\n text_x =\n this.x +\n x +\n this.x_shift +\n stave.getWidth() -\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.spacing') -\n modifierWidth -\n ctx.measureText(text).width;\n break;\n // To the right with symbol\n default:\n text_x =\n this.x +\n x +\n this.x_shift +\n stave.getWidth() -\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.spacing') -\n modifierWidth -\n ctx.measureText(text).width -\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol');\n symbol_x =\n text_x +\n ctx.measureText(text).width +\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol');\n break;\n }\n const y = stave.getYForTopText(stave.getNumLines()) +\n this.y_shift +\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY');\n if (draw_coda) {\n Glyph.renderGlyph(ctx, symbol_x, y, 40, 'coda', { category: 'coda' });\n }\n ctx.fillText(text, text_x, y + 5);\n ctx.restore();\n return this;\n }\n}\nRepetition.TEXT_FONT = {\n family: Font.SERIF,\n size: 12,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\nRepetition.type = {\n NONE: 1,\n CODA_LEFT: 2,\n CODA_RIGHT: 3,\n SEGNO_LEFT: 4,\n SEGNO_RIGHT: 5,\n DC: 6,\n DC_AL_CODA: 7,\n DC_AL_FINE: 8,\n DS: 9,\n DS_AL_CODA: 10,\n DS_AL_FINE: 11,\n FINE: 12,\n TO_CODA: 13, // To Coda at end of stave\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Larry Kuhns 2011\nimport { Font, FontStyle, FontWeight } from './font';\nimport { StaveModifier } from './stavemodifier';\nimport { Category } from './typeguard';\nexport class StaveSection extends StaveModifier {\n constructor(section, x, shift_y) {\n super();\n this.setWidth(16);\n this.section = section;\n this.x = x;\n this.shift_x = 0;\n this.shift_y = shift_y;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StaveSection;\n }\n setStaveSection(section) {\n this.section = section;\n return this;\n }\n setShiftX(x) {\n this.shift_x = x;\n return this;\n }\n setShiftY(y) {\n this.shift_y = y;\n return this;\n }\n draw(stave, shift_x) {\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.save();\n ctx.setLineWidth(2);\n ctx.setFont(this.textFont);\n const paddingX = 2;\n const paddingY = 2;\n const rectWidth = 2;\n const textMeasurements = ctx.measureText(this.section);\n const textWidth = textMeasurements.width;\n const textHeight = textMeasurements.height;\n const width = textWidth + 2 * paddingX; // add left & right padding\n const height = textHeight + 2 * paddingY; // add top & bottom padding\n // Seems to be a good default y\n const y = stave.getYForTopText(2) + this.shift_y;\n const x = this.x + shift_x;\n ctx.beginPath();\n ctx.setLineWidth(rectWidth);\n ctx.rect(x, y + textMeasurements.y - paddingY, width, height);\n ctx.stroke();\n ctx.fillText(this.section, x + paddingX, y);\n ctx.restore();\n return this;\n }\n}\nStaveSection.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 10,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Radosaw Eichler 2012\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nexport class StaveTempo extends StaveModifier {\n constructor(tempo, x, shift_y) {\n super();\n /** Font size for note. */\n this.render_options = { glyph_font_scale: 30 };\n this.tempo = tempo;\n this.position = StaveModifierPosition.ABOVE;\n this.x = x;\n this.shift_x = 10;\n this.shift_y = shift_y;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StaveTempo;\n }\n setTempo(tempo) {\n this.tempo = tempo;\n return this;\n }\n setShiftX(x) {\n this.shift_x = x;\n return this;\n }\n setShiftY(y) {\n this.shift_y = y;\n return this;\n }\n draw(stave, shift_x) {\n const ctx = stave.checkContext();\n this.setRendered();\n const options = this.render_options;\n // FIXME: What does the '38' mean? Why 38? Is that supposed to\n // be the default font size for standard notation?\n const scale = options.glyph_font_scale / 38;\n const name = this.tempo.name;\n const duration = this.tempo.duration;\n const dots = this.tempo.dots || 0;\n const bpm = this.tempo.bpm;\n let x = this.x + this.shift_x + shift_x;\n const y = stave.getYForTopText(1) + this.shift_y;\n ctx.save();\n if (name) {\n ctx.setFont(this.textFont);\n ctx.fillText(name, x, y);\n x += ctx.measureText(name).width;\n }\n if (duration && bpm) {\n // Override the weight and style.\n ctx.setFont(Object.assign(Object.assign({}, this.textFont), { weight: 'normal', style: 'normal' }));\n if (name) {\n x += ctx.measureText(' ').width;\n ctx.fillText('(', x, y);\n x += ctx.measureText('(').width;\n }\n const code = Tables.getGlyphProps(duration);\n x += 3 * scale;\n Glyph.renderGlyph(ctx, x, y, options.glyph_font_scale, code.code_head);\n x += code.getWidth() * scale;\n // Draw stem and flags\n if (code.stem) {\n let stem_height = 30;\n if (code.beam_count)\n stem_height += 3 * (code.beam_count - 1);\n stem_height *= scale;\n const y_top = y - stem_height;\n ctx.fillRect(x - scale, y_top, scale, stem_height);\n if (code.flag) {\n Glyph.renderGlyph(ctx, x, y_top, options.glyph_font_scale, code.code_flag_upstem, {\n category: 'flag.staveTempo',\n });\n if (!dots)\n x += 6 * scale;\n }\n }\n // Draw dot\n for (let i = 0; i < dots; i++) {\n x += 6 * scale;\n ctx.beginPath();\n ctx.arc(x, y + 2 * scale, 2 * scale, 0, Math.PI * 2, false);\n ctx.fill();\n }\n ctx.fillText(' = ' + bpm + (name ? ')' : ''), x + 3 * scale, y);\n }\n ctx.restore();\n return this;\n }\n}\nStaveTempo.TEXT_FONT = {\n family: Font.SERIF,\n size: 14,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2014\nimport { Font, FontStyle, FontWeight } from './font';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Justification, TextNote } from './textnote';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StaveText extends StaveModifier {\n constructor(text, position, options = {}) {\n super();\n this.setWidth(16);\n this.text = text;\n this.position = position;\n this.options = Object.assign({ shift_x: 0, shift_y: 0, justification: TextNote.Justification.CENTER }, options);\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StaveText;\n }\n setStaveText(text) {\n this.text = text;\n return this;\n }\n setShiftX(x) {\n this.shift_x = x;\n return this;\n }\n setShiftY(y) {\n this.shift_y = y;\n return this;\n }\n setText(text) {\n this.text = text;\n return this;\n }\n draw(stave) {\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.save();\n ctx.setLineWidth(2);\n ctx.setFont(this.textFont);\n const text_width = ctx.measureText('' + this.text).width;\n let x;\n let y;\n switch (this.position) {\n case StaveModifierPosition.LEFT:\n case StaveModifierPosition.RIGHT:\n y = (stave.getYForLine(0) + stave.getBottomLineY()) / 2 + this.options.shift_y;\n if (this.position === StaveModifierPosition.LEFT) {\n x = stave.getX() - text_width - 24 + this.options.shift_x;\n }\n else {\n x = stave.getX() + stave.getWidth() + 24 + this.options.shift_x;\n }\n break;\n case StaveModifierPosition.ABOVE:\n case StaveModifierPosition.BELOW:\n x = stave.getX() + this.options.shift_x;\n if (this.options.justification === Justification.CENTER) {\n x += stave.getWidth() / 2 - text_width / 2;\n }\n else if (this.options.justification === Justification.RIGHT) {\n x += stave.getWidth() - text_width;\n }\n if (this.position === StaveModifierPosition.ABOVE) {\n y = stave.getYForTopText(2) + this.options.shift_y;\n }\n else {\n y = stave.getYForBottomText(2) + this.options.shift_y;\n }\n break;\n default:\n throw new RuntimeError('InvalidPosition', 'Value Must be in Modifier.Position.');\n }\n ctx.fillText('' + this.text, x, y + 4);\n ctx.restore();\n return this;\n }\n}\nStaveText.TEXT_FONT = {\n family: Font.SERIF,\n size: 16,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// Renders time signatures glyphs for staffs\n// This class is used by TimeSignature to render the associated glyphs\nimport { Glyph } from './glyph';\nimport { defined } from './util';\nexport class TimeSignatureGlyph extends Glyph {\n constructor(timeSignature, topDigits, botDigits, code, point, options) {\n var _a;\n super(code, point, options);\n this.timeSignature = timeSignature;\n this.topGlyphs = [];\n this.botGlyphs = [];\n let topWidth = 0;\n for (let i = 0; i < topDigits.length; ++i) {\n let timeSigType = topDigits[i];\n switch (topDigits[i]) {\n case '-':\n timeSigType = 'Minus';\n break;\n case '+':\n timeSigType = botDigits.length > 0 ? 'PlusSmall' : 'Plus';\n break;\n case '(':\n timeSigType = botDigits.length > 0 ? 'ParensLeftSmall' : 'ParensLeft';\n break;\n case ')':\n timeSigType = botDigits.length > 0 ? 'ParensRightSmall' : 'ParensRight';\n break;\n }\n const topGlyph = new Glyph('timeSig' + timeSigType, this.timeSignature.point);\n this.topGlyphs.push(topGlyph);\n topWidth += (_a = topGlyph.getMetrics().width) !== null && _a !== void 0 ? _a : 0;\n }\n let botWidth = 0;\n for (let i = 0; i < botDigits.length; ++i) {\n let timeSigType = botDigits[i];\n switch (botDigits[i]) {\n case '+':\n timeSigType = 'PlusSmall';\n break;\n case '(':\n timeSigType = 'ParensLeftSmall';\n break;\n case ')':\n timeSigType = 'ParensRightSmall';\n break;\n }\n const botGlyph = new Glyph('timeSig' + timeSigType, this.timeSignature.point);\n this.botGlyphs.push(botGlyph);\n botWidth += defined(botGlyph.getMetrics().width);\n }\n this.width = Math.max(topWidth, botWidth);\n this.xMin = this.getMetrics().x_min;\n this.topStartX = (this.width - topWidth) / 2.0;\n this.botStartX = (this.width - botWidth) / 2.0;\n this.reset();\n }\n getMetrics() {\n return {\n x_min: this.xMin,\n x_max: this.xMin + this.width,\n width: this.width,\n };\n }\n renderToStave(x) {\n const stave = this.checkStave();\n const ctx = this.checkContext();\n let start_x = x + this.topStartX;\n let y = 0;\n if (this.botGlyphs.length > 0)\n y = stave.getYForLine(this.timeSignature.topLine);\n else\n y = (stave.getYForLine(this.timeSignature.topLine) + stave.getYForLine(this.timeSignature.bottomLine)) / 2;\n for (let i = 0; i < this.topGlyphs.length; ++i) {\n const glyph = this.topGlyphs[i];\n Glyph.renderOutline(ctx, glyph.getMetrics().outline, this.scale, start_x + this.x_shift, y);\n start_x += defined(glyph.getMetrics().width);\n }\n start_x = x + this.botStartX;\n y = stave.getYForLine(this.timeSignature.bottomLine);\n for (let i = 0; i < this.botGlyphs.length; ++i) {\n const glyph = this.botGlyphs[i];\n this.timeSignature.placeGlyphOnLine(glyph, stave, 0);\n Glyph.renderOutline(ctx, glyph.getMetrics().outline, this.scale, start_x + glyph.getMetrics().x_shift, y);\n start_x += defined(glyph.getMetrics().width);\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// Implements time signatures glyphs for staffs\n// See tables.js for the internal time signatures\n// representation\nimport { Glyph } from './glyph';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { TimeSignatureGlyph } from './timesigglyph';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nconst assertIsValidTimeSig = (timeSpec) => {\n const numbers = timeSpec.split('/');\n if (numbers.length !== 2 && numbers[0] !== '+' && numbers[0] !== '-') {\n throw new RuntimeError('BadTimeSignature', `Invalid time spec: ${timeSpec}. Must be in the form \"/\"`);\n }\n numbers.forEach((number) => {\n // Characters consisting in number 0..9, '+', '-', '(' or ')'\n if (/^[0-9+\\-()]+$/.test(number) == false) {\n throw new RuntimeError('BadTimeSignature', `Invalid time spec: ${timeSpec}. Must contain valid signatures.`);\n }\n });\n};\nexport class TimeSignature extends StaveModifier {\n constructor(timeSpec = '4/4', customPadding = 15, validate_args = true) {\n super();\n this.validate_args = validate_args;\n const padding = customPadding;\n const musicFont = Tables.currentMusicFont();\n this.point = musicFont.lookupMetric('digits.point');\n const fontLineShift = musicFont.lookupMetric('digits.shiftLine', 0);\n this.topLine = 2 + fontLineShift;\n this.bottomLine = 4 + fontLineShift;\n this.setPosition(StaveModifierPosition.BEGIN);\n this.info = this.parseTimeSpec(timeSpec);\n this.setWidth(defined(this.info.glyph.getMetrics().width));\n this.setPadding(padding);\n }\n static get CATEGORY() {\n return Category.TimeSignature;\n }\n static get glyphs() {\n return {\n C: {\n code: 'timeSigCommon',\n point: 40,\n line: 2,\n },\n 'C|': {\n code: 'timeSigCutCommon',\n point: 40,\n line: 2,\n },\n };\n }\n parseTimeSpec(timeSpec) {\n var _a, _b;\n if (timeSpec === 'C' || timeSpec === 'C|') {\n const { line, code, point } = TimeSignature.glyphs[timeSpec];\n return {\n line,\n num: false,\n glyph: new Glyph(code, point),\n };\n }\n if (this.validate_args) {\n assertIsValidTimeSig(timeSpec);\n }\n const parts = timeSpec.split('/');\n return {\n num: true,\n glyph: this.makeTimeSignatureGlyph((_a = parts[0]) !== null && _a !== void 0 ? _a : '', (_b = parts[1]) !== null && _b !== void 0 ? _b : ''),\n };\n }\n makeTimeSignatureGlyph(topDigits, botDigits) {\n return new TimeSignatureGlyph(this, topDigits, botDigits, 'timeSig0', this.point);\n }\n getInfo() {\n return this.info;\n }\n setTimeSig(timeSpec) {\n this.info = this.parseTimeSpec(timeSpec);\n return this;\n }\n draw() {\n const stave = this.checkStave();\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.openGroup('timesignature', this.getAttribute('id'));\n this.info.glyph.setStave(stave);\n this.info.glyph.setContext(ctx);\n this.placeGlyphOnLine(this.info.glyph, stave, this.info.line);\n this.info.glyph.renderToStave(this.x);\n ctx.closeGroup();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { BoundingBox } from './boundingbox';\nimport { Clef } from './clef';\nimport { Element } from './element';\nimport { Font, FontStyle, FontWeight } from './font';\nimport { KeySignature } from './keysignature';\nimport { Barline, BarlineType } from './stavebarline';\nimport { StaveModifierPosition } from './stavemodifier';\nimport { Repetition } from './staverepetition';\nimport { StaveSection } from './stavesection';\nimport { StaveTempo } from './stavetempo';\nimport { StaveText } from './stavetext';\nimport { Volta } from './stavevolta';\nimport { Tables } from './tables';\nimport { TimeSignature } from './timesignature';\nimport { Category, isBarline } from './typeguard';\nimport { RuntimeError } from './util';\n// Used by Stave.format() to sort the modifiers at the beginning and end of a stave.\n// The keys (computed property names) match the CATEGORY property in the\n// Barline, Clef, KeySignature, TimeSignature classes.\nconst SORT_ORDER_BEG_MODIFIERS = {\n [Barline.CATEGORY]: 0,\n [Clef.CATEGORY]: 1,\n [KeySignature.CATEGORY]: 2,\n [TimeSignature.CATEGORY]: 3,\n};\nconst SORT_ORDER_END_MODIFIERS = {\n [TimeSignature.CATEGORY]: 0,\n [KeySignature.CATEGORY]: 1,\n [Barline.CATEGORY]: 2,\n [Clef.CATEGORY]: 3,\n};\nexport class Stave extends Element {\n constructor(x, y, width, options) {\n super();\n // Initialized by the constructor via this.resetLines().\n this.height = 0;\n this.x = x;\n this.y = y;\n this.width = width;\n this.formatted = false;\n this.start_x = x + 5;\n this.end_x = x + width;\n this.modifiers = []; // stave modifiers (clef, key, time, barlines, coda, segno, etc.)\n this.measure = 0;\n this.clef = 'treble';\n this.endClef = undefined;\n this.resetFont();\n this.options = Object.assign({ vertical_bar_width: 10, num_lines: 5, fill_style: '#999999', left_bar: true, right_bar: true, spacing_between_lines_px: Tables.STAVE_LINE_DISTANCE, space_above_staff_ln: 4, space_below_staff_ln: 4, top_text_position: 1, bottom_text_position: 4, line_config: [] }, options);\n this.bounds = { x: this.x, y: this.y, w: this.width, h: 0 };\n this.defaultLedgerLineStyle = { strokeStyle: '#444', lineWidth: 1.4 };\n this.resetLines();\n // beg bar\n this.addModifier(new Barline(this.options.left_bar ? BarlineType.SINGLE : BarlineType.NONE));\n // end bar\n this.addEndModifier(new Barline(this.options.right_bar ? BarlineType.SINGLE : BarlineType.NONE));\n }\n static get CATEGORY() {\n return Category.Stave;\n }\n // This is the sum of the padding that normally goes on left + right of a stave during\n // drawing. Used to size staves correctly with content width.\n static get defaultPadding() {\n const musicFont = Tables.currentMusicFont();\n return musicFont.lookupMetric('stave.padding') + musicFont.lookupMetric('stave.endPaddingMax');\n }\n // Right padding, used by system if startX is already determined.\n static get rightPadding() {\n const musicFont = Tables.currentMusicFont();\n return musicFont.lookupMetric('stave.endPaddingMax');\n }\n /** Set default style for ledger lines. */\n setDefaultLedgerLineStyle(style) {\n this.defaultLedgerLineStyle = style;\n }\n /** Get default style for ledger lines. */\n getDefaultLedgerLineStyle() {\n return Object.assign(Object.assign({}, this.getStyle()), this.defaultLedgerLineStyle);\n }\n space(spacing) {\n return this.options.spacing_between_lines_px * spacing;\n }\n resetLines() {\n this.options.line_config = [];\n for (let i = 0; i < this.options.num_lines; i++) {\n this.options.line_config.push({ visible: true });\n }\n this.height = (this.options.num_lines + this.options.space_above_staff_ln) * this.options.spacing_between_lines_px;\n this.options.bottom_text_position = this.options.num_lines;\n }\n setNoteStartX(x) {\n if (!this.formatted)\n this.format();\n this.start_x = x;\n const begBarline = this.modifiers[0];\n begBarline.setX(this.start_x - begBarline.getWidth());\n return this;\n }\n getNoteStartX() {\n if (!this.formatted)\n this.format();\n return this.start_x;\n }\n getNoteEndX() {\n if (!this.formatted)\n this.format();\n return this.end_x;\n }\n getTieStartX() {\n return this.start_x;\n }\n getTieEndX() {\n return this.end_x;\n }\n getX() {\n return this.x;\n }\n getNumLines() {\n return this.options.num_lines;\n }\n setNumLines(n) {\n this.options.num_lines = n;\n this.resetLines();\n return this;\n }\n setY(y) {\n this.y = y;\n return this;\n }\n getY() {\n return this.y;\n }\n getTopLineTopY() {\n return this.getYForLine(0) - Tables.STAVE_LINE_THICKNESS / 2;\n }\n getBottomLineBottomY() {\n return this.getYForLine(this.getNumLines() - 1) + Tables.STAVE_LINE_THICKNESS / 2;\n }\n setX(x) {\n const shift = x - this.x;\n this.formatted = false;\n this.x = x;\n this.start_x += shift;\n this.end_x += shift;\n for (let i = 0; i < this.modifiers.length; i++) {\n const mod = this.modifiers[i];\n mod.setX(mod.getX() + shift);\n }\n return this;\n }\n setWidth(width) {\n this.formatted = false;\n this.width = width;\n this.end_x = this.x + width;\n // reset the x position of the end barline (TODO(0xfe): This makes no sense)\n // this.modifiers[1].setX(this.end_x);\n return this;\n }\n getWidth() {\n return this.width;\n }\n getStyle() {\n return Object.assign({ fillStyle: this.options.fill_style, strokeStyle: this.options.fill_style, lineWidth: Tables.STAVE_LINE_THICKNESS }, this.style);\n }\n setMeasure(measure) {\n this.measure = measure;\n return this;\n }\n /**\n * Gets the pixels to shift from the beginning of the stave\n * following the modifier at the provided index\n * @param {Number} index The index from which to determine the shift\n * @return {Number} The amount of pixels shifted\n */\n getModifierXShift(index = 0) {\n if (typeof index !== 'number') {\n throw new RuntimeError('InvalidIndex', 'Must be of number type');\n }\n if (!this.formatted)\n this.format();\n if (this.getModifiers(StaveModifierPosition.BEGIN).length === 1) {\n return 0;\n }\n // for right position modifiers zero shift seems correct, see 'Volta + Modifier Measure Test'\n if (this.modifiers[index].getPosition() === StaveModifierPosition.RIGHT) {\n return 0;\n }\n let start_x = this.start_x - this.x;\n const begBarline = this.modifiers[0];\n if (begBarline.getType() === BarlineType.REPEAT_BEGIN && start_x > begBarline.getWidth()) {\n start_x -= begBarline.getWidth();\n }\n return start_x;\n }\n /** Coda & Segno Symbol functions */\n setRepetitionType(type, yShift = 0) {\n this.modifiers.push(new Repetition(type, this.x, yShift));\n return this;\n }\n // Volta functions\n setVoltaType(type, number_t, y) {\n this.modifiers.push(new Volta(type, number_t, this.x, y));\n return this;\n }\n // Section functions\n setSection(section, y, xOffset = 0, fontSize) {\n const staveSection = new StaveSection(section, this.x + xOffset, y);\n if (fontSize)\n staveSection.setFontSize(fontSize);\n this.modifiers.push(staveSection);\n return this;\n }\n // Tempo functions\n setTempo(tempo, y) {\n this.modifiers.push(new StaveTempo(tempo, this.x, y));\n return this;\n }\n // Text functions\n setText(text, position, options = {}) {\n this.modifiers.push(new StaveText(text, position, options));\n return this;\n }\n getHeight() {\n return this.height;\n }\n getSpacingBetweenLines() {\n return this.options.spacing_between_lines_px;\n }\n getBoundingBox() {\n return new BoundingBox(this.x, this.y, this.width, this.getBottomY() - this.y);\n }\n getBottomY() {\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const score_bottom = this.getYForLine(options.num_lines) + options.space_below_staff_ln * spacing;\n return score_bottom;\n }\n getBottomLineY() {\n return this.getYForLine(this.options.num_lines);\n }\n // This returns\n /** @returns the y for the *center* of a staff line */\n getYForLine(line) {\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const headroom = options.space_above_staff_ln;\n const y = this.y + line * spacing + headroom * spacing;\n return y;\n }\n getLineForY(y) {\n // Does the reverse of getYForLine - somewhat dumb and just calls\n // getYForLine until the right value is reaches\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const headroom = options.space_above_staff_ln;\n return (y - this.y) / spacing - headroom;\n }\n getYForTopText(line = 0) {\n return this.getYForLine(-line - this.options.top_text_position);\n }\n getYForBottomText(line = 0) {\n return this.getYForLine(this.options.bottom_text_position + line);\n }\n getYForNote(line) {\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const headroom = options.space_above_staff_ln;\n return this.y + headroom * spacing + 5 * spacing - line * spacing;\n }\n getYForGlyphs() {\n return this.getYForLine(3);\n }\n // This method adds a stave modifier to the stave. Note that the first two\n // modifiers (BarLines) are automatically added upon construction.\n addModifier(modifier, position) {\n if (position !== undefined) {\n modifier.setPosition(position);\n }\n modifier.setStave(this);\n this.formatted = false;\n this.modifiers.push(modifier);\n return this;\n }\n addEndModifier(modifier) {\n this.addModifier(modifier, StaveModifierPosition.END);\n return this;\n }\n // Bar Line functions\n setBegBarType(type) {\n // Only valid bar types at beginning of stave is none, single or begin repeat\n const { SINGLE, REPEAT_BEGIN, NONE } = BarlineType;\n if (type === SINGLE || type === REPEAT_BEGIN || type === NONE) {\n this.modifiers[0].setType(type);\n this.formatted = false;\n }\n return this;\n }\n setEndBarType(type) {\n // Repeat end not valid at end of stave\n if (type !== BarlineType.REPEAT_BEGIN) {\n this.modifiers[1].setType(type);\n this.formatted = false;\n }\n return this;\n }\n setClef(clefSpec, size, annotation, position) {\n if (position === undefined) {\n position = StaveModifierPosition.BEGIN;\n }\n if (position === StaveModifierPosition.END) {\n this.endClef = clefSpec;\n }\n else {\n this.clef = clefSpec;\n }\n const clefs = this.getModifiers(position, Clef.CATEGORY);\n if (clefs.length === 0) {\n this.addClef(clefSpec, size, annotation, position);\n }\n else {\n clefs[0].setType(clefSpec, size, annotation);\n }\n return this;\n }\n getClef() {\n return this.clef;\n }\n setEndClef(clefSpec, size, annotation) {\n this.setClef(clefSpec, size, annotation, StaveModifierPosition.END);\n return this;\n }\n getEndClef() {\n return this.endClef;\n }\n setKeySignature(keySpec, cancelKeySpec, position) {\n if (position === undefined) {\n position = StaveModifierPosition.BEGIN;\n }\n const keySignatures = this.getModifiers(position, KeySignature.CATEGORY);\n if (keySignatures.length === 0) {\n this.addKeySignature(keySpec, cancelKeySpec, position);\n }\n else {\n keySignatures[0].setKeySig(keySpec, cancelKeySpec);\n }\n return this;\n }\n setEndKeySignature(keySpec, cancelKeySpec) {\n this.setKeySignature(keySpec, cancelKeySpec, StaveModifierPosition.END);\n return this;\n }\n setTimeSignature(timeSpec, customPadding, position) {\n if (position === undefined) {\n position = StaveModifierPosition.BEGIN;\n }\n const timeSignatures = this.getModifiers(position, TimeSignature.CATEGORY);\n if (timeSignatures.length === 0) {\n this.addTimeSignature(timeSpec, customPadding, position);\n }\n else {\n timeSignatures[0].setTimeSig(timeSpec);\n }\n return this;\n }\n setEndTimeSignature(timeSpec, customPadding) {\n this.setTimeSignature(timeSpec, customPadding, StaveModifierPosition.END);\n return this;\n }\n /**\n * Add a key signature to the stave.\n *\n * Example:\n * `stave.addKeySignature('Db');`\n * @param keySpec new key specification `[A-G][b|#]?`\n * @param cancelKeySpec\n * @param position\n * @returns\n */\n addKeySignature(keySpec, cancelKeySpec, position) {\n if (position === undefined) {\n position = StaveModifierPosition.BEGIN;\n }\n this.addModifier(new KeySignature(keySpec, cancelKeySpec).setPosition(position), position);\n return this;\n }\n /**\n * Add a clef to the stave.\n *\n * Example:\n *\n * stave.addClef('treble')\n * @param clef clef (treble|bass|...) see {@link Clef.types}\n * @param size\n * @param annotation\n * @param position\n * @returns\n */\n addClef(clef, size, annotation, position) {\n if (position === undefined || position === StaveModifierPosition.BEGIN) {\n this.clef = clef;\n }\n else if (position === StaveModifierPosition.END) {\n this.endClef = clef;\n }\n this.addModifier(new Clef(clef, size, annotation), position);\n return this;\n }\n addEndClef(clef, size, annotation) {\n this.addClef(clef, size, annotation, StaveModifierPosition.END);\n return this;\n }\n /**\n * Add a time signature to the stave\n *\n * Example:\n *\n * `stave.addTimeSignature('4/4');`\n * @param timeSpec time signature specification `(C\\||C|\\d\\/\\d)`\n * @param customPadding\n * @param position\n * @returns\n */\n addTimeSignature(timeSpec, customPadding, position) {\n this.addModifier(new TimeSignature(timeSpec, customPadding), position);\n return this;\n }\n addEndTimeSignature(timeSpec, customPadding) {\n this.addTimeSignature(timeSpec, customPadding, StaveModifierPosition.END);\n return this;\n }\n // Deprecated\n addTrebleGlyph() {\n this.addClef('treble');\n return this;\n }\n /**\n * @param position\n * @param category\n * @returns array of StaveModifiers that match the provided position and category.\n */\n getModifiers(position, category) {\n const noPosition = position === undefined;\n const noCategory = category === undefined;\n if (noPosition && noCategory) {\n return this.modifiers;\n }\n else if (noPosition) {\n // A category was provided.\n return this.modifiers.filter((m) => category === m.getCategory());\n }\n else if (noCategory) {\n // A position was provided.\n return this.modifiers.filter((m) => position === m.getPosition());\n }\n else {\n // Both position and category were provided!\n return this.modifiers.filter((m) => position === m.getPosition() && category === m.getCategory());\n }\n }\n /**\n * Use the modifier's `getCategory()` as a key for the `order` array.\n * The retrieved value is used to sort modifiers from left to right (0 to to 3).\n */\n sortByCategory(items, order) {\n for (let i = items.length - 1; i >= 0; i--) {\n for (let j = 0; j < i; j++) {\n if (order[items[j].getCategory()] > order[items[j + 1].getCategory()]) {\n const temp = items[j];\n items[j] = items[j + 1];\n items[j + 1] = temp;\n }\n }\n }\n }\n format() {\n const begBarline = this.modifiers[0];\n const endBarline = this.modifiers[1];\n const begModifiers = this.getModifiers(StaveModifierPosition.BEGIN);\n const endModifiers = this.getModifiers(StaveModifierPosition.END);\n this.sortByCategory(begModifiers, SORT_ORDER_BEG_MODIFIERS);\n this.sortByCategory(endModifiers, SORT_ORDER_END_MODIFIERS);\n if (begModifiers.length > 1 && begBarline.getType() === BarlineType.REPEAT_BEGIN) {\n begModifiers.push(begModifiers.splice(0, 1)[0]);\n begModifiers.splice(0, 0, new Barline(BarlineType.SINGLE));\n }\n if (endModifiers.indexOf(endBarline) > 0) {\n endModifiers.splice(0, 0, new Barline(BarlineType.NONE));\n }\n let width;\n let padding;\n let modifier;\n let offset = 0;\n let x = this.x;\n for (let i = 0; i < begModifiers.length; i++) {\n modifier = begModifiers[i];\n padding = modifier.getPadding(i + offset);\n width = modifier.getWidth();\n x += padding;\n modifier.setX(x);\n x += width;\n if (padding + width === 0)\n offset--;\n }\n this.start_x = x;\n x = this.x + this.width;\n const widths = {\n left: 0,\n right: 0,\n paddingRight: 0,\n paddingLeft: 0,\n };\n let lastBarlineIdx = 0;\n for (let i = 0; i < endModifiers.length; i++) {\n modifier = endModifiers[i];\n lastBarlineIdx = isBarline(modifier) ? i : lastBarlineIdx;\n widths.right = 0;\n widths.left = 0;\n widths.paddingRight = 0;\n widths.paddingLeft = 0;\n const layoutMetrics = modifier.getLayoutMetrics();\n if (layoutMetrics) {\n if (i !== 0) {\n widths.right = layoutMetrics.xMax || 0;\n widths.paddingRight = layoutMetrics.paddingRight || 0;\n }\n widths.left = -layoutMetrics.xMin || 0;\n widths.paddingLeft = layoutMetrics.paddingLeft || 0;\n if (i === endModifiers.length - 1) {\n widths.paddingLeft = 0;\n }\n }\n else {\n widths.paddingRight = modifier.getPadding(i - lastBarlineIdx);\n if (i !== 0) {\n widths.right = modifier.getWidth();\n }\n if (i === 0) {\n widths.left = modifier.getWidth();\n }\n }\n x -= widths.paddingRight;\n x -= widths.right;\n modifier.setX(x);\n x -= widths.left;\n x -= widths.paddingLeft;\n }\n this.end_x = endModifiers.length === 1 ? this.x + this.width : x;\n this.formatted = true;\n }\n /**\n * All drawing functions below need the context to be set.\n */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n ctx.openGroup('stave', this.getAttribute('id'));\n if (!this.formatted)\n this.format();\n const num_lines = this.options.num_lines;\n const width = this.width;\n const x = this.x;\n let y;\n // Render lines\n for (let line = 0; line < num_lines; line++) {\n y = this.getYForLine(line);\n this.applyStyle();\n if (this.options.line_config[line].visible) {\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(x + width, y);\n ctx.stroke();\n }\n this.restoreStyle();\n }\n // Draw the modifiers (bar lines, coda, segno, repeat brackets, etc.)\n for (let i = 0; i < this.modifiers.length; i++) {\n const modifier = this.modifiers[i];\n // Only draw modifier if it has a draw function\n if (typeof modifier.draw === 'function') {\n modifier.applyStyle(ctx);\n modifier.draw(this, this.getModifierXShift(i));\n modifier.restoreStyle(ctx);\n }\n }\n // Render measure numbers\n if (this.measure > 0) {\n ctx.save();\n ctx.setFont(this.textFont);\n const textWidth = ctx.measureText('' + this.measure).width;\n y = this.getYForTopText(0) + 3;\n ctx.fillText('' + this.measure, this.x - textWidth / 2, y);\n ctx.restore();\n }\n ctx.closeGroup();\n return this;\n }\n getVerticalBarWidth() {\n return this.options.vertical_bar_width;\n }\n /**\n * Get the current configuration for the Stave.\n * @return {Array} An array of configuration objects.\n */\n getConfigForLines() {\n return this.options.line_config;\n }\n /**\n * Configure properties of the lines in the Stave\n * @param line_number The index of the line to configure.\n * @param line_config An configuration object for the specified line.\n * @throws RuntimeError \"StaveConfigError\" When the specified line number is out of\n * range of the number of lines specified in the constructor.\n */\n setConfigForLine(line_number, line_config) {\n if (line_number >= this.options.num_lines || line_number < 0) {\n throw new RuntimeError('StaveConfigError', 'The line number must be within the range of the number of lines in the Stave.');\n }\n if (line_config.visible === undefined) {\n throw new RuntimeError('StaveConfigError', \"The line configuration object is missing the 'visible' property.\");\n }\n if (typeof line_config.visible !== 'boolean') {\n throw new RuntimeError('StaveConfigError', \"The line configuration objects 'visible' property must be true or false.\");\n }\n this.options.line_config[line_number] = line_config;\n return this;\n }\n /**\n * Set the staff line configuration array for all of the lines at once.\n * @param lines_configuration An array of line configuration objects. These objects\n * are of the same format as the single one passed in to setLineConfiguration().\n * The caller can set null for any line config entry if it is desired that the default be used\n * @throws RuntimeError \"StaveConfigError\" When the lines_configuration array does not have\n * exactly the same number of elements as the num_lines configuration object set in\n * the constructor.\n */\n setConfigForLines(lines_configuration) {\n if (lines_configuration.length !== this.options.num_lines) {\n throw new RuntimeError('StaveConfigError', 'The length of the lines configuration array must match the number of lines in the Stave');\n }\n // Make sure the defaults are present in case an incomplete set of\n // configuration options were supplied.\n // eslint-disable-next-line\n for (const line_config in lines_configuration) {\n // Allow '{}' to be used if the caller just wants the default for a particular node.\n if (lines_configuration[line_config].visible == undefined) {\n lines_configuration[line_config] = this.options.line_config[line_config];\n }\n this.options.line_config[line_config] = Object.assign(Object.assign({}, this.options.line_config[line_config]), lines_configuration[line_config]);\n }\n this.options.line_config = lines_configuration;\n return this;\n }\n}\nStave.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 8,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nfunction drawBoldDoubleLine(ctx, type, topX, topY, botY) {\n if (type !== StaveConnector.type.BOLD_DOUBLE_LEFT && type !== StaveConnector.type.BOLD_DOUBLE_RIGHT) {\n throw new RuntimeError('InvalidConnector', 'A REPEAT_BEGIN or REPEAT_END type must be provided.');\n }\n let x_shift = 3;\n let variableWidth = 3.5; // Width for avoiding anti-aliasing width issues\n const thickLineOffset = 2; // For aesthetics\n if (type === StaveConnector.type.BOLD_DOUBLE_RIGHT) {\n x_shift = -5; // Flips the side of the thin line\n variableWidth = 3;\n }\n // Thin line\n ctx.fillRect(topX + x_shift, topY, 1, botY - topY);\n // Thick line\n ctx.fillRect(topX - thickLineOffset, topY, variableWidth, botY - topY);\n}\n/** StaveConnector implements the connector lines between staves of a system. */\nexport class StaveConnector extends Element {\n constructor(top_stave, bottom_stave) {\n super();\n this.thickness = Tables.STAVE_LINE_THICKNESS;\n this.width = 3;\n this.top_stave = top_stave;\n this.bottom_stave = bottom_stave;\n this.type = StaveConnector.type.DOUBLE;\n this.resetFont();\n // 1. Offset Bold Double Left to align with offset Repeat Begin bars\n // 2. Offset BRACE type not to overlap with another StaveConnector\n this.x_shift = 0;\n this.texts = [];\n }\n static get CATEGORY() {\n return Category.StaveConnector;\n }\n /**\n * Set type.\n * @param type see {@link StaveConnector.type} & {@link StaveConnector.typeString}\n */\n setType(type) {\n type = typeof type === 'string' ? StaveConnector.typeString[type] : type;\n if (type >= StaveConnector.type.SINGLE_RIGHT && type <= StaveConnector.type.NONE) {\n this.type = type;\n }\n return this;\n }\n /** Set optional associated Text. */\n setText(text, options = {}) {\n this.texts.push({\n content: text,\n options: Object.assign({ shift_x: 0, shift_y: 0 }, options),\n });\n return this;\n }\n setXShift(x_shift) {\n if (typeof x_shift !== 'number') {\n throw new RuntimeError('InvalidType', 'x_shift must be a Number');\n }\n this.x_shift = x_shift;\n return this;\n }\n getXShift() {\n return this.x_shift;\n }\n /** Render connector and associated text. */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n let topY = this.top_stave.getYForLine(0);\n let botY = this.bottom_stave.getYForLine(this.bottom_stave.getNumLines() - 1) + this.thickness;\n let width = this.width;\n let topX = this.top_stave.getX();\n const isRightSidedConnector = this.type === StaveConnector.type.SINGLE_RIGHT ||\n this.type === StaveConnector.type.BOLD_DOUBLE_RIGHT ||\n this.type === StaveConnector.type.THIN_DOUBLE;\n if (isRightSidedConnector) {\n topX = this.top_stave.getX() + this.top_stave.getWidth();\n }\n let attachment_height = botY - topY;\n switch (this.type) {\n case StaveConnector.type.SINGLE:\n width = 1;\n break;\n case StaveConnector.type.SINGLE_LEFT:\n width = 1;\n break;\n case StaveConnector.type.SINGLE_RIGHT:\n width = 1;\n break;\n case StaveConnector.type.DOUBLE:\n topX -= this.width + 2;\n topY -= this.thickness;\n attachment_height += 0.5;\n break;\n case StaveConnector.type.BRACE: {\n width = 12;\n // May need additional code to draw brace\n const x1 = this.top_stave.getX() - 2 + this.x_shift;\n const y1 = topY;\n const x3 = x1;\n const y3 = botY;\n const x2 = x1 - width;\n const y2 = y1 + attachment_height / 2.0;\n const cpx1 = x2 - 0.9 * width;\n const cpy1 = y1 + 0.2 * attachment_height;\n const cpx2 = x1 + 1.1 * width;\n const cpy2 = y2 - 0.135 * attachment_height;\n const cpx3 = cpx2;\n const cpy3 = y2 + 0.135 * attachment_height;\n const cpx4 = cpx1;\n const cpy4 = y3 - 0.2 * attachment_height;\n const cpx5 = x2 - width;\n const cpy5 = cpy4;\n const cpx6 = x1 + 0.4 * width;\n const cpy6 = y2 + 0.135 * attachment_height;\n const cpx7 = cpx6;\n const cpy7 = y2 - 0.135 * attachment_height;\n const cpx8 = cpx5;\n const cpy8 = cpy1;\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, x2, y2);\n ctx.bezierCurveTo(cpx3, cpy3, cpx4, cpy4, x3, y3);\n ctx.bezierCurveTo(cpx5, cpy5, cpx6, cpy6, x2, y2);\n ctx.bezierCurveTo(cpx7, cpy7, cpx8, cpy8, x1, y1);\n ctx.fill();\n ctx.stroke();\n break;\n }\n case StaveConnector.type.BRACKET:\n topY -= 6;\n botY += 6;\n attachment_height = botY - topY;\n Glyph.renderGlyph(ctx, topX - 5, topY, 40, 'bracketTop');\n Glyph.renderGlyph(ctx, topX - 5, botY, 40, 'bracketBottom');\n topX -= this.width + 2;\n break;\n case StaveConnector.type.BOLD_DOUBLE_LEFT:\n drawBoldDoubleLine(ctx, this.type, topX + this.x_shift, topY, botY - this.thickness);\n break;\n case StaveConnector.type.BOLD_DOUBLE_RIGHT:\n drawBoldDoubleLine(ctx, this.type, topX, topY, botY - this.thickness);\n break;\n case StaveConnector.type.THIN_DOUBLE:\n width = 1;\n attachment_height -= this.thickness;\n break;\n case StaveConnector.type.NONE:\n break;\n default:\n throw new RuntimeError('InvalidType', `The provided StaveConnector.type (${this.type}) is invalid.`);\n }\n if (this.type !== StaveConnector.type.BRACE &&\n this.type !== StaveConnector.type.BOLD_DOUBLE_LEFT &&\n this.type !== StaveConnector.type.BOLD_DOUBLE_RIGHT &&\n this.type !== StaveConnector.type.NONE) {\n ctx.fillRect(topX, topY, width, attachment_height);\n }\n // If the connector is a thin double barline, draw the paralell line\n if (this.type === StaveConnector.type.THIN_DOUBLE) {\n ctx.fillRect(topX - 3, topY, width, attachment_height);\n }\n ctx.save();\n ctx.setLineWidth(2);\n ctx.setFont(this.textFont);\n // Add stave connector text\n for (let i = 0; i < this.texts.length; i++) {\n const text = this.texts[i];\n const text_width = ctx.measureText('' + text.content).width;\n const x = this.top_stave.getX() - text_width - 24 + text.options.shift_x;\n const y = (this.top_stave.getYForLine(0) + this.bottom_stave.getBottomLineY()) / 2 + text.options.shift_y;\n ctx.fillText('' + text.content, x, y + 4);\n }\n ctx.restore();\n }\n}\nStaveConnector.TEXT_FONT = {\n family: Font.SERIF,\n size: 16,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n/**\n * SINGLE_LEFT and SINGLE are the same value for compatibility\n * with older versions of vexflow which didn't have right sided\n * stave connectors.\n */\nStaveConnector.type = {\n SINGLE_RIGHT: 0,\n SINGLE_LEFT: 1,\n SINGLE: 1,\n DOUBLE: 2,\n BRACE: 3,\n BRACKET: 4,\n BOLD_DOUBLE_LEFT: 5,\n BOLD_DOUBLE_RIGHT: 6,\n THIN_DOUBLE: 7,\n NONE: 8,\n};\n/**\n * Connector type:\n * * \"singleRight\"\n * * \"singleLeft\"\n * * \"single\"\n * * \"double\"\n * * \"brace\"\n * * \"bracket\"\n * * \"boldDoubleLeft\"\n * * \"boldDoubleRight\"\n * * \"thinDouble\"\n * * \"none\"\n */\nStaveConnector.typeString = {\n singleRight: StaveConnector.type.SINGLE_RIGHT,\n singleLeft: StaveConnector.type.SINGLE_LEFT,\n single: StaveConnector.type.SINGLE,\n double: StaveConnector.type.DOUBLE,\n brace: StaveConnector.type.BRACE,\n bracket: StaveConnector.type.BRACKET,\n boldDoubleLeft: StaveConnector.type.BOLD_DOUBLE_LEFT,\n boldDoubleRight: StaveConnector.type.BOLD_DOUBLE_RIGHT,\n thinDouble: StaveConnector.type.THIN_DOUBLE,\n none: StaveConnector.type.NONE,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Beam } from './beam';\nimport { Font } from './font';\nimport { Fraction } from './fraction';\nimport { ModifierContext } from './modifiercontext';\nimport { Stave } from './stave';\nimport { StaveConnector } from './staveconnector';\nimport { Tables } from './tables';\nimport { TickContext } from './tickcontext';\nimport { isNote, isStaveNote } from './typeguard';\nimport { defined, log, midLine, RuntimeError } from './util';\nimport { Voice } from './voice';\n// Helper function\nconst sumArray = (arr) => arr.reduce((a, b) => a + b, 0);\n/**\n * Create `Alignment`s for each tick in `voices`. Also calculate the\n * total number of ticks in voices.\n */\nfunction createContexts(voices, makeContext, addToContext) {\n const resolutionMultiplier = Formatter.getResolutionMultiplier(voices);\n // Initialize tick maps.\n const tickToContextMap = {};\n const tickList = [];\n const contexts = [];\n // For each voice, extract notes and create a context for every\n // new tick that hasn't been seen before.\n voices.forEach((voice, voiceIndex) => {\n // Use resolution multiplier as denominator so that no additional expansion\n // of fractional tick values is needed.\n const ticksUsed = new Fraction(0, resolutionMultiplier);\n voice.getTickables().forEach((tickable) => {\n const integerTicks = ticksUsed.numerator;\n // If we have no tick context for this tick, create one.\n if (!tickToContextMap[integerTicks]) {\n const newContext = makeContext({ tickID: integerTicks });\n contexts.push(newContext);\n tickToContextMap[integerTicks] = newContext;\n // Maintain a list of unique integerTicks.\n tickList.push(integerTicks);\n }\n // Add this tickable to the TickContext.\n addToContext(tickable, tickToContextMap[integerTicks], voiceIndex);\n ticksUsed.add(tickable.getTicks());\n });\n });\n return {\n map: tickToContextMap,\n array: contexts,\n list: tickList.sort((a, b) => a - b),\n resolutionMultiplier,\n };\n}\n// eslint-disable-next-line\nfunction L(...args) {\n if (Formatter.DEBUG)\n log('Vex.Flow.Formatter', args);\n}\n/**\n * Get the rest line number of the next non-rest note(s).\n * @param notes array of Notes\n * @param currRestLine\n * @param currNoteIndex current note index\n * @param compare if true, return the midpoint between the current rest line and the next rest line\n * @returns a line number, which determines the vertical position of a rest.\n */\nfunction getRestLineForNextNoteGroup(notes, currRestLine, currNoteIndex, compare) {\n // If no valid next note group, nextRestLine is same as current.\n let nextRestLine = currRestLine;\n // Start with the next note and keep going until we find a valid non-rest note group.\n for (let noteIndex = currNoteIndex + 1; noteIndex < notes.length; noteIndex++) {\n const note = notes[noteIndex];\n if (isNote(note) && !note.isRest() && !note.shouldIgnoreTicks()) {\n nextRestLine = note.getLineForRest();\n break;\n }\n }\n // Locate the mid point between two lines.\n if (compare && currRestLine !== nextRestLine) {\n const top = Math.max(currRestLine, nextRestLine);\n const bot = Math.min(currRestLine, nextRestLine);\n nextRestLine = midLine(top, bot);\n }\n return nextRestLine;\n}\n/**\n * Format implements the formatting and layout algorithms that are used\n * to position notes in a voice. The algorithm can align multiple voices both\n * within a stave, and across multiple staves.\n *\n * To do this, the formatter breaks up voices into a grid of rational-valued\n * `ticks`, to which each note is assigned. Then, minimum widths are assigned\n * to each tick based on the widths of the notes and modifiers in that tick. This\n * establishes the smallest amount of space required for each tick.\n *\n * Finally, the formatter distributes the left over space proportionally to\n * all the ticks, setting the `x` values of the notes in each tick.\n *\n * See `tests/formatter_tests.ts` for usage examples. The helper functions included\n * here (`FormatAndDraw`, `FormatAndDrawTab`) also serve as useful usage examples.\n */\nexport class Formatter {\n constructor(options) {\n this.formatterOptions = Object.assign({ globalSoftmax: false, softmaxFactor: 100, maxIterations: 5 }, options);\n this.justifyWidth = 0;\n this.totalCost = 0;\n this.totalShift = 0;\n this.durationStats = {};\n // Minimum width required to render all the notes in the voices.\n this.minTotalWidth = 0;\n // This is set to `true` after `minTotalWidth` is calculated.\n this.hasMinTotalWidth = false;\n // Arrays of tick and modifier contexts.\n this.tickContexts = undefined;\n this.modifierContexts = undefined;\n // Gaps between contexts, for free movement of notes post\n // formatting.\n this.contextGaps = {\n total: 0,\n gaps: [],\n };\n this.voices = [];\n this.lossHistory = [];\n }\n /**\n * Helper function to layout \"notes\" one after the other without\n * regard for proportions. Useful for tests and debugging.\n */\n static SimpleFormat(notes, x = 0, { paddingBetween = 10 } = {}) {\n notes.reduce((accumulator, note) => {\n note.addToModifierContext(new ModifierContext());\n const tick = new TickContext().addTickable(note).preFormat();\n const metrics = tick.getMetrics();\n tick.setX(accumulator + metrics.totalLeftPx);\n return accumulator + tick.getWidth() + metrics.totalRightPx + paddingBetween;\n }, x);\n }\n /** Helper function to plot formatter debug info. */\n static plotDebugging(ctx, formatter, xPos, y1, y2, options) {\n options = Object.assign({ stavePadding: Tables.currentMusicFont().lookupMetric('stave.padding') }, options);\n const x = xPos + options.stavePadding;\n const contextGaps = formatter.contextGaps;\n function stroke(x1, x2, color) {\n ctx.beginPath();\n ctx.setStrokeStyle(color);\n ctx.setFillStyle(color);\n ctx.setLineWidth(1);\n ctx.fillRect(x1, y1, Math.max(x2 - x1, 0), y2 - y1);\n }\n ctx.save();\n ctx.setFont(Font.SANS_SERIF, 8);\n contextGaps.gaps.forEach((gap) => {\n stroke(x + gap.x1, x + gap.x2, 'rgba(100,200,100,0.4)');\n ctx.setFillStyle('green');\n ctx.fillText(Math.round(gap.x2 - gap.x1).toString(), x + gap.x1, y2 + 12);\n });\n ctx.setFillStyle('red');\n ctx.fillText(`Loss: ${(formatter.totalCost || 0).toFixed(2)} Shift: ${(formatter.totalShift || 0).toFixed(2)} Gap: ${contextGaps.total.toFixed(2)}`, x - 20, y2 + 27);\n ctx.restore();\n }\n /**\n * Helper function to format and draw a single voice. Returns a bounding\n * box for the notation.\n * @param ctx the rendering context\n * @param stave the stave to which to draw (`Stave` or `TabStave`)\n * @param notes array of `Note` instances (`Note`, `TextNote`, `TabNote`, etc.)\n * @param params one of below:\n * * Setting `autobeam` only `(context, stave, notes, true)` or\n * `(ctx, stave, notes, {autobeam: true})`\n * * Setting `align_rests` a struct is needed `(context, stave, notes, {align_rests: true})`\n * * Setting both a struct is needed `(context, stave, notes, {\n * autobeam: true, align_rests: true})`\n * * `autobeam` automatically generates beams for the notes.\n * * `align_rests` aligns rests with nearby notes.\n */\n static FormatAndDraw(ctx, stave, notes, params) {\n let options = {\n auto_beam: false,\n align_rests: false,\n };\n if (typeof params === 'object') {\n options = Object.assign(Object.assign({}, options), params);\n }\n else if (typeof params === 'boolean') {\n options.auto_beam = params;\n }\n // Start by creating a voice and adding all the notes to it.\n const voice = new Voice(Tables.TIME4_4).setMode(Voice.Mode.SOFT).addTickables(notes);\n // Then create beams, if requested.\n const beams = options.auto_beam ? Beam.applyAndGetBeams(voice) : [];\n // Instantiate a `Formatter` and format the notes.\n new Formatter()\n .joinVoices([voice]) // , { align_rests: options.align_rests })\n .formatToStave([voice], stave, { align_rests: options.align_rests, stave });\n // Render the voice and beams to the stave.\n voice.setStave(stave).draw(ctx, stave);\n beams.forEach((beam) => beam.setContext(ctx).draw());\n // Return the bounding box of the voice.\n return voice.getBoundingBox();\n }\n /**\n * Helper function to format and draw aligned tab and stave notes in two\n * separate staves.\n * @param ctx the rendering context\n * @param tabstave a `TabStave` instance on which to render `TabNote`s.\n * @param stave a `Stave` instance on which to render `Note`s.\n * @param notes array of `Note` instances for the stave (`Note`, `BarNote`, etc.)\n * @param tabnotes array of `Note` instances for the tab stave (`TabNote`, `BarNote`, etc.)\n * @param autobeam automatically generate beams.\n * @param params a configuration object:\n * * `autobeam` automatically generates beams for the notes.\n * * `align_rests` aligns rests with nearby notes.\n */\n static FormatAndDrawTab(ctx, tabstave, stave, tabnotes, notes, autobeam, params) {\n let opts = {\n auto_beam: autobeam,\n align_rests: false,\n };\n if (typeof params === 'object') {\n opts = Object.assign(Object.assign({}, opts), params);\n }\n else if (typeof params === 'boolean') {\n opts.auto_beam = params;\n }\n // Create a `4/4` voice for `notes`.\n const notevoice = new Voice(Tables.TIME4_4).setMode(Voice.Mode.SOFT).addTickables(notes);\n // Create a `4/4` voice for `tabnotes`.\n const tabvoice = new Voice(Tables.TIME4_4).setMode(Voice.Mode.SOFT).addTickables(tabnotes);\n // Then create beams, if requested.\n const beams = opts.auto_beam ? Beam.applyAndGetBeams(notevoice) : [];\n // Instantiate a `Formatter` and align tab and stave notes.\n new Formatter()\n .joinVoices([notevoice]) // , { align_rests: opts.align_rests })\n .joinVoices([tabvoice])\n .formatToStave([notevoice, tabvoice], stave, { align_rests: opts.align_rests });\n // Render voices and beams to staves.\n notevoice.draw(ctx, stave);\n tabvoice.draw(ctx, tabstave);\n beams.forEach((beam) => beam.setContext(ctx).draw());\n // Draw a connector between tab and note staves.\n new StaveConnector(stave, tabstave).setContext(ctx).draw();\n }\n /**\n * Automatically set the vertical position of rests based on previous/next note positions.\n * @param tickables an array of Tickables.\n * @param alignAllNotes If `false`, only align rests that are within a group of beamed notes.\n * @param alignTuplets If `false`, ignores tuplets.\n */\n static AlignRestsToNotes(tickables, alignAllNotes, alignTuplets) {\n tickables.forEach((currTickable, index) => {\n if (isStaveNote(currTickable) && currTickable.isRest()) {\n if (currTickable.getTuplet() && !alignTuplets) {\n return;\n }\n // If activated rests not on default can be rendered as specified.\n const position = currTickable.getGlyph().position.toUpperCase();\n if (position !== 'R/4' && position !== 'B/4') {\n return;\n }\n if (alignAllNotes || currTickable.getBeam()) {\n // Align rests with previous/next notes.\n const props = currTickable.getKeyProps()[0];\n if (index === 0) {\n props.line = getRestLineForNextNoteGroup(tickables, props.line, index, false);\n }\n else if (index > 0 && index < tickables.length) {\n // If previous tickable is a rest, use its line number.\n const prevTickable = tickables[index - 1];\n if (isStaveNote(prevTickable)) {\n if (prevTickable.isRest()) {\n props.line = prevTickable.getKeyProps()[0].line;\n }\n else {\n const restLine = prevTickable.getLineForRest();\n // Get the rest line for next valid non-rest note group.\n props.line = getRestLineForNextNoteGroup(tickables, restLine, index, true);\n }\n }\n }\n currTickable.setKeyLine(0, props.line);\n }\n }\n });\n }\n /**\n * Find all the rests in each of the `voices` and align them to neighboring notes.\n *\n * @param voices\n * @param alignAllNotes If `false`, only align rests within beamed groups of notes. If `true`, align all rests.\n */\n alignRests(voices, alignAllNotes) {\n if (!voices || !voices.length) {\n throw new RuntimeError('BadArgument', 'No voices to format rests');\n }\n voices.forEach((voice) => Formatter.AlignRestsToNotes(voice.getTickables(), alignAllNotes));\n }\n /**\n * Estimate the width required to render 'voices'. This is done by:\n * 1. Sum the widths of all the tick contexts\n * 2. Estimate the padding.\n * The latter is done by calculating the padding 3 different ways, and taking the\n * greatest value:\n * 1. the padding required for unaligned notes in different voices\n * 2. the padding based on the stddev of the tickable widths\n * 3. the padding based on the stddev of the tickable durations.\n *\n * The last 2 quantities estimate a 'width entropy', where notes might need more\n * room than the proportional formatting gives them. A measure of all same duration\n * and width will need no extra padding, and all these quantities will be\n * zero in that case.\n *\n * @param voices the voices that contain the notes\n * @returns the estimated width in pixels\n */\n preCalculateMinTotalWidth(voices) {\n const unalignedPadding = Tables.currentMusicFont().lookupMetric('stave.unalignedNotePadding');\n // Calculate additional padding based on 3 methods:\n // 1) unaligned beats in voices, 2) variance of width, 3) variance of durations\n let unalignedCtxCount = 0;\n let wsum = 0;\n let dsum = 0;\n const widths = [];\n const durations = [];\n // Cache results.\n if (this.hasMinTotalWidth)\n return this.minTotalWidth;\n // Create tick contexts if not already created.\n if (!this.tickContexts) {\n if (!voices) {\n throw new RuntimeError('BadArgument', \"'voices' required to run preCalculateMinTotalWidth\");\n }\n this.createTickContexts(voices);\n }\n // eslint-disable-next-line\n const { list: contextList, map: contextMap } = this.tickContexts;\n this.minTotalWidth = 0;\n // Go through each tick context and calculate total width,\n // and also accumulate values used in padding hints\n contextList.forEach((tick) => {\n const context = contextMap[tick];\n context.preFormat();\n // If this TC doesn't have all the voices on it, it's unaligned.\n // so increment the unaligned padding accumulator\n if (context.getTickables().length < voices.length) {\n unalignedCtxCount += 1;\n }\n // Calculate the 'width entropy' over all the Tickables.\n context.getTickables().forEach((t) => {\n wsum += t.getMetrics().width;\n dsum += t.getTicks().value();\n widths.push(t.getMetrics().width);\n durations.push(t.getTicks().value());\n });\n const width = context.getWidth();\n this.minTotalWidth += width;\n });\n this.hasMinTotalWidth = true;\n // normalized (0-1) STDDEV of widths/durations gives us padding hints.\n const wavg = wsum > 0 ? wsum / widths.length : 1 / widths.length;\n const wvar = sumArray(widths.map((ll) => Math.pow(ll - wavg, 2)));\n const wpads = Math.pow(wvar / widths.length, 0.5) / wavg;\n const davg = dsum / durations.length;\n const dvar = sumArray(durations.map((ll) => Math.pow(ll - davg, 2)));\n const dpads = Math.pow(dvar / durations.length, 0.5) / davg;\n // Find max of 3 methods pad the width with that\n const padmax = Math.max(dpads, wpads) * contextList.length * unalignedPadding;\n const unalignedPad = unalignedPadding * unalignedCtxCount;\n return this.minTotalWidth + Math.max(unalignedPad, padmax);\n }\n /**\n * Get minimum width required to render all voices. Either `format` or\n * `preCalculateMinTotalWidth` must be called before this method.\n */\n getMinTotalWidth() {\n if (!this.hasMinTotalWidth) {\n throw new RuntimeError('NoMinTotalWidth', \"Call 'preCalculateMinTotalWidth' or 'preFormat' before calling 'getMinTotalWidth'\");\n }\n return this.minTotalWidth;\n }\n /** Calculate the resolution multiplier for `voices`. */\n static getResolutionMultiplier(voices) {\n if (!voices || !voices.length) {\n throw new RuntimeError('BadArgument', 'No voices to format');\n }\n const totalTicks = voices[0].getTotalTicks();\n const resolutionMultiplier = voices.reduce((accumulator, voice) => {\n if (!voice.getTotalTicks().equals(totalTicks)) {\n throw new RuntimeError('TickMismatch', 'Voices should have same total note duration in ticks.');\n }\n if (voice.getMode() === Voice.Mode.STRICT && !voice.isComplete()) {\n throw new RuntimeError('IncompleteVoice', 'Voice does not have enough notes.');\n }\n return Math.max(accumulator, Fraction.LCM(accumulator, voice.getResolutionMultiplier()));\n }, 1);\n return resolutionMultiplier;\n }\n /** Create a `ModifierContext` for each tick in `voices`. */\n createModifierContexts(voices) {\n const fn = (tickable, context) => tickable.addToModifierContext(context);\n const contexts = createContexts(voices, () => new ModifierContext(), fn);\n this.modifierContexts = contexts;\n return contexts;\n }\n /**\n * Create a `TickContext` for each tick in `voices`. Also calculate the\n * total number of ticks in voices.\n */\n createTickContexts(voices) {\n const fn = (tickable, context, voiceIndex) => context.addTickable(tickable, voiceIndex);\n const contexts = createContexts(voices, (tick) => new TickContext(tick), fn);\n this.tickContexts = contexts;\n const contextArray = this.tickContexts.array;\n contextArray.forEach((context) => {\n context.tContexts = contextArray;\n });\n return contexts;\n }\n /**\n * This is the core formatter logic. Format voices and justify them\n * to `justifyWidth` pixels. `renderingContext` is required to justify elements\n * that can't retreive widths without a canvas. This method sets the `x` positions\n * of all the tickables/notes in the formatter.\n */\n preFormat(justifyWidth = 0, renderingContext, voicesParam, stave) {\n // Initialize context maps.\n const contexts = this.tickContexts;\n if (!contexts) {\n throw new RuntimeError('NoTickContexts', 'preFormat requires TickContexts');\n }\n const { list: contextList, map: contextMap } = contexts;\n // Reset loss history for evaluator.\n this.lossHistory = [];\n // If voices and a stave were provided, set the Stave for each voice\n // and preFormat to apply Y values to the notes;\n if (voicesParam && stave) {\n voicesParam.forEach((voice) => voice.setStave(stave).preFormat());\n }\n // Now distribute the ticks to each tick context, and assign them their\n // own X positions.\n let x = 0;\n let shift = 0;\n this.minTotalWidth = 0;\n let totalTicks = 0;\n // Pass 1: Give each note maximum width requested by context.\n contextList.forEach((tick) => {\n const context = contextMap[tick];\n // Make sure that all tickables in this context have calculated their\n // space requirements.\n context.preFormat();\n const width = context.getWidth();\n this.minTotalWidth += width;\n const maxTicks = context.getMaxTicks().value();\n totalTicks += maxTicks;\n const metrics = context.getMetrics();\n x = x + shift + metrics.totalLeftPx;\n context.setX(x);\n // Calculate shift for the next tick.\n shift = width - metrics.totalLeftPx;\n });\n // Use softmax based on all notes across all staves. (options.globalSoftmax)\n const { globalSoftmax, softmaxFactor, maxIterations } = this.formatterOptions;\n const exp = (tick) => Math.pow(softmaxFactor, (contextMap[tick].getMaxTicks().value() / totalTicks));\n const expTicksUsed = sumArray(contextList.map(exp));\n this.minTotalWidth = x + shift;\n this.hasMinTotalWidth = true;\n // No justification needed. End formatting.\n if (justifyWidth <= 0)\n return this.evaluate();\n // Start justification. Subtract the right extra pixels of the final context because the formatter\n // justifies based on the context's X position, which is the left-most part of the note head.\n const firstContext = contextMap[contextList[0]];\n const lastContext = contextMap[contextList[contextList.length - 1]];\n // Calculate the \"distance error\" between the tick contexts. The expected distance is the spacing proportional to\n // the softmax of the ticks.\n function calculateIdealDistances(adjustedJustifyWidth) {\n const distances = contextList.map((tick, i) => {\n const context = contextMap[tick];\n const voices = context.getTickablesByVoice();\n let backTickable;\n if (i > 0) {\n const prevContext = contextMap[contextList[i - 1]];\n // Go through each tickable and search backwards for another tickable\n // in the same voice. If found, use that duration (ticks) to calculate\n // the expected distance.\n for (let j = i - 1; j >= 0; j--) {\n const backTick = contextMap[contextList[j]];\n const backVoices = backTick.getTickablesByVoice();\n // Look for matching voices between tick contexts.\n const matchingVoices = [];\n Object.keys(voices).forEach((v) => {\n if (backVoices[v]) {\n matchingVoices.push(v);\n }\n });\n if (matchingVoices.length > 0) {\n // Found matching voices, get largest duration\n let maxTicks = 0;\n let maxNegativeShiftPx = Infinity;\n let expectedDistance = 0;\n matchingVoices.forEach((v) => {\n const ticks = backVoices[v].getTicks().value();\n if (ticks > maxTicks) {\n backTickable = backVoices[v];\n maxTicks = ticks;\n }\n // Calculate the limits of the shift based on modifiers, etc.\n const thisTickable = voices[v];\n const insideLeftEdge = thisTickable.getX() -\n (thisTickable.getMetrics().modLeftPx + thisTickable.getMetrics().leftDisplacedHeadPx);\n const backMetrics = backVoices[v].getMetrics();\n const insideRightEdge = backVoices[v].getX() + backMetrics.notePx + backMetrics.modRightPx + backMetrics.rightDisplacedHeadPx;\n // Don't allow shifting if notes in the same voice can collide\n maxNegativeShiftPx = Math.min(maxNegativeShiftPx, insideLeftEdge - insideRightEdge);\n });\n // Don't shift further left than the notehead of the last context. Actually, stay at most 5% to the right\n // so that two different tick contexts don't align across staves.\n maxNegativeShiftPx = Math.min(maxNegativeShiftPx, context.getX() - (prevContext.getX() + adjustedJustifyWidth * 0.05));\n // Calculate the expected distance of the current context from the last matching tickable. The\n // distance is scaled down by the softmax for the voice.\n if (globalSoftmax) {\n const t = totalTicks;\n expectedDistance = (Math.pow(softmaxFactor, (maxTicks / t)) / expTicksUsed) * adjustedJustifyWidth;\n }\n else if (typeof backTickable !== 'undefined') {\n expectedDistance = backTickable.getVoice().softmax(maxTicks) * adjustedJustifyWidth;\n }\n return {\n expectedDistance,\n maxNegativeShiftPx,\n fromTickable: backTickable,\n };\n }\n }\n }\n return { expectedDistance: 0, fromTickablePx: 0, maxNegativeShiftPx: 0 };\n });\n return distances;\n }\n function shiftToIdealDistances(idealDistances) {\n // Distribute ticks to the contexts based on the calculated distance error.\n const centerX = adjustedJustifyWidth / 2;\n let spaceAccum = 0;\n contextList.forEach((tick, index) => {\n const context = contextMap[tick];\n if (index > 0) {\n const contextX = context.getX();\n const ideal = idealDistances[index];\n const errorPx = defined(ideal.fromTickable).getX() + ideal.expectedDistance - (contextX + spaceAccum);\n let negativeShiftPx = 0;\n if (errorPx > 0) {\n spaceAccum += errorPx;\n }\n else if (errorPx < 0) {\n negativeShiftPx = Math.min(ideal.maxNegativeShiftPx, Math.abs(errorPx));\n spaceAccum += -negativeShiftPx;\n }\n context.setX(contextX + spaceAccum);\n }\n // Move center aligned tickables to middle\n context.getCenterAlignedTickables().forEach((tickable) => {\n tickable.setCenterXShift(centerX - context.getX());\n });\n });\n return lastContext.getX() - firstContext.getX();\n }\n const adjustedJustifyWidth = justifyWidth -\n lastContext.getMetrics().notePx -\n lastContext.getMetrics().totalRightPx -\n firstContext.getMetrics().totalLeftPx;\n const musicFont = Tables.currentMusicFont();\n const configMinPadding = musicFont.lookupMetric('stave.endPaddingMin');\n const configMaxPadding = musicFont.lookupMetric('stave.endPaddingMax');\n let targetWidth = adjustedJustifyWidth;\n const distances = calculateIdealDistances(targetWidth);\n let actualWidth = shiftToIdealDistances(distances);\n // Calculate right justification by finding max of (configured value, min distance between tickables)\n // so measures with lots of white space use it evenly, and crowded measures use at least the configured\n // space.\n const calcMinDistance = (targetWidth, distances) => {\n let mdCalc = targetWidth / 2;\n if (distances.length > 1) {\n for (let di = 1; di < distances.length; ++di) {\n mdCalc = Math.min(distances[di].expectedDistance / 2, mdCalc);\n }\n }\n return mdCalc;\n };\n const minDistance = calcMinDistance(targetWidth, distances);\n // Just one context. Done formatting.\n if (contextList.length === 1)\n return 0;\n // right justify to either the configured padding, or the min distance between notes, whichever is greatest.\n // This * 2 keeps the existing formatting unless there is 'a lot' of extra whitespace, which won't break\n // existing visual regression tests.\n const paddingMax = configMaxPadding * 2 < minDistance ? minDistance : configMaxPadding;\n const paddingMin = paddingMax - (configMaxPadding - configMinPadding);\n const maxX = adjustedJustifyWidth - paddingMin;\n let iterations = maxIterations;\n // Adjust justification width until the right margin is as close as possible to the calculated padding,\n // without going over\n while ((actualWidth > maxX && iterations > 0) || (actualWidth + paddingMax < maxX && iterations > 1)) {\n targetWidth -= actualWidth - maxX;\n actualWidth = shiftToIdealDistances(calculateIdealDistances(targetWidth));\n iterations--;\n }\n this.justifyWidth = justifyWidth;\n return this.evaluate();\n }\n /** Calculate the total cost of this formatting decision. */\n evaluate() {\n if (!this.tickContexts)\n return 0;\n const contexts = this.tickContexts;\n const justifyWidth = this.justifyWidth;\n // Calculate available slack per tick context. This works out how much freedom\n // to move a context has in either direction, without affecting other notes.\n this.contextGaps = { total: 0, gaps: [] };\n contexts.list.forEach((tick, index) => {\n if (index === 0)\n return;\n const prevTick = contexts.list[index - 1];\n const prevContext = contexts.map[prevTick];\n const context = contexts.map[tick];\n const prevMetrics = prevContext.getMetrics();\n const currMetrics = context.getMetrics();\n // Calculate X position of right edge of previous note\n const insideRightEdge = prevContext.getX() + prevMetrics.notePx + prevMetrics.totalRightPx;\n // Calculate X position of left edge of current note\n const insideLeftEdge = context.getX() - currMetrics.totalLeftPx;\n const gap = insideLeftEdge - insideRightEdge;\n this.contextGaps.total += gap;\n this.contextGaps.gaps.push({ x1: insideRightEdge, x2: insideLeftEdge });\n // Tell the tick contexts how much they can reposition themselves.\n context.getFormatterMetrics().freedom.left = gap;\n prevContext.getFormatterMetrics().freedom.right = gap;\n });\n // Calculate mean distance in each voice for each duration type, then calculate\n // how far each note is from the mean.\n this.durationStats = {};\n const durationStats = this.durationStats;\n function updateStats(duration, space) {\n const stats = durationStats[duration];\n if (stats === undefined) {\n durationStats[duration] = { mean: space, count: 1 };\n }\n else {\n stats.count += 1;\n stats.mean = (stats.mean + space) / 2;\n }\n }\n this.voices.forEach((voice) => {\n voice.getTickables().forEach((note, i, notes) => {\n const duration = note.getTicks().clone().simplify().toString();\n const metrics = note.getMetrics();\n const formatterMetrics = note.getFormatterMetrics();\n const leftNoteEdge = note.getX() + metrics.notePx + metrics.modRightPx + metrics.rightDisplacedHeadPx;\n let space = 0;\n if (i < notes.length - 1) {\n const rightNote = notes[i + 1];\n const rightMetrics = rightNote.getMetrics();\n const rightNoteEdge = rightNote.getX() - rightMetrics.modLeftPx - rightMetrics.leftDisplacedHeadPx;\n space = rightNoteEdge - leftNoteEdge;\n formatterMetrics.space.used = rightNote.getX() - note.getX();\n rightNote.getFormatterMetrics().freedom.left = space;\n }\n else {\n space = justifyWidth - leftNoteEdge;\n formatterMetrics.space.used = justifyWidth - note.getX();\n }\n formatterMetrics.freedom.right = space;\n updateStats(duration, formatterMetrics.space.used);\n });\n });\n // Calculate how much each note deviates from the mean. Loss function is square\n // root of the sum of squared deviations.\n let totalDeviation = 0;\n this.voices.forEach((voice) => {\n voice.getTickables().forEach((note) => {\n const duration = note.getTicks().clone().simplify().toString();\n const metrics = note.getFormatterMetrics();\n metrics.space.mean = durationStats[duration].mean;\n metrics.duration = duration;\n metrics.iterations += 1;\n metrics.space.deviation = metrics.space.used - metrics.space.mean;\n totalDeviation += Math.pow(metrics.space.deviation, 2);\n });\n });\n this.totalCost = Math.sqrt(totalDeviation);\n this.lossHistory.push(this.totalCost);\n return this.totalCost;\n }\n /**\n * Run a single iteration of rejustification. At a high level, this method calculates\n * the overall \"loss\" (or cost) of this layout, and repositions tickcontexts in an\n * attempt to reduce the cost. You can call this method multiple times until it finds\n * and oscillates around a global minimum.\n * @param alpha the \"learning rate\" for the formatter. It determines how much of a shift\n * the formatter should make based on its cost function.\n */\n tune(options) {\n var _a;\n const contexts = this.tickContexts;\n if (!contexts) {\n return 0;\n }\n const alpha = (_a = options === null || options === void 0 ? void 0 : options.alpha) !== null && _a !== void 0 ? _a : 0.5;\n // Move `current` tickcontext by `shift` pixels, and adjust the freedom\n // on adjacent tickcontexts.\n function move(current, shift, prev, next) {\n current.setX(current.getX() + shift);\n current.getFormatterMetrics().freedom.left += shift;\n current.getFormatterMetrics().freedom.right -= shift;\n if (prev)\n prev.getFormatterMetrics().freedom.right += shift;\n if (next)\n next.getFormatterMetrics().freedom.left -= shift;\n }\n let shift = 0;\n this.totalShift = 0;\n contexts.list.forEach((tick, index, list) => {\n const context = contexts.map[tick];\n const prevContext = index > 0 ? contexts.map[list[index - 1]] : undefined;\n const nextContext = index < list.length - 1 ? contexts.map[list[index + 1]] : undefined;\n move(context, shift, prevContext, nextContext);\n const cost = -sumArray(context.getTickables().map((t) => t.getFormatterMetrics().space.deviation));\n if (cost > 0) {\n shift = -Math.min(context.getFormatterMetrics().freedom.right, Math.abs(cost));\n }\n else if (cost < 0) {\n if (nextContext) {\n shift = Math.min(nextContext.getFormatterMetrics().freedom.right, Math.abs(cost));\n }\n else {\n shift = 0;\n }\n }\n shift *= alpha;\n this.totalShift += shift;\n });\n return this.evaluate();\n }\n /**\n * This is the top-level call for all formatting logic completed\n * after `x` *and* `y` values have been computed for the notes\n * in the voices.\n */\n postFormat() {\n const postFormatContexts = (contexts) => contexts.list.forEach((tick) => contexts.map[tick].postFormat());\n if (this.modifierContexts)\n postFormatContexts(this.modifierContexts);\n if (this.tickContexts)\n postFormatContexts(this.tickContexts);\n return this;\n }\n /**\n * Take all `voices` and create `ModifierContext`s out of them. This tells\n * the formatters that the voices belong on a single stave.\n */\n joinVoices(voices) {\n this.createModifierContexts(voices);\n this.hasMinTotalWidth = false;\n return this;\n }\n /**\n * Align rests in voices, justify the contexts, and position the notes\n * so voices are aligned and ready to render onto the stave. This method\n * mutates the `x` positions of all tickables in `voices`.\n *\n * Voices are full justified to fit in `justifyWidth` pixels.\n *\n * Set `options.context` to the rendering context. Set `options.align_rests`\n * to true to enable rest alignment.\n */\n format(voices, justifyWidth, options) {\n const opts = Object.assign({ align_rests: false }, options);\n this.voices = voices;\n const softmaxFactor = this.formatterOptions.softmaxFactor;\n if (softmaxFactor) {\n this.voices.forEach((v) => v.setSoftmaxFactor(softmaxFactor));\n }\n this.alignRests(voices, opts.align_rests);\n this.createTickContexts(voices);\n this.preFormat(justifyWidth, opts.context, voices, opts.stave);\n // Only postFormat if a stave was supplied for y value formatting\n if (opts.stave)\n this.postFormat();\n return this;\n }\n // This method is just like `format` except that the `justifyWidth` is inferred from the `stave`.\n formatToStave(voices, stave, optionsParam) {\n const options = Object.assign({ context: stave.getContext() }, optionsParam);\n // eslint-disable-next-line\n const justifyWidth = stave.getNoteEndX() - stave.getNoteStartX() - Stave.defaultPadding;\n L('Formatting voices to width: ', justifyWidth);\n return this.format(voices, justifyWidth, options);\n }\n getTickContext(tick) {\n var _a;\n return (_a = this.tickContexts) === null || _a === void 0 ? void 0 : _a.map[tick];\n }\n}\n// To enable logging for this class. Set `Vex.Flow.Formatter.DEBUG` to `true`.\nFormatter.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n/**\n * ## Description\n *\n * Create a new tuplet from the specified notes. The notes must\n * be part of the same voice. If they are of different rhythmic\n * values, then options.num_notes must be set.\n *\n * @constructor\n * @param {Array.} A set of notes: staveNotes,\n * notes, etc... any class that inherits stemmableNote at some\n * point in its prototype chain.\n * @param options: object {\n *\n * num_notes: fit this many notes into...\n * notes_occupied: ...the space of this many notes\n *\n * Together, these two properties make up the tuplet ratio\n * in the form of num_notes : notes_occupied.\n * num_notes defaults to the number of notes passed in, so\n * it is important that if you omit this property, all of\n * the notes passed should be of the same note value.\n * notes_occupied defaults to 2 -- so you should almost\n * certainly pass this parameter for anything other than\n * a basic triplet.\n *\n * location:\n * default 1, which is above the notes: ┌─── 3 ───┐\n * -1 is below the notes └─── 3 ───┘\n *\n * bracketed: boolean, draw a bracket around the tuplet number\n * when true: ┌─── 3 ───┐ when false: 3\n * defaults to true if notes are not beamed, false otherwise\n *\n * ratioed: boolean\n * when true: ┌─── 7:8 ───┐, when false: ┌─── 7 ───┐\n * defaults to true if the difference between num_notes and\n * notes_occupied is greater than 1.\n *\n * y_offset: int, default 0\n * manually offset a tuplet, for instance to avoid collisions\n * with articulations, etc...\n * }\n */\nimport { Element } from './element';\nimport { Formatter } from './formatter';\nimport { Glyph } from './glyph';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nexport var TupletLocation;\n(function (TupletLocation) {\n TupletLocation[TupletLocation[\"BOTTOM\"] = -1] = \"BOTTOM\";\n TupletLocation[TupletLocation[\"TOP\"] = 1] = \"TOP\";\n})(TupletLocation || (TupletLocation = {}));\nexport class Tuplet extends Element {\n constructor(notes, options = {}) {\n super();\n this.numerator_glyphs = [];\n this.denom_glyphs = [];\n if (!notes || !notes.length) {\n throw new RuntimeError('BadArguments', 'No notes provided for tuplet.');\n }\n this.options = options;\n this.notes = notes;\n this.num_notes = this.options.num_notes != undefined ? this.options.num_notes : notes.length;\n // We accept beats_occupied, but warn that it's deprecated:\n // the preferred property name is now notes_occupied.\n if (this.options.beats_occupied) {\n this.beatsOccupiedDeprecationWarning();\n }\n this.notes_occupied = this.options.notes_occupied || this.options.beats_occupied || 2;\n if (this.options.bracketed != undefined) {\n this.bracketed = this.options.bracketed;\n }\n else {\n this.bracketed = notes.some((note) => !note.hasBeam());\n }\n this.ratioed =\n this.options.ratioed != undefined ? this.options.ratioed : Math.abs(this.notes_occupied - this.num_notes) > 1;\n this.point = Tables.currentMusicFont().lookupMetric('digits.tupletPoint');\n this.y_pos = 16;\n this.x_pos = 100;\n this.width = 200;\n this.setTupletLocation(this.options.location || Tuplet.LOCATION_TOP);\n Formatter.AlignRestsToNotes(notes, true, true);\n this.resolveGlyphs();\n this.attach();\n }\n static get CATEGORY() {\n return Category.Tuplet;\n }\n static get LOCATION_TOP() {\n return TupletLocation.TOP;\n }\n static get LOCATION_BOTTOM() {\n return TupletLocation.BOTTOM;\n }\n static get NESTING_OFFSET() {\n return 15;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static get metrics() {\n return Tables.currentMusicFont().getMetrics().glyphs.tuplet;\n }\n attach() {\n for (let i = 0; i < this.notes.length; i++) {\n const note = this.notes[i];\n note.setTuplet(this);\n }\n }\n detach() {\n for (let i = 0; i < this.notes.length; i++) {\n const note = this.notes[i];\n note.resetTuplet(this);\n }\n }\n /**\n * Set whether or not the bracket is drawn.\n */\n setBracketed(bracketed) {\n this.bracketed = !!bracketed;\n return this;\n }\n /**\n * Set whether or not the ratio is shown.\n */\n setRatioed(ratioed) {\n this.ratioed = !!ratioed;\n return this;\n }\n /**\n * Set the tuplet indicator to be displayed either on the top or bottom of the stave.\n */\n setTupletLocation(location) {\n if (location !== Tuplet.LOCATION_TOP && location !== Tuplet.LOCATION_BOTTOM) {\n // eslint-disable-next-line\n console.warn(`Invalid tuplet location [${location}]. Using Tuplet.LOCATION_TOP.`);\n location = Tuplet.LOCATION_TOP;\n }\n this.location = location;\n return this;\n }\n getNotes() {\n return this.notes;\n }\n getNoteCount() {\n return this.num_notes;\n }\n beatsOccupiedDeprecationWarning() {\n // eslint-disable-next-line\n console.warn('beats_occupied has been deprecated as an option for tuplets. Please use notes_occupied instead.', 'Calls to getBeatsOccupied / setBeatsOccupied should now be routed to getNotesOccupied / setNotesOccupied.', 'The old methods will be removed in VexFlow 5.0.');\n }\n getBeatsOccupied() {\n this.beatsOccupiedDeprecationWarning();\n return this.getNotesOccupied();\n }\n setBeatsOccupied(beats) {\n this.beatsOccupiedDeprecationWarning();\n return this.setNotesOccupied(beats);\n }\n getNotesOccupied() {\n return this.notes_occupied;\n }\n setNotesOccupied(notes) {\n this.detach();\n this.notes_occupied = notes;\n this.resolveGlyphs();\n this.attach();\n }\n resolveGlyphs() {\n this.numerator_glyphs = [];\n let n = this.num_notes;\n while (n >= 1) {\n this.numerator_glyphs.unshift(new Glyph('timeSig' + (n % 10), this.point));\n n = parseInt((n / 10).toString(), 10);\n }\n this.denom_glyphs = [];\n n = this.notes_occupied;\n while (n >= 1) {\n this.denom_glyphs.unshift(new Glyph('timeSig' + (n % 10), this.point));\n n = parseInt((n / 10).toString(), 10);\n }\n }\n // determine how many tuplets are nested within this tuplet\n // on the same side (above/below), to calculate a y\n // offset for this tuplet:\n getNestedTupletCount() {\n const location = this.location;\n const first_note = this.notes[0];\n let maxTupletCount = countTuplets(first_note, location);\n let minTupletCount = countTuplets(first_note, location);\n // Count the tuplets that are on the same side (above/below)\n // as this tuplet:\n function countTuplets(note, location) {\n return note.getTupletStack().filter((tuplet) => tuplet.location === location).length;\n }\n this.notes.forEach((note) => {\n const tupletCount = countTuplets(note, location);\n maxTupletCount = tupletCount > maxTupletCount ? tupletCount : maxTupletCount;\n minTupletCount = tupletCount < minTupletCount ? tupletCount : minTupletCount;\n });\n return maxTupletCount - minTupletCount;\n }\n // determine the y position of the tuplet:\n getYPosition() {\n // offset the tuplet for any nested tuplets between\n // it and the notes:\n const nested_tuplet_y_offset = this.getNestedTupletCount() * Tuplet.NESTING_OFFSET * -this.location;\n // offset the tuplet for any manual y_offset:\n const y_offset = this.options.y_offset || 0;\n // now iterate through the notes and find our highest\n // or lowest locations, to form a base y_pos\n const first_note = this.notes[0];\n let y_pos;\n if (this.location === Tuplet.LOCATION_TOP) {\n y_pos = first_note.checkStave().getYForLine(0) - Tuplet.metrics.topModifierOffset;\n // check modifiers above note to see if they will collide with tuplet beam\n for (let i = 0; i < this.notes.length; ++i) {\n const note = this.notes[i];\n let modLines = 0;\n const mc = note.getModifierContext();\n if (mc) {\n modLines = Math.max(modLines, mc.getState().top_text_line);\n }\n const modY = note.getYForTopText(modLines) - Tuplet.metrics.noteHeadOffset;\n if (note.hasStem() || note.isRest()) {\n const top_y = note.getStemDirection() === Stem.UP\n ? note.getStemExtents().topY - Tuplet.metrics.stemOffset\n : note.getStemExtents().baseY - Tuplet.metrics.noteHeadOffset;\n y_pos = Math.min(top_y, y_pos);\n if (modLines > 0) {\n y_pos = Math.min(modY, y_pos);\n }\n }\n }\n }\n else {\n let lineCheck = Tuplet.metrics.bottomLine; // tuplet default on line 4\n // check modifiers below note to see if they will collide with tuplet beam\n this.notes.forEach((nn) => {\n const mc = nn.getModifierContext();\n if (mc) {\n lineCheck = Math.max(lineCheck, mc.getState().text_line + 1);\n }\n });\n y_pos = first_note.checkStave().getYForLine(lineCheck) + Tuplet.metrics.noteHeadOffset;\n for (let i = 0; i < this.notes.length; ++i) {\n if (this.notes[i].hasStem() || this.notes[i].isRest()) {\n const bottom_y = this.notes[i].getStemDirection() === Stem.UP\n ? this.notes[i].getStemExtents().baseY + Tuplet.metrics.noteHeadOffset\n : this.notes[i].getStemExtents().topY + Tuplet.metrics.stemOffset;\n if (bottom_y > y_pos) {\n y_pos = bottom_y;\n }\n }\n }\n }\n return y_pos + nested_tuplet_y_offset + y_offset;\n }\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n // determine x value of left bound of tuplet\n const first_note = this.notes[0];\n const last_note = this.notes[this.notes.length - 1];\n if (!this.bracketed) {\n this.x_pos = first_note.getStemX();\n this.width = last_note.getStemX() - this.x_pos;\n }\n else {\n this.x_pos = first_note.getTieLeftX() - 5;\n this.width = last_note.getTieRightX() - this.x_pos + 5;\n }\n // determine y value for tuplet\n this.y_pos = this.getYPosition();\n const addGlyphWidth = (width, glyph) => width + defined(glyph.getMetrics().width);\n // calculate total width of tuplet notation\n let width = this.numerator_glyphs.reduce(addGlyphWidth, 0);\n if (this.ratioed) {\n width = this.denom_glyphs.reduce(addGlyphWidth, width);\n width += this.point * 0.32;\n }\n const notation_center_x = this.x_pos + this.width / 2;\n const notation_start_x = notation_center_x - width / 2;\n // draw bracket if the tuplet is not beamed\n if (this.bracketed) {\n const line_width = this.width / 2 - width / 2 - 5;\n // only draw the bracket if it has positive length\n if (line_width > 0) {\n ctx.fillRect(this.x_pos, this.y_pos, line_width, 1);\n ctx.fillRect(this.x_pos + this.width / 2 + width / 2 + 5, this.y_pos, line_width, 1);\n ctx.fillRect(this.x_pos, this.y_pos + (this.location === Tuplet.LOCATION_BOTTOM ? 1 : 0), 1, this.location * 10);\n ctx.fillRect(this.x_pos + this.width, this.y_pos + (this.location === Tuplet.LOCATION_BOTTOM ? 1 : 0), 1, this.location * 10);\n }\n }\n // draw numerator glyphs\n const shiftY = Tables.currentMusicFont().lookupMetric('digits.shiftY', 0);\n let x_offset = 0;\n this.numerator_glyphs.forEach((glyph) => {\n glyph.render(ctx, notation_start_x + x_offset, this.y_pos + this.point / 3 - 2 + shiftY);\n x_offset += defined(glyph.getMetrics().width);\n });\n // display colon and denominator if the ratio is to be shown\n if (this.ratioed) {\n const colon_x = notation_start_x + x_offset + this.point * 0.16;\n const colon_radius = this.point * 0.06;\n ctx.beginPath();\n ctx.arc(colon_x, this.y_pos - this.point * 0.08, colon_radius, 0, Math.PI * 2, true);\n ctx.closePath();\n ctx.fill();\n ctx.beginPath();\n ctx.arc(colon_x, this.y_pos + this.point * 0.12, colon_radius, 0, Math.PI * 2, true);\n ctx.closePath();\n ctx.fill();\n x_offset += this.point * 0.32;\n this.denom_glyphs.forEach((glyph) => {\n glyph.render(ctx, notation_start_x + x_offset, this.y_pos + this.point / 3 - 2 + shiftY);\n x_offset += defined(glyph.getMetrics().width);\n });\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Fraction } from './fraction';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { TupletLocation } from './tuplet';\nimport { Category, isStaveNote, isTabNote } from './typeguard';\nimport { RuntimeError } from './util';\nfunction calculateStemDirection(notes) {\n let lineSum = 0;\n notes.forEach((note) => {\n if (note.keyProps) {\n note.keyProps.forEach((keyProp) => {\n lineSum += keyProp.line - 3;\n });\n }\n });\n if (lineSum >= 0) {\n return Stem.DOWN;\n }\n return Stem.UP;\n}\nfunction getStemSlope(firstNote, lastNote) {\n const firstStemTipY = firstNote.getStemExtents().topY;\n const firstStemX = firstNote.getStemX();\n const lastStemTipY = lastNote.getStemExtents().topY;\n const lastStemX = lastNote.getStemX();\n return (lastStemTipY - firstStemTipY) / (lastStemX - firstStemX);\n}\nconst BEAM_LEFT = 'L';\nconst BEAM_RIGHT = 'R';\nconst BEAM_BOTH = 'B';\n/** `Beams` span over a set of `StemmableNotes`. */\nexport class Beam extends Element {\n constructor(notes, auto_stem = false) {\n super();\n this.slope = 0;\n this.y_shift = 0;\n if (!notes || notes.length === 0) {\n throw new RuntimeError('BadArguments', 'No notes provided for beam.');\n }\n if (notes.length === 1) {\n throw new RuntimeError('BadArguments', 'Too few notes for beam.');\n }\n // Validate beam line, direction and ticks.\n this.ticks = notes[0].getIntrinsicTicks();\n if (this.ticks >= Tables.durationToTicks('4')) {\n throw new RuntimeError('BadArguments', 'Beams can only be applied to notes shorter than a quarter note.');\n }\n let i; // shared iterator\n let note;\n this.stem_direction = Stem.UP;\n for (i = 0; i < notes.length; ++i) {\n note = notes[i];\n if (note.hasStem()) {\n this.stem_direction = note.getStemDirection();\n break;\n }\n }\n let stem_direction = this.stem_direction;\n // Figure out optimal stem direction based on given notes\n if (auto_stem && isStaveNote(notes[0])) {\n stem_direction = calculateStemDirection(notes);\n }\n else if (auto_stem && isTabNote(notes[0])) {\n // Auto Stem TabNotes\n const stem_weight = notes.reduce((memo, note) => memo + note.getStemDirection(), 0);\n stem_direction = stem_weight > -1 ? Stem.UP : Stem.DOWN;\n }\n // Apply stem directions and attach beam to notes\n for (i = 0; i < notes.length; ++i) {\n note = notes[i];\n if (auto_stem) {\n note.setStemDirection(stem_direction);\n this.stem_direction = stem_direction;\n }\n note.setBeam(this);\n }\n this.postFormatted = false;\n this.notes = notes;\n this.beam_count = this.getBeamCount();\n this.break_on_indices = [];\n this.render_options = {\n beam_width: 5,\n max_slope: 0.25,\n min_slope: -0.25,\n slope_iterations: 20,\n slope_cost: 100,\n show_stemlets: false,\n stemlet_extension: 7,\n partial_beam_length: 10,\n flat_beams: false,\n min_flat_beam_offset: 15,\n };\n }\n static get CATEGORY() {\n return Category.Beam;\n }\n /** Get the direction of the beam */\n getStemDirection() {\n return this.stem_direction;\n }\n /**\n * Get the default beam groups for a provided time signature.\n * Attempt to guess if the time signature is not found in table.\n * Currently this is fairly naive.\n */\n static getDefaultBeamGroups(time_sig) {\n if (!time_sig || time_sig === 'c') {\n time_sig = '4/4';\n }\n const defaults = {\n '1/2': ['1/2'],\n '2/2': ['1/2'],\n '3/2': ['1/2'],\n '4/2': ['1/2'],\n '1/4': ['1/4'],\n '2/4': ['1/4'],\n '3/4': ['1/4'],\n '4/4': ['1/4'],\n '1/8': ['1/8'],\n '2/8': ['2/8'],\n '3/8': ['3/8'],\n '4/8': ['2/8'],\n '1/16': ['1/16'],\n '2/16': ['2/16'],\n '3/16': ['3/16'],\n '4/16': ['2/16'],\n };\n const groups = defaults[time_sig];\n if (groups === undefined) {\n // If no beam groups found, naively determine\n // the beam groupings from the time signature\n const beatTotal = parseInt(time_sig.split('/')[0], 10);\n const beatValue = parseInt(time_sig.split('/')[1], 10);\n const tripleMeter = beatTotal % 3 === 0;\n if (tripleMeter) {\n return [new Fraction(3, beatValue)];\n }\n else if (beatValue > 4) {\n return [new Fraction(2, beatValue)];\n }\n else if (beatValue <= 4) {\n return [new Fraction(1, beatValue)];\n }\n }\n else {\n return groups.map((group) => new Fraction().parse(group));\n }\n return [new Fraction(1, 4)];\n }\n /**\n * A helper function to automatically build basic beams for a voice. For more\n * complex auto-beaming use `Beam.generateBeams()`.\n * @param voice the voice to generate the beams for\n * @param stem_direction a stem direction to apply to the entire voice\n * @param groups an array of `Fraction` representing beat groupings for the beam\n */\n static applyAndGetBeams(voice, stem_direction, groups) {\n return Beam.generateBeams(voice.getTickables(), { groups, stem_direction });\n }\n /**\n * A helper function to autimatically build beams for a voice with\n * configuration options.\n *\n * Example configuration object:\n *\n * ```\n * config = {\n * groups: [new Vex.Flow.Fraction(2, 8)],\n * stem_direction: -1,\n * beam_rests: true,\n * beam_middle_only: true,\n * show_stemlets: false\n * };\n * ```\n * @param notes an array of notes to create the beams for\n * @param config the configuration object\n * @param config.stem_direction set to apply the same direction to all notes\n * @param config.beam_rests set to `true` to include rests in the beams\n * @param config.beam_middle_only set to `true` to only beam rests in the middle of the beat\n * @param config.show_stemlets set to `true` to draw stemlets for rests\n * @param config.maintain_stem_directions set to `true` to not apply new stem directions\n * @param config.groups array of `Fractions` that represent the beat structure to beam the notes\n *\n */\n static generateBeams(notes, config = {}) {\n if (!config.groups || !config.groups.length) {\n config.groups = [new Fraction(2, 8)];\n }\n // Convert beam groups to tick amounts\n const tickGroups = config.groups.map((group) => {\n if (!group.multiply) {\n throw new RuntimeError('InvalidBeamGroups', 'The beam groups must be an array of Vex.Flow.Fractions');\n }\n return group.clone().multiply(Tables.RESOLUTION, 1);\n });\n const unprocessedNotes = notes;\n let currentTickGroup = 0;\n let noteGroups = [];\n let currentGroup = [];\n function getTotalTicks(vf_notes) {\n return vf_notes.reduce((memo, note) => note.getTicks().clone().add(memo), new Fraction(0, 1));\n }\n function nextTickGroup() {\n if (tickGroups.length - 1 > currentTickGroup) {\n currentTickGroup += 1;\n }\n else {\n currentTickGroup = 0;\n }\n }\n function createGroups() {\n let nextGroup = [];\n // number of ticks in current group\n let currentGroupTotalTicks = new Fraction(0, 1);\n unprocessedNotes.forEach((unprocessedNote) => {\n nextGroup = [];\n if (unprocessedNote.shouldIgnoreTicks()) {\n noteGroups.push(currentGroup);\n currentGroup = nextGroup;\n return; // Ignore untickables (like bar notes)\n }\n currentGroup.push(unprocessedNote);\n const ticksPerGroup = tickGroups[currentTickGroup].clone();\n const totalTicks = getTotalTicks(currentGroup).add(currentGroupTotalTicks);\n // Double the amount of ticks in a group, if it's an unbeamable tuplet\n const unbeamable = Tables.durationToNumber(unprocessedNote.getDuration()) < 8;\n if (unbeamable && unprocessedNote.getTuplet()) {\n ticksPerGroup.numerator *= 2;\n }\n // If the note that was just added overflows the group tick total\n if (totalTicks.greaterThan(ticksPerGroup)) {\n // If the overflow note can be beamed, start the next group\n // with it. Unbeamable notes leave the group overflowed.\n if (!unbeamable) {\n const note = currentGroup.pop();\n if (note)\n nextGroup.push(note);\n }\n noteGroups.push(currentGroup);\n // We have overflown, so we're going to next tick group. As we might have\n // overflown by more than 1 group, we need to go forward as many times as\n // needed, decreasing currentGroupTotalTicks by as many ticks as there are\n // in current groups as we go forward.\n do {\n currentGroupTotalTicks = totalTicks.subtract(tickGroups[currentTickGroup]);\n nextTickGroup();\n } while (currentGroupTotalTicks.greaterThanEquals(tickGroups[currentTickGroup]));\n currentGroup = nextGroup;\n }\n else if (totalTicks.equals(ticksPerGroup)) {\n noteGroups.push(currentGroup);\n currentGroupTotalTicks = new Fraction(0, 1);\n currentGroup = nextGroup;\n nextTickGroup();\n }\n });\n // Adds any remainder notes beam\n if (currentGroup.length > 0) {\n noteGroups.push(currentGroup);\n }\n }\n function getBeamGroups() {\n return noteGroups.filter((group) => {\n if (group.length > 1) {\n let beamable = true;\n group.forEach((note) => {\n if (note.getIntrinsicTicks() >= Tables.durationToTicks('4')) {\n beamable = false;\n }\n });\n return beamable;\n }\n return false;\n });\n }\n // Splits up groups by Rest\n function sanitizeGroups() {\n const sanitizedGroups = [];\n noteGroups.forEach((group) => {\n let tempGroup = [];\n group.forEach((note, index, group) => {\n const isFirstOrLast = index === 0 || index === group.length - 1;\n const prevNote = group[index - 1];\n const breaksOnEachRest = !config.beam_rests && note.isRest();\n const breaksOnFirstOrLastRest = config.beam_rests && config.beam_middle_only && note.isRest() && isFirstOrLast;\n let breakOnStemChange = false;\n if (config.maintain_stem_directions && prevNote && !note.isRest() && !prevNote.isRest()) {\n const prevDirection = prevNote.getStemDirection();\n const currentDirection = note.getStemDirection();\n breakOnStemChange = currentDirection !== prevDirection;\n }\n const isUnbeamableDuration = parseInt(note.getDuration(), 10) < 8;\n // Determine if the group should be broken at this note\n const shouldBreak = breaksOnEachRest || breaksOnFirstOrLastRest || breakOnStemChange || isUnbeamableDuration;\n if (shouldBreak) {\n // Add current group\n if (tempGroup.length > 0) {\n sanitizedGroups.push(tempGroup);\n }\n // Start a new group. Include the current note if the group\n // was broken up by stem direction, as that note needs to start\n // the next group of notes\n tempGroup = breakOnStemChange ? [note] : [];\n }\n else {\n // Add note to group\n tempGroup.push(note);\n }\n });\n // If there is a remaining group, add it as well\n if (tempGroup.length > 0) {\n sanitizedGroups.push(tempGroup);\n }\n });\n noteGroups = sanitizedGroups;\n }\n function formatStems() {\n noteGroups.forEach((group) => {\n let stemDirection;\n if (config.maintain_stem_directions) {\n const note = findFirstNote(group);\n stemDirection = note ? note.getStemDirection() : Stem.UP;\n }\n else {\n if (config.stem_direction) {\n stemDirection = config.stem_direction;\n }\n else {\n stemDirection = calculateStemDirection(group);\n }\n }\n applyStemDirection(group, stemDirection);\n });\n }\n function findFirstNote(group) {\n for (let i = 0; i < group.length; i++) {\n const note = group[i];\n if (!note.isRest()) {\n return note;\n }\n }\n return false;\n }\n function applyStemDirection(group, direction) {\n group.forEach((note) => {\n note.setStemDirection(direction);\n });\n }\n // Get all of the tuplets in all of the note groups\n function getTuplets() {\n const uniqueTuplets = [];\n // Go through all of the note groups and inspect for tuplets\n noteGroups.forEach((group) => {\n let tuplet;\n group.forEach((note) => {\n const noteTuplet = note.getTuplet();\n if (noteTuplet && tuplet !== noteTuplet) {\n tuplet = noteTuplet;\n uniqueTuplets.push(tuplet);\n }\n });\n });\n return uniqueTuplets;\n }\n // Using closures to store the variables throughout the various functions\n // IMO Keeps it this process lot cleaner - but not super consistent with\n // the rest of the API's style - Silverwolf90 (Cyril)\n createGroups();\n sanitizeGroups();\n formatStems();\n // Get the notes to be beamed\n const beamedNoteGroups = getBeamGroups();\n // Get the tuplets in order to format them accurately\n const allTuplets = getTuplets();\n // Create a Vex.Flow.Beam from each group of notes to be beamed\n const beams = [];\n beamedNoteGroups.forEach((group) => {\n const beam = new Beam(group);\n if (config.show_stemlets) {\n beam.render_options.show_stemlets = true;\n }\n if (config.secondary_breaks) {\n beam.render_options.secondary_break_ticks = Tables.durationToTicks(config.secondary_breaks);\n }\n if (config.flat_beams === true) {\n beam.render_options.flat_beams = true;\n beam.render_options.flat_beam_offset = config.flat_beam_offset;\n }\n beams.push(beam);\n });\n // Reformat tuplets\n allTuplets.forEach((tuplet) => {\n // Set the tuplet location based on the stem direction\n const direction = tuplet.notes[0].stem_direction === Stem.DOWN ? TupletLocation.BOTTOM : TupletLocation.TOP;\n tuplet.setTupletLocation(direction);\n // If any of the notes in the tuplet are not beamed, draw a bracket.\n let bracketed = false;\n for (let i = 0; i < tuplet.notes.length; i++) {\n const note = tuplet.notes[i];\n if (!note.hasBeam()) {\n bracketed = true;\n break;\n }\n }\n tuplet.setBracketed(bracketed);\n });\n return beams;\n }\n /** Get the notes in this beam. */\n getNotes() {\n return this.notes;\n }\n /** Get the max number of beams in the set of notes. */\n getBeamCount() {\n const beamCounts = this.notes.map((note) => note.getGlyph().beam_count);\n const maxBeamCount = beamCounts.reduce((max, beamCount) => (beamCount > max ? beamCount : max));\n return maxBeamCount;\n }\n /** Set which note `indices` to break the secondary beam at. */\n breakSecondaryAt(indices) {\n this.break_on_indices = indices;\n return this;\n }\n /** Return the y coordinate for linear function. */\n getSlopeY(x, first_x_px, first_y_px, slope) {\n return first_y_px + (x - first_x_px) * slope;\n }\n /** Calculate the best possible slope for the provided notes. */\n calculateSlope() {\n const { notes, stem_direction: stemDirection, render_options: { max_slope, min_slope, slope_iterations, slope_cost }, } = this;\n const firstNote = notes[0];\n const initialSlope = getStemSlope(firstNote, notes[notes.length - 1]);\n const increment = (max_slope - min_slope) / slope_iterations;\n let minCost = Number.MAX_VALUE;\n let bestSlope = 0;\n let yShift = 0;\n // iterate through slope values to find best weighted fit\n for (let slope = min_slope; slope <= max_slope; slope += increment) {\n let totalStemExtension = 0;\n let yShiftTemp = 0;\n // iterate through notes, calculating y shift and stem extension\n for (let i = 1; i < notes.length; ++i) {\n const note = notes[i];\n if (note.hasStem() || note.isRest()) {\n const adjustedStemTipY = this.getSlopeY(note.getStemX(), firstNote.getStemX(), firstNote.getStemExtents().topY, slope) + yShiftTemp;\n const stemTipY = note.getStemExtents().topY;\n // beam needs to be shifted up to accommodate note\n if (stemTipY * stemDirection < adjustedStemTipY * stemDirection) {\n const diff = Math.abs(stemTipY - adjustedStemTipY);\n yShiftTemp += diff * -stemDirection;\n totalStemExtension += diff * i;\n }\n else {\n // beam overshoots note, account for the difference\n totalStemExtension += (stemTipY - adjustedStemTipY) * stemDirection;\n }\n }\n }\n // most engraving books suggest aiming for a slope about half the angle of the\n // difference between the first and last notes' stem length;\n const idealSlope = initialSlope / 2;\n const distanceFromIdeal = Math.abs(idealSlope - slope);\n // This tries to align most beams to something closer to the idealSlope, but\n // doesn't go crazy. To disable, set this.render_options.slope_cost = 0\n const cost = slope_cost * distanceFromIdeal + Math.abs(totalStemExtension);\n // update state when a more ideal slope is found\n if (cost < minCost) {\n minCost = cost;\n bestSlope = slope;\n yShift = yShiftTemp;\n }\n }\n this.slope = bestSlope;\n this.y_shift = yShift;\n }\n /** Calculate a slope and y-shift for flat beams. */\n calculateFlatSlope() {\n const { notes, stem_direction, render_options: { beam_width, min_flat_beam_offset, flat_beam_offset }, } = this;\n // If a flat beam offset has not yet been supplied or calculated,\n // generate one based on the notes in this particular note group\n let total = 0;\n let extremeY = 0; // Store the highest or lowest note here\n let extremeBeamCount = 0; // The beam count of the extreme note\n let currentExtreme = 0;\n for (let i = 0; i < notes.length; i++) {\n // Total up all of the offsets so we can average them out later\n const note = notes[i];\n const stemTipY = note.getStemExtents().topY;\n total += stemTipY;\n // Store the highest (stems-up) or lowest (stems-down) note so the\n // offset can be adjusted in case the average isn't enough\n if (stem_direction === Stem.DOWN && currentExtreme < stemTipY) {\n currentExtreme = stemTipY;\n extremeY = Math.max(...note.getYs());\n extremeBeamCount = note.getBeamCount();\n }\n else if (stem_direction === Stem.UP && (currentExtreme === 0 || currentExtreme > stemTipY)) {\n currentExtreme = stemTipY;\n extremeY = Math.min(...note.getYs());\n extremeBeamCount = note.getBeamCount();\n }\n }\n // Average the offsets to try and come up with a reasonable one that\n // works for all of the notes in the beam group.\n let offset = total / notes.length;\n // In case the average isn't long enough, add or subtract some more\n // based on the highest or lowest note (again, based on the stem\n // direction). This also takes into account the added height due to\n // the width of the beams.\n const beamWidth = beam_width * 1.5;\n const extremeTest = min_flat_beam_offset + extremeBeamCount * beamWidth;\n const newOffset = extremeY + extremeTest * -stem_direction;\n if (stem_direction === Stem.DOWN && offset < newOffset) {\n offset = extremeY + extremeTest;\n }\n else if (stem_direction === Stem.UP && offset > newOffset) {\n offset = extremeY - extremeTest;\n }\n if (!flat_beam_offset) {\n // Set the offset for the group based on the calculations above.\n this.render_options.flat_beam_offset = offset;\n }\n else if (stem_direction === Stem.DOWN && offset > flat_beam_offset) {\n this.render_options.flat_beam_offset = offset;\n }\n else if (stem_direction === Stem.UP && offset < flat_beam_offset) {\n this.render_options.flat_beam_offset = offset;\n }\n // for flat beams, the slope and y_shift are simply 0\n this.slope = 0;\n this.y_shift = 0;\n }\n /** Return the Beam y offset. */\n getBeamYToDraw() {\n const firstNote = this.notes[0];\n const firstStemTipY = firstNote.getStemExtents().topY;\n let beamY = firstStemTipY;\n // For flat beams, set the first and last Y to the offset, rather than\n // using the note's stem extents.\n if (this.render_options.flat_beams && this.render_options.flat_beam_offset) {\n beamY = this.render_options.flat_beam_offset;\n }\n return beamY;\n }\n /**\n * Create new stems for the notes in the beam, so that each stem\n * extends into the beams.\n */\n applyStemExtensions() {\n const { notes, slope, y_shift, stem_direction, beam_count, render_options: { show_stemlets, stemlet_extension, beam_width }, } = this;\n const firstNote = notes[0];\n const firstStemTipY = this.getBeamYToDraw();\n const firstStemX = firstNote.getStemX();\n for (let i = 0; i < notes.length; ++i) {\n const note = notes[i];\n const stem = note.getStem();\n if (stem) {\n const stemX = note.getStemX();\n const { topY: stemTipY } = note.getStemExtents();\n const beamedStemTipY = this.getSlopeY(stemX, firstStemX, firstStemTipY, slope) + y_shift;\n const preBeamExtension = stem.getExtension();\n const beamExtension = stem_direction === Stem.UP ? stemTipY - beamedStemTipY : beamedStemTipY - stemTipY;\n stem.setExtension(preBeamExtension + beamExtension);\n stem.adjustHeightForBeam();\n if (note.isRest() && show_stemlets) {\n const beamWidth = beam_width;\n const totalBeamWidth = (beam_count - 1) * beamWidth * 1.5 + beamWidth;\n stem.setVisibility(true).setStemlet(true, totalBeamWidth + stemlet_extension);\n }\n }\n }\n }\n /** Return upper level beam direction. */\n lookupBeamDirection(duration, prev_tick, tick, next_tick) {\n if (duration === '4') {\n return BEAM_LEFT;\n }\n const lookup_duration = `${Tables.durationToNumber(duration) / 2}`;\n const prev_note_gets_beam = prev_tick < Tables.durationToTicks(lookup_duration);\n const next_note_gets_beam = next_tick < Tables.durationToTicks(lookup_duration);\n const note_gets_beam = tick < Tables.durationToTicks(lookup_duration);\n if (prev_note_gets_beam && next_note_gets_beam && note_gets_beam) {\n return BEAM_BOTH;\n }\n else if (prev_note_gets_beam && !next_note_gets_beam && note_gets_beam) {\n return BEAM_LEFT;\n }\n else if (!prev_note_gets_beam && next_note_gets_beam && note_gets_beam) {\n return BEAM_RIGHT;\n }\n return this.lookupBeamDirection(lookup_duration, prev_tick, tick, next_tick);\n }\n /** Get the x coordinates for the beam lines of specific `duration`. */\n getBeamLines(duration) {\n const tick_of_duration = Tables.durationToTicks(duration);\n let beam_started = false;\n const beam_lines = [];\n let current_beam = undefined;\n const partial_beam_length = this.render_options.partial_beam_length;\n let previous_should_break = false;\n let tick_tally = 0;\n for (let i = 0; i < this.notes.length; ++i) {\n const note = this.notes[i];\n // See if we need to break secondary beams on this note.\n const ticks = note.getTicks().value();\n tick_tally += ticks;\n let should_break = false;\n // 8th note beams are always drawn.\n if (parseInt(duration, 10) >= 8) {\n // First, check to see if any indices were set up through breakSecondaryAt()\n should_break = this.break_on_indices.indexOf(i) !== -1;\n // If the secondary breaks were auto-configured in the render options,\n // handle that as well.\n if (this.render_options.secondary_break_ticks && tick_tally >= this.render_options.secondary_break_ticks) {\n tick_tally = 0;\n should_break = true;\n }\n }\n const note_gets_beam = note.getIntrinsicTicks() < tick_of_duration;\n const stem_x = note.getStemX() - Stem.WIDTH / 2;\n // Check to see if the next note in the group will get a beam at this\n // level. This will help to inform the partial beam logic below.\n const prev_note = this.notes[i - 1];\n const next_note = this.notes[i + 1];\n const next_note_gets_beam = next_note && next_note.getIntrinsicTicks() < tick_of_duration;\n const prev_note_gets_beam = prev_note && prev_note.getIntrinsicTicks() < tick_of_duration;\n const beam_alone = prev_note && next_note && note_gets_beam && !prev_note_gets_beam && !next_note_gets_beam;\n // const beam_alone = note_gets_beam && !prev_note_gets_beam && !next_note_gets_beam;\n if (note_gets_beam) {\n // This note gets a beam at the current level\n if (beam_started) {\n // We're currently in the middle of a beam. Just continue it on to\n // the stem X of the current note.\n current_beam = beam_lines[beam_lines.length - 1];\n current_beam.end = stem_x;\n // If a secondary beam break is set up, end the beam right now.\n if (should_break) {\n beam_started = false;\n if (next_note && !next_note_gets_beam && current_beam.end === undefined) {\n // This note gets a beam,.but the next one does not. This means\n // we need a partial pointing right.\n current_beam.end = current_beam.start - partial_beam_length;\n }\n }\n }\n else {\n // No beam started yet. Start a new one.\n current_beam = { start: stem_x, end: undefined };\n beam_started = true;\n if (beam_alone) {\n // previous and next beam exists and does not get a beam but current gets it.\n const prev_tick = prev_note.getIntrinsicTicks();\n const next_tick = next_note.getIntrinsicTicks();\n const tick = note.getIntrinsicTicks();\n const beam_direction = this.lookupBeamDirection(duration, prev_tick, tick, next_tick);\n if ([BEAM_LEFT, BEAM_BOTH].includes(beam_direction)) {\n current_beam.end = current_beam.start - partial_beam_length;\n }\n else {\n current_beam.end = current_beam.start + partial_beam_length;\n }\n }\n else if (!next_note_gets_beam) {\n // The next note doesn't get a beam. Draw a partial.\n if ((previous_should_break || i === 0) && next_note) {\n // This is the first note (but not the last one), or it is\n // following a secondary break. Draw a partial to the right.\n current_beam.end = current_beam.start + partial_beam_length;\n }\n else {\n // By default, draw a partial to the left.\n current_beam.end = current_beam.start - partial_beam_length;\n }\n }\n else if (should_break) {\n // This note should have a secondary break after it. Even though\n // we just started a beam, it needs to end immediately.\n current_beam.end = current_beam.start - partial_beam_length;\n beam_started = false;\n }\n beam_lines.push(current_beam);\n }\n }\n else {\n // The current note does not get a beam.\n beam_started = false;\n }\n // Store the secondary break flag to inform the partial beam logic in\n // the next iteration of the loop.\n previous_should_break = should_break;\n }\n // Add a partial beam pointing left if this is the last note in the group\n const last_beam = beam_lines[beam_lines.length - 1];\n if (last_beam && last_beam.end === undefined) {\n last_beam.end = last_beam.start - partial_beam_length;\n }\n return beam_lines;\n }\n /** Render the stems for each note. */\n drawStems(ctx) {\n this.notes.forEach((note) => {\n const stem = note.getStem();\n if (stem) {\n stem.setContext(ctx).draw();\n }\n }, this);\n }\n // Render the beam lines\n drawBeamLines(ctx) {\n const valid_beam_durations = ['4', '8', '16', '32', '64'];\n const firstNote = this.notes[0];\n let beamY = this.getBeamYToDraw();\n const firstStemX = firstNote.getStemX();\n const beamThickness = this.render_options.beam_width * this.stem_direction;\n // Draw the beams.\n for (let i = 0; i < valid_beam_durations.length; ++i) {\n const duration = valid_beam_durations[i];\n const beamLines = this.getBeamLines(duration);\n for (let j = 0; j < beamLines.length; ++j) {\n const beam_line = beamLines[j];\n const startBeamX = beam_line.start;\n const startBeamY = this.getSlopeY(startBeamX, firstStemX, beamY, this.slope);\n const lastBeamX = beam_line.end;\n if (lastBeamX) {\n const lastBeamY = this.getSlopeY(lastBeamX, firstStemX, beamY, this.slope);\n ctx.beginPath();\n ctx.moveTo(startBeamX, startBeamY);\n ctx.lineTo(startBeamX, startBeamY + beamThickness);\n ctx.lineTo(lastBeamX + 1, lastBeamY + beamThickness);\n ctx.lineTo(lastBeamX + 1, lastBeamY);\n ctx.closePath();\n ctx.fill();\n }\n else {\n throw new RuntimeError('NoLastBeamX', 'lastBeamX undefined.');\n }\n }\n beamY += beamThickness * 1.5;\n }\n }\n /** Pre-format the beam. */\n preFormat() {\n return this;\n }\n /**\n * Post-format the beam. This can only be called after\n * the notes in the beam have both `x` and `y` values. ie: they've\n * been formatted and have staves.\n */\n postFormat() {\n if (this.postFormatted)\n return;\n // Calculate a smart slope if we're not forcing the beams to be flat.\n if (isTabNote(this.notes[0]) || this.render_options.flat_beams) {\n this.calculateFlatSlope();\n }\n else {\n this.calculateSlope();\n }\n this.applyStemExtensions();\n this.postFormatted = true;\n }\n /** Render the beam to the canvas context */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n if (this.unbeamable)\n return;\n if (!this.postFormatted) {\n this.postFormat();\n }\n this.drawStems(ctx);\n this.applyStyle();\n this.drawBeamLines(ctx);\n this.restoreStyle();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2014\n// MIT License\nimport { Clef } from './clef';\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Category } from './typeguard';\n/** ClefNote implements clef annotations in measures. */\nexport class ClefNote extends Note {\n constructor(type, size, annotation) {\n super({ duration: 'b' });\n this.type = type;\n this.clef_obj = new Clef(type, size, annotation);\n this.clef = this.clef_obj.clef;\n this.glyph = new Glyph(this.clef.code, this.clef.point);\n this.setWidth(this.glyph.getMetrics().width);\n // Note properties\n this.ignore_ticks = true;\n }\n static get CATEGORY() {\n return Category.ClefNote;\n }\n /** Set clef type, size and annotation. */\n setType(type, size, annotation) {\n this.type = type;\n this.clef_obj = new Clef(type, size, annotation);\n this.clef = this.clef_obj.clef;\n this.glyph = new Glyph(this.clef.code, this.clef.point);\n this.setWidth(this.glyph.getMetrics().width);\n return this;\n }\n /** Get associated clef. */\n getClef() {\n return this.clef;\n }\n /** Set associated context. */\n setContext(context) {\n super.setContext(context);\n this.glyph.setContext(this.getContext());\n return this;\n }\n /** Get bounding box. */\n getBoundingBox() {\n return super.getBoundingBox();\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n /** Render clef note. */\n draw() {\n var _a;\n const stave = this.checkStave();\n if (!this.glyph.getContext()) {\n this.glyph.setContext(this.getContext());\n }\n this.setRendered();\n const abs_x = this.getAbsoluteX();\n this.glyph.setStave(stave);\n this.glyph.setYShift(stave.getYForLine((_a = this.clef.line) !== null && _a !== void 0 ? _a : 0) - stave.getYForGlyphs());\n this.glyph.renderToStave(abs_x);\n // If the Vex.Flow.Clef has an annotation, such as 8va, draw it.\n if (this.clef_obj.annotation !== undefined) {\n const attachment = new Glyph(this.clef_obj.annotation.code, this.clef_obj.annotation.point);\n if (!attachment.getContext()) {\n attachment.setContext(this.getContext());\n }\n attachment.setStave(stave);\n attachment.setYShift(stave.getYForLine(this.clef_obj.annotation.line) - stave.getYForGlyphs());\n attachment.setXShift(this.clef_obj.annotation.x_shift);\n attachment.renderToStave(abs_x);\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// This file implements the `Crescendo` object which draws crescendos and\n// decrescendo dynamics markings. A `Crescendo` is initialized with a\n// duration and formatted as part of a `Voice` like any other `Note`\n// type in VexFlow. This object would most likely be formatted in a Voice\n// with `TextNotes` - which are used to represent other dynamics markings.\nimport { Note } from './note';\nimport { TickContext } from './tickcontext';\nimport { Category } from './typeguard';\nimport { log } from './util';\n// To enable logging for this class. Set `Vex.Flow.Crescendo.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (Crescendo.DEBUG)\n log('Vex.Flow.Crescendo', args);\n}\n// Private helper to draw the hairpin\nfunction renderHairpin(ctx, params) {\n const begin_x = params.begin_x;\n const end_x = params.end_x;\n const y = params.y;\n const half_height = params.height / 2;\n ctx.beginPath();\n if (params.reverse) {\n ctx.moveTo(begin_x, y - half_height);\n ctx.lineTo(end_x, y);\n ctx.lineTo(begin_x, y + half_height);\n }\n else {\n ctx.moveTo(end_x, y - half_height);\n ctx.lineTo(begin_x, y);\n ctx.lineTo(end_x, y + half_height);\n }\n ctx.stroke();\n ctx.closePath();\n}\nexport class Crescendo extends Note {\n // Initialize the crescendo's properties\n constructor(noteStruct) {\n super(noteStruct);\n this.options = {\n // Extensions to the length of the crescendo on either side\n extend_left: 0,\n extend_right: 0,\n // Vertical shift\n y_shift: 0,\n };\n // Whether the object is a decrescendo\n this.decrescendo = false;\n // The staff line to be placed on\n this.line = noteStruct.line || 0;\n // The height at the open end of the cresc/decresc\n this.height = 15;\n }\n /** Crescendo category string. */\n static get CATEGORY() {\n return Category.Crescendo;\n }\n // Set the line to center the element on\n setLine(line) {\n this.line = line;\n return this;\n }\n // Set the full height at the open end\n setHeight(height) {\n this.height = height;\n return this;\n }\n // Set whether the sign should be a descresendo by passing a bool\n // to `decresc`\n setDecrescendo(decresc) {\n this.decrescendo = decresc;\n return this;\n }\n // Preformat the note\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n // Render the Crescendo object onto the canvas\n draw() {\n const ctx = this.checkContext();\n const stave = this.checkStave();\n this.setRendered();\n const tick_context = this.getTickContext();\n const next_context = TickContext.getNextContext(tick_context);\n const begin_x = this.getAbsoluteX();\n const end_x = next_context ? next_context.getX() : stave.getX() + stave.getWidth();\n const y = stave.getYForLine(this.line + -3) + 1;\n L('Drawing ', this.decrescendo ? 'decrescendo ' : 'crescendo ', this.height, 'x', begin_x - end_x);\n renderHairpin(ctx, {\n begin_x: begin_x - this.options.extend_left,\n end_x: end_x + this.options.extend_right,\n y: y + this.options.y_shift,\n height: this.height,\n reverse: this.decrescendo,\n });\n }\n}\nCrescendo.DEBUG = false;\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n//\n// This class implements curves (for slurs)\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport var CurvePosition;\n(function (CurvePosition) {\n CurvePosition[CurvePosition[\"NEAR_HEAD\"] = 1] = \"NEAR_HEAD\";\n CurvePosition[CurvePosition[\"NEAR_TOP\"] = 2] = \"NEAR_TOP\";\n})(CurvePosition || (CurvePosition = {}));\nexport class Curve extends Element {\n // from: Start note\n // to: End note\n // options:\n // cps: List of control points\n // x_shift: pixels to shift\n // y_shift: pixels to shift\n constructor(from, to, options) {\n super();\n this.render_options = Object.assign({ thickness: 2, x_shift: 0, y_shift: 10, position: CurvePosition.NEAR_HEAD, position_end: CurvePosition.NEAR_HEAD, invert: false, cps: [\n { x: 0, y: 10 },\n { x: 0, y: 10 },\n ] }, options);\n this.from = from;\n this.to = to;\n }\n static get CATEGORY() {\n return Category.Curve;\n }\n static get Position() {\n return CurvePosition;\n }\n static get PositionString() {\n return {\n nearHead: CurvePosition.NEAR_HEAD,\n nearTop: CurvePosition.NEAR_TOP,\n };\n }\n setNotes(from, to) {\n if (!from && !to) {\n throw new RuntimeError('BadArguments', 'Curve needs to have either `from` or `to` set.');\n }\n this.from = from;\n this.to = to;\n return this;\n }\n /**\n * @return {boolean} Returns true if this is a partial bar.\n */\n isPartial() {\n return !this.from || !this.to;\n }\n renderCurve(params) {\n const ctx = this.checkContext();\n const x_shift = this.render_options.x_shift;\n const y_shift = this.render_options.y_shift * params.direction;\n const first_x = params.first_x + x_shift;\n const first_y = params.first_y + y_shift;\n const last_x = params.last_x - x_shift;\n const last_y = params.last_y + y_shift;\n const thickness = this.render_options.thickness;\n const cps = this.render_options.cps;\n const { x: cp0x, y: cp0y } = cps[0];\n const { x: cp1x, y: cp1y } = cps[1];\n const cp_spacing = (last_x - first_x) / (cps.length + 2);\n ctx.beginPath();\n ctx.moveTo(first_x, first_y);\n ctx.bezierCurveTo(first_x + cp_spacing + cp0x, first_y + cp0y * params.direction, last_x - cp_spacing + cp1x, last_y + cp1y * params.direction, last_x, last_y);\n ctx.bezierCurveTo(last_x - cp_spacing + cp1x, last_y + (cp1y + thickness) * params.direction, first_x + cp_spacing + cp0x, first_y + (cp0y + thickness) * params.direction, first_x, first_y);\n ctx.stroke();\n ctx.closePath();\n ctx.fill();\n }\n draw() {\n this.checkContext();\n this.setRendered();\n const first_note = this.from;\n const last_note = this.to;\n let first_x;\n let last_x;\n let first_y;\n let last_y;\n let stem_direction = 0;\n let metric = 'baseY';\n let end_metric = 'baseY';\n function getPosition(position) {\n return typeof position === 'string' ? Curve.PositionString[position] : position;\n }\n const position = getPosition(this.render_options.position);\n const position_end = getPosition(this.render_options.position_end);\n if (position === CurvePosition.NEAR_TOP) {\n metric = 'topY';\n end_metric = 'topY';\n }\n if (position_end === CurvePosition.NEAR_HEAD) {\n end_metric = 'baseY';\n }\n else if (position_end === CurvePosition.NEAR_TOP) {\n end_metric = 'topY';\n }\n if (first_note) {\n first_x = first_note.getTieRightX();\n stem_direction = first_note.getStemDirection();\n first_y = first_note.getStemExtents()[metric];\n }\n else {\n const stave = last_note.checkStave();\n first_x = stave.getTieStartX();\n first_y = last_note.getStemExtents()[metric];\n }\n if (last_note) {\n last_x = last_note.getTieLeftX();\n stem_direction = last_note.getStemDirection();\n last_y = last_note.getStemExtents()[end_metric];\n }\n else {\n const stave = first_note.checkStave();\n last_x = stave.getTieEndX();\n last_y = first_note.getStemExtents()[end_metric];\n }\n this.renderCurve({\n first_x,\n last_x,\n first_y,\n last_y,\n direction: stem_direction * (this.render_options.invert === true ? -1 : 1),\n });\n return true;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// A generic text parsing class for VexFlow.\nimport { log, RuntimeError } from './util';\n// To enable logging for this class. Set `Vex.Flow.Parser.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (Parser.DEBUG)\n log('Vex.Flow.Parser', args);\n}\nconst NO_ERROR_POS = -1;\n// Converts parser results into an easy to reference list that can be\n// used in triggers. This function returns:\n// - nested array in which the leaf elements are string or null\n// - string (including empty strings)\n// - null\nfunction flattenMatches(r) {\n if ('matchedString' in r)\n return r.matchedString; // string\n if ('results' in r)\n return flattenMatches(r.results);\n const results = r;\n if (results.length === 1)\n return flattenMatches(results[0]);\n if (results.length === 0)\n return null;\n return results.map(flattenMatches); // nested array\n}\n// This is the base parser class. Given an arbitrary context-free grammar, it\n// can parse any line and execute code when specific rules are met (e.g.,\n// when a string is terminated.)\nexport class Parser {\n // For an example of a simple grammar, take a look at tests/parser_tests.ts or\n // the EasyScore grammar in easyscore.ts.\n constructor(grammar) {\n this.grammar = grammar;\n this.line = '';\n this.pos = 0;\n this.errorPos = NO_ERROR_POS;\n }\n // Parse `line` using current grammar. Returns `{success: true}` if the\n // line parsed correctly, otherwise returns `{success: false, errorPos: N}`\n // where `errorPos` is the location of the error in the string.\n parse(line) {\n this.line = line;\n this.pos = 0;\n this.errorPos = NO_ERROR_POS;\n const result = this.expect(this.grammar.begin());\n result.errorPos = this.errorPos;\n return result;\n }\n matchFail(returnPos) {\n if (this.errorPos === NO_ERROR_POS)\n this.errorPos = this.pos;\n this.pos = returnPos;\n }\n matchSuccess() {\n this.errorPos = NO_ERROR_POS;\n }\n // Look for `token` in this.line[this.pos], and return success\n // if one is found. `token` is specified as a regular expression.\n matchToken(token, noSpace = false) {\n const regexp = noSpace ? new RegExp('^((' + token + '))') : new RegExp('^((' + token + ')\\\\s*)');\n const workingLine = this.line.slice(this.pos);\n const result = workingLine.match(regexp);\n if (result !== null) {\n return {\n success: true,\n matchedString: result[2],\n incrementPos: result[1].length,\n pos: this.pos,\n };\n }\n else {\n return { success: false, pos: this.pos };\n }\n }\n // Execute rule to match a sequence of tokens (or rules). If `maybe` is\n // set, then return success even if the token is not found, but reset\n // the position before exiting.\n // TODO: expectOne(...) is never called with the `maybe` parameter.\n expectOne(rule, maybe = false) {\n const results = [];\n const pos = this.pos;\n let allMatches = true;\n let oneMatch = false;\n maybe = maybe === true || rule.maybe === true;\n // Execute all sub rules in sequence.\n if (rule.expect) {\n for (const next of rule.expect) {\n const localPos = this.pos;\n const result = this.expect(next);\n // If `rule.or` is set, then return success if any one\n // of the subrules match, else all subrules must match.\n if (result.success) {\n results.push(result);\n oneMatch = true;\n if (rule.or)\n break;\n }\n else {\n allMatches = false;\n if (!rule.or) {\n this.pos = localPos;\n break;\n }\n }\n }\n }\n const gotOne = (rule.or && oneMatch) || allMatches;\n const success = gotOne || maybe === true;\n const numMatches = gotOne ? 1 : 0;\n if (maybe && !gotOne)\n this.pos = pos;\n if (success) {\n this.matchSuccess();\n }\n else {\n this.matchFail(pos);\n }\n return { success, results, numMatches };\n }\n // Try to match multiple (one or more) instances of the rule. If `maybe` is set,\n // then a failed match is also a success (but the position is reset).\n expectOneOrMore(rule, maybe = false) {\n const results = [];\n const pos = this.pos;\n let numMatches = 0;\n let more = true;\n do {\n const result = this.expectOne(rule);\n if (result.success && result.results) {\n numMatches++;\n results.push(result.results);\n }\n else {\n more = false;\n }\n } while (more);\n const success = numMatches > 0 || maybe === true;\n if (maybe && !(numMatches > 0))\n this.pos = pos;\n if (success) {\n this.matchSuccess();\n }\n else {\n this.matchFail(pos);\n }\n return { success, results, numMatches };\n }\n // Match zero or more instances of `rule`. Offloads to `expectOneOrMore`.\n expectZeroOrMore(rule) {\n return this.expectOneOrMore(rule, true);\n }\n // Execute the rule produced by the provided `rules` function. This\n // offloads to one of the above matchers and consolidates the results. It is also\n // responsible for executing any code triggered by the rule (in `rule.run`.)\n expect(ruleFunc) {\n L('Evaluating rule function:', ruleFunc);\n if (!ruleFunc) {\n throw new RuntimeError('Invalid rule function');\n }\n let result;\n // Get rule from Grammar class.\n // expect(...) handles both lexing & parsing:\n // - lexer rules produce tokens.\n // - parser rules produce expressions which may trigger code via the\n // { run: () => ... } trigger functions in easyscore.ts.\n // These functions build the VexFlow objects that are displayed on screen.\n const rule = ruleFunc.bind(this.grammar)();\n if (rule.token) {\n // A lexer rule has a `token` property.\n // Base case: parse the regex and throw an error if the\n // line doesn't match.\n result = this.matchToken(rule.token, rule.noSpace === true);\n if (result.success) {\n // Token match! Update position and throw away parsed portion\n // of string.\n this.pos += result.incrementPos;\n }\n }\n else if (rule.expect) {\n // A parser rule has an `expect` property.\n if (rule.oneOrMore) {\n result = this.expectOneOrMore(rule);\n }\n else if (rule.zeroOrMore) {\n result = this.expectZeroOrMore(rule);\n }\n else {\n result = this.expectOne(rule);\n }\n }\n else {\n L(rule);\n throw new RuntimeError('Bad grammar! No `token` or `expect` property ' + rule);\n }\n // If there's a trigger attached to this rule, then run it.\n // Make the matches accessible through `state.matches` in the\n // `run: (state) => ...` trigger.\n const matches = [];\n result.matches = matches;\n if (result.results) {\n result.results.forEach((r) => matches.push(flattenMatches(r)));\n }\n if (rule.run && result.success) {\n rule.run({ matches });\n }\n return result;\n }\n}\nParser.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Articulation } from './articulation';\nimport { Dot } from './dot';\nimport { FretHandFinger } from './frethandfinger';\nimport { Music } from './music';\nimport { Parser } from './parser';\nimport { Stem } from './stem';\nimport { defined, log, RuntimeError } from './util';\n// To enable logging for this class. Set `Vex.Flow.EasyScore.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (EasyScore.DEBUG)\n log('Vex.Flow.EasyScore', args);\n}\nexport class EasyScoreGrammar {\n constructor(builder) {\n this.builder = builder;\n }\n begin() {\n return this.LINE;\n }\n LINE() {\n return {\n expect: [this.PIECE, this.PIECES, this.EOL],\n };\n }\n PIECE() {\n return {\n expect: [this.CHORDORNOTE, this.PARAMS],\n run: () => this.builder.commitPiece(),\n };\n }\n PIECES() {\n return {\n expect: [this.COMMA, this.PIECE],\n zeroOrMore: true,\n };\n }\n PARAMS() {\n return {\n expect: [this.DURATION, this.TYPE, this.DOTS, this.OPTS],\n };\n }\n CHORDORNOTE() {\n return {\n expect: [this.CHORD, this.SINGLENOTE],\n or: true,\n };\n }\n CHORD() {\n return {\n expect: [this.LPAREN, this.NOTES, this.RPAREN],\n // eslint-disable-next-line\n run: (state) => this.builder.addChord(state.matches[1]),\n };\n }\n NOTES() {\n return {\n expect: [this.NOTE],\n oneOrMore: true,\n };\n }\n NOTE() {\n return {\n expect: [this.NOTENAME, this.ACCIDENTAL, this.OCTAVE],\n };\n }\n SINGLENOTE() {\n return {\n expect: [this.NOTENAME, this.ACCIDENTAL, this.OCTAVE],\n run: (state) => {\n // eslint-disable-next-line\n const s = state;\n this.builder.addSingleNote(s.matches[0], s.matches[1], s.matches[2]);\n },\n };\n }\n ACCIDENTAL() {\n return {\n expect: [this.MICROTONES, this.ACCIDENTALS],\n maybe: true,\n or: true,\n };\n }\n DOTS() {\n return {\n expect: [this.DOT],\n zeroOrMore: true,\n // eslint-disable-next-line\n run: (state) => this.builder.setNoteDots(state.matches),\n };\n }\n TYPE() {\n return {\n expect: [this.SLASH, this.MAYBESLASH, this.TYPES],\n maybe: true,\n // eslint-disable-next-line\n run: (state) => this.builder.setNoteType(state.matches[2]),\n };\n }\n DURATION() {\n return {\n expect: [this.SLASH, this.DURATIONS],\n maybe: true,\n // eslint-disable-next-line\n run: (state) => this.builder.setNoteDuration(state.matches[1]),\n };\n }\n OPTS() {\n return {\n expect: [this.LBRACKET, this.KEYVAL, this.KEYVALS, this.RBRACKET],\n maybe: true,\n };\n }\n KEYVALS() {\n return {\n expect: [this.COMMA, this.KEYVAL],\n zeroOrMore: true,\n };\n }\n KEYVAL() {\n const unquote = (str) => str.slice(1, -1);\n return {\n expect: [this.KEY, this.EQUALS, this.VAL],\n // eslint-disable-next-line\n run: (state) => this.builder.addNoteOption(state.matches[0], unquote(state.matches[2])),\n };\n }\n VAL() {\n return {\n expect: [this.SVAL, this.DVAL],\n or: true,\n };\n }\n KEY() {\n return { token: '[a-zA-Z][a-zA-Z0-9]*' };\n }\n DVAL() {\n return { token: '[\"][^\"]*[\"]' };\n }\n SVAL() {\n return { token: \"['][^']*[']\" };\n }\n NOTENAME() {\n return { token: '[a-gA-G]' };\n }\n OCTAVE() {\n return { token: '[0-9]+' };\n }\n ACCIDENTALS() {\n return { token: 'bb|b|##|#|n' };\n }\n MICROTONES() {\n return { token: 'bbs|bss|bs|db|d|\\\\+\\\\+-|\\\\+-|\\\\+\\\\+|\\\\+|k|o' };\n }\n DURATIONS() {\n return { token: '[0-9whq]+' };\n }\n TYPES() {\n return { token: '[rRsSmMhHgG]' };\n }\n LPAREN() {\n return { token: '[(]' };\n }\n RPAREN() {\n return { token: '[)]' };\n }\n COMMA() {\n return { token: '[,]' };\n }\n DOT() {\n return { token: '[.]' };\n }\n SLASH() {\n return { token: '[/]' };\n }\n MAYBESLASH() {\n return { token: '[/]?' };\n }\n EQUALS() {\n return { token: '[=]' };\n }\n LBRACKET() {\n return { token: '\\\\[' };\n }\n RBRACKET() {\n return { token: '\\\\]' };\n }\n EOL() {\n return { token: '$' };\n }\n}\nexport class Piece {\n constructor(duration) {\n this.chord = [];\n this.dots = 0;\n this.options = {};\n this.duration = duration;\n }\n}\nexport class Builder {\n constructor(factory) {\n this.commitHooks = [];\n this.factory = factory;\n this.reset();\n }\n reset(options) {\n this.options = Object.assign({ stem: 'auto', clef: 'treble' }, options);\n this.elements = { notes: [], accidentals: [] };\n this.rollingDuration = '8';\n this.resetPiece();\n }\n getFactory() {\n return this.factory;\n }\n getElements() {\n return this.elements;\n }\n addCommitHook(commitHook) {\n this.commitHooks.push(commitHook);\n }\n resetPiece() {\n L('resetPiece');\n this.piece = new Piece(this.rollingDuration);\n }\n setNoteDots(dots) {\n L('setNoteDots:', dots);\n if (dots)\n this.piece.dots = dots.length;\n }\n setNoteDuration(duration) {\n L('setNoteDuration:', duration);\n this.rollingDuration = this.piece.duration = duration || this.rollingDuration;\n }\n setNoteType(type) {\n L('setNoteType:', type);\n if (type)\n this.piece.type = type;\n }\n addNoteOption(key, value) {\n L('addNoteOption: key:', key, 'value:', value);\n this.piece.options[key] = value;\n }\n addNote(key, accid, octave) {\n L('addNote:', key, accid, octave);\n this.piece.chord.push({\n key: key,\n accid,\n octave,\n });\n }\n addSingleNote(key, accid, octave) {\n L('addSingleNote:', key, accid, octave);\n this.addNote(key, accid, octave);\n }\n // notes is an array with 3 entries\n addChord(notes) {\n L('startChord');\n if (typeof notes[0] !== 'object') {\n this.addSingleNote(notes[0]);\n }\n else {\n notes.forEach((n) => {\n if (n)\n this.addNote(...n); // n => [string, string | null, string]\n });\n }\n L('endChord');\n }\n commitPiece() {\n L('commitPiece');\n const { factory } = this;\n if (!factory)\n return;\n const options = Object.assign(Object.assign({}, this.options), this.piece.options);\n // reset() sets this.options.stem & this.options.clef but we check to make sure nothing has changed.\n // e.g., auto | up | down\n const stem = defined(options.stem, 'BadArguments', 'options.stem is not defined').toLowerCase();\n // e.g., treble | bass\n const clef = defined(options.clef, 'BadArguments', 'options.clef is not defined').toLowerCase();\n const { chord, duration, dots, type } = this.piece;\n // Create a string[] that will be assigned to the .keys property of the StaveNote.\n // Each string in the array represents a note pitch and is of the form: {NoteName}{Accidental}/{Octave}\n // Only standard accidentals are included in the .keys property. Microtonal accidentals are not included.\n const standardAccidentals = Music.accidentals;\n const keys = chord.map((notePiece) => {\n var _a;\n return notePiece.key +\n (standardAccidentals.includes((_a = notePiece.accid) !== null && _a !== void 0 ? _a : '') ? notePiece.accid : '') +\n '/' +\n notePiece.octave;\n });\n const auto_stem = stem === 'auto'; // StaveNoteStruct expects the underscore & lowercase.\n // Build a GhostNote or StaveNote using the information we gathered.\n const note = (type === null || type === void 0 ? void 0 : type.toLowerCase()) == 'g'\n ? factory.GhostNote({ duration, dots })\n : factory.StaveNote({ keys, duration, dots, type, clef, auto_stem });\n if (!auto_stem)\n note.setStemDirection(stem === 'up' ? Stem.UP : Stem.DOWN);\n // Attach accidentals.\n const accidentals = [];\n chord.forEach((notePiece, index) => {\n const accid = notePiece.accid;\n if (typeof accid === 'string') {\n const accidental = factory.Accidental({ type: accid });\n note.addModifier(accidental, index);\n accidentals.push(accidental);\n }\n else {\n accidentals.push(undefined);\n }\n });\n // Attach dots.\n for (let i = 0; i < dots; i++)\n Dot.buildAndAttach([note], { all: true });\n this.commitHooks.forEach((commitHook) => commitHook(options, note, this));\n this.elements.notes.push(note);\n this.elements.accidentals.push(accidentals);\n this.resetPiece();\n }\n}\n/**\n * Commit hook used by EasyScore.setOptions().\n */\nfunction setId(options, note) {\n if (options.id === undefined)\n return;\n note.setAttribute('id', options.id);\n}\n// Used by setClass() below.\nconst commaSeparatedRegex = /\\s*,\\s*/;\n/**\n * Commit hook used by EasyScore.setOptions().\n */\nfunction setClass(options, note) {\n if (options.class === undefined)\n return;\n options.class.split(commaSeparatedRegex).forEach((className) => note.addClass(className));\n}\n/**\n * EasyScore implements a parser for a simple language to generate VexFlow objects.\n */\nexport class EasyScore {\n constructor(options = {}) {\n this.defaults = {\n clef: 'treble',\n time: '4/4',\n stem: 'auto',\n };\n this.setOptions(options);\n }\n /**\n * Set the score defaults.\n * clef must be set appropriately to avoid errors when adding Staves.\n * @param defaults.clef default clef ( treble | bass ...) see {@link Clef.types}\n * @param defaults.time default time signature ( 4/4 | 9/8 ...)\n * @param defaults.stem default stem arrangement (auto | up | down)\n * @returns this\n */\n set(defaults) {\n this.defaults = Object.assign(Object.assign({}, this.defaults), defaults);\n return this;\n }\n /**\n * @param options.factory is required.\n * @returns this\n */\n setOptions(options) {\n var _a, _b;\n // eslint-disable-next-line\n const factory = options.factory; // ! operator, because options.factory was set in Factory.EasyScore().\n const builder = (_a = options.builder) !== null && _a !== void 0 ? _a : new Builder(factory);\n this.options = Object.assign(Object.assign({ commitHooks: [setId, setClass, Articulation.easyScoreHook, FretHandFinger.easyScoreHook], throwOnError: false }, options), { factory,\n builder });\n this.factory = factory;\n this.builder = builder;\n this.grammar = new EasyScoreGrammar(this.builder);\n this.parser = new Parser(this.grammar);\n (_b = this.options.commitHooks) === null || _b === void 0 ? void 0 : _b.forEach((commitHook) => this.addCommitHook(commitHook));\n return this;\n }\n setContext(context) {\n this.factory.setContext(context);\n return this;\n }\n parse(line, options = {}) {\n this.builder.reset(options);\n const result = this.parser.parse(line);\n if (!result.success && this.options.throwOnError) {\n L(result);\n throw new RuntimeError('Error parsing line: ' + line);\n }\n return result;\n }\n beam(notes, options) {\n this.factory.Beam({ notes, options });\n return notes;\n }\n tuplet(notes, options) {\n this.factory.Tuplet({ notes, options });\n return notes;\n }\n notes(line, options = {}) {\n options = Object.assign({ clef: this.defaults.clef, stem: this.defaults.stem }, options);\n this.parse(line, options);\n return this.builder.getElements().notes;\n }\n voice(notes, options = {}) {\n options = Object.assign({ time: this.defaults.time }, options);\n return this.factory.Voice(options).addTickables(notes);\n }\n addCommitHook(commitHook) {\n this.builder.addCommitHook(commitHook);\n }\n}\nEasyScore.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\nimport { StemmableNote } from './stemmablenote';\nimport { Category, isAnnotation } from './typeguard';\nimport { RuntimeError } from './util';\nconst ERROR_MSG = 'Ghost note must have valid initialization data to identify duration.';\nexport class GhostNote extends StemmableNote {\n static get CATEGORY() {\n return Category.GhostNote;\n }\n constructor(parameter) {\n if (!parameter) {\n throw new RuntimeError('BadArguments', ERROR_MSG);\n }\n let noteStruct;\n if (typeof parameter === 'string') {\n // Preserve backwards-compatibility\n noteStruct = { duration: parameter };\n }\n else if (typeof parameter === 'object') {\n noteStruct = parameter;\n }\n else {\n throw new RuntimeError('BadArguments', ERROR_MSG);\n }\n super(noteStruct);\n // Note properties\n this.setWidth(0);\n }\n /**\n * @returns true if this note is a type of rest. Rests don't have pitches, but take up space in the score.\n */\n isRest() {\n return true;\n }\n setStave(stave) {\n super.setStave(stave);\n return this;\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n draw() {\n // Draw Annotations\n this.setRendered();\n for (let i = 0; i < this.modifiers.length; ++i) {\n const modifier = this.modifiers[i];\n if (isAnnotation(modifier)) {\n modifier.setContext(this.getContext());\n modifier.drawWithStyle();\n }\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { Note } from './note';\nimport { Category } from './typeguard';\nexport class GlyphNote extends Note {\n constructor(glyph, noteStruct, options) {\n super(noteStruct);\n this.options = Object.assign({ ignoreTicks: false, line: 2 }, options);\n // Note properties\n this.ignore_ticks = this.options.ignoreTicks;\n if (glyph) {\n this.setGlyph(glyph);\n }\n }\n static get CATEGORY() {\n return Category.GlyphNote;\n }\n setGlyph(glyph) {\n this.glyph = glyph;\n this.setWidth(this.glyph.getMetrics().width);\n return this;\n }\n getBoundingBox() {\n return this.glyph.getBoundingBox();\n }\n preFormat() {\n if (!this.preFormatted && this.modifierContext) {\n this.modifierContext.preFormat();\n }\n this.preFormatted = true;\n return this;\n }\n drawModifiers() {\n const ctx = this.checkContext();\n ctx.openGroup('modifiers');\n for (let i = 0; i < this.modifiers.length; i++) {\n const modifier = this.modifiers[i];\n modifier.setContext(ctx);\n modifier.drawWithStyle();\n }\n ctx.closeGroup();\n }\n draw() {\n const stave = this.checkStave();\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.openGroup('glyphNote', this.getAttribute('id'));\n // Context is set when setStave is called on Note\n const glyph = this.glyph;\n if (!glyph.getContext()) {\n glyph.setContext(ctx);\n }\n glyph.setStave(stave);\n glyph.setYShift(stave.getYForLine(this.options.line) - stave.getYForGlyphs());\n const x = this.isCenterAligned() ? this.getAbsoluteX() - this.getWidth() / 2 : this.getAbsoluteX();\n glyph.renderToStave(x);\n this.drawModifiers();\n ctx.closeGroup();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { StaveNote } from './stavenote';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class GraceNote extends StaveNote {\n constructor(noteStruct) {\n super(Object.assign({ glyph_font_scale: Tables.NOTATION_FONT_SCALE * GraceNote.SCALE, stroke_px: GraceNote.LEDGER_LINE_OFFSET }, noteStruct));\n this.slash = noteStruct.slash || false;\n this.slur = true;\n this.buildNoteHeads();\n this.width = 3;\n }\n static get CATEGORY() {\n return Category.GraceNote;\n }\n static get LEDGER_LINE_OFFSET() {\n return 2;\n }\n static get SCALE() {\n return 0.66;\n }\n getStemExtension() {\n if (this.stem_extension_override) {\n return this.stem_extension_override;\n }\n const glyph = this.getGlyph();\n if (glyph) {\n let ret = super.getStemExtension();\n if (glyph.stem) {\n const staveNoteScale = this.getStaveNoteScale();\n ret = (Stem.HEIGHT + ret) * staveNoteScale - Stem.HEIGHT;\n }\n return ret;\n }\n return 0;\n }\n // FIXME: move this to more basic class.\n getStaveNoteScale() {\n return this.render_options.glyph_font_scale / Tables.NOTATION_FONT_SCALE;\n }\n draw() {\n super.draw();\n this.setRendered();\n const stem = this.stem;\n if (this.slash && stem) {\n const staveNoteScale = this.getStaveNoteScale();\n // some magic numbers are based on the staveNoteScale 0.66.\n const offsetScale = staveNoteScale / 0.66;\n let slashBBox = undefined;\n const beam = this.beam;\n if (beam) {\n // FIXME: should render slash after beam?\n if (!beam.postFormatted) {\n beam.postFormat();\n }\n slashBBox = this.calcBeamedNotesSlashBBox(8 * offsetScale, 8 * offsetScale, {\n stem: 6 * offsetScale,\n beam: 5 * offsetScale,\n });\n }\n else {\n const stem_direction = this.getStemDirection();\n const noteHeadBounds = this.getNoteHeadBounds();\n const noteStemHeight = stem.getHeight();\n let x = this.getAbsoluteX();\n let y = stem_direction === Stem.DOWN\n ? noteHeadBounds.y_top - noteStemHeight\n : noteHeadBounds.y_bottom - noteStemHeight;\n let defaultOffsetY = Tables.STEM_HEIGHT;\n defaultOffsetY -= defaultOffsetY / 2.8;\n y += defaultOffsetY * staveNoteScale * stem_direction;\n const offsets = stem_direction === Stem.UP\n ? {\n x1: 1,\n y1: 0,\n x2: 13,\n y2: -9,\n }\n : {\n x1: -4,\n y1: 1,\n x2: 13,\n y2: 9,\n };\n x += offsets.x1 * offsetScale;\n y += offsets.y1 * offsetScale;\n slashBBox = {\n x1: x,\n y1: y,\n x2: x + offsets.x2 * offsetScale,\n y2: y + offsets.y2 * offsetScale,\n };\n }\n // FIXME: avoid staff lines, ledger lines or others.\n const ctx = this.checkContext();\n ctx.save();\n ctx.setLineWidth(1 * offsetScale); // FIXME: use more appropriate value.\n ctx.beginPath();\n ctx.moveTo(slashBBox.x1, slashBBox.y1);\n ctx.lineTo(slashBBox.x2, slashBBox.y2);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n }\n }\n calcBeamedNotesSlashBBox(slashStemOffset, slashBeamOffset, protrusions) {\n const beam = this.beam;\n if (!beam)\n throw new RuntimeError('NoBeam', \"Can't calculate without a beam.\");\n const beam_slope = beam.slope;\n const isBeamEndNote = beam.notes[beam.notes.length - 1] === this;\n const scaleX = isBeamEndNote ? -1 : 1;\n const beam_angle = Math.atan(beam_slope * scaleX);\n // slash line intersecting point on beam.\n const iPointOnBeam = {\n dx: Math.cos(beam_angle) * slashBeamOffset,\n dy: Math.sin(beam_angle) * slashBeamOffset,\n };\n slashStemOffset *= this.getStemDirection();\n const slash_angle = Math.atan((iPointOnBeam.dy - slashStemOffset) / iPointOnBeam.dx);\n const protrusion_stem_dx = Math.cos(slash_angle) * protrusions.stem * scaleX;\n const protrusion_stem_dy = Math.sin(slash_angle) * protrusions.stem;\n const protrusion_beam_dx = Math.cos(slash_angle) * protrusions.beam * scaleX;\n const protrusion_beam_dy = Math.sin(slash_angle) * protrusions.beam;\n const stemX = this.getStemX();\n const stem0X = beam.notes[0].getStemX();\n const stemY = beam.getBeamYToDraw() + (stemX - stem0X) * beam_slope;\n const ret = {\n x1: stemX - protrusion_stem_dx,\n y1: stemY + slashStemOffset - protrusion_stem_dy,\n x2: stemX + iPointOnBeam.dx * scaleX + protrusion_beam_dx,\n y2: stemY + iPointOnBeam.dy + protrusion_beam_dy,\n };\n return ret;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Mark Meeus 2019\nimport { KeySignature } from './keysignature';\nimport { Note } from './note';\nimport { Category } from './typeguard';\nexport class KeySigNote extends Note {\n constructor(keySpec, cancelKeySpec, alterKeySpec) {\n super({ duration: 'b' });\n this.keySignature = new KeySignature(keySpec, cancelKeySpec, alterKeySpec);\n // Note properties\n this.ignore_ticks = true;\n }\n static get CATEGORY() {\n return Category.KeySigNote;\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n preFormat() {\n this.preFormatted = true;\n this.keySignature.setStave(this.checkStave());\n this.setWidth(this.keySignature.getWidth());\n return this;\n }\n draw() {\n const ctx = this.checkStave().checkContext();\n this.setRendered();\n this.keySignature.setX(this.getAbsoluteX());\n this.keySignature.setContext(ctx);\n this.keySignature.draw();\n }\n}\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n//\n// This class implements multiple measure rests.\nimport { Element } from './element';\nimport { Glyph } from './glyph';\nimport { NoteHead } from './notehead';\nimport { StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { TimeSignature } from './timesignature';\nimport { Category, isBarline } from './typeguard';\nimport { defined } from './util';\nlet semibreve_rest;\nfunction get_semibreve_rest() {\n if (!semibreve_rest) {\n const noteHead = new NoteHead({ duration: 'w', note_type: 'r' });\n semibreve_rest = {\n glyph_font_scale: noteHead.render_options.glyph_font_scale,\n glyph_code: noteHead.glyph_code,\n width: noteHead.getWidth(),\n };\n }\n return semibreve_rest;\n}\nexport class MultiMeasureRest extends Element {\n /**\n *\n * @param number_of_measures Number of measures.\n * @param options The options object.\n */\n constructor(number_of_measures, options) {\n super();\n this.xs = { left: NaN, right: NaN };\n this.hasPaddingLeft = false;\n this.hasPaddingRight = false;\n this.hasLineThickness = false;\n this.hasSymbolSpacing = false;\n this.number_of_measures = number_of_measures;\n // Keep track of whether these four options were provided.\n this.hasPaddingLeft = typeof options.padding_left === 'number';\n this.hasPaddingRight = typeof options.padding_right === 'number';\n this.hasLineThickness = typeof options.line_thickness === 'number';\n this.hasSymbolSpacing = typeof options.symbol_spacing === 'number';\n const musicFont = Tables.currentMusicFont();\n this.render_options = Object.assign({ use_symbols: false, show_number: true, number_line: -0.5, number_glyph_point: musicFont.lookupMetric('digits.point'), line: 2, spacing_between_lines_px: Tables.STAVE_LINE_DISTANCE, serif_thickness: 2, semibreve_rest_glyph_scale: Tables.NOTATION_FONT_SCALE, padding_left: 0, padding_right: 0, line_thickness: 5, symbol_spacing: 0 }, options);\n const fontLineShift = musicFont.lookupMetric('digits.shiftLine', 0);\n this.render_options.number_line += fontLineShift;\n }\n static get CATEGORY() {\n return Category.MultiMeasureRest;\n }\n getXs() {\n return this.xs;\n }\n setStave(stave) {\n this.stave = stave;\n return this;\n }\n getStave() {\n return this.stave;\n }\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n drawLine(stave, ctx, left, right, spacingBetweenLines) {\n const options = this.render_options;\n const y = stave.getYForLine(options.line);\n const padding = (right - left) * 0.1;\n left += padding;\n right -= padding;\n let lineThicknessHalf;\n if (this.hasLineThickness) {\n lineThicknessHalf = options.line_thickness * 0.5;\n }\n else {\n lineThicknessHalf = spacingBetweenLines * 0.25;\n }\n const serifThickness = options.serif_thickness;\n const top = y - spacingBetweenLines;\n const bot = y + spacingBetweenLines;\n const leftIndented = left + serifThickness;\n const rightIndented = right - serifThickness;\n const lineTop = y - lineThicknessHalf;\n const lineBottom = y + lineThicknessHalf;\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(left, top);\n ctx.lineTo(leftIndented, top);\n ctx.lineTo(leftIndented, lineTop);\n ctx.lineTo(rightIndented, lineTop);\n ctx.lineTo(rightIndented, top);\n ctx.lineTo(right, top);\n ctx.lineTo(right, bot);\n ctx.lineTo(rightIndented, bot);\n ctx.lineTo(rightIndented, lineBottom);\n ctx.lineTo(leftIndented, lineBottom);\n ctx.lineTo(leftIndented, bot);\n ctx.lineTo(left, bot);\n ctx.closePath();\n ctx.fill();\n }\n drawSymbols(stave, ctx, left, right, spacingBetweenLines) {\n const n4 = Math.floor(this.number_of_measures / 4);\n const n = this.number_of_measures % 4;\n const n2 = Math.floor(n / 2);\n const n1 = n % 2;\n const options = this.render_options;\n // FIXME: TODO: invalidate semibreve_rest at the appropriate time\n // (e.g., if the system font settings are changed).\n semibreve_rest = undefined;\n const rest = get_semibreve_rest();\n const rest_scale = options.semibreve_rest_glyph_scale;\n const rest_width = rest.width * (rest_scale / rest.glyph_font_scale);\n const glyphs = {\n 2: {\n width: rest_width * 0.5,\n height: spacingBetweenLines,\n },\n 1: {\n width: rest_width,\n },\n };\n /* 10: normal spacingBetweenLines */\n const spacing = this.hasSymbolSpacing ? options.symbol_spacing : 10;\n const width = n4 * glyphs[2].width + n2 * glyphs[2].width + n1 * glyphs[1].width + (n4 + n2 + n1 - 1) * spacing;\n let x = left + (right - left) * 0.5 - width * 0.5;\n const line = options.line;\n const yTop = stave.getYForLine(line - 1);\n const yMiddle = stave.getYForLine(line);\n const yBottom = stave.getYForLine(line + 1);\n ctx.save();\n ctx.setStrokeStyle('none');\n ctx.setLineWidth(0);\n for (let i = 0; i < n4; ++i) {\n ctx.fillRect(x, yMiddle - glyphs[2].height, glyphs[2].width, glyphs[2].height);\n ctx.fillRect(x, yBottom - glyphs[2].height, glyphs[2].width, glyphs[2].height);\n x += glyphs[2].width + spacing;\n }\n for (let i = 0; i < n2; ++i) {\n ctx.fillRect(x, yMiddle - glyphs[2].height, glyphs[2].width, glyphs[2].height);\n x += glyphs[2].width + spacing;\n }\n for (let i = 0; i < n1; ++i) {\n Glyph.renderGlyph(ctx, x, yTop, rest_scale, rest.glyph_code);\n x += glyphs[1].width + spacing;\n }\n ctx.restore();\n }\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n const stave = this.checkStave();\n let left = stave.getNoteStartX();\n let right = stave.getNoteEndX();\n // FIXME: getNoteStartX() returns x + 5(barline width)\n // getNoteEndX() returns x + width(no barline width)\n // See Stave constructor. How do we fix this?\n // Here, we subtract the barline width.\n const begModifiers = stave.getModifiers(StaveModifierPosition.BEGIN);\n if (begModifiers.length === 1 && isBarline(begModifiers[0])) {\n left -= begModifiers[0].getWidth();\n }\n const options = this.render_options;\n if (this.hasPaddingLeft) {\n left = stave.getX() + options.padding_left;\n }\n if (this.hasPaddingRight) {\n right = stave.getX() + stave.getWidth() - options.padding_right;\n }\n this.xs.left = left;\n this.xs.right = right;\n const spacingBetweenLines = options.spacing_between_lines_px;\n if (options.use_symbols) {\n this.drawSymbols(stave, ctx, left, right, spacingBetweenLines);\n }\n else {\n this.drawLine(stave, ctx, left, right, spacingBetweenLines);\n }\n if (options.show_number) {\n const timeSpec = '/' + this.number_of_measures;\n const timeSig = new TimeSignature(timeSpec, 0, false);\n timeSig.point = options.number_glyph_point;\n timeSig.setTimeSig(timeSpec);\n timeSig.setStave(stave);\n timeSig.setX(left + (right - left) * 0.5 - timeSig.getInfo().glyph.getMetrics().width * 0.5);\n timeSig.bottomLine = options.number_line;\n timeSig.setContext(ctx).draw();\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (PedalMarking.DEBUG)\n log('Vex.Flow.PedalMarking', args);\n}\n/**\n * Draws a pedal glyph with the provided `name` on a rendering `context`\n * at the coordinates `x` and `y. Takes into account the glyph data\n * coordinate shifts.\n */\nfunction drawPedalGlyph(name, context, x, y, point) {\n const glyph_data = PedalMarking.GLYPHS[name];\n const glyph = new Glyph(glyph_data.code, point, { category: 'pedalMarking' });\n glyph.render(context, x + glyph_data.x_shift, y + glyph_data.y_shift);\n}\n/**\n * PedalMarking implements different types of pedal markings. These notation\n * elements indicate to the performer when to depress and release the a pedal.\n *\n * In order to create \"Sostenuto\", and \"una corda\" markings, you must set\n * custom text for the release/depress pedal markings.\n */\nexport class PedalMarking extends Element {\n constructor(notes) {\n super();\n this.notes = notes;\n this.type = PedalMarking.type.TEXT;\n this.line = 0;\n // Custom text for the release/depress markings\n this.custom_depress_text = '';\n this.custom_release_text = '';\n this.resetFont();\n this.render_options = {\n bracket_height: 10,\n text_margin_right: 6,\n bracket_line_width: 1,\n color: 'black',\n };\n }\n static get CATEGORY() {\n return Category.PedalMarking;\n }\n /**\n * Create a sustain pedal marking. Returns the defaults PedalMarking.\n * Which uses the traditional \"Ped\" and \"*\"\" markings.\n */\n static createSustain(notes) {\n const pedal = new PedalMarking(notes);\n return pedal;\n }\n /** Create a sostenuto pedal marking */\n static createSostenuto(notes) {\n const pedal = new PedalMarking(notes);\n pedal.setType(PedalMarking.type.MIXED);\n pedal.setCustomText('Sost. Ped.');\n return pedal;\n }\n /** Create an una corda pedal marking */\n static createUnaCorda(notes) {\n const pedal = new PedalMarking(notes);\n pedal.setType(PedalMarking.type.TEXT);\n pedal.setCustomText('una corda', 'tre corda');\n return pedal;\n }\n /** Set pedal type. */\n setType(type) {\n type = typeof type === 'string' ? PedalMarking.typeString[type] : type;\n if (type >= PedalMarking.type.TEXT && type <= PedalMarking.type.MIXED) {\n this.type = type;\n }\n return this;\n }\n /**\n * Set custom text for the `depress`/`release` pedal markings. No text is\n * set if the parameter is falsy.\n */\n setCustomText(depress, release) {\n this.custom_depress_text = depress || '';\n this.custom_release_text = release || '';\n return this;\n }\n /** Set the staff line to render the markings on. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Draw the bracket based pedal markings. */\n drawBracketed() {\n const ctx = this.checkContext();\n let is_pedal_depressed = false;\n let prev_x;\n let prev_y;\n // Iterate through each note\n this.notes.forEach((note, index, notes) => {\n // Each note triggers the opposite pedal action\n is_pedal_depressed = !is_pedal_depressed;\n // Get the initial coordinates for the note\n const x = note.getAbsoluteX();\n const y = note.checkStave().getYForBottomText(this.line + 3);\n // Throw if current note is positioned before the previous note\n if (x < prev_x) {\n throw new RuntimeError('InvalidConfiguration', 'The notes provided must be in order of ascending x positions');\n }\n // Determine if the previous or next note are the same\n // as the current note. We need to keep track of this for\n // when adjustments are made for the release+depress action\n const next_is_same = notes[index + 1] === note;\n const prev_is_same = notes[index - 1] === note;\n let x_shift = 0;\n const point = Tables.currentMusicFont().lookupMetric(`pedalMarking.${is_pedal_depressed ? 'down' : 'up'}.point`);\n if (is_pedal_depressed) {\n // Adjustment for release+depress\n x_shift = prev_is_same ? 5 : 0;\n if (this.type === PedalMarking.type.MIXED && !prev_is_same) {\n // For MIXED style, start with text instead of bracket\n if (this.custom_depress_text) {\n // If we have custom text, use instead of the default \"Ped\" glyph\n const text_width = ctx.measureText(this.custom_depress_text).width;\n ctx.fillText(this.custom_depress_text, x - text_width / 2, y);\n x_shift = text_width / 2 + this.render_options.text_margin_right;\n }\n else {\n // Render the Ped glyph in position\n drawPedalGlyph('pedal_depress', ctx, x, y, point);\n x_shift = 20 + this.render_options.text_margin_right;\n }\n }\n else {\n // Draw start bracket\n ctx.beginPath();\n ctx.moveTo(x, y - this.render_options.bracket_height);\n ctx.lineTo(x + x_shift, y);\n ctx.stroke();\n ctx.closePath();\n }\n }\n else {\n // Adjustment for release+depress\n x_shift = next_is_same ? -5 : 0;\n // Draw end bracket\n ctx.beginPath();\n ctx.moveTo(prev_x, prev_y);\n ctx.lineTo(x + x_shift, y);\n ctx.lineTo(x, y - this.render_options.bracket_height);\n ctx.stroke();\n ctx.closePath();\n }\n // Store previous coordinates\n prev_x = x + x_shift;\n prev_y = y;\n });\n }\n /**\n * Draw the text based pedal markings. This defaults to the traditional\n * \"Ped\" and \"*\"\" symbols if no custom text has been provided.\n */\n drawText() {\n const ctx = this.checkContext();\n let is_pedal_depressed = false;\n // Iterate through each note, placing glyphs or custom text accordingly\n this.notes.forEach((note) => {\n is_pedal_depressed = !is_pedal_depressed;\n const stave = note.checkStave();\n const x = note.getAbsoluteX();\n const y = stave.getYForBottomText(this.line + 3);\n const point = Tables.currentMusicFont().lookupMetric(`pedalMarking.${is_pedal_depressed ? 'down' : 'up'}.point`);\n let text_width = 0;\n if (is_pedal_depressed) {\n if (this.custom_depress_text) {\n text_width = ctx.measureText(this.custom_depress_text).width;\n ctx.fillText(this.custom_depress_text, x - text_width / 2, y);\n }\n else {\n drawPedalGlyph('pedal_depress', ctx, x, y, point);\n }\n }\n else {\n if (this.custom_release_text) {\n text_width = ctx.measureText(this.custom_release_text).width;\n ctx.fillText(this.custom_release_text, x - text_width / 2, y);\n }\n else {\n drawPedalGlyph('pedal_release', ctx, x, y, point);\n }\n }\n });\n }\n /** Render the pedal marking in position on the rendering context. */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n ctx.save();\n ctx.setStrokeStyle(this.render_options.color);\n ctx.setFillStyle(this.render_options.color);\n ctx.setFont(this.textFont);\n L('Rendering Pedal Marking');\n if (this.type === PedalMarking.type.BRACKET || this.type === PedalMarking.type.MIXED) {\n ctx.setLineWidth(this.render_options.bracket_line_width);\n this.drawBracketed();\n }\n else if (this.type === PedalMarking.type.TEXT) {\n this.drawText();\n }\n ctx.restore();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.PedalMarking.DEBUG` to `true`. */\nPedalMarking.DEBUG = false;\nPedalMarking.TEXT_FONT = {\n family: Font.SERIF,\n size: 12,\n weight: FontWeight.BOLD,\n style: FontStyle.ITALIC,\n};\n/** Glyph data */\nPedalMarking.GLYPHS = {\n pedal_depress: {\n code: 'keyboardPedalPed',\n x_shift: -10,\n y_shift: 0,\n },\n pedal_release: {\n code: 'keyboardPedalUp',\n x_shift: -2,\n y_shift: 3,\n },\n};\n/** Pedal type as number. */\nPedalMarking.type = {\n TEXT: 1,\n BRACKET: 2,\n MIXED: 3,\n};\n/** Pedal type as string. */\nPedalMarking.typeString = {\n text: PedalMarking.type.TEXT,\n bracket: PedalMarking.type.BRACKET,\n mixed: PedalMarking.type.MIXED,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { Glyph } from './glyph';\nimport { GlyphNote } from './glyphnote';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\n// Map `type` to SMuFL glyph code.\nconst CODES = {\n '1': 'repeat1Bar',\n '2': 'repeat2Bars',\n '4': 'repeat4Bars',\n slash: 'repeatBarSlash',\n};\nexport class RepeatNote extends GlyphNote {\n static get CATEGORY() {\n return Category.RepeatNote;\n }\n constructor(type, noteStruct, options) {\n super(undefined, Object.assign({ duration: 'q', align_center: type !== 'slash' }, noteStruct), options);\n const glyphCode = CODES[type] || 'repeat1Bar';\n const glyph = new Glyph(glyphCode, Tables.currentMusicFont().lookupMetric('repeatNote.point', 40), {\n category: 'repeatNote',\n });\n this.setGlyph(glyph);\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements `StaveLine` which are simply lines that connect\n// two notes. This object is highly configurable, see the `render_options`.\n// A simple line is often used for notating glissando articulations, but you\n// can format a `StaveLine` with arrows or colors for more pedagogical\n// purposes, such as diagrams.\nimport { Element } from './element';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\n// Attribution: Arrow rendering implementations based off of\n// Patrick Horgan's article, \"Drawing lines and arcs with\n// arrow heads on HTML5 Canvas\"\n//\n// Draw an arrow head that connects between 3 coordinates.\nfunction drawArrowHead(ctx, x0, y0, x1, y1, x2, y2) {\n // all cases do this.\n ctx.beginPath();\n ctx.moveTo(x0, y0);\n ctx.lineTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.lineTo(x0, y0);\n ctx.closePath();\n ctx.fill();\n}\nexport class StaveLine extends Element {\n // Initialize the StaveLine with the given `notes`.\n //\n // `notes` is a struct that has:\n //\n // ```\n // {\n // first_note: Note,\n // last_note: Note,\n // first_indices: [n1, n2, n3],\n // last_indices: [n1, n2, n3]\n // }\n // ```\n constructor(notes) {\n super();\n this.setNotes(notes);\n this.text = '';\n this.resetFont();\n this.render_options = {\n // Space to add to the left or the right\n padding_left: 4,\n padding_right: 3,\n // The width of the line in pixels\n line_width: 1,\n // An array of line/space lengths. (TODO/QUESTION: Is this supported in SVG?).\n line_dash: undefined,\n // Can draw rounded line end, instead of a square. (TODO/QUESTION: Is this supported in SVG?).\n rounded_end: true,\n // The color of the line and arrowheads\n color: undefined,\n // Flags to draw arrows on each end of the line\n draw_start_arrow: false,\n draw_end_arrow: false,\n // The length of the arrowhead sides\n arrowhead_length: 10,\n // The angle of the arrowhead\n arrowhead_angle: Math.PI / 8,\n // The position of the text\n text_position_vertical: StaveLine.TextVerticalPosition.TOP,\n text_justification: StaveLine.TextJustification.CENTER,\n };\n }\n static get CATEGORY() {\n return Category.StaveLine;\n }\n // The the annotation for the `StaveLine`\n setText(text) {\n this.text = text;\n return this;\n }\n // Set the notes for the `StaveLine`\n setNotes(notes) {\n if (!notes.first_note && !notes.last_note) {\n throw new RuntimeError('BadArguments', 'Notes needs to have either first_note or last_note set.');\n }\n if (!notes.first_indices)\n notes.first_indices = [0];\n if (!notes.last_indices)\n notes.last_indices = [0];\n if (notes.first_indices.length !== notes.last_indices.length) {\n throw new RuntimeError('BadArguments', 'Connected notes must have same number of indices.');\n }\n this.notes = notes;\n this.first_note = notes.first_note;\n this.first_indices = notes.first_indices;\n this.last_note = notes.last_note;\n this.last_indices = notes.last_indices;\n return this;\n }\n // Apply the style of the `StaveLine` to the context\n applyLineStyle() {\n const ctx = this.checkContext();\n const render_options = this.render_options;\n if (render_options.line_dash) {\n ctx.setLineDash(render_options.line_dash);\n }\n if (render_options.line_width) {\n ctx.setLineWidth(render_options.line_width);\n }\n if (render_options.rounded_end) {\n ctx.setLineCap('round');\n }\n else {\n ctx.setLineCap('square');\n }\n }\n // Apply the text styling to the context\n applyFontStyle() {\n const ctx = this.checkContext();\n ctx.setFont(this.textFont);\n const render_options = this.render_options;\n const color = render_options.color;\n if (color) {\n ctx.setStrokeStyle(color);\n ctx.setFillStyle(color);\n }\n }\n // Helper function to draw a line with arrow heads\n drawArrowLine(ctx, pt1, pt2) {\n const both_arrows = this.render_options.draw_start_arrow && this.render_options.draw_end_arrow;\n const x1 = pt1.x;\n const y1 = pt1.y;\n const x2 = pt2.x;\n const y2 = pt2.y;\n // For ends with arrow we actually want to stop before we get to the arrow\n // so that wide lines won't put a flat end on the arrow.\n const distance = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));\n const ratio = (distance - this.render_options.arrowhead_length / 3) / distance;\n let end_x;\n let end_y;\n let start_x;\n let start_y;\n if (this.render_options.draw_end_arrow || both_arrows) {\n end_x = Math.round(x1 + (x2 - x1) * ratio);\n end_y = Math.round(y1 + (y2 - y1) * ratio);\n }\n else {\n end_x = x2;\n end_y = y2;\n }\n if (this.render_options.draw_start_arrow || both_arrows) {\n start_x = x1 + (x2 - x1) * (1 - ratio);\n start_y = y1 + (y2 - y1) * (1 - ratio);\n }\n else {\n start_x = x1;\n start_y = y1;\n }\n if (this.render_options.color) {\n ctx.setStrokeStyle(this.render_options.color);\n ctx.setFillStyle(this.render_options.color);\n }\n // Draw the shaft of the arrow\n ctx.beginPath();\n ctx.moveTo(start_x, start_y);\n ctx.lineTo(end_x, end_y);\n ctx.stroke();\n ctx.closePath();\n // calculate the angle of the line\n const line_angle = Math.atan2(y2 - y1, x2 - x1);\n // h is the line length of a side of the arrow head\n const h = Math.abs(this.render_options.arrowhead_length / Math.cos(this.render_options.arrowhead_angle));\n let angle1;\n let angle2;\n let top_x;\n let top_y;\n let bottom_x;\n let bottom_y;\n if (this.render_options.draw_end_arrow || both_arrows) {\n angle1 = line_angle + Math.PI + this.render_options.arrowhead_angle;\n top_x = x2 + Math.cos(angle1) * h;\n top_y = y2 + Math.sin(angle1) * h;\n angle2 = line_angle + Math.PI - this.render_options.arrowhead_angle;\n bottom_x = x2 + Math.cos(angle2) * h;\n bottom_y = y2 + Math.sin(angle2) * h;\n drawArrowHead(ctx, top_x, top_y, x2, y2, bottom_x, bottom_y);\n }\n if (this.render_options.draw_start_arrow || both_arrows) {\n angle1 = line_angle + this.render_options.arrowhead_angle;\n top_x = x1 + Math.cos(angle1) * h;\n top_y = y1 + Math.sin(angle1) * h;\n angle2 = line_angle - this.render_options.arrowhead_angle;\n bottom_x = x1 + Math.cos(angle2) * h;\n bottom_y = y1 + Math.sin(angle2) * h;\n drawArrowHead(ctx, top_x, top_y, x1, y1, bottom_x, bottom_y);\n }\n }\n // Renders the `StaveLine` on the context\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n const first_note = this.first_note;\n const last_note = this.last_note;\n const render_options = this.render_options;\n ctx.save();\n this.applyLineStyle();\n // Cycle through each set of indices and draw lines\n let start_position = { x: 0, y: 0 };\n let end_position = { x: 0, y: 0 };\n this.first_indices.forEach((first_index, i) => {\n const last_index = this.last_indices[i];\n // Get initial coordinates for the start/end of the line\n start_position = first_note.getModifierStartXY(2, first_index);\n end_position = last_note.getModifierStartXY(1, last_index);\n const upwards_slope = start_position.y > end_position.y;\n // Adjust `x` coordinates for modifiers\n start_position.x += first_note.getMetrics().modRightPx + render_options.padding_left;\n end_position.x -= last_note.getMetrics().modLeftPx + render_options.padding_right;\n // Adjust first `x` coordinates for displacements\n const notehead_width = first_note.getGlyph().getWidth();\n const first_displaced = first_note.getKeyProps()[first_index].displaced;\n if (first_displaced && first_note.getStemDirection() === 1) {\n start_position.x += notehead_width + render_options.padding_left;\n }\n // Adjust last `x` coordinates for displacements\n const last_displaced = last_note.getKeyProps()[last_index].displaced;\n if (last_displaced && last_note.getStemDirection() === -1) {\n end_position.x -= notehead_width + render_options.padding_right;\n }\n // Adjust y position better if it's not coming from the center of the note\n start_position.y += upwards_slope ? -3 : 1;\n end_position.y += upwards_slope ? 2 : 0;\n this.drawArrowLine(ctx, start_position, end_position);\n });\n ctx.restore();\n // Determine the x coordinate where to start the text\n const text_width = ctx.measureText(this.text).width;\n const justification = render_options.text_justification;\n let x = 0;\n if (justification === StaveLine.TextJustification.LEFT) {\n x = start_position.x;\n }\n else if (justification === StaveLine.TextJustification.CENTER) {\n const delta_x = end_position.x - start_position.x;\n const center_x = delta_x / 2 + start_position.x;\n x = center_x - text_width / 2;\n }\n else if (justification === StaveLine.TextJustification.RIGHT) {\n x = end_position.x - text_width;\n }\n // Determine the y value to start the text\n let y = 0;\n const vertical_position = render_options.text_position_vertical;\n if (vertical_position === StaveLine.TextVerticalPosition.TOP) {\n y = first_note.checkStave().getYForTopText();\n }\n else if (vertical_position === StaveLine.TextVerticalPosition.BOTTOM) {\n y = first_note.checkStave().getYForBottomText(Tables.TEXT_HEIGHT_OFFSET_HACK);\n }\n // Draw the text\n ctx.save();\n this.applyFontStyle();\n ctx.fillText(this.text, x, y);\n ctx.restore();\n return this;\n }\n}\n/** Default text font. */\nStaveLine.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n// Text Positioning\nStaveLine.TextVerticalPosition = {\n TOP: 1,\n BOTTOM: 2,\n};\nStaveLine.TextJustification = {\n LEFT: 1,\n CENTER: 2,\n RIGHT: 3,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { BoundingBox } from './boundingbox';\nimport { Element } from './element';\nimport { Formatter } from './formatter';\nimport { Note } from './note';\nimport { Stave } from './stave';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\n/**\n * System implements a musical system, which is a collection of staves,\n * each which can have one or more voices. All voices across all staves in\n * the system are formatted together.\n */\nexport class System extends Element {\n constructor(params = {}) {\n super();\n this.setOptions(params);\n this.parts = [];\n }\n static get CATEGORY() {\n return Category.System;\n }\n /** Set formatting options. */\n setOptions(options = {}) {\n if (!options.factory) {\n throw new RuntimeError('NoFactory', 'System.setOptions(options) requires a factory.');\n }\n this.factory = options.factory;\n this.options = Object.assign(Object.assign({ factory: this.factory, x: 10, y: 10, width: 500, spaceBetweenStaves: 12, autoWidth: false, noJustification: false, debugFormatter: false, formatIterations: 0, noPadding: false }, options), { details: Object.assign({ alpha: 0.5 }, options.details), formatOptions: Object.assign({}, options.formatOptions) });\n if (this.options.noJustification === false && typeof options.width === 'undefined') {\n this.options.autoWidth = true;\n }\n }\n /** Set associated context. */\n setContext(context) {\n super.setContext(context);\n this.factory.setContext(context);\n return this;\n }\n /**\n * Add connector between staves.\n * @param type see {@link StaveConnector.typeString}\n */\n addConnector(type = 'double') {\n this.connector = this.factory.StaveConnector({\n top_stave: this.parts[0].stave,\n bottom_stave: this.parts[this.parts.length - 1].stave,\n type,\n });\n return this.connector;\n }\n /**\n * Add a stave to the system.\n *\n * Example (one voice):\n *\n * `system.addStave({voices: [score.voice(score.notes('C#5/q, B4, A4, G#4'))]});`\n *\n * Example (two voices):\n *\n * `system.addStave({voices: [`\n * `score.voice(score.notes('C#5/q, B4, A4, G#4', {stem: 'up'})),`\n * `score.voice(score.notes('C#4/h, C#4', {stem: 'down'}))`\n * `]});`\n */\n addStave(params) {\n var _a;\n const staveOptions = Object.assign({ left_bar: false }, params.options);\n const stave = (_a = params.stave) !== null && _a !== void 0 ? _a : this.factory.Stave({ x: this.options.x, y: this.options.y, width: this.options.width, options: staveOptions });\n const p = Object.assign(Object.assign({ stave, \n /* voices: [], */\n spaceAbove: 0, spaceBelow: 0, debugNoteMetrics: false, noJustification: false }, params), { options: staveOptions });\n const ctx = this.getContext();\n p.voices.forEach((voice) => voice\n .setContext(ctx)\n .setStave(stave)\n .getTickables()\n .forEach((tickable) => tickable.setStave(stave)));\n this.parts.push(p);\n return stave;\n }\n /** Format the system. */\n format() {\n const options_details = this.options.details;\n let justifyWidth = 0;\n const formatter = new Formatter(options_details);\n this.formatter = formatter;\n let y = this.options.y;\n let startX = 0;\n let allVoices = [];\n const debugNoteMetricsYs = [];\n // Join the voices for each stave.\n this.parts.forEach((part) => {\n y = y + part.stave.space(part.spaceAbove);\n part.stave.setY(y);\n if (this.options.autoWidth) {\n part.voices.forEach((voice) => {\n formatter.joinVoices([voice]);\n });\n }\n else {\n formatter.joinVoices(part.voices);\n }\n y = y + part.stave.space(part.spaceBelow);\n y = y + part.stave.space(this.options.spaceBetweenStaves);\n if (part.debugNoteMetrics) {\n debugNoteMetricsYs.push({ y, voice: part.voices[0] });\n y += 15;\n }\n allVoices = allVoices.concat(part.voices);\n startX = Math.max(startX, part.stave.getNoteStartX());\n });\n // Update the start position of all staves.\n this.parts.forEach((part) => part.stave.setNoteStartX(startX));\n if (this.options.autoWidth) {\n justifyWidth = formatter.preCalculateMinTotalWidth(allVoices);\n this.parts.forEach((part) => {\n part.stave.setWidth(justifyWidth + Stave.rightPadding + (startX - this.options.x));\n });\n }\n else {\n justifyWidth = this.options.noPadding\n ? this.options.width - this.options.x\n : this.options.width - (startX - this.options.x) - Stave.defaultPadding;\n }\n formatter.format(allVoices, this.options.noJustification ? 0 : justifyWidth, this.options.formatOptions);\n for (let i = 0; i < this.options.formatIterations; i++) {\n formatter.tune(options_details);\n }\n this.startX = startX;\n this.debugNoteMetricsYs = debugNoteMetricsYs;\n this.lastY = y;\n this.boundingBox = new BoundingBox(this.options.x, this.options.y, this.options.width, this.lastY - this.options.y);\n }\n /** Render the system. */\n draw() {\n // Render debugging information, if requested.\n const ctx = this.checkContext();\n if (!this.formatter || !this.startX || !this.lastY || !this.debugNoteMetricsYs) {\n throw new RuntimeError('NoFormatter', 'format() must be called before draw()');\n }\n this.setRendered();\n if (this.options.debugFormatter) {\n Formatter.plotDebugging(ctx, this.formatter, this.startX, this.options.y, this.lastY);\n }\n this.debugNoteMetricsYs.forEach((d) => {\n d.voice.getTickables().forEach((tickable) => Note.plotMetrics(ctx, tickable, d.y));\n });\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// The file implements notes for Tablature notation. This consists of one or\n// more fret positions, and can either be drawn with or without stems.\n//\n// See `tests/tabnote_tests.ts` for usage examples.\nimport { Font } from './font';\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { StemmableNote } from './stemmablenote';\nimport { Tables } from './tables';\nimport { Category, isDot } from './typeguard';\nimport { defined, RuntimeError } from './util';\n// Gets the unused strings grouped together if consecutive.\n//\n// Parameters:\n// * num_lines - The number of lines\n// * strings_used - An array of numbers representing which strings have fret positions\nfunction getUnusedStringGroups(num_lines, strings_used) {\n const stem_through = [];\n let group = [];\n for (let string = 1; string <= num_lines; string++) {\n const is_used = strings_used.indexOf(string) > -1;\n if (!is_used) {\n group.push(string);\n }\n else {\n stem_through.push(group);\n group = [];\n }\n }\n if (group.length > 0)\n stem_through.push(group);\n return stem_through;\n}\n// Gets groups of points that outline the partial stem lines\n// between fret positions\n//\n// Parameters:\n// * stem_Y - The `y` coordinate the stem is located on\n// * unused_strings - An array of groups of unused strings\n// * stave - The stave to use for reference\n// * stem_direction - The direction of the stem\nfunction getPartialStemLines(stem_y, unused_strings, stave, stem_direction) {\n const up_stem = stem_direction !== 1;\n const down_stem = stem_direction !== -1;\n const line_spacing = stave.getSpacingBetweenLines();\n const total_lines = stave.getNumLines();\n const stem_lines = [];\n unused_strings.forEach((strings) => {\n const containsLastString = strings.indexOf(total_lines) > -1;\n const containsFirstString = strings.indexOf(1) > -1;\n if ((up_stem && containsFirstString) || (down_stem && containsLastString)) {\n return;\n }\n // If there's only one string in the group, push a duplicate value.\n // We do this because we need 2 strings to convert into upper/lower y\n // values.\n if (strings.length === 1) {\n strings.push(strings[0]);\n }\n const line_ys = [];\n // Iterate through each group string and store it's y position\n strings.forEach((string, index, strings) => {\n const isTopBound = string === 1;\n const isBottomBound = string === total_lines;\n // Get the y value for the appropriate staff line,\n // we adjust for a 0 index array, since string numbers are index 1\n let y = stave.getYForLine(string - 1);\n // Unless the string is the first or last, add padding to each side\n // of the line\n if (index === 0 && !isTopBound) {\n y -= line_spacing / 2 - 1;\n }\n else if (index === strings.length - 1 && !isBottomBound) {\n y += line_spacing / 2 - 1;\n }\n // Store the y value\n line_ys.push(y);\n // Store a subsequent y value connecting this group to the main\n // stem above/below the stave if it's the top/bottom string\n if (stem_direction === 1 && isTopBound) {\n line_ys.push(stem_y - 2);\n }\n else if (stem_direction === -1 && isBottomBound) {\n line_ys.push(stem_y + 2);\n }\n });\n // Add the sorted y values to the\n stem_lines.push(line_ys.sort((a, b) => a - b));\n });\n return stem_lines;\n}\nexport class TabNote extends StemmableNote {\n // Initialize the TabNote with a `noteStruct` full of properties\n // and whether to `draw_stem` when rendering the note\n constructor(noteStruct, draw_stem = false) {\n super(noteStruct);\n this.glyphs = [];\n // Return the number of the greatest string, which is the string lowest on the display\n this.greatestString = () => {\n return this.positions.map((x) => x.str).reduce((a, b) => (a > b ? a : b));\n };\n // Return the number of the least string, which is the string highest on the display\n this.leastString = () => {\n return this.positions.map((x) => x.str).reduce((a, b) => (a < b ? a : b));\n };\n this.ghost = false; // Renders parenthesis around notes\n // Note properties\n // The fret positions in the note. An array of `{ str: X, fret: X }`\n this.positions = noteStruct.positions || [];\n // Render Options\n this.render_options = Object.assign(Object.assign({}, this.render_options), { \n // font size for note heads and rests\n glyph_font_scale: Tables.TABLATURE_FONT_SCALE, \n // Flag to draw a stem\n draw_stem, \n // Flag to draw dot modifiers\n draw_dots: draw_stem, \n // Flag to extend the main stem through the stave and fret positions\n draw_stem_through_stave: false, \n // vertical shift from stave line\n y_shift: 0, \n // normal glyph scale\n scale: 1.0, \n // default tablature font\n font: `${Font.SIZE}pt ${Font.SANS_SERIF}` });\n this.glyph = Tables.getGlyphProps(this.duration, this.noteType);\n defined(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`);\n this.buildStem();\n if (noteStruct.stem_direction) {\n this.setStemDirection(noteStruct.stem_direction);\n }\n else {\n this.setStemDirection(Stem.UP);\n }\n // Renders parenthesis around notes\n this.ghost = false;\n this.updateWidth();\n }\n static get CATEGORY() {\n return Category.TabNote;\n }\n reset() {\n super.reset();\n if (this.stave)\n this.setStave(this.stave);\n return this;\n }\n // Set as ghost `TabNote`, surrounds the fret positions with parenthesis.\n // Often used for indicating frets that are being bent to\n setGhost(ghost) {\n this.ghost = ghost;\n this.updateWidth();\n return this;\n }\n // Determine if the note has a stem\n hasStem() {\n if (this.render_options.draw_stem)\n return true;\n return false;\n }\n // Get the default stem extension for the note\n getStemExtension() {\n if (this.stem_extension_override != null) {\n return this.stem_extension_override;\n }\n if (this.flag) {\n return this.getStemDirection() === 1 ? -this.flag.checkMetrics().y_shift : this.flag.checkMetrics().y_shift;\n }\n return 0;\n }\n // Calculate and store the width of the note\n updateWidth() {\n this.glyphs = [];\n this.width = 0;\n for (let i = 0; i < this.positions.length; ++i) {\n let fret = this.positions[i].fret;\n if (this.ghost)\n fret = '(' + fret + ')';\n const glyph = Tables.tabToGlyph(fret.toString(), this.render_options.scale);\n this.glyphs.push(glyph);\n this.width = Math.max(glyph.getWidth(), this.width);\n }\n // For some reason we associate a notehead glyph with a TabNote, and this\n // glyph is used for certain width calculations. Of course, this is totally\n // incorrect since a notehead is a poor approximation for the dimensions of\n // a fret number which can have multiple digits. As a result, we must\n // overwrite getWidth() to return the correct width\n this.glyph.getWidth = () => this.width;\n }\n // Set the `stave` to the note\n setStave(stave) {\n super.setStave(stave);\n const ctx = stave.getContext();\n this.setContext(ctx);\n // Calculate the fret number width based on font used\n if (ctx) {\n this.width = 0;\n for (let i = 0; i < this.glyphs.length; ++i) {\n const glyph = this.glyphs[i];\n const text = '' + glyph.text;\n if (text.toUpperCase() !== 'X') {\n ctx.save();\n ctx.setFont(this.render_options.font);\n glyph.width = ctx.measureText(text).width;\n ctx.restore();\n glyph.getWidth = () => glyph.width;\n }\n this.width = Math.max(glyph.getWidth(), this.width);\n }\n this.glyph.getWidth = () => this.width;\n }\n // we subtract 1 from `line` because getYForLine expects a 0-based index,\n // while the position.str is a 1-based index\n const ys = this.positions.map(({ str: line }) => stave.getYForLine(Number(line) - 1));\n this.setYs(ys);\n if (this.stem) {\n this.stem.setYBounds(this.getStemY(), this.getStemY());\n }\n return this;\n }\n // Get the fret positions for the note\n getPositions() {\n return this.positions;\n }\n // Get the default `x` and `y` coordinates for a modifier at a specific\n // `position` at a fret position `index`\n getModifierStartXY(position, index) {\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call GetModifierStartXY on an unformatted note\");\n }\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', 'No Y-Values calculated for this note.');\n }\n let x = 0;\n if (position === Modifier.Position.LEFT) {\n x = -1 * 2; // FIXME: modifier padding, move to font file\n }\n else if (position === Modifier.Position.RIGHT) {\n x = this.width + 2; // FIXME: modifier padding, move to font file\n }\n else if (position === Modifier.Position.BELOW || position === Modifier.Position.ABOVE) {\n const note_glyph_width = this.glyph.getWidth();\n x = note_glyph_width / 2;\n }\n return {\n x: this.getAbsoluteX() + x,\n y: this.ys[index],\n };\n }\n // Get the default line for rest\n getLineForRest() {\n return Number(this.positions[0].str);\n }\n // Pre-render formatting\n preFormat() {\n if (this.preFormatted)\n return;\n if (this.modifierContext)\n this.modifierContext.preFormat();\n // width is already set during init()\n this.preFormatted = true;\n }\n // Get the x position for the stem\n getStemX() {\n return this.getCenterGlyphX();\n }\n // Get the y position for the stem\n getStemY() {\n const num_lines = this.checkStave().getNumLines();\n // The decimal staff line amounts provide optimal spacing between the\n // fret number and the stem\n const stemUpLine = -0.5;\n const stemDownLine = num_lines - 0.5;\n const stemStartLine = Stem.UP === this.stem_direction ? stemUpLine : stemDownLine;\n return this.checkStave().getYForLine(stemStartLine);\n }\n // Get the stem extents for the tabnote\n getStemExtents() {\n return this.checkStem().getExtents();\n }\n // Draw the fal onto the context\n drawFlag() {\n const { beam, glyph, stem_direction, render_options: { draw_stem, glyph_font_scale }, } = this;\n const context = this.checkContext();\n const shouldDrawFlag = beam == undefined && draw_stem;\n // Now it's the flag's turn.\n if (glyph.flag && shouldDrawFlag) {\n const flag_x = this.getStemX() + 1;\n const flag_y = this.getStemY() - this.checkStem().getHeight();\n const flag_code = stem_direction === Stem.DOWN\n ? glyph.code_flag_downstem // Down stems have flags on the left.\n : glyph.code_flag_upstem;\n // Draw the Flag\n Glyph.renderGlyph(context, flag_x, flag_y, glyph_font_scale, flag_code, { category: 'flag.tabStem' });\n }\n }\n // Render the modifiers onto the context.\n drawModifiers() {\n this.modifiers.forEach((modifier) => {\n // Only draw the dots if enabled.\n if (isDot(modifier) && !this.render_options.draw_dots) {\n return;\n }\n modifier.setContext(this.getContext());\n modifier.drawWithStyle();\n });\n }\n // Render the stem extension through the fret positions\n drawStemThrough() {\n const stemX = this.getStemX();\n const stemY = this.getStemY();\n const ctx = this.checkContext();\n const drawStem = this.render_options.draw_stem;\n const stemThrough = this.render_options.draw_stem_through_stave;\n if (drawStem && stemThrough) {\n const numLines = this.checkStave().getNumLines();\n const stringsUsed = this.positions.map((position) => Number(position.str));\n const unusedStrings = getUnusedStringGroups(numLines, stringsUsed);\n const stemLines = getPartialStemLines(stemY, unusedStrings, this.checkStave(), this.getStemDirection());\n ctx.save();\n ctx.setLineWidth(Stem.WIDTH);\n stemLines.forEach((bounds) => {\n if (bounds.length === 0)\n return;\n ctx.beginPath();\n ctx.moveTo(stemX, bounds[0]);\n ctx.lineTo(stemX, bounds[bounds.length - 1]);\n ctx.stroke();\n ctx.closePath();\n });\n ctx.restore();\n }\n }\n // Render the fret positions onto the context\n drawPositions() {\n const ctx = this.checkContext();\n const x = this.getAbsoluteX();\n const ys = this.ys;\n for (let i = 0; i < this.positions.length; ++i) {\n const y = ys[i] + this.render_options.y_shift;\n const glyph = this.glyphs[i];\n // Center the fret text beneath the notation note head\n const note_glyph_width = this.glyph.getWidth();\n const tab_x = x + note_glyph_width / 2 - glyph.getWidth() / 2;\n // FIXME: Magic numbers.\n ctx.clearRect(tab_x - 2, y - 3, glyph.getWidth() + 4, 6);\n if (glyph.code) {\n Glyph.renderGlyph(ctx, tab_x, y, this.render_options.glyph_font_scale * this.render_options.scale, glyph.code);\n }\n else {\n ctx.save();\n ctx.setFont(this.render_options.font);\n const text = glyph.text.toString();\n ctx.fillText(text, tab_x, y + 5 * this.render_options.scale);\n ctx.restore();\n }\n }\n }\n // The main rendering function for the entire note.\n draw() {\n const ctx = this.checkContext();\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', \"Can't draw note without Y values.\");\n }\n this.setRendered();\n const render_stem = this.beam == undefined && this.render_options.draw_stem;\n ctx.openGroup('tabnote', undefined, { pointerBBox: true });\n this.drawPositions();\n this.drawStemThrough();\n if (this.stem && render_stem) {\n const stem_x = this.getStemX();\n this.stem.setNoteHeadXBounds(stem_x, stem_x);\n ctx.openGroup('stem', undefined, { pointerBBox: true });\n this.stem.setContext(ctx).draw();\n ctx.closeGroup();\n }\n this.drawFlag();\n this.drawModifiers();\n ctx.closeGroup();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { Stave } from './stave';\nimport { Category } from './typeguard';\nexport class TabStave extends Stave {\n static get CATEGORY() {\n return Category.TabStave;\n }\n constructor(x, y, width, options) {\n const tab_options = Object.assign({ spacing_between_lines_px: 13, num_lines: 6, top_text_position: 1 }, options);\n super(x, y, width, tab_options);\n }\n getYForGlyphs() {\n return this.getYForLine(2.5);\n }\n // Deprecated\n addTabGlyph() {\n this.addClef('tab');\n return this;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Cyril Silverman\n//\n// This file implements `TextBrackets` which extend between two notes.\n// The octave transposition markings (8va, 8vb, 15va, 15vb) can be created\n// using this class.\nimport { Element } from './element';\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Renderer } from './renderer';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { log, RuntimeError } from './util';\n// To enable logging for this class. Set `Vex.Flow.TextBracket.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (TextBracket.DEBUG)\n log('Vex.Flow.TextBracket', args);\n}\nexport var TextBracketPosition;\n(function (TextBracketPosition) {\n TextBracketPosition[TextBracketPosition[\"TOP\"] = 1] = \"TOP\";\n TextBracketPosition[TextBracketPosition[\"BOTTOM\"] = -1] = \"BOTTOM\";\n})(TextBracketPosition || (TextBracketPosition = {}));\nexport class TextBracket extends Element {\n constructor({ start, stop, text = '', superscript = '', position = TextBracketPosition.TOP }) {\n super();\n this.start = start;\n this.stop = stop;\n this.text = text;\n this.superscript = superscript;\n this.position = typeof position === 'string' ? TextBracket.PositionString[position] : position;\n this.line = 1;\n this.resetFont();\n this.render_options = {\n dashed: true,\n dash: [5],\n color: 'black',\n line_width: 1,\n show_bracket: true,\n bracket_height: 8,\n // In the BOTTOM position, the bracket line can extend\n // under the superscript.\n underline_superscript: true,\n };\n }\n static get CATEGORY() {\n return Category.TextBracket;\n }\n static get Position() {\n return TextBracketPosition;\n }\n static get PositionString() {\n return {\n top: TextBracketPosition.TOP,\n bottom: TextBracketPosition.BOTTOM,\n };\n }\n /**\n * @deprecated Use `TextBracket.Position` instead.\n */\n static get Positions() {\n L('Positions is deprecated, use TextBracketPosition instead.');\n return TextBracketPosition;\n }\n /**\n * @deprecated Use `TextBracket.PositionString` instead.\n */\n static get PositionsString() {\n L('PositionsString is deprecated, use PositionString instead.');\n return TextBracket.PositionString;\n }\n /**\n * Apply the text backet styling to the provided context.\n * @param ctx\n * @returns this\n */\n applyStyle(ctx) {\n ctx.setFont(this.font);\n const options = this.render_options;\n ctx.setStrokeStyle(options.color);\n ctx.setFillStyle(options.color);\n ctx.setLineWidth(options.line_width);\n return this;\n }\n // Set whether the bracket line should be `dashed`. You can also\n // optionally set the `dash` pattern by passing in an array of numbers\n setDashed(dashed, dash) {\n this.render_options.dashed = dashed;\n if (dash)\n this.render_options.dash = dash;\n return this;\n }\n // Set the rendering `context` for the octave bracket\n setLine(line) {\n this.line = line;\n return this;\n }\n // Draw the octave bracket on the rendering context\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n let y = 0;\n switch (this.position) {\n case TextBracketPosition.TOP:\n y = this.start.checkStave().getYForTopText(this.line);\n break;\n case TextBracketPosition.BOTTOM:\n y = this.start.checkStave().getYForBottomText(this.line + Tables.TEXT_HEIGHT_OFFSET_HACK);\n break;\n default:\n throw new RuntimeError('InvalidPosition', `The position ${this.position} is invalid.`);\n }\n // Get the preliminary start and stop coordintates for the bracket\n const start = { x: this.start.getAbsoluteX(), y };\n const stop = { x: this.stop.getAbsoluteX(), y };\n L('Rendering TextBracket: start:', start, 'stop:', stop, 'y:', y);\n const bracket_height = this.render_options.bracket_height * this.position;\n ctx.save();\n this.applyStyle(ctx);\n // Draw text\n ctx.fillText(this.text, start.x, start.y);\n // Get the width and height for the octave number\n const main_measure = ctx.measureText(this.text);\n const main_width = main_measure.width;\n const main_height = main_measure.height;\n // Calculate the y position for the super script\n const super_y = start.y - main_height / 2.5;\n // We called this.resetFont() in the constructor, so we know this.textFont is available.\n // eslint-disable-next-line\n const { family, size, weight, style } = this.textFont;\n // To draw the superscript, we scale the font size by 1/1.4.\n const smallerFontSize = Font.scaleSize(size, 0.714286);\n ctx.setFont(family, smallerFontSize, weight, style);\n ctx.fillText(this.superscript, start.x + main_width + 1, super_y);\n // Determine width and height of the superscript\n const super_measure = ctx.measureText(this.superscript);\n const super_width = super_measure.width;\n const super_height = super_measure.height;\n // Setup initial coordinates for the bracket line\n let start_x = start.x;\n let line_y = super_y;\n const end_x = stop.x + this.stop.getGlyph().getWidth();\n // Adjust x and y coordinates based on position\n if (this.position === TextBracketPosition.TOP) {\n start_x += main_width + super_width + 5;\n line_y -= super_height / 2.7;\n }\n else if (this.position === TextBracketPosition.BOTTOM) {\n line_y += super_height / 2.7;\n start_x += main_width + 2;\n if (!this.render_options.underline_superscript) {\n start_x += super_width;\n }\n }\n if (this.render_options.dashed) {\n // Main line\n Renderer.drawDashedLine(ctx, start_x, line_y, end_x, line_y, this.render_options.dash);\n // Ending Bracket\n if (this.render_options.show_bracket) {\n Renderer.drawDashedLine(ctx, end_x, line_y + 1 * this.position, end_x, line_y + bracket_height, this.render_options.dash);\n }\n }\n else {\n ctx.beginPath();\n ctx.moveTo(start_x, line_y);\n // Main line\n ctx.lineTo(end_x, line_y);\n if (this.render_options.show_bracket) {\n // Ending bracket\n ctx.lineTo(end_x, line_y + bracket_height);\n }\n ctx.stroke();\n ctx.closePath();\n }\n ctx.restore();\n }\n}\nTextBracket.DEBUG = false;\nTextBracket.TEXT_FONT = {\n family: Font.SERIF,\n size: 15,\n weight: FontWeight.NORMAL,\n style: FontStyle.ITALIC,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Category } from './typeguard';\nimport { defined, log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (TextDynamics.DEBUG)\n log('Vex.Flow.TextDynamics', args);\n}\n/**\n * `TextDynamics` renders traditional\n * text dynamics markings, **ie: p, f, sfz, rfz, ppp**\n *\n * You can render any dynamics string that contains a combination of\n * the following letters: P, M, F, Z, R, S\n */\nexport class TextDynamics extends Note {\n /**\n * Create the dynamics marking.\n *\n * A `TextDynamics` object inherits from `Note` so that it can be formatted\n * within a `Voice`.\n *\n * @param noteStruct an object that contains a `duration` property and a\n * `sequence` of letters that represents the letters to render.\n */\n constructor(noteStruct) {\n super(noteStruct);\n this.sequence = (noteStruct.text || '').toLowerCase();\n this.line = noteStruct.line || 0;\n this.glyphs = [];\n this.render_options = Object.assign(Object.assign({}, this.render_options), { glyph_font_size: 40 });\n L('New Dynamics Text: ', this.sequence);\n }\n static get CATEGORY() {\n return Category.TextDynamics;\n }\n /** The glyph data for each dynamics letter. */\n static get GLYPHS() {\n return {\n f: {\n code: 'dynamicForte',\n width: 12,\n },\n p: {\n code: 'dynamicPiano',\n width: 14,\n },\n m: {\n code: 'dynamicMezzo',\n width: 17,\n },\n s: {\n code: 'dynamicSforzando',\n width: 10,\n },\n z: {\n code: 'dynamicZ',\n width: 12,\n },\n r: {\n code: 'dynamicRinforzando',\n width: 12,\n },\n };\n }\n /** Set the Stave line on which the note should be placed. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Preformat the dynamics text. */\n preFormat() {\n let total_width = 0;\n // length of this.glyphs must be <=\n // length of this.sequence, so if we're formatted before\n // create new glyphs.\n this.glyphs = [];\n // Iterate through each letter\n this.sequence.split('').forEach((letter) => {\n // Get the glyph data for the letter\n const glyph_data = TextDynamics.GLYPHS[letter];\n if (!glyph_data)\n throw new RuntimeError('Invalid dynamics character: ' + letter);\n const size = defined(this.render_options.glyph_font_size);\n const glyph = new Glyph(glyph_data.code, size, { category: 'textNote' });\n // Add the glyph\n this.glyphs.push(glyph);\n total_width += glyph_data.width;\n });\n // Store the width of the text\n this.setWidth(total_width);\n this.preFormatted = true;\n return this;\n }\n /** Draw the dynamics text on the rendering context. */\n draw() {\n this.setRendered();\n const x = this.getAbsoluteX();\n const y = this.checkStave().getYForLine(this.line + -3);\n L('Rendering Dynamics: ', this.sequence);\n let letter_x = x;\n this.glyphs.forEach((glyph, index) => {\n const current_letter = this.sequence[index];\n glyph.render(this.checkContext(), letter_x, y);\n letter_x += TextDynamics.GLYPHS[current_letter].width;\n });\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.TextDynamics.DEBUG` to `true`. */\nTextDynamics.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2014\nimport { Note } from './note';\nimport { TimeSignature } from './timesignature';\nimport { Category } from './typeguard';\nexport class TimeSigNote extends Note {\n constructor(timeSpec, customPadding) {\n super({ duration: 'b' });\n const timeSignature = new TimeSignature(timeSpec, customPadding);\n this.timeSigInfo = timeSignature.getInfo();\n this.setWidth(this.timeSigInfo.glyph.getMetrics().width);\n // Note properties\n this.ignore_ticks = true;\n }\n static get CATEGORY() {\n return Category.TimeSigNote;\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n draw() {\n const stave = this.checkStave();\n const ctx = this.checkContext();\n this.setRendered();\n if (!this.timeSigInfo.glyph.getContext()) {\n this.timeSigInfo.glyph.setContext(ctx);\n }\n this.timeSigInfo.glyph.setStave(stave);\n this.timeSigInfo.glyph.setYShift(stave.getYForLine(2) - stave.getYForGlyphs());\n this.timeSigInfo.glyph.renderToStave(this.getAbsoluteX());\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Balazs Forian-Szabo\n// MIT License\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { log } from './util';\nimport { Vibrato } from './vibrato';\n// eslint-disable-next-line\nfunction L(...args) {\n if (VibratoBracket.DEBUG)\n log('Vex.Flow.VibratoBracket', args);\n}\n/** `VibratoBracket` renders vibrato effect between two notes. */\nexport class VibratoBracket extends Element {\n /**\n * Either the stop or start note must be set, or both of them.\n * An undefined value for the start or stop note indicates that the vibrato\n * is drawn from the beginning or until the end of the stave accordingly.\n */\n constructor(bracket_data) {\n super();\n if (bracket_data.start)\n this.start = bracket_data.start;\n if (bracket_data.stop)\n this.stop = bracket_data.stop;\n this.line = 1;\n this.render_options = {\n harsh: false,\n wave_height: 6,\n wave_width: 4,\n wave_girth: 2,\n vibrato_width: 0,\n };\n }\n static get CATEGORY() {\n return Category.VibratoBracket;\n }\n /** Set line position of the vibrato bracket. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Set harsh vibrato bracket. */\n setHarsh(harsh) {\n this.render_options.harsh = harsh;\n return this;\n }\n /** Draw the vibrato bracket on the rendering context. */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n const y = (this.start && this.start.checkStave().getYForTopText(this.line)) ||\n (this.stop && this.stop.checkStave().getYForTopText(this.line)) ||\n 0;\n // If start note is not set then vibrato will be drawn\n // from the beginning of the stave\n const start_x = (this.start && this.start.getAbsoluteX()) || (this.stop && this.stop.checkStave().getTieStartX()) || 0;\n // If stop note is not set then vibrato will be drawn\n // until the end of the stave\n const stop_x = (this.stop && this.stop.getAbsoluteX() - this.stop.getWidth() - 5) ||\n (this.start && this.start.checkStave().getTieEndX() - 10) ||\n 0;\n this.render_options.vibrato_width = stop_x - start_x;\n L('Rendering VibratoBracket: start_x:', start_x, 'stop_x:', stop_x, 'y:', y);\n Vibrato.renderVibrato(ctx, start_x, y, this.render_options);\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.VibratoBracket.DEBUG` to `true`. */\nVibratoBracket.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Mohit Cheppudira\n// MIT License\nimport { Accidental } from './accidental';\nimport { Annotation, AnnotationHorizontalJustify, AnnotationVerticalJustify } from './annotation';\nimport { Articulation } from './articulation';\nimport { BarNote } from './barnote';\nimport { Beam } from './beam';\nimport { ChordSymbol } from './chordsymbol';\nimport { ClefNote } from './clefnote';\nimport { Curve } from './curve';\nimport { EasyScore } from './easyscore';\nimport { Element } from './element';\nimport { Formatter } from './formatter';\nimport { FretHandFinger } from './frethandfinger';\nimport { GhostNote } from './ghostnote';\nimport { GlyphNote } from './glyphnote';\nimport { GraceNote } from './gracenote';\nimport { GraceNoteGroup } from './gracenotegroup';\nimport { KeySigNote } from './keysignote';\nimport { ModifierContext } from './modifiercontext';\nimport { MultiMeasureRest } from './multimeasurerest';\nimport { NoteSubGroup } from './notesubgroup';\nimport { PedalMarking } from './pedalmarking';\nimport { Renderer } from './renderer';\nimport { RepeatNote } from './repeatnote';\nimport { Stave } from './stave';\nimport { StaveConnector } from './staveconnector';\nimport { StaveLine } from './staveline';\nimport { StaveNote } from './stavenote';\nimport { StaveTie } from './stavetie';\nimport { StringNumber } from './stringnumber';\nimport { System } from './system';\nimport { TabNote } from './tabnote';\nimport { TabStave } from './tabstave';\nimport { TextBracket } from './textbracket';\nimport { TextDynamics } from './textdynamics';\nimport { TextNote } from './textnote';\nimport { TickContext } from './tickcontext';\nimport { TimeSigNote } from './timesignote';\nimport { Tuplet } from './tuplet';\nimport { defined, log, RuntimeError } from './util';\nimport { VibratoBracket } from './vibratobracket';\nimport { Voice } from './voice';\nimport { isHTMLCanvas } from './web';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Factory.DEBUG)\n log('Vex.Flow.Factory', args);\n}\n/**\n * Factory implements a high level API around VexFlow.\n */\nexport class Factory {\n /**\n * Example:\n *\n * Create an SVG renderer and attach it to the DIV element named \"boo\" to render using 1200 and 600\n *\n * `const vf: Factory = new Vex.Flow.Factory({renderer: { elementId: 'boo', width: 1200, height: 600 }});`\n */\n constructor(options = {}) {\n L('New factory: ', options);\n this.options = {\n stave: {\n space: 10,\n },\n renderer: {\n elementId: '',\n width: 500,\n height: 200,\n background: '#FFF',\n },\n font: Factory.TEXT_FONT,\n };\n this.setOptions(options);\n }\n /**\n * Static simplified function to access constructor without providing FactoryOptions\n *\n * Example:\n *\n * Create an SVG renderer and attach it to the DIV element named \"boo\" to render using 1200 and 600\n *\n * `const vf: Factory = Vex.Flow.Factory.newFromElementId('boo', 1200, 600 );`\n */\n static newFromElementId(elementId, width = 500, height = 200) {\n return new Factory({ renderer: { elementId, width, height } });\n }\n reset() {\n this.renderQ = [];\n this.systems = [];\n this.staves = [];\n this.voices = [];\n this.stave = undefined; // current stave\n }\n setOptions(options) {\n this.options = Object.assign(Object.assign({}, this.options), options);\n this.initRenderer();\n this.reset();\n }\n initRenderer() {\n const { elementId, width, height, background } = this.options.renderer;\n if (elementId == null) {\n return;\n }\n if (elementId == '') {\n L(this);\n throw new RuntimeError('renderer.elementId not set in FactoryOptions');\n }\n let backend = this.options.renderer.backend;\n if (backend === undefined) {\n const elem = document.getElementById(elementId);\n // We use a custom type check here, because node-canvas mimics canvas,\n // but is not an instance of window.HTMLCanvasElement.\n // In fact, `window` might be undefined here.\n // See: https://www.npmjs.com/package/canvas\n if (isHTMLCanvas(elem)) {\n backend = Renderer.Backends.CANVAS;\n }\n else {\n backend = Renderer.Backends.SVG;\n }\n }\n this.context = Renderer.buildContext(elementId, backend, width, height, background);\n }\n getContext() {\n return this.context;\n }\n setContext(context) {\n this.context = context;\n return this;\n }\n getStave() {\n return this.stave;\n }\n getVoices() {\n return this.voices;\n }\n /** Return pixels from current stave spacing. */\n Stave(params) {\n const staveSpace = this.options.stave.space;\n const p = Object.assign({ x: 0, y: 0, width: this.options.renderer.width - staveSpace * 1.0, options: { spacing_between_lines_px: staveSpace * 1.0 } }, params);\n const stave = new Stave(p.x, p.y, p.width, p.options);\n this.staves.push(stave);\n stave.setContext(this.context);\n this.stave = stave;\n return stave;\n }\n TabStave(params) {\n const staveSpace = this.options.stave.space;\n const p = Object.assign({ x: 0, y: 0, width: this.options.renderer.width - staveSpace * 1.0, options: { spacing_between_lines_px: staveSpace * 1.3 } }, params);\n const stave = new TabStave(p.x, p.y, p.width, p.options);\n this.staves.push(stave);\n stave.setContext(this.context);\n this.stave = stave;\n return stave;\n }\n StaveNote(noteStruct) {\n const note = new StaveNote(noteStruct);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n GlyphNote(glyph, noteStruct, options) {\n const note = new GlyphNote(glyph, noteStruct, options);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n RepeatNote(type, noteStruct, options) {\n const note = new RepeatNote(type, noteStruct, options);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n GhostNote(noteStruct) {\n const ghostNote = new GhostNote(noteStruct);\n if (this.stave)\n ghostNote.setStave(this.stave);\n ghostNote.setContext(this.context);\n this.renderQ.push(ghostNote);\n return ghostNote;\n }\n TextNote(noteStruct) {\n const textNote = new TextNote(noteStruct);\n if (this.stave)\n textNote.setStave(this.stave);\n textNote.setContext(this.context);\n this.renderQ.push(textNote);\n return textNote;\n }\n BarNote(params = {}) {\n const barNote = new BarNote(params.type);\n if (this.stave)\n barNote.setStave(this.stave);\n barNote.setContext(this.context);\n this.renderQ.push(barNote);\n return barNote;\n }\n ClefNote(params) {\n const p = Object.assign({ type: 'treble', options: {\n size: 'default',\n annotation: undefined,\n } }, params);\n const clefNote = new ClefNote(p.type, p.options.size, p.options.annotation);\n if (this.stave)\n clefNote.setStave(this.stave);\n clefNote.setContext(this.context);\n this.renderQ.push(clefNote);\n return clefNote;\n }\n TimeSigNote(params) {\n const p = Object.assign({ time: '4/4' }, params);\n const timeSigNote = new TimeSigNote(p.time);\n if (this.stave)\n timeSigNote.setStave(this.stave);\n timeSigNote.setContext(this.context);\n this.renderQ.push(timeSigNote);\n return timeSigNote;\n }\n KeySigNote(params) {\n const keySigNote = new KeySigNote(params.key, params.cancelKey, params.alterKey);\n if (this.stave)\n keySigNote.setStave(this.stave);\n keySigNote.setContext(this.context);\n this.renderQ.push(keySigNote);\n return keySigNote;\n }\n TabNote(noteStruct) {\n const note = new TabNote(noteStruct);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n GraceNote(noteStruct) {\n const note = new GraceNote(noteStruct);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n return note;\n }\n GraceNoteGroup(params) {\n const group = new GraceNoteGroup(params.notes, params.slur);\n group.setContext(this.context);\n return group;\n }\n Accidental(params) {\n const accid = new Accidental(params.type);\n accid.setContext(this.context);\n return accid;\n }\n Annotation(params) {\n const p = Object.assign({ text: 'p', hJustify: AnnotationHorizontalJustify.CENTER, vJustify: AnnotationVerticalJustify.BOTTOM }, params);\n const annotation = new Annotation(p.text);\n annotation.setJustification(p.hJustify);\n annotation.setVerticalJustification(p.vJustify);\n annotation.setFont(p.font);\n annotation.setContext(this.context);\n return annotation;\n }\n ChordSymbol(params) {\n const p = Object.assign({ vJustify: 'top', hJustify: 'center', kerning: true, reportWidth: true }, params);\n const chordSymbol = new ChordSymbol();\n chordSymbol.setHorizontal(p.hJustify);\n chordSymbol.setVertical(p.vJustify);\n chordSymbol.setEnableKerning(p.kerning);\n chordSymbol.setReportWidth(p.reportWidth);\n // There is a default font based on the engraving font. Only set then\n // font if it is specific, else use the default\n if (typeof p.fontFamily === 'string' && typeof p.fontSize === 'number') {\n if (typeof p.fontWeight === 'string')\n chordSymbol.setFont(p.fontFamily, p.fontSize, p.fontWeight);\n else\n chordSymbol.setFont(p.fontFamily, p.fontSize, '');\n }\n else if (typeof p.fontSize === 'number') {\n chordSymbol.setFontSize(p.fontSize);\n }\n chordSymbol.setContext(this.context);\n return chordSymbol;\n }\n Articulation(params) {\n const p = Object.assign({ type: 'a.', position: 'above' }, params);\n const articulation = new Articulation(p.type);\n articulation.setPosition(p.position);\n articulation.setContext(this.context);\n return articulation;\n }\n TextDynamics(params) {\n const p = Object.assign({ text: 'p', duration: 'q', dots: 0, line: 0 }, params);\n const text = new TextDynamics({\n text: p.text,\n line: p.line,\n duration: p.duration,\n dots: p.dots,\n });\n if (this.stave)\n text.setStave(this.stave);\n text.setContext(this.context);\n this.renderQ.push(text);\n return text;\n }\n Fingering(params) {\n const p = Object.assign({ number: '0', position: 'left' }, params);\n const fingering = new FretHandFinger(p.number);\n fingering.setPosition(p.position);\n fingering.setContext(this.context);\n return fingering;\n }\n StringNumber(params) {\n const stringNumber = new StringNumber(params.number);\n stringNumber.setPosition(params.position);\n stringNumber.setContext(this.context);\n return stringNumber;\n }\n TickContext() {\n return new TickContext();\n }\n ModifierContext() {\n return new ModifierContext();\n }\n MultiMeasureRest(params) {\n const numMeasures = defined(params.number_of_measures, 'NoNumberOfMeasures');\n const multiMeasureRest = new MultiMeasureRest(numMeasures, params);\n multiMeasureRest.setContext(this.context);\n this.renderQ.push(multiMeasureRest);\n return multiMeasureRest;\n }\n Voice(params) {\n const p = Object.assign({ time: '4/4' }, params);\n const voice = new Voice(p.time, p.options);\n this.voices.push(voice);\n return voice;\n }\n StaveConnector(params) {\n const connector = new StaveConnector(params.top_stave, params.bottom_stave);\n connector.setType(params.type).setContext(this.context);\n this.renderQ.push(connector);\n return connector;\n }\n Formatter(options) {\n return new Formatter(options);\n }\n Tuplet(params) {\n const p = Object.assign({ notes: [], options: {} }, params);\n const tuplet = new Tuplet(p.notes, p.options).setContext(this.context);\n this.renderQ.push(tuplet);\n return tuplet;\n }\n Beam(params) {\n var _a, _b, _c;\n const beam = new Beam(params.notes, (_a = params.options) === null || _a === void 0 ? void 0 : _a.autoStem).setContext(this.context);\n beam.breakSecondaryAt((_c = (_b = params.options) === null || _b === void 0 ? void 0 : _b.secondaryBeamBreaks) !== null && _c !== void 0 ? _c : []);\n this.renderQ.push(beam);\n return beam;\n }\n Curve(params) {\n const curve = new Curve(params.from, params.to, params.options).setContext(this.context);\n this.renderQ.push(curve);\n return curve;\n }\n StaveTie(params) {\n var _a;\n const tie = new StaveTie({\n first_note: params.from,\n last_note: params.to,\n first_indices: params.first_indices,\n last_indices: params.last_indices,\n }, params.text);\n if ((_a = params.options) === null || _a === void 0 ? void 0 : _a.direction)\n tie.setDirection(params.options.direction);\n tie.setContext(this.context);\n this.renderQ.push(tie);\n return tie;\n }\n StaveLine(params) {\n var _a, _b;\n const line = new StaveLine({\n first_note: params.from,\n last_note: params.to,\n first_indices: params.first_indices,\n last_indices: params.last_indices,\n });\n if ((_a = params.options) === null || _a === void 0 ? void 0 : _a.text)\n line.setText(params.options.text);\n if ((_b = params.options) === null || _b === void 0 ? void 0 : _b.font)\n line.setFont(params.options.font);\n line.setContext(this.context);\n this.renderQ.push(line);\n return line;\n }\n VibratoBracket(params) {\n const vibratoBracket = new VibratoBracket({\n start: params.from,\n stop: params.to,\n });\n if (params.options.line)\n vibratoBracket.setLine(params.options.line);\n if (params.options.harsh)\n vibratoBracket.setHarsh(params.options.harsh);\n vibratoBracket.setContext(this.context);\n this.renderQ.push(vibratoBracket);\n return vibratoBracket;\n }\n TextBracket(params) {\n const textBracket = new TextBracket({\n start: params.from,\n stop: params.to,\n text: params.text,\n superscript: params.options.superscript,\n position: params.options.position,\n });\n if (params.options.line)\n textBracket.setLine(params.options.line);\n if (params.options.font)\n textBracket.setFont(params.options.font);\n textBracket.setContext(this.context);\n this.renderQ.push(textBracket);\n return textBracket;\n }\n System(params = {}) {\n params.factory = this;\n const system = new System(params).setContext(this.context);\n this.systems.push(system);\n return system;\n }\n /**\n * Creates EasyScore. Normally the first step after constructing a Factory. For example:\n * ```\n * const vf: Factory = new Vex.Flow.Factory({renderer: { elementId: 'boo', width: 1200, height: 600 }});\n * const score: EasyScore = vf.EasyScore();\n * ```\n * @param options.factory optional instance of Factory\n * @param options.builder instance of Builder\n * @param options.commitHooks function to call after a note element is created\n * @param options.throwOnError throw error in case of parsing error\n */\n EasyScore(options = {}) {\n options.factory = this;\n return new EasyScore(options);\n }\n PedalMarking(params) {\n const p = Object.assign({ notes: [], options: {\n style: 'mixed',\n } }, params);\n const pedal = new PedalMarking(p.notes);\n pedal.setType(PedalMarking.typeString[p.options.style]);\n pedal.setContext(this.context);\n this.renderQ.push(pedal);\n return pedal;\n }\n NoteSubGroup(params) {\n const p = Object.assign({ notes: [] }, params);\n const group = new NoteSubGroup(p.notes);\n group.setContext(this.context);\n return group;\n }\n /** Render the score. */\n draw() {\n const ctx = this.context;\n this.systems.forEach((s) => s.setContext(ctx).format());\n this.staves.forEach((s) => s.setContext(ctx).draw());\n this.voices.forEach((v) => v.setContext(ctx).draw());\n this.renderQ.forEach((e) => {\n if (!e.isRendered())\n e.setContext(ctx).draw();\n });\n this.systems.forEach((s) => s.setContext(ctx).draw());\n this.reset();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Factory.DEBUG` to `true`. */\nFactory.DEBUG = false;\n/** Default text font. */\nFactory.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// Author: Raffaele Viglianti, 2012 http://itisnotsound.wordpress.com/\n//\n// This class implements hairpins between notes.\n// Hairpins can be either crescendo or decrescendo.\nimport { Element } from './element';\nimport { Modifier } from './modifier';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StaveHairpin extends Element {\n /**\n * Create a new hairpin from the specified notes.\n *\n * @param {!Object} notes The notes to tie up.\n * Notes is a struct that has:\n *\n * {\n * first_note: Note,\n * last_note: Note,\n * }\n * @param {!Object} type The type of hairpin\n */\n constructor(notes, type) {\n super();\n this.setNotes(notes);\n this.hairpin = type;\n this.position = Modifier.Position.BELOW;\n this.render_options = {\n height: 10,\n y_shift: 0,\n left_shift_px: 0,\n right_shift_px: 0,\n right_shift_ticks: 0,\n left_shift_ticks: 0,\n };\n }\n static get CATEGORY() {\n return Category.StaveHairpin;\n }\n /* Helper function to convert ticks into pixels.\n * Requires a Formatter with voices joined and formatted (to\n * get pixels per tick)\n *\n * options is struct that has:\n *\n * {\n * height: px,\n * y_shift: px, // vertical offset\n * left_shift_ticks: 0, // left horizontal offset expressed in ticks\n * right_shift_ticks: 0 // right horizontal offset expressed in ticks\n * }\n *\n **/\n static FormatByTicksAndDraw(ctx, formatter, notes, type, position, options) {\n var _a, _b;\n const ppt = formatter.pixelsPerTick;\n if (ppt == null) {\n throw new RuntimeError('BadArguments', 'A valid Formatter must be provide to draw offsets by ticks.');\n }\n const l_shift_px = ppt * ((_a = options.left_shift_ticks) !== null && _a !== void 0 ? _a : 0);\n const r_shift_px = ppt * ((_b = options.right_shift_ticks) !== null && _b !== void 0 ? _b : 0);\n const hairpin_options = {\n height: options.height,\n y_shift: options.y_shift,\n left_shift_px: l_shift_px,\n right_shift_px: r_shift_px,\n right_shift_ticks: 0,\n left_shift_ticks: 0,\n };\n new StaveHairpin({\n first_note: notes.first_note,\n last_note: notes.last_note,\n }, type)\n .setContext(ctx)\n .setRenderOptions(hairpin_options)\n .setPosition(position)\n .draw();\n }\n setPosition(position) {\n if (position === Modifier.Position.ABOVE || position === Modifier.Position.BELOW) {\n this.position = position;\n }\n return this;\n }\n setRenderOptions(options) {\n if (options.height != null &&\n options.y_shift != null &&\n options.left_shift_px != null &&\n options.right_shift_px != null) {\n this.render_options = options;\n }\n return this;\n }\n /**\n * Set the notes to attach this hairpin to.\n *\n * @param {!Object} notes The start and end notes.\n */\n setNotes(notes) {\n if (!notes.first_note && !notes.last_note) {\n throw new RuntimeError('BadArguments', 'Hairpin needs to have either first_note or last_note set.');\n }\n this.notes = notes;\n this.first_note = notes.first_note;\n this.last_note = notes.last_note;\n return this;\n }\n renderHairpin(params) {\n const ctx = this.checkContext();\n let dis = this.render_options.y_shift + 20;\n let y_shift = params.first_y;\n if (this.position === Modifier.Position.ABOVE) {\n dis = -dis + 30;\n y_shift = params.first_y - params.staff_height;\n }\n const l_shift = this.render_options.left_shift_px;\n const r_shift = this.render_options.right_shift_px;\n ctx.beginPath();\n switch (this.hairpin) {\n case StaveHairpin.type.CRESC:\n ctx.moveTo(params.last_x + r_shift, y_shift + dis);\n ctx.lineTo(params.first_x + l_shift, y_shift + this.render_options.height / 2 + dis);\n ctx.lineTo(params.last_x + r_shift, y_shift + this.render_options.height + dis);\n break;\n case StaveHairpin.type.DECRESC:\n ctx.moveTo(params.first_x + l_shift, y_shift + dis);\n ctx.lineTo(params.last_x + r_shift, y_shift + this.render_options.height / 2 + dis);\n ctx.lineTo(params.first_x + l_shift, y_shift + this.render_options.height + dis);\n break;\n default:\n // Default is NONE, so nothing to draw\n break;\n }\n ctx.stroke();\n ctx.closePath();\n }\n draw() {\n this.checkContext();\n this.setRendered();\n const firstNote = this.first_note;\n const lastNote = this.last_note;\n if (!firstNote || !lastNote)\n throw new RuntimeError('NoNote', 'Notes required to draw');\n const start = firstNote.getModifierStartXY(this.position, 0);\n const end = lastNote.getModifierStartXY(this.position, 0);\n this.renderHairpin({\n first_x: start.x,\n last_x: end.x,\n first_y: firstNote.checkStave().getY() + firstNote.checkStave().getHeight(),\n last_y: lastNote.checkStave().getY() + lastNote.checkStave().getHeight(),\n staff_height: firstNote.checkStave().getHeight(),\n });\n }\n}\nStaveHairpin.type = {\n CRESC: 1,\n DECRESC: 2,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// This class implements varies types of ties between contiguous notes. The\n// ties include: regular ties, hammer ons, pull offs, and slides.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { TabTie } from './tabtie';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class TabSlide extends TabTie {\n /**\n * @param notes is a struct of the form:\n * {\n * first_note: Note,\n * last_note: Note,\n * first_indices: [n1, n2, n3],\n * last_indices: [n1, n2, n3]\n * }\n * @param notes.first_note the starting note of the slide\n * @param notes.last_note the ending note of the slide\n * @param notes.first_indices specifies which string + fret positions of the TabNote are used in this slide. zero indexed.\n * @param notes.last_indices currently unused. we assume it's the same as first_indices.\n *\n * @param direction TabSlide.SLIDE_UP or TabSlide.SLIDE_DOWN\n */\n constructor(notes, direction) {\n super(notes, 'sl.');\n // Determine the direction automatically if it is not provided.\n if (!direction) {\n let first_fret = notes.first_note.getPositions()[0].fret;\n if (typeof first_fret === 'string') {\n first_fret = parseInt(first_fret, 10);\n }\n let last_fret = notes.last_note.getPositions()[0].fret;\n if (typeof last_fret === 'string') {\n last_fret = parseInt(last_fret, 10);\n }\n // If either of the frets are 'X', parseInt() above will return NaN.\n // Choose TabSlide.SLIDE_UP by default.\n if (isNaN(first_fret) || isNaN(last_fret)) {\n direction = TabSlide.SLIDE_UP;\n }\n else {\n direction = first_fret > last_fret ? TabSlide.SLIDE_DOWN : TabSlide.SLIDE_UP;\n }\n }\n this.direction = direction;\n this.render_options.cp1 = 11;\n this.render_options.cp2 = 14;\n this.render_options.y_shift = 0.5;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.TabSlide;\n }\n static get SLIDE_UP() {\n return 1;\n }\n static get SLIDE_DOWN() {\n return -1;\n }\n static createSlideUp(notes) {\n return new TabSlide(notes, TabSlide.SLIDE_UP);\n }\n static createSlideDown(notes) {\n return new TabSlide(notes, TabSlide.SLIDE_DOWN);\n }\n renderTie(params) {\n if (params.first_ys.length === 0 || params.last_ys.length === 0) {\n throw new RuntimeError('BadArguments', 'No Y-values to render');\n }\n const ctx = this.checkContext();\n const first_x_px = params.first_x_px;\n const first_ys = params.first_ys;\n const last_x_px = params.last_x_px;\n const direction = params.direction;\n if (direction !== TabSlide.SLIDE_UP && direction !== TabSlide.SLIDE_DOWN) {\n throw new RuntimeError('BadSlide', 'Invalid slide direction');\n }\n // eslint-disable-next-line\n const first_indices = this.notes.first_indices;\n for (let i = 0; i < first_indices.length; ++i) {\n const slide_y = first_ys[first_indices[i]] + this.render_options.y_shift;\n if (isNaN(slide_y)) {\n throw new RuntimeError('BadArguments', 'Bad indices for slide rendering.');\n }\n ctx.beginPath();\n ctx.moveTo(first_x_px, slide_y + 3 * direction);\n ctx.lineTo(last_x_px, slide_y - 3 * direction);\n ctx.closePath();\n ctx.stroke();\n }\n this.setRendered();\n }\n}\nTabSlide.TEXT_FONT = {\n family: Font.SERIF,\n size: 10,\n weight: FontWeight.BOLD,\n style: FontStyle.ITALIC,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Tables } from './tables';\nimport { RuntimeError } from './util';\n/** `Tuning` implements varies types of tunings for tablature. */\nexport class Tuning {\n /**\n * Constructor.\n * @param tuningString tuning name (eg. 'dagdad') or comma separated note strings\n */\n constructor(tuningString = 'E/5,B/4,G/4,D/4,A/3,E/3,B/2,E/2') {\n this.tuningValues = [];\n // Default to standard tuning.\n this.setTuning(tuningString);\n }\n static get names() {\n return {\n standard: 'E/5,B/4,G/4,D/4,A/3,E/3',\n dagdad: 'D/5,A/4,G/4,D/4,A/3,D/3',\n dropd: 'E/5,B/4,G/4,D/4,A/3,D/3',\n eb: 'Eb/5,Bb/4,Gb/4,Db/4,Ab/3,Db/3',\n standardBanjo: 'D/5,B/4,G/4,D/4,G/5',\n };\n }\n /** Return the note number associated to the note string. */\n noteToInteger(noteString) {\n return Tables.keyProperties(noteString).int_value;\n }\n /**\n * Set tuning identified by tuning name (eg. 'dagdad')\n * @param tuningString tuning name (eg. 'dagdad') or comma separated note strings\n */\n setTuning(tuningString) {\n if (Tuning.names[tuningString]) {\n tuningString = Tuning.names[tuningString];\n }\n this.tuningValues = [];\n const keys = tuningString.split(/\\s*,\\s*/);\n if (keys.length === 0) {\n throw new RuntimeError('BadArguments', `Invalid tuning string: ${tuningString}`);\n }\n for (let i = 0; i < keys.length; ++i) {\n this.tuningValues[i] = this.noteToInteger(keys[i]);\n }\n }\n /** Return the note number associated with a tablature string. */\n getValueForString(stringNum) {\n const s = Number(stringNum);\n if (s < 1 || s > this.tuningValues.length) {\n throw new RuntimeError('BadArguments', `String number must be between 1 and ${this.tuningValues.length}:${stringNum}`);\n }\n return this.tuningValues[s - 1];\n }\n /** Return the note number associated with a tablature string and fret. */\n getValueForFret(fretNum, stringNum) {\n const stringValue = this.getValueForString(stringNum);\n const f = Number(fretNum);\n if (f < 0) {\n throw new RuntimeError('BadArguments', `Fret number must be 0 or higher: ${fretNum}`);\n }\n return stringValue + f;\n }\n /** Return the note string associated with tablature string and fret. */\n getNoteForFret(fretNum, stringNum) {\n const noteValue = this.getValueForFret(fretNum, stringNum);\n const octave = Math.floor(noteValue / 12);\n const value = noteValue % 12;\n return `${Tables.integerToNote(value)}/${octave}`;\n }\n}\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { Accidental } from './accidental';\nimport { Annotation } from './annotation';\nimport { Articulation } from './articulation';\nimport { BarNote } from './barnote';\nimport { Beam } from './beam';\nimport { Bend } from './bend';\nimport { BoundingBox } from './boundingbox';\nimport { BoundingBoxComputation } from './boundingboxcomputation';\nimport { CanvasContext } from './canvascontext';\nimport { ChordSymbol } from './chordsymbol';\nimport { Clef } from './clef';\nimport { ClefNote } from './clefnote';\nimport { Crescendo } from './crescendo';\nimport { Curve } from './curve';\nimport { Dot } from './dot';\nimport { EasyScore } from './easyscore';\nimport { Element } from './element';\nimport { Factory } from './factory';\nimport { Font } from './font';\nimport { Formatter } from './formatter';\nimport { Fraction } from './fraction';\nimport { FretHandFinger } from './frethandfinger';\nimport { GhostNote } from './ghostnote';\nimport { Glyph } from './glyph';\nimport { GlyphNote } from './glyphnote';\nimport { GraceNote } from './gracenote';\nimport { GraceNoteGroup } from './gracenotegroup';\nimport { GraceTabNote } from './gracetabnote';\nimport { KeyManager } from './keymanager';\nimport { KeySignature } from './keysignature';\nimport { KeySigNote } from './keysignote';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { ModifierContext } from './modifiercontext';\nimport { MultiMeasureRest } from './multimeasurerest';\nimport { Music } from './music';\nimport { Note } from './note';\nimport { NoteHead } from './notehead';\nimport { NoteSubGroup } from './notesubgroup';\nimport { Ornament } from './ornament';\nimport { Parenthesis } from './parenthesis';\nimport { Parser } from './parser';\nimport { PedalMarking } from './pedalmarking';\nimport { Registry } from './registry';\nimport { RenderContext } from './rendercontext';\nimport { Renderer } from './renderer';\nimport { RepeatNote } from './repeatnote';\nimport { Stave } from './stave';\nimport { Barline, BarlineType } from './stavebarline';\nimport { StaveConnector } from './staveconnector';\nimport { StaveHairpin } from './stavehairpin';\nimport { StaveLine } from './staveline';\nimport { StaveModifier } from './stavemodifier';\nimport { StaveNote } from './stavenote';\nimport { Repetition } from './staverepetition';\nimport { StaveTempo } from './stavetempo';\nimport { StaveText } from './stavetext';\nimport { StaveTie } from './stavetie';\nimport { Volta } from './stavevolta';\nimport { Stem } from './stem';\nimport { StringNumber } from './stringnumber';\nimport { Stroke } from './strokes';\nimport { SVGContext } from './svgcontext';\nimport { System } from './system';\nimport { Tables } from './tables';\nimport { TabNote } from './tabnote';\nimport { TabSlide } from './tabslide';\nimport { TabStave } from './tabstave';\nimport { TabTie } from './tabtie';\nimport { TextBracket } from './textbracket';\nimport { TextDynamics } from './textdynamics';\nimport { TextFormatter } from './textformatter';\nimport { TextNote } from './textnote';\nimport { TickContext } from './tickcontext';\nimport { TimeSignature } from './timesignature';\nimport { TimeSigNote } from './timesignote';\nimport { Tremolo } from './tremolo';\nimport { Tuning } from './tuning';\nimport { Tuplet } from './tuplet';\nimport { DATE, ID, VERSION } from './version';\nimport { Vibrato } from './vibrato';\nimport { VibratoBracket } from './vibratobracket';\nimport { Voice } from './voice';\nexport class Flow {\n static get BUILD() {\n return {\n /** version number. */\n VERSION: VERSION,\n /** git commit ID that this library was built from. */\n ID: ID,\n /** The date when this library was compiled. */\n DATE: DATE,\n };\n }\n static get Flow() {\n // This (circular reference) provides a handy shortcut for importing VexFlow via `require()`.\n // For example:\n // const Vex = require('vexflow');\n // const { Flow, Stave, StaveNote, Formatter, Renderer } = Vex.Flow;\n return Flow;\n }\n // ... more to come ...\n /**\n * Examples:\n * ```\n * Vex.Flow.setMusicFont('Petaluma');\n * Vex.Flow.setMusicFont('Bravura', 'Gonville');\n * ```\n *\n * **CASE 1**: You are using `vexflow.js`, which includes all music fonts (Bravura, Gonville, Petaluma, Custom).\n * In this case, calling this method is optional, since VexFlow already defaults to a music font stack of:\n * 'Bravura', 'Gonville', 'Custom'.\n *\n * **CASE 2**: You are using `vexflow-bravura.js` or `vexflow-petaluma.js` or `vexflow-gonville.js`,\n * which includes a single music font. Calling this method is unnecessary.\n *\n * **CASE 3**: You are using the light weight `vexflow-core.js` to take advantage of lazy loading for fonts.\n * In this case, the default music font stack is empty.\n * Example:\n * ```\n * await Vex.Flow.fetchMusicFont('Petaluma');\n * Vex.Flow.setMusicFont('Petaluma');\n * ... (do VexFlow stuff) ...\n * ```\n * See `demos/fonts/` for more examples.\n *\n * @returns an array of Font objects corresponding to the provided `fontNames`.\n */\n static setMusicFont(...fontNames) {\n // Convert the array of font names into an array of Font objects.\n const fonts = fontNames.map((fontName) => Font.load(fontName));\n Tables.MUSIC_FONT_STACK = fonts;\n Glyph.MUSIC_FONT_STACK = fonts.slice();\n Glyph.CURRENT_CACHE_KEY = fontNames.join(',');\n return fonts;\n }\n /**\n * Used with vexflow-core which supports dynamic font loading.\n */\n // eslint-disable-next-line\n static fetchMusicFont(fontName, fontModuleOrPath) {\n return __awaiter(this, void 0, void 0, function* () {\n // The default implementation does nothing.\n // See vexflow-core.ts for the implementation that vexflow-core.js uses.\n });\n }\n static getMusicFont() {\n const fonts = Tables.MUSIC_FONT_STACK;\n return fonts.map((font) => font.getName());\n }\n static get NOTATION_FONT_SCALE() {\n return Tables.NOTATION_FONT_SCALE;\n }\n static set NOTATION_FONT_SCALE(value) {\n Tables.NOTATION_FONT_SCALE = value;\n }\n static get TABLATURE_FONT_SCALE() {\n return Tables.TABLATURE_FONT_SCALE;\n }\n static set TABLATURE_FONT_SCALE(value) {\n Tables.TABLATURE_FONT_SCALE = value;\n }\n static get RESOLUTION() {\n return Tables.RESOLUTION;\n }\n static set RESOLUTION(value) {\n Tables.RESOLUTION = value;\n }\n static get SLASH_NOTEHEAD_WIDTH() {\n return Tables.SLASH_NOTEHEAD_WIDTH;\n }\n static set SLASH_NOTEHEAD_WIDTH(value) {\n Tables.SLASH_NOTEHEAD_WIDTH = value;\n }\n static get STAVE_LINE_DISTANCE() {\n return Tables.STAVE_LINE_DISTANCE;\n }\n static set STAVE_LINE_DISTANCE(value) {\n Tables.STAVE_LINE_DISTANCE = value;\n }\n static get STAVE_LINE_THICKNESS() {\n return Tables.STAVE_LINE_THICKNESS;\n }\n static set STAVE_LINE_THICKNESS(value) {\n Tables.STAVE_LINE_THICKNESS = value;\n }\n static get STEM_HEIGHT() {\n return Tables.STEM_HEIGHT;\n }\n static set STEM_HEIGHT(value) {\n Tables.STEM_HEIGHT = value;\n }\n static get STEM_WIDTH() {\n return Tables.STEM_WIDTH;\n }\n static set STEM_WIDTH(value) {\n Tables.STEM_WIDTH = value;\n }\n static get TIME4_4() {\n return Tables.TIME4_4;\n }\n static get accidentalMap() {\n return Tables.accidentalMap;\n }\n static get unicode() {\n return Tables.unicode;\n }\n static keySignature(spec) {\n return Tables.keySignature(spec);\n }\n static hasKeySignature(spec) {\n return Tables.hasKeySignature(spec);\n }\n static getKeySignatures() {\n return Tables.getKeySignatures();\n }\n static clefProperties(clef) {\n return Tables.clefProperties(clef);\n }\n // eslint-disable-next-line\n static keyProperties(key, clef, params) {\n return Tables.keyProperties(key, clef, params);\n }\n static durationToTicks(duration) {\n return Tables.durationToTicks(duration);\n }\n}\nFlow.Accidental = Accidental;\nFlow.Annotation = Annotation;\nFlow.Articulation = Articulation;\nFlow.Barline = Barline;\nFlow.BarNote = BarNote;\nFlow.Beam = Beam;\nFlow.Bend = Bend;\nFlow.BoundingBox = BoundingBox;\nFlow.BoundingBoxComputation = BoundingBoxComputation;\nFlow.CanvasContext = CanvasContext;\nFlow.ChordSymbol = ChordSymbol;\nFlow.Clef = Clef;\nFlow.ClefNote = ClefNote;\nFlow.Crescendo = Crescendo;\nFlow.Curve = Curve;\nFlow.Dot = Dot;\nFlow.EasyScore = EasyScore;\nFlow.Element = Element;\nFlow.Factory = Factory;\nFlow.Font = Font;\nFlow.Formatter = Formatter;\nFlow.Fraction = Fraction;\nFlow.FretHandFinger = FretHandFinger;\nFlow.GhostNote = GhostNote;\nFlow.Glyph = Glyph;\nFlow.GlyphNote = GlyphNote;\nFlow.GraceNote = GraceNote;\nFlow.GraceNoteGroup = GraceNoteGroup;\nFlow.GraceTabNote = GraceTabNote;\nFlow.KeyManager = KeyManager;\nFlow.KeySignature = KeySignature;\nFlow.KeySigNote = KeySigNote;\nFlow.Modifier = Modifier;\nFlow.ModifierContext = ModifierContext;\nFlow.MultiMeasureRest = MultiMeasureRest;\nFlow.Music = Music;\nFlow.Note = Note;\nFlow.NoteHead = NoteHead;\nFlow.NoteSubGroup = NoteSubGroup;\nFlow.Ornament = Ornament;\nFlow.Parenthesis = Parenthesis;\nFlow.Parser = Parser;\nFlow.PedalMarking = PedalMarking;\nFlow.Registry = Registry;\nFlow.RenderContext = RenderContext;\nFlow.Renderer = Renderer;\nFlow.RepeatNote = RepeatNote;\nFlow.Repetition = Repetition;\nFlow.Stave = Stave;\nFlow.StaveConnector = StaveConnector;\nFlow.StaveHairpin = StaveHairpin;\nFlow.StaveLine = StaveLine;\nFlow.StaveModifier = StaveModifier;\nFlow.StaveNote = StaveNote;\nFlow.StaveTempo = StaveTempo;\nFlow.StaveText = StaveText;\nFlow.StaveTie = StaveTie;\nFlow.Stem = Stem;\nFlow.StringNumber = StringNumber;\nFlow.Stroke = Stroke;\nFlow.SVGContext = SVGContext;\nFlow.System = System;\nFlow.TabNote = TabNote;\nFlow.TabSlide = TabSlide;\nFlow.TabStave = TabStave;\nFlow.TabTie = TabTie;\nFlow.TextBracket = TextBracket;\nFlow.TextDynamics = TextDynamics;\nFlow.TextFormatter = TextFormatter;\nFlow.TextNote = TextNote;\nFlow.TickContext = TickContext;\nFlow.TimeSignature = TimeSignature;\nFlow.TimeSigNote = TimeSigNote;\nFlow.Tremolo = Tremolo;\nFlow.Tuning = Tuning;\nFlow.Tuplet = Tuplet;\nFlow.Vibrato = Vibrato;\nFlow.VibratoBracket = VibratoBracket;\nFlow.Voice = Voice;\nFlow.Volta = Volta;\n// enums need to be exported too!\nFlow.BarlineType = BarlineType;\nFlow.ModifierPosition = ModifierPosition;\n","export const VERSION = '4.0.1-alpha.2';\nexport const ID = '0df10df6d1fab3a99f5aa306341a31c6e686d659';\nexport const DATE = '2022-02-02T09:30:30.784Z';\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Balazs Forian-Szabo\n//\n// ## Description\n//\n// A basic implementation of grace notes\n// to be rendered on a tab stave.\n//\n// See `tests/gracetabnote_tests.ts` for usage examples.\nimport { Font } from './font';\nimport { TabNote } from './tabnote';\nimport { Category } from './typeguard';\nexport class GraceTabNote extends TabNote {\n static get CATEGORY() {\n return Category.GraceTabNote;\n }\n constructor(noteStruct) {\n super(noteStruct, false);\n this.render_options = Object.assign(Object.assign({}, this.render_options), { \n // vertical shift from stave line\n y_shift: 0.3, \n // grace glyph scale\n scale: 0.6, \n // grace tablature font\n font: `7.5pt ${Font.SANS_SERIF}` });\n this.updateWidth();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This class implements diatonic key management.\nimport { Music } from './music';\nimport { RuntimeError } from './util';\nexport class KeyManager {\n constructor(key) {\n this.music = new Music();\n this.setKey(key);\n }\n setKey(key) {\n this.key = key;\n this.reset();\n return this;\n }\n getKey() {\n return this.key;\n }\n reset() {\n this.keyParts = this.music.getKeyParts(this.key);\n this.keyString = this.keyParts.root;\n if (this.keyParts.accidental)\n this.keyString += this.keyParts.accidental;\n const is_supported_type = Music.scaleTypes[this.keyParts.type];\n if (!is_supported_type) {\n throw new RuntimeError('BadArguments', `Unsupported key type: ${this.key}`);\n }\n this.scale = this.music.getScaleTones(this.music.getNoteValue(this.keyString), Music.scaleTypes[this.keyParts.type]);\n this.scaleMap = {};\n this.scaleMapByValue = {};\n this.originalScaleMapByValue = {};\n const noteLocation = Music.root_indices[this.keyParts.root];\n for (let i = 0; i < Music.roots.length; ++i) {\n const index = (noteLocation + i) % Music.roots.length;\n const rootName = Music.roots[index];\n const noteName = this.music.getRelativeNoteName(rootName, this.scale[i]);\n this.scaleMap[rootName] = noteName;\n this.scaleMapByValue[this.scale[i]] = noteName;\n this.originalScaleMapByValue[this.scale[i]] = noteName;\n }\n return this;\n }\n getAccidental(key) {\n const root = this.music.getKeyParts(key).root;\n const parts = this.music.getNoteParts(this.scaleMap[root]);\n return {\n note: this.scaleMap[root],\n accidental: parts.accidental,\n };\n }\n selectNote(note) {\n note = note.toLowerCase();\n const parts = this.music.getNoteParts(note);\n // First look for matching note in our altered scale\n const scaleNote = this.scaleMap[parts.root];\n const modparts = this.music.getNoteParts(scaleNote);\n if (scaleNote === note) {\n return {\n note: scaleNote,\n accidental: parts.accidental,\n change: false,\n };\n }\n // Then search for a note of equivalent value in our altered scale\n const valueNote = this.scaleMapByValue[this.music.getNoteValue(note)];\n if (valueNote != null) {\n return {\n note: valueNote,\n accidental: this.music.getNoteParts(valueNote).accidental,\n change: false,\n };\n }\n // Then search for a note of equivalent value in the original scale\n const originalValueNote = this.originalScaleMapByValue[this.music.getNoteValue(note)];\n if (originalValueNote != null) {\n this.scaleMap[modparts.root] = originalValueNote;\n delete this.scaleMapByValue[this.music.getNoteValue(scaleNote)];\n this.scaleMapByValue[this.music.getNoteValue(note)] = originalValueNote;\n return {\n note: originalValueNote,\n accidental: this.music.getNoteParts(originalValueNote).accidental,\n change: true,\n };\n }\n // Then try to unmodify a currently modified note.\n if (modparts.root === note) {\n delete this.scaleMapByValue[this.music.getNoteValue(this.scaleMap[parts.root])];\n this.scaleMapByValue[this.music.getNoteValue(modparts.root)] = modparts.root;\n this.scaleMap[modparts.root] = modparts.root;\n return {\n note: modparts.root,\n accidental: undefined,\n change: true,\n };\n }\n // Last resort -- shitshoot\n delete this.scaleMapByValue[this.music.getNoteValue(this.scaleMap[parts.root])];\n this.scaleMapByValue[this.music.getNoteValue(note)] = note;\n delete this.scaleMap[modparts.root];\n this.scaleMap[modparts.root] = note;\n return {\n note,\n accidental: parts.accidental,\n change: true,\n };\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Mike Corrigan \n// MIT License\nimport { Glyph } from './glyph';\nimport { GraceNote } from './gracenote';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category, isGraceNote } from './typeguard';\n/** Tremolo implements tremolo notation. */\nexport class Tremolo extends Modifier {\n /**\n * @param num number of bars\n */\n constructor(num) {\n super();\n this.num = num;\n this.position = Modifier.Position.CENTER;\n this.code = 'tremolo1';\n // big strokes scales initialised to 1 (no scale)\n this.y_spacing_scale = 1;\n this.extra_stroke_scale = 1;\n }\n static get CATEGORY() {\n return Category.Tremolo;\n }\n /** Draw the tremolo on the rendering context. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const stemDirection = note.getStemDirection();\n const start = note.getModifierStartXY(this.position, this.index);\n let x = start.x;\n const gn = isGraceNote(note);\n const scale = gn ? GraceNote.SCALE : 1;\n const category = `tremolo.${gn ? 'grace' : 'default'}`;\n const musicFont = Tables.currentMusicFont();\n let y_spacing = musicFont.lookupMetric(`${category}.spacing`) * stemDirection;\n // add y_spacing_scale for big strokes (#1258)\n y_spacing *= this.y_spacing_scale;\n const height = this.num * y_spacing;\n let y = note.getStemExtents().baseY - height;\n if (stemDirection < 0) {\n y += musicFont.lookupMetric(`${category}.offsetYStemDown`) * scale;\n }\n else {\n y += musicFont.lookupMetric(`${category}.offsetYStemUp`) * scale;\n }\n const fontScale = musicFont.lookupMetric(`${category}.point`);\n x += musicFont.lookupMetric(`${category}.offsetXStem${stemDirection === Stem.UP ? 'Up' : 'Down'}`);\n for (let i = 0; i < this.num; ++i) {\n Glyph.renderGlyph(ctx, x, y, fontScale, this.code, { category, scale: this.extra_stroke_scale });\n y += y_spacing;\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// Utility methods used by the rest of the VexFlow codebase.\nimport { Flow } from './flow';\nimport { log, RuntimeError } from './util';\nexport class Vex {\n // Users of `Vex.forEach(a, fn)` should use `Array.prototype.forEach()` instead.\n // static forEach(arr: T[], callbackFn: (value: T, index: number, array: T[]) => void) {\n // arr.forEach(callbackFn);\n // }\n /**\n * Take `arr` and return a new list consisting of the sorted, unique,\n * contents of arr. Does not modify `arr`.\n */\n // eslint-disable-next-line\n static sortAndUnique(arr, cmp, eq) {\n if (arr.length > 1) {\n const newArr = [];\n let last;\n arr.sort(cmp);\n for (let i = 0; i < arr.length; ++i) {\n if (i === 0 || !eq(arr[i], last)) {\n newArr.push(arr[i]);\n }\n last = arr[i];\n }\n return newArr;\n }\n else {\n return arr;\n }\n }\n /** Check if array `arr` contains `obj`. */\n // eslint-disable-next-line\n static contains(arr, obj) {\n let i = arr.length;\n while (i--) {\n if (arr[i] === obj) {\n return true;\n }\n }\n return false;\n }\n // Get the 2D Canvas context from DOM element `canvas_sel`.\n static getCanvasContext(canvasSelector) {\n if (!canvasSelector) {\n throw new RuntimeError('BadArgument', 'Invalid canvas selector: ' + canvasSelector);\n }\n const canvas = document.getElementById(canvasSelector);\n if (!(canvas && canvas.getContext)) {\n throw new RuntimeError('UnsupportedBrowserError', 'This browser does not support HTML5 Canvas');\n }\n return canvas.getContext('2d');\n }\n /** Benchmark. Run function `f` once and report time elapsed shifted by `s` milliseconds. */\n // eslint-disable-next-line\n static benchmark(s, f) {\n const start_time = new Date().getTime();\n f();\n const elapsed = new Date().getTime() - start_time;\n log(s, elapsed + 'ms');\n }\n // Get stack trace.\n static stackTrace() {\n const err = new Error();\n return err.stack;\n }\n}\nVex.Flow = Flow;\n","export const CustomFont = {\n resolution: 1000,\n fontFamily: 'VexFlowCustom',\n glyphs: {\n noteheadSquareWhite: {\n x_min: 0,\n x_max: 430.75,\n ha: 386,\n o: 'm 0 200 l 0 -200 l 430 -200 l 430 200 l 0 200 l 50 150 l 380 150 l 380 -150 l 50 -150 l 50 150 ',\n },\n noteheadSquareBlack: {\n x_min: 0,\n x_max: 430.75,\n ha: 386,\n o: 'm 0 200 l 0 -200 l 430 -200 l 430 200 l 0 200 ',\n },\n accidentalBuyukMucennebFlat: {\n x_min: -171.5,\n x_max: 251.8125,\n ha: 257,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 553 20 616 20 614 b 20 491 20 503 20 491 l 20 491 b 153 535 47 501 149 535 b 174 514 167 535 174 524 b 164 496 174 508 171 501 b 92 470 164 495 132 484 l 20 445 l 20 390 b 20 363 20 378 20 370 b 20 333 20 340 20 333 l 20 333 b 153 377 47 344 149 377 b 174 356 167 377 174 367 b 164 338 174 349 171 342 b 92 312 164 338 132 326 l 20 288 l 20 219 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 30 -21 -212 -21 -212 b -21 273 -21 163 -21 273 b -84 252 -21 273 -50 263 b -152 230 -133 234 -145 230 b -157 231 -155 230 -156 231 b -171 252 -166 234 -171 244 b -160 270 -171 259 -167 266 b -27 316 -159 270 -93 294 l -21 319 l -21 374 b -21 431 -21 406 -21 431 b -84 409 -21 431 -50 421 b -152 388 -133 392 -145 388 b -157 390 -155 388 -156 388 b -171 409 -166 392 -171 401 b -160 428 -171 417 -167 424 b -27 474 -159 428 -93 451 l -21 476 l -21 546 b -20 620 -21 614 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ',\n },\n accidentalBakiyeFlat: {\n x_min: -176.9375,\n x_max: 251.8125,\n ha: 257,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 503 20 616 20 614 b 20 391 20 442 20 391 b 84 424 20 391 49 406 l 147 456 l 152 456 b 153 456 153 456 153 456 b 175 435 166 456 175 446 b 172 427 175 433 174 430 b 92 380 170 420 172 421 l 20 342 l 20 245 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 54 -21 -212 -21 -212 b -21 322 -21 201 -21 322 b -85 290 -21 322 -50 308 l -148 256 l -153 256 b -155 256 -155 256 -155 256 b -176 277 -167 256 -176 266 b -174 285 -176 280 -175 283 b -93 333 -171 294 -174 292 l -21 370 l -21 494 b -20 620 -21 616 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ',\n },\n accidentalKucukMucennebSharp: {\n x_min: -1.359375,\n x_max: 255.890625,\n ha: 261,\n o: 'm 118 514 b 127 517 121 517 122 517 b 147 505 136 517 142 513 l 148 502 l 148 403 b 148 306 148 351 148 306 b 174 315 149 306 160 310 l 200 324 l 205 323 b 223 312 213 323 220 319 l 225 308 l 225 260 b 225 245 225 255 225 249 b 220 204 225 208 224 209 b 179 188 216 199 215 199 l 148 177 l 148 124 l 148 70 l 189 84 b 236 98 219 94 230 98 b 247 94 240 98 243 97 b 255 52 254 88 255 87 b 255 33 255 47 255 40 l 254 -12 l 253 -15 b 249 -22 253 -18 250 -20 l 245 -24 l 196 -41 l 148 -58 l 148 -108 b 148 -158 148 -136 148 -158 b 174 -148 148 -158 160 -154 b 204 -140 198 -140 200 -140 l 204 -140 b 224 -152 213 -140 221 -145 b 225 -201 224 -155 225 -177 b 224 -254 225 -226 224 -251 b 157 -284 220 -262 220 -262 l 148 -288 l 148 -395 l 148 -503 l 147 -506 b 127 -519 142 -514 134 -519 b 107 -506 119 -519 111 -514 l 106 -503 l 106 -403 b 106 -303 106 -316 106 -303 b 104 -303 104 -303 104 -303 b 88 -310 104 -303 96 -306 l 63 -319 b 51 -322 59 -320 55 -322 b 36 -315 46 -322 40 -319 b 31 -273 32 -309 31 -312 b 31 -258 31 -269 31 -263 l 31 -210 l 34 -206 b 40 -198 35 -204 38 -199 b 74 -186 42 -197 57 -191 l 106 -173 l 106 -123 b 106 -97 106 -112 106 -104 b 106 -72 106 -76 106 -72 b 104 -72 106 -72 106 -72 b 20 -99 89 -79 23 -99 b 0 -84 10 -99 2 -93 b -1 -37 0 -81 -1 -59 b 0 11 -1 -15 0 9 b 58 40 4 22 2 22 l 106 56 l 106 109 b 106 123 106 115 106 119 b 106 162 106 147 106 162 b 81 155 106 162 93 159 b 50 147 65 149 55 147 b 36 152 43 147 40 148 b 31 194 32 158 31 156 b 31 209 31 198 31 204 l 31 256 l 34 260 b 76 281 38 269 38 269 l 106 292 l 106 396 l 106 502 l 107 505 b 118 514 110 509 114 513 ',\n },\n accidentalKoron: {\n x_min: -20,\n x_max: 320,\n ha: 257,\n o: 'm -8 200 b -8 210 8 200 16 200 l 20 148 -199 l 23 -615 b 0 -629 9 -629 6 -629 l -21 -612 l -21 -201 l -21 216 l -20 200 m 16 200 l 310 0 l 240 0 l 16 140 l 16 -120 l 240 0 l 310 0 l 16 -200 ',\n },\n accidentalSori: {\n x_min: -10.890625,\n x_max: 299.4375,\n ha: 294,\n o: 'm 44 174 b 51 174 47 174 49 174 b 68 173 55 174 61 174 l 287 112 l 551 40 b 615 20 617 22 609 23 b 626 0 622 16 626 8 b 615 -22 626 -9 622 -18 b 613 -23 613 -23 613 -23 b 613 -23 613 -23 613 -23 b 287 -113 613 -24 597 -29 l 68 -174 b 53 -176 61 -176 57 -176 b 39 -172 47 -176 43 -174 b 27 -151 31 -167 27 -159 b 39 -129 27 -141 31 -133 b 230 -74 43 -124 20 -131 l 370 -36 l 468 -9 b 498 0 484 -4 498 -1 b 468 8 498 0 484 2 l 370 34 l 230 73 b 40 126 28 129 43 124 b 27 149 31 131 27 140 b 44 174 27 161 34 170 m 205 110 l 205 300 b 205 330 245 330 245 300 l 245 300 l 245 -300 b 245 -330 205 -330 205 -300 l 205 -300 l 205 110 l 345 90 m 345 90 l 345 330 b 345 360 385 360 385 330 l 385 330 l 385 -270 b 385 -300 345 -300 345 -270 l 345 -270 l 345 90 ',\n },\n vexAccidentalMicrotonal2: {\n x_min: -1.359375,\n x_max: 386.5625,\n ha: 394,\n o: 'm 249 535 b 257 537 251 537 253 537 b 276 524 266 537 273 533 l 277 521 l 279 419 l 279 316 l 304 323 b 337 328 319 326 330 328 b 353 316 347 328 349 324 b 355 266 355 315 355 290 b 353 215 355 241 355 217 b 319 198 349 206 347 205 b 279 187 284 190 279 188 b 279 156 279 187 279 174 b 279 136 279 151 279 144 l 279 84 l 289 87 l 330 98 b 367 105 352 102 362 105 b 378 101 372 105 375 104 b 386 61 385 95 386 94 b 386 40 386 55 386 48 l 386 -5 l 385 -8 b 374 -19 383 -12 378 -18 b 291 -40 372 -19 347 -26 b 279 -43 284 -41 279 -43 b 279 -83 279 -43 279 -59 b 279 -95 279 -87 279 -91 l 279 -145 l 304 -140 b 337 -133 321 -136 330 -133 b 349 -140 343 -133 347 -136 b 355 -181 355 -145 355 -142 l 355 -197 l 355 -210 b 349 -252 355 -249 355 -247 b 300 -269 345 -258 347 -258 b 280 -274 291 -272 281 -273 l 279 -274 l 277 -378 l 277 -483 l 276 -487 b 257 -499 273 -495 265 -499 b 238 -487 249 -499 242 -495 l 236 -483 l 236 -384 l 236 -285 l 235 -285 l 212 -291 l 170 -301 b 148 -308 159 -305 148 -306 b 147 -415 147 -308 147 -313 l 147 -523 l 145 -526 b 126 -538 141 -534 133 -538 b 106 -526 118 -538 110 -534 l 104 -523 l 104 -420 b 103 -317 104 -326 104 -317 b 103 -317 103 -317 103 -317 b 50 -330 92 -322 54 -330 b 31 -317 42 -330 35 -326 b 29 -267 29 -315 29 -315 l 29 -219 l 32 -216 b 92 -192 36 -206 36 -206 l 104 -190 l 104 -138 b 103 -87 104 -91 104 -87 b 103 -87 103 -87 103 -87 b 88 -91 103 -87 96 -88 l 49 -101 b 17 -106 32 -105 23 -106 b 6 -102 13 -106 10 -105 b -1 -62 0 -97 -1 -95 b 0 -41 -1 -56 0 -49 l 0 4 l 1 6 b 10 16 2 11 6 15 b 91 37 12 18 38 24 l 104 41 l 104 93 b 103 144 104 140 104 144 b 103 144 103 144 103 144 b 50 131 92 141 54 131 b 31 144 42 131 35 137 b 29 195 29 147 29 148 l 29 242 l 32 245 b 92 269 36 255 36 255 l 104 273 l 104 377 l 104 481 l 106 485 b 126 498 110 492 118 498 b 134 495 129 498 132 496 b 145 485 138 494 142 489 l 147 481 l 147 383 l 147 283 l 152 284 b 190 294 155 285 171 290 l 230 303 l 236 305 l 236 413 l 236 521 l 238 524 b 249 535 240 528 243 533 m 236 126 b 235 177 236 154 236 177 l 235 177 b 213 172 235 177 225 174 l 170 161 b 147 155 157 158 147 155 b 147 124 147 155 147 142 b 147 102 147 117 147 111 l 147 52 l 153 54 l 228 72 l 236 74 l 236 126 m 236 -105 b 235 -54 236 -65 236 -54 l 235 -54 b 231 -55 235 -54 234 -54 b 172 -69 227 -55 204 -62 l 149 -76 l 147 -76 l 147 -127 l 147 -179 l 152 -177 b 190 -167 155 -177 171 -173 l 230 -158 l 236 -156 l 236 -105 ',\n },\n vexAccidentalMicrotonal3: {\n x_min: 0,\n x_max: 430.75,\n ha: 360,\n o: 'm -146 537 b -138 538 -143 538 -141 538 b -118 525 -129 538 -121 533 b -117 390 -117 522 -117 521 b -115 259 -117 268 -117 259 b -115 259 -115 259 -115 259 b -59 272 -104 263 -62 272 b -39 259 -50 272 -42 267 b -37 209 -38 257 -37 233 b -39 159 -37 185 -38 162 b -85 138 -43 149 -44 149 l -117 131 l -117 21 b -115 -88 -117 -80 -117 -88 b -115 -88 -115 -88 -115 -88 b -59 -75 -104 -84 -62 -75 b -44 -81 -52 -75 -48 -77 b -38 -124 -38 -87 -38 -85 b -38 -138 -38 -124 -38 -138 b -38 -152 -38 -138 -38 -152 b -44 -195 -38 -191 -38 -190 b -85 -209 -48 -200 -48 -200 l -117 -217 l -117 -349 b -118 -486 -117 -481 -117 -482 b -138 -499 -121 -494 -129 -499 b -153 -493 -143 -499 -149 -497 b -159 -415 -158 -487 -159 -496 b -159 -355 -159 -398 -159 -379 b -159 -227 -159 -284 -159 -227 b -205 -238 -159 -227 -180 -232 b -250 -249 -230 -244 -250 -249 b -251 -386 -251 -249 -251 -311 b -252 -525 -251 -521 -251 -522 b -272 -538 -255 -534 -264 -538 b -287 -532 -277 -538 -283 -536 b -293 -452 -292 -527 -293 -536 b -293 -391 -293 -436 -293 -415 b -294 -260 -293 -269 -293 -260 b -294 -260 -294 -260 -294 -260 b -348 -272 -306 -264 -345 -272 b -368 -259 -357 -272 -365 -267 b -369 -209 -369 -257 -369 -233 b -368 -159 -369 -185 -369 -162 b -323 -139 -364 -149 -362 -148 l -293 -131 l -293 -22 b -294 87 -293 80 -293 87 b -294 87 -294 87 -294 87 b -348 75 -306 84 -345 75 b -368 88 -357 75 -365 80 b -369 138 -369 91 -369 114 b -368 188 -369 162 -369 186 b -323 209 -364 198 -362 199 l -293 216 l -293 349 b -292 486 -293 481 -293 482 b -272 499 -288 494 -280 499 b -257 493 -266 499 -261 497 b -251 414 -251 487 -251 496 b -251 354 -251 398 -251 378 b -251 226 -251 284 -251 226 b -205 238 -250 226 -230 231 b -159 249 -180 244 -159 249 b -159 385 -159 249 -159 310 b -157 525 -159 521 -159 522 b -146 537 -156 530 -151 535 z m -159 11 b -159 120 -159 98 -159 120 l -159 120 b -175 116 -160 120 -167 119 b -221 105 -184 114 -204 109 l -251 98 l -251 -12 b -251 -121 -251 -72 -251 -121 b -205 -110 -250 -121 -230 -116 b -159 -99 -180 -104 -159 -99 b -159 11 -159 -99 -159 -49 z m 89 517 b 97 519 92 518 94 519 b 117 505 106 519 114 513 b 119 376 119 502 119 501 l 119 249 l 145 258 b 176 267 169 266 172 267 b 177 267 176 267 177 267 b 196 255 186 267 192 263 l 197 252 l 197 205 b 197 181 197 195 197 187 b 193 149 197 153 197 153 b 152 131 190 144 187 143 l 119 120 l 119 10 b 119 -100 119 -62 119 -100 b 145 -91 120 -100 131 -96 b 173 -82 159 -86 171 -82 b 176 -81 174 -81 175 -81 b 196 -94 185 -81 193 -87 b 198 -151 197 -97 198 -125 b 197 -194 198 -172 197 -192 b 153 -218 193 -203 192 -204 l 119 -230 l 119 -367 l 118 -504 l 117 -507 b 97 -519 113 -514 105 -519 b 82 -512 92 -519 87 -517 b 76 -434 77 -507 76 -516 b 76 -374 76 -418 76 -398 b 76 -245 76 -303 76 -245 b 52 -254 76 -245 65 -249 b 19 -263 34 -260 25 -263 b 6 -257 13 -263 10 -261 b 0 -214 0 -251 0 -253 b 0 -200 0 -210 0 -205 b 0 -188 0 -196 0 -192 b 6 -143 0 -147 0 -149 b 46 -126 10 -139 10 -139 l 76 -115 l 76 -5 b 76 106 76 56 76 106 b 51 98 76 106 64 102 b 18 89 34 92 25 89 b 6 95 13 89 10 91 b 0 139 0 101 0 99 b 0 153 0 143 0 148 b 0 179 0 163 0 172 b 44 225 0 215 3 211 l 76 236 l 76 369 b 78 505 76 501 76 502 b 89 517 80 510 85 515 z ',\n },\n vexAccidentalMicrotonal4: {\n x_min: 0,\n x_max: 430.75,\n ha: 360,\n o: 'm 283 633 b 291 634 286 634 289 634 b 311 621 300 634 308 629 b 313 505 313 618 313 617 b 313 393 313 443 313 393 b 378 425 313 393 343 407 l 443 458 l 448 458 b 449 458 449 458 449 458 b 471 437 462 458 471 448 b 469 429 471 434 470 432 b 387 382 466 421 469 423 l 313 344 l 313 247 l 313 150 l 315 152 b 433 201 353 184 394 201 b 479 193 448 201 464 198 b 549 86 524 177 549 135 b 526 1 549 59 541 29 b 395 -143 504 -39 475 -71 b 316 -214 351 -182 341 -191 b 292 -229 302 -228 300 -229 b 272 -216 283 -229 275 -224 b 271 55 271 -212 271 -212 b 270 323 271 203 270 323 b 205 291 270 323 241 308 l 140 258 l 135 258 b 134 258 135 258 134 258 b 112 279 121 258 112 267 b 114 287 112 281 113 284 b 196 334 117 295 114 293 l 271 371 l 271 495 b 272 621 271 617 271 618 b 283 633 274 626 279 631 z m 404 133 b 391 134 400 134 395 134 b 384 134 388 134 386 134 b 318 88 358 130 335 114 l 313 81 l 313 -37 l 313 -156 l 316 -152 b 439 83 391 -71 439 22 l 439 84 b 404 133 439 115 430 128 z m -8 633 l -8 633 b 0 634 -6 634 -3 634 b 20 621 8 634 17 629 b 21 384 21 618 21 617 l 21 150 l 24 152 b 141 201 62 184 102 201 b 187 193 157 201 172 198 b 257 86 232 177 257 135 b 234 1 257 59 250 29 b 103 -143 212 -39 183 -71 b 24 -214 60 -182 49 -191 b 0 -229 10 -228 8 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 203 l -21 618 l -20 621 b -8 633 -18 626 -13 631 z m 113 133 l 113 133 b 99 134 109 134 103 134 b 93 134 97 134 94 134 b 26 88 66 130 43 114 l 21 81 l 21 -37 l 21 -156 l 25 -152 b 148 83 99 -71 148 22 l 148 84 b 113 133 148 115 138 128 z ',\n },\n vexNoteHeadRectBlack: {\n x_min: 0,\n x_max: 430.75,\n ha: 360,\n o: 'm 0 150 l 0 -150 l 430 -150 l 430 150 l 0 150 ',\n },\n vexNoteHeadRectWhite: {\n x_min: 0,\n x_max: 430.75,\n ha: 360,\n o: 'm 0 150 l 0 -150 l 430 -150 l 430 150 l 0 150 l 50 100 l 380 100 l 380 -100 l 50 -100 l 50 100',\n },\n },\n};\n","export const CustomMetrics = {\n name: 'VexFlowCustom',\n smufl: false,\n glyphs: {},\n};\n","export const GonvilleFont = {\n glyphs: {\n bracketTop: {\n x_min: 0,\n x_max: 559.421875,\n ha: 571,\n o: 'm 544 204 b 548 204 545 204 547 204 b 559 194 555 204 559 199 b 559 190 559 192 559 191 b 530 156 559 188 556 184 b 462 86 510 134 481 104 b 453 76 458 81 454 77 l 446 70 l 441 65 b 434 59 439 63 436 61 l 427 54 b 409 37 426 51 416 44 b 392 23 398 29 394 26 b 387 19 389 22 387 20 b 379 13 386 19 383 16 l 371 8 l 367 5 l 359 -1 l 337 -16 b 285 -48 319 -29 298 -41 l 279 -52 b 186 -95 255 -66 210 -87 l 175 -99 b 23 -129 127 -117 68 -129 b 17 -129 20 -129 19 -129 b 1 -123 2 -129 2 -129 b 0 -49 0 -122 0 -83 b 0 4 0 -22 0 1 b 27 11 2 9 4 9 b 185 31 78 12 145 20 b 198 34 186 31 193 33 b 314 73 234 44 277 58 b 349 88 328 79 340 84 b 353 90 352 90 353 90 b 363 94 353 90 357 93 b 371 98 367 97 371 98 b 428 129 372 98 413 120 b 461 148 441 136 454 144 b 468 151 464 149 466 151 b 472 154 469 152 470 154 b 481 161 473 155 477 158 b 525 190 490 166 518 186 l 534 197 b 540 201 536 198 539 199 b 544 204 541 202 544 204 ',\n },\n bracketBottom: {\n x_min: 0,\n x_max: 559.421875,\n ha: 571,\n o: 'm 5 127 b 14 127 6 127 9 127 b 51 126 25 127 43 127 b 175 98 93 122 138 112 l 186 94 b 279 51 210 86 255 65 b 285 47 280 51 283 48 b 319 27 291 44 311 31 l 326 22 b 359 0 332 19 352 4 l 367 -6 b 371 -9 368 -6 370 -8 l 379 -15 b 387 -22 383 -18 386 -20 l 398 -30 l 411 -40 l 417 -47 l 427 -55 l 434 -61 b 441 -66 436 -62 439 -65 l 446 -72 l 453 -77 l 462 -87 b 558 -188 490 -113 549 -176 b 559 -195 559 -191 559 -194 b 548 -205 559 -201 555 -205 b 541 -204 547 -205 544 -205 b 534 -198 539 -201 536 -199 l 525 -191 b 481 -162 518 -187 490 -167 b 472 -155 477 -159 472 -156 b 468 -152 470 -155 469 -154 b 461 -149 466 -152 464 -151 b 428 -130 454 -145 441 -137 b 371 -99 413 -122 372 -99 b 363 -95 371 -99 367 -98 b 353 -91 357 -94 353 -91 b 348 -90 353 -91 352 -91 b 332 -81 343 -87 341 -86 b 27 -12 230 -37 127 -13 b 0 -5 4 -11 2 -11 b 0 58 0 -2 0 27 b 0 122 0 88 0 120 b 5 127 1 124 4 126 ',\n },\n barlineTick: {\n x_min: -80.3125,\n x_max: 78.9375,\n ha: 81,\n o: 'm 63 191 b 69 192 65 192 66 192 b 77 188 72 192 76 191 b 78 183 78 187 78 186 b 74 158 78 179 77 172 l 66 115 b 9 -161 49 30 10 -158 b -10 -187 6 -172 -1 -181 b -34 -194 -17 -191 -25 -194 b -80 -147 -58 -194 -80 -174 b -80 -141 -80 -144 -80 -142 b 9 70 -80 -134 -73 -117 l 49 163 b 63 191 59 188 61 190 ',\n },\n breathMarkTick: {\n x_min: -80.3125,\n x_max: 78.9375,\n ha: 81,\n o: 'm 63 191 b 69 192 65 192 66 192 b 77 188 72 192 76 191 b 78 183 78 187 78 186 b 74 158 78 179 77 172 l 66 115 b 9 -161 49 30 10 -158 b -10 -187 6 -172 -1 -181 b -34 -194 -17 -191 -25 -194 b -80 -147 -58 -194 -80 -174 b -80 -141 -80 -144 -80 -142 b 9 70 -80 -134 -73 -117 l 49 163 b 63 191 59 188 61 190 ',\n },\n segno: {\n x_min: -330.75,\n x_max: 329.390625,\n ha: 336,\n o: 'm -133 483 b -117 484 -127 484 -122 484 b 31 373 -51 484 9 440 b 35 348 34 365 35 356 b -25 285 35 313 10 285 b -87 331 -55 285 -76 302 b -167 402 -100 376 -133 402 b -191 398 -175 402 -183 401 b -227 341 -215 388 -227 369 b -225 320 -227 334 -227 327 b -13 74 -209 230 -125 133 b 6 65 -4 70 5 66 l 9 63 l 10 65 b 117 231 12 68 40 112 l 189 341 l 242 424 b 268 460 262 456 264 458 b 283 464 273 463 277 464 b 308 438 296 464 308 453 l 308 437 b 287 396 308 430 308 428 l 95 98 l 59 43 l 58 41 l 65 37 b 253 -156 151 -8 217 -77 b 281 -285 272 -199 281 -244 b 148 -481 281 -381 231 -463 b 115 -485 137 -484 126 -485 b -32 -376 51 -485 -9 -442 b -36 -349 -35 -366 -36 -358 b 25 -287 -36 -315 -12 -287 b 85 -333 54 -287 74 -302 b 166 -403 99 -377 133 -403 b 190 -399 174 -403 182 -402 b 225 -342 215 -390 225 -370 b 224 -322 225 -335 225 -328 b 12 -76 208 -231 125 -134 b -8 -66 2 -72 -6 -68 l -10 -65 l -12 -66 b -118 -231 -13 -68 -42 -113 l -190 -342 l -243 -426 b -269 -462 -264 -458 -265 -458 b -284 -466 -274 -464 -279 -466 b -310 -440 -298 -466 -310 -455 l -310 -438 b -288 -398 -310 -430 -308 -430 l -96 -99 l -59 -44 l -59 -43 l -66 -38 b -281 284 -198 33 -281 158 l -281 284 b -133 483 -281 392 -220 474 m 254 177 b 266 179 258 177 262 179 b 319 149 287 179 307 167 b 329 115 326 140 329 127 b 319 79 329 102 326 90 b 268 51 307 61 287 51 b 221 72 250 51 234 58 b 205 115 210 84 205 99 b 254 177 205 142 223 170 m -281 -54 b -269 -52 -277 -52 -273 -52 b -223 -73 -253 -52 -235 -59 b -206 -116 -212 -84 -206 -101 b -216 -151 -206 -129 -209 -141 b -269 -179 -228 -170 -249 -179 b -314 -159 -285 -179 -302 -173 b -330 -116 -325 -147 -330 -131 b -281 -54 -330 -88 -313 -61 ',\n },\n coda: {\n x_min: -311.6875,\n x_max: 310.328125,\n ha: 317,\n o: 'm -9 388 b -2 390 -8 390 -5 390 b 5 388 1 390 4 390 b 19 378 10 387 16 383 b 23 333 23 371 23 371 b 24 298 23 299 24 298 b 81 276 34 298 65 285 b 213 91 145 240 190 177 b 224 24 217 76 224 36 b 257 24 224 24 235 24 b 299 19 292 24 292 24 b 310 -1 306 15 310 6 b 299 -23 310 -11 306 -19 b 257 -27 292 -27 292 -27 b 224 -29 235 -27 224 -29 b 213 -95 224 -40 217 -80 b 81 -280 190 -181 145 -244 b 24 -301 65 -290 34 -301 b 23 -335 24 -301 23 -303 l 23 -340 b 17 -381 23 -374 23 -374 b -1 -391 13 -388 5 -391 b -21 -381 -9 -391 -17 -388 b -27 -340 -27 -374 -27 -374 l -27 -335 b -28 -301 -27 -303 -27 -301 b -85 -280 -38 -301 -69 -290 b -217 -95 -149 -244 -194 -181 b -228 -29 -221 -80 -228 -40 b -259 -27 -228 -29 -238 -27 b -300 -23 -294 -27 -294 -27 b -311 -2 -307 -19 -311 -11 b -294 23 -311 8 -304 19 b -259 24 -291 23 -284 24 b -228 24 -239 24 -228 24 b -217 91 -228 36 -221 76 b -85 276 -194 177 -149 240 b -28 298 -69 285 -38 298 b -27 333 -27 298 -27 299 b -27 371 -27 362 -27 369 b -9 388 -24 378 -17 385 m -27 136 b -28 247 -27 197 -28 247 b -61 216 -31 247 -53 226 b -123 33 -95 172 -121 98 l -125 24 l -76 24 l -27 24 l -27 136 m 29 242 b 24 247 27 245 24 247 b 23 136 24 247 23 197 l 23 24 l 72 24 l 121 24 l 119 33 b 29 242 115 116 77 206 m -27 -140 l -27 -27 l -76 -27 l -125 -27 l -123 -36 b -61 -220 -121 -102 -95 -176 b -28 -251 -53 -230 -31 -251 b -27 -140 -28 -251 -27 -201 m 119 -36 l 121 -27 l 72 -27 l 23 -27 l 23 -140 b 24 -251 23 -201 24 -251 b 57 -220 27 -251 49 -230 b 119 -36 91 -176 117 -102 ',\n },\n gClef: {\n x_min: -1.359375,\n x_max: 847.96875,\n ha: 865,\n o: 'm 488 1499 b 495 1500 490 1500 492 1500 b 541 1465 507 1500 521 1490 b 679 1078 622 1372 679 1210 b 677 1050 679 1068 677 1060 b 477 642 668 893 604 764 l 443 609 l 431 596 l 431 592 l 438 562 l 449 508 l 460 458 b 481 355 475 390 481 355 b 481 355 481 355 481 355 b 490 356 481 355 485 355 b 528 358 495 356 511 358 b 558 356 540 358 552 356 b 839 95 699 338 808 237 b 847 22 845 72 847 47 b 631 -303 847 -113 766 -242 b 620 -309 623 -308 620 -309 l 620 -310 b 631 -359 620 -310 626 -333 l 646 -435 l 660 -496 b 672 -588 668 -535 672 -563 b 664 -653 672 -610 669 -630 b 383 -875 630 -792 509 -875 b 201 -810 321 -875 257 -855 b 129 -680 151 -768 129 -730 b 274 -530 129 -592 200 -530 b 351 -553 300 -530 326 -538 b 412 -669 393 -582 412 -626 b 287 -805 412 -735 366 -800 l 279 -805 l 285 -809 b 383 -830 318 -823 351 -830 b 586 -718 464 -830 540 -789 b 626 -584 612 -678 626 -631 b 619 -528 626 -566 623 -548 b 612 -495 619 -526 616 -510 b 577 -324 590 -387 577 -324 b 577 -324 577 -324 577 -324 b 568 -326 575 -324 571 -324 b 528 -334 558 -328 537 -333 b 465 -338 506 -337 485 -338 b 24 -11 269 -338 87 -206 b -1 145 8 41 -1 93 b 96 442 -1 249 32 351 b 322 714 166 541 236 626 l 352 745 l 345 782 l 332 843 l 315 921 b 303 984 310 950 304 978 b 295 1082 298 1017 295 1049 b 413 1426 295 1208 336 1329 b 488 1499 436 1456 477 1496 m 549 1301 b 541 1301 547 1301 544 1301 b 411 1207 500 1301 447 1263 b 355 1004 374 1152 355 1079 b 359 942 355 984 356 963 b 371 881 362 927 363 917 l 385 818 b 392 782 389 799 392 784 l 392 782 b 434 828 393 782 424 816 b 607 1165 534 941 594 1060 b 608 1193 608 1175 608 1183 b 597 1270 608 1224 604 1254 b 549 1301 589 1286 571 1299 m 398 528 b 393 555 396 542 393 553 b 392 555 393 555 393 555 b 317 470 390 555 347 505 b 190 298 266 408 212 334 b 127 70 148 227 127 148 b 155 -77 127 19 137 -30 b 468 -303 209 -216 333 -303 b 519 -299 484 -303 502 -302 b 568 -284 541 -295 568 -287 l 568 -284 b 563 -263 568 -284 566 -274 l 534 -120 l 511 -13 l 496 61 l 480 133 b 469 187 472 176 469 187 b 468 188 469 187 469 188 b 416 162 462 188 430 172 b 337 13 364 126 337 69 b 413 -124 337 -40 363 -93 b 428 -144 424 -131 428 -137 b 428 -149 428 -145 428 -148 b 409 -166 426 -161 419 -166 b 394 -162 405 -166 400 -165 b 240 77 302 -122 240 -27 l 240 77 b 430 342 240 197 315 301 l 436 344 l 426 394 l 398 528 m 548 194 b 526 195 540 195 532 195 b 519 195 524 195 521 195 l 514 195 l 518 177 l 539 79 l 552 15 l 566 -48 l 594 -187 l 605 -240 b 612 -266 609 -254 611 -266 b 612 -266 612 -266 612 -266 b 641 -248 613 -266 630 -256 b 744 -98 692 -212 730 -156 b 751 -40 749 -79 751 -59 b 548 194 751 76 665 181 ',\n },\n cClef: {\n x_min: 0,\n x_max: 873.828125,\n ha: 892,\n o: 'm 0 0 l 0 703 l 81 703 l 164 703 l 164 0 l 164 -705 l 81 -705 l 0 -705 l 0 0 m 225 0 l 225 703 l 246 703 l 268 703 l 268 366 l 268 30 l 274 36 b 314 79 284 44 302 63 b 413 302 357 137 392 213 b 432 327 419 324 421 327 b 449 306 443 327 447 322 b 611 115 457 195 529 115 b 651 122 624 115 638 117 b 728 316 705 140 724 188 b 729 388 728 342 729 366 b 671 635 729 533 711 602 b 581 662 649 652 616 662 b 477 637 545 662 510 653 l 475 635 l 477 634 b 503 627 488 632 495 631 b 545 556 532 612 545 584 b 491 480 545 524 526 491 b 465 474 481 476 473 474 b 379 563 417 474 379 516 b 389 602 379 576 382 588 b 541 691 409 641 479 681 b 582 694 555 692 568 694 b 865 462 714 694 834 598 b 873 392 871 440 873 416 b 865 317 873 367 871 341 b 639 84 839 194 748 101 b 612 83 630 83 620 83 b 511 116 577 83 543 94 b 504 120 509 119 506 120 b 504 120 504 120 504 120 b 469 59 504 120 488 93 l 432 -1 l 469 -61 b 504 -122 488 -94 504 -122 b 504 -122 504 -122 504 -122 b 511 -117 506 -122 509 -120 b 612 -84 543 -95 577 -84 b 665 -91 630 -84 647 -87 b 869 -338 771 -122 850 -216 b 873 -392 872 -356 873 -374 b 798 -595 873 -469 847 -539 b 581 -695 741 -662 660 -695 b 406 -626 517 -695 454 -671 b 381 -563 389 -607 381 -585 b 465 -477 381 -519 413 -477 b 545 -559 514 -477 545 -519 b 503 -628 545 -587 532 -613 b 477 -635 495 -632 488 -634 l 475 -637 l 477 -638 b 581 -663 510 -655 545 -663 b 671 -637 616 -663 649 -653 b 729 -391 711 -603 729 -534 b 728 -317 729 -367 728 -344 b 623 -117 722 -173 698 -124 b 611 -116 619 -116 615 -116 b 449 -308 528 -116 457 -198 b 432 -328 447 -323 443 -328 b 413 -303 421 -328 419 -326 b 314 -80 392 -215 357 -138 b 274 -37 302 -65 284 -45 l 268 -31 l 268 -367 l 268 -705 l 246 -705 l 225 -705 l 225 0 ',\n },\n fClef: {\n x_min: -1.359375,\n x_max: 899.703125,\n ha: 918,\n o: 'm 307 349 b 332 351 315 351 323 351 b 443 340 367 351 408 347 b 741 47 607 306 720 195 b 744 0 743 31 744 16 b 660 -303 744 -90 713 -206 b 28 -755 534 -531 304 -695 b 14 -756 23 -755 19 -756 b -1 -741 4 -756 -1 -750 b 21 -720 -1 -731 1 -728 b 567 -56 337 -601 548 -344 b 568 -11 568 -41 568 -24 b 442 285 568 129 525 233 b 325 319 406 308 367 319 b 93 177 232 319 137 266 b 84 154 91 170 84 155 b 84 154 84 154 84 154 b 88 156 84 154 85 155 b 159 177 110 170 134 177 b 257 134 194 177 231 162 b 294 41 281 108 294 73 b 171 -97 294 -24 246 -90 b 156 -98 166 -97 161 -98 b 6 74 73 -98 6 -22 b 6 80 6 76 6 79 b 307 349 10 223 141 340 m 839 215 b 845 216 841 216 842 216 b 862 213 852 216 860 215 b 899 163 887 206 899 184 b 872 117 899 145 890 127 b 847 111 865 112 856 111 b 808 130 833 111 818 117 b 796 162 800 140 796 151 b 839 215 796 187 812 212 m 839 -112 b 845 -112 841 -112 842 -112 b 862 -115 852 -112 860 -113 b 899 -165 887 -122 899 -144 b 872 -210 899 -183 890 -201 b 847 -217 865 -215 856 -217 b 808 -198 833 -217 818 -210 b 796 -165 800 -188 796 -177 b 839 -112 796 -140 812 -116 ',\n },\n unpitchedPercussionClef1: {\n x_min: 0,\n x_max: 464.140625,\n ha: 474,\n o: 'm 0 0 l 0 347 l 76 347 l 153 347 l 153 0 l 153 -348 l 76 -348 l 0 -348 l 0 0 m 308 -1 l 308 347 l 386 347 l 464 347 l 464 -1 l 464 -348 l 386 -348 l 308 -348 l 308 -1 ',\n },\n '6stringTabClef': {\n x_min: -1.359375,\n x_max: 680.5625,\n ha: 694,\n o: 'm 597 1042 b 604 1042 600 1042 602 1042 b 642 1002 627 1042 642 1022 b 619 966 642 988 635 974 b 439 927 574 942 503 927 l 426 927 l 426 921 b 430 838 428 893 430 866 b 345 480 430 696 398 560 b 179 391 307 423 249 391 b 156 392 171 391 164 392 b 138 394 149 394 142 394 b 103 434 115 396 103 416 b 129 471 103 451 111 466 b 141 474 133 473 137 474 b 172 459 153 474 164 469 b 181 455 175 456 176 455 b 187 456 182 455 185 455 b 253 520 212 460 234 483 b 315 836 294 605 315 714 b 311 928 315 867 314 898 b 302 945 310 943 311 942 b 245 953 283 950 262 953 b 130 891 193 953 149 931 b 84 860 119 870 102 860 b 36 905 61 860 39 877 b 36 910 36 907 36 909 b 80 970 36 931 50 949 b 249 1017 125 1000 187 1017 b 322 1009 273 1017 299 1014 l 341 1003 b 436 991 372 995 406 991 b 577 1031 495 991 545 1004 b 597 1042 583 1038 590 1041 m 416 360 b 424 360 419 360 421 360 b 481 309 454 360 479 338 b 503 145 484 280 495 199 b 585 -185 525 16 555 -106 b 630 -245 596 -213 613 -237 l 634 -247 l 638 -245 b 647 -244 641 -245 645 -244 b 680 -278 666 -244 680 -262 b 664 -308 680 -290 675 -301 b 638 -312 658 -310 650 -312 b 613 -309 631 -312 623 -310 b 477 -201 555 -303 502 -260 b 417 -2 460 -159 434 -72 b 416 5 417 1 416 5 b 416 5 416 5 416 5 b 411 -5 415 5 413 0 b 359 -97 397 -33 377 -70 b 353 -106 355 -102 353 -105 b 359 -112 353 -108 355 -109 b 409 -130 375 -123 390 -129 b 426 -134 420 -130 421 -131 b 431 -147 428 -137 431 -141 b 420 -162 431 -152 427 -159 b 382 -169 409 -166 396 -169 b 323 -155 363 -169 341 -165 l 317 -152 l 314 -155 b 62 -303 240 -240 148 -295 b 36 -305 55 -305 44 -305 b 23 -303 29 -305 24 -305 b -1 -273 6 -299 -1 -287 b 31 -240 -1 -256 10 -240 b 36 -240 32 -240 34 -240 b 42 -241 38 -241 39 -241 b 134 -204 63 -241 99 -226 b 367 288 265 -115 357 81 b 375 330 368 313 370 320 b 416 360 383 347 400 358 m 360 -359 b 379 -359 363 -359 371 -359 b 424 -360 396 -359 416 -359 b 646 -502 536 -373 624 -430 b 649 -527 649 -510 649 -519 b 530 -673 649 -578 604 -635 l 521 -677 l 529 -681 b 653 -811 592 -714 637 -762 b 660 -853 658 -827 660 -839 b 645 -911 660 -873 656 -892 b 426 -1021 608 -981 519 -1021 b 283 -989 377 -1021 328 -1011 b 235 -949 249 -972 239 -964 b 234 -936 234 -946 234 -941 b 234 -928 234 -934 234 -931 l 235 -925 l 234 -927 l 225 -934 b 87 -982 186 -966 138 -982 b 80 -982 85 -982 83 -982 b 55 -981 70 -981 58 -981 b 17 -943 32 -981 17 -964 b 54 -904 17 -921 35 -904 b 78 -914 62 -904 72 -909 l 83 -918 l 88 -918 b 190 -831 122 -918 166 -881 b 269 -506 242 -727 269 -612 b 268 -462 269 -492 269 -477 b 266 -449 266 -458 266 -452 b 265 -444 266 -445 266 -444 b 257 -446 264 -444 261 -445 b 132 -545 196 -470 152 -505 b 88 -573 122 -563 104 -573 b 39 -523 63 -573 39 -553 b 63 -476 39 -505 44 -494 b 360 -359 136 -408 235 -369 m 419 -424 b 393 -423 411 -423 406 -423 l 375 -423 l 377 -426 b 379 -439 377 -427 378 -434 b 383 -510 382 -463 383 -487 b 314 -811 383 -609 360 -710 b 266 -893 296 -850 285 -870 b 264 -898 265 -896 264 -898 l 264 -898 b 264 -898 264 -898 264 -898 b 268 -898 264 -898 266 -898 b 273 -898 270 -898 272 -898 b 300 -909 283 -898 291 -900 b 426 -957 340 -941 385 -957 b 476 -949 443 -957 460 -954 b 547 -853 522 -931 547 -893 b 485 -745 547 -816 526 -775 b 397 -707 460 -727 432 -714 b 366 -675 375 -703 366 -692 b 396 -642 366 -657 377 -645 b 530 -557 455 -637 511 -601 b 536 -527 534 -548 536 -537 b 419 -424 536 -480 490 -437 ',\n },\n timeSig0: {\n x_min: 0,\n x_max: 514.5,\n ha: 525,\n o: 'm 236 648 b 246 648 238 648 242 648 b 288 646 261 648 283 648 b 472 513 364 634 428 587 b 514 347 502 464 514 413 b 462 163 514 272 499 217 b 257 44 409 83 333 44 b 50 163 181 44 103 83 b 0 347 14 217 0 272 b 40 513 0 413 12 464 b 236 648 87 591 155 638 m 277 614 b 253 616 273 616 261 616 b 242 616 247 616 243 616 b 170 499 193 609 181 589 b 159 348 163 446 159 398 b 166 222 159 308 161 266 b 201 91 174 138 183 106 b 257 76 215 81 235 76 b 311 91 277 76 299 81 b 347 222 330 106 338 138 b 353 348 352 266 353 308 b 344 499 353 398 351 446 b 277 614 333 587 322 606 m 257 -1 l 258 -1 l 255 -1 l 257 -1 m 257 673 l 258 673 l 255 673 l 257 673 ',\n },\n timeSig1: {\n x_min: -1.359375,\n x_max: 344.359375,\n ha: 351,\n o: 'm 126 637 l 129 638 l 198 638 l 266 638 l 269 635 b 274 631 272 634 273 632 l 277 627 l 277 395 b 279 156 277 230 277 161 b 329 88 281 123 295 106 b 344 69 341 81 344 79 b 337 55 344 62 343 59 l 333 54 l 197 54 l 61 54 l 58 55 b 50 69 53 59 50 62 b 65 88 50 79 53 81 b 80 97 72 91 74 93 b 117 156 103 113 112 129 b 117 345 117 161 117 222 l 117 528 l 100 503 l 38 406 b 14 383 24 384 23 383 b -1 398 5 383 -1 390 b 4 415 -1 403 1 409 b 16 437 5 416 10 426 l 72 539 l 100 596 b 121 632 119 631 119 631 b 126 637 122 634 125 635 m 171 -1 l 172 -1 l 170 -1 l 171 -1 m 171 673 l 172 673 l 170 673 l 171 673 ',\n },\n timeSig2: {\n x_min: -1.359375,\n x_max: 458.6875,\n ha: 468,\n o: 'm 197 648 b 216 648 201 648 208 648 b 258 646 232 648 253 648 b 419 546 333 637 393 599 b 432 489 428 528 432 509 b 356 342 432 440 405 384 b 235 278 322 313 288 295 b 69 170 166 256 107 217 b 69 169 69 170 69 169 b 69 169 69 169 69 169 b 74 173 69 169 72 170 b 209 222 112 204 163 222 b 310 195 247 222 274 215 b 371 179 332 184 352 179 b 396 181 379 179 387 179 b 428 202 409 184 423 194 b 442 212 431 209 436 212 b 458 197 450 212 458 206 b 441 148 458 190 449 165 b 299 44 409 84 353 44 b 288 45 295 44 292 44 b 250 61 274 45 268 49 b 122 99 212 86 164 99 b 73 91 104 99 88 97 b 28 63 53 84 34 72 b 14 54 25 56 20 54 b 1 62 9 54 4 56 l -1 65 l -1 79 b 0 99 -1 91 0 95 b 2 113 1 102 2 108 b 164 309 20 197 81 272 b 285 470 232 341 277 398 b 287 487 287 476 287 481 b 171 595 287 551 239 595 b 155 595 166 595 160 595 b 142 592 145 594 142 594 b 145 589 142 592 142 591 b 179 527 168 576 179 551 b 132 455 179 496 163 467 b 104 451 122 452 112 451 b 27 530 62 451 27 487 b 29 555 27 538 27 546 b 197 648 44 601 115 639 m 228 -1 l 230 -1 l 227 -1 l 228 -1 m 228 673 l 230 673 l 227 673 l 228 673 ',\n },\n timeSig3: {\n x_min: -1.359375,\n x_max: 409.6875,\n ha: 418,\n o: 'm 174 648 b 191 648 176 648 183 648 b 225 648 204 648 220 648 b 402 523 317 638 389 588 b 404 503 404 517 404 510 b 402 484 404 495 404 488 b 264 373 389 437 334 394 b 257 370 259 371 257 371 b 257 370 257 370 257 370 b 264 369 258 370 261 369 b 409 202 359 334 409 267 b 318 72 409 152 381 104 b 200 43 281 52 240 43 b 23 113 134 43 69 68 b 0 169 6 129 0 149 b 77 249 0 210 29 249 l 77 249 b 152 174 125 249 152 212 b 103 102 152 145 137 116 b 103 102 103 102 103 102 b 147 94 103 101 132 95 b 153 94 149 94 151 94 b 265 206 219 94 265 141 b 264 226 265 213 265 219 b 147 355 253 299 204 353 b 126 371 133 356 126 362 b 147 388 126 383 132 388 b 254 474 196 391 238 424 b 259 502 258 484 259 494 b 182 592 259 544 228 582 b 156 595 175 595 166 595 b 115 592 142 595 129 594 l 111 591 l 115 588 b 152 524 141 574 152 549 b 92 449 152 491 130 458 b 76 448 87 448 81 448 b -1 530 32 448 -1 488 b 20 581 -1 548 5 566 b 174 648 55 619 108 641 m 204 -1 l 205 -1 l 202 -1 l 204 -1 m 204 673 l 205 673 l 202 673 l 204 673 ',\n },\n timeSig4: {\n x_min: 0,\n x_max: 468.21875,\n ha: 478,\n o: 'm 174 637 b 232 638 175 638 189 638 b 277 638 245 638 259 638 l 378 638 l 381 635 b 389 623 386 632 389 627 b 382 609 389 617 386 613 b 366 589 381 606 372 598 l 313 528 l 245 451 l 209 410 l 155 348 l 84 267 b 59 240 72 252 59 240 b 59 240 59 240 59 240 b 151 238 59 238 68 238 l 242 238 l 242 303 b 243 371 242 369 242 370 b 289 426 245 374 254 385 l 303 441 l 317 456 l 338 483 l 360 506 l 371 520 b 386 527 375 526 381 527 b 400 519 392 527 397 524 b 401 440 401 516 401 514 b 401 377 401 423 401 402 l 401 238 l 426 238 b 453 237 449 238 450 238 b 465 217 461 234 465 226 b 460 202 465 212 464 206 b 426 197 454 197 453 197 l 401 197 l 401 180 b 451 88 402 129 412 109 b 468 69 465 81 468 79 b 461 55 468 62 466 59 l 458 54 l 321 54 l 185 54 l 182 55 b 175 69 176 59 175 62 b 191 88 175 79 176 81 b 240 180 230 109 240 129 l 240 197 l 125 197 b 73 195 104 195 87 195 b 8 197 10 195 9 197 b 0 212 2 199 0 205 b 0 212 0 212 0 212 b 20 242 0 219 0 219 b 163 610 104 344 163 492 b 174 637 163 628 166 634 m 234 -1 l 235 -1 l 232 -1 l 234 -1 m 234 673 l 235 673 l 232 673 l 234 673 ',\n },\n timeSig5: {\n x_min: 0,\n x_max: 409.6875,\n ha: 418,\n o: 'm 47 637 b 53 638 49 638 50 638 b 69 634 55 638 61 637 b 210 610 114 619 161 610 b 363 634 259 610 311 619 b 382 638 372 637 378 638 b 392 634 386 638 389 637 b 397 623 396 630 397 627 b 393 610 397 620 396 616 b 298 505 368 552 338 520 b 212 494 277 498 246 494 b 65 517 163 494 106 502 b 61 517 62 517 61 517 b 61 517 61 517 61 517 b 51 408 61 517 51 412 b 51 408 51 408 51 408 b 51 408 51 408 51 408 b 61 412 53 408 55 409 b 125 434 80 421 103 430 b 185 441 145 440 166 441 b 409 244 310 441 409 353 b 401 191 409 227 406 209 b 197 43 375 105 287 43 b 159 47 183 43 171 44 b 23 123 112 56 61 86 b 0 180 6 140 0 159 b 76 260 0 220 31 260 b 92 259 81 260 87 259 b 152 183 132 251 152 216 b 100 112 152 152 134 122 b 95 111 98 112 95 111 b 95 111 95 111 95 111 b 129 98 95 109 119 101 b 148 97 136 97 141 97 b 264 235 206 97 261 158 b 265 248 265 240 265 244 b 210 398 265 312 243 373 b 179 408 201 406 194 408 b 174 408 178 408 176 408 b 53 369 130 408 88 394 b 34 359 39 359 38 359 b 17 374 24 359 17 365 b 39 628 17 384 38 625 b 47 637 40 631 43 635 m 204 -1 l 205 -1 l 202 -1 l 204 -1 m 204 673 l 205 673 l 202 673 l 204 673 ',\n },\n timeSig6: {\n x_min: 0,\n x_max: 475.03125,\n ha: 485,\n o: 'm 255 648 b 274 648 259 648 266 648 b 314 646 288 648 307 648 b 450 555 374 637 438 594 b 454 530 453 546 454 538 b 375 451 454 485 416 451 b 328 467 359 451 343 455 b 300 526 310 483 300 503 b 352 598 300 557 319 589 b 356 599 355 598 356 599 b 352 602 356 599 355 601 b 288 616 330 612 308 616 b 210 584 257 616 230 605 b 164 433 189 559 174 508 b 160 374 163 415 160 381 b 160 374 160 374 160 374 b 160 374 160 374 160 374 b 168 377 160 374 164 376 b 258 395 200 390 228 395 b 366 367 294 395 328 387 b 475 223 436 333 475 283 b 472 197 475 215 473 206 b 349 65 462 141 419 95 b 259 43 317 51 288 43 b 167 69 230 43 200 52 b 4 290 80 113 20 195 b 0 349 1 309 0 328 b 20 467 0 391 6 433 b 255 648 58 563 155 637 m 269 363 b 257 363 265 363 261 363 b 210 345 236 363 220 356 b 186 226 196 324 186 272 b 187 198 186 216 186 206 b 213 95 191 151 202 112 b 257 76 221 83 238 76 b 270 77 261 76 266 76 b 321 156 299 81 310 99 b 329 229 326 183 329 206 b 321 301 329 252 326 274 b 269 363 311 342 298 359 m 236 -1 l 238 -1 l 235 -1 l 236 -1 m 236 673 l 238 673 l 235 673 l 236 673 ',\n },\n timeSig7: {\n x_min: 0,\n x_max: 442.359375,\n ha: 451,\n o: 'm 147 648 b 166 649 153 649 160 649 b 313 598 217 649 273 630 b 340 587 323 588 328 587 l 341 587 b 412 628 367 587 390 601 b 427 638 416 635 421 638 b 439 632 431 638 435 637 b 442 623 441 630 442 628 b 430 569 442 616 439 603 b 352 369 408 492 377 410 b 300 259 325 324 313 298 b 273 84 283 205 273 140 b 265 55 273 65 272 59 l 261 54 l 181 54 l 99 54 l 96 55 b 91 61 95 56 92 59 l 89 63 l 89 77 b 147 263 89 133 111 202 b 261 401 176 313 212 355 b 378 541 315 449 349 489 l 382 548 l 375 544 b 240 495 333 512 285 495 b 129 535 198 495 160 509 b 84 560 108 552 95 560 b 76 559 81 560 78 560 b 31 487 59 555 43 530 b 14 470 27 473 24 470 b 1 477 8 470 4 471 l 0 480 l 0 553 l 0 627 l 1 630 b 16 638 4 635 9 638 b 23 635 17 638 20 637 b 49 626 36 626 39 626 b 96 638 59 626 80 630 b 104 639 99 638 102 639 b 117 644 107 641 112 642 b 147 648 125 645 137 648 m 220 -1 l 221 -1 l 219 -1 l 220 -1 m 220 673 l 221 673 l 219 673 l 220 673 ',\n },\n timeSig8: {\n x_min: 0,\n x_max: 488.640625,\n ha: 499,\n o: 'm 217 648 b 245 649 225 648 235 649 b 453 516 343 649 430 595 b 458 478 455 503 458 491 b 412 370 458 440 441 398 b 411 369 412 369 411 369 b 415 365 411 367 412 367 b 488 231 462 331 488 281 b 472 165 488 208 483 186 b 243 43 434 86 338 43 b 63 104 178 43 112 62 b 0 233 20 140 0 186 b 73 365 0 283 24 331 l 77 369 l 72 374 b 29 476 42 406 29 441 b 217 648 29 557 103 635 m 258 605 b 242 606 253 605 247 606 b 157 552 198 606 157 580 b 160 541 157 548 159 544 b 319 413 176 503 242 452 l 337 403 l 338 406 b 359 476 352 428 359 452 b 258 605 359 537 318 595 m 138 326 b 130 330 134 328 130 330 b 130 330 130 330 130 330 b 107 305 127 330 112 313 b 84 231 91 281 84 256 b 243 86 84 156 151 86 b 249 87 245 86 246 87 b 347 156 303 88 347 120 b 344 172 347 162 345 167 b 156 319 325 227 257 281 b 138 326 151 322 144 324 m 243 -1 l 245 -1 l 242 -1 l 243 -1 m 243 673 l 245 673 l 242 673 l 243 673 ',\n },\n timeSig9: {\n x_min: 0,\n x_max: 475.03125,\n ha: 485,\n o: 'm 191 646 b 212 649 198 648 205 649 b 255 644 227 649 243 646 b 458 448 348 616 428 539 b 475 342 469 415 475 378 b 460 244 475 308 469 274 b 193 44 421 124 303 44 b 91 69 157 44 122 51 b 19 161 43 97 19 126 b 21 181 19 167 20 174 b 98 241 32 220 65 241 b 170 186 129 241 160 223 b 172 166 171 179 172 173 b 121 94 172 134 152 102 b 117 93 118 94 117 93 b 121 90 117 93 118 91 b 185 76 142 80 164 76 b 270 119 220 76 251 91 b 308 259 287 145 300 194 b 313 317 310 277 313 310 b 313 317 313 317 313 317 b 313 317 313 317 313 317 b 304 315 313 317 308 316 b 216 295 273 302 245 295 b 145 308 193 295 170 299 b 19 398 88 327 42 360 b 0 469 5 420 0 444 b 24 551 0 496 8 526 b 191 646 54 596 125 637 m 227 614 b 215 616 224 616 220 616 b 202 614 210 616 206 616 b 152 535 174 610 163 592 b 144 463 147 509 144 485 b 152 391 144 440 147 417 b 216 328 163 344 179 328 b 280 391 253 328 269 344 b 288 463 285 417 288 440 b 280 535 288 485 285 509 b 227 614 269 594 258 610 m 236 -1 l 238 -1 l 235 -1 l 236 -1 m 236 673 l 238 673 l 235 673 l 236 673 ',\n },\n timeSigCommon: {\n x_min: -1.359375,\n x_max: 556.6875,\n ha: 568,\n o: 'm 294 322 b 318 323 299 322 308 323 b 360 320 334 323 352 322 b 526 217 430 310 490 273 b 543 166 537 202 543 184 b 447 70 543 117 503 70 b 445 70 447 70 446 70 b 359 159 394 72 359 113 b 368 201 359 173 362 187 b 442 245 382 229 412 245 b 455 244 446 245 451 245 b 460 244 458 244 460 244 b 460 244 460 244 460 244 b 454 248 460 244 458 245 b 325 291 417 276 372 291 b 285 287 313 291 299 290 b 144 -2 183 269 144 190 b 281 -290 144 -208 179 -280 b 304 -291 289 -291 298 -291 b 524 -105 412 -291 506 -212 b 541 -84 526 -88 530 -84 b 556 -101 551 -84 556 -90 b 549 -138 556 -111 553 -122 b 334 -322 521 -237 435 -310 b 302 -324 323 -323 313 -324 b 13 -101 172 -324 54 -234 b -1 -1 4 -68 -1 -34 b 294 322 -1 161 121 303 ',\n },\n timeSigCutCommon: {\n x_min: 0,\n x_max: 556.6875,\n ha: 568,\n o: 'm 289 545 b 298 546 292 545 295 546 b 318 533 306 546 315 541 b 319 428 319 530 319 528 l 319 327 l 334 327 b 526 223 412 326 485 285 b 543 172 537 206 543 190 b 447 76 543 122 503 76 b 445 76 446 76 446 76 b 359 165 394 77 359 119 b 368 205 359 179 362 192 b 441 251 382 233 412 251 b 455 249 446 251 451 251 b 460 248 458 249 460 248 b 460 248 460 248 460 248 b 454 254 460 249 458 251 b 334 295 419 280 378 294 l 319 295 l 319 4 l 319 -287 l 321 -285 b 328 -285 322 -285 325 -285 b 524 -99 424 -277 507 -198 b 541 -79 526 -84 530 -79 b 556 -97 551 -79 556 -84 b 548 -133 556 -105 553 -117 b 334 -317 521 -233 434 -306 b 322 -319 329 -317 323 -317 l 319 -319 l 319 -424 b 319 -471 319 -444 319 -459 b 313 -541 319 -544 318 -535 b 298 -548 308 -545 303 -548 b 279 -534 289 -548 281 -542 b 277 -424 277 -531 277 -530 l 277 -317 l 273 -317 b 13 -95 153 -305 51 -217 b 0 2 4 -62 0 -29 b 182 295 0 126 66 238 b 274 324 210 309 249 320 l 277 324 l 277 427 b 279 533 277 528 277 530 b 289 545 281 538 285 542 m 277 2 b 277 291 277 161 277 291 b 268 288 277 291 273 290 b 144 1 179 265 144 184 b 276 -284 144 -199 175 -267 l 277 -285 l 277 2 ',\n },\n timeSigPlus: {\n x_min: 0,\n x_max: 319.859375,\n ha: 326,\n o: 'm 149 508 b 159 509 152 509 155 509 b 186 494 170 509 181 503 b 190 440 190 487 190 488 l 190 430 l 190 377 l 242 377 l 251 377 b 303 373 298 377 296 377 b 319 345 314 367 319 356 b 304 319 319 335 314 324 b 250 315 296 315 299 315 l 242 315 l 190 315 l 190 262 l 190 252 b 186 198 190 204 190 205 b 159 183 179 188 170 183 b 132 198 148 183 138 188 b 127 252 127 205 127 204 l 127 262 l 127 315 l 76 315 l 68 315 b 14 319 20 315 21 315 b 0 347 4 324 0 335 b 14 373 0 356 4 367 b 68 377 21 377 20 377 l 76 377 l 127 377 l 127 430 l 127 440 b 132 494 127 488 127 487 b 149 508 136 501 142 505 ',\n },\n timeSigPlusSmall: {\n x_min: 0,\n x_max: 319.859375,\n ha: 326,\n o: 'm 149 508 b 159 509 152 509 155 509 b 186 494 170 509 181 503 b 190 440 190 487 190 488 l 190 430 l 190 377 l 242 377 l 251 377 b 303 373 298 377 296 377 b 319 345 314 367 319 356 b 304 319 319 335 314 324 b 250 315 296 315 299 315 l 242 315 l 190 315 l 190 262 l 190 252 b 186 198 190 204 190 205 b 159 183 179 188 170 183 b 132 198 148 183 138 188 b 127 252 127 205 127 204 l 127 262 l 127 315 l 76 315 l 68 315 b 14 319 20 315 21 315 b 0 347 4 324 0 335 b 14 373 0 356 4 367 b 68 377 21 377 20 377 l 76 377 l 127 377 l 127 430 l 127 440 b 132 494 127 488 127 487 b 149 508 136 501 142 505 ',\n },\n timeSigMinus: {\n x_min: 0,\n x_max: 318.5,\n ha: 325,\n o: 'm 20 376 b 167 377 23 377 96 377 b 296 376 231 377 294 377 b 318 347 311 371 318 359 b 296 316 318 333 311 320 b 159 315 294 315 227 315 b 21 316 91 315 24 315 b 0 345 6 320 0 333 b 20 376 0 359 6 371 ',\n },\n timeSigParensRight: {\n x_min: 25.859375,\n x_max: 164.6875,\n ha: 168,\n o: 'm 34 369 b 40 370 35 370 38 370 b 59 353 49 370 50 367 b 164 40 122 254 155 158 b 164 0 164 33 164 16 b 164 -40 164 -16 164 -34 b 59 -353 155 -158 122 -254 b 40 -371 53 -366 47 -371 b 34 -370 38 -371 36 -370 b 25 -358 28 -367 25 -363 b 31 -337 25 -352 27 -347 b 92 0 72 -234 92 -117 b 31 335 92 116 72 233 b 25 356 27 345 25 352 b 34 369 25 363 28 366 ',\n },\n timeSigParensRightSmall: {\n x_min: 25.859375,\n x_max: 164.6875,\n ha: 168,\n o: 'm 34 369 b 40 370 35 370 38 370 b 59 353 49 370 50 367 b 164 40 122 254 155 158 b 164 0 164 33 164 16 b 164 -40 164 -16 164 -34 b 59 -353 155 -158 122 -254 b 40 -371 53 -366 47 -371 b 34 -370 38 -371 36 -370 b 25 -358 28 -367 25 -363 b 31 -337 25 -352 27 -347 b 92 0 72 -234 92 -117 b 31 335 92 116 72 233 b 25 356 27 345 25 352 b 34 369 25 363 28 366 ',\n },\n timeSigParensLeft: {\n x_min: -166.0625,\n x_max: -25.859375,\n ha: 0,\n o: 'm -49 369 b -42 370 -46 369 -44 370 b -27 360 -36 370 -29 366 b -25 355 -27 359 -25 358 b -32 335 -25 351 -28 347 b -92 52 -66 248 -87 159 b -93 -1 -93 43 -93 20 b -92 -54 -93 -23 -93 -45 b -32 -337 -85 -162 -66 -251 b -25 -355 -27 -349 -25 -352 b -42 -371 -25 -365 -32 -371 b -61 -353 -50 -371 -51 -369 b -163 -63 -119 -262 -153 -165 b -166 -1 -166 -37 -166 -31 b -163 62 -166 30 -166 36 b -61 352 -153 163 -119 260 b -49 369 -54 365 -51 366 ',\n },\n timeSigParensLeftSmall: {\n x_min: -166.0625,\n x_max: -25.859375,\n ha: 0,\n o: 'm -49 369 b -42 370 -46 369 -44 370 b -27 360 -36 370 -29 366 b -25 355 -27 359 -25 358 b -32 335 -25 351 -28 347 b -92 52 -66 248 -87 159 b -93 -1 -93 43 -93 20 b -92 -54 -93 -23 -93 -45 b -32 -337 -85 -162 -66 -251 b -25 -355 -27 -349 -25 -352 b -42 -371 -25 -365 -32 -371 b -61 -353 -50 -371 -51 -369 b -163 -63 -119 -262 -153 -165 b -166 -1 -166 -37 -166 -31 b -163 62 -166 30 -166 36 b -61 352 -153 163 -119 260 b -49 369 -54 365 -51 366 ',\n },\n noteheadDoubleWhole: {\n x_min: 0,\n x_max: 902.421875,\n ha: 921,\n o: 'm 17 240 b 24 241 19 241 21 241 b 32 240 28 241 31 241 b 46 229 38 238 43 234 b 50 88 50 223 50 237 b 50 -1 50 63 50 34 b 50 -90 50 -36 50 -65 b 46 -231 50 -238 50 -224 b 25 -242 42 -238 34 -242 b 0 -224 14 -242 4 -235 b 0 2 0 -222 0 -108 b 0 223 0 112 0 220 b 17 240 2 230 9 237 m 110 240 b 118 241 111 241 114 241 b 126 240 121 241 123 241 b 142 223 133 237 140 230 b 144 123 144 220 144 205 b 144 29 144 45 144 29 b 144 29 144 29 144 29 b 393 183 166 106 264 167 b 450 186 412 184 431 186 b 756 29 600 186 732 120 b 756 29 756 29 756 29 b 758 123 758 29 758 45 b 760 227 758 226 758 223 b 784 241 766 237 774 241 b 804 229 792 241 800 237 b 809 88 808 223 809 237 l 809 -1 l 809 -90 b 804 -231 809 -238 808 -224 b 784 -242 800 -238 792 -242 b 762 -231 775 -242 766 -238 b 758 -124 756 -224 758 -231 b 756 -30 758 -47 758 -30 b 756 -30 756 -30 756 -30 b 509 -184 736 -108 637 -169 b 450 -187 488 -187 469 -187 b 144 -30 300 -187 168 -122 b 144 -30 144 -30 144 -30 b 144 -124 144 -30 144 -47 b 140 -231 144 -231 144 -224 b 118 -242 134 -238 126 -242 b 92 -224 107 -242 96 -235 b 92 2 92 -222 92 -108 b 92 223 92 112 92 220 b 110 240 95 230 102 237 m 432 161 b 413 162 426 162 420 162 b 313 41 351 162 313 109 b 347 -73 313 5 323 -34 b 487 -163 385 -133 439 -163 b 578 -97 526 -163 562 -142 b 588 -43 585 -80 588 -62 b 432 161 588 47 518 147 m 868 240 b 876 241 869 241 872 241 b 884 240 879 241 882 241 b 898 229 890 238 894 234 b 902 88 902 223 902 237 l 902 -1 l 902 -90 b 898 -231 902 -238 902 -224 b 876 -242 892 -238 884 -242 b 852 -224 865 -242 854 -235 b 850 2 850 -222 850 -108 b 852 223 850 112 850 220 b 868 240 853 230 860 237 ',\n },\n noteheadWhole: {\n x_min: 0,\n x_max: 619.3125,\n ha: 632,\n o: 'm 274 184 b 307 186 285 186 296 186 b 616 22 465 186 597 116 b 619 -1 617 13 619 5 b 308 -187 619 -104 483 -187 b 0 -1 133 -187 0 -102 b 5 36 0 11 1 23 b 274 184 29 115 141 176 m 289 161 b 272 162 284 162 277 162 b 171 41 209 162 171 108 b 205 -73 171 5 182 -34 b 345 -163 243 -133 298 -163 b 436 -98 385 -163 420 -142 b 446 -43 443 -80 446 -62 b 289 161 446 47 377 147 ',\n },\n noteheadHalf: {\n x_min: 0,\n x_max: 428.75,\n ha: 438,\n o: 'm 262 186 b 273 186 266 186 272 186 b 274 186 273 186 274 186 b 285 186 274 186 280 186 b 428 48 375 181 428 122 b 386 -68 428 12 416 -29 b 155 -187 329 -145 236 -187 b 12 -111 92 -187 38 -162 b 0 -51 4 -91 0 -72 b 262 186 0 58 122 179 m 366 131 b 352 134 362 133 357 134 b 219 81 321 134 269 115 b 47 -111 126 23 50 -62 b 47 -112 47 -111 47 -112 b 77 -136 47 -129 58 -136 b 264 -45 118 -136 194 -101 b 382 109 336 12 382 76 b 366 131 382 120 377 129 ',\n },\n noteheadBlack: {\n x_min: 0,\n x_max: 428.75,\n ha: 438,\n o: 'm 262 186 b 273 186 266 186 272 186 b 274 186 273 186 274 186 b 285 186 274 186 280 186 b 428 48 375 181 428 122 b 386 -68 428 12 416 -29 b 155 -187 329 -145 236 -187 b 12 -111 92 -187 38 -162 b 0 -51 4 -91 0 -72 b 262 186 0 58 122 179 ',\n },\n noteheadXWhole: {\n x_min: 0,\n x_max: 598.890625,\n ha: 611,\n o: 'm 62 181 b 77 183 66 183 72 183 b 91 181 83 183 88 183 b 202 131 100 180 106 177 l 299 87 l 394 131 b 517 183 499 181 502 183 b 519 183 517 183 518 183 b 598 104 567 183 598 144 b 577 49 598 84 592 65 b 518 15 567 38 563 37 b 484 0 499 6 484 0 b 518 -16 484 -1 499 -8 b 577 -51 563 -38 567 -40 b 598 -105 592 -66 598 -86 b 519 -184 598 -145 567 -184 b 517 -184 518 -184 517 -184 b 394 -133 502 -184 499 -183 l 299 -88 l 202 -133 b 81 -184 99 -183 95 -184 b 77 -184 80 -184 78 -184 b 0 -105 29 -184 0 -145 b 20 -51 0 -86 5 -66 b 80 -16 29 -40 34 -38 b 114 -1 98 -8 114 -1 b 80 15 114 0 98 6 b 20 49 34 37 29 38 b 0 104 6 65 0 84 b 62 181 0 140 23 174 m 88 134 b 74 136 85 134 80 136 b 68 134 72 136 69 136 b 46 104 54 130 46 117 b 55 81 46 95 49 88 b 149 34 59 76 53 80 b 224 -1 190 15 224 0 b 144 -38 224 -1 187 -18 b 54 -84 59 -79 58 -79 b 46 -105 49 -90 46 -98 b 76 -137 46 -122 58 -137 b 78 -137 77 -137 77 -137 b 194 -86 87 -137 76 -141 b 298 -36 250 -58 298 -36 b 298 -36 298 -36 298 -36 b 402 -84 299 -36 345 -58 b 518 -137 522 -141 510 -137 b 521 -137 519 -137 519 -137 b 551 -105 539 -137 551 -122 b 541 -83 551 -98 548 -90 b 447 -36 537 -77 544 -81 b 374 -1 406 -16 374 -1 b 447 34 374 0 406 15 b 541 81 544 80 537 76 b 551 104 548 88 551 97 b 521 136 551 120 539 136 b 518 136 519 136 519 136 b 517 136 518 136 517 136 l 517 136 b 402 83 511 136 511 136 b 298 34 345 56 299 34 b 298 34 298 34 298 34 b 194 84 298 34 250 56 b 88 134 137 111 89 133 ',\n },\n noteheadXHalf: {\n x_min: 0,\n x_max: 406.96875,\n ha: 415,\n o: 'm 55 181 b 70 183 61 183 66 183 b 111 170 85 183 99 179 b 160 130 115 167 137 149 l 202 95 l 245 130 b 319 181 299 176 302 179 b 334 183 325 183 330 183 b 406 109 375 183 406 148 b 401 81 406 99 405 91 b 348 24 394 65 390 59 b 318 -1 332 11 318 0 b 348 -26 318 -1 332 -12 b 401 -83 390 -61 394 -66 b 406 -111 405 -93 406 -101 b 334 -184 406 -149 375 -184 b 319 -183 330 -184 325 -184 b 245 -131 302 -180 299 -177 l 202 -97 l 160 -131 b 85 -183 107 -177 103 -180 b 70 -184 80 -184 76 -184 b 0 -111 31 -184 0 -149 b 4 -83 0 -101 1 -93 b 58 -26 10 -66 16 -61 b 88 -1 74 -12 88 -1 b 58 24 88 0 74 11 b 10 69 23 54 17 59 b 0 109 2 81 0 95 b 55 181 0 142 21 173 m 83 133 b 72 136 78 136 76 136 b 57 131 66 136 61 134 b 46 109 49 126 46 117 b 50 93 46 104 47 98 b 107 45 51 91 77 70 b 160 0 137 20 160 0 b 107 -47 160 -1 137 -22 b 50 -94 77 -72 51 -93 b 46 -111 47 -99 46 -105 b 59 -134 46 -120 50 -130 b 72 -137 62 -136 68 -137 b 83 -136 76 -137 80 -136 b 144 -84 84 -134 107 -116 b 202 -36 176 -58 202 -36 b 261 -84 202 -36 230 -58 b 323 -136 299 -116 321 -134 b 334 -137 326 -136 330 -137 b 345 -134 338 -137 343 -136 b 360 -111 355 -130 360 -120 b 355 -94 360 -105 359 -99 b 299 -47 353 -93 329 -72 b 245 0 269 -22 245 -1 b 299 45 245 0 269 20 b 355 93 329 70 353 91 b 360 109 359 98 360 104 b 345 133 360 119 355 129 b 334 136 343 134 338 136 b 323 134 330 136 326 134 b 261 83 321 133 299 115 b 202 34 230 56 202 34 b 144 83 202 34 176 56 b 83 133 106 115 84 133 ',\n },\n noteheadXBlack: {\n x_min: 0,\n x_max: 406.96875,\n ha: 415,\n o: 'm 21 183 b 28 183 24 183 25 183 b 42 181 34 183 39 183 b 127 108 47 179 47 179 b 202 41 168 72 202 41 b 279 108 204 41 238 72 b 357 177 321 145 356 176 b 375 183 363 181 370 183 b 406 151 392 183 406 169 b 404 137 406 147 405 141 b 322 62 401 131 398 129 b 251 0 284 27 251 0 b 322 -63 251 -1 284 -29 b 404 -138 398 -130 401 -133 b 406 -152 405 -142 406 -148 b 375 -184 406 -170 392 -184 b 357 -179 370 -184 363 -183 b 279 -109 356 -177 321 -147 b 202 -43 238 -73 204 -43 b 127 -109 202 -43 168 -73 b 49 -179 85 -147 50 -177 b 31 -184 43 -183 36 -184 b 0 -152 13 -184 0 -170 b 2 -138 0 -148 0 -142 b 83 -63 5 -133 8 -130 b 155 0 122 -29 155 -1 b 83 62 155 0 122 27 b 8 129 43 97 10 127 b 0 151 2 136 0 144 b 21 183 0 165 8 177 ',\n },\n noteheadCircleX: {\n x_min: 0,\n x_max: 484.5625,\n ha: 494,\n o: 'm 228 245 b 239 247 234 247 239 247 b 243 247 240 247 242 247 b 303 238 257 247 287 242 b 484 -2 417 208 484 104 b 412 -177 484 -65 461 -127 b 243 -248 363 -226 303 -248 b 6 -63 138 -248 36 -180 b 0 -1 1 -41 0 -20 b 228 245 0 127 98 240 m 255 181 b 240 183 247 183 245 183 b 232 181 238 183 235 183 b 142 152 200 180 168 170 l 138 149 l 190 97 l 242 44 l 294 97 l 345 149 l 340 152 b 255 181 315 169 284 180 m 147 -54 l 197 -1 l 147 51 l 95 104 l 91 99 b 62 -1 72 70 62 34 b 66 -43 62 -15 63 -29 b 91 -101 72 -63 80 -84 l 95 -106 l 147 -54 m 393 99 b 389 104 390 102 389 104 b 337 51 389 104 366 80 l 285 -1 l 337 -54 l 389 -106 l 393 -101 b 421 -1 412 -72 421 -36 b 393 99 421 34 412 69 m 294 -98 b 242 -45 265 -69 242 -45 b 190 -98 242 -45 219 -69 l 138 -151 l 142 -154 b 242 -184 172 -174 206 -184 b 340 -154 276 -184 311 -174 l 345 -151 l 294 -98 ',\n },\n noteheadTriangleUpWhole: {\n x_min: 0,\n x_max: 630.203125,\n ha: 643,\n o: 'm 308 204 b 314 205 310 205 313 205 b 326 201 319 205 323 204 b 355 154 328 199 338 180 b 401 83 362 142 392 95 l 409 72 b 431 41 412 66 424 49 b 619 -174 498 -51 570 -134 b 630 -192 626 -180 630 -186 b 626 -202 630 -195 628 -199 b 616 -206 623 -205 620 -206 b 552 -188 608 -206 592 -202 b 310 -155 488 -169 392 -155 b 268 -156 295 -155 281 -155 b 77 -188 197 -161 126 -173 b 13 -206 35 -202 20 -206 b 9 -206 12 -206 10 -206 b 0 -191 2 -202 0 -197 b 8 -176 0 -186 2 -180 b 204 49 58 -136 138 -43 l 220 72 l 227 83 b 295 188 245 108 281 166 b 308 204 299 197 304 202 m 315 147 b 314 147 315 147 314 147 b 314 147 314 147 314 147 b 306 129 314 145 310 138 l 296 105 b 281 72 292 97 284 77 l 274 56 b 181 -123 247 -4 212 -72 l 174 -134 l 176 -133 b 314 -123 215 -127 272 -123 b 451 -133 356 -123 413 -127 l 454 -134 l 449 -123 b 353 56 417 -72 381 -4 l 347 72 b 332 105 344 77 336 97 l 322 129 b 315 147 318 138 315 145 ',\n },\n noteheadTriangleUpHalf: {\n x_min: 0,\n x_max: 438.28125,\n ha: 447,\n o: 'm 212 205 b 219 205 213 205 216 205 b 239 183 228 205 231 204 b 421 -163 298 40 363 -83 b 438 -191 434 -180 438 -186 b 436 -197 438 -192 438 -195 b 424 -206 434 -204 431 -206 b 406 -201 420 -206 415 -205 b 216 -156 347 -172 281 -156 b 23 -205 148 -156 80 -173 b 14 -206 20 -206 17 -206 b 0 -191 6 -206 0 -201 b 6 -176 0 -187 1 -183 b 202 192 63 -104 142 45 b 212 205 205 199 208 202 m 264 48 l 249 81 l 243 94 l 242 91 b 89 -126 208 36 137 -66 b 81 -138 85 -133 81 -138 b 81 -138 81 -138 81 -138 b 81 -138 81 -138 81 -138 b 95 -133 81 -138 87 -136 b 280 -94 156 -108 221 -94 b 334 -98 299 -94 317 -95 b 343 -99 338 -99 343 -99 b 343 -99 343 -99 343 -99 b 338 -94 343 -99 341 -97 b 264 48 318 -58 287 1 ',\n },\n noteheadTriangleUpBlack: {\n x_min: -1.359375,\n x_max: 436.921875,\n ha: 446,\n o: 'm 213 205 b 217 205 215 205 216 205 b 234 194 224 205 234 199 b 236 187 234 194 235 190 l 245 167 l 261 129 l 270 106 b 355 -61 294 54 329 -13 b 420 -163 381 -105 402 -138 b 436 -188 435 -184 436 -184 b 436 -191 436 -190 436 -190 b 421 -206 436 -201 431 -206 l 421 -206 l 416 -206 l 405 -201 b 217 -158 347 -172 283 -158 b 31 -201 153 -158 88 -172 l 20 -206 l 14 -206 l 14 -206 b 0 -191 5 -206 0 -201 b -1 -188 0 -190 -1 -190 b 14 -163 -1 -186 0 -184 b 95 -34 36 -136 72 -77 b 166 106 119 8 148 68 l 175 129 l 183 148 l 200 188 b 213 205 205 199 208 202 ',\n },\n noteheadDiamondWhole: {\n x_min: 0,\n x_max: 627.46875,\n ha: 640,\n o: 'm 306 190 b 314 191 308 191 311 191 b 326 184 318 191 322 190 l 336 173 b 510 52 377 127 442 80 b 515 49 513 51 515 49 b 611 16 537 40 579 24 b 627 0 624 13 627 9 b 607 -18 627 -11 624 -13 b 330 -181 490 -49 389 -109 b 314 -192 323 -190 319 -192 b 306 -191 311 -192 308 -192 b 294 -177 302 -188 302 -188 b 257 -140 287 -170 265 -148 b 19 -18 193 -84 114 -44 b 0 0 2 -13 0 -11 b 16 16 0 9 2 13 b 110 49 47 24 89 40 b 117 52 111 49 114 51 b 145 65 126 56 130 58 b 281 163 200 93 245 124 b 300 186 288 170 291 174 b 306 190 300 187 303 188 m 317 137 b 313 142 315 141 314 142 b 308 137 313 142 311 141 b 161 4 276 84 220 33 b 155 0 159 1 155 0 b 163 -4 155 0 159 -2 b 308 -138 220 -34 276 -84 b 313 -142 311 -141 313 -142 b 317 -138 314 -142 315 -141 b 464 -4 351 -84 406 -34 b 470 0 468 -2 470 0 b 464 4 470 0 468 1 b 317 137 406 33 351 84 ',\n },\n noteheadDiamondHalf: {\n x_min: 0,\n x_max: 438.28125,\n ha: 447,\n o: 'm 212 190 b 219 191 213 191 216 191 b 236 176 225 191 228 190 b 419 18 277 105 341 49 b 436 5 431 13 434 11 b 438 -1 438 4 438 1 b 424 -16 438 -8 432 -13 b 356 -49 409 -20 379 -36 b 234 -180 306 -83 258 -133 b 219 -192 230 -188 224 -192 b 200 -176 213 -192 206 -187 b 9 -15 157 -102 89 -45 b 0 0 2 -12 0 -6 b 16 18 0 9 2 12 b 200 176 93 48 159 104 b 212 190 205 186 208 188 m 239 113 b 236 117 238 116 238 117 b 230 108 235 117 234 115 b 92 -15 196 58 140 8 b 88 -18 91 -16 88 -18 b 92 -20 88 -18 91 -19 b 198 -116 130 -43 166 -74 b 200 -117 200 -117 200 -117 b 201 -117 200 -117 201 -117 b 264 -43 212 -98 242 -62 b 345 15 288 -19 321 4 b 348 18 347 16 348 16 b 344 20 348 18 347 19 b 239 113 307 41 266 79 ',\n },\n noteheadDiamondBlack: {\n x_min: 0,\n x_max: 432.828125,\n ha: 442,\n o: 'm 209 186 b 213 187 210 187 212 187 b 216 187 215 187 216 187 b 224 174 216 186 220 180 b 420 -1 269 105 338 43 b 432 -12 431 -8 432 -9 b 421 -23 432 -15 432 -16 b 228 -180 345 -70 264 -137 b 219 -188 221 -188 221 -188 l 219 -188 b 208 -177 215 -188 215 -188 b 10 1 163 -106 93 -44 b 0 11 0 6 0 8 b 10 22 0 13 0 15 b 202 179 87 69 167 136 b 209 186 206 183 209 186 ',\n },\n augmentationDot: {\n x_min: 0,\n x_max: 133.390625,\n ha: 136,\n o: 'm 54 66 b 65 68 58 68 61 68 b 122 37 88 68 110 56 b 133 -1 130 26 133 12 b 104 -58 133 -23 123 -44 b 66 -69 92 -65 78 -69 b 10 -38 44 -69 23 -58 b 0 -1 2 -27 0 -13 b 54 66 0 30 20 61 ',\n },\n tremolo1: {\n x_min: -206.890625,\n x_max: 428.75,\n ha: 438,\n o: 'm 389 -351 b 394 -351 390 -351 393 -351 b 428 -385 413 -351 428 -367 b 428 -394 428 -388 428 -391 b 394 -428 426 -406 421 -410 l 332 -473 l 269 -516 l 205 -560 l 141 -603 l 77 -648 l 13 -692 l -50 -737 l -114 -780 l -145 -802 b -171 -813 -157 -810 -163 -813 b -175 -813 -172 -813 -174 -813 b -206 -777 -194 -811 -206 -795 b -202 -760 -206 -771 -205 -766 b -87 -675 -197 -752 -206 -757 l -34 -639 l 83 -557 l 145 -514 l 209 -470 l 272 -427 b 389 -351 375 -356 381 -352 ',\n },\n flag8thUp: {\n x_min: -24.5,\n x_max: 317.140625,\n ha: 324,\n o: 'm -24 -161 l -24 -5 l -20 -5 b 0 -24 -9 -5 -2 -12 b 171 -315 21 -124 84 -233 b 317 -660 268 -406 317 -531 b 187 -1014 317 -782 274 -909 b 161 -1034 172 -1034 171 -1034 b 141 -1013 149 -1034 141 -1025 b 152 -991 141 -1004 142 -1002 b 266 -682 228 -899 266 -788 b 174 -430 266 -588 236 -498 b -23 -317 136 -388 66 -348 b -24 -161 -23 -316 -24 -285 ',\n },\n flag8thDown: {\n x_min: -21.78125,\n x_max: 367.5,\n ha: 375,\n o: 'm 230 1031 b 238 1032 232 1032 235 1032 b 259 1014 245 1032 251 1027 b 367 662 330 906 367 782 b 364 602 367 641 367 621 b 232 317 352 488 304 384 b 57 120 155 245 103 187 b -1 18 31 84 6 40 b -19 4 -4 11 -12 4 l -21 4 l -21 159 l -21 315 l -16 315 b 96 335 10 315 62 324 b 315 695 227 380 315 527 b 313 738 315 709 314 724 b 224 991 304 825 273 916 b 216 1013 219 999 216 1007 b 230 1031 216 1021 220 1028 ',\n },\n flag16thUp: {\n x_min: -24.5,\n x_max: 317.140625,\n ha: 324,\n o: 'm -24 -147 l -24 -5 l -20 -5 b -1 -19 -12 -5 -4 -11 b 58 -123 6 -43 31 -86 b 196 -278 93 -173 134 -219 b 317 -570 274 -356 317 -460 b 294 -713 317 -617 308 -666 l 289 -724 l 294 -735 b 317 -873 308 -780 317 -827 b 235 -1132 317 -963 288 -1054 b 209 -1165 228 -1140 224 -1146 b 189 -1177 204 -1172 196 -1177 b 171 -1164 182 -1177 175 -1172 b 168 -1154 170 -1161 168 -1159 b 181 -1132 168 -1149 172 -1142 b 269 -891 238 -1064 269 -975 b 269 -881 269 -886 269 -884 b 262 -814 269 -857 265 -827 b 258 -800 261 -811 259 -806 b 142 -628 240 -731 198 -667 b -8 -589 112 -606 47 -589 b -20 -589 -13 -589 -19 -589 l -24 -589 l -24 -449 l -24 -308 l -20 -308 b -1 -322 -12 -308 -4 -313 b 58 -424 6 -345 31 -388 b 194 -580 93 -476 136 -523 b 259 -660 221 -606 245 -635 b 261 -663 259 -662 261 -663 b 264 -656 262 -663 262 -660 b 269 -587 268 -632 269 -610 b 264 -521 269 -566 268 -544 b 262 -512 264 -517 262 -513 b 258 -498 261 -509 259 -503 b 142 -326 240 -428 198 -365 b -8 -287 112 -303 47 -288 b -20 -287 -13 -287 -19 -287 l -24 -287 l -24 -147 ',\n },\n flag16thDown: {\n x_min: -21.78125,\n x_max: 362.0625,\n ha: 369,\n o: 'm 302 1031 b 308 1032 304 1032 307 1032 b 330 1016 318 1032 325 1027 b 362 867 351 970 362 920 b 340 738 362 824 353 780 l 336 727 l 340 717 b 362 591 355 677 362 634 b 257 323 362 496 325 401 b 204 272 243 306 227 290 b 20 56 129 206 66 133 b -1 18 12 44 0 22 b -19 4 -4 9 -12 4 l -21 4 l -21 140 l -21 276 l -12 277 b 167 333 61 288 127 309 b 319 598 262 388 319 491 b 311 664 319 620 317 642 l 310 673 l 304 664 b 204 548 279 620 250 587 b 20 333 129 483 66 409 b -1 292 12 320 0 298 b -19 280 -4 285 -12 280 l -21 280 l -21 416 l -21 552 l -12 553 b 167 609 61 564 127 585 b 319 874 264 666 319 770 b 294 992 319 914 311 954 b 288 1011 288 1004 288 1007 b 302 1031 288 1021 294 1028 ',\n },\n flag32ndUp: {\n x_min: -24.5,\n x_max: 315.78125,\n ha: 322,\n o: 'm -24 -145 l -24 -5 l -20 -5 b 1 -26 -10 -5 -6 -9 b 175 -241 31 -86 96 -166 b 314 -548 259 -323 304 -420 b 315 -589 315 -555 315 -571 b 314 -630 315 -606 315 -623 b 298 -730 311 -664 306 -699 l 295 -742 l 296 -748 b 314 -850 304 -778 311 -813 b 315 -892 315 -857 315 -874 b 314 -932 315 -909 315 -925 b 298 -1032 311 -967 306 -1002 l 295 -1045 l 296 -1050 b 314 -1153 304 -1081 311 -1115 b 315 -1193 315 -1160 315 -1177 b 314 -1235 315 -1211 315 -1228 b 217 -1526 306 -1338 270 -1444 b 201 -1533 213 -1532 208 -1533 b 182 -1522 193 -1533 185 -1529 b 179 -1514 181 -1518 179 -1517 b 189 -1489 179 -1508 182 -1501 b 266 -1217 240 -1403 266 -1308 b 262 -1156 266 -1196 265 -1177 b 110 -907 247 -1043 190 -950 b 0 -889 87 -895 50 -889 l -1 -889 l -24 -889 l -24 -749 l -24 -610 l -20 -610 b 1 -631 -10 -610 -6 -614 b 175 -846 31 -691 96 -771 b 259 -956 213 -884 236 -914 b 265 -966 262 -961 264 -966 b 265 -966 265 -966 265 -966 b 265 -953 265 -964 265 -959 b 266 -920 266 -943 266 -932 b 262 -853 266 -898 265 -873 b 110 -605 247 -741 190 -648 b 0 -587 87 -592 50 -587 l -1 -587 l -24 -587 l -24 -448 l -24 -308 l -20 -308 b 1 -328 -10 -308 -6 -312 b 175 -544 31 -388 96 -469 b 259 -655 213 -581 236 -612 b 265 -663 262 -659 264 -663 b 265 -663 265 -663 265 -663 b 265 -650 265 -663 265 -657 b 266 -617 266 -641 266 -630 b 262 -551 266 -595 265 -570 b 110 -303 247 -438 190 -345 b 0 -284 87 -290 50 -284 l -1 -284 l -24 -284 l -24 -145 ',\n },\n flag32ndDown: {\n x_min: -21.78125,\n x_max: 366.140625,\n ha: 374,\n o: 'm 276 1378 b 284 1379 279 1379 281 1379 b 306 1360 292 1379 298 1374 b 352 1247 326 1326 343 1286 b 366 1139 362 1213 366 1175 b 347 1009 366 1093 359 1049 l 344 1002 l 347 992 b 352 971 348 986 351 977 b 366 863 362 936 366 899 b 347 732 366 818 359 773 l 344 725 l 347 716 b 352 695 348 710 351 700 b 366 588 362 659 366 623 b 223 262 366 464 314 345 b 189 233 212 252 212 252 b 35 76 126 183 73 129 b -1 16 20 56 2 27 b -19 4 -4 9 -12 4 l -21 4 l -21 137 l -21 270 l -17 270 b 186 344 59 281 134 308 b 319 606 270 399 319 499 b 317 650 319 620 319 635 l 315 659 l 314 655 b 223 537 288 607 258 570 b 189 509 212 528 212 528 b 35 352 126 459 73 405 b -1 292 20 333 2 303 b -19 280 -4 285 -12 280 l -21 280 l -21 413 l -21 546 l -17 546 b 186 620 59 557 134 584 b 319 882 270 675 319 775 b 317 925 319 896 319 911 l 315 935 l 314 931 b 223 813 288 884 258 846 b 189 785 212 805 212 805 b 35 628 126 735 73 681 b -1 569 20 609 2 580 b -19 556 -4 562 -12 556 l -21 556 l -21 689 l -21 823 l -17 823 b 202 907 68 835 152 867 b 319 1157 280 968 319 1061 b 270 1338 319 1218 303 1281 b 262 1358 264 1349 262 1353 b 262 1364 262 1360 262 1363 b 276 1378 265 1371 269 1376 ',\n },\n flag64thUp: {\n x_min: -24.5,\n x_max: 314.421875,\n ha: 321,\n o: 'm -24 -145 l -24 -5 l -20 -5 b 0 -23 -9 -5 -2 -12 b 27 -87 4 -38 14 -66 b 138 -220 53 -136 88 -177 b 235 -328 179 -255 208 -288 b 314 -592 287 -409 314 -501 b 292 -732 314 -639 307 -687 l 289 -742 l 294 -756 b 314 -896 307 -802 314 -849 b 292 -1035 314 -943 307 -991 l 289 -1045 l 294 -1057 b 314 -1197 307 -1104 314 -1152 b 292 -1338 314 -1246 307 -1292 l 289 -1347 l 294 -1360 b 314 -1500 307 -1407 314 -1454 b 273 -1689 314 -1565 300 -1628 b 250 -1712 265 -1710 261 -1712 b 228 -1691 236 -1712 228 -1704 l 228 -1685 l 234 -1675 b 270 -1507 258 -1621 270 -1564 b 98 -1193 270 -1381 209 -1261 b 40 -1174 76 -1179 58 -1174 b -10 -1189 24 -1174 8 -1178 b -20 -1192 -14 -1192 -16 -1192 l -24 -1192 l -24 -1052 l -24 -913 l -20 -913 b 0 -931 -9 -913 -2 -920 b 27 -995 4 -946 14 -974 b 138 -1128 53 -1043 88 -1085 b 257 -1275 190 -1172 228 -1220 b 262 -1283 259 -1279 262 -1283 l 262 -1283 b 269 -1249 264 -1282 268 -1260 b 270 -1206 270 -1233 270 -1220 b 98 -891 270 -1075 206 -957 b 40 -871 76 -877 58 -871 b -10 -886 24 -871 8 -875 b -20 -889 -14 -889 -16 -889 l -24 -889 l -24 -749 l -24 -610 l -20 -610 b 0 -628 -9 -610 -2 -617 b 27 -692 4 -644 14 -671 b 138 -825 53 -741 88 -782 b 257 -973 190 -870 228 -917 b 262 -981 259 -977 262 -981 l 262 -981 b 269 -946 264 -979 268 -957 b 270 -903 270 -931 270 -917 b 98 -588 270 -774 206 -655 b 40 -569 76 -574 58 -569 b -10 -584 24 -569 8 -574 b -20 -587 -14 -587 -16 -587 l -24 -587 l -24 -448 l -24 -308 l -20 -308 b 0 -326 -9 -308 -2 -315 b 27 -390 4 -341 14 -369 b 138 -523 53 -438 88 -480 b 257 -670 190 -567 228 -614 b 262 -678 259 -674 262 -678 b 262 -678 262 -678 262 -678 b 269 -644 264 -677 268 -656 b 270 -601 270 -628 270 -614 b 98 -285 270 -471 206 -352 b 40 -266 76 -273 58 -266 b -10 -281 24 -266 8 -272 b -20 -284 -14 -284 -16 -284 l -24 -284 l -24 -145 ',\n },\n flag64thDown: {\n x_min: -21.78125,\n x_max: 367.5,\n ha: 375,\n o: 'm 259 1553 b 265 1553 261 1553 264 1553 b 288 1540 272 1553 277 1550 b 367 1351 340 1493 367 1424 b 336 1221 367 1308 357 1263 l 332 1211 l 333 1208 b 367 1077 356 1170 367 1124 b 336 945 367 1032 357 986 l 332 935 l 333 932 b 367 800 356 893 367 848 b 336 669 367 756 357 710 l 332 659 l 333 656 b 367 523 356 617 367 571 b 345 412 367 485 360 446 b 231 273 322 356 284 310 b -1 19 121 195 27 93 b -17 4 -4 11 -10 5 l -21 4 l -21 134 l -21 265 l -17 265 b 133 291 20 265 96 278 b 318 537 245 328 318 433 b 307 603 318 559 315 582 b 303 614 304 612 304 614 b 298 609 302 614 300 613 b 231 549 281 589 258 567 b -1 295 121 471 27 369 b -17 280 -4 287 -10 281 l -21 280 l -21 410 l -21 541 l -17 541 b 133 567 20 541 96 555 b 318 813 245 605 318 709 b 307 880 318 835 315 859 b 303 891 304 888 304 891 b 298 885 302 891 300 888 b 231 825 281 866 258 843 b -1 571 121 748 27 645 b -17 556 -4 563 -10 557 l -21 556 l -21 687 l -21 817 l -17 817 b 133 843 20 817 96 830 b 318 1089 245 881 318 985 b 307 1156 318 1111 315 1134 b 303 1167 304 1164 304 1167 b 298 1161 302 1167 300 1164 b 231 1102 281 1140 258 1120 b -1 848 121 1024 27 921 b -17 832 -4 839 -10 834 l -21 832 l -21 963 l -21 1093 l -17 1093 b 114 1113 12 1093 78 1103 b 313 1314 215 1142 289 1218 b 318 1364 317 1331 318 1347 b 255 1511 318 1422 295 1478 b 243 1532 247 1519 243 1525 b 259 1553 243 1540 250 1550 ',\n },\n flag128thUp: {\n x_min: -24.5,\n x_max: 313.0625,\n ha: 319,\n o: 'm -24 -133 l -24 -5 l -20 -5 b -1 -19 -12 -5 -4 -11 b 142 -213 13 -61 74 -144 b 258 -376 196 -269 230 -315 b 313 -605 295 -449 313 -528 b 292 -742 313 -652 306 -699 b 288 -752 289 -748 288 -752 b 288 -752 288 -752 288 -752 b 292 -764 289 -753 291 -757 b 313 -907 306 -811 313 -860 b 292 -1045 313 -954 306 -1002 b 288 -1054 289 -1050 288 -1054 b 288 -1054 288 -1054 288 -1054 b 292 -1067 289 -1054 291 -1060 b 313 -1210 306 -1113 313 -1161 b 292 -1346 313 -1257 306 -1304 b 288 -1357 289 -1353 288 -1357 b 288 -1357 288 -1357 288 -1357 b 292 -1368 289 -1357 291 -1363 b 313 -1512 306 -1415 313 -1464 b 292 -1648 313 -1560 306 -1605 b 288 -1660 289 -1654 288 -1660 b 288 -1660 288 -1660 288 -1660 b 292 -1671 289 -1660 291 -1665 b 313 -1814 306 -1719 313 -1766 b 250 -2040 313 -1897 291 -1977 b 232 -2062 238 -2057 236 -2059 b 221 -2065 230 -2063 225 -2065 b 200 -2045 210 -2065 201 -2057 b 200 -2043 200 -2044 200 -2044 b 208 -2026 200 -2037 202 -2034 b 269 -1826 249 -1966 269 -1897 b 153 -1544 269 -1726 230 -1625 b -9 -1472 115 -1506 58 -1481 b -21 -1471 -14 -1471 -19 -1471 l -24 -1471 l -24 -1343 l -24 -1215 l -20 -1215 b -1 -1229 -12 -1215 -4 -1221 b 142 -1424 13 -1270 74 -1353 b 257 -1582 196 -1478 228 -1524 b 264 -1594 261 -1589 264 -1594 l 264 -1594 b 265 -1582 264 -1594 264 -1589 b 270 -1525 268 -1562 270 -1544 b 153 -1243 270 -1424 228 -1321 b -9 -1170 115 -1203 58 -1178 b -21 -1168 -14 -1170 -19 -1168 l -24 -1168 l -24 -1041 l -24 -913 l -20 -913 b -1 -927 -12 -913 -4 -918 b 142 -1121 13 -967 74 -1050 b 257 -1281 196 -1175 228 -1221 b 264 -1292 261 -1286 264 -1292 l 264 -1292 b 265 -1279 264 -1292 264 -1286 b 270 -1222 268 -1261 270 -1242 b 153 -941 270 -1121 228 -1018 b -9 -867 115 -900 58 -875 b -21 -866 -14 -867 -19 -866 l -24 -866 l -24 -738 l -24 -610 l -20 -610 b -1 -624 -12 -610 -4 -616 b 142 -818 13 -664 74 -749 b 257 -978 196 -873 228 -918 b 264 -989 261 -984 264 -989 l 264 -989 b 265 -977 264 -989 264 -984 b 270 -920 268 -959 270 -939 b 153 -638 270 -818 228 -716 b -9 -564 115 -598 58 -573 b -21 -563 -14 -564 -19 -563 l -24 -563 l -24 -435 l -24 -308 l -20 -308 b -1 -322 -12 -308 -4 -313 b 142 -516 13 -363 74 -446 b 257 -675 196 -571 228 -616 b 264 -687 261 -681 264 -687 l 264 -687 b 265 -674 264 -687 264 -681 b 270 -617 268 -656 270 -637 b 153 -335 270 -516 228 -413 b -9 -262 115 -295 58 -270 b -21 -260 -14 -262 -19 -260 l -24 -260 l -24 -133 ',\n },\n flag128thDown: {\n x_min: -21.78125,\n x_max: 367.5,\n ha: 375,\n o: 'm 276 1900 b 284 1901 279 1900 281 1901 b 306 1883 291 1901 298 1896 b 367 1686 347 1825 367 1757 b 343 1558 367 1643 359 1600 l 338 1549 l 343 1537 b 367 1411 359 1497 367 1454 b 343 1282 367 1367 359 1324 l 338 1272 l 343 1261 b 367 1135 359 1221 367 1178 b 343 1007 367 1090 359 1047 l 338 996 l 343 985 b 367 859 359 945 367 902 b 343 731 367 814 359 771 l 338 720 l 343 709 b 367 582 359 667 367 626 b 289 362 367 503 340 426 b 239 312 276 345 259 330 b 29 77 152 237 76 152 b -1 18 14 54 2 30 b -19 4 -4 11 -12 4 l -21 4 l -21 133 l -20 260 l -13 262 b 98 299 17 269 62 284 b 111 305 103 302 110 305 b 167 334 123 310 156 327 b 319 595 264 391 319 491 b 313 659 319 616 318 638 b 310 667 311 664 311 667 b 307 663 310 667 308 666 b 240 588 289 637 269 614 b 16 331 141 505 62 413 b -1 294 8 316 1 302 b -19 280 -4 287 -12 280 l -21 280 l -21 408 l -20 537 l -13 538 b 98 576 17 545 62 560 b 111 581 103 578 110 581 b 167 610 123 587 156 603 b 319 871 264 667 319 767 b 313 935 319 892 318 913 b 310 942 311 941 311 942 b 307 939 310 942 308 941 b 240 864 289 913 269 889 b 16 607 141 781 62 689 b -1 570 8 592 1 578 b -19 556 -4 563 -12 556 l -21 556 l -21 684 l -20 813 l -13 814 b 98 852 17 821 62 836 b 111 857 103 855 110 857 b 167 886 123 863 156 880 b 319 1147 264 943 319 1043 b 313 1211 319 1168 318 1189 b 310 1218 311 1217 311 1218 b 307 1215 310 1218 308 1217 b 240 1140 289 1188 269 1165 b 16 884 141 1057 62 966 b -1 846 8 868 1 855 b -19 832 -4 839 -12 832 l -21 832 l -21 960 l -20 1089 l -13 1090 b 98 1128 17 1097 62 1111 b 111 1134 103 1131 110 1134 b 167 1163 123 1139 156 1156 b 319 1424 264 1220 319 1320 b 313 1486 319 1444 318 1465 b 310 1494 311 1493 311 1494 b 307 1492 310 1494 308 1493 b 240 1417 289 1464 269 1442 b 16 1160 141 1333 62 1242 b -1 1121 8 1145 1 1131 b -19 1109 -4 1115 -12 1109 l -21 1109 l -21 1236 l -20 1365 l -13 1367 b 98 1404 17 1374 62 1388 b 111 1410 103 1407 110 1410 b 250 1508 172 1437 215 1467 b 319 1701 296 1564 319 1633 b 270 1859 319 1757 303 1814 b 262 1882 265 1868 262 1875 b 276 1900 262 1890 266 1896 ',\n },\n accidentalFlat: {\n x_min: -21.78125,\n x_max: 251.8125,\n ha: 257,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 383 20 616 20 616 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 201 l -21 616 l -20 620 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ',\n },\n accidentalNatural: {\n x_min: 0,\n x_max: 239.5625,\n ha: 244,\n o: 'm 10 460 b 20 462 13 462 14 462 b 39 449 28 462 35 458 l 40 446 l 40 326 b 40 205 40 259 40 205 b 127 227 40 205 80 215 b 220 249 196 244 213 249 b 227 247 224 249 225 248 b 238 237 231 245 235 241 l 239 233 l 239 -106 l 239 -448 l 238 -451 b 219 -463 234 -459 225 -463 b 198 -451 210 -463 202 -459 l 197 -448 l 197 -324 b 197 -201 197 -248 197 -201 b 110 -223 196 -201 157 -210 b 17 -245 42 -240 24 -245 b 10 -242 13 -245 13 -244 b 0 -233 6 -241 2 -237 l 0 -230 l 0 108 l 0 446 l 0 449 b 10 460 2 453 6 458 m 197 22 b 197 70 197 41 197 58 b 196 116 197 113 197 116 l 196 116 b 118 97 196 116 160 106 l 40 77 l 40 -18 b 40 -112 40 -69 40 -112 l 119 -93 l 197 -73 l 197 22 ',\n },\n accidentalSharp: {\n x_min: 0,\n x_max: 323.9375,\n ha: 331,\n o: 'm 217 535 b 225 537 220 537 221 537 b 245 524 235 537 242 533 l 246 521 l 247 390 l 247 258 l 273 265 b 306 270 288 269 299 270 b 322 259 315 270 319 267 b 323 208 323 256 323 233 b 322 158 323 184 323 159 b 288 140 318 148 315 147 b 247 130 254 131 247 130 b 247 65 247 130 247 104 b 247 20 247 51 247 36 l 247 -88 l 273 -81 b 306 -76 289 -77 299 -76 b 318 -81 311 -76 315 -77 b 323 -123 323 -87 323 -86 l 323 -138 l 323 -154 b 318 -195 323 -191 323 -190 b 269 -210 314 -199 315 -199 b 249 -216 259 -213 250 -216 l 247 -216 l 247 -349 l 246 -483 l 245 -487 b 225 -499 242 -495 234 -499 b 206 -487 219 -499 210 -495 l 205 -483 l 205 -355 l 205 -227 l 204 -227 l 181 -233 l 138 -244 b 117 -249 127 -247 117 -249 b 115 -385 115 -249 115 -256 l 115 -523 l 114 -526 b 95 -538 110 -534 102 -538 b 74 -526 87 -538 78 -534 l 73 -523 l 73 -391 b 72 -260 73 -269 73 -260 b 72 -260 72 -260 72 -260 b 19 -273 61 -263 23 -273 b 0 -260 10 -273 4 -267 b 0 -209 0 -256 0 -256 l 0 -162 l 1 -158 b 61 -134 5 -148 5 -148 l 73 -131 l 73 -22 b 72 86 73 79 73 86 b 72 86 72 86 72 86 b 19 74 61 83 23 74 b 0 86 10 74 4 79 b 0 137 0 90 0 90 l 0 184 l 1 188 b 61 212 5 198 5 198 l 73 215 l 73 348 l 73 481 l 74 485 b 95 498 78 492 87 498 b 103 495 98 498 100 496 b 114 485 107 494 111 489 l 115 481 l 115 353 l 115 226 l 121 226 b 159 235 123 227 141 231 l 198 247 l 205 248 l 205 384 l 205 521 l 206 524 b 217 535 209 528 212 533 m 205 9 b 205 119 205 70 205 119 l 205 119 b 182 113 204 119 194 116 l 138 102 b 117 97 127 99 117 97 b 115 -12 115 97 115 91 l 115 -122 l 121 -120 b 159 -111 123 -119 141 -115 l 198 -101 l 205 -98 l 205 9 ',\n },\n accidentalDoubleSharp: {\n x_min: 0,\n x_max: 367.5,\n ha: 375,\n o: 'm 0 124 l 0 187 l 61 187 l 122 187 l 122 138 l 122 91 l 153 61 l 183 30 l 213 61 l 243 91 l 243 138 l 243 187 l 306 187 l 367 187 l 367 124 l 367 61 l 321 61 l 274 61 l 243 30 l 213 0 l 243 -31 l 274 -62 l 321 -62 l 367 -62 l 367 -124 l 367 -188 l 306 -188 l 243 -188 l 243 -140 l 243 -93 l 213 -62 l 183 -31 l 153 -62 l 122 -93 l 122 -140 l 122 -188 l 61 -188 l 0 -188 l 0 -124 l 0 -62 l 46 -62 l 92 -62 l 123 -31 l 153 0 l 123 30 l 92 61 l 46 61 l 0 61 l 0 124 ',\n },\n accidentalDoubleFlat: {\n x_min: -21.78125,\n x_max: 483.1875,\n ha: 493,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 383 20 616 20 616 l 20 148 l 21 151 b 140 199 59 183 102 199 b 206 179 164 199 187 192 l 210 176 l 210 396 l 210 617 l 212 621 b 231 632 216 628 223 632 b 250 620 239 632 247 628 b 251 383 251 616 251 616 l 251 148 l 254 151 b 370 199 291 183 332 199 b 415 191 385 199 400 197 b 483 84 458 176 483 134 b 461 0 483 58 476 29 b 332 -142 439 -40 411 -72 l 255 -215 b 231 -229 240 -229 239 -229 b 216 -223 224 -229 220 -227 b 210 -158 210 -217 210 -223 b 210 -120 210 -148 210 -136 l 210 -29 l 205 -34 b 100 -142 182 -65 159 -88 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 201 l -21 616 l -20 620 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 m 341 131 b 328 133 337 133 332 133 b 322 133 326 133 323 133 b 257 87 296 129 273 113 l 251 80 l 251 -37 l 251 -156 l 255 -152 b 375 81 328 -72 375 20 l 375 83 b 341 131 375 113 367 126 ',\n },\n accidentalParensLeft: {\n x_min: -166.0625,\n x_max: -25.859375,\n ha: 0,\n o: 'm -49 369 b -42 370 -46 369 -44 370 b -27 360 -36 370 -29 366 b -25 355 -27 359 -25 358 b -32 335 -25 351 -28 347 b -92 52 -66 248 -87 159 b -93 -1 -93 43 -93 20 b -92 -54 -93 -23 -93 -45 b -32 -337 -85 -162 -66 -251 b -25 -355 -27 -349 -25 -352 b -42 -371 -25 -365 -32 -371 b -61 -353 -50 -371 -51 -369 b -163 -63 -119 -262 -153 -165 b -166 -1 -166 -37 -166 -31 b -163 62 -166 30 -166 36 b -61 352 -153 163 -119 260 b -49 369 -54 365 -51 366 ',\n },\n accidentalParensRight: {\n x_min: 25.859375,\n x_max: 164.6875,\n ha: 168,\n o: 'm 34 369 b 40 370 35 370 38 370 b 59 353 49 370 50 367 b 164 40 122 254 155 158 b 164 0 164 33 164 16 b 164 -40 164 -16 164 -34 b 59 -353 155 -158 122 -254 b 40 -371 53 -366 47 -371 b 34 -370 38 -371 36 -370 b 25 -358 28 -367 25 -363 b 31 -337 25 -352 27 -347 b 92 0 72 -234 92 -117 b 31 335 92 116 72 233 b 25 356 27 345 25 352 b 34 369 25 363 28 366 ',\n },\n accidentalQuarterToneFlatStein: {\n x_min: 0,\n x_max: 272.21875,\n ha: 278,\n o: 'm 243 631 b 250 632 246 632 249 632 b 270 620 259 632 268 628 l 272 616 l 272 201 l 272 -212 l 270 -216 b 251 -229 268 -224 259 -229 b 227 -215 243 -229 240 -229 l 151 -142 b 32 -16 81 -80 53 -49 b 0 84 9 18 0 52 b 111 199 0 149 42 199 b 137 197 119 199 127 198 b 228 151 168 191 197 177 l 231 148 l 231 383 b 232 620 231 616 231 616 b 243 631 234 624 238 630 m 168 131 b 152 133 163 133 157 133 b 107 102 130 133 111 120 b 106 86 107 97 106 91 b 111 41 106 73 108 56 b 227 -152 125 -13 171 -90 l 231 -156 l 231 -37 l 231 80 l 225 87 b 168 131 210 111 190 126 ',\n },\n accidentalThreeQuarterTonesFlatZimmermann: {\n x_min: 0,\n x_max: 607.0625,\n ha: 619,\n o: 'm 243 631 b 250 632 246 632 249 632 b 270 620 259 632 268 628 l 272 616 l 272 201 l 272 -212 l 270 -216 b 251 -229 268 -224 259 -229 b 227 -215 243 -229 240 -229 l 151 -142 b 32 -16 81 -80 53 -49 b 0 84 9 18 0 52 b 111 199 0 149 42 199 b 137 197 119 199 127 198 b 228 151 168 191 197 177 l 231 148 l 231 383 b 232 620 231 616 231 616 b 243 631 234 624 238 630 m 168 131 b 152 133 163 133 157 133 b 107 102 130 133 111 120 b 106 86 107 97 106 91 b 111 41 106 73 108 56 b 227 -152 125 -13 171 -90 l 231 -156 l 231 -37 l 231 80 l 225 87 b 168 131 210 111 190 126 m 347 631 b 353 632 348 632 351 632 b 374 620 363 632 371 628 b 375 383 375 616 375 616 l 375 148 l 377 151 b 492 199 415 183 454 199 b 537 191 507 199 522 197 b 607 84 582 176 607 134 b 583 0 607 58 598 29 b 455 -142 562 -40 533 -72 l 378 -215 b 355 -229 364 -229 362 -229 b 334 -216 345 -229 337 -224 l 333 -212 l 333 201 l 333 616 l 334 620 b 347 631 337 624 341 630 m 465 131 b 451 133 461 133 455 133 b 445 133 449 133 446 133 b 379 87 419 129 396 113 l 375 80 l 375 -37 l 375 -156 l 378 -152 b 499 81 451 -72 499 20 l 499 83 b 465 131 499 113 490 126 ',\n },\n accidentalQuarterToneSharpStein: {\n x_min: 0,\n x_max: 193.28125,\n ha: 197,\n o: 'm 85 514 b 95 517 88 517 89 517 b 114 505 103 517 110 513 l 115 502 l 115 376 b 115 249 115 306 115 249 b 141 258 117 249 127 252 l 167 266 l 172 266 b 190 254 181 265 187 262 l 193 251 l 193 202 l 193 188 b 187 147 193 149 191 152 b 147 130 183 142 182 141 l 115 119 l 115 9 b 115 -99 115 -51 115 -99 b 141 -91 115 -99 127 -95 b 171 -81 166 -81 167 -81 l 171 -81 b 191 -94 181 -81 189 -87 b 193 -142 191 -97 193 -120 b 191 -195 193 -167 191 -194 b 125 -227 187 -205 187 -204 l 115 -230 l 115 -366 l 115 -503 l 114 -506 b 95 -519 110 -514 102 -519 b 74 -506 87 -519 78 -514 l 73 -503 l 73 -374 b 73 -245 73 -260 73 -245 b 73 -245 73 -245 73 -245 b 55 -252 72 -245 63 -249 l 32 -260 b 19 -263 27 -262 23 -263 b 4 -256 13 -263 8 -260 b 0 -215 0 -251 0 -254 b 0 -199 0 -210 0 -206 l 0 -152 l 1 -149 b 8 -140 2 -145 5 -141 b 42 -127 9 -140 24 -133 l 73 -116 l 73 -5 b 73 23 73 4 73 15 b 73 105 73 70 73 105 b 49 97 73 105 61 101 b 17 88 32 91 23 88 b 4 95 10 88 8 91 b 0 137 0 101 0 98 b 0 151 0 141 0 145 l 0 199 l 1 202 b 43 224 5 212 5 212 l 73 234 l 73 367 l 73 502 l 74 505 b 85 514 77 509 81 513 ',\n },\n accidentalThreeQuarterTonesSharpStein: {\n x_min: -1.359375,\n x_max: 455.96875,\n ha: 465,\n o: 'm 352 541 b 357 542 353 542 355 542 b 377 530 364 542 372 537 l 378 526 l 378 394 l 379 262 l 404 266 b 436 270 420 269 430 270 b 450 265 443 270 446 269 b 455 220 455 259 455 260 l 455 208 l 455 161 l 454 156 b 411 140 449 147 447 147 b 378 133 393 137 379 134 b 378 68 378 133 378 106 b 378 22 378 54 378 38 l 379 -87 l 404 -83 b 436 -79 420 -80 430 -79 b 450 -84 443 -79 446 -80 b 455 -129 455 -90 455 -88 l 455 -141 l 455 -188 l 454 -192 b 413 -209 449 -202 447 -202 b 382 -215 398 -212 383 -215 l 378 -215 l 378 -345 l 378 -380 b 375 -485 378 -484 378 -480 b 357 -494 371 -491 364 -494 b 340 -485 351 -494 344 -491 b 336 -383 337 -480 336 -484 l 336 -349 l 336 -223 l 334 -223 b 291 -231 334 -223 314 -227 l 247 -240 l 247 -371 l 246 -503 l 245 -506 b 225 -519 242 -514 234 -519 b 206 -506 219 -519 210 -514 l 205 -503 l 205 -376 l 205 -248 l 160 -256 l 115 -265 l 115 -396 l 115 -527 l 114 -531 b 95 -544 110 -539 102 -544 b 76 -531 87 -544 78 -539 l 73 -527 l 73 -399 b 73 -273 73 -330 73 -273 b 49 -277 73 -273 61 -274 b 17 -281 32 -280 24 -281 b 4 -276 10 -281 8 -280 b -1 -234 0 -269 -1 -272 b 0 -219 -1 -229 0 -224 l 0 -170 l 1 -167 b 10 -158 2 -163 6 -159 b 49 -149 13 -156 16 -155 l 73 -145 l 73 -34 b 73 76 73 26 73 76 b 49 72 73 76 61 74 b 17 68 32 69 24 68 b 4 73 10 68 8 69 b -1 115 0 80 -1 77 b 0 130 -1 120 0 124 l 0 179 l 1 181 b 10 191 2 186 6 190 b 49 199 13 192 16 194 l 73 204 l 73 338 b 73 374 73 352 73 365 b 77 483 73 484 73 477 b 95 492 81 489 88 492 b 111 483 100 492 107 489 b 115 378 115 477 115 483 l 115 342 b 117 212 115 223 115 212 b 204 229 117 212 200 227 l 205 229 l 205 365 l 205 502 l 206 505 b 225 517 210 513 219 517 b 245 505 234 517 242 513 l 246 502 l 247 369 l 247 237 l 249 237 b 336 254 253 238 336 254 b 337 390 336 254 337 302 l 337 526 l 338 530 b 352 541 341 535 347 539 m 336 15 b 336 126 336 102 336 126 l 336 126 b 291 117 336 126 315 122 l 247 109 l 247 -1 l 247 -112 l 249 -112 b 336 -95 253 -111 336 -95 b 336 15 336 -95 336 -56 m 205 -120 b 205 -55 205 -120 205 -93 b 205 -9 205 -41 205 -24 l 205 101 l 160 93 l 115 84 l 115 -26 b 115 -83 115 -49 115 -69 b 117 -137 115 -133 115 -137 b 205 -120 118 -137 204 -120 ',\n },\n accidentalBuyukMucennebFlat: {\n x_min: -171.5,\n x_max: 251.8125,\n ha: 257,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 553 20 616 20 614 b 20 491 20 503 20 491 l 20 491 b 153 535 47 501 149 535 b 174 514 167 535 174 524 b 164 496 174 508 171 501 b 92 470 164 495 132 484 l 20 445 l 20 390 b 20 363 20 378 20 370 b 20 333 20 340 20 333 l 20 333 b 153 377 47 344 149 377 b 174 356 167 377 174 367 b 164 338 174 349 171 342 b 92 312 164 338 132 326 l 20 288 l 20 219 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 30 -21 -212 -21 -212 b -21 273 -21 163 -21 273 b -84 252 -21 273 -50 263 b -152 230 -133 234 -145 230 b -157 231 -155 230 -156 231 b -171 252 -166 234 -171 244 b -160 270 -171 259 -167 266 b -27 316 -159 270 -93 294 l -21 319 l -21 374 b -21 431 -21 406 -21 431 b -84 409 -21 431 -50 421 b -152 388 -133 392 -145 388 b -157 390 -155 388 -156 388 b -171 409 -166 392 -171 401 b -160 428 -171 417 -167 424 b -27 474 -159 428 -93 451 l -21 476 l -21 546 b -20 620 -21 614 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ',\n },\n accidentalBakiyeFlat: {\n x_min: -176.9375,\n x_max: 251.8125,\n ha: 257,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 503 20 616 20 614 b 20 391 20 442 20 391 b 84 424 20 391 49 406 l 147 456 l 152 456 b 153 456 153 456 153 456 b 175 435 166 456 175 446 b 172 427 175 433 174 430 b 92 380 170 420 172 421 l 20 342 l 20 245 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 54 -21 -212 -21 -212 b -21 322 -21 201 -21 322 b -85 290 -21 322 -50 308 l -148 256 l -153 256 b -155 256 -155 256 -155 256 b -176 277 -167 256 -176 266 b -174 285 -176 280 -175 283 b -93 333 -171 294 -174 292 l -21 370 l -21 494 b -20 620 -21 616 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ',\n },\n accidentalKomaSharp: {\n x_min: -1.359375,\n x_max: 455.96875,\n ha: 465,\n o: 'm 352 541 b 357 542 353 542 355 542 b 377 530 364 542 372 537 l 378 526 l 378 394 l 379 262 l 404 266 b 436 270 420 269 430 270 b 450 265 443 270 446 269 b 455 220 455 259 455 260 l 455 208 l 455 161 l 454 156 b 411 140 449 147 447 147 b 378 133 393 137 379 134 b 378 68 378 133 378 106 b 378 22 378 54 378 38 l 379 -87 l 404 -83 b 436 -79 420 -80 430 -79 b 450 -84 443 -79 446 -80 b 455 -129 455 -90 455 -88 l 455 -141 l 455 -188 l 454 -192 b 413 -209 449 -202 447 -202 b 382 -215 398 -212 383 -215 l 378 -215 l 378 -345 l 378 -380 b 375 -485 378 -484 378 -480 b 357 -494 371 -491 364 -494 b 340 -485 351 -494 344 -491 b 336 -383 337 -480 336 -484 l 336 -349 l 336 -223 l 334 -223 b 291 -231 334 -223 314 -227 l 247 -240 l 247 -371 l 246 -503 l 245 -506 b 225 -519 242 -514 234 -519 b 206 -506 219 -519 210 -514 l 205 -503 l 205 -376 l 205 -248 l 160 -256 l 115 -265 l 115 -396 l 115 -527 l 114 -531 b 95 -544 110 -539 102 -544 b 76 -531 87 -544 78 -539 l 73 -527 l 73 -399 b 73 -273 73 -330 73 -273 b 49 -277 73 -273 61 -274 b 17 -281 32 -280 24 -281 b 4 -276 10 -281 8 -280 b -1 -234 0 -269 -1 -272 b 0 -219 -1 -229 0 -224 l 0 -170 l 1 -167 b 10 -158 2 -163 6 -159 b 49 -149 13 -156 16 -155 l 73 -145 l 73 -34 b 73 76 73 26 73 76 b 49 72 73 76 61 74 b 17 68 32 69 24 68 b 4 73 10 68 8 69 b -1 115 0 80 -1 77 b 0 130 -1 120 0 124 l 0 179 l 1 181 b 10 191 2 186 6 190 b 49 199 13 192 16 194 l 73 204 l 73 338 b 73 374 73 352 73 365 b 77 483 73 484 73 477 b 95 492 81 489 88 492 b 111 483 100 492 107 489 b 115 378 115 477 115 483 l 115 342 b 117 212 115 223 115 212 b 204 229 117 212 200 227 l 205 229 l 205 365 l 205 502 l 206 505 b 225 517 210 513 219 517 b 245 505 234 517 242 513 l 246 502 l 247 369 l 247 237 l 249 237 b 336 254 253 238 336 254 b 337 390 336 254 337 302 l 337 526 l 338 530 b 352 541 341 535 347 539 m 336 15 b 336 126 336 102 336 126 l 336 126 b 291 117 336 126 315 122 l 247 109 l 247 -1 l 247 -112 l 249 -112 b 336 -95 253 -111 336 -95 b 336 15 336 -95 336 -56 m 205 -120 b 205 -55 205 -120 205 -93 b 205 -9 205 -41 205 -24 l 205 101 l 160 93 l 115 84 l 115 -26 b 115 -83 115 -49 115 -69 b 117 -137 115 -133 115 -137 b 205 -120 118 -137 204 -120 ',\n },\n accidentalKucukMucennebSharp: {\n x_min: -1.359375,\n x_max: 255.890625,\n ha: 261,\n o: 'm 118 514 b 127 517 121 517 122 517 b 147 505 136 517 142 513 l 148 502 l 148 403 b 148 306 148 351 148 306 b 174 315 149 306 160 310 l 200 324 l 205 323 b 223 312 213 323 220 319 l 225 308 l 225 260 b 225 245 225 255 225 249 b 220 204 225 208 224 209 b 179 188 216 199 215 199 l 148 177 l 148 124 l 148 70 l 189 84 b 236 98 219 94 230 98 b 247 94 240 98 243 97 b 255 52 254 88 255 87 b 255 33 255 47 255 40 l 254 -12 l 253 -15 b 249 -22 253 -18 250 -20 l 245 -24 l 196 -41 l 148 -58 l 148 -108 b 148 -158 148 -136 148 -158 b 174 -148 148 -158 160 -154 b 204 -140 198 -140 200 -140 l 204 -140 b 224 -152 213 -140 221 -145 b 225 -201 224 -155 225 -177 b 224 -254 225 -226 224 -251 b 157 -284 220 -262 220 -262 l 148 -288 l 148 -395 l 148 -503 l 147 -506 b 127 -519 142 -514 134 -519 b 107 -506 119 -519 111 -514 l 106 -503 l 106 -403 b 106 -303 106 -316 106 -303 b 104 -303 104 -303 104 -303 b 88 -310 104 -303 96 -306 l 63 -319 b 51 -322 59 -320 55 -322 b 36 -315 46 -322 40 -319 b 31 -273 32 -309 31 -312 b 31 -258 31 -269 31 -263 l 31 -210 l 34 -206 b 40 -198 35 -204 38 -199 b 74 -186 42 -197 57 -191 l 106 -173 l 106 -123 b 106 -97 106 -112 106 -104 b 106 -72 106 -76 106 -72 b 104 -72 106 -72 106 -72 b 20 -99 89 -79 23 -99 b 0 -84 10 -99 2 -93 b -1 -37 0 -81 -1 -59 b 0 11 -1 -15 0 9 b 58 40 4 22 2 22 l 106 56 l 106 109 b 106 123 106 115 106 119 b 106 162 106 147 106 162 b 81 155 106 162 93 159 b 50 147 65 149 55 147 b 36 152 43 147 40 148 b 31 194 32 158 31 156 b 31 209 31 198 31 204 l 31 256 l 34 260 b 76 281 38 269 38 269 l 106 292 l 106 396 l 106 502 l 107 505 b 118 514 110 509 114 513 ',\n },\n articAccentAbove: {\n x_min: -348.4375,\n x_max: 24.5,\n ha: 25,\n o: 'm -330 155 b -322 156 -329 156 -326 156 b -315 156 -319 156 -317 156 b -298 147 -311 155 -308 154 b -19 30 -224 98 -122 55 l 2 26 b 24 -1 17 22 24 13 b 2 -27 24 -15 17 -23 l -19 -31 b -298 -148 -122 -56 -224 -99 b -322 -158 -313 -158 -315 -158 b -348 -131 -338 -158 -348 -145 b -344 -117 -348 -127 -347 -122 b -328 -104 -341 -112 -338 -111 b -127 -8 -269 -65 -202 -33 b -106 0 -115 -4 -106 -1 b -127 6 -106 0 -115 2 b -328 102 -202 31 -269 63 b -344 116 -338 109 -341 111 b -348 130 -347 120 -348 124 b -330 155 -348 141 -341 152 ',\n },\n articAccentBelow: {\n x_min: -348.4375,\n x_max: 24.5,\n ha: 25,\n o: 'm -330 155 b -322 156 -329 156 -326 156 b -315 156 -319 156 -317 156 b -298 147 -311 155 -308 154 b -19 30 -224 98 -122 55 l 2 26 b 24 -1 17 22 24 13 b 2 -27 24 -15 17 -23 l -19 -31 b -298 -148 -122 -56 -224 -99 b -322 -158 -313 -158 -315 -158 b -348 -131 -338 -158 -348 -145 b -344 -117 -348 -127 -347 -122 b -328 -104 -341 -112 -338 -111 b -127 -8 -269 -65 -202 -33 b -106 0 -115 -4 -106 -1 b -127 6 -106 0 -115 2 b -328 102 -202 31 -269 63 b -344 116 -338 109 -341 111 b -348 130 -347 120 -348 124 b -330 155 -348 141 -341 152 ',\n },\n articTenutoAbove: {\n x_min: 0,\n x_max: 318.5,\n ha: 325,\n o: 'm 20 376 b 167 377 23 377 96 377 b 296 376 231 377 294 377 b 318 347 311 371 318 359 b 296 316 318 333 311 320 b 159 315 294 315 227 315 b 21 316 91 315 24 315 b 0 345 6 320 0 333 b 20 376 0 359 6 371 ',\n },\n articTenutoBelow: {\n x_min: 0,\n x_max: 318.5,\n ha: 325,\n o: 'm 20 376 b 167 377 23 377 96 377 b 296 376 231 377 294 377 b 318 347 311 371 318 359 b 296 316 318 333 311 320 b 159 315 294 315 227 315 b 21 316 91 315 24 315 b 0 345 6 320 0 333 b 20 376 0 359 6 371 ',\n },\n articStaccatoAbove: {\n x_min: 0,\n x_max: 133.390625,\n ha: 136,\n o: 'm 54 66 b 65 68 58 68 61 68 b 122 37 88 68 110 56 b 133 -1 130 26 133 12 b 104 -58 133 -23 123 -44 b 66 -69 92 -65 78 -69 b 10 -38 44 -69 23 -58 b 0 -1 2 -27 0 -13 b 54 66 0 30 20 61 ',\n },\n articStaccatoBelow: {\n x_min: 0,\n x_max: 133.390625,\n ha: 136,\n o: 'm 54 66 b 65 68 58 68 61 68 b 122 37 88 68 110 56 b 133 -1 130 26 133 12 b 104 -58 133 -23 123 -44 b 66 -69 92 -65 78 -69 b 10 -38 44 -69 23 -58 b 0 -1 2 -27 0 -13 b 54 66 0 30 20 61 ',\n },\n articStaccatissimoAbove: {\n x_min: -73.5,\n x_max: 72.140625,\n ha: 74,\n o: 'm -72 252 l -73 254 l 0 254 l 72 254 l 70 252 b 0 -1 70 248 0 -1 b -72 252 -1 -1 -72 248 ',\n },\n articStaccatissimoBelow: {\n x_min: -73.5,\n x_max: 72.140625,\n ha: 74,\n o: 'm -72 252 l -73 254 l 0 254 l 72 254 l 70 252 b 0 -1 70 248 0 -1 b -72 252 -1 -1 -72 248 ',\n },\n articMarcatoAbove: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -8 -1 b -1 0 -5 -1 -4 0 b 16 -11 5 0 13 -4 b 83 -186 17 -12 47 -90 l 148 -358 l 148 -363 b 127 -385 148 -376 138 -385 b 112 -378 122 -385 118 -383 b 54 -226 110 -374 114 -385 b 0 -81 24 -147 0 -81 b -55 -226 -1 -81 -25 -147 b -114 -378 -115 -385 -111 -374 b -129 -385 -119 -383 -123 -385 b -149 -363 -140 -385 -149 -376 l -149 -358 l -84 -186 b -19 -11 -49 -90 -19 -12 b -8 -1 -17 -8 -12 -4 ',\n },\n articMarcatoBelow: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -8 -1 b -1 0 -5 -1 -4 0 b 16 -11 5 0 13 -4 b 83 -186 17 -12 47 -90 l 148 -358 l 148 -363 b 127 -385 148 -376 138 -385 b 112 -378 122 -385 118 -383 b 54 -226 110 -374 114 -385 b 0 -81 24 -147 0 -81 b -55 -226 -1 -81 -25 -147 b -114 -378 -115 -385 -111 -374 b -129 -385 -119 -383 -123 -385 b -149 -363 -140 -385 -149 -376 l -149 -358 l -84 -186 b -19 -11 -49 -90 -19 -12 b -8 -1 -17 -8 -12 -4 ',\n },\n fermataAbove: {\n x_min: -442.359375,\n x_max: 441,\n ha: 450,\n o: 'm -31 487 b -1 488 -21 488 -10 488 b 434 104 216 488 397 330 b 441 27 438 79 441 47 b 439 12 441 20 439 15 b 419 0 435 4 427 0 b 404 5 413 0 408 1 b 398 30 400 11 398 13 b 0 351 390 213 213 351 b -59 348 -20 351 -39 349 b -400 30 -251 324 -393 191 b -405 5 -400 13 -401 11 b -420 0 -409 1 -415 0 b -441 12 -428 0 -436 4 b -442 27 -441 15 -442 20 b -435 104 -442 47 -439 79 b -31 487 -401 316 -235 474 m -13 131 b -1 133 -9 133 -5 133 b 51 105 19 133 39 123 b 61 70 58 95 61 83 b 51 34 61 58 58 45 b -1 6 39 16 19 6 b -46 27 -17 6 -34 13 b -62 69 -57 38 -62 54 b -13 131 -62 98 -44 124 ',\n },\n fermataBelow: {\n x_min: -441,\n x_max: 439.640625,\n ha: 449,\n o: 'm -428 -2 b -421 0 -427 -1 -424 0 b -406 -6 -416 0 -409 -2 b -400 -31 -401 -12 -400 -15 b -1 -352 -392 -215 -215 -352 b 58 -349 19 -352 38 -351 b 398 -31 250 -326 392 -192 b 404 -6 398 -15 400 -12 b 419 -1 408 -2 413 -1 b 439 -13 427 -1 435 -5 b 439 -29 439 -16 439 -22 b 434 -105 439 -48 438 -80 b 0 -489 397 -333 213 -489 b -68 -484 -23 -489 -44 -488 b -441 -36 -280 -452 -436 -263 b -441 -30 -441 -34 -441 -31 b -428 -2 -441 -11 -439 -5 m -13 -9 b -1 -8 -9 -8 -5 -8 b 50 -36 19 -8 39 -19 b 61 -72 57 -47 61 -59 b 50 -106 61 -84 57 -97 b -1 -134 39 -124 19 -134 b -46 -115 -17 -134 -34 -129 b -62 -72 -57 -102 -62 -87 b -13 -9 -62 -44 -44 -16 ',\n },\n breathMarkComma: {\n x_min: -1.359375,\n x_max: 193.28125,\n ha: 197,\n o: 'm 78 233 b 87 233 81 233 84 233 b 187 140 132 233 174 195 b 193 102 190 127 193 115 b 43 -113 193 22 136 -62 b 27 -119 36 -116 31 -119 b 19 -108 21 -119 19 -115 b 29 -97 19 -102 20 -101 b 102 13 73 -72 102 -27 b 92 51 102 26 98 40 l 91 54 l 84 54 b 8 104 53 54 21 74 b -1 142 1 116 -1 130 b 78 233 -1 187 31 227 ',\n },\n breathMarkUpbow: {\n x_min: -170.140625,\n x_max: 168.78125,\n ha: 172,\n o: 'm -160 567 b -122 567 -159 567 -149 567 l -87 567 l -84 566 b -74 553 -78 563 -77 560 b -20 366 -73 551 -49 466 b 31 186 8 267 31 186 b 85 371 31 186 55 269 b 140 559 114 473 138 557 b 153 567 141 564 148 567 b 168 559 159 567 166 564 b 168 555 168 557 168 557 b 92 281 168 548 159 513 b 14 13 50 134 14 13 b 0 0 14 6 6 0 b -17 15 -8 0 -17 8 b -93 283 -17 15 -51 136 b -170 552 -166 533 -170 548 b -170 553 -170 552 -170 552 b -160 567 -170 560 -167 564 ',\n },\n caesura: {\n x_min: 0,\n x_max: 622.03125,\n ha: 635,\n o: 'm 398 417 b 406 419 401 419 404 419 b 427 398 417 419 427 409 b 427 391 427 395 427 392 b 34 -274 424 385 38 -272 b 20 -280 29 -278 25 -280 b 0 -259 9 -280 0 -270 b 0 -252 0 -256 0 -254 b 393 413 2 -247 389 410 b 398 417 394 415 397 416 m 592 417 b 600 419 594 419 597 419 b 622 398 611 419 622 409 b 620 391 622 395 620 392 b 227 -274 617 385 231 -272 b 213 -280 223 -278 219 -280 b 193 -259 202 -280 193 -270 b 194 -252 193 -256 193 -254 b 586 413 196 -247 582 410 b 592 417 588 415 590 416 ',\n },\n caesuraCurved: {\n x_min: 0,\n x_max: 503.609375,\n ha: 514,\n o: 'm 274 430 b 277 430 276 430 277 430 b 310 394 296 430 310 415 b 308 383 310 391 308 387 b 306 367 307 381 307 374 b 236 120 298 305 272 210 b 40 -273 189 -5 125 -134 b 20 -287 35 -283 27 -287 b 5 -281 14 -287 9 -285 b 0 -267 1 -277 0 -273 b 9 -242 0 -262 2 -255 b 246 395 137 -12 232 242 b 274 430 249 416 257 427 m 468 430 b 472 430 469 430 470 430 b 503 394 490 430 503 415 b 502 383 503 391 503 387 b 499 367 502 381 500 374 b 431 120 491 305 465 210 b 234 -273 382 -5 318 -134 b 213 -287 228 -283 220 -287 b 198 -281 208 -287 202 -285 b 193 -267 194 -277 193 -273 b 202 -242 193 -262 196 -255 b 439 395 330 -12 426 242 b 468 430 442 416 451 427 ',\n },\n restMaxima: {\n x_min: 0,\n x_max: 464.140625,\n ha: 474,\n o: 'm 0 0 l 0 347 l 76 347 l 153 347 l 153 0 l 153 -348 l 76 -348 l 0 -348 l 0 0 m 308 -1 l 308 347 l 386 347 l 464 347 l 464 -1 l 464 -348 l 386 -348 l 308 -348 l 308 -1 ',\n },\n restDoubleWhole: {\n x_min: 0,\n x_max: 386.5625,\n ha: 394,\n o: 'm 0 173 l 0 347 l 193 347 l 386 347 l 386 173 l 386 0 l 193 0 l 0 0 l 0 173 ',\n },\n restWhole: {\n x_min: 0,\n x_max: 447.8125,\n ha: 457,\n o: 'm 0 -87 l 0 0 l 223 0 l 447 0 l 447 -87 l 447 -174 l 223 -174 l 0 -174 l 0 -87 ',\n },\n restHalf: {\n x_min: 0,\n x_max: 447.8125,\n ha: 457,\n o: 'm 0 86 l 0 173 l 223 173 l 447 173 l 447 86 l 447 0 l 223 0 l 0 0 l 0 86 ',\n },\n restQuarter: {\n x_min: 0,\n x_max: 300.8125,\n ha: 307,\n o: 'm 49 505 b 53 506 50 505 51 506 b 70 496 58 506 62 503 b 81 485 73 492 78 488 l 96 473 l 111 459 l 122 449 l 134 438 l 182 396 l 255 330 b 292 291 292 298 292 298 l 292 290 l 292 284 l 283 270 b 209 36 234 197 209 113 b 288 -170 209 -44 235 -119 b 299 -184 295 -179 299 -181 b 300 -191 300 -187 300 -188 b 285 -206 300 -199 294 -206 b 280 -206 283 -206 281 -206 b 247 -201 270 -202 259 -201 b 176 -222 223 -201 197 -208 b 114 -340 136 -249 114 -292 b 172 -471 114 -384 134 -433 b 185 -492 182 -481 185 -487 b 181 -502 185 -496 183 -499 b 171 -508 176 -505 174 -508 b 152 -498 166 -508 160 -503 b 0 -284 65 -428 12 -352 b 0 -260 0 -278 0 -270 b 1 -238 0 -252 0 -242 b 148 -140 16 -177 73 -140 b 209 -148 167 -140 189 -142 b 215 -149 212 -148 215 -149 b 215 -149 215 -149 215 -149 l 215 -149 b 201 -136 215 -148 209 -142 l 157 -97 l 96 -41 b 17 34 21 24 17 29 b 17 37 17 36 17 36 b 17 38 17 37 17 38 b 25 56 17 44 17 44 b 110 298 81 131 110 219 b 46 474 110 367 88 431 b 38 491 40 480 38 487 b 49 505 38 498 42 502 ',\n },\n rest8th: {\n x_min: 0,\n x_max: 349.8125,\n ha: 357,\n o: 'm 88 302 b 103 303 93 302 98 303 b 202 224 149 303 191 270 b 205 199 204 216 205 208 b 178 129 205 173 196 147 l 175 126 l 182 127 b 307 249 236 142 284 190 b 313 259 308 254 311 258 b 329 267 317 265 323 267 b 349 247 340 267 349 259 b 201 -263 349 242 204 -258 b 182 -273 197 -270 190 -273 b 163 -260 174 -273 166 -269 b 161 -256 161 -259 161 -258 b 217 -59 161 -248 170 -220 b 272 129 247 43 272 127 b 272 129 272 129 272 129 b 264 122 272 129 268 126 b 140 80 227 94 183 80 b 36 115 102 80 65 91 b 0 194 10 136 0 165 b 88 302 0 244 32 292 ',\n },\n rest16th: {\n x_min: 0,\n x_max: 450.53125,\n ha: 460,\n o: 'm 189 302 b 204 303 193 302 198 303 b 303 224 250 303 292 270 b 306 199 304 216 306 208 b 279 129 306 173 296 147 l 276 126 l 281 127 b 408 249 337 142 385 190 b 412 259 409 254 412 258 b 430 267 417 265 423 267 b 450 247 441 267 450 259 b 200 -605 450 242 204 -599 b 182 -616 197 -612 190 -616 b 163 -602 174 -616 166 -610 b 161 -598 161 -601 161 -601 b 217 -402 161 -589 170 -562 b 272 -213 247 -298 272 -213 b 272 -213 272 -213 272 -213 b 264 -219 272 -213 268 -216 b 140 -262 227 -247 182 -262 b 36 -226 102 -262 65 -249 b 0 -145 12 -206 0 -176 b 17 -84 0 -124 5 -104 b 103 -38 38 -54 70 -38 b 191 -91 137 -38 172 -56 b 205 -141 201 -106 205 -124 b 178 -212 205 -167 196 -194 l 175 -215 l 182 -213 b 307 -93 236 -198 284 -151 b 372 129 308 -88 372 127 b 372 129 372 129 372 129 b 364 122 372 129 368 126 b 240 80 328 94 283 80 b 137 115 202 80 166 91 b 99 194 111 136 99 165 b 189 302 99 244 133 292 ',\n },\n rest32nd: {\n x_min: 0,\n x_max: 551.25,\n ha: 563,\n o: 'm 289 644 b 304 645 294 645 299 645 b 404 566 349 645 392 613 b 406 541 405 557 406 549 b 379 471 406 514 397 489 l 377 467 l 382 470 b 509 591 438 485 485 531 b 513 601 510 595 513 599 b 530 609 518 607 524 609 b 551 588 540 609 551 602 b 200 -605 551 584 204 -599 b 182 -616 197 -612 190 -616 b 163 -602 174 -616 166 -610 b 161 -598 161 -601 161 -601 b 217 -402 161 -589 170 -562 b 272 -213 247 -298 272 -213 b 272 -213 272 -213 272 -213 b 264 -219 272 -213 268 -216 b 140 -262 227 -247 182 -262 b 36 -226 102 -262 65 -249 b 0 -145 12 -206 0 -176 b 17 -84 0 -124 5 -104 b 103 -38 38 -54 70 -38 b 191 -91 137 -38 172 -56 b 205 -141 201 -106 205 -124 b 178 -212 205 -167 196 -194 l 175 -215 l 182 -213 b 307 -93 236 -198 284 -151 b 372 129 308 -88 372 127 b 372 129 372 129 372 129 b 364 122 372 129 368 126 b 240 80 328 94 283 80 b 137 115 202 80 166 91 b 99 195 112 136 99 165 b 118 256 99 217 106 238 b 204 303 138 287 171 303 b 292 249 238 303 273 285 b 306 199 302 234 306 217 b 279 129 306 173 296 148 l 276 126 l 281 127 b 408 248 336 142 385 190 b 473 470 409 254 473 469 b 473 470 473 470 473 470 b 465 464 473 470 469 467 b 341 421 428 435 383 421 b 236 458 303 421 266 433 b 200 537 212 478 200 508 b 289 644 200 585 234 635 ',\n },\n rest64th: {\n x_min: -1.359375,\n x_max: 651.96875,\n ha: 665,\n o: 'm 389 644 b 405 645 394 645 400 645 b 504 566 450 645 492 613 b 507 541 506 557 507 549 b 480 471 507 514 498 489 l 477 467 l 483 470 b 609 591 539 485 586 531 b 613 601 611 595 613 599 b 631 609 619 607 624 609 b 651 588 641 609 651 602 b 200 -946 651 584 204 -941 b 182 -957 197 -953 190 -957 b 163 -945 174 -957 166 -953 b 161 -939 161 -942 161 -942 b 217 -743 161 -931 170 -904 b 272 -555 247 -639 272 -555 b 272 -555 272 -555 272 -555 b 264 -560 272 -555 268 -557 b 140 -603 227 -589 182 -603 b 36 -567 102 -603 65 -592 b -1 -487 12 -548 -1 -517 b 17 -427 -1 -466 5 -445 b 103 -380 38 -395 70 -380 b 191 -433 137 -380 172 -398 b 205 -484 201 -448 205 -466 b 178 -553 205 -509 196 -535 l 175 -557 l 182 -555 b 307 -435 236 -539 284 -494 b 372 -213 308 -430 372 -215 b 372 -213 372 -213 372 -213 b 364 -219 372 -213 368 -216 b 240 -262 328 -247 283 -262 b 137 -226 202 -262 166 -249 b 99 -145 112 -206 99 -176 b 118 -84 99 -124 106 -104 b 204 -38 138 -54 171 -38 b 292 -91 238 -38 273 -56 b 306 -141 302 -106 306 -124 b 279 -212 306 -167 296 -194 l 276 -215 l 281 -213 b 408 -93 336 -198 385 -151 b 473 129 409 -88 473 127 b 473 129 473 129 473 129 b 465 122 473 129 469 126 b 341 80 428 94 383 80 b 236 115 303 80 266 91 b 200 195 213 136 200 165 b 217 256 200 217 206 238 b 304 303 239 287 272 303 b 393 249 338 303 374 285 b 406 199 402 234 406 217 b 379 129 406 173 397 148 l 377 126 l 382 127 b 509 248 436 142 485 190 b 574 470 510 254 574 469 b 574 470 574 470 574 470 b 566 464 574 470 570 467 b 442 421 529 435 484 421 b 337 458 404 421 367 433 b 300 537 313 478 300 508 b 389 644 300 585 334 635 ',\n },\n rest128th: {\n x_min: -1.359375,\n x_max: 752.703125,\n ha: 768,\n o: 'm 490 985 b 504 986 495 986 500 986 b 604 907 551 986 593 954 b 607 884 607 900 607 892 b 581 813 607 857 597 831 l 578 810 l 583 811 b 710 932 638 827 687 873 b 714 943 711 936 713 942 b 730 952 720 949 725 952 b 752 931 741 952 752 943 b 200 -946 752 927 204 -941 b 182 -957 197 -953 190 -957 b 163 -945 174 -957 166 -953 b 161 -939 161 -942 161 -942 b 217 -743 161 -931 170 -904 b 272 -555 247 -639 272 -555 b 272 -555 272 -555 272 -555 b 264 -560 272 -555 268 -557 b 140 -603 227 -589 182 -603 b 36 -567 102 -603 65 -592 b -1 -487 12 -548 -1 -517 b 17 -427 -1 -466 5 -445 b 103 -380 38 -395 70 -380 b 191 -433 137 -380 172 -398 b 205 -484 201 -448 205 -466 b 178 -553 205 -509 196 -535 l 175 -557 l 182 -555 b 307 -435 236 -539 284 -494 b 372 -213 308 -430 372 -215 b 372 -213 372 -213 372 -213 b 364 -219 372 -213 368 -216 b 240 -262 328 -247 283 -262 b 137 -226 202 -262 166 -249 b 99 -145 112 -206 99 -176 b 118 -84 99 -124 106 -104 b 204 -38 138 -54 171 -38 b 292 -91 238 -38 273 -56 b 306 -141 302 -106 306 -124 b 279 -212 306 -167 296 -194 l 276 -215 l 281 -213 b 408 -93 336 -198 385 -151 b 473 129 409 -88 473 127 b 473 129 473 129 473 129 b 465 122 473 129 469 126 b 341 80 428 94 383 80 b 236 115 303 80 266 91 b 200 195 213 136 200 165 b 217 256 200 217 206 238 b 304 303 239 287 272 303 b 393 249 338 303 374 285 b 406 199 402 234 406 217 b 379 129 406 173 397 148 l 377 126 l 382 127 b 509 248 436 142 485 190 b 574 470 510 254 574 469 b 574 470 574 470 574 470 b 566 464 574 470 570 467 b 442 421 529 435 484 421 b 337 458 404 421 367 433 b 300 538 314 477 300 508 b 318 598 300 559 306 580 b 404 645 340 630 372 645 b 494 592 439 645 475 627 b 507 541 502 577 507 559 b 480 471 507 516 498 489 l 477 467 l 483 470 b 608 589 537 485 586 531 b 675 811 611 595 675 810 b 675 811 675 811 675 811 b 666 806 675 811 671 809 b 543 763 628 777 585 763 b 438 799 504 763 468 775 b 401 878 412 820 401 849 b 490 985 401 928 434 977 ',\n },\n dynamicPiano: {\n x_min: -53.078125,\n x_max: 513.140625,\n ha: 485,\n o: 'm 185 383 b 196 384 187 383 191 384 b 277 334 230 384 259 365 b 288 301 281 324 288 306 b 288 297 288 298 288 297 b 294 302 289 297 291 299 b 394 370 323 338 367 367 b 404 371 398 370 401 371 b 510 272 453 371 498 328 b 513 237 513 262 513 251 b 507 172 513 217 511 192 b 326 -34 487 59 412 -26 b 314 -36 322 -36 318 -36 b 274 -24 298 -36 283 -31 l 265 -16 b 224 44 246 -1 232 20 b 223 49 224 47 223 49 b 223 49 223 49 223 49 b 149 -197 221 48 149 -194 b 149 -198 149 -197 149 -198 b 170 -210 149 -202 155 -205 b 187 -215 174 -210 175 -212 b 204 -231 201 -219 204 -222 b 197 -245 204 -240 202 -242 l 194 -248 l 76 -248 l -42 -248 l -46 -245 b -53 -231 -51 -242 -53 -240 b -35 -215 -53 -222 -49 -217 b -13 -210 -21 -212 -20 -212 b -6 -208 -10 -209 -8 -208 b 0 -206 -6 -208 -2 -206 b 25 -188 13 -201 21 -195 b 163 280 28 -183 163 276 b 166 291 163 283 164 287 b 167 302 167 295 167 299 b 155 324 167 315 161 324 b 155 324 155 324 155 324 b 65 230 125 322 85 280 b 53 215 61 217 58 215 b 51 215 53 215 51 215 b 42 224 46 215 42 217 b 57 263 42 231 47 244 b 140 360 77 305 104 337 b 152 370 144 365 149 369 b 185 383 157 376 172 381 m 374 306 b 366 308 371 308 368 308 b 300 273 348 308 321 294 b 284 254 288 262 287 259 b 280 242 283 249 281 245 b 257 169 279 240 270 213 l 236 98 l 236 93 b 251 48 238 77 243 61 b 279 27 258 37 272 27 b 281 27 279 27 280 27 b 291 31 281 27 287 30 b 396 170 334 52 378 109 b 406 247 402 197 406 224 b 401 277 406 259 405 270 b 374 306 397 290 383 303 ',\n },\n dynamicMezzo: {\n x_min: 46.28125,\n x_max: 669.671875,\n ha: 563,\n o: 'm 183 376 b 189 376 185 376 187 376 b 212 374 197 376 208 376 b 265 337 234 369 253 355 b 274 317 268 331 273 320 b 274 316 274 317 274 316 b 280 323 276 316 276 319 b 311 358 288 337 299 348 b 319 366 315 360 318 365 b 356 376 326 373 340 376 b 382 371 364 376 374 374 b 428 337 400 366 417 352 b 436 317 431 331 436 320 b 438 316 436 317 436 316 b 442 323 438 316 439 319 b 475 358 451 337 462 348 b 483 366 477 360 481 365 b 518 376 488 373 503 376 b 544 373 528 376 536 376 b 604 285 579 360 604 326 b 597 249 604 273 601 258 b 543 63 596 247 544 70 b 541 54 543 61 541 55 b 540 44 540 51 540 47 b 552 23 540 33 545 23 b 552 23 552 23 552 23 b 647 126 586 29 627 72 b 658 138 651 136 653 138 b 660 138 660 138 660 138 b 669 129 666 137 669 136 b 654 88 669 122 665 109 b 562 -12 631 43 602 9 l 549 -19 b 521 -27 540 -24 530 -27 b 447 30 490 -27 458 -4 b 443 58 445 38 443 48 b 450 93 443 72 446 84 b 504 278 453 97 504 272 b 507 288 506 283 506 287 b 509 298 507 292 509 295 b 491 326 509 310 502 320 b 487 327 490 327 488 327 b 479 324 484 327 483 326 b 441 270 462 316 443 288 b 435 249 441 265 436 254 b 398 127 434 248 419 195 b 362 4 379 61 362 5 b 328 -1 359 -1 362 -1 b 314 -1 323 -1 319 -1 b 302 -1 310 -1 306 -1 b 266 4 266 -1 269 -1 b 265 6 265 5 265 5 b 303 144 265 13 272 34 b 343 278 325 216 343 276 b 344 288 343 281 344 285 b 345 298 345 291 345 295 b 330 326 345 310 340 320 b 323 327 328 327 325 327 b 317 324 322 327 321 326 b 279 270 300 316 281 288 b 273 249 279 265 274 254 b 236 127 272 248 255 195 b 200 4 216 61 200 5 b 164 -1 197 -1 198 -1 b 151 -1 161 -1 156 -1 b 140 -1 147 -1 142 -1 b 103 4 104 -1 106 -1 b 103 6 103 5 103 5 b 141 144 103 13 108 34 b 181 278 161 216 179 276 b 182 288 181 281 181 285 b 183 298 182 291 183 295 b 168 324 183 310 178 320 b 160 327 166 326 163 327 b 141 320 156 327 151 324 b 69 230 112 305 85 272 b 57 215 65 217 62 215 b 55 215 57 215 55 215 b 46 224 49 215 46 217 b 59 260 46 231 50 242 b 151 363 81 306 112 341 b 161 369 155 365 160 367 b 183 376 166 371 174 374 ',\n },\n dynamicForte: {\n x_min: -118.421875,\n x_max: 597.53125,\n ha: 381,\n o: 'm 460 574 b 464 574 461 574 462 574 b 488 574 470 574 481 574 b 500 573 491 574 498 574 b 594 503 543 570 588 538 b 597 488 596 498 597 494 b 528 417 597 449 564 417 b 502 423 519 417 510 419 b 465 481 477 434 465 458 b 488 528 465 499 472 516 b 490 530 490 530 490 530 b 490 530 490 530 490 530 b 468 517 488 530 475 523 b 349 340 419 485 377 420 b 347 330 348 334 347 330 b 383 328 347 328 363 328 b 428 326 423 328 424 328 b 442 302 438 320 442 312 b 430 281 442 294 438 285 b 385 276 424 277 426 276 l 377 276 l 332 276 l 330 269 b 178 -117 303 126 250 -9 b 1 -249 129 -194 69 -237 b -20 -251 -6 -251 -13 -251 b -114 -187 -65 -251 -100 -227 b -118 -156 -117 -177 -118 -166 b -51 -84 -118 -116 -91 -84 b -31 -87 -46 -84 -39 -86 b 16 -152 0 -95 16 -124 b -12 -205 16 -173 8 -194 b -16 -208 -14 -206 -16 -208 b -14 -208 -16 -208 -14 -208 b -9 -206 -14 -208 -12 -208 b 74 -124 23 -197 54 -166 b 172 224 98 -79 125 22 b 185 276 178 252 183 274 b 185 276 185 276 185 276 b 141 276 185 276 181 276 b 91 280 96 276 96 276 b 77 302 83 285 77 294 b 91 326 77 312 83 320 b 148 328 95 328 96 328 l 198 330 l 202 341 b 460 574 249 473 351 566 ',\n },\n dynamicRinforzando: {\n x_min: 78.9375,\n x_max: 485.921875,\n ha: 417,\n o: 'm 362 378 b 378 380 367 380 372 380 b 472 348 415 380 453 367 b 485 315 481 338 485 327 b 462 273 485 298 477 281 b 439 267 454 269 446 267 b 398 290 424 267 409 274 b 344 319 385 309 364 319 b 281 269 315 319 289 301 b 279 262 280 266 279 262 b 276 256 279 260 277 258 b 274 249 276 254 274 251 b 238 127 273 248 257 192 b 201 4 217 61 201 5 b 166 -1 198 -1 200 -1 b 153 -1 163 -1 157 -1 b 141 -1 148 -1 144 -1 b 104 4 106 -1 107 -1 b 104 6 104 5 104 5 b 142 144 104 13 110 34 b 182 278 164 219 181 276 b 183 288 182 281 182 285 b 185 302 185 292 185 298 b 164 330 185 317 176 328 b 159 330 163 330 161 330 b 102 302 140 330 119 320 b 91 294 95 295 93 294 b 88 294 91 294 89 294 b 78 303 83 294 78 298 b 81 312 78 306 78 309 b 200 373 106 347 160 373 b 215 371 205 373 209 371 b 266 335 235 367 254 353 b 269 331 268 333 269 331 b 269 331 269 331 269 331 b 273 335 269 331 270 334 b 362 378 298 359 330 376 ',\n },\n dynamicSforzando: {\n x_min: 70.78125,\n x_max: 378.390625,\n ha: 315,\n o: 'm 246 373 b 254 373 249 373 251 373 b 372 324 303 373 360 351 b 378 302 377 317 378 309 b 338 251 378 278 362 255 b 328 249 334 249 332 249 b 283 294 303 249 283 270 b 288 315 283 301 284 308 b 289 319 289 317 289 319 b 289 319 289 319 289 319 b 283 320 289 320 287 320 b 270 322 279 322 274 322 b 206 288 242 322 215 308 b 206 283 206 287 206 285 b 257 223 206 267 230 238 b 284 206 272 213 277 210 b 351 90 328 173 351 130 b 340 47 351 74 348 59 b 205 -30 314 -2 264 -30 b 182 -29 198 -30 190 -30 b 84 15 147 -24 103 -5 b 70 48 74 24 70 36 b 108 99 70 70 85 94 b 121 102 112 101 117 102 b 167 56 147 102 167 80 b 159 31 167 48 164 40 l 156 26 l 157 26 b 190 20 167 22 178 20 b 220 26 201 20 212 22 b 258 65 243 34 258 51 b 257 70 258 66 258 69 b 204 126 249 94 234 109 b 114 258 148 158 114 209 b 125 302 114 273 118 288 b 246 373 147 342 193 370 ',\n },\n dynamicZ: {\n x_min: 29.9375,\n x_max: 420.578125,\n ha: 371,\n o: 'm 115 345 b 221 347 117 345 166 347 b 411 345 306 347 409 345 b 420 330 416 342 420 335 b 415 319 420 326 419 321 b 178 118 397 303 179 118 b 178 117 178 118 178 117 b 181 117 178 117 178 117 b 189 117 182 117 185 117 b 193 117 190 117 191 117 b 247 98 215 117 232 111 b 296 75 266 83 280 76 b 302 75 299 75 300 75 b 322 91 311 75 315 79 b 322 91 322 91 322 91 b 322 91 322 91 322 91 b 319 91 322 91 321 91 b 313 90 318 90 315 90 b 283 107 300 90 288 97 b 277 126 279 114 277 121 b 319 167 277 149 295 167 b 319 167 319 167 319 167 b 362 118 347 167 362 147 b 355 82 362 108 359 96 b 311 33 349 65 340 55 b 224 1 284 12 253 1 b 194 5 213 1 204 2 b 168 18 183 8 178 11 b 110 36 151 30 130 36 b 57 15 88 36 68 29 b 47 11 54 12 51 11 b 31 20 40 11 34 13 b 29 26 31 22 29 25 b 68 66 29 36 39 45 b 285 250 73 71 281 248 b 285 250 285 250 285 250 b 231 252 285 252 261 252 b 137 250 190 252 141 250 b 93 227 122 248 110 241 b 78 220 88 222 83 220 b 66 227 74 220 70 222 b 63 234 65 229 63 231 b 85 291 63 241 69 252 b 115 345 108 342 108 344 ',\n },\n ornamentTrill: {\n x_min: -340.28125,\n x_max: 338.921875,\n ha: 346,\n o: 'm -32 520 b -29 521 -31 520 -31 521 b -23 519 -27 521 -24 520 b -20 513 -21 517 -20 516 b -21 506 -20 512 -20 509 b -31 474 -23 502 -27 488 l -53 402 l -66 352 l -68 349 l -57 349 b -32 351 -51 349 -40 351 b 123 370 19 352 74 359 b 137 371 127 370 133 371 b 170 356 152 371 164 366 b 171 355 170 355 170 355 b 216 366 174 355 183 358 b 280 378 268 377 266 377 b 287 378 283 378 284 378 b 332 349 307 378 322 369 b 338 319 336 341 338 330 b 332 301 338 310 336 302 b 242 280 329 299 246 280 b 242 280 242 280 242 280 b 235 288 236 280 235 283 b 235 292 235 290 235 291 b 236 302 236 297 236 299 b 220 337 236 316 230 330 l 216 340 l 210 335 b 159 276 189 322 172 301 b 118 149 152 265 156 274 b 81 34 84 36 85 36 b -8 13 78 33 -4 13 b -8 13 -8 13 -8 13 b -14 20 -12 15 -14 15 b -8 44 -14 24 -12 31 b -2 66 -5 55 -2 65 b -2 66 -2 66 -2 66 l -2 66 b -43 41 -2 66 -21 55 b -114 4 -98 8 -98 8 b -144 0 -123 0 -134 0 b -242 99 -197 0 -242 43 b -242 109 -242 102 -242 105 b -212 219 -240 122 -242 116 b -185 312 -197 270 -185 312 l -185 312 b -189 312 -185 312 -186 312 b -259 312 -200 312 -227 312 b -321 310 -291 312 -310 310 b -334 312 -330 310 -334 312 b -340 319 -338 313 -340 316 b -336 326 -340 322 -338 324 b -291 337 -334 326 -314 331 l -247 347 l -210 348 b -172 348 -190 348 -172 348 b -168 363 -172 348 -171 355 b -145 442 -151 424 -145 441 b -133 452 -144 444 -140 446 l -77 489 b -32 520 -53 506 -32 520 m 57 334 b 53 335 55 335 54 335 b 44 334 50 335 49 335 b -70 316 8 326 -28 320 b -78 309 -78 316 -78 316 b -108 202 -80 305 -88 274 b -141 81 -136 112 -141 93 b -140 74 -141 79 -141 77 b -117 49 -137 59 -127 49 b -107 52 -114 49 -110 51 b 16 127 -106 54 14 126 b 42 217 16 127 42 215 b 49 241 42 222 44 229 b 73 320 53 251 73 317 b 57 334 73 327 65 333 ',\n },\n ornamentTurn: {\n x_min: -423.3125,\n x_max: 421.9375,\n ha: 431,\n o: 'm -262 197 b -247 197 -257 197 -253 197 b -118 162 -210 197 -163 184 b 40 45 -61 134 -13 98 b 277 -95 119 -33 200 -81 b 289 -97 281 -97 285 -97 b 378 0 332 -97 371 -55 b 378 11 378 4 378 6 b 302 83 378 55 345 83 b 242 66 283 83 262 77 b 208 56 231 59 219 56 b 148 120 175 56 148 81 b 201 186 148 151 164 172 b 261 198 220 194 240 198 b 420 45 341 198 411 136 b 421 22 421 37 421 29 b 245 -199 421 -93 338 -199 b 238 -198 243 -199 240 -199 b -44 -47 148 -194 50 -141 b -250 86 -114 22 -183 66 b -295 94 -270 91 -283 94 b -315 91 -302 94 -307 94 b -381 4 -356 81 -381 43 b -355 -56 -381 -18 -372 -40 b -298 -81 -338 -73 -319 -81 b -246 -68 -283 -81 -265 -77 b -212 -58 -234 -61 -223 -58 b -178 -69 -200 -58 -189 -62 b -151 -122 -160 -81 -151 -101 b -171 -167 -151 -138 -157 -155 b -239 -195 -185 -181 -213 -192 b -257 -197 -245 -197 -250 -197 b -423 -5 -352 -197 -423 -109 b -412 65 -423 16 -419 40 b -262 197 -389 137 -329 188 ',\n },\n ornamentTurnSlash: {\n x_min: -423.3125,\n x_max: 421.9375,\n ha: 431,\n o: 'm -10 276 b -2 277 -8 277 -5 277 b 17 265 5 277 13 273 b 19 163 19 260 19 260 l 19 68 l 39 45 b 277 -95 122 -34 200 -81 b 289 -97 281 -97 285 -97 b 378 0 332 -97 371 -54 b 378 11 378 4 378 6 b 302 83 378 55 345 83 b 242 66 283 83 262 77 b 208 56 231 59 219 56 b 148 120 175 56 148 81 b 200 186 148 151 164 172 b 261 198 220 194 240 198 b 420 45 341 198 411 137 b 421 22 421 37 421 29 b 257 -198 421 -86 347 -188 b 242 -198 251 -198 247 -198 b 20 -105 181 -198 95 -163 l 19 -104 l 19 -183 b 19 -216 19 -195 19 -206 b 12 -273 19 -272 17 -267 b -2 -278 8 -277 2 -278 b -21 -266 -10 -278 -19 -274 b -23 -165 -23 -263 -23 -262 l -23 -69 l -44 -47 b -250 86 -117 23 -183 66 b -295 94 -270 93 -284 94 b -315 91 -302 94 -308 94 b -381 5 -356 81 -381 43 b -355 -56 -381 -16 -372 -40 b -299 -81 -338 -73 -319 -81 b -246 -68 -283 -81 -265 -77 b -212 -58 -234 -61 -223 -58 b -168 -77 -196 -58 -179 -65 b -151 -122 -156 -90 -151 -105 b -179 -174 -151 -141 -160 -162 b -239 -195 -194 -184 -217 -192 b -257 -197 -245 -195 -250 -197 b -423 -5 -349 -197 -423 -113 b -423 0 -423 -4 -423 -1 b -277 194 -420 97 -362 173 b -247 197 -268 197 -258 197 b -24 104 -185 197 -100 162 l -23 102 l -23 181 b -21 265 -23 260 -23 260 b -10 276 -20 269 -14 274 ',\n },\n ornamentMordent: {\n x_min: -402.890625,\n x_max: 401.53125,\n ha: 410,\n o: 'm -10 273 b -4 274 -9 273 -6 274 b 16 262 4 274 12 269 b 17 158 17 259 17 259 l 17 56 l 62 112 b 117 174 110 172 110 172 b 122 174 118 174 119 174 b 132 173 125 174 129 173 b 295 11 134 172 171 134 l 307 -1 l 336 34 b 374 76 366 72 368 74 b 381 77 375 77 378 77 b 401 56 392 77 401 68 b 400 48 401 54 401 51 b 223 -172 397 41 230 -166 b 210 -176 220 -174 215 -176 b 201 -174 206 -176 204 -176 b 112 -87 198 -173 178 -152 b 27 0 65 -38 27 0 b 21 -6 27 0 24 -2 l 17 -12 l 17 -147 b 17 -210 17 -173 17 -194 b 10 -292 17 -297 16 -287 b -2 -299 6 -297 2 -299 b -21 -287 -10 -299 -19 -295 b -24 -174 -23 -284 -23 -284 l -24 -63 l -66 -117 b -121 -176 -110 -170 -114 -176 b -125 -176 -122 -176 -123 -176 b -296 -12 -134 -174 -125 -184 l -308 0 l -337 -34 b -375 -77 -367 -73 -370 -76 b -382 -79 -377 -79 -379 -79 b -402 -58 -393 -79 -402 -69 b -401 -49 -402 -55 -402 -52 b -224 170 -398 -43 -231 165 b -212 174 -221 173 -216 174 b -202 173 -208 174 -205 174 b -39 11 -200 172 -151 122 l -28 -1 l -25 1 l -24 4 l -24 130 b -23 260 -24 256 -24 258 b -10 273 -20 266 -16 270 ',\n },\n ornamentShortTrill: {\n x_min: -402.890625,\n x_max: 401.53125,\n ha: 410,\n o: 'm -219 173 b -213 174 -217 174 -215 174 b -202 173 -209 174 -205 173 b -114 86 -200 172 -179 151 b -28 0 -66 37 -28 0 b 40 84 -28 0 2 37 b 117 174 111 173 110 172 b 122 174 118 174 119 174 b 132 173 125 174 129 173 b 295 11 134 172 171 134 l 307 -1 l 336 34 b 374 76 366 72 368 74 b 381 77 375 77 378 77 b 401 56 392 77 401 68 b 400 48 401 54 401 51 b 223 -172 397 41 230 -166 b 210 -176 220 -174 215 -176 b 201 -174 206 -176 204 -176 b 112 -87 198 -173 178 -152 b 27 0 65 -38 27 0 b -42 -86 27 0 -4 -38 b -118 -174 -112 -174 -111 -173 b -123 -176 -119 -176 -121 -176 b -133 -174 -126 -176 -130 -174 b -296 -12 -136 -173 -172 -137 l -308 0 l -337 -34 b -375 -77 -367 -73 -370 -76 b -382 -79 -377 -79 -379 -79 b -402 -58 -393 -79 -402 -69 b -401 -49 -402 -55 -402 -52 b -224 172 -398 -43 -228 167 b -219 173 -223 172 -220 173 ',\n },\n ornamentTremblement: {\n x_min: -571.671875,\n x_max: 570.3125,\n ha: 582,\n o: 'm -386 173 b -381 174 -385 174 -383 174 b -370 173 -377 174 -372 173 b -281 86 -367 172 -347 151 b -196 0 -235 37 -196 0 b -126 84 -196 0 -164 37 b -50 174 -55 173 -57 172 b -44 174 -49 174 -47 174 b -35 173 -42 174 -38 173 b 53 86 -32 172 -12 151 b 138 0 100 37 138 0 b 208 84 140 0 170 37 b 284 174 279 173 277 172 b 289 174 285 174 288 174 b 299 173 294 174 298 173 b 462 11 303 172 338 134 l 475 -1 l 503 34 b 541 76 534 72 536 74 b 548 77 544 77 545 77 b 570 56 560 77 570 68 b 567 48 570 54 568 51 b 392 -172 564 41 397 -166 b 378 -176 387 -174 382 -176 b 368 -174 374 -176 371 -176 b 280 -87 367 -173 345 -152 b 194 0 234 -38 194 0 b 125 -86 194 0 163 -38 b 49 -174 54 -174 55 -173 b 43 -176 47 -176 46 -176 b 34 -174 40 -176 36 -174 b -54 -87 31 -173 10 -152 b -140 0 -102 -38 -140 0 b -209 -86 -141 0 -171 -38 b -285 -174 -280 -174 -279 -173 b -291 -176 -287 -176 -289 -176 b -300 -174 -295 -176 -299 -174 b -464 -12 -304 -173 -340 -137 l -476 0 l -504 -34 b -543 -77 -534 -73 -537 -76 b -549 -79 -545 -79 -547 -79 b -571 -58 -562 -79 -571 -69 b -568 -49 -571 -55 -570 -52 b -392 172 -566 -43 -396 167 b -386 173 -390 172 -387 173 ',\n },\n ornamentPrecompAppoggTrill: {\n x_min: -571.671875,\n x_max: 570.3125,\n ha: 582,\n o: 'm -559 351 b -551 352 -556 352 -553 352 b -530 338 -543 352 -533 348 b -529 169 -530 337 -529 291 l -529 1 l -507 27 l -441 112 b -382 174 -394 169 -390 174 b -378 174 -381 174 -379 174 b -281 86 -370 174 -375 179 b -196 0 -234 37 -196 0 b -126 84 -196 0 -164 37 b -50 174 -55 173 -57 172 b -44 174 -49 174 -47 174 b -35 173 -42 174 -38 173 b 53 86 -32 172 -12 151 b 138 0 100 37 138 0 b 208 84 140 0 170 37 b 284 174 279 173 279 172 b 289 174 285 174 288 174 b 300 173 294 174 298 173 b 462 11 303 172 340 134 l 475 -1 l 503 34 b 541 76 534 72 536 74 b 548 77 544 77 545 77 b 570 56 560 77 570 68 b 567 48 570 54 568 51 b 392 -172 564 41 397 -166 b 378 -176 387 -174 382 -176 b 368 -174 375 -176 371 -176 b 280 -87 367 -173 347 -152 b 194 0 234 -38 194 0 b 126 -86 194 0 163 -38 b 49 -174 54 -174 55 -173 b 44 -176 47 -176 46 -176 b 34 -174 40 -176 36 -174 b -54 -87 31 -173 10 -152 b -140 0 -102 -38 -140 0 b -209 -86 -140 0 -171 -38 b -285 -174 -280 -174 -279 -173 b -291 -176 -287 -176 -288 -176 b -300 -174 -294 -176 -298 -174 b -464 -11 -303 -173 -374 -102 l -476 0 l -506 -37 b -539 -76 -528 -65 -537 -74 b -551 -80 -543 -79 -547 -80 b -570 -68 -558 -80 -566 -76 l -571 -65 l -571 136 b -570 340 -571 331 -571 337 b -559 351 -568 344 -564 348 ',\n },\n ornamentPrecompSlideTrillDAnglebert: {\n x_min: -590.71875,\n x_max: 589.359375,\n ha: 601,\n o: 'm -367 173 b -362 174 -366 174 -364 174 b -351 173 -357 174 -353 173 b -262 86 -348 172 -328 151 b -176 0 -216 37 -176 0 b -107 84 -176 0 -145 37 b -31 174 -36 173 -38 172 b -25 174 -29 174 -28 174 b -16 173 -23 174 -19 173 b 72 86 -13 172 6 151 b 157 0 119 37 157 0 b 227 84 159 0 189 37 b 303 174 298 173 296 172 b 308 174 304 174 307 174 b 318 173 313 174 317 173 b 481 11 322 172 357 134 l 494 -1 l 522 34 b 560 76 553 72 555 74 b 567 77 563 77 564 77 b 589 56 579 77 589 68 b 586 48 589 54 588 51 b 411 -172 583 41 416 -166 b 397 -176 406 -174 401 -176 b 387 -174 393 -176 390 -176 b 299 -87 386 -173 366 -152 b 213 0 253 -38 213 0 b 144 -86 213 0 182 -38 b 68 -174 73 -174 74 -173 b 62 -176 66 -176 65 -176 b 53 -174 59 -176 55 -174 b -35 -87 50 -173 29 -152 b -121 0 -83 -38 -121 0 b -190 -86 -122 0 -152 -38 b -266 -174 -261 -174 -259 -173 b -272 -176 -268 -176 -270 -176 b -281 -174 -276 -176 -280 -174 b -371 -86 -284 -173 -304 -152 b -457 0 -417 -38 -457 0 l -457 0 b -477 -26 -457 0 -470 -16 b -548 -227 -524 -88 -548 -161 b -536 -303 -548 -254 -544 -280 b -533 -317 -534 -309 -533 -313 b -553 -338 -533 -330 -541 -338 b -577 -315 -566 -338 -571 -333 b -590 -227 -586 -287 -590 -258 b -518 -9 -590 -154 -564 -77 b -465 56 -509 2 -504 8 l -402 134 b -367 173 -375 169 -372 172 ',\n },\n ornamentPrecompSlideTrillBach: {\n x_min: -590.71875,\n x_max: 589.359375,\n ha: 601,\n o: 'm 175 273 b 182 274 178 273 181 274 b 202 262 190 274 198 269 b 204 158 204 259 204 259 l 204 56 l 250 112 b 303 174 296 172 298 172 b 308 174 304 174 307 174 b 318 173 313 174 317 173 b 481 11 322 172 357 134 l 494 -1 l 522 34 b 560 76 553 72 555 74 b 567 77 563 77 564 77 b 589 56 579 77 589 68 b 586 48 589 54 588 51 b 411 -172 583 41 416 -166 b 397 -176 406 -174 401 -176 b 387 -174 393 -176 390 -176 b 299 -87 386 -173 366 -152 b 213 0 253 -38 213 0 b 208 -6 213 0 210 -2 l 204 -12 l 204 -147 b 204 -210 204 -173 204 -194 b 198 -292 204 -297 204 -287 b 183 -299 194 -297 189 -299 b 164 -287 175 -299 167 -295 b 163 -174 163 -284 163 -284 l 161 -63 l 119 -117 b 65 -176 76 -170 73 -176 b 61 -176 63 -176 62 -176 b -35 -87 51 -174 57 -180 b -121 0 -83 -38 -121 0 b -190 -86 -122 0 -152 -38 b -266 -174 -261 -174 -259 -173 b -272 -176 -268 -176 -270 -176 b -281 -174 -276 -176 -280 -174 b -371 -86 -284 -173 -304 -152 b -457 0 -417 -38 -457 0 l -457 0 b -477 -26 -457 0 -470 -16 b -548 -227 -524 -88 -548 -161 b -536 -303 -548 -254 -544 -280 b -533 -317 -534 -309 -533 -313 b -553 -338 -533 -330 -541 -338 b -577 -315 -566 -338 -571 -333 b -590 -227 -586 -287 -590 -258 b -518 -9 -590 -154 -564 -77 b -465 56 -509 2 -504 8 l -402 134 b -363 174 -374 170 -371 174 b -359 174 -362 174 -360 174 b -262 86 -351 174 -356 179 b -176 0 -216 37 -176 0 b -107 84 -176 0 -145 37 b -31 174 -36 173 -38 172 b -25 174 -29 174 -28 174 b -16 173 -23 174 -19 173 b 147 11 -13 172 35 123 l 157 -1 l 160 1 l 163 4 l 163 130 b 164 260 163 256 163 258 b 175 273 166 266 170 270 ',\n },\n ornamentPrecompTrillSuffixDandrieu: {\n x_min: -590.71875,\n x_max: 589.359375,\n ha: 601,\n o: 'm 544 335 b 553 337 548 337 551 337 b 575 313 563 337 570 330 b 589 226 583 285 589 256 b 517 8 589 152 563 76 b 464 -58 507 -4 503 -9 l 401 -136 b 362 -176 372 -172 370 -176 b 357 -176 360 -176 359 -176 b 261 -87 349 -174 355 -180 b 175 0 215 -38 175 0 b 106 -86 175 0 144 -38 b 29 -174 35 -174 36 -173 b 24 -176 28 -176 27 -176 b 14 -174 21 -176 17 -174 b -73 -87 12 -173 -8 -152 b -159 0 -121 -38 -159 0 b -228 -86 -160 0 -190 -38 b -304 -174 -299 -174 -298 -173 b -310 -176 -306 -176 -308 -176 b -319 -174 -314 -176 -318 -174 b -483 -12 -323 -173 -359 -137 l -495 0 l -524 -34 b -562 -77 -553 -73 -556 -76 b -568 -79 -564 -79 -566 -79 b -590 -58 -581 -79 -590 -69 b -588 -49 -590 -55 -589 -52 b -412 170 -585 -43 -417 165 b -398 174 -408 173 -402 174 b -389 173 -394 174 -392 174 b -300 86 -387 172 -366 151 b -215 -1 -254 37 -215 -1 b -145 84 -215 -1 -183 37 b -69 173 -74 173 -76 172 b -63 174 -68 174 -66 174 b -54 173 -61 174 -57 173 b 34 86 -51 172 -31 151 b 119 -1 81 37 119 -1 b 189 84 121 -1 151 37 b 265 173 259 173 258 172 b 270 174 266 174 269 174 b 280 173 274 174 279 173 b 370 84 283 172 303 151 b 455 -1 416 37 455 -1 l 455 -1 b 476 24 455 -1 469 15 b 547 226 522 87 547 159 b 534 302 547 252 543 278 b 532 317 533 308 532 313 b 544 335 532 326 536 333 ',\n },\n ornamentPrecompDoubleCadenceUpperPrefix: {\n x_min: -597.53125,\n x_max: 596.171875,\n ha: 608,\n o: 'm -533 324 b -525 327 -530 326 -528 327 b -504 305 -514 327 -504 317 b -504 305 -504 305 -504 305 b -513 284 -504 299 -504 299 b -556 112 -541 226 -556 167 b -545 33 -556 84 -552 58 b -524 -20 -541 15 -532 -9 l -522 -23 l -491 15 l -413 111 b -355 174 -367 169 -363 174 b -351 174 -353 174 -352 174 b -254 86 -343 174 -348 179 b -168 -1 -208 37 -168 -1 b -100 84 -168 -1 -137 37 b -23 173 -28 173 -29 172 b -19 174 -21 174 -20 174 b -8 173 -14 174 -10 173 b 80 86 -5 172 13 151 b 166 -1 127 37 166 -1 b 235 84 166 -1 197 37 b 311 173 306 173 304 172 b 317 174 313 174 314 174 b 326 173 319 174 323 173 b 490 11 329 172 366 134 l 502 -1 l 530 34 b 568 76 560 72 563 74 b 575 77 570 77 573 77 b 596 56 586 77 596 68 b 594 48 596 54 596 51 b 417 -172 592 41 424 -166 b 405 -176 415 -174 409 -176 b 396 -174 401 -176 398 -176 b 307 -87 393 -173 372 -152 b 221 -1 259 -38 221 -1 b 152 -86 221 -1 190 -38 b 76 -176 81 -174 83 -173 b 70 -176 74 -176 73 -176 b 61 -174 66 -176 62 -174 b -27 -87 58 -173 38 -152 b -114 -1 -74 -38 -112 -1 b -182 -86 -114 -1 -145 -38 b -258 -176 -253 -174 -253 -173 b -264 -176 -259 -176 -262 -176 b -274 -174 -268 -176 -272 -174 b -438 -11 -277 -173 -348 -102 l -449 0 l -479 -37 b -524 -80 -513 -80 -514 -80 l -524 -80 b -553 -52 -534 -80 -540 -74 b -597 109 -583 -8 -597 48 b -560 280 -597 165 -585 224 b -533 324 -548 310 -540 322 ',\n },\n ornamentPrecompDoubleCadenceUpperPrefixTurn: {\n x_min: -597.53125,\n x_max: 596.171875,\n ha: 608,\n o: 'm -533 324 b -525 327 -530 326 -528 327 b -504 305 -514 327 -504 317 b -504 305 -504 305 -504 305 b -513 284 -504 299 -504 299 b -556 112 -541 226 -556 167 b -545 33 -556 84 -552 58 b -524 -20 -541 15 -532 -9 l -522 -23 l -491 15 l -413 111 b -355 174 -367 169 -363 174 b -351 174 -353 174 -352 174 b -254 86 -343 174 -348 179 b -168 -1 -208 37 -168 -1 b -100 84 -168 -1 -137 37 b -23 173 -28 173 -29 172 b -19 174 -21 174 -20 174 b -8 173 -14 174 -10 173 b 155 11 -5 172 43 123 l 166 -1 l 168 1 l 170 4 l 170 130 b 171 260 170 256 170 258 b 191 274 175 269 183 274 b 205 267 196 274 201 272 b 212 158 212 262 210 273 l 212 56 l 257 112 b 311 173 304 172 304 172 b 317 174 313 174 314 174 b 326 173 319 174 323 173 b 490 11 329 172 366 134 l 502 -1 l 530 34 b 568 76 560 72 563 74 b 575 77 570 77 573 77 b 596 56 586 77 596 68 b 594 48 596 54 596 51 b 417 -172 592 41 424 -166 b 405 -176 415 -174 409 -176 b 396 -174 401 -176 398 -176 b 307 -87 393 -173 372 -152 b 221 -1 259 -38 221 -1 b 216 -6 221 -1 219 -2 l 212 -12 l 212 -147 b 212 -210 212 -173 212 -194 b 205 -292 212 -297 210 -287 b 191 -299 201 -297 196 -299 b 172 -287 183 -299 175 -295 b 170 -174 171 -284 171 -284 l 170 -63 l 127 -117 b 73 -176 84 -170 80 -176 b 68 -176 72 -176 70 -176 b -27 -87 59 -174 65 -180 b -114 0 -74 -38 -112 0 b -182 -86 -114 0 -145 -38 b -258 -174 -253 -174 -253 -173 b -264 -176 -259 -176 -262 -176 b -274 -174 -268 -176 -272 -174 b -438 -11 -277 -173 -348 -102 l -449 0 l -479 -37 b -524 -80 -513 -80 -514 -80 l -524 -80 b -553 -52 -534 -80 -540 -74 b -597 109 -583 -8 -597 48 b -560 280 -597 165 -585 224 b -533 324 -548 310 -540 322 ',\n },\n ornamentPrecompTrillLowerSuffix: {\n x_min: -597.53125,\n x_max: 596.171875,\n ha: 608,\n o: 'm -413 173 b -408 174 -412 174 -409 174 b -397 173 -404 174 -400 173 b -308 86 -394 172 -374 151 b -223 0 -261 37 -223 0 b -153 84 -223 0 -191 37 b -77 174 -83 173 -84 172 b -72 174 -76 174 -74 174 b -62 173 -68 174 -63 173 b 25 86 -59 172 -39 151 b 112 0 73 37 111 0 b 181 84 112 0 144 37 b 257 174 251 173 251 172 b 262 174 258 174 261 174 b 273 173 266 174 270 173 b 436 9 276 172 347 101 l 447 -1 l 477 36 b 522 79 511 79 513 79 l 522 79 b 552 51 533 79 539 73 b 596 -112 582 6 596 -51 b 567 -262 596 -161 586 -213 b 539 -322 558 -287 544 -316 b 524 -327 534 -326 529 -327 b 504 -315 515 -327 507 -323 b 503 -308 503 -312 503 -309 b 511 -285 503 -302 504 -297 b 555 -113 540 -227 555 -169 b 544 -34 555 -86 551 -59 b 522 19 540 -16 530 8 l 521 22 l 481 -26 l 405 -122 b 353 -176 366 -172 362 -176 b 349 -176 352 -176 351 -176 b 253 -87 341 -176 347 -180 b 167 0 206 -38 167 0 b 99 -86 167 0 136 -38 b 21 -174 27 -174 28 -173 b 17 -176 20 -176 19 -176 b 6 -174 13 -176 9 -174 b -81 -87 4 -173 -14 -152 b -167 0 -129 -38 -167 0 b -236 -86 -167 0 -198 -38 b -313 -174 -307 -174 -306 -173 b -318 -176 -314 -176 -315 -176 b -328 -174 -321 -176 -325 -174 b -491 -12 -330 -173 -367 -137 l -503 0 l -530 -34 b -570 -77 -562 -73 -564 -76 b -577 -79 -571 -79 -574 -79 b -597 -58 -588 -79 -597 -69 b -596 -49 -597 -55 -597 -52 b -417 172 -593 -43 -423 167 b -413 173 -417 172 -415 173 ',\n },\n stringsDownBow: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -9 215 b 0 217 -6 217 -4 217 b 19 205 8 217 14 213 b 20 142 20 202 20 201 l 20 84 l 23 84 b 144 -27 81 74 129 30 b 148 -66 147 -40 148 -54 b 36 -213 148 -134 103 -197 b 0 -219 24 -217 12 -219 b -145 -104 -68 -219 -129 -173 b -149 -68 -148 -91 -149 -79 b -24 84 -149 6 -98 74 l -21 84 l -21 142 b -19 205 -20 201 -20 202 b -9 215 -17 209 -13 213 m -21 -15 b -23 41 -21 37 -21 41 b -23 41 -23 41 -23 41 b -76 11 -35 40 -62 26 b -108 -65 -98 -11 -108 -38 b -1 -176 -108 -122 -65 -176 b 107 -65 63 -176 107 -122 b 74 11 107 -38 96 -11 b 20 41 61 26 32 41 b 20 -15 20 41 20 15 b 19 -74 20 -72 20 -72 b 0 -87 14 -83 6 -87 b -19 -74 -8 -87 -16 -83 b -21 -15 -20 -72 -20 -72 ',\n },\n stringsUpBow: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -137 381 b -130 383 -134 383 -133 383 b -111 371 -122 383 -114 378 b -55 224 -110 370 -85 305 b 0 80 -25 145 -1 80 b 54 224 0 80 24 145 b 112 377 114 384 110 373 b 127 384 118 381 122 384 b 148 362 138 384 148 374 l 148 356 l 83 183 b 16 9 47 88 17 11 b -1 0 12 2 5 0 b -14 5 -5 0 -10 1 b -84 183 -19 9 -13 -6 l -149 356 l -149 362 b -137 381 -149 371 -145 378 ',\n },\n stringsHarmonic: {\n x_min: -122.5,\n x_max: 121.140625,\n ha: 124,\n o: 'm -16 145 b 0 147 -10 147 -5 147 b 121 -1 66 147 121 77 b 114 -49 121 -16 118 -33 b -1 -148 95 -112 47 -148 b -85 -106 -31 -148 -61 -134 b -122 -1 -110 -76 -122 -38 b -16 145 -122 68 -81 134 m 12 111 b 0 113 8 113 4 113 b -68 22 -29 113 -61 73 b -70 0 -69 15 -70 6 b -13 -113 -70 -49 -47 -98 b -1 -115 -9 -115 -5 -115 b 63 -40 24 -115 53 -83 b 68 -1 66 -27 68 -15 b 12 111 68 48 46 97 ',\n },\n pluckedSnapPizzicatoAbove: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -9 215 b 0 217 -6 217 -4 217 b 19 205 8 217 14 213 b 20 142 20 202 20 201 l 20 84 l 23 84 b 144 -27 81 74 129 30 b 148 -66 147 -40 148 -54 b 36 -213 148 -134 103 -197 b 0 -219 24 -217 12 -219 b -145 -104 -68 -219 -129 -173 b -149 -68 -148 -91 -149 -79 b -24 84 -149 6 -98 74 l -21 84 l -21 142 b -19 205 -20 201 -20 202 b -9 215 -17 209 -13 213 m -21 -15 b -23 41 -21 37 -21 41 b -23 41 -23 41 -23 41 b -76 11 -35 40 -62 26 b -108 -65 -98 -11 -108 -38 b -1 -176 -108 -122 -65 -176 b 107 -65 63 -176 107 -122 b 74 11 107 -38 96 -11 b 20 41 61 26 32 41 b 20 -15 20 41 20 15 b 19 -74 20 -72 20 -72 b 0 -87 14 -83 6 -87 b -19 -74 -8 -87 -16 -83 b -21 -15 -20 -72 -20 -72 ',\n },\n pluckedSnapPizzicatoBelow: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -9 215 b 0 217 -6 217 -4 217 b 19 205 8 217 14 213 b 20 142 20 202 20 201 l 20 84 l 23 84 b 144 -27 81 74 129 30 b 148 -66 147 -40 148 -54 b 36 -213 148 -134 103 -197 b 0 -219 24 -217 12 -219 b -145 -104 -68 -219 -129 -173 b -149 -68 -148 -91 -149 -79 b -24 84 -149 6 -98 74 l -21 84 l -21 142 b -19 205 -20 201 -20 202 b -9 215 -17 209 -13 213 m -21 -15 b -23 41 -21 37 -21 41 b -23 41 -23 41 -23 41 b -76 11 -35 40 -62 26 b -108 -65 -98 -11 -108 -38 b -1 -176 -108 -122 -65 -176 b 107 -65 63 -176 107 -122 b 74 11 107 -38 96 -11 b 20 41 61 26 32 41 b 20 -15 20 41 20 15 b 19 -74 20 -72 20 -72 b 0 -87 14 -83 6 -87 b -19 -74 -8 -87 -16 -83 b -21 -15 -20 -72 -20 -72 ',\n },\n pluckedLeftHandPizzicato: {\n x_min: 0,\n x_max: 319.859375,\n ha: 326,\n o: 'm 149 508 b 159 509 152 509 155 509 b 186 494 170 509 181 503 b 190 440 190 487 190 488 l 190 430 l 190 377 l 242 377 l 251 377 b 303 373 298 377 296 377 b 319 345 314 367 319 356 b 304 319 319 335 314 324 b 250 315 296 315 299 315 l 242 315 l 190 315 l 190 262 l 190 252 b 186 198 190 204 190 205 b 159 183 179 188 170 183 b 132 198 148 183 138 188 b 127 252 127 205 127 204 l 127 262 l 127 315 l 76 315 l 68 315 b 14 319 20 315 21 315 b 0 347 4 324 0 335 b 14 373 0 356 4 367 b 68 377 21 377 20 377 l 76 377 l 127 377 l 127 430 l 127 440 b 132 494 127 488 127 487 b 149 508 136 501 142 505 ',\n },\n keyboardPedalPed: {\n x_min: -1.359375,\n x_max: 1064.390625,\n ha: 1086,\n o: 'm 296 692 b 314 694 302 694 307 694 b 386 685 337 694 366 689 b 548 498 480 660 548 580 b 548 481 548 492 548 487 b 455 395 541 426 499 395 b 370 462 420 395 383 417 b 362 496 364 477 362 488 b 377 514 362 509 367 514 b 393 501 386 514 390 510 b 432 474 397 484 413 474 b 470 487 445 474 458 478 b 491 530 484 496 491 510 b 490 544 491 534 491 539 b 333 660 479 606 411 657 l 323 662 l 315 646 b 269 524 285 591 269 556 b 321 431 269 492 287 466 b 349 395 338 413 343 408 b 363 342 359 378 363 362 b 359 312 363 333 362 322 b 285 158 348 266 318 206 b 281 152 283 155 281 152 b 281 152 281 152 281 152 b 287 154 283 152 284 152 b 318 155 298 154 308 155 b 461 98 371 155 419 136 l 464 97 l 483 112 b 503 129 494 120 503 127 b 504 130 503 129 504 129 b 503 138 504 131 503 134 b 500 180 500 152 500 166 b 553 326 500 238 518 288 b 604 366 560 331 592 358 b 649 381 617 376 632 381 b 696 362 665 381 681 374 b 724 302 714 347 724 324 b 695 238 724 278 714 255 b 660 210 691 234 662 212 b 579 148 658 209 582 151 b 579 148 579 148 579 148 b 596 106 579 144 589 119 b 622 77 604 88 609 83 b 657 69 632 72 645 69 b 748 112 688 69 721 84 b 755 123 754 117 755 120 b 755 127 755 124 755 126 b 751 165 752 137 751 151 b 758 219 751 183 754 202 b 894 387 774 290 820 347 b 896 390 896 388 896 388 b 891 398 896 391 895 392 b 622 560 827 477 730 535 b 600 580 605 564 600 569 b 617 596 600 591 607 596 b 628 595 622 596 624 596 b 1057 248 846 552 1020 412 b 1064 191 1061 229 1064 209 b 922 0 1064 94 1005 9 b 902 -1 916 -1 909 -1 b 774 76 847 -1 800 26 b 769 83 770 81 770 83 b 769 81 769 83 769 83 b 627 -1 733 29 677 -1 b 548 27 597 -1 570 8 b 515 88 537 37 525 61 l 513 95 l 510 93 l 453 45 b 390 0 396 0 396 0 b 390 0 390 0 390 0 b 374 15 381 0 377 4 b 268 105 359 69 314 105 b 250 104 262 105 257 105 l 243 102 l 234 90 b 155 1 201 49 159 2 b 147 -1 152 0 149 -1 b 130 15 138 -1 130 6 b 132 20 130 18 132 19 b 136 31 133 22 134 27 b 220 131 149 74 178 109 b 231 137 225 134 230 136 b 302 278 280 202 302 244 b 265 335 302 299 295 309 b 209 442 234 363 213 402 b 209 455 209 446 209 451 b 279 648 209 502 232 564 l 285 659 l 283 659 b 176 627 238 653 210 645 b 57 477 111 594 66 538 b 55 459 55 471 55 464 b 72 409 55 437 61 415 b 93 403 78 405 87 403 b 152 467 123 403 151 431 b 168 488 153 483 157 488 b 185 462 181 488 185 483 l 185 460 b 137 344 183 409 168 369 b 78 322 119 328 98 322 b 13 360 50 322 25 335 b -1 426 4 380 -1 402 b 89 610 -1 488 32 559 b 296 692 147 659 210 685 m 926 348 b 921 353 924 351 922 353 b 914 348 920 353 918 351 b 823 167 857 306 823 237 b 828 124 823 154 826 138 b 890 31 837 79 862 40 b 896 31 892 31 894 31 b 956 104 916 31 940 59 b 970 191 965 129 970 159 b 966 241 970 208 969 224 b 926 348 959 277 945 313 m 627 326 b 619 326 624 326 622 326 b 598 316 611 326 604 323 b 568 215 579 288 568 255 b 568 208 568 213 568 210 b 571 183 570 195 570 184 l 571 183 b 594 201 571 183 582 191 l 634 231 b 660 259 653 247 656 248 b 664 278 662 266 664 272 b 627 326 664 299 649 320 ',\n },\n keyboardPedalUp: {\n x_min: -1.359375,\n x_max: 592.078125,\n ha: 604,\n o: 'm 280 692 b 295 694 283 692 289 694 b 310 692 300 694 307 692 b 357 630 340 684 357 657 b 336 580 357 612 351 594 b 311 538 321 566 311 549 b 352 492 311 512 330 492 b 366 495 357 492 362 492 b 397 553 390 503 397 517 b 415 603 397 576 402 591 b 460 623 427 617 443 623 b 509 599 479 623 498 614 b 522 559 518 587 522 573 b 494 506 522 538 513 519 b 451 495 481 498 473 496 b 415 488 432 495 426 494 b 394 449 404 483 394 464 b 394 448 394 448 394 448 l 394 440 l 397 433 b 428 409 404 420 413 413 b 438 408 431 408 435 408 b 479 431 450 408 462 415 b 528 455 495 448 510 455 b 548 452 534 455 541 453 b 592 391 577 442 592 416 b 549 331 592 365 577 340 b 528 327 541 328 534 327 b 479 351 510 327 495 335 b 438 374 464 367 450 374 b 417 369 431 374 424 373 b 394 333 402 360 394 348 b 400 312 394 326 396 319 b 451 287 408 294 420 288 b 513 258 484 285 499 278 b 522 223 519 247 522 234 b 461 159 522 190 496 159 b 449 161 457 159 453 159 b 397 229 416 167 397 191 b 366 288 397 265 390 278 b 352 290 362 290 357 290 b 315 262 336 290 321 280 b 311 245 313 256 311 251 b 334 204 311 233 318 220 b 355 170 348 190 351 184 b 357 152 356 166 357 159 b 355 136 357 147 356 140 b 295 88 345 104 321 88 b 232 152 264 88 232 112 b 255 204 232 174 238 186 b 279 244 273 222 279 231 l 279 245 b 238 290 279 270 259 290 b 224 288 234 290 228 290 b 193 229 200 278 193 265 b 141 161 193 191 174 167 b 129 159 137 159 133 159 b 68 223 93 159 68 190 b 77 258 68 234 70 247 b 138 287 91 278 106 285 b 185 302 166 287 175 291 b 196 333 193 312 196 323 b 174 369 196 347 187 360 b 152 374 166 373 159 374 b 111 351 140 374 126 367 b 62 327 95 335 80 327 b 51 328 58 327 54 327 b -1 391 16 334 -1 363 b 53 455 -1 420 17 449 b 62 455 57 455 59 455 b 111 431 80 455 95 448 b 152 408 127 415 140 408 b 161 409 155 408 159 408 b 193 433 176 413 186 420 l 196 440 l 196 448 b 196 451 196 449 196 449 b 190 471 196 459 194 463 b 137 495 182 489 167 495 l 134 495 l 134 495 b 68 560 95 495 68 521 b 129 623 68 596 95 623 b 144 621 134 623 138 623 b 193 553 175 614 193 589 b 224 495 193 517 200 503 b 238 492 228 492 234 492 b 279 538 259 492 279 512 b 254 580 279 549 269 566 b 232 630 239 594 232 612 b 280 692 232 657 250 684 m 307 456 b 295 458 303 458 299 458 b 230 391 258 458 230 426 b 236 360 230 381 231 371 b 295 324 249 337 272 324 b 353 360 318 324 341 337 b 360 391 357 370 360 381 b 307 456 360 421 340 451 ',\n },\n pictChokeCymbal: {\n x_min: 0,\n x_max: 227.3125,\n ha: 232,\n o: 'm 91 213 b 100 215 93 215 96 215 b 227 58 167 215 224 144 b 227 52 227 56 227 54 b 61 -201 227 -43 164 -138 b 29 -216 44 -212 36 -216 b 23 -210 27 -216 24 -213 b 21 -205 21 -208 21 -206 b 34 -192 21 -201 25 -197 b 122 -55 89 -161 122 -106 b 104 6 122 -33 117 -12 l 103 9 l 96 9 b 4 79 57 9 17 38 b 0 112 1 90 0 101 b 91 213 0 163 36 209 ',\n },\n wiggleArpeggiatoUp: {\n x_min: 58.53125,\n x_max: 228.671875,\n ha: 294,\n o: 'm 138 371 b 142 373 140 371 141 373 b 178 342 149 373 156 366 b 228 251 217 297 228 278 b 228 244 228 248 228 247 b 176 147 227 212 212 184 b 123 73 152 122 132 93 b 121 62 122 70 121 66 b 145 13 121 48 129 31 b 153 -2 151 6 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 145 -11 b 129 -1 140 -11 136 -8 b 61 87 89 37 68 68 b 58 113 59 95 58 105 b 110 215 58 144 74 177 b 163 287 134 240 155 269 b 166 299 166 291 166 295 b 141 348 166 313 157 330 b 133 360 134 356 133 358 b 133 363 133 362 133 362 b 138 371 133 367 136 370 ',\n },\n arrowheadBlackUp: {\n x_min: -10.890625,\n x_max: 299.4375,\n ha: 294,\n o: 'm 136 460 b 142 462 137 462 140 462 b 166 449 152 462 161 456 b 171 428 168 446 168 445 b 288 131 194 322 238 209 b 298 115 295 120 296 117 b 299 106 298 112 299 109 b 273 81 299 91 287 81 b 255 86 268 81 261 83 b 155 116 225 104 183 116 l 152 116 l 149 108 b 141 83 148 102 144 91 b 134 48 137 69 134 58 b 149 9 134 34 140 24 b 153 -1 152 5 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 147 -11 b 122 2 138 -11 133 -6 b 95 61 104 20 95 38 b 107 108 95 74 99 90 b 108 113 107 111 108 112 b 107 113 108 113 108 113 b 102 113 106 113 104 113 b 31 86 76 108 53 98 b 14 80 24 81 20 80 b -10 106 0 80 -10 91 b 0 131 -10 115 -9 116 b 115 430 49 209 91 317 b 136 460 119 451 123 456 ',\n },\n arrowheadBlackDown: {\n x_min: -10.890625,\n x_max: 298.078125,\n ha: 294,\n o: 'm 138 473 b 142 474 140 473 141 474 b 164 459 148 474 153 470 b 191 402 183 442 191 423 b 181 353 191 388 187 371 b 178 349 179 352 178 349 b 179 348 178 348 179 348 b 185 349 181 348 182 348 b 255 376 210 355 234 363 b 272 381 264 381 266 381 b 298 355 287 381 298 370 b 288 330 298 348 298 345 b 171 34 238 254 194 141 b 166 13 168 16 168 16 b 144 1 161 5 152 1 b 121 15 134 1 125 5 b 115 33 119 18 117 24 b 0 330 91 145 49 252 b -10 355 -9 345 -10 348 b 13 381 -10 371 0 381 b 31 376 19 381 25 380 b 132 345 61 358 103 345 l 136 345 l 137 355 b 145 378 138 359 142 370 b 152 415 149 394 152 405 b 137 452 152 427 148 438 b 133 464 134 458 133 460 b 138 473 133 467 134 470 ',\n },\n vexAccidentalMicrotonal1: {\n x_min: -171.5,\n x_max: 483.1875,\n ha: 493,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 495 20 616 20 616 b 20 373 20 427 20 373 b 115 410 20 373 63 390 l 210 448 l 210 531 b 212 620 210 614 210 616 b 231 632 215 628 223 632 b 246 627 236 632 242 631 b 251 541 251 620 251 628 l 251 463 l 315 489 b 387 514 368 509 381 514 b 393 513 390 514 392 514 b 406 494 402 510 406 502 b 397 476 406 487 404 480 b 323 446 396 474 363 462 l 251 417 l 251 283 l 251 148 l 254 151 b 370 199 291 183 332 199 b 415 191 385 199 400 197 b 483 84 458 176 483 134 b 461 0 483 58 476 29 b 332 -142 439 -40 411 -72 l 255 -215 b 231 -229 240 -229 239 -229 b 216 -223 224 -229 220 -227 b 210 -158 210 -217 210 -223 b 210 -120 210 -148 210 -136 l 210 -29 l 205 -34 b 100 -142 182 -65 159 -88 l 23 -215 b -1 -229 9 -229 6 -229 b -19 -217 -9 -229 -16 -224 l -20 -215 l -21 48 l -21 310 l -83 287 b -152 262 -133 266 -145 262 b -157 263 -153 262 -155 262 b -171 283 -166 266 -171 274 b -161 301 -171 290 -167 297 b -91 328 -160 302 -129 315 l -21 356 l -21 487 l -20 617 l -19 621 b -8 631 -17 626 -12 630 m 210 288 b 210 401 210 351 210 401 b 114 365 209 401 167 384 l 20 327 l 20 238 l 20 148 l 21 151 b 140 199 59 183 102 199 b 206 180 164 199 187 192 l 209 177 b 209 177 209 177 209 177 b 210 288 210 177 210 199 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 m 341 131 b 328 133 337 133 332 133 b 322 133 326 133 323 133 b 257 87 296 129 273 113 l 251 80 l 251 -37 l 251 -156 l 255 -152 b 375 81 328 -72 375 20 l 375 83 b 341 131 375 113 367 126 ',\n },\n vexAccidentalMicrotonal2: {\n x_min: -1.359375,\n x_max: 386.5625,\n ha: 394,\n o: 'm 249 535 b 257 537 251 537 253 537 b 276 524 266 537 273 533 l 277 521 l 279 419 l 279 316 l 304 323 b 337 328 319 326 330 328 b 353 316 347 328 349 324 b 355 266 355 315 355 290 b 353 215 355 241 355 217 b 319 198 349 206 347 205 b 279 187 284 190 279 188 b 279 156 279 187 279 174 b 279 136 279 151 279 144 l 279 84 l 289 87 l 330 98 b 367 105 352 102 362 105 b 378 101 372 105 375 104 b 386 61 385 95 386 94 b 386 40 386 55 386 48 l 386 -5 l 385 -8 b 374 -19 383 -12 378 -18 b 291 -40 372 -19 347 -26 b 279 -43 284 -41 279 -43 b 279 -83 279 -43 279 -59 b 279 -95 279 -87 279 -91 l 279 -145 l 304 -140 b 337 -133 321 -136 330 -133 b 349 -140 343 -133 347 -136 b 355 -181 355 -145 355 -142 l 355 -197 l 355 -210 b 349 -252 355 -249 355 -247 b 300 -269 345 -258 347 -258 b 280 -274 291 -272 281 -273 l 279 -274 l 277 -378 l 277 -483 l 276 -487 b 257 -499 273 -495 265 -499 b 238 -487 249 -499 242 -495 l 236 -483 l 236 -384 l 236 -285 l 235 -285 l 212 -291 l 170 -301 b 148 -308 159 -305 148 -306 b 147 -415 147 -308 147 -313 l 147 -523 l 145 -526 b 126 -538 141 -534 133 -538 b 106 -526 118 -538 110 -534 l 104 -523 l 104 -420 b 103 -317 104 -326 104 -317 b 103 -317 103 -317 103 -317 b 50 -330 92 -322 54 -330 b 31 -317 42 -330 35 -326 b 29 -267 29 -315 29 -315 l 29 -219 l 32 -216 b 92 -192 36 -206 36 -206 l 104 -190 l 104 -138 b 103 -87 104 -91 104 -87 b 103 -87 103 -87 103 -87 b 88 -91 103 -87 96 -88 l 49 -101 b 17 -106 32 -105 23 -106 b 6 -102 13 -106 10 -105 b -1 -62 0 -97 -1 -95 b 0 -41 -1 -56 0 -49 l 0 4 l 1 6 b 10 16 2 11 6 15 b 91 37 12 18 38 24 l 104 41 l 104 93 b 103 144 104 140 104 144 b 103 144 103 144 103 144 b 50 131 92 141 54 131 b 31 144 42 131 35 137 b 29 195 29 147 29 148 l 29 242 l 32 245 b 92 269 36 255 36 255 l 104 273 l 104 377 l 104 481 l 106 485 b 126 498 110 492 118 498 b 134 495 129 498 132 496 b 145 485 138 494 142 489 l 147 481 l 147 383 l 147 283 l 152 284 b 190 294 155 285 171 290 l 230 303 l 236 305 l 236 413 l 236 521 l 238 524 b 249 535 240 528 243 533 m 236 126 b 235 177 236 154 236 177 l 235 177 b 213 172 235 177 225 174 l 170 161 b 147 155 157 158 147 155 b 147 124 147 155 147 142 b 147 102 147 117 147 111 l 147 52 l 153 54 l 228 72 l 236 74 l 236 126 m 236 -105 b 235 -54 236 -65 236 -54 l 235 -54 b 231 -55 235 -54 234 -54 b 172 -69 227 -55 204 -62 l 149 -76 l 147 -76 l 147 -127 l 147 -179 l 152 -177 b 190 -167 155 -177 171 -173 l 230 -158 l 236 -156 l 236 -105 ',\n },\n vexWiggleArpeggioUp: {\n x_min: 58.53125,\n x_max: 228.671875,\n ha: 294,\n o: 'm 138 371 b 142 373 140 371 141 373 b 178 342 149 373 156 366 b 228 251 217 297 228 278 b 228 244 228 248 228 247 b 176 147 227 212 212 184 b 123 73 152 122 132 93 b 121 62 122 70 121 66 b 145 13 121 48 129 31 b 153 -2 151 6 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 145 -11 b 129 -1 140 -11 136 -8 b 61 87 89 37 68 68 b 58 113 59 95 58 105 b 110 215 58 144 74 177 b 163 287 134 240 155 269 b 166 299 166 291 166 295 b 141 348 166 313 157 330 b 133 360 134 356 133 358 b 133 363 133 362 133 362 b 138 371 133 367 136 370 ',\n },\n vexNoteHeadMutedBreve: {\n x_min: 0,\n x_max: 370.21875,\n ha: 378,\n o: 'm 0 0 l 0 277 l 61 277 l 122 277 l 122 0 l 122 -278 l 61 -278 l 0 -278 l 0 0 m 246 -1 l 246 277 l 308 277 l 370 277 l 370 -1 l 370 -278 l 308 -278 l 246 -278 l 246 -1 ',\n },\n },\n cssFontWeight: 'normal',\n ascender: 1903,\n underlinePosition: -125,\n cssFontStyle: 'normal',\n boundingBox: {\n yMin: -2065.375,\n xMin: -695.53125,\n yMax: 1901.578125,\n xMax: 1159.671875,\n },\n resolution: 1000,\n original_font_information: {\n postscript_name: 'Gonville-18',\n version_string: 'Version 0.1.8904 ',\n vendor_url: '',\n full_font_name: 'Gonville-18',\n font_family_name: 'Gonville-18',\n copyright: 'No copyright is claimed on this font file.',\n description: '',\n trademark: '',\n designer: '',\n designer_url: '',\n unique_font_identifier: 'FontForge 2.0 : Gonville-18 : 17-3-2010',\n license_url: '',\n license_description: '',\n manufacturer_name: '',\n font_sub_family_name: '18',\n },\n descender: -2066,\n fontFamily: 'Gonville-18',\n lineHeight: 4093,\n underlineThickness: 50,\n};\n","/**\n * The Gonville font was created by Simon Tatham.\n * https://www.chiark.greenend.org.uk/~sgtatham/gonville/\n */\nexport const GonvilleMetrics = {\n name: 'Gonville',\n smufl: false,\n stave: {\n padding: 12,\n endPaddingMax: 10,\n endPaddingMin: 5,\n unalignedNotePadding: 10,\n },\n accidental: {\n noteheadAccidentalPadding: 1,\n leftPadding: 2,\n accidentalSpacing: 3,\n },\n clef: {\n default: {\n point: 40,\n width: 26,\n },\n small: {\n point: 32,\n width: 20,\n },\n annotations: {\n '8va': {\n smuflCode: 'timeSig8',\n default: {\n point: 20,\n treble: {\n line: -1.2,\n shiftX: 11,\n },\n },\n small: {\n point: 18,\n treble: {\n line: -0.4,\n shiftX: 8,\n },\n },\n },\n '8vb': {\n smuflCode: 'timeSig8',\n default: {\n point: 20,\n treble: {\n line: 6.3,\n shiftX: 10,\n },\n bass: {\n line: 4,\n shiftX: 1,\n },\n },\n small: {\n point: 18,\n treble: {\n line: 5.8,\n shiftX: 6,\n },\n bass: {\n line: 3.5,\n shiftX: 0.5,\n },\n },\n },\n },\n // May not need these anymore\n lineCount: {\n '8': { point: 55, shiftY: 14 },\n '7': { point: 47, shiftY: 8 },\n '6': { point: 40, shiftY: 1 },\n '5': { point: 30, shiftY: -6 },\n '4': { point: 23, shiftY: -12 },\n },\n },\n parenthesis: {\n default: {\n point: 39,\n width: 7,\n },\n gracenote: {\n point: (39 * 3) / 5,\n width: 3,\n },\n },\n pedalMarking: {\n up: {\n point: 40,\n },\n down: {\n point: 40,\n },\n },\n // These are for numeric digits, such as in time signatures\n digits: {\n point: 40,\n tupletPoint: 28,\n },\n // articulation: {\n // },\n tremolo: {\n default: {\n point: 25,\n spacing: 4,\n offsetYStemUp: -7,\n offsetYStemDown: 7,\n offsetXStemUp: 9,\n offsetXStemDown: -0.5,\n },\n grace: {\n point: 15,\n spacing: 4,\n offsetYStemUp: -7,\n offsetYStemDown: 7,\n offsetXStemUp: 6.5,\n offsetXStemDown: -0.5,\n },\n },\n staveRepetition: {\n default: {\n offsetY: 25,\n offsetSymbol: 12,\n spacing: 5,\n },\n },\n // noteHead: {\n // },\n stem: {\n heightAdjustmentForFlag: -3,\n // These are stem (Y) offsets to the note heads. To shift the\n // noteheads (x-position) themselves, see glyphs.notehead.custom.\n noteHead: {\n noteheadTriangleUpHalf: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpBlack: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpWhole: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadXHalf: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXBlack: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXWhole: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadHalf: {\n offsetYBaseStemUp: -1.5,\n offsetYBaseStemDown: 1.5,\n },\n noteheadBlack: {\n offsetYBaseStemUp: -1.5,\n offsetYBaseStemDown: 1.5,\n },\n noteheadSquareWhite: {\n offsetYBaseStemDown: -5,\n offsetYBaseStemUp: 5,\n },\n },\n },\n glyphs: {\n flag: {\n shiftX: -0.08,\n flag8thDown: {\n shiftX: -0.16,\n },\n flag16thDown: {\n shiftX: -0.16,\n },\n flag32ndDown: {\n shiftX: -0.16,\n shiftY: 9,\n },\n flag64thDown: {\n shiftX: -0.16,\n shiftY: 13,\n },\n flag128thDown: {\n shiftX: -0.16,\n shiftY: 22,\n },\n flag32ndUp: {\n shiftY: -9,\n },\n flag64thUp: {\n shiftY: -13,\n },\n flag128thUp: {\n shiftY: -22,\n },\n },\n stringNumber: {\n verticalPadding: 8,\n stemPadding: 2,\n leftPadding: 5,\n rightPadding: 6,\n },\n textNote: {\n point: 40,\n default: {},\n ornamentTrill: {\n shiftX: -5,\n shiftY: 4,\n },\n },\n noteHead: {\n minPadding: 2,\n custom: {\n noteheadDiamondWholeStemUp: {\n shiftX: -6,\n },\n noteheadCircleXStemUp: {\n shiftX: -1.5,\n },\n noteheadXWholeStemUp: {\n shiftX: -5,\n },\n noteheadTriangleUpWholeStemUp: {\n shiftX: -6,\n },\n },\n },\n chordSymbol: {\n global: {\n superscriptOffset: -400,\n subscriptOffset: 300,\n kerningOffset: -250,\n lowerKerningText: ['D', 'F', 'P', 'T', 'V', 'Y'],\n upperKerningText: ['A', 'L'],\n spacing: 100,\n superSubRatio: 0.66,\n },\n csymDiminished: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymHalfDiminished: {\n scale: 0.8,\n leftSideBearing: -32,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymAugmented: {\n scale: 1,\n leftSideBearing: 0,\n advanceWidth: 530,\n yOffset: 0,\n },\n csymParensLeftTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 155,\n yOffset: 250,\n },\n csymParensRightTall: {\n scale: 0.8,\n leftSideBearing: -40,\n advanceWidth: 189,\n yOffset: 250,\n },\n csymBracketLeftTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 328,\n yOffset: 0,\n },\n csymBracketRightTall: {\n scale: 0.8,\n leftSideBearing: 1,\n advanceWidth: 600,\n yOffset: 0,\n },\n csymParensLeftVeryTall: {\n scale: 0.9,\n leftSideBearing: 0,\n advanceWidth: 121,\n yOffset: 350,\n },\n csymParensRightVeryTall: {\n scale: 0.9,\n leftSideBearing: 50,\n advanceWidth: 111,\n yOffset: 350,\n },\n csymDiagonalArrangementSlash: {\n scale: 0.6,\n leftSideBearing: -1,\n advanceWidth: 990,\n yOffset: 0,\n },\n csymMinor: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 482,\n yOffset: 0,\n },\n csymMajorSeventh: {\n scale: 0.9,\n leftSideBearing: 200,\n yOffset: 0,\n advanceWidth: 600,\n },\n accidentalSharp: {\n scale: 0.75,\n leftSideBearing: 40,\n advanceWidth: 250,\n yOffset: -402,\n },\n accidentalFlat: {\n scale: 0.95,\n leftSideBearing: -50,\n advanceWidth: 208,\n yOffset: -184,\n },\n },\n jazzOrnaments: {\n brassScoop: {\n scale: 1.0,\n xOffset: -12,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 10,\n },\n brassDoitMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassFallLipShort: {\n scale: 1.0,\n xOffset: 17,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassLiftMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 5,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassFallRoughMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 28,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassBend: {\n scale: 1.0,\n xOffset: 2,\n yOffset: -8,\n stemUpYOffset: 24,\n reportedWidth: 5,\n },\n brassMuteClosed: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -9,\n stemUpYOffset: 24,\n reportedWidth: 5,\n },\n brassMuteOpen: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -7,\n stemUpYOffset: 25,\n reportedWidth: 5,\n },\n brassFlip: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassJazzTurn: {\n scale: 1.0,\n xOffset: 6,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassSmear: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n },\n tremolo: {\n default: {\n shiftY: -10,\n },\n grace: {\n shiftY: -5,\n },\n },\n tuplet: {\n noteHeadOffset: 20,\n stemOffset: 10,\n bottomLine: 4,\n topModifierOffset: 15,\n },\n },\n};\n","export const PetalumaScriptFont = {\n spacing: 50,\n glyphs: {\n ' ': {\n x_min: 0,\n x_max: 250,\n y_min: 0,\n y_max: 500,\n ha: 500,\n leftSideBearing: 0,\n advanceWidth: 250,\n },\n '0': {\n x_min: 33,\n x_max: 534,\n y_min: -13,\n y_max: 751,\n ha: 764,\n leftSideBearing: 33,\n advanceWidth: 570,\n },\n '1': {\n x_min: 48,\n x_max: 235,\n y_min: -17,\n y_max: 734,\n ha: 751,\n leftSideBearing: 48,\n advanceWidth: 286,\n },\n '2': {\n x_min: 56,\n x_max: 571,\n y_min: -19,\n y_max: 741,\n ha: 760,\n leftSideBearing: 56,\n advanceWidth: 626,\n },\n '3': {\n x_min: 50,\n x_max: 528,\n y_min: -7,\n y_max: 731,\n ha: 738,\n leftSideBearing: 50,\n advanceWidth: 589,\n },\n '4': {\n x_min: 38,\n x_max: 564,\n y_min: -13,\n y_max: 743,\n ha: 756,\n leftSideBearing: 38,\n advanceWidth: 614,\n },\n '5': {\n x_min: 42,\n x_max: 601,\n y_min: -34,\n y_max: 743,\n ha: 777,\n leftSideBearing: 42,\n advanceWidth: 648,\n },\n '6': {\n x_min: 47,\n x_max: 606,\n y_min: -16,\n y_max: 743,\n ha: 759,\n leftSideBearing: 47,\n advanceWidth: 667,\n },\n '7': {\n x_min: 47,\n x_max: 567,\n y_min: 5,\n y_max: 739,\n ha: 734,\n leftSideBearing: 0,\n advanceWidth: 615,\n },\n '8': {\n x_min: 40,\n x_max: 541,\n y_min: -15,\n y_max: 752,\n ha: 767,\n leftSideBearing: 40,\n advanceWidth: 585,\n },\n '9': {\n x_min: 40,\n x_max: 537,\n y_min: -52,\n y_max: 736,\n ha: 788,\n leftSideBearing: 40,\n advanceWidth: 592,\n },\n '!': {\n x_min: 49,\n x_max: 180,\n y_min: -7,\n y_max: 761,\n ha: 768,\n leftSideBearing: 49,\n advanceWidth: 230,\n },\n '\"': {\n x_min: 39,\n x_max: 304,\n y_min: 596,\n y_max: 804,\n ha: 208,\n leftSideBearing: 39,\n advanceWidth: 353,\n },\n '#': {\n x_min: 33,\n x_max: 599,\n y_min: -8,\n y_max: 765,\n ha: 773,\n leftSideBearing: 33,\n advanceWidth: 648,\n },\n $: {\n x_min: 53,\n x_max: 495,\n y_min: -111,\n y_max: 823,\n ha: 934,\n leftSideBearing: 53,\n advanceWidth: 560,\n },\n '%': {\n x_min: 35,\n x_max: 656,\n y_min: -128,\n y_max: 808,\n ha: 936,\n leftSideBearing: 35,\n advanceWidth: 711,\n },\n '&': {\n x_min: 53,\n x_max: 441,\n y_min: -3,\n y_max: 753,\n ha: 756,\n leftSideBearing: 53,\n advanceWidth: 500,\n },\n \"'\": {\n x_min: 43,\n x_max: 161,\n y_min: 590,\n y_max: 811,\n ha: 221,\n leftSideBearing: 43,\n advanceWidth: 217,\n },\n '(': {\n x_min: 41,\n x_max: 311,\n y_min: -36,\n y_max: 845,\n ha: 881,\n leftSideBearing: 41,\n advanceWidth: 308,\n },\n ')': {\n x_min: -8,\n x_max: 257,\n y_min: -21,\n y_max: 852,\n ha: 873,\n leftSideBearing: -8,\n advanceWidth: 280,\n },\n '*': {\n x_min: 59,\n x_max: 539,\n y_min: 175,\n y_max: 589,\n ha: 414,\n leftSideBearing: 59,\n advanceWidth: 601,\n },\n '+': {\n x_min: 33,\n x_max: 361,\n y_min: 180,\n y_max: 587,\n ha: 407,\n leftSideBearing: 33,\n advanceWidth: 400,\n },\n ',': {\n x_min: 15,\n x_max: 176,\n y_min: -129,\n y_max: 92,\n ha: 221,\n leftSideBearing: 15,\n advanceWidth: 205,\n },\n '-': {\n x_min: 40,\n x_max: 380,\n y_min: 317,\n y_max: 452,\n ha: 135,\n leftSideBearing: 40,\n advanceWidth: 422,\n },\n '.': {\n x_min: 48,\n x_max: 185,\n y_min: -56,\n y_max: 84,\n ha: 140,\n leftSideBearing: 48,\n advanceWidth: 227,\n },\n '/': {\n x_min: -58,\n x_max: 654,\n y_min: -122,\n y_max: 844,\n ha: 966,\n leftSideBearing: -58,\n advanceWidth: 626,\n },\n ':': {\n x_min: 65,\n x_max: 225,\n y_min: 97,\n y_max: 536,\n ha: 439,\n leftSideBearing: 65,\n advanceWidth: 302,\n },\n ';': {\n x_min: 13,\n x_max: 295,\n y_min: -139,\n y_max: 536,\n ha: 675,\n leftSideBearing: 13,\n advanceWidth: 334,\n },\n '<': {\n x_min: 28,\n x_max: 438,\n y_min: -1,\n y_max: 607,\n ha: 608,\n leftSideBearing: 28,\n advanceWidth: 475,\n },\n '=': {\n x_min: 40,\n x_max: 383,\n y_min: 199.9598640852289,\n y_max: 541,\n ha: 341.0401359147711,\n leftSideBearing: 40,\n advanceWidth: 422,\n },\n '>': {\n x_min: 35,\n x_max: 421,\n y_min: 28,\n y_max: 632,\n ha: 604,\n leftSideBearing: 35,\n advanceWidth: 466,\n },\n '?': {\n x_min: 45,\n x_max: 548,\n y_min: -17,\n y_max: 767,\n ha: 784,\n leftSideBearing: 45,\n advanceWidth: 592,\n },\n '@': {\n x_min: 51,\n x_max: 730,\n y_min: -78,\n y_max: 753,\n ha: 831,\n leftSideBearing: 51,\n advanceWidth: 781,\n },\n A: {\n x_min: 37,\n x_max: 554,\n y_min: -4,\n y_max: 746,\n ha: 750,\n leftSideBearing: 37,\n advanceWidth: 617,\n },\n B: {\n x_min: 37,\n x_max: 532,\n y_min: 3,\n y_max: 783,\n ha: 780,\n leftSideBearing: 37,\n advanceWidth: 579,\n },\n C: {\n x_min: 37,\n x_max: 583,\n y_min: -3,\n y_max: 775,\n ha: 778,\n leftSideBearing: 37,\n advanceWidth: 623,\n },\n D: {\n x_min: 50,\n x_max: 530,\n y_min: -15,\n y_max: 749,\n ha: 764,\n leftSideBearing: 50,\n advanceWidth: 579,\n },\n E: {\n x_min: 45,\n x_max: 531,\n y_min: -1,\n y_max: 743,\n ha: 744,\n leftSideBearing: 45,\n advanceWidth: 585,\n },\n F: {\n x_min: 45,\n x_max: 459,\n y_min: 23,\n y_max: 727,\n ha: 704,\n leftSideBearing: 45,\n advanceWidth: 510,\n },\n G: {\n x_min: 31,\n x_max: 577,\n y_min: -8,\n y_max: 733,\n ha: 741,\n leftSideBearing: 31,\n advanceWidth: 611,\n },\n H: {\n x_min: 37,\n x_max: 493,\n y_min: -22,\n y_max: 758,\n ha: 780,\n leftSideBearing: 37,\n advanceWidth: 535,\n },\n I: {\n x_min: 47,\n x_max: 501,\n y_min: -3,\n y_max: 731,\n ha: 734,\n leftSideBearing: 47,\n advanceWidth: 541,\n },\n J: {\n x_min: 33,\n x_max: 531,\n y_min: -23,\n y_max: 725,\n ha: 748,\n leftSideBearing: 33,\n advanceWidth: 573,\n },\n K: {\n x_min: 43,\n x_max: 505,\n y_min: -10,\n y_max: 740,\n ha: 750,\n leftSideBearing: 43,\n advanceWidth: 560,\n },\n L: {\n x_min: 49,\n x_max: 457,\n y_min: -2,\n y_max: 746,\n ha: 748,\n leftSideBearing: 49,\n advanceWidth: 510,\n },\n M: {\n x_min: 35,\n x_max: 699,\n y_min: 1,\n y_max: 744,\n ha: 743,\n leftSideBearing: 35,\n advanceWidth: 743,\n },\n N: {\n x_min: 34,\n x_max: 533,\n y_min: -17,\n y_max: 761,\n ha: 778,\n leftSideBearing: 34,\n advanceWidth: 579,\n },\n O: {\n x_min: 41,\n x_max: 608,\n y_min: -5,\n y_max: 735,\n ha: 740,\n leftSideBearing: 41,\n advanceWidth: 667,\n },\n P: {\n x_min: 53,\n x_max: 451,\n y_min: -18,\n y_max: 735,\n ha: 753,\n leftSideBearing: 53,\n advanceWidth: 497,\n },\n Q: {\n x_min: 40,\n x_max: 599,\n y_min: -67,\n y_max: 744,\n ha: 811,\n leftSideBearing: 40,\n advanceWidth: 648,\n },\n R: {\n x_min: 39,\n x_max: 487,\n y_min: 16,\n y_max: 735,\n ha: 719,\n leftSideBearing: 39,\n advanceWidth: 535,\n },\n S: {\n x_min: 35,\n x_max: 552,\n y_min: -47,\n y_max: 708,\n ha: 755,\n leftSideBearing: 35,\n advanceWidth: 604,\n },\n T: {\n x_min: 26,\n x_max: 656,\n y_min: -13,\n y_max: 718,\n ha: 731,\n leftSideBearing: 26,\n advanceWidth: 705,\n },\n U: {\n x_min: 41,\n x_max: 518,\n y_min: -20,\n y_max: 748,\n ha: 768,\n leftSideBearing: 41,\n advanceWidth: 567,\n },\n V: {\n x_min: 47,\n x_max: 509,\n y_min: -26,\n y_max: 744,\n ha: 770,\n leftSideBearing: 47,\n advanceWidth: 567,\n },\n W: {\n x_min: 44,\n x_max: 789,\n y_min: -35,\n y_max: 720,\n ha: 755,\n leftSideBearing: 44,\n advanceWidth: 833,\n },\n X: {\n x_min: 63,\n x_max: 635,\n y_min: -10,\n y_max: 745,\n ha: 755,\n leftSideBearing: 63,\n advanceWidth: 680,\n },\n Y: {\n x_min: 43,\n x_max: 503,\n y_min: -21,\n y_max: 734,\n ha: 755,\n leftSideBearing: 43,\n advanceWidth: 541,\n },\n Z: {\n x_min: 42,\n x_max: 584,\n y_min: -10,\n y_max: 739,\n ha: 749,\n leftSideBearing: 42,\n advanceWidth: 629,\n },\n '[': {\n x_min: 46,\n x_max: 346,\n y_min: -150,\n y_max: 884,\n ha: 1034,\n leftSideBearing: 46,\n advanceWidth: 291,\n },\n '\\\\': {\n x_min: 20,\n x_max: 616,\n y_min: -100,\n y_max: 797,\n ha: 897,\n leftSideBearing: 20,\n advanceWidth: 645,\n },\n ']': {\n x_min: -76,\n x_max: 226,\n y_min: -150,\n y_max: 881,\n ha: 1031,\n leftSideBearing: -76,\n advanceWidth: 297,\n },\n '^': {\n x_min: 43,\n x_max: 437,\n y_min: 517,\n y_max: 812,\n ha: 295,\n leftSideBearing: 43,\n advanceWidth: 478,\n },\n _: {\n x_min: 29,\n x_max: 563,\n y_min: -110,\n y_max: -1,\n ha: 109,\n leftSideBearing: 29,\n advanceWidth: 598,\n },\n '`': {\n x_min: 54,\n x_max: 321,\n y_min: 540,\n y_max: 747,\n ha: 207,\n leftSideBearing: 54,\n advanceWidth: 368,\n },\n a: {\n x_min: 20,\n x_max: 447,\n y_min: -17,\n y_max: 495,\n ha: 512,\n leftSideBearing: 20,\n advanceWidth: 494,\n },\n b: {\n x_min: 37,\n x_max: 466,\n y_min: -27,\n y_max: 770,\n ha: 797,\n leftSideBearing: 37,\n advanceWidth: 510,\n },\n c: {\n x_min: 35,\n x_max: 456,\n y_min: -9,\n y_max: 507,\n ha: 516,\n leftSideBearing: 35,\n advanceWidth: 460,\n },\n d: {\n x_min: 45,\n x_max: 520,\n y_min: -15,\n y_max: 764,\n ha: 779,\n leftSideBearing: 45,\n advanceWidth: 560,\n },\n e: {\n x_min: 33,\n x_max: 370,\n y_min: -5,\n y_max: 501,\n ha: 506,\n leftSideBearing: 33,\n advanceWidth: 397,\n },\n f: {\n x_min: 35,\n x_max: 411,\n y_min: -13,\n y_max: 695,\n ha: 708,\n leftSideBearing: 35,\n advanceWidth: 453,\n },\n g: {\n x_min: 33,\n x_max: 551,\n y_min: -257,\n y_max: 505,\n ha: 762,\n leftSideBearing: 33,\n advanceWidth: 611,\n },\n h: {\n x_min: 32,\n x_max: 458,\n y_min: -29,\n y_max: 743,\n ha: 772,\n leftSideBearing: 32,\n advanceWidth: 491,\n },\n i: {\n x_min: 45,\n x_max: 167,\n y_min: -13,\n y_max: 631,\n ha: 644,\n leftSideBearing: 45,\n advanceWidth: 220,\n },\n j: {\n x_min: -127,\n x_max: 261,\n y_min: -231,\n y_max: 601,\n ha: 832,\n leftSideBearing: -127,\n advanceWidth: 308,\n },\n k: {\n x_min: 39,\n x_max: 443,\n y_min: -3,\n y_max: 700,\n ha: 703,\n leftSideBearing: 39,\n advanceWidth: 497,\n },\n l: {\n x_min: 58,\n x_max: 168,\n y_min: -8,\n y_max: 686,\n ha: 694,\n leftSideBearing: 58,\n advanceWidth: 227,\n },\n m: {\n x_min: 39,\n x_max: 688,\n y_min: -14,\n y_max: 501,\n ha: 515,\n leftSideBearing: 39,\n advanceWidth: 718,\n },\n n: {\n x_min: 45,\n x_max: 491,\n y_min: -32,\n y_max: 512,\n ha: 544,\n leftSideBearing: 45,\n advanceWidth: 541,\n },\n o: {\n x_min: 41,\n x_max: 424,\n y_min: -12,\n y_max: 493,\n ha: 505,\n leftSideBearing: 41,\n advanceWidth: 447,\n },\n p: {\n x_min: 25,\n x_max: 529,\n y_min: -260,\n y_max: 500,\n ha: 760,\n leftSideBearing: 25,\n advanceWidth: 573,\n },\n q: {\n x_min: 53,\n x_max: 603,\n y_min: -235,\n y_max: 514,\n ha: 749,\n leftSideBearing: 53,\n advanceWidth: 623,\n },\n r: {\n x_min: 32,\n x_max: 407,\n y_min: -7,\n y_max: 492,\n ha: 499,\n leftSideBearing: 32,\n advanceWidth: 460,\n },\n s: {\n x_min: 49,\n x_max: 416,\n y_min: -12,\n y_max: 519,\n ha: 531,\n leftSideBearing: 49,\n advanceWidth: 460,\n },\n t: {\n x_min: 32,\n x_max: 442,\n y_min: -5,\n y_max: 684,\n ha: 689,\n leftSideBearing: 32,\n advanceWidth: 469,\n },\n u: {\n x_min: 41,\n x_max: 487,\n y_min: -5,\n y_max: 507,\n ha: 512,\n leftSideBearing: 41,\n advanceWidth: 510,\n },\n v: {\n x_min: 16,\n x_max: 441,\n y_min: -20,\n y_max: 542,\n ha: 562,\n leftSideBearing: 16,\n advanceWidth: 456,\n },\n w: {\n x_min: 39,\n x_max: 639,\n y_min: -22,\n y_max: 505,\n ha: 527,\n leftSideBearing: 39,\n advanceWidth: 661,\n },\n x: {\n x_min: 15,\n x_max: 505,\n y_min: -39,\n y_max: 539,\n ha: 578,\n leftSideBearing: 15,\n advanceWidth: 541,\n },\n y: {\n x_min: -98,\n x_max: 501,\n y_min: -242,\n y_max: 511,\n ha: 753,\n leftSideBearing: -98,\n advanceWidth: 548,\n },\n z: {\n x_min: 27,\n x_max: 479,\n y_min: -3,\n y_max: 494,\n ha: 497,\n leftSideBearing: 27,\n advanceWidth: 494,\n },\n '{': {\n x_min: 0,\n x_max: 0,\n y_min: 0,\n y_max: 0,\n ha: 0,\n leftSideBearing: 0,\n advanceWidth: 308,\n },\n '|': {\n x_min: 0,\n x_max: 0,\n y_min: 0,\n y_max: 0,\n ha: 0,\n leftSideBearing: 0,\n advanceWidth: 308,\n },\n '}': {\n x_min: 0,\n x_max: 0,\n y_min: 0,\n y_max: 0,\n ha: 0,\n leftSideBearing: 0,\n advanceWidth: 308,\n },\n '~': {\n x_min: 0,\n x_max: 0,\n y_min: 0,\n y_max: 0,\n ha: 0,\n leftSideBearing: 0,\n advanceWidth: 308,\n },\n },\n fontFamily: 'PetalumaScript',\n resolution: 1000,\n generatedOn: '2020-06-14T18:33:25.407Z',\n};\n","export const RobotoSlabFont = {\n spacing: 50,\n glyphs: {\n ' ': {\n x_min: 0,\n x_max: 509,\n y_min: 0,\n y_max: 2000,\n ha: 2000,\n leftSideBearing: 0,\n advanceWidth: 509,\n },\n '0': {\n x_min: 121,\n x_max: 1048,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 121,\n advanceWidth: 1168,\n },\n '1': {\n x_min: 117,\n x_max: 767,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 117,\n advanceWidth: 844,\n },\n '2': {\n x_min: 75.8474576645637,\n x_max: 1040,\n y_min: 0,\n y_max: 1477,\n ha: 1477,\n leftSideBearing: 75,\n advanceWidth: 1131,\n },\n '3': {\n x_min: 74.85365853658536,\n x_max: 994,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 74,\n advanceWidth: 1106,\n },\n '4': {\n x_min: 63,\n x_max: 1114,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 63,\n advanceWidth: 1187,\n },\n '5': {\n x_min: 96.8448275474953,\n x_max: 982,\n y_min: -21,\n y_max: 1456,\n ha: 1477,\n leftSideBearing: 96,\n advanceWidth: 1081,\n },\n '6': {\n x_min: 121,\n x_max: 1067,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 121,\n advanceWidth: 1144,\n },\n '7': {\n x_min: 76,\n x_max: 1060,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: -30,\n advanceWidth: 1128,\n },\n '8': {\n x_min: 92,\n x_max: 1039,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 92,\n advanceWidth: 1131,\n },\n '9': {\n x_min: 84,\n x_max: 1026,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 84,\n advanceWidth: 1154,\n },\n '!': {\n x_min: 143,\n x_max: 340,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 143,\n advanceWidth: 483,\n },\n '\"': {\n x_min: 166,\n x_max: 634,\n y_min: 1055,\n y_max: 1560,\n ha: 505,\n leftSideBearing: 166,\n advanceWidth: 770,\n },\n '#': {\n x_min: 63,\n x_max: 1179,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 63,\n advanceWidth: 1246,\n },\n $: {\n x_min: 81.92156915727656,\n x_max: 1012,\n y_min: -208,\n y_max: 1693,\n ha: 1901,\n leftSideBearing: 81,\n advanceWidth: 1110,\n },\n '%': {\n x_min: 77,\n x_max: 1384,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 77,\n advanceWidth: 1460,\n },\n '&': {\n x_min: 74,\n x_max: 1242,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 74,\n advanceWidth: 1289,\n },\n \"'\": {\n x_min: 166,\n x_max: 324,\n y_min: 1055,\n y_max: 1560,\n ha: 505,\n leftSideBearing: 166,\n advanceWidth: 460,\n },\n '(': {\n x_min: 114,\n x_max: 650,\n y_min: -463,\n y_max: 1636,\n ha: 2099,\n leftSideBearing: 114,\n advanceWidth: 662,\n },\n ')': {\n x_min: 11,\n x_max: 547,\n y_min: -463,\n y_max: 1636,\n ha: 2099,\n leftSideBearing: 11,\n advanceWidth: 654,\n },\n '*': {\n x_min: 66,\n x_max: 893,\n y_min: 607,\n y_max: 1456,\n ha: 849,\n leftSideBearing: 66,\n advanceWidth: 958,\n },\n '+': {\n x_min: 73,\n x_max: 1071,\n y_min: 146,\n y_max: 1206,\n ha: 1060,\n leftSideBearing: 73,\n advanceWidth: 1145,\n },\n ',': {\n x_min: 23,\n x_max: 315,\n y_min: -311,\n y_max: 221,\n ha: 532,\n leftSideBearing: 23,\n advanceWidth: 404,\n },\n '-': {\n x_min: 154,\n x_max: 643,\n y_min: 538,\n y_max: 692,\n ha: 154,\n leftSideBearing: 154,\n advanceWidth: 797,\n },\n '.': {\n x_min: 145,\n x_max: 342,\n y_min: 0,\n y_max: 202,\n ha: 202,\n leftSideBearing: 145,\n advanceWidth: 493,\n },\n '/': {\n x_min: 0,\n x_max: 774,\n y_min: -125,\n y_max: 1456,\n ha: 1581,\n leftSideBearing: 0,\n advanceWidth: 824,\n },\n ':': {\n x_min: 145,\n x_max: 342,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 145,\n advanceWidth: 419,\n },\n ';': {\n x_min: 53,\n x_max: 345,\n y_min: -311,\n y_max: 1082,\n ha: 1393,\n leftSideBearing: 53,\n advanceWidth: 424,\n },\n '<': {\n x_min: 76,\n x_max: 892,\n y_min: 107,\n y_max: 1013,\n ha: 906,\n leftSideBearing: 76,\n advanceWidth: 1017,\n },\n '=': {\n x_min: 147,\n x_max: 981,\n y_min: 407,\n y_max: 987,\n ha: 580,\n leftSideBearing: 147,\n advanceWidth: 1127,\n },\n '>': {\n x_min: 125,\n x_max: 980,\n y_min: 87,\n y_max: 993,\n ha: 906,\n leftSideBearing: 125,\n advanceWidth: 1060,\n },\n '?': {\n x_min: 65.92660602419838,\n x_max: 890,\n y_min: 0,\n y_max: 1477,\n ha: 1477,\n leftSideBearing: 65,\n advanceWidth: 953,\n },\n '@': {\n x_min: 84.3592218305664,\n x_max: 1705.2346925277395,\n y_min: -453,\n y_max: 1431,\n ha: 1884,\n leftSideBearing: 84,\n advanceWidth: 1821,\n },\n A: {\n x_min: 70,\n x_max: 1463,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 70,\n advanceWidth: 1533,\n },\n B: {\n x_min: 81,\n x_max: 1253,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1322,\n },\n C: {\n x_min: 80,\n x_max: 1174,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 80,\n advanceWidth: 1290,\n },\n D: {\n x_min: 81,\n x_max: 1291,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1356,\n },\n E: {\n x_min: 81,\n x_max: 1190,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1306,\n },\n F: {\n x_min: 81,\n x_max: 1176,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1256,\n },\n G: {\n x_min: 80,\n x_max: 1226,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 80,\n advanceWidth: 1346,\n },\n H: {\n x_min: 81,\n x_max: 1497,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1578,\n },\n I: {\n x_min: 81,\n x_max: 604,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 685,\n },\n J: {\n x_min: 60,\n x_max: 1100,\n y_min: -21,\n y_max: 1456,\n ha: 1477,\n leftSideBearing: 60,\n advanceWidth: 1169,\n },\n K: {\n x_min: 81,\n x_max: 1427,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1501,\n },\n L: {\n x_min: 81,\n x_max: 1130,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1210,\n },\n M: {\n x_min: 94,\n x_max: 1888,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 94,\n advanceWidth: 1982,\n },\n N: {\n x_min: 83,\n x_max: 1509,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 83,\n advanceWidth: 1592,\n },\n O: {\n x_min: 70,\n x_max: 1281,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 70,\n advanceWidth: 1351,\n },\n P: {\n x_min: 81,\n x_max: 1242,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1297,\n },\n Q: {\n x_min: 70,\n x_max: 1348,\n y_min: -245,\n y_max: 1477,\n ha: 1722,\n leftSideBearing: 70,\n advanceWidth: 1376,\n },\n R: {\n x_min: 81,\n x_max: 1285,\n y_min: 0,\n y_max: 1455,\n ha: 1455,\n leftSideBearing: 81,\n advanceWidth: 1385,\n },\n S: {\n x_min: 115,\n x_max: 1116,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 115,\n advanceWidth: 1206,\n },\n T: {\n x_min: 96,\n x_max: 1306,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 96,\n advanceWidth: 1406,\n },\n U: {\n x_min: 70,\n x_max: 1452,\n y_min: -21,\n y_max: 1456,\n ha: 1477,\n leftSideBearing: 70,\n advanceWidth: 1522,\n },\n V: {\n x_min: 65,\n x_max: 1443,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 65,\n advanceWidth: 1508,\n },\n W: {\n x_min: 72,\n x_max: 2057,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 72,\n advanceWidth: 2129,\n },\n X: {\n x_min: 80,\n x_max: 1449,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 80,\n advanceWidth: 1529,\n },\n Y: {\n x_min: 65,\n x_max: 1396,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 65,\n advanceWidth: 1461,\n },\n Z: {\n x_min: 90,\n x_max: 1107,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 90,\n advanceWidth: 1197,\n },\n '[': {\n x_min: 157,\n x_max: 541,\n y_min: -312,\n y_max: 1664,\n ha: 1976,\n leftSideBearing: 157,\n advanceWidth: 573,\n },\n '\\\\': {\n x_min: 36,\n x_max: 830,\n y_min: -125,\n y_max: 1456,\n ha: 1581,\n leftSideBearing: 36,\n advanceWidth: 841,\n },\n ']': {\n x_min: 23,\n x_max: 408,\n y_min: -312,\n y_max: 1664,\n ha: 1976,\n leftSideBearing: 23,\n advanceWidth: 552,\n },\n '^': {\n x_min: 71,\n x_max: 802,\n y_min: 729,\n y_max: 1456,\n ha: 727,\n leftSideBearing: 71,\n advanceWidth: 864,\n },\n _: {\n x_min: 119,\n x_max: 1041,\n y_min: -154,\n y_max: 0,\n ha: 154,\n leftSideBearing: 119,\n advanceWidth: 1168,\n },\n '`': {\n x_min: 40,\n x_max: 456,\n y_min: 1288,\n y_max: 1560,\n ha: 272,\n leftSideBearing: 40,\n advanceWidth: 496,\n },\n a: {\n x_min: 79,\n x_max: 1053,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 79,\n advanceWidth: 1132,\n },\n b: {\n x_min: -16,\n x_max: 1071,\n y_min: -21,\n y_max: 1560,\n ha: 1581,\n leftSideBearing: -16,\n advanceWidth: 1145,\n },\n c: {\n x_min: 78,\n x_max: 988,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 78,\n advanceWidth: 1067,\n },\n d: {\n x_min: 78,\n x_max: 1156,\n y_min: -21,\n y_max: 1560,\n ha: 1581,\n leftSideBearing: 78,\n advanceWidth: 1218,\n },\n e: {\n x_min: 74,\n x_max: 980,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 74,\n advanceWidth: 1059,\n },\n f: {\n x_min: 64,\n x_max: 731,\n y_min: 0,\n y_max: 1581,\n ha: 1581,\n leftSideBearing: 64,\n advanceWidth: 725,\n },\n g: {\n x_min: 78,\n x_max: 1133,\n y_min: -437,\n y_max: 1102,\n ha: 1539,\n leftSideBearing: 78,\n advanceWidth: 1157,\n },\n h: {\n x_min: 49,\n x_max: 1255,\n y_min: 0,\n y_max: 1560,\n ha: 1560,\n leftSideBearing: 49,\n advanceWidth: 1315,\n },\n i: {\n x_min: 67,\n x_max: 590,\n y_min: 0,\n y_max: 1560,\n ha: 1560,\n leftSideBearing: 67,\n advanceWidth: 652,\n },\n j: {\n x_min: -56,\n x_max: 381,\n y_min: -437,\n y_max: 1560,\n ha: 1997,\n leftSideBearing: -56,\n advanceWidth: 525,\n },\n k: {\n x_min: 64,\n x_max: 1248,\n y_min: 0,\n y_max: 1560,\n ha: 1560,\n leftSideBearing: 64,\n advanceWidth: 1287,\n },\n l: {\n x_min: 64,\n x_max: 587,\n y_min: 0,\n y_max: 1560,\n ha: 1560,\n leftSideBearing: 64,\n advanceWidth: 653,\n },\n m: {\n x_min: 74,\n x_max: 1905,\n y_min: 0,\n y_max: 1102,\n ha: 1102,\n leftSideBearing: 74,\n advanceWidth: 1977,\n },\n n: {\n x_min: 74,\n x_max: 1278,\n y_min: 0,\n y_max: 1102,\n ha: 1102,\n leftSideBearing: 74,\n advanceWidth: 1343,\n },\n o: {\n x_min: 78,\n x_max: 1046,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 78,\n advanceWidth: 1124,\n },\n p: {\n x_min: 34,\n x_max: 1119,\n y_min: -416,\n y_max: 1102,\n ha: 1518,\n leftSideBearing: 34,\n advanceWidth: 1197,\n },\n q: {\n x_min: 78,\n x_max: 1135,\n y_min: -416,\n y_max: 1102,\n ha: 1518,\n leftSideBearing: 78,\n advanceWidth: 1139,\n },\n r: {\n x_min: 72,\n x_max: 808,\n y_min: 0,\n y_max: 1102,\n ha: 1102,\n leftSideBearing: 72,\n advanceWidth: 854,\n },\n s: {\n x_min: 104,\n x_max: 933,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 104,\n advanceWidth: 1022,\n },\n t: {\n x_min: 24,\n x_max: 678,\n y_min: -17,\n y_max: 1343,\n ha: 1360,\n leftSideBearing: 24,\n advanceWidth: 730,\n },\n u: {\n x_min: 52,\n x_max: 1181,\n y_min: -21,\n y_max: 1082,\n ha: 1103,\n leftSideBearing: 52,\n advanceWidth: 1245,\n },\n v: {\n x_min: 26,\n x_max: 1176,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 26,\n advanceWidth: 1206,\n },\n w: {\n x_min: 52,\n x_max: 1777,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 52,\n advanceWidth: 1823,\n },\n x: {\n x_min: 42,\n x_max: 1163,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 42,\n advanceWidth: 1203,\n },\n y: {\n x_min: 24,\n x_max: 1172,\n y_min: -437,\n y_max: 1082,\n ha: 1519,\n leftSideBearing: 24,\n advanceWidth: 1192,\n },\n z: {\n x_min: 88,\n x_max: 960,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 88,\n advanceWidth: 1032,\n },\n '{': {\n x_min: 63,\n x_max: 671,\n y_min: -364,\n y_max: 1597,\n ha: 1961,\n leftSideBearing: 63,\n advanceWidth: 701,\n },\n '|': {\n x_min: 150,\n x_max: 307,\n y_min: -270,\n y_max: 1456,\n ha: 1726,\n leftSideBearing: 150,\n advanceWidth: 451,\n },\n '}': {\n x_min: 27,\n x_max: 635,\n y_min: -364,\n y_max: 1597,\n ha: 1961,\n leftSideBearing: 27,\n advanceWidth: 701,\n },\n '~': {\n x_min: 121,\n x_max: 1257,\n y_min: 401,\n y_max: 803,\n ha: 402,\n leftSideBearing: 121,\n advanceWidth: 1386,\n },\n },\n fontFamily: 'Roboto Slab',\n resolution: 2048,\n generatedOn: '2020-06-15T19:12:58.120Z',\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from '../font';\nimport { GonvilleFont } from './gonville_glyphs';\nimport { GonvilleMetrics } from './gonville_metrics';\nexport function loadGonville() {\n Font.load('Gonville', GonvilleFont, GonvilleMetrics);\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from '../font';\nimport { CustomFont } from './custom_glyphs';\nimport { CustomMetrics } from './custom_metrics';\nexport function loadCustom() {\n Font.load('Custom', CustomFont, CustomMetrics);\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// vexflow-gonville.ts is the entry point for vexflow-gonville.js.\n// This version bundles the Gonville music engraving font.\nimport { Vex } from '../src/vex';\nimport { Flow } from '../src/flow';\nimport { loadCustom } from '../src/fonts/load_custom';\nimport { loadGonville } from '../src/fonts/load_gonville';\nimport { loadTextFonts } from '../src/fonts/textfonts';\nloadGonville();\nloadCustom();\nFlow.setMusicFont('Gonville', 'Custom');\nloadTextFonts();\nexport * from '../src/index';\nexport default Vex;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from '../font';\nimport { TextFormatter } from '../textformatter';\nimport { PetalumaScriptFont } from './petalumascript_glyphs';\nimport { RobotoSlabFont } from './robotoslab_glyphs';\nexport function loadTextFonts() {\n // Roboto Slab\n {\n const fontData = RobotoSlabFont;\n const { fontFamily, resolution, glyphs } = fontData;\n Font.load(fontFamily, fontData);\n // Previously we used 'H', but it isn't actually the tallest or the widest.\n // Interestingly, the lowercase 'b' is the tallest glyph.\n const maxSizeGlyph = 'b';\n TextFormatter.registerInfo({\n family: fontFamily,\n resolution,\n glyphs,\n maxSizeGlyph,\n monospaced: false,\n bold: false,\n italic: false,\n superscriptOffset: 0.66,\n subscriptOffset: 0.66,\n serifs: true,\n description: 'Text font to pair with the Bravura / Gonville music fonts.',\n });\n }\n // PetalumaScript\n {\n const fontData = PetalumaScriptFont;\n const { fontFamily, resolution, glyphs } = fontData;\n Font.load(fontFamily, fontData);\n // M is wider, but H is taller. :-)\n // Lowercase b is also taller in this font.\n const maxSizeGlyph = 'b';\n TextFormatter.registerInfo({\n family: fontFamily,\n resolution,\n glyphs,\n maxSizeGlyph,\n monospaced: false,\n bold: false,\n italic: false,\n superscriptOffset: 0.66,\n subscriptOffset: 0.66,\n serifs: false,\n description: 'Text font to pair with the Petaluma music font.',\n });\n }\n}\n"],"names":["root","factory","exports","module","define","amd","window","globalThis","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","g","Function","e","obj","prop","prototype","hasOwnProperty","call","isCategory","category","checkAncestors","constructorFcn","constructor","CATEGORY","getPrototypeOf","isBarline","Category","Barline","isGraceNote","GraceNote","isNote","Note","isStaveNote","StaveNote","isStemmableNote","StemmableNote","isTabNote","TabNote","RuntimeError","Error","code","message","super","globalObject","self","defined","x","undefined","log","block","args","line","Array","slice","join","console","warn","err","stack","midLine","a","b","mid_line","n","parseInt","prefix","text","normalizeAngle","Math","PI","Fraction","numerator","denominator","set","static","Number","isNaN","t","GCD","length","LCM","shift","LCMM","value","simplify","u","d","gcd","add","param1","param2","otherNumerator","otherDenominator","getNumeratorAndDenominator","lcm","subtract","multiply","divide","equals","compare","__staticFractionA","copy","__staticFractionB","greaterThan","greaterThanEquals","lessThan","lessThanEquals","clone","other","quotient","floor","remainder","makeAbs","abs","toString","toSimplifiedString","__staticFractionTmp","toMixedString","s","q","f","parse","str","i","split","BoundingBox","y","w","h","that","getX","getY","getW","getH","setX","setY","setW","setH","move","mergeWith","boundingBox","new_x","new_y","new_w","max","new_h","BoundingBoxComputation","x1","NaN","y1","x2","y2","getX1","getY1","width","height","addPoint","addX","addY","addQuadraticCurve","p0x","p0y","p1x","p1y","p2x","p2y","p01x","denom","it","p01y","addBezierCurve","p3x","p3y","p0","p1","p2","p3","pow","c","b2ac","t1","sqrt","t2","FontWeight","FontStyle","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","rejected","result","done","then","apply","fontParser","Fonts","Font","fontName","name","fontSize","SIZE","_a","scaleToPxFrom","pt","parseFloat","unit","replace","toLowerCase","size","weight","style","fromCSSString","family","SANS_SERIF","NORMAL","cssFontShorthand","document","createElement","font","fontFamily","fontWeight","fontStyle","fontInfo","st","trim","wt","sz","scaleFactor","parsedWeight","ITALIC","woffURL","includeWoff2","fontFace","FontFace","load","fonts","host","WEB_FONT_HOST","files","WEB_FONT_FILES","fontPath","loadWebFont","data","metrics","setData","setMetrics","getName","getData","getMetrics","hasData","getResolution","resolution","getGlyphs","glyphs","lookupMetric","defaultValue","keyParts","currObj","SERIF","px","em","in","mm","cm","PetalumaScript","Index","id","type","class","Registry","index","defaultRegistry","registry","clear","setIndexValue","elem","updateIndex","oldValue","getElementById","getAttribute","register","setAttribute","onRegister","_b","getElementsByAttribute","attribute","index_attr","index_attr_val","keys","map","k","getElementsByType","getElementsByClass","className","onUpdate","info","includes","Element","attrs","newID","el","getCategory","classes","rendered","getDefaultRegistry","ID","setStyle","getStyle","applyStyle","context","save","shadowColor","setShadowColor","shadowBlur","setShadowBlur","fillStyle","setFillStyle","strokeStyle","setStrokeStyle","lineWidth","setLineWidth","restoreStyle","restore","drawWithStyle","checkContext","draw","hasClass","addClass","removeClass","isRendered","setRendered","getAttributes","oldID","getBoundingBox","getContext","setContext","setFont","toCSSString","textFont","defaultTextFont","TEXT_FONT","fontIsObject","fontIsString","fontIsUndefined","sizeWeightStyleAreUndefined","assign","validate","getFont","resetFont","setFontSize","getFontSize","fontSizeInPoints","convertSizeToPointValue","fontSizeInPixels","convertSizeToPixelValue","OutlineCode","ModifierPosition","GlyphCacheEntry","fontStack","point","Glyph","loadMetrics","bbox","getOutlineBoundingBox","outline","scale","x_shift","y_shift","lookupFontMetric","GlyphOutline","originX","originY","nextX","nextY","parts","push","MOVE","LINE","QUADRATIC","BEZIER","options","topGlyphs","botGlyphs","originShift","setOptions","reset","glyph","lookupGlyph","x_min","x_max","ha","cached_outline","ctx","x_pos","y_pos","cache","lookup","customScale","renderOutline","go","beginPath","moveTo","lineTo","quadraticCurveTo","bezierCurveTo","fill","bboxComp","penX","penY","getCode","setPoint","setStave","stave","setXShift","setYShift","checkMetrics","metricsScale","setOriginX","xShift","setOriginY","yShift","setOrigin","render","xPos","yPos","checkStave","renderToStave","getYForGlyphs","Map","entries","CURRENT_CACHE_KEY","entry","MUSIC_FONT_STACK","Modifier","text_line","position","Position","LEFT","spacingFromNextModifier","PositionString","center","CENTER","above","ABOVE","below","BELOW","left","right","RIGHT","getWidth","setWidth","getNote","note","checkAttachedNote","setNote","getIndex","checkIndex","setIndex","getModifierContext","modifierContext","checkModifierContext","setModifierContext","getPosition","setPosition","setTextLine","setSpacingFromNextModifier","getSpacingFromNextModifier","getXShift","alignSubNotesWithNote","subNotes","tickContext","getTickContext","getStave","subNoteXOffset","modLeftPx","modRightPx","forEach","subNote","subTickContext","setXOffset","Music","NUM_TONES","canonical_notes","roots","root_values","root_indices","diatonic_intervals","diatonic_accidentals","unison","accidental","m2","M2","m3","M3","p4","dim5","p5","m6","M6","b7","M7","octave","intervals","b2","min2","S","H","maj2","T","W","b3","min3","maj3","b5","aug4","b6","aug5","maj6","m7","min7","dom7","maj7","scales","major","minor","ionian","dorian","phyrgian","lydian","mixolydian","aeolian","locrian","scaleTypes","M","m","accidentals","noteValues","root_index","int_val","cn","cb","cbb","dn","db","dbb","en","eb","ebb","fn","fb","fbb","gn","gb","gbb","an","ab","abb","bn","bb","bbb","isValidNoteValue","isValidIntervalValue","interval","getNoteParts","noteString","match","exec","getKeyParts","keyString","getNoteValue","getIntervalValue","intervalString","getCanonicalNoteName","noteValue","getCanonicalIntervalName","intervalValue","getRelativeNoteValue","direction","sum","getRelativeNoteName","rootValue","multiplier","reverse_interval","relativeNoteName","getScaleTones","tones","nextNote","getIntervalBetween","note1","note2","difference","createScaleMap","keySignature","keySigParts","scaleName","keySigString","noteLocation","scaleMap","rootName","noteName","RESOLUTION","durations","durationAliases","keySignatures","C","num","Am","F","acc","Dm","Bb","Gm","Eb","Cm","Ab","Fm","Db","Bbm","Gb","Ebm","Cb","Abm","G","Em","D","Bm","A","E","B","clefs","treble","line_shift","bass","tenor","alto","soprano","percussion","subbass","french","notesInfo","CN","CB","CBB","DN","DB","DBB","EN","EB","EBB","FN","FB","FBB","GN","GB","GBB","AN","AB","ABB","BN","BB","BBB","R","rest","X","shift_right","customNoteHeads","D0","D1","D2","D3","T0","T1","T2","T3","X0","X1","X2","X3","S1","S2","R1","R2","parenRightPaddingAdjustment","bs","bss","bbs","ashs","afhf","accSagittal5v7KleismaUp","accSagittal5v7KleismaDown","accSagittal5CommaUp","accSagittal5CommaDown","accSagittal7CommaUp","accSagittal7CommaDown","accSagittal25SmallDiesisUp","accSagittal25SmallDiesisDown","accSagittal35MediumDiesisUp","accSagittal35MediumDiesisDown","accSagittal11MediumDiesisUp","accSagittal11MediumDiesisDown","accSagittal11LargeDiesisUp","accSagittal11LargeDiesisDown","accSagittal35LargeDiesisUp","accSagittal35LargeDiesisDown","accSagittalSharp25SDown","accSagittalFlat25SUp","accSagittalSharp7CDown","accSagittalFlat7CUp","accSagittalSharp5CDown","accSagittalFlat5CUp","accSagittalSharp5v7kDown","accSagittalFlat5v7kUp","accSagittalSharp","accSagittalFlat","accSagittalSharp5v7kUp","accSagittalFlat5v7kDown","accSagittalSharp5CUp","accSagittalFlat5CDown","accSagittalSharp7CUp","accSagittalFlat7CDown","accSagittalSharp25SUp","accSagittalFlat25SDown","accSagittalSharp35MUp","accSagittalFlat35MDown","accSagittalSharp11MUp","accSagittalFlat11MDown","accSagittalSharp11LUp","accSagittalFlat11LDown","accSagittalSharp35LUp","accSagittalFlat35LDown","accSagittalDoubleSharp25SDown","accSagittalDoubleFlat25SUp","accSagittalDoubleSharp7CDown","accSagittalDoubleFlat7CUp","accSagittalDoubleSharp5CDown","accSagittalDoubleFlat5CUp","accSagittalDoubleSharp5v7kDown","accSagittalDoubleFlat5v7kUp","accSagittalDoubleSharp","accSagittalDoubleFlat","accSagittal7v11KleismaUp","accSagittal7v11KleismaDown","accSagittal17CommaUp","accSagittal17CommaDown","accSagittal55CommaUp","accSagittal55CommaDown","accSagittal7v11CommaUp","accSagittal7v11CommaDown","accSagittal5v11SmallDiesisUp","accSagittal5v11SmallDiesisDown","accSagittalSharp5v11SDown","accSagittalFlat5v11SUp","accSagittalSharp7v11CDown","accSagittalFlat7v11CUp","accSagittalSharp55CDown","accSagittalFlat55CUp","accSagittalSharp17CDown","accSagittalFlat17CUp","accSagittalSharp7v11kDown","accSagittalFlat7v11kUp","accSagittalSharp7v11kUp","accSagittalFlat7v11kDown","accSagittalSharp17CUp","accSagittalFlat17CDown","accSagittalSharp55CUp","accSagittalFlat55CDown","accSagittalSharp7v11CUp","accSagittalFlat7v11CDown","accSagittalSharp5v11SUp","accSagittalFlat5v11SDown","accSagittalDoubleSharp5v11SDown","accSagittalDoubleFlat5v11SUp","accSagittalDoubleSharp7v11CDown","accSagittalDoubleFlat7v11CUp","accSagittalDoubleSharp55CDown","accSagittalDoubleFlat55CUp","accSagittalDoubleSharp17CDown","accSagittalDoubleFlat17CUp","accSagittalDoubleSharp7v11kDown","accSagittalDoubleFlat7v11kUp","accSagittal23CommaUp","accSagittal23CommaDown","accSagittal5v19CommaUp","accSagittal5v19CommaDown","accSagittal5v23SmallDiesisUp","accSagittal5v23SmallDiesisDown","accSagittalSharp5v23SDown","accSagittalFlat5v23SUp","accSagittalSharp5v19CDown","accSagittalFlat5v19CUp","accSagittalSharp23CDown","accSagittalFlat23CUp","accSagittalSharp23CUp","accSagittalFlat23CDown","accSagittalSharp5v19CUp","accSagittalFlat5v19CDown","accSagittalSharp5v23SUp","accSagittalFlat5v23SDown","accSagittalDoubleSharp5v23SDown","accSagittalDoubleFlat5v23SUp","accSagittalDoubleSharp5v19CDown","accSagittalDoubleFlat5v19CUp","accSagittalDoubleSharp23CDown","accSagittalDoubleFlat23CUp","accSagittal19SchismaUp","accSagittal19SchismaDown","accSagittal17KleismaUp","accSagittal17KleismaDown","accSagittal143CommaUp","accSagittal143CommaDown","accSagittal11v49CommaUp","accSagittal11v49CommaDown","accSagittal19CommaUp","accSagittal19CommaDown","accSagittal7v19CommaUp","accSagittal7v19CommaDown","accSagittal49SmallDiesisUp","accSagittal49SmallDiesisDown","accSagittal23SmallDiesisUp","accSagittal23SmallDiesisDown","accSagittal5v13MediumDiesisUp","accSagittal5v13MediumDiesisDown","accSagittal11v19MediumDiesisUp","accSagittal11v19MediumDiesisDown","accSagittal49MediumDiesisUp","accSagittal49MediumDiesisDown","accSagittal5v49MediumDiesisUp","accSagittal5v49MediumDiesisDown","accSagittal49LargeDiesisUp","accSagittal49LargeDiesisDown","accSagittal11v19LargeDiesisUp","accSagittal11v19LargeDiesisDown","accSagittal5v13LargeDiesisUp","accSagittal5v13LargeDiesisDown","accSagittalSharp23SDown","accSagittalFlat23SUp","accSagittalSharp49SDown","accSagittalFlat49SUp","accSagittalSharp7v19CDown","accSagittalFlat7v19CUp","accSagittalSharp19CDown","accSagittalFlat19CUp","accSagittalSharp11v49CDown","accSagittalFlat11v49CUp","accSagittalSharp143CDown","accSagittalFlat143CUp","accSagittalSharp17kDown","accSagittalFlat17kUp","accSagittalSharp19sDown","accSagittalFlat19sUp","accSagittalSharp19sUp","accSagittalFlat19sDown","accSagittalSharp17kUp","accSagittalFlat17kDown","accSagittalSharp143CUp","accSagittalFlat143CDown","accSagittalSharp11v49CUp","accSagittalFlat11v49CDown","accSagittalSharp19CUp","accSagittalFlat19CDown","accSagittalSharp7v19CUp","accSagittalFlat7v19CDown","accSagittalSharp49SUp","accSagittalFlat49SDown","accSagittalSharp23SUp","accSagittalFlat23SDown","accSagittalSharp5v13MUp","accSagittalFlat5v13MDown","accSagittalSharp11v19MUp","accSagittalFlat11v19MDown","accSagittalSharp49MUp","accSagittalFlat49MDown","accSagittalSharp5v49MUp","accSagittalFlat5v49MDown","accSagittalSharp49LUp","accSagittalFlat49LDown","accSagittalSharp11v19LUp","accSagittalFlat11v19LDown","accSagittalSharp5v13LUp","accSagittalFlat5v13LDown","accSagittalDoubleSharp23SDown","accSagittalDoubleFlat23SUp","accSagittalDoubleSharp49SDown","accSagittalDoubleFlat49SUp","accSagittalDoubleSharp7v19CDown","accSagittalDoubleFlat7v19CUp","accSagittalDoubleSharp19CDown","accSagittalDoubleFlat19CUp","accSagittalDoubleSharp11v49CDown","accSagittalDoubleFlat11v49CUp","accSagittalDoubleSharp143CDown","accSagittalDoubleFlat143CUp","accSagittalDoubleSharp17kDown","accSagittalDoubleFlat17kUp","accSagittalDoubleSharp19sDown","accSagittalDoubleFlat19sUp","accSagittalShaftUp","accSagittalShaftDown","accSagittalAcute","accSagittalGrave","accSagittal1MinaUp","accSagittal1MinaDown","accSagittal2MinasUp","accSagittal2MinasDown","accSagittal1TinaUp","accSagittal1TinaDown","accSagittal2TinasUp","accSagittal2TinasDown","accSagittal3TinasUp","accSagittal3TinasDown","accSagittal4TinasUp","accSagittal4TinasDown","accSagittal5TinasUp","accSagittal5TinasDown","accSagittal6TinasUp","accSagittal6TinasDown","accSagittal7TinasUp","accSagittal7TinasDown","accSagittal8TinasUp","accSagittal8TinasDown","accSagittal9TinasUp","accSagittal9TinasDown","accSagittalFractionalTinaUp","accSagittalFractionalTinaDown","accidentalNarrowReversedFlat","accidentalNarrowReversedFlatAndFlat","accidentalWilsonPlus","accidentalWilsonMinus","articulations","between_lines","av","aboveCode","belowCode","ao","ah","am","ornaments","mordent","mordent_inverted","turn","turn_inverted","tr","upprall","downprall","prallup","pralldown","upmordent","downmordent","lineprall","prallprall","scoop","doit","fall","doitLong","fallLong","bend","plungerClosed","plungerOpen","flip","jazzTurn","smear","Tables","clef","keyOctaveGlyph","params","octave_shift","pieces","toUpperCase","clefProperties","stroke","int_value","customNoteHeadProps","glyphName","displaced","integer","fret","shift_y","glyphMetrics","TABLATURE_FONT_SCALE","textWidth","artic","spec","keySpec","notes","acc_list","duration","durationNumber","sanitizeDuration","durationToFraction","ticks","durationCodes","glyphTypeProperties","customGlyphTypeProperties","code_head","common","NOTATION_FONT_SCALE","STEM_WIDTH","STEM_HEIGHT","STAVE_LINE_THICKNESS","SLASH_NOTEHEAD_WIDTH","STAVE_LINE_DISTANCE","TEXT_HEIGHT_OFFSET_HACK","accidentalMap","accidentalColumnsTable","second_on_bottom","spaced_out_tetrachord","spaced_out_pentachord","very_spaced_out_pentachord","spaced_out_hexachord","very_spaced_out_hexachord","unicode","sharp","String","fromCharCode","flat","natural","triangle","degrees","circle","validTypes","r","TIME4_4","num_beats","beat_value","stem","stem_offset","flag","dot_shiftY","line_above","line_below","beam_count","stem_beam_extension","code_flag_upstem","code_flag_downstem","L","Accidental","DEBUG","render_options","font_scale","parenLeftPadding","parenRightPadding","accidentalCodes","cautionary","state","musicFont","currentMusicFont","noteheadAccidentalPadding","leftShift","left_shift","accidentalSpacing","additionalPadding","accList","prevNote","shiftL","props","getKeyProps","getLeftDisplacedHeadPx","lineSpace","getSpacingBetweenLines","getYForLine","accLine","round","sort","lineList","previousLine","accShift","flatLine","dblSharpLine","numAcc","column","totalColumns","noFurtherConflicts","groupStart","groupEnd","checkCollision","getGroupLine","getGroupLines","indexes","lineDifference","indexA","indexB","item","notColliding","indexPairs","every","line1","line2","groupLength","groupMember","endCase","patternLength","collisionDetected","columnWidths","columnXOffsets","totalShift","accCount","lastAccOnLine","clearance","clearanceRequired","collision","voices","tickPositions","tickNoteMap","voice","tickPosition","getTickables","shouldIgnoreTicks","notesAtPosition","getTicks","music","scaleMapKey","tickPos","tickables","modifiedPitches","processNote","isRest","staveNote","keyIndex","accidentalString","pitch","sameAccidental","previouslyModified","indexOf","getModifiers","modifier","splice","addModifier","GraceNoteGroup","getGraceNotes","fontScale","parenLeft","parenRight","parenWidth","setAsCautionary","start","getModifierStartXY","accX","accY","Stem","stem_up_y_offset","stem_down_y_offset","stem_up_y_base_offset","stem_down_y_base_offset","x_begin","x_end","y_top","y_bottom","stem_extension","stem_direction","hide","isStemlet","stemletHeight","renderHeightAdjustment","UP","DOWN","WIDTH","HEIGHT","setNoteHeadXBounds","setDirection","setExtension","ext","getExtension","setYBounds","getHeight","y_offset","getExtents","isStemUp","ys","stemHeight","innerMostNoteheadY","min","outerMostNoteheadY","topY","baseY","setVisibility","isVisible","setStemlet","adjustHeightForFlag","adjustHeightForBeam","stem_x","stem_y","y_base_offset","stemletYOffset","TextFormatter","textWidthCache","formatterInfo","serifs","monospaced","italic","bold","superscriptOffset","subscriptOffset","maxSizeGlyph","cacheKey","updateParams","registeredFonts","requestedFont","candidates","requestedFamilies","requestedFamily","startsWith","formatter","values","isBold","isItalic","perfectMatch","find","partialMatch","fontSizeInPt","overwrite","updateCacheKey","BOLD","getGlyphMetrics","character","maxHeight","getWidthForCharacterInEm","advanceWidth","getWidthForTextInEm","cachedWidths","getWidthForTextInPx","AnnotationHorizontalJustify","AnnotationVerticalJustify","Annotation","horizontalJustification","verticalJustification","TOP","annotations","annotation","textFormatter","create","verticalSpaceNeeded","stemDirection","hasStem","getStemDirection","lines","draw_stem","getStem","getNoteType","getNumLines","VerticalJustify","noteLine","getLineNumber","leastString","top_text_line","BOTTOM","greatestString","curBottom","right_shift","setVerticalJustification","just","VerticalJustifyString","getJustification","setJustification","HorizontalJustifyString","classString","openGroup","text_width","measureText","text_height","getStemX","stem_ext","spacing","has_stem","checkStem","getYs","reduce","yt","getYForTopText","getYForBottomText","getTopLineTopY","extents","getStemExtents","fillText","closeGroup","HorizontalJustify","centerStem","CENTER_STEM","top","bottom","roundToNearestHalf","mathFn","isWithinLines","getRoundingFunction","ceil","isStaveOrGraceNote","Articulation","getIncrement","articulation","increment","curTop","maxWidth","articWidth","builder","articNameToCode","staccato","tenuto","accent","articString","getFactory","articulationCodes","textLine","canSitBetweenLines","staffSpace","isTab","shouldSitOutsideStaff","initialOffset","isOnStemTip","getInitialOffset","padding","stemTipY","stemBaseY","getTopY","INITIAL_OFFSET","getBottomY","offsetDirection","articLine","snappedLine","snapLineToStaff","RenderContext","setRawFont","Tickable","_preFormatted","_postFormatted","intrinsicTicks","tickMultiplier","modifiers","tupletStack","align_center","center_x_shift","ignore_ticks","formatterMetrics","freedom","iterations","space","used","mean","deviation","setIgnoreTicks","checkTickContext","getFormatterMetrics","getCenterXShift","isCenterAligned","setCenterXShift","centerXShift","setCenterAlignment","getVoice","setVoice","getTuplet","tuplet","getTupletStack","resetTuplet","noteCount","notesOccupied","getNoteCount","getNotesOccupied","applyTickMultiplier","pop","setTuplet","addToModifierContext","mc","addMember","setTickContext","tc","preFormat","preFormatted","postFormat","postFormatted","getIntrinsicTicks","setIntrinsicTicks","getTickMultiplier","setDuration","getAbsoluteX","noteStruct","parsedNoteStruct","parseNoteStruct","JSON","stringify","keyProps","noteType","customTypes","duration_override","getGlyphProps","customGlyphs","playNote","leftDisplacedHeadPx","rightDisplacedHeadPx","annotation_spacing","glyph_font_scale","stroke_px","xStart","xPre1","xAbs","xPost1","notePx","xPost2","xEnd","xFreedomRight","xWidth","color","yy","arc","closePath","drawDot","spaceDeviation","durationString","dots","durationProps","parseDuration","durationToTicks","currentTicks","getPlayNote","setPlayNote","addStroke","setYs","getRightDisplacedHeadPx","setLeftDisplacedHeadPx","setRightDisplacedHeadPx","isTopNote","getLineForRest","getGlyph","getGlyphWidth","getDuration","isDotted","getModifiersByType","getBeam","beam","checkBeam","hasBeam","setBeam","signature","getMembers","getRightParenthesisPx","getLeftParenthesisPx","getFirstDotPx","getState","glyphWidth","glyphPx","getNoteStartX","getTieRightX","tieStartX","getTieLeftX","tieEndX","getKeys","StaveModifierPosition","BarlineType","ChordSymbolHorizontalJustify","ChordSymbolVerticalJustify","SymbolTypes","SymbolModifiers","VoiceMode","StaveModifier","placeGlyphOnLine","customShift","getPadding","setPadding","setLayoutMetrics","layoutMetrics","getLayoutMetrics","thickness","TYPE","widths","SINGLE","DOUBLE","END","REPEAT_BEGIN","REPEAT_END","REPEAT_BOTH","NONE","paddings","layoutMetricsMap","xMin","xMax","paddingLeft","paddingRight","BEGIN","setType","typeString","single","double","end","repeatBegin","repeatEnd","repeatBoth","none","getType","drawVerticalBar","drawVerticalEndBar","drawRepeatBar","double_bar","staveCtx","botY","getBottomLineBottomY","fillRect","begin","dot_x","dot_radius","dot_y","BarNote","barline","Bend","release","phrase","tap","line_width","line_style","bend_width","release_width","updateWidth","bends","last_width","stringPos","setTap","getText","getTextHeight","totalWidth","additional_width","draw_width","lowestY","bend_height","annotation_y","renderBend","cp_x","cp_y","renderRelease","renderArrowHead","yBase","renderText","render_x","last_bend","last_bend_draw_width","last_drawn_width","ChordSymbol","symbolBlocks","horizontal","vertical","useKerning","reportWidth","superSubRatio","global","NO_TEXT_FORMAT","val","noFormat","glyphCode","engravingFontResolution","spacingBetweenBlocks","metric","getMetricForGlyph","yOffset","leftSideBearing","kerningOffset","chordSymbol","lowerKerningText","upperKerningText","symbolModifier","SUPERSCRIPT","SUBSCRIPT","symbols","nonSuperWidth","reportedWidths","symbol","fontAdj","scaleSize","glyphAdj","lineSpaces","vAlign","j","sup","isSuperscript","sub","isSubscript","superSubScale","adj","symbolType","GLYPH","superSubFontSize","getWidthForGlyph","getYShiftForGlyph","getXShiftForGlyph","TEXT","getYOffsetForText","over","prev","setEnableKerning","updateKerningAdjustments","updateOverBarAdjustments","getVertical","getReportWidth","setReportWidth","barIndex","findIndex","xoff","yoff","symIndex","accum","getKerningAdjustment","currSymbol","prevSymbol","adjustment","preKernUpper","preKernLower","some","xx","kerningOffsetPixels","getSymbolBlock","_c","symbolBlock","glyphArgs","glyphPoints","addSymbolBlock","parameters","addText","addTextSuperscript","addTextSubscript","addGlyphSuperscript","addGlyph","addGlyphOrText","char","addLine","setVertical","vj","setHorizontal","hj","getHorizontal","yMax","y_max","stem_base","isSuper","isSub","curY","smallerFontSize","diminished","dim","halfDiminished","augmented","majorSeventh","leftParen","rightParen","leftBracket","rightBracket","leftParenTall","rightParenTall","symbolTypes","symbolModifiers","Dot","radius","all","dot","setDotShiftY","dot_list","max_shift_map","note_id","dot_shift","x_width","last_line","last_note","prev_dotted_space","half_shiftY","forceFlagRight","FretHandFinger","finger","x_offset","nums","nums_list","prev_note","shiftLeft","shiftRight","pos","textHeight","shiftR","numShiftL","numShiftR","xWidthL","xWidthR","lastLine","lastNote","num_shift","numWidth","fingerings","fingeringString","number","Fingering","fingering","setFretHandFinger","getFretHandFinger","setOffsetX","setOffsetY","StaveTie","setNotes","cp1","cp2","text_shift_x","first_x_shift","last_x_shift","tie_spacing","first_note","first_indices","last_indices","isPartial","renderTie","first_ys","last_ys","last_x_px","first_x_px","first_y_px","last_y_px","top_cp_y","bottom_cp_y","center_x","getTieStartX","getTieEndX","TabTie","Voice","time","voiceTime","resolutionMultiplier","mode","STRICT","ticksUsed","largestTickWidth","softmaxFactor","totalTicks","smallestTickCount","Mode","getTotalTicks","getTicksUsed","getLargestTickWidth","getSmallestTickCount","getMode","setMode","getResolutionMultiplier","getActualResolution","tickable","setStrict","strict","SOFT","isComplete","FULL","setSoftmaxFactor","factor","reCalculateExpTicksUsed","expTicksUsed","softmax","tickValue","v","exp","addTickable","addTickables","grace_notes","show_slur","slur","slur_y_shift","beams","gracenote_groups","group_list","gracenote_group","is_stavenote","formatWidth","group_shift","Formatter","joinVoices","format","getMinTotalWidth","beamNotes","Beam","beam_width","partial_beam_length","graceNote","TieClass","NoteSubGroup","groups","group","TickContext","tickID","currentTick","maxTicks","maxTickable","minTicks","minTickable","xBase","xOffset","tickablesByVoice","totalLeftPx","totalRightPx","tContexts","tContext","contexts","getTickID","getXBase","setXBase","getXOffset","getMaxTicks","getMinTicks","getMaxTickable","getMinTickable","getTickableForVoice","voiceIndex","getTickablesByVoice","getCenterAlignedTickables","filter","getCurrentTick","setCurrentTick","tick","Ornament","delayed","accidentalLowerPadding","accidentalUpperPadding","ornament","ornamentCodes","adjustForStemDirection","reportedWidth","stemUpYOffset","ornamentAlignWithNoteHead","ornamentNoteTransition","ornamentRelease","ornamentAttack","ornamentArticulation","jazzOrnaments","setDelayed","setUpperAccidental","accid","accidentalUpper","setLowerAccidental","accidentalLower","stemDir","stemExtents","isPlacedOnNoteheadSide","lineSpacing","glyphYBetweenLines","glyphX","glyphY","delayXShift","startX","nextContext","getNextContext","Parenthesis","parentheses","x_widthL","x_widthR","parenthesis","renderGlyph","NoteHead","custom_glyph","stem_up_x_offset","stem_down_x_offset","note_type","glyph_code","custom_glyph_code","slashed","isDisplaced","getLine","setLine","displacementStemAdjustment","fontShift","displacedFontShift","half_spacing","min_y","getYForNote","head_x","categorySuffix","staveSpace","durationToNumber","breve_lines","drawSlashNoteHead","setStem","buildStem","buildFlag","hasFlag","flagCode","getBaseCustomNoteHeadGlyph","getStemLength","getStemExtension","getBeamCount","getStemMinimumLength","setStemDirection","offsets","offsetYBaseStemUp","offsetYTopStemUp","offsetYBaseStemDown","offsetYTopStemDown","getCenterGlyphX","stem_extension_override","setStemLength","drawStem","stemOptions","shiftRestVertical","dir","delta","maxLine","minLine","setKeyLine","getKeyLine","ledgerLineStyle","use_default_head_x","_noteHeads","LEDGER_LINE_OFFSET","calculateKeyProps","auto_stem","autoStem","STEM_UP","STEM_DOWN","minNoteheadPadding","notesList","minL","stemMax","stemMin","maxL","isrest","voice_shift","getVoiceShiftWidth","is_displaced","noteU","noteM","noteL","voiceXShift","centerRest","noteHeadStyles","noteHead","buildNoteHeads","noteHeadStyle","head","calcNoteDisplacements","lineDiff","noteProps","notehead","calculateOptimalStemDirection","keyProperties","minY","maxY","halfLineSpacing","frac","resultLine","thisLine","isChord","getNoteHeadBounds","setNoteDisplaced","getRightShift","restLine","isInnerNoteIndex","setStemStyle","getStemStyle","setLedgerLineStyle","getLedgerLineStyle","setFlagStyle","flagStyle","getFlagStyle","setKeyStyle","noteHeadPadding","shouldDrawFlag","nonDisplacedX","displacedX","highestDisplacedLine","lowestDisplacedLine","yTop","Infinity","yBottom","highestLine","lowestLine","highestNonDisplacedLine","lowestNonDisplacedLine","displaced_x","non_displaced_x","highest_line","lowest_line","highest_displaced_line","lowest_displaced_line","highest_non_displaced_line","lowest_non_displaced_line","getNoteHeadBeginX","getNoteHeadEndX","noteHeads","note_heads","drawLedgerLines","doubleWidth","min_x","drawLedgerLine","normal","ledgerWidth","getDefaultLedgerLineStyle","drawModifiers","noteheadStyle","hasNoBeam","drawFlag","noteStemHeight","flagX","extension","flagY","pointerBBox","drawNoteHeads","super_stem_extension","mid_line_distance","lines_over_octave_from_mid_line","spacing_between_lines","xBegin","shouldRenderStem","stemX","isHTMLCanvas","element","HTMLCanvasElement","toDataURL","CanvasContext","context2D","canvas","CANVAS_BROWSER_SIZE_LIMIT","limit","clearRect","cls","child","setBackgroundFillStyle","blur","getTransform","setLineCap","capType","lineCap","setLineDash","dash","resize","devicePixelRatio","sanitizeCanvasDims","rect","cp1x","cp1y","cp2x","cp2y","cpx","cpy","startAngle","endAngle","counterclockwise","fontBoundingBoxAscent","fontBoundingBoxDescent","actualBoundingBoxAscent","actualBoundingBoxDescent","ATTRIBUTES_TO_IGNORE","path","SVG_NS","TWO_PI","SVGContext","backgroundFillStyle","fontCSSString","svg","appendChild","parent","pen","defaultFontAttributes","attributes","shadow_attributes","state_stack","svgElementType","createElementNS","lineDash","applyAttributes","visibleWidth","visibleHeight","setViewBox","viewBox_or_minX","viewBoxString","attrNamesToIgnore","nodeName","attrName","setAttributeNS","lastChild","removeChild","rectangle","x0","cos","y0","sin","large","sweep","getShadowStyle","sa","measureTextCache","txt","textContent","savedState","fontAttributes","RendererBackends","RendererLineEndType","Justification","VoltaType","measureImpl","getBBox","Renderer","arg0","arg1","backend","maybeElement","Backends","CANVAS","SVG","HTMLDivElement","isHTMLDiv","elementId","background","renderer","lastContext","buildContext","fromX","fromY","toX","toY","dashPattern","dx","dy","angle","atan2","idx","dashLength","nx","ny","LineEndType","StringNumber","string_number","dashed","leg","stringNumber","shift_left","glyphLine","num_shiftR","num_width","setLineEndType","setStringNumber","setLastNote","setDashed","stemPadding","verticalPadding","leftPadding","rightPadding","len","pattern","drawDashedLine","Stroke","all_voices","strokes","strokeList","string","getPositions","strokeShift","addEndNote","note_end","line_space","arrow","arrow_shift_x","arrow_y","text_y","Type","BRUSH_DOWN","BRUSH_UP","ROLL_DOWN","RASQUEDO_DOWN","ROLL_UP","RASQUEDO_UP","ARPEGGIO_DIRECTIONLESS","strokeLine","Vibrato","harsh","vibrato_width","wave_height","wave_width","wave_girth","setVibratoWidth","vibratos","vibrato","setHarsh","vx","vy","renderVibrato","opts","num_waves","ModifierContext","members","formatted","member","getLeftShift","Clef","types","tab","attachment","numLines","shiftY","KeySignature","cancelKeySpec","alterKeySpec","setKeySig","glyphFontScale","xPositions","paddingForced","convertToGlyph","nextAcc","accGlyphData","extraWidth","xPosition","cancelKey","convertToCancelAccList","cancel_accList","different_types","naturals","cancelled","concat","addToStave","convertAccLines","customLines","offset","alterKey","convertToAlterAccList","firstAccidentalType","cancelAccList","getEndClef","getClef","Repetition","symbol_type","setShiftX","setShiftY","CODA_RIGHT","drawCodaFixed","CODA_LEFT","drawSymbolText","SEGNO_LEFT","drawSignoFixed","SEGNO_RIGHT","DC","DC_AL_CODA","DC_AL_FINE","DS","DS_AL_CODA","DS_AL_FINE","FINE","TO_CODA","draw_coda","text_x","symbol_x","modifierWidth","getVerticalBarWidth","StaveSection","section","shift_x","setStaveSection","textMeasurements","StaveTempo","tempo","setTempo","bpm","stem_height","TextNote","superscript","subscript","smooth","justification","struct","GLYPHS","segno","mordent_upper","mordent_lower","p","z","coda","pedal_open","pedal_close","caesura_straight","caesura_curved","breath","StaveText","setStaveText","setText","getBottomLineY","Volta","volta","top_y","vert_height","BEGIN_END","TimeSignatureGlyph","timeSignature","topDigits","botDigits","topWidth","timeSigType","topGlyph","botWidth","botGlyph","topStartX","botStartX","start_x","topLine","bottomLine","TimeSignature","timeSpec","customPadding","validate_args","fontLineShift","parseTimeSpec","numbers","test","assertIsValidTimeSig","makeTimeSignatureGlyph","getInfo","setTimeSig","SORT_ORDER_BEG_MODIFIERS","SORT_ORDER_END_MODIFIERS","Stave","end_x","measure","endClef","vertical_bar_width","num_lines","fill_style","left_bar","right_bar","spacing_between_lines_px","space_above_staff_ln","space_below_staff_ln","top_text_position","bottom_text_position","line_config","bounds","defaultLedgerLineStyle","resetLines","addEndModifier","defaultPadding","setDefaultLedgerLineStyle","visible","setNoteStartX","begBarline","getNoteEndX","setNumLines","mod","setMeasure","getModifierXShift","setRepetitionType","setVoltaType","number_t","setSection","staveSection","headroom","getLineForY","setBegBarType","setEndBarType","setClef","clefSpec","addClef","setEndClef","setKeySignature","addKeySignature","setEndKeySignature","setTimeSignature","timeSignatures","addTimeSignature","setEndTimeSignature","addEndClef","addEndTimeSignature","addTrebleGlyph","noPosition","noCategory","sortByCategory","items","order","temp","endBarline","begModifiers","endModifiers","lastBarlineIdx","getConfigForLines","setConfigForLine","line_number","setConfigForLines","lines_configuration","drawBoldDoubleLine","topX","StaveConnector","BOLD_DOUBLE_LEFT","BOLD_DOUBLE_RIGHT","variableWidth","top_stave","bottom_stave","texts","SINGLE_RIGHT","content","THIN_DOUBLE","attachment_height","SINGLE_LEFT","BRACE","x3","y3","cpx1","cpy1","cpx2","cpy2","cpx3","cpy3","cpx4","cpy4","cpx5","cpy5","cpx6","cpy6","cpx7","cpy7","cpx8","cpy8","BRACKET","singleRight","singleLeft","brace","bracket","boldDoubleLeft","boldDoubleRight","thinDouble","sumArray","arr","createContexts","makeContext","addToContext","tickToContextMap","tickList","integerTicks","newContext","array","list","getRestLineForNextNoteGroup","currRestLine","currNoteIndex","nextRestLine","noteIndex","formatterOptions","globalSoftmax","maxIterations","justifyWidth","totalCost","durationStats","minTotalWidth","hasMinTotalWidth","tickContexts","modifierContexts","contextGaps","total","gaps","lossHistory","paddingBetween","accumulator","stavePadding","gap","toFixed","auto_beam","align_rests","applyAndGetBeams","formatToStave","tabstave","tabnotes","autobeam","notevoice","tabvoice","alignAllNotes","alignTuplets","currTickable","prevTickable","alignRests","AlignRestsToNotes","preCalculateMinTotalWidth","unalignedPadding","unalignedCtxCount","wsum","dsum","createTickContexts","contextList","contextMap","wavg","wvar","ll","wpads","davg","dvar","dpads","padmax","unalignedPad","createModifierContexts","contextArray","renderingContext","voicesParam","evaluate","firstContext","calculateIdealDistances","adjustedJustifyWidth","backTickable","prevContext","backVoices","matchingVoices","maxNegativeShiftPx","expectedDistance","thisTickable","insideLeftEdge","backMetrics","insideRightEdge","fromTickable","fromTickablePx","shiftToIdealDistances","idealDistances","centerX","spaceAccum","contextX","ideal","errorPx","negativeShiftPx","configMinPadding","configMaxPadding","targetWidth","distances","actualWidth","minDistance","mdCalc","di","calcMinDistance","paddingMax","maxX","prevTick","prevMetrics","currMetrics","leftNoteEdge","rightNote","rightMetrics","stats","count","updateStats","totalDeviation","tune","alpha","current","cost","postFormatContexts","optionsParam","TupletLocation","Tuplet","numerator_glyphs","denom_glyphs","num_notes","beats_occupied","beatsOccupiedDeprecationWarning","notes_occupied","bracketed","ratioed","setTupletLocation","location","LOCATION_TOP","resolveGlyphs","attach","LOCATION_BOTTOM","NESTING_OFFSET","detach","setBracketed","setRatioed","getNotes","getBeatsOccupied","setBeatsOccupied","beats","setNotesOccupied","unshift","getNestedTupletCount","maxTupletCount","countTuplets","minTupletCount","tupletCount","getYPosition","nested_tuplet_y_offset","topModifierOffset","modLines","modY","noteHeadOffset","stemOffset","lineCheck","nn","bottom_y","addGlyphWidth","notation_start_x","colon_x","colon_radius","calculateStemDirection","lineSum","keyProp","BEAM_LEFT","BEAM_BOTH","slope","stem_weight","memo","break_on_indices","max_slope","min_slope","slope_iterations","slope_cost","show_stemlets","stemlet_extension","flat_beams","min_flat_beam_offset","time_sig","beatTotal","beatValue","generateBeams","config","tickGroups","unprocessedNotes","currentTickGroup","noteGroups","currentGroup","nextTickGroup","nextGroup","currentGroupTotalTicks","unprocessedNote","ticksPerGroup","vf_notes","unbeamable","createGroups","sanitizedGroups","tempGroup","isFirstOrLast","breaksOnEachRest","beam_rests","breaksOnFirstOrLastRest","beam_middle_only","breakOnStemChange","maintain_stem_directions","prevDirection","isUnbeamableDuration","sanitizeGroups","findFirstNote","applyStemDirection","beamedNoteGroups","beamable","allTuplets","uniqueTuplets","noteTuplet","getTuplets","secondary_breaks","secondary_break_ticks","flat_beam_offset","beamCount","breakSecondaryAt","indices","getSlopeY","calculateSlope","firstNote","initialSlope","firstStemTipY","firstStemX","getStemSlope","minCost","MAX_VALUE","bestSlope","totalStemExtension","yShiftTemp","adjustedStemTipY","diff","idealSlope","calculateFlatSlope","extremeY","extremeBeamCount","currentExtreme","extremeTest","newOffset","getBeamYToDraw","beamY","applyStemExtensions","beamedStemTipY","preBeamExtension","beamExtension","totalBeamWidth","lookupBeamDirection","prev_tick","next_tick","lookup_duration","prev_note_gets_beam","next_note_gets_beam","note_gets_beam","getBeamLines","tick_of_duration","beam_started","beam_lines","current_beam","previous_should_break","tick_tally","should_break","next_note","beam_alone","beam_direction","last_beam","drawStems","drawBeamLines","valid_beam_durations","beamThickness","beamLines","beam_line","startBeamX","startBeamY","lastBeamX","lastBeamY","ClefNote","clef_obj","abs_x","Crescendo","extend_left","extend_right","decrescendo","setHeight","setDecrescendo","decresc","tick_context","next_context","begin_x","half_height","reverse","renderHairpin","CurvePosition","Curve","from","to","NEAR_HEAD","position_end","invert","cps","nearHead","nearTop","NEAR_TOP","renderCurve","first_x","first_y","last_x","last_y","cp0x","cp0y","cp_spacing","end_metric","Parser","flattenMatches","matchedString","results","grammar","errorPos","expect","matchFail","returnPos","matchSuccess","matchToken","token","noSpace","regexp","RegExp","success","incrementPos","expectOne","rule","maybe","allMatches","oneMatch","localPos","or","gotOne","numMatches","expectOneOrMore","more","expectZeroOrMore","ruleFunc","bind","oneOrMore","zeroOrMore","matches","run","EasyScore","EasyScoreGrammar","PIECE","PIECES","EOL","CHORDORNOTE","PARAMS","commitPiece","COMMA","DURATION","DOTS","OPTS","CHORD","SINGLENOTE","LPAREN","NOTES","RPAREN","addChord","NOTE","NOTENAME","ACCIDENTAL","OCTAVE","addSingleNote","MICROTONES","ACCIDENTALS","DOT","setNoteDots","SLASH","MAYBESLASH","TYPES","setNoteType","DURATIONS","setNoteDuration","LBRACKET","KEYVAL","KEYVALS","RBRACKET","KEY","EQUALS","VAL","addNoteOption","SVAL","DVAL","Piece","chord","Builder","commitHooks","elements","rollingDuration","resetPiece","getElements","addCommitHook","commitHook","piece","addNote","standardAccidentals","notePiece","GhostNote","buildAndAttach","setId","commaSeparatedRegex","setClass","defaults","easyScoreHook","throwOnError","parser","ERROR_MSG","parameter","GlyphNote","ignoreTicks","setGlyph","SCALE","slash","ret","staveNoteScale","getStaveNoteScale","offsetScale","slashBBox","calcBeamedNotesSlashBBox","noteHeadBounds","defaultOffsetY","slashStemOffset","slashBeamOffset","protrusions","beam_slope","scaleX","beam_angle","atan","iPointOnBeam","slash_angle","protrusion_stem_dx","protrusion_stem_dy","protrusion_beam_dx","protrusion_beam_dy","stem0X","stemY","KeySigNote","semibreve_rest","MultiMeasureRest","number_of_measures","xs","hasPaddingLeft","hasPaddingRight","hasLineThickness","hasSymbolSpacing","padding_left","padding_right","line_thickness","symbol_spacing","use_symbols","show_number","number_line","number_glyph_point","serif_thickness","semibreve_rest_glyph_scale","getXs","drawLine","spacingBetweenLines","lineThicknessHalf","serifThickness","bot","leftIndented","rightIndented","lineTop","lineBottom","drawSymbols","n4","n2","n1","get_semibreve_rest","rest_scale","rest_width","yMiddle","timeSig","drawPedalGlyph","glyph_data","PedalMarking","custom_depress_text","custom_release_text","bracket_height","text_margin_right","bracket_line_width","pedal","MIXED","setCustomText","depress","drawBracketed","prev_x","prev_y","is_pedal_depressed","next_is_same","prev_is_same","drawText","pedal_depress","pedal_release","mixed","CODES","RepeatNote","drawArrowHead","StaveLine","line_dash","rounded_end","draw_start_arrow","draw_end_arrow","arrowhead_length","arrowhead_angle","text_position_vertical","TextVerticalPosition","text_justification","TextJustification","applyLineStyle","applyFontStyle","drawArrowLine","pt1","pt2","both_arrows","distance","ratio","end_y","start_y","line_angle","angle1","angle2","top_x","bottom_x","start_position","end_position","first_index","last_index","upwards_slope","notehead_width","vertical_position","System","spaceBetweenStaves","autoWidth","noJustification","debugFormatter","formatIterations","noPadding","details","formatOptions","addConnector","connector","addStave","staveOptions","spaceAbove","spaceBelow","debugNoteMetrics","options_details","allVoices","debugNoteMetricsYs","part","lastY","plotDebugging","plotMetrics","positions","ghost","draw_dots","draw_stem_through_stave","setGhost","tabToGlyph","getStemY","stemDownLine","stemStartLine","flag_x","flag_y","flag_code","drawStemThrough","stemThrough","stemLines","unused_strings","up_stem","down_stem","line_spacing","total_lines","stem_lines","strings","containsLastString","containsFirstString","line_ys","isTopBound","isBottomBound","getPartialStemLines","strings_used","stem_through","getUnusedStringGroups","drawPositions","tab_x","render_stem","TabStave","addTabGlyph","TextBracket","TextBracketPosition","stop","show_bracket","underline_superscript","Positions","PositionsString","main_measure","main_width","main_height","super_y","super_measure","super_width","super_height","line_y","TextDynamics","sequence","glyph_font_size","total_width","letter","letter_x","current_letter","TimeSigNote","timeSigInfo","VibratoBracket","bracket_data","stop_x","Factory","renderQ","systems","staves","initRenderer","getVoices","ghostNote","textNote","barNote","clefNote","timeSigNote","keySigNote","hJustify","vJustify","kerning","numMeasures","multiMeasureRest","secondaryBeamBreaks","curve","tie","vibratoBracket","textBracket","system","StaveHairpin","hairpin","left_shift_px","right_shift_px","right_shift_ticks","left_shift_ticks","ppt","pixelsPerTick","l_shift_px","r_shift_px","hairpin_options","setRenderOptions","dis","staff_height","l_shift","r_shift","CRESC","DECRESC","TabSlide","first_fret","last_fret","SLIDE_UP","SLIDE_DOWN","slide_y","Tuning","tuningString","tuningValues","setTuning","names","standard","dagdad","dropd","standardBanjo","noteToInteger","getValueForString","stringNum","getValueForFret","fretNum","stringValue","getNoteForFret","integerToNote","Flow","BUILD","VERSION","DATE","fontNames","fontModuleOrPath","hasKeySignature","getKeySignatures","GraceTabNote","KeyManager","setKey","getKey","scaleMapByValue","originalScaleMapByValue","getAccidental","selectNote","scaleNote","modparts","change","valueNote","originalValueNote","Tremolo","y_spacing_scale","extra_stroke_scale","y_spacing","cmp","eq","newArr","last","canvasSelector","start_time","Date","getTime","CustomFont","noteheadSquareWhite","noteheadSquareBlack","accidentalBuyukMucennebFlat","accidentalBakiyeFlat","accidentalKucukMucennebSharp","accidentalKoron","accidentalSori","vexAccidentalMicrotonal2","vexAccidentalMicrotonal3","vexAccidentalMicrotonal4","vexNoteHeadRectBlack","vexNoteHeadRectWhite","CustomMetrics","smufl","GonvilleFont","bracketTop","bracketBottom","barlineTick","breathMarkTick","gClef","cClef","fClef","unpitchedPercussionClef1","timeSig0","timeSig1","timeSig2","timeSig3","timeSig4","timeSig5","timeSig6","timeSig7","timeSig8","timeSig9","timeSigCommon","timeSigCutCommon","timeSigPlus","timeSigPlusSmall","timeSigMinus","timeSigParensRight","timeSigParensRightSmall","timeSigParensLeft","timeSigParensLeftSmall","noteheadDoubleWhole","noteheadWhole","noteheadHalf","noteheadBlack","noteheadXWhole","noteheadXHalf","noteheadXBlack","noteheadCircleX","noteheadTriangleUpWhole","noteheadTriangleUpHalf","noteheadTriangleUpBlack","noteheadDiamondWhole","noteheadDiamondHalf","noteheadDiamondBlack","augmentationDot","tremolo1","flag8thUp","flag8thDown","flag16thUp","flag16thDown","flag32ndUp","flag32ndDown","flag64thUp","flag64thDown","flag128thUp","flag128thDown","accidentalFlat","accidentalNatural","accidentalSharp","accidentalDoubleSharp","accidentalDoubleFlat","accidentalParensLeft","accidentalParensRight","accidentalQuarterToneFlatStein","accidentalThreeQuarterTonesFlatZimmermann","accidentalQuarterToneSharpStein","accidentalThreeQuarterTonesSharpStein","accidentalKomaSharp","articAccentAbove","articAccentBelow","articTenutoAbove","articTenutoBelow","articStaccatoAbove","articStaccatoBelow","articStaccatissimoAbove","articStaccatissimoBelow","articMarcatoAbove","articMarcatoBelow","fermataAbove","fermataBelow","breathMarkComma","breathMarkUpbow","caesura","caesuraCurved","restMaxima","restDoubleWhole","restWhole","restHalf","restQuarter","rest8th","rest16th","rest32nd","rest64th","rest128th","dynamicPiano","dynamicMezzo","dynamicForte","dynamicRinforzando","dynamicSforzando","dynamicZ","ornamentTrill","ornamentTurn","ornamentTurnSlash","ornamentMordent","ornamentShortTrill","ornamentTremblement","ornamentPrecompAppoggTrill","ornamentPrecompSlideTrillDAnglebert","ornamentPrecompSlideTrillBach","ornamentPrecompTrillSuffixDandrieu","ornamentPrecompDoubleCadenceUpperPrefix","ornamentPrecompDoubleCadenceUpperPrefixTurn","ornamentPrecompTrillLowerSuffix","stringsDownBow","stringsUpBow","stringsHarmonic","pluckedSnapPizzicatoAbove","pluckedSnapPizzicatoBelow","pluckedLeftHandPizzicato","keyboardPedalPed","keyboardPedalUp","pictChokeCymbal","wiggleArpeggiatoUp","arrowheadBlackUp","arrowheadBlackDown","vexAccidentalMicrotonal1","vexWiggleArpeggioUp","vexNoteHeadMutedBreve","cssFontWeight","ascender","underlinePosition","cssFontStyle","yMin","original_font_information","postscript_name","version_string","vendor_url","full_font_name","font_family_name","copyright","description","trademark","designer","designer_url","unique_font_identifier","license_url","license_description","manufacturer_name","font_sub_family_name","descender","lineHeight","underlineThickness","GonvilleMetrics","endPaddingMax","endPaddingMin","unalignedNotePadding","default","small","smuflCode","shiftX","lineCount","gracenote","pedalMarking","up","down","digits","tupletPoint","tremolo","offsetYStemUp","offsetYStemDown","offsetXStemUp","offsetXStemDown","grace","staveRepetition","offsetY","offsetSymbol","heightAdjustmentForFlag","minPadding","custom","noteheadDiamondWholeStemUp","noteheadCircleXStemUp","noteheadXWholeStemUp","noteheadTriangleUpWholeStemUp","csymDiminished","csymHalfDiminished","csymAugmented","csymParensLeftTall","csymParensRightTall","csymBracketLeftTall","csymBracketRightTall","csymParensLeftVeryTall","csymParensRightVeryTall","csymDiagonalArrangementSlash","csymMinor","csymMajorSeventh","brassScoop","brassDoitMedium","brassFallLipShort","brassLiftMedium","brassFallRoughMedium","brassBend","brassMuteClosed","brassMuteOpen","brassFlip","brassJazzTurn","brassSmear","PetalumaScriptFont","y_min","$","I","J","K","N","O","Q","U","V","Y","Z","_","l","generatedOn","RobotoSlabFont","setMusicFont","fontData","registerInfo","loadTextFonts"],"sourceRoot":""} \ No newline at end of file diff --git a/build/cjs/vexflow-petaluma.js b/build/cjs/vexflow-petaluma.js new file mode 100644 index 0000000000..981da68e38 --- /dev/null +++ b/build/cjs/vexflow-petaluma.js @@ -0,0 +1,7 @@ +/*! + * VexFlow 4.0.1-alpha.2 2022-02-02T09:30:30.784Z 0df10df6d1fab3a99f5aa306341a31c6e686d659 + * Copyright (c) 2010 Mohit Muthanna Cheppudira + * https://www.vexflow.com https://github.com/0xfe/vexflow + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.Vex=e():t.Vex=e()}("undefined"!=typeof window?window:"undefined"!=typeof globalThis?globalThis:this,(function(){return(()=>{"use strict";var t={d:(e,i)=>{for(var s in i)t.o(i,s)&&!t.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:i[s]})}};t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),t.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var e={};function i(t,e,i=!0){if("object"!=typeof t||null===t)return!1;let s=t.constructor;if(i){for(;null!==t;){if(s=t.constructor,"CATEGORY"in s&&s.CATEGORY===e)return!0;t=Object.getPrototypeOf(t)}return!1}return"CATEGORY"in s&&s.CATEGORY===e}t.d(e,{default:()=>Di});const s=t=>i(t,c.Barline),n=t=>i(t,c.GraceNote),a=t=>i(t,c.Note),o=t=>i(t,c.StaveNote),r=t=>i(t,c.StemmableNote),h=t=>i(t,c.TabNote);var c;!function(t){t.Accidental="Accidental",t.Annotation="Annotation",t.Articulation="Articulation",t.Barline="Barline",t.BarNote="BarNote",t.Beam="Beam",t.Bend="Bend",t.ChordSymbol="ChordSymbol",t.Clef="Clef",t.ClefNote="ClefNote",t.Crescendo="Crescendo",t.Curve="Curve",t.Dot="Dot",t.Element="Element",t.Fraction="Fraction",t.FretHandFinger="FretHandFinger",t.GhostNote="GhostNote",t.Glyph="Glyph",t.GlyphNote="GlyphNote",t.GraceNote="GraceNote",t.GraceNoteGroup="GraceNoteGroup",t.GraceTabNote="GraceTabNote",t.KeySignature="KeySignature",t.KeySigNote="KeySigNote",t.Modifier="Modifier",t.MultiMeasureRest="MultiMeasureRest",t.Note="Note",t.NoteHead="NoteHead",t.NoteSubGroup="NoteSubGroup",t.Ornament="Ornament",t.Parenthesis="Parenthesis",t.PedalMarking="PedalMarking",t.RenderContext="RenderContext",t.RepeatNote="RepeatNote",t.Repetition="Repetition",t.Stave="Stave",t.StaveConnector="StaveConnector",t.StaveHairpin="StaveHairpin",t.StaveLine="StaveLine",t.StaveModifier="StaveModifier",t.StaveNote="StaveNote",t.StaveSection="StaveSection",t.StaveTempo="StaveTempo",t.StaveText="StaveText",t.StaveTie="StaveTie",t.Stem="Stem",t.StemmableNote="StemmableNote",t.StringNumber="StringNumber",t.Stroke="Stroke",t.System="System",t.TabNote="TabNote",t.TabSlide="TabSlide",t.TabStave="TabStave",t.TabTie="TabTie",t.TextBracket="TextBracket",t.TextDynamics="TextDynamics",t.TextNote="TextNote",t.Tickable="Tickable",t.TimeSignature="TimeSignature",t.TimeSigNote="TimeSigNote",t.Tremolo="Tremolo",t.Tuplet="Tuplet",t.Vibrato="Vibrato",t.VibratoBracket="VibratoBracket",t.Voice="Voice",t.Volta="Volta"}(c||(c={}));class l extends Error{constructor(t,e=""){super("[RuntimeError] "+t+": "+e),this.code=t}}function b(){return"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==t.g?t.g:Function("return this")()}function d(t,e="undefined",i=""){if(void 0===t)throw new l(e,i);return t}function m(t,...e){if(!e)return;const i=Array.prototype.slice.call(e).join(" ");b().console.log(t+": "+i)}function g(...t){const e=t.join(" "),i=new Error;b().console.log("Warning: ",e,i.stack)}function u(t,e){let i=e+(t-e)/2;var s,n;return i%2>0&&(i=((s=10*i)%(n=5)>=n/2?parseInt(""+s/n,10)*n+n:parseInt(""+s/n,10)*n)/10),i}function p(t){return`vf-${t}`}function _(t){return(t%=2*Math.PI)<0&&(t+=2*Math.PI),t}class x{constructor(t,e){this.numerator=1,this.denominator=1,this.set(t,e)}static get CATEGORY(){return c.Fraction}static GCD(t,e){if("number"!=typeof t||Number.isNaN(t)||"number"!=typeof e||Number.isNaN(e))throw new l("BadArgument",`Invalid numbers: ${t}, ${e}`);let i;for(;0!==e;)i=e,e=t%e,t=i;return t}static LCM(t,e){return t*e/x.GCD(t,e)}static LCMM(t){return 0===t.length?0:1===t.length?t[0]:2===t.length?x.LCM(t[0],t[1]):x.LCM(t.shift(),x.LCMM(t))}set(t=1,e=1){return this.numerator=t,this.denominator=e,this}value(){return this.numerator/this.denominator}simplify(){let t=this.numerator,e=this.denominator;const i=x.GCD(t,e);return t/=i,e/=i,e<0&&(e=-e,t=-t),this.set(t,e)}add(t=0,e=1){const[i,s]=f(t,e),n=x.LCM(this.denominator,s),a=n/this.denominator,o=n/s,r=this.numerator*a+i*o;return this.set(r,n)}subtract(t=0,e=1){const[i,s]=f(t,e),n=x.LCM(this.denominator,s),a=n/this.denominator,o=n/s,r=this.numerator*a-i*o;return this.set(r,n)}multiply(t=1,e=1){const[i,s]=f(t,e);return this.set(this.numerator*i,this.denominator*s)}divide(t=1,e=1){const[i,s]=f(t,e);return this.set(this.numerator*s,this.denominator*i)}equals(t){const e=x.__staticFractionA.copy(t).simplify(),i=x.__staticFractionB.copy(this).simplify();return e.numerator===i.numerator&&e.denominator===i.denominator}greaterThan(t){const e=x.__staticFractionB.copy(this);return e.subtract(t),e.numerator>0}greaterThanEquals(t){const e=x.__staticFractionB.copy(this);return e.subtract(t),e.numerator>=0}lessThan(t){return!this.greaterThanEquals(t)}lessThanEquals(t){return!this.greaterThan(t)}clone(){return new x(this.numerator,this.denominator)}copy(t){return"number"==typeof t?this.set(t,1):this.set(t.numerator,t.denominator)}quotient(){return Math.floor(this.numerator/this.denominator)}remainder(){return this.numerator%this.denominator}makeAbs(){return this.denominator=Math.abs(this.denominator),this.numerator=Math.abs(this.numerator),this}toString(){return`${this.numerator}/${this.denominator}`}toSimplifiedString(){return x.__staticFractionTmp.copy(this).simplify().toString()}toMixedString(){let t="";const e=this.quotient(),i=x.__staticFractionTmp.copy(this);return e<0&&i.makeAbs(),0!==e?(t+=e,0!==i.numerator&&(t+=` ${i.toSimplifiedString()}`)):t=0===i.numerator?"0":i.toSimplifiedString(),t}parse(t){const e=t.split("/"),i=parseInt(e[0],10),s=e[1]?parseInt(e[1],10):1;return this.set(i,s)}}function f(t,e=1){return"number"==typeof t?[t,e]:[t.numerator,t.denominator]}x.__staticFractionA=new x,x.__staticFractionB=new x,x.__staticFractionTmp=new x;class y{constructor(t,e,i,s){this.x=t,this.y=e,this.w=i,this.h=s}static copy(t){return new y(t.x,t.y,t.w,t.h)}getX(){return this.x}getY(){return this.y}getW(){return this.w}getH(){return this.h}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setW(t){return this.w=t,this}setH(t){return this.h=t,this}move(t,e){return this.x+=t,this.y+=e,this}clone(){return y.copy(this)}mergeWith(t){const e=t,i=this.xthis.x2)&&(this.x2=t),(isNaN(this.y1)||ethis.y2)&&(this.y2=e)}addX(t){this.addPoint(t,this.y1)}addY(t){this.addPoint(this.x1,t)}addQuadraticCurve(t,e,i,s,n,a){this.addPoint(t,e),this.addPoint(n,a);const o=i-t;let r=o-(n-i);if(0!=r){const e=o/r;if(e>0&&e<1){const s=1-e;this.addX(s*s*t+2*s*e*i+e*e*n)}}const h=s-e;if(r=h-(a-s),0!=r){const t=h/r;if(t>0&&t<1){const i=1-t;this.addY(i*i*e+2*i*t*s+t*t*a)}}}addBezierCurve(t,e,i,s,n,a,o,r){const h=[t,e],c=[i,s],l=[n,a],b=[o,r];let d;this.addPoint(h[0],h[1]),this.addPoint(b[0],b[1]);const m=(t,e)=>Math.pow(1-t,3)*h[e]+3*Math.pow(1-t,2)*t*c[e]+3*(1-t)*Math.pow(t,2)*l[e]+Math.pow(t,3)*b[e];for(d=0;d<=1;d++){const t=6*h[d]-12*c[d]+6*l[d],e=-3*h[d]+9*c[d]-9*l[d]+3*b[d],i=3*c[d]-3*h[d];if(0===e){if(0===t)continue;const e=-i/t;0=600;{const e=parseInt(t,10);return isNaN(e)?"bold"===t.toLowerCase():e>=600}}return!1}static isItalic(t){return!!t&&t.toLowerCase()===w.ITALIC}static loadWebFont(t,e,i=!0){return v(this,void 0,void 0,(function*(){const s=new FontFace(t,(i?`url(${e}2) format('woff2'), `:"")+`url(${e}) format('woff')`);return yield s.load(),document.fonts.add(s),s}))}static loadWebFonts(){return v(this,void 0,void 0,(function*(){const t=k.WEB_FONT_HOST,e=k.WEB_FONT_FILES;for(const i in e){const s=e[i];k.loadWebFont(i,t+s)}}))}static loadTextFonts(){}static load(t,e,i){let s=C[t];return s||(s=new k(t),C[t]=s),e&&s.setData(e),i&&s.setMetrics(i),s}getName(){return this.name}getData(){return d(this.data,"FontError","Missing font data")}getMetrics(){return d(this.metrics,"FontError","Missing metrics")}setData(t){this.data=t}setMetrics(t){this.metrics=t}hasData(){return void 0!==this.data}getResolution(){return this.getData().resolution}getGlyphs(){return this.getData().glyphs}lookupMetric(t,e){const i=t.split(".");let s=this.getMetrics();for(let t=0;tt[e]))}}return[]}getElementsByType(t){return this.getElementsByAttribute("type",t)}getElementsByClass(t){return this.getElementsByAttribute("class",t)}onUpdate(t){return["id","type","class"].includes(t.name)&&this.updateIndex(t),this}}class A{constructor(){var t;this.attrs={id:A.newID(),el:void 0,type:this.getCategory(),classes:{}},this.rendered=!1,null===(t=N.getDefaultRegistry())||void 0===t||t.register(this)}static get CATEGORY(){return c.Element}static newID(){return"auto"+A.ID++}getCategory(){return this.constructor.CATEGORY}setStyle(t){return this.style=t,this}getStyle(){return this.style}applyStyle(t=this.context,e=this.getStyle()){return e&&t?(t.save(),e.shadowColor&&t.setShadowColor(e.shadowColor),e.shadowBlur&&t.setShadowBlur(e.shadowBlur),e.fillStyle&&t.setFillStyle(e.fillStyle),e.strokeStyle&&t.setStrokeStyle(e.strokeStyle),e.lineWidth&&t.setLineWidth(e.lineWidth),this):this}restoreStyle(t=this.context,e=this.getStyle()){return e&&t?(t.restore(),this):this}drawWithStyle(){this.checkContext(),this.applyStyle(),this.draw(),this.restoreStyle()}hasClass(t){return!0===this.attrs.classes[t]}addClass(t){var e;return this.attrs.classes[t]=!0,null===(e=this.registry)||void 0===e||e.onUpdate({id:this.attrs.id,name:"class",value:t,oldValue:void 0}),this}removeClass(t){var e;return delete this.attrs.classes[t],null===(e=this.registry)||void 0===e||e.onUpdate({id:this.attrs.id,name:"class",value:void 0,oldValue:t}),this}onRegister(t){return this.registry=t,this}isRendered(){return this.rendered}setRendered(t=!0){return this.rendered=t,this}getAttributes(){return this.attrs}getAttribute(t){return this.attrs[t]}setAttribute(t,e){var i;const s=this.attrs.id,n=this.attrs[t];return this.attrs[t]=e,null===(i=this.registry)||void 0===i||i.onUpdate({id:s,name:t,value:e,oldValue:n}),this}getBoundingBox(){return this.boundingBox}getContext(){return this.context}setContext(t){return this.context=t,this}checkContext(){return d(this.context,"NoContext","No rendering context attached to instance.")}set font(t){this.setFont(t)}get font(){return k.toCSSString(this.textFont)}setFont(t,e,i,s){const n=this.constructor.TEXT_FONT,a="object"==typeof t,o="string"==typeof t,r=void 0===t,h=void 0===e&&void 0===i&&void 0===s;return this.textFont=a?Object.assign(Object.assign({},n),t):o&&h?k.fromCSSString(t):r&&h?Object.assign({},n):k.validate(null!=t?t:n.family,null!=e?e:n.size,null!=i?i:n.weight,null!=s?s:n.style),this}getFont(){return this.textFont||this.resetFont(),k.toCSSString(this.textFont)}resetFont(){this.setFont()}get fontInfo(){return this.textFont||this.resetFont(),Object.assign({},this.textFont)}set fontInfo(t){this.setFont(t)}setFontSize(t){const e=this.fontInfo;return this.setFont(e.family,t,e.weight,e.style),this}getFontSize(){return this.fontSize}set fontSize(t){this.setFontSize(t)}get fontSize(){let t=this.fontInfo.size;return"number"==typeof t&&(t=`${t}pt`),t}get fontSizeInPoints(){return k.convertSizeToPointValue(this.fontSize)}get fontSizeInPixels(){return k.convertSizeToPixelValue(this.fontSize)}get fontStyle(){return this.fontInfo.style}set fontStyle(t){const e=this.fontInfo;this.setFont(e.family,e.size,e.weight,t)}get fontWeight(){return this.fontInfo.weight+""}set fontWeight(t){const e=this.fontInfo;this.setFont(e.family,e.size,t,e.style)}}var P,B;A.ID=1e3,A.TEXT_FONT={family:k.SANS_SERIF,size:k.SIZE,weight:T.NORMAL,style:w.NORMAL},function(t){t[t.MOVE=0]="MOVE",t[t.LINE=1]="LINE",t[t.QUADRATIC=2]="QUADRATIC",t[t.BEZIER=3]="BEZIER"}(P||(P={}));class F{constructor(t,e,i){this.point=-1,this.metrics=R.loadMetrics(t,e,i),this.bbox=R.getOutlineBoundingBox(this.metrics.outline,this.metrics.scale,this.metrics.x_shift,this.metrics.y_shift),i&&(this.point=R.lookupFontMetric(this.metrics.font,i,e,"point",-1))}}class M{constructor(t,e,i,s){this.outline=t,this.originX=e,this.originY=i,this.scale=s,this.i=0}done(){return this.i>=this.outline.length}next(){return this.outline[this.i++]}nextX(){return this.originX+this.outline[this.i++]*this.scale}nextY(){return this.originY-this.outline[this.i++]*this.scale}static parse(t){const e=[],i=t.split(" ");let s=0;for(;s{const e=t.getTickContext();n&&t.setStave(n),e.setXOffset(a)}))}}class L{static get NUM_TONES(){return this.canonical_notes.length}static get roots(){return["c","d","e","f","g","a","b"]}static get root_values(){return[0,2,4,5,7,9,11]}static get root_indices(){return{c:0,d:1,e:2,f:3,g:4,a:5,b:6}}static get canonical_notes(){return["c","c#","d","d#","e","f","f#","g","g#","a","a#","b"]}static get diatonic_intervals(){return["unison","m2","M2","m3","M3","p4","dim5","p5","m6","M6","b7","M7","octave"]}static get diatonic_accidentals(){return{unison:{note:0,accidental:0},m2:{note:1,accidental:-1},M2:{note:1,accidental:0},m3:{note:2,accidental:-1},M3:{note:2,accidental:0},p4:{note:3,accidental:0},dim5:{note:4,accidental:-1},p5:{note:4,accidental:0},m6:{note:5,accidental:-1},M6:{note:5,accidental:0},b7:{note:6,accidental:-1},M7:{note:6,accidental:0},octave:{note:7,accidental:0}}}static get intervals(){return{u:0,unison:0,m2:1,b2:1,min2:1,S:1,H:1,2:2,M2:2,maj2:2,T:2,W:2,m3:3,b3:3,min3:3,M3:4,3:4,maj3:4,4:5,p4:5,"#4":6,b5:6,aug4:6,dim5:6,5:7,p5:7,"#5":8,b6:8,aug5:8,6:9,M6:9,maj6:9,b7:10,m7:10,min7:10,dom7:10,M7:11,maj7:11,8:12,octave:12}}static get scales(){return{major:[2,2,1,2,2,2,1],minor:[2,1,2,2,1,2,2],ionian:[2,2,1,2,2,2,1],dorian:[2,1,2,2,2,1,2],phyrgian:[1,2,2,2,1,2,2],lydian:[2,2,2,1,2,2,1],mixolydian:[2,2,1,2,2,1,2],aeolian:[2,1,2,2,1,2,2],locrian:[1,2,2,1,2,2,2]}}static get scaleTypes(){return{M:L.scales.major,m:L.scales.minor}}static get accidentals(){return["bb","b","n","#","##"]}static get noteValues(){return{c:{root_index:0,int_val:0},cn:{root_index:0,int_val:0},"c#":{root_index:0,int_val:1},"c##":{root_index:0,int_val:2},cb:{root_index:0,int_val:11},cbb:{root_index:0,int_val:10},d:{root_index:1,int_val:2},dn:{root_index:1,int_val:2},"d#":{root_index:1,int_val:3},"d##":{root_index:1,int_val:4},db:{root_index:1,int_val:1},dbb:{root_index:1,int_val:0},e:{root_index:2,int_val:4},en:{root_index:2,int_val:4},"e#":{root_index:2,int_val:5},"e##":{root_index:2,int_val:6},eb:{root_index:2,int_val:3},ebb:{root_index:2,int_val:2},f:{root_index:3,int_val:5},fn:{root_index:3,int_val:5},"f#":{root_index:3,int_val:6},"f##":{root_index:3,int_val:7},fb:{root_index:3,int_val:4},fbb:{root_index:3,int_val:3},g:{root_index:4,int_val:7},gn:{root_index:4,int_val:7},"g#":{root_index:4,int_val:8},"g##":{root_index:4,int_val:9},gb:{root_index:4,int_val:6},gbb:{root_index:4,int_val:5},a:{root_index:5,int_val:9},an:{root_index:5,int_val:9},"a#":{root_index:5,int_val:10},"a##":{root_index:5,int_val:11},ab:{root_index:5,int_val:8},abb:{root_index:5,int_val:7},b:{root_index:6,int_val:11},bn:{root_index:6,int_val:11},"b#":{root_index:6,int_val:0},"b##":{root_index:6,int_val:1},bb:{root_index:6,int_val:10},bbb:{root_index:6,int_val:9}}}isValidNoteValue(t){return t>=0&&t=0&&t3)throw new l("BadArguments","Invalid note name: "+t);const e=t.toLowerCase(),i=/^([cdefgab])(b|bb|n|#|##)?$/.exec(e);if(null!==i){return{root:i[1],accidental:i[2]}}throw new l("BadArguments","Invalid note name: "+t)}getKeyParts(t){if(!t||t.length<1)throw new l("BadArguments","Invalid key: "+t);const e=t.toLowerCase(),i=/^([cdefgab])(b|#)?(mel|harm|m|M)?$/.exec(e);if(null!==i){const t=i[1],e=i[2];let s=i[3];return s||(s="M"),{root:t,accidental:e,type:s}}throw new l("BadArguments",`Invalid key: ${t}`)}getNoteValue(t){const e=L.noteValues[t];if(void 0===e)throw new l("BadArguments",`Invalid note name: ${t}`);return e.int_val}getIntervalValue(t){const e=L.intervals[t];if(void 0===e)throw new l("BadArguments",`Invalid interval name: ${t}`);return e}getCanonicalNoteName(t){if(!this.isValidNoteValue(t))throw new l("BadArguments",`Invalid note value: ${t}`);return L.canonical_notes[t]}getCanonicalIntervalName(t){if(!this.isValidIntervalValue(t))throw new l("BadArguments",`Invalid interval value: ${t}`);return L.diatonic_intervals[t]}getRelativeNoteValue(t,e,i=1){if(1!==i&&-1!==i)throw new l("BadArguments",`Invalid direction: ${i}`);let s=(t+i*e)%L.NUM_TONES;return s<0&&(s+=L.NUM_TONES),s}getRelativeNoteName(t,e){const i=this.getNoteParts(t),s=this.getNoteValue(i.root);let n=e-s;if(Math.abs(n)>L.NUM_TONES-3){let i=1;n>0&&(i=-1);const a=(e+1+(s+1))%L.NUM_TONES*i;if(Math.abs(a)>2)throw new l("BadArguments",`Notes not related: ${t}, ${e})`);n=a}if(Math.abs(n)>2)throw new l("BadArguments",`Notes not related: ${t}, ${e})`);let a=i.root;if(n>0)for(let t=1;t<=n;++t)a+="#";else if(n<0)for(let t=-1;t>=n;--t)a+="b";return a}getScaleTones(t,e){const i=[t];let s=t;for(let n=0;n":{aboveCode:"articAccentAbove",belowCode:"articAccentBelow",between_lines:!0},"a-":{aboveCode:"articTenutoAbove",belowCode:"articTenutoBelow",between_lines:!0},"a^":{aboveCode:"articMarcatoAbove",belowCode:"articMarcatoBelow",between_lines:!1},"a+":{code:"pluckedLeftHandPizzicato",between_lines:!1},ao:{aboveCode:"pluckedSnapPizzicatoAbove",belowCode:"pluckedSnapPizzicatoBelow",between_lines:!1},ah:{code:"stringsHarmonic",between_lines:!1},"a@":{aboveCode:"fermataAbove",belowCode:"fermataBelow",between_lines:!1},"a@a":{code:"fermataAbove",between_lines:!1},"a@u":{code:"fermataBelow",between_lines:!1},"a|":{code:"stringsUpBow",between_lines:!1},am:{code:"stringsDownBow",between_lines:!1},"a,":{code:"pictChokeCymbal",between_lines:!1}},V={mordent:{code:"ornamentShortTrill"},mordent_inverted:{code:"ornamentMordent"},turn:{code:"ornamentTurn"},turn_inverted:{code:"ornamentTurnSlash"},tr:{code:"ornamentTrill"},upprall:{code:"ornamentPrecompSlideTrillDAnglebert"},downprall:{code:"ornamentPrecompDoubleCadenceUpperPrefix"},prallup:{code:"ornamentPrecompTrillSuffixDandrieu"},pralldown:{code:"ornamentPrecompTrillLowerSuffix"},upmordent:{code:"ornamentPrecompSlideTrillBach"},downmordent:{code:"ornamentPrecompDoubleCadenceUpperPrefixTurn"},lineprall:{code:"ornamentPrecompAppoggTrill"},prallprall:{code:"ornamentTremblement"},scoop:{code:"brassScoop"},doit:{code:"brassDoitMedium"},fall:{code:"brassFallLipShort"},doitLong:{code:"brassLiftMedium"},fallLong:{code:"brassFallRoughMedium"},bend:{code:"brassBend"},plungerClosed:{code:"brassMuteClosed"},plungerOpen:{code:"brassMuteOpen"},flip:{code:"brassFlip"},jazzTurn:{code:"brassJazzTurn"},smear:{code:"brassSmear"}};class K{static currentMusicFont(){if(0===K.MUSIC_FONT_STACK.length)throw new l("NoFonts","The font stack is empty. See: await Flow.fetchMusicFont(...); Flow.setMusicFont(...).");return K.MUSIC_FONT_STACK[0]}static clefProperties(t){if(!t||!(t in Y))throw new l("BadArgument","Invalid clef: "+t);return Y[t]}static keyProperties(t,e="treble",i){let s={octave_shift:0};"object"==typeof i&&(s=Object.assign(Object.assign({},s),i));const n=t.split("/");if(n.length<2)throw new l("BadArguments",`First argument must be note/octave or note/octave/glyph-code: ${t}`);const a=n[0].toUpperCase(),o=z[a];if(!o)throw new l("BadArguments","Invalid key name: "+a);o.octave&&(n[1]=o.octave.toString());let r=parseInt(n[1],10);r+=-1*s.octave_shift;let h=(7*r-28+o.index)/2;h+=K.clefProperties(e).line_shift;let c=0;h<=0&&2*h%2==0&&(c=1),h>=6&&2*h%2==0&&(c=-1);const b=void 0!==o.int_val?12*r+o.int_val:void 0,d=o.code,m=o.shift_right;let g={};if(n.length>2&&n[2]){const t=n[2].toUpperCase();g=H[t]||{}}return Object.assign({key:a,octave:r,line:h,int_value:b,accidental:o.accidental,code:d,stroke:c,shift_right:m,displaced:!1},g)}static integerToNote(t){if(void 0===t||t<0||t>11)throw new l("BadArguments",`integerToNote() requires an integer in the range [0, 11]: ${t}`);const e={0:"C",1:"C#",2:"D",3:"D#",4:"E",5:"F",6:"F#",7:"G",8:"G#",9:"A",10:"A#",11:"B"}[t];if(!e)throw new l("BadArguments",`Unknown note value for integer: ${t}`);return e}static tabToGlyph(t,e=1){let i,s=0,n=0;if("X"===t.toUpperCase()){const t=new R("accidentalDoubleSharp",K.TABLATURE_FONT_SCALE).getMetrics();if(i="accidentalDoubleSharp",null==t.width||null==t.height)throw new l("InvalidMetrics","Width and height required");s=t.width,n=-t.height/2}else s=K.textWidth(t);return{text:t,code:i,getWidth:()=>s*e,shift_y:n}}static textWidth(t){return 7*t.toString().length}static articulationCodes(t){return X[t]}static accidentalCodes(t){return j[t]}static ornamentCodes(t){return V[t]}static keySignature(t){const e=G[t];if(!e)throw new l("BadKeySignature",`Bad key signature spec: '${t}'`);if(!e.acc)return[];const i={b:[2,.5,2.5,1,3,1.5,3.5],"#":[0,1.5,-.5,1,2.5,.5,2]}[e.acc],s=[];for(let t=0;tR.getWidth(n,t)}),s)}}K.STEM_WIDTH=1.5,K.STEM_HEIGHT=35,K.STAVE_LINE_THICKNESS=1,K.RESOLUTION=I,K.MUSIC_FONT_STACK=[],K.NOTATION_FONT_SCALE=39,K.TABLATURE_FONT_SCALE=39,K.SLASH_NOTEHEAD_WIDTH=15,K.STAVE_LINE_DISTANCE=10,K.TEXT_HEIGHT_OFFSET_HACK=1,K.accidentalMap=j,K.accidentalColumnsTable={1:{a:[1],b:[1]},2:{a:[1,2]},3:{a:[1,3,2],b:[1,2,1],second_on_bottom:[1,2,3]},4:{a:[1,3,4,2],b:[1,2,3,1],spaced_out_tetrachord:[1,2,1,2]},5:{a:[1,3,5,4,2],b:[1,2,4,3,1],spaced_out_pentachord:[1,2,3,2,1],very_spaced_out_pentachord:[1,2,1,2,1]},6:{a:[1,3,5,6,4,2],b:[1,2,4,5,3,1],spaced_out_hexachord:[1,3,2,1,3,2],very_spaced_out_hexachord:[1,2,1,2,1,2]}},K.unicode={sharp:String.fromCharCode(9839),flat:String.fromCharCode(9837),natural:String.fromCharCode(9838),triangle:String.fromCharCode(9651),"o-with-slash":String.fromCharCode(248),degrees:String.fromCharCode(176),circle:String.fromCharCode(9675)},K.validTypes={n:{name:"note"},r:{name:"rest"},h:{name:"harmonic"},m:{name:"muted"},s:{name:"slash"},g:{name:"ghost"}},K.TIME4_4={num_beats:4,beat_value:4,resolution:I};const $={"1/2":{common:{stem:!1,stem_offset:0,flag:!1,dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadDoubleWhole"},h:{code_head:"unpitchedPercussionClef1"},m:{code_head:"vexNoteHeadMutedBreve",stem_offset:0},r:{code_head:"restDoubleWhole",rest:!0,position:"B/5",dot_shiftY:.5},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadDoubleWhole"}}},1:{common:{stem:!1,stem_offset:0,flag:!1,dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadWhole"},h:{code_head:"noteheadDiamondWhole"},m:{code_head:"noteheadXWhole",stem_offset:-3},r:{code_head:"restWhole",rest:!0,position:"D/5",dot_shiftY:.5},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadWhole"}}},2:{common:{stem:!0,stem_offset:0,flag:!1,dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadHalf"},h:{code_head:"noteheadDiamondHalf"},m:{code_head:"noteheadXHalf",stem_offset:-3},r:{code_head:"restHalf",stem:!1,rest:!0,position:"B/4",dot_shiftY:-.5},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadHalf"}}},4:{common:{stem:!0,stem_offset:0,flag:!1,dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"restQuarter",stem:!1,rest:!0,position:"B/4",dot_shiftY:-.5,line_above:1.5,line_below:1.5},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}},8:{common:{stem:!0,stem_offset:0,flag:!0,beam_count:1,stem_beam_extension:0,code_flag_upstem:"flag8thUp",code_flag_downstem:"flag8thDown",dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"rest8th",stem:!1,flag:!1,rest:!0,position:"B/4",dot_shiftY:-.5,line_above:1,line_below:1},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}},16:{common:{beam_count:2,stem_beam_extension:0,stem:!0,stem_offset:0,flag:!0,code_flag_upstem:"flag16thUp",code_flag_downstem:"flag16thDown",dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"rest16th",stem:!1,flag:!1,rest:!0,position:"B/4",dot_shiftY:-.5,line_above:1,line_below:2},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}},32:{common:{beam_count:3,stem_beam_extension:7.5,stem:!0,stem_offset:0,flag:!0,code_flag_upstem:"flag32ndUp",code_flag_downstem:"flag32ndDown",dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"rest32nd",stem:!1,flag:!1,rest:!0,position:"B/4",dot_shiftY:-1.5,line_above:2,line_below:2},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}},64:{common:{beam_count:4,stem_beam_extension:15,stem:!0,stem_offset:0,flag:!0,code_flag_upstem:"flag64thUp",code_flag_downstem:"flag64thDown",dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"rest64th",stem:!1,flag:!1,rest:!0,position:"B/4",dot_shiftY:-1.5,line_above:2,line_below:3},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}},128:{common:{beam_count:5,stem_beam_extension:22.5,stem:!0,stem_offset:0,flag:!0,code_flag_upstem:"flag128thUp",code_flag_downstem:"flag128thDown",dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"rest128th",stem:!1,flag:!1,rest:!0,position:"B/4",dot_shiftY:-2.5,line_above:3,line_below:3},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}}};function q(...t){J.DEBUG&&m("Vex.Flow.Accidental",t)}class J extends O{constructor(t){super(),q("New accidental: ",t),this.type=t,this.position=O.Position.LEFT,this.render_options={font_scale:38,parenLeftPadding:2,parenRightPadding:2},this.accidental=K.accidentalCodes(this.type),d(this.accidental,"ArgumentError",`Unknown accidental type: ${t}`),this.cautionary=!1,this.reset()}static get CATEGORY(){return c.Accidental}static format(t,e){if(!t||0===t.length)return;const i=K.currentMusicFont(),s=i.lookupMetric("accidental.noteheadAccidentalPadding"),n=e.left_shift+s,a=i.lookupMetric("accidental.accidentalSpacing"),o=i.lookupMetric("accidental.leftPadding"),r=[];let h,c=0;for(let e=0;ee.line-t.line));const l=[];let b,d=0;for(let t=0;td?e.shift:d,b=e.line}let m=0;for(let t=0;tl[i+t],a=t=>t.map(n),o=(t,e)=>{const[i,s]=a([t,e]).map((t=>t.line));return i-s},r=(...t)=>t.map(a).every((([t,e])=>!this.checkCollision(t,e))),h=s-i+1;let c,b,d=this.checkCollision(l[i],l[s])?"a":"b";switch(h){case 3:"a"===d&&.5===o(1,2)&&.5!==o(0,1)&&(d="second_on_bottom");break;case 4:r([0,2],[1,3])&&(d="spaced_out_tetrachord");break;case 5:"b"===d&&r([1,3])&&(d="spaced_out_pentachord",r([0,2],[2,4])&&(d="very_spaced_out_pentachord"));break;case 6:r([0,3],[1,4],[2,5])&&(d="spaced_out_hexachord"),r([0,2],[2,4],[1,3],[3,5])&&(d="very_spaced_out_hexachord")}if(h>=7){let e=2,i=!0;for(;!0===i;){i=!1;for(let t=0;t+eb?m:b}else for(c=t;c<=s;c++)b=K.accidentalColumnsTable[h][d][c-t],l[c].column=b,m=m>b?m:b;t=s}const g=[],u=[];for(let t=0;t<=m;t++)g[t]=0,u[t]=0;g[0]=d+n,u[0]=d+n,l.forEach((t=>{t.width>g[t.column]&&(g[t.column]=t.width)}));for(let t=1;t{let e=0;const i=_+t.numAcc;for(;_0?(s=e.flatLine||e.dblSharpLine?2.5:3,t.dblSharpLine&&(i-=.5)):(s=t.flatLine||t.dblSharpLine?2.5:3,e.dblSharpLine&&(i-=.5));const n=Math.abs(i){const e=new x(0,1);t.getTickables().forEach((t=>{if(t.shouldIgnoreTicks())return;const i=n[e.value()];i?i.push(t):(s.push(e.value()),n[e.value()]=[t]),e.add(t.getTicks())}))}));const a=new L;e||(e="C");const r=a.createScaleMap(e),h={};s.forEach((t=>{const e=n[t],s=[],l=t=>{if(!o(t)||t.isRest()||t.shouldIgnoreTicks())return;const e=t;e.keys.forEach(((t,n)=>{const o=a.getNoteParts(t.split("/")[0]),l=t.split("/")[1],b=o.accidental||"n",d=o.root+b;h[o.root+l]||(h[o.root+l]=r[o.root]);const m=h[o.root+l]===d,g=s.indexOf(t)>-1;if(e.getModifiers().forEach(((t,s)=>{i(t,c.Accidental)&&t.type==b&&t.getIndex()==n&&e.getModifiers().splice(s,1)})),!m||m&&g){h[o.root+l]=d;const i=new J(b);e.addModifier(i,n),s.push(t)}})),e.getModifiers().forEach((t=>{i(t,c.GraceNoteGroup)&&t.getGraceNotes().forEach(l)}))};e.forEach(l)}))}reset(){const t=this.render_options.font_scale;this.glyph=new R(this.accidental.code,t),this.glyph.setOriginX(1),this.cautionary&&(this.parenLeft=new R(K.accidentalCodes("{").code,t),this.parenRight=new R(K.accidentalCodes("}").code,t),this.parenLeft.setOriginX(1),this.parenRight.setOriginX(1))}getWidth(){if(this.cautionary){const t=d(this.parenLeft),e=d(this.parenRight),i=t.getMetrics().width+e.getMetrics().width+this.render_options.parenLeftPadding+this.render_options.parenRightPadding;return this.glyph.getMetrics().width+i}return this.glyph.getMetrics().width}setNote(t){return d(t,"ArgumentError",`Bad note value: ${t}`),this.note=t,n(t)&&(this.render_options.font_scale=25,this.reset()),this}setAsCautionary(){return this.cautionary=!0,this.render_options.font_scale=28,this.reset(),this}draw(){const{type:t,position:e,index:i,cautionary:s,x_shift:n,y_shift:a,glyph:o,render_options:{parenLeftPadding:r,parenRightPadding:h}}=this,c=this.checkContext(),l=this.checkAttachedNote();this.setRendered();const b=l.getModifierStartXY(e,i);let m=b.x+n;const g=b.y+a;if(q("Rendering: ",t,m,g),s){const t=d(this.parenLeft),e=d(this.parenRight);e.render(c,m,g),m-=e.getMetrics().width,m-=h,m-=this.accidental.parenRightPaddingAdjustment,o.render(c,m,g),m-=o.getMetrics().width,m-=r,t.render(c,m,g)}else o.render(c,m,g)}}J.DEBUG=!1;class Q extends A{constructor(t){super(),this.stem_up_y_offset=0,this.stem_down_y_offset=0,this.stem_up_y_base_offset=0,this.stem_down_y_base_offset=0,this.x_begin=(null==t?void 0:t.x_begin)||0,this.x_end=(null==t?void 0:t.x_end)||0,this.y_top=(null==t?void 0:t.y_top)||0,this.y_bottom=(null==t?void 0:t.y_bottom)||0,this.stem_extension=(null==t?void 0:t.stem_extension)||0,this.stem_direction=(null==t?void 0:t.stem_direction)||0,this.hide=(null==t?void 0:t.hide)||!1,this.isStemlet=(null==t?void 0:t.isStemlet)||!1,this.stemletHeight=(null==t?void 0:t.stemletHeight)||0,this.renderHeightAdjustment=0,this.setOptions(t)}static get CATEGORY(){return c.Stem}static get UP(){return 1}static get DOWN(){return-1}static get WIDTH(){return K.STEM_WIDTH}static get HEIGHT(){return K.STEM_HEIGHT}setOptions(t){this.stem_up_y_offset=(null==t?void 0:t.stem_up_y_offset)||0,this.stem_down_y_offset=(null==t?void 0:t.stem_down_y_offset)||0,this.stem_up_y_base_offset=(null==t?void 0:t.stem_up_y_base_offset)||0,this.stem_down_y_base_offset=(null==t?void 0:t.stem_down_y_base_offset)||0}setNoteHeadXBounds(t,e){return this.x_begin=t,this.x_end=e,this}setDirection(t){this.stem_direction=t}setExtension(t){this.stem_extension=t}getExtension(){return this.stem_extension}setYBounds(t,e){this.y_top=t,this.y_bottom=e}getHeight(){const t=this.stem_direction===Q.UP?this.stem_up_y_offset:this.stem_down_y_offset;return(this.y_bottom-this.y_top+(Q.HEIGHT-t+this.stem_extension))*this.stem_direction}getBoundingBox(){throw new l("NotImplemented","getBoundingBox() not implemented.")}getExtents(){const t=this.stem_direction===Q.UP,e=[this.y_top,this.y_bottom],i=Q.HEIGHT+this.stem_extension,s=(t?Math.min:Math.max)(...e),n=(t?Math.max:Math.min)(...e);return{topY:s+i*-this.stem_direction,baseY:n}}setVisibility(t){return this.hide=!t,this}setStemlet(t,e){return this.isStemlet=t,this.stemletHeight=e,this}adjustHeightForFlag(){this.renderHeightAdjustment=K.currentMusicFont().lookupMetric("stem.heightAdjustmentForFlag",-3)}adjustHeightForBeam(){this.renderHeightAdjustment=-Q.WIDTH/2}draw(){if(this.setRendered(),this.hide)return;const t=this.checkContext();let e,i;const s=this.stem_direction;let n=0;s===Q.DOWN?(e=this.x_begin,i=this.y_top+this.stem_down_y_offset,n=this.stem_down_y_base_offset):(e=this.x_end,i=this.y_bottom-this.stem_up_y_offset,n=this.stem_up_y_base_offset);const a=this.getHeight();!function(...t){Q.DEBUG&&m("Vex.Flow.Stem",t)}("Rendering stem - ","Top Y: ",this.y_top,"Bottom Y: ",this.y_bottom);const o=this.isStemlet?a-this.stemletHeight*this.stem_direction:0;t.save(),this.applyStyle(t),t.beginPath(),t.setLineWidth(Q.WIDTH),t.moveTo(e,i-o+n),t.lineTo(e,i-a-this.renderHeightAdjustment*s),t.stroke(),this.restoreStyle(t),t.restore()}}function Z(...t){it.DEBUG&&m("Vex.Flow.TextFormatter",t)}Q.DEBUG=!1;const tt={},et={};class it{constructor(t){this.family="",this.size=14,this.resolution=1e3,this.glyphs={},this.serifs=!1,this.monospaced=!1,this.italic=!1,this.bold=!1,this.superscriptOffset=0,this.subscriptOffset=0,this.maxSizeGlyph="H",this.cacheKey="",this.updateParams(t)}static getFontFamilies(){const t=[];for(const e in et){const i=et[e];t.push(Object.assign({},i))}return t}static create(t={}){Z("create: ",t),t.family||(t.family=k.SANS_SERIF);const e=[],i=t.family.split(/\s*,\s*/);for(const t of i){for(const i in et)i.startsWith(t)&&e.push(et[i]);if(e.length>0)break}let s;if(0===e.length)s=new it(Object.values(et)[0]);else if(1===e.length)s=new it(e[0]);else{const i=k.isBold(t.weight),n=k.isItalic(t.style),a=e.find((t=>t.bold===i&&t.italic===n));if(a)s=new it(a);else{const t=e.find((t=>t.italic===n||t.bold===i));s=new it(t||e[0])}}const n=t.size;if(void 0!==n){const t=k.convertSizeToPointValue(n);s.setFontSize(t)}return s}static getInfo(t){return et[t]}static registerInfo(t,e=!1){Z("registerInfo: ",t,e);const i=t.family;(void 0===et[i]||e)&&(et[i]=t)}updateParams(t){t.family&&(this.family=t.family),t.resolution&&(this.resolution=t.resolution),t.glyphs&&(this.glyphs=t.glyphs),t.serifs&&(this.serifs=t.serifs),t.monospaced&&(this.monospaced=t.monospaced),t.italic&&(this.italic=t.italic),t.bold&&(this.bold=t.bold),t.maxSizeGlyph&&(this.maxSizeGlyph=t.maxSizeGlyph),t.superscriptOffset&&(this.superscriptOffset=t.superscriptOffset),t.subscriptOffset&&(this.subscriptOffset=t.subscriptOffset),this.updateCacheKey()}updateCacheKey(){const t=this.family.replace(/\s+/g,"_"),e=this.size,i=this.bold?T.BOLD:T.NORMAL,s=this.italic?w.ITALIC:w.NORMAL;this.cacheKey=`${t}%${e}%${i}%${s}`}getGlyphMetrics(t){return this.glyphs[t]?this.glyphs[t]:this.glyphs[this.maxSizeGlyph]}get maxHeight(){return this.getGlyphMetrics(this.maxSizeGlyph).ha/this.resolution*this.fontSizeInPixels}getWidthForCharacterInEm(t){var e;const i=this.getGlyphMetrics(t);if(i){return(null!==(e=i.advanceWidth)&&void 0!==e?e:0)/this.resolution}return.65}getWidthForTextInEm(t){const e=this.cacheKey;let i=tt[e];void 0===i&&(i={},tt[e]=i);let s=i[t];if(void 0===s){s=0;for(let e=0;et>e?t:e)),c+=(this.text_line+1)*K.STAVE_LINE_DISTANCE+r,d&&i===Q.DOWN&&(c=Math.max(c,l.topY+r+b*this.text_line))}else if(this.verticalJustification===nt.CENTER){const t=e.getYForTopText(this.text_line)-1;c=t+(g.getYForBottomText(this.text_line)-t)/2+r/2}else if(this.verticalJustification===nt.TOP)c=e.getYs()[0]-(this.text_line+1)*K.STAVE_LINE_DISTANCE,d&&i===Q.UP&&(b=l.topY=1}function lt(t,e){return ct(t,e)?e===ot?Math.ceil:Math.floor:Math.round}const bt=t=>o(t)||n(t);class dt extends O{constructor(t){super(),this.type=t,this.position=rt,this.render_options={font_scale:38},this.reset()}static get CATEGORY(){return c.Articulation}static format(t,e){if(!t||0===t.length)return!1;const i=(t,e,i)=>ht(lt(e,i),d(t.glyph.getMetrics().height)/10+.5);t.forEach((t=>{const s=t.checkAttachedNote();let n=5;const a=s.hasStem()?s.getStemDirection():Q.UP;let o=0;if(r(s)){const t=s.getStem();t&&(o=Math.abs(t.getHeight())/K.STAVE_LINE_DISTANCE)}const h=s.getStave();if(h&&(n=h.getNumLines()),t.getPosition()===ot){let r=s.getLineNumber(!0);a===Q.UP&&(r+=o);let h=i(t,e.top_text_line,ot);const c=r+e.top_text_line+.5;!t.articulation.between_lines&&ct.getWidth())).reduce(((t,e)=>Math.max(e,t)));return e.left_shift+=s/2,e.right_shift+=s/2,!0}static easyScoreHook({articulations:t},e,i){if(!t)return;const s={staccato:"a.",tenuto:"a-",accent:"a>"};t.split(",").map((t=>t.trim().split("."))).map((([t,e])=>{const n={type:s[t]};return e&&(n.position=O.PositionString[e]),i.getFactory().Articulation(n)})).map((t=>e.addModifier(t,0)))}reset(){this.articulation=K.articulationCodes(this.type);const t=d(this.articulation,"ArgumentError",`Articulation not found: ${this.type}`),e=(this.position===ot?t.aboveCode:t.belowCode)||t.code;this.glyph=new R(null!=e?e:"",this.render_options.font_scale),this.setWidth(d(this.glyph.getMetrics().width))}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=this.checkIndex(),{position:s,glyph:n,text_line:a}=this,o=this.articulation.between_lines,r=e.checkStave(),c=r.getSpacingBetweenLines(),b=h(e),{x:d}=e.getModifierStartXY(s,i),g=!o||b,u=function(t,e){const i=e===ot&&t.getStemDirection()===Q.UP||e===rt&&t.getStemDirection()===Q.DOWN;return bt(t)?t.hasStem()&&i?.5:1:t.hasStem()&&i?1:0}(e,s),p=K.currentMusicFont().lookupMetric(`articulation.${n.getCode()}.padding`,0);let _={[ot]:()=>{n.setOrigin(.5,1);const t=function(t,e){const i=t.getStemDirection(),{topY:s,baseY:n}=t.getStemExtents();if(bt(t))return t.hasStem()?i===Q.UP?s:n:Math.min(...t.getYs());if(h(t))return t.hasStem()&&i===Q.UP?s:t.checkStave().getYForTopText(e);throw new l("UnknownCategory","Only can get the top and bottom ys of stavenotes and tabnotes")}(e,a)-(a+u)*c;return g?Math.min(r.getYForTopText(dt.INITIAL_OFFSET),t):t},[rt]:()=>{n.setOrigin(.5,0);const t=function(t,e){const i=t.getStemDirection(),{topY:s,baseY:n}=t.getStemExtents();if(bt(t))return t.hasStem()?i===Q.UP?n:s:Math.max(...t.getYs());if(h(t))return t.hasStem()?i===Q.UP?t.checkStave().getYForBottomText(e):s:t.checkStave().getYForBottomText(e);throw new l("UnknownCategory","Only can get the top and bottom ys of stavenotes and tabnotes")}(e,a)+(a+u)*c;return g?Math.max(r.getYForBottomText(dt.INITIAL_OFFSET),t):t}}[s]();if(!b){const t=s===ot?-1:1,a=e.getKeyProps()[i].line,r=(e.getYs()[i]-_)/c+Number(a),h=function(t,e,i,s){const n=ht(lt(e,i),e);if(t&&ct(n,i)&&n%1==0)return n+.5*-s;return n}(o,r,s,t);ct(h,s)&&n.setOrigin(.5,.5),_+=Math.abs(h-r)*c*t+p*t}!function(...t){dt.DEBUG&&m("Vex.Flow.Articulation",t)}(`Rendering articulation at (x: ${d}, y: ${_})`),n.render(t,d,_)}}dt.DEBUG=!1,dt.INITIAL_OFFSET=-.5;class mt{static get CATEGORY(){return c.RenderContext}set font(t){this.setFont(t)}get font(){return this.getFont()}setRawFont(t){return this.setFont(t),this}}class gt extends A{constructor(){super(),this._preFormatted=!1,this._postFormatted=!1,this.ticks=new x(0,1),this.intrinsicTicks=0,this.tickMultiplier=new x(1,1),this.width=0,this.x_shift=0,this.modifiers=[],this.tupletStack=[],this.align_center=!1,this.center_x_shift=0,this.ignore_ticks=!1,this.formatterMetrics={freedom:{left:0,right:0},duration:"",iterations:0,space:{used:0,mean:0,deviation:0}}}static get CATEGORY(){return c.Tickable}reset(){return this}getTicks(){return this.ticks}shouldIgnoreTicks(){return this.ignore_ticks}setIgnoreTicks(t){return this.ignore_ticks=t,this}setWidth(t){this.width=t}getWidth(){if(!this._preFormatted)throw new l("UnformattedNote","Can't call GetWidth on an unformatted note.");return this.width+(this.modifierContext?this.modifierContext.getWidth():0)}setXShift(t){return this.x_shift=t,this}getXShift(){return this.x_shift}getX(){return this.checkTickContext("Can't getX() without a TickContext.").getX()+this.x_shift}getFormatterMetrics(){return this.formatterMetrics}getCenterXShift(){return this.isCenterAligned()?this.center_x_shift:0}setCenterXShift(t){return this.center_x_shift=t,this}isCenterAligned(){return this.align_center}setCenterAlignment(t){return this.align_center=t,this}getVoice(){return d(this.voice,"NoVoice","Tickable has no voice.")}setVoice(t){this.voice=t}getTuplet(){return this.tuplet}getTupletStack(){return this.tupletStack}resetTuplet(t){let e,i;if(t){const s=this.tupletStack.indexOf(t);return-1!==s&&(this.tupletStack.splice(s,1),e=t.getNoteCount(),i=t.getNotesOccupied(),this.applyTickMultiplier(e,i)),this}for(;this.tupletStack.length;)e=(t=this.tupletStack.pop()).getNoteCount(),i=t.getNotesOccupied(),this.applyTickMultiplier(e,i);return this}setTuplet(t){if(t){this.tupletStack.push(t);const e=t.getNoteCount(),i=t.getNotesOccupied();this.applyTickMultiplier(i,e)}return this.tuplet=t,this}addToModifierContext(t){this.modifierContext=t;for(let t=0;tK.getGlyphProps(this.duration,t))),this.playNote=void 0,this.ignore_ticks=!1,this.width=0,this.leftDisplacedHeadPx=0,this.rightDisplacedHeadPx=0,this.x_shift=0,this.ys=[],t.align_center&&this.setCenterAlignment(t.align_center),this.render_options={annotation_spacing:5,glyph_font_scale:1,stroke_px:1,scale:1,font:"",y_shift:0}}static get CATEGORY(){return c.Note}static plotMetrics(t,e,i){const s=e.getMetrics(),n=e.getAbsoluteX()-s.modLeftPx-s.leftDisplacedHeadPx,a=e.getAbsoluteX()-s.leftDisplacedHeadPx,o=e.getAbsoluteX(),r=e.getAbsoluteX()+s.notePx,h=e.getAbsoluteX()+s.notePx+s.rightDisplacedHeadPx,c=e.getAbsoluteX()+s.notePx+s.rightDisplacedHeadPx+s.modRightPx,l=c+(e.getFormatterMetrics().freedom.right||0),b=c-n;t.save(),t.setFont(k.SANS_SERIF,8),t.fillText(Math.round(b)+"px",n+e.getXShift(),i);const d=i+7;function m(i,s,n,a=d){t.beginPath(),t.setStrokeStyle(n),t.setFillStyle(n),t.setLineWidth(3),t.moveTo(i+e.getXShift(),a),t.lineTo(s+e.getXShift(),a),t.stroke()}m(n,a,"red"),m(a,o,"#999"),m(o,r,"green"),m(r,h,"#999"),m(h,c,"red"),m(c,l,"#DD0"),m(n-e.getXShift(),n,"#BBB"),function(t,e,i,s="#F55"){t.save(),t.setFillStyle(s),t.beginPath(),t.arc(e,i,3,0,2*Math.PI,!0),t.closePath(),t.fill(),t.restore()}(t,o+e.getXShift(),d,"blue");const g=e.getFormatterMetrics();if(g.iterations>0){const s=g.space.deviation,n=s>=0?"+":"";t.setFillStyle("red"),t.fillText(n+Math.round(s),o+e.getXShift(),i-10)}t.restore()}static parseDuration(t){if(!t)return;const e=/(\d*\/?\d+|[a-z])(d*)([nrhms]|$)/.exec(t);if(!e)return;return{duration:e[1],dots:e[2].length,type:e[3]||"n"}}static parseNoteStruct(t){const e=ut.parseDuration(t.duration);if(!e)return;let i=t.type;if(i&&!K.validTypes[i])return;const s=[];i||(i=e.type||"n",void 0!==t.keys&&t.keys.forEach(((t,e)=>{const n=t.split("/");s[e]=n&&3===n.length?n[2]:i})));let n=K.durationToTicks(e.duration);if(!n)return;const a=t.dots?t.dots:e.dots;if("number"!=typeof a)return;let o=n;for(let t=0;t0}hasStem(){return!1}getNoteType(){return this.noteType}getBeam(){return this.beam}checkBeam(){return d(this.beam,"NoBeam","No beam attached to instance")}hasBeam(){return null!=this.beam}setBeam(t){return this.beam=t,this}addModifier(t,e=0){const i="Note.addModifier(modifier: Modifier, index: number=0)";if("string"==typeof e&&(e=parseInt(e),console.warn(i+" expected a number for `index`, but received a string.")),"object"!=typeof t||"number"!=typeof e)throw new l("WrongParams","Incorrect call signature. Use "+i+" instead.");return t.setNote(this),t.setIndex(e),super.addModifier(t),this}getModifiersByType(t){return this.checkModifierContext().getMembers(t)}getModifierStartXY(t,e,i){if(!this.preFormatted)throw new l("UnformattedNote","Can't call GetModifierStartXY on an unformatted note");return{x:this.getAbsoluteX(),y:this.ys[0]}}getRightParenthesisPx(t){return this.getKeyProps()[t].displaced?this.getRightDisplacedHeadPx():0}getLeftParenthesisPx(t){return this.getKeyProps()[t].displaced?this.getLeftDisplacedHeadPx():0}getFirstDotPx(){let t=this.getRightDisplacedHeadPx();return 0!==this.checkModifierContext().getMembers("Parenthesis").length&&(t+=K.currentMusicFont().lookupMetric("parenthesis.default.width")),t}getMetrics(){if(!this.preFormatted)throw new l("UnformattedNote","Can't call getMetrics on an unformatted note.");const t=this.modifierContext?this.modifierContext.getState().left_shift:0,e=this.modifierContext?this.modifierContext.getState().right_shift:0,i=this.getWidth();return{width:i,glyphWidth:this.getGlyphWidth(),notePx:i-t-e-this.leftDisplacedHeadPx-this.rightDisplacedHeadPx,modLeftPx:t,modRightPx:e,leftDisplacedHeadPx:this.leftDisplacedHeadPx,rightDisplacedHeadPx:this.rightDisplacedHeadPx,glyphPx:0}}getAbsoluteX(){let t=this.checkTickContext("Can't getAbsoluteX() without a TickContext.").getX();return this.stave&&(t+=this.stave.getNoteStartX()+K.currentMusicFont().lookupMetric("stave.padding")),this.isCenterAligned()&&(t+=this.getCenterXShift()),t}getStemDirection(){throw new l("NoStem","No stem attached to this note.")}getStemExtents(){throw new l("NoStem","No stem attached to this note.")}getTieRightX(){let t=this.getAbsoluteX();return t+=this.glyph.getWidth()/2,t+=-this.width/2+this.width+2,t}getTieLeftX(){let t=this.getAbsoluteX();return t+=this.glyph.getWidth()/2,t-=this.width/2+2,t}getKeys(){return this.keys}getKeyProps(){return this.keyProps}}var pt,_t,xt,ft,yt,St,Tt;!function(t){t[t.CENTER=0]="CENTER",t[t.LEFT=1]="LEFT",t[t.RIGHT=2]="RIGHT",t[t.ABOVE=3]="ABOVE",t[t.BELOW=4]="BELOW",t[t.BEGIN=5]="BEGIN",t[t.END=6]="END"}(pt||(pt={}));class wt extends A{constructor(){super(),this.width=0,this.x=0,this.padding=10,this.position=pt.ABOVE}static get CATEGORY(){return c.StaveModifier}static get Position(){return pt}getPosition(){return this.position}setPosition(t){return this.position=t,this}getStave(){return this.stave}checkStave(){return d(this.stave,"NoStave","No stave attached to instance.")}setStave(t){return this.stave=t,this}getWidth(){return this.width}setWidth(t){return this.width=t,this}getX(){return this.x}setX(t){return this.x=t,this}placeGlyphOnLine(t,e,i,s=0){t.setYShift(e.getYForLine(null!=i?i:0)-e.getYForGlyphs()+s)}getPadding(t){return void 0!==t&&t<2?0:this.padding}setPadding(t){return this.padding=t,this}setLayoutMetrics(t){return this.layoutMetrics=t,this}getLayoutMetrics(){return this.layoutMetrics}draw(...t){}}!function(t){t[t.SINGLE=1]="SINGLE",t[t.DOUBLE=2]="DOUBLE",t[t.END=3]="END",t[t.REPEAT_BEGIN=4]="REPEAT_BEGIN",t[t.REPEAT_END=5]="REPEAT_END",t[t.REPEAT_BOTH=6]="REPEAT_BOTH",t[t.NONE=7]="NONE"}(_t||(_t={}));class vt extends wt{constructor(t){super(),this.thickness=K.STAVE_LINE_THICKNESS;const e=_t;this.widths={},this.widths[e.SINGLE]=5,this.widths[e.DOUBLE]=5,this.widths[e.END]=5,this.widths[e.REPEAT_BEGIN]=5,this.widths[e.REPEAT_END]=5,this.widths[e.REPEAT_BOTH]=5,this.widths[e.NONE]=5,this.paddings={},this.paddings[e.SINGLE]=0,this.paddings[e.DOUBLE]=0,this.paddings[e.END]=0,this.paddings[e.REPEAT_BEGIN]=15,this.paddings[e.REPEAT_END]=15,this.paddings[e.REPEAT_BOTH]=15,this.paddings[e.NONE]=0,this.layoutMetricsMap={},this.layoutMetricsMap[e.SINGLE]={xMin:0,xMax:1,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.DOUBLE]={xMin:-3,xMax:1,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.END]={xMin:-5,xMax:1,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.REPEAT_END]={xMin:-10,xMax:1,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.REPEAT_BEGIN]={xMin:-2,xMax:10,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.REPEAT_BOTH]={xMin:-10,xMax:10,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.NONE]={xMin:0,xMax:0,paddingLeft:5,paddingRight:5},this.setPosition(pt.BEGIN),this.setType(t)}static get CATEGORY(){return c.Barline}static get type(){return _t}static get typeString(){return{single:_t.SINGLE,double:_t.DOUBLE,end:_t.END,repeatBegin:_t.REPEAT_BEGIN,repeatEnd:_t.REPEAT_END,repeatBoth:_t.REPEAT_BOTH,none:_t.NONE}}getType(){return this.type}setType(t){return this.type="string"==typeof t?vt.typeString[t]:t,this.setWidth(this.widths[this.type]),this.setPadding(this.paddings[this.type]),this.setLayoutMetrics(this.layoutMetricsMap[this.type]),this}draw(t){switch(t.checkContext(),this.setRendered(),this.type){case _t.SINGLE:this.drawVerticalBar(t,this.x,!1);break;case _t.DOUBLE:this.drawVerticalBar(t,this.x,!0);break;case _t.END:this.drawVerticalEndBar(t,this.x);break;case _t.REPEAT_BEGIN:this.drawRepeatBar(t,this.x,!0),t.getX()!==this.x&&this.drawVerticalBar(t,t.getX());break;case _t.REPEAT_END:this.drawRepeatBar(t,this.x,!1);break;case _t.REPEAT_BOTH:this.drawRepeatBar(t,this.x,!1),this.drawRepeatBar(t,this.x,!0)}}drawVerticalBar(t,e,i){const s=t.checkContext(),n=t.getTopLineTopY(),a=t.getBottomLineBottomY();i&&s.fillRect(e-3,n,1,a-n),s.fillRect(e,n,1,a-n)}drawVerticalEndBar(t,e){const i=t.checkContext(),s=t.getTopLineTopY(),n=t.getBottomLineBottomY();i.fillRect(e-5,s,1,n-s),i.fillRect(e-2,s,3,n-s)}drawRepeatBar(t,e,i){const s=t.checkContext(),n=t.getTopLineTopY(),a=t.getBottomLineBottomY();let o=3;i||(o=-5),s.fillRect(e+o,n,1,a-n),s.fillRect(e-2,n,3,a-n);i?o+=4:o-=4;const r=e+o+1;let h=(t.getNumLines()-1)*t.getSpacingBetweenLines();h=h/2-t.getSpacingBetweenLines()/2;let c=n+h+1;s.beginPath(),s.arc(r,c,2,0,2*Math.PI,!1),s.fill(),c+=t.getSpacingBetweenLines(),s.beginPath(),s.arc(r,c,2,0,2*Math.PI,!1),s.fill()}}class Et extends ut{constructor(t=_t.SINGLE){super({duration:"b"}),this.metrics={widths:{}};const e=_t;this.metrics.widths={[e.SINGLE]:8,[e.DOUBLE]:12,[e.END]:15,[e.REPEAT_BEGIN]:14,[e.REPEAT_END]:14,[e.REPEAT_BOTH]:18,[e.NONE]:0},this.ignore_ticks=!0,this.setType(t)}static get CATEGORY(){return c.BarNote}getType(){return this.type}setType(t){return this.type="string"==typeof t?vt.typeString[t]:t,this.setWidth(this.metrics.widths[this.type]),this}addToModifierContext(t){return this}preFormat(){return this.preFormatted=!0,this}draw(){const t=this.checkContext();!function(...t){Et.DEBUG&&m("Vex.Flow.BarNote",t)}("Rendering bar line at: ",this.getAbsoluteX()),this.style&&this.applyStyle(t);const e=new vt(this.type);e.setX(this.getAbsoluteX()),e.draw(this.checkStave()),this.style&&this.restoreStyle(t),this.setRendered()}}Et.DEBUG=!1;class Ct extends O{constructor(t,e=!1,i){super(),this.text=t,this.x_shift=0,this.release=e,this.tap="",this.resetFont(),this.render_options={line_width:1.5,line_style:"#777777",bend_width:8,release_width:8},i?this.phrase=i:(this.phrase=[{type:Ct.UP,text:this.text}],this.release&&this.phrase.push({type:Ct.DOWN,text:""})),this.updateWidth()}static get CATEGORY(){return c.Bend}static get UP(){return 0}static get DOWN(){return 1}static format(t,e){if(!t||0===t.length)return!1;let i=0;for(let s=0;st{const a=t+s,o=i;e.save(),e.beginPath(),e.setLineWidth(this.render_options.line_width),e.setStrokeStyle(this.render_options.line_style),e.setFillStyle(this.render_options.line_style),e.moveTo(t,i),e.quadraticCurveTo(a,o,t+s,n),e.stroke(),e.restore()},b=(t,i,s,n)=>{e.save(),e.beginPath(),e.setLineWidth(this.render_options.line_width),e.setStrokeStyle(this.render_options.line_style),e.setFillStyle(this.render_options.line_style),e.moveTo(t,n),e.quadraticCurveTo(t+s,n,t+s,i),e.stroke(),e.restore()},d=(t,i,s)=>{const n=i+4*s;e.beginPath(),e.moveTo(t,i),e.lineTo(t-4,n),e.lineTo(t+4,n),e.closePath(),e.fill()},m=(t,i)=>{e.save(),e.setFont(this.textFont);const s=t-e.measureText(i).width/2;e.fillText(i,s,h),e.restore()};let g,u=0,p=0;if(null===(t=this.tap)||void 0===t?void 0:t.length){m(i.getModifierStartXY(O.Position.CENTER,this.index).x,this.tap)}for(let t=0;t0){const e=o.symbolBlocks[t-1];Dt.isSuperscript(e)||(n=s)}a&&n>0&&(l=!0,e.xShift=e.xShift+(n-s),s=n,n=0,o.setEnableKerning(!1)),i||a||(n=0),e.vAlign=l,s+=e.width}o.updateKerningAdjustments(),o.updateOverBarAdjustments(),o.getVertical()===ft.TOP?(o.setTextLine(e.top_text_line),e.top_text_line+=c):(o.setTextLine(e.text_line+1),e.text_line+=c+1),o.getReportWidth()?a.push(s):a.push(0)}return s=a.reduce(((t,e)=>t+e),0),e.left_shift+=s/2,e.right_shift+=s/2,!0}static get TEXT_FONT(){let t="Roboto Slab, Times, serif";return"Petaluma"===K.currentMusicFont().getName()&&(t="PetalumaScript, Arial, sans-serif"),{family:t,size:12,weight:T.NORMAL,style:w.NORMAL}}get superscriptOffset(){return Dt.superscriptOffset*this.textFormatter.fontSizeInPixels}get subscriptOffset(){return Dt.subscriptOffset*this.textFormatter.fontSizeInPixels}setReportWidth(t){return this.reportWidth=t,this}getReportWidth(){return this.reportWidth}updateOverBarAdjustments(){const t=this.symbolBlocks.findIndex((({symbolType:t,glyph:e})=>t===yt.GLYPH&&void 0!==e&&"csymDiagonalArrangementSlash"===e.code));if(t<0)return;const e=this.symbolBlocks[t].width/4,i=.25*this.textFormatter.fontSizeInPixels;let s=0;for(;s0?this.symbolBlocks[t-1]:void 0;let s=0;e.symbolType===yt.GLYPH&&void 0!==e.glyph&&e.glyph.code===Dt.glyphs.over.code&&(s+=e.glyph.metrics.x_shift),void 0!==i&&i.symbolType===yt.GLYPH&&void 0!==i.glyph&&i.glyph.code===Dt.glyphs.over.code&&(s+=i.glyph.metrics.x_shift);let n=!1,a=!1;void 0!==i&&i.symbolType===yt.TEXT&&(n=Dt.upperKerningText.some((t=>t===i.text[i.text.length-1])),a=Dt.lowerKerningText.some((t=>t===i.text[i.text.length-1])));const o=Dt.kerningOffset*this.textFormatter.fontSizeInPixels;return n&&e.symbolModifier===St.SUPERSCRIPT&&(s+=o),a&&e.symbolType===yt.TEXT&&(e.text[0]>="a"&&e.text[0]<="z"&&(s+=o/2),Dt.upperKerningText.some((t=>t===(null==i?void 0:i.text[i.text.length-1])))&&(s+=o/2)),s}getSymbolBlock(t={}){var e,i,s;const n=null!==(e=t.symbolType)&&void 0!==e?e:yt.TEXT,a={text:null!==(i=t.text)&&void 0!==i?i:"",symbolType:n,symbolModifier:null!==(s=t.symbolModifier)&&void 0!==s?s:St.NONE,xShift:0,yShift:0,vAlign:!1,width:0};if(n===yt.GLYPH&&"string"==typeof t.glyph){const e=Dt.glyphs[t.glyph],i=20;a.glyph=new R(e.code,i,{category:"chordSymbol"})}else n===yt.TEXT?a.width=this.textFormatter.getWidthForTextInEm(a.text):n===yt.LINE&&(a.width=t.width);return a}addSymbolBlock(t){return this.symbolBlocks.push(this.getSymbolBlock(t)),this}addText(t,e={}){const i=yt.TEXT;return this.addSymbolBlock(Object.assign(Object.assign({},e),{text:t,symbolType:i}))}addTextSuperscript(t){const e=yt.TEXT,i=St.SUPERSCRIPT;return this.addSymbolBlock({text:t,symbolType:e,symbolModifier:i})}addTextSubscript(t){const e=yt.TEXT,i=St.SUBSCRIPT;return this.addSymbolBlock({text:t,symbolType:e,symbolModifier:i})}addGlyphSuperscript(t){const e=yt.GLYPH,i=St.SUPERSCRIPT;return this.addSymbolBlock({glyph:t,symbolType:e,symbolModifier:i})}addGlyph(t,e={}){const i=yt.GLYPH;return this.addSymbolBlock(Object.assign(Object.assign({},e),{glyph:t,symbolType:i}))}addGlyphOrText(t,e={}){let i="";for(let s=0;s0&&(this.addText(i,e),i=""),this.addGlyph(n,e)):i+=n}return i.length>0&&this.addText(i,e),this}addLine(t,e={}){const i=yt.LINE;return this.addSymbolBlock(Object.assign(Object.assign({},e),{symbolType:i,width:t}))}setFont(t,e,i,s){return super.setFont(t,e,i,s),this.textFormatter=it.create(this.textFont),this}setEnableKerning(t){return this.useKerning=t,this}setVertical(t){return this.vertical="string"==typeof t?Dt.VerticalJustifyString[t]:t,this}getVertical(){return this.vertical}setHorizontal(t){return this.horizontal="string"==typeof t?Dt.HorizontalJustifyString[t]:t,this}getHorizontal(){return this.horizontal}getWidth(){let t=0;return this.symbolBlocks.forEach((e=>{t+=e.vAlign?0:e.width})),t}getYOffsetForText(t){var e;let i=0,s=0;for(s=0;s0?i/n*-1:0}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered(),t.save();const i=Object.keys(this.getAttribute("classes")).join(" ");t.openGroup(i,this.getAttribute("id"));const s=e.getModifierStartXY(O.Position.ABOVE,this.index);let n;t.setFont(this.textFont);const a=e.hasStem(),o=e.checkStave();if(this.vertical===ft.BOTTOM){if(n=o.getYForBottomText(this.text_line+K.TEXT_HEIGHT_OFFSET_HACK),a){const t=e.checkStem().getExtents(),i=o.getSpacingBetweenLines(),s=1===e.getStemDirection()?t.baseY:t.topY;n=Math.max(n,s+i*(this.text_line+2))}}else if(n=Math.min(o.getYForTopText(this.text_line),e.getYs()[0]-10),a){const t=e.checkStem().getExtents(),i=o.getSpacingBetweenLines();n=Math.min(n,t.topY-5-i*this.text_line)}let r=s.x;r=this.horizontal===xt.LEFT?s.x:this.horizontal===xt.RIGHT?s.x+this.getWidth():this.horizontal===xt.CENTER?s.x-this.getWidth()/2:e.getStemX()-this.getWidth()/2,kt("Rendering ChordSymbol: ",this.textFormatter,r,n),this.symbolBlocks.forEach((e=>{const i=Dt.isSuperscript(e),s=Dt.isSubscript(e);let a=n;if(kt("shift was ",e.xShift,e.yShift),kt("curY pre sub ",a),i&&(a+=this.superscriptOffset),s&&(a+=this.subscriptOffset),kt("curY sup/sub ",a),e.symbolType===yt.TEXT){if((i||s)&&(t.save(),this.textFont)){const{family:e,size:i,weight:s,style:n}=this.textFont,a=k.scaleSize(i,Dt.superSubRatio);t.setFont(e,a,s,n)}kt("Rendering Text: ",e.text,r+e.xShift,a+e.yShift),t.fillText(e.text,r+e.xShift,a+e.yShift),(i||s)&&t.restore()}else e.symbolType===yt.GLYPH&&e.glyph?(a+=e.yShift,kt("Rendering Glyph: ",e.glyph.code,r+e.xShift,a),e.glyph.render(t,r+e.xShift,a)):e.symbolType===yt.LINE&&(kt("Rendering Line : ",e.width,r,a),t.beginPath(),t.setLineWidth(1),t.moveTo(r,n),t.lineTo(r+e.width,a),t.stroke());r+=e.width,e.vAlign&&(r+=e.xShift)})),t.closeGroup(),t.restore()}}Dt.DEBUG=!1,Dt.HorizontalJustify=xt,Dt.HorizontalJustifyString={left:xt.LEFT,right:xt.RIGHT,center:xt.CENTER,centerStem:xt.CENTER_STEM},Dt.VerticalJustify=ft,Dt.VerticalJustifyString={top:ft.TOP,above:ft.TOP,below:ft.BOTTOM,bottom:ft.BOTTOM},Dt.glyphs={diminished:{code:"csymDiminished"},dim:{code:"csymDiminished"},halfDiminished:{code:"csymHalfDiminished"},"+":{code:"csymAugmented"},augmented:{code:"csymAugmented"},majorSeventh:{code:"csymMajorSeventh"},minor:{code:"csymMinor"},"-":{code:"csymMinor"},"(":{code:"csymParensLeftTall"},leftParen:{code:"csymParensLeftTall"},")":{code:"csymParensRightTall"},rightParen:{code:"csymParensRightTall"},leftBracket:{code:"csymBracketLeftTall"},rightBracket:{code:"csymBracketRightTall"},leftParenTall:{code:"csymParensLeftVeryTall"},rightParenTall:{code:"csymParensRightVeryTall"},"/":{code:"csymDiagonalArrangementSlash"},over:{code:"csymDiagonalArrangementSlash"},"#":{code:"accidentalSharp"},b:{code:"accidentalFlat"}},Dt.symbolTypes=yt,Dt.symbolModifiers=St,Dt.noFormat=!1;class Nt extends O{constructor(){super(),this.position=O.Position.RIGHT,this.radius=2,this.setWidth(5),this.dot_shiftY=0}static get CATEGORY(){return c.Dot}static getDots(t){return t.getModifiersByType(Nt.CATEGORY)}static buildAndAttach(t,e){for(const i of t)if(null==e?void 0:e.all)for(let t=0;te.line-t.line));let a=i,r=0,c=null,b=null,d=null,m=0;for(let t=0;tr?a:r,c=h,b=i}return e.right_shift+=r,!0}setNote(t){return this.note=t,n(t)&&(this.radius*=.5,this.setWidth(3)),this}setDotShiftY(t){return this.dot_shiftY=t,this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.checkStave().getSpacingBetweenLines(),s=e.getModifierStartXY(this.position,this.index,{forceFlagRight:!0});h(e)&&(s.y=e.getStemExtents().baseY);const n=s.x+this.x_shift+this.width-this.radius,a=s.y+this.y_shift+this.dot_shiftY*i;t.beginPath(),t.arc(n,a,this.radius,0,2*Math.PI,!1),t.fill()}}class At extends O{constructor(t){super(),this.finger=t,this.width=7,this.position=O.Position.LEFT,this.x_shift=0,this.y_shift=0,this.x_offset=0,this.y_offset=0,this.resetFont()}static get CATEGORY(){return c.FretHandFinger}static format(t,e){const{left_shift:i,right_shift:s}=e;if(!t||0===t.length)return!1;const n=[];let a=null,o=0,r=0;for(let h=0;he.line-t.line));let h=0,c=0,l=0,b=0,d=null,m=null;for(let t=0;tl?e:l):o===O.Position.RIGHT&&(g.setXShift(c),e=r+x,b=e>b?e:b),d=u,m=a}return e.left_shift+=l,e.right_shift+=b,!0}static easyScoreHook({fingerings:t}={},e,i){null==t||t.split(",").map((t=>{const e=t.trim().split("."),s={number:e[0]};return e[1]&&(s.position=e[1]),i.getFactory().Fingering(s)})).map(((t,i)=>e.addModifier(t,i)))}setFretHandFinger(t){return this.finger=t,this}getFretHandFinger(){return this.finger}setOffsetX(t){return this.x_offset=t,this}setOffsetY(t){return this.y_offset=t,this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.getModifierStartXY(this.position,this.index);let s=i.x+this.x_shift+this.x_offset,n=i.y+this.y_shift+this.y_offset+5;switch(this.position){case O.Position.ABOVE:s-=4,n-=12;break;case O.Position.BELOW:s-=2,n+=10;break;case O.Position.LEFT:s-=this.width;break;case O.Position.RIGHT:s+=1;break;default:throw new l("InvalidPosition",`The position ${this.position} does not exist`)}t.save(),t.setFont(this.textFont),t.fillText(""+this.finger,s,n),t.restore()}}At.TEXT_FONT={family:k.SANS_SERIF,size:9,weight:T.BOLD,style:w.NORMAL};class Pt extends A{constructor(t,e){super(),this.setNotes(t),this.text=e,this.render_options={cp1:8,cp2:12,text_shift_x:0,first_x_shift:0,last_x_shift:0,y_shift:7,tie_spacing:0},this.resetFont()}static get CATEGORY(){return c.StaveTie}setDirection(t){return this.direction=t,this}setNotes(t){if(!t.first_note&&!t.last_note)throw new l("BadArguments","Tie needs to have either first_note or last_note set.");if(t.first_indices||(t.first_indices=[0]),t.last_indices||(t.last_indices=[0]),t.first_indices.length!==t.last_indices.length)throw new l("BadArguments","Tied notes must have same number of indices.");return this.notes=t,this}isPartial(){return!this.notes.first_note||!this.notes.last_note}renderTie(t){if(0===t.first_ys.length||0===t.last_ys.length)throw new l("BadArguments","No Y-values to render");const e=this.checkContext();let i=this.render_options.cp1,s=this.render_options.cp2;Math.abs(t.last_x_px-t.first_x_px)<10&&(i=2,s=8);const n=this.render_options.first_x_shift,a=this.render_options.last_x_shift,o=this.render_options.y_shift*t.direction,r=this.notes.first_indices,h=this.notes.last_indices;for(let c=0;cMath.pow(this.options.softmaxFactor,e.getTicks().value()/t))).reduce(((t,e)=>t+e),0),this.expTicksUsed}softmax(t){this.expTicksUsed||(this.expTicksUsed=this.reCalculateExpTicksUsed());const e=this.ticksUsed.value();return(t=>Math.pow(this.options.softmaxFactor,t/e))(t)/this.expTicksUsed}addTickable(t){if(!t.shouldIgnoreTicks()){const e=t.getTicks();if(this.ticksUsed.add(e),this.expTicksUsed=0,(this.mode===Tt.STRICT||this.mode===Tt.FULL)&&this.ticksUsed.greaterThan(this.totalTicks))throw this.ticksUsed.subtract(e),new l("BadArgument","Too many ticks.");e.lessThan(this.smallestTickCount)&&(this.smallestTickCount=e.clone()),this.resolutionMultiplier=this.ticksUsed.denominator,this.totalTicks.add(0,this.ticksUsed.denominator)}return this.tickables.push(t),t.setVoice(this),this}addTickables(t){for(let e=0;e{e.getStave()||e.setStave(t)})),this.preFormatted=!0,this}checkStave(){return d(this.stave,"NoStave","No stave attached to instance.")}draw(t=this.checkContext(),e){let i;e=null!=e?e:this.stave,this.setRendered();for(let s=0;s1){const e=new Ne(t);e.render_options.beam_width=3,e.render_options.partial_beam_length=4,this.beams.push(e)}return this}setWidth(t){return this.width=t,this}getWidth(){return this.width}getGraceNotes(){return this.grace_notes}draw(){const t=this.checkContext(),e=this.checkAttachedNote();if(this.setRendered(),function(...t){Mt.DEBUG&&m("Vex.Flow.GraceNoteGroup",t)}("Drawing grace note group for:",e),this.alignSubNotesWithNote(this.getGraceNotes(),e),this.grace_notes.forEach((e=>e.setContext(t).draw())),this.beams.forEach((e=>e.setContext(t).draw())),this.show_slur){const i=o(e),s=i?Pt:Bt;this.slur=new s({last_note:this.grace_notes[0],first_note:e,first_indices:[0],last_indices:[0]}),this.slur.render_options.cp2=12,this.slur.render_options.y_shift=(i?7:5)+this.render_options.slur_y_shift,this.slur.setContext(t).draw()}}}Mt.DEBUG=!1;class Rt extends O{constructor(t){super(),this.preFormatted=!1,this.position=O.Position.LEFT,this.subNotes=t,this.subNotes.forEach((t=>{t.setIgnoreTicks(!1)})),this.width=0,this.formatter=new we,this.voice=new Ft({num_beats:4,beat_value:4,resolution:K.RESOLUTION}).setStrict(!1),this.voice.addTickables(this.subNotes)}static get CATEGORY(){return c.NoteSubGroup}static format(t,e){if(!t||0===t.length)return!1;let i=0;for(let e=0;ee.setContext(t).drawWithStyle()))}}class Ot{constructor(t){this.preFormatted=!1,this.postFormatted=!1,this.tickID=t&&t.tickID?t.tickID:0,this.currentTick=new x(0,1),this.maxTicks=new x(0,1),this.maxTickable=void 0,this.minTicks=void 0,this.minTickable=void 0,this.padding=1,this.x=0,this.xBase=0,this.xOffset=0,this.tickables=[],this.tickablesByVoice={},this.notePx=0,this.glyphPx=0,this.leftDisplacedHeadPx=0,this.rightDisplacedHeadPx=0,this.modLeftPx=0,this.modRightPx=0,this.totalLeftPx=0,this.totalRightPx=0,this.tContexts=[],this.width=0,this.formatterMetrics={freedom:{left:0,right:0}}}static getNextContext(t){const e=t.tContexts,i=e.indexOf(t);if(i+1t.isCenterAligned()))}getMetrics(){const{width:t,glyphPx:e,notePx:i,leftDisplacedHeadPx:s,rightDisplacedHeadPx:n,modLeftPx:a,modRightPx:o,totalLeftPx:r,totalRightPx:h}=this;return{width:t,glyphPx:e,notePx:i,leftDisplacedHeadPx:s,rightDisplacedHeadPx:n,modLeftPx:a,modRightPx:o,totalLeftPx:r,totalRightPx:h}}getCurrentTick(){return this.currentTick}setCurrentTick(t){this.currentTick=t,this.preFormatted=!1}addTickable(t,e){if(!t)throw new l("BadArgument","Invalid tickable added.");if(!t.shouldIgnoreTicks()){const e=t.getTicks();e.greaterThan(this.maxTicks)&&(this.maxTicks=e.clone(),this.maxTickable=t),(null==this.minTicks||e.lessThan(this.minTicks))&&(this.minTicks=e.clone(),this.minTickable=t)}return t.setTickContext(this),this.tickables.push(t),this.tickablesByVoice[e||0]=t,this.preFormatted=!1,this}preFormat(){if(this.preFormatted)return this;for(let t=0;t=0,!this.ornament)throw new l("ArgumentError",`Ornament not found: '${this.type}'`);this.x_shift=e?e.xOffset:0,this.y_shift=e?e.yOffset:0,this.glyph=new R(this.ornament.code,this.render_options.font_scale,{category:`ornament.${this.ornament.code}`}),Lt.ornamentNoteTransition.indexOf(this.type)>=0&&(this.delayed=!0),e||this.glyph.setOrigin(.5,1)}static get CATEGORY(){return c.Ornament}static format(t,e){if(!t||0===t.length)return!1;let i=0,s=e.right_shift,n=e.left_shift,a=0;for(let o=0;o=0&&(r.x_shift+=s+2),Lt.ornamentAttack.indexOf(r.type)>=0&&(r.x_shift-=n+2),r.reportedWidth&&r.x_shift<0?n+=r.reportedWidth:r.reportedWidth&&r.x_shift>0?s+=r.reportedWidth:i=Math.max(r.getWidth(),i),Lt.ornamentArticulation.indexOf(r.type)>=0){d(r.note,"NoAttachedNote").getLineNumber()>=3||r.getPosition()===O.Position.ABOVE?(e.top_text_line+=h,r.y_shift+=a,a-=r.glyph.bbox.getH()):(e.text_line+=h,r.y_shift+=a,a+=r.glyph.bbox.getH())}else r.getPosition()===O.Position.ABOVE?(r.setTextLine(e.top_text_line),e.top_text_line+=h):(r.setTextLine(e.text_line),e.text_line+=h)}return e.left_shift=n+i/2,e.right_shift=s+i/2,!0}static get ornamentNoteTransition(){return["flip","jazzTurn","smear"]}static get ornamentAttack(){return["scoop"]}static get ornamentAlignWithNoteHead(){return["doit","fall","fallLong","doitLong","bend","plungerClosed","plungerOpen","scoop"]}static get ornamentRelease(){return["doit","fall","fallLong","doitLong","jazzTurn","smear","flip"]}static get ornamentArticulation(){return["bend","plungerClosed","plungerOpen"]}getMetrics(){return K.currentMusicFont().getMetrics().glyphs.jazzOrnaments[this.ornament.code]}setDelayed(t){return this.delayed=t,this}setUpperAccidental(t){const e=this.render_options.font_scale/1.3;return this.accidentalUpper=new R(K.accidentalCodes(t).code,e),this.accidentalUpper.setOrigin(.5,1),this}setLowerAccidental(t){const e=this.render_options.font_scale/1.3;return this.accidentalLower=new R(K.accidentalCodes(t).code,e),this.accidentalLower.setOrigin(.5,1),this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.getStemDirection(),s=e.checkStave(),n=Object.keys(this.getAttribute("classes")).join(" ");t.openGroup(n,this.getAttribute("id"));const a=e.checkStem().getExtents();let o=i===Q.DOWN?a.baseY:a.topY;h(e)&&(e.hasStem()?i===Q.DOWN&&(o=s.getYForTopText(this.text_line)):o=s.getYForTopText(this.text_line));const r=i===Q.DOWN,c=s.getSpacingBetweenLines();let l=1;!r&&e.hasBeam()&&(l+=.5);const b=o-c*(this.text_line+l),d=e.getModifierStartXY(this.position,this.index);let g=d.x,u=this.ornamentAlignWithNoteHead?d.y:Math.min(s.getYForTopText(this.text_line),b);if(u+=this.y_shift,this.delayed){let t=0;const i=g-(s.getX()-10);if(void 0!==this.delayXShift)t=this.delayXShift;else{t+=this.glyph.getMetrics().width/2;const n=Ot.getNextContext(e.getTickContext());t+=n?.5*(n.getX()-i):.5*(s.getX()+s.getWidth()-i),this.delayXShift=t}g+=t}!function(...t){Lt.DEBUG&&m("Vex.Flow.Ornament",t)}("Rendering ornament: ",this.ornament,g,u),this.accidentalLower&&(this.accidentalLower.render(t,g,u),u-=this.accidentalLower.getMetrics().height,u-=this.render_options.accidentalLowerPadding),this.stemUpYOffset&&e.hasStem()&&1===e.getStemDirection()&&(u+=this.stemUpYOffset),e.getLineNumber()<5&&Lt.ornamentNoteTransition.indexOf(this.type)>=0&&(u=e.checkStave().getBoundingBox().getY()+40),this.glyph.render(t,g+this.x_shift,u),this.accidentalUpper&&(u-=this.glyph.getMetrics().height+this.render_options.accidentalUpperPadding,this.accidentalUpper.render(t,g,u)),t.closeGroup()}}Lt.DEBUG=!1;class It extends O{constructor(t){super(),this.position=null!=t?t:O.Position.LEFT,this.point=K.currentMusicFont().lookupMetric("parenthesis.default.point"),this.setWidth(K.currentMusicFont().lookupMetric("parenthesis.default.width"))}static get CATEGORY(){return c.Parenthesis}static buildAndAttach(t){for(const e of t)for(let t=0;th+n.width?s:h+n.width),o===B.LEFT&&(h=a.getLeftParenthesisPx(r),i=i>h+n.width?i:h+n.width),n.setXShift(h)}return e.left_shift+=i,e.right_shift+=s,!0}setNote(t){return this.note=t,this.point=K.currentMusicFont().lookupMetric("parenthesis.default.point"),this.setWidth(K.currentMusicFont().lookupMetric("parenthesis.default.width")),n(t)&&(this.point=K.currentMusicFont().lookupMetric("parenthesis.gracenote.point"),this.setWidth(K.currentMusicFont().lookupMetric("parenthesis.gracenote.width"))),this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.getModifierStartXY(this.position,this.index,{forceFlagRight:!0}),s=i.x+this.x_shift,n=i.y+this.y_shift;this.position==O.Position.RIGHT?R.renderGlyph(t,s+1,n,this.point,"noteheadParenthesisRight",{category:"noteHead.standard.noteheadParenthesisRight"}):this.position==O.Position.LEFT&&R.renderGlyph(t,s-2,n,this.point,"noteheadParenthesisLeft",{category:"noteHead.standard.noteheadParenthesisLeft"})}}class Wt extends ut{constructor(t){super(t),this.custom_glyph=!1,this.stem_up_x_offset=0,this.stem_down_x_offset=0,this.index=t.index,this.x=t.x||0,this.y=t.y||0,t.note_type&&(this.noteType=t.note_type),this.displaced=t.displaced||!1,this.stem_direction=t.stem_direction||Q.UP,this.line=t.line||0,this.glyph=K.getGlyphProps(this.duration,this.noteType),d(this.glyph,"BadArguments",`No glyph found for duration '${this.duration}' and type '${this.noteType}'`),this.glyph_code=this.glyph.code_head,this.x_shift=t.x_shift||0,t.custom_glyph_code&&(this.custom_glyph=!0,this.glyph_code=t.custom_glyph_code,this.stem_up_x_offset=t.stem_up_x_offset||0,this.stem_down_x_offset=t.stem_down_x_offset||0),this.style=t.style,this.slashed=t.slashed||!1,this.render_options=Object.assign(Object.assign({},this.render_options),{glyph_font_scale:t.glyph_font_scale||K.NOTATION_FONT_SCALE}),this.setWidth(this.glyph.getWidth(this.render_options.glyph_font_scale))}static get CATEGORY(){return c.NoteHead}getWidth(){return this.width}isDisplaced(){return!0===this.displaced}getGlyph(){return this.glyph}setX(t){return this.x=t,this}getY(){return this.y}setY(t){return this.y=t,this}getLine(){return this.line}setLine(t){return this.line=t,this}getAbsoluteX(){const t=this.preFormatted?super.getAbsoluteX():this.x,e=Q.WIDTH/2,i=K.currentMusicFont(),s=i.lookupMetric("notehead.shiftX",0)*this.stem_direction,n=i.lookupMetric("noteHead.displaced.shiftX",0)*this.stem_direction;return t+s+(this.displaced?(this.width-e)*this.stem_direction+n:0)}getBoundingBox(){if(!this.preFormatted)throw new l("UnformattedNote","Can't call getBoundingBox on an unformatted note.");const t=this.checkStave().getSpacingBetweenLines(),e=t/2,i=this.y-e;return new y(this.getAbsoluteX(),i,this.width,t)}setStave(t){const e=this.getLine();return this.stave=t,this.stave&&(this.setY(this.stave.getYForNote(e)),this.setContext(this.stave.getContext())),this}preFormat(){if(this.preFormatted)return this;const t=this.getWidth()+this.leftDisplacedHeadPx+this.rightDisplacedHeadPx;return this.setWidth(t),this.preFormatted=!0,this}draw(){const t=this.checkContext();this.setRendered();let e=this.getAbsoluteX();this.custom_glyph&&(e+=this.stem_direction===Q.UP?this.stem_up_x_offset:this.stem_down_x_offset);const i=this.y;!function(...t){Wt.DEBUG&&m("Vex.Flow.NoteHead",t)}("Drawing note head '",this.noteType,this.duration,"' at",e,i);const s=this.stem_direction,n=this.render_options.glyph_font_scale;this.style&&this.applyStyle(t);const a=`${this.glyph_code}Stem${s===Q.UP?"Up":"Down"}`;if("s"===this.noteType){const n=this.checkStave().getSpacingBetweenLines();!function(t,e,i,s,n,a){const o=K.SLASH_NOTEHEAD_WIDTH;t.save(),t.setLineWidth(K.STEM_WIDTH);let r=!1;if(K.durationToNumber(e)>2&&(r=!0),r||(i-=K.STEM_WIDTH/2*n),t.beginPath(),t.moveTo(i,s+a),t.lineTo(i,s+1),t.lineTo(i+o,s-a),t.lineTo(i+o,s),t.lineTo(i,s+a),t.closePath(),r?t.fill():t.stroke(),K.durationToFraction(e).equals(.5)){const e=[-3,-1,o+1,o+3];for(let n=0;n2?i[1]:void 0;let o=s>2?i[2]:i[1];2===s&&-1===n.stemDirection&&1===o.stemDirection&&(n=i[1],o=i[0]);const r=Math.max(n.voice_shift,o.voice_shift);let h=0;if(2===s){const t=n.stemDirection===o.stemDirection?0:.5;return n.minLine<=o.maxLine+t&&(n.isrest?Gt(n,0,1):o.isrest?Gt(o,0,-1):n.stemDirection===o.stemDirection?(h=r+2,n.note.setXShift(h)):(h=r+2,o.note.setXShift(h))),e.right_shift+=h,!0}if(!a)throw new l("InvalidState","noteM not defined.");if(a.isrest&&!n.isrest&&!o.isrest&&(n.minLine<=a.maxLine||a.minLine<=o.maxLine)){return a.maxLine-a.minLinet.postFormat())),!0)}reset(){super.reset();const t=this._noteHeads.map((t=>t.getStyle()));this.buildNoteHeads(),this._noteHeads.forEach(((e,i)=>{const s=t[i];s&&e.setStyle(s)}));const e=this.stave;return e&&this._noteHeads.forEach((t=>t.setStave(e))),this.calcNoteDisplacements(),this}setBeam(t){return this.beam=t,this.calcNoteDisplacements(),this.stem&&this.stem.setExtension(this.getStemExtension()),this}buildStem(){return this.setStem(new Q({hide:!!this.isRest()})),this}buildNoteHeads(){this._noteHeads=[];const t=this.getStemDirection(),e=this.getKeys();let i,s,n,a,o,r=!1;t===Q.UP?(n=0,a=e.length,o=1):(n=e.length-1,a=-1,o=-1);for(let e=n;e!==a;e+=o){const n=this.keyProps[e],a=n.line;void 0===i?i=a:(s=Math.abs(i-a),0===s||.5===s?r=!r:(r=!1,this.use_default_head_x=!0)),i=a;const o=new Wt({duration:this.duration,note_type:this.noteType,displaced:r,stem_direction:t,custom_glyph_code:n.code,glyph_font_scale:this.render_options.glyph_font_scale,x_shift:n.shift_right,stem_up_x_offset:n.stem_up_x_offset,stem_down_x_offset:n.stem_down_x_offset,line:n.line});this._noteHeads[e]=o}}autoStem(){this.setStemDirection(this.calculateOptimalStemDirection())}calculateOptimalStemDirection(){this.minLine=this.keyProps[0].line,this.maxLine=this.keyProps[this.keyProps.length-1].line;return(this.minLine+this.maxLine)/2<3?Q.UP:Q.DOWN}calculateKeyProps(){let t;for(let e=0;e0&&(this.keyProps[e-1].displaced=!0)),t=a,this.keyProps.push(n)}t=void 0,this.keyProps.forEach((e=>{t&&e.linet.line-e.line))}getBoundingBox(){var t,e;if(!this.preFormatted)throw new l("UnformattedNote","Can't call getBoundingBox on an unformatted note.");const{width:i,modLeftPx:s,leftDisplacedHeadPx:n}=this.getMetrics(),a=this.getAbsoluteX()-s-n;let o=0,r=0;const h=(null!==(e=null===(t=this.getStave())||void 0===t?void 0:t.getSpacingBetweenLines())&&void 0!==e?e:0)/2,c=2*h;if(this.isRest()){const t=this.ys[0],e=K.durationToFraction(this.duration);e.equals(1)||e.equals(2)?(o=t-h,r=t+h):(o=t-this.glyph.line_above*c,r=t+this.glyph.line_below*c)}else if(this.glyph.stem){const t=this.getStemExtents();t.baseY+=h*this.getStemDirection(),o=Math.min(t.topY,t.baseY),r=Math.max(t.topY,t.baseY)}else{o=0,r=0;for(let t=0;te&&(e=s):s1}hasStem(){return this.glyph.stem}hasFlag(){return super.hasFlag()&&!this.isRest()}getStemX(){return"r"===this.noteType?this.getCenterGlyphX():super.getStemX()+(this.stem_direction?Q.WIDTH/(2*-this.stem_direction):0)}getYForTopText(t){const e=this.getStemExtents();return Math.min(this.checkStave().getYForTopText(t),e.topY-this.render_options.annotation_spacing*(t+1))}getYForBottomText(t){const e=this.getStemExtents();return Math.max(this.checkStave().getYForTopText(t),e.baseY+this.render_options.annotation_spacing*t)}setStave(t){super.setStave(t);const e=this._noteHeads.map((e=>(e.setStave(t),e.getY())));if(this.setYs(e),this.stem){const{y_top:t,y_bottom:e}=this.getNoteHeadBounds();this.stem.setYBounds(t,e)}return this}isDisplaced(){return this.displaced}setNoteDisplaced(t){return this.displaced=t,this}getTieRightX(){let t=this.getAbsoluteX();return t+=this.getGlyphWidth()+this.x_shift+this.rightDisplacedHeadPx,this.modifierContext&&(t+=this.modifierContext.getRightShift()),t}getTieLeftX(){let t=this.getAbsoluteX();return t+=this.x_shift-this.leftDisplacedHeadPx,t}getLineForRest(){let t=this.keyProps[0].line;if(this.keyProps.length>1){const e=this.keyProps[this.keyProps.length-1].line;t=u(Math.max(t,e),Math.min(t,e))}return t}getModifierStartXY(t,e,i={}){var s,n;if(!this.preFormatted)throw new l("UnformattedNote","Can't call GetModifierStartXY on an unformatted note");if(0===this.ys.length)throw new l("NoYValues","No Y-Values calculated for this note.");const{ABOVE:a,BELOW:o,LEFT:r,RIGHT:h}=O.Position;let c=0;return t===r?c=-2:t===h?(c=this.getGlyphWidth()+this.x_shift+2,this.stem_direction===Q.UP&&this.hasFlag()&&(i.forceFlagRight||((t,e)=>e===(t.getStemDirection()===Q.UP?t.keyProps.length-1:0))(this,e))&&(c+=null!==(n=null===(s=null==this?void 0:this.flag)||void 0===s?void 0:s.getMetrics().width)&&void 0!==n?n:0)):t!==o&&t!==a||(c=this.getGlyphWidth()/2),{x:this.getAbsoluteX()+c,y:this.ys[e]}}setStyle(t){var e;return super.setStyle(t),this._noteHeads.forEach((e=>e.setStyle(t))),null===(e=this.stem)||void 0===e||e.setStyle(t),this}setStemStyle(t){const e=this.getStem();return null==e||e.setStyle(t),this}getStemStyle(){var t;return null===(t=this.stem)||void 0===t?void 0:t.getStyle()}setLedgerLineStyle(t){this.ledgerLineStyle=t}getLedgerLineStyle(){return this.ledgerLineStyle}setFlagStyle(t){this.flagStyle=t}getFlagStyle(){return this.flagStyle}setKeyStyle(t,e){return this._noteHeads[t].setStyle(e),this}setKeyLine(t,e){return this.keyProps[t].line=e,this.reset(),this}getKeyLine(t){return this.keyProps[t].line}getVoiceShiftWidth(){return this.getGlyphWidth()*(this.displaced?2:1)}calcNoteDisplacements(){this.setLeftDisplacedHeadPx(this.displaced&&this.stem_direction===Q.DOWN?this.getGlyphWidth():0),this.setRightDisplacedHeadPx(!this.hasFlag()&&this.displaced&&this.stem_direction===Q.UP?this.getGlyphWidth():0)}preFormat(){if(this.preFormatted)return;let t=0;this.modifierContext&&(this.modifierContext.preFormat(),0===this.modifierContext.getWidth()&&(t=Yt.minNoteheadPadding));let e=this.getGlyphWidth()+this.leftDisplacedHeadPx+this.rightDisplacedHeadPx+t;this.shouldDrawFlag()&&this.stem_direction===Q.UP&&(e+=this.getGlyphWidth()),this.setWidth(e),this.preFormatted=!0}getNoteHeadBounds(){let t,e,i,s,n=1/0,a=-1/0,o=this.checkStave().getNumLines(),r=1,h=o,c=r;return this._noteHeads.forEach((l=>{const b=l.getLine(),d=l.getY();n=Math.min(d,n),a=Math.max(d,a),void 0===e&&l.isDisplaced()&&(e=l.getAbsoluteX()),void 0!==t||l.isDisplaced()||(t=l.getAbsoluteX()),o=Math.max(b,o),r=Math.min(b,r),l.isDisplaced()?(i=void 0===i?b:Math.max(b,i),s=void 0===s?b:Math.min(b,s)):(h=Math.max(b,h),c=Math.min(b,c))}),this),{y_top:n,y_bottom:a,displaced_x:e,non_displaced_x:t,highest_line:o,lowest_line:r,highest_displaced_line:i,lowest_displaced_line:s,highest_non_displaced_line:h,lowest_non_displaced_line:c}}getNoteHeadBeginX(){return this.getAbsoluteX()+this.x_shift}getNoteHeadEndX(){return this.getNoteHeadBeginX()+this.getGlyphWidth()}get noteHeads(){return this._noteHeads.slice()}get note_heads(){return console.warn("StaveNote.note_heads is deprecated. Use StaveNote.noteHeads instead.","This accessor will be removed in VexFlow 5.0."),this.noteHeads}drawLedgerLines(){const t=this.checkStave(),{glyph:e,render_options:{stroke_px:i}}=this,s=this.checkContext(),n=e.getWidth()+2*i,a=2*(e.getWidth()+i)-Q.WIDTH/2;if(this.isRest())return;if(!s)throw new l("NoCanvasContext","Can't draw without a canvas context.");const{highest_line:o,lowest_line:r,highest_displaced_line:h,highest_non_displaced_line:c,lowest_displaced_line:b,lowest_non_displaced_line:d,displaced_x:m,non_displaced_x:g}=this.getNoteHeadBounds();if(o<6&&r>0)return;const u=Math.min(null!=m?m:0,null!=g?g:0),p=(t,e,o)=>{let r;r=o&&e?u-i:e?(null!=g?g:0)-i:(null!=m?m:0)-i;const h=e&&o?a:n;s.beginPath(),s.moveTo(r,t),s.lineTo(r+h,t),s.stroke()},_=Object.assign(Object.assign({},t.getDefaultLedgerLineStyle()),this.getLedgerLineStyle());this.applyStyle(s,_);for(let e=6;e<=o;++e){const i=void 0!==g&&e<=c,s=void 0!==h&&e<=h;p(t.getYForNote(e),i,s)}for(let e=0;e>=r;--e){const i=void 0!==g&&e>=d,s=void 0!==b&&e>=b;p(t.getYForNote(e),i,s)}this.restoreStyle(s,_)}drawModifiers(){const t=this.checkContext();t.openGroup("modifiers");for(let e=0;e{t.openGroup("notehead",void 0,{pointerBBox:!0}),e.setContext(t).draw(),t.closeGroup()}))}drawStem(t){var e;const i=this.checkContext();t&&this.setStem(new Q(t)),this.shouldDrawFlag()&&this.stem&&this.stem.adjustHeightForFlag(),i.openGroup("stem",void 0,{pointerBBox:!0}),null===(e=this.stem)||void 0===e||e.setContext(i).draw(),i.closeGroup()}getStemExtension(){const t=super.getStemExtension();if(!this.glyph.stem)return t;const e=this.getStemDirection();if(e!==this.calculateOptimalStemDirection())return t;let i;i=e===Q.UP?3-this.maxLine:this.minLine-3;const s=i-3.5;if(s<=0)return t;const n=this.getStave();let a=10;return null!=n&&(a=n.getSpacingBetweenLines()),t+s*a}draw(){var t;if(0===this.ys.length)throw new l("NoYValues","Can't draw note without Y values.");const e=this.checkContext(),i=this.getNoteHeadBeginX(),s=this.hasStem()&&!this.beam;this._noteHeads.forEach((t=>t.setX(i)));const n=this.getStemX();null===(t=this.stem)||void 0===t||t.setNoteHeadXBounds(n,n),function(...t){Yt.DEBUG&&m("Vex.Flow.StaveNote",t)}("Rendering ",this.isChord()?"chord :":"note :",this.keys),this.applyStyle(),this.setAttribute("el",e.openGroup("stavenote",this.getAttribute("id"))),this.drawLedgerLines(),e.openGroup("note",void 0,{pointerBBox:!0}),s&&this.drawStem(),this.drawNoteHeads(),this.drawFlag(),e.closeGroup(),this.drawModifiers(),e.closeGroup(),this.restoreStyle(),this.setRendered()}}function zt(t){if(!t)return!1;const e=b();return"function"==typeof e.HTMLCanvasElement&&t instanceof e.HTMLCanvasElement||"function"==typeof t.getContext&&"function"==typeof t.toDataURL}Yt.DEBUG=!1;class Ht extends mt{constructor(t){super(),this.textHeight=0,this.context2D=t,t.canvas?this.canvas=t.canvas:this.canvas={width:Ht.WIDTH,height:Ht.HEIGHT}}static get WIDTH(){return 600}static get HEIGHT(){return 400}static get CANVAS_BROWSER_SIZE_LIMIT(){return 32767}static sanitizeCanvasDims(t,e){const i=this.CANVAS_BROWSER_SIZE_LIMIT;return Math.max(t,e)>i&&(g("Canvas dimensions exceed browser limit. Cropping to "+i),t>i&&(t=i),e>i&&(e=i)),[t,e]}clear(){this.context2D.clearRect(0,0,this.canvas.width,this.canvas.height)}openGroup(t,e,i){}closeGroup(){}add(t){}setFillStyle(t){return this.context2D.fillStyle=t,this}setBackgroundFillStyle(t){return this}setStrokeStyle(t){return this.context2D.strokeStyle=t,this}setShadowColor(t){return this.context2D.shadowColor=t,this}setShadowBlur(t){const e=this.context2D.getTransform(),i=Math.sqrt(e.a*e.a+e.b*e.b+e.c*e.c+e.d*e.d);return this.context2D.shadowBlur=i*t,this}setLineWidth(t){return this.context2D.lineWidth=t,this}setLineCap(t){return this.context2D.lineCap=t,this}setLineDash(t){return this.context2D.setLineDash(t),this}scale(t,e){return this.context2D.scale(t,e),this}resize(t,e){const i=this.context2D.canvas,s=b().devicePixelRatio||1;return[t,e]=Ht.sanitizeCanvasDims(t*s,e*s),t=t/s|0,e=e/s|0,i.width=t*s,i.height=e*s,zt(i)&&(i.style.width=t+"px",i.style.height=e+"px"),this.scale(s,s)}rect(t,e,i,s){return this.context2D.rect(t,e,i,s),this}fillRect(t,e,i,s){return this.context2D.fillRect(t,e,i,s),this}clearRect(t,e,i,s){return this.context2D.clearRect(t,e,i,s),this}beginPath(){return this.context2D.beginPath(),this}moveTo(t,e){return this.context2D.moveTo(t,e),this}lineTo(t,e){return this.context2D.lineTo(t,e),this}bezierCurveTo(t,e,i,s,n,a){return this.context2D.bezierCurveTo(t,e,i,s,n,a),this}quadraticCurveTo(t,e,i,s){return this.context2D.quadraticCurveTo(t,e,i,s),this}arc(t,e,i,s,n,a){return this.context2D.arc(t,e,i,s,n,a),this}fill(){return this.context2D.fill(),this}stroke(){return this.context2D.stroke(),this}closePath(){return this.context2D.closePath(),this}measureText(t){const e=this.context2D.measureText(t);let i=0,s=0;return e.fontBoundingBoxAscent?(i=-e.fontBoundingBoxAscent,s=e.fontBoundingBoxDescent+e.fontBoundingBoxAscent):(i=-e.actualBoundingBoxAscent,s=e.actualBoundingBoxDescent+e.actualBoundingBoxAscent),{x:0,y:i,width:e.width,height:s}}fillText(t,e,i){return this.context2D.fillText(t,e,i),this}save(){return this.context2D.save(),this}restore(){return this.context2D.restore(),this}set fillStyle(t){this.context2D.fillStyle=t}get fillStyle(){return this.context2D.fillStyle}set strokeStyle(t){this.context2D.strokeStyle=t}get strokeStyle(){return this.context2D.strokeStyle}setFont(t,e,i,s){const n=k.validate(t,e,i,s);return this.context2D.font=k.toCSSString(n),this.textHeight=k.convertSizeToPixelValue(n.size),this}getFont(){return this.context2D.font}}const jt={path:{x:!0,y:!0,width:!0,height:!0,"font-family":!0,"font-weight":!0,"font-style":!0,"font-size":!0},rect:{"font-family":!0,"font-weight":!0,"font-style":!0,"font-size":!0},text:{width:!0,height:!0}},Xt="http://www.w3.org/2000/svg",Vt=2*Math.PI;class Kt extends mt{constructor(t){super(),this.width=0,this.height=0,this.backgroundFillStyle="white",this.fontCSSString="",this.element=t;const e=this.create("svg");this.element.appendChild(e),this.svg=e,this.parent=this.svg,this.groups=[this.svg],this.path="",this.pen={x:NaN,y:NaN},this.lineWidth=1;const i={"font-family":k.SANS_SERIF,"font-size":k.SIZE+"pt","font-weight":T.NORMAL,"font-style":w.NORMAL};this.state=Object.assign({scale:{x:1,y:1}},i),this.attributes=Object.assign({"stroke-width":.3,"stroke-dasharray":"none",fill:"black",stroke:"black"},i),this.shadow_attributes={width:0,color:"black"},this.state_stack=[]}create(t){return document.createElementNS(Xt,t)}openGroup(t,e,i){const s=this.create("g");return this.groups.push(s),this.parent.appendChild(s),this.parent=s,t&&s.setAttribute("class",p(t)),e&&s.setAttribute("id",p(e)),i&&i.pointerBBox&&s.setAttribute("pointer-events","bounding-box"),s}closeGroup(){this.groups.pop(),this.parent=this.groups[this.groups.length-1]}add(t){this.parent.appendChild(t)}setFillStyle(t){return this.attributes.fill=t,this}setBackgroundFillStyle(t){return this.backgroundFillStyle=t,this}setStrokeStyle(t){return this.attributes.stroke=t,this}setShadowColor(t){return this.shadow_attributes.color=t,this}setShadowBlur(t){return this.shadow_attributes.width=t,this}setLineWidth(t){return this.attributes["stroke-width"]=t,this.lineWidth=t,this}setLineDash(t){if("[object Array]"===Object.prototype.toString.call(t))return this.attributes["stroke-dasharray"]=t.join(","),this;throw new l("ArgumentError","lineDash must be an array of integers.")}setLineCap(t){return this.attributes["stroke-linecap"]=t,this}resize(t,e){this.width=t,this.height=e,this.element.style.width=t.toString(),this.svg.style.width=t.toString(),this.svg.style.height=e.toString();const i={width:t,height:e};return this.applyAttributes(this.svg,i),this.scale(this.state.scale.x,this.state.scale.y),this}scale(t,e){this.state.scale={x:t,y:e};const i=this.width/t,s=this.height/e;return this.setViewBox(0,0,i,s),this}setViewBox(t,e,i,s){if("string"==typeof t)this.svg.setAttribute("viewBox",t);else{const n=t+" "+e+" "+i+" "+s;this.svg.setAttribute("viewBox",n)}}applyAttributes(t,e){const i=jt[t.nodeName];for(const s in e)i&&i[s]||t.setAttributeNS(null,s,e[s]);return t}clear(){for(;this.svg.lastChild;)this.svg.removeChild(this.svg.lastChild);this.scale(this.state.scale.x,this.state.scale.y)}rect(t,e,i,s,n){s<0&&(e+=s,s*=-1);const a=this.create("rect");return n=null!=n?n:{fill:"none","stroke-width":this.lineWidth,stroke:"black"},this.applyAttributes(a,Object.assign({x:t,y:e,width:i,height:s},n)),this.add(a),this}fillRect(t,e,i,s){const n={fill:this.attributes.fill};return this.rect(t,e,i,s,n),this}clearRect(t,e,i,s){return this.rect(t,e,i,s,{"stroke-width":0,fill:this.backgroundFillStyle}),this}beginPath(){return this.path="",this.pen.x=NaN,this.pen.y=NaN,this}moveTo(t,e){return this.path+="M"+t+" "+e,this.pen.x=t,this.pen.y=e,this}lineTo(t,e){return this.path+="L"+t+" "+e,this.pen.x=t,this.pen.y=e,this}bezierCurveTo(t,e,i,s,n,a){return this.path+="C"+t+" "+e+","+i+" "+s+","+n+" "+a,this.pen.x=n,this.pen.y=a,this}quadraticCurveTo(t,e,i,s){return this.path+="Q"+t+" "+e+","+i+" "+s,this.pen.x=i,this.pen.y=s,this}arc(t,e,i,s,n,a){const o=t+i*Math.cos(s),r=e+i*Math.sin(s);if(!a&&n-s>=Vt||a&&s-n>=Vt){const n=t+i*Math.cos(s+Math.PI),a=e+i*Math.sin(s+Math.PI);this.path+=`M${o} ${r} A${i} ${i} 0 0 0 ${n} ${a} `,this.path+=`A${i} ${i} 0 0 0 ${o} ${r}`,this.pen.x=o,this.pen.y=r}else{const h=t+i*Math.cos(n),c=e+i*Math.sin(n);let l;s=_(s),n=_(n),l=Math.abs(n-s)n&&(l=!l);const b=!a;this.path+=`M${o} ${r} A${i} ${i} 0 ${+l} ${+b} ${h} ${c}`,this.pen.x=h,this.pen.y=c}return this}closePath(){return this.path+="Z",this}getShadowStyle(){const t=this.shadow_attributes;return`filter: drop-shadow(0 0 ${t.width/1.5}px ${t.color})`}fill(t){const e=this.create("path");return void 0===t&&(t=Object.assign(Object.assign({},this.attributes),{stroke:"none"})),t.d=this.path,this.shadow_attributes.width>0&&(t.style=this.getShadowStyle()),this.applyAttributes(e,t),this.add(e),this}stroke(){const t=this.create("path"),e=Object.assign(Object.assign({},this.attributes),{fill:"none","stroke-width":this.lineWidth,d:this.path});return this.shadow_attributes.width>0&&(e.style=this.getShadowStyle()),this.applyAttributes(t,e),this.add(t),this}measureText(t){return Kt.measureTextCache.lookup(t,this.svg,this.attributes)}fillText(t,e,i){if(!t||t.length<=0)return this;const s=Object.assign(Object.assign({},this.attributes),{stroke:"none",x:e,y:i}),n=this.create("text");return n.textContent=t,this.applyAttributes(n,s),this.add(n),this}save(){return this.state_stack.push({state:{"font-family":this.state["font-family"],"font-weight":this.state["font-weight"],"font-style":this.state["font-style"],"font-size":this.state["font-size"],scale:this.state.scale},attributes:{"font-family":this.attributes["font-family"],"font-weight":this.attributes["font-weight"],"font-style":this.attributes["font-style"],"font-size":this.attributes["font-size"],fill:this.attributes.fill,stroke:this.attributes.stroke,"stroke-width":this.attributes["stroke-width"],"stroke-dasharray":this.attributes["stroke-dasharray"]},shadow_attributes:{width:this.shadow_attributes.width,color:this.shadow_attributes.color},lineWidth:this.lineWidth}),this}restore(){const t=this.state_stack.pop();if(t){const e=t;this.state["font-family"]=e.state["font-family"],this.state["font-weight"]=e.state["font-weight"],this.state["font-style"]=e.state["font-style"],this.state["font-size"]=e.state["font-size"],this.state.scale=e.state.scale,this.attributes["font-family"]=e.attributes["font-family"],this.attributes["font-weight"]=e.attributes["font-weight"],this.attributes["font-style"]=e.attributes["font-style"],this.attributes["font-size"]=e.attributes["font-size"],this.attributes.fill=e.attributes.fill,this.attributes.stroke=e.attributes.stroke,this.attributes["stroke-width"]=e.attributes["stroke-width"],this.attributes["stroke-dasharray"]=e.attributes["stroke-dasharray"],this.shadow_attributes.width=e.shadow_attributes.width,this.shadow_attributes.color=e.shadow_attributes.color,this.lineWidth=e.lineWidth}return this}set fillStyle(t){this.setFillStyle(t)}get fillStyle(){return this.attributes.fill}set strokeStyle(t){this.setStrokeStyle(t)}get strokeStyle(){return this.attributes.stroke}setFont(t,e,i,s){const n=k.validate(t,e,i,s);this.fontCSSString=k.toCSSString(n);const a={"font-family":n.family,"font-size":n.size,"font-weight":n.weight,"font-style":n.style};return this.attributes=Object.assign(Object.assign({},this.attributes),a),this.state=Object.assign(Object.assign({},this.state),a),this}getFont(){return this.fontCSSString}}var $t,qt,Jt,Qt;Kt.measureTextCache=new class{constructor(){this.cache={}}lookup(t,e,i){let s=this.cache[t];void 0===s&&(s={},this.cache[t]=s);const n=`${i["font-family"]}%${i["font-size"]}%${i["font-weight"]}%${i["font-style"]}`;let a=s[n];return void 0===a&&(a=this.measureImpl(t,e,i),s[n]=a),a}measureImpl(t,e,i){let s=this.txt;s||(s=document.createElementNS(Xt,"text"),this.txt=s),s.textContent=t,s.setAttributeNS(null,"font-family",i["font-family"]),s.setAttributeNS(null,"font-size",i["font-size"]),s.setAttributeNS(null,"font-style",i["font-style"]),s.setAttributeNS(null,"font-weight",i["font-weight"]),e.appendChild(s);const n=s.getBBox();return e.removeChild(s),{x:n.x,y:n.y,width:n.width,height:n.height}}},function(t){t[t.CANVAS=1]="CANVAS",t[t.SVG=2]="SVG"}($t||($t={})),function(t){t[t.NONE=1]="NONE",t[t.UP=2]="UP",t[t.DOWN=3]="DOWN"}(qt||(qt={}));class Zt{constructor(t,e){if(i(t,c.RenderContext))this.ctx=t;else{if(void 0===e)throw new l("InvalidArgument","Missing backend argument");const i=e;let s;if("string"==typeof t){const e=document.getElementById(t);if(!e)throw new l("BadElementId",`Can't find element with ID "${e}"`);s=e}else s=t;if(i===Zt.Backends.CANVAS){if(!zt(s))throw new l("BadElement","CANVAS context requires an HTMLCanvasElement.");const t=s.getContext("2d");if(!t)throw new l("BadElement","Can't get canvas context");this.ctx=new Ht(t)}else{if(i!==Zt.Backends.SVG)throw new l("InvalidBackend",`No support for backend: ${i}`);if(!function(t){if(!t)return!1;const e=b();return"function"==typeof e.HTMLDivElement&&t instanceof e.HTMLDivElement||"function"==typeof t.appendChild&&"object"==typeof t.style}(s))throw new l("BadElement","SVG context requires an HTMLDivElement.");this.ctx=new Kt(s)}}}static buildContext(t,e,i,s,n="#FFF"){const a=new Zt(t,e);i&&s&&a.resize(i,s);const o=a.getContext();return o.setBackgroundFillStyle(n),Zt.lastContext=o,o}static getCanvasContext(t,e,i,s){return Zt.buildContext(t,Zt.Backends.CANVAS,e,i,s)}static getSVGContext(t,e,i,s){return Zt.buildContext(t,Zt.Backends.SVG,e,i,s)}static drawDashedLine(t,e,i,s,n,a){t.beginPath();const o=s-e,r=n-i,h=Math.atan2(r,o);let c=e,l=i;t.moveTo(e,i);let b=0,d=!0;for(;!(o<0?c<=s:c>=s)||!(r<0?l<=n:l>=n);){const e=a[b++%a.length],i=c+Math.cos(h)*e;c=o<0?Math.max(s,i):Math.min(s,i);const m=l+Math.sin(h)*e;l=r<0?Math.max(n,m):Math.min(n,m),d?t.lineTo(c,l):t.moveTo(c,l),d=!d}t.closePath(),t.stroke()}resize(t,e){return this.ctx.resize(t,e),this}getContext(){return this.ctx}}Zt.Backends=$t,Zt.LineEndType=qt,Zt.lastContext=void 0;class te extends O{constructor(t){super(),this.string_number=t,this.setWidth(20),this.position=O.Position.ABOVE,this.x_shift=0,this.y_shift=0,this.text_line=0,this.stem_offset=0,this.x_offset=0,this.y_offset=0,this.dashed=!0,this.leg=Zt.LineEndType.NONE,this.radius=8,this.resetFont()}static get CATEGORY(){return c.StringNumber}static get metrics(){return K.currentMusicFont().getMetrics().glyphs.stringNumber}static format(t,e){const i=e.left_shift,s=e.right_shift;if(!t||0===t.length)return!1;const n=[];let a=null,r=0,h=0;for(let c=0;ce.line-t.line));let c=0,b=0,d=0,m=null,g=null;for(let t=0;tb?e:b):o===O.Position.RIGHT&&(h.setXShift(c),e+=p,d=e>d?e:d),m=l,g=a}return e.left_shift+=b,e.right_shift+=d,!0}setLineEndType(t){return t>=Zt.LineEndType.NONE&&t<=Zt.LineEndType.DOWN&&(this.leg=t),this}setStringNumber(t){return this.string_number=t,this}setOffsetX(t){return this.x_offset=t,this}setOffsetY(t){return this.y_offset=t,this}setLastNote(t){return this.last_note=t,this}setDashed(t){return this.dashed=t,this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.getModifierStartXY(this.position,this.index),s=e.hasStem()?e.getStemDirection():Q.UP;let n=i.x+this.x_shift+this.x_offset,a={};e.hasStem()&&(a=e.checkStem().getExtents());let o=i.y+this.y_shift+this.y_offset;switch(this.position){case O.Position.ABOVE:o=e.getYs().reduce(((t,e)=>tt>e?t:e)),e.hasStem()&&s==Q.DOWN&&(o=a.topY-te.metrics.stemPadding),o+=this.radius+te.metrics.verticalPadding+this.text_line*K.STAVE_LINE_DISTANCE;break;case O.Position.LEFT:n-=this.radius/2+te.metrics.leftPadding;break;case O.Position.RIGHT:n+=this.radius/2+te.metrics.rightPadding;break;default:throw new l("InvalidPosition",`The position ${this.position} is invalid`)}t.save(),t.beginPath(),t.arc(n,o,this.radius,0,2*Math.PI,!1),t.setLineWidth(1.5),t.stroke(),t.setFont(this.textFont);const h=n-t.measureText(this.string_number).width/2;t.fillText(""+this.string_number,h,o+4.5);const c=this.last_note;if(r(c)){const i=c.getStemX()-e.getX()+5;let s,a;switch(t.setStrokeStyle("#000000"),t.setLineCap("round"),t.setLineWidth(.6),this.dashed?Zt.drawDashedLine(t,n+10,o,n+i,o,[3,3]):Zt.drawDashedLine(t,n+10,o,n+i,o,[3,0]),this.leg){case Zt.LineEndType.UP:s=-10,a=this.dashed?[3,3]:[3,0],Zt.drawDashedLine(t,n+i,o,n+i,o+s,a);break;case Zt.LineEndType.DOWN:s=10,a=this.dashed?[3,3]:[3,0],Zt.drawDashedLine(t,n+i,o,n+i,o+s,a)}}t.restore()}}te.TEXT_FONT={family:k.SANS_SERIF,size:k.SIZE,weight:T.BOLD,style:w.NORMAL};class ee extends O{constructor(t,e){super(),this.options=Object.assign({all_voices:!0},e),this.all_voices=this.options.all_voices,this.type=t,this.position=O.Position.LEFT,this.render_options={font_scale:38},this.resetFont(),this.setXShift(0),this.setWidth(10)}static get CATEGORY(){return c.Stroke}static format(t,e){const i=e.left_shift;if(!t||0===t.length)return!1;const s=t.map((t=>{const e=t.getNote(),i=t.checkIndex();if(o(e)){const{line:s}=e.getKeyProps()[i];return{line:s,shift:e.getLeftDisplacedHeadPx(),stroke:t}}if(h(e)){const{str:s}=e.getPositions()[i];return{line:s,shift:0,stroke:t}}throw new l("Internal","Unexpected instance.")})),n=i,a=s.reduce(((t,{stroke:e,shift:i})=>(e.setXShift(n+i),Math.max(e.getWidth()+0,t))),0);return e.left_shift+=a,!0}getPosition(){return this.position}addEndNote(t){return this.note_end=t,this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.getModifierStartXY(this.position,this.index);let s=e.getYs(),n=i.y,r=i.y;const h=i.x-5,c=e.checkStave().getSpacingBetweenLines(),b=this.checkModifierContext().getMembers(e.getCategory());for(let t=0;t0){s-=o.map((t=>t.getTextHeight())).reduce(((t,e)=>t>e?t:e))/K.STAVE_LINE_DISTANCE+1}else e.top_text_line+=1;for(let e=0;e=t.line?i.above:i.below}}this.placeGlyphOnLine(s,this.checkStave(),t.line),this.glyphs.push(s);const a=this.xPositions[this.xPositions.length-1],o=s.getMetrics().width+n;this.xPositions.push(a+o),this.width+=o}cancelKey(t){return this.formatted=!1,this.cancelKeySpec=t,this}convertToCancelAccList(t){const e=K.keySignature(t),i=this.accList.length>0&&e.length>0&&e[0].type!==this.accList[0].type,s=i?e.length:e.length-this.accList.length;if(s<1)return;const n=[];for(let t=0;t0?e[0].type:void 0;let s;if(this.cancelKeySpec&&(s=this.convertToCancelAccList(this.cancelKeySpec)),this.alterKeySpec&&this.convertToAlterAccList(this.alterKeySpec),this.accList.length>0){const n=(this.position===pt.END?t.getEndClef():t.getClef())||t.getClef();s&&this.convertAccLines(n,s.type,s.accList),this.convertAccLines(n,i,e);for(let t=0;t0?"PlusSmall":"Plus";break;case"(":s=i.length>0?"ParensLeftSmall":"ParensLeft";break;case")":s=i.length>0?"ParensRightSmall":"ParensRight"}const n=new R("timeSig"+s,this.timeSignature.point);this.topGlyphs.push(n),r+=null!==(o=n.getMetrics().width)&&void 0!==o?o:0}let h=0;for(let t=0;t0?e.getYForLine(this.timeSignature.topLine):(e.getYForLine(this.timeSignature.topLine)+e.getYForLine(this.timeSignature.bottomLine))/2;for(let t=0;t{const e=t.split("/");if(2!==e.length&&"+"!==e[0]&&"-"!==e[0])throw new l("BadTimeSignature",`Invalid time spec: ${t}. Must be in the form "/"`);e.forEach((e=>{if(0==/^[0-9+\-()]+$/.test(e))throw new l("BadTimeSignature",`Invalid time spec: ${t}. Must contain valid signatures.`)}))})(t);const s=t.split("/");return{num:!0,glyph:this.makeTimeSignatureGlyph(null!==(e=s[0])&&void 0!==e?e:"",null!==(i=s[1])&&void 0!==i?i:"")}}makeTimeSignatureGlyph(t,e){return new me(this,t,e,"timeSig0",this.point)}getInfo(){return this.info}setTimeSig(t){return this.info=this.parseTimeSpec(t),this}draw(){const t=this.checkStave(),e=t.checkContext();this.setRendered(),e.openGroup("timesignature",this.getAttribute("id")),this.info.glyph.setStave(t),this.info.glyph.setContext(e),this.placeGlyphOnLine(this.info.glyph,t,this.info.line),this.info.glyph.renderToStave(this.x),e.closeGroup()}}const ue={[vt.CATEGORY]:0,[ae.CATEGORY]:1,[oe.CATEGORY]:2,[ge.CATEGORY]:3},pe={[ge.CATEGORY]:0,[oe.CATEGORY]:1,[vt.CATEGORY]:2,[ae.CATEGORY]:3};class _e extends A{constructor(t,e,i,s){super(),this.height=0,this.x=t,this.y=e,this.width=i,this.formatted=!1,this.start_x=t+5,this.end_x=t+i,this.modifiers=[],this.measure=0,this.clef="treble",this.endClef=void 0,this.resetFont(),this.options=Object.assign({vertical_bar_width:10,num_lines:5,fill_style:"#999999",left_bar:!0,right_bar:!0,spacing_between_lines_px:K.STAVE_LINE_DISTANCE,space_above_staff_ln:4,space_below_staff_ln:4,top_text_position:1,bottom_text_position:4,line_config:[]},s),this.bounds={x:this.x,y:this.y,w:this.width,h:0},this.defaultLedgerLineStyle={strokeStyle:"#444",lineWidth:1.4},this.resetLines(),this.addModifier(new vt(this.options.left_bar?_t.SINGLE:_t.NONE)),this.addEndModifier(new vt(this.options.right_bar?_t.SINGLE:_t.NONE))}static get CATEGORY(){return c.Stave}static get defaultPadding(){const t=K.currentMusicFont();return t.lookupMetric("stave.padding")+t.lookupMetric("stave.endPaddingMax")}static get rightPadding(){return K.currentMusicFont().lookupMetric("stave.endPaddingMax")}setDefaultLedgerLineStyle(t){this.defaultLedgerLineStyle=t}getDefaultLedgerLineStyle(){return Object.assign(Object.assign({},this.getStyle()),this.defaultLedgerLineStyle)}space(t){return this.options.spacing_between_lines_px*t}resetLines(){this.options.line_config=[];for(let t=0;ti.getWidth()&&(e-=i.getWidth()),e}setRepetitionType(t,e=0){return this.modifiers.push(new re(t,this.x,e)),this}setVoltaType(t,e,i){return this.modifiers.push(new de(t,e,this.x,i)),this}setSection(t,e,i=0,s){const n=new he(t,this.x+i,e);return s&&n.setFontSize(s),this.modifiers.push(n),this}setTempo(t,e){return this.modifiers.push(new ce(t,this.x,e)),this}setText(t,e,i={}){return this.modifiers.push(new be(t,e,i)),this}getHeight(){return this.height}getSpacingBetweenLines(){return this.options.spacing_between_lines_px}getBoundingBox(){return new y(this.x,this.y,this.width,this.getBottomY()-this.y)}getBottomY(){const t=this.options,e=t.spacing_between_lines_px;return this.getYForLine(t.num_lines)+t.space_below_staff_ln*e}getBottomLineY(){return this.getYForLine(this.options.num_lines)}getYForLine(t){const e=this.options,i=e.spacing_between_lines_px,s=e.space_above_staff_ln;return this.y+t*i+s*i}getLineForY(t){const e=this.options,i=e.spacing_between_lines_px,s=e.space_above_staff_ln;return(t-this.y)/i-s}getYForTopText(t=0){return this.getYForLine(-t-this.options.top_text_position)}getYForBottomText(t=0){return this.getYForLine(this.options.bottom_text_position+t)}getYForNote(t){const e=this.options,i=e.spacing_between_lines_px,s=e.space_above_staff_ln;return this.y+s*i+5*i-t*i}getYForGlyphs(){return this.getYForLine(3)}addModifier(t,e){return void 0!==e&&t.setPosition(e),t.setStave(this),this.formatted=!1,this.modifiers.push(t),this}addEndModifier(t){return this.addModifier(t,pt.END),this}setBegBarType(t){const{SINGLE:e,REPEAT_BEGIN:i,NONE:s}=_t;return t!==e&&t!==i&&t!==s||(this.modifiers[0].setType(t),this.formatted=!1),this}setEndBarType(t){return t!==_t.REPEAT_BEGIN&&(this.modifiers[1].setType(t),this.formatted=!1),this}setClef(t,e,i,s){void 0===s&&(s=pt.BEGIN),s===pt.END?this.endClef=t:this.clef=t;const n=this.getModifiers(s,ae.CATEGORY);return 0===n.length?this.addClef(t,e,i,s):n[0].setType(t,e,i),this}getClef(){return this.clef}setEndClef(t,e,i){return this.setClef(t,e,i,pt.END),this}getEndClef(){return this.endClef}setKeySignature(t,e,i){void 0===i&&(i=pt.BEGIN);const s=this.getModifiers(i,oe.CATEGORY);return 0===s.length?this.addKeySignature(t,e,i):s[0].setKeySig(t,e),this}setEndKeySignature(t,e){return this.setKeySignature(t,e,pt.END),this}setTimeSignature(t,e,i){void 0===i&&(i=pt.BEGIN);const s=this.getModifiers(i,ge.CATEGORY);return 0===s.length?this.addTimeSignature(t,e,i):s[0].setTimeSig(t),this}setEndTimeSignature(t,e){return this.setTimeSignature(t,e,pt.END),this}addKeySignature(t,e,i){return void 0===i&&(i=pt.BEGIN),this.addModifier(new oe(t,e).setPosition(i),i),this}addClef(t,e,i,s){return void 0===s||s===pt.BEGIN?this.clef=t:s===pt.END&&(this.endClef=t),this.addModifier(new ae(t,e,i),s),this}addEndClef(t,e,i){return this.addClef(t,e,i,pt.END),this}addTimeSignature(t,e,i){return this.addModifier(new ge(t,e),i),this}addEndTimeSignature(t,e){return this.addTimeSignature(t,e,pt.END),this}addTrebleGlyph(){return this.addClef("treble"),this}getModifiers(t,e){const i=void 0===t,s=void 0===e;return i&&s?this.modifiers:i?this.modifiers.filter((t=>e===t.getCategory())):s?this.modifiers.filter((e=>t===e.getPosition())):this.modifiers.filter((i=>t===i.getPosition()&&e===i.getCategory()))}sortByCategory(t,e){for(let i=t.length-1;i>=0;i--)for(let s=0;se[t[s+1].getCategory()]){const e=t[s];t[s]=t[s+1],t[s+1]=e}}format(){const t=this.modifiers[0],e=this.modifiers[1],i=this.getModifiers(pt.BEGIN),n=this.getModifiers(pt.END);let a,o,r;this.sortByCategory(i,ue),this.sortByCategory(n,pe),i.length>1&&t.getType()===_t.REPEAT_BEGIN&&(i.push(i.splice(0,1)[0]),i.splice(0,0,new vt(_t.SINGLE))),n.indexOf(e)>0&&n.splice(0,0,new vt(_t.NONE));let h=0,c=this.x;for(let t=0;t0){t.save(),t.setFont(this.textFont);const e=t.measureText(""+this.measure).width;n=this.getYForTopText(0)+3,t.fillText(""+this.measure,this.x-e/2,n),t.restore()}return t.closeGroup(),this}getVerticalBarWidth(){return this.options.vertical_bar_width}getConfigForLines(){return this.options.line_config}setConfigForLine(t,e){if(t>=this.options.num_lines||t<0)throw new l("StaveConfigError","The line number must be within the range of the number of lines in the Stave.");if(void 0===e.visible)throw new l("StaveConfigError","The line configuration object is missing the 'visible' property.");if("boolean"!=typeof e.visible)throw new l("StaveConfigError","The line configuration objects 'visible' property must be true or false.");return this.options.line_config[t]=e,this}setConfigForLines(t){if(t.length!==this.options.num_lines)throw new l("StaveConfigError","The length of the lines configuration array must match the number of lines in the Stave");for(const e in t)null==t[e].visible&&(t[e]=this.options.line_config[e]),this.options.line_config[e]=Object.assign(Object.assign({},this.options.line_config[e]),t[e]);return this.options.line_config=t,this}}function xe(t,e,i,s,n){if(e!==fe.type.BOLD_DOUBLE_LEFT&&e!==fe.type.BOLD_DOUBLE_RIGHT)throw new l("InvalidConnector","A REPEAT_BEGIN or REPEAT_END type must be provided.");let a=3,o=3.5;e===fe.type.BOLD_DOUBLE_RIGHT&&(a=-5,o=3),t.fillRect(i+a,s,1,n-s),t.fillRect(i-2,s,o,n-s)}_e.TEXT_FONT={family:k.SANS_SERIF,size:8,weight:T.NORMAL,style:w.NORMAL};class fe extends A{constructor(t,e){super(),this.thickness=K.STAVE_LINE_THICKNESS,this.width=3,this.top_stave=t,this.bottom_stave=e,this.type=fe.type.DOUBLE,this.resetFont(),this.x_shift=0,this.texts=[]}static get CATEGORY(){return c.StaveConnector}setType(t){return(t="string"==typeof t?fe.typeString[t]:t)>=fe.type.SINGLE_RIGHT&&t<=fe.type.NONE&&(this.type=t),this}setText(t,e={}){return this.texts.push({content:t,options:Object.assign({shift_x:0,shift_y:0},e)}),this}setXShift(t){if("number"!=typeof t)throw new l("InvalidType","x_shift must be a Number");return this.x_shift=t,this}getXShift(){return this.x_shift}draw(){const t=this.checkContext();this.setRendered();let e=this.top_stave.getYForLine(0),i=this.bottom_stave.getYForLine(this.bottom_stave.getNumLines()-1)+this.thickness,s=this.width,n=this.top_stave.getX();(this.type===fe.type.SINGLE_RIGHT||this.type===fe.type.BOLD_DOUBLE_RIGHT||this.type===fe.type.THIN_DOUBLE)&&(n=this.top_stave.getX()+this.top_stave.getWidth());let a=i-e;switch(this.type){case fe.type.SINGLE:case fe.type.SINGLE_LEFT:case fe.type.SINGLE_RIGHT:s=1;break;case fe.type.DOUBLE:n-=this.width+2,e-=this.thickness,a+=.5;break;case fe.type.BRACE:{s=12;const n=this.top_stave.getX()-2+this.x_shift,o=e,r=n,h=i,c=n-s,l=o+a/2,b=c-.9*s,d=o+.2*a,m=n+1.1*s,g=l-.135*a,u=m,p=l+.135*a,_=b,x=h-.2*a,f=c-s,y=x,S=n+.4*s,T=l+.135*a,w=S,v=l-.135*a,E=f,C=d;t.beginPath(),t.moveTo(n,o),t.bezierCurveTo(b,d,m,g,c,l),t.bezierCurveTo(u,p,_,x,r,h),t.bezierCurveTo(f,y,S,T,c,l),t.bezierCurveTo(w,v,E,C,n,o),t.fill(),t.stroke();break}case fe.type.BRACKET:e-=6,i+=6,a=i-e,R.renderGlyph(t,n-5,e,40,"bracketTop"),R.renderGlyph(t,n-5,i,40,"bracketBottom"),n-=this.width+2;break;case fe.type.BOLD_DOUBLE_LEFT:xe(t,this.type,n+this.x_shift,e,i-this.thickness);break;case fe.type.BOLD_DOUBLE_RIGHT:xe(t,this.type,n,e,i-this.thickness);break;case fe.type.THIN_DOUBLE:s=1,a-=this.thickness;break;case fe.type.NONE:break;default:throw new l("InvalidType",`The provided StaveConnector.type (${this.type}) is invalid.`)}this.type!==fe.type.BRACE&&this.type!==fe.type.BOLD_DOUBLE_LEFT&&this.type!==fe.type.BOLD_DOUBLE_RIGHT&&this.type!==fe.type.NONE&&t.fillRect(n,e,s,a),this.type===fe.type.THIN_DOUBLE&&t.fillRect(n-3,e,s,a),t.save(),t.setLineWidth(2),t.setFont(this.textFont);for(let e=0;et.reduce(((t,e)=>t+e),0);function Se(t,e,i){const s=we.getResolutionMultiplier(t),n={},a=[],o=[];return t.forEach(((t,r)=>{const h=new x(0,s);t.getTickables().forEach((t=>{const s=h.numerator;if(!n[s]){const t=e({tickID:s});o.push(t),n[s]=t,a.push(s)}i(t,n[s],r),h.add(t.getTicks())}))})),{map:n,array:o,list:a.sort(((t,e)=>t-e)),resolutionMultiplier:s}}function Te(t,e,i,s){let n=e;for(let e=i+1;e{e.addToModifierContext(new ne);const s=(new Ot).addTickable(e).preFormat(),n=s.getMetrics();return s.setX(t+n.totalLeftPx),t+s.getWidth()+n.totalRightPx+i}),e)}static plotDebugging(t,e,i,s,n,a){const o=i+(a=Object.assign({stavePadding:K.currentMusicFont().lookupMetric("stave.padding")},a)).stavePadding,r=e.contextGaps;t.save(),t.setFont(k.SANS_SERIF,8),r.gaps.forEach((e=>{var i,a,r;i=o+e.x1,a=o+e.x2,r="rgba(100,200,100,0.4)",t.beginPath(),t.setStrokeStyle(r),t.setFillStyle(r),t.setLineWidth(1),t.fillRect(i,s,Math.max(a-i,0),n-s),t.setFillStyle("green"),t.fillText(Math.round(e.x2-e.x1).toString(),o+e.x1,n+12)})),t.setFillStyle("red"),t.fillText(`Loss: ${(e.totalCost||0).toFixed(2)} Shift: ${(e.totalShift||0).toFixed(2)} Gap: ${r.total.toFixed(2)}`,o-20,n+27),t.restore()}static FormatAndDraw(t,e,i,s){let n={auto_beam:!1,align_rests:!1};"object"==typeof s?n=Object.assign(Object.assign({},n),s):"boolean"==typeof s&&(n.auto_beam=s);const a=new Ft(K.TIME4_4).setMode(Ft.Mode.SOFT).addTickables(i),o=n.auto_beam?Ne.applyAndGetBeams(a):[];return(new we).joinVoices([a]).formatToStave([a],e,{align_rests:n.align_rests,stave:e}),a.setStave(e).draw(t,e),o.forEach((e=>e.setContext(t).draw())),a.getBoundingBox()}static FormatAndDrawTab(t,e,i,s,n,a,o){let r={auto_beam:a,align_rests:!1};"object"==typeof o?r=Object.assign(Object.assign({},r),o):"boolean"==typeof o&&(r.auto_beam=o);const h=new Ft(K.TIME4_4).setMode(Ft.Mode.SOFT).addTickables(n),c=new Ft(K.TIME4_4).setMode(Ft.Mode.SOFT).addTickables(s),l=r.auto_beam?Ne.applyAndGetBeams(h):[];(new we).joinVoices([h]).joinVoices([c]).formatToStave([h,c],i,{align_rests:r.align_rests}),h.draw(t,i),c.draw(t,e),l.forEach((e=>e.setContext(t).draw())),new fe(i,e).setContext(t).draw()}static AlignRestsToNotes(t,e,i){t.forEach(((s,n)=>{if(o(s)&&s.isRest()){if(s.getTuplet()&&!i)return;const a=s.getGlyph().position.toUpperCase();if("R/4"!==a&&"B/4"!==a)return;if(e||s.getBeam()){const e=s.getKeyProps()[0];if(0===n)e.line=Te(t,e.line,n,!1);else if(n>0&&nwe.AlignRestsToNotes(t.getTickables(),e)))}preCalculateMinTotalWidth(t){const e=K.currentMusicFont().lookupMetric("stave.unalignedNotePadding");let i=0,s=0,n=0;const a=[],o=[];if(this.hasMinTotalWidth)return this.minTotalWidth;if(!this.tickContexts){if(!t)throw new l("BadArgument","'voices' required to run preCalculateMinTotalWidth");this.createTickContexts(t)}const{list:r,map:h}=this.tickContexts;this.minTotalWidth=0,r.forEach((e=>{const r=h[e];r.preFormat(),r.getTickables().length{s+=t.getMetrics().width,n+=t.getTicks().value(),a.push(t.getMetrics().width),o.push(t.getTicks().value())}));const c=r.getWidth();this.minTotalWidth+=c})),this.hasMinTotalWidth=!0;const c=s>0?s/a.length:1/a.length,b=ye(a.map((t=>Math.pow(t-c,2)))),d=Math.pow(b/a.length,.5)/c,m=n/o.length,g=ye(o.map((t=>Math.pow(t-m,2)))),u=Math.pow(g/o.length,.5)/m,p=Math.max(u,d)*r.length*e,_=e*i;return this.minTotalWidth+Math.max(_,p)}getMinTotalWidth(){if(!this.hasMinTotalWidth)throw new l("NoMinTotalWidth","Call 'preCalculateMinTotalWidth' or 'preFormat' before calling 'getMinTotalWidth'");return this.minTotalWidth}static getResolutionMultiplier(t){if(!t||!t.length)throw new l("BadArgument","No voices to format");const e=t[0].getTotalTicks();return t.reduce(((t,i)=>{if(!i.getTotalTicks().equals(e))throw new l("TickMismatch","Voices should have same total note duration in ticks.");if(i.getMode()===Ft.Mode.STRICT&&!i.isComplete())throw new l("IncompleteVoice","Voice does not have enough notes.");return Math.max(t,x.LCM(t,i.getResolutionMultiplier()))}),1)}createModifierContexts(t){const e=Se(t,(()=>new ne),((t,e)=>t.addToModifierContext(e)));return this.modifierContexts=e,e}createTickContexts(t){const e=Se(t,(t=>new Ot(t)),((t,e,i)=>e.addTickable(t,i)));this.tickContexts=e;const i=this.tickContexts.array;return i.forEach((t=>{t.tContexts=i})),e}preFormat(t=0,e,i,s){const n=this.tickContexts;if(!n)throw new l("NoTickContexts","preFormat requires TickContexts");const{list:a,map:o}=n;this.lossHistory=[],i&&s&&i.forEach((t=>t.setStave(s).preFormat()));let r=0,h=0;this.minTotalWidth=0;let c=0;a.forEach((t=>{const e=o[t];e.preFormat();const i=e.getWidth();this.minTotalWidth+=i;const s=e.getMaxTicks().value();c+=s;const n=e.getMetrics();r=r+h+n.totalLeftPx,e.setX(r),h=i-n.totalLeftPx}));const{globalSoftmax:b,softmaxFactor:m,maxIterations:g}=this.formatterOptions,u=ye(a.map((t=>Math.pow(m,o[t].getMaxTicks().value()/c))));if(this.minTotalWidth=r+h,this.hasMinTotalWidth=!0,t<=0)return this.evaluate();const p=o[a[0]],_=o[a[a.length-1]];function x(t){return a.map(((e,i)=>{const s=o[e],n=s.getTickablesByVoice();let r;if(i>0){const e=o[a[i-1]];for(let h=i-1;h>=0;h--){const i=o[a[h]].getTickablesByVoice(),l=[];if(Object.keys(n).forEach((t=>{i[t]&&l.push(t)})),l.length>0){let a=0,o=1/0,h=0;if(l.forEach((t=>{const e=i[t].getTicks().value();e>a&&(r=i[t],a=e);const s=n[t],h=s.getX()-(s.getMetrics().modLeftPx+s.getMetrics().leftDisplacedHeadPx),c=i[t].getMetrics(),l=i[t].getX()+c.notePx+c.modRightPx+c.rightDisplacedHeadPx;o=Math.min(o,h-l)})),o=Math.min(o,s.getX()-(e.getX()+.05*t)),b){const e=c;h=Math.pow(m,a/e)/u*t}else void 0!==r&&(h=r.getVoice().softmax(a)*t);return{expectedDistance:h,maxNegativeShiftPx:o,fromTickable:r}}}}return{expectedDistance:0,fromTickablePx:0,maxNegativeShiftPx:0}}))}function f(t){const e=y/2;let i=0;return a.forEach(((s,n)=>{const a=o[s];if(n>0){const e=a.getX(),s=t[n],o=d(s.fromTickable).getX()+s.expectedDistance-(e+i);let r=0;o>0?i+=o:o<0&&(r=Math.min(s.maxNegativeShiftPx,Math.abs(o)),i+=-r),a.setX(e+i)}a.getCenterAlignedTickables().forEach((t=>{t.setCenterXShift(e-a.getX())}))})),_.getX()-p.getX()}const y=t-_.getMetrics().notePx-_.getMetrics().totalRightPx-p.getMetrics().totalLeftPx,S=K.currentMusicFont(),T=S.lookupMetric("stave.endPaddingMin"),w=S.lookupMetric("stave.endPaddingMax");let v=y;const E=x(v);let C=f(E);const k=((t,e)=>{let i=t/2;if(e.length>1)for(let t=1;tN&&A>0||C+D1;)v-=C-N,C=f(x(v)),A--;return this.justifyWidth=t,this.evaluate()}evaluate(){if(!this.tickContexts)return 0;const t=this.tickContexts,e=this.justifyWidth;this.contextGaps={total:0,gaps:[]},t.list.forEach(((e,i)=>{if(0===i)return;const s=t.list[i-1],n=t.map[s],a=t.map[e],o=n.getMetrics(),r=a.getMetrics(),h=n.getX()+o.notePx+o.totalRightPx,c=a.getX()-r.totalLeftPx,l=c-h;this.contextGaps.total+=l,this.contextGaps.gaps.push({x1:h,x2:c}),a.getFormatterMetrics().freedom.left=l,n.getFormatterMetrics().freedom.right=l})),this.durationStats={};const i=this.durationStats;this.voices.forEach((t=>{t.getTickables().forEach(((t,s,n)=>{const a=t.getTicks().clone().simplify().toString(),o=t.getMetrics(),r=t.getFormatterMetrics(),h=t.getX()+o.notePx+o.modRightPx+o.rightDisplacedHeadPx;let c=0;if(s{t.getTickables().forEach((t=>{const e=t.getTicks().clone().simplify().toString(),n=t.getFormatterMetrics();n.space.mean=i[e].mean,n.duration=e,n.iterations+=1,n.space.deviation=n.space.used-n.space.mean,s+=Math.pow(n.space.deviation,2)}))})),this.totalCost=Math.sqrt(s),this.lossHistory.push(this.totalCost),this.totalCost}tune(t){var e;const i=this.tickContexts;if(!i)return 0;const s=null!==(e=null==t?void 0:t.alpha)&&void 0!==e?e:.5;let n=0;return this.totalShift=0,i.list.forEach(((t,e,a)=>{const o=i.map[t],r=e>0?i.map[a[e-1]]:void 0,h=et.getFormatterMetrics().space.deviation)));c>0?n=-Math.min(o.getFormatterMetrics().freedom.right,Math.abs(c)):c<0&&(n=h?Math.min(h.getFormatterMetrics().freedom.right,Math.abs(c)):0),n*=s,this.totalShift+=n})),this.evaluate()}postFormat(){const t=t=>t.list.forEach((e=>t.map[e].postFormat()));return this.modifierContexts&&t(this.modifierContexts),this.tickContexts&&t(this.tickContexts),this}joinVoices(t){return this.createModifierContexts(t),this.hasMinTotalWidth=!1,this}format(t,e,i){const s=Object.assign({align_rests:!1},i);this.voices=t;const n=this.formatterOptions.softmaxFactor;return n&&this.voices.forEach((t=>t.setSoftmaxFactor(n))),this.alignRests(t,s.align_rests),this.createTickContexts(t),this.preFormat(e,s.context,t,s.stave),s.stave&&this.postFormat(),this}formatToStave(t,e,i){const s=Object.assign({context:e.getContext()},i),n=e.getNoteEndX()-e.getNoteStartX()-_e.defaultPadding;return function(...t){we.DEBUG&&m("Vex.Flow.Formatter",t)}("Formatting voices to width: ",n),this.format(t,n,s)}getTickContext(t){var e;return null===(e=this.tickContexts)||void 0===e?void 0:e.map[t]}}var ve;we.DEBUG=!1,function(t){t[t.BOTTOM=-1]="BOTTOM",t[t.TOP=1]="TOP"}(ve||(ve={}));class Ee extends A{constructor(t,e={}){if(super(),this.numerator_glyphs=[],this.denom_glyphs=[],!t||!t.length)throw new l("BadArguments","No notes provided for tuplet.");this.options=e,this.notes=t,this.num_notes=null!=this.options.num_notes?this.options.num_notes:t.length,this.options.beats_occupied&&this.beatsOccupiedDeprecationWarning(),this.notes_occupied=this.options.notes_occupied||this.options.beats_occupied||2,null!=this.options.bracketed?this.bracketed=this.options.bracketed:this.bracketed=t.some((t=>!t.hasBeam())),this.ratioed=null!=this.options.ratioed?this.options.ratioed:Math.abs(this.notes_occupied-this.num_notes)>1,this.point=K.currentMusicFont().lookupMetric("digits.tupletPoint"),this.y_pos=16,this.x_pos=100,this.width=200,this.setTupletLocation(this.options.location||Ee.LOCATION_TOP),we.AlignRestsToNotes(t,!0,!0),this.resolveGlyphs(),this.attach()}static get CATEGORY(){return c.Tuplet}static get LOCATION_TOP(){return ve.TOP}static get LOCATION_BOTTOM(){return ve.BOTTOM}static get NESTING_OFFSET(){return 15}static get metrics(){return K.currentMusicFont().getMetrics().glyphs.tuplet}attach(){for(let t=0;t=1;)this.numerator_glyphs.unshift(new R("timeSig"+t%10,this.point)),t=parseInt((t/10).toString(),10);for(this.denom_glyphs=[],t=this.notes_occupied;t>=1;)this.denom_glyphs.unshift(new R("timeSig"+t%10,this.point)),t=parseInt((t/10).toString(),10)}getNestedTupletCount(){const t=this.location,e=this.notes[0];let i=n(e,t),s=n(e,t);function n(t,e){return t.getTupletStack().filter((t=>t.location===e)).length}return this.notes.forEach((e=>{const a=n(e,t);i=a>i?a:i,s=a0&&(s=Math.min(a,s))}}}else{let t=Ee.metrics.bottomLine;this.notes.forEach((e=>{const i=e.getModifierContext();i&&(t=Math.max(t,i.getState().text_line+1))})),s=i.checkStave().getYForLine(t)+Ee.metrics.noteHeadOffset;for(let t=0;ts&&(s=e)}}return s+t+e}draw(){const t=this.checkContext();this.setRendered();const e=this.notes[0],i=this.notes[this.notes.length-1];this.bracketed?(this.x_pos=e.getTieLeftX()-5,this.width=i.getTieRightX()-this.x_pos+5):(this.x_pos=e.getStemX(),this.width=i.getStemX()-this.x_pos),this.y_pos=this.getYPosition();const s=(t,e)=>t+d(e.getMetrics().width);let n=this.numerator_glyphs.reduce(s,0);this.ratioed&&(n=this.denom_glyphs.reduce(s,n),n+=.32*this.point);const a=this.x_pos+this.width/2-n/2;if(this.bracketed){const e=this.width/2-n/2-5;e>0&&(t.fillRect(this.x_pos,this.y_pos,e,1),t.fillRect(this.x_pos+this.width/2+n/2+5,this.y_pos,e,1),t.fillRect(this.x_pos,this.y_pos+(this.location===Ee.LOCATION_BOTTOM?1:0),1,10*this.location),t.fillRect(this.x_pos+this.width,this.y_pos+(this.location===Ee.LOCATION_BOTTOM?1:0),1,10*this.location))}const o=K.currentMusicFont().lookupMetric("digits.shiftY",0);let r=0;if(this.numerator_glyphs.forEach((e=>{e.render(t,a+r,this.y_pos+this.point/3-2+o),r+=d(e.getMetrics().width)})),this.ratioed){const e=a+r+.16*this.point,i=.06*this.point;t.beginPath(),t.arc(e,this.y_pos-.08*this.point,i,0,2*Math.PI,!0),t.closePath(),t.fill(),t.beginPath(),t.arc(e,this.y_pos+.12*this.point,i,0,2*Math.PI,!0),t.closePath(),t.fill(),r+=.32*this.point,this.denom_glyphs.forEach((e=>{e.render(t,a+r,this.y_pos+this.point/3-2+o),r+=d(e.getMetrics().width)}))}}}function Ce(t){let e=0;return t.forEach((t=>{t.keyProps&&t.keyProps.forEach((t=>{e+=t.line-3}))})),e>=0?Q.DOWN:Q.UP}const ke="L",De="B";class Ne extends A{constructor(t,e=!1){if(super(),this.slope=0,this.y_shift=0,!t||0===t.length)throw new l("BadArguments","No notes provided for beam.");if(1===t.length)throw new l("BadArguments","Too few notes for beam.");if(this.ticks=t[0].getIntrinsicTicks(),this.ticks>=K.durationToTicks("4"))throw new l("BadArguments","Beams can only be applied to notes shorter than a quarter note.");let i,s;for(this.stem_direction=Q.UP,i=0;it+e.getStemDirection()),0);n=e>-1?Q.UP:Q.DOWN}for(i=0;i(new x).parse(t)));{const e=parseInt(t.split("/")[0],10),i=parseInt(t.split("/")[1],10);if(e%3==0)return[new x(3,i)];if(i>4)return[new x(2,i)];if(i<=4)return[new x(1,i)]}return[new x(1,4)]}static applyAndGetBeams(t,e,i){return Ne.generateBeams(t.getTickables(),{groups:i,stem_direction:e})}static generateBeams(t,e={}){e.groups&&e.groups.length||(e.groups=[new x(2,8)]);const i=e.groups.map((t=>{if(!t.multiply)throw new l("InvalidBeamGroups","The beam groups must be an array of Vex.Flow.Fractions");return t.clone().multiply(K.RESOLUTION,1)})),s=t;let n=0,a=[],o=[];function r(){i.length-1>n?n+=1:n=0}!function(){let t=[],e=new x(0,1);s.forEach((s=>{if(t=[],s.shouldIgnoreTicks())return a.push(o),void(o=t);o.push(s);const h=i[n].clone(),c=(l=o,l.reduce(((t,e)=>e.getTicks().clone().add(t)),new x(0,1))).add(e);var l;const b=K.durationToNumber(s.getDuration())<8;if(b&&s.getTuplet()&&(h.numerator*=2),c.greaterThan(h)){if(!b){const e=o.pop();e&&t.push(e)}a.push(o);do{e=c.subtract(i[n]),r()}while(e.greaterThanEquals(i[n]));o=t}else c.equals(h)&&(a.push(o),e=new x(0,1),o=t,r())})),o.length>0&&a.push(o)}(),function(){const t=[];a.forEach((i=>{let s=[];i.forEach(((i,n,a)=>{const o=0===n||n===a.length-1,r=a[n-1],h=!e.beam_rests&&i.isRest(),c=e.beam_rests&&e.beam_middle_only&&i.isRest()&&o;let l=!1;if(e.maintain_stem_directions&&r&&!i.isRest()&&!r.isRest()){const t=r.getStemDirection();l=i.getStemDirection()!==t}const b=parseInt(i.getDuration(),10)<8;h||c||l||b?(s.length>0&&t.push(s),s=l?[i]:[]):s.push(i)})),s.length>0&&t.push(s)})),a=t}(),a.forEach((t=>{let i;if(e.maintain_stem_directions){const e=function(t){for(let e=0;e{t.setStemDirection(e)}))}(t,i)}));const h=a.filter((t=>{if(t.length>1){let e=!0;return t.forEach((t=>{t.getIntrinsicTicks()>=K.durationToTicks("4")&&(e=!1)})),e}return!1})),c=function(){const t=[];return a.forEach((e=>{let i;e.forEach((e=>{const s=e.getTuplet();s&&i!==s&&(i=s,t.push(i))}))})),t}(),b=[];return h.forEach((t=>{const i=new Ne(t);e.show_stemlets&&(i.render_options.show_stemlets=!0),e.secondary_breaks&&(i.render_options.secondary_break_ticks=K.durationToTicks(e.secondary_breaks)),!0===e.flat_beams&&(i.render_options.flat_beams=!0,i.render_options.flat_beam_offset=e.flat_beam_offset),b.push(i)})),c.forEach((t=>{const e=t.notes[0].stem_direction===Q.DOWN?ve.BOTTOM:ve.TOP;t.setTupletLocation(e);let i=!1;for(let e=0;et.getGlyph().beam_count)).reduce(((t,e)=>e>t?e:t))}breakSecondaryAt(t){return this.break_on_indices=t,this}getSlopeY(t,e,i,s){return i+(t-e)*s}calculateSlope(){const{notes:t,stem_direction:e,render_options:{max_slope:i,min_slope:s,slope_iterations:n,slope_cost:a}}=this,o=t[0],r=function(t,e){const i=t.getStemExtents().topY,s=t.getStemX();return(e.getStemExtents().topY-i)/(e.getStemX()-s)}(o,t[t.length-1]),h=(i-s)/n;let c=Number.MAX_VALUE,l=0,b=0;for(let n=s;n<=i;n+=h){let i=0,s=0;for(let a=1;an)&&(h=n,o=Math.min(...s.getYs()),r=s.getBeamCount())}let c=a/t.length;const l=s+r*(1.5*i),b=o+l*-e;e===Q.DOWN&&cb&&(c=o-l),n?(e===Q.DOWN&&c>n||e===Q.UP&&c=8&&(l=-1!==this.break_on_indices.indexOf(h),this.render_options.secondary_break_ticks&&r>=this.render_options.secondary_break_ticks&&(r=0,l=!0));const b=c.getIntrinsicTicks(){const i=e.getStem();i&&i.setContext(t).draw()}),this)}drawBeamLines(t){const e=["4","8","16","32","64"],i=this.notes[0];let s=this.getBeamYToDraw();const n=i.getStemX(),a=this.render_options.beam_width*this.stem_direction;for(let i=0;i0||!0===e;return!e||n>0||(this.pos=s),o?this.matchSuccess():this.matchFail(s),{success:o,results:i,numMatches:n}}expectZeroOrMore(t){return this.expectOneOrMore(t,!0)}expect(t){if(Me("Evaluating rule function:",t),!t)throw new l("Invalid rule function");let e;const i=t.bind(this.grammar)();if(i.token)e=this.matchToken(i.token,!0===i.noSpace),e.success&&(this.pos+=e.incrementPos);else{if(!i.expect)throw Me(i),new l("Bad grammar! No `token` or `expect` property "+i);e=i.oneOrMore?this.expectOneOrMore(i):i.zeroOrMore?this.expectZeroOrMore(i):this.expectOne(i)}const s=[];return e.matches=s,e.results&&e.results.forEach((t=>s.push(Re(t)))),i.run&&e.success&&i.run({matches:s}),e}}function Le(...t){He.DEBUG&&m("Vex.Flow.EasyScore",t)}Oe.DEBUG=!1;class Ie{constructor(t){this.builder=t}begin(){return this.LINE}LINE(){return{expect:[this.PIECE,this.PIECES,this.EOL]}}PIECE(){return{expect:[this.CHORDORNOTE,this.PARAMS],run:()=>this.builder.commitPiece()}}PIECES(){return{expect:[this.COMMA,this.PIECE],zeroOrMore:!0}}PARAMS(){return{expect:[this.DURATION,this.TYPE,this.DOTS,this.OPTS]}}CHORDORNOTE(){return{expect:[this.CHORD,this.SINGLENOTE],or:!0}}CHORD(){return{expect:[this.LPAREN,this.NOTES,this.RPAREN],run:t=>this.builder.addChord(t.matches[1])}}NOTES(){return{expect:[this.NOTE],oneOrMore:!0}}NOTE(){return{expect:[this.NOTENAME,this.ACCIDENTAL,this.OCTAVE]}}SINGLENOTE(){return{expect:[this.NOTENAME,this.ACCIDENTAL,this.OCTAVE],run:t=>{const e=t;this.builder.addSingleNote(e.matches[0],e.matches[1],e.matches[2])}}}ACCIDENTAL(){return{expect:[this.MICROTONES,this.ACCIDENTALS],maybe:!0,or:!0}}DOTS(){return{expect:[this.DOT],zeroOrMore:!0,run:t=>this.builder.setNoteDots(t.matches)}}TYPE(){return{expect:[this.SLASH,this.MAYBESLASH,this.TYPES],maybe:!0,run:t=>this.builder.setNoteType(t.matches[2])}}DURATION(){return{expect:[this.SLASH,this.DURATIONS],maybe:!0,run:t=>this.builder.setNoteDuration(t.matches[1])}}OPTS(){return{expect:[this.LBRACKET,this.KEYVAL,this.KEYVALS,this.RBRACKET],maybe:!0}}KEYVALS(){return{expect:[this.COMMA,this.KEYVAL],zeroOrMore:!0}}KEYVAL(){return{expect:[this.KEY,this.EQUALS,this.VAL],run:t=>this.builder.addNoteOption(t.matches[0],t.matches[2].slice(1,-1))}}VAL(){return{expect:[this.SVAL,this.DVAL],or:!0}}KEY(){return{token:"[a-zA-Z][a-zA-Z0-9]*"}}DVAL(){return{token:'["][^"]*["]'}}SVAL(){return{token:"['][^']*[']"}}NOTENAME(){return{token:"[a-gA-G]"}}OCTAVE(){return{token:"[0-9]+"}}ACCIDENTALS(){return{token:"bb|b|##|#|n"}}MICROTONES(){return{token:"bbs|bss|bs|db|d|\\+\\+-|\\+-|\\+\\+|\\+|k|o"}}DURATIONS(){return{token:"[0-9whq]+"}}TYPES(){return{token:"[rRsSmMhHgG]"}}LPAREN(){return{token:"[(]"}}RPAREN(){return{token:"[)]"}}COMMA(){return{token:"[,]"}}DOT(){return{token:"[.]"}}SLASH(){return{token:"[/]"}}MAYBESLASH(){return{token:"[/]?"}}EQUALS(){return{token:"[=]"}}LBRACKET(){return{token:"\\["}}RBRACKET(){return{token:"\\]"}}EOL(){return{token:"$"}}}class We{constructor(t){this.chord=[],this.dots=0,this.options={},this.duration=t}}class Ue{constructor(t){this.commitHooks=[],this.factory=t,this.reset()}reset(t){this.options=Object.assign({stem:"auto",clef:"treble"},t),this.elements={notes:[],accidentals:[]},this.rollingDuration="8",this.resetPiece()}getFactory(){return this.factory}getElements(){return this.elements}addCommitHook(t){this.commitHooks.push(t)}resetPiece(){Le("resetPiece"),this.piece=new We(this.rollingDuration)}setNoteDots(t){Le("setNoteDots:",t),t&&(this.piece.dots=t.length)}setNoteDuration(t){Le("setNoteDuration:",t),this.rollingDuration=this.piece.duration=t||this.rollingDuration}setNoteType(t){Le("setNoteType:",t),t&&(this.piece.type=t)}addNoteOption(t,e){Le("addNoteOption: key:",t,"value:",e),this.piece.options[t]=e}addNote(t,e,i){Le("addNote:",t,e,i),this.piece.chord.push({key:t,accid:e,octave:i})}addSingleNote(t,e,i){Le("addSingleNote:",t,e,i),this.addNote(t,e,i)}addChord(t){Le("startChord"),"object"!=typeof t[0]?this.addSingleNote(t[0]):t.forEach((t=>{t&&this.addNote(...t)})),Le("endChord")}commitPiece(){Le("commitPiece");const{factory:t}=this;if(!t)return;const e=Object.assign(Object.assign({},this.options),this.piece.options),i=d(e.stem,"BadArguments","options.stem is not defined").toLowerCase(),s=d(e.clef,"BadArguments","options.clef is not defined").toLowerCase(),{chord:n,duration:a,dots:o,type:r}=this.piece,h=L.accidentals,c=n.map((t=>{var e;return t.key+(h.includes(null!==(e=t.accid)&&void 0!==e?e:"")?t.accid:"")+"/"+t.octave})),l="auto"===i,b="g"==(null==r?void 0:r.toLowerCase())?t.GhostNote({duration:a,dots:o}):t.StaveNote({keys:c,duration:a,dots:o,type:r,clef:s,auto_stem:l});l||b.setStemDirection("up"===i?Q.UP:Q.DOWN);const m=[];n.forEach(((e,i)=>{const s=e.accid;if("string"==typeof s){const e=t.Accidental({type:s});b.addModifier(e,i),m.push(e)}else m.push(void 0)}));for(let t=0;tt(e,b,this))),this.elements.notes.push(b),this.elements.accidentals.push(m),this.resetPiece()}}function Ge(t,e){void 0!==t.id&&e.setAttribute("id",t.id)}const Ye=/\s*,\s*/;function ze(t,e){void 0!==t.class&&t.class.split(Ye).forEach((t=>e.addClass(t)))}class He{constructor(t={}){this.defaults={clef:"treble",time:"4/4",stem:"auto"},this.setOptions(t)}set(t){return this.defaults=Object.assign(Object.assign({},this.defaults),t),this}setOptions(t){var e,i;const s=t.factory,n=null!==(e=t.builder)&&void 0!==e?e:new Ue(s);return this.options=Object.assign(Object.assign({commitHooks:[Ge,ze,dt.easyScoreHook,At.easyScoreHook],throwOnError:!1},t),{factory:s,builder:n}),this.factory=s,this.builder=n,this.grammar=new Ie(this.builder),this.parser=new Oe(this.grammar),null===(i=this.options.commitHooks)||void 0===i||i.forEach((t=>this.addCommitHook(t))),this}setContext(t){return this.factory.setContext(t),this}parse(t,e={}){this.builder.reset(e);const i=this.parser.parse(t);if(!i.success&&this.options.throwOnError)throw Le(i),new l("Error parsing line: "+t);return i}beam(t,e){return this.factory.Beam({notes:t,options:e}),t}tuplet(t,e){return this.factory.Tuplet({notes:t,options:e}),t}notes(t,e={}){return e=Object.assign({clef:this.defaults.clef,stem:this.defaults.stem},e),this.parse(t,e),this.builder.getElements().notes}voice(t,e={}){return e=Object.assign({time:this.defaults.time},e),this.factory.Voice(e).addTickables(t)}addCommitHook(t){this.builder.addCommitHook(t)}}He.DEBUG=!1;const je="Ghost note must have valid initialization data to identify duration.";class Xe extends Ut{static get CATEGORY(){return c.GhostNote}constructor(t){if(!t)throw new l("BadArguments",je);let e;if("string"==typeof t)e={duration:t};else{if("object"!=typeof t)throw new l("BadArguments",je);e=t}super(e),this.setWidth(0)}isRest(){return!0}setStave(t){return super.setStave(t),this}addToModifierContext(t){return this}preFormat(){return this.preFormatted=!0,this}draw(){this.setRendered();for(let t=0;t=Ze.type.TEXT&&t<=Ze.type.MIXED&&(this.type=t),this}setCustomText(t,e){return this.custom_depress_text=t||"",this.custom_release_text=e||"",this}setLine(t){return this.line=t,this}drawBracketed(){const t=this.checkContext();let e,i,s=!1;this.notes.forEach(((n,a,o)=>{s=!s;const r=n.getAbsoluteX(),h=n.checkStave().getYForBottomText(this.line+3);if(r{e=!e;const s=i.checkStave(),n=i.getAbsoluteX(),a=s.getYForBottomText(this.line+3),o=K.currentMusicFont().lookupMetric(`pedalMarking.${e?"down":"up"}.point`);let r=0;e?this.custom_depress_text?(r=t.measureText(this.custom_depress_text).width,t.fillText(this.custom_depress_text,n-r/2,a)):Qe("pedal_depress",t,n,a,o):this.custom_release_text?(r=t.measureText(this.custom_release_text).width,t.fillText(this.custom_release_text,n-r/2,a)):Qe("pedal_release",t,n,a,o)}))}draw(){const t=this.checkContext();this.setRendered(),t.save(),t.setStrokeStyle(this.render_options.color),t.setFillStyle(this.render_options.color),t.setFont(this.textFont),function(...t){Ze.DEBUG&&m("Vex.Flow.PedalMarking",t)}("Rendering Pedal Marking"),this.type===Ze.type.BRACKET||this.type===Ze.type.MIXED?(t.setLineWidth(this.render_options.bracket_line_width),this.drawBracketed()):this.type===Ze.type.TEXT&&this.drawText(),t.restore()}}Ze.DEBUG=!1,Ze.TEXT_FONT={family:k.SERIF,size:12,weight:T.BOLD,style:w.ITALIC},Ze.GLYPHS={pedal_depress:{code:"keyboardPedalPed",x_shift:-10,y_shift:0},pedal_release:{code:"keyboardPedalUp",x_shift:-2,y_shift:3}},Ze.type={TEXT:1,BRACKET:2,MIXED:3},Ze.typeString={text:Ze.type.TEXT,bracket:Ze.type.BRACKET,mixed:Ze.type.MIXED};const ti={1:"repeat1Bar",2:"repeat2Bars",4:"repeat4Bars",slash:"repeatBarSlash"};class ei extends Ve{static get CATEGORY(){return c.RepeatNote}constructor(t,e,i){super(void 0,Object.assign({duration:"q",align_center:"slash"!==t},e),i);const s=new R(ti[t]||"repeat1Bar",K.currentMusicFont().lookupMetric("repeatNote.point",40),{category:"repeatNote"});this.setGlyph(s)}}function ii(t,e,i,s,n,a,o){t.beginPath(),t.moveTo(e,i),t.lineTo(s,n),t.lineTo(a,o),t.lineTo(e,i),t.closePath(),t.fill()}class si extends A{constructor(t){super(),this.setNotes(t),this.text="",this.resetFont(),this.render_options={padding_left:4,padding_right:3,line_width:1,line_dash:void 0,rounded_end:!0,color:void 0,draw_start_arrow:!1,draw_end_arrow:!1,arrowhead_length:10,arrowhead_angle:Math.PI/8,text_position_vertical:si.TextVerticalPosition.TOP,text_justification:si.TextJustification.CENTER}}static get CATEGORY(){return c.StaveLine}setText(t){return this.text=t,this}setNotes(t){if(!t.first_note&&!t.last_note)throw new l("BadArguments","Notes needs to have either first_note or last_note set.");if(t.first_indices||(t.first_indices=[0]),t.last_indices||(t.last_indices=[0]),t.first_indices.length!==t.last_indices.length)throw new l("BadArguments","Connected notes must have same number of indices.");return this.notes=t,this.first_note=t.first_note,this.first_indices=t.first_indices,this.last_note=t.last_note,this.last_indices=t.last_indices,this}applyLineStyle(){const t=this.checkContext(),e=this.render_options;e.line_dash&&t.setLineDash(e.line_dash),e.line_width&&t.setLineWidth(e.line_width),e.rounded_end?t.setLineCap("round"):t.setLineCap("square")}applyFontStyle(){const t=this.checkContext();t.setFont(this.textFont);const e=this.render_options.color;e&&(t.setStrokeStyle(e),t.setFillStyle(e))}drawArrowLine(t,e,i){const s=this.render_options.draw_start_arrow&&this.render_options.draw_end_arrow,n=e.x,a=e.y,o=i.x,r=i.y,h=Math.sqrt((o-n)*(o-n)+(r-a)*(r-a)),c=(h-this.render_options.arrowhead_length/3)/h;let l,b,d,m;this.render_options.draw_end_arrow||s?(l=Math.round(n+(o-n)*c),b=Math.round(a+(r-a)*c)):(l=o,b=r),this.render_options.draw_start_arrow||s?(d=n+(o-n)*(1-c),m=a+(r-a)*(1-c)):(d=n,m=a),this.render_options.color&&(t.setStrokeStyle(this.render_options.color),t.setFillStyle(this.render_options.color)),t.beginPath(),t.moveTo(d,m),t.lineTo(l,b),t.stroke(),t.closePath();const g=Math.atan2(r-a,o-n),u=Math.abs(this.render_options.arrowhead_length/Math.cos(this.render_options.arrowhead_angle));let p,_,x,f,y,S;(this.render_options.draw_end_arrow||s)&&(p=g+Math.PI+this.render_options.arrowhead_angle,x=o+Math.cos(p)*u,f=r+Math.sin(p)*u,_=g+Math.PI-this.render_options.arrowhead_angle,y=o+Math.cos(_)*u,S=r+Math.sin(_)*u,ii(t,x,f,o,r,y,S)),(this.render_options.draw_start_arrow||s)&&(p=g+this.render_options.arrowhead_angle,x=n+Math.cos(p)*u,f=a+Math.sin(p)*u,_=g-this.render_options.arrowhead_angle,y=n+Math.cos(_)*u,S=a+Math.sin(_)*u,ii(t,x,f,n,a,y,S))}draw(){const t=this.checkContext();this.setRendered();const e=this.first_note,i=this.last_note,s=this.render_options;t.save(),this.applyLineStyle();let n={x:0,y:0},a={x:0,y:0};this.first_indices.forEach(((o,r)=>{const h=this.last_indices[r];n=e.getModifierStartXY(2,o),a=i.getModifierStartXY(1,h);const c=n.y>a.y;n.x+=e.getMetrics().modRightPx+s.padding_left,a.x-=i.getMetrics().modLeftPx+s.padding_right;const l=e.getGlyph().getWidth();e.getKeyProps()[o].displaced&&1===e.getStemDirection()&&(n.x+=l+s.padding_left);i.getKeyProps()[h].displaced&&-1===i.getStemDirection()&&(a.x-=l+s.padding_right),n.y+=c?-3:1,a.y+=c?2:0,this.drawArrowLine(t,n,a)})),t.restore();const o=t.measureText(this.text).width,r=s.text_justification;let h=0;if(r===si.TextJustification.LEFT)h=n.x;else if(r===si.TextJustification.CENTER){h=(a.x-n.x)/2+n.x-o/2}else r===si.TextJustification.RIGHT&&(h=a.x-o);let c=0;const l=s.text_position_vertical;return l===si.TextVerticalPosition.TOP?c=e.checkStave().getYForTopText():l===si.TextVerticalPosition.BOTTOM&&(c=e.checkStave().getYForBottomText(K.TEXT_HEIGHT_OFFSET_HACK)),t.save(),this.applyFontStyle(),t.fillText(this.text,h,c),t.restore(),this}}si.TEXT_FONT=Object.assign({},A.TEXT_FONT),si.TextVerticalPosition={TOP:1,BOTTOM:2},si.TextJustification={LEFT:1,CENTER:2,RIGHT:3};class ni extends A{constructor(t={}){super(),this.setOptions(t),this.parts=[]}static get CATEGORY(){return c.System}setOptions(t={}){if(!t.factory)throw new l("NoFactory","System.setOptions(options) requires a factory.");this.factory=t.factory,this.options=Object.assign(Object.assign({factory:this.factory,x:10,y:10,width:500,spaceBetweenStaves:12,autoWidth:!1,noJustification:!1,debugFormatter:!1,formatIterations:0,noPadding:!1},t),{details:Object.assign({alpha:.5},t.details),formatOptions:Object.assign({},t.formatOptions)}),!1===this.options.noJustification&&void 0===t.width&&(this.options.autoWidth=!0)}setContext(t){return super.setContext(t),this.factory.setContext(t),this}addConnector(t="double"){return this.connector=this.factory.StaveConnector({top_stave:this.parts[0].stave,bottom_stave:this.parts[this.parts.length-1].stave,type:t}),this.connector}addStave(t){var e;const i=Object.assign({left_bar:!1},t.options),s=null!==(e=t.stave)&&void 0!==e?e:this.factory.Stave({x:this.options.x,y:this.options.y,width:this.options.width,options:i}),n=Object.assign(Object.assign({stave:s,spaceAbove:0,spaceBelow:0,debugNoteMetrics:!1,noJustification:!1},t),{options:i}),a=this.getContext();return n.voices.forEach((t=>t.setContext(a).setStave(s).getTickables().forEach((t=>t.setStave(s))))),this.parts.push(n),s}format(){const t=this.options.details;let e=0;const i=new we(t);this.formatter=i;let s=this.options.y,n=0,a=[];const o=[];this.parts.forEach((t=>{s+=t.stave.space(t.spaceAbove),t.stave.setY(s),this.options.autoWidth?t.voices.forEach((t=>{i.joinVoices([t])})):i.joinVoices(t.voices),s+=t.stave.space(t.spaceBelow),s+=t.stave.space(this.options.spaceBetweenStaves),t.debugNoteMetrics&&(o.push({y:s,voice:t.voices[0]}),s+=15),a=a.concat(t.voices),n=Math.max(n,t.stave.getNoteStartX())})),this.parts.forEach((t=>t.stave.setNoteStartX(n))),this.options.autoWidth?(e=i.preCalculateMinTotalWidth(a),this.parts.forEach((t=>{t.stave.setWidth(e+_e.rightPadding+(n-this.options.x))}))):e=this.options.noPadding?this.options.width-this.options.x:this.options.width-(n-this.options.x)-_e.defaultPadding,i.format(a,this.options.noJustification?0:e,this.options.formatOptions);for(let e=0;e{e.voice.getTickables().forEach((i=>ut.plotMetrics(t,i,e.y)))}))}}class ai extends Ut{constructor(t,e=!1){super(t),this.glyphs=[],this.greatestString=()=>this.positions.map((t=>t.str)).reduce(((t,e)=>t>e?t:e)),this.leastString=()=>this.positions.map((t=>t.str)).reduce(((t,e)=>tthis.width}setStave(t){super.setStave(t);const e=t.getContext();if(this.setContext(e),e){this.width=0;for(let t=0;ti.width),this.width=Math.max(i.getWidth(),this.width)}this.glyph.getWidth=()=>this.width}const i=this.positions.map((({str:e})=>t.getYForLine(Number(e)-1)));return this.setYs(i),this.stem&&this.stem.setYBounds(this.getStemY(),this.getStemY()),this}getPositions(){return this.positions}getModifierStartXY(t,e){if(!this.preFormatted)throw new l("UnformattedNote","Can't call GetModifierStartXY on an unformatted note");if(0===this.ys.length)throw new l("NoYValues","No Y-Values calculated for this note.");let i=0;if(t===O.Position.LEFT)i=-2;else if(t===O.Position.RIGHT)i=this.width+2;else if(t===O.Position.BELOW||t===O.Position.ABOVE){i=this.glyph.getWidth()/2}return{x:this.getAbsoluteX()+i,y:this.ys[e]}}getLineForRest(){return Number(this.positions[0].str)}preFormat(){this.preFormatted||(this.modifierContext&&this.modifierContext.preFormat(),this.preFormatted=!0)}getStemX(){return this.getCenterGlyphX()}getStemY(){const t=this.checkStave().getNumLines()-.5,e=Q.UP===this.stem_direction?-.5:t;return this.checkStave().getYForLine(e)}getStemExtents(){return this.checkStem().getExtents()}drawFlag(){const{beam:t,glyph:e,stem_direction:i,render_options:{draw_stem:s,glyph_font_scale:n}}=this,a=this.checkContext(),o=null==t&&s;if(e.flag&&o){const t=this.getStemX()+1,s=this.getStemY()-this.checkStem().getHeight(),o=i===Q.DOWN?e.code_flag_downstem:e.code_flag_upstem;R.renderGlyph(a,t,s,n,o,{category:"flag.tabStem"})}}drawModifiers(){this.modifiers.forEach((t=>{i(t,c.Dot)&&!this.render_options.draw_dots||(t.setContext(this.getContext()),t.drawWithStyle())}))}drawStemThrough(){const t=this.getStemX(),e=this.getStemY(),i=this.checkContext(),s=this.render_options.draw_stem,n=this.render_options.draw_stem_through_stave;if(s&&n){const s=function(t,e,i,s){const n=1!==s,a=-1!==s,o=i.getSpacingBetweenLines(),r=i.getNumLines(),h=[];return e.forEach((e=>{const c=e.indexOf(r)>-1,l=e.indexOf(1)>-1;if(n&&l||a&&c)return;1===e.length&&e.push(e[0]);const b=[];e.forEach(((e,n,a)=>{const h=1===e,c=e===r;let l=i.getYForLine(e-1);0!==n||h?n!==a.length-1||c||(l+=o/2-1):l-=o/2-1,b.push(l),1===s&&h?b.push(t-2):-1===s&&c&&b.push(t+2)})),h.push(b.sort(((t,e)=>t-e)))})),h}(e,function(t,e){const i=[];let s=[];for(let n=1;n<=t;n++)e.indexOf(n)>-1?(i.push(s),s=[]):s.push(n);return s.length>0&&i.push(s),i}(this.checkStave().getNumLines(),this.positions.map((t=>Number(t.str)))),this.checkStave(),this.getStemDirection());i.save(),i.setLineWidth(Q.WIDTH),s.forEach((e=>{0!==e.length&&(i.beginPath(),i.moveTo(t,e[0]),i.lineTo(t,e[e.length-1]),i.stroke(),i.closePath())})),i.restore()}}drawPositions(){const t=this.checkContext(),e=this.getAbsoluteX(),i=this.ys;for(let s=0;s{const i=bi.GLYPHS[e];if(!i)throw new l("Invalid dynamics character: "+e);const s=d(this.render_options.glyph_font_size),n=new R(i.code,s,{category:"textNote"});this.glyphs.push(n),t+=i.width})),this.setWidth(t),this.preFormatted=!0,this}draw(){this.setRendered();const t=this.getAbsoluteX(),e=this.checkStave().getYForLine(this.line+-3);li("Rendering Dynamics: ",this.sequence);let i=t;this.glyphs.forEach(((t,s)=>{const n=this.sequence[s];t.render(this.checkContext(),i,e),i+=bi.GLYPHS[n].width}))}}bi.DEBUG=!1;class di extends ut{constructor(t,e){super({duration:"b"});const i=new ge(t,e);this.timeSigInfo=i.getInfo(),this.setWidth(this.timeSigInfo.glyph.getMetrics().width),this.ignore_ticks=!0}static get CATEGORY(){return c.TimeSigNote}addToModifierContext(t){return this}preFormat(){return this.preFormatted=!0,this}draw(){const t=this.checkStave(),e=this.checkContext();this.setRendered(),this.timeSigInfo.glyph.getContext()||this.timeSigInfo.glyph.setContext(e),this.timeSigInfo.glyph.setStave(t),this.timeSigInfo.glyph.setYShift(t.getYForLine(2)-t.getYForGlyphs()),this.timeSigInfo.glyph.renderToStave(this.getAbsoluteX())}}class mi extends A{constructor(t){super(),t.start&&(this.start=t.start),t.stop&&(this.stop=t.stop),this.line=1,this.render_options={harsh:!1,wave_height:6,wave_width:4,wave_girth:2,vibrato_width:0}}static get CATEGORY(){return c.VibratoBracket}setLine(t){return this.line=t,this}setHarsh(t){return this.render_options.harsh=t,this}draw(){const t=this.checkContext();this.setRendered();const e=this.start&&this.start.checkStave().getYForTopText(this.line)||this.stop&&this.stop.checkStave().getYForTopText(this.line)||0,i=this.start&&this.start.getAbsoluteX()||this.stop&&this.stop.checkStave().getTieStartX()||0,s=this.stop&&this.stop.getAbsoluteX()-this.stop.getWidth()-5||this.start&&this.start.checkStave().getTieEndX()-10||0;this.render_options.vibrato_width=s-i,function(...t){mi.DEBUG&&m("Vex.Flow.VibratoBracket",t)}("Rendering VibratoBracket: start_x:",i,"stop_x:",s,"y:",e),ie.renderVibrato(t,i,e,this.render_options)}}function gi(...t){ui.DEBUG&&m("Vex.Flow.Factory",t)}mi.DEBUG=!1;class ui{constructor(t={}){gi("New factory: ",t),this.options={stave:{space:10},renderer:{elementId:"",width:500,height:200,background:"#FFF"},font:ui.TEXT_FONT},this.setOptions(t)}static newFromElementId(t,e=500,i=200){return new ui({renderer:{elementId:t,width:e,height:i}})}reset(){this.renderQ=[],this.systems=[],this.staves=[],this.voices=[],this.stave=void 0}setOptions(t){this.options=Object.assign(Object.assign({},this.options),t),this.initRenderer(),this.reset()}initRenderer(){const{elementId:t,width:e,height:i,background:s}=this.options.renderer;if(null==t)return;if(""==t)throw gi(this),new l("renderer.elementId not set in FactoryOptions");let n=this.options.renderer.backend;if(void 0===n){n=zt(document.getElementById(t))?Zt.Backends.CANVAS:Zt.Backends.SVG}this.context=Zt.buildContext(t,n,e,i,s)}getContext(){return this.context}setContext(t){return this.context=t,this}getStave(){return this.stave}getVoices(){return this.voices}Stave(t){const e=this.options.stave.space,i=Object.assign({x:0,y:0,width:this.options.renderer.width-1*e,options:{spacing_between_lines_px:1*e}},t),s=new _e(i.x,i.y,i.width,i.options);return this.staves.push(s),s.setContext(this.context),this.stave=s,s}TabStave(t){const e=this.options.stave.space,i=Object.assign({x:0,y:0,width:this.options.renderer.width-1*e,options:{spacing_between_lines_px:1.3*e}},t),s=new oi(i.x,i.y,i.width,i.options);return this.staves.push(s),s.setContext(this.context),this.stave=s,s}StaveNote(t){const e=new Yt(t);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}GlyphNote(t,e,i){const s=new Ve(t,e,i);return this.stave&&s.setStave(this.stave),s.setContext(this.context),this.renderQ.push(s),s}RepeatNote(t,e,i){const s=new ei(t,e,i);return this.stave&&s.setStave(this.stave),s.setContext(this.context),this.renderQ.push(s),s}GhostNote(t){const e=new Xe(t);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}TextNote(t){const e=new le(t);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}BarNote(t={}){const e=new Et(t.type);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}ClefNote(t){const e=Object.assign({type:"treble",options:{size:"default",annotation:void 0}},t),i=new Ae(e.type,e.options.size,e.options.annotation);return this.stave&&i.setStave(this.stave),i.setContext(this.context),this.renderQ.push(i),i}TimeSigNote(t){const e=Object.assign({time:"4/4"},t),i=new di(e.time);return this.stave&&i.setStave(this.stave),i.setContext(this.context),this.renderQ.push(i),i}KeySigNote(t){const e=new $e(t.key,t.cancelKey,t.alterKey);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}TabNote(t){const e=new ai(t);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}GraceNote(t){const e=new Ke(t);return this.stave&&e.setStave(this.stave),e.setContext(this.context),e}GraceNoteGroup(t){const e=new Mt(t.notes,t.slur);return e.setContext(this.context),e}Accidental(t){const e=new J(t.type);return e.setContext(this.context),e}Annotation(t){const e=Object.assign({text:"p",hJustify:st.CENTER,vJustify:nt.BOTTOM},t),i=new at(e.text);return i.setJustification(e.hJustify),i.setVerticalJustification(e.vJustify),i.setFont(e.font),i.setContext(this.context),i}ChordSymbol(t){const e=Object.assign({vJustify:"top",hJustify:"center",kerning:!0,reportWidth:!0},t),i=new Dt;return i.setHorizontal(e.hJustify),i.setVertical(e.vJustify),i.setEnableKerning(e.kerning),i.setReportWidth(e.reportWidth),"string"==typeof e.fontFamily&&"number"==typeof e.fontSize?"string"==typeof e.fontWeight?i.setFont(e.fontFamily,e.fontSize,e.fontWeight):i.setFont(e.fontFamily,e.fontSize,""):"number"==typeof e.fontSize&&i.setFontSize(e.fontSize),i.setContext(this.context),i}Articulation(t){const e=Object.assign({type:"a.",position:"above"},t),i=new dt(e.type);return i.setPosition(e.position),i.setContext(this.context),i}TextDynamics(t){const e=Object.assign({text:"p",duration:"q",dots:0,line:0},t),i=new bi({text:e.text,line:e.line,duration:e.duration,dots:e.dots});return this.stave&&i.setStave(this.stave),i.setContext(this.context),this.renderQ.push(i),i}Fingering(t){const e=Object.assign({number:"0",position:"left"},t),i=new At(e.number);return i.setPosition(e.position),i.setContext(this.context),i}StringNumber(t){const e=new te(t.number);return e.setPosition(t.position),e.setContext(this.context),e}TickContext(){return new Ot}ModifierContext(){return new ne}MultiMeasureRest(t){const e=d(t.number_of_measures,"NoNumberOfMeasures"),i=new Je(e,t);return i.setContext(this.context),this.renderQ.push(i),i}Voice(t){const e=Object.assign({time:"4/4"},t),i=new Ft(e.time,e.options);return this.voices.push(i),i}StaveConnector(t){const e=new fe(t.top_stave,t.bottom_stave);return e.setType(t.type).setContext(this.context),this.renderQ.push(e),e}Formatter(t){return new we(t)}Tuplet(t){const e=Object.assign({notes:[],options:{}},t),i=new Ee(e.notes,e.options).setContext(this.context);return this.renderQ.push(i),i}Beam(t){var e,i,s;const n=new Ne(t.notes,null===(e=t.options)||void 0===e?void 0:e.autoStem).setContext(this.context);return n.breakSecondaryAt(null!==(s=null===(i=t.options)||void 0===i?void 0:i.secondaryBeamBreaks)&&void 0!==s?s:[]),this.renderQ.push(n),n}Curve(t){const e=new Fe(t.from,t.to,t.options).setContext(this.context);return this.renderQ.push(e),e}StaveTie(t){var e;const i=new Pt({first_note:t.from,last_note:t.to,first_indices:t.first_indices,last_indices:t.last_indices},t.text);return(null===(e=t.options)||void 0===e?void 0:e.direction)&&i.setDirection(t.options.direction),i.setContext(this.context),this.renderQ.push(i),i}StaveLine(t){var e,i;const s=new si({first_note:t.from,last_note:t.to,first_indices:t.first_indices,last_indices:t.last_indices});return(null===(e=t.options)||void 0===e?void 0:e.text)&&s.setText(t.options.text),(null===(i=t.options)||void 0===i?void 0:i.font)&&s.setFont(t.options.font),s.setContext(this.context),this.renderQ.push(s),s}VibratoBracket(t){const e=new mi({start:t.from,stop:t.to});return t.options.line&&e.setLine(t.options.line),t.options.harsh&&e.setHarsh(t.options.harsh),e.setContext(this.context),this.renderQ.push(e),e}TextBracket(t){const e=new ci({start:t.from,stop:t.to,text:t.text,superscript:t.options.superscript,position:t.options.position});return t.options.line&&e.setLine(t.options.line),t.options.font&&e.setFont(t.options.font),e.setContext(this.context),this.renderQ.push(e),e}System(t={}){t.factory=this;const e=new ni(t).setContext(this.context);return this.systems.push(e),e}EasyScore(t={}){return t.factory=this,new He(t)}PedalMarking(t){const e=Object.assign({notes:[],options:{style:"mixed"}},t),i=new Ze(e.notes);return i.setType(Ze.typeString[e.options.style]),i.setContext(this.context),this.renderQ.push(i),i}NoteSubGroup(t){const e=Object.assign({notes:[]},t),i=new Rt(e.notes);return i.setContext(this.context),i}draw(){const t=this.context;this.systems.forEach((e=>e.setContext(t).format())),this.staves.forEach((e=>e.setContext(t).draw())),this.voices.forEach((e=>e.setContext(t).draw())),this.renderQ.forEach((e=>{e.isRendered()||e.setContext(t).draw()})),this.systems.forEach((e=>e.setContext(t).draw())),this.reset()}}ui.DEBUG=!1,ui.TEXT_FONT=Object.assign({},A.TEXT_FONT);class pi extends A{constructor(t,e){super(),this.setNotes(t),this.hairpin=e,this.position=O.Position.BELOW,this.render_options={height:10,y_shift:0,left_shift_px:0,right_shift_px:0,right_shift_ticks:0,left_shift_ticks:0}}static get CATEGORY(){return c.StaveHairpin}static FormatByTicksAndDraw(t,e,i,s,n,a){var o,r;const h=e.pixelsPerTick;if(null==h)throw new l("BadArguments","A valid Formatter must be provide to draw offsets by ticks.");const c=h*(null!==(o=a.left_shift_ticks)&&void 0!==o?o:0),b=h*(null!==(r=a.right_shift_ticks)&&void 0!==r?r:0),d={height:a.height,y_shift:a.y_shift,left_shift_px:c,right_shift_px:b,right_shift_ticks:0,left_shift_ticks:0};new pi({first_note:i.first_note,last_note:i.last_note},s).setContext(t).setRenderOptions(d).setPosition(n).draw()}setPosition(t){return t!==O.Position.ABOVE&&t!==O.Position.BELOW||(this.position=t),this}setRenderOptions(t){return null!=t.height&&null!=t.y_shift&&null!=t.left_shift_px&&null!=t.right_shift_px&&(this.render_options=t),this}setNotes(t){if(!t.first_note&&!t.last_note)throw new l("BadArguments","Hairpin needs to have either first_note or last_note set.");return this.notes=t,this.first_note=t.first_note,this.last_note=t.last_note,this}renderHairpin(t){const e=this.checkContext();let i=this.render_options.y_shift+20,s=t.first_y;this.position===O.Position.ABOVE&&(i=30-i,s=t.first_y-t.staff_height);const n=this.render_options.left_shift_px,a=this.render_options.right_shift_px;switch(e.beginPath(),this.hairpin){case pi.type.CRESC:e.moveTo(t.last_x+a,s+i),e.lineTo(t.first_x+n,s+this.render_options.height/2+i),e.lineTo(t.last_x+a,s+this.render_options.height+i);break;case pi.type.DECRESC:e.moveTo(t.first_x+n,s+i),e.lineTo(t.last_x+a,s+this.render_options.height/2+i),e.lineTo(t.first_x+n,s+this.render_options.height+i)}e.stroke(),e.closePath()}draw(){this.checkContext(),this.setRendered();const t=this.first_note,e=this.last_note;if(!t||!e)throw new l("NoNote","Notes required to draw");const i=t.getModifierStartXY(this.position,0),s=e.getModifierStartXY(this.position,0);this.renderHairpin({first_x:i.x,last_x:s.x,first_y:t.checkStave().getY()+t.checkStave().getHeight(),last_y:e.checkStave().getY()+e.checkStave().getHeight(),staff_height:t.checkStave().getHeight()})}}pi.type={CRESC:1,DECRESC:2};class _i extends Bt{constructor(t,e){if(super(t,"sl."),!e){let i=t.first_note.getPositions()[0].fret;"string"==typeof i&&(i=parseInt(i,10));let s=t.last_note.getPositions()[0].fret;"string"==typeof s&&(s=parseInt(s,10)),e=isNaN(i)||isNaN(s)?_i.SLIDE_UP:i>s?_i.SLIDE_DOWN:_i.SLIDE_UP}this.direction=e,this.render_options.cp1=11,this.render_options.cp2=14,this.render_options.y_shift=.5,this.resetFont()}static get CATEGORY(){return c.TabSlide}static get SLIDE_UP(){return 1}static get SLIDE_DOWN(){return-1}static createSlideUp(t){return new _i(t,_i.SLIDE_UP)}static createSlideDown(t){return new _i(t,_i.SLIDE_DOWN)}renderTie(t){if(0===t.first_ys.length||0===t.last_ys.length)throw new l("BadArguments","No Y-values to render");const e=this.checkContext(),i=t.first_x_px,s=t.first_ys,n=t.last_x_px,a=t.direction;if(a!==_i.SLIDE_UP&&a!==_i.SLIDE_DOWN)throw new l("BadSlide","Invalid slide direction");const o=this.notes.first_indices;for(let t=0;tthis.tuningValues.length)throw new l("BadArguments",`String number must be between 1 and ${this.tuningValues.length}:${t}`);return this.tuningValues[e-1]}getValueForFret(t,e){const i=this.getValueForString(e),s=Number(t);if(s<0)throw new l("BadArguments",`Fret number must be 0 or higher: ${t}`);return i+s}getNoteForFret(t,e){const i=this.getValueForFret(t,e),s=Math.floor(i/12),n=i%12;return`${K.integerToNote(n)}/${s}`}}var fi=function(t,e,i,s){return new(i||(i=Promise))((function(n,a){function o(t){try{h(s.next(t))}catch(t){a(t)}}function r(t){try{h(s.throw(t))}catch(t){a(t)}}function h(t){var e;t.done?n(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(o,r)}h((s=s.apply(t,e||[])).next())}))};class yi{static get BUILD(){return{VERSION:"4.0.1-alpha.2",ID:"0df10df6d1fab3a99f5aa306341a31c6e686d659",DATE:"2022-02-02T09:30:30.784Z"}}static get Flow(){return yi}static setMusicFont(...t){const e=t.map((t=>k.load(t)));return K.MUSIC_FONT_STACK=e,R.MUSIC_FONT_STACK=e.slice(),R.CURRENT_CACHE_KEY=t.join(","),e}static fetchMusicFont(t,e){return fi(this,void 0,void 0,(function*(){}))}static getMusicFont(){return K.MUSIC_FONT_STACK.map((t=>t.getName()))}static get NOTATION_FONT_SCALE(){return K.NOTATION_FONT_SCALE}static set NOTATION_FONT_SCALE(t){K.NOTATION_FONT_SCALE=t}static get TABLATURE_FONT_SCALE(){return K.TABLATURE_FONT_SCALE}static set TABLATURE_FONT_SCALE(t){K.TABLATURE_FONT_SCALE=t}static get RESOLUTION(){return K.RESOLUTION}static set RESOLUTION(t){K.RESOLUTION=t}static get SLASH_NOTEHEAD_WIDTH(){return K.SLASH_NOTEHEAD_WIDTH}static set SLASH_NOTEHEAD_WIDTH(t){K.SLASH_NOTEHEAD_WIDTH=t}static get STAVE_LINE_DISTANCE(){return K.STAVE_LINE_DISTANCE}static set STAVE_LINE_DISTANCE(t){K.STAVE_LINE_DISTANCE=t}static get STAVE_LINE_THICKNESS(){return K.STAVE_LINE_THICKNESS}static set STAVE_LINE_THICKNESS(t){K.STAVE_LINE_THICKNESS=t}static get STEM_HEIGHT(){return K.STEM_HEIGHT}static set STEM_HEIGHT(t){K.STEM_HEIGHT=t}static get STEM_WIDTH(){return K.STEM_WIDTH}static set STEM_WIDTH(t){K.STEM_WIDTH=t}static get TIME4_4(){return K.TIME4_4}static get accidentalMap(){return K.accidentalMap}static get unicode(){return K.unicode}static keySignature(t){return K.keySignature(t)}static hasKeySignature(t){return K.hasKeySignature(t)}static getKeySignatures(){return K.getKeySignatures()}static clefProperties(t){return K.clefProperties(t)}static keyProperties(t,e,i){return K.keyProperties(t,e,i)}static durationToTicks(t){return K.durationToTicks(t)}}yi.Accidental=J,yi.Annotation=at,yi.Articulation=dt,yi.Barline=vt,yi.BarNote=Et,yi.Beam=Ne,yi.Bend=Ct,yi.BoundingBox=y,yi.BoundingBoxComputation=S,yi.CanvasContext=Ht,yi.ChordSymbol=Dt,yi.Clef=ae,yi.ClefNote=Ae,yi.Crescendo=Pe,yi.Curve=Fe,yi.Dot=Nt,yi.EasyScore=He,yi.Element=A,yi.Factory=ui,yi.Font=k,yi.Formatter=we,yi.Fraction=x,yi.FretHandFinger=At,yi.GhostNote=Xe,yi.Glyph=R,yi.GlyphNote=Ve,yi.GraceNote=Ke,yi.GraceNoteGroup=Mt,yi.GraceTabNote=class extends ai{static get CATEGORY(){return c.GraceTabNote}constructor(t){super(t,!1),this.render_options=Object.assign(Object.assign({},this.render_options),{y_shift:.3,scale:.6,font:`7.5pt ${k.SANS_SERIF}`}),this.updateWidth()}},yi.KeyManager=class{constructor(t){this.music=new L,this.setKey(t)}setKey(t){return this.key=t,this.reset(),this}getKey(){return this.key}reset(){this.keyParts=this.music.getKeyParts(this.key),this.keyString=this.keyParts.root,this.keyParts.accidental&&(this.keyString+=this.keyParts.accidental);if(!L.scaleTypes[this.keyParts.type])throw new l("BadArguments",`Unsupported key type: ${this.key}`);this.scale=this.music.getScaleTones(this.music.getNoteValue(this.keyString),L.scaleTypes[this.keyParts.type]),this.scaleMap={},this.scaleMapByValue={},this.originalScaleMapByValue={};const t=L.root_indices[this.keyParts.root];for(let e=0;e1){const s=[];let n;t.sort(e);for(let e=0;e":{x_min:35,x_max:421,y_min:28,y_max:632,ha:604,leftSideBearing:35,advanceWidth:466},"?":{x_min:45,x_max:548,y_min:-17,y_max:767,ha:784,leftSideBearing:45,advanceWidth:592},"@":{x_min:51,x_max:730,y_min:-78,y_max:753,ha:831,leftSideBearing:51,advanceWidth:781},A:{x_min:37,x_max:554,y_min:-4,y_max:746,ha:750,leftSideBearing:37,advanceWidth:617},B:{x_min:37,x_max:532,y_min:3,y_max:783,ha:780,leftSideBearing:37,advanceWidth:579},C:{x_min:37,x_max:583,y_min:-3,y_max:775,ha:778,leftSideBearing:37,advanceWidth:623},D:{x_min:50,x_max:530,y_min:-15,y_max:749,ha:764,leftSideBearing:50,advanceWidth:579},E:{x_min:45,x_max:531,y_min:-1,y_max:743,ha:744,leftSideBearing:45,advanceWidth:585},F:{x_min:45,x_max:459,y_min:23,y_max:727,ha:704,leftSideBearing:45,advanceWidth:510},G:{x_min:31,x_max:577,y_min:-8,y_max:733,ha:741,leftSideBearing:31,advanceWidth:611},H:{x_min:37,x_max:493,y_min:-22,y_max:758,ha:780,leftSideBearing:37,advanceWidth:535},I:{x_min:47,x_max:501,y_min:-3,y_max:731,ha:734,leftSideBearing:47,advanceWidth:541},J:{x_min:33,x_max:531,y_min:-23,y_max:725,ha:748,leftSideBearing:33,advanceWidth:573},K:{x_min:43,x_max:505,y_min:-10,y_max:740,ha:750,leftSideBearing:43,advanceWidth:560},L:{x_min:49,x_max:457,y_min:-2,y_max:746,ha:748,leftSideBearing:49,advanceWidth:510},M:{x_min:35,x_max:699,y_min:1,y_max:744,ha:743,leftSideBearing:35,advanceWidth:743},N:{x_min:34,x_max:533,y_min:-17,y_max:761,ha:778,leftSideBearing:34,advanceWidth:579},O:{x_min:41,x_max:608,y_min:-5,y_max:735,ha:740,leftSideBearing:41,advanceWidth:667},P:{x_min:53,x_max:451,y_min:-18,y_max:735,ha:753,leftSideBearing:53,advanceWidth:497},Q:{x_min:40,x_max:599,y_min:-67,y_max:744,ha:811,leftSideBearing:40,advanceWidth:648},R:{x_min:39,x_max:487,y_min:16,y_max:735,ha:719,leftSideBearing:39,advanceWidth:535},S:{x_min:35,x_max:552,y_min:-47,y_max:708,ha:755,leftSideBearing:35,advanceWidth:604},T:{x_min:26,x_max:656,y_min:-13,y_max:718,ha:731,leftSideBearing:26,advanceWidth:705},U:{x_min:41,x_max:518,y_min:-20,y_max:748,ha:768,leftSideBearing:41,advanceWidth:567},V:{x_min:47,x_max:509,y_min:-26,y_max:744,ha:770,leftSideBearing:47,advanceWidth:567},W:{x_min:44,x_max:789,y_min:-35,y_max:720,ha:755,leftSideBearing:44,advanceWidth:833},X:{x_min:63,x_max:635,y_min:-10,y_max:745,ha:755,leftSideBearing:63,advanceWidth:680},Y:{x_min:43,x_max:503,y_min:-21,y_max:734,ha:755,leftSideBearing:43,advanceWidth:541},Z:{x_min:42,x_max:584,y_min:-10,y_max:739,ha:749,leftSideBearing:42,advanceWidth:629},"[":{x_min:46,x_max:346,y_min:-150,y_max:884,ha:1034,leftSideBearing:46,advanceWidth:291},"\\":{x_min:20,x_max:616,y_min:-100,y_max:797,ha:897,leftSideBearing:20,advanceWidth:645},"]":{x_min:-76,x_max:226,y_min:-150,y_max:881,ha:1031,leftSideBearing:-76,advanceWidth:297},"^":{x_min:43,x_max:437,y_min:517,y_max:812,ha:295,leftSideBearing:43,advanceWidth:478},_:{x_min:29,x_max:563,y_min:-110,y_max:-1,ha:109,leftSideBearing:29,advanceWidth:598},"`":{x_min:54,x_max:321,y_min:540,y_max:747,ha:207,leftSideBearing:54,advanceWidth:368},a:{x_min:20,x_max:447,y_min:-17,y_max:495,ha:512,leftSideBearing:20,advanceWidth:494},b:{x_min:37,x_max:466,y_min:-27,y_max:770,ha:797,leftSideBearing:37,advanceWidth:510},c:{x_min:35,x_max:456,y_min:-9,y_max:507,ha:516,leftSideBearing:35,advanceWidth:460},d:{x_min:45,x_max:520,y_min:-15,y_max:764,ha:779,leftSideBearing:45,advanceWidth:560},e:{x_min:33,x_max:370,y_min:-5,y_max:501,ha:506,leftSideBearing:33,advanceWidth:397},f:{x_min:35,x_max:411,y_min:-13,y_max:695,ha:708,leftSideBearing:35,advanceWidth:453},g:{x_min:33,x_max:551,y_min:-257,y_max:505,ha:762,leftSideBearing:33,advanceWidth:611},h:{x_min:32,x_max:458,y_min:-29,y_max:743,ha:772,leftSideBearing:32,advanceWidth:491},i:{x_min:45,x_max:167,y_min:-13,y_max:631,ha:644,leftSideBearing:45,advanceWidth:220},j:{x_min:-127,x_max:261,y_min:-231,y_max:601,ha:832,leftSideBearing:-127,advanceWidth:308},k:{x_min:39,x_max:443,y_min:-3,y_max:700,ha:703,leftSideBearing:39,advanceWidth:497},l:{x_min:58,x_max:168,y_min:-8,y_max:686,ha:694,leftSideBearing:58,advanceWidth:227},m:{x_min:39,x_max:688,y_min:-14,y_max:501,ha:515,leftSideBearing:39,advanceWidth:718},n:{x_min:45,x_max:491,y_min:-32,y_max:512,ha:544,leftSideBearing:45,advanceWidth:541},o:{x_min:41,x_max:424,y_min:-12,y_max:493,ha:505,leftSideBearing:41,advanceWidth:447},p:{x_min:25,x_max:529,y_min:-260,y_max:500,ha:760,leftSideBearing:25,advanceWidth:573},q:{x_min:53,x_max:603,y_min:-235,y_max:514,ha:749,leftSideBearing:53,advanceWidth:623},r:{x_min:32,x_max:407,y_min:-7,y_max:492,ha:499,leftSideBearing:32,advanceWidth:460},s:{x_min:49,x_max:416,y_min:-12,y_max:519,ha:531,leftSideBearing:49,advanceWidth:460},t:{x_min:32,x_max:442,y_min:-5,y_max:684,ha:689,leftSideBearing:32,advanceWidth:469},u:{x_min:41,x_max:487,y_min:-5,y_max:507,ha:512,leftSideBearing:41,advanceWidth:510},v:{x_min:16,x_max:441,y_min:-20,y_max:542,ha:562,leftSideBearing:16,advanceWidth:456},w:{x_min:39,x_max:639,y_min:-22,y_max:505,ha:527,leftSideBearing:39,advanceWidth:661},x:{x_min:15,x_max:505,y_min:-39,y_max:539,ha:578,leftSideBearing:15,advanceWidth:541},y:{x_min:-98,x_max:501,y_min:-242,y_max:511,ha:753,leftSideBearing:-98,advanceWidth:548},z:{x_min:27,x_max:479,y_min:-3,y_max:494,ha:497,leftSideBearing:27,advanceWidth:494},"{":{x_min:0,x_max:0,y_min:0,y_max:0,ha:0,leftSideBearing:0,advanceWidth:308},"|":{x_min:0,x_max:0,y_min:0,y_max:0,ha:0,leftSideBearing:0,advanceWidth:308},"}":{x_min:0,x_max:0,y_min:0,y_max:0,ha:0,leftSideBearing:0,advanceWidth:308},"~":{x_min:0,x_max:0,y_min:0,y_max:0,ha:0,leftSideBearing:0,advanceWidth:308}},fontFamily:"PetalumaScript",resolution:1e3,generatedOn:"2020-06-14T18:33:25.407Z"},ki={spacing:50,glyphs:{" ":{x_min:0,x_max:509,y_min:0,y_max:2e3,ha:2e3,leftSideBearing:0,advanceWidth:509},0:{x_min:121,x_max:1048,y_min:-21,y_max:1477,ha:1498,leftSideBearing:121,advanceWidth:1168},1:{x_min:117,x_max:767,y_min:0,y_max:1456,ha:1456,leftSideBearing:117,advanceWidth:844},2:{x_min:75.8474576645637,x_max:1040,y_min:0,y_max:1477,ha:1477,leftSideBearing:75,advanceWidth:1131},3:{x_min:74.85365853658536,x_max:994,y_min:-21,y_max:1477,ha:1498,leftSideBearing:74,advanceWidth:1106},4:{x_min:63,x_max:1114,y_min:0,y_max:1456,ha:1456,leftSideBearing:63,advanceWidth:1187},5:{x_min:96.8448275474953,x_max:982,y_min:-21,y_max:1456,ha:1477,leftSideBearing:96,advanceWidth:1081},6:{x_min:121,x_max:1067,y_min:-21,y_max:1477,ha:1498,leftSideBearing:121,advanceWidth:1144},7:{x_min:76,x_max:1060,y_min:0,y_max:1456,ha:1456,leftSideBearing:-30,advanceWidth:1128},8:{x_min:92,x_max:1039,y_min:-21,y_max:1477,ha:1498,leftSideBearing:92,advanceWidth:1131},9:{x_min:84,x_max:1026,y_min:-21,y_max:1477,ha:1498,leftSideBearing:84,advanceWidth:1154},"!":{x_min:143,x_max:340,y_min:0,y_max:1456,ha:1456,leftSideBearing:143,advanceWidth:483},'"':{x_min:166,x_max:634,y_min:1055,y_max:1560,ha:505,leftSideBearing:166,advanceWidth:770},"#":{x_min:63,x_max:1179,y_min:0,y_max:1456,ha:1456,leftSideBearing:63,advanceWidth:1246},$:{x_min:81.92156915727656,x_max:1012,y_min:-208,y_max:1693,ha:1901,leftSideBearing:81,advanceWidth:1110},"%":{x_min:77,x_max:1384,y_min:-21,y_max:1477,ha:1498,leftSideBearing:77,advanceWidth:1460},"&":{x_min:74,x_max:1242,y_min:-21,y_max:1477,ha:1498,leftSideBearing:74,advanceWidth:1289},"'":{x_min:166,x_max:324,y_min:1055,y_max:1560,ha:505,leftSideBearing:166,advanceWidth:460},"(":{x_min:114,x_max:650,y_min:-463,y_max:1636,ha:2099,leftSideBearing:114,advanceWidth:662},")":{x_min:11,x_max:547,y_min:-463,y_max:1636,ha:2099,leftSideBearing:11,advanceWidth:654},"*":{x_min:66,x_max:893,y_min:607,y_max:1456,ha:849,leftSideBearing:66,advanceWidth:958},"+":{x_min:73,x_max:1071,y_min:146,y_max:1206,ha:1060,leftSideBearing:73,advanceWidth:1145},",":{x_min:23,x_max:315,y_min:-311,y_max:221,ha:532,leftSideBearing:23,advanceWidth:404},"-":{x_min:154,x_max:643,y_min:538,y_max:692,ha:154,leftSideBearing:154,advanceWidth:797},".":{x_min:145,x_max:342,y_min:0,y_max:202,ha:202,leftSideBearing:145,advanceWidth:493},"/":{x_min:0,x_max:774,y_min:-125,y_max:1456,ha:1581,leftSideBearing:0,advanceWidth:824},":":{x_min:145,x_max:342,y_min:0,y_max:1082,ha:1082,leftSideBearing:145,advanceWidth:419},";":{x_min:53,x_max:345,y_min:-311,y_max:1082,ha:1393,leftSideBearing:53,advanceWidth:424},"<":{x_min:76,x_max:892,y_min:107,y_max:1013,ha:906,leftSideBearing:76,advanceWidth:1017},"=":{x_min:147,x_max:981,y_min:407,y_max:987,ha:580,leftSideBearing:147,advanceWidth:1127},">":{x_min:125,x_max:980,y_min:87,y_max:993,ha:906,leftSideBearing:125,advanceWidth:1060},"?":{x_min:65.92660602419838,x_max:890,y_min:0,y_max:1477,ha:1477,leftSideBearing:65,advanceWidth:953},"@":{x_min:84.3592218305664,x_max:1705.2346925277395,y_min:-453,y_max:1431,ha:1884,leftSideBearing:84,advanceWidth:1821},A:{x_min:70,x_max:1463,y_min:0,y_max:1456,ha:1456,leftSideBearing:70,advanceWidth:1533},B:{x_min:81,x_max:1253,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1322},C:{x_min:80,x_max:1174,y_min:-21,y_max:1477,ha:1498,leftSideBearing:80,advanceWidth:1290},D:{x_min:81,x_max:1291,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1356},E:{x_min:81,x_max:1190,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1306},F:{x_min:81,x_max:1176,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1256},G:{x_min:80,x_max:1226,y_min:-21,y_max:1477,ha:1498,leftSideBearing:80,advanceWidth:1346},H:{x_min:81,x_max:1497,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1578},I:{x_min:81,x_max:604,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:685},J:{x_min:60,x_max:1100,y_min:-21,y_max:1456,ha:1477,leftSideBearing:60,advanceWidth:1169},K:{x_min:81,x_max:1427,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1501},L:{x_min:81,x_max:1130,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1210},M:{x_min:94,x_max:1888,y_min:0,y_max:1456,ha:1456,leftSideBearing:94,advanceWidth:1982},N:{x_min:83,x_max:1509,y_min:0,y_max:1456,ha:1456,leftSideBearing:83,advanceWidth:1592},O:{x_min:70,x_max:1281,y_min:-21,y_max:1477,ha:1498,leftSideBearing:70,advanceWidth:1351},P:{x_min:81,x_max:1242,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1297},Q:{x_min:70,x_max:1348,y_min:-245,y_max:1477,ha:1722,leftSideBearing:70,advanceWidth:1376},R:{x_min:81,x_max:1285,y_min:0,y_max:1455,ha:1455,leftSideBearing:81,advanceWidth:1385},S:{x_min:115,x_max:1116,y_min:-21,y_max:1477,ha:1498,leftSideBearing:115,advanceWidth:1206},T:{x_min:96,x_max:1306,y_min:0,y_max:1456,ha:1456,leftSideBearing:96,advanceWidth:1406},U:{x_min:70,x_max:1452,y_min:-21,y_max:1456,ha:1477,leftSideBearing:70,advanceWidth:1522},V:{x_min:65,x_max:1443,y_min:0,y_max:1456,ha:1456,leftSideBearing:65,advanceWidth:1508},W:{x_min:72,x_max:2057,y_min:0,y_max:1456,ha:1456,leftSideBearing:72,advanceWidth:2129},X:{x_min:80,x_max:1449,y_min:0,y_max:1456,ha:1456,leftSideBearing:80,advanceWidth:1529},Y:{x_min:65,x_max:1396,y_min:0,y_max:1456,ha:1456,leftSideBearing:65,advanceWidth:1461},Z:{x_min:90,x_max:1107,y_min:0,y_max:1456,ha:1456,leftSideBearing:90,advanceWidth:1197},"[":{x_min:157,x_max:541,y_min:-312,y_max:1664,ha:1976,leftSideBearing:157,advanceWidth:573},"\\":{x_min:36,x_max:830,y_min:-125,y_max:1456,ha:1581,leftSideBearing:36,advanceWidth:841},"]":{x_min:23,x_max:408,y_min:-312,y_max:1664,ha:1976,leftSideBearing:23,advanceWidth:552},"^":{x_min:71,x_max:802,y_min:729,y_max:1456,ha:727,leftSideBearing:71,advanceWidth:864},_:{x_min:119,x_max:1041,y_min:-154,y_max:0,ha:154,leftSideBearing:119,advanceWidth:1168},"`":{x_min:40,x_max:456,y_min:1288,y_max:1560,ha:272,leftSideBearing:40,advanceWidth:496},a:{x_min:79,x_max:1053,y_min:-21,y_max:1102,ha:1123,leftSideBearing:79,advanceWidth:1132},b:{x_min:-16,x_max:1071,y_min:-21,y_max:1560,ha:1581,leftSideBearing:-16,advanceWidth:1145},c:{x_min:78,x_max:988,y_min:-21,y_max:1102,ha:1123,leftSideBearing:78,advanceWidth:1067},d:{x_min:78,x_max:1156,y_min:-21,y_max:1560,ha:1581,leftSideBearing:78,advanceWidth:1218},e:{x_min:74,x_max:980,y_min:-21,y_max:1102,ha:1123,leftSideBearing:74,advanceWidth:1059},f:{x_min:64,x_max:731,y_min:0,y_max:1581,ha:1581,leftSideBearing:64,advanceWidth:725},g:{x_min:78,x_max:1133,y_min:-437,y_max:1102,ha:1539,leftSideBearing:78,advanceWidth:1157},h:{x_min:49,x_max:1255,y_min:0,y_max:1560,ha:1560,leftSideBearing:49,advanceWidth:1315},i:{x_min:67,x_max:590,y_min:0,y_max:1560,ha:1560,leftSideBearing:67,advanceWidth:652},j:{x_min:-56,x_max:381,y_min:-437,y_max:1560,ha:1997,leftSideBearing:-56,advanceWidth:525},k:{x_min:64,x_max:1248,y_min:0,y_max:1560,ha:1560,leftSideBearing:64,advanceWidth:1287},l:{x_min:64,x_max:587,y_min:0,y_max:1560,ha:1560,leftSideBearing:64,advanceWidth:653},m:{x_min:74,x_max:1905,y_min:0,y_max:1102,ha:1102,leftSideBearing:74,advanceWidth:1977},n:{x_min:74,x_max:1278,y_min:0,y_max:1102,ha:1102,leftSideBearing:74,advanceWidth:1343},o:{x_min:78,x_max:1046,y_min:-21,y_max:1102,ha:1123,leftSideBearing:78,advanceWidth:1124},p:{x_min:34,x_max:1119,y_min:-416,y_max:1102,ha:1518,leftSideBearing:34,advanceWidth:1197},q:{x_min:78,x_max:1135,y_min:-416,y_max:1102,ha:1518,leftSideBearing:78,advanceWidth:1139},r:{x_min:72,x_max:808,y_min:0,y_max:1102,ha:1102,leftSideBearing:72,advanceWidth:854},s:{x_min:104,x_max:933,y_min:-21,y_max:1102,ha:1123,leftSideBearing:104,advanceWidth:1022},t:{x_min:24,x_max:678,y_min:-17,y_max:1343,ha:1360,leftSideBearing:24,advanceWidth:730},u:{x_min:52,x_max:1181,y_min:-21,y_max:1082,ha:1103,leftSideBearing:52,advanceWidth:1245},v:{x_min:26,x_max:1176,y_min:0,y_max:1082,ha:1082,leftSideBearing:26,advanceWidth:1206},w:{x_min:52,x_max:1777,y_min:0,y_max:1082,ha:1082,leftSideBearing:52,advanceWidth:1823},x:{x_min:42,x_max:1163,y_min:0,y_max:1082,ha:1082,leftSideBearing:42,advanceWidth:1203},y:{x_min:24,x_max:1172,y_min:-437,y_max:1082,ha:1519,leftSideBearing:24,advanceWidth:1192},z:{x_min:88,x_max:960,y_min:0,y_max:1082,ha:1082,leftSideBearing:88,advanceWidth:1032},"{":{x_min:63,x_max:671,y_min:-364,y_max:1597,ha:1961,leftSideBearing:63,advanceWidth:701},"|":{x_min:150,x_max:307,y_min:-270,y_max:1456,ha:1726,leftSideBearing:150,advanceWidth:451},"}":{x_min:27,x_max:635,y_min:-364,y_max:1597,ha:1961,leftSideBearing:27,advanceWidth:701},"~":{x_min:121,x_max:1257,y_min:401,y_max:803,ha:402,leftSideBearing:121,advanceWidth:1386}},fontFamily:"Roboto Slab",resolution:2048,generatedOn:"2020-06-15T19:12:58.120Z"};k.load("Petaluma",vi,Ei),k.load("Custom",Ti,wi),yi.setMusicFont("Petaluma","Custom"),function(){{const t=ki,{fontFamily:e,resolution:i,glyphs:s}=t;k.load(e,t);const n="b";it.registerInfo({family:e,resolution:i,glyphs:s,maxSizeGlyph:n,monospaced:!1,bold:!1,italic:!1,superscriptOffset:.66,subscriptOffset:.66,serifs:!0,description:"Text font to pair with the Bravura / Gonville music fonts."})}{const t=Ci,{fontFamily:e,resolution:i,glyphs:s}=t;k.load(e,t);const n="b";it.registerInfo({family:e,resolution:i,glyphs:s,maxSizeGlyph:n,monospaced:!1,bold:!1,italic:!1,superscriptOffset:.66,subscriptOffset:.66,serifs:!1,description:"Text font to pair with the Petaluma music font."})}}();const Di=Si;return e=e.default})()})); +//# sourceMappingURL=vexflow-petaluma.js.map \ No newline at end of file diff --git a/build/cjs/vexflow-petaluma.js.map b/build/cjs/vexflow-petaluma.js.map new file mode 100644 index 0000000000..660caa88e1 --- /dev/null +++ b/build/cjs/vexflow-petaluma.js.map @@ -0,0 +1 @@ +{"version":3,"file":"vexflow-petaluma.js","mappings":";;;;;CAAA,SAA2CA,EAAMC,GAC1B,iBAAZC,SAA0C,iBAAXC,OACxCA,OAAOD,QAAUD,IACQ,mBAAXG,QAAyBA,OAAOC,IAC9CD,OAAO,GAAIH,GACe,iBAAZC,QACdA,QAAa,IAAID,IAEjBD,EAAU,IAAIC,IARhB,CASsB,oBAAXK,OAAyBA,OAA+B,oBAAfC,WAA6BA,WAAaC,MAAO,WACrG,Y,aCTA,IAAIC,EAAsB,CCA1BA,EAAwB,CAACP,EAASQ,KACjC,IAAI,IAAIC,KAAOD,EACXD,EAAoBG,EAAEF,EAAYC,KAASF,EAAoBG,EAAEV,EAASS,IAC5EE,OAAOC,eAAeZ,EAASS,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,OCJ3EF,EAAoBQ,EAAI,WACvB,GAA0B,iBAAfV,WAAyB,OAAOA,WAC3C,IACC,OAAOC,MAAQ,IAAIU,SAAS,cAAb,GACd,MAAOC,GACR,GAAsB,iBAAXb,OAAqB,OAAOA,QALjB,GCAxBG,EAAoBG,EAAI,CAACQ,EAAKC,IAAUR,OAAOS,UAAUC,eAAeC,KAAKJ,EAAKC,G,SCY3E,SAASI,EAAWL,EAAKM,EAAUC,GAAiB,GAEvD,GAAmB,iBAARP,GAA4B,OAARA,EAC3B,OAAO,EAIX,IAAIQ,EAAiBR,EAAIS,YAEzB,GAAIF,EAAgB,CAEhB,KAAe,OAARP,GAAc,CAEjB,GADAQ,EAAiBR,EAAIS,YACjB,aAAcD,GAAkBA,EAAeE,WAAaJ,EAC5D,OAAO,EAEXN,EAAMP,OAAOkB,eAAeX,GAEhC,OAAO,EAIP,MAAO,aAAcQ,GAAkBA,EAAeE,WAAaJ,E,wBAGpE,MAEMM,EAAaZ,GAAQK,EAAWL,EAAKa,EAASC,SAE9CC,EAAef,GAAQK,EAAWL,EAAKa,EAASG,WAEhDC,EAAUjB,GAAQK,EAAWL,EAAKa,EAASK,MAE3CC,EAAenB,GAAQK,EAAWL,EAAKa,EAASO,WAChDC,EAAmBrB,GAAQK,EAAWL,EAAKa,EAASS,eACpDC,EAAavB,GAAQK,EAAWL,EAAKa,EAASW,SAGpD,IAAIX,GACX,SAAWA,GACPA,EAAqB,WAAI,aACzBA,EAAqB,WAAI,aACzBA,EAAuB,aAAI,eAC3BA,EAAkB,QAAI,UACtBA,EAAkB,QAAI,UACtBA,EAAe,KAAI,OACnBA,EAAe,KAAI,OACnBA,EAAsB,YAAI,cAC1BA,EAAe,KAAI,OACnBA,EAAmB,SAAI,WACvBA,EAAoB,UAAI,YACxBA,EAAgB,MAAI,QACpBA,EAAc,IAAI,MAClBA,EAAkB,QAAI,UACtBA,EAAmB,SAAI,WACvBA,EAAyB,eAAI,iBAC7BA,EAAoB,UAAI,YACxBA,EAAgB,MAAI,QACpBA,EAAoB,UAAI,YACxBA,EAAoB,UAAI,YACxBA,EAAyB,eAAI,iBAC7BA,EAAuB,aAAI,eAC3BA,EAAuB,aAAI,eAC3BA,EAAqB,WAAI,aACzBA,EAAmB,SAAI,WACvBA,EAA2B,iBAAI,mBAC/BA,EAAe,KAAI,OACnBA,EAAmB,SAAI,WACvBA,EAAuB,aAAI,eAC3BA,EAAmB,SAAI,WACvBA,EAAsB,YAAI,cAC1BA,EAAuB,aAAI,eAC3BA,EAAwB,cAAI,gBAC5BA,EAAqB,WAAI,aACzBA,EAAqB,WAAI,aACzBA,EAAgB,MAAI,QACpBA,EAAyB,eAAI,iBAC7BA,EAAuB,aAAI,eAC3BA,EAAoB,UAAI,YACxBA,EAAwB,cAAI,gBAC5BA,EAAoB,UAAI,YACxBA,EAAuB,aAAI,eAC3BA,EAAqB,WAAI,aACzBA,EAAoB,UAAI,YACxBA,EAAmB,SAAI,WACvBA,EAAe,KAAI,OACnBA,EAAwB,cAAI,gBAC5BA,EAAuB,aAAI,eAC3BA,EAAiB,OAAI,SACrBA,EAAiB,OAAI,SACrBA,EAAkB,QAAI,UACtBA,EAAmB,SAAI,WACvBA,EAAmB,SAAI,WACvBA,EAAiB,OAAI,SACrBA,EAAsB,YAAI,cAC1BA,EAAuB,aAAI,eAC3BA,EAAmB,SAAI,WACvBA,EAAmB,SAAI,WACvBA,EAAwB,cAAI,gBAC5BA,EAAsB,YAAI,cAC1BA,EAAkB,QAAI,UACtBA,EAAiB,OAAI,SACrBA,EAAkB,QAAI,UACtBA,EAAyB,eAAI,iBAC7BA,EAAgB,MAAI,QACpBA,EAAgB,MAAI,QAlExB,CAmEGA,IAAaA,EAAW,KClHpB,MAAMY,UAAqBC,MAC9BjB,YAAYkB,EAAMC,EAAU,IACxBC,MAAM,kBAAoBF,EAAO,KAAOC,GACxCxC,KAAKuC,KAAOA,GAKb,SAASG,IACZ,MAA0B,oBAAf3C,WACAA,WAES,oBAAT4C,KACAA,KAEW,oBAAX7C,OACAA,YAEW,IAAX,EAAAW,EACA,EAAAA,EAEJC,SAAS,cAATA,GAMJ,SAASkC,EAAQC,EAAGN,EAAO,YAAaC,EAAU,IACrD,QAAUM,IAAND,EACA,MAAM,IAAIR,EAAaE,EAAMC,GAEjC,OAAOK,EAIJ,SAASE,EAAIC,KAAUC,GAC1B,IAAKA,EACD,OACJ,MAAMC,EAAOC,MAAMrC,UAAUsC,MAAMpC,KAAKiC,GAAMI,KAAK,KACnDX,IAAeY,QAAQP,IAAIC,EAAQ,KAAOE,GAIvC,SAASK,KAAQN,GACpB,MAAMC,EAAOD,EAAKI,KAAK,KACjBG,EAAM,IAAIlB,MAChBI,IAAeY,QAAQP,IAAI,YAAaG,EAAMM,EAAIC,OAO/C,SAASC,EAAQC,EAAGC,GACvB,IAAIC,EAAWD,GAAKD,EAAIC,GAAK,EALjC,IAAgBf,EAAGiB,EASf,OAHID,EAAW,EAAI,IACfA,IAPQhB,EAOqB,GAAXgB,IAPPC,EAOsB,IANrBA,EAAI,EAAIC,SAAS,GAAGlB,EAAIiB,EAAK,IAAMA,EAAIA,EAAIC,SAAS,GAAGlB,EAAIiB,EAAK,IAAMA,GAM5C,IAEnCD,EAMJ,SAASG,EAAOC,GACnB,MAAO,MAAMA,IAKV,SAASC,EAAeP,GAK3B,OAJAA,GAAS,EAAIQ,KAAKC,IACV,IACJT,GAAK,EAAIQ,KAAKC,IAEXT,ECvEJ,MAAMU,EAEThD,YAAYiD,EAAWC,GACnBvE,KAAKsE,UAAY,EACjBtE,KAAKuE,YAAc,EACnBvE,KAAKwE,IAAIF,EAAWC,GAEbjD,sBACP,OAAOG,EAAS4C,SAMpBI,WAAWd,EAAGC,GACV,GAAiB,iBAAND,GAAkBe,OAAOC,MAAMhB,IAAmB,iBAANC,GAAkBc,OAAOC,MAAMf,GAClF,MAAM,IAAIvB,EAAa,cAAe,oBAAoBsB,MAAMC,KAEpE,IAAIgB,EACJ,KAAa,IAANhB,GACHgB,EAAIhB,EACJA,EAAID,EAAIC,EACRD,EAAIiB,EAER,OAAOjB,EAGXc,WAAWd,EAAGC,GACV,OAAQD,EAAIC,EAAKS,EAASQ,IAAIlB,EAAGC,GAGrCa,YAAYxB,GACR,OAAoB,IAAhBA,EAAK6B,OACE,EAEc,IAAhB7B,EAAK6B,OACH7B,EAAK,GAES,IAAhBA,EAAK6B,OACHT,EAASU,IAAI9B,EAAK,GAAIA,EAAK,IAK3BoB,EAASU,IAAI9B,EAAK+B,QAASX,EAASY,KAAKhC,IAIxDuB,IAAIF,EAAY,EAAGC,EAAc,GAG7B,OAFAvE,KAAKsE,UAAYA,EACjBtE,KAAKuE,YAAcA,EACZvE,KAGXkF,QACI,OAAOlF,KAAKsE,UAAYtE,KAAKuE,YAGjCY,WACI,IAAIC,EAAIpF,KAAKsE,UACTe,EAAIrF,KAAKuE,YACb,MAAMe,EAAMjB,EAASQ,IAAIO,EAAGC,GAO5B,OANAD,GAAKE,EACLD,GAAKC,EACDD,EAAI,IACJA,GAAKA,EACLD,GAAKA,GAEFpF,KAAKwE,IAAIY,EAAGC,GAGvBE,IAAIC,EAAS,EAAGC,EAAS,GACrB,MAAOC,EAAgBC,GAAoBC,EAA2BJ,EAAQC,GACxEI,EAAMxB,EAASU,IAAI/E,KAAKuE,YAAaoB,GACrChC,EAAIkC,EAAM7F,KAAKuE,YACfX,EAAIiC,EAAMF,EACVP,EAAIpF,KAAKsE,UAAYX,EAAI+B,EAAiB9B,EAChD,OAAO5D,KAAKwE,IAAIY,EAAGS,GAGvBC,SAASN,EAAS,EAAGC,EAAS,GAC1B,MAAOC,EAAgBC,GAAoBC,EAA2BJ,EAAQC,GACxEI,EAAMxB,EAASU,IAAI/E,KAAKuE,YAAaoB,GACrChC,EAAIkC,EAAM7F,KAAKuE,YACfX,EAAIiC,EAAMF,EACVP,EAAIpF,KAAKsE,UAAYX,EAAI+B,EAAiB9B,EAChD,OAAO5D,KAAKwE,IAAIY,EAAGS,GAGvBE,SAASP,EAAS,EAAGC,EAAS,GAC1B,MAAOC,EAAgBC,GAAoBC,EAA2BJ,EAAQC,GAC9E,OAAOzF,KAAKwE,IAAIxE,KAAKsE,UAAYoB,EAAgB1F,KAAKuE,YAAcoB,GAGxEK,OAAOR,EAAS,EAAGC,EAAS,GACxB,MAAOC,EAAgBC,GAAoBC,EAA2BJ,EAAQC,GAC9E,OAAOzF,KAAKwE,IAAIxE,KAAKsE,UAAYqB,EAAkB3F,KAAKuE,YAAcmB,GAG1EO,OAAOC,GACH,MAAMvC,EAAIU,EAAS8B,kBAAkBC,KAAKF,GAASf,WAC7CvB,EAAIS,EAASgC,kBAAkBD,KAAKpG,MAAMmF,WAChD,OAAOxB,EAAEW,YAAcV,EAAEU,WAAaX,EAAEY,cAAgBX,EAAEW,YAG9D+B,YAAYJ,GACR,MAAMvC,EAAIU,EAASgC,kBAAkBD,KAAKpG,MAE1C,OADA2D,EAAEmC,SAASI,GACJvC,EAAEW,UAAY,EAGzBiC,kBAAkBL,GACd,MAAMvC,EAAIU,EAASgC,kBAAkBD,KAAKpG,MAE1C,OADA2D,EAAEmC,SAASI,GACJvC,EAAEW,WAAa,EAG1BkC,SAASN,GACL,OAAQlG,KAAKuG,kBAAkBL,GAGnCO,eAAeP,GACX,OAAQlG,KAAKsG,YAAYJ,GAG7BQ,QACI,OAAO,IAAIrC,EAASrE,KAAKsE,UAAWtE,KAAKuE,aAG7C6B,KAAKO,GACD,MAAqB,iBAAVA,EACA3G,KAAKwE,IAAImC,EAAO,GAGhB3G,KAAKwE,IAAImC,EAAMrC,UAAWqC,EAAMpC,aAI/CqC,WACI,OAAOzC,KAAK0C,MAAM7G,KAAKsE,UAAYtE,KAAKuE,aAG5CuC,YACI,OAAO9G,KAAKsE,UAAYtE,KAAKuE,YAGjCwC,UAGI,OAFA/G,KAAKuE,YAAcJ,KAAK6C,IAAIhH,KAAKuE,aACjCvE,KAAKsE,UAAYH,KAAK6C,IAAIhH,KAAKsE,WACxBtE,KAGXiH,WACI,MAAO,GAAGjH,KAAKsE,aAAatE,KAAKuE,cAGrC2C,qBACI,OAAO7C,EAAS8C,oBAAoBf,KAAKpG,MAAMmF,WAAW8B,WAG9DG,gBACI,IAAIC,EAAI,GACR,MAAMC,EAAItH,KAAK4G,WACTW,EAAIlD,EAAS8C,oBAAoBf,KAAKpG,MAgB5C,OAfIsH,EAAI,GACJC,EAAER,UAEI,IAANO,GACAD,GAAKC,EACe,IAAhBC,EAAEjD,YACF+C,GAAK,IAAIE,EAAEL,yBAIfG,EADqB,IAAhBE,EAAEjD,UACH,IAGAiD,EAAEL,qBAEHG,EAGXG,MAAMC,GACF,MAAMC,EAAID,EAAIE,MAAM,KACd7D,EAAIC,SAAS2D,EAAE,GAAI,IACnBrC,EAAIqC,EAAE,GAAK3D,SAAS2D,EAAE,GAAI,IAAM,EACtC,OAAO1H,KAAKwE,IAAIV,EAAGuB,IAQ3B,SAASO,EAA2B9B,EAAGuB,EAAI,GACvC,MAAiB,iBAANvB,EAEA,CAACA,EAAGuB,GAIJ,CAACvB,EAAEQ,UAAWR,EAAES,aAX/BF,EAAS8B,kBAAoB,IAAI9B,EACjCA,EAASgC,kBAAoB,IAAIhC,EACjCA,EAAS8C,oBAAsB,IAAI9C,ECtM5B,MAAMuD,EACTvG,YAAYwB,EAAGgF,EAAGC,EAAGC,GACjB/H,KAAK6C,EAAIA,EACT7C,KAAK6H,EAAIA,EACT7H,KAAK8H,EAAIA,EACT9H,KAAK+H,EAAIA,EAKbtD,YAAYuD,GACR,OAAO,IAAIJ,EAAYI,EAAKnF,EAAGmF,EAAKH,EAAGG,EAAKF,EAAGE,EAAKD,GAGxDE,OACI,OAAOjI,KAAK6C,EAGhBqF,OACI,OAAOlI,KAAK6H,EAGhBM,OACI,OAAOnI,KAAK8H,EAGhBM,OACI,OAAOpI,KAAK+H,EAGhBM,KAAKxF,GAED,OADA7C,KAAK6C,EAAIA,EACF7C,KAGXsI,KAAKT,GAED,OADA7H,KAAK6H,EAAIA,EACF7H,KAGXuI,KAAKT,GAED,OADA9H,KAAK8H,EAAIA,EACF9H,KAGXwI,KAAKT,GAED,OADA/H,KAAK+H,EAAIA,EACF/H,KAGXyI,KAAK5F,EAAGgF,GAGJ,OAFA7H,KAAK6C,GAAKA,EACV7C,KAAK6H,GAAKA,EACH7H,KAGX0G,QACI,OAAOkB,EAAYxB,KAAKpG,MAM5B0I,UAAUC,GACN,MAAMX,EAAOW,EACPC,EAAQ5I,KAAK6C,EAAImF,EAAKnF,EAAI7C,KAAK6C,EAAImF,EAAKnF,EACxCgG,EAAQ7I,KAAK6H,EAAIG,EAAKH,EAAI7H,KAAK6H,EAAIG,EAAKH,EACxCiB,EAAQ3E,KAAK4E,IAAI/I,KAAK6C,EAAI7C,KAAK8H,EAAGE,EAAKnF,EAAImF,EAAKF,GAAKc,EACrDI,EAAQ7E,KAAK4E,IAAI/I,KAAK6H,EAAI7H,KAAK+H,EAAGC,EAAKH,EAAIG,EAAKD,GAAKc,EAK3D,OAJA7I,KAAK6C,EAAI+F,EACT5I,KAAK6H,EAAIgB,EACT7I,KAAK8H,EAAIgB,EACT9I,KAAK+H,EAAIiB,EACFhJ,MChER,MAAMiJ,EACT5H,cACIrB,KAAKkJ,GAAKxE,OAAOyE,IACjBnJ,KAAKoJ,GAAK1E,OAAOyE,IACjBnJ,KAAKqJ,GAAK3E,OAAOyE,IACjBnJ,KAAKsJ,GAAK5E,OAAOyE,IAGrBI,QACI,OAAOvJ,KAAKkJ,GAGhBM,QACI,OAAOxJ,KAAKoJ,GAGhBK,QACI,OAAOzJ,KAAKqJ,GAAKrJ,KAAKkJ,GAG1BQ,SACI,OAAO1J,KAAKsJ,GAAKtJ,KAAKoJ,GAG1BO,SAAS9G,EAAGgF,IACJlD,MAAM3E,KAAKkJ,KAAOrG,EAAI7C,KAAKkJ,MAC3BlJ,KAAKkJ,GAAKrG,IACV8B,MAAM3E,KAAKqJ,KAAOxG,EAAI7C,KAAKqJ,MAC3BrJ,KAAKqJ,GAAKxG,IACV8B,MAAM3E,KAAKoJ,KAAOvB,EAAI7H,KAAKoJ,MAC3BpJ,KAAKoJ,GAAKvB,IACVlD,MAAM3E,KAAKsJ,KAAOzB,EAAI7H,KAAKsJ,MAC3BtJ,KAAKsJ,GAAKzB,GAGlB+B,KAAK/G,GACD7C,KAAK2J,SAAS9G,EAAG7C,KAAKoJ,IAG1BS,KAAKhC,GACD7H,KAAK2J,SAAS3J,KAAKkJ,GAAIrB,GAG3BiC,kBAAkBC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,GACvCpK,KAAK2J,SAASI,EAAKC,GACnBhK,KAAK2J,SAASQ,EAAKC,GACnB,MAAMC,EAAOJ,EAAMF,EAEnB,IAAIO,EAAQD,GADCF,EAAMF,GAEnB,GAAa,GAATK,EAAY,CACZ,MAAM1F,EAAIyF,EAAOC,EACjB,GAAI1F,EAAI,GAAKA,EAAI,EAAG,CAChB,MAAM2F,EAAK,EAAI3F,EACf5E,KAAK4J,KAAKW,EAAKA,EAAKR,EAAM,EAAIQ,EAAK3F,EAAIqF,EAAMrF,EAAIA,EAAIuF,IAG7D,MAAMK,EAAON,EAAMF,EAGnB,GADAM,EAAQE,GADKJ,EAAMF,GAEN,GAATI,EAAY,CACZ,MAAM1F,EAAI4F,EAAOF,EACjB,GAAI1F,EAAI,GAAKA,EAAI,EAAG,CAChB,MAAM2F,EAAK,EAAI3F,EACf5E,KAAK6J,KAAKU,EAAKA,EAAKP,EAAM,EAAIO,EAAK3F,EAAIsF,EAAMtF,EAAIA,EAAIwF,KAKjEK,eAAeV,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKM,EAAKC,GAE9C,MAAMC,EAAK,CAACb,EAAKC,GACXa,EAAK,CAACZ,EAAKC,GACXY,EAAK,CAACX,EAAKC,GACXW,EAAK,CAACL,EAAKC,GACjB,IAAIjD,EACJ1H,KAAK2J,SAASiB,EAAG,GAAIA,EAAG,IACxB5K,KAAK2J,SAASoB,EAAG,GAAIA,EAAG,IACxB,MAAMxD,EAAI,CAAC3C,EAAG8C,IAAMvD,KAAK6G,IAAI,EAAIpG,EAAG,GAAKgG,EAAGlD,GACxC,EAAIvD,KAAK6G,IAAI,EAAIpG,EAAG,GAAKA,EAAIiG,EAAGnD,GAChC,GAAK,EAAI9C,GAAKT,KAAK6G,IAAIpG,EAAG,GAAKkG,EAAGpD,GAClCvD,KAAK6G,IAAIpG,EAAG,GAAKmG,EAAGrD,GACxB,IAAKA,EAAI,EAAGA,GAAK,EAAGA,IAAK,CACrB,MAAM9D,EAAI,EAAIgH,EAAGlD,GAAK,GAAKmD,EAAGnD,GAAK,EAAIoD,EAAGpD,GACpC/D,GAAK,EAAIiH,EAAGlD,GAAK,EAAImD,EAAGnD,GAAK,EAAIoD,EAAGpD,GAAK,EAAIqD,EAAGrD,GAChDuD,EAAI,EAAIJ,EAAGnD,GAAK,EAAIkD,EAAGlD,GAC7B,GAAU,IAAN/D,EAAS,CACT,GAAU,IAANC,EACA,SACJ,MAAMgB,GAAKqG,EAAIrH,EACX,EAAIgB,GAAKA,EAAI,IACH,IAAN8C,GACA1H,KAAK4J,KAAKrC,EAAE3C,EAAG8C,IACT,IAANA,GACA1H,KAAK6J,KAAKtC,EAAE3C,EAAG8C,KAEvB,SAEJ,MAAMwD,EAAO/G,KAAK6G,IAAIpH,EAAG,GAAK,EAAIqH,EAAItH,EACtC,GAAIuH,EAAO,EACP,SACJ,MAAMC,IAAOvH,EAAIO,KAAKiH,KAAKF,KAAU,EAAIvH,GACrC,EAAIwH,GAAMA,EAAK,IACL,IAANzD,GACA1H,KAAK4J,KAAKrC,EAAE4D,EAAIzD,IACV,IAANA,GACA1H,KAAK6J,KAAKtC,EAAE4D,EAAIzD,KAExB,MAAM2D,IAAOzH,EAAIO,KAAKiH,KAAKF,KAAU,EAAIvH,GACrC,EAAI0H,GAAMA,EAAK,IACL,IAAN3D,GACA1H,KAAK4J,KAAKrC,EAAE8D,EAAI3D,IACV,IAANA,GACA1H,KAAK6J,KAAKtC,EAAE8D,EAAI3D,OC3HpC,IAUW4D,EAKAC,EAfPC,EAAwC,SAAUC,EAASC,EAAYC,EAAGC,GAE1E,OAAO,IAAKD,IAAMA,EAAIE,WAAU,SAAUC,EAASC,GAC/C,SAASC,EAAU9G,GAAS,IAAM+G,EAAKL,EAAUM,KAAKhH,IAAW,MAAOvE,GAAKoL,EAAOpL,IACpF,SAASwL,EAASjH,GAAS,IAAM+G,EAAKL,EAAiB,MAAE1G,IAAW,MAAOvE,GAAKoL,EAAOpL,IACvF,SAASsL,EAAKG,GAJlB,IAAelH,EAIakH,EAAOC,KAAOP,EAAQM,EAAOlH,QAJ1CA,EAIyDkH,EAAOlH,MAJhDA,aAAiByG,EAAIzG,EAAQ,IAAIyG,GAAE,SAAUG,GAAWA,EAAQ5G,OAIToH,KAAKN,EAAWG,GAClGF,GAAML,EAAYA,EAAUW,MAAMd,EAASC,GAAc,KAAKQ,YAetE,IAAIM,GAVJ,SAAWlB,GACPA,EAAmB,OAAI,SACvBA,EAAiB,KAAI,OAFzB,CAGGA,IAAeA,EAAa,KAE/B,SAAWC,GACPA,EAAkB,OAAI,SACtBA,EAAkB,OAAI,SAF1B,CAGGA,IAAcA,EAAY,KAG7B,MAAMkB,EAAQ,GACP,MAAMC,EAKTrL,YAAYsL,GACR3M,KAAK4M,KAAOD,EAQhBlI,+BAA+BoI,EAAWH,EAAKI,MAC3C,IAAIC,EACJ,GAAwB,iBAAbF,EAEP,OAAOA,EAAWH,EAAKM,cAAcC,GAEpC,CACD,MAAM/H,EAAQgI,WAAWL,GACzB,GAAIlI,MAAMO,GACN,OAAO,EAEX,MAAMiI,EAAON,EAASO,QAAQ,WAAY,IAAIC,cAE9C,OAAOnI,GADsD,QAAnC6H,EAAKL,EAAKM,cAAcG,UAA0B,IAAPJ,EAAgBA,EAAK,IAUlGtI,+BAA+BoI,EAAWH,EAAKI,MAC3C,IAAIC,EACJ,GAAwB,iBAAbF,EAEP,OAAOA,EAEN,CACD,MAAM3H,EAAQgI,WAAWL,GACzB,GAAIlI,MAAMO,GACN,OAAO,EAEX,MAAMiI,EAAON,EAASO,QAAQ,WAAY,IAAIC,cAE9C,OAAOnI,IADuD,QAAnC6H,EAAKL,EAAKM,cAAcG,UAA0B,IAAPJ,EAAgBA,EAAK,GAAKL,EAAKM,cAAcC,KAW3HxI,gBAAgB8C,EAAG+F,EAAMC,EAAQC,GAG7B,GAAiB,iBAANjG,QAA2BzE,IAATwK,QAAiCxK,IAAXyK,QAAkCzK,IAAV0K,EACvE,OAAOd,EAAKe,cAAclG,GAE9B,IAAImG,EA+BJ,MA9BiB,iBAANnG,GAEPmG,EAASnG,EAAEmG,OACXJ,EAAO/F,EAAE+F,KACTC,EAAShG,EAAEgG,OACXC,EAAQjG,EAAEiG,OAIVE,EAASnG,EAEbmG,EAASA,MAAAA,EAAuCA,EAAShB,EAAKiB,WAC9DL,EAAOA,MAAAA,EAAmCA,EAAOZ,EAAKI,KAAO,KAC7DS,EAASA,MAAAA,EAAuCA,EAASjC,EAAWsC,OACpEJ,EAAQA,MAAAA,EAAqCA,EAAQjC,EAAUqC,OAChD,KAAXL,IACAA,EAASjC,EAAWsC,QAEV,KAAVJ,IACAA,EAAQjC,EAAUqC,QAGF,iBAATN,IACPA,EAAO,GAAGA,OAGQ,iBAAXC,IACPA,EAASA,EAAOtG,YAGb,CAAEyG,OAAAA,EAAQJ,KAAAA,EAAMC,OAAAA,EAAQC,MAAAA,GAKnC/I,qBAAqBoJ,GAIZrB,IACDA,EAAasB,SAASC,cAAc,SAExCvB,EAAWgB,MAAMQ,KAAOH,EACxB,MAAM,WAAEI,EAAU,SAAEpB,EAAQ,WAAEqB,EAAU,UAAEC,GAAc3B,EAAWgB,MACnE,MAAO,CAAEE,OAAQO,EAAYX,KAAMT,EAAUU,OAAQW,EAAYV,MAAOW,GAK5E1J,mBAAmB2J,GACf,IAAIrB,EACJ,IAAKqB,EACD,MAAO,GAEX,IAAIZ,EACJ,MAAMa,EAAKD,EAASZ,MAOpB,IAAID,EALAC,EADAa,IAAO9C,EAAUqC,QAAiB,KAAPS,QAAoBvL,IAAPuL,EAChC,GAGAA,EAAGC,OAAS,IAGxB,MAAMC,EAAKH,EAASb,OAUpB,IAAID,EARAC,EADAgB,IAAOjD,EAAWsC,QAAiB,KAAPW,QAAoBzL,IAAPyL,EAChC,GAEU,iBAAPA,EACHA,EAAK,IAGLA,EAAGD,OAAS,IAGzB,MAAME,EAAKJ,EAASd,KAEhBA,OADOxK,IAAP0L,EACO9B,EAAKI,KAAO,MAEA,iBAAP0B,EACLA,EAAK,MAILA,EAAGF,OAAS,IAGvB,MAAO,GAAGd,IAAQD,IAASD,IADe,QAA1BP,EAAKqB,EAASV,cAA2B,IAAPX,EAAgBA,EAAKL,EAAKiB,aAUhFlJ,iBAAiBoI,EAAU4B,GACvB,GAAwB,iBAAb5B,EACP,OAAQA,EAAW4B,EAKnB,MAAO,GAFOvB,WAAWL,GAEP4B,IADL5B,EAASO,QAAQ,WAAY,MAQlD3I,cAAc8I,GACV,GAAKA,EAGA,IAAsB,iBAAXA,EACZ,OAAOA,GAAU,IAEhB,CAED,MAAMmB,EAAe3K,SAASwJ,EAAQ,IACtC,OAAI5I,MAAM+J,GAC0B,SAAzBnB,EAAOF,cAGPqB,GAAgB,KAZ3B,OAAO,EAoBfjK,gBAAgB+I,GACZ,QAAKA,GAIMA,EAAMH,gBAAkB9B,EAAUoD,OAYjDlK,mBAAmBkI,EAAUiC,EAASC,GAAe,GACjD,OAAOrD,EAAUxL,UAAM,OAAQ,GAAQ,YACnC,MAKM8O,EAAW,IAAIC,SAASpC,GALbkC,EAAe,OAAOD,wBAAgC,IACtD,OAAOA,qBASxB,aAJME,EAASE,OAGflB,SAASmB,MAAM1J,IAAIuJ,GACZA,KAcfrK,sBACI,OAAO+G,EAAUxL,UAAM,OAAQ,GAAQ,YACnC,MAAMkP,EAAOxC,EAAKyC,cACZC,EAAQ1C,EAAK2C,eACnB,IAAK,MAAM1C,KAAYyC,EAAO,CAC1B,MAAME,EAAWF,EAAMzC,GACvBD,EAAK6C,YAAY5C,EAAUuC,EAAOI,OAI9C7K,wBAYAA,YAAYkI,EAAU6C,EAAMC,GACxB,IAAIzB,EAAOvB,EAAME,GAWjB,OAVKqB,IACDA,EAAO,IAAItB,EAAKC,GAChBF,EAAME,GAAYqB,GAElBwB,GACAxB,EAAK0B,QAAQF,GAEbC,GACAzB,EAAK2B,WAAWF,GAEbzB,EAEX4B,UACI,OAAO5P,KAAK4M,KAEhBiD,UACI,OAAOjN,EAAQ5C,KAAKwP,KAAM,YAAa,qBAE3CM,aACI,OAAOlN,EAAQ5C,KAAKyP,QAAS,YAAa,mBAE9CC,QAAQF,GACJxP,KAAKwP,KAAOA,EAEhBG,WAAWF,GACPzP,KAAKyP,QAAUA,EAEnBM,UACI,YAAqBjN,IAAd9C,KAAKwP,KAEhBQ,gBACI,OAAOhQ,KAAK6P,UAAUI,WAE1BC,YACI,OAAOlQ,KAAK6P,UAAUM,OAS1BC,aAAajQ,EAAKkQ,GACd,MAAMC,EAAWnQ,EAAIwH,MAAM,KAE3B,IAAI4I,EAAUvQ,KAAK8P,aACnB,IAAK,IAAIpI,EAAI,EAAGA,EAAI4I,EAASxL,OAAQ4C,IAAK,CACtC,MACMxC,EAAQqL,EADED,EAAS5I,IAEzB,QAAc5E,IAAVoC,EAEA,OAAOmL,EAGXE,EAAUrL,EAGd,OAAOqL,EAGXtJ,WACI,MAAO,IAAMjH,KAAK4M,KAAO,UAMjCF,EAAKiB,WAAa,oBAElBjB,EAAK8D,MAAQ,yBAEb9D,EAAKI,KAAO,GAGZJ,EAAKM,cAAgB,CACjBC,GAAI,EAAI,EACRwD,GAAI,EACJC,GAAI,GACJ,IAAK,IACLC,GAAI,GACJC,GAAI,GAAK,KACTC,GAAI,GAAK,MAObnE,EAAKyC,cAAgB,yCAMrBzC,EAAK2C,eAAiB,CAClB,cAAe,0CACfyB,eAAgB,wCC1WpB,MAAMC,EACF1P,cACIrB,KAAKgR,GAAK,GACVhR,KAAKiR,KAAO,GACZjR,KAAKkR,MAAQ,IAGd,MAAMC,EACT9P,cACIrB,KAAKoR,MAAQ,IAAIL,EAErBtM,4BACI,OAAO0M,EAASE,gBAIpB5M,6BAA6B6M,GACzBH,EAASE,gBAAkBC,EAE/B7M,gCACI0M,EAASE,qBAAkBvO,EAE/ByO,QAEI,OADAvR,KAAKoR,MAAQ,IAAIL,EACV/Q,KAEXwR,cAAc5E,EAAM1H,EAAO8L,EAAIS,GAC3B,MAAML,EAAQpR,KAAKoR,MACdA,EAAMxE,GAAM1H,KACbkM,EAAMxE,GAAM1H,GAAS,IAEzBkM,EAAMxE,GAAM1H,GAAO8L,GAAMS,EAI7BC,aAAY,GAAEV,EAAE,KAAEpE,EAAI,MAAE1H,EAAK,SAAEyM,IAC3B,MAAMF,EAAOzR,KAAK4R,eAAeZ,QAChBlO,IAAb6O,GAA0B3R,KAAKoR,MAAMxE,GAAM+E,WACpC3R,KAAKoR,MAAMxE,GAAM+E,GAAUX,GAElC9L,GAASuM,GACTzR,KAAKwR,cAAc5E,EAAM1H,EAAOuM,EAAKI,aAAa,MAAOJ,GAUjEK,SAASL,EAAMT,GAEX,KADAA,EAAKA,GAAMS,EAAKI,aAAa,OAEzB,MAAM,IAAIxP,EAAa,wDAO3B,OAJAoP,EAAKM,aAAa,KAAMf,GACxBhR,KAAKwR,cAAc,KAAMR,EAAIA,EAAIS,GACjCzR,KAAK0R,YAAY,CAAEV,GAAAA,EAAIpE,KAAM,OAAQ1H,MAAOuM,EAAKI,aAAa,QAASF,cAAU7O,IACjF2O,EAAKO,WAAWhS,MACTA,KAEX4R,eAAeZ,GACX,IAAIjE,EAAIkF,EACR,OAAmF,QAA3EA,EAA8B,QAAxBlF,EAAK/M,KAAKoR,MAAMJ,UAAuB,IAAPjE,OAAgB,EAASA,EAAGiE,UAAwB,IAAPiB,OAAgB,EAASA,EAAGjB,GAE3HkB,uBAAuBC,EAAWjN,GAC9B,MAAMkN,EAAapS,KAAKoR,MAAMe,GAC9B,GAAIC,EAAY,CACZ,MAAMC,EAAiBD,EAAWlN,GAClC,GAAImN,EAAgB,CAEhB,OADahS,OAAOiS,KAAKD,GACbE,KAAKC,GAAMH,EAAeG,MAG9C,MAAO,GAEXC,kBAAkBxB,GACd,OAAOjR,KAAKkS,uBAAuB,OAAQjB,GAE/CyB,mBAAmBC,GACf,OAAO3S,KAAKkS,uBAAuB,QAASS,GAIhDC,SAASC,GAKL,MAJqB,CAAC,KAAM,OAAQ,SACnBC,SAASD,EAAKjG,OAC3B5M,KAAK0R,YAAYmB,GAEd7S,MCtGR,MAAM+S,EACT1R,cACI,IAAI0L,EACJ/M,KAAKgT,MAAQ,CACThC,GAAI+B,EAAQE,QACZC,QAAIpQ,EACJmO,KAAMjR,KAAKmT,cACXC,QAAS,IAEbpT,KAAKqT,UAAW,EAEyB,QAAxCtG,EAAKoE,EAASmC,4BAAyC,IAAPvG,GAAyBA,EAAG+E,SAAS9R,MAE/EsB,sBACP,OAAOG,EAASsR,QAEpBtO,eACI,MAAO,OAAOsO,EAAQQ,KAG1BJ,cACI,OAAOnT,KAAKqB,YAAYC,SAwB5BkS,SAAShG,GAEL,OADAxN,KAAKwN,MAAQA,EACNxN,KAGXyT,WACI,OAAOzT,KAAKwN,MAGhBkG,WAAWC,EAAU3T,KAAK2T,QAASnG,EAAQxN,KAAKyT,YAC5C,OAAKjG,GAEAmG,GAELA,EAAQC,OACJpG,EAAMqG,aACNF,EAAQG,eAAetG,EAAMqG,aAC7BrG,EAAMuG,YACNJ,EAAQK,cAAcxG,EAAMuG,YAC5BvG,EAAMyG,WACNN,EAAQO,aAAa1G,EAAMyG,WAC3BzG,EAAM2G,aACNR,EAAQS,eAAe5G,EAAM2G,aAC7B3G,EAAM6G,WACNV,EAAQW,aAAa9G,EAAM6G,WACxBrU,MAdIA,KAiBfuU,aAAaZ,EAAU3T,KAAK2T,QAASnG,EAAQxN,KAAKyT,YAC9C,OAAKjG,GAEAmG,GAELA,EAAQa,UACDxU,MAJIA,KAUfyU,gBACIzU,KAAK0U,eACL1U,KAAK0T,aACL1T,KAAK2U,OACL3U,KAAKuU,eAGTK,SAASjC,GACL,OAAyC,IAAlC3S,KAAKgT,MAAMI,QAAQT,GAG9BkC,SAASlC,GACL,IAAI5F,EAQJ,OAPA/M,KAAKgT,MAAMI,QAAQT,IAAa,EACP,QAAxB5F,EAAK/M,KAAKsR,gBAA6B,IAAPvE,GAAyBA,EAAG6F,SAAS,CAClE5B,GAAIhR,KAAKgT,MAAMhC,GACfpE,KAAM,QACN1H,MAAOyN,EACPhB,cAAU7O,IAEP9C,KAGX8U,YAAYnC,GACR,IAAI5F,EAQJ,cAPO/M,KAAKgT,MAAMI,QAAQT,GACD,QAAxB5F,EAAK/M,KAAKsR,gBAA6B,IAAPvE,GAAyBA,EAAG6F,SAAS,CAClE5B,GAAIhR,KAAKgT,MAAMhC,GACfpE,KAAM,QACN1H,WAAOpC,EACP6O,SAAUgB,IAEP3S,KAGXgS,WAAWV,GAEP,OADAtR,KAAKsR,SAAWA,EACTtR,KAGX+U,aACI,OAAO/U,KAAKqT,SAGhB2B,YAAY3B,GAAW,GAEnB,OADArT,KAAKqT,SAAWA,EACTrT,KAGXiV,gBACI,OAAOjV,KAAKgT,MAIhBnB,aAAajF,GACT,OAAO5M,KAAKgT,MAAMpG,GAItBmF,aAAanF,EAAM1H,GACf,IAAI6H,EACJ,MAAMmI,EAAQlV,KAAKgT,MAAMhC,GACnBW,EAAW3R,KAAKgT,MAAMpG,GAI5B,OAHA5M,KAAKgT,MAAMpG,GAAQ1H,EAEM,QAAxB6H,EAAK/M,KAAKsR,gBAA6B,IAAPvE,GAAyBA,EAAG6F,SAAS,CAAE5B,GAAIkE,EAAOtI,KAAAA,EAAM1H,MAAAA,EAAOyM,SAAAA,IACzF3R,KAGXmV,iBACI,OAAOnV,KAAK2I,YAGhByM,aACI,OAAOpV,KAAK2T,QAGhB0B,WAAW1B,GAEP,OADA3T,KAAK2T,QAAUA,EACR3T,KAGX0U,eACI,OAAO9R,EAAQ5C,KAAK2T,QAAS,YAAa,8CAO1C3F,SAAKzG,GACLvH,KAAKsV,QAAQ/N,GAGbyG,WACA,OAAOtB,EAAK6I,YAAYvV,KAAKwV,UAajCF,QAAQtH,EAAMV,EAAMC,EAAQC,GAExB,MAAMiI,EAAkBzV,KAAKqB,YAAYqU,UACnCC,EAA+B,iBAAT3H,EACtB4H,EAA+B,iBAAT5H,EACtB6H,OAA2B/S,IAATkL,EAClB8H,OAAuChT,IAATwK,QAAiCxK,IAAXyK,QAAkCzK,IAAV0K,EAuBlF,OApBIxN,KAAKwV,SAFLG,EAEgBtV,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAIN,GAAkBzH,GAE7D4H,GAAgBE,EAELpJ,EAAKe,cAAcO,GAE9B6H,GAAmBC,EAKRzV,OAAO0V,OAAO,GAAIN,GAOlB/I,EAAKsJ,SAAShI,MAAAA,EAAmCA,EAAOyH,EAAgB/H,OAAQJ,MAAAA,EAAmCA,EAAOmI,EAAgBnI,KAAMC,MAAAA,EAAuCA,EAASkI,EAAgBlI,OAAQC,MAAAA,EAAqCA,EAAQiI,EAAgBjI,OAElSxN,KAEXiW,UAII,OAHKjW,KAAKwV,UACNxV,KAAKkW,YAEFxJ,EAAK6I,YAAYvV,KAAKwV,UAMjCU,YACIlW,KAAKsV,UAGLlH,eAMA,OALKpO,KAAKwV,UACNxV,KAAKkW,YAIF7V,OAAO0V,OAAO,GAAI/V,KAAKwV,UAE9BpH,aAASA,GACTpO,KAAKsV,QAAQlH,GAGjB+H,YAAY7I,GACR,MAAMc,EAAWpO,KAAKoO,SAEtB,OADApO,KAAKsV,QAAQlH,EAASV,OAAQJ,EAAMc,EAASb,OAAQa,EAASZ,OACvDxN,KAMXoW,cACI,OAAOpW,KAAK6M,SAMZA,aAASS,GACTtN,KAAKmW,YAAY7I,GAKjBT,eACA,IAAIS,EAAOtN,KAAKoO,SAASd,KAIzB,MAHoB,iBAATA,IACPA,EAAO,GAAGA,OAEPA,EAKP+I,uBACA,OAAO3J,EAAK4J,wBAAwBtW,KAAK6M,UAKzC0J,uBACA,OAAO7J,EAAK8J,wBAAwBxW,KAAK6M,UAKzCsB,gBACA,OAAOnO,KAAKoO,SAASZ,MAErBW,cAAUX,GACV,MAAMY,EAAWpO,KAAKoO,SACtBpO,KAAKsV,QAAQlH,EAASV,OAAQU,EAASd,KAAMc,EAASb,OAAQC,GAM9DU,iBACA,OAAOlO,KAAKoO,SAASb,OAAS,GAE9BW,eAAWX,GACX,MAAMa,EAAWpO,KAAKoO,SACtBpO,KAAKsV,QAAQlH,EAASV,OAAQU,EAASd,KAAMC,EAAQa,EAASZ,QC1T/D,IAAIiJ,ECFAC,EF+TX3D,EAAQQ,GAAK,IAKbR,EAAQ2C,UAAY,CAChBhI,OAAQhB,EAAKiB,WACbL,KAAMZ,EAAKI,KACXS,OAAQjC,EAAWsC,OACnBJ,MAAOjC,EAAUqC,QCrUrB,SAAW6I,GACPA,EAAYA,EAAkB,KAAI,GAAK,OACvCA,EAAYA,EAAkB,KAAI,GAAK,OACvCA,EAAYA,EAAuB,UAAI,GAAK,YAC5CA,EAAYA,EAAoB,OAAI,GAAK,SAJ7C,CAKGA,IAAgBA,EAAc,KACjC,MAAME,EACFtV,YAAYuV,EAAWrU,EAAMrB,GACzBlB,KAAK6W,OAAS,EACd7W,KAAKyP,QAAUqH,EAAMC,YAAYH,EAAWrU,EAAMrB,GAClDlB,KAAKgX,KAAOF,EAAMG,sBAAsBjX,KAAKyP,QAAQyH,QAASlX,KAAKyP,QAAQ0H,MAAOnX,KAAKyP,QAAQ2H,QAASpX,KAAKyP,QAAQ4H,SACjHnW,IACAlB,KAAK6W,MAAQC,EAAMQ,iBAAiBtX,KAAKyP,QAAQzB,KAAM9M,EAAUqB,EAAM,SAAU,KAuB7F,MAAMgV,EACFlW,YAAY6V,EAASM,EAASC,EAASN,GACnCnX,KAAKkX,QAAUA,EACflX,KAAKwX,QAAUA,EACfxX,KAAKyX,QAAUA,EACfzX,KAAKmX,MAAQA,EACbnX,KAAK0H,EAAI,EAGb2E,OACI,OAAOrM,KAAK0H,GAAK1H,KAAKkX,QAAQpS,OAElCoH,OACI,OAAOlM,KAAKkX,QAAQlX,KAAK0H,KAE7BgQ,QACI,OAAO1X,KAAKwX,QAAUxX,KAAKkX,QAAQlX,KAAK0H,KAAO1H,KAAKmX,MAExDQ,QACI,OAAO3X,KAAKyX,QAAUzX,KAAKkX,QAAQlX,KAAK0H,KAAO1H,KAAKmX,MAExD1S,aAAagD,GACT,MAAM2E,EAAS,GACTwL,EAAQnQ,EAAIE,MAAM,KACxB,IAAID,EAAI,EACR,KAAOA,EAAIkQ,EAAM9S,QACb,OAAQ8S,EAAMlQ,MACV,IAAK,IACD0E,EAAOyL,KAAKpB,EAAYqB,KAAM/T,SAAS6T,EAAMlQ,MAAO3D,SAAS6T,EAAMlQ,OACnE,MACJ,IAAK,IACD0E,EAAOyL,KAAKpB,EAAYsB,KAAMhU,SAAS6T,EAAMlQ,MAAO3D,SAAS6T,EAAMlQ,OACnE,MACJ,IAAK,IACD0E,EAAOyL,KAAKpB,EAAYuB,UAAWjU,SAAS6T,EAAMlQ,MAAO3D,SAAS6T,EAAMlQ,MAAO3D,SAAS6T,EAAMlQ,MAAO3D,SAAS6T,EAAMlQ,OACpH,MACJ,IAAK,IACD0E,EAAOyL,KAAKpB,EAAYwB,OAAQlU,SAAS6T,EAAMlQ,MAAO3D,SAAS6T,EAAMlQ,MAAO3D,SAAS6T,EAAMlQ,MAAO3D,SAAS6T,EAAMlQ,MAAO3D,SAAS6T,EAAMlQ,MAAO3D,SAAS6T,EAAMlQ,OAIzK,OAAO0E,GAGR,MAAM0K,UAAc/D,EAMvB1R,YAAYkB,EAAMsU,EAAOqB,GACrBzV,QAGAzC,KAAKgX,KAAO,IAAIpP,EAAY,EAAG,EAAG,EAAG,GACrC5H,KAAKmY,UAAY,GACjBnY,KAAKoY,UAAY,GACjBpY,KAAKkY,QAAU,GACflY,KAAKmX,MAAQ,EACbnX,KAAKuC,KAAOA,EACZvC,KAAK6W,MAAQA,EACb7W,KAAKqY,YAAc,CAAExV,EAAG,EAAGgF,EAAG,GAC9B7H,KAAKoX,QAAU,EACfpX,KAAKqX,QAAU,EACXa,EACAlY,KAAKsY,WAAWJ,GAGhBlY,KAAKuY,QAKFjX,sBACP,OAAOG,EAASqV,MAYpBrS,wBAAwBuJ,EAAM9M,EAAUqB,EAAMpC,EAAKkQ,GAC/C,IAAInL,EAAQ8I,EAAKoC,aAAa,UAAUlP,KAAYqB,KAAQpC,SAAO2C,GAKnE,YAJcA,IAAVoC,IAEAA,EAAQ8I,EAAKoC,aAAa,UAAUlP,KAAYf,IAAOkQ,IAEpDnL,EAEXT,mBAAmBmS,EAAWrU,GAE1B,IAAIiW,EACAxK,EAFJpL,EAAQgU,EAAW,eAAgB,+BAGnC,IAAK,IAAIlP,EAAI,EAAGA,EAAIkP,EAAU9R,OAAQ4C,IAGlC,GAFAsG,EAAO4I,EAAUlP,GACjB8Q,EAAQxK,EAAKkC,YAAY3N,GACrBiW,EACA,MAAO,CAAEA,MAAAA,EAAOxK,KAAAA,GAExB,MAAM,IAAI3L,EAAa,WAAY,SAASE,6BAEhDkC,mBAAmBmS,EAAWrU,EAAMrB,GAChC,MAAM,MAAEsX,EAAK,KAAExK,GAAS8I,EAAM2B,YAAY7B,EAAWrU,GACrD,IAAKiW,EAAMpY,EACP,MAAM,IAAIiC,EAAa,WAAY,SAASE,6BAChD,IAAI6U,EAAU,EACVC,EAAU,EACVF,EAAQ,EACRjW,GAAY8M,IACZoJ,EAAUN,EAAMQ,iBAAiBtJ,EAAM9M,EAAUqB,EAAM,SAAU,GACjE8U,EAAUP,EAAMQ,iBAAiBtJ,EAAM9M,EAAUqB,EAAM,SAAU,GACjE4U,EAAQL,EAAMQ,iBAAiBtJ,EAAM9M,EAAUqB,EAAM,QAAS,IAElE,MAAMmW,EAAQF,EAAME,MACdC,EAAQH,EAAMG,MACdC,EAAKJ,EAAMI,GAIjB,OAHKJ,EAAMK,iBACPL,EAAMK,eAAiBtB,EAAa/P,MAAMgR,EAAMpY,IAE7C,CACHsY,MAAAA,EACAC,MAAAA,EACAvB,QAAAA,EACAC,QAAAA,EACAF,MAAAA,EACAyB,GAAAA,EACA1B,QAASsB,EAAMK,eACf7K,KAAAA,EACAvE,MAAOkP,EAAQD,EACfhP,OAAQkP,GAchBnU,mBAAmBqU,EAAKC,EAAOC,EAAOnC,EAAOtU,EAAM2V,GAC/C,IAAInL,EACJ,MAAMyC,EAAOsH,EAAMmC,MAAMC,OAAO3W,EAAM2V,MAAAA,OAAyC,EAASA,EAAQhX,UAC1FuO,EAAUD,EAAKC,SACF,GAAfD,EAAKqH,QACLA,EAAQrH,EAAKqH,OAEjB,MAAMsC,EAAyF,QAA1EpM,EAAKmL,MAAAA,OAAyC,EAASA,EAAQf,aAA0B,IAAPpK,EAAgBA,EAAK,EACtHoK,EAAkB,GAARN,GAAgD,IAA/BpH,EAAQzB,KAAKgC,iBAA4BP,EAAQ0H,MAAQgC,EAE1F,OADArC,EAAMsC,cAAcN,EAAKrJ,EAAQyH,QAASC,EAAO4B,EAAQtJ,EAAQ2H,QAAU+B,EAAaH,EAAQvJ,EAAQ4H,QAAU8B,GAC3G1J,EAEXhL,qBAAqBqU,EAAK5B,EAASC,EAAO4B,EAAOC,GAC7C,MAAMK,EAAK,IAAI9B,EAAaL,EAAS6B,EAAOC,EAAO7B,GAEnD,IAAItU,EAAGgF,EACP,IAFAiR,EAAIQ,aAEID,EAAGhN,QACP,OAAQgN,EAAGnN,QACP,KAAKuK,EAAYqB,KACbgB,EAAIS,OAAOF,EAAG3B,QAAS2B,EAAG1B,SAC1B,MACJ,KAAKlB,EAAYsB,KACbe,EAAIU,OAAOH,EAAG3B,QAAS2B,EAAG1B,SAC1B,MACJ,KAAKlB,EAAYuB,UACbnV,EAAIwW,EAAG3B,QACP7P,EAAIwR,EAAG1B,QACPmB,EAAIW,iBAAiBJ,EAAG3B,QAAS2B,EAAG1B,QAAS9U,EAAGgF,GAChD,MACJ,KAAK4O,EAAYwB,OACbpV,EAAIwW,EAAG3B,QACP7P,EAAIwR,EAAG1B,QACPmB,EAAIY,cAAcL,EAAG3B,QAAS2B,EAAG1B,QAAS0B,EAAG3B,QAAS2B,EAAG1B,QAAS9U,EAAGgF,GAIjFiR,EAAIa,OAERlV,6BAA6ByS,EAASC,EAAO4B,EAAOC,GAChD,MAAMK,EAAK,IAAI9B,EAAaL,EAAS6B,EAAOC,EAAO7B,GAC7CyC,EAAW,IAAI3Q,EAErB,IAEIpG,EAAGgF,EAFHgS,EAAOd,EACPe,EAAOd,EAEX,MAAQK,EAAGhN,QACP,OAAQgN,EAAGnN,QACP,KAAKuK,EAAYqB,KAEb+B,EAAOR,EAAG3B,QACVoC,EAAOT,EAAG1B,QACV,MACJ,KAAKlB,EAAYsB,KACb6B,EAASjQ,SAASkQ,EAAMC,GACxBD,EAAOR,EAAG3B,QACVoC,EAAOT,EAAG1B,QACViC,EAASjQ,SAASkQ,EAAMC,GACxB,MACJ,KAAKrD,EAAYuB,UACbnV,EAAIwW,EAAG3B,QACP7P,EAAIwR,EAAG1B,QACPiC,EAAS9P,kBAAkB+P,EAAMC,EAAMT,EAAG3B,QAAS2B,EAAG1B,QAAS9U,EAAGgF,GAClEgS,EAAOhX,EACPiX,EAAOjS,EACP,MACJ,KAAK4O,EAAYwB,OACbpV,EAAIwW,EAAG3B,QACP7P,EAAIwR,EAAG1B,QACPiC,EAASnP,eAAeoP,EAAMC,EAAMT,EAAG3B,QAAS2B,EAAG1B,QAAS0B,EAAG3B,QAAS2B,EAAG1B,QAAS9U,EAAGgF,GACvFgS,EAAOhX,EACPiX,EAAOjS,EAInB,OAAO,IAAID,EAAYgS,EAASrQ,QAASqQ,EAASpQ,QAASoQ,EAASnQ,QAASmQ,EAASlQ,UAE1FjF,gBAAgBlC,EAAMsU,EAAO3V,GACzB,MAAMsO,EAAOsH,EAAMmC,MAAMC,OAAO3W,EAAMrB,IACnB,GAAfsO,EAAKqH,QACLA,EAAQrH,EAAKqH,OAEjB,MAAMM,EAAiB,GAARN,GAAmD,IAApCrH,EAAKC,QAAQzB,KAAKgC,iBAChD,OAAOR,EAAKwH,KAAK7O,OAASgP,EAG9BxC,QAAQ1R,IAGR8W,UACI,OAAO/Z,KAAKuC,KAGhB+V,WAAWJ,GACPlY,KAAKkY,QAAU7X,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI/V,KAAKkY,SAAUA,GAC9DlY,KAAKuY,QAETyB,SAASnD,GAEL,OADA7W,KAAK6W,MAAQA,EACN7W,KAEXia,SAASC,GAEL,OADAla,KAAKka,MAAQA,EACNla,KAEXma,UAAU/C,GAEN,OADApX,KAAKoX,QAAUA,EACRpX,KAEXoa,UAAU/C,GAEN,OADArX,KAAKqX,QAAUA,EACRrX,KAEXuY,QACI,MAAM/I,EAAOsH,EAAMmC,MAAMC,OAAOlZ,KAAKuC,KAAMvC,KAAKkY,QAAQhX,UACxDlB,KAAKyP,QAAUD,EAAKC,SAED,GAAfD,EAAKqH,QACL7W,KAAK6W,MAAQrH,EAAKqH,OAEtB7W,KAAKmX,MAAsB,GAAbnX,KAAK6W,OAAmD,IAApC7W,KAAKyP,QAAQzB,KAAKgC,iBACpDhQ,KAAKgX,KAAO,IAAIpP,EAAY4H,EAAKwH,KAAK/O,OAASjI,KAAKmX,MAAO3H,EAAKwH,KAAK9O,OAASlI,KAAKmX,MAAO3H,EAAKwH,KAAK7O,OAASnI,KAAKmX,MAAO3H,EAAKwH,KAAK5O,OAASpI,KAAKmX,OAErJkD,eACI,OAAOzX,EAAQ5C,KAAKyP,QAAS,WAAY,SAASzP,KAAKuC,4BAE3DuN,aACI,MAAML,EAAUzP,KAAKqa,eACfC,EAAe7K,EAAQ0H,MAC7B,MAAO,CACHuB,MAAOjJ,EAAQiJ,MAAQ1Y,KAAKmX,MAAQmD,EACpC3B,MAAOlJ,EAAQkJ,MAAQ3Y,KAAKmX,MAAQmD,EACpC7Q,MAAOzJ,KAAKgX,KAAK7O,OACjBuB,OAAQ1J,KAAKgX,KAAK5O,OAClB+O,MAAOnX,KAAKmX,MAAQmD,EACpBlD,QAAS3H,EAAQ2H,QACjBC,QAAS5H,EAAQ4H,QACjBH,QAASzH,EAAQyH,QACjBlJ,KAAMyB,EAAQzB,KACd4K,GAAInJ,EAAQmJ,IAGpB2B,WAAW1X,GACP,MAAM,KAAEmU,GAAShX,KAEXwa,GAAU3X,EADAsB,KAAK6C,IAAIgQ,EAAK/O,OAAS+O,EAAK7O,SACb6O,EAAK7O,OACpCnI,KAAKqY,YAAYxV,GAAK2X,EAE1BC,WAAW5S,GACP,MAAM,KAAEmP,GAAShX,KAEX0a,GAAU7S,EADA1D,KAAK6C,IAAIgQ,EAAK9O,OAAS8O,EAAK5O,SACb4O,EAAK5O,OACpCpI,KAAKqY,YAAYxQ,GAAK6S,EAE1BC,UAAU9X,EAAGgF,GACT7H,KAAKua,WAAW1X,GAChB7C,KAAKya,WAAW5S,GAEpB+S,OAAO9B,EAAKjW,EAAGgF,GACX,MAAM4H,EAAUzP,KAAKqa,eACfnD,EAAUzH,EAAQyH,QAClBC,EAAQnX,KAAKmX,MAAQ1H,EAAQ0H,MACnCnX,KAAKgV,cACLhV,KAAK0T,WAAWoF,GAChB,MAAM+B,EAAOhY,EAAI7C,KAAKqY,YAAYxV,EAAI4M,EAAQ2H,QACxC0D,EAAOjT,EAAI7H,KAAKqY,YAAYxQ,EAAI4H,EAAQ4H,QAC9CP,EAAMsC,cAAcN,EAAK5B,EAASC,EAAO0D,EAAMC,GAC/C9a,KAAKuU,aAAauE,GAEtBiC,aACI,OAAOnY,EAAQ5C,KAAKka,MAAO,UAAW,kCAE1Cc,cAAcnY,GACV,MAAM8Q,EAAU3T,KAAK0U,eACfjF,EAAUzP,KAAKqa,eACfH,EAAQla,KAAK+a,aACb7D,EAAUzH,EAAQyH,QAClBC,EAAQnX,KAAKmX,MAAQ1H,EAAQ0H,MACnCnX,KAAKgV,cACLhV,KAAK0T,aACL,MAAMmH,EAAOhY,EAAI7C,KAAKoX,QAAU3H,EAAQ2H,QAClC0D,EAAOZ,EAAMe,gBAAkBjb,KAAKqX,QAAU5H,EAAQ4H,QAC5DP,EAAMsC,cAAczF,EAASuD,EAASC,EAAO0D,EAAMC,GACnD9a,KAAKuU,gBAGbuC,EAAMmC,MAAQ,IAhWd,MACI5X,cACIrB,KAAKiZ,MAAQ,IAAIiC,IAErBhC,OAAO3W,EAAMrB,GACT,IAAIia,EAAUnb,KAAKiZ,MAAMzY,IAAIsW,EAAMsE,wBACnBtY,IAAZqY,IACAA,EAAU,GACVnb,KAAKiZ,MAAMzU,IAAIsS,EAAMsE,kBAAmBD,IAE5C,MAAMhb,EAAMe,EAAW,GAAGqB,KAAQrB,IAAaqB,EAC/C,IAAI8Y,EAAQF,EAAQhb,GAKpB,YAJc2C,IAAVuY,IACAA,EAAQ,IAAI1E,EAAgBG,EAAMwE,iBAAkB/Y,EAAMrB,GAC1Dia,EAAQhb,GAAOkb,GAEZA,IAoVfvE,EAAMsE,kBAAoB,GAG1BtE,EAAMwE,iBAAmB,GCzXzB,SAAW5E,GACPA,EAAiBA,EAAyB,OAAI,GAAK,SACnDA,EAAiBA,EAAuB,KAAI,GAAK,OACjDA,EAAiBA,EAAwB,MAAI,GAAK,QAClDA,EAAiBA,EAAwB,MAAI,GAAK,QAClDA,EAAiBA,EAAwB,MAAI,GAAK,QALtD,CAMGA,IAAqBA,EAAmB,KAepC,MAAM6E,UAAiBxI,EAC1B1R,cACIoB,QACAzC,KAAKyJ,MAAQ,EAEbzJ,KAAKwb,UAAY,EACjBxb,KAAKyb,SAAWF,EAASG,SAASC,KAClC3b,KAAKoX,QAAU,EACfpX,KAAKqX,QAAU,EACfrX,KAAK4b,wBAA0B,EAMxBta,sBACP,OAAOG,EAAS8Z,SAGTG,sBACP,OAAOhF,EAEAmF,4BACP,MAAO,CACHC,OAAQpF,EAAiBqF,OACzBC,MAAOtF,EAAiBuF,MACxBC,MAAOxF,EAAiByF,MACxBC,KAAM1F,EAAiBiF,KACvBU,MAAO3F,EAAiB4F,OAIhC/D,SAIAgE,WACI,OAAOvc,KAAKyJ,MAGhB+S,SAAS/S,GAEL,OADAzJ,KAAKyJ,MAAQA,EACNzJ,KAGXyc,UACI,OAAO7Z,EAAQ5C,KAAK0c,KAAM,SAAU,yBAMxCC,oBACI,MAAMzb,EAAWlB,KAAKmT,cAEtB,OADAvQ,EAAQ5C,KAAKoR,MAAO,UAAW,cAAclQ,uBACtC0B,EAAQ5C,KAAK0c,KAAM,SAAU,cAAcxb,qBAMtD0b,QAAQF,GAEJ,OADA1c,KAAK0c,KAAOA,EACL1c,KAGX6c,WACI,OAAO7c,KAAKoR,MAGhB0L,aACI,OAAOla,EAAQ5C,KAAKoR,MAAO,UAAW,kCAG1C2L,SAAS3L,GAEL,OADApR,KAAKoR,MAAQA,EACNpR,KAGXgd,qBACI,OAAOhd,KAAKid,gBAGhBC,uBACI,OAAOta,EAAQ5C,KAAKid,gBAAiB,oBAAqB,6BAG9DE,mBAAmBlS,GAEf,OADAjL,KAAKid,gBAAkBhS,EAChBjL,KAGXod,cACI,OAAOpd,KAAKyb,SAMhB4B,YAAY5B,GAGR,OAFAzb,KAAKyb,SAA+B,iBAAbA,EAAwBF,EAASM,eAAeJ,GAAYA,EACnFzb,KAAKuY,QACEvY,KAGXsd,YAAYpa,GAER,OADAlD,KAAKwb,UAAYtY,EACVlD,KAGXoa,UAAUvS,GAEN,OADA7H,KAAKqX,QAAUxP,EACR7H,KAGXud,2BAA2B1a,GACvB7C,KAAK4b,wBAA0B/Y,EAGnC2a,6BACI,OAAOxd,KAAK4b,wBAMhBzB,UAAUtX,GAQN,OAPA7C,KAAKoX,QAAU,EACXpX,KAAKyb,WAAaF,EAASG,SAASC,KACpC3b,KAAKoX,SAAWvU,EAGhB7C,KAAKoX,SAAWvU,EAEb7C,KAGXyd,YACI,OAAOzd,KAAKoX,QAGhBzC,OAEI,MADA3U,KAAK0U,eACC,IAAIrS,EAAa,iBAAkB,6CAG7Cqb,sBAAsBC,EAAUjB,GAE5B,MAAMkB,EAAclB,EAAKmB,iBACnBpO,EAAUmO,EAAY9N,aACtBoK,EAAQwC,EAAKoB,WACbC,EAAiBH,EAAY3V,OAASwH,EAAQuO,UAAYvO,EAAQwO,WAAaje,KAAKwd,6BAC1FG,EAASO,SAASC,IACd,MAAMC,EAAiBD,EAAQN,iBAC3B3D,GACAiE,EAAQlE,SAASC,GACrBkE,EAAeC,WAAWN,OCnL/B,MAAMO,EAEEC,uBACP,OAAOve,KAAKwe,gBAAgB1Z,OAGrB2Z,mBACP,MAAO,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAG/BC,yBACP,MAAO,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAGnBC,0BACP,MAAO,CACH1T,EAAG,EACH5F,EAAG,EACH1E,EAAG,EACH4G,EAAG,EACH9G,EAAG,EACHkD,EAAG,EACHC,EAAG,GAIA4a,6BACP,MAAO,CAAC,IAAK,KAAM,IAAK,KAAM,IAAK,IAAK,KAAM,IAAK,KAAM,IAAK,KAAM,KAG7DI,gCACP,MAAO,CAAC,SAAU,KAAM,KAAM,KAAM,KAAM,KAAM,OAAQ,KAAM,KAAM,KAAM,KAAM,KAAM,UAG/EC,kCACP,MAAO,CACHC,OAAQ,CAAEpC,KAAM,EAAGqC,WAAY,GAC/BC,GAAI,CAAEtC,KAAM,EAAGqC,YAAa,GAC5BE,GAAI,CAAEvC,KAAM,EAAGqC,WAAY,GAC3BG,GAAI,CAAExC,KAAM,EAAGqC,YAAa,GAC5BI,GAAI,CAAEzC,KAAM,EAAGqC,WAAY,GAC3BK,GAAI,CAAE1C,KAAM,EAAGqC,WAAY,GAC3BM,KAAM,CAAE3C,KAAM,EAAGqC,YAAa,GAC9BO,GAAI,CAAE5C,KAAM,EAAGqC,WAAY,GAC3BQ,GAAI,CAAE7C,KAAM,EAAGqC,YAAa,GAC5BS,GAAI,CAAE9C,KAAM,EAAGqC,WAAY,GAC3BU,GAAI,CAAE/C,KAAM,EAAGqC,YAAa,GAC5BW,GAAI,CAAEhD,KAAM,EAAGqC,WAAY,GAC3BY,OAAQ,CAAEjD,KAAM,EAAGqC,WAAY,IAI5Ba,uBACP,MAAO,CACHxa,EAAG,EACH0Z,OAAQ,EACRE,GAAI,EACJa,GAAI,EACJC,KAAM,EACNC,EAAG,EACHC,EAAG,EACH,EAAG,EACHf,GAAI,EACJgB,KAAM,EACNC,EAAG,EACHC,EAAG,EACHjB,GAAI,EACJkB,GAAI,EACJC,KAAM,EACNlB,GAAI,EACJ,EAAG,EACHmB,KAAM,EACN,EAAG,EACHlB,GAAI,EACJ,KAAM,EACNmB,GAAI,EACJC,KAAM,EACNnB,KAAM,EACN,EAAG,EACHC,GAAI,EACJ,KAAM,EACNmB,GAAI,EACJC,KAAM,EACN,EAAG,EACHlB,GAAI,EACJmB,KAAM,EACNlB,GAAI,GACJmB,GAAI,GACJC,KAAM,GACNC,KAAM,GACNpB,GAAI,GACJqB,KAAM,GACN,EAAG,GACHpB,OAAQ,IAILqB,oBACP,MAAO,CACHC,MAAO,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAC1BC,MAAO,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAC1BC,OAAQ,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAC3BC,OAAQ,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAC3BC,SAAU,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAC7BC,OAAQ,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAC3BC,WAAY,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAC/BC,QAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAC5BC,QAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAIzBC,wBACP,MAAO,CACHC,EAAGrD,EAAM0C,OAAOC,MAChBW,EAAGtD,EAAM0C,OAAOE,OAIbW,yBACP,MAAO,CAAC,KAAM,IAAK,IAAK,IAAK,MAGtBC,wBACP,MAAO,CACH7W,EAAG,CAAE8W,WAAY,EAAGC,QAAS,GAC7BC,GAAI,CAAEF,WAAY,EAAGC,QAAS,GAC9B,KAAM,CAAED,WAAY,EAAGC,QAAS,GAChC,MAAO,CAAED,WAAY,EAAGC,QAAS,GACjCE,GAAI,CAAEH,WAAY,EAAGC,QAAS,IAC9BG,IAAK,CAAEJ,WAAY,EAAGC,QAAS,IAC/B3c,EAAG,CAAE0c,WAAY,EAAGC,QAAS,GAC7BI,GAAI,CAAEL,WAAY,EAAGC,QAAS,GAC9B,KAAM,CAAED,WAAY,EAAGC,QAAS,GAChC,MAAO,CAAED,WAAY,EAAGC,QAAS,GACjCK,GAAI,CAAEN,WAAY,EAAGC,QAAS,GAC9BM,IAAK,CAAEP,WAAY,EAAGC,QAAS,GAC/BrhB,EAAG,CAAEohB,WAAY,EAAGC,QAAS,GAC7BO,GAAI,CAAER,WAAY,EAAGC,QAAS,GAC9B,KAAM,CAAED,WAAY,EAAGC,QAAS,GAChC,MAAO,CAAED,WAAY,EAAGC,QAAS,GACjCQ,GAAI,CAAET,WAAY,EAAGC,QAAS,GAC9BS,IAAK,CAAEV,WAAY,EAAGC,QAAS,GAC/Bza,EAAG,CAAEwa,WAAY,EAAGC,QAAS,GAC7BU,GAAI,CAAEX,WAAY,EAAGC,QAAS,GAC9B,KAAM,CAAED,WAAY,EAAGC,QAAS,GAChC,MAAO,CAAED,WAAY,EAAGC,QAAS,GACjCW,GAAI,CAAEZ,WAAY,EAAGC,QAAS,GAC9BY,IAAK,CAAEb,WAAY,EAAGC,QAAS,GAC/BvhB,EAAG,CAAEshB,WAAY,EAAGC,QAAS,GAC7Ba,GAAI,CAAEd,WAAY,EAAGC,QAAS,GAC9B,KAAM,CAAED,WAAY,EAAGC,QAAS,GAChC,MAAO,CAAED,WAAY,EAAGC,QAAS,GACjCc,GAAI,CAAEf,WAAY,EAAGC,QAAS,GAC9Be,IAAK,CAAEhB,WAAY,EAAGC,QAAS,GAC/Bre,EAAG,CAAEoe,WAAY,EAAGC,QAAS,GAC7BgB,GAAI,CAAEjB,WAAY,EAAGC,QAAS,GAC9B,KAAM,CAAED,WAAY,EAAGC,QAAS,IAChC,MAAO,CAAED,WAAY,EAAGC,QAAS,IACjCiB,GAAI,CAAElB,WAAY,EAAGC,QAAS,GAC9BkB,IAAK,CAAEnB,WAAY,EAAGC,QAAS,GAC/Bpe,EAAG,CAAEme,WAAY,EAAGC,QAAS,IAC7BmB,GAAI,CAAEpB,WAAY,EAAGC,QAAS,IAC9B,KAAM,CAAED,WAAY,EAAGC,QAAS,GAChC,MAAO,CAAED,WAAY,EAAGC,QAAS,GACjCoB,GAAI,CAAErB,WAAY,EAAGC,QAAS,IAC9BqB,IAAK,CAAEtB,WAAY,EAAGC,QAAS,IAGvCsB,iBAAiB5G,GACb,OAAOA,GAAQ,GAAKA,EAAO4B,EAAME,gBAAgB1Z,OAErDye,qBAAqBC,GACjB,OAAOA,GAAY,GAAKA,EAAWlF,EAAMM,mBAAmB9Z,OAGhE2e,aAAaC,GACT,IAAKA,GAAcA,EAAW5e,OAAS,EACnC,MAAM,IAAIzC,EAAa,eAAgB,sBAAwBqhB,GAEnE,GAAIA,EAAW5e,OAAS,EACpB,MAAM,IAAIzC,EAAa,eAAgB,sBAAwBqhB,GAEnE,MAAMhH,EAAOgH,EAAWrW,cAElBsW,EADQ,8BACMC,KAAKlH,GACzB,GAAc,OAAViH,EAAgB,CAGhB,MAAO,CACHnkB,KAHSmkB,EAAM,GAIf5E,WAHe4E,EAAM,IAOzB,MAAM,IAAIthB,EAAa,eAAgB,sBAAwBqhB,GAIvEG,YAAYC,GACR,IAAKA,GAAaA,EAAUhf,OAAS,EACjC,MAAM,IAAIzC,EAAa,eAAgB,gBAAkByhB,GAE7D,MAAM3jB,EAAM2jB,EAAUzW,cAGhBsW,EADQ,qCACMC,KAAKzjB,GACzB,GAAc,OAAVwjB,EAAgB,CAChB,MAAMnkB,EAAOmkB,EAAM,GACb5E,EAAa4E,EAAM,GACzB,IAAI1S,EAAO0S,EAAM,GAIjB,OAFK1S,IACDA,EAAO,KACJ,CACHzR,KAAAA,EACAuf,WAAAA,EACA9N,KAAAA,GAIJ,MAAM,IAAI5O,EAAa,eAAgB,gBAAgByhB,KAI/DC,aAAaL,GACT,MAAMxe,EAAQoZ,EAAMwD,WAAW4B,GAC/B,QAAc5gB,IAAVoC,EACA,MAAM,IAAI7C,EAAa,eAAgB,sBAAsBqhB,KAEjE,OAAOxe,EAAM8c,QAGjBgC,iBAAiBC,GACb,MAAM/e,EAAQoZ,EAAMsB,UAAUqE,GAC9B,QAAcnhB,IAAVoC,EACA,MAAM,IAAI7C,EAAa,eAAgB,0BAA0B4hB,KAErE,OAAO/e,EAGXgf,qBAAqBC,GACjB,IAAKnkB,KAAKsjB,iBAAiBa,GACvB,MAAM,IAAI9hB,EAAa,eAAgB,uBAAuB8hB,KAElE,OAAO7F,EAAME,gBAAgB2F,GAGjCC,yBAAyBC,GACrB,IAAKrkB,KAAKujB,qBAAqBc,GAC3B,MAAM,IAAIhiB,EAAa,eAAgB,2BAA2BgiB,KAEtE,OAAO/F,EAAMM,mBAAmByF,GAKpCC,qBAAqBH,EAAWE,EAAeE,EAAY,GACvD,GAAkB,IAAdA,IAAkC,IAAfA,EACnB,MAAM,IAAIliB,EAAa,eAAgB,sBAAsBkiB,KAEjE,IAAIC,GAAOL,EAAYI,EAAYF,GAAiB/F,EAAMC,UAG1D,OAFIiG,EAAM,IACNA,GAAOlG,EAAMC,WACViG,EAKXC,oBAAoBjlB,EAAM2kB,GACtB,MAAMvM,EAAQ5X,KAAKyjB,aAAajkB,GAC1BklB,EAAY1kB,KAAK+jB,aAAanM,EAAMpY,MAC1C,IAAIgkB,EAAWW,EAAYO,EAC3B,GAAIvgB,KAAK6C,IAAIwc,GAAYlF,EAAMC,UAAY,EAAG,CAC1C,IAAIoG,EAAa,EACbnB,EAAW,IACXmB,GAAc,GAElB,MAAMC,GAAqBT,EAAY,GAAKO,EAAY,IAAMpG,EAAMC,UAAaoG,EACjF,GAAIxgB,KAAK6C,IAAI4d,GAAoB,EAC7B,MAAM,IAAIviB,EAAa,eAAgB,sBAAsB7C,MAAS2kB,MAGtEX,EAAWoB,EAGnB,GAAIzgB,KAAK6C,IAAIwc,GAAY,EACrB,MAAM,IAAInhB,EAAa,eAAgB,sBAAsB7C,MAAS2kB,MAE1E,IAAIU,EAAmBjN,EAAMpY,KAC7B,GAAIgkB,EAAW,EACX,IAAK,IAAI9b,EAAI,EAAGA,GAAK8b,IAAY9b,EAC7Bmd,GAAoB,SAGvB,GAAIrB,EAAW,EAChB,IAAK,IAAI9b,GAAK,EAAGA,GAAK8b,IAAY9b,EAC9Bmd,GAAoB,IAG5B,OAAOA,EAWXC,cAAc3kB,EAAKyf,GACf,MAAMmF,EAAQ,CAAC5kB,GACf,IAAI6kB,EAAW7kB,EACf,IAAK,IAAIuH,EAAI,EAAGA,EAAIkY,EAAU9a,OAAQ4C,IAClCsd,EAAWhlB,KAAKskB,qBAAqBU,EAAUpF,EAAUlY,IACrDsd,IAAa7kB,GACb4kB,EAAMlN,KAAKmN,GAEnB,OAAOD,EAMXE,mBAAmBC,EAAOC,EAAOZ,EAAY,GACzC,GAAkB,IAAdA,IAAkC,IAAfA,EACnB,MAAM,IAAIliB,EAAa,eAAgB,sBAAsBkiB,KAEjE,IAAKvkB,KAAKsjB,iBAAiB4B,KAAWllB,KAAKsjB,iBAAiB6B,GACxD,MAAM,IAAI9iB,EAAa,eAAgB,kBAAkB6iB,MAAUC,KAEvE,IAAIC,EAA2B,IAAdb,EAAkBY,EAAQD,EAAQA,EAAQC,EAG3D,OAFIC,EAAa,IACbA,GAAc9G,EAAMC,WACjB6G,EAQXC,eAAeC,GACX,MAAMC,EAAcvlB,KAAK6jB,YAAYyB,GACrC,IAAKC,EAAYtU,KACb,MAAM,IAAI5O,EAAa,eAAgB,mCAC3C,MAAMmjB,EAAYlH,EAAMoD,WAAW6D,EAAYtU,MAC/C,IAAIwU,EAAeF,EAAY/lB,KAG/B,GAFI+lB,EAAYxG,aACZ0G,GAAgBF,EAAYxG,aAC3ByG,EACD,MAAM,IAAInjB,EAAa,eAAgB,yBAA2BijB,GACtE,MAAMnO,EAAQnX,KAAK8kB,cAAc9kB,KAAK+jB,aAAa0B,GAAeD,GAC5DE,EAAepH,EAAMK,aAAa4G,EAAY/lB,MAC9CmmB,EAAW,GACjB,IAAK,IAAIje,EAAI,EAAGA,EAAI4W,EAAMG,MAAM3Z,SAAU4C,EAAG,CACzC,MAAM0J,GAASsU,EAAehe,GAAK4W,EAAMG,MAAM3Z,OACzC8gB,EAAWtH,EAAMG,MAAMrN,GAC7B,IAAIyU,EAAW7lB,KAAKykB,oBAAoBmB,EAAUzO,EAAMzP,IAChC,IAApBme,EAAS/gB,SACT+gB,GAAY,KAEhBF,EAASC,GAAYC,EAEzB,OAAOF,GC5Wf,MAAMG,EAAa,MAKbC,EAAY,CACd,MAAOD,MACP,EAAGA,MACH,EAAGA,KACH,EAAGA,KACH,EAAGA,KACH,GAAIA,KACJ,GAAIA,IACJ,GAAIA,IACJ,IAAKA,IACL,IAAKA,IAEHE,EAAkB,CACpBle,EAAG,IACHC,EAAG,IACHT,EAAG,IAIH1D,EAAG,OAEDqiB,EAAgB,CAClBC,EAAG,CAAEC,IAAK,GACVC,GAAI,CAAED,IAAK,GACXE,EAAG,CAAEC,IAAK,IAAKH,IAAK,GACpBI,GAAI,CAAED,IAAK,IAAKH,IAAK,GACrBK,GAAI,CAAEF,IAAK,IAAKH,IAAK,GACrBM,GAAI,CAAEH,IAAK,IAAKH,IAAK,GACrBO,GAAI,CAAEJ,IAAK,IAAKH,IAAK,GACrBQ,GAAI,CAAEL,IAAK,IAAKH,IAAK,GACrBS,GAAI,CAAEN,IAAK,IAAKH,IAAK,GACrBU,GAAI,CAAEP,IAAK,IAAKH,IAAK,GACrBW,GAAI,CAAER,IAAK,IAAKH,IAAK,GACrBY,IAAK,CAAET,IAAK,IAAKH,IAAK,GACtBa,GAAI,CAAEV,IAAK,IAAKH,IAAK,GACrBc,IAAK,CAAEX,IAAK,IAAKH,IAAK,GACtBe,GAAI,CAAEZ,IAAK,IAAKH,IAAK,GACrBgB,IAAK,CAAEb,IAAK,IAAKH,IAAK,GACtBiB,EAAG,CAAEd,IAAK,IAAKH,IAAK,GACpBkB,GAAI,CAAEf,IAAK,IAAKH,IAAK,GACrBmB,EAAG,CAAEhB,IAAK,IAAKH,IAAK,GACpBoB,GAAI,CAAEjB,IAAK,IAAKH,IAAK,GACrBqB,EAAG,CAAElB,IAAK,IAAKH,IAAK,GACpB,MAAO,CAAEG,IAAK,IAAKH,IAAK,GACxBsB,EAAG,CAAEnB,IAAK,IAAKH,IAAK,GACpB,MAAO,CAAEG,IAAK,IAAKH,IAAK,GACxBuB,EAAG,CAAEpB,IAAK,IAAKH,IAAK,GACpB,MAAO,CAAEG,IAAK,IAAKH,IAAK,GACxB,KAAM,CAAEG,IAAK,IAAKH,IAAK,GACvB,MAAO,CAAEG,IAAK,IAAKH,IAAK,GACxB,KAAM,CAAEG,IAAK,IAAKH,IAAK,GACvB,MAAO,CAAEG,IAAK,IAAKH,IAAK,IAEtBwB,EAAQ,CACVC,OAAQ,CAAEC,WAAY,GACtBC,KAAM,CAAED,WAAY,GACpBE,MAAO,CAAEF,WAAY,GACrBG,KAAM,CAAEH,WAAY,GACpBI,QAAS,CAAEJ,WAAY,GACvBK,WAAY,CAAEL,WAAY,GAC1B,gBAAiB,CAAEA,WAAY,GAC/B,aAAc,CAAEA,WAAY,GAC5B,aAAc,CAAEA,WAAY,GAC5BM,QAAS,CAAEN,WAAY,GACvBO,OAAQ,CAAEP,YAAa,IAErBQ,EAAY,CACdnC,EAAG,CAAE9U,MAAO,EAAG4Q,QAAS,GACxBsG,GAAI,CAAElX,MAAO,EAAG4Q,QAAS,EAAGjD,WAAY,KACxC,KAAM,CAAE3N,MAAO,EAAG4Q,QAAS,EAAGjD,WAAY,KAC1C,MAAO,CAAE3N,MAAO,EAAG4Q,QAAS,EAAGjD,WAAY,MAC3CwJ,GAAI,CAAEnX,MAAO,EAAG4Q,QAAS,GAAIjD,WAAY,KACzCyJ,IAAK,CAAEpX,MAAO,EAAG4Q,QAAS,GAAIjD,WAAY,MAC1CuI,EAAG,CAAElW,MAAO,EAAG4Q,QAAS,GACxByG,GAAI,CAAErX,MAAO,EAAG4Q,QAAS,EAAGjD,WAAY,KACxC,KAAM,CAAE3N,MAAO,EAAG4Q,QAAS,EAAGjD,WAAY,KAC1C,MAAO,CAAE3N,MAAO,EAAG4Q,QAAS,EAAGjD,WAAY,MAC3C2J,GAAI,CAAEtX,MAAO,EAAG4Q,QAAS,EAAGjD,WAAY,KACxC4J,IAAK,CAAEvX,MAAO,EAAG4Q,QAAS,EAAGjD,WAAY,MACzC0I,EAAG,CAAErW,MAAO,EAAG4Q,QAAS,GACxB4G,GAAI,CAAExX,MAAO,EAAG4Q,QAAS,EAAGjD,WAAY,KACxC,KAAM,CAAE3N,MAAO,EAAG4Q,QAAS,EAAGjD,WAAY,KAC1C,MAAO,CAAE3N,MAAO,EAAG4Q,QAAS,EAAGjD,WAAY,MAC3C8J,GAAI,CAAEzX,MAAO,EAAG4Q,QAAS,EAAGjD,WAAY,KACxC+J,IAAK,CAAE1X,MAAO,EAAG4Q,QAAS,EAAGjD,WAAY,MACzCsH,EAAG,CAAEjV,MAAO,EAAG4Q,QAAS,GACxB+G,GAAI,CAAE3X,MAAO,EAAG4Q,QAAS,EAAGjD,WAAY,KACxC,KAAM,CAAE3N,MAAO,EAAG4Q,QAAS,EAAGjD,WAAY,KAC1C,MAAO,CAAE3N,MAAO,EAAG4Q,QAAS,EAAGjD,WAAY,MAC3CiK,GAAI,CAAE5X,MAAO,EAAG4Q,QAAS,EAAGjD,WAAY,KACxCkK,IAAK,CAAE7X,MAAO,EAAG4Q,QAAS,EAAGjD,WAAY,MACzCqI,EAAG,CAAEhW,MAAO,EAAG4Q,QAAS,GACxBkH,GAAI,CAAE9X,MAAO,EAAG4Q,QAAS,EAAGjD,WAAY,KACxC,KAAM,CAAE3N,MAAO,EAAG4Q,QAAS,EAAGjD,WAAY,KAC1C,MAAO,CAAE3N,MAAO,EAAG4Q,QAAS,EAAGjD,WAAY,MAC3CoK,GAAI,CAAE/X,MAAO,EAAG4Q,QAAS,EAAGjD,WAAY,KACxCqK,IAAK,CAAEhY,MAAO,EAAG4Q,QAAS,EAAGjD,WAAY,MACzCyI,EAAG,CAAEpW,MAAO,EAAG4Q,QAAS,GACxBqH,GAAI,CAAEjY,MAAO,EAAG4Q,QAAS,EAAGjD,WAAY,KACxC,KAAM,CAAE3N,MAAO,EAAG4Q,QAAS,GAAIjD,WAAY,KAC3C,MAAO,CAAE3N,MAAO,EAAG4Q,QAAS,GAAIjD,WAAY,MAC5CuK,GAAI,CAAElY,MAAO,EAAG4Q,QAAS,EAAGjD,WAAY,KACxCwK,IAAK,CAAEnY,MAAO,EAAG4Q,QAAS,EAAGjD,WAAY,MACzC2I,EAAG,CAAEtW,MAAO,EAAG4Q,QAAS,IACxBwH,GAAI,CAAEpY,MAAO,EAAG4Q,QAAS,GAAIjD,WAAY,KACzC,KAAM,CAAE3N,MAAO,EAAG4Q,QAAS,GAAIjD,WAAY,KAC3C,MAAO,CAAE3N,MAAO,EAAG4Q,QAAS,GAAIjD,WAAY,MAC5C0K,GAAI,CAAErY,MAAO,EAAG4Q,QAAS,GAAIjD,WAAY,KACzC2K,IAAK,CAAEtY,MAAO,EAAG4Q,QAAS,EAAGjD,WAAY,MACzC4K,EAAG,CAAEvY,MAAO,EAAGwY,MAAM,GACrBC,EAAG,CACCzY,MAAO,EACP2N,WAAY,GACZY,OAAQ,EACRpd,KAAM,iBACNunB,YAAa,MAWfC,EAAkB,CAEpBC,GAAI,CAAEznB,KAAM,wBACZ0nB,GAAI,CAAE1nB,KAAM,uBACZ2nB,GAAI,CAAE3nB,KAAM,wBACZ4nB,GAAI,CAAE5nB,KAAM,wBAEZ6nB,GAAI,CAAE7nB,KAAM,2BACZ8nB,GAAI,CAAE9nB,KAAM,0BACZ+nB,GAAI,CAAE/nB,KAAM,2BACZgoB,GAAI,CAAEhoB,KAAM,2BAEZioB,GAAI,CAAEjoB,KAAM,kBACZkoB,GAAI,CAAEloB,KAAM,iBACZmoB,GAAI,CAAEnoB,KAAM,kBACZooB,GAAI,CAAEpoB,KAAM,mBAEZqoB,GAAI,CAAEroB,KAAM,uBACZsoB,GAAI,CAAEtoB,KAAM,uBAEZuoB,GAAI,CAAEvoB,KAAM,wBACZwoB,GAAI,CAAExoB,KAAM,yBAEVsf,EAAc,CAChB,IAAK,CAAEtf,KAAM,kBAAmByoB,6BAA8B,GAC9D,KAAM,CAAEzoB,KAAM,wBAAyByoB,6BAA8B,GACrEpnB,EAAG,CAAErB,KAAM,iBAAkByoB,6BAA8B,GAC3D5H,GAAI,CAAE7gB,KAAM,uBAAwByoB,6BAA8B,GAClElnB,EAAG,CAAEvB,KAAM,oBAAqByoB,6BAA8B,GAC9D,IAAK,CAAEzoB,KAAM,uBAAwByoB,6BAA8B,GACnE,IAAK,CAAEzoB,KAAM,wBAAyByoB,6BAA8B,GACpE3I,GAAI,CAAE9f,KAAM,4CAA6CyoB,6BAA8B,GACvF3lB,EAAG,CAAE9C,KAAM,iCAAkCyoB,4BAA6B,GAC1E,KAAM,CAAEzoB,KAAM,wCAAyCyoB,6BAA8B,GACrF,IAAK,CAAEzoB,KAAM,kCAAmCyoB,6BAA8B,GAC9E,KAAM,CAAEzoB,KAAM,+BAAgCyoB,6BAA8B,GAC5EC,GAAI,CAAE1oB,KAAM,uBAAwByoB,6BAA8B,GAClEE,IAAK,CAAE3oB,KAAM,8BAA+ByoB,6BAA8B,GAC1E5qB,EAAG,CAAEmC,KAAM,iBAAkByoB,6BAA8B,GAC3DxY,EAAG,CAAEjQ,KAAM,kBAAmByoB,6BAA8B,GAC5DG,IAAK,CAAE5oB,KAAM,2BAA4ByoB,6BAA8B,GACvE,MAAO,CAAEzoB,KAAM,2BAA4ByoB,6BAA8B,GACzEI,KAAM,CAAE7oB,KAAM,2BAA4ByoB,6BAA8B,GACxEK,KAAM,CAAE9oB,KAAM,2BAA4ByoB,6BAA8B,GACxEM,wBAAyB,CAAE/oB,KAAM,0BAA2ByoB,6BAA8B,GAC1FO,0BAA2B,CAAEhpB,KAAM,4BAA6ByoB,6BAA8B,GAC9FQ,oBAAqB,CAAEjpB,KAAM,sBAAuByoB,6BAA8B,GAClFS,sBAAuB,CAAElpB,KAAM,wBAAyByoB,6BAA8B,GACtFU,oBAAqB,CAAEnpB,KAAM,sBAAuByoB,6BAA8B,GAClFW,sBAAuB,CAAEppB,KAAM,wBAAyByoB,6BAA8B,GACtFY,2BAA4B,CAAErpB,KAAM,6BAA8ByoB,6BAA8B,GAChGa,6BAA8B,CAAEtpB,KAAM,+BAAgCyoB,6BAA8B,GACpGc,4BAA6B,CAAEvpB,KAAM,8BAA+ByoB,6BAA8B,GAClGe,8BAA+B,CAAExpB,KAAM,gCAAiCyoB,6BAA8B,GACtGgB,4BAA6B,CAAEzpB,KAAM,8BAA+ByoB,6BAA8B,GAClGiB,8BAA+B,CAAE1pB,KAAM,gCAAiCyoB,6BAA8B,GACtGkB,2BAA4B,CAAE3pB,KAAM,6BAA8ByoB,6BAA8B,GAChGmB,6BAA8B,CAAE5pB,KAAM,+BAAgCyoB,6BAA8B,GACpGoB,2BAA4B,CAAE7pB,KAAM,6BAA8ByoB,6BAA8B,GAChGqB,6BAA8B,CAAE9pB,KAAM,+BAAgCyoB,6BAA8B,GACpGsB,wBAAyB,CAAE/pB,KAAM,0BAA2ByoB,6BAA8B,GAC1FuB,qBAAsB,CAAEhqB,KAAM,uBAAwByoB,6BAA8B,GACpFwB,uBAAwB,CAAEjqB,KAAM,yBAA0ByoB,6BAA8B,GACxFyB,oBAAqB,CAAElqB,KAAM,sBAAuByoB,6BAA8B,GAClF0B,uBAAwB,CAAEnqB,KAAM,yBAA0ByoB,6BAA8B,GACxF2B,oBAAqB,CAAEpqB,KAAM,sBAAuByoB,6BAA8B,GAClF4B,yBAA0B,CAAErqB,KAAM,2BAA4ByoB,6BAA8B,GAC5F6B,sBAAuB,CAAEtqB,KAAM,wBAAyByoB,6BAA8B,GACtF8B,iBAAkB,CAAEvqB,KAAM,mBAAoByoB,6BAA8B,GAC5E+B,gBAAiB,CAAExqB,KAAM,kBAAmByoB,6BAA8B,GAC1EgC,uBAAwB,CAAEzqB,KAAM,yBAA0ByoB,6BAA8B,GACxFiC,wBAAyB,CAAE1qB,KAAM,0BAA2ByoB,6BAA8B,GAC1FkC,qBAAsB,CAAE3qB,KAAM,uBAAwByoB,6BAA8B,GACpFmC,sBAAuB,CAAE5qB,KAAM,wBAAyByoB,6BAA8B,GACtFoC,qBAAsB,CAAE7qB,KAAM,uBAAwByoB,6BAA8B,GACpFqC,sBAAuB,CAAE9qB,KAAM,wBAAyByoB,6BAA8B,GACtFsC,sBAAuB,CAAE/qB,KAAM,wBAAyByoB,6BAA8B,GACtFuC,uBAAwB,CAAEhrB,KAAM,yBAA0ByoB,6BAA8B,GACxFwC,sBAAuB,CAAEjrB,KAAM,wBAAyByoB,6BAA8B,GACtFyC,uBAAwB,CAAElrB,KAAM,yBAA0ByoB,6BAA8B,GACxF0C,sBAAuB,CAAEnrB,KAAM,wBAAyByoB,6BAA8B,GACtF2C,uBAAwB,CAAEprB,KAAM,yBAA0ByoB,6BAA8B,GACxF4C,sBAAuB,CAAErrB,KAAM,wBAAyByoB,6BAA8B,GACtF6C,uBAAwB,CAAEtrB,KAAM,yBAA0ByoB,6BAA8B,GACxF8C,sBAAuB,CAAEvrB,KAAM,wBAAyByoB,6BAA8B,GACtF+C,uBAAwB,CAAExrB,KAAM,yBAA0ByoB,6BAA8B,GACxFgD,8BAA+B,CAAEzrB,KAAM,gCAAiCyoB,6BAA8B,GACtGiD,2BAA4B,CAAE1rB,KAAM,6BAA8ByoB,6BAA8B,GAChGkD,6BAA8B,CAAE3rB,KAAM,+BAAgCyoB,6BAA8B,GACpGmD,0BAA2B,CAAE5rB,KAAM,4BAA6ByoB,6BAA8B,GAC9FoD,6BAA8B,CAAE7rB,KAAM,+BAAgCyoB,6BAA8B,GACpGqD,0BAA2B,CAAE9rB,KAAM,4BAA6ByoB,6BAA8B,GAC9FsD,+BAAgC,CAAE/rB,KAAM,iCAAkCyoB,6BAA8B,GACxGuD,4BAA6B,CAAEhsB,KAAM,8BAA+ByoB,6BAA8B,GAClGwD,uBAAwB,CAAEjsB,KAAM,yBAA0ByoB,6BAA8B,GACxFyD,sBAAuB,CAAElsB,KAAM,wBAAyByoB,6BAA8B,GACtF0D,yBAA0B,CAAEnsB,KAAM,2BAA4ByoB,6BAA8B,GAC5F2D,2BAA4B,CAAEpsB,KAAM,6BAA8ByoB,6BAA8B,GAChG4D,qBAAsB,CAAErsB,KAAM,uBAAwByoB,6BAA8B,GACpF6D,uBAAwB,CAAEtsB,KAAM,yBAA0ByoB,6BAA8B,GACxF8D,qBAAsB,CAAEvsB,KAAM,uBAAwByoB,6BAA8B,GACpF+D,uBAAwB,CAAExsB,KAAM,yBAA0ByoB,6BAA8B,GACxFgE,uBAAwB,CAAEzsB,KAAM,yBAA0ByoB,6BAA8B,GACxFiE,yBAA0B,CAAE1sB,KAAM,2BAA4ByoB,6BAA8B,GAC5FkE,6BAA8B,CAAE3sB,KAAM,+BAAgCyoB,6BAA8B,GACpGmE,+BAAgC,CAAE5sB,KAAM,iCAAkCyoB,6BAA8B,GACxGoE,0BAA2B,CAAE7sB,KAAM,4BAA6ByoB,6BAA8B,GAC9FqE,uBAAwB,CAAE9sB,KAAM,yBAA0ByoB,6BAA8B,GACxFsE,0BAA2B,CAAE/sB,KAAM,4BAA6ByoB,6BAA8B,GAC9FuE,uBAAwB,CAAEhtB,KAAM,yBAA0ByoB,6BAA8B,GACxFwE,wBAAyB,CAAEjtB,KAAM,0BAA2ByoB,6BAA8B,GAC1FyE,qBAAsB,CAAEltB,KAAM,uBAAwByoB,6BAA8B,GACpF0E,wBAAyB,CAAEntB,KAAM,0BAA2ByoB,6BAA8B,GAC1F2E,qBAAsB,CAAEptB,KAAM,uBAAwByoB,6BAA8B,GACpF4E,0BAA2B,CAAErtB,KAAM,4BAA6ByoB,6BAA8B,GAC9F6E,uBAAwB,CAAEttB,KAAM,yBAA0ByoB,6BAA8B,GACxF8E,wBAAyB,CAAEvtB,KAAM,0BAA2ByoB,6BAA8B,GAC1F+E,yBAA0B,CAAExtB,KAAM,2BAA4ByoB,6BAA8B,GAC5FgF,sBAAuB,CAAEztB,KAAM,wBAAyByoB,6BAA8B,GACtFiF,uBAAwB,CAAE1tB,KAAM,yBAA0ByoB,6BAA8B,GACxFkF,sBAAuB,CAAE3tB,KAAM,wBAAyByoB,6BAA8B,GACtFmF,uBAAwB,CAAE5tB,KAAM,yBAA0ByoB,6BAA8B,GACxFoF,wBAAyB,CAAE7tB,KAAM,0BAA2ByoB,6BAA8B,GAC1FqF,yBAA0B,CAAE9tB,KAAM,2BAA4ByoB,6BAA8B,GAC5FsF,wBAAyB,CAAE/tB,KAAM,0BAA2ByoB,6BAA8B,GAC1FuF,yBAA0B,CAAEhuB,KAAM,2BAA4ByoB,6BAA8B,GAC5FwF,gCAAiC,CAAEjuB,KAAM,kCAAmCyoB,6BAA8B,GAC1GyF,6BAA8B,CAAEluB,KAAM,+BAAgCyoB,6BAA8B,GACpG0F,gCAAiC,CAAEnuB,KAAM,kCAAmCyoB,6BAA8B,GAC1G2F,6BAA8B,CAAEpuB,KAAM,+BAAgCyoB,6BAA8B,GACpG4F,8BAA+B,CAAEruB,KAAM,gCAAiCyoB,6BAA8B,GACtG6F,2BAA4B,CAAEtuB,KAAM,6BAA8ByoB,6BAA8B,GAChG8F,8BAA+B,CAAEvuB,KAAM,gCAAiCyoB,6BAA8B,GACtG+F,2BAA4B,CAAExuB,KAAM,6BAA8ByoB,6BAA8B,GAChGgG,gCAAiC,CAAEzuB,KAAM,kCAAmCyoB,6BAA8B,GAC1GiG,6BAA8B,CAAE1uB,KAAM,+BAAgCyoB,6BAA8B,GACpGkG,qBAAsB,CAAE3uB,KAAM,uBAAwByoB,6BAA8B,GACpFmG,uBAAwB,CAAE5uB,KAAM,yBAA0ByoB,6BAA8B,GACxFoG,uBAAwB,CAAE7uB,KAAM,yBAA0ByoB,6BAA8B,GACxFqG,yBAA0B,CAAE9uB,KAAM,2BAA4ByoB,6BAA8B,GAC5FsG,6BAA8B,CAAE/uB,KAAM,+BAAgCyoB,6BAA8B,GACpGuG,+BAAgC,CAAEhvB,KAAM,iCAAkCyoB,6BAA8B,GACxGwG,0BAA2B,CAAEjvB,KAAM,4BAA6ByoB,6BAA8B,GAC9FyG,uBAAwB,CAAElvB,KAAM,yBAA0ByoB,6BAA8B,GACxF0G,0BAA2B,CAAEnvB,KAAM,4BAA6ByoB,6BAA8B,GAC9F2G,uBAAwB,CAAEpvB,KAAM,yBAA0ByoB,6BAA8B,GACxF4G,wBAAyB,CAAErvB,KAAM,0BAA2ByoB,6BAA8B,GAC1F6G,qBAAsB,CAAEtvB,KAAM,uBAAwByoB,6BAA8B,GACpF8G,sBAAuB,CAAEvvB,KAAM,wBAAyByoB,6BAA8B,GACtF+G,uBAAwB,CAAExvB,KAAM,yBAA0ByoB,6BAA8B,GACxFgH,wBAAyB,CAAEzvB,KAAM,0BAA2ByoB,6BAA8B,GAC1FiH,yBAA0B,CAAE1vB,KAAM,2BAA4ByoB,6BAA8B,GAC5FkH,wBAAyB,CAAE3vB,KAAM,0BAA2ByoB,6BAA8B,GAC1FmH,yBAA0B,CAAE5vB,KAAM,2BAA4ByoB,6BAA8B,GAC5FoH,gCAAiC,CAAE7vB,KAAM,kCAAmCyoB,6BAA8B,GAC1GqH,6BAA8B,CAAE9vB,KAAM,+BAAgCyoB,6BAA8B,GACpGsH,gCAAiC,CAAE/vB,KAAM,kCAAmCyoB,6BAA8B,GAC1GuH,6BAA8B,CAAEhwB,KAAM,+BAAgCyoB,6BAA8B,GACpGwH,8BAA+B,CAAEjwB,KAAM,gCAAiCyoB,6BAA8B,GACtGyH,2BAA4B,CAAElwB,KAAM,6BAA8ByoB,6BAA8B,GAChG0H,uBAAwB,CAAEnwB,KAAM,yBAA0ByoB,6BAA8B,GACxF2H,yBAA0B,CAAEpwB,KAAM,2BAA4ByoB,6BAA8B,GAC5F4H,uBAAwB,CAAErwB,KAAM,yBAA0ByoB,6BAA8B,GACxF6H,yBAA0B,CAAEtwB,KAAM,2BAA4ByoB,6BAA8B,GAC5F8H,sBAAuB,CAAEvwB,KAAM,wBAAyByoB,6BAA8B,GACtF+H,wBAAyB,CAAExwB,KAAM,0BAA2ByoB,6BAA8B,GAC1FgI,wBAAyB,CAAEzwB,KAAM,0BAA2ByoB,6BAA8B,GAC1FiI,0BAA2B,CAAE1wB,KAAM,4BAA6ByoB,6BAA8B,GAC9FkI,qBAAsB,CAAE3wB,KAAM,uBAAwByoB,6BAA8B,GACpFmI,uBAAwB,CAAE5wB,KAAM,yBAA0ByoB,6BAA8B,GACxFoI,uBAAwB,CAAE7wB,KAAM,yBAA0ByoB,6BAA8B,GACxFqI,yBAA0B,CAAE9wB,KAAM,2BAA4ByoB,6BAA8B,GAC5FsI,2BAA4B,CAAE/wB,KAAM,6BAA8ByoB,6BAA8B,GAChGuI,6BAA8B,CAAEhxB,KAAM,+BAAgCyoB,6BAA8B,GACpGwI,2BAA4B,CAAEjxB,KAAM,6BAA8ByoB,6BAA8B,GAChGyI,6BAA8B,CAAElxB,KAAM,+BAAgCyoB,6BAA8B,GACpG0I,8BAA+B,CAAEnxB,KAAM,gCAAiCyoB,6BAA8B,GACtG2I,gCAAiC,CAAEpxB,KAAM,kCAAmCyoB,6BAA8B,GAC1G4I,+BAAgC,CAAErxB,KAAM,iCAAkCyoB,6BAA8B,GACxG6I,iCAAkC,CAAEtxB,KAAM,mCAAoCyoB,6BAA8B,GAC5G8I,4BAA6B,CAAEvxB,KAAM,8BAA+ByoB,6BAA8B,GAClG+I,8BAA+B,CAAExxB,KAAM,gCAAiCyoB,6BAA8B,GACtGgJ,8BAA+B,CAAEzxB,KAAM,gCAAiCyoB,6BAA8B,GACtGiJ,gCAAiC,CAAE1xB,KAAM,kCAAmCyoB,6BAA8B,GAC1GkJ,2BAA4B,CAAE3xB,KAAM,6BAA8ByoB,6BAA8B,GAChGmJ,6BAA8B,CAAE5xB,KAAM,+BAAgCyoB,6BAA8B,GACpGoJ,8BAA+B,CAAE7xB,KAAM,gCAAiCyoB,6BAA8B,GACtGqJ,gCAAiC,CAAE9xB,KAAM,kCAAmCyoB,6BAA8B,GAC1GsJ,6BAA8B,CAAE/xB,KAAM,+BAAgCyoB,6BAA8B,GACpGuJ,+BAAgC,CAAEhyB,KAAM,iCAAkCyoB,6BAA8B,GACxGwJ,wBAAyB,CAAEjyB,KAAM,0BAA2ByoB,6BAA8B,GAC1FyJ,qBAAsB,CAAElyB,KAAM,uBAAwByoB,6BAA8B,GACpF0J,wBAAyB,CAAEnyB,KAAM,0BAA2ByoB,6BAA8B,GAC1F2J,qBAAsB,CAAEpyB,KAAM,uBAAwByoB,6BAA8B,GACpF4J,0BAA2B,CAAEryB,KAAM,4BAA6ByoB,6BAA8B,GAC9F6J,uBAAwB,CAAEtyB,KAAM,yBAA0ByoB,6BAA8B,GACxF8J,wBAAyB,CAAEvyB,KAAM,0BAA2ByoB,6BAA8B,GAC1F+J,qBAAsB,CAAExyB,KAAM,uBAAwByoB,6BAA8B,GACpFgK,2BAA4B,CAAEzyB,KAAM,6BAA8ByoB,6BAA8B,GAChGiK,wBAAyB,CAAE1yB,KAAM,0BAA2ByoB,6BAA8B,GAC1FkK,yBAA0B,CAAE3yB,KAAM,2BAA4ByoB,6BAA8B,GAC5FmK,sBAAuB,CAAE5yB,KAAM,wBAAyByoB,6BAA8B,GACtFoK,wBAAyB,CAAE7yB,KAAM,0BAA2ByoB,6BAA8B,GAC1FqK,qBAAsB,CAAE9yB,KAAM,uBAAwByoB,6BAA8B,GACpFsK,wBAAyB,CAAE/yB,KAAM,0BAA2ByoB,6BAA8B,GAC1FuK,qBAAsB,CAAEhzB,KAAM,uBAAwByoB,6BAA8B,GACpFwK,sBAAuB,CAAEjzB,KAAM,wBAAyByoB,6BAA8B,GACtFyK,uBAAwB,CAAElzB,KAAM,yBAA0ByoB,6BAA8B,GACxF0K,sBAAuB,CAAEnzB,KAAM,wBAAyByoB,6BAA8B,GACtF2K,uBAAwB,CAAEpzB,KAAM,yBAA0ByoB,6BAA8B,GACxF4K,uBAAwB,CAAErzB,KAAM,yBAA0ByoB,6BAA8B,GACxF6K,wBAAyB,CAAEtzB,KAAM,0BAA2ByoB,6BAA8B,GAC1F8K,yBAA0B,CAAEvzB,KAAM,2BAA4ByoB,6BAA8B,GAC5F+K,0BAA2B,CAAExzB,KAAM,4BAA6ByoB,6BAA8B,GAC9FgL,sBAAuB,CAAEzzB,KAAM,wBAAyByoB,6BAA8B,GACtFiL,uBAAwB,CAAE1zB,KAAM,yBAA0ByoB,6BAA8B,GACxFkL,wBAAyB,CAAE3zB,KAAM,0BAA2ByoB,6BAA8B,GAC1FmL,yBAA0B,CAAE5zB,KAAM,2BAA4ByoB,6BAA8B,GAC5FoL,sBAAuB,CAAE7zB,KAAM,wBAAyByoB,6BAA8B,GACtFqL,uBAAwB,CAAE9zB,KAAM,yBAA0ByoB,6BAA8B,GACxFsL,sBAAuB,CAAE/zB,KAAM,wBAAyByoB,6BAA8B,GACtFuL,uBAAwB,CAAEh0B,KAAM,yBAA0ByoB,6BAA8B,GACxFwL,wBAAyB,CAAEj0B,KAAM,0BAA2ByoB,6BAA8B,GAC1FyL,yBAA0B,CAAEl0B,KAAM,2BAA4ByoB,6BAA8B,GAC5F0L,yBAA0B,CAAEn0B,KAAM,2BAA4ByoB,6BAA8B,GAC5F2L,0BAA2B,CAAEp0B,KAAM,4BAA6ByoB,6BAA8B,GAC9F4L,sBAAuB,CAAEr0B,KAAM,wBAAyByoB,6BAA8B,GACtF6L,uBAAwB,CAAEt0B,KAAM,yBAA0ByoB,6BAA8B,GACxF8L,wBAAyB,CAAEv0B,KAAM,0BAA2ByoB,6BAA8B,GAC1F+L,yBAA0B,CAAEx0B,KAAM,2BAA4ByoB,6BAA8B,GAC5FgM,sBAAuB,CAAEz0B,KAAM,wBAAyByoB,6BAA8B,GACtFiM,uBAAwB,CAAE10B,KAAM,yBAA0ByoB,6BAA8B,GACxFkM,yBAA0B,CAAE30B,KAAM,2BAA4ByoB,6BAA8B,GAC5FmM,0BAA2B,CAAE50B,KAAM,4BAA6ByoB,6BAA8B,GAC9FoM,wBAAyB,CAAE70B,KAAM,0BAA2ByoB,6BAA8B,GAC1FqM,yBAA0B,CAAE90B,KAAM,2BAA4ByoB,6BAA8B,GAC5FsM,8BAA+B,CAAE/0B,KAAM,gCAAiCyoB,6BAA8B,GACtGuM,2BAA4B,CAAEh1B,KAAM,6BAA8ByoB,6BAA8B,GAChGwM,8BAA+B,CAAEj1B,KAAM,gCAAiCyoB,6BAA8B,GACtGyM,2BAA4B,CAAEl1B,KAAM,6BAA8ByoB,6BAA8B,GAChG0M,gCAAiC,CAAEn1B,KAAM,kCAAmCyoB,6BAA8B,GAC1G2M,6BAA8B,CAAEp1B,KAAM,+BAAgCyoB,6BAA8B,GACpG4M,8BAA+B,CAAEr1B,KAAM,gCAAiCyoB,6BAA8B,GACtG6M,2BAA4B,CAAEt1B,KAAM,6BAA8ByoB,6BAA8B,GAChG8M,iCAAkC,CAAEv1B,KAAM,mCAAoCyoB,6BAA8B,GAC5G+M,8BAA+B,CAAEx1B,KAAM,gCAAiCyoB,6BAA8B,GACtGgN,+BAAgC,CAAEz1B,KAAM,iCAAkCyoB,6BAA8B,GACxGiN,4BAA6B,CAAE11B,KAAM,8BAA+ByoB,6BAA8B,GAClGkN,8BAA+B,CAAE31B,KAAM,gCAAiCyoB,6BAA8B,GACtGmN,2BAA4B,CAAE51B,KAAM,6BAA8ByoB,6BAA8B,GAChGoN,8BAA+B,CAAE71B,KAAM,gCAAiCyoB,6BAA8B,GACtGqN,2BAA4B,CAAE91B,KAAM,6BAA8ByoB,6BAA8B,GAChGsN,mBAAoB,CAAE/1B,KAAM,qBAAsByoB,6BAA8B,GAChFuN,qBAAsB,CAAEh2B,KAAM,uBAAwByoB,6BAA8B,GACpFwN,iBAAkB,CAAEj2B,KAAM,mBAAoByoB,6BAA8B,GAC5EyN,iBAAkB,CAAEl2B,KAAM,mBAAoByoB,6BAA8B,GAC5E0N,mBAAoB,CAAEn2B,KAAM,qBAAsByoB,6BAA8B,GAChF2N,qBAAsB,CAAEp2B,KAAM,uBAAwByoB,6BAA8B,GACpF4N,oBAAqB,CAAEr2B,KAAM,sBAAuByoB,6BAA8B,GAClF6N,sBAAuB,CAAEt2B,KAAM,wBAAyByoB,6BAA8B,GACtF8N,mBAAoB,CAAEv2B,KAAM,qBAAsByoB,6BAA8B,GAChF+N,qBAAsB,CAAEx2B,KAAM,uBAAwByoB,6BAA8B,GACpFgO,oBAAqB,CAAEz2B,KAAM,sBAAuByoB,6BAA8B,GAClFiO,sBAAuB,CAAE12B,KAAM,wBAAyByoB,6BAA8B,GACtFkO,oBAAqB,CAAE32B,KAAM,sBAAuByoB,6BAA8B,GAClFmO,sBAAuB,CAAE52B,KAAM,wBAAyByoB,6BAA8B,GACtFoO,oBAAqB,CAAE72B,KAAM,sBAAuByoB,6BAA8B,GAClFqO,sBAAuB,CAAE92B,KAAM,wBAAyByoB,6BAA8B,GACtFsO,oBAAqB,CAAE/2B,KAAM,sBAAuByoB,6BAA8B,GAClFuO,sBAAuB,CAAEh3B,KAAM,wBAAyByoB,6BAA8B,GACtFwO,oBAAqB,CAAEj3B,KAAM,sBAAuByoB,6BAA8B,GAClFyO,sBAAuB,CAAEl3B,KAAM,wBAAyByoB,6BAA8B,GACtF0O,oBAAqB,CAAEn3B,KAAM,sBAAuByoB,6BAA8B,GAClF2O,sBAAuB,CAAEp3B,KAAM,wBAAyByoB,6BAA8B,GACtF4O,oBAAqB,CAAEr3B,KAAM,sBAAuByoB,6BAA8B,GAClF6O,sBAAuB,CAAEt3B,KAAM,wBAAyByoB,6BAA8B,GACtF8O,oBAAqB,CAAEv3B,KAAM,sBAAuByoB,6BAA8B,GAClF+O,sBAAuB,CAAEx3B,KAAM,wBAAyByoB,6BAA8B,GACtFgP,4BAA6B,CAAEz3B,KAAM,8BAA+ByoB,6BAA8B,GAClGiP,8BAA+B,CAAE13B,KAAM,gCAAiCyoB,6BAA8B,GACtGkP,6BAA8B,CAAE33B,KAAM,+BAAgCyoB,6BAA8B,GACpGmP,oCAAqC,CACjC53B,KAAM,sCACNyoB,6BAA8B,GAElCoP,qBAAsB,CAAE73B,KAAM,uBAAwByoB,6BAA8B,GACpFqP,sBAAuB,CAAE93B,KAAM,wBAAyByoB,6BAA8B,IAkCpFsP,EAAgB,CAClB,KAAM,CAAE/3B,KAAM,kBAAmBg4B,eAAe,GAChDC,GAAI,CACAC,UAAW,0BACXC,UAAW,0BACXH,eAAe,GAEnB,KAAM,CACFE,UAAW,mBACXC,UAAW,mBACXH,eAAe,GAEnB,KAAM,CACFE,UAAW,mBACXC,UAAW,mBACXH,eAAe,GAEnB,KAAM,CACFE,UAAW,oBACXC,UAAW,oBACXH,eAAe,GAEnB,KAAM,CAAEh4B,KAAM,2BAA4Bg4B,eAAe,GACzDI,GAAI,CACAF,UAAW,4BACXC,UAAW,4BACXH,eAAe,GAEnBK,GAAI,CAAEr4B,KAAM,kBAAmBg4B,eAAe,GAC9C,KAAM,CAAEE,UAAW,eAAgBC,UAAW,eAAgBH,eAAe,GAC7E,MAAO,CAAEh4B,KAAM,eAAgBg4B,eAAe,GAC9C,MAAO,CAAEh4B,KAAM,eAAgBg4B,eAAe,GAC9C,KAAM,CAAEh4B,KAAM,eAAgBg4B,eAAe,GAC7CM,GAAI,CAAEt4B,KAAM,iBAAkBg4B,eAAe,GAC7C,KAAM,CAAEh4B,KAAM,kBAAmBg4B,eAAe,IAE9CO,EAAY,CACdC,QAAS,CAAEx4B,KAAM,sBACjBy4B,iBAAkB,CAAEz4B,KAAM,mBAC1B04B,KAAM,CAAE14B,KAAM,gBACd24B,cAAe,CAAE34B,KAAM,qBACvB44B,GAAI,CAAE54B,KAAM,iBACZ64B,QAAS,CAAE74B,KAAM,uCACjB84B,UAAW,CAAE94B,KAAM,2CACnB+4B,QAAS,CAAE/4B,KAAM,sCACjBg5B,UAAW,CAAEh5B,KAAM,mCACnBi5B,UAAW,CAAEj5B,KAAM,iCACnBk5B,YAAa,CAAEl5B,KAAM,+CACrBm5B,UAAW,CAAEn5B,KAAM,8BACnBo5B,WAAY,CAAEp5B,KAAM,uBACpBq5B,MAAO,CAAEr5B,KAAM,cACfs5B,KAAM,CAAEt5B,KAAM,mBACdu5B,KAAM,CAAEv5B,KAAM,qBACdw5B,SAAU,CAAEx5B,KAAM,mBAClBy5B,SAAU,CAAEz5B,KAAM,wBAClB05B,KAAM,CAAE15B,KAAM,aACd25B,cAAe,CAAE35B,KAAM,mBACvB45B,YAAa,CAAE55B,KAAM,iBACrB65B,KAAM,CAAE75B,KAAM,aACd85B,SAAU,CAAE95B,KAAM,iBAClB+5B,MAAO,CAAE/5B,KAAM,eAEZ,MAAMg6B,EAIT93B,0BACI,GAAuC,IAAnC83B,EAAOjhB,iBAAiBxW,OACxB,MAAM,IAAIzC,EAAa,UAAW,yFAGlC,OAAOk6B,EAAOjhB,iBAAiB,GAGvC7W,sBAAsB+3B,GAClB,IAAKA,KAAUA,KAAQ7U,GACnB,MAAM,IAAItlB,EAAa,cAAe,iBAAmBm6B,GAC7D,OAAO7U,EAAM6U,GASjB/3B,qBAAqBg4B,EAAgBD,EAAO,SAAUE,GAClD,IAAIxkB,EAAU,CAAEykB,aAAc,GACR,iBAAXD,IACPxkB,EAAU7X,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAImC,GAAUwkB,IAExD,MAAME,EAASH,EAAe90B,MAAM,KACpC,GAAIi1B,EAAO93B,OAAS,EAChB,MAAM,IAAIzC,EAAa,eAAgB,iEAAiEo6B,KAE5G,MAAMt8B,EAAMy8B,EAAO,GAAGC,cAChB33B,EAAQmjB,EAAUloB,GACxB,IAAK+E,EACD,MAAM,IAAI7C,EAAa,eAAgB,qBAAuBlC,GAC9D+E,EAAMya,SACNid,EAAO,GAAK13B,EAAMya,OAAO1Y,YAC7B,IAAI0Y,EAAS5b,SAAS64B,EAAO,GAAI,IAEjCjd,IAAW,EAAIzH,EAAQykB,aAEvB,IAAIz5B,GADuB,EAATyc,EAAa,GACPza,EAAMkM,OAAS,EACvClO,GAAQq5B,EAAOO,eAAeN,GAAM3U,WACpC,IAAIkV,EAAS,EACT75B,GAAQ,GAAa,EAAPA,EAAY,GAAM,IAChC65B,EAAS,GACT75B,GAAQ,GAAa,EAAPA,EAAY,GAAM,IAChC65B,GAAU,GAEd,MAAMC,OAAqC,IAAlB93B,EAAM8c,QAAmC,GAATrC,EAAcza,EAAM8c,aAAUlf,EAEjFP,EAAO2C,EAAM3C,KACbunB,EAAc5kB,EAAM4kB,YAC1B,IAAImT,EAAsB,GAC1B,GAAIL,EAAO93B,OAAS,GAAK83B,EAAO,GAAI,CAChC,MAAMM,EAAYN,EAAO,GAAGC,cAC5BI,EAAsBlT,EAAgBmT,IAAc,GAExD,OAAO78B,OAAO0V,OAAO,CAAE5V,IAAAA,EACnBwf,OAAAA,EACAzc,KAAAA,EACA85B,UAAAA,EAAWje,WAAY7Z,EAAM6Z,WAAYxc,KAAAA,EACzCw6B,OAAAA,EACAjT,YAAAA,EAAaqT,WAAW,GAASF,GAEzCx4B,qBAAqB24B,GACjB,QAAuB,IAAZA,GAA2BA,EAAU,GAAKA,EAAU,GAC3D,MAAM,IAAI/6B,EAAa,eAAgB,6DAA6D+6B,KAExG,MAcMjZ,EAdQ,CACV,EAAG,IACH,EAAG,KACH,EAAG,IACH,EAAG,KACH,EAAG,IACH,EAAG,IACH,EAAG,KACH,EAAG,IACH,EAAG,KACH,EAAG,IACH,GAAI,KACJ,GAAI,KAEgBiZ,GACxB,IAAKjZ,EACD,MAAM,IAAI9hB,EAAa,eAAgB,mCAAmC+6B,KAE9E,OAAOjZ,EAEX1f,kBAAkB44B,EAAMlmB,EAAQ,GAC5B,IAAIqB,EACA/O,EAAQ,EACR6zB,EAAU,EACd,GAA2B,MAAvBD,EAAKR,cAAuB,CAC5B,MAAMU,EAAe,IAAIzmB,EAAM,wBAAyBylB,EAAOiB,sBAAsB1tB,aAErF,GADA0I,EAAQ,wBACkB1V,MAAtBy6B,EAAa9zB,OAA6C3G,MAAvBy6B,EAAa7zB,OAChD,MAAM,IAAIrH,EAAa,iBAAkB,6BAC7CoH,EAAQ8zB,EAAa9zB,MACrB6zB,GAAWC,EAAa7zB,OAAS,OAGjCD,EAAQ8yB,EAAOkB,UAAUJ,GAE7B,MAAO,CACHp5B,KAAMo5B,EACN96B,KAAMiW,EACN+D,SAAU,IAAM9S,EAAQ0N,EACxBmmB,QAAAA,GAKR74B,iBAAiBR,GACb,OAAO,EAAIA,EAAKgD,WAAWnC,OAE/BL,yBAAyBi5B,GACrB,OAAOpD,EAAcoD,GAEzBj5B,uBAAuB6hB,GACnB,OAAOzE,EAAYyE,GAEvB7hB,qBAAqB6hB,GACjB,OAAOwU,EAAUxU,GAErB7hB,oBAAoBk5B,GAChB,MAAMC,EAAU3X,EAAc0X,GAC9B,IAAKC,EACD,MAAM,IAAIv7B,EAAa,kBAAmB,4BAA4Bs7B,MAE1E,IAAKC,EAAQtX,IACT,MAAO,GAEX,MAIMuX,EAJiB,CACnBj6B,EAAG,CAAC,EAAG,GAAK,IAAK,EAAG,EAAG,IAAK,KAC5B,IAAK,CAAC,EAAG,KAAM,GAAK,EAAG,IAAK,GAAK,IAERg6B,EAAQtX,KAC/BwX,EAAW,GACjB,IAAK,IAAIp2B,EAAI,EAAGA,EAAIk2B,EAAQzX,MAAOze,EAAG,CAClC,MAAMxE,EAAO26B,EAAMn2B,GACnBo2B,EAASjmB,KAAK,CAAE5G,KAAM2sB,EAAQtX,IAAKpjB,KAAAA,IAEvC,OAAO46B,EAEXr5B,0BACI,OAAOwhB,EAEXxhB,uBAAuBk5B,GACnB,OAAOA,KAAQ1X,EAQnBxhB,wBAAwBs5B,GACpB,MAAMC,EAAiBhY,EAAgB+X,GAIvC,QAHuBj7B,IAAnBk7B,IACAD,EAAWC,QAEal7B,IAAxBijB,EAAUgY,GACV,MAAM,IAAI17B,EAAa,eAAgB,uCAAuC07B,KAElF,OAAOA,EAGXt5B,0BAA0Bs5B,GACtB,OAAO,IAAI15B,GAAWmD,MAAM+0B,EAAO0B,iBAAiBF,IAGxDt5B,wBAAwBs5B,GACpB,OAAOxB,EAAO2B,mBAAmBH,GAAU74B,QAG/CT,uBAAuBs5B,GACnBA,EAAWxB,EAAO0B,iBAAiBF,GACnC,MAAMI,EAAQpY,EAAUgY,GACxB,QAAcj7B,IAAVq7B,EACA,MAAM,IAAI97B,EAAa,mBAE3B,OAAO87B,EAKX15B,qBAAqBs5B,EAAU9sB,EAAO,KAClC8sB,EAAWxB,EAAO0B,iBAAiBF,GAEnC,MAAMx7B,EAAO67B,EAAcL,GAC3B,QAAaj7B,IAATP,EACA,OAGJ,IAAI87B,EAAsB97B,EAAK0O,KAAKA,GAEpC,QAA4BnO,IAAxBu7B,EAAmC,CAEnC,MAAMC,EAA4BvU,EAAgB9Y,EAAK4rB,eAEvD,QAAkC/5B,IAA9Bw7B,EACA,OAGJD,EAAsBh+B,OAAO0V,OAAO,CAAEwoB,UAAWD,EAA0B/7B,MAAQ+7B,GAEvF,MAAMC,EAAYF,EAAoBE,UAKtC,OAAOl+B,OAAO0V,OAAO1V,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAIxT,EAAKi8B,QAAS,CAAEjiB,SAFpD,CAACpF,EAAQolB,EAAOkC,sBAAwB3nB,EAAMyF,SAASgiB,EAAWpnB,KAESknB,IAGpG9B,EAAOmC,WAAa,IACpBnC,EAAOoC,YAAc,GACrBpC,EAAOqC,qBAAuB,EAC9BrC,EAAOzW,WAAaA,EAIpByW,EAAOjhB,iBAAmB,GAC1BihB,EAAOkC,oBAAsB,GAC7BlC,EAAOiB,qBAAuB,GAC9BjB,EAAOsC,qBAAuB,GAC9BtC,EAAOuC,oBAAsB,GAQ7BvC,EAAOwC,wBAA0B,EACjCxC,EAAOyC,cAAgBnd,EACvB0a,EAAO0C,uBA3UmB,CACtB,EAAG,CACCt7B,EAAG,CAAC,GACJC,EAAG,CAAC,IAER,EAAG,CACCD,EAAG,CAAC,EAAG,IAEX,EAAG,CACCA,EAAG,CAAC,EAAG,EAAG,GACVC,EAAG,CAAC,EAAG,EAAG,GACVs7B,iBAAkB,CAAC,EAAG,EAAG,IAE7B,EAAG,CACCv7B,EAAG,CAAC,EAAG,EAAG,EAAG,GACbC,EAAG,CAAC,EAAG,EAAG,EAAG,GACbu7B,sBAAuB,CAAC,EAAG,EAAG,EAAG,IAErC,EAAG,CACCx7B,EAAG,CAAC,EAAG,EAAG,EAAG,EAAG,GAChBC,EAAG,CAAC,EAAG,EAAG,EAAG,EAAG,GAChBw7B,sBAAuB,CAAC,EAAG,EAAG,EAAG,EAAG,GACpCC,2BAA4B,CAAC,EAAG,EAAG,EAAG,EAAG,IAE7C,EAAG,CACC17B,EAAG,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,GACnBC,EAAG,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,GACnB07B,qBAAsB,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,GACtCC,0BAA2B,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,KAgTnDhD,EAAOiD,QAAU,CAEbC,MAAOC,OAAOC,aAAa,MAE3BC,KAAMF,OAAOC,aAAa,MAE1BE,QAASH,OAAOC,aAAa,MAE7BG,SAAUJ,OAAOC,aAAa,MAE9B,eAAgBD,OAAOC,aAAa,KAEpCI,QAASL,OAAOC,aAAa,KAE7BK,OAAQN,OAAOC,aAAa,OAGhCpD,EAAO0D,WAtoBgB,CACnBn8B,EAAG,CAAE8I,KAAM,QACXszB,EAAG,CAAEtzB,KAAM,QACX7E,EAAG,CAAE6E,KAAM,YACXgV,EAAG,CAAEhV,KAAM,SACXvF,EAAG,CAAEuF,KAAM,SACXnM,EAAG,CAAEmM,KAAM,UAkoBf2vB,EAAO4D,QAAU,CACbC,UAAW,EACXC,WAAY,EACZpwB,WAAY6V,GAOhB,MAAMsY,EAAgB,CAClB,MAAO,CACHI,OAAQ,CACJ8B,MAAM,EACNC,YAAa,EACbC,MAAM,EACNC,WAAY,EACZC,WAAY,EACZC,WAAY,GAEhB1vB,KAAM,CACFnN,EAAG,CAECy6B,UAAW,uBAKfx2B,EAAG,CAECw2B,UAAW,4BAKf3c,EAAG,CAEC2c,UAAW,wBACXgC,YAAa,GAKjBL,EAAG,CAEC3B,UAAW,kBACX3U,MAAM,EACNnO,SAAU,MACVglB,WAAY,IAKhBp5B,EAAG,CAGCkV,SAAU,IAAMggB,EAAOsC,qBACvBpjB,SAAU,OAEdhb,EAAG,CAEC89B,UAAW,yBAIvB,EAAG,CACCC,OAAQ,CACJ8B,MAAM,EACNC,YAAa,EACbC,MAAM,EACNC,WAAY,EACZC,WAAY,EACZC,WAAY,GAEhB1vB,KAAM,CACFnN,EAAG,CAECy6B,UAAW,iBAKfx2B,EAAG,CAECw2B,UAAW,wBAKf3c,EAAG,CAEC2c,UAAW,iBACXgC,aAAc,GAKlBL,EAAG,CAEC3B,UAAW,YACX3U,MAAM,EACNnO,SAAU,MACVglB,WAAY,IAKhBp5B,EAAG,CAGCkV,SAAU,IAAMggB,EAAOsC,qBACvBpjB,SAAU,OAEdhb,EAAG,CAEC89B,UAAW,mBAIvB,EAAG,CACCC,OAAQ,CACJ8B,MAAM,EACNC,YAAa,EACbC,MAAM,EACNC,WAAY,EACZC,WAAY,EACZC,WAAY,GAEhB1vB,KAAM,CACFnN,EAAG,CAECy6B,UAAW,gBAKfx2B,EAAG,CAECw2B,UAAW,uBAKf3c,EAAG,CAEC2c,UAAW,gBACXgC,aAAc,GAKlBL,EAAG,CAEC3B,UAAW,WACX+B,MAAM,EACN1W,MAAM,EACNnO,SAAU,MACVglB,YAAa,IAKjBp5B,EAAG,CAGCkV,SAAU,IAAMggB,EAAOsC,qBACvBpjB,SAAU,OAEdhb,EAAG,CAEC89B,UAAW,kBAIvB,EAAG,CACCC,OAAQ,CACJ8B,MAAM,EACNC,YAAa,EACbC,MAAM,EACNC,WAAY,EACZC,WAAY,EACZC,WAAY,GAEhB1vB,KAAM,CACFnN,EAAG,CAECy6B,UAAW,iBAKfx2B,EAAG,CAECw2B,UAAW,wBAKf3c,EAAG,CAEC2c,UAAW,kBAKf2B,EAAG,CAEC3B,UAAW,cACX+B,MAAM,EACN1W,MAAM,EACNnO,SAAU,MACVglB,YAAa,GACbC,WAAY,IACZC,WAAY,KAKhBt5B,EAAG,CAGCkV,SAAU,IAAMggB,EAAOsC,qBACvBpjB,SAAU,OAEdhb,EAAG,CAEC89B,UAAW,mBAIvB,EAAG,CACCC,OAAQ,CACJ8B,MAAM,EACNC,YAAa,EACbC,MAAM,EACNI,WAAY,EACZC,oBAAqB,EACrBC,iBAAkB,YAClBC,mBAAoB,cACpBN,WAAY,EACZC,WAAY,EACZC,WAAY,GAEhB1vB,KAAM,CACFnN,EAAG,CAECy6B,UAAW,iBAKfx2B,EAAG,CAECw2B,UAAW,wBAKf3c,EAAG,CAEC2c,UAAW,kBAKf2B,EAAG,CAEC3B,UAAW,UACX+B,MAAM,EACNE,MAAM,EACN5W,MAAM,EACNnO,SAAU,MACVglB,YAAa,GACbC,WAAY,EACZC,WAAY,GAKhBt5B,EAAG,CAGCkV,SAAU,IAAMggB,EAAOsC,qBACvBpjB,SAAU,OAEdhb,EAAG,CAEC89B,UAAW,mBAIvB,GAAI,CACAC,OAAQ,CACJoC,WAAY,EACZC,oBAAqB,EACrBP,MAAM,EACNC,YAAa,EACbC,MAAM,EACNM,iBAAkB,aAClBC,mBAAoB,eACpBN,WAAY,EACZC,WAAY,EACZC,WAAY,GAEhB1vB,KAAM,CACFnN,EAAG,CAECy6B,UAAW,iBAKfx2B,EAAG,CAECw2B,UAAW,wBAKf3c,EAAG,CAEC2c,UAAW,kBAKf2B,EAAG,CAEC3B,UAAW,WACX+B,MAAM,EACNE,MAAM,EACN5W,MAAM,EACNnO,SAAU,MACVglB,YAAa,GACbC,WAAY,EACZC,WAAY,GAKhBt5B,EAAG,CAGCkV,SAAU,IAAMggB,EAAOsC,qBACvBpjB,SAAU,OAEdhb,EAAG,CAEC89B,UAAW,mBAIvB,GAAI,CACAC,OAAQ,CACJoC,WAAY,EACZC,oBAAqB,IACrBP,MAAM,EACNC,YAAa,EACbC,MAAM,EACNM,iBAAkB,aAClBC,mBAAoB,eACpBN,WAAY,EACZC,WAAY,EACZC,WAAY,GAEhB1vB,KAAM,CACFnN,EAAG,CAECy6B,UAAW,iBAKfx2B,EAAG,CAECw2B,UAAW,wBAKf3c,EAAG,CAEC2c,UAAW,kBAKf2B,EAAG,CAEC3B,UAAW,WACX+B,MAAM,EACNE,MAAM,EACN5W,MAAM,EACNnO,SAAU,MACVglB,YAAa,IACbC,WAAY,EACZC,WAAY,GAKhBt5B,EAAG,CAGCkV,SAAU,IAAMggB,EAAOsC,qBACvBpjB,SAAU,OAEdhb,EAAG,CAEC89B,UAAW,mBAIvB,GAAI,CACAC,OAAQ,CACJoC,WAAY,EACZC,oBAAqB,GACrBP,MAAM,EACNC,YAAa,EACbC,MAAM,EACNM,iBAAkB,aAClBC,mBAAoB,eACpBN,WAAY,EACZC,WAAY,EACZC,WAAY,GAEhB1vB,KAAM,CACFnN,EAAG,CAECy6B,UAAW,iBAKfx2B,EAAG,CAECw2B,UAAW,wBAKf3c,EAAG,CAEC2c,UAAW,kBAKf2B,EAAG,CAEC3B,UAAW,WACX+B,MAAM,EACNE,MAAM,EACN5W,MAAM,EACNnO,SAAU,MACVglB,YAAa,IACbC,WAAY,EACZC,WAAY,GAKhBt5B,EAAG,CAGCkV,SAAU,IAAMggB,EAAOsC,qBACvBpjB,SAAU,OAEdhb,EAAG,CAEC89B,UAAW,mBAIvB,IAAK,CACDC,OAAQ,CACJoC,WAAY,EACZC,oBAAqB,KACrBP,MAAM,EACNC,YAAa,EACbC,MAAM,EACNM,iBAAkB,cAClBC,mBAAoB,gBACpBN,WAAY,EACZC,WAAY,EACZC,WAAY,GAEhB1vB,KAAM,CACFnN,EAAG,CAECy6B,UAAW,iBAKfx2B,EAAG,CAECw2B,UAAW,wBAKf3c,EAAG,CAEC2c,UAAW,kBAKf2B,EAAG,CAEC3B,UAAW,YACX+B,MAAM,EACNE,MAAM,EACN5W,MAAM,EACNnO,SAAU,MACVglB,YAAa,IACbC,WAAY,EACZC,WAAY,GAKhBt5B,EAAG,CAGCkV,SAAU,IAAMggB,EAAOsC,qBACvBpjB,SAAU,OAEdhb,EAAG,CAEC89B,UAAW,oBC9wC3B,SAASyC,KAAK/9B,GACNg+B,EAAWC,OACXn+B,EAAI,sBAAuBE,GAS5B,MAAMg+B,UAAmB1lB,EAM5Bla,YAAY4P,GACRxO,QACAu+B,EAAE,mBAAoB/vB,GACtBjR,KAAKiR,KAAOA,EACZjR,KAAKyb,SAAWF,EAASG,SAASC,KAClC3b,KAAKmhC,eAAiB,CAElBC,WAAY,GAEZC,iBAAkB,EAClBC,kBAAmB,GAEvBthC,KAAK+e,WAAawd,EAAOgF,gBAAgBvhC,KAAKiR,MAC9CrO,EAAQ5C,KAAK+e,WAAY,gBAAiB,4BAA4B9N,KAEtEjR,KAAKwhC,YAAa,EAClBxhC,KAAKuY,QAGEjX,sBACP,OAAOG,EAASw/B,WAGpBx8B,cAAcod,EAAa4f,GAEvB,IAAK5f,GAAsC,IAAvBA,EAAY/c,OAC5B,OACJ,MAAM48B,EAAYnF,EAAOoF,mBACnBC,EAA4BF,EAAUtxB,aAAa,wCACnDyxB,EAAYJ,EAAMK,WAAaF,EAC/BG,EAAoBL,EAAUtxB,aAAa,gCAC3C4xB,EAAoBN,EAAUtxB,aAAa,0BAC3C6xB,EAAU,GAChB,IAAIC,EACAC,EAAS,EAEb,IAAK,IAAIz6B,EAAI,EAAGA,EAAIma,EAAY/c,SAAU4C,EAAG,CACzC,MAAM4e,EAAMzE,EAAYna,GAClBgV,EAAO4J,EAAI7J,UACXvC,EAAQwC,EAAKoB,WACb1M,EAAQkV,EAAIxJ,aACZslB,EAAQ1lB,EAAK2lB,cAAcjxB,GACjC,GAAIsL,IAASwlB,EAAU,CAEnB,IAAK,IAAIp+B,EAAI,EAAGA,EAAI4Y,EAAKpK,KAAKxN,SAAUhB,EACpCq+B,EAASh+B,KAAK4E,IAAI2T,EAAK4lB,yBAA0BH,GAErDD,EAAWxlB,EAEf,GAAIxC,EAAO,CACP,MAAMqoB,EAAYroB,EAAMsoB,yBAClB36B,EAAIqS,EAAMuoB,YAAYL,EAAMl/B,MAC5Bw/B,EAAUv+B,KAAKw+B,MAAO96B,EAAI06B,EAAa,GAAK,EAClDN,EAAQpqB,KAAK,CAAEhQ,EAAAA,EAAG3E,KAAMw/B,EAAS19B,MAAOm9B,EAAQ7b,IAAAA,EAAKic,UAAAA,SAGrDN,EAAQpqB,KAAK,CAAE3U,KAAMk/B,EAAMl/B,KAAM8B,MAAOm9B,EAAQ7b,IAAAA,IAIxD2b,EAAQW,MAAK,CAACj/B,EAAGC,IAAMA,EAAEV,KAAOS,EAAET,OAGlC,MAAM2/B,EAAW,GAGjB,IACIC,EADAC,EAAW,EAGf,IAAK,IAAIr7B,EAAI,EAAGA,EAAIu6B,EAAQn9B,OAAQ4C,IAAK,CACrC,MAAM4e,EAAM2b,EAAQv6B,QAEC5E,IAAjBggC,GAA8BA,IAAiBxc,EAAIpjB,MACnD2/B,EAAShrB,KAAK,CACV3U,KAAMojB,EAAIpjB,KACV8/B,UAAU,EACVC,cAAc,EACdC,OAAQ,EACRz5B,MAAO,EACP05B,OAAQ,IAMK,MAAjB7c,EAAIA,IAAIrV,MAAiC,OAAjBqV,EAAIA,IAAIrV,OAChC4xB,EAASA,EAAS/9B,OAAS,GAAGk+B,UAAW,GAGxB,OAAjB1c,EAAIA,IAAIrV,OACR4xB,EAASA,EAAS/9B,OAAS,GAAGm+B,cAAe,GAGjDJ,EAASA,EAAS/9B,OAAS,GAAGo+B,SAI9BL,EAASA,EAAS/9B,OAAS,GAAG2E,OAAS6c,EAAIA,IAAI/J,WAAawlB,EAE5DgB,EAAWzc,EAAIthB,MAAQ+9B,EAAWzc,EAAIthB,MAAQ+9B,EAC9CD,EAAexc,EAAIpjB,KAmBvB,IAAIkgC,EAAe,EAEnB,IAAK,IAAI17B,EAAI,EAAGA,EAAIm7B,EAAS/9B,OAAQ4C,IAAK,CACtC,IAAI27B,GAAqB,EACzB,MAAMC,EAAa57B,EACnB,IAAI67B,EAAW77B,EACf,KAAO67B,EAAW,EAAIV,EAAS/9B,SAAWu+B,GAElCrjC,KAAKwjC,eAAeX,EAASU,GAAWV,EAASU,EAAW,IAE5DA,IAGAF,GAAqB,EAI7B,MAAMI,EAAgBryB,GAAUyxB,EAASS,EAAalyB,GAChDsyB,EAAiBC,GAAYA,EAAQpxB,IAAIkxB,GACzCG,EAAiB,CAACC,EAAQC,KAC5B,MAAOngC,EAAGC,GAAK8/B,EAAc,CAACG,EAAQC,IAASvxB,KAAKwxB,GAASA,EAAK7gC,OAClE,OAAOS,EAAIC,GAETogC,EAAe,IAAIC,IAAeA,EAAW1xB,IAAImxB,GAAeQ,OAAM,EAAEC,EAAOC,MAAYpkC,KAAKwjC,eAAeW,EAAOC,KAEtHC,EAAcd,EAAWD,EAAa,EAE5C,IA+BIgB,EACAnB,EAhCAoB,EAAUvkC,KAAKwjC,eAAeX,EAASS,GAAaT,EAASU,IAAa,IAAM,IACpF,OAAQc,GACJ,KAAK,EACe,MAAZE,GAA4C,KAAzBX,EAAe,EAAG,IAAuC,KAAzBA,EAAe,EAAG,KACrEW,EAAU,oBAEd,MACJ,KAAK,EACGP,EAAa,CAAC,EAAG,GAAI,CAAC,EAAG,MACzBO,EAAU,yBAEd,MACJ,KAAK,EACe,MAAZA,GAAmBP,EAAa,CAAC,EAAG,MACpCO,EAAU,wBACNP,EAAa,CAAC,EAAG,GAAI,CAAC,EAAG,MACzBO,EAAU,+BAGlB,MACJ,KAAK,EACGP,EAAa,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,CAAC,EAAG,MACjCO,EAAU,wBAEVP,EAAa,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,CAAC,EAAG,MACzCO,EAAU,6BAUtB,GAAIF,GAAe,EAAG,CAElB,IAAIG,EAAgB,EAChBC,GAAoB,EACxB,MAA6B,IAAtBA,GAA4B,CAC/BA,GAAoB,EACpB,IAAK,IAAIvhC,EAAO,EAAGA,EAAOshC,EAAgB3B,EAAS/9B,OAAQ5B,IACvD,GAAIlD,KAAKwjC,eAAeX,EAAS3/B,GAAO2/B,EAAS3/B,EAAOshC,IAAiB,CACrEC,GAAoB,EACpBD,IACA,OAKZ,IAAKF,EAAc58B,EAAG48B,GAAef,EAAUe,IAC3CnB,GAAWmB,EAAc58B,GAAK88B,EAAiB,EAC/C3B,EAASyB,GAAanB,OAASA,EAC/BC,EAAeA,EAAeD,EAASC,EAAeD,OAM1D,IAAKmB,EAAc58B,EAAG48B,GAAef,EAAUe,IAC3CnB,EAAS5G,EAAO0C,uBAAuBoF,GAAaE,GAASD,EAAc58B,GAC3Em7B,EAASyB,GAAanB,OAASA,EAC/BC,EAAeA,EAAeD,EAASC,EAAeD,EAK9Dz7B,EAAI67B,EAcR,MAAMmB,EAAe,GACfC,EAAiB,GACvB,IAAK,IAAIj9B,EAAI,EAAGA,GAAK07B,EAAc17B,IAC/Bg9B,EAAah9B,GAAK,EAClBi9B,EAAej9B,GAAK,EAExBg9B,EAAa,GAAK3B,EAAWlB,EAC7B8C,EAAe,GAAK5B,EAAWlB,EAG/BgB,EAAS3kB,SAAShb,IACVA,EAAKuG,MAAQi7B,EAAaxhC,EAAKigC,UAC/BuB,EAAaxhC,EAAKigC,QAAUjgC,EAAKuG,UAEzC,IAAK,IAAI/B,EAAI,EAAGA,EAAIg9B,EAAa5/B,OAAQ4C,IAErCi9B,EAAej9B,GAAKg9B,EAAah9B,GAAKi9B,EAAej9B,EAAI,GAE7D,MAAMk9B,EAAaD,EAAeA,EAAe7/B,OAAS,GAE1D,IAAI+/B,EAAW,EACfhC,EAAS3kB,SAAShb,IACd,IAAImR,EAAY,EAChB,MAAMywB,EAAgBD,EAAW3hC,EAAKggC,OAEtC,KAAe2B,EAAWC,EAAeD,IAAY,CACjD,MAAMrqB,EAASmqB,EAAezhC,EAAKigC,OAAS,GAAK9uB,EACjD4tB,EAAQ4C,GAAUve,IAAInM,UAAUK,GAGhCnG,GAAa4tB,EAAQ4C,GAAUve,IAAI/J,WAAawlB,EAChDf,EAAE,0BAA2B99B,EAAKA,KAAM2hC,EAAUrqB,OAI1DinB,EAAMK,YAAc8C,EAAa5C,EAGrCv9B,sBAAsB0/B,EAAOC,GACzB,IAAIW,EAAYX,EAAMlhC,KAAOihC,EAAMjhC,KAC/B8hC,EAAoB,EAEpBD,EAAY,GAEZC,EAAoBZ,EAAMpB,UAAYoB,EAAMnB,aAAe,IAAM,EAC7DkB,EAAMlB,eACN8B,GAAa,MAIjBC,EAAoBb,EAAMnB,UAAYmB,EAAMlB,aAAe,IAAM,EAC7DmB,EAAMnB,eACN8B,GAAa,KAErB,MAAME,EAAY9gC,KAAK6C,IAAI+9B,GAAaC,EAExC,OADAhE,EAAE,8BAA+BmD,EAAMjhC,KAAMkhC,EAAMlhC,KAAM+hC,GAClDA,EAOXxgC,wBAAwBygC,EAAQ5f,GAC5B,MAAM6f,EAAgB,GAChBC,EAAc,GAEpBF,EAAOhnB,SAASmnB,IACZ,MAAMC,EAAe,IAAIjhC,EAAS,EAAG,GACpBghC,EAAME,eACdrnB,SAAStZ,IACd,GAAIA,EAAE4gC,oBACF,OACJ,MAAMC,EAAkBL,EAAYE,EAAapgC,SAC5CugC,EAKDA,EAAgB5tB,KAAKjT,IAJrBugC,EAActtB,KAAKytB,EAAapgC,SAChCkgC,EAAYE,EAAapgC,SAAW,CAACN,IAKzC0gC,EAAa//B,IAAIX,EAAE8gC,kBAG3B,MAAMC,EAAQ,IAAIrnB,EAEbgH,IACDA,EAAe,KAEnB,MAAMsgB,EAAcD,EAAMtgB,eAAeC,GACnCK,EAAW,GACjBwf,EAAcjnB,SAAS2nB,IACnB,MAAMC,EAAYV,EAAYS,GAGxBE,EAAkB,GAClBC,EAAephC,IAEjB,IAAK7C,EAAY6C,IAAMA,EAAEqhC,UAAYrhC,EAAE4gC,oBACnC,OAGJ,MAAMU,EAAYthC,EAClBshC,EAAU5zB,KAAK4L,SAAQ,CAAC4F,EAAWqiB,KAC/B,MAAMhmC,EAAMwlC,EAAMliB,aAAaK,EAAUnc,MAAM,KAAK,IAC9CgY,EAASmE,EAAUnc,MAAM,KAAK,GAE9By+B,EAAmBjmC,EAAI4e,YAAc,IACrCsnB,EAAQlmC,EAAIX,KAAO4mC,EAGpBzgB,EAASxlB,EAAIX,KAAOmgB,KACrBgG,EAASxlB,EAAIX,KAAOmgB,GAAUimB,EAAYzlC,EAAIX,OAClD,MAAM8mC,EAAiB3gB,EAASxlB,EAAIX,KAAOmgB,KAAY0mB,EAGjDE,EAAqBR,EAAgBS,QAAQ1iB,IAAc,EAQjE,GANAoiB,EAAUO,eAAevoB,SAAQ,CAACwoB,EAAUt1B,KZjV3BnQ,EYkVIylC,EZlVYjlC,EAASw/B,aYkVRyF,EAASz1B,MAAQm1B,GAAoBM,EAAS7pB,YAAcspB,GACtFD,EAAUO,eAAeE,OAAOv1B,EAAO,OAI1Ck1B,GAAmBA,GAAkBC,EAAqB,CAG3D5gB,EAASxlB,EAAIX,KAAOmgB,GAAU0mB,EAE9B,MAAMtnB,EAAa,IAAIkiB,EAAWmF,GAElCF,EAAUU,YAAY7nB,EAAYonB,GAElCJ,EAAgBluB,KAAKiM,OAI7BoiB,EAAUO,eAAevoB,SAASwoB,IZ/VTzlC,EYgWAylC,EZhWgBjlC,EAASolC,iBYiW1CH,EAASI,gBAAgB5oB,QAAQ8nB,OAI7CF,EAAU5nB,QAAQ8nB,MAG1BztB,QACI,MAAMwuB,EAAY/mC,KAAKmhC,eAAeC,WACtCphC,KAAKwY,MAAQ,IAAI1B,EAAM9W,KAAK+e,WAAWxc,KAAMwkC,GAC7C/mC,KAAKwY,MAAM+B,WAAW,GAClBva,KAAKwhC,aACLxhC,KAAKgnC,UAAY,IAAIlwB,EAAMylB,EAAOgF,gBAAgB,KAAKh/B,KAAMwkC,GAC7D/mC,KAAKinC,WAAa,IAAInwB,EAAMylB,EAAOgF,gBAAgB,KAAKh/B,KAAMwkC,GAC9D/mC,KAAKgnC,UAAUzsB,WAAW,GAC1Bva,KAAKinC,WAAW1sB,WAAW,IAInCgC,WACI,GAAIvc,KAAKwhC,WAAY,CACjB,MAAMwF,EAAYpkC,EAAQ5C,KAAKgnC,WACzBC,EAAarkC,EAAQ5C,KAAKinC,YAC1BC,EAAaF,EAAUl3B,aAAarG,MACtCw9B,EAAWn3B,aAAarG,MACxBzJ,KAAKmhC,eAAeE,iBACpBrhC,KAAKmhC,eAAeG,kBACxB,OAAOthC,KAAKwY,MAAM1I,aAAarG,MAAQy9B,EAGvC,OAAOlnC,KAAKwY,MAAM1I,aAAarG,MAIvCmT,QAAQF,GAQJ,OAPA9Z,EAAQ8Z,EAAM,gBAAiB,mBAAmBA,KAClD1c,KAAK0c,KAAOA,EAER/a,EAAY+a,KACZ1c,KAAKmhC,eAAeC,WAAa,GACjCphC,KAAKuY,SAEFvY,KAGXmnC,kBAII,OAHAnnC,KAAKwhC,YAAa,EAClBxhC,KAAKmhC,eAAeC,WAAa,GACjCphC,KAAKuY,QACEvY,KAGX2U,OACI,MAAM,KAAE1D,EAAI,SAAEwK,EAAQ,MAAErK,EAAK,WAAEowB,EAAU,QAAEpqB,EAAO,QAAEC,EAAO,MAAEmB,EAAO2oB,gBAAgB,iBAAEE,EAAgB,kBAAEC,IAAyBthC,KAC3H8Y,EAAM9Y,KAAK0U,eACXgI,EAAO1c,KAAK2c,oBAClB3c,KAAKgV,cAEL,MAAMoyB,EAAQ1qB,EAAK2qB,mBAAmB5rB,EAAUrK,GAChD,IAAIk2B,EAAOF,EAAMvkC,EAAIuU,EACrB,MAAMmwB,EAAOH,EAAMv/B,EAAIwP,EAEvB,GADA2pB,EAAE,cAAe/vB,EAAMq2B,EAAMC,GACxB/F,EAGA,CACD,MAAMwF,EAAYpkC,EAAQ5C,KAAKgnC,WACzBC,EAAarkC,EAAQ5C,KAAKinC,YAEhCA,EAAWrsB,OAAO9B,EAAKwuB,EAAMC,GAC7BD,GAAQL,EAAWn3B,aAAarG,MAChC69B,GAAQhG,EACRgG,GAAQtnC,KAAK+e,WAAWiM,4BACxBxS,EAAMoC,OAAO9B,EAAKwuB,EAAMC,GACxBD,GAAQ9uB,EAAM1I,aAAarG,MAC3B69B,GAAQjG,EACR2F,EAAUpsB,OAAO9B,EAAKwuB,EAAMC,QAb5B/uB,EAAMoC,OAAO9B,EAAKwuB,EAAMC,IAkBpCtG,EAAWC,OAAQ,EC9cZ,MAAMsG,UAAaz0B,EACtB1R,YAAY6W,GACRzV,QACAzC,KAAKynC,iBAAmB,EACxBznC,KAAK0nC,mBAAqB,EAC1B1nC,KAAK2nC,sBAAwB,EAC7B3nC,KAAK4nC,wBAA0B,EAE/B5nC,KAAK6nC,SAAW3vB,MAAAA,OAAyC,EAASA,EAAQ2vB,UAAY,EACtF7nC,KAAK8nC,OAAS5vB,MAAAA,OAAyC,EAASA,EAAQ4vB,QAAU,EAElF9nC,KAAK+nC,OAAS7vB,MAAAA,OAAyC,EAASA,EAAQ6vB,QAAU,EAClF/nC,KAAKgoC,UAAY9vB,MAAAA,OAAyC,EAASA,EAAQ8vB,WAAa,EAExFhoC,KAAKioC,gBAAkB/vB,MAAAA,OAAyC,EAASA,EAAQ+vB,iBAAmB,EAEpGjoC,KAAKkoC,gBAAkBhwB,MAAAA,OAAyC,EAASA,EAAQgwB,iBAAmB,EAEpGloC,KAAKmoC,MAAQjwB,MAAAA,OAAyC,EAASA,EAAQiwB,QAAS,EAChFnoC,KAAKooC,WAAalwB,MAAAA,OAAyC,EAASA,EAAQkwB,aAAc,EAC1FpoC,KAAKqoC,eAAiBnwB,MAAAA,OAAyC,EAASA,EAAQmwB,gBAAkB,EAGlGroC,KAAKsoC,uBAAyB,EAC9BtoC,KAAKsY,WAAWJ,GAET5W,sBACP,OAAOG,EAAS+lC,KAGTe,gBACP,OAAO,EAEAC,kBACP,OAAQ,EAGDC,mBACP,OAAOlM,EAAOmC,WAEPgK,oBACP,OAAOnM,EAAOoC,YAElBrmB,WAAWJ,GAEPlY,KAAKynC,kBAAoBvvB,MAAAA,OAAyC,EAASA,EAAQuvB,mBAAqB,EACxGznC,KAAK0nC,oBAAsBxvB,MAAAA,OAAyC,EAASA,EAAQwvB,qBAAuB,EAC5G1nC,KAAK2nC,uBAAyBzvB,MAAAA,OAAyC,EAASA,EAAQyvB,wBAA0B,EAClH3nC,KAAK4nC,yBAA2B1vB,MAAAA,OAAyC,EAASA,EAAQ0vB,0BAA4B,EAG1He,mBAAmBd,EAASC,GAGxB,OAFA9nC,KAAK6nC,QAAUA,EACf7nC,KAAK8nC,MAAQA,EACN9nC,KAGX4oC,aAAarkB,GACTvkB,KAAKkoC,eAAiB3jB,EAG1BskB,aAAaC,GACT9oC,KAAKioC,eAAiBa,EAE1BC,eACI,OAAO/oC,KAAKioC,eAGhBe,WAAWjB,EAAOC,GACdhoC,KAAK+nC,MAAQA,EACb/nC,KAAKgoC,SAAWA,EAGpBiB,YACI,MAAMC,EAAWlpC,KAAKkoC,iBAAmBV,EAAKe,GAAKvoC,KAAKynC,iBAAmBznC,KAAK0nC,mBAEhF,OADwB1nC,KAAKgoC,SAAWhoC,KAAK+nC,OAASP,EAAKkB,OAASQ,EAAWlpC,KAAKioC,iBAC3DjoC,KAAKkoC,eAElC/yB,iBACI,MAAM,IAAI9S,EAAa,iBAAkB,qCAI7C8mC,aACI,MAAMC,EAAWppC,KAAKkoC,iBAAmBV,EAAKe,GACxCc,EAAK,CAACrpC,KAAK+nC,MAAO/nC,KAAKgoC,UACvBsB,EAAa9B,EAAKkB,OAAS1oC,KAAKioC,eAChCsB,GAAsBH,EAAWjlC,KAAKqlC,IAAMrlC,KAAK4E,QAAQsgC,GACzDI,GAAsBL,EAAWjlC,KAAK4E,IAAM5E,KAAKqlC,QAAQH,GAE/D,MAAO,CAAEK,KADQH,EAAqBD,GAActpC,KAAKkoC,eAChCyB,MAAOF,GAEpCG,cAAcC,GAEV,OADA7pC,KAAKmoC,MAAQ0B,EACN7pC,KAEX8pC,WAAW1B,EAAWC,GAGlB,OAFAroC,KAAKooC,UAAYA,EACjBpoC,KAAKqoC,cAAgBA,EACdroC,KAEX+pC,sBACI/pC,KAAKsoC,uBAAyB/L,EAAOoF,mBAAmBvxB,aAAa,gCAAiC,GAE1G45B,sBACIhqC,KAAKsoC,wBAA0Bd,EAAKiB,MAAQ,EAGhD9zB,OAEI,GADA3U,KAAKgV,cACDhV,KAAKmoC,KACL,OACJ,MAAMrvB,EAAM9Y,KAAK0U,eACjB,IAAIu1B,EACAC,EACJ,MAAMhC,EAAiBloC,KAAKkoC,eAC5B,IAAIiC,EAAgB,EAChBjC,IAAmBV,EAAKgB,MAExByB,EAASjqC,KAAK6nC,QACdqC,EAASlqC,KAAK+nC,MAAQ/nC,KAAK0nC,mBAC3ByC,EAAgBnqC,KAAK4nC,0BAIrBqC,EAASjqC,KAAK8nC,MACdoC,EAASlqC,KAAKgoC,SAAWhoC,KAAKynC,iBAC9B0C,EAAgBnqC,KAAK2nC,uBAEzB,MAAM2B,EAAatpC,KAAKipC,aArIhC,YAAchmC,GACNukC,EAAKtG,OACLn+B,EAAI,gBAAiBE,GAoIrB,CAAE,oBAAqB,UAAWjD,KAAK+nC,MAAO,aAAc/nC,KAAKgoC,UAEjE,MAAMoC,EAAiBpqC,KAAKooC,UAAYkB,EAAatpC,KAAKqoC,cAAgBroC,KAAKkoC,eAAiB,EAEhGpvB,EAAIlF,OACJ5T,KAAK0T,WAAWoF,GAChBA,EAAIQ,YACJR,EAAIxE,aAAakzB,EAAKiB,OACtB3vB,EAAIS,OAAO0wB,EAAQC,EAASE,EAAiBD,GAC7CrxB,EAAIU,OAAOywB,EAAQC,EAASZ,EAAatpC,KAAKsoC,uBAAyBJ,GACvEpvB,EAAIikB,SACJ/8B,KAAKuU,aAAauE,GAClBA,EAAItE,WCvJZ,SAAS,KAAKvR,GACNonC,GAAcnJ,OACdn+B,EAAI,yBAA0BE,GDyJtCukC,EAAKtG,OAAQ,EC5Ib,MAAMoJ,GAAiB,GAKjBh5B,GAAW,GACV,MAAM+4B,GAKThpC,YAAYkpC,GAERvqC,KAAK0N,OAAS,GAEd1N,KAAKsN,KAAO,GAEZtN,KAAKiQ,WAAa,IAgBlBjQ,KAAKmQ,OAAS,GACdnQ,KAAKwqC,QAAS,EACdxqC,KAAKyqC,YAAa,EAClBzqC,KAAK0qC,QAAS,EACd1qC,KAAK2qC,MAAO,EACZ3qC,KAAK4qC,kBAAoB,EACzB5qC,KAAK6qC,gBAAkB,EACvB7qC,KAAK8qC,aAAe,IAEpB9qC,KAAK+qC,SAAW,GAChB/qC,KAAKgrC,aAAaT,GAKtB9lC,yBACI,MAAMwmC,EAAkB,GACxB,IAAK,MAAMh9B,KAAcqD,GAAU,CAC/B,MAAMi5B,EAAgBj5B,GAASrD,GAC/Bg9B,EAAgBpzB,KAAKxX,OAAO0V,OAAO,GAAIw0B,IAE3C,OAAOU,EASXxmC,cAAcymC,EAAgB,IAC1B,EAAE,WAAYA,GACTA,EAAcx9B,SACfw9B,EAAcx9B,OAAShB,EAAKiB,YAKhC,MAAMw9B,EAAa,GAGbC,EAAoBF,EAAcx9B,OAAO/F,MAAM,WACrD,IAAK,MAAM0jC,KAAmBD,EAAmB,CAC7C,IAAK,MAAMn9B,KAAcqD,GAGjBrD,EAAWq9B,WAAWD,IACtBF,EAAWtzB,KAAKvG,GAASrD,IAGjC,GAAIk9B,EAAWrmC,OAAS,EACpB,MAGR,IAAIymC,EACJ,GAA0B,IAAtBJ,EAAWrmC,OAEXymC,EAAY,IAAIlB,GAAchqC,OAAOmrC,OAAOl6B,IAAU,SAErD,GAA0B,IAAtB65B,EAAWrmC,OAChBymC,EAAY,IAAIlB,GAAcc,EAAW,QAExC,CACD,MAAMR,EAAOj+B,EAAK++B,OAAOP,EAAc39B,QACjCm9B,EAASh+B,EAAKg/B,SAASR,EAAc19B,OACrCm+B,EAAeR,EAAWS,MAAMrkC,GAAMA,EAAEojC,OAASA,GAAQpjC,EAAEmjC,SAAWA,IAC5E,GAAIiB,EACAJ,EAAY,IAAIlB,GAAcsB,OAE7B,CACD,MAAME,EAAeV,EAAWS,MAAMrkC,GAAMA,EAAEmjC,SAAWA,GAAUnjC,EAAEojC,OAASA,IAE1EY,EAAY,IAAIlB,GADhBwB,GAI8BV,EAAW,KAIrD,MAAMt+B,EAAWq+B,EAAc59B,KAC/B,QAAwB,IAAbT,EAA0B,CACjC,MAAMi/B,EAAep/B,EAAK4J,wBAAwBzJ,GAClD0+B,EAAUp1B,YAAY21B,GAE1B,OAAOP,EAMX9mC,eAAewJ,GACX,OAAOqD,GAASrD,GAUpBxJ,oBAAoBoO,EAAMk5B,GAAY,GAClC,EAAE,iBAAkBl5B,EAAMk5B,GAC1B,MAAM99B,EAAa4E,EAAKnF,aAEH5K,IADAwO,GAASrD,IACI89B,KAC9Bz6B,GAASrD,GAAc4E,GAG/Bm4B,aAAatO,GACLA,EAAOhvB,SACP1N,KAAK0N,OAASgvB,EAAOhvB,QACrBgvB,EAAOzsB,aACPjQ,KAAKiQ,WAAaysB,EAAOzsB,YACzBysB,EAAOvsB,SACPnQ,KAAKmQ,OAASusB,EAAOvsB,QACrBusB,EAAO8N,SACPxqC,KAAKwqC,OAAS9N,EAAO8N,QACrB9N,EAAO+N,aACPzqC,KAAKyqC,WAAa/N,EAAO+N,YACzB/N,EAAOgO,SACP1qC,KAAK0qC,OAAShO,EAAOgO,QACrBhO,EAAOiO,OACP3qC,KAAK2qC,KAAOjO,EAAOiO,MACnBjO,EAAOoO,eACP9qC,KAAK8qC,aAAepO,EAAOoO,cAC3BpO,EAAOkO,oBACP5qC,KAAK4qC,kBAAoBlO,EAAOkO,mBAChClO,EAAOmO,kBACP7qC,KAAK6qC,gBAAkBnO,EAAOmO,iBAClC7qC,KAAKgsC,iBAGTA,iBACI,MAAMt+B,EAAS1N,KAAK0N,OAAON,QAAQ,OAAQ,KACrCE,EAAOtN,KAAKsN,KACZC,EAASvN,KAAK2qC,KAAOr/B,EAAW2gC,KAAO3gC,EAAWsC,OAClDJ,EAAQxN,KAAK0qC,OAASn/B,EAAUoD,OAASpD,EAAUqC,OAEzD5N,KAAK+qC,SAAW,GAAGr9B,KAAUJ,KAAQC,KAAUC,IAMnD0+B,gBAAgBC,GACZ,OAAInsC,KAAKmQ,OAAOg8B,GACLnsC,KAAKmQ,OAAOg8B,GAGZnsC,KAAKmQ,OAAOnQ,KAAK8qC,cAG5BsB,gBAEA,OADgBpsC,KAAKksC,gBAAgBlsC,KAAK8qC,cAC1BlyB,GAAK5Y,KAAKiQ,WAAcjQ,KAAKuW,iBAQjD81B,yBAAyBphC,GACrB,IAAI8B,EACJ,MAAM0C,EAAUzP,KAAKksC,gBAAgBjhC,GACrC,GAAKwE,EAIA,CAED,OADqD,QAA/B1C,EAAK0C,EAAQ68B,oBAAiC,IAAPv/B,EAAgBA,EAAK,GAC5D/M,KAAKiQ,WAJ3B,MAAO,IAUfs8B,oBAAoBtoC,GAChB,MAAM9D,EAAMH,KAAK+qC,SAGjB,IAAIyB,EAAelC,GAAenqC,QACb2C,IAAjB0pC,IACAA,EAAe,GACflC,GAAenqC,GAAOqsC,GAE1B,IAAI/iC,EAAQ+iC,EAAavoC,GACzB,QAAcnB,IAAV2G,EAAqB,CACrBA,EAAQ,EACR,IAAK,IAAI/B,EAAI,EAAGA,EAAIzD,EAAKa,SAAU4C,EAC/B+B,GAASzJ,KAAKqsC,yBAAyBpoC,EAAKyD,IAEhD8kC,EAAavoC,GAAQwF,EAEzB,OAAOA,EAGXgjC,oBAAoBxoC,GAChB,OAAOjE,KAAKusC,oBAAoBtoC,GAAQjE,KAAKuW,iBAKjDJ,YAAY7I,GAIR,OAHAtN,KAAKsN,KAAOA,EAEZtN,KAAKgsC,iBACEhsC,KAGPuW,uBACA,OAAOvW,KAAKsN,KAAOZ,EAAKM,cAAcC,GAE1C+C,gBACI,OAAOhQ,KAAKiQ,YC9Pb,IAAIy8B,GAOAC,GD2PXtC,GAAcnJ,OAAQ,ECjQtB,SAAWwL,GACPA,EAA4BA,EAAkC,KAAI,GAAK,OACvEA,EAA4BA,EAAoC,OAAI,GAAK,SACzEA,EAA4BA,EAAmC,MAAI,GAAK,QACxEA,EAA4BA,EAAyC,YAAI,GAAK,cAJlF,CAKGA,KAAgCA,GAA8B,KAEjE,SAAWC,GACPA,EAA0BA,EAA+B,IAAI,GAAK,MAClEA,EAA0BA,EAAkC,OAAI,GAAK,SACrEA,EAA0BA,EAAkC,OAAI,GAAK,SACrEA,EAA0BA,EAAuC,YAAI,GAAK,cAJ9E,CAKGA,KAA8BA,GAA4B,KAOtD,MAAMC,WAAmBrxB,EAM5Bla,YAAY4C,GACRxB,QACAzC,KAAKiE,KAAOA,EACZjE,KAAK6sC,wBAA0BH,GAA4B3wB,OAG3D/b,KAAK8sC,sBAAwBH,GAA0BI,IACvD/sC,KAAKkW,YAELlW,KAAKwc,SAAS+f,EAAOkB,UAAUx5B,IAGxB3C,sBACP,OAAOG,EAASmrC,WAGpBnoC,cAAcuoC,EAAavL,GACvB,IAAKuL,GAAsC,IAAvBA,EAAYloC,OAC5B,OAAO,EACX,IAAI2E,EAAQ,EACZ,IAAK,IAAI/B,EAAI,EAAGA,EAAIslC,EAAYloC,SAAU4C,EAAG,CACzC,MAAMulC,EAAaD,EAAYtlC,GACzBwlC,EAAgB7C,GAAc8C,OAAOF,EAAWz3B,UAGtD,IAAI43B,GADe,EAAIF,EAAcd,WAAa7P,EAAOuC,oBAEzD,MAAMpiB,EAAOuwB,EAAWtwB,oBAClBzC,EAAQwC,EAAKoB,WACbuvB,EAAgB3wB,EAAK4wB,UAAY5wB,EAAK6wB,mBAAqB/F,EAAKe,GACtE,IAAIe,EAAa,EACbkE,EAAQ,EACZ,GAAIrrC,EAAUua,GACV,GAAIA,EAAKykB,eAAesM,UAAW,CAC/B,MAAMnN,EAAO5jB,EAAKgxB,UACdpN,IACAgJ,EAAanlC,KAAK6C,IAAIs5B,EAAK2I,aAAe1M,EAAOuC,0BAIrDwK,EAAa,OAGhB,GAAIrnC,EAAgBya,GAAO,CAC5B,MAAM4jB,EAAO5jB,EAAKgxB,UACdpN,GAA+B,MAAvB5jB,EAAKixB,gBACbrE,EAAanlC,KAAK6C,IAAIs5B,EAAK2I,aAAe1M,EAAOuC,qBAGrD5kB,IACAszB,EAAQtzB,EAAM0zB,eAGlB,MAAMnQ,EAAYyP,EAAcT,oBAAoBQ,EAAWhpC,MAE/D,GADAwF,EAAQtF,KAAK4E,IAAIU,EAAOg0B,GACpBwP,EAAWH,wBAA0B9sC,KAAK6tC,gBAAgBd,IAAK,CAC/D,IAAIe,EAAWpxB,EAAKqxB,eAAc,GAC9B5rC,EAAUua,KACVoxB,EAAWN,GAAS9wB,EAAKsxB,cAAgB,KAEzCX,IAAkB7F,EAAKe,KACvBuF,GAAYxE,GAEDwE,EAAWrM,EAAMwM,cAAgB,GACnCT,GACTP,EAAW3vB,YAAYkwB,EAAQM,GAC/BV,GAAuBI,EAAQM,EAC/BrM,EAAMwM,cAAgBb,IAGtBH,EAAW3vB,YAAYmkB,EAAMwM,eAC7BxM,EAAMwM,eAAiBb,QAG1B,GAAIH,EAAWH,wBAA0B9sC,KAAK6tC,gBAAgBK,OAAQ,CACvE,IAAIJ,EAAWN,EAAQ9wB,EAAKqxB,gBACxB5rC,EAAUua,KACVoxB,EAAWpxB,EAAKyxB,iBAAmB,GAEnCd,IAAkB7F,EAAKgB,OACvBsF,GAAYxE,GAEhB,MAAM8E,EAAYN,EAAWrM,EAAMjmB,UAAY,EAC3C4yB,EAAYZ,GACZP,EAAW3vB,YAAYkwB,EAAQY,GAC/BhB,GAAuBI,EAAQY,EAC/B3M,EAAMjmB,UAAY4xB,IAGlBH,EAAW3vB,YAAYmkB,EAAMjmB,WAC7BimB,EAAMjmB,WAAa4xB,QAIvBH,EAAW3vB,YAAYmkB,EAAMjmB,WAKrC,OAFAimB,EAAMK,YAAcr4B,EAAQ,EAC5Bg4B,EAAM4M,aAAe5kC,EAAQ,GACtB,EAMX6kC,yBAAyBC,GAErB,OADAvuC,KAAK8sC,sBAAwC,iBAATyB,EAAoB3B,GAAW4B,sBAAsBD,GAAQA,EAC1FvuC,KAKXyuC,mBACI,OAAOzuC,KAAK6sC,wBAMhB6B,iBAAiBH,GAEb,OADAvuC,KAAK6sC,wBAA0C,iBAAT0B,EAAoB3B,GAAW+B,wBAAwBJ,GAAQA,EAC9FvuC,KAGX2U,OACI,MAAMmE,EAAM9Y,KAAK0U,eACXgI,EAAO1c,KAAK2c,oBACZ0wB,EAAgB3wB,EAAK4wB,UAAY5wB,EAAK6wB,mBAAqB/F,EAAKe,GAChE2E,EAAgB7C,GAAc8C,OAAOntC,KAAKwV,UAC1C4xB,EAAQ1qB,EAAK2qB,mBAAmB3wB,EAAiBuF,MAAOjc,KAAKoR,OACnEpR,KAAKgV,cAEL8D,EAAIlF,OACJ,MAAMg7B,EAAcvuC,OAAOiS,KAAKtS,KAAK6R,aAAa,YAAYxO,KAAK,KACnEyV,EAAI+1B,UAAUD,EAAa5uC,KAAK6R,aAAa,OAC7CiH,EAAIxD,QAAQtV,KAAKwV,UACjB,MAAMs5B,EAAah2B,EAAIi2B,YAAY/uC,KAAKiE,MAAMwF,MACxCulC,EAAc9B,EAAcd,UAAY,EAC9C,IAAIvpC,EACAgF,EAEAhF,EADA7C,KAAK6sC,0BAA4BH,GAA4B/wB,KACzDyrB,EAAMvkC,EAEL7C,KAAK6sC,0BAA4BH,GAA4BpwB,MAC9D8qB,EAAMvkC,EAAIisC,EAET9uC,KAAK6sC,0BAA4BH,GAA4B3wB,OAC9DqrB,EAAMvkC,EAAIisC,EAAa,EAGvBpyB,EAAKuyB,WAAaH,EAAa,EAEvC,IAAII,EAAW,GACXC,EAAU,EACd,MAAMC,EAAW1yB,EAAK4wB,UAChBpzB,EAAQwC,EAAK3B,aAOnB,GAJIq0B,IACAF,EAAWxyB,EAAK2yB,YAAYlG,aAC5BgG,EAAUj1B,EAAMsoB,0BAEhBxiC,KAAK8sC,wBAA0BH,GAA0BuB,OAAQ,CAGjErmC,EADW6U,EAAK4yB,QACTC,QAAO,CAAC5rC,EAAGC,IAAOD,EAAIC,EAAID,EAAIC,IACrCiE,IAAM7H,KAAKwb,UAAY,GAAK+gB,EAAOuC,oBAAsBkQ,EACrDI,GAAY/B,IAAkB7F,EAAKgB,OACnC3gC,EAAI1D,KAAK4E,IAAIlB,EAAGqnC,EAASxF,KAAOsF,EAAcG,EAAUnvC,KAAKwb,iBAGhE,GAAIxb,KAAK8sC,wBAA0BH,GAA0B5wB,OAAQ,CACtE,MAAMyzB,EAAK9yB,EAAK+yB,eAAezvC,KAAKwb,WAAa,EAEjD3T,EAAI2nC,GADOt1B,EAAMw1B,kBAAkB1vC,KAAKwb,WACzBg0B,GAAM,EAAIR,EAAc,OAEtC,GAAIhvC,KAAK8sC,wBAA0BH,GAA0BI,IAC9DllC,EAAI6U,EAAK4yB,QAAQ,IAAMtvC,KAAKwb,UAAY,GAAK+gB,EAAOuC,oBAChDsQ,GAAY/B,IAAkB7F,EAAKe,KAGnC4G,EAAUD,EAASxF,KAAOxvB,EAAMy1B,iBAAmBpT,EAAOuC,oBAAsBqQ,EAChFtnC,EAAI1D,KAAKqlC,IAAI3hC,EAAGqnC,EAASxF,KAAOyF,GAAWnvC,KAAKwb,UAAY,SAG/D,CACD,MAAMo0B,EAAUlzB,EAAKmzB,iBACrBhoC,EAAI+nC,EAAQlG,MAAQkG,EAAQjG,MAAQiG,EAAQlG,MAAQ,EAAIsF,EAAc,GAxNlF,YAAc/rC,GACN2pC,GAAW1L,OACXn+B,EAAI,sBAAuBE,GAwN3B,CAAE,yBAA0BjD,KAAKiE,KAAMpB,EAAGgF,GAC1CiR,EAAIg3B,SAAS9vC,KAAKiE,KAAMpB,EAAGgF,GAC3BiR,EAAIi3B,aACJj3B,EAAItE,WAIZo4B,GAAW1L,OAAQ,EACnB0L,GAAWl3B,UAAYrV,OAAO0V,OAAO,GAAIhD,EAAQ2C,WAEjDk3B,GAAWoD,kBAAoBtD,GAC/BE,GAAW+B,wBAA0B,CACjCvyB,KAAMswB,GAA4B/wB,KAClCU,MAAOqwB,GAA4BpwB,MACnCR,OAAQ4wB,GAA4B3wB,OACpCk0B,WAAYvD,GAA4BwD,aAE5CtD,GAAWiB,gBAAkBlB,GAC7BC,GAAW4B,sBAAwB,CAC/BxyB,MAAO2wB,GAA0BI,IACjCoD,IAAKxD,GAA0BI,IAC/B7wB,MAAOywB,GAA0BuB,OACjCkC,OAAQzD,GAA0BuB,OAClCpyB,OAAQ6wB,GAA0B5wB,OAClCk0B,WAAYtD,GAA0BuD,aC9O1C,MAAM,MAAEj0B,GAAK,MAAEE,IAAUZ,EAASG,SAClC,SAAS20B,GAAmBC,EAAQprC,GAChC,MAA6B,GAAtBorC,EAAOprC,EAAQ,IAG1B,SAASqrC,GAAcrtC,EAAMuY,GACzB,OAAOA,IAAaQ,GAAQ/Y,GAAQ,EAAIA,GAAQ,EAEpD,SAASstC,GAAoBttC,EAAMuY,GAC/B,OAAI80B,GAAcrtC,EAAMuY,GAChBA,IAAaQ,GACN9X,KAAKssC,KAGLtsC,KAAK0C,MAIT1C,KAAKw+B,MAiBpB,MAAM+N,GAAsBh0B,GAAS3a,EAAY2a,IAAS/a,EAAY+a,GA0G/D,MAAMi0B,WAAqBp1B,EAK9Bla,YAAY4P,GACRxO,QACAzC,KAAKiR,KAAOA,EACZjR,KAAKyb,SAAWU,GAChBnc,KAAKmhC,eAAiB,CAClBC,WAAY,IAEhBphC,KAAKuY,QAGEjX,sBACP,OAAOG,EAASkvC,aAoBpBlsC,cAAc61B,EAAemH,GACzB,IAAKnH,GAA0C,IAAzBA,EAAcx1B,OAChC,OAAO,EACX,MACM8rC,EAAe,CAACC,EAAc3tC,EAAMuY,IAAa40B,GAAmBG,GAAoBttC,EAAMuY,GAAW7Y,EAAQiuC,EAAar4B,MAAM1I,aAAapG,QAAU,GADlJ,IAEf4wB,EAAcpc,SAAS2yB,IACnB,MAAMn0B,EAAOm0B,EAAal0B,oBAC1B,IAAI6wB,EAAQ,EACZ,MAAMH,EAAgB3wB,EAAK4wB,UAAY5wB,EAAK6wB,mBAAqB/F,EAAKe,GACtE,IAAIe,EAAa,EAEjB,GAAIrnC,EAAgBya,GAAO,CACvB,MAAM4jB,EAAO5jB,EAAKgxB,UACdpN,IACAgJ,EAAanlC,KAAK6C,IAAIs5B,EAAK2I,aAAe1M,EAAOuC,qBAGzD,MAAM5kB,EAAQwC,EAAKoB,WAInB,GAHI5D,IACAszB,EAAQtzB,EAAM0zB,eAEdiD,EAAazzB,gBAAkBnB,GAAO,CACtC,IAAI6xB,EAAWpxB,EAAKqxB,eAAc,GAC9BV,IAAkB7F,EAAKe,KACvBuF,GAAYxE,GAEhB,IAAIwH,EAAYF,EAAaC,EAAcpP,EAAMwM,cAAehyB,IAChE,MAAM80B,EAASjD,EAAWrM,EAAMwM,cAAgB,IAE3C4C,EAAaA,aAAatW,eAAiBwW,EAASvD,IACrDsD,GAAatD,EAAQuD,GAEzBF,EAAavzB,YAAYmkB,EAAMwM,eAC/BxM,EAAMwM,eAAiB6C,OAEtB,GAAID,EAAazzB,gBAAkBjB,GAAO,CAC3C,IAAI2xB,EAAW3pC,KAAK4E,IAAIykC,EAAQ9wB,EAAKqxB,gBAAiB,GAClDV,IAAkB7F,EAAKgB,OACvBsF,GAAYxE,GAEhB,IAAIwH,EAAYF,EAAaC,EAAcpP,EAAMjmB,UAAWW,IAC5D,MAAMiyB,EAAYN,EAAWrM,EAAMjmB,UAAY,IAE1Cq1B,EAAaA,aAAatW,eAAiB6T,EAAYZ,IACxDsD,GAAatD,EAAQY,GAEzByC,EAAavzB,YAAYmkB,EAAMjmB,WAC/BimB,EAAMjmB,WAAas1B,MAG3B,MAAMrnC,EAAQ6wB,EACT/nB,KAAKs+B,GAAiBA,EAAat0B,aACnCgzB,QAAO,CAACyB,EAAUC,IAAe9sC,KAAK4E,IAAIkoC,EAAYD,KAG3D,OAFAvP,EAAMK,YAAcr4B,EAAQ,EAC5Bg4B,EAAM4M,aAAe5kC,EAAQ,GACtB,EAEXhF,sBAAqB,cAAE61B,GAAiB5d,EAAMw0B,GAC1C,IAAK5W,EACD,OACJ,MAAM6W,EAAkB,CACpBC,SAAU,KACVC,OAAQ,KACRC,OAAQ,MAEZhX,EACK3yB,MAAM,KACN4K,KAAKg/B,GAAgBA,EAAYjjC,OAAO3G,MAAM,OAC9C4K,KAAI,EAAE3F,EAAM6O,MACb,MAAMiiB,EAAQ,CAAEzsB,KAAMkgC,EAAgBvkC,IAGtC,OAFI6O,IACAiiB,EAAMjiB,SAAWF,EAASM,eAAeJ,IACtCy1B,EAAQM,aAAab,aAAajT,MAExCnrB,KAAKmrB,GAAUhhB,EAAKkqB,YAAYlJ,EAAO,KAEhDnlB,QACIvY,KAAK6wC,aAAetU,EAAOkV,kBAAkBzxC,KAAKiR,MAClD,MAAM4/B,EAAejuC,EAAQ5C,KAAK6wC,aAAc,gBAAiB,2BAA2B7wC,KAAKiR,QAC3F1O,GAAQvC,KAAKyb,WAAaQ,GAAQ40B,EAAapW,UAAYoW,EAAanW,YAAcmW,EAAatuC,KACzGvC,KAAKwY,MAAQ,IAAI1B,EAAMvU,MAAAA,EAAmCA,EAAO,GAAIvC,KAAKmhC,eAAeC,YACzFphC,KAAKwc,SAAS5Z,EAAQ5C,KAAKwY,MAAM1I,aAAarG,QAGlDkL,OACI,MAAMmE,EAAM9Y,KAAK0U,eACXgI,EAAO1c,KAAK2c,oBAClB3c,KAAKgV,cACL,MAAM5D,EAAQpR,KAAK8c,cACb,SAAErB,EAAQ,MAAEjD,EAAOgD,UAAWk2B,GAAa1xC,KAC3C2xC,EAAqB3xC,KAAK6wC,aAAatW,cACvCrgB,EAAQwC,EAAK3B,aACb62B,EAAa13B,EAAMsoB,yBACnBqP,EAAQ1vC,EAAUua,IAElB,EAAE7Z,GAAM6Z,EAAK2qB,mBAAmB5rB,EAAUrK,GAC1C0gC,GAAyBH,GAAsBE,EAC/CE,EAlKd,SAA0Br1B,EAAMjB,GAC5B,MAAMu2B,EAAev2B,IAAaQ,IAASS,EAAK6wB,qBAAuB/F,EAAKe,IACvE9sB,IAAaU,IAASO,EAAK6wB,qBAAuB/F,EAAKgB,KAC5D,OAAIkI,GAAmBh0B,GACfA,EAAK4wB,WAAa0E,EACX,GAKA,EAIPt1B,EAAK4wB,WAAa0E,EACX,EAGA,EAgJWC,CAAiBv1B,EAAMjB,GACvCy2B,EAAU3V,EAAOoF,mBAAmBvxB,aAAa,gBAAgBoI,EAAMuB,oBAAqB,GAClG,IAAIlS,EAAI,CACJ,CAACoU,IAAQ,KACLzD,EAAMmC,UAAU,GAAK,GACrB,MAAM9S,EAnPtB,SAAiB6U,EAAMg1B,GACnB,MAAMrE,EAAgB3wB,EAAK6wB,oBACnB7D,KAAMyI,EAAUxI,MAAOyI,GAAc11B,EAAKmzB,iBAClD,GAAIa,GAAmBh0B,GACnB,OAAIA,EAAK4wB,UACDD,IAAkB7F,EAAKe,GAChB4J,EAGAC,EAIJjuC,KAAKqlC,OAAO9sB,EAAK4yB,SAG3B,GAAIntC,EAAUua,GACf,OAAIA,EAAK4wB,WACDD,IAAkB7F,EAAKe,GAChB4J,EAOJz1B,EAAK3B,aAAa00B,eAAeiC,GAI5C,MAAM,IAAIrvC,EAAa,kBAAmB,iEAqNxBgwC,CAAQ31B,EAAMg1B,IAAaA,EAAWK,GAAiBH,EACjE,OAAOE,EAAwB3tC,KAAKqlC,IAAItvB,EAAMu1B,eAAekB,GAAa2B,gBAAiBzqC,GAAKA,GAEpG,CAACsU,IAAQ,KACL3D,EAAMmC,UAAU,GAAK,GACrB,MAAM9S,EAvNtB,SAAoB6U,EAAMg1B,GACtB,MAAMrE,EAAgB3wB,EAAK6wB,oBACnB7D,KAAMyI,EAAUxI,MAAOyI,GAAc11B,EAAKmzB,iBAClD,GAAIa,GAAmBh0B,GACnB,OAAIA,EAAK4wB,UACDD,IAAkB7F,EAAKe,GAChB6J,EAGAD,EAIJhuC,KAAK4E,OAAO2T,EAAK4yB,SAG3B,GAAIntC,EAAUua,GACf,OAAIA,EAAK4wB,UACDD,IAAkB7F,EAAKe,GAChB7rB,EAAK3B,aAAa20B,kBAAkBgC,GAGpCS,EAIJz1B,EAAK3B,aAAa20B,kBAAkBgC,GAI/C,MAAM,IAAIrvC,EAAa,kBAAmB,iEAyLxBkwC,CAAW71B,EAAMg1B,IAAaA,EAAWK,GAAiBH,EACpE,OAAOE,EAAwB3tC,KAAK4E,IAAImR,EAAMw1B,kBAAkBiB,GAAa2B,gBAAiBzqC,GAAKA,IAEzG4T,KACF,IAAKo2B,EAAO,CACR,MAAMW,EAAkB/2B,IAAaQ,IAAS,EAAI,EAC5C6xB,EAAWpxB,EAAK2lB,cAAcjxB,GAAOlO,KAErCuvC,GADoB/1B,EAAK4yB,QAAQl+B,GAASvJ,GAAK+pC,EAChBltC,OAAOopC,GACtC4E,EAhRlB,SAAyBf,EAAoBzuC,EAAMuY,EAAU+2B,GAEzD,MAAME,EAAcrC,GAAmBG,GAAoBttC,EAAMuY,GAAWvY,GAG5E,GAF4ByuC,GAAsBpB,GAAcmC,EAAaj3B,IACzDi3B,EAAc,GAAM,EAGpC,OAAOA,EADkB,IACgBF,EAGzC,OAAOE,EAsQiBC,CAAgBhB,EAAoBc,EAAWh3B,EAAU+2B,GACzEjC,GAAcmC,EAAaj3B,IAC3BjD,EAAMmC,UAAU,GAAK,IACzB9S,GAAK1D,KAAK6C,IAAI0rC,EAAcD,GAAab,EAAaY,EAAkBN,EAAUM,GA5S9F,YAAcvvC,GACN0tC,GAAazP,OACbn+B,EAAI,wBAAyBE,GA4S7B,CAAE,iCAAiCJ,SAASgF,MAC5C2Q,EAAMoC,OAAO9B,EAAKjW,EAAGgF,IAI7B8oC,GAAazP,OAAQ,EACrByP,GAAa2B,gBAAkB,GC3TxB,MAAMM,GACEtxC,sBACP,OAAOG,EAASmxC,cAEhB5kC,SAAKzG,GACLvH,KAAKsV,QAAQ/N,GAEbyG,WACA,OAAOhO,KAAKiW,UAMhB48B,WAAWtrC,GAEP,OADAvH,KAAKsV,QAAQ/N,GACNvH,MCRR,MAAM8yC,WAAiB//B,EAC1B1R,cACIoB,QACAzC,KAAK+yC,eAAgB,EACrB/yC,KAAKgzC,gBAAiB,EAGtBhzC,KAAKm+B,MAAQ,IAAI95B,EAAS,EAAG,GAC7BrE,KAAKizC,eAAiB,EACtBjzC,KAAKkzC,eAAiB,IAAI7uC,EAAS,EAAG,GAEtCrE,KAAKyJ,MAAQ,EACbzJ,KAAKoX,QAAU,EACfpX,KAAKmzC,UAAY,GACjBnzC,KAAKozC,YAAc,GACnBpzC,KAAKqzC,cAAe,EACpBrzC,KAAKszC,eAAiB,EAGtBtzC,KAAKuzC,cAAe,EAGpBvzC,KAAKwzC,iBAAmB,CAIpBC,QAAS,CAAEr3B,KAAM,EAAGC,MAAO,GAG3B0hB,SAAU,GAEV2V,WAAY,EAGZC,MAAO,CACHC,KAAM,EACNC,KAAM,EACNC,UAAW,IAIZxyC,sBACP,OAAOG,EAASqxC,SAGpBv6B,QACI,OAAOvY,KAGX0lC,WACI,OAAO1lC,KAAKm+B,MAGhBqH,oBACI,OAAOxlC,KAAKuzC,aAGhBQ,eAAevT,GAEX,OADAxgC,KAAKuzC,aAAe/S,EACbxgC,KAGXwc,SAAS/S,GACLzJ,KAAKyJ,MAAQA,EAGjB8S,WACI,IAAKvc,KAAK+yC,cACN,MAAM,IAAI1wC,EAAa,kBAAmB,+CAE9C,OAAOrC,KAAKyJ,OAASzJ,KAAKid,gBAAkBjd,KAAKid,gBAAgBV,WAAa,GAGlFpC,UAAUtX,GAEN,OADA7C,KAAKoX,QAAUvU,EACR7C,KAGXyd,YACI,OAAOzd,KAAKoX,QAGhBnP,OAEI,OADoBjI,KAAKg0C,iBAAiB,uCACvB/rC,OAASjI,KAAKoX,QAGrC68B,sBACI,OAAOj0C,KAAKwzC,iBAGhBU,kBACI,OAAIl0C,KAAKm0C,kBACEn0C,KAAKszC,eAET,EAGXc,gBAAgBC,GAEZ,OADAr0C,KAAKszC,eAAiBe,EACfr0C,KAGXm0C,kBACI,OAAOn0C,KAAKqzC,aAGhBiB,mBAAmBjB,GAEf,OADArzC,KAAKqzC,aAAeA,EACbrzC,KAMXu0C,WACI,OAAO3xC,EAAQ5C,KAAKqlC,MAAO,UAAW,0BAG1CmP,SAASnP,GACLrlC,KAAKqlC,MAAQA,EAGjBoP,YACI,OAAOz0C,KAAK00C,OAGhBC,iBACI,OAAO30C,KAAKozC,YAOhBwB,YAAYF,GACR,IAAIG,EACAC,EACJ,GAAIJ,EAAQ,CACR,MAAMhtC,EAAI1H,KAAKozC,YAAY5M,QAAQkO,GAQnC,OAPW,IAAPhtC,IACA1H,KAAKozC,YAAYzM,OAAOj/B,EAAG,GAC3BmtC,EAAYH,EAAOK,eACnBD,EAAgBJ,EAAOM,mBAEvBh1C,KAAKi1C,oBAAoBJ,EAAWC,IAEjC90C,KAEX,KAAOA,KAAKozC,YAAYtuC,QAEpB+vC,GADAH,EAAS10C,KAAKozC,YAAY8B,OACPH,eACnBD,EAAgBJ,EAAOM,mBAEvBh1C,KAAKi1C,oBAAoBJ,EAAWC,GAExC,OAAO90C,KAGXm1C,UAAUT,GACN,GAAIA,EAAQ,CACR10C,KAAKozC,YAAYv7B,KAAK68B,GACtB,MAAMG,EAAYH,EAAOK,eACnBD,EAAgBJ,EAAOM,mBAC7Bh1C,KAAKi1C,oBAAoBH,EAAeD,GAG5C,OADA70C,KAAK00C,OAASA,EACP10C,KAOXo1C,qBAAqBC,GACjBr1C,KAAKid,gBAAkBo4B,EACvB,IAAK,IAAI3tC,EAAI,EAAGA,EAAI1H,KAAKmzC,UAAUruC,SAAU4C,EACzC1H,KAAKid,gBAAgBq4B,UAAUt1C,KAAKmzC,UAAUzrC,IAIlD,OAFA1H,KAAKid,gBAAgBq4B,UAAUt1C,MAC/BA,KAAK+yC,eAAgB,EACd/yC,KAOX4mC,YAAYF,EAAUt1B,EAAQ,GAG1B,OAFApR,KAAKmzC,UAAUt7B,KAAK6uB,GACpB1mC,KAAK+yC,eAAgB,EACd/yC,KAGXymC,eACI,OAAOzmC,KAAKmzC,UAGhBoC,eAAeC,GACXx1C,KAAK4d,YAAc43B,EACnBx1C,KAAK+yC,eAAgB,EAEzBiB,iBAAiBxxC,EAAU,iCACvB,OAAOI,EAAQ5C,KAAK4d,YAAa,gBAAiBpb,GAGtDizC,YACQz1C,KAAK+yC,gBAET/yC,KAAKyJ,MAAQ,EACTzJ,KAAKid,kBACLjd,KAAKid,gBAAgBw4B,YACrBz1C,KAAKyJ,OAASzJ,KAAKid,gBAAgBV,aAIvCm5B,iBAAaxwC,GACblF,KAAK+yC,cAAgB7tC,EAErBwwC,mBACA,OAAO11C,KAAK+yC,cAGhB4C,aACI,OAAI31C,KAAKgzC,iBAEThzC,KAAKgzC,gBAAiB,GADXhzC,KAKX41C,kBAAc1wC,GACdlF,KAAKgzC,eAAiB9tC,EAEtB0wC,oBACA,OAAO51C,KAAKgzC,eAGhB6C,oBACI,OAAO71C,KAAKizC,eAGhB6C,kBAAkB7C,GACdjzC,KAAKizC,eAAiBA,EACtBjzC,KAAKm+B,MAAQn+B,KAAKkzC,eAAexsC,QAAQX,SAAS/F,KAAKizC,gBAG3D8C,oBACI,OAAO/1C,KAAKkzC,eAGhB+B,oBAAoB3wC,EAAWC,GAC3BvE,KAAKkzC,eAAentC,SAASzB,EAAWC,GACxCvE,KAAKm+B,MAAQn+B,KAAKkzC,eAAexsC,QAAQX,SAAS/F,KAAKizC,gBAG3D+C,YAAYjY,GACR,MAAMI,EAAQJ,EAASz5B,WAAai4B,EAAOzW,WAAaiY,EAASx5B,aACjEvE,KAAKm+B,MAAQn+B,KAAKkzC,eAAexsC,QAAQX,SAASo4B,GAClDn+B,KAAKizC,eAAiBjzC,KAAKm+B,MAAMj5B,QAErC+wC,eAEI,OADoBj2C,KAAKg0C,iBAAiB,+CACvB/rC,OAGvBkV,mBAAmBk4B,GAEf,OADAr1C,KAAKid,gBAAkBo4B,EAChBr1C,KAGXgd,qBACI,OAAOhd,KAAKid,gBAGhBC,uBACI,OAAOta,EAAQ5C,KAAKid,gBAAiB,oBAAqB,mDC7Q3D,MAAMnb,WAAagxC,GAOtBzxC,YAAY60C,GAER,GADAzzC,SACKyzC,EACD,MAAM,IAAI7zC,EAAa,eAAgB,2EAG3C,MAAM8zC,EAAmBr0C,GAAKs0C,gBAAgBF,GAC9C,IAAKC,EACD,MAAM,IAAI9zC,EAAa,eAAgB,uCAAuCg0C,KAAKC,UAAUJ,MAGjGl2C,KAAKsS,KAAO4jC,EAAW5jC,MAAQ,GAE/BtS,KAAKu2C,SAAW,GAChBv2C,KAAK+9B,SAAWoY,EAAiBpY,SACjC/9B,KAAKw2C,SAAWL,EAAiBllC,KACjCjR,KAAKy2C,YAAcN,EAAiBM,YAChCP,EAAWQ,kBAEX12C,KAAKg2C,YAAYE,EAAWQ,mBAI5B12C,KAAK81C,kBAAkBK,EAAiBhY,OAE5Cn+B,KAAKmzC,UAAY,GAEjBnzC,KAAKwY,MAAQ+jB,EAAOoa,cAAc32C,KAAK+9B,SAAU/9B,KAAKw2C,UACtDx2C,KAAK42C,aAAe52C,KAAKy2C,YAAYlkC,KAAK3N,GAAM23B,EAAOoa,cAAc32C,KAAK+9B,SAAUn5B,KAEpF5E,KAAK62C,cAAW/zC,EAEhB9C,KAAKuzC,cAAe,EAEpBvzC,KAAKyJ,MAAQ,EACbzJ,KAAK82C,oBAAsB,EAC3B92C,KAAK+2C,qBAAuB,EAC5B/2C,KAAKoX,QAAU,EACfpX,KAAKqpC,GAAK,GAEN6M,EAAW7C,cACXrzC,KAAKs0C,mBAAmB4B,EAAW7C,cAGvCrzC,KAAKmhC,eAAiB,CAClB6V,mBAAoB,EACpBC,iBAAkB,EAClBC,UAAW,EACX//B,MAAO,EACPnJ,KAAM,GACNqJ,QAAS,GAKN/V,sBACP,OAAOG,EAASK,KAGpB2C,mBAAmBqU,EAAK4D,EAAM5B,GAC1B,MAAMrL,EAAUiN,EAAK5M,aACfqnC,EAASz6B,EAAKu5B,eAAiBxmC,EAAQuO,UAAYvO,EAAQqnC,oBAC3DM,EAAQ16B,EAAKu5B,eAAiBxmC,EAAQqnC,oBACtCO,EAAO36B,EAAKu5B,eACZqB,EAAS56B,EAAKu5B,eAAiBxmC,EAAQ8nC,OACvCC,EAAS96B,EAAKu5B,eAAiBxmC,EAAQ8nC,OAAS9nC,EAAQsnC,qBACxDU,EAAO/6B,EAAKu5B,eAAiBxmC,EAAQ8nC,OAAS9nC,EAAQsnC,qBAAuBtnC,EAAQwO,WACrFy5B,EAAgBD,GAAQ/6B,EAAKu3B,sBAAsBR,QAAQp3B,OAAS,GACpEs7B,EAASF,EAAON,EACtBr+B,EAAIlF,OACJkF,EAAIxD,QAAQ5I,EAAKiB,WAAY,GAC7BmL,EAAIg3B,SAAS3rC,KAAKw+B,MAAMgV,GAAU,KAAMR,EAASz6B,EAAKe,YAAa3C,GACnE,MAAMjT,EAAIiT,EAAO,EACjB,SAASiiB,EAAO7zB,EAAIG,EAAIuuC,EAAOC,EAAKhwC,GAChCiR,EAAIQ,YACJR,EAAI1E,eAAewjC,GACnB9+B,EAAI5E,aAAa0jC,GACjB9+B,EAAIxE,aAAa,GACjBwE,EAAIS,OAAOrQ,EAAKwT,EAAKe,YAAao6B,GAClC/+B,EAAIU,OAAOnQ,EAAKqT,EAAKe,YAAao6B,GAClC/+B,EAAIikB,SAERA,EAAOoa,EAAQC,EAAO,OACtBra,EAAOqa,EAAOC,EAAM,QACpBta,EAAOsa,EAAMC,EAAQ,SACrBva,EAAOua,EAAQE,EAAQ,QACvBza,EAAOya,EAAQC,EAAM,OACrB1a,EAAO0a,EAAMC,EAAe,QAC5B3a,EAAOoa,EAASz6B,EAAKe,YAAa05B,EAAQ,QFnF3C,SAAiBr+B,EAAKjW,EAAGgF,EAAG+vC,EAAQ,QACvC9+B,EAAIlF,OACJkF,EAAI5E,aAAa0jC,GAEjB9+B,EAAIQ,YACJR,EAAIg/B,IAAIj1C,EAAGgF,EAAG,EAAG,EAAa,EAAV1D,KAAKC,IAAQ,GACjC0U,EAAIi/B,YACJj/B,EAAIa,OACJb,EAAItE,UE4EAwjC,CAAQl/B,EAAKu+B,EAAO36B,EAAKe,YAAa5V,EAAG,QACzC,MAAM2rC,EAAmB92B,EAAKu3B,sBAC9B,GAAIT,EAAiBE,WAAa,EAAG,CACjC,MAAMuE,EAAiBzE,EAAiBG,MAAMG,UACxC9vC,EAASi0C,GAAkB,EAAI,IAAM,GAC3Cn/B,EAAI5E,aAAa,OACjB4E,EAAIg3B,SAAS9rC,EAASG,KAAKw+B,MAAMsV,GAAiBZ,EAAO36B,EAAKe,YAAa3C,EAAO,IAEtFhC,EAAItE,UAER/P,qBAAqByzC,GACjB,IAAKA,EACD,OAEJ,MACM9rC,EADS,mCACOwX,KAAKs0B,GAC3B,IAAK9rC,EACD,OAKJ,MAAO,CAAE2xB,SAHQ3xB,EAAO,GAGL+rC,KAFN/rC,EAAO,GAAGtH,OAEEmM,KADZ7E,EAAO,IAAM,KAG9B3H,uBAAuByxC,GAEnB,MAAMkC,EAAgBt2C,GAAKu2C,cAAcnC,EAAWnY,UACpD,IAAKqa,EACD,OAGJ,IAAInnC,EAAOilC,EAAWjlC,KACtB,GAAIA,IAASsrB,EAAO0D,WAAWhvB,GAC3B,OAGJ,MAAMwlC,EAAc,GACfxlC,IACDA,EAAOmnC,EAAcnnC,MAAQ,SAELnO,IAApBozC,EAAW5jC,MACX4jC,EAAW5jC,KAAK4L,SAAQ,CAAC1L,EAAG9K,KACxB,MAAM0E,EAASoG,EAAE7K,MAAM,KAEvB8uC,EAAY/uC,GAAM0E,GAA4B,IAAlBA,EAAOtH,OAAesH,EAAO,GAAK6E,MAK1E,IAAIktB,EAAQ5B,EAAO+b,gBAAgBF,EAAcra,UACjD,IAAKI,EACD,OAGJ,MAAMga,EAAOjC,EAAWiC,KAAOjC,EAAWiC,KAAOC,EAAcD,KAC/D,GAAoB,iBAATA,EACP,OAGJ,IAAII,EAAepa,EACnB,IAAK,IAAIz2B,EAAI,EAAGA,EAAIywC,EAAMzwC,IAAK,CAC3B,GAAI6wC,GAAgB,EAChB,OACJA,GAA8B,EAC9Bpa,GAASoa,EAEb,MAAO,CACHxa,SAAUqa,EAAcra,SACxB9sB,KAAAA,EACAwlC,YAAAA,EACA0B,KAAAA,EACAha,MAAAA,GAORqa,cACI,OAAOx4C,KAAK62C,SAMhB4B,YAAY/7B,GAER,OADA1c,KAAK62C,SAAWn6B,EACT1c,KAQXimC,SACI,OAAO,EAGXyS,UAAUtnC,EAAO2rB,GAKb,OAJAA,EAAOngB,QAAQ5c,MACf+8B,EAAOhgB,SAAS3L,GAChBpR,KAAKmzC,UAAUt7B,KAAKklB,GACpB/8B,KAAK01C,cAAe,EACb11C,KAGX8d,WACI,OAAO9d,KAAKka,MAGhBa,aACI,OAAOnY,EAAQ5C,KAAKka,MAAO,UAAW,kCAG1CD,SAASC,GAIL,OAHAla,KAAKka,MAAQA,EACbla,KAAK24C,MAAM,CAACz+B,EAAMuoB,YAAY,KAC9BziC,KAAKqV,WAAWrV,KAAKka,MAAM9E,cACpBpV,KAGXsiC,yBACI,OAAOtiC,KAAK82C,oBAGhB8B,0BACI,OAAO54C,KAAK+2C,qBAGhB8B,uBAAuBh2C,GAEnB,OADA7C,KAAK82C,oBAAsBj0C,EACpB7C,KAGX84C,wBAAwBj2C,GAEpB,OADA7C,KAAK+2C,qBAAuBl0C,EACrB7C,KAGXwlC,oBACI,OAAOxlC,KAAKuzC,aAIhBxF,cAAcgL,GACV,OAAO,EAGXC,iBACI,OAAO,EAIXC,WACI,OAAOj5C,KAAKwY,MAGhB0gC,gBAEI,GAAIl5C,KAAKwY,MAAO,CACZ,GAAIxY,KAAKwY,MAAM1I,WACX,OAAO9P,KAAKwY,MAAM1I,aAAarG,MAE9B,GAAIzJ,KAAKwY,MAAM+D,SAChB,OAAOvc,KAAKwY,MAAM+D,SAASvc,KAAKmhC,eAAe8V,kBAGvD,OAAO,EAMX0B,MAAMtP,GAEF,OADArpC,KAAKqpC,GAAKA,EACHrpC,KAMXsvC,QACI,GAAuB,IAAnBtvC,KAAKqpC,GAAGvkC,OACR,MAAM,IAAIzC,EAAa,YAAa,yCAExC,OAAOrC,KAAKqpC,GAMhBoG,eAAej0B,GACX,OAAOxb,KAAK+a,aAAa00B,eAAej0B,GAG5C+4B,WACI,IAAKv0C,KAAKqlC,MACN,MAAM,IAAIhjC,EAAa,UAAW,sBACtC,OAAOrC,KAAKqlC,MAGhBmP,SAASnP,GAGL,OAFArlC,KAAKqlC,MAAQA,EACbrlC,KAAK01C,cAAe,EACb11C,KAGX6d,iBACI,OAAO7d,KAAKg0C,mBAGhBuB,eAAeC,GAGX,OAFAx1C,KAAK4d,YAAc43B,EACnBx1C,KAAK01C,cAAe,EACb11C,KAGXm5C,cACI,OAAOn5C,KAAK+9B,SAGhBqb,WACI,OAAOp5C,KAAKq5C,mBAAmB,OAAOv0C,OAAS,EAGnDwoC,UACI,OAAO,EAGXK,cACI,OAAO3tC,KAAKw2C,SAGhB8C,UACI,OAAOt5C,KAAKu5C,KAGhBC,YACI,OAAO52C,EAAQ5C,KAAKu5C,KAAM,SAAU,gCAGxCE,UACI,OAAoB32C,MAAb9C,KAAKu5C,KAGhBG,QAAQH,GAEJ,OADAv5C,KAAKu5C,KAAOA,EACLv5C,KAQX4mC,YAAYF,EAAUt1B,EAAQ,GAC1B,MAAMuoC,EAAY,wDASlB,GAPqB,iBAAVvoC,IACPA,EAAQrN,SAASqN,GAEjB9N,QAAQC,KAAKo2C,EAAY,2DAIL,iBAAbjT,GAA0C,iBAAVt1B,EACvC,MAAM,IAAI/O,EAAa,cAAe,iCAAmCs3C,EAAY,aAKzF,OAHAjT,EAAS9pB,QAAQ5c,MACjB0mC,EAAS3pB,SAAS3L,GAClB3O,MAAMmkC,YAAYF,GACX1mC,KAGXq5C,mBAAmBpoC,GACf,OAAOjR,KAAKkd,uBAAuB08B,WAAW3oC,GAIlDo2B,mBAAmB5rB,EAAUrK,EAAO8G,GAChC,IAAKlY,KAAK01C,aACN,MAAM,IAAIrzC,EAAa,kBAAmB,wDAE9C,MAAO,CACHQ,EAAG7C,KAAKi2C,eACRpuC,EAAG7H,KAAKqpC,GAAG,IAGnBwQ,sBAAsBzoC,GAElB,OADcpR,KAAKqiC,cAAcjxB,GACpB+rB,UAAYn9B,KAAK44C,0BAA4B,EAE9DkB,qBAAqB1oC,GAEjB,OADcpR,KAAKqiC,cAAcjxB,GACpB+rB,UAAYn9B,KAAKsiC,yBAA2B,EAE7DyX,gBACI,IAAItpC,EAAKzQ,KAAK44C,0BAGd,OAFqE,IAAjE54C,KAAKkd,uBAAuB08B,WAAW,eAAe90C,SACtD2L,GAAM8rB,EAAOoF,mBAAmBvxB,aAAa,8BAC1CK,EAGXX,aACI,IAAK9P,KAAK01C,aACN,MAAM,IAAIrzC,EAAa,kBAAmB,iDAE9C,MAAM2b,EAAYhe,KAAKid,gBAAkBjd,KAAKid,gBAAgB+8B,WAAWlY,WAAa,EAChF7jB,EAAaje,KAAKid,gBAAkBjd,KAAKid,gBAAgB+8B,WAAW3L,YAAc,EAClF5kC,EAAQzJ,KAAKuc,WAQnB,MAAO,CACH9S,MAAAA,EACAwwC,WATej6C,KAAKk5C,gBAUpB3B,OATW9tC,EACXuU,EACAC,EACAje,KAAK82C,oBACL92C,KAAK+2C,qBAOL/4B,UAAAA,EACAC,WAAAA,EAEA64B,oBAAqB92C,KAAK82C,oBAC1BC,qBAAsB/2C,KAAK+2C,qBAC3BmD,QAAS,GAQjBjE,eAGI,IAAIpzC,EAFgB7C,KAAKg0C,iBAAiB,+CAEtB/rC,OAOpB,OANIjI,KAAKka,QACLrX,GAAK7C,KAAKka,MAAMigC,gBAAkB5d,EAAOoF,mBAAmBvxB,aAAa,kBAEzEpQ,KAAKm0C,oBACLtxC,GAAK7C,KAAKk0C,mBAEPrxC,EAGX0qC,mBACI,MAAM,IAAIlrC,EAAa,SAAU,kCAGrCwtC,iBACI,MAAM,IAAIxtC,EAAa,SAAU,kCAGrC+3C,eACI,IAAIC,EAAYr6C,KAAKi2C,eAIrB,OAFAoE,GADyBr6C,KAAKwY,MAAM+D,WACJ,EAChC89B,IAAcr6C,KAAKyJ,MAAQ,EAAIzJ,KAAKyJ,MAAQ,EACrC4wC,EAGXC,cACI,IAAIC,EAAUv6C,KAAKi2C,eAInB,OAFAsE,GADyBv6C,KAAKwY,MAAM+D,WACN,EAC9Bg+B,GAAWv6C,KAAKyJ,MAAQ,EAAI,EACrB8wC,EAGXC,UACI,OAAOx6C,KAAKsS,KAGhB+vB,cACI,OAAOriC,KAAKu2C,UCpeb,IAAIkE,GCDAC,GCiBAC,GAOAC,GAKAC,GAMAC,GClCAC,IHCX,SAAWN,GACPA,EAAsBA,EAA8B,OAAI,GAAK,SAC7DA,EAAsBA,EAA4B,KAAI,GAAK,OAC3DA,EAAsBA,EAA6B,MAAI,GAAK,QAC5DA,EAAsBA,EAA6B,MAAI,GAAK,QAC5DA,EAAsBA,EAA6B,MAAI,GAAK,QAC5DA,EAAsBA,EAA6B,MAAI,GAAK,QAC5DA,EAAsBA,EAA2B,IAAI,GAAK,MAP9D,CAQGA,KAA0BA,GAAwB,KAC9C,MAAMO,WAAsBjoC,EAC/B1R,cACIoB,QACAzC,KAAKyJ,MAAQ,EACbzJ,KAAK6C,EAAI,EACT7C,KAAKkyC,QAAU,GACflyC,KAAKyb,SAAWg/B,GAAsBx+B,MAE/B3a,sBACP,OAAOG,EAASu5C,cAETt/B,sBACP,OAAO++B,GAEXr9B,cACI,OAAOpd,KAAKyb,SAEhB4B,YAAY5B,GAER,OADAzb,KAAKyb,SAAWA,EACTzb,KAEX8d,WACI,OAAO9d,KAAKka,MAEhBa,aACI,OAAOnY,EAAQ5C,KAAKka,MAAO,UAAW,kCAE1CD,SAASC,GAEL,OADAla,KAAKka,MAAQA,EACNla,KAEXuc,WACI,OAAOvc,KAAKyJ,MAEhB+S,SAAS/S,GAEL,OADAzJ,KAAKyJ,MAAQA,EACNzJ,KAEXiI,OACI,OAAOjI,KAAK6C,EAEhBwF,KAAKxF,GAED,OADA7C,KAAK6C,EAAIA,EACF7C,KAEXi7C,iBAAiBziC,EAAO0B,EAAOhX,EAAMg4C,EAAc,GAC/C1iC,EAAM4B,UAAUF,EAAMuoB,YAAYv/B,MAAAA,EAAmCA,EAAO,GAAKgX,EAAMe,gBAAkBigC,GAE7GC,WAAW/pC,GACP,YAAiBtO,IAAVsO,GAAuBA,EAAQ,EAAI,EAAIpR,KAAKkyC,QAEvDkJ,WAAWlJ,GAEP,OADAlyC,KAAKkyC,QAAUA,EACRlyC,KAEXq7C,iBAAiBC,GAEb,OADAt7C,KAAKs7C,cAAgBA,EACdt7C,KAEXu7C,mBACI,OAAOv7C,KAAKs7C,cAGhB3mC,QAAQ1R,MCzEZ,SAAWy3C,GACPA,EAAYA,EAAoB,OAAI,GAAK,SACzCA,EAAYA,EAAoB,OAAI,GAAK,SACzCA,EAAYA,EAAiB,IAAI,GAAK,MACtCA,EAAYA,EAA0B,aAAI,GAAK,eAC/CA,EAAYA,EAAwB,WAAI,GAAK,aAC7CA,EAAYA,EAAyB,YAAI,GAAK,cAC9CA,EAAYA,EAAkB,KAAI,GAAK,OAP3C,CAQGA,KAAgBA,GAAc,KAC1B,MAAMh5C,WAAgBs5C,GACzB35C,YAAY4P,GACRxO,QACAzC,KAAKw7C,UAAYjf,EAAOqC,qBACxB,MAAM6c,EAAOf,GACb16C,KAAK07C,OAAS,GACd17C,KAAK07C,OAAOD,EAAKE,QAAU,EAC3B37C,KAAK07C,OAAOD,EAAKG,QAAU,EAC3B57C,KAAK07C,OAAOD,EAAKI,KAAO,EACxB77C,KAAK07C,OAAOD,EAAKK,cAAgB,EACjC97C,KAAK07C,OAAOD,EAAKM,YAAc,EAC/B/7C,KAAK07C,OAAOD,EAAKO,aAAe,EAChCh8C,KAAK07C,OAAOD,EAAKQ,MAAQ,EACzBj8C,KAAKk8C,SAAW,GAChBl8C,KAAKk8C,SAAST,EAAKE,QAAU,EAC7B37C,KAAKk8C,SAAST,EAAKG,QAAU,EAC7B57C,KAAKk8C,SAAST,EAAKI,KAAO,EAC1B77C,KAAKk8C,SAAST,EAAKK,cAAgB,GACnC97C,KAAKk8C,SAAST,EAAKM,YAAc,GACjC/7C,KAAKk8C,SAAST,EAAKO,aAAe,GAClCh8C,KAAKk8C,SAAST,EAAKQ,MAAQ,EAC3Bj8C,KAAKm8C,iBAAmB,GACxBn8C,KAAKm8C,iBAAiBV,EAAKE,QAAU,CACjCS,KAAM,EACNC,KAAM,EACNC,YAAa,EACbC,aAAc,GAElBv8C,KAAKm8C,iBAAiBV,EAAKG,QAAU,CACjCQ,MAAO,EACPC,KAAM,EACNC,YAAa,EACbC,aAAc,GAElBv8C,KAAKm8C,iBAAiBV,EAAKI,KAAO,CAC9BO,MAAO,EACPC,KAAM,EACNC,YAAa,EACbC,aAAc,GAElBv8C,KAAKm8C,iBAAiBV,EAAKM,YAAc,CACrCK,MAAO,GACPC,KAAM,EACNC,YAAa,EACbC,aAAc,GAElBv8C,KAAKm8C,iBAAiBV,EAAKK,cAAgB,CACvCM,MAAO,EACPC,KAAM,GACNC,YAAa,EACbC,aAAc,GAElBv8C,KAAKm8C,iBAAiBV,EAAKO,aAAe,CACtCI,MAAO,GACPC,KAAM,GACNC,YAAa,EACbC,aAAc,GAElBv8C,KAAKm8C,iBAAiBV,EAAKQ,MAAQ,CAC/BG,KAAM,EACNC,KAAM,EACNC,YAAa,EACbC,aAAc,GAElBv8C,KAAKqd,YAAYo9B,GAAsB+B,OACvCx8C,KAAKy8C,QAAQxrC,GAEN3P,sBACP,OAAOG,EAASC,QAETuP,kBACP,OAAOypC,GAEAgC,wBACP,MAAO,CACHC,OAAQjC,GAAYiB,OACpBiB,OAAQlC,GAAYkB,OACpBiB,IAAKnC,GAAYmB,IACjBiB,YAAapC,GAAYoB,aACzBiB,UAAWrC,GAAYqB,WACvBiB,WAAYtC,GAAYsB,YACxBiB,KAAMvC,GAAYuB,MAG1BiB,UACI,OAAOl9C,KAAKiR,KAEhBwrC,QAAQxrC,GAKJ,OAJAjR,KAAKiR,KAAuB,iBAATA,EAAoBvP,GAAQg7C,WAAWzrC,GAAQA,EAClEjR,KAAKwc,SAASxc,KAAK07C,OAAO17C,KAAKiR,OAC/BjR,KAAKo7C,WAAWp7C,KAAKk8C,SAASl8C,KAAKiR,OACnCjR,KAAKq7C,iBAAiBr7C,KAAKm8C,iBAAiBn8C,KAAKiR,OAC1CjR,KAGX2U,KAAKuF,GAGD,OAFAA,EAAMxF,eACN1U,KAAKgV,cACGhV,KAAKiR,MACT,KAAKypC,GAAYiB,OACb37C,KAAKm9C,gBAAgBjjC,EAAOla,KAAK6C,GAAG,GACpC,MACJ,KAAK63C,GAAYkB,OACb57C,KAAKm9C,gBAAgBjjC,EAAOla,KAAK6C,GAAG,GACpC,MACJ,KAAK63C,GAAYmB,IACb77C,KAAKo9C,mBAAmBljC,EAAOla,KAAK6C,GACpC,MACJ,KAAK63C,GAAYoB,aAGb97C,KAAKq9C,cAAcnjC,EAAOla,KAAK6C,GAAG,GAC9BqX,EAAMjS,SAAWjI,KAAK6C,GACtB7C,KAAKm9C,gBAAgBjjC,EAAOA,EAAMjS,QAEtC,MACJ,KAAKyyC,GAAYqB,WACb/7C,KAAKq9C,cAAcnjC,EAAOla,KAAK6C,GAAG,GAClC,MACJ,KAAK63C,GAAYsB,YACbh8C,KAAKq9C,cAAcnjC,EAAOla,KAAK6C,GAAG,GAClC7C,KAAKq9C,cAAcnjC,EAAOla,KAAK6C,GAAG,IAO9Cs6C,gBAAgBjjC,EAAOrX,EAAGy6C,GACtB,MAAMC,EAAWrjC,EAAMxF,eACjBg1B,EAAOxvB,EAAMy1B,iBACb6N,EAAOtjC,EAAMujC,uBACfH,GACAC,EAASG,SAAS76C,EAAI,EAAG6mC,EAAM,EAAG8T,EAAO9T,GAE7C6T,EAASG,SAAS76C,EAAG6mC,EAAM,EAAG8T,EAAO9T,GAEzC0T,mBAAmBljC,EAAOrX,GACtB,MAAM06C,EAAWrjC,EAAMxF,eACjBg1B,EAAOxvB,EAAMy1B,iBACb6N,EAAOtjC,EAAMujC,uBACnBF,EAASG,SAAS76C,EAAI,EAAG6mC,EAAM,EAAG8T,EAAO9T,GACzC6T,EAASG,SAAS76C,EAAI,EAAG6mC,EAAM,EAAG8T,EAAO9T,GAE7C2T,cAAcnjC,EAAOrX,EAAG86C,GACpB,MAAMJ,EAAWrjC,EAAMxF,eACjBg1B,EAAOxvB,EAAMy1B,iBACb6N,EAAOtjC,EAAMujC,uBACnB,IAAIrmC,EAAU,EACTumC,IACDvmC,GAAW,GAEfmmC,EAASG,SAAS76C,EAAIuU,EAASsyB,EAAM,EAAG8T,EAAO9T,GAC/C6T,EAASG,SAAS76C,EAAI,EAAG6mC,EAAM,EAAG8T,EAAO9T,GAGrCiU,EACAvmC,GAAW,EAGXA,GAAW,EAEf,MAAMwmC,EAAQ/6C,EAAIuU,EAAUymC,EAE5B,IAAI3U,GAAYhvB,EAAM0zB,cAAgB,GAAK1zB,EAAMsoB,yBACjD0G,EAAWA,EAAW,EAAIhvB,EAAMsoB,yBAA2B,EAC3D,IAAIsb,EAAQpU,EAAOR,EAAW2U,EAE9BN,EAASjkC,YACTikC,EAASzF,IAAI8F,EAAOE,EAfD,EAeoB,EAAa,EAAV35C,KAAKC,IAAQ,GACvDm5C,EAAS5jC,OAETmkC,GAAS5jC,EAAMsoB,yBACf+a,EAASjkC,YACTikC,EAASzF,IAAI8F,EAAOE,EApBD,EAoBoB,EAAa,EAAV35C,KAAKC,IAAQ,GACvDm5C,EAAS5jC,QG7KV,MAAMokC,WAAgBj8C,GACzBT,YAAY4P,EAAOypC,GAAYiB,QAC3Bl5C,MAAM,CAAEs7B,SAAU,MAClB/9B,KAAKyP,QAAU,CACXisC,OAAQ,IAEZ,MAAMD,EAAOf,GACb16C,KAAKyP,QAAQisC,OAAS,CAClB,CAACD,EAAKE,QAAS,EACf,CAACF,EAAKG,QAAS,GACf,CAACH,EAAKI,KAAM,GACZ,CAACJ,EAAKK,cAAe,GACrB,CAACL,EAAKM,YAAa,GACnB,CAACN,EAAKO,aAAc,GACpB,CAACP,EAAKQ,MAAO,GAGjBj8C,KAAKuzC,cAAe,EACpBvzC,KAAKy8C,QAAQxrC,GAEN3P,sBACP,OAAOG,EAASs8C,QAGpBb,UACI,OAAOl9C,KAAKiR,KAGhBwrC,QAAQxrC,GAIJ,OAHAjR,KAAKiR,KAAuB,iBAATA,EAAoBvP,GAAQg7C,WAAWzrC,GAAQA,EAElEjR,KAAKwc,SAASxc,KAAKyP,QAAQisC,OAAO17C,KAAKiR,OAChCjR,KAIXo1C,qBAAqBC,GAEjB,OAAOr1C,KAGXy1C,YAEI,OADAz1C,KAAK01C,cAAe,EACb11C,KAGX2U,OACI,MAAMmE,EAAM9Y,KAAK0U,gBA1DzB,YAAczR,GACN86C,GAAQ7c,OACRn+B,EAAI,mBAAoBE,GAyDxB,CAAE,0BAA2BjD,KAAKi2C,gBAC9Bj2C,KAAKwN,OACLxN,KAAK0T,WAAWoF,GACpB,MAAMklC,EAAU,IAAIt8C,GAAQ1B,KAAKiR,MACjC+sC,EAAQ31C,KAAKrI,KAAKi2C,gBAClB+H,EAAQrpC,KAAK3U,KAAK+a,cACd/a,KAAKwN,OACLxN,KAAKuU,aAAauE,GACtB9Y,KAAKgV,eAIb+oC,GAAQ7c,OAAQ,ECtET,MAAM+c,WAAa1iC,EAkCtBla,YAAY4C,EAAMi6C,GAAU,EAAOC,GAC/B17C,QACAzC,KAAKiE,KAAOA,EACZjE,KAAKoX,QAAU,EACfpX,KAAKk+C,QAAUA,EACfl+C,KAAKo+C,IAAM,GACXp+C,KAAKkW,YACLlW,KAAKmhC,eAAiB,CAClBkd,WAAY,IACZC,WAAY,UACZC,WAAY,EACZC,cAAe,GAEfL,EACAn+C,KAAKm+C,OAASA,GAIdn+C,KAAKm+C,OAAS,CAAC,CAAEltC,KAAMgtC,GAAK1V,GAAItkC,KAAMjE,KAAKiE,OACvCjE,KAAKk+C,SACLl+C,KAAKm+C,OAAOtmC,KAAK,CAAE5G,KAAMgtC,GAAKzV,KAAMvkC,KAAM,MAElDjE,KAAKy+C,cAEEn9C,sBACP,OAAOG,EAASw8C,KAET1V,gBACP,OAAO,EAEAC,kBACP,OAAO,EAGX/jC,cAAci6C,EAAOjd,GACjB,IAAKid,GAA0B,IAAjBA,EAAM55C,OAChB,OAAO,EACX,IAAI65C,EAAa,EAEjB,IAAK,IAAIj3C,EAAI,EAAGA,EAAIg3C,EAAM55C,SAAU4C,EAAG,CACnC,MAAMu0B,EAAOyiB,EAAMh3C,GACbgV,EAAOuf,EAAKtf,oBAClB,GAAIxa,EAAUua,GAAO,CACjB,MAAMkiC,EAAYliC,EAAKsxB,cAAgB,EACnCvM,EAAMwM,cAAgB2Q,IACtBnd,EAAMwM,cAAgB2Q,GAG9B3iB,EAAK9hB,UAAUwkC,GACfA,EAAa1iB,EAAK1f,WAClB0f,EAAK3e,YAAYmkB,EAAMwM,eAI3B,OAFAxM,EAAM4M,aAAesQ,EACrBld,EAAMwM,eAAiB,GAChB,EAGX9zB,UAAUjV,GAGN,OAFAlF,KAAKoX,QAAUlS,EACflF,KAAKy+C,cACEz+C,KAEX6+C,OAAO35C,GAEH,OADAlF,KAAKo+C,IAAMl5C,EACJlF,KAGX8+C,UACI,OAAO9+C,KAAKiE,KAEhB86C,gBAEI,OADsB1U,GAAc8C,OAAOntC,KAAKwV,UAC3B42B,UAGzBqS,cACI,MAAMvR,EAAgB7C,GAAc8C,OAAOntC,KAAKwV,UAIhD,IAAIwpC,EAAa,EACjB,IAAK,IAAIt3C,EAAI,EAAGA,EAAI1H,KAAKm+C,OAAOr5C,SAAU4C,EAAG,CACzC,MAAMu0B,EAAOj8B,KAAKm+C,OAAOz2C,GACzB,QAAmB5E,IAAfm5B,EAAKxyB,MACLu1C,GAAc/iB,EAAKxyB,UAElB,CACD,MAAMw1C,EAAmBhjB,EAAKhrB,OAASgtC,GAAK1V,GAAKvoC,KAAKmhC,eAAeod,WAAav+C,KAAKmhC,eAAeqd,cACtGviB,EAAKxyB,MAAQtF,KAAK4E,IAAIk2C,GAXTh7C,EAWuCg4B,EAAKh4B,KAVtDipC,EAAcT,oBAAoBxoC,KAU6B,EAClEg4B,EAAKijB,WAAajjB,EAAKxyB,MAAQ,EAC/Bu1C,GAAc/iB,EAAKxyB,OAbP,IAACxF,EAiBrB,OADAjE,KAAKwc,SAASwiC,EAAah/C,KAAKoX,SACzBpX,KAGX2U,OACI,IAAI5H,EACJ,MAAM+L,EAAM9Y,KAAK0U,eACXgI,EAAO1c,KAAK2c,oBAClB3c,KAAKgV,cACL,MAAMoyB,EAAQ1qB,EAAK2qB,mBAAmB9rB,EAASG,SAASY,MAAOtc,KAAKoR,OACpEg2B,EAAMvkC,GAAK,EACXukC,EAAMv/B,GAAK,GACX,MAAMuP,EAAUpX,KAAKoX,QAEf+3B,EADQzyB,EAAK3B,aACGynB,yBAChB2c,EAAUziC,EAAK4yB,QAAQC,QAAO,CAAC5rC,EAAGC,IAAOD,EAAIC,EAAID,EAAIC,IAErDw7C,EAAchY,EAAMv/B,IAAM7H,KAAKwb,UAAY,GAAK2zB,EAAU/H,EAAMv/B,EAAIs3C,GAAW,EAC/EE,EAAejY,EAAMv/B,IAAM7H,KAAKwb,UAAY,GAAK2zB,EAAU/H,EAAMv/B,EAAIs3C,GAAW,EAChFG,EAAa,CAACz8C,EAAGgF,EAAG4B,EAAOC,KAC7B,MAAM61C,EAAO18C,EAAI4G,EACX+1C,EAAO33C,EACbiR,EAAIlF,OACJkF,EAAIQ,YACJR,EAAIxE,aAAatU,KAAKmhC,eAAekd,YACrCvlC,EAAI1E,eAAepU,KAAKmhC,eAAemd,YACvCxlC,EAAI5E,aAAalU,KAAKmhC,eAAemd,YACrCxlC,EAAIS,OAAO1W,EAAGgF,GACdiR,EAAIW,iBAAiB8lC,EAAMC,EAAM38C,EAAI4G,EAAOC,GAC5CoP,EAAIikB,SACJjkB,EAAItE,WAEFirC,EAAgB,CAAC58C,EAAGgF,EAAG4B,EAAOC,KAChCoP,EAAIlF,OACJkF,EAAIQ,YACJR,EAAIxE,aAAatU,KAAKmhC,eAAekd,YACrCvlC,EAAI1E,eAAepU,KAAKmhC,eAAemd,YACvCxlC,EAAI5E,aAAalU,KAAKmhC,eAAemd,YACrCxlC,EAAIS,OAAO1W,EAAG6G,GACdoP,EAAIW,iBAAiB5W,EAAI4G,EAAOC,EAAQ7G,EAAI4G,EAAO5B,GACnDiR,EAAIikB,SACJjkB,EAAItE,WAEFkrC,EAAkB,CAAC78C,EAAGgF,EAAG0c,KAC3B,MACMo7B,EAAQ93C,EADA,EACY0c,EAC1BzL,EAAIQ,YACJR,EAAIS,OAAO1W,EAAGgF,GACdiR,EAAIU,OAAO3W,EAJG,EAIQ88C,GACtB7mC,EAAIU,OAAO3W,EALG,EAKQ88C,GACtB7mC,EAAIi/B,YACJj/B,EAAIa,QAEFimC,EAAa,CAAC/8C,EAAGoB,KACnB6U,EAAIlF,OACJkF,EAAIxD,QAAQtV,KAAKwV,UACjB,MAAMqqC,EAAWh9C,EAAIiW,EAAIi2B,YAAY9qC,GAAMwF,MAAQ,EACnDqP,EAAIg3B,SAAS7rC,EAAM47C,EAAUR,GAC7BvmC,EAAItE,WAER,IAAIsrC,EACAC,EAAuB,EACvBC,EAAmB,EACvB,GAAwB,QAAnBjzC,EAAK/M,KAAKo+C,WAAwB,IAAPrxC,OAAgB,EAASA,EAAGjI,OAAQ,CAEhE86C,EADiBljC,EAAK2qB,mBAAmB9rB,EAASG,SAASK,OAAQ/b,KAAKoR,OACpDvO,EAAG7C,KAAKo+C,KAEhC,IAAK,IAAI12C,EAAI,EAAGA,EAAI1H,KAAKm+C,OAAOr5C,SAAU4C,EAAG,CACzC,MAAMu0B,EAAOj8B,KAAKm+C,OAAOz2C,GACpBu0B,EAAKijB,aACNjjB,EAAKijB,WAAa,GACZ,IAANx3C,IACAu0B,EAAKijB,YAAc9nC,GACvB4oC,EAAmB/jB,EAAKijB,WAAaa,GAA8B,IAANr4C,EAAU0P,EAAU,GAC7E6kB,EAAKhrB,OAASgtC,GAAK1V,KACfuX,GAAaA,EAAU7uC,OAASgtC,GAAK1V,IACrCmX,EAAgBtY,EAAMvkC,EAAGu8C,EAAa,GAE1CE,EAAWlY,EAAMvkC,EAAGukC,EAAMv/B,EAAGm4C,EAAkBZ,IAE/CnjB,EAAKhrB,OAASgtC,GAAKzV,OACfsX,GAAaA,EAAU7uC,OAASgtC,GAAK1V,IACrCkX,EAAcrY,EAAMvkC,EAAGukC,EAAMv/B,EAAGm4C,EAAkBZ,GAElDU,GAAaA,EAAU7uC,OAASgtC,GAAKzV,OACrCkX,EAAgBtY,EAAMvkC,EAAGukC,EAAMv/B,GAAI,GACnC43C,EAAcrY,EAAMvkC,EAAGukC,EAAMv/B,EAAGm4C,EAAkBZ,IAEjDU,IACDE,EAAmB/jB,EAAKijB,WACxBO,EAAcrY,EAAMvkC,EAAGukC,EAAMv/B,EAAGm4C,EAAkBZ,KAG1DQ,EAAWxY,EAAMvkC,EAAIm9C,EAAkB/jB,EAAKh4B,MAC5C67C,EAAY7jB,EACZ8jB,EAAuB9jB,EAAKijB,WAC5BY,EAAUj9C,EAAIukC,EAAMvkC,EACpBukC,EAAMvkC,GAAKm9C,EAEf,IAAKF,GAA4Bh9C,MAAfg9C,EAAUj9C,EACxB,MAAM,IAAIR,EAAa,oBAAqB,mBAG5Cy9C,EAAU7uC,OAASgtC,GAAK1V,GACxBmX,EAAgBI,EAAUj9C,EAAIm9C,EAAkBZ,EAAa,GAExDU,EAAU7uC,OAASgtC,GAAKzV,MAC7BkX,EAAgBI,EAAUj9C,EAAIm9C,EAAkB5Y,EAAMv/B,GAAI,IH/NtE,SAAS,MAAK5E,GACNg9C,GAAY/e,OACZn+B,EAAI,uBAAwBE,GGkOpCg7C,GAAKvoC,UAAYrV,OAAO0V,OAAO,GAAIhD,EAAQ2C,WH/N3C,SAAWilC,GACPA,EAA6BA,EAAmC,KAAI,GAAK,OACzEA,EAA6BA,EAAqC,OAAI,GAAK,SAC3EA,EAA6BA,EAAoC,MAAI,GAAK,QAC1EA,EAA6BA,EAA0C,YAAI,GAAK,cAJpF,CAKGA,KAAiCA,GAA+B,KAEnE,SAAWC,GACPA,EAA2BA,EAAgC,IAAI,GAAK,MACpEA,EAA2BA,EAAmC,OAAI,GAAK,SAF3E,CAGGA,KAA+BA,GAA6B,KAE/D,SAAWC,GACPA,EAAYA,EAAmB,MAAI,GAAK,QACxCA,EAAYA,EAAkB,KAAI,GAAK,OACvCA,EAAYA,EAAkB,KAAI,GAAK,OAH3C,CAIGA,KAAgBA,GAAc,KAEjC,SAAWC,GACPA,EAAgBA,EAAsB,KAAI,GAAK,OAC/CA,EAAgBA,EAA2B,UAAI,GAAK,YACpDA,EAAgBA,EAA6B,YAAI,GAAK,cAH1D,CAIGA,KAAoBA,GAAkB,KAKlC,MAAMmF,WAAoB1kC,EAC7Bla,cACIoB,QACAzC,KAAKkgD,aAAe,GACpBlgD,KAAKmgD,WAAaxF,GAA6Bh/B,KAC/C3b,KAAKogD,SAAWxF,GAA2B7N,IAC3C/sC,KAAKqgD,YAAa,EAClBrgD,KAAKsgD,aAAc,EACnBtgD,KAAKkW,YAEE5U,sBACP,OAAOG,EAASw+C,YAETM,2BACP,OAAON,GAAYxwC,QAAQ+wC,OAAOD,cAG3BE,0BAAeC,GACtBT,GAAYU,SAAWD,EAEhBD,4BACP,OAAOR,GAAYU,SAGvBl8C,yBAAyBm8C,GACrB,GAAIX,GAAYxwC,QAAQmxC,GACpB,OAAOX,GAAYxwC,QAAQmxC,GAIxBC,qCACP,OAAOtkB,EAAOoF,mBAAmB3xB,gBAE1B8wC,kCACP,OAAOb,GAAYxwC,QAAQ+wC,OAAOrR,QAAU8Q,GAAYY,wBAE5Dp8C,wBAAwB+T,GACpB,MAAMuoC,EAASd,GAAYe,kBAAkBxoC,EAAMjW,MACnD,OAAKw+C,EAGEA,EAAOzU,aAAe2T,GAAYY,wBAF9B,IAIfp8C,yBAAyB+T,GACrB,MAAMuoC,EAASd,GAAYe,kBAAkBxoC,EAAMjW,MACnD,OAAKw+C,EAGEA,EAAOE,QAAUhB,GAAYY,wBAFzB,EAIfp8C,yBAAyB+T,GACrB,MAAMuoC,EAASd,GAAYe,kBAAkBxoC,EAAMjW,MACnD,OAAKw+C,GAGI,EAAIA,EAAOG,gBAAmBjB,GAAYY,wBAFxC,EAIJjW,+BACP,OAAOqV,GAAYxwC,QAAQ+wC,OAAO5V,kBAAoBqV,GAAYY,wBAE3DhW,6BACP,OAAOoV,GAAYxwC,QAAQ+wC,OAAO3V,gBAAkBoV,GAAYY,wBAEzDM,2BACP,OAAOlB,GAAYxwC,QAAQ+wC,OAAOW,cAAgBlB,GAAYY,wBAGvDpxC,qBACP,OAAO8sB,EAAOoF,mBAAmB7xB,aAAaK,OAAOixC,YAE9CC,8BAIP,OAAOpB,GAAYxwC,QAAQ+wC,OAAOa,iBAE3BC,8BACP,OAAOrB,GAAYxwC,QAAQ+wC,OAAOc,iBAEtC78C,qBAAqBzB,GACjB,YAAgCF,IAAzBE,EAAMu+C,gBAAgCv+C,EAAMu+C,iBAAmBzG,GAAgB0G,YAE1F/8C,mBAAmBzB,GACf,YAAgCF,IAAzBE,EAAMu+C,gBAAgCv+C,EAAMu+C,iBAAmBzG,GAAgB2G,UAM1Fh9C,cAAci9C,EAASjgB,GACnB,IAAI10B,EACJ,IAAK20C,GAA8B,IAAnBA,EAAQ58C,OACpB,OAAO,EACX,IAAI2E,EAAQ,EACRk4C,EAAgB,EACpB,MAAMC,EAAiB,GACvB,IAAK,MAAMC,KAAUH,EAAS,CAC1B,MAAM70C,EAAWH,EAAK4J,wBAAmD,QAA1BvJ,EAAK80C,EAAOrsC,gBAA6B,IAAPzI,OAAgB,EAASA,EAAGO,MACvGw0C,EAAUp1C,EAAKq1C,UAAUl1C,EAAU,KACnCm1C,EAAqB,EAAVF,EACjB,IAAIG,EAAa,EACbC,GAAS,EACb,IAAK,IAAIC,EAAI,EAAGA,EAAIN,EAAO3B,aAAap7C,SAAUq9C,EAAG,CACjD,MAAMn/C,EAAQ6+C,EAAO3B,aAAaiC,GAC5BC,EAAMnC,GAAYoC,cAAcr/C,GAChCs/C,EAAMrC,GAAYsC,YAAYv/C,GAC9Bw/C,EAAgBJ,GAAOE,EAAMrC,GAAYM,cAAgB,EACzDkC,EAAMz/C,EAAM0/C,aAAe7H,GAAY8H,MAAQX,EAAWQ,EAAgBV,EAAUU,GAGtFJ,GAAOE,KACPL,EAAa,GAIjB,MAAMp1C,EAAWg1C,EAAO3U,cAAc32B,iBAChCqsC,EAAmB/1C,EAAW21C,EAmBpC,GAlBIx/C,EAAM0/C,aAAe7H,GAAY8H,YAAyB7/C,IAAhBE,EAAMwV,OAChDxV,EAAMyG,MAAQw2C,GAAY4C,iBAAiB7/C,EAAMwV,OAASoqC,EAC1D5/C,EAAM0X,QAAUulC,GAAY6C,kBAAkB9/C,EAAMwV,OAASoqC,EAC7D5/C,EAAMwX,QAAUylC,GAAY8C,kBAAkB//C,EAAMwV,OAASoqC,EAC7D5/C,EAAMwV,MAAMrB,MAAQnU,EAAMwV,MAAMrB,MAAQsrC,GAEnCz/C,EAAM0/C,aAAe7H,GAAYmI,OACtChgD,EAAMyG,MAAQzG,EAAMyG,MAAQm5C,EAC5B5/C,EAAM0X,QAAUmnC,EAAOoB,kBAAkBjgD,EAAMiB,MAAQw+C,GAEvDz/C,EAAM0/C,aAAe7H,GAAY8H,YACjB7/C,IAAhBE,EAAMwV,OACNxV,EAAMwV,MAAMjW,OAAS09C,GAAY9vC,OAAO+yC,KAAK3gD,OAC7C0/C,EAAa,GAEjBj/C,EAAMyG,OAASw2C,GAAYa,qBAAuBj0C,EAAW21C,EAGzDJ,GAAOD,EAAI,EAAG,CACd,MAAMgB,EAAOtB,EAAO3B,aAAaiC,EAAI,GAChClC,GAAYoC,cAAcc,KAC3BxB,EAAgBl4C,GAGpB64C,GAAOX,EAAgB,IACvBO,GAAS,EAETl/C,EAAMwX,OAASxX,EAAMwX,QAAUmnC,EAAgBl4C,GAC/CA,EAAQk4C,EACRA,EAAgB,EAEhBE,EAAOuB,kBAAiB,IAEvBhB,GAAQE,IACTX,EAAgB,GAEpB3+C,EAAMk/C,OAASA,EACfz4C,GAASzG,EAAMyG,MAGnBo4C,EAAOwB,2BACPxB,EAAOyB,2BACHzB,EAAO0B,gBAAkB3I,GAA2B7N,KACpD8U,EAAOvkC,YAAYmkB,EAAMwM,eACzBxM,EAAMwM,eAAiBgU,IAGvBJ,EAAOvkC,YAAYmkB,EAAMjmB,UAAY,GACrCimB,EAAMjmB,WAAaymC,EAAa,GAEhCJ,EAAO2B,iBACP5B,EAAe/pC,KAAKpO,GAGpBm4C,EAAe/pC,KAAK,GAM5B,OAHApO,EAAQm4C,EAAerS,QAAO,CAAC5rC,EAAGC,IAAMD,EAAIC,GAAG,GAC/C69B,EAAMK,YAAcr4B,EAAQ,EAC5Bg4B,EAAM4M,aAAe5kC,EAAQ,GACtB,EAOAiM,uBACP,IAAIhI,EAAS,4BAKb,MAJ4C,aAAxC6uB,EAAOoF,mBAAmB/xB,YAE1BlC,EAAS,qCAEN,CACHA,OAAAA,EACAJ,KAAM,GACNC,OAAQjC,EAAWsC,OACnBJ,MAAOjC,EAAUqC,QAMrBg9B,wBACA,OAAOqV,GAAYrV,kBAAoB5qC,KAAKktC,cAAc32B,iBAE1Ds0B,sBACA,OAAOoV,GAAYpV,gBAAkB7qC,KAAKktC,cAAc32B,iBAE5DktC,eAAev+C,GAEX,OADAlF,KAAKsgD,YAAcp7C,EACZlF,KAEXwjD,iBACI,OAAOxjD,KAAKsgD,YAEhBgD,2BACI,MAAMI,EAAW1jD,KAAKkgD,aAAayD,WAAU,EAAGjB,WAAAA,EAAYlqC,MAAAA,KAAYkqC,IAAe7H,GAAY8H,YAAmB7/C,IAAV0V,GAAsC,iCAAfA,EAAMjW,OACzI,GAAImhD,EAAW,EACX,OAEJ,MACME,EADM5jD,KAAKkgD,aAAawD,GACbj6C,MAAQ,EACnBo6C,EAAO,IAAO7jD,KAAKktC,cAAc32B,iBACvC,IAAIutC,EAAW,EACf,KAAqBA,EAAWJ,IAAYI,EAAU,CAClD,MAAMjC,EAAS7hD,KAAKkgD,aAAa4D,GACjCjC,EAAOrnC,OAASqnC,EAAOrnC,OAASopC,EAChC/B,EAAOnnC,OAASmnC,EAAOnnC,OAASmpC,EAEpC,IAAKC,EAAWJ,EAAW,EAAGI,EAAW9jD,KAAKkgD,aAAap7C,SAAUg/C,EAAU,CAC3E,MAAMjC,EAAS7hD,KAAKkgD,aAAa4D,GACjCjC,EAAOrnC,OAASqnC,EAAOrnC,OAASopC,EAChC/B,EAAOnnC,OAASmnC,EAAOnnC,OAASmpC,GAGxCR,2BACI,IAAIU,EAAQ,EACZ,IAAK,IAAI5B,EAAI,EAAGA,EAAIniD,KAAKkgD,aAAap7C,SAAUq9C,EAAG,CAC/C,MAAMN,EAAS7hD,KAAKkgD,aAAaiC,GACjC4B,GAAS/jD,KAAKgkD,qBAAqB7B,GACnCN,EAAOrnC,QAAUupC,GAIzBC,qBAAqB7B,GACjB,IAAKniD,KAAKqgD,WACN,OAAO,EAEX,MAAM4D,EAAajkD,KAAKkgD,aAAaiC,GAC/B+B,EAAa/B,EAAI,EAAIniD,KAAKkgD,aAAaiC,EAAI,QAAKr/C,EACtD,IAAIqhD,EAAa,EAEbF,EAAWvB,aAAe7H,GAAY8H,YACjB7/C,IAArBmhD,EAAWzrC,OACXyrC,EAAWzrC,MAAMjW,OAAS09C,GAAY9vC,OAAO+yC,KAAK3gD,OAClD4hD,GAAcF,EAAWzrC,MAAM/I,QAAQ2H,cAExBtU,IAAfohD,GACAA,EAAWxB,aAAe7H,GAAY8H,YACjB7/C,IAArBohD,EAAW1rC,OACX0rC,EAAW1rC,MAAMjW,OAAS09C,GAAY9vC,OAAO+yC,KAAK3gD,OAClD4hD,GAAcD,EAAW1rC,MAAM/I,QAAQ2H,SAG3C,IAAIgtC,GAAe,EACfC,GAAe,OACAvhD,IAAfohD,GAA4BA,EAAWxB,aAAe7H,GAAYmI,OAClEoB,EAAenE,GAAYqB,iBAAiBgD,MAAMC,GAAOA,IAAOL,EAAWjgD,KAAKigD,EAAWjgD,KAAKa,OAAS,KACzGu/C,EAAepE,GAAYoB,iBAAiBiD,MAAMC,GAAOA,IAAOL,EAAWjgD,KAAKigD,EAAWjgD,KAAKa,OAAS,MAE7G,MAAM0/C,EAAsBvE,GAAYkB,cAAgBnhD,KAAKktC,cAAc32B,iBAc3E,OAXI6tC,GAAgBH,EAAW1C,iBAAmBzG,GAAgB0G,cAC9D2C,GAAcK,GAEdH,GAAgBJ,EAAWvB,aAAe7H,GAAYmI,OAClDiB,EAAWhgD,KAAK,IAAM,KAAOggD,EAAWhgD,KAAK,IAAM,MACnDkgD,GAAcK,EAAsB,GAEpCvE,GAAYqB,iBAAiBgD,MAAMC,GAAOA,KAAQL,MAAAA,OAA+C,EAASA,EAAWjgD,KAAKigD,EAAWjgD,KAAKa,OAAS,QACnJq/C,GAAcK,EAAsB,IAGrCL,EAOXM,eAAe/nB,EAAS,IACpB,IAAI3vB,EAAIkF,EAAIyyC,EACZ,MAAMhC,EAA0C,QAA5B31C,EAAK2vB,EAAOgmB,kBAA+B,IAAP31C,EAAgBA,EAAK8tC,GAAYmI,KACnF2B,EAAc,CAChB1gD,KAA6B,QAAtBgO,EAAKyqB,EAAOz4B,YAAyB,IAAPgO,EAAgBA,EAAK,GAC1DywC,WAAAA,EACAnB,eAAiD,QAAhCmD,EAAKhoB,EAAO6kB,sBAAmC,IAAPmD,EAAgBA,EAAK5J,GAAgBmB,KAC9FzhC,OAAQ,EACRE,OAAQ,EACRwnC,QAAQ,EACRz4C,MAAO,GAIX,GAAIi5C,IAAe7H,GAAY8H,OAAiC,iBAAjBjmB,EAAOlkB,MAAoB,CACtE,MAAMosC,EAAY3E,GAAY9vC,OAAOusB,EAAOlkB,OACtCqsC,EAAc,GACpBF,EAAYnsC,MAAQ,IAAI1B,EAAM8tC,EAAUriD,KAAMsiD,EAAa,CAAE3jD,SAAU,qBAMlEwhD,IAAe7H,GAAYmI,KAChC2B,EAAYl7C,MAAQzJ,KAAKktC,cAAcX,oBAAoBoY,EAAY1gD,MAElEy+C,IAAe7H,GAAY9iC,OAChC4sC,EAAYl7C,MAAQizB,EAAOjzB,OAE/B,OAAOk7C,EAIXG,eAAeC,GAEX,OADA/kD,KAAKkgD,aAAaroC,KAAK7X,KAAKykD,eAAeM,IACpC/kD,KAKXglD,QAAQ/gD,EAAM8gD,EAAa,IACvB,MAAMrC,EAAa7H,GAAYmI,KAC/B,OAAOhjD,KAAK8kD,eAAezkD,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAIgvC,GAAa,CAAE9gD,KAAAA,EAAMy+C,WAAAA,KAGpFuC,mBAAmBhhD,GACf,MAAMy+C,EAAa7H,GAAYmI,KACzBzB,EAAiBzG,GAAgB0G,YACvC,OAAOxhD,KAAK8kD,eAAe,CAAE7gD,KAAAA,EAAMy+C,WAAAA,EAAYnB,eAAAA,IAGnD2D,iBAAiBjhD,GACb,MAAMy+C,EAAa7H,GAAYmI,KACzBzB,EAAiBzG,GAAgB2G,UACvC,OAAOzhD,KAAK8kD,eAAe,CAAE7gD,KAAAA,EAAMy+C,WAAAA,EAAYnB,eAAAA,IAGnD4D,oBAAoB3sC,GAChB,MAAMkqC,EAAa7H,GAAY8H,MACzBpB,EAAiBzG,GAAgB0G,YACvC,OAAOxhD,KAAK8kD,eAAe,CAAEtsC,MAAAA,EAAOkqC,WAAAA,EAAYnB,eAAAA,IAIpD6D,SAAS5sC,EAAOkkB,EAAS,IACrB,MAAMgmB,EAAa7H,GAAY8H,MAC/B,OAAO3iD,KAAK8kD,eAAezkD,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI2mB,GAAS,CAAElkB,MAAAA,EAAOkqC,WAAAA,KAOjF2C,eAAephD,EAAMy4B,EAAS,IAC1B,IAAIj1B,EAAM,GACV,IAAK,IAAIC,EAAI,EAAGA,EAAIzD,EAAKa,SAAU4C,EAAG,CAClC,MAAM49C,EAAOrhD,EAAKyD,GACdu4C,GAAY9vC,OAAOm1C,IACf79C,EAAI3C,OAAS,IACb9E,KAAKglD,QAAQv9C,EAAKi1B,GAClBj1B,EAAM,IAEVzH,KAAKolD,SAASE,EAAM5oB,IAIpBj1B,GAAO69C,EAMf,OAHI79C,EAAI3C,OAAS,GACb9E,KAAKglD,QAAQv9C,EAAKi1B,GAEf18B,KAIXulD,QAAQ97C,EAAOizB,EAAS,IACpB,MAAMgmB,EAAa7H,GAAY9iC,KAC/B,OAAO/X,KAAK8kD,eAAezkD,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI2mB,GAAS,CAAEgmB,WAAAA,EAAYj5C,MAAAA,KActF6L,QAAQ/N,EAAG+F,EAAMC,EAAQC,GAGrB,OAFA/K,MAAM6S,QAAQ/N,EAAG+F,EAAMC,EAAQC,GAC/BxN,KAAKktC,cAAgB7C,GAAc8C,OAAOntC,KAAKwV,UACxCxV,KAEXojD,iBAAiB1C,GAEb,OADA1gD,KAAKqgD,WAAaK,EACX1gD,KAGXwlD,YAAYC,GAER,OADAzlD,KAAKogD,SAAyB,iBAAPqF,EAAkBxF,GAAYzR,sBAAsBiX,GAAMA,EAC1EzlD,KAEXujD,cACI,OAAOvjD,KAAKogD,SAGhBsF,cAAcC,GAEV,OADA3lD,KAAKmgD,WAA2B,iBAAPwF,EAAkB1F,GAAYtR,wBAAwBgX,GAAMA,EAC9E3lD,KAEX4lD,gBACI,OAAO5lD,KAAKmgD,WAEhB5jC,WACI,IAAI9S,EAAQ,EAIZ,OAHAzJ,KAAKkgD,aAAahiC,SAAS2jC,IACvBp4C,GAASo4C,EAAOK,OAAS,EAAIL,EAAOp4C,SAEjCA,EAEXw5C,kBAAkBh/C,GACd,IAAI8I,EACJ,IAAIuZ,EAAM,EACN5e,EAAI,EACR,IAAKA,EAAI,EAAGA,EAAIzD,EAAKa,SAAU4C,EAAG,CAC9B,MAAM+H,EAAUzP,KAAKktC,cAAchB,gBAAgBjoC,EAAKyD,IACxD,GAAI+H,EAAS,CACT,MAAMo2C,EAAgC,QAAxB94C,EAAK0C,EAAQq2C,aAA0B,IAAP/4C,EAAgBA,EAAK,EACnEuZ,EAAMu/B,EAAOv/B,EAAMu/B,EAAOv/B,GAGlC,MAAMrW,EAAajQ,KAAKktC,cAAcl9B,gBACtC,OAAOtI,EAAI,EAAU4e,EAAMrW,GAAX,EAAyB,EAG7C0E,OACI,MAAMmE,EAAM9Y,KAAK0U,eACXgI,EAAO1c,KAAK2c,oBAClB3c,KAAKgV,cAEL8D,EAAIlF,OACJ,MAAMg7B,EAAcvuC,OAAOiS,KAAKtS,KAAK6R,aAAa,YAAYxO,KAAK,KACnEyV,EAAI+1B,UAAUD,EAAa5uC,KAAK6R,aAAa,OAC7C,MAAMu1B,EAAQ1qB,EAAK2qB,mBAAmB9rB,EAASG,SAASO,MAAOjc,KAAKoR,OAEpE,IAAIvJ,EADJiR,EAAIxD,QAAQtV,KAAKwV,UAIjB,MAAM83B,EAAU5wB,EAAK4wB,UACfpzB,EAAQwC,EAAK3B,aACnB,GAAI/a,KAAKogD,WAAaxF,GAA2B1M,QAG7C,GADArmC,EAAIqS,EAAMw1B,kBAAkB1vC,KAAKwb,UAAY+gB,EAAOwC,yBAChDuO,EAAS,CACT,MAAM4B,EAAWxyB,EAAK2yB,YAAYlG,aAC5BgG,EAAUj1B,EAAMsoB,yBAChBujB,EAAwC,IAA5BrpC,EAAK6wB,mBAA2B2B,EAASvF,MAAQuF,EAASxF,KAC5E7hC,EAAI1D,KAAK4E,IAAIlB,EAAGk+C,EAAY5W,GAAWnvC,KAAKwb,UAAY,UAM5D,GADA3T,EAAI1D,KAAKqlC,IAAItvB,EAAMu1B,eAAezvC,KAAKwb,WAAYkB,EAAK4yB,QAAQ,GAAK,IACjEhC,EAAS,CACT,MAAM4B,EAAWxyB,EAAK2yB,YAAYlG,aAC5BgG,EAAUj1B,EAAMsoB,yBACtB36B,EAAI1D,KAAKqlC,IAAI3hC,EAAGqnC,EAASxF,KAAO,EAAIyF,EAAUnvC,KAAKwb,WAG3D,IAAI3Y,EAAIukC,EAAMvkC,EAEVA,EADA7C,KAAKmgD,aAAexF,GAA6Bh/B,KAC7CyrB,EAAMvkC,EAEL7C,KAAKmgD,aAAexF,GAA6Br+B,MAClD8qB,EAAMvkC,EAAI7C,KAAKuc,WAEdvc,KAAKmgD,aAAexF,GAA6B5+B,OAClDqrB,EAAMvkC,EAAI7C,KAAKuc,WAAa,EAI5BG,EAAKuyB,WAAajvC,KAAKuc,WAAa,EAE5C,GAAE,0BAA2Bvc,KAAKktC,cAAerqC,EAAGgF,GACpD7H,KAAKkgD,aAAahiC,SAAS2jC,IACvB,MAAMmE,EAAU/F,GAAYoC,cAAcR,GACpCoE,EAAQhG,GAAYsC,YAAYV,GACtC,IAAIqE,EAAOr+C,EAUX,GATA,GAAE,aAAcg6C,EAAOrnC,OAAQqnC,EAAOnnC,QACtC,GAAE,gBAAiBwrC,GACfF,IACAE,GAAQlmD,KAAK4qC,mBAEbqb,IACAC,GAAQlmD,KAAK6qC,iBAEjB,GAAE,gBAAiBqb,GACfrE,EAAOa,aAAe7H,GAAYmI,KAAM,CACxC,IAAIgD,GAAWC,KACXntC,EAAIlF,OACA5T,KAAKwV,UAAU,CACf,MAAM,OAAE9H,EAAM,KAAEJ,EAAI,OAAEC,EAAM,MAAEC,GAAUxN,KAAKwV,SACvC2wC,EAAkBz5C,EAAKq1C,UAAUz0C,EAAM2yC,GAAYM,eACzDznC,EAAIxD,QAAQ5H,EAAQy4C,EAAiB54C,EAAQC,GAOrD,GAAE,mBAAoBq0C,EAAO59C,KAAMpB,EAAIg/C,EAAOrnC,OAAQ0rC,EAAOrE,EAAOnnC,QACpE5B,EAAIg3B,SAAS+R,EAAO59C,KAAMpB,EAAIg/C,EAAOrnC,OAAQ0rC,EAAOrE,EAAOnnC,SACvDsrC,GAAWC,IACXntC,EAAItE,eAGHqtC,EAAOa,aAAe7H,GAAY8H,OAASd,EAAOrpC,OACvD0tC,GAAQrE,EAAOnnC,OACf,GAAE,oBAAqBmnC,EAAOrpC,MAAMjW,KAAMM,EAAIg/C,EAAOrnC,OAAQ0rC,GAC7DrE,EAAOrpC,MAAMoC,OAAO9B,EAAKjW,EAAIg/C,EAAOrnC,OAAQ0rC,IAEvCrE,EAAOa,aAAe7H,GAAY9iC,OACvC,GAAE,oBAAqB8pC,EAAOp4C,MAAO5G,EAAGqjD,GACxCptC,EAAIQ,YACJR,EAAIxE,aAAa,GACjBwE,EAAIS,OAAO1W,EAAGgF,GACdiR,EAAIU,OAAO3W,EAAIg/C,EAAOp4C,MAAOy8C,GAC7BptC,EAAIikB,UAERl6B,GAAKg/C,EAAOp4C,MACRo4C,EAAOK,SACPr/C,GAAKg/C,EAAOrnC,WAGpB1B,EAAIi3B,aACJj3B,EAAItE,WAGZyrC,GAAY/e,OAAQ,EAEpB+e,GAAYjQ,kBAAoB2K,GAChCsF,GAAYtR,wBAA0B,CAClCvyB,KAAMu+B,GAA6Bh/B,KACnCU,MAAOs+B,GAA6Br+B,MACpCR,OAAQ6+B,GAA6B5+B,OACrCk0B,WAAY0K,GAA6BzK,aAE7C+P,GAAYpS,gBAAkB+M,GAC9BqF,GAAYzR,sBAAwB,CAChC2B,IAAKyK,GAA2B7N,IAChC/wB,MAAO4+B,GAA2B7N,IAClC7wB,MAAO0+B,GAA2B1M,OAClCkC,OAAQwK,GAA2B1M,QAGvC+R,GAAY9vC,OAAS,CACjBi2C,WAAY,CACR7jD,KAAM,kBAEV8jD,IAAK,CACD9jD,KAAM,kBAEV+jD,eAAgB,CACZ/jD,KAAM,sBAEV,IAAK,CACDA,KAAM,iBAEVgkD,UAAW,CACPhkD,KAAM,iBAEVikD,aAAc,CACVjkD,KAAM,oBAEV2e,MAAO,CACH3e,KAAM,aAEV,IAAK,CACDA,KAAM,aAEV,IAAK,CACDA,KAAM,sBAEVkkD,UAAW,CACPlkD,KAAM,sBAEV,IAAK,CACDA,KAAM,uBAEVmkD,WAAY,CACRnkD,KAAM,uBAEVokD,YAAa,CACTpkD,KAAM,uBAEVqkD,aAAc,CACVrkD,KAAM,wBAEVskD,cAAe,CACXtkD,KAAM,0BAEVukD,eAAgB,CACZvkD,KAAM,2BAEV,IAAK,CACDA,KAAM,gCAEV2gD,KAAM,CACF3gD,KAAM,gCAEV,IAAK,CACDA,KAAM,mBAEVqB,EAAG,CACCrB,KAAM,mBAGd09C,GAAY8G,YAAclM,GAC1BoF,GAAY+G,gBAAkBlM,GAE9BmF,GAAYU,UAAW,EIrqBhB,MAAMsG,WAAY1rC,EACrBla,cACIoB,QACAzC,KAAKyb,SAAWF,EAASG,SAASY,MAClCtc,KAAKknD,OAAS,EACdlnD,KAAKwc,SAAS,GACdxc,KAAKygC,WAAa,EAEXn/B,sBACP,OAAOG,EAASwlD,IAGpBxiD,eAAeiY,GACX,OAAOA,EAAK28B,mBAAmB4N,GAAI3lD,UAGvCmD,sBAAsBo5B,EAAO3lB,GACzB,IAAK,MAAMwE,KAAQmhB,EACf,GAAI3lB,MAAAA,OAAyC,EAASA,EAAQivC,IAC1D,IAAK,IAAIz/C,EAAI,EAAGA,EAAIgV,EAAKpK,KAAKxN,OAAQ4C,IAAK,CACvC,MAAM0/C,EAAM,IAAIH,GAChBG,EAAIC,aAAa3qC,EAAKlE,MAAMioB,YAC5B/jB,EAAKkqB,YAAYwgB,EAAK1/C,QAGzB,GAAyE5E,OAApEoV,MAAAA,OAAyC,EAASA,EAAQ9G,OAAqB,CACrF,MAAMg2C,EAAM,IAAIH,GAChBG,EAAIC,aAAa3qC,EAAKlE,MAAMioB,YAC5B/jB,EAAKkqB,YAAYwgB,EAAKlvC,MAAAA,OAAyC,EAASA,EAAQ9G,WAE/E,CACD,MAAMg2C,EAAM,IAAIH,GAChBG,EAAIC,aAAa3qC,EAAKlE,MAAMioB,YAC5B/jB,EAAKkqB,YAAYwgB,EAAK,IAKlC3iD,cAAc0zC,EAAM1W,GAChB,MAAM4M,EAAc5M,EAAM4M,YAE1B,IAAK8J,GAAwB,IAAhBA,EAAKrzC,OACd,OAAO,EACX,MAAMwiD,EAAW,GACXC,EAAgB,GACtB,IAAK,IAAI7/C,EAAI,EAAGA,EAAIywC,EAAKrzC,SAAU4C,EAAG,CAClC,MAAM0/C,EAAMjP,EAAKzwC,GACXgV,EAAO0qC,EAAI3qC,UACjB,IAAI2lB,EACAp9B,EACJ,GAAIjD,EAAY2a,GAAO,CACnB,MAAMtL,EAAQg2C,EAAItqC,aAClBslB,EAAQ1lB,EAAK2lB,cAAcjxB,GAE3BpM,EAAQ0X,EAAKq9B,oBAEZ,KAAI53C,EAAUua,GAMf,MAAM,IAAIra,EAAa,WAAY,wBALnC+/B,EAAQ,CAAEl/B,KAAM,IAChB8B,EAAQqpC,EAMZ,MAAMmZ,EAAU9qC,EAAK7K,aAAa,MAClCy1C,EAASzvC,KAAK,CAAE3U,KAAMk/B,EAAMl/B,KAAMwZ,KAAAA,EAAM8qC,QAAAA,EAASJ,IAAAA,IACjDG,EAAcC,GAAWrjD,KAAK4E,IAAIw+C,EAAcC,IAAYxiD,EAAOA,GAGvEsiD,EAAS1kB,MAAK,CAACj/B,EAAGC,IAAMA,EAAEV,KAAOS,EAAET,OACnC,IAAIukD,EAAYpZ,EACZqZ,EAAU,EACVC,EAAY,KACZC,EAAY,KACZC,EAAoB,KACpBC,EAAc,EAClB,IAAK,IAAIpgD,EAAI,EAAGA,EAAI4/C,EAASxiD,SAAU4C,EAAG,CACtC,MAAM,IAAE0/C,EAAG,KAAE1qC,EAAI,QAAE8qC,EAAO,KAAEtkD,GAASokD,EAAS5/C,GAE1CxE,IAASykD,GAAajrC,IAASkrC,IAC/BH,EAAYF,EAAcC,IAEzB9qC,EAAKupB,UAAY/iC,IAASykD,IACA,KAAvBxjD,KAAK6C,IAAI9D,EAAO,GAEhB4kD,EAAc,GAIdA,EAAc,GACG,MAAbF,GAAsBA,EAAU3hB,UAAyB,MAAb0hB,GAAqBA,EAAYzkD,GAAS,GAIjFA,EAAO4kD,IAAgBD,IAE5BC,GAAe,IAJfA,GAAe,KASvBprC,EAAKupB,SACLmhB,EAAI3mB,aAAeqnB,EAGnBV,EAAI3mB,YAAcqnB,EAEtBD,EAAoB3kD,EAAO4kD,EAC3BV,EAAIjtC,UAAUstC,GACdA,GAAaL,EAAI7qC,WArED,EAsEhBmrC,EAAUD,EAAYC,EAAUD,EAAYC,EAC5CC,EAAYzkD,EACZ0kD,EAAYlrC,EAIhB,OADA+kB,EAAM4M,aAAeqZ,GACd,EAEX9qC,QAAQF,GAMJ,OALA1c,KAAK0c,KAAOA,EACR/a,EAAY+a,KACZ1c,KAAKknD,QAAU,GACflnD,KAAKwc,SAAS,IAEXxc,KAEXqnD,aAAax/C,GAET,OADA7H,KAAKygC,WAAa54B,EACX7H,KAEX2U,OACI,MAAMmE,EAAM9Y,KAAK0U,eACXgI,EAAO1c,KAAK2c,oBAClB3c,KAAKgV,cACL,MACMutB,EADQ7lB,EAAK3B,aACKynB,yBAClB4E,EAAQ1qB,EAAK2qB,mBAAmBrnC,KAAKyb,SAAUzb,KAAKoR,MAAO,CAAE22C,gBAAgB,IAE/E5lD,EAAUua,KACV0qB,EAAMv/B,EAAI6U,EAAKmzB,iBAAiBlG,OAEpC,MAAM9mC,EAAIukC,EAAMvkC,EAAI7C,KAAKoX,QAAUpX,KAAKyJ,MAAQzJ,KAAKknD,OAC/Cr/C,EAAIu/B,EAAMv/B,EAAI7H,KAAKqX,QAAUrX,KAAKygC,WAAa8B,EACrDzpB,EAAIQ,YACJR,EAAIg/B,IAAIj1C,EAAGgF,EAAG7H,KAAKknD,OAAQ,EAAa,EAAV/iD,KAAKC,IAAQ,GAC3C0U,EAAIa,QC9IL,MAAMquC,WAAuBzsC,EAChCla,YAAY4mD,GACRxlD,QACAzC,KAAKioD,OAASA,EACdjoD,KAAKyJ,MAAQ,EACbzJ,KAAKyb,SAAWF,EAASG,SAASC,KAClC3b,KAAKoX,QAAU,EACfpX,KAAKqX,QAAU,EACfrX,KAAKkoD,SAAW,EAChBloD,KAAKkpC,SAAW,EAChBlpC,KAAKkW,YAEE5U,sBACP,OAAOG,EAASumD,eAGpBvjD,cAAc0jD,EAAM1mB,GAChB,MAAM,WAAEK,EAAU,YAAEuM,GAAgB5M,EAEpC,IAAK0mB,GAAwB,IAAhBA,EAAKrjD,OACd,OAAO,EACX,MAAMsjD,EAAY,GAClB,IAAIC,EAAY,KACZC,EAAY,EACZC,EAAa,EACjB,IAAK,IAAI7gD,EAAI,EAAGA,EAAIygD,EAAKrjD,SAAU4C,EAAG,CAClC,MAAMye,EAAMgiC,EAAKzgD,GACXgV,EAAOyJ,EAAI1J,UACX+rC,EAAMriC,EAAI/I,cACVhM,EAAQ+U,EAAIrJ,aACZslB,EAAQ1lB,EAAK2lB,cAAcjxB,GAE3Bq3C,EADgBpe,GAAc8C,OAAOhnB,EAAI3Q,UACd42B,UAOjC,GANIjmB,EAAI1K,WAAa/E,EAAiBuF,QAClCwlB,EAAMwM,eAAiBwa,EAAalsB,EAAOuC,oBAAsB,IAEjE3Y,EAAI1K,WAAa/E,EAAiByF,QAClCslB,EAAMjmB,WAAaitC,EAAalsB,EAAOuC,oBAAsB,IAE7DpiB,IAAS2rC,EAAW,CACpB,IAAK,IAAIvkD,EAAI,EAAGA,EAAI4Y,EAAKpK,KAAKxN,SAAUhB,EACjB,IAAfg+B,IACAwmB,EAAYnkD,KAAK4E,IAAI2T,EAAK4lB,yBAA0BgmB,IAEpC,IAAhBja,IACAka,EAAapkD,KAAK4E,IAAI2T,EAAKk8B,0BAA2B2P,IAG9DF,EAAY3rC,EAEhB0rC,EAAUvwC,KAAK,CACX6E,KAAAA,EACAyJ,IAAAA,EACAqiC,IAAAA,EACAtlD,KAAMk/B,EAAMl/B,KACZi/B,OAAQmmB,EACRI,OAAQH,IAIhBH,EAAUxlB,MAAK,CAACj/B,EAAGC,IAAMA,EAAEV,KAAOS,EAAET,OACpC,IAAIylD,EAAY,EACZC,EAAY,EACZC,EAAU,EACVC,EAAU,EACVC,EAAW,KACXC,EAAW,KACf,IAAK,IAAIthD,EAAI,EAAGA,EAAI0gD,EAAUtjD,SAAU4C,EAAG,CACvC,IAAIuhD,EAAY,EAChB,MAAM,KAAEvsC,EAAI,IAAE8rC,EAAG,IAAEriC,EAAG,KAAEjjB,EAAI,OAAEi/B,EAAM,OAAEumB,GAAWN,EAAU1gD,GAEvDxE,IAAS6lD,GAAYrsC,IAASssC,IAC9BL,EAAY7mB,EAAaK,EACzBymB,EAAYva,EAAcqa,GAE9B,MAAMQ,EAAW/iC,EAAI5J,WAzDL,EA0DZisC,IAAQjtC,EAASG,SAASC,MAC1BwK,EAAIhM,UAAU2nB,EAAa6mB,GAC3BM,EAAYnnB,EAAaonB,EACzBL,EAAUI,EAAYJ,EAAUI,EAAYJ,GAEvCL,IAAQjtC,EAASG,SAASY,QAC/B6J,EAAIhM,UAAUyuC,GACdK,EAAYV,EAAaW,EACzBJ,EAAUG,EAAYH,EAAUG,EAAYH,GAEhDC,EAAW7lD,EACX8lD,EAAWtsC,EAIf,OAFA+kB,EAAMK,YAAc+mB,EACpBpnB,EAAM4M,aAAeya,GACd,EAEXrkD,sBAAqB,WAAE0kD,GAAe,GAAIzsC,EAAMw0B,GAC5CiY,MAAAA,GAAwDA,EAAWxhD,MAAM,KAAK4K,KAAK62C,IAC/E,MAAMzhD,EAAQyhD,EAAgB96C,OAAO3G,MAAM,KACrC+0B,EAAS,CAAE2sB,OAAQ1hD,EAAM,IAG/B,OAFIA,EAAM,KACN+0B,EAAOjhB,SAAW9T,EAAM,IACrBupC,EAAQM,aAAa8X,UAAU5sB,MACvCnqB,KAAI,CAACg3C,EAAWn4C,IAAUsL,EAAKkqB,YAAY2iB,EAAWn4C,KAE7Do4C,kBAAkBvB,GAEd,OADAjoD,KAAKioD,OAASA,EACPjoD,KAEXypD,oBACI,OAAOzpD,KAAKioD,OAEhByB,WAAW7mD,GAEP,OADA7C,KAAKkoD,SAAWrlD,EACT7C,KAEX2pD,WAAW9hD,GAEP,OADA7H,KAAKkpC,SAAWrhC,EACT7H,KAEX2U,OACI,MAAMmE,EAAM9Y,KAAK0U,eACXgI,EAAO1c,KAAK2c,oBAClB3c,KAAKgV,cACL,MAAMoyB,EAAQ1qB,EAAK2qB,mBAAmBrnC,KAAKyb,SAAUzb,KAAKoR,OAC1D,IAAIwsC,EAAQxW,EAAMvkC,EAAI7C,KAAKoX,QAAUpX,KAAKkoD,SACtCpK,EAAQ1W,EAAMv/B,EAAI7H,KAAKqX,QAAUrX,KAAKkpC,SAAW,EACrD,OAAQlpC,KAAKyb,UACT,KAAKF,EAASG,SAASO,MACnB2hC,GAAS,EACTE,GAAS,GACT,MACJ,KAAKviC,EAASG,SAASS,MACnByhC,GAAS,EACTE,GAAS,GACT,MACJ,KAAKviC,EAASG,SAASC,KACnBiiC,GAAS59C,KAAKyJ,MACd,MACJ,KAAK8R,EAASG,SAASY,MACnBshC,GAAS,EACT,MACJ,QACI,MAAM,IAAIv7C,EAAa,kBAAmB,gBAAgBrC,KAAKyb,2BAEvE3C,EAAIlF,OACJkF,EAAIxD,QAAQtV,KAAKwV,UACjBsD,EAAIg3B,SAAS,GAAK9vC,KAAKioD,OAAQrK,EAAOE,GACtChlC,EAAItE,WAGZwzC,GAAetyC,UAAY,CACvBhI,OAAQhB,EAAKiB,WACbL,KAAM,EACNC,OAAQjC,EAAW2gC,KACnBz+B,MAAOjC,EAAUqC,QC3Jd,MAAMg8C,WAAiB72C,EAa1B1R,YAAYw8B,EAAO55B,GACfxB,QACAzC,KAAK6pD,SAAShsB,GACd79B,KAAKiE,KAAOA,EACZjE,KAAKmhC,eAAiB,CAClB2oB,IAAK,EACLC,IAAK,GACLC,aAAc,EACdC,cAAe,EACfC,aAAc,EACd7yC,QAAS,EACT8yC,YAAa,GAEjBnqD,KAAKkW,YAEE5U,sBACP,OAAOG,EAASmoD,SAEpBhhB,aAAarkB,GAET,OADAvkB,KAAKukB,UAAYA,EACVvkB,KAOX6pD,SAAShsB,GACL,IAAKA,EAAMusB,aAAevsB,EAAM+pB,UAC5B,MAAM,IAAIvlD,EAAa,eAAgB,yDAQ3C,GANKw7B,EAAMwsB,gBACPxsB,EAAMwsB,cAAgB,CAAC,IAEtBxsB,EAAMysB,eACPzsB,EAAMysB,aAAe,CAAC,IAEtBzsB,EAAMwsB,cAAcvlD,SAAW+4B,EAAMysB,aAAaxlD,OAClD,MAAM,IAAIzC,EAAa,eAAgB,gDAG3C,OADArC,KAAK69B,MAAQA,EACN79B,KAKXuqD,YACI,OAAQvqD,KAAK69B,MAAMusB,aAAepqD,KAAK69B,MAAM+pB,UAEjD4C,UAAU9tB,GACN,GAA+B,IAA3BA,EAAO+tB,SAAS3lD,QAA0C,IAA1B43B,EAAOguB,QAAQ5lD,OAC/C,MAAM,IAAIzC,EAAa,eAAgB,yBAE3C,MAAMyW,EAAM9Y,KAAK0U,eACjB,IAAIo1C,EAAM9pD,KAAKmhC,eAAe2oB,IAC1BC,EAAM/pD,KAAKmhC,eAAe4oB,IAC1B5lD,KAAK6C,IAAI01B,EAAOiuB,UAAYjuB,EAAOkuB,YAAc,KACjDd,EAAM,EACNC,EAAM,GAEV,MAAME,EAAgBjqD,KAAKmhC,eAAe8oB,cACpCC,EAAelqD,KAAKmhC,eAAe+oB,aACnC7yC,EAAUrX,KAAKmhC,eAAe9pB,QAAUqlB,EAAOnY,UAI/C8lC,EAAgBrqD,KAAK69B,MAAMwsB,cAE3BC,EAAetqD,KAAK69B,MAAMysB,aAChC,IAAK,IAAI5iD,EAAI,EAAGA,EAAI2iD,EAAcvlD,SAAU4C,EAAG,CAC3C,MAAM63C,GAAQ7iB,EAAOiuB,UAAYT,GAAgBxtB,EAAOkuB,WAAaX,IAAkB,EACjFY,EAAanuB,EAAO+tB,SAASJ,EAAc3iD,IAAM2P,EACjDyzC,EAAYpuB,EAAOguB,QAAQJ,EAAa5iD,IAAM2P,EACpD,GAAI1S,MAAMkmD,IAAelmD,MAAMmmD,GAC3B,MAAM,IAAIzoD,EAAa,eAAgB,kCAE3C,MAAM0oD,GAAYF,EAAaC,GAAa,EAAIhB,EAAMptB,EAAOnY,UACvDymC,GAAeH,EAAaC,GAAa,EAAIf,EAAMrtB,EAAOnY,UAChEzL,EAAIQ,YACJR,EAAIS,OAAOmjB,EAAOkuB,WAAaX,EAAeY,GAC9C/xC,EAAIW,iBAAiB8lC,EAAMwL,EAAUruB,EAAOiuB,UAAYT,EAAcY,GACtEhyC,EAAIW,iBAAiB8lC,EAAMyL,EAAatuB,EAAOkuB,WAAaX,EAAeY,GAC3E/xC,EAAIi/B,YACJj/B,EAAIa,QAGZimC,WAAWgL,EAAYD,GACnB,IAAI59C,EAAIkF,EAAIyyC,EACZ,IAAK1kD,KAAKiE,KACN,OACJ,MAAM6U,EAAM9Y,KAAK0U,eACjB,IAAIu2C,GAAYL,EAAaD,GAAa,EAC1CM,GAAYnyC,EAAIi2B,YAAY/uC,KAAKiE,MAAMwF,MAAQ,EAC/C,MAAMyQ,EAAqG,QAA5FjI,EAAsC,QAAhClF,EAAK/M,KAAK69B,MAAMusB,kBAA+B,IAAPr9C,OAAgB,EAASA,EAAGgO,oBAAiC,IAAP9I,EAAgBA,EAAqC,QAA/ByyC,EAAK1kD,KAAK69B,MAAM+pB,iBAA8B,IAAPlD,OAAgB,EAASA,EAAG3pC,aACxMb,IACApB,EAAIlF,OACJkF,EAAIxD,QAAQtV,KAAKwV,UACjBsD,EAAIg3B,SAAS9vC,KAAKiE,KAAMgnD,EAAWjrD,KAAKmhC,eAAe6oB,aAAc9vC,EAAMu1B,iBAAmB,GAC9F32B,EAAItE,WAGZG,OACI3U,KAAK0U,eACL1U,KAAKgV,cACL,MAAMo1C,EAAapqD,KAAK69B,MAAMusB,WACxBxC,EAAY5nD,KAAK69B,MAAM+pB,UAE7B,IAAIgD,EAAa,EACbD,EAAY,EACZF,EAAW,CAAC,GACZC,EAAU,CAAC,GACXxiB,EAAiB,EACrB,GAAIkiB,EACAQ,EAAaR,EAAWhQ,eAAiBp6C,KAAKmhC,eAAegpB,YAC7DjiB,EAAiBkiB,EAAW7c,mBAC5Bkd,EAAWL,EAAW9a,aAErB,GAAIsY,EAAW,CAEhBgD,EADchD,EAAU7sC,aACLmwC,eACnBT,EAAW7C,EAAUtY,QACrBtvC,KAAK69B,MAAMwsB,cAAgBrqD,KAAK69B,MAAMysB,aAE1C,GAAI1C,EACA+C,EAAY/C,EAAUtN,cAAgBt6C,KAAKmhC,eAAegpB,YAC1DjiB,EAAiB0f,EAAUra,mBAC3Bmd,EAAU9C,EAAUtY,aAEnB,GAAI8a,EAAY,CAEjBO,EADcP,EAAWrvC,aACPowC,aAClBT,EAAUN,EAAW9a,QACrBtvC,KAAK69B,MAAMysB,aAAetqD,KAAK69B,MAAMwsB,cAazC,OAXIrqD,KAAKukB,YACL2jB,EAAiBloC,KAAKukB,WAE1BvkB,KAAKwqD,UAAU,CACXI,WAAAA,EACAD,UAAAA,EACAF,SAAAA,EACAC,QAAAA,EACAnmC,UAAW2jB,IAEfloC,KAAK4/C,WAAWgL,EAAYD,IACrB,GAIff,GAASl0C,UAAYrV,OAAO0V,OAAO,GAAIhD,EAAQ2C,WClKxC,MAAM01C,WAAexB,GACbtoD,sBACP,OAAOG,EAAS2pD,OAEpB3mD,sBAAsBo5B,GAClB,OAAO,IAAIutB,GAAOvtB,EAAO,KAE7Bp5B,qBAAqBo5B,GACjB,OAAO,IAAIutB,GAAOvtB,EAAO,KAa7Bx8B,YAAYw8B,EAAO55B,GACfxB,MAAMo7B,EAAO55B,GACbjE,KAAKmhC,eAAe2oB,IAAM,EAC1B9pD,KAAKmhC,eAAe4oB,IAAM,GAC1B/pD,KAAKmhC,eAAe9pB,QAAU,EAC9BrX,KAAKukB,WAAa,INzB1B,SAAWw2B,GACPA,EAAUA,EAAkB,OAAI,GAAK,SACrCA,EAAUA,EAAgB,KAAI,GAAK,OACnCA,EAAUA,EAAgB,KAAI,GAAK,OAHvC,CAIGA,KAAcA,GAAY,KAItB,MAAMsQ,WAAct4C,EACvB1R,YAAYiqD,EAAMpzC,GAUd,IAAIqzC,EACJ,GAVA9oD,QACAzC,KAAKwrD,qBAAuB,EAC5BxrD,KAAKyrD,KAAO1Q,GAAU2Q,OACtB1rD,KAAK01C,cAAe,EACpB11C,KAAK2rD,UAAY,IAAItnD,EAAS,EAAG,GACjCrE,KAAK4rD,iBAAmB,EACxB5rD,KAAK8lC,UAAY,GACjB9lC,KAAKkY,QAAU7X,OAAO0V,OAAO,CAAE81C,cAAe,KAAO3zC,GAGjC,iBAATozC,EAAmB,CAE1B,MAAM3nC,EAAQ2nC,EAAK3nC,MAAM,gBACrBA,IACA4nC,EAAY,CACRnrB,UAAWr8B,SAAS4f,EAAM,IAC1B0c,WAAYt8B,SAAS4f,EAAM,WAKnC4nC,EAAYD,EAGhBtrD,KAAKsrD,KAAOjrD,OAAO0V,OAAO,CAAEqqB,UAAW,EAAGC,WAAY,EAAGpwB,WAAYssB,EAAOzW,YAAcylC,GAE1FvrD,KAAK8rD,WAAa,IAAIznD,EAASrE,KAAKsrD,KAAKlrB,WAAapgC,KAAKsrD,KAAKr7C,WAAajQ,KAAKsrD,KAAKjrB,YAAa,GACpGrgC,KAAK+rD,kBAAoB/rD,KAAK8rD,WAAWplD,QAElCpF,sBACP,OAAOG,EAAS4pD,MAQTW,kBACP,OAAOjR,GAGXkR,gBACI,OAAOjsD,KAAK8rD,WAGhBI,eACI,OAAOlsD,KAAK2rD,UAGhBQ,sBACI,OAAOnsD,KAAK4rD,iBAGhBQ,uBACI,OAAOpsD,KAAK+rD,kBAGhBxmB,eACI,OAAOvlC,KAAK8lC,UAGhBumB,UACI,OAAOrsD,KAAKyrD,KAMhBa,QAAQb,GAEJ,OADAzrD,KAAKyrD,KAAOA,EACLzrD,KAGXusD,0BACI,OAAOvsD,KAAKwrD,qBAGhBgB,sBACI,OAAOxsD,KAAKwrD,qBAAuBxrD,KAAKsrD,KAAKr7C,WAGjDgK,SAASC,GAIL,OAHAla,KAAKka,MAAQA,EAEbla,KAAK2I,iBAAc7F,EACZ9C,KAEX8d,WACI,OAAO9d,KAAKka,MAGhB/E,iBACI,IAAKnV,KAAK2I,YAAa,CACnB,MAAMuR,EAAQla,KAAK+a,aACnB,IAAIpS,EACJ,IAAK,IAAIjB,EAAI,EAAGA,EAAI1H,KAAK8lC,UAAUhhC,SAAU4C,EAAG,CAC5C,MAAM+kD,EAAWzsD,KAAK8lC,UAAUp+B,GAChC+kD,EAASxyC,SAASC,GAClB,MAAMkJ,EAAKqpC,EAASt3C,iBAChBiO,IACAza,EAAcA,EAAcA,EAAYD,UAAU0a,GAAMA,GAGhEpjB,KAAK2I,YAAcA,EAEvB,OAAO3I,KAAK2I,YAGhB+jD,UAAUC,GAEN,OADA3sD,KAAKyrD,KAAOkB,EAAS5R,GAAU2Q,OAAS3Q,GAAU6R,KAC3C5sD,KAGX6sD,aACI,OAAI7sD,KAAKyrD,OAAS1Q,GAAU2Q,QAAU1rD,KAAKyrD,OAAS1Q,GAAU+R,MACnD9sD,KAAK2rD,UAAU1lD,OAAOjG,KAAK8rD,YAa1CiB,iBAAiBC,GAEb,OADAhtD,KAAKkY,QAAQ2zC,cAAgBmB,EACtBhtD,KAMXitD,0BACI,MAAMnB,EAAa9rD,KAAK2rD,UAAUzmD,QAGlC,OADAlF,KAAKktD,aAAeltD,KAAK8lC,UAAUvzB,KADtBk6C,GAAatoD,KAAK6G,IAAIhL,KAAKkY,QAAQ2zC,cAAeY,EAAS/mB,WAAWxgC,QAAU4mD,KACjDvc,QAAO,CAAC5rC,EAAGC,IAAMD,EAAIC,GAAG,GAC7D5D,KAAKktD,aAGhBC,QAAQC,GACCptD,KAAKktD,eACNltD,KAAKktD,aAAeltD,KAAKitD,2BAE7B,MAAMnB,EAAa9rD,KAAK2rD,UAAUzmD,QAGlC,MAFY,CAACmoD,GAAMlpD,KAAK6G,IAAIhL,KAAKkY,QAAQ2zC,cAAewB,EAAIvB,GACjDwB,CAAIF,GAAaptD,KAAKktD,aAIrCK,YAAYd,GACR,IAAKA,EAASjnB,oBAAqB,CAC/B,MAAMrH,EAAQsuB,EAAS/mB,WAIvB,GAFA1lC,KAAK2rD,UAAUpmD,IAAI44B,GACnBn+B,KAAKktD,aAAe,GACfltD,KAAKyrD,OAAS1Q,GAAU2Q,QAAU1rD,KAAKyrD,OAAS1Q,GAAU+R,OAC3D9sD,KAAK2rD,UAAUrlD,YAAYtG,KAAK8rD,YAEhC,MADA9rD,KAAK2rD,UAAU7lD,SAASq4B,GAClB,IAAI97B,EAAa,cAAe,mBAGtC87B,EAAM33B,SAASxG,KAAK+rD,qBACpB/rD,KAAK+rD,kBAAoB5tB,EAAMz3B,SAEnC1G,KAAKwrD,qBAAuBxrD,KAAK2rD,UAAUpnD,YAE3CvE,KAAK8rD,WAAWvmD,IAAI,EAAGvF,KAAK2rD,UAAUpnD,aAK1C,OAFAvE,KAAK8lC,UAAUjuB,KAAK40C,GACpBA,EAASjY,SAASx0C,MACXA,KAGXwtD,aAAa1nB,GACT,IAAK,IAAIp+B,EAAI,EAAGA,EAAIo+B,EAAUhhC,SAAU4C,EACpC1H,KAAKutD,YAAYznB,EAAUp+B,IAE/B,OAAO1H,KAGXy1C,YACI,GAAIz1C,KAAK01C,aACL,OAAO11C,KACX,MAAMka,EAAQla,KAAK+a,aAOnB,OANA/a,KAAK8lC,UAAU5nB,SAASuuC,IACfA,EAAS3uC,YACV2uC,EAASxyC,SAASC,MAG1Bla,KAAK01C,cAAe,EACb11C,KAEX+a,aACI,OAAOnY,EAAQ5C,KAAKka,MAAO,UAAW,kCAU1CvF,KAAKhB,EAAU3T,KAAK0U,eAAgBwF,GAGhC,IAAIvR,EAFJuR,EAAQA,MAAAA,EAAqCA,EAAQla,KAAKka,MAC1Dla,KAAKgV,cAEL,IAAK,IAAItN,EAAI,EAAGA,EAAI1H,KAAK8lC,UAAUhhC,SAAU4C,EAAG,CAC5C,MAAM+kD,EAAWzsD,KAAK8lC,UAAUp+B,GAE5BwS,GACAuyC,EAASxyC,SAASC,GAEtBtX,EAAQ6pD,EAAS3uC,WAAY,eAAgB,mDAC7C,MAAMsF,EAAKqpC,EAASt3C,iBAChBiO,IACAza,EAAcA,EAAcA,EAAYD,UAAU0a,GAAMA,GAE5DqpC,EAASp3C,WAAW1B,GACpB84C,EAASh4C,gBAEbzU,KAAK2I,YAAcA,GO/NpB,MAAMk+B,WAAuBtrB,EAEhCla,YAAYosD,EAAaC,GAkBrB,OAjBAjrD,QACAzC,KAAK01C,cAAe,EACpB11C,KAAKyb,SAAWF,EAASG,SAASC,KAClC3b,KAAKytD,YAAcA,EACnBztD,KAAKyJ,MAAQ,EACbzJ,KAAK0tD,UAAYA,EACjB1tD,KAAK2tD,UAAO7qD,EACZ9C,KAAKqlC,MAAQ,IAAIgmB,GAAM,CACnBjrB,UAAW,EACXC,WAAY,EACZpwB,WAAYssB,EAAOzW,aACpB4mC,WAAU,GACb1sD,KAAKmhC,eAAiB,CAClBysB,aAAc,GAElB5tD,KAAK6tD,MAAQ,GACb7tD,KAAKqlC,MAAMmoB,aAAaxtD,KAAKytD,aACtBztD,KAEAsB,sBACP,OAAOG,EAASolC,eAGpBpiC,cAAcqpD,EAAkBrsB,GAG5B,IAAKqsB,GAAgD,IAA5BA,EAAiBhpD,OACtC,OAAO,EACX,MAAMipD,EAAa,GACnB,IAAI1F,EAAY,KACZlmB,EAAS,EACb,IAAK,IAAIz6B,EAAI,EAAGA,EAAIomD,EAAiBhpD,SAAU4C,EAAG,CAC9C,MAAMsmD,EAAkBF,EAAiBpmD,GACnCgV,EAAOsxC,EAAgBvxC,UACvBwxC,EAAelsD,EAAY2a,GAC3ByyB,EAAU8e,EAXQ,EACF,EAWtB,GAAIA,GAAgBvxC,IAAS2rC,EAAW,CAEpC,IAAK,IAAIvkD,EAAI,EAAGA,EAAI4Y,EAAKpK,KAAKxN,SAAUhB,EACpCq+B,EAASh+B,KAAK4E,IAAI2T,EAAK4lB,yBAA0BH,GAErDkmB,EAAY3rC,EAEhBqxC,EAAWl2C,KAAK,CAAE7S,MAAOm9B,EAAQ6rB,gBAAAA,EAAiB7e,QAAAA,IAGtD,IACI+e,EADAC,EAAcJ,EAAW,GAAG/oD,MAEhC,IAAK,IAAI0C,EAAI,EAAGA,EAAIqmD,EAAWjpD,SAAU4C,EAAG,CACxC,MAAMsmD,EAAkBD,EAAWrmD,GAAGsmD,gBACtCA,EAAgBvY,YAChByY,EAAcF,EAAgBzxC,WAAawxC,EAAWrmD,GAAGynC,QACzDgf,EAAchqD,KAAK4E,IAAImlD,EAAaC,GAExC,IAAK,IAAIzmD,EAAI,EAAGA,EAAIqmD,EAAWjpD,SAAU4C,EAAG,CACxC,MAAMsmD,EAAkBD,EAAWrmD,GAAGsmD,gBACtCE,EAAcF,EAAgBzxC,WAAawxC,EAAWrmD,GAAGynC,QACzD6e,EAAgBzwC,2BAA2B4wC,EAAchqD,KAAKqlC,IAAI0kB,EAAaC,IAGnF,OADA1sB,EAAMK,YAAcqsB,GACb,EAEX1Y,YACQz1C,KAAK01C,eAEJ11C,KAAKurC,YACNvrC,KAAKurC,UAAY,IAAI6iB,IAEzBpuD,KAAKurC,UAAU8iB,WAAW,CAACruD,KAAKqlC,QAAQipB,OAAO,CAACtuD,KAAKqlC,OAAQ,EAAG,IAChErlC,KAAKwc,SAASxc,KAAKurC,UAAUgjB,oBAC7BvuD,KAAK01C,cAAe,GAExB8Y,UAAUf,GAEN,IADAA,EAAcA,GAAeztD,KAAKytD,aAClB3oD,OAAS,EAAG,CACxB,MAAMy0C,EAAO,IAAIkV,GAAKhB,GACtBlU,EAAKpY,eAAeutB,WAAa,EACjCnV,EAAKpY,eAAewtB,oBAAsB,EAC1C3uD,KAAK6tD,MAAMh2C,KAAK0hC,GAEpB,OAAOv5C,KAEXwc,SAAS/S,GAEL,OADAzJ,KAAKyJ,MAAQA,EACNzJ,KAEXuc,WACI,OAAOvc,KAAKyJ,MAEhBq9B,gBACI,OAAO9mC,KAAKytD,YAEhB94C,OACI,MAAMmE,EAAM9Y,KAAK0U,eACXgI,EAAO1c,KAAK2c,oBAQlB,GAPA3c,KAAKgV,cAvGb,YAAc/R,GACN4jC,GAAe3F,OACfn+B,EAAI,0BAA2BE,GAsG/B,CAAE,gCAAiCyZ,GACnC1c,KAAK0d,sBAAsB1d,KAAK8mC,gBAAiBpqB,GAEjD1c,KAAKytD,YAAYvvC,SAAS0wC,GAAcA,EAAUv5C,WAAWyD,GAAKnE,SAElE3U,KAAK6tD,MAAM3vC,SAASq7B,GAASA,EAAKlkC,WAAWyD,GAAKnE,SAC9C3U,KAAK0tD,UAAW,CAEhB,MAAMO,EAAelsD,EAAY2a,GAC3BmyC,EAAWZ,EAAerE,GAAWwB,GAC3CprD,KAAK2tD,KAAO,IAAIkB,EAAS,CACrBjH,UAAW5nD,KAAKytD,YAAY,GAC5BrD,WAAY1tC,EACZ2tC,cAAe,CAAC,GAChBC,aAAc,CAAC,KAEnBtqD,KAAK2tD,KAAKxsB,eAAe4oB,IAAM,GAC/B/pD,KAAK2tD,KAAKxsB,eAAe9pB,SAAW42C,EAAe,EAAI,GAAKjuD,KAAKmhC,eAAeysB,aAChF5tD,KAAK2tD,KAAKt4C,WAAWyD,GAAKnE,SAItCkyB,GAAe3F,OAAQ,EClIhB,MAAM4tB,WAAqBvzC,EAC9Bla,YAAYsc,GACRlb,QACAzC,KAAK01C,cAAe,EACpB11C,KAAKyb,SAAWF,EAASG,SAASC,KAClC3b,KAAK2d,SAAWA,EAChB3d,KAAK2d,SAASO,SAASC,IACnBA,EAAQ41B,gBAAe,MAE3B/zC,KAAKyJ,MAAQ,EACbzJ,KAAKurC,UAAY,IAAI6iB,GACrBpuD,KAAKqlC,MAAQ,IAAIgmB,GAAM,CACnBjrB,UAAW,EACXC,WAAY,EACZpwB,WAAYssB,EAAOzW,aACpB4mC,WAAU,GACb1sD,KAAKqlC,MAAMmoB,aAAaxtD,KAAK2d,UAEtBrc,sBACP,OAAOG,EAASqtD,aAGpBrqD,cAAcsqD,EAAQttB,GAClB,IAAKstB,GAA4B,IAAlBA,EAAOjqD,OAClB,OAAO,EACX,IAAI2E,EAAQ,EACZ,IAAK,IAAI/B,EAAI,EAAGA,EAAIqnD,EAAOjqD,SAAU4C,EAAG,CACpC,MAAMsnD,EAAQD,EAAOrnD,GACrBsnD,EAAMvZ,YACNhsC,GAASulD,EAAMzyC,WAGnB,OADAklB,EAAMK,YAAcr4B,GACb,EAEXgsC,YACQz1C,KAAK01C,eAET11C,KAAKurC,UAAU8iB,WAAW,CAACruD,KAAKqlC,QAAQipB,OAAO,CAACtuD,KAAKqlC,OAAQ,GAC7DrlC,KAAKwc,SAASxc,KAAKurC,UAAUgjB,oBAC7BvuD,KAAK01C,cAAe,GAExBl5B,SAAS/S,GAEL,OADAzJ,KAAKyJ,MAAQA,EACNzJ,KAEXuc,WACI,OAAOvc,KAAKyJ,MAEhBkL,OACI,MAAMmE,EAAM9Y,KAAK0U,eACXgI,EAAO1c,KAAK2c,oBAClB3c,KAAKgV,cACLhV,KAAK0d,sBAAsB1d,KAAK2d,SAAUjB,GAC1C1c,KAAK2d,SAASO,SAASC,GAAYA,EAAQ9I,WAAWyD,GAAKrE,mBCxD5D,MAAMw6C,GACT5tD,YAAY6W,GACRlY,KAAK01C,cAAe,EACpB11C,KAAK41C,eAAgB,EACrB51C,KAAKkvD,OAASh3C,GAAWA,EAAQg3C,OAASh3C,EAAQg3C,OAAS,EAC3DlvD,KAAKmvD,YAAc,IAAI9qD,EAAS,EAAG,GACnCrE,KAAKovD,SAAW,IAAI/qD,EAAS,EAAG,GAChCrE,KAAKqvD,iBAAcvsD,EACnB9C,KAAKsvD,cAAWxsD,EAChB9C,KAAKuvD,iBAAczsD,EACnB9C,KAAKkyC,QAAU,EACflyC,KAAK6C,EAAI,EACT7C,KAAKwvD,MAAQ,EACbxvD,KAAKyvD,QAAU,EACfzvD,KAAK8lC,UAAY,GACjB9lC,KAAK0vD,iBAAmB,GAExB1vD,KAAKu3C,OAAS,EACdv3C,KAAKk6C,QAAU,EACfl6C,KAAK82C,oBAAsB,EAC3B92C,KAAK+2C,qBAAuB,EAC5B/2C,KAAKge,UAAY,EACjBhe,KAAKie,WAAa,EAClBje,KAAK2vD,YAAc,EACnB3vD,KAAK4vD,aAAe,EACpB5vD,KAAK6vD,UAAY,GACjB7vD,KAAKyJ,MAAQ,EACbzJ,KAAKwzC,iBAAmB,CAIpBC,QAAS,CAAEr3B,KAAM,EAAGC,MAAO,IAGnC5X,sBAAsBqrD,GAClB,MAAMC,EAAWD,EAASD,UACpBz+C,EAAQ2+C,EAASvpB,QAAQspB,GAC/B,GAAI1+C,EAAQ,EAAI2+C,EAASjrD,OACrB,OAAOirD,EAAS3+C,EAAQ,GAEhC4+C,YACI,OAAOhwD,KAAKkvD,OAEhBjnD,OACI,OAAOjI,KAAK6C,EAEhBwF,KAAKxF,GAID,OAHA7C,KAAK6C,EAAIA,EACT7C,KAAKwvD,MAAQ3sD,EACb7C,KAAKyvD,QAAU,EACRzvD,KAEXiwD,WACI,OAAOjwD,KAAKwvD,MAEhBU,SAASV,GACLxvD,KAAKwvD,MAAQA,EACbxvD,KAAK6C,EAAI2sD,EAAQxvD,KAAKyvD,QAE1BU,aACI,OAAOnwD,KAAKyvD,QAEhBpxC,WAAWoxC,GACPzvD,KAAKyvD,QAAUA,EACfzvD,KAAK6C,EAAI7C,KAAKwvD,MAAQC,EAE1BlzC,WACI,OAAOvc,KAAKyJ,MAAuB,EAAfzJ,KAAKkyC,QAE7BkJ,WAAWlJ,GAEP,OADAlyC,KAAKkyC,QAAUA,EACRlyC,KAEXowD,cACI,OAAOpwD,KAAKovD,SAEhBiB,cACI,OAAOrwD,KAAKsvD,SAEhBgB,iBACI,OAAOtwD,KAAKqvD,YAEhBkB,iBACI,OAAOvwD,KAAKuvD,YAEhBhqB,eACI,OAAOvlC,KAAK8lC,UAOhB0qB,oBAAoBC,GAChB,OAAOzwD,KAAK0vD,iBAAiBe,GAEjCC,sBACI,OAAO1wD,KAAK0vD,iBAEhBiB,4BACI,OAAO3wD,KAAK8lC,UAAU8qB,QAAQnE,GAAaA,EAAStY,oBAGxDrkC,aACI,MAAM,MAAErG,EAAK,QAAEywC,EAAO,OAAE3C,EAAM,oBAAET,EAAmB,qBAAEC,EAAoB,UAAE/4B,EAAS,WAAEC,EAAU,YAAE0xC,EAAW,aAAEC,GAAkB5vD,KACjI,MAAO,CACHyJ,MAAAA,EACAywC,QAAAA,EACA3C,OAAAA,EACAT,oBAAAA,EACAC,qBAAAA,EACA/4B,UAAAA,EACAC,WAAAA,EACA0xC,YAAAA,EACAC,aAAAA,GAGRiB,iBACI,OAAO7wD,KAAKmvD,YAEhB2B,eAAeC,GACX/wD,KAAKmvD,YAAc4B,EACnB/wD,KAAK01C,cAAe,EAExB6X,YAAYd,EAAUgE,GAClB,IAAKhE,EACD,MAAM,IAAIpqD,EAAa,cAAe,2BAE1C,IAAKoqD,EAASjnB,oBAAqB,CAC/B,MAAMrH,EAAQsuB,EAAS/mB,WACnBvH,EAAM73B,YAAYtG,KAAKovD,YACvBpvD,KAAKovD,SAAWjxB,EAAMz3B,QACtB1G,KAAKqvD,YAAc5C,IAEF,MAAjBzsD,KAAKsvD,UAIAnxB,EAAM33B,SAASxG,KAAKsvD,aAHzBtvD,KAAKsvD,SAAWnxB,EAAMz3B,QACtB1G,KAAKuvD,YAAc9C,GAW3B,OAJAA,EAASlX,eAAev1C,MACxBA,KAAK8lC,UAAUjuB,KAAK40C,GACpBzsD,KAAK0vD,iBAAiBe,GAAc,GAAKhE,EACzCzsD,KAAK01C,cAAe,EACb11C,KAEXy1C,YACI,GAAIz1C,KAAK01C,aACL,OAAO11C,KACX,IAAK,IAAI0H,EAAI,EAAGA,EAAI1H,KAAK8lC,UAAUhhC,SAAU4C,EAAG,CAC5C,MAAM+kD,EAAWzsD,KAAK8lC,UAAUp+B,GAChC+kD,EAAShX,YACT,MAAMhmC,EAAUg9C,EAAS38C,aAEzB9P,KAAK82C,oBAAsB3yC,KAAK4E,IAAI/I,KAAK82C,oBAAqBrnC,EAAQqnC,qBACtE92C,KAAK+2C,qBAAuB5yC,KAAK4E,IAAI/I,KAAK+2C,qBAAsBtnC,EAAQsnC,sBAExE/2C,KAAKu3C,OAASpzC,KAAK4E,IAAI/I,KAAKu3C,OAAQ9nC,EAAQ8nC,QAE5Cv3C,KAAKk6C,QAAU/1C,KAAK4E,IAAI/I,KAAKk6C,QAASzqC,EAAQwqC,YAAc,GAE5Dj6C,KAAKge,UAAY7Z,KAAK4E,IAAI/I,KAAKge,UAAWvO,EAAQuO,WAClDhe,KAAKie,WAAa9Z,KAAK4E,IAAI/I,KAAKie,WAAYxO,EAAQwO,YAEpDje,KAAK2vD,YAAcxrD,KAAK4E,IAAI/I,KAAK2vD,YAAalgD,EAAQuO,UAAYvO,EAAQqnC,qBAC1E92C,KAAK4vD,aAAezrD,KAAK4E,IAAI/I,KAAK4vD,aAAcngD,EAAQwO,WAAaxO,EAAQsnC,sBAE7E/2C,KAAKyJ,MAAQzJ,KAAKu3C,OAASv3C,KAAK2vD,YAAc3vD,KAAK4vD,aAEvD,OAAO5vD,KAEX21C,aACI,OAAI31C,KAAK41C,gBAET51C,KAAK41C,eAAgB,GADV51C,KAIfi0C,sBACI,OAAOj0C,KAAKwzC,kBCzKb,MAAMwd,WAAiBz1C,EAK1Bla,YAAY4P,GACRxO,QACAzC,KAAKiR,KAAOA,EACZjR,KAAKixD,SAAU,EACfjxD,KAAKmhC,eAAiB,CAClBC,WAAY,GACZ8vB,uBAAwB,EACxBC,uBAAwB,GAE5BnxD,KAAKoxD,SAAW70B,EAAO80B,cAAcrxD,KAAKiR,MAI1C,MAAMxB,EAAUzP,KAAK8P,aAQrB,GANA9P,KAAKsxD,wBAAyB,EAG9BtxD,KAAKuxD,cAAgB9hD,GAAWA,EAAQ8hD,cAAgB9hD,EAAQ8hD,cAAgB,EAChFvxD,KAAKwxD,cAAgB/hD,GAAWA,EAAQ+hD,cAAgB/hD,EAAQ+hD,cAAgB,EAChFxxD,KAAKyxD,0BAA4BT,GAASS,0BAA0BjrB,QAAQxmC,KAAKiR,OAAS,GACrFjR,KAAKoxD,SACN,MAAM,IAAI/uD,EAAa,gBAAiB,wBAAwBrC,KAAKiR,SAEzEjR,KAAKoX,QAAU3H,EAAUA,EAAQggD,QAAU,EAC3CzvD,KAAKqX,QAAU5H,EAAUA,EAAQwxC,QAAU,EAC3CjhD,KAAKwY,MAAQ,IAAI1B,EAAM9W,KAAKoxD,SAAS7uD,KAAMvC,KAAKmhC,eAAeC,WAAY,CACvElgC,SAAU,YAAYlB,KAAKoxD,SAAS7uD,SAGpCyuD,GAASU,uBAAuBlrB,QAAQxmC,KAAKiR,OAAS,IACtDjR,KAAKixD,SAAU,GAIdxhD,GACDzP,KAAKwY,MAAMmC,UAAU,GAAK,GAIvBrZ,sBACP,OAAOG,EAASuvD,SAGpBvsD,cAAcq2B,EAAW2G,GACrB,IAAK3G,GAAkC,IAArBA,EAAUh2B,OACxB,OAAO,EACX,IAAI2E,EAAQ,EACR4kC,EAAc5M,EAAM4M,YACpBvM,EAAaL,EAAMK,WACnBmf,EAAU,EACd,IAAK,IAAIv5C,EAAI,EAAGA,EAAIozB,EAAUh2B,SAAU4C,EAAG,CACvC,MAAM0pD,EAAWt2B,EAAUpzB,GACrBopC,EAAY,EAiBlB,GAhBIkgB,GAASW,gBAAgBnrB,QAAQ4qB,EAASngD,OAAS,IACnDmgD,EAASh6C,SAAWi3B,EAAc,GAElC2iB,GAASY,eAAeprB,QAAQ4qB,EAASngD,OAAS,IAClDmgD,EAASh6C,SAAW0qB,EAAa,GAEjCsvB,EAASG,eAAiBH,EAASh6C,QAAU,EAC7C0qB,GAAcsvB,EAASG,cAElBH,EAASG,eAAiBH,EAASh6C,QAAU,EAClDi3B,GAAe+iB,EAASG,cAGxB9nD,EAAQtF,KAAK4E,IAAIqoD,EAAS70C,WAAY9S,GAGtCunD,GAASa,qBAAqBrrB,QAAQ4qB,EAASngD,OAAS,EAAG,CAGtCrO,EAAQwuD,EAAS10C,KAAM,kBAC3BqxB,iBAAmB,GAAKqjB,EAASh0C,gBAAkB7B,EAASG,SAASO,OAClFwlB,EAAMwM,eAAiB6C,EACvBsgB,EAAS/5C,SAAW4pC,EACpBA,GAAWmQ,EAAS54C,MAAMxB,KAAK5O,SAG/Bq5B,EAAMjmB,WAAas1B,EACnBsgB,EAAS/5C,SAAW4pC,EACpBA,GAAWmQ,EAAS54C,MAAMxB,KAAK5O,aAI/BgpD,EAASh0C,gBAAkB7B,EAASG,SAASO,OAC7Cm1C,EAAS9zC,YAAYmkB,EAAMwM,eAC3BxM,EAAMwM,eAAiB6C,IAGvBsgB,EAAS9zC,YAAYmkB,EAAMjmB,WAC3BimB,EAAMjmB,WAAas1B,GAQ/B,OAFArP,EAAMK,WAAaA,EAAar4B,EAAQ,EACxCg4B,EAAM4M,YAAcA,EAAc5kC,EAAQ,GACnC,EAMAioD,oCACP,MAAO,CAAC,OAAQ,WAAY,SAMrBE,4BACP,MAAO,CAAC,SAMDH,uCACP,MAAO,CAAC,OAAQ,OAAQ,WAAY,WAAY,OAAQ,gBAAiB,cAAe,SAMjFE,6BACP,MAAO,CAAC,OAAQ,OAAQ,WAAY,WAAY,WAAY,QAAS,QAG9DE,kCACP,MAAO,CAAC,OAAQ,gBAAiB,eAOrC/hD,aACI,OAAOysB,EAAOoF,mBAAmB7xB,aAAaK,OAAO2hD,cAAc9xD,KAAKoxD,SAAS7uD,MAGrFwvD,WAAWd,GAEP,OADAjxD,KAAKixD,QAAUA,EACRjxD,KAGXgyD,mBAAmBC,GACf,MAAM96C,EAAQnX,KAAKmhC,eAAeC,WAAa,IAG/C,OAFAphC,KAAKkyD,gBAAkB,IAAIp7C,EAAMylB,EAAOgF,gBAAgB0wB,GAAO1vD,KAAM4U,GACrEnX,KAAKkyD,gBAAgBv3C,UAAU,GAAK,GAC7B3a,KAGXmyD,mBAAmBF,GACf,MAAM96C,EAAQnX,KAAKmhC,eAAeC,WAAa,IAG/C,OAFAphC,KAAKoyD,gBAAkB,IAAIt7C,EAAMylB,EAAOgF,gBAAgB0wB,GAAO1vD,KAAM4U,GACrEnX,KAAKoyD,gBAAgBz3C,UAAU,GAAK,GAC7B3a,KAGX2U,OACI,MAAMmE,EAAM9Y,KAAK0U,eACXgI,EAAO1c,KAAK2c,oBAClB3c,KAAKgV,cACL,MAAMq9C,EAAU31C,EAAK6wB,mBACfrzB,EAAQwC,EAAK3B,aACb6zB,EAAcvuC,OAAOiS,KAAKtS,KAAK6R,aAAa,YAAYxO,KAAK,KACnEyV,EAAI+1B,UAAUD,EAAa5uC,KAAK6R,aAAa,OAE7C,MAAMygD,EAAc51C,EAAK2yB,YAAYlG,aACrC,IAAIthC,EAAIwqD,IAAY7qB,EAAKgB,KAAO8pB,EAAY3oB,MAAQ2oB,EAAY5oB,KAE5DvnC,EAAUua,KACNA,EAAK4wB,UACD+kB,IAAY7qB,EAAKgB,OACjB3gC,EAAIqS,EAAMu1B,eAAezvC,KAAKwb,YAKlC3T,EAAIqS,EAAMu1B,eAAezvC,KAAKwb,YAGtC,MAAM+2C,EAAyBF,IAAY7qB,EAAKgB,KAC1C2G,EAAUj1B,EAAMsoB,yBACtB,IAAIgwB,EAAc,GAEbD,GAA0B71C,EAAK+8B,YAChC+Y,GAAe,IAEnB,MACMC,EAAqB5qD,EADNsnC,GAAWnvC,KAAKwb,UAAYg3C,GAG3CprB,EAAQ1qB,EAAK2qB,mBAAmBrnC,KAAKyb,SAAUzb,KAAKoR,OAC1D,IAAIshD,EAAStrB,EAAMvkC,EAGf8vD,EAAS3yD,KAAKyxD,0BACZrqB,EAAMv/B,EACN1D,KAAKqlC,IAAItvB,EAAMu1B,eAAezvC,KAAKwb,WAAYi3C,GAGrD,GAFAE,GAAU3yD,KAAKqX,QAEXrX,KAAKixD,QAAS,CACd,IAAI2B,EAAc,EAClB,MAAMC,EAASH,GAAUx4C,EAAMjS,OAAS,IACxC,QAAyBnF,IAArB9C,KAAK4yD,YACLA,EAAc5yD,KAAK4yD,gBAElB,CACDA,GAAe5yD,KAAKwY,MAAM1I,aAAarG,MAAQ,EAC/C,MAAMqpD,EAAc7D,GAAY8D,eAAer2C,EAAKmB,kBAEhD+0C,GADAE,EAC+C,IAA/BA,EAAY7qD,OAAS4qD,GAGuB,IAA5C34C,EAAMjS,OAASiS,EAAMqC,WAAas2C,GAEtD7yD,KAAK4yD,YAAcA,EAEvBF,GAAUE,GA7OtB,YAAc3vD,GACN+tD,GAAS9vB,OACTn+B,EAAI,oBAAqBE,GA6OzB,CAAE,uBAAwBjD,KAAKoxD,SAAUsB,EAAQC,GAC7C3yD,KAAKoyD,kBACLpyD,KAAKoyD,gBAAgBx3C,OAAO9B,EAAK45C,EAAQC,GACzCA,GAAU3yD,KAAKoyD,gBAAgBtiD,aAAapG,OAC5CipD,GAAU3yD,KAAKmhC,eAAe+vB,wBAE9BlxD,KAAKwxD,eAAiB90C,EAAK4wB,WAAyC,IAA5B5wB,EAAK6wB,qBAC7ColB,GAAU3yD,KAAKwxD,eAEf90C,EAAKqxB,gBAAkB,GAAKijB,GAASU,uBAAuBlrB,QAAQxmC,KAAKiR,OAAS,IAClF0hD,EAASj2C,EAAK3B,aAAa5F,iBAAiBjN,OAAS,IAEzDlI,KAAKwY,MAAMoC,OAAO9B,EAAK45C,EAAS1yD,KAAKoX,QAASu7C,GAC1C3yD,KAAKkyD,kBACLS,GAAU3yD,KAAKwY,MAAM1I,aAAapG,OAAS1J,KAAKmhC,eAAegwB,uBAC/DnxD,KAAKkyD,gBAAgBt3C,OAAO9B,EAAK45C,EAAQC,IAE7C75C,EAAIi3B,cAIZihB,GAAS9vB,OAAQ,ECvQV,MAAM8xB,WAAoBz3C,EAM7Bla,YAAYoa,GACRhZ,QACAzC,KAAKyb,SAAWA,MAAAA,EAA2CA,EAAWF,EAASG,SAASC,KACxF3b,KAAK6W,MAAQ0lB,EAAOoF,mBAAmBvxB,aAAa,6BACpDpQ,KAAKwc,SAAS+f,EAAOoF,mBAAmBvxB,aAAa,8BAE9C9O,sBACP,OAAOG,EAASuxD,YAGpBvuD,sBAAsBo5B,GAClB,IAAK,MAAMnhB,KAAQmhB,EACf,IAAK,IAAIn2B,EAAI,EAAGA,EAAIgV,EAAKpK,KAAKxN,OAAQ4C,IAClCgV,EAAKkqB,YAAY,IAAIosB,GAAYt8C,EAAiBiF,MAAOjU,GACzDgV,EAAKkqB,YAAY,IAAIosB,GAAYt8C,EAAiB4F,OAAQ5U,GAKtEjD,cAAcwuD,EAAaxxB,GACvB,IAAKwxB,GAAsC,IAAvBA,EAAYnuD,OAC5B,OAAO,EACX,IAAIouD,EAAW,EACXC,EAAW,EACf,IAAK,IAAIzrD,EAAI,EAAGA,EAAIurD,EAAYnuD,SAAU4C,EAAG,CACzC,MAAM0rD,EAAcH,EAAYvrD,GAC1BgV,EAAO02C,EAAY32C,UACnB+rC,EAAM4K,EAAYh2C,cAClBhM,EAAQgiD,EAAYt2C,aAC1B,IAAI9X,EAAQ,EACRwjD,IAAQ9xC,EAAiB4F,QACzBtX,EAAQ0X,EAAKm9B,sBAAsBzoC,GACnC+hD,EAAWA,EAAWnuD,EAAQouD,EAAY3pD,MAAQ0pD,EAAWnuD,EAAQouD,EAAY3pD,OAEjF++C,IAAQ9xC,EAAiBiF,OACzB3W,EAAQ0X,EAAKo9B,qBAAqB1oC,GAClC8hD,EAAWA,EAAWluD,EAAQouD,EAAY3pD,MAAQypD,EAAWluD,EAAQouD,EAAY3pD,OAErF2pD,EAAYj5C,UAAUnV,GAI1B,OAFAy8B,EAAMK,YAAcoxB,EACpBzxB,EAAM4M,aAAe8kB,GACd,EAGXv2C,QAAQF,GAQJ,OAPA1c,KAAK0c,KAAOA,EACZ1c,KAAK6W,MAAQ0lB,EAAOoF,mBAAmBvxB,aAAa,6BACpDpQ,KAAKwc,SAAS+f,EAAOoF,mBAAmBvxB,aAAa,8BACjDzO,EAAY+a,KACZ1c,KAAK6W,MAAQ0lB,EAAOoF,mBAAmBvxB,aAAa,+BACpDpQ,KAAKwc,SAAS+f,EAAOoF,mBAAmBvxB,aAAa,iCAElDpQ,KAGX2U,OACI,MAAMmE,EAAM9Y,KAAK0U,eACXgI,EAAO1c,KAAK2c,oBAClB3c,KAAKgV,cACL,MAAMoyB,EAAQ1qB,EAAK2qB,mBAAmBrnC,KAAKyb,SAAUzb,KAAKoR,MAAO,CAAE22C,gBAAgB,IAC7EllD,EAAIukC,EAAMvkC,EAAI7C,KAAKoX,QACnBvP,EAAIu/B,EAAMv/B,EAAI7H,KAAKqX,QACrBrX,KAAKyb,UAAYF,EAASG,SAASY,MACnCxF,EAAMu8C,YAAYv6C,EAAKjW,EAAI,EAAGgF,EAAG7H,KAAK6W,MAAO,2BAA4B,CACrE3V,SAAU,+CAGTlB,KAAKyb,UAAYF,EAASG,SAASC,MACxC7E,EAAMu8C,YAAYv6C,EAAKjW,EAAI,EAAGgF,EAAG7H,KAAK6W,MAAO,0BAA2B,CACpE3V,SAAU,+CCtBnB,MAAMoyD,WAAiBxxD,GAC1BT,YAAY60C,GACRzzC,MAAMyzC,GACNl2C,KAAKuzD,cAAe,EACpBvzD,KAAKwzD,iBAAmB,EACxBxzD,KAAKyzD,mBAAqB,EAC1BzzD,KAAKoR,MAAQ8kC,EAAW9kC,MACxBpR,KAAK6C,EAAIqzC,EAAWrzC,GAAK,EACzB7C,KAAK6H,EAAIquC,EAAWruC,GAAK,EACrBquC,EAAWwd,YACX1zD,KAAKw2C,SAAWN,EAAWwd,WAC/B1zD,KAAKm9B,UAAY+Y,EAAW/Y,YAAa,EACzCn9B,KAAKkoC,eAAiBgO,EAAWhO,gBAAkBV,EAAKe,GACxDvoC,KAAKkD,KAAOgzC,EAAWhzC,MAAQ,EAG/BlD,KAAKwY,MAAQ+jB,EAAOoa,cAAc32C,KAAK+9B,SAAU/9B,KAAKw2C,UACtD5zC,EAAQ5C,KAAKwY,MAAO,eAAgB,gCAAgCxY,KAAK+9B,uBAAuB/9B,KAAKw2C,aACrGx2C,KAAK2zD,WAAa3zD,KAAKwY,MAAM+lB,UAC7Bv+B,KAAKoX,QAAU8+B,EAAW9+B,SAAW,EACjC8+B,EAAW0d,oBACX5zD,KAAKuzD,cAAe,EACpBvzD,KAAK2zD,WAAazd,EAAW0d,kBAC7B5zD,KAAKwzD,iBAAmBtd,EAAWsd,kBAAoB,EACvDxzD,KAAKyzD,mBAAqBvd,EAAWud,oBAAsB,GAE/DzzD,KAAKwN,MAAQ0oC,EAAW1oC,MACxBxN,KAAK6zD,QAAU3d,EAAW2d,UAAW,EACrC7zD,KAAKmhC,eAAiB9gC,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI/V,KAAKmhC,gBAAiB,CAExE8V,iBAAkBf,EAAWe,kBAAoB1a,EAAOkC,sBAC5Dz+B,KAAKwc,SAASxc,KAAKwY,MAAM+D,SAASvc,KAAKmhC,eAAe8V,mBAE/C31C,sBACP,OAAOG,EAAS6xD,SAGpB/2C,WACI,OAAOvc,KAAKyJ,MAGhBqqD,cACI,OAA0B,IAAnB9zD,KAAKm9B,UAGhB8b,WACI,OAAOj5C,KAAKwY,MAGhBnQ,KAAKxF,GAED,OADA7C,KAAK6C,EAAIA,EACF7C,KAGXkI,OACI,OAAOlI,KAAK6H,EAGhBS,KAAKT,GAED,OADA7H,KAAK6H,EAAIA,EACF7H,KAGX+zD,UACI,OAAO/zD,KAAKkD,KAGhB8wD,QAAQ9wD,GAEJ,OADAlD,KAAKkD,KAAOA,EACLlD,KAGXi2C,eAII,MAAMpzC,EAAK7C,KAAK01C,aAAwBjzC,MAAMwzC,eAAfj2C,KAAK6C,EAG9BoxD,EAA6BzsB,EAAKiB,MAAQ,EAC1C/G,EAAYnF,EAAOoF,mBACnBuyB,EAAYxyB,EAAUtxB,aAAa,kBAAmB,GAAKpQ,KAAKkoC,eAChEisB,EAAqBzyB,EAAUtxB,aAAa,4BAA6B,GAAKpQ,KAAKkoC,eACzF,OAAQrlC,EACJqxD,GACCl0D,KAAKm9B,WAAan9B,KAAKyJ,MAAQwqD,GAA8Bj0D,KAAKkoC,eAAiBisB,EAAqB,GAGjHh/C,iBACI,IAAKnV,KAAK01C,aACN,MAAM,IAAIrzC,EAAa,kBAAmB,qDAE9C,MAAM8sC,EAAUnvC,KAAK+a,aAAaynB,yBAC5B4xB,EAAejlB,EAAU,EACzBklB,EAAQr0D,KAAK6H,EAAIusD,EACvB,OAAO,IAAIxsD,EAAY5H,KAAKi2C,eAAgBoe,EAAOr0D,KAAKyJ,MAAO0lC,GAGnEl1B,SAASC,GACL,MAAMhX,EAAOlD,KAAK+zD,UAMlB,OALA/zD,KAAKka,MAAQA,EACTla,KAAKka,QACLla,KAAKsI,KAAKtI,KAAKka,MAAMo6C,YAAYpxD,IACjClD,KAAKqV,WAAWrV,KAAKka,MAAM9E,eAExBpV,KAGXy1C,YACI,GAAIz1C,KAAK01C,aACL,OAAO11C,KACX,MAAMyJ,EAAQzJ,KAAKuc,WAAavc,KAAK82C,oBAAsB92C,KAAK+2C,qBAGhE,OAFA/2C,KAAKwc,SAAS/S,GACdzJ,KAAK01C,cAAe,EACb11C,KAGX2U,OACI,MAAMmE,EAAM9Y,KAAK0U,eACjB1U,KAAKgV,cACL,IAAIu/C,EAASv0D,KAAKi2C,eACdj2C,KAAKuzD,eAELgB,GAAUv0D,KAAKkoC,iBAAmBV,EAAKe,GAAKvoC,KAAKwzD,iBAAmBxzD,KAAKyzD,oBAE7E,MAAM5rD,EAAI7H,KAAK6H,GAjLvB,YAAc5E,GACNqwD,GAASpyB,OACTn+B,EAAI,oBAAqBE,GAgLzB,CAAE,sBAAuBjD,KAAKw2C,SAAUx2C,KAAK+9B,SAAU,OAAQw2B,EAAQ1sD,GAEvE,MAAMqgC,EAAiBloC,KAAKkoC,eACtB+O,EAAmBj3C,KAAKmhC,eAAe8V,iBACzCj3C,KAAKwN,OACLxN,KAAK0T,WAAWoF,GAEpB,MAAM07C,EAAiB,GAAGx0D,KAAK2zD,iBAAiBzrB,IAAmBV,EAAKe,GAAK,KAAO,SACpF,GAAsB,MAAlBvoC,KAAKw2C,SAAkB,CACvB,MAAMie,EAAaz0D,KAAK+a,aAAaynB,0BA/KjD,SAA2B1pB,EAAKilB,EAAUl7B,EAAGgF,EAAGqgC,EAAgBusB,GAC5D,MAAMhrD,EAAQ8yB,EAAOsC,qBACrB/lB,EAAIlF,OACJkF,EAAIxE,aAAaioB,EAAOmC,YACxB,IAAI/kB,GAAO,EAmBX,GAlBI4iB,EAAOm4B,iBAAiB32B,GAAY,IACpCpkB,GAAO,GAENA,IACD9W,GAAM05B,EAAOmC,WAAa,EAAKwJ,GACnCpvB,EAAIQ,YACJR,EAAIS,OAAO1W,EAAGgF,EAAI4sD,GAClB37C,EAAIU,OAAO3W,EAAGgF,EAAI,GAClBiR,EAAIU,OAAO3W,EAAI4G,EAAO5B,EAAI4sD,GAC1B37C,EAAIU,OAAO3W,EAAI4G,EAAO5B,GACtBiR,EAAIU,OAAO3W,EAAGgF,EAAI4sD,GAClB37C,EAAIi/B,YACAp+B,EACAb,EAAIa,OAGJb,EAAIikB,SAEJR,EAAO2B,mBAAmBH,GAAU93B,OAAO,IAAM,CACjD,MAAM0uD,EAAc,EAAE,GAAI,EAAGlrD,EAAQ,EAAGA,EAAQ,GAChD,IAAK,IAAI/B,EAAI,EAAGA,EAAIitD,EAAY7vD,OAAQ4C,IACpCoR,EAAIQ,YACJR,EAAIS,OAAO1W,EAAI8xD,EAAYjtD,GAAIG,EAAI,IACnCiR,EAAIU,OAAO3W,EAAI8xD,EAAYjtD,GAAIG,EAAI,IACnCiR,EAAIikB,SAGZjkB,EAAItE,UAgJIogD,CAAkB97C,EAAK9Y,KAAK+9B,SAAUw2B,EAAQ1sD,EAAGqgC,EAAgBusB,QAGjE39C,EAAMu8C,YAAYv6C,EAAKy7C,EAAQ1sD,EAAGovC,EAAkBj3C,KAAK2zD,WAAY,CACjEzyD,SAAUlB,KAAKuzD,aAAe,mBAAmBiB,IAAmB,qBAAqBA,MAG7Fx0D,KAAKwN,OACLxN,KAAKuU,aAAauE,IAK9Bw6C,GAASpyB,OAAQ,ECxMV,MAAMh/B,WAAsBJ,GAC/BT,YAAY60C,GACRzzC,MAAMyzC,GAEC50C,sBACP,OAAOG,EAASS,cAGpBwrC,UACI,OAAO1tC,KAAKsgC,KAEhB+O,YACI,IAAKrvC,KAAKsgC,KACN,MAAM,IAAIj+B,EAAa,SAAU,gCAErC,OAAOrC,KAAKsgC,KAEhBu0B,QAAQv0B,GAEJ,OADAtgC,KAAKsgC,KAAOA,EACLtgC,KAGX80D,YACI,MAAMx0B,EAAO,IAAIkH,EAEjB,OADAxnC,KAAK60D,QAAQv0B,GACNtgC,KAEX+0D,UAAU7zD,EAAW,QACjB,MAAM,MAAEsX,GAAUxY,KAClB,GAAIA,KAAKg1D,UAAW,CAChB,MAAMC,EAAWj1D,KAAKutC,qBAAuB/F,EAAKgB,KAAOhwB,EAAMuoB,mBAAqBvoB,EAAMsoB,iBAC1F9gC,KAAKwgC,KAAO,IAAI1pB,EAAMm+C,EAAUj1D,KAAKmhC,eAAe8V,iBAAkB,CAAE/1C,SAAAA,KAIhFg0D,6BACI,OAAIl1D,KAAKutC,qBAAuB/F,EAAKgB,KAC1BxoC,KAAK42C,aAAa52C,KAAK42C,aAAa9xC,OAAS,GAG7C9E,KAAK42C,aAAa,GAIjCue,gBACI,OAAO3tB,EAAKkB,OAAS1oC,KAAKo1D,mBAG9BC,eACI,MAAM78C,EAAQxY,KAAKi5C,WACnB,OAAIzgC,EACOA,EAAMooB,WAGN,EAIf00B,uBAEI,IAAIxwD,EADSy3B,EAAO2B,mBAAmBl+B,KAAK+9B,UAC1B74B,SAAW,EAAI,EAAI,GAErC,OAAQlF,KAAK+9B,UACT,IAAK,IACgBj7B,MAAb9C,KAAKu5C,OACLz0C,EAAS,IACb,MACJ,IAAK,KACDA,EAAsBhC,MAAb9C,KAAKu5C,KAAoB,GAAK,GACvC,MACJ,IAAK,KACDz0C,EAAsBhC,MAAb9C,KAAKu5C,KAAoB,GAAK,GACvC,MACJ,IAAK,KACDz0C,EAAsBhC,MAAb9C,KAAKu5C,KAAoB,GAAK,GACvC,MACJ,IAAK,MACDz0C,EAAsBhC,MAAb9C,KAAKu5C,KAAoB,GAAK,GAK/C,OAAOz0C,EAGXyoC,mBACI,IAAKvtC,KAAKkoC,eACN,MAAM,IAAI7lC,EAAa,SAAU,kCACrC,OAAOrC,KAAKkoC,eAEhBqtB,iBAAiBhxC,GAGb,GAFKA,IACDA,EAAYijB,EAAKe,IACjBhkB,IAAcijB,EAAKe,IAAMhkB,IAAcijB,EAAKgB,KAC5C,MAAM,IAAInmC,EAAa,cAAe,2BAA2BkiB,KASrE,GAPAvkB,KAAKkoC,eAAiB3jB,EAEtBvkB,KAAKuY,QACDvY,KAAKg1D,WACLh1D,KAAK+0D,YAET/0D,KAAKu5C,UAAOz2C,EACR9C,KAAKsgC,KAAM,CACXtgC,KAAKsgC,KAAKsI,aAAarkB,GACvBvkB,KAAKsgC,KAAKuI,aAAa7oC,KAAKo1D,oBAG5B,MAAM58C,EAAQxY,KAAKk1D,8BAAgCl1D,KAAKi5C,WAElDuc,EAAUj5B,EAAOoF,mBAAmBvxB,aAAa,iBAAiBoI,EAAM+lB,YAAa,CACvFk3B,kBAAmB,EACnBC,iBAAkB,EAClBC,oBAAqB,EACrBC,mBAAoB,IAGxB51D,KAAKsgC,KAAKhoB,WAAW,CACjBmvB,iBAAkB+tB,EAAQE,iBAC1BhuB,mBAAoB8tB,EAAQI,mBAC5BjuB,sBAAuB6tB,EAAQC,kBAC/B7tB,wBAAyB4tB,EAAQG,sBAMzC,OAHI31D,KAAK01C,cACL11C,KAAKy1C,YAEFz1C,KAGXivC,WACI,MAAMpH,EAAU7nC,KAAKi2C,eAAiBj2C,KAAKoX,QACrC0wB,EAAQ9nC,KAAKi2C,eAAiBj2C,KAAKoX,QAAUpX,KAAKk5C,gBAExD,OADel5C,KAAKkoC,iBAAmBV,EAAKgB,KAAOX,EAAUC,EAKjE+tB,kBACI,OAAO71D,KAAKi2C,eAAiBj2C,KAAKoX,QAAUpX,KAAKk5C,gBAAkB,EAGvEkc,mBACI,MAAM58C,EAAQxY,KAAKi5C,WACnB,GAAoCn2C,MAAhC9C,KAAK81D,wBACL,OAAO91D,KAAK81D,wBAGhB,GAAI91D,KAAKu5C,KACL,OAAO/gC,EAAMqoB,oBAEjB,MAAMo0B,EAAWj1D,KAAKutC,qBAAuB/F,EAAKgB,KAAOxoC,KAAKwY,MAAMuoB,mBAAqB/gC,KAAKwY,MAAMsoB,iBACpG,OAAO38B,KAAK6C,IAAIu1B,EAAOoF,mBAAmBvxB,aAAa,eAAe6kD,WAAmB,IAG7Fc,cAAcrsD,GAEV,OADA1J,KAAK81D,wBAA0BpsD,EAAS89B,EAAKkB,OACtC1oC,KAGX6vC,iBACI,IAAK7vC,KAAKsgC,KACN,MAAM,IAAIj+B,EAAa,SAAU,kCACrC,OAAOrC,KAAKsgC,KAAK6I,aAGrBsG,eAAeiC,GACX,MAAMx3B,EAAQla,KAAK+a,aACnB,GAAI/a,KAAKstC,UAAW,CAChB,MAAMsC,EAAU5vC,KAAK6vC,iBACrB,IAAKD,EACD,MAAM,IAAIvtC,EAAa,eAAgB,+BAC3C,OAAO8B,KAAKqlC,IAAItvB,EAAMu1B,eAAeiC,GAAW9B,EAAQlG,KAAO1pC,KAAKmhC,eAAe6V,oBAAsBtF,EAAW,IAGpH,OAAOx3B,EAAMu1B,eAAeiC,GAIpChC,kBAAkBgC,GACd,MAAMx3B,EAAQla,KAAK+a,aACnB,GAAI/a,KAAKstC,UAAW,CAChB,MAAMsC,EAAU5vC,KAAK6vC,iBACrB,IAAKD,EACD,MAAM,IAAIvtC,EAAa,eAAgB,+BAC3C,OAAO8B,KAAK4E,IAAImR,EAAMu1B,eAAeiC,GAAW9B,EAAQjG,MAAQ3pC,KAAKmhC,eAAe6V,mBAAqBtF,GAGzG,OAAOx3B,EAAMw1B,kBAAkBgC,GAGvCsjB,UACI,OAAOz4B,EAAOoa,cAAc32C,KAAK+9B,UAAUyC,OAASxgC,KAAKu5C,KAG7D5D,aACI,IAAI5oC,EAGJ,OAFqB,QAApBA,EAAK/M,KAAKu5C,YAAyB,IAAPxsC,GAAyBA,EAAG4oC,aACzD31C,KAAK41C,eAAgB,EACd51C,KAGXg2D,SAASC,GACL,IAAIlpD,EACJ/M,KAAK0U,eACL1U,KAAKgV,cACLhV,KAAK60D,QAAQ,IAAIrtB,EAAKyuB,IACD,QAApBlpD,EAAK/M,KAAKsgC,YAAyB,IAAPvzB,GAAyBA,EAAGsI,WAAWrV,KAAKoV,cAAcT,QC7L/F,SAASuhD,GAAkBtsC,EAAMlN,EAAMy5C,GACnC,MAAMC,EAAQD,EACdvsC,EAAK1mB,MAAQkzD,EACbxsC,EAAKysC,SAAWD,EAChBxsC,EAAK0sC,SAAWF,EAChBxsC,EAAKlN,KAAK65C,WAAW,EAAG3sC,EAAKlN,KAAK85C,WAAW,GAAKJ,GAU/C,MAAMp0D,WAAkBE,GAC3Bb,YAAY60C,GACR,IAAInpC,EAAIkF,EAAIyyC,EACZjiD,MAAMyzC,GAGNl2C,KAAKs2D,QAAU,EACft2D,KAAKq2D,QAAU,EACfr2D,KAAKy2D,gBAAkB,GACvBz2D,KAAKw8B,KAAkC,QAA1BzvB,EAAKmpC,EAAW1Z,YAAyB,IAAPzvB,EAAgBA,EAAK,SACpE/M,KAAK28B,aAAkD,QAAlC1qB,EAAKikC,EAAWvZ,oBAAiC,IAAP1qB,EAAgBA,EAAK,EAEpFjS,KAAKwY,MAAQ+jB,EAAOoa,cAAc32C,KAAK+9B,SAAU/9B,KAAKw2C,UACtD5zC,EAAQ5C,KAAKwY,MAAO,eAAgB,gCAAgCxY,KAAK+9B,uBAAuB/9B,KAAKw2C,aAErGx2C,KAAKm9B,WAAY,EACjBn9B,KAAKygC,WAAa,EAElBzgC,KAAK02D,oBAAqB,EAE1B12D,KAAK22D,WAAa,GAClB32D,KAAKmzC,UAAY,GACjBnzC,KAAKmhC,eAAiB9gC,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI/V,KAAKmhC,gBAAiB,CAExE8V,iBAAkBf,EAAWe,kBAAoB1a,EAAOkC,oBAExDyY,UAAWhB,EAAWgB,WAAal1C,GAAU40D,qBACjD52D,KAAK62D,oBACL72D,KAAK80D,YAED5e,EAAW4gB,UACX92D,KAAK+2D,WAGL/2D,KAAKu1D,iBAAsD,QAApC7Q,EAAKxO,EAAWhO,sBAAmC,IAAPwc,EAAgBA,EAAKld,EAAKe,IAEjGvoC,KAAKuY,QACLvY,KAAK+0D,YAEEzzD,sBACP,OAAOG,EAASO,UAKTg1D,qBACP,OAAOxvB,EAAKe,GAKL0uB,uBACP,OAAOzvB,EAAKgB,KAELouB,gCACP,OAAO,EAEAM,gCAEP,OADkB36B,EAAOoF,mBACRvxB,aAAa,8BAGlC3L,cAAco5B,EAAO4D,GACjB,IAAK5D,GAASA,EAAM/4B,OAAS,EACzB,OAAO,EACX,MAAMqyD,EAAY,GAClB,IAAK,IAAIzvD,EAAI,EAAGA,EAAIm2B,EAAM/4B,OAAQ4C,IAAK,CACnC,MAAM06B,EAAQvE,EAAMn2B,GAAG26B,cACjBn/B,EAAOk/B,EAAM,GAAGl/B,KACtB,IAAIk0D,EAAOh1B,EAAMA,EAAMt9B,OAAS,GAAG5B,KACnC,MAAMmqC,EAAgBxP,EAAMn2B,GAAG6lC,mBACzB8pB,EAAUx5B,EAAMn2B,GAAGytD,gBAAkB,GACrCmC,EAAUz5B,EAAMn2B,GAAG4tD,uBAAyB,GAClD,IAAIiC,EACA15B,EAAMn2B,GAAGu+B,UACTsxB,EAAOr0D,EAAO26B,EAAMn2B,GAAG8Q,MAAMkoB,WAC7B02B,EAAOl0D,EAAO26B,EAAMn2B,GAAG8Q,MAAMmoB,aAG7B42B,EAAyB,IAAlBlqB,EAAsBjL,EAAMA,EAAMt9B,OAAS,GAAG5B,KAAOm0D,EAAUj1B,EAAMA,EAAMt9B,OAAS,GAAG5B,KAC9Fk0D,EAAyB,IAAlB/pB,EAAsBjL,EAAM,GAAGl/B,KAAOk/B,EAAM,GAAGl/B,KAAOm0D,GAEjEF,EAAUt/C,KAAK,CACX3U,KAAMk/B,EAAM,GAAGl/B,KACfmzD,QAASkB,EACTjB,QAASc,EACTI,OAAQ35B,EAAMn2B,GAAGu+B,SACjBoH,cAAeA,EACfgqB,QAAAA,EACAC,QAAAA,EACAG,YAAa55B,EAAMn2B,GAAGgwD,qBACtBC,aAAc95B,EAAMn2B,GAAGosD,cACvBp3C,KAAMmhB,EAAMn2B,KAGpB,MAAMw9B,EAASiyB,EAAUryD,OACzB,IAAI8yD,EAAQT,EAAU,GACtB,MAAMU,EAAQ3yB,EAAS,EAAIiyB,EAAU,QAAKr0D,EAC1C,IAAIg1D,EAAQ5yB,EAAS,EAAIiyB,EAAU,GAAKA,EAAU,GAGnC,IAAXjyB,IAAyC,IAAzB0yB,EAAMvqB,eAAgD,IAAxByqB,EAAMzqB,gBACpDuqB,EAAQT,EAAU,GAClBW,EAAQX,EAAU,IAEtB,MAAMY,EAAc5zD,KAAK4E,IAAI6uD,EAAMH,YAAaK,EAAML,aACtD,IAAIj9C,EAAS,EAEb,GAAe,IAAX0qB,EAAc,CACd,MAAMstB,EAAcoF,EAAMvqB,gBAAkByqB,EAAMzqB,cAAgB,EAAM,GAuBxE,OAtBIuqB,EAAMtB,SAAWwB,EAAMzB,QAAU7D,IAC7BoF,EAAMJ,OAENtB,GAAkB0B,EAAOE,EAAO,GAE3BA,EAAMN,OAEXtB,GAAkB4B,EAAOF,GAAQ,GAE5BA,EAAMvqB,gBAAkByqB,EAAMzqB,eAEnC7yB,EAASu9C,EAAc,EACvBH,EAAMl7C,KAAKvC,UAAUK,KAIrBA,EAASu9C,EAAc,EACvBD,EAAMp7C,KAAKvC,UAAUK,KAI7BinB,EAAM4M,aAAe7zB,GACd,EAEX,IAAKq9C,EACD,MAAM,IAAIx1D,EAAa,eAAgB,sBAK3C,GAAIw1D,EAAML,SAAWI,EAAMJ,SAAWM,EAAMN,SACpCI,EAAMtB,SAAWuB,EAAMxB,SAAWwB,EAAMvB,SAAWwB,EAAMzB,SAAS,CAqBlE,OApBmBwB,EAAMxB,QAAUwB,EAAMvB,QAC3BsB,EAAMtB,QAAUwB,EAAMzB,QAtJpD,SAAoBzsC,EAAMguC,EAAOE,GAC7B,MAAM1B,EAAQxsC,EAAK1mB,KAAOQ,EAAQk0D,EAAMtB,QAASwB,EAAMzB,SACvDzsC,EAAKlN,KAAK65C,WAAW,EAAG3sC,EAAKlN,KAAK85C,WAAW,GAAKJ,GAClDxsC,EAAK1mB,MAAQkzD,EACbxsC,EAAKysC,SAAWD,EAChBxsC,EAAK0sC,SAAWF,EAoJA4B,CAAWH,EAAOD,EAAOE,IAGzBt9C,EAASu9C,EAAc,EACvBF,EAAMn7C,KAAKvC,UAAUK,IACQ,IAAzBs9C,EAAMp7C,KAAK+8B,YACXqe,EAAMzqB,eAAiB,EACvByqB,EAAMp7C,KAAK64C,kBAAkB,IAE7BqC,EAAMtB,SAAWwB,EAAMzB,UAAoC,IAAzBuB,EAAMl7C,KAAK+8B,YAC7Cme,EAAMvqB,cAAgB,EACtBuqB,EAAMl7C,KAAK64C,iBAAiB,KAIpC9zB,EAAM4M,aAAe7zB,GACd,EAIf,OAAIo9C,EAAMJ,QAAUK,EAAML,QAAUM,EAAMN,QAEtCtB,GAAkB0B,EAAOC,EAAO,GAEhC3B,GAAkB4B,EAAOD,GAAQ,GAEjCp2B,EAAM4M,aAAe7zB,GACd,IAGPq9C,EAAML,QAAUI,EAAMJ,QAAUK,EAAMvB,SAAWwB,EAAMzB,SAEvDH,GAAkB2B,EAAOC,EAAO,GAEhCD,EAAML,QAAUM,EAAMN,QAAUI,EAAMtB,SAAWuB,EAAMxB,SAEvDH,GAAkB2B,EAAOD,GAAQ,GAEjCA,EAAMJ,QAAUI,EAAMtB,SAAWuB,EAAMxB,SAEvCH,GAAkB0B,EAAOC,EAAO,GAEhCC,EAAMN,QAAUK,EAAMvB,SAAWwB,EAAMzB,SAEvCH,GAAkB4B,EAAOD,GAAQ,IAGjCD,EAAMtB,SAAWuB,EAAMxB,QAAU,IAAOwB,EAAMvB,SAAWwB,EAAMzB,WAE/D77C,EAASu9C,EAAc,EACvBF,EAAMn7C,KAAKvC,UAAUK,IACQ,IAAzBs9C,EAAMp7C,KAAK+8B,YACXqe,EAAMzqB,eAAiB,EACvByqB,EAAMp7C,KAAK64C,kBAAkB,IAE7BqC,EAAMtB,SAAWwB,EAAMzB,UAAoC,IAAzBuB,EAAMl7C,KAAK+8B,YAC7Cme,EAAMvqB,cAAgB,EACtBuqB,EAAMl7C,KAAK64C,iBAAiB,KAGpC9zB,EAAM4M,aAAe7zB,GACd,GAEX/V,kBAAkBo5B,GACd,QAAKA,IAELA,EAAM3f,SAASxB,GAASA,EAAKi5B,gBACtB,GAEXp9B,QACI9V,MAAM8V,QAEN,MAAM0/C,EAAiBj4D,KAAK22D,WAAWpkD,KAAK2lD,GAAaA,EAASzkD,aAClEzT,KAAKm4D,iBACLn4D,KAAK22D,WAAWz4C,SAAQ,CAACg6C,EAAU9mD,KAC/B,MAAMgnD,EAAgBH,EAAe7mD,GACjCgnD,GACAF,EAAS1kD,SAAS4kD,MAE1B,MAAMl+C,EAAQla,KAAKka,MAKnB,OAJIA,GACAla,KAAK22D,WAAWz4C,SAASm6C,GAASA,EAAKp+C,SAASC,KAEpDla,KAAKs4D,wBACEt4D,KAEX05C,QAAQH,GAOJ,OANAv5C,KAAKu5C,KAAOA,EACZv5C,KAAKs4D,wBAEDt4D,KAAKsgC,MACLtgC,KAAKsgC,KAAKuI,aAAa7oC,KAAKo1D,oBAEzBp1D,KAGX80D,YAEI,OADA90D,KAAK60D,QAAQ,IAAIrtB,EAAK,CAAEW,OAAQnoC,KAAKimC,YAC9BjmC,KAGXm4D,iBACIn4D,KAAK22D,WAAa,GAClB,MAAMtpB,EAAgBrtC,KAAKutC,mBACrBj7B,EAAOtS,KAAKw6C,UAClB,IAAIuO,EACAwP,EAIAnxB,EACAyV,EACA5wC,EALAkxB,GAAY,EAMZkQ,IAAkB7F,EAAKe,IACvBnB,EAAQ,EACRyV,EAAMvqC,EAAKxN,OACXmH,EAAO,IAGPm7B,EAAQ90B,EAAKxN,OAAS,EACtB+3C,GAAO,EACP5wC,GAAQ,GAEZ,IAAK,IAAIvE,EAAI0/B,EAAO1/B,IAAMm1C,EAAKn1C,GAAKuE,EAAM,CACtC,MAAMusD,EAAYx4D,KAAKu2C,SAAS7uC,GAC1BxE,EAAOs1D,EAAUt1D,UAGNJ,IAAbimD,EACAA,EAAW7lD,GAGXq1D,EAAWp0D,KAAK6C,IAAI+hD,EAAW7lD,GACd,IAAbq1D,GAA+B,KAAbA,EAClBp7B,GAAaA,GAGbA,GAAY,EACZn9B,KAAK02D,oBAAqB,IAGlC3N,EAAW7lD,EACX,MAAMu1D,EAAW,IAAInF,GAAS,CAC1Bv1B,SAAU/9B,KAAK+9B,SACf21B,UAAW1zD,KAAKw2C,SAChBrZ,UAAAA,EACA+K,eAAgBmF,EAChBumB,kBAAmB4E,EAAUj2D,KAC7B00C,iBAAkBj3C,KAAKmhC,eAAe8V,iBACtC7/B,QAASohD,EAAU1uC,YACnB0pC,iBAAkBgF,EAAUhF,iBAC5BC,mBAAoB+E,EAAU/E,mBAC9BvwD,KAAMs1D,EAAUt1D,OAEpBlD,KAAK22D,WAAWjvD,GAAK+wD,GAI7B1B,WACI/2D,KAAKu1D,iBAAiBv1D,KAAK04D,iCAE/BA,gCAEI14D,KAAKs2D,QAAUt2D,KAAKu2C,SAAS,GAAGrzC,KAChClD,KAAKq2D,QAAUr2D,KAAKu2C,SAASv2C,KAAKu2C,SAASzxC,OAAS,GAAG5B,KAIvD,OAFiBlD,KAAKs2D,QAAUt2D,KAAKq2D,SAAW,EAD5B,EAE0B7uB,EAAKe,GAAKf,EAAKgB,KAIjEquB,oBACI,IAAI9N,EACJ,IAAK,IAAIrhD,EAAI,EAAGA,EAAI1H,KAAKsS,KAAKxN,SAAU4C,EAAG,CACvC,MAAMvH,EAAMH,KAAKsS,KAAK5K,GAGlB1H,KAAKwY,MAAMoR,OACX5pB,KAAKwY,MAAMiD,SAAWtb,GAC1B,MAAM+X,EAAU,CAAEykB,aAAc38B,KAAK28B,cAAgB,GAC/CyF,EAAQ7F,EAAOo8B,cAAcx4D,EAAKH,KAAKw8B,KAAMtkB,GACnD,IAAKkqB,EACD,MAAM,IAAI//B,EAAa,eAAgB,oCAAoClC,KAG7D,MAAdiiC,EAAMjiC,MACgB,MAAlBH,KAAK+9B,UAAsC,MAAlB/9B,KAAK+9B,SAC9BqE,EAAMl/B,KAAO,EAGbk/B,EAAMl/B,KAAO,GAIrB,MAAMA,EAAOk/B,EAAMl/B,KACHJ,MAAZimD,EACAA,EAAW7lD,EAGuB,KAA9BiB,KAAK6C,IAAI+hD,EAAW7lD,KACpBlD,KAAKm9B,WAAY,EACjBiF,EAAMjF,WAAY,EAGdn9B,KAAKu2C,SAASzxC,OAAS,IACvB9E,KAAKu2C,SAAS7uC,EAAI,GAAGy1B,WAAY,IAI7C4rB,EAAW7lD,EACXlD,KAAKu2C,SAAS1+B,KAAKuqB,GAGvB2mB,OAAWjmD,EACX9C,KAAKu2C,SAASr4B,SAAS/d,IACf4oD,GAAY5oD,EAAI+C,KAAO6lD,GACvBxlD,EAAK,qGAETwlD,EAAW5oD,EAAI+C,QAEnBlD,KAAKu2C,SAAS3T,MAAK,CAACj/B,EAAGC,IAAMD,EAAET,KAAOU,EAAEV,OAG5CiS,iBACI,IAAIpI,EAAIkF,EACR,IAAKjS,KAAK01C,aACN,MAAM,IAAIrzC,EAAa,kBAAmB,qDAE9C,MAAQoH,MAAO3B,EAAC,UAAEkW,EAAS,oBAAE84B,GAAwB92C,KAAK8P,aACpDjN,EAAI7C,KAAKi2C,eAAiBj4B,EAAY84B,EAC5C,IAAI8hB,EAAO,EACPC,EAAO,EACX,MAAMC,GAAsH,QAAlG7mD,EAAgC,QAA1BlF,EAAK/M,KAAK8d,kBAA+B,IAAP/Q,OAAgB,EAASA,EAAGy1B,gCAA6C,IAAPvwB,EAAgBA,EAAK,GAAK,EACxJugD,EAAgC,EAAlBsG,EACpB,GAAI94D,KAAKimC,SAAU,CACf,MAAMp+B,EAAI7H,KAAKqpC,GAAG,GACZ0vB,EAAOx8B,EAAO2B,mBAAmBl+B,KAAK+9B,UACxCg7B,EAAK9yD,OAAO,IAAM8yD,EAAK9yD,OAAO,IAC9B2yD,EAAO/wD,EAAIixD,EACXD,EAAOhxD,EAAIixD,IAGXF,EAAO/wD,EAAI7H,KAAKwY,MAAMkoB,WAAa8xB,EACnCqG,EAAOhxD,EAAI7H,KAAKwY,MAAMmoB,WAAa6xB,QAGtC,GAAIxyD,KAAKwY,MAAM8nB,KAAM,CACtB,MAAM+I,EAAKrpC,KAAK6vC,iBAChBxG,EAAGM,OAASmvB,EAAkB94D,KAAKutC,mBACnCqrB,EAAOz0D,KAAKqlC,IAAIH,EAAGK,KAAML,EAAGM,OAC5BkvB,EAAO10D,KAAK4E,IAAIsgC,EAAGK,KAAML,EAAGM,WAE3B,CACDivB,EAAO,EACPC,EAAO,EACP,IAAK,IAAInxD,EAAI,EAAGA,EAAI1H,KAAKqpC,GAAGvkC,SAAU4C,EAAG,CACrC,MAAMmwC,EAAK73C,KAAKqpC,GAAG3hC,GACT,IAANA,GACAkxD,EAAO/gB,EACPghB,EAAOhhB,IAGP+gB,EAAOz0D,KAAKqlC,IAAIqO,EAAI+gB,GACpBC,EAAO10D,KAAK4E,IAAI8uC,EAAIghB,IAG5BD,GAAQE,EACRD,GAAQC,EAEZ,OAAO,IAAIlxD,EAAY/E,EAAG+1D,EAAM9wD,EAAG+wD,EAAOD,GAI9C7qB,cAAcgL,GACV,IAAK/4C,KAAKu2C,SAASzxC,OACf,MAAM,IAAIzC,EAAa,aAAc,yEAEzC,IAAI22D,EAAah5D,KAAKu2C,SAAS,GAAGrzC,KAElC,IAAK,IAAIwE,EAAI,EAAGA,EAAI1H,KAAKu2C,SAASzxC,OAAQ4C,IAAK,CAC3C,MAAMuxD,EAAWj5D,KAAKu2C,SAAS7uC,GAAGxE,KAC9B61C,EACIkgB,EAAWD,IACXA,EAAaC,GAGbA,EAAWD,IACXA,EAAaC,GAGzB,OAAOD,EAKX/yB,SACI,OAAOjmC,KAAKwY,MAAMoR,KAGtBsvC,UACI,OAAQl5D,KAAKimC,UAAYjmC,KAAKsS,KAAKxN,OAAS,EAGhDwoC,UACI,OAAOttC,KAAKwY,MAAM8nB,KAEtB00B,UACI,OAAOvyD,MAAMuyD,YAAch1D,KAAKimC,SAEpCgJ,WACI,MAAsB,MAAlBjvC,KAAKw2C,SACEx2C,KAAK61D,kBAKLpzD,MAAMwsC,YAAcjvC,KAAKkoC,eAAiBV,EAAKiB,OAAS,GAAKzoC,KAAKkoC,gBAAkB,GAKnGuH,eAAeiC,GACX,MAAM9B,EAAU5vC,KAAK6vC,iBACrB,OAAO1rC,KAAKqlC,IAAIxpC,KAAK+a,aAAa00B,eAAeiC,GAAW9B,EAAQlG,KAAO1pC,KAAKmhC,eAAe6V,oBAAsBtF,EAAW,IAEpIhC,kBAAkBgC,GACd,MAAM9B,EAAU5vC,KAAK6vC,iBACrB,OAAO1rC,KAAK4E,IAAI/I,KAAK+a,aAAa00B,eAAeiC,GAAW9B,EAAQjG,MAAQ3pC,KAAKmhC,eAAe6V,mBAAqBtF,GAIzHz3B,SAASC,GACLzX,MAAMwX,SAASC,GACf,MAAMmvB,EAAKrpC,KAAK22D,WAAWpkD,KAAKkmD,IAC5BA,EAASx+C,SAASC,GACXu+C,EAASvwD,UAGpB,GADAlI,KAAK24C,MAAMtP,GACPrpC,KAAKsgC,KAAM,CACX,MAAM,MAAEyH,EAAK,SAAEC,GAAahoC,KAAKm5D,oBACjCn5D,KAAKsgC,KAAK0I,WAAWjB,EAAOC,GAEhC,OAAOhoC,KAGX8zD,cACI,OAAO9zD,KAAKm9B,UAGhBi8B,iBAAiBj8B,GAEb,OADAn9B,KAAKm9B,UAAYA,EACVn9B,KAGXo6C,eACI,IAAIC,EAAYr6C,KAAKi2C,eAIrB,OAHAoE,GAAar6C,KAAKk5C,gBAAkBl5C,KAAKoX,QAAUpX,KAAK+2C,qBACpD/2C,KAAKid,kBACLo9B,GAAar6C,KAAKid,gBAAgBo8C,iBAC/Bhf,EAGXC,cACI,IAAIC,EAAUv6C,KAAKi2C,eAEnB,OADAsE,GAAWv6C,KAAKoX,QAAUpX,KAAK82C,oBACxByD,EAGXvB,iBACI,IAAIsgB,EAAWt5D,KAAKu2C,SAAS,GAAGrzC,KAChC,GAAIlD,KAAKu2C,SAASzxC,OAAS,EAAG,CAC1B,MAAMikD,EAAW/oD,KAAKu2C,SAASv2C,KAAKu2C,SAASzxC,OAAS,GAAG5B,KAGzDo2D,EAAW51D,EAFCS,KAAK4E,IAAIuwD,EAAUvQ,GACnB5kD,KAAKqlC,IAAI8vB,EAAUvQ,IAGnC,OAAOuQ,EAIXjyB,mBAAmB5rB,EAAUrK,EAAO8G,EAAU,IAC1C,IAAInL,EAAIkF,EACR,IAAKjS,KAAK01C,aACN,MAAM,IAAIrzC,EAAa,kBAAmB,wDAE9C,GAAuB,IAAnBrC,KAAKqpC,GAAGvkC,OACR,MAAM,IAAIzC,EAAa,YAAa,yCAExC,MAAM,MAAE4Z,EAAK,MAAEE,EAAK,KAAER,EAAI,MAAEW,GAAUf,EAASG,SAC/C,IAAI7Y,EAAI,EAiBR,OAhBI4Y,IAAaE,EAEb9Y,GAAI,EAEC4Y,IAAaa,GAElBzZ,EAAI7C,KAAKk5C,gBAAkBl5C,KAAKoX,QAAU,EACtCpX,KAAKkoC,iBAAmBV,EAAKe,IAC7BvoC,KAAKg1D,YACJ98C,EAAQ6vC,gBAljBA,EAACrrC,EAAMtL,IAAUA,KAAWsL,EAAK6wB,qBAAuB/F,EAAKe,GAAK7rB,EAAK65B,SAASzxC,OAAS,EAAI,GAkjB3Ey0D,CAAiBv5D,KAAMoR,MAClDvO,GAAwI,QAAlIoP,EAAsE,QAAhElF,EAAK/M,MAAAA,UAAmC,EAASA,KAAKwgC,YAAyB,IAAPzzB,OAAgB,EAASA,EAAG+C,aAAarG,aAA0B,IAAPwI,EAAgBA,EAAK,IAGpKwJ,IAAaU,GAASV,IAAaQ,IACxCpZ,EAAI7C,KAAKk5C,gBAAkB,GAExB,CACHr2C,EAAG7C,KAAKi2C,eAAiBpzC,EACzBgF,EAAG7H,KAAKqpC,GAAGj4B,IAKnBoC,SAAShG,GACL,IAAIT,EAIJ,OAHAtK,MAAM+Q,SAAShG,GACfxN,KAAK22D,WAAWz4C,SAASu6C,GAAaA,EAASjlD,SAAShG,KACnC,QAApBT,EAAK/M,KAAKsgC,YAAyB,IAAPvzB,GAAyBA,EAAGyG,SAAShG,GAC3DxN,KAEXw5D,aAAahsD,GACT,MAAM8yB,EAAOtgC,KAAK0tC,UAElB,OADApN,MAAAA,GAA4CA,EAAK9sB,SAAShG,GACnDxN,KAEXy5D,eACI,IAAI1sD,EACJ,OAA4B,QAApBA,EAAK/M,KAAKsgC,YAAyB,IAAPvzB,OAAgB,EAASA,EAAG0G,WAEpEimD,mBAAmBlsD,GACfxN,KAAKy2D,gBAAkBjpD,EAE3BmsD,qBACI,OAAO35D,KAAKy2D,gBAEhBmD,aAAapsD,GACTxN,KAAK65D,UAAYrsD,EAErBssD,eACI,OAAO95D,KAAK65D,UAMhBE,YAAY3oD,EAAO5D,GAEf,OADAxN,KAAK22D,WAAWvlD,GAAOoC,SAAShG,GACzBxN,KAEXu2D,WAAWnlD,EAAOlO,GAGd,OAFAlD,KAAKu2C,SAASnlC,GAAOlO,KAAOA,EAC5BlD,KAAKuY,QACEvY,KAEXw2D,WAAWplD,GACP,OAAOpR,KAAKu2C,SAASnlC,GAAOlO,KAIhCw0D,qBAEI,OAAO13D,KAAKk5C,iBAAmBl5C,KAAKm9B,UAAY,EAAI,GAIxDm7B,wBACIt4D,KAAK64C,uBAAuB74C,KAAKm9B,WAAan9B,KAAKkoC,iBAAmBV,EAAKgB,KAAOxoC,KAAKk5C,gBAAkB,GAGzGl5C,KAAK84C,yBAAyB94C,KAAKg1D,WAAah1D,KAAKm9B,WAAan9B,KAAKkoC,iBAAmBV,EAAKe,GAAKvoC,KAAKk5C,gBAAkB,GAG/HzD,YACI,GAAIz1C,KAAK01C,aACL,OACJ,IAAIskB,EAAkB,EAClBh6D,KAAKid,kBACLjd,KAAKid,gBAAgBw4B,YAGmB,IAApCz1C,KAAKid,gBAAgBV,aACrBy9C,EAAkBh4D,GAAUk1D,qBAGpC,IAAIztD,EAAQzJ,KAAKk5C,gBAAkBl5C,KAAK82C,oBAAsB92C,KAAK+2C,qBAAuBijB,EAEtFh6D,KAAKi6D,kBAAoBj6D,KAAKkoC,iBAAmBV,EAAKe,KACtD9+B,GAASzJ,KAAKk5C,iBAGlBl5C,KAAKwc,SAAS/S,GACdzJ,KAAK01C,cAAe,EAqBxByjB,oBAEI,IAEIe,EACAC,EAGAC,EACAC,EAPAC,EAAQC,EAAAA,EACRC,GAAWD,EAAAA,EAGXE,EAAcz6D,KAAK+a,aAAa6yB,cAChC8sB,EAAa,EAGbC,EAA0BF,EAC1BG,EAAyBF,EAuB7B,OAtBA16D,KAAK22D,WAAWz4C,SAASu6C,IACrB,MAAMv1D,EAAOu1D,EAAS1E,UAChBlsD,EAAI4wD,EAASvwD,OACnBoyD,EAAOn2D,KAAKqlC,IAAI3hC,EAAGyyD,GACnBE,EAAUr2D,KAAK4E,IAAIlB,EAAG2yD,QACH13D,IAAfq3D,GAA4B1B,EAAS3E,gBACrCqG,EAAa1B,EAASxiB,qBAEJnzC,IAAlBo3D,GAAgCzB,EAAS3E,gBACzCoG,EAAgBzB,EAASxiB,gBAE7BwkB,EAAct2D,KAAK4E,IAAI7F,EAAMu3D,GAC7BC,EAAav2D,KAAKqlC,IAAItmC,EAAMw3D,GACxBjC,EAAS3E,eACTsG,OAAgDt3D,IAAzBs3D,EAAqCl3D,EAAOiB,KAAK4E,IAAI7F,EAAMk3D,GAClFC,OAA8Cv3D,IAAxBu3D,EAAoCn3D,EAAOiB,KAAKqlC,IAAItmC,EAAMm3D,KAGhFM,EAA0Bx2D,KAAK4E,IAAI7F,EAAMy3D,GACzCC,EAAyBz2D,KAAKqlC,IAAItmC,EAAM03D,MAE7C56D,MACI,CACH+nC,MAAOuyB,EACPtyB,SAAUwyB,EACVK,YAAaV,EACbW,gBAAiBZ,EACjBa,aAAcN,EACdO,YAAaN,EACbO,uBAAwBb,EACxBc,sBAAuBb,EACvBc,2BAA4BR,EAC5BS,0BAA2BR,GAInCS,oBACI,OAAOr7D,KAAKi2C,eAAiBj2C,KAAKoX,QAGtCkkD,kBAEI,OADet7D,KAAKq7D,oBACJr7D,KAAKk5C,gBAErBqiB,gBACA,OAAOv7D,KAAK22D,WAAWvzD,QAGvBo4D,iBAEA,OAzuBJl4D,QAAQC,KAAK,uEAAwE,iDAyuB1EvD,KAAKu7D,UAGhBE,kBACI,MAAMvhD,EAAQla,KAAK+a,cACb,MAAEvC,EAAO2oB,gBAAgB,UAAE+V,IAAiBl3C,KAC5C8Y,EAAM9Y,KAAK0U,eACXjL,EAAQ+O,EAAM+D,WAAyB,EAAZ26B,EAC3BwkB,EAAc,GAAKljD,EAAM+D,WAAa26B,GAAa1P,EAAKiB,MAAQ,EACtE,GAAIzoC,KAAKimC,SACL,OACJ,IAAKntB,EACD,MAAM,IAAIzW,EAAa,kBAAmB,wCAE9C,MAAM,aAAE04D,EAAY,YAAEC,EAAW,uBAAEC,EAAsB,2BAAEE,EAA0B,sBAAED,EAAqB,0BAAEE,EAAyB,YAAEP,EAAW,gBAAEC,GAAqB96D,KAAKm5D,oBAEhL,GAAI4B,EAAe,GAAKC,EAAc,EAClC,OACJ,MAAMW,EAAQx3D,KAAKqlC,IAAIqxB,MAAAA,EAAiDA,EAAc,EAAGC,MAAAA,EAAyDA,EAAkB,GAC9Jc,EAAiB,CAAC/zD,EAAGg0D,EAAQ1+B,KAC/B,IAAIt6B,EAEAA,EADAs6B,GAAa0+B,EACTF,EAAQzkB,EACP2kB,GACAf,MAAAA,EAAyDA,EAAkB,GAAK5jB,GAEhF2jB,MAAAA,EAAiDA,EAAc,GAAK3jB,EAC7E,MAAM4kB,EAAcD,GAAU1+B,EAAYu+B,EAAcjyD,EACxDqP,EAAIQ,YACJR,EAAIS,OAAO1W,EAAGgF,GACdiR,EAAIU,OAAO3W,EAAIi5D,EAAaj0D,GAC5BiR,EAAIikB,UAEFvvB,EAAQnN,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAImE,EAAM6hD,6BAA8B/7D,KAAK25D,sBACvF35D,KAAK0T,WAAWoF,EAAKtL,GAErB,IAAK,IAAItK,EAAO,EAAGA,GAAQ63D,IAAgB73D,EAAM,CAC7C,MAAM24D,OAA6B/4D,IAApBg4D,GAAiC53D,GAAQi4D,EAClDh+B,OAAuCr6B,IAA3Bm4D,GAAwC/3D,GAAQ+3D,EAClEW,EAAe1hD,EAAMo6C,YAAYpxD,GAAO24D,EAAQ1+B,GAGpD,IAAK,IAAIj6B,EAAO,EAAGA,GAAQ83D,IAAe93D,EAAM,CAC5C,MAAM24D,OAA6B/4D,IAApBg4D,GAAiC53D,GAAQk4D,EAClDj+B,OAAsCr6B,IAA1Bo4D,GAAuCh4D,GAAQg4D,EACjEU,EAAe1hD,EAAMo6C,YAAYpxD,GAAO24D,EAAQ1+B,GAEpDn9B,KAAKuU,aAAauE,EAAKtL,GAG3BwuD,gBACI,MAAMljD,EAAM9Y,KAAK0U,eACjBoE,EAAI+1B,UAAU,aACd,IAAK,IAAInnC,EAAI,EAAGA,EAAI1H,KAAKmzC,UAAUruC,OAAQ4C,IAAK,CAC5C,MAAMg/B,EAAW1mC,KAAKmzC,UAAUzrC,GAC1B0J,EAAQs1B,EAAS5pB,aACjB27C,EAAWz4D,KAAK22D,WAAWvlD,GAC3B6qD,EAAgBxD,EAAShlD,WAC/BglD,EAAS/kD,WAAWoF,EAAKmjD,GACzBv1B,EAASrxB,WAAWyD,GACpB4tB,EAASjyB,gBACTgkD,EAASlkD,aAAauE,EAAKmjD,GAE/BnjD,EAAIi3B,aAERkqB,iBACI,MAAM3sB,OAAwBxqC,IAAd9C,KAAKsgC,KACf00B,EAAUh1D,KAAKwY,MAAMgoB,KACrB07B,OAA0Bp5D,IAAd9C,KAAKu5C,KACvB,OAAOjM,GAAW0nB,GAAWkH,EAGjCC,WACI,IAAIpvD,EACJ,MAAM+L,EAAM9Y,KAAK0U,eACjB,IAAKoE,EACD,MAAM,IAAIzW,EAAa,kBAAmB,wCAE9C,GAAIrC,KAAKi6D,iBAAkB,CACvB,MAAM,MAAElyB,EAAK,SAAEC,GAAahoC,KAAKm5D,oBAE3BiD,EAAiBp8D,KAAKsgC,KAAK2I,YAC3BozB,EAAQr8D,KAAKivC,WAKbqtB,OAA0Bx5D,IAAd9C,KAAKwgC,KAAqBxgC,KAAKwgC,KAAKnmB,eAAehD,QAAU,EACzEklD,EAAQv8D,KAAKutC,qBAAuB/F,EAAKgB,KAEvCT,EAAQq0B,EAAiB,EAAIE,EAE7Bt0B,EAAWo0B,EAAiB,EAAIE,EAExCxjD,EAAI+1B,UAAU,YAAQ/rC,EAAW,CAAE05D,aAAa,IAChDx8D,KAAK0T,WAAWoF,EAAK9Y,KAAK85D,gBACL,QAApB/sD,EAAK/M,KAAKwgC,YAAyB,IAAPzzB,GAAyBA,EAAG6N,OAAO9B,EAAKujD,EAAOE,GAC5Ev8D,KAAKuU,aAAauE,EAAK9Y,KAAK85D,gBAC5BhhD,EAAIi3B,cAIZ0sB,gBACI,MAAM3jD,EAAM9Y,KAAK0U,eACjB1U,KAAK22D,WAAWz4C,SAASu6C,IACrB3/C,EAAI+1B,UAAU,gBAAY/rC,EAAW,CAAE05D,aAAa,IACpD/D,EAASpjD,WAAWyD,GAAKnE,OACzBmE,EAAIi3B,gBAGZimB,SAASC,GACL,IAAIlpD,EAIJ,MAAM+L,EAAM9Y,KAAK0U,eACbuhD,GACAj2D,KAAK60D,QAAQ,IAAIrtB,EAAKyuB,IAItBj2D,KAAKi6D,kBAAoBj6D,KAAKsgC,MAC9BtgC,KAAKsgC,KAAKyJ,sBAEdjxB,EAAI+1B,UAAU,YAAQ/rC,EAAW,CAAE05D,aAAa,IAC3B,QAApBzvD,EAAK/M,KAAKsgC,YAAyB,IAAPvzB,GAAyBA,EAAGsI,WAAWyD,GAAKnE,OACzEmE,EAAIi3B,aAKRqlB,mBACI,MAAMsH,EAAuBj6D,MAAM2yD,mBACnC,IAAKp1D,KAAKwY,MAAM8nB,KACZ,OAAOo8B,EAEX,MAAMx0B,EAAiBloC,KAAKutC,mBAC5B,GAAIrF,IAAmBloC,KAAK04D,gCACxB,OAAOgE,EAEX,IAAIC,EAUAA,EARAz0B,IAAmBV,EAAKe,GADR,EASkBvoC,KAAKq2D,QAGnBr2D,KAAKs2D,QAZT,EAepB,MAAMsG,EAAkCD,EAAoB,IAC5D,GAAIC,GAAmC,EACnC,OAAOF,EAEX,MAAMxiD,EAAQla,KAAK8d,WACnB,IAAI++C,EAAwB,GAI5B,OAHa/5D,MAAToX,IACA2iD,EAAwB3iD,EAAMsoB,0BAE3Bk6B,EAAuBE,EAAkCC,EAGpEloD,OACI,IAAI5H,EACJ,GAAuB,IAAnB/M,KAAKqpC,GAAGvkC,OACR,MAAM,IAAIzC,EAAa,YAAa,qCAExC,MAAMyW,EAAM9Y,KAAK0U,eACXooD,EAAS98D,KAAKq7D,oBACd0B,EAAmB/8D,KAAKstC,YAActtC,KAAKu5C,KAEjDv5C,KAAK22D,WAAWz4C,SAASu6C,GAAaA,EAASpwD,KAAKy0D,KAEpD,MAAME,EAAQh9D,KAAKivC,WACE,QAApBliC,EAAK/M,KAAKsgC,YAAyB,IAAPvzB,GAAyBA,EAAG47B,mBAAmBq0B,EAAOA,GAz5B3F,YAAc/5D,GACNjB,GAAUk/B,OACVn+B,EAAI,qBAAsBE,GAw5B1B,CAAE,aAAcjD,KAAKk5D,UAAY,UAAY,SAAUl5D,KAAKsS,MAE5DtS,KAAK0T,aACL1T,KAAK+R,aAAa,KAAM+G,EAAI+1B,UAAU,YAAa7uC,KAAK6R,aAAa,QACrE7R,KAAKy7D,kBACL3iD,EAAI+1B,UAAU,YAAQ/rC,EAAW,CAAE05D,aAAa,IAC5CO,GACA/8D,KAAKg2D,WACTh2D,KAAKy8D,gBACLz8D,KAAKm8D,WACLrjD,EAAIi3B,aACJ/vC,KAAKg8D,gBACLljD,EAAIi3B,aACJ/vC,KAAKuU,eACLvU,KAAKgV,eCv7BN,SAASioD,GAAaC,GACzB,IAAKA,EACD,OAAO,EACX,MAAM1c,EAAS99C,IACf,MAEqC,mBAA7B89C,EAAO2c,mBAAoCD,aAAmB1c,EAAO2c,mBAG1C,mBAAvBD,EAAQ9nD,YAA0D,mBAAtB8nD,EAAQE,UDi7BpEp7D,GAAUk/B,OAAQ,EEx7BX,MAAMm8B,WAAsBzqB,GAC/BvxC,YAAYsS,GACRlR,QAEAzC,KAAKyoD,WAAa,EAClBzoD,KAAKs9D,UAAY3pD,EACZA,EAAQ4pD,OAOTv9D,KAAKu9D,OAAS5pD,EAAQ4pD,OANtBv9D,KAAKu9D,OAAS,CACV9zD,MAAO4zD,GAAc50B,MACrB/+B,OAAQ2zD,GAAc30B,QAOvBD,mBACP,OAAO,IAEAC,oBACP,OAAO,IAEA80B,uCACP,OAAO,MAMX/4D,0BAA0BgF,EAAOC,GAC7B,MAAM+zD,EAAQz9D,KAAKw9D,0BAUnB,OATIr5D,KAAK4E,IAAIU,EAAOC,GAAU+zD,IAC1Bl6D,EAAK,uDAAyDk6D,GAC1Dh0D,EAAQg0D,IACRh0D,EAAQg0D,GAER/zD,EAAS+zD,IACT/zD,EAAS+zD,IAGV,CAACh0D,EAAOC,GAKnB6H,QACIvR,KAAKs9D,UAAUI,UAAU,EAAG,EAAG19D,KAAKu9D,OAAO9zD,MAAOzJ,KAAKu9D,OAAO7zD,QAGlEmlC,UAAU8uB,EAAK3sD,EAAIgC,IAGnB+8B,cAIAxqC,IAAIq4D,IAGJ1pD,aAAa1G,GAET,OADAxN,KAAKs9D,UAAUrpD,UAAYzG,EACpBxN,KAIX69D,uBAAuBrwD,GAEnB,OAAOxN,KAEXoU,eAAe5G,GAEX,OADAxN,KAAKs9D,UAAUnpD,YAAc3G,EACtBxN,KAEX8T,eAAe8jC,GAEX,OADA53C,KAAKs9D,UAAUzpD,YAAc+jC,EACtB53C,KAEXgU,cAAc8pD,GAKV,MAAMl5D,EAAI5E,KAAKs9D,UAAUS,eACnB5mD,EAAQhT,KAAKiH,KAAKxG,EAAEjB,EAAIiB,EAAEjB,EAAIiB,EAAEhB,EAAIgB,EAAEhB,EAAIgB,EAAEqG,EAAIrG,EAAEqG,EAAIrG,EAAES,EAAIT,EAAES,GAEpE,OADArF,KAAKs9D,UAAUvpD,WAAaoD,EAAQ2mD,EAC7B99D,KAEXsU,aAAa7K,GAET,OADAzJ,KAAKs9D,UAAUjpD,UAAY5K,EACpBzJ,KAEXg+D,WAAWC,GAEP,OADAj+D,KAAKs9D,UAAUY,QAAUD,EAClBj+D,KAEXm+D,YAAYC,GAER,OADAp+D,KAAKs9D,UAAUa,YAAYC,GACpBp+D,KAEXmX,MAAMtU,EAAGgF,GAEL,OADA7H,KAAKs9D,UAAUnmD,MAAMtU,EAAGgF,GACjB7H,KAEXq+D,OAAO50D,EAAOC,GACV,MAAM6zD,EAASv9D,KAAKs9D,UAAUC,OACxBe,EAAmB57D,IAAe47D,kBAAoB,EAc5D,OAZC70D,EAAOC,GAAU2zD,GAAckB,mBAAmB90D,EAAQ60D,EAAkB50D,EAAS40D,GAEtF70D,EAASA,EAAQ60D,EAAoB,EACrC50D,EAAUA,EAAS40D,EAAoB,EACvCf,EAAO9zD,MAAQA,EAAQ60D,EACvBf,EAAO7zD,OAASA,EAAS40D,EAGrBrB,GAAaM,KACbA,EAAO/vD,MAAM/D,MAAQA,EAAQ,KAC7B8zD,EAAO/vD,MAAM9D,OAASA,EAAS,MAE5B1J,KAAKmX,MAAMmnD,EAAkBA,GAExCE,KAAK37D,EAAGgF,EAAG4B,EAAOC,GAEd,OADA1J,KAAKs9D,UAAUkB,KAAK37D,EAAGgF,EAAG4B,EAAOC,GAC1B1J,KAEX09C,SAAS76C,EAAGgF,EAAG4B,EAAOC,GAElB,OADA1J,KAAKs9D,UAAU5f,SAAS76C,EAAGgF,EAAG4B,EAAOC,GAC9B1J,KAKX09D,UAAU76D,EAAGgF,EAAG4B,EAAOC,GAEnB,OADA1J,KAAKs9D,UAAUI,UAAU76D,EAAGgF,EAAG4B,EAAOC,GAC/B1J,KAEXsZ,YAEI,OADAtZ,KAAKs9D,UAAUhkD,YACRtZ,KAEXuZ,OAAO1W,EAAGgF,GAEN,OADA7H,KAAKs9D,UAAU/jD,OAAO1W,EAAGgF,GAClB7H,KAEXwZ,OAAO3W,EAAGgF,GAEN,OADA7H,KAAKs9D,UAAU9jD,OAAO3W,EAAGgF,GAClB7H,KAEX0Z,cAAc+kD,EAAMC,EAAMC,EAAMC,EAAM/7D,EAAGgF,GAErC,OADA7H,KAAKs9D,UAAU5jD,cAAc+kD,EAAMC,EAAMC,EAAMC,EAAM/7D,EAAGgF,GACjD7H,KAEXyZ,iBAAiBolD,EAAKC,EAAKj8D,EAAGgF,GAE1B,OADA7H,KAAKs9D,UAAU7jD,iBAAiBolD,EAAKC,EAAKj8D,EAAGgF,GACtC7H,KAEX83C,IAAIj1C,EAAGgF,EAAGq/C,EAAQ6X,EAAYC,EAAUC,GAEpC,OADAj/D,KAAKs9D,UAAUxlB,IAAIj1C,EAAGgF,EAAGq/C,EAAQ6X,EAAYC,EAAUC,GAChDj/D,KAEX2Z,OAEI,OADA3Z,KAAKs9D,UAAU3jD,OACR3Z,KAEX+8B,SAEI,OADA/8B,KAAKs9D,UAAUvgC,SACR/8B,KAEX+3C,YAEI,OADA/3C,KAAKs9D,UAAUvlB,YACR/3C,KAEX+uC,YAAY9qC,GACR,MAAMwL,EAAUzP,KAAKs9D,UAAUvuB,YAAY9qC,GAC3C,IAAI4D,EAAI,EACJ6B,EAAS,EAUb,OATI+F,EAAQyvD,uBACRr3D,GAAK4H,EAAQyvD,sBACbx1D,EAAS+F,EAAQ0vD,uBAAyB1vD,EAAQyvD,wBAGlDr3D,GAAK4H,EAAQ2vD,wBACb11D,EAAS+F,EAAQ4vD,yBAA2B5vD,EAAQ2vD,yBAGjD,CACHv8D,EAAG,EACHgF,EAAGA,EACH4B,MAAOgG,EAAQhG,MACfC,OAAQA,GAGhBomC,SAAS7rC,EAAMpB,EAAGgF,GAEd,OADA7H,KAAKs9D,UAAUxtB,SAAS7rC,EAAMpB,EAAGgF,GAC1B7H,KAEX4T,OAEI,OADA5T,KAAKs9D,UAAU1pD,OACR5T,KAEXwU,UAEI,OADAxU,KAAKs9D,UAAU9oD,UACRxU,KAEPiU,cAAUzG,GACVxN,KAAKs9D,UAAUrpD,UAAYzG,EAE3ByG,gBACA,OAAOjU,KAAKs9D,UAAUrpD,UAEtBE,gBAAY3G,GACZxN,KAAKs9D,UAAUnpD,YAAc3G,EAE7B2G,kBACA,OAAOnU,KAAKs9D,UAAUnpD,YAU1BmB,QAAQ/N,EAAG+F,EAAMC,EAAQC,GACrB,MAAMY,EAAW1B,EAAKsJ,SAASzO,EAAG+F,EAAMC,EAAQC,GAGhD,OAFAxN,KAAKs9D,UAAUtvD,KAAOtB,EAAK6I,YAAYnH,GACvCpO,KAAKyoD,WAAa/7C,EAAK8J,wBAAwBpI,EAASd,MACjDtN,KAGXiW,UACI,OAAOjW,KAAKs9D,UAAUtvD,MC3O9B,MAAMsxD,GAAuB,CACzBC,KAAM,CACF18D,GAAG,EACHgF,GAAG,EACH4B,OAAO,EACPC,QAAQ,EACR,eAAe,EACf,eAAe,EACf,cAAc,EACd,aAAa,GAEjB80D,KAAM,CACF,eAAe,EACf,eAAe,EACf,cAAc,EACd,aAAa,GAEjBv6D,KAAM,CACFwF,OAAO,EACPC,QAAQ,IAIV81D,GAAS,6BACTC,GAAS,EAAIt7D,KAAKC,GA+CjB,MAAMs7D,WAAmB9sB,GAC5BvxC,YAAY67D,GACRz6D,QACAzC,KAAKyJ,MAAQ,EACbzJ,KAAK0J,OAAS,EACd1J,KAAK2/D,oBAAsB,QAE3B3/D,KAAK4/D,cAAgB,GACrB5/D,KAAKk9D,QAAUA,EAEf,MAAM2C,EAAM7/D,KAAKmtC,OAAO,OACxBntC,KAAKk9D,QAAQ4C,YAAYD,GACzB7/D,KAAK6/D,IAAMA,EACX7/D,KAAK+/D,OAAS//D,KAAK6/D,IACnB7/D,KAAK+uD,OAAS,CAAC/uD,KAAK6/D,KACpB7/D,KAAKu/D,KAAO,GACZv/D,KAAKggE,IAAM,CAAEn9D,EAAGsG,IAAKtB,EAAGsB,KACxBnJ,KAAKqU,UAAY,EACjB,MAAM4rD,EAAwB,CAC1B,cAAevzD,EAAKiB,WACpB,YAAajB,EAAKI,KAAO,KACzB,cAAexB,EAAWsC,OAC1B,aAAcrC,EAAUqC,QAE5B5N,KAAKyhC,MAAQphC,OAAO0V,OAAO,CAAEoB,MAAO,CAAEtU,EAAG,EAAGgF,EAAG,IAAOo4D,GACtDjgE,KAAKkgE,WAAa7/D,OAAO0V,OAAO,CAAE,eAAgB,GAAK,mBAAoB,OAAQ4D,KAAM,QAASojB,OAAQ,SAAWkjC,GACrHjgE,KAAKmgE,kBAAoB,CACrB12D,MAAO,EACPmuC,MAAO,SAEX53C,KAAKogE,YAAc,GAEvBjzB,OAAOkzB,GACH,OAAOvyD,SAASwyD,gBAAgBd,GAAQa,GAG5CxxB,UAAU8uB,EAAK3sD,EAAIgC,GACf,MAAMg8C,EAAQhvD,KAAKmtC,OAAO,KAW1B,OAVAntC,KAAK+uD,OAAOl3C,KAAKm3C,GACjBhvD,KAAK+/D,OAAOD,YAAY9Q,GACxBhvD,KAAK+/D,OAAS/Q,EACV2O,GACA3O,EAAMj9C,aAAa,QAAS/N,EAAO25D,IACnC3sD,GACAg+C,EAAMj9C,aAAa,KAAM/N,EAAOgN,IAChCgC,GAASA,EAAMwpD,aACfxN,EAAMj9C,aAAa,iBAAkB,gBAElCi9C,EAEXjf,aACI/vC,KAAK+uD,OAAO7Z,MACZl1C,KAAK+/D,OAAS//D,KAAK+uD,OAAO/uD,KAAK+uD,OAAOjqD,OAAS,GAEnDS,IAAIkM,GACAzR,KAAK+/D,OAAOD,YAAYruD,GAE5ByC,aAAa1G,GAET,OADAxN,KAAKkgE,WAAWvmD,KAAOnM,EAChBxN,KAMX69D,uBAAuBrwD,GAEnB,OADAxN,KAAK2/D,oBAAsBnyD,EACpBxN,KAEXoU,eAAe5G,GAEX,OADAxN,KAAKkgE,WAAWnjC,OAASvvB,EAClBxN,KAEX8T,eAAe8jC,GAEX,OADA53C,KAAKmgE,kBAAkBvoB,MAAQA,EACxB53C,KAOXgU,cAAc8pD,GAEV,OADA99D,KAAKmgE,kBAAkB12D,MAAQq0D,EACxB99D,KAMXsU,aAAa7K,GAGT,OAFAzJ,KAAKkgE,WAAW,gBAAkBz2D,EAClCzJ,KAAKqU,UAAY5K,EACVzJ,KAQXm+D,YAAYoC,GACR,GAAiD,mBAA7ClgE,OAAOS,UAAUmG,SAASjG,KAAKu/D,GAE/B,OADAvgE,KAAKkgE,WAAW,oBAAsBK,EAASl9D,KAAK,KAC7CrD,KAGP,MAAM,IAAIqC,EAAa,gBAAiB,0CAOhD27D,WAAWC,GAEP,OADAj+D,KAAKkgE,WAAW,kBAAoBjC,EAC7Bj+D,KAOXq+D,OAAO50D,EAAOC,GACV1J,KAAKyJ,MAAQA,EACbzJ,KAAK0J,OAASA,EACd1J,KAAKk9D,QAAQ1vD,MAAM/D,MAAQA,EAAMxC,WACjCjH,KAAK6/D,IAAIryD,MAAM/D,MAAQA,EAAMxC,WAC7BjH,KAAK6/D,IAAIryD,MAAM9D,OAASA,EAAOzC,WAC/B,MAAMi5D,EAAa,CACfz2D,MAAAA,EACAC,OAAAA,GAIJ,OAFA1J,KAAKwgE,gBAAgBxgE,KAAK6/D,IAAKK,GAC/BlgE,KAAKmX,MAAMnX,KAAKyhC,MAAMtqB,MAAMtU,EAAG7C,KAAKyhC,MAAMtqB,MAAMtP,GACzC7H,KAEXmX,MAAMtU,EAAGgF,GAYL7H,KAAKyhC,MAAMtqB,MAAQ,CAAEtU,EAAAA,EAAGgF,EAAAA,GACxB,MAAM44D,EAAezgE,KAAKyJ,MAAQ5G,EAC5B69D,EAAgB1gE,KAAK0J,OAAS7B,EAEpC,OADA7H,KAAK2gE,WAAW,EAAG,EAAGF,EAAcC,GAC7B1gE,KAMX2gE,WAAWC,EAAiBhI,EAAMnvD,EAAOC,GACrC,GAA+B,iBAApBk3D,EACP5gE,KAAK6/D,IAAI9tD,aAAa,UAAW6uD,OAEhC,CACD,MAAMC,EAAgBD,EAAkB,IAAMhI,EAAO,IAAMnvD,EAAQ,IAAMC,EACzE1J,KAAK6/D,IAAI9tD,aAAa,UAAW8uD,IAIzCL,gBAAgBtD,EAASgD,GACrB,MAAMY,EAAoBxB,GAAqBpC,EAAQ6D,UACvD,IAAK,MAAMC,KAAYd,EACfY,GAAqBA,EAAkBE,IAG3C9D,EAAQ+D,eAAe,KAAMD,EAAUd,EAAWc,IAEtD,OAAO9D,EAGX3rD,QASI,KAAOvR,KAAK6/D,IAAIqB,WACZlhE,KAAK6/D,IAAIsB,YAAYnhE,KAAK6/D,IAAIqB,WAGlClhE,KAAKmX,MAAMnX,KAAKyhC,MAAMtqB,MAAMtU,EAAG7C,KAAKyhC,MAAMtqB,MAAMtP,GAGpD22D,KAAK37D,EAAGgF,EAAG4B,EAAOC,EAAQw2D,GAElBx2D,EAAS,IACT7B,GAAK6B,EACLA,IAAW,GAEf,MAAM03D,EAAYphE,KAAKmtC,OAAO,QAI9B,OAHA+yB,EAAaA,MAAAA,EAA+CA,EAAa,CAAEvmD,KAAM,OAAQ,eAAgB3Z,KAAKqU,UAAW0oB,OAAQ,SACjI/8B,KAAKwgE,gBAAgBY,EAAW/gE,OAAO0V,OAAO,CAAElT,EAAAA,EAAGgF,EAAAA,EAAG4B,MAAAA,EAAOC,OAAAA,GAAUw2D,IACvElgE,KAAKuF,IAAI67D,GACFphE,KAEX09C,SAAS76C,EAAGgF,EAAG4B,EAAOC,GAClB,MAAMw2D,EAAa,CAAEvmD,KAAM3Z,KAAKkgE,WAAWvmD,MAE3C,OADA3Z,KAAKw+D,KAAK37D,EAAGgF,EAAG4B,EAAOC,EAAQw2D,GACxBlgE,KAEX09D,UAAU76D,EAAGgF,EAAG4B,EAAOC,GAQnB,OADA1J,KAAKw+D,KAAK37D,EAAGgF,EAAG4B,EAAOC,EAAQ,CAAE,eAAgB,EAAGiQ,KAAM3Z,KAAK2/D,sBACxD3/D,KAGXsZ,YAII,OAHAtZ,KAAKu/D,KAAO,GACZv/D,KAAKggE,IAAIn9D,EAAIsG,IACbnJ,KAAKggE,IAAIn4D,EAAIsB,IACNnJ,KAEXuZ,OAAO1W,EAAGgF,GAIN,OAHA7H,KAAKu/D,MAAQ,IAAM18D,EAAI,IAAMgF,EAC7B7H,KAAKggE,IAAIn9D,EAAIA,EACb7C,KAAKggE,IAAIn4D,EAAIA,EACN7H,KAEXwZ,OAAO3W,EAAGgF,GAIN,OAHA7H,KAAKu/D,MAAQ,IAAM18D,EAAI,IAAMgF,EAC7B7H,KAAKggE,IAAIn9D,EAAIA,EACb7C,KAAKggE,IAAIn4D,EAAIA,EACN7H,KAEX0Z,cAAcxQ,EAAIE,EAAIC,EAAIC,EAAIzG,EAAGgF,GAI7B,OAHA7H,KAAKu/D,MAAQ,IAAMr2D,EAAK,IAAME,EAAK,IAAMC,EAAK,IAAMC,EAAK,IAAMzG,EAAI,IAAMgF,EACzE7H,KAAKggE,IAAIn9D,EAAIA,EACb7C,KAAKggE,IAAIn4D,EAAIA,EACN7H,KAEXyZ,iBAAiBvQ,EAAIE,EAAIvG,EAAGgF,GAIxB,OAHA7H,KAAKu/D,MAAQ,IAAMr2D,EAAK,IAAME,EAAK,IAAMvG,EAAI,IAAMgF,EACnD7H,KAAKggE,IAAIn9D,EAAIA,EACb7C,KAAKggE,IAAIn4D,EAAIA,EACN7H,KAEX83C,IAAIj1C,EAAGgF,EAAGq/C,EAAQ6X,EAAYC,EAAUC,GACpC,MAAMoC,EAAKx+D,EAAIqkD,EAAS/iD,KAAKm9D,IAAIvC,GAC3BwC,EAAK15D,EAAIq/C,EAAS/iD,KAAKq9D,IAAIzC,GAIjC,IAAME,GAAoBD,EAAWD,GAAcU,IAC9CR,GAAoBF,EAAaC,GAAYS,GAAS,CACvD,MAAMv2D,EAAKrG,EAAIqkD,EAAS/iD,KAAKm9D,IAAIvC,EAAa56D,KAAKC,IAC7CgF,EAAKvB,EAAIq/C,EAAS/iD,KAAKq9D,IAAIzC,EAAa56D,KAAKC,IAGnDpE,KAAKu/D,MAAQ,IAAI8B,KAAME,MAAOra,KAAUA,WAAgBh+C,KAAME,KAC9DpJ,KAAKu/D,MAAQ,IAAIrY,KAAUA,WAAgBma,KAAME,IACjDvhE,KAAKggE,IAAIn9D,EAAIw+D,EACbrhE,KAAKggE,IAAIn4D,EAAI05D,MAEZ,CACD,MAAMr4D,EAAKrG,EAAIqkD,EAAS/iD,KAAKm9D,IAAItC,GAC3B51D,EAAKvB,EAAIq/C,EAAS/iD,KAAKq9D,IAAIxC,GAGjC,IAAIyC,EAFJ1C,EAAa76D,EAAe66D,GAC5BC,EAAW96D,EAAe86D,GAGtByC,EADAt9D,KAAK6C,IAAIg4D,EAAWD,GAAc56D,KAAKC,GAC/B66D,GAGCA,EAETF,EAAaC,IACbyC,GAASA,GAEb,MAAMC,GAASzC,EACfj/D,KAAKu/D,MAAQ,IAAI8B,KAAME,MAAOra,KAAUA,QAAaua,MAAUC,KAASx4D,KAAME,IAC9EpJ,KAAKggE,IAAIn9D,EAAIqG,EACblJ,KAAKggE,IAAIn4D,EAAIuB,EAEjB,OAAOpJ,KAEX+3C,YAEI,OADA/3C,KAAKu/D,MAAQ,IACNv/D,KAEX2hE,iBACI,MAAMC,EAAK5hE,KAAKmgE,kBAIhB,MAAO,2BAA2ByB,EAAGn4D,MAAQ,SAASm4D,EAAGhqB,SAE7Dj+B,KAAKumD,GACD,MAAMX,EAAOv/D,KAAKmtC,OAAO,QAUzB,YAT0B,IAAf+yB,IACPA,EAAa7/D,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI/V,KAAKkgE,YAAa,CAAEnjC,OAAQ,UAE7EmjC,EAAW76D,EAAIrF,KAAKu/D,KAChBv/D,KAAKmgE,kBAAkB12D,MAAQ,IAC/By2D,EAAW1yD,MAAQxN,KAAK2hE,kBAE5B3hE,KAAKwgE,gBAAgBjB,EAAMW,GAC3BlgE,KAAKuF,IAAIg6D,GACFv/D,KAEX+8B,SACI,MAAMwiC,EAAOv/D,KAAKmtC,OAAO,QACnB+yB,EAAa7/D,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI/V,KAAKkgE,YAAa,CAAEvmD,KAAM,OAAQ,eAAgB3Z,KAAKqU,UAAWhP,EAAGrF,KAAKu/D,OAM7H,OALIv/D,KAAKmgE,kBAAkB12D,MAAQ,IAC/By2D,EAAW1yD,MAAQxN,KAAK2hE,kBAE5B3hE,KAAKwgE,gBAAgBjB,EAAMW,GAC3BlgE,KAAKuF,IAAIg6D,GACFv/D,KAGX+uC,YAAY9qC,GACR,OAAOy7D,GAAWmC,iBAAiB3oD,OAAOjV,EAAMjE,KAAK6/D,IAAK7/D,KAAKkgE,YAEnEpwB,SAAS7rC,EAAMpB,EAAGgF,GACd,IAAK5D,GAAQA,EAAKa,QAAU,EACxB,OAAO9E,KAEX,MAAMkgE,EAAa7/D,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI/V,KAAKkgE,YAAa,CAAEnjC,OAAQ,OAAQl6B,EAAAA,EACnFgF,EAAAA,IACEi6D,EAAM9hE,KAAKmtC,OAAO,QAIxB,OAHA20B,EAAIC,YAAc99D,EAClBjE,KAAKwgE,gBAAgBsB,EAAK5B,GAC1BlgE,KAAKuF,IAAIu8D,GACF9hE,KAGX4T,OAyBI,OAxBA5T,KAAKogE,YAAYvoD,KAAK,CAClB4pB,MAAO,CACH,cAAezhC,KAAKyhC,MAAM,eAC1B,cAAezhC,KAAKyhC,MAAM,eAC1B,aAAczhC,KAAKyhC,MAAM,cACzB,YAAazhC,KAAKyhC,MAAM,aACxBtqB,MAAOnX,KAAKyhC,MAAMtqB,OAEtB+oD,WAAY,CACR,cAAelgE,KAAKkgE,WAAW,eAC/B,cAAelgE,KAAKkgE,WAAW,eAC/B,aAAclgE,KAAKkgE,WAAW,cAC9B,YAAalgE,KAAKkgE,WAAW,aAC7BvmD,KAAM3Z,KAAKkgE,WAAWvmD,KACtBojB,OAAQ/8B,KAAKkgE,WAAWnjC,OACxB,eAAgB/8B,KAAKkgE,WAAW,gBAChC,mBAAoBlgE,KAAKkgE,WAAW,qBAExCC,kBAAmB,CACf12D,MAAOzJ,KAAKmgE,kBAAkB12D,MAC9BmuC,MAAO53C,KAAKmgE,kBAAkBvoB,OAElCvjC,UAAWrU,KAAKqU,YAEbrU,KAGXwU,UACI,MAAMwtD,EAAahiE,KAAKogE,YAAYlrB,MACpC,GAAI8sB,EAAY,CACZ,MAAMvgC,EAAQugC,EACdhiE,KAAKyhC,MAAM,eAAiBA,EAAMA,MAAM,eACxCzhC,KAAKyhC,MAAM,eAAiBA,EAAMA,MAAM,eACxCzhC,KAAKyhC,MAAM,cAAgBA,EAAMA,MAAM,cACvCzhC,KAAKyhC,MAAM,aAAeA,EAAMA,MAAM,aACtCzhC,KAAKyhC,MAAMtqB,MAAQsqB,EAAMA,MAAMtqB,MAC/BnX,KAAKkgE,WAAW,eAAiBz+B,EAAMy+B,WAAW,eAClDlgE,KAAKkgE,WAAW,eAAiBz+B,EAAMy+B,WAAW,eAClDlgE,KAAKkgE,WAAW,cAAgBz+B,EAAMy+B,WAAW,cACjDlgE,KAAKkgE,WAAW,aAAez+B,EAAMy+B,WAAW,aAChDlgE,KAAKkgE,WAAWvmD,KAAO8nB,EAAMy+B,WAAWvmD,KACxC3Z,KAAKkgE,WAAWnjC,OAAS0E,EAAMy+B,WAAWnjC,OAC1C/8B,KAAKkgE,WAAW,gBAAkBz+B,EAAMy+B,WAAW,gBACnDlgE,KAAKkgE,WAAW,oBAAsBz+B,EAAMy+B,WAAW,oBACvDlgE,KAAKmgE,kBAAkB12D,MAAQg4B,EAAM0+B,kBAAkB12D,MACvDzJ,KAAKmgE,kBAAkBvoB,MAAQnW,EAAM0+B,kBAAkBvoB,MACvD53C,KAAKqU,UAAYotB,EAAMptB,UAE3B,OAAOrU,KAEPiU,cAAUzG,GACVxN,KAAKkU,aAAa1G,GAElByG,gBACA,OAAOjU,KAAKkgE,WAAWvmD,KAEvBxF,gBAAY3G,GACZxN,KAAKoU,eAAe5G,GAEpB2G,kBACA,OAAOnU,KAAKkgE,WAAWnjC,OAY3BznB,QAAQ/N,EAAG+F,EAAMC,EAAQC,GACrB,MAAMY,EAAW1B,EAAKsJ,SAASzO,EAAG+F,EAAMC,EAAQC,GAChDxN,KAAK4/D,cAAgBlzD,EAAK6I,YAAYnH,GACtC,MAAM6zD,EAAiB,CACnB,cAAe7zD,EAASV,OACxB,YAAaU,EAASd,KACtB,cAAec,EAASb,OACxB,aAAca,EAASZ,OAI3B,OAFAxN,KAAKkgE,WAAa7/D,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI/V,KAAKkgE,YAAa+B,GACpEjiE,KAAKyhC,MAAQphC,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI/V,KAAKyhC,OAAQwgC,GACnDjiE,KAGXiW,UACI,OAAOjW,KAAK4/D,eCvfb,IAAIsC,GAMAC,GCNAC,GCFAC,GH4fX3C,GAAWmC,iBAAmB,IAje9B,MACIxgE,cAGIrB,KAAKiZ,MAAQ,GAEjBC,OAAOjV,EAAM47D,EAAKK,GACd,IAAI/kD,EAAUnb,KAAKiZ,MAAMhV,QACTnB,IAAZqY,IACAA,EAAU,GACVnb,KAAKiZ,MAAMhV,GAAQkX,GAEvB,MAIMhb,EAAM,GAJG+/D,EAAW,kBACbA,EAAW,gBACTA,EAAW,kBACZA,EAAW,gBAEzB,IAAI7kD,EAAQF,EAAQhb,GAKpB,YAJc2C,IAAVuY,IACAA,EAAQrb,KAAKsiE,YAAYr+D,EAAM47D,EAAKK,GACpC/kD,EAAQhb,GAAOkb,GAEZA,EAEXinD,YAAYr+D,EAAM47D,EAAKK,GACnB,IAAI4B,EAAM9hE,KAAK8hE,IACVA,IAGDA,EAAMh0D,SAASwyD,gBAAgBd,GAAQ,QACvCx/D,KAAK8hE,IAAMA,GAEfA,EAAIC,YAAc99D,EAClB69D,EAAIb,eAAe,KAAM,cAAef,EAAW,gBACnD4B,EAAIb,eAAe,KAAM,YAAaf,EAAW,cACjD4B,EAAIb,eAAe,KAAM,aAAcf,EAAW,eAClD4B,EAAIb,eAAe,KAAM,cAAef,EAAW,gBACnDL,EAAIC,YAAYgC,GAChB,MAAM9qD,EAAO8qD,EAAIS,UAEjB,OADA1C,EAAIsB,YAAYW,GACT,CAAEj/D,EAAGmU,EAAKnU,EAAGgF,EAAGmP,EAAKnP,EAAG4B,MAAOuN,EAAKvN,MAAOC,OAAQsN,EAAKtN,UChEvE,SAAWw4D,GACPA,EAAiBA,EAAyB,OAAI,GAAK,SACnDA,EAAiBA,EAAsB,IAAI,GAAK,MAFpD,CAGGA,KAAqBA,GAAmB,KAG3C,SAAWC,GACPA,EAAoBA,EAA0B,KAAI,GAAK,OACvDA,EAAoBA,EAAwB,GAAI,GAAK,KACrDA,EAAoBA,EAA0B,KAAI,GAAK,OAH3D,CAIGA,KAAwBA,GAAsB,KAI1C,MAAMK,GACTnhE,YAAYohE,EAAMC,GACd,GzCoBgCzhE,EyCpBZwhE,EzCoB4BhhE,EAASmxC,eyClBrD5yC,KAAK8Y,IAAM2pD,MAEV,CACD,QAAa3/D,IAAT4/D,EAEA,MAAM,IAAIrgE,EAAa,kBAAmB,4BAE9C,MAAMsgE,EAAUD,EAChB,IAAIxF,EACJ,GAAmB,iBAARuF,EAAkB,CACzB,MAAMG,EAAe90D,SAAS8D,eAAe6wD,GAC7C,IAAKG,EACD,MAAM,IAAIvgE,EAAa,eAAgB,+BAA+BugE,MAE1E1F,EAAU0F,OAGV1F,EAAUuF,EAGd,GAAIE,IAAYH,GAASK,SAASC,OAAQ,CACtC,IAAK7F,GAAaC,GACd,MAAM,IAAI76D,EAAa,aAAc,iDAEzC,MAAMsR,EAAUupD,EAAQ9nD,WAAW,MACnC,IAAKzB,EACD,MAAM,IAAItR,EAAa,aAAc,4BAEzCrC,KAAK8Y,IAAM,IAAIukD,GAAc1pD,OAE5B,IAAIgvD,IAAYH,GAASK,SAASE,IAOnC,MAAM,IAAI1gE,EAAa,iBAAkB,2BAA2BsgE,KANpE,IHrCT,SAAmBzF,GACtB,IAAKA,EACD,OAAO,EACX,MAAM1c,EAAS99C,IACf,MAEkC,mBAA1B89C,EAAOwiB,gBAAiC9F,aAAmB1c,EAAOwiB,gBAEtC,mBAAxB9F,EAAQ4C,aAAuD,iBAAlB5C,EAAQ1vD,MG6BhDy1D,CAAU/F,GACX,MAAM,IAAI76D,EAAa,aAAc,2CAEzCrC,KAAK8Y,IAAM,IAAI4mD,GAAWxC,KAOtCz4D,oBAAoBy+D,EAAWP,EAASl5D,EAAOC,EAAQy5D,EAAa,QAChE,MAAMC,EAAW,IAAIZ,GAASU,EAAWP,GACrCl5D,GAASC,GACT05D,EAAS/E,OAAO50D,EAAOC,GAE3B,MAAMoP,EAAMsqD,EAAShuD,aAGrB,OAFA0D,EAAI+kD,uBAAuBsF,GAC3BX,GAASa,YAAcvqD,EAChBA,EAEXrU,wBAAwBy+D,EAAWz5D,EAAOC,EAAQy5D,GAC9C,OAAOX,GAASc,aAAaJ,EAAWV,GAASK,SAASC,OAAQr5D,EAAOC,EAAQy5D,GAErF1+D,qBAAqBy+D,EAAWz5D,EAAOC,EAAQy5D,GAC3C,OAAOX,GAASc,aAAaJ,EAAWV,GAASK,SAASE,IAAKt5D,EAAOC,EAAQy5D,GAKlF1+D,sBAAsBkP,EAAS4vD,EAAOC,EAAOC,EAAKC,EAAKC,GACnDhwD,EAAQ2F,YACR,MAAMsqD,EAAKH,EAAMF,EACXM,EAAKH,EAAMF,EACXM,EAAQ3/D,KAAK4/D,MAAMF,EAAID,GAC7B,IAAI/gE,EAAI0gE,EACJ17D,EAAI27D,EACR7vD,EAAQ4F,OAAOgqD,EAAOC,GACtB,IAAIQ,EAAM,EACNrvD,GAAO,EACX,OAAUivD,EAAK,EAAI/gE,GAAK4gE,EAAM5gE,GAAK4gE,MAASI,EAAK,EAAIh8D,GAAK67D,EAAM77D,GAAK67D,IAAO,CACxE,MAAMO,EAAaN,EAAYK,IAAQL,EAAY7+D,QAC7Co/D,EAAKrhE,EAAIsB,KAAKm9D,IAAIwC,GAASG,EACjCphE,EAAI+gE,EAAK,EAAIz/D,KAAK4E,IAAI06D,EAAKS,GAAM//D,KAAKqlC,IAAIi6B,EAAKS,GAC/C,MAAMC,EAAKt8D,EAAI1D,KAAKq9D,IAAIsC,GAASG,EACjCp8D,EAAIg8D,EAAK,EAAI1/D,KAAK4E,IAAI26D,EAAKS,GAAMhgE,KAAKqlC,IAAIk6B,EAAKS,GAC3CxvD,EACAhB,EAAQ6F,OAAO3W,EAAGgF,GAGlB8L,EAAQ4F,OAAO1W,EAAGgF,GAEtB8M,GAAQA,EAEZhB,EAAQokC,YACRpkC,EAAQopB,SAEZshC,OAAO50D,EAAOC,GAEV,OADA1J,KAAK8Y,IAAIulD,OAAO50D,EAAOC,GAChB1J,KAEXoV,aACI,OAAOpV,KAAK8Y,KAGpB0pD,GAASK,SAAWX,GACpBM,GAAS4B,YAAcjC,GAIvBK,GAASa,iBAAcvgE,EGlHhB,MAAMuhE,WAAqB9oD,EAC9Bla,YAAYgoD,GACR5mD,QACAzC,KAAKskE,cAAgBjb,EACrBrpD,KAAKwc,SAAS,IACdxc,KAAKyb,SAAWF,EAASG,SAASO,MAClCjc,KAAKoX,QAAU,EACfpX,KAAKqX,QAAU,EACfrX,KAAKwb,UAAY,EACjBxb,KAAKugC,YAAc,EACnBvgC,KAAKkoD,SAAW,EAChBloD,KAAKkpC,SAAW,EAChBlpC,KAAKukE,QAAS,EACdvkE,KAAKwkE,IAAMhC,GAAS4B,YAAYnoB,KAChCj8C,KAAKknD,OAAS,EACdlnD,KAAKkW,YAEE5U,sBACP,OAAOG,EAAS4iE,aAGT50D,qBACP,OAAO8sB,EAAOoF,mBAAmB7xB,aAAaK,OAAOs0D,aAIzDhgE,cAAc0jD,EAAM1mB,GAChB,MAAMK,EAAaL,EAAMK,WACnBuM,EAAc5M,EAAM4M,YAE1B,IAAK8Z,GAAwB,IAAhBA,EAAKrjD,OACd,OAAO,EACX,MAAMsjD,EAAY,GAClB,IAAIC,EAAY,KACZqc,EAAa,EACb56C,EAAc,EAElB,IAAK,IAAIpiB,EAAI,EAAGA,EAAIygD,EAAKrjD,SAAU4C,EAAG,CAClC,MAAMye,EAAMgiC,EAAKzgD,GACXgV,EAAOyJ,EAAI1J,UACX+rC,EAAMriC,EAAI/I,cAChB,IAAKrb,EAAY2a,GACb,MAAM,IAAIra,EAAa,eAE3B,MAAM+O,EAAQ+U,EAAIrJ,aACZslB,EAAQ1lB,EAAK2lB,cAAcjxB,GAC3BikC,EAAK34B,EAAKM,qBACVowB,EAAoC,EAAbjnB,EAAI+gC,OAAc3qB,EAAOuC,oBAAsB,GAW5E,GAVIuW,IACImT,IAAQ9xC,EAAiBuF,OACzBkK,EAAI3K,UAAY65B,EAAG2E,WAAW/L,cAC9BxM,EAAMwM,eAAiBb,GAElBob,IAAQ9xC,EAAiByF,QAC9BgK,EAAI3K,UAAY65B,EAAG2E,WAAWx+B,UAC9BimB,EAAMjmB,WAAa4xB,IAGvB1wB,IAAS2rC,EAAW,CACpB,IAAK,IAAIvkD,EAAI,EAAGA,EAAI4Y,EAAKpK,KAAKxN,SAAUhB,EACjB,IAAfg+B,IACA4iC,EAAavgE,KAAK4E,IAAI2T,EAAK4lB,yBAA0BoiC,IAErC,IAAhBr2B,IACAvkB,EAAc3lB,KAAK4E,IAAI2T,EAAKk8B,0BAA2B9uB,IAG/Du+B,EAAY3rC,EAEhB,MAAMioD,EAA6BviC,EAAMl/B,KACzCklD,EAAUvwC,KAAK,CACX2wC,IAAAA,EACA9rC,KAAAA,EACAyJ,IAAAA,EACAjjB,KAAMyhE,EACNxiC,OAAQuiC,EACRhc,OAAQ5+B,IAIhBs+B,EAAUxlB,MAAK,CAACj/B,EAAGC,IAAMA,EAAEV,KAAOS,EAAET,OACpC,IAAI0hE,EAAa,EACb1R,EAAW,EACXC,EAAW,EACXxL,EAAY,KACZC,EAAY,KAChB,IAAK,IAAIlgD,EAAI,EAAGA,EAAI0gD,EAAUtjD,SAAU4C,EAAG,CACvC,IAAIuhD,EAAY,EAChB,MAAMvsC,EAAO0rC,EAAU1gD,GAAGgV,KACpB8rC,EAAMJ,EAAU1gD,GAAG8gD,IACnBriC,EAAMiiC,EAAU1gD,GAAGye,IACnBjjB,EAAOklD,EAAU1gD,GAAGxE,KACpBwlD,EAASN,EAAU1gD,GAAGghD,OAExBxlD,IAASykD,GAAajrC,IAASkrC,IAC/Bgd,EAAav2B,EAAcqa,GAE/B,MAAMmc,EAAY1+C,EAAI5J,WApEN,EAqEZisC,IAAQjtC,EAASG,SAASC,MAC1BwK,EAAIhM,UAAU2nB,GACdmnB,EAAYyb,EAAaG,EACzB3R,EAAWjK,EAAYiK,EAAWjK,EAAYiK,GAEzC1K,IAAQjtC,EAASG,SAASY,QAC/B6J,EAAIhM,UAAUyqD,GACd3b,GAAa4b,EACb1R,EAAWlK,EAAYkK,EAAWlK,EAAYkK,GAElDxL,EAAYzkD,EACZ0kD,EAAYlrC,EAIhB,OAFA+kB,EAAMK,YAAcoxB,EACpBzxB,EAAM4M,aAAe8kB,GACd,EAEX2R,eAAeN,GAIX,OAHIA,GAAOhC,GAAS4B,YAAYnoB,MAAQuoB,GAAOhC,GAAS4B,YAAY57B,OAChExoC,KAAKwkE,IAAMA,GAERxkE,KAEX+kE,gBAAgB1b,GAEZ,OADArpD,KAAKskE,cAAgBjb,EACdrpD,KAEX0pD,WAAW7mD,GAEP,OADA7C,KAAKkoD,SAAWrlD,EACT7C,KAEX2pD,WAAW9hD,GAEP,OADA7H,KAAKkpC,SAAWrhC,EACT7H,KAEXglE,YAAYtoD,GAER,OADA1c,KAAK4nD,UAAYlrC,EACV1c,KAEXilE,UAAUV,GAEN,OADAvkE,KAAKukE,OAASA,EACPvkE,KAEX2U,OACI,MAAMmE,EAAM9Y,KAAK0U,eACXgI,EAAO1c,KAAK2c,oBAClB3c,KAAKgV,cACL,MAAMoyB,EAAQ1qB,EAAK2qB,mBAAmBrnC,KAAKyb,SAAUzb,KAAKoR,OACpDi8B,EAAgB3wB,EAAK4wB,UAAY5wB,EAAK6wB,mBAAqB/F,EAAKe,GACtE,IAAIqV,EAAQxW,EAAMvkC,EAAI7C,KAAKoX,QAAUpX,KAAKkoD,SACtChZ,EAAW,GACXxyB,EAAK4wB,YACL4B,EAAWxyB,EAAK2yB,YAAYlG,cAEhC,IAAI2U,EAAQ1W,EAAMv/B,EAAI7H,KAAKqX,QAAUrX,KAAKkpC,SAC1C,OAAQlpC,KAAKyb,UACT,KAAKF,EAASG,SAASO,MAGf6hC,EADWphC,EAAK4yB,QACLC,QAAO,CAAC5rC,EAAGC,IAAOD,EAAIC,EAAID,EAAIC,IACrC8Y,EAAK4wB,WAAaD,GAAiB7F,EAAKe,KACxCuV,EAAQ5O,EAASxF,KAAO26B,GAAa50D,QAAQy1D,aAEjDpnB,GAAS99C,KAAKknD,OAASmd,GAAa50D,QAAQ01D,gBAAkBnlE,KAAKwb,UAAY+gB,EAAOuC,oBAE1F,MACJ,KAAKvjB,EAASG,SAASS,MAGf2hC,EADWphC,EAAK4yB,QACLC,QAAO,CAAC5rC,EAAGC,IAAOD,EAAIC,EAAID,EAAIC,IACrC8Y,EAAK4wB,WAAaD,GAAiB7F,EAAKgB,OACxCsV,EAAQ5O,EAASxF,KAAO26B,GAAa50D,QAAQy1D,aAEjDpnB,GAAS99C,KAAKknD,OAASmd,GAAa50D,QAAQ01D,gBAAkBnlE,KAAKwb,UAAY+gB,EAAOuC,oBAE1F,MACJ,KAAKvjB,EAASG,SAASC,KACnBiiC,GAAS59C,KAAKknD,OAAS,EAAImd,GAAa50D,QAAQ21D,YAChD,MACJ,KAAK7pD,EAASG,SAASY,MACnBshC,GAAS59C,KAAKknD,OAAS,EAAImd,GAAa50D,QAAQ41D,aAChD,MACJ,QACI,MAAM,IAAIhjE,EAAa,kBAAmB,gBAAgBrC,KAAKyb,uBAEvE3C,EAAIlF,OACJkF,EAAIQ,YACJR,EAAIg/B,IAAI8F,EAAOE,EAAO99C,KAAKknD,OAAQ,EAAa,EAAV/iD,KAAKC,IAAQ,GACnD0U,EAAIxE,aAAa,KACjBwE,EAAIikB,SACJjkB,EAAIxD,QAAQtV,KAAKwV,UACjB,MAAM3S,EAAI+6C,EAAQ9kC,EAAIi2B,YAAY/uC,KAAKskE,eAAe76D,MAAQ,EAC9DqP,EAAIg3B,SAAS,GAAK9vC,KAAKskE,cAAezhE,EAAGi7C,EAAQ,KACjD,MAAMkL,EAAWhpD,KAAK4nD,UACtB,GAAI3lD,EAAgB+mD,GAAW,CAE3B,MAAMnM,EAAMmM,EAAS/Z,WAAavyB,EAAKzU,OAAS,EAUhD,IAAIq9D,EACAC,EACJ,OAXAzsD,EAAI1E,eAAe,WACnB0E,EAAIklD,WAAW,SACfllD,EAAIxE,aAAa,IACbtU,KAAKukE,OACL/B,GAASgD,eAAe1sD,EAAK8kC,EAAQ,GAAIE,EAAOF,EAAQf,EAAKiB,EAAO,CAAC,EAAG,IAGxE0kB,GAASgD,eAAe1sD,EAAK8kC,EAAQ,GAAIE,EAAOF,EAAQf,EAAKiB,EAAO,CAAC,EAAG,IAIpE99C,KAAKwkE,KACT,KAAKhC,GAAS4B,YAAY77B,GACtB+8B,GAAO,GACPC,EAAUvlE,KAAKukE,OAAS,CAAC,EAAG,GAAK,CAAC,EAAG,GACrC/B,GAASgD,eAAe1sD,EAAK8kC,EAAQf,EAAKiB,EAAOF,EAAQf,EAAKiB,EAAQwnB,EAAKC,GAC3E,MACJ,KAAK/C,GAAS4B,YAAY57B,KACtB88B,EAAM,GACNC,EAAUvlE,KAAKukE,OAAS,CAAC,EAAG,GAAK,CAAC,EAAG,GACrC/B,GAASgD,eAAe1sD,EAAK8kC,EAAQf,EAAKiB,EAAOF,EAAQf,EAAKiB,EAAQwnB,EAAKC,IAMvFzsD,EAAItE,WAGZ6vD,GAAa3uD,UAAY,CACrBhI,OAAQhB,EAAKiB,WACbL,KAAMZ,EAAKI,KACXS,OAAQjC,EAAW2gC,KACnBz+B,MAAOjC,EAAUqC,QCtOd,MAAM63D,WAAelqD,EACxBla,YAAY4P,EAAMiH,GACdzV,QACAzC,KAAKkY,QAAU7X,OAAO0V,OAAO,CAAE2vD,YAAY,GAAQxtD,GAEnDlY,KAAK0lE,WAAa1lE,KAAKkY,QAAQwtD,WAE/B1lE,KAAKiR,KAAOA,EACZjR,KAAKyb,SAAWF,EAASG,SAASC,KAClC3b,KAAKmhC,eAAiB,CAClBC,WAAY,IAEhBphC,KAAKkW,YACLlW,KAAKma,UAAU,GACfna,KAAKwc,SAAS,IAEPlb,sBACP,OAAOG,EAASgkE,OAGpBhhE,cAAckhE,EAASlkC,GACnB,MAAMK,EAAaL,EAAMK,WAEzB,IAAK6jC,GAA8B,IAAnBA,EAAQ7gE,OACpB,OAAO,EACX,MAAM8gE,EAAaD,EAAQpzD,KAAKwqB,IAC5B,MAAMrgB,EAAOqgB,EAAOtgB,UACdrL,EAAQ2rB,EAAOjgB,aACrB,GAAI/a,EAAY2a,GAAO,CAEnB,MAAM,KAAExZ,GAASwZ,EAAK2lB,cAAcjxB,GAEpC,MAAO,CAAElO,KAAAA,EAAM8B,MADD0X,EAAK4lB,yBACGvF,OAAAA,GAErB,GAAI56B,EAAUua,GAAO,CAEtB,MAAQjV,IAAKo+D,GAAWnpD,EAAKopD,eAAe10D,GAC5C,MAAO,CAAElO,KAAM2iE,EAAQ7gE,MAAO,EAAG+3B,OAAAA,GAGjC,MAAM,IAAI16B,EAAa,WAAY,2BAGrC0jE,EAAcjkC,EAEdtnB,EAASorD,EAAWr2B,QAAO,CAAC/0B,GAAUuiB,OAAAA,EAAQ/3B,MAAAA,MAChD+3B,EAAO5iB,UAAU4rD,EAAc/gE,GACxBb,KAAK4E,IAAIg0B,EAAOxgB,WAzBJ,EAyBiC/B,KACrD,GAEH,OADAinB,EAAMK,YAActnB,GACb,EAEX4C,cACI,OAAOpd,KAAKyb,SAEhBuqD,WAAWtpD,GAEP,OADA1c,KAAKimE,SAAWvpD,EACT1c,KAEX2U,OACI,MAAMmE,EAAM9Y,KAAK0U,eACXgI,EAAO1c,KAAK2c,oBAClB3c,KAAKgV,cACL,MAAMoyB,EAAQ1qB,EAAK2qB,mBAAmBrnC,KAAKyb,SAAUzb,KAAKoR,OAC1D,IAAIi4B,EAAK3sB,EAAK4yB,QACV5F,EAAOtC,EAAMv/B,EACb21C,EAAOpW,EAAMv/B,EACjB,MAAMhF,EAAIukC,EAAMvkC,EAAI,EACdqjE,EAAaxpD,EAAK3B,aAAaynB,yBAC/B3E,EAAQ79B,KAAKkd,uBAAuB08B,WAAWl9B,EAAKvJ,eAC1D,IAAK,IAAIzL,EAAI,EAAGA,EAAIm2B,EAAM/4B,OAAQ4C,IAAK,CACnC,MAAMgV,EAAOmhB,EAAMn2B,GACnB,GAAI7F,EAAO6a,GAAO,CAGd2sB,EAAK3sB,EAAK4yB,QACV,IAAK,IAAIxrC,EAAI,EAAGA,EAAIulC,EAAGvkC,OAAQhB,KACvB9D,KAAK0c,OAASmhB,EAAMn2B,IAAM1H,KAAK0lE,cAC/Bh8B,EAAOvlC,KAAKqlC,IAAIE,EAAML,EAAGvlC,IACzB05C,EAAOr5C,KAAK4E,IAAIy0C,EAAMnU,EAAGvlC,MAKzC,IAAIqiE,EAAQ,GACRC,EAAgB,EAChBC,EAAU,EACVrc,EAAe,EACfsc,EAAS,EACb,OAAQtmE,KAAKiR,MACT,KAAKw0D,GAAOc,KAAKC,WACbL,EAAQ,mBACRC,GAAiB,EACjBC,EAAU38B,EAAOw8B,EAAa,EAAI,GAClC1oB,GAAQ0oB,EAAa,EACrB,MACJ,KAAKT,GAAOc,KAAKE,SACbN,EAAQ,qBACRC,EAAgB,GAChBC,EAAU7oB,EAAO0oB,EAAa,EAC9Bx8B,GAAQw8B,EAAa,EACrB,MACJ,KAAKT,GAAOc,KAAKG,UACjB,KAAKjB,GAAOc,KAAKI,cACbR,EAAQ,mBACRC,GAAiB,EACjBpc,EAAehqD,KAAKoX,QAAUgvD,EAAgB,EAC1CrkE,EAAY2a,IACZgtB,GAAQ,IAAMw8B,EAEV1oB,IADCA,EAAO9T,GAAQ,GAAM,EACd,GAAMw8B,EAGNA,EAEZG,EAAU38B,EAAOw8B,EACjBI,EAAS9oB,EAAO0oB,EAAa,IAG7Bx8B,GAAQ,IAAMw8B,EACd1oB,GAAQ0oB,EACRG,EAAU38B,EAAO,IAAOw8B,EACxBI,EAAS9oB,EAAO,IAAO0oB,GAE3B,MACJ,KAAKT,GAAOc,KAAKK,QACjB,KAAKnB,GAAOc,KAAKM,YACbV,EAAQ,qBACRC,GAAiB,EACjBpc,EAAehqD,KAAKoX,QAAUgvD,EAAgB,EAC1CrkE,EAAY2a,IACZ2pD,EAAUH,EAAa,EACvBx8B,GAAQ,GAAMw8B,GACT1oB,EAAO9T,GAAQ,GAAM,IACtB8T,GAAQ0oB,EAAa,GAEzBG,EAAU7oB,EAAO,GAAM0oB,EACvBI,EAAS58B,EAAO,KAAOw8B,IAGvBx8B,GAAQ,IAAOw8B,EACf1oB,GAAQ,GAAM0oB,EACdG,EAAU7oB,EAAO,IAAO0oB,EACxBI,EAAS58B,EAAOw8B,GAEpB,MACJ,KAAKT,GAAOc,KAAKO,uBACbp9B,GAAQ,GAAMw8B,EACd1oB,GAAQ0oB,EACR,MACJ,QACI,MAAM,IAAI7jE,EAAa,cAAe,mBAAmBrC,KAAKiR,uBAEtE,IAAI81D,EAAa,WAEjB,GAAI/mE,KAAKiR,OAASw0D,GAAOc,KAAKC,YAAcxmE,KAAKiR,OAASw0D,GAAOc,KAAKE,SAClE3tD,EAAI4kC,SAAS76C,EAAI7C,KAAKoX,QAASsyB,EAAM,EAAG8T,EAAO9T,QAI/C,GADAq9B,EAAa,SACThlE,EAAY2a,GACZ,IAAK,IAAIhV,EAAIgiC,EAAMhiC,GAAK81C,EAAM91C,GAAKw+D,EAC/BpvD,EAAMu8C,YAAYv6C,EAAKjW,EAAI7C,KAAKoX,QAAU,EAAG1P,EAAG1H,KAAKmhC,eAAeC,WAAY,2BAGnF,CACD,IAAI15B,EACJ,IAAKA,EAAIgiC,EAAMhiC,GAAK81C,EAAM91C,GAAK,GAC3BoP,EAAMu8C,YAAYv6C,EAAKjW,EAAI7C,KAAKoX,QAAU,EAAG1P,EAAG1H,KAAKmhC,eAAeC,WAAY,uBAEhFphC,KAAKiR,OAASw0D,GAAOc,KAAKI,gBAC1BL,EAAS5+D,EAAI,IAAOw+D,GAI5BlmE,KAAKiR,OAASw0D,GAAOc,KAAKO,yBAI9BhwD,EAAMu8C,YAAYv6C,EAAKjW,EAAI7C,KAAKoX,QAAUgvD,EAAeC,EAASrmE,KAAKmhC,eAAeC,WAAY+kC,EAAO,CACrGjlE,SAAU,UAAUilE,KAASY,MAG7B/mE,KAAKiR,OAASw0D,GAAOc,KAAKI,eAAiB3mE,KAAKiR,OAASw0D,GAAOc,KAAKM,cACrE/tD,EAAIlF,OACJkF,EAAIxD,QAAQtV,KAAKwV,UACjBsD,EAAIg3B,SAAS,IAAKjtC,EAAImnD,EAAcsc,GACpCxtD,EAAItE,aAIhBixD,GAAOc,KAAO,CACVC,WAAY,EACZC,SAAU,EACVC,UAAW,EACXE,QAAS,EACTD,cAAe,EACfE,YAAa,EACbC,uBAAwB,GAE5BrB,GAAO/vD,UAAY,CACfhI,OAAQhB,EAAK8D,MACblD,KAAMZ,EAAKI,KACXS,OAAQjC,EAAW2gC,KACnBz+B,MAAOjC,EAAUoD,QC/Md,MAAMq4D,WAAgBzrD,EACzBla,cACIoB,QACAzC,KAAKyb,SAAWF,EAASG,SAASY,MAClCtc,KAAKmhC,eAAiB,CAClB8lC,OAAO,EACPC,cAAe,GACfC,YAAa,EACbC,WAAY,EACZC,WAAY,GAEhBrnE,KAAKsnE,gBAAgBtnE,KAAKmhC,eAAe+lC,eAElC5lE,sBACP,OAAOG,EAASulE,QAGpBviE,cAAc8iE,EAAU9lC,EAAO9tB,GAC3B,IAAK4zD,GAAgC,IAApBA,EAASziE,OACtB,OAAO,EAEX,IAAI0W,EAAYimB,EAAMwM,cAClBxkC,EAAQ,EACRzE,EAAQy8B,EAAM4M,YAAc,EAEhC,MAAMqQ,EAAQ/qC,EAAQimC,WAAWqE,GAAK38C,UACtC,GAAIo9C,GAASA,EAAM55C,OAAS,EAAG,CAE3B0W,GADmBkjC,EAAMnsC,KAAK6Q,GAAOA,EAAG27B,kBAAiBxP,QAAO,CAAC5rC,EAAGC,IAAOD,EAAIC,EAAID,EAAIC,IAAM24B,EAAOuC,oBAC9D,OAGtC2C,EAAMwM,eAAiB,EAG3B,IAAK,IAAIvmC,EAAI,EAAGA,EAAI6/D,EAASziE,SAAU4C,EAAG,CACtC,MAAM8/D,EAAUD,EAAS7/D,GACzB8/D,EAAQrtD,UAAUnV,GAClBwiE,EAAQlqD,YAAY9B,GACpB/R,GAAS+9D,EAAQjrD,WACjBvX,GAASyE,EAGb,OADAg4B,EAAM4M,aAAe5kC,GACd,EAGXg+D,SAASR,GAEL,OADAjnE,KAAKmhC,eAAe8lC,MAAQA,EACrBjnE,KAGXsnE,gBAAgB79D,GAGZ,OAFAzJ,KAAKmhC,eAAe+lC,cAAgBz9D,EACpCzJ,KAAKwc,SAAS/S,GACPzJ,KAGX2U,OACI,MAAMmE,EAAM9Y,KAAK0U,eACXgI,EAAO1c,KAAK2c,oBAClB3c,KAAKgV,cACL,MACM0yD,EADQhrD,EAAK2qB,mBAAmB9rB,EAASG,SAASY,MAAOtc,KAAKoR,OACnDvO,EAAI7C,KAAKoX,QACpBuwD,EAAKjrD,EAAK+yB,eAAezvC,KAAKwb,WAAa,EACjDwrD,GAAQY,cAAc9uD,EAAK4uD,EAAIC,EAAI3nE,KAAKmhC,gBAM5C18B,qBAAqBqU,EAAKjW,EAAGgF,EAAGggE,GAC5B,MAAM,MAAEZ,EAAK,cAAEC,EAAa,WAAEE,EAAU,WAAEC,EAAU,YAAEF,GAAgBU,EAChEC,EAAYZ,EAAgBE,EAElC,IAAI1/D,EACJ,GAFAoR,EAAIQ,YAEA2tD,EAAO,CAEP,IADAnuD,EAAIS,OAAO1W,EAAGgF,EAAIw/D,EAAa,GAC1B3/D,EAAI,EAAGA,EAAIogE,EAAY,IAAKpgE,EAC7BoR,EAAIU,OAAO3W,EAAIukE,EAAYv/D,EAAIs/D,EAAc,GAC7CtkE,GAAKukE,EACLtuD,EAAIU,OAAO3W,EAAIukE,EAAYv/D,EAAIs/D,EAAc,GAC7CtkE,GAAKukE,EAET,IAAK1/D,EAAI,EAAGA,EAAIogE,EAAY,IAAKpgE,EAC7BoR,EAAIU,OAAO3W,EAAIukE,EAAYv/D,EAAIs/D,EAAc,EAAIE,EAAa,GAC9DxkE,GAAKukE,EACLtuD,EAAIU,OAAO3W,EAAIukE,EAAYv/D,EAAIs/D,EAAc,EAAIE,EAAa,GAC9DxkE,GAAKukE,EAETtuD,EAAIa,WAEH,CAED,IADAb,EAAIS,OAAO1W,EAAGgF,EAAIw/D,GACb3/D,EAAI,EAAGA,EAAIogE,EAAY,IAAKpgE,EAC7BoR,EAAIW,iBAAiB5W,EAAIukE,EAAa,EAAGv/D,EAAIs/D,EAAc,EAAGtkE,EAAIukE,EAAYv/D,GAC9EhF,GAAKukE,EACLtuD,EAAIW,iBAAiB5W,EAAIukE,EAAa,EAAGv/D,EAAIs/D,EAAc,EAAGtkE,EAAIukE,EAAYv/D,GAC9EhF,GAAKukE,EAET,IAAK1/D,EAAI,EAAGA,EAAIogE,EAAY,IAAKpgE,EAC7BoR,EAAIW,iBAAiB5W,EAAIukE,EAAa,EAAGv/D,EAAIs/D,EAAc,EAAIE,EAAYxkE,EAAIukE,EAAYv/D,EAAIw/D,GAC/FxkE,GAAKukE,EACLtuD,EAAIW,iBAAiB5W,EAAIukE,EAAa,EAAGv/D,EAAIs/D,EAAc,EAAIE,EAAYxkE,EAAIukE,EAAYv/D,EAAIw/D,GAC/FxkE,GAAKukE,EAETtuD,EAAIa,SCtFhB,SAAS,MAAK1W,GACN8kE,GAAgB7mC,OAChBn+B,EAAI,2BAA4BE,GAEjC,MAAM8kE,GACT1mE,cAEIrB,KAAKyhC,MAAQ,CACTK,WAAY,EACZuM,YAAa,EACb7yB,UAAW,EACXyyB,cAAe,GAGnBjuC,KAAKgoE,QAAU,GACfhoE,KAAK01C,cAAe,EACpB11C,KAAK41C,eAAgB,EACrB51C,KAAKioE,WAAY,EACjBjoE,KAAKyJ,MAAQ,EACbzJ,KAAKmvC,QAAU,EAEnBvI,YAAYshC,GAER,OADA,GAAE,qDACKloE,KAAKs1C,UAAU4yB,GAQ1B5yB,UAAU4yB,GACN,MAAMhnE,EAAWgnE,EAAO/0D,cAOxB,OANKnT,KAAKgoE,QAAQ9mE,KACdlB,KAAKgoE,QAAQ9mE,GAAY,IAE7BlB,KAAKgoE,QAAQ9mE,GAAU2W,KAAKqwD,GAC5BA,EAAO/qD,mBAAmBnd,MAC1BA,KAAK01C,cAAe,EACb11C,KAKXymC,aAAavlC,GAET,OADA,GAAE,uDACKlB,KAAK45C,WAAW14C,GAE3B04C,WAAW14C,GACP,IAAI6L,EACJ,OAAyC,QAAjCA,EAAK/M,KAAKgoE,QAAQ9mE,UAA8B,IAAP6L,EAAgBA,EAAK,GAE1EwP,WACI,OAAOvc,KAAKyJ,MAEhB0+D,eACI,OAAOnoE,KAAKyhC,MAAMK,WAEtBu3B,gBACI,OAAOr5D,KAAKyhC,MAAM4M,YAEtB2L,WACI,OAAOh6C,KAAKyhC,MAEhB3xB,aACI,IAAK9P,KAAKioE,UACN,MAAM,IAAI5lE,EAAa,oBAAqB,sCAEhD,MAAO,CACHoH,MAAOzJ,KAAKyhC,MAAMK,WAAa9hC,KAAKyhC,MAAM4M,YAAcruC,KAAKmvC,QAC7DA,QAASnvC,KAAKmvC,SAGtBsG,YACI,GAAIz1C,KAAK01C,aACL,OACJ,GAAE,iCACF,MAAMjU,EAAQzhC,KAAKyhC,MACbumC,EAAUhoE,KAAKgoE,QAErBhmE,GAAUssD,OAAO0Z,EAAQvmE,EAASO,WAAYy/B,GAC9CuxB,GAAY1E,OAAO0Z,EAAQvmE,EAASuxD,aAAcvxB,GAClDwlB,GAAIqH,OAAO0Z,EAAQvmE,EAASwlD,KAAMxlB,GAClCumB,GAAesG,OAAO0Z,EAAQvmE,EAASumD,gBAAiBvmB,GACxDR,EAAWqtB,OAAO0Z,EAAQvmE,EAASw/B,YAAaQ,GAChDgkC,GAAOnX,OAAO0Z,EAAQvmE,EAASgkE,QAAShkC,GACxCoF,GAAeynB,OAAO0Z,EAAQvmE,EAASolC,gBAAiBpF,GACxDqtB,GAAaR,OAAO0Z,EAAQvmE,EAASqtD,cAAertB,GACpD4iC,GAAa/V,OAAO0Z,EAAQvmE,EAAS4iE,cAAe5iC,GACpDkP,GAAa2d,OAAO0Z,EAAQvmE,EAASkvC,cAAelP,GACpDuvB,GAAS1C,OAAO0Z,EAAQvmE,EAASuvD,UAAWvvB,GAC5CmL,GAAW0hB,OAAO0Z,EAAQvmE,EAASmrC,YAAanL,GAChDwe,GAAYqO,OAAO0Z,EAAQvmE,EAASw+C,aAAcxe,GAClDwc,GAAKqQ,OAAO0Z,EAAQvmE,EAASw8C,MAAOxc,GACpCulC,GAAQ1Y,OAAO0Z,EAAQvmE,EAASulE,SAAUvlC,EAAOzhC,MAEjDA,KAAKyJ,MAAQg4B,EAAMK,WAAaL,EAAM4M,YACtCruC,KAAK01C,cAAe,EAExBC,aACQ31C,KAAK41C,gBAET,GAAE,kCAEF5zC,GAAU2zC,WAAW31C,KAAK45C,WAAWn4C,EAASO,cAGtD+lE,GAAgB7mC,OAAQ,EClHjB,MAAMknC,WAAaptB,GAEtB35C,YAAY4P,EAAM3D,EAAM2/B,GACpBxqC,QAKAzC,KAAKw8B,KAAO4rC,GAAKC,MAAc,OAC/BroE,KAAKqd,YAAYo9B,GAAsB+B,OACvCx8C,KAAKy8C,QAAQxrC,EAAM3D,EAAM2/B,GACzBjtC,KAAKwc,SAAS+f,EAAOoF,mBAAmBvxB,aAAa,QAAQpQ,KAAKsN,eApB1E,YAAcrK,GACNmlE,GAAKlnC,OACLn+B,EAAI,gBAAiBE,GAmBrB,CAAE,iBAAkBgO,GAEb3P,sBACP,OAAOG,EAAS2mE,KAMTC,mBACP,MAAO,CACHzgD,OAAQ,CACJrlB,KAAM,QACNW,KAAM,EACN2T,MAAO,GAEXiR,KAAM,CACFvlB,KAAM,QACNW,KAAM,EACN2T,MAAO,GAEXmR,KAAM,CACFzlB,KAAM,QACNW,KAAM,EACN2T,MAAO,GAEXkR,MAAO,CACHxlB,KAAM,QACNW,KAAM,EACN2T,MAAO,GAEXqR,WAAY,CACR3lB,KAAM,aACNW,KAAM,EACN2T,MAAO,GAEXoR,QAAS,CACL1lB,KAAM,QACNW,KAAM,EACN2T,MAAO,GAEX,gBAAiB,CACbtU,KAAM,QACNW,KAAM,EACN2T,MAAO,GAEX,aAAc,CACVtU,KAAM,QACNW,KAAM,EACN2T,MAAO,GAEX,aAAc,CACVtU,KAAM,QACNW,KAAM,EACN2T,MAAO,GAEXsR,QAAS,CACL5lB,KAAM,QACNW,KAAM,EACN2T,MAAO,GAEXuR,OAAQ,CACJ7lB,KAAM,QACNW,KAAM,EACN2T,MAAO,GAEXyxD,IAAK,CACD/lE,KAAM,iBACNsU,MAAO,IAKnB4lC,QAAQxrC,EAAM3D,EAAM2/B,GAChBjtC,KAAKiR,KAAOA,EACZjR,KAAKw8B,KAAO4rC,GAAKC,MAAMp3D,GAEnBjR,KAAKsN,UADIxK,IAATwK,EACY,UAGAA,EAEhB,MAAMo0B,EAAYnF,EAAOoF,mBAMzB,GALA3hC,KAAKw8B,KAAK3lB,MAAQ6qB,EAAUtxB,aAAa,QAAQpQ,KAAKsN,aAAc,GACpEtN,KAAKwY,MAAQ,IAAI1B,EAAM9W,KAAKw8B,KAAKj6B,KAAMvC,KAAKw8B,KAAK3lB,MAAO,CACpD3V,SAAU,QAAQlB,KAAKw8B,KAAKj6B,QAAQvC,KAAKsN,cAG1BxK,IAAfmqC,EAA0B,CAC1B,MAAM1qC,EAAOm/B,EAAUtxB,aAAa,oBAAoB68B,eAClDp2B,EAAQ6qB,EAAUtxB,aAAa,oBAAoB68B,KAAcjtC,KAAKsN,cACtEpK,EAAOw+B,EAAUtxB,aAAa,oBAAoB68B,KAAcjtC,KAAKsN,QAAQtN,KAAKiR,aAClFmG,EAAUsqB,EAAUtxB,aAAa,oBAAoB68B,KAAcjtC,KAAKsN,QAAQtN,KAAKiR,eAC3FjR,KAAKitC,WAAa,CAAE1qC,KAAAA,EAAMsU,MAAAA,EAAO3T,KAAAA,EAAMkU,QAAAA,GACvCpX,KAAKuoE,WAAa,IAAIzxD,EAAM9W,KAAKitC,WAAW1qC,KAAMvC,KAAKitC,WAAWp2B,OAClE7W,KAAKuoE,WAAW94D,QAAQkJ,MAAQ,EAChC3Y,KAAKuoE,WAAWpuD,UAAUna,KAAKitC,WAAW71B,cAG1CpX,KAAKitC,gBAAanqC,EAEtB,OAAO9C,KAGXuc,WAII,MAHkB,QAAdvc,KAAKiR,MACLrO,EAAQ5C,KAAKka,MAAO,YAAa,kCAE9Bla,KAAKyJ,MAGhBwQ,SAASC,GAEL,GADAla,KAAKka,MAAQA,EACK,QAAdla,KAAKiR,KAAgB,CACrB,MAAMuH,EAAQ5V,EAAQ5C,KAAKwY,MAAO,YAAa,kCACzCgwD,EAAWxoE,KAAKka,MAAM0zB,cACtBlM,EAAYnF,EAAOoF,mBACnB9qB,EAAQ6qB,EAAUtxB,aAAa,kBAAkBo4D,WACjDC,EAAS/mC,EAAUtxB,aAAa,kBAAkBo4D,YACxDhwD,EAAMwB,SAASnD,GACf2B,EAAM4B,UAAUquD,GAEpB,OAAOzoE,KAGX2U,OACI,MAAM6D,EAAQ5V,EAAQ5C,KAAKwY,MAAO,YAAa,kCACzC0B,EAAQla,KAAK+a,aACbjC,EAAMoB,EAAMxF,eAClB1U,KAAKgV,cACL8D,EAAI+1B,UAAU,OAAQ7uC,KAAK6R,aAAa,OACxC2G,EAAMyB,SAASC,GACf1B,EAAMnD,WAAWyD,QACMhW,IAAnB9C,KAAKw8B,KAAKt5B,MACVlD,KAAKi7C,iBAAiBziC,EAAO0B,EAAOla,KAAKw8B,KAAKt5B,MAElDsV,EAAMwC,cAAchb,KAAK6C,QACDC,IAApB9C,KAAKitC,iBAAgDnqC,IAApB9C,KAAKuoE,aACtCvoE,KAAKi7C,iBAAiBj7C,KAAKuoE,WAAYruD,EAAOla,KAAKitC,WAAW/pC,MAC9DlD,KAAKuoE,WAAWtuD,SAASC,GACzBla,KAAKuoE,WAAWlzD,WAAWyD,GAC3B9Y,KAAKuoE,WAAWvtD,cAAchb,KAAK6C,IAEvCiW,EAAIi3B,cAIZq4B,GAAKlnC,OAAQ,ECrKN,MAAMwnC,WAAqB1tB,GAE9B35C,YAAYu8B,EAAS+qC,EAAeC,GAChCnmE,QACAzC,KAAKiiC,QAAU,GACfjiC,KAAK6oE,UAAUjrC,EAAS+qC,EAAeC,GACvC5oE,KAAKqd,YAAYo9B,GAAsB+B,OACvCx8C,KAAK8oE,eAAiB,GACtB9oE,KAAKmQ,OAAS,GACdnQ,KAAK+oE,WAAa,GAClB/oE,KAAKgpE,eAAgB,EAEd1nE,sBACP,OAAOG,EAASinE,aAKpBO,eAAe3iD,EAAK4iD,GAChB,MAAMC,EAAe5sC,EAAOgF,gBAAgBjb,EAAIrV,MAC1CuH,EAAQ,IAAI1B,EAAMqyD,EAAa5mE,KAAMvC,KAAK8oE,gBAEhD,IAAIM,EAAa,EACjB,GAAiB,MAAb9iD,EAAIrV,MAAgBi4D,EAAS,CAC7B,MAAM/5B,EAAUu5B,GAAa3mC,kBAAkBmnC,EAAQj4D,MACvD,GAAIk+B,EAAS,CAETi6B,EADgBF,EAAQhmE,MAAQojB,EAAIpjB,KACbisC,EAAQnzB,MAAQmzB,EAAQjzB,OAIvDlc,KAAKi7C,iBAAiBziC,EAAOxY,KAAK+a,aAAcuL,EAAIpjB,MACpDlD,KAAKmQ,OAAO0H,KAAKW,GACjB,MAAM6wD,EAAYrpE,KAAK+oE,WAAW/oE,KAAK+oE,WAAWjkE,OAAS,GACrDm1C,EAAazhC,EAAM1I,aAAarG,MAAQ2/D,EAE9CppE,KAAK+oE,WAAWlxD,KAAKwxD,EAAYpvB,GAEjCj6C,KAAKyJ,OAASwwC,EAIlBqvB,UAAU3rC,GAGN,OAFA39B,KAAKioE,WAAY,EACjBjoE,KAAK2oE,cAAgBhrC,EACd39B,KAEXupE,uBAAuB5rC,GAEnB,MAAM6rC,EAAiBjtC,EAAOjX,aAAaqY,GAErC8rC,EAAkBzpE,KAAKiiC,QAAQn9B,OAAS,GAAK0kE,EAAe1kE,OAAS,GAAK0kE,EAAe,GAAGv4D,OAASjR,KAAKiiC,QAAQ,GAAGhxB,KAErHy4D,EAAWD,EAAkBD,EAAe1kE,OAAS0kE,EAAe1kE,OAAS9E,KAAKiiC,QAAQn9B,OAEhG,GAAI4kE,EAAW,EACX,OAEJ,MAAMC,EAAY,GAClB,IAAK,IAAIjiE,EAAI,EAAGA,EAAIgiE,EAAUhiE,IAAK,CAC/B,IAAI0J,EAAQ1J,EACP+hE,IACDr4D,EAAQo4D,EAAe1kE,OAAS4kE,EAAWhiE,GAE/C,MAAM4e,EAAMkjD,EAAep4D,GAC3Bu4D,EAAU9xD,KAAK,CAAE5G,KAAM,IAAK/N,KAAMojB,EAAIpjB,OAI1C,OADAlD,KAAKiiC,QAAU0nC,EAAUC,OAAO5pE,KAAKiiC,SAC9B,CACHA,QAAS0nC,EACT14D,KAAMu4D,EAAe,GAAGv4D,MAIhC44D,WAAW3vD,GAGP,OAFAla,KAAKgpE,eAAgB,EACrB9uD,EAAM0sB,YAAY5mC,MACXA,KAIX8pE,gBAAgBttC,EAAMvrB,EAAMgxB,EAAUjiC,KAAKiiC,SACvC,IACI8nC,EAuCAriE,EAxCAsiE,EAAS,EAEb,OAAQxtC,GAEJ,IAAK,UACY,MAATvrB,EACA84D,EAAc,CAAC,IAAK,GAAK,EAAG,EAAG,KAAM,GAAK,GAE1CC,GAAU,EACd,MACJ,IAAK,gBACY,MAAT/4D,EACA84D,EAAc,CAAC,EAAG,EAAG,GAAK,IAAK,EAAG,EAAG,KAErCC,EAAS,IACb,MACJ,IAAK,OACDA,EAAS,GACT,MACJ,IAAK,QACY,MAAT/4D,EACA84D,EAAc,CAAC,EAAG,EAAG,IAAK,GAAK,EAAG,EAAG,KAErCC,GAAU,GACd,MACJ,IAAK,aACL,IAAK,aACY,MAAT/4D,EACA84D,EAAc,CAAC,GAAK,IAAK,EAAG,EAAG,IAAK,IAAK,GAEzCC,EAAS,EACb,MACJ,IAAK,OACL,IAAK,SACDA,EAAS,EAOjB,QAA2B,IAAhBD,EACP,IAAKriE,EAAI,EAAGA,EAAIu6B,EAAQn9B,SAAU4C,EAC9Bu6B,EAAQv6B,GAAGxE,KAAO6mE,EAAYriE,QAGjC,GAAe,IAAXsiE,EACL,IAAKtiE,EAAI,EAAGA,EAAIu6B,EAAQn9B,SAAU4C,EAC9Bu6B,EAAQv6B,GAAGxE,MAAQ8mE,EAI/B7uB,WAAW/pC,GAGP,OAFKpR,KAAKioE,WACNjoE,KAAKsuD,SACqB,IAAvBtuD,KAAKmQ,OAAOrL,SAAkB9E,KAAKgpE,eAAiB53D,EAAQ,EAAK,EAAIpR,KAAKkyC,QAErF31B,WAGI,OAFKvc,KAAKioE,WACNjoE,KAAKsuD,SACFtuD,KAAKyJ,MAEhBo/D,UAAUjrC,EAAS+qC,EAAeC,GAK9B,OAJA5oE,KAAKioE,WAAY,EACjBjoE,KAAK49B,QAAUA,EACf59B,KAAK2oE,cAAgBA,EACrB3oE,KAAK4oE,aAAeA,EACb5oE,KAKXiqE,SAASrB,GAGL,OAFA5oE,KAAKioE,WAAY,EACjBjoE,KAAK4oE,aAAeA,EACb5oE,KAEXkqE,sBAAsBtB,GAClB,MAAM7/D,EAAM5E,KAAKqlC,IAAIo/B,EAAa9jE,OAAQ9E,KAAKiiC,QAAQn9B,QACvD,IAAK,IAAI4C,EAAI,EAAGA,EAAIqB,IAAOrB,EACnBkhE,EAAalhE,KACb1H,KAAKiiC,QAAQv6B,GAAGuJ,KAAO23D,EAAalhE,IAIhD4mD,SACI,MAAMp0C,EAAQla,KAAK+a,aACnB/a,KAAKyJ,MAAQ,EACbzJ,KAAKmQ,OAAS,GACdnQ,KAAK+oE,WAAa,CAAC,GACnB/oE,KAAKiiC,QAAU1F,EAAOjX,aAAa1iB,EAAQ5C,KAAK49B,UAChD,MAAMqE,EAAUjiC,KAAKiiC,QACfkoC,EAAsBloC,EAAQn9B,OAAS,EAAIm9B,EAAQ,GAAGhxB,UAAOnO,EACnE,IAAIsnE,EAOJ,GANIpqE,KAAK2oE,gBACLyB,EAAgBpqE,KAAKupE,uBAAuBvpE,KAAK2oE,gBAEjD3oE,KAAK4oE,cACL5oE,KAAKkqE,sBAAsBlqE,KAAK4oE,cAEhC5oE,KAAKiiC,QAAQn9B,OAAS,EAAG,CACzB,MAAM03B,GAAQx8B,KAAKyb,WAAag/B,GAAsBoB,IAAM3hC,EAAMmwD,aAAenwD,EAAMowD,YAAcpwD,EAAMowD,UACvGF,GACApqE,KAAK8pE,gBAAgBttC,EAAM4tC,EAAcn5D,KAAMm5D,EAAcnoC,SAEjEjiC,KAAK8pE,gBAAgBttC,EAAM2tC,EAAqBloC,GAChD,IAAK,IAAIv6B,EAAI,EAAGA,EAAI1H,KAAKiiC,QAAQn9B,SAAU4C,EACvC1H,KAAKipE,eAAejpE,KAAKiiC,QAAQv6B,GAAI1H,KAAKiiC,QAAQv6B,EAAI,IAG9D1H,KAAKioE,WAAY,EAErBtzD,OACI,MAAMuF,EAAQla,KAAK+a,aACbjC,EAAMoB,EAAMxF,eACb1U,KAAKioE,WACNjoE,KAAKsuD,SACTtuD,KAAKgV,cACL8D,EAAI+1B,UAAU,eAAgB7uC,KAAK6R,aAAa,OAChD,IAAK,IAAInK,EAAI,EAAGA,EAAI1H,KAAKmQ,OAAOrL,OAAQ4C,IAAK,CACzC,MAAM8Q,EAAQxY,KAAKmQ,OAAOzI,GACpB7E,EAAI7C,KAAK6C,EAAI7C,KAAK+oE,WAAWrhE,GACnC8Q,EAAMyB,SAASC,GACf1B,EAAMnD,WAAWyD,GACjBN,EAAMwC,cAAcnY,GAExBiW,EAAIi3B,cAKZ24B,GAAa3mC,kBAAoB,CAC7B,IAAK,CACD/lB,MAAO,EACPE,MAAO,GAEXtY,EAAG,CACCoY,MAAO,EACPE,MAAO,GAEXpY,EAAG,CACCkY,MAAO,EACPE,MAAO,GAEX,KAAM,CACFF,MAAO,EACPE,MAAO,GAEXkH,GAAI,CACApH,MAAO,EACPE,MAAO,GAEXmG,GAAI,CACArG,MAAO,EACPE,MAAO,GAEX7W,EAAG,CACC2W,MAAO,EACPE,MAAO,GAEXiP,IAAK,CACDnP,MAAO,EACPE,MAAO,GAEX,KAAM,CACFF,MAAO,EACPE,MAAO,GAEX,IAAK,CACDF,MAAO,EACPE,MAAO,GAEX,KAAM,CACFF,MAAO,EACPE,MAAO,GAEX,MAAO,CACHF,MAAO,EACPE,MAAO,GAEX+O,GAAI,CACAjP,MAAO,EACPE,MAAO,IAEXgP,IAAK,CACDlP,MAAO,EACPE,MAAO,KClRR,MAAMquD,WAAmBvvB,GAC5B35C,YAAY4P,EAAMpO,EAAGwU,GACjB5U,QACAzC,KAAKwqE,YAAcv5D,EACnBjR,KAAK6C,EAAIA,EACT7C,KAAKoX,QAAU,EACfpX,KAAKqX,QAAUA,EACfrX,KAAKkW,YAEE5U,sBACP,OAAOG,EAAS8oE,WAEpBE,UAAU5nE,GAEN,OADA7C,KAAKoX,QAAUvU,EACR7C,KAEX0qE,UAAU7iE,GAEN,OADA7H,KAAKqX,QAAUxP,EACR7H,KAEX2U,KAAKuF,EAAOrX,GAER,OADA7C,KAAKgV,cACGhV,KAAKwqE,aACT,KAAKD,GAAWt5D,KAAK05D,WACjB3qE,KAAK4qE,cAAc1wD,EAAOrX,EAAIqX,EAAMqC,YACpC,MACJ,KAAKguD,GAAWt5D,KAAK45D,UACjB7qE,KAAK8qE,eAAe5wD,EAAOrX,EAAG,QAAQ,GACtC,MACJ,KAAK0nE,GAAWt5D,KAAK85D,WACjB/qE,KAAKgrE,eAAe9wD,EAAOrX,GAC3B,MACJ,KAAK0nE,GAAWt5D,KAAKg6D,YACjBjrE,KAAKgrE,eAAe9wD,EAAOrX,EAAIqX,EAAMqC,YACrC,MACJ,KAAKguD,GAAWt5D,KAAKi6D,GACjBlrE,KAAK8qE,eAAe5wD,EAAOrX,EAAG,QAAQ,GACtC,MACJ,KAAK0nE,GAAWt5D,KAAKk6D,WACjBnrE,KAAK8qE,eAAe5wD,EAAOrX,EAAG,WAAW,GACzC,MACJ,KAAK0nE,GAAWt5D,KAAKm6D,WACjBprE,KAAK8qE,eAAe5wD,EAAOrX,EAAG,gBAAgB,GAC9C,MACJ,KAAK0nE,GAAWt5D,KAAKo6D,GACjBrrE,KAAK8qE,eAAe5wD,EAAOrX,EAAG,QAAQ,GACtC,MACJ,KAAK0nE,GAAWt5D,KAAKq6D,WACjBtrE,KAAK8qE,eAAe5wD,EAAOrX,EAAG,WAAW,GACzC,MACJ,KAAK0nE,GAAWt5D,KAAKs6D,WACjBvrE,KAAK8qE,eAAe5wD,EAAOrX,EAAG,gBAAgB,GAC9C,MACJ,KAAK0nE,GAAWt5D,KAAKu6D,KACjBxrE,KAAK8qE,eAAe5wD,EAAOrX,EAAG,QAAQ,GACtC,MACJ,KAAK0nE,GAAWt5D,KAAKw6D,QACjBzrE,KAAK8qE,eAAe5wD,EAAOrX,EAAG,MAAM,GAK5C,OAAO7C,KAEX4qE,cAAc1wD,EAAOrX,GACjB,MAAMgF,EAAIqS,EAAMu1B,eAAev1B,EAAM0zB,eAAiB5tC,KAAKqX,QAE3D,OADAP,EAAMu8C,YAAYn5C,EAAMxF,eAAgB1U,KAAK6C,EAAIA,EAAI7C,KAAKoX,QAASvP,EAAI00B,EAAOoF,mBAAmBvxB,aAAa,mCAAoC,GAAI,OAAQ,CAAElP,SAAU,SACnKlB,KAEXgrE,eAAe9wD,EAAOrX,GAClB,MAAMgF,EAAIqS,EAAMu1B,eAAev1B,EAAM0zB,eAAiB5tC,KAAKqX,QAE3D,OADAP,EAAMu8C,YAAYn5C,EAAMxF,eAAgB1U,KAAK6C,EAAIA,EAAI7C,KAAKoX,QAASvP,EAAI00B,EAAOoF,mBAAmBvxB,aAAa,mCAAoC,GAAI,QAAS,CAAElP,SAAU,UACpKlB,KAEX8qE,eAAe5wD,EAAOrX,EAAGoB,EAAMynE,GAC3B,MAAM5yD,EAAMoB,EAAMxF,eAClBoE,EAAIlF,OACJkF,EAAIxD,QAAQtV,KAAKwV,UACjB,IAAIm2D,EAAS,EACTC,EAAW,EACf,MAAMC,EAAgB3xD,EAAMigC,gBAAkBn6C,KAAK6C,EACnD,OAAQ7C,KAAKwqE,aAET,KAAKD,GAAWt5D,KAAK45D,UAEjBc,EAAS3rE,KAAK6C,EAAIqX,EAAM4xD,sBACxBF,EACID,EACI7yD,EAAIi2B,YAAY9qC,GAAMwF,MACtB8yB,EAAOoF,mBAAmBvxB,aAAa,wCAC/C,MAEJ,KAAKm6D,GAAWt5D,KAAKi6D,GACrB,KAAKX,GAAWt5D,KAAKm6D,WACrB,KAAKb,GAAWt5D,KAAKo6D,GACrB,KAAKd,GAAWt5D,KAAKs6D,WACrB,KAAKhB,GAAWt5D,KAAKu6D,KACjBG,EACI3rE,KAAK6C,EACDA,EACA7C,KAAKoX,QACL8C,EAAMqC,WACNggB,EAAOoF,mBAAmBvxB,aAAa,mCACvCy7D,EACA/yD,EAAIi2B,YAAY9qC,GAAMwF,MAC9B,MAEJ,QACIkiE,EACI3rE,KAAK6C,EACDA,EACA7C,KAAKoX,QACL8C,EAAMqC,WACNggB,EAAOoF,mBAAmBvxB,aAAa,mCACvCy7D,EACA/yD,EAAIi2B,YAAY9qC,GAAMwF,MACtB8yB,EAAOoF,mBAAmBvxB,aAAa,wCAC/Cw7D,EACID,EACI7yD,EAAIi2B,YAAY9qC,GAAMwF,MACtB8yB,EAAOoF,mBAAmBvxB,aAAa,wCAGvD,MAAMvI,EAAIqS,EAAMu1B,eAAev1B,EAAM0zB,eACjC5tC,KAAKqX,QACLklB,EAAOoF,mBAAmBvxB,aAAa,mCAM3C,OALIs7D,GACA50D,EAAMu8C,YAAYv6C,EAAK8yD,EAAU/jE,EAAG,GAAI,OAAQ,CAAE3G,SAAU,SAEhE4X,EAAIg3B,SAAS7rC,EAAM0nE,EAAQ9jE,EAAI,GAC/BiR,EAAItE,UACGxU,MAGfuqE,GAAW70D,UAAY,CACnBhI,OAAQhB,EAAK8D,MACblD,KAAM,GACNC,OAAQjC,EAAW2gC,KACnBz+B,MAAOjC,EAAUqC,QAErB28D,GAAWt5D,KAAO,CACdgrC,KAAM,EACN4uB,UAAW,EACXF,WAAY,EACZI,WAAY,EACZE,YAAa,EACbC,GAAI,EACJC,WAAY,EACZC,WAAY,EACZC,GAAI,EACJC,WAAY,GACZC,WAAY,GACZC,KAAM,GACNC,QAAS,IC3JN,MAAMM,WAAqB/wB,GAC9B35C,YAAY2qE,EAASnpE,EAAGy6B,GACpB76B,QACAzC,KAAKwc,SAAS,IACdxc,KAAKgsE,QAAUA,EACfhsE,KAAK6C,EAAIA,EACT7C,KAAKisE,QAAU,EACfjsE,KAAKs9B,QAAUA,EACft9B,KAAKkW,YAEE5U,sBACP,OAAOG,EAASsqE,aAEpBG,gBAAgBF,GAEZ,OADAhsE,KAAKgsE,QAAUA,EACRhsE,KAEXyqE,UAAU5nE,GAEN,OADA7C,KAAKisE,QAAUppE,EACR7C,KAEX0qE,UAAU7iE,GAEN,OADA7H,KAAKs9B,QAAUz1B,EACR7H,KAEX2U,KAAKuF,EAAO+xD,GACR,MAAMnzD,EAAMoB,EAAMxF,eAClB1U,KAAKgV,cACL8D,EAAIlF,OACJkF,EAAIxE,aAAa,GACjBwE,EAAIxD,QAAQtV,KAAKwV,UACjB,MAGM22D,EAAmBrzD,EAAIi2B,YAAY/uC,KAAKgsE,SAGxCviE,EAFY0iE,EAAiB1iE,MAET,EACpBC,EAFayiE,EAAiBziE,OAER,EAEtB7B,EAAIqS,EAAMu1B,eAAe,GAAKzvC,KAAKs9B,QACnCz6B,EAAI7C,KAAK6C,EAAIopE,EAOnB,OANAnzD,EAAIQ,YACJR,EAAIxE,aAVc,GAWlBwE,EAAI0lD,KAAK37D,EAAGgF,EAAIskE,EAAiBtkE,EAZhB,EAY8B4B,EAAOC,GACtDoP,EAAIikB,SACJjkB,EAAIg3B,SAAS9vC,KAAKgsE,QAASnpE,EAfV,EAewBgF,GACzCiR,EAAItE,UACGxU,MAGf+rE,GAAar2D,UAAY,CACrBhI,OAAQhB,EAAKiB,WACbL,KAAM,GACNC,OAAQjC,EAAW2gC,KACnBz+B,MAAOjC,EAAUqC,QCrDd,MAAMw+D,WAAmBpxB,GAC5B35C,YAAYgrE,EAAOxpE,EAAGy6B,GAClB76B,QAEAzC,KAAKmhC,eAAiB,CAAE8V,iBAAkB,IAC1Cj3C,KAAKqsE,MAAQA,EACbrsE,KAAKyb,SAAWg/B,GAAsBx+B,MACtCjc,KAAK6C,EAAIA,EACT7C,KAAKisE,QAAU,GACfjsE,KAAKs9B,QAAUA,EACft9B,KAAKkW,YAEE5U,sBACP,OAAOG,EAAS2qE,WAEpBE,SAASD,GAEL,OADArsE,KAAKqsE,MAAQA,EACNrsE,KAEXyqE,UAAU5nE,GAEN,OADA7C,KAAKisE,QAAUppE,EACR7C,KAEX0qE,UAAU7iE,GAEN,OADA7H,KAAKs9B,QAAUz1B,EACR7H,KAEX2U,KAAKuF,EAAO+xD,GACR,MAAMnzD,EAAMoB,EAAMxF,eAClB1U,KAAKgV,cACL,MAAMkD,EAAUlY,KAAKmhC,eAGfhqB,EAAQe,EAAQ++B,iBAAmB,GACnCrqC,EAAO5M,KAAKqsE,MAAMz/D,KAClBmxB,EAAW/9B,KAAKqsE,MAAMtuC,SACtBoa,EAAOn4C,KAAKqsE,MAAMl0B,MAAQ,EAC1Bo0B,EAAMvsE,KAAKqsE,MAAME,IACvB,IAAI1pE,EAAI7C,KAAK6C,EAAI7C,KAAKisE,QAAUA,EAChC,MAAMpkE,EAAIqS,EAAMu1B,eAAe,GAAKzvC,KAAKs9B,QAOzC,GANAxkB,EAAIlF,OACAhH,IACAkM,EAAIxD,QAAQtV,KAAKwV,UACjBsD,EAAIg3B,SAASljC,EAAM/J,EAAGgF,GACtBhF,GAAKiW,EAAIi2B,YAAYniC,GAAMnD,OAE3Bs0B,GAAYwuC,EAAK,CAEjBzzD,EAAIxD,QAAQjV,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI/V,KAAKwV,UAAW,CAAEjI,OAAQ,SAAUC,MAAO,YACnFZ,IACA/J,GAAKiW,EAAIi2B,YAAY,KAAKtlC,MAC1BqP,EAAIg3B,SAAS,IAAKjtC,EAAGgF,GACrBhF,GAAKiW,EAAIi2B,YAAY,KAAKtlC,OAE9B,MAAMlH,EAAOg6B,EAAOoa,cAAc5Y,GAKlC,GAJAl7B,GAAK,EAAIsU,EACTL,EAAMu8C,YAAYv6C,EAAKjW,EAAGgF,EAAGqQ,EAAQ++B,iBAAkB10C,EAAKg8B,WAC5D17B,GAAKN,EAAKga,WAAapF,EAEnB5U,EAAK+9B,KAAM,CACX,IAAIksC,EAAc,GACdjqE,EAAKq+B,aACL4rC,GAAe,GAAKjqE,EAAKq+B,WAAa,IAC1C4rC,GAAer1D,EACf,MAAM4wB,EAAQlgC,EAAI2kE,EAClB1zD,EAAI4kC,SAAS76C,EAAIsU,EAAO4wB,EAAO5wB,EAAOq1D,GAClCjqE,EAAKi+B,OACL1pB,EAAMu8C,YAAYv6C,EAAKjW,EAAGklC,EAAO7vB,EAAQ++B,iBAAkB10C,EAAKu+B,iBAAkB,CAC9E5/B,SAAU,oBAETi3C,IACDt1C,GAAK,EAAIsU,IAIrB,IAAK,IAAIzP,EAAI,EAAGA,EAAIywC,EAAMzwC,IACtB7E,GAAK,EAAIsU,EACT2B,EAAIQ,YACJR,EAAIg/B,IAAIj1C,EAAGgF,EAAI,EAAIsP,EAAO,EAAIA,EAAO,EAAa,EAAVhT,KAAKC,IAAQ,GACrD0U,EAAIa,OAERb,EAAIg3B,SAAS,MAAQy8B,GAAO3/D,EAAO,IAAM,IAAK/J,EAAI,EAAIsU,EAAOtP,GAGjE,OADAiR,EAAItE,UACGxU,MAGfosE,GAAW12D,UAAY,CACnBhI,OAAQhB,EAAK8D,MACblD,KAAM,GACNC,OAAQjC,EAAW2gC,KACnBz+B,MAAOjC,EAAUqC,QV1FrB,SAAWw0D,GACPA,EAAcA,EAAoB,KAAI,GAAK,OAC3CA,EAAcA,EAAsB,OAAI,GAAK,SAC7CA,EAAcA,EAAqB,MAAI,GAAK,QAHhD,CAIGA,KAAkBA,GAAgB,KAO9B,MAAMqK,WAAiB3qE,GAC1BT,YAAY60C,GAaR,GAZAzzC,MAAMyzC,GACNl2C,KAAKiE,KAAOiyC,EAAWjyC,MAAQ,GAC/BjE,KAAK0sE,YAAcx2B,EAAWw2B,YAC9B1sE,KAAK2sE,UAAYz2B,EAAWy2B,UAC5B3sE,KAAKsV,QAAQ4gC,EAAWloC,MACxBhO,KAAKkD,KAAOgzC,EAAWhzC,MAAQ,EAC/BlD,KAAK4sE,OAAS12B,EAAW02B,SAAU,EACnC5sE,KAAKuzC,aAAe2C,EAAW3C,eAAgB,EAC/CvzC,KAAK6sE,cAAgBzK,GAAczmD,KAI/Bu6B,EAAW19B,MAAO,CAClB,MAAMs0D,EAASL,GAASM,OAAO72B,EAAW19B,OAC1C,IAAKs0D,EACD,MAAM,IAAIzqE,EAAa,uBAAyB6zC,EAAW19B,OAC/DxY,KAAKwY,MAAQ,IAAI1B,EAAMg2D,EAAOvqE,KAAM,GAAI,CAAErB,SAAU,aACpDlB,KAAKwc,SAASxc,KAAKwY,MAAM1I,aAAarG,YAGtCzJ,KAAKwY,WAAQ1V,EAGVxB,sBACP,OAAOG,EAASgrE,SAETrK,2BACP,OAAOA,GAGA2K,oBACP,MAAO,CACHC,MAAO,CACHzqE,KAAM,SAEV44B,GAAI,CACA54B,KAAM,iBAEVw4B,QAAS,CACLx4B,KAAM,mBAEV0qE,cAAe,CACX1qE,KAAM,sBAEV2qE,cAAe,CACX3qE,KAAM,mBAEVgF,EAAG,CACChF,KAAM,gBAEV4qE,EAAG,CACC5qE,KAAM,gBAEVqf,EAAG,CACCrf,KAAM,gBAEV8E,EAAG,CACC9E,KAAM,oBAEV6qE,EAAG,CACC7qE,KAAM,YAEV8qE,KAAM,CACF9qE,KAAM,QAEV+qE,WAAY,CACR/qE,KAAM,oBAEVgrE,YAAa,CACThrE,KAAM,mBAEVirE,iBAAkB,CACdjrE,KAAM,WAEVkrE,eAAgB,CACZlrE,KAAM,iBAEVmrE,OAAQ,CACJnrE,KAAM,mBAEVwuD,KAAM,CACFxuD,KAAM,kBAEV04B,KAAM,CACF14B,KAAM,gBAEV24B,cAAe,CACX34B,KAAM,sBAKlBmsC,iBAAiBH,GAEb,OADAvuC,KAAK6sE,cAAgBt+B,EACdvuC,KAGXg0D,QAAQ9wD,GAEJ,OADAlD,KAAKkD,KAAOA,EACLlD,KAGXy1C,YACI,GAAIz1C,KAAK01C,aACL,OACJ,MAAM93B,EAAc5d,KAAKg0C,iBAAiB,0CAC1C,GAAIh0C,KAAK4sE,OACL5sE,KAAKwc,SAAS,QAGd,GAAIxc,KAAKwY,WAGJ,CACD,MAAMM,EAAM9Y,KAAK0U,eACjBoE,EAAIxD,QAAQtV,KAAKwV,UACjBxV,KAAKwc,SAAS1D,EAAIi2B,YAAY/uC,KAAKiE,MAAMwF,OAG7CzJ,KAAK6sE,gBAAkBzK,GAAcrmD,OACrC/b,KAAK82C,oBAAsB92C,KAAKyJ,MAAQ,EAEnCzJ,KAAK6sE,gBAAkBzK,GAAc9lD,QAC1Ctc,KAAK82C,oBAAsB92C,KAAKyJ,OAGpCzJ,KAAK+2C,qBAAuBn5B,EAAY9N,aAAaoqC,QAAU,EAC/Dl6C,KAAK01C,cAAe,EAMxB/gC,OACI,MAAMmE,EAAM9Y,KAAK0U,eACXwF,EAAQla,KAAK+a,aACb6C,EAAc5d,KAAKg0C,iBAAiB,qCAC1Ch0C,KAAKgV,cAEL,IAAInS,EAAI7C,KAAKi2C,eAAiBr4B,EAAY9N,aAAaoqC,QAAU,EAEjE,MAAMzwC,EAAQzJ,KAAKuc,WAOnB,IAAI1U,EACJ,GAPI7H,KAAK6sE,gBAAkBzK,GAAcrmD,OACrClZ,GAAK4G,EAAQ,EAERzJ,KAAK6sE,gBAAkBzK,GAAc9lD,QAC1CzZ,GAAK4G,GAGLzJ,KAAKwY,MACL3Q,EAAIqS,EAAMuoB,YAAYziC,KAAKkD,MAAQ,GACnClD,KAAKwY,MAAMoC,OAAO9B,EAAKjW,EAAGgF,OAEzB,CACDA,EAAIqS,EAAMuoB,YAAYziC,KAAKkD,MAAQ,GACnClD,KAAK0T,WAAWoF,GAChBA,EAAIxD,QAAQtV,KAAKwV,UACjBsD,EAAIg3B,SAAS9vC,KAAKiE,KAAMpB,EAAGgF,GAC3B,MAAM6B,EAASoP,EAAIi2B,YAAY/uC,KAAKiE,MAAMyF,QAGpC,OAAEgE,EAAM,KAAEJ,EAAI,OAAEC,EAAM,MAAEC,GAAUxN,KAAKwV,SAEvC2wC,EAAkBz5C,EAAKq1C,UAAUz0C,EAAM,SACzCtN,KAAK0sE,cACL5zD,EAAIxD,QAAQ5H,EAAQy4C,EAAiB54C,EAAQC,GAC7CsL,EAAIg3B,SAAS9vC,KAAK0sE,YAAa7pE,EAAI7C,KAAKyJ,MAAQ,EAAG5B,EAAI6B,EAAS,MAEhE1J,KAAK2sE,YACL7zD,EAAIxD,QAAQ5H,EAAQy4C,EAAiB54C,EAAQC,GAC7CsL,EAAIg3B,SAAS9vC,KAAK2sE,UAAW9pE,EAAI7C,KAAKyJ,MAAQ,EAAG5B,EAAI6B,EAAS,IAAM,IAExE1J,KAAKuU,aAAauE,KAI9B2zD,GAAS/2D,UAAY,CACjBhI,OAAQhB,EAAKiB,WACbL,KAAM,GACNC,OAAQjC,EAAWsC,OACnBJ,MAAOjC,EAAUqC,QWlMd,MAAM+/D,WAAkB3yB,GAC3B35C,YAAY4C,EAAMwX,EAAUvD,EAAU,IAClCzV,QACAzC,KAAKwc,SAAS,IACdxc,KAAKiE,KAAOA,EACZjE,KAAKyb,SAAWA,EAChBzb,KAAKkY,QAAU7X,OAAO0V,OAAO,CAAEk2D,QAAS,EAAG3uC,QAAS,EAAGuvC,cAAeJ,GAASrK,cAAcrmD,QAAU7D,GACvGlY,KAAKkW,YAEE5U,sBACP,OAAOG,EAASksE,UAEpBC,aAAa3pE,GAET,OADAjE,KAAKiE,KAAOA,EACLjE,KAEXyqE,UAAU5nE,GAEN,OADA7C,KAAKisE,QAAUppE,EACR7C,KAEX0qE,UAAU7iE,GAEN,OADA7H,KAAKs9B,QAAUz1B,EACR7H,KAEX6tE,QAAQ5pE,GAEJ,OADAjE,KAAKiE,KAAOA,EACLjE,KAEX2U,KAAKuF,GACD,MAAMpB,EAAMoB,EAAMxF,eAClB1U,KAAKgV,cACL8D,EAAIlF,OACJkF,EAAIxE,aAAa,GACjBwE,EAAIxD,QAAQtV,KAAKwV,UACjB,MAAMs5B,EAAah2B,EAAIi2B,YAAY,GAAK/uC,KAAKiE,MAAMwF,MACnD,IAAI5G,EACAgF,EACJ,OAAQ7H,KAAKyb,UACT,KAAKg/B,GAAsB9+B,KAC3B,KAAK8+B,GAAsBn+B,MACvBzU,GAAKqS,EAAMuoB,YAAY,GAAKvoB,EAAM4zD,kBAAoB,EAAI9tE,KAAKkY,QAAQolB,QAEnEz6B,EADA7C,KAAKyb,WAAag/B,GAAsB9+B,KACpCzB,EAAMjS,OAAS6mC,EAAa,GAAK9uC,KAAKkY,QAAQ+zD,QAG9C/xD,EAAMjS,OAASiS,EAAMqC,WAAa,GAAKvc,KAAKkY,QAAQ+zD,QAE5D,MACJ,KAAKxxB,GAAsBx+B,MAC3B,KAAKw+B,GAAsBt+B,MACvBtZ,EAAIqX,EAAMjS,OAASjI,KAAKkY,QAAQ+zD,QAC5BjsE,KAAKkY,QAAQ20D,gBAAkBzK,GAAcrmD,OAC7ClZ,GAAKqX,EAAMqC,WAAa,EAAIuyB,EAAa,EAEpC9uC,KAAKkY,QAAQ20D,gBAAkBzK,GAAc9lD,QAClDzZ,GAAKqX,EAAMqC,WAAauyB,GAGxBjnC,EADA7H,KAAKyb,WAAag/B,GAAsBx+B,MACpC/B,EAAMu1B,eAAe,GAAKzvC,KAAKkY,QAAQolB,QAGvCpjB,EAAMw1B,kBAAkB,GAAK1vC,KAAKkY,QAAQolB,QAElD,MACJ,QACI,MAAM,IAAIj7B,EAAa,kBAAmB,uCAIlD,OAFAyW,EAAIg3B,SAAS,GAAK9vC,KAAKiE,KAAMpB,EAAGgF,EAAI,GACpCiR,EAAItE,UACGxU,MAGf2tE,GAAUj4D,UAAY,CAClBhI,OAAQhB,EAAK8D,MACblD,KAAM,GACNC,OAAQjC,EAAWsC,OACnBJ,MAAOjC,EAAUqC,QV7ErB,SAAWy0D,GACPA,EAAUA,EAAgB,KAAI,GAAK,OACnCA,EAAUA,EAAiB,MAAI,GAAK,QACpCA,EAAUA,EAAe,IAAI,GAAK,MAClCA,EAAUA,EAAe,IAAI,GAAK,MAClCA,EAAUA,EAAqB,UAAI,GAAK,YAL5C,CAMGA,KAAcA,GAAY,KACtB,MAAM0L,WAAc/yB,GACvB35C,YAAY4P,EAAMo4C,EAAQxmD,EAAGwU,GACzB5U,QACAzC,KAAKguE,MAAQ/8D,EACbjR,KAAK6C,EAAIA,EACT7C,KAAKqX,QAAUA,EACfrX,KAAKqpD,OAASA,EACdrpD,KAAKkW,YAEE5U,sBACP,OAAOG,EAASssE,MAET98D,kBACP,OAAOoxD,GAEXqI,UAAU7iE,GAEN,OADA7H,KAAKqX,QAAUxP,EACR7H,KAEX2U,KAAKuF,EAAOrX,GACR,MAAMiW,EAAMoB,EAAMxF,eAClB1U,KAAKgV,cACL,IAAIvL,EAAQyQ,EAAMqC,WAAa1Z,EAC/B,MAAMorE,EAAQ/zD,EAAMu1B,eAAev1B,EAAM0zB,eAAiB5tC,KAAKqX,QACzD62D,EAAc,IAAMh0D,EAAMsoB,yBAChC,OAAQxiC,KAAKguE,OACT,KAAK3L,GAAU7lB,MACX1jC,EAAI4kC,SAAS19C,KAAK6C,EAAIA,EAAGorE,EAAO,EAAGC,GACnC,MACJ,KAAK7L,GAAUxmB,IACXpyC,GAAS,EACTqP,EAAI4kC,SAAS19C,KAAK6C,EAAIA,EAAI4G,EAAOwkE,EAAO,EAAGC,GAC3C,MACJ,KAAK7L,GAAU8L,UACX1kE,GAAS,EACTqP,EAAI4kC,SAAS19C,KAAK6C,EAAIA,EAAGorE,EAAO,EAAGC,GACnCp1D,EAAI4kC,SAAS19C,KAAK6C,EAAIA,EAAI4G,EAAOwkE,EAAO,EAAGC,GAanD,OAPIluE,KAAKguE,QAAU3L,GAAU7lB,OAASx8C,KAAKguE,QAAU3L,GAAU8L,YAC3Dr1D,EAAIlF,OACJkF,EAAIxD,QAAQtV,KAAKwV,UACjBsD,EAAIg3B,SAAS9vC,KAAKqpD,OAAQrpD,KAAK6C,EAAIA,EAAI,EAAGorE,EAAQ,IAClDn1D,EAAItE,WAERsE,EAAI4kC,SAAS19C,KAAK6C,EAAIA,EAAGorE,EAAOxkE,EAAO,GAChCzJ,MAGf+tE,GAAMr4D,UAAY,CACdhI,OAAQhB,EAAKiB,WACbL,KAAM,EACNC,OAAQjC,EAAW2gC,KACnBz+B,MAAOjC,EAAUqC,QW9Dd,MAAMwgE,WAA2Bt3D,EACpCzV,YAAYgtE,EAAeC,EAAWC,EAAWhsE,EAAMsU,EAAOqB,GAC1D,IAAInL,EACJtK,MAAMF,EAAMsU,EAAOqB,GACnBlY,KAAKquE,cAAgBA,EACrBruE,KAAKmY,UAAY,GACjBnY,KAAKoY,UAAY,GACjB,IAAIo2D,EAAW,EACf,IAAK,IAAI9mE,EAAI,EAAGA,EAAI4mE,EAAUxpE,SAAU4C,EAAG,CACvC,IAAI+mE,EAAcH,EAAU5mE,GAC5B,OAAQ4mE,EAAU5mE,IACd,IAAK,IACD+mE,EAAc,QACd,MACJ,IAAK,IACDA,EAAcF,EAAUzpE,OAAS,EAAI,YAAc,OACnD,MACJ,IAAK,IACD2pE,EAAcF,EAAUzpE,OAAS,EAAI,kBAAoB,aACzD,MACJ,IAAK,IACD2pE,EAAcF,EAAUzpE,OAAS,EAAI,mBAAqB,cAGlE,MAAM4pE,EAAW,IAAI53D,EAAM,UAAY23D,EAAazuE,KAAKquE,cAAcx3D,OACvE7W,KAAKmY,UAAUN,KAAK62D,GACpBF,GAAmD,QAAtCzhE,EAAK2hE,EAAS5+D,aAAarG,aAA0B,IAAPsD,EAAgBA,EAAK,EAEpF,IAAI4hE,EAAW,EACf,IAAK,IAAIjnE,EAAI,EAAGA,EAAI6mE,EAAUzpE,SAAU4C,EAAG,CACvC,IAAI+mE,EAAcF,EAAU7mE,GAC5B,OAAQ6mE,EAAU7mE,IACd,IAAK,IACD+mE,EAAc,YACd,MACJ,IAAK,IACDA,EAAc,kBACd,MACJ,IAAK,IACDA,EAAc,mBAGtB,MAAMG,EAAW,IAAI93D,EAAM,UAAY23D,EAAazuE,KAAKquE,cAAcx3D,OACvE7W,KAAKoY,UAAUP,KAAK+2D,GACpBD,GAAY/rE,EAAQgsE,EAAS9+D,aAAarG,OAE9CzJ,KAAKyJ,MAAQtF,KAAK4E,IAAIylE,EAAUG,GAChC3uE,KAAKo8C,KAAOp8C,KAAK8P,aAAa4I,MAC9B1Y,KAAK6uE,WAAa7uE,KAAKyJ,MAAQ+kE,GAAY,EAC3CxuE,KAAK8uE,WAAa9uE,KAAKyJ,MAAQklE,GAAY,EAC3C3uE,KAAKuY,QAETzI,aACI,MAAO,CACH4I,MAAO1Y,KAAKo8C,KACZzjC,MAAO3Y,KAAKo8C,KAAOp8C,KAAKyJ,MACxBA,MAAOzJ,KAAKyJ,OAGpBuR,cAAcnY,GACV,MAAMqX,EAAQla,KAAK+a,aACbjC,EAAM9Y,KAAK0U,eACjB,IAAIq6D,EAAUlsE,EAAI7C,KAAK6uE,UACnBhnE,EAAI,EAEJA,EADA7H,KAAKoY,UAAUtT,OAAS,EACpBoV,EAAMuoB,YAAYziC,KAAKquE,cAAcW,UAEpC90D,EAAMuoB,YAAYziC,KAAKquE,cAAcW,SAAW90D,EAAMuoB,YAAYziC,KAAKquE,cAAcY,aAAe,EAC7G,IAAK,IAAIvnE,EAAI,EAAGA,EAAI1H,KAAKmY,UAAUrT,SAAU4C,EAAG,CAC5C,MAAM8Q,EAAQxY,KAAKmY,UAAUzQ,GAC7BoP,EAAMsC,cAAcN,EAAKN,EAAM1I,aAAaoH,QAASlX,KAAKmX,MAAO43D,EAAU/uE,KAAKoX,QAASvP,GACzFknE,GAAWnsE,EAAQ4V,EAAM1I,aAAarG,OAE1CslE,EAAUlsE,EAAI7C,KAAK8uE,UACnBjnE,EAAIqS,EAAMuoB,YAAYziC,KAAKquE,cAAcY,YACzC,IAAK,IAAIvnE,EAAI,EAAGA,EAAI1H,KAAKoY,UAAUtT,SAAU4C,EAAG,CAC5C,MAAM8Q,EAAQxY,KAAKoY,UAAU1Q,GAC7B1H,KAAKquE,cAAcpzB,iBAAiBziC,EAAO0B,EAAO,GAClDpD,EAAMsC,cAAcN,EAAKN,EAAM1I,aAAaoH,QAASlX,KAAKmX,MAAO43D,EAAUv2D,EAAM1I,aAAasH,QAASvP,GACvGknE,GAAWnsE,EAAQ4V,EAAM1I,aAAarG,SC9D3C,MAAMylE,WAAsBl0B,GAC/B35C,YAAY8tE,EAAW,MAAOC,EAAgB,GAAIC,GAAgB,GAC9D5sE,QACAzC,KAAKqvE,cAAgBA,EACrB,MAAMn9B,EAAUk9B,EACV1tC,EAAYnF,EAAOoF,mBACzB3hC,KAAK6W,MAAQ6qB,EAAUtxB,aAAa,gBACpC,MAAMk/D,EAAgB5tC,EAAUtxB,aAAa,mBAAoB,GACjEpQ,KAAKgvE,QAAU,EAAIM,EACnBtvE,KAAKivE,WAAa,EAAIK,EACtBtvE,KAAKqd,YAAYo9B,GAAsB+B,OACvCx8C,KAAK6S,KAAO7S,KAAKuvE,cAAcJ,GAC/BnvE,KAAKwc,SAAS5Z,EAAQ5C,KAAK6S,KAAK2F,MAAM1I,aAAarG,QACnDzJ,KAAKo7C,WAAWlJ,GAET5wC,sBACP,OAAOG,EAASytE,cAET/+D,oBACP,MAAO,CACH+V,EAAG,CACC3jB,KAAM,gBACNsU,MAAO,GACP3T,KAAM,GAEV,KAAM,CACFX,KAAM,mBACNsU,MAAO,GACP3T,KAAM,IAIlBqsE,cAAcJ,GACV,IAAIpiE,EAAIkF,EACR,GAAiB,MAAbk9D,GAAiC,OAAbA,EAAmB,CACvC,MAAM,KAAEjsE,EAAI,KAAEX,EAAI,MAAEsU,GAAUq4D,GAAc/+D,OAAOg/D,GACnD,MAAO,CACHjsE,KAAAA,EACAijB,KAAK,EACL3N,MAAO,IAAI1B,EAAMvU,EAAMsU,IAG3B7W,KAAKqvE,eAtDY,CAACF,IAC1B,MAAMK,EAAUL,EAASxnE,MAAM,KAC/B,GAAuB,IAAnB6nE,EAAQ1qE,QAA+B,MAAf0qE,EAAQ,IAA6B,MAAfA,EAAQ,GACtD,MAAM,IAAIntE,EAAa,mBAAoB,sBAAsB8sE,sDAErEK,EAAQtxD,SAASmrC,IAEb,GAAoC,GAAhC,gBAAgBomB,KAAKpmB,GACrB,MAAM,IAAIhnD,EAAa,mBAAoB,sBAAsB8sE,yCA+CjEO,CAAqBP,GAEzB,MAAMv3D,EAAQu3D,EAASxnE,MAAM,KAC7B,MAAO,CACHwe,KAAK,EACL3N,MAAOxY,KAAK2vE,uBAA2C,QAAnB5iE,EAAK6K,EAAM,UAAuB,IAAP7K,EAAgBA,EAAK,GAAwB,QAAnBkF,EAAK2F,EAAM,UAAuB,IAAP3F,EAAgBA,EAAK,KAGjJ09D,uBAAuBrB,EAAWC,GAC9B,OAAO,IAAIH,GAAmBpuE,KAAMsuE,EAAWC,EAAW,WAAYvuE,KAAK6W,OAE/E+4D,UACI,OAAO5vE,KAAK6S,KAEhBg9D,WAAWV,GAEP,OADAnvE,KAAK6S,KAAO7S,KAAKuvE,cAAcJ,GACxBnvE,KAEX2U,OACI,MAAMuF,EAAQla,KAAK+a,aACbjC,EAAMoB,EAAMxF,eAClB1U,KAAKgV,cACL8D,EAAI+1B,UAAU,gBAAiB7uC,KAAK6R,aAAa,OACjD7R,KAAK6S,KAAK2F,MAAMyB,SAASC,GACzBla,KAAK6S,KAAK2F,MAAMnD,WAAWyD,GAC3B9Y,KAAKi7C,iBAAiBj7C,KAAK6S,KAAK2F,MAAO0B,EAAOla,KAAK6S,KAAK3P,MACxDlD,KAAK6S,KAAK2F,MAAMwC,cAAchb,KAAK6C,GACnCiW,EAAIi3B,cCzEZ,MAAM+/B,GAA2B,CAC7B,CAACpuE,GAAQJ,UAAW,EACpB,CAAC8mE,GAAK9mE,UAAW,EACjB,CAAConE,GAAapnE,UAAW,EACzB,CAAC4tE,GAAc5tE,UAAW,GAExByuE,GAA2B,CAC7B,CAACb,GAAc5tE,UAAW,EAC1B,CAAConE,GAAapnE,UAAW,EACzB,CAACI,GAAQJ,UAAW,EACpB,CAAC8mE,GAAK9mE,UAAW,GAEd,MAAM0uE,WAAcj9D,EACvB1R,YAAYwB,EAAGgF,EAAG4B,EAAOyO,GACrBzV,QAEAzC,KAAK0J,OAAS,EACd1J,KAAK6C,EAAIA,EACT7C,KAAK6H,EAAIA,EACT7H,KAAKyJ,MAAQA,EACbzJ,KAAKioE,WAAY,EACjBjoE,KAAK+uE,QAAUlsE,EAAI,EACnB7C,KAAKiwE,MAAQptE,EAAI4G,EACjBzJ,KAAKmzC,UAAY,GACjBnzC,KAAKkwE,QAAU,EACflwE,KAAKw8B,KAAO,SACZx8B,KAAKmwE,aAAUrtE,EACf9C,KAAKkW,YACLlW,KAAKkY,QAAU7X,OAAO0V,OAAO,CAAEq6D,mBAAoB,GAAIC,UAAW,EAAGC,WAAY,UAAWC,UAAU,EAAMC,WAAW,EAAMC,yBAA0Bl0C,EAAOuC,oBAAqB4xC,qBAAsB,EAAGC,qBAAsB,EAAGC,kBAAmB,EAAGC,qBAAsB,EAAGC,YAAa,IAAM54D,GACvSlY,KAAK+wE,OAAS,CAAEluE,EAAG7C,KAAK6C,EAAGgF,EAAG7H,KAAK6H,EAAGC,EAAG9H,KAAKyJ,MAAO1B,EAAG,GACxD/H,KAAKgxE,uBAAyB,CAAE78D,YAAa,OAAQE,UAAW,KAChErU,KAAKixE,aAELjxE,KAAK4mC,YAAY,IAAIllC,GAAQ1B,KAAKkY,QAAQq4D,SAAW71B,GAAYiB,OAASjB,GAAYuB,OAEtFj8C,KAAKkxE,eAAe,IAAIxvE,GAAQ1B,KAAKkY,QAAQs4D,UAAY91B,GAAYiB,OAASjB,GAAYuB,OAEnF36C,sBACP,OAAOG,EAASuuE,MAITmB,4BACP,MAAMzvC,EAAYnF,EAAOoF,mBACzB,OAAOD,EAAUtxB,aAAa,iBAAmBsxB,EAAUtxB,aAAa,uBAGjEi1D,0BAEP,OADkB9oC,EAAOoF,mBACRvxB,aAAa,uBAGlCghE,0BAA0B5jE,GACtBxN,KAAKgxE,uBAAyBxjE,EAGlCuuD,4BACI,OAAO17D,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI/V,KAAKyT,YAAazT,KAAKgxE,wBAElEr9B,MAAMxE,GACF,OAAOnvC,KAAKkY,QAAQu4D,yBAA2BthC,EAEnD8hC,aACIjxE,KAAKkY,QAAQ44D,YAAc,GAC3B,IAAK,IAAIppE,EAAI,EAAGA,EAAI1H,KAAKkY,QAAQm4D,UAAW3oE,IACxC1H,KAAKkY,QAAQ44D,YAAYj5D,KAAK,CAAEw5D,SAAS,IAE7CrxE,KAAK0J,QAAU1J,KAAKkY,QAAQm4D,UAAYrwE,KAAKkY,QAAQw4D,sBAAwB1wE,KAAKkY,QAAQu4D,yBAC1FzwE,KAAKkY,QAAQ24D,qBAAuB7wE,KAAKkY,QAAQm4D,UAErDiB,cAAczuE,GACL7C,KAAKioE,WACNjoE,KAAKsuD,SACTtuD,KAAK+uE,QAAUlsE,EACf,MAAM0uE,EAAavxE,KAAKmzC,UAAU,GAElC,OADAo+B,EAAWlpE,KAAKrI,KAAK+uE,QAAUwC,EAAWh1D,YACnCvc,KAEXm6C,gBAGI,OAFKn6C,KAAKioE,WACNjoE,KAAKsuD,SACFtuD,KAAK+uE,QAEhByC,cAGI,OAFKxxE,KAAKioE,WACNjoE,KAAKsuD,SACFtuD,KAAKiwE,MAEhB/kB,eACI,OAAOlrD,KAAK+uE,QAEhB5jB,aACI,OAAOnrD,KAAKiwE,MAEhBhoE,OACI,OAAOjI,KAAK6C,EAEhB+qC,cACI,OAAO5tC,KAAKkY,QAAQm4D,UAExBoB,YAAY3tE,GAGR,OAFA9D,KAAKkY,QAAQm4D,UAAYvsE,EACzB9D,KAAKixE,aACEjxE,KAEXsI,KAAKT,GAED,OADA7H,KAAK6H,EAAIA,EACF7H,KAEXkI,OACI,OAAOlI,KAAK6H,EAEhB8nC,iBACI,OAAO3vC,KAAKyiC,YAAY,GAAKlG,EAAOqC,qBAAuB,EAE/D6e,uBACI,OAAOz9C,KAAKyiC,YAAYziC,KAAK4tC,cAAgB,GAAKrR,EAAOqC,qBAAuB,EAEpFv2B,KAAKxF,GACD,MAAMmC,EAAQnC,EAAI7C,KAAK6C,EACvB7C,KAAKioE,WAAY,EACjBjoE,KAAK6C,EAAIA,EACT7C,KAAK+uE,SAAW/pE,EAChBhF,KAAKiwE,OAASjrE,EACd,IAAK,IAAI0C,EAAI,EAAGA,EAAI1H,KAAKmzC,UAAUruC,OAAQ4C,IAAK,CAC5C,MAAMgqE,EAAM1xE,KAAKmzC,UAAUzrC,GAC3BgqE,EAAIrpE,KAAKqpE,EAAIzpE,OAASjD,GAE1B,OAAOhF,KAEXwc,SAAS/S,GAML,OALAzJ,KAAKioE,WAAY,EACjBjoE,KAAKyJ,MAAQA,EACbzJ,KAAKiwE,MAAQjwE,KAAK6C,EAAI4G,EAGfzJ,KAEXuc,WACI,OAAOvc,KAAKyJ,MAEhBgK,WACI,OAAOpT,OAAO0V,OAAO,CAAE9B,UAAWjU,KAAKkY,QAAQo4D,WAAYn8D,YAAanU,KAAKkY,QAAQo4D,WAAYj8D,UAAWkoB,EAAOqC,sBAAwB5+B,KAAKwN,OAEpJmkE,WAAWzB,GAEP,OADAlwE,KAAKkwE,QAAUA,EACRlwE,KAQX4xE,kBAAkBxgE,EAAQ,GACtB,GAAqB,iBAAVA,EACP,MAAM,IAAI/O,EAAa,eAAgB,0BAI3C,GAFKrC,KAAKioE,WACNjoE,KAAKsuD,SACqD,IAA1DtuD,KAAKymC,aAAagU,GAAsB+B,OAAO13C,OAC/C,OAAO,EAGX,GAAI9E,KAAKmzC,UAAU/hC,GAAOgM,gBAAkBq9B,GAAsBn+B,MAC9D,OAAO,EAEX,IAAIyyD,EAAU/uE,KAAK+uE,QAAU/uE,KAAK6C,EAClC,MAAM0uE,EAAavxE,KAAKmzC,UAAU,GAIlC,OAHIo+B,EAAWr0B,YAAcxC,GAAYoB,cAAgBizB,EAAUwC,EAAWh1D,aAC1EwyD,GAAWwC,EAAWh1D,YAEnBwyD,EAGX8C,kBAAkB5gE,EAAMyJ,EAAS,GAE7B,OADA1a,KAAKmzC,UAAUt7B,KAAK,IAAI0yD,GAAWt5D,EAAMjR,KAAK6C,EAAG6X,IAC1C1a,KAGX8xE,aAAa7gE,EAAM8gE,EAAUlqE,GAEzB,OADA7H,KAAKmzC,UAAUt7B,KAAK,IAAIk2D,GAAM98D,EAAM8gE,EAAU/xE,KAAK6C,EAAGgF,IAC/C7H,KAGXgyE,WAAWhG,EAASnkE,EAAG4nD,EAAU,EAAG5iD,GAChC,MAAMolE,EAAe,IAAIlG,GAAaC,EAAShsE,KAAK6C,EAAI4sD,EAAS5nD,GAIjE,OAHIgF,GACAolE,EAAa97D,YAAYtJ,GAC7B7M,KAAKmzC,UAAUt7B,KAAKo6D,GACbjyE,KAGXssE,SAASD,EAAOxkE,GAEZ,OADA7H,KAAKmzC,UAAUt7B,KAAK,IAAIu0D,GAAWC,EAAOrsE,KAAK6C,EAAGgF,IAC3C7H,KAGX6tE,QAAQ5pE,EAAMwX,EAAUvD,EAAU,IAE9B,OADAlY,KAAKmzC,UAAUt7B,KAAK,IAAI81D,GAAU1pE,EAAMwX,EAAUvD,IAC3ClY,KAEXipC,YACI,OAAOjpC,KAAK0J,OAEhB84B,yBACI,OAAOxiC,KAAKkY,QAAQu4D,yBAExBt7D,iBACI,OAAO,IAAIvN,EAAY5H,KAAK6C,EAAG7C,KAAK6H,EAAG7H,KAAKyJ,MAAOzJ,KAAKuyC,aAAevyC,KAAK6H,GAEhF0qC,aACI,MAAMr6B,EAAUlY,KAAKkY,QACfi3B,EAAUj3B,EAAQu4D,yBAExB,OADqBzwE,KAAKyiC,YAAYvqB,EAAQm4D,WAAan4D,EAAQy4D,qBAAuBxhC,EAG9F2+B,iBACI,OAAO9tE,KAAKyiC,YAAYziC,KAAKkY,QAAQm4D,WAIzC5tC,YAAYv/B,GACR,MAAMgV,EAAUlY,KAAKkY,QACfi3B,EAAUj3B,EAAQu4D,yBAClByB,EAAWh6D,EAAQw4D,qBAEzB,OADU1wE,KAAK6H,EAAI3E,EAAOisC,EAAU+iC,EAAW/iC,EAGnDgjC,YAAYtqE,GAGR,MAAMqQ,EAAUlY,KAAKkY,QACfi3B,EAAUj3B,EAAQu4D,yBAClByB,EAAWh6D,EAAQw4D,qBACzB,OAAQ7oE,EAAI7H,KAAK6H,GAAKsnC,EAAU+iC,EAEpCziC,eAAevsC,EAAO,GAClB,OAAOlD,KAAKyiC,aAAav/B,EAAOlD,KAAKkY,QAAQ04D,mBAEjDlhC,kBAAkBxsC,EAAO,GACrB,OAAOlD,KAAKyiC,YAAYziC,KAAKkY,QAAQ24D,qBAAuB3tE,GAEhEoxD,YAAYpxD,GACR,MAAMgV,EAAUlY,KAAKkY,QACfi3B,EAAUj3B,EAAQu4D,yBAClByB,EAAWh6D,EAAQw4D,qBACzB,OAAO1wE,KAAK6H,EAAIqqE,EAAW/iC,EAAU,EAAIA,EAAUjsC,EAAOisC,EAE9Dl0B,gBACI,OAAOjb,KAAKyiC,YAAY,GAI5BmE,YAAYF,EAAUjrB,GAOlB,YANiB3Y,IAAb2Y,GACAirB,EAASrpB,YAAY5B,GAEzBirB,EAASzsB,SAASja,MAClBA,KAAKioE,WAAY,EACjBjoE,KAAKmzC,UAAUt7B,KAAK6uB,GACb1mC,KAEXkxE,eAAexqC,GAEX,OADA1mC,KAAK4mC,YAAYF,EAAU+T,GAAsBoB,KAC1C77C,KAGXoyE,cAAcnhE,GAEV,MAAM,OAAE0qC,EAAM,aAAEG,EAAY,KAAEG,GAASvB,GAKvC,OAJIzpC,IAAS0qC,GAAU1qC,IAAS6qC,GAAgB7qC,IAASgrC,IACrDj8C,KAAKmzC,UAAU,GAAGsJ,QAAQxrC,GAC1BjR,KAAKioE,WAAY,GAEdjoE,KAEXqyE,cAAcphE,GAMV,OAJIA,IAASypC,GAAYoB,eACrB97C,KAAKmzC,UAAU,GAAGsJ,QAAQxrC,GAC1BjR,KAAKioE,WAAY,GAEdjoE,KAEXsyE,QAAQC,EAAUjlE,EAAM2/B,EAAYxxB,QACf3Y,IAAb2Y,IACAA,EAAWg/B,GAAsB+B,OAEjC/gC,IAAag/B,GAAsBoB,IACnC77C,KAAKmwE,QAAUoC,EAGfvyE,KAAKw8B,KAAO+1C,EAEhB,MAAM5qD,EAAQ3nB,KAAKymC,aAAahrB,EAAU2sD,GAAK9mE,UAO/C,OANqB,IAAjBqmB,EAAM7iB,OACN9E,KAAKwyE,QAAQD,EAAUjlE,EAAM2/B,EAAYxxB,GAGzCkM,EAAM,GAAG80B,QAAQ81B,EAAUjlE,EAAM2/B,GAE9BjtC,KAEXsqE,UACI,OAAOtqE,KAAKw8B,KAEhBi2C,WAAWF,EAAUjlE,EAAM2/B,GAEvB,OADAjtC,KAAKsyE,QAAQC,EAAUjlE,EAAM2/B,EAAYwN,GAAsBoB,KACxD77C,KAEXqqE,aACI,OAAOrqE,KAAKmwE,QAEhBuC,gBAAgB90C,EAAS+qC,EAAeltD,QACnB3Y,IAAb2Y,IACAA,EAAWg/B,GAAsB+B,OAErC,MAAMv2B,EAAgBjmB,KAAKymC,aAAahrB,EAAUitD,GAAapnE,UAO/D,OAN6B,IAAzB2kB,EAAcnhB,OACd9E,KAAK2yE,gBAAgB/0C,EAAS+qC,EAAeltD,GAG7CwK,EAAc,GAAG4iD,UAAUjrC,EAAS+qC,GAEjC3oE,KAEX4yE,mBAAmBh1C,EAAS+qC,GAExB,OADA3oE,KAAK0yE,gBAAgB90C,EAAS+qC,EAAeluB,GAAsBoB,KAC5D77C,KAEX6yE,iBAAiB1D,EAAUC,EAAe3zD,QACrB3Y,IAAb2Y,IACAA,EAAWg/B,GAAsB+B,OAErC,MAAMs2B,EAAiB9yE,KAAKymC,aAAahrB,EAAUyzD,GAAc5tE,UAOjE,OAN8B,IAA1BwxE,EAAehuE,OACf9E,KAAK+yE,iBAAiB5D,EAAUC,EAAe3zD,GAG/Cq3D,EAAe,GAAGjD,WAAWV,GAE1BnvE,KAEXgzE,oBAAoB7D,EAAUC,GAE1B,OADApvE,KAAK6yE,iBAAiB1D,EAAUC,EAAe30B,GAAsBoB,KAC9D77C,KAYX2yE,gBAAgB/0C,EAAS+qC,EAAeltD,GAKpC,YAJiB3Y,IAAb2Y,IACAA,EAAWg/B,GAAsB+B,OAErCx8C,KAAK4mC,YAAY,IAAI8hC,GAAa9qC,EAAS+qC,GAAetrD,YAAY5B,GAAWA,GAC1Ezb,KAcXwyE,QAAQh2C,EAAMlvB,EAAM2/B,EAAYxxB,GAQ5B,YAPiB3Y,IAAb2Y,GAA0BA,IAAag/B,GAAsB+B,MAC7Dx8C,KAAKw8B,KAAOA,EAEP/gB,IAAag/B,GAAsBoB,MACxC77C,KAAKmwE,QAAU3zC,GAEnBx8B,KAAK4mC,YAAY,IAAIwhC,GAAK5rC,EAAMlvB,EAAM2/B,GAAaxxB,GAC5Czb,KAEXizE,WAAWz2C,EAAMlvB,EAAM2/B,GAEnB,OADAjtC,KAAKwyE,QAAQh2C,EAAMlvB,EAAM2/B,EAAYwN,GAAsBoB,KACpD77C,KAaX+yE,iBAAiB5D,EAAUC,EAAe3zD,GAEtC,OADAzb,KAAK4mC,YAAY,IAAIsoC,GAAcC,EAAUC,GAAgB3zD,GACtDzb,KAEXkzE,oBAAoB/D,EAAUC,GAE1B,OADApvE,KAAK+yE,iBAAiB5D,EAAUC,EAAe30B,GAAsBoB,KAC9D77C,KAGXmzE,iBAEI,OADAnzE,KAAKwyE,QAAQ,UACNxyE,KAOXymC,aAAahrB,EAAUva,GACnB,MAAMkyE,OAA0BtwE,IAAb2Y,EACb43D,OAA0BvwE,IAAb5B,EACnB,OAAIkyE,GAAcC,EACPrzE,KAAKmzC,UAEPigC,EAEEpzE,KAAKmzC,UAAUyd,QAAQhvC,GAAM1gB,IAAa0gB,EAAEzO,gBAE9CkgE,EAEErzE,KAAKmzC,UAAUyd,QAAQhvC,GAAMnG,IAAamG,EAAExE,gBAI5Cpd,KAAKmzC,UAAUyd,QAAQhvC,GAAMnG,IAAamG,EAAExE,eAAiBlc,IAAa0gB,EAAEzO,gBAO3FmgE,eAAeC,EAAOC,GAClB,IAAK,IAAI9rE,EAAI6rE,EAAMzuE,OAAS,EAAG4C,GAAK,EAAGA,IACnC,IAAK,IAAIy6C,EAAI,EAAGA,EAAIz6C,EAAGy6C,IACnB,GAAIqxB,EAAMD,EAAMpxB,GAAGhvC,eAAiBqgE,EAAMD,EAAMpxB,EAAI,GAAGhvC,eAAgB,CACnE,MAAMsgE,EAAOF,EAAMpxB,GACnBoxB,EAAMpxB,GAAKoxB,EAAMpxB,EAAI,GACrBoxB,EAAMpxB,EAAI,GAAKsxB,GAK/BnlB,SACI,MAAMijB,EAAavxE,KAAKmzC,UAAU,GAC5BugC,EAAa1zE,KAAKmzC,UAAU,GAC5BwgC,EAAe3zE,KAAKymC,aAAagU,GAAsB+B,OACvDo3B,EAAe5zE,KAAKymC,aAAagU,GAAsBoB,KAU7D,IAAIpyC,EACAyoC,EACAxL,EAXJ1mC,KAAKszE,eAAeK,EAAc7D,IAClC9vE,KAAKszE,eAAeM,EAAc7D,IAC9B4D,EAAa7uE,OAAS,GAAKysE,EAAWr0B,YAAcxC,GAAYoB,eAChE63B,EAAa97D,KAAK87D,EAAahtC,OAAO,EAAG,GAAG,IAC5CgtC,EAAahtC,OAAO,EAAG,EAAG,IAAIjlC,GAAQg5C,GAAYiB,UAElDi4B,EAAaptC,QAAQktC,GAAc,GACnCE,EAAajtC,OAAO,EAAG,EAAG,IAAIjlC,GAAQg5C,GAAYuB,OAKtD,IAAI+tB,EAAS,EACTnnE,EAAI7C,KAAK6C,EACb,IAAK,IAAI6E,EAAI,EAAGA,EAAIisE,EAAa7uE,OAAQ4C,IACrCg/B,EAAWitC,EAAajsE,GACxBwqC,EAAUxL,EAASyU,WAAWzzC,EAAIsiE,GAClCvgE,EAAQi9B,EAASnqB,WACjB1Z,GAAKqvC,EACLxL,EAASr+B,KAAKxF,GACdA,GAAK4G,EACDyoC,EAAUzoC,IAAU,GACpBugE,IAERhqE,KAAK+uE,QAAUlsE,EACfA,EAAI7C,KAAK6C,EAAI7C,KAAKyJ,MAClB,MAAMiyC,EAAS,CACXt/B,KAAM,EACNC,MAAO,EACPkgC,aAAc,EACdD,YAAa,GAEjB,IAAIu3B,EAAiB,EACrB,IAAK,IAAInsE,EAAI,EAAGA,EAAIksE,EAAa9uE,OAAQ4C,IAAK,CAC1Cg/B,EAAWktC,EAAalsE,GACxBmsE,EAAiBryE,EAAUklC,GAAYh/B,EAAImsE,EAC3Cn4B,EAAOr/B,MAAQ,EACfq/B,EAAOt/B,KAAO,EACds/B,EAAOa,aAAe,EACtBb,EAAOY,YAAc,EACrB,MAAMhB,EAAgB5U,EAAS6U,mBAC3BD,GACU,IAAN5zC,IACAg0C,EAAOr/B,MAAQi/B,EAAce,MAAQ,EACrCX,EAAOa,aAAejB,EAAciB,cAAgB,GAExDb,EAAOt/B,MAAQk/B,EAAcc,MAAQ,EACrCV,EAAOY,YAAchB,EAAcgB,aAAe,EAC9C50C,IAAMksE,EAAa9uE,OAAS,IAC5B42C,EAAOY,YAAc,KAIzBZ,EAAOa,aAAe7V,EAASyU,WAAWzzC,EAAImsE,GACpC,IAANnsE,IACAg0C,EAAOr/B,MAAQqqB,EAASnqB,YAElB,IAAN7U,IACAg0C,EAAOt/B,KAAOsqB,EAASnqB,aAG/B1Z,GAAK64C,EAAOa,aACZ15C,GAAK64C,EAAOr/B,MACZqqB,EAASr+B,KAAKxF,GACdA,GAAK64C,EAAOt/B,KACZvZ,GAAK64C,EAAOY,YAEhBt8C,KAAKiwE,MAAgC,IAAxB2D,EAAa9uE,OAAe9E,KAAK6C,EAAI7C,KAAKyJ,MAAQ5G,EAC/D7C,KAAKioE,WAAY,EAKrBtzD,OACI,MAAMmE,EAAM9Y,KAAK0U,eACjB1U,KAAKgV,cACL8D,EAAI+1B,UAAU,QAAS7uC,KAAK6R,aAAa,OACpC7R,KAAKioE,WACNjoE,KAAKsuD,SACT,MAAM+hB,EAAYrwE,KAAKkY,QAAQm4D,UACzB5mE,EAAQzJ,KAAKyJ,MACb5G,EAAI7C,KAAK6C,EACf,IAAIgF,EAEJ,IAAK,IAAI3E,EAAO,EAAGA,EAAOmtE,EAAWntE,IACjC2E,EAAI7H,KAAKyiC,YAAYv/B,GACrBlD,KAAK0T,aACD1T,KAAKkY,QAAQ44D,YAAY5tE,GAAMmuE,UAC/Bv4D,EAAIQ,YACJR,EAAIS,OAAO1W,EAAGgF,GACdiR,EAAIU,OAAO3W,EAAI4G,EAAO5B,GACtBiR,EAAIikB,UAER/8B,KAAKuU,eAGT,IAAK,IAAI7M,EAAI,EAAGA,EAAI1H,KAAKmzC,UAAUruC,OAAQ4C,IAAK,CAC5C,MAAMg/B,EAAW1mC,KAAKmzC,UAAUzrC,GAEH,mBAAlBg/B,EAAS/xB,OAChB+xB,EAAShzB,WAAWoF,GACpB4tB,EAAS/xB,KAAK3U,KAAMA,KAAK4xE,kBAAkBlqE,IAC3Cg/B,EAASnyB,aAAauE,IAI9B,GAAI9Y,KAAKkwE,QAAU,EAAG,CAClBp3D,EAAIlF,OACJkF,EAAIxD,QAAQtV,KAAKwV,UACjB,MAAMioB,EAAY3kB,EAAIi2B,YAAY,GAAK/uC,KAAKkwE,SAASzmE,MACrD5B,EAAI7H,KAAKyvC,eAAe,GAAK,EAC7B32B,EAAIg3B,SAAS,GAAK9vC,KAAKkwE,QAASlwE,KAAK6C,EAAI46B,EAAY,EAAG51B,GACxDiR,EAAItE,UAGR,OADAsE,EAAIi3B,aACG/vC,KAEX8rE,sBACI,OAAO9rE,KAAKkY,QAAQk4D,mBAMxB0D,oBACI,OAAO9zE,KAAKkY,QAAQ44D,YASxBiD,iBAAiBC,EAAalD,GAC1B,GAAIkD,GAAeh0E,KAAKkY,QAAQm4D,WAAa2D,EAAc,EACvD,MAAM,IAAI3xE,EAAa,mBAAoB,iFAE/C,QAA4BS,IAAxBguE,EAAYO,QACZ,MAAM,IAAIhvE,EAAa,mBAAoB,oEAE/C,GAAmC,kBAAxByuE,EAAYO,QACnB,MAAM,IAAIhvE,EAAa,mBAAoB,4EAG/C,OADArC,KAAKkY,QAAQ44D,YAAYkD,GAAelD,EACjC9wE,KAWXi0E,kBAAkBC,GACd,GAAIA,EAAoBpvE,SAAW9E,KAAKkY,QAAQm4D,UAC5C,MAAM,IAAIhuE,EAAa,mBAAoB,2FAK/C,IAAK,MAAMyuE,KAAeoD,EAE0BpxE,MAA5CoxE,EAAoBpD,GAAaO,UACjC6C,EAAoBpD,GAAe9wE,KAAKkY,QAAQ44D,YAAYA,IAEhE9wE,KAAKkY,QAAQ44D,YAAYA,GAAezwE,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI/V,KAAKkY,QAAQ44D,YAAYA,IAAeoD,EAAoBpD,IAGxI,OADA9wE,KAAKkY,QAAQ44D,YAAcoD,EACpBl0E,MCnoBf,SAASm0E,GAAmBr7D,EAAK7H,EAAMmjE,EAAM1qC,EAAM8T,GAC/C,GAAIvsC,IAASojE,GAAepjE,KAAKqjE,kBAAoBrjE,IAASojE,GAAepjE,KAAKsjE,kBAC9E,MAAM,IAAIlyE,EAAa,mBAAoB,uDAE/C,IAAI+U,EAAU,EACVo9D,EAAgB,IAEhBvjE,IAASojE,GAAepjE,KAAKsjE,oBAC7Bn9D,GAAW,EACXo9D,EAAgB,GAGpB17D,EAAI4kC,SAAS02B,EAAOh9D,EAASsyB,EAAM,EAAG8T,EAAO9T,GAE7C5wB,EAAI4kC,SAAS02B,EARW,EAQa1qC,EAAM8qC,EAAeh3B,EAAO9T,GDwnBrEsmC,GAAMt6D,UAAY,CACdhI,OAAQhB,EAAKiB,WACbL,KAAM,EACNC,OAAQjC,EAAWsC,OACnBJ,MAAOjC,EAAUqC,QCznBd,MAAMymE,WAAuBthE,EAChC1R,YAAYozE,EAAWC,GACnBjyE,QACAzC,KAAKw7C,UAAYjf,EAAOqC,qBACxB5+B,KAAKyJ,MAAQ,EACbzJ,KAAKy0E,UAAYA,EACjBz0E,KAAK00E,aAAeA,EACpB10E,KAAKiR,KAAOojE,GAAepjE,KAAK2qC,OAChC57C,KAAKkW,YAGLlW,KAAKoX,QAAU,EACfpX,KAAK20E,MAAQ,GAENrzE,sBACP,OAAOG,EAAS4yE,eAMpB53B,QAAQxrC,GAKJ,OAJAA,EAAuB,iBAATA,EAAoBojE,GAAe33B,WAAWzrC,GAAQA,IACxDojE,GAAepjE,KAAK2jE,cAAgB3jE,GAAQojE,GAAepjE,KAAKgrC,OACxEj8C,KAAKiR,KAAOA,GAETjR,KAGX6tE,QAAQ5pE,EAAMiU,EAAU,IAKpB,OAJAlY,KAAK20E,MAAM98D,KAAK,CACZg9D,QAAS5wE,EACTiU,QAAS7X,OAAO0V,OAAO,CAAEk2D,QAAS,EAAG3uC,QAAS,GAAKplB,KAEhDlY,KAEXma,UAAU/C,GACN,GAAuB,iBAAZA,EACP,MAAM,IAAI/U,EAAa,cAAe,4BAG1C,OADArC,KAAKoX,QAAUA,EACRpX,KAEXyd,YACI,OAAOzd,KAAKoX,QAGhBzC,OACI,MAAMmE,EAAM9Y,KAAK0U,eACjB1U,KAAKgV,cACL,IAAI00B,EAAO1pC,KAAKy0E,UAAUhyC,YAAY,GAClC+a,EAAOx9C,KAAK00E,aAAajyC,YAAYziC,KAAK00E,aAAa9mC,cAAgB,GAAK5tC,KAAKw7C,UACjF/xC,EAAQzJ,KAAKyJ,MACb2qE,EAAOp0E,KAAKy0E,UAAUxsE,QACIjI,KAAKiR,OAASojE,GAAepjE,KAAK2jE,cAC5D50E,KAAKiR,OAASojE,GAAepjE,KAAKsjE,mBAClCv0E,KAAKiR,OAASojE,GAAepjE,KAAK6jE,eAElCV,EAAOp0E,KAAKy0E,UAAUxsE,OAASjI,KAAKy0E,UAAUl4D,YAElD,IAAIw4D,EAAoBv3B,EAAO9T,EAC/B,OAAQ1pC,KAAKiR,MACT,KAAKojE,GAAepjE,KAAK0qC,OAGzB,KAAK04B,GAAepjE,KAAK+jE,YAGzB,KAAKX,GAAepjE,KAAK2jE,aACrBnrE,EAAQ,EACR,MACJ,KAAK4qE,GAAepjE,KAAK2qC,OACrBw4B,GAAQp0E,KAAKyJ,MAAQ,EACrBigC,GAAQ1pC,KAAKw7C,UACbu5B,GAAqB,GACrB,MACJ,KAAKV,GAAepjE,KAAKgkE,MAAO,CAC5BxrE,EAAQ,GAER,MAAMP,EAAKlJ,KAAKy0E,UAAUxsE,OAAS,EAAIjI,KAAKoX,QACtChO,EAAKsgC,EACLwrC,EAAKhsE,EACLisE,EAAK33B,EACLn0C,EAAKH,EAAKO,EACVH,EAAKF,EAAK2rE,EAAoB,EAC9BK,EAAO/rE,EAAK,GAAMI,EAClB4rE,EAAOjsE,EAAK,GAAM2rE,EAClBO,EAAOpsE,EAAK,IAAMO,EAClB8rE,EAAOjsE,EAAK,KAAQyrE,EACpBS,EAAOF,EACPG,EAAOnsE,EAAK,KAAQyrE,EACpBW,EAAON,EACPO,EAAOR,EAAK,GAAMJ,EAClBa,EAAOvsE,EAAKI,EACZosE,EAAOF,EACPG,EAAO5sE,EAAK,GAAMO,EAClBssE,EAAOzsE,EAAK,KAAQyrE,EACpBiB,EAAOF,EACPG,EAAO3sE,EAAK,KAAQyrE,EACpBmB,EAAON,EACPO,EAAOd,EACbv8D,EAAIQ,YACJR,EAAIS,OAAOrQ,EAAIE,GACf0P,EAAIY,cAAc07D,EAAMC,EAAMC,EAAMC,EAAMlsE,EAAIC,GAC9CwP,EAAIY,cAAc87D,EAAMC,EAAMC,EAAMC,EAAMT,EAAIC,GAC9Cr8D,EAAIY,cAAck8D,EAAMC,EAAMC,EAAMC,EAAM1sE,EAAIC,GAC9CwP,EAAIY,cAAcs8D,EAAMC,EAAMC,EAAMC,EAAMjtE,EAAIE,GAC9C0P,EAAIa,OACJb,EAAIikB,SACJ,MAEJ,KAAKs3C,GAAepjE,KAAKmlE,QACrB1sC,GAAQ,EACR8T,GAAQ,EACRu3B,EAAoBv3B,EAAO9T,EAC3B5yB,EAAMu8C,YAAYv6C,EAAKs7D,EAAO,EAAG1qC,EAAM,GAAI,cAC3C5yB,EAAMu8C,YAAYv6C,EAAKs7D,EAAO,EAAG52B,EAAM,GAAI,iBAC3C42B,GAAQp0E,KAAKyJ,MAAQ,EACrB,MACJ,KAAK4qE,GAAepjE,KAAKqjE,iBACrBH,GAAmBr7D,EAAK9Y,KAAKiR,KAAMmjE,EAAOp0E,KAAKoX,QAASsyB,EAAM8T,EAAOx9C,KAAKw7C,WAC1E,MACJ,KAAK64B,GAAepjE,KAAKsjE,kBACrBJ,GAAmBr7D,EAAK9Y,KAAKiR,KAAMmjE,EAAM1qC,EAAM8T,EAAOx9C,KAAKw7C,WAC3D,MACJ,KAAK64B,GAAepjE,KAAK6jE,YACrBrrE,EAAQ,EACRsrE,GAAqB/0E,KAAKw7C,UAC1B,MACJ,KAAK64B,GAAepjE,KAAKgrC,KACrB,MACJ,QACI,MAAM,IAAI55C,EAAa,cAAe,qCAAqCrC,KAAKiR,qBAEpFjR,KAAKiR,OAASojE,GAAepjE,KAAKgkE,OAClCj1E,KAAKiR,OAASojE,GAAepjE,KAAKqjE,kBAClCt0E,KAAKiR,OAASojE,GAAepjE,KAAKsjE,mBAClCv0E,KAAKiR,OAASojE,GAAepjE,KAAKgrC,MAClCnjC,EAAI4kC,SAAS02B,EAAM1qC,EAAMjgC,EAAOsrE,GAGhC/0E,KAAKiR,OAASojE,GAAepjE,KAAK6jE,aAClCh8D,EAAI4kC,SAAS02B,EAAO,EAAG1qC,EAAMjgC,EAAOsrE,GAExCj8D,EAAIlF,OACJkF,EAAIxE,aAAa,GACjBwE,EAAIxD,QAAQtV,KAAKwV,UAEjB,IAAK,IAAI9N,EAAI,EAAGA,EAAI1H,KAAK20E,MAAM7vE,OAAQ4C,IAAK,CACxC,MAAMzD,EAAOjE,KAAK20E,MAAMjtE,GAClBonC,EAAah2B,EAAIi2B,YAAY,GAAK9qC,EAAK4wE,SAASprE,MAChD5G,EAAI7C,KAAKy0E,UAAUxsE,OAAS6mC,EAAa,GAAK7qC,EAAKiU,QAAQ+zD,QAC3DpkE,GAAK7H,KAAKy0E,UAAUhyC,YAAY,GAAKziC,KAAK00E,aAAa5G,kBAAoB,EAAI7pE,EAAKiU,QAAQolB,QAClGxkB,EAAIg3B,SAAS,GAAK7rC,EAAK4wE,QAAShyE,EAAGgF,EAAI,GAE3CiR,EAAItE,WAGZ6/D,GAAe3+D,UAAY,CACvBhI,OAAQhB,EAAK8D,MACblD,KAAM,GACNC,OAAQjC,EAAWsC,OACnBJ,MAAOjC,EAAUqC,QAOrBymE,GAAepjE,KAAO,CAClB2jE,aAAc,EACdI,YAAa,EACbr5B,OAAQ,EACRC,OAAQ,EACRq5B,MAAO,EACPmB,QAAS,EACT9B,iBAAkB,EAClBC,kBAAmB,EACnBO,YAAa,EACb74B,KAAM,GAeVo4B,GAAe33B,WAAa,CACxB25B,YAAahC,GAAepjE,KAAK2jE,aACjC0B,WAAYjC,GAAepjE,KAAK+jE,YAChCr4B,OAAQ03B,GAAepjE,KAAK0qC,OAC5BiB,OAAQy3B,GAAepjE,KAAK2qC,OAC5B26B,MAAOlC,GAAepjE,KAAKgkE,MAC3BuB,QAASnC,GAAepjE,KAAKmlE,QAC7BK,eAAgBpC,GAAepjE,KAAKqjE,iBACpCoC,gBAAiBrC,GAAepjE,KAAKsjE,kBACrCoC,WAAYtC,GAAepjE,KAAK6jE,YAChC73B,KAAMo3B,GAAepjE,KAAKgrC,MCvN9B,MAAM26B,GAAYC,GAAQA,EAAItnC,QAAO,CAAC5rC,EAAGC,IAAMD,EAAIC,GAAG,GAKtD,SAASkzE,GAAe5xC,EAAQ6xC,EAAaC,GACzC,MAAMxrB,EAAuB4C,GAAU7B,wBAAwBrnB,GAEzD+xC,EAAmB,GACnBC,EAAW,GACXnnB,EAAW,GAsBjB,OAnBA7qB,EAAOhnB,SAAQ,CAACmnB,EAAOorB,KAGnB,MAAM9E,EAAY,IAAItnD,EAAS,EAAGmnD,GAClCnmB,EAAME,eAAernB,SAASuuC,IAC1B,MAAM0qB,EAAexrB,EAAUrnD,UAE/B,IAAK2yE,EAAiBE,GAAe,CACjC,MAAMC,EAAaL,EAAY,CAAE7nB,OAAQioB,IACzCpnB,EAASl4C,KAAKu/D,GACdH,EAAiBE,GAAgBC,EAEjCF,EAASr/D,KAAKs/D,GAGlBH,EAAavqB,EAAUwqB,EAAiBE,GAAe1mB,GACvD9E,EAAUpmD,IAAIknD,EAAS/mB,kBAGxB,CACHnzB,IAAK0kE,EACLI,MAAOtnB,EACPunB,KAAMJ,EAASt0C,MAAK,CAACj/B,EAAGC,IAAMD,EAAIC,IAClC4nD,qBAAAA,GAgBR,SAAS+rB,GAA4B15C,EAAO25C,EAAcC,EAAevxE,GAErE,IAAIwxE,EAAeF,EAEnB,IAAK,IAAIG,EAAYF,EAAgB,EAAGE,EAAY95C,EAAM/4B,OAAQ6yE,IAAa,CAC3E,MAAMj7D,EAAOmhB,EAAM85C,GACnB,GAAI91E,EAAO6a,KAAUA,EAAKupB,WAAavpB,EAAK8oB,oBAAqB,CAC7DkyC,EAAeh7D,EAAKs8B,iBACpB,OAIR,GAAI9yC,GAAWsxE,IAAiBE,EAAc,CAG1CA,EAAeh0E,EAFHS,KAAK4E,IAAIyuE,EAAcE,GACvBvzE,KAAKqlC,IAAIguC,EAAcE,IAGvC,OAAOA,EAkBJ,MAAMtpB,GACT/sD,YAAY6W,GACRlY,KAAK43E,iBAAmBv3E,OAAO0V,OAAO,CAAE8hE,eAAe,EAAOhsB,cAAe,IAAKisB,cAAe,GAAK5/D,GACtGlY,KAAK+3E,aAAe,EACpB/3E,KAAKg4E,UAAY,EACjBh4E,KAAK4kC,WAAa,EAClB5kC,KAAKi4E,cAAgB,GAErBj4E,KAAKk4E,cAAgB,EAErBl4E,KAAKm4E,kBAAmB,EAExBn4E,KAAKo4E,kBAAet1E,EACpB9C,KAAKq4E,sBAAmBv1E,EAGxB9C,KAAKs4E,YAAc,CACfC,MAAO,EACPC,KAAM,IAEVx4E,KAAKklC,OAAS,GACdllC,KAAKy4E,YAAc,GAMvBh0E,oBAAoBo5B,EAAOh7B,EAAI,GAAG,eAAE61E,EAAiB,IAAO,IACxD76C,EAAM0R,QAAO,CAACopC,EAAaj8D,KACvBA,EAAK04B,qBAAqB,IAAI2yB,IAC9B,MAAMhX,GAAO,IAAI9B,IAAc1B,YAAY7wC,GAAM+4B,YAC3ChmC,EAAUshD,EAAKjhD,aAErB,OADAihD,EAAK1oD,KAAKswE,EAAclpE,EAAQkgD,aACzBgpB,EAAc5nB,EAAKx0C,WAAa9M,EAAQmgD,aAAe8oB,IAC/D71E,GAGP4B,qBAAqBqU,EAAKyyB,EAAW1wB,EAAMzR,EAAIE,EAAI4O,GAE/C,MAAMrV,EAAIgY,GADV3C,EAAU7X,OAAO0V,OAAO,CAAE6iE,aAAcr8C,EAAOoF,mBAAmBvxB,aAAa,kBAAoB8H,IAC1E0gE,aACnBN,EAAc/sC,EAAU+sC,YAQ9Bx/D,EAAIlF,OACJkF,EAAIxD,QAAQ5I,EAAKiB,WAAY,GAC7B2qE,EAAYE,KAAKt6D,SAAS26D,IAT1B,IAAgB3vE,EAAIG,EAAIuuC,EAAR1uC,EAULrG,EAAIg2E,EAAI3vE,GAVCG,EAUGxG,EAAIg2E,EAAIxvE,GAVPuuC,EAUW,wBAT/B9+B,EAAIQ,YACJR,EAAI1E,eAAewjC,GACnB9+B,EAAI5E,aAAa0jC,GACjB9+B,EAAIxE,aAAa,GACjBwE,EAAI4kC,SAASx0C,EAAIE,EAAIjF,KAAK4E,IAAIM,EAAKH,EAAI,GAAII,EAAKF,GAMhD0P,EAAI5E,aAAa,SACjB4E,EAAIg3B,SAAS3rC,KAAKw+B,MAAMk2C,EAAIxvE,GAAKwvE,EAAI3vE,IAAIjC,WAAYpE,EAAIg2E,EAAI3vE,GAAII,EAAK,OAE1EwP,EAAI5E,aAAa,OACjB4E,EAAIg3B,SAAS,UAAUvE,EAAUysC,WAAa,GAAGc,QAAQ,cAAcvtC,EAAU3G,YAAc,GAAGk0C,QAAQ,WAAWR,EAAYC,MAAMO,QAAQ,KAAMj2E,EAAI,GAAIyG,EAAK,IAClKwP,EAAItE,UAiBR/P,qBAAqBqU,EAAKoB,EAAO2jB,EAAOnB,GACpC,IAAIxkB,EAAU,CACV6gE,WAAW,EACXC,aAAa,GAEK,iBAAXt8C,EACPxkB,EAAU7X,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAImC,GAAUwkB,GAE7B,kBAAXA,IACZxkB,EAAQ6gE,UAAYr8C,GAGxB,MAAM2I,EAAQ,IAAIgmB,GAAM9uB,EAAO4D,SAASmsB,QAAQjB,GAAMW,KAAKY,MAAMY,aAAa3vB,GAExEgwB,EAAQ31C,EAAQ6gE,UAAYtqB,GAAKwqB,iBAAiB5zC,GAAS,GASjE,OAPA,IAAI+oB,IACCC,WAAW,CAAChpB,IACZ6zC,cAAc,CAAC7zC,GAAQnrB,EAAO,CAAE8+D,YAAa9gE,EAAQ8gE,YAAa9+D,MAAAA,IAEvEmrB,EAAMprB,SAASC,GAAOvF,KAAKmE,EAAKoB,GAChC2zC,EAAM3vC,SAASq7B,GAASA,EAAKlkC,WAAWyD,GAAKnE,SAEtC0wB,EAAMlwB,iBAejB1Q,wBAAwBqU,EAAKqgE,EAAUj/D,EAAOk/D,EAAUv7C,EAAOw7C,EAAU38C,GACrE,IAAImrC,EAAO,CACPkR,UAAWM,EACXL,aAAa,GAEK,iBAAXt8C,EACPmrC,EAAOxnE,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI8xD,GAAOnrC,GAEvB,kBAAXA,IACZmrC,EAAKkR,UAAYr8C,GAGrB,MAAM48C,EAAY,IAAIjuB,GAAM9uB,EAAO4D,SAASmsB,QAAQjB,GAAMW,KAAKY,MAAMY,aAAa3vB,GAE5E07C,EAAW,IAAIluB,GAAM9uB,EAAO4D,SAASmsB,QAAQjB,GAAMW,KAAKY,MAAMY,aAAa4rB,GAE3EvrB,EAAQga,EAAKkR,UAAYtqB,GAAKwqB,iBAAiBK,GAAa,IAElE,IAAIlrB,IACCC,WAAW,CAACirB,IACZjrB,WAAW,CAACkrB,IACZL,cAAc,CAACI,EAAWC,GAAWr/D,EAAO,CAAE8+D,YAAanR,EAAKmR,cAErEM,EAAU3kE,KAAKmE,EAAKoB,GACpBq/D,EAAS5kE,KAAKmE,EAAKqgE,GACnBtrB,EAAM3vC,SAASq7B,GAASA,EAAKlkC,WAAWyD,GAAKnE,SAE7C,IAAI0/D,GAAen6D,EAAOi/D,GAAU9jE,WAAWyD,GAAKnE,OAQxDlQ,yBAAyBqhC,EAAW0zC,EAAeC,GAC/C3zC,EAAU5nB,SAAQ,CAACw7D,EAActoE,KAC7B,GAAIrP,EAAY23E,IAAiBA,EAAazzC,SAAU,CACpD,GAAIyzC,EAAajlC,cAAgBglC,EAC7B,OAGJ,MAAMh+D,EAAWi+D,EAAazgC,WAAWx9B,SAASohB,cAClD,GAAiB,QAAbphB,GAAmC,QAAbA,EACtB,OAEJ,GAAI+9D,GAAiBE,EAAapgC,UAAW,CAEzC,MAAMlX,EAAQs3C,EAAar3C,cAAc,GACzC,GAAc,IAAVjxB,EACAgxB,EAAMl/B,KAAOq0E,GAA4BzxC,EAAW1D,EAAMl/B,KAAMkO,GAAO,QAEtE,GAAIA,EAAQ,GAAKA,EAAQ00B,EAAUhhC,OAAQ,CAE5C,MAAM60E,EAAe7zC,EAAU10B,EAAQ,GACvC,GAAIrP,EAAY43E,GACZ,GAAIA,EAAa1zC,SACb7D,EAAMl/B,KAAOy2E,EAAat3C,cAAc,GAAGn/B,SAE1C,CACD,MAAMo2D,EAAWqgB,EAAa3gC,iBAE9B5W,EAAMl/B,KAAOq0E,GAA4BzxC,EAAWwzB,EAAUloD,GAAO,IAIjFsoE,EAAanjB,WAAW,EAAGn0B,EAAMl/B,WAWjD02E,WAAW10C,EAAQs0C,GACf,IAAKt0C,IAAWA,EAAOpgC,OACnB,MAAM,IAAIzC,EAAa,cAAe,6BAE1C6iC,EAAOhnB,SAASmnB,GAAU+oB,GAAUyrB,kBAAkBx0C,EAAME,eAAgBi0C,KAoBhFM,0BAA0B50C,GACtB,MAAM60C,EAAmBx9C,EAAOoF,mBAAmBvxB,aAAa,8BAGhE,IAAI4pE,EAAoB,EACpBC,EAAO,EACPC,EAAO,EACX,MAAMx+B,EAAS,GACT31B,EAAY,GAElB,GAAI/lB,KAAKm4E,iBACL,OAAOn4E,KAAKk4E,cAEhB,IAAKl4E,KAAKo4E,aAAc,CACpB,IAAKlzC,EACD,MAAM,IAAI7iC,EAAa,cAAe,sDAE1CrC,KAAKm6E,mBAAmBj1C,GAG5B,MAAQoyC,KAAM8C,EAAa7nE,IAAK8nE,GAAer6E,KAAKo4E,aACpDp4E,KAAKk4E,cAAgB,EAGrBkC,EAAYl8D,SAAS6yC,IACjB,MAAMp9C,EAAU0mE,EAAWtpB,GAC3Bp9C,EAAQ8hC,YAGJ9hC,EAAQ4xB,eAAezgC,OAASogC,EAAOpgC,SACvCk1E,GAAqB,GAGzBrmE,EAAQ4xB,eAAernB,SAAStZ,IAC5Bq1E,GAAQr1E,EAAEkL,aAAarG,MACvBywE,GAAQt1E,EAAE8gC,WAAWxgC,QACrBw2C,EAAO7jC,KAAKjT,EAAEkL,aAAarG,OAC3Bsc,EAAUlO,KAAKjT,EAAE8gC,WAAWxgC,YAEhC,MAAMuE,EAAQkK,EAAQ4I,WACtBvc,KAAKk4E,eAAiBzuE,KAE1BzJ,KAAKm4E,kBAAmB,EAExB,MAAMmC,EAAOL,EAAO,EAAIA,EAAOv+B,EAAO52C,OAAS,EAAI42C,EAAO52C,OACpDy1E,EAAO3D,GAASl7B,EAAOnpC,KAAKioE,GAAOr2E,KAAK6G,IAAIwvE,EAAKF,EAAM,MACvDG,EAAQt2E,KAAK6G,IAAIuvE,EAAO7+B,EAAO52C,OAAQ,IAAOw1E,EAC9CI,EAAOR,EAAOn0D,EAAUjhB,OACxB61E,EAAO/D,GAAS7wD,EAAUxT,KAAKioE,GAAOr2E,KAAK6G,IAAIwvE,EAAKE,EAAM,MAC1DE,EAAQz2E,KAAK6G,IAAI2vE,EAAO50D,EAAUjhB,OAAQ,IAAO41E,EAEjDG,EAAS12E,KAAK4E,IAAI6xE,EAAOH,GAASL,EAAYt1E,OAASi1E,EACvDe,EAAef,EAAmBC,EACxC,OAAOh6E,KAAKk4E,cAAgB/zE,KAAK4E,IAAI+xE,EAAcD,GAMvDtsB,mBACI,IAAKvuD,KAAKm4E,iBACN,MAAM,IAAI91E,EAAa,kBAAmB,qFAE9C,OAAOrC,KAAKk4E,cAGhBzzE,+BAA+BygC,GAC3B,IAAKA,IAAWA,EAAOpgC,OACnB,MAAM,IAAIzC,EAAa,cAAe,uBAE1C,MAAMypD,EAAa5mB,EAAO,GAAG+mB,gBAU7B,OAT6B/mB,EAAOqK,QAAO,CAACopC,EAAatzC,KACrD,IAAKA,EAAM4mB,gBAAgBhmD,OAAO6lD,GAC9B,MAAM,IAAIzpD,EAAa,eAAgB,yDAE3C,GAAIgjC,EAAMgnB,YAAchB,GAAMW,KAAKN,SAAWrmB,EAAMwnB,aAChD,MAAM,IAAIxqD,EAAa,kBAAmB,qCAE9C,OAAO8B,KAAK4E,IAAI4vE,EAAat0E,EAASU,IAAI4zE,EAAatzC,EAAMknB,8BAC9D,GAIPwuB,uBAAuB71C,GACnB,MACM6qB,EAAW+mB,GAAe5xC,GAAQ,IAAM,IAAI6iC,KADvC,CAACtb,EAAU94C,IAAY84C,EAASrX,qBAAqBzhC,KAGhE,OADA3T,KAAKq4E,iBAAmBtoB,EACjBA,EAMXoqB,mBAAmBj1C,GACf,MACM6qB,EAAW+mB,GAAe5xC,GAAS6rB,GAAS,IAAI9B,GAAY8B,KADvD,CAACtE,EAAU94C,EAAS88C,IAAe98C,EAAQ45C,YAAYd,EAAUgE,KAE5EzwD,KAAKo4E,aAAeroB,EACpB,MAAMirB,EAAeh7E,KAAKo4E,aAAaf,MAIvC,OAHA2D,EAAa98D,SAASvK,IAClBA,EAAQk8C,UAAYmrB,KAEjBjrB,EAQXta,UAAUsiC,EAAe,EAAGkD,EAAkBC,EAAahhE,GAEvD,MAAM61C,EAAW/vD,KAAKo4E,aACtB,IAAKroB,EACD,MAAM,IAAI1tD,EAAa,iBAAkB,mCAE7C,MAAQi1E,KAAM8C,EAAa7nE,IAAK8nE,GAAetqB,EAE/C/vD,KAAKy4E,YAAc,GAGfyC,GAAehhE,GACfghE,EAAYh9D,SAASmnB,GAAUA,EAAMprB,SAASC,GAAOu7B,cAIzD,IAAI5yC,EAAI,EACJmC,EAAQ,EACZhF,KAAKk4E,cAAgB,EACrB,IAAIpsB,EAAa,EAEjBsuB,EAAYl8D,SAAS6yC,IACjB,MAAMp9C,EAAU0mE,EAAWtpB,GAG3Bp9C,EAAQ8hC,YACR,MAAMhsC,EAAQkK,EAAQ4I,WACtBvc,KAAKk4E,eAAiBzuE,EACtB,MAAM2lD,EAAWz7C,EAAQy8C,cAAclrD,QACvC4mD,GAAcsD,EACd,MAAM3/C,EAAUkE,EAAQ7D,aACxBjN,EAAIA,EAAImC,EAAQyK,EAAQkgD,YACxBh8C,EAAQtL,KAAKxF,GAEbmC,EAAQyE,EAAQgG,EAAQkgD,eAG5B,MAAM,cAAEkoB,EAAa,cAAEhsB,EAAa,cAAEisB,GAAkB93E,KAAK43E,iBAEvD1qB,EAAe0pB,GAASwD,EAAY7nE,KAD7Bw+C,GAAS5sD,KAAK6G,IAAI6gD,EAAgBwuB,EAAWtpB,GAAMX,cAAclrD,QAAU4mD,MAKxF,GAHA9rD,KAAKk4E,cAAgBr1E,EAAImC,EACzBhF,KAAKm4E,kBAAmB,EAEpBJ,GAAgB,EAChB,OAAO/3E,KAAKm7E,WAGhB,MAAMC,EAAef,EAAWD,EAAY,IACtC/W,EAAcgX,EAAWD,EAAYA,EAAYt1E,OAAS,IAGhE,SAASu2E,EAAwBC,GA8D7B,OA7DkBlB,EAAY7nE,KAAI,CAACw+C,EAAMrpD,KACrC,MAAMiM,EAAU0mE,EAAWtpB,GACrB7rB,EAASvxB,EAAQ+8C,sBACvB,IAAI6qB,EACJ,GAAI7zE,EAAI,EAAG,CACP,MAAM8zE,EAAcnB,EAAWD,EAAY1yE,EAAI,IAI/C,IAAK,IAAIy6C,EAAIz6C,EAAI,EAAGy6C,GAAK,EAAGA,IAAK,CAC7B,MACMs5B,EADWpB,EAAWD,EAAYj4B,IACZuO,sBAEtBgrB,EAAiB,GAMvB,GALAr7E,OAAOiS,KAAK4yB,GAAQhnB,SAASmvC,IACrBouB,EAAWpuB,IACXquB,EAAe7jE,KAAKw1C,MAGxBquB,EAAe52E,OAAS,EAAG,CAE3B,IAAIsqD,EAAW,EACXusB,EAAqBphB,EAAAA,EACrBqhB,EAAmB,EAqBvB,GApBAF,EAAex9D,SAASmvC,IACpB,MAAMlvB,EAAQs9C,EAAWpuB,GAAG3nB,WAAWxgC,QACnCi5B,EAAQixB,IACRmsB,EAAeE,EAAWpuB,GAC1B+B,EAAWjxB,GAGf,MAAM09C,EAAe32C,EAAOmoB,GACtByuB,EAAiBD,EAAa5zE,QAC/B4zE,EAAa/rE,aAAakO,UAAY69D,EAAa/rE,aAAagnC,qBAC/DilC,EAAcN,EAAWpuB,GAAGv9C,aAC5BksE,EAAkBP,EAAWpuB,GAAGplD,OAAS8zE,EAAYxkC,OAASwkC,EAAY99D,WAAa89D,EAAYhlC,qBAEzG4kC,EAAqBx3E,KAAKqlC,IAAImyC,EAAoBG,EAAiBE,MAIvEL,EAAqBx3E,KAAKqlC,IAAImyC,EAAoBhoE,EAAQ1L,QAAUuzE,EAAYvzE,OAAgC,IAAvBqzE,IAGrFzD,EAAe,CACf,MAAMjzE,EAAIknD,EACV8vB,EAAoBz3E,KAAK6G,IAAI6gD,EAAgBuD,EAAWxqD,GAAMsoD,EAAgBouB,YAEjD,IAAjBC,IACZK,EAAmBL,EAAahnC,WAAW4Y,QAAQiC,GAAYksB,GAEnE,MAAO,CACHM,iBAAAA,EACAD,mBAAAA,EACAM,aAAcV,KAK9B,MAAO,CAAEK,iBAAkB,EAAGM,eAAgB,EAAGP,mBAAoB,MAI7E,SAASQ,EAAsBC,GAE3B,MAAMC,EAAUf,EAAuB,EACvC,IAAIgB,EAAa,EAsBjB,OArBAlC,EAAYl8D,SAAQ,CAAC6yC,EAAM3/C,KACvB,MAAMuC,EAAU0mE,EAAWtpB,GAC3B,GAAI3/C,EAAQ,EAAG,CACX,MAAMmrE,EAAW5oE,EAAQ1L,OACnBu0E,EAAQJ,EAAehrE,GACvBqrE,EAAU75E,EAAQ45E,EAAMP,cAAch0E,OAASu0E,EAAMZ,kBAAoBW,EAAWD,GAC1F,IAAII,EAAkB,EAClBD,EAAU,EACVH,GAAcG,EAETA,EAAU,IACfC,EAAkBv4E,KAAKqlC,IAAIgzC,EAAMb,mBAAoBx3E,KAAK6C,IAAIy1E,IAC9DH,IAAeI,GAEnB/oE,EAAQtL,KAAKk0E,EAAWD,GAG5B3oE,EAAQg9C,4BAA4BzyC,SAASuuC,IACzCA,EAASrY,gBAAgBioC,EAAU1oE,EAAQ1L,cAG5Co7D,EAAYp7D,OAASmzE,EAAanzE,OAE7C,MAAMqzE,EAAuBvD,EACzB1U,EAAYvzD,aAAaynC,OACzB8rB,EAAYvzD,aAAa8/C,aACzBwrB,EAAatrE,aAAa6/C,YACxBjuB,EAAYnF,EAAOoF,mBACnBg7C,EAAmBj7C,EAAUtxB,aAAa,uBAC1CwsE,EAAmBl7C,EAAUtxB,aAAa,uBAChD,IAAIysE,EAAcvB,EAClB,MAAMwB,EAAYzB,EAAwBwB,GAC1C,IAAIE,EAAcZ,EAAsBW,GAIxC,MASME,EATkB,EAACH,EAAaC,KAClC,IAAIG,EAASJ,EAAc,EAC3B,GAAIC,EAAUh4E,OAAS,EACnB,IAAK,IAAIo4E,EAAK,EAAGA,EAAKJ,EAAUh4E,SAAUo4E,EACtCD,EAAS94E,KAAKqlC,IAAIszC,EAAUI,GAAItB,iBAAmB,EAAGqB,GAG9D,OAAOA,GAESE,CAAgBN,EAAaC,GAEjD,GAA2B,IAAvB1C,EAAYt1E,OACZ,OAAO,EAIX,MAAMs4E,EAAgC,EAAnBR,EAAuBI,EAAcA,EAAcJ,EAEhES,EAAO/B,GADM8B,GAAcR,EAAmBD,IAEpD,IAAIjpC,EAAaokC,EAGjB,KAAQiF,EAAcM,GAAQ3pC,EAAa,GAAOqpC,EAAcK,EAAaC,GAAQ3pC,EAAa,GAC9FmpC,GAAeE,EAAcM,EAC7BN,EAAcZ,EAAsBd,EAAwBwB,IAC5DnpC,IAGJ,OADA1zC,KAAK+3E,aAAeA,EACb/3E,KAAKm7E,WAGhBA,WACI,IAAKn7E,KAAKo4E,aACN,OAAO,EACX,MAAMroB,EAAW/vD,KAAKo4E,aAChBL,EAAe/3E,KAAK+3E,aAG1B/3E,KAAKs4E,YAAc,CAAEC,MAAO,EAAGC,KAAM,IACrCzoB,EAASunB,KAAKp5D,SAAQ,CAAC6yC,EAAM3/C,KACzB,GAAc,IAAVA,EACA,OACJ,MAAMksE,EAAWvtB,EAASunB,KAAKlmE,EAAQ,GACjCoqE,EAAczrB,EAASx9C,IAAI+qE,GAC3B3pE,EAAUo8C,EAASx9C,IAAIw+C,GACvBwsB,EAAc/B,EAAY1rE,aAC1B0tE,EAAc7pE,EAAQ7D,aAEtBksE,EAAkBR,EAAYvzE,OAASs1E,EAAYhmC,OAASgmC,EAAY3tB,aAExEksB,EAAiBnoE,EAAQ1L,OAASu1E,EAAY7tB,YAC9CkpB,EAAMiD,EAAiBE,EAC7Bh8E,KAAKs4E,YAAYC,OAASM,EAC1B74E,KAAKs4E,YAAYE,KAAK3gE,KAAK,CAAE3O,GAAI8yE,EAAiB3yE,GAAIyyE,IAEtDnoE,EAAQsgC,sBAAsBR,QAAQr3B,KAAOy8D,EAC7C2C,EAAYvnC,sBAAsBR,QAAQp3B,MAAQw8D,KAItD74E,KAAKi4E,cAAgB,GACrB,MAAMA,EAAgBj4E,KAAKi4E,cAW3Bj4E,KAAKklC,OAAOhnB,SAASmnB,IACjBA,EAAME,eAAernB,SAAQ,CAACxB,EAAMhV,EAAGm2B,KACnC,MAAME,EAAWrhB,EAAKgpB,WAAWh/B,QAAQvB,WAAW8B,WAC9CwI,EAAUiN,EAAK5M,aACf0jC,EAAmB92B,EAAKu3B,sBACxBwpC,EAAe/gE,EAAKzU,OAASwH,EAAQ8nC,OAAS9nC,EAAQwO,WAAaxO,EAAQsnC,qBACjF,IAAIpD,EAAQ,EACZ,GAAIjsC,EAAIm2B,EAAM/4B,OAAS,EAAG,CACtB,MAAM44E,EAAY7/C,EAAMn2B,EAAI,GACtBi2E,EAAeD,EAAU5tE,aAE/B6jC,EADsB+pC,EAAUz1E,OAAS01E,EAAa3/D,UAAY2/D,EAAa7mC,oBACvD2mC,EACxBjqC,EAAiBG,MAAMC,KAAO8pC,EAAUz1E,OAASyU,EAAKzU,OACtDy1E,EAAUzpC,sBAAsBR,QAAQr3B,KAAOu3B,OAG/CA,EAAQokC,EAAe0F,EACvBjqC,EAAiBG,MAAMC,KAAOmkC,EAAer7D,EAAKzU,OAEtDurC,EAAiBC,QAAQp3B,MAAQs3B,EA7BzC,SAAqB5V,EAAU4V,GAC3B,MAAMiqC,EAAQ3F,EAAcl6C,QACdj7B,IAAV86E,EACA3F,EAAcl6C,GAAY,CAAE8V,KAAMF,EAAOkqC,MAAO,IAGhDD,EAAMC,OAAS,EACfD,EAAM/pC,MAAQ+pC,EAAM/pC,KAAOF,GAAS,GAuBpCmqC,CAAY//C,EAAUyV,EAAiBG,MAAMC,YAKrD,IAAImqC,EAAiB,EAcrB,OAbA/9E,KAAKklC,OAAOhnB,SAASmnB,IACjBA,EAAME,eAAernB,SAASxB,IAC1B,MAAMqhB,EAAWrhB,EAAKgpB,WAAWh/B,QAAQvB,WAAW8B,WAC9CwI,EAAUiN,EAAKu3B,sBACrBxkC,EAAQkkC,MAAME,KAAOokC,EAAcl6C,GAAU8V,KAC7CpkC,EAAQsuB,SAAWA,EACnBtuB,EAAQikC,YAAc,EACtBjkC,EAAQkkC,MAAMG,UAAYrkC,EAAQkkC,MAAMC,KAAOnkC,EAAQkkC,MAAME,KAC7DkqC,GAAkB55E,KAAK6G,IAAIyE,EAAQkkC,MAAMG,UAAW,SAG5D9zC,KAAKg4E,UAAY7zE,KAAKiH,KAAK2yE,GAC3B/9E,KAAKy4E,YAAY5gE,KAAK7X,KAAKg4E,WACpBh4E,KAAKg4E,UAUhBgG,KAAK9lE,GACD,IAAInL,EACJ,MAAMgjD,EAAW/vD,KAAKo4E,aACtB,IAAKroB,EACD,OAAO,EAEX,MAAMkuB,EAAmF,QAA1ElxE,EAAKmL,MAAAA,OAAyC,EAASA,EAAQ+lE,aAA0B,IAAPlxE,EAAgBA,EAAK,GAYtH,IAAI/H,EAAQ,EAsBZ,OArBAhF,KAAK4kC,WAAa,EAClBmrB,EAASunB,KAAKp5D,SAAQ,CAAC6yC,EAAM3/C,EAAOkmE,KAChC,MAAM3jE,EAAUo8C,EAASx9C,IAAIw+C,GACvByqB,EAAcpqE,EAAQ,EAAI2+C,EAASx9C,IAAI+kE,EAAKlmE,EAAQ,SAAMtO,EAC1DgwD,EAAc1hD,EAAQkmE,EAAKxyE,OAAS,EAAIirD,EAASx9C,IAAI+kE,EAAKlmE,EAAQ,SAAMtO,GAdlF,SAAco7E,EAASl5E,EAAOm+C,EAAMj3C,GAChCgyE,EAAQ71E,KAAK61E,EAAQj2E,OAASjD,GAC9Bk5E,EAAQjqC,sBAAsBR,QAAQr3B,MAAQpX,EAC9Ck5E,EAAQjqC,sBAAsBR,QAAQp3B,OAASrX,EAC3Cm+C,IACAA,EAAKlP,sBAAsBR,QAAQp3B,OAASrX,GAC5CkH,IACAA,EAAK+nC,sBAAsBR,QAAQr3B,MAAQpX,GAQ/CyD,CAAKkL,EAAS3O,EAAOw2E,EAAa1oB,GAClC,MAAMqrB,GAAQvH,GAASjjE,EAAQ4xB,eAAehzB,KAAK3N,GAAMA,EAAEqvC,sBAAsBN,MAAMG,aACnFqqC,EAAO,EACPn5E,GAASb,KAAKqlC,IAAI71B,EAAQsgC,sBAAsBR,QAAQp3B,MAAOlY,KAAK6C,IAAIm3E,IAEnEA,EAAO,IAERn5E,EADA8tD,EACQ3uD,KAAKqlC,IAAIspB,EAAY7e,sBAAsBR,QAAQp3B,MAAOlY,KAAK6C,IAAIm3E,IAGnE,GAGhBn5E,GAASi5E,EACTj+E,KAAK4kC,YAAc5/B,KAEhBhF,KAAKm7E,WAOhBxlC,aACI,MAAMyoC,EAAsBruB,GAAaA,EAASunB,KAAKp5D,SAAS6yC,GAAShB,EAASx9C,IAAIw+C,GAAMpb,eAK5F,OAJI31C,KAAKq4E,kBACL+F,EAAmBp+E,KAAKq4E,kBACxBr4E,KAAKo4E,cACLgG,EAAmBp+E,KAAKo4E,cACrBp4E,KAMXquD,WAAWnpB,GAGP,OAFAllC,KAAK+6E,uBAAuB71C,GAC5BllC,KAAKm4E,kBAAmB,EACjBn4E,KAYXsuD,OAAOppB,EAAQ6yC,EAAc7/D,GACzB,MAAM2vD,EAAOxnE,OAAO0V,OAAO,CAAEijE,aAAa,GAAS9gE,GACnDlY,KAAKklC,OAASA,EACd,MAAM2mB,EAAgB7rD,KAAK43E,iBAAiB/rB,cAU5C,OATIA,GACA7rD,KAAKklC,OAAOhnB,SAASmvC,GAAMA,EAAEN,iBAAiBlB,KAElD7rD,KAAK45E,WAAW10C,EAAQ2iC,EAAKmR,aAC7Bh5E,KAAKm6E,mBAAmBj1C,GACxBllC,KAAKy1C,UAAUsiC,EAAclQ,EAAKl0D,QAASuxB,EAAQ2iC,EAAK3tD,OAEpD2tD,EAAK3tD,OACLla,KAAK21C,aACF31C,KAGXk5E,cAAch0C,EAAQhrB,EAAOmkE,GACzB,MAAMnmE,EAAU7X,OAAO0V,OAAO,CAAEpC,QAASuG,EAAM9E,cAAgBipE,GAEzDtG,EAAe79D,EAAMs3D,cAAgBt3D,EAAMigC,gBAAkB61B,GAAMmB,eAEzE,OApuBR,YAAcluE,GACNmrD,GAAUltB,OACVn+B,EAAI,qBAAsBE,GAiuB1B,CAAE,+BAAgC80E,GAC3B/3E,KAAKsuD,OAAOppB,EAAQ6yC,EAAc7/D,GAE7C2F,eAAekzC,GACX,IAAIhkD,EACJ,OAAoC,QAA5BA,EAAK/M,KAAKo4E,oBAAiC,IAAPrrE,OAAgB,EAASA,EAAGwF,IAAIw+C,IC3uB7E,IAAIutB,GD+uBXlwB,GAAUltB,OAAQ,EC9uBlB,SAAWo9C,GACPA,EAAeA,EAAuB,QAAK,GAAK,SAChDA,EAAeA,EAAoB,IAAI,GAAK,MAFhD,CAGGA,KAAmBA,GAAiB,KAChC,MAAMC,WAAexrE,EACxB1R,YAAYw8B,EAAO3lB,EAAU,IAIzB,GAHAzV,QACAzC,KAAKw+E,iBAAmB,GACxBx+E,KAAKy+E,aAAe,IACf5gD,IAAUA,EAAM/4B,OACjB,MAAM,IAAIzC,EAAa,eAAgB,iCAE3CrC,KAAKkY,QAAUA,EACflY,KAAK69B,MAAQA,EACb79B,KAAK0+E,UAAsC57E,MAA1B9C,KAAKkY,QAAQwmE,UAAyB1+E,KAAKkY,QAAQwmE,UAAY7gD,EAAM/4B,OAGlF9E,KAAKkY,QAAQymE,gBACb3+E,KAAK4+E,kCAET5+E,KAAK6+E,eAAiB7+E,KAAKkY,QAAQ2mE,gBAAkB7+E,KAAKkY,QAAQymE,gBAAkB,EACtD77E,MAA1B9C,KAAKkY,QAAQ4mE,UACb9+E,KAAK8+E,UAAY9+E,KAAKkY,QAAQ4mE,UAG9B9+E,KAAK8+E,UAAYjhD,EAAMymB,MAAM5nC,IAAUA,EAAK+8B,YAEhDz5C,KAAK++E,QACuBj8E,MAAxB9C,KAAKkY,QAAQ6mE,QAAuB/+E,KAAKkY,QAAQ6mE,QAAU56E,KAAK6C,IAAIhH,KAAK6+E,eAAiB7+E,KAAK0+E,WAAa,EAChH1+E,KAAK6W,MAAQ0lB,EAAOoF,mBAAmBvxB,aAAa,sBACpDpQ,KAAKgZ,MAAQ,GACbhZ,KAAK+Y,MAAQ,IACb/Y,KAAKyJ,MAAQ,IACbzJ,KAAKg/E,kBAAkBh/E,KAAKkY,QAAQ+mE,UAAYV,GAAOW,cACvD9wB,GAAUyrB,kBAAkBh8C,GAAO,GAAM,GACzC79B,KAAKm/E,gBACLn/E,KAAKo/E,SAEE99E,sBACP,OAAOG,EAAS88E,OAETW,0BACP,OAAOZ,GAAevxC,IAEfsyC,6BACP,OAAOf,GAAepwC,OAEfoxC,4BACP,OAAO,GAGA7vE,qBACP,OAAO8sB,EAAOoF,mBAAmB7xB,aAAaK,OAAOukC,OAEzD0qC,SACI,IAAK,IAAI13E,EAAI,EAAGA,EAAI1H,KAAK69B,MAAM/4B,OAAQ4C,IAAK,CAC3B1H,KAAK69B,MAAMn2B,GACnBytC,UAAUn1C,OAGvBu/E,SACI,IAAK,IAAI73E,EAAI,EAAGA,EAAI1H,KAAK69B,MAAM/4B,OAAQ4C,IAAK,CAC3B1H,KAAK69B,MAAMn2B,GACnBktC,YAAY50C,OAMzBw/E,aAAaV,GAET,OADA9+E,KAAK8+E,YAAcA,EACZ9+E,KAKXy/E,WAAWV,GAEP,OADA/+E,KAAK++E,UAAYA,EACV/+E,KAKXg/E,kBAAkBC,GAOd,OANIA,IAAaV,GAAOW,cAAgBD,IAAaV,GAAOc,kBAExD/7E,QAAQC,KAAK,4BAA4B07E,kCACzCA,EAAWV,GAAOW,cAEtBl/E,KAAKi/E,SAAWA,EACTj/E,KAEX0/E,WACI,OAAO1/E,KAAK69B,MAEhBkX,eACI,OAAO/0C,KAAK0+E,UAEhBE,kCAEIt7E,QAAQC,KAAK,kGAAmG,4GAA6G,mDAEjOo8E,mBAEI,OADA3/E,KAAK4+E,kCACE5+E,KAAKg1C,mBAEhB4qC,iBAAiBC,GAEb,OADA7/E,KAAK4+E,kCACE5+E,KAAK8/E,iBAAiBD,GAEjC7qC,mBACI,OAAOh1C,KAAK6+E,eAEhBiB,iBAAiBjiD,GACb79B,KAAKu/E,SACLv/E,KAAK6+E,eAAiBhhD,EACtB79B,KAAKm/E,gBACLn/E,KAAKo/E,SAETD,gBACIn/E,KAAKw+E,iBAAmB,GACxB,IAAI16E,EAAI9D,KAAK0+E,UACb,KAAO56E,GAAK,GACR9D,KAAKw+E,iBAAiBuB,QAAQ,IAAIjpE,EAAM,UAAahT,EAAI,GAAK9D,KAAK6W,QACnE/S,EAAIC,UAAUD,EAAI,IAAImD,WAAY,IAItC,IAFAjH,KAAKy+E,aAAe,GACpB36E,EAAI9D,KAAK6+E,eACF/6E,GAAK,GACR9D,KAAKy+E,aAAasB,QAAQ,IAAIjpE,EAAM,UAAahT,EAAI,GAAK9D,KAAK6W,QAC/D/S,EAAIC,UAAUD,EAAI,IAAImD,WAAY,IAM1C+4E,uBACI,MAAMf,EAAWj/E,KAAKi/E,SAChB70B,EAAapqD,KAAK69B,MAAM,GAC9B,IAAIoiD,EAAiBC,EAAa91B,EAAY60B,GAC1CkB,EAAiBD,EAAa91B,EAAY60B,GAG9C,SAASiB,EAAaxjE,EAAMuiE,GACxB,OAAOviE,EAAKi4B,iBAAiBic,QAAQlc,GAAWA,EAAOuqC,WAAaA,IAAUn6E,OAOlF,OALA9E,KAAK69B,MAAM3f,SAASxB,IAChB,MAAM0jE,EAAcF,EAAaxjE,EAAMuiE,GACvCgB,EAAiBG,EAAcH,EAAiBG,EAAcH,EAC9DE,EAAiBC,EAAcD,EAAiBC,EAAcD,KAE3DF,EAAiBE,EAG5BE,eAGI,MAAMC,EAAyBtgF,KAAKggF,uBAAyBzB,GAAOe,gBAAkBt/E,KAAKi/E,SAErF/1C,EAAWlpC,KAAKkY,QAAQgxB,UAAY,EAGpCkhB,EAAapqD,KAAK69B,MAAM,GAC9B,IAAI7kB,EACJ,GAAIhZ,KAAKi/E,WAAaV,GAAOW,aAAc,CACvClmE,EAAQoxC,EAAWrvC,aAAa0nB,YAAY,GAAK87C,GAAO9uE,QAAQ8wE,kBAEhE,IAAK,IAAI74E,EAAI,EAAGA,EAAI1H,KAAK69B,MAAM/4B,SAAU4C,EAAG,CACxC,MAAMgV,EAAO1c,KAAK69B,MAAMn2B,GACxB,IAAI84E,EAAW,EACf,MAAMnrC,EAAK34B,EAAKM,qBACZq4B,IACAmrC,EAAWr8E,KAAK4E,IAAIy3E,EAAUnrC,EAAG2E,WAAW/L,gBAEhD,MAAMwyC,EAAO/jE,EAAK+yB,eAAe+wC,GAAYjC,GAAO9uE,QAAQixE,eAC5D,GAAIhkE,EAAK4wB,WAAa5wB,EAAKupB,SAAU,CACjC,MAAMgoC,EAAQvxD,EAAK6wB,qBAAuB/F,EAAKe,GACzC7rB,EAAKmzB,iBAAiBnG,KAAO60C,GAAO9uE,QAAQkxE,WAC5CjkE,EAAKmzB,iBAAiBlG,MAAQ40C,GAAO9uE,QAAQixE,eACnD1nE,EAAQ7U,KAAKqlC,IAAIykC,EAAOj1D,GACpBwnE,EAAW,IACXxnE,EAAQ7U,KAAKqlC,IAAIi3C,EAAMznE,UAKlC,CACD,IAAI4nE,EAAYrC,GAAO9uE,QAAQw/D,WAE/BjvE,KAAK69B,MAAM3f,SAAS2iE,IAChB,MAAMxrC,EAAKwrC,EAAG7jE,qBACVq4B,IACAurC,EAAYz8E,KAAK4E,IAAI63E,EAAWvrC,EAAG2E,WAAWx+B,UAAY,OAGlExC,EAAQoxC,EAAWrvC,aAAa0nB,YAAYm+C,GAAarC,GAAO9uE,QAAQixE,eACxE,IAAK,IAAIh5E,EAAI,EAAGA,EAAI1H,KAAK69B,MAAM/4B,SAAU4C,EACrC,GAAI1H,KAAK69B,MAAMn2B,GAAG4lC,WAAattC,KAAK69B,MAAMn2B,GAAGu+B,SAAU,CACnD,MAAM66C,EAAW9gF,KAAK69B,MAAMn2B,GAAG6lC,qBAAuB/F,EAAKe,GACrDvoC,KAAK69B,MAAMn2B,GAAGmoC,iBAAiBlG,MAAQ40C,GAAO9uE,QAAQixE,eACtD1gF,KAAK69B,MAAMn2B,GAAGmoC,iBAAiBnG,KAAO60C,GAAO9uE,QAAQkxE,WACvDG,EAAW9nE,IACXA,EAAQ8nE,IAKxB,OAAO9nE,EAAQsnE,EAAyBp3C,EAE5Cv0B,OACI,MAAMmE,EAAM9Y,KAAK0U,eACjB1U,KAAKgV,cAEL,MAAMo1C,EAAapqD,KAAK69B,MAAM,GACxB+pB,EAAY5nD,KAAK69B,MAAM79B,KAAK69B,MAAM/4B,OAAS,GAC5C9E,KAAK8+E,WAKN9+E,KAAK+Y,MAAQqxC,EAAW9P,cAAgB,EACxCt6C,KAAKyJ,MAAQm+C,EAAUxN,eAAiBp6C,KAAK+Y,MAAQ,IALrD/Y,KAAK+Y,MAAQqxC,EAAWnb,WACxBjvC,KAAKyJ,MAAQm+C,EAAU3Y,WAAajvC,KAAK+Y,OAO7C/Y,KAAKgZ,MAAQhZ,KAAKqgF,eAClB,MAAMU,EAAgB,CAACt3E,EAAO+O,IAAU/O,EAAQ7G,EAAQ4V,EAAM1I,aAAarG,OAE3E,IAAIA,EAAQzJ,KAAKw+E,iBAAiBjvC,OAAOwxC,EAAe,GACpD/gF,KAAK++E,UACLt1E,EAAQzJ,KAAKy+E,aAAalvC,OAAOwxC,EAAet3E,GAChDA,GAAsB,IAAbzJ,KAAK6W,OAElB,MACMmqE,EADoBhhF,KAAK+Y,MAAQ/Y,KAAKyJ,MAAQ,EACPA,EAAQ,EAErD,GAAIzJ,KAAK8+E,UAAW,CAChB,MAAMzgC,EAAar+C,KAAKyJ,MAAQ,EAAIA,EAAQ,EAAI,EAE5C40C,EAAa,IACbvlC,EAAI4kC,SAAS19C,KAAK+Y,MAAO/Y,KAAKgZ,MAAOqlC,EAAY,GACjDvlC,EAAI4kC,SAAS19C,KAAK+Y,MAAQ/Y,KAAKyJ,MAAQ,EAAIA,EAAQ,EAAI,EAAGzJ,KAAKgZ,MAAOqlC,EAAY,GAClFvlC,EAAI4kC,SAAS19C,KAAK+Y,MAAO/Y,KAAKgZ,OAAShZ,KAAKi/E,WAAaV,GAAOc,gBAAkB,EAAI,GAAI,EAAmB,GAAhBr/E,KAAKi/E,UAClGnmE,EAAI4kC,SAAS19C,KAAK+Y,MAAQ/Y,KAAKyJ,MAAOzJ,KAAKgZ,OAAShZ,KAAKi/E,WAAaV,GAAOc,gBAAkB,EAAI,GAAI,EAAmB,GAAhBr/E,KAAKi/E,WAIvH,MAAMxW,EAASlsC,EAAOoF,mBAAmBvxB,aAAa,gBAAiB,GACvE,IAAI83C,EAAW,EAMf,GALAloD,KAAKw+E,iBAAiBtgE,SAAS1F,IAC3BA,EAAMoC,OAAO9B,EAAKkoE,EAAmB94B,EAAUloD,KAAKgZ,MAAQhZ,KAAK6W,MAAQ,EAAI,EAAI4xD,GACjFvgB,GAAYtlD,EAAQ4V,EAAM1I,aAAarG,UAGvCzJ,KAAK++E,QAAS,CACd,MAAMkC,EAAUD,EAAmB94B,EAAwB,IAAbloD,KAAK6W,MAC7CqqE,EAA4B,IAAblhF,KAAK6W,MAC1BiC,EAAIQ,YACJR,EAAIg/B,IAAImpC,EAASjhF,KAAKgZ,MAAqB,IAAbhZ,KAAK6W,MAAcqqE,EAAc,EAAa,EAAV/8E,KAAKC,IAAQ,GAC/E0U,EAAIi/B,YACJj/B,EAAIa,OACJb,EAAIQ,YACJR,EAAIg/B,IAAImpC,EAASjhF,KAAKgZ,MAAqB,IAAbhZ,KAAK6W,MAAcqqE,EAAc,EAAa,EAAV/8E,KAAKC,IAAQ,GAC/E0U,EAAIi/B,YACJj/B,EAAIa,OACJuuC,GAAyB,IAAbloD,KAAK6W,MACjB7W,KAAKy+E,aAAavgE,SAAS1F,IACvBA,EAAMoC,OAAO9B,EAAKkoE,EAAmB94B,EAAUloD,KAAKgZ,MAAQhZ,KAAK6W,MAAQ,EAAI,EAAI4xD,GACjFvgB,GAAYtlD,EAAQ4V,EAAM1I,aAAarG,YCtTvD,SAAS03E,GAAuBtjD,GAC5B,IAAIujD,EAAU,EAQd,OAPAvjD,EAAM3f,SAASxB,IACPA,EAAK65B,UACL75B,EAAK65B,SAASr4B,SAASmjE,IACnBD,GAAWC,EAAQn+E,KAAO,QAIlCk+E,GAAW,EACJ55C,EAAKgB,KAEThB,EAAKe,GAShB,MAAM+4C,GAAY,IAEZC,GAAY,IAEX,MAAM9yB,WAAa17C,EACtB1R,YAAYw8B,EAAOi5B,GAAY,GAI3B,GAHAr0D,QACAzC,KAAKwhF,MAAQ,EACbxhF,KAAKqX,QAAU,GACVwmB,GAA0B,IAAjBA,EAAM/4B,OAChB,MAAM,IAAIzC,EAAa,eAAgB,+BAE3C,GAAqB,IAAjBw7B,EAAM/4B,OACN,MAAM,IAAIzC,EAAa,eAAgB,2BAI3C,GADArC,KAAKm+B,MAAQN,EAAM,GAAGgY,oBAClB71C,KAAKm+B,OAAS5B,EAAO+b,gBAAgB,KACrC,MAAM,IAAIj2C,EAAa,eAAgB,mEAE3C,IAAIqF,EACAgV,EAEJ,IADA1c,KAAKkoC,eAAiBV,EAAKe,GACtB7gC,EAAI,EAAGA,EAAIm2B,EAAM/4B,SAAU4C,EAE5B,GADAgV,EAAOmhB,EAAMn2B,GACTgV,EAAK4wB,UAAW,CAChBttC,KAAKkoC,eAAiBxrB,EAAK6wB,mBAC3B,MAGR,IAAIrF,EAAiBloC,KAAKkoC,eAE1B,GAAI4uB,GAAa/0D,EAAY87B,EAAM,IAC/BqK,EAAiBi5C,GAAuBtjD,QAEvC,GAAIi5B,GAAa30D,EAAU07B,EAAM,IAAK,CAEvC,MAAM4jD,EAAc5jD,EAAM0R,QAAO,CAACmyC,EAAMhlE,IAASglE,EAAOhlE,EAAK6wB,oBAAoB,GACjFrF,EAAiBu5C,GAAe,EAAIj6C,EAAKe,GAAKf,EAAKgB,KAGvD,IAAK9gC,EAAI,EAAGA,EAAIm2B,EAAM/4B,SAAU4C,EAC5BgV,EAAOmhB,EAAMn2B,GACTovD,IACAp6C,EAAK64C,iBAAiBrtB,GACtBloC,KAAKkoC,eAAiBA,GAE1BxrB,EAAKg9B,QAAQ15C,MAEjBA,KAAK41C,eAAgB,EACrB51C,KAAK69B,MAAQA,EACb79B,KAAK4gC,WAAa5gC,KAAKq1D,eACvBr1D,KAAK2hF,iBAAmB,GACxB3hF,KAAKmhC,eAAiB,CAClButB,WAAY,EACZkzB,UAAW,IACXC,WAAY,IACZC,iBAAkB,GAClBC,WAAY,IACZC,eAAe,EACfC,kBAAmB,EACnBtzB,oBAAqB,GACrBuzB,YAAY,EACZC,qBAAsB,IAGnB7gF,sBACP,OAAOG,EAASgtD,KAGpBlhB,mBACI,OAAOvtC,KAAKkoC,eAOhBzjC,4BAA4B29E,GACnBA,GAAyB,MAAbA,IACbA,EAAW,OAEf,MAkBMrzB,EAlBW,CACb,MAAO,CAAC,OACR,MAAO,CAAC,OACR,MAAO,CAAC,OACR,MAAO,CAAC,OACR,MAAO,CAAC,OACR,MAAO,CAAC,OACR,MAAO,CAAC,OACR,MAAO,CAAC,OACR,MAAO,CAAC,OACR,MAAO,CAAC,OACR,MAAO,CAAC,OACR,MAAO,CAAC,OACR,OAAQ,CAAC,QACT,OAAQ,CAAC,QACT,OAAQ,CAAC,QACT,OAAQ,CAAC,SAEWqzB,GACxB,QAAet/E,IAAXisD,EAiBA,OAAOA,EAAOx8C,KAAKy8C,IAAU,IAAI3qD,GAAWmD,MAAMwnD,KAjB5B,CAGtB,MAAMqzB,EAAYt+E,SAASq+E,EAASz6E,MAAM,KAAK,GAAI,IAC7C26E,EAAYv+E,SAASq+E,EAASz6E,MAAM,KAAK,GAAI,IAEnD,GADoB06E,EAAY,GAAM,EAElC,MAAO,CAAC,IAAIh+E,EAAS,EAAGi+E,IAEvB,GAAIA,EAAY,EACjB,MAAO,CAAC,IAAIj+E,EAAS,EAAGi+E,IAEvB,GAAIA,GAAa,EAClB,MAAO,CAAC,IAAIj+E,EAAS,EAAGi+E,IAMhC,MAAO,CAAC,IAAIj+E,EAAS,EAAG,IAS5BI,wBAAwB4gC,EAAO6C,EAAgB6mB,GAC3C,OAAON,GAAK8zB,cAAcl9C,EAAME,eAAgB,CAAEwpB,OAAAA,EAAQ7mB,eAAAA,IA2B9DzjC,qBAAqBo5B,EAAO2kD,EAAS,IAC5BA,EAAOzzB,QAAWyzB,EAAOzzB,OAAOjqD,SACjC09E,EAAOzzB,OAAS,CAAC,IAAI1qD,EAAS,EAAG,KAGrC,MAAMo+E,EAAaD,EAAOzzB,OAAOx8C,KAAKy8C,IAClC,IAAKA,EAAMjpD,SACP,MAAM,IAAI1D,EAAa,oBAAqB,0DAEhD,OAAO2sD,EAAMtoD,QAAQX,SAASw2B,EAAOzW,WAAY,MAE/C48D,EAAmB7kD,EACzB,IAAI8kD,EAAmB,EACnBC,EAAa,GACbC,EAAe,GAInB,SAASC,IACDL,EAAW39E,OAAS,EAAI69E,EACxBA,GAAoB,EAGpBA,EAAmB,GAG3B,WACI,IAAII,EAAY,GAEZC,EAAyB,IAAI3+E,EAAS,EAAG,GAC7Cq+E,EAAiBxkE,SAAS+kE,IAEtB,GADAF,EAAY,GACRE,EAAgBz9C,oBAGhB,OAFAo9C,EAAW/qE,KAAKgrE,QAChBA,EAAeE,GAGnBF,EAAahrE,KAAKorE,GAClB,MAAMC,EAAgBT,EAAWE,GAAkBj8E,QAC7ColD,GAxBSq3B,EAwBkBN,EAvB9BM,EAAS5zC,QAAO,CAACmyC,EAAMhlE,IAASA,EAAKgpB,WAAWh/B,QAAQnB,IAAIm8E,IAAO,IAAIr9E,EAAS,EAAG,KAuBvCkB,IAAIy9E,GAxB3D,IAAuBG,EA0Bf,MAAMC,EAAa7mD,EAAOm4B,iBAAiBuuB,EAAgB9pC,eAAiB,EAK5E,GAJIiqC,GAAcH,EAAgBxuC,cAC9ByuC,EAAc5+E,WAAa,GAG3BwnD,EAAWxlD,YAAY48E,GAAgB,CAGvC,IAAKE,EAAY,CACb,MAAM1mE,EAAOmmE,EAAa3tC,MACtBx4B,GACAqmE,EAAUlrE,KAAK6E,GAEvBkmE,EAAW/qE,KAAKgrE,GAKhB,GACIG,EAAyBl3B,EAAWhmD,SAAS28E,EAAWE,IACxDG,UACKE,EAAuBz8E,kBAAkBk8E,EAAWE,KAC7DE,EAAeE,OAEVj3B,EAAW7lD,OAAOi9E,KACvBN,EAAW/qE,KAAKgrE,GAChBG,EAAyB,IAAI3+E,EAAS,EAAG,GACzCw+E,EAAeE,EACfD,QAIJD,EAAa/9E,OAAS,GACtB89E,EAAW/qE,KAAKgrE,GA6GxBQ,GA3FA,WACI,MAAMC,EAAkB,GACxBV,EAAW1kE,SAAS8wC,IAChB,IAAIu0B,EAAY,GAChBv0B,EAAM9wC,SAAQ,CAACxB,EAAMtL,EAAO49C,KACxB,MAAMw0B,EAA0B,IAAVpyE,GAAeA,IAAU49C,EAAMlqD,OAAS,EACxDo9B,EAAW8sB,EAAM59C,EAAQ,GACzBqyE,GAAoBjB,EAAOkB,YAAchnE,EAAKupB,SAC9C09C,EAA0BnB,EAAOkB,YAAclB,EAAOoB,kBAAoBlnE,EAAKupB,UAAYu9C,EACjG,IAAIK,GAAoB,EACxB,GAAIrB,EAAOsB,0BAA4B5hD,IAAaxlB,EAAKupB,WAAa/D,EAAS+D,SAAU,CACrF,MAAM89C,EAAgB7hD,EAASqL,mBAE/Bs2C,EADyBnnE,EAAK6wB,qBACWw2C,EAE7C,MAAMC,EAAuBjgF,SAAS2Y,EAAKy8B,cAAe,IAAM,EAE5CsqC,GAAoBE,GAA2BE,GAAqBG,GAGhFT,EAAUz+E,OAAS,GACnBw+E,EAAgBzrE,KAAK0rE,GAKzBA,EAAYM,EAAoB,CAACnnE,GAAQ,IAIzC6mE,EAAU1rE,KAAK6E,MAInB6mE,EAAUz+E,OAAS,GACnBw+E,EAAgBzrE,KAAK0rE,MAG7BX,EAAaU,EAsDjBW,GAnDIrB,EAAW1kE,SAAS8wC,IAChB,IAAI3hB,EACJ,GAAIm1C,EAAOsB,yBAA0B,CACjC,MAAMpnE,EAclB,SAAuBsyC,GACnB,IAAK,IAAItnD,EAAI,EAAGA,EAAIsnD,EAAMlqD,OAAQ4C,IAAK,CACnC,MAAMgV,EAAOsyC,EAAMtnD,GACnB,IAAKgV,EAAKupB,SACN,OAAOvpB,EAGf,OAAO,EArBcwnE,CAAcl1B,GAC3B3hB,EAAgB3wB,EAAOA,EAAK6wB,mBAAqB/F,EAAKe,QAIlD8E,EADAm1C,EAAOt6C,eACSs6C,EAAOt6C,eAGPi5C,GAAuBnyB,IAevD,SAA4BA,EAAOzqC,GAC/ByqC,EAAM9wC,SAASxB,IACXA,EAAK64C,iBAAiBhxC,MAdtB4/D,CAAmBn1B,EAAO3hB,MAwClC,MAAM+2C,EA7GKxB,EAAWhyB,QAAQ5B,IACtB,GAAIA,EAAMlqD,OAAS,EAAG,CAClB,IAAIu/E,GAAW,EAMf,OALAr1B,EAAM9wC,SAASxB,IACPA,EAAKm5B,qBAAuBtZ,EAAO+b,gBAAgB,OACnD+rC,GAAW,MAGZA,EAEX,OAAO,KAqGTC,EAxBN,WACI,MAAMC,EAAgB,GAYtB,OAVA3B,EAAW1kE,SAAS8wC,IAChB,IAAIta,EACJsa,EAAM9wC,SAASxB,IACX,MAAM8nE,EAAa9nE,EAAK+3B,YACpB+vC,GAAc9vC,IAAW8vC,IACzB9vC,EAAS8vC,EACTD,EAAc1sE,KAAK68B,UAIxB6vC,EAWQE,GAEb52B,EAAQ,GA+Bd,OA9BAu2B,EAAiBlmE,SAAS8wC,IACtB,MAAMzV,EAAO,IAAIkV,GAAKO,GAClBwzB,EAAOR,gBACPzoC,EAAKpY,eAAe6gD,eAAgB,GAEpCQ,EAAOkC,mBACPnrC,EAAKpY,eAAewjD,sBAAwBpoD,EAAO+b,gBAAgBkqC,EAAOkC,oBAEpD,IAAtBlC,EAAON,aACP3oC,EAAKpY,eAAe+gD,YAAa,EACjC3oC,EAAKpY,eAAeyjD,iBAAmBpC,EAAOoC,kBAElD/2B,EAAMh2C,KAAK0hC,MAGf+qC,EAAWpmE,SAASw2B,IAEhB,MAAMnwB,EAAYmwB,EAAO7W,MAAM,GAAGqK,iBAAmBV,EAAKgB,KAAO81C,GAAepwC,OAASowC,GAAevxC,IACxG2H,EAAOsqC,kBAAkBz6D,GAEzB,IAAIu6D,GAAY,EAChB,IAAK,IAAIp3E,EAAI,EAAGA,EAAIgtC,EAAO7W,MAAM/4B,OAAQ4C,IAAK,CAE1C,IADagtC,EAAO7W,MAAMn2B,GAChB+xC,UAAW,CACjBqlC,GAAY,EACZ,OAGRpqC,EAAO8qC,aAAaV,MAEjBjxB,EAGX6xB,WACI,OAAO1/E,KAAK69B,MAGhBw3B,eAGI,OAFmBr1D,KAAK69B,MAAMtrB,KAAKmK,GAASA,EAAKu8B,WAAWrY,aAC5B2O,QAAO,CAACxmC,EAAK87E,IAAeA,EAAY97E,EAAM87E,EAAY97E,IAI9F+7E,iBAAiBC,GAEb,OADA/kF,KAAK2hF,iBAAmBoD,EACjB/kF,KAGXglF,UAAUniF,EAAG+nD,EAAYC,EAAY22B,GACjC,OAAO32B,GAAchoD,EAAI+nD,GAAc42B,EAG3CyD,iBACI,MAAM,MAAEpnD,EAAOqK,eAAgBmF,EAAelM,gBAAgB,UAAEygD,EAAS,UAAEC,EAAS,iBAAEC,EAAgB,WAAEC,IAAkB/hF,KACpHklF,EAAYrnD,EAAM,GAClBsnD,EA3Zd,SAAsBD,EAAWl8B,GAC7B,MAAMo8B,EAAgBF,EAAUr1C,iBAAiBnG,KAC3C27C,EAAaH,EAAUj2C,WAG7B,OAFqB+Z,EAASnZ,iBAAiBnG,KAExB07C,IADLp8B,EAAS/Z,WAC0Bo2C,GAsZ5BC,CAAaJ,EAAWrnD,EAAMA,EAAM/4B,OAAS,IAC5DgsC,GAAa8wC,EAAYC,GAAaC,EAC5C,IAAIyD,EAAU7gF,OAAO8gF,UACjBC,EAAY,EACZ/qE,EAAS,EAEb,IAAK,IAAI8mE,EAAQK,EAAWL,GAASI,EAAWJ,GAAS1wC,EAAW,CAChE,IAAI40C,EAAqB,EACrBC,EAAa,EAEjB,IAAK,IAAIj+E,EAAI,EAAGA,EAAIm2B,EAAM/4B,SAAU4C,EAAG,CACnC,MAAMgV,EAAOmhB,EAAMn2B,GACnB,GAAIgV,EAAK4wB,WAAa5wB,EAAKupB,SAAU,CACjC,MAAM2/C,EAAmB5lF,KAAKglF,UAAUtoE,EAAKuyB,WAAYi2C,EAAUj2C,WAAYi2C,EAAUr1C,iBAAiBnG,KAAM83C,GAASmE,EACnHxzC,EAAWz1B,EAAKmzB,iBAAiBnG,KAEvC,GAAIyI,EAAW9E,EAAgBu4C,EAAmBv4C,EAAe,CAC7D,MAAMw4C,EAAO1hF,KAAK6C,IAAImrC,EAAWyzC,GACjCD,GAAcE,GAAQx4C,EACtBq4C,GAAsBG,EAAOn+E,OAI7Bg+E,IAAuBvzC,EAAWyzC,GAAoBv4C,GAMlE,MAAMy4C,EAAaX,EAAe,EAI5BhH,EAAO4D,EAHa59E,KAAK6C,IAAI8+E,EAAatE,GAGFr9E,KAAK6C,IAAI0+E,GAEnDvH,EAAOoH,IACPA,EAAUpH,EACVsH,EAAYjE,EACZ9mE,EAASirE,GAGjB3lF,KAAKwhF,MAAQiE,EACbzlF,KAAKqX,QAAUqD,EAGnBqrE,qBACI,MAAM,MAAEloD,EAAK,eAAEqK,EAAgB/G,gBAAgB,WAAEutB,EAAU,qBAAEyzB,EAAoB,iBAAEyC,IAAwB5kF,KAG3G,IAAIu4E,EAAQ,EACRyN,EAAW,EACXC,EAAmB,EACnBC,EAAiB,EACrB,IAAK,IAAIx+E,EAAI,EAAGA,EAAIm2B,EAAM/4B,OAAQ4C,IAAK,CAEnC,MAAMgV,EAAOmhB,EAAMn2B,GACbyqC,EAAWz1B,EAAKmzB,iBAAiBnG,KACvC6uC,GAASpmC,EAGLjK,IAAmBV,EAAKgB,MAAQ09C,EAAiB/zC,GACjD+zC,EAAiB/zC,EACjB6zC,EAAW7hF,KAAK4E,OAAO2T,EAAK4yB,SAC5B22C,EAAmBvpE,EAAK24C,gBAEnBntB,IAAmBV,EAAKe,KAA0B,IAAnB29C,GAAwBA,EAAiB/zC,KAC7E+zC,EAAiB/zC,EACjB6zC,EAAW7hF,KAAKqlC,OAAO9sB,EAAK4yB,SAC5B22C,EAAmBvpE,EAAK24C,gBAKhC,IAAI2U,EAASuO,EAAQ16C,EAAM/4B,OAK3B,MACMqhF,EAAchE,EAAuB8D,GADZ,IAAbv3B,GAEZ03B,EAAYJ,EAAWG,GAAej+C,EACxCA,IAAmBV,EAAKgB,MAAQwhC,EAASoc,EACzCpc,EAASgc,EAAWG,EAEfj+C,IAAmBV,EAAKe,IAAMyhC,EAASoc,IAC5Cpc,EAASgc,EAAWG,GAEnBvB,GAII18C,IAAmBV,EAAKgB,MAAQwhC,EAAS4a,GAGzC18C,IAAmBV,EAAKe,IAAMyhC,EAAS4a,KAF5C5kF,KAAKmhC,eAAeyjD,iBAAmB5a,GAHvChqE,KAAKmhC,eAAeyjD,iBAAmB5a,EAS3ChqE,KAAKwhF,MAAQ,EACbxhF,KAAKqX,QAAU,EAGnBgvE,iBAGI,IAAIC,EAFctmF,KAAK69B,MAAM,GACGgS,iBAAiBnG,KAOjD,OAHI1pC,KAAKmhC,eAAe+gD,YAAcliF,KAAKmhC,eAAeyjD,mBACtD0B,EAAQtmF,KAAKmhC,eAAeyjD,kBAEzB0B,EAMXC,sBACI,MAAM,MAAE1oD,EAAK,MAAE2jD,EAAK,QAAEnqE,EAAO,eAAE6wB,EAAc,WAAEtH,EAAYO,gBAAgB,cAAE6gD,EAAa,kBAAEC,EAAiB,WAAEvzB,IAAkB1uD,KAC3HklF,EAAYrnD,EAAM,GAClBunD,EAAgBplF,KAAKqmF,iBACrBhB,EAAaH,EAAUj2C,WAC7B,IAAK,IAAIvnC,EAAI,EAAGA,EAAIm2B,EAAM/4B,SAAU4C,EAAG,CACnC,MAAMgV,EAAOmhB,EAAMn2B,GACb44B,EAAO5jB,EAAKgxB,UAClB,GAAIpN,EAAM,CACN,MAAM08B,EAAQtgD,EAAKuyB,YACXvF,KAAMyI,GAAaz1B,EAAKmzB,iBAC1B22C,EAAiBxmF,KAAKglF,UAAUhoB,EAAOqoB,EAAYD,EAAe5D,GAASnqE,EAC3EovE,EAAmBnmD,EAAKyI,eACxB29C,EAAgBx+C,IAAmBV,EAAKe,GAAK4J,EAAWq0C,EAAiBA,EAAiBr0C,EAGhG,GAFA7R,EAAKuI,aAAa49C,EAAmBC,GACrCpmD,EAAK0J,sBACDttB,EAAKupB,UAAY+7C,EAAe,CAChC,MACM2E,GAAkB/lD,EAAa,GADnB8tB,EACoC,IADpCA,EAElBpuB,EAAKsJ,eAAc,GAAME,YAAW,EAAM68C,EAAiB1E,MAM3E2E,oBAAoB7oD,EAAU8oD,EAAW91B,EAAM+1B,GAC3C,GAAiB,MAAb/oD,EACA,OAAOujD,GAEX,MAAMyF,EAAkB,GAAGxqD,EAAOm4B,iBAAiB32B,GAAY,EACzDipD,EAAsBH,EAAYtqD,EAAO+b,gBAAgByuC,GACzDE,EAAsBH,EAAYvqD,EAAO+b,gBAAgByuC,GACzDG,EAAiBn2B,EAAOx0B,EAAO+b,gBAAgByuC,GACrD,OAAIC,GAAuBC,GAAuBC,EACvC3F,GAEFyF,IAAwBC,GAAuBC,EAC7C5F,IAED0F,GAAuBC,GAAuBC,EA/iB7C,IAkjBJlnF,KAAK4mF,oBAAoBG,EAAiBF,EAAW91B,EAAM+1B,GAGtEK,aAAappD,GACT,MAAMqpD,EAAmB7qD,EAAO+b,gBAAgBva,GAChD,IAAIspD,GAAe,EACnB,MAAMC,EAAa,GACnB,IAAIC,EACJ,MAAM54B,EAAsB3uD,KAAKmhC,eAAewtB,oBAChD,IAAI64B,GAAwB,EACxBC,EAAa,EACjB,IAAK,IAAI//E,EAAI,EAAGA,EAAI1H,KAAK69B,MAAM/4B,SAAU4C,EAAG,CACxC,MAAMgV,EAAO1c,KAAK69B,MAAMn2B,GAGxB+/E,GADc/qE,EAAKgpB,WAAWxgC,QAE9B,IAAIwiF,GAAe,EAEf3jF,SAASg6B,EAAU,KAAO,IAE1B2pD,GAAqD,IAAtC1nF,KAAK2hF,iBAAiBn7C,QAAQ9+B,GAGzC1H,KAAKmhC,eAAewjD,uBAAyB8C,GAAcznF,KAAKmhC,eAAewjD,wBAC/E8C,EAAa,EACbC,GAAe,IAGvB,MAAMR,EAAiBxqE,EAAKm5B,oBAAsBuxC,EAC5Cn9C,EAASvtB,EAAKuyB,WAAazH,EAAKiB,MAAQ,EAGxC4f,EAAYroD,KAAK69B,MAAMn2B,EAAI,GAC3BigF,EAAY3nF,KAAK69B,MAAMn2B,EAAI,GAC3Bu/E,EAAsBU,GAAaA,EAAU9xC,oBAAsBuxC,EACnEJ,EAAsB3+B,GAAaA,EAAUxS,oBAAsBuxC,EACnEQ,EAAav/B,GAAas/B,GAAaT,IAAmBF,IAAwBC,EAExF,GAAIC,EAEA,GAAIG,EAGAE,EAAeD,EAAWA,EAAWxiF,OAAS,GAC9CyiF,EAAa1qC,IAAM5S,EAEfy9C,IACAL,GAAe,EACXM,IAAcV,QAA4CnkF,IAArBykF,EAAa1qC,MAGlD0qC,EAAa1qC,IAAM0qC,EAAangD,MAAQunB,QAI/C,CAID,GAFA44B,EAAe,CAAEngD,MAAO6C,EAAQ4S,SAAK/5C,GACrCukF,GAAe,EACXO,EAAY,CAEZ,MAAMf,EAAYx+B,EAAUxS,oBACtBixC,EAAYa,EAAU9xC,oBACtBkb,EAAOr0C,EAAKm5B,oBACZgyC,EAAiB7nF,KAAK4mF,oBAAoB7oD,EAAU8oD,EAAW91B,EAAM+1B,GACvE,CAACxF,GAAWC,IAAWzuE,SAAS+0E,GAChCN,EAAa1qC,IAAM0qC,EAAangD,MAAQunB,EAGxC44B,EAAa1qC,IAAM0qC,EAAangD,MAAQunB,OAGtCs4B,EAYDS,IAGLH,EAAa1qC,IAAM0qC,EAAangD,MAAQunB,EACxC04B,GAAe,GAXXE,EAAa1qC,KAHZ2qC,GAA+B,IAAN9/E,IAAYigF,EAGnBJ,EAAangD,MAAQunB,EAIrB44B,EAAangD,MAAQunB,EAShD24B,EAAWzvE,KAAK0vE,QAKpBF,GAAe,EAInBG,EAAwBE,EAG5B,MAAMI,EAAYR,EAAWA,EAAWxiF,OAAS,GAIjD,OAHIgjF,QAA+BhlF,IAAlBglF,EAAUjrC,MACvBirC,EAAUjrC,IAAMirC,EAAU1gD,MAAQunB,GAE/B24B,EAGXS,UAAUjvE,GACN9Y,KAAK69B,MAAM3f,SAASxB,IAChB,MAAM4jB,EAAO5jB,EAAKgxB,UACdpN,GACAA,EAAKjrB,WAAWyD,GAAKnE,SAE1B3U,MAGPgoF,cAAclvE,GACV,MAAMmvE,EAAuB,CAAC,IAAK,IAAK,KAAM,KAAM,MAC9C/C,EAAYllF,KAAK69B,MAAM,GAC7B,IAAIyoD,EAAQtmF,KAAKqmF,iBACjB,MAAMhB,EAAaH,EAAUj2C,WACvBi5C,EAAgBloF,KAAKmhC,eAAeutB,WAAa1uD,KAAKkoC,eAE5D,IAAK,IAAIxgC,EAAI,EAAGA,EAAIugF,EAAqBnjF,SAAU4C,EAAG,CAClD,MAAMq2B,EAAWkqD,EAAqBvgF,GAChCygF,EAAYnoF,KAAKmnF,aAAappD,GACpC,IAAK,IAAIokB,EAAI,EAAGA,EAAIgmC,EAAUrjF,SAAUq9C,EAAG,CACvC,MAAMimC,EAAYD,EAAUhmC,GACtBkmC,EAAaD,EAAUhhD,MACvBkhD,EAAatoF,KAAKglF,UAAUqD,EAAYhD,EAAYiB,EAAOtmF,KAAKwhF,OAChE+G,EAAYH,EAAUvrC,IAC5B,IAAI0rC,EAWA,MAAM,IAAIlmF,EAAa,cAAe,wBAX3B,CACX,MAAMmmF,EAAYxoF,KAAKglF,UAAUuD,EAAWlD,EAAYiB,EAAOtmF,KAAKwhF,OACpE1oE,EAAIQ,YACJR,EAAIS,OAAO8uE,EAAYC,GACvBxvE,EAAIU,OAAO6uE,EAAYC,EAAaJ,GACpCpvE,EAAIU,OAAO+uE,EAAY,EAAGC,EAAYN,GACtCpvE,EAAIU,OAAO+uE,EAAY,EAAGC,GAC1B1vE,EAAIi/B,YACJj/B,EAAIa,QAMZ2sE,GAAyB,IAAhB4B,GAIjBzyC,YACI,OAAOz1C,KAOX21C,aACQ31C,KAAK41C,gBAGLzzC,EAAUnC,KAAK69B,MAAM,KAAO79B,KAAKmhC,eAAe+gD,WAChDliF,KAAK+lF,qBAGL/lF,KAAKilF,iBAETjlF,KAAKumF,sBACLvmF,KAAK41C,eAAgB,GAGzBjhC,OACI,MAAMmE,EAAM9Y,KAAK0U,eACjB1U,KAAKgV,cACDhV,KAAKojF,aAEJpjF,KAAK41C,eACN51C,KAAK21C,aAET31C,KAAK+nF,UAAUjvE,GACf9Y,KAAK0T,aACL1T,KAAKgoF,cAAclvE,GACnB9Y,KAAKuU,iBCjwBN,MAAMk0E,WAAiB3mF,GAC1BT,YAAY4P,EAAM3D,EAAM2/B,GACpBxqC,MAAM,CAAEs7B,SAAU,MAClB/9B,KAAKiR,KAAOA,EACZjR,KAAK0oF,SAAW,IAAItgB,GAAKn3D,EAAM3D,EAAM2/B,GACrCjtC,KAAKw8B,KAAOx8B,KAAK0oF,SAASlsD,KAC1Bx8B,KAAKwY,MAAQ,IAAI1B,EAAM9W,KAAKw8B,KAAKj6B,KAAMvC,KAAKw8B,KAAK3lB,OACjD7W,KAAKwc,SAASxc,KAAKwY,MAAM1I,aAAarG,OAEtCzJ,KAAKuzC,cAAe,EAEbjyC,sBACP,OAAOG,EAASgnF,SAGpBhsC,QAAQxrC,EAAM3D,EAAM2/B,GAMhB,OALAjtC,KAAKiR,KAAOA,EACZjR,KAAK0oF,SAAW,IAAItgB,GAAKn3D,EAAM3D,EAAM2/B,GACrCjtC,KAAKw8B,KAAOx8B,KAAK0oF,SAASlsD,KAC1Bx8B,KAAKwY,MAAQ,IAAI1B,EAAM9W,KAAKw8B,KAAKj6B,KAAMvC,KAAKw8B,KAAK3lB,OACjD7W,KAAKwc,SAASxc,KAAKwY,MAAM1I,aAAarG,OAC/BzJ,KAGXsqE,UACI,OAAOtqE,KAAKw8B,KAGhBnnB,WAAW1B,GAGP,OAFAlR,MAAM4S,WAAW1B,GACjB3T,KAAKwY,MAAMnD,WAAWrV,KAAKoV,cACpBpV,KAGXmV,iBACI,OAAO1S,MAAM0S,iBAIjBigC,qBAAqBC,GAEjB,OAAOr1C,KAEXy1C,YAEI,OADAz1C,KAAK01C,cAAe,EACb11C,KAGX2U,OACI,IAAI5H,EACJ,MAAMmN,EAAQla,KAAK+a,aACd/a,KAAKwY,MAAMpD,cACZpV,KAAKwY,MAAMnD,WAAWrV,KAAKoV,cAE/BpV,KAAKgV,cACL,MAAM2zE,EAAQ3oF,KAAKi2C,eAKnB,GAJAj2C,KAAKwY,MAAMyB,SAASC,GACpBla,KAAKwY,MAAM4B,UAAUF,EAAMuoB,YAAsC,QAAzB11B,EAAK/M,KAAKw8B,KAAKt5B,YAAyB,IAAP6J,EAAgBA,EAAK,GAAKmN,EAAMe,iBACzGjb,KAAKwY,MAAMwC,cAAc2tE,QAEQ7lF,IAA7B9C,KAAK0oF,SAASz7C,WAA0B,CACxC,MAAMs7B,EAAa,IAAIzxD,EAAM9W,KAAK0oF,SAASz7C,WAAW1qC,KAAMvC,KAAK0oF,SAASz7C,WAAWp2B,OAChF0xD,EAAWnzD,cACZmzD,EAAWlzD,WAAWrV,KAAKoV,cAE/BmzD,EAAWtuD,SAASC,GACpBquD,EAAWnuD,UAAUF,EAAMuoB,YAAYziC,KAAK0oF,SAASz7C,WAAW/pC,MAAQgX,EAAMe,iBAC9EstD,EAAWpuD,UAAUna,KAAK0oF,SAASz7C,WAAW71B,SAC9CmxD,EAAWvtD,cAAc2tE,KCvC9B,MAAMC,WAAkB9mF,GAE3BT,YAAY60C,GACRzzC,MAAMyzC,GACNl2C,KAAKkY,QAAU,CAEX2wE,YAAa,EACbC,aAAc,EAEdzxE,QAAS,GAGbrX,KAAK+oF,aAAc,EAEnB/oF,KAAKkD,KAAOgzC,EAAWhzC,MAAQ,EAE/BlD,KAAK0J,OAAS,GAGPpI,sBACP,OAAOG,EAASmnF,UAGpB50B,QAAQ9wD,GAEJ,OADAlD,KAAKkD,KAAOA,EACLlD,KAGXgpF,UAAUt/E,GAEN,OADA1J,KAAK0J,OAASA,EACP1J,KAIXipF,eAAeC,GAEX,OADAlpF,KAAK+oF,YAAcG,EACZlpF,KAGXy1C,YAEI,OADAz1C,KAAK01C,cAAe,EACb11C,KAGX2U,OACI,MAAMmE,EAAM9Y,KAAK0U,eACXwF,EAAQla,KAAK+a,aACnB/a,KAAKgV,cACL,MAAMm0E,EAAenpF,KAAK6d,iBACpBurE,EAAen6B,GAAY8D,eAAeo2B,GAC1CE,EAAUrpF,KAAKi2C,eACfg6B,EAAQmZ,EAAeA,EAAanhF,OAASiS,EAAMjS,OAASiS,EAAMqC,WAClE1U,EAAIqS,EAAMuoB,YAAYziC,KAAKkD,MAAQ,GAAK,GA5EtD,YAAcD,GACN2lF,GAAU1nD,OACVn+B,EAAI,qBAAsBE,GA2E1B,CAAE,WAAYjD,KAAK+oF,YAAc,eAAiB,aAAc/oF,KAAK0J,OAAQ,IAAK2/E,EAAUpZ,GAxEpG,SAAuBn3D,EAAK4jB,GACxB,MAAM2sD,EAAU3sD,EAAO2sD,QACjBpZ,EAAQvzC,EAAOuzC,MACfpoE,EAAI60B,EAAO70B,EACXyhF,EAAc5sD,EAAOhzB,OAAS,EACpCoP,EAAIQ,YACAojB,EAAO6sD,SACPzwE,EAAIS,OAAO8vE,EAASxhF,EAAIyhF,GACxBxwE,EAAIU,OAAOy2D,EAAOpoE,GAClBiR,EAAIU,OAAO6vE,EAASxhF,EAAIyhF,KAGxBxwE,EAAIS,OAAO02D,EAAOpoE,EAAIyhF,GACtBxwE,EAAIU,OAAO6vE,EAASxhF,GACpBiR,EAAIU,OAAOy2D,EAAOpoE,EAAIyhF,IAE1BxwE,EAAIikB,SACJjkB,EAAIi/B,YAwDAyxC,CAAc1wE,EAAK,CACfuwE,QAASA,EAAUrpF,KAAKkY,QAAQ2wE,YAChC5Y,MAAOA,EAAQjwE,KAAKkY,QAAQ4wE,aAC5BjhF,EAAGA,EAAI7H,KAAKkY,QAAQb,QACpB3N,OAAQ1J,KAAK0J,OACb6/E,QAASvpF,KAAK+oF,eCzFnB,IAAIU,GD6FXb,GAAU1nD,OAAQ,EC5FlB,SAAWuoD,GACPA,EAAcA,EAAyB,UAAI,GAAK,YAChDA,EAAcA,EAAwB,SAAI,GAAK,WAFnD,CAGGA,KAAkBA,GAAgB,KAC9B,MAAMC,WAAc32E,EAOvB1R,YAAYsoF,EAAMC,EAAI1xE,GAClBzV,QACAzC,KAAKmhC,eAAiB9gC,OAAO0V,OAAO,CAAEylC,UAAW,EAAGpkC,QAAS,EAAGC,QAAS,GAAIoE,SAAUguE,GAAcI,UAAWC,aAAcL,GAAcI,UAAWE,QAAQ,EAAOC,IAAK,CACnK,CAAEnnF,EAAG,EAAGgF,EAAG,IACX,CAAEhF,EAAG,EAAGgF,EAAG,MACVqQ,GACTlY,KAAK2pF,KAAOA,EACZ3pF,KAAK4pF,GAAKA,EAEHtoF,sBACP,OAAOG,EAASioF,MAEThuE,sBACP,OAAO+tE,GAEA5tE,4BACP,MAAO,CACHouE,SAAUR,GAAcI,UACxBK,QAAST,GAAcU,UAG/BtgC,SAAS8/B,EAAMC,GACX,IAAKD,IAASC,EACV,MAAM,IAAIvnF,EAAa,eAAgB,kDAI3C,OAFArC,KAAK2pF,KAAOA,EACZ3pF,KAAK4pF,GAAKA,EACH5pF,KAKXuqD,YACI,OAAQvqD,KAAK2pF,OAAS3pF,KAAK4pF,GAE/BQ,YAAY1tD,GACR,MAAM5jB,EAAM9Y,KAAK0U,eACX0C,EAAUpX,KAAKmhC,eAAe/pB,QAC9BC,EAAUrX,KAAKmhC,eAAe9pB,QAAUqlB,EAAOnY,UAC/C8lE,EAAU3tD,EAAO2tD,QAAUjzE,EAC3BkzE,EAAU5tD,EAAO4tD,QAAUjzE,EAC3BkzE,EAAS7tD,EAAO6tD,OAASnzE,EACzBozE,EAAS9tD,EAAO8tD,OAASnzE,EACzBmkC,EAAYx7C,KAAKmhC,eAAeqa,UAChCwuC,EAAMhqF,KAAKmhC,eAAe6oD,KACxBnnF,EAAG4nF,EAAM5iF,EAAG6iF,GAASV,EAAI,IACzBnnF,EAAG47D,EAAM52D,EAAG62D,GAASsrB,EAAI,GAC3BW,GAAcJ,EAASF,IAAYL,EAAIllF,OAAS,GACtDgU,EAAIQ,YACJR,EAAIS,OAAO8wE,EAASC,GACpBxxE,EAAIY,cAAc2wE,EAAUM,EAAaF,EAAMH,EAAUI,EAAOhuD,EAAOnY,UAAWgmE,EAASI,EAAalsB,EAAM+rB,EAAS9rB,EAAOhiC,EAAOnY,UAAWgmE,EAAQC,GACxJ1xE,EAAIY,cAAc6wE,EAASI,EAAalsB,EAAM+rB,GAAU9rB,EAAOljB,GAAa9e,EAAOnY,UAAW8lE,EAAUM,EAAaF,EAAMH,GAAWI,EAAOlvC,GAAa9e,EAAOnY,UAAW8lE,EAASC,GACrLxxE,EAAIikB,SACJjkB,EAAIi/B,YACJj/B,EAAIa,OAERhF,OACI3U,KAAK0U,eACL1U,KAAKgV,cACL,MAAMo1C,EAAapqD,KAAK2pF,KAClB/hC,EAAY5nD,KAAK4pF,GACvB,IAAIS,EACAE,EACAD,EACAE,EACAtiD,EAAiB,EACjB6Y,EAAS,QACT6pC,EAAa,QACjB,SAASxtE,EAAY3B,GACjB,MAA2B,iBAAbA,EAAwBiuE,GAAM7tE,eAAeJ,GAAYA,EAE3E,MAAMA,EAAW2B,EAAYpd,KAAKmhC,eAAe1lB,UAC3CquE,EAAe1sE,EAAYpd,KAAKmhC,eAAe2oD,cAWrD,GAVIruE,IAAaguE,GAAcU,WAC3BppC,EAAS,OACT6pC,EAAa,QAEbd,IAAiBL,GAAcI,UAC/Be,EAAa,QAERd,IAAiBL,GAAcU,WACpCS,EAAa,QAEbxgC,EACAigC,EAAUjgC,EAAWhQ,eACrBlS,EAAiBkiB,EAAW7c,mBAC5B+8C,EAAUlgC,EAAWva,iBAAiBkR,OAErC,CAEDspC,EADcziC,EAAU7sC,aACRmwC,eAChBo/B,EAAU1iC,EAAU/X,iBAAiBkR,GAEzC,GAAI6G,EACA2iC,EAAS3iC,EAAUtN,cACnBpS,EAAiB0f,EAAUra,mBAC3Bi9C,EAAS5iC,EAAU/X,iBAAiB+6C,OAEnC,CAEDL,EADcngC,EAAWrvC,aACVowC,aACfq/B,EAASpgC,EAAWva,iBAAiB+6C,GASzC,OAPA5qF,KAAKoqF,YAAY,CACbC,QAAAA,EACAE,OAAAA,EACAD,QAAAA,EACAE,OAAAA,EACAjmE,UAAW2jB,IAAiD,IAA/BloC,KAAKmhC,eAAe4oD,QAAmB,EAAI,MAErE,GC3Hf,SAAS,MAAK9mF,GACN4nF,GAAO3pD,OACPn+B,EAAI,kBAAmBE,GAQ/B,SAAS6nF,GAAe5qD,GACpB,GAAI,kBAAmBA,EACnB,OAAOA,EAAE6qD,cACb,GAAI,YAAa7qD,EACb,OAAO4qD,GAAe5qD,EAAE8qD,SAC5B,MAAMA,EAAU9qD,EAChB,OAAuB,IAAnB8qD,EAAQlmF,OACDgmF,GAAeE,EAAQ,IACX,IAAnBA,EAAQlmF,OACD,KACJkmF,EAAQz4E,IAAIu4E,IAKhB,MAAMD,GAGTxpF,YAAY4pF,GACRjrF,KAAKirF,QAAUA,EACfjrF,KAAKkD,KAAO,GACZlD,KAAKwoD,IAAM,EACXxoD,KAAKkrF,UA5BQ,EAiCjB1jF,MAAMtE,GACFlD,KAAKkD,KAAOA,EACZlD,KAAKwoD,IAAM,EACXxoD,KAAKkrF,UApCQ,EAqCb,MAAM9+E,EAASpM,KAAKmrF,OAAOnrF,KAAKirF,QAAQttC,SAExC,OADAvxC,EAAO8+E,SAAWlrF,KAAKkrF,SAChB9+E,EAEXg/E,UAAUC,IAzCO,IA0CTrrF,KAAKkrF,WACLlrF,KAAKkrF,SAAWlrF,KAAKwoD,KACzBxoD,KAAKwoD,IAAM6iC,EAEfC,eACItrF,KAAKkrF,UA/CQ,EAmDjBK,WAAWC,EAAOC,GAAU,GACxB,MAAMC,EAASD,EAAU,IAAIE,OAAO,MAAQH,EAAQ,MAAQ,IAAIG,OAAO,MAAQH,EAAQ,UAEjFp/E,EADcpM,KAAKkD,KAAKE,MAAMpD,KAAKwoD,KACd7kC,MAAM+nE,GACjC,OAAe,OAAXt/E,EACO,CACHw/E,SAAS,EACTb,cAAe3+E,EAAO,GACtBy/E,aAAcz/E,EAAO,GAAGtH,OACxB0jD,IAAKxoD,KAAKwoD,KAIP,CAAEojC,SAAS,EAAOpjC,IAAKxoD,KAAKwoD,KAO3CsjC,UAAUC,EAAMC,GAAQ,GACpB,MAAMhB,EAAU,GACVxiC,EAAMxoD,KAAKwoD,IACjB,IAAIyjC,GAAa,EACbC,GAAW,EAGf,GAFAF,GAAkB,IAAVA,IAAiC,IAAfD,EAAKC,MAE3BD,EAAKZ,OACL,IAAK,MAAMj/E,KAAQ6/E,EAAKZ,OAAQ,CAC5B,MAAMgB,EAAWnsF,KAAKwoD,IAChBp8C,EAASpM,KAAKmrF,OAAOj/E,GAG3B,GAAIE,EAAOw/E,SAGP,GAFAZ,EAAQnzE,KAAKzL,GACb8/E,GAAW,EACPH,EAAKK,GACL,WAIJ,GADAH,GAAa,GACRF,EAAKK,GAAI,CACVpsF,KAAKwoD,IAAM2jC,EACX,OAKhB,MAAME,EAAUN,EAAKK,IAAMF,GAAaD,EAClCL,EAAUS,IAAoB,IAAVL,EACpBM,EAAaD,EAAS,EAAI,EAShC,OARIL,IAAUK,IACVrsF,KAAKwoD,IAAMA,GACXojC,EACA5rF,KAAKsrF,eAGLtrF,KAAKorF,UAAU5iC,GAEZ,CAAEojC,QAAAA,EAASZ,QAAAA,EAASsB,WAAAA,GAI/BC,gBAAgBR,EAAMC,GAAQ,GAC1B,MAAMhB,EAAU,GACVxiC,EAAMxoD,KAAKwoD,IACjB,IAAI8jC,EAAa,EACbE,GAAO,EACX,EAAG,CACC,MAAMpgF,EAASpM,KAAK8rF,UAAUC,GAC1B3/E,EAAOw/E,SAAWx/E,EAAO4+E,SACzBsB,IACAtB,EAAQnzE,KAAKzL,EAAO4+E,UAGpBwB,GAAO,QAENA,GACT,MAAMZ,EAAUU,EAAa,IAAe,IAAVN,EASlC,OARIA,GAAWM,EAAa,IACxBtsF,KAAKwoD,IAAMA,GACXojC,EACA5rF,KAAKsrF,eAGLtrF,KAAKorF,UAAU5iC,GAEZ,CAAEojC,QAAAA,EAASZ,QAAAA,EAASsB,WAAAA,GAG/BG,iBAAiBV,GACb,OAAO/rF,KAAKusF,gBAAgBR,GAAM,GAKtCZ,OAAOuB,GAEH,GADA,GAAE,4BAA6BA,IAC1BA,EACD,MAAM,IAAIrqF,EAAa,yBAE3B,IAAI+J,EAOJ,MAAM2/E,EAAOW,EAASC,KAAK3sF,KAAKirF,QAAnByB,GACb,GAAIX,EAAKP,MAILp/E,EAASpM,KAAKurF,WAAWQ,EAAKP,OAAwB,IAAjBO,EAAKN,SACtCr/E,EAAOw/E,UAGP5rF,KAAKwoD,KAAOp8C,EAAOy/E,kBAGtB,KAAIE,EAAKZ,OAcV,MADA,GAAEY,GACI,IAAI1pF,EAAa,gDAAkD0pF,GAXrE3/E,EADA2/E,EAAKa,UACI5sF,KAAKusF,gBAAgBR,GAEzBA,EAAKc,WACD7sF,KAAKysF,iBAAiBV,GAGtB/rF,KAAK8rF,UAAUC,GAUhC,MAAMe,EAAU,GAQhB,OAPA1gF,EAAO0gF,QAAUA,EACb1gF,EAAO4+E,SACP5+E,EAAO4+E,QAAQ9sE,SAASgiB,GAAM4sD,EAAQj1E,KAAKizE,GAAe5qD,MAE1D6rD,EAAKgB,KAAO3gF,EAAOw/E,SACnBG,EAAKgB,IAAI,CAAED,QAAAA,IAER1gF,GCrMf,SAAS,MAAKnJ,GACN+pF,GAAU9rD,OACVn+B,EAAI,qBAAsBE,GDsMlC4nF,GAAO3pD,OAAQ,ECpMR,MAAM+rD,GACT5rF,YAAY6vC,GACRlxC,KAAKkxC,QAAUA,EAEnByM,QACI,OAAO39C,KAAK+X,KAEhBA,OACI,MAAO,CACHozE,OAAQ,CAACnrF,KAAKktF,MAAOltF,KAAKmtF,OAAQntF,KAAKotF,MAG/CF,QACI,MAAO,CACH/B,OAAQ,CAACnrF,KAAKqtF,YAAartF,KAAKstF,QAChCP,IAAK,IAAM/sF,KAAKkxC,QAAQq8C,eAGhCJ,SACI,MAAO,CACHhC,OAAQ,CAACnrF,KAAKwtF,MAAOxtF,KAAKktF,OAC1BL,YAAY,GAGpBS,SACI,MAAO,CACHnC,OAAQ,CAACnrF,KAAKytF,SAAUztF,KAAKy7C,KAAMz7C,KAAK0tF,KAAM1tF,KAAK2tF,OAG3DN,cACI,MAAO,CACHlC,OAAQ,CAACnrF,KAAK4tF,MAAO5tF,KAAK6tF,YAC1BzB,IAAI,GAGZwB,QACI,MAAO,CACHzC,OAAQ,CAACnrF,KAAK8tF,OAAQ9tF,KAAK+tF,MAAO/tF,KAAKguF,QAEvCjB,IAAMtrD,GAAUzhC,KAAKkxC,QAAQ+8C,SAASxsD,EAAMqrD,QAAQ,KAG5DiB,QACI,MAAO,CACH5C,OAAQ,CAACnrF,KAAKkuF,MACdtB,WAAW,GAGnBsB,OACI,MAAO,CACH/C,OAAQ,CAACnrF,KAAKmuF,SAAUnuF,KAAKouF,WAAYpuF,KAAKquF,SAGtDR,aACI,MAAO,CACH1C,OAAQ,CAACnrF,KAAKmuF,SAAUnuF,KAAKouF,WAAYpuF,KAAKquF,QAC9CtB,IAAMtrD,IAEF,MAAMp6B,EAAIo6B,EACVzhC,KAAKkxC,QAAQo9C,cAAcjnF,EAAEylF,QAAQ,GAAIzlF,EAAEylF,QAAQ,GAAIzlF,EAAEylF,QAAQ,MAI7EsB,aACI,MAAO,CACHjD,OAAQ,CAACnrF,KAAKuuF,WAAYvuF,KAAKwuF,aAC/BxC,OAAO,EACPI,IAAI,GAGZsB,OACI,MAAO,CACHvC,OAAQ,CAACnrF,KAAKyuF,KACd5B,YAAY,EAEZE,IAAMtrD,GAAUzhC,KAAKkxC,QAAQw9C,YAAYjtD,EAAMqrD,UAGvDrxC,OACI,MAAO,CACH0vC,OAAQ,CAACnrF,KAAK2uF,MAAO3uF,KAAK4uF,WAAY5uF,KAAK6uF,OAC3C7C,OAAO,EAEPe,IAAMtrD,GAAUzhC,KAAKkxC,QAAQ49C,YAAYrtD,EAAMqrD,QAAQ,KAG/DW,WACI,MAAO,CACHtC,OAAQ,CAACnrF,KAAK2uF,MAAO3uF,KAAK+uF,WAC1B/C,OAAO,EAEPe,IAAMtrD,GAAUzhC,KAAKkxC,QAAQ89C,gBAAgBvtD,EAAMqrD,QAAQ,KAGnEa,OACI,MAAO,CACHxC,OAAQ,CAACnrF,KAAKivF,SAAUjvF,KAAKkvF,OAAQlvF,KAAKmvF,QAASnvF,KAAKovF,UACxDpD,OAAO,GAGfmD,UACI,MAAO,CACHhE,OAAQ,CAACnrF,KAAKwtF,MAAOxtF,KAAKkvF,QAC1BrC,YAAY,GAGpBqC,SAEI,MAAO,CACH/D,OAAQ,CAACnrF,KAAKqvF,IAAKrvF,KAAKsvF,OAAQtvF,KAAKuvF,KAErCxC,IAAMtrD,GAAUzhC,KAAKkxC,QAAQs+C,cAAc/tD,EAAMqrD,QAAQ,GAAYrrD,EAAMqrD,QAAQ,GAJ1D1pF,MAAM,GAAI,KAO3CmsF,MACI,MAAO,CACHpE,OAAQ,CAACnrF,KAAKyvF,KAAMzvF,KAAK0vF,MACzBtD,IAAI,GAGZiD,MACI,MAAO,CAAE7D,MAAO,wBAEpBkE,OACI,MAAO,CAAElE,MAAO,eAEpBiE,OACI,MAAO,CAAEjE,MAAO,eAEpB2C,WACI,MAAO,CAAE3C,MAAO,YAEpB6C,SACI,MAAO,CAAE7C,MAAO,UAEpBgD,cACI,MAAO,CAAEhD,MAAO,eAEpB+C,aACI,MAAO,CAAE/C,MAAO,+CAEpBuD,YACI,MAAO,CAAEvD,MAAO,aAEpBqD,QACI,MAAO,CAAErD,MAAO,gBAEpBsC,SACI,MAAO,CAAEtC,MAAO,OAEpBwC,SACI,MAAO,CAAExC,MAAO,OAEpBgC,QACI,MAAO,CAAEhC,MAAO,OAEpBiD,MACI,MAAO,CAAEjD,MAAO,OAEpBmD,QACI,MAAO,CAAEnD,MAAO,OAEpBoD,aACI,MAAO,CAAEpD,MAAO,QAEpB8D,SACI,MAAO,CAAE9D,MAAO,OAEpByD,WACI,MAAO,CAAEzD,MAAO,OAEpB4D,WACI,MAAO,CAAE5D,MAAO,OAEpB4B,MACI,MAAO,CAAE5B,MAAO,MAGjB,MAAMmE,GACTtuF,YAAY08B,GACR/9B,KAAK4vF,MAAQ,GACb5vF,KAAKm4C,KAAO,EACZn4C,KAAKkY,QAAU,GACflY,KAAK+9B,SAAWA,GAGjB,MAAM8xD,GACTxuF,YAAY5B,GACRO,KAAK8vF,YAAc,GACnB9vF,KAAKP,QAAUA,EACfO,KAAKuY,QAETA,MAAML,GACFlY,KAAKkY,QAAU7X,OAAO0V,OAAO,CAAEuqB,KAAM,OAAQ9D,KAAM,UAAYtkB,GAC/DlY,KAAK+vF,SAAW,CAAElyD,MAAO,GAAIhc,YAAa,IAC1C7hB,KAAKgwF,gBAAkB,IACvBhwF,KAAKiwF,aAETz+C,aACI,OAAOxxC,KAAKP,QAEhBywF,cACI,OAAOlwF,KAAK+vF,SAEhBI,cAAcC,GACVpwF,KAAK8vF,YAAYj4E,KAAKu4E,GAE1BH,aACI,GAAE,cACFjwF,KAAKqwF,MAAQ,IAAIV,GAAM3vF,KAAKgwF,iBAEhCtB,YAAYv2C,GACR,GAAE,eAAgBA,GACdA,IACAn4C,KAAKqwF,MAAMl4C,KAAOA,EAAKrzC,QAE/BkqF,gBAAgBjxD,GACZ,GAAE,mBAAoBA,GACtB/9B,KAAKgwF,gBAAkBhwF,KAAKqwF,MAAMtyD,SAAWA,GAAY/9B,KAAKgwF,gBAElElB,YAAY79E,GACR,GAAE,eAAgBA,GACdA,IACAjR,KAAKqwF,MAAMp/E,KAAOA,GAE1Bu+E,cAAcrvF,EAAK+E,GACf,GAAE,sBAAuB/E,EAAK,SAAU+E,GACxClF,KAAKqwF,MAAMn4E,QAAQ/X,GAAO+E,EAE9BorF,QAAQnwF,EAAK8xD,EAAOtyC,GAChB,GAAE,WAAYxf,EAAK8xD,EAAOtyC,GAC1B3f,KAAKqwF,MAAMT,MAAM/3E,KAAK,CAClB1X,IAAKA,EACL8xD,MAAAA,EACAtyC,OAAAA,IAGR2uE,cAAcnuF,EAAK8xD,EAAOtyC,GACtB,GAAE,iBAAkBxf,EAAK8xD,EAAOtyC,GAChC3f,KAAKswF,QAAQnwF,EAAK8xD,EAAOtyC,GAG7BsuE,SAASpwD,GACL,GAAE,cACsB,iBAAbA,EAAM,GACb79B,KAAKsuF,cAAczwD,EAAM,IAGzBA,EAAM3f,SAASpa,IACPA,GACA9D,KAAKswF,WAAWxsF,MAG5B,GAAE,YAENypF,cACI,GAAE,eACF,MAAM,QAAE9tF,GAAYO,KACpB,IAAKP,EACD,OACJ,MAAMyY,EAAU7X,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI/V,KAAKkY,SAAUlY,KAAKqwF,MAAMn4E,SAGpEooB,EAAO19B,EAAQsV,EAAQooB,KAAM,eAAgB,+BAA+BjzB,cAE5EmvB,EAAO55B,EAAQsV,EAAQskB,KAAM,eAAgB,+BAA+BnvB,eAC5E,MAAEuiF,EAAK,SAAE7xD,EAAQ,KAAEoa,EAAI,KAAElnC,GAASjR,KAAKqwF,MAIvCE,EAAsBjyE,EAAMuD,YAC5BvP,EAAOs9E,EAAMr9E,KAAKi+E,IACpB,IAAIzjF,EACJ,OAAOyjF,EAAUrwF,KACZowF,EAAoBz9E,SAAoC,QAA1B/F,EAAKyjF,EAAUv+B,aAA0B,IAAPllD,EAAgBA,EAAK,IAAMyjF,EAAUv+B,MAAQ,IAC9G,IACAu+B,EAAU7wE,UAEZm3C,EAAqB,SAATx2B,EAEZ5jB,EAA2E,MAAnEzL,MAAAA,OAAmC,EAASA,EAAK5D,eACzD5N,EAAQgxF,UAAU,CAAE1yD,SAAAA,EAAUoa,KAAAA,IAC9B14C,EAAQuC,UAAU,CAAEsQ,KAAAA,EAAMyrB,SAAAA,EAAUoa,KAAAA,EAAMlnC,KAAAA,EAAMurB,KAAAA,EAAMs6B,UAAAA,IACvDA,GACDp6C,EAAK64C,iBAA0B,OAATj1B,EAAgBkH,EAAKe,GAAKf,EAAKgB,MAEzD,MAAM3mB,EAAc,GACpB+tE,EAAM1xE,SAAQ,CAACsyE,EAAWp/E,KACtB,MAAM6gD,EAAQu+B,EAAUv+B,MACxB,GAAqB,iBAAVA,EAAoB,CAC3B,MAAMlzC,EAAatf,EAAQwhC,WAAW,CAAEhwB,KAAMghD,IAC9Cv1C,EAAKkqB,YAAY7nB,EAAY3N,GAC7ByQ,EAAYhK,KAAKkH,QAGjB8C,EAAYhK,UAAK/U,MAIzB,IAAK,IAAI4E,EAAI,EAAGA,EAAIywC,EAAMzwC,IACtBu/C,GAAIypC,eAAe,CAACh0E,GAAO,CAAEyqC,KAAK,IACtCnnD,KAAK8vF,YAAY5xE,SAASkyE,GAAeA,EAAWl4E,EAASwE,EAAM1c,QACnEA,KAAK+vF,SAASlyD,MAAMhmB,KAAK6E,GACzB1c,KAAK+vF,SAASluE,YAAYhK,KAAKgK,GAC/B7hB,KAAKiwF,cAMb,SAASU,GAAMz4E,EAASwE,QACD5Z,IAAfoV,EAAQlH,IAEZ0L,EAAK3K,aAAa,KAAMmG,EAAQlH,IAGpC,MAAM4/E,GAAsB,UAI5B,SAASC,GAAS34E,EAASwE,QACD5Z,IAAlBoV,EAAQhH,OAEZgH,EAAQhH,MAAMvJ,MAAMipF,IAAqB1yE,SAASvL,GAAc+J,EAAK7H,SAASlC,KAK3E,MAAMq6E,GACT3rF,YAAY6W,EAAU,IAClBlY,KAAK8wF,SAAW,CACZt0D,KAAM,SACN8uB,KAAM,MACNhrB,KAAM,QAEVtgC,KAAKsY,WAAWJ,GAUpB1T,IAAIssF,GAEA,OADA9wF,KAAK8wF,SAAWzwF,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI/V,KAAK8wF,UAAWA,GACzD9wF,KAMXsY,WAAWJ,GACP,IAAInL,EAAIkF,EAER,MAAMxS,EAAUyY,EAAQzY,QAClByxC,EAAqC,QAA1BnkC,EAAKmL,EAAQg5B,eAA4B,IAAPnkC,EAAgBA,EAAK,IAAI8iF,GAAQpwF,GAQpF,OAPAO,KAAKkY,QAAU7X,OAAO0V,OAAO1V,OAAO0V,OAAO,CAAE+5E,YAAa,CAACa,GAAOE,GAAUlgD,GAAaogD,cAAe/oC,GAAe+oC,eAAgBC,cAAc,GAAS94E,GAAU,CAAEzY,QAAAA,EACtKyxC,QAAAA,IACJlxC,KAAKP,QAAUA,EACfO,KAAKkxC,QAAUA,EACflxC,KAAKirF,QAAU,IAAIgC,GAAiBjtF,KAAKkxC,SACzClxC,KAAKixF,OAAS,IAAIpG,GAAO7qF,KAAKirF,SACM,QAAnCh5E,EAAKjS,KAAKkY,QAAQ43E,mBAAgC,IAAP79E,GAAyBA,EAAGiM,SAASkyE,GAAepwF,KAAKmwF,cAAcC,KAC5GpwF,KAEXqV,WAAW1B,GAEP,OADA3T,KAAKP,QAAQ4V,WAAW1B,GACjB3T,KAEXwH,MAAMtE,EAAMgV,EAAU,IAClBlY,KAAKkxC,QAAQ34B,MAAML,GACnB,MAAM9L,EAASpM,KAAKixF,OAAOzpF,MAAMtE,GACjC,IAAKkJ,EAAOw/E,SAAW5rF,KAAKkY,QAAQ84E,aAEhC,MADA,GAAE5kF,GACI,IAAI/J,EAAa,uBAAyBa,GAEpD,OAAOkJ,EAEXmtC,KAAK1b,EAAO3lB,GAER,OADAlY,KAAKP,QAAQgvD,KAAK,CAAE5wB,MAAAA,EAAO3lB,QAAAA,IACpB2lB,EAEX6W,OAAO7W,EAAO3lB,GAEV,OADAlY,KAAKP,QAAQ8+E,OAAO,CAAE1gD,MAAAA,EAAO3lB,QAAAA,IACtB2lB,EAEXA,MAAM36B,EAAMgV,EAAU,IAGlB,OAFAA,EAAU7X,OAAO0V,OAAO,CAAEymB,KAAMx8B,KAAK8wF,SAASt0D,KAAM8D,KAAMtgC,KAAK8wF,SAASxwD,MAAQpoB,GAChFlY,KAAKwH,MAAMtE,EAAMgV,GACVlY,KAAKkxC,QAAQg/C,cAAcryD,MAEtCwH,MAAMxH,EAAO3lB,EAAU,IAEnB,OADAA,EAAU7X,OAAO0V,OAAO,CAAEu1C,KAAMtrD,KAAK8wF,SAASxlC,MAAQpzC,GAC/ClY,KAAKP,QAAQ4rD,MAAMnzC,GAASs1C,aAAa3vB,GAEpDsyD,cAAcC,GACVpwF,KAAKkxC,QAAQi/C,cAAcC,IAGnCpD,GAAU9rD,OAAQ,EC1ZlB,MAAMgwD,GAAY,uEACX,MAAMT,WAAkBvuF,GAChBZ,sBACP,OAAOG,EAASgvF,UAEpBpvF,YAAY8vF,GACR,IAAKA,EACD,MAAM,IAAI9uF,EAAa,eAAgB6uF,IAE3C,IAAIh7C,EACJ,GAAyB,iBAAdi7C,EAEPj7C,EAAa,CAAEnY,SAAUozD,OAExB,IAAyB,iBAAdA,EAIZ,MAAM,IAAI9uF,EAAa,eAAgB6uF,IAHvCh7C,EAAai7C,EAKjB1uF,MAAMyzC,GAENl2C,KAAKwc,SAAS,GAKlBypB,SACI,OAAO,EAEXhsB,SAASC,GAEL,OADAzX,MAAMwX,SAASC,GACRla,KAIXo1C,qBAAqBC,GAEjB,OAAOr1C,KAEXy1C,YAEI,OADAz1C,KAAK01C,cAAe,EACb11C,KAEX2U,OAEI3U,KAAKgV,cACL,IAAK,IAAItN,EAAI,EAAGA,EAAI1H,KAAKmzC,UAAUruC,SAAU4C,EAAG,CAC5C,MAAMg/B,EAAW1mC,KAAKmzC,UAAUzrC,GlEhBPzG,EkEiBRylC,ElEjBwBjlC,EAASmrC,ckEkB9ClG,EAASrxB,WAAWrV,KAAKoV,cACzBsxB,EAASjyB,mBCtDlB,MAAM28E,WAAkBtvF,GAC3BT,YAAYmX,EAAO09B,EAAYh+B,GAC3BzV,MAAMyzC,GACNl2C,KAAKkY,QAAU7X,OAAO0V,OAAO,CAAEs7E,aAAa,EAAOnuF,KAAM,GAAKgV,GAE9DlY,KAAKuzC,aAAevzC,KAAKkY,QAAQm5E,YAC7B74E,GACAxY,KAAKsxF,SAAS94E,GAGXlX,sBACP,OAAOG,EAAS2vF,UAEpBE,SAAS94E,GAGL,OAFAxY,KAAKwY,MAAQA,EACbxY,KAAKwc,SAASxc,KAAKwY,MAAM1I,aAAarG,OAC/BzJ,KAEXmV,iBACI,OAAOnV,KAAKwY,MAAMrD,iBAEtBsgC,YAKI,OAJKz1C,KAAK01C,cAAgB11C,KAAKid,iBAC3Bjd,KAAKid,gBAAgBw4B,YAEzBz1C,KAAK01C,cAAe,EACb11C,KAEXg8D,gBACI,MAAMljD,EAAM9Y,KAAK0U,eACjBoE,EAAI+1B,UAAU,aACd,IAAK,IAAInnC,EAAI,EAAGA,EAAI1H,KAAKmzC,UAAUruC,OAAQ4C,IAAK,CAC5C,MAAMg/B,EAAW1mC,KAAKmzC,UAAUzrC,GAChCg/B,EAASrxB,WAAWyD,GACpB4tB,EAASjyB,gBAEbqE,EAAIi3B,aAERp7B,OACI,MAAMuF,EAAQla,KAAK+a,aACbjC,EAAMoB,EAAMxF,eAClB1U,KAAKgV,cACL8D,EAAI+1B,UAAU,YAAa7uC,KAAK6R,aAAa,OAE7C,MAAM2G,EAAQxY,KAAKwY,MACdA,EAAMpD,cACPoD,EAAMnD,WAAWyD,GAErBN,EAAMyB,SAASC,GACf1B,EAAM4B,UAAUF,EAAMuoB,YAAYziC,KAAKkY,QAAQhV,MAAQgX,EAAMe,iBAC7D,MAAMpY,EAAI7C,KAAKm0C,kBAAoBn0C,KAAKi2C,eAAiBj2C,KAAKuc,WAAa,EAAIvc,KAAKi2C,eACpFz9B,EAAMwC,cAAcnY,GACpB7C,KAAKg8D,gBACLljD,EAAIi3B,cClDL,MAAMnuC,WAAkBI,GAC3BX,YAAY60C,GACRzzC,MAAMpC,OAAO0V,OAAO,CAAEkhC,iBAAkB1a,EAAOkC,oBAAsB78B,GAAU2vF,MAAOr6C,UAAWt1C,GAAUg1D,oBAAsB1gB,IACjIl2C,KAAKwxF,MAAQt7C,EAAWs7C,QAAS,EACjCxxF,KAAK2tD,MAAO,EACZ3tD,KAAKm4D,iBACLn4D,KAAKyJ,MAAQ,EAENnI,sBACP,OAAOG,EAASG,UAETg1D,gCACP,OAAO,EAEA26B,mBACP,MAAO,IAEXn8B,mBACI,GAAIp1D,KAAK81D,wBACL,OAAO91D,KAAK81D,wBAEhB,MAAMt9C,EAAQxY,KAAKi5C,WACnB,GAAIzgC,EAAO,CACP,IAAIi5E,EAAMhvF,MAAM2yD,mBAChB,GAAI58C,EAAM8nB,KAAM,CACZ,MAAMoxD,EAAiB1xF,KAAK2xF,oBAC5BF,GAAOjqD,EAAKkB,OAAS+oD,GAAOC,EAAiBlqD,EAAKkB,OAEtD,OAAO+oD,EAEX,OAAO,EAGXE,oBACI,OAAO3xF,KAAKmhC,eAAe8V,iBAAmB1a,EAAOkC,oBAEzD9pB,OACIlS,MAAMkS,OACN3U,KAAKgV,cACL,MAAMsrB,EAAOtgC,KAAKsgC,KAClB,GAAItgC,KAAKwxF,OAASlxD,EAAM,CACpB,MAAMoxD,EAAiB1xF,KAAK2xF,oBAEtBC,EAAcF,EAAiB,IACrC,IAAIG,EACJ,MAAMt4C,EAAOv5C,KAAKu5C,KAClB,GAAIA,EAEKA,EAAK3D,eACN2D,EAAK5D,aAETk8C,EAAY7xF,KAAK8xF,yBAAyB,EAAIF,EAAa,EAAIA,EAAa,CACxEtxD,KAAM,EAAIsxD,EACVr4C,KAAM,EAAIq4C,QAGb,CACD,MAAM1pD,EAAiBloC,KAAKutC,mBACtBwkD,EAAiB/xF,KAAKm5D,oBACtBiD,EAAiB97B,EAAK2I,YAC5B,IAAIpmC,EAAI7C,KAAKi2C,eACTpuC,EAAIqgC,IAAmBV,EAAKgB,KAC1BupD,EAAehqD,MAAQq0B,EACvB21B,EAAe/pD,SAAWo0B,EAC5B41B,EAAiBz1D,EAAOoC,YAC5BqzD,GAAkBA,EAAiB,IACnCnqF,GAAKmqF,EAAiBN,EAAiBxpD,EACvC,MAAMstB,EAAUttB,IAAmBV,EAAKe,GAClC,CACEr/B,GAAI,EACJE,GAAI,EACJC,GAAI,GACJC,IAAK,GAEP,CACEJ,IAAK,EACLE,GAAI,EACJC,GAAI,GACJC,GAAI,GAEZzG,GAAK2yD,EAAQtsD,GAAK0oF,EAClB/pF,GAAK2tD,EAAQpsD,GAAKwoF,EAClBC,EAAY,CACR3oF,GAAIrG,EACJuG,GAAIvB,EACJwB,GAAIxG,EAAI2yD,EAAQnsD,GAAKuoF,EACrBtoF,GAAIzB,EAAI2tD,EAAQlsD,GAAKsoF,GAI7B,MAAM94E,EAAM9Y,KAAK0U,eACjBoE,EAAIlF,OACJkF,EAAIxE,aAAa,EAAIs9E,GACrB94E,EAAIQ,YACJR,EAAIS,OAAOs4E,EAAU3oF,GAAI2oF,EAAUzoF,IACnC0P,EAAIU,OAAOq4E,EAAUxoF,GAAIwoF,EAAUvoF,IACnCwP,EAAIi/B,YACJj/B,EAAIikB,SACJjkB,EAAItE,WAGZs9E,yBAAyBG,EAAiBC,EAAiBC,GACvD,MAAM54C,EAAOv5C,KAAKu5C,KAClB,IAAKA,EACD,MAAM,IAAIl3C,EAAa,SAAU,mCACrC,MAAM+vF,EAAa74C,EAAKioC,MAElB6Q,EADgB94C,EAAK1b,MAAM0b,EAAK1b,MAAM/4B,OAAS,KAAO9E,MAC5B,EAAI,EAC9BsyF,EAAanuF,KAAKouF,KAAKH,EAAaC,GAEpCG,EACEruF,KAAKm9D,IAAIgxB,GAAcJ,EADzBM,EAEEruF,KAAKq9D,IAAI8wB,GAAcJ,EAE/BD,GAAmBjyF,KAAKutC,mBACxB,MAAMklD,EAActuF,KAAKouF,MAAMC,EAAkBP,GAAmBO,GAC9DE,EAAqBvuF,KAAKm9D,IAAImxB,GAAeN,EAAY7xD,KAAO+xD,EAChEM,EAAqBxuF,KAAKq9D,IAAIixB,GAAeN,EAAY7xD,KACzDsyD,EAAqBzuF,KAAKm9D,IAAImxB,GAAeN,EAAY54C,KAAO84C,EAChEQ,EAAqB1uF,KAAKq9D,IAAIixB,GAAeN,EAAY54C,KACzDyjB,EAAQh9D,KAAKivC,WACb6jD,EAASv5C,EAAK1b,MAAM,GAAGoR,WACvB8jD,EAAQx5C,EAAK8sC,kBAAoBrpB,EAAQ81B,GAAUV,EAOzD,MANY,CACRlpF,GAAI8zD,EAAQ01B,EACZtpF,GAAI2pF,EAAQd,EAAkBU,EAC9BtpF,GAAI2zD,EAAQw1B,EAAkBH,EAASO,EACvCtpF,GAAIypF,EAAQP,EAAkBK,IChInC,MAAMG,WAAmBlxF,GAC5BT,YAAYu8B,EAAS+qC,EAAeC,GAChCnmE,MAAM,CAAEs7B,SAAU,MAClB/9B,KAAKslB,aAAe,IAAIojD,GAAa9qC,EAAS+qC,EAAeC,GAE7D5oE,KAAKuzC,cAAe,EAEbjyC,sBACP,OAAOG,EAASuxF,WAIpB59C,qBAAqBC,GAEjB,OAAOr1C,KAEXy1C,YAII,OAHAz1C,KAAK01C,cAAe,EACpB11C,KAAKslB,aAAarL,SAASja,KAAK+a,cAChC/a,KAAKwc,SAASxc,KAAKslB,aAAa/I,YACzBvc,KAEX2U,OACI,MAAMmE,EAAM9Y,KAAK+a,aAAarG,eAC9B1U,KAAKgV,cACLhV,KAAKslB,aAAajd,KAAKrI,KAAKi2C,gBAC5Bj2C,KAAKslB,aAAajQ,WAAWyD,GAC7B9Y,KAAKslB,aAAa3Q,QCpB1B,IAAIs+E,GAYG,MAAMC,WAAyBngF,EAMlC1R,YAAY8xF,EAAoBj7E,GAC5BzV,QACAzC,KAAKozF,GAAK,CAAEh3E,KAAMjT,IAAKkT,MAAOlT,KAC9BnJ,KAAKqzF,gBAAiB,EACtBrzF,KAAKszF,iBAAkB,EACvBtzF,KAAKuzF,kBAAmB,EACxBvzF,KAAKwzF,kBAAmB,EACxBxzF,KAAKmzF,mBAAqBA,EAE1BnzF,KAAKqzF,eAAiD,iBAAzBn7E,EAAQu7E,aACrCzzF,KAAKszF,gBAAmD,iBAA1Bp7E,EAAQw7E,cACtC1zF,KAAKuzF,iBAAqD,iBAA3Br7E,EAAQy7E,eACvC3zF,KAAKwzF,iBAAqD,iBAA3Bt7E,EAAQ07E,eACvC,MAAMlyD,EAAYnF,EAAOoF,mBACzB3hC,KAAKmhC,eAAiB9gC,OAAO0V,OAAO,CAAE89E,aAAa,EAAOC,aAAa,EAAMC,aAAc,GAAKC,mBAAoBtyD,EAAUtxB,aAAa,gBAAiBlN,KAAM,EAAGutE,yBAA0Bl0C,EAAOuC,oBAAqBm1D,gBAAiB,EAAGC,2BAA4B33D,EAAOkC,oBAAqBg1D,aAAc,EAAGC,cAAe,EAAGC,eAAgB,EAAGC,eAAgB,GAAK17E,GAClX,MAAMo3D,EAAgB5tC,EAAUtxB,aAAa,mBAAoB,GACjEpQ,KAAKmhC,eAAe4yD,aAAezkB,EAE5BhuE,sBACP,OAAOG,EAASyxF,iBAEpBiB,QACI,OAAOn0F,KAAKozF,GAEhBn5E,SAASC,GAEL,OADAla,KAAKka,MAAQA,EACNla,KAEX8d,WACI,OAAO9d,KAAKka,MAEhBa,aACI,OAAOnY,EAAQ5C,KAAKka,MAAO,UAAW,kCAE1Ck6E,SAASl6E,EAAOpB,EAAKsD,EAAMC,EAAOg4E,GAC9B,MAAMn8E,EAAUlY,KAAKmhC,eACft5B,EAAIqS,EAAMuoB,YAAYvqB,EAAQhV,MAC9BgvC,EAA2B,IAAhB71B,EAAQD,GAGzB,IAAIk4E,EAFJl4E,GAAQ81B,EACR71B,GAAS61B,EAGLoiD,EADAt0F,KAAKuzF,iBACwC,GAAzBr7E,EAAQy7E,eAGc,IAAtBU,EAExB,MAAME,EAAiBr8E,EAAQ+7E,gBACzB9jD,EAAMtoC,EAAIwsF,EACVG,EAAM3sF,EAAIwsF,EACVI,EAAer4E,EAAOm4E,EACtBG,EAAgBr4E,EAAQk4E,EACxBI,EAAU9sF,EAAIysF,EACdM,EAAa/sF,EAAIysF,EACvBx7E,EAAIlF,OACJkF,EAAIQ,YACJR,EAAIS,OAAO6C,EAAM+zB,GACjBr3B,EAAIU,OAAOi7E,EAActkD,GACzBr3B,EAAIU,OAAOi7E,EAAcE,GACzB77E,EAAIU,OAAOk7E,EAAeC,GAC1B77E,EAAIU,OAAOk7E,EAAevkD,GAC1Br3B,EAAIU,OAAO6C,EAAO8zB,GAClBr3B,EAAIU,OAAO6C,EAAOm4E,GAClB17E,EAAIU,OAAOk7E,EAAeF,GAC1B17E,EAAIU,OAAOk7E,EAAeE,GAC1B97E,EAAIU,OAAOi7E,EAAcG,GACzB97E,EAAIU,OAAOi7E,EAAcD,GACzB17E,EAAIU,OAAO4C,EAAMo4E,GACjB17E,EAAIi/B,YACJj/B,EAAIa,OAERk7E,YAAY36E,EAAOpB,EAAKsD,EAAMC,EAAOg4E,GACjC,MAAMS,EAAK3wF,KAAK0C,MAAM7G,KAAKmzF,mBAAqB,GAC1CrvF,EAAI9D,KAAKmzF,mBAAqB,EAC9B4B,EAAK5wF,KAAK0C,MAAM/C,EAAI,GACpBkxF,EAAKlxF,EAAI,EACToU,EAAUlY,KAAKmhC,eAGrB8xD,QAAiBnwF,EACjB,MAAM8mB,EAjGd,WACI,IAAKqpE,GAAgB,CACjB,MAAM/6B,EAAW,IAAI5E,GAAS,CAAEv1B,SAAU,IAAK21B,UAAW,MAC1Du/B,GAAiB,CACbh8C,iBAAkBihB,EAAS/2B,eAAe8V,iBAC1C0c,WAAYuE,EAASvE,WACrBlqD,MAAOyuD,EAAS37C,YAGxB,OAAO02E,GAwFUgC,GACPC,EAAah9E,EAAQg8E,2BACrBiB,EAAavrE,EAAKngB,OAASyrF,EAAatrE,EAAKqtB,kBAC7C9mC,EAAS,CACX,EAAG,CACC1G,MAAoB,GAAb0rF,EACPzrF,OAAQ2qF,GAEZ,EAAG,CACC5qF,MAAO0rF,IAIThmD,EAAUnvC,KAAKwzF,iBAAmBt7E,EAAQ07E,eAAiB,GAEjE,IAAI/wF,EAAIuZ,EAAwB,IAAhBC,EAAQD,GAAsB,IADhC04E,EAAK3kF,EAAO,GAAG1G,MAAQsrF,EAAK5kF,EAAO,GAAG1G,MAAQurF,EAAK7kF,EAAO,GAAG1G,OAASqrF,EAAKC,EAAKC,EAAK,GAAK7lD,GAExG,MAAMjsC,EAAOgV,EAAQhV,KACfo3D,EAAOpgD,EAAMuoB,YAAYv/B,EAAO,GAChCkyF,EAAUl7E,EAAMuoB,YAAYv/B,GAC5Bs3D,EAAUtgD,EAAMuoB,YAAYv/B,EAAO,GACzC4V,EAAIlF,OACJkF,EAAI1E,eAAe,QACnB0E,EAAIxE,aAAa,GACjB,IAAK,IAAI5M,EAAI,EAAGA,EAAIotF,IAAMptF,EACtBoR,EAAI4kC,SAAS76C,EAAGuyF,EAAUjlF,EAAO,GAAGzG,OAAQyG,EAAO,GAAG1G,MAAO0G,EAAO,GAAGzG,QACvEoP,EAAI4kC,SAAS76C,EAAG23D,EAAUrqD,EAAO,GAAGzG,OAAQyG,EAAO,GAAG1G,MAAO0G,EAAO,GAAGzG,QACvE7G,GAAKsN,EAAO,GAAG1G,MAAQ0lC,EAE3B,IAAK,IAAIznC,EAAI,EAAGA,EAAIqtF,IAAMrtF,EACtBoR,EAAI4kC,SAAS76C,EAAGuyF,EAAUjlF,EAAO,GAAGzG,OAAQyG,EAAO,GAAG1G,MAAO0G,EAAO,GAAGzG,QACvE7G,GAAKsN,EAAO,GAAG1G,MAAQ0lC,EAE3B,IAAK,IAAIznC,EAAI,EAAGA,EAAIstF,IAAMttF,EACtBoP,EAAMu8C,YAAYv6C,EAAKjW,EAAGy3D,EAAM46B,EAAYtrE,EAAK+pC,YACjD9wD,GAAKsN,EAAO,GAAG1G,MAAQ0lC,EAE3Br2B,EAAItE,UAERG,OACI,MAAMmE,EAAM9Y,KAAK0U,eACjB1U,KAAKgV,cACL,MAAMkF,EAAQla,KAAK+a,aACnB,IAAIqB,EAAOlC,EAAMigC,gBACb99B,EAAQnC,EAAMs3D,cAKlB,MAAMmC,EAAez5D,EAAMusB,aAAagU,GAAsB+B,OAClC,IAAxBm3B,EAAa7uE,QAAgBtD,EAAUmyE,EAAa,MACpDv3D,GAAQu3D,EAAa,GAAGp3D,YAE5B,MAAMrE,EAAUlY,KAAKmhC,eACjBnhC,KAAKqzF,iBACLj3E,EAAOlC,EAAMjS,OAASiQ,EAAQu7E,cAE9BzzF,KAAKszF,kBACLj3E,EAAQnC,EAAMjS,OAASiS,EAAMqC,WAAarE,EAAQw7E,eAEtD1zF,KAAKozF,GAAGh3E,KAAOA,EACfpc,KAAKozF,GAAG/2E,MAAQA,EAChB,MAAMg4E,EAAsBn8E,EAAQu4D,yBAOpC,GANIv4D,EAAQ27E,YACR7zF,KAAK60F,YAAY36E,EAAOpB,EAAKsD,EAAMC,EAAOg4E,GAG1Cr0F,KAAKo0F,SAASl6E,EAAOpB,EAAKsD,EAAMC,EAAOg4E,GAEvCn8E,EAAQ47E,YAAa,CACrB,MAAM3kB,EAAW,IAAMnvE,KAAKmzF,mBACtBkC,EAAU,IAAInmB,GAAcC,EAAU,GAAG,GAC/CkmB,EAAQx+E,MAAQqB,EAAQ87E,mBACxBqB,EAAQxlB,WAAWV,GACnBkmB,EAAQp7E,SAASC,GACjBm7E,EAAQhtF,KAAK+T,EAAwB,IAAhBC,EAAQD,GAA2D,GAA7Ci5E,EAAQzlB,UAAUp3D,MAAM1I,aAAarG,OAChF4rF,EAAQpmB,WAAa/2D,EAAQ67E,YAC7BsB,EAAQhgF,WAAWyD,GAAKnE,SCxKpC,SAAS2gF,GAAe1oF,EAAM+G,EAAS9Q,EAAGgF,EAAGgP,GACzC,MAAM0+E,EAAaC,GAAazoB,OAAOngE,GACzB,IAAIkK,EAAMy+E,EAAWhzF,KAAMsU,EAAO,CAAE3V,SAAU,iBACtD0Z,OAAOjH,EAAS9Q,EAAI0yF,EAAWn+E,QAASvP,EAAI0tF,EAAWl+E,SAS1D,MAAMm+E,WAAqBziF,EAC9B1R,YAAYw8B,GACRp7B,QACAzC,KAAK69B,MAAQA,EACb79B,KAAKiR,KAAOukF,GAAavkF,KAAK+xC,KAC9BhjD,KAAKkD,KAAO,EAEZlD,KAAKy1F,oBAAsB,GAC3Bz1F,KAAK01F,oBAAsB,GAC3B11F,KAAKkW,YACLlW,KAAKmhC,eAAiB,CAClBw0D,eAAgB,GAChBC,kBAAmB,EACnBC,mBAAoB,EACpBj+C,MAAO,SAGJt2C,sBACP,OAAOG,EAAS+zF,aAMpB/wF,qBAAqBo5B,GAEjB,OADc,IAAI23D,GAAa33D,GAInCp5B,uBAAuBo5B,GACnB,MAAMi4D,EAAQ,IAAIN,GAAa33D,GAG/B,OAFAi4D,EAAMr5C,QAAQ+4C,GAAavkF,KAAK8kF,OAChCD,EAAME,cAAc,cACbF,EAGXrxF,sBAAsBo5B,GAClB,MAAMi4D,EAAQ,IAAIN,GAAa33D,GAG/B,OAFAi4D,EAAMr5C,QAAQ+4C,GAAavkF,KAAK+xC,MAChC8yC,EAAME,cAAc,YAAa,aAC1BF,EAGXr5C,QAAQxrC,GAKJ,OAJAA,EAAuB,iBAATA,EAAoBukF,GAAa94C,WAAWzrC,GAAQA,IACtDukF,GAAavkF,KAAK+xC,MAAQ/xC,GAAQukF,GAAavkF,KAAK8kF,QAC5D/1F,KAAKiR,KAAOA,GAETjR,KAMXg2F,cAAcC,EAAS/3C,GAGnB,OAFAl+C,KAAKy1F,oBAAsBQ,GAAW,GACtCj2F,KAAK01F,oBAAsBx3C,GAAW,GAC/Bl+C,KAGXg0D,QAAQ9wD,GAEJ,OADAlD,KAAKkD,KAAOA,EACLlD,KAGXk2F,gBACI,MAAMp9E,EAAM9Y,KAAK0U,eACjB,IACIyhF,EACAC,EAFAC,GAAqB,EAIzBr2F,KAAK69B,MAAM3f,SAAQ,CAACxB,EAAMtL,EAAOysB,KAE7Bw4D,GAAsBA,EAEtB,MAAMxzF,EAAI6Z,EAAKu5B,eACTpuC,EAAI6U,EAAK3B,aAAa20B,kBAAkB1vC,KAAKkD,KAAO,GAE1D,GAAIL,EAAIszF,EACJ,MAAM,IAAI9zF,EAAa,uBAAwB,gEAKnD,MAAMi0F,EAAez4D,EAAMzsB,EAAQ,KAAOsL,EACpC65E,EAAe14D,EAAMzsB,EAAQ,KAAOsL,EAC1C,IAAItF,EAAU,EACd,MAAMP,EAAQ0lB,EAAOoF,mBAAmBvxB,aAAa,gBAAgBimF,EAAqB,OAAS,cACnG,GAAIA,EAGA,GADAj/E,EAAUm/E,EAAe,EAAI,EACzBv2F,KAAKiR,OAASukF,GAAavkF,KAAK8kF,OAAUQ,EAgB1Cz9E,EAAIQ,YACJR,EAAIS,OAAO1W,EAAGgF,EAAI7H,KAAKmhC,eAAew0D,gBACtC78E,EAAIU,OAAO3W,EAAIuU,EAASvP,GACxBiR,EAAIikB,SACJjkB,EAAIi/B,iBAlBJ,GAAI/3C,KAAKy1F,oBAAqB,CAE1B,MAAM3mD,EAAah2B,EAAIi2B,YAAY/uC,KAAKy1F,qBAAqBhsF,MAC7DqP,EAAIg3B,SAAS9vC,KAAKy1F,oBAAqB5yF,EAAIisC,EAAa,EAAGjnC,GAC3DuP,EAAU03B,EAAa,EAAI9uC,KAAKmhC,eAAey0D,uBAI/CN,GAAe,gBAAiBx8E,EAAKjW,EAAGgF,EAAGgP,GAC3CO,EAAU,GAAKpX,KAAKmhC,eAAey0D,uBAc3Cx+E,EAAUk/E,GAAgB,EAAI,EAE9Bx9E,EAAIQ,YACJR,EAAIS,OAAO48E,EAAQC,GACnBt9E,EAAIU,OAAO3W,EAAIuU,EAASvP,GACxBiR,EAAIU,OAAO3W,EAAGgF,EAAI7H,KAAKmhC,eAAew0D,gBACtC78E,EAAIikB,SACJjkB,EAAIi/B,YAGRo+C,EAAStzF,EAAIuU,EACbg/E,EAASvuF,KAOjB2uF,WACI,MAAM19E,EAAM9Y,KAAK0U,eACjB,IAAI2hF,GAAqB,EAEzBr2F,KAAK69B,MAAM3f,SAASxB,IAChB25E,GAAsBA,EACtB,MAAMn8E,EAAQwC,EAAK3B,aACblY,EAAI6Z,EAAKu5B,eACTpuC,EAAIqS,EAAMw1B,kBAAkB1vC,KAAKkD,KAAO,GACxC2T,EAAQ0lB,EAAOoF,mBAAmBvxB,aAAa,gBAAgBimF,EAAqB,OAAS,cACnG,IAAIvnD,EAAa,EACbunD,EACIr2F,KAAKy1F,qBACL3mD,EAAah2B,EAAIi2B,YAAY/uC,KAAKy1F,qBAAqBhsF,MACvDqP,EAAIg3B,SAAS9vC,KAAKy1F,oBAAqB5yF,EAAIisC,EAAa,EAAGjnC,IAG3DytF,GAAe,gBAAiBx8E,EAAKjW,EAAGgF,EAAGgP,GAI3C7W,KAAK01F,qBACL5mD,EAAah2B,EAAIi2B,YAAY/uC,KAAK01F,qBAAqBjsF,MACvDqP,EAAIg3B,SAAS9vC,KAAK01F,oBAAqB7yF,EAAIisC,EAAa,EAAGjnC,IAG3DytF,GAAe,gBAAiBx8E,EAAKjW,EAAGgF,EAAGgP,MAM3DlC,OACI,MAAMmE,EAAM9Y,KAAK0U,eACjB1U,KAAKgV,cACL8D,EAAIlF,OACJkF,EAAI1E,eAAepU,KAAKmhC,eAAeyW,OACvC9+B,EAAI5E,aAAalU,KAAKmhC,eAAeyW,OACrC9+B,EAAIxD,QAAQtV,KAAKwV,UAjMzB,YAAcvS,GACNuyF,GAAat0D,OACbn+B,EAAI,wBAAyBE,GAgM7B,CAAE,2BACEjD,KAAKiR,OAASukF,GAAavkF,KAAKmlE,SAAWp2E,KAAKiR,OAASukF,GAAavkF,KAAK8kF,OAC3Ej9E,EAAIxE,aAAatU,KAAKmhC,eAAe00D,oBACrC71F,KAAKk2F,iBAEAl2F,KAAKiR,OAASukF,GAAavkF,KAAK+xC,MACrChjD,KAAKw2F,WAET19E,EAAItE,WAIZghF,GAAat0D,OAAQ,EACrBs0D,GAAa9/E,UAAY,CACrBhI,OAAQhB,EAAK8D,MACblD,KAAM,GACNC,OAAQjC,EAAW2gC,KACnBz+B,MAAOjC,EAAUoD,QAGrB6mF,GAAazoB,OAAS,CAClB0pB,cAAe,CACXl0F,KAAM,mBACN6U,SAAU,GACVC,QAAS,GAEbq/E,cAAe,CACXn0F,KAAM,kBACN6U,SAAU,EACVC,QAAS,IAIjBm+E,GAAavkF,KAAO,CAChB+xC,KAAM,EACNozB,QAAS,EACT2f,MAAO,GAGXP,GAAa94C,WAAa,CACtBz4C,KAAMuxF,GAAavkF,KAAK+xC,KACxBwzB,QAASgf,GAAavkF,KAAKmlE,QAC3BugB,MAAOnB,GAAavkF,KAAK8kF,OC/O7B,MAAMa,GAAQ,CACV,EAAK,aACL,EAAK,cACL,EAAK,cACLpF,MAAO,kBAEJ,MAAMqF,WAAmBzF,GACjB9vF,sBACP,OAAOG,EAASo1F,WAEpBx1F,YAAY4P,EAAMilC,EAAYh+B,GAC1BzV,WAAMK,EAAWzC,OAAO0V,OAAO,CAAEgoB,SAAU,IAAKsV,aAAuB,UAATpiC,GAAoBilC,GAAah+B,GAC/F,MACMM,EAAQ,IAAI1B,EADA8/E,GAAM3lF,IAAS,aACEsrB,EAAOoF,mBAAmBvxB,aAAa,mBAAoB,IAAK,CAC/FlP,SAAU,eAEdlB,KAAKsxF,SAAS94E,ICJtB,SAASs+E,GAAch+E,EAAKuoD,EAAIE,EAAIr4D,EAAIE,EAAIC,EAAIC,GAE5CwP,EAAIQ,YACJR,EAAIS,OAAO8nD,EAAIE,GACfzoD,EAAIU,OAAOtQ,EAAIE,GACf0P,EAAIU,OAAOnQ,EAAIC,GACfwP,EAAIU,OAAO6nD,EAAIE,GACfzoD,EAAIi/B,YACJj/B,EAAIa,OAED,MAAMo9E,WAAkBhkF,EAa3B1R,YAAYw8B,GACRp7B,QACAzC,KAAK6pD,SAAShsB,GACd79B,KAAKiE,KAAO,GACZjE,KAAKkW,YACLlW,KAAKmhC,eAAiB,CAElBsyD,aAAc,EACdC,cAAe,EAEfr1C,WAAY,EAEZ24C,eAAWl0F,EAEXm0F,aAAa,EAEbr/C,WAAO90C,EAEPo0F,kBAAkB,EAClBC,gBAAgB,EAEhBC,iBAAkB,GAElBC,gBAAiBlzF,KAAKC,GAAK,EAE3BkzF,uBAAwBP,GAAUQ,qBAAqBxqD,IACvDyqD,mBAAoBT,GAAUU,kBAAkB17E,QAG7Cza,sBACP,OAAOG,EAASs1F,UAGpBlpB,QAAQ5pE,GAEJ,OADAjE,KAAKiE,KAAOA,EACLjE,KAGX6pD,SAAShsB,GACL,IAAKA,EAAMusB,aAAevsB,EAAM+pB,UAC5B,MAAM,IAAIvlD,EAAa,eAAgB,2DAM3C,GAJKw7B,EAAMwsB,gBACPxsB,EAAMwsB,cAAgB,CAAC,IACtBxsB,EAAMysB,eACPzsB,EAAMysB,aAAe,CAAC,IACtBzsB,EAAMwsB,cAAcvlD,SAAW+4B,EAAMysB,aAAaxlD,OAClD,MAAM,IAAIzC,EAAa,eAAgB,qDAO3C,OALArC,KAAK69B,MAAQA,EACb79B,KAAKoqD,WAAavsB,EAAMusB,WACxBpqD,KAAKqqD,cAAgBxsB,EAAMwsB,cAC3BrqD,KAAK4nD,UAAY/pB,EAAM+pB,UACvB5nD,KAAKsqD,aAAezsB,EAAMysB,aACnBtqD,KAGX03F,iBACI,MAAM5+E,EAAM9Y,KAAK0U,eACXysB,EAAiBnhC,KAAKmhC,eACxBA,EAAe61D,WACfl+E,EAAIqlD,YAAYh9B,EAAe61D,WAE/B71D,EAAekd,YACfvlC,EAAIxE,aAAa6sB,EAAekd,YAEhCld,EAAe81D,YACfn+E,EAAIklD,WAAW,SAGfllD,EAAIklD,WAAW,UAIvB25B,iBACI,MAAM7+E,EAAM9Y,KAAK0U,eACjBoE,EAAIxD,QAAQtV,KAAKwV,UACjB,MACMoiC,EADiB53C,KAAKmhC,eACCyW,MACzBA,IACA9+B,EAAI1E,eAAewjC,GACnB9+B,EAAI5E,aAAa0jC,IAIzBggD,cAAc9+E,EAAK++E,EAAKC,GACpB,MAAMC,EAAc/3F,KAAKmhC,eAAe+1D,kBAAoBl3F,KAAKmhC,eAAeg2D,eAC1EjuF,EAAK2uF,EAAIh1F,EACTuG,EAAKyuF,EAAIhwF,EACTwB,EAAKyuF,EAAIj1F,EACTyG,EAAKwuF,EAAIjwF,EAGTmwF,EAAW7zF,KAAKiH,MAAM/B,EAAKH,IAAOG,EAAKH,IAAOI,EAAKF,IAAOE,EAAKF,IAC/D6uF,GAASD,EAAWh4F,KAAKmhC,eAAei2D,iBAAmB,GAAKY,EACtE,IAAI/nB,EACAioB,EACAnpB,EACAopB,EACAn4F,KAAKmhC,eAAeg2D,gBAAkBY,GACtC9nB,EAAQ9rE,KAAKw+B,MAAMz5B,GAAMG,EAAKH,GAAM+uF,GACpCC,EAAQ/zF,KAAKw+B,MAAMv5B,GAAME,EAAKF,GAAM6uF,KAGpChoB,EAAQ5mE,EACR6uF,EAAQ5uF,GAERtJ,KAAKmhC,eAAe+1D,kBAAoBa,GACxChpB,EAAU7lE,GAAMG,EAAKH,IAAO,EAAI+uF,GAChCE,EAAU/uF,GAAME,EAAKF,IAAO,EAAI6uF,KAGhClpB,EAAU7lE,EACVivF,EAAU/uF,GAEVpJ,KAAKmhC,eAAeyW,QACpB9+B,EAAI1E,eAAepU,KAAKmhC,eAAeyW,OACvC9+B,EAAI5E,aAAalU,KAAKmhC,eAAeyW,QAGzC9+B,EAAIQ,YACJR,EAAIS,OAAOw1D,EAASopB,GACpBr/E,EAAIU,OAAOy2D,EAAOioB,GAClBp/E,EAAIikB,SACJjkB,EAAIi/B,YAEJ,MAAMqgD,EAAaj0F,KAAK4/D,MAAMz6D,EAAKF,EAAIC,EAAKH,GAEtCnB,EAAI5D,KAAK6C,IAAIhH,KAAKmhC,eAAei2D,iBAAmBjzF,KAAKm9D,IAAIthE,KAAKmhC,eAAek2D,kBACvF,IAAIgB,EACAC,EACAC,EACAtqB,EACAuqB,EACA1X,GACA9gF,KAAKmhC,eAAeg2D,gBAAkBY,KACtCM,EAASD,EAAaj0F,KAAKC,GAAKpE,KAAKmhC,eAAek2D,gBACpDkB,EAAQlvF,EAAKlF,KAAKm9D,IAAI+2B,GAAUtwF,EAChCkmE,EAAQ3kE,EAAKnF,KAAKq9D,IAAI62B,GAAUtwF,EAChCuwF,EAASF,EAAaj0F,KAAKC,GAAKpE,KAAKmhC,eAAek2D,gBACpDmB,EAAWnvF,EAAKlF,KAAKm9D,IAAIg3B,GAAUvwF,EACnC+4E,EAAWx3E,EAAKnF,KAAKq9D,IAAI82B,GAAUvwF,EACnC+uF,GAAch+E,EAAKy/E,EAAOtqB,EAAO5kE,EAAIC,EAAIkvF,EAAU1X,KAEnD9gF,KAAKmhC,eAAe+1D,kBAAoBa,KACxCM,EAASD,EAAap4F,KAAKmhC,eAAek2D,gBAC1CkB,EAAQrvF,EAAK/E,KAAKm9D,IAAI+2B,GAAUtwF,EAChCkmE,EAAQ7kE,EAAKjF,KAAKq9D,IAAI62B,GAAUtwF,EAChCuwF,EAASF,EAAap4F,KAAKmhC,eAAek2D,gBAC1CmB,EAAWtvF,EAAK/E,KAAKm9D,IAAIg3B,GAAUvwF,EACnC+4E,EAAW13E,EAAKjF,KAAKq9D,IAAI82B,GAAUvwF,EACnC+uF,GAAch+E,EAAKy/E,EAAOtqB,EAAO/kE,EAAIE,EAAIovF,EAAU1X,IAI3DnsE,OACI,MAAMmE,EAAM9Y,KAAK0U,eACjB1U,KAAKgV,cACL,MAAMo1C,EAAapqD,KAAKoqD,WAClBxC,EAAY5nD,KAAK4nD,UACjBzmB,EAAiBnhC,KAAKmhC,eAC5BroB,EAAIlF,OACJ5T,KAAK03F,iBAEL,IAAIe,EAAiB,CAAE51F,EAAG,EAAGgF,EAAG,GAC5B6wF,EAAe,CAAE71F,EAAG,EAAGgF,EAAG,GAC9B7H,KAAKqqD,cAAcnsC,SAAQ,CAACy6E,EAAajxF,KACrC,MAAMkxF,EAAa54F,KAAKsqD,aAAa5iD,GAErC+wF,EAAiBruC,EAAW/iB,mBAAmB,EAAGsxD,GAClDD,EAAe9wC,EAAUvgB,mBAAmB,EAAGuxD,GAC/C,MAAMC,EAAgBJ,EAAe5wF,EAAI6wF,EAAa7wF,EAEtD4wF,EAAe51F,GAAKunD,EAAWt6C,aAAamO,WAAakjB,EAAesyD,aACxEiF,EAAa71F,GAAK+kD,EAAU93C,aAAakO,UAAYmjB,EAAeuyD,cAEpE,MAAMoF,EAAiB1uC,EAAWnR,WAAW18B,WACrB6tC,EAAW/nB,cAAcs2D,GAAax7D,WACL,IAAlCitB,EAAW7c,qBAC9BkrD,EAAe51F,GAAKi2F,EAAiB33D,EAAesyD,cAGjC7rC,EAAUvlB,cAAcu2D,GAAYz7D,YACH,IAAlCyqB,EAAUra,qBAC5BmrD,EAAa71F,GAAKi2F,EAAiB33D,EAAeuyD,eAGtD+E,EAAe5wF,GAAKgxF,GAAiB,EAAI,EACzCH,EAAa7wF,GAAKgxF,EAAgB,EAAI,EACtC74F,KAAK43F,cAAc9+E,EAAK2/E,EAAgBC,MAE5C5/E,EAAItE,UAEJ,MAAMs6B,EAAah2B,EAAIi2B,YAAY/uC,KAAKiE,MAAMwF,MACxCojE,EAAgB1rC,EAAeq2D,mBACrC,IAAI30F,EAAI,EACR,GAAIgqE,IAAkBkqB,GAAUU,kBAAkB97E,KAC9C9Y,EAAI41F,EAAe51F,OAElB,GAAIgqE,IAAkBkqB,GAAUU,kBAAkB17E,OAAQ,CAG3DlZ,GAFgB61F,EAAa71F,EAAI41F,EAAe51F,GACrB,EAAI41F,EAAe51F,EAC/BisC,EAAa,OAEvB+9B,IAAkBkqB,GAAUU,kBAAkBn7E,QACnDzZ,EAAI61F,EAAa71F,EAAIisC,GAGzB,IAAIjnC,EAAI,EACR,MAAMkxF,EAAoB53D,EAAem2D,uBAYzC,OAXIyB,IAAsBhC,GAAUQ,qBAAqBxqD,IACrDllC,EAAIuiD,EAAWrvC,aAAa00B,iBAEvBspD,IAAsBhC,GAAUQ,qBAAqBrpD,SAC1DrmC,EAAIuiD,EAAWrvC,aAAa20B,kBAAkBnT,EAAOwC,0BAGzDjmB,EAAIlF,OACJ5T,KAAK23F,iBACL7+E,EAAIg3B,SAAS9vC,KAAKiE,KAAMpB,EAAGgF,GAC3BiR,EAAItE,UACGxU,MAIf+2F,GAAUrhF,UAAYrV,OAAO0V,OAAO,GAAIhD,EAAQ2C,WAEhDqhF,GAAUQ,qBAAuB,CAC7BxqD,IAAK,EACLmB,OAAQ,GAEZ6oD,GAAUU,kBAAoB,CAC1B97E,KAAM,EACNI,OAAQ,EACRO,MAAO,GCrQJ,MAAM08E,WAAejmF,EACxB1R,YAAYq7B,EAAS,IACjBj6B,QACAzC,KAAKsY,WAAWokB,GAChB18B,KAAK4X,MAAQ,GAENtW,sBACP,OAAOG,EAASu3F,OAGpB1gF,WAAWJ,EAAU,IACjB,IAAKA,EAAQzY,QACT,MAAM,IAAI4C,EAAa,YAAa,kDAExCrC,KAAKP,QAAUyY,EAAQzY,QACvBO,KAAKkY,QAAU7X,OAAO0V,OAAO1V,OAAO0V,OAAO,CAAEtW,QAASO,KAAKP,QAASoD,EAAG,GAAIgF,EAAG,GAAI4B,MAAO,IAAKwvF,mBAAoB,GAAIC,WAAW,EAAOC,iBAAiB,EAAOC,gBAAgB,EAAOC,iBAAkB,EAAGC,WAAW,GAASphF,GAAU,CAAEqhF,QAASl5F,OAAO0V,OAAO,CAAEkoE,MAAO,IAAO/lE,EAAQqhF,SAAUC,cAAen5F,OAAO0V,OAAO,GAAImC,EAAQshF,kBACzS,IAAjCx5F,KAAKkY,QAAQihF,sBAAsD,IAAlBjhF,EAAQzO,QACzDzJ,KAAKkY,QAAQghF,WAAY,GAIjC7jF,WAAW1B,GAGP,OAFAlR,MAAM4S,WAAW1B,GACjB3T,KAAKP,QAAQ4V,WAAW1B,GACjB3T,KAMXy5F,aAAaxoF,EAAO,UAMhB,OALAjR,KAAK05F,UAAY15F,KAAKP,QAAQ40E,eAAe,CACzCI,UAAWz0E,KAAK4X,MAAM,GAAGsC,MACzBw6D,aAAc10E,KAAK4X,MAAM5X,KAAK4X,MAAM9S,OAAS,GAAGoV,MAChDjJ,KAAAA,IAEGjR,KAAK05F,UAgBhBC,SAASj9D,GACL,IAAI3vB,EACJ,MAAM6sF,EAAev5F,OAAO0V,OAAO,CAAEw6D,UAAU,GAAS7zC,EAAOxkB,SACzDgC,EAAgC,QAAvBnN,EAAK2vB,EAAOxiB,aAA0B,IAAPnN,EAAgBA,EAAK/M,KAAKP,QAAQuwE,MAAM,CAAEntE,EAAG7C,KAAKkY,QAAQrV,EAAGgF,EAAG7H,KAAKkY,QAAQrQ,EAAG4B,MAAOzJ,KAAKkY,QAAQzO,MAAOyO,QAAS0hF,IAC5JzsB,EAAI9sE,OAAO0V,OAAO1V,OAAO0V,OAAO,CAAEmE,MAAAA,EAEpC2/E,WAAY,EAAGC,WAAY,EAAGC,kBAAkB,EAAOZ,iBAAiB,GAASz8D,GAAS,CAAExkB,QAAS0hF,IACnG9gF,EAAM9Y,KAAKoV,aAOjB,OANA+3D,EAAEjoC,OAAOhnB,SAASmnB,GAAUA,EACvBhwB,WAAWyD,GACXmB,SAASC,GACTqrB,eACArnB,SAASuuC,GAAaA,EAASxyC,SAASC,OAC7Cla,KAAK4X,MAAMC,KAAKs1D,GACTjzD,EAGXo0C,SACI,MAAM0rC,EAAkBh6F,KAAKkY,QAAQqhF,QACrC,IAAIxhB,EAAe,EACnB,MAAMxsC,EAAY,IAAI6iB,GAAU4rC,GAChCh6F,KAAKurC,UAAYA,EACjB,IAAI1jC,EAAI7H,KAAKkY,QAAQrQ,EACjBgrD,EAAS,EACTonC,EAAY,GAChB,MAAMC,EAAqB,GAE3Bl6F,KAAK4X,MAAMsG,SAASi8E,IAChBtyF,GAAQsyF,EAAKjgF,MAAMy5B,MAAMwmD,EAAKN,YAC9BM,EAAKjgF,MAAM5R,KAAKT,GACZ7H,KAAKkY,QAAQghF,UACbiB,EAAKj1D,OAAOhnB,SAASmnB,IACjBkG,EAAU8iB,WAAW,CAAChpB,OAI1BkG,EAAU8iB,WAAW8rC,EAAKj1D,QAE9Br9B,GAAQsyF,EAAKjgF,MAAMy5B,MAAMwmD,EAAKL,YAC9BjyF,GAAQsyF,EAAKjgF,MAAMy5B,MAAM3zC,KAAKkY,QAAQ+gF,oBAClCkB,EAAKJ,mBACLG,EAAmBriF,KAAK,CAAEhQ,EAAAA,EAAGw9B,MAAO80D,EAAKj1D,OAAO,KAChDr9B,GAAK,IAEToyF,EAAYA,EAAUrwB,OAAOuwB,EAAKj1D,QAClC2tB,EAAS1uD,KAAK4E,IAAI8pD,EAAQsnC,EAAKjgF,MAAMigC,oBAGzCn6C,KAAK4X,MAAMsG,SAASi8E,GAASA,EAAKjgF,MAAMo3D,cAAcze,KAClD7yD,KAAKkY,QAAQghF,WACbnhB,EAAexsC,EAAUuuC,0BAA0BmgB,GACnDj6F,KAAK4X,MAAMsG,SAASi8E,IAChBA,EAAKjgF,MAAMsC,SAASu7D,EAAe/H,GAAM3K,cAAgBxS,EAAS7yD,KAAKkY,QAAQrV,QAInFk1E,EAAe/3E,KAAKkY,QAAQohF,UACtBt5F,KAAKkY,QAAQzO,MAAQzJ,KAAKkY,QAAQrV,EAClC7C,KAAKkY,QAAQzO,OAASopD,EAAS7yD,KAAKkY,QAAQrV,GAAKmtE,GAAMmB,eAEjE5lC,EAAU+iB,OAAO2rC,EAAWj6F,KAAKkY,QAAQihF,gBAAkB,EAAIphB,EAAc/3E,KAAKkY,QAAQshF,eAC1F,IAAK,IAAI9xF,EAAI,EAAGA,EAAI1H,KAAKkY,QAAQmhF,iBAAkB3xF,IAC/C6jC,EAAUyyC,KAAKgc,GAEnBh6F,KAAK6yD,OAASA,EACd7yD,KAAKk6F,mBAAqBA,EAC1Bl6F,KAAKo6F,MAAQvyF,EACb7H,KAAK2I,YAAc,IAAIf,EAAY5H,KAAKkY,QAAQrV,EAAG7C,KAAKkY,QAAQrQ,EAAG7H,KAAKkY,QAAQzO,MAAOzJ,KAAKo6F,MAAQp6F,KAAKkY,QAAQrQ,GAGrH8M,OAEI,MAAMmE,EAAM9Y,KAAK0U,eACjB,KAAK1U,KAAKurC,WAAcvrC,KAAK6yD,QAAW7yD,KAAKo6F,OAAUp6F,KAAKk6F,oBACxD,MAAM,IAAI73F,EAAa,cAAe,yCAE1CrC,KAAKgV,cACDhV,KAAKkY,QAAQkhF,gBACbhrC,GAAUisC,cAAcvhF,EAAK9Y,KAAKurC,UAAWvrC,KAAK6yD,OAAQ7yD,KAAKkY,QAAQrQ,EAAG7H,KAAKo6F,OAEnFp6F,KAAKk6F,mBAAmBh8E,SAAS7Y,IAC7BA,EAAEggC,MAAME,eAAernB,SAASuuC,GAAa3qD,GAAKw4F,YAAYxhF,EAAK2zC,EAAUpnD,EAAEwC,SCnDpF,MAAMzF,WAAgBF,GAGzBb,YAAY60C,EAAYzI,GAAY,GAChChrC,MAAMyzC,GACNl2C,KAAKmQ,OAAS,GAEdnQ,KAAKmuC,eAAiB,IACXnuC,KAAKu6F,UAAUhoF,KAAK1P,GAAMA,EAAE4E,MAAK8nC,QAAO,CAAC5rC,EAAGC,IAAOD,EAAIC,EAAID,EAAIC,IAG1E5D,KAAKguC,YAAc,IACRhuC,KAAKu6F,UAAUhoF,KAAK1P,GAAMA,EAAE4E,MAAK8nC,QAAO,CAAC5rC,EAAGC,IAAOD,EAAIC,EAAID,EAAIC,IAE1E5D,KAAKw6F,OAAQ,EAGbx6F,KAAKu6F,UAAYrkD,EAAWqkD,WAAa,GAEzCv6F,KAAKmhC,eAAiB9gC,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI/V,KAAKmhC,gBAAiB,CAExE8V,iBAAkB1a,EAAOiB,qBAEzBiQ,UAAAA,EAEAgtD,UAAWhtD,EAEXitD,yBAAyB,EAEzBrjF,QAAS,EAETF,MAAO,EAEPnJ,KAAM,GAAGtB,EAAKI,UAAUJ,EAAKiB,eACjC3N,KAAKwY,MAAQ+jB,EAAOoa,cAAc32C,KAAK+9B,SAAU/9B,KAAKw2C,UACtD5zC,EAAQ5C,KAAKwY,MAAO,eAAgB,gCAAgCxY,KAAK+9B,uBAAuB/9B,KAAKw2C,aACrGx2C,KAAK80D,YACD5e,EAAWhO,eACXloC,KAAKu1D,iBAAiBrf,EAAWhO,gBAGjCloC,KAAKu1D,iBAAiB/tB,EAAKe,IAG/BvoC,KAAKw6F,OAAQ,EACbx6F,KAAKy+C,cAEEn9C,sBACP,OAAOG,EAASW,QAEpBmW,QAII,OAHA9V,MAAM8V,QACFvY,KAAKka,OACLla,KAAKia,SAASja,KAAKka,OAChBla,KAIX26F,SAASH,GAGL,OAFAx6F,KAAKw6F,MAAQA,EACbx6F,KAAKy+C,cACEz+C,KAGXstC,UACI,QAAIttC,KAAKmhC,eAAesM,UAK5B2nB,mBACI,OAAoC,MAAhCp1D,KAAK81D,wBACE91D,KAAK81D,wBAEZ91D,KAAKwgC,KAC8B,IAA5BxgC,KAAKutC,oBAA4BvtC,KAAKwgC,KAAKnmB,eAAehD,QAAUrX,KAAKwgC,KAAKnmB,eAAehD,QAEjG,EAGXonC,cACIz+C,KAAKmQ,OAAS,GACdnQ,KAAKyJ,MAAQ,EACb,IAAK,IAAI/B,EAAI,EAAGA,EAAI1H,KAAKu6F,UAAUz1F,SAAU4C,EAAG,CAC5C,IAAI21B,EAAOr9B,KAAKu6F,UAAU7yF,GAAG21B,KACzBr9B,KAAKw6F,QACLn9D,EAAO,IAAMA,EAAO,KACxB,MAAM7kB,EAAQ+jB,EAAOq+D,WAAWv9D,EAAKp2B,WAAYjH,KAAKmhC,eAAehqB,OACrEnX,KAAKmQ,OAAO0H,KAAKW,GACjBxY,KAAKyJ,MAAQtF,KAAK4E,IAAIyP,EAAM+D,WAAYvc,KAAKyJ,OAOjDzJ,KAAKwY,MAAM+D,SAAW,IAAMvc,KAAKyJ,MAGrCwQ,SAASC,GACLzX,MAAMwX,SAASC,GACf,MAAMpB,EAAMoB,EAAM9E,aAGlB,GAFApV,KAAKqV,WAAWyD,GAEZA,EAAK,CACL9Y,KAAKyJ,MAAQ,EACb,IAAK,IAAI/B,EAAI,EAAGA,EAAI1H,KAAKmQ,OAAOrL,SAAU4C,EAAG,CACzC,MAAM8Q,EAAQxY,KAAKmQ,OAAOzI,GACpBzD,EAAO,GAAKuU,EAAMvU,KACG,MAAvBA,EAAK44B,gBACL/jB,EAAIlF,OACJkF,EAAIxD,QAAQtV,KAAKmhC,eAAenzB,MAChCwK,EAAM/O,MAAQqP,EAAIi2B,YAAY9qC,GAAMwF,MACpCqP,EAAItE,UACJgE,EAAM+D,SAAW,IAAM/D,EAAM/O,OAEjCzJ,KAAKyJ,MAAQtF,KAAK4E,IAAIyP,EAAM+D,WAAYvc,KAAKyJ,OAEjDzJ,KAAKwY,MAAM+D,SAAW,IAAMvc,KAAKyJ,MAIrC,MAAM4/B,EAAKrpC,KAAKu6F,UAAUhoF,KAAI,EAAG9K,IAAKvE,KAAWgX,EAAMuoB,YAAY/9B,OAAOxB,GAAQ,KAKlF,OAJAlD,KAAK24C,MAAMtP,GACPrpC,KAAKsgC,MACLtgC,KAAKsgC,KAAK0I,WAAWhpC,KAAK66F,WAAY76F,KAAK66F,YAExC76F,KAGX8lE,eACI,OAAO9lE,KAAKu6F,UAIhBlzD,mBAAmB5rB,EAAUrK,GACzB,IAAKpR,KAAK01C,aACN,MAAM,IAAIrzC,EAAa,kBAAmB,wDAE9C,GAAuB,IAAnBrC,KAAKqpC,GAAGvkC,OACR,MAAM,IAAIzC,EAAa,YAAa,yCAExC,IAAIQ,EAAI,EACR,GAAI4Y,IAAaF,EAASG,SAASC,KAC/B9Y,GAAI,OAEH,GAAI4Y,IAAaF,EAASG,SAASY,MACpCzZ,EAAI7C,KAAKyJ,MAAQ,OAEhB,GAAIgS,IAAaF,EAASG,SAASS,OAASV,IAAaF,EAASG,SAASO,MAAO,CAEnFpZ,EADyB7C,KAAKwY,MAAM+D,WACb,EAE3B,MAAO,CACH1Z,EAAG7C,KAAKi2C,eAAiBpzC,EACzBgF,EAAG7H,KAAKqpC,GAAGj4B,IAInB4nC,iBACI,OAAOt0C,OAAO1E,KAAKu6F,UAAU,GAAG9yF,KAGpCguC,YACQz1C,KAAK01C,eAEL11C,KAAKid,iBACLjd,KAAKid,gBAAgBw4B,YAEzBz1C,KAAK01C,cAAe,GAGxBzG,WACI,OAAOjvC,KAAK61D,kBAGhBglC,WACI,MAIMC,EAJY96F,KAAK+a,aAAa6yB,cAIH,GAC3BmtD,EAAgBvzD,EAAKe,KAAOvoC,KAAKkoC,gBAFnB,GAEiD4yD,EACrE,OAAO96F,KAAK+a,aAAa0nB,YAAYs4D,GAGzClrD,iBACI,OAAO7vC,KAAKqvC,YAAYlG,aAG5BgzB,WACI,MAAM,KAAE5iB,EAAI,MAAE/gC,EAAK,eAAE0vB,EAAgB/G,gBAAgB,UAAEsM,EAAS,iBAAEwJ,IAAwBj3C,KACpF2T,EAAU3T,KAAK0U,eACfulD,EAAyBn3D,MAARy2C,GAAqB9L,EAE5C,GAAIj1B,EAAMgoB,MAAQy5B,EAAgB,CAC9B,MAAM+gC,EAASh7F,KAAKivC,WAAa,EAC3BgsD,EAASj7F,KAAK66F,WAAa76F,KAAKqvC,YAAYpG,YAC5CiyD,EAAYhzD,IAAmBV,EAAKgB,KACpChwB,EAAMuoB,mBACNvoB,EAAMsoB,iBAEZhqB,EAAMu8C,YAAY1/C,EAASqnF,EAAQC,EAAQhkD,EAAkBikD,EAAW,CAAEh6F,SAAU,kBAI5F86D,gBACIh8D,KAAKmzC,UAAUj1B,SAASwoB,I3EvQFzlC,E2EyQRylC,E3EzQwBjlC,EAASwlD,O2EyQnBjnD,KAAKmhC,eAAes5D,YAG5C/zD,EAASrxB,WAAWrV,KAAKoV,cACzBsxB,EAASjyB,oBAIjB0mF,kBACI,MAAMn+B,EAAQh9D,KAAKivC,WACb8jD,EAAQ/yF,KAAK66F,WACb/hF,EAAM9Y,KAAK0U,eACXshD,EAAWh2D,KAAKmhC,eAAesM,UAC/B2tD,EAAcp7F,KAAKmhC,eAAeu5D,wBACxC,GAAI1kC,GAAYolC,EAAa,CACzB,MAGMC,EArRlB,SAA6BnxD,EAAQoxD,EAAgBphF,EAAOguB,GACxD,MAAMqzD,EAA6B,IAAnBrzD,EACVszD,GAAgC,IAApBtzD,EACZuzD,EAAevhF,EAAMsoB,yBACrBk5D,EAAcxhF,EAAM0zB,cACpB+tD,EAAa,GA2CnB,OA1CAL,EAAep9E,SAAS09E,IACpB,MAAMC,EAAqBD,EAAQp1D,QAAQk1D,IAAgB,EACrDI,EAAsBF,EAAQp1D,QAAQ,IAAM,EAClD,GAAK+0D,GAAWO,GAAyBN,GAAaK,EAClD,OAKmB,IAAnBD,EAAQ92F,QACR82F,EAAQ/jF,KAAK+jF,EAAQ,IAEzB,MAAMG,EAAU,GAEhBH,EAAQ19E,SAAQ,CAAC2nD,EAAQz0D,EAAOwqF,KAC5B,MAAMI,EAAwB,IAAXn2B,EACbo2B,EAAgBp2B,IAAW61B,EAGjC,IAAI7zF,EAAIqS,EAAMuoB,YAAYojC,EAAS,GAGrB,IAAVz0D,GAAgB4qF,EAGX5qF,IAAUwqF,EAAQ92F,OAAS,GAAMm3F,IACtCp0F,GAAK4zF,EAAe,EAAI,GAHxB5zF,GAAK4zF,EAAe,EAAI,EAM5BM,EAAQlkF,KAAKhQ,GAGU,IAAnBqgC,GAAwB8zD,EACxBD,EAAQlkF,KAAKqyB,EAAS,IAEG,IAApBhC,GAAyB+zD,GAC9BF,EAAQlkF,KAAKqyB,EAAS,MAI9ByxD,EAAW9jF,KAAKkkF,EAAQn5D,MAAK,CAACj/B,EAAGC,IAAMD,EAAIC,QAExC+3F,EAqOmBO,CAAoBnJ,EA9SlD,SAA+B1iB,EAAW8rB,GACtC,MAAMC,EAAe,GACrB,IAAIptC,EAAQ,GACZ,IAAK,IAAI6W,EAAS,EAAGA,GAAUwK,EAAWxK,IACtBs2B,EAAa31D,QAAQq/B,IAAW,GAK5Cu2B,EAAavkF,KAAKm3C,GAClBA,EAAQ,IAJRA,EAAMn3C,KAAKguD,GASnB,OAFI7W,EAAMlqD,OAAS,GACfs3F,EAAavkF,KAAKm3C,GACfotC,EA8RuBC,CAFLr8F,KAAK+a,aAAa6yB,cACf5tC,KAAKu6F,UAAUhoF,KAAKkJ,GAAa/W,OAAO+W,EAAShU,QAETzH,KAAK+a,aAAc/a,KAAKutC,oBACpFz0B,EAAIlF,OACJkF,EAAIxE,aAAakzB,EAAKiB,OACtB4yD,EAAUn9E,SAAS6yD,IACO,IAAlBA,EAAOjsE,SAEXgU,EAAIQ,YACJR,EAAIS,OAAOyjD,EAAO+T,EAAO,IACzBj4D,EAAIU,OAAOwjD,EAAO+T,EAAOA,EAAOjsE,OAAS,IACzCgU,EAAIikB,SACJjkB,EAAIi/B,gBAERj/B,EAAItE,WAIZ8nF,gBACI,MAAMxjF,EAAM9Y,KAAK0U,eACX7R,EAAI7C,KAAKi2C,eACT5M,EAAKrpC,KAAKqpC,GAChB,IAAK,IAAI3hC,EAAI,EAAGA,EAAI1H,KAAKu6F,UAAUz1F,SAAU4C,EAAG,CAC5C,MAAMG,EAAIwhC,EAAG3hC,GAAK1H,KAAKmhC,eAAe9pB,QAChCmB,EAAQxY,KAAKmQ,OAAOzI,GAGpB60F,EAAQ15F,EADW7C,KAAKwY,MAAM+D,WACC,EAAI/D,EAAM+D,WAAa,EAG5D,GADAzD,EAAI4kD,UAAU6+B,EAAQ,EAAG10F,EAAI,EAAG2Q,EAAM+D,WAAa,EAAG,GAClD/D,EAAMjW,KACNuU,EAAMu8C,YAAYv6C,EAAKyjF,EAAO10F,EAAG7H,KAAKmhC,eAAe8V,iBAAmBj3C,KAAKmhC,eAAehqB,MAAOqB,EAAMjW,UAExG,CACDuW,EAAIlF,OACJkF,EAAIxD,QAAQtV,KAAKmhC,eAAenzB,MAChC,MAAM/J,EAAOuU,EAAMvU,KAAKgD,WACxB6R,EAAIg3B,SAAS7rC,EAAMs4F,EAAO10F,EAAI,EAAI7H,KAAKmhC,eAAehqB,OACtD2B,EAAItE,YAKhBG,OACI,MAAMmE,EAAM9Y,KAAK0U,eACjB,GAAuB,IAAnB1U,KAAKqpC,GAAGvkC,OACR,MAAM,IAAIzC,EAAa,YAAa,qCAExCrC,KAAKgV,cACL,MAAMwnF,EAA2B15F,MAAb9C,KAAKu5C,MAAqBv5C,KAAKmhC,eAAesM,UAIlE,GAHA30B,EAAI+1B,UAAU,eAAW/rC,EAAW,CAAE05D,aAAa,IACnDx8D,KAAKs8F,gBACLt8F,KAAKm7F,kBACDn7F,KAAKsgC,MAAQk8D,EAAa,CAC1B,MAAMvyD,EAASjqC,KAAKivC,WACpBjvC,KAAKsgC,KAAKqI,mBAAmBsB,EAAQA,GACrCnxB,EAAI+1B,UAAU,YAAQ/rC,EAAW,CAAE05D,aAAa,IAChDx8D,KAAKsgC,KAAKjrB,WAAWyD,GAAKnE,OAC1BmE,EAAIi3B,aAER/vC,KAAKm8D,WACLn8D,KAAKg8D,gBACLljD,EAAIi3B,cC5XL,MAAM0sD,WAAiBzsB,GACf1uE,sBACP,OAAOG,EAASg7F,SAEpBp7F,YAAYwB,EAAGgF,EAAG4B,EAAOyO,GAErBzV,MAAMI,EAAGgF,EAAG4B,EADQpJ,OAAO0V,OAAO,CAAE06D,yBAA0B,GAAIJ,UAAW,EAAGO,kBAAmB,GAAK14D,IAG5G+C,gBACI,OAAOjb,KAAKyiC,YAAY,KAG5Bi6D,cAEI,OADA18F,KAAKwyE,QAAQ,OACNxyE,MCHf,SAAS,MAAKiD,GACN05F,GAAYz7D,OACZn+B,EAAI,uBAAwBE,GAE7B,IAAI25F,IACX,SAAWA,GACPA,EAAoBA,EAAyB,IAAI,GAAK,MACtDA,EAAoBA,EAA4B,QAAK,GAAK,SAF9D,CAGGA,KAAwBA,GAAsB,KAC1C,MAAMD,WAAoB5pF,EAC7B1R,aAAY,MAAE+lC,EAAK,KAAEy1D,EAAI,KAAE54F,EAAO,GAAE,YAAEyoE,EAAc,GAAE,SAAEjxD,EAAWmhF,GAAoB7vD,MACnFtqC,QACAzC,KAAKonC,MAAQA,EACbpnC,KAAK68F,KAAOA,EACZ78F,KAAKiE,KAAOA,EACZjE,KAAK0sE,YAAcA,EACnB1sE,KAAKyb,SAA+B,iBAAbA,EAAwBkhF,GAAY9gF,eAAeJ,GAAYA,EACtFzb,KAAKkD,KAAO,EACZlD,KAAKkW,YACLlW,KAAKmhC,eAAiB,CAClBojC,QAAQ,EACRnG,KAAM,CAAC,GACPxmB,MAAO,QACPyG,WAAY,EACZy+C,cAAc,EACdnH,eAAgB,EAGhBoH,uBAAuB,GAGpBz7F,sBACP,OAAOG,EAASk7F,YAETjhF,sBACP,OAAOkhF,GAEA/gF,4BACP,MAAO,CACHs0B,IAAKysD,GAAoB7vD,IACzBqD,OAAQwsD,GAAoB1uD,QAMzB8uD,uBAEP,OADA,GAAE,6DACKJ,GAKAK,6BAEP,OADA,GAAE,8DACKN,GAAY9gF,eAOvBnI,WAAWoF,GACPA,EAAIxD,QAAQtV,KAAKgO,MACjB,MAAMkK,EAAUlY,KAAKmhC,eAIrB,OAHAroB,EAAI1E,eAAe8D,EAAQ0/B,OAC3B9+B,EAAI5E,aAAagE,EAAQ0/B,OACzB9+B,EAAIxE,aAAa4D,EAAQmmC,YAClBr+C,KAIXilE,UAAUV,EAAQnG,GAId,OAHAp+D,KAAKmhC,eAAeojC,OAASA,EACzBnG,IACAp+D,KAAKmhC,eAAei9B,KAAOA,GACxBp+D,KAGXg0D,QAAQ9wD,GAEJ,OADAlD,KAAKkD,KAAOA,EACLlD,KAGX2U,OACI,MAAMmE,EAAM9Y,KAAK0U,eACjB1U,KAAKgV,cACL,IAAInN,EAAI,EACR,OAAQ7H,KAAKyb,UACT,KAAKmhF,GAAoB7vD,IACrBllC,EAAI7H,KAAKonC,MAAMrsB,aAAa00B,eAAezvC,KAAKkD,MAChD,MACJ,KAAK05F,GAAoB1uD,OACrBrmC,EAAI7H,KAAKonC,MAAMrsB,aAAa20B,kBAAkB1vC,KAAKkD,KAAOq5B,EAAOwC,yBACjE,MACJ,QACI,MAAM,IAAI18B,EAAa,kBAAmB,gBAAgBrC,KAAKyb,wBAGvE,MAAM2rB,EAAQ,CAAEvkC,EAAG7C,KAAKonC,MAAM6O,eAAgBpuC,EAAAA,GACxCg1F,EAAO,CAAEh6F,EAAG7C,KAAK68F,KAAK5mD,eAAgBpuC,EAAAA,GAC5C,GAAE,gCAAiCu/B,EAAO,QAASy1D,EAAM,KAAMh1F,GAC/D,MAAM8tF,EAAiB31F,KAAKmhC,eAAew0D,eAAiB31F,KAAKyb,SACjE3C,EAAIlF,OACJ5T,KAAK0T,WAAWoF,GAEhBA,EAAIg3B,SAAS9vC,KAAKiE,KAAMmjC,EAAMvkC,EAAGukC,EAAMv/B,GAEvC,MAAMq1F,EAAepkF,EAAIi2B,YAAY/uC,KAAKiE,MACpCk5F,EAAaD,EAAazzF,MAC1B2zF,EAAcF,EAAaxzF,OAE3B2zF,EAAUj2D,EAAMv/B,EAAIu1F,EAAc,KAGlC,OAAE1vF,EAAM,KAAEJ,EAAI,OAAEC,EAAM,MAAEC,GAAUxN,KAAKwV,SAEvC2wC,EAAkBz5C,EAAKq1C,UAAUz0C,EAAM,SAC7CwL,EAAIxD,QAAQ5H,EAAQy4C,EAAiB54C,EAAQC,GAC7CsL,EAAIg3B,SAAS9vC,KAAK0sE,YAAatlC,EAAMvkC,EAAIs6F,EAAa,EAAGE,GAEzD,MAAMC,EAAgBxkF,EAAIi2B,YAAY/uC,KAAK0sE,aACrC6wB,EAAcD,EAAc7zF,MAC5B+zF,EAAeF,EAAc5zF,OAEnC,IAAIqlE,EAAU3nC,EAAMvkC,EAChB46F,EAASJ,EACb,MAAMptB,EAAQ4sB,EAAKh6F,EAAI7C,KAAK68F,KAAK5jD,WAAW18B,WAExCvc,KAAKyb,WAAamhF,GAAoB7vD,KACtCgiC,GAAWouB,EAAaI,EAAc,EACtCE,GAAUD,EAAe,KAEpBx9F,KAAKyb,WAAamhF,GAAoB1uD,SAC3CuvD,GAAUD,EAAe,IACzBzuB,GAAWouB,EAAa,EACnBn9F,KAAKmhC,eAAe47D,wBACrBhuB,GAAWwuB,IAGfv9F,KAAKmhC,eAAeojC,QAEpB/B,GAASgD,eAAe1sD,EAAKi2D,EAAS0uB,EAAQxtB,EAAOwtB,EAAQz9F,KAAKmhC,eAAei9B,MAE7Ep+D,KAAKmhC,eAAe27D,cACpBt6B,GAASgD,eAAe1sD,EAAKm3D,EAAOwtB,EAAS,EAAIz9F,KAAKyb,SAAUw0D,EAAOwtB,EAAS9H,EAAgB31F,KAAKmhC,eAAei9B,QAIxHtlD,EAAIQ,YACJR,EAAIS,OAAOw1D,EAAS0uB,GAEpB3kF,EAAIU,OAAOy2D,EAAOwtB,GACdz9F,KAAKmhC,eAAe27D,cAEpBhkF,EAAIU,OAAOy2D,EAAOwtB,EAAS9H,GAE/B78E,EAAIikB,SACJjkB,EAAIi/B,aAERj/B,EAAItE,WCvKZ,SAAS,MAAKvR,GACNy6F,GAAax8D,OACbn+B,EAAI,wBAAyBE,GDwKrC05F,GAAYz7D,OAAQ,EACpBy7D,GAAYjnF,UAAY,CACpBhI,OAAQhB,EAAK8D,MACblD,KAAM,GACNC,OAAQjC,EAAWsC,OACnBJ,MAAOjC,EAAUoD,QCpKd,MAAM+uF,WAAqB57F,GAU9BT,YAAY60C,GACRzzC,MAAMyzC,GACNl2C,KAAK29F,UAAYznD,EAAWjyC,MAAQ,IAAIoJ,cACxCrN,KAAKkD,KAAOgzC,EAAWhzC,MAAQ,EAC/BlD,KAAKmQ,OAAS,GACdnQ,KAAKmhC,eAAiB9gC,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI/V,KAAKmhC,gBAAiB,CAAEy8D,gBAAiB,KAC/F,GAAE,sBAAuB59F,KAAK29F,UAEvBr8F,sBACP,OAAOG,EAASi8F,aAGT3wB,oBACP,MAAO,CACHxlE,EAAG,CACChF,KAAM,eACNkH,MAAO,IAEX0jE,EAAG,CACC5qE,KAAM,eACNkH,MAAO,IAEXmY,EAAG,CACCrf,KAAM,eACNkH,MAAO,IAEXpC,EAAG,CACC9E,KAAM,mBACNkH,MAAO,IAEX2jE,EAAG,CACC7qE,KAAM,WACNkH,MAAO,IAEXy2B,EAAG,CACC39B,KAAM,qBACNkH,MAAO,KAKnBuqD,QAAQ9wD,GAEJ,OADAlD,KAAKkD,KAAOA,EACLlD,KAGXy1C,YACI,IAAIooD,EAAc,EAoBlB,OAhBA79F,KAAKmQ,OAAS,GAEdnQ,KAAK29F,SAASh2F,MAAM,IAAIuW,SAAS4/E,IAE7B,MAAMvI,EAAamI,GAAa3wB,OAAO+wB,GACvC,IAAKvI,EACD,MAAM,IAAIlzF,EAAa,+BAAiCy7F,GAC5D,MAAMxwF,EAAO1K,EAAQ5C,KAAKmhC,eAAey8D,iBACnCplF,EAAQ,IAAI1B,EAAMy+E,EAAWhzF,KAAM+K,EAAM,CAAEpM,SAAU,aAE3DlB,KAAKmQ,OAAO0H,KAAKW,GACjBqlF,GAAetI,EAAW9rF,SAG9BzJ,KAAKwc,SAASqhF,GACd79F,KAAK01C,cAAe,EACb11C,KAGX2U,OACI3U,KAAKgV,cACL,MAAMnS,EAAI7C,KAAKi2C,eACTpuC,EAAI7H,KAAK+a,aAAa0nB,YAAYziC,KAAKkD,MAAQ,GACrD,GAAE,uBAAwBlD,KAAK29F,UAC/B,IAAII,EAAWl7F,EACf7C,KAAKmQ,OAAO+N,SAAQ,CAAC1F,EAAOpH,KACxB,MAAM4sF,EAAiBh+F,KAAK29F,SAASvsF,GACrCoH,EAAMoC,OAAO5a,KAAK0U,eAAgBqpF,EAAUl2F,GAC5Ck2F,GAAYL,GAAa3wB,OAAOixB,GAAgBv0F,UAK5Di0F,GAAax8D,OAAQ,EC3Gd,MAAM+8D,WAAoBn8F,GAC7BT,YAAY8tE,EAAUC,GAClB3sE,MAAM,CAAEs7B,SAAU,MAClB,MAAMswC,EAAgB,IAAIa,GAAcC,EAAUC,GAClDpvE,KAAKk+F,YAAc7vB,EAAcuB,UACjC5vE,KAAKwc,SAASxc,KAAKk+F,YAAY1lF,MAAM1I,aAAarG,OAElDzJ,KAAKuzC,cAAe,EAEbjyC,sBACP,OAAOG,EAASw8F,YAIpB7oD,qBAAqBC,GAEjB,OAAOr1C,KAEXy1C,YAEI,OADAz1C,KAAK01C,cAAe,EACb11C,KAEX2U,OACI,MAAMuF,EAAQla,KAAK+a,aACbjC,EAAM9Y,KAAK0U,eACjB1U,KAAKgV,cACAhV,KAAKk+F,YAAY1lF,MAAMpD,cACxBpV,KAAKk+F,YAAY1lF,MAAMnD,WAAWyD,GAEtC9Y,KAAKk+F,YAAY1lF,MAAMyB,SAASC,GAChCla,KAAKk+F,YAAY1lF,MAAM4B,UAAUF,EAAMuoB,YAAY,GAAKvoB,EAAMe,iBAC9Djb,KAAKk+F,YAAY1lF,MAAMwC,cAAchb,KAAKi2C,iBCvB3C,MAAMkoD,WAAuBprF,EAMhC1R,YAAY+8F,GACR37F,QACI27F,EAAah3D,QACbpnC,KAAKonC,MAAQg3D,EAAah3D,OAC1Bg3D,EAAavB,OACb78F,KAAK68F,KAAOuB,EAAavB,MAC7B78F,KAAKkD,KAAO,EACZlD,KAAKmhC,eAAiB,CAClB8lC,OAAO,EACPE,YAAa,EACbC,WAAY,EACZC,WAAY,EACZH,cAAe,GAGZ5lE,sBACP,OAAOG,EAAS08F,eAGpBnqC,QAAQ9wD,GAEJ,OADAlD,KAAKkD,KAAOA,EACLlD,KAGXynE,SAASR,GAEL,OADAjnE,KAAKmhC,eAAe8lC,MAAQA,EACrBjnE,KAGX2U,OACI,MAAMmE,EAAM9Y,KAAK0U,eACjB1U,KAAKgV,cACL,MAAMnN,EAAK7H,KAAKonC,OAASpnC,KAAKonC,MAAMrsB,aAAa00B,eAAezvC,KAAKkD,OAChElD,KAAK68F,MAAQ78F,KAAK68F,KAAK9hF,aAAa00B,eAAezvC,KAAKkD,OACzD,EAGE6rE,EAAW/uE,KAAKonC,OAASpnC,KAAKonC,MAAM6O,gBAAoBj2C,KAAK68F,MAAQ78F,KAAK68F,KAAK9hF,aAAamwC,gBAAmB,EAG/GmzC,EAAUr+F,KAAK68F,MAAQ78F,KAAK68F,KAAK5mD,eAAiBj2C,KAAK68F,KAAKtgF,WAAa,GAC1Evc,KAAKonC,OAASpnC,KAAKonC,MAAMrsB,aAAaowC,aAAe,IACtD,EACJnrD,KAAKmhC,eAAe+lC,cAAgBm3B,EAAStvB,EAtDrD,YAAc9rE,GACNk7F,GAAej9D,OACfn+B,EAAI,0BAA2BE,GAqD/B,CAAE,qCAAsC8rE,EAAS,UAAWsvB,EAAQ,KAAMx2F,GAC1Em/D,GAAQY,cAAc9uD,EAAKi2D,EAASlnE,EAAG7H,KAAKmhC,iBClBpD,SAAS,MAAKl+B,GACNq7F,GAAQp9D,OACRn+B,EAAI,mBAAoBE,GDoBhCk7F,GAAej9D,OAAQ,ECfhB,MAAMo9D,GAQTj9F,YAAY6W,EAAU,IAClB,GAAE,gBAAiBA,GACnBlY,KAAKkY,QAAU,CACXgC,MAAO,CACHy5B,MAAO,IAEXyvB,SAAU,CACNF,UAAW,GACXz5D,MAAO,IACPC,OAAQ,IACRy5D,WAAY,QAEhBn1D,KAAMswF,GAAQ5oF,WAElB1V,KAAKsY,WAAWJ,GAWpBzT,wBAAwBy+D,EAAWz5D,EAAQ,IAAKC,EAAS,KACrD,OAAO,IAAI40F,GAAQ,CAAEl7B,SAAU,CAAEF,UAAAA,EAAWz5D,MAAAA,EAAOC,OAAAA,KAEvD6O,QACIvY,KAAKu+F,QAAU,GACfv+F,KAAKw+F,QAAU,GACfx+F,KAAKy+F,OAAS,GACdz+F,KAAKklC,OAAS,GACdllC,KAAKka,WAAQpX,EAEjBwV,WAAWJ,GACPlY,KAAKkY,QAAU7X,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI/V,KAAKkY,SAAUA,GAC9DlY,KAAK0+F,eACL1+F,KAAKuY,QAETmmF,eACI,MAAM,UAAEx7B,EAAS,MAAEz5D,EAAK,OAAEC,EAAM,WAAEy5D,GAAenjE,KAAKkY,QAAQkrD,SAC9D,GAAiB,MAAbF,EACA,OAEJ,GAAiB,IAAbA,EAEA,MADA,GAAEljE,MACI,IAAIqC,EAAa,gDAE3B,IAAIsgE,EAAU3iE,KAAKkY,QAAQkrD,SAAST,QACpC,QAAgB7/D,IAAZ6/D,EAAuB,CAOnBA,EADA1F,GALSnvD,SAAS8D,eAAesxD,IAMvBV,GAASK,SAASC,OAGlBN,GAASK,SAASE,IAGpC/iE,KAAK2T,QAAU6uD,GAASc,aAAaJ,EAAWP,EAASl5D,EAAOC,EAAQy5D,GAE5E/tD,aACI,OAAOpV,KAAK2T,QAEhB0B,WAAW1B,GAEP,OADA3T,KAAK2T,QAAUA,EACR3T,KAEX8d,WACI,OAAO9d,KAAKka,MAEhBykF,YACI,OAAO3+F,KAAKklC,OAGhB8qC,MAAMtzC,GACF,MAAM+3B,EAAaz0D,KAAKkY,QAAQgC,MAAMy5B,MAChCw5B,EAAI9sE,OAAO0V,OAAO,CAAElT,EAAG,EAAGgF,EAAG,EAAG4B,MAAOzJ,KAAKkY,QAAQkrD,SAAS35D,MAAqB,EAAbgrD,EAAkBv8C,QAAS,CAAEu4D,yBAAuC,EAAbhc,IAAsB/3B,GAClJxiB,EAAQ,IAAI81D,GAAM7C,EAAEtqE,EAAGsqE,EAAEtlE,EAAGslE,EAAE1jE,MAAO0jE,EAAEj1D,SAI7C,OAHAlY,KAAKy+F,OAAO5mF,KAAKqC,GACjBA,EAAM7E,WAAWrV,KAAK2T,SACtB3T,KAAKka,MAAQA,EACNA,EAEXuiF,SAAS//D,GACL,MAAM+3B,EAAaz0D,KAAKkY,QAAQgC,MAAMy5B,MAChCw5B,EAAI9sE,OAAO0V,OAAO,CAAElT,EAAG,EAAGgF,EAAG,EAAG4B,MAAOzJ,KAAKkY,QAAQkrD,SAAS35D,MAAqB,EAAbgrD,EAAkBv8C,QAAS,CAAEu4D,yBAAuC,IAAbhc,IAAsB/3B,GAClJxiB,EAAQ,IAAIuiF,GAAStvB,EAAEtqE,EAAGsqE,EAAEtlE,EAAGslE,EAAE1jE,MAAO0jE,EAAEj1D,SAIhD,OAHAlY,KAAKy+F,OAAO5mF,KAAKqC,GACjBA,EAAM7E,WAAWrV,KAAK2T,SACtB3T,KAAKka,MAAQA,EACNA,EAEXlY,UAAUk0C,GACN,MAAMx5B,EAAO,IAAI1a,GAAUk0C,GAK3B,OAJIl2C,KAAKka,OACLwC,EAAKzC,SAASja,KAAKka,OACvBwC,EAAKrH,WAAWrV,KAAK2T,SACrB3T,KAAKu+F,QAAQ1mF,KAAK6E,GACXA,EAEX00E,UAAU54E,EAAO09B,EAAYh+B,GACzB,MAAMwE,EAAO,IAAI00E,GAAU54E,EAAO09B,EAAYh+B,GAK9C,OAJIlY,KAAKka,OACLwC,EAAKzC,SAASja,KAAKka,OACvBwC,EAAKrH,WAAWrV,KAAK2T,SACrB3T,KAAKu+F,QAAQ1mF,KAAK6E,GACXA,EAEXm6E,WAAW5lF,EAAMilC,EAAYh+B,GACzB,MAAMwE,EAAO,IAAIm6E,GAAW5lF,EAAMilC,EAAYh+B,GAK9C,OAJIlY,KAAKka,OACLwC,EAAKzC,SAASja,KAAKka,OACvBwC,EAAKrH,WAAWrV,KAAK2T,SACrB3T,KAAKu+F,QAAQ1mF,KAAK6E,GACXA,EAEX+zE,UAAUv6C,GACN,MAAM0oD,EAAY,IAAInO,GAAUv6C,GAKhC,OAJIl2C,KAAKka,OACL0kF,EAAU3kF,SAASja,KAAKka,OAC5B0kF,EAAUvpF,WAAWrV,KAAK2T,SAC1B3T,KAAKu+F,QAAQ1mF,KAAK+mF,GACXA,EAEXnyB,SAASv2B,GACL,MAAM2oD,EAAW,IAAIpyB,GAASv2B,GAK9B,OAJIl2C,KAAKka,OACL2kF,EAAS5kF,SAASja,KAAKka,OAC3B2kF,EAASxpF,WAAWrV,KAAK2T,SACzB3T,KAAKu+F,QAAQ1mF,KAAKgnF,GACXA,EAEX9gD,QAAQrhB,EAAS,IACb,MAAMoiE,EAAU,IAAI/gD,GAAQrhB,EAAOzrB,MAKnC,OAJIjR,KAAKka,OACL4kF,EAAQ7kF,SAASja,KAAKka,OAC1B4kF,EAAQzpF,WAAWrV,KAAK2T,SACxB3T,KAAKu+F,QAAQ1mF,KAAKinF,GACXA,EAEXrW,SAAS/rD,GACL,MAAMywC,EAAI9sE,OAAO0V,OAAO,CAAE9E,KAAM,SAAUiH,QAAS,CAC3C5K,KAAM,UACN2/B,gBAAYnqC,IACX45B,GACHqiE,EAAW,IAAItW,GAAStb,EAAEl8D,KAAMk8D,EAAEj1D,QAAQ5K,KAAM6/D,EAAEj1D,QAAQ+0B,YAKhE,OAJIjtC,KAAKka,OACL6kF,EAAS9kF,SAASja,KAAKka,OAC3B6kF,EAAS1pF,WAAWrV,KAAK2T,SACzB3T,KAAKu+F,QAAQ1mF,KAAKknF,GACXA,EAEXd,YAAYvhE,GACR,MAAMywC,EAAI9sE,OAAO0V,OAAO,CAAEu1C,KAAM,OAAS5uB,GACnCsiE,EAAc,IAAIf,GAAY9wB,EAAE7hB,MAKtC,OAJItrD,KAAKka,OACL8kF,EAAY/kF,SAASja,KAAKka,OAC9B8kF,EAAY3pF,WAAWrV,KAAK2T,SAC5B3T,KAAKu+F,QAAQ1mF,KAAKmnF,GACXA,EAEXhM,WAAWt2D,GACP,MAAMuiE,EAAa,IAAIjM,GAAWt2D,EAAOv8B,IAAKu8B,EAAO4sC,UAAW5sC,EAAOutC,UAKvE,OAJIjqE,KAAKka,OACL+kF,EAAWhlF,SAASja,KAAKka,OAC7B+kF,EAAW5pF,WAAWrV,KAAK2T,SAC3B3T,KAAKu+F,QAAQ1mF,KAAKonF,GACXA,EAEX78F,QAAQ8zC,GACJ,MAAMx5B,EAAO,IAAIta,GAAQ8zC,GAKzB,OAJIl2C,KAAKka,OACLwC,EAAKzC,SAASja,KAAKka,OACvBwC,EAAKrH,WAAWrV,KAAK2T,SACrB3T,KAAKu+F,QAAQ1mF,KAAK6E,GACXA,EAEX9a,UAAUs0C,GACN,MAAMx5B,EAAO,IAAI9a,GAAUs0C,GAI3B,OAHIl2C,KAAKka,OACLwC,EAAKzC,SAASja,KAAKka,OACvBwC,EAAKrH,WAAWrV,KAAK2T,SACd+I,EAEXmqB,eAAenK,GACX,MAAMsyB,EAAQ,IAAInoB,GAAenK,EAAOmB,MAAOnB,EAAOixB,MAEtD,OADAqB,EAAM35C,WAAWrV,KAAK2T,SACfq7C,EAEX/tB,WAAWvE,GACP,MAAMu1B,EAAQ,IAAIhxB,EAAWvE,EAAOzrB,MAEpC,OADAghD,EAAM58C,WAAWrV,KAAK2T,SACfs+C,EAEXrlB,WAAWlQ,GACP,MAAMywC,EAAI9sE,OAAO0V,OAAO,CAAE9R,KAAM,IAAKi7F,SAAUxyD,GAA4B3wB,OAAQojF,SAAUxyD,GAA0BuB,QAAUxR,GAC3HuQ,EAAa,IAAIL,GAAWugC,EAAElpE,MAKpC,OAJAgpC,EAAWyB,iBAAiBy+B,EAAE+xB,UAC9BjyD,EAAWqB,yBAAyB6+B,EAAEgyB,UACtClyD,EAAW33B,QAAQ63D,EAAEn/D,MACrBi/B,EAAW53B,WAAWrV,KAAK2T,SACpBs5B,EAEXgT,YAAYvjB,GACR,MAAMywC,EAAI9sE,OAAO0V,OAAO,CAAEopF,SAAU,MAAOD,SAAU,SAAUE,SAAS,EAAM9+C,aAAa,GAAQ5jB,GAC7F0kB,EAAc,IAAInB,GAiBxB,OAhBAmB,EAAYsE,cAAcynB,EAAE+xB,UAC5B99C,EAAYoE,YAAY2nB,EAAEgyB,UAC1B/9C,EAAYgC,iBAAiB+pB,EAAEiyB,SAC/Bh+C,EAAYqC,eAAe0pB,EAAE7sB,aAGD,iBAAjB6sB,EAAEl/D,YAAiD,iBAAfk/D,EAAEtgE,SACjB,iBAAjBsgE,EAAEj/D,WACTkzC,EAAY9rC,QAAQ63D,EAAEl/D,WAAYk/D,EAAEtgE,SAAUsgE,EAAEj/D,YAEhDkzC,EAAY9rC,QAAQ63D,EAAEl/D,WAAYk/D,EAAEtgE,SAAU,IAEvB,iBAAfsgE,EAAEtgE,UACdu0C,EAAYjrC,YAAYg3D,EAAEtgE,UAE9Bu0C,EAAY/rC,WAAWrV,KAAK2T,SACrBytC,EAEXzQ,aAAajU,GACT,MAAMywC,EAAI9sE,OAAO0V,OAAO,CAAE9E,KAAM,KAAMwK,SAAU,SAAWihB,GACrDmU,EAAe,IAAIF,GAAaw8B,EAAEl8D,MAGxC,OAFA4/B,EAAaxzB,YAAY8vD,EAAE1xD,UAC3Bo1B,EAAax7B,WAAWrV,KAAK2T,SACtBk9B,EAEX6sD,aAAahhE,GACT,MAAMywC,EAAI9sE,OAAO0V,OAAO,CAAE9R,KAAM,IAAK85B,SAAU,IAAKoa,KAAM,EAAGj1C,KAAM,GAAKw5B,GAClEz4B,EAAO,IAAIy5F,GAAa,CAC1Bz5F,KAAMkpE,EAAElpE,KACRf,KAAMiqE,EAAEjqE,KACR66B,SAAUovC,EAAEpvC,SACZoa,KAAMg1B,EAAEh1B,OAMZ,OAJIn4C,KAAKka,OACLjW,EAAKgW,SAASja,KAAKka,OACvBjW,EAAKoR,WAAWrV,KAAK2T,SACrB3T,KAAKu+F,QAAQ1mF,KAAK5T,GACXA,EAEXqlD,UAAU5sB,GACN,MAAMywC,EAAI9sE,OAAO0V,OAAO,CAAEszC,OAAQ,IAAK5tC,SAAU,QAAUihB,GACrD6sB,EAAY,IAAIvB,GAAemlB,EAAE9jB,QAGvC,OAFAE,EAAUlsC,YAAY8vD,EAAE1xD,UACxB8tC,EAAUl0C,WAAWrV,KAAK2T,SACnB41C,EAEX8a,aAAa3nC,GACT,MAAM+nC,EAAe,IAAIJ,GAAa3nC,EAAO2sB,QAG7C,OAFAob,EAAapnD,YAAYqf,EAAOjhB,UAChCgpD,EAAapvD,WAAWrV,KAAK2T,SACtB8wD,EAEXxV,cACI,OAAO,IAAIA,GAEf8Y,kBACI,OAAO,IAAIA,GAEfmrB,iBAAiBx2D,GACb,MAAM2iE,EAAcz8F,EAAQ85B,EAAOy2D,mBAAoB,sBACjDmM,EAAmB,IAAIpM,GAAiBmM,EAAa3iE,GAG3D,OAFA4iE,EAAiBjqF,WAAWrV,KAAK2T,SACjC3T,KAAKu+F,QAAQ1mF,KAAKynF,GACXA,EAEXj0C,MAAM3uB,GACF,MAAMywC,EAAI9sE,OAAO0V,OAAO,CAAEu1C,KAAM,OAAS5uB,GACnC2I,EAAQ,IAAIgmB,GAAM8hB,EAAE7hB,KAAM6hB,EAAEj1D,SAElC,OADAlY,KAAKklC,OAAOrtB,KAAKwtB,GACVA,EAEXgvC,eAAe33C,GACX,MAAMg9D,EAAY,IAAIrlB,GAAe33C,EAAO+3C,UAAW/3C,EAAOg4C,cAG9D,OAFAglB,EAAUj9C,QAAQ/f,EAAOzrB,MAAMoE,WAAWrV,KAAK2T,SAC/C3T,KAAKu+F,QAAQ1mF,KAAK6hF,GACXA,EAEXtrC,UAAUl2C,GACN,OAAO,IAAIk2C,GAAUl2C,GAEzBqmE,OAAO7hD,GACH,MAAMywC,EAAI9sE,OAAO0V,OAAO,CAAE8nB,MAAO,GAAI3lB,QAAS,IAAMwkB,GAC9CgY,EAAS,IAAI6pC,GAAOpR,EAAEtvC,MAAOsvC,EAAEj1D,SAAS7C,WAAWrV,KAAK2T,SAE9D,OADA3T,KAAKu+F,QAAQ1mF,KAAK68B,GACXA,EAEX+Z,KAAK/xB,GACD,IAAI3vB,EAAIkF,EAAIyyC,EACZ,MAAMnL,EAAO,IAAIkV,GAAK/xB,EAAOmB,MAAiC,QAAzB9wB,EAAK2vB,EAAOxkB,eAA4B,IAAPnL,OAAgB,EAASA,EAAGgqD,UAAU1hD,WAAWrV,KAAK2T,SAG5H,OAFA4lC,EAAKurC,iBAA8G,QAA5FpgC,EAA+B,QAAzBzyC,EAAKyqB,EAAOxkB,eAA4B,IAAPjG,OAAgB,EAASA,EAAGstF,2BAAwC,IAAP76C,EAAgBA,EAAK,IAChJ1kD,KAAKu+F,QAAQ1mF,KAAK0hC,GACXA,EAEXmwC,MAAMhtD,GACF,MAAM8iE,EAAQ,IAAI9V,GAAMhtD,EAAOitD,KAAMjtD,EAAOktD,GAAIltD,EAAOxkB,SAAS7C,WAAWrV,KAAK2T,SAEhF,OADA3T,KAAKu+F,QAAQ1mF,KAAK2nF,GACXA,EAEX51C,SAASltB,GACL,IAAI3vB,EACJ,MAAM0yF,EAAM,IAAI71C,GAAS,CACrBQ,WAAY1tB,EAAOitD,KACnB/hC,UAAWlrB,EAAOktD,GAClBv/B,cAAe3tB,EAAO2tB,cACtBC,aAAc5tB,EAAO4tB,cACtB5tB,EAAOz4B,MAKV,OAJ8B,QAAzB8I,EAAK2vB,EAAOxkB,eAA4B,IAAPnL,OAAgB,EAASA,EAAGwX,YAC9Dk7E,EAAI72D,aAAalM,EAAOxkB,QAAQqM,WACpCk7E,EAAIpqF,WAAWrV,KAAK2T,SACpB3T,KAAKu+F,QAAQ1mF,KAAK4nF,GACXA,EAEX1I,UAAUr6D,GACN,IAAI3vB,EAAIkF,EACR,MAAM/O,EAAO,IAAI6zF,GAAU,CACvB3sC,WAAY1tB,EAAOitD,KACnB/hC,UAAWlrB,EAAOktD,GAClBv/B,cAAe3tB,EAAO2tB,cACtBC,aAAc5tB,EAAO4tB,eAQzB,OAN8B,QAAzBv9C,EAAK2vB,EAAOxkB,eAA4B,IAAPnL,OAAgB,EAASA,EAAG9I,OAC9Df,EAAK2qE,QAAQnxC,EAAOxkB,QAAQjU,OACF,QAAzBgO,EAAKyqB,EAAOxkB,eAA4B,IAAPjG,OAAgB,EAASA,EAAGjE,OAC9D9K,EAAKoS,QAAQonB,EAAOxkB,QAAQlK,MAChC9K,EAAKmS,WAAWrV,KAAK2T,SACrB3T,KAAKu+F,QAAQ1mF,KAAK3U,GACXA,EAEXi7F,eAAezhE,GACX,MAAMgjE,EAAiB,IAAIvB,GAAe,CACtC/2D,MAAO1K,EAAOitD,KACdkT,KAAMngE,EAAOktD,KAQjB,OANIltD,EAAOxkB,QAAQhV,MACfw8F,EAAe1rC,QAAQt3B,EAAOxkB,QAAQhV,MACtCw5B,EAAOxkB,QAAQ+uD,OACfy4B,EAAej4B,SAAS/qC,EAAOxkB,QAAQ+uD,OAC3Cy4B,EAAerqF,WAAWrV,KAAK2T,SAC/B3T,KAAKu+F,QAAQ1mF,KAAK6nF,GACXA,EAEX/C,YAAYjgE,GACR,MAAMijE,EAAc,IAAIhD,GAAY,CAChCv1D,MAAO1K,EAAOitD,KACdkT,KAAMngE,EAAOktD,GACb3lF,KAAMy4B,EAAOz4B,KACbyoE,YAAahwC,EAAOxkB,QAAQw0D,YAC5BjxD,SAAUihB,EAAOxkB,QAAQuD,WAQ7B,OANIihB,EAAOxkB,QAAQhV,MACfy8F,EAAY3rC,QAAQt3B,EAAOxkB,QAAQhV,MACnCw5B,EAAOxkB,QAAQlK,MACf2xF,EAAYrqF,QAAQonB,EAAOxkB,QAAQlK,MACvC2xF,EAAYtqF,WAAWrV,KAAK2T,SAC5B3T,KAAKu+F,QAAQ1mF,KAAK8nF,GACXA,EAEX3G,OAAOt8D,EAAS,IACZA,EAAOj9B,QAAUO,KACjB,MAAM4/F,EAAS,IAAI5G,GAAOt8D,GAAQrnB,WAAWrV,KAAK2T,SAElD,OADA3T,KAAKw+F,QAAQ3mF,KAAK+nF,GACXA,EAaX5S,UAAU90E,EAAU,IAEhB,OADAA,EAAQzY,QAAUO,KACX,IAAIgtF,GAAU90E,GAEzBs9E,aAAa94D,GACT,MAAMywC,EAAI9sE,OAAO0V,OAAO,CAAE8nB,MAAO,GAAI3lB,QAAS,CACtC1K,MAAO,UACNkvB,GACHo5D,EAAQ,IAAIN,GAAaroB,EAAEtvC,OAIjC,OAHAi4D,EAAMr5C,QAAQ+4C,GAAa94C,WAAWywB,EAAEj1D,QAAQ1K,QAChDsoF,EAAMzgF,WAAWrV,KAAK2T,SACtB3T,KAAKu+F,QAAQ1mF,KAAKi+E,GACXA,EAEXhnC,aAAapyB,GACT,MAAMywC,EAAI9sE,OAAO0V,OAAO,CAAE8nB,MAAO,IAAMnB,GACjCsyB,EAAQ,IAAIF,GAAaqe,EAAEtvC,OAEjC,OADAmxB,EAAM35C,WAAWrV,KAAK2T,SACfq7C,EAGXr6C,OACI,MAAMmE,EAAM9Y,KAAK2T,QACjB3T,KAAKw+F,QAAQtgF,SAAS7W,GAAMA,EAAEgO,WAAWyD,GAAKw1C,WAC9CtuD,KAAKy+F,OAAOvgF,SAAS7W,GAAMA,EAAEgO,WAAWyD,GAAKnE,SAC7C3U,KAAKklC,OAAOhnB,SAASmvC,GAAMA,EAAEh4C,WAAWyD,GAAKnE,SAC7C3U,KAAKu+F,QAAQrgF,SAASvd,IACbA,EAAEoU,cACHpU,EAAE0U,WAAWyD,GAAKnE,UAE1B3U,KAAKw+F,QAAQtgF,SAAS7W,GAAMA,EAAEgO,WAAWyD,GAAKnE,SAC9C3U,KAAKuY,SAIb+lF,GAAQp9D,OAAQ,EAEhBo9D,GAAQ5oF,UAAYrV,OAAO0V,OAAO,GAAIhD,EAAQ2C,WCxdvC,MAAMmqF,WAAqB9sF,EAa9B1R,YAAYw8B,EAAO5sB,GACfxO,QACAzC,KAAK6pD,SAAShsB,GACd79B,KAAK8/F,QAAU7uF,EACfjR,KAAKyb,SAAWF,EAASG,SAASS,MAClCnc,KAAKmhC,eAAiB,CAClBz3B,OAAQ,GACR2N,QAAS,EACT0oF,cAAe,EACfC,eAAgB,EAChBC,kBAAmB,EACnBC,iBAAkB,GAGf5+F,sBACP,OAAOG,EAASo+F,aAgBpBp7F,4BAA4BqU,EAAKyyB,EAAW1N,EAAO5sB,EAAMwK,EAAUvD,GAC/D,IAAInL,EAAIkF,EACR,MAAMkuF,EAAM50D,EAAU60D,cACtB,GAAW,MAAPD,EACA,MAAM,IAAI99F,EAAa,eAAgB,+DAE3C,MAAMg+F,EAAaF,GAA2C,QAAnCpzF,EAAKmL,EAAQgoF,wBAAqC,IAAPnzF,EAAgBA,EAAK,GACrFuzF,EAAaH,GAA4C,QAApCluF,EAAKiG,EAAQ+nF,yBAAsC,IAAPhuF,EAAgBA,EAAK,GACtFsuF,EAAkB,CACpB72F,OAAQwO,EAAQxO,OAChB2N,QAASa,EAAQb,QACjB0oF,cAAeM,EACfL,eAAgBM,EAChBL,kBAAmB,EACnBC,iBAAkB,GAEtB,IAAIL,GAAa,CACbz1C,WAAYvsB,EAAMusB,WAClBxC,UAAW/pB,EAAM+pB,WAClB32C,GACEoE,WAAWyD,GACX0nF,iBAAiBD,GACjBljF,YAAY5B,GACZ9G,OAET0I,YAAY5B,GAIR,OAHIA,IAAaF,EAASG,SAASO,OAASR,IAAaF,EAASG,SAASS,QACvEnc,KAAKyb,SAAWA,GAEbzb,KAEXwgG,iBAAiBtoF,GAOb,OANsB,MAAlBA,EAAQxO,QACW,MAAnBwO,EAAQb,SACiB,MAAzBa,EAAQ6nF,eACkB,MAA1B7nF,EAAQ8nF,iBACRhgG,KAAKmhC,eAAiBjpB,GAEnBlY,KAOX6pD,SAAShsB,GACL,IAAKA,EAAMusB,aAAevsB,EAAM+pB,UAC5B,MAAM,IAAIvlD,EAAa,eAAgB,6DAK3C,OAHArC,KAAK69B,MAAQA,EACb79B,KAAKoqD,WAAavsB,EAAMusB,WACxBpqD,KAAK4nD,UAAY/pB,EAAM+pB,UAChB5nD,KAEXwpF,cAAc9sD,GACV,MAAM5jB,EAAM9Y,KAAK0U,eACjB,IAAI+rF,EAAMzgG,KAAKmhC,eAAe9pB,QAAU,GACpCA,EAAUqlB,EAAO4tD,QACjBtqF,KAAKyb,WAAaF,EAASG,SAASO,QACpCwkF,EAAa,GAANA,EACPppF,EAAUqlB,EAAO4tD,QAAU5tD,EAAOgkE,cAEtC,MAAMC,EAAU3gG,KAAKmhC,eAAe4+D,cAC9Ba,EAAU5gG,KAAKmhC,eAAe6+D,eAEpC,OADAlnF,EAAIQ,YACItZ,KAAK8/F,SACT,KAAKD,GAAa5uF,KAAK4vF,MACnB/nF,EAAIS,OAAOmjB,EAAO6tD,OAASqW,EAASvpF,EAAUopF,GAC9C3nF,EAAIU,OAAOkjB,EAAO2tD,QAAUsW,EAAStpF,EAAUrX,KAAKmhC,eAAez3B,OAAS,EAAI+2F,GAChF3nF,EAAIU,OAAOkjB,EAAO6tD,OAASqW,EAASvpF,EAAUrX,KAAKmhC,eAAez3B,OAAS+2F,GAC3E,MACJ,KAAKZ,GAAa5uF,KAAK6vF,QACnBhoF,EAAIS,OAAOmjB,EAAO2tD,QAAUsW,EAAStpF,EAAUopF,GAC/C3nF,EAAIU,OAAOkjB,EAAO6tD,OAASqW,EAASvpF,EAAUrX,KAAKmhC,eAAez3B,OAAS,EAAI+2F,GAC/E3nF,EAAIU,OAAOkjB,EAAO2tD,QAAUsW,EAAStpF,EAAUrX,KAAKmhC,eAAez3B,OAAS+2F,GAMpF3nF,EAAIikB,SACJjkB,EAAIi/B,YAERpjC,OACI3U,KAAK0U,eACL1U,KAAKgV,cACL,MAAMkwE,EAAYllF,KAAKoqD,WACjBpB,EAAWhpD,KAAK4nD,UACtB,IAAKs9B,IAAcl8B,EACf,MAAM,IAAI3mD,EAAa,SAAU,0BACrC,MAAM+kC,EAAQ89C,EAAU79C,mBAAmBrnC,KAAKyb,SAAU,GACpDohC,EAAMmM,EAAS3hB,mBAAmBrnC,KAAKyb,SAAU,GACvDzb,KAAKwpF,cAAc,CACfa,QAASjjD,EAAMvkC,EACf0nF,OAAQ1tC,EAAIh6C,EACZynF,QAASpF,EAAUnqE,aAAa7S,OAASg9E,EAAUnqE,aAAakuB,YAChEuhD,OAAQxhC,EAASjuC,aAAa7S,OAAS8gD,EAASjuC,aAAakuB,YAC7Dy3D,aAAcxb,EAAUnqE,aAAakuB,eAIjD42D,GAAa5uF,KAAO,CAChB4vF,MAAO,EACPC,QAAS,GCrJN,MAAMC,WAAiB31C,GAgB1B/pD,YAAYw8B,EAAOtZ,GAGf,GAFA9hB,MAAMo7B,EAAO,QAERtZ,EAAW,CACZ,IAAIy8E,EAAanjE,EAAMusB,WAAW0b,eAAe,GAAGzoC,KAC1B,iBAAf2jE,IACPA,EAAaj9F,SAASi9F,EAAY,KAEtC,IAAIC,EAAYpjE,EAAM+pB,UAAUke,eAAe,GAAGzoC,KACzB,iBAAd4jE,IACPA,EAAYl9F,SAASk9F,EAAW,KAKhC18E,EADA5f,MAAMq8F,IAAer8F,MAAMs8F,GACfF,GAASG,SAGTF,EAAaC,EAAYF,GAASI,WAAaJ,GAASG,SAG5ElhG,KAAKukB,UAAYA,EACjBvkB,KAAKmhC,eAAe2oB,IAAM,GAC1B9pD,KAAKmhC,eAAe4oB,IAAM,GAC1B/pD,KAAKmhC,eAAe9pB,QAAU,GAC9BrX,KAAKkW,YAEE5U,sBACP,OAAOG,EAASs/F,SAETG,sBACP,OAAO,EAEAC,wBACP,OAAQ,EAEZ18F,qBAAqBo5B,GACjB,OAAO,IAAIkjE,GAASljE,EAAOkjE,GAASG,UAExCz8F,uBAAuBo5B,GACnB,OAAO,IAAIkjE,GAASljE,EAAOkjE,GAASI,YAExC32C,UAAU9tB,GACN,GAA+B,IAA3BA,EAAO+tB,SAAS3lD,QAA0C,IAA1B43B,EAAOguB,QAAQ5lD,OAC/C,MAAM,IAAIzC,EAAa,eAAgB,yBAE3C,MAAMyW,EAAM9Y,KAAK0U,eACXk2C,EAAaluB,EAAOkuB,WACpBH,EAAW/tB,EAAO+tB,SAClBE,EAAYjuB,EAAOiuB,UACnBpmC,EAAYmY,EAAOnY,UACzB,GAAIA,IAAcw8E,GAASG,UAAY38E,IAAcw8E,GAASI,WAC1D,MAAM,IAAI9+F,EAAa,WAAY,2BAGvC,MAAMgoD,EAAgBrqD,KAAK69B,MAAMwsB,cACjC,IAAK,IAAI3iD,EAAI,EAAGA,EAAI2iD,EAAcvlD,SAAU4C,EAAG,CAC3C,MAAM05F,EAAU32C,EAASJ,EAAc3iD,IAAM1H,KAAKmhC,eAAe9pB,QACjE,GAAI1S,MAAMy8F,GACN,MAAM,IAAI/+F,EAAa,eAAgB,oCAE3CyW,EAAIQ,YACJR,EAAIS,OAAOqxC,EAAYw2C,EAAU,EAAI78E,GACrCzL,EAAIU,OAAOmxC,EAAWy2C,EAAU,EAAI78E,GACpCzL,EAAIi/B,YACJj/B,EAAIikB,SAER/8B,KAAKgV,eAGb+rF,GAASrrF,UAAY,CACjBhI,OAAQhB,EAAK8D,MACblD,KAAM,GACNC,OAAQjC,EAAW2gC,KACnBz+B,MAAOjC,EAAUoD,QC9Fd,MAAM0yF,GAKThgG,YAAYigG,EAAe,mCACvBthG,KAAKuhG,aAAe,GAEpBvhG,KAAKwhG,UAAUF,GAERG,mBACP,MAAO,CACHC,SAAU,0BACVC,OAAQ,0BACRC,MAAO,0BACPp/E,GAAI,gCACJq/E,cAAe,uBAIvBC,cAAcp+E,GACV,OAAO6Y,EAAOo8B,cAAcj1C,GAAYsZ,UAM5CwkE,UAAUF,GACFD,GAAOI,MAAMH,KACbA,EAAeD,GAAOI,MAAMH,IAEhCthG,KAAKuhG,aAAe,GACpB,MAAMjvF,EAAOgvF,EAAa35F,MAAM,WAChC,GAAoB,IAAhB2K,EAAKxN,OACL,MAAM,IAAIzC,EAAa,eAAgB,0BAA0Bi/F,KAErE,IAAK,IAAI55F,EAAI,EAAGA,EAAI4K,EAAKxN,SAAU4C,EAC/B1H,KAAKuhG,aAAa75F,GAAK1H,KAAK8hG,cAAcxvF,EAAK5K,IAIvDq6F,kBAAkBC,GACd,MAAM36F,EAAI3C,OAAOs9F,GACjB,GAAI36F,EAAI,GAAKA,EAAIrH,KAAKuhG,aAAaz8F,OAC/B,MAAM,IAAIzC,EAAa,eAAgB,uCAAuCrC,KAAKuhG,aAAaz8F,UAAUk9F,KAE9G,OAAOhiG,KAAKuhG,aAAal6F,EAAI,GAGjC46F,gBAAgBC,EAASF,GACrB,MAAMG,EAAcniG,KAAK+hG,kBAAkBC,GACrCz6F,EAAI7C,OAAOw9F,GACjB,GAAI36F,EAAI,EACJ,MAAM,IAAIlF,EAAa,eAAgB,oCAAoC6/F,KAE/E,OAAOC,EAAc56F,EAGzB66F,eAAeF,EAASF,GACpB,MAAM79E,EAAYnkB,KAAKiiG,gBAAgBC,EAASF,GAC1CriF,EAASxb,KAAK0C,MAAMsd,EAAY,IAChCjf,EAAQif,EAAY,GAC1B,MAAO,GAAGoY,EAAO8lE,cAAcn9F,MAAUya,KCnEjD,IAAI,GAAwC,SAAUlU,EAASC,EAAYC,EAAGC,GAE1E,OAAO,IAAKD,IAAMA,EAAIE,WAAU,SAAUC,EAASC,GAC/C,SAASC,EAAU9G,GAAS,IAAM+G,EAAKL,EAAUM,KAAKhH,IAAW,MAAOvE,GAAKoL,EAAOpL,IACpF,SAASwL,EAASjH,GAAS,IAAM+G,EAAKL,EAAiB,MAAE1G,IAAW,MAAOvE,GAAKoL,EAAOpL,IACvF,SAASsL,EAAKG,GAJlB,IAAelH,EAIakH,EAAOC,KAAOP,EAAQM,EAAOlH,QAJ1CA,EAIyDkH,EAAOlH,MAJhDA,aAAiByG,EAAIzG,EAAQ,IAAIyG,GAAE,SAAUG,GAAWA,EAAQ5G,OAIToH,KAAKN,EAAWG,GAClGF,GAAML,EAAYA,EAAUW,MAAMd,EAASC,GAAc,KAAKQ,YAqF/D,MAAMo2F,GACEC,mBACP,MAAO,CAEHC,QC/FW,gBDiGXjvF,GChGM,2CDkGNkvF,KCjGQ,4BDoGLH,kBAKP,OAAOA,GA6BX79F,uBAAuBi+F,GAEnB,MAAMzzF,EAAQyzF,EAAUnwF,KAAK5F,GAAaD,EAAKsC,KAAKrC,KAIpD,OAHA4vB,EAAOjhB,iBAAmBrM,EAC1B6H,EAAMwE,iBAAmBrM,EAAM7L,QAC/B0T,EAAMsE,kBAAoBsnF,EAAUr/F,KAAK,KAClC4L,EAMXxK,sBAAsBkI,EAAUg2F,GAC5B,OAAO,GAAU3iG,UAAM,OAAQ,GAAQ,gBAK3CyE,sBAEI,OADc83B,EAAOjhB,iBACR/I,KAAKvE,GAASA,EAAK4B,YAEzB6uB,iCACP,OAAOlC,EAAOkC,oBAEPA,+BAAoBv5B,GAC3Bq3B,EAAOkC,oBAAsBv5B,EAEtBs4B,kCACP,OAAOjB,EAAOiB,qBAEPA,gCAAqBt4B,GAC5Bq3B,EAAOiB,qBAAuBt4B,EAEvB4gB,wBACP,OAAOyW,EAAOzW,WAEPA,sBAAW5gB,GAClBq3B,EAAOzW,WAAa5gB,EAEb25B,kCACP,OAAOtC,EAAOsC,qBAEPA,gCAAqB35B,GAC5Bq3B,EAAOsC,qBAAuB35B,EAEvB45B,iCACP,OAAOvC,EAAOuC,oBAEPA,+BAAoB55B,GAC3Bq3B,EAAOuC,oBAAsB55B,EAEtB05B,kCACP,OAAOrC,EAAOqC,qBAEPA,gCAAqB15B,GAC5Bq3B,EAAOqC,qBAAuB15B,EAEvBy5B,yBACP,OAAOpC,EAAOoC,YAEPA,uBAAYz5B,GACnBq3B,EAAOoC,YAAcz5B,EAEdw5B,wBACP,OAAOnC,EAAOmC,WAEPA,sBAAWx5B,GAClBq3B,EAAOmC,WAAax5B,EAEbi7B,qBACP,OAAO5D,EAAO4D,QAEPnB,2BACP,OAAOzC,EAAOyC,cAEPQ,qBACP,OAAOjD,EAAOiD,QAElB/6B,oBAAoBk5B,GAChB,OAAOpB,EAAOjX,aAAaqY,GAE/Bl5B,uBAAuBk5B,GACnB,OAAOpB,EAAOqmE,gBAAgBjlE,GAElCl5B,0BACI,OAAO83B,EAAOsmE,mBAElBp+F,sBAAsB+3B,GAClB,OAAOD,EAAOO,eAAeN,GAGjC/3B,qBAAqBtE,EAAKq8B,EAAME,GAC5B,OAAOH,EAAOo8B,cAAcx4D,EAAKq8B,EAAME,GAE3Cj4B,uBAAuBs5B,GACnB,OAAOxB,EAAO+b,gBAAgBva,IAGtCukE,GAAKrhE,WAAaA,EAClBqhE,GAAK11D,WAAaA,GAClB01D,GAAK3xD,aAAeA,GACpB2xD,GAAK5gG,QAAUA,GACf4gG,GAAKvkD,QAAUA,GACfukD,GAAK7zC,KAAOA,GACZ6zC,GAAKrkD,KAAOA,GACZqkD,GAAK16F,YAAcA,EACnB06F,GAAKr5F,uBAAyBA,EAC9Bq5F,GAAKjlC,cAAgBA,GACrBilC,GAAKriD,YAAcA,GACnBqiD,GAAKl6B,KAAOA,GACZk6B,GAAK7Z,SAAWA,GAChB6Z,GAAK1Z,UAAYA,GACjB0Z,GAAK5Y,MAAQA,GACb4Y,GAAKr7C,IAAMA,GACXq7C,GAAKtV,UAAYA,GACjBsV,GAAKvvF,QAAUA,EACfuvF,GAAKhE,QAAUA,GACfgE,GAAK51F,KAAOA,EACZ41F,GAAKl0C,UAAYA,GACjBk0C,GAAKj+F,SAAWA,EAChBi+F,GAAKt6C,eAAiBA,GACtBs6C,GAAK7R,UAAYA,GACjB6R,GAAKxrF,MAAQA,EACbwrF,GAAKlR,UAAYA,GACjBkR,GAAK1gG,UAAYA,GACjB0gG,GAAKz7D,eAAiBA,GACtBy7D,GAAKQ,aE3PE,cAA2B1gG,GACnBd,sBACP,OAAOG,EAASqhG,aAEpBzhG,YAAY60C,GACRzzC,MAAMyzC,GAAY,GAClBl2C,KAAKmhC,eAAiB9gC,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI/V,KAAKmhC,gBAAiB,CAExE9pB,QAAS,GAETF,MAAO,GAEPnJ,KAAM,SAAStB,EAAKiB,eACxB3N,KAAKy+C,gBF+Ob6jD,GAAKS,WGjQE,MACH1hG,YAAYlB,GACRH,KAAK2lC,MAAQ,IAAIrnB,EACjBte,KAAKgjG,OAAO7iG,GAEhB6iG,OAAO7iG,GAGH,OAFAH,KAAKG,IAAMA,EACXH,KAAKuY,QACEvY,KAEXijG,SACI,OAAOjjG,KAAKG,IAEhBoY,QACIvY,KAAKsQ,SAAWtQ,KAAK2lC,MAAM9hB,YAAY7jB,KAAKG,KAC5CH,KAAK8jB,UAAY9jB,KAAKsQ,SAAS9Q,KAC3BQ,KAAKsQ,SAASyO,aACd/e,KAAK8jB,WAAa9jB,KAAKsQ,SAASyO,YAEpC,IAD0BT,EAAMoD,WAAW1hB,KAAKsQ,SAASW,MAErD,MAAM,IAAI5O,EAAa,eAAgB,yBAAyBrC,KAAKG,OAEzEH,KAAKmX,MAAQnX,KAAK2lC,MAAM7gB,cAAc9kB,KAAK2lC,MAAM5hB,aAAa/jB,KAAK8jB,WAAYxF,EAAMoD,WAAW1hB,KAAKsQ,SAASW,OAC9GjR,KAAK2lB,SAAW,GAChB3lB,KAAKkjG,gBAAkB,GACvBljG,KAAKmjG,wBAA0B,GAC/B,MAAMz9E,EAAepH,EAAMK,aAAa3e,KAAKsQ,SAAS9Q,MACtD,IAAK,IAAIkI,EAAI,EAAGA,EAAI4W,EAAMG,MAAM3Z,SAAU4C,EAAG,CACzC,MAAM0J,GAASsU,EAAehe,GAAK4W,EAAMG,MAAM3Z,OACzC8gB,EAAWtH,EAAMG,MAAMrN,GACvByU,EAAW7lB,KAAK2lC,MAAMlhB,oBAAoBmB,EAAU5lB,KAAKmX,MAAMzP,IACrE1H,KAAK2lB,SAASC,GAAYC,EAC1B7lB,KAAKkjG,gBAAgBljG,KAAKmX,MAAMzP,IAAMme,EACtC7lB,KAAKmjG,wBAAwBnjG,KAAKmX,MAAMzP,IAAMme,EAElD,OAAO7lB,KAEXojG,cAAcjjG,GACV,MAAMX,EAAOQ,KAAK2lC,MAAM9hB,YAAY1jB,GAAKX,KACnCoY,EAAQ5X,KAAK2lC,MAAMliB,aAAazjB,KAAK2lB,SAASnmB,IACpD,MAAO,CACHkd,KAAM1c,KAAK2lB,SAASnmB,GACpBuf,WAAYnH,EAAMmH,YAG1BskF,WAAW3mF,GACPA,EAAOA,EAAKrP,cACZ,MAAMuK,EAAQ5X,KAAK2lC,MAAMliB,aAAa/G,GAEhC4mF,EAAYtjG,KAAK2lB,SAAS/N,EAAMpY,MAChC+jG,EAAWvjG,KAAK2lC,MAAMliB,aAAa6/E,GACzC,GAAIA,IAAc5mF,EACd,MAAO,CACHA,KAAM4mF,EACNvkF,WAAYnH,EAAMmH,WAClBykF,QAAQ,GAIhB,MAAMC,EAAYzjG,KAAKkjG,gBAAgBljG,KAAK2lC,MAAM5hB,aAAarH,IAC/D,GAAiB,MAAb+mF,EACA,MAAO,CACH/mF,KAAM+mF,EACN1kF,WAAY/e,KAAK2lC,MAAMliB,aAAaggF,GAAW1kF,WAC/CykF,QAAQ,GAIhB,MAAME,EAAoB1jG,KAAKmjG,wBAAwBnjG,KAAK2lC,MAAM5hB,aAAarH,IAC/E,OAAyB,MAArBgnF,GACA1jG,KAAK2lB,SAAS49E,EAAS/jG,MAAQkkG,SACxB1jG,KAAKkjG,gBAAgBljG,KAAK2lC,MAAM5hB,aAAau/E,IACpDtjG,KAAKkjG,gBAAgBljG,KAAK2lC,MAAM5hB,aAAarH,IAASgnF,EAC/C,CACHhnF,KAAMgnF,EACN3kF,WAAY/e,KAAK2lC,MAAMliB,aAAaigF,GAAmB3kF,WACvDykF,QAAQ,IAIZD,EAAS/jG,OAASkd,UACX1c,KAAKkjG,gBAAgBljG,KAAK2lC,MAAM5hB,aAAa/jB,KAAK2lB,SAAS/N,EAAMpY,QACxEQ,KAAKkjG,gBAAgBljG,KAAK2lC,MAAM5hB,aAAaw/E,EAAS/jG,OAAS+jG,EAAS/jG,KACxEQ,KAAK2lB,SAAS49E,EAAS/jG,MAAQ+jG,EAAS/jG,KACjC,CACHkd,KAAM6mF,EAAS/jG,KACfuf,gBAAYjc,EACZ0gG,QAAQ,YAITxjG,KAAKkjG,gBAAgBljG,KAAK2lC,MAAM5hB,aAAa/jB,KAAK2lB,SAAS/N,EAAMpY,QACxEQ,KAAKkjG,gBAAgBljG,KAAK2lC,MAAM5hB,aAAarH,IAASA,SAC/C1c,KAAK2lB,SAAS49E,EAAS/jG,MAC9BQ,KAAK2lB,SAAS49E,EAAS/jG,MAAQkd,EACxB,CACHA,KAAAA,EACAqC,WAAYnH,EAAMmH,WAClBykF,QAAQ,MHgKpBlB,GAAK55B,aAAeA,GACpB45B,GAAKtP,WAAaA,GAClBsP,GAAK/mF,SAAWA,EAChB+mF,GAAKv6B,gBAAkBA,GACvBu6B,GAAKpP,iBAAmBA,GACxBoP,GAAKhkF,MAAQA,EACbgkF,GAAKxgG,KAAOA,GACZwgG,GAAKhvC,SAAWA,GAChBgvC,GAAKxzC,aAAeA,GACpBwzC,GAAKtxC,SAAWA,GAChBsxC,GAAKtvC,YAAcA,GACnBsvC,GAAKzX,OAASA,GACdyX,GAAK9M,aAAeA,GACpB8M,GAAKnxF,SAAWA,EAChBmxF,GAAK1vD,cAAgBA,GACrB0vD,GAAK9/B,SAAWA,GAChB8/B,GAAKzL,WAAaA,GAClByL,GAAK/3B,WAAaA,GAClB+3B,GAAKtyB,MAAQA,GACbsyB,GAAKjuB,eAAiBA,GACtBiuB,GAAKzC,aAAeA,GACpByC,GAAKvL,UAAYA,GACjBuL,GAAKtnD,cAAgBA,GACrBsnD,GAAKtgG,UAAYA,GACjBsgG,GAAKl2B,WAAaA,GAClBk2B,GAAK30B,UAAYA,GACjB20B,GAAK14C,SAAWA,GAChB04C,GAAK96D,KAAOA,EACZ86D,GAAKj+B,aAAeA,GACpBi+B,GAAK78B,OAASA,GACd68B,GAAK5iC,WAAaA,GAClB4iC,GAAKtJ,OAASA,GACdsJ,GAAKlgG,QAAUA,GACfkgG,GAAKvB,SAAWA,GAChBuB,GAAK7F,SAAWA,GAChB6F,GAAKl3C,OAASA,GACdk3C,GAAK3F,YAAcA,GACnB2F,GAAK5E,aAAeA,GACpB4E,GAAKj4D,cAAgBA,GACrBi4D,GAAK71B,SAAWA,GAChB61B,GAAKrzC,YAAcA,GACnBqzC,GAAKpzB,cAAgBA,GACrBozB,GAAKrE,YAAcA,GACnBqE,GAAKqB,QI1SE,cAAsBpoF,EAIzBla,YAAY8kB,GACR1jB,QACAzC,KAAKmmB,IAAMA,EACXnmB,KAAKyb,SAAWF,EAASG,SAASK,OAClC/b,KAAKuC,KAAO,WAEZvC,KAAK4jG,gBAAkB,EACvB5jG,KAAK6jG,mBAAqB,EAEnBviG,sBACP,OAAOG,EAASkiG,QAGpBhvF,OACI,MAAMmE,EAAM9Y,KAAK0U,eACXgI,EAAO1c,KAAK2c,oBAClB3c,KAAKgV,cACL,MAAMq4B,EAAgB3wB,EAAK6wB,mBAE3B,IAAI1qC,EADU6Z,EAAK2qB,mBAAmBrnC,KAAKyb,SAAUzb,KAAKoR,OAC5CvO,EACd,MAAMggB,EAAKlhB,EAAY+a,GACjBvF,EAAQ0L,EAAKjhB,GAAU2vF,MAAQ,EAC/BrwF,EAAW,YAAW2hB,EAAK,QAAU,WACrC6e,EAAYnF,EAAOoF,mBACzB,IAAImiE,EAAYpiE,EAAUtxB,aAAa,GAAGlP,aAAsBmsC,EAEhEy2D,GAAa9jG,KAAK4jG,gBAClB,MAAMl6F,EAAS1J,KAAKmmB,IAAM29E,EAC1B,IAAIj8F,EAAI6U,EAAKmzB,iBAAiBlG,MAAQjgC,EAElC7B,GADAwlC,EAAgB,EACX3L,EAAUtxB,aAAa,GAAGlP,qBAA8BiW,EAGxDuqB,EAAUtxB,aAAa,GAAGlP,mBAA4BiW,EAE/D,MAAM4vB,EAAYrF,EAAUtxB,aAAa,GAAGlP,WAC5C2B,GAAK6+B,EAAUtxB,aAAa,GAAGlP,gBAAuBmsC,IAAkB7F,EAAKe,GAAK,KAAO,UACzF,IAAK,IAAI7gC,EAAI,EAAGA,EAAI1H,KAAKmmB,MAAOze,EAC5BoP,EAAMu8C,YAAYv6C,EAAKjW,EAAGgF,EAAGk/B,EAAW/mC,KAAKuC,KAAM,CAAErB,SAAAA,EAAUiW,MAAOnX,KAAK6jG,qBAC3Eh8F,GAAKi8F,IJgQjBxB,GAAKjB,OAASA,GACdiB,GAAK/jB,OAASA,GACd+jB,GAAKt7B,QAAUA,GACfs7B,GAAKnE,eAAiBA,GACtBmE,GAAKj3C,MAAQA,GACbi3C,GAAKv0B,MAAQA,GAEbu0B,GAAK5nD,YAAcA,GACnB4nD,GAAK5rF,iBAAmBA,EKxTjB,MAAM,GAUTjS,qBAAqBoyE,EAAKktB,EAAKC,GAC3B,GAAIntB,EAAI/xE,OAAS,EAAG,CAChB,MAAMm/F,EAAS,GACf,IAAIC,EACJrtB,EAAIj0C,KAAKmhE,GACT,IAAK,IAAIr8F,EAAI,EAAGA,EAAImvE,EAAI/xE,SAAU4C,EACpB,IAANA,GAAYs8F,EAAGntB,EAAInvE,GAAIw8F,IACvBD,EAAOpsF,KAAKg/D,EAAInvE,IAEpBw8F,EAAOrtB,EAAInvE,GAEf,OAAOu8F,EAGP,OAAOptB,EAKfpyE,gBAAgBoyE,EAAKj2E,GACjB,IAAI8G,EAAImvE,EAAI/xE,OACZ,KAAO4C,KACH,GAAImvE,EAAInvE,KAAO9G,EACX,OAAO,EAGf,OAAO,EAGX6D,wBAAwB0/F,GACpB,IAAKA,EACD,MAAM,IAAI9hG,EAAa,cAAe,4BAA8B8hG,GAExE,MAAM5mC,EAASzvD,SAAS8D,eAAeuyF,GACvC,IAAM5mC,IAAUA,EAAOnoD,WACnB,MAAM,IAAI/S,EAAa,0BAA2B,8CAEtD,OAAOk7D,EAAOnoD,WAAW,MAI7B3Q,iBAAiB4C,EAAGE,GAChB,MAAM68F,GAAa,IAAIC,MAAOC,UAC9B/8F,IAEAxE,EAAIsE,GADY,IAAIg9F,MAAOC,UAAYF,EACtB,MAGrB3/F,oBAEI,OADY,IAAInC,OACLmB,OAGnB,GAAI6+F,KAAOA,GCpEJ,MAAMiC,GAAa,CACtBt0F,WAAY,IACZhC,WAAY,gBACZkC,OAAQ,CACJq0F,oBAAqB,CACjB9rF,MAAO,EACPC,MAAO,OACPC,GAAI,IACJxY,EAAG,mGAEPqkG,oBAAqB,CACjB/rF,MAAO,EACPC,MAAO,OACPC,GAAI,IACJxY,EAAG,kDAEPskG,4BAA6B,CACzBhsF,OAAQ,MACRC,MAAO,SACPC,GAAI,IACJxY,EAAG,+wCAEPukG,qBAAsB,CAClBjsF,OAAQ,SACRC,MAAO,SACPC,GAAI,IACJxY,EAAG,q6BAEPwkG,6BAA8B,CAC1BlsF,OAAQ,SACRC,MAAO,WACPC,GAAI,IACJxY,EAAG,skDAEPykG,gBAAiB,CACbnsF,OAAQ,GACRC,MAAO,IACPC,GAAI,IACJxY,EAAG,kMAEP0kG,eAAgB,CACZpsF,OAAQ,UACRC,MAAO,SACPC,GAAI,IACJxY,EAAG,mvBAEP2kG,yBAA0B,CACtBrsF,OAAQ,SACRC,MAAO,SACPC,GAAI,IACJxY,EAAG,23EAEP4kG,yBAA0B,CACtBtsF,MAAO,EACPC,MAAO,OACPC,GAAI,IACJxY,EAAG,qoGAEP6kG,yBAA0B,CACtBvsF,MAAO,EACPC,MAAO,OACPC,GAAI,IACJxY,EAAG,4gDAEP8kG,qBAAsB,CAClBxsF,MAAO,EACPC,MAAO,OACPC,GAAI,IACJxY,EAAG,kDAEP+kG,qBAAsB,CAClBzsF,MAAO,EACPC,MAAO,OACPC,GAAI,IACJxY,EAAG,oGC1EFglG,GAAgB,CACzBx4F,KAAM,gBACNy4F,OAAO,EACPl1F,OAAQ,ICHL,MAAMm1F,GAAe,CACxBn1F,OAAQ,CACJo1F,WAAY,CACR7sF,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,6WAEPqlG,cAAe,CACX/sF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,EACPltC,GAAI,IACJxY,EAAG,scAEPslG,YAAa,CACThtF,MAAO,EACPC,MAAO,mBACP6sF,MAAO,iBACP1/C,MAAO,mBACPltC,GAAI,mBACJxY,EAAG,gLAEPulG,eAAgB,CACZjtF,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,smBAEP4sE,MAAO,CACHt0D,MAAO,EACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,u0DAEPitE,KAAM,CACF30D,MAAO,EACPC,MAAO,KACP6sF,OAAQ,IACR1/C,MAAO,KACPltC,GAAI,KACJxY,EAAG,mrDAEPwlG,MAAO,CACHltF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,KACPltC,GAAI,KACJxY,EAAG,87DAEPylG,MAAO,CACHntF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,KACJxY,EAAG,soFAEP0lG,MAAO,CACHptF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,qqCAEP2lG,yBAA0B,CACtBrtF,MAAO,EACPC,MAAO,mBACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,ytBAEP,iBAAkB,CACdsY,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,KACJxY,EAAG,u3EAEP4lG,SAAU,CACNttF,MAAO,GACPC,MAAO,IACP6sF,OAAQ,iBACR1/C,MAAO,IACPltC,GAAI,iBACJxY,EAAG,ooBAEP6lG,SAAU,CACNvtF,MAAO,GACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,2gBAEP8lG,SAAU,CACNxtF,MAAO,GACPC,MAAO,kBACP6sF,OAAQ,kBACR1/C,MAAO,IACPltC,GAAI,iBACJxY,EAAG,wnCAEP+lG,SAAU,CACNztF,MAAO,mBACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,4iCAEPgmG,SAAU,CACN1tF,MAAO,GACPC,MAAO,kBACP6sF,OAAQ,mBACR1/C,MAAO,mBACPltC,GAAI,kBACJxY,EAAG,kkCAEPimG,SAAU,CACN3tF,MAAO,mBACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,46BAEPkmG,SAAU,CACN5tF,MAAO,GACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,w7BAEPmmG,SAAU,CACN7tF,MAAO,iBACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,8mBAEPomG,SAAU,CACN9tF,MAAO,GACPC,MAAO,mBACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,w/BAEPqmG,SAAU,CACN/tF,MAAO,GACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,k2BAEPsmG,cAAe,CACXhuF,MAAO,GACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,mBACPltC,GAAI,iBACJxY,EAAG,g3BAEPumG,iBAAkB,CACdjuF,MAAO,GACPC,MAAO,IACP6sF,OAAQ,kBACR1/C,MAAO,IACPltC,GAAI,mBACJxY,EAAG,wwDAEPwmG,YAAa,CACTluF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,mwBAEPymG,iBAAkB,CACdnuF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,uuBAEP0mG,aAAc,CACVpuF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,GACPltC,GAAI,IACJxY,EAAG,kRAEP2mG,mBAAoB,CAChBruF,MAAO,EACPC,MAAO,mBACP6sF,OAAQ,kBACR1/C,MAAO,IACPltC,GAAI,mBACJxY,EAAG,gfAEP4mG,wBAAyB,CACrBtuF,MAAO,EACPC,MAAO,kBACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,+bAEP6mG,kBAAmB,CACfvuF,MAAO,kBACPC,MAAO,kBACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,KACJxY,EAAG,qhBAEP8mG,uBAAwB,CACpBxuF,MAAO,EACPC,MAAO,mBACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,oZAEP+mG,oBAAqB,CACjBzuF,OAAQ,kBACRC,MAAO,SACP6sF,OAAQ,mBACR1/C,MAAO,IACPltC,GAAI,kBACJxY,EAAG,u3DAEPgnG,cAAe,CACX1uF,MAAO,EACPC,MAAO,mBACP6sF,OAAQ,mBACR1/C,MAAO,IACPltC,GAAI,mBACJxY,EAAG,weAEPinG,aAAc,CACV3uF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,wbAEPknG,cAAe,CACX5uF,MAAO,EACPC,MAAO,mBACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,gMAEPmnG,eAAgB,CACZ7uF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,kBACR1/C,MAAO,IACPltC,GAAI,kBACJxY,EAAG,wpCAEPonG,cAAe,CACX9uF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,mBACR1/C,MAAO,IACPltC,GAAI,mBACJxY,EAAG,kjCAEPqnG,eAAgB,CACZ/uF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,8rBAEPsnG,gBAAiB,CACbhvF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,mBACPltC,GAAI,mBACJxY,EAAG,2sBAEPunG,wBAAyB,CACrBjvF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,ieAEPwnG,uBAAwB,CACpBlvF,MAAO,EACPC,MAAO,kBACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,oeAEPynG,wBAAyB,CACrBnvF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,ySAEP0nG,qBAAsB,CAClBpvF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,ggBAEP2nG,oBAAqB,CACjBrvF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,glBAEP4nG,qBAAsB,CAClBtvF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,2TAEPokG,oBAAqB,CACjB9rF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,qwBAEPqkG,oBAAqB,CACjB/rF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,mBACR1/C,MAAO,mBACPltC,GAAI,kBACJxY,EAAG,yUAEP6nG,oBAAqB,CACjBvvF,OAAQ,gBACRC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,ivBAEP8nG,yBAA0B,CACtBxvF,OAAQ,GACRC,MAAO,GACP6sF,OAAQ,mBACR1/C,MAAO,IACPltC,GAAI,kBACJxY,EAAG,wYAEP+nG,wBAAyB,CACrBzvF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,sWAEPgoG,gBAAiB,CACb1vF,MAAO,EACPC,MAAO,GACP6sF,OAAQ,GACR1/C,MAAO,GACPltC,GAAI,IACJxY,EAAG,8PAEPioG,SAAU,CACN3vF,OAAQ,IACRC,MAAO,mBACP6sF,OAAQ,GACR1/C,MAAO,GACPltC,GAAI,IACJxY,EAAG,qUAEPkoG,UAAW,CACP5vF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,EACPltC,GAAI,IACJxY,EAAG,2lBAEPmoG,YAAa,CACT7vF,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,8hBAEPooG,WAAY,CACR9vF,MAAO,EACPC,MAAO,kBACP6sF,OAAQ,kBACR1/C,MAAO,EACPltC,GAAI,kBACJxY,EAAG,0vBAEPqoG,aAAc,CACV/vF,MAAO,EACPC,MAAO,kBACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,+pBAEPsoG,WAAY,CACRhwF,OAAQ,mBACRC,MAAO,kBACP6sF,OAAQ,kBACR1/C,MAAO,kBACPltC,GAAI,kBACJxY,EAAG,0gCAEPuoG,aAAc,CACVjwF,OAAQ,kBACRC,MAAO,mBACP6sF,OAAQ,mBACR1/C,MAAO,kBACPltC,GAAI,kBACJxY,EAAG,m7BAEPwoG,WAAY,CACRlwF,OAAQ,EACRC,MAAO,IACP6sF,OAAQ,kBACR1/C,MAAO,IACPltC,GAAI,mBACJxY,EAAG,q+CAEPyoG,aAAc,CACVnwF,OAAQ,EACRC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,kBACPltC,GAAI,mBACJxY,EAAG,q5CAEP0oG,YAAa,CACTpwF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,KACJxY,EAAG,yhDAEP2oG,cAAe,CACXrwF,OAAQ,kBACRC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,KACJxY,EAAG,4+CAEP4oG,eAAgB,CACZtwF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,ipBAEP6oG,kBAAmB,CACfvwF,MAAO,EACPC,MAAO,MACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,+xBAEP8oG,gBAAiB,CACbxwF,OAAQ,GACRC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,sgDAEP+oG,sBAAuB,CACnBzwF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,msBAEPgpG,qBAAsB,CAClB1wF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,4yCAEPipG,qBAAsB,CAClB3wF,MAAO,EACPC,MAAO,mBACP6sF,OAAQ,IACR1/C,MAAO,kBACPltC,GAAI,kBACJxY,EAAG,oYAEPkpG,sBAAuB,CACnB5wF,OAAQ,kBACRC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,yYAEPmpG,+BAAgC,CAC5B7wF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,0qBAEPopG,0CAA2C,CACvC9wF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,q2CAEPqpG,gCAAiC,CAC7B/wF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,w3BAEPspG,sCAAuC,CACnChxF,OAAQ,GACRC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,87DAEPskG,4BAA6B,CACzBhsF,MAAO,mBACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,kBACPltC,GAAI,kBACJxY,EAAG,glCAEPukG,qBAAsB,CAClBjsF,MAAO,mBACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,47BAEPupG,oBAAqB,CACjBjxF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,w3BAEPwkG,6BAA8B,CAC1BlsF,OAAQ,mBACRC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,4wCAEPykG,gBAAiB,CACbnsF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,kBACR1/C,MAAO,IACPltC,GAAI,kBACJxY,EAAG,idAEP0kG,eAAgB,CACZpsF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,kpCAEPwpG,iBAAkB,CACdlxF,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,qdAEPypG,iBAAkB,CACdnxF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,EACPltC,GAAI,IACJxY,EAAG,+fAEP0pG,iBAAkB,CACdpxF,MAAO,mBACPC,MAAO,kBACP6sF,MAAO,EACP1/C,MAAO,GACPltC,GAAI,GACJxY,EAAG,yTAEP2pG,iBAAkB,CACdrxF,MAAO,mBACPC,MAAO,kBACP6sF,OAAQ,GACR1/C,OAAQ,EACRltC,GAAI,GACJxY,EAAG,6WAEP4pG,mBAAoB,CAChBtxF,MAAO,mBACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,wOAEP6pG,mBAAoB,CAChBvxF,MAAO,mBACPC,MAAO,mBACP6sF,OAAQ,IACR1/C,MAAO,EACPltC,GAAI,IACJxY,EAAG,4QAEP8pG,wBAAyB,CACrBxxF,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,gQAEP+pG,wBAAyB,CACrBzxF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,EACPltC,GAAI,IACJxY,EAAG,qSAEPgqG,kBAAmB,CACf1xF,MAAO,mBACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,kBACPltC,GAAI,kBACJxY,EAAG,mbAEPiqG,kBAAmB,CACf3xF,MAAO,EACPC,MAAO,kBACP6sF,OAAQ,kBACR1/C,MAAO,EACPltC,GAAI,kBACJxY,EAAG,8dAEPkqG,aAAc,CACV5xF,OAAQ,mBACRC,MAAO,IACP6sF,MAAO,kBACP1/C,MAAO,IACPltC,GAAI,iBACJxY,EAAG,qtBAEPmqG,aAAc,CACV7xF,OAAQ,iBACRC,MAAO,iBACP6sF,OAAQ,IACR1/C,OAAQ,kBACRltC,GAAI,mBACJxY,EAAG,gtBAEPoqG,gBAAiB,CACb9xF,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,2YAEPqqG,gBAAiB,CACb/xF,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,qeAEPsqG,QAAS,CACLhyF,MAAO,EACPC,MAAO,kBACP6sF,OAAQ,mBACR1/C,MAAO,kBACPltC,GAAI,kBACJxY,EAAG,wgBAEPuqG,cAAe,CACXjyF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,0rBAEPwqG,WAAY,CACRlyF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,qjBAEPyqG,gBAAiB,CACbnyF,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,wRAEP0qG,UAAW,CACPpyF,MAAO,kBACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,GACPltC,GAAI,IACJxY,EAAG,0TAEP2qG,SAAU,CACNryF,MAAO,EACPC,MAAO,kBACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,4PAEP4qG,YAAa,CACTtyF,OAAQ,kBACRC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,y+BAEP6qG,QAAS,CACLvyF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,qkBAEP8qG,SAAU,CACNxyF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,iBACR1/C,MAAO,IACPltC,GAAI,kBACJxY,EAAG,26BAEP+qG,SAAU,CACNzyF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,kBACR1/C,MAAO,IACPltC,GAAI,kBACJxY,EAAG,yxCAEPgrG,SAAU,CACN1yF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,kBACPltC,GAAI,mBACJxY,EAAG,uiDAEPirG,UAAW,CACP3yF,MAAO,kBACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,KACJxY,EAAG,upDAEPkrG,aAAc,CACV5yF,OAAQ,GACRC,MAAO,kBACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,ijCAEPmrG,aAAc,CACV7yF,OAAQ,GACRC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,woCAEPorG,aAAc,CACV9yF,OAAQ,IACRC,MAAO,gBACP6sF,OAAQ,kBACR1/C,MAAO,IACPltC,GAAI,kBACJxY,EAAG,i+BAEPqrG,mBAAoB,CAChB/yF,OAAQ,GACRC,MAAO,kBACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,omBAEPsrG,iBAAkB,CACdhzF,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,+3BAEPurG,SAAU,CACNjzF,OAAQ,kBACRC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,8uBAEPwrG,cAAe,CACXlzF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,21CAEPyrG,aAAc,CACVnzF,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,q3BAEP0rG,kBAAmB,CACfpzF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,mrCAEP2rG,gBAAiB,CACbrzF,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,4mCAEP4rG,mBAAoB,CAChBtzF,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,84BAEP6rG,oBAAqB,CACjBvzF,MAAO,EACPC,MAAO,gBACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,spCAEP8rG,2BAA4B,CACxBxzF,OAAQ,mBACRC,MAAO,KACP6sF,OAAQ,GACR1/C,MAAO,kBACPltC,GAAI,kBACJxY,EAAG,45CAEP+rG,oCAAqC,CACjCzzF,MAAO,EACPC,MAAO,KACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,m5CAEPgsG,8BAA+B,CAC3B1zF,MAAO,EACPC,MAAO,KACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,snEAEPisG,mCAAoC,CAChC3zF,MAAO,EACPC,MAAO,KACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,8lDAEPksG,wCAAyC,CACrC5zF,MAAO,EACPC,MAAO,KACP6sF,OAAQ,GACR1/C,MAAO,kBACPltC,GAAI,kBACJxY,EAAG,s4CAEPmsG,4CAA6C,CACzC7zF,MAAO,EACPC,MAAO,KACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,suDAEPosG,gCAAiC,CAC7B9zF,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,0yCAEPqsG,WAAY,CACR/zF,OAAQ,kBACRC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,GACPltC,GAAI,IACJxY,EAAG,oPAEPssG,gBAAiB,CACbh0F,OAAQ,mBACRC,MAAO,mBACP6sF,OAAQ,GACR1/C,MAAO,kBACPltC,GAAI,kBACJxY,EAAG,kRAEPusG,kBAAmB,CACfj0F,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,GACPltC,GAAI,IACJxY,EAAG,iUAEPwsG,gBAAiB,CACbl0F,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,ooCAEPysG,qBAAsB,CAClBn0F,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,ovDAEP0sG,UAAW,CACPp0F,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,4nBAEP2sG,gBAAiB,CACbr0F,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,4gBAEP4sG,cAAe,CACXt0F,MAAO,EACPC,MAAO,mBACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,0bAEP6sG,UAAW,CACPv0F,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,+MAEP8sG,cAAe,CACXx0F,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,szBAEP+sG,WAAY,CACRz0F,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,kXAEPgtG,eAAgB,CACZ10F,MAAO,EACPC,MAAO,IACP6sF,OAAQ,mBACR1/C,MAAO,IACPltC,GAAI,mBACJxY,EAAG,mmBAEPitG,aAAc,CACV30F,MAAO,EACPC,MAAO,kBACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,uVAEPktG,gBAAiB,CACb50F,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,iTAEPmtG,0BAA2B,CACvB70F,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,meAEPotG,0BAA2B,CACvB90F,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,skBAEPqtG,yBAA0B,CACtB/0F,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,+aAEPstG,iBAAkB,CACdh1F,MAAO,EACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,q6EAEPutG,gBAAiB,CACbj1F,MAAO,EACPC,MAAO,kBACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,mjCAEPwtG,gBAAiB,CACbl1F,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,8TAEPytG,mBAAoB,CAChBn1F,OAAQ,GACRC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,2eAEP0tG,aAAc,CACVp1F,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJxY,EAAG,28DAEP2tG,eAAgB,CACZr1F,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJxY,EAAG,qmEAEP4tG,WAAY,CACRt1F,MAAO,EACPC,MAAO,kBACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,w2BAEP6tG,YAAa,CACTv1F,MAAO,oBACPC,MAAO,IACP6sF,OAAQ,mBACR1/C,MAAO,mBACPltC,GAAI,kBACJxY,EAAG,g7BAEP8tG,YAAa,CACTx1F,MAAO,EACPC,MAAO,KACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,koEAEP+tG,eAAgB,CACZz1F,MAAO,EACPC,MAAO,IACP6sF,OAAQ,mBACR1/C,MAAO,mBACPltC,GAAI,mBACJxY,EAAG,sXAEPguG,eAAgB,CACZ11F,MAAO,EACPC,MAAO,IACP6sF,OAAQ,oBACR1/C,MAAO,IACPltC,GAAI,kBACJxY,EAAG,0bAEPiuG,mBAAoB,CAChB31F,OAAQ,GACRC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,g+BAEPkuG,cAAe,CACX51F,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,umBAEPmuG,iBAAkB,CACd71F,MAAO,EACPC,MAAO,kBACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,6jBAEPouG,UAAW,CACP91F,MAAO,EACPC,MAAO,mBACP6sF,MAAO,IACP1/C,MAAO,mBACPltC,GAAI,kBACJxY,EAAG,iQAEPquG,mBAAoB,CAChB/1F,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJxY,EAAG,qfAEPsuG,oBAAqB,CACjBh2F,OAAQ,GACRC,MAAO,kBACP6sF,MAAO,mBACP1/C,MAAO,KACPltC,GAAI,mBACJxY,EAAG,8eAEPuuG,oBAAqB,CACjBj2F,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,kqBAEPwuG,qBAAsB,CAClBl2F,MAAO,kBACPC,MAAO,IACP6sF,OAAQ,mBACR1/C,MAAO,kBACPltC,GAAI,kBACJxY,EAAG,mrBAEPyuG,uBAAwB,CACpBn2F,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,kBACPltC,GAAI,kBACJxY,EAAG,ocAEP0uG,wBAAyB,CACrBp2F,OAAQ,GACRC,MAAO,kBACP6sF,OAAQ,mBACR1/C,MAAO,KACPltC,GAAI,mBACJxY,EAAG,iaAEP2uG,6BAA8B,CAC1Br2F,OAAQ,mBACRC,MAAO,IACP6sF,OAAQ,mBACR1/C,MAAO,mBACPltC,GAAI,mBACJxY,EAAG,6YAEP85B,6BAA8B,CAC1BxhB,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,4qBAEP+5B,oCAAqC,CACjCzhB,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,uyCAEPg6B,qBAAsB,CAClB1hB,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,wmBAEPi6B,sBAAuB,CACnB3hB,MAAO,EACPC,MAAO,kBACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJxY,EAAG,yQAGX6N,WAAY,WACZgC,WAAY,IACZ++F,YAAa,4BCjzCJC,GAAkB,CAC3BriG,KAAM,WACNy4F,OAAO,EACPnrF,MAAO,CACHg4B,QAAS,GACTg9D,cAAe,GACfC,cAAe,EACfC,qBAAsB,IAE1BrwF,WAAY,CACR6iB,0BAA2B,EAC3BwjC,YAAa,EACbrjC,kBAAmB,GAEvBvF,KAAM,CACF6yE,QAAS,CACLx4F,MAAO,GACPpN,MAAO,IAEX6lG,MAAO,CACHz4F,MAAO,GACPpN,MAAO,IAEXujC,YAAa,CACT,MAAO,CACHuiE,UAAW,WACXF,QAAS,CACLx4F,MAAO,GACP+Q,OAAQ,CACJ1kB,MAAO,IACPssG,OAAQ,KAGhBF,MAAO,CACHz4F,MAAO,GACP+Q,OAAQ,CACJ1kB,MAAO,GACPssG,OAAQ,KAIpB,MAAO,CACHD,UAAW,WACXF,QAAS,CACLx4F,MAAO,GACP+Q,OAAQ,CACJ1kB,KAAM,EACNssG,OAAQ,IAEZ1nF,KAAM,CACF5kB,KAAM,IACNssG,OAAQ,IAGhBF,MAAO,CACHz4F,MAAO,GACP+Q,OAAQ,CACJ1kB,KAAM,IACNssG,OAAQ,GAEZ1nF,KAAM,CACF5kB,KAAM,IACNssG,OAAQ,OAMxBC,UAAW,CACP,EAAK,CAAE54F,MAAO,GAAI4xD,OAAQ,IAC1B,EAAK,CAAE5xD,MAAO,GAAI4xD,OAAQ,GAC1B,EAAK,CAAE5xD,MAAO,GAAI4xD,OAAQ,GAC1B,EAAK,CAAE5xD,MAAO,GAAI4xD,QAAS,GAC3B,EAAK,CAAE5xD,MAAO,GAAI4xD,QAAS,MAGnCrV,YAAa,CACTi8C,QAAS,CACLx4F,MAAO,GACPpN,MAAO,GAEXimG,UAAW,CACP74F,MAAO,KACPpN,MAAO,IAGfkmG,aAAc,CACVC,GAAI,CACA/4F,MAAO,IAEXg5F,KAAM,CACFh5F,MAAO,KAIfi5F,OAAQ,CAEJC,WAAY,EACZl5F,MAAO,GAEPm5F,YAAa,GACbvnC,QAAS,GAEb53B,aAAc,CACVq5D,wBAAyB,CACrBh4D,QAAS,GAEbi4D,wBAAyB,CACrBj4D,QAAS,IAGjB+9D,QAAS,CACLZ,QAAS,CACLx4F,MAAO,GACPs4B,QAAS,EACT+gE,eAAgB,EAChBC,gBAAiB,EACjBC,cAAe,GACfC,gBAAiB,GAErBC,MAAO,CACHz5F,MAAO,GACPs4B,QAAS,EACT+gE,eAAgB,EAChBC,gBAAiB,EACjBC,cAAe,EACfC,gBAAiB,IAGzBE,gBAAiB,CACblB,QAAS,CACLmB,QAAS,GACTC,aAAc,GACdthE,QAAS,IAGjB+oB,SAAU,CACN/6B,UAAW,CACPqyE,QAAS,IAGjBlvE,KAAM,CACFowE,yBAA0B,EAG1Bx4C,SAAU,CACN0vC,uBAAwB,CACpBnyC,kBAAmB,EACnBE,oBAAqB,GAEzBkyC,wBAAyB,CACrBpyC,kBAAmB,EACnBE,oBAAqB,GAEzBgyC,wBAAyB,CACrBlyC,kBAAmB,EACnBE,oBAAqB,GAEzB6xC,cAAe,CACX/xC,mBAAoB,EACpBE,oBAAqB,GAEzB8xC,eAAgB,CACZhyC,mBAAoB,EACpBE,oBAAqB,GAEzB4xC,eAAgB,CACZ9xC,mBAAoB,EACpBE,oBAAqB,GAEzB0xC,aAAc,CACV1xC,oBAAqB,IACrBF,mBAAoB,KAExB6xC,cAAe,CACX3xC,oBAAqB,EACrBF,mBAAoB,GAExB+uC,oBAAqB,CACjB7uC,qBAAsB,EACtBF,kBAAmB,KAa/BtlD,OAAQ,CACJk9D,KAAM,CACFx2D,MAAO,GACP24F,QAAS,EACT/mC,OAAQ,GAEZuE,MAAO,CACHwiC,QAAS,GAEbhvE,KAAM,CACFgvE,QAAS,IACThH,WAAY,CACRgH,QAAS,KAEb9G,WAAY,CACR8G,QAAS,KAEb5G,WAAY,CACR4G,QAAS,MAEb1G,YAAa,CACT0G,QAAS,KAEb/G,aAAc,CACV+G,QAAS,KAEb7G,aAAc,CACV6G,QAAS,KAEb3G,aAAc,CACV2G,QAAS,KAEbzG,cAAe,CACXyG,QAAS,KAEbmB,QAAS,CACLnB,QAAS,MAEboB,WAAY,CACRpB,QAAS,IAGjBhzE,KAAM,CACFopE,MAAO,CACHyJ,QAAS,CAAEl4F,MAAO,IAAKsxD,OAAQ,GAC/B6mC,MAAO,CAAE7mC,OAAQ,MAErBq9B,MAAO,CACHuJ,QAAS,CAAE5mC,QAAS,MAG5BrX,SAAU,CACNy6C,aAAc,CACV10F,MAAO,KAEX20F,kBAAmB,CACf30F,MAAO,MAGfstD,aAAc,CACVU,gBAAiB,EACjBD,YAAa,EACbE,YAAa,EACbC,aAAc,GAElBtoC,OAAQ,CACJ8zE,mBAAoB,CAChBC,SAAU,CACNtB,QAAS,KAEbuB,OAAQ,CACJvB,QAAS,EACT/mC,OAAQ,IAGhBuoC,iBAAkB,CACdF,SAAU,CACNtB,QAAS,KAEbuB,OAAQ,CACJvB,QAAS,EACT/mC,OAAQ,KAIpBo2B,SAAU,CACNhoF,MAAO,GACP8uF,eAAgB,CACZ9uF,MAAO,GACP4xD,OAAQ,GAEZ+hC,gBAAiB,CACb3zF,MAAO,IAEXm2D,MAAO,CACHn2D,MAAO,GACP24F,QAAS,EACT/mC,OAAQ,GAEZ4E,KAAM,CACFx2D,MAAO,GACP24F,QAAS,EACT/mC,OAAQ,GAEZmjC,cAAe,CACX4D,QAAS,GACT/mC,OAAQ,GAEZsjC,gBAAiB,CACbyD,QAAS,GAEbxD,mBAAoB,CAChBwD,QAAS,IAGjBt3C,SAAU,CACN+4C,WAAY,EACZvP,SAAU,CACNwP,oBAAqB,CACjB1B,OAAQ,IAEZ2B,mBAAoB,CAChB3B,OAAQ,MAEZ4B,oBAAqB,CACjB5B,OAAQ,IAGhB6B,OAAQ,CACJC,sBAAuB,CACnB9B,QAAS,GAEb+B,wBAAyB,CACrB/B,OAAQ,KAEZgC,0BAA2B,CACvBhC,OAAQ,KAEZiC,2BAA4B,CACxBjC,OAAQ,KAEZkC,2BAA4B,CACxBlC,OAAQ,GAEZmC,qBAAsB,CAClBnC,OAAQ,GAEZoC,oBAAqB,CACjBpC,QAAS,GAEbqC,sBAAuB,CACnBrC,OAAQ,GAEZsC,qBAAsB,CAClBtC,QAAS,GAEbuC,uBAAwB,CACpBvC,OAAQ,GAEZwC,4BAA6B,CACzBxC,OAAQ,KAEZyC,0BAA2B,CACvBzC,QAAS,KAEb0C,0BAA2B,CACvB1C,QAAS,KAEb2C,8BAA+B,CAC3B3C,QAAS,OAIrBpuD,YAAa,CACTZ,OAAQ,CACJ5V,mBAAoB,IACpBC,gBAAiB,IACjBsW,eAAgB,IAChBE,iBAAkB,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,KAC5CC,iBAAkB,CAAC,KACnBnS,QAAS,GACToR,cAAe,KAEnB6tD,eAAgB,CACZj3F,MAAO,GACP+pC,iBAAkB,GAClB5U,aAAc,IACd2U,QAAS,GAEbotD,mBAAoB,CAChBl3F,MAAO,GACP+pC,iBAAkB,GAClB5U,aAAc,IACd2U,QAAS,GAEbqtD,cAAe,CACXn3F,MAAO,EACP+pC,iBAAkB,GAClB5U,aAAc,IACd2U,QAAS,GAEbwtD,mBAAoB,CAChBt3F,MAAO,GACP+pC,gBAAiB,EACjB5U,aAAc,IACd2U,QAAS,KAEbytD,oBAAqB,CACjBv3F,MAAO,GACP+pC,gBAAiB,GACjB5U,aAAc,IACd2U,QAAS,KAEb0tD,oBAAqB,CACjBx3F,MAAO,GACP+pC,gBAAiB,EACjB5U,aAAc,IACd2U,QAAS,GAEb2tD,qBAAsB,CAClBz3F,MAAO,GACP+pC,gBAAiB,EACjB5U,aAAc,IACd2U,QAAS,GAEb4tD,uBAAwB,CACpB13F,MAAO,IACP+pC,gBAAiB,EACjB5U,aAAc,IACd2U,QAAS,KAEb6tD,wBAAyB,CACrB33F,MAAO,GACP+pC,iBAAkB,IAClB5U,aAAc,IACd2U,QAAS,KAEb8tD,6BAA8B,CAC1B53F,MAAO,GACP+pC,iBAAkB,EAClB5U,aAAc,IACd2U,QAAS,GAEbutD,UAAW,CACPr3F,MAAO,GACP+pC,gBAAiB,EACjB5U,aAAc,IACd2U,QAAS,GAEbstD,iBAAkB,CACdp3F,MAAO,GACP+pC,gBAAiB,IACjBD,QAAS,EACT3U,aAAc,KAElB48D,gBAAiB,CACb/xF,MAAO,GACP+pC,gBAAiB,EACjB5U,aAAc,IACd2U,SAAU,KAEd+nD,eAAgB,CACZ7xF,MAAO,GACP+pC,iBAAkB,GAClB5U,aAAc,IACd2U,SAAU,MAGlB6Q,cAAe,CACX26C,WAAY,CACRt1F,MAAO,EACPs4C,SAAU,GACVxO,QAAS,EACTuQ,cAAe,EACfD,cAAe,IAEnBm7C,gBAAiB,CACbv1F,MAAO,EACPs4C,QAAS,GACTxO,QAAS,EACTuQ,cAAe,EACfD,cAAe,GAEnBo7C,kBAAmB,CACfx1F,MAAO,EACPs4C,QAAS,GACTxO,QAAS,EACTuQ,cAAe,EACfD,cAAe,GAEnBq7C,gBAAiB,CACbz1F,MAAO,EACPs4C,QAAS,GACTxO,QAAS,EACTuQ,cAAe,EACfD,cAAe,GAEnBs7C,qBAAsB,CAClB11F,MAAO,EACPs4C,QAAS,GACTxO,QAAS,GACTuQ,cAAe,EACfD,cAAe,GAEnBu7C,UAAW,CACP31F,MAAO,EACPs4C,QAAS,EACTxO,SAAU,EACVuQ,cAAe,GACfD,cAAe,GAEnBw7C,gBAAiB,CACb51F,MAAO,EACPs4C,QAAS,EACTxO,SAAU,EACVuQ,cAAe,GACfD,cAAe,GAEnBy7C,cAAe,CACX71F,MAAO,EACPs4C,QAAS,EACTxO,SAAU,EACVuQ,cAAe,GACfD,cAAe,GAEnB07C,UAAW,CACP91F,MAAO,EACPs4C,QAAS,GACTxO,SAAU,EACVuQ,cAAe,EACfD,cAAe,GAEnB27C,cAAe,CACX/1F,MAAO,EACPs4C,QAAS,EACTxO,SAAU,EACVuQ,cAAe,EACfD,cAAe,GAEnB47C,WAAY,CACRh2F,MAAO,EACPs4C,QAAS,GACTxO,SAAU,EACVuQ,cAAe,EACfD,cAAe,IAGvB7c,OAAQ,CACJgsC,eAAgB,GAChBC,WAAY,GACZ1R,WAAY,EACZsR,kBAAmB,MCpiBxB,MAAM6xB,GAAqB,CAC9BjjE,QAAS,GACTh/B,OAAQ,CACJ,IAAK,CACDuI,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,EACjB5U,aAAc,KAElB,EAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,EAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,EAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,EAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,EACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,EAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,EAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,EAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,EAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,EACjB5U,aAAc,KAElB,EAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,EAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,EACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,MAAO,IACP1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,EACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB+lE,EAAG,CACC35F,MAAO,GACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,EACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,MAAO,IACP1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,OAAQ,EACRC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,iBAAkB,EAClB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,MAAO,IACP1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,MAAO,IACP1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,GACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,MAAO,IACP1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,GACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,OAAQ,GACRC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJsoC,iBAAkB,GAClB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,MAAO,GACP1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,EACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,MAAO,kBACP1/C,MAAO,IACPltC,GAAI,kBACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,MAAO,GACP1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB9kB,EAAG,CACC9O,MAAO,GACPC,MAAO,IACP6sF,OAAQ,EACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB5kB,EAAG,CACChP,MAAO,GACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBpmB,EAAG,CACCxN,MAAO,GACPC,MAAO,IACP6sF,OAAQ,EACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBhlB,EAAG,CACC5O,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB7kB,EAAG,CACC/O,MAAO,GACPC,MAAO,IACP6sF,OAAQ,EACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBjmB,EAAG,CACC3N,MAAO,GACPC,MAAO,IACP6sF,MAAO,GACP1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBllB,EAAG,CACC1O,MAAO,GACPC,MAAO,IACP6sF,OAAQ,EACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBtsB,EAAG,CACCtH,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBgmE,EAAG,CACC55F,MAAO,GACPC,MAAO,IACP6sF,OAAQ,EACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBimE,EAAG,CACC75F,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBkmE,EAAG,CACC95F,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBtL,EAAG,CACCtoB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,EACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB3qB,EAAG,CACCjJ,MAAO,GACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBmmE,EAAG,CACC/5F,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBomE,EAAG,CACCh6F,MAAO,GACPC,MAAO,IACP6sF,OAAQ,EACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB3gC,EAAG,CACC+M,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBqmE,EAAG,CACCj6F,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB3iB,EAAG,CACCjR,MAAO,GACPC,MAAO,IACP6sF,MAAO,GACP1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBvsB,EAAG,CACCrH,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBpsB,EAAG,CACCxH,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBsmE,EAAG,CACCl6F,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBumE,EAAG,CACCn6F,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBnsB,EAAG,CACCzH,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBziB,EAAG,CACCnR,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBwmE,EAAG,CACCp6F,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBymE,EAAG,CACCr6F,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,KAAM,CACF5zB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,OAAQ,GACRC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,KACJsoC,iBAAkB,GAClB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,MAAO,IACP1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB0mE,EAAG,CACCt6F,MAAO,GACPC,MAAO,IACP6sF,OAAQ,IACR1/C,OAAQ,EACRltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,MAAO,IACP1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB3oC,EAAG,CACC+U,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB1oC,EAAG,CACC8U,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBrhC,EAAG,CACCyN,MAAO,GACPC,MAAO,IACP6sF,OAAQ,EACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBjnC,EAAG,CACCqT,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB3rC,EAAG,CACC+X,MAAO,GACPC,MAAO,IACP6sF,OAAQ,EACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB/kC,EAAG,CACCmR,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB7rC,EAAG,CACCiY,MAAO,GACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBvkC,EAAG,CACC2Q,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB5kC,EAAG,CACCgR,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB6V,EAAG,CACCzpC,OAAQ,IACRC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJsoC,iBAAkB,IAClB5U,aAAc,KAElB95B,EAAG,CACCkG,MAAO,GACPC,MAAO,IACP6sF,OAAQ,EACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB2mE,EAAG,CACCv6F,MAAO,GACPC,MAAO,IACP6sF,OAAQ,EACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB1qB,EAAG,CACClJ,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBxoC,EAAG,CACC4U,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBlsC,EAAG,CACCsY,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB6gC,EAAG,CACCz0D,MAAO,GACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBhlC,EAAG,CACCoR,MAAO,GACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBpM,EAAG,CACCxnB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,EACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBjlC,EAAG,CACCqR,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB1nC,EAAG,CACC8T,MAAO,GACPC,MAAO,IACP6sF,OAAQ,EACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBlnC,EAAG,CACCsT,MAAO,GACPC,MAAO,IACP6sF,OAAQ,EACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB+gB,EAAG,CACC30C,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBxkC,EAAG,CACC4Q,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBzpC,EAAG,CACC6V,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElBzkC,EAAG,CACC6Q,OAAQ,GACRC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJsoC,iBAAkB,GAClB5U,aAAc,KAElB8gC,EAAG,CACC10D,MAAO,GACPC,MAAO,IACP6sF,OAAQ,EACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,EACPC,MAAO,EACP6sF,MAAO,EACP1/C,MAAO,EACPltC,GAAI,EACJsoC,gBAAiB,EACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,EACPC,MAAO,EACP6sF,MAAO,EACP1/C,MAAO,EACPltC,GAAI,EACJsoC,gBAAiB,EACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,EACPC,MAAO,EACP6sF,MAAO,EACP1/C,MAAO,EACPltC,GAAI,EACJsoC,gBAAiB,EACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,EACPC,MAAO,EACP6sF,MAAO,EACP1/C,MAAO,EACPltC,GAAI,EACJsoC,gBAAiB,EACjB5U,aAAc,MAGtBr+B,WAAY,iBACZgC,WAAY,IACZ++F,YAAa,4BC71BJkE,GAAiB,CAC1B/jE,QAAS,GACTh/B,OAAQ,CACJ,IAAK,CACDuI,MAAO,EACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,EACjB5U,aAAc,KAElB,EAAK,CACD5zB,MAAO,IACPC,MAAO,KACP6sF,OAAQ,GACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,IACjB5U,aAAc,MAElB,EAAK,CACD5zB,MAAO,IACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,IACjB5U,aAAc,KAElB,EAAK,CACD5zB,MAAO,iBACPC,MAAO,KACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElB,EAAK,CACD5zB,MAAO,kBACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElB,EAAK,CACD5zB,MAAO,GACPC,MAAO,KACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElB,EAAK,CACD5zB,MAAO,iBACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElB,EAAK,CACD5zB,MAAO,IACPC,MAAO,KACP6sF,OAAQ,GACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,IACjB5U,aAAc,MAElB,EAAK,CACD5zB,MAAO,GACPC,MAAO,KACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,iBAAkB,GAClB5U,aAAc,MAElB,EAAK,CACD5zB,MAAO,GACPC,MAAO,KACP6sF,OAAQ,GACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElB,EAAK,CACD5zB,MAAO,GACPC,MAAO,KACP6sF,OAAQ,GACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElB,IAAK,CACD5zB,MAAO,IACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,IACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,IACPC,MAAO,IACP6sF,MAAO,KACP1/C,MAAO,KACPltC,GAAI,IACJsoC,gBAAiB,IACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,KACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElB+lE,EAAG,CACC35F,MAAO,kBACPC,MAAO,KACP6sF,OAAQ,IACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,KACP6sF,OAAQ,GACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,KACP6sF,OAAQ,GACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElB,IAAK,CACD5zB,MAAO,IACPC,MAAO,IACP6sF,MAAO,KACP1/C,MAAO,KACPltC,GAAI,IACJsoC,gBAAiB,IACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,IACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,IACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,MAAO,IACP1/C,MAAO,KACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,KACP6sF,MAAO,IACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,IACPC,MAAO,IACP6sF,MAAO,IACP1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,IACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,IACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,IACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,EACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,EACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,IACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,IACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,MAAO,IACP1/C,MAAO,KACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,MAElB,IAAK,CACD5zB,MAAO,IACPC,MAAO,IACP6sF,MAAO,IACP1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,IACjB5U,aAAc,MAElB,IAAK,CACD5zB,MAAO,IACPC,MAAO,IACP6sF,MAAO,GACP1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,IACjB5U,aAAc,MAElB,IAAK,CACD5zB,MAAO,kBACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,iBACPC,MAAO,mBACP6sF,OAAQ,IACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElB9kB,EAAG,CACC9O,MAAO,GACPC,MAAO,KACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElB5kB,EAAG,CACChP,MAAO,GACPC,MAAO,KACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElBpmB,EAAG,CACCxN,MAAO,GACPC,MAAO,KACP6sF,OAAQ,GACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElBhlB,EAAG,CACC5O,MAAO,GACPC,MAAO,KACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElB7kB,EAAG,CACC/O,MAAO,GACPC,MAAO,KACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElBjmB,EAAG,CACC3N,MAAO,GACPC,MAAO,KACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElBllB,EAAG,CACC1O,MAAO,GACPC,MAAO,KACP6sF,OAAQ,GACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElBtsB,EAAG,CACCtH,MAAO,GACPC,MAAO,KACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElBgmE,EAAG,CACC55F,MAAO,GACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,KAElBimE,EAAG,CACC75F,MAAO,GACPC,MAAO,KACP6sF,OAAQ,GACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElBkmE,EAAG,CACC95F,MAAO,GACPC,MAAO,KACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElBtL,EAAG,CACCtoB,MAAO,GACPC,MAAO,KACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElB3qB,EAAG,CACCjJ,MAAO,GACPC,MAAO,KACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElBmmE,EAAG,CACC/5F,MAAO,GACPC,MAAO,KACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElBomE,EAAG,CACCh6F,MAAO,GACPC,MAAO,KACP6sF,OAAQ,GACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElB3gC,EAAG,CACC+M,MAAO,GACPC,MAAO,KACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElBqmE,EAAG,CACCj6F,MAAO,GACPC,MAAO,KACP6sF,OAAQ,IACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElB3iB,EAAG,CACCjR,MAAO,GACPC,MAAO,KACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElBvsB,EAAG,CACCrH,MAAO,IACPC,MAAO,KACP6sF,OAAQ,GACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,IACjB5U,aAAc,MAElBpsB,EAAG,CACCxH,MAAO,GACPC,MAAO,KACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElBsmE,EAAG,CACCl6F,MAAO,GACPC,MAAO,KACP6sF,OAAQ,GACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElBumE,EAAG,CACCn6F,MAAO,GACPC,MAAO,KACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElBnsB,EAAG,CACCzH,MAAO,GACPC,MAAO,KACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElBziB,EAAG,CACCnR,MAAO,GACPC,MAAO,KACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElBwmE,EAAG,CACCp6F,MAAO,GACPC,MAAO,KACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElBymE,EAAG,CACCr6F,MAAO,GACPC,MAAO,KACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElB,IAAK,CACD5zB,MAAO,IACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,IACjB5U,aAAc,KAElB,KAAM,CACF5zB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,MAAO,IACP1/C,MAAO,KACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB0mE,EAAG,CACCt6F,MAAO,IACPC,MAAO,KACP6sF,OAAQ,IACR1/C,MAAO,EACPltC,GAAI,IACJsoC,gBAAiB,IACjB5U,aAAc,MAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,MAAO,KACP1/C,MAAO,KACPltC,GAAI,IACJsoC,gBAAiB,GACjB5U,aAAc,KAElB3oC,EAAG,CACC+U,MAAO,GACPC,MAAO,KACP6sF,OAAQ,GACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElB1oC,EAAG,CACC8U,OAAQ,GACRC,MAAO,KACP6sF,OAAQ,GACR1/C,MAAO,KACPltC,GAAI,KACJsoC,iBAAkB,GAClB5U,aAAc,MAElBrhC,EAAG,CACCyN,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElBjnC,EAAG,CACCqT,MAAO,GACPC,MAAO,KACP6sF,OAAQ,GACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElB3rC,EAAG,CACC+X,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElB/kC,EAAG,CACCmR,MAAO,GACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,KAElB7rC,EAAG,CACCiY,MAAO,GACPC,MAAO,KACP6sF,OAAQ,IACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElBvkC,EAAG,CACC2Q,MAAO,GACPC,MAAO,KACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElB5kC,EAAG,CACCgR,MAAO,GACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,KAElB6V,EAAG,CACCzpC,OAAQ,GACRC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,KACPltC,GAAI,KACJsoC,iBAAkB,GAClB5U,aAAc,KAElB95B,EAAG,CACCkG,MAAO,GACPC,MAAO,KACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElB2mE,EAAG,CACCv6F,MAAO,GACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,KAElB1qB,EAAG,CACClJ,MAAO,GACPC,MAAO,KACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElBxoC,EAAG,CACC4U,MAAO,GACPC,MAAO,KACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElBlsC,EAAG,CACCsY,MAAO,GACPC,MAAO,KACP6sF,OAAQ,GACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElB6gC,EAAG,CACCz0D,MAAO,GACPC,MAAO,KACP6sF,OAAQ,IACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElBhlC,EAAG,CACCoR,MAAO,GACPC,MAAO,KACP6sF,OAAQ,IACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElBpM,EAAG,CACCxnB,MAAO,GACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,KAElBjlC,EAAG,CACCqR,MAAO,IACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,IACjB5U,aAAc,MAElB1nC,EAAG,CACC8T,MAAO,GACPC,MAAO,IACP6sF,OAAQ,GACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,KAElBlnC,EAAG,CACCsT,MAAO,GACPC,MAAO,KACP6sF,OAAQ,GACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElB+gB,EAAG,CACC30C,MAAO,GACPC,MAAO,KACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElBxkC,EAAG,CACC4Q,MAAO,GACPC,MAAO,KACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElBzpC,EAAG,CACC6V,MAAO,GACPC,MAAO,KACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElBzkC,EAAG,CACC6Q,MAAO,GACPC,MAAO,KACP6sF,OAAQ,IACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElB8gC,EAAG,CACC10D,MAAO,GACPC,MAAO,IACP6sF,MAAO,EACP1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,MAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,IACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,IACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,GACPC,MAAO,IACP6sF,OAAQ,IACR1/C,MAAO,KACPltC,GAAI,KACJsoC,gBAAiB,GACjB5U,aAAc,KAElB,IAAK,CACD5zB,MAAO,IACPC,MAAO,KACP6sF,MAAO,IACP1/C,MAAO,IACPltC,GAAI,IACJsoC,gBAAiB,IACjB5U,aAAc,OAGtBr+B,WAAY,cACZgC,WAAY,KACZ++F,YAAa,4BCv1BbtiG,EAAKsC,KAAK,WAAYs2F,GAAc2J,ICApCviG,EAAKsC,KAAK,SAAUu1F,GAAYa,ICMpC9C,GAAK6Q,aAAa,WAAY,UCNvB,WAEH,CACI,MAAMC,EAAWF,IACX,WAAEjlG,EAAU,WAAEgC,EAAU,OAAEE,GAAWijG,EAC3C1mG,EAAKsC,KAAKf,EAAYmlG,GAGtB,MAAMtoE,EAAe,IACrBT,GAAcgpE,aAAa,CACvB3lG,OAAQO,EACRgC,WAAAA,EACAE,OAAAA,EACA26B,aAAAA,EACAL,YAAY,EACZE,MAAM,EACND,QAAQ,EACRE,kBAAmB,IACnBC,gBAAiB,IACjBL,QAAQ,EACR8oE,YAAa,+DAIrB,CACI,MAAMF,EAAWhB,IACX,WAAEnkG,EAAU,WAAEgC,EAAU,OAAEE,GAAWijG,EAC3C1mG,EAAKsC,KAAKf,EAAYmlG,GAGtB,MAAMtoE,EAAe,IACrBT,GAAcgpE,aAAa,CACvB3lG,OAAQO,EACRgC,WAAAA,EACAE,OAAAA,EACA26B,aAAAA,EACAL,YAAY,EACZE,MAAM,EACND,QAAQ,EACRE,kBAAmB,IACnBC,gBAAiB,IACjBL,QAAQ,EACR8oE,YAAa,qDDnCzBC,GAEA,Y,oBxGLA","sources":["webpack://Vex/webpack/universalModuleDefinition","webpack://Vex/webpack/bootstrap","webpack://Vex/webpack/runtime/define property getters","webpack://Vex/webpack/runtime/global","webpack://Vex/webpack/runtime/hasOwnProperty shorthand","webpack://Vex/./src/typeguard.ts","webpack://Vex/./src/util.ts","webpack://Vex/./src/fraction.ts","webpack://Vex/./src/boundingbox.ts","webpack://Vex/./src/boundingboxcomputation.ts","webpack://Vex/./src/font.ts","webpack://Vex/./src/registry.ts","webpack://Vex/./src/element.ts","webpack://Vex/./src/glyph.ts","webpack://Vex/./src/modifier.ts","webpack://Vex/./src/music.ts","webpack://Vex/./src/tables.ts","webpack://Vex/./src/accidental.ts","webpack://Vex/./src/stem.ts","webpack://Vex/./src/textformatter.ts","webpack://Vex/./src/annotation.ts","webpack://Vex/./src/articulation.ts","webpack://Vex/./src/rendercontext.ts","webpack://Vex/./src/tickable.ts","webpack://Vex/./src/note.ts","webpack://Vex/./src/stavemodifier.ts","webpack://Vex/./src/stavebarline.ts","webpack://Vex/./src/chordsymbol.ts","webpack://Vex/./src/voice.ts","webpack://Vex/./src/barnote.ts","webpack://Vex/./src/bend.ts","webpack://Vex/./src/dot.ts","webpack://Vex/./src/frethandfinger.ts","webpack://Vex/./src/stavetie.ts","webpack://Vex/./src/tabtie.ts","webpack://Vex/./src/gracenotegroup.ts","webpack://Vex/./src/notesubgroup.ts","webpack://Vex/./src/tickcontext.ts","webpack://Vex/./src/ornament.ts","webpack://Vex/./src/parenthesis.ts","webpack://Vex/./src/notehead.ts","webpack://Vex/./src/stemmablenote.ts","webpack://Vex/./src/stavenote.ts","webpack://Vex/./src/web.ts","webpack://Vex/./src/canvascontext.ts","webpack://Vex/./src/svgcontext.ts","webpack://Vex/./src/renderer.ts","webpack://Vex/./src/textnote.ts","webpack://Vex/./src/stavevolta.ts","webpack://Vex/./src/stringnumber.ts","webpack://Vex/./src/strokes.ts","webpack://Vex/./src/vibrato.ts","webpack://Vex/./src/modifiercontext.ts","webpack://Vex/./src/clef.ts","webpack://Vex/./src/keysignature.ts","webpack://Vex/./src/staverepetition.ts","webpack://Vex/./src/stavesection.ts","webpack://Vex/./src/stavetempo.ts","webpack://Vex/./src/stavetext.ts","webpack://Vex/./src/timesigglyph.ts","webpack://Vex/./src/timesignature.ts","webpack://Vex/./src/stave.ts","webpack://Vex/./src/staveconnector.ts","webpack://Vex/./src/formatter.ts","webpack://Vex/./src/tuplet.ts","webpack://Vex/./src/beam.ts","webpack://Vex/./src/clefnote.ts","webpack://Vex/./src/crescendo.ts","webpack://Vex/./src/curve.ts","webpack://Vex/./src/parser.ts","webpack://Vex/./src/easyscore.ts","webpack://Vex/./src/ghostnote.ts","webpack://Vex/./src/glyphnote.ts","webpack://Vex/./src/gracenote.ts","webpack://Vex/./src/keysignote.ts","webpack://Vex/./src/multimeasurerest.ts","webpack://Vex/./src/pedalmarking.ts","webpack://Vex/./src/repeatnote.ts","webpack://Vex/./src/staveline.ts","webpack://Vex/./src/system.ts","webpack://Vex/./src/tabnote.ts","webpack://Vex/./src/tabstave.ts","webpack://Vex/./src/textbracket.ts","webpack://Vex/./src/textdynamics.ts","webpack://Vex/./src/timesignote.ts","webpack://Vex/./src/vibratobracket.ts","webpack://Vex/./src/factory.ts","webpack://Vex/./src/stavehairpin.ts","webpack://Vex/./src/tabslide.ts","webpack://Vex/./src/tuning.ts","webpack://Vex/./src/flow.ts","webpack://Vex/./src/version.ts","webpack://Vex/./src/gracetabnote.ts","webpack://Vex/./src/keymanager.ts","webpack://Vex/./src/tremolo.ts","webpack://Vex/./src/vex.ts","webpack://Vex/./src/fonts/custom_glyphs.ts","webpack://Vex/./src/fonts/custom_metrics.ts","webpack://Vex/./src/fonts/petaluma_glyphs.ts","webpack://Vex/./src/fonts/petaluma_metrics.ts","webpack://Vex/./src/fonts/petalumascript_glyphs.ts","webpack://Vex/./src/fonts/robotoslab_glyphs.ts","webpack://Vex/./src/fonts/load_petaluma.ts","webpack://Vex/./src/fonts/load_custom.ts","webpack://Vex/./entry/vexflow-petaluma.ts","webpack://Vex/./src/fonts/textfonts.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Vex\"] = factory();\n\telse\n\t\troot[\"Vex\"] = factory();\n})((typeof window !== 'undefined' ? window : typeof globalThis !== 'undefined' ? globalThis : this), function() {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Ron B. Yeh\n// MIT License\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * Use instead of `instanceof` as a more flexible type guard.\n * @param obj check if this object's CATEGORY matches the provided category.\n * @param category a string representing a category of VexFlow objects.\n * @param checkAncestors defaults to `true`, so we walk up the prototype chain to look for a matching `CATEGORY`.\n * If `false`, we do not check the superclass or other ancestors.\n * @returns true if `obj` has a static `CATEGORY` property that matches `category`.\n */\nexport function isCategory(obj, category, checkAncestors = true) {\n // obj is undefined, a number, a primitive string, or null.\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n // `obj.constructor` is a reference to the constructor function that created the `obj` instance.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor\n let constructorFcn = obj.constructor;\n // Check if the object's static .CATEGORY matches the provided category.\n if (checkAncestors) {\n // Walk up the prototype chain to look for a matching obj.constructor.CATEGORY.\n while (obj !== null) {\n constructorFcn = obj.constructor;\n if ('CATEGORY' in constructorFcn && constructorFcn.CATEGORY === category) {\n return true;\n }\n obj = Object.getPrototypeOf(obj);\n }\n return false;\n }\n else {\n // Do not walk up the prototype chain. Just check this particular object's static .CATEGORY string.\n return 'CATEGORY' in constructorFcn && constructorFcn.CATEGORY === category;\n }\n}\nexport const isAccidental = (obj) => isCategory(obj, Category.Accidental);\nexport const isAnnotation = (obj) => isCategory(obj, Category.Annotation);\nexport const isBarline = (obj) => isCategory(obj, Category.Barline);\nexport const isDot = (obj) => isCategory(obj, Category.Dot);\nexport const isGraceNote = (obj) => isCategory(obj, Category.GraceNote);\nexport const isGraceNoteGroup = (obj) => isCategory(obj, Category.GraceNoteGroup);\nexport const isNote = (obj) => isCategory(obj, Category.Note);\nexport const isRenderContext = (obj) => isCategory(obj, Category.RenderContext);\nexport const isStaveNote = (obj) => isCategory(obj, Category.StaveNote);\nexport const isStemmableNote = (obj) => isCategory(obj, Category.StemmableNote);\nexport const isTabNote = (obj) => isCategory(obj, Category.TabNote);\n// 'const' enums are erased by the TypeScript compiler. The string values are inlined at all the use sites.\n// See: https://www.typescriptlang.org/docs/handbook/enums.html#const-enums\nexport var Category;\n(function (Category) {\n Category[\"Accidental\"] = \"Accidental\";\n Category[\"Annotation\"] = \"Annotation\";\n Category[\"Articulation\"] = \"Articulation\";\n Category[\"Barline\"] = \"Barline\";\n Category[\"BarNote\"] = \"BarNote\";\n Category[\"Beam\"] = \"Beam\";\n Category[\"Bend\"] = \"Bend\";\n Category[\"ChordSymbol\"] = \"ChordSymbol\";\n Category[\"Clef\"] = \"Clef\";\n Category[\"ClefNote\"] = \"ClefNote\";\n Category[\"Crescendo\"] = \"Crescendo\";\n Category[\"Curve\"] = \"Curve\";\n Category[\"Dot\"] = \"Dot\";\n Category[\"Element\"] = \"Element\";\n Category[\"Fraction\"] = \"Fraction\";\n Category[\"FretHandFinger\"] = \"FretHandFinger\";\n Category[\"GhostNote\"] = \"GhostNote\";\n Category[\"Glyph\"] = \"Glyph\";\n Category[\"GlyphNote\"] = \"GlyphNote\";\n Category[\"GraceNote\"] = \"GraceNote\";\n Category[\"GraceNoteGroup\"] = \"GraceNoteGroup\";\n Category[\"GraceTabNote\"] = \"GraceTabNote\";\n Category[\"KeySignature\"] = \"KeySignature\";\n Category[\"KeySigNote\"] = \"KeySigNote\";\n Category[\"Modifier\"] = \"Modifier\";\n Category[\"MultiMeasureRest\"] = \"MultiMeasureRest\";\n Category[\"Note\"] = \"Note\";\n Category[\"NoteHead\"] = \"NoteHead\";\n Category[\"NoteSubGroup\"] = \"NoteSubGroup\";\n Category[\"Ornament\"] = \"Ornament\";\n Category[\"Parenthesis\"] = \"Parenthesis\";\n Category[\"PedalMarking\"] = \"PedalMarking\";\n Category[\"RenderContext\"] = \"RenderContext\";\n Category[\"RepeatNote\"] = \"RepeatNote\";\n Category[\"Repetition\"] = \"Repetition\";\n Category[\"Stave\"] = \"Stave\";\n Category[\"StaveConnector\"] = \"StaveConnector\";\n Category[\"StaveHairpin\"] = \"StaveHairpin\";\n Category[\"StaveLine\"] = \"StaveLine\";\n Category[\"StaveModifier\"] = \"StaveModifier\";\n Category[\"StaveNote\"] = \"StaveNote\";\n Category[\"StaveSection\"] = \"StaveSection\";\n Category[\"StaveTempo\"] = \"StaveTempo\";\n Category[\"StaveText\"] = \"StaveText\";\n Category[\"StaveTie\"] = \"StaveTie\";\n Category[\"Stem\"] = \"Stem\";\n Category[\"StemmableNote\"] = \"StemmableNote\";\n Category[\"StringNumber\"] = \"StringNumber\";\n Category[\"Stroke\"] = \"Stroke\";\n Category[\"System\"] = \"System\";\n Category[\"TabNote\"] = \"TabNote\";\n Category[\"TabSlide\"] = \"TabSlide\";\n Category[\"TabStave\"] = \"TabStave\";\n Category[\"TabTie\"] = \"TabTie\";\n Category[\"TextBracket\"] = \"TextBracket\";\n Category[\"TextDynamics\"] = \"TextDynamics\";\n Category[\"TextNote\"] = \"TextNote\";\n Category[\"Tickable\"] = \"Tickable\";\n Category[\"TimeSignature\"] = \"TimeSignature\";\n Category[\"TimeSigNote\"] = \"TimeSigNote\";\n Category[\"Tremolo\"] = \"Tremolo\";\n Category[\"Tuplet\"] = \"Tuplet\";\n Category[\"Vibrato\"] = \"Vibrato\";\n Category[\"VibratoBracket\"] = \"VibratoBracket\";\n Category[\"Voice\"] = \"Voice\";\n Category[\"Volta\"] = \"Volta\";\n})(Category || (Category = {}));\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// Note: Keep this module free of imports to reduce the chance of circular dependencies.\n/** `RuntimeError` will be thrown by VexFlow classes in case of error. */\nexport class RuntimeError extends Error {\n constructor(code, message = '') {\n super('[RuntimeError] ' + code + ': ' + message);\n this.code = code;\n }\n}\n/** VexFlow can be used outside of the browser (e.g., Node) where `window` may not be defined. */\n// eslint-disable-next-line\nexport function globalObject() {\n if (typeof globalThis !== 'undefined') {\n return globalThis;\n }\n if (typeof self !== 'undefined') {\n return self;\n }\n if (typeof window !== 'undefined') {\n return window;\n }\n if (typeof global !== 'undefined') {\n return global;\n }\n return Function('return this')();\n}\n/**\n * Check that `x` is of type `T` and not `undefined`.\n * If `x` is `undefined`, throw a RuntimeError with the optionally provided error code and message.\n */\nexport function defined(x, code = 'undefined', message = '') {\n if (x === undefined) {\n throw new RuntimeError(code, message);\n }\n return x;\n}\n/** Default log function sends all arguments to console. */\n// eslint-disable-next-line\nexport function log(block, ...args) {\n if (!args)\n return;\n const line = Array.prototype.slice.call(args).join(' ');\n globalObject().console.log(block + ': ' + line);\n}\n/** Dump warning to console. */\n// eslint-disable-next-line\nexport function warn(...args) {\n const line = args.join(' ');\n const err = new Error();\n globalObject().console.log('Warning: ', line, err.stack);\n}\n/** Round number to nearest fractional value (`.5`, `.25`, etc.) */\nfunction roundN(x, n) {\n return x % n >= n / 2 ? parseInt(`${x / n}`, 10) * n + n : parseInt(`${x / n}`, 10) * n;\n}\n/** Locate the mid point between stave lines. Returns a fractional line if a space. */\nexport function midLine(a, b) {\n let mid_line = b + (a - b) / 2;\n if (mid_line % 2 > 0) {\n mid_line = roundN(mid_line * 10, 5) / 10;\n }\n return mid_line;\n}\n/**\n * Used by various classes (e.g., SVGContext) to provide a\n * unique prefix to element names (or other keys in shared namespaces).\n */\nexport function prefix(text) {\n return `vf-${text}`;\n}\n/**\n * Convert an arbitrary angle in radians to the equivalent one in the range [0, pi).\n */\nexport function normalizeAngle(a) {\n a = a % (2 * Math.PI);\n if (a < 0) {\n a += 2 * Math.PI;\n }\n return a;\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Author: Joshua Koo / @zz85\n// Author: @incompleteopus\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\n/** Fraction represents a rational number. */\nexport class Fraction {\n /** Set the numerator and denominator. */\n constructor(numerator, denominator) {\n this.numerator = 1;\n this.denominator = 1;\n this.set(numerator, denominator);\n }\n static get CATEGORY() {\n return Category.Fraction;\n }\n /**\n * GCD: Greatest common divisor using the Euclidean algorithm.\n * Note: GCD(0, 0) => 0 and GCD(0, n) => n.\n */\n static GCD(a, b) {\n if (typeof a !== 'number' || Number.isNaN(a) || typeof b !== 'number' || Number.isNaN(b)) {\n throw new RuntimeError('BadArgument', `Invalid numbers: ${a}, ${b}`);\n }\n let t;\n while (b !== 0) {\n t = b;\n b = a % b;\n a = t;\n }\n return a;\n }\n /** LCM: Lowest common multiple. */\n static LCM(a, b) {\n return (a * b) / Fraction.GCD(a, b);\n }\n /** Lowest common multiple for more than two numbers. */\n static LCMM(args) {\n if (args.length === 0) {\n return 0;\n }\n else if (args.length === 1) {\n return args[0];\n }\n else if (args.length === 2) {\n return Fraction.LCM(args[0], args[1]);\n }\n else {\n // args.shift() removes the first number.\n // LCM the first number with the rest of the numbers.\n return Fraction.LCM(args.shift(), Fraction.LCMM(args));\n }\n }\n /** Set the numerator and denominator. */\n set(numerator = 1, denominator = 1) {\n this.numerator = numerator;\n this.denominator = denominator;\n return this;\n }\n /** Return the value of the fraction. */\n value() {\n return this.numerator / this.denominator;\n }\n /** Simplify numerator and denominator using GCD. */\n simplify() {\n let u = this.numerator;\n let d = this.denominator;\n const gcd = Fraction.GCD(u, d);\n u /= gcd;\n d /= gcd;\n if (d < 0) {\n d = -d;\n u = -u;\n }\n return this.set(u, d);\n }\n /** Add value of another fraction. */\n add(param1 = 0, param2 = 1) {\n const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2);\n const lcm = Fraction.LCM(this.denominator, otherDenominator);\n const a = lcm / this.denominator;\n const b = lcm / otherDenominator;\n const u = this.numerator * a + otherNumerator * b;\n return this.set(u, lcm);\n }\n /** Substract value of another fraction. */\n subtract(param1 = 0, param2 = 1) {\n const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2);\n const lcm = Fraction.LCM(this.denominator, otherDenominator);\n const a = lcm / this.denominator;\n const b = lcm / otherDenominator;\n const u = this.numerator * a - otherNumerator * b;\n return this.set(u, lcm);\n }\n /** Multiply by value of another fraction. */\n multiply(param1 = 1, param2 = 1) {\n const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2);\n return this.set(this.numerator * otherNumerator, this.denominator * otherDenominator);\n }\n /** Divide by value of another Fraction. */\n divide(param1 = 1, param2 = 1) {\n const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2);\n return this.set(this.numerator * otherDenominator, this.denominator * otherNumerator);\n }\n /** Simplify both sides and check if they are equal. */\n equals(compare) {\n const a = Fraction.__staticFractionA.copy(compare).simplify();\n const b = Fraction.__staticFractionB.copy(this).simplify();\n return a.numerator === b.numerator && a.denominator === b.denominator;\n }\n /** Greater than operator. */\n greaterThan(compare) {\n const a = Fraction.__staticFractionB.copy(this);\n a.subtract(compare);\n return a.numerator > 0;\n }\n /** Greater than or equals operator. */\n greaterThanEquals(compare) {\n const a = Fraction.__staticFractionB.copy(this);\n a.subtract(compare);\n return a.numerator >= 0;\n }\n /** Less than operator. */\n lessThan(compare) {\n return !this.greaterThanEquals(compare);\n }\n /** Less than or equals operator. */\n lessThanEquals(compare) {\n return !this.greaterThan(compare);\n }\n /** Return a new copy with current values. */\n clone() {\n return new Fraction(this.numerator, this.denominator);\n }\n /** Copy value of another fraction. */\n copy(other) {\n if (typeof other === 'number') {\n return this.set(other, 1);\n }\n else {\n return this.set(other.numerator, other.denominator);\n }\n }\n /** Return the integer component (eg. 5/2 => 2). */\n quotient() {\n return Math.floor(this.numerator / this.denominator);\n }\n /** Return the remainder component (eg. 5/2 => 1). */\n remainder() {\n return this.numerator % this.denominator;\n }\n /** Calculate absolute value. */\n makeAbs() {\n this.denominator = Math.abs(this.denominator);\n this.numerator = Math.abs(this.numerator);\n return this;\n }\n /** Return a raw string representation (eg. \"5/2\"). */\n toString() {\n return `${this.numerator}/${this.denominator}`;\n }\n /** Return a simplified string respresentation. */\n toSimplifiedString() {\n return Fraction.__staticFractionTmp.copy(this).simplify().toString();\n }\n /** Return string representation in mixed form. */\n toMixedString() {\n let s = '';\n const q = this.quotient();\n const f = Fraction.__staticFractionTmp.copy(this);\n if (q < 0) {\n f.makeAbs();\n }\n if (q !== 0) {\n s += q;\n if (f.numerator !== 0) {\n s += ` ${f.toSimplifiedString()}`;\n }\n }\n else if (f.numerator === 0) {\n s = '0';\n }\n else {\n s = f.toSimplifiedString();\n }\n return s;\n }\n /** Parse a fraction string. */\n parse(str) {\n const i = str.split('/');\n const n = parseInt(i[0], 10);\n const d = i[1] ? parseInt(i[1], 10) : 1;\n return this.set(n, d);\n }\n}\n// Cached objects for comparisons.\nFraction.__staticFractionA = new Fraction();\nFraction.__staticFractionB = new Fraction();\nFraction.__staticFractionTmp = new Fraction();\n/** Helper function to extract the numerator and denominator from another fraction. */\nfunction getNumeratorAndDenominator(n, d = 1) {\n if (typeof n === 'number') {\n // Both params are numbers, so we return them as [numerator, denominator].\n return [n, d];\n }\n else {\n // First param is a Fraction object. We ignore the second param.\n return [n.numerator, n.denominator];\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nexport class BoundingBox {\n constructor(x, y, w, h) {\n this.x = x;\n this.y = y;\n this.w = w;\n this.h = h;\n }\n /**\n * Create a new copy.\n */\n static copy(that) {\n return new BoundingBox(that.x, that.y, that.w, that.h);\n }\n /** Get x position. */\n getX() {\n return this.x;\n }\n /** Get y position. */\n getY() {\n return this.y;\n }\n /** Get width. */\n getW() {\n return this.w;\n }\n /** Get height. */\n getH() {\n return this.h;\n }\n /** Set x position. */\n setX(x) {\n this.x = x;\n return this;\n }\n /** Set y position. */\n setY(y) {\n this.y = y;\n return this;\n }\n /** Set width. */\n setW(w) {\n this.w = w;\n return this;\n }\n /** Set height. */\n setH(h) {\n this.h = h;\n return this;\n }\n /** Move to position. */\n move(x, y) {\n this.x += x;\n this.y += y;\n return this;\n }\n /** Clone. */\n clone() {\n return BoundingBox.copy(this);\n }\n /**\n * Merge my box with given box. Creates a bigger bounding box unless\n * the given box is contained in this one.\n */\n mergeWith(boundingBox) {\n const that = boundingBox;\n const new_x = this.x < that.x ? this.x : that.x;\n const new_y = this.y < that.y ? this.y : that.y;\n const new_w = Math.max(this.x + this.w, that.x + that.w) - new_x;\n const new_h = Math.max(this.y + this.h, that.y + that.h) - new_y;\n this.x = new_x;\n this.y = new_y;\n this.w = new_w;\n this.h = new_h;\n return this;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n/**\n * BoundingBoxComputation computes metrics for a bounding box by continuously\n * taking canvas path commands.\n *\n * Warning: This class is merely a crutch to get bounding box information without\n * explicit metadata. This is likely to get deprecated following SMuFL support.\n *\n * based on: https://github.com/canvg/canvg/blob/master/src/BoundingBox.ts (MIT License)\n */\nexport class BoundingBoxComputation {\n constructor() {\n this.x1 = Number.NaN;\n this.y1 = Number.NaN;\n this.x2 = Number.NaN;\n this.y2 = Number.NaN;\n }\n /** Get calculated X1. */\n getX1() {\n return this.x1;\n }\n /** Get calculated Y1. */\n getY1() {\n return this.y1;\n }\n /** Get calculated width. */\n width() {\n return this.x2 - this.x1;\n }\n /** Get calculated height. */\n height() {\n return this.y2 - this.y1;\n }\n /** Add point to BoundingBox. */\n addPoint(x, y) {\n if (isNaN(this.x1) || x < this.x1)\n this.x1 = x;\n if (isNaN(this.x2) || x > this.x2)\n this.x2 = x;\n if (isNaN(this.y1) || y < this.y1)\n this.y1 = y;\n if (isNaN(this.y2) || y > this.y2)\n this.y2 = y;\n }\n /** Add X to BoundingBox. */\n addX(x) {\n this.addPoint(x, this.y1);\n }\n /** Add Y to BoundingBox. */\n addY(y) {\n this.addPoint(this.x1, y);\n }\n /** Add quadratic curve to BoundingBox. */\n addQuadraticCurve(p0x, p0y, p1x, p1y, p2x, p2y) {\n this.addPoint(p0x, p0y);\n this.addPoint(p2x, p2y);\n const p01x = p1x - p0x;\n const p12x = p2x - p1x;\n let denom = p01x - p12x;\n if (denom != 0) {\n const t = p01x / denom;\n if (t > 0 && t < 1) {\n const it = 1 - t;\n this.addX(it * it * p0x + 2 * it * t * p1x + t * t * p2x);\n }\n }\n const p01y = p1y - p0y;\n const p12y = p2y - p1y;\n denom = p01y - p12y;\n if (denom != 0) {\n const t = p01y / denom;\n if (t > 0 && t < 1) {\n const it = 1 - t;\n this.addY(it * it * p0y + 2 * it * t * p1y + t * t * p2y);\n }\n }\n }\n /** Add bezier curve to BoundingBox. */\n addBezierCurve(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) {\n // from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html\n const p0 = [p0x, p0y];\n const p1 = [p1x, p1y];\n const p2 = [p2x, p2y];\n const p3 = [p3x, p3y];\n let i;\n this.addPoint(p0[0], p0[1]);\n this.addPoint(p3[0], p3[1]);\n const f = (t, i) => Math.pow(1 - t, 3) * p0[i] +\n 3 * Math.pow(1 - t, 2) * t * p1[i] +\n 3 * (1 - t) * Math.pow(t, 2) * p2[i] +\n Math.pow(t, 3) * p3[i];\n for (i = 0; i <= 1; i++) {\n const b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i];\n const a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i];\n const c = 3 * p1[i] - 3 * p0[i];\n if (a === 0) {\n if (b === 0)\n continue;\n const t = -c / b;\n if (0 < t && t < 1) {\n if (i === 0)\n this.addX(f(t, i));\n if (i === 1)\n this.addY(f(t, i));\n }\n continue;\n }\n const b2ac = Math.pow(b, 2) - 4 * c * a;\n if (b2ac < 0)\n continue;\n const t1 = (-b + Math.sqrt(b2ac)) / (2 * a);\n if (0 < t1 && t1 < 1) {\n if (i === 0)\n this.addX(f(t1, i));\n if (i === 1)\n this.addY(f(t1, i));\n }\n const t2 = (-b - Math.sqrt(b2ac)) / (2 * a);\n if (0 < t2 && t2 < 1) {\n if (i === 0)\n this.addX(f(t2, i));\n if (i === 1)\n this.addY(f(t2, i));\n }\n }\n }\n}\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { defined } from './util';\nexport var FontWeight;\n(function (FontWeight) {\n FontWeight[\"NORMAL\"] = \"normal\";\n FontWeight[\"BOLD\"] = \"bold\";\n})(FontWeight || (FontWeight = {}));\nexport var FontStyle;\n(function (FontStyle) {\n FontStyle[\"NORMAL\"] = \"normal\";\n FontStyle[\"ITALIC\"] = \"italic\";\n})(FontStyle || (FontStyle = {}));\n// Internal element for parsing CSS font shorthand strings.\nlet fontParser;\nconst Fonts = {};\nexport class Font {\n /**\n * Use `Font.load(fontName)` to get a Font object.\n * Do not call this constructor directly.\n */\n constructor(fontName) {\n this.name = fontName;\n }\n /**\n * @param fontSize a font size to convert. Can be specified as a CSS length string (e.g., '16pt', '1em')\n * or as a number (the unit is assumed to be 'pt'). See `Font.scaleToPxFrom` for the supported\n * units (e.g., pt, em, %).\n * @returns the number of pixels that is equivalent to `fontSize`\n */\n static convertSizeToPixelValue(fontSize = Font.SIZE) {\n var _a;\n if (typeof fontSize === 'number') {\n // Assume the numeric fontSize is specified in pt.\n return fontSize * Font.scaleToPxFrom.pt;\n }\n else {\n const value = parseFloat(fontSize);\n if (isNaN(value)) {\n return 0;\n }\n const unit = fontSize.replace(/[\\d.\\s]/g, '').toLowerCase(); // Extract the unit by removing all numbers, dots, spaces.\n const conversionFactor = (_a = Font.scaleToPxFrom[unit]) !== null && _a !== void 0 ? _a : 1;\n return value * conversionFactor;\n }\n }\n /**\n * @param fontSize a font size to convert. Can be specified as a CSS length string (e.g., '16pt', '1em')\n * or as a number (the unit is assumed to be 'pt'). See `Font.scaleToPxFrom` for the supported\n * units (e.g., pt, em, %).\n * @returns the number of points that is equivalent to `fontSize`\n */\n static convertSizeToPointValue(fontSize = Font.SIZE) {\n var _a;\n if (typeof fontSize === 'number') {\n // Assume the numeric fontSize is specified in pt.\n return fontSize;\n }\n else {\n const value = parseFloat(fontSize);\n if (isNaN(value)) {\n return 0;\n }\n const unit = fontSize.replace(/[\\d.\\s]/g, '').toLowerCase(); // Extract the unit by removing all numbers, dots, spaces.\n const conversionFactor = ((_a = Font.scaleToPxFrom[unit]) !== null && _a !== void 0 ? _a : 1) / Font.scaleToPxFrom.pt;\n return value * conversionFactor;\n }\n }\n /**\n * @param f\n * @param size\n * @param weight\n * @param style\n * @returns the `size` field will include the units (e.g., '12pt', '16px').\n */\n static validate(f, size, weight, style) {\n // If f is a string but all other arguments are undefined, we assume that\n // f is CSS font shorthand (e.g., 'italic bold 10pt Arial').\n if (typeof f === 'string' && size === undefined && weight === undefined && style === undefined) {\n return Font.fromCSSString(f);\n }\n let family;\n if (typeof f === 'object') {\n // f is a FontInfo object, so we extract its fields.\n family = f.family;\n size = f.size;\n weight = f.weight;\n style = f.style;\n }\n else {\n // f is a string representing the font family name or undefined.\n family = f;\n }\n family = family !== null && family !== void 0 ? family : Font.SANS_SERIF;\n size = size !== null && size !== void 0 ? size : Font.SIZE + 'pt';\n weight = weight !== null && weight !== void 0 ? weight : FontWeight.NORMAL;\n style = style !== null && style !== void 0 ? style : FontStyle.NORMAL;\n if (weight === '') {\n weight = FontWeight.NORMAL;\n }\n if (style === '') {\n style = FontStyle.NORMAL;\n }\n // If size is a number, we assume the unit is `pt`.\n if (typeof size === 'number') {\n size = `${size}pt`;\n }\n // If weight is a number (e.g., 900), turn it into a string representation of that number.\n if (typeof weight === 'number') {\n weight = weight.toString();\n }\n // At this point, `family`, `size`, `weight`, and `style` are all strings.\n return { family, size, weight, style };\n }\n /**\n * @param cssFontShorthand a string formatted as CSS font shorthand (e.g., 'italic bold 15pt Arial').\n */\n static fromCSSString(cssFontShorthand) {\n // Let the browser parse this string for us.\n // First, create a span element.\n // Then, set its style.font and extract it back out.\n if (!fontParser) {\n fontParser = document.createElement('span');\n }\n fontParser.style.font = cssFontShorthand;\n const { fontFamily, fontSize, fontWeight, fontStyle } = fontParser.style;\n return { family: fontFamily, size: fontSize, weight: fontWeight, style: fontStyle };\n }\n /**\n * @returns a CSS font shorthand string of the form `italic bold 16pt Arial`.\n */\n static toCSSString(fontInfo) {\n var _a;\n if (!fontInfo) {\n return '';\n }\n let style;\n const st = fontInfo.style;\n if (st === FontStyle.NORMAL || st === '' || st === undefined) {\n style = ''; // no space! Omit the style section.\n }\n else {\n style = st.trim() + ' ';\n }\n let weight;\n const wt = fontInfo.weight;\n if (wt === FontWeight.NORMAL || wt === '' || wt === undefined) {\n weight = ''; // no space! Omit the weight section.\n }\n else if (typeof wt === 'number') {\n weight = wt + ' ';\n }\n else {\n weight = wt.trim() + ' ';\n }\n let size;\n const sz = fontInfo.size;\n if (sz === undefined) {\n size = Font.SIZE + 'pt ';\n }\n else if (typeof sz === 'number') {\n size = sz + 'pt ';\n }\n else {\n // size is already a string.\n size = sz.trim() + ' ';\n }\n const family = (_a = fontInfo.family) !== null && _a !== void 0 ? _a : Font.SANS_SERIF;\n return `${style}${weight}${size}${family}`;\n }\n /**\n * @param fontSize a number representing a font size, or a string font size with units.\n * @param scaleFactor multiply the size by this factor.\n * @returns size * scaleFactor (e.g., 16pt * 3 = 48pt, 8px * 0.5 = 4px, 24 * 2 = 48).\n * If the fontSize argument was a number, the return value will be a number.\n * If the fontSize argument was a string, the return value will be a string.\n */\n static scaleSize(fontSize, scaleFactor) {\n if (typeof fontSize === 'number') {\n return (fontSize * scaleFactor);\n }\n else {\n const value = parseFloat(fontSize);\n const unit = fontSize.replace(/[\\d.\\s]/g, ''); // Remove all numbers, dots, spaces.\n return `${value * scaleFactor}${unit}`;\n }\n }\n /**\n * @param weight a string (e.g., 'bold') or a number (e.g., 600 / semi-bold in the OpenType spec).\n * @returns true if the font weight indicates bold.\n */\n static isBold(weight) {\n if (!weight) {\n return false;\n }\n else if (typeof weight === 'number') {\n return weight >= 600;\n }\n else {\n // a string can be 'bold' or '700'\n const parsedWeight = parseInt(weight, 10);\n if (isNaN(parsedWeight)) {\n return weight.toLowerCase() === 'bold';\n }\n else {\n return parsedWeight >= 600;\n }\n }\n }\n /**\n * @param style\n * @returns true if the font style indicates 'italic'.\n */\n static isItalic(style) {\n if (!style) {\n return false;\n }\n else {\n return style.toLowerCase() === FontStyle.ITALIC;\n }\n }\n /**\n * @param fontName\n * @param woffURL The absolute or relative URL to the woff file.\n * @param includeWoff2 If true, we assume that a woff2 file is in\n * the same folder as the woff file, and will append a `2` to the url.\n */\n // Support distributions of the typescript compiler that do not yet include the FontFace API declarations.\n // eslint-disable-next-line\n // @ts-ignore\n static loadWebFont(fontName, woffURL, includeWoff2 = true) {\n return __awaiter(this, void 0, void 0, function* () {\n const woff2URL = includeWoff2 ? `url(${woffURL}2) format('woff2'), ` : '';\n const woff1URL = `url(${woffURL}) format('woff')`;\n const woffURLs = woff2URL + woff1URL;\n // eslint-disable-next-line\n // @ts-ignore\n const fontFace = new FontFace(fontName, woffURLs);\n yield fontFace.load();\n // eslint-disable-next-line\n // @ts-ignore\n document.fonts.add(fontFace);\n return fontFace;\n });\n }\n /**\n * Load the web fonts that are used by ChordSymbol. For example, `flow.html` calls:\n * `await Vex.Flow.Font.loadWebFonts();`\n * Alternatively, you may load web fonts with a stylesheet link (e.g., from Google Fonts),\n * and a @font-face { font-family: ... } rule in your CSS.\n * If you do not load either of these fonts, ChordSymbol will fall back to Times or Arial,\n * depending on the current music engraving font.\n *\n * You can customize `Font.WEB_FONT_HOST` and `Font.WEB_FONT_FILES` to load different fonts\n * for your app.\n */\n static loadWebFonts() {\n return __awaiter(this, void 0, void 0, function* () {\n const host = Font.WEB_FONT_HOST;\n const files = Font.WEB_FONT_FILES;\n for (const fontName in files) {\n const fontPath = files[fontName];\n Font.loadWebFont(fontName, host + fontPath);\n }\n });\n }\n static loadTextFonts() {\n //\n }\n /**\n * @param fontName\n * @param data optionally set the Font object's `.data` property.\n * This is usually done when setting up a font for the first time.\n * @param metrics optionally set the Font object's `.metrics` property.\n * This is usually done when setting up a font for the first time.\n * @returns a Font object with the given `fontName`.\n * Reuse an existing Font object if a matching one is found.\n */\n static load(fontName, data, metrics) {\n let font = Fonts[fontName];\n if (!font) {\n font = new Font(fontName);\n Fonts[fontName] = font;\n }\n if (data) {\n font.setData(data);\n }\n if (metrics) {\n font.setMetrics(metrics);\n }\n return font;\n }\n getName() {\n return this.name;\n }\n getData() {\n return defined(this.data, 'FontError', 'Missing font data');\n }\n getMetrics() {\n return defined(this.metrics, 'FontError', 'Missing metrics');\n }\n setData(data) {\n this.data = data;\n }\n setMetrics(metrics) {\n this.metrics = metrics;\n }\n hasData() {\n return this.data !== undefined;\n }\n getResolution() {\n return this.getData().resolution;\n }\n getGlyphs() {\n return this.getData().glyphs;\n }\n /**\n * Use the provided key to look up a value in this font's metrics file (e.g., bravura_metrics.ts, petaluma_metrics.ts).\n * @param key is a string separated by periods (e.g., stave.endPaddingMax, clef.lineCount.'5'.shiftY).\n * @param defaultValue is returned if the lookup fails.\n * @returns the retrieved value (or `defaultValue` if the lookup fails).\n */\n // eslint-disable-next-line\n lookupMetric(key, defaultValue) {\n const keyParts = key.split('.');\n // Start with the top level font metrics object, and keep looking deeper into the object (via each part of the period-delimited key).\n let currObj = this.getMetrics();\n for (let i = 0; i < keyParts.length; i++) {\n const keyPart = keyParts[i];\n const value = currObj[keyPart];\n if (value === undefined) {\n // If the key lookup fails, we fall back to the defaultValue.\n return defaultValue;\n }\n // The most recent lookup succeeded, so we drill deeper into the object.\n currObj = value;\n }\n // After checking every part of the key (i.e., the loop completed), return the most recently retrieved value.\n return currObj;\n }\n /** For debugging. */\n toString() {\n return '[' + this.name + ' Font]';\n }\n}\n//////////////////////////////////////////////////////////////////////////////////////////////////\n// STATIC MEMBERS\n/** Default sans-serif font family. */\nFont.SANS_SERIF = 'Arial, sans-serif';\n/** Default serif font family. */\nFont.SERIF = 'Times New Roman, serif';\n/** Default font size in `pt`. */\nFont.SIZE = 10;\n// CSS Font Sizes: 36pt == 48px == 3em == 300% == 0.5in\n/** Given a length (for units: pt, px, em, %, in, mm, cm) what is the scale factor to convert it to px? */\nFont.scaleToPxFrom = {\n pt: 4 / 3,\n px: 1,\n em: 16,\n '%': 4 / 25,\n in: 96,\n mm: 96 / 25.4,\n cm: 96 / 2.54,\n};\n/**\n * Customize this field to specify a different CDN for delivering web fonts.\n * Alternative: https://cdn.jsdelivr.net/npm/vexflow-fonts@1.0.3/\n * Or you can use your own host.\n */\nFont.WEB_FONT_HOST = 'https://unpkg.com/vexflow-fonts@1.0.3/';\n/**\n * These font files will be loaded from the CDN specified by `Font.WEB_FONT_HOST` when\n * `await Font.loadWebFonts()` is called. Customize this field to specify a different\n * set of fonts to load. See: `Font.loadWebFonts()`.\n */\nFont.WEB_FONT_FILES = {\n 'Roboto Slab': 'robotoslab/RobotoSlab-Medium_2.001.woff',\n PetalumaScript: 'petaluma/PetalumaScript_1.10_FS.woff',\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Mohit Cheppudira\n//\n// ## Description\n//\n// This file implements a registry for VexFlow elements. It allows users\n// to track, query, and manage some subset of generated elements, and\n// dynamically get and set attributes.\n//\n// There are two ways to register with a registry:\n//\n// 1) Explicitly call `registry.register(elem:Element, id?:string)`, or,\n// 2) Call `Registry.enableDefaultRegistry(registry)` when ready, and all future\n// elements will automatically register with it.\n//\n// Once an element is registered, selected attributes are tracked and indexed by\n// the registry. This allows fast look up of elements by attributes like id, type,\n// and class.\nimport { RuntimeError } from './util';\n// Indexes are represented as maps of maps of maps. This allows\n// for both multi-labeling (e.g., an element can have multiple classes)\n// and efficient lookup.\nclass Index {\n constructor() {\n this.id = {};\n this.type = {};\n this.class = {};\n }\n}\nexport class Registry {\n constructor() {\n this.index = new Index();\n }\n static getDefaultRegistry() {\n return Registry.defaultRegistry;\n }\n // If you call `enableDefaultRegistry`, any new elements will auto-register with\n // the provided registry as soon as they're constructed.\n static enableDefaultRegistry(registry) {\n Registry.defaultRegistry = registry;\n }\n static disableDefaultRegistry() {\n Registry.defaultRegistry = undefined;\n }\n clear() {\n this.index = new Index();\n return this;\n }\n setIndexValue(name, value, id, elem) {\n const index = this.index;\n if (!index[name][value]) {\n index[name][value] = {};\n }\n index[name][value][id] = elem;\n }\n // Updates the indexes for element 'id'. If an element's attribute changes\n // from A -> B, make sure to remove the element from A.\n updateIndex({ id, name, value, oldValue }) {\n const elem = this.getElementById(id);\n if (oldValue !== undefined && this.index[name][oldValue]) {\n delete this.index[name][oldValue][id];\n }\n if (value && elem) {\n this.setIndexValue(name, value, elem.getAttribute('id'), elem);\n }\n }\n /**\n * Register element `elem` with this registry.\n * This adds the element to its index and watches it for attribute changes.\n * @param elem\n * @param id\n * @returns this\n */\n register(elem, id) {\n id = id || elem.getAttribute('id');\n if (!id) {\n throw new RuntimeError(\"Can't add element without `id` attribute to registry\");\n }\n // Manually add id to index, then update other indexes.\n elem.setAttribute('id', id);\n this.setIndexValue('id', id, id, elem);\n this.updateIndex({ id, name: 'type', value: elem.getAttribute('type'), oldValue: undefined });\n elem.onRegister(this);\n return this;\n }\n getElementById(id) {\n var _a, _b;\n return (_b = (_a = this.index.id) === null || _a === void 0 ? void 0 : _a[id]) === null || _b === void 0 ? void 0 : _b[id]; // return undefined if the id is not found.\n }\n getElementsByAttribute(attribute, value) {\n const index_attr = this.index[attribute];\n if (index_attr) {\n const index_attr_val = index_attr[value];\n if (index_attr_val) {\n const keys = Object.keys(index_attr_val);\n return keys.map((k) => index_attr_val[k]);\n }\n }\n return [];\n }\n getElementsByType(type) {\n return this.getElementsByAttribute('type', type);\n }\n getElementsByClass(className) {\n return this.getElementsByAttribute('class', className);\n }\n // This is called by the element when an attribute value changes. If an indexed\n // attribute changes, then update the local index.\n onUpdate(info) {\n const allowedNames = ['id', 'type', 'class'];\n if (allowedNames.includes(info.name)) {\n this.updateIndex(info);\n }\n return this;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Mohit Cheppudira\n// MIT License\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Registry } from './registry';\nimport { Category } from './typeguard';\nimport { defined } from './util';\n/**\n * Element implements a generic base class for VexFlow, with implementations\n * of general functions and properties that can be inherited by all VexFlow elements.\n */\nexport class Element {\n constructor() {\n var _a;\n this.attrs = {\n id: Element.newID(),\n el: undefined,\n type: this.getCategory(),\n classes: {},\n };\n this.rendered = false;\n // If a default registry exist, then register with it right away.\n (_a = Registry.getDefaultRegistry()) === null || _a === void 0 ? void 0 : _a.register(this);\n }\n static get CATEGORY() {\n return Category.Element;\n }\n static newID() {\n return `auto${Element.ID++}`;\n }\n /** Get element category string. */\n getCategory() {\n return this.constructor.CATEGORY;\n }\n /**\n * Set the element style used to render.\n *\n * Example:\n * ```typescript\n * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' });\n * element.draw();\n * ```\n * Note: If the element draws additional sub-elements (ie.: Modifiers in a Stave),\n * the style can be applied to all of them by means of the context:\n * ```typescript\n * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' });\n * element.getContext().setFillStyle('red');\n * element.getContext().setStrokeStyle('red');\n * element.draw();\n * ```\n * or using drawWithStyle:\n * ```typescript\n * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' });\n * element.drawWithStyle();\n * ```\n */\n setStyle(style) {\n this.style = style;\n return this;\n }\n /** Get the element style used for rendering. */\n getStyle() {\n return this.style;\n }\n /** Apply the element style to `context`. */\n applyStyle(context = this.context, style = this.getStyle()) {\n if (!style)\n return this;\n if (!context)\n return this;\n context.save();\n if (style.shadowColor)\n context.setShadowColor(style.shadowColor);\n if (style.shadowBlur)\n context.setShadowBlur(style.shadowBlur);\n if (style.fillStyle)\n context.setFillStyle(style.fillStyle);\n if (style.strokeStyle)\n context.setStrokeStyle(style.strokeStyle);\n if (style.lineWidth)\n context.setLineWidth(style.lineWidth);\n return this;\n }\n /** Restore the style of `context`. */\n restoreStyle(context = this.context, style = this.getStyle()) {\n if (!style)\n return this;\n if (!context)\n return this;\n context.restore();\n return this;\n }\n /**\n * Draw the element and all its sub-elements (ie.: Modifiers in a Stave)\n * with the element style.\n */\n drawWithStyle() {\n this.checkContext();\n this.applyStyle();\n this.draw();\n this.restoreStyle();\n }\n /** Check if it has a class label (An element can have multiple class labels). */\n hasClass(className) {\n return this.attrs.classes[className] === true;\n }\n /** Add a class label (An element can have multiple class labels). */\n addClass(className) {\n var _a;\n this.attrs.classes[className] = true;\n (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({\n id: this.attrs.id,\n name: 'class',\n value: className,\n oldValue: undefined,\n });\n return this;\n }\n /** Remove a class label (An element can have multiple class labels). */\n removeClass(className) {\n var _a;\n delete this.attrs.classes[className];\n (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({\n id: this.attrs.id,\n name: 'class',\n value: undefined,\n oldValue: className,\n });\n return this;\n }\n /** Call back from registry after the element is registered. */\n onRegister(registry) {\n this.registry = registry;\n return this;\n }\n /** Return the rendered status. */\n isRendered() {\n return this.rendered;\n }\n /** Set the rendered status. */\n setRendered(rendered = true) {\n this.rendered = rendered;\n return this;\n }\n /** Return the element attributes. */\n getAttributes() {\n return this.attrs;\n }\n /** Return an attribute. */\n // eslint-disable-next-line\n getAttribute(name) {\n return this.attrs[name];\n }\n /** Set an attribute. */\n // eslint-disable-next-line\n setAttribute(name, value) {\n var _a;\n const oldID = this.attrs.id;\n const oldValue = this.attrs[name];\n this.attrs[name] = value;\n // Register with old id to support id changes.\n (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({ id: oldID, name, value, oldValue });\n return this;\n }\n /** Get the boundingBox. */\n getBoundingBox() {\n return this.boundingBox;\n }\n /** Return the context. */\n getContext() {\n return this.context;\n }\n /** Set the context. */\n setContext(context) {\n this.context = context;\n return this;\n }\n /** Validate and return the context. */\n checkContext() {\n return defined(this.context, 'NoContext', 'No rendering context attached to instance.');\n }\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // Font Handling\n /**\n * Provide a CSS compatible font string (e.g., 'bold 16px Arial').\n */\n set font(f) {\n this.setFont(f);\n }\n /** Returns the CSS compatible font string. */\n get font() {\n return Font.toCSSString(this.textFont);\n }\n /**\n * Set the element's font family, size, weight, style (e.g., `Arial`, `10pt`, `bold`, `italic`).\n * @param font is 1) a `FontInfo` object or\n * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or\n * 3) a string representing the font family (at least one of `size`, `weight`, or `style` must also be provided).\n * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt').\n * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900).\n * @param style is a string (e.g., 'italic', 'normal').\n * If no arguments are provided, then the font is set to the default font.\n * Each Element subclass may specify its own default by overriding the static `TEXT_FONT` property.\n */\n setFont(font, size, weight, style) {\n // Allow subclasses to override `TEXT_FONT`.\n const defaultTextFont = this.constructor.TEXT_FONT;\n const fontIsObject = typeof font === 'object';\n const fontIsString = typeof font === 'string';\n const fontIsUndefined = font === undefined;\n const sizeWeightStyleAreUndefined = size === undefined && weight === undefined && style === undefined;\n if (fontIsObject) {\n // `font` is case 1) a FontInfo object\n this.textFont = Object.assign(Object.assign({}, defaultTextFont), font);\n }\n else if (fontIsString && sizeWeightStyleAreUndefined) {\n // `font` is case 2) CSS font shorthand.\n this.textFont = Font.fromCSSString(font);\n }\n else if (fontIsUndefined && sizeWeightStyleAreUndefined) {\n // All arguments are undefined. Do not check for `arguments.length === 0`,\n // which fails on the edge case: `setFont(undefined)`.\n // TODO: See if we can remove this case entirely without introducing a visual diff.\n // The else case below seems like it should be equivalent to this case.\n this.textFont = Object.assign({}, defaultTextFont);\n }\n else {\n // `font` is case 3) a font family string (e.g., 'Times New Roman').\n // The other parameters represent the size, weight, and style.\n // It is okay for `font` to be undefined while one or more of the other arguments is provided.\n // Following CSS conventions, unspecified params are reset to the default.\n this.textFont = Font.validate(font !== null && font !== void 0 ? font : defaultTextFont.family, size !== null && size !== void 0 ? size : defaultTextFont.size, weight !== null && weight !== void 0 ? weight : defaultTextFont.weight, style !== null && style !== void 0 ? style : defaultTextFont.style);\n }\n return this;\n }\n getFont() {\n if (!this.textFont) {\n this.resetFont();\n }\n return Font.toCSSString(this.textFont);\n }\n /**\n * Reset the text font to the style indicated by the static `TEXT_FONT` property.\n * Subclasses can call this to initialize `textFont` for the first time.\n */\n resetFont() {\n this.setFont();\n }\n /** Return a copy of the current FontInfo object. */\n get fontInfo() {\n if (!this.textFont) {\n this.resetFont();\n }\n // We can cast to Required here, because\n // we just called resetFont() above to ensure this.textFont is set.\n return Object.assign({}, this.textFont);\n }\n set fontInfo(fontInfo) {\n this.setFont(fontInfo);\n }\n /** Change the font size, while keeping everything else the same. */\n setFontSize(size) {\n const fontInfo = this.fontInfo;\n this.setFont(fontInfo.family, size, fontInfo.weight, fontInfo.style);\n return this;\n }\n /**\n * @returns a CSS font-size string (e.g., '18pt', '12px', '1em').\n * See Element.fontSizeInPixels or Element.fontSizeInPoints if you need to get a number for calculation purposes.\n */\n getFontSize() {\n return this.fontSize;\n }\n /**\n * The size is 1) a string of the form '10pt' or '16px', compatible with the CSS font-size property.\n * or 2) a number, which is interpreted as a point size (i.e. 12 == '12pt').\n */\n set fontSize(size) {\n this.setFontSize(size);\n }\n /**\n * @returns a CSS font-size string (e.g., '18pt', '12px', '1em').\n */\n get fontSize() {\n let size = this.fontInfo.size;\n if (typeof size === 'number') {\n size = `${size}pt`;\n }\n return size;\n }\n /**\n * @returns the font size in `pt`.\n */\n get fontSizeInPoints() {\n return Font.convertSizeToPointValue(this.fontSize);\n }\n /**\n * @returns the font size in `px`.\n */\n get fontSizeInPixels() {\n return Font.convertSizeToPixelValue(this.fontSize);\n }\n /**\n * @returns a CSS font-style string (e.g., 'italic').\n */\n get fontStyle() {\n return this.fontInfo.style;\n }\n set fontStyle(style) {\n const fontInfo = this.fontInfo;\n this.setFont(fontInfo.family, fontInfo.size, fontInfo.weight, style);\n }\n /**\n * @returns a CSS font-weight string (e.g., 'bold').\n * As in CSS, font-weight is always returned as a string, even if it was set as a number.\n */\n get fontWeight() {\n return this.fontInfo.weight + '';\n }\n set fontWeight(weight) {\n const fontInfo = this.fontInfo;\n this.setFont(fontInfo.family, fontInfo.size, weight, fontInfo.style);\n }\n}\nElement.ID = 1000;\n/**\n * Default font for text. This is not related to music engraving. Instead, see `Flow.setMusicFont(...fontNames)`\n * to customize the font for musical symbols placed on the score.\n */\nElement.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: Font.SIZE,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { BoundingBox } from './boundingbox';\nimport { BoundingBoxComputation } from './boundingboxcomputation';\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nexport var OutlineCode;\n(function (OutlineCode) {\n OutlineCode[OutlineCode[\"MOVE\"] = 0] = \"MOVE\";\n OutlineCode[OutlineCode[\"LINE\"] = 1] = \"LINE\";\n OutlineCode[OutlineCode[\"QUADRATIC\"] = 2] = \"QUADRATIC\";\n OutlineCode[OutlineCode[\"BEZIER\"] = 3] = \"BEZIER\";\n})(OutlineCode || (OutlineCode = {}));\nclass GlyphCacheEntry {\n constructor(fontStack, code, category) {\n this.point = -1;\n this.metrics = Glyph.loadMetrics(fontStack, code, category);\n this.bbox = Glyph.getOutlineBoundingBox(this.metrics.outline, this.metrics.scale, this.metrics.x_shift, this.metrics.y_shift);\n if (category) {\n this.point = Glyph.lookupFontMetric(this.metrics.font, category, code, 'point', -1);\n }\n }\n}\nclass GlyphCache {\n constructor() {\n this.cache = new Map();\n }\n lookup(code, category) {\n let entries = this.cache.get(Glyph.CURRENT_CACHE_KEY);\n if (entries === undefined) {\n entries = {};\n this.cache.set(Glyph.CURRENT_CACHE_KEY, entries);\n }\n const key = category ? `${code}%${category}` : code;\n let entry = entries[key];\n if (entry === undefined) {\n entry = new GlyphCacheEntry(Glyph.MUSIC_FONT_STACK, code, category);\n entries[key] = entry;\n }\n return entry;\n }\n}\nclass GlyphOutline {\n constructor(outline, originX, originY, scale) {\n this.outline = outline;\n this.originX = originX;\n this.originY = originY;\n this.scale = scale;\n this.i = 0;\n // Automatically assign private properties: this.outline, this.originX, this.originY, and this.scale.\n }\n done() {\n return this.i >= this.outline.length;\n }\n next() {\n return this.outline[this.i++];\n }\n nextX() {\n return this.originX + this.outline[this.i++] * this.scale;\n }\n nextY() {\n return this.originY - this.outline[this.i++] * this.scale;\n }\n static parse(str) {\n const result = [];\n const parts = str.split(' ');\n let i = 0;\n while (i < parts.length) {\n switch (parts[i++]) {\n case 'm':\n result.push(OutlineCode.MOVE, parseInt(parts[i++]), parseInt(parts[i++]));\n break;\n case 'l':\n result.push(OutlineCode.LINE, parseInt(parts[i++]), parseInt(parts[i++]));\n break;\n case 'q':\n result.push(OutlineCode.QUADRATIC, parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]));\n break;\n case 'b':\n result.push(OutlineCode.BEZIER, parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]));\n break;\n }\n }\n return result;\n }\n}\nexport class Glyph extends Element {\n /**\n * @param code\n * @param point\n * @param options\n */\n constructor(code, point, options) {\n super();\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // INSTANCE MEMBERS\n this.bbox = new BoundingBox(0, 0, 0, 0);\n this.topGlyphs = [];\n this.botGlyphs = [];\n this.options = {};\n this.scale = 1;\n this.code = code;\n this.point = point;\n this.originShift = { x: 0, y: 0 };\n this.x_shift = 0;\n this.y_shift = 0;\n if (options) {\n this.setOptions(options);\n }\n else {\n this.reset();\n }\n }\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // STATIC MEMBERS\n static get CATEGORY() {\n return Category.Glyph;\n }\n /**\n * Pass a key of the form `glyphs.{category}.{code}.{key}` to Font.lookupMetric(). If the initial lookup fails,\n * try again with the path `glyphs.{category}.{key}`. If the second lookup fails, return the defaultValue.\n *\n * @param font\n * @param category any metric path under 'glyphs', so 'stem.up' could resolve to glyphs.stem.up.shiftX, glyphs.stem.up.shiftY, etc.\n * @param code\n * @param key\n * @param defaultValue\n */\n static lookupFontMetric(font, category, code, key, defaultValue) {\n let value = font.lookupMetric(`glyphs.${category}.${code}.${key}`, undefined);\n if (value === undefined) {\n // The first lookup failed, so we omit .${code} and try again (with a defaultValue this time).\n value = font.lookupMetric(`glyphs.${category}.${key}`, defaultValue);\n }\n return value;\n }\n static lookupGlyph(fontStack, code) {\n defined(fontStack, 'BadFontStack', 'Font stack is misconfigured');\n let glyph;\n let font;\n for (let i = 0; i < fontStack.length; i++) {\n font = fontStack[i];\n glyph = font.getGlyphs()[code];\n if (glyph)\n return { glyph, font };\n }\n throw new RuntimeError('BadGlyph', `Glyph ${code} does not exist in font.`);\n }\n static loadMetrics(fontStack, code, category) {\n const { glyph, font } = Glyph.lookupGlyph(fontStack, code);\n if (!glyph.o)\n throw new RuntimeError('BadGlyph', `Glyph ${code} has no outline defined.`);\n let x_shift = 0;\n let y_shift = 0;\n let scale = 1;\n if (category && font) {\n x_shift = Glyph.lookupFontMetric(font, category, code, 'shiftX', 0);\n y_shift = Glyph.lookupFontMetric(font, category, code, 'shiftY', 0);\n scale = Glyph.lookupFontMetric(font, category, code, 'scale', 1);\n }\n const x_min = glyph.x_min;\n const x_max = glyph.x_max;\n const ha = glyph.ha;\n if (!glyph.cached_outline) {\n glyph.cached_outline = GlyphOutline.parse(glyph.o);\n }\n return {\n x_min,\n x_max,\n x_shift,\n y_shift,\n scale,\n ha,\n outline: glyph.cached_outline,\n font,\n width: x_max - x_min,\n height: ha,\n };\n }\n /**\n * Renders glyphs from the default font stack.\n *\n * @param ctx Canvas or SVG context\n * @param x_pos x coordinate\n * @param y_pos y coordinate\n * @param point the point size of the font\n * @param code the glyph code in font.getGlyphs()\n * @param options\n * @returns\n */\n static renderGlyph(ctx, x_pos, y_pos, point, code, options) {\n var _a;\n const data = Glyph.cache.lookup(code, options === null || options === void 0 ? void 0 : options.category);\n const metrics = data.metrics;\n if (data.point != -1) {\n point = data.point;\n }\n const customScale = (_a = options === null || options === void 0 ? void 0 : options.scale) !== null && _a !== void 0 ? _a : 1;\n const scale = ((point * 72.0) / (metrics.font.getResolution() * 100.0)) * metrics.scale * customScale;\n Glyph.renderOutline(ctx, metrics.outline, scale, x_pos + metrics.x_shift * customScale, y_pos + metrics.y_shift * customScale);\n return metrics;\n }\n static renderOutline(ctx, outline, scale, x_pos, y_pos) {\n const go = new GlyphOutline(outline, x_pos, y_pos, scale);\n ctx.beginPath();\n let x, y;\n while (!go.done()) {\n switch (go.next()) {\n case OutlineCode.MOVE:\n ctx.moveTo(go.nextX(), go.nextY());\n break;\n case OutlineCode.LINE:\n ctx.lineTo(go.nextX(), go.nextY());\n break;\n case OutlineCode.QUADRATIC:\n x = go.nextX();\n y = go.nextY();\n ctx.quadraticCurveTo(go.nextX(), go.nextY(), x, y);\n break;\n case OutlineCode.BEZIER:\n x = go.nextX();\n y = go.nextY();\n ctx.bezierCurveTo(go.nextX(), go.nextY(), go.nextX(), go.nextY(), x, y);\n break;\n }\n }\n ctx.fill();\n }\n static getOutlineBoundingBox(outline, scale, x_pos, y_pos) {\n const go = new GlyphOutline(outline, x_pos, y_pos, scale);\n const bboxComp = new BoundingBoxComputation();\n // (penX, penY) hold the pen position: the start of each stroke.\n let penX = x_pos;\n let penY = y_pos;\n let x, y;\n while (!go.done()) {\n switch (go.next()) {\n case OutlineCode.MOVE:\n // Note that we don't add any points to the bounding box until a srroke is actually drawn.\n penX = go.nextX();\n penY = go.nextY();\n break;\n case OutlineCode.LINE:\n bboxComp.addPoint(penX, penY);\n penX = go.nextX();\n penY = go.nextY();\n bboxComp.addPoint(penX, penY);\n break;\n case OutlineCode.QUADRATIC:\n x = go.nextX();\n y = go.nextY();\n bboxComp.addQuadraticCurve(penX, penY, go.nextX(), go.nextY(), x, y);\n penX = x;\n penY = y;\n break;\n case OutlineCode.BEZIER:\n x = go.nextX();\n y = go.nextY();\n bboxComp.addBezierCurve(penX, penY, go.nextX(), go.nextY(), go.nextX(), go.nextY(), x, y);\n penX = x;\n penY = y;\n break;\n }\n }\n return new BoundingBox(bboxComp.getX1(), bboxComp.getY1(), bboxComp.width(), bboxComp.height());\n }\n static getWidth(code, point, category) {\n const data = Glyph.cache.lookup(code, category);\n if (data.point != -1) {\n point = data.point;\n }\n const scale = (point * 72) / (data.metrics.font.getResolution() * 100);\n return data.bbox.getW() * scale;\n }\n // eslint-disable-next-line\n draw(...args) {\n // DO NOTHING.\n }\n getCode() {\n return this.code;\n }\n // eslint-disable-next-line\n setOptions(options) {\n this.options = Object.assign(Object.assign({}, this.options), options);\n this.reset();\n }\n setPoint(point) {\n this.point = point;\n return this;\n }\n setStave(stave) {\n this.stave = stave;\n return this;\n }\n setXShift(x_shift) {\n this.x_shift = x_shift;\n return this;\n }\n setYShift(y_shift) {\n this.y_shift = y_shift;\n return this;\n }\n reset() {\n const data = Glyph.cache.lookup(this.code, this.options.category);\n this.metrics = data.metrics;\n // Override point from metrics file\n if (data.point != -1) {\n this.point = data.point;\n }\n this.scale = (this.point * 72) / (this.metrics.font.getResolution() * 100);\n this.bbox = new BoundingBox(data.bbox.getX() * this.scale, data.bbox.getY() * this.scale, data.bbox.getW() * this.scale, data.bbox.getH() * this.scale);\n }\n checkMetrics() {\n return defined(this.metrics, 'BadGlyph', `Glyph ${this.code} is not initialized.`);\n }\n getMetrics() {\n const metrics = this.checkMetrics();\n const metricsScale = metrics.scale;\n return {\n x_min: metrics.x_min * this.scale * metricsScale,\n x_max: metrics.x_max * this.scale * metricsScale,\n width: this.bbox.getW(),\n height: this.bbox.getH(),\n scale: this.scale * metricsScale,\n x_shift: metrics.x_shift,\n y_shift: metrics.y_shift,\n outline: metrics.outline,\n font: metrics.font,\n ha: metrics.ha,\n };\n }\n setOriginX(x) {\n const { bbox } = this;\n const originX = Math.abs(bbox.getX() / bbox.getW());\n const xShift = (x - originX) * bbox.getW();\n this.originShift.x = -xShift;\n }\n setOriginY(y) {\n const { bbox } = this;\n const originY = Math.abs(bbox.getY() / bbox.getH());\n const yShift = (y - originY) * bbox.getH();\n this.originShift.y = -yShift;\n }\n setOrigin(x, y) {\n this.setOriginX(x);\n this.setOriginY(y);\n }\n render(ctx, x, y) {\n const metrics = this.checkMetrics();\n const outline = metrics.outline;\n const scale = this.scale * metrics.scale;\n this.setRendered();\n this.applyStyle(ctx);\n const xPos = x + this.originShift.x + metrics.x_shift;\n const yPos = y + this.originShift.y + metrics.y_shift;\n Glyph.renderOutline(ctx, outline, scale, xPos, yPos);\n this.restoreStyle(ctx);\n }\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n renderToStave(x) {\n const context = this.checkContext();\n const metrics = this.checkMetrics();\n const stave = this.checkStave();\n const outline = metrics.outline;\n const scale = this.scale * metrics.scale;\n this.setRendered();\n this.applyStyle();\n const xPos = x + this.x_shift + metrics.x_shift;\n const yPos = stave.getYForGlyphs() + this.y_shift + metrics.y_shift;\n Glyph.renderOutline(context, outline, scale, xPos, yPos);\n this.restoreStyle();\n }\n}\nGlyph.cache = new GlyphCache();\n// The current cache key for GlyphCache above.\n// Computed when Flow.setMusicFont(...) is called.\n// It is set to a comma separated list of font names.\nGlyph.CURRENT_CACHE_KEY = '';\n// Used by the GlyphCache above.\n// Set when Flow.setMusicFont(...) is called.\nGlyph.MUSIC_FONT_STACK = [];\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nexport var ModifierPosition;\n(function (ModifierPosition) {\n ModifierPosition[ModifierPosition[\"CENTER\"] = 0] = \"CENTER\";\n ModifierPosition[ModifierPosition[\"LEFT\"] = 1] = \"LEFT\";\n ModifierPosition[ModifierPosition[\"RIGHT\"] = 2] = \"RIGHT\";\n ModifierPosition[ModifierPosition[\"ABOVE\"] = 3] = \"ABOVE\";\n ModifierPosition[ModifierPosition[\"BELOW\"] = 4] = \"BELOW\";\n})(ModifierPosition || (ModifierPosition = {}));\n// To enable logging for this class. Set `Vex.Flow.Modifier.DEBUG` to `true`.\n// function L(...args) { if (Modifier.DEBUG) log('Vex.Flow.Modifier', args); }\n/**\n * `Modifier` is an abstract interface for notational elements that modify\n * a `Note`. Examples of modifiers are `Accidental`, `Annotation`, `Stroke`, etc.\n *\n * For a `Modifier` instance to be positioned correctly, it must be part of\n * a `ModifierContext`. All modifiers in the same context are rendered relative to\n * one another.\n *\n * Typically, all modifiers to a note are part of the same `ModifierContext` instance. Also,\n * in multi-voice staves, all modifiers to notes on the same `tick` are part of the same\n * `ModifierContext`. This ensures that multiple voices don't trample all over each other.\n */\nexport class Modifier extends Element {\n constructor() {\n super();\n this.width = 0;\n // The `text_line` is reserved space above or below a stave.\n this.text_line = 0;\n this.position = Modifier.Position.LEFT;\n this.x_shift = 0;\n this.y_shift = 0;\n this.spacingFromNextModifier = 0;\n }\n /**\n * Modifiers category string. Every modifier has a different category.\n * The `ModifierContext` uses this to determine the type and order of the modifiers.\n */\n static get CATEGORY() {\n return Category.Modifier;\n }\n /** Modifiers can be positioned almost anywhere, relative to a note. */\n static get Position() {\n return ModifierPosition;\n }\n static get PositionString() {\n return {\n center: ModifierPosition.CENTER,\n above: ModifierPosition.ABOVE,\n below: ModifierPosition.BELOW,\n left: ModifierPosition.LEFT,\n right: ModifierPosition.RIGHT,\n };\n }\n /** Called when position changes. */\n reset() {\n // DO NOTHING.\n }\n /** Get modifier widths. */\n getWidth() {\n return this.width;\n }\n /** Set modifier widths. */\n setWidth(width) {\n this.width = width;\n return this;\n }\n /** Get attached note (`StaveNote`, `TabNote`, etc.) */\n getNote() {\n return defined(this.note, 'NoNote', 'Modifier has no note.');\n }\n /**\n * Used in draw() to check and get the attached note (`StaveNote`, `TabNote`, etc.).\n * Also verifies that the index is valid.\n */\n checkAttachedNote() {\n const category = this.getCategory();\n defined(this.index, 'NoIndex', `Can't draw ${category} without an index.`);\n return defined(this.note, 'NoNote', `Can't draw ${category} without a note.`);\n }\n /**\n * Set attached note.\n * @param note (`StaveNote`, `TabNote`, etc.)\n */\n setNote(note) {\n this.note = note;\n return this;\n }\n /** Get note index, which is a specific note in a chord. */\n getIndex() {\n return this.index;\n }\n /** Check and get note index, which is a specific note in a chord. */\n checkIndex() {\n return defined(this.index, 'NoIndex', 'Modifier has an invalid index.');\n }\n /** Set note index, which is a specific note in a chord. */\n setIndex(index) {\n this.index = index;\n return this;\n }\n /** Get `ModifierContext`. */\n getModifierContext() {\n return this.modifierContext;\n }\n /** Check and get `ModifierContext`. */\n checkModifierContext() {\n return defined(this.modifierContext, 'NoModifierContext', 'Modifier Context Required');\n }\n /** Every modifier must be part of a `ModifierContext`. */\n setModifierContext(c) {\n this.modifierContext = c;\n return this;\n }\n /** Get position. */\n getPosition() {\n return this.position;\n }\n /**\n * Set position.\n * @param position CENTER | LEFT | RIGHT | ABOVE | BELOW\n */\n setPosition(position) {\n this.position = typeof position === 'string' ? Modifier.PositionString[position] : position;\n this.reset();\n return this;\n }\n /** Set the `text_line` for the modifier. */\n setTextLine(line) {\n this.text_line = line;\n return this;\n }\n /** Shift modifier down `y` pixels. Negative values shift up. */\n setYShift(y) {\n this.y_shift = y;\n return this;\n }\n /** Set spacing from next modifier. */\n setSpacingFromNextModifier(x) {\n this.spacingFromNextModifier = x;\n }\n /** Get spacing from next modifier. */\n getSpacingFromNextModifier() {\n return this.spacingFromNextModifier;\n }\n /**\n * Shift modifier `x` pixels in the direction of the modifier. Negative values\n * shift reverse.\n */\n setXShift(x) {\n this.x_shift = 0;\n if (this.position === Modifier.Position.LEFT) {\n this.x_shift -= x;\n }\n else {\n this.x_shift += x;\n }\n return this;\n }\n /** Get shift modifier `x` */\n getXShift() {\n return this.x_shift;\n }\n /** Render the modifier onto the canvas. */\n draw() {\n this.checkContext();\n throw new RuntimeError('NotImplemented', 'draw() not implemented for this modifier.');\n }\n // aligns sub notes of NoteSubGroup (or GraceNoteGroup) to the main note with correct x-offset\n alignSubNotesWithNote(subNotes, note) {\n // Shift over the tick contexts of each note\n const tickContext = note.getTickContext();\n const metrics = tickContext.getMetrics();\n const stave = note.getStave();\n const subNoteXOffset = tickContext.getX() - metrics.modLeftPx - metrics.modRightPx + this.getSpacingFromNextModifier();\n subNotes.forEach((subNote) => {\n const subTickContext = subNote.getTickContext();\n if (stave)\n subNote.setStave(stave);\n subTickContext.setXOffset(subNoteXOffset); // don't touch baseX to avoid shift each render\n });\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { RuntimeError } from './util';\n/** Music implements some standard music theory routines. */\nexport class Music {\n /** Number of an canonical notes (12). */\n static get NUM_TONES() {\n return this.canonical_notes.length;\n }\n /** Names of root notes ('c', 'd',...) */\n static get roots() {\n return ['c', 'd', 'e', 'f', 'g', 'a', 'b'];\n }\n /** Values of the root notes.*/\n static get root_values() {\n return [0, 2, 4, 5, 7, 9, 11];\n }\n /** Indices of the root notes.*/\n static get root_indices() {\n return {\n c: 0,\n d: 1,\n e: 2,\n f: 3,\n g: 4,\n a: 5,\n b: 6,\n };\n }\n /** Names of canonical notes ('c', 'c#', 'd',...). */\n static get canonical_notes() {\n return ['c', 'c#', 'd', 'd#', 'e', 'f', 'f#', 'g', 'g#', 'a', 'a#', 'b'];\n }\n /** Names of diatonic intervals ('unison', 'm2', 'M2',...). */\n static get diatonic_intervals() {\n return ['unison', 'm2', 'M2', 'm3', 'M3', 'p4', 'dim5', 'p5', 'm6', 'M6', 'b7', 'M7', 'octave'];\n }\n /** NoteAccidental associated to diatonic intervals. */\n static get diatonic_accidentals() {\n return {\n unison: { note: 0, accidental: 0 },\n m2: { note: 1, accidental: -1 },\n M2: { note: 1, accidental: 0 },\n m3: { note: 2, accidental: -1 },\n M3: { note: 2, accidental: 0 },\n p4: { note: 3, accidental: 0 },\n dim5: { note: 4, accidental: -1 },\n p5: { note: 4, accidental: 0 },\n m6: { note: 5, accidental: -1 },\n M6: { note: 5, accidental: 0 },\n b7: { note: 6, accidental: -1 },\n M7: { note: 6, accidental: 0 },\n octave: { note: 7, accidental: 0 },\n };\n }\n /** Semitones shift associated to intervals .*/\n static get intervals() {\n return {\n u: 0,\n unison: 0,\n m2: 1,\n b2: 1,\n min2: 1,\n S: 1,\n H: 1,\n 2: 2,\n M2: 2,\n maj2: 2,\n T: 2,\n W: 2,\n m3: 3,\n b3: 3,\n min3: 3,\n M3: 4,\n 3: 4,\n maj3: 4,\n 4: 5,\n p4: 5,\n '#4': 6,\n b5: 6,\n aug4: 6,\n dim5: 6,\n 5: 7,\n p5: 7,\n '#5': 8,\n b6: 8,\n aug5: 8,\n 6: 9,\n M6: 9,\n maj6: 9,\n b7: 10,\n m7: 10,\n min7: 10,\n dom7: 10,\n M7: 11,\n maj7: 11,\n 8: 12,\n octave: 12,\n };\n }\n /** Semitones shifts associated with scales. */\n static get scales() {\n return {\n major: [2, 2, 1, 2, 2, 2, 1],\n minor: [2, 1, 2, 2, 1, 2, 2],\n ionian: [2, 2, 1, 2, 2, 2, 1],\n dorian: [2, 1, 2, 2, 2, 1, 2],\n phyrgian: [1, 2, 2, 2, 1, 2, 2],\n lydian: [2, 2, 2, 1, 2, 2, 1],\n mixolydian: [2, 2, 1, 2, 2, 1, 2],\n aeolian: [2, 1, 2, 2, 1, 2, 2],\n locrian: [1, 2, 2, 1, 2, 2, 2],\n };\n }\n /** Scales associated with m (minor) and M (major). */\n static get scaleTypes() {\n return {\n M: Music.scales.major,\n m: Music.scales.minor,\n };\n }\n /** Accidentals abbreviations. */\n static get accidentals() {\n return ['bb', 'b', 'n', '#', '##'];\n }\n /** Note values. */\n static get noteValues() {\n return {\n c: { root_index: 0, int_val: 0 },\n cn: { root_index: 0, int_val: 0 },\n 'c#': { root_index: 0, int_val: 1 },\n 'c##': { root_index: 0, int_val: 2 },\n cb: { root_index: 0, int_val: 11 },\n cbb: { root_index: 0, int_val: 10 },\n d: { root_index: 1, int_val: 2 },\n dn: { root_index: 1, int_val: 2 },\n 'd#': { root_index: 1, int_val: 3 },\n 'd##': { root_index: 1, int_val: 4 },\n db: { root_index: 1, int_val: 1 },\n dbb: { root_index: 1, int_val: 0 },\n e: { root_index: 2, int_val: 4 },\n en: { root_index: 2, int_val: 4 },\n 'e#': { root_index: 2, int_val: 5 },\n 'e##': { root_index: 2, int_val: 6 },\n eb: { root_index: 2, int_val: 3 },\n ebb: { root_index: 2, int_val: 2 },\n f: { root_index: 3, int_val: 5 },\n fn: { root_index: 3, int_val: 5 },\n 'f#': { root_index: 3, int_val: 6 },\n 'f##': { root_index: 3, int_val: 7 },\n fb: { root_index: 3, int_val: 4 },\n fbb: { root_index: 3, int_val: 3 },\n g: { root_index: 4, int_val: 7 },\n gn: { root_index: 4, int_val: 7 },\n 'g#': { root_index: 4, int_val: 8 },\n 'g##': { root_index: 4, int_val: 9 },\n gb: { root_index: 4, int_val: 6 },\n gbb: { root_index: 4, int_val: 5 },\n a: { root_index: 5, int_val: 9 },\n an: { root_index: 5, int_val: 9 },\n 'a#': { root_index: 5, int_val: 10 },\n 'a##': { root_index: 5, int_val: 11 },\n ab: { root_index: 5, int_val: 8 },\n abb: { root_index: 5, int_val: 7 },\n b: { root_index: 6, int_val: 11 },\n bn: { root_index: 6, int_val: 11 },\n 'b#': { root_index: 6, int_val: 0 },\n 'b##': { root_index: 6, int_val: 1 },\n bb: { root_index: 6, int_val: 10 },\n bbb: { root_index: 6, int_val: 9 },\n };\n }\n isValidNoteValue(note) {\n return note >= 0 && note < Music.canonical_notes.length;\n }\n isValidIntervalValue(interval) {\n return interval >= 0 && interval < Music.diatonic_intervals.length;\n }\n /** Return root and accidental associated to a note. */\n getNoteParts(noteString) {\n if (!noteString || noteString.length < 1) {\n throw new RuntimeError('BadArguments', 'Invalid note name: ' + noteString);\n }\n if (noteString.length > 3) {\n throw new RuntimeError('BadArguments', 'Invalid note name: ' + noteString);\n }\n const note = noteString.toLowerCase();\n const regex = /^([cdefgab])(b|bb|n|#|##)?$/;\n const match = regex.exec(note);\n if (match !== null) {\n const root = match[1];\n const accidental = match[2];\n return {\n root,\n accidental,\n };\n }\n else {\n throw new RuntimeError('BadArguments', 'Invalid note name: ' + noteString);\n }\n }\n /** Return root, accidental and type associated to a key. */\n getKeyParts(keyString) {\n if (!keyString || keyString.length < 1) {\n throw new RuntimeError('BadArguments', 'Invalid key: ' + keyString);\n }\n const key = keyString.toLowerCase();\n // Support Major, Minor, Melodic Minor, and Harmonic Minor key types.\n const regex = /^([cdefgab])(b|#)?(mel|harm|m|M)?$/;\n const match = regex.exec(key);\n if (match !== null) {\n const root = match[1];\n const accidental = match[2];\n let type = match[3];\n // Unspecified type implies major\n if (!type)\n type = 'M';\n return {\n root,\n accidental,\n type,\n };\n }\n else {\n throw new RuntimeError('BadArguments', `Invalid key: ${keyString}`);\n }\n }\n /** Note value associated to a note name. */\n getNoteValue(noteString) {\n const value = Music.noteValues[noteString];\n if (value === undefined) {\n throw new RuntimeError('BadArguments', `Invalid note name: ${noteString}`);\n }\n return value.int_val;\n }\n /** Interval value associated to an interval name. */\n getIntervalValue(intervalString) {\n const value = Music.intervals[intervalString];\n if (value === undefined) {\n throw new RuntimeError('BadArguments', `Invalid interval name: ${intervalString}`);\n }\n return value;\n }\n /** Canonical note name associated to a value. */\n getCanonicalNoteName(noteValue) {\n if (!this.isValidNoteValue(noteValue)) {\n throw new RuntimeError('BadArguments', `Invalid note value: ${noteValue}`);\n }\n return Music.canonical_notes[noteValue];\n }\n /** Interval name associated to a value. */\n getCanonicalIntervalName(intervalValue) {\n if (!this.isValidIntervalValue(intervalValue)) {\n throw new RuntimeError('BadArguments', `Invalid interval value: ${intervalValue}`);\n }\n return Music.diatonic_intervals[intervalValue];\n }\n /**\n * Given a note, interval, and interval direction, produce the relative note.\n */\n getRelativeNoteValue(noteValue, intervalValue, direction = 1) {\n if (direction !== 1 && direction !== -1) {\n throw new RuntimeError('BadArguments', `Invalid direction: ${direction}`);\n }\n let sum = (noteValue + direction * intervalValue) % Music.NUM_TONES;\n if (sum < 0)\n sum += Music.NUM_TONES;\n return sum;\n }\n /**\n * Given a root and note value, produce the relative note name.\n */\n getRelativeNoteName(root, noteValue) {\n const parts = this.getNoteParts(root);\n const rootValue = this.getNoteValue(parts.root);\n let interval = noteValue - rootValue;\n if (Math.abs(interval) > Music.NUM_TONES - 3) {\n let multiplier = 1;\n if (interval > 0)\n multiplier = -1;\n // Possibly wrap around. (Add +1 for modulo operator)\n const reverse_interval = ((noteValue + 1 + (rootValue + 1)) % Music.NUM_TONES) * multiplier;\n if (Math.abs(reverse_interval) > 2) {\n throw new RuntimeError('BadArguments', `Notes not related: ${root}, ${noteValue})`);\n }\n else {\n interval = reverse_interval;\n }\n }\n if (Math.abs(interval) > 2) {\n throw new RuntimeError('BadArguments', `Notes not related: ${root}, ${noteValue})`);\n }\n let relativeNoteName = parts.root;\n if (interval > 0) {\n for (let i = 1; i <= interval; ++i) {\n relativeNoteName += '#';\n }\n }\n else if (interval < 0) {\n for (let i = -1; i >= interval; --i) {\n relativeNoteName += 'b';\n }\n }\n return relativeNoteName;\n }\n /**\n * Return scale tones, given intervals. Each successive interval is\n * relative to the previous one, e.g., Major Scale:\n *\n * TTSTTTS = [2,2,1,2,2,2,1]\n *\n * When used with key = 0, returns C scale (which is isomorphic to\n * interval list).\n */\n getScaleTones(key, intervals) {\n const tones = [key];\n let nextNote = key;\n for (let i = 0; i < intervals.length; i++) {\n nextNote = this.getRelativeNoteValue(nextNote, intervals[i]);\n if (nextNote !== key)\n tones.push(nextNote);\n }\n return tones;\n }\n /**\n * Return the interval of a note, given a diatonic scale.\n * e.g., given the scale C, and the note E, returns M3.\n */\n getIntervalBetween(note1, note2, direction = 1) {\n if (direction !== 1 && direction !== -1) {\n throw new RuntimeError('BadArguments', `Invalid direction: ${direction}`);\n }\n if (!this.isValidNoteValue(note1) || !this.isValidNoteValue(note2)) {\n throw new RuntimeError('BadArguments', `Invalid notes: ${note1}, ${note2}`);\n }\n let difference = direction === 1 ? note2 - note1 : note1 - note2;\n if (difference < 0)\n difference += Music.NUM_TONES;\n return difference;\n }\n /**\n * Create a scale map that represents the pitch state for a\n * `keySignature`. For example, passing a `G` to `keySignature` would\n * return a scale map with every note naturalized except for `F` which\n * has an `F#` state.\n */\n createScaleMap(keySignature) {\n const keySigParts = this.getKeyParts(keySignature);\n if (!keySigParts.type)\n throw new RuntimeError('BadArguments', 'Unsupported key type: undefined');\n const scaleName = Music.scaleTypes[keySigParts.type];\n let keySigString = keySigParts.root;\n if (keySigParts.accidental)\n keySigString += keySigParts.accidental;\n if (!scaleName)\n throw new RuntimeError('BadArguments', 'Unsupported key type: ' + keySignature);\n const scale = this.getScaleTones(this.getNoteValue(keySigString), scaleName);\n const noteLocation = Music.root_indices[keySigParts.root];\n const scaleMap = {};\n for (let i = 0; i < Music.roots.length; ++i) {\n const index = (noteLocation + i) % Music.roots.length;\n const rootName = Music.roots[index];\n let noteName = this.getRelativeNoteName(rootName, scale[i]);\n if (noteName.length === 1) {\n noteName += 'n';\n }\n scaleMap[rootName] = noteName;\n }\n return scaleMap;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { Fraction } from './fraction';\nimport { Glyph } from './glyph';\nimport { RuntimeError } from './util';\nconst RESOLUTION = 16384;\n/**\n * Map duration numbers to 'ticks', the unit of duration used throughout VexFlow.\n * For example, a quarter note is 4, so it maps to RESOLUTION / 4 = 4096 ticks.\n */\nconst durations = {\n '1/2': RESOLUTION * 2,\n 1: RESOLUTION / 1,\n 2: RESOLUTION / 2,\n 4: RESOLUTION / 4,\n 8: RESOLUTION / 8,\n 16: RESOLUTION / 16,\n 32: RESOLUTION / 32,\n 64: RESOLUTION / 64,\n 128: RESOLUTION / 128,\n 256: RESOLUTION / 256,\n};\nconst durationAliases = {\n w: '1',\n h: '2',\n q: '4',\n // This is the default duration used to render bars (BarNote). Bars no longer\n // consume ticks, so this should be a no-op.\n // TODO(0xfe): This needs to be cleaned up.\n b: '256',\n};\nconst keySignatures = {\n C: { num: 0 },\n Am: { num: 0 },\n F: { acc: 'b', num: 1 },\n Dm: { acc: 'b', num: 1 },\n Bb: { acc: 'b', num: 2 },\n Gm: { acc: 'b', num: 2 },\n Eb: { acc: 'b', num: 3 },\n Cm: { acc: 'b', num: 3 },\n Ab: { acc: 'b', num: 4 },\n Fm: { acc: 'b', num: 4 },\n Db: { acc: 'b', num: 5 },\n Bbm: { acc: 'b', num: 5 },\n Gb: { acc: 'b', num: 6 },\n Ebm: { acc: 'b', num: 6 },\n Cb: { acc: 'b', num: 7 },\n Abm: { acc: 'b', num: 7 },\n G: { acc: '#', num: 1 },\n Em: { acc: '#', num: 1 },\n D: { acc: '#', num: 2 },\n Bm: { acc: '#', num: 2 },\n A: { acc: '#', num: 3 },\n 'F#m': { acc: '#', num: 3 },\n E: { acc: '#', num: 4 },\n 'C#m': { acc: '#', num: 4 },\n B: { acc: '#', num: 5 },\n 'G#m': { acc: '#', num: 5 },\n 'F#': { acc: '#', num: 6 },\n 'D#m': { acc: '#', num: 6 },\n 'C#': { acc: '#', num: 7 },\n 'A#m': { acc: '#', num: 7 },\n};\nconst clefs = {\n treble: { line_shift: 0 },\n bass: { line_shift: 6 },\n tenor: { line_shift: 4 },\n alto: { line_shift: 3 },\n soprano: { line_shift: 1 },\n percussion: { line_shift: 0 },\n 'mezzo-soprano': { line_shift: 2 },\n 'baritone-c': { line_shift: 5 },\n 'baritone-f': { line_shift: 5 },\n subbass: { line_shift: 7 },\n french: { line_shift: -1 },\n};\nconst notesInfo = {\n C: { index: 0, int_val: 0 },\n CN: { index: 0, int_val: 0, accidental: 'n' },\n 'C#': { index: 0, int_val: 1, accidental: '#' },\n 'C##': { index: 0, int_val: 2, accidental: '##' },\n CB: { index: 0, int_val: 11, accidental: 'b' },\n CBB: { index: 0, int_val: 10, accidental: 'bb' },\n D: { index: 1, int_val: 2 },\n DN: { index: 1, int_val: 2, accidental: 'n' },\n 'D#': { index: 1, int_val: 3, accidental: '#' },\n 'D##': { index: 1, int_val: 4, accidental: '##' },\n DB: { index: 1, int_val: 1, accidental: 'b' },\n DBB: { index: 1, int_val: 0, accidental: 'bb' },\n E: { index: 2, int_val: 4 },\n EN: { index: 2, int_val: 4, accidental: 'n' },\n 'E#': { index: 2, int_val: 5, accidental: '#' },\n 'E##': { index: 2, int_val: 6, accidental: '##' },\n EB: { index: 2, int_val: 3, accidental: 'b' },\n EBB: { index: 2, int_val: 2, accidental: 'bb' },\n F: { index: 3, int_val: 5 },\n FN: { index: 3, int_val: 5, accidental: 'n' },\n 'F#': { index: 3, int_val: 6, accidental: '#' },\n 'F##': { index: 3, int_val: 7, accidental: '##' },\n FB: { index: 3, int_val: 4, accidental: 'b' },\n FBB: { index: 3, int_val: 3, accidental: 'bb' },\n G: { index: 4, int_val: 7 },\n GN: { index: 4, int_val: 7, accidental: 'n' },\n 'G#': { index: 4, int_val: 8, accidental: '#' },\n 'G##': { index: 4, int_val: 9, accidental: '##' },\n GB: { index: 4, int_val: 6, accidental: 'b' },\n GBB: { index: 4, int_val: 5, accidental: 'bb' },\n A: { index: 5, int_val: 9 },\n AN: { index: 5, int_val: 9, accidental: 'n' },\n 'A#': { index: 5, int_val: 10, accidental: '#' },\n 'A##': { index: 5, int_val: 11, accidental: '##' },\n AB: { index: 5, int_val: 8, accidental: 'b' },\n ABB: { index: 5, int_val: 7, accidental: 'bb' },\n B: { index: 6, int_val: 11 },\n BN: { index: 6, int_val: 11, accidental: 'n' },\n 'B#': { index: 6, int_val: 12, accidental: '#' },\n 'B##': { index: 6, int_val: 13, accidental: '##' },\n BB: { index: 6, int_val: 10, accidental: 'b' },\n BBB: { index: 6, int_val: 9, accidental: 'bb' },\n R: { index: 6, rest: true },\n X: {\n index: 6,\n accidental: '',\n octave: 4,\n code: 'noteheadXBlack',\n shift_right: 5.5,\n },\n};\nconst validNoteTypes = {\n n: { name: 'note' },\n r: { name: 'rest' },\n h: { name: 'harmonic' },\n m: { name: 'muted' },\n s: { name: 'slash' },\n g: { name: 'ghost' },\n};\nconst customNoteHeads = {\n /* Diamond */\n D0: { code: 'noteheadDiamondWhole' },\n D1: { code: 'noteheadDiamondHalf' },\n D2: { code: 'noteheadDiamondBlack' },\n D3: { code: 'noteheadDiamondBlack' },\n /* Triangle */\n T0: { code: 'noteheadTriangleUpWhole' },\n T1: { code: 'noteheadTriangleUpHalf' },\n T2: { code: 'noteheadTriangleUpBlack' },\n T3: { code: 'noteheadTriangleUpBlack' },\n /* Cross */\n X0: { code: 'noteheadXWhole' },\n X1: { code: 'noteheadXHalf' },\n X2: { code: 'noteheadXBlack' },\n X3: { code: 'noteheadCircleX' },\n /* Square */\n S1: { code: 'noteheadSquareWhite' },\n S2: { code: 'noteheadSquareBlack' },\n /* Rectangle */\n R1: { code: 'vexNoteHeadRectWhite' },\n R2: { code: 'vexNoteHeadRectBlack' }, // no smufl code\n};\nconst accidentals = {\n '#': { code: 'accidentalSharp', parenRightPaddingAdjustment: -1 },\n '##': { code: 'accidentalDoubleSharp', parenRightPaddingAdjustment: -1 },\n b: { code: 'accidentalFlat', parenRightPaddingAdjustment: -2 },\n bb: { code: 'accidentalDoubleFlat', parenRightPaddingAdjustment: -2 },\n n: { code: 'accidentalNatural', parenRightPaddingAdjustment: -1 },\n '{': { code: 'accidentalParensLeft', parenRightPaddingAdjustment: -1 },\n '}': { code: 'accidentalParensRight', parenRightPaddingAdjustment: -1 },\n db: { code: 'accidentalThreeQuarterTonesFlatZimmermann', parenRightPaddingAdjustment: -1 },\n d: { code: 'accidentalQuarterToneFlatStein', parenRightPaddingAdjustment: 0 },\n '++': { code: 'accidentalThreeQuarterTonesSharpStein', parenRightPaddingAdjustment: -1 },\n '+': { code: 'accidentalQuarterToneSharpStein', parenRightPaddingAdjustment: -1 },\n '+-': { code: 'accidentalKucukMucennebSharp', parenRightPaddingAdjustment: -1 },\n bs: { code: 'accidentalBakiyeFlat', parenRightPaddingAdjustment: -1 },\n bss: { code: 'accidentalBuyukMucennebFlat', parenRightPaddingAdjustment: -1 },\n o: { code: 'accidentalSori', parenRightPaddingAdjustment: -1 },\n k: { code: 'accidentalKoron', parenRightPaddingAdjustment: -1 },\n bbs: { code: 'vexAccidentalMicrotonal1', parenRightPaddingAdjustment: -1 },\n '++-': { code: 'vexAccidentalMicrotonal2', parenRightPaddingAdjustment: -1 },\n ashs: { code: 'vexAccidentalMicrotonal3', parenRightPaddingAdjustment: -1 },\n afhf: { code: 'vexAccidentalMicrotonal4', parenRightPaddingAdjustment: -1 },\n accSagittal5v7KleismaUp: { code: 'accSagittal5v7KleismaUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v7KleismaDown: { code: 'accSagittal5v7KleismaDown', parenRightPaddingAdjustment: -1 },\n accSagittal5CommaUp: { code: 'accSagittal5CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal5CommaDown: { code: 'accSagittal5CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal7CommaUp: { code: 'accSagittal7CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal7CommaDown: { code: 'accSagittal7CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal25SmallDiesisUp: { code: 'accSagittal25SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal25SmallDiesisDown: { code: 'accSagittal25SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal35MediumDiesisUp: { code: 'accSagittal35MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal35MediumDiesisDown: { code: 'accSagittal35MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal11MediumDiesisUp: { code: 'accSagittal11MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal11MediumDiesisDown: { code: 'accSagittal11MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal11LargeDiesisUp: { code: 'accSagittal11LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal11LargeDiesisDown: { code: 'accSagittal11LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal35LargeDiesisUp: { code: 'accSagittal35LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal35LargeDiesisDown: { code: 'accSagittal35LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp25SDown: { code: 'accSagittalSharp25SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat25SUp: { code: 'accSagittalFlat25SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7CDown: { code: 'accSagittalSharp7CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7CUp: { code: 'accSagittalFlat7CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5CDown: { code: 'accSagittalSharp5CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5CUp: { code: 'accSagittalFlat5CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v7kDown: { code: 'accSagittalSharp5v7kDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v7kUp: { code: 'accSagittalFlat5v7kUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp: { code: 'accSagittalSharp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat: { code: 'accSagittalFlat', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v7kUp: { code: 'accSagittalSharp5v7kUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v7kDown: { code: 'accSagittalFlat5v7kDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5CUp: { code: 'accSagittalSharp5CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5CDown: { code: 'accSagittalFlat5CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7CUp: { code: 'accSagittalSharp7CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7CDown: { code: 'accSagittalFlat7CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp25SUp: { code: 'accSagittalSharp25SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat25SDown: { code: 'accSagittalFlat25SDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp35MUp: { code: 'accSagittalSharp35MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat35MDown: { code: 'accSagittalFlat35MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11MUp: { code: 'accSagittalSharp11MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11MDown: { code: 'accSagittalFlat11MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11LUp: { code: 'accSagittalSharp11LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11LDown: { code: 'accSagittalFlat11LDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp35LUp: { code: 'accSagittalSharp35LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat35LDown: { code: 'accSagittalFlat35LDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp25SDown: { code: 'accSagittalDoubleSharp25SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat25SUp: { code: 'accSagittalDoubleFlat25SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp7CDown: { code: 'accSagittalDoubleSharp7CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat7CUp: { code: 'accSagittalDoubleFlat7CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5CDown: { code: 'accSagittalDoubleSharp5CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5CUp: { code: 'accSagittalDoubleFlat5CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5v7kDown: { code: 'accSagittalDoubleSharp5v7kDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5v7kUp: { code: 'accSagittalDoubleFlat5v7kUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp: { code: 'accSagittalDoubleSharp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat: { code: 'accSagittalDoubleFlat', parenRightPaddingAdjustment: -1 },\n accSagittal7v11KleismaUp: { code: 'accSagittal7v11KleismaUp', parenRightPaddingAdjustment: -1 },\n accSagittal7v11KleismaDown: { code: 'accSagittal7v11KleismaDown', parenRightPaddingAdjustment: -1 },\n accSagittal17CommaUp: { code: 'accSagittal17CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal17CommaDown: { code: 'accSagittal17CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal55CommaUp: { code: 'accSagittal55CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal55CommaDown: { code: 'accSagittal55CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal7v11CommaUp: { code: 'accSagittal7v11CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal7v11CommaDown: { code: 'accSagittal7v11CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v11SmallDiesisUp: { code: 'accSagittal5v11SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v11SmallDiesisDown: { code: 'accSagittal5v11SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v11SDown: { code: 'accSagittalSharp5v11SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v11SUp: { code: 'accSagittalFlat5v11SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v11CDown: { code: 'accSagittalSharp7v11CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v11CUp: { code: 'accSagittalFlat7v11CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp55CDown: { code: 'accSagittalSharp55CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat55CUp: { code: 'accSagittalFlat55CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp17CDown: { code: 'accSagittalSharp17CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat17CUp: { code: 'accSagittalFlat17CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v11kDown: { code: 'accSagittalSharp7v11kDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v11kUp: { code: 'accSagittalFlat7v11kUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v11kUp: { code: 'accSagittalSharp7v11kUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v11kDown: { code: 'accSagittalFlat7v11kDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp17CUp: { code: 'accSagittalSharp17CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat17CDown: { code: 'accSagittalFlat17CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp55CUp: { code: 'accSagittalSharp55CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat55CDown: { code: 'accSagittalFlat55CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v11CUp: { code: 'accSagittalSharp7v11CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v11CDown: { code: 'accSagittalFlat7v11CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v11SUp: { code: 'accSagittalSharp5v11SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v11SDown: { code: 'accSagittalFlat5v11SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5v11SDown: { code: 'accSagittalDoubleSharp5v11SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5v11SUp: { code: 'accSagittalDoubleFlat5v11SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp7v11CDown: { code: 'accSagittalDoubleSharp7v11CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat7v11CUp: { code: 'accSagittalDoubleFlat7v11CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp55CDown: { code: 'accSagittalDoubleSharp55CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat55CUp: { code: 'accSagittalDoubleFlat55CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp17CDown: { code: 'accSagittalDoubleSharp17CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat17CUp: { code: 'accSagittalDoubleFlat17CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp7v11kDown: { code: 'accSagittalDoubleSharp7v11kDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat7v11kUp: { code: 'accSagittalDoubleFlat7v11kUp', parenRightPaddingAdjustment: -1 },\n accSagittal23CommaUp: { code: 'accSagittal23CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal23CommaDown: { code: 'accSagittal23CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v19CommaUp: { code: 'accSagittal5v19CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v19CommaDown: { code: 'accSagittal5v19CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v23SmallDiesisUp: { code: 'accSagittal5v23SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v23SmallDiesisDown: { code: 'accSagittal5v23SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v23SDown: { code: 'accSagittalSharp5v23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v23SUp: { code: 'accSagittalFlat5v23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v19CDown: { code: 'accSagittalSharp5v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v19CUp: { code: 'accSagittalFlat5v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp23CDown: { code: 'accSagittalSharp23CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat23CUp: { code: 'accSagittalFlat23CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp23CUp: { code: 'accSagittalSharp23CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat23CDown: { code: 'accSagittalFlat23CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v19CUp: { code: 'accSagittalSharp5v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v19CDown: { code: 'accSagittalFlat5v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v23SUp: { code: 'accSagittalSharp5v23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v23SDown: { code: 'accSagittalFlat5v23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5v23SDown: { code: 'accSagittalDoubleSharp5v23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5v23SUp: { code: 'accSagittalDoubleFlat5v23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5v19CDown: { code: 'accSagittalDoubleSharp5v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5v19CUp: { code: 'accSagittalDoubleFlat5v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp23CDown: { code: 'accSagittalDoubleSharp23CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat23CUp: { code: 'accSagittalDoubleFlat23CUp', parenRightPaddingAdjustment: -1 },\n accSagittal19SchismaUp: { code: 'accSagittal19SchismaUp', parenRightPaddingAdjustment: -1 },\n accSagittal19SchismaDown: { code: 'accSagittal19SchismaDown', parenRightPaddingAdjustment: -1 },\n accSagittal17KleismaUp: { code: 'accSagittal17KleismaUp', parenRightPaddingAdjustment: -1 },\n accSagittal17KleismaDown: { code: 'accSagittal17KleismaDown', parenRightPaddingAdjustment: -1 },\n accSagittal143CommaUp: { code: 'accSagittal143CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal143CommaDown: { code: 'accSagittal143CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal11v49CommaUp: { code: 'accSagittal11v49CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal11v49CommaDown: { code: 'accSagittal11v49CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal19CommaUp: { code: 'accSagittal19CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal19CommaDown: { code: 'accSagittal19CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal7v19CommaUp: { code: 'accSagittal7v19CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal7v19CommaDown: { code: 'accSagittal7v19CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal49SmallDiesisUp: { code: 'accSagittal49SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal49SmallDiesisDown: { code: 'accSagittal49SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal23SmallDiesisUp: { code: 'accSagittal23SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal23SmallDiesisDown: { code: 'accSagittal23SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v13MediumDiesisUp: { code: 'accSagittal5v13MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v13MediumDiesisDown: { code: 'accSagittal5v13MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal11v19MediumDiesisUp: { code: 'accSagittal11v19MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal11v19MediumDiesisDown: { code: 'accSagittal11v19MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal49MediumDiesisUp: { code: 'accSagittal49MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal49MediumDiesisDown: { code: 'accSagittal49MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v49MediumDiesisUp: { code: 'accSagittal5v49MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v49MediumDiesisDown: { code: 'accSagittal5v49MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal49LargeDiesisUp: { code: 'accSagittal49LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal49LargeDiesisDown: { code: 'accSagittal49LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal11v19LargeDiesisUp: { code: 'accSagittal11v19LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal11v19LargeDiesisDown: { code: 'accSagittal11v19LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v13LargeDiesisUp: { code: 'accSagittal5v13LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v13LargeDiesisDown: { code: 'accSagittal5v13LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp23SDown: { code: 'accSagittalSharp23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat23SUp: { code: 'accSagittalFlat23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp49SDown: { code: 'accSagittalSharp49SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat49SUp: { code: 'accSagittalFlat49SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v19CDown: { code: 'accSagittalSharp7v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v19CUp: { code: 'accSagittalFlat7v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp19CDown: { code: 'accSagittalSharp19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat19CUp: { code: 'accSagittalFlat19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11v49CDown: { code: 'accSagittalSharp11v49CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11v49CUp: { code: 'accSagittalFlat11v49CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp143CDown: { code: 'accSagittalSharp143CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat143CUp: { code: 'accSagittalFlat143CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp17kDown: { code: 'accSagittalSharp17kDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat17kUp: { code: 'accSagittalFlat17kUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp19sDown: { code: 'accSagittalSharp19sDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat19sUp: { code: 'accSagittalFlat19sUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp19sUp: { code: 'accSagittalSharp19sUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat19sDown: { code: 'accSagittalFlat19sDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp17kUp: { code: 'accSagittalSharp17kUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat17kDown: { code: 'accSagittalFlat17kDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp143CUp: { code: 'accSagittalSharp143CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat143CDown: { code: 'accSagittalFlat143CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11v49CUp: { code: 'accSagittalSharp11v49CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11v49CDown: { code: 'accSagittalFlat11v49CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp19CUp: { code: 'accSagittalSharp19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat19CDown: { code: 'accSagittalFlat19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v19CUp: { code: 'accSagittalSharp7v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v19CDown: { code: 'accSagittalFlat7v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp49SUp: { code: 'accSagittalSharp49SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat49SDown: { code: 'accSagittalFlat49SDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp23SUp: { code: 'accSagittalSharp23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat23SDown: { code: 'accSagittalFlat23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v13MUp: { code: 'accSagittalSharp5v13MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v13MDown: { code: 'accSagittalFlat5v13MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11v19MUp: { code: 'accSagittalSharp11v19MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11v19MDown: { code: 'accSagittalFlat11v19MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp49MUp: { code: 'accSagittalSharp49MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat49MDown: { code: 'accSagittalFlat49MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v49MUp: { code: 'accSagittalSharp5v49MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v49MDown: { code: 'accSagittalFlat5v49MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp49LUp: { code: 'accSagittalSharp49LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat49LDown: { code: 'accSagittalFlat49LDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11v19LUp: { code: 'accSagittalSharp11v19LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11v19LDown: { code: 'accSagittalFlat11v19LDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v13LUp: { code: 'accSagittalSharp5v13LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v13LDown: { code: 'accSagittalFlat5v13LDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp23SDown: { code: 'accSagittalDoubleSharp23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat23SUp: { code: 'accSagittalDoubleFlat23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp49SDown: { code: 'accSagittalDoubleSharp49SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat49SUp: { code: 'accSagittalDoubleFlat49SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp7v19CDown: { code: 'accSagittalDoubleSharp7v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat7v19CUp: { code: 'accSagittalDoubleFlat7v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp19CDown: { code: 'accSagittalDoubleSharp19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat19CUp: { code: 'accSagittalDoubleFlat19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp11v49CDown: { code: 'accSagittalDoubleSharp11v49CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat11v49CUp: { code: 'accSagittalDoubleFlat11v49CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp143CDown: { code: 'accSagittalDoubleSharp143CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat143CUp: { code: 'accSagittalDoubleFlat143CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp17kDown: { code: 'accSagittalDoubleSharp17kDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat17kUp: { code: 'accSagittalDoubleFlat17kUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp19sDown: { code: 'accSagittalDoubleSharp19sDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat19sUp: { code: 'accSagittalDoubleFlat19sUp', parenRightPaddingAdjustment: -1 },\n accSagittalShaftUp: { code: 'accSagittalShaftUp', parenRightPaddingAdjustment: -1 },\n accSagittalShaftDown: { code: 'accSagittalShaftDown', parenRightPaddingAdjustment: -1 },\n accSagittalAcute: { code: 'accSagittalAcute', parenRightPaddingAdjustment: -1 },\n accSagittalGrave: { code: 'accSagittalGrave', parenRightPaddingAdjustment: -1 },\n accSagittal1MinaUp: { code: 'accSagittal1MinaUp', parenRightPaddingAdjustment: -1 },\n accSagittal1MinaDown: { code: 'accSagittal1MinaDown', parenRightPaddingAdjustment: -1 },\n accSagittal2MinasUp: { code: 'accSagittal2MinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal2MinasDown: { code: 'accSagittal2MinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal1TinaUp: { code: 'accSagittal1TinaUp', parenRightPaddingAdjustment: -1 },\n accSagittal1TinaDown: { code: 'accSagittal1TinaDown', parenRightPaddingAdjustment: -1 },\n accSagittal2TinasUp: { code: 'accSagittal2TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal2TinasDown: { code: 'accSagittal2TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal3TinasUp: { code: 'accSagittal3TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal3TinasDown: { code: 'accSagittal3TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal4TinasUp: { code: 'accSagittal4TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal4TinasDown: { code: 'accSagittal4TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal5TinasUp: { code: 'accSagittal5TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal5TinasDown: { code: 'accSagittal5TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal6TinasUp: { code: 'accSagittal6TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal6TinasDown: { code: 'accSagittal6TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal7TinasUp: { code: 'accSagittal7TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal7TinasDown: { code: 'accSagittal7TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal8TinasUp: { code: 'accSagittal8TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal8TinasDown: { code: 'accSagittal8TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal9TinasUp: { code: 'accSagittal9TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal9TinasDown: { code: 'accSagittal9TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittalFractionalTinaUp: { code: 'accSagittalFractionalTinaUp', parenRightPaddingAdjustment: -1 },\n accSagittalFractionalTinaDown: { code: 'accSagittalFractionalTinaDown', parenRightPaddingAdjustment: -1 },\n accidentalNarrowReversedFlat: { code: 'accidentalNarrowReversedFlat', parenRightPaddingAdjustment: -1 },\n accidentalNarrowReversedFlatAndFlat: {\n code: 'accidentalNarrowReversedFlatAndFlat',\n parenRightPaddingAdjustment: -1,\n },\n accidentalWilsonPlus: { code: 'accidentalWilsonPlus', parenRightPaddingAdjustment: -1 },\n accidentalWilsonMinus: { code: 'accidentalWilsonMinus', parenRightPaddingAdjustment: -1 },\n};\n// Helps determine the layout of accidentals.\nconst accidentalColumns = {\n 1: {\n a: [1],\n b: [1],\n },\n 2: {\n a: [1, 2],\n },\n 3: {\n a: [1, 3, 2],\n b: [1, 2, 1],\n second_on_bottom: [1, 2, 3],\n },\n 4: {\n a: [1, 3, 4, 2],\n b: [1, 2, 3, 1],\n spaced_out_tetrachord: [1, 2, 1, 2],\n },\n 5: {\n a: [1, 3, 5, 4, 2],\n b: [1, 2, 4, 3, 1],\n spaced_out_pentachord: [1, 2, 3, 2, 1],\n very_spaced_out_pentachord: [1, 2, 1, 2, 1],\n },\n 6: {\n a: [1, 3, 5, 6, 4, 2],\n b: [1, 2, 4, 5, 3, 1],\n spaced_out_hexachord: [1, 3, 2, 1, 3, 2],\n very_spaced_out_hexachord: [1, 2, 1, 2, 1, 2],\n },\n};\nconst articulations = {\n 'a.': { code: 'augmentationDot', between_lines: true },\n av: {\n aboveCode: 'articStaccatissimoAbove',\n belowCode: 'articStaccatissimoBelow',\n between_lines: true,\n },\n 'a>': {\n aboveCode: 'articAccentAbove',\n belowCode: 'articAccentBelow',\n between_lines: true,\n },\n 'a-': {\n aboveCode: 'articTenutoAbove',\n belowCode: 'articTenutoBelow',\n between_lines: true,\n },\n 'a^': {\n aboveCode: 'articMarcatoAbove',\n belowCode: 'articMarcatoBelow',\n between_lines: false,\n },\n 'a+': { code: 'pluckedLeftHandPizzicato', between_lines: false },\n ao: {\n aboveCode: 'pluckedSnapPizzicatoAbove',\n belowCode: 'pluckedSnapPizzicatoBelow',\n between_lines: false,\n },\n ah: { code: 'stringsHarmonic', between_lines: false },\n 'a@': { aboveCode: 'fermataAbove', belowCode: 'fermataBelow', between_lines: false },\n 'a@a': { code: 'fermataAbove', between_lines: false },\n 'a@u': { code: 'fermataBelow', between_lines: false },\n 'a|': { code: 'stringsUpBow', between_lines: false },\n am: { code: 'stringsDownBow', between_lines: false },\n 'a,': { code: 'pictChokeCymbal', between_lines: false }, // Choked\n};\nconst ornaments = {\n mordent: { code: 'ornamentShortTrill' },\n mordent_inverted: { code: 'ornamentMordent' },\n turn: { code: 'ornamentTurn' },\n turn_inverted: { code: 'ornamentTurnSlash' },\n tr: { code: 'ornamentTrill' },\n upprall: { code: 'ornamentPrecompSlideTrillDAnglebert' },\n downprall: { code: 'ornamentPrecompDoubleCadenceUpperPrefix' },\n prallup: { code: 'ornamentPrecompTrillSuffixDandrieu' },\n pralldown: { code: 'ornamentPrecompTrillLowerSuffix' },\n upmordent: { code: 'ornamentPrecompSlideTrillBach' },\n downmordent: { code: 'ornamentPrecompDoubleCadenceUpperPrefixTurn' },\n lineprall: { code: 'ornamentPrecompAppoggTrill' },\n prallprall: { code: 'ornamentTremblement' },\n scoop: { code: 'brassScoop' },\n doit: { code: 'brassDoitMedium' },\n fall: { code: 'brassFallLipShort' },\n doitLong: { code: 'brassLiftMedium' },\n fallLong: { code: 'brassFallRoughMedium' },\n bend: { code: 'brassBend' },\n plungerClosed: { code: 'brassMuteClosed' },\n plungerOpen: { code: 'brassMuteOpen' },\n flip: { code: 'brassFlip' },\n jazzTurn: { code: 'brassJazzTurn' },\n smear: { code: 'brassSmear' },\n};\nexport class Tables {\n /**\n * @returns the `Font` object at the head of the music font stack.\n */\n static currentMusicFont() {\n if (Tables.MUSIC_FONT_STACK.length === 0) {\n throw new RuntimeError('NoFonts', 'The font stack is empty. See: await Flow.fetchMusicFont(...); Flow.setMusicFont(...).');\n }\n else {\n return Tables.MUSIC_FONT_STACK[0];\n }\n }\n static clefProperties(clef) {\n if (!clef || !(clef in clefs))\n throw new RuntimeError('BadArgument', 'Invalid clef: ' + clef);\n return clefs[clef];\n }\n /**\n * @param keyOctaveGlyph a string in the format \"key/octave\" (e.g., \"c/5\") or \"key/octave/custom-note-head-code\" (e.g., \"g/5/t3\").\n * @param clef\n * @param params a struct with one option, `octave_shift` for clef ottavation (0 = default; 1 = 8va; -1 = 8vb, etc.).\n * @returns properties for the specified note.\n */\n // eslint-disable-next-line\n static keyProperties(keyOctaveGlyph, clef = 'treble', params) {\n let options = { octave_shift: 0 };\n if (typeof params === 'object') {\n options = Object.assign(Object.assign({}, options), params);\n }\n const pieces = keyOctaveGlyph.split('/');\n if (pieces.length < 2) {\n throw new RuntimeError('BadArguments', `First argument must be note/octave or note/octave/glyph-code: ${keyOctaveGlyph}`);\n }\n const key = pieces[0].toUpperCase();\n const value = notesInfo[key];\n if (!value)\n throw new RuntimeError('BadArguments', 'Invalid key name: ' + key);\n if (value.octave)\n pieces[1] = value.octave.toString();\n let octave = parseInt(pieces[1], 10);\n // Octave_shift is the shift to compensate for clef 8va/8vb.\n octave += -1 * options.octave_shift;\n const baseIndex = octave * 7 - 4 * 7;\n let line = (baseIndex + value.index) / 2;\n line += Tables.clefProperties(clef).line_shift;\n let stroke = 0;\n if (line <= 0 && (line * 2) % 2 === 0)\n stroke = 1; // stroke up\n if (line >= 6 && (line * 2) % 2 === 0)\n stroke = -1; // stroke down\n // Integer value for note arithmetic.\n const int_value = typeof value.int_val !== 'undefined' ? octave * 12 + value.int_val : undefined;\n // If the user specified a glyph, overwrite the glyph code.\n const code = value.code;\n const shift_right = value.shift_right;\n let customNoteHeadProps = {};\n if (pieces.length > 2 && pieces[2]) {\n const glyphName = pieces[2].toUpperCase();\n customNoteHeadProps = customNoteHeads[glyphName] || {};\n }\n return Object.assign({ key,\n octave,\n line,\n int_value, accidental: value.accidental, code,\n stroke,\n shift_right, displaced: false }, customNoteHeadProps);\n }\n static integerToNote(integer) {\n if (typeof integer === 'undefined' || integer < 0 || integer > 11) {\n throw new RuntimeError('BadArguments', `integerToNote() requires an integer in the range [0, 11]: ${integer}`);\n }\n const table = {\n 0: 'C',\n 1: 'C#',\n 2: 'D',\n 3: 'D#',\n 4: 'E',\n 5: 'F',\n 6: 'F#',\n 7: 'G',\n 8: 'G#',\n 9: 'A',\n 10: 'A#',\n 11: 'B',\n };\n const noteValue = table[integer];\n if (!noteValue) {\n throw new RuntimeError('BadArguments', `Unknown note value for integer: ${integer}`);\n }\n return noteValue;\n }\n static tabToGlyph(fret, scale = 1.0) {\n let glyph = undefined;\n let width = 0;\n let shift_y = 0;\n if (fret.toUpperCase() === 'X') {\n const glyphMetrics = new Glyph('accidentalDoubleSharp', Tables.TABLATURE_FONT_SCALE).getMetrics();\n glyph = 'accidentalDoubleSharp';\n if (glyphMetrics.width == undefined || glyphMetrics.height == undefined)\n throw new RuntimeError('InvalidMetrics', 'Width and height required');\n width = glyphMetrics.width;\n shift_y = -glyphMetrics.height / 2;\n }\n else {\n width = Tables.textWidth(fret);\n }\n return {\n text: fret,\n code: glyph,\n getWidth: () => width * scale,\n shift_y,\n };\n }\n // Used by annotation.ts and bend.ts. Clearly this implementation only works for the default font size.\n // TODO: The actual width depends on the font family, size, weight, style.\n static textWidth(text) {\n return 7 * text.toString().length;\n }\n static articulationCodes(artic) {\n return articulations[artic];\n }\n static accidentalCodes(acc) {\n return accidentals[acc];\n }\n static ornamentCodes(acc) {\n return ornaments[acc];\n }\n static keySignature(spec) {\n const keySpec = keySignatures[spec];\n if (!keySpec) {\n throw new RuntimeError('BadKeySignature', `Bad key signature spec: '${spec}'`);\n }\n if (!keySpec.acc) {\n return [];\n }\n const accidentalList = {\n b: [2, 0.5, 2.5, 1, 3, 1.5, 3.5],\n '#': [0, 1.5, -0.5, 1, 2.5, 0.5, 2],\n };\n const notes = accidentalList[keySpec.acc];\n const acc_list = [];\n for (let i = 0; i < keySpec.num; ++i) {\n const line = notes[i];\n acc_list.push({ type: keySpec.acc, line });\n }\n return acc_list;\n }\n static getKeySignatures() {\n return keySignatures;\n }\n static hasKeySignature(spec) {\n return spec in keySignatures;\n }\n /**\n * Convert duration aliases to the number based duration.\n * If the input isn't an alias, simply return the input.\n * @param duration\n * @returns Example: 'q' -> '4', '8' -> '8'\n */\n static sanitizeDuration(duration) {\n const durationNumber = durationAliases[duration];\n if (durationNumber !== undefined) {\n duration = durationNumber;\n }\n if (durations[duration] === undefined) {\n throw new RuntimeError('BadArguments', `The provided duration is not valid: ${duration}`);\n }\n return duration;\n }\n /** Convert the `duration` to a fraction. */\n static durationToFraction(duration) {\n return new Fraction().parse(Tables.sanitizeDuration(duration));\n }\n /** Convert the `duration` to a number. */\n static durationToNumber(duration) {\n return Tables.durationToFraction(duration).value();\n }\n /* Convert the `duration` to total ticks. */\n static durationToTicks(duration) {\n duration = Tables.sanitizeDuration(duration);\n const ticks = durations[duration];\n if (ticks === undefined) {\n throw new RuntimeError('InvalidDuration');\n }\n return ticks;\n }\n // Return a glyph given duration and type. The type can be a custom glyph code from customNoteHeads.\n // The default type is a regular note ('n').\n // eslint-disable-next-line\n static getGlyphProps(duration, type = 'n') {\n duration = Tables.sanitizeDuration(duration);\n // Lookup duration for default glyph head code\n const code = durationCodes[duration];\n if (code === undefined) {\n return undefined;\n }\n // Get glyph properties for 'type' from duration string (note, rest, harmonic, muted, slash)\n let glyphTypeProperties = code.type[type];\n // If this isn't a standard type, then lookup the custom note head map.\n if (glyphTypeProperties === undefined) {\n // Try and get it from the custom list of note heads\n const customGlyphTypeProperties = customNoteHeads[type.toUpperCase()];\n // If not, then return with nothing.\n if (customGlyphTypeProperties === undefined) {\n return undefined;\n }\n // Otherwise set it as the code_head value\n glyphTypeProperties = Object.assign({ code_head: customGlyphTypeProperties.code }, customGlyphTypeProperties);\n }\n const code_head = glyphTypeProperties.code_head;\n // The default implementation of getWidth() calls Glyph.getWidth(code_head, scale).\n // This can be overridden by an individual glyph type (see slash noteheads below: Tables.SLASH_NOTEHEAD_WIDTH).\n const getWidth = (scale = Tables.NOTATION_FONT_SCALE) => Glyph.getWidth(code_head, scale);\n // Merge duration props for 'duration' with the note head properties.\n return Object.assign(Object.assign(Object.assign({}, code.common), { getWidth: getWidth }), glyphTypeProperties);\n }\n}\nTables.STEM_WIDTH = 1.5;\nTables.STEM_HEIGHT = 35;\nTables.STAVE_LINE_THICKNESS = 1;\nTables.RESOLUTION = RESOLUTION;\n/**\n * Customize this by calling Flow.setMusicFont(...fontNames);\n */\nTables.MUSIC_FONT_STACK = [];\nTables.NOTATION_FONT_SCALE = 39;\nTables.TABLATURE_FONT_SCALE = 39;\nTables.SLASH_NOTEHEAD_WIDTH = 15;\nTables.STAVE_LINE_DISTANCE = 10;\n// HACK:\n// Since text origins are positioned at the baseline, we must\n// compensate for the ascender of the text. Of course, 1 staff space is\n// a very poor approximation.\n//\n// This will be deprecated in the future. This is a temporary solution until\n// we have more robust text metrics.\nTables.TEXT_HEIGHT_OFFSET_HACK = 1;\nTables.accidentalMap = accidentals;\nTables.accidentalColumnsTable = accidentalColumns;\nTables.unicode = {\n // ♯ accidental sharp\n sharp: String.fromCharCode(0x266f),\n // ♭ accidental flat\n flat: String.fromCharCode(0x266d),\n // ♮ accidental natural\n natural: String.fromCharCode(0x266e),\n // △ major seventh\n triangle: String.fromCharCode(0x25b3),\n // ø half-diminished\n 'o-with-slash': String.fromCharCode(0x00f8),\n // ° diminished\n degrees: String.fromCharCode(0x00b0),\n // ○ diminished\n circle: String.fromCharCode(0x25cb),\n};\n/* The list of valid note types. Used by note.ts during parseNoteStruct(). */\nTables.validTypes = validNoteTypes;\n// Default time signature.\nTables.TIME4_4 = {\n num_beats: 4,\n beat_value: 4,\n resolution: RESOLUTION,\n};\n// 1/2, 1, 2, 4, 8, 16, 32, 64, 128\n// NOTE: There is no 256 here! However, there are other mentions of 256 in this file.\n// For example, in durations has a 256 key, and sanitizeDuration() can return 256.\n// The sanitizeDuration() bit may need to be removed by 0xfe.\n// eslint-disable-next-line\nconst durationCodes = {\n '1/2': {\n common: {\n stem: false,\n stem_offset: 0,\n flag: false,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Breve note\n code_head: 'noteheadDoubleWhole',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDoubleWhole', scale);\n // },\n },\n h: {\n // Breve note harmonic\n code_head: 'unpitchedPercussionClef1',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('unpitchedPercussionClef1', scale);\n // },\n },\n m: {\n // Breve note muted\n code_head: 'vexNoteHeadMutedBreve',\n stem_offset: 0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('vexNoteHeadMutedBreve', scale);\n // },\n },\n r: {\n // Breve rest\n code_head: 'restDoubleWhole',\n rest: true,\n position: 'B/5',\n dot_shiftY: 0.5,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('restDoubleWhole', scale);\n // },\n },\n s: {\n // Breve note slash -\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadDoubleWhole',\n },\n },\n },\n 1: {\n common: {\n stem: false,\n stem_offset: 0,\n flag: false,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Whole note\n code_head: 'noteheadWhole',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadWhole', scale);\n // },\n },\n h: {\n // Whole note harmonic\n code_head: 'noteheadDiamondWhole',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondWhole', scale);\n // },\n },\n m: {\n // Whole note muted\n code_head: 'noteheadXWhole',\n stem_offset: -3,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXWhole', scale);\n // },\n },\n r: {\n // Whole rest\n code_head: 'restWhole',\n rest: true,\n position: 'D/5',\n dot_shiftY: 0.5,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('restWhole', scale);\n // },\n },\n s: {\n // Whole note slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadWhole',\n },\n },\n },\n 2: {\n common: {\n stem: true,\n stem_offset: 0,\n flag: false,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Half note\n code_head: 'noteheadHalf',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadHalf', scale);\n // },\n },\n h: {\n // Half note harmonic\n code_head: 'noteheadDiamondHalf',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondHalf', scale);\n // },\n },\n m: {\n // Half note muted\n code_head: 'noteheadXHalf',\n stem_offset: -3,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXHalf', scale);\n // },\n },\n r: {\n // Half rest\n code_head: 'restHalf',\n stem: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('restHalf', scale);\n // },\n },\n s: {\n // Half note slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadHalf',\n },\n },\n },\n 4: {\n common: {\n stem: true,\n stem_offset: 0,\n flag: false,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Quarter note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Quarter harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Quarter muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Quarter rest\n code_head: 'restQuarter',\n stem: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n line_above: 1.5,\n line_below: 1.5,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('restQuarter', scale);\n // },\n },\n s: {\n // Quarter slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 8: {\n common: {\n stem: true,\n stem_offset: 0,\n flag: true,\n beam_count: 1,\n stem_beam_extension: 0,\n code_flag_upstem: 'flag8thUp',\n code_flag_downstem: 'flag8thDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Eighth note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Eighth note harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Eighth note muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Eighth rest\n code_head: 'rest8th',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n line_above: 1.0,\n line_below: 1.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest8th', scale);\n // },\n },\n s: {\n // Eighth slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 16: {\n common: {\n beam_count: 2,\n stem_beam_extension: 0,\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'flag16thUp',\n code_flag_downstem: 'flag16thDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Sixteenth note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Sixteenth note harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Sixteenth note muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Sixteenth rest\n code_head: 'rest16th',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n line_above: 1.0,\n line_below: 2.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest16th', scale);\n // },\n },\n s: {\n // Sixteenth slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 32: {\n common: {\n beam_count: 3,\n stem_beam_extension: 7.5,\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'flag32ndUp',\n code_flag_downstem: 'flag32ndDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Thirty-second note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Thirty-second harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Thirty-second muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Thirty-second rest\n code_head: 'rest32nd',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -1.5,\n line_above: 2.0,\n line_below: 2.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest32nd', scale);\n // },\n },\n s: {\n // Thirty-second slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 64: {\n common: {\n beam_count: 4,\n stem_beam_extension: 15,\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'flag64thUp',\n code_flag_downstem: 'flag64thDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Sixty-fourth note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Sixty-fourth harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Sixty-fourth muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Sixty-fourth rest\n code_head: 'rest64th',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -1.5,\n line_above: 2.0,\n line_below: 3.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest64th', scale);\n // },\n },\n s: {\n // Sixty-fourth slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 128: {\n common: {\n beam_count: 5,\n stem_beam_extension: 22.5,\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'flag128thUp',\n code_flag_downstem: 'flag128thDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Hundred-twenty-eight note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Hundred-twenty-eight harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Hundred-twenty-eight muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Hundred-twenty-eight rest\n code_head: 'rest128th',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -2.5,\n line_above: 3.0,\n line_below: 3.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest128th', scale);\n // },\n },\n s: {\n // Hundred-twenty-eight slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// @author Mohit Cheppudira\n// @author Greg Ristow (modifications)\nimport { Fraction } from './fraction';\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Music } from './music';\nimport { Tables } from './tables';\nimport { Category, isAccidental, isGraceNote, isGraceNoteGroup, isStaveNote } from './typeguard';\nimport { defined, log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Accidental.DEBUG)\n log('Vex.Flow.Accidental', args);\n}\n/**\n * An `Accidental` inherits from `Modifier`, and is formatted within a\n * `ModifierContext`. Accidentals are modifiers that can be attached to\n * notes. Support is included for both western and microtonal accidentals.\n *\n * See `tests/accidental_tests.ts` for usage examples.\n */\nexport class Accidental extends Modifier {\n /**\n * Create accidental.\n * @param type value from `Vex.Flow.accidentalCodes.accidentals` table in `tables.ts`.\n * For example: `#`, `##`, `b`, `n`, etc.\n */\n constructor(type) {\n super();\n L('New accidental: ', type);\n this.type = type;\n this.position = Modifier.Position.LEFT;\n this.render_options = {\n // Font size for glyphs\n font_scale: 38,\n // Padding between accidental and parentheses on each side\n parenLeftPadding: 2,\n parenRightPadding: 2,\n };\n this.accidental = Tables.accidentalCodes(this.type);\n defined(this.accidental, 'ArgumentError', `Unknown accidental type: ${type}`);\n // Cautionary accidentals have parentheses around them\n this.cautionary = false;\n this.reset();\n }\n /** Accidentals category string. */\n static get CATEGORY() {\n return Category.Accidental;\n }\n /** Arrange accidentals inside a ModifierContext. */\n static format(accidentals, state) {\n // If there are no accidentals, no need to format their positions.\n if (!accidentals || accidentals.length === 0)\n return;\n const musicFont = Tables.currentMusicFont();\n const noteheadAccidentalPadding = musicFont.lookupMetric('accidental.noteheadAccidentalPadding');\n const leftShift = state.left_shift + noteheadAccidentalPadding;\n const accidentalSpacing = musicFont.lookupMetric('accidental.accidentalSpacing');\n const additionalPadding = musicFont.lookupMetric('accidental.leftPadding'); // padding to the left of all accidentals\n const accList = [];\n let prevNote = undefined;\n let shiftL = 0;\n // First determine the accidentals' Y positions from the note.keys\n for (let i = 0; i < accidentals.length; ++i) {\n const acc = accidentals[i];\n const note = acc.getNote();\n const stave = note.getStave();\n const index = acc.checkIndex();\n const props = note.getKeyProps()[index];\n if (note !== prevNote) {\n // Iterate through all notes to get the displaced pixels\n for (let n = 0; n < note.keys.length; ++n) {\n shiftL = Math.max(note.getLeftDisplacedHeadPx(), shiftL);\n }\n prevNote = note;\n }\n if (stave) {\n const lineSpace = stave.getSpacingBetweenLines();\n const y = stave.getYForLine(props.line);\n const accLine = Math.round((y / lineSpace) * 2) / 2;\n accList.push({ y, line: accLine, shift: shiftL, acc, lineSpace });\n }\n else {\n accList.push({ line: props.line, shift: shiftL, acc });\n }\n }\n // Sort accidentals by line number.\n accList.sort((a, b) => b.line - a.line);\n // FIXME: Confusing name. Each object in this array has a property called `line`.\n // So if this is a list of lines, you end up with: `line.line` which is very awkward.\n const lineList = [];\n // amount by which all accidentals must be shifted right or left for\n // stem flipping, notehead shifting concerns.\n let accShift = 0;\n let previousLine = undefined;\n // Create an array of unique line numbers (lineList) from accList\n for (let i = 0; i < accList.length; i++) {\n const acc = accList[i];\n // if this is the first line, or a new line, add a lineList\n if (previousLine === undefined || previousLine !== acc.line) {\n lineList.push({\n line: acc.line,\n flatLine: true,\n dblSharpLine: true,\n numAcc: 0,\n width: 0,\n column: 0,\n });\n }\n // if this accidental is not a flat, the accidental needs 3.0 lines lower\n // clearance instead of 2.5 lines for b or bb.\n // FIXME: Naming could use work. acc.acc is very awkward\n if (acc.acc.type !== 'b' && acc.acc.type !== 'bb') {\n lineList[lineList.length - 1].flatLine = false;\n }\n // if this accidental is not a double sharp, the accidental needs 3.0 lines above\n if (acc.acc.type !== '##') {\n lineList[lineList.length - 1].dblSharpLine = false;\n }\n // Track how many accidentals are on this line:\n lineList[lineList.length - 1].numAcc++;\n // Track the total x_offset needed for this line which will be needed\n // for formatting lines w/ multiple accidentals:\n // width = accidental width + universal spacing between accidentals\n lineList[lineList.length - 1].width += acc.acc.getWidth() + accidentalSpacing;\n // if this accShift is larger, use it to keep first column accidentals in the same line\n accShift = acc.shift > accShift ? acc.shift : accShift;\n previousLine = acc.line;\n }\n // ### Place Accidentals in Columns\n //\n // Default to a classic triangular layout (middle accidental farthest left),\n // but follow exceptions as outlined in G. Read's _Music Notation_ and\n // Elaine Gould's _Behind Bars_.\n //\n // Additionally, this implements different vertical collision rules for\n // flats (only need 2.5 lines clearance below) and double sharps (only\n // need 2.5 lines of clearance above or below).\n //\n // Classic layouts and exception patterns are found in the 'tables.js'\n // in 'Tables.accidentalColumnsTable'\n //\n // Beyond 6 vertical accidentals, default to the parallel ascending lines approach,\n // using as few columns as possible for the verticle structure.\n //\n // TODO (?): Allow column to be specified for an accidental at run-time?\n let totalColumns = 0;\n // establish the boundaries for a group of notes with clashing accidentals:\n for (let i = 0; i < lineList.length; i++) {\n let noFurtherConflicts = false;\n const groupStart = i;\n let groupEnd = i;\n while (groupEnd + 1 < lineList.length && !noFurtherConflicts) {\n // if this note conflicts with the next:\n if (this.checkCollision(lineList[groupEnd], lineList[groupEnd + 1])) {\n // include the next note in the group:\n groupEnd++;\n }\n else {\n noFurtherConflicts = true;\n }\n }\n // Gets an a line from the `lineList`, relative to the current group\n const getGroupLine = (index) => lineList[groupStart + index];\n const getGroupLines = (indexes) => indexes.map(getGroupLine);\n const lineDifference = (indexA, indexB) => {\n const [a, b] = getGroupLines([indexA, indexB]).map((item) => item.line);\n return a - b;\n };\n const notColliding = (...indexPairs) => indexPairs.map(getGroupLines).every(([line1, line2]) => !this.checkCollision(line1, line2));\n // Set columns for the lines in this group:\n const groupLength = groupEnd - groupStart + 1;\n // Set the accidental column for each line of the group\n let endCase = this.checkCollision(lineList[groupStart], lineList[groupEnd]) ? 'a' : 'b';\n switch (groupLength) {\n case 3:\n if (endCase === 'a' && lineDifference(1, 2) === 0.5 && lineDifference(0, 1) !== 0.5) {\n endCase = 'second_on_bottom';\n }\n break;\n case 4:\n if (notColliding([0, 2], [1, 3])) {\n endCase = 'spaced_out_tetrachord';\n }\n break;\n case 5:\n if (endCase === 'b' && notColliding([1, 3])) {\n endCase = 'spaced_out_pentachord';\n if (notColliding([0, 2], [2, 4])) {\n endCase = 'very_spaced_out_pentachord';\n }\n }\n break;\n case 6:\n if (notColliding([0, 3], [1, 4], [2, 5])) {\n endCase = 'spaced_out_hexachord';\n }\n if (notColliding([0, 2], [2, 4], [1, 3], [3, 5])) {\n endCase = 'very_spaced_out_hexachord';\n }\n break;\n default:\n break;\n }\n let groupMember;\n let column;\n // If the group contains seven members or more, use ascending parallel lines\n // of accidentals, using as few columns as possible while avoiding collisions.\n if (groupLength >= 7) {\n // First, determine how many columns to use:\n let patternLength = 2;\n let collisionDetected = true;\n while (collisionDetected === true) {\n collisionDetected = false;\n for (let line = 0; line + patternLength < lineList.length; line++) {\n if (this.checkCollision(lineList[line], lineList[line + patternLength])) {\n collisionDetected = true;\n patternLength++;\n break;\n }\n }\n }\n // Then, assign a column to each line of accidentals\n for (groupMember = i; groupMember <= groupEnd; groupMember++) {\n column = ((groupMember - i) % patternLength) + 1;\n lineList[groupMember].column = column;\n totalColumns = totalColumns > column ? totalColumns : column;\n }\n }\n else {\n // If the group contains fewer than seven members, use the layouts from\n // the Tables.accidentalColumnsTable (See: tables.ts).\n for (groupMember = i; groupMember <= groupEnd; groupMember++) {\n column = Tables.accidentalColumnsTable[groupLength][endCase][groupMember - i];\n lineList[groupMember].column = column;\n totalColumns = totalColumns > column ? totalColumns : column;\n }\n }\n // Increment i to the last note that was set, so that if a lower set of notes\n // does not conflict at all with this group, it can have its own classic shape.\n i = groupEnd;\n }\n // ### Convert Columns to x_offsets\n //\n // This keeps columns aligned, even if they have different accidentals within them\n // which sometimes results in a larger x_offset than is an accidental might need\n // to preserve the symmetry of the accidental shape.\n //\n // Neither A.C. Vinci nor G. Read address this, and it typically only happens in\n // music with complex chord clusters.\n //\n // TODO (?): Optionally allow closer compression of accidentals, instead of forcing\n // parallel columns.\n // track each column's max width, which will be used as initial shift of later columns:\n const columnWidths = [];\n const columnXOffsets = [];\n for (let i = 0; i <= totalColumns; i++) {\n columnWidths[i] = 0;\n columnXOffsets[i] = 0;\n }\n columnWidths[0] = accShift + leftShift;\n columnXOffsets[0] = accShift + leftShift;\n // Fill columnWidths with widest needed x-space;\n // this is what keeps the columns parallel.\n lineList.forEach((line) => {\n if (line.width > columnWidths[line.column])\n columnWidths[line.column] = line.width;\n });\n for (let i = 1; i < columnWidths.length; i++) {\n // this column's offset = this column's width + previous column's offset\n columnXOffsets[i] = columnWidths[i] + columnXOffsets[i - 1];\n }\n const totalShift = columnXOffsets[columnXOffsets.length - 1];\n // Set the xShift for each accidental according to column offsets:\n let accCount = 0;\n lineList.forEach((line) => {\n let lineWidth = 0;\n const lastAccOnLine = accCount + line.numAcc;\n // handle all of the accidentals on a given line:\n for (accCount; accCount < lastAccOnLine; accCount++) {\n const xShift = columnXOffsets[line.column - 1] + lineWidth;\n accList[accCount].acc.setXShift(xShift);\n // keep track of the width of accidentals we've added so far, so that when\n // we loop, we add space for them.\n lineWidth += accList[accCount].acc.getWidth() + accidentalSpacing;\n L('Line, accCount, shift: ', line.line, accCount, xShift);\n }\n });\n // update the overall layout with the full width of the accidental shapes:\n state.left_shift += totalShift + additionalPadding;\n }\n /** Helper function to determine whether two lines of accidentals collide vertically */\n static checkCollision(line1, line2) {\n let clearance = line2.line - line1.line;\n let clearanceRequired = 3;\n // But less clearance is required for certain accidentals: b, bb and ##.\n if (clearance > 0) {\n // then line 2 is on top\n clearanceRequired = line2.flatLine || line2.dblSharpLine ? 2.5 : 3.0;\n if (line1.dblSharpLine)\n clearance -= 0.5;\n }\n else {\n // line 1 is on top\n clearanceRequired = line1.flatLine || line1.dblSharpLine ? 2.5 : 3.0;\n if (line2.dblSharpLine)\n clearance -= 0.5;\n }\n const collision = Math.abs(clearance) < clearanceRequired;\n L('Line_1, Line_2, Collision: ', line1.line, line2.line, collision);\n return collision;\n }\n /**\n * Use this method to automatically apply accidentals to a set of `voices`.\n * The accidentals will be remembered between all the voices provided.\n * Optionally, you can also provide an initial `keySignature`.\n */\n static applyAccidentals(voices, keySignature) {\n const tickPositions = [];\n const tickNoteMap = {};\n // Sort the tickables in each voice by their tick position in the voice.\n voices.forEach((voice) => {\n const tickPosition = new Fraction(0, 1);\n const tickable = voice.getTickables();\n tickable.forEach((t) => {\n if (t.shouldIgnoreTicks())\n return;\n const notesAtPosition = tickNoteMap[tickPosition.value()];\n if (!notesAtPosition) {\n tickPositions.push(tickPosition.value());\n tickNoteMap[tickPosition.value()] = [t];\n }\n else {\n notesAtPosition.push(t);\n }\n tickPosition.add(t.getTicks());\n });\n });\n const music = new Music();\n // Default key signature is C major.\n if (!keySignature)\n keySignature = 'C';\n // Get the scale map, which represents the current state of each pitch.\n const scaleMapKey = music.createScaleMap(keySignature);\n const scaleMap = {};\n tickPositions.forEach((tickPos) => {\n const tickables = tickNoteMap[tickPos];\n // Array to store all pitches that modified accidental states\n // at this tick position\n const modifiedPitches = [];\n const processNote = (t) => {\n // Only StaveNote implements .addModifier(), which is used below.\n if (!isStaveNote(t) || t.isRest() || t.shouldIgnoreTicks()) {\n return;\n }\n // Go through each key and determine if an accidental should be applied.\n const staveNote = t;\n staveNote.keys.forEach((keyString, keyIndex) => {\n const key = music.getNoteParts(keyString.split('/')[0]);\n const octave = keyString.split('/')[1];\n // Force a natural for every key without an accidental\n const accidentalString = key.accidental || 'n';\n const pitch = key.root + accidentalString;\n // Determine if the current pitch has the same accidental\n // as the scale state\n if (!scaleMap[key.root + octave])\n scaleMap[key.root + octave] = scaleMapKey[key.root];\n const sameAccidental = scaleMap[key.root + octave] === pitch;\n // Determine if an identical pitch in the chord already\n // modified the accidental state\n const previouslyModified = modifiedPitches.indexOf(keyString) > -1;\n // Remove accidentals\n staveNote.getModifiers().forEach((modifier, index) => {\n if (isAccidental(modifier) && modifier.type == accidentalString && modifier.getIndex() == keyIndex) {\n staveNote.getModifiers().splice(index, 1);\n }\n });\n // Add the accidental to the StaveNote\n if (!sameAccidental || (sameAccidental && previouslyModified)) {\n // Modify the scale map so that the root pitch has an\n // updated state\n scaleMap[key.root + octave] = pitch;\n // Create the accidental\n const accidental = new Accidental(accidentalString);\n // Attach the accidental to the StaveNote\n staveNote.addModifier(accidental, keyIndex);\n // Add the pitch to list of pitches that modified accidentals\n modifiedPitches.push(keyString);\n }\n });\n // process grace notes\n staveNote.getModifiers().forEach((modifier) => {\n if (isGraceNoteGroup(modifier)) {\n modifier.getGraceNotes().forEach(processNote);\n }\n });\n };\n tickables.forEach(processNote);\n });\n }\n reset() {\n const fontScale = this.render_options.font_scale;\n this.glyph = new Glyph(this.accidental.code, fontScale);\n this.glyph.setOriginX(1.0);\n if (this.cautionary) {\n this.parenLeft = new Glyph(Tables.accidentalCodes('{').code, fontScale);\n this.parenRight = new Glyph(Tables.accidentalCodes('}').code, fontScale);\n this.parenLeft.setOriginX(1.0);\n this.parenRight.setOriginX(1.0);\n }\n }\n /** Get width in pixels. */\n getWidth() {\n if (this.cautionary) {\n const parenLeft = defined(this.parenLeft);\n const parenRight = defined(this.parenRight);\n const parenWidth = parenLeft.getMetrics().width +\n parenRight.getMetrics().width +\n this.render_options.parenLeftPadding +\n this.render_options.parenRightPadding;\n return this.glyph.getMetrics().width + parenWidth;\n }\n else {\n return this.glyph.getMetrics().width;\n }\n }\n /** Attach this accidental to `note`, which must be a `StaveNote`. */\n setNote(note) {\n defined(note, 'ArgumentError', `Bad note value: ${note}`);\n this.note = note;\n // Accidentals attached to grace notes are rendered smaller.\n if (isGraceNote(note)) {\n this.render_options.font_scale = 25;\n this.reset();\n }\n return this;\n }\n /** If called, draws parenthesis around accidental. */\n setAsCautionary() {\n this.cautionary = true;\n this.render_options.font_scale = 28;\n this.reset();\n return this;\n }\n /** Render accidental onto canvas. */\n draw() {\n const { type, position, index, cautionary, x_shift, y_shift, glyph, render_options: { parenLeftPadding, parenRightPadding }, } = this;\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n // Figure out the start `x` and `y` coordinates for note and index.\n const start = note.getModifierStartXY(position, index);\n let accX = start.x + x_shift;\n const accY = start.y + y_shift;\n L('Rendering: ', type, accX, accY);\n if (!cautionary) {\n glyph.render(ctx, accX, accY);\n }\n else {\n const parenLeft = defined(this.parenLeft);\n const parenRight = defined(this.parenRight);\n // Render the accidental in parentheses.\n parenRight.render(ctx, accX, accY);\n accX -= parenRight.getMetrics().width;\n accX -= parenRightPadding;\n accX -= this.accidental.parenRightPaddingAdjustment;\n glyph.render(ctx, accX, accY);\n accX -= glyph.getMetrics().width;\n accX -= parenLeftPadding;\n parenLeft.render(ctx, accX, accY);\n }\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Accidental.DEBUG` to `true`. */\nAccidental.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This file implements the `Stem` object. Generally this object is handled\n// by its parent `StemmableNote`.\nimport { Element } from './element';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Stem.DEBUG)\n log('Vex.Flow.Stem', args);\n}\nexport class Stem extends Element {\n constructor(options) {\n super();\n this.stem_up_y_offset = 0;\n this.stem_down_y_offset = 0;\n this.stem_up_y_base_offset = 0;\n this.stem_down_y_base_offset = 0;\n // Default notehead x bounds\n this.x_begin = (options === null || options === void 0 ? void 0 : options.x_begin) || 0;\n this.x_end = (options === null || options === void 0 ? void 0 : options.x_end) || 0;\n // Y bounds for top/bottom most notehead\n this.y_top = (options === null || options === void 0 ? void 0 : options.y_top) || 0;\n this.y_bottom = (options === null || options === void 0 ? void 0 : options.y_bottom) || 0;\n // Stem top extension\n this.stem_extension = (options === null || options === void 0 ? void 0 : options.stem_extension) || 0;\n // Direction of the stem\n this.stem_direction = (options === null || options === void 0 ? void 0 : options.stem_direction) || 0;\n // Flag to override all draw calls\n this.hide = (options === null || options === void 0 ? void 0 : options.hide) || false;\n this.isStemlet = (options === null || options === void 0 ? void 0 : options.isStemlet) || false;\n this.stemletHeight = (options === null || options === void 0 ? void 0 : options.stemletHeight) || 0;\n // Use to adjust the rendered height without affecting\n // the results of `.getExtents()`\n this.renderHeightAdjustment = 0;\n this.setOptions(options);\n }\n static get CATEGORY() {\n return Category.Stem;\n }\n // Stem directions\n static get UP() {\n return 1;\n }\n static get DOWN() {\n return -1;\n }\n // Theme\n static get WIDTH() {\n return Tables.STEM_WIDTH;\n }\n static get HEIGHT() {\n return Tables.STEM_HEIGHT;\n }\n setOptions(options) {\n // Changing where the stem meets the head\n this.stem_up_y_offset = (options === null || options === void 0 ? void 0 : options.stem_up_y_offset) || 0;\n this.stem_down_y_offset = (options === null || options === void 0 ? void 0 : options.stem_down_y_offset) || 0;\n this.stem_up_y_base_offset = (options === null || options === void 0 ? void 0 : options.stem_up_y_base_offset) || 0;\n this.stem_down_y_base_offset = (options === null || options === void 0 ? void 0 : options.stem_down_y_base_offset) || 0;\n }\n // Set the x bounds for the default notehead\n setNoteHeadXBounds(x_begin, x_end) {\n this.x_begin = x_begin;\n this.x_end = x_end;\n return this;\n }\n // Set the direction of the stem in relation to the noteheads\n setDirection(direction) {\n this.stem_direction = direction;\n }\n // Set the extension for the stem, generally for flags or beams\n setExtension(ext) {\n this.stem_extension = ext;\n }\n getExtension() {\n return this.stem_extension;\n }\n // The the y bounds for the top and bottom noteheads\n setYBounds(y_top, y_bottom) {\n this.y_top = y_top;\n this.y_bottom = y_bottom;\n }\n // Gets the entire height for the stem\n getHeight() {\n const y_offset = this.stem_direction === Stem.UP ? this.stem_up_y_offset : this.stem_down_y_offset;\n const unsigned_height = this.y_bottom - this.y_top + (Stem.HEIGHT - y_offset + this.stem_extension); // parentheses just for grouping.\n return unsigned_height * this.stem_direction;\n }\n getBoundingBox() {\n throw new RuntimeError('NotImplemented', 'getBoundingBox() not implemented.');\n }\n // Get the y coordinates for the very base of the stem to the top of\n // the extension\n getExtents() {\n const isStemUp = this.stem_direction === Stem.UP;\n const ys = [this.y_top, this.y_bottom];\n const stemHeight = Stem.HEIGHT + this.stem_extension;\n const innerMostNoteheadY = (isStemUp ? Math.min : Math.max)(...ys);\n const outerMostNoteheadY = (isStemUp ? Math.max : Math.min)(...ys);\n const stemTipY = innerMostNoteheadY + stemHeight * -this.stem_direction;\n return { topY: stemTipY, baseY: outerMostNoteheadY };\n }\n setVisibility(isVisible) {\n this.hide = !isVisible;\n return this;\n }\n setStemlet(isStemlet, stemletHeight) {\n this.isStemlet = isStemlet;\n this.stemletHeight = stemletHeight;\n return this;\n }\n adjustHeightForFlag() {\n this.renderHeightAdjustment = Tables.currentMusicFont().lookupMetric('stem.heightAdjustmentForFlag', -3);\n }\n adjustHeightForBeam() {\n this.renderHeightAdjustment = -Stem.WIDTH / 2;\n }\n // Render the stem onto the canvas\n draw() {\n this.setRendered();\n if (this.hide)\n return;\n const ctx = this.checkContext();\n let stem_x;\n let stem_y;\n const stem_direction = this.stem_direction;\n let y_base_offset = 0;\n if (stem_direction === Stem.DOWN) {\n // Down stems are rendered to the left of the head.\n stem_x = this.x_begin;\n stem_y = this.y_top + this.stem_down_y_offset;\n y_base_offset = this.stem_down_y_base_offset;\n }\n else {\n // Up stems are rendered to the right of the head.\n stem_x = this.x_end;\n stem_y = this.y_bottom - this.stem_up_y_offset;\n y_base_offset = this.stem_up_y_base_offset;\n }\n const stemHeight = this.getHeight();\n L('Rendering stem - ', 'Top Y: ', this.y_top, 'Bottom Y: ', this.y_bottom);\n // The offset from the stem's base which is required fo satisfy the stemlet height\n const stemletYOffset = this.isStemlet ? stemHeight - this.stemletHeight * this.stem_direction : 0;\n // Draw the stem\n ctx.save();\n this.applyStyle(ctx);\n ctx.beginPath();\n ctx.setLineWidth(Stem.WIDTH);\n ctx.moveTo(stem_x, stem_y - stemletYOffset + y_base_offset);\n ctx.lineTo(stem_x, stem_y - stemHeight - this.renderHeightAdjustment * stem_direction);\n ctx.stroke();\n this.restoreStyle(ctx);\n ctx.restore();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Stem.DEBUG` to `true`. */\nStem.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font, FontStyle, FontWeight } from './font';\nimport { log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (TextFormatter.DEBUG)\n log('Vex.Flow.TextFormatter', args);\n}\n/**\n * Text widths are stored in a cache, so we don't have to recompute widths\n * for the same font + string combination.\n *\n * The cache is first keyed by the font information. The key is of the form:\n * `${family}-${size}-${weight}-${style}`\n * The second level key is the specific text to be measured.\n *\n * The stored value is the measured width in `em` units.\n * textWidth == textWidthCache[cacheKey][textToMeasure]\n */\nconst textWidthCache = {};\n/**\n * Applications may register additional fonts via `TextFormatter.registerInfo(info)`.\n * The metrics for those fonts will be made available to the application.\n */\nconst registry = {};\nexport class TextFormatter {\n /**\n * Use `TextFormatter.create(...)` to build an instance from information previously\n * registered via `TextFormatter.registerInfo(info)`.\n */\n constructor(formatterInfo) {\n /** Font family. */\n this.family = '';\n /** Specified in `pt` units. */\n this.size = 14;\n /** Font metrics are extracted at 1000 upem (units per em). */\n this.resolution = 1000;\n /**\n * For text formatting, we do not require glyph outlines, but instead rely on glyph\n * bounding box metrics such as:\n * ```\n * {\n * x_min: 48,\n * x_max: 235,\n * y_min: -17,\n * y_max: 734,\n * ha: 751,\n * leftSideBearing: 48,\n * advanceWidth: 286,\n * }\n * ```\n */\n this.glyphs = {};\n this.serifs = false;\n this.monospaced = false;\n this.italic = false;\n this.bold = false;\n this.superscriptOffset = 0;\n this.subscriptOffset = 0;\n this.maxSizeGlyph = 'H';\n // This is an internal key used to index the `textWidthCache`.\n this.cacheKey = '';\n this.updateParams(formatterInfo);\n }\n /**\n * Return all registered font families.\n */\n static getFontFamilies() {\n const registeredFonts = [];\n for (const fontFamily in registry) {\n const formatterInfo = registry[fontFamily];\n registeredFonts.push(Object.assign({}, formatterInfo));\n }\n return registeredFonts;\n }\n /**\n * Call `TextFormatter.registerInfo(info)` to register font information before using this method.\n *\n * This method creates a formatter for the font that most closely matches the requested font.\n * We compare font family, bold, and italic attributes.\n * This method will return a fallback formatter if there are no matches.\n */\n static create(requestedFont = {}) {\n L('create: ', requestedFont);\n if (!requestedFont.family) {\n requestedFont.family = Font.SANS_SERIF;\n }\n // TODO: One potential (small) optimization is to cache the TextFormatter object\n // returned for each font info. We would probably want to clear the cache if\n // the registry is ever updated.\n const candidates = [];\n // The incoming font family is a string of comma-separated font family names.\n // (e.g., `PetalumaScript, Arial, sans-serif`).\n const requestedFamilies = requestedFont.family.split(/\\s*,\\s*/);\n for (const requestedFamily of requestedFamilies) {\n for (const fontFamily in registry) {\n // Support cases where the registry contains 'Roboto Slab Medium',\n // but the requestedFont.family is 'Roboto Slab'.\n if (fontFamily.startsWith(requestedFamily)) {\n candidates.push(registry[fontFamily]);\n }\n }\n if (candidates.length > 0) {\n break;\n }\n }\n let formatter;\n if (candidates.length === 0) {\n // No match, so return a fallback text formatter.\n formatter = new TextFormatter(Object.values(registry)[0]);\n }\n else if (candidates.length === 1) {\n formatter = new TextFormatter(candidates[0]);\n }\n else {\n const bold = Font.isBold(requestedFont.weight);\n const italic = Font.isItalic(requestedFont.style);\n const perfectMatch = candidates.find((f) => f.bold === bold && f.italic === italic);\n if (perfectMatch) {\n formatter = new TextFormatter(perfectMatch);\n }\n else {\n const partialMatch = candidates.find((f) => f.italic === italic || f.bold === bold);\n if (partialMatch) {\n formatter = new TextFormatter(partialMatch);\n }\n else {\n formatter = new TextFormatter(candidates[0]);\n }\n }\n }\n const fontSize = requestedFont.size;\n if (typeof fontSize !== 'undefined') {\n const fontSizeInPt = Font.convertSizeToPointValue(fontSize);\n formatter.setFontSize(fontSizeInPt);\n }\n return formatter;\n }\n /**\n * @param fontFamily used as a key to the font registry.\n * @returns the same info object that was passed in via `TextFormatter.registerInfo(info)`\n */\n static getInfo(fontFamily) {\n return registry[fontFamily];\n }\n /**\n * Apps may register their own fonts and metrics, and those metrics\n * will be available to the app for formatting.\n *\n * Metrics can be generated from a font file using fontgen_text.js in the tools/fonts directory.\n * @param info\n * @param overwrite\n */\n static registerInfo(info, overwrite = false) {\n L('registerInfo: ', info, overwrite);\n const fontFamily = info.family;\n const currFontInfo = registry[fontFamily];\n if (currFontInfo === undefined || overwrite) {\n registry[fontFamily] = info;\n }\n }\n updateParams(params) {\n if (params.family)\n this.family = params.family;\n if (params.resolution)\n this.resolution = params.resolution;\n if (params.glyphs)\n this.glyphs = params.glyphs;\n if (params.serifs)\n this.serifs = params.serifs;\n if (params.monospaced)\n this.monospaced = params.monospaced;\n if (params.italic)\n this.italic = params.italic;\n if (params.bold)\n this.bold = params.bold;\n if (params.maxSizeGlyph)\n this.maxSizeGlyph = params.maxSizeGlyph;\n if (params.superscriptOffset)\n this.superscriptOffset = params.superscriptOffset;\n if (params.subscriptOffset)\n this.subscriptOffset = params.subscriptOffset;\n this.updateCacheKey();\n }\n /** Create a hash with the current font data, so we can cache computed widths. */\n updateCacheKey() {\n const family = this.family.replace(/\\s+/g, '_');\n const size = this.size;\n const weight = this.bold ? FontWeight.BOLD : FontWeight.NORMAL;\n const style = this.italic ? FontStyle.ITALIC : FontStyle.NORMAL;\n // Use the same key format as SVGContext.\n this.cacheKey = `${family}%${size}%${weight}%${style}`;\n }\n /**\n * The glyphs table is indexed by the character (e.g., 'C', '@').\n * See: robotoslab_glyphs.ts & petalumascript_glyphs.ts.\n */\n getGlyphMetrics(character) {\n if (this.glyphs[character]) {\n return this.glyphs[character];\n }\n else {\n return this.glyphs[this.maxSizeGlyph];\n }\n }\n get maxHeight() {\n const metrics = this.getGlyphMetrics(this.maxSizeGlyph);\n return (metrics.ha / this.resolution) * this.fontSizeInPixels;\n }\n /**\n * Retrieve the character's advanceWidth as a fraction of an `em` unit.\n * For the space character ' ' as defined in the:\n * petalumascript_glyphs.ts: 250 advanceWidth in the 1000 unitsPerEm font returns 0.25.\n * robotoslab_glyphs.ts: 509 advanceWidth in the 2048 unitsPerEm font returns 0.2485.\n */\n getWidthForCharacterInEm(c) {\n var _a;\n const metrics = this.getGlyphMetrics(c);\n if (!metrics) {\n // An arbitrary number, close to the `em` width of the '#' and '5' characters in PetalumaScript.\n return 0.65;\n }\n else {\n const advanceWidth = (_a = metrics.advanceWidth) !== null && _a !== void 0 ? _a : 0;\n return advanceWidth / this.resolution;\n }\n }\n /**\n * Retrieve the total width of `text` in `em` units.\n */\n getWidthForTextInEm(text) {\n const key = this.cacheKey;\n // Get the cache for this specific font family, size, weight, style combination.\n // The cache contains previously computed widths for different `text` strings.\n let cachedWidths = textWidthCache[key];\n if (cachedWidths === undefined) {\n cachedWidths = {};\n textWidthCache[key] = cachedWidths;\n }\n let width = cachedWidths[text];\n if (width === undefined) {\n width = 0;\n for (let i = 0; i < text.length; ++i) {\n width += this.getWidthForCharacterInEm(text[i]);\n }\n cachedWidths[text] = width;\n }\n return width;\n }\n /** The width of the text (in `em`) is scaled by the font size (in `px`). */\n getWidthForTextInPx(text) {\n return this.getWidthForTextInEm(text) * this.fontSizeInPixels;\n }\n /**\n * @param size in pt.\n */\n setFontSize(size) {\n this.size = size;\n // The width cache key depends on the current font size.\n this.updateCacheKey();\n return this;\n }\n /** `this.size` is specified in points. Convert to pixels. */\n get fontSizeInPixels() {\n return this.size * Font.scaleToPxFrom.pt;\n }\n getResolution() {\n return this.resolution;\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.TextFormatter.DEBUG` to `true`. */\nTextFormatter.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { TextFormatter } from './textformatter';\nimport { Category, isStemmableNote, isTabNote } from './typeguard';\nimport { log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Annotation.DEBUG)\n log('Vex.Flow.Annotation', args);\n}\nexport var AnnotationHorizontalJustify;\n(function (AnnotationHorizontalJustify) {\n AnnotationHorizontalJustify[AnnotationHorizontalJustify[\"LEFT\"] = 1] = \"LEFT\";\n AnnotationHorizontalJustify[AnnotationHorizontalJustify[\"CENTER\"] = 2] = \"CENTER\";\n AnnotationHorizontalJustify[AnnotationHorizontalJustify[\"RIGHT\"] = 3] = \"RIGHT\";\n AnnotationHorizontalJustify[AnnotationHorizontalJustify[\"CENTER_STEM\"] = 4] = \"CENTER_STEM\";\n})(AnnotationHorizontalJustify || (AnnotationHorizontalJustify = {}));\nexport var AnnotationVerticalJustify;\n(function (AnnotationVerticalJustify) {\n AnnotationVerticalJustify[AnnotationVerticalJustify[\"TOP\"] = 1] = \"TOP\";\n AnnotationVerticalJustify[AnnotationVerticalJustify[\"CENTER\"] = 2] = \"CENTER\";\n AnnotationVerticalJustify[AnnotationVerticalJustify[\"BOTTOM\"] = 3] = \"BOTTOM\";\n AnnotationVerticalJustify[AnnotationVerticalJustify[\"CENTER_STEM\"] = 4] = \"CENTER_STEM\";\n})(AnnotationVerticalJustify || (AnnotationVerticalJustify = {}));\n/**\n * Annotations are modifiers that can be attached to\n * notes.\n *\n * See `tests/annotation_tests.ts` for usage examples.\n */\nexport class Annotation extends Modifier {\n /**\n * Annotations inherit from `Modifier` and is positioned correctly when\n * in a `ModifierContext`.\n * Create a new `Annotation` with the string `text`.\n */\n constructor(text) {\n super();\n this.text = text;\n this.horizontalJustification = AnnotationHorizontalJustify.CENTER;\n // warning: the default in the constructor is TOP, but in the factory the default is BOTTOM.\n // this is to support legacy application that may expect this.\n this.verticalJustification = AnnotationVerticalJustify.TOP;\n this.resetFont();\n // The default width is calculated from the text.\n this.setWidth(Tables.textWidth(text));\n }\n /** Annotations category string. */\n static get CATEGORY() {\n return Category.Annotation;\n }\n /** Arrange annotations within a `ModifierContext` */\n static format(annotations, state) {\n if (!annotations || annotations.length === 0)\n return false;\n let width = 0;\n for (let i = 0; i < annotations.length; ++i) {\n const annotation = annotations[i];\n const textFormatter = TextFormatter.create(annotation.textFont);\n // Text height is expressed in fractional stave spaces.\n const textLines = (5 + textFormatter.maxHeight) / Tables.STAVE_LINE_DISTANCE;\n let verticalSpaceNeeded = textLines;\n const note = annotation.checkAttachedNote();\n const stave = note.getStave();\n const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP;\n let stemHeight = 0;\n let lines = 5;\n if (isTabNote(note)) {\n if (note.render_options.draw_stem) {\n const stem = note.getStem();\n if (stem) {\n stemHeight = Math.abs(stem.getHeight()) / Tables.STAVE_LINE_DISTANCE;\n }\n }\n else {\n stemHeight = 0;\n }\n }\n else if (isStemmableNote(note)) {\n const stem = note.getStem();\n if (stem && note.getNoteType() === 'n') {\n stemHeight = Math.abs(stem.getHeight()) / Tables.STAVE_LINE_DISTANCE;\n }\n }\n if (stave) {\n lines = stave.getNumLines();\n }\n // Get the text width from the font metrics.\n const textWidth = textFormatter.getWidthForTextInPx(annotation.text);\n width = Math.max(width, textWidth);\n if (annotation.verticalJustification === this.VerticalJustify.TOP) {\n let noteLine = note.getLineNumber(true);\n if (isTabNote(note)) {\n noteLine = lines - (note.leastString() - 0.5);\n }\n if (stemDirection === Stem.UP) {\n noteLine += stemHeight;\n }\n const curTop = noteLine + state.top_text_line + 0.5;\n if (curTop < lines) {\n annotation.setTextLine(lines - noteLine);\n verticalSpaceNeeded += lines - noteLine;\n state.top_text_line = verticalSpaceNeeded;\n }\n else {\n annotation.setTextLine(state.top_text_line);\n state.top_text_line += verticalSpaceNeeded;\n }\n }\n else if (annotation.verticalJustification === this.VerticalJustify.BOTTOM) {\n let noteLine = lines - note.getLineNumber();\n if (isTabNote(note)) {\n noteLine = note.greatestString() - 1;\n }\n if (stemDirection === Stem.DOWN) {\n noteLine += stemHeight;\n }\n const curBottom = noteLine + state.text_line + 1;\n if (curBottom < lines) {\n annotation.setTextLine(lines - curBottom);\n verticalSpaceNeeded += lines - curBottom;\n state.text_line = verticalSpaceNeeded;\n }\n else {\n annotation.setTextLine(state.text_line);\n state.text_line += verticalSpaceNeeded;\n }\n }\n else {\n annotation.setTextLine(state.text_line);\n }\n }\n state.left_shift += width / 2;\n state.right_shift += width / 2;\n return true;\n }\n /**\n * Set vertical position of text (above or below stave).\n * @param just value in `AnnotationVerticalJustify`.\n */\n setVerticalJustification(just) {\n this.verticalJustification = typeof just === 'string' ? Annotation.VerticalJustifyString[just] : just;\n return this;\n }\n /**\n * Get horizontal justification.\n */\n getJustification() {\n return this.horizontalJustification;\n }\n /**\n * Set horizontal justification.\n * @param justification value in `Annotation.Justify`.\n */\n setJustification(just) {\n this.horizontalJustification = typeof just === 'string' ? Annotation.HorizontalJustifyString[just] : just;\n return this;\n }\n /** Render text beside the note. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP;\n const textFormatter = TextFormatter.create(this.textFont);\n const start = note.getModifierStartXY(ModifierPosition.ABOVE, this.index);\n this.setRendered();\n // We're changing context parameters. Save current state.\n ctx.save();\n const classString = Object.keys(this.getAttribute('classes')).join(' ');\n ctx.openGroup(classString, this.getAttribute('id'));\n ctx.setFont(this.textFont);\n const text_width = ctx.measureText(this.text).width;\n const text_height = textFormatter.maxHeight + 2;\n let x;\n let y;\n if (this.horizontalJustification === AnnotationHorizontalJustify.LEFT) {\n x = start.x;\n }\n else if (this.horizontalJustification === AnnotationHorizontalJustify.RIGHT) {\n x = start.x - text_width;\n }\n else if (this.horizontalJustification === AnnotationHorizontalJustify.CENTER) {\n x = start.x - text_width / 2;\n } /* CENTER_STEM */\n else {\n x = note.getStemX() - text_width / 2;\n }\n let stem_ext = {};\n let spacing = 0;\n const has_stem = note.hasStem();\n const stave = note.checkStave();\n // The position of the text varies based on whether or not the note\n // has a stem.\n if (has_stem) {\n stem_ext = note.checkStem().getExtents();\n spacing = stave.getSpacingBetweenLines();\n }\n if (this.verticalJustification === AnnotationVerticalJustify.BOTTOM) {\n // Use the largest (lowest) Y value\n const ys = note.getYs();\n y = ys.reduce((a, b) => (a > b ? a : b));\n y += (this.text_line + 1) * Tables.STAVE_LINE_DISTANCE + text_height;\n if (has_stem && stemDirection === Stem.DOWN) {\n y = Math.max(y, stem_ext.topY + text_height + spacing * this.text_line);\n }\n }\n else if (this.verticalJustification === AnnotationVerticalJustify.CENTER) {\n const yt = note.getYForTopText(this.text_line) - 1;\n const yb = stave.getYForBottomText(this.text_line);\n y = yt + (yb - yt) / 2 + text_height / 2;\n }\n else if (this.verticalJustification === AnnotationVerticalJustify.TOP) {\n y = note.getYs()[0] - (this.text_line + 1) * Tables.STAVE_LINE_DISTANCE;\n if (has_stem && stemDirection === Stem.UP) {\n // If the stem is above the stave already, go with default line width vs. actual\n // since the lines between don't really matter.\n spacing = stem_ext.topY < stave.getTopLineTopY() ? Tables.STAVE_LINE_DISTANCE : spacing;\n y = Math.min(y, stem_ext.topY - spacing * (this.text_line + 1));\n }\n } /* CENTER_STEM */\n else {\n const extents = note.getStemExtents();\n y = extents.topY + (extents.baseY - extents.topY) / 2 + text_height / 2;\n }\n L('Rendering annotation: ', this.text, x, y);\n ctx.fillText(this.text, x, y);\n ctx.closeGroup();\n ctx.restore();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Annotation.DEBUG` to `true`. */\nAnnotation.DEBUG = false;\nAnnotation.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n/** Text annotations can be positioned and justified relative to the note. */\nAnnotation.HorizontalJustify = AnnotationHorizontalJustify;\nAnnotation.HorizontalJustifyString = {\n left: AnnotationHorizontalJustify.LEFT,\n right: AnnotationHorizontalJustify.RIGHT,\n center: AnnotationHorizontalJustify.CENTER,\n centerStem: AnnotationHorizontalJustify.CENTER_STEM,\n};\nAnnotation.VerticalJustify = AnnotationVerticalJustify;\nAnnotation.VerticalJustifyString = {\n above: AnnotationVerticalJustify.TOP,\n top: AnnotationVerticalJustify.TOP,\n below: AnnotationVerticalJustify.BOTTOM,\n bottom: AnnotationVerticalJustify.BOTTOM,\n center: AnnotationVerticalJustify.CENTER,\n centerStem: AnnotationVerticalJustify.CENTER_STEM,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Larry Kuhns.\n// MIT License\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category, isGraceNote, isStaveNote, isStemmableNote, isTabNote } from './typeguard';\nimport { defined, log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Articulation.DEBUG)\n log('Vex.Flow.Articulation', args);\n}\nconst { ABOVE, BELOW } = Modifier.Position;\nfunction roundToNearestHalf(mathFn, value) {\n return mathFn(value / 0.5) * 0.5;\n}\n// This includes both staff and ledger lines\nfunction isWithinLines(line, position) {\n return position === ABOVE ? line <= 5 : line >= 1;\n}\nfunction getRoundingFunction(line, position) {\n if (isWithinLines(line, position)) {\n if (position === ABOVE) {\n return Math.ceil;\n }\n else {\n return Math.floor;\n }\n }\n else {\n return Math.round;\n }\n}\nfunction snapLineToStaff(canSitBetweenLines, line, position, offsetDirection) {\n // Initially, snap to nearest staff line or space\n const snappedLine = roundToNearestHalf(getRoundingFunction(line, position), line);\n const canSnapToStaffSpace = canSitBetweenLines && isWithinLines(snappedLine, position);\n const onStaffLine = snappedLine % 1 === 0;\n if (canSnapToStaffSpace && onStaffLine) {\n const HALF_STAFF_SPACE = 0.5;\n return snappedLine + HALF_STAFF_SPACE * -offsetDirection;\n }\n else {\n return snappedLine;\n }\n}\n// Helper function for checking if a Note object is either a StaveNote or a GraceNote.\nconst isStaveOrGraceNote = (note) => isStaveNote(note) || isGraceNote(note);\nfunction getTopY(note, textLine) {\n const stemDirection = note.getStemDirection();\n const { topY: stemTipY, baseY: stemBaseY } = note.getStemExtents();\n if (isStaveOrGraceNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return stemTipY;\n }\n else {\n return stemBaseY;\n }\n }\n else {\n return Math.min(...note.getYs());\n }\n }\n else if (isTabNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return stemTipY;\n }\n else {\n return note.checkStave().getYForTopText(textLine);\n }\n }\n else {\n return note.checkStave().getYForTopText(textLine);\n }\n }\n else {\n throw new RuntimeError('UnknownCategory', 'Only can get the top and bottom ys of stavenotes and tabnotes');\n }\n}\nfunction getBottomY(note, textLine) {\n const stemDirection = note.getStemDirection();\n const { topY: stemTipY, baseY: stemBaseY } = note.getStemExtents();\n if (isStaveOrGraceNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return stemBaseY;\n }\n else {\n return stemTipY;\n }\n }\n else {\n return Math.max(...note.getYs());\n }\n }\n else if (isTabNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return note.checkStave().getYForBottomText(textLine);\n }\n else {\n return stemTipY;\n }\n }\n else {\n return note.checkStave().getYForBottomText(textLine);\n }\n }\n else {\n throw new RuntimeError('UnknownCategory', 'Only can get the top and bottom ys of stavenotes and tabnotes');\n }\n}\n/**\n * Get the initial offset of the articulation from the y value of the starting position.\n * This is required because the top/bottom text positions already have spacing applied to\n * provide a \"visually pleasant\" default position. However the y values provided from\n * the stavenote's top/bottom do *not* have any pre-applied spacing. This function\n * normalizes this asymmetry.\n * @param note\n * @param position\n * @returns\n */\nfunction getInitialOffset(note, position) {\n const isOnStemTip = (position === ABOVE && note.getStemDirection() === Stem.UP) ||\n (position === BELOW && note.getStemDirection() === Stem.DOWN);\n if (isStaveOrGraceNote(note)) {\n if (note.hasStem() && isOnStemTip) {\n return 0.5;\n }\n else {\n // this amount is larger than the stem-tip offset because we start from\n // the center of the notehead\n return 1;\n }\n }\n else {\n if (note.hasStem() && isOnStemTip) {\n return 1;\n }\n else {\n return 0;\n }\n }\n}\n/**\n * Articulations and Accents are modifiers that can be\n * attached to notes. The complete list of articulations is available in\n * `tables.ts` under `Vex.Flow.articulationCodes`.\n *\n * See `tests/articulation_tests.ts` for usage examples.\n */\nexport class Articulation extends Modifier {\n /**\n * Create a new articulation.\n * @param type entry in `Vex.Flow.articulationCodes` in `tables.ts`\n */\n constructor(type) {\n super();\n this.type = type;\n this.position = BELOW;\n this.render_options = {\n font_scale: 38,\n };\n this.reset();\n }\n /** Articulations category string. */\n static get CATEGORY() {\n return Category.Articulation;\n }\n /**\n * FIXME:\n * Most of the complex formatting logic (ie: snapping to space) is\n * actually done in .render(). But that logic belongs in this method.\n *\n * Unfortunately, this isn't possible because, by this point, stem lengths\n * have not yet been finalized. Finalized stem lengths are required to determine the\n * initial position of any stem-side articulation.\n *\n * This indicates that all objects should have their stave set before being\n * formatted. It can't be an optional if you want accurate vertical positioning.\n * Consistently positioned articulations that play nice with other modifiers\n * won't be possible until we stop relying on render-time formatting.\n *\n * Ideally, when this function has completed, the vertical articulation positions\n * should be ready to render without further adjustment. But the current state\n * is far from this ideal.\n */\n static format(articulations, state) {\n if (!articulations || articulations.length === 0)\n return false;\n const margin = 0.5;\n const getIncrement = (articulation, line, position) => roundToNearestHalf(getRoundingFunction(line, position), defined(articulation.glyph.getMetrics().height) / 10 + margin);\n articulations.forEach((articulation) => {\n const note = articulation.checkAttachedNote();\n let lines = 5;\n const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP;\n let stemHeight = 0;\n // Decide if we need to consider beam direction in placement.\n if (isStemmableNote(note)) {\n const stem = note.getStem();\n if (stem) {\n stemHeight = Math.abs(stem.getHeight()) / Tables.STAVE_LINE_DISTANCE;\n }\n }\n const stave = note.getStave();\n if (stave) {\n lines = stave.getNumLines();\n }\n if (articulation.getPosition() === ABOVE) {\n let noteLine = note.getLineNumber(true);\n if (stemDirection === Stem.UP) {\n noteLine += stemHeight;\n }\n let increment = getIncrement(articulation, state.top_text_line, ABOVE);\n const curTop = noteLine + state.top_text_line + 0.5;\n // If articulation must be above stave, add lines between note and stave top\n if (!articulation.articulation.between_lines && curTop < lines) {\n increment += lines - curTop;\n }\n articulation.setTextLine(state.top_text_line);\n state.top_text_line += increment;\n }\n else if (articulation.getPosition() === BELOW) {\n let noteLine = Math.max(lines - note.getLineNumber(), 0);\n if (stemDirection === Stem.DOWN) {\n noteLine += stemHeight;\n }\n let increment = getIncrement(articulation, state.text_line, BELOW);\n const curBottom = noteLine + state.text_line + 0.5;\n // if articulation must be below stave, add lines from note to stave bottom\n if (!articulation.articulation.between_lines && curBottom < lines) {\n increment += lines - curBottom;\n }\n articulation.setTextLine(state.text_line);\n state.text_line += increment;\n }\n });\n const width = articulations\n .map((articulation) => articulation.getWidth())\n .reduce((maxWidth, articWidth) => Math.max(articWidth, maxWidth));\n state.left_shift += width / 2;\n state.right_shift += width / 2;\n return true;\n }\n static easyScoreHook({ articulations }, note, builder) {\n if (!articulations)\n return;\n const articNameToCode = {\n staccato: 'a.',\n tenuto: 'a-',\n accent: 'a>',\n };\n articulations\n .split(',')\n .map((articString) => articString.trim().split('.'))\n .map(([name, position]) => {\n const artic = { type: articNameToCode[name] };\n if (position)\n artic.position = Modifier.PositionString[position];\n return builder.getFactory().Articulation(artic);\n })\n .map((artic) => note.addModifier(artic, 0));\n }\n reset() {\n this.articulation = Tables.articulationCodes(this.type);\n const articulation = defined(this.articulation, 'ArgumentError', `Articulation not found: ${this.type}`);\n const code = (this.position === ABOVE ? articulation.aboveCode : articulation.belowCode) || articulation.code;\n this.glyph = new Glyph(code !== null && code !== void 0 ? code : '', this.render_options.font_scale);\n this.setWidth(defined(this.glyph.getMetrics().width));\n }\n /** Render articulation in position next to note. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const index = this.checkIndex();\n const { position, glyph, text_line: textLine } = this;\n const canSitBetweenLines = this.articulation.between_lines;\n const stave = note.checkStave();\n const staffSpace = stave.getSpacingBetweenLines();\n const isTab = isTabNote(note);\n // Articulations are centered over/under the note head.\n const { x } = note.getModifierStartXY(position, index);\n const shouldSitOutsideStaff = !canSitBetweenLines || isTab;\n const initialOffset = getInitialOffset(note, position);\n const padding = Tables.currentMusicFont().lookupMetric(`articulation.${glyph.getCode()}.padding`, 0);\n let y = {\n [ABOVE]: () => {\n glyph.setOrigin(0.5, 1);\n const y = getTopY(note, textLine) - (textLine + initialOffset) * staffSpace;\n return shouldSitOutsideStaff ? Math.min(stave.getYForTopText(Articulation.INITIAL_OFFSET), y) : y;\n },\n [BELOW]: () => {\n glyph.setOrigin(0.5, 0);\n const y = getBottomY(note, textLine) + (textLine + initialOffset) * staffSpace;\n return shouldSitOutsideStaff ? Math.max(stave.getYForBottomText(Articulation.INITIAL_OFFSET), y) : y;\n },\n }[position]();\n if (!isTab) {\n const offsetDirection = position === ABOVE ? -1 : +1;\n const noteLine = note.getKeyProps()[index].line;\n const distanceFromNote = (note.getYs()[index] - y) / staffSpace;\n const articLine = distanceFromNote + Number(noteLine);\n const snappedLine = snapLineToStaff(canSitBetweenLines, articLine, position, offsetDirection);\n if (isWithinLines(snappedLine, position))\n glyph.setOrigin(0.5, 0.5);\n y += Math.abs(snappedLine - articLine) * staffSpace * offsetDirection + padding * offsetDirection;\n }\n L(`Rendering articulation at (x: ${x}, y: ${y})`);\n glyph.render(ctx, x, y);\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Articulation.DEBUG` to `true`. */\nArticulation.DEBUG = false;\nArticulation.INITIAL_OFFSET = -0.5;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2021.\n// MIT License\nimport { Category } from './typeguard';\nexport class RenderContext {\n static get CATEGORY() {\n return Category.RenderContext;\n }\n set font(f) {\n this.setFont(f);\n }\n get font() {\n return this.getFont();\n }\n /**\n * This is kept for backwards compatibility with 3.0.9.\n * @deprecated use `setFont(...)` instead since it now supports CSS font shorthand.\n */\n setRawFont(f) {\n this.setFont(f);\n return this;\n }\n}\n/**\n * Draw a tiny dot marker on the specified context. A great debugging aid.\n * @param ctx context\n * @param x dot x coordinate\n * @param y dot y coordinate\n * @param color\n */\nexport function drawDot(ctx, x, y, color = '#F55') {\n ctx.save();\n ctx.setFillStyle(color);\n // draw a circle\n ctx.beginPath();\n ctx.arc(x, y, 3, 0, Math.PI * 2, true);\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Fraction } from './fraction';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\n/**\n * Tickable represents a element that sit on a score and\n * has a duration, i.e., Tickables occupy space in the musical rendering dimension.\n */\nexport class Tickable extends Element {\n constructor() {\n super();\n this._preFormatted = false;\n this._postFormatted = false;\n // These properties represent the duration of\n // this tickable element.\n this.ticks = new Fraction(0, 1); // Fractional value of ticks\n this.intrinsicTicks = 0; // Floating point value of ticks\n this.tickMultiplier = new Fraction(1, 1);\n // Formatter metrics\n this.width = 0;\n this.x_shift = 0; // Shift from tick context\n this.modifiers = [];\n this.tupletStack = [];\n this.align_center = false;\n this.center_x_shift = 0; // Shift from tick context if center aligned\n // This flag tells the formatter to ignore this tickable during\n // formatting and justification. It is set by tickables such as BarNote.\n this.ignore_ticks = false;\n // This is a space for an external formatting class or function to maintain\n // metrics.\n this.formatterMetrics = {\n // The freedom of a tickable is the distance it can move without colliding\n // with neighboring elements. A formatter can set these values during its\n // formatting pass, which a different formatter can then use to fine tune.\n freedom: { left: 0, right: 0 },\n // The simplified rational duration of this tick as a string. It can be\n // used as an index to a map or hashtable.\n duration: '',\n // The number of formatting iterations undergone.\n iterations: 0,\n // The space in pixels allocated by this formatter, along with the mean space\n // for tickables of this duration, and the deviation from the mean.\n space: {\n used: 0,\n mean: 0,\n deviation: 0,\n },\n };\n }\n static get CATEGORY() {\n return Category.Tickable;\n }\n /** Reset the Tickable, this function will be overloaded. */\n reset() {\n return this;\n }\n /** Return the ticks. */\n getTicks() {\n return this.ticks;\n }\n /** Check if it ignores the ticks. */\n shouldIgnoreTicks() {\n return this.ignore_ticks;\n }\n /** Ignore the ticks. */\n setIgnoreTicks(flag) {\n this.ignore_ticks = flag;\n return this;\n }\n /** Set width of note. Used by the formatter for positioning. */\n setWidth(width) {\n this.width = width;\n }\n /** Get width of note. Used by the formatter for positioning. */\n getWidth() {\n if (!this._preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call GetWidth on an unformatted note.\");\n }\n return this.width + (this.modifierContext ? this.modifierContext.getWidth() : 0);\n }\n /** Displace note by `x` pixels. Used by the formatter. */\n setXShift(x) {\n this.x_shift = x;\n return this;\n }\n /** Get the `x` displaced pixels of the note. */\n getXShift() {\n return this.x_shift;\n }\n /** Get `x` position of this tick context. */\n getX() {\n const tickContext = this.checkTickContext(`Can't getX() without a TickContext.`);\n return tickContext.getX() + this.x_shift;\n }\n /** Return the formatterMetrics. */\n getFormatterMetrics() {\n return this.formatterMetrics;\n }\n /** Return the center `x` shift. */\n getCenterXShift() {\n if (this.isCenterAligned()) {\n return this.center_x_shift;\n }\n return 0;\n }\n /** Set the center `x` shift. */\n setCenterXShift(centerXShift) {\n this.center_x_shift = centerXShift;\n return this;\n }\n // Check if tickable is center aligned. */\n isCenterAligned() {\n return this.align_center;\n }\n // Set/unset center alignment. */\n setCenterAlignment(align_center) {\n this.align_center = align_center;\n return this;\n }\n /**\n * Return the associated voice. Every tickable must be associated with a voice.\n * This allows formatters and preFormatter to associate them with the right modifierContexts.\n */\n getVoice() {\n return defined(this.voice, 'NoVoice', 'Tickable has no voice.');\n }\n /** Set the associated voice. */\n setVoice(voice) {\n this.voice = voice;\n }\n /** Get the tuplet. */\n getTuplet() {\n return this.tuplet;\n }\n /** Return the intrinsic ticks. */\n getTupletStack() {\n return this.tupletStack;\n }\n /**\n * Reset the specific Tuplet if this is not provided, all tuplets are reset.\n * Remove any prior tuplets from the tick calculation and\n * reset the intrinsic tick value.\n */\n resetTuplet(tuplet) {\n let noteCount;\n let notesOccupied;\n if (tuplet) {\n const i = this.tupletStack.indexOf(tuplet);\n if (i !== -1) {\n this.tupletStack.splice(i, 1);\n noteCount = tuplet.getNoteCount();\n notesOccupied = tuplet.getNotesOccupied();\n // Revert old multiplier by inverting numerator & denom.:\n this.applyTickMultiplier(noteCount, notesOccupied);\n }\n return this;\n }\n while (this.tupletStack.length) {\n tuplet = this.tupletStack.pop();\n noteCount = tuplet.getNoteCount();\n notesOccupied = tuplet.getNotesOccupied();\n // Revert old multiplier by inverting numerator & denom.:\n this.applyTickMultiplier(noteCount, notesOccupied);\n }\n return this;\n }\n /** Attach to new tuplet. */\n setTuplet(tuplet) {\n if (tuplet) {\n this.tupletStack.push(tuplet);\n const noteCount = tuplet.getNoteCount();\n const notesOccupied = tuplet.getNotesOccupied();\n this.applyTickMultiplier(notesOccupied, noteCount);\n }\n this.tuplet = tuplet;\n return this;\n }\n /**\n * Add self to the provided ModifierContext `mc`.\n * If this tickable has modifiers, set modifierContext.\n * @returns this\n */\n addToModifierContext(mc) {\n this.modifierContext = mc;\n for (let i = 0; i < this.modifiers.length; ++i) {\n this.modifierContext.addMember(this.modifiers[i]);\n }\n this.modifierContext.addMember(this);\n this._preFormatted = false;\n return this;\n }\n /**\n * Optional, if tickable has modifiers, associate a Modifier.\n * @param mod the modifier\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n addModifier(modifier, index = 0) {\n this.modifiers.push(modifier);\n this._preFormatted = false;\n return this;\n }\n /** Get the list of associated modifiers. */\n getModifiers() {\n return this.modifiers;\n }\n /** Set the Tick Context. */\n setTickContext(tc) {\n this.tickContext = tc;\n this._preFormatted = false;\n }\n checkTickContext(message = 'Tickable has no tick context.') {\n return defined(this.tickContext, 'NoTickContext', message);\n }\n /** Preformat the Tickable. */\n preFormat() {\n if (this._preFormatted)\n return;\n this.width = 0;\n if (this.modifierContext) {\n this.modifierContext.preFormat();\n this.width += this.modifierContext.getWidth();\n }\n }\n /** Set preformatted status. */\n set preFormatted(value) {\n this._preFormatted = value;\n }\n get preFormatted() {\n return this._preFormatted;\n }\n /** Postformat the Tickable. */\n postFormat() {\n if (this._postFormatted)\n return this;\n this._postFormatted = true;\n return this;\n }\n /** Set postformatted status. */\n set postFormatted(value) {\n this._postFormatted = value;\n }\n get postFormatted() {\n return this._postFormatted;\n }\n /** Return the intrinsic ticks. */\n getIntrinsicTicks() {\n return this.intrinsicTicks;\n }\n /** Set the intrinsic ticks. */\n setIntrinsicTicks(intrinsicTicks) {\n this.intrinsicTicks = intrinsicTicks;\n this.ticks = this.tickMultiplier.clone().multiply(this.intrinsicTicks);\n }\n /** Get the tick multiplier. */\n getTickMultiplier() {\n return this.tickMultiplier;\n }\n /** Apply a tick multiplier. */\n applyTickMultiplier(numerator, denominator) {\n this.tickMultiplier.multiply(numerator, denominator);\n this.ticks = this.tickMultiplier.clone().multiply(this.intrinsicTicks);\n }\n /** Set the duration. */\n setDuration(duration) {\n const ticks = duration.numerator * (Tables.RESOLUTION / duration.denominator);\n this.ticks = this.tickMultiplier.clone().multiply(ticks);\n this.intrinsicTicks = this.ticks.value();\n }\n getAbsoluteX() {\n const tickContext = this.checkTickContext(`Can't getAbsoluteX() without a TickContext.`);\n return tickContext.getX();\n }\n /** Attach this note to a modifier context. */\n setModifierContext(mc) {\n this.modifierContext = mc;\n return this;\n }\n /** Get `ModifierContext`. */\n getModifierContext() {\n return this.modifierContext;\n }\n /** Check and get `ModifierContext`. */\n checkModifierContext() {\n return defined(this.modifierContext, 'NoModifierContext', 'No modifier context attached to this tickable.');\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from './font';\nimport { drawDot } from './rendercontext';\nimport { Tables } from './tables';\nimport { Tickable } from './tickable';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\n/**\n * Note implements an abstract interface for notes and chords that\n * are rendered on a stave. Notes have some common properties: All of them\n * have a value (e.g., pitch, fret, etc.) and a duration (quarter, half, etc.)\n *\n * Some notes have stems, heads, dots, etc. Most notational elements that\n * surround a note are called *modifiers*, and every note has an associated\n * array of them. All notes also have a rendering context and belong to a stave.\n */\nexport class Note extends Tickable {\n /**\n * Every note is a tickable, i.e., it can be mutated by the `Formatter` class for\n * positioning and layout.\n *\n * @param noteStruct To create a new note you need to provide a `noteStruct`.\n */\n constructor(noteStruct) {\n super();\n if (!noteStruct) {\n throw new RuntimeError('BadArguments', 'Note must have valid initialization data to identify duration and type.');\n }\n /** Parses `noteStruct` and get note properties. */\n const parsedNoteStruct = Note.parseNoteStruct(noteStruct);\n if (!parsedNoteStruct) {\n throw new RuntimeError('BadArguments', `Invalid note initialization object: ${JSON.stringify(noteStruct)}`);\n }\n // Set note properties from parameters.\n this.keys = noteStruct.keys || [];\n // per-pitch properties\n this.keyProps = [];\n this.duration = parsedNoteStruct.duration;\n this.noteType = parsedNoteStruct.type;\n this.customTypes = parsedNoteStruct.customTypes;\n if (noteStruct.duration_override) {\n // Custom duration\n this.setDuration(noteStruct.duration_override);\n }\n else {\n // Default duration\n this.setIntrinsicTicks(parsedNoteStruct.ticks);\n }\n this.modifiers = [];\n // Get the glyph code for this note from the font.\n this.glyph = Tables.getGlyphProps(this.duration, this.noteType);\n this.customGlyphs = this.customTypes.map((t) => Tables.getGlyphProps(this.duration, t));\n // Note to play for audio players.\n this.playNote = undefined;\n // Positioning contexts used by the Formatter.\n this.ignore_ticks = false;\n // Positioning variables\n this.width = 0; // Width in pixels calculated after preFormat\n this.leftDisplacedHeadPx = 0; // Extra room on left for displaced note head\n this.rightDisplacedHeadPx = 0; // Extra room on right for displaced note head\n this.x_shift = 0; // X shift from tick context X\n this.ys = []; // list of y coordinates for each note\n // we need to hold on to these for ties and beams.\n if (noteStruct.align_center) {\n this.setCenterAlignment(noteStruct.align_center);\n }\n // The render surface.\n this.render_options = {\n annotation_spacing: 5,\n glyph_font_scale: 1,\n stroke_px: 1,\n scale: 1,\n font: '',\n y_shift: 0,\n };\n }\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // STATIC MEMBERS\n static get CATEGORY() {\n return Category.Note;\n }\n /** Debug helper. Displays various note metrics for the given note. */\n static plotMetrics(ctx, note, yPos) {\n const metrics = note.getMetrics();\n const xStart = note.getAbsoluteX() - metrics.modLeftPx - metrics.leftDisplacedHeadPx;\n const xPre1 = note.getAbsoluteX() - metrics.leftDisplacedHeadPx;\n const xAbs = note.getAbsoluteX();\n const xPost1 = note.getAbsoluteX() + metrics.notePx;\n const xPost2 = note.getAbsoluteX() + metrics.notePx + metrics.rightDisplacedHeadPx;\n const xEnd = note.getAbsoluteX() + metrics.notePx + metrics.rightDisplacedHeadPx + metrics.modRightPx;\n const xFreedomRight = xEnd + (note.getFormatterMetrics().freedom.right || 0);\n const xWidth = xEnd - xStart;\n ctx.save();\n ctx.setFont(Font.SANS_SERIF, 8);\n ctx.fillText(Math.round(xWidth) + 'px', xStart + note.getXShift(), yPos);\n const y = yPos + 7;\n function stroke(x1, x2, color, yy = y) {\n ctx.beginPath();\n ctx.setStrokeStyle(color);\n ctx.setFillStyle(color);\n ctx.setLineWidth(3);\n ctx.moveTo(x1 + note.getXShift(), yy);\n ctx.lineTo(x2 + note.getXShift(), yy);\n ctx.stroke();\n }\n stroke(xStart, xPre1, 'red');\n stroke(xPre1, xAbs, '#999');\n stroke(xAbs, xPost1, 'green');\n stroke(xPost1, xPost2, '#999');\n stroke(xPost2, xEnd, 'red');\n stroke(xEnd, xFreedomRight, '#DD0');\n stroke(xStart - note.getXShift(), xStart, '#BBB'); // Shift\n drawDot(ctx, xAbs + note.getXShift(), y, 'blue');\n const formatterMetrics = note.getFormatterMetrics();\n if (formatterMetrics.iterations > 0) {\n const spaceDeviation = formatterMetrics.space.deviation;\n const prefix = spaceDeviation >= 0 ? '+' : '';\n ctx.setFillStyle('red');\n ctx.fillText(prefix + Math.round(spaceDeviation), xAbs + note.getXShift(), yPos - 10);\n }\n ctx.restore();\n }\n static parseDuration(durationString) {\n if (!durationString) {\n return undefined;\n }\n const regexp = /(\\d*\\/?\\d+|[a-z])(d*)([nrhms]|$)/;\n const result = regexp.exec(durationString);\n if (!result) {\n return undefined;\n }\n const duration = result[1];\n const dots = result[2].length;\n const type = result[3] || 'n';\n return { duration, dots, type };\n }\n static parseNoteStruct(noteStruct) {\n // Preserve backwards-compatibility\n const durationProps = Note.parseDuration(noteStruct.duration);\n if (!durationProps) {\n return undefined;\n }\n // If specified type is invalid, return undefined.\n let type = noteStruct.type;\n if (type && !Tables.validTypes[type]) {\n return undefined;\n }\n // If no type specified, check duration or custom types\n const customTypes = [];\n if (!type) {\n type = durationProps.type || 'n';\n // If we have keys, try and check if we've got a custom glyph\n if (noteStruct.keys !== undefined) {\n noteStruct.keys.forEach((k, i) => {\n const result = k.split('/');\n // We have a custom glyph specified after the note eg. /X2\n customTypes[i] = (result && result.length === 3 ? result[2] : type);\n });\n }\n }\n // Calculate the tick duration of the note\n let ticks = Tables.durationToTicks(durationProps.duration);\n if (!ticks) {\n return undefined;\n }\n // Are there any dots?\n const dots = noteStruct.dots ? noteStruct.dots : durationProps.dots;\n if (typeof dots !== 'number') {\n return undefined;\n }\n // Add ticks as necessary depending on the numbr of dots\n let currentTicks = ticks;\n for (let i = 0; i < dots; i++) {\n if (currentTicks <= 1)\n return undefined;\n currentTicks = currentTicks / 2;\n ticks += currentTicks;\n }\n return {\n duration: durationProps.duration,\n type,\n customTypes,\n dots,\n ticks,\n };\n }\n /**\n * Get the play note, which is arbitrary data that can be used by an\n * audio player.\n */\n getPlayNote() {\n return this.playNote;\n }\n /**\n * Set the play note, which is arbitrary data that can be used by an\n * audio player.\n */\n setPlayNote(note) {\n this.playNote = note;\n return this;\n }\n /**\n * @returns true if this note is a type of rest.\n *\n * Rests don't have pitches, but take up space in the score.\n * Subclasses should override this default implementation.\n */\n isRest() {\n return false;\n }\n /** Add stroke. */\n addStroke(index, stroke) {\n stroke.setNote(this);\n stroke.setIndex(index);\n this.modifiers.push(stroke);\n this.preFormatted = false;\n return this;\n }\n /** Get the target stave. */\n getStave() {\n return this.stave;\n }\n /** Check and get the target stave. */\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n /** Set the target stave. */\n setStave(stave) {\n this.stave = stave;\n this.setYs([stave.getYForLine(0)]); // Update Y values if the stave is changed.\n this.setContext(this.stave.getContext());\n return this;\n }\n /** Get spacing to the left of the notes. */\n getLeftDisplacedHeadPx() {\n return this.leftDisplacedHeadPx;\n }\n /** Get spacing to the right of the notes. */\n getRightDisplacedHeadPx() {\n return this.rightDisplacedHeadPx;\n }\n /** Set spacing to the left of the notes. */\n setLeftDisplacedHeadPx(x) {\n this.leftDisplacedHeadPx = x;\n return this;\n }\n /** Set spacing to the right of the notes. */\n setRightDisplacedHeadPx(x) {\n this.rightDisplacedHeadPx = x;\n return this;\n }\n /** True if this note has no duration (e.g., bar notes, spacers, etc.). */\n shouldIgnoreTicks() {\n return this.ignore_ticks;\n }\n /** Get the stave line number for the note. */\n // eslint-disable-next-line\n getLineNumber(isTopNote) {\n return 0;\n }\n /** Get the stave line number for rest. */\n getLineForRest() {\n return 0;\n }\n /** Get the glyph associated with this note. */\n // eslint-disable-next-line\n getGlyph() {\n return this.glyph;\n }\n /** Get the glyph width. */\n getGlyphWidth() {\n // TODO: FIXME (multiple potential values for this.glyph)\n if (this.glyph) {\n if (this.glyph.getMetrics) {\n return this.glyph.getMetrics().width;\n }\n else if (this.glyph.getWidth) {\n return this.glyph.getWidth(this.render_options.glyph_font_scale);\n }\n }\n return 0;\n }\n /**\n * Set Y positions for this note. Each Y value is associated with\n * an individual pitch/key within the note/chord.\n */\n setYs(ys) {\n this.ys = ys;\n return this;\n }\n /**\n * Get Y positions for this note. Each Y value is associated with\n * an individual pitch/key within the note/chord.\n */\n getYs() {\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', 'No Y-values calculated for this note.');\n }\n return this.ys;\n }\n /**\n * Get the Y position of the space above the stave onto which text can\n * be rendered.\n */\n getYForTopText(text_line) {\n return this.checkStave().getYForTopText(text_line);\n }\n /** Return the voice that this note belongs in. */\n getVoice() {\n if (!this.voice)\n throw new RuntimeError('NoVoice', 'Note has no voice.');\n return this.voice;\n }\n /** Attach this note to `voice`. */\n setVoice(voice) {\n this.voice = voice;\n this.preFormatted = false;\n return this;\n }\n /** Get the `TickContext` for this note. */\n getTickContext() {\n return this.checkTickContext();\n }\n /** Set the `TickContext` for this note. */\n setTickContext(tc) {\n this.tickContext = tc;\n this.preFormatted = false;\n return this;\n }\n /** Accessor to duration. */\n getDuration() {\n return this.duration;\n }\n /** Accessor to isDotted. */\n isDotted() {\n return this.getModifiersByType('Dot').length > 0;\n }\n /** Accessor to hasStem. */\n hasStem() {\n return false;\n }\n /** Accessor to note type. */\n getNoteType() {\n return this.noteType;\n }\n /** Get the beam. */\n getBeam() {\n return this.beam;\n }\n /** Check and get the beam. */\n checkBeam() {\n return defined(this.beam, 'NoBeam', 'No beam attached to instance');\n }\n /** Check it has a beam. */\n hasBeam() {\n return this.beam != undefined;\n }\n /** Set the beam. */\n setBeam(beam) {\n this.beam = beam;\n return this;\n }\n /**\n * Attach a modifier to this note.\n * @param modifier the Modifier to add.\n * @param index of the key to modify.\n * @returns this\n */\n addModifier(modifier, index = 0) {\n const signature = 'Note.addModifier(modifier: Modifier, index: number=0)';\n // Backwards compatibility with 3.0.9.\n if (typeof index === 'string') {\n index = parseInt(index);\n // eslint-disable-next-line\n console.warn(signature + ' expected a number for `index`, but received a string.');\n }\n // Some versions of VexFlow had the two parameters reversed.\n // Check here and throw an error if the argument types are not correct.\n if (typeof modifier !== 'object' || typeof index !== 'number') {\n throw new RuntimeError('WrongParams', 'Incorrect call signature. Use ' + signature + ' instead.');\n }\n modifier.setNote(this);\n modifier.setIndex(index);\n super.addModifier(modifier);\n return this;\n }\n // Get all modifiers of a specific type in the `ModifierContext`\n getModifiersByType(type) {\n return this.checkModifierContext().getMembers(type);\n }\n /** Get the coordinates for where modifiers begin. */\n // eslint-disable-next-line\n getModifierStartXY(position, index, options) {\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call GetModifierStartXY on an unformatted note\");\n }\n return {\n x: this.getAbsoluteX(),\n y: this.ys[0],\n };\n }\n getRightParenthesisPx(index) {\n const props = this.getKeyProps()[index];\n return props.displaced ? this.getRightDisplacedHeadPx() : 0;\n }\n getLeftParenthesisPx(index) {\n const props = this.getKeyProps()[index];\n return props.displaced ? this.getLeftDisplacedHeadPx() : 0;\n }\n getFirstDotPx() {\n let px = this.getRightDisplacedHeadPx();\n if (this.checkModifierContext().getMembers('Parenthesis').length !== 0)\n px += Tables.currentMusicFont().lookupMetric('parenthesis.default.width');\n return px;\n }\n /** Get the metrics for this note. */\n getMetrics() {\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call getMetrics on an unformatted note.\");\n }\n const modLeftPx = this.modifierContext ? this.modifierContext.getState().left_shift : 0;\n const modRightPx = this.modifierContext ? this.modifierContext.getState().right_shift : 0;\n const width = this.getWidth();\n const glyphWidth = this.getGlyphWidth();\n const notePx = width -\n modLeftPx - // subtract left modifiers\n modRightPx - // subtract right modifiers\n this.leftDisplacedHeadPx - // subtract left displaced head\n this.rightDisplacedHeadPx; // subtract right displaced head\n // NOTE: If you change this, remember to update MockTickable.getMetrics() in the tests/ directory.\n return {\n width,\n glyphWidth,\n notePx,\n // Modifier spacing.\n modLeftPx,\n modRightPx,\n // Displaced note head on left or right.\n leftDisplacedHeadPx: this.leftDisplacedHeadPx,\n rightDisplacedHeadPx: this.rightDisplacedHeadPx,\n glyphPx: 0,\n };\n }\n /**\n * Get the absolute `X` position of this note's tick context. This\n * excludes x_shift, so you'll need to factor it in if you're\n * looking for the post-formatted x-position.\n */\n getAbsoluteX() {\n const tickContext = this.checkTickContext(`Can't getAbsoluteX() without a TickContext.`);\n // Position note to left edge of tick context.\n let x = tickContext.getX();\n if (this.stave) {\n x += this.stave.getNoteStartX() + Tables.currentMusicFont().lookupMetric('stave.padding');\n }\n if (this.isCenterAligned()) {\n x += this.getCenterXShift();\n }\n return x;\n }\n /** Get the direction of the stem. */\n getStemDirection() {\n throw new RuntimeError('NoStem', 'No stem attached to this note.');\n }\n /** Get the top and bottom `y` values of the stem. */\n getStemExtents() {\n throw new RuntimeError('NoStem', 'No stem attached to this note.');\n }\n /** Get the `x` coordinate to the right of the note. */\n getTieRightX() {\n let tieStartX = this.getAbsoluteX();\n const note_glyph_width = this.glyph.getWidth();\n tieStartX += note_glyph_width / 2;\n tieStartX += -this.width / 2 + this.width + 2;\n return tieStartX;\n }\n /** Get the `x` coordinate to the left of the note. */\n getTieLeftX() {\n let tieEndX = this.getAbsoluteX();\n const note_glyph_width = this.glyph.getWidth();\n tieEndX += note_glyph_width / 2;\n tieEndX -= this.width / 2 + 2;\n return tieEndX;\n }\n // Get the pitches in the note\n getKeys() {\n return this.keys;\n }\n // Get the properties for all the keys in the note\n getKeyProps() {\n return this.keyProps;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// A base class for stave modifiers (e.g. clefs, key signatures)\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { defined } from './util';\nexport var StaveModifierPosition;\n(function (StaveModifierPosition) {\n StaveModifierPosition[StaveModifierPosition[\"CENTER\"] = 0] = \"CENTER\";\n StaveModifierPosition[StaveModifierPosition[\"LEFT\"] = 1] = \"LEFT\";\n StaveModifierPosition[StaveModifierPosition[\"RIGHT\"] = 2] = \"RIGHT\";\n StaveModifierPosition[StaveModifierPosition[\"ABOVE\"] = 3] = \"ABOVE\";\n StaveModifierPosition[StaveModifierPosition[\"BELOW\"] = 4] = \"BELOW\";\n StaveModifierPosition[StaveModifierPosition[\"BEGIN\"] = 5] = \"BEGIN\";\n StaveModifierPosition[StaveModifierPosition[\"END\"] = 6] = \"END\";\n})(StaveModifierPosition || (StaveModifierPosition = {}));\nexport class StaveModifier extends Element {\n constructor() {\n super();\n this.width = 0;\n this.x = 0;\n this.padding = 10;\n this.position = StaveModifierPosition.ABOVE;\n }\n static get CATEGORY() {\n return Category.StaveModifier;\n }\n static get Position() {\n return StaveModifierPosition;\n }\n getPosition() {\n return this.position;\n }\n setPosition(position) {\n this.position = position;\n return this;\n }\n getStave() {\n return this.stave;\n }\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n setStave(stave) {\n this.stave = stave;\n return this;\n }\n getWidth() {\n return this.width;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n getX() {\n return this.x;\n }\n setX(x) {\n this.x = x;\n return this;\n }\n placeGlyphOnLine(glyph, stave, line, customShift = 0) {\n glyph.setYShift(stave.getYForLine(line !== null && line !== void 0 ? line : 0) - stave.getYForGlyphs() + customShift);\n }\n getPadding(index) {\n return index !== undefined && index < 2 ? 0 : this.padding;\n }\n setPadding(padding) {\n this.padding = padding;\n return this;\n }\n setLayoutMetrics(layoutMetrics) {\n this.layoutMetrics = layoutMetrics;\n return this;\n }\n getLayoutMetrics() {\n return this.layoutMetrics;\n }\n // eslint-disable-next-line\n draw(...args) {\n // DO NOTHING.\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// Author Larry Kuhns 2011\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nexport var BarlineType;\n(function (BarlineType) {\n BarlineType[BarlineType[\"SINGLE\"] = 1] = \"SINGLE\";\n BarlineType[BarlineType[\"DOUBLE\"] = 2] = \"DOUBLE\";\n BarlineType[BarlineType[\"END\"] = 3] = \"END\";\n BarlineType[BarlineType[\"REPEAT_BEGIN\"] = 4] = \"REPEAT_BEGIN\";\n BarlineType[BarlineType[\"REPEAT_END\"] = 5] = \"REPEAT_END\";\n BarlineType[BarlineType[\"REPEAT_BOTH\"] = 6] = \"REPEAT_BOTH\";\n BarlineType[BarlineType[\"NONE\"] = 7] = \"NONE\";\n})(BarlineType || (BarlineType = {}));\nexport class Barline extends StaveModifier {\n constructor(type) {\n super();\n this.thickness = Tables.STAVE_LINE_THICKNESS;\n const TYPE = BarlineType;\n this.widths = {};\n this.widths[TYPE.SINGLE] = 5;\n this.widths[TYPE.DOUBLE] = 5;\n this.widths[TYPE.END] = 5;\n this.widths[TYPE.REPEAT_BEGIN] = 5;\n this.widths[TYPE.REPEAT_END] = 5;\n this.widths[TYPE.REPEAT_BOTH] = 5;\n this.widths[TYPE.NONE] = 5;\n this.paddings = {};\n this.paddings[TYPE.SINGLE] = 0;\n this.paddings[TYPE.DOUBLE] = 0;\n this.paddings[TYPE.END] = 0;\n this.paddings[TYPE.REPEAT_BEGIN] = 15;\n this.paddings[TYPE.REPEAT_END] = 15;\n this.paddings[TYPE.REPEAT_BOTH] = 15;\n this.paddings[TYPE.NONE] = 0;\n this.layoutMetricsMap = {};\n this.layoutMetricsMap[TYPE.SINGLE] = {\n xMin: 0,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.DOUBLE] = {\n xMin: -3,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.END] = {\n xMin: -5,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.REPEAT_END] = {\n xMin: -10,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.REPEAT_BEGIN] = {\n xMin: -2,\n xMax: 10,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.REPEAT_BOTH] = {\n xMin: -10,\n xMax: 10,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.NONE] = {\n xMin: 0,\n xMax: 0,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.setPosition(StaveModifierPosition.BEGIN);\n this.setType(type);\n }\n static get CATEGORY() {\n return Category.Barline;\n }\n static get type() {\n return BarlineType;\n }\n static get typeString() {\n return {\n single: BarlineType.SINGLE,\n double: BarlineType.DOUBLE,\n end: BarlineType.END,\n repeatBegin: BarlineType.REPEAT_BEGIN,\n repeatEnd: BarlineType.REPEAT_END,\n repeatBoth: BarlineType.REPEAT_BOTH,\n none: BarlineType.NONE,\n };\n }\n getType() {\n return this.type;\n }\n setType(type) {\n this.type = typeof type === 'string' ? Barline.typeString[type] : type;\n this.setWidth(this.widths[this.type]);\n this.setPadding(this.paddings[this.type]);\n this.setLayoutMetrics(this.layoutMetricsMap[this.type]);\n return this;\n }\n // Draw barlines\n draw(stave) {\n stave.checkContext();\n this.setRendered();\n switch (this.type) {\n case BarlineType.SINGLE:\n this.drawVerticalBar(stave, this.x, false);\n break;\n case BarlineType.DOUBLE:\n this.drawVerticalBar(stave, this.x, true);\n break;\n case BarlineType.END:\n this.drawVerticalEndBar(stave, this.x);\n break;\n case BarlineType.REPEAT_BEGIN:\n // If the barline is shifted over (in front of clef/time/key)\n // Draw vertical bar at the beginning.\n this.drawRepeatBar(stave, this.x, true);\n if (stave.getX() !== this.x) {\n this.drawVerticalBar(stave, stave.getX());\n }\n break;\n case BarlineType.REPEAT_END:\n this.drawRepeatBar(stave, this.x, false);\n break;\n case BarlineType.REPEAT_BOTH:\n this.drawRepeatBar(stave, this.x, false);\n this.drawRepeatBar(stave, this.x, true);\n break;\n default:\n // Default is NONE, so nothing to draw\n break;\n }\n }\n drawVerticalBar(stave, x, double_bar) {\n const staveCtx = stave.checkContext();\n const topY = stave.getTopLineTopY();\n const botY = stave.getBottomLineBottomY();\n if (double_bar) {\n staveCtx.fillRect(x - 3, topY, 1, botY - topY);\n }\n staveCtx.fillRect(x, topY, 1, botY - topY);\n }\n drawVerticalEndBar(stave, x) {\n const staveCtx = stave.checkContext();\n const topY = stave.getTopLineTopY();\n const botY = stave.getBottomLineBottomY();\n staveCtx.fillRect(x - 5, topY, 1, botY - topY);\n staveCtx.fillRect(x - 2, topY, 3, botY - topY);\n }\n drawRepeatBar(stave, x, begin) {\n const staveCtx = stave.checkContext();\n const topY = stave.getTopLineTopY();\n const botY = stave.getBottomLineBottomY();\n let x_shift = 3;\n if (!begin) {\n x_shift = -5;\n }\n staveCtx.fillRect(x + x_shift, topY, 1, botY - topY);\n staveCtx.fillRect(x - 2, topY, 3, botY - topY);\n const dot_radius = 2;\n // Shift dots left or right\n if (begin) {\n x_shift += 4;\n }\n else {\n x_shift -= 4;\n }\n const dot_x = x + x_shift + dot_radius / 2;\n // calculate the y offset based on number of stave lines\n let y_offset = (stave.getNumLines() - 1) * stave.getSpacingBetweenLines();\n y_offset = y_offset / 2 - stave.getSpacingBetweenLines() / 2;\n let dot_y = topY + y_offset + dot_radius / 2;\n // draw the top repeat dot\n staveCtx.beginPath();\n staveCtx.arc(dot_x, dot_y, dot_radius, 0, Math.PI * 2, false);\n staveCtx.fill();\n // draw the bottom repeat dot\n dot_y += stave.getSpacingBetweenLines();\n staveCtx.beginPath();\n staveCtx.arc(dot_x, dot_y, dot_radius, 0, Math.PI * 2, false);\n staveCtx.fill();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// Author: Aaron (@AaronDavidNewman)\n//\n// This implements chord symbols above/below a chord.\n// Chord symbols are modifiers that can be attached to notes.\n// They can contain multiple 'blocks' which represent text or\n// glyphs with various positioning options.\n//\n// See `tests/chordsymbol_tests.ts` for usage examples.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Tables } from './tables';\nimport { TextFormatter } from './textformatter';\nimport { Category } from './typeguard';\nimport { log } from './util';\n// To enable logging for this class. Set `Vex.Flow.ChordSymbol.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (ChordSymbol.DEBUG)\n log('Vex.Flow.ChordSymbol', args);\n}\nexport var ChordSymbolHorizontalJustify;\n(function (ChordSymbolHorizontalJustify) {\n ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify[\"LEFT\"] = 1] = \"LEFT\";\n ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify[\"CENTER\"] = 2] = \"CENTER\";\n ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify[\"RIGHT\"] = 3] = \"RIGHT\";\n ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify[\"CENTER_STEM\"] = 4] = \"CENTER_STEM\";\n})(ChordSymbolHorizontalJustify || (ChordSymbolHorizontalJustify = {}));\nexport var ChordSymbolVerticalJustify;\n(function (ChordSymbolVerticalJustify) {\n ChordSymbolVerticalJustify[ChordSymbolVerticalJustify[\"TOP\"] = 1] = \"TOP\";\n ChordSymbolVerticalJustify[ChordSymbolVerticalJustify[\"BOTTOM\"] = 2] = \"BOTTOM\";\n})(ChordSymbolVerticalJustify || (ChordSymbolVerticalJustify = {}));\nexport var SymbolTypes;\n(function (SymbolTypes) {\n SymbolTypes[SymbolTypes[\"GLYPH\"] = 1] = \"GLYPH\";\n SymbolTypes[SymbolTypes[\"TEXT\"] = 2] = \"TEXT\";\n SymbolTypes[SymbolTypes[\"LINE\"] = 3] = \"LINE\";\n})(SymbolTypes || (SymbolTypes = {}));\nexport var SymbolModifiers;\n(function (SymbolModifiers) {\n SymbolModifiers[SymbolModifiers[\"NONE\"] = 1] = \"NONE\";\n SymbolModifiers[SymbolModifiers[\"SUBSCRIPT\"] = 2] = \"SUBSCRIPT\";\n SymbolModifiers[SymbolModifiers[\"SUPERSCRIPT\"] = 3] = \"SUPERSCRIPT\";\n})(SymbolModifiers || (SymbolModifiers = {}));\n/**\n * ChordSymbol is a modifier that creates a chord symbol above/below a chord.\n * As a modifier, it is attached to an existing note.\n */\nexport class ChordSymbol extends Modifier {\n constructor() {\n super();\n this.symbolBlocks = [];\n this.horizontal = ChordSymbolHorizontalJustify.LEFT;\n this.vertical = ChordSymbolVerticalJustify.TOP;\n this.useKerning = true;\n this.reportWidth = true;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.ChordSymbol;\n }\n static get superSubRatio() {\n return ChordSymbol.metrics.global.superSubRatio;\n }\n /** Currently unused: Globally turn off text formatting, if the built-in formatting does not work for your font. */\n static set NO_TEXT_FORMAT(val) {\n ChordSymbol.noFormat = val;\n }\n static get NO_TEXT_FORMAT() {\n return ChordSymbol.noFormat;\n }\n // eslint-disable-next-line\n static getMetricForGlyph(glyphCode) {\n if (ChordSymbol.metrics[glyphCode]) {\n return ChordSymbol.metrics[glyphCode];\n }\n return undefined;\n }\n static get engravingFontResolution() {\n return Tables.currentMusicFont().getResolution();\n }\n static get spacingBetweenBlocks() {\n return ChordSymbol.metrics.global.spacing / ChordSymbol.engravingFontResolution;\n }\n static getWidthForGlyph(glyph) {\n const metric = ChordSymbol.getMetricForGlyph(glyph.code);\n if (!metric) {\n return 0.65; // probably should do something here.\n }\n return metric.advanceWidth / ChordSymbol.engravingFontResolution;\n }\n static getYShiftForGlyph(glyph) {\n const metric = ChordSymbol.getMetricForGlyph(glyph.code);\n if (!metric) {\n return 0;\n }\n return metric.yOffset / ChordSymbol.engravingFontResolution;\n }\n static getXShiftForGlyph(glyph) {\n const metric = ChordSymbol.getMetricForGlyph(glyph.code);\n if (!metric) {\n return 0;\n }\n return (-1 * metric.leftSideBearing) / ChordSymbol.engravingFontResolution;\n }\n static get superscriptOffset() {\n return ChordSymbol.metrics.global.superscriptOffset / ChordSymbol.engravingFontResolution;\n }\n static get subscriptOffset() {\n return ChordSymbol.metrics.global.subscriptOffset / ChordSymbol.engravingFontResolution;\n }\n static get kerningOffset() {\n return ChordSymbol.metrics.global.kerningOffset / ChordSymbol.engravingFontResolution;\n }\n // eslint-disable-next-line\n static get metrics() {\n return Tables.currentMusicFont().getMetrics().glyphs.chordSymbol;\n }\n static get lowerKerningText() {\n // For example, see: `bravura_metrics.ts`\n // BravuraMetrics.glyphs.chordSymbol.global.lowerKerningText, which returns an array of letters.\n // ['D', 'F', 'P', 'T', 'V', 'Y']\n return ChordSymbol.metrics.global.lowerKerningText;\n }\n static get upperKerningText() {\n return ChordSymbol.metrics.global.upperKerningText;\n }\n static isSuperscript(block) {\n return block.symbolModifier !== undefined && block.symbolModifier === SymbolModifiers.SUPERSCRIPT;\n }\n static isSubscript(block) {\n return block.symbolModifier !== undefined && block.symbolModifier === SymbolModifiers.SUBSCRIPT;\n }\n /**\n * Estimate the width of the whole chord symbol, based on the sum of the widths of the individual blocks.\n * Estimate how many lines above/below the staff we need.\n */\n static format(symbols, state) {\n var _a;\n if (!symbols || symbols.length === 0)\n return false;\n let width = 0;\n let nonSuperWidth = 0;\n const reportedWidths = [];\n for (const symbol of symbols) {\n const fontSize = Font.convertSizeToPointValue((_a = symbol.textFont) === null || _a === void 0 ? void 0 : _a.size);\n const fontAdj = Font.scaleSize(fontSize, 0.05);\n const glyphAdj = fontAdj * 2;\n let lineSpaces = 1;\n let vAlign = false;\n for (let j = 0; j < symbol.symbolBlocks.length; ++j) {\n const block = symbol.symbolBlocks[j];\n const sup = ChordSymbol.isSuperscript(block);\n const sub = ChordSymbol.isSubscript(block);\n const superSubScale = sup || sub ? ChordSymbol.superSubRatio : 1;\n const adj = block.symbolType === SymbolTypes.GLYPH ? glyphAdj * superSubScale : fontAdj * superSubScale;\n // If there are super/subscripts, they extend beyond the line so\n // assume they take up 2 lines\n if (sup || sub) {\n lineSpaces = 2;\n }\n // If there is a symbol-specific offset, add it but consider font\n // size since font and glyphs will be interspersed.\n const fontSize = symbol.textFormatter.fontSizeInPixels;\n const superSubFontSize = fontSize * superSubScale;\n if (block.symbolType === SymbolTypes.GLYPH && block.glyph !== undefined) {\n block.width = ChordSymbol.getWidthForGlyph(block.glyph) * superSubFontSize;\n block.yShift += ChordSymbol.getYShiftForGlyph(block.glyph) * superSubFontSize;\n block.xShift += ChordSymbol.getXShiftForGlyph(block.glyph) * superSubFontSize;\n block.glyph.scale = block.glyph.scale * adj;\n }\n else if (block.symbolType === SymbolTypes.TEXT) {\n block.width = block.width * superSubFontSize;\n block.yShift += symbol.getYOffsetForText(block.text) * adj;\n }\n if (block.symbolType === SymbolTypes.GLYPH &&\n block.glyph !== undefined &&\n block.glyph.code === ChordSymbol.glyphs.over.code) {\n lineSpaces = 2;\n }\n block.width += ChordSymbol.spacingBetweenBlocks * fontSize * superSubScale;\n // If a subscript immediately follows a superscript block, try to\n // overlay them.\n if (sup && j > 0) {\n const prev = symbol.symbolBlocks[j - 1];\n if (!ChordSymbol.isSuperscript(prev)) {\n nonSuperWidth = width;\n }\n }\n if (sub && nonSuperWidth > 0) {\n vAlign = true;\n // slide the symbol over so it lines up with superscript\n block.xShift = block.xShift + (nonSuperWidth - width);\n width = nonSuperWidth;\n nonSuperWidth = 0;\n // If we have vertically lined up, turn kerning off.\n symbol.setEnableKerning(false);\n }\n if (!sup && !sub) {\n nonSuperWidth = 0;\n }\n block.vAlign = vAlign;\n width += block.width;\n }\n // make kerning adjustments after computing super/subscripts\n symbol.updateKerningAdjustments();\n symbol.updateOverBarAdjustments();\n if (symbol.getVertical() === ChordSymbolVerticalJustify.TOP) {\n symbol.setTextLine(state.top_text_line);\n state.top_text_line += lineSpaces;\n }\n else {\n symbol.setTextLine(state.text_line + 1);\n state.text_line += lineSpaces + 1;\n }\n if (symbol.getReportWidth()) {\n reportedWidths.push(width);\n }\n else {\n reportedWidths.push(0);\n }\n }\n width = reportedWidths.reduce((a, b) => a + b, 0);\n state.left_shift += width / 2;\n state.right_shift += width / 2;\n return true;\n }\n /**\n * Default text font.\n * Choose a font family that works well with the current music engraving font.\n * @override `Element.TEXT_FONT`.\n */\n static get TEXT_FONT() {\n let family = 'Roboto Slab, Times, serif';\n if (Tables.currentMusicFont().getName() === 'Petaluma') {\n // Fixes Issue #1180\n family = 'PetalumaScript, Arial, sans-serif';\n }\n return {\n family,\n size: 12,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n };\n }\n /**\n * The offset is specified in `em`. Scale this value by the font size in pixels.\n */\n get superscriptOffset() {\n return ChordSymbol.superscriptOffset * this.textFormatter.fontSizeInPixels;\n }\n get subscriptOffset() {\n return ChordSymbol.subscriptOffset * this.textFormatter.fontSizeInPixels;\n }\n setReportWidth(value) {\n this.reportWidth = value;\n return this;\n }\n getReportWidth() {\n return this.reportWidth;\n }\n updateOverBarAdjustments() {\n const barIndex = this.symbolBlocks.findIndex(({ symbolType, glyph }) => symbolType === SymbolTypes.GLYPH && glyph !== undefined && glyph.code === 'csymDiagonalArrangementSlash');\n if (barIndex < 0) {\n return;\n }\n const bar = this.symbolBlocks[barIndex];\n const xoff = bar.width / 4;\n const yoff = 0.25 * this.textFormatter.fontSizeInPixels;\n let symIndex = 0;\n for (symIndex === 0; symIndex < barIndex; ++symIndex) {\n const symbol = this.symbolBlocks[symIndex];\n symbol.xShift = symbol.xShift + xoff;\n symbol.yShift = symbol.yShift - yoff;\n }\n for (symIndex = barIndex + 1; symIndex < this.symbolBlocks.length; ++symIndex) {\n const symbol = this.symbolBlocks[symIndex];\n symbol.xShift = symbol.xShift - xoff;\n symbol.yShift = symbol.yShift + yoff;\n }\n }\n updateKerningAdjustments() {\n let accum = 0;\n for (let j = 0; j < this.symbolBlocks.length; ++j) {\n const symbol = this.symbolBlocks[j];\n accum += this.getKerningAdjustment(j);\n symbol.xShift += accum;\n }\n }\n /** Do some basic kerning so that letter chords like 'A' don't have the extensions hanging off to the right. */\n getKerningAdjustment(j) {\n if (!this.useKerning) {\n return 0;\n }\n const currSymbol = this.symbolBlocks[j];\n const prevSymbol = j > 0 ? this.symbolBlocks[j - 1] : undefined;\n let adjustment = 0;\n // Move things into the '/' over bar\n if (currSymbol.symbolType === SymbolTypes.GLYPH &&\n currSymbol.glyph !== undefined &&\n currSymbol.glyph.code === ChordSymbol.glyphs.over.code) {\n adjustment += currSymbol.glyph.metrics.x_shift;\n }\n if (prevSymbol !== undefined &&\n prevSymbol.symbolType === SymbolTypes.GLYPH &&\n prevSymbol.glyph !== undefined &&\n prevSymbol.glyph.code === ChordSymbol.glyphs.over.code) {\n adjustment += prevSymbol.glyph.metrics.x_shift;\n }\n // For superscripts that follow a letter without much top part, move it to the left slightly\n let preKernUpper = false;\n let preKernLower = false;\n if (prevSymbol !== undefined && prevSymbol.symbolType === SymbolTypes.TEXT) {\n preKernUpper = ChordSymbol.upperKerningText.some((xx) => xx === prevSymbol.text[prevSymbol.text.length - 1]);\n preKernLower = ChordSymbol.lowerKerningText.some((xx) => xx === prevSymbol.text[prevSymbol.text.length - 1]);\n }\n const kerningOffsetPixels = ChordSymbol.kerningOffset * this.textFormatter.fontSizeInPixels;\n // TODO: adjust kern for font size.\n // Where should this constant live?\n if (preKernUpper && currSymbol.symbolModifier === SymbolModifiers.SUPERSCRIPT) {\n adjustment += kerningOffsetPixels;\n }\n if (preKernLower && currSymbol.symbolType === SymbolTypes.TEXT) {\n if (currSymbol.text[0] >= 'a' && currSymbol.text[0] <= 'z') {\n adjustment += kerningOffsetPixels / 2;\n }\n if (ChordSymbol.upperKerningText.some((xx) => xx === (prevSymbol === null || prevSymbol === void 0 ? void 0 : prevSymbol.text[prevSymbol.text.length - 1]))) {\n adjustment += kerningOffsetPixels / 2;\n }\n }\n return adjustment;\n }\n /**\n * ChordSymbol allows multiple blocks so we can mix glyphs and font text.\n * Each block can have its own vertical orientation.\n */\n // eslint-disable-next-line\n getSymbolBlock(params = {}) {\n var _a, _b, _c;\n const symbolType = (_a = params.symbolType) !== null && _a !== void 0 ? _a : SymbolTypes.TEXT;\n const symbolBlock = {\n text: (_b = params.text) !== null && _b !== void 0 ? _b : '',\n symbolType,\n symbolModifier: (_c = params.symbolModifier) !== null && _c !== void 0 ? _c : SymbolModifiers.NONE,\n xShift: 0,\n yShift: 0,\n vAlign: false,\n width: 0,\n };\n // Note: symbol widths are resolution and font-independent.\n // We convert to pixel values when we know what the font is.\n if (symbolType === SymbolTypes.GLYPH && typeof params.glyph === 'string') {\n const glyphArgs = ChordSymbol.glyphs[params.glyph];\n const glyphPoints = 20;\n symbolBlock.glyph = new Glyph(glyphArgs.code, glyphPoints, { category: 'chordSymbol' });\n // Beware: glyph.metrics is not the same as glyph.getMetrics() !\n // rv.glyph.point = rv.glyph.point * rv.glyph.metrics.scale;\n // rv.width = rv.glyph.getMetrics().width;\n // don't set yShift here, b/c we need to do it at formatting time after the font is set.\n }\n else if (symbolType === SymbolTypes.TEXT) {\n symbolBlock.width = this.textFormatter.getWidthForTextInEm(symbolBlock.text);\n }\n else if (symbolType === SymbolTypes.LINE) {\n symbolBlock.width = params.width;\n }\n return symbolBlock;\n }\n /** Add a symbol to this chord, could be text, glyph or line. */\n // eslint-disable-next-line\n addSymbolBlock(parameters) {\n this.symbolBlocks.push(this.getSymbolBlock(parameters));\n return this;\n }\n // ### Convenience functions for creating different types of chord symbol parts.\n /** Add a text block. */\n // eslint-disable-next-line\n addText(text, parameters = {}) {\n const symbolType = SymbolTypes.TEXT;\n return this.addSymbolBlock(Object.assign(Object.assign({}, parameters), { text, symbolType }));\n }\n /** Add a text block with superscript modifier. */\n addTextSuperscript(text) {\n const symbolType = SymbolTypes.TEXT;\n const symbolModifier = SymbolModifiers.SUPERSCRIPT;\n return this.addSymbolBlock({ text, symbolType, symbolModifier });\n }\n /** Add a text block with subscript modifier. */\n addTextSubscript(text) {\n const symbolType = SymbolTypes.TEXT;\n const symbolModifier = SymbolModifiers.SUBSCRIPT;\n return this.addSymbolBlock({ text, symbolType, symbolModifier });\n }\n /** Add a glyph block with superscript modifier. */\n addGlyphSuperscript(glyph) {\n const symbolType = SymbolTypes.GLYPH;\n const symbolModifier = SymbolModifiers.SUPERSCRIPT;\n return this.addSymbolBlock({ glyph, symbolType, symbolModifier });\n }\n /** Add a glyph block. */\n // eslint-disable-next-line\n addGlyph(glyph, params = {}) {\n const symbolType = SymbolTypes.GLYPH;\n return this.addSymbolBlock(Object.assign(Object.assign({}, params), { glyph, symbolType }));\n }\n /**\n * Add a glyph for each character in 'text'. If the glyph is not available, use text from the font.\n * e.g. `addGlyphOrText('(+5#11)')` will use text for the '5' and '11', and glyphs for everything else.\n */\n // eslint-disable-next-line\n addGlyphOrText(text, params = {}) {\n let str = '';\n for (let i = 0; i < text.length; ++i) {\n const char = text[i];\n if (ChordSymbol.glyphs[char]) {\n if (str.length > 0) {\n this.addText(str, params);\n str = '';\n }\n this.addGlyph(char, params);\n }\n else {\n // Collect consecutive characters with no glyphs.\n str += char;\n }\n }\n if (str.length > 0) {\n this.addText(str, params);\n }\n return this;\n }\n /** Add a line of the given width, used as a continuation of the previous symbol in analysis, or lyrics, etc. */\n // eslint-disable-next-line\n addLine(width, params = {}) {\n const symbolType = SymbolTypes.LINE;\n return this.addSymbolBlock(Object.assign(Object.assign({}, params), { symbolType, width }));\n }\n /**\n * Set the chord symbol's font family, size, weight, style (e.g., `Arial`, `10pt`, `bold`, `italic`).\n *\n * @param f is 1) a `FontInfo` object or\n * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or\n * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided).\n * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt').\n * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900).\n * @param style is a string (e.g., 'italic', 'normal').\n *\n * @override See: Element.\n */\n setFont(f, size, weight, style) {\n super.setFont(f, size, weight, style);\n this.textFormatter = TextFormatter.create(this.textFont);\n return this;\n }\n setEnableKerning(val) {\n this.useKerning = val;\n return this;\n }\n /** Set vertical position of text (above or below stave). */\n setVertical(vj) {\n this.vertical = typeof vj === 'string' ? ChordSymbol.VerticalJustifyString[vj] : vj;\n return this;\n }\n getVertical() {\n return this.vertical;\n }\n /** Set horizontal justification. */\n setHorizontal(hj) {\n this.horizontal = typeof hj === 'string' ? ChordSymbol.HorizontalJustifyString[hj] : hj;\n return this;\n }\n getHorizontal() {\n return this.horizontal;\n }\n getWidth() {\n let width = 0;\n this.symbolBlocks.forEach((symbol) => {\n width += symbol.vAlign ? 0 : symbol.width;\n });\n return width;\n }\n getYOffsetForText(text) {\n var _a;\n let acc = 0;\n let i = 0;\n for (i = 0; i < text.length; ++i) {\n const metrics = this.textFormatter.getGlyphMetrics(text[i]);\n if (metrics) {\n const yMax = (_a = metrics.y_max) !== null && _a !== void 0 ? _a : 0;\n acc = yMax < acc ? yMax : acc;\n }\n }\n const resolution = this.textFormatter.getResolution();\n return i > 0 ? -1 * (acc / resolution) : 0;\n }\n /** Render text and glyphs above/below the note. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n // We're changing context parameters. Save current state.\n ctx.save();\n const classString = Object.keys(this.getAttribute('classes')).join(' ');\n ctx.openGroup(classString, this.getAttribute('id'));\n const start = note.getModifierStartXY(Modifier.Position.ABOVE, this.index);\n ctx.setFont(this.textFont);\n let y;\n // The position of the text varies based on whether or not the note\n // has a stem.\n const hasStem = note.hasStem();\n const stave = note.checkStave();\n if (this.vertical === ChordSymbolVerticalJustify.BOTTOM) {\n // HACK: We need to compensate for the text's height since its origin is bottom-right.\n y = stave.getYForBottomText(this.text_line + Tables.TEXT_HEIGHT_OFFSET_HACK);\n if (hasStem) {\n const stem_ext = note.checkStem().getExtents();\n const spacing = stave.getSpacingBetweenLines();\n const stem_base = note.getStemDirection() === 1 ? stem_ext.baseY : stem_ext.topY;\n y = Math.max(y, stem_base + spacing * (this.text_line + 2));\n }\n }\n else {\n // (this.vertical === VerticalJustify.TOP)\n y = Math.min(stave.getYForTopText(this.text_line), note.getYs()[0] - 10);\n if (hasStem) {\n const stem_ext = note.checkStem().getExtents();\n const spacing = stave.getSpacingBetweenLines();\n y = Math.min(y, stem_ext.topY - 5 - spacing * this.text_line);\n }\n }\n let x = start.x;\n if (this.horizontal === ChordSymbolHorizontalJustify.LEFT) {\n x = start.x;\n }\n else if (this.horizontal === ChordSymbolHorizontalJustify.RIGHT) {\n x = start.x + this.getWidth();\n }\n else if (this.horizontal === ChordSymbolHorizontalJustify.CENTER) {\n x = start.x - this.getWidth() / 2;\n }\n else {\n // HorizontalJustify.CENTER_STEM\n x = note.getStemX() - this.getWidth() / 2;\n }\n L('Rendering ChordSymbol: ', this.textFormatter, x, y);\n this.symbolBlocks.forEach((symbol) => {\n const isSuper = ChordSymbol.isSuperscript(symbol);\n const isSub = ChordSymbol.isSubscript(symbol);\n let curY = y;\n L('shift was ', symbol.xShift, symbol.yShift);\n L('curY pre sub ', curY);\n if (isSuper) {\n curY += this.superscriptOffset;\n }\n if (isSub) {\n curY += this.subscriptOffset;\n }\n L('curY sup/sub ', curY);\n if (symbol.symbolType === SymbolTypes.TEXT) {\n if (isSuper || isSub) {\n ctx.save();\n if (this.textFont) {\n const { family, size, weight, style } = this.textFont;\n const smallerFontSize = Font.scaleSize(size, ChordSymbol.superSubRatio);\n ctx.setFont(family, smallerFontSize, weight, style);\n }\n }\n // TODO???\n // We estimate the text width, fill it in with the empirical value so the formatting is even.\n // const textDim = ctx.measureText(symbol.text);\n // symbol.width = textDim.width;\n L('Rendering Text: ', symbol.text, x + symbol.xShift, curY + symbol.yShift);\n ctx.fillText(symbol.text, x + symbol.xShift, curY + symbol.yShift);\n if (isSuper || isSub) {\n ctx.restore();\n }\n }\n else if (symbol.symbolType === SymbolTypes.GLYPH && symbol.glyph) {\n curY += symbol.yShift;\n L('Rendering Glyph: ', symbol.glyph.code, x + symbol.xShift, curY);\n symbol.glyph.render(ctx, x + symbol.xShift, curY);\n }\n else if (symbol.symbolType === SymbolTypes.LINE) {\n L('Rendering Line : ', symbol.width, x, curY);\n ctx.beginPath();\n ctx.setLineWidth(1); // ?\n ctx.moveTo(x, y);\n ctx.lineTo(x + symbol.width, curY);\n ctx.stroke();\n }\n x += symbol.width;\n if (symbol.vAlign) {\n x += symbol.xShift;\n }\n });\n ctx.closeGroup();\n ctx.restore();\n }\n}\nChordSymbol.DEBUG = false;\n// Chord symbols can be positioned and justified relative to the note.\nChordSymbol.HorizontalJustify = ChordSymbolHorizontalJustify;\nChordSymbol.HorizontalJustifyString = {\n left: ChordSymbolHorizontalJustify.LEFT,\n right: ChordSymbolHorizontalJustify.RIGHT,\n center: ChordSymbolHorizontalJustify.CENTER,\n centerStem: ChordSymbolHorizontalJustify.CENTER_STEM,\n};\nChordSymbol.VerticalJustify = ChordSymbolVerticalJustify;\nChordSymbol.VerticalJustifyString = {\n top: ChordSymbolVerticalJustify.TOP,\n above: ChordSymbolVerticalJustify.TOP,\n below: ChordSymbolVerticalJustify.BOTTOM,\n bottom: ChordSymbolVerticalJustify.BOTTOM,\n};\n// Glyph data\nChordSymbol.glyphs = {\n diminished: {\n code: 'csymDiminished',\n },\n dim: {\n code: 'csymDiminished',\n },\n halfDiminished: {\n code: 'csymHalfDiminished',\n },\n '+': {\n code: 'csymAugmented',\n },\n augmented: {\n code: 'csymAugmented',\n },\n majorSeventh: {\n code: 'csymMajorSeventh',\n },\n minor: {\n code: 'csymMinor',\n },\n '-': {\n code: 'csymMinor',\n },\n '(': {\n code: 'csymParensLeftTall',\n },\n leftParen: {\n code: 'csymParensLeftTall',\n },\n ')': {\n code: 'csymParensRightTall',\n },\n rightParen: {\n code: 'csymParensRightTall',\n },\n leftBracket: {\n code: 'csymBracketLeftTall',\n },\n rightBracket: {\n code: 'csymBracketRightTall',\n },\n leftParenTall: {\n code: 'csymParensLeftVeryTall',\n },\n rightParenTall: {\n code: 'csymParensRightVeryTall',\n },\n '/': {\n code: 'csymDiagonalArrangementSlash',\n },\n over: {\n code: 'csymDiagonalArrangementSlash',\n },\n '#': {\n code: 'accidentalSharp',\n },\n b: {\n code: 'accidentalFlat',\n },\n};\nChordSymbol.symbolTypes = SymbolTypes;\nChordSymbol.symbolModifiers = SymbolModifiers;\n/** Currently unused. */\nChordSymbol.noFormat = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Fraction } from './fraction';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nexport var VoiceMode;\n(function (VoiceMode) {\n VoiceMode[VoiceMode[\"STRICT\"] = 1] = \"STRICT\";\n VoiceMode[VoiceMode[\"SOFT\"] = 2] = \"SOFT\";\n VoiceMode[VoiceMode[\"FULL\"] = 3] = \"FULL\";\n})(VoiceMode || (VoiceMode = {}));\n/**\n * `Voice` is mainly a container object to group `Tickables` for formatting.\n */\nexport class Voice extends Element {\n constructor(time, options) {\n super();\n this.resolutionMultiplier = 1;\n this.mode = VoiceMode.STRICT;\n this.preFormatted = false;\n this.ticksUsed = new Fraction(0, 1);\n this.largestTickWidth = 0;\n this.tickables = [];\n this.options = Object.assign({ softmaxFactor: 100 }, options);\n // Convert the `time` string into a VoiceTime object if necessary.\n let voiceTime;\n if (typeof time === 'string') {\n // Time signature shortcut: \"4/4\", \"3/8\", etc.\n const match = time.match(/(\\d+)\\/(\\d+)/);\n if (match) {\n voiceTime = {\n num_beats: parseInt(match[1]),\n beat_value: parseInt(match[2]),\n };\n }\n }\n else {\n voiceTime = time;\n }\n // Default time signature is 4/4.\n this.time = Object.assign({ num_beats: 4, beat_value: 4, resolution: Tables.RESOLUTION }, voiceTime);\n // Recalculate total ticks.\n this.totalTicks = new Fraction(this.time.num_beats * (this.time.resolution / this.time.beat_value), 1);\n this.smallestTickCount = this.totalTicks.clone();\n }\n static get CATEGORY() {\n return Category.Voice;\n }\n /**\n * Modes allow the addition of ticks in three different ways:\n * - STRICT: This is the default. Ticks must fill the voice.\n * - SOFT: Ticks can be added without restrictions.\n * - FULL: Ticks do not need to fill the voice, but can't exceed the maximum tick length.\n */\n static get Mode() {\n return VoiceMode;\n }\n /** Get the total ticks in the voice. */\n getTotalTicks() {\n return this.totalTicks;\n }\n /** Get the total ticks used in the voice by all the tickables. */\n getTicksUsed() {\n return this.ticksUsed;\n }\n /** Get the largest width of all the tickables. */\n getLargestTickWidth() {\n return this.largestTickWidth;\n }\n /** Get the tick count for the shortest tickable */\n getSmallestTickCount() {\n return this.smallestTickCount;\n }\n /** Get the tickables in the voice. */\n getTickables() {\n return this.tickables;\n }\n /** Get the voice mode. */\n getMode() {\n return this.mode;\n }\n /**\n * Set the voice mode.\n * @param mode value from `VoiceMode`\n */\n setMode(mode) {\n this.mode = mode;\n return this;\n }\n /** Get the resolution multiplier for the voice. */\n getResolutionMultiplier() {\n return this.resolutionMultiplier;\n }\n /** Get the actual tick resolution for the voice. */\n getActualResolution() {\n return this.resolutionMultiplier * this.time.resolution;\n }\n /** Set the voice's stave. */\n setStave(stave) {\n this.stave = stave;\n // Reset the bounding box so we can reformat.\n this.boundingBox = undefined;\n return this;\n }\n getStave() {\n return this.stave;\n }\n /** Get the bounding box for the voice. */\n getBoundingBox() {\n if (!this.boundingBox) {\n const stave = this.checkStave();\n let boundingBox = undefined;\n for (let i = 0; i < this.tickables.length; ++i) {\n const tickable = this.tickables[i];\n tickable.setStave(stave);\n const bb = tickable.getBoundingBox();\n if (bb) {\n boundingBox = boundingBox ? boundingBox.mergeWith(bb) : bb;\n }\n }\n this.boundingBox = boundingBox;\n }\n return this.boundingBox;\n }\n /** Set the voice mode to strict or soft. */\n setStrict(strict) {\n this.mode = strict ? VoiceMode.STRICT : VoiceMode.SOFT;\n return this;\n }\n /** Determine if the voice is complete according to the voice mode. */\n isComplete() {\n if (this.mode === VoiceMode.STRICT || this.mode === VoiceMode.FULL) {\n return this.ticksUsed.equals(this.totalTicks);\n }\n else {\n return true;\n }\n }\n /**\n * We use softmax to layout the tickables proportional to the exponent of\n * their duration. The softmax factor is used to determine the 'linearness' of\n * the layout.\n *\n * The softmax of all the tickables in this voice should sum to 1.\n */\n setSoftmaxFactor(factor) {\n this.options.softmaxFactor = factor;\n return this;\n }\n /**\n * Calculate the sum of the exponents of all the ticks in this voice to use\n * as the denominator of softmax.\n */\n reCalculateExpTicksUsed() {\n const totalTicks = this.ticksUsed.value();\n const exp = (tickable) => Math.pow(this.options.softmaxFactor, tickable.getTicks().value() / totalTicks);\n this.expTicksUsed = this.tickables.map(exp).reduce((a, b) => a + b, 0);\n return this.expTicksUsed;\n }\n /** Get the softmax-scaled value of a tick duration. 'tickValue' is a number. */\n softmax(tickValue) {\n if (!this.expTicksUsed) {\n this.expTicksUsed = this.reCalculateExpTicksUsed();\n }\n const totalTicks = this.ticksUsed.value();\n const exp = (v) => Math.pow(this.options.softmaxFactor, v / totalTicks);\n const sm = exp(tickValue) / this.expTicksUsed;\n return sm;\n }\n /** Add a tickable to the voice. */\n addTickable(tickable) {\n if (!tickable.shouldIgnoreTicks()) {\n const ticks = tickable.getTicks();\n // Update the total ticks for this line.\n this.ticksUsed.add(ticks);\n this.expTicksUsed = 0; // reset\n if ((this.mode === VoiceMode.STRICT || this.mode === VoiceMode.FULL) &&\n this.ticksUsed.greaterThan(this.totalTicks)) {\n this.ticksUsed.subtract(ticks);\n throw new RuntimeError('BadArgument', 'Too many ticks.');\n }\n // Track the smallest tickable for formatting.\n if (ticks.lessThan(this.smallestTickCount)) {\n this.smallestTickCount = ticks.clone();\n }\n this.resolutionMultiplier = this.ticksUsed.denominator;\n // Expand total ticks using denominator from ticks used.\n this.totalTicks.add(0, this.ticksUsed.denominator);\n }\n // Add the tickable to the line.\n this.tickables.push(tickable);\n tickable.setVoice(this);\n return this;\n }\n /** Add an array of tickables to the voice. */\n addTickables(tickables) {\n for (let i = 0; i < tickables.length; ++i) {\n this.addTickable(tickables[i]);\n }\n return this;\n }\n /** Preformat the voice by applying the voice's stave to each note. */\n preFormat() {\n if (this.preFormatted)\n return this;\n const stave = this.checkStave();\n this.tickables.forEach((tickable) => {\n if (!tickable.getStave()) {\n tickable.setStave(stave);\n }\n });\n this.preFormatted = true;\n return this;\n }\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n /**\n * Render the voice onto the canvas `context` and an optional `stave`.\n * If `stave` is omitted, it is expected that the notes have staves\n * already set.\n *\n * This method also calculates the voice's boundingBox while drawing\n * the notes. Note the similarities with this.getBoundingBox().\n */\n draw(context = this.checkContext(), stave) {\n stave = stave !== null && stave !== void 0 ? stave : this.stave;\n this.setRendered();\n let boundingBox = undefined;\n for (let i = 0; i < this.tickables.length; ++i) {\n const tickable = this.tickables[i];\n // Set the stave if provided.\n if (stave) {\n tickable.setStave(stave);\n }\n defined(tickable.getStave(), 'MissingStave', 'The voice cannot draw tickables without staves.');\n const bb = tickable.getBoundingBox();\n if (bb) {\n boundingBox = boundingBox ? boundingBox.mergeWith(bb) : bb;\n }\n tickable.setContext(context);\n tickable.drawWithStyle();\n }\n this.boundingBox = boundingBox;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Note } from './note';\nimport { Barline, BarlineType } from './stavebarline';\nimport { Category } from './typeguard';\nimport { log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (BarNote.DEBUG)\n log('Vex.Flow.BarNote', args);\n}\n/**\n * A `BarNote` is used to render bar lines (from `barline.ts`). `BarNote`s can\n * be added to a voice and rendered in the middle of a stave. Since it has no\n * duration, it consumes no `tick`s, and is dealt with appropriately by the formatter.\n *\n * See `tests/barnote_tests.ts` for usage examples.\n */\nexport class BarNote extends Note {\n constructor(type = BarlineType.SINGLE) {\n super({ duration: 'b' });\n this.metrics = {\n widths: {},\n };\n const TYPE = BarlineType;\n this.metrics.widths = {\n [TYPE.SINGLE]: 8,\n [TYPE.DOUBLE]: 12,\n [TYPE.END]: 15,\n [TYPE.REPEAT_BEGIN]: 14,\n [TYPE.REPEAT_END]: 14,\n [TYPE.REPEAT_BOTH]: 18,\n [TYPE.NONE]: 0,\n };\n // Tell the formatter that bar notes have no duration.\n this.ignore_ticks = true;\n this.setType(type);\n }\n static get CATEGORY() {\n return Category.BarNote;\n }\n /** Get the type of bar note.*/\n getType() {\n return this.type;\n }\n /** Set the type of bar note. */\n setType(type) {\n this.type = typeof type === 'string' ? Barline.typeString[type] : type;\n // Set width to width of relevant `Barline`.\n this.setWidth(this.metrics.widths[this.type]);\n return this;\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n /** Overridden to ignore. */\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n /** Render note to stave. */\n draw() {\n const ctx = this.checkContext();\n L('Rendering bar line at: ', this.getAbsoluteX());\n if (this.style)\n this.applyStyle(ctx);\n const barline = new Barline(this.type);\n barline.setX(this.getAbsoluteX());\n barline.draw(this.checkStave());\n if (this.style)\n this.restoreStyle(ctx);\n this.setRendered();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.BarNote.DEBUG` to `true`. */\nBarNote.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Modifier } from './modifier';\nimport { TextFormatter } from './textformatter';\nimport { Category, isTabNote } from './typeguard';\nimport { RuntimeError } from './util';\n/** Bend implements tablature bends. */\nexport class Bend extends Modifier {\n /**\n * Example of a phrase:\n * ```\n * [{\n * type: UP,\n * text: \"whole\"\n * width: 8;\n * },\n * {\n * type: DOWN,\n * text: \"whole\"\n * width: 8;\n * },\n * {\n * type: UP,\n * text: \"half\"\n * width: 8;\n * },\n * {\n * type: UP,\n * text: \"whole\"\n * width: 8;\n * },\n * {\n * type: DOWN,\n * text: \"1 1/2\"\n * width: 8;\n * }]\n * ```\n * @param text text for bend (\"Full\", \"Half\", etc.) (DEPRECATED)\n * @param release if true, render a release. (DEPRECATED)\n * @param phrase if set, ignore \"text\" and \"release\", and use the more sophisticated phrase specified\n */\n constructor(text, release = false, phrase) {\n super();\n this.text = text;\n this.x_shift = 0;\n this.release = release;\n this.tap = '';\n this.resetFont();\n this.render_options = {\n line_width: 1.5,\n line_style: '#777777',\n bend_width: 8,\n release_width: 8,\n };\n if (phrase) {\n this.phrase = phrase;\n }\n else {\n // Backward compatibility\n this.phrase = [{ type: Bend.UP, text: this.text }];\n if (this.release)\n this.phrase.push({ type: Bend.DOWN, text: '' });\n }\n this.updateWidth();\n }\n static get CATEGORY() {\n return Category.Bend;\n }\n static get UP() {\n return 0;\n }\n static get DOWN() {\n return 1;\n }\n // Arrange bends in `ModifierContext`\n static format(bends, state) {\n if (!bends || bends.length === 0)\n return false;\n let last_width = 0;\n // Format Bends\n for (let i = 0; i < bends.length; ++i) {\n const bend = bends[i];\n const note = bend.checkAttachedNote();\n if (isTabNote(note)) {\n const stringPos = note.leastString() - 1;\n if (state.top_text_line < stringPos) {\n state.top_text_line = stringPos;\n }\n }\n bend.setXShift(last_width);\n last_width = bend.getWidth();\n bend.setTextLine(state.top_text_line);\n }\n state.right_shift += last_width;\n state.top_text_line += 1;\n return true;\n }\n /** Set horizontal shift in pixels. */\n setXShift(value) {\n this.x_shift = value;\n this.updateWidth();\n return this;\n }\n setTap(value) {\n this.tap = value;\n return this;\n }\n /** Get text provided in the constructor. */\n getText() {\n return this.text;\n }\n getTextHeight() {\n const textFormatter = TextFormatter.create(this.textFont);\n return textFormatter.maxHeight;\n }\n /** Recalculate width. */\n updateWidth() {\n const textFormatter = TextFormatter.create(this.textFont);\n const measureText = (text) => {\n return textFormatter.getWidthForTextInPx(text);\n };\n let totalWidth = 0;\n for (let i = 0; i < this.phrase.length; ++i) {\n const bend = this.phrase[i];\n if (bend.width !== undefined) {\n totalWidth += bend.width;\n }\n else {\n const additional_width = bend.type === Bend.UP ? this.render_options.bend_width : this.render_options.release_width;\n bend.width = Math.max(additional_width, measureText(bend.text)) + 3;\n bend.draw_width = bend.width / 2;\n totalWidth += bend.width;\n }\n }\n this.setWidth(totalWidth + this.x_shift);\n return this;\n }\n /** Draw the bend on the rendering context. */\n draw() {\n var _a;\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(Modifier.Position.RIGHT, this.index);\n start.x += 3;\n start.y += 0.5;\n const x_shift = this.x_shift;\n const stave = note.checkStave();\n const spacing = stave.getSpacingBetweenLines();\n const lowestY = note.getYs().reduce((a, b) => (a < b ? a : b));\n // this.text_line is relative to top string in the group.\n const bend_height = start.y - ((this.text_line + 1) * spacing + start.y - lowestY) + 3;\n const annotation_y = start.y - ((this.text_line + 1) * spacing + start.y - lowestY) - 1;\n const renderBend = (x, y, width, height) => {\n const cp_x = x + width;\n const cp_y = y;\n ctx.save();\n ctx.beginPath();\n ctx.setLineWidth(this.render_options.line_width);\n ctx.setStrokeStyle(this.render_options.line_style);\n ctx.setFillStyle(this.render_options.line_style);\n ctx.moveTo(x, y);\n ctx.quadraticCurveTo(cp_x, cp_y, x + width, height);\n ctx.stroke();\n ctx.restore();\n };\n const renderRelease = (x, y, width, height) => {\n ctx.save();\n ctx.beginPath();\n ctx.setLineWidth(this.render_options.line_width);\n ctx.setStrokeStyle(this.render_options.line_style);\n ctx.setFillStyle(this.render_options.line_style);\n ctx.moveTo(x, height);\n ctx.quadraticCurveTo(x + width, height, x + width, y);\n ctx.stroke();\n ctx.restore();\n };\n const renderArrowHead = (x, y, direction) => {\n const width = 4;\n const yBase = y + width * direction;\n ctx.beginPath();\n ctx.moveTo(x, y); // tip of the arrow\n ctx.lineTo(x - width, yBase);\n ctx.lineTo(x + width, yBase);\n ctx.closePath();\n ctx.fill();\n };\n const renderText = (x, text) => {\n ctx.save();\n ctx.setFont(this.textFont);\n const render_x = x - ctx.measureText(text).width / 2;\n ctx.fillText(text, render_x, annotation_y);\n ctx.restore();\n };\n let last_bend = undefined;\n let last_bend_draw_width = 0;\n let last_drawn_width = 0;\n if ((_a = this.tap) === null || _a === void 0 ? void 0 : _a.length) {\n const tapStart = note.getModifierStartXY(Modifier.Position.CENTER, this.index);\n renderText(tapStart.x, this.tap);\n }\n for (let i = 0; i < this.phrase.length; ++i) {\n const bend = this.phrase[i];\n if (!bend.draw_width)\n bend.draw_width = 0;\n if (i === 0)\n bend.draw_width += x_shift;\n last_drawn_width = bend.draw_width + last_bend_draw_width - (i === 1 ? x_shift : 0);\n if (bend.type === Bend.UP) {\n if (last_bend && last_bend.type === Bend.UP) {\n renderArrowHead(start.x, bend_height, +1);\n }\n renderBend(start.x, start.y, last_drawn_width, bend_height);\n }\n if (bend.type === Bend.DOWN) {\n if (last_bend && last_bend.type === Bend.UP) {\n renderRelease(start.x, start.y, last_drawn_width, bend_height);\n }\n if (last_bend && last_bend.type === Bend.DOWN) {\n renderArrowHead(start.x, start.y, -1);\n renderRelease(start.x, start.y, last_drawn_width, bend_height);\n }\n if (!last_bend) {\n last_drawn_width = bend.draw_width;\n renderRelease(start.x, start.y, last_drawn_width, bend_height);\n }\n }\n renderText(start.x + last_drawn_width, bend.text);\n last_bend = bend;\n last_bend_draw_width = bend.draw_width;\n last_bend.x = start.x;\n start.x += last_drawn_width;\n }\n if (!last_bend || last_bend.x == undefined) {\n throw new RuntimeError('NoLastBendForBend', 'Internal error.');\n }\n // Final arrowhead and text\n if (last_bend.type === Bend.UP) {\n renderArrowHead(last_bend.x + last_drawn_width, bend_height, +1);\n }\n else if (last_bend.type === Bend.DOWN) {\n renderArrowHead(last_bend.x + last_drawn_width, start.y, -1);\n }\n }\n}\n/** Default text font. */\nBend.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n//\n// This class implements dot modifiers for notes.\nimport { Modifier } from './modifier';\nimport { Category, isGraceNote, isStaveNote, isTabNote } from './typeguard';\nimport { RuntimeError } from './util';\nexport class Dot extends Modifier {\n constructor() {\n super();\n this.position = Modifier.Position.RIGHT;\n this.radius = 2;\n this.setWidth(5);\n this.dot_shiftY = 0;\n }\n static get CATEGORY() {\n return Category.Dot;\n }\n /** Returns the dots associated to a Note. */\n static getDots(note) {\n return note.getModifiersByType(Dot.CATEGORY);\n }\n /** Add a dot on the specified keys to the notes. */\n static buildAndAttach(notes, options) {\n for (const note of notes) {\n if (options === null || options === void 0 ? void 0 : options.all) {\n for (let i = 0; i < note.keys.length; i++) {\n const dot = new Dot();\n dot.setDotShiftY(note.glyph.dot_shiftY);\n note.addModifier(dot, i);\n }\n }\n else if ((options === null || options === void 0 ? void 0 : options.index) != undefined) {\n const dot = new Dot();\n dot.setDotShiftY(note.glyph.dot_shiftY);\n note.addModifier(dot, options === null || options === void 0 ? void 0 : options.index);\n }\n else {\n const dot = new Dot();\n dot.setDotShiftY(note.glyph.dot_shiftY);\n note.addModifier(dot, 0);\n }\n }\n }\n // Arrange dots inside a ModifierContext.\n static format(dots, state) {\n const right_shift = state.right_shift;\n const dot_spacing = 1;\n if (!dots || dots.length === 0)\n return false;\n const dot_list = [];\n const max_shift_map = {};\n for (let i = 0; i < dots.length; ++i) {\n const dot = dots[i];\n const note = dot.getNote();\n let props;\n let shift;\n if (isStaveNote(note)) {\n const index = dot.checkIndex();\n props = note.getKeyProps()[index];\n // consider right displaced head with no previous modifier\n shift = note.getFirstDotPx();\n }\n else if (isTabNote(note)) {\n props = { line: 0.5 }; // Shim key props for dot placement\n shift = right_shift;\n }\n else {\n // note object is not StaveNote or TabNote.\n throw new RuntimeError('Internal', 'Unexpected instance.');\n }\n const note_id = note.getAttribute('id');\n dot_list.push({ line: props.line, note, note_id, dot });\n max_shift_map[note_id] = Math.max(max_shift_map[note_id] || shift, shift);\n }\n // Sort dots by line number.\n dot_list.sort((a, b) => b.line - a.line);\n let dot_shift = right_shift;\n let x_width = 0;\n let last_line = null;\n let last_note = null;\n let prev_dotted_space = null;\n let half_shiftY = 0;\n for (let i = 0; i < dot_list.length; ++i) {\n const { dot, note, note_id, line } = dot_list[i];\n // Reset the position of the dot every line.\n if (line !== last_line || note !== last_note) {\n dot_shift = max_shift_map[note_id];\n }\n if (!note.isRest() && line !== last_line) {\n if (Math.abs(line % 1) === 0.5) {\n // note is on a space, so no dot shift\n half_shiftY = 0;\n }\n else {\n // note is on a line, so shift dot to space above the line\n half_shiftY = 0.5;\n if (last_note != null && !last_note.isRest() && last_line != null && last_line - line === 0.5) {\n // previous note on a space, so shift dot to space below the line\n half_shiftY = -0.5;\n }\n else if (line + half_shiftY === prev_dotted_space) {\n // previous space is dotted, so shift dot to space below the line\n half_shiftY = -0.5;\n }\n }\n }\n // convert half_shiftY to a multiplier for dots.draw()\n if (note.isRest()) {\n dot.dot_shiftY += -half_shiftY;\n }\n else {\n dot.dot_shiftY = -half_shiftY;\n }\n prev_dotted_space = line + half_shiftY;\n dot.setXShift(dot_shift);\n dot_shift += dot.getWidth() + dot_spacing; // spacing\n x_width = dot_shift > x_width ? dot_shift : x_width;\n last_line = line;\n last_note = note;\n }\n // Update state.\n state.right_shift += x_width;\n return true;\n }\n setNote(note) {\n this.note = note;\n if (isGraceNote(note)) {\n this.radius *= 0.5;\n this.setWidth(3);\n }\n return this;\n }\n setDotShiftY(y) {\n this.dot_shiftY = y;\n return this;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const stave = note.checkStave();\n const lineSpace = stave.getSpacingBetweenLines();\n const start = note.getModifierStartXY(this.position, this.index, { forceFlagRight: true });\n // Set the starting y coordinate to the base of the stem for TabNotes.\n if (isTabNote(note)) {\n start.y = note.getStemExtents().baseY;\n }\n const x = start.x + this.x_shift + this.width - this.radius;\n const y = start.y + this.y_shift + this.dot_shiftY * lineSpace;\n ctx.beginPath();\n ctx.arc(x, y, this.radius, 0, Math.PI * 2, false);\n ctx.fill();\n }\n}\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n// Author Larry Kuhns 2013\n// Class to draws string numbers into the notation.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { Tables } from './tables';\nimport { TextFormatter } from './textformatter';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class FretHandFinger extends Modifier {\n constructor(finger) {\n super();\n this.finger = finger;\n this.width = 7;\n this.position = Modifier.Position.LEFT; // Default position above stem or note head\n this.x_shift = 0;\n this.y_shift = 0;\n this.x_offset = 0; // Horizontal offset from default\n this.y_offset = 0; // Vertical offset from default\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.FretHandFinger;\n }\n // Arrange fingerings inside a ModifierContext.\n static format(nums, state) {\n const { left_shift, right_shift } = state;\n const num_spacing = 1;\n if (!nums || nums.length === 0)\n return false;\n const nums_list = [];\n let prev_note = null;\n let shiftLeft = 0;\n let shiftRight = 0;\n for (let i = 0; i < nums.length; ++i) {\n const num = nums[i];\n const note = num.getNote();\n const pos = num.getPosition();\n const index = num.checkIndex();\n const props = note.getKeyProps()[index];\n const textFormatter = TextFormatter.create(num.textFont);\n const textHeight = textFormatter.maxHeight;\n if (num.position === ModifierPosition.ABOVE) {\n state.top_text_line += textHeight / Tables.STAVE_LINE_DISTANCE + 0.5;\n }\n if (num.position === ModifierPosition.BELOW) {\n state.text_line += textHeight / Tables.STAVE_LINE_DISTANCE + 0.5;\n }\n if (note !== prev_note) {\n for (let n = 0; n < note.keys.length; ++n) {\n if (left_shift === 0) {\n shiftLeft = Math.max(note.getLeftDisplacedHeadPx(), shiftLeft);\n }\n if (right_shift === 0) {\n shiftRight = Math.max(note.getRightDisplacedHeadPx(), shiftRight);\n }\n }\n prev_note = note;\n }\n nums_list.push({\n note,\n num,\n pos,\n line: props.line,\n shiftL: shiftLeft,\n shiftR: shiftRight,\n });\n }\n // Sort fingernumbers by line number.\n nums_list.sort((a, b) => b.line - a.line);\n let numShiftL = 0;\n let numShiftR = 0;\n let xWidthL = 0;\n let xWidthR = 0;\n let lastLine = null;\n let lastNote = null;\n for (let i = 0; i < nums_list.length; ++i) {\n let num_shift = 0;\n const { note, pos, num, line, shiftL, shiftR } = nums_list[i];\n // Reset the position of the string number every line.\n if (line !== lastLine || note !== lastNote) {\n numShiftL = left_shift + shiftL;\n numShiftR = right_shift + shiftR;\n }\n const numWidth = num.getWidth() + num_spacing;\n if (pos === Modifier.Position.LEFT) {\n num.setXShift(left_shift + numShiftL);\n num_shift = left_shift + numWidth; // spacing\n xWidthL = num_shift > xWidthL ? num_shift : xWidthL;\n }\n else if (pos === Modifier.Position.RIGHT) {\n num.setXShift(numShiftR);\n num_shift = shiftRight + numWidth; // spacing\n xWidthR = num_shift > xWidthR ? num_shift : xWidthR;\n }\n lastLine = line;\n lastNote = note;\n }\n state.left_shift += xWidthL;\n state.right_shift += xWidthR;\n return true;\n }\n static easyScoreHook({ fingerings } = {}, note, builder) {\n fingerings === null || fingerings === void 0 ? void 0 : fingerings.split(',').map((fingeringString) => {\n const split = fingeringString.trim().split('.');\n const params = { number: split[0] };\n if (split[1])\n params.position = split[1];\n return builder.getFactory().Fingering(params);\n }).map((fingering, index) => note.addModifier(fingering, index));\n }\n setFretHandFinger(finger) {\n this.finger = finger;\n return this;\n }\n getFretHandFinger() {\n return this.finger;\n }\n setOffsetX(x) {\n this.x_offset = x;\n return this;\n }\n setOffsetY(y) {\n this.y_offset = y;\n return this;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(this.position, this.index);\n let dot_x = start.x + this.x_shift + this.x_offset;\n let dot_y = start.y + this.y_shift + this.y_offset + 5;\n switch (this.position) {\n case Modifier.Position.ABOVE:\n dot_x -= 4;\n dot_y -= 12;\n break;\n case Modifier.Position.BELOW:\n dot_x -= 2;\n dot_y += 10;\n break;\n case Modifier.Position.LEFT:\n dot_x -= this.width;\n break;\n case Modifier.Position.RIGHT:\n dot_x += 1;\n break;\n default:\n throw new RuntimeError('InvalidPosition', `The position ${this.position} does not exist`);\n }\n ctx.save();\n ctx.setFont(this.textFont);\n ctx.fillText('' + this.finger, dot_x, dot_y);\n ctx.restore();\n }\n}\nFretHandFinger.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 9,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// This class implements varies types of ties between contiguous notes. The\n// ties include: regular ties, hammer ons, pull offs, and slides.\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StaveTie extends Element {\n /**\n * @param notes is a struct that has:\n *\n * {\n * first_note: Note,\n * last_note: Note,\n * first_indices: [n1, n2, n3],\n * last_indices: [n1, n2, n3]\n * }\n *\n * @param text\n */\n constructor(notes, text) {\n super();\n this.setNotes(notes);\n this.text = text;\n this.render_options = {\n cp1: 8,\n cp2: 12,\n text_shift_x: 0,\n first_x_shift: 0,\n last_x_shift: 0,\n y_shift: 7,\n tie_spacing: 0,\n };\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StaveTie;\n }\n setDirection(direction) {\n this.direction = direction;\n return this;\n }\n /**\n * Set the notes to attach this tie to.\n *\n * @param {!Object} notes The notes to tie up.\n */\n setNotes(notes) {\n if (!notes.first_note && !notes.last_note) {\n throw new RuntimeError('BadArguments', 'Tie needs to have either first_note or last_note set.');\n }\n if (!notes.first_indices) {\n notes.first_indices = [0];\n }\n if (!notes.last_indices) {\n notes.last_indices = [0];\n }\n if (notes.first_indices.length !== notes.last_indices.length) {\n throw new RuntimeError('BadArguments', 'Tied notes must have same number of indices.');\n }\n this.notes = notes;\n return this;\n }\n /**\n * @return {boolean} Returns true if this is a partial bar.\n */\n isPartial() {\n return !this.notes.first_note || !this.notes.last_note;\n }\n renderTie(params) {\n if (params.first_ys.length === 0 || params.last_ys.length === 0) {\n throw new RuntimeError('BadArguments', 'No Y-values to render');\n }\n const ctx = this.checkContext();\n let cp1 = this.render_options.cp1;\n let cp2 = this.render_options.cp2;\n if (Math.abs(params.last_x_px - params.first_x_px) < 10) {\n cp1 = 2;\n cp2 = 8;\n }\n const first_x_shift = this.render_options.first_x_shift;\n const last_x_shift = this.render_options.last_x_shift;\n const y_shift = this.render_options.y_shift * params.direction;\n // setNotes(...) verified that first_indices and last_indices are not undefined.\n // As a result, we use the ! non-null assertion operator here.\n // eslint-disable-next-line\n const first_indices = this.notes.first_indices;\n // eslint-disable-next-line\n const last_indices = this.notes.last_indices;\n for (let i = 0; i < first_indices.length; ++i) {\n const cp_x = (params.last_x_px + last_x_shift + (params.first_x_px + first_x_shift)) / 2;\n const first_y_px = params.first_ys[first_indices[i]] + y_shift;\n const last_y_px = params.last_ys[last_indices[i]] + y_shift;\n if (isNaN(first_y_px) || isNaN(last_y_px)) {\n throw new RuntimeError('BadArguments', 'Bad indices for tie rendering.');\n }\n const top_cp_y = (first_y_px + last_y_px) / 2 + cp1 * params.direction;\n const bottom_cp_y = (first_y_px + last_y_px) / 2 + cp2 * params.direction;\n ctx.beginPath();\n ctx.moveTo(params.first_x_px + first_x_shift, first_y_px);\n ctx.quadraticCurveTo(cp_x, top_cp_y, params.last_x_px + last_x_shift, last_y_px);\n ctx.quadraticCurveTo(cp_x, bottom_cp_y, params.first_x_px + first_x_shift, first_y_px);\n ctx.closePath();\n ctx.fill();\n }\n }\n renderText(first_x_px, last_x_px) {\n var _a, _b, _c;\n if (!this.text)\n return;\n const ctx = this.checkContext();\n let center_x = (first_x_px + last_x_px) / 2;\n center_x -= ctx.measureText(this.text).width / 2;\n const stave = (_b = (_a = this.notes.first_note) === null || _a === void 0 ? void 0 : _a.checkStave()) !== null && _b !== void 0 ? _b : (_c = this.notes.last_note) === null || _c === void 0 ? void 0 : _c.checkStave();\n if (stave) {\n ctx.save();\n ctx.setFont(this.textFont);\n ctx.fillText(this.text, center_x + this.render_options.text_shift_x, stave.getYForTopText() - 1);\n ctx.restore();\n }\n }\n draw() {\n this.checkContext();\n this.setRendered();\n const first_note = this.notes.first_note;\n const last_note = this.notes.last_note;\n // Provide some default values so the compiler doesn't complain.\n let first_x_px = 0;\n let last_x_px = 0;\n let first_ys = [0];\n let last_ys = [0];\n let stem_direction = 0;\n if (first_note) {\n first_x_px = first_note.getTieRightX() + this.render_options.tie_spacing;\n stem_direction = first_note.getStemDirection();\n first_ys = first_note.getYs();\n }\n else if (last_note) {\n const stave = last_note.checkStave();\n first_x_px = stave.getTieStartX();\n first_ys = last_note.getYs();\n this.notes.first_indices = this.notes.last_indices;\n }\n if (last_note) {\n last_x_px = last_note.getTieLeftX() + this.render_options.tie_spacing;\n stem_direction = last_note.getStemDirection();\n last_ys = last_note.getYs();\n }\n else if (first_note) {\n const stave = first_note.checkStave();\n last_x_px = stave.getTieEndX();\n last_ys = first_note.getYs();\n this.notes.last_indices = this.notes.first_indices;\n }\n if (this.direction) {\n stem_direction = this.direction;\n }\n this.renderTie({\n first_x_px,\n last_x_px,\n first_ys,\n last_ys,\n direction: stem_direction,\n });\n this.renderText(first_x_px, last_x_px);\n return true;\n }\n}\n/** Default text font. */\nStaveTie.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n","// / [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This class implements varies types of ties between contiguous notes. The\n// ties include: regular ties, hammer ons, pull offs, and slides.\nimport { StaveTie } from './stavetie';\nimport { Category } from './typeguard';\nexport class TabTie extends StaveTie {\n static get CATEGORY() {\n return Category.TabTie;\n }\n static createHammeron(notes) {\n return new TabTie(notes, 'H');\n }\n static createPulloff(notes) {\n return new TabTie(notes, 'P');\n }\n /**\n * @param notes is a struct that has:\n * {\n * first_note: Note,\n * last_note: Note,\n * first_indices: [n1, n2, n3],\n * last_indices: [n1, n2, n3]\n * }\n *\n * @param text\n */\n constructor(notes, text) {\n super(notes, text);\n this.render_options.cp1 = 9;\n this.render_options.cp2 = 11;\n this.render_options.y_shift = 3;\n this.direction = -1; // Tab tie's are always face up.\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements `GraceNoteGroup` which is used to format and\n// render grace notes.\nimport { Beam } from './beam';\nimport { Formatter } from './formatter';\nimport { Modifier } from './modifier';\nimport { StaveTie } from './stavetie';\nimport { Tables } from './tables';\nimport { TabTie } from './tabtie';\nimport { Category, isStaveNote } from './typeguard';\nimport { log } from './util';\nimport { Voice } from './voice';\n// To enable logging for this class. Set `GraceNoteGroup.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (GraceNoteGroup.DEBUG)\n log('Vex.Flow.GraceNoteGroup', args);\n}\n/** GraceNoteGroup is used to format and render grace notes. */\nexport class GraceNoteGroup extends Modifier {\n //** `GraceNoteGroup` inherits from `Modifier` and is placed inside a `ModifierContext`. */\n constructor(grace_notes, show_slur) {\n super();\n this.preFormatted = false;\n this.position = Modifier.Position.LEFT;\n this.grace_notes = grace_notes;\n this.width = 0;\n this.show_slur = show_slur;\n this.slur = undefined;\n this.voice = new Voice({\n num_beats: 4,\n beat_value: 4,\n resolution: Tables.RESOLUTION,\n }).setStrict(false);\n this.render_options = {\n slur_y_shift: 0,\n };\n this.beams = [];\n this.voice.addTickables(this.grace_notes);\n return this;\n }\n static get CATEGORY() {\n return Category.GraceNoteGroup;\n }\n /** Arranges groups inside a `ModifierContext`. */\n static format(gracenote_groups, state) {\n const group_spacing_stave = 4;\n const group_spacing_tab = 0;\n if (!gracenote_groups || gracenote_groups.length === 0)\n return false;\n const group_list = [];\n let prev_note = null;\n let shiftL = 0;\n for (let i = 0; i < gracenote_groups.length; ++i) {\n const gracenote_group = gracenote_groups[i];\n const note = gracenote_group.getNote();\n const is_stavenote = isStaveNote(note);\n const spacing = is_stavenote ? group_spacing_stave : group_spacing_tab;\n if (is_stavenote && note !== prev_note) {\n // Iterate through all notes to get the displaced pixels\n for (let n = 0; n < note.keys.length; ++n) {\n shiftL = Math.max(note.getLeftDisplacedHeadPx(), shiftL);\n }\n prev_note = note;\n }\n group_list.push({ shift: shiftL, gracenote_group, spacing });\n }\n // If first note left shift in case it is displaced\n let group_shift = group_list[0].shift;\n let formatWidth;\n for (let i = 0; i < group_list.length; ++i) {\n const gracenote_group = group_list[i].gracenote_group;\n gracenote_group.preFormat();\n formatWidth = gracenote_group.getWidth() + group_list[i].spacing;\n group_shift = Math.max(formatWidth, group_shift);\n }\n for (let i = 0; i < group_list.length; ++i) {\n const gracenote_group = group_list[i].gracenote_group;\n formatWidth = gracenote_group.getWidth() + group_list[i].spacing;\n gracenote_group.setSpacingFromNextModifier(group_shift - Math.min(formatWidth, group_shift));\n }\n state.left_shift += group_shift;\n return true;\n }\n preFormat() {\n if (this.preFormatted)\n return;\n if (!this.formatter) {\n this.formatter = new Formatter();\n }\n this.formatter.joinVoices([this.voice]).format([this.voice], 0, {});\n this.setWidth(this.formatter.getMinTotalWidth());\n this.preFormatted = true;\n }\n beamNotes(grace_notes) {\n grace_notes = grace_notes || this.grace_notes;\n if (grace_notes.length > 1) {\n const beam = new Beam(grace_notes);\n beam.render_options.beam_width = 3;\n beam.render_options.partial_beam_length = 4;\n this.beams.push(beam);\n }\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n getWidth() {\n return this.width;\n }\n getGraceNotes() {\n return this.grace_notes;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n L('Drawing grace note group for:', note);\n this.alignSubNotesWithNote(this.getGraceNotes(), note); // Modifier function\n // Draw grace notes.\n this.grace_notes.forEach((graceNote) => graceNote.setContext(ctx).draw());\n // Draw beams.\n this.beams.forEach((beam) => beam.setContext(ctx).draw());\n if (this.show_slur) {\n // Create and draw slur.\n const is_stavenote = isStaveNote(note);\n const TieClass = is_stavenote ? StaveTie : TabTie;\n this.slur = new TieClass({\n last_note: this.grace_notes[0],\n first_note: note,\n first_indices: [0],\n last_indices: [0],\n });\n this.slur.render_options.cp2 = 12;\n this.slur.render_options.y_shift = (is_stavenote ? 7 : 5) + this.render_options.slur_y_shift;\n this.slur.setContext(ctx).draw();\n }\n }\n}\nGraceNoteGroup.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2016\n//\n// ## Description\n//\n// This file implements `NoteSubGroup` which is used to format and\n// render notes as a `Modifier`\n// ex) ClefNote, TimeSigNote and BarNote.\nimport { Formatter } from './formatter';\nimport { Modifier } from './modifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { Voice } from './voice';\nexport class NoteSubGroup extends Modifier {\n constructor(subNotes) {\n super();\n this.preFormatted = false;\n this.position = Modifier.Position.LEFT;\n this.subNotes = subNotes;\n this.subNotes.forEach((subNote) => {\n subNote.setIgnoreTicks(false);\n });\n this.width = 0;\n this.formatter = new Formatter();\n this.voice = new Voice({\n num_beats: 4,\n beat_value: 4,\n resolution: Tables.RESOLUTION,\n }).setStrict(false);\n this.voice.addTickables(this.subNotes);\n }\n static get CATEGORY() {\n return Category.NoteSubGroup;\n }\n // Arrange groups inside a `ModifierContext`\n static format(groups, state) {\n if (!groups || groups.length === 0)\n return false;\n let width = 0;\n for (let i = 0; i < groups.length; ++i) {\n const group = groups[i];\n group.preFormat();\n width += group.getWidth();\n }\n state.left_shift += width;\n return true;\n }\n preFormat() {\n if (this.preFormatted)\n return;\n this.formatter.joinVoices([this.voice]).format([this.voice], 0);\n this.setWidth(this.formatter.getMinTotalWidth());\n this.preFormatted = true;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n getWidth() {\n return this.width;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n this.alignSubNotesWithNote(this.subNotes, note); // Modifier function\n this.subNotes.forEach((subNote) => subNote.setContext(ctx).drawWithStyle());\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// A formatter for abstract tickable objects, such as notes, chords,\n// tabs, etc.\nimport { Fraction } from './fraction';\nimport { RuntimeError } from './util';\n/**\n * TickContext formats abstract tickable objects, such as notes, chords, tabs, etc.\n */\nexport class TickContext {\n constructor(options) {\n this.preFormatted = false;\n this.postFormatted = false;\n this.tickID = options && options.tickID ? options.tickID : 0;\n this.currentTick = new Fraction(0, 1);\n this.maxTicks = new Fraction(0, 1);\n this.maxTickable = undefined; // Biggest tickable\n this.minTicks = undefined; // this can remian null if all tickables have ignore_ticks\n this.minTickable = undefined;\n this.padding = 1; // padding on each side (width += padding * 2)\n this.x = 0;\n this.xBase = 0; // base x position without xOffset\n this.xOffset = 0; // xBase and xOffset are an alternative way to describe x (x = xB + xO)\n this.tickables = []; // Notes, tabs, chords, lyrics.\n this.tickablesByVoice = {}; // Tickables indexed by voice number\n // Formatting metrics\n this.notePx = 0; // width of widest note in this context\n this.glyphPx = 0; // width of glyph (note head)\n this.leftDisplacedHeadPx = 0; // Extra left pixels for displaced notes\n this.rightDisplacedHeadPx = 0; // Extra right pixels for displaced notes\n this.modLeftPx = 0; // Left modifier pixels\n this.modRightPx = 0; // Right modifier pixels\n this.totalLeftPx = 0; // Total left pixels\n this.totalRightPx = 0; // Total right pixels\n this.tContexts = []; // Parent array of tick contexts\n this.width = 0;\n this.formatterMetrics = {\n // The freedom of a tickcontext is the distance it can move without colliding\n // with neighboring elements. A formatter can set these values during its\n // formatting pass, which a different formatter can then use to fine tune.\n freedom: { left: 0, right: 0 },\n };\n }\n static getNextContext(tContext) {\n const contexts = tContext.tContexts;\n const index = contexts.indexOf(tContext);\n if (index + 1 < contexts.length)\n return contexts[index + 1];\n }\n getTickID() {\n return this.tickID;\n }\n getX() {\n return this.x;\n }\n setX(x) {\n this.x = x;\n this.xBase = x;\n this.xOffset = 0;\n return this;\n }\n getXBase() {\n return this.xBase;\n } // use of xBase and xOffset is optional, avoids offset creep\n setXBase(xBase) {\n this.xBase = xBase;\n this.x = xBase + this.xOffset;\n }\n getXOffset() {\n return this.xOffset;\n }\n setXOffset(xOffset) {\n this.xOffset = xOffset;\n this.x = this.xBase + xOffset;\n }\n getWidth() {\n return this.width + this.padding * 2;\n }\n setPadding(padding) {\n this.padding = padding;\n return this;\n }\n getMaxTicks() {\n return this.maxTicks;\n }\n getMinTicks() {\n return this.minTicks;\n }\n getMaxTickable() {\n return this.maxTickable;\n }\n getMinTickable() {\n return this.minTickable;\n }\n getTickables() {\n return this.tickables;\n }\n /**\n * Introduced on 2020-04-17 as getTickablesForVoice(voiceIndex).\n * https://github.com/0xfe/vexflow/blame/dc97b0cc5bb93171c0038638c34362dc958222ca/src/tickcontext.js#L63\n * Renamed on 2021-08-05 to getTickableForVoice(voiceIndex). Method renamed to singular, since it returns one Tickable.\n */\n getTickableForVoice(voiceIndex) {\n return this.tickablesByVoice[voiceIndex];\n }\n getTickablesByVoice() {\n return this.tickablesByVoice;\n }\n getCenterAlignedTickables() {\n return this.tickables.filter((tickable) => tickable.isCenterAligned());\n }\n /** Gets widths context, note and left/right modifiers for formatting. */\n getMetrics() {\n const { width, glyphPx, notePx, leftDisplacedHeadPx, rightDisplacedHeadPx, modLeftPx, modRightPx, totalLeftPx, totalRightPx, } = this;\n return {\n width,\n glyphPx,\n notePx,\n leftDisplacedHeadPx,\n rightDisplacedHeadPx,\n modLeftPx,\n modRightPx,\n totalLeftPx,\n totalRightPx,\n };\n }\n getCurrentTick() {\n return this.currentTick;\n }\n setCurrentTick(tick) {\n this.currentTick = tick;\n this.preFormatted = false;\n }\n addTickable(tickable, voiceIndex) {\n if (!tickable) {\n throw new RuntimeError('BadArgument', 'Invalid tickable added.');\n }\n if (!tickable.shouldIgnoreTicks()) {\n const ticks = tickable.getTicks();\n if (ticks.greaterThan(this.maxTicks)) {\n this.maxTicks = ticks.clone();\n this.maxTickable = tickable;\n }\n if (this.minTicks == null) {\n this.minTicks = ticks.clone();\n this.minTickable = tickable;\n }\n else if (ticks.lessThan(this.minTicks)) {\n this.minTicks = ticks.clone();\n this.minTickable = tickable;\n }\n }\n tickable.setTickContext(this);\n this.tickables.push(tickable);\n this.tickablesByVoice[voiceIndex || 0] = tickable;\n this.preFormatted = false;\n return this;\n }\n preFormat() {\n if (this.preFormatted)\n return this;\n for (let i = 0; i < this.tickables.length; ++i) {\n const tickable = this.tickables[i];\n tickable.preFormat();\n const metrics = tickable.getMetrics();\n // Maintain max displaced head pixels from all tickables in the context\n this.leftDisplacedHeadPx = Math.max(this.leftDisplacedHeadPx, metrics.leftDisplacedHeadPx);\n this.rightDisplacedHeadPx = Math.max(this.rightDisplacedHeadPx, metrics.rightDisplacedHeadPx);\n // Maintain the widest note for all tickables in the context\n this.notePx = Math.max(this.notePx, metrics.notePx);\n // Maintain the widest note head\n this.glyphPx = Math.max(this.glyphPx, metrics.glyphWidth || 0);\n // Total modifier shift\n this.modLeftPx = Math.max(this.modLeftPx, metrics.modLeftPx);\n this.modRightPx = Math.max(this.modRightPx, metrics.modRightPx);\n // Total shift\n this.totalLeftPx = Math.max(this.totalLeftPx, metrics.modLeftPx + metrics.leftDisplacedHeadPx);\n this.totalRightPx = Math.max(this.totalRightPx, metrics.modRightPx + metrics.rightDisplacedHeadPx);\n // Recalculate the tick context total width\n this.width = this.notePx + this.totalLeftPx + this.totalRightPx;\n }\n return this;\n }\n postFormat() {\n if (this.postFormatted)\n return this;\n this.postFormatted = true;\n return this;\n }\n getFormatterMetrics() {\n return this.formatterMetrics;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Cyril Silverman\n// MIT License\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { TickContext } from './tickcontext';\nimport { Category, isTabNote } from './typeguard';\nimport { defined, log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Ornament.DEBUG)\n log('Vex.Flow.Ornament', args);\n}\n/**\n * Ornament implements ornaments as modifiers that can be\n * attached to notes. The complete list of ornaments is available in\n * `tables.ts` under `Vex.Flow.ornamentCodes`.\n *\n * See `tests/ornament_tests.ts` for usage examples.\n */\nexport class Ornament extends Modifier {\n /**\n * Create a new ornament of type `type`, which is an entry in\n * `Vex.Flow.ornamentCodes` in `tables.ts`.\n */\n constructor(type) {\n super();\n this.type = type;\n this.delayed = false;\n this.render_options = {\n font_scale: 38,\n accidentalLowerPadding: 3,\n accidentalUpperPadding: 3,\n };\n this.ornament = Tables.ornamentCodes(this.type);\n // new ornaments have their origin at the origin, and have more specific\n // metrics. Legacy ornaments do some\n // x scaling, and have hard-coded metrics\n const metrics = this.getMetrics();\n // some jazz ornaments are above or below depending on stem direction.\n this.adjustForStemDirection = false;\n // some jazz ornaments like falls are supposed to overlap with future bars\n // and so we report a different width than they actually take up.\n this.reportedWidth = metrics && metrics.reportedWidth ? metrics.reportedWidth : 0;\n this.stemUpYOffset = metrics && metrics.stemUpYOffset ? metrics.stemUpYOffset : 0;\n this.ornamentAlignWithNoteHead = Ornament.ornamentAlignWithNoteHead.indexOf(this.type) >= 0;\n if (!this.ornament) {\n throw new RuntimeError('ArgumentError', `Ornament not found: '${this.type}'`);\n }\n this.x_shift = metrics ? metrics.xOffset : 0;\n this.y_shift = metrics ? metrics.yOffset : 0;\n this.glyph = new Glyph(this.ornament.code, this.render_options.font_scale, {\n category: `ornament.${this.ornament.code}`,\n });\n // Is this a jazz ornament that goes between this note and the next note.\n if (Ornament.ornamentNoteTransition.indexOf(this.type) >= 0) {\n this.delayed = true;\n }\n // Legacy ornaments need this. I don't know why, but horizontal spacing issues\n // happen if I don't set it.\n if (!metrics) {\n this.glyph.setOrigin(0.5, 1.0); // FIXME: SMuFL won't require a vertical origin shift\n }\n }\n /** Ornaments category string. */\n static get CATEGORY() {\n return Category.Ornament;\n }\n /** Arrange ornaments inside `ModifierContext` */\n static format(ornaments, state) {\n if (!ornaments || ornaments.length === 0)\n return false;\n let width = 0; // width is used by ornaments, which are always centered on the note head\n let right_shift = state.right_shift; // jazz ornaments calculate r/l shift separately\n let left_shift = state.left_shift;\n let yOffset = 0;\n for (let i = 0; i < ornaments.length; ++i) {\n const ornament = ornaments[i];\n const increment = 2;\n if (Ornament.ornamentRelease.indexOf(ornament.type) >= 0) {\n ornament.x_shift += right_shift + 2;\n }\n if (Ornament.ornamentAttack.indexOf(ornament.type) >= 0) {\n ornament.x_shift -= left_shift + 2;\n }\n if (ornament.reportedWidth && ornament.x_shift < 0) {\n left_shift += ornament.reportedWidth;\n }\n else if (ornament.reportedWidth && ornament.x_shift > 0) {\n right_shift += ornament.reportedWidth;\n }\n else {\n width = Math.max(ornament.getWidth(), width);\n }\n // articulations above/below the line can be stacked.\n if (Ornament.ornamentArticulation.indexOf(ornament.type) >= 0) {\n // Unfortunately we don't know the stem direction. So we base it\n // on the line number, but also allow it to be overridden.\n const ornamentNote = defined(ornament.note, 'NoAttachedNote');\n if (ornamentNote.getLineNumber() >= 3 || ornament.getPosition() === Modifier.Position.ABOVE) {\n state.top_text_line += increment;\n ornament.y_shift += yOffset;\n yOffset -= ornament.glyph.bbox.getH();\n }\n else {\n state.text_line += increment;\n ornament.y_shift += yOffset;\n yOffset += ornament.glyph.bbox.getH();\n }\n }\n else {\n if (ornament.getPosition() === Modifier.Position.ABOVE) {\n ornament.setTextLine(state.top_text_line);\n state.top_text_line += increment;\n }\n else {\n ornament.setTextLine(state.text_line);\n state.text_line += increment;\n }\n }\n }\n // Note: 'legit' ornaments don't consider other modifiers when calculating their\n // X position, but jazz ornaments sometimes need to.\n state.left_shift = left_shift + width / 2;\n state.right_shift = right_shift + width / 2;\n return true;\n }\n /**\n * ornamentNoteTransition means the jazz ornament represents an effect from one note to another,\n * these are generally on the top of the staff.\n */\n static get ornamentNoteTransition() {\n return ['flip', 'jazzTurn', 'smear'];\n }\n /**\n * ornamentAttack indicates something that happens in the attach, placed before the note and\n * any accidentals\n */\n static get ornamentAttack() {\n return ['scoop'];\n }\n /**\n * The ornament is aligned based on the note head, but without regard to whether the\n * stem goes up or down.\n */\n static get ornamentAlignWithNoteHead() {\n return ['doit', 'fall', 'fallLong', 'doitLong', 'bend', 'plungerClosed', 'plungerOpen', 'scoop'];\n }\n /**\n * An ornament that happens on the release of the note, generally placed after the\n * note and overlapping the next beat/measure..\n */\n static get ornamentRelease() {\n return ['doit', 'fall', 'fallLong', 'doitLong', 'jazzTurn', 'smear', 'flip'];\n }\n /** ornamentArticulation goes above/below the note based on space availablity */\n static get ornamentArticulation() {\n return ['bend', 'plungerClosed', 'plungerOpen'];\n }\n /**\n * Legacy ornaments have hard-coded metrics. If additional ornament types are\n * added, get their metrics here.\n */\n // eslint-disable-next-line\n getMetrics() {\n return Tables.currentMusicFont().getMetrics().glyphs.jazzOrnaments[this.ornament.code];\n }\n /** Set whether the ornament is to be delayed. */\n setDelayed(delayed) {\n this.delayed = delayed;\n return this;\n }\n /** Set the upper accidental for the ornament. */\n setUpperAccidental(accid) {\n const scale = this.render_options.font_scale / 1.3;\n this.accidentalUpper = new Glyph(Tables.accidentalCodes(accid).code, scale);\n this.accidentalUpper.setOrigin(0.5, 1.0);\n return this;\n }\n /** Set the lower accidental for the ornament. */\n setLowerAccidental(accid) {\n const scale = this.render_options.font_scale / 1.3;\n this.accidentalLower = new Glyph(Tables.accidentalCodes(accid).code, scale);\n this.accidentalLower.setOrigin(0.5, 1.0);\n return this;\n }\n /** Render ornament in position next to note. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const stemDir = note.getStemDirection();\n const stave = note.checkStave();\n const classString = Object.keys(this.getAttribute('classes')).join(' ');\n ctx.openGroup(classString, this.getAttribute('id'));\n // Get stem extents\n const stemExtents = note.checkStem().getExtents();\n let y = stemDir === Stem.DOWN ? stemExtents.baseY : stemExtents.topY;\n // TabNotes don't have stems attached to them. Tab stems are rendered outside the stave.\n if (isTabNote(note)) {\n if (note.hasStem()) {\n if (stemDir === Stem.DOWN) {\n y = stave.getYForTopText(this.text_line);\n }\n }\n else {\n // Without a stem\n y = stave.getYForTopText(this.text_line);\n }\n }\n const isPlacedOnNoteheadSide = stemDir === Stem.DOWN;\n const spacing = stave.getSpacingBetweenLines();\n let lineSpacing = 1;\n // Beamed stems are longer than quarter note stems, adjust accordingly\n if (!isPlacedOnNoteheadSide && note.hasBeam()) {\n lineSpacing += 0.5;\n }\n const totalSpacing = spacing * (this.text_line + lineSpacing);\n const glyphYBetweenLines = y - totalSpacing;\n // Get initial coordinates for the modifier position\n const start = note.getModifierStartXY(this.position, this.index);\n let glyphX = start.x;\n // If the ornament is aligned with the note head, don't consider the stave y\n // but use the 'natural' modifier y\n let glyphY = this.ornamentAlignWithNoteHead\n ? start.y\n : Math.min(stave.getYForTopText(this.text_line), glyphYBetweenLines);\n glyphY += this.y_shift;\n // Ajdust x position if ornament is delayed\n if (this.delayed) {\n let delayXShift = 0;\n const startX = glyphX - (stave.getX() - 10);\n if (this.delayXShift !== undefined) {\n delayXShift = this.delayXShift;\n }\n else {\n delayXShift += this.glyph.getMetrics().width / 2;\n const nextContext = TickContext.getNextContext(note.getTickContext());\n if (nextContext) {\n delayXShift += (nextContext.getX() - startX) * 0.5;\n }\n else {\n delayXShift += (stave.getX() + stave.getWidth() - startX) * 0.5;\n }\n this.delayXShift = delayXShift;\n }\n glyphX += delayXShift;\n }\n L('Rendering ornament: ', this.ornament, glyphX, glyphY);\n if (this.accidentalLower) {\n this.accidentalLower.render(ctx, glyphX, glyphY);\n glyphY -= this.accidentalLower.getMetrics().height;\n glyphY -= this.render_options.accidentalLowerPadding;\n }\n if (this.stemUpYOffset && note.hasStem() && note.getStemDirection() === 1) {\n glyphY += this.stemUpYOffset;\n }\n if (note.getLineNumber() < 5 && Ornament.ornamentNoteTransition.indexOf(this.type) >= 0) {\n glyphY = note.checkStave().getBoundingBox().getY() + 40;\n }\n this.glyph.render(ctx, glyphX + this.x_shift, glyphY);\n if (this.accidentalUpper) {\n glyphY -= this.glyph.getMetrics().height + this.render_options.accidentalUpperPadding;\n this.accidentalUpper.render(ctx, glyphX, glyphY);\n }\n ctx.closeGroup();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Ornament.DEBUG` to `true`. */\nOrnament.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Rodrigo Vilar\n// MIT License\nimport { Glyph } from './glyph';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { Tables } from './tables';\nimport { Category, isGraceNote } from './typeguard';\n/** Parenthesis implements parenthesis modifiers for notes. */\nexport class Parenthesis extends Modifier {\n /**\n * Constructor\n *\n * @param position Modifier.Position.LEFT (default) or Modifier.Position.RIGHT\n */\n constructor(position) {\n super();\n this.position = position !== null && position !== void 0 ? position : Modifier.Position.LEFT;\n this.point = Tables.currentMusicFont().lookupMetric('parenthesis.default.point');\n this.setWidth(Tables.currentMusicFont().lookupMetric('parenthesis.default.width'));\n }\n static get CATEGORY() {\n return Category.Parenthesis;\n }\n /** Add parentheses to the notes. */\n static buildAndAttach(notes) {\n for (const note of notes) {\n for (let i = 0; i < note.keys.length; i++) {\n note.addModifier(new Parenthesis(ModifierPosition.LEFT), i);\n note.addModifier(new Parenthesis(ModifierPosition.RIGHT), i);\n }\n }\n }\n /** Arrange parentheses inside a ModifierContext. */\n static format(parentheses, state) {\n if (!parentheses || parentheses.length === 0)\n return false;\n let x_widthL = 0;\n let x_widthR = 0;\n for (let i = 0; i < parentheses.length; ++i) {\n const parenthesis = parentheses[i];\n const note = parenthesis.getNote();\n const pos = parenthesis.getPosition();\n const index = parenthesis.checkIndex();\n let shift = 0;\n if (pos === ModifierPosition.RIGHT) {\n shift = note.getRightParenthesisPx(index);\n x_widthR = x_widthR > shift + parenthesis.width ? x_widthR : shift + parenthesis.width;\n }\n if (pos === ModifierPosition.LEFT) {\n shift = note.getLeftParenthesisPx(index);\n x_widthL = x_widthL > shift + parenthesis.width ? x_widthL : shift + parenthesis.width;\n }\n parenthesis.setXShift(shift);\n }\n state.left_shift += x_widthL;\n state.right_shift += x_widthR;\n return true;\n }\n /** Set the associated note. */\n setNote(note) {\n this.note = note;\n this.point = Tables.currentMusicFont().lookupMetric('parenthesis.default.point');\n this.setWidth(Tables.currentMusicFont().lookupMetric('parenthesis.default.width'));\n if (isGraceNote(note)) {\n this.point = Tables.currentMusicFont().lookupMetric('parenthesis.gracenote.point');\n this.setWidth(Tables.currentMusicFont().lookupMetric('parenthesis.gracenote.width'));\n }\n return this;\n }\n /** Render the parenthesis. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(this.position, this.index, { forceFlagRight: true });\n const x = start.x + this.x_shift;\n const y = start.y + this.y_shift;\n if (this.position == Modifier.Position.RIGHT) {\n Glyph.renderGlyph(ctx, x + 1, y, this.point, 'noteheadParenthesisRight', {\n category: `noteHead.standard.noteheadParenthesisRight`,\n });\n }\n else if (this.position == Modifier.Position.LEFT) {\n Glyph.renderGlyph(ctx, x - 2, y, this.point, 'noteheadParenthesisLeft', {\n category: `noteHead.standard.noteheadParenthesisLeft`,\n });\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { BoundingBox } from './boundingbox';\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (NoteHead.DEBUG)\n log('Vex.Flow.NoteHead', args);\n}\n/**\n * Draw slashnote head manually. No glyph exists for this.\n * @param ctx the Canvas context\n * @param duration the duration of the note. ex: \"4\"\n * @param x the x coordinate to draw at\n * @param y the y coordinate to draw at\n * @param stem_direction the direction of the stem\n */\nfunction drawSlashNoteHead(ctx, duration, x, y, stem_direction, staveSpace) {\n const width = Tables.SLASH_NOTEHEAD_WIDTH;\n ctx.save();\n ctx.setLineWidth(Tables.STEM_WIDTH);\n let fill = false;\n if (Tables.durationToNumber(duration) > 2) {\n fill = true;\n }\n if (!fill)\n x -= (Tables.STEM_WIDTH / 2) * stem_direction;\n ctx.beginPath();\n ctx.moveTo(x, y + staveSpace);\n ctx.lineTo(x, y + 1);\n ctx.lineTo(x + width, y - staveSpace);\n ctx.lineTo(x + width, y);\n ctx.lineTo(x, y + staveSpace);\n ctx.closePath();\n if (fill) {\n ctx.fill();\n }\n else {\n ctx.stroke();\n }\n if (Tables.durationToFraction(duration).equals(0.5)) {\n const breve_lines = [-3, -1, width + 1, width + 3];\n for (let i = 0; i < breve_lines.length; i++) {\n ctx.beginPath();\n ctx.moveTo(x + breve_lines[i], y - 10);\n ctx.lineTo(x + breve_lines[i], y + 11);\n ctx.stroke();\n }\n }\n ctx.restore();\n}\n/**\n * `NoteHeads` are typically not manipulated\n * directly, but used internally in `StaveNote`.\n *\n * See `tests/notehead_tests.ts` for usage examples.\n */\nexport class NoteHead extends Note {\n constructor(noteStruct) {\n super(noteStruct);\n this.custom_glyph = false;\n this.stem_up_x_offset = 0;\n this.stem_down_x_offset = 0;\n this.index = noteStruct.index;\n this.x = noteStruct.x || 0;\n this.y = noteStruct.y || 0;\n if (noteStruct.note_type)\n this.noteType = noteStruct.note_type;\n this.displaced = noteStruct.displaced || false;\n this.stem_direction = noteStruct.stem_direction || Stem.UP;\n this.line = noteStruct.line || 0;\n // Get glyph code based on duration and note type. This could be\n // regular notes, rests, or other custom codes.\n this.glyph = Tables.getGlyphProps(this.duration, this.noteType);\n defined(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`);\n this.glyph_code = this.glyph.code_head;\n this.x_shift = noteStruct.x_shift || 0;\n if (noteStruct.custom_glyph_code) {\n this.custom_glyph = true;\n this.glyph_code = noteStruct.custom_glyph_code;\n this.stem_up_x_offset = noteStruct.stem_up_x_offset || 0;\n this.stem_down_x_offset = noteStruct.stem_down_x_offset || 0;\n }\n this.style = noteStruct.style;\n this.slashed = noteStruct.slashed || false;\n this.render_options = Object.assign(Object.assign({}, this.render_options), { \n // font size for note heads\n glyph_font_scale: noteStruct.glyph_font_scale || Tables.NOTATION_FONT_SCALE });\n this.setWidth(this.glyph.getWidth(this.render_options.glyph_font_scale));\n }\n static get CATEGORY() {\n return Category.NoteHead;\n }\n /** Get the width of the notehead. */\n getWidth() {\n return this.width;\n }\n /** Determine if the notehead is displaced. */\n isDisplaced() {\n return this.displaced === true;\n }\n /** Get the glyph data. */\n getGlyph() {\n return this.glyph;\n }\n /** Set the X coordinate. */\n setX(x) {\n this.x = x;\n return this;\n }\n /** Get the Y coordinate. */\n getY() {\n return this.y;\n }\n /** Set the Y coordinate. */\n setY(y) {\n this.y = y;\n return this;\n }\n /** Get the stave line the notehead is placed on. */\n getLine() {\n return this.line;\n }\n /** Set the stave line the notehead is placed on. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Get the canvas `x` coordinate position of the notehead. */\n getAbsoluteX() {\n // If the note has not been preformatted, then get the static x value\n // Otherwise, it's been formatted and we should use it's x value relative\n // to its tick context\n const x = !this.preFormatted ? this.x : super.getAbsoluteX();\n // For a more natural displaced notehead, we adjust the displacement amount\n // by half the stem width in order to maintain a slight overlap with the stem\n const displacementStemAdjustment = Stem.WIDTH / 2;\n const musicFont = Tables.currentMusicFont();\n const fontShift = musicFont.lookupMetric('notehead.shiftX', 0) * this.stem_direction;\n const displacedFontShift = musicFont.lookupMetric('noteHead.displaced.shiftX', 0) * this.stem_direction;\n return (x +\n fontShift +\n (this.displaced ? (this.width - displacementStemAdjustment) * this.stem_direction + displacedFontShift : 0));\n }\n /** Get the `BoundingBox` for the `NoteHead`. */\n getBoundingBox() {\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call getBoundingBox on an unformatted note.\");\n }\n const spacing = this.checkStave().getSpacingBetweenLines();\n const half_spacing = spacing / 2;\n const min_y = this.y - half_spacing;\n return new BoundingBox(this.getAbsoluteX(), min_y, this.width, spacing);\n }\n /** Set notehead to a provided `stave`. */\n setStave(stave) {\n const line = this.getLine();\n this.stave = stave;\n if (this.stave) {\n this.setY(this.stave.getYForNote(line));\n this.setContext(this.stave.getContext());\n }\n return this;\n }\n /** Pre-render formatting. */\n preFormat() {\n if (this.preFormatted)\n return this;\n const width = this.getWidth() + this.leftDisplacedHeadPx + this.rightDisplacedHeadPx;\n this.setWidth(width);\n this.preFormatted = true;\n return this;\n }\n /** Draw the notehead. */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n let head_x = this.getAbsoluteX();\n if (this.custom_glyph) {\n // head_x += this.x_shift;\n head_x += this.stem_direction === Stem.UP ? this.stem_up_x_offset : this.stem_down_x_offset;\n }\n const y = this.y;\n L(\"Drawing note head '\", this.noteType, this.duration, \"' at\", head_x, y);\n // Begin and end positions for head.\n const stem_direction = this.stem_direction;\n const glyph_font_scale = this.render_options.glyph_font_scale;\n if (this.style) {\n this.applyStyle(ctx);\n }\n const categorySuffix = `${this.glyph_code}Stem${stem_direction === Stem.UP ? 'Up' : 'Down'}`;\n if (this.noteType === 's') {\n const staveSpace = this.checkStave().getSpacingBetweenLines();\n drawSlashNoteHead(ctx, this.duration, head_x, y, stem_direction, staveSpace);\n }\n else {\n Glyph.renderGlyph(ctx, head_x, y, glyph_font_scale, this.glyph_code, {\n category: this.custom_glyph ? `noteHead.custom.${categorySuffix}` : `noteHead.standard.${categorySuffix}`,\n });\n }\n if (this.style) {\n this.restoreStyle(ctx);\n }\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.NoteHead.DEBUG` to `true`. */\nNoteHead.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// `StemmableNote` is an abstract interface for notes with optional stems.\n// Examples of stemmable notes are `StaveNote` and `TabNote`\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StemmableNote extends Note {\n constructor(noteStruct) {\n super(noteStruct);\n }\n static get CATEGORY() {\n return Category.StemmableNote;\n }\n // Get and set the note's `Stem`\n getStem() {\n return this.stem;\n }\n checkStem() {\n if (!this.stem) {\n throw new RuntimeError('NoStem', 'No stem attached to instance');\n }\n return this.stem;\n }\n setStem(stem) {\n this.stem = stem;\n return this;\n }\n // Builds and sets a new stem\n buildStem() {\n const stem = new Stem();\n this.setStem(stem);\n return this;\n }\n buildFlag(category = 'flag') {\n const { glyph } = this;\n if (this.hasFlag()) {\n const flagCode = this.getStemDirection() === Stem.DOWN ? glyph.code_flag_downstem : glyph.code_flag_upstem;\n this.flag = new Glyph(flagCode, this.render_options.glyph_font_scale, { category });\n }\n }\n // Get the custom glyph associated with the outer note head on the base of the stem.\n getBaseCustomNoteHeadGlyph() {\n if (this.getStemDirection() === Stem.DOWN) {\n return this.customGlyphs[this.customGlyphs.length - 1];\n }\n else {\n return this.customGlyphs[0];\n }\n }\n // Get the full length of stem\n getStemLength() {\n return Stem.HEIGHT + this.getStemExtension();\n }\n // Get the number of beams for this duration\n getBeamCount() {\n const glyph = this.getGlyph();\n if (glyph) {\n return glyph.beam_count;\n }\n else {\n return 0;\n }\n }\n // Get the minimum length of stem\n getStemMinimumLength() {\n const frac = Tables.durationToFraction(this.duration);\n let length = frac.value() <= 1 ? 0 : 20;\n // if note is flagged, cannot shorten beam\n switch (this.duration) {\n case '8':\n if (this.beam == undefined)\n length = 35;\n break;\n case '16':\n length = this.beam == undefined ? 35 : 25;\n break;\n case '32':\n length = this.beam == undefined ? 45 : 35;\n break;\n case '64':\n length = this.beam == undefined ? 50 : 40;\n break;\n case '128':\n length = this.beam == undefined ? 55 : 45;\n break;\n default:\n break;\n }\n return length;\n }\n // Get/set the direction of the stem\n getStemDirection() {\n if (!this.stem_direction)\n throw new RuntimeError('NoStem', 'No stem attached to this note.');\n return this.stem_direction;\n }\n setStemDirection(direction) {\n if (!direction)\n direction = Stem.UP;\n if (direction !== Stem.UP && direction !== Stem.DOWN) {\n throw new RuntimeError('BadArgument', `Invalid stem direction: ${direction}`);\n }\n this.stem_direction = direction;\n // Reset and reformat everything. Flag has to be built before calling getStemExtension.\n this.reset();\n if (this.hasFlag()) {\n this.buildFlag();\n }\n this.beam = undefined;\n if (this.stem) {\n this.stem.setDirection(direction);\n this.stem.setExtension(this.getStemExtension());\n // Lookup the base custom notehead (closest to the base of the stem) to extend or shorten\n // the stem appropriately. If there's no custom note head, lookup the standard notehead.\n const glyph = this.getBaseCustomNoteHeadGlyph() || this.getGlyph();\n // Get the font-specific customizations for the note heads.\n const offsets = Tables.currentMusicFont().lookupMetric(`stem.noteHead.${glyph.code_head}`, {\n offsetYBaseStemUp: 0,\n offsetYTopStemUp: 0,\n offsetYBaseStemDown: 0,\n offsetYTopStemDown: 0,\n });\n // Configure the stem to use these offsets.\n this.stem.setOptions({\n stem_up_y_offset: offsets.offsetYTopStemUp,\n stem_down_y_offset: offsets.offsetYTopStemDown,\n stem_up_y_base_offset: offsets.offsetYBaseStemUp,\n stem_down_y_base_offset: offsets.offsetYBaseStemDown, // glyph.stem_down_y_base_offset,\n });\n }\n if (this.preFormatted) {\n this.preFormat();\n }\n return this;\n }\n // Get the `x` coordinate of the stem\n getStemX() {\n const x_begin = this.getAbsoluteX() + this.x_shift;\n const x_end = this.getAbsoluteX() + this.x_shift + this.getGlyphWidth();\n const stem_x = this.stem_direction === Stem.DOWN ? x_begin : x_end;\n return stem_x;\n }\n // Get the `x` coordinate for the center of the glyph.\n // Used for `TabNote` stems and stemlets over rests\n getCenterGlyphX() {\n return this.getAbsoluteX() + this.x_shift + this.getGlyphWidth() / 2;\n }\n // Get the stem extension for the current duration\n getStemExtension() {\n const glyph = this.getGlyph();\n if (this.stem_extension_override != undefined) {\n return this.stem_extension_override;\n }\n // Use stem_beam_extension with beams\n if (this.beam) {\n return glyph.stem_beam_extension;\n }\n const flagCode = this.getStemDirection() === Stem.DOWN ? this.glyph.code_flag_downstem : this.glyph.code_flag_upstem;\n return Math.abs(Tables.currentMusicFont().lookupMetric(`glyphs.flag.${flagCode}.shiftY`, 0));\n }\n // Set the stem length to a specific. Will override the default length.\n setStemLength(height) {\n this.stem_extension_override = height - Stem.HEIGHT;\n return this;\n }\n // Get the top and bottom `y` values of the stem.\n getStemExtents() {\n if (!this.stem)\n throw new RuntimeError('NoStem', 'No stem attached to this note.');\n return this.stem.getExtents();\n }\n /** Gets the `y` value for the top modifiers at a specific `textLine`. */\n getYForTopText(textLine) {\n const stave = this.checkStave();\n if (this.hasStem()) {\n const extents = this.getStemExtents();\n if (!extents)\n throw new RuntimeError('InvalidState', 'Stem does not have extents.');\n return Math.min(stave.getYForTopText(textLine), extents.topY - this.render_options.annotation_spacing * (textLine + 1));\n }\n else {\n return stave.getYForTopText(textLine);\n }\n }\n /** Gets the `y` value for the bottom modifiers at a specific `textLine`. */\n getYForBottomText(textLine) {\n const stave = this.checkStave();\n if (this.hasStem()) {\n const extents = this.getStemExtents();\n if (!extents)\n throw new RuntimeError('InvalidState', 'Stem does not have extents.');\n return Math.max(stave.getYForTopText(textLine), extents.baseY + this.render_options.annotation_spacing * textLine);\n }\n else {\n return stave.getYForBottomText(textLine);\n }\n }\n hasFlag() {\n return Tables.getGlyphProps(this.duration).flag && !this.beam;\n }\n /** Post formats the note. */\n postFormat() {\n var _a;\n (_a = this.beam) === null || _a === void 0 ? void 0 : _a.postFormat();\n this.postFormatted = true;\n return this;\n }\n /** Renders the stem onto the canvas. */\n drawStem(stemOptions) {\n var _a;\n this.checkContext();\n this.setRendered();\n this.setStem(new Stem(stemOptions));\n (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setContext(this.getContext()).draw();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// This file implements notes for standard notation. This consists of one or\n// more `NoteHeads`, an optional stem, and an optional flag.\n//\n// Throughout these comments, a \"note\" refers to the entire `StaveNote`,\n// and a \"key\" refers to a specific pitch/notehead within a note.\n//\n// See `tests/stavenote_tests.ts` for usage examples.\nimport { BoundingBox } from './boundingbox';\nimport { Modifier } from './modifier';\nimport { NoteHead } from './notehead';\nimport { Stem } from './stem';\nimport { StemmableNote } from './stemmablenote';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, log, midLine, RuntimeError, warn } from './util';\nfunction showDeprecationWarningForNoteHeads() {\n // eslint-disable-next-line\n console.warn('StaveNote.note_heads is deprecated. Use StaveNote.noteHeads instead.', 'This accessor will be removed in VexFlow 5.0.');\n}\n// To enable logging for this class. Set `Vex.Flow.StaveNote.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (StaveNote.DEBUG)\n log('Vex.Flow.StaveNote', args);\n}\nconst isInnerNoteIndex = (note, index) => index === (note.getStemDirection() === Stem.UP ? note.keyProps.length - 1 : 0);\n// Helper methods for rest positioning in ModifierContext.\nfunction shiftRestVertical(rest, note, dir) {\n const delta = dir;\n rest.line += delta;\n rest.maxLine += delta;\n rest.minLine += delta;\n rest.note.setKeyLine(0, rest.note.getKeyLine(0) + delta);\n}\n// Called from formatNotes :: center a rest between two notes\nfunction centerRest(rest, noteU, noteL) {\n const delta = rest.line - midLine(noteU.minLine, noteL.maxLine);\n rest.note.setKeyLine(0, rest.note.getKeyLine(0) - delta);\n rest.line -= delta;\n rest.maxLine -= delta;\n rest.minLine -= delta;\n}\nexport class StaveNote extends StemmableNote {\n constructor(noteStruct) {\n var _a, _b, _c;\n super(noteStruct);\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // INSTANCE MEMBERS\n this.minLine = 0;\n this.maxLine = 0;\n this.ledgerLineStyle = {};\n this.clef = (_a = noteStruct.clef) !== null && _a !== void 0 ? _a : 'treble';\n this.octave_shift = (_b = noteStruct.octave_shift) !== null && _b !== void 0 ? _b : 0;\n // Pull note rendering properties.\n this.glyph = Tables.getGlyphProps(this.duration, this.noteType);\n defined(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`);\n // if true, displace note to right\n this.displaced = false;\n this.dot_shiftY = 0;\n // for displaced ledger lines\n this.use_default_head_x = false;\n // Drawing\n this._noteHeads = [];\n this.modifiers = [];\n this.render_options = Object.assign(Object.assign({}, this.render_options), { \n // font size for note heads and rests\n glyph_font_scale: noteStruct.glyph_font_scale || Tables.NOTATION_FONT_SCALE, \n // number of stroke px to the left and right of head\n stroke_px: noteStruct.stroke_px || StaveNote.LEDGER_LINE_OFFSET });\n this.calculateKeyProps();\n this.buildStem();\n // Set the stem direction\n if (noteStruct.auto_stem) {\n this.autoStem();\n }\n else {\n this.setStemDirection((_c = noteStruct.stem_direction) !== null && _c !== void 0 ? _c : Stem.UP);\n }\n this.reset();\n this.buildFlag();\n }\n static get CATEGORY() {\n return Category.StaveNote;\n }\n /**\n * @deprecated Use Stem.UP.\n */\n static get STEM_UP() {\n return Stem.UP;\n }\n /**\n * @deprecated Use Stem.DOWN.\n */\n static get STEM_DOWN() {\n return Stem.DOWN;\n }\n static get LEDGER_LINE_OFFSET() {\n return 3;\n }\n static get minNoteheadPadding() {\n const musicFont = Tables.currentMusicFont();\n return musicFont.lookupMetric('glyphs.noteHead.minPadding');\n }\n /** Format notes inside a ModifierContext. */\n static format(notes, state) {\n if (!notes || notes.length < 2)\n return false;\n const notesList = [];\n for (let i = 0; i < notes.length; i++) {\n const props = notes[i].getKeyProps();\n const line = props[0].line;\n let minL = props[props.length - 1].line;\n const stemDirection = notes[i].getStemDirection();\n const stemMax = notes[i].getStemLength() / 10;\n const stemMin = notes[i].getStemMinimumLength() / 10;\n let maxL;\n if (notes[i].isRest()) {\n maxL = line + notes[i].glyph.line_above;\n minL = line - notes[i].glyph.line_below;\n }\n else {\n maxL = stemDirection === 1 ? props[props.length - 1].line + stemMax : props[props.length - 1].line;\n minL = stemDirection === 1 ? props[0].line : props[0].line - stemMax;\n }\n notesList.push({\n line: props[0].line,\n maxLine: maxL,\n minLine: minL,\n isrest: notes[i].isRest(),\n stemDirection: stemDirection,\n stemMax,\n stemMin,\n voice_shift: notes[i].getVoiceShiftWidth(),\n is_displaced: notes[i].isDisplaced(),\n note: notes[i],\n });\n }\n const voices = notesList.length;\n let noteU = notesList[0];\n const noteM = voices > 2 ? notesList[1] : undefined;\n let noteL = voices > 2 ? notesList[2] : notesList[1];\n // for two voice backward compatibility, ensure upper voice is stems up\n // for three voices, the voices must be in order (upper, middle, lower)\n if (voices === 2 && noteU.stemDirection === -1 && noteL.stemDirection === 1) {\n noteU = notesList[1];\n noteL = notesList[0];\n }\n const voiceXShift = Math.max(noteU.voice_shift, noteL.voice_shift);\n let xShift = 0;\n // Test for two voice note intersection\n if (voices === 2) {\n const lineSpacing = noteU.stemDirection === noteL.stemDirection ? 0.0 : 0.5;\n if (noteU.minLine <= noteL.maxLine + lineSpacing) {\n if (noteU.isrest) {\n // shift rest up\n shiftRestVertical(noteU, noteL, 1);\n }\n else if (noteL.isrest) {\n // shift rest down\n shiftRestVertical(noteL, noteU, -1);\n }\n else if (noteU.stemDirection === noteL.stemDirection) {\n // upper voice is middle voice, so shift it right\n xShift = voiceXShift + 2;\n noteU.note.setXShift(xShift);\n }\n else {\n // shift lower voice right\n xShift = voiceXShift + 2;\n noteL.note.setXShift(xShift);\n }\n }\n // format complete\n state.right_shift += xShift;\n return true;\n }\n if (!noteM)\n throw new RuntimeError('InvalidState', 'noteM not defined.');\n // For three voices, test if rests can be repositioned\n //\n // Special case 1 :: middle voice rest between two notes\n //\n if (noteM.isrest && !noteU.isrest && !noteL.isrest) {\n if (noteU.minLine <= noteM.maxLine || noteM.minLine <= noteL.maxLine) {\n const restHeight = noteM.maxLine - noteM.minLine;\n const space = noteU.minLine - noteL.maxLine;\n if (restHeight < space) {\n // center middle voice rest between the upper and lower voices\n centerRest(noteM, noteU, noteL);\n }\n else {\n xShift = voiceXShift + 2; // shift middle rest right\n noteM.note.setXShift(xShift);\n if (noteL.note.hasBeam() === false) {\n noteL.stemDirection = -1;\n noteL.note.setStemDirection(-1);\n }\n if (noteU.minLine <= noteL.maxLine && noteU.note.hasBeam() === false) {\n noteU.stemDirection = 1;\n noteU.note.setStemDirection(1);\n }\n }\n // format complete\n state.right_shift += xShift;\n return true;\n }\n }\n // Special case 2 :: all voices are rests\n if (noteU.isrest && noteM.isrest && noteL.isrest) {\n // Shift upper voice rest up\n shiftRestVertical(noteU, noteM, 1);\n // Shift lower voice rest down\n shiftRestVertical(noteL, noteM, -1);\n // format complete\n state.right_shift += xShift;\n return true;\n }\n // Test if any other rests can be repositioned\n if (noteM.isrest && noteU.isrest && noteM.minLine <= noteL.maxLine) {\n // Shift middle voice rest up\n shiftRestVertical(noteM, noteL, 1);\n }\n if (noteM.isrest && noteL.isrest && noteU.minLine <= noteM.maxLine) {\n // Shift middle voice rest down\n shiftRestVertical(noteM, noteU, -1);\n }\n if (noteU.isrest && noteU.minLine <= noteM.maxLine) {\n // shift upper voice rest up;\n shiftRestVertical(noteU, noteM, 1);\n }\n if (noteL.isrest && noteM.minLine <= noteL.maxLine) {\n // shift lower voice rest down\n shiftRestVertical(noteL, noteM, -1);\n }\n // If middle voice intersects upper or lower voice\n if (noteU.minLine <= noteM.maxLine + 0.5 || noteM.minLine <= noteL.maxLine) {\n // shift middle note right\n xShift = voiceXShift + 2;\n noteM.note.setXShift(xShift);\n if (noteL.note.hasBeam() === false) {\n noteL.stemDirection = -1;\n noteL.note.setStemDirection(-1);\n }\n if (noteU.minLine <= noteL.maxLine && noteU.note.hasBeam() === false) {\n noteU.stemDirection = 1;\n noteU.note.setStemDirection(1);\n }\n }\n state.right_shift += xShift;\n return true;\n }\n static postFormat(notes) {\n if (!notes)\n return false;\n notes.forEach((note) => note.postFormat());\n return true;\n }\n reset() {\n super.reset();\n // Save prior noteHead styles & reapply them after making new noteheads.\n const noteHeadStyles = this._noteHeads.map((noteHead) => noteHead.getStyle());\n this.buildNoteHeads();\n this._noteHeads.forEach((noteHead, index) => {\n const noteHeadStyle = noteHeadStyles[index];\n if (noteHeadStyle)\n noteHead.setStyle(noteHeadStyle);\n });\n const stave = this.stave;\n if (stave) {\n this._noteHeads.forEach((head) => head.setStave(stave));\n }\n this.calcNoteDisplacements();\n return this;\n }\n setBeam(beam) {\n this.beam = beam;\n this.calcNoteDisplacements();\n // Update stem extension is a beam is assigned.\n if (this.stem) {\n this.stem.setExtension(this.getStemExtension());\n }\n return this;\n }\n // Builds a `Stem` for the note\n buildStem() {\n this.setStem(new Stem({ hide: !!this.isRest() }));\n return this;\n }\n // Builds a `NoteHead` for each key in the note\n buildNoteHeads() {\n this._noteHeads = [];\n const stemDirection = this.getStemDirection();\n const keys = this.getKeys();\n let lastLine = undefined;\n let lineDiff = undefined;\n let displaced = false;\n // Draw notes from bottom to top.\n // For down-stem notes, we draw from top to bottom.\n let start;\n let end;\n let step;\n if (stemDirection === Stem.UP) {\n start = 0;\n end = keys.length;\n step = 1;\n }\n else {\n start = keys.length - 1;\n end = -1;\n step = -1;\n }\n for (let i = start; i !== end; i += step) {\n const noteProps = this.keyProps[i];\n const line = noteProps.line;\n // Keep track of last line with a note head, so that consecutive heads\n // are correctly displaced.\n if (lastLine === undefined) {\n lastLine = line;\n }\n else {\n lineDiff = Math.abs(lastLine - line);\n if (lineDiff === 0 || lineDiff === 0.5) {\n displaced = !displaced;\n }\n else {\n displaced = false;\n this.use_default_head_x = true;\n }\n }\n lastLine = line;\n const notehead = new NoteHead({\n duration: this.duration,\n note_type: this.noteType,\n displaced,\n stem_direction: stemDirection,\n custom_glyph_code: noteProps.code,\n glyph_font_scale: this.render_options.glyph_font_scale,\n x_shift: noteProps.shift_right,\n stem_up_x_offset: noteProps.stem_up_x_offset,\n stem_down_x_offset: noteProps.stem_down_x_offset,\n line: noteProps.line,\n });\n this._noteHeads[i] = notehead;\n }\n }\n // Automatically sets the stem direction based on the keys in the note\n autoStem() {\n this.setStemDirection(this.calculateOptimalStemDirection());\n }\n calculateOptimalStemDirection() {\n // Figure out optimal stem direction based on given notes\n this.minLine = this.keyProps[0].line;\n this.maxLine = this.keyProps[this.keyProps.length - 1].line;\n const MIDDLE_LINE = 3;\n const decider = (this.minLine + this.maxLine) / 2;\n const stemDirection = decider < MIDDLE_LINE ? Stem.UP : Stem.DOWN;\n return stemDirection;\n }\n // Calculates and stores the properties for each key in the note\n calculateKeyProps() {\n let lastLine;\n for (let i = 0; i < this.keys.length; ++i) {\n const key = this.keys[i];\n // All rests use the same position on the line.\n // if (this.glyph.rest) key = this.glyph.position;\n if (this.glyph.rest)\n this.glyph.position = key;\n const options = { octave_shift: this.octave_shift || 0 };\n const props = Tables.keyProperties(key, this.clef, options);\n if (!props) {\n throw new RuntimeError('BadArguments', `Invalid key for note properties: ${key}`);\n }\n // Override line placement for default rests\n if (props.key === 'R') {\n if (this.duration === '1' || this.duration === 'w') {\n props.line = 4;\n }\n else {\n props.line = 3;\n }\n }\n // Calculate displacement of this note\n const line = props.line;\n if (lastLine == undefined) {\n lastLine = line;\n }\n else {\n if (Math.abs(lastLine - line) === 0.5) {\n this.displaced = true;\n props.displaced = true;\n // Have to mark the previous note as\n // displaced as well, for modifier placement\n if (this.keyProps.length > 0) {\n this.keyProps[i - 1].displaced = true;\n }\n }\n }\n lastLine = line;\n this.keyProps.push(props);\n }\n // Sort the notes from lowest line to highest line\n lastLine = undefined;\n this.keyProps.forEach((key) => {\n if (lastLine && key.line < lastLine) {\n warn('Unsorted keys in note will be sorted. ' + 'See https://github.com/0xfe/vexflow/issues/104 for details.');\n }\n lastLine = key.line;\n });\n this.keyProps.sort((a, b) => a.line - b.line);\n }\n // Get the `BoundingBox` for the entire note\n getBoundingBox() {\n var _a, _b;\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call getBoundingBox on an unformatted note.\");\n }\n const { width: w, modLeftPx, leftDisplacedHeadPx } = this.getMetrics();\n const x = this.getAbsoluteX() - modLeftPx - leftDisplacedHeadPx;\n let minY = 0;\n let maxY = 0;\n const halfLineSpacing = ((_b = (_a = this.getStave()) === null || _a === void 0 ? void 0 : _a.getSpacingBetweenLines()) !== null && _b !== void 0 ? _b : 0) / 2;\n const lineSpacing = halfLineSpacing * 2;\n if (this.isRest()) {\n const y = this.ys[0];\n const frac = Tables.durationToFraction(this.duration);\n if (frac.equals(1) || frac.equals(2)) {\n minY = y - halfLineSpacing;\n maxY = y + halfLineSpacing;\n }\n else {\n minY = y - this.glyph.line_above * lineSpacing;\n maxY = y + this.glyph.line_below * lineSpacing;\n }\n }\n else if (this.glyph.stem) {\n const ys = this.getStemExtents();\n ys.baseY += halfLineSpacing * this.getStemDirection();\n minY = Math.min(ys.topY, ys.baseY);\n maxY = Math.max(ys.topY, ys.baseY);\n }\n else {\n minY = 0;\n maxY = 0;\n for (let i = 0; i < this.ys.length; ++i) {\n const yy = this.ys[i];\n if (i === 0) {\n minY = yy;\n maxY = yy;\n }\n else {\n minY = Math.min(yy, minY);\n maxY = Math.max(yy, maxY);\n }\n }\n minY -= halfLineSpacing;\n maxY += halfLineSpacing;\n }\n return new BoundingBox(x, minY, w, maxY - minY);\n }\n // Gets the line number of the bottom note in the chord.\n // If `isTopNote` is `true` then get the top note's line number instead\n getLineNumber(isTopNote) {\n if (!this.keyProps.length) {\n throw new RuntimeError('NoKeyProps', \"Can't get bottom note line, because note is not initialized properly.\");\n }\n let resultLine = this.keyProps[0].line;\n // No precondition assumed for sortedness of keyProps array\n for (let i = 0; i < this.keyProps.length; i++) {\n const thisLine = this.keyProps[i].line;\n if (isTopNote) {\n if (thisLine > resultLine)\n resultLine = thisLine;\n }\n else {\n if (thisLine < resultLine)\n resultLine = thisLine;\n }\n }\n return resultLine;\n }\n /**\n * @returns true if this note is a type of rest. Rests don't have pitches, but take up space in the score.\n */\n isRest() {\n return this.glyph.rest;\n }\n // Determine if the current note is a chord\n isChord() {\n return !this.isRest() && this.keys.length > 1;\n }\n // Determine if the `StaveNote` has a stem\n hasStem() {\n return this.glyph.stem;\n }\n hasFlag() {\n return super.hasFlag() && !this.isRest();\n }\n getStemX() {\n if (this.noteType === 'r') {\n return this.getCenterGlyphX();\n }\n else {\n // We adjust the origin of the stem because we want the stem left-aligned\n // with the notehead if stemmed-down, and right-aligned if stemmed-up\n return super.getStemX() + (this.stem_direction ? Stem.WIDTH / (2 * -this.stem_direction) : 0);\n }\n }\n // Get the `y` coordinate for text placed on the top/bottom of a\n // note at a desired `text_line`\n getYForTopText(textLine) {\n const extents = this.getStemExtents();\n return Math.min(this.checkStave().getYForTopText(textLine), extents.topY - this.render_options.annotation_spacing * (textLine + 1));\n }\n getYForBottomText(textLine) {\n const extents = this.getStemExtents();\n return Math.max(this.checkStave().getYForTopText(textLine), extents.baseY + this.render_options.annotation_spacing * textLine);\n }\n // Sets the current note to the provided `stave`. This applies\n // `y` values to the `NoteHeads`.\n setStave(stave) {\n super.setStave(stave);\n const ys = this._noteHeads.map((notehead) => {\n notehead.setStave(stave);\n return notehead.getY();\n });\n this.setYs(ys);\n if (this.stem) {\n const { y_top, y_bottom } = this.getNoteHeadBounds();\n this.stem.setYBounds(y_top, y_bottom);\n }\n return this;\n }\n // Check if note is shifted to the right\n isDisplaced() {\n return this.displaced;\n }\n // Sets whether shift note to the right. `displaced` is a `boolean`\n setNoteDisplaced(displaced) {\n this.displaced = displaced;\n return this;\n }\n // Get the starting `x` coordinate for a `StaveTie`\n getTieRightX() {\n let tieStartX = this.getAbsoluteX();\n tieStartX += this.getGlyphWidth() + this.x_shift + this.rightDisplacedHeadPx;\n if (this.modifierContext)\n tieStartX += this.modifierContext.getRightShift();\n return tieStartX;\n }\n // Get the ending `x` coordinate for a `StaveTie`\n getTieLeftX() {\n let tieEndX = this.getAbsoluteX();\n tieEndX += this.x_shift - this.leftDisplacedHeadPx;\n return tieEndX;\n }\n // Get the stave line on which to place a rest\n getLineForRest() {\n let restLine = this.keyProps[0].line;\n if (this.keyProps.length > 1) {\n const lastLine = this.keyProps[this.keyProps.length - 1].line;\n const top = Math.max(restLine, lastLine);\n const bot = Math.min(restLine, lastLine);\n restLine = midLine(top, bot);\n }\n return restLine;\n }\n // Get the default `x` and `y` coordinates for the provided `position`\n // and key `index`\n getModifierStartXY(position, index, options = {}) {\n var _a, _b;\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call GetModifierStartXY on an unformatted note\");\n }\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', 'No Y-Values calculated for this note.');\n }\n const { ABOVE, BELOW, LEFT, RIGHT } = Modifier.Position;\n let x = 0;\n if (position === LEFT) {\n // FIXME: Left modifier padding, move to font file\n x = -1 * 2;\n }\n else if (position === RIGHT) {\n // FIXME: Right modifier padding, move to font file\n x = this.getGlyphWidth() + this.x_shift + 2;\n if (this.stem_direction === Stem.UP &&\n this.hasFlag() &&\n (options.forceFlagRight || isInnerNoteIndex(this, index))) {\n x += (_b = (_a = this === null || this === void 0 ? void 0 : this.flag) === null || _a === void 0 ? void 0 : _a.getMetrics().width) !== null && _b !== void 0 ? _b : 0;\n }\n }\n else if (position === BELOW || position === ABOVE) {\n x = this.getGlyphWidth() / 2;\n }\n return {\n x: this.getAbsoluteX() + x,\n y: this.ys[index],\n };\n }\n // Sets the style of the complete StaveNote, including all keys\n // and the stem.\n setStyle(style) {\n var _a;\n super.setStyle(style);\n this._noteHeads.forEach((notehead) => notehead.setStyle(style));\n (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setStyle(style);\n return this;\n }\n setStemStyle(style) {\n const stem = this.getStem();\n stem === null || stem === void 0 ? void 0 : stem.setStyle(style);\n return this;\n }\n getStemStyle() {\n var _a;\n return (_a = this.stem) === null || _a === void 0 ? void 0 : _a.getStyle();\n }\n setLedgerLineStyle(style) {\n this.ledgerLineStyle = style;\n }\n getLedgerLineStyle() {\n return this.ledgerLineStyle;\n }\n setFlagStyle(style) {\n this.flagStyle = style;\n }\n getFlagStyle() {\n return this.flagStyle;\n }\n // Sets the notehead at `index` to the provided coloring `style`.\n //\n // `style` is an `object` with the following properties: `shadowColor`,\n // `shadowBlur`, `fillStyle`, `strokeStyle`\n setKeyStyle(index, style) {\n this._noteHeads[index].setStyle(style);\n return this;\n }\n setKeyLine(index, line) {\n this.keyProps[index].line = line;\n this.reset();\n return this;\n }\n getKeyLine(index) {\n return this.keyProps[index].line;\n }\n // Get the width of the note if it is displaced. Used for `Voice`\n // formatting\n getVoiceShiftWidth() {\n // TODO: may need to accomodate for dot here.\n return this.getGlyphWidth() * (this.displaced ? 2 : 1);\n }\n // Calculates and sets the extra pixels to the left or right\n // if the note is displaced.\n calcNoteDisplacements() {\n this.setLeftDisplacedHeadPx(this.displaced && this.stem_direction === Stem.DOWN ? this.getGlyphWidth() : 0);\n // For upstems with flags, the extra space is unnecessary, since it's taken\n // up by the flag.\n this.setRightDisplacedHeadPx(!this.hasFlag() && this.displaced && this.stem_direction === Stem.UP ? this.getGlyphWidth() : 0);\n }\n // Pre-render formatting\n preFormat() {\n if (this.preFormatted)\n return;\n let noteHeadPadding = 0;\n if (this.modifierContext) {\n this.modifierContext.preFormat();\n // If there are no modifiers on this note, make sure there is adequate padding\n // between the notes.\n if (this.modifierContext.getWidth() === 0) {\n noteHeadPadding = StaveNote.minNoteheadPadding;\n }\n }\n let width = this.getGlyphWidth() + this.leftDisplacedHeadPx + this.rightDisplacedHeadPx + noteHeadPadding;\n // For upward flagged notes, the width of the flag needs to be added\n if (this.shouldDrawFlag() && this.stem_direction === Stem.UP) {\n width += this.getGlyphWidth();\n // TODO: Add flag width as a separate metric\n }\n this.setWidth(width);\n this.preFormatted = true;\n }\n /**\n * @typedef {Object} noteHeadBounds\n * @property {number} y_top the highest notehead bound\n * @property {number} y_bottom the lowest notehead bound\n * @property {number|Null} displaced_x the starting x for displaced noteheads\n * @property {number|Null} non_displaced_x the starting x for non-displaced noteheads\n * @property {number} highest_line the highest notehead line in traditional music line\n * numbering (bottom line = 1, top line = 5)\n * @property {number} lowest_line the lowest notehead line\n * @property {number|false} highest_displaced_line the highest staff line number\n * for a displaced notehead\n * @property {number|false} lowest_displaced_line\n * @property {number} highest_non_displaced_line\n * @property {number} lowest_non_displaced_line\n */\n /**\n * Get the staff line and y value for the highest & lowest noteheads\n * @returns {noteHeadBounds}\n */\n getNoteHeadBounds() {\n // Top and bottom Y values for stem.\n let yTop = +Infinity;\n let yBottom = -Infinity;\n let nonDisplacedX;\n let displacedX;\n let highestLine = this.checkStave().getNumLines();\n let lowestLine = 1;\n let highestDisplacedLine;\n let lowestDisplacedLine;\n let highestNonDisplacedLine = highestLine;\n let lowestNonDisplacedLine = lowestLine;\n this._noteHeads.forEach((notehead) => {\n const line = notehead.getLine();\n const y = notehead.getY();\n yTop = Math.min(y, yTop);\n yBottom = Math.max(y, yBottom);\n if (displacedX === undefined && notehead.isDisplaced()) {\n displacedX = notehead.getAbsoluteX();\n }\n if (nonDisplacedX === undefined && !notehead.isDisplaced()) {\n nonDisplacedX = notehead.getAbsoluteX();\n }\n highestLine = Math.max(line, highestLine);\n lowestLine = Math.min(line, lowestLine);\n if (notehead.isDisplaced()) {\n highestDisplacedLine = highestDisplacedLine === undefined ? line : Math.max(line, highestDisplacedLine);\n lowestDisplacedLine = lowestDisplacedLine === undefined ? line : Math.min(line, lowestDisplacedLine);\n }\n else {\n highestNonDisplacedLine = Math.max(line, highestNonDisplacedLine);\n lowestNonDisplacedLine = Math.min(line, lowestNonDisplacedLine);\n }\n }, this);\n return {\n y_top: yTop,\n y_bottom: yBottom,\n displaced_x: displacedX,\n non_displaced_x: nonDisplacedX,\n highest_line: highestLine,\n lowest_line: lowestLine,\n highest_displaced_line: highestDisplacedLine,\n lowest_displaced_line: lowestDisplacedLine,\n highest_non_displaced_line: highestNonDisplacedLine,\n lowest_non_displaced_line: lowestNonDisplacedLine,\n };\n }\n // Get the starting `x` coordinate for the noteheads\n getNoteHeadBeginX() {\n return this.getAbsoluteX() + this.x_shift;\n }\n // Get the ending `x` coordinate for the noteheads\n getNoteHeadEndX() {\n const xBegin = this.getNoteHeadBeginX();\n return xBegin + this.getGlyphWidth();\n }\n get noteHeads() {\n return this._noteHeads.slice();\n }\n /** @deprecated use StaveNote.noteHeads instead. */\n get note_heads() {\n showDeprecationWarningForNoteHeads();\n return this.noteHeads;\n }\n // Draw the ledger lines between the stave and the highest/lowest keys\n drawLedgerLines() {\n const stave = this.checkStave();\n const { glyph, render_options: { stroke_px }, } = this;\n const ctx = this.checkContext();\n const width = glyph.getWidth() + stroke_px * 2;\n const doubleWidth = 2 * (glyph.getWidth() + stroke_px) - Stem.WIDTH / 2;\n if (this.isRest())\n return;\n if (!ctx) {\n throw new RuntimeError('NoCanvasContext', \"Can't draw without a canvas context.\");\n }\n const { highest_line, lowest_line, highest_displaced_line, highest_non_displaced_line, lowest_displaced_line, lowest_non_displaced_line, displaced_x, non_displaced_x, } = this.getNoteHeadBounds();\n // Early out if there are no ledger lines to draw.\n if (highest_line < 6 && lowest_line > 0)\n return;\n const min_x = Math.min(displaced_x !== null && displaced_x !== void 0 ? displaced_x : 0, non_displaced_x !== null && non_displaced_x !== void 0 ? non_displaced_x : 0);\n const drawLedgerLine = (y, normal, displaced) => {\n let x;\n if (displaced && normal)\n x = min_x - stroke_px;\n else if (normal)\n x = (non_displaced_x !== null && non_displaced_x !== void 0 ? non_displaced_x : 0) - stroke_px;\n else\n x = (displaced_x !== null && displaced_x !== void 0 ? displaced_x : 0) - stroke_px;\n const ledgerWidth = normal && displaced ? doubleWidth : width;\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(x + ledgerWidth, y);\n ctx.stroke();\n };\n const style = Object.assign(Object.assign({}, stave.getDefaultLedgerLineStyle()), this.getLedgerLineStyle());\n this.applyStyle(ctx, style);\n // Draw ledger lines below the staff:\n for (let line = 6; line <= highest_line; ++line) {\n const normal = non_displaced_x !== undefined && line <= highest_non_displaced_line;\n const displaced = highest_displaced_line !== undefined && line <= highest_displaced_line;\n drawLedgerLine(stave.getYForNote(line), normal, displaced);\n }\n // Draw ledger lines above the staff:\n for (let line = 0; line >= lowest_line; --line) {\n const normal = non_displaced_x !== undefined && line >= lowest_non_displaced_line;\n const displaced = lowest_displaced_line !== undefined && line >= lowest_displaced_line;\n drawLedgerLine(stave.getYForNote(line), normal, displaced);\n }\n this.restoreStyle(ctx, style);\n }\n // Draw all key modifiers\n drawModifiers() {\n const ctx = this.checkContext();\n ctx.openGroup('modifiers');\n for (let i = 0; i < this.modifiers.length; i++) {\n const modifier = this.modifiers[i];\n const index = modifier.checkIndex();\n const notehead = this._noteHeads[index];\n const noteheadStyle = notehead.getStyle();\n notehead.applyStyle(ctx, noteheadStyle);\n modifier.setContext(ctx);\n modifier.drawWithStyle();\n notehead.restoreStyle(ctx, noteheadStyle);\n }\n ctx.closeGroup();\n }\n shouldDrawFlag() {\n const hasStem = this.stem !== undefined;\n const hasFlag = this.glyph.flag; // specified in tables.js\n const hasNoBeam = this.beam === undefined;\n return hasStem && hasFlag && hasNoBeam;\n }\n // Draw the flag for the note\n drawFlag() {\n var _a;\n const ctx = this.checkContext();\n if (!ctx) {\n throw new RuntimeError('NoCanvasContext', \"Can't draw without a canvas context.\");\n }\n if (this.shouldDrawFlag()) {\n const { y_top, y_bottom } = this.getNoteHeadBounds();\n // eslint-disable-next-line\n const noteStemHeight = this.stem.getHeight();\n const flagX = this.getStemX();\n // FIXME: What's with the magic +/- 2\n // ANSWER: a corner of the note stem pokes out beyond the tip of the flag.\n // The extra +/- 2 pushes the flag glyph outward so it covers the stem entirely.\n // Alternatively, we could shorten the stem.\n const extension = this.flag !== undefined ? this.flag.checkMetrics().y_shift : 0;\n const flagY = this.getStemDirection() === Stem.DOWN\n ? // Down stems are below the note head and have flags on the right.\n y_top - noteStemHeight + 2 - extension\n : // Up stems are above the note head and have flags on the right.\n y_bottom - noteStemHeight - 2 - extension;\n // Draw the Flag\n ctx.openGroup('flag', undefined, { pointerBBox: true });\n this.applyStyle(ctx, this.getFlagStyle());\n (_a = this.flag) === null || _a === void 0 ? void 0 : _a.render(ctx, flagX, flagY);\n this.restoreStyle(ctx, this.getFlagStyle());\n ctx.closeGroup();\n }\n }\n // Draw the NoteHeads\n drawNoteHeads() {\n const ctx = this.checkContext();\n this._noteHeads.forEach((notehead) => {\n ctx.openGroup('notehead', undefined, { pointerBBox: true });\n notehead.setContext(ctx).draw();\n ctx.closeGroup();\n });\n }\n drawStem(stemOptions) {\n var _a;\n // GCR TODO: I can't find any context in which this is called with the stemStruct\n // argument in the codebase or tests. Nor can I find a case where super.drawStem\n // is called at all. Perhaps these should be removed?\n const ctx = this.checkContext();\n if (stemOptions) {\n this.setStem(new Stem(stemOptions));\n }\n // If we will render a flag, we shorten the stem so that the tip\n // does not poke through the flag.\n if (this.shouldDrawFlag() && this.stem) {\n this.stem.adjustHeightForFlag();\n }\n ctx.openGroup('stem', undefined, { pointerBBox: true });\n (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setContext(ctx).draw();\n ctx.closeGroup();\n }\n /**\n * Override stemmablenote stem extension to adjust for distance from middle line.\n */\n getStemExtension() {\n const super_stem_extension = super.getStemExtension();\n if (!this.glyph.stem) {\n return super_stem_extension;\n }\n const stem_direction = this.getStemDirection();\n if (stem_direction !== this.calculateOptimalStemDirection()) {\n return super_stem_extension; // no adjustment for manually set stem direction.\n }\n let mid_line_distance;\n const MIDDLE_LINE = 3;\n if (stem_direction === Stem.UP) {\n // Note that the use of maxLine here instead of minLine might\n // seem counterintuitive, but in the case of (say) treble clef\n // chord(F2, E4) stem up, we do not want to extend the stem because\n // of F2, when a normal octave-length stem above E4 is fine.\n //\n // maxLine and minLine are set in calculateOptimalStemDirection() so\n // will be known.\n mid_line_distance = MIDDLE_LINE - this.maxLine;\n }\n else {\n mid_line_distance = this.minLine - MIDDLE_LINE;\n }\n // how many lines more than an octave is the relevant notehead?\n const lines_over_octave_from_mid_line = mid_line_distance - 3.5;\n if (lines_over_octave_from_mid_line <= 0) {\n return super_stem_extension;\n }\n const stave = this.getStave();\n let spacing_between_lines = 10;\n if (stave != undefined) {\n spacing_between_lines = stave.getSpacingBetweenLines();\n }\n return super_stem_extension + lines_over_octave_from_mid_line * spacing_between_lines;\n }\n // Draws all the `StaveNote` parts. This is the main drawing method.\n draw() {\n var _a;\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', \"Can't draw note without Y values.\");\n }\n const ctx = this.checkContext();\n const xBegin = this.getNoteHeadBeginX();\n const shouldRenderStem = this.hasStem() && !this.beam;\n // Format note head x positions\n this._noteHeads.forEach((notehead) => notehead.setX(xBegin));\n // Format stem x positions\n const stemX = this.getStemX();\n (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setNoteHeadXBounds(stemX, stemX);\n L('Rendering ', this.isChord() ? 'chord :' : 'note :', this.keys);\n // Apply the overall style -- may be contradicted by local settings:\n this.applyStyle();\n this.setAttribute('el', ctx.openGroup('stavenote', this.getAttribute('id')));\n this.drawLedgerLines();\n ctx.openGroup('note', undefined, { pointerBBox: true });\n if (shouldRenderStem)\n this.drawStem();\n this.drawNoteHeads();\n this.drawFlag();\n ctx.closeGroup();\n this.drawModifiers();\n ctx.closeGroup();\n this.restoreStyle();\n this.setRendered();\n }\n}\nStaveNote.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Ron B. Yeh\n// MIT License\n//\n// Utilities for working with Web APIs.\n// See: https://developer.mozilla.org/en-US/docs/Web/API\nimport { globalObject } from './util';\n// eslint-disable-next-line\nexport function isHTMLCanvas(element) {\n if (!element)\n return false;\n const global = globalObject();\n return (\n // It's either an instance of the HTMLCanvasElement class,\n (typeof global.HTMLCanvasElement === 'function' && element instanceof global.HTMLCanvasElement) ||\n // OR it's pretending to be a element. Good enough!\n // Do not rely on .tagName, because node-canvas doesn't provide a tagName.\n (typeof element.getContext === 'function' && typeof element.toDataURL === 'function'));\n}\n// eslint-disable-next-line\nexport function isHTMLDiv(element) {\n if (!element)\n return false;\n const global = globalObject();\n return (\n // It's either an instance of the HTMLDivElement class.\n (typeof global.HTMLDivElement === 'function' && element instanceof global.HTMLDivElement) ||\n // OR it's pretending to be a
. See: svgcontext.ts.\n (typeof element.appendChild === 'function' && typeof element.style === 'object'));\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from './font';\nimport { RenderContext } from './rendercontext';\nimport { globalObject, warn } from './util';\nimport { isHTMLCanvas } from './web';\n/**\n * A rendering context for the Canvas backend. This class serves as a proxy for the\n * underlying CanvasRenderingContext2D object, part of the browser's API.\n */\nexport class CanvasContext extends RenderContext {\n constructor(context) {\n super();\n /** Height of one line of text (in pixels). */\n this.textHeight = 0;\n this.context2D = context;\n if (!context.canvas) {\n this.canvas = {\n width: CanvasContext.WIDTH,\n height: CanvasContext.HEIGHT,\n };\n }\n else {\n this.canvas = context.canvas;\n }\n }\n static get WIDTH() {\n return 600;\n }\n static get HEIGHT() {\n return 400;\n }\n static get CANVAS_BROWSER_SIZE_LIMIT() {\n return 32767; // Chrome/Firefox. Could be determined more precisely by npm module canvas-size.\n }\n /**\n * Ensure that width and height do not exceed the browser limit.\n * @returns array of [width, height] clamped to the browser limit.\n */\n static sanitizeCanvasDims(width, height) {\n const limit = this.CANVAS_BROWSER_SIZE_LIMIT;\n if (Math.max(width, height) > limit) {\n warn('Canvas dimensions exceed browser limit. Cropping to ' + limit);\n if (width > limit) {\n width = limit;\n }\n if (height > limit) {\n height = limit;\n }\n }\n return [width, height];\n }\n /**\n * Set all pixels to transparent black rgba(0,0,0,0).\n */\n clear() {\n this.context2D.clearRect(0, 0, this.canvas.width, this.canvas.height);\n }\n // eslint-disable-next-line\n openGroup(cls, id, attrs) {\n // Containers not implemented.\n }\n closeGroup() {\n // Containers not implemented.\n }\n // eslint-disable-next-line\n add(child) {\n // Containers not implemented.\n }\n setFillStyle(style) {\n this.context2D.fillStyle = style;\n return this;\n }\n /** CanvasContext ignores `setBackgroundFillStyle()`. */\n // eslint-disable-next-line\n setBackgroundFillStyle(style) {\n // DO NOTHING\n return this;\n }\n setStrokeStyle(style) {\n this.context2D.strokeStyle = style;\n return this;\n }\n setShadowColor(color) {\n this.context2D.shadowColor = color;\n return this;\n }\n setShadowBlur(blur) {\n // CanvasRenderingContext2D does not scale the shadow blur by the current\n // transform, so we have to do it manually. We assume uniform scaling\n // (though allow for rotation) because the blur can only be scaled\n // uniformly anyway.\n const t = this.context2D.getTransform();\n const scale = Math.sqrt(t.a * t.a + t.b * t.b + t.c * t.c + t.d * t.d);\n this.context2D.shadowBlur = scale * blur;\n return this;\n }\n setLineWidth(width) {\n this.context2D.lineWidth = width;\n return this;\n }\n setLineCap(capType) {\n this.context2D.lineCap = capType;\n return this;\n }\n setLineDash(dash) {\n this.context2D.setLineDash(dash);\n return this;\n }\n scale(x, y) {\n this.context2D.scale(x, y);\n return this;\n }\n resize(width, height) {\n const canvas = this.context2D.canvas;\n const devicePixelRatio = globalObject().devicePixelRatio || 1;\n // Scale the canvas size by the device pixel ratio clamping to the maximum supported size.\n [width, height] = CanvasContext.sanitizeCanvasDims(width * devicePixelRatio, height * devicePixelRatio);\n // Divide back down by the pixel ratio and convert to integers.\n width = (width / devicePixelRatio) | 0;\n height = (height / devicePixelRatio) | 0;\n canvas.width = width * devicePixelRatio;\n canvas.height = height * devicePixelRatio;\n // The canvas could be an instance of either HTMLCanvasElement or an OffscreenCanvas.\n // Only HTMLCanvasElement has a style attribute.\n if (isHTMLCanvas(canvas)) {\n canvas.style.width = width + 'px';\n canvas.style.height = height + 'px';\n }\n return this.scale(devicePixelRatio, devicePixelRatio);\n }\n rect(x, y, width, height) {\n this.context2D.rect(x, y, width, height);\n return this;\n }\n fillRect(x, y, width, height) {\n this.context2D.fillRect(x, y, width, height);\n return this;\n }\n /**\n * Set the pixels in a rectangular area to transparent black rgba(0,0,0,0).\n */\n clearRect(x, y, width, height) {\n this.context2D.clearRect(x, y, width, height);\n return this;\n }\n beginPath() {\n this.context2D.beginPath();\n return this;\n }\n moveTo(x, y) {\n this.context2D.moveTo(x, y);\n return this;\n }\n lineTo(x, y) {\n this.context2D.lineTo(x, y);\n return this;\n }\n bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) {\n this.context2D.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);\n return this;\n }\n quadraticCurveTo(cpx, cpy, x, y) {\n this.context2D.quadraticCurveTo(cpx, cpy, x, y);\n return this;\n }\n arc(x, y, radius, startAngle, endAngle, counterclockwise) {\n this.context2D.arc(x, y, radius, startAngle, endAngle, counterclockwise);\n return this;\n }\n fill() {\n this.context2D.fill();\n return this;\n }\n stroke() {\n this.context2D.stroke();\n return this;\n }\n closePath() {\n this.context2D.closePath();\n return this;\n }\n measureText(text) {\n const metrics = this.context2D.measureText(text);\n let y = 0;\n let height = 0;\n if (metrics.fontBoundingBoxAscent) {\n y = -metrics.fontBoundingBoxAscent;\n height = metrics.fontBoundingBoxDescent + metrics.fontBoundingBoxAscent;\n }\n else {\n y = -metrics.actualBoundingBoxAscent;\n height = metrics.actualBoundingBoxDescent + metrics.actualBoundingBoxAscent;\n }\n // Return x, y, width & height in the same manner as svg getBBox\n return {\n x: 0,\n y: y,\n width: metrics.width,\n height: height,\n };\n }\n fillText(text, x, y) {\n this.context2D.fillText(text, x, y);\n return this;\n }\n save() {\n this.context2D.save();\n return this;\n }\n restore() {\n this.context2D.restore();\n return this;\n }\n set fillStyle(style) {\n this.context2D.fillStyle = style;\n }\n get fillStyle() {\n return this.context2D.fillStyle;\n }\n set strokeStyle(style) {\n this.context2D.strokeStyle = style;\n }\n get strokeStyle() {\n return this.context2D.strokeStyle;\n }\n /**\n * @param f is 1) a `FontInfo` object or\n * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or\n * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided).\n * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt').\n * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900).\n * @param style is a string (e.g., 'italic', 'normal').\n */\n setFont(f, size, weight, style) {\n const fontInfo = Font.validate(f, size, weight, style);\n this.context2D.font = Font.toCSSString(fontInfo);\n this.textHeight = Font.convertSizeToPixelValue(fontInfo.size);\n return this;\n }\n /** Return a string of the form `'italic bold 15pt Arial'` */\n getFont() {\n return this.context2D.font;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// @author Gregory Ristow (2015)\nimport { Font, FontStyle, FontWeight } from './font';\nimport { RenderContext } from './rendercontext';\nimport { normalizeAngle, prefix, RuntimeError } from './util';\n/** For a particular element type (e.g., rect), we will not apply certain presentation attributes. */\nconst ATTRIBUTES_TO_IGNORE = {\n path: {\n x: true,\n y: true,\n width: true,\n height: true,\n 'font-family': true,\n 'font-weight': true,\n 'font-style': true,\n 'font-size': true,\n },\n rect: {\n 'font-family': true,\n 'font-weight': true,\n 'font-style': true,\n 'font-size': true,\n },\n text: {\n width: true,\n height: true,\n },\n};\n/** Create the SVG in the SVG namespace. */\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst TWO_PI = 2 * Math.PI;\nclass MeasureTextCache {\n constructor() {\n // The cache is keyed first by the text string, then by the font attributes\n // joined together.\n this.cache = {};\n }\n lookup(text, svg, attributes) {\n let entries = this.cache[text];\n if (entries === undefined) {\n entries = {};\n this.cache[text] = entries;\n }\n const family = attributes['font-family'];\n const size = attributes['font-size'];\n const weight = attributes['font-weight'];\n const style = attributes['font-style'];\n const key = `${family}%${size}%${weight}%${style}`;\n let entry = entries[key];\n if (entry === undefined) {\n entry = this.measureImpl(text, svg, attributes);\n entries[key] = entry;\n }\n return entry;\n }\n measureImpl(text, svg, attributes) {\n let txt = this.txt;\n if (!txt) {\n // Create the SVG text element that will be used to measure text in the event\n // of a cache miss.\n txt = document.createElementNS(SVG_NS, 'text');\n this.txt = txt;\n }\n txt.textContent = text;\n txt.setAttributeNS(null, 'font-family', attributes['font-family']);\n txt.setAttributeNS(null, 'font-size', attributes['font-size']);\n txt.setAttributeNS(null, 'font-style', attributes['font-style']);\n txt.setAttributeNS(null, 'font-weight', attributes['font-weight']);\n svg.appendChild(txt);\n const bbox = txt.getBBox();\n svg.removeChild(txt);\n return { x: bbox.x, y: bbox.y, width: bbox.width, height: bbox.height };\n }\n}\n/**\n * SVG rendering context with an API similar to CanvasRenderingContext2D.\n */\nexport class SVGContext extends RenderContext {\n constructor(element) {\n super();\n this.width = 0;\n this.height = 0;\n this.backgroundFillStyle = 'white';\n /** Formatted as CSS font shorthand (e.g., 'italic bold 12pt Arial') */\n this.fontCSSString = '';\n this.element = element;\n // Create a SVG element and add it to the container element.\n const svg = this.create('svg');\n this.element.appendChild(svg);\n this.svg = svg;\n this.parent = this.svg;\n this.groups = [this.svg];\n this.path = '';\n this.pen = { x: NaN, y: NaN };\n this.lineWidth = 1.0;\n const defaultFontAttributes = {\n 'font-family': Font.SANS_SERIF,\n 'font-size': Font.SIZE + 'pt',\n 'font-weight': FontWeight.NORMAL,\n 'font-style': FontStyle.NORMAL,\n };\n this.state = Object.assign({ scale: { x: 1, y: 1 } }, defaultFontAttributes);\n this.attributes = Object.assign({ 'stroke-width': 0.3, 'stroke-dasharray': 'none', fill: 'black', stroke: 'black' }, defaultFontAttributes);\n this.shadow_attributes = {\n width: 0,\n color: 'black',\n };\n this.state_stack = [];\n }\n create(svgElementType) {\n return document.createElementNS(SVG_NS, svgElementType);\n }\n // Allow grouping elements in containers for interactivity.\n openGroup(cls, id, attrs) {\n const group = this.create('g');\n this.groups.push(group);\n this.parent.appendChild(group);\n this.parent = group;\n if (cls)\n group.setAttribute('class', prefix(cls));\n if (id)\n group.setAttribute('id', prefix(id));\n if (attrs && attrs.pointerBBox) {\n group.setAttribute('pointer-events', 'bounding-box');\n }\n return group;\n }\n closeGroup() {\n this.groups.pop();\n this.parent = this.groups[this.groups.length - 1];\n }\n add(elem) {\n this.parent.appendChild(elem);\n }\n setFillStyle(style) {\n this.attributes.fill = style;\n return this;\n }\n /**\n * Used to set the fill color for `clearRect()`. This allows us to simulate\n * cutting a \"hole\" into the SVG drawing.\n */\n setBackgroundFillStyle(style) {\n this.backgroundFillStyle = style;\n return this;\n }\n setStrokeStyle(style) {\n this.attributes.stroke = style;\n return this;\n }\n setShadowColor(color) {\n this.shadow_attributes.color = color;\n return this;\n }\n /**\n * @param blur A non-negative float specifying the level of shadow blur, where 0\n * represents no blur and larger numbers represent increasingly more blur.\n * @returns this\n */\n setShadowBlur(blur) {\n this.shadow_attributes.width = blur;\n return this;\n }\n /**\n * @param width\n * @returns this\n */\n setLineWidth(width) {\n this.attributes['stroke-width'] = width;\n this.lineWidth = width;\n return this;\n }\n /**\n * @param lineDash an array of integers in the form of [dash, space, dash, space, etc...]\n * @returns this\n *\n * See: [SVG `stroke-dasharray` attribute](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray)\n */\n setLineDash(lineDash) {\n if (Object.prototype.toString.call(lineDash) === '[object Array]') {\n this.attributes['stroke-dasharray'] = lineDash.join(',');\n return this;\n }\n else {\n throw new RuntimeError('ArgumentError', 'lineDash must be an array of integers.');\n }\n }\n /**\n * @param capType\n * @returns this\n */\n setLineCap(capType) {\n this.attributes['stroke-linecap'] = capType;\n return this;\n }\n // ### Sizing & Scaling Methods:\n // TODO (GCR): See note at scale() -- separate our internal\n // conception of pixel-based width/height from the style.width\n // and style.height properties eventually to allow users to\n // apply responsive sizing attributes to the SVG.\n resize(width, height) {\n this.width = width;\n this.height = height;\n this.element.style.width = width.toString();\n this.svg.style.width = width.toString();\n this.svg.style.height = height.toString();\n const attributes = {\n width,\n height,\n };\n this.applyAttributes(this.svg, attributes);\n this.scale(this.state.scale.x, this.state.scale.y);\n return this;\n }\n scale(x, y) {\n // uses viewBox to scale\n // TODO (GCR): we may at some point want to distinguish the\n // style.width / style.height properties that are applied to\n // the SVG object from our internal conception of the SVG\n // width/height. This would allow us to create automatically\n // scaling SVG's that filled their containers, for instance.\n //\n // As this isn't implemented in Canvas contexts,\n // I've left as is for now, but in using the viewBox to\n // handle internal scaling, am trying to make it possible\n // for us to eventually move in that direction.\n this.state.scale = { x, y };\n const visibleWidth = this.width / x;\n const visibleHeight = this.height / y;\n this.setViewBox(0, 0, visibleWidth, visibleHeight);\n return this;\n }\n /**\n * 1 arg: string in the \"x y w h\" format\n * 4 args: x:number, y:number, w:number, h:number\n */\n setViewBox(viewBox_or_minX, minY, width, height) {\n if (typeof viewBox_or_minX === 'string') {\n this.svg.setAttribute('viewBox', viewBox_or_minX);\n }\n else {\n const viewBoxString = viewBox_or_minX + ' ' + minY + ' ' + width + ' ' + height;\n this.svg.setAttribute('viewBox', viewBoxString);\n }\n }\n // ### Drawing helper methods:\n applyAttributes(element, attributes) {\n const attrNamesToIgnore = ATTRIBUTES_TO_IGNORE[element.nodeName];\n for (const attrName in attributes) {\n if (attrNamesToIgnore && attrNamesToIgnore[attrName]) {\n continue;\n }\n element.setAttributeNS(null, attrName, attributes[attrName]);\n }\n return element;\n }\n // ### Shape & Path Methods:\n clear() {\n // Clear the SVG by removing all inner children.\n // (This approach is usually slightly more efficient\n // than removing the old SVG & adding a new one to\n // the container element, since it does not cause the\n // container to resize twice. Also, the resize\n // triggered by removing the entire SVG can trigger\n // a touchcancel event when the element resizes away\n // from a touch point.)\n while (this.svg.lastChild) {\n this.svg.removeChild(this.svg.lastChild);\n }\n // Replace the viewbox attribute we just removed.\n this.scale(this.state.scale.x, this.state.scale.y);\n }\n // ## Rectangles:\n rect(x, y, width, height, attributes) {\n // Avoid invalid negative height attributes by flipping the rectangle on its head:\n if (height < 0) {\n y += height;\n height *= -1;\n }\n const rectangle = this.create('rect');\n attributes = attributes !== null && attributes !== void 0 ? attributes : { fill: 'none', 'stroke-width': this.lineWidth, stroke: 'black' };\n this.applyAttributes(rectangle, Object.assign({ x, y, width, height }, attributes));\n this.add(rectangle);\n return this;\n }\n fillRect(x, y, width, height) {\n const attributes = { fill: this.attributes.fill };\n this.rect(x, y, width, height, attributes);\n return this;\n }\n clearRect(x, y, width, height) {\n // Currently this fills a rect with the backgroundFillStyle, rather\n // than \"cut a hole\" into the existing shapes.\n //\n // Since tabNote seems to be the only module that makes use of this\n // it may be worth creating a separate tabStave that would\n // draw lines around locations of tablature fingering.\n this.rect(x, y, width, height, { 'stroke-width': 0, fill: this.backgroundFillStyle });\n return this;\n }\n // ## Paths:\n beginPath() {\n this.path = '';\n this.pen.x = NaN;\n this.pen.y = NaN;\n return this;\n }\n moveTo(x, y) {\n this.path += 'M' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n lineTo(x, y) {\n this.path += 'L' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n bezierCurveTo(x1, y1, x2, y2, x, y) {\n this.path += 'C' + x1 + ' ' + y1 + ',' + x2 + ' ' + y2 + ',' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n quadraticCurveTo(x1, y1, x, y) {\n this.path += 'Q' + x1 + ' ' + y1 + ',' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n arc(x, y, radius, startAngle, endAngle, counterclockwise) {\n const x0 = x + radius * Math.cos(startAngle);\n const y0 = y + radius * Math.sin(startAngle);\n // Handle the edge case where arc length is greater than or equal to\n // the circle's circumference:\n // https://html.spec.whatwg.org/multipage/canvas.html#ellipse-method-steps\n if ((!counterclockwise && endAngle - startAngle >= TWO_PI) ||\n (counterclockwise && startAngle - endAngle >= TWO_PI)) {\n const x1 = x + radius * Math.cos(startAngle + Math.PI);\n const y1 = y + radius * Math.sin(startAngle + Math.PI);\n // There's no way to specify a completely circular arc in SVG so we have to\n // use two semi-circular arcs.\n this.path += `M${x0} ${y0} A${radius} ${radius} 0 0 0 ${x1} ${y1} `;\n this.path += `A${radius} ${radius} 0 0 0 ${x0} ${y0}`;\n this.pen.x = x0;\n this.pen.y = y0;\n }\n else {\n const x1 = x + radius * Math.cos(endAngle);\n const y1 = y + radius * Math.sin(endAngle);\n startAngle = normalizeAngle(startAngle);\n endAngle = normalizeAngle(endAngle);\n let large;\n if (Math.abs(endAngle - startAngle) < Math.PI) {\n large = counterclockwise;\n }\n else {\n large = !counterclockwise;\n }\n if (startAngle > endAngle) {\n large = !large;\n }\n const sweep = !counterclockwise;\n this.path += `M${x0} ${y0} A${radius} ${radius} 0 ${+large} ${+sweep} ${x1} ${y1}`;\n this.pen.x = x1;\n this.pen.y = y1;\n }\n return this;\n }\n closePath() {\n this.path += 'Z';\n return this;\n }\n getShadowStyle() {\n const sa = this.shadow_attributes;\n // A CSS drop-shadow filter blur looks different than a canvas shadowBlur\n // of the same radius, so we scale the drop-shadow radius here to make it\n // look close to the canvas shadow.\n return `filter: drop-shadow(0 0 ${sa.width / 1.5}px ${sa.color})`;\n }\n fill(attributes) {\n const path = this.create('path');\n if (typeof attributes === 'undefined') {\n attributes = Object.assign(Object.assign({}, this.attributes), { stroke: 'none' });\n }\n attributes.d = this.path;\n if (this.shadow_attributes.width > 0) {\n attributes.style = this.getShadowStyle();\n }\n this.applyAttributes(path, attributes);\n this.add(path);\n return this;\n }\n stroke() {\n const path = this.create('path');\n const attributes = Object.assign(Object.assign({}, this.attributes), { fill: 'none', 'stroke-width': this.lineWidth, d: this.path });\n if (this.shadow_attributes.width > 0) {\n attributes.style = this.getShadowStyle();\n }\n this.applyAttributes(path, attributes);\n this.add(path);\n return this;\n }\n // ## Text Methods:\n measureText(text) {\n return SVGContext.measureTextCache.lookup(text, this.svg, this.attributes);\n }\n fillText(text, x, y) {\n if (!text || text.length <= 0) {\n return this;\n }\n const attributes = Object.assign(Object.assign({}, this.attributes), { stroke: 'none', x,\n y });\n const txt = this.create('text');\n txt.textContent = text;\n this.applyAttributes(txt, attributes);\n this.add(txt);\n return this;\n }\n // TODO: State should be deep-copied.\n save() {\n this.state_stack.push({\n state: {\n 'font-family': this.state['font-family'],\n 'font-weight': this.state['font-weight'],\n 'font-style': this.state['font-style'],\n 'font-size': this.state['font-size'],\n scale: this.state.scale,\n },\n attributes: {\n 'font-family': this.attributes['font-family'],\n 'font-weight': this.attributes['font-weight'],\n 'font-style': this.attributes['font-style'],\n 'font-size': this.attributes['font-size'],\n fill: this.attributes.fill,\n stroke: this.attributes.stroke,\n 'stroke-width': this.attributes['stroke-width'],\n 'stroke-dasharray': this.attributes['stroke-dasharray'],\n },\n shadow_attributes: {\n width: this.shadow_attributes.width,\n color: this.shadow_attributes.color,\n },\n lineWidth: this.lineWidth,\n });\n return this;\n }\n // TODO: State should be deep-restored.\n restore() {\n const savedState = this.state_stack.pop();\n if (savedState) {\n const state = savedState;\n this.state['font-family'] = state.state['font-family'];\n this.state['font-weight'] = state.state['font-weight'];\n this.state['font-style'] = state.state['font-style'];\n this.state['font-size'] = state.state['font-size'];\n this.state.scale = state.state.scale;\n this.attributes['font-family'] = state.attributes['font-family'];\n this.attributes['font-weight'] = state.attributes['font-weight'];\n this.attributes['font-style'] = state.attributes['font-style'];\n this.attributes['font-size'] = state.attributes['font-size'];\n this.attributes.fill = state.attributes.fill;\n this.attributes.stroke = state.attributes.stroke;\n this.attributes['stroke-width'] = state.attributes['stroke-width'];\n this.attributes['stroke-dasharray'] = state.attributes['stroke-dasharray'];\n this.shadow_attributes.width = state.shadow_attributes.width;\n this.shadow_attributes.color = state.shadow_attributes.color;\n this.lineWidth = state.lineWidth;\n }\n return this;\n }\n set fillStyle(style) {\n this.setFillStyle(style);\n }\n get fillStyle() {\n return this.attributes.fill;\n }\n set strokeStyle(style) {\n this.setStrokeStyle(style);\n }\n get strokeStyle() {\n return this.attributes.stroke;\n }\n /**\n * @param f is 1) a `FontInfo` object or\n * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or\n * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided).\n * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt').\n * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900). It is inserted\n * into the font-weight attribute (e.g., font-weight=\"bold\")\n * @param style is a string (e.g., 'italic', 'normal') that is inserted into the\n * font-style attribute (e.g., font-style=\"italic\")\n */\n setFont(f, size, weight, style) {\n const fontInfo = Font.validate(f, size, weight, style);\n this.fontCSSString = Font.toCSSString(fontInfo);\n const fontAttributes = {\n 'font-family': fontInfo.family,\n 'font-size': fontInfo.size,\n 'font-weight': fontInfo.weight,\n 'font-style': fontInfo.style,\n };\n this.attributes = Object.assign(Object.assign({}, this.attributes), fontAttributes);\n this.state = Object.assign(Object.assign({}, this.state), fontAttributes);\n return this;\n }\n /** Return a string of the form `'italic bold 15pt Arial'` */\n getFont() {\n return this.fontCSSString;\n }\n}\nSVGContext.measureTextCache = new MeasureTextCache();\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { CanvasContext } from './canvascontext';\nimport { SVGContext } from './svgcontext';\nimport { isRenderContext } from './typeguard';\nimport { RuntimeError } from './util';\nimport { isHTMLCanvas, isHTMLDiv } from './web';\nexport var RendererBackends;\n(function (RendererBackends) {\n RendererBackends[RendererBackends[\"CANVAS\"] = 1] = \"CANVAS\";\n RendererBackends[RendererBackends[\"SVG\"] = 2] = \"SVG\";\n})(RendererBackends || (RendererBackends = {}));\n// End of line types\nexport var RendererLineEndType;\n(function (RendererLineEndType) {\n RendererLineEndType[RendererLineEndType[\"NONE\"] = 1] = \"NONE\";\n RendererLineEndType[RendererLineEndType[\"UP\"] = 2] = \"UP\";\n RendererLineEndType[RendererLineEndType[\"DOWN\"] = 3] = \"DOWN\";\n})(RendererLineEndType || (RendererLineEndType = {}));\n/**\n * Support Canvas & SVG rendering contexts.\n */\nexport class Renderer {\n constructor(arg0, arg1) {\n if (isRenderContext(arg0)) {\n // The user has provided what looks like a RenderContext, let's just use it.\n this.ctx = arg0;\n }\n else {\n if (arg1 === undefined) {\n // The backend must be specified if the render context isn't directly provided.\n throw new RuntimeError('InvalidArgument', 'Missing backend argument');\n }\n const backend = arg1;\n let element;\n if (typeof arg0 == 'string') {\n const maybeElement = document.getElementById(arg0);\n if (!maybeElement) {\n throw new RuntimeError('BadElementId', `Can't find element with ID \"${maybeElement}\"`);\n }\n element = maybeElement;\n }\n else {\n element = arg0;\n }\n // Verify backend and create context\n if (backend === Renderer.Backends.CANVAS) {\n if (!isHTMLCanvas(element)) {\n throw new RuntimeError('BadElement', 'CANVAS context requires an HTMLCanvasElement.');\n }\n const context = element.getContext('2d');\n if (!context) {\n throw new RuntimeError('BadElement', \"Can't get canvas context\");\n }\n this.ctx = new CanvasContext(context);\n }\n else if (backend === Renderer.Backends.SVG) {\n if (!isHTMLDiv(element)) {\n throw new RuntimeError('BadElement', 'SVG context requires an HTMLDivElement.');\n }\n this.ctx = new SVGContext(element);\n }\n else {\n throw new RuntimeError('InvalidBackend', `No support for backend: ${backend}`);\n }\n }\n }\n static buildContext(elementId, backend, width, height, background = '#FFF') {\n const renderer = new Renderer(elementId, backend);\n if (width && height) {\n renderer.resize(width, height);\n }\n const ctx = renderer.getContext();\n ctx.setBackgroundFillStyle(background);\n Renderer.lastContext = ctx;\n return ctx;\n }\n static getCanvasContext(elementId, width, height, background) {\n return Renderer.buildContext(elementId, Renderer.Backends.CANVAS, width, height, background);\n }\n static getSVGContext(elementId, width, height, background) {\n return Renderer.buildContext(elementId, Renderer.Backends.SVG, width, height, background);\n }\n // Draw a dashed line (horizontal, vertical or diagonal\n // dashPattern = [3,3] draws a 3 pixel dash followed by a three pixel space.\n // setting the second number to 0 draws a solid line.\n static drawDashedLine(context, fromX, fromY, toX, toY, dashPattern) {\n context.beginPath();\n const dx = toX - fromX;\n const dy = toY - fromY;\n const angle = Math.atan2(dy, dx);\n let x = fromX;\n let y = fromY;\n context.moveTo(fromX, fromY);\n let idx = 0;\n let draw = true;\n while (!((dx < 0 ? x <= toX : x >= toX) && (dy < 0 ? y <= toY : y >= toY))) {\n const dashLength = dashPattern[idx++ % dashPattern.length];\n const nx = x + Math.cos(angle) * dashLength;\n x = dx < 0 ? Math.max(toX, nx) : Math.min(toX, nx);\n const ny = y + Math.sin(angle) * dashLength;\n y = dy < 0 ? Math.max(toY, ny) : Math.min(toY, ny);\n if (draw) {\n context.lineTo(x, y);\n }\n else {\n context.moveTo(x, y);\n }\n draw = !draw;\n }\n context.closePath();\n context.stroke();\n }\n resize(width, height) {\n this.ctx.resize(width, height);\n return this;\n }\n getContext() {\n return this.ctx;\n }\n}\nRenderer.Backends = RendererBackends;\nRenderer.LineEndType = RendererLineEndType;\n// Used by vexflow_test_helpers.ts\n// Should this be private?\n// Can we do this in a cleaner way?\nRenderer.lastContext = undefined;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport var Justification;\n(function (Justification) {\n Justification[Justification[\"LEFT\"] = 1] = \"LEFT\";\n Justification[Justification[\"CENTER\"] = 2] = \"CENTER\";\n Justification[Justification[\"RIGHT\"] = 3] = \"RIGHT\";\n})(Justification || (Justification = {}));\n/**\n * `TextNote` is a notation element that is positioned in time. Generally\n * meant for objects that sit above/below the staff and inline with each other.\n * `TextNote` has to be assigned to a `Stave` before rendering by means of `setStave`.\n * Examples of this would be such as dynamics, lyrics, chord changes, etc.\n */\nexport class TextNote extends Note {\n constructor(noteStruct) {\n super(noteStruct);\n this.text = noteStruct.text || '';\n this.superscript = noteStruct.superscript;\n this.subscript = noteStruct.subscript;\n this.setFont(noteStruct.font);\n this.line = noteStruct.line || 0;\n this.smooth = noteStruct.smooth || false;\n this.ignore_ticks = noteStruct.ignore_ticks || false;\n this.justification = Justification.LEFT;\n // Determine and set initial note width. Note that the text width is\n // an approximation and isn't very accurate. The only way to accurately\n // measure the length of text is with `CanvasRenderingContext2D.measureText()`.\n if (noteStruct.glyph) {\n const struct = TextNote.GLYPHS[noteStruct.glyph];\n if (!struct)\n throw new RuntimeError('Invalid glyph type: ' + noteStruct.glyph);\n this.glyph = new Glyph(struct.code, 40, { category: 'textNote' });\n this.setWidth(this.glyph.getMetrics().width);\n }\n else {\n this.glyph = undefined;\n }\n }\n static get CATEGORY() {\n return Category.TextNote;\n }\n static get Justification() {\n return Justification;\n }\n /** Glyph data. */\n static get GLYPHS() {\n return {\n segno: {\n code: 'segno',\n },\n tr: {\n code: 'ornamentTrill',\n },\n mordent: {\n code: 'ornamentMordent',\n },\n mordent_upper: {\n code: 'ornamentShortTrill',\n },\n mordent_lower: {\n code: 'ornamentMordent',\n },\n f: {\n code: 'dynamicForte',\n },\n p: {\n code: 'dynamicPiano',\n },\n m: {\n code: 'dynamicMezzo',\n },\n s: {\n code: 'dynamicSforzando',\n },\n z: {\n code: 'dynamicZ',\n },\n coda: {\n code: 'coda',\n },\n pedal_open: {\n code: 'keyboardPedalPed',\n },\n pedal_close: {\n code: 'keyboardPedalUp',\n },\n caesura_straight: {\n code: 'caesura',\n },\n caesura_curved: {\n code: 'caesuraCurved',\n },\n breath: {\n code: 'breathMarkComma',\n },\n tick: {\n code: 'breathMarkTick',\n },\n turn: {\n code: 'ornamentTurn',\n },\n turn_inverted: {\n code: 'ornamentTurnSlash',\n },\n };\n }\n /** Set the horizontal justification of the TextNote. */\n setJustification(just) {\n this.justification = just;\n return this;\n }\n /** Set the Stave line on which the note should be placed. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Pre-render formatting. */\n preFormat() {\n if (this.preFormatted)\n return;\n const tickContext = this.checkTickContext(`Can't preformat without a TickContext.`);\n if (this.smooth) {\n this.setWidth(0);\n }\n else {\n if (this.glyph) {\n // Width already set.\n }\n else {\n const ctx = this.checkContext();\n ctx.setFont(this.textFont);\n this.setWidth(ctx.measureText(this.text).width);\n }\n }\n if (this.justification === Justification.CENTER) {\n this.leftDisplacedHeadPx = this.width / 2;\n }\n else if (this.justification === Justification.RIGHT) {\n this.leftDisplacedHeadPx = this.width;\n }\n // We reposition to the center of the note head\n this.rightDisplacedHeadPx = tickContext.getMetrics().glyphPx / 2;\n this.preFormatted = true;\n }\n /**\n * Renders the TextNote.\n * `TextNote` has to be assigned to a `Stave` before rendering by means of `setStave`.\n */\n draw() {\n const ctx = this.checkContext();\n const stave = this.checkStave();\n const tickContext = this.checkTickContext(`Can't draw without a TickContext.`);\n this.setRendered();\n // Reposition to center of note head\n let x = this.getAbsoluteX() + tickContext.getMetrics().glyphPx / 2;\n // Align based on tick-context width.\n const width = this.getWidth();\n if (this.justification === Justification.CENTER) {\n x -= width / 2;\n }\n else if (this.justification === Justification.RIGHT) {\n x -= width;\n }\n let y;\n if (this.glyph) {\n y = stave.getYForLine(this.line + -3);\n this.glyph.render(ctx, x, y);\n }\n else {\n y = stave.getYForLine(this.line + -3);\n this.applyStyle(ctx);\n ctx.setFont(this.textFont);\n ctx.fillText(this.text, x, y);\n const height = ctx.measureText(this.text).height;\n // We called this.setFont(...) in the constructor, so we know this.textFont is available.\n // eslint-disable-next-line\n const { family, size, weight, style } = this.textFont;\n // Scale the font size by 1/1.3.\n const smallerFontSize = Font.scaleSize(size, 0.769231);\n if (this.superscript) {\n ctx.setFont(family, smallerFontSize, weight, style);\n ctx.fillText(this.superscript, x + this.width + 2, y - height / 2.2);\n }\n if (this.subscript) {\n ctx.setFont(family, smallerFontSize, weight, style);\n ctx.fillText(this.subscript, x + this.width + 2, y + height / 2.2 - 1);\n }\n this.restoreStyle(ctx);\n }\n }\n}\nTextNote.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 12,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Larry Kuhns 2011\nimport { Font, FontStyle, FontWeight } from './font';\nimport { StaveModifier } from './stavemodifier';\nimport { Category } from './typeguard';\nexport var VoltaType;\n(function (VoltaType) {\n VoltaType[VoltaType[\"NONE\"] = 1] = \"NONE\";\n VoltaType[VoltaType[\"BEGIN\"] = 2] = \"BEGIN\";\n VoltaType[VoltaType[\"MID\"] = 3] = \"MID\";\n VoltaType[VoltaType[\"END\"] = 4] = \"END\";\n VoltaType[VoltaType[\"BEGIN_END\"] = 5] = \"BEGIN_END\";\n})(VoltaType || (VoltaType = {}));\nexport class Volta extends StaveModifier {\n constructor(type, number, x, y_shift) {\n super();\n this.volta = type;\n this.x = x;\n this.y_shift = y_shift;\n this.number = number;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.Volta;\n }\n static get type() {\n return VoltaType;\n }\n setShiftY(y) {\n this.y_shift = y;\n return this;\n }\n draw(stave, x) {\n const ctx = stave.checkContext();\n this.setRendered();\n let width = stave.getWidth() - x; // don't include x (offset) for width\n const top_y = stave.getYForTopText(stave.getNumLines()) + this.y_shift;\n const vert_height = 1.5 * stave.getSpacingBetweenLines();\n switch (this.volta) {\n case VoltaType.BEGIN:\n ctx.fillRect(this.x + x, top_y, 1, vert_height);\n break;\n case VoltaType.END:\n width -= 5;\n ctx.fillRect(this.x + x + width, top_y, 1, vert_height);\n break;\n case VoltaType.BEGIN_END:\n width -= 3;\n ctx.fillRect(this.x + x, top_y, 1, vert_height);\n ctx.fillRect(this.x + x + width, top_y, 1, vert_height);\n break;\n default:\n break;\n }\n // If the beginning of a volta, draw measure number\n if (this.volta === VoltaType.BEGIN || this.volta === VoltaType.BEGIN_END) {\n ctx.save();\n ctx.setFont(this.textFont);\n ctx.fillText(this.number, this.x + x + 5, top_y + 15);\n ctx.restore();\n }\n ctx.fillRect(this.x + x, top_y, width, 1);\n return this;\n }\n}\nVolta.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 9,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Larry Kuhns\n//\n// This file implements the `StringNumber` class which renders string\n// number annotations beside notes.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { Renderer } from './renderer';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category, isStaveNote, isStemmableNote } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StringNumber extends Modifier {\n constructor(number) {\n super();\n this.string_number = number;\n this.setWidth(20); // ???\n this.position = Modifier.Position.ABOVE; // Default position above stem or note head\n this.x_shift = 0;\n this.y_shift = 0;\n this.text_line = 0;\n this.stem_offset = 0;\n this.x_offset = 0; // Horizontal offset from default\n this.y_offset = 0; // Vertical offset from default\n this.dashed = true; // true - draw dashed extension false - no extension\n this.leg = Renderer.LineEndType.NONE; // draw upward/downward leg at the of extension line\n this.radius = 8;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StringNumber;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static get metrics() {\n return Tables.currentMusicFont().getMetrics().glyphs.stringNumber;\n }\n // ## Static Methods\n // Arrange string numbers inside a `ModifierContext`\n static format(nums, state) {\n const left_shift = state.left_shift;\n const right_shift = state.right_shift;\n const num_spacing = 1;\n if (!nums || nums.length === 0)\n return false;\n const nums_list = [];\n let prev_note = null;\n let shift_left = 0;\n let shift_right = 0;\n const modLines = 0;\n for (let i = 0; i < nums.length; ++i) {\n const num = nums[i];\n const note = num.getNote();\n const pos = num.getPosition();\n if (!isStaveNote(note)) {\n throw new RuntimeError('NoStaveNote');\n }\n const index = num.checkIndex();\n const props = note.getKeyProps()[index];\n const mc = note.getModifierContext();\n const verticalSpaceNeeded = (num.radius * 2) / Tables.STAVE_LINE_DISTANCE + 0.5;\n if (mc) {\n if (pos === ModifierPosition.ABOVE) {\n num.text_line = mc.getState().top_text_line;\n state.top_text_line += verticalSpaceNeeded;\n }\n else if (pos === ModifierPosition.BELOW) {\n num.text_line = mc.getState().text_line;\n state.text_line += verticalSpaceNeeded;\n }\n }\n if (note !== prev_note) {\n for (let n = 0; n < note.keys.length; ++n) {\n if (left_shift === 0) {\n shift_left = Math.max(note.getLeftDisplacedHeadPx(), shift_left);\n }\n if (right_shift === 0) {\n shift_right = Math.max(note.getRightDisplacedHeadPx(), shift_right);\n }\n }\n prev_note = note;\n }\n const glyphLine = modLines === 0 ? props.line : modLines;\n nums_list.push({\n pos,\n note,\n num,\n line: glyphLine,\n shiftL: shift_left,\n shiftR: shift_right,\n });\n }\n // Sort string numbers by line number.\n nums_list.sort((a, b) => b.line - a.line);\n let num_shiftR = 0;\n let x_widthL = 0;\n let x_widthR = 0;\n let last_line = null;\n let last_note = null;\n for (let i = 0; i < nums_list.length; ++i) {\n let num_shift = 0;\n const note = nums_list[i].note;\n const pos = nums_list[i].pos;\n const num = nums_list[i].num;\n const line = nums_list[i].line;\n const shiftR = nums_list[i].shiftR;\n // Reset the position of the string number every line.\n if (line !== last_line || note !== last_note) {\n num_shiftR = right_shift + shiftR;\n }\n const num_width = num.getWidth() + num_spacing;\n if (pos === Modifier.Position.LEFT) {\n num.setXShift(left_shift);\n num_shift = shift_left + num_width; // spacing\n x_widthL = num_shift > x_widthL ? num_shift : x_widthL;\n }\n else if (pos === Modifier.Position.RIGHT) {\n num.setXShift(num_shiftR);\n num_shift += num_width; // spacing\n x_widthR = num_shift > x_widthR ? num_shift : x_widthR;\n }\n last_line = line;\n last_note = note;\n }\n state.left_shift += x_widthL;\n state.right_shift += x_widthR;\n return true;\n }\n setLineEndType(leg) {\n if (leg >= Renderer.LineEndType.NONE && leg <= Renderer.LineEndType.DOWN) {\n this.leg = leg;\n }\n return this;\n }\n setStringNumber(number) {\n this.string_number = number;\n return this;\n }\n setOffsetX(x) {\n this.x_offset = x;\n return this;\n }\n setOffsetY(y) {\n this.y_offset = y;\n return this;\n }\n setLastNote(note) {\n this.last_note = note;\n return this;\n }\n setDashed(dashed) {\n this.dashed = dashed;\n return this;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(this.position, this.index);\n const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP;\n let dot_x = start.x + this.x_shift + this.x_offset;\n let stem_ext = {};\n if (note.hasStem()) {\n stem_ext = note.checkStem().getExtents();\n }\n let dot_y = start.y + this.y_shift + this.y_offset;\n switch (this.position) {\n case Modifier.Position.ABOVE:\n {\n const ys = note.getYs();\n dot_y = ys.reduce((a, b) => (a < b ? a : b));\n if (note.hasStem() && stemDirection == Stem.UP) {\n dot_y = stem_ext.topY + StringNumber.metrics.stemPadding;\n }\n dot_y -= this.radius + StringNumber.metrics.verticalPadding + this.text_line * Tables.STAVE_LINE_DISTANCE;\n }\n break;\n case Modifier.Position.BELOW:\n {\n const ys = note.getYs();\n dot_y = ys.reduce((a, b) => (a > b ? a : b));\n if (note.hasStem() && stemDirection == Stem.DOWN) {\n dot_y = stem_ext.topY - StringNumber.metrics.stemPadding;\n }\n dot_y += this.radius + StringNumber.metrics.verticalPadding + this.text_line * Tables.STAVE_LINE_DISTANCE;\n }\n break;\n case Modifier.Position.LEFT:\n dot_x -= this.radius / 2 + StringNumber.metrics.leftPadding;\n break;\n case Modifier.Position.RIGHT:\n dot_x += this.radius / 2 + StringNumber.metrics.rightPadding;\n break;\n default:\n throw new RuntimeError('InvalidPosition', `The position ${this.position} is invalid`);\n }\n ctx.save();\n ctx.beginPath();\n ctx.arc(dot_x, dot_y, this.radius, 0, Math.PI * 2, false);\n ctx.setLineWidth(1.5);\n ctx.stroke();\n ctx.setFont(this.textFont);\n const x = dot_x - ctx.measureText(this.string_number).width / 2;\n ctx.fillText('' + this.string_number, x, dot_y + 4.5);\n const lastNote = this.last_note;\n if (isStemmableNote(lastNote)) {\n // Only StemmableNote objects have getStemX().\n const end = lastNote.getStemX() - note.getX() + 5;\n ctx.setStrokeStyle('#000000');\n ctx.setLineCap('round');\n ctx.setLineWidth(0.6);\n if (this.dashed) {\n Renderer.drawDashedLine(ctx, dot_x + 10, dot_y, dot_x + end, dot_y, [3, 3]);\n }\n else {\n Renderer.drawDashedLine(ctx, dot_x + 10, dot_y, dot_x + end, dot_y, [3, 0]);\n }\n let len;\n let pattern;\n switch (this.leg) {\n case Renderer.LineEndType.UP:\n len = -10;\n pattern = this.dashed ? [3, 3] : [3, 0];\n Renderer.drawDashedLine(ctx, dot_x + end, dot_y, dot_x + end, dot_y + len, pattern);\n break;\n case Renderer.LineEndType.DOWN:\n len = 10;\n pattern = this.dashed ? [3, 3] : [3, 0];\n Renderer.drawDashedLine(ctx, dot_x + end, dot_y, dot_x + end, dot_y + len, pattern);\n break;\n default:\n break;\n }\n }\n ctx.restore();\n }\n}\nStringNumber.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: Font.SIZE,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Larry Kuhns\n//\n// This file implements the `Stroke` class which renders chord strokes\n// that can be arpeggiated, brushed, rasquedo, etc.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Category, isNote, isStaveNote, isTabNote } from './typeguard';\nimport { RuntimeError } from './util';\nexport class Stroke extends Modifier {\n constructor(type, options) {\n super();\n this.options = Object.assign({ all_voices: true }, options);\n // multi voice - span stroke across all voices if true\n this.all_voices = this.options.all_voices;\n // multi voice - end note of stroke, set in draw()\n this.type = type;\n this.position = Modifier.Position.LEFT;\n this.render_options = {\n font_scale: 38,\n };\n this.resetFont();\n this.setXShift(0);\n this.setWidth(10);\n }\n static get CATEGORY() {\n return Category.Stroke;\n }\n // Arrange strokes inside `ModifierContext`\n static format(strokes, state) {\n const left_shift = state.left_shift;\n const stroke_spacing = 0;\n if (!strokes || strokes.length === 0)\n return false;\n const strokeList = strokes.map((stroke) => {\n const note = stroke.getNote();\n const index = stroke.checkIndex();\n if (isStaveNote(note)) {\n // Only StaveNote objects have getKeyProps().\n const { line } = note.getKeyProps()[index];\n const shift = note.getLeftDisplacedHeadPx();\n return { line, shift, stroke };\n }\n else if (isTabNote(note)) {\n // Only TabNote objects have getPositions().\n const { str: string } = note.getPositions()[index];\n return { line: string, shift: 0, stroke };\n }\n else {\n throw new RuntimeError('Internal', 'Unexpected instance.');\n }\n });\n const strokeShift = left_shift;\n // There can only be one stroke .. if more than one, they overlay each other\n const xShift = strokeList.reduce((xShift, { stroke, shift }) => {\n stroke.setXShift(strokeShift + shift);\n return Math.max(stroke.getWidth() + stroke_spacing, xShift);\n }, 0);\n state.left_shift += xShift;\n return true;\n }\n getPosition() {\n return this.position;\n }\n addEndNote(note) {\n this.note_end = note;\n return this;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(this.position, this.index);\n let ys = note.getYs();\n let topY = start.y;\n let botY = start.y;\n const x = start.x - 5;\n const line_space = note.checkStave().getSpacingBetweenLines();\n const notes = this.checkModifierContext().getMembers(note.getCategory());\n for (let i = 0; i < notes.length; i++) {\n const note = notes[i];\n if (isNote(note)) {\n // Only Note objects have getYs().\n // note is an instance of either StaveNote or TabNote.\n ys = note.getYs();\n for (let n = 0; n < ys.length; n++) {\n if (this.note === notes[i] || this.all_voices) {\n topY = Math.min(topY, ys[n]);\n botY = Math.max(botY, ys[n]);\n }\n }\n }\n }\n let arrow = '';\n let arrow_shift_x = 0;\n let arrow_y = 0;\n let text_shift_x = 0;\n let text_y = 0;\n switch (this.type) {\n case Stroke.Type.BRUSH_DOWN:\n arrow = 'arrowheadBlackUp';\n arrow_shift_x = -3;\n arrow_y = topY - line_space / 2 + 10;\n botY += line_space / 2;\n break;\n case Stroke.Type.BRUSH_UP:\n arrow = 'arrowheadBlackDown';\n arrow_shift_x = 0.5;\n arrow_y = botY + line_space / 2;\n topY -= line_space / 2;\n break;\n case Stroke.Type.ROLL_DOWN:\n case Stroke.Type.RASQUEDO_DOWN:\n arrow = 'arrowheadBlackUp';\n arrow_shift_x = -3;\n text_shift_x = this.x_shift + arrow_shift_x - 2;\n if (isStaveNote(note)) {\n topY += 1.5 * line_space;\n if ((botY - topY) % 2 !== 0) {\n botY += 0.5 * line_space;\n }\n else {\n botY += line_space;\n }\n arrow_y = topY - line_space;\n text_y = botY + line_space + 2;\n }\n else {\n topY += 1.5 * line_space;\n botY += line_space;\n arrow_y = topY - 0.75 * line_space;\n text_y = botY + 0.25 * line_space;\n }\n break;\n case Stroke.Type.ROLL_UP:\n case Stroke.Type.RASQUEDO_UP:\n arrow = 'arrowheadBlackDown';\n arrow_shift_x = -4;\n text_shift_x = this.x_shift + arrow_shift_x - 1;\n if (isStaveNote(note)) {\n arrow_y = line_space / 2;\n topY += 0.5 * line_space;\n if ((botY - topY) % 2 === 0) {\n botY += line_space / 2;\n }\n arrow_y = botY + 0.5 * line_space;\n text_y = topY - 1.25 * line_space;\n }\n else {\n topY += 0.25 * line_space;\n botY += 0.5 * line_space;\n arrow_y = botY + 0.25 * line_space;\n text_y = topY - line_space;\n }\n break;\n case Stroke.Type.ARPEGGIO_DIRECTIONLESS:\n topY += 0.5 * line_space;\n botY += line_space; // * 0.5 can lead to slight underlap instead of overlap sometimes\n break;\n default:\n throw new RuntimeError('InvalidType', `The stroke type ${this.type} does not exist`);\n }\n let strokeLine = 'straight';\n // Draw the stroke\n if (this.type === Stroke.Type.BRUSH_DOWN || this.type === Stroke.Type.BRUSH_UP) {\n ctx.fillRect(x + this.x_shift, topY, 1, botY - topY);\n }\n else {\n strokeLine = 'wiggly';\n if (isStaveNote(note)) {\n for (let i = topY; i <= botY; i += line_space) {\n Glyph.renderGlyph(ctx, x + this.x_shift - 4, i, this.render_options.font_scale, 'vexWiggleArpeggioUp');\n }\n }\n else {\n let i;\n for (i = topY; i <= botY; i += 10) {\n Glyph.renderGlyph(ctx, x + this.x_shift - 4, i, this.render_options.font_scale, 'vexWiggleArpeggioUp');\n }\n if (this.type === Stroke.Type.RASQUEDO_DOWN) {\n text_y = i + 0.25 * line_space;\n }\n }\n }\n if (this.type === Stroke.Type.ARPEGGIO_DIRECTIONLESS) {\n return; // skip drawing arrow heads or text\n }\n // Draw the arrow head\n Glyph.renderGlyph(ctx, x + this.x_shift + arrow_shift_x, arrow_y, this.render_options.font_scale, arrow, {\n category: `stroke.${arrow}.${strokeLine}`,\n });\n // Draw the rasquedo \"R\"\n if (this.type === Stroke.Type.RASQUEDO_DOWN || this.type === Stroke.Type.RASQUEDO_UP) {\n ctx.save();\n ctx.setFont(this.textFont);\n ctx.fillText('R', x + text_shift_x, text_y);\n ctx.restore();\n }\n }\n}\nStroke.Type = {\n BRUSH_DOWN: 1,\n BRUSH_UP: 2,\n ROLL_DOWN: 3,\n ROLL_UP: 4,\n RASQUEDO_DOWN: 5,\n RASQUEDO_UP: 6,\n ARPEGGIO_DIRECTIONLESS: 7, // Arpeggiated chord without upwards or downwards arrow\n};\nStroke.TEXT_FONT = {\n family: Font.SERIF,\n size: Font.SIZE,\n weight: FontWeight.BOLD,\n style: FontStyle.ITALIC,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Bend } from './bend';\nimport { Modifier } from './modifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\n/** `Vibrato` implements diverse vibratos. */\nexport class Vibrato extends Modifier {\n constructor() {\n super();\n this.position = Modifier.Position.RIGHT;\n this.render_options = {\n harsh: false,\n vibrato_width: 20,\n wave_height: 6,\n wave_width: 4,\n wave_girth: 2,\n };\n this.setVibratoWidth(this.render_options.vibrato_width);\n }\n static get CATEGORY() {\n return Category.Vibrato;\n }\n /** Arrange vibratos inside a `ModifierContext`. */\n static format(vibratos, state, context) {\n if (!vibratos || vibratos.length === 0)\n return false;\n // Vibratos are always on top.\n let text_line = state.top_text_line;\n let width = 0;\n let shift = state.right_shift - 7;\n // If there's a bend, drop the text line\n const bends = context.getMembers(Bend.CATEGORY);\n if (bends && bends.length > 0) {\n const bendHeight = bends.map((bb) => bb.getTextHeight()).reduce((a, b) => (a > b ? a : b)) / Tables.STAVE_LINE_DISTANCE;\n text_line = text_line - (bendHeight + 1);\n }\n else {\n state.top_text_line += 1;\n }\n // Format Vibratos\n for (let i = 0; i < vibratos.length; ++i) {\n const vibrato = vibratos[i];\n vibrato.setXShift(shift);\n vibrato.setTextLine(text_line);\n width += vibrato.getWidth();\n shift += width;\n }\n state.right_shift += width;\n return true;\n }\n /** Set harsh vibrato. */\n setHarsh(harsh) {\n this.render_options.harsh = harsh;\n return this;\n }\n /** Set vibrato width in pixels. */\n setVibratoWidth(width) {\n this.render_options.vibrato_width = width;\n this.setWidth(width);\n return this;\n }\n /** Draw the vibrato on the rendering context. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(Modifier.Position.RIGHT, this.index);\n const vx = start.x + this.x_shift;\n const vy = note.getYForTopText(this.text_line) + 2;\n Vibrato.renderVibrato(ctx, vx, vy, this.render_options);\n }\n /**\n * Static rendering method that can be called from\n * other classes (e.g. VibratoBracket).\n */\n static renderVibrato(ctx, x, y, opts) {\n const { harsh, vibrato_width, wave_width, wave_girth, wave_height } = opts;\n const num_waves = vibrato_width / wave_width;\n ctx.beginPath();\n let i;\n if (harsh) {\n ctx.moveTo(x, y + wave_girth + 1);\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.lineTo(x + wave_width, y - wave_height / 2);\n x += wave_width;\n ctx.lineTo(x + wave_width, y + wave_height / 2);\n x += wave_width;\n }\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.lineTo(x - wave_width, y - wave_height / 2 + wave_girth + 1);\n x -= wave_width;\n ctx.lineTo(x - wave_width, y + wave_height / 2 + wave_girth + 1);\n x -= wave_width;\n }\n ctx.fill();\n }\n else {\n ctx.moveTo(x, y + wave_girth);\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.quadraticCurveTo(x + wave_width / 2, y - wave_height / 2, x + wave_width, y);\n x += wave_width;\n ctx.quadraticCurveTo(x + wave_width / 2, y + wave_height / 2, x + wave_width, y);\n x += wave_width;\n }\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.quadraticCurveTo(x - wave_width / 2, y + wave_height / 2 + wave_girth, x - wave_width, y + wave_girth);\n x -= wave_width;\n ctx.quadraticCurveTo(x - wave_width / 2, y - wave_height / 2 + wave_girth, x - wave_width, y + wave_girth);\n x -= wave_width;\n }\n ctx.fill();\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This class implements various types of members to notes (e.g. bends,\n// fingering positions etc.)\nimport { Accidental } from './accidental';\nimport { Annotation } from './annotation';\nimport { Articulation } from './articulation';\nimport { Bend } from './bend';\nimport { ChordSymbol } from './chordsymbol';\nimport { Dot } from './dot';\nimport { FretHandFinger } from './frethandfinger';\nimport { GraceNoteGroup } from './gracenotegroup';\nimport { NoteSubGroup } from './notesubgroup';\nimport { Ornament } from './ornament';\nimport { Parenthesis } from './parenthesis';\nimport { StaveNote } from './stavenote';\nimport { StringNumber } from './stringnumber';\nimport { Stroke } from './strokes';\nimport { Category } from './typeguard';\nimport { log, RuntimeError } from './util';\nimport { Vibrato } from './vibrato';\n// To enable logging for this class. Set `Vex.Flow.ModifierContext.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (ModifierContext.DEBUG)\n log('Vex.Flow.ModifierContext', args);\n}\nexport class ModifierContext {\n constructor() {\n // Formatting data.\n this.state = {\n left_shift: 0,\n right_shift: 0,\n text_line: 0,\n top_text_line: 0,\n };\n // Current members\n this.members = {};\n this.preFormatted = false;\n this.postFormatted = false;\n this.formatted = false;\n this.width = 0;\n this.spacing = 0;\n }\n addModifier(member) {\n L('addModifier is deprecated, use addMember instead.');\n return this.addMember(member);\n }\n /**\n * this.members maps CATEGORY strings to arrays of Tickable | Modifier | StaveNote | TabNote.\n * Here we add a new member to this.members, and create a new array if needed.\n * @param member\n * @returns this\n */\n addMember(member) {\n const category = member.getCategory();\n if (!this.members[category]) {\n this.members[category] = [];\n }\n this.members[category].push(member);\n member.setModifierContext(this);\n this.preFormatted = false;\n return this;\n }\n /**\n * @deprecated\n */\n getModifiers(category) {\n L('getModifiers is deprecated, use getMembers instead.');\n return this.getMembers(category);\n }\n getMembers(category) {\n var _a;\n return (_a = this.members[category]) !== null && _a !== void 0 ? _a : [];\n }\n getWidth() {\n return this.width;\n }\n getLeftShift() {\n return this.state.left_shift;\n }\n getRightShift() {\n return this.state.right_shift;\n }\n getState() {\n return this.state;\n }\n getMetrics() {\n if (!this.formatted) {\n throw new RuntimeError('UnformattedMember', 'Unformatted member has no metrics.');\n }\n return {\n width: this.state.left_shift + this.state.right_shift + this.spacing,\n spacing: this.spacing,\n };\n }\n preFormat() {\n if (this.preFormatted)\n return;\n L('Preformatting ModifierContext');\n const state = this.state;\n const members = this.members;\n // The ordering below determines when different members are formatted and rendered.\n StaveNote.format(members[Category.StaveNote], state);\n Parenthesis.format(members[Category.Parenthesis], state);\n Dot.format(members[Category.Dot], state);\n FretHandFinger.format(members[Category.FretHandFinger], state);\n Accidental.format(members[Category.Accidental], state);\n Stroke.format(members[Category.Stroke], state);\n GraceNoteGroup.format(members[Category.GraceNoteGroup], state);\n NoteSubGroup.format(members[Category.NoteSubGroup], state);\n StringNumber.format(members[Category.StringNumber], state);\n Articulation.format(members[Category.Articulation], state);\n Ornament.format(members[Category.Ornament], state);\n Annotation.format(members[Category.Annotation], state);\n ChordSymbol.format(members[Category.ChordSymbol], state);\n Bend.format(members[Category.Bend], state);\n Vibrato.format(members[Category.Vibrato], state, this);\n // Update width of this member context\n this.width = state.left_shift + state.right_shift;\n this.preFormatted = true;\n }\n postFormat() {\n if (this.postFormatted)\n return;\n L('Postformatting ModifierContext');\n // If post-formatting is required for an element, add more lines below.\n StaveNote.postFormat(this.getMembers(Category.StaveNote));\n }\n}\nModifierContext.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna Cheppudira 2013.\n// Co-author: Benjamin W. Bohl\n// MIT License\nimport { Glyph } from './glyph';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Clef.DEBUG)\n log('Vex.Flow.Clef', args);\n}\n/**\n * Clef implements various types of clefs that can be rendered on a stave.\n *\n * See `tests/clef_tests.ts` for usage examples.\n */\nexport class Clef extends StaveModifier {\n /** Create a new clef. */\n constructor(type, size, annotation) {\n super();\n /**\n * The attribute `clef` must be a key from\n * `Clef.types`\n */\n this.clef = Clef.types['treble'];\n this.setPosition(StaveModifierPosition.BEGIN);\n this.setType(type, size, annotation);\n this.setWidth(Tables.currentMusicFont().lookupMetric(`clef.${this.size}.width`));\n L('Creating clef:', type);\n }\n static get CATEGORY() {\n return Category.Clef;\n }\n /**\n * Every clef name is associated with a glyph code from the font file\n * and a default stave line number.\n */\n static get types() {\n return {\n treble: {\n code: 'gClef',\n line: 3,\n point: 0,\n },\n bass: {\n code: 'fClef',\n line: 1,\n point: 0,\n },\n alto: {\n code: 'cClef',\n line: 2,\n point: 0,\n },\n tenor: {\n code: 'cClef',\n line: 1,\n point: 0,\n },\n percussion: {\n code: 'restMaxima',\n line: 2,\n point: 0,\n },\n soprano: {\n code: 'cClef',\n line: 4,\n point: 0,\n },\n 'mezzo-soprano': {\n code: 'cClef',\n line: 3,\n point: 0,\n },\n 'baritone-c': {\n code: 'cClef',\n line: 0,\n point: 0,\n },\n 'baritone-f': {\n code: 'fClef',\n line: 2,\n point: 0,\n },\n subbass: {\n code: 'fClef',\n line: 0,\n point: 0,\n },\n french: {\n code: 'gClef',\n line: 4,\n point: 0,\n },\n tab: {\n code: '6stringTabClef',\n point: 0,\n },\n };\n }\n /** Set clef type, size and annotation. */\n setType(type, size, annotation) {\n this.type = type;\n this.clef = Clef.types[type];\n if (size === undefined) {\n this.size = 'default';\n }\n else {\n this.size = size;\n }\n const musicFont = Tables.currentMusicFont();\n this.clef.point = musicFont.lookupMetric(`clef.${this.size}.point`, 0);\n this.glyph = new Glyph(this.clef.code, this.clef.point, {\n category: `clef.${this.clef.code}.${this.size}`,\n });\n // If an annotation, such as 8va, is specified, add it to the Clef object.\n if (annotation !== undefined) {\n const code = musicFont.lookupMetric(`clef.annotations.${annotation}.smuflCode`);\n const point = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.point`);\n const line = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.${this.type}.line`);\n const x_shift = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.${this.type}.shiftX`);\n this.annotation = { code, point, line, x_shift };\n this.attachment = new Glyph(this.annotation.code, this.annotation.point);\n this.attachment.metrics.x_max = 0;\n this.attachment.setXShift(this.annotation.x_shift);\n }\n else {\n this.annotation = undefined;\n }\n return this;\n }\n /** Get clef width. */\n getWidth() {\n if (this.type === 'tab') {\n defined(this.stave, 'ClefError', \"Can't get width without stave.\");\n }\n return this.width;\n }\n /** Set associated stave. */\n setStave(stave) {\n this.stave = stave;\n if (this.type === 'tab') {\n const glyph = defined(this.glyph, 'ClefError', \"Can't set stave without glyph.\");\n const numLines = this.stave.getNumLines();\n const musicFont = Tables.currentMusicFont();\n const point = musicFont.lookupMetric(`clef.lineCount.${numLines}.point`);\n const shiftY = musicFont.lookupMetric(`clef.lineCount.${numLines}.shiftY`);\n glyph.setPoint(point);\n glyph.setYShift(shiftY);\n }\n return this;\n }\n /** Render clef. */\n draw() {\n const glyph = defined(this.glyph, 'ClefError', \"Can't draw clef without glyph.\");\n const stave = this.checkStave();\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.openGroup('clef', this.getAttribute('id'));\n glyph.setStave(stave);\n glyph.setContext(ctx);\n if (this.clef.line !== undefined) {\n this.placeGlyphOnLine(glyph, stave, this.clef.line);\n }\n glyph.renderToStave(this.x);\n if (this.annotation !== undefined && this.attachment !== undefined) {\n this.placeGlyphOnLine(this.attachment, stave, this.annotation.line);\n this.attachment.setStave(stave);\n this.attachment.setContext(ctx);\n this.attachment.renderToStave(this.x);\n }\n ctx.closeGroup();\n }\n}\n/** To enable logging for this class, set `Vex.Flow.Clef.DEBUG` to `true`. */\nClef.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Cyril Silverman\n//\n// ## Description\n//\n// This file implements key signatures. A key signature sits on a stave\n// and indicates the notes with implicit accidentals.\nimport { Glyph } from './glyph';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined } from './util';\nexport class KeySignature extends StaveModifier {\n // Create a new Key Signature based on a `key_spec`\n constructor(keySpec, cancelKeySpec, alterKeySpec) {\n super();\n this.accList = [];\n this.setKeySig(keySpec, cancelKeySpec, alterKeySpec);\n this.setPosition(StaveModifierPosition.BEGIN);\n this.glyphFontScale = 38; // TODO(0xFE): Should this match StaveNote?\n this.glyphs = [];\n this.xPositions = []; // relative to this.x\n this.paddingForced = false;\n }\n static get CATEGORY() {\n return Category.KeySignature;\n }\n // Add an accidental glyph to the `KeySignature` instance which represents\n // the provided `acc`. If `nextAcc` is also provided, the appropriate\n // spacing will be included in the glyph's position\n convertToGlyph(acc, nextAcc) {\n const accGlyphData = Tables.accidentalCodes(acc.type);\n const glyph = new Glyph(accGlyphData.code, this.glyphFontScale);\n // Determine spacing between current accidental and the next accidental\n let extraWidth = 1;\n if (acc.type === 'n' && nextAcc) {\n const spacing = KeySignature.accidentalSpacing[nextAcc.type];\n if (spacing) {\n const isAbove = nextAcc.line >= acc.line;\n extraWidth = isAbove ? spacing.above : spacing.below;\n }\n }\n // Place the glyph on the stave\n this.placeGlyphOnLine(glyph, this.checkStave(), acc.line);\n this.glyphs.push(glyph);\n const xPosition = this.xPositions[this.xPositions.length - 1];\n const glyphWidth = glyph.getMetrics().width + extraWidth;\n // Store the next accidental's x position\n this.xPositions.push(xPosition + glyphWidth);\n // Expand size of key signature\n this.width += glyphWidth;\n }\n // Cancel out a key signature provided in the `spec` parameter. This will\n // place appropriate natural accidentals before the key signature.\n cancelKey(spec) {\n this.formatted = false;\n this.cancelKeySpec = spec;\n return this;\n }\n convertToCancelAccList(spec) {\n // Get the accidental list for the cancelled key signature\n const cancel_accList = Tables.keySignature(spec);\n // If the cancelled key has a different accidental type, ie: # vs b\n const different_types = this.accList.length > 0 && cancel_accList.length > 0 && cancel_accList[0].type !== this.accList[0].type;\n // Determine how many naturals needed to add\n const naturals = different_types ? cancel_accList.length : cancel_accList.length - this.accList.length;\n // Return if no naturals needed\n if (naturals < 1)\n return undefined;\n // Get the line position for each natural\n const cancelled = [];\n for (let i = 0; i < naturals; i++) {\n let index = i;\n if (!different_types) {\n index = cancel_accList.length - naturals + i;\n }\n const acc = cancel_accList[index];\n cancelled.push({ type: 'n', line: acc.line });\n }\n // Combine naturals with main accidental list for the key signature\n this.accList = cancelled.concat(this.accList);\n return {\n accList: cancelled,\n type: cancel_accList[0].type,\n };\n }\n // Deprecated\n addToStave(stave) {\n this.paddingForced = true;\n stave.addModifier(this);\n return this;\n }\n // Apply the accidental staff line placement based on the `clef` and\n // the accidental `type` for the key signature ('# or 'b').\n convertAccLines(clef, type, accList = this.accList) {\n let offset = 0.0; // if clef === \"treble\"\n let customLines; // when clef doesn't follow treble key sig shape\n switch (clef) {\n // Treble & Subbass both have offsets of 0, so are not included.\n case 'soprano':\n if (type === '#')\n customLines = [2.5, 0.5, 2, 0, 1.5, -0.5, 1];\n else\n offset = -1;\n break;\n case 'mezzo-soprano':\n if (type === 'b')\n customLines = [0, 2, 0.5, 2.5, 1, 3, 1.5];\n else\n offset = 1.5;\n break;\n case 'alto':\n offset = 0.5;\n break;\n case 'tenor':\n if (type === '#')\n customLines = [3, 1, 2.5, 0.5, 2, 0, 1.5];\n else\n offset = -0.5;\n break;\n case 'baritone-f':\n case 'baritone-c':\n if (type === 'b')\n customLines = [0.5, 2.5, 1, 3, 1.5, 3.5, 2];\n else\n offset = 2;\n break;\n case 'bass':\n case 'french':\n offset = 1;\n break;\n default:\n break;\n }\n // If there's a special case, assign those lines/spaces:\n let i;\n if (typeof customLines !== 'undefined') {\n for (i = 0; i < accList.length; ++i) {\n accList[i].line = customLines[i];\n }\n }\n else if (offset !== 0) {\n for (i = 0; i < accList.length; ++i) {\n accList[i].line += offset;\n }\n }\n }\n getPadding(index) {\n if (!this.formatted)\n this.format();\n return this.glyphs.length === 0 || (!this.paddingForced && index < 2) ? 0 : this.padding;\n }\n getWidth() {\n if (!this.formatted)\n this.format();\n return this.width;\n }\n setKeySig(keySpec, cancelKeySpec, alterKeySpec) {\n this.formatted = false;\n this.keySpec = keySpec;\n this.cancelKeySpec = cancelKeySpec;\n this.alterKeySpec = alterKeySpec;\n return this;\n }\n // Alter the accidentals of a key spec one by one.\n // Each alteration is a new accidental that replaces the\n // original accidental (or the canceled one).\n alterKey(alterKeySpec) {\n this.formatted = false;\n this.alterKeySpec = alterKeySpec;\n return this;\n }\n convertToAlterAccList(alterKeySpec) {\n const max = Math.min(alterKeySpec.length, this.accList.length);\n for (let i = 0; i < max; ++i) {\n if (alterKeySpec[i]) {\n this.accList[i].type = alterKeySpec[i];\n }\n }\n }\n format() {\n const stave = this.checkStave();\n this.width = 0;\n this.glyphs = [];\n this.xPositions = [0]; // initialize with initial x position\n this.accList = Tables.keySignature(defined(this.keySpec));\n const accList = this.accList;\n const firstAccidentalType = accList.length > 0 ? accList[0].type : undefined;\n let cancelAccList;\n if (this.cancelKeySpec) {\n cancelAccList = this.convertToCancelAccList(this.cancelKeySpec);\n }\n if (this.alterKeySpec) {\n this.convertToAlterAccList(this.alterKeySpec);\n }\n if (this.accList.length > 0) {\n const clef = (this.position === StaveModifierPosition.END ? stave.getEndClef() : stave.getClef()) || stave.getClef();\n if (cancelAccList) {\n this.convertAccLines(clef, cancelAccList.type, cancelAccList.accList);\n }\n this.convertAccLines(clef, firstAccidentalType, accList);\n for (let i = 0; i < this.accList.length; ++i) {\n this.convertToGlyph(this.accList[i], this.accList[i + 1]);\n }\n }\n this.formatted = true;\n }\n draw() {\n const stave = this.checkStave();\n const ctx = stave.checkContext();\n if (!this.formatted)\n this.format();\n this.setRendered();\n ctx.openGroup('keysignature', this.getAttribute('id'));\n for (let i = 0; i < this.glyphs.length; i++) {\n const glyph = this.glyphs[i];\n const x = this.x + this.xPositions[i];\n glyph.setStave(stave);\n glyph.setContext(ctx);\n glyph.renderToStave(x);\n }\n ctx.closeGroup();\n }\n}\n// Space between natural and following accidental depending\n// on vertical position\nKeySignature.accidentalSpacing = {\n '#': {\n above: 6,\n below: 4,\n },\n b: {\n above: 4,\n below: 7,\n },\n n: {\n above: 4,\n below: 1,\n },\n '##': {\n above: 6,\n below: 4,\n },\n bb: {\n above: 4,\n below: 7,\n },\n db: {\n above: 4,\n below: 7,\n },\n d: {\n above: 4,\n below: 7,\n },\n bbs: {\n above: 4,\n below: 7,\n },\n '++': {\n above: 6,\n below: 4,\n },\n '+': {\n above: 6,\n below: 4,\n },\n '+-': {\n above: 6,\n below: 4,\n },\n '++-': {\n above: 6,\n below: 4,\n },\n bs: {\n above: 4,\n below: 10,\n },\n bss: {\n above: 4,\n below: 10,\n },\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Larry Kuhns 2011\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { StaveModifier } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nexport class Repetition extends StaveModifier {\n constructor(type, x, y_shift) {\n super();\n this.symbol_type = type;\n this.x = x;\n this.x_shift = 0;\n this.y_shift = y_shift;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.Repetition;\n }\n setShiftX(x) {\n this.x_shift = x;\n return this;\n }\n setShiftY(y) {\n this.y_shift = y;\n return this;\n }\n draw(stave, x) {\n this.setRendered();\n switch (this.symbol_type) {\n case Repetition.type.CODA_RIGHT:\n this.drawCodaFixed(stave, x + stave.getWidth());\n break;\n case Repetition.type.CODA_LEFT:\n this.drawSymbolText(stave, x, 'Coda', true);\n break;\n case Repetition.type.SEGNO_LEFT:\n this.drawSignoFixed(stave, x);\n break;\n case Repetition.type.SEGNO_RIGHT:\n this.drawSignoFixed(stave, x + stave.getWidth());\n break;\n case Repetition.type.DC:\n this.drawSymbolText(stave, x, 'D.C.', false);\n break;\n case Repetition.type.DC_AL_CODA:\n this.drawSymbolText(stave, x, 'D.C. al', true);\n break;\n case Repetition.type.DC_AL_FINE:\n this.drawSymbolText(stave, x, 'D.C. al Fine', false);\n break;\n case Repetition.type.DS:\n this.drawSymbolText(stave, x, 'D.S.', false);\n break;\n case Repetition.type.DS_AL_CODA:\n this.drawSymbolText(stave, x, 'D.S. al', true);\n break;\n case Repetition.type.DS_AL_FINE:\n this.drawSymbolText(stave, x, 'D.S. al Fine', false);\n break;\n case Repetition.type.FINE:\n this.drawSymbolText(stave, x, 'Fine', false);\n break;\n case Repetition.type.TO_CODA:\n this.drawSymbolText(stave, x, 'To', true);\n break;\n default:\n break;\n }\n return this;\n }\n drawCodaFixed(stave, x) {\n const y = stave.getYForTopText(stave.getNumLines()) + this.y_shift;\n Glyph.renderGlyph(stave.checkContext(), this.x + x + this.x_shift, y + Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY'), 40, 'coda', { category: 'coda' });\n return this;\n }\n drawSignoFixed(stave, x) {\n const y = stave.getYForTopText(stave.getNumLines()) + this.y_shift;\n Glyph.renderGlyph(stave.checkContext(), this.x + x + this.x_shift, y + Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY'), 30, 'segno', { category: 'segno' });\n return this;\n }\n drawSymbolText(stave, x, text, draw_coda) {\n const ctx = stave.checkContext();\n ctx.save();\n ctx.setFont(this.textFont);\n let text_x = 0;\n let symbol_x = 0;\n const modifierWidth = stave.getNoteStartX() - this.x;\n switch (this.symbol_type) {\n // To the left with symbol\n case Repetition.type.CODA_LEFT:\n // Offset Coda text to right of stave beginning\n text_x = this.x + stave.getVerticalBarWidth();\n symbol_x =\n text_x +\n ctx.measureText(text).width +\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol');\n break;\n // To the right without symbol\n case Repetition.type.DC:\n case Repetition.type.DC_AL_FINE:\n case Repetition.type.DS:\n case Repetition.type.DS_AL_FINE:\n case Repetition.type.FINE:\n text_x =\n this.x +\n x +\n this.x_shift +\n stave.getWidth() -\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.spacing') -\n modifierWidth -\n ctx.measureText(text).width;\n break;\n // To the right with symbol\n default:\n text_x =\n this.x +\n x +\n this.x_shift +\n stave.getWidth() -\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.spacing') -\n modifierWidth -\n ctx.measureText(text).width -\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol');\n symbol_x =\n text_x +\n ctx.measureText(text).width +\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol');\n break;\n }\n const y = stave.getYForTopText(stave.getNumLines()) +\n this.y_shift +\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY');\n if (draw_coda) {\n Glyph.renderGlyph(ctx, symbol_x, y, 40, 'coda', { category: 'coda' });\n }\n ctx.fillText(text, text_x, y + 5);\n ctx.restore();\n return this;\n }\n}\nRepetition.TEXT_FONT = {\n family: Font.SERIF,\n size: 12,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\nRepetition.type = {\n NONE: 1,\n CODA_LEFT: 2,\n CODA_RIGHT: 3,\n SEGNO_LEFT: 4,\n SEGNO_RIGHT: 5,\n DC: 6,\n DC_AL_CODA: 7,\n DC_AL_FINE: 8,\n DS: 9,\n DS_AL_CODA: 10,\n DS_AL_FINE: 11,\n FINE: 12,\n TO_CODA: 13, // To Coda at end of stave\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Larry Kuhns 2011\nimport { Font, FontStyle, FontWeight } from './font';\nimport { StaveModifier } from './stavemodifier';\nimport { Category } from './typeguard';\nexport class StaveSection extends StaveModifier {\n constructor(section, x, shift_y) {\n super();\n this.setWidth(16);\n this.section = section;\n this.x = x;\n this.shift_x = 0;\n this.shift_y = shift_y;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StaveSection;\n }\n setStaveSection(section) {\n this.section = section;\n return this;\n }\n setShiftX(x) {\n this.shift_x = x;\n return this;\n }\n setShiftY(y) {\n this.shift_y = y;\n return this;\n }\n draw(stave, shift_x) {\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.save();\n ctx.setLineWidth(2);\n ctx.setFont(this.textFont);\n const paddingX = 2;\n const paddingY = 2;\n const rectWidth = 2;\n const textMeasurements = ctx.measureText(this.section);\n const textWidth = textMeasurements.width;\n const textHeight = textMeasurements.height;\n const width = textWidth + 2 * paddingX; // add left & right padding\n const height = textHeight + 2 * paddingY; // add top & bottom padding\n // Seems to be a good default y\n const y = stave.getYForTopText(2) + this.shift_y;\n const x = this.x + shift_x;\n ctx.beginPath();\n ctx.setLineWidth(rectWidth);\n ctx.rect(x, y + textMeasurements.y - paddingY, width, height);\n ctx.stroke();\n ctx.fillText(this.section, x + paddingX, y);\n ctx.restore();\n return this;\n }\n}\nStaveSection.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 10,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Radosaw Eichler 2012\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nexport class StaveTempo extends StaveModifier {\n constructor(tempo, x, shift_y) {\n super();\n /** Font size for note. */\n this.render_options = { glyph_font_scale: 30 };\n this.tempo = tempo;\n this.position = StaveModifierPosition.ABOVE;\n this.x = x;\n this.shift_x = 10;\n this.shift_y = shift_y;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StaveTempo;\n }\n setTempo(tempo) {\n this.tempo = tempo;\n return this;\n }\n setShiftX(x) {\n this.shift_x = x;\n return this;\n }\n setShiftY(y) {\n this.shift_y = y;\n return this;\n }\n draw(stave, shift_x) {\n const ctx = stave.checkContext();\n this.setRendered();\n const options = this.render_options;\n // FIXME: What does the '38' mean? Why 38? Is that supposed to\n // be the default font size for standard notation?\n const scale = options.glyph_font_scale / 38;\n const name = this.tempo.name;\n const duration = this.tempo.duration;\n const dots = this.tempo.dots || 0;\n const bpm = this.tempo.bpm;\n let x = this.x + this.shift_x + shift_x;\n const y = stave.getYForTopText(1) + this.shift_y;\n ctx.save();\n if (name) {\n ctx.setFont(this.textFont);\n ctx.fillText(name, x, y);\n x += ctx.measureText(name).width;\n }\n if (duration && bpm) {\n // Override the weight and style.\n ctx.setFont(Object.assign(Object.assign({}, this.textFont), { weight: 'normal', style: 'normal' }));\n if (name) {\n x += ctx.measureText(' ').width;\n ctx.fillText('(', x, y);\n x += ctx.measureText('(').width;\n }\n const code = Tables.getGlyphProps(duration);\n x += 3 * scale;\n Glyph.renderGlyph(ctx, x, y, options.glyph_font_scale, code.code_head);\n x += code.getWidth() * scale;\n // Draw stem and flags\n if (code.stem) {\n let stem_height = 30;\n if (code.beam_count)\n stem_height += 3 * (code.beam_count - 1);\n stem_height *= scale;\n const y_top = y - stem_height;\n ctx.fillRect(x - scale, y_top, scale, stem_height);\n if (code.flag) {\n Glyph.renderGlyph(ctx, x, y_top, options.glyph_font_scale, code.code_flag_upstem, {\n category: 'flag.staveTempo',\n });\n if (!dots)\n x += 6 * scale;\n }\n }\n // Draw dot\n for (let i = 0; i < dots; i++) {\n x += 6 * scale;\n ctx.beginPath();\n ctx.arc(x, y + 2 * scale, 2 * scale, 0, Math.PI * 2, false);\n ctx.fill();\n }\n ctx.fillText(' = ' + bpm + (name ? ')' : ''), x + 3 * scale, y);\n }\n ctx.restore();\n return this;\n }\n}\nStaveTempo.TEXT_FONT = {\n family: Font.SERIF,\n size: 14,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2014\nimport { Font, FontStyle, FontWeight } from './font';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Justification, TextNote } from './textnote';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StaveText extends StaveModifier {\n constructor(text, position, options = {}) {\n super();\n this.setWidth(16);\n this.text = text;\n this.position = position;\n this.options = Object.assign({ shift_x: 0, shift_y: 0, justification: TextNote.Justification.CENTER }, options);\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StaveText;\n }\n setStaveText(text) {\n this.text = text;\n return this;\n }\n setShiftX(x) {\n this.shift_x = x;\n return this;\n }\n setShiftY(y) {\n this.shift_y = y;\n return this;\n }\n setText(text) {\n this.text = text;\n return this;\n }\n draw(stave) {\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.save();\n ctx.setLineWidth(2);\n ctx.setFont(this.textFont);\n const text_width = ctx.measureText('' + this.text).width;\n let x;\n let y;\n switch (this.position) {\n case StaveModifierPosition.LEFT:\n case StaveModifierPosition.RIGHT:\n y = (stave.getYForLine(0) + stave.getBottomLineY()) / 2 + this.options.shift_y;\n if (this.position === StaveModifierPosition.LEFT) {\n x = stave.getX() - text_width - 24 + this.options.shift_x;\n }\n else {\n x = stave.getX() + stave.getWidth() + 24 + this.options.shift_x;\n }\n break;\n case StaveModifierPosition.ABOVE:\n case StaveModifierPosition.BELOW:\n x = stave.getX() + this.options.shift_x;\n if (this.options.justification === Justification.CENTER) {\n x += stave.getWidth() / 2 - text_width / 2;\n }\n else if (this.options.justification === Justification.RIGHT) {\n x += stave.getWidth() - text_width;\n }\n if (this.position === StaveModifierPosition.ABOVE) {\n y = stave.getYForTopText(2) + this.options.shift_y;\n }\n else {\n y = stave.getYForBottomText(2) + this.options.shift_y;\n }\n break;\n default:\n throw new RuntimeError('InvalidPosition', 'Value Must be in Modifier.Position.');\n }\n ctx.fillText('' + this.text, x, y + 4);\n ctx.restore();\n return this;\n }\n}\nStaveText.TEXT_FONT = {\n family: Font.SERIF,\n size: 16,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// Renders time signatures glyphs for staffs\n// This class is used by TimeSignature to render the associated glyphs\nimport { Glyph } from './glyph';\nimport { defined } from './util';\nexport class TimeSignatureGlyph extends Glyph {\n constructor(timeSignature, topDigits, botDigits, code, point, options) {\n var _a;\n super(code, point, options);\n this.timeSignature = timeSignature;\n this.topGlyphs = [];\n this.botGlyphs = [];\n let topWidth = 0;\n for (let i = 0; i < topDigits.length; ++i) {\n let timeSigType = topDigits[i];\n switch (topDigits[i]) {\n case '-':\n timeSigType = 'Minus';\n break;\n case '+':\n timeSigType = botDigits.length > 0 ? 'PlusSmall' : 'Plus';\n break;\n case '(':\n timeSigType = botDigits.length > 0 ? 'ParensLeftSmall' : 'ParensLeft';\n break;\n case ')':\n timeSigType = botDigits.length > 0 ? 'ParensRightSmall' : 'ParensRight';\n break;\n }\n const topGlyph = new Glyph('timeSig' + timeSigType, this.timeSignature.point);\n this.topGlyphs.push(topGlyph);\n topWidth += (_a = topGlyph.getMetrics().width) !== null && _a !== void 0 ? _a : 0;\n }\n let botWidth = 0;\n for (let i = 0; i < botDigits.length; ++i) {\n let timeSigType = botDigits[i];\n switch (botDigits[i]) {\n case '+':\n timeSigType = 'PlusSmall';\n break;\n case '(':\n timeSigType = 'ParensLeftSmall';\n break;\n case ')':\n timeSigType = 'ParensRightSmall';\n break;\n }\n const botGlyph = new Glyph('timeSig' + timeSigType, this.timeSignature.point);\n this.botGlyphs.push(botGlyph);\n botWidth += defined(botGlyph.getMetrics().width);\n }\n this.width = Math.max(topWidth, botWidth);\n this.xMin = this.getMetrics().x_min;\n this.topStartX = (this.width - topWidth) / 2.0;\n this.botStartX = (this.width - botWidth) / 2.0;\n this.reset();\n }\n getMetrics() {\n return {\n x_min: this.xMin,\n x_max: this.xMin + this.width,\n width: this.width,\n };\n }\n renderToStave(x) {\n const stave = this.checkStave();\n const ctx = this.checkContext();\n let start_x = x + this.topStartX;\n let y = 0;\n if (this.botGlyphs.length > 0)\n y = stave.getYForLine(this.timeSignature.topLine);\n else\n y = (stave.getYForLine(this.timeSignature.topLine) + stave.getYForLine(this.timeSignature.bottomLine)) / 2;\n for (let i = 0; i < this.topGlyphs.length; ++i) {\n const glyph = this.topGlyphs[i];\n Glyph.renderOutline(ctx, glyph.getMetrics().outline, this.scale, start_x + this.x_shift, y);\n start_x += defined(glyph.getMetrics().width);\n }\n start_x = x + this.botStartX;\n y = stave.getYForLine(this.timeSignature.bottomLine);\n for (let i = 0; i < this.botGlyphs.length; ++i) {\n const glyph = this.botGlyphs[i];\n this.timeSignature.placeGlyphOnLine(glyph, stave, 0);\n Glyph.renderOutline(ctx, glyph.getMetrics().outline, this.scale, start_x + glyph.getMetrics().x_shift, y);\n start_x += defined(glyph.getMetrics().width);\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// Implements time signatures glyphs for staffs\n// See tables.js for the internal time signatures\n// representation\nimport { Glyph } from './glyph';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { TimeSignatureGlyph } from './timesigglyph';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nconst assertIsValidTimeSig = (timeSpec) => {\n const numbers = timeSpec.split('/');\n if (numbers.length !== 2 && numbers[0] !== '+' && numbers[0] !== '-') {\n throw new RuntimeError('BadTimeSignature', `Invalid time spec: ${timeSpec}. Must be in the form \"/\"`);\n }\n numbers.forEach((number) => {\n // Characters consisting in number 0..9, '+', '-', '(' or ')'\n if (/^[0-9+\\-()]+$/.test(number) == false) {\n throw new RuntimeError('BadTimeSignature', `Invalid time spec: ${timeSpec}. Must contain valid signatures.`);\n }\n });\n};\nexport class TimeSignature extends StaveModifier {\n constructor(timeSpec = '4/4', customPadding = 15, validate_args = true) {\n super();\n this.validate_args = validate_args;\n const padding = customPadding;\n const musicFont = Tables.currentMusicFont();\n this.point = musicFont.lookupMetric('digits.point');\n const fontLineShift = musicFont.lookupMetric('digits.shiftLine', 0);\n this.topLine = 2 + fontLineShift;\n this.bottomLine = 4 + fontLineShift;\n this.setPosition(StaveModifierPosition.BEGIN);\n this.info = this.parseTimeSpec(timeSpec);\n this.setWidth(defined(this.info.glyph.getMetrics().width));\n this.setPadding(padding);\n }\n static get CATEGORY() {\n return Category.TimeSignature;\n }\n static get glyphs() {\n return {\n C: {\n code: 'timeSigCommon',\n point: 40,\n line: 2,\n },\n 'C|': {\n code: 'timeSigCutCommon',\n point: 40,\n line: 2,\n },\n };\n }\n parseTimeSpec(timeSpec) {\n var _a, _b;\n if (timeSpec === 'C' || timeSpec === 'C|') {\n const { line, code, point } = TimeSignature.glyphs[timeSpec];\n return {\n line,\n num: false,\n glyph: new Glyph(code, point),\n };\n }\n if (this.validate_args) {\n assertIsValidTimeSig(timeSpec);\n }\n const parts = timeSpec.split('/');\n return {\n num: true,\n glyph: this.makeTimeSignatureGlyph((_a = parts[0]) !== null && _a !== void 0 ? _a : '', (_b = parts[1]) !== null && _b !== void 0 ? _b : ''),\n };\n }\n makeTimeSignatureGlyph(topDigits, botDigits) {\n return new TimeSignatureGlyph(this, topDigits, botDigits, 'timeSig0', this.point);\n }\n getInfo() {\n return this.info;\n }\n setTimeSig(timeSpec) {\n this.info = this.parseTimeSpec(timeSpec);\n return this;\n }\n draw() {\n const stave = this.checkStave();\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.openGroup('timesignature', this.getAttribute('id'));\n this.info.glyph.setStave(stave);\n this.info.glyph.setContext(ctx);\n this.placeGlyphOnLine(this.info.glyph, stave, this.info.line);\n this.info.glyph.renderToStave(this.x);\n ctx.closeGroup();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { BoundingBox } from './boundingbox';\nimport { Clef } from './clef';\nimport { Element } from './element';\nimport { Font, FontStyle, FontWeight } from './font';\nimport { KeySignature } from './keysignature';\nimport { Barline, BarlineType } from './stavebarline';\nimport { StaveModifierPosition } from './stavemodifier';\nimport { Repetition } from './staverepetition';\nimport { StaveSection } from './stavesection';\nimport { StaveTempo } from './stavetempo';\nimport { StaveText } from './stavetext';\nimport { Volta } from './stavevolta';\nimport { Tables } from './tables';\nimport { TimeSignature } from './timesignature';\nimport { Category, isBarline } from './typeguard';\nimport { RuntimeError } from './util';\n// Used by Stave.format() to sort the modifiers at the beginning and end of a stave.\n// The keys (computed property names) match the CATEGORY property in the\n// Barline, Clef, KeySignature, TimeSignature classes.\nconst SORT_ORDER_BEG_MODIFIERS = {\n [Barline.CATEGORY]: 0,\n [Clef.CATEGORY]: 1,\n [KeySignature.CATEGORY]: 2,\n [TimeSignature.CATEGORY]: 3,\n};\nconst SORT_ORDER_END_MODIFIERS = {\n [TimeSignature.CATEGORY]: 0,\n [KeySignature.CATEGORY]: 1,\n [Barline.CATEGORY]: 2,\n [Clef.CATEGORY]: 3,\n};\nexport class Stave extends Element {\n constructor(x, y, width, options) {\n super();\n // Initialized by the constructor via this.resetLines().\n this.height = 0;\n this.x = x;\n this.y = y;\n this.width = width;\n this.formatted = false;\n this.start_x = x + 5;\n this.end_x = x + width;\n this.modifiers = []; // stave modifiers (clef, key, time, barlines, coda, segno, etc.)\n this.measure = 0;\n this.clef = 'treble';\n this.endClef = undefined;\n this.resetFont();\n this.options = Object.assign({ vertical_bar_width: 10, num_lines: 5, fill_style: '#999999', left_bar: true, right_bar: true, spacing_between_lines_px: Tables.STAVE_LINE_DISTANCE, space_above_staff_ln: 4, space_below_staff_ln: 4, top_text_position: 1, bottom_text_position: 4, line_config: [] }, options);\n this.bounds = { x: this.x, y: this.y, w: this.width, h: 0 };\n this.defaultLedgerLineStyle = { strokeStyle: '#444', lineWidth: 1.4 };\n this.resetLines();\n // beg bar\n this.addModifier(new Barline(this.options.left_bar ? BarlineType.SINGLE : BarlineType.NONE));\n // end bar\n this.addEndModifier(new Barline(this.options.right_bar ? BarlineType.SINGLE : BarlineType.NONE));\n }\n static get CATEGORY() {\n return Category.Stave;\n }\n // This is the sum of the padding that normally goes on left + right of a stave during\n // drawing. Used to size staves correctly with content width.\n static get defaultPadding() {\n const musicFont = Tables.currentMusicFont();\n return musicFont.lookupMetric('stave.padding') + musicFont.lookupMetric('stave.endPaddingMax');\n }\n // Right padding, used by system if startX is already determined.\n static get rightPadding() {\n const musicFont = Tables.currentMusicFont();\n return musicFont.lookupMetric('stave.endPaddingMax');\n }\n /** Set default style for ledger lines. */\n setDefaultLedgerLineStyle(style) {\n this.defaultLedgerLineStyle = style;\n }\n /** Get default style for ledger lines. */\n getDefaultLedgerLineStyle() {\n return Object.assign(Object.assign({}, this.getStyle()), this.defaultLedgerLineStyle);\n }\n space(spacing) {\n return this.options.spacing_between_lines_px * spacing;\n }\n resetLines() {\n this.options.line_config = [];\n for (let i = 0; i < this.options.num_lines; i++) {\n this.options.line_config.push({ visible: true });\n }\n this.height = (this.options.num_lines + this.options.space_above_staff_ln) * this.options.spacing_between_lines_px;\n this.options.bottom_text_position = this.options.num_lines;\n }\n setNoteStartX(x) {\n if (!this.formatted)\n this.format();\n this.start_x = x;\n const begBarline = this.modifiers[0];\n begBarline.setX(this.start_x - begBarline.getWidth());\n return this;\n }\n getNoteStartX() {\n if (!this.formatted)\n this.format();\n return this.start_x;\n }\n getNoteEndX() {\n if (!this.formatted)\n this.format();\n return this.end_x;\n }\n getTieStartX() {\n return this.start_x;\n }\n getTieEndX() {\n return this.end_x;\n }\n getX() {\n return this.x;\n }\n getNumLines() {\n return this.options.num_lines;\n }\n setNumLines(n) {\n this.options.num_lines = n;\n this.resetLines();\n return this;\n }\n setY(y) {\n this.y = y;\n return this;\n }\n getY() {\n return this.y;\n }\n getTopLineTopY() {\n return this.getYForLine(0) - Tables.STAVE_LINE_THICKNESS / 2;\n }\n getBottomLineBottomY() {\n return this.getYForLine(this.getNumLines() - 1) + Tables.STAVE_LINE_THICKNESS / 2;\n }\n setX(x) {\n const shift = x - this.x;\n this.formatted = false;\n this.x = x;\n this.start_x += shift;\n this.end_x += shift;\n for (let i = 0; i < this.modifiers.length; i++) {\n const mod = this.modifiers[i];\n mod.setX(mod.getX() + shift);\n }\n return this;\n }\n setWidth(width) {\n this.formatted = false;\n this.width = width;\n this.end_x = this.x + width;\n // reset the x position of the end barline (TODO(0xfe): This makes no sense)\n // this.modifiers[1].setX(this.end_x);\n return this;\n }\n getWidth() {\n return this.width;\n }\n getStyle() {\n return Object.assign({ fillStyle: this.options.fill_style, strokeStyle: this.options.fill_style, lineWidth: Tables.STAVE_LINE_THICKNESS }, this.style);\n }\n setMeasure(measure) {\n this.measure = measure;\n return this;\n }\n /**\n * Gets the pixels to shift from the beginning of the stave\n * following the modifier at the provided index\n * @param {Number} index The index from which to determine the shift\n * @return {Number} The amount of pixels shifted\n */\n getModifierXShift(index = 0) {\n if (typeof index !== 'number') {\n throw new RuntimeError('InvalidIndex', 'Must be of number type');\n }\n if (!this.formatted)\n this.format();\n if (this.getModifiers(StaveModifierPosition.BEGIN).length === 1) {\n return 0;\n }\n // for right position modifiers zero shift seems correct, see 'Volta + Modifier Measure Test'\n if (this.modifiers[index].getPosition() === StaveModifierPosition.RIGHT) {\n return 0;\n }\n let start_x = this.start_x - this.x;\n const begBarline = this.modifiers[0];\n if (begBarline.getType() === BarlineType.REPEAT_BEGIN && start_x > begBarline.getWidth()) {\n start_x -= begBarline.getWidth();\n }\n return start_x;\n }\n /** Coda & Segno Symbol functions */\n setRepetitionType(type, yShift = 0) {\n this.modifiers.push(new Repetition(type, this.x, yShift));\n return this;\n }\n // Volta functions\n setVoltaType(type, number_t, y) {\n this.modifiers.push(new Volta(type, number_t, this.x, y));\n return this;\n }\n // Section functions\n setSection(section, y, xOffset = 0, fontSize) {\n const staveSection = new StaveSection(section, this.x + xOffset, y);\n if (fontSize)\n staveSection.setFontSize(fontSize);\n this.modifiers.push(staveSection);\n return this;\n }\n // Tempo functions\n setTempo(tempo, y) {\n this.modifiers.push(new StaveTempo(tempo, this.x, y));\n return this;\n }\n // Text functions\n setText(text, position, options = {}) {\n this.modifiers.push(new StaveText(text, position, options));\n return this;\n }\n getHeight() {\n return this.height;\n }\n getSpacingBetweenLines() {\n return this.options.spacing_between_lines_px;\n }\n getBoundingBox() {\n return new BoundingBox(this.x, this.y, this.width, this.getBottomY() - this.y);\n }\n getBottomY() {\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const score_bottom = this.getYForLine(options.num_lines) + options.space_below_staff_ln * spacing;\n return score_bottom;\n }\n getBottomLineY() {\n return this.getYForLine(this.options.num_lines);\n }\n // This returns\n /** @returns the y for the *center* of a staff line */\n getYForLine(line) {\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const headroom = options.space_above_staff_ln;\n const y = this.y + line * spacing + headroom * spacing;\n return y;\n }\n getLineForY(y) {\n // Does the reverse of getYForLine - somewhat dumb and just calls\n // getYForLine until the right value is reaches\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const headroom = options.space_above_staff_ln;\n return (y - this.y) / spacing - headroom;\n }\n getYForTopText(line = 0) {\n return this.getYForLine(-line - this.options.top_text_position);\n }\n getYForBottomText(line = 0) {\n return this.getYForLine(this.options.bottom_text_position + line);\n }\n getYForNote(line) {\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const headroom = options.space_above_staff_ln;\n return this.y + headroom * spacing + 5 * spacing - line * spacing;\n }\n getYForGlyphs() {\n return this.getYForLine(3);\n }\n // This method adds a stave modifier to the stave. Note that the first two\n // modifiers (BarLines) are automatically added upon construction.\n addModifier(modifier, position) {\n if (position !== undefined) {\n modifier.setPosition(position);\n }\n modifier.setStave(this);\n this.formatted = false;\n this.modifiers.push(modifier);\n return this;\n }\n addEndModifier(modifier) {\n this.addModifier(modifier, StaveModifierPosition.END);\n return this;\n }\n // Bar Line functions\n setBegBarType(type) {\n // Only valid bar types at beginning of stave is none, single or begin repeat\n const { SINGLE, REPEAT_BEGIN, NONE } = BarlineType;\n if (type === SINGLE || type === REPEAT_BEGIN || type === NONE) {\n this.modifiers[0].setType(type);\n this.formatted = false;\n }\n return this;\n }\n setEndBarType(type) {\n // Repeat end not valid at end of stave\n if (type !== BarlineType.REPEAT_BEGIN) {\n this.modifiers[1].setType(type);\n this.formatted = false;\n }\n return this;\n }\n setClef(clefSpec, size, annotation, position) {\n if (position === undefined) {\n position = StaveModifierPosition.BEGIN;\n }\n if (position === StaveModifierPosition.END) {\n this.endClef = clefSpec;\n }\n else {\n this.clef = clefSpec;\n }\n const clefs = this.getModifiers(position, Clef.CATEGORY);\n if (clefs.length === 0) {\n this.addClef(clefSpec, size, annotation, position);\n }\n else {\n clefs[0].setType(clefSpec, size, annotation);\n }\n return this;\n }\n getClef() {\n return this.clef;\n }\n setEndClef(clefSpec, size, annotation) {\n this.setClef(clefSpec, size, annotation, StaveModifierPosition.END);\n return this;\n }\n getEndClef() {\n return this.endClef;\n }\n setKeySignature(keySpec, cancelKeySpec, position) {\n if (position === undefined) {\n position = StaveModifierPosition.BEGIN;\n }\n const keySignatures = this.getModifiers(position, KeySignature.CATEGORY);\n if (keySignatures.length === 0) {\n this.addKeySignature(keySpec, cancelKeySpec, position);\n }\n else {\n keySignatures[0].setKeySig(keySpec, cancelKeySpec);\n }\n return this;\n }\n setEndKeySignature(keySpec, cancelKeySpec) {\n this.setKeySignature(keySpec, cancelKeySpec, StaveModifierPosition.END);\n return this;\n }\n setTimeSignature(timeSpec, customPadding, position) {\n if (position === undefined) {\n position = StaveModifierPosition.BEGIN;\n }\n const timeSignatures = this.getModifiers(position, TimeSignature.CATEGORY);\n if (timeSignatures.length === 0) {\n this.addTimeSignature(timeSpec, customPadding, position);\n }\n else {\n timeSignatures[0].setTimeSig(timeSpec);\n }\n return this;\n }\n setEndTimeSignature(timeSpec, customPadding) {\n this.setTimeSignature(timeSpec, customPadding, StaveModifierPosition.END);\n return this;\n }\n /**\n * Add a key signature to the stave.\n *\n * Example:\n * `stave.addKeySignature('Db');`\n * @param keySpec new key specification `[A-G][b|#]?`\n * @param cancelKeySpec\n * @param position\n * @returns\n */\n addKeySignature(keySpec, cancelKeySpec, position) {\n if (position === undefined) {\n position = StaveModifierPosition.BEGIN;\n }\n this.addModifier(new KeySignature(keySpec, cancelKeySpec).setPosition(position), position);\n return this;\n }\n /**\n * Add a clef to the stave.\n *\n * Example:\n *\n * stave.addClef('treble')\n * @param clef clef (treble|bass|...) see {@link Clef.types}\n * @param size\n * @param annotation\n * @param position\n * @returns\n */\n addClef(clef, size, annotation, position) {\n if (position === undefined || position === StaveModifierPosition.BEGIN) {\n this.clef = clef;\n }\n else if (position === StaveModifierPosition.END) {\n this.endClef = clef;\n }\n this.addModifier(new Clef(clef, size, annotation), position);\n return this;\n }\n addEndClef(clef, size, annotation) {\n this.addClef(clef, size, annotation, StaveModifierPosition.END);\n return this;\n }\n /**\n * Add a time signature to the stave\n *\n * Example:\n *\n * `stave.addTimeSignature('4/4');`\n * @param timeSpec time signature specification `(C\\||C|\\d\\/\\d)`\n * @param customPadding\n * @param position\n * @returns\n */\n addTimeSignature(timeSpec, customPadding, position) {\n this.addModifier(new TimeSignature(timeSpec, customPadding), position);\n return this;\n }\n addEndTimeSignature(timeSpec, customPadding) {\n this.addTimeSignature(timeSpec, customPadding, StaveModifierPosition.END);\n return this;\n }\n // Deprecated\n addTrebleGlyph() {\n this.addClef('treble');\n return this;\n }\n /**\n * @param position\n * @param category\n * @returns array of StaveModifiers that match the provided position and category.\n */\n getModifiers(position, category) {\n const noPosition = position === undefined;\n const noCategory = category === undefined;\n if (noPosition && noCategory) {\n return this.modifiers;\n }\n else if (noPosition) {\n // A category was provided.\n return this.modifiers.filter((m) => category === m.getCategory());\n }\n else if (noCategory) {\n // A position was provided.\n return this.modifiers.filter((m) => position === m.getPosition());\n }\n else {\n // Both position and category were provided!\n return this.modifiers.filter((m) => position === m.getPosition() && category === m.getCategory());\n }\n }\n /**\n * Use the modifier's `getCategory()` as a key for the `order` array.\n * The retrieved value is used to sort modifiers from left to right (0 to to 3).\n */\n sortByCategory(items, order) {\n for (let i = items.length - 1; i >= 0; i--) {\n for (let j = 0; j < i; j++) {\n if (order[items[j].getCategory()] > order[items[j + 1].getCategory()]) {\n const temp = items[j];\n items[j] = items[j + 1];\n items[j + 1] = temp;\n }\n }\n }\n }\n format() {\n const begBarline = this.modifiers[0];\n const endBarline = this.modifiers[1];\n const begModifiers = this.getModifiers(StaveModifierPosition.BEGIN);\n const endModifiers = this.getModifiers(StaveModifierPosition.END);\n this.sortByCategory(begModifiers, SORT_ORDER_BEG_MODIFIERS);\n this.sortByCategory(endModifiers, SORT_ORDER_END_MODIFIERS);\n if (begModifiers.length > 1 && begBarline.getType() === BarlineType.REPEAT_BEGIN) {\n begModifiers.push(begModifiers.splice(0, 1)[0]);\n begModifiers.splice(0, 0, new Barline(BarlineType.SINGLE));\n }\n if (endModifiers.indexOf(endBarline) > 0) {\n endModifiers.splice(0, 0, new Barline(BarlineType.NONE));\n }\n let width;\n let padding;\n let modifier;\n let offset = 0;\n let x = this.x;\n for (let i = 0; i < begModifiers.length; i++) {\n modifier = begModifiers[i];\n padding = modifier.getPadding(i + offset);\n width = modifier.getWidth();\n x += padding;\n modifier.setX(x);\n x += width;\n if (padding + width === 0)\n offset--;\n }\n this.start_x = x;\n x = this.x + this.width;\n const widths = {\n left: 0,\n right: 0,\n paddingRight: 0,\n paddingLeft: 0,\n };\n let lastBarlineIdx = 0;\n for (let i = 0; i < endModifiers.length; i++) {\n modifier = endModifiers[i];\n lastBarlineIdx = isBarline(modifier) ? i : lastBarlineIdx;\n widths.right = 0;\n widths.left = 0;\n widths.paddingRight = 0;\n widths.paddingLeft = 0;\n const layoutMetrics = modifier.getLayoutMetrics();\n if (layoutMetrics) {\n if (i !== 0) {\n widths.right = layoutMetrics.xMax || 0;\n widths.paddingRight = layoutMetrics.paddingRight || 0;\n }\n widths.left = -layoutMetrics.xMin || 0;\n widths.paddingLeft = layoutMetrics.paddingLeft || 0;\n if (i === endModifiers.length - 1) {\n widths.paddingLeft = 0;\n }\n }\n else {\n widths.paddingRight = modifier.getPadding(i - lastBarlineIdx);\n if (i !== 0) {\n widths.right = modifier.getWidth();\n }\n if (i === 0) {\n widths.left = modifier.getWidth();\n }\n }\n x -= widths.paddingRight;\n x -= widths.right;\n modifier.setX(x);\n x -= widths.left;\n x -= widths.paddingLeft;\n }\n this.end_x = endModifiers.length === 1 ? this.x + this.width : x;\n this.formatted = true;\n }\n /**\n * All drawing functions below need the context to be set.\n */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n ctx.openGroup('stave', this.getAttribute('id'));\n if (!this.formatted)\n this.format();\n const num_lines = this.options.num_lines;\n const width = this.width;\n const x = this.x;\n let y;\n // Render lines\n for (let line = 0; line < num_lines; line++) {\n y = this.getYForLine(line);\n this.applyStyle();\n if (this.options.line_config[line].visible) {\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(x + width, y);\n ctx.stroke();\n }\n this.restoreStyle();\n }\n // Draw the modifiers (bar lines, coda, segno, repeat brackets, etc.)\n for (let i = 0; i < this.modifiers.length; i++) {\n const modifier = this.modifiers[i];\n // Only draw modifier if it has a draw function\n if (typeof modifier.draw === 'function') {\n modifier.applyStyle(ctx);\n modifier.draw(this, this.getModifierXShift(i));\n modifier.restoreStyle(ctx);\n }\n }\n // Render measure numbers\n if (this.measure > 0) {\n ctx.save();\n ctx.setFont(this.textFont);\n const textWidth = ctx.measureText('' + this.measure).width;\n y = this.getYForTopText(0) + 3;\n ctx.fillText('' + this.measure, this.x - textWidth / 2, y);\n ctx.restore();\n }\n ctx.closeGroup();\n return this;\n }\n getVerticalBarWidth() {\n return this.options.vertical_bar_width;\n }\n /**\n * Get the current configuration for the Stave.\n * @return {Array} An array of configuration objects.\n */\n getConfigForLines() {\n return this.options.line_config;\n }\n /**\n * Configure properties of the lines in the Stave\n * @param line_number The index of the line to configure.\n * @param line_config An configuration object for the specified line.\n * @throws RuntimeError \"StaveConfigError\" When the specified line number is out of\n * range of the number of lines specified in the constructor.\n */\n setConfigForLine(line_number, line_config) {\n if (line_number >= this.options.num_lines || line_number < 0) {\n throw new RuntimeError('StaveConfigError', 'The line number must be within the range of the number of lines in the Stave.');\n }\n if (line_config.visible === undefined) {\n throw new RuntimeError('StaveConfigError', \"The line configuration object is missing the 'visible' property.\");\n }\n if (typeof line_config.visible !== 'boolean') {\n throw new RuntimeError('StaveConfigError', \"The line configuration objects 'visible' property must be true or false.\");\n }\n this.options.line_config[line_number] = line_config;\n return this;\n }\n /**\n * Set the staff line configuration array for all of the lines at once.\n * @param lines_configuration An array of line configuration objects. These objects\n * are of the same format as the single one passed in to setLineConfiguration().\n * The caller can set null for any line config entry if it is desired that the default be used\n * @throws RuntimeError \"StaveConfigError\" When the lines_configuration array does not have\n * exactly the same number of elements as the num_lines configuration object set in\n * the constructor.\n */\n setConfigForLines(lines_configuration) {\n if (lines_configuration.length !== this.options.num_lines) {\n throw new RuntimeError('StaveConfigError', 'The length of the lines configuration array must match the number of lines in the Stave');\n }\n // Make sure the defaults are present in case an incomplete set of\n // configuration options were supplied.\n // eslint-disable-next-line\n for (const line_config in lines_configuration) {\n // Allow '{}' to be used if the caller just wants the default for a particular node.\n if (lines_configuration[line_config].visible == undefined) {\n lines_configuration[line_config] = this.options.line_config[line_config];\n }\n this.options.line_config[line_config] = Object.assign(Object.assign({}, this.options.line_config[line_config]), lines_configuration[line_config]);\n }\n this.options.line_config = lines_configuration;\n return this;\n }\n}\nStave.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 8,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nfunction drawBoldDoubleLine(ctx, type, topX, topY, botY) {\n if (type !== StaveConnector.type.BOLD_DOUBLE_LEFT && type !== StaveConnector.type.BOLD_DOUBLE_RIGHT) {\n throw new RuntimeError('InvalidConnector', 'A REPEAT_BEGIN or REPEAT_END type must be provided.');\n }\n let x_shift = 3;\n let variableWidth = 3.5; // Width for avoiding anti-aliasing width issues\n const thickLineOffset = 2; // For aesthetics\n if (type === StaveConnector.type.BOLD_DOUBLE_RIGHT) {\n x_shift = -5; // Flips the side of the thin line\n variableWidth = 3;\n }\n // Thin line\n ctx.fillRect(topX + x_shift, topY, 1, botY - topY);\n // Thick line\n ctx.fillRect(topX - thickLineOffset, topY, variableWidth, botY - topY);\n}\n/** StaveConnector implements the connector lines between staves of a system. */\nexport class StaveConnector extends Element {\n constructor(top_stave, bottom_stave) {\n super();\n this.thickness = Tables.STAVE_LINE_THICKNESS;\n this.width = 3;\n this.top_stave = top_stave;\n this.bottom_stave = bottom_stave;\n this.type = StaveConnector.type.DOUBLE;\n this.resetFont();\n // 1. Offset Bold Double Left to align with offset Repeat Begin bars\n // 2. Offset BRACE type not to overlap with another StaveConnector\n this.x_shift = 0;\n this.texts = [];\n }\n static get CATEGORY() {\n return Category.StaveConnector;\n }\n /**\n * Set type.\n * @param type see {@link StaveConnector.type} & {@link StaveConnector.typeString}\n */\n setType(type) {\n type = typeof type === 'string' ? StaveConnector.typeString[type] : type;\n if (type >= StaveConnector.type.SINGLE_RIGHT && type <= StaveConnector.type.NONE) {\n this.type = type;\n }\n return this;\n }\n /** Set optional associated Text. */\n setText(text, options = {}) {\n this.texts.push({\n content: text,\n options: Object.assign({ shift_x: 0, shift_y: 0 }, options),\n });\n return this;\n }\n setXShift(x_shift) {\n if (typeof x_shift !== 'number') {\n throw new RuntimeError('InvalidType', 'x_shift must be a Number');\n }\n this.x_shift = x_shift;\n return this;\n }\n getXShift() {\n return this.x_shift;\n }\n /** Render connector and associated text. */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n let topY = this.top_stave.getYForLine(0);\n let botY = this.bottom_stave.getYForLine(this.bottom_stave.getNumLines() - 1) + this.thickness;\n let width = this.width;\n let topX = this.top_stave.getX();\n const isRightSidedConnector = this.type === StaveConnector.type.SINGLE_RIGHT ||\n this.type === StaveConnector.type.BOLD_DOUBLE_RIGHT ||\n this.type === StaveConnector.type.THIN_DOUBLE;\n if (isRightSidedConnector) {\n topX = this.top_stave.getX() + this.top_stave.getWidth();\n }\n let attachment_height = botY - topY;\n switch (this.type) {\n case StaveConnector.type.SINGLE:\n width = 1;\n break;\n case StaveConnector.type.SINGLE_LEFT:\n width = 1;\n break;\n case StaveConnector.type.SINGLE_RIGHT:\n width = 1;\n break;\n case StaveConnector.type.DOUBLE:\n topX -= this.width + 2;\n topY -= this.thickness;\n attachment_height += 0.5;\n break;\n case StaveConnector.type.BRACE: {\n width = 12;\n // May need additional code to draw brace\n const x1 = this.top_stave.getX() - 2 + this.x_shift;\n const y1 = topY;\n const x3 = x1;\n const y3 = botY;\n const x2 = x1 - width;\n const y2 = y1 + attachment_height / 2.0;\n const cpx1 = x2 - 0.9 * width;\n const cpy1 = y1 + 0.2 * attachment_height;\n const cpx2 = x1 + 1.1 * width;\n const cpy2 = y2 - 0.135 * attachment_height;\n const cpx3 = cpx2;\n const cpy3 = y2 + 0.135 * attachment_height;\n const cpx4 = cpx1;\n const cpy4 = y3 - 0.2 * attachment_height;\n const cpx5 = x2 - width;\n const cpy5 = cpy4;\n const cpx6 = x1 + 0.4 * width;\n const cpy6 = y2 + 0.135 * attachment_height;\n const cpx7 = cpx6;\n const cpy7 = y2 - 0.135 * attachment_height;\n const cpx8 = cpx5;\n const cpy8 = cpy1;\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, x2, y2);\n ctx.bezierCurveTo(cpx3, cpy3, cpx4, cpy4, x3, y3);\n ctx.bezierCurveTo(cpx5, cpy5, cpx6, cpy6, x2, y2);\n ctx.bezierCurveTo(cpx7, cpy7, cpx8, cpy8, x1, y1);\n ctx.fill();\n ctx.stroke();\n break;\n }\n case StaveConnector.type.BRACKET:\n topY -= 6;\n botY += 6;\n attachment_height = botY - topY;\n Glyph.renderGlyph(ctx, topX - 5, topY, 40, 'bracketTop');\n Glyph.renderGlyph(ctx, topX - 5, botY, 40, 'bracketBottom');\n topX -= this.width + 2;\n break;\n case StaveConnector.type.BOLD_DOUBLE_LEFT:\n drawBoldDoubleLine(ctx, this.type, topX + this.x_shift, topY, botY - this.thickness);\n break;\n case StaveConnector.type.BOLD_DOUBLE_RIGHT:\n drawBoldDoubleLine(ctx, this.type, topX, topY, botY - this.thickness);\n break;\n case StaveConnector.type.THIN_DOUBLE:\n width = 1;\n attachment_height -= this.thickness;\n break;\n case StaveConnector.type.NONE:\n break;\n default:\n throw new RuntimeError('InvalidType', `The provided StaveConnector.type (${this.type}) is invalid.`);\n }\n if (this.type !== StaveConnector.type.BRACE &&\n this.type !== StaveConnector.type.BOLD_DOUBLE_LEFT &&\n this.type !== StaveConnector.type.BOLD_DOUBLE_RIGHT &&\n this.type !== StaveConnector.type.NONE) {\n ctx.fillRect(topX, topY, width, attachment_height);\n }\n // If the connector is a thin double barline, draw the paralell line\n if (this.type === StaveConnector.type.THIN_DOUBLE) {\n ctx.fillRect(topX - 3, topY, width, attachment_height);\n }\n ctx.save();\n ctx.setLineWidth(2);\n ctx.setFont(this.textFont);\n // Add stave connector text\n for (let i = 0; i < this.texts.length; i++) {\n const text = this.texts[i];\n const text_width = ctx.measureText('' + text.content).width;\n const x = this.top_stave.getX() - text_width - 24 + text.options.shift_x;\n const y = (this.top_stave.getYForLine(0) + this.bottom_stave.getBottomLineY()) / 2 + text.options.shift_y;\n ctx.fillText('' + text.content, x, y + 4);\n }\n ctx.restore();\n }\n}\nStaveConnector.TEXT_FONT = {\n family: Font.SERIF,\n size: 16,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n/**\n * SINGLE_LEFT and SINGLE are the same value for compatibility\n * with older versions of vexflow which didn't have right sided\n * stave connectors.\n */\nStaveConnector.type = {\n SINGLE_RIGHT: 0,\n SINGLE_LEFT: 1,\n SINGLE: 1,\n DOUBLE: 2,\n BRACE: 3,\n BRACKET: 4,\n BOLD_DOUBLE_LEFT: 5,\n BOLD_DOUBLE_RIGHT: 6,\n THIN_DOUBLE: 7,\n NONE: 8,\n};\n/**\n * Connector type:\n * * \"singleRight\"\n * * \"singleLeft\"\n * * \"single\"\n * * \"double\"\n * * \"brace\"\n * * \"bracket\"\n * * \"boldDoubleLeft\"\n * * \"boldDoubleRight\"\n * * \"thinDouble\"\n * * \"none\"\n */\nStaveConnector.typeString = {\n singleRight: StaveConnector.type.SINGLE_RIGHT,\n singleLeft: StaveConnector.type.SINGLE_LEFT,\n single: StaveConnector.type.SINGLE,\n double: StaveConnector.type.DOUBLE,\n brace: StaveConnector.type.BRACE,\n bracket: StaveConnector.type.BRACKET,\n boldDoubleLeft: StaveConnector.type.BOLD_DOUBLE_LEFT,\n boldDoubleRight: StaveConnector.type.BOLD_DOUBLE_RIGHT,\n thinDouble: StaveConnector.type.THIN_DOUBLE,\n none: StaveConnector.type.NONE,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Beam } from './beam';\nimport { Font } from './font';\nimport { Fraction } from './fraction';\nimport { ModifierContext } from './modifiercontext';\nimport { Stave } from './stave';\nimport { StaveConnector } from './staveconnector';\nimport { Tables } from './tables';\nimport { TickContext } from './tickcontext';\nimport { isNote, isStaveNote } from './typeguard';\nimport { defined, log, midLine, RuntimeError } from './util';\nimport { Voice } from './voice';\n// Helper function\nconst sumArray = (arr) => arr.reduce((a, b) => a + b, 0);\n/**\n * Create `Alignment`s for each tick in `voices`. Also calculate the\n * total number of ticks in voices.\n */\nfunction createContexts(voices, makeContext, addToContext) {\n const resolutionMultiplier = Formatter.getResolutionMultiplier(voices);\n // Initialize tick maps.\n const tickToContextMap = {};\n const tickList = [];\n const contexts = [];\n // For each voice, extract notes and create a context for every\n // new tick that hasn't been seen before.\n voices.forEach((voice, voiceIndex) => {\n // Use resolution multiplier as denominator so that no additional expansion\n // of fractional tick values is needed.\n const ticksUsed = new Fraction(0, resolutionMultiplier);\n voice.getTickables().forEach((tickable) => {\n const integerTicks = ticksUsed.numerator;\n // If we have no tick context for this tick, create one.\n if (!tickToContextMap[integerTicks]) {\n const newContext = makeContext({ tickID: integerTicks });\n contexts.push(newContext);\n tickToContextMap[integerTicks] = newContext;\n // Maintain a list of unique integerTicks.\n tickList.push(integerTicks);\n }\n // Add this tickable to the TickContext.\n addToContext(tickable, tickToContextMap[integerTicks], voiceIndex);\n ticksUsed.add(tickable.getTicks());\n });\n });\n return {\n map: tickToContextMap,\n array: contexts,\n list: tickList.sort((a, b) => a - b),\n resolutionMultiplier,\n };\n}\n// eslint-disable-next-line\nfunction L(...args) {\n if (Formatter.DEBUG)\n log('Vex.Flow.Formatter', args);\n}\n/**\n * Get the rest line number of the next non-rest note(s).\n * @param notes array of Notes\n * @param currRestLine\n * @param currNoteIndex current note index\n * @param compare if true, return the midpoint between the current rest line and the next rest line\n * @returns a line number, which determines the vertical position of a rest.\n */\nfunction getRestLineForNextNoteGroup(notes, currRestLine, currNoteIndex, compare) {\n // If no valid next note group, nextRestLine is same as current.\n let nextRestLine = currRestLine;\n // Start with the next note and keep going until we find a valid non-rest note group.\n for (let noteIndex = currNoteIndex + 1; noteIndex < notes.length; noteIndex++) {\n const note = notes[noteIndex];\n if (isNote(note) && !note.isRest() && !note.shouldIgnoreTicks()) {\n nextRestLine = note.getLineForRest();\n break;\n }\n }\n // Locate the mid point between two lines.\n if (compare && currRestLine !== nextRestLine) {\n const top = Math.max(currRestLine, nextRestLine);\n const bot = Math.min(currRestLine, nextRestLine);\n nextRestLine = midLine(top, bot);\n }\n return nextRestLine;\n}\n/**\n * Format implements the formatting and layout algorithms that are used\n * to position notes in a voice. The algorithm can align multiple voices both\n * within a stave, and across multiple staves.\n *\n * To do this, the formatter breaks up voices into a grid of rational-valued\n * `ticks`, to which each note is assigned. Then, minimum widths are assigned\n * to each tick based on the widths of the notes and modifiers in that tick. This\n * establishes the smallest amount of space required for each tick.\n *\n * Finally, the formatter distributes the left over space proportionally to\n * all the ticks, setting the `x` values of the notes in each tick.\n *\n * See `tests/formatter_tests.ts` for usage examples. The helper functions included\n * here (`FormatAndDraw`, `FormatAndDrawTab`) also serve as useful usage examples.\n */\nexport class Formatter {\n constructor(options) {\n this.formatterOptions = Object.assign({ globalSoftmax: false, softmaxFactor: 100, maxIterations: 5 }, options);\n this.justifyWidth = 0;\n this.totalCost = 0;\n this.totalShift = 0;\n this.durationStats = {};\n // Minimum width required to render all the notes in the voices.\n this.minTotalWidth = 0;\n // This is set to `true` after `minTotalWidth` is calculated.\n this.hasMinTotalWidth = false;\n // Arrays of tick and modifier contexts.\n this.tickContexts = undefined;\n this.modifierContexts = undefined;\n // Gaps between contexts, for free movement of notes post\n // formatting.\n this.contextGaps = {\n total: 0,\n gaps: [],\n };\n this.voices = [];\n this.lossHistory = [];\n }\n /**\n * Helper function to layout \"notes\" one after the other without\n * regard for proportions. Useful for tests and debugging.\n */\n static SimpleFormat(notes, x = 0, { paddingBetween = 10 } = {}) {\n notes.reduce((accumulator, note) => {\n note.addToModifierContext(new ModifierContext());\n const tick = new TickContext().addTickable(note).preFormat();\n const metrics = tick.getMetrics();\n tick.setX(accumulator + metrics.totalLeftPx);\n return accumulator + tick.getWidth() + metrics.totalRightPx + paddingBetween;\n }, x);\n }\n /** Helper function to plot formatter debug info. */\n static plotDebugging(ctx, formatter, xPos, y1, y2, options) {\n options = Object.assign({ stavePadding: Tables.currentMusicFont().lookupMetric('stave.padding') }, options);\n const x = xPos + options.stavePadding;\n const contextGaps = formatter.contextGaps;\n function stroke(x1, x2, color) {\n ctx.beginPath();\n ctx.setStrokeStyle(color);\n ctx.setFillStyle(color);\n ctx.setLineWidth(1);\n ctx.fillRect(x1, y1, Math.max(x2 - x1, 0), y2 - y1);\n }\n ctx.save();\n ctx.setFont(Font.SANS_SERIF, 8);\n contextGaps.gaps.forEach((gap) => {\n stroke(x + gap.x1, x + gap.x2, 'rgba(100,200,100,0.4)');\n ctx.setFillStyle('green');\n ctx.fillText(Math.round(gap.x2 - gap.x1).toString(), x + gap.x1, y2 + 12);\n });\n ctx.setFillStyle('red');\n ctx.fillText(`Loss: ${(formatter.totalCost || 0).toFixed(2)} Shift: ${(formatter.totalShift || 0).toFixed(2)} Gap: ${contextGaps.total.toFixed(2)}`, x - 20, y2 + 27);\n ctx.restore();\n }\n /**\n * Helper function to format and draw a single voice. Returns a bounding\n * box for the notation.\n * @param ctx the rendering context\n * @param stave the stave to which to draw (`Stave` or `TabStave`)\n * @param notes array of `Note` instances (`Note`, `TextNote`, `TabNote`, etc.)\n * @param params one of below:\n * * Setting `autobeam` only `(context, stave, notes, true)` or\n * `(ctx, stave, notes, {autobeam: true})`\n * * Setting `align_rests` a struct is needed `(context, stave, notes, {align_rests: true})`\n * * Setting both a struct is needed `(context, stave, notes, {\n * autobeam: true, align_rests: true})`\n * * `autobeam` automatically generates beams for the notes.\n * * `align_rests` aligns rests with nearby notes.\n */\n static FormatAndDraw(ctx, stave, notes, params) {\n let options = {\n auto_beam: false,\n align_rests: false,\n };\n if (typeof params === 'object') {\n options = Object.assign(Object.assign({}, options), params);\n }\n else if (typeof params === 'boolean') {\n options.auto_beam = params;\n }\n // Start by creating a voice and adding all the notes to it.\n const voice = new Voice(Tables.TIME4_4).setMode(Voice.Mode.SOFT).addTickables(notes);\n // Then create beams, if requested.\n const beams = options.auto_beam ? Beam.applyAndGetBeams(voice) : [];\n // Instantiate a `Formatter` and format the notes.\n new Formatter()\n .joinVoices([voice]) // , { align_rests: options.align_rests })\n .formatToStave([voice], stave, { align_rests: options.align_rests, stave });\n // Render the voice and beams to the stave.\n voice.setStave(stave).draw(ctx, stave);\n beams.forEach((beam) => beam.setContext(ctx).draw());\n // Return the bounding box of the voice.\n return voice.getBoundingBox();\n }\n /**\n * Helper function to format and draw aligned tab and stave notes in two\n * separate staves.\n * @param ctx the rendering context\n * @param tabstave a `TabStave` instance on which to render `TabNote`s.\n * @param stave a `Stave` instance on which to render `Note`s.\n * @param notes array of `Note` instances for the stave (`Note`, `BarNote`, etc.)\n * @param tabnotes array of `Note` instances for the tab stave (`TabNote`, `BarNote`, etc.)\n * @param autobeam automatically generate beams.\n * @param params a configuration object:\n * * `autobeam` automatically generates beams for the notes.\n * * `align_rests` aligns rests with nearby notes.\n */\n static FormatAndDrawTab(ctx, tabstave, stave, tabnotes, notes, autobeam, params) {\n let opts = {\n auto_beam: autobeam,\n align_rests: false,\n };\n if (typeof params === 'object') {\n opts = Object.assign(Object.assign({}, opts), params);\n }\n else if (typeof params === 'boolean') {\n opts.auto_beam = params;\n }\n // Create a `4/4` voice for `notes`.\n const notevoice = new Voice(Tables.TIME4_4).setMode(Voice.Mode.SOFT).addTickables(notes);\n // Create a `4/4` voice for `tabnotes`.\n const tabvoice = new Voice(Tables.TIME4_4).setMode(Voice.Mode.SOFT).addTickables(tabnotes);\n // Then create beams, if requested.\n const beams = opts.auto_beam ? Beam.applyAndGetBeams(notevoice) : [];\n // Instantiate a `Formatter` and align tab and stave notes.\n new Formatter()\n .joinVoices([notevoice]) // , { align_rests: opts.align_rests })\n .joinVoices([tabvoice])\n .formatToStave([notevoice, tabvoice], stave, { align_rests: opts.align_rests });\n // Render voices and beams to staves.\n notevoice.draw(ctx, stave);\n tabvoice.draw(ctx, tabstave);\n beams.forEach((beam) => beam.setContext(ctx).draw());\n // Draw a connector between tab and note staves.\n new StaveConnector(stave, tabstave).setContext(ctx).draw();\n }\n /**\n * Automatically set the vertical position of rests based on previous/next note positions.\n * @param tickables an array of Tickables.\n * @param alignAllNotes If `false`, only align rests that are within a group of beamed notes.\n * @param alignTuplets If `false`, ignores tuplets.\n */\n static AlignRestsToNotes(tickables, alignAllNotes, alignTuplets) {\n tickables.forEach((currTickable, index) => {\n if (isStaveNote(currTickable) && currTickable.isRest()) {\n if (currTickable.getTuplet() && !alignTuplets) {\n return;\n }\n // If activated rests not on default can be rendered as specified.\n const position = currTickable.getGlyph().position.toUpperCase();\n if (position !== 'R/4' && position !== 'B/4') {\n return;\n }\n if (alignAllNotes || currTickable.getBeam()) {\n // Align rests with previous/next notes.\n const props = currTickable.getKeyProps()[0];\n if (index === 0) {\n props.line = getRestLineForNextNoteGroup(tickables, props.line, index, false);\n }\n else if (index > 0 && index < tickables.length) {\n // If previous tickable is a rest, use its line number.\n const prevTickable = tickables[index - 1];\n if (isStaveNote(prevTickable)) {\n if (prevTickable.isRest()) {\n props.line = prevTickable.getKeyProps()[0].line;\n }\n else {\n const restLine = prevTickable.getLineForRest();\n // Get the rest line for next valid non-rest note group.\n props.line = getRestLineForNextNoteGroup(tickables, restLine, index, true);\n }\n }\n }\n currTickable.setKeyLine(0, props.line);\n }\n }\n });\n }\n /**\n * Find all the rests in each of the `voices` and align them to neighboring notes.\n *\n * @param voices\n * @param alignAllNotes If `false`, only align rests within beamed groups of notes. If `true`, align all rests.\n */\n alignRests(voices, alignAllNotes) {\n if (!voices || !voices.length) {\n throw new RuntimeError('BadArgument', 'No voices to format rests');\n }\n voices.forEach((voice) => Formatter.AlignRestsToNotes(voice.getTickables(), alignAllNotes));\n }\n /**\n * Estimate the width required to render 'voices'. This is done by:\n * 1. Sum the widths of all the tick contexts\n * 2. Estimate the padding.\n * The latter is done by calculating the padding 3 different ways, and taking the\n * greatest value:\n * 1. the padding required for unaligned notes in different voices\n * 2. the padding based on the stddev of the tickable widths\n * 3. the padding based on the stddev of the tickable durations.\n *\n * The last 2 quantities estimate a 'width entropy', where notes might need more\n * room than the proportional formatting gives them. A measure of all same duration\n * and width will need no extra padding, and all these quantities will be\n * zero in that case.\n *\n * @param voices the voices that contain the notes\n * @returns the estimated width in pixels\n */\n preCalculateMinTotalWidth(voices) {\n const unalignedPadding = Tables.currentMusicFont().lookupMetric('stave.unalignedNotePadding');\n // Calculate additional padding based on 3 methods:\n // 1) unaligned beats in voices, 2) variance of width, 3) variance of durations\n let unalignedCtxCount = 0;\n let wsum = 0;\n let dsum = 0;\n const widths = [];\n const durations = [];\n // Cache results.\n if (this.hasMinTotalWidth)\n return this.minTotalWidth;\n // Create tick contexts if not already created.\n if (!this.tickContexts) {\n if (!voices) {\n throw new RuntimeError('BadArgument', \"'voices' required to run preCalculateMinTotalWidth\");\n }\n this.createTickContexts(voices);\n }\n // eslint-disable-next-line\n const { list: contextList, map: contextMap } = this.tickContexts;\n this.minTotalWidth = 0;\n // Go through each tick context and calculate total width,\n // and also accumulate values used in padding hints\n contextList.forEach((tick) => {\n const context = contextMap[tick];\n context.preFormat();\n // If this TC doesn't have all the voices on it, it's unaligned.\n // so increment the unaligned padding accumulator\n if (context.getTickables().length < voices.length) {\n unalignedCtxCount += 1;\n }\n // Calculate the 'width entropy' over all the Tickables.\n context.getTickables().forEach((t) => {\n wsum += t.getMetrics().width;\n dsum += t.getTicks().value();\n widths.push(t.getMetrics().width);\n durations.push(t.getTicks().value());\n });\n const width = context.getWidth();\n this.minTotalWidth += width;\n });\n this.hasMinTotalWidth = true;\n // normalized (0-1) STDDEV of widths/durations gives us padding hints.\n const wavg = wsum > 0 ? wsum / widths.length : 1 / widths.length;\n const wvar = sumArray(widths.map((ll) => Math.pow(ll - wavg, 2)));\n const wpads = Math.pow(wvar / widths.length, 0.5) / wavg;\n const davg = dsum / durations.length;\n const dvar = sumArray(durations.map((ll) => Math.pow(ll - davg, 2)));\n const dpads = Math.pow(dvar / durations.length, 0.5) / davg;\n // Find max of 3 methods pad the width with that\n const padmax = Math.max(dpads, wpads) * contextList.length * unalignedPadding;\n const unalignedPad = unalignedPadding * unalignedCtxCount;\n return this.minTotalWidth + Math.max(unalignedPad, padmax);\n }\n /**\n * Get minimum width required to render all voices. Either `format` or\n * `preCalculateMinTotalWidth` must be called before this method.\n */\n getMinTotalWidth() {\n if (!this.hasMinTotalWidth) {\n throw new RuntimeError('NoMinTotalWidth', \"Call 'preCalculateMinTotalWidth' or 'preFormat' before calling 'getMinTotalWidth'\");\n }\n return this.minTotalWidth;\n }\n /** Calculate the resolution multiplier for `voices`. */\n static getResolutionMultiplier(voices) {\n if (!voices || !voices.length) {\n throw new RuntimeError('BadArgument', 'No voices to format');\n }\n const totalTicks = voices[0].getTotalTicks();\n const resolutionMultiplier = voices.reduce((accumulator, voice) => {\n if (!voice.getTotalTicks().equals(totalTicks)) {\n throw new RuntimeError('TickMismatch', 'Voices should have same total note duration in ticks.');\n }\n if (voice.getMode() === Voice.Mode.STRICT && !voice.isComplete()) {\n throw new RuntimeError('IncompleteVoice', 'Voice does not have enough notes.');\n }\n return Math.max(accumulator, Fraction.LCM(accumulator, voice.getResolutionMultiplier()));\n }, 1);\n return resolutionMultiplier;\n }\n /** Create a `ModifierContext` for each tick in `voices`. */\n createModifierContexts(voices) {\n const fn = (tickable, context) => tickable.addToModifierContext(context);\n const contexts = createContexts(voices, () => new ModifierContext(), fn);\n this.modifierContexts = contexts;\n return contexts;\n }\n /**\n * Create a `TickContext` for each tick in `voices`. Also calculate the\n * total number of ticks in voices.\n */\n createTickContexts(voices) {\n const fn = (tickable, context, voiceIndex) => context.addTickable(tickable, voiceIndex);\n const contexts = createContexts(voices, (tick) => new TickContext(tick), fn);\n this.tickContexts = contexts;\n const contextArray = this.tickContexts.array;\n contextArray.forEach((context) => {\n context.tContexts = contextArray;\n });\n return contexts;\n }\n /**\n * This is the core formatter logic. Format voices and justify them\n * to `justifyWidth` pixels. `renderingContext` is required to justify elements\n * that can't retreive widths without a canvas. This method sets the `x` positions\n * of all the tickables/notes in the formatter.\n */\n preFormat(justifyWidth = 0, renderingContext, voicesParam, stave) {\n // Initialize context maps.\n const contexts = this.tickContexts;\n if (!contexts) {\n throw new RuntimeError('NoTickContexts', 'preFormat requires TickContexts');\n }\n const { list: contextList, map: contextMap } = contexts;\n // Reset loss history for evaluator.\n this.lossHistory = [];\n // If voices and a stave were provided, set the Stave for each voice\n // and preFormat to apply Y values to the notes;\n if (voicesParam && stave) {\n voicesParam.forEach((voice) => voice.setStave(stave).preFormat());\n }\n // Now distribute the ticks to each tick context, and assign them their\n // own X positions.\n let x = 0;\n let shift = 0;\n this.minTotalWidth = 0;\n let totalTicks = 0;\n // Pass 1: Give each note maximum width requested by context.\n contextList.forEach((tick) => {\n const context = contextMap[tick];\n // Make sure that all tickables in this context have calculated their\n // space requirements.\n context.preFormat();\n const width = context.getWidth();\n this.minTotalWidth += width;\n const maxTicks = context.getMaxTicks().value();\n totalTicks += maxTicks;\n const metrics = context.getMetrics();\n x = x + shift + metrics.totalLeftPx;\n context.setX(x);\n // Calculate shift for the next tick.\n shift = width - metrics.totalLeftPx;\n });\n // Use softmax based on all notes across all staves. (options.globalSoftmax)\n const { globalSoftmax, softmaxFactor, maxIterations } = this.formatterOptions;\n const exp = (tick) => Math.pow(softmaxFactor, (contextMap[tick].getMaxTicks().value() / totalTicks));\n const expTicksUsed = sumArray(contextList.map(exp));\n this.minTotalWidth = x + shift;\n this.hasMinTotalWidth = true;\n // No justification needed. End formatting.\n if (justifyWidth <= 0)\n return this.evaluate();\n // Start justification. Subtract the right extra pixels of the final context because the formatter\n // justifies based on the context's X position, which is the left-most part of the note head.\n const firstContext = contextMap[contextList[0]];\n const lastContext = contextMap[contextList[contextList.length - 1]];\n // Calculate the \"distance error\" between the tick contexts. The expected distance is the spacing proportional to\n // the softmax of the ticks.\n function calculateIdealDistances(adjustedJustifyWidth) {\n const distances = contextList.map((tick, i) => {\n const context = contextMap[tick];\n const voices = context.getTickablesByVoice();\n let backTickable;\n if (i > 0) {\n const prevContext = contextMap[contextList[i - 1]];\n // Go through each tickable and search backwards for another tickable\n // in the same voice. If found, use that duration (ticks) to calculate\n // the expected distance.\n for (let j = i - 1; j >= 0; j--) {\n const backTick = contextMap[contextList[j]];\n const backVoices = backTick.getTickablesByVoice();\n // Look for matching voices between tick contexts.\n const matchingVoices = [];\n Object.keys(voices).forEach((v) => {\n if (backVoices[v]) {\n matchingVoices.push(v);\n }\n });\n if (matchingVoices.length > 0) {\n // Found matching voices, get largest duration\n let maxTicks = 0;\n let maxNegativeShiftPx = Infinity;\n let expectedDistance = 0;\n matchingVoices.forEach((v) => {\n const ticks = backVoices[v].getTicks().value();\n if (ticks > maxTicks) {\n backTickable = backVoices[v];\n maxTicks = ticks;\n }\n // Calculate the limits of the shift based on modifiers, etc.\n const thisTickable = voices[v];\n const insideLeftEdge = thisTickable.getX() -\n (thisTickable.getMetrics().modLeftPx + thisTickable.getMetrics().leftDisplacedHeadPx);\n const backMetrics = backVoices[v].getMetrics();\n const insideRightEdge = backVoices[v].getX() + backMetrics.notePx + backMetrics.modRightPx + backMetrics.rightDisplacedHeadPx;\n // Don't allow shifting if notes in the same voice can collide\n maxNegativeShiftPx = Math.min(maxNegativeShiftPx, insideLeftEdge - insideRightEdge);\n });\n // Don't shift further left than the notehead of the last context. Actually, stay at most 5% to the right\n // so that two different tick contexts don't align across staves.\n maxNegativeShiftPx = Math.min(maxNegativeShiftPx, context.getX() - (prevContext.getX() + adjustedJustifyWidth * 0.05));\n // Calculate the expected distance of the current context from the last matching tickable. The\n // distance is scaled down by the softmax for the voice.\n if (globalSoftmax) {\n const t = totalTicks;\n expectedDistance = (Math.pow(softmaxFactor, (maxTicks / t)) / expTicksUsed) * adjustedJustifyWidth;\n }\n else if (typeof backTickable !== 'undefined') {\n expectedDistance = backTickable.getVoice().softmax(maxTicks) * adjustedJustifyWidth;\n }\n return {\n expectedDistance,\n maxNegativeShiftPx,\n fromTickable: backTickable,\n };\n }\n }\n }\n return { expectedDistance: 0, fromTickablePx: 0, maxNegativeShiftPx: 0 };\n });\n return distances;\n }\n function shiftToIdealDistances(idealDistances) {\n // Distribute ticks to the contexts based on the calculated distance error.\n const centerX = adjustedJustifyWidth / 2;\n let spaceAccum = 0;\n contextList.forEach((tick, index) => {\n const context = contextMap[tick];\n if (index > 0) {\n const contextX = context.getX();\n const ideal = idealDistances[index];\n const errorPx = defined(ideal.fromTickable).getX() + ideal.expectedDistance - (contextX + spaceAccum);\n let negativeShiftPx = 0;\n if (errorPx > 0) {\n spaceAccum += errorPx;\n }\n else if (errorPx < 0) {\n negativeShiftPx = Math.min(ideal.maxNegativeShiftPx, Math.abs(errorPx));\n spaceAccum += -negativeShiftPx;\n }\n context.setX(contextX + spaceAccum);\n }\n // Move center aligned tickables to middle\n context.getCenterAlignedTickables().forEach((tickable) => {\n tickable.setCenterXShift(centerX - context.getX());\n });\n });\n return lastContext.getX() - firstContext.getX();\n }\n const adjustedJustifyWidth = justifyWidth -\n lastContext.getMetrics().notePx -\n lastContext.getMetrics().totalRightPx -\n firstContext.getMetrics().totalLeftPx;\n const musicFont = Tables.currentMusicFont();\n const configMinPadding = musicFont.lookupMetric('stave.endPaddingMin');\n const configMaxPadding = musicFont.lookupMetric('stave.endPaddingMax');\n let targetWidth = adjustedJustifyWidth;\n const distances = calculateIdealDistances(targetWidth);\n let actualWidth = shiftToIdealDistances(distances);\n // Calculate right justification by finding max of (configured value, min distance between tickables)\n // so measures with lots of white space use it evenly, and crowded measures use at least the configured\n // space.\n const calcMinDistance = (targetWidth, distances) => {\n let mdCalc = targetWidth / 2;\n if (distances.length > 1) {\n for (let di = 1; di < distances.length; ++di) {\n mdCalc = Math.min(distances[di].expectedDistance / 2, mdCalc);\n }\n }\n return mdCalc;\n };\n const minDistance = calcMinDistance(targetWidth, distances);\n // Just one context. Done formatting.\n if (contextList.length === 1)\n return 0;\n // right justify to either the configured padding, or the min distance between notes, whichever is greatest.\n // This * 2 keeps the existing formatting unless there is 'a lot' of extra whitespace, which won't break\n // existing visual regression tests.\n const paddingMax = configMaxPadding * 2 < minDistance ? minDistance : configMaxPadding;\n const paddingMin = paddingMax - (configMaxPadding - configMinPadding);\n const maxX = adjustedJustifyWidth - paddingMin;\n let iterations = maxIterations;\n // Adjust justification width until the right margin is as close as possible to the calculated padding,\n // without going over\n while ((actualWidth > maxX && iterations > 0) || (actualWidth + paddingMax < maxX && iterations > 1)) {\n targetWidth -= actualWidth - maxX;\n actualWidth = shiftToIdealDistances(calculateIdealDistances(targetWidth));\n iterations--;\n }\n this.justifyWidth = justifyWidth;\n return this.evaluate();\n }\n /** Calculate the total cost of this formatting decision. */\n evaluate() {\n if (!this.tickContexts)\n return 0;\n const contexts = this.tickContexts;\n const justifyWidth = this.justifyWidth;\n // Calculate available slack per tick context. This works out how much freedom\n // to move a context has in either direction, without affecting other notes.\n this.contextGaps = { total: 0, gaps: [] };\n contexts.list.forEach((tick, index) => {\n if (index === 0)\n return;\n const prevTick = contexts.list[index - 1];\n const prevContext = contexts.map[prevTick];\n const context = contexts.map[tick];\n const prevMetrics = prevContext.getMetrics();\n const currMetrics = context.getMetrics();\n // Calculate X position of right edge of previous note\n const insideRightEdge = prevContext.getX() + prevMetrics.notePx + prevMetrics.totalRightPx;\n // Calculate X position of left edge of current note\n const insideLeftEdge = context.getX() - currMetrics.totalLeftPx;\n const gap = insideLeftEdge - insideRightEdge;\n this.contextGaps.total += gap;\n this.contextGaps.gaps.push({ x1: insideRightEdge, x2: insideLeftEdge });\n // Tell the tick contexts how much they can reposition themselves.\n context.getFormatterMetrics().freedom.left = gap;\n prevContext.getFormatterMetrics().freedom.right = gap;\n });\n // Calculate mean distance in each voice for each duration type, then calculate\n // how far each note is from the mean.\n this.durationStats = {};\n const durationStats = this.durationStats;\n function updateStats(duration, space) {\n const stats = durationStats[duration];\n if (stats === undefined) {\n durationStats[duration] = { mean: space, count: 1 };\n }\n else {\n stats.count += 1;\n stats.mean = (stats.mean + space) / 2;\n }\n }\n this.voices.forEach((voice) => {\n voice.getTickables().forEach((note, i, notes) => {\n const duration = note.getTicks().clone().simplify().toString();\n const metrics = note.getMetrics();\n const formatterMetrics = note.getFormatterMetrics();\n const leftNoteEdge = note.getX() + metrics.notePx + metrics.modRightPx + metrics.rightDisplacedHeadPx;\n let space = 0;\n if (i < notes.length - 1) {\n const rightNote = notes[i + 1];\n const rightMetrics = rightNote.getMetrics();\n const rightNoteEdge = rightNote.getX() - rightMetrics.modLeftPx - rightMetrics.leftDisplacedHeadPx;\n space = rightNoteEdge - leftNoteEdge;\n formatterMetrics.space.used = rightNote.getX() - note.getX();\n rightNote.getFormatterMetrics().freedom.left = space;\n }\n else {\n space = justifyWidth - leftNoteEdge;\n formatterMetrics.space.used = justifyWidth - note.getX();\n }\n formatterMetrics.freedom.right = space;\n updateStats(duration, formatterMetrics.space.used);\n });\n });\n // Calculate how much each note deviates from the mean. Loss function is square\n // root of the sum of squared deviations.\n let totalDeviation = 0;\n this.voices.forEach((voice) => {\n voice.getTickables().forEach((note) => {\n const duration = note.getTicks().clone().simplify().toString();\n const metrics = note.getFormatterMetrics();\n metrics.space.mean = durationStats[duration].mean;\n metrics.duration = duration;\n metrics.iterations += 1;\n metrics.space.deviation = metrics.space.used - metrics.space.mean;\n totalDeviation += Math.pow(metrics.space.deviation, 2);\n });\n });\n this.totalCost = Math.sqrt(totalDeviation);\n this.lossHistory.push(this.totalCost);\n return this.totalCost;\n }\n /**\n * Run a single iteration of rejustification. At a high level, this method calculates\n * the overall \"loss\" (or cost) of this layout, and repositions tickcontexts in an\n * attempt to reduce the cost. You can call this method multiple times until it finds\n * and oscillates around a global minimum.\n * @param alpha the \"learning rate\" for the formatter. It determines how much of a shift\n * the formatter should make based on its cost function.\n */\n tune(options) {\n var _a;\n const contexts = this.tickContexts;\n if (!contexts) {\n return 0;\n }\n const alpha = (_a = options === null || options === void 0 ? void 0 : options.alpha) !== null && _a !== void 0 ? _a : 0.5;\n // Move `current` tickcontext by `shift` pixels, and adjust the freedom\n // on adjacent tickcontexts.\n function move(current, shift, prev, next) {\n current.setX(current.getX() + shift);\n current.getFormatterMetrics().freedom.left += shift;\n current.getFormatterMetrics().freedom.right -= shift;\n if (prev)\n prev.getFormatterMetrics().freedom.right += shift;\n if (next)\n next.getFormatterMetrics().freedom.left -= shift;\n }\n let shift = 0;\n this.totalShift = 0;\n contexts.list.forEach((tick, index, list) => {\n const context = contexts.map[tick];\n const prevContext = index > 0 ? contexts.map[list[index - 1]] : undefined;\n const nextContext = index < list.length - 1 ? contexts.map[list[index + 1]] : undefined;\n move(context, shift, prevContext, nextContext);\n const cost = -sumArray(context.getTickables().map((t) => t.getFormatterMetrics().space.deviation));\n if (cost > 0) {\n shift = -Math.min(context.getFormatterMetrics().freedom.right, Math.abs(cost));\n }\n else if (cost < 0) {\n if (nextContext) {\n shift = Math.min(nextContext.getFormatterMetrics().freedom.right, Math.abs(cost));\n }\n else {\n shift = 0;\n }\n }\n shift *= alpha;\n this.totalShift += shift;\n });\n return this.evaluate();\n }\n /**\n * This is the top-level call for all formatting logic completed\n * after `x` *and* `y` values have been computed for the notes\n * in the voices.\n */\n postFormat() {\n const postFormatContexts = (contexts) => contexts.list.forEach((tick) => contexts.map[tick].postFormat());\n if (this.modifierContexts)\n postFormatContexts(this.modifierContexts);\n if (this.tickContexts)\n postFormatContexts(this.tickContexts);\n return this;\n }\n /**\n * Take all `voices` and create `ModifierContext`s out of them. This tells\n * the formatters that the voices belong on a single stave.\n */\n joinVoices(voices) {\n this.createModifierContexts(voices);\n this.hasMinTotalWidth = false;\n return this;\n }\n /**\n * Align rests in voices, justify the contexts, and position the notes\n * so voices are aligned and ready to render onto the stave. This method\n * mutates the `x` positions of all tickables in `voices`.\n *\n * Voices are full justified to fit in `justifyWidth` pixels.\n *\n * Set `options.context` to the rendering context. Set `options.align_rests`\n * to true to enable rest alignment.\n */\n format(voices, justifyWidth, options) {\n const opts = Object.assign({ align_rests: false }, options);\n this.voices = voices;\n const softmaxFactor = this.formatterOptions.softmaxFactor;\n if (softmaxFactor) {\n this.voices.forEach((v) => v.setSoftmaxFactor(softmaxFactor));\n }\n this.alignRests(voices, opts.align_rests);\n this.createTickContexts(voices);\n this.preFormat(justifyWidth, opts.context, voices, opts.stave);\n // Only postFormat if a stave was supplied for y value formatting\n if (opts.stave)\n this.postFormat();\n return this;\n }\n // This method is just like `format` except that the `justifyWidth` is inferred from the `stave`.\n formatToStave(voices, stave, optionsParam) {\n const options = Object.assign({ context: stave.getContext() }, optionsParam);\n // eslint-disable-next-line\n const justifyWidth = stave.getNoteEndX() - stave.getNoteStartX() - Stave.defaultPadding;\n L('Formatting voices to width: ', justifyWidth);\n return this.format(voices, justifyWidth, options);\n }\n getTickContext(tick) {\n var _a;\n return (_a = this.tickContexts) === null || _a === void 0 ? void 0 : _a.map[tick];\n }\n}\n// To enable logging for this class. Set `Vex.Flow.Formatter.DEBUG` to `true`.\nFormatter.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n/**\n * ## Description\n *\n * Create a new tuplet from the specified notes. The notes must\n * be part of the same voice. If they are of different rhythmic\n * values, then options.num_notes must be set.\n *\n * @constructor\n * @param {Array.} A set of notes: staveNotes,\n * notes, etc... any class that inherits stemmableNote at some\n * point in its prototype chain.\n * @param options: object {\n *\n * num_notes: fit this many notes into...\n * notes_occupied: ...the space of this many notes\n *\n * Together, these two properties make up the tuplet ratio\n * in the form of num_notes : notes_occupied.\n * num_notes defaults to the number of notes passed in, so\n * it is important that if you omit this property, all of\n * the notes passed should be of the same note value.\n * notes_occupied defaults to 2 -- so you should almost\n * certainly pass this parameter for anything other than\n * a basic triplet.\n *\n * location:\n * default 1, which is above the notes: ┌─── 3 ───┐\n * -1 is below the notes └─── 3 ───┘\n *\n * bracketed: boolean, draw a bracket around the tuplet number\n * when true: ┌─── 3 ───┐ when false: 3\n * defaults to true if notes are not beamed, false otherwise\n *\n * ratioed: boolean\n * when true: ┌─── 7:8 ───┐, when false: ┌─── 7 ───┐\n * defaults to true if the difference between num_notes and\n * notes_occupied is greater than 1.\n *\n * y_offset: int, default 0\n * manually offset a tuplet, for instance to avoid collisions\n * with articulations, etc...\n * }\n */\nimport { Element } from './element';\nimport { Formatter } from './formatter';\nimport { Glyph } from './glyph';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nexport var TupletLocation;\n(function (TupletLocation) {\n TupletLocation[TupletLocation[\"BOTTOM\"] = -1] = \"BOTTOM\";\n TupletLocation[TupletLocation[\"TOP\"] = 1] = \"TOP\";\n})(TupletLocation || (TupletLocation = {}));\nexport class Tuplet extends Element {\n constructor(notes, options = {}) {\n super();\n this.numerator_glyphs = [];\n this.denom_glyphs = [];\n if (!notes || !notes.length) {\n throw new RuntimeError('BadArguments', 'No notes provided for tuplet.');\n }\n this.options = options;\n this.notes = notes;\n this.num_notes = this.options.num_notes != undefined ? this.options.num_notes : notes.length;\n // We accept beats_occupied, but warn that it's deprecated:\n // the preferred property name is now notes_occupied.\n if (this.options.beats_occupied) {\n this.beatsOccupiedDeprecationWarning();\n }\n this.notes_occupied = this.options.notes_occupied || this.options.beats_occupied || 2;\n if (this.options.bracketed != undefined) {\n this.bracketed = this.options.bracketed;\n }\n else {\n this.bracketed = notes.some((note) => !note.hasBeam());\n }\n this.ratioed =\n this.options.ratioed != undefined ? this.options.ratioed : Math.abs(this.notes_occupied - this.num_notes) > 1;\n this.point = Tables.currentMusicFont().lookupMetric('digits.tupletPoint');\n this.y_pos = 16;\n this.x_pos = 100;\n this.width = 200;\n this.setTupletLocation(this.options.location || Tuplet.LOCATION_TOP);\n Formatter.AlignRestsToNotes(notes, true, true);\n this.resolveGlyphs();\n this.attach();\n }\n static get CATEGORY() {\n return Category.Tuplet;\n }\n static get LOCATION_TOP() {\n return TupletLocation.TOP;\n }\n static get LOCATION_BOTTOM() {\n return TupletLocation.BOTTOM;\n }\n static get NESTING_OFFSET() {\n return 15;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static get metrics() {\n return Tables.currentMusicFont().getMetrics().glyphs.tuplet;\n }\n attach() {\n for (let i = 0; i < this.notes.length; i++) {\n const note = this.notes[i];\n note.setTuplet(this);\n }\n }\n detach() {\n for (let i = 0; i < this.notes.length; i++) {\n const note = this.notes[i];\n note.resetTuplet(this);\n }\n }\n /**\n * Set whether or not the bracket is drawn.\n */\n setBracketed(bracketed) {\n this.bracketed = !!bracketed;\n return this;\n }\n /**\n * Set whether or not the ratio is shown.\n */\n setRatioed(ratioed) {\n this.ratioed = !!ratioed;\n return this;\n }\n /**\n * Set the tuplet indicator to be displayed either on the top or bottom of the stave.\n */\n setTupletLocation(location) {\n if (location !== Tuplet.LOCATION_TOP && location !== Tuplet.LOCATION_BOTTOM) {\n // eslint-disable-next-line\n console.warn(`Invalid tuplet location [${location}]. Using Tuplet.LOCATION_TOP.`);\n location = Tuplet.LOCATION_TOP;\n }\n this.location = location;\n return this;\n }\n getNotes() {\n return this.notes;\n }\n getNoteCount() {\n return this.num_notes;\n }\n beatsOccupiedDeprecationWarning() {\n // eslint-disable-next-line\n console.warn('beats_occupied has been deprecated as an option for tuplets. Please use notes_occupied instead.', 'Calls to getBeatsOccupied / setBeatsOccupied should now be routed to getNotesOccupied / setNotesOccupied.', 'The old methods will be removed in VexFlow 5.0.');\n }\n getBeatsOccupied() {\n this.beatsOccupiedDeprecationWarning();\n return this.getNotesOccupied();\n }\n setBeatsOccupied(beats) {\n this.beatsOccupiedDeprecationWarning();\n return this.setNotesOccupied(beats);\n }\n getNotesOccupied() {\n return this.notes_occupied;\n }\n setNotesOccupied(notes) {\n this.detach();\n this.notes_occupied = notes;\n this.resolveGlyphs();\n this.attach();\n }\n resolveGlyphs() {\n this.numerator_glyphs = [];\n let n = this.num_notes;\n while (n >= 1) {\n this.numerator_glyphs.unshift(new Glyph('timeSig' + (n % 10), this.point));\n n = parseInt((n / 10).toString(), 10);\n }\n this.denom_glyphs = [];\n n = this.notes_occupied;\n while (n >= 1) {\n this.denom_glyphs.unshift(new Glyph('timeSig' + (n % 10), this.point));\n n = parseInt((n / 10).toString(), 10);\n }\n }\n // determine how many tuplets are nested within this tuplet\n // on the same side (above/below), to calculate a y\n // offset for this tuplet:\n getNestedTupletCount() {\n const location = this.location;\n const first_note = this.notes[0];\n let maxTupletCount = countTuplets(first_note, location);\n let minTupletCount = countTuplets(first_note, location);\n // Count the tuplets that are on the same side (above/below)\n // as this tuplet:\n function countTuplets(note, location) {\n return note.getTupletStack().filter((tuplet) => tuplet.location === location).length;\n }\n this.notes.forEach((note) => {\n const tupletCount = countTuplets(note, location);\n maxTupletCount = tupletCount > maxTupletCount ? tupletCount : maxTupletCount;\n minTupletCount = tupletCount < minTupletCount ? tupletCount : minTupletCount;\n });\n return maxTupletCount - minTupletCount;\n }\n // determine the y position of the tuplet:\n getYPosition() {\n // offset the tuplet for any nested tuplets between\n // it and the notes:\n const nested_tuplet_y_offset = this.getNestedTupletCount() * Tuplet.NESTING_OFFSET * -this.location;\n // offset the tuplet for any manual y_offset:\n const y_offset = this.options.y_offset || 0;\n // now iterate through the notes and find our highest\n // or lowest locations, to form a base y_pos\n const first_note = this.notes[0];\n let y_pos;\n if (this.location === Tuplet.LOCATION_TOP) {\n y_pos = first_note.checkStave().getYForLine(0) - Tuplet.metrics.topModifierOffset;\n // check modifiers above note to see if they will collide with tuplet beam\n for (let i = 0; i < this.notes.length; ++i) {\n const note = this.notes[i];\n let modLines = 0;\n const mc = note.getModifierContext();\n if (mc) {\n modLines = Math.max(modLines, mc.getState().top_text_line);\n }\n const modY = note.getYForTopText(modLines) - Tuplet.metrics.noteHeadOffset;\n if (note.hasStem() || note.isRest()) {\n const top_y = note.getStemDirection() === Stem.UP\n ? note.getStemExtents().topY - Tuplet.metrics.stemOffset\n : note.getStemExtents().baseY - Tuplet.metrics.noteHeadOffset;\n y_pos = Math.min(top_y, y_pos);\n if (modLines > 0) {\n y_pos = Math.min(modY, y_pos);\n }\n }\n }\n }\n else {\n let lineCheck = Tuplet.metrics.bottomLine; // tuplet default on line 4\n // check modifiers below note to see if they will collide with tuplet beam\n this.notes.forEach((nn) => {\n const mc = nn.getModifierContext();\n if (mc) {\n lineCheck = Math.max(lineCheck, mc.getState().text_line + 1);\n }\n });\n y_pos = first_note.checkStave().getYForLine(lineCheck) + Tuplet.metrics.noteHeadOffset;\n for (let i = 0; i < this.notes.length; ++i) {\n if (this.notes[i].hasStem() || this.notes[i].isRest()) {\n const bottom_y = this.notes[i].getStemDirection() === Stem.UP\n ? this.notes[i].getStemExtents().baseY + Tuplet.metrics.noteHeadOffset\n : this.notes[i].getStemExtents().topY + Tuplet.metrics.stemOffset;\n if (bottom_y > y_pos) {\n y_pos = bottom_y;\n }\n }\n }\n }\n return y_pos + nested_tuplet_y_offset + y_offset;\n }\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n // determine x value of left bound of tuplet\n const first_note = this.notes[0];\n const last_note = this.notes[this.notes.length - 1];\n if (!this.bracketed) {\n this.x_pos = first_note.getStemX();\n this.width = last_note.getStemX() - this.x_pos;\n }\n else {\n this.x_pos = first_note.getTieLeftX() - 5;\n this.width = last_note.getTieRightX() - this.x_pos + 5;\n }\n // determine y value for tuplet\n this.y_pos = this.getYPosition();\n const addGlyphWidth = (width, glyph) => width + defined(glyph.getMetrics().width);\n // calculate total width of tuplet notation\n let width = this.numerator_glyphs.reduce(addGlyphWidth, 0);\n if (this.ratioed) {\n width = this.denom_glyphs.reduce(addGlyphWidth, width);\n width += this.point * 0.32;\n }\n const notation_center_x = this.x_pos + this.width / 2;\n const notation_start_x = notation_center_x - width / 2;\n // draw bracket if the tuplet is not beamed\n if (this.bracketed) {\n const line_width = this.width / 2 - width / 2 - 5;\n // only draw the bracket if it has positive length\n if (line_width > 0) {\n ctx.fillRect(this.x_pos, this.y_pos, line_width, 1);\n ctx.fillRect(this.x_pos + this.width / 2 + width / 2 + 5, this.y_pos, line_width, 1);\n ctx.fillRect(this.x_pos, this.y_pos + (this.location === Tuplet.LOCATION_BOTTOM ? 1 : 0), 1, this.location * 10);\n ctx.fillRect(this.x_pos + this.width, this.y_pos + (this.location === Tuplet.LOCATION_BOTTOM ? 1 : 0), 1, this.location * 10);\n }\n }\n // draw numerator glyphs\n const shiftY = Tables.currentMusicFont().lookupMetric('digits.shiftY', 0);\n let x_offset = 0;\n this.numerator_glyphs.forEach((glyph) => {\n glyph.render(ctx, notation_start_x + x_offset, this.y_pos + this.point / 3 - 2 + shiftY);\n x_offset += defined(glyph.getMetrics().width);\n });\n // display colon and denominator if the ratio is to be shown\n if (this.ratioed) {\n const colon_x = notation_start_x + x_offset + this.point * 0.16;\n const colon_radius = this.point * 0.06;\n ctx.beginPath();\n ctx.arc(colon_x, this.y_pos - this.point * 0.08, colon_radius, 0, Math.PI * 2, true);\n ctx.closePath();\n ctx.fill();\n ctx.beginPath();\n ctx.arc(colon_x, this.y_pos + this.point * 0.12, colon_radius, 0, Math.PI * 2, true);\n ctx.closePath();\n ctx.fill();\n x_offset += this.point * 0.32;\n this.denom_glyphs.forEach((glyph) => {\n glyph.render(ctx, notation_start_x + x_offset, this.y_pos + this.point / 3 - 2 + shiftY);\n x_offset += defined(glyph.getMetrics().width);\n });\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Fraction } from './fraction';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { TupletLocation } from './tuplet';\nimport { Category, isStaveNote, isTabNote } from './typeguard';\nimport { RuntimeError } from './util';\nfunction calculateStemDirection(notes) {\n let lineSum = 0;\n notes.forEach((note) => {\n if (note.keyProps) {\n note.keyProps.forEach((keyProp) => {\n lineSum += keyProp.line - 3;\n });\n }\n });\n if (lineSum >= 0) {\n return Stem.DOWN;\n }\n return Stem.UP;\n}\nfunction getStemSlope(firstNote, lastNote) {\n const firstStemTipY = firstNote.getStemExtents().topY;\n const firstStemX = firstNote.getStemX();\n const lastStemTipY = lastNote.getStemExtents().topY;\n const lastStemX = lastNote.getStemX();\n return (lastStemTipY - firstStemTipY) / (lastStemX - firstStemX);\n}\nconst BEAM_LEFT = 'L';\nconst BEAM_RIGHT = 'R';\nconst BEAM_BOTH = 'B';\n/** `Beams` span over a set of `StemmableNotes`. */\nexport class Beam extends Element {\n constructor(notes, auto_stem = false) {\n super();\n this.slope = 0;\n this.y_shift = 0;\n if (!notes || notes.length === 0) {\n throw new RuntimeError('BadArguments', 'No notes provided for beam.');\n }\n if (notes.length === 1) {\n throw new RuntimeError('BadArguments', 'Too few notes for beam.');\n }\n // Validate beam line, direction and ticks.\n this.ticks = notes[0].getIntrinsicTicks();\n if (this.ticks >= Tables.durationToTicks('4')) {\n throw new RuntimeError('BadArguments', 'Beams can only be applied to notes shorter than a quarter note.');\n }\n let i; // shared iterator\n let note;\n this.stem_direction = Stem.UP;\n for (i = 0; i < notes.length; ++i) {\n note = notes[i];\n if (note.hasStem()) {\n this.stem_direction = note.getStemDirection();\n break;\n }\n }\n let stem_direction = this.stem_direction;\n // Figure out optimal stem direction based on given notes\n if (auto_stem && isStaveNote(notes[0])) {\n stem_direction = calculateStemDirection(notes);\n }\n else if (auto_stem && isTabNote(notes[0])) {\n // Auto Stem TabNotes\n const stem_weight = notes.reduce((memo, note) => memo + note.getStemDirection(), 0);\n stem_direction = stem_weight > -1 ? Stem.UP : Stem.DOWN;\n }\n // Apply stem directions and attach beam to notes\n for (i = 0; i < notes.length; ++i) {\n note = notes[i];\n if (auto_stem) {\n note.setStemDirection(stem_direction);\n this.stem_direction = stem_direction;\n }\n note.setBeam(this);\n }\n this.postFormatted = false;\n this.notes = notes;\n this.beam_count = this.getBeamCount();\n this.break_on_indices = [];\n this.render_options = {\n beam_width: 5,\n max_slope: 0.25,\n min_slope: -0.25,\n slope_iterations: 20,\n slope_cost: 100,\n show_stemlets: false,\n stemlet_extension: 7,\n partial_beam_length: 10,\n flat_beams: false,\n min_flat_beam_offset: 15,\n };\n }\n static get CATEGORY() {\n return Category.Beam;\n }\n /** Get the direction of the beam */\n getStemDirection() {\n return this.stem_direction;\n }\n /**\n * Get the default beam groups for a provided time signature.\n * Attempt to guess if the time signature is not found in table.\n * Currently this is fairly naive.\n */\n static getDefaultBeamGroups(time_sig) {\n if (!time_sig || time_sig === 'c') {\n time_sig = '4/4';\n }\n const defaults = {\n '1/2': ['1/2'],\n '2/2': ['1/2'],\n '3/2': ['1/2'],\n '4/2': ['1/2'],\n '1/4': ['1/4'],\n '2/4': ['1/4'],\n '3/4': ['1/4'],\n '4/4': ['1/4'],\n '1/8': ['1/8'],\n '2/8': ['2/8'],\n '3/8': ['3/8'],\n '4/8': ['2/8'],\n '1/16': ['1/16'],\n '2/16': ['2/16'],\n '3/16': ['3/16'],\n '4/16': ['2/16'],\n };\n const groups = defaults[time_sig];\n if (groups === undefined) {\n // If no beam groups found, naively determine\n // the beam groupings from the time signature\n const beatTotal = parseInt(time_sig.split('/')[0], 10);\n const beatValue = parseInt(time_sig.split('/')[1], 10);\n const tripleMeter = beatTotal % 3 === 0;\n if (tripleMeter) {\n return [new Fraction(3, beatValue)];\n }\n else if (beatValue > 4) {\n return [new Fraction(2, beatValue)];\n }\n else if (beatValue <= 4) {\n return [new Fraction(1, beatValue)];\n }\n }\n else {\n return groups.map((group) => new Fraction().parse(group));\n }\n return [new Fraction(1, 4)];\n }\n /**\n * A helper function to automatically build basic beams for a voice. For more\n * complex auto-beaming use `Beam.generateBeams()`.\n * @param voice the voice to generate the beams for\n * @param stem_direction a stem direction to apply to the entire voice\n * @param groups an array of `Fraction` representing beat groupings for the beam\n */\n static applyAndGetBeams(voice, stem_direction, groups) {\n return Beam.generateBeams(voice.getTickables(), { groups, stem_direction });\n }\n /**\n * A helper function to autimatically build beams for a voice with\n * configuration options.\n *\n * Example configuration object:\n *\n * ```\n * config = {\n * groups: [new Vex.Flow.Fraction(2, 8)],\n * stem_direction: -1,\n * beam_rests: true,\n * beam_middle_only: true,\n * show_stemlets: false\n * };\n * ```\n * @param notes an array of notes to create the beams for\n * @param config the configuration object\n * @param config.stem_direction set to apply the same direction to all notes\n * @param config.beam_rests set to `true` to include rests in the beams\n * @param config.beam_middle_only set to `true` to only beam rests in the middle of the beat\n * @param config.show_stemlets set to `true` to draw stemlets for rests\n * @param config.maintain_stem_directions set to `true` to not apply new stem directions\n * @param config.groups array of `Fractions` that represent the beat structure to beam the notes\n *\n */\n static generateBeams(notes, config = {}) {\n if (!config.groups || !config.groups.length) {\n config.groups = [new Fraction(2, 8)];\n }\n // Convert beam groups to tick amounts\n const tickGroups = config.groups.map((group) => {\n if (!group.multiply) {\n throw new RuntimeError('InvalidBeamGroups', 'The beam groups must be an array of Vex.Flow.Fractions');\n }\n return group.clone().multiply(Tables.RESOLUTION, 1);\n });\n const unprocessedNotes = notes;\n let currentTickGroup = 0;\n let noteGroups = [];\n let currentGroup = [];\n function getTotalTicks(vf_notes) {\n return vf_notes.reduce((memo, note) => note.getTicks().clone().add(memo), new Fraction(0, 1));\n }\n function nextTickGroup() {\n if (tickGroups.length - 1 > currentTickGroup) {\n currentTickGroup += 1;\n }\n else {\n currentTickGroup = 0;\n }\n }\n function createGroups() {\n let nextGroup = [];\n // number of ticks in current group\n let currentGroupTotalTicks = new Fraction(0, 1);\n unprocessedNotes.forEach((unprocessedNote) => {\n nextGroup = [];\n if (unprocessedNote.shouldIgnoreTicks()) {\n noteGroups.push(currentGroup);\n currentGroup = nextGroup;\n return; // Ignore untickables (like bar notes)\n }\n currentGroup.push(unprocessedNote);\n const ticksPerGroup = tickGroups[currentTickGroup].clone();\n const totalTicks = getTotalTicks(currentGroup).add(currentGroupTotalTicks);\n // Double the amount of ticks in a group, if it's an unbeamable tuplet\n const unbeamable = Tables.durationToNumber(unprocessedNote.getDuration()) < 8;\n if (unbeamable && unprocessedNote.getTuplet()) {\n ticksPerGroup.numerator *= 2;\n }\n // If the note that was just added overflows the group tick total\n if (totalTicks.greaterThan(ticksPerGroup)) {\n // If the overflow note can be beamed, start the next group\n // with it. Unbeamable notes leave the group overflowed.\n if (!unbeamable) {\n const note = currentGroup.pop();\n if (note)\n nextGroup.push(note);\n }\n noteGroups.push(currentGroup);\n // We have overflown, so we're going to next tick group. As we might have\n // overflown by more than 1 group, we need to go forward as many times as\n // needed, decreasing currentGroupTotalTicks by as many ticks as there are\n // in current groups as we go forward.\n do {\n currentGroupTotalTicks = totalTicks.subtract(tickGroups[currentTickGroup]);\n nextTickGroup();\n } while (currentGroupTotalTicks.greaterThanEquals(tickGroups[currentTickGroup]));\n currentGroup = nextGroup;\n }\n else if (totalTicks.equals(ticksPerGroup)) {\n noteGroups.push(currentGroup);\n currentGroupTotalTicks = new Fraction(0, 1);\n currentGroup = nextGroup;\n nextTickGroup();\n }\n });\n // Adds any remainder notes beam\n if (currentGroup.length > 0) {\n noteGroups.push(currentGroup);\n }\n }\n function getBeamGroups() {\n return noteGroups.filter((group) => {\n if (group.length > 1) {\n let beamable = true;\n group.forEach((note) => {\n if (note.getIntrinsicTicks() >= Tables.durationToTicks('4')) {\n beamable = false;\n }\n });\n return beamable;\n }\n return false;\n });\n }\n // Splits up groups by Rest\n function sanitizeGroups() {\n const sanitizedGroups = [];\n noteGroups.forEach((group) => {\n let tempGroup = [];\n group.forEach((note, index, group) => {\n const isFirstOrLast = index === 0 || index === group.length - 1;\n const prevNote = group[index - 1];\n const breaksOnEachRest = !config.beam_rests && note.isRest();\n const breaksOnFirstOrLastRest = config.beam_rests && config.beam_middle_only && note.isRest() && isFirstOrLast;\n let breakOnStemChange = false;\n if (config.maintain_stem_directions && prevNote && !note.isRest() && !prevNote.isRest()) {\n const prevDirection = prevNote.getStemDirection();\n const currentDirection = note.getStemDirection();\n breakOnStemChange = currentDirection !== prevDirection;\n }\n const isUnbeamableDuration = parseInt(note.getDuration(), 10) < 8;\n // Determine if the group should be broken at this note\n const shouldBreak = breaksOnEachRest || breaksOnFirstOrLastRest || breakOnStemChange || isUnbeamableDuration;\n if (shouldBreak) {\n // Add current group\n if (tempGroup.length > 0) {\n sanitizedGroups.push(tempGroup);\n }\n // Start a new group. Include the current note if the group\n // was broken up by stem direction, as that note needs to start\n // the next group of notes\n tempGroup = breakOnStemChange ? [note] : [];\n }\n else {\n // Add note to group\n tempGroup.push(note);\n }\n });\n // If there is a remaining group, add it as well\n if (tempGroup.length > 0) {\n sanitizedGroups.push(tempGroup);\n }\n });\n noteGroups = sanitizedGroups;\n }\n function formatStems() {\n noteGroups.forEach((group) => {\n let stemDirection;\n if (config.maintain_stem_directions) {\n const note = findFirstNote(group);\n stemDirection = note ? note.getStemDirection() : Stem.UP;\n }\n else {\n if (config.stem_direction) {\n stemDirection = config.stem_direction;\n }\n else {\n stemDirection = calculateStemDirection(group);\n }\n }\n applyStemDirection(group, stemDirection);\n });\n }\n function findFirstNote(group) {\n for (let i = 0; i < group.length; i++) {\n const note = group[i];\n if (!note.isRest()) {\n return note;\n }\n }\n return false;\n }\n function applyStemDirection(group, direction) {\n group.forEach((note) => {\n note.setStemDirection(direction);\n });\n }\n // Get all of the tuplets in all of the note groups\n function getTuplets() {\n const uniqueTuplets = [];\n // Go through all of the note groups and inspect for tuplets\n noteGroups.forEach((group) => {\n let tuplet;\n group.forEach((note) => {\n const noteTuplet = note.getTuplet();\n if (noteTuplet && tuplet !== noteTuplet) {\n tuplet = noteTuplet;\n uniqueTuplets.push(tuplet);\n }\n });\n });\n return uniqueTuplets;\n }\n // Using closures to store the variables throughout the various functions\n // IMO Keeps it this process lot cleaner - but not super consistent with\n // the rest of the API's style - Silverwolf90 (Cyril)\n createGroups();\n sanitizeGroups();\n formatStems();\n // Get the notes to be beamed\n const beamedNoteGroups = getBeamGroups();\n // Get the tuplets in order to format them accurately\n const allTuplets = getTuplets();\n // Create a Vex.Flow.Beam from each group of notes to be beamed\n const beams = [];\n beamedNoteGroups.forEach((group) => {\n const beam = new Beam(group);\n if (config.show_stemlets) {\n beam.render_options.show_stemlets = true;\n }\n if (config.secondary_breaks) {\n beam.render_options.secondary_break_ticks = Tables.durationToTicks(config.secondary_breaks);\n }\n if (config.flat_beams === true) {\n beam.render_options.flat_beams = true;\n beam.render_options.flat_beam_offset = config.flat_beam_offset;\n }\n beams.push(beam);\n });\n // Reformat tuplets\n allTuplets.forEach((tuplet) => {\n // Set the tuplet location based on the stem direction\n const direction = tuplet.notes[0].stem_direction === Stem.DOWN ? TupletLocation.BOTTOM : TupletLocation.TOP;\n tuplet.setTupletLocation(direction);\n // If any of the notes in the tuplet are not beamed, draw a bracket.\n let bracketed = false;\n for (let i = 0; i < tuplet.notes.length; i++) {\n const note = tuplet.notes[i];\n if (!note.hasBeam()) {\n bracketed = true;\n break;\n }\n }\n tuplet.setBracketed(bracketed);\n });\n return beams;\n }\n /** Get the notes in this beam. */\n getNotes() {\n return this.notes;\n }\n /** Get the max number of beams in the set of notes. */\n getBeamCount() {\n const beamCounts = this.notes.map((note) => note.getGlyph().beam_count);\n const maxBeamCount = beamCounts.reduce((max, beamCount) => (beamCount > max ? beamCount : max));\n return maxBeamCount;\n }\n /** Set which note `indices` to break the secondary beam at. */\n breakSecondaryAt(indices) {\n this.break_on_indices = indices;\n return this;\n }\n /** Return the y coordinate for linear function. */\n getSlopeY(x, first_x_px, first_y_px, slope) {\n return first_y_px + (x - first_x_px) * slope;\n }\n /** Calculate the best possible slope for the provided notes. */\n calculateSlope() {\n const { notes, stem_direction: stemDirection, render_options: { max_slope, min_slope, slope_iterations, slope_cost }, } = this;\n const firstNote = notes[0];\n const initialSlope = getStemSlope(firstNote, notes[notes.length - 1]);\n const increment = (max_slope - min_slope) / slope_iterations;\n let minCost = Number.MAX_VALUE;\n let bestSlope = 0;\n let yShift = 0;\n // iterate through slope values to find best weighted fit\n for (let slope = min_slope; slope <= max_slope; slope += increment) {\n let totalStemExtension = 0;\n let yShiftTemp = 0;\n // iterate through notes, calculating y shift and stem extension\n for (let i = 1; i < notes.length; ++i) {\n const note = notes[i];\n if (note.hasStem() || note.isRest()) {\n const adjustedStemTipY = this.getSlopeY(note.getStemX(), firstNote.getStemX(), firstNote.getStemExtents().topY, slope) + yShiftTemp;\n const stemTipY = note.getStemExtents().topY;\n // beam needs to be shifted up to accommodate note\n if (stemTipY * stemDirection < adjustedStemTipY * stemDirection) {\n const diff = Math.abs(stemTipY - adjustedStemTipY);\n yShiftTemp += diff * -stemDirection;\n totalStemExtension += diff * i;\n }\n else {\n // beam overshoots note, account for the difference\n totalStemExtension += (stemTipY - adjustedStemTipY) * stemDirection;\n }\n }\n }\n // most engraving books suggest aiming for a slope about half the angle of the\n // difference between the first and last notes' stem length;\n const idealSlope = initialSlope / 2;\n const distanceFromIdeal = Math.abs(idealSlope - slope);\n // This tries to align most beams to something closer to the idealSlope, but\n // doesn't go crazy. To disable, set this.render_options.slope_cost = 0\n const cost = slope_cost * distanceFromIdeal + Math.abs(totalStemExtension);\n // update state when a more ideal slope is found\n if (cost < minCost) {\n minCost = cost;\n bestSlope = slope;\n yShift = yShiftTemp;\n }\n }\n this.slope = bestSlope;\n this.y_shift = yShift;\n }\n /** Calculate a slope and y-shift for flat beams. */\n calculateFlatSlope() {\n const { notes, stem_direction, render_options: { beam_width, min_flat_beam_offset, flat_beam_offset }, } = this;\n // If a flat beam offset has not yet been supplied or calculated,\n // generate one based on the notes in this particular note group\n let total = 0;\n let extremeY = 0; // Store the highest or lowest note here\n let extremeBeamCount = 0; // The beam count of the extreme note\n let currentExtreme = 0;\n for (let i = 0; i < notes.length; i++) {\n // Total up all of the offsets so we can average them out later\n const note = notes[i];\n const stemTipY = note.getStemExtents().topY;\n total += stemTipY;\n // Store the highest (stems-up) or lowest (stems-down) note so the\n // offset can be adjusted in case the average isn't enough\n if (stem_direction === Stem.DOWN && currentExtreme < stemTipY) {\n currentExtreme = stemTipY;\n extremeY = Math.max(...note.getYs());\n extremeBeamCount = note.getBeamCount();\n }\n else if (stem_direction === Stem.UP && (currentExtreme === 0 || currentExtreme > stemTipY)) {\n currentExtreme = stemTipY;\n extremeY = Math.min(...note.getYs());\n extremeBeamCount = note.getBeamCount();\n }\n }\n // Average the offsets to try and come up with a reasonable one that\n // works for all of the notes in the beam group.\n let offset = total / notes.length;\n // In case the average isn't long enough, add or subtract some more\n // based on the highest or lowest note (again, based on the stem\n // direction). This also takes into account the added height due to\n // the width of the beams.\n const beamWidth = beam_width * 1.5;\n const extremeTest = min_flat_beam_offset + extremeBeamCount * beamWidth;\n const newOffset = extremeY + extremeTest * -stem_direction;\n if (stem_direction === Stem.DOWN && offset < newOffset) {\n offset = extremeY + extremeTest;\n }\n else if (stem_direction === Stem.UP && offset > newOffset) {\n offset = extremeY - extremeTest;\n }\n if (!flat_beam_offset) {\n // Set the offset for the group based on the calculations above.\n this.render_options.flat_beam_offset = offset;\n }\n else if (stem_direction === Stem.DOWN && offset > flat_beam_offset) {\n this.render_options.flat_beam_offset = offset;\n }\n else if (stem_direction === Stem.UP && offset < flat_beam_offset) {\n this.render_options.flat_beam_offset = offset;\n }\n // for flat beams, the slope and y_shift are simply 0\n this.slope = 0;\n this.y_shift = 0;\n }\n /** Return the Beam y offset. */\n getBeamYToDraw() {\n const firstNote = this.notes[0];\n const firstStemTipY = firstNote.getStemExtents().topY;\n let beamY = firstStemTipY;\n // For flat beams, set the first and last Y to the offset, rather than\n // using the note's stem extents.\n if (this.render_options.flat_beams && this.render_options.flat_beam_offset) {\n beamY = this.render_options.flat_beam_offset;\n }\n return beamY;\n }\n /**\n * Create new stems for the notes in the beam, so that each stem\n * extends into the beams.\n */\n applyStemExtensions() {\n const { notes, slope, y_shift, stem_direction, beam_count, render_options: { show_stemlets, stemlet_extension, beam_width }, } = this;\n const firstNote = notes[0];\n const firstStemTipY = this.getBeamYToDraw();\n const firstStemX = firstNote.getStemX();\n for (let i = 0; i < notes.length; ++i) {\n const note = notes[i];\n const stem = note.getStem();\n if (stem) {\n const stemX = note.getStemX();\n const { topY: stemTipY } = note.getStemExtents();\n const beamedStemTipY = this.getSlopeY(stemX, firstStemX, firstStemTipY, slope) + y_shift;\n const preBeamExtension = stem.getExtension();\n const beamExtension = stem_direction === Stem.UP ? stemTipY - beamedStemTipY : beamedStemTipY - stemTipY;\n stem.setExtension(preBeamExtension + beamExtension);\n stem.adjustHeightForBeam();\n if (note.isRest() && show_stemlets) {\n const beamWidth = beam_width;\n const totalBeamWidth = (beam_count - 1) * beamWidth * 1.5 + beamWidth;\n stem.setVisibility(true).setStemlet(true, totalBeamWidth + stemlet_extension);\n }\n }\n }\n }\n /** Return upper level beam direction. */\n lookupBeamDirection(duration, prev_tick, tick, next_tick) {\n if (duration === '4') {\n return BEAM_LEFT;\n }\n const lookup_duration = `${Tables.durationToNumber(duration) / 2}`;\n const prev_note_gets_beam = prev_tick < Tables.durationToTicks(lookup_duration);\n const next_note_gets_beam = next_tick < Tables.durationToTicks(lookup_duration);\n const note_gets_beam = tick < Tables.durationToTicks(lookup_duration);\n if (prev_note_gets_beam && next_note_gets_beam && note_gets_beam) {\n return BEAM_BOTH;\n }\n else if (prev_note_gets_beam && !next_note_gets_beam && note_gets_beam) {\n return BEAM_LEFT;\n }\n else if (!prev_note_gets_beam && next_note_gets_beam && note_gets_beam) {\n return BEAM_RIGHT;\n }\n return this.lookupBeamDirection(lookup_duration, prev_tick, tick, next_tick);\n }\n /** Get the x coordinates for the beam lines of specific `duration`. */\n getBeamLines(duration) {\n const tick_of_duration = Tables.durationToTicks(duration);\n let beam_started = false;\n const beam_lines = [];\n let current_beam = undefined;\n const partial_beam_length = this.render_options.partial_beam_length;\n let previous_should_break = false;\n let tick_tally = 0;\n for (let i = 0; i < this.notes.length; ++i) {\n const note = this.notes[i];\n // See if we need to break secondary beams on this note.\n const ticks = note.getTicks().value();\n tick_tally += ticks;\n let should_break = false;\n // 8th note beams are always drawn.\n if (parseInt(duration, 10) >= 8) {\n // First, check to see if any indices were set up through breakSecondaryAt()\n should_break = this.break_on_indices.indexOf(i) !== -1;\n // If the secondary breaks were auto-configured in the render options,\n // handle that as well.\n if (this.render_options.secondary_break_ticks && tick_tally >= this.render_options.secondary_break_ticks) {\n tick_tally = 0;\n should_break = true;\n }\n }\n const note_gets_beam = note.getIntrinsicTicks() < tick_of_duration;\n const stem_x = note.getStemX() - Stem.WIDTH / 2;\n // Check to see if the next note in the group will get a beam at this\n // level. This will help to inform the partial beam logic below.\n const prev_note = this.notes[i - 1];\n const next_note = this.notes[i + 1];\n const next_note_gets_beam = next_note && next_note.getIntrinsicTicks() < tick_of_duration;\n const prev_note_gets_beam = prev_note && prev_note.getIntrinsicTicks() < tick_of_duration;\n const beam_alone = prev_note && next_note && note_gets_beam && !prev_note_gets_beam && !next_note_gets_beam;\n // const beam_alone = note_gets_beam && !prev_note_gets_beam && !next_note_gets_beam;\n if (note_gets_beam) {\n // This note gets a beam at the current level\n if (beam_started) {\n // We're currently in the middle of a beam. Just continue it on to\n // the stem X of the current note.\n current_beam = beam_lines[beam_lines.length - 1];\n current_beam.end = stem_x;\n // If a secondary beam break is set up, end the beam right now.\n if (should_break) {\n beam_started = false;\n if (next_note && !next_note_gets_beam && current_beam.end === undefined) {\n // This note gets a beam,.but the next one does not. This means\n // we need a partial pointing right.\n current_beam.end = current_beam.start - partial_beam_length;\n }\n }\n }\n else {\n // No beam started yet. Start a new one.\n current_beam = { start: stem_x, end: undefined };\n beam_started = true;\n if (beam_alone) {\n // previous and next beam exists and does not get a beam but current gets it.\n const prev_tick = prev_note.getIntrinsicTicks();\n const next_tick = next_note.getIntrinsicTicks();\n const tick = note.getIntrinsicTicks();\n const beam_direction = this.lookupBeamDirection(duration, prev_tick, tick, next_tick);\n if ([BEAM_LEFT, BEAM_BOTH].includes(beam_direction)) {\n current_beam.end = current_beam.start - partial_beam_length;\n }\n else {\n current_beam.end = current_beam.start + partial_beam_length;\n }\n }\n else if (!next_note_gets_beam) {\n // The next note doesn't get a beam. Draw a partial.\n if ((previous_should_break || i === 0) && next_note) {\n // This is the first note (but not the last one), or it is\n // following a secondary break. Draw a partial to the right.\n current_beam.end = current_beam.start + partial_beam_length;\n }\n else {\n // By default, draw a partial to the left.\n current_beam.end = current_beam.start - partial_beam_length;\n }\n }\n else if (should_break) {\n // This note should have a secondary break after it. Even though\n // we just started a beam, it needs to end immediately.\n current_beam.end = current_beam.start - partial_beam_length;\n beam_started = false;\n }\n beam_lines.push(current_beam);\n }\n }\n else {\n // The current note does not get a beam.\n beam_started = false;\n }\n // Store the secondary break flag to inform the partial beam logic in\n // the next iteration of the loop.\n previous_should_break = should_break;\n }\n // Add a partial beam pointing left if this is the last note in the group\n const last_beam = beam_lines[beam_lines.length - 1];\n if (last_beam && last_beam.end === undefined) {\n last_beam.end = last_beam.start - partial_beam_length;\n }\n return beam_lines;\n }\n /** Render the stems for each note. */\n drawStems(ctx) {\n this.notes.forEach((note) => {\n const stem = note.getStem();\n if (stem) {\n stem.setContext(ctx).draw();\n }\n }, this);\n }\n // Render the beam lines\n drawBeamLines(ctx) {\n const valid_beam_durations = ['4', '8', '16', '32', '64'];\n const firstNote = this.notes[0];\n let beamY = this.getBeamYToDraw();\n const firstStemX = firstNote.getStemX();\n const beamThickness = this.render_options.beam_width * this.stem_direction;\n // Draw the beams.\n for (let i = 0; i < valid_beam_durations.length; ++i) {\n const duration = valid_beam_durations[i];\n const beamLines = this.getBeamLines(duration);\n for (let j = 0; j < beamLines.length; ++j) {\n const beam_line = beamLines[j];\n const startBeamX = beam_line.start;\n const startBeamY = this.getSlopeY(startBeamX, firstStemX, beamY, this.slope);\n const lastBeamX = beam_line.end;\n if (lastBeamX) {\n const lastBeamY = this.getSlopeY(lastBeamX, firstStemX, beamY, this.slope);\n ctx.beginPath();\n ctx.moveTo(startBeamX, startBeamY);\n ctx.lineTo(startBeamX, startBeamY + beamThickness);\n ctx.lineTo(lastBeamX + 1, lastBeamY + beamThickness);\n ctx.lineTo(lastBeamX + 1, lastBeamY);\n ctx.closePath();\n ctx.fill();\n }\n else {\n throw new RuntimeError('NoLastBeamX', 'lastBeamX undefined.');\n }\n }\n beamY += beamThickness * 1.5;\n }\n }\n /** Pre-format the beam. */\n preFormat() {\n return this;\n }\n /**\n * Post-format the beam. This can only be called after\n * the notes in the beam have both `x` and `y` values. ie: they've\n * been formatted and have staves.\n */\n postFormat() {\n if (this.postFormatted)\n return;\n // Calculate a smart slope if we're not forcing the beams to be flat.\n if (isTabNote(this.notes[0]) || this.render_options.flat_beams) {\n this.calculateFlatSlope();\n }\n else {\n this.calculateSlope();\n }\n this.applyStemExtensions();\n this.postFormatted = true;\n }\n /** Render the beam to the canvas context */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n if (this.unbeamable)\n return;\n if (!this.postFormatted) {\n this.postFormat();\n }\n this.drawStems(ctx);\n this.applyStyle();\n this.drawBeamLines(ctx);\n this.restoreStyle();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2014\n// MIT License\nimport { Clef } from './clef';\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Category } from './typeguard';\n/** ClefNote implements clef annotations in measures. */\nexport class ClefNote extends Note {\n constructor(type, size, annotation) {\n super({ duration: 'b' });\n this.type = type;\n this.clef_obj = new Clef(type, size, annotation);\n this.clef = this.clef_obj.clef;\n this.glyph = new Glyph(this.clef.code, this.clef.point);\n this.setWidth(this.glyph.getMetrics().width);\n // Note properties\n this.ignore_ticks = true;\n }\n static get CATEGORY() {\n return Category.ClefNote;\n }\n /** Set clef type, size and annotation. */\n setType(type, size, annotation) {\n this.type = type;\n this.clef_obj = new Clef(type, size, annotation);\n this.clef = this.clef_obj.clef;\n this.glyph = new Glyph(this.clef.code, this.clef.point);\n this.setWidth(this.glyph.getMetrics().width);\n return this;\n }\n /** Get associated clef. */\n getClef() {\n return this.clef;\n }\n /** Set associated context. */\n setContext(context) {\n super.setContext(context);\n this.glyph.setContext(this.getContext());\n return this;\n }\n /** Get bounding box. */\n getBoundingBox() {\n return super.getBoundingBox();\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n /** Render clef note. */\n draw() {\n var _a;\n const stave = this.checkStave();\n if (!this.glyph.getContext()) {\n this.glyph.setContext(this.getContext());\n }\n this.setRendered();\n const abs_x = this.getAbsoluteX();\n this.glyph.setStave(stave);\n this.glyph.setYShift(stave.getYForLine((_a = this.clef.line) !== null && _a !== void 0 ? _a : 0) - stave.getYForGlyphs());\n this.glyph.renderToStave(abs_x);\n // If the Vex.Flow.Clef has an annotation, such as 8va, draw it.\n if (this.clef_obj.annotation !== undefined) {\n const attachment = new Glyph(this.clef_obj.annotation.code, this.clef_obj.annotation.point);\n if (!attachment.getContext()) {\n attachment.setContext(this.getContext());\n }\n attachment.setStave(stave);\n attachment.setYShift(stave.getYForLine(this.clef_obj.annotation.line) - stave.getYForGlyphs());\n attachment.setXShift(this.clef_obj.annotation.x_shift);\n attachment.renderToStave(abs_x);\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// This file implements the `Crescendo` object which draws crescendos and\n// decrescendo dynamics markings. A `Crescendo` is initialized with a\n// duration and formatted as part of a `Voice` like any other `Note`\n// type in VexFlow. This object would most likely be formatted in a Voice\n// with `TextNotes` - which are used to represent other dynamics markings.\nimport { Note } from './note';\nimport { TickContext } from './tickcontext';\nimport { Category } from './typeguard';\nimport { log } from './util';\n// To enable logging for this class. Set `Vex.Flow.Crescendo.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (Crescendo.DEBUG)\n log('Vex.Flow.Crescendo', args);\n}\n// Private helper to draw the hairpin\nfunction renderHairpin(ctx, params) {\n const begin_x = params.begin_x;\n const end_x = params.end_x;\n const y = params.y;\n const half_height = params.height / 2;\n ctx.beginPath();\n if (params.reverse) {\n ctx.moveTo(begin_x, y - half_height);\n ctx.lineTo(end_x, y);\n ctx.lineTo(begin_x, y + half_height);\n }\n else {\n ctx.moveTo(end_x, y - half_height);\n ctx.lineTo(begin_x, y);\n ctx.lineTo(end_x, y + half_height);\n }\n ctx.stroke();\n ctx.closePath();\n}\nexport class Crescendo extends Note {\n // Initialize the crescendo's properties\n constructor(noteStruct) {\n super(noteStruct);\n this.options = {\n // Extensions to the length of the crescendo on either side\n extend_left: 0,\n extend_right: 0,\n // Vertical shift\n y_shift: 0,\n };\n // Whether the object is a decrescendo\n this.decrescendo = false;\n // The staff line to be placed on\n this.line = noteStruct.line || 0;\n // The height at the open end of the cresc/decresc\n this.height = 15;\n }\n /** Crescendo category string. */\n static get CATEGORY() {\n return Category.Crescendo;\n }\n // Set the line to center the element on\n setLine(line) {\n this.line = line;\n return this;\n }\n // Set the full height at the open end\n setHeight(height) {\n this.height = height;\n return this;\n }\n // Set whether the sign should be a descresendo by passing a bool\n // to `decresc`\n setDecrescendo(decresc) {\n this.decrescendo = decresc;\n return this;\n }\n // Preformat the note\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n // Render the Crescendo object onto the canvas\n draw() {\n const ctx = this.checkContext();\n const stave = this.checkStave();\n this.setRendered();\n const tick_context = this.getTickContext();\n const next_context = TickContext.getNextContext(tick_context);\n const begin_x = this.getAbsoluteX();\n const end_x = next_context ? next_context.getX() : stave.getX() + stave.getWidth();\n const y = stave.getYForLine(this.line + -3) + 1;\n L('Drawing ', this.decrescendo ? 'decrescendo ' : 'crescendo ', this.height, 'x', begin_x - end_x);\n renderHairpin(ctx, {\n begin_x: begin_x - this.options.extend_left,\n end_x: end_x + this.options.extend_right,\n y: y + this.options.y_shift,\n height: this.height,\n reverse: this.decrescendo,\n });\n }\n}\nCrescendo.DEBUG = false;\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n//\n// This class implements curves (for slurs)\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport var CurvePosition;\n(function (CurvePosition) {\n CurvePosition[CurvePosition[\"NEAR_HEAD\"] = 1] = \"NEAR_HEAD\";\n CurvePosition[CurvePosition[\"NEAR_TOP\"] = 2] = \"NEAR_TOP\";\n})(CurvePosition || (CurvePosition = {}));\nexport class Curve extends Element {\n // from: Start note\n // to: End note\n // options:\n // cps: List of control points\n // x_shift: pixels to shift\n // y_shift: pixels to shift\n constructor(from, to, options) {\n super();\n this.render_options = Object.assign({ thickness: 2, x_shift: 0, y_shift: 10, position: CurvePosition.NEAR_HEAD, position_end: CurvePosition.NEAR_HEAD, invert: false, cps: [\n { x: 0, y: 10 },\n { x: 0, y: 10 },\n ] }, options);\n this.from = from;\n this.to = to;\n }\n static get CATEGORY() {\n return Category.Curve;\n }\n static get Position() {\n return CurvePosition;\n }\n static get PositionString() {\n return {\n nearHead: CurvePosition.NEAR_HEAD,\n nearTop: CurvePosition.NEAR_TOP,\n };\n }\n setNotes(from, to) {\n if (!from && !to) {\n throw new RuntimeError('BadArguments', 'Curve needs to have either `from` or `to` set.');\n }\n this.from = from;\n this.to = to;\n return this;\n }\n /**\n * @return {boolean} Returns true if this is a partial bar.\n */\n isPartial() {\n return !this.from || !this.to;\n }\n renderCurve(params) {\n const ctx = this.checkContext();\n const x_shift = this.render_options.x_shift;\n const y_shift = this.render_options.y_shift * params.direction;\n const first_x = params.first_x + x_shift;\n const first_y = params.first_y + y_shift;\n const last_x = params.last_x - x_shift;\n const last_y = params.last_y + y_shift;\n const thickness = this.render_options.thickness;\n const cps = this.render_options.cps;\n const { x: cp0x, y: cp0y } = cps[0];\n const { x: cp1x, y: cp1y } = cps[1];\n const cp_spacing = (last_x - first_x) / (cps.length + 2);\n ctx.beginPath();\n ctx.moveTo(first_x, first_y);\n ctx.bezierCurveTo(first_x + cp_spacing + cp0x, first_y + cp0y * params.direction, last_x - cp_spacing + cp1x, last_y + cp1y * params.direction, last_x, last_y);\n ctx.bezierCurveTo(last_x - cp_spacing + cp1x, last_y + (cp1y + thickness) * params.direction, first_x + cp_spacing + cp0x, first_y + (cp0y + thickness) * params.direction, first_x, first_y);\n ctx.stroke();\n ctx.closePath();\n ctx.fill();\n }\n draw() {\n this.checkContext();\n this.setRendered();\n const first_note = this.from;\n const last_note = this.to;\n let first_x;\n let last_x;\n let first_y;\n let last_y;\n let stem_direction = 0;\n let metric = 'baseY';\n let end_metric = 'baseY';\n function getPosition(position) {\n return typeof position === 'string' ? Curve.PositionString[position] : position;\n }\n const position = getPosition(this.render_options.position);\n const position_end = getPosition(this.render_options.position_end);\n if (position === CurvePosition.NEAR_TOP) {\n metric = 'topY';\n end_metric = 'topY';\n }\n if (position_end === CurvePosition.NEAR_HEAD) {\n end_metric = 'baseY';\n }\n else if (position_end === CurvePosition.NEAR_TOP) {\n end_metric = 'topY';\n }\n if (first_note) {\n first_x = first_note.getTieRightX();\n stem_direction = first_note.getStemDirection();\n first_y = first_note.getStemExtents()[metric];\n }\n else {\n const stave = last_note.checkStave();\n first_x = stave.getTieStartX();\n first_y = last_note.getStemExtents()[metric];\n }\n if (last_note) {\n last_x = last_note.getTieLeftX();\n stem_direction = last_note.getStemDirection();\n last_y = last_note.getStemExtents()[end_metric];\n }\n else {\n const stave = first_note.checkStave();\n last_x = stave.getTieEndX();\n last_y = first_note.getStemExtents()[end_metric];\n }\n this.renderCurve({\n first_x,\n last_x,\n first_y,\n last_y,\n direction: stem_direction * (this.render_options.invert === true ? -1 : 1),\n });\n return true;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// A generic text parsing class for VexFlow.\nimport { log, RuntimeError } from './util';\n// To enable logging for this class. Set `Vex.Flow.Parser.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (Parser.DEBUG)\n log('Vex.Flow.Parser', args);\n}\nconst NO_ERROR_POS = -1;\n// Converts parser results into an easy to reference list that can be\n// used in triggers. This function returns:\n// - nested array in which the leaf elements are string or null\n// - string (including empty strings)\n// - null\nfunction flattenMatches(r) {\n if ('matchedString' in r)\n return r.matchedString; // string\n if ('results' in r)\n return flattenMatches(r.results);\n const results = r;\n if (results.length === 1)\n return flattenMatches(results[0]);\n if (results.length === 0)\n return null;\n return results.map(flattenMatches); // nested array\n}\n// This is the base parser class. Given an arbitrary context-free grammar, it\n// can parse any line and execute code when specific rules are met (e.g.,\n// when a string is terminated.)\nexport class Parser {\n // For an example of a simple grammar, take a look at tests/parser_tests.ts or\n // the EasyScore grammar in easyscore.ts.\n constructor(grammar) {\n this.grammar = grammar;\n this.line = '';\n this.pos = 0;\n this.errorPos = NO_ERROR_POS;\n }\n // Parse `line` using current grammar. Returns `{success: true}` if the\n // line parsed correctly, otherwise returns `{success: false, errorPos: N}`\n // where `errorPos` is the location of the error in the string.\n parse(line) {\n this.line = line;\n this.pos = 0;\n this.errorPos = NO_ERROR_POS;\n const result = this.expect(this.grammar.begin());\n result.errorPos = this.errorPos;\n return result;\n }\n matchFail(returnPos) {\n if (this.errorPos === NO_ERROR_POS)\n this.errorPos = this.pos;\n this.pos = returnPos;\n }\n matchSuccess() {\n this.errorPos = NO_ERROR_POS;\n }\n // Look for `token` in this.line[this.pos], and return success\n // if one is found. `token` is specified as a regular expression.\n matchToken(token, noSpace = false) {\n const regexp = noSpace ? new RegExp('^((' + token + '))') : new RegExp('^((' + token + ')\\\\s*)');\n const workingLine = this.line.slice(this.pos);\n const result = workingLine.match(regexp);\n if (result !== null) {\n return {\n success: true,\n matchedString: result[2],\n incrementPos: result[1].length,\n pos: this.pos,\n };\n }\n else {\n return { success: false, pos: this.pos };\n }\n }\n // Execute rule to match a sequence of tokens (or rules). If `maybe` is\n // set, then return success even if the token is not found, but reset\n // the position before exiting.\n // TODO: expectOne(...) is never called with the `maybe` parameter.\n expectOne(rule, maybe = false) {\n const results = [];\n const pos = this.pos;\n let allMatches = true;\n let oneMatch = false;\n maybe = maybe === true || rule.maybe === true;\n // Execute all sub rules in sequence.\n if (rule.expect) {\n for (const next of rule.expect) {\n const localPos = this.pos;\n const result = this.expect(next);\n // If `rule.or` is set, then return success if any one\n // of the subrules match, else all subrules must match.\n if (result.success) {\n results.push(result);\n oneMatch = true;\n if (rule.or)\n break;\n }\n else {\n allMatches = false;\n if (!rule.or) {\n this.pos = localPos;\n break;\n }\n }\n }\n }\n const gotOne = (rule.or && oneMatch) || allMatches;\n const success = gotOne || maybe === true;\n const numMatches = gotOne ? 1 : 0;\n if (maybe && !gotOne)\n this.pos = pos;\n if (success) {\n this.matchSuccess();\n }\n else {\n this.matchFail(pos);\n }\n return { success, results, numMatches };\n }\n // Try to match multiple (one or more) instances of the rule. If `maybe` is set,\n // then a failed match is also a success (but the position is reset).\n expectOneOrMore(rule, maybe = false) {\n const results = [];\n const pos = this.pos;\n let numMatches = 0;\n let more = true;\n do {\n const result = this.expectOne(rule);\n if (result.success && result.results) {\n numMatches++;\n results.push(result.results);\n }\n else {\n more = false;\n }\n } while (more);\n const success = numMatches > 0 || maybe === true;\n if (maybe && !(numMatches > 0))\n this.pos = pos;\n if (success) {\n this.matchSuccess();\n }\n else {\n this.matchFail(pos);\n }\n return { success, results, numMatches };\n }\n // Match zero or more instances of `rule`. Offloads to `expectOneOrMore`.\n expectZeroOrMore(rule) {\n return this.expectOneOrMore(rule, true);\n }\n // Execute the rule produced by the provided `rules` function. This\n // offloads to one of the above matchers and consolidates the results. It is also\n // responsible for executing any code triggered by the rule (in `rule.run`.)\n expect(ruleFunc) {\n L('Evaluating rule function:', ruleFunc);\n if (!ruleFunc) {\n throw new RuntimeError('Invalid rule function');\n }\n let result;\n // Get rule from Grammar class.\n // expect(...) handles both lexing & parsing:\n // - lexer rules produce tokens.\n // - parser rules produce expressions which may trigger code via the\n // { run: () => ... } trigger functions in easyscore.ts.\n // These functions build the VexFlow objects that are displayed on screen.\n const rule = ruleFunc.bind(this.grammar)();\n if (rule.token) {\n // A lexer rule has a `token` property.\n // Base case: parse the regex and throw an error if the\n // line doesn't match.\n result = this.matchToken(rule.token, rule.noSpace === true);\n if (result.success) {\n // Token match! Update position and throw away parsed portion\n // of string.\n this.pos += result.incrementPos;\n }\n }\n else if (rule.expect) {\n // A parser rule has an `expect` property.\n if (rule.oneOrMore) {\n result = this.expectOneOrMore(rule);\n }\n else if (rule.zeroOrMore) {\n result = this.expectZeroOrMore(rule);\n }\n else {\n result = this.expectOne(rule);\n }\n }\n else {\n L(rule);\n throw new RuntimeError('Bad grammar! No `token` or `expect` property ' + rule);\n }\n // If there's a trigger attached to this rule, then run it.\n // Make the matches accessible through `state.matches` in the\n // `run: (state) => ...` trigger.\n const matches = [];\n result.matches = matches;\n if (result.results) {\n result.results.forEach((r) => matches.push(flattenMatches(r)));\n }\n if (rule.run && result.success) {\n rule.run({ matches });\n }\n return result;\n }\n}\nParser.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Articulation } from './articulation';\nimport { Dot } from './dot';\nimport { FretHandFinger } from './frethandfinger';\nimport { Music } from './music';\nimport { Parser } from './parser';\nimport { Stem } from './stem';\nimport { defined, log, RuntimeError } from './util';\n// To enable logging for this class. Set `Vex.Flow.EasyScore.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (EasyScore.DEBUG)\n log('Vex.Flow.EasyScore', args);\n}\nexport class EasyScoreGrammar {\n constructor(builder) {\n this.builder = builder;\n }\n begin() {\n return this.LINE;\n }\n LINE() {\n return {\n expect: [this.PIECE, this.PIECES, this.EOL],\n };\n }\n PIECE() {\n return {\n expect: [this.CHORDORNOTE, this.PARAMS],\n run: () => this.builder.commitPiece(),\n };\n }\n PIECES() {\n return {\n expect: [this.COMMA, this.PIECE],\n zeroOrMore: true,\n };\n }\n PARAMS() {\n return {\n expect: [this.DURATION, this.TYPE, this.DOTS, this.OPTS],\n };\n }\n CHORDORNOTE() {\n return {\n expect: [this.CHORD, this.SINGLENOTE],\n or: true,\n };\n }\n CHORD() {\n return {\n expect: [this.LPAREN, this.NOTES, this.RPAREN],\n // eslint-disable-next-line\n run: (state) => this.builder.addChord(state.matches[1]),\n };\n }\n NOTES() {\n return {\n expect: [this.NOTE],\n oneOrMore: true,\n };\n }\n NOTE() {\n return {\n expect: [this.NOTENAME, this.ACCIDENTAL, this.OCTAVE],\n };\n }\n SINGLENOTE() {\n return {\n expect: [this.NOTENAME, this.ACCIDENTAL, this.OCTAVE],\n run: (state) => {\n // eslint-disable-next-line\n const s = state;\n this.builder.addSingleNote(s.matches[0], s.matches[1], s.matches[2]);\n },\n };\n }\n ACCIDENTAL() {\n return {\n expect: [this.MICROTONES, this.ACCIDENTALS],\n maybe: true,\n or: true,\n };\n }\n DOTS() {\n return {\n expect: [this.DOT],\n zeroOrMore: true,\n // eslint-disable-next-line\n run: (state) => this.builder.setNoteDots(state.matches),\n };\n }\n TYPE() {\n return {\n expect: [this.SLASH, this.MAYBESLASH, this.TYPES],\n maybe: true,\n // eslint-disable-next-line\n run: (state) => this.builder.setNoteType(state.matches[2]),\n };\n }\n DURATION() {\n return {\n expect: [this.SLASH, this.DURATIONS],\n maybe: true,\n // eslint-disable-next-line\n run: (state) => this.builder.setNoteDuration(state.matches[1]),\n };\n }\n OPTS() {\n return {\n expect: [this.LBRACKET, this.KEYVAL, this.KEYVALS, this.RBRACKET],\n maybe: true,\n };\n }\n KEYVALS() {\n return {\n expect: [this.COMMA, this.KEYVAL],\n zeroOrMore: true,\n };\n }\n KEYVAL() {\n const unquote = (str) => str.slice(1, -1);\n return {\n expect: [this.KEY, this.EQUALS, this.VAL],\n // eslint-disable-next-line\n run: (state) => this.builder.addNoteOption(state.matches[0], unquote(state.matches[2])),\n };\n }\n VAL() {\n return {\n expect: [this.SVAL, this.DVAL],\n or: true,\n };\n }\n KEY() {\n return { token: '[a-zA-Z][a-zA-Z0-9]*' };\n }\n DVAL() {\n return { token: '[\"][^\"]*[\"]' };\n }\n SVAL() {\n return { token: \"['][^']*[']\" };\n }\n NOTENAME() {\n return { token: '[a-gA-G]' };\n }\n OCTAVE() {\n return { token: '[0-9]+' };\n }\n ACCIDENTALS() {\n return { token: 'bb|b|##|#|n' };\n }\n MICROTONES() {\n return { token: 'bbs|bss|bs|db|d|\\\\+\\\\+-|\\\\+-|\\\\+\\\\+|\\\\+|k|o' };\n }\n DURATIONS() {\n return { token: '[0-9whq]+' };\n }\n TYPES() {\n return { token: '[rRsSmMhHgG]' };\n }\n LPAREN() {\n return { token: '[(]' };\n }\n RPAREN() {\n return { token: '[)]' };\n }\n COMMA() {\n return { token: '[,]' };\n }\n DOT() {\n return { token: '[.]' };\n }\n SLASH() {\n return { token: '[/]' };\n }\n MAYBESLASH() {\n return { token: '[/]?' };\n }\n EQUALS() {\n return { token: '[=]' };\n }\n LBRACKET() {\n return { token: '\\\\[' };\n }\n RBRACKET() {\n return { token: '\\\\]' };\n }\n EOL() {\n return { token: '$' };\n }\n}\nexport class Piece {\n constructor(duration) {\n this.chord = [];\n this.dots = 0;\n this.options = {};\n this.duration = duration;\n }\n}\nexport class Builder {\n constructor(factory) {\n this.commitHooks = [];\n this.factory = factory;\n this.reset();\n }\n reset(options) {\n this.options = Object.assign({ stem: 'auto', clef: 'treble' }, options);\n this.elements = { notes: [], accidentals: [] };\n this.rollingDuration = '8';\n this.resetPiece();\n }\n getFactory() {\n return this.factory;\n }\n getElements() {\n return this.elements;\n }\n addCommitHook(commitHook) {\n this.commitHooks.push(commitHook);\n }\n resetPiece() {\n L('resetPiece');\n this.piece = new Piece(this.rollingDuration);\n }\n setNoteDots(dots) {\n L('setNoteDots:', dots);\n if (dots)\n this.piece.dots = dots.length;\n }\n setNoteDuration(duration) {\n L('setNoteDuration:', duration);\n this.rollingDuration = this.piece.duration = duration || this.rollingDuration;\n }\n setNoteType(type) {\n L('setNoteType:', type);\n if (type)\n this.piece.type = type;\n }\n addNoteOption(key, value) {\n L('addNoteOption: key:', key, 'value:', value);\n this.piece.options[key] = value;\n }\n addNote(key, accid, octave) {\n L('addNote:', key, accid, octave);\n this.piece.chord.push({\n key: key,\n accid,\n octave,\n });\n }\n addSingleNote(key, accid, octave) {\n L('addSingleNote:', key, accid, octave);\n this.addNote(key, accid, octave);\n }\n // notes is an array with 3 entries\n addChord(notes) {\n L('startChord');\n if (typeof notes[0] !== 'object') {\n this.addSingleNote(notes[0]);\n }\n else {\n notes.forEach((n) => {\n if (n)\n this.addNote(...n); // n => [string, string | null, string]\n });\n }\n L('endChord');\n }\n commitPiece() {\n L('commitPiece');\n const { factory } = this;\n if (!factory)\n return;\n const options = Object.assign(Object.assign({}, this.options), this.piece.options);\n // reset() sets this.options.stem & this.options.clef but we check to make sure nothing has changed.\n // e.g., auto | up | down\n const stem = defined(options.stem, 'BadArguments', 'options.stem is not defined').toLowerCase();\n // e.g., treble | bass\n const clef = defined(options.clef, 'BadArguments', 'options.clef is not defined').toLowerCase();\n const { chord, duration, dots, type } = this.piece;\n // Create a string[] that will be assigned to the .keys property of the StaveNote.\n // Each string in the array represents a note pitch and is of the form: {NoteName}{Accidental}/{Octave}\n // Only standard accidentals are included in the .keys property. Microtonal accidentals are not included.\n const standardAccidentals = Music.accidentals;\n const keys = chord.map((notePiece) => {\n var _a;\n return notePiece.key +\n (standardAccidentals.includes((_a = notePiece.accid) !== null && _a !== void 0 ? _a : '') ? notePiece.accid : '') +\n '/' +\n notePiece.octave;\n });\n const auto_stem = stem === 'auto'; // StaveNoteStruct expects the underscore & lowercase.\n // Build a GhostNote or StaveNote using the information we gathered.\n const note = (type === null || type === void 0 ? void 0 : type.toLowerCase()) == 'g'\n ? factory.GhostNote({ duration, dots })\n : factory.StaveNote({ keys, duration, dots, type, clef, auto_stem });\n if (!auto_stem)\n note.setStemDirection(stem === 'up' ? Stem.UP : Stem.DOWN);\n // Attach accidentals.\n const accidentals = [];\n chord.forEach((notePiece, index) => {\n const accid = notePiece.accid;\n if (typeof accid === 'string') {\n const accidental = factory.Accidental({ type: accid });\n note.addModifier(accidental, index);\n accidentals.push(accidental);\n }\n else {\n accidentals.push(undefined);\n }\n });\n // Attach dots.\n for (let i = 0; i < dots; i++)\n Dot.buildAndAttach([note], { all: true });\n this.commitHooks.forEach((commitHook) => commitHook(options, note, this));\n this.elements.notes.push(note);\n this.elements.accidentals.push(accidentals);\n this.resetPiece();\n }\n}\n/**\n * Commit hook used by EasyScore.setOptions().\n */\nfunction setId(options, note) {\n if (options.id === undefined)\n return;\n note.setAttribute('id', options.id);\n}\n// Used by setClass() below.\nconst commaSeparatedRegex = /\\s*,\\s*/;\n/**\n * Commit hook used by EasyScore.setOptions().\n */\nfunction setClass(options, note) {\n if (options.class === undefined)\n return;\n options.class.split(commaSeparatedRegex).forEach((className) => note.addClass(className));\n}\n/**\n * EasyScore implements a parser for a simple language to generate VexFlow objects.\n */\nexport class EasyScore {\n constructor(options = {}) {\n this.defaults = {\n clef: 'treble',\n time: '4/4',\n stem: 'auto',\n };\n this.setOptions(options);\n }\n /**\n * Set the score defaults.\n * clef must be set appropriately to avoid errors when adding Staves.\n * @param defaults.clef default clef ( treble | bass ...) see {@link Clef.types}\n * @param defaults.time default time signature ( 4/4 | 9/8 ...)\n * @param defaults.stem default stem arrangement (auto | up | down)\n * @returns this\n */\n set(defaults) {\n this.defaults = Object.assign(Object.assign({}, this.defaults), defaults);\n return this;\n }\n /**\n * @param options.factory is required.\n * @returns this\n */\n setOptions(options) {\n var _a, _b;\n // eslint-disable-next-line\n const factory = options.factory; // ! operator, because options.factory was set in Factory.EasyScore().\n const builder = (_a = options.builder) !== null && _a !== void 0 ? _a : new Builder(factory);\n this.options = Object.assign(Object.assign({ commitHooks: [setId, setClass, Articulation.easyScoreHook, FretHandFinger.easyScoreHook], throwOnError: false }, options), { factory,\n builder });\n this.factory = factory;\n this.builder = builder;\n this.grammar = new EasyScoreGrammar(this.builder);\n this.parser = new Parser(this.grammar);\n (_b = this.options.commitHooks) === null || _b === void 0 ? void 0 : _b.forEach((commitHook) => this.addCommitHook(commitHook));\n return this;\n }\n setContext(context) {\n this.factory.setContext(context);\n return this;\n }\n parse(line, options = {}) {\n this.builder.reset(options);\n const result = this.parser.parse(line);\n if (!result.success && this.options.throwOnError) {\n L(result);\n throw new RuntimeError('Error parsing line: ' + line);\n }\n return result;\n }\n beam(notes, options) {\n this.factory.Beam({ notes, options });\n return notes;\n }\n tuplet(notes, options) {\n this.factory.Tuplet({ notes, options });\n return notes;\n }\n notes(line, options = {}) {\n options = Object.assign({ clef: this.defaults.clef, stem: this.defaults.stem }, options);\n this.parse(line, options);\n return this.builder.getElements().notes;\n }\n voice(notes, options = {}) {\n options = Object.assign({ time: this.defaults.time }, options);\n return this.factory.Voice(options).addTickables(notes);\n }\n addCommitHook(commitHook) {\n this.builder.addCommitHook(commitHook);\n }\n}\nEasyScore.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\nimport { StemmableNote } from './stemmablenote';\nimport { Category, isAnnotation } from './typeguard';\nimport { RuntimeError } from './util';\nconst ERROR_MSG = 'Ghost note must have valid initialization data to identify duration.';\nexport class GhostNote extends StemmableNote {\n static get CATEGORY() {\n return Category.GhostNote;\n }\n constructor(parameter) {\n if (!parameter) {\n throw new RuntimeError('BadArguments', ERROR_MSG);\n }\n let noteStruct;\n if (typeof parameter === 'string') {\n // Preserve backwards-compatibility\n noteStruct = { duration: parameter };\n }\n else if (typeof parameter === 'object') {\n noteStruct = parameter;\n }\n else {\n throw new RuntimeError('BadArguments', ERROR_MSG);\n }\n super(noteStruct);\n // Note properties\n this.setWidth(0);\n }\n /**\n * @returns true if this note is a type of rest. Rests don't have pitches, but take up space in the score.\n */\n isRest() {\n return true;\n }\n setStave(stave) {\n super.setStave(stave);\n return this;\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n draw() {\n // Draw Annotations\n this.setRendered();\n for (let i = 0; i < this.modifiers.length; ++i) {\n const modifier = this.modifiers[i];\n if (isAnnotation(modifier)) {\n modifier.setContext(this.getContext());\n modifier.drawWithStyle();\n }\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { Note } from './note';\nimport { Category } from './typeguard';\nexport class GlyphNote extends Note {\n constructor(glyph, noteStruct, options) {\n super(noteStruct);\n this.options = Object.assign({ ignoreTicks: false, line: 2 }, options);\n // Note properties\n this.ignore_ticks = this.options.ignoreTicks;\n if (glyph) {\n this.setGlyph(glyph);\n }\n }\n static get CATEGORY() {\n return Category.GlyphNote;\n }\n setGlyph(glyph) {\n this.glyph = glyph;\n this.setWidth(this.glyph.getMetrics().width);\n return this;\n }\n getBoundingBox() {\n return this.glyph.getBoundingBox();\n }\n preFormat() {\n if (!this.preFormatted && this.modifierContext) {\n this.modifierContext.preFormat();\n }\n this.preFormatted = true;\n return this;\n }\n drawModifiers() {\n const ctx = this.checkContext();\n ctx.openGroup('modifiers');\n for (let i = 0; i < this.modifiers.length; i++) {\n const modifier = this.modifiers[i];\n modifier.setContext(ctx);\n modifier.drawWithStyle();\n }\n ctx.closeGroup();\n }\n draw() {\n const stave = this.checkStave();\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.openGroup('glyphNote', this.getAttribute('id'));\n // Context is set when setStave is called on Note\n const glyph = this.glyph;\n if (!glyph.getContext()) {\n glyph.setContext(ctx);\n }\n glyph.setStave(stave);\n glyph.setYShift(stave.getYForLine(this.options.line) - stave.getYForGlyphs());\n const x = this.isCenterAligned() ? this.getAbsoluteX() - this.getWidth() / 2 : this.getAbsoluteX();\n glyph.renderToStave(x);\n this.drawModifiers();\n ctx.closeGroup();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { StaveNote } from './stavenote';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class GraceNote extends StaveNote {\n constructor(noteStruct) {\n super(Object.assign({ glyph_font_scale: Tables.NOTATION_FONT_SCALE * GraceNote.SCALE, stroke_px: GraceNote.LEDGER_LINE_OFFSET }, noteStruct));\n this.slash = noteStruct.slash || false;\n this.slur = true;\n this.buildNoteHeads();\n this.width = 3;\n }\n static get CATEGORY() {\n return Category.GraceNote;\n }\n static get LEDGER_LINE_OFFSET() {\n return 2;\n }\n static get SCALE() {\n return 0.66;\n }\n getStemExtension() {\n if (this.stem_extension_override) {\n return this.stem_extension_override;\n }\n const glyph = this.getGlyph();\n if (glyph) {\n let ret = super.getStemExtension();\n if (glyph.stem) {\n const staveNoteScale = this.getStaveNoteScale();\n ret = (Stem.HEIGHT + ret) * staveNoteScale - Stem.HEIGHT;\n }\n return ret;\n }\n return 0;\n }\n // FIXME: move this to more basic class.\n getStaveNoteScale() {\n return this.render_options.glyph_font_scale / Tables.NOTATION_FONT_SCALE;\n }\n draw() {\n super.draw();\n this.setRendered();\n const stem = this.stem;\n if (this.slash && stem) {\n const staveNoteScale = this.getStaveNoteScale();\n // some magic numbers are based on the staveNoteScale 0.66.\n const offsetScale = staveNoteScale / 0.66;\n let slashBBox = undefined;\n const beam = this.beam;\n if (beam) {\n // FIXME: should render slash after beam?\n if (!beam.postFormatted) {\n beam.postFormat();\n }\n slashBBox = this.calcBeamedNotesSlashBBox(8 * offsetScale, 8 * offsetScale, {\n stem: 6 * offsetScale,\n beam: 5 * offsetScale,\n });\n }\n else {\n const stem_direction = this.getStemDirection();\n const noteHeadBounds = this.getNoteHeadBounds();\n const noteStemHeight = stem.getHeight();\n let x = this.getAbsoluteX();\n let y = stem_direction === Stem.DOWN\n ? noteHeadBounds.y_top - noteStemHeight\n : noteHeadBounds.y_bottom - noteStemHeight;\n let defaultOffsetY = Tables.STEM_HEIGHT;\n defaultOffsetY -= defaultOffsetY / 2.8;\n y += defaultOffsetY * staveNoteScale * stem_direction;\n const offsets = stem_direction === Stem.UP\n ? {\n x1: 1,\n y1: 0,\n x2: 13,\n y2: -9,\n }\n : {\n x1: -4,\n y1: 1,\n x2: 13,\n y2: 9,\n };\n x += offsets.x1 * offsetScale;\n y += offsets.y1 * offsetScale;\n slashBBox = {\n x1: x,\n y1: y,\n x2: x + offsets.x2 * offsetScale,\n y2: y + offsets.y2 * offsetScale,\n };\n }\n // FIXME: avoid staff lines, ledger lines or others.\n const ctx = this.checkContext();\n ctx.save();\n ctx.setLineWidth(1 * offsetScale); // FIXME: use more appropriate value.\n ctx.beginPath();\n ctx.moveTo(slashBBox.x1, slashBBox.y1);\n ctx.lineTo(slashBBox.x2, slashBBox.y2);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n }\n }\n calcBeamedNotesSlashBBox(slashStemOffset, slashBeamOffset, protrusions) {\n const beam = this.beam;\n if (!beam)\n throw new RuntimeError('NoBeam', \"Can't calculate without a beam.\");\n const beam_slope = beam.slope;\n const isBeamEndNote = beam.notes[beam.notes.length - 1] === this;\n const scaleX = isBeamEndNote ? -1 : 1;\n const beam_angle = Math.atan(beam_slope * scaleX);\n // slash line intersecting point on beam.\n const iPointOnBeam = {\n dx: Math.cos(beam_angle) * slashBeamOffset,\n dy: Math.sin(beam_angle) * slashBeamOffset,\n };\n slashStemOffset *= this.getStemDirection();\n const slash_angle = Math.atan((iPointOnBeam.dy - slashStemOffset) / iPointOnBeam.dx);\n const protrusion_stem_dx = Math.cos(slash_angle) * protrusions.stem * scaleX;\n const protrusion_stem_dy = Math.sin(slash_angle) * protrusions.stem;\n const protrusion_beam_dx = Math.cos(slash_angle) * protrusions.beam * scaleX;\n const protrusion_beam_dy = Math.sin(slash_angle) * protrusions.beam;\n const stemX = this.getStemX();\n const stem0X = beam.notes[0].getStemX();\n const stemY = beam.getBeamYToDraw() + (stemX - stem0X) * beam_slope;\n const ret = {\n x1: stemX - protrusion_stem_dx,\n y1: stemY + slashStemOffset - protrusion_stem_dy,\n x2: stemX + iPointOnBeam.dx * scaleX + protrusion_beam_dx,\n y2: stemY + iPointOnBeam.dy + protrusion_beam_dy,\n };\n return ret;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Mark Meeus 2019\nimport { KeySignature } from './keysignature';\nimport { Note } from './note';\nimport { Category } from './typeguard';\nexport class KeySigNote extends Note {\n constructor(keySpec, cancelKeySpec, alterKeySpec) {\n super({ duration: 'b' });\n this.keySignature = new KeySignature(keySpec, cancelKeySpec, alterKeySpec);\n // Note properties\n this.ignore_ticks = true;\n }\n static get CATEGORY() {\n return Category.KeySigNote;\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n preFormat() {\n this.preFormatted = true;\n this.keySignature.setStave(this.checkStave());\n this.setWidth(this.keySignature.getWidth());\n return this;\n }\n draw() {\n const ctx = this.checkStave().checkContext();\n this.setRendered();\n this.keySignature.setX(this.getAbsoluteX());\n this.keySignature.setContext(ctx);\n this.keySignature.draw();\n }\n}\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n//\n// This class implements multiple measure rests.\nimport { Element } from './element';\nimport { Glyph } from './glyph';\nimport { NoteHead } from './notehead';\nimport { StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { TimeSignature } from './timesignature';\nimport { Category, isBarline } from './typeguard';\nimport { defined } from './util';\nlet semibreve_rest;\nfunction get_semibreve_rest() {\n if (!semibreve_rest) {\n const noteHead = new NoteHead({ duration: 'w', note_type: 'r' });\n semibreve_rest = {\n glyph_font_scale: noteHead.render_options.glyph_font_scale,\n glyph_code: noteHead.glyph_code,\n width: noteHead.getWidth(),\n };\n }\n return semibreve_rest;\n}\nexport class MultiMeasureRest extends Element {\n /**\n *\n * @param number_of_measures Number of measures.\n * @param options The options object.\n */\n constructor(number_of_measures, options) {\n super();\n this.xs = { left: NaN, right: NaN };\n this.hasPaddingLeft = false;\n this.hasPaddingRight = false;\n this.hasLineThickness = false;\n this.hasSymbolSpacing = false;\n this.number_of_measures = number_of_measures;\n // Keep track of whether these four options were provided.\n this.hasPaddingLeft = typeof options.padding_left === 'number';\n this.hasPaddingRight = typeof options.padding_right === 'number';\n this.hasLineThickness = typeof options.line_thickness === 'number';\n this.hasSymbolSpacing = typeof options.symbol_spacing === 'number';\n const musicFont = Tables.currentMusicFont();\n this.render_options = Object.assign({ use_symbols: false, show_number: true, number_line: -0.5, number_glyph_point: musicFont.lookupMetric('digits.point'), line: 2, spacing_between_lines_px: Tables.STAVE_LINE_DISTANCE, serif_thickness: 2, semibreve_rest_glyph_scale: Tables.NOTATION_FONT_SCALE, padding_left: 0, padding_right: 0, line_thickness: 5, symbol_spacing: 0 }, options);\n const fontLineShift = musicFont.lookupMetric('digits.shiftLine', 0);\n this.render_options.number_line += fontLineShift;\n }\n static get CATEGORY() {\n return Category.MultiMeasureRest;\n }\n getXs() {\n return this.xs;\n }\n setStave(stave) {\n this.stave = stave;\n return this;\n }\n getStave() {\n return this.stave;\n }\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n drawLine(stave, ctx, left, right, spacingBetweenLines) {\n const options = this.render_options;\n const y = stave.getYForLine(options.line);\n const padding = (right - left) * 0.1;\n left += padding;\n right -= padding;\n let lineThicknessHalf;\n if (this.hasLineThickness) {\n lineThicknessHalf = options.line_thickness * 0.5;\n }\n else {\n lineThicknessHalf = spacingBetweenLines * 0.25;\n }\n const serifThickness = options.serif_thickness;\n const top = y - spacingBetweenLines;\n const bot = y + spacingBetweenLines;\n const leftIndented = left + serifThickness;\n const rightIndented = right - serifThickness;\n const lineTop = y - lineThicknessHalf;\n const lineBottom = y + lineThicknessHalf;\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(left, top);\n ctx.lineTo(leftIndented, top);\n ctx.lineTo(leftIndented, lineTop);\n ctx.lineTo(rightIndented, lineTop);\n ctx.lineTo(rightIndented, top);\n ctx.lineTo(right, top);\n ctx.lineTo(right, bot);\n ctx.lineTo(rightIndented, bot);\n ctx.lineTo(rightIndented, lineBottom);\n ctx.lineTo(leftIndented, lineBottom);\n ctx.lineTo(leftIndented, bot);\n ctx.lineTo(left, bot);\n ctx.closePath();\n ctx.fill();\n }\n drawSymbols(stave, ctx, left, right, spacingBetweenLines) {\n const n4 = Math.floor(this.number_of_measures / 4);\n const n = this.number_of_measures % 4;\n const n2 = Math.floor(n / 2);\n const n1 = n % 2;\n const options = this.render_options;\n // FIXME: TODO: invalidate semibreve_rest at the appropriate time\n // (e.g., if the system font settings are changed).\n semibreve_rest = undefined;\n const rest = get_semibreve_rest();\n const rest_scale = options.semibreve_rest_glyph_scale;\n const rest_width = rest.width * (rest_scale / rest.glyph_font_scale);\n const glyphs = {\n 2: {\n width: rest_width * 0.5,\n height: spacingBetweenLines,\n },\n 1: {\n width: rest_width,\n },\n };\n /* 10: normal spacingBetweenLines */\n const spacing = this.hasSymbolSpacing ? options.symbol_spacing : 10;\n const width = n4 * glyphs[2].width + n2 * glyphs[2].width + n1 * glyphs[1].width + (n4 + n2 + n1 - 1) * spacing;\n let x = left + (right - left) * 0.5 - width * 0.5;\n const line = options.line;\n const yTop = stave.getYForLine(line - 1);\n const yMiddle = stave.getYForLine(line);\n const yBottom = stave.getYForLine(line + 1);\n ctx.save();\n ctx.setStrokeStyle('none');\n ctx.setLineWidth(0);\n for (let i = 0; i < n4; ++i) {\n ctx.fillRect(x, yMiddle - glyphs[2].height, glyphs[2].width, glyphs[2].height);\n ctx.fillRect(x, yBottom - glyphs[2].height, glyphs[2].width, glyphs[2].height);\n x += glyphs[2].width + spacing;\n }\n for (let i = 0; i < n2; ++i) {\n ctx.fillRect(x, yMiddle - glyphs[2].height, glyphs[2].width, glyphs[2].height);\n x += glyphs[2].width + spacing;\n }\n for (let i = 0; i < n1; ++i) {\n Glyph.renderGlyph(ctx, x, yTop, rest_scale, rest.glyph_code);\n x += glyphs[1].width + spacing;\n }\n ctx.restore();\n }\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n const stave = this.checkStave();\n let left = stave.getNoteStartX();\n let right = stave.getNoteEndX();\n // FIXME: getNoteStartX() returns x + 5(barline width)\n // getNoteEndX() returns x + width(no barline width)\n // See Stave constructor. How do we fix this?\n // Here, we subtract the barline width.\n const begModifiers = stave.getModifiers(StaveModifierPosition.BEGIN);\n if (begModifiers.length === 1 && isBarline(begModifiers[0])) {\n left -= begModifiers[0].getWidth();\n }\n const options = this.render_options;\n if (this.hasPaddingLeft) {\n left = stave.getX() + options.padding_left;\n }\n if (this.hasPaddingRight) {\n right = stave.getX() + stave.getWidth() - options.padding_right;\n }\n this.xs.left = left;\n this.xs.right = right;\n const spacingBetweenLines = options.spacing_between_lines_px;\n if (options.use_symbols) {\n this.drawSymbols(stave, ctx, left, right, spacingBetweenLines);\n }\n else {\n this.drawLine(stave, ctx, left, right, spacingBetweenLines);\n }\n if (options.show_number) {\n const timeSpec = '/' + this.number_of_measures;\n const timeSig = new TimeSignature(timeSpec, 0, false);\n timeSig.point = options.number_glyph_point;\n timeSig.setTimeSig(timeSpec);\n timeSig.setStave(stave);\n timeSig.setX(left + (right - left) * 0.5 - timeSig.getInfo().glyph.getMetrics().width * 0.5);\n timeSig.bottomLine = options.number_line;\n timeSig.setContext(ctx).draw();\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (PedalMarking.DEBUG)\n log('Vex.Flow.PedalMarking', args);\n}\n/**\n * Draws a pedal glyph with the provided `name` on a rendering `context`\n * at the coordinates `x` and `y. Takes into account the glyph data\n * coordinate shifts.\n */\nfunction drawPedalGlyph(name, context, x, y, point) {\n const glyph_data = PedalMarking.GLYPHS[name];\n const glyph = new Glyph(glyph_data.code, point, { category: 'pedalMarking' });\n glyph.render(context, x + glyph_data.x_shift, y + glyph_data.y_shift);\n}\n/**\n * PedalMarking implements different types of pedal markings. These notation\n * elements indicate to the performer when to depress and release the a pedal.\n *\n * In order to create \"Sostenuto\", and \"una corda\" markings, you must set\n * custom text for the release/depress pedal markings.\n */\nexport class PedalMarking extends Element {\n constructor(notes) {\n super();\n this.notes = notes;\n this.type = PedalMarking.type.TEXT;\n this.line = 0;\n // Custom text for the release/depress markings\n this.custom_depress_text = '';\n this.custom_release_text = '';\n this.resetFont();\n this.render_options = {\n bracket_height: 10,\n text_margin_right: 6,\n bracket_line_width: 1,\n color: 'black',\n };\n }\n static get CATEGORY() {\n return Category.PedalMarking;\n }\n /**\n * Create a sustain pedal marking. Returns the defaults PedalMarking.\n * Which uses the traditional \"Ped\" and \"*\"\" markings.\n */\n static createSustain(notes) {\n const pedal = new PedalMarking(notes);\n return pedal;\n }\n /** Create a sostenuto pedal marking */\n static createSostenuto(notes) {\n const pedal = new PedalMarking(notes);\n pedal.setType(PedalMarking.type.MIXED);\n pedal.setCustomText('Sost. Ped.');\n return pedal;\n }\n /** Create an una corda pedal marking */\n static createUnaCorda(notes) {\n const pedal = new PedalMarking(notes);\n pedal.setType(PedalMarking.type.TEXT);\n pedal.setCustomText('una corda', 'tre corda');\n return pedal;\n }\n /** Set pedal type. */\n setType(type) {\n type = typeof type === 'string' ? PedalMarking.typeString[type] : type;\n if (type >= PedalMarking.type.TEXT && type <= PedalMarking.type.MIXED) {\n this.type = type;\n }\n return this;\n }\n /**\n * Set custom text for the `depress`/`release` pedal markings. No text is\n * set if the parameter is falsy.\n */\n setCustomText(depress, release) {\n this.custom_depress_text = depress || '';\n this.custom_release_text = release || '';\n return this;\n }\n /** Set the staff line to render the markings on. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Draw the bracket based pedal markings. */\n drawBracketed() {\n const ctx = this.checkContext();\n let is_pedal_depressed = false;\n let prev_x;\n let prev_y;\n // Iterate through each note\n this.notes.forEach((note, index, notes) => {\n // Each note triggers the opposite pedal action\n is_pedal_depressed = !is_pedal_depressed;\n // Get the initial coordinates for the note\n const x = note.getAbsoluteX();\n const y = note.checkStave().getYForBottomText(this.line + 3);\n // Throw if current note is positioned before the previous note\n if (x < prev_x) {\n throw new RuntimeError('InvalidConfiguration', 'The notes provided must be in order of ascending x positions');\n }\n // Determine if the previous or next note are the same\n // as the current note. We need to keep track of this for\n // when adjustments are made for the release+depress action\n const next_is_same = notes[index + 1] === note;\n const prev_is_same = notes[index - 1] === note;\n let x_shift = 0;\n const point = Tables.currentMusicFont().lookupMetric(`pedalMarking.${is_pedal_depressed ? 'down' : 'up'}.point`);\n if (is_pedal_depressed) {\n // Adjustment for release+depress\n x_shift = prev_is_same ? 5 : 0;\n if (this.type === PedalMarking.type.MIXED && !prev_is_same) {\n // For MIXED style, start with text instead of bracket\n if (this.custom_depress_text) {\n // If we have custom text, use instead of the default \"Ped\" glyph\n const text_width = ctx.measureText(this.custom_depress_text).width;\n ctx.fillText(this.custom_depress_text, x - text_width / 2, y);\n x_shift = text_width / 2 + this.render_options.text_margin_right;\n }\n else {\n // Render the Ped glyph in position\n drawPedalGlyph('pedal_depress', ctx, x, y, point);\n x_shift = 20 + this.render_options.text_margin_right;\n }\n }\n else {\n // Draw start bracket\n ctx.beginPath();\n ctx.moveTo(x, y - this.render_options.bracket_height);\n ctx.lineTo(x + x_shift, y);\n ctx.stroke();\n ctx.closePath();\n }\n }\n else {\n // Adjustment for release+depress\n x_shift = next_is_same ? -5 : 0;\n // Draw end bracket\n ctx.beginPath();\n ctx.moveTo(prev_x, prev_y);\n ctx.lineTo(x + x_shift, y);\n ctx.lineTo(x, y - this.render_options.bracket_height);\n ctx.stroke();\n ctx.closePath();\n }\n // Store previous coordinates\n prev_x = x + x_shift;\n prev_y = y;\n });\n }\n /**\n * Draw the text based pedal markings. This defaults to the traditional\n * \"Ped\" and \"*\"\" symbols if no custom text has been provided.\n */\n drawText() {\n const ctx = this.checkContext();\n let is_pedal_depressed = false;\n // Iterate through each note, placing glyphs or custom text accordingly\n this.notes.forEach((note) => {\n is_pedal_depressed = !is_pedal_depressed;\n const stave = note.checkStave();\n const x = note.getAbsoluteX();\n const y = stave.getYForBottomText(this.line + 3);\n const point = Tables.currentMusicFont().lookupMetric(`pedalMarking.${is_pedal_depressed ? 'down' : 'up'}.point`);\n let text_width = 0;\n if (is_pedal_depressed) {\n if (this.custom_depress_text) {\n text_width = ctx.measureText(this.custom_depress_text).width;\n ctx.fillText(this.custom_depress_text, x - text_width / 2, y);\n }\n else {\n drawPedalGlyph('pedal_depress', ctx, x, y, point);\n }\n }\n else {\n if (this.custom_release_text) {\n text_width = ctx.measureText(this.custom_release_text).width;\n ctx.fillText(this.custom_release_text, x - text_width / 2, y);\n }\n else {\n drawPedalGlyph('pedal_release', ctx, x, y, point);\n }\n }\n });\n }\n /** Render the pedal marking in position on the rendering context. */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n ctx.save();\n ctx.setStrokeStyle(this.render_options.color);\n ctx.setFillStyle(this.render_options.color);\n ctx.setFont(this.textFont);\n L('Rendering Pedal Marking');\n if (this.type === PedalMarking.type.BRACKET || this.type === PedalMarking.type.MIXED) {\n ctx.setLineWidth(this.render_options.bracket_line_width);\n this.drawBracketed();\n }\n else if (this.type === PedalMarking.type.TEXT) {\n this.drawText();\n }\n ctx.restore();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.PedalMarking.DEBUG` to `true`. */\nPedalMarking.DEBUG = false;\nPedalMarking.TEXT_FONT = {\n family: Font.SERIF,\n size: 12,\n weight: FontWeight.BOLD,\n style: FontStyle.ITALIC,\n};\n/** Glyph data */\nPedalMarking.GLYPHS = {\n pedal_depress: {\n code: 'keyboardPedalPed',\n x_shift: -10,\n y_shift: 0,\n },\n pedal_release: {\n code: 'keyboardPedalUp',\n x_shift: -2,\n y_shift: 3,\n },\n};\n/** Pedal type as number. */\nPedalMarking.type = {\n TEXT: 1,\n BRACKET: 2,\n MIXED: 3,\n};\n/** Pedal type as string. */\nPedalMarking.typeString = {\n text: PedalMarking.type.TEXT,\n bracket: PedalMarking.type.BRACKET,\n mixed: PedalMarking.type.MIXED,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { Glyph } from './glyph';\nimport { GlyphNote } from './glyphnote';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\n// Map `type` to SMuFL glyph code.\nconst CODES = {\n '1': 'repeat1Bar',\n '2': 'repeat2Bars',\n '4': 'repeat4Bars',\n slash: 'repeatBarSlash',\n};\nexport class RepeatNote extends GlyphNote {\n static get CATEGORY() {\n return Category.RepeatNote;\n }\n constructor(type, noteStruct, options) {\n super(undefined, Object.assign({ duration: 'q', align_center: type !== 'slash' }, noteStruct), options);\n const glyphCode = CODES[type] || 'repeat1Bar';\n const glyph = new Glyph(glyphCode, Tables.currentMusicFont().lookupMetric('repeatNote.point', 40), {\n category: 'repeatNote',\n });\n this.setGlyph(glyph);\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements `StaveLine` which are simply lines that connect\n// two notes. This object is highly configurable, see the `render_options`.\n// A simple line is often used for notating glissando articulations, but you\n// can format a `StaveLine` with arrows or colors for more pedagogical\n// purposes, such as diagrams.\nimport { Element } from './element';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\n// Attribution: Arrow rendering implementations based off of\n// Patrick Horgan's article, \"Drawing lines and arcs with\n// arrow heads on HTML5 Canvas\"\n//\n// Draw an arrow head that connects between 3 coordinates.\nfunction drawArrowHead(ctx, x0, y0, x1, y1, x2, y2) {\n // all cases do this.\n ctx.beginPath();\n ctx.moveTo(x0, y0);\n ctx.lineTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.lineTo(x0, y0);\n ctx.closePath();\n ctx.fill();\n}\nexport class StaveLine extends Element {\n // Initialize the StaveLine with the given `notes`.\n //\n // `notes` is a struct that has:\n //\n // ```\n // {\n // first_note: Note,\n // last_note: Note,\n // first_indices: [n1, n2, n3],\n // last_indices: [n1, n2, n3]\n // }\n // ```\n constructor(notes) {\n super();\n this.setNotes(notes);\n this.text = '';\n this.resetFont();\n this.render_options = {\n // Space to add to the left or the right\n padding_left: 4,\n padding_right: 3,\n // The width of the line in pixels\n line_width: 1,\n // An array of line/space lengths. (TODO/QUESTION: Is this supported in SVG?).\n line_dash: undefined,\n // Can draw rounded line end, instead of a square. (TODO/QUESTION: Is this supported in SVG?).\n rounded_end: true,\n // The color of the line and arrowheads\n color: undefined,\n // Flags to draw arrows on each end of the line\n draw_start_arrow: false,\n draw_end_arrow: false,\n // The length of the arrowhead sides\n arrowhead_length: 10,\n // The angle of the arrowhead\n arrowhead_angle: Math.PI / 8,\n // The position of the text\n text_position_vertical: StaveLine.TextVerticalPosition.TOP,\n text_justification: StaveLine.TextJustification.CENTER,\n };\n }\n static get CATEGORY() {\n return Category.StaveLine;\n }\n // The the annotation for the `StaveLine`\n setText(text) {\n this.text = text;\n return this;\n }\n // Set the notes for the `StaveLine`\n setNotes(notes) {\n if (!notes.first_note && !notes.last_note) {\n throw new RuntimeError('BadArguments', 'Notes needs to have either first_note or last_note set.');\n }\n if (!notes.first_indices)\n notes.first_indices = [0];\n if (!notes.last_indices)\n notes.last_indices = [0];\n if (notes.first_indices.length !== notes.last_indices.length) {\n throw new RuntimeError('BadArguments', 'Connected notes must have same number of indices.');\n }\n this.notes = notes;\n this.first_note = notes.first_note;\n this.first_indices = notes.first_indices;\n this.last_note = notes.last_note;\n this.last_indices = notes.last_indices;\n return this;\n }\n // Apply the style of the `StaveLine` to the context\n applyLineStyle() {\n const ctx = this.checkContext();\n const render_options = this.render_options;\n if (render_options.line_dash) {\n ctx.setLineDash(render_options.line_dash);\n }\n if (render_options.line_width) {\n ctx.setLineWidth(render_options.line_width);\n }\n if (render_options.rounded_end) {\n ctx.setLineCap('round');\n }\n else {\n ctx.setLineCap('square');\n }\n }\n // Apply the text styling to the context\n applyFontStyle() {\n const ctx = this.checkContext();\n ctx.setFont(this.textFont);\n const render_options = this.render_options;\n const color = render_options.color;\n if (color) {\n ctx.setStrokeStyle(color);\n ctx.setFillStyle(color);\n }\n }\n // Helper function to draw a line with arrow heads\n drawArrowLine(ctx, pt1, pt2) {\n const both_arrows = this.render_options.draw_start_arrow && this.render_options.draw_end_arrow;\n const x1 = pt1.x;\n const y1 = pt1.y;\n const x2 = pt2.x;\n const y2 = pt2.y;\n // For ends with arrow we actually want to stop before we get to the arrow\n // so that wide lines won't put a flat end on the arrow.\n const distance = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));\n const ratio = (distance - this.render_options.arrowhead_length / 3) / distance;\n let end_x;\n let end_y;\n let start_x;\n let start_y;\n if (this.render_options.draw_end_arrow || both_arrows) {\n end_x = Math.round(x1 + (x2 - x1) * ratio);\n end_y = Math.round(y1 + (y2 - y1) * ratio);\n }\n else {\n end_x = x2;\n end_y = y2;\n }\n if (this.render_options.draw_start_arrow || both_arrows) {\n start_x = x1 + (x2 - x1) * (1 - ratio);\n start_y = y1 + (y2 - y1) * (1 - ratio);\n }\n else {\n start_x = x1;\n start_y = y1;\n }\n if (this.render_options.color) {\n ctx.setStrokeStyle(this.render_options.color);\n ctx.setFillStyle(this.render_options.color);\n }\n // Draw the shaft of the arrow\n ctx.beginPath();\n ctx.moveTo(start_x, start_y);\n ctx.lineTo(end_x, end_y);\n ctx.stroke();\n ctx.closePath();\n // calculate the angle of the line\n const line_angle = Math.atan2(y2 - y1, x2 - x1);\n // h is the line length of a side of the arrow head\n const h = Math.abs(this.render_options.arrowhead_length / Math.cos(this.render_options.arrowhead_angle));\n let angle1;\n let angle2;\n let top_x;\n let top_y;\n let bottom_x;\n let bottom_y;\n if (this.render_options.draw_end_arrow || both_arrows) {\n angle1 = line_angle + Math.PI + this.render_options.arrowhead_angle;\n top_x = x2 + Math.cos(angle1) * h;\n top_y = y2 + Math.sin(angle1) * h;\n angle2 = line_angle + Math.PI - this.render_options.arrowhead_angle;\n bottom_x = x2 + Math.cos(angle2) * h;\n bottom_y = y2 + Math.sin(angle2) * h;\n drawArrowHead(ctx, top_x, top_y, x2, y2, bottom_x, bottom_y);\n }\n if (this.render_options.draw_start_arrow || both_arrows) {\n angle1 = line_angle + this.render_options.arrowhead_angle;\n top_x = x1 + Math.cos(angle1) * h;\n top_y = y1 + Math.sin(angle1) * h;\n angle2 = line_angle - this.render_options.arrowhead_angle;\n bottom_x = x1 + Math.cos(angle2) * h;\n bottom_y = y1 + Math.sin(angle2) * h;\n drawArrowHead(ctx, top_x, top_y, x1, y1, bottom_x, bottom_y);\n }\n }\n // Renders the `StaveLine` on the context\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n const first_note = this.first_note;\n const last_note = this.last_note;\n const render_options = this.render_options;\n ctx.save();\n this.applyLineStyle();\n // Cycle through each set of indices and draw lines\n let start_position = { x: 0, y: 0 };\n let end_position = { x: 0, y: 0 };\n this.first_indices.forEach((first_index, i) => {\n const last_index = this.last_indices[i];\n // Get initial coordinates for the start/end of the line\n start_position = first_note.getModifierStartXY(2, first_index);\n end_position = last_note.getModifierStartXY(1, last_index);\n const upwards_slope = start_position.y > end_position.y;\n // Adjust `x` coordinates for modifiers\n start_position.x += first_note.getMetrics().modRightPx + render_options.padding_left;\n end_position.x -= last_note.getMetrics().modLeftPx + render_options.padding_right;\n // Adjust first `x` coordinates for displacements\n const notehead_width = first_note.getGlyph().getWidth();\n const first_displaced = first_note.getKeyProps()[first_index].displaced;\n if (first_displaced && first_note.getStemDirection() === 1) {\n start_position.x += notehead_width + render_options.padding_left;\n }\n // Adjust last `x` coordinates for displacements\n const last_displaced = last_note.getKeyProps()[last_index].displaced;\n if (last_displaced && last_note.getStemDirection() === -1) {\n end_position.x -= notehead_width + render_options.padding_right;\n }\n // Adjust y position better if it's not coming from the center of the note\n start_position.y += upwards_slope ? -3 : 1;\n end_position.y += upwards_slope ? 2 : 0;\n this.drawArrowLine(ctx, start_position, end_position);\n });\n ctx.restore();\n // Determine the x coordinate where to start the text\n const text_width = ctx.measureText(this.text).width;\n const justification = render_options.text_justification;\n let x = 0;\n if (justification === StaveLine.TextJustification.LEFT) {\n x = start_position.x;\n }\n else if (justification === StaveLine.TextJustification.CENTER) {\n const delta_x = end_position.x - start_position.x;\n const center_x = delta_x / 2 + start_position.x;\n x = center_x - text_width / 2;\n }\n else if (justification === StaveLine.TextJustification.RIGHT) {\n x = end_position.x - text_width;\n }\n // Determine the y value to start the text\n let y = 0;\n const vertical_position = render_options.text_position_vertical;\n if (vertical_position === StaveLine.TextVerticalPosition.TOP) {\n y = first_note.checkStave().getYForTopText();\n }\n else if (vertical_position === StaveLine.TextVerticalPosition.BOTTOM) {\n y = first_note.checkStave().getYForBottomText(Tables.TEXT_HEIGHT_OFFSET_HACK);\n }\n // Draw the text\n ctx.save();\n this.applyFontStyle();\n ctx.fillText(this.text, x, y);\n ctx.restore();\n return this;\n }\n}\n/** Default text font. */\nStaveLine.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n// Text Positioning\nStaveLine.TextVerticalPosition = {\n TOP: 1,\n BOTTOM: 2,\n};\nStaveLine.TextJustification = {\n LEFT: 1,\n CENTER: 2,\n RIGHT: 3,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { BoundingBox } from './boundingbox';\nimport { Element } from './element';\nimport { Formatter } from './formatter';\nimport { Note } from './note';\nimport { Stave } from './stave';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\n/**\n * System implements a musical system, which is a collection of staves,\n * each which can have one or more voices. All voices across all staves in\n * the system are formatted together.\n */\nexport class System extends Element {\n constructor(params = {}) {\n super();\n this.setOptions(params);\n this.parts = [];\n }\n static get CATEGORY() {\n return Category.System;\n }\n /** Set formatting options. */\n setOptions(options = {}) {\n if (!options.factory) {\n throw new RuntimeError('NoFactory', 'System.setOptions(options) requires a factory.');\n }\n this.factory = options.factory;\n this.options = Object.assign(Object.assign({ factory: this.factory, x: 10, y: 10, width: 500, spaceBetweenStaves: 12, autoWidth: false, noJustification: false, debugFormatter: false, formatIterations: 0, noPadding: false }, options), { details: Object.assign({ alpha: 0.5 }, options.details), formatOptions: Object.assign({}, options.formatOptions) });\n if (this.options.noJustification === false && typeof options.width === 'undefined') {\n this.options.autoWidth = true;\n }\n }\n /** Set associated context. */\n setContext(context) {\n super.setContext(context);\n this.factory.setContext(context);\n return this;\n }\n /**\n * Add connector between staves.\n * @param type see {@link StaveConnector.typeString}\n */\n addConnector(type = 'double') {\n this.connector = this.factory.StaveConnector({\n top_stave: this.parts[0].stave,\n bottom_stave: this.parts[this.parts.length - 1].stave,\n type,\n });\n return this.connector;\n }\n /**\n * Add a stave to the system.\n *\n * Example (one voice):\n *\n * `system.addStave({voices: [score.voice(score.notes('C#5/q, B4, A4, G#4'))]});`\n *\n * Example (two voices):\n *\n * `system.addStave({voices: [`\n * `score.voice(score.notes('C#5/q, B4, A4, G#4', {stem: 'up'})),`\n * `score.voice(score.notes('C#4/h, C#4', {stem: 'down'}))`\n * `]});`\n */\n addStave(params) {\n var _a;\n const staveOptions = Object.assign({ left_bar: false }, params.options);\n const stave = (_a = params.stave) !== null && _a !== void 0 ? _a : this.factory.Stave({ x: this.options.x, y: this.options.y, width: this.options.width, options: staveOptions });\n const p = Object.assign(Object.assign({ stave, \n /* voices: [], */\n spaceAbove: 0, spaceBelow: 0, debugNoteMetrics: false, noJustification: false }, params), { options: staveOptions });\n const ctx = this.getContext();\n p.voices.forEach((voice) => voice\n .setContext(ctx)\n .setStave(stave)\n .getTickables()\n .forEach((tickable) => tickable.setStave(stave)));\n this.parts.push(p);\n return stave;\n }\n /** Format the system. */\n format() {\n const options_details = this.options.details;\n let justifyWidth = 0;\n const formatter = new Formatter(options_details);\n this.formatter = formatter;\n let y = this.options.y;\n let startX = 0;\n let allVoices = [];\n const debugNoteMetricsYs = [];\n // Join the voices for each stave.\n this.parts.forEach((part) => {\n y = y + part.stave.space(part.spaceAbove);\n part.stave.setY(y);\n if (this.options.autoWidth) {\n part.voices.forEach((voice) => {\n formatter.joinVoices([voice]);\n });\n }\n else {\n formatter.joinVoices(part.voices);\n }\n y = y + part.stave.space(part.spaceBelow);\n y = y + part.stave.space(this.options.spaceBetweenStaves);\n if (part.debugNoteMetrics) {\n debugNoteMetricsYs.push({ y, voice: part.voices[0] });\n y += 15;\n }\n allVoices = allVoices.concat(part.voices);\n startX = Math.max(startX, part.stave.getNoteStartX());\n });\n // Update the start position of all staves.\n this.parts.forEach((part) => part.stave.setNoteStartX(startX));\n if (this.options.autoWidth) {\n justifyWidth = formatter.preCalculateMinTotalWidth(allVoices);\n this.parts.forEach((part) => {\n part.stave.setWidth(justifyWidth + Stave.rightPadding + (startX - this.options.x));\n });\n }\n else {\n justifyWidth = this.options.noPadding\n ? this.options.width - this.options.x\n : this.options.width - (startX - this.options.x) - Stave.defaultPadding;\n }\n formatter.format(allVoices, this.options.noJustification ? 0 : justifyWidth, this.options.formatOptions);\n for (let i = 0; i < this.options.formatIterations; i++) {\n formatter.tune(options_details);\n }\n this.startX = startX;\n this.debugNoteMetricsYs = debugNoteMetricsYs;\n this.lastY = y;\n this.boundingBox = new BoundingBox(this.options.x, this.options.y, this.options.width, this.lastY - this.options.y);\n }\n /** Render the system. */\n draw() {\n // Render debugging information, if requested.\n const ctx = this.checkContext();\n if (!this.formatter || !this.startX || !this.lastY || !this.debugNoteMetricsYs) {\n throw new RuntimeError('NoFormatter', 'format() must be called before draw()');\n }\n this.setRendered();\n if (this.options.debugFormatter) {\n Formatter.plotDebugging(ctx, this.formatter, this.startX, this.options.y, this.lastY);\n }\n this.debugNoteMetricsYs.forEach((d) => {\n d.voice.getTickables().forEach((tickable) => Note.plotMetrics(ctx, tickable, d.y));\n });\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// The file implements notes for Tablature notation. This consists of one or\n// more fret positions, and can either be drawn with or without stems.\n//\n// See `tests/tabnote_tests.ts` for usage examples.\nimport { Font } from './font';\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { StemmableNote } from './stemmablenote';\nimport { Tables } from './tables';\nimport { Category, isDot } from './typeguard';\nimport { defined, RuntimeError } from './util';\n// Gets the unused strings grouped together if consecutive.\n//\n// Parameters:\n// * num_lines - The number of lines\n// * strings_used - An array of numbers representing which strings have fret positions\nfunction getUnusedStringGroups(num_lines, strings_used) {\n const stem_through = [];\n let group = [];\n for (let string = 1; string <= num_lines; string++) {\n const is_used = strings_used.indexOf(string) > -1;\n if (!is_used) {\n group.push(string);\n }\n else {\n stem_through.push(group);\n group = [];\n }\n }\n if (group.length > 0)\n stem_through.push(group);\n return stem_through;\n}\n// Gets groups of points that outline the partial stem lines\n// between fret positions\n//\n// Parameters:\n// * stem_Y - The `y` coordinate the stem is located on\n// * unused_strings - An array of groups of unused strings\n// * stave - The stave to use for reference\n// * stem_direction - The direction of the stem\nfunction getPartialStemLines(stem_y, unused_strings, stave, stem_direction) {\n const up_stem = stem_direction !== 1;\n const down_stem = stem_direction !== -1;\n const line_spacing = stave.getSpacingBetweenLines();\n const total_lines = stave.getNumLines();\n const stem_lines = [];\n unused_strings.forEach((strings) => {\n const containsLastString = strings.indexOf(total_lines) > -1;\n const containsFirstString = strings.indexOf(1) > -1;\n if ((up_stem && containsFirstString) || (down_stem && containsLastString)) {\n return;\n }\n // If there's only one string in the group, push a duplicate value.\n // We do this because we need 2 strings to convert into upper/lower y\n // values.\n if (strings.length === 1) {\n strings.push(strings[0]);\n }\n const line_ys = [];\n // Iterate through each group string and store it's y position\n strings.forEach((string, index, strings) => {\n const isTopBound = string === 1;\n const isBottomBound = string === total_lines;\n // Get the y value for the appropriate staff line,\n // we adjust for a 0 index array, since string numbers are index 1\n let y = stave.getYForLine(string - 1);\n // Unless the string is the first or last, add padding to each side\n // of the line\n if (index === 0 && !isTopBound) {\n y -= line_spacing / 2 - 1;\n }\n else if (index === strings.length - 1 && !isBottomBound) {\n y += line_spacing / 2 - 1;\n }\n // Store the y value\n line_ys.push(y);\n // Store a subsequent y value connecting this group to the main\n // stem above/below the stave if it's the top/bottom string\n if (stem_direction === 1 && isTopBound) {\n line_ys.push(stem_y - 2);\n }\n else if (stem_direction === -1 && isBottomBound) {\n line_ys.push(stem_y + 2);\n }\n });\n // Add the sorted y values to the\n stem_lines.push(line_ys.sort((a, b) => a - b));\n });\n return stem_lines;\n}\nexport class TabNote extends StemmableNote {\n // Initialize the TabNote with a `noteStruct` full of properties\n // and whether to `draw_stem` when rendering the note\n constructor(noteStruct, draw_stem = false) {\n super(noteStruct);\n this.glyphs = [];\n // Return the number of the greatest string, which is the string lowest on the display\n this.greatestString = () => {\n return this.positions.map((x) => x.str).reduce((a, b) => (a > b ? a : b));\n };\n // Return the number of the least string, which is the string highest on the display\n this.leastString = () => {\n return this.positions.map((x) => x.str).reduce((a, b) => (a < b ? a : b));\n };\n this.ghost = false; // Renders parenthesis around notes\n // Note properties\n // The fret positions in the note. An array of `{ str: X, fret: X }`\n this.positions = noteStruct.positions || [];\n // Render Options\n this.render_options = Object.assign(Object.assign({}, this.render_options), { \n // font size for note heads and rests\n glyph_font_scale: Tables.TABLATURE_FONT_SCALE, \n // Flag to draw a stem\n draw_stem, \n // Flag to draw dot modifiers\n draw_dots: draw_stem, \n // Flag to extend the main stem through the stave and fret positions\n draw_stem_through_stave: false, \n // vertical shift from stave line\n y_shift: 0, \n // normal glyph scale\n scale: 1.0, \n // default tablature font\n font: `${Font.SIZE}pt ${Font.SANS_SERIF}` });\n this.glyph = Tables.getGlyphProps(this.duration, this.noteType);\n defined(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`);\n this.buildStem();\n if (noteStruct.stem_direction) {\n this.setStemDirection(noteStruct.stem_direction);\n }\n else {\n this.setStemDirection(Stem.UP);\n }\n // Renders parenthesis around notes\n this.ghost = false;\n this.updateWidth();\n }\n static get CATEGORY() {\n return Category.TabNote;\n }\n reset() {\n super.reset();\n if (this.stave)\n this.setStave(this.stave);\n return this;\n }\n // Set as ghost `TabNote`, surrounds the fret positions with parenthesis.\n // Often used for indicating frets that are being bent to\n setGhost(ghost) {\n this.ghost = ghost;\n this.updateWidth();\n return this;\n }\n // Determine if the note has a stem\n hasStem() {\n if (this.render_options.draw_stem)\n return true;\n return false;\n }\n // Get the default stem extension for the note\n getStemExtension() {\n if (this.stem_extension_override != null) {\n return this.stem_extension_override;\n }\n if (this.flag) {\n return this.getStemDirection() === 1 ? -this.flag.checkMetrics().y_shift : this.flag.checkMetrics().y_shift;\n }\n return 0;\n }\n // Calculate and store the width of the note\n updateWidth() {\n this.glyphs = [];\n this.width = 0;\n for (let i = 0; i < this.positions.length; ++i) {\n let fret = this.positions[i].fret;\n if (this.ghost)\n fret = '(' + fret + ')';\n const glyph = Tables.tabToGlyph(fret.toString(), this.render_options.scale);\n this.glyphs.push(glyph);\n this.width = Math.max(glyph.getWidth(), this.width);\n }\n // For some reason we associate a notehead glyph with a TabNote, and this\n // glyph is used for certain width calculations. Of course, this is totally\n // incorrect since a notehead is a poor approximation for the dimensions of\n // a fret number which can have multiple digits. As a result, we must\n // overwrite getWidth() to return the correct width\n this.glyph.getWidth = () => this.width;\n }\n // Set the `stave` to the note\n setStave(stave) {\n super.setStave(stave);\n const ctx = stave.getContext();\n this.setContext(ctx);\n // Calculate the fret number width based on font used\n if (ctx) {\n this.width = 0;\n for (let i = 0; i < this.glyphs.length; ++i) {\n const glyph = this.glyphs[i];\n const text = '' + glyph.text;\n if (text.toUpperCase() !== 'X') {\n ctx.save();\n ctx.setFont(this.render_options.font);\n glyph.width = ctx.measureText(text).width;\n ctx.restore();\n glyph.getWidth = () => glyph.width;\n }\n this.width = Math.max(glyph.getWidth(), this.width);\n }\n this.glyph.getWidth = () => this.width;\n }\n // we subtract 1 from `line` because getYForLine expects a 0-based index,\n // while the position.str is a 1-based index\n const ys = this.positions.map(({ str: line }) => stave.getYForLine(Number(line) - 1));\n this.setYs(ys);\n if (this.stem) {\n this.stem.setYBounds(this.getStemY(), this.getStemY());\n }\n return this;\n }\n // Get the fret positions for the note\n getPositions() {\n return this.positions;\n }\n // Get the default `x` and `y` coordinates for a modifier at a specific\n // `position` at a fret position `index`\n getModifierStartXY(position, index) {\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call GetModifierStartXY on an unformatted note\");\n }\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', 'No Y-Values calculated for this note.');\n }\n let x = 0;\n if (position === Modifier.Position.LEFT) {\n x = -1 * 2; // FIXME: modifier padding, move to font file\n }\n else if (position === Modifier.Position.RIGHT) {\n x = this.width + 2; // FIXME: modifier padding, move to font file\n }\n else if (position === Modifier.Position.BELOW || position === Modifier.Position.ABOVE) {\n const note_glyph_width = this.glyph.getWidth();\n x = note_glyph_width / 2;\n }\n return {\n x: this.getAbsoluteX() + x,\n y: this.ys[index],\n };\n }\n // Get the default line for rest\n getLineForRest() {\n return Number(this.positions[0].str);\n }\n // Pre-render formatting\n preFormat() {\n if (this.preFormatted)\n return;\n if (this.modifierContext)\n this.modifierContext.preFormat();\n // width is already set during init()\n this.preFormatted = true;\n }\n // Get the x position for the stem\n getStemX() {\n return this.getCenterGlyphX();\n }\n // Get the y position for the stem\n getStemY() {\n const num_lines = this.checkStave().getNumLines();\n // The decimal staff line amounts provide optimal spacing between the\n // fret number and the stem\n const stemUpLine = -0.5;\n const stemDownLine = num_lines - 0.5;\n const stemStartLine = Stem.UP === this.stem_direction ? stemUpLine : stemDownLine;\n return this.checkStave().getYForLine(stemStartLine);\n }\n // Get the stem extents for the tabnote\n getStemExtents() {\n return this.checkStem().getExtents();\n }\n // Draw the fal onto the context\n drawFlag() {\n const { beam, glyph, stem_direction, render_options: { draw_stem, glyph_font_scale }, } = this;\n const context = this.checkContext();\n const shouldDrawFlag = beam == undefined && draw_stem;\n // Now it's the flag's turn.\n if (glyph.flag && shouldDrawFlag) {\n const flag_x = this.getStemX() + 1;\n const flag_y = this.getStemY() - this.checkStem().getHeight();\n const flag_code = stem_direction === Stem.DOWN\n ? glyph.code_flag_downstem // Down stems have flags on the left.\n : glyph.code_flag_upstem;\n // Draw the Flag\n Glyph.renderGlyph(context, flag_x, flag_y, glyph_font_scale, flag_code, { category: 'flag.tabStem' });\n }\n }\n // Render the modifiers onto the context.\n drawModifiers() {\n this.modifiers.forEach((modifier) => {\n // Only draw the dots if enabled.\n if (isDot(modifier) && !this.render_options.draw_dots) {\n return;\n }\n modifier.setContext(this.getContext());\n modifier.drawWithStyle();\n });\n }\n // Render the stem extension through the fret positions\n drawStemThrough() {\n const stemX = this.getStemX();\n const stemY = this.getStemY();\n const ctx = this.checkContext();\n const drawStem = this.render_options.draw_stem;\n const stemThrough = this.render_options.draw_stem_through_stave;\n if (drawStem && stemThrough) {\n const numLines = this.checkStave().getNumLines();\n const stringsUsed = this.positions.map((position) => Number(position.str));\n const unusedStrings = getUnusedStringGroups(numLines, stringsUsed);\n const stemLines = getPartialStemLines(stemY, unusedStrings, this.checkStave(), this.getStemDirection());\n ctx.save();\n ctx.setLineWidth(Stem.WIDTH);\n stemLines.forEach((bounds) => {\n if (bounds.length === 0)\n return;\n ctx.beginPath();\n ctx.moveTo(stemX, bounds[0]);\n ctx.lineTo(stemX, bounds[bounds.length - 1]);\n ctx.stroke();\n ctx.closePath();\n });\n ctx.restore();\n }\n }\n // Render the fret positions onto the context\n drawPositions() {\n const ctx = this.checkContext();\n const x = this.getAbsoluteX();\n const ys = this.ys;\n for (let i = 0; i < this.positions.length; ++i) {\n const y = ys[i] + this.render_options.y_shift;\n const glyph = this.glyphs[i];\n // Center the fret text beneath the notation note head\n const note_glyph_width = this.glyph.getWidth();\n const tab_x = x + note_glyph_width / 2 - glyph.getWidth() / 2;\n // FIXME: Magic numbers.\n ctx.clearRect(tab_x - 2, y - 3, glyph.getWidth() + 4, 6);\n if (glyph.code) {\n Glyph.renderGlyph(ctx, tab_x, y, this.render_options.glyph_font_scale * this.render_options.scale, glyph.code);\n }\n else {\n ctx.save();\n ctx.setFont(this.render_options.font);\n const text = glyph.text.toString();\n ctx.fillText(text, tab_x, y + 5 * this.render_options.scale);\n ctx.restore();\n }\n }\n }\n // The main rendering function for the entire note.\n draw() {\n const ctx = this.checkContext();\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', \"Can't draw note without Y values.\");\n }\n this.setRendered();\n const render_stem = this.beam == undefined && this.render_options.draw_stem;\n ctx.openGroup('tabnote', undefined, { pointerBBox: true });\n this.drawPositions();\n this.drawStemThrough();\n if (this.stem && render_stem) {\n const stem_x = this.getStemX();\n this.stem.setNoteHeadXBounds(stem_x, stem_x);\n ctx.openGroup('stem', undefined, { pointerBBox: true });\n this.stem.setContext(ctx).draw();\n ctx.closeGroup();\n }\n this.drawFlag();\n this.drawModifiers();\n ctx.closeGroup();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { Stave } from './stave';\nimport { Category } from './typeguard';\nexport class TabStave extends Stave {\n static get CATEGORY() {\n return Category.TabStave;\n }\n constructor(x, y, width, options) {\n const tab_options = Object.assign({ spacing_between_lines_px: 13, num_lines: 6, top_text_position: 1 }, options);\n super(x, y, width, tab_options);\n }\n getYForGlyphs() {\n return this.getYForLine(2.5);\n }\n // Deprecated\n addTabGlyph() {\n this.addClef('tab');\n return this;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Cyril Silverman\n//\n// This file implements `TextBrackets` which extend between two notes.\n// The octave transposition markings (8va, 8vb, 15va, 15vb) can be created\n// using this class.\nimport { Element } from './element';\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Renderer } from './renderer';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { log, RuntimeError } from './util';\n// To enable logging for this class. Set `Vex.Flow.TextBracket.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (TextBracket.DEBUG)\n log('Vex.Flow.TextBracket', args);\n}\nexport var TextBracketPosition;\n(function (TextBracketPosition) {\n TextBracketPosition[TextBracketPosition[\"TOP\"] = 1] = \"TOP\";\n TextBracketPosition[TextBracketPosition[\"BOTTOM\"] = -1] = \"BOTTOM\";\n})(TextBracketPosition || (TextBracketPosition = {}));\nexport class TextBracket extends Element {\n constructor({ start, stop, text = '', superscript = '', position = TextBracketPosition.TOP }) {\n super();\n this.start = start;\n this.stop = stop;\n this.text = text;\n this.superscript = superscript;\n this.position = typeof position === 'string' ? TextBracket.PositionString[position] : position;\n this.line = 1;\n this.resetFont();\n this.render_options = {\n dashed: true,\n dash: [5],\n color: 'black',\n line_width: 1,\n show_bracket: true,\n bracket_height: 8,\n // In the BOTTOM position, the bracket line can extend\n // under the superscript.\n underline_superscript: true,\n };\n }\n static get CATEGORY() {\n return Category.TextBracket;\n }\n static get Position() {\n return TextBracketPosition;\n }\n static get PositionString() {\n return {\n top: TextBracketPosition.TOP,\n bottom: TextBracketPosition.BOTTOM,\n };\n }\n /**\n * @deprecated Use `TextBracket.Position` instead.\n */\n static get Positions() {\n L('Positions is deprecated, use TextBracketPosition instead.');\n return TextBracketPosition;\n }\n /**\n * @deprecated Use `TextBracket.PositionString` instead.\n */\n static get PositionsString() {\n L('PositionsString is deprecated, use PositionString instead.');\n return TextBracket.PositionString;\n }\n /**\n * Apply the text backet styling to the provided context.\n * @param ctx\n * @returns this\n */\n applyStyle(ctx) {\n ctx.setFont(this.font);\n const options = this.render_options;\n ctx.setStrokeStyle(options.color);\n ctx.setFillStyle(options.color);\n ctx.setLineWidth(options.line_width);\n return this;\n }\n // Set whether the bracket line should be `dashed`. You can also\n // optionally set the `dash` pattern by passing in an array of numbers\n setDashed(dashed, dash) {\n this.render_options.dashed = dashed;\n if (dash)\n this.render_options.dash = dash;\n return this;\n }\n // Set the rendering `context` for the octave bracket\n setLine(line) {\n this.line = line;\n return this;\n }\n // Draw the octave bracket on the rendering context\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n let y = 0;\n switch (this.position) {\n case TextBracketPosition.TOP:\n y = this.start.checkStave().getYForTopText(this.line);\n break;\n case TextBracketPosition.BOTTOM:\n y = this.start.checkStave().getYForBottomText(this.line + Tables.TEXT_HEIGHT_OFFSET_HACK);\n break;\n default:\n throw new RuntimeError('InvalidPosition', `The position ${this.position} is invalid.`);\n }\n // Get the preliminary start and stop coordintates for the bracket\n const start = { x: this.start.getAbsoluteX(), y };\n const stop = { x: this.stop.getAbsoluteX(), y };\n L('Rendering TextBracket: start:', start, 'stop:', stop, 'y:', y);\n const bracket_height = this.render_options.bracket_height * this.position;\n ctx.save();\n this.applyStyle(ctx);\n // Draw text\n ctx.fillText(this.text, start.x, start.y);\n // Get the width and height for the octave number\n const main_measure = ctx.measureText(this.text);\n const main_width = main_measure.width;\n const main_height = main_measure.height;\n // Calculate the y position for the super script\n const super_y = start.y - main_height / 2.5;\n // We called this.resetFont() in the constructor, so we know this.textFont is available.\n // eslint-disable-next-line\n const { family, size, weight, style } = this.textFont;\n // To draw the superscript, we scale the font size by 1/1.4.\n const smallerFontSize = Font.scaleSize(size, 0.714286);\n ctx.setFont(family, smallerFontSize, weight, style);\n ctx.fillText(this.superscript, start.x + main_width + 1, super_y);\n // Determine width and height of the superscript\n const super_measure = ctx.measureText(this.superscript);\n const super_width = super_measure.width;\n const super_height = super_measure.height;\n // Setup initial coordinates for the bracket line\n let start_x = start.x;\n let line_y = super_y;\n const end_x = stop.x + this.stop.getGlyph().getWidth();\n // Adjust x and y coordinates based on position\n if (this.position === TextBracketPosition.TOP) {\n start_x += main_width + super_width + 5;\n line_y -= super_height / 2.7;\n }\n else if (this.position === TextBracketPosition.BOTTOM) {\n line_y += super_height / 2.7;\n start_x += main_width + 2;\n if (!this.render_options.underline_superscript) {\n start_x += super_width;\n }\n }\n if (this.render_options.dashed) {\n // Main line\n Renderer.drawDashedLine(ctx, start_x, line_y, end_x, line_y, this.render_options.dash);\n // Ending Bracket\n if (this.render_options.show_bracket) {\n Renderer.drawDashedLine(ctx, end_x, line_y + 1 * this.position, end_x, line_y + bracket_height, this.render_options.dash);\n }\n }\n else {\n ctx.beginPath();\n ctx.moveTo(start_x, line_y);\n // Main line\n ctx.lineTo(end_x, line_y);\n if (this.render_options.show_bracket) {\n // Ending bracket\n ctx.lineTo(end_x, line_y + bracket_height);\n }\n ctx.stroke();\n ctx.closePath();\n }\n ctx.restore();\n }\n}\nTextBracket.DEBUG = false;\nTextBracket.TEXT_FONT = {\n family: Font.SERIF,\n size: 15,\n weight: FontWeight.NORMAL,\n style: FontStyle.ITALIC,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Category } from './typeguard';\nimport { defined, log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (TextDynamics.DEBUG)\n log('Vex.Flow.TextDynamics', args);\n}\n/**\n * `TextDynamics` renders traditional\n * text dynamics markings, **ie: p, f, sfz, rfz, ppp**\n *\n * You can render any dynamics string that contains a combination of\n * the following letters: P, M, F, Z, R, S\n */\nexport class TextDynamics extends Note {\n /**\n * Create the dynamics marking.\n *\n * A `TextDynamics` object inherits from `Note` so that it can be formatted\n * within a `Voice`.\n *\n * @param noteStruct an object that contains a `duration` property and a\n * `sequence` of letters that represents the letters to render.\n */\n constructor(noteStruct) {\n super(noteStruct);\n this.sequence = (noteStruct.text || '').toLowerCase();\n this.line = noteStruct.line || 0;\n this.glyphs = [];\n this.render_options = Object.assign(Object.assign({}, this.render_options), { glyph_font_size: 40 });\n L('New Dynamics Text: ', this.sequence);\n }\n static get CATEGORY() {\n return Category.TextDynamics;\n }\n /** The glyph data for each dynamics letter. */\n static get GLYPHS() {\n return {\n f: {\n code: 'dynamicForte',\n width: 12,\n },\n p: {\n code: 'dynamicPiano',\n width: 14,\n },\n m: {\n code: 'dynamicMezzo',\n width: 17,\n },\n s: {\n code: 'dynamicSforzando',\n width: 10,\n },\n z: {\n code: 'dynamicZ',\n width: 12,\n },\n r: {\n code: 'dynamicRinforzando',\n width: 12,\n },\n };\n }\n /** Set the Stave line on which the note should be placed. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Preformat the dynamics text. */\n preFormat() {\n let total_width = 0;\n // length of this.glyphs must be <=\n // length of this.sequence, so if we're formatted before\n // create new glyphs.\n this.glyphs = [];\n // Iterate through each letter\n this.sequence.split('').forEach((letter) => {\n // Get the glyph data for the letter\n const glyph_data = TextDynamics.GLYPHS[letter];\n if (!glyph_data)\n throw new RuntimeError('Invalid dynamics character: ' + letter);\n const size = defined(this.render_options.glyph_font_size);\n const glyph = new Glyph(glyph_data.code, size, { category: 'textNote' });\n // Add the glyph\n this.glyphs.push(glyph);\n total_width += glyph_data.width;\n });\n // Store the width of the text\n this.setWidth(total_width);\n this.preFormatted = true;\n return this;\n }\n /** Draw the dynamics text on the rendering context. */\n draw() {\n this.setRendered();\n const x = this.getAbsoluteX();\n const y = this.checkStave().getYForLine(this.line + -3);\n L('Rendering Dynamics: ', this.sequence);\n let letter_x = x;\n this.glyphs.forEach((glyph, index) => {\n const current_letter = this.sequence[index];\n glyph.render(this.checkContext(), letter_x, y);\n letter_x += TextDynamics.GLYPHS[current_letter].width;\n });\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.TextDynamics.DEBUG` to `true`. */\nTextDynamics.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2014\nimport { Note } from './note';\nimport { TimeSignature } from './timesignature';\nimport { Category } from './typeguard';\nexport class TimeSigNote extends Note {\n constructor(timeSpec, customPadding) {\n super({ duration: 'b' });\n const timeSignature = new TimeSignature(timeSpec, customPadding);\n this.timeSigInfo = timeSignature.getInfo();\n this.setWidth(this.timeSigInfo.glyph.getMetrics().width);\n // Note properties\n this.ignore_ticks = true;\n }\n static get CATEGORY() {\n return Category.TimeSigNote;\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n draw() {\n const stave = this.checkStave();\n const ctx = this.checkContext();\n this.setRendered();\n if (!this.timeSigInfo.glyph.getContext()) {\n this.timeSigInfo.glyph.setContext(ctx);\n }\n this.timeSigInfo.glyph.setStave(stave);\n this.timeSigInfo.glyph.setYShift(stave.getYForLine(2) - stave.getYForGlyphs());\n this.timeSigInfo.glyph.renderToStave(this.getAbsoluteX());\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Balazs Forian-Szabo\n// MIT License\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { log } from './util';\nimport { Vibrato } from './vibrato';\n// eslint-disable-next-line\nfunction L(...args) {\n if (VibratoBracket.DEBUG)\n log('Vex.Flow.VibratoBracket', args);\n}\n/** `VibratoBracket` renders vibrato effect between two notes. */\nexport class VibratoBracket extends Element {\n /**\n * Either the stop or start note must be set, or both of them.\n * An undefined value for the start or stop note indicates that the vibrato\n * is drawn from the beginning or until the end of the stave accordingly.\n */\n constructor(bracket_data) {\n super();\n if (bracket_data.start)\n this.start = bracket_data.start;\n if (bracket_data.stop)\n this.stop = bracket_data.stop;\n this.line = 1;\n this.render_options = {\n harsh: false,\n wave_height: 6,\n wave_width: 4,\n wave_girth: 2,\n vibrato_width: 0,\n };\n }\n static get CATEGORY() {\n return Category.VibratoBracket;\n }\n /** Set line position of the vibrato bracket. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Set harsh vibrato bracket. */\n setHarsh(harsh) {\n this.render_options.harsh = harsh;\n return this;\n }\n /** Draw the vibrato bracket on the rendering context. */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n const y = (this.start && this.start.checkStave().getYForTopText(this.line)) ||\n (this.stop && this.stop.checkStave().getYForTopText(this.line)) ||\n 0;\n // If start note is not set then vibrato will be drawn\n // from the beginning of the stave\n const start_x = (this.start && this.start.getAbsoluteX()) || (this.stop && this.stop.checkStave().getTieStartX()) || 0;\n // If stop note is not set then vibrato will be drawn\n // until the end of the stave\n const stop_x = (this.stop && this.stop.getAbsoluteX() - this.stop.getWidth() - 5) ||\n (this.start && this.start.checkStave().getTieEndX() - 10) ||\n 0;\n this.render_options.vibrato_width = stop_x - start_x;\n L('Rendering VibratoBracket: start_x:', start_x, 'stop_x:', stop_x, 'y:', y);\n Vibrato.renderVibrato(ctx, start_x, y, this.render_options);\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.VibratoBracket.DEBUG` to `true`. */\nVibratoBracket.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Mohit Cheppudira\n// MIT License\nimport { Accidental } from './accidental';\nimport { Annotation, AnnotationHorizontalJustify, AnnotationVerticalJustify } from './annotation';\nimport { Articulation } from './articulation';\nimport { BarNote } from './barnote';\nimport { Beam } from './beam';\nimport { ChordSymbol } from './chordsymbol';\nimport { ClefNote } from './clefnote';\nimport { Curve } from './curve';\nimport { EasyScore } from './easyscore';\nimport { Element } from './element';\nimport { Formatter } from './formatter';\nimport { FretHandFinger } from './frethandfinger';\nimport { GhostNote } from './ghostnote';\nimport { GlyphNote } from './glyphnote';\nimport { GraceNote } from './gracenote';\nimport { GraceNoteGroup } from './gracenotegroup';\nimport { KeySigNote } from './keysignote';\nimport { ModifierContext } from './modifiercontext';\nimport { MultiMeasureRest } from './multimeasurerest';\nimport { NoteSubGroup } from './notesubgroup';\nimport { PedalMarking } from './pedalmarking';\nimport { Renderer } from './renderer';\nimport { RepeatNote } from './repeatnote';\nimport { Stave } from './stave';\nimport { StaveConnector } from './staveconnector';\nimport { StaveLine } from './staveline';\nimport { StaveNote } from './stavenote';\nimport { StaveTie } from './stavetie';\nimport { StringNumber } from './stringnumber';\nimport { System } from './system';\nimport { TabNote } from './tabnote';\nimport { TabStave } from './tabstave';\nimport { TextBracket } from './textbracket';\nimport { TextDynamics } from './textdynamics';\nimport { TextNote } from './textnote';\nimport { TickContext } from './tickcontext';\nimport { TimeSigNote } from './timesignote';\nimport { Tuplet } from './tuplet';\nimport { defined, log, RuntimeError } from './util';\nimport { VibratoBracket } from './vibratobracket';\nimport { Voice } from './voice';\nimport { isHTMLCanvas } from './web';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Factory.DEBUG)\n log('Vex.Flow.Factory', args);\n}\n/**\n * Factory implements a high level API around VexFlow.\n */\nexport class Factory {\n /**\n * Example:\n *\n * Create an SVG renderer and attach it to the DIV element named \"boo\" to render using 1200 and 600\n *\n * `const vf: Factory = new Vex.Flow.Factory({renderer: { elementId: 'boo', width: 1200, height: 600 }});`\n */\n constructor(options = {}) {\n L('New factory: ', options);\n this.options = {\n stave: {\n space: 10,\n },\n renderer: {\n elementId: '',\n width: 500,\n height: 200,\n background: '#FFF',\n },\n font: Factory.TEXT_FONT,\n };\n this.setOptions(options);\n }\n /**\n * Static simplified function to access constructor without providing FactoryOptions\n *\n * Example:\n *\n * Create an SVG renderer and attach it to the DIV element named \"boo\" to render using 1200 and 600\n *\n * `const vf: Factory = Vex.Flow.Factory.newFromElementId('boo', 1200, 600 );`\n */\n static newFromElementId(elementId, width = 500, height = 200) {\n return new Factory({ renderer: { elementId, width, height } });\n }\n reset() {\n this.renderQ = [];\n this.systems = [];\n this.staves = [];\n this.voices = [];\n this.stave = undefined; // current stave\n }\n setOptions(options) {\n this.options = Object.assign(Object.assign({}, this.options), options);\n this.initRenderer();\n this.reset();\n }\n initRenderer() {\n const { elementId, width, height, background } = this.options.renderer;\n if (elementId == null) {\n return;\n }\n if (elementId == '') {\n L(this);\n throw new RuntimeError('renderer.elementId not set in FactoryOptions');\n }\n let backend = this.options.renderer.backend;\n if (backend === undefined) {\n const elem = document.getElementById(elementId);\n // We use a custom type check here, because node-canvas mimics canvas,\n // but is not an instance of window.HTMLCanvasElement.\n // In fact, `window` might be undefined here.\n // See: https://www.npmjs.com/package/canvas\n if (isHTMLCanvas(elem)) {\n backend = Renderer.Backends.CANVAS;\n }\n else {\n backend = Renderer.Backends.SVG;\n }\n }\n this.context = Renderer.buildContext(elementId, backend, width, height, background);\n }\n getContext() {\n return this.context;\n }\n setContext(context) {\n this.context = context;\n return this;\n }\n getStave() {\n return this.stave;\n }\n getVoices() {\n return this.voices;\n }\n /** Return pixels from current stave spacing. */\n Stave(params) {\n const staveSpace = this.options.stave.space;\n const p = Object.assign({ x: 0, y: 0, width: this.options.renderer.width - staveSpace * 1.0, options: { spacing_between_lines_px: staveSpace * 1.0 } }, params);\n const stave = new Stave(p.x, p.y, p.width, p.options);\n this.staves.push(stave);\n stave.setContext(this.context);\n this.stave = stave;\n return stave;\n }\n TabStave(params) {\n const staveSpace = this.options.stave.space;\n const p = Object.assign({ x: 0, y: 0, width: this.options.renderer.width - staveSpace * 1.0, options: { spacing_between_lines_px: staveSpace * 1.3 } }, params);\n const stave = new TabStave(p.x, p.y, p.width, p.options);\n this.staves.push(stave);\n stave.setContext(this.context);\n this.stave = stave;\n return stave;\n }\n StaveNote(noteStruct) {\n const note = new StaveNote(noteStruct);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n GlyphNote(glyph, noteStruct, options) {\n const note = new GlyphNote(glyph, noteStruct, options);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n RepeatNote(type, noteStruct, options) {\n const note = new RepeatNote(type, noteStruct, options);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n GhostNote(noteStruct) {\n const ghostNote = new GhostNote(noteStruct);\n if (this.stave)\n ghostNote.setStave(this.stave);\n ghostNote.setContext(this.context);\n this.renderQ.push(ghostNote);\n return ghostNote;\n }\n TextNote(noteStruct) {\n const textNote = new TextNote(noteStruct);\n if (this.stave)\n textNote.setStave(this.stave);\n textNote.setContext(this.context);\n this.renderQ.push(textNote);\n return textNote;\n }\n BarNote(params = {}) {\n const barNote = new BarNote(params.type);\n if (this.stave)\n barNote.setStave(this.stave);\n barNote.setContext(this.context);\n this.renderQ.push(barNote);\n return barNote;\n }\n ClefNote(params) {\n const p = Object.assign({ type: 'treble', options: {\n size: 'default',\n annotation: undefined,\n } }, params);\n const clefNote = new ClefNote(p.type, p.options.size, p.options.annotation);\n if (this.stave)\n clefNote.setStave(this.stave);\n clefNote.setContext(this.context);\n this.renderQ.push(clefNote);\n return clefNote;\n }\n TimeSigNote(params) {\n const p = Object.assign({ time: '4/4' }, params);\n const timeSigNote = new TimeSigNote(p.time);\n if (this.stave)\n timeSigNote.setStave(this.stave);\n timeSigNote.setContext(this.context);\n this.renderQ.push(timeSigNote);\n return timeSigNote;\n }\n KeySigNote(params) {\n const keySigNote = new KeySigNote(params.key, params.cancelKey, params.alterKey);\n if (this.stave)\n keySigNote.setStave(this.stave);\n keySigNote.setContext(this.context);\n this.renderQ.push(keySigNote);\n return keySigNote;\n }\n TabNote(noteStruct) {\n const note = new TabNote(noteStruct);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n GraceNote(noteStruct) {\n const note = new GraceNote(noteStruct);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n return note;\n }\n GraceNoteGroup(params) {\n const group = new GraceNoteGroup(params.notes, params.slur);\n group.setContext(this.context);\n return group;\n }\n Accidental(params) {\n const accid = new Accidental(params.type);\n accid.setContext(this.context);\n return accid;\n }\n Annotation(params) {\n const p = Object.assign({ text: 'p', hJustify: AnnotationHorizontalJustify.CENTER, vJustify: AnnotationVerticalJustify.BOTTOM }, params);\n const annotation = new Annotation(p.text);\n annotation.setJustification(p.hJustify);\n annotation.setVerticalJustification(p.vJustify);\n annotation.setFont(p.font);\n annotation.setContext(this.context);\n return annotation;\n }\n ChordSymbol(params) {\n const p = Object.assign({ vJustify: 'top', hJustify: 'center', kerning: true, reportWidth: true }, params);\n const chordSymbol = new ChordSymbol();\n chordSymbol.setHorizontal(p.hJustify);\n chordSymbol.setVertical(p.vJustify);\n chordSymbol.setEnableKerning(p.kerning);\n chordSymbol.setReportWidth(p.reportWidth);\n // There is a default font based on the engraving font. Only set then\n // font if it is specific, else use the default\n if (typeof p.fontFamily === 'string' && typeof p.fontSize === 'number') {\n if (typeof p.fontWeight === 'string')\n chordSymbol.setFont(p.fontFamily, p.fontSize, p.fontWeight);\n else\n chordSymbol.setFont(p.fontFamily, p.fontSize, '');\n }\n else if (typeof p.fontSize === 'number') {\n chordSymbol.setFontSize(p.fontSize);\n }\n chordSymbol.setContext(this.context);\n return chordSymbol;\n }\n Articulation(params) {\n const p = Object.assign({ type: 'a.', position: 'above' }, params);\n const articulation = new Articulation(p.type);\n articulation.setPosition(p.position);\n articulation.setContext(this.context);\n return articulation;\n }\n TextDynamics(params) {\n const p = Object.assign({ text: 'p', duration: 'q', dots: 0, line: 0 }, params);\n const text = new TextDynamics({\n text: p.text,\n line: p.line,\n duration: p.duration,\n dots: p.dots,\n });\n if (this.stave)\n text.setStave(this.stave);\n text.setContext(this.context);\n this.renderQ.push(text);\n return text;\n }\n Fingering(params) {\n const p = Object.assign({ number: '0', position: 'left' }, params);\n const fingering = new FretHandFinger(p.number);\n fingering.setPosition(p.position);\n fingering.setContext(this.context);\n return fingering;\n }\n StringNumber(params) {\n const stringNumber = new StringNumber(params.number);\n stringNumber.setPosition(params.position);\n stringNumber.setContext(this.context);\n return stringNumber;\n }\n TickContext() {\n return new TickContext();\n }\n ModifierContext() {\n return new ModifierContext();\n }\n MultiMeasureRest(params) {\n const numMeasures = defined(params.number_of_measures, 'NoNumberOfMeasures');\n const multiMeasureRest = new MultiMeasureRest(numMeasures, params);\n multiMeasureRest.setContext(this.context);\n this.renderQ.push(multiMeasureRest);\n return multiMeasureRest;\n }\n Voice(params) {\n const p = Object.assign({ time: '4/4' }, params);\n const voice = new Voice(p.time, p.options);\n this.voices.push(voice);\n return voice;\n }\n StaveConnector(params) {\n const connector = new StaveConnector(params.top_stave, params.bottom_stave);\n connector.setType(params.type).setContext(this.context);\n this.renderQ.push(connector);\n return connector;\n }\n Formatter(options) {\n return new Formatter(options);\n }\n Tuplet(params) {\n const p = Object.assign({ notes: [], options: {} }, params);\n const tuplet = new Tuplet(p.notes, p.options).setContext(this.context);\n this.renderQ.push(tuplet);\n return tuplet;\n }\n Beam(params) {\n var _a, _b, _c;\n const beam = new Beam(params.notes, (_a = params.options) === null || _a === void 0 ? void 0 : _a.autoStem).setContext(this.context);\n beam.breakSecondaryAt((_c = (_b = params.options) === null || _b === void 0 ? void 0 : _b.secondaryBeamBreaks) !== null && _c !== void 0 ? _c : []);\n this.renderQ.push(beam);\n return beam;\n }\n Curve(params) {\n const curve = new Curve(params.from, params.to, params.options).setContext(this.context);\n this.renderQ.push(curve);\n return curve;\n }\n StaveTie(params) {\n var _a;\n const tie = new StaveTie({\n first_note: params.from,\n last_note: params.to,\n first_indices: params.first_indices,\n last_indices: params.last_indices,\n }, params.text);\n if ((_a = params.options) === null || _a === void 0 ? void 0 : _a.direction)\n tie.setDirection(params.options.direction);\n tie.setContext(this.context);\n this.renderQ.push(tie);\n return tie;\n }\n StaveLine(params) {\n var _a, _b;\n const line = new StaveLine({\n first_note: params.from,\n last_note: params.to,\n first_indices: params.first_indices,\n last_indices: params.last_indices,\n });\n if ((_a = params.options) === null || _a === void 0 ? void 0 : _a.text)\n line.setText(params.options.text);\n if ((_b = params.options) === null || _b === void 0 ? void 0 : _b.font)\n line.setFont(params.options.font);\n line.setContext(this.context);\n this.renderQ.push(line);\n return line;\n }\n VibratoBracket(params) {\n const vibratoBracket = new VibratoBracket({\n start: params.from,\n stop: params.to,\n });\n if (params.options.line)\n vibratoBracket.setLine(params.options.line);\n if (params.options.harsh)\n vibratoBracket.setHarsh(params.options.harsh);\n vibratoBracket.setContext(this.context);\n this.renderQ.push(vibratoBracket);\n return vibratoBracket;\n }\n TextBracket(params) {\n const textBracket = new TextBracket({\n start: params.from,\n stop: params.to,\n text: params.text,\n superscript: params.options.superscript,\n position: params.options.position,\n });\n if (params.options.line)\n textBracket.setLine(params.options.line);\n if (params.options.font)\n textBracket.setFont(params.options.font);\n textBracket.setContext(this.context);\n this.renderQ.push(textBracket);\n return textBracket;\n }\n System(params = {}) {\n params.factory = this;\n const system = new System(params).setContext(this.context);\n this.systems.push(system);\n return system;\n }\n /**\n * Creates EasyScore. Normally the first step after constructing a Factory. For example:\n * ```\n * const vf: Factory = new Vex.Flow.Factory({renderer: { elementId: 'boo', width: 1200, height: 600 }});\n * const score: EasyScore = vf.EasyScore();\n * ```\n * @param options.factory optional instance of Factory\n * @param options.builder instance of Builder\n * @param options.commitHooks function to call after a note element is created\n * @param options.throwOnError throw error in case of parsing error\n */\n EasyScore(options = {}) {\n options.factory = this;\n return new EasyScore(options);\n }\n PedalMarking(params) {\n const p = Object.assign({ notes: [], options: {\n style: 'mixed',\n } }, params);\n const pedal = new PedalMarking(p.notes);\n pedal.setType(PedalMarking.typeString[p.options.style]);\n pedal.setContext(this.context);\n this.renderQ.push(pedal);\n return pedal;\n }\n NoteSubGroup(params) {\n const p = Object.assign({ notes: [] }, params);\n const group = new NoteSubGroup(p.notes);\n group.setContext(this.context);\n return group;\n }\n /** Render the score. */\n draw() {\n const ctx = this.context;\n this.systems.forEach((s) => s.setContext(ctx).format());\n this.staves.forEach((s) => s.setContext(ctx).draw());\n this.voices.forEach((v) => v.setContext(ctx).draw());\n this.renderQ.forEach((e) => {\n if (!e.isRendered())\n e.setContext(ctx).draw();\n });\n this.systems.forEach((s) => s.setContext(ctx).draw());\n this.reset();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Factory.DEBUG` to `true`. */\nFactory.DEBUG = false;\n/** Default text font. */\nFactory.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// Author: Raffaele Viglianti, 2012 http://itisnotsound.wordpress.com/\n//\n// This class implements hairpins between notes.\n// Hairpins can be either crescendo or decrescendo.\nimport { Element } from './element';\nimport { Modifier } from './modifier';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StaveHairpin extends Element {\n /**\n * Create a new hairpin from the specified notes.\n *\n * @param {!Object} notes The notes to tie up.\n * Notes is a struct that has:\n *\n * {\n * first_note: Note,\n * last_note: Note,\n * }\n * @param {!Object} type The type of hairpin\n */\n constructor(notes, type) {\n super();\n this.setNotes(notes);\n this.hairpin = type;\n this.position = Modifier.Position.BELOW;\n this.render_options = {\n height: 10,\n y_shift: 0,\n left_shift_px: 0,\n right_shift_px: 0,\n right_shift_ticks: 0,\n left_shift_ticks: 0,\n };\n }\n static get CATEGORY() {\n return Category.StaveHairpin;\n }\n /* Helper function to convert ticks into pixels.\n * Requires a Formatter with voices joined and formatted (to\n * get pixels per tick)\n *\n * options is struct that has:\n *\n * {\n * height: px,\n * y_shift: px, // vertical offset\n * left_shift_ticks: 0, // left horizontal offset expressed in ticks\n * right_shift_ticks: 0 // right horizontal offset expressed in ticks\n * }\n *\n **/\n static FormatByTicksAndDraw(ctx, formatter, notes, type, position, options) {\n var _a, _b;\n const ppt = formatter.pixelsPerTick;\n if (ppt == null) {\n throw new RuntimeError('BadArguments', 'A valid Formatter must be provide to draw offsets by ticks.');\n }\n const l_shift_px = ppt * ((_a = options.left_shift_ticks) !== null && _a !== void 0 ? _a : 0);\n const r_shift_px = ppt * ((_b = options.right_shift_ticks) !== null && _b !== void 0 ? _b : 0);\n const hairpin_options = {\n height: options.height,\n y_shift: options.y_shift,\n left_shift_px: l_shift_px,\n right_shift_px: r_shift_px,\n right_shift_ticks: 0,\n left_shift_ticks: 0,\n };\n new StaveHairpin({\n first_note: notes.first_note,\n last_note: notes.last_note,\n }, type)\n .setContext(ctx)\n .setRenderOptions(hairpin_options)\n .setPosition(position)\n .draw();\n }\n setPosition(position) {\n if (position === Modifier.Position.ABOVE || position === Modifier.Position.BELOW) {\n this.position = position;\n }\n return this;\n }\n setRenderOptions(options) {\n if (options.height != null &&\n options.y_shift != null &&\n options.left_shift_px != null &&\n options.right_shift_px != null) {\n this.render_options = options;\n }\n return this;\n }\n /**\n * Set the notes to attach this hairpin to.\n *\n * @param {!Object} notes The start and end notes.\n */\n setNotes(notes) {\n if (!notes.first_note && !notes.last_note) {\n throw new RuntimeError('BadArguments', 'Hairpin needs to have either first_note or last_note set.');\n }\n this.notes = notes;\n this.first_note = notes.first_note;\n this.last_note = notes.last_note;\n return this;\n }\n renderHairpin(params) {\n const ctx = this.checkContext();\n let dis = this.render_options.y_shift + 20;\n let y_shift = params.first_y;\n if (this.position === Modifier.Position.ABOVE) {\n dis = -dis + 30;\n y_shift = params.first_y - params.staff_height;\n }\n const l_shift = this.render_options.left_shift_px;\n const r_shift = this.render_options.right_shift_px;\n ctx.beginPath();\n switch (this.hairpin) {\n case StaveHairpin.type.CRESC:\n ctx.moveTo(params.last_x + r_shift, y_shift + dis);\n ctx.lineTo(params.first_x + l_shift, y_shift + this.render_options.height / 2 + dis);\n ctx.lineTo(params.last_x + r_shift, y_shift + this.render_options.height + dis);\n break;\n case StaveHairpin.type.DECRESC:\n ctx.moveTo(params.first_x + l_shift, y_shift + dis);\n ctx.lineTo(params.last_x + r_shift, y_shift + this.render_options.height / 2 + dis);\n ctx.lineTo(params.first_x + l_shift, y_shift + this.render_options.height + dis);\n break;\n default:\n // Default is NONE, so nothing to draw\n break;\n }\n ctx.stroke();\n ctx.closePath();\n }\n draw() {\n this.checkContext();\n this.setRendered();\n const firstNote = this.first_note;\n const lastNote = this.last_note;\n if (!firstNote || !lastNote)\n throw new RuntimeError('NoNote', 'Notes required to draw');\n const start = firstNote.getModifierStartXY(this.position, 0);\n const end = lastNote.getModifierStartXY(this.position, 0);\n this.renderHairpin({\n first_x: start.x,\n last_x: end.x,\n first_y: firstNote.checkStave().getY() + firstNote.checkStave().getHeight(),\n last_y: lastNote.checkStave().getY() + lastNote.checkStave().getHeight(),\n staff_height: firstNote.checkStave().getHeight(),\n });\n }\n}\nStaveHairpin.type = {\n CRESC: 1,\n DECRESC: 2,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// This class implements varies types of ties between contiguous notes. The\n// ties include: regular ties, hammer ons, pull offs, and slides.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { TabTie } from './tabtie';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class TabSlide extends TabTie {\n /**\n * @param notes is a struct of the form:\n * {\n * first_note: Note,\n * last_note: Note,\n * first_indices: [n1, n2, n3],\n * last_indices: [n1, n2, n3]\n * }\n * @param notes.first_note the starting note of the slide\n * @param notes.last_note the ending note of the slide\n * @param notes.first_indices specifies which string + fret positions of the TabNote are used in this slide. zero indexed.\n * @param notes.last_indices currently unused. we assume it's the same as first_indices.\n *\n * @param direction TabSlide.SLIDE_UP or TabSlide.SLIDE_DOWN\n */\n constructor(notes, direction) {\n super(notes, 'sl.');\n // Determine the direction automatically if it is not provided.\n if (!direction) {\n let first_fret = notes.first_note.getPositions()[0].fret;\n if (typeof first_fret === 'string') {\n first_fret = parseInt(first_fret, 10);\n }\n let last_fret = notes.last_note.getPositions()[0].fret;\n if (typeof last_fret === 'string') {\n last_fret = parseInt(last_fret, 10);\n }\n // If either of the frets are 'X', parseInt() above will return NaN.\n // Choose TabSlide.SLIDE_UP by default.\n if (isNaN(first_fret) || isNaN(last_fret)) {\n direction = TabSlide.SLIDE_UP;\n }\n else {\n direction = first_fret > last_fret ? TabSlide.SLIDE_DOWN : TabSlide.SLIDE_UP;\n }\n }\n this.direction = direction;\n this.render_options.cp1 = 11;\n this.render_options.cp2 = 14;\n this.render_options.y_shift = 0.5;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.TabSlide;\n }\n static get SLIDE_UP() {\n return 1;\n }\n static get SLIDE_DOWN() {\n return -1;\n }\n static createSlideUp(notes) {\n return new TabSlide(notes, TabSlide.SLIDE_UP);\n }\n static createSlideDown(notes) {\n return new TabSlide(notes, TabSlide.SLIDE_DOWN);\n }\n renderTie(params) {\n if (params.first_ys.length === 0 || params.last_ys.length === 0) {\n throw new RuntimeError('BadArguments', 'No Y-values to render');\n }\n const ctx = this.checkContext();\n const first_x_px = params.first_x_px;\n const first_ys = params.first_ys;\n const last_x_px = params.last_x_px;\n const direction = params.direction;\n if (direction !== TabSlide.SLIDE_UP && direction !== TabSlide.SLIDE_DOWN) {\n throw new RuntimeError('BadSlide', 'Invalid slide direction');\n }\n // eslint-disable-next-line\n const first_indices = this.notes.first_indices;\n for (let i = 0; i < first_indices.length; ++i) {\n const slide_y = first_ys[first_indices[i]] + this.render_options.y_shift;\n if (isNaN(slide_y)) {\n throw new RuntimeError('BadArguments', 'Bad indices for slide rendering.');\n }\n ctx.beginPath();\n ctx.moveTo(first_x_px, slide_y + 3 * direction);\n ctx.lineTo(last_x_px, slide_y - 3 * direction);\n ctx.closePath();\n ctx.stroke();\n }\n this.setRendered();\n }\n}\nTabSlide.TEXT_FONT = {\n family: Font.SERIF,\n size: 10,\n weight: FontWeight.BOLD,\n style: FontStyle.ITALIC,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Tables } from './tables';\nimport { RuntimeError } from './util';\n/** `Tuning` implements varies types of tunings for tablature. */\nexport class Tuning {\n /**\n * Constructor.\n * @param tuningString tuning name (eg. 'dagdad') or comma separated note strings\n */\n constructor(tuningString = 'E/5,B/4,G/4,D/4,A/3,E/3,B/2,E/2') {\n this.tuningValues = [];\n // Default to standard tuning.\n this.setTuning(tuningString);\n }\n static get names() {\n return {\n standard: 'E/5,B/4,G/4,D/4,A/3,E/3',\n dagdad: 'D/5,A/4,G/4,D/4,A/3,D/3',\n dropd: 'E/5,B/4,G/4,D/4,A/3,D/3',\n eb: 'Eb/5,Bb/4,Gb/4,Db/4,Ab/3,Db/3',\n standardBanjo: 'D/5,B/4,G/4,D/4,G/5',\n };\n }\n /** Return the note number associated to the note string. */\n noteToInteger(noteString) {\n return Tables.keyProperties(noteString).int_value;\n }\n /**\n * Set tuning identified by tuning name (eg. 'dagdad')\n * @param tuningString tuning name (eg. 'dagdad') or comma separated note strings\n */\n setTuning(tuningString) {\n if (Tuning.names[tuningString]) {\n tuningString = Tuning.names[tuningString];\n }\n this.tuningValues = [];\n const keys = tuningString.split(/\\s*,\\s*/);\n if (keys.length === 0) {\n throw new RuntimeError('BadArguments', `Invalid tuning string: ${tuningString}`);\n }\n for (let i = 0; i < keys.length; ++i) {\n this.tuningValues[i] = this.noteToInteger(keys[i]);\n }\n }\n /** Return the note number associated with a tablature string. */\n getValueForString(stringNum) {\n const s = Number(stringNum);\n if (s < 1 || s > this.tuningValues.length) {\n throw new RuntimeError('BadArguments', `String number must be between 1 and ${this.tuningValues.length}:${stringNum}`);\n }\n return this.tuningValues[s - 1];\n }\n /** Return the note number associated with a tablature string and fret. */\n getValueForFret(fretNum, stringNum) {\n const stringValue = this.getValueForString(stringNum);\n const f = Number(fretNum);\n if (f < 0) {\n throw new RuntimeError('BadArguments', `Fret number must be 0 or higher: ${fretNum}`);\n }\n return stringValue + f;\n }\n /** Return the note string associated with tablature string and fret. */\n getNoteForFret(fretNum, stringNum) {\n const noteValue = this.getValueForFret(fretNum, stringNum);\n const octave = Math.floor(noteValue / 12);\n const value = noteValue % 12;\n return `${Tables.integerToNote(value)}/${octave}`;\n }\n}\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { Accidental } from './accidental';\nimport { Annotation } from './annotation';\nimport { Articulation } from './articulation';\nimport { BarNote } from './barnote';\nimport { Beam } from './beam';\nimport { Bend } from './bend';\nimport { BoundingBox } from './boundingbox';\nimport { BoundingBoxComputation } from './boundingboxcomputation';\nimport { CanvasContext } from './canvascontext';\nimport { ChordSymbol } from './chordsymbol';\nimport { Clef } from './clef';\nimport { ClefNote } from './clefnote';\nimport { Crescendo } from './crescendo';\nimport { Curve } from './curve';\nimport { Dot } from './dot';\nimport { EasyScore } from './easyscore';\nimport { Element } from './element';\nimport { Factory } from './factory';\nimport { Font } from './font';\nimport { Formatter } from './formatter';\nimport { Fraction } from './fraction';\nimport { FretHandFinger } from './frethandfinger';\nimport { GhostNote } from './ghostnote';\nimport { Glyph } from './glyph';\nimport { GlyphNote } from './glyphnote';\nimport { GraceNote } from './gracenote';\nimport { GraceNoteGroup } from './gracenotegroup';\nimport { GraceTabNote } from './gracetabnote';\nimport { KeyManager } from './keymanager';\nimport { KeySignature } from './keysignature';\nimport { KeySigNote } from './keysignote';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { ModifierContext } from './modifiercontext';\nimport { MultiMeasureRest } from './multimeasurerest';\nimport { Music } from './music';\nimport { Note } from './note';\nimport { NoteHead } from './notehead';\nimport { NoteSubGroup } from './notesubgroup';\nimport { Ornament } from './ornament';\nimport { Parenthesis } from './parenthesis';\nimport { Parser } from './parser';\nimport { PedalMarking } from './pedalmarking';\nimport { Registry } from './registry';\nimport { RenderContext } from './rendercontext';\nimport { Renderer } from './renderer';\nimport { RepeatNote } from './repeatnote';\nimport { Stave } from './stave';\nimport { Barline, BarlineType } from './stavebarline';\nimport { StaveConnector } from './staveconnector';\nimport { StaveHairpin } from './stavehairpin';\nimport { StaveLine } from './staveline';\nimport { StaveModifier } from './stavemodifier';\nimport { StaveNote } from './stavenote';\nimport { Repetition } from './staverepetition';\nimport { StaveTempo } from './stavetempo';\nimport { StaveText } from './stavetext';\nimport { StaveTie } from './stavetie';\nimport { Volta } from './stavevolta';\nimport { Stem } from './stem';\nimport { StringNumber } from './stringnumber';\nimport { Stroke } from './strokes';\nimport { SVGContext } from './svgcontext';\nimport { System } from './system';\nimport { Tables } from './tables';\nimport { TabNote } from './tabnote';\nimport { TabSlide } from './tabslide';\nimport { TabStave } from './tabstave';\nimport { TabTie } from './tabtie';\nimport { TextBracket } from './textbracket';\nimport { TextDynamics } from './textdynamics';\nimport { TextFormatter } from './textformatter';\nimport { TextNote } from './textnote';\nimport { TickContext } from './tickcontext';\nimport { TimeSignature } from './timesignature';\nimport { TimeSigNote } from './timesignote';\nimport { Tremolo } from './tremolo';\nimport { Tuning } from './tuning';\nimport { Tuplet } from './tuplet';\nimport { DATE, ID, VERSION } from './version';\nimport { Vibrato } from './vibrato';\nimport { VibratoBracket } from './vibratobracket';\nimport { Voice } from './voice';\nexport class Flow {\n static get BUILD() {\n return {\n /** version number. */\n VERSION: VERSION,\n /** git commit ID that this library was built from. */\n ID: ID,\n /** The date when this library was compiled. */\n DATE: DATE,\n };\n }\n static get Flow() {\n // This (circular reference) provides a handy shortcut for importing VexFlow via `require()`.\n // For example:\n // const Vex = require('vexflow');\n // const { Flow, Stave, StaveNote, Formatter, Renderer } = Vex.Flow;\n return Flow;\n }\n // ... more to come ...\n /**\n * Examples:\n * ```\n * Vex.Flow.setMusicFont('Petaluma');\n * Vex.Flow.setMusicFont('Bravura', 'Gonville');\n * ```\n *\n * **CASE 1**: You are using `vexflow.js`, which includes all music fonts (Bravura, Gonville, Petaluma, Custom).\n * In this case, calling this method is optional, since VexFlow already defaults to a music font stack of:\n * 'Bravura', 'Gonville', 'Custom'.\n *\n * **CASE 2**: You are using `vexflow-bravura.js` or `vexflow-petaluma.js` or `vexflow-gonville.js`,\n * which includes a single music font. Calling this method is unnecessary.\n *\n * **CASE 3**: You are using the light weight `vexflow-core.js` to take advantage of lazy loading for fonts.\n * In this case, the default music font stack is empty.\n * Example:\n * ```\n * await Vex.Flow.fetchMusicFont('Petaluma');\n * Vex.Flow.setMusicFont('Petaluma');\n * ... (do VexFlow stuff) ...\n * ```\n * See `demos/fonts/` for more examples.\n *\n * @returns an array of Font objects corresponding to the provided `fontNames`.\n */\n static setMusicFont(...fontNames) {\n // Convert the array of font names into an array of Font objects.\n const fonts = fontNames.map((fontName) => Font.load(fontName));\n Tables.MUSIC_FONT_STACK = fonts;\n Glyph.MUSIC_FONT_STACK = fonts.slice();\n Glyph.CURRENT_CACHE_KEY = fontNames.join(',');\n return fonts;\n }\n /**\n * Used with vexflow-core which supports dynamic font loading.\n */\n // eslint-disable-next-line\n static fetchMusicFont(fontName, fontModuleOrPath) {\n return __awaiter(this, void 0, void 0, function* () {\n // The default implementation does nothing.\n // See vexflow-core.ts for the implementation that vexflow-core.js uses.\n });\n }\n static getMusicFont() {\n const fonts = Tables.MUSIC_FONT_STACK;\n return fonts.map((font) => font.getName());\n }\n static get NOTATION_FONT_SCALE() {\n return Tables.NOTATION_FONT_SCALE;\n }\n static set NOTATION_FONT_SCALE(value) {\n Tables.NOTATION_FONT_SCALE = value;\n }\n static get TABLATURE_FONT_SCALE() {\n return Tables.TABLATURE_FONT_SCALE;\n }\n static set TABLATURE_FONT_SCALE(value) {\n Tables.TABLATURE_FONT_SCALE = value;\n }\n static get RESOLUTION() {\n return Tables.RESOLUTION;\n }\n static set RESOLUTION(value) {\n Tables.RESOLUTION = value;\n }\n static get SLASH_NOTEHEAD_WIDTH() {\n return Tables.SLASH_NOTEHEAD_WIDTH;\n }\n static set SLASH_NOTEHEAD_WIDTH(value) {\n Tables.SLASH_NOTEHEAD_WIDTH = value;\n }\n static get STAVE_LINE_DISTANCE() {\n return Tables.STAVE_LINE_DISTANCE;\n }\n static set STAVE_LINE_DISTANCE(value) {\n Tables.STAVE_LINE_DISTANCE = value;\n }\n static get STAVE_LINE_THICKNESS() {\n return Tables.STAVE_LINE_THICKNESS;\n }\n static set STAVE_LINE_THICKNESS(value) {\n Tables.STAVE_LINE_THICKNESS = value;\n }\n static get STEM_HEIGHT() {\n return Tables.STEM_HEIGHT;\n }\n static set STEM_HEIGHT(value) {\n Tables.STEM_HEIGHT = value;\n }\n static get STEM_WIDTH() {\n return Tables.STEM_WIDTH;\n }\n static set STEM_WIDTH(value) {\n Tables.STEM_WIDTH = value;\n }\n static get TIME4_4() {\n return Tables.TIME4_4;\n }\n static get accidentalMap() {\n return Tables.accidentalMap;\n }\n static get unicode() {\n return Tables.unicode;\n }\n static keySignature(spec) {\n return Tables.keySignature(spec);\n }\n static hasKeySignature(spec) {\n return Tables.hasKeySignature(spec);\n }\n static getKeySignatures() {\n return Tables.getKeySignatures();\n }\n static clefProperties(clef) {\n return Tables.clefProperties(clef);\n }\n // eslint-disable-next-line\n static keyProperties(key, clef, params) {\n return Tables.keyProperties(key, clef, params);\n }\n static durationToTicks(duration) {\n return Tables.durationToTicks(duration);\n }\n}\nFlow.Accidental = Accidental;\nFlow.Annotation = Annotation;\nFlow.Articulation = Articulation;\nFlow.Barline = Barline;\nFlow.BarNote = BarNote;\nFlow.Beam = Beam;\nFlow.Bend = Bend;\nFlow.BoundingBox = BoundingBox;\nFlow.BoundingBoxComputation = BoundingBoxComputation;\nFlow.CanvasContext = CanvasContext;\nFlow.ChordSymbol = ChordSymbol;\nFlow.Clef = Clef;\nFlow.ClefNote = ClefNote;\nFlow.Crescendo = Crescendo;\nFlow.Curve = Curve;\nFlow.Dot = Dot;\nFlow.EasyScore = EasyScore;\nFlow.Element = Element;\nFlow.Factory = Factory;\nFlow.Font = Font;\nFlow.Formatter = Formatter;\nFlow.Fraction = Fraction;\nFlow.FretHandFinger = FretHandFinger;\nFlow.GhostNote = GhostNote;\nFlow.Glyph = Glyph;\nFlow.GlyphNote = GlyphNote;\nFlow.GraceNote = GraceNote;\nFlow.GraceNoteGroup = GraceNoteGroup;\nFlow.GraceTabNote = GraceTabNote;\nFlow.KeyManager = KeyManager;\nFlow.KeySignature = KeySignature;\nFlow.KeySigNote = KeySigNote;\nFlow.Modifier = Modifier;\nFlow.ModifierContext = ModifierContext;\nFlow.MultiMeasureRest = MultiMeasureRest;\nFlow.Music = Music;\nFlow.Note = Note;\nFlow.NoteHead = NoteHead;\nFlow.NoteSubGroup = NoteSubGroup;\nFlow.Ornament = Ornament;\nFlow.Parenthesis = Parenthesis;\nFlow.Parser = Parser;\nFlow.PedalMarking = PedalMarking;\nFlow.Registry = Registry;\nFlow.RenderContext = RenderContext;\nFlow.Renderer = Renderer;\nFlow.RepeatNote = RepeatNote;\nFlow.Repetition = Repetition;\nFlow.Stave = Stave;\nFlow.StaveConnector = StaveConnector;\nFlow.StaveHairpin = StaveHairpin;\nFlow.StaveLine = StaveLine;\nFlow.StaveModifier = StaveModifier;\nFlow.StaveNote = StaveNote;\nFlow.StaveTempo = StaveTempo;\nFlow.StaveText = StaveText;\nFlow.StaveTie = StaveTie;\nFlow.Stem = Stem;\nFlow.StringNumber = StringNumber;\nFlow.Stroke = Stroke;\nFlow.SVGContext = SVGContext;\nFlow.System = System;\nFlow.TabNote = TabNote;\nFlow.TabSlide = TabSlide;\nFlow.TabStave = TabStave;\nFlow.TabTie = TabTie;\nFlow.TextBracket = TextBracket;\nFlow.TextDynamics = TextDynamics;\nFlow.TextFormatter = TextFormatter;\nFlow.TextNote = TextNote;\nFlow.TickContext = TickContext;\nFlow.TimeSignature = TimeSignature;\nFlow.TimeSigNote = TimeSigNote;\nFlow.Tremolo = Tremolo;\nFlow.Tuning = Tuning;\nFlow.Tuplet = Tuplet;\nFlow.Vibrato = Vibrato;\nFlow.VibratoBracket = VibratoBracket;\nFlow.Voice = Voice;\nFlow.Volta = Volta;\n// enums need to be exported too!\nFlow.BarlineType = BarlineType;\nFlow.ModifierPosition = ModifierPosition;\n","export const VERSION = '4.0.1-alpha.2';\nexport const ID = '0df10df6d1fab3a99f5aa306341a31c6e686d659';\nexport const DATE = '2022-02-02T09:30:30.784Z';\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Balazs Forian-Szabo\n//\n// ## Description\n//\n// A basic implementation of grace notes\n// to be rendered on a tab stave.\n//\n// See `tests/gracetabnote_tests.ts` for usage examples.\nimport { Font } from './font';\nimport { TabNote } from './tabnote';\nimport { Category } from './typeguard';\nexport class GraceTabNote extends TabNote {\n static get CATEGORY() {\n return Category.GraceTabNote;\n }\n constructor(noteStruct) {\n super(noteStruct, false);\n this.render_options = Object.assign(Object.assign({}, this.render_options), { \n // vertical shift from stave line\n y_shift: 0.3, \n // grace glyph scale\n scale: 0.6, \n // grace tablature font\n font: `7.5pt ${Font.SANS_SERIF}` });\n this.updateWidth();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This class implements diatonic key management.\nimport { Music } from './music';\nimport { RuntimeError } from './util';\nexport class KeyManager {\n constructor(key) {\n this.music = new Music();\n this.setKey(key);\n }\n setKey(key) {\n this.key = key;\n this.reset();\n return this;\n }\n getKey() {\n return this.key;\n }\n reset() {\n this.keyParts = this.music.getKeyParts(this.key);\n this.keyString = this.keyParts.root;\n if (this.keyParts.accidental)\n this.keyString += this.keyParts.accidental;\n const is_supported_type = Music.scaleTypes[this.keyParts.type];\n if (!is_supported_type) {\n throw new RuntimeError('BadArguments', `Unsupported key type: ${this.key}`);\n }\n this.scale = this.music.getScaleTones(this.music.getNoteValue(this.keyString), Music.scaleTypes[this.keyParts.type]);\n this.scaleMap = {};\n this.scaleMapByValue = {};\n this.originalScaleMapByValue = {};\n const noteLocation = Music.root_indices[this.keyParts.root];\n for (let i = 0; i < Music.roots.length; ++i) {\n const index = (noteLocation + i) % Music.roots.length;\n const rootName = Music.roots[index];\n const noteName = this.music.getRelativeNoteName(rootName, this.scale[i]);\n this.scaleMap[rootName] = noteName;\n this.scaleMapByValue[this.scale[i]] = noteName;\n this.originalScaleMapByValue[this.scale[i]] = noteName;\n }\n return this;\n }\n getAccidental(key) {\n const root = this.music.getKeyParts(key).root;\n const parts = this.music.getNoteParts(this.scaleMap[root]);\n return {\n note: this.scaleMap[root],\n accidental: parts.accidental,\n };\n }\n selectNote(note) {\n note = note.toLowerCase();\n const parts = this.music.getNoteParts(note);\n // First look for matching note in our altered scale\n const scaleNote = this.scaleMap[parts.root];\n const modparts = this.music.getNoteParts(scaleNote);\n if (scaleNote === note) {\n return {\n note: scaleNote,\n accidental: parts.accidental,\n change: false,\n };\n }\n // Then search for a note of equivalent value in our altered scale\n const valueNote = this.scaleMapByValue[this.music.getNoteValue(note)];\n if (valueNote != null) {\n return {\n note: valueNote,\n accidental: this.music.getNoteParts(valueNote).accidental,\n change: false,\n };\n }\n // Then search for a note of equivalent value in the original scale\n const originalValueNote = this.originalScaleMapByValue[this.music.getNoteValue(note)];\n if (originalValueNote != null) {\n this.scaleMap[modparts.root] = originalValueNote;\n delete this.scaleMapByValue[this.music.getNoteValue(scaleNote)];\n this.scaleMapByValue[this.music.getNoteValue(note)] = originalValueNote;\n return {\n note: originalValueNote,\n accidental: this.music.getNoteParts(originalValueNote).accidental,\n change: true,\n };\n }\n // Then try to unmodify a currently modified note.\n if (modparts.root === note) {\n delete this.scaleMapByValue[this.music.getNoteValue(this.scaleMap[parts.root])];\n this.scaleMapByValue[this.music.getNoteValue(modparts.root)] = modparts.root;\n this.scaleMap[modparts.root] = modparts.root;\n return {\n note: modparts.root,\n accidental: undefined,\n change: true,\n };\n }\n // Last resort -- shitshoot\n delete this.scaleMapByValue[this.music.getNoteValue(this.scaleMap[parts.root])];\n this.scaleMapByValue[this.music.getNoteValue(note)] = note;\n delete this.scaleMap[modparts.root];\n this.scaleMap[modparts.root] = note;\n return {\n note,\n accidental: parts.accidental,\n change: true,\n };\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Mike Corrigan \n// MIT License\nimport { Glyph } from './glyph';\nimport { GraceNote } from './gracenote';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category, isGraceNote } from './typeguard';\n/** Tremolo implements tremolo notation. */\nexport class Tremolo extends Modifier {\n /**\n * @param num number of bars\n */\n constructor(num) {\n super();\n this.num = num;\n this.position = Modifier.Position.CENTER;\n this.code = 'tremolo1';\n // big strokes scales initialised to 1 (no scale)\n this.y_spacing_scale = 1;\n this.extra_stroke_scale = 1;\n }\n static get CATEGORY() {\n return Category.Tremolo;\n }\n /** Draw the tremolo on the rendering context. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const stemDirection = note.getStemDirection();\n const start = note.getModifierStartXY(this.position, this.index);\n let x = start.x;\n const gn = isGraceNote(note);\n const scale = gn ? GraceNote.SCALE : 1;\n const category = `tremolo.${gn ? 'grace' : 'default'}`;\n const musicFont = Tables.currentMusicFont();\n let y_spacing = musicFont.lookupMetric(`${category}.spacing`) * stemDirection;\n // add y_spacing_scale for big strokes (#1258)\n y_spacing *= this.y_spacing_scale;\n const height = this.num * y_spacing;\n let y = note.getStemExtents().baseY - height;\n if (stemDirection < 0) {\n y += musicFont.lookupMetric(`${category}.offsetYStemDown`) * scale;\n }\n else {\n y += musicFont.lookupMetric(`${category}.offsetYStemUp`) * scale;\n }\n const fontScale = musicFont.lookupMetric(`${category}.point`);\n x += musicFont.lookupMetric(`${category}.offsetXStem${stemDirection === Stem.UP ? 'Up' : 'Down'}`);\n for (let i = 0; i < this.num; ++i) {\n Glyph.renderGlyph(ctx, x, y, fontScale, this.code, { category, scale: this.extra_stroke_scale });\n y += y_spacing;\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// Utility methods used by the rest of the VexFlow codebase.\nimport { Flow } from './flow';\nimport { log, RuntimeError } from './util';\nexport class Vex {\n // Users of `Vex.forEach(a, fn)` should use `Array.prototype.forEach()` instead.\n // static forEach(arr: T[], callbackFn: (value: T, index: number, array: T[]) => void) {\n // arr.forEach(callbackFn);\n // }\n /**\n * Take `arr` and return a new list consisting of the sorted, unique,\n * contents of arr. Does not modify `arr`.\n */\n // eslint-disable-next-line\n static sortAndUnique(arr, cmp, eq) {\n if (arr.length > 1) {\n const newArr = [];\n let last;\n arr.sort(cmp);\n for (let i = 0; i < arr.length; ++i) {\n if (i === 0 || !eq(arr[i], last)) {\n newArr.push(arr[i]);\n }\n last = arr[i];\n }\n return newArr;\n }\n else {\n return arr;\n }\n }\n /** Check if array `arr` contains `obj`. */\n // eslint-disable-next-line\n static contains(arr, obj) {\n let i = arr.length;\n while (i--) {\n if (arr[i] === obj) {\n return true;\n }\n }\n return false;\n }\n // Get the 2D Canvas context from DOM element `canvas_sel`.\n static getCanvasContext(canvasSelector) {\n if (!canvasSelector) {\n throw new RuntimeError('BadArgument', 'Invalid canvas selector: ' + canvasSelector);\n }\n const canvas = document.getElementById(canvasSelector);\n if (!(canvas && canvas.getContext)) {\n throw new RuntimeError('UnsupportedBrowserError', 'This browser does not support HTML5 Canvas');\n }\n return canvas.getContext('2d');\n }\n /** Benchmark. Run function `f` once and report time elapsed shifted by `s` milliseconds. */\n // eslint-disable-next-line\n static benchmark(s, f) {\n const start_time = new Date().getTime();\n f();\n const elapsed = new Date().getTime() - start_time;\n log(s, elapsed + 'ms');\n }\n // Get stack trace.\n static stackTrace() {\n const err = new Error();\n return err.stack;\n }\n}\nVex.Flow = Flow;\n","export const CustomFont = {\n resolution: 1000,\n fontFamily: 'VexFlowCustom',\n glyphs: {\n noteheadSquareWhite: {\n x_min: 0,\n x_max: 430.75,\n ha: 386,\n o: 'm 0 200 l 0 -200 l 430 -200 l 430 200 l 0 200 l 50 150 l 380 150 l 380 -150 l 50 -150 l 50 150 ',\n },\n noteheadSquareBlack: {\n x_min: 0,\n x_max: 430.75,\n ha: 386,\n o: 'm 0 200 l 0 -200 l 430 -200 l 430 200 l 0 200 ',\n },\n accidentalBuyukMucennebFlat: {\n x_min: -171.5,\n x_max: 251.8125,\n ha: 257,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 553 20 616 20 614 b 20 491 20 503 20 491 l 20 491 b 153 535 47 501 149 535 b 174 514 167 535 174 524 b 164 496 174 508 171 501 b 92 470 164 495 132 484 l 20 445 l 20 390 b 20 363 20 378 20 370 b 20 333 20 340 20 333 l 20 333 b 153 377 47 344 149 377 b 174 356 167 377 174 367 b 164 338 174 349 171 342 b 92 312 164 338 132 326 l 20 288 l 20 219 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 30 -21 -212 -21 -212 b -21 273 -21 163 -21 273 b -84 252 -21 273 -50 263 b -152 230 -133 234 -145 230 b -157 231 -155 230 -156 231 b -171 252 -166 234 -171 244 b -160 270 -171 259 -167 266 b -27 316 -159 270 -93 294 l -21 319 l -21 374 b -21 431 -21 406 -21 431 b -84 409 -21 431 -50 421 b -152 388 -133 392 -145 388 b -157 390 -155 388 -156 388 b -171 409 -166 392 -171 401 b -160 428 -171 417 -167 424 b -27 474 -159 428 -93 451 l -21 476 l -21 546 b -20 620 -21 614 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ',\n },\n accidentalBakiyeFlat: {\n x_min: -176.9375,\n x_max: 251.8125,\n ha: 257,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 503 20 616 20 614 b 20 391 20 442 20 391 b 84 424 20 391 49 406 l 147 456 l 152 456 b 153 456 153 456 153 456 b 175 435 166 456 175 446 b 172 427 175 433 174 430 b 92 380 170 420 172 421 l 20 342 l 20 245 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 54 -21 -212 -21 -212 b -21 322 -21 201 -21 322 b -85 290 -21 322 -50 308 l -148 256 l -153 256 b -155 256 -155 256 -155 256 b -176 277 -167 256 -176 266 b -174 285 -176 280 -175 283 b -93 333 -171 294 -174 292 l -21 370 l -21 494 b -20 620 -21 616 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ',\n },\n accidentalKucukMucennebSharp: {\n x_min: -1.359375,\n x_max: 255.890625,\n ha: 261,\n o: 'm 118 514 b 127 517 121 517 122 517 b 147 505 136 517 142 513 l 148 502 l 148 403 b 148 306 148 351 148 306 b 174 315 149 306 160 310 l 200 324 l 205 323 b 223 312 213 323 220 319 l 225 308 l 225 260 b 225 245 225 255 225 249 b 220 204 225 208 224 209 b 179 188 216 199 215 199 l 148 177 l 148 124 l 148 70 l 189 84 b 236 98 219 94 230 98 b 247 94 240 98 243 97 b 255 52 254 88 255 87 b 255 33 255 47 255 40 l 254 -12 l 253 -15 b 249 -22 253 -18 250 -20 l 245 -24 l 196 -41 l 148 -58 l 148 -108 b 148 -158 148 -136 148 -158 b 174 -148 148 -158 160 -154 b 204 -140 198 -140 200 -140 l 204 -140 b 224 -152 213 -140 221 -145 b 225 -201 224 -155 225 -177 b 224 -254 225 -226 224 -251 b 157 -284 220 -262 220 -262 l 148 -288 l 148 -395 l 148 -503 l 147 -506 b 127 -519 142 -514 134 -519 b 107 -506 119 -519 111 -514 l 106 -503 l 106 -403 b 106 -303 106 -316 106 -303 b 104 -303 104 -303 104 -303 b 88 -310 104 -303 96 -306 l 63 -319 b 51 -322 59 -320 55 -322 b 36 -315 46 -322 40 -319 b 31 -273 32 -309 31 -312 b 31 -258 31 -269 31 -263 l 31 -210 l 34 -206 b 40 -198 35 -204 38 -199 b 74 -186 42 -197 57 -191 l 106 -173 l 106 -123 b 106 -97 106 -112 106 -104 b 106 -72 106 -76 106 -72 b 104 -72 106 -72 106 -72 b 20 -99 89 -79 23 -99 b 0 -84 10 -99 2 -93 b -1 -37 0 -81 -1 -59 b 0 11 -1 -15 0 9 b 58 40 4 22 2 22 l 106 56 l 106 109 b 106 123 106 115 106 119 b 106 162 106 147 106 162 b 81 155 106 162 93 159 b 50 147 65 149 55 147 b 36 152 43 147 40 148 b 31 194 32 158 31 156 b 31 209 31 198 31 204 l 31 256 l 34 260 b 76 281 38 269 38 269 l 106 292 l 106 396 l 106 502 l 107 505 b 118 514 110 509 114 513 ',\n },\n accidentalKoron: {\n x_min: -20,\n x_max: 320,\n ha: 257,\n o: 'm -8 200 b -8 210 8 200 16 200 l 20 148 -199 l 23 -615 b 0 -629 9 -629 6 -629 l -21 -612 l -21 -201 l -21 216 l -20 200 m 16 200 l 310 0 l 240 0 l 16 140 l 16 -120 l 240 0 l 310 0 l 16 -200 ',\n },\n accidentalSori: {\n x_min: -10.890625,\n x_max: 299.4375,\n ha: 294,\n o: 'm 44 174 b 51 174 47 174 49 174 b 68 173 55 174 61 174 l 287 112 l 551 40 b 615 20 617 22 609 23 b 626 0 622 16 626 8 b 615 -22 626 -9 622 -18 b 613 -23 613 -23 613 -23 b 613 -23 613 -23 613 -23 b 287 -113 613 -24 597 -29 l 68 -174 b 53 -176 61 -176 57 -176 b 39 -172 47 -176 43 -174 b 27 -151 31 -167 27 -159 b 39 -129 27 -141 31 -133 b 230 -74 43 -124 20 -131 l 370 -36 l 468 -9 b 498 0 484 -4 498 -1 b 468 8 498 0 484 2 l 370 34 l 230 73 b 40 126 28 129 43 124 b 27 149 31 131 27 140 b 44 174 27 161 34 170 m 205 110 l 205 300 b 205 330 245 330 245 300 l 245 300 l 245 -300 b 245 -330 205 -330 205 -300 l 205 -300 l 205 110 l 345 90 m 345 90 l 345 330 b 345 360 385 360 385 330 l 385 330 l 385 -270 b 385 -300 345 -300 345 -270 l 345 -270 l 345 90 ',\n },\n vexAccidentalMicrotonal2: {\n x_min: -1.359375,\n x_max: 386.5625,\n ha: 394,\n o: 'm 249 535 b 257 537 251 537 253 537 b 276 524 266 537 273 533 l 277 521 l 279 419 l 279 316 l 304 323 b 337 328 319 326 330 328 b 353 316 347 328 349 324 b 355 266 355 315 355 290 b 353 215 355 241 355 217 b 319 198 349 206 347 205 b 279 187 284 190 279 188 b 279 156 279 187 279 174 b 279 136 279 151 279 144 l 279 84 l 289 87 l 330 98 b 367 105 352 102 362 105 b 378 101 372 105 375 104 b 386 61 385 95 386 94 b 386 40 386 55 386 48 l 386 -5 l 385 -8 b 374 -19 383 -12 378 -18 b 291 -40 372 -19 347 -26 b 279 -43 284 -41 279 -43 b 279 -83 279 -43 279 -59 b 279 -95 279 -87 279 -91 l 279 -145 l 304 -140 b 337 -133 321 -136 330 -133 b 349 -140 343 -133 347 -136 b 355 -181 355 -145 355 -142 l 355 -197 l 355 -210 b 349 -252 355 -249 355 -247 b 300 -269 345 -258 347 -258 b 280 -274 291 -272 281 -273 l 279 -274 l 277 -378 l 277 -483 l 276 -487 b 257 -499 273 -495 265 -499 b 238 -487 249 -499 242 -495 l 236 -483 l 236 -384 l 236 -285 l 235 -285 l 212 -291 l 170 -301 b 148 -308 159 -305 148 -306 b 147 -415 147 -308 147 -313 l 147 -523 l 145 -526 b 126 -538 141 -534 133 -538 b 106 -526 118 -538 110 -534 l 104 -523 l 104 -420 b 103 -317 104 -326 104 -317 b 103 -317 103 -317 103 -317 b 50 -330 92 -322 54 -330 b 31 -317 42 -330 35 -326 b 29 -267 29 -315 29 -315 l 29 -219 l 32 -216 b 92 -192 36 -206 36 -206 l 104 -190 l 104 -138 b 103 -87 104 -91 104 -87 b 103 -87 103 -87 103 -87 b 88 -91 103 -87 96 -88 l 49 -101 b 17 -106 32 -105 23 -106 b 6 -102 13 -106 10 -105 b -1 -62 0 -97 -1 -95 b 0 -41 -1 -56 0 -49 l 0 4 l 1 6 b 10 16 2 11 6 15 b 91 37 12 18 38 24 l 104 41 l 104 93 b 103 144 104 140 104 144 b 103 144 103 144 103 144 b 50 131 92 141 54 131 b 31 144 42 131 35 137 b 29 195 29 147 29 148 l 29 242 l 32 245 b 92 269 36 255 36 255 l 104 273 l 104 377 l 104 481 l 106 485 b 126 498 110 492 118 498 b 134 495 129 498 132 496 b 145 485 138 494 142 489 l 147 481 l 147 383 l 147 283 l 152 284 b 190 294 155 285 171 290 l 230 303 l 236 305 l 236 413 l 236 521 l 238 524 b 249 535 240 528 243 533 m 236 126 b 235 177 236 154 236 177 l 235 177 b 213 172 235 177 225 174 l 170 161 b 147 155 157 158 147 155 b 147 124 147 155 147 142 b 147 102 147 117 147 111 l 147 52 l 153 54 l 228 72 l 236 74 l 236 126 m 236 -105 b 235 -54 236 -65 236 -54 l 235 -54 b 231 -55 235 -54 234 -54 b 172 -69 227 -55 204 -62 l 149 -76 l 147 -76 l 147 -127 l 147 -179 l 152 -177 b 190 -167 155 -177 171 -173 l 230 -158 l 236 -156 l 236 -105 ',\n },\n vexAccidentalMicrotonal3: {\n x_min: 0,\n x_max: 430.75,\n ha: 360,\n o: 'm -146 537 b -138 538 -143 538 -141 538 b -118 525 -129 538 -121 533 b -117 390 -117 522 -117 521 b -115 259 -117 268 -117 259 b -115 259 -115 259 -115 259 b -59 272 -104 263 -62 272 b -39 259 -50 272 -42 267 b -37 209 -38 257 -37 233 b -39 159 -37 185 -38 162 b -85 138 -43 149 -44 149 l -117 131 l -117 21 b -115 -88 -117 -80 -117 -88 b -115 -88 -115 -88 -115 -88 b -59 -75 -104 -84 -62 -75 b -44 -81 -52 -75 -48 -77 b -38 -124 -38 -87 -38 -85 b -38 -138 -38 -124 -38 -138 b -38 -152 -38 -138 -38 -152 b -44 -195 -38 -191 -38 -190 b -85 -209 -48 -200 -48 -200 l -117 -217 l -117 -349 b -118 -486 -117 -481 -117 -482 b -138 -499 -121 -494 -129 -499 b -153 -493 -143 -499 -149 -497 b -159 -415 -158 -487 -159 -496 b -159 -355 -159 -398 -159 -379 b -159 -227 -159 -284 -159 -227 b -205 -238 -159 -227 -180 -232 b -250 -249 -230 -244 -250 -249 b -251 -386 -251 -249 -251 -311 b -252 -525 -251 -521 -251 -522 b -272 -538 -255 -534 -264 -538 b -287 -532 -277 -538 -283 -536 b -293 -452 -292 -527 -293 -536 b -293 -391 -293 -436 -293 -415 b -294 -260 -293 -269 -293 -260 b -294 -260 -294 -260 -294 -260 b -348 -272 -306 -264 -345 -272 b -368 -259 -357 -272 -365 -267 b -369 -209 -369 -257 -369 -233 b -368 -159 -369 -185 -369 -162 b -323 -139 -364 -149 -362 -148 l -293 -131 l -293 -22 b -294 87 -293 80 -293 87 b -294 87 -294 87 -294 87 b -348 75 -306 84 -345 75 b -368 88 -357 75 -365 80 b -369 138 -369 91 -369 114 b -368 188 -369 162 -369 186 b -323 209 -364 198 -362 199 l -293 216 l -293 349 b -292 486 -293 481 -293 482 b -272 499 -288 494 -280 499 b -257 493 -266 499 -261 497 b -251 414 -251 487 -251 496 b -251 354 -251 398 -251 378 b -251 226 -251 284 -251 226 b -205 238 -250 226 -230 231 b -159 249 -180 244 -159 249 b -159 385 -159 249 -159 310 b -157 525 -159 521 -159 522 b -146 537 -156 530 -151 535 z m -159 11 b -159 120 -159 98 -159 120 l -159 120 b -175 116 -160 120 -167 119 b -221 105 -184 114 -204 109 l -251 98 l -251 -12 b -251 -121 -251 -72 -251 -121 b -205 -110 -250 -121 -230 -116 b -159 -99 -180 -104 -159 -99 b -159 11 -159 -99 -159 -49 z m 89 517 b 97 519 92 518 94 519 b 117 505 106 519 114 513 b 119 376 119 502 119 501 l 119 249 l 145 258 b 176 267 169 266 172 267 b 177 267 176 267 177 267 b 196 255 186 267 192 263 l 197 252 l 197 205 b 197 181 197 195 197 187 b 193 149 197 153 197 153 b 152 131 190 144 187 143 l 119 120 l 119 10 b 119 -100 119 -62 119 -100 b 145 -91 120 -100 131 -96 b 173 -82 159 -86 171 -82 b 176 -81 174 -81 175 -81 b 196 -94 185 -81 193 -87 b 198 -151 197 -97 198 -125 b 197 -194 198 -172 197 -192 b 153 -218 193 -203 192 -204 l 119 -230 l 119 -367 l 118 -504 l 117 -507 b 97 -519 113 -514 105 -519 b 82 -512 92 -519 87 -517 b 76 -434 77 -507 76 -516 b 76 -374 76 -418 76 -398 b 76 -245 76 -303 76 -245 b 52 -254 76 -245 65 -249 b 19 -263 34 -260 25 -263 b 6 -257 13 -263 10 -261 b 0 -214 0 -251 0 -253 b 0 -200 0 -210 0 -205 b 0 -188 0 -196 0 -192 b 6 -143 0 -147 0 -149 b 46 -126 10 -139 10 -139 l 76 -115 l 76 -5 b 76 106 76 56 76 106 b 51 98 76 106 64 102 b 18 89 34 92 25 89 b 6 95 13 89 10 91 b 0 139 0 101 0 99 b 0 153 0 143 0 148 b 0 179 0 163 0 172 b 44 225 0 215 3 211 l 76 236 l 76 369 b 78 505 76 501 76 502 b 89 517 80 510 85 515 z ',\n },\n vexAccidentalMicrotonal4: {\n x_min: 0,\n x_max: 430.75,\n ha: 360,\n o: 'm 283 633 b 291 634 286 634 289 634 b 311 621 300 634 308 629 b 313 505 313 618 313 617 b 313 393 313 443 313 393 b 378 425 313 393 343 407 l 443 458 l 448 458 b 449 458 449 458 449 458 b 471 437 462 458 471 448 b 469 429 471 434 470 432 b 387 382 466 421 469 423 l 313 344 l 313 247 l 313 150 l 315 152 b 433 201 353 184 394 201 b 479 193 448 201 464 198 b 549 86 524 177 549 135 b 526 1 549 59 541 29 b 395 -143 504 -39 475 -71 b 316 -214 351 -182 341 -191 b 292 -229 302 -228 300 -229 b 272 -216 283 -229 275 -224 b 271 55 271 -212 271 -212 b 270 323 271 203 270 323 b 205 291 270 323 241 308 l 140 258 l 135 258 b 134 258 135 258 134 258 b 112 279 121 258 112 267 b 114 287 112 281 113 284 b 196 334 117 295 114 293 l 271 371 l 271 495 b 272 621 271 617 271 618 b 283 633 274 626 279 631 z m 404 133 b 391 134 400 134 395 134 b 384 134 388 134 386 134 b 318 88 358 130 335 114 l 313 81 l 313 -37 l 313 -156 l 316 -152 b 439 83 391 -71 439 22 l 439 84 b 404 133 439 115 430 128 z m -8 633 l -8 633 b 0 634 -6 634 -3 634 b 20 621 8 634 17 629 b 21 384 21 618 21 617 l 21 150 l 24 152 b 141 201 62 184 102 201 b 187 193 157 201 172 198 b 257 86 232 177 257 135 b 234 1 257 59 250 29 b 103 -143 212 -39 183 -71 b 24 -214 60 -182 49 -191 b 0 -229 10 -228 8 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 203 l -21 618 l -20 621 b -8 633 -18 626 -13 631 z m 113 133 l 113 133 b 99 134 109 134 103 134 b 93 134 97 134 94 134 b 26 88 66 130 43 114 l 21 81 l 21 -37 l 21 -156 l 25 -152 b 148 83 99 -71 148 22 l 148 84 b 113 133 148 115 138 128 z ',\n },\n vexNoteHeadRectBlack: {\n x_min: 0,\n x_max: 430.75,\n ha: 360,\n o: 'm 0 150 l 0 -150 l 430 -150 l 430 150 l 0 150 ',\n },\n vexNoteHeadRectWhite: {\n x_min: 0,\n x_max: 430.75,\n ha: 360,\n o: 'm 0 150 l 0 -150 l 430 -150 l 430 150 l 0 150 l 50 100 l 380 100 l 380 -100 l 50 -100 l 50 100',\n },\n },\n};\n","export const CustomMetrics = {\n name: 'VexFlowCustom',\n smufl: false,\n glyphs: {},\n};\n","export const PetalumaFont = {\n glyphs: {\n bracketTop: {\n x_min: 0,\n x_max: 508,\n y_min: 0,\n y_max: 370,\n ha: 370,\n o: 'm 22 0 b 122 0 55 1 89 0 l 157 0 b 713 376 425 0 622 137 b 732 467 724 406 732 436 b 726 514 732 482 730 498 b 711 533 723 528 719 533 b 693 526 707 533 700 530 b 674 498 683 520 678 508 b 635 406 662 467 652 435 b 310 164 560 281 458 193 b 154 151 258 154 206 151 b 39 154 117 151 78 154 b 1 120 17 154 4 145 b 0 84 0 108 0 96 b 0 20 0 63 1 40 b 22 0 0 4 7 0 z',\n },\n bracketBottom: {\n x_min: 0,\n x_max: 496,\n y_min: -393,\n y_max: 0,\n ha: 393,\n o: 'm 696 -566 b 711 -539 713 -566 708 -549 b 714 -521 713 -533 714 -527 b 713 -508 714 -517 713 -513 b 661 -327 706 -445 688 -384 b 392 -42 603 -203 513 -109 b 206 0 331 -7 266 0 b 160 -1 190 0 174 -1 b 26 -1 107 -1 66 -3 b 0 -19 12 -1 0 -4 l 0 -23 b 3 -50 1 -32 3 -42 b 1 -86 3 -62 1 -73 b 4 -118 1 -96 1 -108 b 45 -151 10 -145 23 -154 b 180 -143 89 -144 135 -145 b 621 -419 392 -135 523 -236 b 662 -539 641 -456 655 -497 b 696 -566 667 -557 680 -566 z',\n },\n barlineTick: {\n x_min: 0,\n x_max: 56.036101509664164,\n y_min: 876.905249806889,\n y_max: 1121.5430338167066,\n ha: 244.63778400981766,\n o: 'm 42 1263 b 66 1287 62 1261 66 1272 b 81 1583 65 1387 72 1485 b 35 1614 82 1610 53 1610 b 14 1591 17 1619 16 1604 b 0 1408 7 1525 0 1459 l 0 1292 b 42 1263 1 1263 23 1266 z',\n },\n breathMarkTick: {\n x_min: 0,\n x_max: 568,\n y_min: 0,\n y_max: 621,\n ha: 621,\n o: 'm 258 0 b 278 39 276 0 274 24 b 279 56 279 45 279 50 l 279 73 b 278 117 279 88 278 102 b 281 148 278 127 279 138 b 536 600 312 330 387 487 b 744 719 600 651 670 690 b 815 779 775 730 808 740 b 818 824 818 793 818 808 b 815 868 818 838 818 852 b 796 894 814 881 808 894 b 779 888 791 894 786 893 b 719 864 760 878 739 871 b 372 602 580 806 459 724 b 229 252 298 498 251 383 b 220 268 225 262 222 264 b 209 302 217 279 213 291 b 75 527 181 387 143 467 b 16 563 58 543 39 573 b 0 539 3 557 0 549 b 12 492 0 524 9 507 b 56 400 19 459 22 425 b 163 269 104 367 138 323 b 238 36 197 194 216 115 b 258 0 242 22 243 0 z',\n },\n segno: {\n x_min: 0,\n x_max: 798,\n y_min: -65,\n y_max: 806,\n ha: 871,\n o: 'm 16 -94 b 66 -69 39 -92 53 -85 b 177 59 102 -26 138 17 b 543 456 298 192 420 324 b 726 300 615 420 680 373 b 753 217 744 271 753 243 b 655 112 753 170 719 131 b 599 104 636 107 618 104 b 461 173 544 104 495 128 b 432 190 454 183 444 190 b 409 179 425 190 418 187 b 359 118 390 160 373 141 b 341 72 347 101 341 86 b 373 24 341 56 351 40 b 409 6 384 17 396 10 b 550 -13 454 -12 501 -14 b 599 -6 566 -12 583 -10 b 864 213 720 27 806 104 b 886 300 878 242 886 271 b 857 395 886 331 877 363 b 799 467 840 420 821 445 b 648 572 755 513 704 546 b 1110 1083 802 743 955 914 b 1140 1129 1123 1097 1136 1110 b 1149 1148 1142 1135 1149 1142 b 1145 1153 1149 1149 1148 1152 b 1123 1161 1139 1158 1130 1161 b 1109 1156 1119 1161 1113 1159 b 1089 1138 1102 1151 1094 1145 b 946 988 1040 1089 989 1041 b 595 602 834 855 711 732 l 590 598 l 549 615 b 432 793 462 647 432 723 b 534 888 432 851 474 888 b 671 834 588 888 631 864 b 710 818 684 824 696 818 b 724 821 714 818 719 819 b 809 883 757 834 788 852 b 816 901 814 890 816 896 b 802 923 816 910 812 916 b 706 984 770 945 742 971 b 593 1011 668 998 631 1011 b 516 991 567 1011 541 1005 b 333 799 433 949 380 876 b 302 693 312 765 302 729 b 330 589 302 658 311 624 b 469 488 360 533 415 511 b 485 482 475 487 480 485 b 266 249 412 405 338 327 b 121 88 217 196 170 141 b 9 -65 78 40 37 -7 b 0 -85 4 -72 0 -79 b 16 -94 0 -91 4 -94 z m 861 536 b 927 575 890 539 909 557 b 965 628 952 598 965 613 b 926 680 965 644 952 658 b 865 713 900 701 883 713 b 805 667 845 713 828 698 b 768 611 791 649 770 631 b 812 564 766 589 798 582 b 861 536 824 550 840 537 z m 251 350 b 363 436 285 348 353 403 b 354 456 366 448 360 452 b 271 518 327 477 298 497 b 243 528 261 526 252 528 b 210 513 232 528 222 523 b 157 454 190 494 176 472 b 141 428 147 444 141 436 b 158 406 141 420 147 413 b 216 361 180 393 197 376 b 245 350 225 356 235 350 z',\n },\n coda: {\n x_min: 0,\n x_max: 1380,\n y_min: -196,\n y_max: 1037,\n ha: 1233,\n o: 'm 1028 -282 b 1057 -245 1045 -282 1053 -261 b 1060 -203 1060 -232 1060 -217 b 1063 9 1060 -132 1061 -62 b 1390 194 1192 22 1303 81 b 1531 543 1467 298 1512 415 b 1532 556 1531 547 1532 552 b 1904 559 1656 557 1780 559 b 1950 582 1920 559 1941 569 b 1987 674 1970 609 1987 638 b 1984 698 1987 681 1986 690 b 1950 700 1973 698 1961 700 l 1941 700 l 1545 696 b 1535 776 1545 723 1541 749 b 1103 1113 1477 996 1326 1107 b 1080 1115 1096 1115 1087 1115 b 1081 1322 1080 1184 1080 1253 b 1079 1467 1083 1371 1081 1418 b 1061 1493 1079 1476 1080 1493 l 1060 1493 b 1028 1467 1044 1490 1031 1485 b 1020 1403 1025 1446 1020 1424 b 1017 1110 1020 1305 1018 1208 l 962 1106 b 569 914 808 1087 671 1035 b 451 683 510 844 472 766 l 161 678 b 118 680 148 678 132 680 b 79 670 101 680 86 678 b 0 544 48 636 29 592 l 37 544 l 429 549 b 428 518 428 539 428 528 b 488 285 428 435 458 360 b 681 81 526 192 593 124 b 946 9 763 40 854 19 b 1008 6 966 7 988 6 b 1005 -137 1008 -42 1005 -89 b 1012 -243 1005 -173 1005 -209 b 1028 -282 1015 -258 1011 -282 z m 1074 690 b 1079 935 1077 772 1077 852 b 1326 855 1166 932 1250 909 b 1446 694 1385 814 1426 759 b 1269 693 1387 694 1328 693 b 1074 690 1204 693 1139 691 z m 577 684 b 766 874 618 763 678 828 b 989 932 837 912 913 923 b 1015 933 998 932 1007 933 b 1014 822 1015 896 1014 860 b 1011 688 1012 791 1012 743 z m 1067 184 b 1071 553 1070 307 1068 429 b 1439 556 1194 553 1316 554 b 1437 554 1439 554 1437 554 b 1341 337 1413 478 1387 402 b 1119 192 1286 261 1211 212 b 1067 184 1102 189 1084 186 z m 1008 180 b 660 264 886 181 770 212 b 524 471 570 305 524 374 b 528 524 524 488 526 505 l 533 549 b 792 552 619 550 706 550 b 1009 553 865 553 937 552 b 1008 180 1009 428 1008 288 z',\n },\n gClef: {\n x_min: 0,\n x_max: 664,\n y_min: -559,\n y_max: 1009,\n ha: 1568,\n o: 'm 343 -805 b 366 -801 350 -805 357 -804 b 409 -773 383 -795 397 -786 b 582 -328 528 -648 577 -497 b 583 -294 582 -315 583 -294 b 612 -279 583 -294 603 -282 b 747 -197 660 -256 706 -230 b 949 143 857 -109 920 10 b 956 206 955 164 956 186 b 791 384 956 297 906 363 b 704 393 762 390 733 393 b 498 336 632 393 563 374 b 481 325 490 331 481 325 l 444 465 b 442 485 442 472 442 485 b 609 880 442 485 589 746 b 619 996 616 919 619 958 b 613 1084 619 1027 618 1056 b 534 1387 599 1188 560 1286 b 482 1453 527 1417 517 1453 b 422 1407 456 1453 438 1428 b 305 1063 348 1305 312 1188 b 304 1002 304 1043 304 1022 b 338 654 304 886 323 769 b 343 629 338 645 341 636 b 144 356 278 537 206 451 b 23 144 101 288 53 220 b 0 20 7 107 0 63 b 82 -210 0 -69 30 -160 b 207 -288 112 -239 160 -271 b 410 -328 274 -312 340 -328 b 474 -324 431 -328 452 -327 l 491 -321 b 491 -341 491 -321 492 -334 b 402 -585 475 -428 454 -513 b 294 -668 374 -622 348 -664 b 271 -693 278 -670 271 -680 b 274 -708 271 -698 272 -703 b 302 -775 282 -730 292 -753 b 343 -805 311 -795 325 -805 z m 400 717 b 382 922 389 786 382 854 b 481 1286 382 1047 408 1169 b 507 1125 498 1233 507 1179 b 500 1040 507 1097 504 1068 b 400 717 481 927 455 818 z m 252 -135 b 196 -121 232 -134 215 -127 b 117 -69 158 -108 127 -94 b 111 -32 112 -58 111 -45 b 117 19 111 -16 114 1 b 130 56 118 27 127 52 b 324 337 186 156 253 246 l 384 416 l 395 384 b 416 291 406 348 416 291 b 350 213 416 291 376 239 b 243 -42 278 143 243 55 b 251 -117 243 -66 246 -91 b 252 -135 252 -122 252 -127 z m 563 -91 b 510 168 552 3 530 78 b 513 192 508 179 508 186 b 624 202 550 199 586 202 b 730 192 660 202 694 199 b 850 141 773 183 816 176 b 858 134 852 138 855 135 b 595 -121 801 19 716 -68 l 569 -131 z m 410 -160 b 311 -147 360 -160 311 -147 b 307 -98 311 -147 307 -127 b 314 -33 307 -79 308 -56 b 429 131 328 36 377 85 b 441 138 433 135 438 138 b 449 122 446 138 448 132 b 490 -131 462 37 484 -46 b 490 -153 491 -140 490 -153 b 410 -160 490 -153 452 -163 z',\n },\n cClef: {\n x_min: 0,\n x_max: 731,\n y_min: -543,\n y_max: 543,\n ha: 1086,\n o: 'm 131 -782 b 141 -755 138 -782 140 -773 b 147 -490 143 -667 145 -577 b 160 207 150 -258 153 -24 b 168 618 164 344 158 481 b 81 768 173 690 132 732 b 45 782 66 778 55 782 b 3 740 26 782 13 768 b 0 724 1 736 0 730 l 1 710 b 4 596 4 672 4 634 l 4 382 b 9 102 4 288 4 196 b 17 -301 13 -32 10 -166 l 17 -672 b 50 -736 17 -701 27 -720 b 109 -772 69 -749 91 -759 b 131 -782 120 -778 127 -782 z m 615 -770 b 881 -684 710 -770 801 -739 b 1020 -395 986 -612 1020 -510 b 1017 -334 1020 -374 1018 -354 b 769 -62 1007 -209 896 -75 b 746 -60 762 -60 755 -60 b 639 -73 710 -60 675 -69 b 524 -109 598 -79 560 -92 b 528 -36 526 -85 528 -60 b 527 -4 528 -26 528 -14 b 528 39 527 10 528 24 b 526 99 528 59 527 79 b 592 94 549 95 570 94 b 648 99 611 94 629 95 b 912 157 744 94 844 117 b 1053 377 1009 215 1053 284 b 1050 425 1053 393 1053 409 b 914 665 1037 521 986 602 b 717 753 855 717 791 753 b 626 734 688 753 658 747 l 462 665 b 347 500 374 628 347 580 b 350 449 347 484 348 468 b 392 419 353 428 367 416 b 492 438 425 425 459 428 b 541 498 524 448 541 468 b 540 514 541 503 541 508 b 537 546 537 524 537 536 b 573 639 537 580 550 611 b 606 657 582 649 593 657 l 609 657 b 716 622 647 652 684 647 b 834 372 801 556 834 469 b 831 323 834 356 832 338 b 743 187 825 266 795 217 b 710 176 732 180 720 176 b 694 179 704 176 700 177 b 527 223 638 193 582 206 b 495 229 516 228 505 229 b 454 220 481 229 468 225 b 395 189 432 213 415 200 b 363 180 384 186 374 181 b 348 168 356 179 348 176 b 340 161 343 167 340 164 b 347 150 340 157 343 154 b 356 147 348 148 353 147 b 364 92 361 130 363 111 b 369 -37 367 49 369 6 b 363 -154 369 -76 367 -115 b 357 -236 360 -183 357 -210 b 376 -264 357 -253 361 -259 b 456 -289 402 -284 429 -289 b 521 -282 478 -289 500 -285 b 549 -255 537 -279 546 -271 b 598 -177 556 -225 577 -202 b 622 -164 605 -168 613 -164 b 636 -167 626 -164 631 -166 b 749 -225 678 -177 714 -199 b 848 -405 814 -276 848 -337 b 824 -507 848 -436 840 -471 b 657 -657 792 -582 730 -625 b 608 -668 638 -664 622 -668 b 534 -602 572 -668 547 -645 b 513 -575 530 -589 523 -575 b 507 -576 510 -575 508 -575 b 478 -582 497 -580 488 -582 b 405 -570 454 -582 428 -570 b 389 -572 399 -570 395 -570 l 363 -572 b 321 -575 348 -572 333 -569 l 321 631 b 323 662 323 641 323 652 b 315 716 323 681 321 698 b 304 736 314 723 317 736 l 302 736 b 281 716 294 734 285 729 b 275 665 276 700 275 683 l 275 382 b 276 99 275 288 275 193 b 279 -170 278 10 276 -81 b 284 -399 282 -246 284 -323 b 282 -629 284 -475 282 -553 b 289 -721 282 -660 289 -690 b 300 -736 289 -727 291 -736 b 312 -724 307 -736 310 -730 b 321 -667 323 -706 321 -687 l 321 -632 l 328 -644 l 340 -657 b 510 -757 386 -707 445 -740 b 615 -770 546 -766 580 -770 z',\n },\n fClef: {\n x_min: 0,\n x_max: 776,\n y_min: -496,\n y_max: 216,\n ha: 712,\n o: 'm 402 -706 b 804 -405 592 -678 716 -566 b 876 -53 861 -298 874 -183 b 868 33 876 -32 873 1 b 560 311 845 217 723 311 b 524 310 549 311 536 311 b 131 134 373 297 239 242 b 17 -29 84 86 37 39 b 9 -89 12 -50 9 -71 b 112 -238 9 -154 43 -206 b 124 -243 117 -239 120 -242 b 186 -261 145 -255 166 -261 b 268 -228 215 -261 242 -249 b 351 -59 325 -181 351 -124 b 343 10 351 -36 348 -13 b 340 36 341 19 340 27 b 409 105 340 75 363 102 b 441 107 420 107 431 107 b 624 36 510 107 573 86 b 744 -200 688 -27 724 -109 b 747 -230 747 -210 747 -222 b 717 -323 747 -264 736 -292 b 608 -445 688 -370 654 -410 b 307 -541 518 -513 415 -541 l 213 -541 b 39 -521 154 -541 96 -539 b 0 -552 17 -514 0 -531 b 1 -564 0 -556 0 -560 b 17 -611 6 -580 10 -596 b 101 -694 35 -648 50 -684 b 288 -714 164 -707 225 -714 b 402 -706 325 -714 363 -711 z m 1018 92 b 1080 118 1041 91 1068 96 b 1117 219 1099 150 1117 180 b 1113 252 1117 229 1116 240 b 1045 288 1102 297 1068 276 b 1017 262 1028 297 1024 274 b 984 124 989 220 996 170 b 1008 91 979 108 986 91 z m 972 -281 b 1070 -148 1024 -279 1070 -210 b 1025 -105 1070 -105 1045 -112 b 989 -127 1004 -96 998 -114 b 949 -249 963 -164 963 -209 b 969 -281 943 -265 949 -281 z',\n },\n unpitchedPercussionClef1: {\n x_min: 0,\n x_max: 379.13761966945304,\n y_min: -250,\n y_max: 250,\n ha: 500,\n o: 'm 481 -360 b 507 -357 491 -360 500 -360 b 546 -295 541 -346 547 -325 b 536 79 543 -170 540 -46 b 523 311 533 157 534 235 b 475 359 518 340 508 359 b 425 360 459 359 442 360 b 400 359 416 360 409 360 b 337 294 348 353 340 347 l 337 -73 b 336 -264 337 -137 337 -200 b 343 -294 336 -274 338 -284 b 481 -360 359 -330 431 -360 z m 144 -341 b 207 -320 167 -341 189 -331 b 217 -301 215 -315 217 -308 b 210 -262 217 -289 210 -275 b 228 187 212 -112 209 37 b 228 287 228 220 229 253 b 174 353 228 336 222 343 b 120 359 157 357 138 359 b 48 357 96 359 72 356 b 17 323 29 357 19 344 b 7 120 16 255 9 187 b 6 -109 6 43 6 -33 l 6 -204 b 0 -251 6 -220 0 -235 b 3 -269 0 -256 0 -262 b 127 -340 24 -330 79 -328 b 144 -341 132 -341 138 -341 z',\n },\n '6stringTabClef': {\n x_min: 0,\n x_max: 438,\n y_min: -768,\n y_max: 767,\n ha: 1535,\n o: 'm 369 438 b 374 439 370 438 372 438 b 384 462 383 444 384 452 l 384 474 b 390 697 386 547 390 622 b 373 1002 390 799 390 901 l 533 1002 b 560 1001 541 1004 552 1001 b 573 1007 567 1001 572 1002 b 546 1050 579 1025 559 1038 b 536 1056 543 1053 539 1053 b 324 1104 472 1102 397 1104 b 72 1090 238 1104 154 1099 b 55 1093 66 1090 60 1092 b 37 1073 46 1093 37 1089 b 60 1045 37 1061 48 1051 b 203 1001 105 1022 151 1001 b 233 1004 213 1001 223 1002 b 246 1005 238 1004 243 1005 b 272 975 264 1005 272 996 l 272 965 b 258 596 264 842 265 719 b 315 474 253 540 272 504 l 343 455 b 369 438 351 448 357 438 z m 114 -320 b 127 -304 120 -320 124 -315 b 171 -174 141 -261 158 -219 b 222 -135 179 -147 196 -137 b 426 -122 289 -131 359 -128 b 498 -164 462 -120 482 -127 b 628 -301 521 -226 575 -264 b 631 -288 631 -295 631 -291 b 628 -269 631 -281 629 -276 b 569 -134 616 -220 589 -179 b 408 225 514 -14 462 107 b 314 357 384 274 351 318 b 278 380 298 372 288 379 b 251 351 268 380 261 372 b 4 -209 156 171 75 -17 b 0 -228 1 -215 0 -222 b 19 -258 0 -240 7 -249 b 102 -314 45 -279 75 -294 b 114 -320 107 -318 111 -320 z m 425 6 b 360 20 403 17 382 20 b 274 14 331 20 302 14 l 246 14 l 340 206 b 425 6 369 137 395 75 z m 245 -1106 b 281 -1104 256 -1106 269 -1106 b 511 -888 400 -1094 511 -1035 b 454 -688 511 -814 504 -744 b 448 -678 449 -685 448 -681 b 454 -667 448 -675 449 -671 b 504 -497 503 -619 507 -559 b 324 -288 500 -383 436 -308 b 295 -287 314 -287 304 -287 l 282 -287 b 115 -330 223 -287 168 -307 b 94 -366 102 -336 94 -348 l 94 -370 b 96 -435 96 -392 96 -413 b 73 -858 89 -576 71 -717 b 78 -919 73 -878 78 -899 b 72 -950 78 -930 76 -940 b 63 -992 66 -965 63 -978 b 66 -1015 63 -999 65 -1008 b 173 -1104 84 -1106 84 -1106 b 245 -1106 197 -1104 220 -1104 z m 161 -622 b 147 -618 156 -622 151 -621 b 140 -600 141 -612 140 -606 b 144 -564 140 -589 144 -575 b 143 -554 144 -560 144 -557 l 143 -546 b 220 -451 144 -467 143 -465 b 278 -445 239 -446 259 -444 b 418 -497 328 -445 376 -461 b 429 -516 426 -504 429 -510 b 415 -533 429 -521 423 -527 b 219 -608 357 -579 287 -590 b 215 -609 217 -608 216 -609 b 161 -622 197 -609 177 -622 z m 154 -953 b 130 -933 135 -953 130 -948 l 130 -865 l 128 -865 b 135 -788 130 -838 124 -808 b 203 -769 145 -769 180 -776 b 259 -762 223 -765 242 -762 b 441 -852 330 -762 386 -805 b 449 -867 446 -858 449 -863 b 436 -884 449 -874 444 -878 b 318 -942 402 -914 363 -935 b 154 -953 264 -950 209 -953 z',\n },\n timeSig0: {\n x_min: 20,\n x_max: 513,\n y_min: -358.159536277652,\n y_max: 359,\n ha: 717.159536277652,\n o: 'm 341 -516 b 420 -510 367 -516 395 -514 b 675 -338 533 -494 622 -448 b 737 -92 716 -256 734 -171 b 739 -35 739 -73 739 -53 b 680 305 739 86 720 207 b 400 517 622 449 537 517 b 337 514 380 517 359 517 b 289 507 321 511 305 513 b 91 317 192 477 127 412 b 29 9 50 212 29 108 b 217 -458 29 -157 88 -312 b 341 -516 251 -494 291 -518 z m 412 -452 b 359 -425 393 -452 376 -444 b 187 14 242 -301 179 -158 b 268 334 193 127 212 235 b 387 448 295 383 330 428 b 406 452 395 451 400 452 b 428 444 413 452 420 449 b 517 324 471 413 497 372 b 586 -29 560 222 586 86 b 556 -271 586 -112 585 -193 b 468 -422 536 -327 508 -377 b 412 -452 449 -442 431 -452 z',\n },\n timeSig1: {\n x_min: 20,\n x_max: 283,\n y_min: -364,\n y_max: 366,\n ha: 730,\n o: 'm 264 -524 b 357 -510 297 -524 325 -516 b 374 -490 369 -508 374 -501 b 380 -438 376 -472 380 -455 l 406 246 b 408 301 408 265 408 282 b 400 445 408 348 405 396 b 288 527 395 491 338 527 b 253 520 276 527 264 526 b 240 508 249 517 245 513 b 49 409 192 445 127 413 b 29 396 33 408 29 403 b 32 380 29 392 30 386 b 59 363 36 366 49 364 b 164 348 95 356 130 348 b 222 357 183 348 203 351 b 238 361 228 360 233 360 b 252 334 248 361 252 353 b 243 59 252 242 249 150 b 219 -490 229 -124 233 -307 b 264 -524 217 -516 232 -524 z',\n },\n timeSig2: {\n x_min: 20,\n x_max: 660.4636303241031,\n y_min: -378.7201231608281,\n y_max: 382,\n ha: 760.720123160828,\n o: 'm 99 -543 b 130 -533 111 -550 121 -540 b 255 -448 168 -501 213 -475 b 338 -425 282 -431 310 -425 b 392 -431 356 -425 374 -426 b 485 -462 423 -438 454 -451 b 648 -497 540 -482 595 -497 b 834 -441 711 -497 773 -480 b 950 -242 906 -395 958 -334 b 942 -210 950 -230 950 -215 b 912 -220 932 -204 920 -213 b 861 -264 894 -235 877 -248 b 775 -317 835 -289 808 -305 b 675 -334 742 -328 708 -334 b 510 -295 619 -334 563 -318 b 372 -264 465 -278 420 -264 b 305 -272 350 -264 328 -266 b 331 -242 318 -256 324 -249 b 490 -73 386 -187 438 -131 b 675 340 595 43 664 180 b 677 369 677 350 677 360 b 556 536 677 461 638 508 b 468 550 526 546 497 550 b 297 508 409 550 353 533 b 111 354 220 475 168 412 b 29 197 65 308 29 261 b 32 164 29 187 29 176 b 29 140 33 157 29 147 b 43 125 29 132 32 125 b 73 147 55 125 65 138 b 86 163 79 153 82 158 b 238 320 134 219 183 272 b 425 389 292 367 360 389 b 575 341 480 389 531 373 b 606 298 590 330 606 317 b 600 278 606 292 603 285 b 501 107 576 217 544 158 b 304 -104 439 33 372 -35 b 111 -356 230 -180 167 -265 b 84 -446 92 -386 84 -415 b 86 -481 84 -458 85 -469 b 88 -514 88 -491 88 -503 b 99 -543 89 -526 91 -537 z',\n },\n timeSig3: {\n x_min: 19.824321427094187,\n x_max: 540,\n y_min: -392,\n y_max: 392,\n ha: 784,\n o: 'm 216 -540 b 354 -564 264 -556 310 -564 b 605 -465 445 -564 530 -530 b 729 -161 697 -383 729 -275 b 724 -82 729 -135 727 -108 b 589 95 716 -1 670 62 b 523 114 567 102 546 108 b 750 418 606 213 677 315 b 778 503 769 444 778 472 b 773 540 778 514 776 527 b 750 564 769 557 762 564 b 736 562 746 564 742 563 b 641 552 704 553 672 552 b 402 554 562 552 481 554 l 346 554 b 84 546 258 554 170 554 b 36 501 55 543 40 531 b 29 412 30 472 32 442 b 52 384 27 393 32 384 l 56 384 b 210 392 107 389 158 392 l 602 392 b 354 108 523 285 445 192 b 246 -65 300 58 246 12 b 252 -108 246 -78 248 -92 l 252 -111 b 264 -141 251 -122 251 -135 b 291 -132 274 -145 284 -140 b 425 -72 328 -95 377 -84 b 475 -65 442 -68 459 -65 b 592 -108 517 -65 557 -79 b 645 -179 615 -125 645 -147 b 642 -194 645 -184 644 -189 b 485 -376 616 -278 569 -344 b 361 -399 444 -392 402 -399 b 151 -340 289 -399 219 -376 b 88 -275 122 -323 98 -310 b 71 -249 86 -268 85 -249 b 63 -251 68 -249 66 -249 b 36 -288 48 -255 36 -266 b 55 -423 33 -336 45 -377 b 101 -482 60 -448 78 -468 b 216 -540 138 -504 174 -526 z',\n },\n timeSig4: {\n x_min: 20,\n x_max: 633.0785282750762,\n y_min: -489.59088556716864,\n y_max: 491.18559127100053,\n ha: 980.7764768381692,\n o: 'm 608 -704 b 641 -684 622 -708 634 -696 b 667 -602 660 -660 662 -631 b 685 -190 683 -465 680 -327 l 685 -176 b 831 -127 736 -166 783 -148 b 912 0 901 -94 913 -76 b 886 53 912 36 904 52 b 848 40 877 53 864 49 l 838 36 b 687 -13 789 14 739 -3 b 681 177 687 50 684 114 b 672 338 678 230 677 285 b 654 373 671 350 672 373 b 622 340 636 373 624 361 b 615 262 621 314 613 288 b 619 -22 616 167 619 72 b 569 -22 602 -23 585 -23 b 305 -3 481 -16 395 -1 b 210 -9 274 -3 242 -4 b 301 163 242 52 268 108 b 513 552 377 288 459 412 b 536 652 526 585 536 618 b 533 683 536 662 534 672 b 520 707 531 691 531 707 b 487 693 508 708 494 704 b 474 668 482 684 477 677 b 384 490 454 603 418 547 b 253 281 343 419 295 351 b 73 -13 194 181 145 78 b 29 -108 50 -42 29 -72 b 37 -147 29 -121 32 -134 b 50 -186 43 -160 50 -173 b 68 -216 52 -207 56 -215 b 92 -207 73 -216 82 -213 b 288 -166 156 -180 220 -166 b 556 -186 377 -166 467 -180 b 586 -189 566 -187 576 -187 b 616 -186 596 -189 606 -189 b 606 -432 613 -268 612 -350 b 596 -625 603 -495 596 -559 b 598 -670 596 -641 596 -655 b 608 -704 598 -683 596 -700 z',\n },\n timeSig5: {\n x_min: 19.663871085403297,\n x_max: 583,\n y_min: -389,\n y_max: 389,\n ha: 778,\n o: 'm 132 -536 b 249 -560 168 -553 209 -559 b 507 -462 351 -560 454 -514 b 677 -183 588 -384 642 -289 b 694 -85 688 -150 694 -117 b 540 138 694 12 642 94 b 422 173 501 154 462 167 b 400 187 408 174 400 177 b 405 202 400 190 402 196 b 428 284 416 228 426 255 b 469 312 431 307 442 312 b 757 372 569 312 662 343 b 840 490 821 392 840 432 b 812 560 840 540 834 560 b 763 546 801 560 785 556 b 757 543 762 546 759 544 b 465 484 665 505 570 484 b 396 484 452 484 425 487 b 353 454 377 482 366 474 b 281 300 323 405 304 351 b 245 164 262 255 245 212 b 246 144 245 158 246 151 b 233 63 249 115 243 89 b 225 35 228 50 225 40 b 264 14 225 22 236 19 b 445 -26 325 7 387 0 b 569 -151 501 -52 547 -89 b 575 -180 573 -161 575 -170 b 527 -275 575 -217 547 -245 b 347 -367 484 -334 419 -367 b 261 -351 318 -367 289 -363 b 95 -300 206 -333 154 -307 b 55 -321 73 -297 65 -302 b 29 -468 29 -367 40 -419 b 56 -505 26 -482 36 -500 b 132 -536 82 -514 108 -524 z',\n },\n timeSig6: {\n x_min: 20,\n x_max: 565,\n y_min: -363,\n y_max: 363,\n ha: 726,\n o: 'm 390 -518 b 621 -458 469 -507 549 -494 b 814 -134 753 -390 814 -281 b 652 59 814 -16 750 58 b 580 48 629 59 606 55 b 233 -334 392 -9 276 -138 b 115 -228 181 -314 143 -278 b 98 -160 104 -206 98 -183 b 107 -109 98 -144 101 -127 b 167 37 124 -59 145 -12 b 508 340 236 189 347 292 b 575 353 530 347 553 353 b 648 327 600 353 625 346 b 665 320 654 321 661 320 b 687 336 674 320 681 325 b 703 405 697 359 703 382 b 684 472 703 429 697 451 b 593 523 664 504 631 521 b 576 521 588 523 582 523 b 297 403 472 508 380 465 b 115 177 217 344 164 264 b 29 -121 60 82 29 -17 b 53 -278 29 -173 36 -225 b 226 -497 82 -374 131 -454 b 347 -523 265 -514 305 -523 b 390 -518 361 -523 376 -521 z m 351 -357 b 312 -351 337 -356 320 -363 b 325 -315 304 -340 320 -327 b 543 -120 373 -222 448 -158 b 622 -104 570 -108 596 -102 b 717 -132 655 -104 687 -112 b 740 -167 732 -143 740 -153 b 730 -196 740 -176 737 -184 b 563 -321 690 -258 634 -300 b 359 -357 497 -341 428 -354 z',\n },\n timeSig7: {\n x_min: 20.3617407597707,\n x_max: 592,\n y_min: -345,\n y_max: 345,\n ha: 690,\n o: 'm 253 -497 b 318 -485 276 -497 297 -487 b 366 -441 348 -482 360 -468 b 487 -104 390 -323 433 -210 b 835 403 580 82 701 246 b 852 436 847 416 852 428 b 815 467 852 451 840 461 b 762 474 798 471 779 474 b 674 445 732 474 701 465 b 603 410 652 431 628 420 b 383 360 533 379 459 360 b 200 435 315 360 249 382 b 88 494 168 469 131 485 b 66 497 81 495 73 497 b 33 484 52 497 39 492 b 50 436 22 469 39 451 b 295 310 114 360 199 324 b 406 301 331 304 369 301 b 593 324 468 301 530 308 b 585 307 589 314 588 310 b 265 -249 451 137 338 -46 b 207 -442 242 -312 223 -377 b 204 -462 206 -449 204 -456 b 253 -497 204 -487 220 -497 z',\n },\n timeSig8: {\n x_min: 20,\n x_max: 504.15101530718516,\n y_min: -428,\n y_max: 428,\n ha: 856,\n o: 'm 265 -616 b 289 -615 274 -616 281 -616 b 710 -271 492 -592 657 -485 b 726 -148 721 -229 727 -187 b 585 108 726 -48 687 42 b 572 127 576 114 573 120 b 576 144 572 132 575 138 b 598 301 590 196 598 249 b 586 413 598 338 593 376 b 356 616 559 531 467 616 b 233 582 317 616 275 606 b 29 233 101 505 29 384 b 104 9 29 153 46 72 b 189 -48 127 -16 160 -27 b 92 -158 141 -73 114 -114 b 37 -343 63 -217 50 -279 b 33 -390 35 -359 33 -374 b 265 -616 33 -524 148 -616 z m 258 105 b 124 148 215 105 167 117 b 96 196 105 163 96 177 b 99 217 96 202 96 209 b 197 384 120 281 151 337 b 350 451 242 429 297 451 b 516 364 412 451 472 422 b 530 331 523 354 530 343 l 530 327 l 530 320 b 468 151 520 261 507 200 b 419 122 455 135 442 125 b 258 105 370 117 320 105 z m 328 -438 b 158 -276 233 -436 160 -359 b 166 -239 158 -264 161 -252 b 230 -157 176 -203 202 -179 b 367 -72 274 -125 320 -98 b 448 -49 396 -56 423 -49 b 562 -118 491 -49 528 -72 b 611 -251 590 -157 611 -199 b 569 -341 611 -288 595 -318 b 328 -438 500 -402 416 -432 z',\n },\n timeSig9: {\n x_min: 20,\n x_max: 494,\n y_min: -421,\n y_max: 421,\n ha: 842,\n o: 'm 235 -606 b 361 -564 275 -606 318 -593 b 619 -229 487 -482 566 -366 b 706 127 664 -114 694 4 b 711 233 708 163 711 197 b 700 346 711 271 708 308 b 389 606 658 517 530 606 b 351 605 376 606 364 606 b 56 272 171 586 56 441 b 96 98 56 216 69 156 b 334 -53 144 -3 238 -53 b 544 36 408 -53 484 -24 b 652 176 586 78 622 124 b 631 71 645 141 639 105 b 467 -302 599 -63 562 -196 b 271 -442 412 -364 354 -422 b 225 -448 255 -446 239 -448 b 95 -305 148 -448 98 -395 b 89 -255 95 -288 94 -271 b 73 -233 86 -246 85 -233 b 52 -248 65 -233 56 -239 b 29 -317 42 -271 30 -291 b 49 -448 29 -361 40 -405 b 235 -606 69 -541 144 -606 z m 340 104 b 144 209 264 108 194 141 b 127 258 132 225 127 240 b 137 297 127 271 130 284 b 366 449 184 396 269 449 b 517 408 415 449 467 436 b 595 348 546 392 572 372 b 616 305 608 336 616 321 b 609 281 616 298 613 289 b 340 104 557 184 477 104 z',\n },\n timeSigCommon: {\n x_min: 20,\n x_max: 585,\n y_min: -298,\n y_max: 294.49658092772603,\n ha: 592.496580927726,\n o: 'm 444 -405 b 829 -45 626 -346 740 -207 b 842 26 842 -23 842 1 b 821 58 842 39 841 58 b 795 40 811 58 802 48 b 765 3 785 29 773 16 b 469 -223 690 -104 596 -183 b 354 -242 431 -235 392 -242 b 180 -177 292 -242 235 -223 b 135 -99 154 -157 140 -131 b 132 -59 134 -85 132 -72 b 141 7 132 -37 135 -16 b 449 274 189 160 297 243 b 477 278 459 276 468 276 b 546 203 517 278 539 253 b 517 157 550 177 533 166 b 485 143 507 153 497 143 l 482 143 b 467 148 478 143 472 144 b 374 183 438 170 406 181 b 264 118 333 183 292 161 b 238 48 246 92 238 69 b 261 -9 238 29 245 10 b 383 -73 287 -39 337 -73 b 412 -68 392 -73 402 -72 b 631 164 526 -27 586 59 b 649 252 644 193 649 222 b 636 328 649 278 645 304 b 504 423 615 400 579 429 b 242 318 408 415 317 387 b 29 -158 104 190 29 33 b 30 -176 29 -164 29 -170 b 115 -364 42 -246 52 -315 b 307 -429 177 -410 240 -429 b 444 -405 351 -429 397 -420 z',\n },\n timeSigCutCommon: {\n x_min: 20,\n x_max: 695,\n y_min: -687.0379164869064,\n y_max: 687,\n ha: 1374.0379164869064,\n o: 'm 564 -989 b 595 -945 585 -991 589 -963 l 599 -922 b 605 -628 600 -824 603 -726 l 609 -399 b 878 -251 706 -363 798 -320 b 996 -85 932 -204 976 -153 b 1001 -63 998 -78 1001 -71 b 989 -46 1001 -56 998 -49 b 978 -43 985 -45 982 -43 b 950 -59 968 -43 959 -49 b 733 -216 894 -132 815 -177 b 611 -259 694 -235 652 -249 b 616 -20 612 -179 615 -99 b 680 29 642 -7 665 9 b 698 43 685 36 690 40 b 870 251 792 82 840 160 b 877 294 874 265 877 279 b 818 410 877 338 855 382 b 683 458 779 442 730 448 b 625 468 664 462 644 465 l 625 514 b 638 958 626 662 636 811 b 626 989 638 979 635 989 b 603 981 621 989 613 986 b 422 840 534 945 481 888 b 412 805 412 832 413 818 b 426 713 410 773 420 743 b 445 678 429 690 435 678 b 474 691 452 678 461 683 b 563 755 503 710 530 732 b 564 724 564 740 564 733 b 559 469 563 639 560 554 b 462 454 526 469 494 464 b 112 143 302 399 199 281 b 33 -94 66 71 45 -10 b 29 -148 30 -112 29 -131 b 105 -351 29 -223 52 -291 b 359 -455 171 -426 258 -451 b 517 -431 409 -451 464 -446 l 539 -422 l 539 -477 b 533 -739 536 -563 539 -651 b 530 -824 531 -768 530 -795 b 546 -948 530 -865 533 -907 b 564 -989 552 -962 543 -989 z m 410 -288 b 193 -197 328 -288 253 -264 b 141 -60 160 -161 141 -108 b 157 6 141 -35 147 -12 b 259 158 189 58 217 112 b 438 291 311 215 364 266 b 528 305 468 301 498 305 b 554 304 537 305 546 304 b 553 212 554 274 554 242 b 426 115 498 199 446 164 b 416 68 419 99 416 84 b 425 12 416 49 420 30 b 474 -39 432 -17 448 -32 b 513 -43 487 -42 498 -43 b 547 -40 524 -43 536 -42 l 543 -272 b 461 -285 516 -278 488 -281 b 410 -288 444 -287 426 -288 z m 694 197 b 668 203 685 197 677 199 b 621 216 654 210 638 215 b 622 294 622 242 622 268 b 706 268 651 287 678 278 b 746 235 721 261 734 249 b 752 222 749 230 752 226 b 743 213 752 219 749 215 b 694 197 727 206 711 197 z',\n },\n timeSigPlus: {\n x_min: 0,\n x_max: 661,\n y_min: -358,\n y_max: 358,\n ha: 716,\n o: 'm 605 -516 b 629 -490 624 -516 629 -507 b 628 -475 629 -485 628 -481 b 613 -131 624 -405 616 -174 b 612 -96 612 -114 612 -96 l 647 -98 b 897 -115 730 -99 814 -109 b 940 -89 919 -117 935 -109 b 952 -24 946 -69 952 -46 b 948 9 952 -14 950 -3 b 912 39 942 26 933 37 b 609 60 822 48 609 60 b 616 392 609 60 608 291 b 567 488 619 436 605 467 b 511 516 550 498 531 514 b 498 511 507 516 503 514 b 478 446 475 501 480 469 b 467 150 474 348 469 249 b 465 59 465 121 465 59 l 372 49 b 73 14 272 36 173 24 b 49 13 65 13 56 13 b 0 -33 9 13 0 6 b 60 -141 0 -117 6 -140 b 112 -135 73 -141 91 -140 b 413 -102 213 -125 314 -112 b 464 -98 441 -99 464 -98 l 464 -145 b 477 -456 464 -249 468 -353 b 526 -510 478 -488 491 -507 b 589 -513 546 -511 569 -510 b 605 -516 595 -514 600 -516 z',\n },\n timeSigPlusSmall: {\n x_min: 0,\n x_max: 418,\n y_min: -197,\n y_max: 199,\n ha: 396,\n o: 'm 301 -284 b 330 -238 320 -284 324 -255 b 348 -46 350 -176 341 -111 b 374 -20 351 -27 356 -23 b 481 -17 409 -16 445 -17 b 566 -9 510 -17 537 -16 b 602 3 579 -7 602 -16 b 566 29 602 19 582 24 b 526 33 553 32 539 33 b 384 39 478 36 432 39 b 356 62 363 39 356 42 l 356 68 b 359 177 359 104 359 141 l 359 251 b 341 287 359 264 361 285 b 311 255 324 287 314 272 b 310 228 311 246 310 236 l 301 69 b 275 39 301 49 295 39 l 271 39 b 210 40 251 40 230 40 b 167 39 196 40 181 40 b 89 40 141 37 115 40 b 24 30 68 40 46 37 b 0 17 17 27 0 30 l 0 13 b 27 -17 3 0 7 -13 b 91 -22 49 -22 71 -22 b 153 -22 115 -22 137 -20 l 275 -22 b 295 -40 289 -22 295 -27 l 295 -48 b 288 -235 288 -109 287 -171 b 287 -264 288 -243 287 -253 b 301 -284 287 -275 289 -284 z',\n },\n timeSigMinus: {\n x_min: 0,\n x_max: 662,\n y_min: -54,\n y_max: 55,\n ha: 109,\n o: 'm 39 -78 b 49 -76 42 -78 45 -76 b 452 -75 94 -75 272 -75 b 861 -76 632 -75 814 -76 b 953 -20 927 -79 953 -66 b 948 27 953 -7 950 9 b 946 37 948 30 948 35 b 896 79 940 63 929 79 b 471 78 827 78 648 78 l 42 78 b 0 37 14 78 0 69 b 23 -66 0 0 17 -32 b 39 -78 24 -75 32 -76 z',\n },\n timeSigParensRight: {\n x_min: 0,\n x_max: 274.26483738379414,\n y_min: -722.6326530612245,\n y_max: 725,\n ha: 1447.6326530612246,\n o: 'm 37 -1038 b 69 -1031 48 -1044 59 -1038 b 88 -1015 76 -1027 82 -1021 b 164 -886 120 -976 147 -933 b 333 -351 233 -711 292 -534 b 395 118 366 -204 399 -59 b 389 245 392 144 392 194 b 120 996 369 521 265 766 b 68 1044 99 1030 84 1044 b 19 988 50 1044 36 1024 b 0 922 7 965 0 945 b 20 858 0 901 6 881 b 259 215 141 660 236 449 b 271 -1 266 143 271 71 b 252 -239 271 -82 265 -161 b 148 -667 228 -384 183 -524 b 39 -1009 120 -785 66 -893 b 33 -1031 37 -1017 33 -1024 b 37 -1038 33 -1034 35 -1037 z',\n },\n timeSigParensRightSmall: {\n x_min: 0,\n x_max: 154.4025307335204,\n y_min: -422,\n y_max: 422,\n ha: 844,\n o: 'm 43 -608 b 60 -598 48 -608 53 -605 b 117 -511 82 -572 102 -543 b 222 23 193 -350 219 -177 b 213 166 225 55 216 109 b 115 531 206 294 174 416 b 45 603 99 562 76 588 b 30 608 39 606 35 608 b 10 598 23 608 17 603 b 0 546 3 590 0 570 b 23 451 0 507 9 458 b 102 351 66 429 84 390 b 167 42 150 252 167 148 b 163 -49 167 12 166 -19 b 35 -449 151 -192 121 -330 b 14 -504 22 -467 14 -485 b 17 -527 14 -511 16 -520 l 30 -590 b 43 -608 33 -603 37 -608 z',\n },\n timeSigParensLeft: {\n x_min: 0.5555555555555556,\n x_max: 399.6216117372966,\n y_min: -728,\n y_max: 728,\n ha: 1456,\n o: 'm 562 -1048 b 573 -1043 566 -1048 570 -1047 b 553 -988 582 -1025 564 -1004 b 472 -884 527 -952 497 -920 b 210 -354 366 -717 275 -541 b 148 -6 170 -240 148 -124 b 160 148 148 45 153 96 b 315 678 189 331 242 508 b 431 901 350 755 380 834 b 459 950 451 926 461 939 b 435 995 459 962 451 972 b 364 1048 405 1034 383 1048 b 305 996 343 1048 325 1028 b 127 624 226 881 174 753 b 1 30 56 432 9 235 b 1 -32 1 9 0 -12 b 180 -629 13 -245 92 -438 b 363 -936 230 -739 298 -835 b 526 -1041 402 -995 448 -1041 b 562 -1048 537 -1040 552 -1048 z',\n },\n timeSigParensLeftSmall: {\n x_min: 0,\n x_max: 173.45497224367904,\n y_min: -405,\n y_max: 404,\n ha: 809,\n o: 'm 197 -583 b 222 -553 212 -582 219 -566 b 229 -497 226 -534 229 -516 b 213 -425 229 -472 225 -448 b 102 -177 173 -344 132 -262 b 62 30 78 -111 58 -42 b 91 183 66 82 75 134 b 215 426 118 271 156 356 b 249 552 246 465 252 505 b 230 582 249 563 246 582 b 197 563 219 582 206 576 b 71 356 144 500 105 429 b 0 50 26 259 3 158 b 13 -112 4 -3 7 -58 b 176 -559 29 -275 105 -416 b 196 -583 180 -569 186 -583 z',\n },\n noteheadDoubleWhole: {\n x_min: -0.4444444444444444,\n x_max: 614.1875,\n y_min: -223.03296670127517,\n y_max: 223,\n ha: 446.0329667012752,\n o: 'm 35 -321 b 62 -266 58 -318 58 -288 l 62 -194 b 63 50 62 -114 63 -32 b 60 189 63 96 63 143 b 43 300 59 226 60 265 b 29 321 40 308 39 321 l 26 321 b 0 292 13 318 0 310 b 0 248 0 278 -1 262 b 6 147 4 215 6 181 b 4 48 6 114 4 81 b 6 0 4 32 6 16 b 7 -36 7 -12 7 -24 l 7 -52 b 6 -156 7 -86 6 -121 b 19 -275 6 -196 9 -236 b 35 -321 23 -291 16 -323 z m 847 -314 b 871 -288 860 -315 867 -300 b 884 -187 881 -255 886 -222 b 876 115 878 -86 876 14 b 877 255 876 161 876 209 b 868 291 877 268 873 279 b 855 304 867 301 863 304 b 844 301 852 304 848 304 b 822 265 825 292 822 278 b 824 251 822 259 822 255 b 822 170 822 225 822 197 l 822 -20 b 835 -284 827 -86 825 -186 b 847 -314 837 -295 835 -311 z m 757 -291 b 793 -171 796 -255 792 -212 b 795 -49 795 -131 795 -91 b 786 207 795 36 791 121 b 779 240 786 217 783 229 b 766 258 776 246 776 258 b 762 256 765 258 763 256 b 739 236 752 253 740 252 b 733 177 737 216 732 197 b 737 20 737 125 739 73 l 737 -107 b 740 -202 737 -138 739 -170 b 757 -291 740 -230 743 -261 z m 128 -261 b 144 -251 135 -264 141 -256 b 158 -203 156 -236 157 -220 b 161 -137 161 -181 161 -158 b 157 30 161 -81 157 -26 b 158 76 157 45 157 60 l 158 101 b 156 225 158 141 158 183 b 137 253 156 235 154 253 l 134 253 b 109 222 120 251 109 242 b 104 91 108 179 104 134 b 108 -58 104 42 109 -9 b 107 -105 108 -73 108 -89 b 105 -127 107 -112 107 -120 b 118 -245 105 -167 114 -204 b 128 -261 118 -252 121 -259 z m 488 -242 b 693 -79 595 -249 685 -166 l 693 -55 b 690 0 693 -36 691 -17 b 540 187 684 84 621 164 b 449 200 508 196 480 200 b 210 104 363 200 282 163 b 186 56 196 92 186 76 b 207 -82 186 9 192 -37 b 300 -204 225 -132 248 -181 b 488 -242 356 -229 415 -240 z m 490 -88 b 449 -86 477 -88 464 -88 b 287 -56 399 -85 341 -78 b 258 -33 275 -52 258 -48 b 282 -7 258 -20 272 -13 b 458 43 340 23 399 43 b 580 14 497 43 537 35 b 618 -20 606 1 619 -9 b 592 -58 618 -30 609 -42 b 490 -88 562 -82 528 -88 z',\n },\n noteheadWhole: {\n x_min: 0,\n x_max: 380.16649762501584,\n y_min: -186.17102907059297,\n y_max: 165,\n ha: 351.17102907059297,\n o: 'm 547 40 b 223 -268 543 -151 367 -259 b 102 -233 180 -271 143 -248 l 62 -216 b 0 -127 22 -197 0 -166 b 6 -91 0 -115 1 -104 b 122 141 33 -9 69 71 b 327 238 170 204 249 238 b 514 158 397 238 467 212 b 547 40 544 125 549 84 z m 248 -107 b 384 -63 295 -102 341 -88 b 426 -23 402 -53 415 -40 b 435 3 432 -14 435 -6 b 413 32 435 14 428 24 b 301 73 376 49 343 73 b 272 69 291 73 282 72 b 121 -35 207 53 157 20 b 111 -58 117 -42 111 -50 b 125 -75 111 -65 115 -71 b 248 -107 164 -89 202 -107 z',\n },\n noteheadHalf: {\n x_min: 0,\n x_max: 334,\n y_min: -174,\n y_max: 175,\n ha: 349,\n o: 'm 480 56 b 167 -251 478 -115 331 -251 b 94 -242 143 -251 118 -248 b 9 -141 43 -229 20 -192 b 0 -68 3 -115 0 -91 b 284 249 0 95 127 200 b 304 252 289 251 297 252 b 481 78 374 252 481 170 b 480 56 481 71 481 63 z m 213 -102 b 399 6 274 -81 341 -48 b 402 17 400 7 402 13 b 399 27 402 22 400 26 b 311 94 373 53 353 88 b 292 95 305 95 300 95 b 130 27 230 95 181 55 b 69 -62 98 9 62 -29 b 161 -98 76 -98 128 -91 b 213 -102 174 -101 186 -101 z',\n },\n noteheadBlack: {\n x_min: 0,\n x_max: 334.04644433966797,\n y_min: -164,\n y_max: 164,\n ha: 328,\n o: 'm 112 -233 b 141 -236 122 -235 131 -236 b 481 104 279 -236 485 -48 b 403 222 477 141 478 192 b 334 236 382 232 359 236 b 1 -59 180 236 13 59 b 0 -85 1 -68 0 -76 b 112 -233 0 -157 32 -215 z',\n },\n noteheadXWhole: {\n x_min: 0,\n x_max: 506,\n y_min: -143.0823320899293,\n y_max: 144,\n ha: 287.0823320899293,\n o: 'm 53 -206 b 219 -163 117 -207 170 -196 b 314 -102 249 -141 282 -122 b 377 -63 334 -89 356 -76 b 514 -161 422 -96 468 -128 b 576 -196 534 -174 552 -196 b 589 -193 580 -196 585 -196 b 688 -174 625 -194 657 -181 b 711 -158 698 -171 711 -173 b 696 -143 711 -151 701 -147 b 503 -9 632 -98 567 -52 l 485 4 b 704 145 559 49 634 95 b 729 164 711 150 729 151 l 729 168 b 696 196 726 183 710 193 b 621 207 671 202 645 207 b 528 177 589 207 557 200 b 373 76 480 140 426 108 b 246 164 330 104 287 132 b 122 206 207 193 167 203 b 66 192 102 207 72 207 b 99 147 58 173 85 158 b 274 14 157 102 215 58 b 16 -164 184 -42 96 -98 b 0 -179 12 -168 0 -170 b 1 -183 0 -180 0 -183 b 26 -204 6 -193 12 -204 b 53 -206 37 -206 49 -206 z m 611 -177 b 376 -9 530 -118 452 -63 l 164 -143 b 104 -164 147 -154 130 -164 b 82 -161 96 -164 89 -164 b 230 -65 137 -125 183 -95 l 347 12 b 327 26 341 16 334 22 l 196 121 b 163 147 184 128 173 137 b 140 173 154 154 140 163 b 143 180 140 176 141 177 b 179 166 154 194 167 174 l 372 27 l 566 153 b 613 171 580 161 596 170 b 635 160 624 171 635 174 b 621 147 635 153 626 150 l 429 24 b 400 6 419 19 409 13 b 569 -117 456 -35 513 -75 b 611 -177 588 -130 608 -143 z',\n },\n noteheadXHalf: {\n x_min: 0,\n x_max: 421,\n y_min: -145.51844828189743,\n y_max: 151,\n ha: 296.51844828189746,\n o: 'm 490 -209 b 539 -207 505 -207 521 -207 b 606 -209 560 -207 583 -209 b 598 -196 602 -203 600 -199 l 406 -19 l 540 130 b 547 144 546 135 547 140 b 536 156 547 148 543 153 b 488 192 518 166 503 176 b 416 217 471 209 444 217 b 323 180 380 217 344 204 l 264 115 b 239 138 256 122 248 131 b 33 197 180 196 108 200 b 3 186 23 197 6 193 b 19 154 -1 174 10 163 b 171 12 69 107 120 59 b 19 -157 120 -45 69 -101 b 0 -177 14 -163 0 -166 b 1 -181 0 -179 0 -180 b 39 -203 9 -197 22 -203 l 186 -203 b 197 -202 190 -202 193 -200 l 213 -202 b 262 -180 228 -202 246 -199 l 314 -122 b 490 -209 363 -170 412 -216 z m 435 -148 b 291 -30 379 -112 337 -69 l 213 -118 b 190 -137 207 -125 202 -137 b 145 -111 173 -130 154 -127 b 160 -79 137 -98 151 -88 b 238 16 184 -48 212 -16 b 141 99 204 43 173 72 l 124 117 b 115 132 121 121 115 127 b 118 137 115 134 117 137 b 141 132 127 147 135 138 l 253 36 b 347 150 285 75 315 112 b 370 164 354 160 363 163 b 403 145 382 164 393 156 b 416 127 412 140 416 132 b 405 102 416 118 412 111 l 307 -10 b 413 -105 343 -42 379 -73 b 435 -148 425 -115 436 -125 z',\n },\n noteheadXBlack: {\n x_min: 0,\n x_max: 289,\n y_min: -156,\n y_max: 157,\n ha: 313,\n o: 'm 23 -225 b 69 -204 40 -223 56 -219 b 137 -131 92 -180 115 -157 l 209 -50 b 377 -197 264 -101 321 -148 b 403 -210 384 -203 393 -210 l 408 -210 b 416 -192 416 -207 416 -199 l 416 -186 b 403 -148 416 -171 413 -158 b 344 -81 384 -125 367 -101 b 252 -1 312 -55 282 -29 b 377 157 297 49 340 101 b 402 202 387 170 402 187 b 395 217 402 207 400 213 b 376 226 389 223 382 226 b 334 192 360 226 346 204 b 206 42 289 143 248 94 b 96 161 167 81 131 120 b 60 193 86 174 76 189 b 33 206 52 196 42 206 b 22 199 29 206 26 204 b 10 173 14 190 10 181 b 22 147 10 166 14 157 b 148 7 62 98 104 52 b 164 -7 154 1 158 -3 b 10 -189 111 -66 55 -122 b 0 -212 6 -197 0 -203 b 1 -217 0 -213 0 -216 b 23 -225 4 -226 14 -222 z',\n },\n noteheadCircleX: {\n x_min: 0,\n x_max: 344,\n y_min: -179,\n y_max: 175.12551922594866,\n ha: 354.12551922594866,\n o: 'm 99 -210 b 236 -258 137 -242 186 -258 b 418 -183 305 -258 374 -230 b 495 33 475 -120 495 -48 b 494 66 495 45 494 55 b 302 252 487 183 405 256 b 181 243 262 249 222 248 b 46 171 128 236 79 219 b 0 19 14 127 0 73 b 99 -210 0 -68 35 -156 z m 245 42 l 124 156 b 200 176 145 166 170 173 b 337 183 245 181 291 184 b 377 176 351 183 364 180 b 245 42 333 131 288 86 z m 392 -99 l 285 3 l 400 121 b 418 154 409 131 418 140 b 465 50 448 130 465 94 b 405 -112 462 -17 439 -73 z m 89 -120 b 48 0 56 -82 48 -42 b 89 112 48 35 59 76 b 109 101 96 111 102 108 l 210 7 l 187 -17 b 89 -120 151 -53 125 -82 z m 176 -183 b 127 -163 158 -179 141 -171 l 252 -32 l 372 -144 b 233 -189 334 -173 285 -189 b 176 -183 215 -189 196 -187 z',\n },\n noteheadTriangleUpWhole: {\n x_min: 0,\n x_max: 366,\n y_min: -145,\n y_max: 138,\n ha: 283,\n o: 'm 504 -209 b 527 -199 520 -209 527 -206 b 520 -180 527 -193 524 -187 b 459 -94 501 -151 480 -122 b 279 170 400 -6 341 82 b 242 199 266 190 253 199 b 206 167 230 199 219 189 b 10 -145 140 63 76 -42 b 0 -171 3 -156 0 -164 b 23 -200 0 -183 9 -192 b 55 -209 33 -206 45 -209 z m 202 -161 b 176 -137 183 -163 176 -156 b 187 -62 176 -111 179 -86 b 253 95 206 -10 228 42 b 337 -132 307 24 334 -49 b 311 -161 338 -153 334 -161 b 256 -160 294 -161 275 -160 b 202 -161 238 -160 220 -161 z',\n },\n noteheadTriangleUpHalf: {\n x_min: 0,\n x_max: 341.0833130378007,\n y_min: -159,\n y_max: 159,\n ha: 318,\n o: 'm 458 -226 b 478 -229 462 -223 469 -229 b 490 -222 482 -229 487 -228 b 477 -184 495 -207 484 -196 b 281 176 410 -65 346 56 b 238 225 269 194 261 213 b 225 229 232 226 228 228 b 209 215 217 229 213 225 b 4 -153 141 92 73 -30 b 0 -170 1 -158 0 -164 b 12 -189 0 -177 4 -183 b 66 -215 27 -202 43 -213 b 458 -226 194 -217 323 -222 z m 151 -167 b 298 75 204 -89 240 -1 b 301 82 300 76 301 79 l 357 -22 b 344 -43 353 -27 350 -37 b 285 -163 317 -79 312 -127 b 278 -170 282 -166 279 -167 z',\n },\n noteheadTriangleUpBlack: {\n x_min: 0,\n x_max: 346,\n y_min: -149,\n y_max: 149,\n ha: 298,\n o: 'm 481 -215 b 498 -209 487 -215 492 -215 b 482 -173 498 -194 488 -184 l 284 173 b 259 202 278 184 269 194 b 229 215 248 210 238 215 b 196 189 216 215 206 206 l 13 -150 b 3 -168 9 -156 6 -163 b 0 -180 1 -173 0 -177 b 12 -197 0 -187 4 -193 b 63 -213 29 -206 45 -213 b 481 -215 203 -213 343 -215 z',\n },\n noteheadDiamondWhole: {\n x_min: 0,\n x_max: 271,\n y_min: -132,\n y_max: 132,\n ha: 264,\n o: 'm 230 -177 b 256 -190 240 -186 249 -190 b 281 -173 265 -190 272 -184 b 382 -29 314 -124 347 -76 b 390 -10 387 -22 390 -14 b 376 12 390 -3 386 4 b 173 177 308 66 240 121 b 144 190 166 183 160 190 b 98 153 127 186 112 170 b 13 40 69 115 42 76 b 0 13 4 29 0 20 b 22 -19 0 3 7 -9 b 230 -177 92 -69 163 -122 z m 279 -128 b 261 -122 274 -134 266 -127 l 66 30 b 56 45 59 35 56 39 b 62 56 56 48 59 52 b 122 122 91 101 105 122 b 194 76 138 122 158 107 l 320 -26 b 336 -50 325 -32 336 -35 b 279 -128 318 -75 300 -102 z',\n },\n noteheadDiamondHalf: {\n x_min: 0,\n x_max: 295,\n y_min: -148,\n y_max: 148,\n ha: 296,\n o: 'm 228 -207 b 245 -213 235 -210 240 -213 b 264 -203 252 -213 258 -210 b 415 -46 314 -150 364 -98 b 425 -27 420 -40 425 -35 b 416 -10 425 -22 422 -16 b 217 200 350 60 284 131 b 194 213 212 207 204 213 b 170 196 181 213 177 203 b 14 33 118 143 68 86 b 0 7 4 23 0 16 b 17 -20 0 -1 6 -10 b 118 -114 52 -50 82 -85 b 228 -207 156 -144 184 -184 z m 209 -157 b 134 -69 177 -138 141 -115 b 130 -26 131 -55 130 -40 b 215 148 130 42 160 99 b 225 156 217 151 220 156 b 230 153 226 156 228 156 b 323 -26 276 104 321 55 b 298 -75 324 -42 315 -59 b 265 -109 287 -86 276 -99 b 209 -157 245 -125 228 -167 z',\n },\n noteheadDiamondBlack: {\n x_min: 0,\n x_max: 310,\n y_min: -146,\n y_max: 146,\n ha: 292,\n o: 'm 266 -210 b 289 -194 278 -209 284 -200 b 406 -76 330 -156 367 -115 b 446 -23 433 -49 446 -36 b 412 29 446 -10 435 3 b 405 36 409 30 408 33 b 252 196 354 89 304 143 b 225 210 243 204 235 210 b 204 202 219 210 212 209 b 10 24 141 141 75 82 b 0 9 4 19 0 14 b 9 -6 0 4 3 0 l 232 -192 b 266 -210 242 -200 256 -204 z',\n },\n noteheadSquareWhite: {\n x_min: 0,\n x_max: 350,\n y_min: -131,\n y_max: 131,\n ha: 262,\n o: 'm 468 -189 b 485 -187 474 -189 480 -189 b 500 -176 495 -187 500 -183 b 498 -168 500 -174 498 -171 b 497 -166 498 -167 497 -167 l 498 -164 b 504 -154 503 -163 504 -158 b 503 -138 504 -150 503 -144 l 503 -135 l 503 -94 b 492 66 500 -45 494 10 b 488 135 492 89 488 112 b 484 150 488 141 485 145 b 482 154 482 151 482 153 b 429 189 472 177 456 189 b 53 184 304 186 179 186 l 39 184 b 33 181 36 183 35 183 b 12 160 20 181 12 177 b 0 -109 9 71 4 -19 b 19 -137 0 -125 7 -134 b 23 -151 19 -141 20 -145 b 85 -187 37 -173 55 -187 b 468 -189 212 -187 340 -187 z m 246 -125 l 63 -125 b 66 -111 65 -122 66 -117 b 73 72 69 -50 71 10 l 73 130 b 88 128 78 128 82 128 b 148 130 108 130 128 130 b 271 128 190 130 230 128 l 271 130 l 420 130 b 428 20 425 92 425 56 l 436 -127 l 246 -127 z',\n },\n noteheadSquareBlack: {\n x_min: 0,\n x_max: 342,\n y_min: -129.98961937716263,\n y_max: 132.44444444444446,\n ha: 262.4340638216071,\n o: 'm 217 190 b 439 186 304 190 372 190 b 467 180 448 184 458 183 b 492 145 484 176 492 167 b 490 -124 490 56 490 -33 b 488 -141 490 -130 488 -135 b 456 -170 488 -163 478 -168 b 118 -183 344 -176 230 -181 b 29 -184 89 -183 60 -192 b 0 -148 4 -180 0 -168 b 1 29 1 -89 1 -30 l 1 156 b 36 190 3 187 4 190 b 217 190 102 192 168 190 z',\n },\n noteheadParenthesis: {\n x_min: -70.190112022022,\n x_max: 329,\n y_min: -196,\n y_max: 201,\n ha: 397,\n o: 'm 344 -279 b 382 -262 361 -288 370 -272 b 405 -233 390 -255 399 -245 b 474 9 455 -158 468 -73 b 416 228 474 78 448 174 b 364 282 403 249 387 271 b 344 289 359 285 350 288 b 331 279 338 289 333 287 b 325 248 328 269 325 258 b 338 225 325 238 328 229 b 412 138 379 207 396 174 b 445 1 433 92 445 45 b 346 -217 445 -81 410 -154 b 336 -252 340 -223 336 -238 b 344 -279 336 -265 338 -276 z m 19 -274 b 35 -282 24 -279 30 -281 b 49 -265 42 -282 46 -275 b 52 -243 50 -256 52 -249 b 36 -210 52 -230 49 -220 b -60 -59 -16 -173 -35 -114 b -73 9 -69 -39 -73 -16 b 33 223 -73 92 -24 189 b 50 265 43 229 50 249 b 33 288 50 278 46 289 b 4 272 23 288 14 275 b -9 261 0 269 -4 265 b -101 23 -58 193 -105 124 b -37 -206 -104 -52 -75 -130 b 19 -274 -23 -232 -6 -255 z',\n },\n noteheadParenthesisRight: {\n x_min: -30,\n x_max: 82,\n y_min: -199.08429092881173,\n y_max: 206,\n ha: 405.0842909288117,\n o: 'm -17 -282 b 24 -264 -6 -297 12 -272 b 60 -219 40 -253 52 -236 b 117 1 96 -150 112 -75 b 118 16 118 6 118 12 b 109 73 118 36 112 55 b 4 279 99 154 68 226 b -23 297 -4 287 -13 297 b -37 289 -27 297 -32 294 b -43 266 -42 285 -43 276 b -32 225 -43 251 -37 229 b 84 -7 48 170 84 82 b 32 -184 84 -69 65 -132 b -10 -222 22 -200 4 -209 b -24 -258 -20 -232 -24 -245 b -17 -282 -24 -266 -22 -276 z',\n },\n noteheadParenthesisLeft: {\n x_min: 0,\n x_max: 106,\n y_min: -197,\n y_max: 197,\n ha: 394,\n o: 'm 134 -284 b 138 -281 135 -284 137 -284 b 145 -268 144 -278 145 -274 l 144 -253 b 107 -180 138 -225 121 -204 b 42 13 71 -120 42 -56 b 49 73 42 32 43 52 b 137 210 62 128 95 171 b 153 255 147 219 153 239 b 145 278 153 265 151 274 b 130 284 140 281 135 284 b 98 259 117 284 108 268 b 0 37 35 203 1 131 b 118 -268 9 -69 53 -173 b 134 -284 121 -274 127 -284 z',\n },\n augmentationDot: {\n x_min: 0,\n x_max: 96,\n y_min: -57,\n y_max: 57,\n ha: 114,\n o: 'm 13 -82 b 16 -81 14 -82 14 -82 b 105 -73 46 -76 75 -76 b 131 -48 121 -72 131 -60 b 138 26 134 -24 138 0 b 137 48 138 33 138 40 b 108 82 134 71 125 82 b 95 81 104 82 99 82 b 33 71 75 78 53 75 b 4 46 20 68 6 62 b 0 -66 1 9 0 -29 b 13 -82 0 -73 1 -82 z',\n },\n tremolo1: {\n x_min: -158,\n x_max: 156.19381479578487,\n y_min: -88,\n y_max: 88,\n ha: 176,\n o: 'm -206 -127 b -194 -125 -203 -127 -199 -127 b 173 -36 -72 -94 50 -65 b 220 16 202 -29 215 -12 b 225 50 223 30 225 45 b 216 107 226 76 222 91 b 194 127 210 120 204 127 b 183 124 192 127 189 127 l -192 33 b -226 -9 -213 27 -222 14 b -228 -32 -226 -16 -228 -23 b -222 -108 -228 -58 -222 -82 b -206 -127 -222 -120 -217 -127 z',\n },\n flag8thUp: {\n x_min: 0,\n x_max: 261,\n y_min: -819,\n y_max: 0,\n ha: 819,\n o: 'm 265 -1171 b 351 -1035 301 -1130 336 -1087 b 376 -867 369 -979 376 -923 b 367 -755 376 -829 373 -792 b 233 -422 350 -632 311 -520 b 131 -291 199 -379 166 -334 b 65 -125 91 -239 66 -192 b 62 -75 65 -112 62 -91 b 42 0 62 -49 52 -24 l 35 0 b 0 -63 6 -13 0 -36 l 0 -144 b 96 -445 0 -255 29 -356 b 177 -547 124 -478 150 -514 b 308 -831 246 -629 298 -721 b 317 -890 310 -851 317 -871 b 311 -919 317 -900 315 -910 b 256 -1005 297 -950 282 -984 b 228 -1068 233 -1024 228 -1045 b 230 -1106 228 -1080 229 -1093 b 240 -1162 232 -1125 239 -1143 b 251 -1179 242 -1174 246 -1179 b 265 -1171 255 -1179 259 -1176 z',\n },\n flag8thDown: {\n x_min: 0,\n x_max: 261,\n y_min: 0,\n y_max: 819,\n ha: 819,\n o: 'm 265 1171 b 251 1179 259 1176 255 1179 b 240 1162 246 1179 242 1174 b 230 1106 239 1143 232 1125 b 228 1068 229 1093 228 1080 b 256 1005 228 1045 233 1024 b 311 919 282 984 297 950 b 317 890 315 910 317 900 b 308 831 317 871 310 851 b 177 547 298 721 246 629 b 96 445 150 514 124 478 b 0 144 29 356 0 255 l 0 63 b 35 0 0 36 6 13 l 42 0 b 62 75 52 24 62 49 b 59 117 62 91 59 104 b 131 291 60 183 91 239 b 233 422 166 334 199 379 b 367 755 311 520 350 632 b 376 867 373 792 376 829 b 351 1035 376 923 369 979 b 265 1171 336 1087 301 1130 z',\n },\n flag16thUp: {\n x_min: 0,\n x_max: 327.1591498636094,\n y_min: -819.3972596310256,\n y_max: 0,\n ha: 819.3972596310256,\n o: 'm 415 -1179 b 435 -1168 423 -1182 429 -1174 b 451 -1138 442 -1159 446 -1149 b 465 -1020 464 -1102 467 -1064 b 461 -962 464 -1004 464 -984 b 471 -821 467 -916 472 -870 b 465 -721 472 -791 467 -756 b 415 -520 459 -651 441 -585 b 200 -245 370 -408 284 -327 b 96 -114 160 -206 118 -168 b 75 -24 84 -85 85 -53 b 59 0 72 -16 72 0 b 53 -1 58 0 56 -1 b 27 -32 40 -6 27 -10 b 29 -68 27 -43 29 -55 b 10 -79 20 -69 13 -72 b 1 -109 6 -89 1 -99 b 0 -170 0 -130 0 -148 b 35 -410 0 -252 12 -333 b 258 -793 76 -557 156 -681 b 409 -1158 350 -896 410 -1014 b 415 -1179 409 -1165 405 -1175 z m 413 -816 b 331 -681 392 -769 364 -723 b 145 -420 266 -596 189 -521 b 86 -281 125 -374 102 -330 b 156 -370 105 -312 128 -343 b 318 -539 210 -425 269 -478 b 413 -816 383 -621 420 -713 z',\n },\n flag16thDown: {\n x_min: 0,\n x_max: 327.1591498636094,\n y_min: 0,\n y_max: 819,\n ha: 819,\n o: 'm 59 0 b 75 24 72 0 72 16 b 96 114 85 53 84 85 b 200 245 118 168 160 206 b 415 520 284 327 370 408 b 465 721 441 585 459 651 b 471 821 467 756 472 791 b 461 962 472 870 467 916 b 465 1020 464 984 464 1004 b 451 1138 467 1064 464 1102 b 435 1168 446 1149 442 1159 b 418 1179 431 1172 425 1179 l 415 1179 b 408 1169 409 1176 408 1174 b 409 1158 408 1165 409 1161 b 258 793 410 1014 350 896 b 35 410 156 681 76 557 b 0 170 12 333 0 252 l 0 88 b 29 7 0 71 6 23 b 59 0 33 4 58 0 z m 86 281 b 145 420 102 330 125 374 b 331 681 189 521 266 596 b 413 816 364 723 392 769 b 415 791 413 808 415 799 b 318 539 415 698 377 613 b 156 370 269 478 210 425 b 86 281 128 343 105 312 z',\n },\n flag32ndUp: {\n x_min: -0.19862981551275186,\n x_max: 268.0942440943661,\n y_min: -849.4710740978672,\n y_max: 149.0769891455102,\n ha: 998.5480632433774,\n o: 'm 323 -1223 b 351 -1198 337 -1227 344 -1210 b 359 -1184 354 -1194 356 -1188 b 386 -999 377 -1122 387 -1060 b 341 -783 386 -927 372 -855 b 330 -736 334 -769 330 -753 b 333 -708 330 -727 330 -717 b 344 -621 340 -678 344 -649 b 341 -579 344 -608 343 -593 b 328 -500 338 -553 328 -526 b 331 -475 328 -491 328 -484 b 347 -370 343 -438 348 -402 b 151 27 348 -212 288 -56 b 53 176 98 59 50 102 b 45 197 53 183 48 192 b 33 215 40 203 40 216 l 30 215 b 6 194 22 212 9 209 b 0 120 3 170 -1 145 b 0 -43 4 65 0 13 b 0 -98 0 -60 1 -79 b 4 -276 0 -157 6 -216 b 7 -456 4 -337 7 -397 b 66 -638 7 -523 22 -585 b 158 -724 94 -671 127 -697 b 318 -1011 246 -801 295 -899 b 321 -1044 321 -1021 321 -1032 b 312 -1152 321 -1080 312 -1116 b 317 -1192 312 -1165 314 -1179 b 323 -1223 320 -1202 311 -1220 z m 285 -376 b 121 -180 249 -289 173 -245 b 91 -105 104 -158 92 -135 b 288 -354 181 -144 288 -269 b 285 -376 288 -363 287 -370 z m 275 -657 b 111 -492 226 -589 163 -547 b 65 -376 78 -456 66 -418 b 71 -323 65 -360 68 -341 b 275 -657 164 -418 265 -504 z',\n },\n flag32ndDown: {\n x_min: -2.800802874905624,\n x_max: 268.09424409436605,\n y_min: -169.07698914551014,\n y_max: 829.4710740978672,\n ha: 998.5480632433773,\n o: 'm 323 1194 b 317 1164 311 1191 320 1174 b 312 1123 314 1151 312 1136 b 321 1015 312 1087 321 1051 b 318 982 321 1004 321 992 b 158 696 295 870 246 772 b 66 609 127 668 94 642 b 7 428 22 556 7 494 b 4 248 7 369 4 308 b -1 78 6 187 -10 137 b 0 14 0 59 0 32 l 0 -148 b 6 -223 0 -174 3 -199 b 30 -243 9 -238 22 -240 l 33 -243 b 45 -226 40 -245 40 -232 b 53 -204 48 -220 53 -212 b 151 -56 50 -131 98 -88 b 347 341 288 27 348 183 b 331 446 348 373 343 409 b 328 471 328 455 328 462 b 341 550 328 497 338 524 b 344 592 343 564 344 579 b 333 680 344 621 340 649 b 330 707 330 688 330 698 b 341 755 330 724 334 740 b 386 971 372 827 386 899 b 359 1155 387 1031 377 1093 b 351 1169 356 1159 354 1165 b 323 1194 344 1181 337 1198 z m 275 628 b 71 294 265 475 164 389 b 65 347 68 312 65 331 b 111 464 66 389 78 428 b 275 628 163 518 226 560 z m 285 347 b 288 325 287 341 288 334 b 91 76 288 240 181 115 b 121 151 92 107 104 130 b 285 347 173 216 249 261 z',\n },\n flag64thUp: {\n x_min: -4,\n x_max: 282,\n y_min: -823.5430338167067,\n y_max: 347,\n ha: 1170.5430338167066,\n o: 'm 350 -1185 b 380 -1162 364 -1189 374 -1175 b 406 -1022 399 -1119 406 -1071 b 359 -798 406 -945 384 -871 b 348 -756 353 -785 348 -772 b 350 -744 348 -753 350 -749 b 363 -621 356 -704 363 -664 b 360 -580 363 -608 363 -593 b 359 -560 359 -573 359 -567 b 373 -490 359 -536 366 -513 b 393 -346 386 -444 393 -395 b 387 -269 393 -320 390 -294 b 348 -127 382 -219 348 -173 b 351 -104 348 -120 348 -111 b 353 -65 351 -91 353 -78 b 341 37 353 -26 348 6 b 226 215 323 108 278 164 b 86 336 181 258 127 288 b 62 395 72 353 62 370 b 42 481 62 423 55 454 b 27 500 37 488 36 500 b 24 498 26 500 26 500 b -1 480 14 497 1 492 b -6 444 -4 467 -6 455 l -6 435 b -1 341 -1 403 -1 372 l -1 266 b 6 156 -1 230 0 193 b 13 35 12 117 13 75 l 13 -35 b 14 -85 13 -52 14 -68 b 29 -276 19 -150 33 -213 b 20 -448 24 -334 20 -392 b 24 -534 20 -477 22 -505 b 114 -708 30 -605 59 -664 b 197 -780 143 -732 171 -755 b 344 -1153 301 -884 341 -1011 b 343 -1172 344 -1159 343 -1166 b 350 -1185 343 -1176 344 -1182 z m 287 -88 b 62 193 186 -17 79 48 b 229 52 121 144 174 98 b 289 -33 256 29 274 -3 b 295 -56 294 -42 295 -49 b 287 -88 295 -66 292 -76 z m 298 -410 b 118 -235 238 -351 176 -295 b 76 -88 82 -197 78 -147 b 268 -252 137 -153 203 -202 b 330 -360 304 -279 330 -315 b 323 -402 330 -373 327 -387 b 311 -418 318 -413 315 -418 b 298 -410 307 -418 302 -415 z m 300 -691 b 117 -508 243 -616 168 -575 b 82 -408 94 -480 82 -448 b 84 -379 82 -397 82 -387 b 259 -553 135 -451 206 -492 b 301 -667 287 -583 301 -619 b 300 -691 301 -674 301 -683 z',\n },\n flag64thDown: {\n x_min: -5,\n x_max: 281,\n y_min: -375,\n y_max: 795.5430338167066,\n ha: 1170.5430338167066,\n o: 'm 348 1145 b 341 1132 343 1142 341 1136 b 343 1113 341 1126 343 1119 b 196 740 340 971 300 844 b 112 668 170 714 141 691 b 23 494 58 624 29 564 b 19 408 20 465 19 436 b 27 236 19 351 23 294 b 13 45 32 173 17 109 b 12 -6 13 27 12 12 l 12 -75 b 4 -196 12 -115 10 -157 b -3 -307 -1 -233 -3 -271 l -3 -382 b -7 -475 -3 -412 -3 -444 l -7 -484 b -3 -520 -7 -495 -6 -507 b 23 -539 0 -533 13 -537 b 26 -540 24 -540 24 -540 b 40 -521 35 -540 36 -528 b 60 -435 53 -494 60 -464 b 85 -376 60 -410 71 -393 b 225 -255 125 -328 180 -298 b 340 -78 276 -204 321 -148 b 351 24 347 -46 351 -14 b 350 63 351 37 350 50 b 347 86 347 71 347 79 b 386 229 347 132 380 179 b 392 305 389 253 392 279 b 372 449 392 354 384 403 b 357 520 364 472 357 495 b 359 540 357 527 357 533 b 361 580 361 553 361 567 b 348 704 361 624 354 664 b 347 716 348 708 347 713 b 357 757 347 732 351 744 b 405 982 383 831 405 904 b 379 1122 405 1031 397 1079 b 348 1145 373 1135 363 1149 z m 298 651 b 300 626 300 642 300 634 b 258 513 300 579 285 543 b 82 338 204 452 134 410 b 81 367 81 347 81 357 b 115 468 81 408 92 439 b 298 651 167 534 242 576 z m 297 370 b 310 377 301 374 305 377 b 321 361 314 377 317 373 b 328 320 325 347 328 333 b 266 212 328 275 302 239 b 75 48 202 161 135 112 b 117 194 76 107 81 157 b 297 370 174 255 236 311 z m 285 48 b 294 16 291 36 294 26 b 288 -7 294 9 292 1 b 228 -92 272 -37 255 -69 b 60 -233 173 -138 120 -184 b 285 48 78 -88 184 -23 z',\n },\n flag128thUp: {\n x_min: 0,\n x_max: 252,\n y_min: -804,\n y_max: 530,\n ha: 1334,\n o: 'm 298 -1158 b 328 -1126 312 -1158 320 -1139 b 330 -1116 330 -1123 330 -1119 b 347 -996 343 -1076 347 -1037 b 328 -837 347 -943 338 -890 b 320 -778 324 -816 320 -798 b 330 -733 320 -763 323 -749 b 340 -665 338 -714 337 -688 b 341 -645 340 -660 341 -652 b 333 -534 341 -609 333 -572 b 343 -471 333 -513 334 -492 b 361 -366 356 -436 361 -402 b 331 -202 361 -311 348 -256 b 328 -187 330 -197 328 -193 b 331 -179 328 -184 328 -181 b 363 -55 353 -137 363 -96 b 337 79 363 -12 351 33 b 327 114 333 92 327 104 b 344 144 327 124 331 132 b 359 174 353 150 357 163 b 361 228 360 193 361 210 b 243 517 361 337 325 435 b 147 596 213 546 179 569 b 75 708 111 626 75 655 b 62 744 75 723 68 733 b 50 763 58 752 58 763 b 46 762 49 763 48 762 b 17 742 36 757 22 757 b 0 697 14 726 0 711 b 1 595 0 662 3 631 b 0 469 0 552 0 511 b 1 429 0 456 0 442 b 22 289 6 382 22 337 b 24 128 22 238 24 184 b 22 66 24 108 23 86 b 19 -19 20 37 19 10 b 20 -132 19 -56 20 -95 b 13 -276 20 -180 19 -229 b 9 -359 10 -304 9 -330 b 12 -487 9 -402 12 -445 b 56 -582 12 -526 29 -554 b 197 -742 107 -632 160 -681 b 288 -1100 265 -851 276 -976 b 288 -1122 288 -1107 287 -1115 b 287 -1145 289 -1129 287 -1138 b 298 -1158 287 -1153 288 -1158 z m 304 150 b 75 475 229 256 112 334 b 304 150 233 357 305 287 z m 271 -73 b 127 72 233 -14 179 26 b 81 167 96 98 81 127 b 84 194 81 176 82 184 b 271 -73 148 102 242 39 z m 279 -396 b 132 -223 233 -330 180 -279 b 81 -112 104 -192 81 -156 b 82 -91 81 -105 81 -98 b 279 -396 167 -125 269 -281 z m 249 -609 b 69 -357 197 -520 88 -471 b 249 -609 131 -441 229 -498 z',\n },\n flag128thDown: {\n x_min: -0.8888888888888888,\n x_max: 252,\n y_min: -580,\n y_max: 754,\n ha: 1334,\n o: 'm 298 1086 b 287 1073 288 1086 287 1081 b 288 1050 287 1066 289 1057 b 288 1028 287 1043 288 1035 b 197 670 276 904 265 779 b 56 510 160 609 107 560 b 12 415 29 482 12 454 b 9 287 12 373 9 330 b 13 204 9 258 10 232 b 20 60 19 157 20 108 b 19 -53 20 23 19 -16 b 22 -138 19 -82 20 -109 b 24 -200 23 -158 24 -180 b 22 -361 24 -256 22 -310 b 1 -501 22 -409 6 -454 b 0 -541 0 -514 0 -528 b 0 -667 0 -583 -3 -624 b 0 -809 0 -675 -3 -791 b 46 -834 4 -825 36 -829 b 50 -835 48 -834 49 -835 b 62 -816 58 -835 58 -824 b 75 -780 68 -805 75 -795 b 147 -668 75 -727 111 -698 b 243 -589 179 -641 213 -618 b 361 -300 325 -507 361 -409 b 359 -246 361 -282 360 -265 b 344 -216 357 -235 353 -222 b 327 -186 331 -204 327 -196 b 337 -151 327 -176 333 -164 b 363 -17 351 -105 363 -60 b 331 107 363 24 353 65 b 328 115 328 109 328 112 b 331 130 328 121 330 125 b 361 294 348 184 361 239 b 343 399 361 330 356 364 b 333 462 334 420 333 441 b 341 573 333 500 341 537 b 340 593 341 580 340 588 b 330 661 337 616 338 642 b 320 706 323 677 320 691 b 328 765 320 726 324 744 b 347 924 338 818 347 871 b 330 1044 347 965 343 1004 b 328 1054 330 1047 330 1051 b 298 1086 320 1067 312 1086 z m 249 537 b 69 285 229 426 131 369 b 249 537 88 399 197 448 z m 279 324 b 82 19 269 209 167 53 b 81 40 81 26 81 33 b 132 151 81 84 104 120 b 279 324 180 207 233 258 z m 271 1 b 84 -266 242 -111 148 -174 b 81 -239 82 -256 81 -248 b 127 -144 81 -199 96 -170 b 271 1 179 -98 233 -58 z m 304 -222 b 75 -547 305 -359 233 -429 b 304 -222 112 -406 229 -328 z',\n },\n accidentalFlat: {\n x_min: 1,\n x_max: 209,\n y_min: -208,\n y_max: 472,\n ha: 680,\n o: 'm 29 -300 b 46 -289 33 -300 39 -297 b 107 -243 65 -274 86 -258 b 301 127 233 -153 301 -30 b 298 186 301 147 301 166 b 190 297 291 256 251 297 b 147 289 177 297 163 294 b 86 265 127 284 107 274 l 85 264 l 85 301 b 91 465 85 356 88 410 b 94 559 91 497 94 527 b 84 651 94 589 91 621 b 66 680 81 661 81 680 l 65 680 b 37 645 49 678 37 665 b 33 523 36 605 32 563 l 33 478 b 26 223 33 393 29 308 b 1 -141 22 101 1 -19 b 17 -287 1 -189 4 -239 b 29 -300 20 -295 23 -300 z m 68 -105 b 76 12 71 -68 72 -29 b 81 107 79 43 81 75 l 86 109 b 171 135 114 121 141 135 b 204 128 181 135 193 132 b 238 92 228 120 239 108 b 230 63 238 84 236 75 b 68 -105 193 -10 132 -59 z',\n },\n accidentalNatural: {\n x_min: 0,\n x_max: 213.5,\n y_min: -456,\n y_max: 462,\n ha: 918,\n o: 'm 255 -657 b 281 -624 271 -657 275 -636 b 285 -599 282 -615 285 -608 b 292 -300 288 -500 289 -400 b 289 -161 292 -253 289 -207 b 300 128 292 -65 297 32 b 304 168 300 128 302 150 l 304 173 l 305 190 l 305 199 l 307 225 b 304 259 307 229 310 246 b 272 298 297 274 302 305 b 63 266 204 279 134 272 b 72 514 68 348 72 432 b 71 595 72 541 72 567 b 56 665 71 619 66 642 b 17 579 9 651 17 608 b 3 144 19 433 7 289 b 0 -7 1 94 0 43 b 3 -134 0 -50 1 -92 b 7 -219 3 -163 7 -192 b 35 -251 7 -243 17 -251 b 49 -249 39 -251 43 -251 l 223 -223 l 230 -222 l 230 -359 b 223 -516 230 -410 223 -464 b 236 -619 223 -550 226 -585 b 255 -657 240 -634 236 -657 z m 58 -63 b 55 81 56 -14 53 33 l 56 99 b 85 99 65 99 75 98 b 232 108 134 104 183 107 l 240 109 l 236 66 b 232 -48 235 29 232 -10 b 58 -81 174 -63 115 -73 z',\n },\n accidentalSharp: {\n x_min: -22,\n x_max: 390,\n y_min: -384,\n y_max: 383,\n ha: 767,\n o: 'm 202 -553 b 219 -526 213 -552 216 -536 b 226 -471 225 -507 226 -488 b 225 -425 226 -455 225 -441 b 226 -392 225 -415 225 -402 b 233 -305 229 -363 232 -334 l 297 -292 b 331 -469 300 -353 311 -412 b 347 -485 333 -477 338 -485 b 363 -469 356 -487 359 -477 b 374 -418 373 -454 374 -435 b 376 -382 376 -405 376 -393 b 372 -276 376 -347 373 -311 l 455 -259 b 550 -156 534 -243 544 -232 b 550 -109 550 -137 552 -124 b 526 -78 549 -91 541 -78 l 523 -78 b 507 -79 517 -78 513 -78 b 403 -101 474 -88 438 -95 l 379 -105 b 382 -42 380 -85 380 -63 b 384 96 383 4 384 50 b 503 131 425 107 464 118 b 549 173 524 138 543 150 b 562 249 554 199 562 223 b 554 294 562 264 560 279 b 536 315 549 308 544 315 l 533 315 b 517 312 528 315 523 315 b 382 266 472 294 428 279 l 377 344 b 359 531 374 406 372 469 b 348 552 356 539 357 552 l 347 552 l 343 552 b 315 528 331 549 317 544 l 315 501 b 320 249 315 416 318 333 l 243 232 b 239 361 243 275 242 318 b 226 425 238 383 238 403 b 199 359 194 409 199 382 b 193 223 196 312 194 268 b 72 202 153 215 112 209 b 4 118 13 192 4 183 b 10 66 0 102 12 84 b 33 29 7 39 14 30 b 48 32 37 29 42 30 b 187 55 95 39 141 46 l 183 -75 b 176 -145 181 -99 179 -122 b 16 -179 122 -156 69 -166 b -32 -232 -14 -186 -32 -197 b -17 -331 -32 -266 -19 -298 b -1 -356 -17 -347 -13 -354 b 12 -353 1 -356 6 -354 b 167 -320 63 -341 115 -331 b 166 -377 166 -338 166 -357 b 189 -526 166 -428 171 -477 b 202 -553 192 -536 189 -553 z m 240 -132 b 243 -37 242 -101 242 -69 b 245 65 245 -3 245 30 b 315 79 269 69 292 73 b 301 -120 308 13 305 -53 z',\n },\n accidentalDoubleSharp: {\n x_min: 0,\n x_max: 287,\n y_min: -159,\n y_max: 159,\n ha: 318,\n o: 'm 84 -229 b 107 -216 91 -229 98 -225 b 200 -125 138 -186 167 -154 b 232 -95 212 -115 222 -105 b 347 -189 271 -125 310 -157 b 370 -200 356 -196 363 -200 b 396 -179 380 -200 389 -192 b 412 -102 410 -154 406 -125 b 377 -27 410 -69 400 -46 l 325 14 b 402 91 350 42 374 68 b 413 127 410 96 413 107 b 382 200 409 148 397 176 b 350 229 370 220 360 229 b 314 210 340 229 328 223 b 274 174 300 199 285 187 b 212 104 252 151 232 128 b 92 187 173 132 132 161 b 78 193 86 192 82 193 b 68 190 75 193 72 193 b 48 179 62 186 53 187 b 40 137 43 168 40 154 b 81 16 40 92 56 32 b 107 -3 89 10 98 4 b 14 -94 76 -32 45 -62 b 0 -124 6 -102 0 -114 b 12 -154 0 -134 3 -144 b 62 -215 26 -176 48 -193 b 84 -229 69 -225 76 -229 z',\n },\n accidentalDoubleFlat: {\n x_min: 0,\n x_max: 359,\n y_min: -220,\n y_max: 446,\n ha: 666,\n o: 'm 43 -317 b 72 -301 55 -317 63 -310 b 160 -186 108 -268 134 -226 b 236 -60 186 -145 212 -102 b 233 -131 235 -85 233 -108 b 239 -220 233 -161 235 -190 b 259 -246 240 -233 239 -240 b 301 -228 284 -252 291 -238 b 465 -7 369 -163 416 -85 b 517 173 500 48 517 108 b 451 307 517 229 505 284 b 409 315 436 312 422 315 b 331 287 382 315 356 305 b 311 274 324 282 320 274 l 310 274 l 310 566 b 305 621 310 585 312 603 b 294 642 301 628 305 642 l 292 642 b 264 622 282 641 266 636 b 253 575 259 606 256 590 b 246 418 248 523 246 471 b 248 243 246 360 248 302 l 248 187 b 164 238 220 225 193 238 b 85 213 140 238 112 226 b 84 229 85 220 84 225 b 86 315 85 258 86 287 b 81 528 86 386 82 458 b 71 582 81 547 78 566 b 56 603 66 590 68 603 l 53 603 b 23 580 40 600 26 598 b 19 537 20 566 19 552 b 20 514 19 530 19 521 b 26 390 24 472 26 432 b 14 66 26 282 16 174 b 0 -168 13 -12 0 -91 b 12 -279 0 -206 3 -242 b 30 -314 16 -294 14 -308 b 43 -317 35 -317 39 -317 z m 301 -72 b 302 7 302 -45 302 -19 l 302 86 b 351 158 304 121 321 145 b 383 166 361 163 373 166 b 435 143 402 166 419 157 b 445 127 441 138 445 132 b 441 114 445 122 444 118 b 301 -72 397 49 354 -14 z m 75 -147 b 73 30 75 -86 75 -29 b 118 82 73 62 92 76 b 132 84 124 84 128 84 b 190 52 156 84 174 69 b 193 40 192 49 193 45 b 192 33 193 37 193 35 b 75 -147 157 -30 125 -95 z',\n },\n accidentalParensLeft: {\n x_min: 0,\n x_max: 130.18934911242604,\n y_min: -270,\n y_max: 267.6082500723851,\n ha: 537.6082500723851,\n o: 'm 107 -389 b 127 -374 114 -389 120 -384 b 141 -347 132 -367 137 -357 b 151 -294 148 -330 151 -311 b 122 -207 151 -265 141 -236 b 63 -65 94 -164 72 -117 b 59 -10 60 -46 59 -27 b 145 223 59 78 94 153 b 187 354 176 262 189 305 b 177 384 187 364 190 380 b 143 373 166 387 153 383 b 124 354 137 367 130 361 b 0 -35 33 240 0 108 l 0 -92 b 85 -372 4 -193 27 -287 b 107 -389 92 -383 99 -389 z',\n },\n accidentalParensRight: {\n x_min: -0.4444444444444445,\n x_max: 139,\n y_min: -275,\n y_max: 277,\n ha: 552,\n o: 'm 58 -396 b 96 -354 75 -396 85 -370 b 200 13 168 -238 200 -111 b 153 268 200 109 184 190 b 49 392 131 320 101 364 b 26 399 40 397 33 399 b 0 366 10 399 0 387 b 0 318 -1 350 0 334 l 0 291 b 27 238 -3 266 7 253 b 143 9 105 180 143 98 b 141 -20 143 -1 143 -10 b 63 -225 135 -92 108 -164 b 36 -307 45 -251 36 -278 b 40 -344 36 -320 37 -331 b 42 -356 42 -347 42 -351 b 58 -396 42 -374 37 -396 z',\n },\n accidentalQuarterToneFlatStein: {\n x_min: 0,\n x_max: 208,\n y_min: -240,\n y_max: 440,\n ha: 680,\n o: 'm 272 -346 b 284 -333 278 -346 281 -341 b 300 -187 297 -285 300 -235 b 275 177 300 -65 279 55 b 268 432 272 262 268 347 l 268 477 b 264 599 269 517 265 559 b 236 634 264 619 252 632 l 235 634 b 217 605 220 634 220 615 b 207 513 210 575 207 543 b 210 419 207 481 210 451 b 216 255 213 364 216 310 l 216 217 l 215 219 b 154 243 194 228 174 238 b 111 251 138 248 124 251 b 3 140 50 251 10 210 b 0 81 0 120 0 101 b 194 -289 0 -76 68 -199 b 255 -336 215 -304 236 -320 b 272 -346 262 -343 268 -346 z m 233 -151 b 71 17 168 -105 108 -56 b 63 46 65 29 63 37 b 96 82 62 62 73 73 b 130 89 108 86 120 89 b 215 63 160 89 187 75 l 220 60 b 225 -35 220 29 222 -3 b 233 -151 229 -75 230 -114 z',\n },\n accidentalThreeQuarterTonesFlatZimmermann: {\n x_min: 0,\n x_max: 422,\n y_min: -240,\n y_max: 440,\n ha: 680,\n o: 'm 272 -346 b 284 -333 278 -346 281 -341 b 300 -187 297 -285 300 -235 b 275 177 300 -65 279 55 b 268 432 272 262 268 347 l 268 477 b 264 599 269 517 265 559 b 236 634 264 619 252 632 l 235 634 b 217 605 220 634 220 615 b 207 513 210 575 207 543 b 210 419 207 481 210 451 b 216 255 213 364 216 310 l 216 217 l 215 219 b 154 243 194 228 174 238 b 111 251 138 248 124 251 b 3 140 50 251 10 210 b 0 81 0 120 0 101 b 194 -289 0 -76 68 -199 b 255 -336 215 -304 236 -320 b 272 -346 262 -343 268 -346 z m 336 -346 b 353 -336 340 -346 346 -343 b 413 -289 372 -320 393 -304 b 608 81 540 -199 608 -76 b 605 140 608 101 608 120 b 497 251 598 210 557 251 b 454 243 484 251 469 248 b 393 219 433 238 413 228 l 392 217 l 392 255 b 397 419 392 310 395 364 b 400 513 397 451 400 481 b 390 605 400 543 397 575 b 373 634 387 615 387 634 l 372 634 b 344 599 356 632 344 619 b 340 477 343 559 338 517 l 340 432 b 333 177 340 347 336 262 b 308 -187 328 55 308 -65 b 324 -333 308 -235 311 -285 b 336 -346 327 -341 330 -346 z m 233 -151 b 71 17 168 -105 108 -56 b 63 46 65 29 63 37 b 96 82 62 62 73 73 b 130 89 108 86 120 89 b 215 63 160 89 187 75 l 220 60 b 225 -35 220 29 222 -3 b 233 -151 229 -75 230 -114 z m 374 -151 b 383 -35 377 -114 379 -75 b 387 60 386 -3 387 29 l 393 63 b 478 89 420 75 448 89 b 511 82 488 89 500 86 b 544 46 534 73 546 62 b 537 17 544 37 543 29 b 374 -151 500 -56 439 -105 z',\n },\n accidentalQuarterToneSharpStein: {\n x_min: 0,\n x_max: 300,\n y_min: -338,\n y_max: 351,\n ha: 689,\n o: 'm 194 -487 b 225 -432 215 -469 223 -452 b 238 -232 229 -366 236 -298 b 377 -199 285 -220 331 -209 b 418 -164 397 -193 410 -181 b 432 -88 428 -138 432 -114 b 412 -42 432 -55 428 -42 b 389 -46 406 -42 399 -43 l 235 -85 b 233 -20 235 -63 233 -42 b 233 105 232 22 233 63 b 312 121 259 111 285 117 b 406 226 390 134 400 145 b 373 284 409 268 402 284 b 344 281 364 284 356 282 b 232 258 307 276 269 266 b 230 308 232 275 232 291 b 210 505 229 374 232 441 b 183 471 189 501 184 490 b 180 406 181 449 180 428 b 184 246 180 353 184 300 b 48 222 140 236 94 228 b 0 168 6 216 0 209 b 7 86 1 141 4 114 b 27 66 9 73 13 66 l 35 66 b 184 94 85 66 135 84 b 187 -1 184 62 186 30 b 190 -96 189 -33 190 -65 l 112 -114 b 35 -213 27 -132 35 -132 b 33 -253 35 -226 35 -240 b 49 -276 33 -269 37 -276 b 62 -275 52 -276 56 -276 l 186 -245 l 186 -256 b 179 -387 180 -300 177 -343 b 194 -487 180 -419 179 -454 z',\n },\n accidentalThreeQuarterTonesSharpStein: {\n x_min: -23,\n x_max: 388,\n y_min: -373,\n y_max: 445,\n ha: 818,\n o: 'm 114 -537 b 138 -475 137 -518 138 -495 b 147 -292 138 -413 144 -353 b 212 -278 168 -287 190 -282 b 243 -444 215 -333 225 -389 b 261 -467 248 -454 251 -465 b 281 -446 272 -469 276 -455 b 292 -347 292 -416 288 -384 b 288 -262 289 -320 288 -291 l 374 -245 b 376 -311 374 -266 374 -288 b 390 -456 379 -357 379 -405 b 416 -396 412 -436 415 -418 b 423 -287 420 -360 423 -323 b 422 -235 423 -269 423 -252 b 451 -229 432 -233 441 -232 b 547 -98 524 -215 547 -199 l 547 -89 b 521 -49 546 -59 540 -49 b 497 -52 516 -49 507 -49 b 418 -68 469 -56 444 -63 b 423 52 419 -29 422 12 b 426 140 425 81 425 109 b 495 160 449 145 472 153 b 552 219 526 170 546 189 b 559 279 557 240 553 262 b 530 341 559 324 552 341 b 490 331 520 341 507 338 b 432 311 471 324 452 318 b 449 552 436 392 442 471 b 452 588 451 563 452 575 b 446 622 452 599 451 611 b 436 641 444 629 448 641 b 418 628 428 641 420 636 b 409 602 413 621 410 611 b 386 297 396 501 390 399 b 297 274 356 288 327 281 b 291 403 295 317 294 360 b 274 550 288 452 284 501 b 259 569 271 564 265 569 b 240 559 253 569 248 563 b 230 537 232 554 230 546 l 230 488 b 233 369 230 448 232 409 b 236 261 236 333 238 297 b 156 245 210 255 183 251 b 154 396 154 295 154 346 b 150 416 154 403 153 410 b 140 438 145 423 150 438 l 138 438 b 118 413 128 436 118 428 b 112 354 118 393 114 374 b 109 238 109 315 109 276 b 49 226 89 233 69 230 b 3 163 16 222 3 202 b 7 91 3 138 9 114 b 29 62 7 69 13 62 b 39 63 32 62 35 63 b 104 73 60 66 82 71 b 101 -10 104 46 102 17 l 92 -132 l 10 -150 b -33 -204 -19 -157 -33 -170 b -19 -310 -32 -240 -19 -274 b -6 -324 -19 -321 -13 -324 b 6 -323 -1 -324 1 -324 b 82 -307 32 -317 58 -311 b 81 -376 82 -330 81 -353 b 114 -537 81 -431 94 -484 z m 294 -92 b 297 -37 295 -73 295 -56 b 300 49 300 -9 300 20 l 300 108 b 379 127 325 114 353 120 b 374 -76 376 59 374 -9 b 294 -92 347 -82 320 -86 z m 154 -120 b 157 20 154 -73 156 -26 b 158 82 158 40 158 62 b 230 95 183 86 206 89 b 225 0 229 63 226 32 b 217 -107 223 -35 220 -71 z',\n },\n accidentalBuyukMucennebFlat: {\n x_min: 1.8692317181955784,\n x_max: 287,\n y_min: -248,\n y_max: 432.4720949426819,\n ha: 680.4720949426819,\n o: 'm 410 128 b 302 239 403 199 363 239 b 259 232 289 239 275 236 b 199 207 239 226 219 216 l 197 206 l 197 243 l 197 251 b 347 317 248 272 298 295 b 376 347 360 324 372 334 b 389 435 387 376 393 405 b 348 454 384 462 377 465 b 202 387 300 432 251 409 b 203 408 203 395 203 402 l 203 431 b 347 490 252 451 300 469 b 376 517 360 495 372 505 b 389 599 387 546 393 572 b 348 616 384 625 377 628 l 203 556 b 196 593 202 569 199 582 b 179 622 193 603 193 622 l 177 622 b 150 588 161 621 150 608 b 147 533 150 570 148 552 b 29 488 108 517 69 503 b 3 455 12 482 3 472 b 12 353 1 422 9 389 b 145 408 56 372 101 389 b 145 363 145 392 145 377 l 29 315 b 3 281 12 310 3 298 b 12 170 1 245 9 209 l 141 226 b 138 166 140 206 138 186 b 114 -199 134 43 115 -76 b 130 -344 114 -246 117 -297 b 141 -357 132 -353 135 -357 b 158 -347 145 -357 151 -354 b 219 -301 177 -331 199 -315 b 413 69 346 -210 413 -88 b 410 128 413 89 413 108 z m 350 35 b 343 6 350 26 348 17 b 180 -163 308 -69 245 -117 b 189 -46 183 -125 184 -86 b 193 49 192 -14 193 17 l 199 52 b 284 78 226 63 253 78 b 317 71 294 78 305 75 b 350 35 340 62 351 50 z',\n },\n accidentalBakiyeFlat: {\n x_min: 1.8692317181955784,\n x_max: 287,\n y_min: -236,\n y_max: 444,\n ha: 680,\n o: 'm 141 -340 b 158 -330 145 -340 151 -337 b 219 -284 177 -314 199 -298 b 413 86 346 -193 413 -71 b 410 145 413 107 413 125 b 302 256 403 216 363 256 b 259 249 289 256 275 253 b 199 225 239 243 219 233 l 197 223 l 197 261 b 199 334 197 285 199 310 b 347 406 249 357 298 382 b 376 439 360 413 372 425 b 390 516 384 465 390 490 b 389 537 390 523 390 530 b 372 564 384 556 382 564 b 348 557 367 564 359 562 b 204 487 300 537 253 510 b 206 518 206 497 206 507 b 196 611 206 549 203 580 b 179 639 193 621 193 639 l 177 639 b 150 605 161 638 150 625 b 145 482 148 564 144 523 l 145 458 b 29 405 107 439 68 420 b 3 366 12 397 3 386 b 12 243 1 325 9 287 b 143 307 56 265 99 285 l 138 183 b 114 -181 134 60 114 -59 b 130 -327 114 -229 117 -279 b 141 -340 132 -336 135 -340 z m 180 -145 b 189 -29 183 -108 184 -69 b 193 66 192 3 193 35 l 199 69 b 284 95 226 81 253 95 b 317 88 294 95 305 92 b 350 52 340 79 351 68 b 343 23 350 43 348 35 b 180 -145 305 -50 245 -99 z',\n },\n accidentalKomaSharp: {\n x_min: 0,\n x_max: 300,\n y_min: -338,\n y_max: 351,\n ha: 689,\n o: 'm 194 -487 b 225 -432 215 -469 223 -452 b 238 -232 229 -366 236 -298 b 377 -199 285 -220 331 -209 b 418 -164 397 -193 410 -181 b 432 -88 428 -138 432 -114 b 412 -42 432 -55 428 -42 b 389 -46 406 -42 399 -43 l 235 -85 b 233 -20 235 -63 233 -42 b 233 105 232 22 233 63 b 312 121 259 111 285 117 b 406 226 390 134 400 145 b 373 284 409 268 402 284 b 344 281 364 284 356 282 b 232 258 307 276 269 266 b 230 308 232 275 232 291 b 210 505 229 374 232 441 b 183 471 189 501 184 490 b 180 406 181 449 180 428 b 184 246 180 353 184 300 b 48 222 140 236 94 228 b 0 168 6 216 0 209 b 7 86 1 141 4 114 b 27 66 9 73 13 66 l 35 66 b 184 94 85 66 135 84 b 187 -1 184 62 186 30 b 190 -96 189 -33 190 -65 l 112 -114 b 35 -213 27 -132 35 -132 b 33 -253 35 -226 35 -240 b 49 -276 33 -269 37 -276 b 62 -275 52 -276 56 -276 l 186 -245 l 186 -256 b 179 -387 180 -300 177 -343 b 194 -487 180 -419 179 -454 z',\n },\n accidentalKucukMucennebSharp: {\n x_min: -0.15206251809627475,\n x_max: 359,\n y_min: -420,\n y_max: 343,\n ha: 763,\n o: 'm 236 -605 b 262 -543 256 -583 261 -564 b 269 -423 268 -503 269 -464 b 266 -340 269 -396 268 -367 l 361 -318 b 405 -276 384 -312 399 -298 b 413 -189 412 -248 416 -219 b 395 -164 412 -171 409 -164 b 382 -166 392 -164 387 -164 b 264 -193 343 -176 304 -184 b 269 -102 265 -163 268 -132 b 454 -62 331 -89 392 -78 b 501 -23 477 -58 494 -45 b 517 62 511 6 517 33 b 487 112 517 95 513 112 b 471 111 482 112 477 112 b 274 66 406 95 340 81 b 276 138 275 91 276 114 b 350 154 301 144 325 148 b 402 203 377 160 396 176 b 412 284 408 230 412 258 b 392 311 412 302 406 311 b 372 308 386 311 379 310 b 287 291 343 301 314 297 l 295 405 b 298 441 297 416 298 428 b 292 475 298 452 297 464 b 282 494 289 482 294 494 b 264 481 274 494 266 490 b 255 455 259 474 256 464 b 239 282 248 397 243 340 b 148 268 209 278 179 274 b 62 164 62 252 62 253 l 62 132 b 79 108 60 117 65 108 l 86 108 l 230 130 b 229 92 230 118 229 105 b 228 56 228 79 228 68 b 66 20 173 43 120 32 b 0 -59 6 7 3 1 l 0 -138 b 14 -160 -1 -156 4 -160 b 27 -158 19 -160 23 -160 b 222 -112 92 -141 157 -127 b 220 -203 220 -143 220 -173 b 147 -217 196 -207 171 -213 b 89 -288 92 -228 89 -229 b 95 -347 85 -305 96 -325 b 112 -374 92 -366 98 -374 b 125 -373 117 -374 121 -374 l 220 -351 b 222 -458 220 -386 220 -422 b 236 -605 223 -504 225 -552 z',\n },\n accidentalKoron: {\n x_min: 0,\n x_max: 303,\n y_min: -462.4598053473055,\n y_max: 180,\n ha: 642.4598053473055,\n o: 'm 59 -665 b 72 -649 69 -662 72 -657 b 69 -626 72 -642 69 -634 b 69 -622 69 -625 69 -624 l 69 -600 b 55 -156 60 -456 68 -311 b 86 -170 66 -166 76 -170 b 112 -163 95 -170 104 -166 b 390 -35 204 -120 298 -78 b 436 -1 409 -27 436 -27 b 396 46 436 22 413 33 l 382 55 b 46 243 271 121 157 179 b 12 259 29 253 17 259 b 0 219 1 259 0 248 b 3 -372 0 22 3 -176 b 6 -616 3 -454 6 -536 b 59 -665 6 -638 40 -671 z m 55 199 b 363 24 156 141 258 84 b 55 -118 259 -24 160 -69 z',\n },\n accidentalSori: {\n x_min: 0,\n x_max: 434,\n y_min: -295,\n y_max: 325,\n ha: 620,\n o: 'm 194 -425 b 196 -409 194 -418 196 -413 b 194 -194 196 -337 196 -266 b 364 -127 251 -171 308 -150 b 361 -321 363 -192 364 -256 b 410 -387 360 -357 373 -377 b 413 -373 412 -382 413 -377 b 418 -114 418 -287 418 -200 l 418 -105 b 595 -35 477 -82 536 -59 b 625 0 612 -27 625 -22 b 593 48 624 23 618 39 l 419 117 b 423 370 419 202 423 285 b 426 403 423 382 426 393 b 418 436 426 415 425 426 b 384 468 409 449 399 468 b 369 448 370 468 369 459 b 369 436 369 444 369 441 l 369 428 l 369 423 b 367 138 369 328 367 233 l 353 143 l 192 207 l 192 367 b 173 406 192 383 184 396 b 151 422 167 413 160 422 b 144 420 148 422 147 422 b 137 403 138 416 137 410 l 137 392 l 137 229 b 33 271 102 243 68 256 b 13 276 26 274 19 276 b 0 262 6 276 0 272 b 35 199 1 239 0 212 l 138 160 b 140 -148 138 58 138 -45 b 56 -181 111 -158 84 -170 b 24 -215 35 -189 24 -199 b 29 -235 24 -220 26 -228 b 49 -253 35 -249 42 -253 b 78 -240 59 -253 69 -243 b 140 -216 98 -233 120 -225 l 140 -356 b 194 -425 140 -406 141 -406 z m 194 -125 b 193 138 194 -37 193 50 b 315 89 233 122 275 107 b 366 71 333 84 350 76 b 364 -58 366 27 366 -16 b 194 -125 308 -81 251 -104 z m 419 49 l 526 7 l 485 -10 l 419 -36 z',\n },\n articAccentAbove: {\n x_min: 0,\n x_max: 425,\n y_min: 0,\n y_max: 326,\n ha: 326,\n o: 'm 27 1 b 78 12 46 0 62 6 b 347 112 168 45 253 91 b 521 184 409 128 459 167 b 608 259 557 194 589 220 b 612 274 611 265 612 271 b 598 292 612 281 608 287 b 477 347 559 312 518 331 b 176 465 374 384 275 425 b 156 469 168 468 161 469 b 125 456 145 469 137 465 b 53 370 96 432 78 399 b 45 353 48 363 45 357 b 68 333 45 344 52 337 b 360 225 166 298 262 261 b 192 154 302 203 249 171 b 13 36 120 132 53 105 b 0 13 9 29 0 22 l 0 9 b 16 0 3 1 10 0 l 26 0 b 27 1 27 0 27 0 z',\n },\n articAccentBelow: {\n x_min: 0,\n x_max: 425,\n y_min: -326,\n y_max: 0,\n ha: 326,\n o: 'm 26 -469 l 27 -469 b 78 -458 46 -469 62 -464 b 347 -357 168 -426 253 -380 b 521 -285 409 -341 459 -302 b 608 -210 557 -276 589 -249 b 612 -196 611 -204 612 -200 b 598 -179 612 -189 608 -183 b 477 -122 559 -157 518 -138 b 176 -4 374 -85 275 -45 b 156 0 168 -1 161 0 b 125 -13 145 0 137 -4 b 53 -99 96 -37 78 -71 b 45 -117 48 -107 45 -112 b 68 -137 45 -125 52 -132 b 360 -245 166 -171 262 -209 b 192 -315 302 -266 249 -300 b 13 -433 120 -337 53 -366 b 0 -456 9 -442 0 -448 l 0 -461 b 16 -469 3 -468 10 -469 z',\n },\n articTenutoAbove: {\n x_min: 0.35192668236256364,\n x_max: 471.1238660564107,\n y_min: 0,\n y_max: 56,\n ha: 56,\n o: 'm 137 0 b 197 1 156 0 179 1 b 409 6 268 1 338 6 b 482 4 432 6 459 6 b 556 0 508 3 534 0 b 651 10 588 0 621 3 b 678 27 662 12 678 10 b 654 59 680 45 672 53 b 511 75 606 73 560 73 b 255 81 426 78 341 81 b 160 79 222 81 193 79 l 36 79 b 1 71 24 78 7 85 b 19 32 -3 56 9 43 b 45 16 26 24 36 20 b 137 0 76 3 108 0 z',\n },\n articTenutoBelow: {\n x_min: 0.35192668236256364,\n x_max: 471.1238660564107,\n y_min: -59,\n y_max: -3,\n ha: 56,\n o: 'm 137 -85 b 197 -84 156 -85 179 -84 b 409 -79 268 -84 338 -79 b 482 -81 432 -79 459 -79 b 556 -85 508 -82 534 -85 b 651 -75 588 -85 621 -82 b 678 -58 662 -73 678 -75 b 654 -26 680 -40 672 -32 b 511 -10 606 -12 560 -12 b 255 -4 426 -7 341 -4 b 160 -6 222 -4 193 -6 l 36 -6 b 1 -14 24 -7 7 0 b 19 -53 -3 -29 9 -42 b 45 -69 26 -60 36 -65 b 137 -85 76 -82 108 -85 z',\n },\n articStaccatoAbove: {\n x_min: 1.4151102965496913,\n x_max: 112,\n y_min: 0,\n y_max: 156,\n ha: 156,\n o: 'm 98 0 b 132 23 109 0 122 7 b 161 112 150 50 161 79 b 158 148 161 124 161 137 b 125 186 154 167 131 167 b 63 225 117 215 85 216 b 23 197 45 222 30 219 b 3 91 12 163 12 127 b 19 66 0 79 4 69 b 65 27 40 62 53 46 b 98 0 76 9 88 0 z',\n },\n articStaccatoBelow: {\n x_min: 1.4151102965496913,\n x_max: 112.08403222864916,\n y_min: -156,\n y_max: 0,\n ha: 156,\n o: 'm 132 -202 b 161 -112 151 -174 163 -145 b 158 -76 161 -101 161 -88 b 125 -39 153 -58 131 -58 b 63 0 115 -10 85 -9 b 23 -27 45 -3 30 -6 b 3 -134 12 -62 10 -98 b 19 -158 0 -145 4 -156 b 65 -197 40 -164 53 -179 b 98 -225 75 -216 88 -225 b 132 -202 109 -225 122 -217 z',\n },\n articStaccatissimoAbove: {\n x_min: 0,\n x_max: 139,\n y_min: 0,\n y_max: 411,\n ha: 411,\n o: 'm 104 0 b 144 115 143 29 138 75 b 197 423 158 217 180 320 b 200 454 199 433 200 444 b 181 540 200 482 193 513 b 112 592 167 573 141 592 b 55 567 92 592 72 585 b 0 490 32 546 3 527 l 0 484 b 27 279 14 416 14 347 b 84 20 43 193 52 104 b 96 0 86 13 92 6 z',\n },\n articStaccatissimoBelow: {\n x_min: 0,\n x_max: 139,\n y_min: -411,\n y_max: 0,\n ha: 411,\n o: 'm 88 -592 b 145 -567 108 -592 128 -585 b 200 -490 168 -546 197 -527 l 200 -484 b 173 -279 186 -416 186 -347 b 117 -20 157 -193 148 -104 b 104 0 114 -13 108 -6 l 96 0 b 56 -115 58 -29 62 -75 b 3 -423 42 -217 20 -320 b 0 -454 1 -433 0 -444 b 19 -540 0 -482 7 -513 b 88 -592 33 -573 59 -592 z',\n },\n articMarcatoAbove: {\n x_min: 0.04121419527862119,\n x_max: 396,\n y_min: 0,\n y_max: 328.0000000000001,\n ha: 328.0000000000001,\n o: 'm 477 0 b 510 13 488 0 500 6 b 570 124 546 40 563 81 b 547 183 570 147 560 166 b 356 422 487 265 405 330 b 346 442 354 429 350 436 l 346 444 b 318 465 340 456 330 464 l 312 469 b 274 449 294 480 284 461 b 242 413 262 438 253 425 b 56 196 177 343 112 274 b 1 56 26 154 13 105 b 27 20 -4 35 9 20 b 42 23 32 20 37 20 b 84 53 59 29 72 39 b 255 269 141 125 193 200 b 275 229 262 255 266 242 b 448 14 324 151 390 86 b 477 0 456 4 467 0 z',\n },\n articMarcatoBelow: {\n x_min: 0,\n x_max: 395.9587858047214,\n y_min: -328.0000000000001,\n y_max: 0,\n ha: 328.0000000000001,\n o: 'm 258 -469 b 297 -449 276 -480 287 -461 b 328 -413 308 -438 317 -425 b 514 -196 393 -343 458 -274 b 569 -56 544 -154 557 -105 b 543 -20 575 -35 562 -20 b 528 -23 539 -20 533 -20 b 487 -53 511 -29 498 -39 b 315 -269 429 -125 377 -200 b 295 -229 308 -255 304 -242 b 122 -14 246 -151 180 -86 b 94 0 114 -4 104 0 b 60 -13 82 0 71 -6 b 0 -124 24 -40 7 -81 b 23 -183 0 -147 10 -166 b 215 -422 84 -265 166 -330 b 225 -442 216 -429 220 -436 l 225 -444 b 252 -465 230 -456 240 -464 z',\n },\n fermataAbove: {\n x_min: -0.04550444040404433,\n x_max: 472,\n y_min: 2.015071727506986,\n y_max: 454,\n ha: 451.984928272493,\n o: 'm 39 10 b 78 108 66 37 71 73 b 163 311 92 181 111 252 b 284 423 199 353 239 392 b 373 458 312 444 340 454 b 433 431 395 458 410 446 b 603 153 530 361 596 276 b 595 121 603 144 595 131 l 595 88 b 602 50 596 75 589 55 b 639 73 619 43 631 60 b 651 102 645 82 648 92 b 667 194 660 132 662 163 b 680 278 671 222 672 248 b 560 567 680 386 638 481 b 396 654 508 625 452 649 b 291 632 364 654 325 644 b 161 526 235 613 200 566 b 4 249 85 446 26 357 b 4 174 0 222 -3 196 b 10 19 4 124 4 69 b 29 4 12 6 16 0 b 39 10 35 4 33 4 z m 338 37 b 370 40 350 36 357 36 b 380 75 387 40 380 43 b 389 94 382 79 382 85 b 356 132 389 111 374 122 b 269 154 328 147 300 156 b 225 125 252 154 228 157 b 261 48 222 81 232 56 b 338 37 287 40 312 40 z',\n },\n fermataBelow: {\n x_min: -0.310835055998654,\n x_max: 518.570567335755,\n y_min: -430,\n y_max: -0.9161449836506543,\n ha: 429.08385501634933,\n o: 'm 344 -615 b 500 -543 402 -602 452 -576 b 713 -253 605 -471 661 -364 b 746 -98 737 -204 750 -153 b 727 -59 744 -82 744 -59 b 688 -88 711 -59 694 -68 b 678 -109 687 -96 683 -102 b 562 -314 648 -183 611 -252 b 387 -439 516 -373 458 -416 b 328 -449 367 -446 347 -449 b 180 -386 274 -449 225 -423 b 69 -179 111 -330 69 -262 b 75 -121 69 -160 71 -141 b 84 -58 78 -101 84 -79 b 82 -39 84 -52 84 -45 b 68 -1 79 -26 82 -4 b 26 -32 49 0 33 -12 b 20 -52 24 -39 22 -45 b 0 -223 9 -107 -3 -161 b 141 -553 1 -348 27 -468 b 304 -619 192 -590 243 -619 b 344 -615 317 -619 330 -618 z m 415 -190 b 435 -157 429 -192 435 -184 b 308 -27 435 -86 379 -27 b 271 -46 287 -27 272 -35 b 269 -69 269 -55 269 -62 b 364 -183 269 -128 302 -170 z',\n },\n breathMarkComma: {\n x_min: 0,\n x_max: 148,\n y_min: 0,\n y_max: 275,\n ha: 275,\n o: 'm 120 0 b 187 78 156 20 174 48 b 213 209 206 121 213 164 b 206 294 213 238 210 265 b 140 390 200 337 171 367 b 122 396 134 395 128 396 b 68 382 105 396 85 384 b 46 379 60 382 53 382 b 0 328 12 369 0 357 b 1 311 0 323 1 317 b 30 210 4 275 22 243 b 66 167 39 179 46 167 b 94 171 73 167 82 168 b 143 180 109 174 124 180 b 160 179 148 180 154 180 b 120 66 124 145 120 107 b 120 0 120 45 121 23 z',\n },\n breathMarkUpbow: {\n x_min: 0,\n x_max: 254,\n y_min: 0,\n y_max: 595,\n ha: 595,\n o: 'm 233 0 b 256 48 251 14 253 30 b 272 183 264 92 265 138 b 311 455 289 274 295 364 b 350 716 327 541 341 628 b 366 815 354 749 366 782 b 359 857 366 829 363 842 b 327 815 334 852 330 832 b 302 674 315 769 310 721 b 248 357 288 567 269 462 b 225 226 240 314 242 268 b 210 251 212 232 213 243 b 69 721 163 408 117 564 b 32 835 58 760 53 801 b 20 851 29 841 27 851 b 14 850 19 851 16 851 b 0 828 6 847 0 838 l 0 825 b 12 765 1 804 7 785 b 194 125 73 552 132 338 b 233 0 206 84 213 42 z',\n },\n caesura: {\n x_min: 0,\n x_max: 565.5831864753837,\n y_min: -0.09016994374947417,\n y_max: 562.4481112129314,\n ha: 562.5382811566809,\n o: 'm 0 76 b 49 122 24 92 37 107 b 444 613 180 287 305 455 b 528 770 484 660 518 708 b 531 792 530 778 531 785 b 524 808 531 799 530 805 b 490 792 513 815 498 802 b 390 683 456 756 420 721 b 48 262 275 543 164 400 b 0 76 0 207 7 145 z m 226 1 b 248 13 238 -4 243 7 l 353 137 b 759 638 490 302 632 464 b 814 805 795 688 819 740 b 779 786 796 805 788 796 b 628 609 724 732 678 668 b 310 242 523 485 416 363 b 217 69 265 190 217 140 b 222 30 217 58 219 45 b 222 23 222 29 220 26 b 220 12 222 20 220 16 b 226 1 220 7 222 3 z',\n },\n caesuraCurved: {\n x_min: 0,\n x_max: 386,\n y_min: -10,\n y_max: 584,\n ha: 594,\n o: 'm 180 -14 b 246 14 213 -13 230 0 b 347 144 288 52 315 99 b 526 471 420 246 488 350 b 556 671 546 537 556 603 b 543 798 556 713 553 756 b 504 837 537 822 521 828 b 490 841 500 840 494 841 b 472 832 482 841 477 838 b 406 678 436 785 406 737 b 410 638 406 665 408 652 b 425 511 419 595 425 553 b 315 186 425 395 387 287 b 180 -14 271 122 228 58 z m 14 24 b 49 39 29 24 40 32 b 120 114 76 60 99 85 b 216 276 156 166 184 223 b 317 626 281 384 317 501 b 315 664 317 639 317 651 b 301 773 314 701 311 737 b 262 808 295 795 278 808 b 245 799 256 808 249 805 b 170 641 209 750 170 706 b 171 621 170 634 170 628 b 177 511 176 585 177 549 b 114 229 177 415 160 320 b 0 26 79 161 42 95 b 14 24 6 24 10 24 z',\n },\n restMaxima: {\n x_min: 0,\n x_max: 366,\n y_min: -255,\n y_max: 255,\n ha: 510,\n o: 'm 397 -367 b 504 -343 436 -367 468 -347 b 518 -318 516 -341 518 -330 b 527 -30 518 -217 527 -117 b 526 33 527 -7 527 13 l 526 301 b 501 350 526 323 520 341 b 428 367 477 361 452 367 b 374 359 410 367 393 364 b 357 333 361 354 357 347 b 356 91 357 252 356 171 l 356 30 b 340 -307 357 -82 346 -194 b 397 -367 337 -354 350 -367 z m 46 -357 b 58 -356 49 -357 53 -357 b 154 -333 91 -351 121 -338 b 173 -305 168 -330 173 -320 l 173 302 b 132 356 173 330 157 348 b 68 364 112 363 89 364 b 3 304 19 363 1 348 l 3 4 l 0 4 b 1 -302 0 -98 0 -200 b 46 -357 1 -331 16 -357 z',\n },\n restDoubleWhole: {\n x_min: 0,\n x_max: 122,\n y_min: 0,\n y_max: 249,\n ha: 249,\n o: 'm 43 0 b 58 1 48 0 52 0 b 124 20 81 6 102 17 b 176 96 173 27 176 58 b 173 220 174 138 173 179 b 176 304 173 248 176 276 b 140 353 176 331 163 346 b 95 359 125 356 111 359 b 32 346 73 359 52 354 b 0 315 20 340 0 337 b 1 243 0 291 1 268 l 1 174 l 4 174 l 4 48 b 43 0 4 16 17 0 z',\n },\n restWhole: {\n x_min: 0.8908513171538642,\n x_max: 500,\n y_min: -120,\n y_max: 14,\n ha: 134,\n o: 'm 356 -173 l 356 -171 l 642 -171 b 719 -115 680 -171 717 -145 b 720 -82 719 -104 720 -92 b 711 -20 720 -60 719 -40 b 672 17 704 0 694 10 b 649 20 664 20 657 20 b 605 17 634 20 621 17 b 92 19 433 17 262 17 b 29 7 69 20 49 12 b 9 -17 12 4 9 -6 b 10 -43 9 -26 10 -35 b 1 -84 10 -58 3 -72 b 76 -173 0 -147 7 -173 z',\n },\n restHalf: {\n x_min: 0,\n x_max: 518.3998530468286,\n y_min: 0,\n y_max: 162,\n ha: 162,\n o: 'm 98 0 l 556 0 b 665 1 592 0 629 0 b 746 82 720 3 743 29 b 736 174 749 114 740 144 b 670 232 729 215 708 232 b 570 229 636 232 603 229 b 356 233 498 229 426 233 l 73 233 b 0 179 19 233 0 220 b 1 154 0 171 0 164 b 6 95 4 135 6 115 b 98 0 3 27 29 0 z',\n },\n restQuarter: {\n x_min: -0.3784452492533808,\n x_max: 263,\n y_min: -415,\n y_max: 415,\n ha: 830,\n o: 'm 151 -596 b 164 -563 163 -589 161 -575 b 160 -546 164 -557 161 -552 b 124 -396 148 -495 135 -446 b 122 -380 122 -390 122 -384 b 199 -255 122 -331 158 -272 b 228 -256 209 -249 217 -253 b 324 -346 274 -271 298 -310 b 353 -369 331 -356 341 -369 b 360 -367 356 -369 357 -369 b 379 -336 373 -361 379 -348 l 377 -325 b 344 -232 372 -292 366 -258 b 249 -58 301 -180 278 -117 b 242 -36 245 -49 242 -42 b 258 -7 242 -26 248 -17 b 328 78 284 20 311 45 b 354 158 344 104 354 131 b 337 216 354 177 350 196 b 213 435 294 288 249 359 b 115 575 189 487 158 536 b 78 598 105 585 92 598 b 59 592 72 598 66 596 b 39 562 45 583 39 572 b 53 527 39 550 45 539 b 168 344 98 469 125 402 b 187 307 181 328 187 317 b 153 269 187 294 176 284 b 62 213 122 252 91 235 b 40 180 48 203 40 192 b 46 158 40 173 43 166 b 99 65 60 125 79 95 b 183 -79 131 20 160 -29 b 156 -86 173 -88 164 -85 b 0 -261 58 -99 -7 -173 b 96 -557 10 -366 49 -464 b 124 -585 102 -569 109 -580 b 145 -598 132 -588 138 -598 b 151 -596 147 -598 150 -598 z',\n },\n rest8th: {\n x_min: 0,\n x_max: 289,\n y_min: -260,\n y_max: 261,\n ha: 521,\n o: 'm 164 -374 b 212 -340 190 -373 203 -357 b 276 -190 238 -292 258 -242 b 410 285 333 -36 359 128 b 416 314 413 294 416 304 l 416 321 b 393 354 415 341 410 354 b 382 353 389 354 386 354 b 292 311 347 347 315 333 b 174 225 256 276 216 251 b 157 219 168 222 163 219 b 140 228 151 219 145 222 b 131 246 134 233 131 240 b 135 262 131 252 132 256 b 147 298 141 272 147 285 b 127 367 147 323 154 354 b 94 376 114 373 102 376 b 48 336 75 376 63 363 b 3 181 20 288 12 235 b 0 150 1 170 0 160 b 109 24 0 84 35 24 b 171 36 127 24 148 27 b 289 101 213 52 248 75 b 164 -374 256 -62 193 -213 z',\n },\n rest16th: {\n x_min: 0,\n x_max: 333,\n y_min: -328.283950617284,\n y_max: 244,\n ha: 572.2839506172841,\n o: 'm 209 -471 b 246 -458 222 -477 236 -468 b 307 -338 279 -425 300 -384 b 324 -226 312 -301 317 -262 b 428 161 350 -94 386 35 b 480 318 445 215 480 259 b 467 347 480 331 477 341 b 445 351 461 350 454 351 b 408 337 432 351 419 347 b 402 333 405 336 403 334 b 223 215 344 294 294 245 b 236 259 229 233 235 246 b 238 276 238 265 238 271 b 212 338 238 302 226 334 b 193 341 206 340 199 341 b 86 289 156 341 104 317 b 59 180 66 255 59 217 b 156 27 59 76 92 27 b 236 46 179 27 204 35 b 338 101 271 59 298 82 b 289 -49 312 49 302 0 b 196 -122 276 -99 235 -107 b 176 -114 187 -127 176 -127 l 176 -111 b 157 -53 177 -88 164 -72 b 69 -9 141 -7 101 -16 b 17 -48 43 -3 29 -27 b 0 -127 4 -73 0 -99 b 6 -186 0 -147 1 -167 b 82 -294 17 -262 37 -294 b 160 -276 102 -294 128 -289 b 219 -242 181 -268 203 -259 b 236 -230 223 -236 229 -230 b 243 -232 239 -230 240 -230 b 235 -275 248 -246 239 -261 b 202 -456 220 -334 202 -395 b 209 -471 202 -462 203 -468 z',\n },\n rest32nd: {\n x_min: 0,\n x_max: 347,\n y_min: -497.5023916875033,\n y_max: 483,\n ha: 980.5023916875033,\n o: 'm 177 -716 b 217 -690 194 -720 209 -704 b 233 -655 225 -680 230 -668 b 292 -390 253 -567 275 -480 b 361 -48 312 -275 336 -161 b 452 400 393 102 422 252 b 497 629 467 477 482 553 b 500 647 498 635 500 641 b 480 691 500 665 492 684 b 464 696 475 694 469 696 b 418 674 448 696 431 685 l 361 626 b 333 611 353 618 343 612 b 308 629 325 611 317 616 b 239 667 292 651 265 661 b 204 670 228 668 216 670 b 86 559 141 670 95 628 b 85 537 86 552 85 544 b 107 416 85 495 95 455 b 161 372 114 389 134 372 b 174 373 166 372 170 372 b 226 383 192 374 209 377 b 387 478 285 402 330 444 b 364 386 379 444 364 415 b 276 271 364 323 320 298 b 265 266 272 268 268 266 b 252 276 261 266 256 269 b 143 333 229 311 186 333 b 107 327 130 333 118 330 b 43 243 62 314 46 291 b 58 145 43 210 52 179 b 150 63 68 92 99 63 b 315 132 213 63 259 98 b 266 -58 297 63 281 4 b 207 -101 259 -91 230 -96 b 186 -66 186 -107 199 -75 b 180 -50 181 -63 183 -55 b 101 -3 160 -23 135 -3 b 9 -66 59 -3 20 -32 b 0 -118 3 -84 0 -101 b 10 -196 0 -144 6 -170 b 104 -287 20 -256 52 -287 b 137 -282 114 -287 125 -287 b 184 -269 151 -281 171 -269 b 196 -275 190 -269 193 -271 b 199 -287 197 -278 199 -282 b 184 -343 199 -304 189 -325 b 181 -348 184 -346 183 -347 b 134 -595 158 -429 131 -508 b 156 -677 134 -624 150 -648 b 177 -716 158 -693 160 -713 z',\n },\n rest64th: {\n x_min: 0,\n x_max: 428,\n y_min: -720,\n y_max: 473.6797408388932,\n ha: 1193.6797408388932,\n o: 'm 200 -1037 b 229 -1012 215 -1037 222 -1025 b 238 -984 233 -1004 236 -994 b 282 -780 248 -914 265 -848 b 386 -369 317 -644 354 -507 b 491 104 422 -212 451 -53 b 600 541 528 249 550 399 b 616 629 611 570 616 599 b 600 680 616 648 615 671 b 550 665 586 687 566 677 b 480 618 527 649 501 635 b 464 611 474 613 468 611 b 448 622 458 611 454 615 b 366 662 425 651 397 662 b 331 658 354 662 343 661 b 242 572 285 647 253 619 b 236 528 239 557 236 543 b 266 400 236 484 251 442 b 325 373 274 377 301 373 b 436 409 366 373 403 383 l 494 452 b 474 360 485 416 474 389 b 383 248 474 297 435 269 b 320 328 377 288 351 310 b 276 341 305 337 291 341 b 186 269 235 341 194 311 b 181 230 183 256 181 243 b 187 153 181 204 186 179 b 279 63 192 86 233 63 b 304 65 288 63 295 63 b 416 115 344 72 379 92 b 387 -14 406 69 397 27 b 320 -95 380 -52 369 -86 b 318 -79 320 -89 320 -84 b 223 0 305 -29 271 0 b 122 -81 171 0 135 -30 b 118 -127 120 -96 118 -112 l 118 -196 b 137 -242 118 -215 125 -229 b 209 -275 157 -266 181 -275 b 249 -269 222 -275 235 -274 b 318 -248 272 -264 294 -255 b 281 -390 315 -301 292 -344 b 276 -400 279 -393 279 -397 b 259 -420 272 -408 266 -416 b 246 -429 255 -425 251 -429 b 233 -415 242 -429 238 -426 b 176 -359 225 -389 200 -372 b 121 -346 158 -348 140 -346 b 14 -408 73 -346 27 -370 b 0 -498 4 -438 0 -468 b 6 -564 0 -520 3 -543 b 91 -635 12 -611 45 -635 b 131 -629 104 -635 117 -634 b 223 -590 163 -622 190 -603 b 166 -824 203 -671 189 -747 b 148 -912 157 -852 148 -881 b 156 -955 148 -926 150 -940 b 177 -1008 161 -972 170 -991 b 200 -1037 181 -1020 183 -1037 z',\n },\n rest128th: {\n x_min: 0.6717818579024267,\n x_max: 491,\n y_min: -711,\n y_max: 719,\n ha: 1430,\n o: 'm 233 -1015 b 271 -956 256 -1002 266 -981 l 314 -723 b 393 -350 337 -598 366 -474 b 543 312 442 -128 492 91 b 687 841 583 490 635 665 b 707 958 698 880 707 919 b 706 986 707 968 707 976 b 688 1025 704 999 704 1024 b 670 1027 683 1025 677 1027 b 629 1007 655 1027 639 1022 b 559 945 613 981 586 968 b 541 1004 553 968 559 991 b 456 1035 516 1024 488 1035 b 419 1030 444 1035 431 1034 b 344 953 379 1018 353 995 b 340 900 341 936 340 917 b 341 847 340 881 341 864 b 380 779 340 815 354 793 b 464 763 406 765 435 762 b 592 814 510 763 549 786 b 546 660 575 757 556 710 b 480 585 537 619 517 598 b 478 599 480 590 478 595 b 386 678 472 641 428 678 b 294 612 343 678 304 651 b 279 477 282 567 278 521 b 363 395 281 428 317 395 b 380 396 369 395 374 395 b 488 436 416 403 449 419 b 384 233 469 357 468 275 b 359 291 373 252 377 276 b 282 318 337 310 310 318 b 181 264 243 318 203 298 b 154 107 153 216 154 161 b 242 6 154 42 187 6 b 278 10 253 6 265 7 b 408 88 330 22 366 55 b 387 -1 400 56 393 27 b 301 -112 379 -55 354 -94 b 289 -65 297 -95 302 -79 b 219 -32 269 -42 245 -32 b 183 -37 207 -32 196 -35 b 112 -109 144 -46 121 -71 b 105 -219 104 -145 108 -183 b 186 -315 101 -276 134 -315 b 230 -307 199 -315 215 -312 b 324 -256 264 -295 292 -275 b 180 -491 323 -383 266 -471 b 183 -459 180 -480 180 -469 b 184 -442 184 -454 184 -448 l 184 -436 b 135 -369 184 -403 170 -383 b 102 -363 125 -364 114 -363 b 29 -399 73 -363 45 -376 b 1 -556 -4 -448 6 -503 b 109 -670 -4 -625 43 -670 b 140 -667 118 -670 130 -668 b 253 -616 180 -658 213 -638 b 238 -688 248 -644 242 -665 b 192 -959 220 -779 192 -867 b 193 -992 192 -971 192 -981 b 210 -1024 194 -1014 199 -1024 b 233 -1015 216 -1024 223 -1021 z',\n },\n dynamicPiano: {\n x_min: -49,\n x_max: 326.5019318364244,\n y_min: -142,\n y_max: 515,\n ha: 657,\n o: 'm -56 -204 b -42 -202 -52 -204 -46 -203 b -19 -194 -35 -202 -26 -197 b 147 -138 35 -170 91 -151 b 249 -58 194 -127 223 -95 b 262 -29 255 -50 262 -39 b 258 -17 262 -24 261 -20 b 232 -7 252 -10 242 -7 b 210 -12 225 -7 217 -9 b 125 -40 184 -23 157 -30 b 183 140 153 19 171 79 b 251 167 207 144 230 153 b 469 518 383 262 480 382 b 357 687 472 626 420 687 b 315 678 344 687 330 684 b 204 600 279 664 240 634 b 210 704 206 635 209 670 b 215 721 212 710 215 716 b 206 733 215 727 212 730 b 180 742 197 736 189 742 b 164 734 176 742 170 740 b 1 575 108 684 36 645 b -7 557 -1 569 -7 563 b -6 553 -7 556 -7 554 b 7 547 -3 547 3 547 l 17 547 b 82 575 43 547 59 567 l 82 452 b 56 46 82 317 81 180 b 17 -66 49 7 46 -36 b -62 -173 -13 -99 -37 -135 b -71 -192 -66 -179 -71 -184 b -68 -199 -71 -193 -69 -196 b -56 -204 -65 -203 -60 -204 z m 196 258 b 197 266 197 261 197 264 b 200 510 200 347 199 429 b 233 543 210 521 222 533 b 281 560 249 554 266 560 b 340 503 310 560 333 540 b 344 461 343 488 344 474 b 321 323 344 413 333 369 b 268 272 315 300 295 281 b 196 258 245 265 220 261 z',\n },\n dynamicMezzo: {\n x_min: -18,\n x_max: 559,\n y_min: -50,\n y_max: 365,\n ha: 415,\n o: 'm 43 -71 b 160 19 86 -71 143 -26 b 230 264 189 99 200 184 b 282 363 243 297 259 327 b 287 320 285 347 287 333 b 284 279 287 305 285 292 l 249 -12 b 275 -43 248 -29 245 -43 b 395 45 321 -43 389 3 b 462 271 406 124 436 197 b 523 387 475 310 490 348 l 523 346 b 504 130 521 274 513 202 b 501 81 501 114 501 98 b 510 3 501 55 504 29 b 580 -72 521 -48 543 -72 b 625 -63 593 -72 608 -69 b 789 50 690 -43 744 -3 b 805 72 795 56 805 63 b 798 85 805 76 802 81 b 778 94 792 91 785 94 b 755 85 770 94 763 91 l 693 40 b 675 33 685 36 680 33 b 658 52 668 33 662 39 b 645 144 651 82 645 112 b 658 448 641 246 660 346 b 606 507 658 485 638 507 b 583 504 599 507 592 505 b 495 446 547 497 521 471 b 420 373 471 423 448 399 b 413 458 418 406 418 432 b 361 507 408 490 386 507 b 320 491 347 507 333 501 b 160 307 256 444 207 382 l 160 337 b 174 488 160 387 174 438 b 156 521 174 501 173 513 b 137 526 148 524 143 526 b 109 513 127 526 118 520 b -16 399 66 477 23 439 b -26 383 -20 395 -26 389 l -26 379 b -14 370 -24 372 -20 370 b -6 372 -12 370 -9 372 b 19 376 4 374 12 376 b 36 359 32 376 36 370 b 30 330 36 350 35 341 l 30 323 b 9 -35 23 203 17 85 b 43 -71 6 -65 19 -71 z',\n },\n dynamicForte: {\n x_min: -144,\n x_max: 311.30112136775,\n y_min: -115.3876295915697,\n y_max: 504,\n ha: 619.3876295915697,\n o: 'm -101 -166 b 173 76 7 -153 150 -30 b 206 344 192 164 202 253 b 268 338 226 343 246 341 b 384 395 317 333 353 361 b 397 419 393 405 397 412 b 367 442 397 429 387 436 b 350 444 361 444 356 444 b 206 455 302 449 255 454 l 206 474 b 202 540 204 495 202 518 b 209 593 202 557 203 576 b 236 624 215 613 225 624 b 265 612 245 624 253 619 b 308 552 287 596 302 577 b 336 533 312 534 323 533 b 448 611 366 533 444 583 b 399 696 452 648 423 671 b 382 706 395 700 387 703 b 308 726 357 720 333 726 b 207 684 272 726 239 711 b 60 455 135 622 60 560 l 10 455 b -23 448 -1 455 -13 454 b -102 372 -55 426 -76 397 b -109 357 -108 367 -109 361 b -95 347 -109 353 -105 348 b -63 346 -84 346 -73 346 b 0 344 -43 344 -22 344 l 63 344 b 53 186 63 291 59 239 b 23 0 46 124 42 60 b -35 -60 10 -42 -6 -60 b -73 -52 -45 -60 -58 -58 b -91 -48 -79 -49 -85 -48 b -109 -53 -96 -48 -102 -49 b -199 -124 -143 -72 -168 -99 b -207 -137 -203 -128 -207 -132 b -194 -148 -207 -141 -203 -145 b -101 -166 -164 -160 -132 -168 z',\n },\n dynamicRinforzando: {\n x_min: -75,\n x_max: 322.0960720195126,\n y_min: -90,\n y_max: 325,\n ha: 415,\n o: 'm 23 -130 b 40 -125 27 -130 33 -128 b 128 -9 81 -114 125 -53 b 145 200 132 62 141 130 b 148 238 147 212 148 225 b 308 321 184 291 245 321 b 363 314 325 321 344 318 b 377 310 369 312 373 310 b 384 311 380 310 382 310 b 464 415 410 317 464 389 b 446 433 465 429 455 429 b 390 445 428 441 409 445 b 305 429 361 445 334 438 b 167 346 252 413 202 393 b 153 325 163 338 158 333 b 148 438 154 363 151 399 b 121 468 147 456 134 468 b 101 458 115 468 108 465 b -63 310 46 409 -16 367 b -108 240 -78 289 -98 271 b 32 330 -50 256 -13 297 b 37 304 37 320 37 312 l 37 292 b 10 -101 27 161 20 30 b 23 -130 9 -120 12 -130 z',\n },\n dynamicSforzando: {\n x_min: 0,\n x_max: 296,\n y_min: 0,\n y_max: 379,\n ha: 379,\n o: 'm 151 0 b 174 1 160 0 166 0 b 392 158 272 14 346 71 b 405 207 400 174 405 190 b 359 287 405 236 389 265 b 261 325 328 308 294 315 b 168 413 216 340 181 366 b 166 426 167 418 166 423 b 176 438 166 432 167 436 b 199 441 183 441 190 441 b 310 393 238 441 295 422 b 334 370 317 376 325 370 b 363 386 343 370 353 379 b 422 445 386 402 408 420 b 426 458 425 449 426 454 b 422 469 426 462 425 465 b 274 546 395 518 333 546 b 161 503 232 546 190 531 b 86 405 132 472 108 439 b 71 347 75 387 71 367 b 112 256 71 312 85 279 b 209 215 141 232 176 226 b 284 168 238 206 266 197 b 300 131 291 157 300 144 b 298 120 300 127 298 122 b 278 107 294 109 285 108 b 262 108 271 107 266 108 l 259 108 b 114 157 200 107 156 125 b 96 181 104 163 96 170 l 96 184 b 102 202 96 190 102 196 b 96 209 102 204 101 207 b 63 194 82 215 72 204 b 7 109 42 168 26 138 b 0 86 3 101 0 94 b 13 60 0 78 4 68 b 151 0 53 23 101 0 z',\n },\n dynamicZ: {\n x_min: -42.73880183193087,\n x_max: 331,\n y_min: 0,\n y_max: 328,\n ha: 328,\n o: 'm -45 0 b -6 16 -32 0 -17 10 b 3 20 -3 16 0 19 b 144 60 49 48 96 60 b 284 22 190 60 238 46 b 348 4 305 10 327 4 b 461 75 393 4 435 30 b 468 91 464 81 467 86 b 456 104 468 95 465 99 b 287 173 402 131 348 167 b 239 176 271 174 255 176 b 168 174 217 176 194 174 b 367 340 236 236 298 294 b 459 423 402 363 432 392 b 477 454 467 431 475 442 b 474 462 477 456 475 459 b 454 472 469 469 462 472 b 432 468 446 472 439 469 b 356 448 406 461 380 455 b 210 422 307 433 258 422 b 109 442 177 422 144 428 b 94 445 104 444 99 445 b 69 433 85 445 76 442 b 27 390 56 419 39 406 b -9 343 16 373 -17 357 b 63 311 3 320 36 314 l 78 311 b 132 307 95 308 114 307 b 240 314 168 307 203 311 l 193 271 b -37 50 117 196 19 145 b -59 7 -46 36 -69 20 b -45 0 -55 3 -50 0 z',\n },\n ornamentTrill: {\n x_min: 1,\n x_max: 551,\n y_min: -18,\n y_max: 539,\n ha: 557,\n o: 'm 321 612 b 190 602 278 605 235 605 l 190 638 b 187 693 190 652 190 667 b 161 776 184 717 193 776 b 137 747 150 776 137 766 b 130 654 135 716 131 685 l 130 596 l 52 588 b 4 539 23 585 7 570 b 1 477 3 530 1 500 b 3 448 1 461 3 448 l 3 452 b 53 432 6 436 23 432 b 134 435 75 432 102 433 b 151 117 138 328 147 223 b 170 13 153 82 157 46 b 209 -26 179 -10 193 -26 b 222 -22 213 -26 217 -24 b 269 -17 233 -16 253 -27 b 343 135 325 19 346 66 b 343 158 343 147 344 147 b 323 192 341 171 337 187 b 291 176 311 194 300 184 l 264 148 b 229 131 261 145 238 131 b 212 170 209 131 213 154 b 194 438 203 259 199 348 l 272 442 b 284 452 276 441 279 441 b 305 462 287 461 295 462 l 312 462 b 346 477 325 462 340 464 b 366 560 357 503 366 531 b 321 612 366 598 356 618 z m 759 588 b 711 560 749 592 733 570 b 588 500 671 541 631 521 b 583 533 586 514 586 524 b 560 576 577 549 577 572 b 517 550 541 582 528 564 b 416 423 482 508 452 462 b 382 353 392 397 384 370 b 387 305 380 341 386 318 b 392 275 389 295 392 285 b 409 243 393 262 393 243 b 431 262 419 243 425 255 b 521 373 459 298 488 333 b 523 354 521 366 523 360 b 520 337 523 346 521 340 b 508 295 513 323 508 310 b 530 102 508 279 524 122 b 549 66 533 88 530 66 b 577 99 563 66 572 84 b 580 131 580 109 580 121 l 580 302 b 600 347 580 318 582 337 b 701 392 632 364 665 384 b 793 518 785 409 793 435 b 759 588 793 559 785 576 z',\n },\n ornamentTurn: {\n x_min: 0,\n x_max: 574,\n y_min: 0,\n y_max: 312,\n ha: 312,\n o: 'm 651 0 b 816 132 727 0 796 46 b 827 223 822 163 827 193 b 808 340 827 262 821 301 b 665 449 785 408 729 449 b 636 446 655 449 647 448 b 589 384 600 441 586 422 l 602 300 b 611 285 603 291 605 285 b 621 288 613 285 616 287 b 655 295 632 294 644 295 b 711 284 674 295 693 289 b 773 209 740 275 773 232 b 697 156 773 184 734 160 b 664 154 685 154 675 154 b 579 168 635 154 608 158 b 455 242 533 186 495 213 b 261 400 387 291 331 354 b 160 432 225 422 190 432 b 20 328 98 432 49 392 b 0 229 6 295 0 262 b 30 71 0 176 14 122 b 144 3 43 29 96 3 b 168 6 153 3 160 4 b 248 122 233 20 248 39 b 246 147 248 124 248 135 b 226 177 243 164 239 177 b 206 170 220 177 215 174 b 144 154 186 158 166 154 b 79 170 122 154 101 160 b 53 202 62 179 53 189 b 60 228 53 209 55 217 b 161 281 81 261 120 281 b 183 279 168 281 176 281 b 325 190 243 269 284 229 b 572 16 402 124 475 53 b 651 0 598 6 625 0 z',\n },\n ornamentTurnSlash: {\n x_min: 0,\n x_max: 574,\n y_min: -106,\n y_max: 405,\n ha: 511,\n o: 'm 441 -153 b 456 -60 455 -118 456 -89 b 455 81 455 -14 455 33 b 572 14 491 55 530 30 b 651 -1 598 4 625 -1 b 816 131 727 -1 796 45 b 827 222 822 161 827 192 b 808 338 827 261 821 300 b 665 448 785 406 729 448 b 636 445 655 448 647 446 b 589 383 600 439 586 420 l 602 298 b 611 284 603 289 605 284 b 621 287 613 284 616 285 b 655 294 632 292 644 294 b 711 282 674 294 693 288 b 773 207 740 274 773 230 b 697 154 773 183 734 158 b 664 153 685 153 675 153 b 579 167 635 153 608 157 b 455 240 533 183 495 212 b 454 242 455 240 455 242 l 454 337 b 452 488 454 386 452 439 b 433 570 452 517 451 546 b 425 583 431 575 431 583 l 422 583 b 403 566 415 582 408 573 b 402 546 400 560 402 553 l 397 287 b 261 399 353 325 310 366 b 160 431 225 420 190 431 b 20 327 98 431 48 390 b 0 228 6 294 0 261 b 30 69 0 174 14 121 b 144 1 43 27 96 1 b 168 4 153 1 160 3 b 248 121 233 19 248 37 b 246 145 248 122 248 134 b 226 176 243 163 239 176 b 206 168 220 176 215 173 b 144 153 186 157 166 153 b 79 168 122 153 101 158 b 53 200 62 177 53 187 b 60 226 53 207 55 216 b 161 279 79 259 120 279 b 183 278 168 279 176 279 b 325 189 243 266 282 226 b 395 130 348 168 372 148 b 393 71 393 109 393 89 b 441 -153 390 -6 402 -78 z',\n },\n ornamentMordent: {\n x_min: 0,\n x_max: 700,\n y_min: 0,\n y_max: 497,\n ha: 497,\n o: 'm 513 0 b 528 39 526 14 527 27 b 531 72 531 50 531 60 b 528 138 531 94 528 117 l 528 347 b 552 359 537 354 544 359 b 579 338 560 359 569 353 b 674 217 609 297 639 255 b 719 190 690 200 704 190 b 759 215 732 190 744 197 b 940 395 815 279 877 337 b 1001 490 968 422 986 455 b 1008 513 1004 495 1008 505 b 1002 524 1008 517 1007 521 b 968 516 994 530 978 524 b 960 508 965 513 963 510 b 798 356 900 464 848 410 b 778 341 791 347 783 341 b 757 354 772 341 765 346 b 661 475 720 392 690 432 b 611 517 644 504 629 517 b 563 498 598 517 583 511 b 527 471 550 490 539 481 l 527 570 b 492 716 526 619 523 671 b 472 677 480 704 472 694 b 465 399 474 585 468 491 b 439 366 456 387 448 376 b 384 320 415 336 399 320 b 330 367 369 320 354 336 b 325 376 328 369 327 373 b 226 490 291 413 265 456 b 189 505 213 500 202 505 b 157 491 177 505 167 500 b 0 229 75 420 0 346 b 1 202 0 220 0 212 b 22 215 12 203 16 209 b 124 327 55 252 89 289 b 147 343 132 337 140 343 b 171 323 156 343 164 336 b 266 197 196 276 232 236 b 337 157 291 170 314 157 b 410 207 361 157 386 174 b 461 274 428 229 444 252 b 462 166 461 238 461 202 b 513 0 465 108 487 55 z',\n },\n ornamentShortTrill: {\n x_min: 0,\n x_max: 747,\n y_min: 0,\n y_max: 243,\n ha: 243,\n o: 'm 379 0 b 428 14 395 0 410 4 b 474 56 445 26 461 39 b 552 157 500 89 526 122 b 566 168 556 163 560 168 b 575 157 569 168 572 166 b 664 36 592 107 628 72 b 733 1 685 13 710 1 b 802 35 757 1 780 13 b 1007 249 871 105 940 177 b 1067 324 1028 272 1054 295 b 1076 340 1068 330 1076 334 b 1073 346 1076 341 1076 343 b 1057 350 1068 348 1063 350 b 1047 347 1053 350 1050 350 b 1001 310 1031 336 1015 324 l 857 157 b 844 143 852 153 848 143 b 835 150 841 143 838 144 b 757 242 815 186 780 209 b 685 298 739 268 713 284 b 641 310 670 305 655 310 b 590 288 625 310 608 304 b 497 179 554 256 527 215 b 480 164 490 170 485 164 b 462 179 474 164 469 168 b 372 295 436 220 405 258 b 278 344 346 324 312 344 b 199 310 252 344 226 334 b 92 196 161 274 128 233 b 0 24 46 148 23 89 b 42 48 22 27 32 37 b 156 168 84 85 114 132 b 196 192 174 184 186 192 b 228 158 206 192 215 181 b 312 36 252 114 282 75 b 379 0 331 12 354 0 z',\n },\n ornamentTremblement: {\n x_min: 0,\n x_max: 982.17691453624,\n y_min: 0,\n y_max: 224,\n ha: 224,\n o: 'm 0 0 b 63 36 30 12 48 23 b 157 124 94 66 125 94 b 177 135 164 131 170 135 b 196 122 183 135 189 131 b 268 40 217 94 245 68 b 323 6 288 16 304 6 b 369 20 336 6 350 10 b 412 53 384 29 399 40 b 501 145 442 84 472 114 b 523 158 508 154 516 158 b 543 145 528 158 536 154 b 641 45 576 112 608 78 b 698 17 658 27 677 17 b 729 23 708 17 719 20 b 804 65 756 32 780 46 b 904 154 837 95 871 124 b 920 163 910 160 916 163 b 936 153 924 163 930 160 b 1024 60 965 121 996 92 b 1112 13 1053 29 1080 13 b 1184 39 1135 13 1158 22 b 1359 194 1248 84 1305 138 b 1413 301 1388 223 1403 261 b 1404 323 1417 315 1413 323 b 1391 320 1400 323 1395 321 b 1344 294 1375 314 1358 307 b 1224 186 1305 258 1269 216 b 1194 173 1212 179 1202 173 b 1165 193 1184 173 1175 179 b 1096 271 1145 222 1122 248 b 1001 318 1061 302 1031 318 b 903 268 969 318 937 301 b 806 186 871 239 841 210 b 782 174 796 179 789 174 b 756 193 773 174 765 180 b 652 291 729 232 693 266 b 596 308 634 302 615 308 b 530 278 573 308 552 298 l 415 168 b 393 157 408 161 400 157 b 373 171 387 157 380 161 b 305 245 353 197 330 222 b 248 276 285 266 266 278 b 189 245 229 276 210 266 b 81 144 156 209 120 174 b 0 0 33 109 26 56 z',\n },\n ornamentPrecompAppoggTrill: {\n x_min: -0.11067192132025548,\n x_max: 1066,\n y_min: -50,\n y_max: 533.1706452421108,\n ha: 583.1706452421108,\n o: 'm 187 -46 b 213 -14 197 -37 204 -26 b 285 151 251 36 266 94 b 304 189 294 177 297 189 b 337 168 311 189 320 181 b 458 33 386 131 415 76 b 495 12 472 19 484 12 b 531 40 508 12 518 22 b 580 168 557 79 569 124 b 622 235 592 213 603 235 b 683 194 636 235 655 222 b 838 26 737 140 791 86 b 919 -33 860 -1 881 -39 b 984 53 960 -27 971 19 b 1022 156 998 86 1008 122 b 1054 190 1032 179 1041 190 b 1089 167 1063 190 1074 183 b 1208 32 1129 122 1171 78 b 1244 10 1221 17 1231 10 b 1273 22 1253 10 1263 14 b 1496 206 1352 78 1427 137 b 1535 310 1526 236 1535 272 b 1531 359 1535 325 1534 343 b 1496 343 1515 360 1506 351 l 1309 192 b 1269 167 1289 176 1279 167 b 1234 199 1260 167 1251 177 b 1122 324 1200 243 1168 289 b 1074 344 1106 337 1089 344 b 1014 301 1051 344 1030 328 b 952 144 985 252 971 197 b 933 121 946 128 940 121 b 910 137 927 121 920 125 b 850 210 888 161 870 186 b 687 369 799 266 750 325 b 631 390 665 383 647 390 b 567 327 602 390 580 369 b 527 199 554 284 543 242 b 508 168 520 179 514 168 b 482 192 503 168 495 177 b 353 328 444 240 405 292 b 312 343 338 338 324 343 b 266 297 292 343 276 327 b 204 125 248 239 232 180 b 143 79 193 102 173 79 b 92 122 117 79 105 102 b 81 154 86 131 84 143 b 48 423 59 242 50 333 b 45 544 46 464 45 504 b 53 730 45 606 48 668 b 40 768 55 744 52 766 b 13 730 19 770 14 747 b 0 514 7 658 -1 586 b 26 122 3 383 6 252 b 75 -36 35 66 40 10 b 134 -72 92 -59 112 -72 b 187 -46 151 -72 170 -63 z',\n },\n ornamentPrecompSlideTrillDAnglebert: {\n x_min: 0,\n x_max: 1088,\n y_min: -380,\n y_max: 252,\n ha: 632,\n o: 'm 560 -539 b 439 -481 527 -497 484 -485 b 354 -461 409 -478 380 -477 b 131 -154 236 -389 161 -285 b 124 -98 127 -135 124 -117 b 196 55 124 -40 148 10 b 308 99 230 86 268 99 b 399 81 337 99 367 92 b 514 22 441 66 477 43 b 619 -30 567 -9 590 -30 b 719 17 642 -30 670 -16 b 861 131 769 52 818 88 b 899 150 874 144 887 150 b 936 117 913 150 926 138 b 965 43 948 94 956 68 b 1007 -1 973 24 978 -1 b 1048 30 1025 -1 1037 16 b 1070 65 1057 40 1064 52 b 1110 148 1084 92 1096 121 b 1145 190 1120 164 1120 190 b 1191 153 1169 192 1179 168 b 1256 29 1218 115 1231 68 b 1292 1 1267 10 1277 1 b 1320 10 1300 1 1309 4 b 1369 48 1339 19 1355 33 b 1515 196 1418 96 1464 148 b 1567 343 1558 238 1567 287 b 1555 363 1565 357 1562 363 b 1539 356 1551 363 1547 360 b 1433 268 1502 330 1466 301 b 1335 171 1401 236 1374 199 b 1310 163 1325 166 1318 163 b 1286 183 1302 163 1293 168 b 1218 311 1264 226 1247 272 b 1164 351 1200 337 1182 351 b 1110 308 1146 351 1128 337 b 1031 176 1084 265 1058 219 b 1015 161 1025 166 1021 161 b 999 179 1009 161 1005 167 b 955 279 985 213 973 248 b 913 307 943 300 930 307 b 887 302 904 307 896 305 b 852 281 874 298 863 291 b 693 167 804 236 747 204 b 612 140 667 150 639 140 b 549 157 592 140 570 145 b 403 220 503 181 452 202 b 271 248 360 236 315 248 b 179 229 239 248 209 242 b 0 -29 65 180 0 85 b 9 -104 0 -53 3 -78 b 397 -526 56 -317 183 -464 b 505 -547 432 -536 468 -547 b 560 -539 524 -547 541 -544 z',\n },\n ornamentPrecompSlideTrillBach: {\n x_min: 0,\n x_max: 1185,\n y_min: -380,\n y_max: 465,\n ha: 845,\n o: 'm 624 -544 b 642 -528 638 -543 642 -537 b 639 -514 642 -524 642 -520 b 590 -444 629 -487 609 -467 b 523 -413 573 -422 553 -410 b 498 -415 514 -415 507 -415 b 399 -389 464 -415 431 -405 b 89 -157 281 -330 176 -255 b 72 -117 78 -144 72 -131 b 73 -101 72 -111 72 -107 b 187 186 91 3 147 91 b 246 230 200 216 222 230 b 300 209 262 230 281 223 b 456 48 359 163 403 101 b 540 -10 494 10 518 -10 b 625 59 566 -10 589 13 b 690 148 648 88 668 118 b 711 167 697 160 704 167 b 733 153 719 167 724 163 b 844 14 769 105 808 60 b 903 -42 873 -23 886 -42 b 973 -1 919 -42 937 -27 b 1008 33 986 7 996 20 b 1048 81 1021 48 1035 65 b 1050 37 1048 66 1050 52 b 1047 -24 1050 17 1048 -3 b 1038 -275 1038 -108 1040 -192 l 1037 -289 b 1045 -302 1037 -295 1038 -301 b 1068 -284 1056 -304 1064 -292 b 1084 -242 1076 -271 1081 -256 b 1099 -109 1096 -199 1099 -154 b 1106 158 1099 -19 1106 71 b 1128 187 1113 167 1120 177 b 1168 223 1143 212 1155 223 b 1210 193 1179 223 1191 213 b 1220 183 1214 190 1215 186 b 1329 36 1261 138 1292 84 b 1374 7 1345 16 1358 7 b 1411 20 1384 7 1395 12 b 1479 84 1437 37 1459 59 b 1610 235 1521 135 1564 186 b 1706 403 1655 282 1695 334 b 1614 346 1663 400 1637 373 b 1464 170 1564 287 1515 228 b 1440 150 1453 156 1447 150 b 1414 173 1433 150 1426 158 b 1283 336 1371 228 1333 288 b 1220 366 1261 356 1240 366 b 1148 318 1194 366 1169 350 b 1103 255 1133 297 1119 275 b 1097 301 1102 271 1100 285 b 1099 334 1099 312 1099 324 b 1092 428 1099 367 1094 397 b 1071 647 1087 501 1079 575 b 1058 670 1071 657 1071 670 b 1035 648 1047 670 1038 661 b 1018 516 1024 605 1015 560 b 1041 203 1025 412 1037 307 b 1043 180 1041 196 1043 187 b 992 127 1027 161 1009 143 b 965 111 981 117 972 111 b 936 132 955 111 946 120 b 829 268 900 179 867 225 b 760 317 801 301 780 317 b 691 258 739 317 719 297 b 605 147 664 219 641 177 b 589 138 599 141 593 138 b 572 148 583 138 579 141 b 415 317 520 206 467 261 b 327 372 390 343 366 366 b 300 373 317 373 308 373 b 154 295 239 373 190 348 b 55 138 120 243 85 192 b 0 -53 22 79 0 13 b 160 -317 0 -156 49 -252 b 209 -354 177 -327 192 -343 b 510 -531 305 -419 397 -495 b 593 -547 537 -540 564 -547 b 624 -544 603 -547 613 -546 z',\n },\n ornamentPrecompTrillSuffixDandrieu: {\n x_min: 0,\n x_max: 1003,\n y_min: -20,\n y_max: 521,\n ha: 541,\n o: 'm 791 -16 b 844 33 812 -3 829 14 b 981 271 900 107 937 190 b 994 288 984 278 985 288 b 1009 269 1004 288 1007 278 b 1077 112 1034 217 1051 163 b 1158 43 1103 62 1129 43 b 1231 69 1179 43 1204 55 b 1348 189 1280 98 1315 143 b 1444 451 1407 271 1444 357 b 1431 547 1444 482 1440 514 b 1188 750 1401 665 1299 750 b 1158 747 1178 750 1168 749 b 1079 684 1119 742 1089 727 b 1063 632 1076 665 1071 648 b 1056 609 1058 622 1056 615 b 1071 599 1056 602 1060 599 b 1086 600 1076 599 1080 600 b 1130 605 1102 603 1116 605 b 1244 569 1171 605 1210 595 b 1349 346 1322 511 1349 433 b 1348 312 1349 334 1349 324 b 1289 197 1345 266 1325 228 b 1238 174 1270 181 1253 174 b 1188 215 1220 174 1202 187 b 1145 308 1172 245 1159 276 b 1096 413 1129 343 1120 382 b 1053 438 1084 431 1068 438 b 1011 413 1038 438 1022 431 b 955 324 989 384 971 354 b 850 127 920 258 886 192 b 838 112 847 121 842 112 b 824 128 828 109 825 121 b 802 193 815 150 809 171 b 730 400 779 264 766 337 b 688 431 719 420 703 431 b 647 403 674 431 660 422 b 606 338 632 383 619 361 b 513 167 575 282 546 223 b 480 122 503 150 498 122 b 452 171 459 122 459 153 b 420 255 442 199 432 228 b 337 408 399 308 380 364 b 276 436 317 428 297 436 b 215 397 253 436 230 423 b 23 72 148 289 81 184 b 0 29 17 59 0 40 b 7 17 0 23 1 20 b 59 58 26 7 46 39 b 190 276 111 127 143 206 b 216 301 202 292 207 301 b 245 279 223 301 232 294 b 311 166 278 248 292 206 b 367 16 331 117 346 65 b 402 -19 377 -7 387 -19 b 438 -4 412 -19 423 -13 b 518 88 474 17 495 55 b 628 284 562 150 592 216 b 657 223 648 266 651 243 b 717 13 677 154 696 84 b 755 -29 726 -16 737 -29 b 791 -16 765 -29 776 -24 z',\n },\n ornamentPrecompDoubleCadenceUpperPrefix: {\n x_min: 0,\n x_max: 1246,\n y_min: -30,\n y_max: 296.0302860502196,\n ha: 326.0302860502196,\n o: 'm 360 -43 b 559 59 445 -43 503 7 b 698 236 615 111 652 179 b 714 248 704 243 710 248 b 727 235 719 248 721 243 l 848 42 b 883 12 860 22 870 12 b 917 32 891 12 903 19 b 946 62 927 42 939 50 b 1037 192 972 108 1009 147 b 1057 210 1044 204 1051 210 b 1076 190 1063 210 1068 203 l 1176 12 b 1215 -19 1188 -9 1201 -19 b 1250 -6 1225 -19 1237 -14 b 1284 27 1264 3 1274 16 b 1380 190 1323 78 1351 135 b 1395 210 1384 197 1385 210 b 1413 190 1405 210 1410 197 b 1508 40 1436 134 1467 85 b 1564 3 1529 14 1547 3 b 1617 32 1580 3 1597 12 b 1767 238 1678 92 1719 167 b 1794 310 1781 259 1791 282 b 1752 294 1776 317 1764 304 b 1656 164 1711 258 1689 206 b 1629 144 1646 151 1637 144 b 1603 161 1620 144 1613 150 b 1502 315 1562 207 1525 258 b 1452 357 1490 344 1470 357 b 1397 320 1431 357 1411 344 b 1316 170 1368 271 1345 219 b 1280 127 1306 154 1303 127 b 1244 171 1256 127 1254 154 b 1145 337 1210 226 1179 282 b 1110 363 1135 354 1122 363 b 1070 338 1097 363 1084 354 b 1050 311 1063 330 1057 320 b 959 181 1017 271 992 223 b 939 167 950 173 945 167 b 920 184 933 167 927 173 b 818 343 887 238 852 291 b 759 395 795 377 778 395 b 701 344 742 395 724 377 b 698 338 700 341 700 340 b 544 154 652 272 605 207 b 412 98 501 117 458 98 b 304 130 377 98 341 108 b 95 373 204 187 144 275 b 58 426 85 393 82 428 b 19 366 26 426 26 389 b 0 307 13 346 0 327 b 4 287 0 300 1 294 b 174 36 49 194 91 102 b 360 -43 230 -9 289 -43 z',\n },\n ornamentPrecompDoubleCadenceUpperPrefixTurn: {\n x_min: 0,\n x_max: 1226,\n y_min: -237,\n y_max: 436,\n ha: 673,\n o: 'm 1279 -341 b 1293 -252 1293 -307 1295 -278 b 1277 36 1287 -156 1282 -59 l 1273 118 b 1318 176 1289 137 1303 157 b 1349 203 1332 193 1342 203 b 1378 168 1359 203 1367 192 b 1456 35 1401 122 1428 78 b 1511 -12 1476 3 1493 -12 b 1568 23 1526 -12 1544 0 b 1597 53 1578 32 1588 42 b 1705 186 1629 101 1669 143 b 1761 284 1728 216 1751 246 b 1765 300 1763 288 1765 295 b 1763 307 1765 302 1765 305 b 1737 302 1754 311 1744 308 b 1718 287 1729 298 1725 292 b 1598 145 1673 245 1637 194 b 1578 130 1590 135 1584 130 b 1557 147 1571 130 1565 135 b 1447 321 1516 202 1488 265 b 1403 351 1433 341 1417 351 b 1358 323 1388 351 1372 341 b 1269 209 1329 285 1299 248 b 1254 521 1264 314 1259 418 b 1228 616 1253 554 1247 588 b 1218 628 1224 621 1223 628 l 1215 628 b 1201 613 1210 626 1202 619 b 1200 600 1200 609 1200 605 l 1200 586 b 1211 348 1204 507 1207 428 b 1217 166 1214 288 1215 226 b 1202 181 1212 168 1208 174 b 1094 334 1168 233 1130 284 b 1048 366 1079 356 1064 366 b 1004 331 1034 366 1018 354 b 904 154 969 275 930 220 b 873 202 887 171 880 187 b 778 356 845 256 819 311 b 737 379 763 372 750 379 b 698 353 724 379 711 370 l 621 232 b 415 114 570 154 495 114 b 302 138 377 114 340 121 b 73 400 187 192 117 284 b 55 420 69 415 62 420 b 42 410 50 420 45 416 b 0 292 23 373 0 334 b 4 262 0 282 1 272 b 168 39 32 168 92 99 b 359 -26 225 -6 292 -26 b 585 76 446 -26 530 10 b 668 202 616 115 641 160 b 693 228 680 219 687 228 b 720 203 700 228 707 219 b 801 63 752 160 775 111 b 844 7 812 42 818 7 b 910 66 877 6 894 39 b 923 94 916 75 919 85 b 995 219 945 137 968 179 b 1025 184 1009 210 1017 197 b 1119 56 1054 141 1087 98 b 1166 20 1138 32 1152 20 b 1215 50 1181 20 1195 30 b 1221 56 1217 52 1218 55 b 1228 -163 1223 -17 1225 -89 b 1279 -341 1231 -223 1251 -278 z',\n },\n ornamentPrecompTrillLowerSuffix: {\n x_min: 0,\n x_max: 833,\n y_min: -309,\n y_max: 319,\n ha: 628,\n o: 'm 778 -444 b 801 -445 785 -444 793 -445 b 1037 -338 894 -445 969 -397 b 1200 37 1149 -240 1200 -109 b 1084 406 1200 171 1172 300 b 1024 444 1064 431 1043 444 b 960 390 999 444 978 426 b 841 163 923 314 886 236 b 812 128 832 150 827 128 b 786 167 796 130 793 153 b 660 418 744 251 716 341 b 599 459 639 445 619 459 b 541 410 577 459 557 444 b 439 197 507 340 474 269 b 422 179 435 190 435 179 b 338 393 392 251 379 328 b 275 439 320 423 298 439 b 212 396 253 439 230 425 b 71 219 170 333 128 268 b 0 45 17 173 16 112 b 68 98 32 62 50 78 b 194 264 112 150 153 209 b 230 292 209 282 219 292 b 264 261 240 292 251 282 b 274 242 268 255 269 248 b 346 46 304 179 325 112 b 376 10 351 32 354 10 b 412 35 392 10 403 22 b 452 107 429 56 441 82 b 541 291 481 168 511 230 b 556 307 547 302 552 307 b 573 295 562 307 567 302 b 624 217 595 272 611 246 b 721 1 657 145 685 72 b 755 -27 732 -19 742 -27 b 786 -16 765 -27 775 -24 b 857 73 819 7 840 39 b 952 256 887 134 920 194 b 978 289 963 279 969 289 b 1009 262 985 289 994 281 b 1030 235 1017 253 1024 245 b 1110 -4 1071 161 1099 81 b 1116 -68 1113 -26 1116 -48 b 1009 -243 1116 -140 1090 -200 b 848 -291 956 -272 901 -291 b 730 -261 809 -291 770 -282 b 696 -248 714 -252 703 -248 b 671 -284 684 -248 678 -258 l 662 -312 b 657 -357 658 -330 657 -344 b 744 -439 657 -403 683 -425 z',\n },\n brassScoop: {\n x_min: -0.4444444444444445,\n x_max: 312,\n y_min: -390,\n y_max: 28,\n ha: 418,\n o: 'm 0 -562 b 393 -256 171 -504 307 -412 b 449 -39 431 -189 449 -115 b 448 -1 449 -26 449 -14 b 433 40 446 14 448 40 b 408 -3 410 40 412 14 b 396 -66 403 -23 402 -46 b 45 -397 346 -243 209 -337 b 0 -451 13 -409 1 -423 b 0 -562 -1 -485 0 -520 z',\n },\n brassDoitMedium: {\n x_min: -0.32815253965710617,\n x_max: 476.21251177608565,\n y_min: -50,\n y_max: 333.1535583875376,\n ha: 383.1535583875376,\n o: 'm 16 -72 b 27 -71 19 -72 23 -72 b 215 -33 89 -56 153 -48 b 521 114 327 -7 435 35 b 685 432 615 199 691 295 b 670 480 684 449 688 475 b 642 441 654 482 648 456 b 403 183 599 321 513 240 b 79 89 301 130 192 105 b 0 -1 -12 76 0 76 b 0 -50 0 -17 1 -33 b 16 -72 0 -65 3 -72 z',\n },\n brassFallLipShort: {\n x_min: 0,\n x_max: 298,\n y_min: -344,\n y_max: 65,\n ha: 409,\n o: 'm 396 -495 b 420 -461 412 -487 418 -474 b 429 -382 428 -435 429 -409 b 426 -330 429 -364 428 -347 b 285 -6 410 -209 356 -104 b 98 94 239 59 173 94 b 39 86 79 94 58 92 b 0 49 20 81 0 73 l 0 -52 b 10 -69 0 -62 1 -69 b 20 -68 13 -69 16 -69 b 88 -56 45 -59 66 -56 b 261 -160 156 -56 213 -95 b 396 -495 333 -259 382 -369 z',\n },\n brassLiftMedium: {\n x_min: 0,\n x_max: 807,\n y_min: 0,\n y_max: 838,\n ha: 838,\n o: 'm 50 0 b 55 1 52 0 53 0 b 58 23 65 7 59 16 b 55 58 56 36 55 48 b 130 117 55 99 75 112 b 220 213 202 121 220 141 b 315 308 220 289 238 308 l 336 308 b 408 380 393 310 406 321 b 461 452 409 438 416 452 b 485 451 468 452 477 451 b 569 510 531 448 556 464 b 573 543 572 520 572 531 b 657 619 580 605 595 618 b 698 621 670 619 684 619 b 788 700 749 625 778 649 b 798 778 792 726 793 752 b 873 857 806 841 809 845 b 985 950 927 867 973 887 b 1084 1047 1002 1035 1004 1034 b 1162 1128 1133 1056 1162 1087 b 1146 1182 1162 1145 1158 1164 b 1125 1207 1140 1191 1136 1207 l 1122 1207 b 1110 1191 1113 1205 1110 1198 b 1112 1174 1110 1185 1112 1178 b 1048 1110 1109 1126 1096 1113 b 1028 1109 1043 1110 1035 1109 b 939 1022 969 1102 948 1081 b 845 922 929 949 917 936 b 746 812 773 909 753 886 b 744 780 744 802 744 791 b 635 681 737 700 717 683 b 524 583 553 680 536 665 b 439 510 514 520 503 510 b 357 431 377 510 360 492 l 357 406 b 314 364 356 379 343 364 b 238 361 288 364 264 364 b 173 300 202 357 180 334 b 167 245 168 281 167 262 b 105 174 166 192 157 180 b 75 171 95 173 85 171 b 6 112 30 166 14 153 b 0 73 1 98 0 85 b 37 10 0 45 13 26 b 50 0 42 7 46 0 z',\n },\n brassFallRoughMedium: {\n x_min: 0,\n x_max: 791,\n y_min: 0,\n y_max: 819,\n ha: 819,\n o: 'm 1117 0 b 1139 101 1129 26 1139 71 b 1138 121 1139 109 1139 115 b 1084 193 1125 171 1110 193 b 1044 183 1073 193 1060 189 b 1022 177 1035 179 1028 177 b 1007 209 1012 177 1008 186 b 876 324 1004 292 959 330 b 799 317 850 321 825 320 b 759 354 772 314 755 320 b 760 373 760 360 760 366 b 759 392 760 379 760 384 b 681 477 753 451 730 477 b 654 474 672 477 664 475 b 606 467 638 471 622 468 b 586 465 599 465 592 465 b 564 481 570 465 564 469 b 569 505 564 487 566 495 b 575 553 572 521 575 537 b 572 585 575 564 573 575 b 481 665 560 657 539 668 b 412 665 458 664 435 665 b 382 690 392 667 382 672 b 383 700 382 693 383 696 b 386 773 387 724 387 749 b 297 858 382 828 351 857 b 229 861 274 858 251 858 b 190 897 207 863 193 871 b 163 1012 186 936 180 976 b 79 1084 145 1050 124 1084 b 66 1083 75 1084 71 1083 b 43 1096 49 1081 43 1087 b 48 1112 43 1100 45 1106 b 53 1130 52 1119 53 1125 b 39 1169 53 1145 45 1158 b 26 1179 36 1175 30 1179 b 16 1171 22 1179 17 1176 b 0 1103 10 1149 0 1126 b 9 1067 0 1092 1 1079 b 91 1021 26 1031 52 1018 b 145 978 122 1024 141 1011 b 156 913 147 956 151 935 b 291 795 170 831 210 795 b 346 768 337 795 346 796 b 344 743 346 760 344 753 b 343 716 344 733 343 724 b 455 600 343 651 390 602 b 505 605 471 599 490 605 b 528 598 514 605 523 603 b 536 579 534 592 536 586 b 524 523 536 562 526 541 b 523 505 524 517 523 511 b 621 405 523 442 560 405 b 639 406 626 405 634 406 b 677 413 652 408 664 410 b 701 416 687 415 696 416 b 721 392 716 416 721 410 b 720 373 721 386 720 380 b 831 255 714 301 759 252 b 897 261 854 255 876 261 b 926 262 909 261 919 262 b 969 197 963 262 965 252 b 971 184 969 193 971 189 b 1031 115 979 137 998 115 b 1071 122 1043 115 1056 118 b 1096 130 1079 125 1086 127 b 1087 59 1094 107 1087 82 b 1117 0 1087 37 1094 17 z',\n },\n brassBend: {\n x_min: 0,\n x_max: 381,\n y_min: 0,\n y_max: 367,\n ha: 367,\n o: 'm 298 0 b 472 50 359 0 418 14 b 537 135 501 71 530 92 b 543 216 543 163 543 190 l 543 266 b 544 308 543 281 543 295 b 549 433 546 354 549 395 b 543 507 549 459 547 482 b 533 528 541 516 544 528 b 511 508 524 528 514 520 b 508 478 510 498 508 488 b 504 318 507 425 504 372 b 505 264 504 300 505 282 b 446 181 505 220 484 199 b 294 150 396 160 344 150 b 92 194 226 150 158 167 b 45 269 62 207 45 230 b 46 359 46 300 46 328 b 37 497 46 405 45 451 b 27 523 36 507 37 523 b 4 498 14 524 6 513 b 3 481 3 492 3 487 b 0 409 1 456 0 433 b 4 228 0 348 4 288 b 3 177 4 210 4 194 b 68 53 1 125 20 84 b 200 10 108 27 154 17 b 298 0 233 4 266 0 z',\n },\n brassMuteClosed: {\n x_min: 0,\n x_max: 274,\n y_min: 0,\n y_max: 260,\n ha: 260,\n o: 'm 203 0 b 209 1 206 0 207 0 b 216 13 215 4 216 9 l 215 27 l 215 153 b 216 161 216 156 216 158 b 372 164 268 163 318 164 b 395 184 383 164 395 166 l 395 189 b 357 229 392 209 386 229 b 219 228 311 229 265 228 l 223 310 b 209 357 225 328 219 344 b 189 374 203 364 197 374 b 184 373 187 374 186 373 b 177 359 179 372 177 366 l 177 348 l 173 222 l 39 222 b 0 206 12 222 0 219 b 10 174 0 199 3 189 b 46 157 19 157 30 157 b 108 160 68 158 88 160 b 171 161 130 161 150 161 l 167 58 b 184 16 167 40 171 26 b 203 0 192 12 196 0 z',\n },\n brassMuteOpen: {\n x_min: 1,\n x_max: 313.01193341111656,\n y_min: 0,\n y_max: 309,\n ha: 309,\n o: 'm 265 0 b 451 189 363 7 452 88 l 451 215 b 348 383 441 285 405 343 b 209 445 288 426 248 445 b 84 379 168 445 132 420 b 69 364 79 373 73 369 b 1 213 30 323 1 275 b 230 0 1 88 94 0 z m 210 62 b 128 73 181 62 154 66 b 40 171 71 91 42 125 b 52 226 40 187 45 206 b 197 374 79 295 130 344 b 228 382 207 380 217 382 b 300 361 252 382 276 370 b 374 308 328 350 353 331 b 410 223 397 284 410 253 b 393 163 410 202 405 181 b 210 62 354 91 288 63 z',\n },\n brassFlip: {\n x_min: 0,\n x_max: 402,\n y_min: 0,\n y_max: 361,\n ha: 361,\n o: 'm 579 0 b 511 153 579 68 557 117 b 52 504 359 271 206 387 b 29 520 45 510 39 520 b 20 517 26 520 23 518 b 0 477 3 510 0 494 l 0 125 b 17 20 1 92 1 56 b 40 84 37 40 40 60 b 42 287 40 151 42 219 l 42 363 z',\n },\n brassJazzTurn: {\n x_min: 0,\n x_max: 646,\n y_min: 0,\n y_max: 212,\n ha: 212,\n o: 'm 310 0 b 367 33 327 0 344 10 b 389 55 374 40 382 49 b 490 145 423 85 456 114 b 507 154 495 151 501 154 b 524 144 513 154 517 151 b 598 72 547 120 575 98 b 700 24 625 42 662 24 b 765 43 721 24 744 30 b 893 147 812 72 855 105 b 930 212 910 166 923 186 b 912 215 923 213 917 215 b 871 199 896 215 883 209 b 812 153 852 183 832 167 b 789 144 805 148 796 144 b 773 156 782 144 776 147 b 691 251 757 199 720 222 b 603 301 658 282 631 301 b 527 258 580 301 556 288 b 420 156 494 222 455 190 b 399 143 412 147 405 143 b 377 157 392 143 386 147 b 259 282 340 200 300 242 b 219 305 245 298 232 305 b 177 279 204 305 192 297 b 55 127 137 228 95 177 b 0 52 36 104 20 79 b 14 50 6 50 10 50 b 53 66 32 50 45 58 b 115 131 75 88 98 108 b 135 148 124 143 130 148 b 157 132 141 148 148 143 b 252 33 186 96 219 65 b 310 0 275 12 292 0 z',\n },\n brassSmear: {\n x_min: 0,\n x_max: 334,\n y_min: 0,\n y_max: 151,\n ha: 151,\n o: 'm 321 0 b 475 125 390 0 436 43 b 481 143 478 131 481 137 b 475 154 481 147 480 151 b 449 148 468 158 458 154 b 395 132 432 137 413 132 b 343 140 377 132 360 137 b 229 194 301 148 266 173 b 168 217 206 209 186 217 b 109 192 148 217 130 209 b 0 26 59 148 32 89 b 59 63 32 29 45 48 b 98 84 72 78 84 84 b 130 73 108 84 118 81 b 213 26 157 58 183 37 b 321 0 255 9 289 0 z',\n },\n stringsDownBow: {\n x_min: 0,\n x_max: 306,\n y_min: -0.09607201951262866,\n y_max: 366,\n ha: 366.09607201951263,\n o: 'm 405 0 b 425 17 413 -1 420 9 b 439 66 435 32 439 48 b 441 268 439 137 441 202 b 436 412 441 314 439 361 l 435 413 b 423 469 435 436 431 456 b 344 508 406 501 373 501 b 204 527 298 520 251 527 b 60 498 156 527 108 518 b 7 438 32 485 10 468 l 7 426 b 4 337 7 396 7 367 b 0 140 0 272 0 206 b 1 42 0 107 0 73 b 13 3 1 27 -3 4 b 40 39 29 3 35 24 b 42 53 42 43 40 49 b 49 141 48 84 49 112 b 48 215 49 167 48 192 b 49 252 48 228 48 240 l 49 312 b 130 343 72 331 99 340 b 206 347 156 346 180 347 b 372 314 262 347 318 338 l 390 307 l 390 245 b 390 138 392 212 390 176 b 397 23 390 101 392 62 b 405 0 399 14 393 1 z',\n },\n stringsUpBow: {\n x_min: 0,\n x_max: 219.2842808242076,\n y_min: 0,\n y_max: 489,\n ha: 489,\n o: 'm 151 0 b 184 42 170 12 180 26 b 297 554 223 212 261 382 b 315 690 305 598 318 645 b 304 704 315 697 311 704 b 276 670 288 704 282 697 b 157 131 236 490 196 311 l 157 144 b 73 526 134 276 104 396 b 30 677 60 576 52 638 b 13 694 26 684 22 694 b 0 674 9 694 0 691 l 0 671 b 10 603 3 649 6 626 b 105 174 42 461 72 317 b 150 0 117 117 128 58 z',\n },\n stringsHarmonic: {\n x_min: 0,\n x_max: 191,\n y_min: 0,\n y_max: 202,\n ha: 202,\n o: 'm 143 0 b 275 122 217 0 275 53 b 127 291 275 206 202 291 b 0 154 63 291 0 222 b 143 0 0 76 71 0 z m 122 68 b 43 105 89 66 59 75 b 39 124 40 111 39 117 b 79 199 39 148 56 180 b 145 226 101 216 122 226 b 199 210 163 226 180 220 b 235 150 223 196 235 173 b 203 92 235 128 225 107 b 122 68 181 76 150 68 z',\n },\n pluckedSnapPizzicatoAbove: {\n x_min: 0,\n x_max: 201,\n y_min: 0,\n y_max: 325,\n ha: 325,\n o: 'm 171 0 b 289 99 240 0 289 45 b 258 183 289 130 274 156 b 174 269 236 217 203 240 l 174 408 b 174 429 174 415 176 422 b 131 468 168 451 153 468 b 117 451 120 468 117 461 b 118 429 117 444 118 435 b 115 307 117 389 115 347 b 0 166 59 295 0 223 b 171 0 0 85 89 0 z m 134 55 b 52 131 84 55 52 85 b 115 233 52 179 81 209 b 114 192 114 220 114 206 b 174 120 114 137 114 137 l 174 228 b 233 148 200 207 223 183 b 236 130 235 143 236 135 b 197 72 236 105 223 85 b 134 55 177 60 157 55 z',\n },\n pluckedSnapPizzicatoBelow: {\n x_min: 0,\n x_max: 211,\n y_min: 0,\n y_max: 307,\n ha: 307,\n o: 'm 145 7 b 163 0 153 3 158 0 b 173 23 170 0 173 7 l 173 140 l 170 140 l 170 163 l 171 163 b 206 170 179 164 193 166 b 304 287 264 186 304 233 b 281 354 304 308 297 333 b 118 442 240 412 186 439 b 0 324 69 442 0 370 b 115 176 0 266 55 202 l 115 56 b 145 7 114 33 125 19 z m 115 220 b 62 256 92 223 73 230 b 53 292 56 269 53 281 b 78 344 53 311 60 328 b 168 384 105 372 135 384 b 213 376 183 384 199 382 b 253 321 239 366 253 346 b 246 291 253 311 251 301 b 170 226 230 256 203 236 l 170 258 b 148 305 171 278 163 292 b 128 315 143 310 135 315 l 124 315 b 115 301 117 314 115 308 z',\n },\n pluckedLeftHandPizzicato: {\n x_min: 0,\n x_max: 271,\n y_min: 0,\n y_max: 284,\n ha: 284,\n o: 'm 213 0 b 223 14 222 0 223 7 b 222 35 223 22 222 29 l 222 176 b 373 170 272 174 323 170 b 390 180 382 170 390 171 l 390 184 b 347 232 386 207 382 232 b 219 238 307 233 266 235 l 219 364 b 171 409 219 395 193 409 b 156 393 160 409 156 402 b 158 370 156 384 158 376 l 158 240 b 16 239 115 240 66 239 b 0 226 7 239 0 238 l 0 223 b 50 179 1 203 29 179 b 158 177 86 179 122 179 l 158 63 b 161 29 158 52 158 40 b 213 0 166 -1 194 1 z',\n },\n keyboardPedalPed: {\n x_min: 0,\n x_max: 944,\n y_min: -13,\n y_max: 550,\n ha: 563,\n o: 'm 22 0 b 109 78 53 0 105 46 l 144 333 b 163 376 147 347 140 372 b 364 465 238 390 301 426 b 454 599 416 497 454 540 b 452 618 454 605 454 612 b 320 770 442 694 396 747 b 248 779 295 778 272 779 b 193 778 229 779 212 779 b 160 780 181 778 167 775 b 137 792 153 789 144 791 b 109 789 128 792 118 789 b 7 719 59 789 48 737 b 23 708 16 714 20 708 b 36 710 29 710 33 710 b 53 684 52 710 53 698 l 53 674 b 43 386 53 577 53 482 b 20 164 36 312 30 238 b 1 30 14 120 7 75 b 0 19 0 26 0 22 b 22 0 0 9 4 0 z m 171 425 b 156 442 160 425 156 429 b 157 475 157 452 157 464 b 164 602 161 517 164 560 b 161 698 164 635 163 667 b 184 729 161 720 167 729 l 193 729 b 348 563 278 719 348 641 b 346 539 348 554 347 547 b 171 425 328 459 229 422 z m 979 6 b 1008 13 986 6 995 9 b 1081 101 1047 29 1079 46 b 1116 449 1087 217 1104 333 b 1143 654 1123 518 1133 586 b 1148 685 1145 664 1148 675 b 1140 704 1148 693 1146 700 b 1107 716 1130 713 1119 716 b 1056 706 1092 716 1073 710 b 1037 671 1035 703 1038 685 b 1004 439 1025 595 1014 517 b 986 419 1001 428 999 419 b 979 419 985 419 982 420 b 935 426 965 423 949 425 b 795 376 884 426 838 405 b 664 153 714 323 664 249 b 665 130 664 145 665 138 b 753 29 671 65 704 29 b 815 40 773 29 792 33 b 975 147 873 65 923 101 b 965 45 971 108 968 76 b 979 6 963 17 966 6 z m 393 -17 b 634 145 494 16 579 52 b 638 160 636 151 638 156 b 625 168 638 166 634 168 b 621 167 624 168 622 168 b 524 118 582 164 544 160 b 495 79 517 104 505 92 b 435 33 471 49 452 33 b 380 96 416 33 397 55 b 369 145 373 114 369 131 b 442 225 369 186 395 213 b 468 232 451 228 459 229 b 654 344 539 255 606 285 b 677 395 667 360 677 376 b 672 415 677 402 675 408 b 612 459 661 442 639 455 b 589 461 602 461 592 461 b 348 328 500 461 409 408 b 269 120 302 268 269 199 b 379 -19 269 45 318 -19 b 393 -17 383 -19 389 -19 z m 395 240 b 494 383 418 300 452 344 l 521 405 b 544 419 528 409 536 418 b 554 415 547 419 550 418 b 570 383 564 406 570 396 l 570 379 b 552 331 570 360 562 344 b 395 240 511 285 462 253 z m 827 89 b 792 111 815 89 804 96 b 766 204 775 131 766 158 b 845 360 772 256 799 314 b 871 372 854 369 863 372 b 897 366 880 372 888 369 b 978 279 942 353 963 320 b 976 259 981 272 981 265 b 858 104 942 203 909 147 b 827 89 847 94 837 89 z m 1282 12 b 1336 35 1303 14 1320 23 b 1359 71 1351 45 1359 58 b 1338 102 1359 82 1352 95 b 1254 130 1312 118 1284 130 b 1187 88 1223 130 1202 109 b 1178 65 1182 81 1178 72 b 1195 37 1178 55 1182 45 b 1282 12 1223 23 1253 19 z',\n },\n keyboardPedalUp: {\n x_min: 0,\n x_max: 436.6015132318337,\n y_min: 0,\n y_max: 461,\n ha: 461,\n o: 'm 330 0 b 334 1 331 0 333 0 b 340 12 338 4 340 7 l 338 26 b 340 264 338 105 338 184 b 526 95 400 206 461 148 b 559 71 536 88 547 71 b 564 72 560 71 563 71 b 580 121 580 79 580 102 l 580 127 b 543 203 585 158 573 184 b 472 259 518 219 495 238 l 445 285 b 590 292 494 288 541 291 b 622 318 609 294 618 302 b 628 359 625 331 626 346 b 586 402 632 393 621 405 b 464 395 546 399 504 396 l 559 491 b 567 524 567 500 567 510 b 564 543 567 527 567 536 b 539 596 559 563 560 590 b 494 564 521 600 508 577 b 340 413 442 514 390 464 l 340 560 b 287 664 340 600 321 632 b 271 518 274 612 272 566 b 268 445 269 494 269 469 b 117 569 219 488 168 530 b 96 579 109 575 102 579 b 85 560 89 579 85 573 b 124 446 85 518 82 477 b 209 380 153 426 181 403 b 45 374 154 377 99 376 b 0 324 9 374 0 359 b 63 266 0 265 1 265 b 144 272 89 269 117 272 l 196 272 b 108 193 167 246 138 219 b 60 135 76 164 60 151 b 99 73 60 121 73 105 b 104 68 101 72 102 71 b 114 58 107 60 111 58 b 130 66 120 58 124 62 b 259 186 173 107 217 145 b 256 117 259 163 256 140 b 311 13 256 72 271 37 b 330 0 317 10 323 0 z',\n },\n pictChokeCymbal: {\n x_min: 1,\n x_max: 147,\n y_min: 0,\n y_max: 242,\n ha: 242,\n o: 'm 79 4 b 207 158 153 32 192 88 b 212 200 210 173 212 187 b 143 336 212 253 187 298 b 98 348 131 344 115 348 b 4 295 60 348 16 327 b 1 276 1 289 1 282 b 9 249 1 266 3 258 b 121 183 35 206 72 183 b 156 186 132 183 144 183 b 26 53 134 115 91 73 b 7 39 13 49 7 45 b 19 20 7 33 12 27 b 59 0 30 9 43 0 b 79 4 65 0 72 1 z',\n },\n wiggleArpeggiatoUp: {\n x_min: -22,\n x_max: 300,\n y_min: 0,\n y_max: 176,\n ha: 176,\n o: 'm 173 4 b 196 0 180 1 189 0 b 246 26 215 0 230 9 b 301 117 271 53 285 85 b 312 131 305 125 307 131 b 327 124 315 131 321 128 b 373 86 341 112 353 101 b 412 69 389 75 402 69 b 432 94 425 69 432 79 b 373 181 432 117 413 154 b 235 252 323 216 285 245 b 220 253 229 253 225 253 b 168 215 196 253 181 240 b 111 112 151 180 140 141 b 94 102 105 105 99 102 b 78 111 89 102 84 105 b 0 181 55 135 35 160 b -32 153 -20 194 -32 168 b 0 86 -32 124 -32 109 b 94 36 22 71 73 46 b 173 4 134 16 131 17 z',\n },\n arpeggiatoUp: {\n x_min: 0,\n x_max: 262,\n y_min: 0,\n y_max: 1459,\n ha: 1459,\n o: 'm 190 0 b 160 63 187 29 170 45 b 145 108 150 81 145 95 b 183 163 145 128 157 145 b 300 246 222 190 262 216 b 347 318 333 272 347 295 b 301 393 347 341 331 364 b 258 413 289 403 272 408 b 145 449 220 425 183 436 b 117 464 135 452 120 452 b 140 491 115 477 128 484 b 294 593 192 526 243 557 b 330 647 318 611 330 626 b 314 693 330 660 324 675 b 262 736 302 714 285 729 b 170 763 230 744 200 753 b 122 783 153 768 125 768 b 160 831 120 804 143 818 b 288 922 202 861 246 890 b 333 999 318 945 333 972 b 266 1083 333 1032 310 1064 b 189 1115 240 1094 215 1103 b 122 1178 145 1133 122 1153 b 168 1250 122 1200 138 1223 l 180 1257 b 269 1333 210 1283 240 1306 b 305 1405 294 1356 305 1381 b 284 1469 305 1426 298 1447 b 228 1525 269 1492 251 1511 b 183 1600 197 1545 183 1571 b 190 1640 183 1613 184 1626 b 197 1670 193 1650 194 1660 b 272 1735 213 1719 230 1735 b 295 1734 279 1735 287 1735 b 323 1732 305 1732 314 1732 b 350 1731 333 1732 341 1732 b 377 1742 369 1729 377 1732 b 370 1761 377 1747 374 1754 l 301 1898 b 217 2066 274 1954 248 2012 b 186 2101 204 2089 196 2101 b 154 2069 177 2101 167 2091 b 12 1824 105 1987 59 1907 b 0 1787 4 1810 0 1797 b 59 1744 0 1761 20 1745 b 160 1738 92 1744 125 1740 b 145 1692 156 1721 151 1706 b 135 1633 138 1672 135 1652 b 184 1518 135 1591 151 1552 b 229 1475 199 1503 213 1488 b 259 1431 249 1456 259 1444 b 229 1388 259 1420 249 1407 b 151 1325 203 1365 177 1345 b 105 1279 134 1310 118 1296 b 73 1202 84 1251 73 1227 b 108 1123 73 1176 85 1152 b 255 1031 148 1077 199 1051 b 282 1014 274 1025 282 1021 b 262 991 282 1008 275 1001 b 151 914 226 963 189 939 b 79 851 125 896 99 877 b 63 809 69 837 63 824 b 79 769 63 796 68 783 b 202 697 111 729 154 710 b 266 670 225 690 266 688 b 210 622 266 648 232 635 b 82 534 167 593 120 570 b 55 491 63 518 55 505 b 79 448 55 478 63 465 b 255 361 127 395 192 380 b 288 343 269 359 288 357 b 266 312 288 331 275 320 b 144 223 229 278 184 253 b 85 134 104 193 85 166 b 118 53 85 111 96 85 b 190 0 135 29 160 14 z',\n },\n arpeggiatoDown: {\n x_min: 0,\n x_max: 218,\n y_min: 0,\n y_max: 1440,\n ha: 1440,\n o: 'm 161 16 b 310 261 210 98 259 180 b 314 275 312 266 314 271 b 302 295 314 282 310 289 b 252 311 287 308 269 311 b 217 310 240 311 229 310 b 190 333 202 310 194 315 b 151 412 186 363 171 389 b 102 501 120 452 102 477 b 150 588 102 524 118 547 b 161 603 154 592 158 598 b 181 661 176 622 181 641 b 173 704 181 675 179 690 b 86 795 156 746 121 770 b 53 829 63 811 53 819 b 78 868 53 840 62 851 b 102 888 85 876 94 883 b 180 956 128 912 156 933 b 216 1028 204 979 216 1002 b 203 1081 216 1044 212 1061 b 115 1171 186 1123 148 1145 b 75 1221 88 1191 75 1207 b 114 1272 75 1237 88 1251 b 173 1308 132 1284 154 1296 b 226 1339 190 1318 209 1328 b 265 1405 253 1359 265 1380 b 258 1447 265 1418 264 1431 b 154 1541 242 1499 199 1521 b 109 1581 124 1555 109 1567 b 141 1627 109 1594 121 1608 b 204 1680 163 1646 184 1662 b 233 1742 223 1699 233 1719 b 226 1777 233 1752 230 1764 b 135 1862 210 1822 173 1840 b 104 1895 114 1875 104 1884 b 118 1930 104 1904 109 1914 b 192 2006 135 1961 161 1986 b 206 2029 203 2013 206 2022 b 192 2064 206 2040 197 2052 b 180 2074 187 2071 184 2074 b 156 2061 171 2074 163 2065 b 84 1983 125 2040 102 2013 b 65 1921 71 1961 65 1941 b 88 1853 65 1899 72 1876 b 171 1784 108 1820 138 1801 b 190 1764 184 1777 190 1770 b 174 1741 190 1757 184 1750 b 107 1683 153 1722 128 1704 b 68 1610 81 1659 68 1636 b 88 1548 68 1591 75 1571 b 177 1470 109 1512 141 1489 b 223 1431 209 1453 223 1443 b 179 1390 223 1420 209 1408 b 128 1361 163 1380 145 1371 b 71 1322 108 1348 88 1338 b 32 1253 45 1300 32 1277 b 48 1198 32 1236 37 1218 b 147 1090 71 1152 108 1120 b 174 1057 166 1076 174 1067 b 153 1022 174 1047 167 1037 b 109 982 140 1008 124 995 b 37 919 85 962 59 942 b 9 860 17 899 9 880 b 26 806 9 844 14 827 b 120 717 50 769 84 740 b 138 691 132 708 138 700 b 130 668 138 684 135 677 b 92 618 118 651 105 635 b 59 531 71 589 59 560 b 84 455 59 507 68 481 b 132 386 98 431 115 408 b 148 341 144 372 148 357 b 144 317 148 333 147 324 b 121 305 140 307 131 305 l 98 305 b 82 304 94 304 88 304 l 32 304 b 0 292 10 304 0 302 b 12 266 0 287 4 279 b 60 164 32 233 46 199 b 127 20 84 117 105 68 b 144 0 132 9 137 0 b 161 16 150 0 154 4 z',\n },\n repeat1Bar: {\n x_min: 0,\n x_max: 599.1057280164835,\n y_min: -250,\n y_max: 175,\n ha: 425,\n o: 'm 216 98 b 255 75 236 84 246 75 b 291 104 265 75 274 85 b 323 147 304 117 327 125 b 289 215 323 168 314 184 b 238 252 269 239 253 252 b 187 222 222 252 207 242 b 173 206 183 216 177 212 b 157 170 163 194 157 183 b 174 138 157 160 161 150 b 216 98 189 127 200 109 z m 76 -334 b 181 -285 111 -315 148 -302 b 831 52 396 -168 613 -58 b 863 114 855 63 864 82 b 828 202 855 140 855 176 b 808 213 821 209 815 213 b 793 209 804 213 799 212 l 422 19 b 26 -179 291 -48 164 -124 b 0 -213 10 -186 0 -196 b 3 -232 0 -219 0 -225 b 52 -325 14 -265 37 -294 b 66 -337 55 -331 59 -337 b 76 -334 69 -337 72 -336 z m 769 -360 b 829 -264 779 -360 829 -284 b 769 -176 822 -232 799 -200 b 742 -163 760 -167 750 -163 b 716 -184 733 -163 723 -168 b 683 -228 708 -202 693 -213 b 672 -253 675 -236 672 -245 b 683 -281 672 -262 675 -271 b 752 -353 703 -308 732 -327 b 769 -360 756 -357 763 -360 z',\n },\n repeat2Bars: {\n x_min: 0.008571918423331715,\n x_max: 775,\n y_min: -246.92374029115243,\n y_max: 362.82068246705313,\n ha: 609.7444227582056,\n o: 'm 909 412 b 873 351 906 384 893 367 b 436 50 729 249 585 147 l 91 -179 b 62 -174 76 -189 68 -183 b 12 -96 48 -147 24 -125 b 36 -16 -7 -53 -6 -43 b 220 104 96 24 158 65 b 819 507 425 232 624 369 b 881 495 852 530 861 528 b 909 412 899 469 900 439 z m 333 338 b 302 240 330 307 317 274 b 276 235 297 225 287 228 l 233 269 b 203 376 186 307 183 318 b 225 441 212 397 217 419 b 246 454 228 452 232 458 b 333 338 284 441 333 380 z m 1116 228 b 1067 158 1115 192 1092 174 b 910 59 1015 125 963 92 b 478 -240 762 -33 622 -140 b 311 -350 423 -279 366 -314 b 285 -344 298 -360 289 -356 b 239 -258 272 -314 251 -288 b 261 -196 228 -228 235 -210 b 517 -29 348 -144 436 -91 b 1030 321 681 98 861 202 b 1093 307 1060 343 1076 340 b 1116 228 1107 281 1109 252 z m 1070 -105 b 1020 -210 1057 -143 1038 -176 b 998 -210 1014 -219 1004 -215 l 924 -153 b 913 -88 899 -135 897 -112 b 949 -22 926 -66 939 -45 b 998 -7 960 6 976 9 b 1070 -105 1032 -32 1058 -63 z',\n },\n repeat4Bars: {\n x_min: 0,\n x_max: 1374,\n y_min: -304,\n y_max: 304,\n ha: 608,\n o: 'm 78 -266 b 92 -258 82 -266 88 -264 b 114 -240 98 -251 107 -246 b 638 107 289 -125 467 -14 b 873 271 716 161 793 216 b 907 337 894 285 906 305 b 887 400 901 354 897 379 b 852 438 877 426 867 438 b 814 420 842 438 829 432 b 135 -33 592 262 366 111 b 12 -121 92 -60 48 -84 b 0 -144 4 -128 0 -135 b 4 -160 0 -148 1 -154 b 63 -255 17 -196 45 -223 b 78 -266 68 -262 72 -266 z m 291 148 b 325 223 302 148 308 170 b 333 256 328 235 330 246 b 264 363 330 305 298 336 b 242 373 255 369 248 373 b 220 347 232 373 225 364 b 202 288 216 327 213 305 b 190 252 193 275 190 262 b 222 200 190 232 202 215 b 291 148 264 170 279 148 z m 815 -367 b 829 -359 819 -367 824 -364 b 851 -343 835 -353 844 -347 b 1375 6 1027 -228 1205 -117 l 1610 170 b 1644 235 1632 184 1643 203 b 1626 300 1639 253 1634 276 b 1590 337 1614 325 1604 337 b 1551 320 1580 337 1567 330 b 873 -135 1329 161 1103 10 b 749 -222 829 -161 785 -184 b 737 -245 742 -230 737 -238 b 742 -261 737 -249 739 -255 b 802 -357 755 -297 782 -325 b 815 -367 805 -363 809 -367 z m 396 -360 b 408 -356 400 -360 403 -359 b 609 -223 471 -307 543 -269 b 896 -19 706 -156 795 -81 b 1164 154 985 37 1074 96 b 1214 223 1189 170 1211 187 b 1176 321 1204 253 1205 292 b 1159 330 1169 327 1165 330 b 1145 324 1155 330 1151 328 b 1048 258 1113 302 1081 278 b 357 -202 809 117 598 -65 b 333 -238 341 -212 333 -223 b 338 -262 333 -245 334 -253 b 384 -350 350 -294 372 -318 b 396 -360 386 -354 390 -360 z m 1162 -438 b 1174 -433 1166 -438 1169 -436 b 1374 -300 1237 -384 1309 -346 b 1660 -96 1470 -233 1561 -158 b 1930 76 1751 -39 1840 19 b 1979 147 1954 92 1977 109 b 1943 243 1968 177 1971 216 b 1924 253 1935 251 1930 253 b 1911 248 1920 253 1915 252 b 1814 181 1878 225 1848 202 b 1123 -279 1575 40 1364 -141 b 1099 -315 1106 -289 1099 -300 b 1103 -338 1099 -321 1100 -330 b 1149 -426 1115 -370 1138 -396 b 1162 -438 1151 -432 1156 -438 z m 1875 -295 b 1882 -291 1878 -295 1879 -294 b 1934 -189 1904 -258 1921 -223 b 1872 -96 1925 -147 1901 -120 b 1840 -78 1858 -84 1848 -78 b 1812 -109 1830 -78 1823 -88 l 1777 -173 b 1770 -199 1773 -181 1770 -190 b 1786 -230 1770 -210 1774 -220 b 1862 -289 1809 -253 1837 -269 b 1875 -295 1865 -292 1871 -295 z',\n },\n repeatBarSlash: {\n x_min: 0,\n x_max: 630,\n y_min: -225.19160170741762,\n y_max: 265.12618221237005,\n ha: 490.31778391978764,\n o: 'm 78 -324 b 92 -314 82 -325 88 -321 b 114 -298 96 -307 107 -302 b 638 49 289 -183 467 -72 b 873 215 716 104 792 161 b 907 279 894 229 906 248 b 887 344 901 298 897 321 b 852 382 877 369 867 380 b 814 363 842 383 829 376 b 135 -91 603 192 364 55 b 12 -177 92 -118 45 -137 b 0 -202 4 -186 0 -192 b 4 -217 0 -206 1 -212 b 63 -312 17 -253 42 -284 b 78 -324 68 -318 72 -323 z',\n },\n csymDiminished: {\n x_min: 0,\n x_max: 506,\n y_min: -0.011036179317259481,\n y_max: 500,\n ha: 500.0110361793173,\n o: 'm 397 0 b 729 265 576 -1 729 95 b 711 367 729 297 723 331 b 472 670 668 498 586 595 b 315 720 423 701 372 720 b 253 713 295 720 275 719 b 32 514 144 687 75 615 b 0 374 12 468 0 420 b 27 251 0 333 9 292 b 140 117 52 196 92 153 b 397 0 223 52 317 4 z m 340 95 b 132 314 233 84 122 216 b 324 589 145 438 200 539 b 415 611 360 603 389 611 b 544 505 469 611 505 576 b 590 392 564 471 583 432 b 596 343 593 374 596 359 b 340 95 596 210 485 96 z',\n },\n csymHalfDiminished: {\n x_min: -32,\n x_max: 496,\n y_min: -33,\n y_max: 492,\n ha: 525,\n o: 'm -29 -48 b 0 -36 -19 -48 -9 -40 b 17 -20 7 -32 12 -24 b 134 94 56 19 95 56 b 372 0 207 43 282 0 b 455 13 397 0 426 4 b 677 258 556 45 671 141 b 678 289 677 268 678 278 b 593 539 678 380 654 467 b 592 541 593 540 592 540 l 684 632 b 713 678 700 647 711 665 b 714 691 714 684 714 688 b 707 704 714 698 711 701 b 691 708 701 707 696 708 b 660 691 680 708 670 701 l 552 585 b 478 634 530 606 507 624 b 361 684 438 648 397 661 b 301 703 341 697 320 703 b 226 677 275 703 251 693 b 27 449 140 618 72 543 b 0 324 9 410 -4 370 b 88 128 -1 243 30 177 b -30 -7 43 86 0 46 b -46 -33 -35 -16 -46 -24 b -42 -42 -46 -36 -45 -39 b -29 -48 -37 -46 -33 -48 z m 141 179 b 121 251 128 200 121 225 b 128 297 121 265 124 281 b 351 575 163 420 248 505 b 377 582 359 579 369 580 b 501 536 422 586 468 567 b 141 179 382 416 261 298 z m 281 105 b 179 137 240 105 206 117 b 210 168 189 147 200 157 l 537 487 b 547 455 541 477 544 467 b 556 370 552 426 556 397 b 429 154 556 274 503 207 b 281 105 384 122 336 105 z',\n },\n csymAugmented: {\n x_min: 0,\n x_max: 530,\n y_min: 0,\n y_max: 539,\n ha: 539,\n o: 'm 380 0 b 393 14 384 4 390 9 b 397 46 397 24 397 36 l 397 333 b 736 327 511 331 624 330 b 763 343 755 327 763 333 b 755 361 763 348 760 354 b 635 431 726 402 688 431 l 390 431 l 390 485 b 386 606 392 526 386 566 b 392 664 386 625 387 645 b 395 690 393 672 395 681 b 376 753 395 711 389 734 b 357 776 372 762 369 776 b 350 775 354 776 353 776 b 327 740 337 769 327 759 b 327 621 328 700 327 661 b 330 438 328 559 328 498 l 29 438 b 4 431 20 438 7 442 b 0 413 3 425 0 419 b 7 399 0 408 1 403 b 131 338 45 369 85 340 b 331 334 199 336 265 334 b 333 163 333 276 333 220 b 366 13 333 109 348 63 b 380 0 367 7 374 4 z',\n },\n csymMajorSeventh: {\n x_min: 0,\n x_max: 593.1050509327923,\n y_min: 0,\n y_max: 569,\n ha: 569,\n o: 'm 124 1 l 497 27 b 819 50 605 35 711 43 b 854 98 847 52 855 63 b 812 200 845 128 835 166 b 564 585 730 328 648 456 b 435 786 521 652 480 720 b 397 819 419 809 408 819 b 369 792 387 819 379 811 b 7 173 248 585 128 379 b 0 150 3 166 0 158 b 7 128 0 143 3 135 b 89 10 30 86 65 50 b 109 0 95 1 102 0 z m 163 147 b 153 153 158 147 156 148 b 164 179 147 163 158 170 b 426 644 251 334 338 488 b 442 660 432 655 436 660 b 458 645 446 660 452 655 b 727 220 547 503 636 361 b 736 202 732 213 736 206 b 714 190 736 196 730 192 b 179 148 537 177 359 163 b 163 147 174 150 168 147 z',\n },\n csymMinor: {\n x_min: 0,\n x_max: 481.64484584675915,\n y_min: 193,\n y_max: 265.20435472429375,\n ha: 72.20435472429375,\n o: 'm 168 278 b 197 279 177 278 187 278 b 431 292 275 287 353 288 l 431 291 b 661 302 508 295 585 300 b 693 311 672 304 688 300 b 674 346 697 324 685 338 b 564 382 641 366 606 384 l 27 360 b 0 347 17 360 1 366 b 19 314 0 333 3 321 b 168 278 66 291 115 278 z',\n },\n csymParensLeftTall: {\n x_min: 0,\n x_max: 185,\n y_min: 0,\n y_max: 1034,\n ha: 1034,\n o: 'm 215 0 b 226 17 223 1 223 10 b 229 37 229 24 229 32 b 220 81 229 52 225 66 b 167 203 206 124 181 160 b 86 616 124 338 89 474 b 82 765 85 665 82 716 b 91 886 82 805 84 845 b 245 1319 120 1038 171 1184 b 266 1397 259 1346 266 1371 b 259 1443 266 1411 264 1427 b 226 1489 253 1463 248 1489 b 193 1454 212 1489 203 1467 b 114 1292 158 1404 140 1346 b 0 806 40 1138 0 978 b 3 721 0 779 0 750 b 1 677 1 707 1 693 b 36 418 1 593 16 504 b 144 96 62 307 95 199 b 196 12 158 66 179 39 b 212 0 200 7 204 0 z',\n },\n csymParensRightTall: {\n x_min: -40,\n x_max: 188.5411603861406,\n y_min: 0.20204102886728756,\n y_max: 1058,\n ha: 1057.7979589711326,\n o: 'm 30 1 b 63 14 42 -3 55 6 b 122 99 86 40 108 68 b 189 258 145 153 166 204 b 271 667 239 379 268 503 b 246 852 275 708 261 780 b 10 1495 197 1077 128 1295 b -14 1524 4 1505 1 1524 b -16 1522 -14 1524 -16 1524 b -46 1489 -33 1521 -43 1503 b -58 1417 -53 1464 -58 1440 b -36 1335 -58 1390 -52 1364 b 68 1138 0 1270 35 1204 b 163 883 108 1056 137 969 b 206 668 184 814 200 742 b 207 631 207 655 207 642 b 166 426 207 560 192 492 b 46 143 130 330 111 228 b 19 29 19 109 17 69 b 30 1 20 19 24 3 z',\n },\n csymBracketLeftTall: {\n x_min: 0,\n x_max: 328,\n y_min: 2,\n y_max: 807,\n ha: 805,\n o: 'm 68 3 b 76 4 71 3 73 3 b 186 13 112 12 150 13 b 240 13 204 13 222 13 l 287 13 b 379 17 317 13 348 13 b 472 121 435 24 472 69 b 467 156 472 132 469 144 b 446 174 462 168 456 174 l 439 174 b 327 166 402 167 364 166 b 265 167 307 166 285 167 l 209 167 b 187 475 199 269 189 372 b 166 985 186 645 187 815 l 377 1002 b 415 1001 389 1002 402 1001 b 456 1027 432 1001 448 1005 b 472 1096 467 1048 472 1073 b 464 1146 472 1113 469 1130 b 439 1162 459 1161 452 1162 b 40 1129 305 1151 173 1139 b 1 1093 17 1128 1 1120 b 0 1009 0 1064 0 1037 b 13 975 0 991 3 981 b 30 670 23 873 30 772 b 29 608 30 649 29 628 l 29 563 b 56 88 29 405 49 246 b 53 22 55 66 55 43 b 68 3 53 12 56 3 z',\n },\n csymBracketRightTall: {\n x_min: 0.8519422934604696,\n x_max: 306,\n y_min: -0.17180889215212544,\n y_max: 829.1037519824849,\n ha: 829.2755608746371,\n o: 'm 117 0 b 372 29 203 -3 287 20 l 373 29 b 406 32 383 30 395 30 b 436 60 428 33 432 43 b 441 109 439 76 441 92 b 433 200 441 140 436 170 b 409 696 422 366 409 530 b 416 887 409 763 416 831 b 415 920 416 899 415 910 l 415 1106 b 412 1135 415 1116 415 1126 l 412 1145 b 373 1189 413 1171 408 1192 b 321 1189 356 1189 338 1189 l 215 1189 l 215 1194 l 56 1194 b 6 1153 27 1195 10 1187 b 1 1064 3 1123 4 1093 b 22 1043 0 1050 6 1043 b 84 1044 42 1044 63 1044 b 264 1038 144 1044 203 1040 b 265 958 264 1011 265 985 b 262 845 265 920 264 883 b 259 710 259 801 259 755 b 279 243 259 554 271 399 b 285 170 281 219 284 194 b 95 151 222 161 158 156 b 29 81 27 147 27 147 l 29 73 b 105 0 33 0 33 0 z',\n },\n csymParensLeftVeryTall: {\n x_min: 0,\n x_max: 116,\n y_min: 0,\n y_max: 934.1531437146923,\n ha: 934.1531437146923,\n o: 'm 128 0 b 147 17 137 0 144 9 b 167 102 160 45 167 73 b 158 154 167 120 164 137 b 117 307 141 204 130 256 b 63 698 84 435 71 567 b 62 788 62 729 62 757 b 69 916 62 829 63 873 b 109 1172 81 1001 94 1087 b 132 1320 118 1221 137 1269 b 124 1345 131 1329 134 1342 b 96 1332 114 1346 102 1341 b 71 1269 82 1313 75 1292 b 39 1104 59 1214 48 1159 b 0 742 19 988 0 871 b 10 559 3 688 6 624 b 58 226 16 446 33 336 b 112 20 73 157 94 89 b 128 0 115 13 118 0 z',\n },\n csymParensRightVeryTall: {\n x_min: -20,\n x_max: 111.4332498248095,\n y_min: -0.07657185734616112,\n y_max: 1009,\n ha: 1009.0765718573462,\n o: 'm -3 0 b 20 22 9 -1 14 12 b 36 56 26 33 32 45 b 99 274 58 128 84 199 b 160 788 135 439 163 605 b 122 1181 164 912 145 1047 b 50 1431 108 1267 86 1351 b 36 1453 48 1439 46 1453 l 35 1453 l 30 1453 b 7 1423 17 1449 7 1440 b 27 1287 9 1377 10 1331 b 96 963 71 1184 85 1074 b 105 818 102 914 105 867 b 91 624 105 753 99 688 b -4 213 72 484 48 344 b -29 101 -19 174 -29 138 b -16 27 -29 76 -24 52 b -3 0 -13 17 -14 3 z',\n },\n csymDiagonalArrangementSlash: {\n x_min: -0.19862981551275186,\n x_max: 990,\n y_min: -26.946823529189132,\n y_max: 1027.5514326488437,\n ha: 1054.4982561780328,\n o: 'm 14 -37 b 58 -9 35 -45 46 -22 b 392 333 170 105 279 217 l 765 711 b 1372 1329 968 916 1168 1125 b 1424 1439 1403 1359 1417 1397 b 1426 1457 1424 1444 1426 1450 b 1416 1477 1426 1466 1423 1475 b 1374 1462 1400 1485 1385 1473 b 1181 1269 1309 1397 1246 1331 b 736 831 1031 1122 884 979 b 356 452 609 704 485 576 b 32 132 246 347 143 236 b 0 50 7 109 1 84 b 6 9 -1 37 3 23 b 14 -37 10 -9 0 -32 z',\n },\n accidentalNarrowReversedFlat: {\n x_min: 0,\n x_max: 208,\n y_min: -231,\n y_max: 449,\n ha: 680,\n o: 'm 272 -333 b 284 -320 278 -333 281 -328 b 300 -174 297 -272 300 -222 b 275 190 298 -52 279 68 b 268 445 272 275 268 360 l 268 490 b 264 612 269 530 265 572 b 236 647 264 632 252 645 l 235 647 b 217 618 220 647 220 628 b 207 526 210 588 207 556 b 210 432 207 494 210 464 b 216 268 213 377 215 323 l 216 230 l 215 232 b 154 256 194 240 174 251 b 111 264 138 261 124 264 b 3 153 50 264 10 223 b 0 94 0 132 0 114 b 194 -276 0 -63 68 -186 b 255 -323 215 -291 236 -307 b 272 -333 262 -330 268 -333 z m 233 -138 b 71 30 168 -92 105 -45 b 63 59 65 42 63 50 b 96 95 62 75 73 86 b 130 102 108 99 120 102 b 215 76 160 102 187 88 l 220 73 b 225 -22 220 42 222 10 b 233 -138 229 -62 230 -101 z',\n },\n accidentalNarrowReversedFlatAndFlat: {\n x_min: 0,\n x_max: 335,\n y_min: -231,\n y_max: 449,\n ha: 680,\n o: 'm 151 490 b 148 612 151 530 150 572 b 132 647 148 632 141 645 b 122 618 124 647 124 628 b 117 526 118 588 117 556 b 118 432 117 494 118 464 b 121 268 120 377 121 323 l 121 232 b 86 256 109 240 98 251 b 62 264 78 261 69 264 b 1 153 29 264 6 223 b 0 94 0 132 0 114 b 109 -276 0 -63 37 -186 b 144 -323 121 -291 132 -307 b 153 -333 147 -330 151 -333 b 160 -320 157 -333 158 -328 b 168 -174 167 -272 168 -222 b 154 190 168 -52 157 68 b 151 445 153 275 151 360 z m 480 153 b 372 264 472 223 432 264 b 328 256 359 264 344 261 b 268 232 308 251 288 240 l 266 230 l 266 268 b 272 432 266 323 269 377 b 275 526 272 464 275 494 b 265 618 275 556 272 588 b 248 647 262 628 262 647 l 246 647 b 219 612 230 645 219 632 b 215 490 217 572 213 530 l 215 445 b 207 190 215 360 210 275 b 183 -174 203 68 183 -52 b 199 -320 183 -222 186 -272 b 210 -333 202 -328 204 -333 b 228 -323 215 -333 220 -330 b 288 -276 246 -307 268 -291 b 482 94 415 -186 482 -63 b 480 153 482 114 482 132 z m 40 30 b 36 59 36 42 36 50 b 55 95 35 75 42 86 b 73 102 60 99 68 102 b 121 76 89 102 105 88 l 124 73 b 127 -22 124 42 125 10 l 131 -138 b 40 30 95 -92 60 -43 z m 419 59 b 412 30 419 50 418 42 b 249 -138 374 -43 314 -92 b 258 -22 252 -101 253 -62 b 262 73 261 10 262 42 l 268 76 b 353 102 295 88 323 102 b 386 95 363 102 374 99 b 419 59 409 86 420 75 z',\n },\n accidentalWilsonPlus: {\n x_min: 0,\n x_max: 298,\n y_min: -218,\n y_max: 218,\n ha: 436,\n o: 'm 232 -314 b 236 -301 236 -310 236 -305 l 236 -295 b 243 -52 239 -213 242 -132 l 369 62 b 429 200 413 101 425 147 b 416 243 429 216 428 236 b 383 225 406 251 393 232 l 377 220 b 246 98 336 177 291 138 b 249 242 248 145 246 193 b 225 304 251 265 242 287 b 209 314 220 308 215 314 b 204 312 207 314 206 312 b 196 292 196 310 196 300 b 193 184 194 256 194 220 b 187 48 192 140 190 94 b 46 -72 141 7 94 -32 b 0 -163 13 -98 0 -127 b 1 -187 0 -170 0 -179 b 10 -235 4 -203 6 -219 b 20 -255 12 -242 14 -251 b 36 -245 26 -259 30 -249 b 181 -109 85 -200 132 -154 b 176 -258 180 -158 176 -209 b 232 -314 176 -298 186 -307 z',\n },\n accidentalWilsonMinus: {\n x_min: 0,\n x_max: 284.2093390143919,\n y_min: -163,\n y_max: 163,\n ha: 326,\n o: 'm 386 -232 b 409 -163 415 -222 408 -180 b 382 -69 410 -120 408 -89 b 32 228 264 30 141 118 b 17 235 26 233 22 235 b 3 219 9 235 3 228 b 0 157 3 199 0 179 b 29 69 0 125 6 95 b 323 -194 115 -29 222 -111 b 374 -235 338 -206 353 -235 b 386 -232 377 -235 382 -233 z',\n },\n },\n fontFamily: 'Petaluma',\n resolution: 1000,\n generatedOn: '2021-12-06T21:04:23.441Z',\n};\n","/**\n * The Petaluma font was created by Steinberg Media.\n * https://github.com/steinbergmedia/petaluma\n */\nexport const PetalumaMetrics = {\n name: 'Petaluma',\n smufl: true,\n stave: {\n padding: 15,\n endPaddingMax: 15,\n endPaddingMin: 7,\n unalignedNotePadding: 12,\n },\n accidental: {\n noteheadAccidentalPadding: 1,\n leftPadding: 2,\n accidentalSpacing: 3,\n },\n clef: {\n default: {\n point: 32,\n width: 26,\n },\n small: {\n point: 26,\n width: 20,\n },\n annotations: {\n '8va': {\n smuflCode: 'timeSig8',\n default: {\n point: 18,\n treble: {\n line: -1.4,\n shiftX: 12,\n },\n },\n small: {\n point: 16,\n treble: {\n line: -0.2,\n shiftX: 8,\n },\n },\n },\n '8vb': {\n smuflCode: 'timeSig8',\n default: {\n point: 18,\n treble: {\n line: 6,\n shiftX: 10,\n },\n bass: {\n line: 3.5,\n shiftX: 1,\n },\n },\n small: {\n point: 16,\n treble: {\n line: 5.3,\n shiftX: 6,\n },\n bass: {\n line: 3.1,\n shiftX: 0.5,\n },\n },\n },\n },\n // These may no longer be necessary\n lineCount: {\n '8': { point: 55, shiftY: 14 },\n '7': { point: 47, shiftY: 8 },\n '6': { point: 32, shiftY: 1 },\n '5': { point: 30, shiftY: -6 },\n '4': { point: 23, shiftY: -12 },\n },\n },\n parenthesis: {\n default: {\n point: 39,\n width: 7,\n },\n gracenote: {\n point: (39 * 3) / 5,\n width: 3,\n },\n },\n pedalMarking: {\n up: {\n point: 40,\n },\n down: {\n point: 34,\n },\n },\n // These are for numeric digits, such as in time signatures\n digits: {\n // used by timesig\n shiftLine: -1,\n point: 22,\n // used by tuplets\n tupletPoint: 16,\n shiftY: -2,\n },\n articulation: {\n articStaccatissimoAbove: {\n padding: 2,\n },\n articStaccatissimoBelow: {\n padding: 2,\n },\n },\n tremolo: {\n default: {\n point: 25,\n spacing: 5,\n offsetYStemUp: -5,\n offsetYStemDown: 5,\n offsetXStemUp: 13,\n offsetXStemDown: 1,\n },\n grace: {\n point: 18,\n spacing: 4,\n offsetYStemUp: -5,\n offsetYStemDown: 5,\n offsetXStemUp: 8,\n offsetXStemDown: 1,\n },\n },\n staveRepetition: {\n default: {\n offsetY: 25,\n offsetSymbol: 12,\n spacing: 5,\n },\n },\n noteHead: {\n displaced: {\n shiftX: -2,\n },\n },\n stem: {\n heightAdjustmentForFlag: -3,\n // These are stem (Y) offsets to the note heads. To shift the\n // noteheads (x-position) themselves, see glyphs.notehead.custom.\n noteHead: {\n noteheadTriangleUpHalf: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpBlack: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpWhole: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadXHalf: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXBlack: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXWhole: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadHalf: {\n offsetYBaseStemDown: 1.8,\n offsetYBaseStemUp: -1.8,\n },\n noteheadBlack: {\n offsetYBaseStemDown: 2,\n offsetYBaseStemUp: -2,\n },\n noteheadSquareWhite: {\n offsetYBaseStemDown: -5,\n offsetYBaseStemUp: 5,\n },\n },\n },\n // Values under here are used by the Glyph class to reposition and rescale\n // glyphs based on their category. This should be the first stop for\n // custom font glyph repositioning.\n //\n // The glyph loader first looks up a specific set of settings based on the\n // glyph code, and if not found, uses the defaults from the category. See\n // glyphs.textNote for an example of this.\n //\n // Details in Glyph.lookupFontMetrics.\n glyphs: {\n coda: {\n point: 20,\n shiftX: -7,\n shiftY: 8,\n },\n segno: {\n shiftX: -7,\n },\n flag: {\n shiftX: -0.77,\n flag16thUp: {\n shiftX: -0.75,\n },\n flag32ndUp: {\n shiftX: -0.85,\n },\n flag64thUp: {\n shiftX: -1.55,\n },\n flag128thUp: {\n shiftX: -1.3,\n },\n flag16thDown: {\n shiftX: -0.75,\n },\n flag32ndDown: {\n shiftX: -0.76,\n },\n flag64thDown: {\n shiftX: -1.5,\n },\n flag128thDown: {\n shiftX: -1.2,\n },\n tabStem: {\n shiftX: -1.75,\n },\n staveTempo: {\n shiftX: -1,\n },\n },\n clef: {\n gClef: {\n default: { scale: 1.1, shiftY: 1 },\n small: { shiftY: 1.5 },\n },\n fClef: {\n default: { shiftY: -0.5 },\n },\n },\n ornament: {\n ornamentTurn: {\n scale: 1.2,\n },\n ornamentTurnSlash: {\n scale: 1.2,\n },\n },\n stringNumber: {\n verticalPadding: 8,\n stemPadding: 2,\n leftPadding: 5,\n rightPadding: 6,\n },\n stroke: {\n arrowheadBlackDown: {\n straight: {\n shiftX: -4.5,\n },\n wiggly: {\n shiftX: -1,\n shiftY: 1,\n },\n },\n arrowheadBlackUp: {\n straight: {\n shiftX: -0.85,\n },\n wiggly: {\n shiftX: -1,\n shiftY: 1,\n },\n },\n },\n textNote: {\n point: 34,\n breathMarkTick: {\n point: 36,\n shiftY: 9,\n },\n breathMarkComma: {\n point: 36,\n },\n segno: {\n point: 30,\n shiftX: -7,\n shiftY: 8,\n },\n coda: {\n point: 20,\n shiftX: -7,\n shiftY: 8,\n },\n ornamentTrill: {\n shiftX: -10,\n shiftY: 8,\n },\n ornamentMordent: {\n shiftX: -8,\n },\n ornamentShortTrill: {\n shiftX: -8,\n },\n },\n noteHead: {\n minPadding: 2,\n standard: {\n noteheadBlackStemUp: {\n shiftX: 0.5,\n },\n noteheadHalfStemUp: {\n shiftX: 0.725,\n },\n noteheadWholeStemUp: {\n shiftX: 1,\n },\n },\n custom: {\n noteheadCircleXStemUp: {\n shiftX: -1,\n },\n noteheadCircleXStemDown: {\n shiftX: 0.25,\n },\n noteheadDiamondHalfStemUp: {\n shiftX: 1.5,\n },\n noteheadDiamondBlackStemUp: {\n shiftX: 1.5,\n },\n noteheadDiamondWholeStemUp: {\n shiftX: 1,\n },\n noteheadXBlackStemUp: {\n shiftX: 1,\n },\n noteheadXHalfStemUp: {\n shiftX: -3,\n },\n noteheadXHalfStemDown: {\n shiftX: 1,\n },\n noteheadXWholeStemUp: {\n shiftX: -7,\n },\n noteheadXWholeStemDown: {\n shiftX: 1,\n },\n noteheadSquareWhiteStemDown: {\n shiftX: 0.25,\n },\n noteheadSquareWhiteStemUp: {\n shiftX: -0.75,\n },\n noteheadSquareBlackStemUp: {\n shiftX: -0.75,\n },\n noteheadTriangleUpWholeStemUp: {\n shiftX: -0.75,\n },\n },\n },\n chordSymbol: {\n global: {\n superscriptOffset: -400,\n subscriptOffset: 300,\n kerningOffset: -150,\n lowerKerningText: ['D', 'F', 'P', 'T', 'V', 'Y'],\n upperKerningText: ['L'],\n spacing: 20,\n superSubRatio: 0.73,\n },\n csymDiminished: {\n scale: 0.8,\n leftSideBearing: -95,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymHalfDiminished: {\n scale: 0.8,\n leftSideBearing: -32,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymAugmented: {\n scale: 1,\n leftSideBearing: -25,\n advanceWidth: 530,\n yOffset: 0,\n },\n csymParensLeftTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 155,\n yOffset: 150,\n },\n csymParensRightTall: {\n scale: 0.8,\n leftSideBearing: 40,\n advanceWidth: 189,\n yOffset: 150,\n },\n csymBracketLeftTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 328,\n yOffset: 0,\n },\n csymBracketRightTall: {\n scale: 0.8,\n leftSideBearing: 1,\n advanceWidth: 600,\n yOffset: 0,\n },\n csymParensLeftVeryTall: {\n scale: 0.95,\n leftSideBearing: 0,\n advanceWidth: 210,\n yOffset: 250,\n },\n csymParensRightVeryTall: {\n scale: 0.9,\n leftSideBearing: -100,\n advanceWidth: 111,\n yOffset: 250,\n },\n csymDiagonalArrangementSlash: {\n scale: 0.6,\n leftSideBearing: -1,\n advanceWidth: 990,\n yOffset: 0,\n },\n csymMinor: {\n scale: 0.7,\n leftSideBearing: 0,\n advanceWidth: 482,\n yOffset: 0,\n },\n csymMajorSeventh: {\n scale: 0.8,\n leftSideBearing: 100,\n yOffset: 0,\n advanceWidth: 600,\n },\n accidentalSharp: {\n scale: 0.7,\n leftSideBearing: 0,\n advanceWidth: 425,\n yOffset: -422,\n },\n accidentalFlat: {\n scale: 0.8,\n leftSideBearing: -10,\n advanceWidth: 228,\n yOffset: -284,\n },\n },\n jazzOrnaments: {\n brassScoop: {\n scale: 1.0,\n xOffset: -12,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 10,\n },\n brassDoitMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassFallLipShort: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassLiftMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 5,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassFallRoughMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 26,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassBend: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -8,\n stemUpYOffset: 28,\n reportedWidth: 5,\n },\n brassMuteClosed: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -8,\n stemUpYOffset: 26,\n reportedWidth: 5,\n },\n brassMuteOpen: {\n scale: 1.0,\n xOffset: 4,\n yOffset: -8,\n stemUpYOffset: 27,\n reportedWidth: 5,\n },\n brassFlip: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassJazzTurn: {\n scale: 1.0,\n xOffset: 6,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassSmear: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n },\n tuplet: {\n noteHeadOffset: 20,\n stemOffset: 10,\n bottomLine: 4,\n topModifierOffset: 20,\n },\n },\n};\n","export const PetalumaScriptFont = {\n spacing: 50,\n glyphs: {\n ' ': {\n x_min: 0,\n x_max: 250,\n y_min: 0,\n y_max: 500,\n ha: 500,\n leftSideBearing: 0,\n advanceWidth: 250,\n },\n '0': {\n x_min: 33,\n x_max: 534,\n y_min: -13,\n y_max: 751,\n ha: 764,\n leftSideBearing: 33,\n advanceWidth: 570,\n },\n '1': {\n x_min: 48,\n x_max: 235,\n y_min: -17,\n y_max: 734,\n ha: 751,\n leftSideBearing: 48,\n advanceWidth: 286,\n },\n '2': {\n x_min: 56,\n x_max: 571,\n y_min: -19,\n y_max: 741,\n ha: 760,\n leftSideBearing: 56,\n advanceWidth: 626,\n },\n '3': {\n x_min: 50,\n x_max: 528,\n y_min: -7,\n y_max: 731,\n ha: 738,\n leftSideBearing: 50,\n advanceWidth: 589,\n },\n '4': {\n x_min: 38,\n x_max: 564,\n y_min: -13,\n y_max: 743,\n ha: 756,\n leftSideBearing: 38,\n advanceWidth: 614,\n },\n '5': {\n x_min: 42,\n x_max: 601,\n y_min: -34,\n y_max: 743,\n ha: 777,\n leftSideBearing: 42,\n advanceWidth: 648,\n },\n '6': {\n x_min: 47,\n x_max: 606,\n y_min: -16,\n y_max: 743,\n ha: 759,\n leftSideBearing: 47,\n advanceWidth: 667,\n },\n '7': {\n x_min: 47,\n x_max: 567,\n y_min: 5,\n y_max: 739,\n ha: 734,\n leftSideBearing: 0,\n advanceWidth: 615,\n },\n '8': {\n x_min: 40,\n x_max: 541,\n y_min: -15,\n y_max: 752,\n ha: 767,\n leftSideBearing: 40,\n advanceWidth: 585,\n },\n '9': {\n x_min: 40,\n x_max: 537,\n y_min: -52,\n y_max: 736,\n ha: 788,\n leftSideBearing: 40,\n advanceWidth: 592,\n },\n '!': {\n x_min: 49,\n x_max: 180,\n y_min: -7,\n y_max: 761,\n ha: 768,\n leftSideBearing: 49,\n advanceWidth: 230,\n },\n '\"': {\n x_min: 39,\n x_max: 304,\n y_min: 596,\n y_max: 804,\n ha: 208,\n leftSideBearing: 39,\n advanceWidth: 353,\n },\n '#': {\n x_min: 33,\n x_max: 599,\n y_min: -8,\n y_max: 765,\n ha: 773,\n leftSideBearing: 33,\n advanceWidth: 648,\n },\n $: {\n x_min: 53,\n x_max: 495,\n y_min: -111,\n y_max: 823,\n ha: 934,\n leftSideBearing: 53,\n advanceWidth: 560,\n },\n '%': {\n x_min: 35,\n x_max: 656,\n y_min: -128,\n y_max: 808,\n ha: 936,\n leftSideBearing: 35,\n advanceWidth: 711,\n },\n '&': {\n x_min: 53,\n x_max: 441,\n y_min: -3,\n y_max: 753,\n ha: 756,\n leftSideBearing: 53,\n advanceWidth: 500,\n },\n \"'\": {\n x_min: 43,\n x_max: 161,\n y_min: 590,\n y_max: 811,\n ha: 221,\n leftSideBearing: 43,\n advanceWidth: 217,\n },\n '(': {\n x_min: 41,\n x_max: 311,\n y_min: -36,\n y_max: 845,\n ha: 881,\n leftSideBearing: 41,\n advanceWidth: 308,\n },\n ')': {\n x_min: -8,\n x_max: 257,\n y_min: -21,\n y_max: 852,\n ha: 873,\n leftSideBearing: -8,\n advanceWidth: 280,\n },\n '*': {\n x_min: 59,\n x_max: 539,\n y_min: 175,\n y_max: 589,\n ha: 414,\n leftSideBearing: 59,\n advanceWidth: 601,\n },\n '+': {\n x_min: 33,\n x_max: 361,\n y_min: 180,\n y_max: 587,\n ha: 407,\n leftSideBearing: 33,\n advanceWidth: 400,\n },\n ',': {\n x_min: 15,\n x_max: 176,\n y_min: -129,\n y_max: 92,\n ha: 221,\n leftSideBearing: 15,\n advanceWidth: 205,\n },\n '-': {\n x_min: 40,\n x_max: 380,\n y_min: 317,\n y_max: 452,\n ha: 135,\n leftSideBearing: 40,\n advanceWidth: 422,\n },\n '.': {\n x_min: 48,\n x_max: 185,\n y_min: -56,\n y_max: 84,\n ha: 140,\n leftSideBearing: 48,\n advanceWidth: 227,\n },\n '/': {\n x_min: -58,\n x_max: 654,\n y_min: -122,\n y_max: 844,\n ha: 966,\n leftSideBearing: -58,\n advanceWidth: 626,\n },\n ':': {\n x_min: 65,\n x_max: 225,\n y_min: 97,\n y_max: 536,\n ha: 439,\n leftSideBearing: 65,\n advanceWidth: 302,\n },\n ';': {\n x_min: 13,\n x_max: 295,\n y_min: -139,\n y_max: 536,\n ha: 675,\n leftSideBearing: 13,\n advanceWidth: 334,\n },\n '<': {\n x_min: 28,\n x_max: 438,\n y_min: -1,\n y_max: 607,\n ha: 608,\n leftSideBearing: 28,\n advanceWidth: 475,\n },\n '=': {\n x_min: 40,\n x_max: 383,\n y_min: 199.9598640852289,\n y_max: 541,\n ha: 341.0401359147711,\n leftSideBearing: 40,\n advanceWidth: 422,\n },\n '>': {\n x_min: 35,\n x_max: 421,\n y_min: 28,\n y_max: 632,\n ha: 604,\n leftSideBearing: 35,\n advanceWidth: 466,\n },\n '?': {\n x_min: 45,\n x_max: 548,\n y_min: -17,\n y_max: 767,\n ha: 784,\n leftSideBearing: 45,\n advanceWidth: 592,\n },\n '@': {\n x_min: 51,\n x_max: 730,\n y_min: -78,\n y_max: 753,\n ha: 831,\n leftSideBearing: 51,\n advanceWidth: 781,\n },\n A: {\n x_min: 37,\n x_max: 554,\n y_min: -4,\n y_max: 746,\n ha: 750,\n leftSideBearing: 37,\n advanceWidth: 617,\n },\n B: {\n x_min: 37,\n x_max: 532,\n y_min: 3,\n y_max: 783,\n ha: 780,\n leftSideBearing: 37,\n advanceWidth: 579,\n },\n C: {\n x_min: 37,\n x_max: 583,\n y_min: -3,\n y_max: 775,\n ha: 778,\n leftSideBearing: 37,\n advanceWidth: 623,\n },\n D: {\n x_min: 50,\n x_max: 530,\n y_min: -15,\n y_max: 749,\n ha: 764,\n leftSideBearing: 50,\n advanceWidth: 579,\n },\n E: {\n x_min: 45,\n x_max: 531,\n y_min: -1,\n y_max: 743,\n ha: 744,\n leftSideBearing: 45,\n advanceWidth: 585,\n },\n F: {\n x_min: 45,\n x_max: 459,\n y_min: 23,\n y_max: 727,\n ha: 704,\n leftSideBearing: 45,\n advanceWidth: 510,\n },\n G: {\n x_min: 31,\n x_max: 577,\n y_min: -8,\n y_max: 733,\n ha: 741,\n leftSideBearing: 31,\n advanceWidth: 611,\n },\n H: {\n x_min: 37,\n x_max: 493,\n y_min: -22,\n y_max: 758,\n ha: 780,\n leftSideBearing: 37,\n advanceWidth: 535,\n },\n I: {\n x_min: 47,\n x_max: 501,\n y_min: -3,\n y_max: 731,\n ha: 734,\n leftSideBearing: 47,\n advanceWidth: 541,\n },\n J: {\n x_min: 33,\n x_max: 531,\n y_min: -23,\n y_max: 725,\n ha: 748,\n leftSideBearing: 33,\n advanceWidth: 573,\n },\n K: {\n x_min: 43,\n x_max: 505,\n y_min: -10,\n y_max: 740,\n ha: 750,\n leftSideBearing: 43,\n advanceWidth: 560,\n },\n L: {\n x_min: 49,\n x_max: 457,\n y_min: -2,\n y_max: 746,\n ha: 748,\n leftSideBearing: 49,\n advanceWidth: 510,\n },\n M: {\n x_min: 35,\n x_max: 699,\n y_min: 1,\n y_max: 744,\n ha: 743,\n leftSideBearing: 35,\n advanceWidth: 743,\n },\n N: {\n x_min: 34,\n x_max: 533,\n y_min: -17,\n y_max: 761,\n ha: 778,\n leftSideBearing: 34,\n advanceWidth: 579,\n },\n O: {\n x_min: 41,\n x_max: 608,\n y_min: -5,\n y_max: 735,\n ha: 740,\n leftSideBearing: 41,\n advanceWidth: 667,\n },\n P: {\n x_min: 53,\n x_max: 451,\n y_min: -18,\n y_max: 735,\n ha: 753,\n leftSideBearing: 53,\n advanceWidth: 497,\n },\n Q: {\n x_min: 40,\n x_max: 599,\n y_min: -67,\n y_max: 744,\n ha: 811,\n leftSideBearing: 40,\n advanceWidth: 648,\n },\n R: {\n x_min: 39,\n x_max: 487,\n y_min: 16,\n y_max: 735,\n ha: 719,\n leftSideBearing: 39,\n advanceWidth: 535,\n },\n S: {\n x_min: 35,\n x_max: 552,\n y_min: -47,\n y_max: 708,\n ha: 755,\n leftSideBearing: 35,\n advanceWidth: 604,\n },\n T: {\n x_min: 26,\n x_max: 656,\n y_min: -13,\n y_max: 718,\n ha: 731,\n leftSideBearing: 26,\n advanceWidth: 705,\n },\n U: {\n x_min: 41,\n x_max: 518,\n y_min: -20,\n y_max: 748,\n ha: 768,\n leftSideBearing: 41,\n advanceWidth: 567,\n },\n V: {\n x_min: 47,\n x_max: 509,\n y_min: -26,\n y_max: 744,\n ha: 770,\n leftSideBearing: 47,\n advanceWidth: 567,\n },\n W: {\n x_min: 44,\n x_max: 789,\n y_min: -35,\n y_max: 720,\n ha: 755,\n leftSideBearing: 44,\n advanceWidth: 833,\n },\n X: {\n x_min: 63,\n x_max: 635,\n y_min: -10,\n y_max: 745,\n ha: 755,\n leftSideBearing: 63,\n advanceWidth: 680,\n },\n Y: {\n x_min: 43,\n x_max: 503,\n y_min: -21,\n y_max: 734,\n ha: 755,\n leftSideBearing: 43,\n advanceWidth: 541,\n },\n Z: {\n x_min: 42,\n x_max: 584,\n y_min: -10,\n y_max: 739,\n ha: 749,\n leftSideBearing: 42,\n advanceWidth: 629,\n },\n '[': {\n x_min: 46,\n x_max: 346,\n y_min: -150,\n y_max: 884,\n ha: 1034,\n leftSideBearing: 46,\n advanceWidth: 291,\n },\n '\\\\': {\n x_min: 20,\n x_max: 616,\n y_min: -100,\n y_max: 797,\n ha: 897,\n leftSideBearing: 20,\n advanceWidth: 645,\n },\n ']': {\n x_min: -76,\n x_max: 226,\n y_min: -150,\n y_max: 881,\n ha: 1031,\n leftSideBearing: -76,\n advanceWidth: 297,\n },\n '^': {\n x_min: 43,\n x_max: 437,\n y_min: 517,\n y_max: 812,\n ha: 295,\n leftSideBearing: 43,\n advanceWidth: 478,\n },\n _: {\n x_min: 29,\n x_max: 563,\n y_min: -110,\n y_max: -1,\n ha: 109,\n leftSideBearing: 29,\n advanceWidth: 598,\n },\n '`': {\n x_min: 54,\n x_max: 321,\n y_min: 540,\n y_max: 747,\n ha: 207,\n leftSideBearing: 54,\n advanceWidth: 368,\n },\n a: {\n x_min: 20,\n x_max: 447,\n y_min: -17,\n y_max: 495,\n ha: 512,\n leftSideBearing: 20,\n advanceWidth: 494,\n },\n b: {\n x_min: 37,\n x_max: 466,\n y_min: -27,\n y_max: 770,\n ha: 797,\n leftSideBearing: 37,\n advanceWidth: 510,\n },\n c: {\n x_min: 35,\n x_max: 456,\n y_min: -9,\n y_max: 507,\n ha: 516,\n leftSideBearing: 35,\n advanceWidth: 460,\n },\n d: {\n x_min: 45,\n x_max: 520,\n y_min: -15,\n y_max: 764,\n ha: 779,\n leftSideBearing: 45,\n advanceWidth: 560,\n },\n e: {\n x_min: 33,\n x_max: 370,\n y_min: -5,\n y_max: 501,\n ha: 506,\n leftSideBearing: 33,\n advanceWidth: 397,\n },\n f: {\n x_min: 35,\n x_max: 411,\n y_min: -13,\n y_max: 695,\n ha: 708,\n leftSideBearing: 35,\n advanceWidth: 453,\n },\n g: {\n x_min: 33,\n x_max: 551,\n y_min: -257,\n y_max: 505,\n ha: 762,\n leftSideBearing: 33,\n advanceWidth: 611,\n },\n h: {\n x_min: 32,\n x_max: 458,\n y_min: -29,\n y_max: 743,\n ha: 772,\n leftSideBearing: 32,\n advanceWidth: 491,\n },\n i: {\n x_min: 45,\n x_max: 167,\n y_min: -13,\n y_max: 631,\n ha: 644,\n leftSideBearing: 45,\n advanceWidth: 220,\n },\n j: {\n x_min: -127,\n x_max: 261,\n y_min: -231,\n y_max: 601,\n ha: 832,\n leftSideBearing: -127,\n advanceWidth: 308,\n },\n k: {\n x_min: 39,\n x_max: 443,\n y_min: -3,\n y_max: 700,\n ha: 703,\n leftSideBearing: 39,\n advanceWidth: 497,\n },\n l: {\n x_min: 58,\n x_max: 168,\n y_min: -8,\n y_max: 686,\n ha: 694,\n leftSideBearing: 58,\n advanceWidth: 227,\n },\n m: {\n x_min: 39,\n x_max: 688,\n y_min: -14,\n y_max: 501,\n ha: 515,\n leftSideBearing: 39,\n advanceWidth: 718,\n },\n n: {\n x_min: 45,\n x_max: 491,\n y_min: -32,\n y_max: 512,\n ha: 544,\n leftSideBearing: 45,\n advanceWidth: 541,\n },\n o: {\n x_min: 41,\n x_max: 424,\n y_min: -12,\n y_max: 493,\n ha: 505,\n leftSideBearing: 41,\n advanceWidth: 447,\n },\n p: {\n x_min: 25,\n x_max: 529,\n y_min: -260,\n y_max: 500,\n ha: 760,\n leftSideBearing: 25,\n advanceWidth: 573,\n },\n q: {\n x_min: 53,\n x_max: 603,\n y_min: -235,\n y_max: 514,\n ha: 749,\n leftSideBearing: 53,\n advanceWidth: 623,\n },\n r: {\n x_min: 32,\n x_max: 407,\n y_min: -7,\n y_max: 492,\n ha: 499,\n leftSideBearing: 32,\n advanceWidth: 460,\n },\n s: {\n x_min: 49,\n x_max: 416,\n y_min: -12,\n y_max: 519,\n ha: 531,\n leftSideBearing: 49,\n advanceWidth: 460,\n },\n t: {\n x_min: 32,\n x_max: 442,\n y_min: -5,\n y_max: 684,\n ha: 689,\n leftSideBearing: 32,\n advanceWidth: 469,\n },\n u: {\n x_min: 41,\n x_max: 487,\n y_min: -5,\n y_max: 507,\n ha: 512,\n leftSideBearing: 41,\n advanceWidth: 510,\n },\n v: {\n x_min: 16,\n x_max: 441,\n y_min: -20,\n y_max: 542,\n ha: 562,\n leftSideBearing: 16,\n advanceWidth: 456,\n },\n w: {\n x_min: 39,\n x_max: 639,\n y_min: -22,\n y_max: 505,\n ha: 527,\n leftSideBearing: 39,\n advanceWidth: 661,\n },\n x: {\n x_min: 15,\n x_max: 505,\n y_min: -39,\n y_max: 539,\n ha: 578,\n leftSideBearing: 15,\n advanceWidth: 541,\n },\n y: {\n x_min: -98,\n x_max: 501,\n y_min: -242,\n y_max: 511,\n ha: 753,\n leftSideBearing: -98,\n advanceWidth: 548,\n },\n z: {\n x_min: 27,\n x_max: 479,\n y_min: -3,\n y_max: 494,\n ha: 497,\n leftSideBearing: 27,\n advanceWidth: 494,\n },\n '{': {\n x_min: 0,\n x_max: 0,\n y_min: 0,\n y_max: 0,\n ha: 0,\n leftSideBearing: 0,\n advanceWidth: 308,\n },\n '|': {\n x_min: 0,\n x_max: 0,\n y_min: 0,\n y_max: 0,\n ha: 0,\n leftSideBearing: 0,\n advanceWidth: 308,\n },\n '}': {\n x_min: 0,\n x_max: 0,\n y_min: 0,\n y_max: 0,\n ha: 0,\n leftSideBearing: 0,\n advanceWidth: 308,\n },\n '~': {\n x_min: 0,\n x_max: 0,\n y_min: 0,\n y_max: 0,\n ha: 0,\n leftSideBearing: 0,\n advanceWidth: 308,\n },\n },\n fontFamily: 'PetalumaScript',\n resolution: 1000,\n generatedOn: '2020-06-14T18:33:25.407Z',\n};\n","export const RobotoSlabFont = {\n spacing: 50,\n glyphs: {\n ' ': {\n x_min: 0,\n x_max: 509,\n y_min: 0,\n y_max: 2000,\n ha: 2000,\n leftSideBearing: 0,\n advanceWidth: 509,\n },\n '0': {\n x_min: 121,\n x_max: 1048,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 121,\n advanceWidth: 1168,\n },\n '1': {\n x_min: 117,\n x_max: 767,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 117,\n advanceWidth: 844,\n },\n '2': {\n x_min: 75.8474576645637,\n x_max: 1040,\n y_min: 0,\n y_max: 1477,\n ha: 1477,\n leftSideBearing: 75,\n advanceWidth: 1131,\n },\n '3': {\n x_min: 74.85365853658536,\n x_max: 994,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 74,\n advanceWidth: 1106,\n },\n '4': {\n x_min: 63,\n x_max: 1114,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 63,\n advanceWidth: 1187,\n },\n '5': {\n x_min: 96.8448275474953,\n x_max: 982,\n y_min: -21,\n y_max: 1456,\n ha: 1477,\n leftSideBearing: 96,\n advanceWidth: 1081,\n },\n '6': {\n x_min: 121,\n x_max: 1067,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 121,\n advanceWidth: 1144,\n },\n '7': {\n x_min: 76,\n x_max: 1060,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: -30,\n advanceWidth: 1128,\n },\n '8': {\n x_min: 92,\n x_max: 1039,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 92,\n advanceWidth: 1131,\n },\n '9': {\n x_min: 84,\n x_max: 1026,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 84,\n advanceWidth: 1154,\n },\n '!': {\n x_min: 143,\n x_max: 340,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 143,\n advanceWidth: 483,\n },\n '\"': {\n x_min: 166,\n x_max: 634,\n y_min: 1055,\n y_max: 1560,\n ha: 505,\n leftSideBearing: 166,\n advanceWidth: 770,\n },\n '#': {\n x_min: 63,\n x_max: 1179,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 63,\n advanceWidth: 1246,\n },\n $: {\n x_min: 81.92156915727656,\n x_max: 1012,\n y_min: -208,\n y_max: 1693,\n ha: 1901,\n leftSideBearing: 81,\n advanceWidth: 1110,\n },\n '%': {\n x_min: 77,\n x_max: 1384,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 77,\n advanceWidth: 1460,\n },\n '&': {\n x_min: 74,\n x_max: 1242,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 74,\n advanceWidth: 1289,\n },\n \"'\": {\n x_min: 166,\n x_max: 324,\n y_min: 1055,\n y_max: 1560,\n ha: 505,\n leftSideBearing: 166,\n advanceWidth: 460,\n },\n '(': {\n x_min: 114,\n x_max: 650,\n y_min: -463,\n y_max: 1636,\n ha: 2099,\n leftSideBearing: 114,\n advanceWidth: 662,\n },\n ')': {\n x_min: 11,\n x_max: 547,\n y_min: -463,\n y_max: 1636,\n ha: 2099,\n leftSideBearing: 11,\n advanceWidth: 654,\n },\n '*': {\n x_min: 66,\n x_max: 893,\n y_min: 607,\n y_max: 1456,\n ha: 849,\n leftSideBearing: 66,\n advanceWidth: 958,\n },\n '+': {\n x_min: 73,\n x_max: 1071,\n y_min: 146,\n y_max: 1206,\n ha: 1060,\n leftSideBearing: 73,\n advanceWidth: 1145,\n },\n ',': {\n x_min: 23,\n x_max: 315,\n y_min: -311,\n y_max: 221,\n ha: 532,\n leftSideBearing: 23,\n advanceWidth: 404,\n },\n '-': {\n x_min: 154,\n x_max: 643,\n y_min: 538,\n y_max: 692,\n ha: 154,\n leftSideBearing: 154,\n advanceWidth: 797,\n },\n '.': {\n x_min: 145,\n x_max: 342,\n y_min: 0,\n y_max: 202,\n ha: 202,\n leftSideBearing: 145,\n advanceWidth: 493,\n },\n '/': {\n x_min: 0,\n x_max: 774,\n y_min: -125,\n y_max: 1456,\n ha: 1581,\n leftSideBearing: 0,\n advanceWidth: 824,\n },\n ':': {\n x_min: 145,\n x_max: 342,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 145,\n advanceWidth: 419,\n },\n ';': {\n x_min: 53,\n x_max: 345,\n y_min: -311,\n y_max: 1082,\n ha: 1393,\n leftSideBearing: 53,\n advanceWidth: 424,\n },\n '<': {\n x_min: 76,\n x_max: 892,\n y_min: 107,\n y_max: 1013,\n ha: 906,\n leftSideBearing: 76,\n advanceWidth: 1017,\n },\n '=': {\n x_min: 147,\n x_max: 981,\n y_min: 407,\n y_max: 987,\n ha: 580,\n leftSideBearing: 147,\n advanceWidth: 1127,\n },\n '>': {\n x_min: 125,\n x_max: 980,\n y_min: 87,\n y_max: 993,\n ha: 906,\n leftSideBearing: 125,\n advanceWidth: 1060,\n },\n '?': {\n x_min: 65.92660602419838,\n x_max: 890,\n y_min: 0,\n y_max: 1477,\n ha: 1477,\n leftSideBearing: 65,\n advanceWidth: 953,\n },\n '@': {\n x_min: 84.3592218305664,\n x_max: 1705.2346925277395,\n y_min: -453,\n y_max: 1431,\n ha: 1884,\n leftSideBearing: 84,\n advanceWidth: 1821,\n },\n A: {\n x_min: 70,\n x_max: 1463,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 70,\n advanceWidth: 1533,\n },\n B: {\n x_min: 81,\n x_max: 1253,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1322,\n },\n C: {\n x_min: 80,\n x_max: 1174,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 80,\n advanceWidth: 1290,\n },\n D: {\n x_min: 81,\n x_max: 1291,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1356,\n },\n E: {\n x_min: 81,\n x_max: 1190,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1306,\n },\n F: {\n x_min: 81,\n x_max: 1176,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1256,\n },\n G: {\n x_min: 80,\n x_max: 1226,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 80,\n advanceWidth: 1346,\n },\n H: {\n x_min: 81,\n x_max: 1497,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1578,\n },\n I: {\n x_min: 81,\n x_max: 604,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 685,\n },\n J: {\n x_min: 60,\n x_max: 1100,\n y_min: -21,\n y_max: 1456,\n ha: 1477,\n leftSideBearing: 60,\n advanceWidth: 1169,\n },\n K: {\n x_min: 81,\n x_max: 1427,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1501,\n },\n L: {\n x_min: 81,\n x_max: 1130,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1210,\n },\n M: {\n x_min: 94,\n x_max: 1888,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 94,\n advanceWidth: 1982,\n },\n N: {\n x_min: 83,\n x_max: 1509,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 83,\n advanceWidth: 1592,\n },\n O: {\n x_min: 70,\n x_max: 1281,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 70,\n advanceWidth: 1351,\n },\n P: {\n x_min: 81,\n x_max: 1242,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1297,\n },\n Q: {\n x_min: 70,\n x_max: 1348,\n y_min: -245,\n y_max: 1477,\n ha: 1722,\n leftSideBearing: 70,\n advanceWidth: 1376,\n },\n R: {\n x_min: 81,\n x_max: 1285,\n y_min: 0,\n y_max: 1455,\n ha: 1455,\n leftSideBearing: 81,\n advanceWidth: 1385,\n },\n S: {\n x_min: 115,\n x_max: 1116,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 115,\n advanceWidth: 1206,\n },\n T: {\n x_min: 96,\n x_max: 1306,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 96,\n advanceWidth: 1406,\n },\n U: {\n x_min: 70,\n x_max: 1452,\n y_min: -21,\n y_max: 1456,\n ha: 1477,\n leftSideBearing: 70,\n advanceWidth: 1522,\n },\n V: {\n x_min: 65,\n x_max: 1443,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 65,\n advanceWidth: 1508,\n },\n W: {\n x_min: 72,\n x_max: 2057,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 72,\n advanceWidth: 2129,\n },\n X: {\n x_min: 80,\n x_max: 1449,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 80,\n advanceWidth: 1529,\n },\n Y: {\n x_min: 65,\n x_max: 1396,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 65,\n advanceWidth: 1461,\n },\n Z: {\n x_min: 90,\n x_max: 1107,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 90,\n advanceWidth: 1197,\n },\n '[': {\n x_min: 157,\n x_max: 541,\n y_min: -312,\n y_max: 1664,\n ha: 1976,\n leftSideBearing: 157,\n advanceWidth: 573,\n },\n '\\\\': {\n x_min: 36,\n x_max: 830,\n y_min: -125,\n y_max: 1456,\n ha: 1581,\n leftSideBearing: 36,\n advanceWidth: 841,\n },\n ']': {\n x_min: 23,\n x_max: 408,\n y_min: -312,\n y_max: 1664,\n ha: 1976,\n leftSideBearing: 23,\n advanceWidth: 552,\n },\n '^': {\n x_min: 71,\n x_max: 802,\n y_min: 729,\n y_max: 1456,\n ha: 727,\n leftSideBearing: 71,\n advanceWidth: 864,\n },\n _: {\n x_min: 119,\n x_max: 1041,\n y_min: -154,\n y_max: 0,\n ha: 154,\n leftSideBearing: 119,\n advanceWidth: 1168,\n },\n '`': {\n x_min: 40,\n x_max: 456,\n y_min: 1288,\n y_max: 1560,\n ha: 272,\n leftSideBearing: 40,\n advanceWidth: 496,\n },\n a: {\n x_min: 79,\n x_max: 1053,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 79,\n advanceWidth: 1132,\n },\n b: {\n x_min: -16,\n x_max: 1071,\n y_min: -21,\n y_max: 1560,\n ha: 1581,\n leftSideBearing: -16,\n advanceWidth: 1145,\n },\n c: {\n x_min: 78,\n x_max: 988,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 78,\n advanceWidth: 1067,\n },\n d: {\n x_min: 78,\n x_max: 1156,\n y_min: -21,\n y_max: 1560,\n ha: 1581,\n leftSideBearing: 78,\n advanceWidth: 1218,\n },\n e: {\n x_min: 74,\n x_max: 980,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 74,\n advanceWidth: 1059,\n },\n f: {\n x_min: 64,\n x_max: 731,\n y_min: 0,\n y_max: 1581,\n ha: 1581,\n leftSideBearing: 64,\n advanceWidth: 725,\n },\n g: {\n x_min: 78,\n x_max: 1133,\n y_min: -437,\n y_max: 1102,\n ha: 1539,\n leftSideBearing: 78,\n advanceWidth: 1157,\n },\n h: {\n x_min: 49,\n x_max: 1255,\n y_min: 0,\n y_max: 1560,\n ha: 1560,\n leftSideBearing: 49,\n advanceWidth: 1315,\n },\n i: {\n x_min: 67,\n x_max: 590,\n y_min: 0,\n y_max: 1560,\n ha: 1560,\n leftSideBearing: 67,\n advanceWidth: 652,\n },\n j: {\n x_min: -56,\n x_max: 381,\n y_min: -437,\n y_max: 1560,\n ha: 1997,\n leftSideBearing: -56,\n advanceWidth: 525,\n },\n k: {\n x_min: 64,\n x_max: 1248,\n y_min: 0,\n y_max: 1560,\n ha: 1560,\n leftSideBearing: 64,\n advanceWidth: 1287,\n },\n l: {\n x_min: 64,\n x_max: 587,\n y_min: 0,\n y_max: 1560,\n ha: 1560,\n leftSideBearing: 64,\n advanceWidth: 653,\n },\n m: {\n x_min: 74,\n x_max: 1905,\n y_min: 0,\n y_max: 1102,\n ha: 1102,\n leftSideBearing: 74,\n advanceWidth: 1977,\n },\n n: {\n x_min: 74,\n x_max: 1278,\n y_min: 0,\n y_max: 1102,\n ha: 1102,\n leftSideBearing: 74,\n advanceWidth: 1343,\n },\n o: {\n x_min: 78,\n x_max: 1046,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 78,\n advanceWidth: 1124,\n },\n p: {\n x_min: 34,\n x_max: 1119,\n y_min: -416,\n y_max: 1102,\n ha: 1518,\n leftSideBearing: 34,\n advanceWidth: 1197,\n },\n q: {\n x_min: 78,\n x_max: 1135,\n y_min: -416,\n y_max: 1102,\n ha: 1518,\n leftSideBearing: 78,\n advanceWidth: 1139,\n },\n r: {\n x_min: 72,\n x_max: 808,\n y_min: 0,\n y_max: 1102,\n ha: 1102,\n leftSideBearing: 72,\n advanceWidth: 854,\n },\n s: {\n x_min: 104,\n x_max: 933,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 104,\n advanceWidth: 1022,\n },\n t: {\n x_min: 24,\n x_max: 678,\n y_min: -17,\n y_max: 1343,\n ha: 1360,\n leftSideBearing: 24,\n advanceWidth: 730,\n },\n u: {\n x_min: 52,\n x_max: 1181,\n y_min: -21,\n y_max: 1082,\n ha: 1103,\n leftSideBearing: 52,\n advanceWidth: 1245,\n },\n v: {\n x_min: 26,\n x_max: 1176,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 26,\n advanceWidth: 1206,\n },\n w: {\n x_min: 52,\n x_max: 1777,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 52,\n advanceWidth: 1823,\n },\n x: {\n x_min: 42,\n x_max: 1163,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 42,\n advanceWidth: 1203,\n },\n y: {\n x_min: 24,\n x_max: 1172,\n y_min: -437,\n y_max: 1082,\n ha: 1519,\n leftSideBearing: 24,\n advanceWidth: 1192,\n },\n z: {\n x_min: 88,\n x_max: 960,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 88,\n advanceWidth: 1032,\n },\n '{': {\n x_min: 63,\n x_max: 671,\n y_min: -364,\n y_max: 1597,\n ha: 1961,\n leftSideBearing: 63,\n advanceWidth: 701,\n },\n '|': {\n x_min: 150,\n x_max: 307,\n y_min: -270,\n y_max: 1456,\n ha: 1726,\n leftSideBearing: 150,\n advanceWidth: 451,\n },\n '}': {\n x_min: 27,\n x_max: 635,\n y_min: -364,\n y_max: 1597,\n ha: 1961,\n leftSideBearing: 27,\n advanceWidth: 701,\n },\n '~': {\n x_min: 121,\n x_max: 1257,\n y_min: 401,\n y_max: 803,\n ha: 402,\n leftSideBearing: 121,\n advanceWidth: 1386,\n },\n },\n fontFamily: 'Roboto Slab',\n resolution: 2048,\n generatedOn: '2020-06-15T19:12:58.120Z',\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from '../font';\nimport { PetalumaFont } from './petaluma_glyphs';\nimport { PetalumaMetrics } from './petaluma_metrics';\nexport function loadPetaluma() {\n Font.load('Petaluma', PetalumaFont, PetalumaMetrics);\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from '../font';\nimport { CustomFont } from './custom_glyphs';\nimport { CustomMetrics } from './custom_metrics';\nexport function loadCustom() {\n Font.load('Custom', CustomFont, CustomMetrics);\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// vexflow-petaluma.ts is the entry point for vexflow-petaluma.js.\n// This version bundles the Petaluma music engraving font.\nimport { Vex } from '../src/vex';\nimport { Flow } from '../src/flow';\nimport { loadCustom } from '../src/fonts/load_custom';\nimport { loadPetaluma } from '../src/fonts/load_petaluma';\nimport { loadTextFonts } from '../src/fonts/textfonts';\nloadPetaluma();\nloadCustom();\nFlow.setMusicFont('Petaluma', 'Custom');\nloadTextFonts();\nexport * from '../src/index';\nexport default Vex;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from '../font';\nimport { TextFormatter } from '../textformatter';\nimport { PetalumaScriptFont } from './petalumascript_glyphs';\nimport { RobotoSlabFont } from './robotoslab_glyphs';\nexport function loadTextFonts() {\n // Roboto Slab\n {\n const fontData = RobotoSlabFont;\n const { fontFamily, resolution, glyphs } = fontData;\n Font.load(fontFamily, fontData);\n // Previously we used 'H', but it isn't actually the tallest or the widest.\n // Interestingly, the lowercase 'b' is the tallest glyph.\n const maxSizeGlyph = 'b';\n TextFormatter.registerInfo({\n family: fontFamily,\n resolution,\n glyphs,\n maxSizeGlyph,\n monospaced: false,\n bold: false,\n italic: false,\n superscriptOffset: 0.66,\n subscriptOffset: 0.66,\n serifs: true,\n description: 'Text font to pair with the Bravura / Gonville music fonts.',\n });\n }\n // PetalumaScript\n {\n const fontData = PetalumaScriptFont;\n const { fontFamily, resolution, glyphs } = fontData;\n Font.load(fontFamily, fontData);\n // M is wider, but H is taller. :-)\n // Lowercase b is also taller in this font.\n const maxSizeGlyph = 'b';\n TextFormatter.registerInfo({\n family: fontFamily,\n resolution,\n glyphs,\n maxSizeGlyph,\n monospaced: false,\n bold: false,\n italic: false,\n superscriptOffset: 0.66,\n subscriptOffset: 0.66,\n serifs: false,\n description: 'Text font to pair with the Petaluma music font.',\n });\n }\n}\n"],"names":["root","factory","exports","module","define","amd","window","globalThis","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","g","Function","e","obj","prop","prototype","hasOwnProperty","call","isCategory","category","checkAncestors","constructorFcn","constructor","CATEGORY","getPrototypeOf","isBarline","Category","Barline","isGraceNote","GraceNote","isNote","Note","isStaveNote","StaveNote","isStemmableNote","StemmableNote","isTabNote","TabNote","RuntimeError","Error","code","message","super","globalObject","self","defined","x","undefined","log","block","args","line","Array","slice","join","console","warn","err","stack","midLine","a","b","mid_line","n","parseInt","prefix","text","normalizeAngle","Math","PI","Fraction","numerator","denominator","set","static","Number","isNaN","t","GCD","length","LCM","shift","LCMM","value","simplify","u","d","gcd","add","param1","param2","otherNumerator","otherDenominator","getNumeratorAndDenominator","lcm","subtract","multiply","divide","equals","compare","__staticFractionA","copy","__staticFractionB","greaterThan","greaterThanEquals","lessThan","lessThanEquals","clone","other","quotient","floor","remainder","makeAbs","abs","toString","toSimplifiedString","__staticFractionTmp","toMixedString","s","q","f","parse","str","i","split","BoundingBox","y","w","h","that","getX","getY","getW","getH","setX","setY","setW","setH","move","mergeWith","boundingBox","new_x","new_y","new_w","max","new_h","BoundingBoxComputation","x1","NaN","y1","x2","y2","getX1","getY1","width","height","addPoint","addX","addY","addQuadraticCurve","p0x","p0y","p1x","p1y","p2x","p2y","p01x","denom","it","p01y","addBezierCurve","p3x","p3y","p0","p1","p2","p3","pow","c","b2ac","t1","sqrt","t2","FontWeight","FontStyle","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","rejected","result","done","then","apply","fontParser","Fonts","Font","fontName","name","fontSize","SIZE","_a","scaleToPxFrom","pt","parseFloat","unit","replace","toLowerCase","size","weight","style","fromCSSString","family","SANS_SERIF","NORMAL","cssFontShorthand","document","createElement","font","fontFamily","fontWeight","fontStyle","fontInfo","st","trim","wt","sz","scaleFactor","parsedWeight","ITALIC","woffURL","includeWoff2","fontFace","FontFace","load","fonts","host","WEB_FONT_HOST","files","WEB_FONT_FILES","fontPath","loadWebFont","data","metrics","setData","setMetrics","getName","getData","getMetrics","hasData","getResolution","resolution","getGlyphs","glyphs","lookupMetric","defaultValue","keyParts","currObj","SERIF","px","em","in","mm","cm","PetalumaScript","Index","id","type","class","Registry","index","defaultRegistry","registry","clear","setIndexValue","elem","updateIndex","oldValue","getElementById","getAttribute","register","setAttribute","onRegister","_b","getElementsByAttribute","attribute","index_attr","index_attr_val","keys","map","k","getElementsByType","getElementsByClass","className","onUpdate","info","includes","Element","attrs","newID","el","getCategory","classes","rendered","getDefaultRegistry","ID","setStyle","getStyle","applyStyle","context","save","shadowColor","setShadowColor","shadowBlur","setShadowBlur","fillStyle","setFillStyle","strokeStyle","setStrokeStyle","lineWidth","setLineWidth","restoreStyle","restore","drawWithStyle","checkContext","draw","hasClass","addClass","removeClass","isRendered","setRendered","getAttributes","oldID","getBoundingBox","getContext","setContext","setFont","toCSSString","textFont","defaultTextFont","TEXT_FONT","fontIsObject","fontIsString","fontIsUndefined","sizeWeightStyleAreUndefined","assign","validate","getFont","resetFont","setFontSize","getFontSize","fontSizeInPoints","convertSizeToPointValue","fontSizeInPixels","convertSizeToPixelValue","OutlineCode","ModifierPosition","GlyphCacheEntry","fontStack","point","Glyph","loadMetrics","bbox","getOutlineBoundingBox","outline","scale","x_shift","y_shift","lookupFontMetric","GlyphOutline","originX","originY","nextX","nextY","parts","push","MOVE","LINE","QUADRATIC","BEZIER","options","topGlyphs","botGlyphs","originShift","setOptions","reset","glyph","lookupGlyph","x_min","x_max","ha","cached_outline","ctx","x_pos","y_pos","cache","lookup","customScale","renderOutline","go","beginPath","moveTo","lineTo","quadraticCurveTo","bezierCurveTo","fill","bboxComp","penX","penY","getCode","setPoint","setStave","stave","setXShift","setYShift","checkMetrics","metricsScale","setOriginX","xShift","setOriginY","yShift","setOrigin","render","xPos","yPos","checkStave","renderToStave","getYForGlyphs","Map","entries","CURRENT_CACHE_KEY","entry","MUSIC_FONT_STACK","Modifier","text_line","position","Position","LEFT","spacingFromNextModifier","PositionString","center","CENTER","above","ABOVE","below","BELOW","left","right","RIGHT","getWidth","setWidth","getNote","note","checkAttachedNote","setNote","getIndex","checkIndex","setIndex","getModifierContext","modifierContext","checkModifierContext","setModifierContext","getPosition","setPosition","setTextLine","setSpacingFromNextModifier","getSpacingFromNextModifier","getXShift","alignSubNotesWithNote","subNotes","tickContext","getTickContext","getStave","subNoteXOffset","modLeftPx","modRightPx","forEach","subNote","subTickContext","setXOffset","Music","NUM_TONES","canonical_notes","roots","root_values","root_indices","diatonic_intervals","diatonic_accidentals","unison","accidental","m2","M2","m3","M3","p4","dim5","p5","m6","M6","b7","M7","octave","intervals","b2","min2","S","H","maj2","T","W","b3","min3","maj3","b5","aug4","b6","aug5","maj6","m7","min7","dom7","maj7","scales","major","minor","ionian","dorian","phyrgian","lydian","mixolydian","aeolian","locrian","scaleTypes","M","m","accidentals","noteValues","root_index","int_val","cn","cb","cbb","dn","db","dbb","en","eb","ebb","fn","fb","fbb","gn","gb","gbb","an","ab","abb","bn","bb","bbb","isValidNoteValue","isValidIntervalValue","interval","getNoteParts","noteString","match","exec","getKeyParts","keyString","getNoteValue","getIntervalValue","intervalString","getCanonicalNoteName","noteValue","getCanonicalIntervalName","intervalValue","getRelativeNoteValue","direction","sum","getRelativeNoteName","rootValue","multiplier","reverse_interval","relativeNoteName","getScaleTones","tones","nextNote","getIntervalBetween","note1","note2","difference","createScaleMap","keySignature","keySigParts","scaleName","keySigString","noteLocation","scaleMap","rootName","noteName","RESOLUTION","durations","durationAliases","keySignatures","C","num","Am","F","acc","Dm","Bb","Gm","Eb","Cm","Ab","Fm","Db","Bbm","Gb","Ebm","Cb","Abm","G","Em","D","Bm","A","E","B","clefs","treble","line_shift","bass","tenor","alto","soprano","percussion","subbass","french","notesInfo","CN","CB","CBB","DN","DB","DBB","EN","EB","EBB","FN","FB","FBB","GN","GB","GBB","AN","AB","ABB","BN","BB","BBB","R","rest","X","shift_right","customNoteHeads","D0","D1","D2","D3","T0","T1","T2","T3","X0","X1","X2","X3","S1","S2","R1","R2","parenRightPaddingAdjustment","bs","bss","bbs","ashs","afhf","accSagittal5v7KleismaUp","accSagittal5v7KleismaDown","accSagittal5CommaUp","accSagittal5CommaDown","accSagittal7CommaUp","accSagittal7CommaDown","accSagittal25SmallDiesisUp","accSagittal25SmallDiesisDown","accSagittal35MediumDiesisUp","accSagittal35MediumDiesisDown","accSagittal11MediumDiesisUp","accSagittal11MediumDiesisDown","accSagittal11LargeDiesisUp","accSagittal11LargeDiesisDown","accSagittal35LargeDiesisUp","accSagittal35LargeDiesisDown","accSagittalSharp25SDown","accSagittalFlat25SUp","accSagittalSharp7CDown","accSagittalFlat7CUp","accSagittalSharp5CDown","accSagittalFlat5CUp","accSagittalSharp5v7kDown","accSagittalFlat5v7kUp","accSagittalSharp","accSagittalFlat","accSagittalSharp5v7kUp","accSagittalFlat5v7kDown","accSagittalSharp5CUp","accSagittalFlat5CDown","accSagittalSharp7CUp","accSagittalFlat7CDown","accSagittalSharp25SUp","accSagittalFlat25SDown","accSagittalSharp35MUp","accSagittalFlat35MDown","accSagittalSharp11MUp","accSagittalFlat11MDown","accSagittalSharp11LUp","accSagittalFlat11LDown","accSagittalSharp35LUp","accSagittalFlat35LDown","accSagittalDoubleSharp25SDown","accSagittalDoubleFlat25SUp","accSagittalDoubleSharp7CDown","accSagittalDoubleFlat7CUp","accSagittalDoubleSharp5CDown","accSagittalDoubleFlat5CUp","accSagittalDoubleSharp5v7kDown","accSagittalDoubleFlat5v7kUp","accSagittalDoubleSharp","accSagittalDoubleFlat","accSagittal7v11KleismaUp","accSagittal7v11KleismaDown","accSagittal17CommaUp","accSagittal17CommaDown","accSagittal55CommaUp","accSagittal55CommaDown","accSagittal7v11CommaUp","accSagittal7v11CommaDown","accSagittal5v11SmallDiesisUp","accSagittal5v11SmallDiesisDown","accSagittalSharp5v11SDown","accSagittalFlat5v11SUp","accSagittalSharp7v11CDown","accSagittalFlat7v11CUp","accSagittalSharp55CDown","accSagittalFlat55CUp","accSagittalSharp17CDown","accSagittalFlat17CUp","accSagittalSharp7v11kDown","accSagittalFlat7v11kUp","accSagittalSharp7v11kUp","accSagittalFlat7v11kDown","accSagittalSharp17CUp","accSagittalFlat17CDown","accSagittalSharp55CUp","accSagittalFlat55CDown","accSagittalSharp7v11CUp","accSagittalFlat7v11CDown","accSagittalSharp5v11SUp","accSagittalFlat5v11SDown","accSagittalDoubleSharp5v11SDown","accSagittalDoubleFlat5v11SUp","accSagittalDoubleSharp7v11CDown","accSagittalDoubleFlat7v11CUp","accSagittalDoubleSharp55CDown","accSagittalDoubleFlat55CUp","accSagittalDoubleSharp17CDown","accSagittalDoubleFlat17CUp","accSagittalDoubleSharp7v11kDown","accSagittalDoubleFlat7v11kUp","accSagittal23CommaUp","accSagittal23CommaDown","accSagittal5v19CommaUp","accSagittal5v19CommaDown","accSagittal5v23SmallDiesisUp","accSagittal5v23SmallDiesisDown","accSagittalSharp5v23SDown","accSagittalFlat5v23SUp","accSagittalSharp5v19CDown","accSagittalFlat5v19CUp","accSagittalSharp23CDown","accSagittalFlat23CUp","accSagittalSharp23CUp","accSagittalFlat23CDown","accSagittalSharp5v19CUp","accSagittalFlat5v19CDown","accSagittalSharp5v23SUp","accSagittalFlat5v23SDown","accSagittalDoubleSharp5v23SDown","accSagittalDoubleFlat5v23SUp","accSagittalDoubleSharp5v19CDown","accSagittalDoubleFlat5v19CUp","accSagittalDoubleSharp23CDown","accSagittalDoubleFlat23CUp","accSagittal19SchismaUp","accSagittal19SchismaDown","accSagittal17KleismaUp","accSagittal17KleismaDown","accSagittal143CommaUp","accSagittal143CommaDown","accSagittal11v49CommaUp","accSagittal11v49CommaDown","accSagittal19CommaUp","accSagittal19CommaDown","accSagittal7v19CommaUp","accSagittal7v19CommaDown","accSagittal49SmallDiesisUp","accSagittal49SmallDiesisDown","accSagittal23SmallDiesisUp","accSagittal23SmallDiesisDown","accSagittal5v13MediumDiesisUp","accSagittal5v13MediumDiesisDown","accSagittal11v19MediumDiesisUp","accSagittal11v19MediumDiesisDown","accSagittal49MediumDiesisUp","accSagittal49MediumDiesisDown","accSagittal5v49MediumDiesisUp","accSagittal5v49MediumDiesisDown","accSagittal49LargeDiesisUp","accSagittal49LargeDiesisDown","accSagittal11v19LargeDiesisUp","accSagittal11v19LargeDiesisDown","accSagittal5v13LargeDiesisUp","accSagittal5v13LargeDiesisDown","accSagittalSharp23SDown","accSagittalFlat23SUp","accSagittalSharp49SDown","accSagittalFlat49SUp","accSagittalSharp7v19CDown","accSagittalFlat7v19CUp","accSagittalSharp19CDown","accSagittalFlat19CUp","accSagittalSharp11v49CDown","accSagittalFlat11v49CUp","accSagittalSharp143CDown","accSagittalFlat143CUp","accSagittalSharp17kDown","accSagittalFlat17kUp","accSagittalSharp19sDown","accSagittalFlat19sUp","accSagittalSharp19sUp","accSagittalFlat19sDown","accSagittalSharp17kUp","accSagittalFlat17kDown","accSagittalSharp143CUp","accSagittalFlat143CDown","accSagittalSharp11v49CUp","accSagittalFlat11v49CDown","accSagittalSharp19CUp","accSagittalFlat19CDown","accSagittalSharp7v19CUp","accSagittalFlat7v19CDown","accSagittalSharp49SUp","accSagittalFlat49SDown","accSagittalSharp23SUp","accSagittalFlat23SDown","accSagittalSharp5v13MUp","accSagittalFlat5v13MDown","accSagittalSharp11v19MUp","accSagittalFlat11v19MDown","accSagittalSharp49MUp","accSagittalFlat49MDown","accSagittalSharp5v49MUp","accSagittalFlat5v49MDown","accSagittalSharp49LUp","accSagittalFlat49LDown","accSagittalSharp11v19LUp","accSagittalFlat11v19LDown","accSagittalSharp5v13LUp","accSagittalFlat5v13LDown","accSagittalDoubleSharp23SDown","accSagittalDoubleFlat23SUp","accSagittalDoubleSharp49SDown","accSagittalDoubleFlat49SUp","accSagittalDoubleSharp7v19CDown","accSagittalDoubleFlat7v19CUp","accSagittalDoubleSharp19CDown","accSagittalDoubleFlat19CUp","accSagittalDoubleSharp11v49CDown","accSagittalDoubleFlat11v49CUp","accSagittalDoubleSharp143CDown","accSagittalDoubleFlat143CUp","accSagittalDoubleSharp17kDown","accSagittalDoubleFlat17kUp","accSagittalDoubleSharp19sDown","accSagittalDoubleFlat19sUp","accSagittalShaftUp","accSagittalShaftDown","accSagittalAcute","accSagittalGrave","accSagittal1MinaUp","accSagittal1MinaDown","accSagittal2MinasUp","accSagittal2MinasDown","accSagittal1TinaUp","accSagittal1TinaDown","accSagittal2TinasUp","accSagittal2TinasDown","accSagittal3TinasUp","accSagittal3TinasDown","accSagittal4TinasUp","accSagittal4TinasDown","accSagittal5TinasUp","accSagittal5TinasDown","accSagittal6TinasUp","accSagittal6TinasDown","accSagittal7TinasUp","accSagittal7TinasDown","accSagittal8TinasUp","accSagittal8TinasDown","accSagittal9TinasUp","accSagittal9TinasDown","accSagittalFractionalTinaUp","accSagittalFractionalTinaDown","accidentalNarrowReversedFlat","accidentalNarrowReversedFlatAndFlat","accidentalWilsonPlus","accidentalWilsonMinus","articulations","between_lines","av","aboveCode","belowCode","ao","ah","am","ornaments","mordent","mordent_inverted","turn","turn_inverted","tr","upprall","downprall","prallup","pralldown","upmordent","downmordent","lineprall","prallprall","scoop","doit","fall","doitLong","fallLong","bend","plungerClosed","plungerOpen","flip","jazzTurn","smear","Tables","clef","keyOctaveGlyph","params","octave_shift","pieces","toUpperCase","clefProperties","stroke","int_value","customNoteHeadProps","glyphName","displaced","integer","fret","shift_y","glyphMetrics","TABLATURE_FONT_SCALE","textWidth","artic","spec","keySpec","notes","acc_list","duration","durationNumber","sanitizeDuration","durationToFraction","ticks","durationCodes","glyphTypeProperties","customGlyphTypeProperties","code_head","common","NOTATION_FONT_SCALE","STEM_WIDTH","STEM_HEIGHT","STAVE_LINE_THICKNESS","SLASH_NOTEHEAD_WIDTH","STAVE_LINE_DISTANCE","TEXT_HEIGHT_OFFSET_HACK","accidentalMap","accidentalColumnsTable","second_on_bottom","spaced_out_tetrachord","spaced_out_pentachord","very_spaced_out_pentachord","spaced_out_hexachord","very_spaced_out_hexachord","unicode","sharp","String","fromCharCode","flat","natural","triangle","degrees","circle","validTypes","r","TIME4_4","num_beats","beat_value","stem","stem_offset","flag","dot_shiftY","line_above","line_below","beam_count","stem_beam_extension","code_flag_upstem","code_flag_downstem","L","Accidental","DEBUG","render_options","font_scale","parenLeftPadding","parenRightPadding","accidentalCodes","cautionary","state","musicFont","currentMusicFont","noteheadAccidentalPadding","leftShift","left_shift","accidentalSpacing","additionalPadding","accList","prevNote","shiftL","props","getKeyProps","getLeftDisplacedHeadPx","lineSpace","getSpacingBetweenLines","getYForLine","accLine","round","sort","lineList","previousLine","accShift","flatLine","dblSharpLine","numAcc","column","totalColumns","noFurtherConflicts","groupStart","groupEnd","checkCollision","getGroupLine","getGroupLines","indexes","lineDifference","indexA","indexB","item","notColliding","indexPairs","every","line1","line2","groupLength","groupMember","endCase","patternLength","collisionDetected","columnWidths","columnXOffsets","totalShift","accCount","lastAccOnLine","clearance","clearanceRequired","collision","voices","tickPositions","tickNoteMap","voice","tickPosition","getTickables","shouldIgnoreTicks","notesAtPosition","getTicks","music","scaleMapKey","tickPos","tickables","modifiedPitches","processNote","isRest","staveNote","keyIndex","accidentalString","pitch","sameAccidental","previouslyModified","indexOf","getModifiers","modifier","splice","addModifier","GraceNoteGroup","getGraceNotes","fontScale","parenLeft","parenRight","parenWidth","setAsCautionary","start","getModifierStartXY","accX","accY","Stem","stem_up_y_offset","stem_down_y_offset","stem_up_y_base_offset","stem_down_y_base_offset","x_begin","x_end","y_top","y_bottom","stem_extension","stem_direction","hide","isStemlet","stemletHeight","renderHeightAdjustment","UP","DOWN","WIDTH","HEIGHT","setNoteHeadXBounds","setDirection","setExtension","ext","getExtension","setYBounds","getHeight","y_offset","getExtents","isStemUp","ys","stemHeight","innerMostNoteheadY","min","outerMostNoteheadY","topY","baseY","setVisibility","isVisible","setStemlet","adjustHeightForFlag","adjustHeightForBeam","stem_x","stem_y","y_base_offset","stemletYOffset","TextFormatter","textWidthCache","formatterInfo","serifs","monospaced","italic","bold","superscriptOffset","subscriptOffset","maxSizeGlyph","cacheKey","updateParams","registeredFonts","requestedFont","candidates","requestedFamilies","requestedFamily","startsWith","formatter","values","isBold","isItalic","perfectMatch","find","partialMatch","fontSizeInPt","overwrite","updateCacheKey","BOLD","getGlyphMetrics","character","maxHeight","getWidthForCharacterInEm","advanceWidth","getWidthForTextInEm","cachedWidths","getWidthForTextInPx","AnnotationHorizontalJustify","AnnotationVerticalJustify","Annotation","horizontalJustification","verticalJustification","TOP","annotations","annotation","textFormatter","create","verticalSpaceNeeded","stemDirection","hasStem","getStemDirection","lines","draw_stem","getStem","getNoteType","getNumLines","VerticalJustify","noteLine","getLineNumber","leastString","top_text_line","BOTTOM","greatestString","curBottom","right_shift","setVerticalJustification","just","VerticalJustifyString","getJustification","setJustification","HorizontalJustifyString","classString","openGroup","text_width","measureText","text_height","getStemX","stem_ext","spacing","has_stem","checkStem","getYs","reduce","yt","getYForTopText","getYForBottomText","getTopLineTopY","extents","getStemExtents","fillText","closeGroup","HorizontalJustify","centerStem","CENTER_STEM","top","bottom","roundToNearestHalf","mathFn","isWithinLines","getRoundingFunction","ceil","isStaveOrGraceNote","Articulation","getIncrement","articulation","increment","curTop","maxWidth","articWidth","builder","articNameToCode","staccato","tenuto","accent","articString","getFactory","articulationCodes","textLine","canSitBetweenLines","staffSpace","isTab","shouldSitOutsideStaff","initialOffset","isOnStemTip","getInitialOffset","padding","stemTipY","stemBaseY","getTopY","INITIAL_OFFSET","getBottomY","offsetDirection","articLine","snappedLine","snapLineToStaff","RenderContext","setRawFont","Tickable","_preFormatted","_postFormatted","intrinsicTicks","tickMultiplier","modifiers","tupletStack","align_center","center_x_shift","ignore_ticks","formatterMetrics","freedom","iterations","space","used","mean","deviation","setIgnoreTicks","checkTickContext","getFormatterMetrics","getCenterXShift","isCenterAligned","setCenterXShift","centerXShift","setCenterAlignment","getVoice","setVoice","getTuplet","tuplet","getTupletStack","resetTuplet","noteCount","notesOccupied","getNoteCount","getNotesOccupied","applyTickMultiplier","pop","setTuplet","addToModifierContext","mc","addMember","setTickContext","tc","preFormat","preFormatted","postFormat","postFormatted","getIntrinsicTicks","setIntrinsicTicks","getTickMultiplier","setDuration","getAbsoluteX","noteStruct","parsedNoteStruct","parseNoteStruct","JSON","stringify","keyProps","noteType","customTypes","duration_override","getGlyphProps","customGlyphs","playNote","leftDisplacedHeadPx","rightDisplacedHeadPx","annotation_spacing","glyph_font_scale","stroke_px","xStart","xPre1","xAbs","xPost1","notePx","xPost2","xEnd","xFreedomRight","xWidth","color","yy","arc","closePath","drawDot","spaceDeviation","durationString","dots","durationProps","parseDuration","durationToTicks","currentTicks","getPlayNote","setPlayNote","addStroke","setYs","getRightDisplacedHeadPx","setLeftDisplacedHeadPx","setRightDisplacedHeadPx","isTopNote","getLineForRest","getGlyph","getGlyphWidth","getDuration","isDotted","getModifiersByType","getBeam","beam","checkBeam","hasBeam","setBeam","signature","getMembers","getRightParenthesisPx","getLeftParenthesisPx","getFirstDotPx","getState","glyphWidth","glyphPx","getNoteStartX","getTieRightX","tieStartX","getTieLeftX","tieEndX","getKeys","StaveModifierPosition","BarlineType","ChordSymbolHorizontalJustify","ChordSymbolVerticalJustify","SymbolTypes","SymbolModifiers","VoiceMode","StaveModifier","placeGlyphOnLine","customShift","getPadding","setPadding","setLayoutMetrics","layoutMetrics","getLayoutMetrics","thickness","TYPE","widths","SINGLE","DOUBLE","END","REPEAT_BEGIN","REPEAT_END","REPEAT_BOTH","NONE","paddings","layoutMetricsMap","xMin","xMax","paddingLeft","paddingRight","BEGIN","setType","typeString","single","double","end","repeatBegin","repeatEnd","repeatBoth","none","getType","drawVerticalBar","drawVerticalEndBar","drawRepeatBar","double_bar","staveCtx","botY","getBottomLineBottomY","fillRect","begin","dot_x","dot_radius","dot_y","BarNote","barline","Bend","release","phrase","tap","line_width","line_style","bend_width","release_width","updateWidth","bends","last_width","stringPos","setTap","getText","getTextHeight","totalWidth","additional_width","draw_width","lowestY","bend_height","annotation_y","renderBend","cp_x","cp_y","renderRelease","renderArrowHead","yBase","renderText","render_x","last_bend","last_bend_draw_width","last_drawn_width","ChordSymbol","symbolBlocks","horizontal","vertical","useKerning","reportWidth","superSubRatio","global","NO_TEXT_FORMAT","val","noFormat","glyphCode","engravingFontResolution","spacingBetweenBlocks","metric","getMetricForGlyph","yOffset","leftSideBearing","kerningOffset","chordSymbol","lowerKerningText","upperKerningText","symbolModifier","SUPERSCRIPT","SUBSCRIPT","symbols","nonSuperWidth","reportedWidths","symbol","fontAdj","scaleSize","glyphAdj","lineSpaces","vAlign","j","sup","isSuperscript","sub","isSubscript","superSubScale","adj","symbolType","GLYPH","superSubFontSize","getWidthForGlyph","getYShiftForGlyph","getXShiftForGlyph","TEXT","getYOffsetForText","over","prev","setEnableKerning","updateKerningAdjustments","updateOverBarAdjustments","getVertical","getReportWidth","setReportWidth","barIndex","findIndex","xoff","yoff","symIndex","accum","getKerningAdjustment","currSymbol","prevSymbol","adjustment","preKernUpper","preKernLower","some","xx","kerningOffsetPixels","getSymbolBlock","_c","symbolBlock","glyphArgs","glyphPoints","addSymbolBlock","parameters","addText","addTextSuperscript","addTextSubscript","addGlyphSuperscript","addGlyph","addGlyphOrText","char","addLine","setVertical","vj","setHorizontal","hj","getHorizontal","yMax","y_max","stem_base","isSuper","isSub","curY","smallerFontSize","diminished","dim","halfDiminished","augmented","majorSeventh","leftParen","rightParen","leftBracket","rightBracket","leftParenTall","rightParenTall","symbolTypes","symbolModifiers","Dot","radius","all","dot","setDotShiftY","dot_list","max_shift_map","note_id","dot_shift","x_width","last_line","last_note","prev_dotted_space","half_shiftY","forceFlagRight","FretHandFinger","finger","x_offset","nums","nums_list","prev_note","shiftLeft","shiftRight","pos","textHeight","shiftR","numShiftL","numShiftR","xWidthL","xWidthR","lastLine","lastNote","num_shift","numWidth","fingerings","fingeringString","number","Fingering","fingering","setFretHandFinger","getFretHandFinger","setOffsetX","setOffsetY","StaveTie","setNotes","cp1","cp2","text_shift_x","first_x_shift","last_x_shift","tie_spacing","first_note","first_indices","last_indices","isPartial","renderTie","first_ys","last_ys","last_x_px","first_x_px","first_y_px","last_y_px","top_cp_y","bottom_cp_y","center_x","getTieStartX","getTieEndX","TabTie","Voice","time","voiceTime","resolutionMultiplier","mode","STRICT","ticksUsed","largestTickWidth","softmaxFactor","totalTicks","smallestTickCount","Mode","getTotalTicks","getTicksUsed","getLargestTickWidth","getSmallestTickCount","getMode","setMode","getResolutionMultiplier","getActualResolution","tickable","setStrict","strict","SOFT","isComplete","FULL","setSoftmaxFactor","factor","reCalculateExpTicksUsed","expTicksUsed","softmax","tickValue","v","exp","addTickable","addTickables","grace_notes","show_slur","slur","slur_y_shift","beams","gracenote_groups","group_list","gracenote_group","is_stavenote","formatWidth","group_shift","Formatter","joinVoices","format","getMinTotalWidth","beamNotes","Beam","beam_width","partial_beam_length","graceNote","TieClass","NoteSubGroup","groups","group","TickContext","tickID","currentTick","maxTicks","maxTickable","minTicks","minTickable","xBase","xOffset","tickablesByVoice","totalLeftPx","totalRightPx","tContexts","tContext","contexts","getTickID","getXBase","setXBase","getXOffset","getMaxTicks","getMinTicks","getMaxTickable","getMinTickable","getTickableForVoice","voiceIndex","getTickablesByVoice","getCenterAlignedTickables","filter","getCurrentTick","setCurrentTick","tick","Ornament","delayed","accidentalLowerPadding","accidentalUpperPadding","ornament","ornamentCodes","adjustForStemDirection","reportedWidth","stemUpYOffset","ornamentAlignWithNoteHead","ornamentNoteTransition","ornamentRelease","ornamentAttack","ornamentArticulation","jazzOrnaments","setDelayed","setUpperAccidental","accid","accidentalUpper","setLowerAccidental","accidentalLower","stemDir","stemExtents","isPlacedOnNoteheadSide","lineSpacing","glyphYBetweenLines","glyphX","glyphY","delayXShift","startX","nextContext","getNextContext","Parenthesis","parentheses","x_widthL","x_widthR","parenthesis","renderGlyph","NoteHead","custom_glyph","stem_up_x_offset","stem_down_x_offset","note_type","glyph_code","custom_glyph_code","slashed","isDisplaced","getLine","setLine","displacementStemAdjustment","fontShift","displacedFontShift","half_spacing","min_y","getYForNote","head_x","categorySuffix","staveSpace","durationToNumber","breve_lines","drawSlashNoteHead","setStem","buildStem","buildFlag","hasFlag","flagCode","getBaseCustomNoteHeadGlyph","getStemLength","getStemExtension","getBeamCount","getStemMinimumLength","setStemDirection","offsets","offsetYBaseStemUp","offsetYTopStemUp","offsetYBaseStemDown","offsetYTopStemDown","getCenterGlyphX","stem_extension_override","setStemLength","drawStem","stemOptions","shiftRestVertical","dir","delta","maxLine","minLine","setKeyLine","getKeyLine","ledgerLineStyle","use_default_head_x","_noteHeads","LEDGER_LINE_OFFSET","calculateKeyProps","auto_stem","autoStem","STEM_UP","STEM_DOWN","minNoteheadPadding","notesList","minL","stemMax","stemMin","maxL","isrest","voice_shift","getVoiceShiftWidth","is_displaced","noteU","noteM","noteL","voiceXShift","centerRest","noteHeadStyles","noteHead","buildNoteHeads","noteHeadStyle","head","calcNoteDisplacements","lineDiff","noteProps","notehead","calculateOptimalStemDirection","keyProperties","minY","maxY","halfLineSpacing","frac","resultLine","thisLine","isChord","getNoteHeadBounds","setNoteDisplaced","getRightShift","restLine","isInnerNoteIndex","setStemStyle","getStemStyle","setLedgerLineStyle","getLedgerLineStyle","setFlagStyle","flagStyle","getFlagStyle","setKeyStyle","noteHeadPadding","shouldDrawFlag","nonDisplacedX","displacedX","highestDisplacedLine","lowestDisplacedLine","yTop","Infinity","yBottom","highestLine","lowestLine","highestNonDisplacedLine","lowestNonDisplacedLine","displaced_x","non_displaced_x","highest_line","lowest_line","highest_displaced_line","lowest_displaced_line","highest_non_displaced_line","lowest_non_displaced_line","getNoteHeadBeginX","getNoteHeadEndX","noteHeads","note_heads","drawLedgerLines","doubleWidth","min_x","drawLedgerLine","normal","ledgerWidth","getDefaultLedgerLineStyle","drawModifiers","noteheadStyle","hasNoBeam","drawFlag","noteStemHeight","flagX","extension","flagY","pointerBBox","drawNoteHeads","super_stem_extension","mid_line_distance","lines_over_octave_from_mid_line","spacing_between_lines","xBegin","shouldRenderStem","stemX","isHTMLCanvas","element","HTMLCanvasElement","toDataURL","CanvasContext","context2D","canvas","CANVAS_BROWSER_SIZE_LIMIT","limit","clearRect","cls","child","setBackgroundFillStyle","blur","getTransform","setLineCap","capType","lineCap","setLineDash","dash","resize","devicePixelRatio","sanitizeCanvasDims","rect","cp1x","cp1y","cp2x","cp2y","cpx","cpy","startAngle","endAngle","counterclockwise","fontBoundingBoxAscent","fontBoundingBoxDescent","actualBoundingBoxAscent","actualBoundingBoxDescent","ATTRIBUTES_TO_IGNORE","path","SVG_NS","TWO_PI","SVGContext","backgroundFillStyle","fontCSSString","svg","appendChild","parent","pen","defaultFontAttributes","attributes","shadow_attributes","state_stack","svgElementType","createElementNS","lineDash","applyAttributes","visibleWidth","visibleHeight","setViewBox","viewBox_or_minX","viewBoxString","attrNamesToIgnore","nodeName","attrName","setAttributeNS","lastChild","removeChild","rectangle","x0","cos","y0","sin","large","sweep","getShadowStyle","sa","measureTextCache","txt","textContent","savedState","fontAttributes","RendererBackends","RendererLineEndType","Justification","VoltaType","measureImpl","getBBox","Renderer","arg0","arg1","backend","maybeElement","Backends","CANVAS","SVG","HTMLDivElement","isHTMLDiv","elementId","background","renderer","lastContext","buildContext","fromX","fromY","toX","toY","dashPattern","dx","dy","angle","atan2","idx","dashLength","nx","ny","LineEndType","StringNumber","string_number","dashed","leg","stringNumber","shift_left","glyphLine","num_shiftR","num_width","setLineEndType","setStringNumber","setLastNote","setDashed","stemPadding","verticalPadding","leftPadding","rightPadding","len","pattern","drawDashedLine","Stroke","all_voices","strokes","strokeList","string","getPositions","strokeShift","addEndNote","note_end","line_space","arrow","arrow_shift_x","arrow_y","text_y","Type","BRUSH_DOWN","BRUSH_UP","ROLL_DOWN","RASQUEDO_DOWN","ROLL_UP","RASQUEDO_UP","ARPEGGIO_DIRECTIONLESS","strokeLine","Vibrato","harsh","vibrato_width","wave_height","wave_width","wave_girth","setVibratoWidth","vibratos","vibrato","setHarsh","vx","vy","renderVibrato","opts","num_waves","ModifierContext","members","formatted","member","getLeftShift","Clef","types","tab","attachment","numLines","shiftY","KeySignature","cancelKeySpec","alterKeySpec","setKeySig","glyphFontScale","xPositions","paddingForced","convertToGlyph","nextAcc","accGlyphData","extraWidth","xPosition","cancelKey","convertToCancelAccList","cancel_accList","different_types","naturals","cancelled","concat","addToStave","convertAccLines","customLines","offset","alterKey","convertToAlterAccList","firstAccidentalType","cancelAccList","getEndClef","getClef","Repetition","symbol_type","setShiftX","setShiftY","CODA_RIGHT","drawCodaFixed","CODA_LEFT","drawSymbolText","SEGNO_LEFT","drawSignoFixed","SEGNO_RIGHT","DC","DC_AL_CODA","DC_AL_FINE","DS","DS_AL_CODA","DS_AL_FINE","FINE","TO_CODA","draw_coda","text_x","symbol_x","modifierWidth","getVerticalBarWidth","StaveSection","section","shift_x","setStaveSection","textMeasurements","StaveTempo","tempo","setTempo","bpm","stem_height","TextNote","superscript","subscript","smooth","justification","struct","GLYPHS","segno","mordent_upper","mordent_lower","p","z","coda","pedal_open","pedal_close","caesura_straight","caesura_curved","breath","StaveText","setStaveText","setText","getBottomLineY","Volta","volta","top_y","vert_height","BEGIN_END","TimeSignatureGlyph","timeSignature","topDigits","botDigits","topWidth","timeSigType","topGlyph","botWidth","botGlyph","topStartX","botStartX","start_x","topLine","bottomLine","TimeSignature","timeSpec","customPadding","validate_args","fontLineShift","parseTimeSpec","numbers","test","assertIsValidTimeSig","makeTimeSignatureGlyph","getInfo","setTimeSig","SORT_ORDER_BEG_MODIFIERS","SORT_ORDER_END_MODIFIERS","Stave","end_x","measure","endClef","vertical_bar_width","num_lines","fill_style","left_bar","right_bar","spacing_between_lines_px","space_above_staff_ln","space_below_staff_ln","top_text_position","bottom_text_position","line_config","bounds","defaultLedgerLineStyle","resetLines","addEndModifier","defaultPadding","setDefaultLedgerLineStyle","visible","setNoteStartX","begBarline","getNoteEndX","setNumLines","mod","setMeasure","getModifierXShift","setRepetitionType","setVoltaType","number_t","setSection","staveSection","headroom","getLineForY","setBegBarType","setEndBarType","setClef","clefSpec","addClef","setEndClef","setKeySignature","addKeySignature","setEndKeySignature","setTimeSignature","timeSignatures","addTimeSignature","setEndTimeSignature","addEndClef","addEndTimeSignature","addTrebleGlyph","noPosition","noCategory","sortByCategory","items","order","temp","endBarline","begModifiers","endModifiers","lastBarlineIdx","getConfigForLines","setConfigForLine","line_number","setConfigForLines","lines_configuration","drawBoldDoubleLine","topX","StaveConnector","BOLD_DOUBLE_LEFT","BOLD_DOUBLE_RIGHT","variableWidth","top_stave","bottom_stave","texts","SINGLE_RIGHT","content","THIN_DOUBLE","attachment_height","SINGLE_LEFT","BRACE","x3","y3","cpx1","cpy1","cpx2","cpy2","cpx3","cpy3","cpx4","cpy4","cpx5","cpy5","cpx6","cpy6","cpx7","cpy7","cpx8","cpy8","BRACKET","singleRight","singleLeft","brace","bracket","boldDoubleLeft","boldDoubleRight","thinDouble","sumArray","arr","createContexts","makeContext","addToContext","tickToContextMap","tickList","integerTicks","newContext","array","list","getRestLineForNextNoteGroup","currRestLine","currNoteIndex","nextRestLine","noteIndex","formatterOptions","globalSoftmax","maxIterations","justifyWidth","totalCost","durationStats","minTotalWidth","hasMinTotalWidth","tickContexts","modifierContexts","contextGaps","total","gaps","lossHistory","paddingBetween","accumulator","stavePadding","gap","toFixed","auto_beam","align_rests","applyAndGetBeams","formatToStave","tabstave","tabnotes","autobeam","notevoice","tabvoice","alignAllNotes","alignTuplets","currTickable","prevTickable","alignRests","AlignRestsToNotes","preCalculateMinTotalWidth","unalignedPadding","unalignedCtxCount","wsum","dsum","createTickContexts","contextList","contextMap","wavg","wvar","ll","wpads","davg","dvar","dpads","padmax","unalignedPad","createModifierContexts","contextArray","renderingContext","voicesParam","evaluate","firstContext","calculateIdealDistances","adjustedJustifyWidth","backTickable","prevContext","backVoices","matchingVoices","maxNegativeShiftPx","expectedDistance","thisTickable","insideLeftEdge","backMetrics","insideRightEdge","fromTickable","fromTickablePx","shiftToIdealDistances","idealDistances","centerX","spaceAccum","contextX","ideal","errorPx","negativeShiftPx","configMinPadding","configMaxPadding","targetWidth","distances","actualWidth","minDistance","mdCalc","di","calcMinDistance","paddingMax","maxX","prevTick","prevMetrics","currMetrics","leftNoteEdge","rightNote","rightMetrics","stats","count","updateStats","totalDeviation","tune","alpha","current","cost","postFormatContexts","optionsParam","TupletLocation","Tuplet","numerator_glyphs","denom_glyphs","num_notes","beats_occupied","beatsOccupiedDeprecationWarning","notes_occupied","bracketed","ratioed","setTupletLocation","location","LOCATION_TOP","resolveGlyphs","attach","LOCATION_BOTTOM","NESTING_OFFSET","detach","setBracketed","setRatioed","getNotes","getBeatsOccupied","setBeatsOccupied","beats","setNotesOccupied","unshift","getNestedTupletCount","maxTupletCount","countTuplets","minTupletCount","tupletCount","getYPosition","nested_tuplet_y_offset","topModifierOffset","modLines","modY","noteHeadOffset","stemOffset","lineCheck","nn","bottom_y","addGlyphWidth","notation_start_x","colon_x","colon_radius","calculateStemDirection","lineSum","keyProp","BEAM_LEFT","BEAM_BOTH","slope","stem_weight","memo","break_on_indices","max_slope","min_slope","slope_iterations","slope_cost","show_stemlets","stemlet_extension","flat_beams","min_flat_beam_offset","time_sig","beatTotal","beatValue","generateBeams","config","tickGroups","unprocessedNotes","currentTickGroup","noteGroups","currentGroup","nextTickGroup","nextGroup","currentGroupTotalTicks","unprocessedNote","ticksPerGroup","vf_notes","unbeamable","createGroups","sanitizedGroups","tempGroup","isFirstOrLast","breaksOnEachRest","beam_rests","breaksOnFirstOrLastRest","beam_middle_only","breakOnStemChange","maintain_stem_directions","prevDirection","isUnbeamableDuration","sanitizeGroups","findFirstNote","applyStemDirection","beamedNoteGroups","beamable","allTuplets","uniqueTuplets","noteTuplet","getTuplets","secondary_breaks","secondary_break_ticks","flat_beam_offset","beamCount","breakSecondaryAt","indices","getSlopeY","calculateSlope","firstNote","initialSlope","firstStemTipY","firstStemX","getStemSlope","minCost","MAX_VALUE","bestSlope","totalStemExtension","yShiftTemp","adjustedStemTipY","diff","idealSlope","calculateFlatSlope","extremeY","extremeBeamCount","currentExtreme","extremeTest","newOffset","getBeamYToDraw","beamY","applyStemExtensions","beamedStemTipY","preBeamExtension","beamExtension","totalBeamWidth","lookupBeamDirection","prev_tick","next_tick","lookup_duration","prev_note_gets_beam","next_note_gets_beam","note_gets_beam","getBeamLines","tick_of_duration","beam_started","beam_lines","current_beam","previous_should_break","tick_tally","should_break","next_note","beam_alone","beam_direction","last_beam","drawStems","drawBeamLines","valid_beam_durations","beamThickness","beamLines","beam_line","startBeamX","startBeamY","lastBeamX","lastBeamY","ClefNote","clef_obj","abs_x","Crescendo","extend_left","extend_right","decrescendo","setHeight","setDecrescendo","decresc","tick_context","next_context","begin_x","half_height","reverse","renderHairpin","CurvePosition","Curve","from","to","NEAR_HEAD","position_end","invert","cps","nearHead","nearTop","NEAR_TOP","renderCurve","first_x","first_y","last_x","last_y","cp0x","cp0y","cp_spacing","end_metric","Parser","flattenMatches","matchedString","results","grammar","errorPos","expect","matchFail","returnPos","matchSuccess","matchToken","token","noSpace","regexp","RegExp","success","incrementPos","expectOne","rule","maybe","allMatches","oneMatch","localPos","or","gotOne","numMatches","expectOneOrMore","more","expectZeroOrMore","ruleFunc","bind","oneOrMore","zeroOrMore","matches","run","EasyScore","EasyScoreGrammar","PIECE","PIECES","EOL","CHORDORNOTE","PARAMS","commitPiece","COMMA","DURATION","DOTS","OPTS","CHORD","SINGLENOTE","LPAREN","NOTES","RPAREN","addChord","NOTE","NOTENAME","ACCIDENTAL","OCTAVE","addSingleNote","MICROTONES","ACCIDENTALS","DOT","setNoteDots","SLASH","MAYBESLASH","TYPES","setNoteType","DURATIONS","setNoteDuration","LBRACKET","KEYVAL","KEYVALS","RBRACKET","KEY","EQUALS","VAL","addNoteOption","SVAL","DVAL","Piece","chord","Builder","commitHooks","elements","rollingDuration","resetPiece","getElements","addCommitHook","commitHook","piece","addNote","standardAccidentals","notePiece","GhostNote","buildAndAttach","setId","commaSeparatedRegex","setClass","defaults","easyScoreHook","throwOnError","parser","ERROR_MSG","parameter","GlyphNote","ignoreTicks","setGlyph","SCALE","slash","ret","staveNoteScale","getStaveNoteScale","offsetScale","slashBBox","calcBeamedNotesSlashBBox","noteHeadBounds","defaultOffsetY","slashStemOffset","slashBeamOffset","protrusions","beam_slope","scaleX","beam_angle","atan","iPointOnBeam","slash_angle","protrusion_stem_dx","protrusion_stem_dy","protrusion_beam_dx","protrusion_beam_dy","stem0X","stemY","KeySigNote","semibreve_rest","MultiMeasureRest","number_of_measures","xs","hasPaddingLeft","hasPaddingRight","hasLineThickness","hasSymbolSpacing","padding_left","padding_right","line_thickness","symbol_spacing","use_symbols","show_number","number_line","number_glyph_point","serif_thickness","semibreve_rest_glyph_scale","getXs","drawLine","spacingBetweenLines","lineThicknessHalf","serifThickness","bot","leftIndented","rightIndented","lineTop","lineBottom","drawSymbols","n4","n2","n1","get_semibreve_rest","rest_scale","rest_width","yMiddle","timeSig","drawPedalGlyph","glyph_data","PedalMarking","custom_depress_text","custom_release_text","bracket_height","text_margin_right","bracket_line_width","pedal","MIXED","setCustomText","depress","drawBracketed","prev_x","prev_y","is_pedal_depressed","next_is_same","prev_is_same","drawText","pedal_depress","pedal_release","mixed","CODES","RepeatNote","drawArrowHead","StaveLine","line_dash","rounded_end","draw_start_arrow","draw_end_arrow","arrowhead_length","arrowhead_angle","text_position_vertical","TextVerticalPosition","text_justification","TextJustification","applyLineStyle","applyFontStyle","drawArrowLine","pt1","pt2","both_arrows","distance","ratio","end_y","start_y","line_angle","angle1","angle2","top_x","bottom_x","start_position","end_position","first_index","last_index","upwards_slope","notehead_width","vertical_position","System","spaceBetweenStaves","autoWidth","noJustification","debugFormatter","formatIterations","noPadding","details","formatOptions","addConnector","connector","addStave","staveOptions","spaceAbove","spaceBelow","debugNoteMetrics","options_details","allVoices","debugNoteMetricsYs","part","lastY","plotDebugging","plotMetrics","positions","ghost","draw_dots","draw_stem_through_stave","setGhost","tabToGlyph","getStemY","stemDownLine","stemStartLine","flag_x","flag_y","flag_code","drawStemThrough","stemThrough","stemLines","unused_strings","up_stem","down_stem","line_spacing","total_lines","stem_lines","strings","containsLastString","containsFirstString","line_ys","isTopBound","isBottomBound","getPartialStemLines","strings_used","stem_through","getUnusedStringGroups","drawPositions","tab_x","render_stem","TabStave","addTabGlyph","TextBracket","TextBracketPosition","stop","show_bracket","underline_superscript","Positions","PositionsString","main_measure","main_width","main_height","super_y","super_measure","super_width","super_height","line_y","TextDynamics","sequence","glyph_font_size","total_width","letter","letter_x","current_letter","TimeSigNote","timeSigInfo","VibratoBracket","bracket_data","stop_x","Factory","renderQ","systems","staves","initRenderer","getVoices","ghostNote","textNote","barNote","clefNote","timeSigNote","keySigNote","hJustify","vJustify","kerning","numMeasures","multiMeasureRest","secondaryBeamBreaks","curve","tie","vibratoBracket","textBracket","system","StaveHairpin","hairpin","left_shift_px","right_shift_px","right_shift_ticks","left_shift_ticks","ppt","pixelsPerTick","l_shift_px","r_shift_px","hairpin_options","setRenderOptions","dis","staff_height","l_shift","r_shift","CRESC","DECRESC","TabSlide","first_fret","last_fret","SLIDE_UP","SLIDE_DOWN","slide_y","Tuning","tuningString","tuningValues","setTuning","names","standard","dagdad","dropd","standardBanjo","noteToInteger","getValueForString","stringNum","getValueForFret","fretNum","stringValue","getNoteForFret","integerToNote","Flow","BUILD","VERSION","DATE","fontNames","fontModuleOrPath","hasKeySignature","getKeySignatures","GraceTabNote","KeyManager","setKey","getKey","scaleMapByValue","originalScaleMapByValue","getAccidental","selectNote","scaleNote","modparts","change","valueNote","originalValueNote","Tremolo","y_spacing_scale","extra_stroke_scale","y_spacing","cmp","eq","newArr","last","canvasSelector","start_time","Date","getTime","CustomFont","noteheadSquareWhite","noteheadSquareBlack","accidentalBuyukMucennebFlat","accidentalBakiyeFlat","accidentalKucukMucennebSharp","accidentalKoron","accidentalSori","vexAccidentalMicrotonal2","vexAccidentalMicrotonal3","vexAccidentalMicrotonal4","vexNoteHeadRectBlack","vexNoteHeadRectWhite","CustomMetrics","smufl","PetalumaFont","bracketTop","y_min","bracketBottom","barlineTick","breathMarkTick","gClef","cClef","fClef","unpitchedPercussionClef1","timeSig0","timeSig1","timeSig2","timeSig3","timeSig4","timeSig5","timeSig6","timeSig7","timeSig8","timeSig9","timeSigCommon","timeSigCutCommon","timeSigPlus","timeSigPlusSmall","timeSigMinus","timeSigParensRight","timeSigParensRightSmall","timeSigParensLeft","timeSigParensLeftSmall","noteheadDoubleWhole","noteheadWhole","noteheadHalf","noteheadBlack","noteheadXWhole","noteheadXHalf","noteheadXBlack","noteheadCircleX","noteheadTriangleUpWhole","noteheadTriangleUpHalf","noteheadTriangleUpBlack","noteheadDiamondWhole","noteheadDiamondHalf","noteheadDiamondBlack","noteheadParenthesis","noteheadParenthesisRight","noteheadParenthesisLeft","augmentationDot","tremolo1","flag8thUp","flag8thDown","flag16thUp","flag16thDown","flag32ndUp","flag32ndDown","flag64thUp","flag64thDown","flag128thUp","flag128thDown","accidentalFlat","accidentalNatural","accidentalSharp","accidentalDoubleSharp","accidentalDoubleFlat","accidentalParensLeft","accidentalParensRight","accidentalQuarterToneFlatStein","accidentalThreeQuarterTonesFlatZimmermann","accidentalQuarterToneSharpStein","accidentalThreeQuarterTonesSharpStein","accidentalKomaSharp","articAccentAbove","articAccentBelow","articTenutoAbove","articTenutoBelow","articStaccatoAbove","articStaccatoBelow","articStaccatissimoAbove","articStaccatissimoBelow","articMarcatoAbove","articMarcatoBelow","fermataAbove","fermataBelow","breathMarkComma","breathMarkUpbow","caesura","caesuraCurved","restMaxima","restDoubleWhole","restWhole","restHalf","restQuarter","rest8th","rest16th","rest32nd","rest64th","rest128th","dynamicPiano","dynamicMezzo","dynamicForte","dynamicRinforzando","dynamicSforzando","dynamicZ","ornamentTrill","ornamentTurn","ornamentTurnSlash","ornamentMordent","ornamentShortTrill","ornamentTremblement","ornamentPrecompAppoggTrill","ornamentPrecompSlideTrillDAnglebert","ornamentPrecompSlideTrillBach","ornamentPrecompTrillSuffixDandrieu","ornamentPrecompDoubleCadenceUpperPrefix","ornamentPrecompDoubleCadenceUpperPrefixTurn","ornamentPrecompTrillLowerSuffix","brassScoop","brassDoitMedium","brassFallLipShort","brassLiftMedium","brassFallRoughMedium","brassBend","brassMuteClosed","brassMuteOpen","brassFlip","brassJazzTurn","brassSmear","stringsDownBow","stringsUpBow","stringsHarmonic","pluckedSnapPizzicatoAbove","pluckedSnapPizzicatoBelow","pluckedLeftHandPizzicato","keyboardPedalPed","keyboardPedalUp","pictChokeCymbal","wiggleArpeggiatoUp","arpeggiatoUp","arpeggiatoDown","repeat1Bar","repeat2Bars","repeat4Bars","repeatBarSlash","csymDiminished","csymHalfDiminished","csymAugmented","csymMajorSeventh","csymMinor","csymParensLeftTall","csymParensRightTall","csymBracketLeftTall","csymBracketRightTall","csymParensLeftVeryTall","csymParensRightVeryTall","csymDiagonalArrangementSlash","generatedOn","PetalumaMetrics","endPaddingMax","endPaddingMin","unalignedNotePadding","default","small","smuflCode","shiftX","lineCount","gracenote","pedalMarking","up","down","digits","shiftLine","tupletPoint","tremolo","offsetYStemUp","offsetYStemDown","offsetXStemUp","offsetXStemDown","grace","staveRepetition","offsetY","offsetSymbol","heightAdjustmentForFlag","tabStem","staveTempo","arrowheadBlackDown","straight","wiggly","arrowheadBlackUp","minPadding","noteheadBlackStemUp","noteheadHalfStemUp","noteheadWholeStemUp","custom","noteheadCircleXStemUp","noteheadCircleXStemDown","noteheadDiamondHalfStemUp","noteheadDiamondBlackStemUp","noteheadDiamondWholeStemUp","noteheadXBlackStemUp","noteheadXHalfStemUp","noteheadXHalfStemDown","noteheadXWholeStemUp","noteheadXWholeStemDown","noteheadSquareWhiteStemDown","noteheadSquareWhiteStemUp","noteheadSquareBlackStemUp","noteheadTriangleUpWholeStemUp","PetalumaScriptFont","$","I","J","K","N","O","Q","U","V","Y","Z","_","l","RobotoSlabFont","setMusicFont","fontData","registerInfo","description","loadTextFonts"],"sourceRoot":""} \ No newline at end of file diff --git a/build/cjs/vexflow.js b/build/cjs/vexflow.js new file mode 100644 index 0000000000..97b6ad35ad --- /dev/null +++ b/build/cjs/vexflow.js @@ -0,0 +1,7 @@ +/*! + * VexFlow 4.0.1-alpha.2 2022-02-02T09:30:30.784Z 0df10df6d1fab3a99f5aa306341a31c6e686d659 + * Copyright (c) 2010 Mohit Muthanna Cheppudira + * https://www.vexflow.com https://github.com/0xfe/vexflow + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.Vex=e():t.Vex=e()}("undefined"!=typeof window?window:"undefined"!=typeof globalThis?globalThis:this,(function(){return(()=>{"use strict";var t={d:(e,i)=>{for(var b in i)t.o(i,b)&&!t.o(e,b)&&Object.defineProperty(e,b,{enumerable:!0,get:i[b]})}};t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),t.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var e={};function i(t,e,i=!0){if("object"!=typeof t||null===t)return!1;let b=t.constructor;if(i){for(;null!==t;){if(b=t.constructor,"CATEGORY"in b&&b.CATEGORY===e)return!0;t=Object.getPrototypeOf(t)}return!1}return"CATEGORY"in b&&b.CATEGORY===e}t.d(e,{default:()=>Ai});const b=t=>i(t,r.Barline),a=t=>i(t,r.GraceNote),s=t=>i(t,r.Note),n=t=>i(t,r.StaveNote),l=t=>i(t,r.StemmableNote),o=t=>i(t,r.TabNote);var r;!function(t){t.Accidental="Accidental",t.Annotation="Annotation",t.Articulation="Articulation",t.Barline="Barline",t.BarNote="BarNote",t.Beam="Beam",t.Bend="Bend",t.ChordSymbol="ChordSymbol",t.Clef="Clef",t.ClefNote="ClefNote",t.Crescendo="Crescendo",t.Curve="Curve",t.Dot="Dot",t.Element="Element",t.Fraction="Fraction",t.FretHandFinger="FretHandFinger",t.GhostNote="GhostNote",t.Glyph="Glyph",t.GlyphNote="GlyphNote",t.GraceNote="GraceNote",t.GraceNoteGroup="GraceNoteGroup",t.GraceTabNote="GraceTabNote",t.KeySignature="KeySignature",t.KeySigNote="KeySigNote",t.Modifier="Modifier",t.MultiMeasureRest="MultiMeasureRest",t.Note="Note",t.NoteHead="NoteHead",t.NoteSubGroup="NoteSubGroup",t.Ornament="Ornament",t.Parenthesis="Parenthesis",t.PedalMarking="PedalMarking",t.RenderContext="RenderContext",t.RepeatNote="RepeatNote",t.Repetition="Repetition",t.Stave="Stave",t.StaveConnector="StaveConnector",t.StaveHairpin="StaveHairpin",t.StaveLine="StaveLine",t.StaveModifier="StaveModifier",t.StaveNote="StaveNote",t.StaveSection="StaveSection",t.StaveTempo="StaveTempo",t.StaveText="StaveText",t.StaveTie="StaveTie",t.Stem="Stem",t.StemmableNote="StemmableNote",t.StringNumber="StringNumber",t.Stroke="Stroke",t.System="System",t.TabNote="TabNote",t.TabSlide="TabSlide",t.TabStave="TabStave",t.TabTie="TabTie",t.TextBracket="TextBracket",t.TextDynamics="TextDynamics",t.TextNote="TextNote",t.Tickable="Tickable",t.TimeSignature="TimeSignature",t.TimeSigNote="TimeSigNote",t.Tremolo="Tremolo",t.Tuplet="Tuplet",t.Vibrato="Vibrato",t.VibratoBracket="VibratoBracket",t.Voice="Voice",t.Volta="Volta"}(r||(r={}));class h extends Error{constructor(t,e=""){super("[RuntimeError] "+t+": "+e),this.code=t}}function c(){return"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==t.g?t.g:Function("return this")()}function m(t,e="undefined",i=""){if(void 0===t)throw new h(e,i);return t}function d(t,...e){if(!e)return;const i=Array.prototype.slice.call(e).join(" ");c().console.log(t+": "+i)}function _(...t){const e=t.join(" "),i=new Error;c().console.log("Warning: ",e,i.stack)}function x(t,e){let i=e+(t-e)/2;var b,a;return i%2>0&&(i=((b=10*i)%(a=5)>=a/2?parseInt(""+b/a,10)*a+a:parseInt(""+b/a,10)*a)/10),i}function g(t){return`vf-${t}`}function p(t){return(t%=2*Math.PI)<0&&(t+=2*Math.PI),t}class u{constructor(t,e){this.numerator=1,this.denominator=1,this.set(t,e)}static get CATEGORY(){return r.Fraction}static GCD(t,e){if("number"!=typeof t||Number.isNaN(t)||"number"!=typeof e||Number.isNaN(e))throw new h("BadArgument",`Invalid numbers: ${t}, ${e}`);let i;for(;0!==e;)i=e,e=t%e,t=i;return t}static LCM(t,e){return t*e/u.GCD(t,e)}static LCMM(t){return 0===t.length?0:1===t.length?t[0]:2===t.length?u.LCM(t[0],t[1]):u.LCM(t.shift(),u.LCMM(t))}set(t=1,e=1){return this.numerator=t,this.denominator=e,this}value(){return this.numerator/this.denominator}simplify(){let t=this.numerator,e=this.denominator;const i=u.GCD(t,e);return t/=i,e/=i,e<0&&(e=-e,t=-t),this.set(t,e)}add(t=0,e=1){const[i,b]=f(t,e),a=u.LCM(this.denominator,b),s=a/this.denominator,n=a/b,l=this.numerator*s+i*n;return this.set(l,a)}subtract(t=0,e=1){const[i,b]=f(t,e),a=u.LCM(this.denominator,b),s=a/this.denominator,n=a/b,l=this.numerator*s-i*n;return this.set(l,a)}multiply(t=1,e=1){const[i,b]=f(t,e);return this.set(this.numerator*i,this.denominator*b)}divide(t=1,e=1){const[i,b]=f(t,e);return this.set(this.numerator*b,this.denominator*i)}equals(t){const e=u.__staticFractionA.copy(t).simplify(),i=u.__staticFractionB.copy(this).simplify();return e.numerator===i.numerator&&e.denominator===i.denominator}greaterThan(t){const e=u.__staticFractionB.copy(this);return e.subtract(t),e.numerator>0}greaterThanEquals(t){const e=u.__staticFractionB.copy(this);return e.subtract(t),e.numerator>=0}lessThan(t){return!this.greaterThanEquals(t)}lessThanEquals(t){return!this.greaterThan(t)}clone(){return new u(this.numerator,this.denominator)}copy(t){return"number"==typeof t?this.set(t,1):this.set(t.numerator,t.denominator)}quotient(){return Math.floor(this.numerator/this.denominator)}remainder(){return this.numerator%this.denominator}makeAbs(){return this.denominator=Math.abs(this.denominator),this.numerator=Math.abs(this.numerator),this}toString(){return`${this.numerator}/${this.denominator}`}toSimplifiedString(){return u.__staticFractionTmp.copy(this).simplify().toString()}toMixedString(){let t="";const e=this.quotient(),i=u.__staticFractionTmp.copy(this);return e<0&&i.makeAbs(),0!==e?(t+=e,0!==i.numerator&&(t+=` ${i.toSimplifiedString()}`)):t=0===i.numerator?"0":i.toSimplifiedString(),t}parse(t){const e=t.split("/"),i=parseInt(e[0],10),b=e[1]?parseInt(e[1],10):1;return this.set(i,b)}}function f(t,e=1){return"number"==typeof t?[t,e]:[t.numerator,t.denominator]}u.__staticFractionA=new u,u.__staticFractionB=new u,u.__staticFractionTmp=new u;class y{constructor(t,e,i,b){this.x=t,this.y=e,this.w=i,this.h=b}static copy(t){return new y(t.x,t.y,t.w,t.h)}getX(){return this.x}getY(){return this.y}getW(){return this.w}getH(){return this.h}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setW(t){return this.w=t,this}setH(t){return this.h=t,this}move(t,e){return this.x+=t,this.y+=e,this}clone(){return y.copy(this)}mergeWith(t){const e=t,i=this.xthis.x2)&&(this.x2=t),(isNaN(this.y1)||ethis.y2)&&(this.y2=e)}addX(t){this.addPoint(t,this.y1)}addY(t){this.addPoint(this.x1,t)}addQuadraticCurve(t,e,i,b,a,s){this.addPoint(t,e),this.addPoint(a,s);const n=i-t;let l=n-(a-i);if(0!=l){const e=n/l;if(e>0&&e<1){const b=1-e;this.addX(b*b*t+2*b*e*i+e*e*a)}}const o=b-e;if(l=o-(s-b),0!=l){const t=o/l;if(t>0&&t<1){const i=1-t;this.addY(i*i*e+2*i*t*b+t*t*s)}}}addBezierCurve(t,e,i,b,a,s,n,l){const o=[t,e],r=[i,b],h=[a,s],c=[n,l];let m;this.addPoint(o[0],o[1]),this.addPoint(c[0],c[1]);const d=(t,e)=>Math.pow(1-t,3)*o[e]+3*Math.pow(1-t,2)*t*r[e]+3*(1-t)*Math.pow(t,2)*h[e]+Math.pow(t,3)*c[e];for(m=0;m<=1;m++){const t=6*o[m]-12*r[m]+6*h[m],e=-3*o[m]+9*r[m]-9*h[m]+3*c[m],i=3*r[m]-3*o[m];if(0===e){if(0===t)continue;const e=-i/t;0=600;{const e=parseInt(t,10);return isNaN(e)?"bold"===t.toLowerCase():e>=600}}return!1}static isItalic(t){return!!t&&t.toLowerCase()===w.ITALIC}static loadWebFont(t,e,i=!0){return v(this,void 0,void 0,(function*(){const b=new FontFace(t,(i?`url(${e}2) format('woff2'), `:"")+`url(${e}) format('woff')`);return yield b.load(),document.fonts.add(b),b}))}static loadWebFonts(){return v(this,void 0,void 0,(function*(){const t=E.WEB_FONT_HOST,e=E.WEB_FONT_FILES;for(const i in e){const b=e[i];E.loadWebFont(i,t+b)}}))}static loadTextFonts(){}static load(t,e,i){let b=C[t];return b||(b=new E(t),C[t]=b),e&&b.setData(e),i&&b.setMetrics(i),b}getName(){return this.name}getData(){return m(this.data,"FontError","Missing font data")}getMetrics(){return m(this.metrics,"FontError","Missing metrics")}setData(t){this.data=t}setMetrics(t){this.metrics=t}hasData(){return void 0!==this.data}getResolution(){return this.getData().resolution}getGlyphs(){return this.getData().glyphs}lookupMetric(t,e){const i=t.split(".");let b=this.getMetrics();for(let t=0;tt[e]))}}return[]}getElementsByType(t){return this.getElementsByAttribute("type",t)}getElementsByClass(t){return this.getElementsByAttribute("class",t)}onUpdate(t){return["id","type","class"].includes(t.name)&&this.updateIndex(t),this}}class P{constructor(){var t;this.attrs={id:P.newID(),el:void 0,type:this.getCategory(),classes:{}},this.rendered=!1,null===(t=B.getDefaultRegistry())||void 0===t||t.register(this)}static get CATEGORY(){return r.Element}static newID(){return"auto"+P.ID++}getCategory(){return this.constructor.CATEGORY}setStyle(t){return this.style=t,this}getStyle(){return this.style}applyStyle(t=this.context,e=this.getStyle()){return e&&t?(t.save(),e.shadowColor&&t.setShadowColor(e.shadowColor),e.shadowBlur&&t.setShadowBlur(e.shadowBlur),e.fillStyle&&t.setFillStyle(e.fillStyle),e.strokeStyle&&t.setStrokeStyle(e.strokeStyle),e.lineWidth&&t.setLineWidth(e.lineWidth),this):this}restoreStyle(t=this.context,e=this.getStyle()){return e&&t?(t.restore(),this):this}drawWithStyle(){this.checkContext(),this.applyStyle(),this.draw(),this.restoreStyle()}hasClass(t){return!0===this.attrs.classes[t]}addClass(t){var e;return this.attrs.classes[t]=!0,null===(e=this.registry)||void 0===e||e.onUpdate({id:this.attrs.id,name:"class",value:t,oldValue:void 0}),this}removeClass(t){var e;return delete this.attrs.classes[t],null===(e=this.registry)||void 0===e||e.onUpdate({id:this.attrs.id,name:"class",value:void 0,oldValue:t}),this}onRegister(t){return this.registry=t,this}isRendered(){return this.rendered}setRendered(t=!0){return this.rendered=t,this}getAttributes(){return this.attrs}getAttribute(t){return this.attrs[t]}setAttribute(t,e){var i;const b=this.attrs.id,a=this.attrs[t];return this.attrs[t]=e,null===(i=this.registry)||void 0===i||i.onUpdate({id:b,name:t,value:e,oldValue:a}),this}getBoundingBox(){return this.boundingBox}getContext(){return this.context}setContext(t){return this.context=t,this}checkContext(){return m(this.context,"NoContext","No rendering context attached to instance.")}set font(t){this.setFont(t)}get font(){return E.toCSSString(this.textFont)}setFont(t,e,i,b){const a=this.constructor.TEXT_FONT,s="object"==typeof t,n="string"==typeof t,l=void 0===t,o=void 0===e&&void 0===i&&void 0===b;return this.textFont=s?Object.assign(Object.assign({},a),t):n&&o?E.fromCSSString(t):l&&o?Object.assign({},a):E.validate(null!=t?t:a.family,null!=e?e:a.size,null!=i?i:a.weight,null!=b?b:a.style),this}getFont(){return this.textFont||this.resetFont(),E.toCSSString(this.textFont)}resetFont(){this.setFont()}get fontInfo(){return this.textFont||this.resetFont(),Object.assign({},this.textFont)}set fontInfo(t){this.setFont(t)}setFontSize(t){const e=this.fontInfo;return this.setFont(e.family,t,e.weight,e.style),this}getFontSize(){return this.fontSize}set fontSize(t){this.setFontSize(t)}get fontSize(){let t=this.fontInfo.size;return"number"==typeof t&&(t=`${t}pt`),t}get fontSizeInPoints(){return E.convertSizeToPointValue(this.fontSize)}get fontSizeInPixels(){return E.convertSizeToPixelValue(this.fontSize)}get fontStyle(){return this.fontInfo.style}set fontStyle(t){const e=this.fontInfo;this.setFont(e.family,e.size,e.weight,t)}get fontWeight(){return this.fontInfo.weight+""}set fontWeight(t){const e=this.fontInfo;this.setFont(e.family,e.size,t,e.style)}}var F,A;P.ID=1e3,P.TEXT_FONT={family:E.SANS_SERIF,size:E.SIZE,weight:T.NORMAL,style:w.NORMAL},function(t){t[t.MOVE=0]="MOVE",t[t.LINE=1]="LINE",t[t.QUADRATIC=2]="QUADRATIC",t[t.BEZIER=3]="BEZIER"}(F||(F={}));class M{constructor(t,e,i){this.point=-1,this.metrics=O.loadMetrics(t,e,i),this.bbox=O.getOutlineBoundingBox(this.metrics.outline,this.metrics.scale,this.metrics.x_shift,this.metrics.y_shift),i&&(this.point=O.lookupFontMetric(this.metrics.font,i,e,"point",-1))}}class N{constructor(t,e,i,b){this.outline=t,this.originX=e,this.originY=i,this.scale=b,this.i=0}done(){return this.i>=this.outline.length}next(){return this.outline[this.i++]}nextX(){return this.originX+this.outline[this.i++]*this.scale}nextY(){return this.originY-this.outline[this.i++]*this.scale}static parse(t){const e=[],i=t.split(" ");let b=0;for(;b{const e=t.getTickContext();a&&t.setStave(a),e.setXOffset(s)}))}}class R{static get NUM_TONES(){return this.canonical_notes.length}static get roots(){return["c","d","e","f","g","a","b"]}static get root_values(){return[0,2,4,5,7,9,11]}static get root_indices(){return{c:0,d:1,e:2,f:3,g:4,a:5,b:6}}static get canonical_notes(){return["c","c#","d","d#","e","f","f#","g","g#","a","a#","b"]}static get diatonic_intervals(){return["unison","m2","M2","m3","M3","p4","dim5","p5","m6","M6","b7","M7","octave"]}static get diatonic_accidentals(){return{unison:{note:0,accidental:0},m2:{note:1,accidental:-1},M2:{note:1,accidental:0},m3:{note:2,accidental:-1},M3:{note:2,accidental:0},p4:{note:3,accidental:0},dim5:{note:4,accidental:-1},p5:{note:4,accidental:0},m6:{note:5,accidental:-1},M6:{note:5,accidental:0},b7:{note:6,accidental:-1},M7:{note:6,accidental:0},octave:{note:7,accidental:0}}}static get intervals(){return{u:0,unison:0,m2:1,b2:1,min2:1,S:1,H:1,2:2,M2:2,maj2:2,T:2,W:2,m3:3,b3:3,min3:3,M3:4,3:4,maj3:4,4:5,p4:5,"#4":6,b5:6,aug4:6,dim5:6,5:7,p5:7,"#5":8,b6:8,aug5:8,6:9,M6:9,maj6:9,b7:10,m7:10,min7:10,dom7:10,M7:11,maj7:11,8:12,octave:12}}static get scales(){return{major:[2,2,1,2,2,2,1],minor:[2,1,2,2,1,2,2],ionian:[2,2,1,2,2,2,1],dorian:[2,1,2,2,2,1,2],phyrgian:[1,2,2,2,1,2,2],lydian:[2,2,2,1,2,2,1],mixolydian:[2,2,1,2,2,1,2],aeolian:[2,1,2,2,1,2,2],locrian:[1,2,2,1,2,2,2]}}static get scaleTypes(){return{M:R.scales.major,m:R.scales.minor}}static get accidentals(){return["bb","b","n","#","##"]}static get noteValues(){return{c:{root_index:0,int_val:0},cn:{root_index:0,int_val:0},"c#":{root_index:0,int_val:1},"c##":{root_index:0,int_val:2},cb:{root_index:0,int_val:11},cbb:{root_index:0,int_val:10},d:{root_index:1,int_val:2},dn:{root_index:1,int_val:2},"d#":{root_index:1,int_val:3},"d##":{root_index:1,int_val:4},db:{root_index:1,int_val:1},dbb:{root_index:1,int_val:0},e:{root_index:2,int_val:4},en:{root_index:2,int_val:4},"e#":{root_index:2,int_val:5},"e##":{root_index:2,int_val:6},eb:{root_index:2,int_val:3},ebb:{root_index:2,int_val:2},f:{root_index:3,int_val:5},fn:{root_index:3,int_val:5},"f#":{root_index:3,int_val:6},"f##":{root_index:3,int_val:7},fb:{root_index:3,int_val:4},fbb:{root_index:3,int_val:3},g:{root_index:4,int_val:7},gn:{root_index:4,int_val:7},"g#":{root_index:4,int_val:8},"g##":{root_index:4,int_val:9},gb:{root_index:4,int_val:6},gbb:{root_index:4,int_val:5},a:{root_index:5,int_val:9},an:{root_index:5,int_val:9},"a#":{root_index:5,int_val:10},"a##":{root_index:5,int_val:11},ab:{root_index:5,int_val:8},abb:{root_index:5,int_val:7},b:{root_index:6,int_val:11},bn:{root_index:6,int_val:11},"b#":{root_index:6,int_val:0},"b##":{root_index:6,int_val:1},bb:{root_index:6,int_val:10},bbb:{root_index:6,int_val:9}}}isValidNoteValue(t){return t>=0&&t=0&&t3)throw new h("BadArguments","Invalid note name: "+t);const e=t.toLowerCase(),i=/^([cdefgab])(b|bb|n|#|##)?$/.exec(e);if(null!==i){return{root:i[1],accidental:i[2]}}throw new h("BadArguments","Invalid note name: "+t)}getKeyParts(t){if(!t||t.length<1)throw new h("BadArguments","Invalid key: "+t);const e=t.toLowerCase(),i=/^([cdefgab])(b|#)?(mel|harm|m|M)?$/.exec(e);if(null!==i){const t=i[1],e=i[2];let b=i[3];return b||(b="M"),{root:t,accidental:e,type:b}}throw new h("BadArguments",`Invalid key: ${t}`)}getNoteValue(t){const e=R.noteValues[t];if(void 0===e)throw new h("BadArguments",`Invalid note name: ${t}`);return e.int_val}getIntervalValue(t){const e=R.intervals[t];if(void 0===e)throw new h("BadArguments",`Invalid interval name: ${t}`);return e}getCanonicalNoteName(t){if(!this.isValidNoteValue(t))throw new h("BadArguments",`Invalid note value: ${t}`);return R.canonical_notes[t]}getCanonicalIntervalName(t){if(!this.isValidIntervalValue(t))throw new h("BadArguments",`Invalid interval value: ${t}`);return R.diatonic_intervals[t]}getRelativeNoteValue(t,e,i=1){if(1!==i&&-1!==i)throw new h("BadArguments",`Invalid direction: ${i}`);let b=(t+i*e)%R.NUM_TONES;return b<0&&(b+=R.NUM_TONES),b}getRelativeNoteName(t,e){const i=this.getNoteParts(t),b=this.getNoteValue(i.root);let a=e-b;if(Math.abs(a)>R.NUM_TONES-3){let i=1;a>0&&(i=-1);const s=(e+1+(b+1))%R.NUM_TONES*i;if(Math.abs(s)>2)throw new h("BadArguments",`Notes not related: ${t}, ${e})`);a=s}if(Math.abs(a)>2)throw new h("BadArguments",`Notes not related: ${t}, ${e})`);let s=i.root;if(a>0)for(let t=1;t<=a;++t)s+="#";else if(a<0)for(let t=-1;t>=a;--t)s+="b";return s}getScaleTones(t,e){const i=[t];let b=t;for(let a=0;a":{aboveCode:"articAccentAbove",belowCode:"articAccentBelow",between_lines:!0},"a-":{aboveCode:"articTenutoAbove",belowCode:"articTenutoBelow",between_lines:!0},"a^":{aboveCode:"articMarcatoAbove",belowCode:"articMarcatoBelow",between_lines:!1},"a+":{code:"pluckedLeftHandPizzicato",between_lines:!1},ao:{aboveCode:"pluckedSnapPizzicatoAbove",belowCode:"pluckedSnapPizzicatoBelow",between_lines:!1},ah:{code:"stringsHarmonic",between_lines:!1},"a@":{aboveCode:"fermataAbove",belowCode:"fermataBelow",between_lines:!1},"a@a":{code:"fermataAbove",between_lines:!1},"a@u":{code:"fermataBelow",between_lines:!1},"a|":{code:"stringsUpBow",between_lines:!1},am:{code:"stringsDownBow",between_lines:!1},"a,":{code:"pictChokeCymbal",between_lines:!1}},V={mordent:{code:"ornamentShortTrill"},mordent_inverted:{code:"ornamentMordent"},turn:{code:"ornamentTurn"},turn_inverted:{code:"ornamentTurnSlash"},tr:{code:"ornamentTrill"},upprall:{code:"ornamentPrecompSlideTrillDAnglebert"},downprall:{code:"ornamentPrecompDoubleCadenceUpperPrefix"},prallup:{code:"ornamentPrecompTrillSuffixDandrieu"},pralldown:{code:"ornamentPrecompTrillLowerSuffix"},upmordent:{code:"ornamentPrecompSlideTrillBach"},downmordent:{code:"ornamentPrecompDoubleCadenceUpperPrefixTurn"},lineprall:{code:"ornamentPrecompAppoggTrill"},prallprall:{code:"ornamentTremblement"},scoop:{code:"brassScoop"},doit:{code:"brassDoitMedium"},fall:{code:"brassFallLipShort"},doitLong:{code:"brassLiftMedium"},fallLong:{code:"brassFallRoughMedium"},bend:{code:"brassBend"},plungerClosed:{code:"brassMuteClosed"},plungerOpen:{code:"brassMuteOpen"},flip:{code:"brassFlip"},jazzTurn:{code:"brassJazzTurn"},smear:{code:"brassSmear"}};class K{static currentMusicFont(){if(0===K.MUSIC_FONT_STACK.length)throw new h("NoFonts","The font stack is empty. See: await Flow.fetchMusicFont(...); Flow.setMusicFont(...).");return K.MUSIC_FONT_STACK[0]}static clefProperties(t){if(!t||!(t in Y))throw new h("BadArgument","Invalid clef: "+t);return Y[t]}static keyProperties(t,e="treble",i){let b={octave_shift:0};"object"==typeof i&&(b=Object.assign(Object.assign({},b),i));const a=t.split("/");if(a.length<2)throw new h("BadArguments",`First argument must be note/octave or note/octave/glyph-code: ${t}`);const s=a[0].toUpperCase(),n=G[s];if(!n)throw new h("BadArguments","Invalid key name: "+s);n.octave&&(a[1]=n.octave.toString());let l=parseInt(a[1],10);l+=-1*b.octave_shift;let o=(7*l-28+n.index)/2;o+=K.clefProperties(e).line_shift;let r=0;o<=0&&2*o%2==0&&(r=1),o>=6&&2*o%2==0&&(r=-1);const c=void 0!==n.int_val?12*l+n.int_val:void 0,m=n.code,d=n.shift_right;let _={};if(a.length>2&&a[2]){const t=a[2].toUpperCase();_=X[t]||{}}return Object.assign({key:s,octave:l,line:o,int_value:c,accidental:n.accidental,code:m,stroke:r,shift_right:d,displaced:!1},_)}static integerToNote(t){if(void 0===t||t<0||t>11)throw new h("BadArguments",`integerToNote() requires an integer in the range [0, 11]: ${t}`);const e={0:"C",1:"C#",2:"D",3:"D#",4:"E",5:"F",6:"F#",7:"G",8:"G#",9:"A",10:"A#",11:"B"}[t];if(!e)throw new h("BadArguments",`Unknown note value for integer: ${t}`);return e}static tabToGlyph(t,e=1){let i,b=0,a=0;if("X"===t.toUpperCase()){const t=new O("accidentalDoubleSharp",K.TABLATURE_FONT_SCALE).getMetrics();if(i="accidentalDoubleSharp",null==t.width||null==t.height)throw new h("InvalidMetrics","Width and height required");b=t.width,a=-t.height/2}else b=K.textWidth(t);return{text:t,code:i,getWidth:()=>b*e,shift_y:a}}static textWidth(t){return 7*t.toString().length}static articulationCodes(t){return j[t]}static accidentalCodes(t){return H[t]}static ornamentCodes(t){return V[t]}static keySignature(t){const e=I[t];if(!e)throw new h("BadKeySignature",`Bad key signature spec: '${t}'`);if(!e.acc)return[];const i={b:[2,.5,2.5,1,3,1.5,3.5],"#":[0,1.5,-.5,1,2.5,.5,2]}[e.acc],b=[];for(let t=0;tO.getWidth(a,t)}),b)}}K.STEM_WIDTH=1.5,K.STEM_HEIGHT=35,K.STAVE_LINE_THICKNESS=1,K.RESOLUTION=L,K.MUSIC_FONT_STACK=[],K.NOTATION_FONT_SCALE=39,K.TABLATURE_FONT_SCALE=39,K.SLASH_NOTEHEAD_WIDTH=15,K.STAVE_LINE_DISTANCE=10,K.TEXT_HEIGHT_OFFSET_HACK=1,K.accidentalMap=H,K.accidentalColumnsTable={1:{a:[1],b:[1]},2:{a:[1,2]},3:{a:[1,3,2],b:[1,2,1],second_on_bottom:[1,2,3]},4:{a:[1,3,4,2],b:[1,2,3,1],spaced_out_tetrachord:[1,2,1,2]},5:{a:[1,3,5,4,2],b:[1,2,4,3,1],spaced_out_pentachord:[1,2,3,2,1],very_spaced_out_pentachord:[1,2,1,2,1]},6:{a:[1,3,5,6,4,2],b:[1,2,4,5,3,1],spaced_out_hexachord:[1,3,2,1,3,2],very_spaced_out_hexachord:[1,2,1,2,1,2]}},K.unicode={sharp:String.fromCharCode(9839),flat:String.fromCharCode(9837),natural:String.fromCharCode(9838),triangle:String.fromCharCode(9651),"o-with-slash":String.fromCharCode(248),degrees:String.fromCharCode(176),circle:String.fromCharCode(9675)},K.validTypes={n:{name:"note"},r:{name:"rest"},h:{name:"harmonic"},m:{name:"muted"},s:{name:"slash"},g:{name:"ghost"}},K.TIME4_4={num_beats:4,beat_value:4,resolution:L};const $={"1/2":{common:{stem:!1,stem_offset:0,flag:!1,dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadDoubleWhole"},h:{code_head:"unpitchedPercussionClef1"},m:{code_head:"vexNoteHeadMutedBreve",stem_offset:0},r:{code_head:"restDoubleWhole",rest:!0,position:"B/5",dot_shiftY:.5},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadDoubleWhole"}}},1:{common:{stem:!1,stem_offset:0,flag:!1,dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadWhole"},h:{code_head:"noteheadDiamondWhole"},m:{code_head:"noteheadXWhole",stem_offset:-3},r:{code_head:"restWhole",rest:!0,position:"D/5",dot_shiftY:.5},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadWhole"}}},2:{common:{stem:!0,stem_offset:0,flag:!1,dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadHalf"},h:{code_head:"noteheadDiamondHalf"},m:{code_head:"noteheadXHalf",stem_offset:-3},r:{code_head:"restHalf",stem:!1,rest:!0,position:"B/4",dot_shiftY:-.5},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadHalf"}}},4:{common:{stem:!0,stem_offset:0,flag:!1,dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"restQuarter",stem:!1,rest:!0,position:"B/4",dot_shiftY:-.5,line_above:1.5,line_below:1.5},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}},8:{common:{stem:!0,stem_offset:0,flag:!0,beam_count:1,stem_beam_extension:0,code_flag_upstem:"flag8thUp",code_flag_downstem:"flag8thDown",dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"rest8th",stem:!1,flag:!1,rest:!0,position:"B/4",dot_shiftY:-.5,line_above:1,line_below:1},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}},16:{common:{beam_count:2,stem_beam_extension:0,stem:!0,stem_offset:0,flag:!0,code_flag_upstem:"flag16thUp",code_flag_downstem:"flag16thDown",dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"rest16th",stem:!1,flag:!1,rest:!0,position:"B/4",dot_shiftY:-.5,line_above:1,line_below:2},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}},32:{common:{beam_count:3,stem_beam_extension:7.5,stem:!0,stem_offset:0,flag:!0,code_flag_upstem:"flag32ndUp",code_flag_downstem:"flag32ndDown",dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"rest32nd",stem:!1,flag:!1,rest:!0,position:"B/4",dot_shiftY:-1.5,line_above:2,line_below:2},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}},64:{common:{beam_count:4,stem_beam_extension:15,stem:!0,stem_offset:0,flag:!0,code_flag_upstem:"flag64thUp",code_flag_downstem:"flag64thDown",dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"rest64th",stem:!1,flag:!1,rest:!0,position:"B/4",dot_shiftY:-1.5,line_above:2,line_below:3},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}},128:{common:{beam_count:5,stem_beam_extension:22.5,stem:!0,stem_offset:0,flag:!0,code_flag_upstem:"flag128thUp",code_flag_downstem:"flag128thDown",dot_shiftY:0,line_above:0,line_below:0},type:{n:{code_head:"noteheadBlack"},h:{code_head:"noteheadDiamondBlack"},m:{code_head:"noteheadXBlack"},r:{code_head:"rest128th",stem:!1,flag:!1,rest:!0,position:"B/4",dot_shiftY:-2.5,line_above:3,line_below:3},s:{getWidth:()=>K.SLASH_NOTEHEAD_WIDTH,position:"B/4"},g:{code_head:"noteheadBlack"}}}};function q(...t){Q.DEBUG&&d("Vex.Flow.Accidental",t)}class Q extends z{constructor(t){super(),q("New accidental: ",t),this.type=t,this.position=z.Position.LEFT,this.render_options={font_scale:38,parenLeftPadding:2,parenRightPadding:2},this.accidental=K.accidentalCodes(this.type),m(this.accidental,"ArgumentError",`Unknown accidental type: ${t}`),this.cautionary=!1,this.reset()}static get CATEGORY(){return r.Accidental}static format(t,e){if(!t||0===t.length)return;const i=K.currentMusicFont(),b=i.lookupMetric("accidental.noteheadAccidentalPadding"),a=e.left_shift+b,s=i.lookupMetric("accidental.accidentalSpacing"),n=i.lookupMetric("accidental.leftPadding"),l=[];let o,r=0;for(let e=0;ee.line-t.line));const h=[];let c,m=0;for(let t=0;tm?e.shift:m,c=e.line}let d=0;for(let t=0;th[i+t],s=t=>t.map(a),n=(t,e)=>{const[i,b]=s([t,e]).map((t=>t.line));return i-b},l=(...t)=>t.map(s).every((([t,e])=>!this.checkCollision(t,e))),o=b-i+1;let r,c,m=this.checkCollision(h[i],h[b])?"a":"b";switch(o){case 3:"a"===m&&.5===n(1,2)&&.5!==n(0,1)&&(m="second_on_bottom");break;case 4:l([0,2],[1,3])&&(m="spaced_out_tetrachord");break;case 5:"b"===m&&l([1,3])&&(m="spaced_out_pentachord",l([0,2],[2,4])&&(m="very_spaced_out_pentachord"));break;case 6:l([0,3],[1,4],[2,5])&&(m="spaced_out_hexachord"),l([0,2],[2,4],[1,3],[3,5])&&(m="very_spaced_out_hexachord")}if(o>=7){let e=2,i=!0;for(;!0===i;){i=!1;for(let t=0;t+ec?d:c}else for(r=t;r<=b;r++)c=K.accidentalColumnsTable[o][m][r-t],h[r].column=c,d=d>c?d:c;t=b}const _=[],x=[];for(let t=0;t<=d;t++)_[t]=0,x[t]=0;_[0]=m+a,x[0]=m+a,h.forEach((t=>{t.width>_[t.column]&&(_[t.column]=t.width)}));for(let t=1;t<_.length;t++)x[t]=_[t]+x[t-1];const g=x[x.length-1];let p=0;h.forEach((t=>{let e=0;const i=p+t.numAcc;for(;p0?(b=e.flatLine||e.dblSharpLine?2.5:3,t.dblSharpLine&&(i-=.5)):(b=t.flatLine||t.dblSharpLine?2.5:3,e.dblSharpLine&&(i-=.5));const a=Math.abs(i){const e=new u(0,1);t.getTickables().forEach((t=>{if(t.shouldIgnoreTicks())return;const i=a[e.value()];i?i.push(t):(b.push(e.value()),a[e.value()]=[t]),e.add(t.getTicks())}))}));const s=new R;e||(e="C");const l=s.createScaleMap(e),o={};b.forEach((t=>{const e=a[t],b=[],h=t=>{if(!n(t)||t.isRest()||t.shouldIgnoreTicks())return;const e=t;e.keys.forEach(((t,a)=>{const n=s.getNoteParts(t.split("/")[0]),h=t.split("/")[1],c=n.accidental||"n",m=n.root+c;o[n.root+h]||(o[n.root+h]=l[n.root]);const d=o[n.root+h]===m,_=b.indexOf(t)>-1;if(e.getModifiers().forEach(((t,b)=>{i(t,r.Accidental)&&t.type==c&&t.getIndex()==a&&e.getModifiers().splice(b,1)})),!d||d&&_){o[n.root+h]=m;const i=new Q(c);e.addModifier(i,a),b.push(t)}})),e.getModifiers().forEach((t=>{i(t,r.GraceNoteGroup)&&t.getGraceNotes().forEach(h)}))};e.forEach(h)}))}reset(){const t=this.render_options.font_scale;this.glyph=new O(this.accidental.code,t),this.glyph.setOriginX(1),this.cautionary&&(this.parenLeft=new O(K.accidentalCodes("{").code,t),this.parenRight=new O(K.accidentalCodes("}").code,t),this.parenLeft.setOriginX(1),this.parenRight.setOriginX(1))}getWidth(){if(this.cautionary){const t=m(this.parenLeft),e=m(this.parenRight),i=t.getMetrics().width+e.getMetrics().width+this.render_options.parenLeftPadding+this.render_options.parenRightPadding;return this.glyph.getMetrics().width+i}return this.glyph.getMetrics().width}setNote(t){return m(t,"ArgumentError",`Bad note value: ${t}`),this.note=t,a(t)&&(this.render_options.font_scale=25,this.reset()),this}setAsCautionary(){return this.cautionary=!0,this.render_options.font_scale=28,this.reset(),this}draw(){const{type:t,position:e,index:i,cautionary:b,x_shift:a,y_shift:s,glyph:n,render_options:{parenLeftPadding:l,parenRightPadding:o}}=this,r=this.checkContext(),h=this.checkAttachedNote();this.setRendered();const c=h.getModifierStartXY(e,i);let d=c.x+a;const _=c.y+s;if(q("Rendering: ",t,d,_),b){const t=m(this.parenLeft),e=m(this.parenRight);e.render(r,d,_),d-=e.getMetrics().width,d-=o,d-=this.accidental.parenRightPaddingAdjustment,n.render(r,d,_),d-=n.getMetrics().width,d-=l,t.render(r,d,_)}else n.render(r,d,_)}}Q.DEBUG=!1;class J extends P{constructor(t){super(),this.stem_up_y_offset=0,this.stem_down_y_offset=0,this.stem_up_y_base_offset=0,this.stem_down_y_base_offset=0,this.x_begin=(null==t?void 0:t.x_begin)||0,this.x_end=(null==t?void 0:t.x_end)||0,this.y_top=(null==t?void 0:t.y_top)||0,this.y_bottom=(null==t?void 0:t.y_bottom)||0,this.stem_extension=(null==t?void 0:t.stem_extension)||0,this.stem_direction=(null==t?void 0:t.stem_direction)||0,this.hide=(null==t?void 0:t.hide)||!1,this.isStemlet=(null==t?void 0:t.isStemlet)||!1,this.stemletHeight=(null==t?void 0:t.stemletHeight)||0,this.renderHeightAdjustment=0,this.setOptions(t)}static get CATEGORY(){return r.Stem}static get UP(){return 1}static get DOWN(){return-1}static get WIDTH(){return K.STEM_WIDTH}static get HEIGHT(){return K.STEM_HEIGHT}setOptions(t){this.stem_up_y_offset=(null==t?void 0:t.stem_up_y_offset)||0,this.stem_down_y_offset=(null==t?void 0:t.stem_down_y_offset)||0,this.stem_up_y_base_offset=(null==t?void 0:t.stem_up_y_base_offset)||0,this.stem_down_y_base_offset=(null==t?void 0:t.stem_down_y_base_offset)||0}setNoteHeadXBounds(t,e){return this.x_begin=t,this.x_end=e,this}setDirection(t){this.stem_direction=t}setExtension(t){this.stem_extension=t}getExtension(){return this.stem_extension}setYBounds(t,e){this.y_top=t,this.y_bottom=e}getHeight(){const t=this.stem_direction===J.UP?this.stem_up_y_offset:this.stem_down_y_offset;return(this.y_bottom-this.y_top+(J.HEIGHT-t+this.stem_extension))*this.stem_direction}getBoundingBox(){throw new h("NotImplemented","getBoundingBox() not implemented.")}getExtents(){const t=this.stem_direction===J.UP,e=[this.y_top,this.y_bottom],i=J.HEIGHT+this.stem_extension,b=(t?Math.min:Math.max)(...e),a=(t?Math.max:Math.min)(...e);return{topY:b+i*-this.stem_direction,baseY:a}}setVisibility(t){return this.hide=!t,this}setStemlet(t,e){return this.isStemlet=t,this.stemletHeight=e,this}adjustHeightForFlag(){this.renderHeightAdjustment=K.currentMusicFont().lookupMetric("stem.heightAdjustmentForFlag",-3)}adjustHeightForBeam(){this.renderHeightAdjustment=-J.WIDTH/2}draw(){if(this.setRendered(),this.hide)return;const t=this.checkContext();let e,i;const b=this.stem_direction;let a=0;b===J.DOWN?(e=this.x_begin,i=this.y_top+this.stem_down_y_offset,a=this.stem_down_y_base_offset):(e=this.x_end,i=this.y_bottom-this.stem_up_y_offset,a=this.stem_up_y_base_offset);const s=this.getHeight();!function(...t){J.DEBUG&&d("Vex.Flow.Stem",t)}("Rendering stem - ","Top Y: ",this.y_top,"Bottom Y: ",this.y_bottom);const n=this.isStemlet?s-this.stemletHeight*this.stem_direction:0;t.save(),this.applyStyle(t),t.beginPath(),t.setLineWidth(J.WIDTH),t.moveTo(e,i-n+a),t.lineTo(e,i-s-this.renderHeightAdjustment*b),t.stroke(),this.restoreStyle(t),t.restore()}}function Z(...t){it.DEBUG&&d("Vex.Flow.TextFormatter",t)}J.DEBUG=!1;const tt={},et={};class it{constructor(t){this.family="",this.size=14,this.resolution=1e3,this.glyphs={},this.serifs=!1,this.monospaced=!1,this.italic=!1,this.bold=!1,this.superscriptOffset=0,this.subscriptOffset=0,this.maxSizeGlyph="H",this.cacheKey="",this.updateParams(t)}static getFontFamilies(){const t=[];for(const e in et){const i=et[e];t.push(Object.assign({},i))}return t}static create(t={}){Z("create: ",t),t.family||(t.family=E.SANS_SERIF);const e=[],i=t.family.split(/\s*,\s*/);for(const t of i){for(const i in et)i.startsWith(t)&&e.push(et[i]);if(e.length>0)break}let b;if(0===e.length)b=new it(Object.values(et)[0]);else if(1===e.length)b=new it(e[0]);else{const i=E.isBold(t.weight),a=E.isItalic(t.style),s=e.find((t=>t.bold===i&&t.italic===a));if(s)b=new it(s);else{const t=e.find((t=>t.italic===a||t.bold===i));b=new it(t||e[0])}}const a=t.size;if(void 0!==a){const t=E.convertSizeToPointValue(a);b.setFontSize(t)}return b}static getInfo(t){return et[t]}static registerInfo(t,e=!1){Z("registerInfo: ",t,e);const i=t.family;(void 0===et[i]||e)&&(et[i]=t)}updateParams(t){t.family&&(this.family=t.family),t.resolution&&(this.resolution=t.resolution),t.glyphs&&(this.glyphs=t.glyphs),t.serifs&&(this.serifs=t.serifs),t.monospaced&&(this.monospaced=t.monospaced),t.italic&&(this.italic=t.italic),t.bold&&(this.bold=t.bold),t.maxSizeGlyph&&(this.maxSizeGlyph=t.maxSizeGlyph),t.superscriptOffset&&(this.superscriptOffset=t.superscriptOffset),t.subscriptOffset&&(this.subscriptOffset=t.subscriptOffset),this.updateCacheKey()}updateCacheKey(){const t=this.family.replace(/\s+/g,"_"),e=this.size,i=this.bold?T.BOLD:T.NORMAL,b=this.italic?w.ITALIC:w.NORMAL;this.cacheKey=`${t}%${e}%${i}%${b}`}getGlyphMetrics(t){return this.glyphs[t]?this.glyphs[t]:this.glyphs[this.maxSizeGlyph]}get maxHeight(){return this.getGlyphMetrics(this.maxSizeGlyph).ha/this.resolution*this.fontSizeInPixels}getWidthForCharacterInEm(t){var e;const i=this.getGlyphMetrics(t);if(i){return(null!==(e=i.advanceWidth)&&void 0!==e?e:0)/this.resolution}return.65}getWidthForTextInEm(t){const e=this.cacheKey;let i=tt[e];void 0===i&&(i={},tt[e]=i);let b=i[t];if(void 0===b){b=0;for(let e=0;et>e?t:e)),r+=(this.text_line+1)*K.STAVE_LINE_DISTANCE+l,m&&i===J.DOWN&&(r=Math.max(r,h.topY+l+c*this.text_line))}else if(this.verticalJustification===at.CENTER){const t=e.getYForTopText(this.text_line)-1;r=t+(_.getYForBottomText(this.text_line)-t)/2+l/2}else if(this.verticalJustification===at.TOP)r=e.getYs()[0]-(this.text_line+1)*K.STAVE_LINE_DISTANCE,m&&i===J.UP&&(c=h.topY<_.getTopLineTopY()?K.STAVE_LINE_DISTANCE:c,r=Math.min(r,h.topY-c*(this.text_line+1)));else{const t=e.getStemExtents();r=t.topY+(t.baseY-t.topY)/2+l/2}!function(...t){st.DEBUG&&d("Vex.Flow.Annotation",t)}("Rendering annotation: ",this.text,o,r),t.fillText(this.text,o,r),t.closeGroup(),t.restore()}}st.DEBUG=!1,st.TEXT_FONT=Object.assign({},P.TEXT_FONT),st.HorizontalJustify=bt,st.HorizontalJustifyString={left:bt.LEFT,right:bt.RIGHT,center:bt.CENTER,centerStem:bt.CENTER_STEM},st.VerticalJustify=at,st.VerticalJustifyString={above:at.TOP,top:at.TOP,below:at.BOTTOM,bottom:at.BOTTOM,center:at.CENTER,centerStem:at.CENTER_STEM};const{ABOVE:nt,BELOW:lt}=z.Position;function ot(t,e){return.5*t(e/.5)}function rt(t,e){return e===nt?t<=5:t>=1}function ht(t,e){return rt(t,e)?e===nt?Math.ceil:Math.floor:Math.round}const ct=t=>n(t)||a(t);class mt extends z{constructor(t){super(),this.type=t,this.position=lt,this.render_options={font_scale:38},this.reset()}static get CATEGORY(){return r.Articulation}static format(t,e){if(!t||0===t.length)return!1;const i=(t,e,i)=>ot(ht(e,i),m(t.glyph.getMetrics().height)/10+.5);t.forEach((t=>{const b=t.checkAttachedNote();let a=5;const s=b.hasStem()?b.getStemDirection():J.UP;let n=0;if(l(b)){const t=b.getStem();t&&(n=Math.abs(t.getHeight())/K.STAVE_LINE_DISTANCE)}const o=b.getStave();if(o&&(a=o.getNumLines()),t.getPosition()===nt){let l=b.getLineNumber(!0);s===J.UP&&(l+=n);let o=i(t,e.top_text_line,nt);const r=l+e.top_text_line+.5;!t.articulation.between_lines&&rt.getWidth())).reduce(((t,e)=>Math.max(e,t)));return e.left_shift+=b/2,e.right_shift+=b/2,!0}static easyScoreHook({articulations:t},e,i){if(!t)return;const b={staccato:"a.",tenuto:"a-",accent:"a>"};t.split(",").map((t=>t.trim().split("."))).map((([t,e])=>{const a={type:b[t]};return e&&(a.position=z.PositionString[e]),i.getFactory().Articulation(a)})).map((t=>e.addModifier(t,0)))}reset(){this.articulation=K.articulationCodes(this.type);const t=m(this.articulation,"ArgumentError",`Articulation not found: ${this.type}`),e=(this.position===nt?t.aboveCode:t.belowCode)||t.code;this.glyph=new O(null!=e?e:"",this.render_options.font_scale),this.setWidth(m(this.glyph.getMetrics().width))}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=this.checkIndex(),{position:b,glyph:a,text_line:s}=this,n=this.articulation.between_lines,l=e.checkStave(),r=l.getSpacingBetweenLines(),c=o(e),{x:m}=e.getModifierStartXY(b,i),_=!n||c,x=function(t,e){const i=e===nt&&t.getStemDirection()===J.UP||e===lt&&t.getStemDirection()===J.DOWN;return ct(t)?t.hasStem()&&i?.5:1:t.hasStem()&&i?1:0}(e,b),g=K.currentMusicFont().lookupMetric(`articulation.${a.getCode()}.padding`,0);let p={[nt]:()=>{a.setOrigin(.5,1);const t=function(t,e){const i=t.getStemDirection(),{topY:b,baseY:a}=t.getStemExtents();if(ct(t))return t.hasStem()?i===J.UP?b:a:Math.min(...t.getYs());if(o(t))return t.hasStem()&&i===J.UP?b:t.checkStave().getYForTopText(e);throw new h("UnknownCategory","Only can get the top and bottom ys of stavenotes and tabnotes")}(e,s)-(s+x)*r;return _?Math.min(l.getYForTopText(mt.INITIAL_OFFSET),t):t},[lt]:()=>{a.setOrigin(.5,0);const t=function(t,e){const i=t.getStemDirection(),{topY:b,baseY:a}=t.getStemExtents();if(ct(t))return t.hasStem()?i===J.UP?a:b:Math.max(...t.getYs());if(o(t))return t.hasStem()?i===J.UP?t.checkStave().getYForBottomText(e):b:t.checkStave().getYForBottomText(e);throw new h("UnknownCategory","Only can get the top and bottom ys of stavenotes and tabnotes")}(e,s)+(s+x)*r;return _?Math.max(l.getYForBottomText(mt.INITIAL_OFFSET),t):t}}[b]();if(!c){const t=b===nt?-1:1,s=e.getKeyProps()[i].line,l=(e.getYs()[i]-p)/r+Number(s),o=function(t,e,i,b){const a=ot(ht(e,i),e);if(t&&rt(a,i)&&a%1==0)return a+.5*-b;return a}(n,l,b,t);rt(o,b)&&a.setOrigin(.5,.5),p+=Math.abs(o-l)*r*t+g*t}!function(...t){mt.DEBUG&&d("Vex.Flow.Articulation",t)}(`Rendering articulation at (x: ${m}, y: ${p})`),a.render(t,m,p)}}mt.DEBUG=!1,mt.INITIAL_OFFSET=-.5;class dt{static get CATEGORY(){return r.RenderContext}set font(t){this.setFont(t)}get font(){return this.getFont()}setRawFont(t){return this.setFont(t),this}}class _t extends P{constructor(){super(),this._preFormatted=!1,this._postFormatted=!1,this.ticks=new u(0,1),this.intrinsicTicks=0,this.tickMultiplier=new u(1,1),this.width=0,this.x_shift=0,this.modifiers=[],this.tupletStack=[],this.align_center=!1,this.center_x_shift=0,this.ignore_ticks=!1,this.formatterMetrics={freedom:{left:0,right:0},duration:"",iterations:0,space:{used:0,mean:0,deviation:0}}}static get CATEGORY(){return r.Tickable}reset(){return this}getTicks(){return this.ticks}shouldIgnoreTicks(){return this.ignore_ticks}setIgnoreTicks(t){return this.ignore_ticks=t,this}setWidth(t){this.width=t}getWidth(){if(!this._preFormatted)throw new h("UnformattedNote","Can't call GetWidth on an unformatted note.");return this.width+(this.modifierContext?this.modifierContext.getWidth():0)}setXShift(t){return this.x_shift=t,this}getXShift(){return this.x_shift}getX(){return this.checkTickContext("Can't getX() without a TickContext.").getX()+this.x_shift}getFormatterMetrics(){return this.formatterMetrics}getCenterXShift(){return this.isCenterAligned()?this.center_x_shift:0}setCenterXShift(t){return this.center_x_shift=t,this}isCenterAligned(){return this.align_center}setCenterAlignment(t){return this.align_center=t,this}getVoice(){return m(this.voice,"NoVoice","Tickable has no voice.")}setVoice(t){this.voice=t}getTuplet(){return this.tuplet}getTupletStack(){return this.tupletStack}resetTuplet(t){let e,i;if(t){const b=this.tupletStack.indexOf(t);return-1!==b&&(this.tupletStack.splice(b,1),e=t.getNoteCount(),i=t.getNotesOccupied(),this.applyTickMultiplier(e,i)),this}for(;this.tupletStack.length;)e=(t=this.tupletStack.pop()).getNoteCount(),i=t.getNotesOccupied(),this.applyTickMultiplier(e,i);return this}setTuplet(t){if(t){this.tupletStack.push(t);const e=t.getNoteCount(),i=t.getNotesOccupied();this.applyTickMultiplier(i,e)}return this.tuplet=t,this}addToModifierContext(t){this.modifierContext=t;for(let t=0;tK.getGlyphProps(this.duration,t))),this.playNote=void 0,this.ignore_ticks=!1,this.width=0,this.leftDisplacedHeadPx=0,this.rightDisplacedHeadPx=0,this.x_shift=0,this.ys=[],t.align_center&&this.setCenterAlignment(t.align_center),this.render_options={annotation_spacing:5,glyph_font_scale:1,stroke_px:1,scale:1,font:"",y_shift:0}}static get CATEGORY(){return r.Note}static plotMetrics(t,e,i){const b=e.getMetrics(),a=e.getAbsoluteX()-b.modLeftPx-b.leftDisplacedHeadPx,s=e.getAbsoluteX()-b.leftDisplacedHeadPx,n=e.getAbsoluteX(),l=e.getAbsoluteX()+b.notePx,o=e.getAbsoluteX()+b.notePx+b.rightDisplacedHeadPx,r=e.getAbsoluteX()+b.notePx+b.rightDisplacedHeadPx+b.modRightPx,h=r+(e.getFormatterMetrics().freedom.right||0),c=r-a;t.save(),t.setFont(E.SANS_SERIF,8),t.fillText(Math.round(c)+"px",a+e.getXShift(),i);const m=i+7;function d(i,b,a,s=m){t.beginPath(),t.setStrokeStyle(a),t.setFillStyle(a),t.setLineWidth(3),t.moveTo(i+e.getXShift(),s),t.lineTo(b+e.getXShift(),s),t.stroke()}d(a,s,"red"),d(s,n,"#999"),d(n,l,"green"),d(l,o,"#999"),d(o,r,"red"),d(r,h,"#DD0"),d(a-e.getXShift(),a,"#BBB"),function(t,e,i,b="#F55"){t.save(),t.setFillStyle(b),t.beginPath(),t.arc(e,i,3,0,2*Math.PI,!0),t.closePath(),t.fill(),t.restore()}(t,n+e.getXShift(),m,"blue");const _=e.getFormatterMetrics();if(_.iterations>0){const b=_.space.deviation,a=b>=0?"+":"";t.setFillStyle("red"),t.fillText(a+Math.round(b),n+e.getXShift(),i-10)}t.restore()}static parseDuration(t){if(!t)return;const e=/(\d*\/?\d+|[a-z])(d*)([nrhms]|$)/.exec(t);if(!e)return;return{duration:e[1],dots:e[2].length,type:e[3]||"n"}}static parseNoteStruct(t){const e=xt.parseDuration(t.duration);if(!e)return;let i=t.type;if(i&&!K.validTypes[i])return;const b=[];i||(i=e.type||"n",void 0!==t.keys&&t.keys.forEach(((t,e)=>{const a=t.split("/");b[e]=a&&3===a.length?a[2]:i})));let a=K.durationToTicks(e.duration);if(!a)return;const s=t.dots?t.dots:e.dots;if("number"!=typeof s)return;let n=a;for(let t=0;t0}hasStem(){return!1}getNoteType(){return this.noteType}getBeam(){return this.beam}checkBeam(){return m(this.beam,"NoBeam","No beam attached to instance")}hasBeam(){return null!=this.beam}setBeam(t){return this.beam=t,this}addModifier(t,e=0){const i="Note.addModifier(modifier: Modifier, index: number=0)";if("string"==typeof e&&(e=parseInt(e),console.warn(i+" expected a number for `index`, but received a string.")),"object"!=typeof t||"number"!=typeof e)throw new h("WrongParams","Incorrect call signature. Use "+i+" instead.");return t.setNote(this),t.setIndex(e),super.addModifier(t),this}getModifiersByType(t){return this.checkModifierContext().getMembers(t)}getModifierStartXY(t,e,i){if(!this.preFormatted)throw new h("UnformattedNote","Can't call GetModifierStartXY on an unformatted note");return{x:this.getAbsoluteX(),y:this.ys[0]}}getRightParenthesisPx(t){return this.getKeyProps()[t].displaced?this.getRightDisplacedHeadPx():0}getLeftParenthesisPx(t){return this.getKeyProps()[t].displaced?this.getLeftDisplacedHeadPx():0}getFirstDotPx(){let t=this.getRightDisplacedHeadPx();return 0!==this.checkModifierContext().getMembers("Parenthesis").length&&(t+=K.currentMusicFont().lookupMetric("parenthesis.default.width")),t}getMetrics(){if(!this.preFormatted)throw new h("UnformattedNote","Can't call getMetrics on an unformatted note.");const t=this.modifierContext?this.modifierContext.getState().left_shift:0,e=this.modifierContext?this.modifierContext.getState().right_shift:0,i=this.getWidth();return{width:i,glyphWidth:this.getGlyphWidth(),notePx:i-t-e-this.leftDisplacedHeadPx-this.rightDisplacedHeadPx,modLeftPx:t,modRightPx:e,leftDisplacedHeadPx:this.leftDisplacedHeadPx,rightDisplacedHeadPx:this.rightDisplacedHeadPx,glyphPx:0}}getAbsoluteX(){let t=this.checkTickContext("Can't getAbsoluteX() without a TickContext.").getX();return this.stave&&(t+=this.stave.getNoteStartX()+K.currentMusicFont().lookupMetric("stave.padding")),this.isCenterAligned()&&(t+=this.getCenterXShift()),t}getStemDirection(){throw new h("NoStem","No stem attached to this note.")}getStemExtents(){throw new h("NoStem","No stem attached to this note.")}getTieRightX(){let t=this.getAbsoluteX();return t+=this.glyph.getWidth()/2,t+=-this.width/2+this.width+2,t}getTieLeftX(){let t=this.getAbsoluteX();return t+=this.glyph.getWidth()/2,t-=this.width/2+2,t}getKeys(){return this.keys}getKeyProps(){return this.keyProps}}var gt,pt,ut,ft,yt,St,Tt;!function(t){t[t.CENTER=0]="CENTER",t[t.LEFT=1]="LEFT",t[t.RIGHT=2]="RIGHT",t[t.ABOVE=3]="ABOVE",t[t.BELOW=4]="BELOW",t[t.BEGIN=5]="BEGIN",t[t.END=6]="END"}(gt||(gt={}));class wt extends P{constructor(){super(),this.width=0,this.x=0,this.padding=10,this.position=gt.ABOVE}static get CATEGORY(){return r.StaveModifier}static get Position(){return gt}getPosition(){return this.position}setPosition(t){return this.position=t,this}getStave(){return this.stave}checkStave(){return m(this.stave,"NoStave","No stave attached to instance.")}setStave(t){return this.stave=t,this}getWidth(){return this.width}setWidth(t){return this.width=t,this}getX(){return this.x}setX(t){return this.x=t,this}placeGlyphOnLine(t,e,i,b=0){t.setYShift(e.getYForLine(null!=i?i:0)-e.getYForGlyphs()+b)}getPadding(t){return void 0!==t&&t<2?0:this.padding}setPadding(t){return this.padding=t,this}setLayoutMetrics(t){return this.layoutMetrics=t,this}getLayoutMetrics(){return this.layoutMetrics}draw(...t){}}!function(t){t[t.SINGLE=1]="SINGLE",t[t.DOUBLE=2]="DOUBLE",t[t.END=3]="END",t[t.REPEAT_BEGIN=4]="REPEAT_BEGIN",t[t.REPEAT_END=5]="REPEAT_END",t[t.REPEAT_BOTH=6]="REPEAT_BOTH",t[t.NONE=7]="NONE"}(pt||(pt={}));class vt extends wt{constructor(t){super(),this.thickness=K.STAVE_LINE_THICKNESS;const e=pt;this.widths={},this.widths[e.SINGLE]=5,this.widths[e.DOUBLE]=5,this.widths[e.END]=5,this.widths[e.REPEAT_BEGIN]=5,this.widths[e.REPEAT_END]=5,this.widths[e.REPEAT_BOTH]=5,this.widths[e.NONE]=5,this.paddings={},this.paddings[e.SINGLE]=0,this.paddings[e.DOUBLE]=0,this.paddings[e.END]=0,this.paddings[e.REPEAT_BEGIN]=15,this.paddings[e.REPEAT_END]=15,this.paddings[e.REPEAT_BOTH]=15,this.paddings[e.NONE]=0,this.layoutMetricsMap={},this.layoutMetricsMap[e.SINGLE]={xMin:0,xMax:1,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.DOUBLE]={xMin:-3,xMax:1,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.END]={xMin:-5,xMax:1,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.REPEAT_END]={xMin:-10,xMax:1,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.REPEAT_BEGIN]={xMin:-2,xMax:10,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.REPEAT_BOTH]={xMin:-10,xMax:10,paddingLeft:5,paddingRight:5},this.layoutMetricsMap[e.NONE]={xMin:0,xMax:0,paddingLeft:5,paddingRight:5},this.setPosition(gt.BEGIN),this.setType(t)}static get CATEGORY(){return r.Barline}static get type(){return pt}static get typeString(){return{single:pt.SINGLE,double:pt.DOUBLE,end:pt.END,repeatBegin:pt.REPEAT_BEGIN,repeatEnd:pt.REPEAT_END,repeatBoth:pt.REPEAT_BOTH,none:pt.NONE}}getType(){return this.type}setType(t){return this.type="string"==typeof t?vt.typeString[t]:t,this.setWidth(this.widths[this.type]),this.setPadding(this.paddings[this.type]),this.setLayoutMetrics(this.layoutMetricsMap[this.type]),this}draw(t){switch(t.checkContext(),this.setRendered(),this.type){case pt.SINGLE:this.drawVerticalBar(t,this.x,!1);break;case pt.DOUBLE:this.drawVerticalBar(t,this.x,!0);break;case pt.END:this.drawVerticalEndBar(t,this.x);break;case pt.REPEAT_BEGIN:this.drawRepeatBar(t,this.x,!0),t.getX()!==this.x&&this.drawVerticalBar(t,t.getX());break;case pt.REPEAT_END:this.drawRepeatBar(t,this.x,!1);break;case pt.REPEAT_BOTH:this.drawRepeatBar(t,this.x,!1),this.drawRepeatBar(t,this.x,!0)}}drawVerticalBar(t,e,i){const b=t.checkContext(),a=t.getTopLineTopY(),s=t.getBottomLineBottomY();i&&b.fillRect(e-3,a,1,s-a),b.fillRect(e,a,1,s-a)}drawVerticalEndBar(t,e){const i=t.checkContext(),b=t.getTopLineTopY(),a=t.getBottomLineBottomY();i.fillRect(e-5,b,1,a-b),i.fillRect(e-2,b,3,a-b)}drawRepeatBar(t,e,i){const b=t.checkContext(),a=t.getTopLineTopY(),s=t.getBottomLineBottomY();let n=3;i||(n=-5),b.fillRect(e+n,a,1,s-a),b.fillRect(e-2,a,3,s-a);i?n+=4:n-=4;const l=e+n+1;let o=(t.getNumLines()-1)*t.getSpacingBetweenLines();o=o/2-t.getSpacingBetweenLines()/2;let r=a+o+1;b.beginPath(),b.arc(l,r,2,0,2*Math.PI,!1),b.fill(),r+=t.getSpacingBetweenLines(),b.beginPath(),b.arc(l,r,2,0,2*Math.PI,!1),b.fill()}}class Dt extends xt{constructor(t=pt.SINGLE){super({duration:"b"}),this.metrics={widths:{}};const e=pt;this.metrics.widths={[e.SINGLE]:8,[e.DOUBLE]:12,[e.END]:15,[e.REPEAT_BEGIN]:14,[e.REPEAT_END]:14,[e.REPEAT_BOTH]:18,[e.NONE]:0},this.ignore_ticks=!0,this.setType(t)}static get CATEGORY(){return r.BarNote}getType(){return this.type}setType(t){return this.type="string"==typeof t?vt.typeString[t]:t,this.setWidth(this.metrics.widths[this.type]),this}addToModifierContext(t){return this}preFormat(){return this.preFormatted=!0,this}draw(){const t=this.checkContext();!function(...t){Dt.DEBUG&&d("Vex.Flow.BarNote",t)}("Rendering bar line at: ",this.getAbsoluteX()),this.style&&this.applyStyle(t);const e=new vt(this.type);e.setX(this.getAbsoluteX()),e.draw(this.checkStave()),this.style&&this.restoreStyle(t),this.setRendered()}}Dt.DEBUG=!1;class Ct extends z{constructor(t,e=!1,i){super(),this.text=t,this.x_shift=0,this.release=e,this.tap="",this.resetFont(),this.render_options={line_width:1.5,line_style:"#777777",bend_width:8,release_width:8},i?this.phrase=i:(this.phrase=[{type:Ct.UP,text:this.text}],this.release&&this.phrase.push({type:Ct.DOWN,text:""})),this.updateWidth()}static get CATEGORY(){return r.Bend}static get UP(){return 0}static get DOWN(){return 1}static format(t,e){if(!t||0===t.length)return!1;let i=0;for(let b=0;bt{const s=t+b,n=i;e.save(),e.beginPath(),e.setLineWidth(this.render_options.line_width),e.setStrokeStyle(this.render_options.line_style),e.setFillStyle(this.render_options.line_style),e.moveTo(t,i),e.quadraticCurveTo(s,n,t+b,a),e.stroke(),e.restore()},c=(t,i,b,a)=>{e.save(),e.beginPath(),e.setLineWidth(this.render_options.line_width),e.setStrokeStyle(this.render_options.line_style),e.setFillStyle(this.render_options.line_style),e.moveTo(t,a),e.quadraticCurveTo(t+b,a,t+b,i),e.stroke(),e.restore()},m=(t,i,b)=>{const a=i+4*b;e.beginPath(),e.moveTo(t,i),e.lineTo(t-4,a),e.lineTo(t+4,a),e.closePath(),e.fill()},d=(t,i)=>{e.save(),e.setFont(this.textFont);const b=t-e.measureText(i).width/2;e.fillText(i,b,o),e.restore()};let _,x=0,g=0;if(null===(t=this.tap)||void 0===t?void 0:t.length){d(i.getModifierStartXY(z.Position.CENTER,this.index).x,this.tap)}for(let t=0;t0){const e=n.symbolBlocks[t-1];kt.isSuperscript(e)||(a=b)}s&&a>0&&(h=!0,e.xShift=e.xShift+(a-b),b=a,a=0,n.setEnableKerning(!1)),i||s||(a=0),e.vAlign=h,b+=e.width}n.updateKerningAdjustments(),n.updateOverBarAdjustments(),n.getVertical()===ft.TOP?(n.setTextLine(e.top_text_line),e.top_text_line+=r):(n.setTextLine(e.text_line+1),e.text_line+=r+1),n.getReportWidth()?s.push(b):s.push(0)}return b=s.reduce(((t,e)=>t+e),0),e.left_shift+=b/2,e.right_shift+=b/2,!0}static get TEXT_FONT(){let t="Roboto Slab, Times, serif";return"Petaluma"===K.currentMusicFont().getName()&&(t="PetalumaScript, Arial, sans-serif"),{family:t,size:12,weight:T.NORMAL,style:w.NORMAL}}get superscriptOffset(){return kt.superscriptOffset*this.textFormatter.fontSizeInPixels}get subscriptOffset(){return kt.subscriptOffset*this.textFormatter.fontSizeInPixels}setReportWidth(t){return this.reportWidth=t,this}getReportWidth(){return this.reportWidth}updateOverBarAdjustments(){const t=this.symbolBlocks.findIndex((({symbolType:t,glyph:e})=>t===yt.GLYPH&&void 0!==e&&"csymDiagonalArrangementSlash"===e.code));if(t<0)return;const e=this.symbolBlocks[t].width/4,i=.25*this.textFormatter.fontSizeInPixels;let b=0;for(;b0?this.symbolBlocks[t-1]:void 0;let b=0;e.symbolType===yt.GLYPH&&void 0!==e.glyph&&e.glyph.code===kt.glyphs.over.code&&(b+=e.glyph.metrics.x_shift),void 0!==i&&i.symbolType===yt.GLYPH&&void 0!==i.glyph&&i.glyph.code===kt.glyphs.over.code&&(b+=i.glyph.metrics.x_shift);let a=!1,s=!1;void 0!==i&&i.symbolType===yt.TEXT&&(a=kt.upperKerningText.some((t=>t===i.text[i.text.length-1])),s=kt.lowerKerningText.some((t=>t===i.text[i.text.length-1])));const n=kt.kerningOffset*this.textFormatter.fontSizeInPixels;return a&&e.symbolModifier===St.SUPERSCRIPT&&(b+=n),s&&e.symbolType===yt.TEXT&&(e.text[0]>="a"&&e.text[0]<="z"&&(b+=n/2),kt.upperKerningText.some((t=>t===(null==i?void 0:i.text[i.text.length-1])))&&(b+=n/2)),b}getSymbolBlock(t={}){var e,i,b;const a=null!==(e=t.symbolType)&&void 0!==e?e:yt.TEXT,s={text:null!==(i=t.text)&&void 0!==i?i:"",symbolType:a,symbolModifier:null!==(b=t.symbolModifier)&&void 0!==b?b:St.NONE,xShift:0,yShift:0,vAlign:!1,width:0};if(a===yt.GLYPH&&"string"==typeof t.glyph){const e=kt.glyphs[t.glyph],i=20;s.glyph=new O(e.code,i,{category:"chordSymbol"})}else a===yt.TEXT?s.width=this.textFormatter.getWidthForTextInEm(s.text):a===yt.LINE&&(s.width=t.width);return s}addSymbolBlock(t){return this.symbolBlocks.push(this.getSymbolBlock(t)),this}addText(t,e={}){const i=yt.TEXT;return this.addSymbolBlock(Object.assign(Object.assign({},e),{text:t,symbolType:i}))}addTextSuperscript(t){const e=yt.TEXT,i=St.SUPERSCRIPT;return this.addSymbolBlock({text:t,symbolType:e,symbolModifier:i})}addTextSubscript(t){const e=yt.TEXT,i=St.SUBSCRIPT;return this.addSymbolBlock({text:t,symbolType:e,symbolModifier:i})}addGlyphSuperscript(t){const e=yt.GLYPH,i=St.SUPERSCRIPT;return this.addSymbolBlock({glyph:t,symbolType:e,symbolModifier:i})}addGlyph(t,e={}){const i=yt.GLYPH;return this.addSymbolBlock(Object.assign(Object.assign({},e),{glyph:t,symbolType:i}))}addGlyphOrText(t,e={}){let i="";for(let b=0;b0&&(this.addText(i,e),i=""),this.addGlyph(a,e)):i+=a}return i.length>0&&this.addText(i,e),this}addLine(t,e={}){const i=yt.LINE;return this.addSymbolBlock(Object.assign(Object.assign({},e),{symbolType:i,width:t}))}setFont(t,e,i,b){return super.setFont(t,e,i,b),this.textFormatter=it.create(this.textFont),this}setEnableKerning(t){return this.useKerning=t,this}setVertical(t){return this.vertical="string"==typeof t?kt.VerticalJustifyString[t]:t,this}getVertical(){return this.vertical}setHorizontal(t){return this.horizontal="string"==typeof t?kt.HorizontalJustifyString[t]:t,this}getHorizontal(){return this.horizontal}getWidth(){let t=0;return this.symbolBlocks.forEach((e=>{t+=e.vAlign?0:e.width})),t}getYOffsetForText(t){var e;let i=0,b=0;for(b=0;b0?i/a*-1:0}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered(),t.save();const i=Object.keys(this.getAttribute("classes")).join(" ");t.openGroup(i,this.getAttribute("id"));const b=e.getModifierStartXY(z.Position.ABOVE,this.index);let a;t.setFont(this.textFont);const s=e.hasStem(),n=e.checkStave();if(this.vertical===ft.BOTTOM){if(a=n.getYForBottomText(this.text_line+K.TEXT_HEIGHT_OFFSET_HACK),s){const t=e.checkStem().getExtents(),i=n.getSpacingBetweenLines(),b=1===e.getStemDirection()?t.baseY:t.topY;a=Math.max(a,b+i*(this.text_line+2))}}else if(a=Math.min(n.getYForTopText(this.text_line),e.getYs()[0]-10),s){const t=e.checkStem().getExtents(),i=n.getSpacingBetweenLines();a=Math.min(a,t.topY-5-i*this.text_line)}let l=b.x;l=this.horizontal===ut.LEFT?b.x:this.horizontal===ut.RIGHT?b.x+this.getWidth():this.horizontal===ut.CENTER?b.x-this.getWidth()/2:e.getStemX()-this.getWidth()/2,Et("Rendering ChordSymbol: ",this.textFormatter,l,a),this.symbolBlocks.forEach((e=>{const i=kt.isSuperscript(e),b=kt.isSubscript(e);let s=a;if(Et("shift was ",e.xShift,e.yShift),Et("curY pre sub ",s),i&&(s+=this.superscriptOffset),b&&(s+=this.subscriptOffset),Et("curY sup/sub ",s),e.symbolType===yt.TEXT){if((i||b)&&(t.save(),this.textFont)){const{family:e,size:i,weight:b,style:a}=this.textFont,s=E.scaleSize(i,kt.superSubRatio);t.setFont(e,s,b,a)}Et("Rendering Text: ",e.text,l+e.xShift,s+e.yShift),t.fillText(e.text,l+e.xShift,s+e.yShift),(i||b)&&t.restore()}else e.symbolType===yt.GLYPH&&e.glyph?(s+=e.yShift,Et("Rendering Glyph: ",e.glyph.code,l+e.xShift,s),e.glyph.render(t,l+e.xShift,s)):e.symbolType===yt.LINE&&(Et("Rendering Line : ",e.width,l,s),t.beginPath(),t.setLineWidth(1),t.moveTo(l,a),t.lineTo(l+e.width,s),t.stroke());l+=e.width,e.vAlign&&(l+=e.xShift)})),t.closeGroup(),t.restore()}}kt.DEBUG=!1,kt.HorizontalJustify=ut,kt.HorizontalJustifyString={left:ut.LEFT,right:ut.RIGHT,center:ut.CENTER,centerStem:ut.CENTER_STEM},kt.VerticalJustify=ft,kt.VerticalJustifyString={top:ft.TOP,above:ft.TOP,below:ft.BOTTOM,bottom:ft.BOTTOM},kt.glyphs={diminished:{code:"csymDiminished"},dim:{code:"csymDiminished"},halfDiminished:{code:"csymHalfDiminished"},"+":{code:"csymAugmented"},augmented:{code:"csymAugmented"},majorSeventh:{code:"csymMajorSeventh"},minor:{code:"csymMinor"},"-":{code:"csymMinor"},"(":{code:"csymParensLeftTall"},leftParen:{code:"csymParensLeftTall"},")":{code:"csymParensRightTall"},rightParen:{code:"csymParensRightTall"},leftBracket:{code:"csymBracketLeftTall"},rightBracket:{code:"csymBracketRightTall"},leftParenTall:{code:"csymParensLeftVeryTall"},rightParenTall:{code:"csymParensRightVeryTall"},"/":{code:"csymDiagonalArrangementSlash"},over:{code:"csymDiagonalArrangementSlash"},"#":{code:"accidentalSharp"},b:{code:"accidentalFlat"}},kt.symbolTypes=yt,kt.symbolModifiers=St,kt.noFormat=!1;class Bt extends z{constructor(){super(),this.position=z.Position.RIGHT,this.radius=2,this.setWidth(5),this.dot_shiftY=0}static get CATEGORY(){return r.Dot}static getDots(t){return t.getModifiersByType(Bt.CATEGORY)}static buildAndAttach(t,e){for(const i of t)if(null==e?void 0:e.all)for(let t=0;te.line-t.line));let s=i,l=0,r=null,c=null,m=null,d=0;for(let t=0;tl?s:l,r=o,c=i}return e.right_shift+=l,!0}setNote(t){return this.note=t,a(t)&&(this.radius*=.5,this.setWidth(3)),this}setDotShiftY(t){return this.dot_shiftY=t,this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.checkStave().getSpacingBetweenLines(),b=e.getModifierStartXY(this.position,this.index,{forceFlagRight:!0});o(e)&&(b.y=e.getStemExtents().baseY);const a=b.x+this.x_shift+this.width-this.radius,s=b.y+this.y_shift+this.dot_shiftY*i;t.beginPath(),t.arc(a,s,this.radius,0,2*Math.PI,!1),t.fill()}}class Pt extends z{constructor(t){super(),this.finger=t,this.width=7,this.position=z.Position.LEFT,this.x_shift=0,this.y_shift=0,this.x_offset=0,this.y_offset=0,this.resetFont()}static get CATEGORY(){return r.FretHandFinger}static format(t,e){const{left_shift:i,right_shift:b}=e;if(!t||0===t.length)return!1;const a=[];let s=null,n=0,l=0;for(let o=0;oe.line-t.line));let o=0,r=0,h=0,c=0,m=null,d=null;for(let t=0;th?e:h):n===z.Position.RIGHT&&(_.setXShift(r),e=l+u,c=e>c?e:c),m=x,d=s}return e.left_shift+=h,e.right_shift+=c,!0}static easyScoreHook({fingerings:t}={},e,i){null==t||t.split(",").map((t=>{const e=t.trim().split("."),b={number:e[0]};return e[1]&&(b.position=e[1]),i.getFactory().Fingering(b)})).map(((t,i)=>e.addModifier(t,i)))}setFretHandFinger(t){return this.finger=t,this}getFretHandFinger(){return this.finger}setOffsetX(t){return this.x_offset=t,this}setOffsetY(t){return this.y_offset=t,this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.getModifierStartXY(this.position,this.index);let b=i.x+this.x_shift+this.x_offset,a=i.y+this.y_shift+this.y_offset+5;switch(this.position){case z.Position.ABOVE:b-=4,a-=12;break;case z.Position.BELOW:b-=2,a+=10;break;case z.Position.LEFT:b-=this.width;break;case z.Position.RIGHT:b+=1;break;default:throw new h("InvalidPosition",`The position ${this.position} does not exist`)}t.save(),t.setFont(this.textFont),t.fillText(""+this.finger,b,a),t.restore()}}Pt.TEXT_FONT={family:E.SANS_SERIF,size:9,weight:T.BOLD,style:w.NORMAL};class Ft extends P{constructor(t,e){super(),this.setNotes(t),this.text=e,this.render_options={cp1:8,cp2:12,text_shift_x:0,first_x_shift:0,last_x_shift:0,y_shift:7,tie_spacing:0},this.resetFont()}static get CATEGORY(){return r.StaveTie}setDirection(t){return this.direction=t,this}setNotes(t){if(!t.first_note&&!t.last_note)throw new h("BadArguments","Tie needs to have either first_note or last_note set.");if(t.first_indices||(t.first_indices=[0]),t.last_indices||(t.last_indices=[0]),t.first_indices.length!==t.last_indices.length)throw new h("BadArguments","Tied notes must have same number of indices.");return this.notes=t,this}isPartial(){return!this.notes.first_note||!this.notes.last_note}renderTie(t){if(0===t.first_ys.length||0===t.last_ys.length)throw new h("BadArguments","No Y-values to render");const e=this.checkContext();let i=this.render_options.cp1,b=this.render_options.cp2;Math.abs(t.last_x_px-t.first_x_px)<10&&(i=2,b=8);const a=this.render_options.first_x_shift,s=this.render_options.last_x_shift,n=this.render_options.y_shift*t.direction,l=this.notes.first_indices,o=this.notes.last_indices;for(let r=0;rMath.pow(this.options.softmaxFactor,e.getTicks().value()/t))).reduce(((t,e)=>t+e),0),this.expTicksUsed}softmax(t){this.expTicksUsed||(this.expTicksUsed=this.reCalculateExpTicksUsed());const e=this.ticksUsed.value();return(t=>Math.pow(this.options.softmaxFactor,t/e))(t)/this.expTicksUsed}addTickable(t){if(!t.shouldIgnoreTicks()){const e=t.getTicks();if(this.ticksUsed.add(e),this.expTicksUsed=0,(this.mode===Tt.STRICT||this.mode===Tt.FULL)&&this.ticksUsed.greaterThan(this.totalTicks))throw this.ticksUsed.subtract(e),new h("BadArgument","Too many ticks.");e.lessThan(this.smallestTickCount)&&(this.smallestTickCount=e.clone()),this.resolutionMultiplier=this.ticksUsed.denominator,this.totalTicks.add(0,this.ticksUsed.denominator)}return this.tickables.push(t),t.setVoice(this),this}addTickables(t){for(let e=0;e{e.getStave()||e.setStave(t)})),this.preFormatted=!0,this}checkStave(){return m(this.stave,"NoStave","No stave attached to instance.")}draw(t=this.checkContext(),e){let i;e=null!=e?e:this.stave,this.setRendered();for(let b=0;b1){const e=new Be(t);e.render_options.beam_width=3,e.render_options.partial_beam_length=4,this.beams.push(e)}return this}setWidth(t){return this.width=t,this}getWidth(){return this.width}getGraceNotes(){return this.grace_notes}draw(){const t=this.checkContext(),e=this.checkAttachedNote();if(this.setRendered(),function(...t){Nt.DEBUG&&d("Vex.Flow.GraceNoteGroup",t)}("Drawing grace note group for:",e),this.alignSubNotesWithNote(this.getGraceNotes(),e),this.grace_notes.forEach((e=>e.setContext(t).draw())),this.beams.forEach((e=>e.setContext(t).draw())),this.show_slur){const i=n(e),b=i?Ft:At;this.slur=new b({last_note:this.grace_notes[0],first_note:e,first_indices:[0],last_indices:[0]}),this.slur.render_options.cp2=12,this.slur.render_options.y_shift=(i?7:5)+this.render_options.slur_y_shift,this.slur.setContext(t).draw()}}}Nt.DEBUG=!1;class Ot extends z{constructor(t){super(),this.preFormatted=!1,this.position=z.Position.LEFT,this.subNotes=t,this.subNotes.forEach((t=>{t.setIgnoreTicks(!1)})),this.width=0,this.formatter=new we,this.voice=new Mt({num_beats:4,beat_value:4,resolution:K.RESOLUTION}).setStrict(!1),this.voice.addTickables(this.subNotes)}static get CATEGORY(){return r.NoteSubGroup}static format(t,e){if(!t||0===t.length)return!1;let i=0;for(let e=0;ee.setContext(t).drawWithStyle()))}}class zt{constructor(t){this.preFormatted=!1,this.postFormatted=!1,this.tickID=t&&t.tickID?t.tickID:0,this.currentTick=new u(0,1),this.maxTicks=new u(0,1),this.maxTickable=void 0,this.minTicks=void 0,this.minTickable=void 0,this.padding=1,this.x=0,this.xBase=0,this.xOffset=0,this.tickables=[],this.tickablesByVoice={},this.notePx=0,this.glyphPx=0,this.leftDisplacedHeadPx=0,this.rightDisplacedHeadPx=0,this.modLeftPx=0,this.modRightPx=0,this.totalLeftPx=0,this.totalRightPx=0,this.tContexts=[],this.width=0,this.formatterMetrics={freedom:{left:0,right:0}}}static getNextContext(t){const e=t.tContexts,i=e.indexOf(t);if(i+1t.isCenterAligned()))}getMetrics(){const{width:t,glyphPx:e,notePx:i,leftDisplacedHeadPx:b,rightDisplacedHeadPx:a,modLeftPx:s,modRightPx:n,totalLeftPx:l,totalRightPx:o}=this;return{width:t,glyphPx:e,notePx:i,leftDisplacedHeadPx:b,rightDisplacedHeadPx:a,modLeftPx:s,modRightPx:n,totalLeftPx:l,totalRightPx:o}}getCurrentTick(){return this.currentTick}setCurrentTick(t){this.currentTick=t,this.preFormatted=!1}addTickable(t,e){if(!t)throw new h("BadArgument","Invalid tickable added.");if(!t.shouldIgnoreTicks()){const e=t.getTicks();e.greaterThan(this.maxTicks)&&(this.maxTicks=e.clone(),this.maxTickable=t),(null==this.minTicks||e.lessThan(this.minTicks))&&(this.minTicks=e.clone(),this.minTickable=t)}return t.setTickContext(this),this.tickables.push(t),this.tickablesByVoice[e||0]=t,this.preFormatted=!1,this}preFormat(){if(this.preFormatted)return this;for(let t=0;t=0,!this.ornament)throw new h("ArgumentError",`Ornament not found: '${this.type}'`);this.x_shift=e?e.xOffset:0,this.y_shift=e?e.yOffset:0,this.glyph=new O(this.ornament.code,this.render_options.font_scale,{category:`ornament.${this.ornament.code}`}),Rt.ornamentNoteTransition.indexOf(this.type)>=0&&(this.delayed=!0),e||this.glyph.setOrigin(.5,1)}static get CATEGORY(){return r.Ornament}static format(t,e){if(!t||0===t.length)return!1;let i=0,b=e.right_shift,a=e.left_shift,s=0;for(let n=0;n=0&&(l.x_shift+=b+2),Rt.ornamentAttack.indexOf(l.type)>=0&&(l.x_shift-=a+2),l.reportedWidth&&l.x_shift<0?a+=l.reportedWidth:l.reportedWidth&&l.x_shift>0?b+=l.reportedWidth:i=Math.max(l.getWidth(),i),Rt.ornamentArticulation.indexOf(l.type)>=0){m(l.note,"NoAttachedNote").getLineNumber()>=3||l.getPosition()===z.Position.ABOVE?(e.top_text_line+=o,l.y_shift+=s,s-=l.glyph.bbox.getH()):(e.text_line+=o,l.y_shift+=s,s+=l.glyph.bbox.getH())}else l.getPosition()===z.Position.ABOVE?(l.setTextLine(e.top_text_line),e.top_text_line+=o):(l.setTextLine(e.text_line),e.text_line+=o)}return e.left_shift=a+i/2,e.right_shift=b+i/2,!0}static get ornamentNoteTransition(){return["flip","jazzTurn","smear"]}static get ornamentAttack(){return["scoop"]}static get ornamentAlignWithNoteHead(){return["doit","fall","fallLong","doitLong","bend","plungerClosed","plungerOpen","scoop"]}static get ornamentRelease(){return["doit","fall","fallLong","doitLong","jazzTurn","smear","flip"]}static get ornamentArticulation(){return["bend","plungerClosed","plungerOpen"]}getMetrics(){return K.currentMusicFont().getMetrics().glyphs.jazzOrnaments[this.ornament.code]}setDelayed(t){return this.delayed=t,this}setUpperAccidental(t){const e=this.render_options.font_scale/1.3;return this.accidentalUpper=new O(K.accidentalCodes(t).code,e),this.accidentalUpper.setOrigin(.5,1),this}setLowerAccidental(t){const e=this.render_options.font_scale/1.3;return this.accidentalLower=new O(K.accidentalCodes(t).code,e),this.accidentalLower.setOrigin(.5,1),this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.getStemDirection(),b=e.checkStave(),a=Object.keys(this.getAttribute("classes")).join(" ");t.openGroup(a,this.getAttribute("id"));const s=e.checkStem().getExtents();let n=i===J.DOWN?s.baseY:s.topY;o(e)&&(e.hasStem()?i===J.DOWN&&(n=b.getYForTopText(this.text_line)):n=b.getYForTopText(this.text_line));const l=i===J.DOWN,r=b.getSpacingBetweenLines();let h=1;!l&&e.hasBeam()&&(h+=.5);const c=n-r*(this.text_line+h),m=e.getModifierStartXY(this.position,this.index);let _=m.x,x=this.ornamentAlignWithNoteHead?m.y:Math.min(b.getYForTopText(this.text_line),c);if(x+=this.y_shift,this.delayed){let t=0;const i=_-(b.getX()-10);if(void 0!==this.delayXShift)t=this.delayXShift;else{t+=this.glyph.getMetrics().width/2;const a=zt.getNextContext(e.getTickContext());t+=a?.5*(a.getX()-i):.5*(b.getX()+b.getWidth()-i),this.delayXShift=t}_+=t}!function(...t){Rt.DEBUG&&d("Vex.Flow.Ornament",t)}("Rendering ornament: ",this.ornament,_,x),this.accidentalLower&&(this.accidentalLower.render(t,_,x),x-=this.accidentalLower.getMetrics().height,x-=this.render_options.accidentalLowerPadding),this.stemUpYOffset&&e.hasStem()&&1===e.getStemDirection()&&(x+=this.stemUpYOffset),e.getLineNumber()<5&&Rt.ornamentNoteTransition.indexOf(this.type)>=0&&(x=e.checkStave().getBoundingBox().getY()+40),this.glyph.render(t,_+this.x_shift,x),this.accidentalUpper&&(x-=this.glyph.getMetrics().height+this.render_options.accidentalUpperPadding,this.accidentalUpper.render(t,_,x)),t.closeGroup()}}Rt.DEBUG=!1;class Lt extends z{constructor(t){super(),this.position=null!=t?t:z.Position.LEFT,this.point=K.currentMusicFont().lookupMetric("parenthesis.default.point"),this.setWidth(K.currentMusicFont().lookupMetric("parenthesis.default.width"))}static get CATEGORY(){return r.Parenthesis}static buildAndAttach(t){for(const e of t)for(let t=0;to+a.width?b:o+a.width),n===A.LEFT&&(o=s.getLeftParenthesisPx(l),i=i>o+a.width?i:o+a.width),a.setXShift(o)}return e.left_shift+=i,e.right_shift+=b,!0}setNote(t){return this.note=t,this.point=K.currentMusicFont().lookupMetric("parenthesis.default.point"),this.setWidth(K.currentMusicFont().lookupMetric("parenthesis.default.width")),a(t)&&(this.point=K.currentMusicFont().lookupMetric("parenthesis.gracenote.point"),this.setWidth(K.currentMusicFont().lookupMetric("parenthesis.gracenote.width"))),this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.getModifierStartXY(this.position,this.index,{forceFlagRight:!0}),b=i.x+this.x_shift,a=i.y+this.y_shift;this.position==z.Position.RIGHT?O.renderGlyph(t,b+1,a,this.point,"noteheadParenthesisRight",{category:"noteHead.standard.noteheadParenthesisRight"}):this.position==z.Position.LEFT&&O.renderGlyph(t,b-2,a,this.point,"noteheadParenthesisLeft",{category:"noteHead.standard.noteheadParenthesisLeft"})}}class Ut extends xt{constructor(t){super(t),this.custom_glyph=!1,this.stem_up_x_offset=0,this.stem_down_x_offset=0,this.index=t.index,this.x=t.x||0,this.y=t.y||0,t.note_type&&(this.noteType=t.note_type),this.displaced=t.displaced||!1,this.stem_direction=t.stem_direction||J.UP,this.line=t.line||0,this.glyph=K.getGlyphProps(this.duration,this.noteType),m(this.glyph,"BadArguments",`No glyph found for duration '${this.duration}' and type '${this.noteType}'`),this.glyph_code=this.glyph.code_head,this.x_shift=t.x_shift||0,t.custom_glyph_code&&(this.custom_glyph=!0,this.glyph_code=t.custom_glyph_code,this.stem_up_x_offset=t.stem_up_x_offset||0,this.stem_down_x_offset=t.stem_down_x_offset||0),this.style=t.style,this.slashed=t.slashed||!1,this.render_options=Object.assign(Object.assign({},this.render_options),{glyph_font_scale:t.glyph_font_scale||K.NOTATION_FONT_SCALE}),this.setWidth(this.glyph.getWidth(this.render_options.glyph_font_scale))}static get CATEGORY(){return r.NoteHead}getWidth(){return this.width}isDisplaced(){return!0===this.displaced}getGlyph(){return this.glyph}setX(t){return this.x=t,this}getY(){return this.y}setY(t){return this.y=t,this}getLine(){return this.line}setLine(t){return this.line=t,this}getAbsoluteX(){const t=this.preFormatted?super.getAbsoluteX():this.x,e=J.WIDTH/2,i=K.currentMusicFont(),b=i.lookupMetric("notehead.shiftX",0)*this.stem_direction,a=i.lookupMetric("noteHead.displaced.shiftX",0)*this.stem_direction;return t+b+(this.displaced?(this.width-e)*this.stem_direction+a:0)}getBoundingBox(){if(!this.preFormatted)throw new h("UnformattedNote","Can't call getBoundingBox on an unformatted note.");const t=this.checkStave().getSpacingBetweenLines(),e=t/2,i=this.y-e;return new y(this.getAbsoluteX(),i,this.width,t)}setStave(t){const e=this.getLine();return this.stave=t,this.stave&&(this.setY(this.stave.getYForNote(e)),this.setContext(this.stave.getContext())),this}preFormat(){if(this.preFormatted)return this;const t=this.getWidth()+this.leftDisplacedHeadPx+this.rightDisplacedHeadPx;return this.setWidth(t),this.preFormatted=!0,this}draw(){const t=this.checkContext();this.setRendered();let e=this.getAbsoluteX();this.custom_glyph&&(e+=this.stem_direction===J.UP?this.stem_up_x_offset:this.stem_down_x_offset);const i=this.y;!function(...t){Ut.DEBUG&&d("Vex.Flow.NoteHead",t)}("Drawing note head '",this.noteType,this.duration,"' at",e,i);const b=this.stem_direction,a=this.render_options.glyph_font_scale;this.style&&this.applyStyle(t);const s=`${this.glyph_code}Stem${b===J.UP?"Up":"Down"}`;if("s"===this.noteType){const a=this.checkStave().getSpacingBetweenLines();!function(t,e,i,b,a,s){const n=K.SLASH_NOTEHEAD_WIDTH;t.save(),t.setLineWidth(K.STEM_WIDTH);let l=!1;if(K.durationToNumber(e)>2&&(l=!0),l||(i-=K.STEM_WIDTH/2*a),t.beginPath(),t.moveTo(i,b+s),t.lineTo(i,b+1),t.lineTo(i+n,b-s),t.lineTo(i+n,b),t.lineTo(i,b+s),t.closePath(),l?t.fill():t.stroke(),K.durationToFraction(e).equals(.5)){const e=[-3,-1,n+1,n+3];for(let a=0;a2?i[1]:void 0;let n=b>2?i[2]:i[1];2===b&&-1===a.stemDirection&&1===n.stemDirection&&(a=i[1],n=i[0]);const l=Math.max(a.voice_shift,n.voice_shift);let o=0;if(2===b){const t=a.stemDirection===n.stemDirection?0:.5;return a.minLine<=n.maxLine+t&&(a.isrest?It(a,0,1):n.isrest?It(n,0,-1):a.stemDirection===n.stemDirection?(o=l+2,a.note.setXShift(o)):(o=l+2,n.note.setXShift(o))),e.right_shift+=o,!0}if(!s)throw new h("InvalidState","noteM not defined.");if(s.isrest&&!a.isrest&&!n.isrest&&(a.minLine<=s.maxLine||s.minLine<=n.maxLine)){return s.maxLine-s.minLinet.postFormat())),!0)}reset(){super.reset();const t=this._noteHeads.map((t=>t.getStyle()));this.buildNoteHeads(),this._noteHeads.forEach(((e,i)=>{const b=t[i];b&&e.setStyle(b)}));const e=this.stave;return e&&this._noteHeads.forEach((t=>t.setStave(e))),this.calcNoteDisplacements(),this}setBeam(t){return this.beam=t,this.calcNoteDisplacements(),this.stem&&this.stem.setExtension(this.getStemExtension()),this}buildStem(){return this.setStem(new J({hide:!!this.isRest()})),this}buildNoteHeads(){this._noteHeads=[];const t=this.getStemDirection(),e=this.getKeys();let i,b,a,s,n,l=!1;t===J.UP?(a=0,s=e.length,n=1):(a=e.length-1,s=-1,n=-1);for(let e=a;e!==s;e+=n){const a=this.keyProps[e],s=a.line;void 0===i?i=s:(b=Math.abs(i-s),0===b||.5===b?l=!l:(l=!1,this.use_default_head_x=!0)),i=s;const n=new Ut({duration:this.duration,note_type:this.noteType,displaced:l,stem_direction:t,custom_glyph_code:a.code,glyph_font_scale:this.render_options.glyph_font_scale,x_shift:a.shift_right,stem_up_x_offset:a.stem_up_x_offset,stem_down_x_offset:a.stem_down_x_offset,line:a.line});this._noteHeads[e]=n}}autoStem(){this.setStemDirection(this.calculateOptimalStemDirection())}calculateOptimalStemDirection(){this.minLine=this.keyProps[0].line,this.maxLine=this.keyProps[this.keyProps.length-1].line;return(this.minLine+this.maxLine)/2<3?J.UP:J.DOWN}calculateKeyProps(){let t;for(let e=0;e0&&(this.keyProps[e-1].displaced=!0)),t=s,this.keyProps.push(a)}t=void 0,this.keyProps.forEach((e=>{t&&e.linet.line-e.line))}getBoundingBox(){var t,e;if(!this.preFormatted)throw new h("UnformattedNote","Can't call getBoundingBox on an unformatted note.");const{width:i,modLeftPx:b,leftDisplacedHeadPx:a}=this.getMetrics(),s=this.getAbsoluteX()-b-a;let n=0,l=0;const o=(null!==(e=null===(t=this.getStave())||void 0===t?void 0:t.getSpacingBetweenLines())&&void 0!==e?e:0)/2,r=2*o;if(this.isRest()){const t=this.ys[0],e=K.durationToFraction(this.duration);e.equals(1)||e.equals(2)?(n=t-o,l=t+o):(n=t-this.glyph.line_above*r,l=t+this.glyph.line_below*r)}else if(this.glyph.stem){const t=this.getStemExtents();t.baseY+=o*this.getStemDirection(),n=Math.min(t.topY,t.baseY),l=Math.max(t.topY,t.baseY)}else{n=0,l=0;for(let t=0;te&&(e=b):b1}hasStem(){return this.glyph.stem}hasFlag(){return super.hasFlag()&&!this.isRest()}getStemX(){return"r"===this.noteType?this.getCenterGlyphX():super.getStemX()+(this.stem_direction?J.WIDTH/(2*-this.stem_direction):0)}getYForTopText(t){const e=this.getStemExtents();return Math.min(this.checkStave().getYForTopText(t),e.topY-this.render_options.annotation_spacing*(t+1))}getYForBottomText(t){const e=this.getStemExtents();return Math.max(this.checkStave().getYForTopText(t),e.baseY+this.render_options.annotation_spacing*t)}setStave(t){super.setStave(t);const e=this._noteHeads.map((e=>(e.setStave(t),e.getY())));if(this.setYs(e),this.stem){const{y_top:t,y_bottom:e}=this.getNoteHeadBounds();this.stem.setYBounds(t,e)}return this}isDisplaced(){return this.displaced}setNoteDisplaced(t){return this.displaced=t,this}getTieRightX(){let t=this.getAbsoluteX();return t+=this.getGlyphWidth()+this.x_shift+this.rightDisplacedHeadPx,this.modifierContext&&(t+=this.modifierContext.getRightShift()),t}getTieLeftX(){let t=this.getAbsoluteX();return t+=this.x_shift-this.leftDisplacedHeadPx,t}getLineForRest(){let t=this.keyProps[0].line;if(this.keyProps.length>1){const e=this.keyProps[this.keyProps.length-1].line;t=x(Math.max(t,e),Math.min(t,e))}return t}getModifierStartXY(t,e,i={}){var b,a;if(!this.preFormatted)throw new h("UnformattedNote","Can't call GetModifierStartXY on an unformatted note");if(0===this.ys.length)throw new h("NoYValues","No Y-Values calculated for this note.");const{ABOVE:s,BELOW:n,LEFT:l,RIGHT:o}=z.Position;let r=0;return t===l?r=-2:t===o?(r=this.getGlyphWidth()+this.x_shift+2,this.stem_direction===J.UP&&this.hasFlag()&&(i.forceFlagRight||((t,e)=>e===(t.getStemDirection()===J.UP?t.keyProps.length-1:0))(this,e))&&(r+=null!==(a=null===(b=null==this?void 0:this.flag)||void 0===b?void 0:b.getMetrics().width)&&void 0!==a?a:0)):t!==n&&t!==s||(r=this.getGlyphWidth()/2),{x:this.getAbsoluteX()+r,y:this.ys[e]}}setStyle(t){var e;return super.setStyle(t),this._noteHeads.forEach((e=>e.setStyle(t))),null===(e=this.stem)||void 0===e||e.setStyle(t),this}setStemStyle(t){const e=this.getStem();return null==e||e.setStyle(t),this}getStemStyle(){var t;return null===(t=this.stem)||void 0===t?void 0:t.getStyle()}setLedgerLineStyle(t){this.ledgerLineStyle=t}getLedgerLineStyle(){return this.ledgerLineStyle}setFlagStyle(t){this.flagStyle=t}getFlagStyle(){return this.flagStyle}setKeyStyle(t,e){return this._noteHeads[t].setStyle(e),this}setKeyLine(t,e){return this.keyProps[t].line=e,this.reset(),this}getKeyLine(t){return this.keyProps[t].line}getVoiceShiftWidth(){return this.getGlyphWidth()*(this.displaced?2:1)}calcNoteDisplacements(){this.setLeftDisplacedHeadPx(this.displaced&&this.stem_direction===J.DOWN?this.getGlyphWidth():0),this.setRightDisplacedHeadPx(!this.hasFlag()&&this.displaced&&this.stem_direction===J.UP?this.getGlyphWidth():0)}preFormat(){if(this.preFormatted)return;let t=0;this.modifierContext&&(this.modifierContext.preFormat(),0===this.modifierContext.getWidth()&&(t=Yt.minNoteheadPadding));let e=this.getGlyphWidth()+this.leftDisplacedHeadPx+this.rightDisplacedHeadPx+t;this.shouldDrawFlag()&&this.stem_direction===J.UP&&(e+=this.getGlyphWidth()),this.setWidth(e),this.preFormatted=!0}getNoteHeadBounds(){let t,e,i,b,a=1/0,s=-1/0,n=this.checkStave().getNumLines(),l=1,o=n,r=l;return this._noteHeads.forEach((h=>{const c=h.getLine(),m=h.getY();a=Math.min(m,a),s=Math.max(m,s),void 0===e&&h.isDisplaced()&&(e=h.getAbsoluteX()),void 0!==t||h.isDisplaced()||(t=h.getAbsoluteX()),n=Math.max(c,n),l=Math.min(c,l),h.isDisplaced()?(i=void 0===i?c:Math.max(c,i),b=void 0===b?c:Math.min(c,b)):(o=Math.max(c,o),r=Math.min(c,r))}),this),{y_top:a,y_bottom:s,displaced_x:e,non_displaced_x:t,highest_line:n,lowest_line:l,highest_displaced_line:i,lowest_displaced_line:b,highest_non_displaced_line:o,lowest_non_displaced_line:r}}getNoteHeadBeginX(){return this.getAbsoluteX()+this.x_shift}getNoteHeadEndX(){return this.getNoteHeadBeginX()+this.getGlyphWidth()}get noteHeads(){return this._noteHeads.slice()}get note_heads(){return console.warn("StaveNote.note_heads is deprecated. Use StaveNote.noteHeads instead.","This accessor will be removed in VexFlow 5.0."),this.noteHeads}drawLedgerLines(){const t=this.checkStave(),{glyph:e,render_options:{stroke_px:i}}=this,b=this.checkContext(),a=e.getWidth()+2*i,s=2*(e.getWidth()+i)-J.WIDTH/2;if(this.isRest())return;if(!b)throw new h("NoCanvasContext","Can't draw without a canvas context.");const{highest_line:n,lowest_line:l,highest_displaced_line:o,highest_non_displaced_line:r,lowest_displaced_line:c,lowest_non_displaced_line:m,displaced_x:d,non_displaced_x:_}=this.getNoteHeadBounds();if(n<6&&l>0)return;const x=Math.min(null!=d?d:0,null!=_?_:0),g=(t,e,n)=>{let l;l=n&&e?x-i:e?(null!=_?_:0)-i:(null!=d?d:0)-i;const o=e&&n?s:a;b.beginPath(),b.moveTo(l,t),b.lineTo(l+o,t),b.stroke()},p=Object.assign(Object.assign({},t.getDefaultLedgerLineStyle()),this.getLedgerLineStyle());this.applyStyle(b,p);for(let e=6;e<=n;++e){const i=void 0!==_&&e<=r,b=void 0!==o&&e<=o;g(t.getYForNote(e),i,b)}for(let e=0;e>=l;--e){const i=void 0!==_&&e>=m,b=void 0!==c&&e>=c;g(t.getYForNote(e),i,b)}this.restoreStyle(b,p)}drawModifiers(){const t=this.checkContext();t.openGroup("modifiers");for(let e=0;e{t.openGroup("notehead",void 0,{pointerBBox:!0}),e.setContext(t).draw(),t.closeGroup()}))}drawStem(t){var e;const i=this.checkContext();t&&this.setStem(new J(t)),this.shouldDrawFlag()&&this.stem&&this.stem.adjustHeightForFlag(),i.openGroup("stem",void 0,{pointerBBox:!0}),null===(e=this.stem)||void 0===e||e.setContext(i).draw(),i.closeGroup()}getStemExtension(){const t=super.getStemExtension();if(!this.glyph.stem)return t;const e=this.getStemDirection();if(e!==this.calculateOptimalStemDirection())return t;let i;i=e===J.UP?3-this.maxLine:this.minLine-3;const b=i-3.5;if(b<=0)return t;const a=this.getStave();let s=10;return null!=a&&(s=a.getSpacingBetweenLines()),t+b*s}draw(){var t;if(0===this.ys.length)throw new h("NoYValues","Can't draw note without Y values.");const e=this.checkContext(),i=this.getNoteHeadBeginX(),b=this.hasStem()&&!this.beam;this._noteHeads.forEach((t=>t.setX(i)));const a=this.getStemX();null===(t=this.stem)||void 0===t||t.setNoteHeadXBounds(a,a),function(...t){Yt.DEBUG&&d("Vex.Flow.StaveNote",t)}("Rendering ",this.isChord()?"chord :":"note :",this.keys),this.applyStyle(),this.setAttribute("el",e.openGroup("stavenote",this.getAttribute("id"))),this.drawLedgerLines(),e.openGroup("note",void 0,{pointerBBox:!0}),b&&this.drawStem(),this.drawNoteHeads(),this.drawFlag(),e.closeGroup(),this.drawModifiers(),e.closeGroup(),this.restoreStyle(),this.setRendered()}}function Gt(t){if(!t)return!1;const e=c();return"function"==typeof e.HTMLCanvasElement&&t instanceof e.HTMLCanvasElement||"function"==typeof t.getContext&&"function"==typeof t.toDataURL}Yt.DEBUG=!1;class Xt extends dt{constructor(t){super(),this.textHeight=0,this.context2D=t,t.canvas?this.canvas=t.canvas:this.canvas={width:Xt.WIDTH,height:Xt.HEIGHT}}static get WIDTH(){return 600}static get HEIGHT(){return 400}static get CANVAS_BROWSER_SIZE_LIMIT(){return 32767}static sanitizeCanvasDims(t,e){const i=this.CANVAS_BROWSER_SIZE_LIMIT;return Math.max(t,e)>i&&(_("Canvas dimensions exceed browser limit. Cropping to "+i),t>i&&(t=i),e>i&&(e=i)),[t,e]}clear(){this.context2D.clearRect(0,0,this.canvas.width,this.canvas.height)}openGroup(t,e,i){}closeGroup(){}add(t){}setFillStyle(t){return this.context2D.fillStyle=t,this}setBackgroundFillStyle(t){return this}setStrokeStyle(t){return this.context2D.strokeStyle=t,this}setShadowColor(t){return this.context2D.shadowColor=t,this}setShadowBlur(t){const e=this.context2D.getTransform(),i=Math.sqrt(e.a*e.a+e.b*e.b+e.c*e.c+e.d*e.d);return this.context2D.shadowBlur=i*t,this}setLineWidth(t){return this.context2D.lineWidth=t,this}setLineCap(t){return this.context2D.lineCap=t,this}setLineDash(t){return this.context2D.setLineDash(t),this}scale(t,e){return this.context2D.scale(t,e),this}resize(t,e){const i=this.context2D.canvas,b=c().devicePixelRatio||1;return[t,e]=Xt.sanitizeCanvasDims(t*b,e*b),t=t/b|0,e=e/b|0,i.width=t*b,i.height=e*b,Gt(i)&&(i.style.width=t+"px",i.style.height=e+"px"),this.scale(b,b)}rect(t,e,i,b){return this.context2D.rect(t,e,i,b),this}fillRect(t,e,i,b){return this.context2D.fillRect(t,e,i,b),this}clearRect(t,e,i,b){return this.context2D.clearRect(t,e,i,b),this}beginPath(){return this.context2D.beginPath(),this}moveTo(t,e){return this.context2D.moveTo(t,e),this}lineTo(t,e){return this.context2D.lineTo(t,e),this}bezierCurveTo(t,e,i,b,a,s){return this.context2D.bezierCurveTo(t,e,i,b,a,s),this}quadraticCurveTo(t,e,i,b){return this.context2D.quadraticCurveTo(t,e,i,b),this}arc(t,e,i,b,a,s){return this.context2D.arc(t,e,i,b,a,s),this}fill(){return this.context2D.fill(),this}stroke(){return this.context2D.stroke(),this}closePath(){return this.context2D.closePath(),this}measureText(t){const e=this.context2D.measureText(t);let i=0,b=0;return e.fontBoundingBoxAscent?(i=-e.fontBoundingBoxAscent,b=e.fontBoundingBoxDescent+e.fontBoundingBoxAscent):(i=-e.actualBoundingBoxAscent,b=e.actualBoundingBoxDescent+e.actualBoundingBoxAscent),{x:0,y:i,width:e.width,height:b}}fillText(t,e,i){return this.context2D.fillText(t,e,i),this}save(){return this.context2D.save(),this}restore(){return this.context2D.restore(),this}set fillStyle(t){this.context2D.fillStyle=t}get fillStyle(){return this.context2D.fillStyle}set strokeStyle(t){this.context2D.strokeStyle=t}get strokeStyle(){return this.context2D.strokeStyle}setFont(t,e,i,b){const a=E.validate(t,e,i,b);return this.context2D.font=E.toCSSString(a),this.textHeight=E.convertSizeToPixelValue(a.size),this}getFont(){return this.context2D.font}}const Ht={path:{x:!0,y:!0,width:!0,height:!0,"font-family":!0,"font-weight":!0,"font-style":!0,"font-size":!0},rect:{"font-family":!0,"font-weight":!0,"font-style":!0,"font-size":!0},text:{width:!0,height:!0}},jt="http://www.w3.org/2000/svg",Vt=2*Math.PI;class Kt extends dt{constructor(t){super(),this.width=0,this.height=0,this.backgroundFillStyle="white",this.fontCSSString="",this.element=t;const e=this.create("svg");this.element.appendChild(e),this.svg=e,this.parent=this.svg,this.groups=[this.svg],this.path="",this.pen={x:NaN,y:NaN},this.lineWidth=1;const i={"font-family":E.SANS_SERIF,"font-size":E.SIZE+"pt","font-weight":T.NORMAL,"font-style":w.NORMAL};this.state=Object.assign({scale:{x:1,y:1}},i),this.attributes=Object.assign({"stroke-width":.3,"stroke-dasharray":"none",fill:"black",stroke:"black"},i),this.shadow_attributes={width:0,color:"black"},this.state_stack=[]}create(t){return document.createElementNS(jt,t)}openGroup(t,e,i){const b=this.create("g");return this.groups.push(b),this.parent.appendChild(b),this.parent=b,t&&b.setAttribute("class",g(t)),e&&b.setAttribute("id",g(e)),i&&i.pointerBBox&&b.setAttribute("pointer-events","bounding-box"),b}closeGroup(){this.groups.pop(),this.parent=this.groups[this.groups.length-1]}add(t){this.parent.appendChild(t)}setFillStyle(t){return this.attributes.fill=t,this}setBackgroundFillStyle(t){return this.backgroundFillStyle=t,this}setStrokeStyle(t){return this.attributes.stroke=t,this}setShadowColor(t){return this.shadow_attributes.color=t,this}setShadowBlur(t){return this.shadow_attributes.width=t,this}setLineWidth(t){return this.attributes["stroke-width"]=t,this.lineWidth=t,this}setLineDash(t){if("[object Array]"===Object.prototype.toString.call(t))return this.attributes["stroke-dasharray"]=t.join(","),this;throw new h("ArgumentError","lineDash must be an array of integers.")}setLineCap(t){return this.attributes["stroke-linecap"]=t,this}resize(t,e){this.width=t,this.height=e,this.element.style.width=t.toString(),this.svg.style.width=t.toString(),this.svg.style.height=e.toString();const i={width:t,height:e};return this.applyAttributes(this.svg,i),this.scale(this.state.scale.x,this.state.scale.y),this}scale(t,e){this.state.scale={x:t,y:e};const i=this.width/t,b=this.height/e;return this.setViewBox(0,0,i,b),this}setViewBox(t,e,i,b){if("string"==typeof t)this.svg.setAttribute("viewBox",t);else{const a=t+" "+e+" "+i+" "+b;this.svg.setAttribute("viewBox",a)}}applyAttributes(t,e){const i=Ht[t.nodeName];for(const b in e)i&&i[b]||t.setAttributeNS(null,b,e[b]);return t}clear(){for(;this.svg.lastChild;)this.svg.removeChild(this.svg.lastChild);this.scale(this.state.scale.x,this.state.scale.y)}rect(t,e,i,b,a){b<0&&(e+=b,b*=-1);const s=this.create("rect");return a=null!=a?a:{fill:"none","stroke-width":this.lineWidth,stroke:"black"},this.applyAttributes(s,Object.assign({x:t,y:e,width:i,height:b},a)),this.add(s),this}fillRect(t,e,i,b){const a={fill:this.attributes.fill};return this.rect(t,e,i,b,a),this}clearRect(t,e,i,b){return this.rect(t,e,i,b,{"stroke-width":0,fill:this.backgroundFillStyle}),this}beginPath(){return this.path="",this.pen.x=NaN,this.pen.y=NaN,this}moveTo(t,e){return this.path+="M"+t+" "+e,this.pen.x=t,this.pen.y=e,this}lineTo(t,e){return this.path+="L"+t+" "+e,this.pen.x=t,this.pen.y=e,this}bezierCurveTo(t,e,i,b,a,s){return this.path+="C"+t+" "+e+","+i+" "+b+","+a+" "+s,this.pen.x=a,this.pen.y=s,this}quadraticCurveTo(t,e,i,b){return this.path+="Q"+t+" "+e+","+i+" "+b,this.pen.x=i,this.pen.y=b,this}arc(t,e,i,b,a,s){const n=t+i*Math.cos(b),l=e+i*Math.sin(b);if(!s&&a-b>=Vt||s&&b-a>=Vt){const a=t+i*Math.cos(b+Math.PI),s=e+i*Math.sin(b+Math.PI);this.path+=`M${n} ${l} A${i} ${i} 0 0 0 ${a} ${s} `,this.path+=`A${i} ${i} 0 0 0 ${n} ${l}`,this.pen.x=n,this.pen.y=l}else{const o=t+i*Math.cos(a),r=e+i*Math.sin(a);let h;b=p(b),a=p(a),h=Math.abs(a-b)a&&(h=!h);const c=!s;this.path+=`M${n} ${l} A${i} ${i} 0 ${+h} ${+c} ${o} ${r}`,this.pen.x=o,this.pen.y=r}return this}closePath(){return this.path+="Z",this}getShadowStyle(){const t=this.shadow_attributes;return`filter: drop-shadow(0 0 ${t.width/1.5}px ${t.color})`}fill(t){const e=this.create("path");return void 0===t&&(t=Object.assign(Object.assign({},this.attributes),{stroke:"none"})),t.d=this.path,this.shadow_attributes.width>0&&(t.style=this.getShadowStyle()),this.applyAttributes(e,t),this.add(e),this}stroke(){const t=this.create("path"),e=Object.assign(Object.assign({},this.attributes),{fill:"none","stroke-width":this.lineWidth,d:this.path});return this.shadow_attributes.width>0&&(e.style=this.getShadowStyle()),this.applyAttributes(t,e),this.add(t),this}measureText(t){return Kt.measureTextCache.lookup(t,this.svg,this.attributes)}fillText(t,e,i){if(!t||t.length<=0)return this;const b=Object.assign(Object.assign({},this.attributes),{stroke:"none",x:e,y:i}),a=this.create("text");return a.textContent=t,this.applyAttributes(a,b),this.add(a),this}save(){return this.state_stack.push({state:{"font-family":this.state["font-family"],"font-weight":this.state["font-weight"],"font-style":this.state["font-style"],"font-size":this.state["font-size"],scale:this.state.scale},attributes:{"font-family":this.attributes["font-family"],"font-weight":this.attributes["font-weight"],"font-style":this.attributes["font-style"],"font-size":this.attributes["font-size"],fill:this.attributes.fill,stroke:this.attributes.stroke,"stroke-width":this.attributes["stroke-width"],"stroke-dasharray":this.attributes["stroke-dasharray"]},shadow_attributes:{width:this.shadow_attributes.width,color:this.shadow_attributes.color},lineWidth:this.lineWidth}),this}restore(){const t=this.state_stack.pop();if(t){const e=t;this.state["font-family"]=e.state["font-family"],this.state["font-weight"]=e.state["font-weight"],this.state["font-style"]=e.state["font-style"],this.state["font-size"]=e.state["font-size"],this.state.scale=e.state.scale,this.attributes["font-family"]=e.attributes["font-family"],this.attributes["font-weight"]=e.attributes["font-weight"],this.attributes["font-style"]=e.attributes["font-style"],this.attributes["font-size"]=e.attributes["font-size"],this.attributes.fill=e.attributes.fill,this.attributes.stroke=e.attributes.stroke,this.attributes["stroke-width"]=e.attributes["stroke-width"],this.attributes["stroke-dasharray"]=e.attributes["stroke-dasharray"],this.shadow_attributes.width=e.shadow_attributes.width,this.shadow_attributes.color=e.shadow_attributes.color,this.lineWidth=e.lineWidth}return this}set fillStyle(t){this.setFillStyle(t)}get fillStyle(){return this.attributes.fill}set strokeStyle(t){this.setStrokeStyle(t)}get strokeStyle(){return this.attributes.stroke}setFont(t,e,i,b){const a=E.validate(t,e,i,b);this.fontCSSString=E.toCSSString(a);const s={"font-family":a.family,"font-size":a.size,"font-weight":a.weight,"font-style":a.style};return this.attributes=Object.assign(Object.assign({},this.attributes),s),this.state=Object.assign(Object.assign({},this.state),s),this}getFont(){return this.fontCSSString}}var $t,qt,Qt,Jt;Kt.measureTextCache=new class{constructor(){this.cache={}}lookup(t,e,i){let b=this.cache[t];void 0===b&&(b={},this.cache[t]=b);const a=`${i["font-family"]}%${i["font-size"]}%${i["font-weight"]}%${i["font-style"]}`;let s=b[a];return void 0===s&&(s=this.measureImpl(t,e,i),b[a]=s),s}measureImpl(t,e,i){let b=this.txt;b||(b=document.createElementNS(jt,"text"),this.txt=b),b.textContent=t,b.setAttributeNS(null,"font-family",i["font-family"]),b.setAttributeNS(null,"font-size",i["font-size"]),b.setAttributeNS(null,"font-style",i["font-style"]),b.setAttributeNS(null,"font-weight",i["font-weight"]),e.appendChild(b);const a=b.getBBox();return e.removeChild(b),{x:a.x,y:a.y,width:a.width,height:a.height}}},function(t){t[t.CANVAS=1]="CANVAS",t[t.SVG=2]="SVG"}($t||($t={})),function(t){t[t.NONE=1]="NONE",t[t.UP=2]="UP",t[t.DOWN=3]="DOWN"}(qt||(qt={}));class Zt{constructor(t,e){if(i(t,r.RenderContext))this.ctx=t;else{if(void 0===e)throw new h("InvalidArgument","Missing backend argument");const i=e;let b;if("string"==typeof t){const e=document.getElementById(t);if(!e)throw new h("BadElementId",`Can't find element with ID "${e}"`);b=e}else b=t;if(i===Zt.Backends.CANVAS){if(!Gt(b))throw new h("BadElement","CANVAS context requires an HTMLCanvasElement.");const t=b.getContext("2d");if(!t)throw new h("BadElement","Can't get canvas context");this.ctx=new Xt(t)}else{if(i!==Zt.Backends.SVG)throw new h("InvalidBackend",`No support for backend: ${i}`);if(!function(t){if(!t)return!1;const e=c();return"function"==typeof e.HTMLDivElement&&t instanceof e.HTMLDivElement||"function"==typeof t.appendChild&&"object"==typeof t.style}(b))throw new h("BadElement","SVG context requires an HTMLDivElement.");this.ctx=new Kt(b)}}}static buildContext(t,e,i,b,a="#FFF"){const s=new Zt(t,e);i&&b&&s.resize(i,b);const n=s.getContext();return n.setBackgroundFillStyle(a),Zt.lastContext=n,n}static getCanvasContext(t,e,i,b){return Zt.buildContext(t,Zt.Backends.CANVAS,e,i,b)}static getSVGContext(t,e,i,b){return Zt.buildContext(t,Zt.Backends.SVG,e,i,b)}static drawDashedLine(t,e,i,b,a,s){t.beginPath();const n=b-e,l=a-i,o=Math.atan2(l,n);let r=e,h=i;t.moveTo(e,i);let c=0,m=!0;for(;!(n<0?r<=b:r>=b)||!(l<0?h<=a:h>=a);){const e=s[c++%s.length],i=r+Math.cos(o)*e;r=n<0?Math.max(b,i):Math.min(b,i);const d=h+Math.sin(o)*e;h=l<0?Math.max(a,d):Math.min(a,d),m?t.lineTo(r,h):t.moveTo(r,h),m=!m}t.closePath(),t.stroke()}resize(t,e){return this.ctx.resize(t,e),this}getContext(){return this.ctx}}Zt.Backends=$t,Zt.LineEndType=qt,Zt.lastContext=void 0;class te extends z{constructor(t){super(),this.string_number=t,this.setWidth(20),this.position=z.Position.ABOVE,this.x_shift=0,this.y_shift=0,this.text_line=0,this.stem_offset=0,this.x_offset=0,this.y_offset=0,this.dashed=!0,this.leg=Zt.LineEndType.NONE,this.radius=8,this.resetFont()}static get CATEGORY(){return r.StringNumber}static get metrics(){return K.currentMusicFont().getMetrics().glyphs.stringNumber}static format(t,e){const i=e.left_shift,b=e.right_shift;if(!t||0===t.length)return!1;const a=[];let s=null,l=0,o=0;for(let r=0;re.line-t.line));let r=0,c=0,m=0,d=null,_=null;for(let t=0;tc?e:c):n===z.Position.RIGHT&&(o.setXShift(r),e+=g,m=e>m?e:m),d=h,_=s}return e.left_shift+=c,e.right_shift+=m,!0}setLineEndType(t){return t>=Zt.LineEndType.NONE&&t<=Zt.LineEndType.DOWN&&(this.leg=t),this}setStringNumber(t){return this.string_number=t,this}setOffsetX(t){return this.x_offset=t,this}setOffsetY(t){return this.y_offset=t,this}setLastNote(t){return this.last_note=t,this}setDashed(t){return this.dashed=t,this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.getModifierStartXY(this.position,this.index),b=e.hasStem()?e.getStemDirection():J.UP;let a=i.x+this.x_shift+this.x_offset,s={};e.hasStem()&&(s=e.checkStem().getExtents());let n=i.y+this.y_shift+this.y_offset;switch(this.position){case z.Position.ABOVE:n=e.getYs().reduce(((t,e)=>tt>e?t:e)),e.hasStem()&&b==J.DOWN&&(n=s.topY-te.metrics.stemPadding),n+=this.radius+te.metrics.verticalPadding+this.text_line*K.STAVE_LINE_DISTANCE;break;case z.Position.LEFT:a-=this.radius/2+te.metrics.leftPadding;break;case z.Position.RIGHT:a+=this.radius/2+te.metrics.rightPadding;break;default:throw new h("InvalidPosition",`The position ${this.position} is invalid`)}t.save(),t.beginPath(),t.arc(a,n,this.radius,0,2*Math.PI,!1),t.setLineWidth(1.5),t.stroke(),t.setFont(this.textFont);const o=a-t.measureText(this.string_number).width/2;t.fillText(""+this.string_number,o,n+4.5);const r=this.last_note;if(l(r)){const i=r.getStemX()-e.getX()+5;let b,s;switch(t.setStrokeStyle("#000000"),t.setLineCap("round"),t.setLineWidth(.6),this.dashed?Zt.drawDashedLine(t,a+10,n,a+i,n,[3,3]):Zt.drawDashedLine(t,a+10,n,a+i,n,[3,0]),this.leg){case Zt.LineEndType.UP:b=-10,s=this.dashed?[3,3]:[3,0],Zt.drawDashedLine(t,a+i,n,a+i,n+b,s);break;case Zt.LineEndType.DOWN:b=10,s=this.dashed?[3,3]:[3,0],Zt.drawDashedLine(t,a+i,n,a+i,n+b,s)}}t.restore()}}te.TEXT_FONT={family:E.SANS_SERIF,size:E.SIZE,weight:T.BOLD,style:w.NORMAL};class ee extends z{constructor(t,e){super(),this.options=Object.assign({all_voices:!0},e),this.all_voices=this.options.all_voices,this.type=t,this.position=z.Position.LEFT,this.render_options={font_scale:38},this.resetFont(),this.setXShift(0),this.setWidth(10)}static get CATEGORY(){return r.Stroke}static format(t,e){const i=e.left_shift;if(!t||0===t.length)return!1;const b=t.map((t=>{const e=t.getNote(),i=t.checkIndex();if(n(e)){const{line:b}=e.getKeyProps()[i];return{line:b,shift:e.getLeftDisplacedHeadPx(),stroke:t}}if(o(e)){const{str:b}=e.getPositions()[i];return{line:b,shift:0,stroke:t}}throw new h("Internal","Unexpected instance.")})),a=i,s=b.reduce(((t,{stroke:e,shift:i})=>(e.setXShift(a+i),Math.max(e.getWidth()+0,t))),0);return e.left_shift+=s,!0}getPosition(){return this.position}addEndNote(t){return this.note_end=t,this}draw(){const t=this.checkContext(),e=this.checkAttachedNote();this.setRendered();const i=e.getModifierStartXY(this.position,this.index);let b=e.getYs(),a=i.y,l=i.y;const o=i.x-5,r=e.checkStave().getSpacingBetweenLines(),c=this.checkModifierContext().getMembers(e.getCategory());for(let t=0;t0){b-=n.map((t=>t.getTextHeight())).reduce(((t,e)=>t>e?t:e))/K.STAVE_LINE_DISTANCE+1}else e.top_text_line+=1;for(let e=0;e=t.line?i.above:i.below}}this.placeGlyphOnLine(b,this.checkStave(),t.line),this.glyphs.push(b);const s=this.xPositions[this.xPositions.length-1],n=b.getMetrics().width+a;this.xPositions.push(s+n),this.width+=n}cancelKey(t){return this.formatted=!1,this.cancelKeySpec=t,this}convertToCancelAccList(t){const e=K.keySignature(t),i=this.accList.length>0&&e.length>0&&e[0].type!==this.accList[0].type,b=i?e.length:e.length-this.accList.length;if(b<1)return;const a=[];for(let t=0;t0?e[0].type:void 0;let b;if(this.cancelKeySpec&&(b=this.convertToCancelAccList(this.cancelKeySpec)),this.alterKeySpec&&this.convertToAlterAccList(this.alterKeySpec),this.accList.length>0){const a=(this.position===gt.END?t.getEndClef():t.getClef())||t.getClef();b&&this.convertAccLines(a,b.type,b.accList),this.convertAccLines(a,i,e);for(let t=0;t0?"PlusSmall":"Plus";break;case"(":b=i.length>0?"ParensLeftSmall":"ParensLeft";break;case")":b=i.length>0?"ParensRightSmall":"ParensRight"}const a=new O("timeSig"+b,this.timeSignature.point);this.topGlyphs.push(a),l+=null!==(n=a.getMetrics().width)&&void 0!==n?n:0}let o=0;for(let t=0;t0?e.getYForLine(this.timeSignature.topLine):(e.getYForLine(this.timeSignature.topLine)+e.getYForLine(this.timeSignature.bottomLine))/2;for(let t=0;t{const e=t.split("/");if(2!==e.length&&"+"!==e[0]&&"-"!==e[0])throw new h("BadTimeSignature",`Invalid time spec: ${t}. Must be in the form "/"`);e.forEach((e=>{if(0==/^[0-9+\-()]+$/.test(e))throw new h("BadTimeSignature",`Invalid time spec: ${t}. Must contain valid signatures.`)}))})(t);const b=t.split("/");return{num:!0,glyph:this.makeTimeSignatureGlyph(null!==(e=b[0])&&void 0!==e?e:"",null!==(i=b[1])&&void 0!==i?i:"")}}makeTimeSignatureGlyph(t,e){return new de(this,t,e,"timeSig0",this.point)}getInfo(){return this.info}setTimeSig(t){return this.info=this.parseTimeSpec(t),this}draw(){const t=this.checkStave(),e=t.checkContext();this.setRendered(),e.openGroup("timesignature",this.getAttribute("id")),this.info.glyph.setStave(t),this.info.glyph.setContext(e),this.placeGlyphOnLine(this.info.glyph,t,this.info.line),this.info.glyph.renderToStave(this.x),e.closeGroup()}}const xe={[vt.CATEGORY]:0,[se.CATEGORY]:1,[ne.CATEGORY]:2,[_e.CATEGORY]:3},ge={[_e.CATEGORY]:0,[ne.CATEGORY]:1,[vt.CATEGORY]:2,[se.CATEGORY]:3};class pe extends P{constructor(t,e,i,b){super(),this.height=0,this.x=t,this.y=e,this.width=i,this.formatted=!1,this.start_x=t+5,this.end_x=t+i,this.modifiers=[],this.measure=0,this.clef="treble",this.endClef=void 0,this.resetFont(),this.options=Object.assign({vertical_bar_width:10,num_lines:5,fill_style:"#999999",left_bar:!0,right_bar:!0,spacing_between_lines_px:K.STAVE_LINE_DISTANCE,space_above_staff_ln:4,space_below_staff_ln:4,top_text_position:1,bottom_text_position:4,line_config:[]},b),this.bounds={x:this.x,y:this.y,w:this.width,h:0},this.defaultLedgerLineStyle={strokeStyle:"#444",lineWidth:1.4},this.resetLines(),this.addModifier(new vt(this.options.left_bar?pt.SINGLE:pt.NONE)),this.addEndModifier(new vt(this.options.right_bar?pt.SINGLE:pt.NONE))}static get CATEGORY(){return r.Stave}static get defaultPadding(){const t=K.currentMusicFont();return t.lookupMetric("stave.padding")+t.lookupMetric("stave.endPaddingMax")}static get rightPadding(){return K.currentMusicFont().lookupMetric("stave.endPaddingMax")}setDefaultLedgerLineStyle(t){this.defaultLedgerLineStyle=t}getDefaultLedgerLineStyle(){return Object.assign(Object.assign({},this.getStyle()),this.defaultLedgerLineStyle)}space(t){return this.options.spacing_between_lines_px*t}resetLines(){this.options.line_config=[];for(let t=0;ti.getWidth()&&(e-=i.getWidth()),e}setRepetitionType(t,e=0){return this.modifiers.push(new le(t,this.x,e)),this}setVoltaType(t,e,i){return this.modifiers.push(new me(t,e,this.x,i)),this}setSection(t,e,i=0,b){const a=new oe(t,this.x+i,e);return b&&a.setFontSize(b),this.modifiers.push(a),this}setTempo(t,e){return this.modifiers.push(new re(t,this.x,e)),this}setText(t,e,i={}){return this.modifiers.push(new ce(t,e,i)),this}getHeight(){return this.height}getSpacingBetweenLines(){return this.options.spacing_between_lines_px}getBoundingBox(){return new y(this.x,this.y,this.width,this.getBottomY()-this.y)}getBottomY(){const t=this.options,e=t.spacing_between_lines_px;return this.getYForLine(t.num_lines)+t.space_below_staff_ln*e}getBottomLineY(){return this.getYForLine(this.options.num_lines)}getYForLine(t){const e=this.options,i=e.spacing_between_lines_px,b=e.space_above_staff_ln;return this.y+t*i+b*i}getLineForY(t){const e=this.options,i=e.spacing_between_lines_px,b=e.space_above_staff_ln;return(t-this.y)/i-b}getYForTopText(t=0){return this.getYForLine(-t-this.options.top_text_position)}getYForBottomText(t=0){return this.getYForLine(this.options.bottom_text_position+t)}getYForNote(t){const e=this.options,i=e.spacing_between_lines_px,b=e.space_above_staff_ln;return this.y+b*i+5*i-t*i}getYForGlyphs(){return this.getYForLine(3)}addModifier(t,e){return void 0!==e&&t.setPosition(e),t.setStave(this),this.formatted=!1,this.modifiers.push(t),this}addEndModifier(t){return this.addModifier(t,gt.END),this}setBegBarType(t){const{SINGLE:e,REPEAT_BEGIN:i,NONE:b}=pt;return t!==e&&t!==i&&t!==b||(this.modifiers[0].setType(t),this.formatted=!1),this}setEndBarType(t){return t!==pt.REPEAT_BEGIN&&(this.modifiers[1].setType(t),this.formatted=!1),this}setClef(t,e,i,b){void 0===b&&(b=gt.BEGIN),b===gt.END?this.endClef=t:this.clef=t;const a=this.getModifiers(b,se.CATEGORY);return 0===a.length?this.addClef(t,e,i,b):a[0].setType(t,e,i),this}getClef(){return this.clef}setEndClef(t,e,i){return this.setClef(t,e,i,gt.END),this}getEndClef(){return this.endClef}setKeySignature(t,e,i){void 0===i&&(i=gt.BEGIN);const b=this.getModifiers(i,ne.CATEGORY);return 0===b.length?this.addKeySignature(t,e,i):b[0].setKeySig(t,e),this}setEndKeySignature(t,e){return this.setKeySignature(t,e,gt.END),this}setTimeSignature(t,e,i){void 0===i&&(i=gt.BEGIN);const b=this.getModifiers(i,_e.CATEGORY);return 0===b.length?this.addTimeSignature(t,e,i):b[0].setTimeSig(t),this}setEndTimeSignature(t,e){return this.setTimeSignature(t,e,gt.END),this}addKeySignature(t,e,i){return void 0===i&&(i=gt.BEGIN),this.addModifier(new ne(t,e).setPosition(i),i),this}addClef(t,e,i,b){return void 0===b||b===gt.BEGIN?this.clef=t:b===gt.END&&(this.endClef=t),this.addModifier(new se(t,e,i),b),this}addEndClef(t,e,i){return this.addClef(t,e,i,gt.END),this}addTimeSignature(t,e,i){return this.addModifier(new _e(t,e),i),this}addEndTimeSignature(t,e){return this.addTimeSignature(t,e,gt.END),this}addTrebleGlyph(){return this.addClef("treble"),this}getModifiers(t,e){const i=void 0===t,b=void 0===e;return i&&b?this.modifiers:i?this.modifiers.filter((t=>e===t.getCategory())):b?this.modifiers.filter((e=>t===e.getPosition())):this.modifiers.filter((i=>t===i.getPosition()&&e===i.getCategory()))}sortByCategory(t,e){for(let i=t.length-1;i>=0;i--)for(let b=0;be[t[b+1].getCategory()]){const e=t[b];t[b]=t[b+1],t[b+1]=e}}format(){const t=this.modifiers[0],e=this.modifiers[1],i=this.getModifiers(gt.BEGIN),a=this.getModifiers(gt.END);let s,n,l;this.sortByCategory(i,xe),this.sortByCategory(a,ge),i.length>1&&t.getType()===pt.REPEAT_BEGIN&&(i.push(i.splice(0,1)[0]),i.splice(0,0,new vt(pt.SINGLE))),a.indexOf(e)>0&&a.splice(0,0,new vt(pt.NONE));let o=0,r=this.x;for(let t=0;t0){t.save(),t.setFont(this.textFont);const e=t.measureText(""+this.measure).width;a=this.getYForTopText(0)+3,t.fillText(""+this.measure,this.x-e/2,a),t.restore()}return t.closeGroup(),this}getVerticalBarWidth(){return this.options.vertical_bar_width}getConfigForLines(){return this.options.line_config}setConfigForLine(t,e){if(t>=this.options.num_lines||t<0)throw new h("StaveConfigError","The line number must be within the range of the number of lines in the Stave.");if(void 0===e.visible)throw new h("StaveConfigError","The line configuration object is missing the 'visible' property.");if("boolean"!=typeof e.visible)throw new h("StaveConfigError","The line configuration objects 'visible' property must be true or false.");return this.options.line_config[t]=e,this}setConfigForLines(t){if(t.length!==this.options.num_lines)throw new h("StaveConfigError","The length of the lines configuration array must match the number of lines in the Stave");for(const e in t)null==t[e].visible&&(t[e]=this.options.line_config[e]),this.options.line_config[e]=Object.assign(Object.assign({},this.options.line_config[e]),t[e]);return this.options.line_config=t,this}}function ue(t,e,i,b,a){if(e!==fe.type.BOLD_DOUBLE_LEFT&&e!==fe.type.BOLD_DOUBLE_RIGHT)throw new h("InvalidConnector","A REPEAT_BEGIN or REPEAT_END type must be provided.");let s=3,n=3.5;e===fe.type.BOLD_DOUBLE_RIGHT&&(s=-5,n=3),t.fillRect(i+s,b,1,a-b),t.fillRect(i-2,b,n,a-b)}pe.TEXT_FONT={family:E.SANS_SERIF,size:8,weight:T.NORMAL,style:w.NORMAL};class fe extends P{constructor(t,e){super(),this.thickness=K.STAVE_LINE_THICKNESS,this.width=3,this.top_stave=t,this.bottom_stave=e,this.type=fe.type.DOUBLE,this.resetFont(),this.x_shift=0,this.texts=[]}static get CATEGORY(){return r.StaveConnector}setType(t){return(t="string"==typeof t?fe.typeString[t]:t)>=fe.type.SINGLE_RIGHT&&t<=fe.type.NONE&&(this.type=t),this}setText(t,e={}){return this.texts.push({content:t,options:Object.assign({shift_x:0,shift_y:0},e)}),this}setXShift(t){if("number"!=typeof t)throw new h("InvalidType","x_shift must be a Number");return this.x_shift=t,this}getXShift(){return this.x_shift}draw(){const t=this.checkContext();this.setRendered();let e=this.top_stave.getYForLine(0),i=this.bottom_stave.getYForLine(this.bottom_stave.getNumLines()-1)+this.thickness,b=this.width,a=this.top_stave.getX();(this.type===fe.type.SINGLE_RIGHT||this.type===fe.type.BOLD_DOUBLE_RIGHT||this.type===fe.type.THIN_DOUBLE)&&(a=this.top_stave.getX()+this.top_stave.getWidth());let s=i-e;switch(this.type){case fe.type.SINGLE:case fe.type.SINGLE_LEFT:case fe.type.SINGLE_RIGHT:b=1;break;case fe.type.DOUBLE:a-=this.width+2,e-=this.thickness,s+=.5;break;case fe.type.BRACE:{b=12;const a=this.top_stave.getX()-2+this.x_shift,n=e,l=a,o=i,r=a-b,h=n+s/2,c=r-.9*b,m=n+.2*s,d=a+1.1*b,_=h-.135*s,x=d,g=h+.135*s,p=c,u=o-.2*s,f=r-b,y=u,S=a+.4*b,T=h+.135*s,w=S,v=h-.135*s,D=f,C=m;t.beginPath(),t.moveTo(a,n),t.bezierCurveTo(c,m,d,_,r,h),t.bezierCurveTo(x,g,p,u,l,o),t.bezierCurveTo(f,y,S,T,r,h),t.bezierCurveTo(w,v,D,C,a,n),t.fill(),t.stroke();break}case fe.type.BRACKET:e-=6,i+=6,s=i-e,O.renderGlyph(t,a-5,e,40,"bracketTop"),O.renderGlyph(t,a-5,i,40,"bracketBottom"),a-=this.width+2;break;case fe.type.BOLD_DOUBLE_LEFT:ue(t,this.type,a+this.x_shift,e,i-this.thickness);break;case fe.type.BOLD_DOUBLE_RIGHT:ue(t,this.type,a,e,i-this.thickness);break;case fe.type.THIN_DOUBLE:b=1,s-=this.thickness;break;case fe.type.NONE:break;default:throw new h("InvalidType",`The provided StaveConnector.type (${this.type}) is invalid.`)}this.type!==fe.type.BRACE&&this.type!==fe.type.BOLD_DOUBLE_LEFT&&this.type!==fe.type.BOLD_DOUBLE_RIGHT&&this.type!==fe.type.NONE&&t.fillRect(a,e,b,s),this.type===fe.type.THIN_DOUBLE&&t.fillRect(a-3,e,b,s),t.save(),t.setLineWidth(2),t.setFont(this.textFont);for(let e=0;et.reduce(((t,e)=>t+e),0);function Se(t,e,i){const b=we.getResolutionMultiplier(t),a={},s=[],n=[];return t.forEach(((t,l)=>{const o=new u(0,b);t.getTickables().forEach((t=>{const b=o.numerator;if(!a[b]){const t=e({tickID:b});n.push(t),a[b]=t,s.push(b)}i(t,a[b],l),o.add(t.getTicks())}))})),{map:a,array:n,list:s.sort(((t,e)=>t-e)),resolutionMultiplier:b}}function Te(t,e,i,b){let a=e;for(let e=i+1;e{e.addToModifierContext(new ae);const b=(new zt).addTickable(e).preFormat(),a=b.getMetrics();return b.setX(t+a.totalLeftPx),t+b.getWidth()+a.totalRightPx+i}),e)}static plotDebugging(t,e,i,b,a,s){const n=i+(s=Object.assign({stavePadding:K.currentMusicFont().lookupMetric("stave.padding")},s)).stavePadding,l=e.contextGaps;t.save(),t.setFont(E.SANS_SERIF,8),l.gaps.forEach((e=>{var i,s,l;i=n+e.x1,s=n+e.x2,l="rgba(100,200,100,0.4)",t.beginPath(),t.setStrokeStyle(l),t.setFillStyle(l),t.setLineWidth(1),t.fillRect(i,b,Math.max(s-i,0),a-b),t.setFillStyle("green"),t.fillText(Math.round(e.x2-e.x1).toString(),n+e.x1,a+12)})),t.setFillStyle("red"),t.fillText(`Loss: ${(e.totalCost||0).toFixed(2)} Shift: ${(e.totalShift||0).toFixed(2)} Gap: ${l.total.toFixed(2)}`,n-20,a+27),t.restore()}static FormatAndDraw(t,e,i,b){let a={auto_beam:!1,align_rests:!1};"object"==typeof b?a=Object.assign(Object.assign({},a),b):"boolean"==typeof b&&(a.auto_beam=b);const s=new Mt(K.TIME4_4).setMode(Mt.Mode.SOFT).addTickables(i),n=a.auto_beam?Be.applyAndGetBeams(s):[];return(new we).joinVoices([s]).formatToStave([s],e,{align_rests:a.align_rests,stave:e}),s.setStave(e).draw(t,e),n.forEach((e=>e.setContext(t).draw())),s.getBoundingBox()}static FormatAndDrawTab(t,e,i,b,a,s,n){let l={auto_beam:s,align_rests:!1};"object"==typeof n?l=Object.assign(Object.assign({},l),n):"boolean"==typeof n&&(l.auto_beam=n);const o=new Mt(K.TIME4_4).setMode(Mt.Mode.SOFT).addTickables(a),r=new Mt(K.TIME4_4).setMode(Mt.Mode.SOFT).addTickables(b),h=l.auto_beam?Be.applyAndGetBeams(o):[];(new we).joinVoices([o]).joinVoices([r]).formatToStave([o,r],i,{align_rests:l.align_rests}),o.draw(t,i),r.draw(t,e),h.forEach((e=>e.setContext(t).draw())),new fe(i,e).setContext(t).draw()}static AlignRestsToNotes(t,e,i){t.forEach(((b,a)=>{if(n(b)&&b.isRest()){if(b.getTuplet()&&!i)return;const s=b.getGlyph().position.toUpperCase();if("R/4"!==s&&"B/4"!==s)return;if(e||b.getBeam()){const e=b.getKeyProps()[0];if(0===a)e.line=Te(t,e.line,a,!1);else if(a>0&&awe.AlignRestsToNotes(t.getTickables(),e)))}preCalculateMinTotalWidth(t){const e=K.currentMusicFont().lookupMetric("stave.unalignedNotePadding");let i=0,b=0,a=0;const s=[],n=[];if(this.hasMinTotalWidth)return this.minTotalWidth;if(!this.tickContexts){if(!t)throw new h("BadArgument","'voices' required to run preCalculateMinTotalWidth");this.createTickContexts(t)}const{list:l,map:o}=this.tickContexts;this.minTotalWidth=0,l.forEach((e=>{const l=o[e];l.preFormat(),l.getTickables().length{b+=t.getMetrics().width,a+=t.getTicks().value(),s.push(t.getMetrics().width),n.push(t.getTicks().value())}));const r=l.getWidth();this.minTotalWidth+=r})),this.hasMinTotalWidth=!0;const r=b>0?b/s.length:1/s.length,c=ye(s.map((t=>Math.pow(t-r,2)))),m=Math.pow(c/s.length,.5)/r,d=a/n.length,_=ye(n.map((t=>Math.pow(t-d,2)))),x=Math.pow(_/n.length,.5)/d,g=Math.max(x,m)*l.length*e,p=e*i;return this.minTotalWidth+Math.max(p,g)}getMinTotalWidth(){if(!this.hasMinTotalWidth)throw new h("NoMinTotalWidth","Call 'preCalculateMinTotalWidth' or 'preFormat' before calling 'getMinTotalWidth'");return this.minTotalWidth}static getResolutionMultiplier(t){if(!t||!t.length)throw new h("BadArgument","No voices to format");const e=t[0].getTotalTicks();return t.reduce(((t,i)=>{if(!i.getTotalTicks().equals(e))throw new h("TickMismatch","Voices should have same total note duration in ticks.");if(i.getMode()===Mt.Mode.STRICT&&!i.isComplete())throw new h("IncompleteVoice","Voice does not have enough notes.");return Math.max(t,u.LCM(t,i.getResolutionMultiplier()))}),1)}createModifierContexts(t){const e=Se(t,(()=>new ae),((t,e)=>t.addToModifierContext(e)));return this.modifierContexts=e,e}createTickContexts(t){const e=Se(t,(t=>new zt(t)),((t,e,i)=>e.addTickable(t,i)));this.tickContexts=e;const i=this.tickContexts.array;return i.forEach((t=>{t.tContexts=i})),e}preFormat(t=0,e,i,b){const a=this.tickContexts;if(!a)throw new h("NoTickContexts","preFormat requires TickContexts");const{list:s,map:n}=a;this.lossHistory=[],i&&b&&i.forEach((t=>t.setStave(b).preFormat()));let l=0,o=0;this.minTotalWidth=0;let r=0;s.forEach((t=>{const e=n[t];e.preFormat();const i=e.getWidth();this.minTotalWidth+=i;const b=e.getMaxTicks().value();r+=b;const a=e.getMetrics();l=l+o+a.totalLeftPx,e.setX(l),o=i-a.totalLeftPx}));const{globalSoftmax:c,softmaxFactor:d,maxIterations:_}=this.formatterOptions,x=ye(s.map((t=>Math.pow(d,n[t].getMaxTicks().value()/r))));if(this.minTotalWidth=l+o,this.hasMinTotalWidth=!0,t<=0)return this.evaluate();const g=n[s[0]],p=n[s[s.length-1]];function u(t){return s.map(((e,i)=>{const b=n[e],a=b.getTickablesByVoice();let l;if(i>0){const e=n[s[i-1]];for(let o=i-1;o>=0;o--){const i=n[s[o]].getTickablesByVoice(),h=[];if(Object.keys(a).forEach((t=>{i[t]&&h.push(t)})),h.length>0){let s=0,n=1/0,o=0;if(h.forEach((t=>{const e=i[t].getTicks().value();e>s&&(l=i[t],s=e);const b=a[t],o=b.getX()-(b.getMetrics().modLeftPx+b.getMetrics().leftDisplacedHeadPx),r=i[t].getMetrics(),h=i[t].getX()+r.notePx+r.modRightPx+r.rightDisplacedHeadPx;n=Math.min(n,o-h)})),n=Math.min(n,b.getX()-(e.getX()+.05*t)),c){const e=r;o=Math.pow(d,s/e)/x*t}else void 0!==l&&(o=l.getVoice().softmax(s)*t);return{expectedDistance:o,maxNegativeShiftPx:n,fromTickable:l}}}}return{expectedDistance:0,fromTickablePx:0,maxNegativeShiftPx:0}}))}function f(t){const e=y/2;let i=0;return s.forEach(((b,a)=>{const s=n[b];if(a>0){const e=s.getX(),b=t[a],n=m(b.fromTickable).getX()+b.expectedDistance-(e+i);let l=0;n>0?i+=n:n<0&&(l=Math.min(b.maxNegativeShiftPx,Math.abs(n)),i+=-l),s.setX(e+i)}s.getCenterAlignedTickables().forEach((t=>{t.setCenterXShift(e-s.getX())}))})),p.getX()-g.getX()}const y=t-p.getMetrics().notePx-p.getMetrics().totalRightPx-g.getMetrics().totalLeftPx,S=K.currentMusicFont(),T=S.lookupMetric("stave.endPaddingMin"),w=S.lookupMetric("stave.endPaddingMax");let v=y;const D=u(v);let C=f(D);const E=((t,e)=>{let i=t/2;if(e.length>1)for(let t=1;tB&&P>0||C+k1;)v-=C-B,C=f(u(v)),P--;return this.justifyWidth=t,this.evaluate()}evaluate(){if(!this.tickContexts)return 0;const t=this.tickContexts,e=this.justifyWidth;this.contextGaps={total:0,gaps:[]},t.list.forEach(((e,i)=>{if(0===i)return;const b=t.list[i-1],a=t.map[b],s=t.map[e],n=a.getMetrics(),l=s.getMetrics(),o=a.getX()+n.notePx+n.totalRightPx,r=s.getX()-l.totalLeftPx,h=r-o;this.contextGaps.total+=h,this.contextGaps.gaps.push({x1:o,x2:r}),s.getFormatterMetrics().freedom.left=h,a.getFormatterMetrics().freedom.right=h})),this.durationStats={};const i=this.durationStats;this.voices.forEach((t=>{t.getTickables().forEach(((t,b,a)=>{const s=t.getTicks().clone().simplify().toString(),n=t.getMetrics(),l=t.getFormatterMetrics(),o=t.getX()+n.notePx+n.modRightPx+n.rightDisplacedHeadPx;let r=0;if(b{t.getTickables().forEach((t=>{const e=t.getTicks().clone().simplify().toString(),a=t.getFormatterMetrics();a.space.mean=i[e].mean,a.duration=e,a.iterations+=1,a.space.deviation=a.space.used-a.space.mean,b+=Math.pow(a.space.deviation,2)}))})),this.totalCost=Math.sqrt(b),this.lossHistory.push(this.totalCost),this.totalCost}tune(t){var e;const i=this.tickContexts;if(!i)return 0;const b=null!==(e=null==t?void 0:t.alpha)&&void 0!==e?e:.5;let a=0;return this.totalShift=0,i.list.forEach(((t,e,s)=>{const n=i.map[t],l=e>0?i.map[s[e-1]]:void 0,o=et.getFormatterMetrics().space.deviation)));r>0?a=-Math.min(n.getFormatterMetrics().freedom.right,Math.abs(r)):r<0&&(a=o?Math.min(o.getFormatterMetrics().freedom.right,Math.abs(r)):0),a*=b,this.totalShift+=a})),this.evaluate()}postFormat(){const t=t=>t.list.forEach((e=>t.map[e].postFormat()));return this.modifierContexts&&t(this.modifierContexts),this.tickContexts&&t(this.tickContexts),this}joinVoices(t){return this.createModifierContexts(t),this.hasMinTotalWidth=!1,this}format(t,e,i){const b=Object.assign({align_rests:!1},i);this.voices=t;const a=this.formatterOptions.softmaxFactor;return a&&this.voices.forEach((t=>t.setSoftmaxFactor(a))),this.alignRests(t,b.align_rests),this.createTickContexts(t),this.preFormat(e,b.context,t,b.stave),b.stave&&this.postFormat(),this}formatToStave(t,e,i){const b=Object.assign({context:e.getContext()},i),a=e.getNoteEndX()-e.getNoteStartX()-pe.defaultPadding;return function(...t){we.DEBUG&&d("Vex.Flow.Formatter",t)}("Formatting voices to width: ",a),this.format(t,a,b)}getTickContext(t){var e;return null===(e=this.tickContexts)||void 0===e?void 0:e.map[t]}}var ve;we.DEBUG=!1,function(t){t[t.BOTTOM=-1]="BOTTOM",t[t.TOP=1]="TOP"}(ve||(ve={}));class De extends P{constructor(t,e={}){if(super(),this.numerator_glyphs=[],this.denom_glyphs=[],!t||!t.length)throw new h("BadArguments","No notes provided for tuplet.");this.options=e,this.notes=t,this.num_notes=null!=this.options.num_notes?this.options.num_notes:t.length,this.options.beats_occupied&&this.beatsOccupiedDeprecationWarning(),this.notes_occupied=this.options.notes_occupied||this.options.beats_occupied||2,null!=this.options.bracketed?this.bracketed=this.options.bracketed:this.bracketed=t.some((t=>!t.hasBeam())),this.ratioed=null!=this.options.ratioed?this.options.ratioed:Math.abs(this.notes_occupied-this.num_notes)>1,this.point=K.currentMusicFont().lookupMetric("digits.tupletPoint"),this.y_pos=16,this.x_pos=100,this.width=200,this.setTupletLocation(this.options.location||De.LOCATION_TOP),we.AlignRestsToNotes(t,!0,!0),this.resolveGlyphs(),this.attach()}static get CATEGORY(){return r.Tuplet}static get LOCATION_TOP(){return ve.TOP}static get LOCATION_BOTTOM(){return ve.BOTTOM}static get NESTING_OFFSET(){return 15}static get metrics(){return K.currentMusicFont().getMetrics().glyphs.tuplet}attach(){for(let t=0;t=1;)this.numerator_glyphs.unshift(new O("timeSig"+t%10,this.point)),t=parseInt((t/10).toString(),10);for(this.denom_glyphs=[],t=this.notes_occupied;t>=1;)this.denom_glyphs.unshift(new O("timeSig"+t%10,this.point)),t=parseInt((t/10).toString(),10)}getNestedTupletCount(){const t=this.location,e=this.notes[0];let i=a(e,t),b=a(e,t);function a(t,e){return t.getTupletStack().filter((t=>t.location===e)).length}return this.notes.forEach((e=>{const s=a(e,t);i=s>i?s:i,b=s0&&(b=Math.min(s,b))}}}else{let t=De.metrics.bottomLine;this.notes.forEach((e=>{const i=e.getModifierContext();i&&(t=Math.max(t,i.getState().text_line+1))})),b=i.checkStave().getYForLine(t)+De.metrics.noteHeadOffset;for(let t=0;tb&&(b=e)}}return b+t+e}draw(){const t=this.checkContext();this.setRendered();const e=this.notes[0],i=this.notes[this.notes.length-1];this.bracketed?(this.x_pos=e.getTieLeftX()-5,this.width=i.getTieRightX()-this.x_pos+5):(this.x_pos=e.getStemX(),this.width=i.getStemX()-this.x_pos),this.y_pos=this.getYPosition();const b=(t,e)=>t+m(e.getMetrics().width);let a=this.numerator_glyphs.reduce(b,0);this.ratioed&&(a=this.denom_glyphs.reduce(b,a),a+=.32*this.point);const s=this.x_pos+this.width/2-a/2;if(this.bracketed){const e=this.width/2-a/2-5;e>0&&(t.fillRect(this.x_pos,this.y_pos,e,1),t.fillRect(this.x_pos+this.width/2+a/2+5,this.y_pos,e,1),t.fillRect(this.x_pos,this.y_pos+(this.location===De.LOCATION_BOTTOM?1:0),1,10*this.location),t.fillRect(this.x_pos+this.width,this.y_pos+(this.location===De.LOCATION_BOTTOM?1:0),1,10*this.location))}const n=K.currentMusicFont().lookupMetric("digits.shiftY",0);let l=0;if(this.numerator_glyphs.forEach((e=>{e.render(t,s+l,this.y_pos+this.point/3-2+n),l+=m(e.getMetrics().width)})),this.ratioed){const e=s+l+.16*this.point,i=.06*this.point;t.beginPath(),t.arc(e,this.y_pos-.08*this.point,i,0,2*Math.PI,!0),t.closePath(),t.fill(),t.beginPath(),t.arc(e,this.y_pos+.12*this.point,i,0,2*Math.PI,!0),t.closePath(),t.fill(),l+=.32*this.point,this.denom_glyphs.forEach((e=>{e.render(t,s+l,this.y_pos+this.point/3-2+n),l+=m(e.getMetrics().width)}))}}}function Ce(t){let e=0;return t.forEach((t=>{t.keyProps&&t.keyProps.forEach((t=>{e+=t.line-3}))})),e>=0?J.DOWN:J.UP}const Ee="L",ke="B";class Be extends P{constructor(t,e=!1){if(super(),this.slope=0,this.y_shift=0,!t||0===t.length)throw new h("BadArguments","No notes provided for beam.");if(1===t.length)throw new h("BadArguments","Too few notes for beam.");if(this.ticks=t[0].getIntrinsicTicks(),this.ticks>=K.durationToTicks("4"))throw new h("BadArguments","Beams can only be applied to notes shorter than a quarter note.");let i,b;for(this.stem_direction=J.UP,i=0;it+e.getStemDirection()),0);a=e>-1?J.UP:J.DOWN}for(i=0;i(new u).parse(t)));{const e=parseInt(t.split("/")[0],10),i=parseInt(t.split("/")[1],10);if(e%3==0)return[new u(3,i)];if(i>4)return[new u(2,i)];if(i<=4)return[new u(1,i)]}return[new u(1,4)]}static applyAndGetBeams(t,e,i){return Be.generateBeams(t.getTickables(),{groups:i,stem_direction:e})}static generateBeams(t,e={}){e.groups&&e.groups.length||(e.groups=[new u(2,8)]);const i=e.groups.map((t=>{if(!t.multiply)throw new h("InvalidBeamGroups","The beam groups must be an array of Vex.Flow.Fractions");return t.clone().multiply(K.RESOLUTION,1)})),b=t;let a=0,s=[],n=[];function l(){i.length-1>a?a+=1:a=0}!function(){let t=[],e=new u(0,1);b.forEach((b=>{if(t=[],b.shouldIgnoreTicks())return s.push(n),void(n=t);n.push(b);const o=i[a].clone(),r=(h=n,h.reduce(((t,e)=>e.getTicks().clone().add(t)),new u(0,1))).add(e);var h;const c=K.durationToNumber(b.getDuration())<8;if(c&&b.getTuplet()&&(o.numerator*=2),r.greaterThan(o)){if(!c){const e=n.pop();e&&t.push(e)}s.push(n);do{e=r.subtract(i[a]),l()}while(e.greaterThanEquals(i[a]));n=t}else r.equals(o)&&(s.push(n),e=new u(0,1),n=t,l())})),n.length>0&&s.push(n)}(),function(){const t=[];s.forEach((i=>{let b=[];i.forEach(((i,a,s)=>{const n=0===a||a===s.length-1,l=s[a-1],o=!e.beam_rests&&i.isRest(),r=e.beam_rests&&e.beam_middle_only&&i.isRest()&&n;let h=!1;if(e.maintain_stem_directions&&l&&!i.isRest()&&!l.isRest()){const t=l.getStemDirection();h=i.getStemDirection()!==t}const c=parseInt(i.getDuration(),10)<8;o||r||h||c?(b.length>0&&t.push(b),b=h?[i]:[]):b.push(i)})),b.length>0&&t.push(b)})),s=t}(),s.forEach((t=>{let i;if(e.maintain_stem_directions){const e=function(t){for(let e=0;e{t.setStemDirection(e)}))}(t,i)}));const o=s.filter((t=>{if(t.length>1){let e=!0;return t.forEach((t=>{t.getIntrinsicTicks()>=K.durationToTicks("4")&&(e=!1)})),e}return!1})),r=function(){const t=[];return s.forEach((e=>{let i;e.forEach((e=>{const b=e.getTuplet();b&&i!==b&&(i=b,t.push(i))}))})),t}(),c=[];return o.forEach((t=>{const i=new Be(t);e.show_stemlets&&(i.render_options.show_stemlets=!0),e.secondary_breaks&&(i.render_options.secondary_break_ticks=K.durationToTicks(e.secondary_breaks)),!0===e.flat_beams&&(i.render_options.flat_beams=!0,i.render_options.flat_beam_offset=e.flat_beam_offset),c.push(i)})),r.forEach((t=>{const e=t.notes[0].stem_direction===J.DOWN?ve.BOTTOM:ve.TOP;t.setTupletLocation(e);let i=!1;for(let e=0;et.getGlyph().beam_count)).reduce(((t,e)=>e>t?e:t))}breakSecondaryAt(t){return this.break_on_indices=t,this}getSlopeY(t,e,i,b){return i+(t-e)*b}calculateSlope(){const{notes:t,stem_direction:e,render_options:{max_slope:i,min_slope:b,slope_iterations:a,slope_cost:s}}=this,n=t[0],l=function(t,e){const i=t.getStemExtents().topY,b=t.getStemX();return(e.getStemExtents().topY-i)/(e.getStemX()-b)}(n,t[t.length-1]),o=(i-b)/a;let r=Number.MAX_VALUE,h=0,c=0;for(let a=b;a<=i;a+=o){let i=0,b=0;for(let s=1;sa)&&(o=a,n=Math.min(...b.getYs()),l=b.getBeamCount())}let r=s/t.length;const h=b+l*(1.5*i),c=n+h*-e;e===J.DOWN&&rc&&(r=n-h),a?(e===J.DOWN&&r>a||e===J.UP&&r=8&&(h=-1!==this.break_on_indices.indexOf(o),this.render_options.secondary_break_ticks&&l>=this.render_options.secondary_break_ticks&&(l=0,h=!0));const c=r.getIntrinsicTicks(){const i=e.getStem();i&&i.setContext(t).draw()}),this)}drawBeamLines(t){const e=["4","8","16","32","64"],i=this.notes[0];let b=this.getBeamYToDraw();const a=i.getStemX(),s=this.render_options.beam_width*this.stem_direction;for(let i=0;i0||!0===e;return!e||a>0||(this.pos=b),n?this.matchSuccess():this.matchFail(b),{success:n,results:i,numMatches:a}}expectZeroOrMore(t){return this.expectOneOrMore(t,!0)}expect(t){if(Ne("Evaluating rule function:",t),!t)throw new h("Invalid rule function");let e;const i=t.bind(this.grammar)();if(i.token)e=this.matchToken(i.token,!0===i.noSpace),e.success&&(this.pos+=e.incrementPos);else{if(!i.expect)throw Ne(i),new h("Bad grammar! No `token` or `expect` property "+i);e=i.oneOrMore?this.expectOneOrMore(i):i.zeroOrMore?this.expectZeroOrMore(i):this.expectOne(i)}const b=[];return e.matches=b,e.results&&e.results.forEach((t=>b.push(Oe(t)))),i.run&&e.success&&i.run({matches:b}),e}}function Re(...t){Xe.DEBUG&&d("Vex.Flow.EasyScore",t)}ze.DEBUG=!1;class Le{constructor(t){this.builder=t}begin(){return this.LINE}LINE(){return{expect:[this.PIECE,this.PIECES,this.EOL]}}PIECE(){return{expect:[this.CHORDORNOTE,this.PARAMS],run:()=>this.builder.commitPiece()}}PIECES(){return{expect:[this.COMMA,this.PIECE],zeroOrMore:!0}}PARAMS(){return{expect:[this.DURATION,this.TYPE,this.DOTS,this.OPTS]}}CHORDORNOTE(){return{expect:[this.CHORD,this.SINGLENOTE],or:!0}}CHORD(){return{expect:[this.LPAREN,this.NOTES,this.RPAREN],run:t=>this.builder.addChord(t.matches[1])}}NOTES(){return{expect:[this.NOTE],oneOrMore:!0}}NOTE(){return{expect:[this.NOTENAME,this.ACCIDENTAL,this.OCTAVE]}}SINGLENOTE(){return{expect:[this.NOTENAME,this.ACCIDENTAL,this.OCTAVE],run:t=>{const e=t;this.builder.addSingleNote(e.matches[0],e.matches[1],e.matches[2])}}}ACCIDENTAL(){return{expect:[this.MICROTONES,this.ACCIDENTALS],maybe:!0,or:!0}}DOTS(){return{expect:[this.DOT],zeroOrMore:!0,run:t=>this.builder.setNoteDots(t.matches)}}TYPE(){return{expect:[this.SLASH,this.MAYBESLASH,this.TYPES],maybe:!0,run:t=>this.builder.setNoteType(t.matches[2])}}DURATION(){return{expect:[this.SLASH,this.DURATIONS],maybe:!0,run:t=>this.builder.setNoteDuration(t.matches[1])}}OPTS(){return{expect:[this.LBRACKET,this.KEYVAL,this.KEYVALS,this.RBRACKET],maybe:!0}}KEYVALS(){return{expect:[this.COMMA,this.KEYVAL],zeroOrMore:!0}}KEYVAL(){return{expect:[this.KEY,this.EQUALS,this.VAL],run:t=>this.builder.addNoteOption(t.matches[0],t.matches[2].slice(1,-1))}}VAL(){return{expect:[this.SVAL,this.DVAL],or:!0}}KEY(){return{token:"[a-zA-Z][a-zA-Z0-9]*"}}DVAL(){return{token:'["][^"]*["]'}}SVAL(){return{token:"['][^']*[']"}}NOTENAME(){return{token:"[a-gA-G]"}}OCTAVE(){return{token:"[0-9]+"}}ACCIDENTALS(){return{token:"bb|b|##|#|n"}}MICROTONES(){return{token:"bbs|bss|bs|db|d|\\+\\+-|\\+-|\\+\\+|\\+|k|o"}}DURATIONS(){return{token:"[0-9whq]+"}}TYPES(){return{token:"[rRsSmMhHgG]"}}LPAREN(){return{token:"[(]"}}RPAREN(){return{token:"[)]"}}COMMA(){return{token:"[,]"}}DOT(){return{token:"[.]"}}SLASH(){return{token:"[/]"}}MAYBESLASH(){return{token:"[/]?"}}EQUALS(){return{token:"[=]"}}LBRACKET(){return{token:"\\["}}RBRACKET(){return{token:"\\]"}}EOL(){return{token:"$"}}}class Ue{constructor(t){this.chord=[],this.dots=0,this.options={},this.duration=t}}class We{constructor(t){this.commitHooks=[],this.factory=t,this.reset()}reset(t){this.options=Object.assign({stem:"auto",clef:"treble"},t),this.elements={notes:[],accidentals:[]},this.rollingDuration="8",this.resetPiece()}getFactory(){return this.factory}getElements(){return this.elements}addCommitHook(t){this.commitHooks.push(t)}resetPiece(){Re("resetPiece"),this.piece=new Ue(this.rollingDuration)}setNoteDots(t){Re("setNoteDots:",t),t&&(this.piece.dots=t.length)}setNoteDuration(t){Re("setNoteDuration:",t),this.rollingDuration=this.piece.duration=t||this.rollingDuration}setNoteType(t){Re("setNoteType:",t),t&&(this.piece.type=t)}addNoteOption(t,e){Re("addNoteOption: key:",t,"value:",e),this.piece.options[t]=e}addNote(t,e,i){Re("addNote:",t,e,i),this.piece.chord.push({key:t,accid:e,octave:i})}addSingleNote(t,e,i){Re("addSingleNote:",t,e,i),this.addNote(t,e,i)}addChord(t){Re("startChord"),"object"!=typeof t[0]?this.addSingleNote(t[0]):t.forEach((t=>{t&&this.addNote(...t)})),Re("endChord")}commitPiece(){Re("commitPiece");const{factory:t}=this;if(!t)return;const e=Object.assign(Object.assign({},this.options),this.piece.options),i=m(e.stem,"BadArguments","options.stem is not defined").toLowerCase(),b=m(e.clef,"BadArguments","options.clef is not defined").toLowerCase(),{chord:a,duration:s,dots:n,type:l}=this.piece,o=R.accidentals,r=a.map((t=>{var e;return t.key+(o.includes(null!==(e=t.accid)&&void 0!==e?e:"")?t.accid:"")+"/"+t.octave})),h="auto"===i,c="g"==(null==l?void 0:l.toLowerCase())?t.GhostNote({duration:s,dots:n}):t.StaveNote({keys:r,duration:s,dots:n,type:l,clef:b,auto_stem:h});h||c.setStemDirection("up"===i?J.UP:J.DOWN);const d=[];a.forEach(((e,i)=>{const b=e.accid;if("string"==typeof b){const e=t.Accidental({type:b});c.addModifier(e,i),d.push(e)}else d.push(void 0)}));for(let t=0;tt(e,c,this))),this.elements.notes.push(c),this.elements.accidentals.push(d),this.resetPiece()}}function Ie(t,e){void 0!==t.id&&e.setAttribute("id",t.id)}const Ye=/\s*,\s*/;function Ge(t,e){void 0!==t.class&&t.class.split(Ye).forEach((t=>e.addClass(t)))}class Xe{constructor(t={}){this.defaults={clef:"treble",time:"4/4",stem:"auto"},this.setOptions(t)}set(t){return this.defaults=Object.assign(Object.assign({},this.defaults),t),this}setOptions(t){var e,i;const b=t.factory,a=null!==(e=t.builder)&&void 0!==e?e:new We(b);return this.options=Object.assign(Object.assign({commitHooks:[Ie,Ge,mt.easyScoreHook,Pt.easyScoreHook],throwOnError:!1},t),{factory:b,builder:a}),this.factory=b,this.builder=a,this.grammar=new Le(this.builder),this.parser=new ze(this.grammar),null===(i=this.options.commitHooks)||void 0===i||i.forEach((t=>this.addCommitHook(t))),this}setContext(t){return this.factory.setContext(t),this}parse(t,e={}){this.builder.reset(e);const i=this.parser.parse(t);if(!i.success&&this.options.throwOnError)throw Re(i),new h("Error parsing line: "+t);return i}beam(t,e){return this.factory.Beam({notes:t,options:e}),t}tuplet(t,e){return this.factory.Tuplet({notes:t,options:e}),t}notes(t,e={}){return e=Object.assign({clef:this.defaults.clef,stem:this.defaults.stem},e),this.parse(t,e),this.builder.getElements().notes}voice(t,e={}){return e=Object.assign({time:this.defaults.time},e),this.factory.Voice(e).addTickables(t)}addCommitHook(t){this.builder.addCommitHook(t)}}Xe.DEBUG=!1;const He="Ghost note must have valid initialization data to identify duration.";class je extends Wt{static get CATEGORY(){return r.GhostNote}constructor(t){if(!t)throw new h("BadArguments",He);let e;if("string"==typeof t)e={duration:t};else{if("object"!=typeof t)throw new h("BadArguments",He);e=t}super(e),this.setWidth(0)}isRest(){return!0}setStave(t){return super.setStave(t),this}addToModifierContext(t){return this}preFormat(){return this.preFormatted=!0,this}draw(){this.setRendered();for(let t=0;t=Ze.type.TEXT&&t<=Ze.type.MIXED&&(this.type=t),this}setCustomText(t,e){return this.custom_depress_text=t||"",this.custom_release_text=e||"",this}setLine(t){return this.line=t,this}drawBracketed(){const t=this.checkContext();let e,i,b=!1;this.notes.forEach(((a,s,n)=>{b=!b;const l=a.getAbsoluteX(),o=a.checkStave().getYForBottomText(this.line+3);if(l{e=!e;const b=i.checkStave(),a=i.getAbsoluteX(),s=b.getYForBottomText(this.line+3),n=K.currentMusicFont().lookupMetric(`pedalMarking.${e?"down":"up"}.point`);let l=0;e?this.custom_depress_text?(l=t.measureText(this.custom_depress_text).width,t.fillText(this.custom_depress_text,a-l/2,s)):Je("pedal_depress",t,a,s,n):this.custom_release_text?(l=t.measureText(this.custom_release_text).width,t.fillText(this.custom_release_text,a-l/2,s)):Je("pedal_release",t,a,s,n)}))}draw(){const t=this.checkContext();this.setRendered(),t.save(),t.setStrokeStyle(this.render_options.color),t.setFillStyle(this.render_options.color),t.setFont(this.textFont),function(...t){Ze.DEBUG&&d("Vex.Flow.PedalMarking",t)}("Rendering Pedal Marking"),this.type===Ze.type.BRACKET||this.type===Ze.type.MIXED?(t.setLineWidth(this.render_options.bracket_line_width),this.drawBracketed()):this.type===Ze.type.TEXT&&this.drawText(),t.restore()}}Ze.DEBUG=!1,Ze.TEXT_FONT={family:E.SERIF,size:12,weight:T.BOLD,style:w.ITALIC},Ze.GLYPHS={pedal_depress:{code:"keyboardPedalPed",x_shift:-10,y_shift:0},pedal_release:{code:"keyboardPedalUp",x_shift:-2,y_shift:3}},Ze.type={TEXT:1,BRACKET:2,MIXED:3},Ze.typeString={text:Ze.type.TEXT,bracket:Ze.type.BRACKET,mixed:Ze.type.MIXED};const ti={1:"repeat1Bar",2:"repeat2Bars",4:"repeat4Bars",slash:"repeatBarSlash"};class ei extends Ve{static get CATEGORY(){return r.RepeatNote}constructor(t,e,i){super(void 0,Object.assign({duration:"q",align_center:"slash"!==t},e),i);const b=new O(ti[t]||"repeat1Bar",K.currentMusicFont().lookupMetric("repeatNote.point",40),{category:"repeatNote"});this.setGlyph(b)}}function ii(t,e,i,b,a,s,n){t.beginPath(),t.moveTo(e,i),t.lineTo(b,a),t.lineTo(s,n),t.lineTo(e,i),t.closePath(),t.fill()}class bi extends P{constructor(t){super(),this.setNotes(t),this.text="",this.resetFont(),this.render_options={padding_left:4,padding_right:3,line_width:1,line_dash:void 0,rounded_end:!0,color:void 0,draw_start_arrow:!1,draw_end_arrow:!1,arrowhead_length:10,arrowhead_angle:Math.PI/8,text_position_vertical:bi.TextVerticalPosition.TOP,text_justification:bi.TextJustification.CENTER}}static get CATEGORY(){return r.StaveLine}setText(t){return this.text=t,this}setNotes(t){if(!t.first_note&&!t.last_note)throw new h("BadArguments","Notes needs to have either first_note or last_note set.");if(t.first_indices||(t.first_indices=[0]),t.last_indices||(t.last_indices=[0]),t.first_indices.length!==t.last_indices.length)throw new h("BadArguments","Connected notes must have same number of indices.");return this.notes=t,this.first_note=t.first_note,this.first_indices=t.first_indices,this.last_note=t.last_note,this.last_indices=t.last_indices,this}applyLineStyle(){const t=this.checkContext(),e=this.render_options;e.line_dash&&t.setLineDash(e.line_dash),e.line_width&&t.setLineWidth(e.line_width),e.rounded_end?t.setLineCap("round"):t.setLineCap("square")}applyFontStyle(){const t=this.checkContext();t.setFont(this.textFont);const e=this.render_options.color;e&&(t.setStrokeStyle(e),t.setFillStyle(e))}drawArrowLine(t,e,i){const b=this.render_options.draw_start_arrow&&this.render_options.draw_end_arrow,a=e.x,s=e.y,n=i.x,l=i.y,o=Math.sqrt((n-a)*(n-a)+(l-s)*(l-s)),r=(o-this.render_options.arrowhead_length/3)/o;let h,c,m,d;this.render_options.draw_end_arrow||b?(h=Math.round(a+(n-a)*r),c=Math.round(s+(l-s)*r)):(h=n,c=l),this.render_options.draw_start_arrow||b?(m=a+(n-a)*(1-r),d=s+(l-s)*(1-r)):(m=a,d=s),this.render_options.color&&(t.setStrokeStyle(this.render_options.color),t.setFillStyle(this.render_options.color)),t.beginPath(),t.moveTo(m,d),t.lineTo(h,c),t.stroke(),t.closePath();const _=Math.atan2(l-s,n-a),x=Math.abs(this.render_options.arrowhead_length/Math.cos(this.render_options.arrowhead_angle));let g,p,u,f,y,S;(this.render_options.draw_end_arrow||b)&&(g=_+Math.PI+this.render_options.arrowhead_angle,u=n+Math.cos(g)*x,f=l+Math.sin(g)*x,p=_+Math.PI-this.render_options.arrowhead_angle,y=n+Math.cos(p)*x,S=l+Math.sin(p)*x,ii(t,u,f,n,l,y,S)),(this.render_options.draw_start_arrow||b)&&(g=_+this.render_options.arrowhead_angle,u=a+Math.cos(g)*x,f=s+Math.sin(g)*x,p=_-this.render_options.arrowhead_angle,y=a+Math.cos(p)*x,S=s+Math.sin(p)*x,ii(t,u,f,a,s,y,S))}draw(){const t=this.checkContext();this.setRendered();const e=this.first_note,i=this.last_note,b=this.render_options;t.save(),this.applyLineStyle();let a={x:0,y:0},s={x:0,y:0};this.first_indices.forEach(((n,l)=>{const o=this.last_indices[l];a=e.getModifierStartXY(2,n),s=i.getModifierStartXY(1,o);const r=a.y>s.y;a.x+=e.getMetrics().modRightPx+b.padding_left,s.x-=i.getMetrics().modLeftPx+b.padding_right;const h=e.getGlyph().getWidth();e.getKeyProps()[n].displaced&&1===e.getStemDirection()&&(a.x+=h+b.padding_left);i.getKeyProps()[o].displaced&&-1===i.getStemDirection()&&(s.x-=h+b.padding_right),a.y+=r?-3:1,s.y+=r?2:0,this.drawArrowLine(t,a,s)})),t.restore();const n=t.measureText(this.text).width,l=b.text_justification;let o=0;if(l===bi.TextJustification.LEFT)o=a.x;else if(l===bi.TextJustification.CENTER){o=(s.x-a.x)/2+a.x-n/2}else l===bi.TextJustification.RIGHT&&(o=s.x-n);let r=0;const h=b.text_position_vertical;return h===bi.TextVerticalPosition.TOP?r=e.checkStave().getYForTopText():h===bi.TextVerticalPosition.BOTTOM&&(r=e.checkStave().getYForBottomText(K.TEXT_HEIGHT_OFFSET_HACK)),t.save(),this.applyFontStyle(),t.fillText(this.text,o,r),t.restore(),this}}bi.TEXT_FONT=Object.assign({},P.TEXT_FONT),bi.TextVerticalPosition={TOP:1,BOTTOM:2},bi.TextJustification={LEFT:1,CENTER:2,RIGHT:3};class ai extends P{constructor(t={}){super(),this.setOptions(t),this.parts=[]}static get CATEGORY(){return r.System}setOptions(t={}){if(!t.factory)throw new h("NoFactory","System.setOptions(options) requires a factory.");this.factory=t.factory,this.options=Object.assign(Object.assign({factory:this.factory,x:10,y:10,width:500,spaceBetweenStaves:12,autoWidth:!1,noJustification:!1,debugFormatter:!1,formatIterations:0,noPadding:!1},t),{details:Object.assign({alpha:.5},t.details),formatOptions:Object.assign({},t.formatOptions)}),!1===this.options.noJustification&&void 0===t.width&&(this.options.autoWidth=!0)}setContext(t){return super.setContext(t),this.factory.setContext(t),this}addConnector(t="double"){return this.connector=this.factory.StaveConnector({top_stave:this.parts[0].stave,bottom_stave:this.parts[this.parts.length-1].stave,type:t}),this.connector}addStave(t){var e;const i=Object.assign({left_bar:!1},t.options),b=null!==(e=t.stave)&&void 0!==e?e:this.factory.Stave({x:this.options.x,y:this.options.y,width:this.options.width,options:i}),a=Object.assign(Object.assign({stave:b,spaceAbove:0,spaceBelow:0,debugNoteMetrics:!1,noJustification:!1},t),{options:i}),s=this.getContext();return a.voices.forEach((t=>t.setContext(s).setStave(b).getTickables().forEach((t=>t.setStave(b))))),this.parts.push(a),b}format(){const t=this.options.details;let e=0;const i=new we(t);this.formatter=i;let b=this.options.y,a=0,s=[];const n=[];this.parts.forEach((t=>{b+=t.stave.space(t.spaceAbove),t.stave.setY(b),this.options.autoWidth?t.voices.forEach((t=>{i.joinVoices([t])})):i.joinVoices(t.voices),b+=t.stave.space(t.spaceBelow),b+=t.stave.space(this.options.spaceBetweenStaves),t.debugNoteMetrics&&(n.push({y:b,voice:t.voices[0]}),b+=15),s=s.concat(t.voices),a=Math.max(a,t.stave.getNoteStartX())})),this.parts.forEach((t=>t.stave.setNoteStartX(a))),this.options.autoWidth?(e=i.preCalculateMinTotalWidth(s),this.parts.forEach((t=>{t.stave.setWidth(e+pe.rightPadding+(a-this.options.x))}))):e=this.options.noPadding?this.options.width-this.options.x:this.options.width-(a-this.options.x)-pe.defaultPadding,i.format(s,this.options.noJustification?0:e,this.options.formatOptions);for(let e=0;e{e.voice.getTickables().forEach((i=>xt.plotMetrics(t,i,e.y)))}))}}class si extends Wt{constructor(t,e=!1){super(t),this.glyphs=[],this.greatestString=()=>this.positions.map((t=>t.str)).reduce(((t,e)=>t>e?t:e)),this.leastString=()=>this.positions.map((t=>t.str)).reduce(((t,e)=>tthis.width}setStave(t){super.setStave(t);const e=t.getContext();if(this.setContext(e),e){this.width=0;for(let t=0;ti.width),this.width=Math.max(i.getWidth(),this.width)}this.glyph.getWidth=()=>this.width}const i=this.positions.map((({str:e})=>t.getYForLine(Number(e)-1)));return this.setYs(i),this.stem&&this.stem.setYBounds(this.getStemY(),this.getStemY()),this}getPositions(){return this.positions}getModifierStartXY(t,e){if(!this.preFormatted)throw new h("UnformattedNote","Can't call GetModifierStartXY on an unformatted note");if(0===this.ys.length)throw new h("NoYValues","No Y-Values calculated for this note.");let i=0;if(t===z.Position.LEFT)i=-2;else if(t===z.Position.RIGHT)i=this.width+2;else if(t===z.Position.BELOW||t===z.Position.ABOVE){i=this.glyph.getWidth()/2}return{x:this.getAbsoluteX()+i,y:this.ys[e]}}getLineForRest(){return Number(this.positions[0].str)}preFormat(){this.preFormatted||(this.modifierContext&&this.modifierContext.preFormat(),this.preFormatted=!0)}getStemX(){return this.getCenterGlyphX()}getStemY(){const t=this.checkStave().getNumLines()-.5,e=J.UP===this.stem_direction?-.5:t;return this.checkStave().getYForLine(e)}getStemExtents(){return this.checkStem().getExtents()}drawFlag(){const{beam:t,glyph:e,stem_direction:i,render_options:{draw_stem:b,glyph_font_scale:a}}=this,s=this.checkContext(),n=null==t&&b;if(e.flag&&n){const t=this.getStemX()+1,b=this.getStemY()-this.checkStem().getHeight(),n=i===J.DOWN?e.code_flag_downstem:e.code_flag_upstem;O.renderGlyph(s,t,b,a,n,{category:"flag.tabStem"})}}drawModifiers(){this.modifiers.forEach((t=>{i(t,r.Dot)&&!this.render_options.draw_dots||(t.setContext(this.getContext()),t.drawWithStyle())}))}drawStemThrough(){const t=this.getStemX(),e=this.getStemY(),i=this.checkContext(),b=this.render_options.draw_stem,a=this.render_options.draw_stem_through_stave;if(b&&a){const b=function(t,e,i,b){const a=1!==b,s=-1!==b,n=i.getSpacingBetweenLines(),l=i.getNumLines(),o=[];return e.forEach((e=>{const r=e.indexOf(l)>-1,h=e.indexOf(1)>-1;if(a&&h||s&&r)return;1===e.length&&e.push(e[0]);const c=[];e.forEach(((e,a,s)=>{const o=1===e,r=e===l;let h=i.getYForLine(e-1);0!==a||o?a!==s.length-1||r||(h+=n/2-1):h-=n/2-1,c.push(h),1===b&&o?c.push(t-2):-1===b&&r&&c.push(t+2)})),o.push(c.sort(((t,e)=>t-e)))})),o}(e,function(t,e){const i=[];let b=[];for(let a=1;a<=t;a++)e.indexOf(a)>-1?(i.push(b),b=[]):b.push(a);return b.length>0&&i.push(b),i}(this.checkStave().getNumLines(),this.positions.map((t=>Number(t.str)))),this.checkStave(),this.getStemDirection());i.save(),i.setLineWidth(J.WIDTH),b.forEach((e=>{0!==e.length&&(i.beginPath(),i.moveTo(t,e[0]),i.lineTo(t,e[e.length-1]),i.stroke(),i.closePath())})),i.restore()}}drawPositions(){const t=this.checkContext(),e=this.getAbsoluteX(),i=this.ys;for(let b=0;b{const i=ci.GLYPHS[e];if(!i)throw new h("Invalid dynamics character: "+e);const b=m(this.render_options.glyph_font_size),a=new O(i.code,b,{category:"textNote"});this.glyphs.push(a),t+=i.width})),this.setWidth(t),this.preFormatted=!0,this}draw(){this.setRendered();const t=this.getAbsoluteX(),e=this.checkStave().getYForLine(this.line+-3);hi("Rendering Dynamics: ",this.sequence);let i=t;this.glyphs.forEach(((t,b)=>{const a=this.sequence[b];t.render(this.checkContext(),i,e),i+=ci.GLYPHS[a].width}))}}ci.DEBUG=!1;class mi extends xt{constructor(t,e){super({duration:"b"});const i=new _e(t,e);this.timeSigInfo=i.getInfo(),this.setWidth(this.timeSigInfo.glyph.getMetrics().width),this.ignore_ticks=!0}static get CATEGORY(){return r.TimeSigNote}addToModifierContext(t){return this}preFormat(){return this.preFormatted=!0,this}draw(){const t=this.checkStave(),e=this.checkContext();this.setRendered(),this.timeSigInfo.glyph.getContext()||this.timeSigInfo.glyph.setContext(e),this.timeSigInfo.glyph.setStave(t),this.timeSigInfo.glyph.setYShift(t.getYForLine(2)-t.getYForGlyphs()),this.timeSigInfo.glyph.renderToStave(this.getAbsoluteX())}}class di extends P{constructor(t){super(),t.start&&(this.start=t.start),t.stop&&(this.stop=t.stop),this.line=1,this.render_options={harsh:!1,wave_height:6,wave_width:4,wave_girth:2,vibrato_width:0}}static get CATEGORY(){return r.VibratoBracket}setLine(t){return this.line=t,this}setHarsh(t){return this.render_options.harsh=t,this}draw(){const t=this.checkContext();this.setRendered();const e=this.start&&this.start.checkStave().getYForTopText(this.line)||this.stop&&this.stop.checkStave().getYForTopText(this.line)||0,i=this.start&&this.start.getAbsoluteX()||this.stop&&this.stop.checkStave().getTieStartX()||0,b=this.stop&&this.stop.getAbsoluteX()-this.stop.getWidth()-5||this.start&&this.start.checkStave().getTieEndX()-10||0;this.render_options.vibrato_width=b-i,function(...t){di.DEBUG&&d("Vex.Flow.VibratoBracket",t)}("Rendering VibratoBracket: start_x:",i,"stop_x:",b,"y:",e),ie.renderVibrato(t,i,e,this.render_options)}}function _i(...t){xi.DEBUG&&d("Vex.Flow.Factory",t)}di.DEBUG=!1;class xi{constructor(t={}){_i("New factory: ",t),this.options={stave:{space:10},renderer:{elementId:"",width:500,height:200,background:"#FFF"},font:xi.TEXT_FONT},this.setOptions(t)}static newFromElementId(t,e=500,i=200){return new xi({renderer:{elementId:t,width:e,height:i}})}reset(){this.renderQ=[],this.systems=[],this.staves=[],this.voices=[],this.stave=void 0}setOptions(t){this.options=Object.assign(Object.assign({},this.options),t),this.initRenderer(),this.reset()}initRenderer(){const{elementId:t,width:e,height:i,background:b}=this.options.renderer;if(null==t)return;if(""==t)throw _i(this),new h("renderer.elementId not set in FactoryOptions");let a=this.options.renderer.backend;if(void 0===a){a=Gt(document.getElementById(t))?Zt.Backends.CANVAS:Zt.Backends.SVG}this.context=Zt.buildContext(t,a,e,i,b)}getContext(){return this.context}setContext(t){return this.context=t,this}getStave(){return this.stave}getVoices(){return this.voices}Stave(t){const e=this.options.stave.space,i=Object.assign({x:0,y:0,width:this.options.renderer.width-1*e,options:{spacing_between_lines_px:1*e}},t),b=new pe(i.x,i.y,i.width,i.options);return this.staves.push(b),b.setContext(this.context),this.stave=b,b}TabStave(t){const e=this.options.stave.space,i=Object.assign({x:0,y:0,width:this.options.renderer.width-1*e,options:{spacing_between_lines_px:1.3*e}},t),b=new ni(i.x,i.y,i.width,i.options);return this.staves.push(b),b.setContext(this.context),this.stave=b,b}StaveNote(t){const e=new Yt(t);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}GlyphNote(t,e,i){const b=new Ve(t,e,i);return this.stave&&b.setStave(this.stave),b.setContext(this.context),this.renderQ.push(b),b}RepeatNote(t,e,i){const b=new ei(t,e,i);return this.stave&&b.setStave(this.stave),b.setContext(this.context),this.renderQ.push(b),b}GhostNote(t){const e=new je(t);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}TextNote(t){const e=new he(t);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}BarNote(t={}){const e=new Dt(t.type);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}ClefNote(t){const e=Object.assign({type:"treble",options:{size:"default",annotation:void 0}},t),i=new Pe(e.type,e.options.size,e.options.annotation);return this.stave&&i.setStave(this.stave),i.setContext(this.context),this.renderQ.push(i),i}TimeSigNote(t){const e=Object.assign({time:"4/4"},t),i=new mi(e.time);return this.stave&&i.setStave(this.stave),i.setContext(this.context),this.renderQ.push(i),i}KeySigNote(t){const e=new $e(t.key,t.cancelKey,t.alterKey);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}TabNote(t){const e=new si(t);return this.stave&&e.setStave(this.stave),e.setContext(this.context),this.renderQ.push(e),e}GraceNote(t){const e=new Ke(t);return this.stave&&e.setStave(this.stave),e.setContext(this.context),e}GraceNoteGroup(t){const e=new Nt(t.notes,t.slur);return e.setContext(this.context),e}Accidental(t){const e=new Q(t.type);return e.setContext(this.context),e}Annotation(t){const e=Object.assign({text:"p",hJustify:bt.CENTER,vJustify:at.BOTTOM},t),i=new st(e.text);return i.setJustification(e.hJustify),i.setVerticalJustification(e.vJustify),i.setFont(e.font),i.setContext(this.context),i}ChordSymbol(t){const e=Object.assign({vJustify:"top",hJustify:"center",kerning:!0,reportWidth:!0},t),i=new kt;return i.setHorizontal(e.hJustify),i.setVertical(e.vJustify),i.setEnableKerning(e.kerning),i.setReportWidth(e.reportWidth),"string"==typeof e.fontFamily&&"number"==typeof e.fontSize?"string"==typeof e.fontWeight?i.setFont(e.fontFamily,e.fontSize,e.fontWeight):i.setFont(e.fontFamily,e.fontSize,""):"number"==typeof e.fontSize&&i.setFontSize(e.fontSize),i.setContext(this.context),i}Articulation(t){const e=Object.assign({type:"a.",position:"above"},t),i=new mt(e.type);return i.setPosition(e.position),i.setContext(this.context),i}TextDynamics(t){const e=Object.assign({text:"p",duration:"q",dots:0,line:0},t),i=new ci({text:e.text,line:e.line,duration:e.duration,dots:e.dots});return this.stave&&i.setStave(this.stave),i.setContext(this.context),this.renderQ.push(i),i}Fingering(t){const e=Object.assign({number:"0",position:"left"},t),i=new Pt(e.number);return i.setPosition(e.position),i.setContext(this.context),i}StringNumber(t){const e=new te(t.number);return e.setPosition(t.position),e.setContext(this.context),e}TickContext(){return new zt}ModifierContext(){return new ae}MultiMeasureRest(t){const e=m(t.number_of_measures,"NoNumberOfMeasures"),i=new Qe(e,t);return i.setContext(this.context),this.renderQ.push(i),i}Voice(t){const e=Object.assign({time:"4/4"},t),i=new Mt(e.time,e.options);return this.voices.push(i),i}StaveConnector(t){const e=new fe(t.top_stave,t.bottom_stave);return e.setType(t.type).setContext(this.context),this.renderQ.push(e),e}Formatter(t){return new we(t)}Tuplet(t){const e=Object.assign({notes:[],options:{}},t),i=new De(e.notes,e.options).setContext(this.context);return this.renderQ.push(i),i}Beam(t){var e,i,b;const a=new Be(t.notes,null===(e=t.options)||void 0===e?void 0:e.autoStem).setContext(this.context);return a.breakSecondaryAt(null!==(b=null===(i=t.options)||void 0===i?void 0:i.secondaryBeamBreaks)&&void 0!==b?b:[]),this.renderQ.push(a),a}Curve(t){const e=new Me(t.from,t.to,t.options).setContext(this.context);return this.renderQ.push(e),e}StaveTie(t){var e;const i=new Ft({first_note:t.from,last_note:t.to,first_indices:t.first_indices,last_indices:t.last_indices},t.text);return(null===(e=t.options)||void 0===e?void 0:e.direction)&&i.setDirection(t.options.direction),i.setContext(this.context),this.renderQ.push(i),i}StaveLine(t){var e,i;const b=new bi({first_note:t.from,last_note:t.to,first_indices:t.first_indices,last_indices:t.last_indices});return(null===(e=t.options)||void 0===e?void 0:e.text)&&b.setText(t.options.text),(null===(i=t.options)||void 0===i?void 0:i.font)&&b.setFont(t.options.font),b.setContext(this.context),this.renderQ.push(b),b}VibratoBracket(t){const e=new di({start:t.from,stop:t.to});return t.options.line&&e.setLine(t.options.line),t.options.harsh&&e.setHarsh(t.options.harsh),e.setContext(this.context),this.renderQ.push(e),e}TextBracket(t){const e=new ri({start:t.from,stop:t.to,text:t.text,superscript:t.options.superscript,position:t.options.position});return t.options.line&&e.setLine(t.options.line),t.options.font&&e.setFont(t.options.font),e.setContext(this.context),this.renderQ.push(e),e}System(t={}){t.factory=this;const e=new ai(t).setContext(this.context);return this.systems.push(e),e}EasyScore(t={}){return t.factory=this,new Xe(t)}PedalMarking(t){const e=Object.assign({notes:[],options:{style:"mixed"}},t),i=new Ze(e.notes);return i.setType(Ze.typeString[e.options.style]),i.setContext(this.context),this.renderQ.push(i),i}NoteSubGroup(t){const e=Object.assign({notes:[]},t),i=new Ot(e.notes);return i.setContext(this.context),i}draw(){const t=this.context;this.systems.forEach((e=>e.setContext(t).format())),this.staves.forEach((e=>e.setContext(t).draw())),this.voices.forEach((e=>e.setContext(t).draw())),this.renderQ.forEach((e=>{e.isRendered()||e.setContext(t).draw()})),this.systems.forEach((e=>e.setContext(t).draw())),this.reset()}}xi.DEBUG=!1,xi.TEXT_FONT=Object.assign({},P.TEXT_FONT);class gi extends P{constructor(t,e){super(),this.setNotes(t),this.hairpin=e,this.position=z.Position.BELOW,this.render_options={height:10,y_shift:0,left_shift_px:0,right_shift_px:0,right_shift_ticks:0,left_shift_ticks:0}}static get CATEGORY(){return r.StaveHairpin}static FormatByTicksAndDraw(t,e,i,b,a,s){var n,l;const o=e.pixelsPerTick;if(null==o)throw new h("BadArguments","A valid Formatter must be provide to draw offsets by ticks.");const r=o*(null!==(n=s.left_shift_ticks)&&void 0!==n?n:0),c=o*(null!==(l=s.right_shift_ticks)&&void 0!==l?l:0),m={height:s.height,y_shift:s.y_shift,left_shift_px:r,right_shift_px:c,right_shift_ticks:0,left_shift_ticks:0};new gi({first_note:i.first_note,last_note:i.last_note},b).setContext(t).setRenderOptions(m).setPosition(a).draw()}setPosition(t){return t!==z.Position.ABOVE&&t!==z.Position.BELOW||(this.position=t),this}setRenderOptions(t){return null!=t.height&&null!=t.y_shift&&null!=t.left_shift_px&&null!=t.right_shift_px&&(this.render_options=t),this}setNotes(t){if(!t.first_note&&!t.last_note)throw new h("BadArguments","Hairpin needs to have either first_note or last_note set.");return this.notes=t,this.first_note=t.first_note,this.last_note=t.last_note,this}renderHairpin(t){const e=this.checkContext();let i=this.render_options.y_shift+20,b=t.first_y;this.position===z.Position.ABOVE&&(i=30-i,b=t.first_y-t.staff_height);const a=this.render_options.left_shift_px,s=this.render_options.right_shift_px;switch(e.beginPath(),this.hairpin){case gi.type.CRESC:e.moveTo(t.last_x+s,b+i),e.lineTo(t.first_x+a,b+this.render_options.height/2+i),e.lineTo(t.last_x+s,b+this.render_options.height+i);break;case gi.type.DECRESC:e.moveTo(t.first_x+a,b+i),e.lineTo(t.last_x+s,b+this.render_options.height/2+i),e.lineTo(t.first_x+a,b+this.render_options.height+i)}e.stroke(),e.closePath()}draw(){this.checkContext(),this.setRendered();const t=this.first_note,e=this.last_note;if(!t||!e)throw new h("NoNote","Notes required to draw");const i=t.getModifierStartXY(this.position,0),b=e.getModifierStartXY(this.position,0);this.renderHairpin({first_x:i.x,last_x:b.x,first_y:t.checkStave().getY()+t.checkStave().getHeight(),last_y:e.checkStave().getY()+e.checkStave().getHeight(),staff_height:t.checkStave().getHeight()})}}gi.type={CRESC:1,DECRESC:2};class pi extends At{constructor(t,e){if(super(t,"sl."),!e){let i=t.first_note.getPositions()[0].fret;"string"==typeof i&&(i=parseInt(i,10));let b=t.last_note.getPositions()[0].fret;"string"==typeof b&&(b=parseInt(b,10)),e=isNaN(i)||isNaN(b)?pi.SLIDE_UP:i>b?pi.SLIDE_DOWN:pi.SLIDE_UP}this.direction=e,this.render_options.cp1=11,this.render_options.cp2=14,this.render_options.y_shift=.5,this.resetFont()}static get CATEGORY(){return r.TabSlide}static get SLIDE_UP(){return 1}static get SLIDE_DOWN(){return-1}static createSlideUp(t){return new pi(t,pi.SLIDE_UP)}static createSlideDown(t){return new pi(t,pi.SLIDE_DOWN)}renderTie(t){if(0===t.first_ys.length||0===t.last_ys.length)throw new h("BadArguments","No Y-values to render");const e=this.checkContext(),i=t.first_x_px,b=t.first_ys,a=t.last_x_px,s=t.direction;if(s!==pi.SLIDE_UP&&s!==pi.SLIDE_DOWN)throw new h("BadSlide","Invalid slide direction");const n=this.notes.first_indices;for(let t=0;tthis.tuningValues.length)throw new h("BadArguments",`String number must be between 1 and ${this.tuningValues.length}:${t}`);return this.tuningValues[e-1]}getValueForFret(t,e){const i=this.getValueForString(e),b=Number(t);if(b<0)throw new h("BadArguments",`Fret number must be 0 or higher: ${t}`);return i+b}getNoteForFret(t,e){const i=this.getValueForFret(t,e),b=Math.floor(i/12),a=i%12;return`${K.integerToNote(a)}/${b}`}}var fi=function(t,e,i,b){return new(i||(i=Promise))((function(a,s){function n(t){try{o(b.next(t))}catch(t){s(t)}}function l(t){try{o(b.throw(t))}catch(t){s(t)}}function o(t){var e;t.done?a(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(n,l)}o((b=b.apply(t,e||[])).next())}))};class yi{static get BUILD(){return{VERSION:"4.0.1-alpha.2",ID:"0df10df6d1fab3a99f5aa306341a31c6e686d659",DATE:"2022-02-02T09:30:30.784Z"}}static get Flow(){return yi}static setMusicFont(...t){const e=t.map((t=>E.load(t)));return K.MUSIC_FONT_STACK=e,O.MUSIC_FONT_STACK=e.slice(),O.CURRENT_CACHE_KEY=t.join(","),e}static fetchMusicFont(t,e){return fi(this,void 0,void 0,(function*(){}))}static getMusicFont(){return K.MUSIC_FONT_STACK.map((t=>t.getName()))}static get NOTATION_FONT_SCALE(){return K.NOTATION_FONT_SCALE}static set NOTATION_FONT_SCALE(t){K.NOTATION_FONT_SCALE=t}static get TABLATURE_FONT_SCALE(){return K.TABLATURE_FONT_SCALE}static set TABLATURE_FONT_SCALE(t){K.TABLATURE_FONT_SCALE=t}static get RESOLUTION(){return K.RESOLUTION}static set RESOLUTION(t){K.RESOLUTION=t}static get SLASH_NOTEHEAD_WIDTH(){return K.SLASH_NOTEHEAD_WIDTH}static set SLASH_NOTEHEAD_WIDTH(t){K.SLASH_NOTEHEAD_WIDTH=t}static get STAVE_LINE_DISTANCE(){return K.STAVE_LINE_DISTANCE}static set STAVE_LINE_DISTANCE(t){K.STAVE_LINE_DISTANCE=t}static get STAVE_LINE_THICKNESS(){return K.STAVE_LINE_THICKNESS}static set STAVE_LINE_THICKNESS(t){K.STAVE_LINE_THICKNESS=t}static get STEM_HEIGHT(){return K.STEM_HEIGHT}static set STEM_HEIGHT(t){K.STEM_HEIGHT=t}static get STEM_WIDTH(){return K.STEM_WIDTH}static set STEM_WIDTH(t){K.STEM_WIDTH=t}static get TIME4_4(){return K.TIME4_4}static get accidentalMap(){return K.accidentalMap}static get unicode(){return K.unicode}static keySignature(t){return K.keySignature(t)}static hasKeySignature(t){return K.hasKeySignature(t)}static getKeySignatures(){return K.getKeySignatures()}static clefProperties(t){return K.clefProperties(t)}static keyProperties(t,e,i){return K.keyProperties(t,e,i)}static durationToTicks(t){return K.durationToTicks(t)}}yi.Accidental=Q,yi.Annotation=st,yi.Articulation=mt,yi.Barline=vt,yi.BarNote=Dt,yi.Beam=Be,yi.Bend=Ct,yi.BoundingBox=y,yi.BoundingBoxComputation=S,yi.CanvasContext=Xt,yi.ChordSymbol=kt,yi.Clef=se,yi.ClefNote=Pe,yi.Crescendo=Fe,yi.Curve=Me,yi.Dot=Bt,yi.EasyScore=Xe,yi.Element=P,yi.Factory=xi,yi.Font=E,yi.Formatter=we,yi.Fraction=u,yi.FretHandFinger=Pt,yi.GhostNote=je,yi.Glyph=O,yi.GlyphNote=Ve,yi.GraceNote=Ke,yi.GraceNoteGroup=Nt,yi.GraceTabNote=class extends si{static get CATEGORY(){return r.GraceTabNote}constructor(t){super(t,!1),this.render_options=Object.assign(Object.assign({},this.render_options),{y_shift:.3,scale:.6,font:`7.5pt ${E.SANS_SERIF}`}),this.updateWidth()}},yi.KeyManager=class{constructor(t){this.music=new R,this.setKey(t)}setKey(t){return this.key=t,this.reset(),this}getKey(){return this.key}reset(){this.keyParts=this.music.getKeyParts(this.key),this.keyString=this.keyParts.root,this.keyParts.accidental&&(this.keyString+=this.keyParts.accidental);if(!R.scaleTypes[this.keyParts.type])throw new h("BadArguments",`Unsupported key type: ${this.key}`);this.scale=this.music.getScaleTones(this.music.getNoteValue(this.keyString),R.scaleTypes[this.keyParts.type]),this.scaleMap={},this.scaleMapByValue={},this.originalScaleMapByValue={};const t=R.root_indices[this.keyParts.root];for(let e=0;e1){const b=[];let a;t.sort(e);for(let e=0;e":{x_min:35,x_max:421,y_min:28,y_max:632,ha:604,leftSideBearing:35,advanceWidth:466},"?":{x_min:45,x_max:548,y_min:-17,y_max:767,ha:784,leftSideBearing:45,advanceWidth:592},"@":{x_min:51,x_max:730,y_min:-78,y_max:753,ha:831,leftSideBearing:51,advanceWidth:781},A:{x_min:37,x_max:554,y_min:-4,y_max:746,ha:750,leftSideBearing:37,advanceWidth:617},B:{x_min:37,x_max:532,y_min:3,y_max:783,ha:780,leftSideBearing:37,advanceWidth:579},C:{x_min:37,x_max:583,y_min:-3,y_max:775,ha:778,leftSideBearing:37,advanceWidth:623},D:{x_min:50,x_max:530,y_min:-15,y_max:749,ha:764,leftSideBearing:50,advanceWidth:579},E:{x_min:45,x_max:531,y_min:-1,y_max:743,ha:744,leftSideBearing:45,advanceWidth:585},F:{x_min:45,x_max:459,y_min:23,y_max:727,ha:704,leftSideBearing:45,advanceWidth:510},G:{x_min:31,x_max:577,y_min:-8,y_max:733,ha:741,leftSideBearing:31,advanceWidth:611},H:{x_min:37,x_max:493,y_min:-22,y_max:758,ha:780,leftSideBearing:37,advanceWidth:535},I:{x_min:47,x_max:501,y_min:-3,y_max:731,ha:734,leftSideBearing:47,advanceWidth:541},J:{x_min:33,x_max:531,y_min:-23,y_max:725,ha:748,leftSideBearing:33,advanceWidth:573},K:{x_min:43,x_max:505,y_min:-10,y_max:740,ha:750,leftSideBearing:43,advanceWidth:560},L:{x_min:49,x_max:457,y_min:-2,y_max:746,ha:748,leftSideBearing:49,advanceWidth:510},M:{x_min:35,x_max:699,y_min:1,y_max:744,ha:743,leftSideBearing:35,advanceWidth:743},N:{x_min:34,x_max:533,y_min:-17,y_max:761,ha:778,leftSideBearing:34,advanceWidth:579},O:{x_min:41,x_max:608,y_min:-5,y_max:735,ha:740,leftSideBearing:41,advanceWidth:667},P:{x_min:53,x_max:451,y_min:-18,y_max:735,ha:753,leftSideBearing:53,advanceWidth:497},Q:{x_min:40,x_max:599,y_min:-67,y_max:744,ha:811,leftSideBearing:40,advanceWidth:648},R:{x_min:39,x_max:487,y_min:16,y_max:735,ha:719,leftSideBearing:39,advanceWidth:535},S:{x_min:35,x_max:552,y_min:-47,y_max:708,ha:755,leftSideBearing:35,advanceWidth:604},T:{x_min:26,x_max:656,y_min:-13,y_max:718,ha:731,leftSideBearing:26,advanceWidth:705},U:{x_min:41,x_max:518,y_min:-20,y_max:748,ha:768,leftSideBearing:41,advanceWidth:567},V:{x_min:47,x_max:509,y_min:-26,y_max:744,ha:770,leftSideBearing:47,advanceWidth:567},W:{x_min:44,x_max:789,y_min:-35,y_max:720,ha:755,leftSideBearing:44,advanceWidth:833},X:{x_min:63,x_max:635,y_min:-10,y_max:745,ha:755,leftSideBearing:63,advanceWidth:680},Y:{x_min:43,x_max:503,y_min:-21,y_max:734,ha:755,leftSideBearing:43,advanceWidth:541},Z:{x_min:42,x_max:584,y_min:-10,y_max:739,ha:749,leftSideBearing:42,advanceWidth:629},"[":{x_min:46,x_max:346,y_min:-150,y_max:884,ha:1034,leftSideBearing:46,advanceWidth:291},"\\":{x_min:20,x_max:616,y_min:-100,y_max:797,ha:897,leftSideBearing:20,advanceWidth:645},"]":{x_min:-76,x_max:226,y_min:-150,y_max:881,ha:1031,leftSideBearing:-76,advanceWidth:297},"^":{x_min:43,x_max:437,y_min:517,y_max:812,ha:295,leftSideBearing:43,advanceWidth:478},_:{x_min:29,x_max:563,y_min:-110,y_max:-1,ha:109,leftSideBearing:29,advanceWidth:598},"`":{x_min:54,x_max:321,y_min:540,y_max:747,ha:207,leftSideBearing:54,advanceWidth:368},a:{x_min:20,x_max:447,y_min:-17,y_max:495,ha:512,leftSideBearing:20,advanceWidth:494},b:{x_min:37,x_max:466,y_min:-27,y_max:770,ha:797,leftSideBearing:37,advanceWidth:510},c:{x_min:35,x_max:456,y_min:-9,y_max:507,ha:516,leftSideBearing:35,advanceWidth:460},d:{x_min:45,x_max:520,y_min:-15,y_max:764,ha:779,leftSideBearing:45,advanceWidth:560},e:{x_min:33,x_max:370,y_min:-5,y_max:501,ha:506,leftSideBearing:33,advanceWidth:397},f:{x_min:35,x_max:411,y_min:-13,y_max:695,ha:708,leftSideBearing:35,advanceWidth:453},g:{x_min:33,x_max:551,y_min:-257,y_max:505,ha:762,leftSideBearing:33,advanceWidth:611},h:{x_min:32,x_max:458,y_min:-29,y_max:743,ha:772,leftSideBearing:32,advanceWidth:491},i:{x_min:45,x_max:167,y_min:-13,y_max:631,ha:644,leftSideBearing:45,advanceWidth:220},j:{x_min:-127,x_max:261,y_min:-231,y_max:601,ha:832,leftSideBearing:-127,advanceWidth:308},k:{x_min:39,x_max:443,y_min:-3,y_max:700,ha:703,leftSideBearing:39,advanceWidth:497},l:{x_min:58,x_max:168,y_min:-8,y_max:686,ha:694,leftSideBearing:58,advanceWidth:227},m:{x_min:39,x_max:688,y_min:-14,y_max:501,ha:515,leftSideBearing:39,advanceWidth:718},n:{x_min:45,x_max:491,y_min:-32,y_max:512,ha:544,leftSideBearing:45,advanceWidth:541},o:{x_min:41,x_max:424,y_min:-12,y_max:493,ha:505,leftSideBearing:41,advanceWidth:447},p:{x_min:25,x_max:529,y_min:-260,y_max:500,ha:760,leftSideBearing:25,advanceWidth:573},q:{x_min:53,x_max:603,y_min:-235,y_max:514,ha:749,leftSideBearing:53,advanceWidth:623},r:{x_min:32,x_max:407,y_min:-7,y_max:492,ha:499,leftSideBearing:32,advanceWidth:460},s:{x_min:49,x_max:416,y_min:-12,y_max:519,ha:531,leftSideBearing:49,advanceWidth:460},t:{x_min:32,x_max:442,y_min:-5,y_max:684,ha:689,leftSideBearing:32,advanceWidth:469},u:{x_min:41,x_max:487,y_min:-5,y_max:507,ha:512,leftSideBearing:41,advanceWidth:510},v:{x_min:16,x_max:441,y_min:-20,y_max:542,ha:562,leftSideBearing:16,advanceWidth:456},w:{x_min:39,x_max:639,y_min:-22,y_max:505,ha:527,leftSideBearing:39,advanceWidth:661},x:{x_min:15,x_max:505,y_min:-39,y_max:539,ha:578,leftSideBearing:15,advanceWidth:541},y:{x_min:-98,x_max:501,y_min:-242,y_max:511,ha:753,leftSideBearing:-98,advanceWidth:548},z:{x_min:27,x_max:479,y_min:-3,y_max:494,ha:497,leftSideBearing:27,advanceWidth:494},"{":{x_min:0,x_max:0,y_min:0,y_max:0,ha:0,leftSideBearing:0,advanceWidth:308},"|":{x_min:0,x_max:0,y_min:0,y_max:0,ha:0,leftSideBearing:0,advanceWidth:308},"}":{x_min:0,x_max:0,y_min:0,y_max:0,ha:0,leftSideBearing:0,advanceWidth:308},"~":{x_min:0,x_max:0,y_min:0,y_max:0,ha:0,leftSideBearing:0,advanceWidth:308}},fontFamily:"PetalumaScript",resolution:1e3,generatedOn:"2020-06-14T18:33:25.407Z"},Fi={spacing:50,glyphs:{" ":{x_min:0,x_max:509,y_min:0,y_max:2e3,ha:2e3,leftSideBearing:0,advanceWidth:509},0:{x_min:121,x_max:1048,y_min:-21,y_max:1477,ha:1498,leftSideBearing:121,advanceWidth:1168},1:{x_min:117,x_max:767,y_min:0,y_max:1456,ha:1456,leftSideBearing:117,advanceWidth:844},2:{x_min:75.8474576645637,x_max:1040,y_min:0,y_max:1477,ha:1477,leftSideBearing:75,advanceWidth:1131},3:{x_min:74.85365853658536,x_max:994,y_min:-21,y_max:1477,ha:1498,leftSideBearing:74,advanceWidth:1106},4:{x_min:63,x_max:1114,y_min:0,y_max:1456,ha:1456,leftSideBearing:63,advanceWidth:1187},5:{x_min:96.8448275474953,x_max:982,y_min:-21,y_max:1456,ha:1477,leftSideBearing:96,advanceWidth:1081},6:{x_min:121,x_max:1067,y_min:-21,y_max:1477,ha:1498,leftSideBearing:121,advanceWidth:1144},7:{x_min:76,x_max:1060,y_min:0,y_max:1456,ha:1456,leftSideBearing:-30,advanceWidth:1128},8:{x_min:92,x_max:1039,y_min:-21,y_max:1477,ha:1498,leftSideBearing:92,advanceWidth:1131},9:{x_min:84,x_max:1026,y_min:-21,y_max:1477,ha:1498,leftSideBearing:84,advanceWidth:1154},"!":{x_min:143,x_max:340,y_min:0,y_max:1456,ha:1456,leftSideBearing:143,advanceWidth:483},'"':{x_min:166,x_max:634,y_min:1055,y_max:1560,ha:505,leftSideBearing:166,advanceWidth:770},"#":{x_min:63,x_max:1179,y_min:0,y_max:1456,ha:1456,leftSideBearing:63,advanceWidth:1246},$:{x_min:81.92156915727656,x_max:1012,y_min:-208,y_max:1693,ha:1901,leftSideBearing:81,advanceWidth:1110},"%":{x_min:77,x_max:1384,y_min:-21,y_max:1477,ha:1498,leftSideBearing:77,advanceWidth:1460},"&":{x_min:74,x_max:1242,y_min:-21,y_max:1477,ha:1498,leftSideBearing:74,advanceWidth:1289},"'":{x_min:166,x_max:324,y_min:1055,y_max:1560,ha:505,leftSideBearing:166,advanceWidth:460},"(":{x_min:114,x_max:650,y_min:-463,y_max:1636,ha:2099,leftSideBearing:114,advanceWidth:662},")":{x_min:11,x_max:547,y_min:-463,y_max:1636,ha:2099,leftSideBearing:11,advanceWidth:654},"*":{x_min:66,x_max:893,y_min:607,y_max:1456,ha:849,leftSideBearing:66,advanceWidth:958},"+":{x_min:73,x_max:1071,y_min:146,y_max:1206,ha:1060,leftSideBearing:73,advanceWidth:1145},",":{x_min:23,x_max:315,y_min:-311,y_max:221,ha:532,leftSideBearing:23,advanceWidth:404},"-":{x_min:154,x_max:643,y_min:538,y_max:692,ha:154,leftSideBearing:154,advanceWidth:797},".":{x_min:145,x_max:342,y_min:0,y_max:202,ha:202,leftSideBearing:145,advanceWidth:493},"/":{x_min:0,x_max:774,y_min:-125,y_max:1456,ha:1581,leftSideBearing:0,advanceWidth:824},":":{x_min:145,x_max:342,y_min:0,y_max:1082,ha:1082,leftSideBearing:145,advanceWidth:419},";":{x_min:53,x_max:345,y_min:-311,y_max:1082,ha:1393,leftSideBearing:53,advanceWidth:424},"<":{x_min:76,x_max:892,y_min:107,y_max:1013,ha:906,leftSideBearing:76,advanceWidth:1017},"=":{x_min:147,x_max:981,y_min:407,y_max:987,ha:580,leftSideBearing:147,advanceWidth:1127},">":{x_min:125,x_max:980,y_min:87,y_max:993,ha:906,leftSideBearing:125,advanceWidth:1060},"?":{x_min:65.92660602419838,x_max:890,y_min:0,y_max:1477,ha:1477,leftSideBearing:65,advanceWidth:953},"@":{x_min:84.3592218305664,x_max:1705.2346925277395,y_min:-453,y_max:1431,ha:1884,leftSideBearing:84,advanceWidth:1821},A:{x_min:70,x_max:1463,y_min:0,y_max:1456,ha:1456,leftSideBearing:70,advanceWidth:1533},B:{x_min:81,x_max:1253,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1322},C:{x_min:80,x_max:1174,y_min:-21,y_max:1477,ha:1498,leftSideBearing:80,advanceWidth:1290},D:{x_min:81,x_max:1291,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1356},E:{x_min:81,x_max:1190,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1306},F:{x_min:81,x_max:1176,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1256},G:{x_min:80,x_max:1226,y_min:-21,y_max:1477,ha:1498,leftSideBearing:80,advanceWidth:1346},H:{x_min:81,x_max:1497,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1578},I:{x_min:81,x_max:604,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:685},J:{x_min:60,x_max:1100,y_min:-21,y_max:1456,ha:1477,leftSideBearing:60,advanceWidth:1169},K:{x_min:81,x_max:1427,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1501},L:{x_min:81,x_max:1130,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1210},M:{x_min:94,x_max:1888,y_min:0,y_max:1456,ha:1456,leftSideBearing:94,advanceWidth:1982},N:{x_min:83,x_max:1509,y_min:0,y_max:1456,ha:1456,leftSideBearing:83,advanceWidth:1592},O:{x_min:70,x_max:1281,y_min:-21,y_max:1477,ha:1498,leftSideBearing:70,advanceWidth:1351},P:{x_min:81,x_max:1242,y_min:0,y_max:1456,ha:1456,leftSideBearing:81,advanceWidth:1297},Q:{x_min:70,x_max:1348,y_min:-245,y_max:1477,ha:1722,leftSideBearing:70,advanceWidth:1376},R:{x_min:81,x_max:1285,y_min:0,y_max:1455,ha:1455,leftSideBearing:81,advanceWidth:1385},S:{x_min:115,x_max:1116,y_min:-21,y_max:1477,ha:1498,leftSideBearing:115,advanceWidth:1206},T:{x_min:96,x_max:1306,y_min:0,y_max:1456,ha:1456,leftSideBearing:96,advanceWidth:1406},U:{x_min:70,x_max:1452,y_min:-21,y_max:1456,ha:1477,leftSideBearing:70,advanceWidth:1522},V:{x_min:65,x_max:1443,y_min:0,y_max:1456,ha:1456,leftSideBearing:65,advanceWidth:1508},W:{x_min:72,x_max:2057,y_min:0,y_max:1456,ha:1456,leftSideBearing:72,advanceWidth:2129},X:{x_min:80,x_max:1449,y_min:0,y_max:1456,ha:1456,leftSideBearing:80,advanceWidth:1529},Y:{x_min:65,x_max:1396,y_min:0,y_max:1456,ha:1456,leftSideBearing:65,advanceWidth:1461},Z:{x_min:90,x_max:1107,y_min:0,y_max:1456,ha:1456,leftSideBearing:90,advanceWidth:1197},"[":{x_min:157,x_max:541,y_min:-312,y_max:1664,ha:1976,leftSideBearing:157,advanceWidth:573},"\\":{x_min:36,x_max:830,y_min:-125,y_max:1456,ha:1581,leftSideBearing:36,advanceWidth:841},"]":{x_min:23,x_max:408,y_min:-312,y_max:1664,ha:1976,leftSideBearing:23,advanceWidth:552},"^":{x_min:71,x_max:802,y_min:729,y_max:1456,ha:727,leftSideBearing:71,advanceWidth:864},_:{x_min:119,x_max:1041,y_min:-154,y_max:0,ha:154,leftSideBearing:119,advanceWidth:1168},"`":{x_min:40,x_max:456,y_min:1288,y_max:1560,ha:272,leftSideBearing:40,advanceWidth:496},a:{x_min:79,x_max:1053,y_min:-21,y_max:1102,ha:1123,leftSideBearing:79,advanceWidth:1132},b:{x_min:-16,x_max:1071,y_min:-21,y_max:1560,ha:1581,leftSideBearing:-16,advanceWidth:1145},c:{x_min:78,x_max:988,y_min:-21,y_max:1102,ha:1123,leftSideBearing:78,advanceWidth:1067},d:{x_min:78,x_max:1156,y_min:-21,y_max:1560,ha:1581,leftSideBearing:78,advanceWidth:1218},e:{x_min:74,x_max:980,y_min:-21,y_max:1102,ha:1123,leftSideBearing:74,advanceWidth:1059},f:{x_min:64,x_max:731,y_min:0,y_max:1581,ha:1581,leftSideBearing:64,advanceWidth:725},g:{x_min:78,x_max:1133,y_min:-437,y_max:1102,ha:1539,leftSideBearing:78,advanceWidth:1157},h:{x_min:49,x_max:1255,y_min:0,y_max:1560,ha:1560,leftSideBearing:49,advanceWidth:1315},i:{x_min:67,x_max:590,y_min:0,y_max:1560,ha:1560,leftSideBearing:67,advanceWidth:652},j:{x_min:-56,x_max:381,y_min:-437,y_max:1560,ha:1997,leftSideBearing:-56,advanceWidth:525},k:{x_min:64,x_max:1248,y_min:0,y_max:1560,ha:1560,leftSideBearing:64,advanceWidth:1287},l:{x_min:64,x_max:587,y_min:0,y_max:1560,ha:1560,leftSideBearing:64,advanceWidth:653},m:{x_min:74,x_max:1905,y_min:0,y_max:1102,ha:1102,leftSideBearing:74,advanceWidth:1977},n:{x_min:74,x_max:1278,y_min:0,y_max:1102,ha:1102,leftSideBearing:74,advanceWidth:1343},o:{x_min:78,x_max:1046,y_min:-21,y_max:1102,ha:1123,leftSideBearing:78,advanceWidth:1124},p:{x_min:34,x_max:1119,y_min:-416,y_max:1102,ha:1518,leftSideBearing:34,advanceWidth:1197},q:{x_min:78,x_max:1135,y_min:-416,y_max:1102,ha:1518,leftSideBearing:78,advanceWidth:1139},r:{x_min:72,x_max:808,y_min:0,y_max:1102,ha:1102,leftSideBearing:72,advanceWidth:854},s:{x_min:104,x_max:933,y_min:-21,y_max:1102,ha:1123,leftSideBearing:104,advanceWidth:1022},t:{x_min:24,x_max:678,y_min:-17,y_max:1343,ha:1360,leftSideBearing:24,advanceWidth:730},u:{x_min:52,x_max:1181,y_min:-21,y_max:1082,ha:1103,leftSideBearing:52,advanceWidth:1245},v:{x_min:26,x_max:1176,y_min:0,y_max:1082,ha:1082,leftSideBearing:26,advanceWidth:1206},w:{x_min:52,x_max:1777,y_min:0,y_max:1082,ha:1082,leftSideBearing:52,advanceWidth:1823},x:{x_min:42,x_max:1163,y_min:0,y_max:1082,ha:1082,leftSideBearing:42,advanceWidth:1203},y:{x_min:24,x_max:1172,y_min:-437,y_max:1082,ha:1519,leftSideBearing:24,advanceWidth:1192},z:{x_min:88,x_max:960,y_min:0,y_max:1082,ha:1082,leftSideBearing:88,advanceWidth:1032},"{":{x_min:63,x_max:671,y_min:-364,y_max:1597,ha:1961,leftSideBearing:63,advanceWidth:701},"|":{x_min:150,x_max:307,y_min:-270,y_max:1456,ha:1726,leftSideBearing:150,advanceWidth:451},"}":{x_min:27,x_max:635,y_min:-364,y_max:1597,ha:1961,leftSideBearing:27,advanceWidth:701},"~":{x_min:121,x_max:1257,y_min:401,y_max:803,ha:402,leftSideBearing:121,advanceWidth:1386}},fontFamily:"Roboto Slab",resolution:2048,generatedOn:"2020-06-15T19:12:58.120Z"};E.load("Bravura",Ti,wi),E.load("Gonville",Ci,Ei),E.load("Petaluma",ki,Bi),E.load("Custom",vi,Di),yi.setMusicFont("Bravura","Gonville","Custom"),function(){{const t=Fi,{fontFamily:e,resolution:i,glyphs:b}=t;E.load(e,t);const a="b";it.registerInfo({family:e,resolution:i,glyphs:b,maxSizeGlyph:a,monospaced:!1,bold:!1,italic:!1,superscriptOffset:.66,subscriptOffset:.66,serifs:!0,description:"Text font to pair with the Bravura / Gonville music fonts."})}{const t=Pi,{fontFamily:e,resolution:i,glyphs:b}=t;E.load(e,t);const a="b";it.registerInfo({family:e,resolution:i,glyphs:b,maxSizeGlyph:a,monospaced:!1,bold:!1,italic:!1,superscriptOffset:.66,subscriptOffset:.66,serifs:!1,description:"Text font to pair with the Petaluma music font."})}}();const Ai=Si;return e=e.default})()})); +//# sourceMappingURL=vexflow.js.map \ No newline at end of file diff --git a/build/cjs/vexflow.js.map b/build/cjs/vexflow.js.map new file mode 100644 index 0000000000..f1fa57a605 --- /dev/null +++ b/build/cjs/vexflow.js.map @@ -0,0 +1 @@ +{"version":3,"file":"vexflow.js","mappings":"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","sources":["webpack://Vex/webpack/universalModuleDefinition","webpack://Vex/webpack/bootstrap","webpack://Vex/webpack/runtime/define property getters","webpack://Vex/webpack/runtime/global","webpack://Vex/webpack/runtime/hasOwnProperty shorthand","webpack://Vex/./src/typeguard.ts","webpack://Vex/./src/util.ts","webpack://Vex/./src/fraction.ts","webpack://Vex/./src/boundingbox.ts","webpack://Vex/./src/boundingboxcomputation.ts","webpack://Vex/./src/font.ts","webpack://Vex/./src/registry.ts","webpack://Vex/./src/element.ts","webpack://Vex/./src/glyph.ts","webpack://Vex/./src/modifier.ts","webpack://Vex/./src/music.ts","webpack://Vex/./src/tables.ts","webpack://Vex/./src/accidental.ts","webpack://Vex/./src/stem.ts","webpack://Vex/./src/textformatter.ts","webpack://Vex/./src/annotation.ts","webpack://Vex/./src/articulation.ts","webpack://Vex/./src/rendercontext.ts","webpack://Vex/./src/tickable.ts","webpack://Vex/./src/note.ts","webpack://Vex/./src/stavemodifier.ts","webpack://Vex/./src/stavebarline.ts","webpack://Vex/./src/chordsymbol.ts","webpack://Vex/./src/voice.ts","webpack://Vex/./src/barnote.ts","webpack://Vex/./src/bend.ts","webpack://Vex/./src/dot.ts","webpack://Vex/./src/frethandfinger.ts","webpack://Vex/./src/stavetie.ts","webpack://Vex/./src/tabtie.ts","webpack://Vex/./src/gracenotegroup.ts","webpack://Vex/./src/notesubgroup.ts","webpack://Vex/./src/tickcontext.ts","webpack://Vex/./src/ornament.ts","webpack://Vex/./src/parenthesis.ts","webpack://Vex/./src/notehead.ts","webpack://Vex/./src/stemmablenote.ts","webpack://Vex/./src/stavenote.ts","webpack://Vex/./src/web.ts","webpack://Vex/./src/canvascontext.ts","webpack://Vex/./src/svgcontext.ts","webpack://Vex/./src/renderer.ts","webpack://Vex/./src/textnote.ts","webpack://Vex/./src/stavevolta.ts","webpack://Vex/./src/stringnumber.ts","webpack://Vex/./src/strokes.ts","webpack://Vex/./src/vibrato.ts","webpack://Vex/./src/modifiercontext.ts","webpack://Vex/./src/clef.ts","webpack://Vex/./src/keysignature.ts","webpack://Vex/./src/staverepetition.ts","webpack://Vex/./src/stavesection.ts","webpack://Vex/./src/stavetempo.ts","webpack://Vex/./src/stavetext.ts","webpack://Vex/./src/timesigglyph.ts","webpack://Vex/./src/timesignature.ts","webpack://Vex/./src/stave.ts","webpack://Vex/./src/staveconnector.ts","webpack://Vex/./src/formatter.ts","webpack://Vex/./src/tuplet.ts","webpack://Vex/./src/beam.ts","webpack://Vex/./src/clefnote.ts","webpack://Vex/./src/crescendo.ts","webpack://Vex/./src/curve.ts","webpack://Vex/./src/parser.ts","webpack://Vex/./src/easyscore.ts","webpack://Vex/./src/ghostnote.ts","webpack://Vex/./src/glyphnote.ts","webpack://Vex/./src/gracenote.ts","webpack://Vex/./src/keysignote.ts","webpack://Vex/./src/multimeasurerest.ts","webpack://Vex/./src/pedalmarking.ts","webpack://Vex/./src/repeatnote.ts","webpack://Vex/./src/staveline.ts","webpack://Vex/./src/system.ts","webpack://Vex/./src/tabnote.ts","webpack://Vex/./src/tabstave.ts","webpack://Vex/./src/textbracket.ts","webpack://Vex/./src/textdynamics.ts","webpack://Vex/./src/timesignote.ts","webpack://Vex/./src/vibratobracket.ts","webpack://Vex/./src/factory.ts","webpack://Vex/./src/stavehairpin.ts","webpack://Vex/./src/tabslide.ts","webpack://Vex/./src/tuning.ts","webpack://Vex/./src/flow.ts","webpack://Vex/./src/version.ts","webpack://Vex/./src/gracetabnote.ts","webpack://Vex/./src/keymanager.ts","webpack://Vex/./src/tremolo.ts","webpack://Vex/./src/vex.ts","webpack://Vex/./src/fonts/bravura_glyphs.ts","webpack://Vex/./src/fonts/bravura_metrics.ts","webpack://Vex/./src/fonts/custom_glyphs.ts","webpack://Vex/./src/fonts/custom_metrics.ts","webpack://Vex/./src/fonts/gonville_glyphs.ts","webpack://Vex/./src/fonts/gonville_metrics.ts","webpack://Vex/./src/fonts/petaluma_glyphs.ts","webpack://Vex/./src/fonts/petaluma_metrics.ts","webpack://Vex/./src/fonts/petalumascript_glyphs.ts","webpack://Vex/./src/fonts/robotoslab_glyphs.ts","webpack://Vex/./src/fonts/load_bravura.ts","webpack://Vex/./src/fonts/load_gonville.ts","webpack://Vex/./src/fonts/load_petaluma.ts","webpack://Vex/./src/fonts/load_custom.ts","webpack://Vex/./entry/vexflow.ts","webpack://Vex/./src/fonts/textfonts.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Vex\"] = factory();\n\telse\n\t\troot[\"Vex\"] = factory();\n})((typeof window !== 'undefined' ? window : typeof globalThis !== 'undefined' ? globalThis : this), function() {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Ron B. Yeh\n// MIT License\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * Use instead of `instanceof` as a more flexible type guard.\n * @param obj check if this object's CATEGORY matches the provided category.\n * @param category a string representing a category of VexFlow objects.\n * @param checkAncestors defaults to `true`, so we walk up the prototype chain to look for a matching `CATEGORY`.\n * If `false`, we do not check the superclass or other ancestors.\n * @returns true if `obj` has a static `CATEGORY` property that matches `category`.\n */\nexport function isCategory(obj, category, checkAncestors = true) {\n // obj is undefined, a number, a primitive string, or null.\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n // `obj.constructor` is a reference to the constructor function that created the `obj` instance.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor\n let constructorFcn = obj.constructor;\n // Check if the object's static .CATEGORY matches the provided category.\n if (checkAncestors) {\n // Walk up the prototype chain to look for a matching obj.constructor.CATEGORY.\n while (obj !== null) {\n constructorFcn = obj.constructor;\n if ('CATEGORY' in constructorFcn && constructorFcn.CATEGORY === category) {\n return true;\n }\n obj = Object.getPrototypeOf(obj);\n }\n return false;\n }\n else {\n // Do not walk up the prototype chain. Just check this particular object's static .CATEGORY string.\n return 'CATEGORY' in constructorFcn && constructorFcn.CATEGORY === category;\n }\n}\nexport const isAccidental = (obj) => isCategory(obj, Category.Accidental);\nexport const isAnnotation = (obj) => isCategory(obj, Category.Annotation);\nexport const isBarline = (obj) => isCategory(obj, Category.Barline);\nexport const isDot = (obj) => isCategory(obj, Category.Dot);\nexport const isGraceNote = (obj) => isCategory(obj, Category.GraceNote);\nexport const isGraceNoteGroup = (obj) => isCategory(obj, Category.GraceNoteGroup);\nexport const isNote = (obj) => isCategory(obj, Category.Note);\nexport const isRenderContext = (obj) => isCategory(obj, Category.RenderContext);\nexport const isStaveNote = (obj) => isCategory(obj, Category.StaveNote);\nexport const isStemmableNote = (obj) => isCategory(obj, Category.StemmableNote);\nexport const isTabNote = (obj) => isCategory(obj, Category.TabNote);\n// 'const' enums are erased by the TypeScript compiler. The string values are inlined at all the use sites.\n// See: https://www.typescriptlang.org/docs/handbook/enums.html#const-enums\nexport var Category;\n(function (Category) {\n Category[\"Accidental\"] = \"Accidental\";\n Category[\"Annotation\"] = \"Annotation\";\n Category[\"Articulation\"] = \"Articulation\";\n Category[\"Barline\"] = \"Barline\";\n Category[\"BarNote\"] = \"BarNote\";\n Category[\"Beam\"] = \"Beam\";\n Category[\"Bend\"] = \"Bend\";\n Category[\"ChordSymbol\"] = \"ChordSymbol\";\n Category[\"Clef\"] = \"Clef\";\n Category[\"ClefNote\"] = \"ClefNote\";\n Category[\"Crescendo\"] = \"Crescendo\";\n Category[\"Curve\"] = \"Curve\";\n Category[\"Dot\"] = \"Dot\";\n Category[\"Element\"] = \"Element\";\n Category[\"Fraction\"] = \"Fraction\";\n Category[\"FretHandFinger\"] = \"FretHandFinger\";\n Category[\"GhostNote\"] = \"GhostNote\";\n Category[\"Glyph\"] = \"Glyph\";\n Category[\"GlyphNote\"] = \"GlyphNote\";\n Category[\"GraceNote\"] = \"GraceNote\";\n Category[\"GraceNoteGroup\"] = \"GraceNoteGroup\";\n Category[\"GraceTabNote\"] = \"GraceTabNote\";\n Category[\"KeySignature\"] = \"KeySignature\";\n Category[\"KeySigNote\"] = \"KeySigNote\";\n Category[\"Modifier\"] = \"Modifier\";\n Category[\"MultiMeasureRest\"] = \"MultiMeasureRest\";\n Category[\"Note\"] = \"Note\";\n Category[\"NoteHead\"] = \"NoteHead\";\n Category[\"NoteSubGroup\"] = \"NoteSubGroup\";\n Category[\"Ornament\"] = \"Ornament\";\n Category[\"Parenthesis\"] = \"Parenthesis\";\n Category[\"PedalMarking\"] = \"PedalMarking\";\n Category[\"RenderContext\"] = \"RenderContext\";\n Category[\"RepeatNote\"] = \"RepeatNote\";\n Category[\"Repetition\"] = \"Repetition\";\n Category[\"Stave\"] = \"Stave\";\n Category[\"StaveConnector\"] = \"StaveConnector\";\n Category[\"StaveHairpin\"] = \"StaveHairpin\";\n Category[\"StaveLine\"] = \"StaveLine\";\n Category[\"StaveModifier\"] = \"StaveModifier\";\n Category[\"StaveNote\"] = \"StaveNote\";\n Category[\"StaveSection\"] = \"StaveSection\";\n Category[\"StaveTempo\"] = \"StaveTempo\";\n Category[\"StaveText\"] = \"StaveText\";\n Category[\"StaveTie\"] = \"StaveTie\";\n Category[\"Stem\"] = \"Stem\";\n Category[\"StemmableNote\"] = \"StemmableNote\";\n Category[\"StringNumber\"] = \"StringNumber\";\n Category[\"Stroke\"] = \"Stroke\";\n Category[\"System\"] = \"System\";\n Category[\"TabNote\"] = \"TabNote\";\n Category[\"TabSlide\"] = \"TabSlide\";\n Category[\"TabStave\"] = \"TabStave\";\n Category[\"TabTie\"] = \"TabTie\";\n Category[\"TextBracket\"] = \"TextBracket\";\n Category[\"TextDynamics\"] = \"TextDynamics\";\n Category[\"TextNote\"] = \"TextNote\";\n Category[\"Tickable\"] = \"Tickable\";\n Category[\"TimeSignature\"] = \"TimeSignature\";\n Category[\"TimeSigNote\"] = \"TimeSigNote\";\n Category[\"Tremolo\"] = \"Tremolo\";\n Category[\"Tuplet\"] = \"Tuplet\";\n Category[\"Vibrato\"] = \"Vibrato\";\n Category[\"VibratoBracket\"] = \"VibratoBracket\";\n Category[\"Voice\"] = \"Voice\";\n Category[\"Volta\"] = \"Volta\";\n})(Category || (Category = {}));\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// Note: Keep this module free of imports to reduce the chance of circular dependencies.\n/** `RuntimeError` will be thrown by VexFlow classes in case of error. */\nexport class RuntimeError extends Error {\n constructor(code, message = '') {\n super('[RuntimeError] ' + code + ': ' + message);\n this.code = code;\n }\n}\n/** VexFlow can be used outside of the browser (e.g., Node) where `window` may not be defined. */\n// eslint-disable-next-line\nexport function globalObject() {\n if (typeof globalThis !== 'undefined') {\n return globalThis;\n }\n if (typeof self !== 'undefined') {\n return self;\n }\n if (typeof window !== 'undefined') {\n return window;\n }\n if (typeof global !== 'undefined') {\n return global;\n }\n return Function('return this')();\n}\n/**\n * Check that `x` is of type `T` and not `undefined`.\n * If `x` is `undefined`, throw a RuntimeError with the optionally provided error code and message.\n */\nexport function defined(x, code = 'undefined', message = '') {\n if (x === undefined) {\n throw new RuntimeError(code, message);\n }\n return x;\n}\n/** Default log function sends all arguments to console. */\n// eslint-disable-next-line\nexport function log(block, ...args) {\n if (!args)\n return;\n const line = Array.prototype.slice.call(args).join(' ');\n globalObject().console.log(block + ': ' + line);\n}\n/** Dump warning to console. */\n// eslint-disable-next-line\nexport function warn(...args) {\n const line = args.join(' ');\n const err = new Error();\n globalObject().console.log('Warning: ', line, err.stack);\n}\n/** Round number to nearest fractional value (`.5`, `.25`, etc.) */\nfunction roundN(x, n) {\n return x % n >= n / 2 ? parseInt(`${x / n}`, 10) * n + n : parseInt(`${x / n}`, 10) * n;\n}\n/** Locate the mid point between stave lines. Returns a fractional line if a space. */\nexport function midLine(a, b) {\n let mid_line = b + (a - b) / 2;\n if (mid_line % 2 > 0) {\n mid_line = roundN(mid_line * 10, 5) / 10;\n }\n return mid_line;\n}\n/**\n * Used by various classes (e.g., SVGContext) to provide a\n * unique prefix to element names (or other keys in shared namespaces).\n */\nexport function prefix(text) {\n return `vf-${text}`;\n}\n/**\n * Convert an arbitrary angle in radians to the equivalent one in the range [0, pi).\n */\nexport function normalizeAngle(a) {\n a = a % (2 * Math.PI);\n if (a < 0) {\n a += 2 * Math.PI;\n }\n return a;\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// Author: Joshua Koo / @zz85\n// Author: @incompleteopus\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\n/** Fraction represents a rational number. */\nexport class Fraction {\n /** Set the numerator and denominator. */\n constructor(numerator, denominator) {\n this.numerator = 1;\n this.denominator = 1;\n this.set(numerator, denominator);\n }\n static get CATEGORY() {\n return Category.Fraction;\n }\n /**\n * GCD: Greatest common divisor using the Euclidean algorithm.\n * Note: GCD(0, 0) => 0 and GCD(0, n) => n.\n */\n static GCD(a, b) {\n if (typeof a !== 'number' || Number.isNaN(a) || typeof b !== 'number' || Number.isNaN(b)) {\n throw new RuntimeError('BadArgument', `Invalid numbers: ${a}, ${b}`);\n }\n let t;\n while (b !== 0) {\n t = b;\n b = a % b;\n a = t;\n }\n return a;\n }\n /** LCM: Lowest common multiple. */\n static LCM(a, b) {\n return (a * b) / Fraction.GCD(a, b);\n }\n /** Lowest common multiple for more than two numbers. */\n static LCMM(args) {\n if (args.length === 0) {\n return 0;\n }\n else if (args.length === 1) {\n return args[0];\n }\n else if (args.length === 2) {\n return Fraction.LCM(args[0], args[1]);\n }\n else {\n // args.shift() removes the first number.\n // LCM the first number with the rest of the numbers.\n return Fraction.LCM(args.shift(), Fraction.LCMM(args));\n }\n }\n /** Set the numerator and denominator. */\n set(numerator = 1, denominator = 1) {\n this.numerator = numerator;\n this.denominator = denominator;\n return this;\n }\n /** Return the value of the fraction. */\n value() {\n return this.numerator / this.denominator;\n }\n /** Simplify numerator and denominator using GCD. */\n simplify() {\n let u = this.numerator;\n let d = this.denominator;\n const gcd = Fraction.GCD(u, d);\n u /= gcd;\n d /= gcd;\n if (d < 0) {\n d = -d;\n u = -u;\n }\n return this.set(u, d);\n }\n /** Add value of another fraction. */\n add(param1 = 0, param2 = 1) {\n const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2);\n const lcm = Fraction.LCM(this.denominator, otherDenominator);\n const a = lcm / this.denominator;\n const b = lcm / otherDenominator;\n const u = this.numerator * a + otherNumerator * b;\n return this.set(u, lcm);\n }\n /** Substract value of another fraction. */\n subtract(param1 = 0, param2 = 1) {\n const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2);\n const lcm = Fraction.LCM(this.denominator, otherDenominator);\n const a = lcm / this.denominator;\n const b = lcm / otherDenominator;\n const u = this.numerator * a - otherNumerator * b;\n return this.set(u, lcm);\n }\n /** Multiply by value of another fraction. */\n multiply(param1 = 1, param2 = 1) {\n const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2);\n return this.set(this.numerator * otherNumerator, this.denominator * otherDenominator);\n }\n /** Divide by value of another Fraction. */\n divide(param1 = 1, param2 = 1) {\n const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2);\n return this.set(this.numerator * otherDenominator, this.denominator * otherNumerator);\n }\n /** Simplify both sides and check if they are equal. */\n equals(compare) {\n const a = Fraction.__staticFractionA.copy(compare).simplify();\n const b = Fraction.__staticFractionB.copy(this).simplify();\n return a.numerator === b.numerator && a.denominator === b.denominator;\n }\n /** Greater than operator. */\n greaterThan(compare) {\n const a = Fraction.__staticFractionB.copy(this);\n a.subtract(compare);\n return a.numerator > 0;\n }\n /** Greater than or equals operator. */\n greaterThanEquals(compare) {\n const a = Fraction.__staticFractionB.copy(this);\n a.subtract(compare);\n return a.numerator >= 0;\n }\n /** Less than operator. */\n lessThan(compare) {\n return !this.greaterThanEquals(compare);\n }\n /** Less than or equals operator. */\n lessThanEquals(compare) {\n return !this.greaterThan(compare);\n }\n /** Return a new copy with current values. */\n clone() {\n return new Fraction(this.numerator, this.denominator);\n }\n /** Copy value of another fraction. */\n copy(other) {\n if (typeof other === 'number') {\n return this.set(other, 1);\n }\n else {\n return this.set(other.numerator, other.denominator);\n }\n }\n /** Return the integer component (eg. 5/2 => 2). */\n quotient() {\n return Math.floor(this.numerator / this.denominator);\n }\n /** Return the remainder component (eg. 5/2 => 1). */\n remainder() {\n return this.numerator % this.denominator;\n }\n /** Calculate absolute value. */\n makeAbs() {\n this.denominator = Math.abs(this.denominator);\n this.numerator = Math.abs(this.numerator);\n return this;\n }\n /** Return a raw string representation (eg. \"5/2\"). */\n toString() {\n return `${this.numerator}/${this.denominator}`;\n }\n /** Return a simplified string respresentation. */\n toSimplifiedString() {\n return Fraction.__staticFractionTmp.copy(this).simplify().toString();\n }\n /** Return string representation in mixed form. */\n toMixedString() {\n let s = '';\n const q = this.quotient();\n const f = Fraction.__staticFractionTmp.copy(this);\n if (q < 0) {\n f.makeAbs();\n }\n if (q !== 0) {\n s += q;\n if (f.numerator !== 0) {\n s += ` ${f.toSimplifiedString()}`;\n }\n }\n else if (f.numerator === 0) {\n s = '0';\n }\n else {\n s = f.toSimplifiedString();\n }\n return s;\n }\n /** Parse a fraction string. */\n parse(str) {\n const i = str.split('/');\n const n = parseInt(i[0], 10);\n const d = i[1] ? parseInt(i[1], 10) : 1;\n return this.set(n, d);\n }\n}\n// Cached objects for comparisons.\nFraction.__staticFractionA = new Fraction();\nFraction.__staticFractionB = new Fraction();\nFraction.__staticFractionTmp = new Fraction();\n/** Helper function to extract the numerator and denominator from another fraction. */\nfunction getNumeratorAndDenominator(n, d = 1) {\n if (typeof n === 'number') {\n // Both params are numbers, so we return them as [numerator, denominator].\n return [n, d];\n }\n else {\n // First param is a Fraction object. We ignore the second param.\n return [n.numerator, n.denominator];\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nexport class BoundingBox {\n constructor(x, y, w, h) {\n this.x = x;\n this.y = y;\n this.w = w;\n this.h = h;\n }\n /**\n * Create a new copy.\n */\n static copy(that) {\n return new BoundingBox(that.x, that.y, that.w, that.h);\n }\n /** Get x position. */\n getX() {\n return this.x;\n }\n /** Get y position. */\n getY() {\n return this.y;\n }\n /** Get width. */\n getW() {\n return this.w;\n }\n /** Get height. */\n getH() {\n return this.h;\n }\n /** Set x position. */\n setX(x) {\n this.x = x;\n return this;\n }\n /** Set y position. */\n setY(y) {\n this.y = y;\n return this;\n }\n /** Set width. */\n setW(w) {\n this.w = w;\n return this;\n }\n /** Set height. */\n setH(h) {\n this.h = h;\n return this;\n }\n /** Move to position. */\n move(x, y) {\n this.x += x;\n this.y += y;\n return this;\n }\n /** Clone. */\n clone() {\n return BoundingBox.copy(this);\n }\n /**\n * Merge my box with given box. Creates a bigger bounding box unless\n * the given box is contained in this one.\n */\n mergeWith(boundingBox) {\n const that = boundingBox;\n const new_x = this.x < that.x ? this.x : that.x;\n const new_y = this.y < that.y ? this.y : that.y;\n const new_w = Math.max(this.x + this.w, that.x + that.w) - new_x;\n const new_h = Math.max(this.y + this.h, that.y + that.h) - new_y;\n this.x = new_x;\n this.y = new_y;\n this.w = new_w;\n this.h = new_h;\n return this;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n/**\n * BoundingBoxComputation computes metrics for a bounding box by continuously\n * taking canvas path commands.\n *\n * Warning: This class is merely a crutch to get bounding box information without\n * explicit metadata. This is likely to get deprecated following SMuFL support.\n *\n * based on: https://github.com/canvg/canvg/blob/master/src/BoundingBox.ts (MIT License)\n */\nexport class BoundingBoxComputation {\n constructor() {\n this.x1 = Number.NaN;\n this.y1 = Number.NaN;\n this.x2 = Number.NaN;\n this.y2 = Number.NaN;\n }\n /** Get calculated X1. */\n getX1() {\n return this.x1;\n }\n /** Get calculated Y1. */\n getY1() {\n return this.y1;\n }\n /** Get calculated width. */\n width() {\n return this.x2 - this.x1;\n }\n /** Get calculated height. */\n height() {\n return this.y2 - this.y1;\n }\n /** Add point to BoundingBox. */\n addPoint(x, y) {\n if (isNaN(this.x1) || x < this.x1)\n this.x1 = x;\n if (isNaN(this.x2) || x > this.x2)\n this.x2 = x;\n if (isNaN(this.y1) || y < this.y1)\n this.y1 = y;\n if (isNaN(this.y2) || y > this.y2)\n this.y2 = y;\n }\n /** Add X to BoundingBox. */\n addX(x) {\n this.addPoint(x, this.y1);\n }\n /** Add Y to BoundingBox. */\n addY(y) {\n this.addPoint(this.x1, y);\n }\n /** Add quadratic curve to BoundingBox. */\n addQuadraticCurve(p0x, p0y, p1x, p1y, p2x, p2y) {\n this.addPoint(p0x, p0y);\n this.addPoint(p2x, p2y);\n const p01x = p1x - p0x;\n const p12x = p2x - p1x;\n let denom = p01x - p12x;\n if (denom != 0) {\n const t = p01x / denom;\n if (t > 0 && t < 1) {\n const it = 1 - t;\n this.addX(it * it * p0x + 2 * it * t * p1x + t * t * p2x);\n }\n }\n const p01y = p1y - p0y;\n const p12y = p2y - p1y;\n denom = p01y - p12y;\n if (denom != 0) {\n const t = p01y / denom;\n if (t > 0 && t < 1) {\n const it = 1 - t;\n this.addY(it * it * p0y + 2 * it * t * p1y + t * t * p2y);\n }\n }\n }\n /** Add bezier curve to BoundingBox. */\n addBezierCurve(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) {\n // from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html\n const p0 = [p0x, p0y];\n const p1 = [p1x, p1y];\n const p2 = [p2x, p2y];\n const p3 = [p3x, p3y];\n let i;\n this.addPoint(p0[0], p0[1]);\n this.addPoint(p3[0], p3[1]);\n const f = (t, i) => Math.pow(1 - t, 3) * p0[i] +\n 3 * Math.pow(1 - t, 2) * t * p1[i] +\n 3 * (1 - t) * Math.pow(t, 2) * p2[i] +\n Math.pow(t, 3) * p3[i];\n for (i = 0; i <= 1; i++) {\n const b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i];\n const a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i];\n const c = 3 * p1[i] - 3 * p0[i];\n if (a === 0) {\n if (b === 0)\n continue;\n const t = -c / b;\n if (0 < t && t < 1) {\n if (i === 0)\n this.addX(f(t, i));\n if (i === 1)\n this.addY(f(t, i));\n }\n continue;\n }\n const b2ac = Math.pow(b, 2) - 4 * c * a;\n if (b2ac < 0)\n continue;\n const t1 = (-b + Math.sqrt(b2ac)) / (2 * a);\n if (0 < t1 && t1 < 1) {\n if (i === 0)\n this.addX(f(t1, i));\n if (i === 1)\n this.addY(f(t1, i));\n }\n const t2 = (-b - Math.sqrt(b2ac)) / (2 * a);\n if (0 < t2 && t2 < 1) {\n if (i === 0)\n this.addX(f(t2, i));\n if (i === 1)\n this.addY(f(t2, i));\n }\n }\n }\n}\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { defined } from './util';\nexport var FontWeight;\n(function (FontWeight) {\n FontWeight[\"NORMAL\"] = \"normal\";\n FontWeight[\"BOLD\"] = \"bold\";\n})(FontWeight || (FontWeight = {}));\nexport var FontStyle;\n(function (FontStyle) {\n FontStyle[\"NORMAL\"] = \"normal\";\n FontStyle[\"ITALIC\"] = \"italic\";\n})(FontStyle || (FontStyle = {}));\n// Internal element for parsing CSS font shorthand strings.\nlet fontParser;\nconst Fonts = {};\nexport class Font {\n /**\n * Use `Font.load(fontName)` to get a Font object.\n * Do not call this constructor directly.\n */\n constructor(fontName) {\n this.name = fontName;\n }\n /**\n * @param fontSize a font size to convert. Can be specified as a CSS length string (e.g., '16pt', '1em')\n * or as a number (the unit is assumed to be 'pt'). See `Font.scaleToPxFrom` for the supported\n * units (e.g., pt, em, %).\n * @returns the number of pixels that is equivalent to `fontSize`\n */\n static convertSizeToPixelValue(fontSize = Font.SIZE) {\n var _a;\n if (typeof fontSize === 'number') {\n // Assume the numeric fontSize is specified in pt.\n return fontSize * Font.scaleToPxFrom.pt;\n }\n else {\n const value = parseFloat(fontSize);\n if (isNaN(value)) {\n return 0;\n }\n const unit = fontSize.replace(/[\\d.\\s]/g, '').toLowerCase(); // Extract the unit by removing all numbers, dots, spaces.\n const conversionFactor = (_a = Font.scaleToPxFrom[unit]) !== null && _a !== void 0 ? _a : 1;\n return value * conversionFactor;\n }\n }\n /**\n * @param fontSize a font size to convert. Can be specified as a CSS length string (e.g., '16pt', '1em')\n * or as a number (the unit is assumed to be 'pt'). See `Font.scaleToPxFrom` for the supported\n * units (e.g., pt, em, %).\n * @returns the number of points that is equivalent to `fontSize`\n */\n static convertSizeToPointValue(fontSize = Font.SIZE) {\n var _a;\n if (typeof fontSize === 'number') {\n // Assume the numeric fontSize is specified in pt.\n return fontSize;\n }\n else {\n const value = parseFloat(fontSize);\n if (isNaN(value)) {\n return 0;\n }\n const unit = fontSize.replace(/[\\d.\\s]/g, '').toLowerCase(); // Extract the unit by removing all numbers, dots, spaces.\n const conversionFactor = ((_a = Font.scaleToPxFrom[unit]) !== null && _a !== void 0 ? _a : 1) / Font.scaleToPxFrom.pt;\n return value * conversionFactor;\n }\n }\n /**\n * @param f\n * @param size\n * @param weight\n * @param style\n * @returns the `size` field will include the units (e.g., '12pt', '16px').\n */\n static validate(f, size, weight, style) {\n // If f is a string but all other arguments are undefined, we assume that\n // f is CSS font shorthand (e.g., 'italic bold 10pt Arial').\n if (typeof f === 'string' && size === undefined && weight === undefined && style === undefined) {\n return Font.fromCSSString(f);\n }\n let family;\n if (typeof f === 'object') {\n // f is a FontInfo object, so we extract its fields.\n family = f.family;\n size = f.size;\n weight = f.weight;\n style = f.style;\n }\n else {\n // f is a string representing the font family name or undefined.\n family = f;\n }\n family = family !== null && family !== void 0 ? family : Font.SANS_SERIF;\n size = size !== null && size !== void 0 ? size : Font.SIZE + 'pt';\n weight = weight !== null && weight !== void 0 ? weight : FontWeight.NORMAL;\n style = style !== null && style !== void 0 ? style : FontStyle.NORMAL;\n if (weight === '') {\n weight = FontWeight.NORMAL;\n }\n if (style === '') {\n style = FontStyle.NORMAL;\n }\n // If size is a number, we assume the unit is `pt`.\n if (typeof size === 'number') {\n size = `${size}pt`;\n }\n // If weight is a number (e.g., 900), turn it into a string representation of that number.\n if (typeof weight === 'number') {\n weight = weight.toString();\n }\n // At this point, `family`, `size`, `weight`, and `style` are all strings.\n return { family, size, weight, style };\n }\n /**\n * @param cssFontShorthand a string formatted as CSS font shorthand (e.g., 'italic bold 15pt Arial').\n */\n static fromCSSString(cssFontShorthand) {\n // Let the browser parse this string for us.\n // First, create a span element.\n // Then, set its style.font and extract it back out.\n if (!fontParser) {\n fontParser = document.createElement('span');\n }\n fontParser.style.font = cssFontShorthand;\n const { fontFamily, fontSize, fontWeight, fontStyle } = fontParser.style;\n return { family: fontFamily, size: fontSize, weight: fontWeight, style: fontStyle };\n }\n /**\n * @returns a CSS font shorthand string of the form `italic bold 16pt Arial`.\n */\n static toCSSString(fontInfo) {\n var _a;\n if (!fontInfo) {\n return '';\n }\n let style;\n const st = fontInfo.style;\n if (st === FontStyle.NORMAL || st === '' || st === undefined) {\n style = ''; // no space! Omit the style section.\n }\n else {\n style = st.trim() + ' ';\n }\n let weight;\n const wt = fontInfo.weight;\n if (wt === FontWeight.NORMAL || wt === '' || wt === undefined) {\n weight = ''; // no space! Omit the weight section.\n }\n else if (typeof wt === 'number') {\n weight = wt + ' ';\n }\n else {\n weight = wt.trim() + ' ';\n }\n let size;\n const sz = fontInfo.size;\n if (sz === undefined) {\n size = Font.SIZE + 'pt ';\n }\n else if (typeof sz === 'number') {\n size = sz + 'pt ';\n }\n else {\n // size is already a string.\n size = sz.trim() + ' ';\n }\n const family = (_a = fontInfo.family) !== null && _a !== void 0 ? _a : Font.SANS_SERIF;\n return `${style}${weight}${size}${family}`;\n }\n /**\n * @param fontSize a number representing a font size, or a string font size with units.\n * @param scaleFactor multiply the size by this factor.\n * @returns size * scaleFactor (e.g., 16pt * 3 = 48pt, 8px * 0.5 = 4px, 24 * 2 = 48).\n * If the fontSize argument was a number, the return value will be a number.\n * If the fontSize argument was a string, the return value will be a string.\n */\n static scaleSize(fontSize, scaleFactor) {\n if (typeof fontSize === 'number') {\n return (fontSize * scaleFactor);\n }\n else {\n const value = parseFloat(fontSize);\n const unit = fontSize.replace(/[\\d.\\s]/g, ''); // Remove all numbers, dots, spaces.\n return `${value * scaleFactor}${unit}`;\n }\n }\n /**\n * @param weight a string (e.g., 'bold') or a number (e.g., 600 / semi-bold in the OpenType spec).\n * @returns true if the font weight indicates bold.\n */\n static isBold(weight) {\n if (!weight) {\n return false;\n }\n else if (typeof weight === 'number') {\n return weight >= 600;\n }\n else {\n // a string can be 'bold' or '700'\n const parsedWeight = parseInt(weight, 10);\n if (isNaN(parsedWeight)) {\n return weight.toLowerCase() === 'bold';\n }\n else {\n return parsedWeight >= 600;\n }\n }\n }\n /**\n * @param style\n * @returns true if the font style indicates 'italic'.\n */\n static isItalic(style) {\n if (!style) {\n return false;\n }\n else {\n return style.toLowerCase() === FontStyle.ITALIC;\n }\n }\n /**\n * @param fontName\n * @param woffURL The absolute or relative URL to the woff file.\n * @param includeWoff2 If true, we assume that a woff2 file is in\n * the same folder as the woff file, and will append a `2` to the url.\n */\n // Support distributions of the typescript compiler that do not yet include the FontFace API declarations.\n // eslint-disable-next-line\n // @ts-ignore\n static loadWebFont(fontName, woffURL, includeWoff2 = true) {\n return __awaiter(this, void 0, void 0, function* () {\n const woff2URL = includeWoff2 ? `url(${woffURL}2) format('woff2'), ` : '';\n const woff1URL = `url(${woffURL}) format('woff')`;\n const woffURLs = woff2URL + woff1URL;\n // eslint-disable-next-line\n // @ts-ignore\n const fontFace = new FontFace(fontName, woffURLs);\n yield fontFace.load();\n // eslint-disable-next-line\n // @ts-ignore\n document.fonts.add(fontFace);\n return fontFace;\n });\n }\n /**\n * Load the web fonts that are used by ChordSymbol. For example, `flow.html` calls:\n * `await Vex.Flow.Font.loadWebFonts();`\n * Alternatively, you may load web fonts with a stylesheet link (e.g., from Google Fonts),\n * and a @font-face { font-family: ... } rule in your CSS.\n * If you do not load either of these fonts, ChordSymbol will fall back to Times or Arial,\n * depending on the current music engraving font.\n *\n * You can customize `Font.WEB_FONT_HOST` and `Font.WEB_FONT_FILES` to load different fonts\n * for your app.\n */\n static loadWebFonts() {\n return __awaiter(this, void 0, void 0, function* () {\n const host = Font.WEB_FONT_HOST;\n const files = Font.WEB_FONT_FILES;\n for (const fontName in files) {\n const fontPath = files[fontName];\n Font.loadWebFont(fontName, host + fontPath);\n }\n });\n }\n static loadTextFonts() {\n //\n }\n /**\n * @param fontName\n * @param data optionally set the Font object's `.data` property.\n * This is usually done when setting up a font for the first time.\n * @param metrics optionally set the Font object's `.metrics` property.\n * This is usually done when setting up a font for the first time.\n * @returns a Font object with the given `fontName`.\n * Reuse an existing Font object if a matching one is found.\n */\n static load(fontName, data, metrics) {\n let font = Fonts[fontName];\n if (!font) {\n font = new Font(fontName);\n Fonts[fontName] = font;\n }\n if (data) {\n font.setData(data);\n }\n if (metrics) {\n font.setMetrics(metrics);\n }\n return font;\n }\n getName() {\n return this.name;\n }\n getData() {\n return defined(this.data, 'FontError', 'Missing font data');\n }\n getMetrics() {\n return defined(this.metrics, 'FontError', 'Missing metrics');\n }\n setData(data) {\n this.data = data;\n }\n setMetrics(metrics) {\n this.metrics = metrics;\n }\n hasData() {\n return this.data !== undefined;\n }\n getResolution() {\n return this.getData().resolution;\n }\n getGlyphs() {\n return this.getData().glyphs;\n }\n /**\n * Use the provided key to look up a value in this font's metrics file (e.g., bravura_metrics.ts, petaluma_metrics.ts).\n * @param key is a string separated by periods (e.g., stave.endPaddingMax, clef.lineCount.'5'.shiftY).\n * @param defaultValue is returned if the lookup fails.\n * @returns the retrieved value (or `defaultValue` if the lookup fails).\n */\n // eslint-disable-next-line\n lookupMetric(key, defaultValue) {\n const keyParts = key.split('.');\n // Start with the top level font metrics object, and keep looking deeper into the object (via each part of the period-delimited key).\n let currObj = this.getMetrics();\n for (let i = 0; i < keyParts.length; i++) {\n const keyPart = keyParts[i];\n const value = currObj[keyPart];\n if (value === undefined) {\n // If the key lookup fails, we fall back to the defaultValue.\n return defaultValue;\n }\n // The most recent lookup succeeded, so we drill deeper into the object.\n currObj = value;\n }\n // After checking every part of the key (i.e., the loop completed), return the most recently retrieved value.\n return currObj;\n }\n /** For debugging. */\n toString() {\n return '[' + this.name + ' Font]';\n }\n}\n//////////////////////////////////////////////////////////////////////////////////////////////////\n// STATIC MEMBERS\n/** Default sans-serif font family. */\nFont.SANS_SERIF = 'Arial, sans-serif';\n/** Default serif font family. */\nFont.SERIF = 'Times New Roman, serif';\n/** Default font size in `pt`. */\nFont.SIZE = 10;\n// CSS Font Sizes: 36pt == 48px == 3em == 300% == 0.5in\n/** Given a length (for units: pt, px, em, %, in, mm, cm) what is the scale factor to convert it to px? */\nFont.scaleToPxFrom = {\n pt: 4 / 3,\n px: 1,\n em: 16,\n '%': 4 / 25,\n in: 96,\n mm: 96 / 25.4,\n cm: 96 / 2.54,\n};\n/**\n * Customize this field to specify a different CDN for delivering web fonts.\n * Alternative: https://cdn.jsdelivr.net/npm/vexflow-fonts@1.0.3/\n * Or you can use your own host.\n */\nFont.WEB_FONT_HOST = 'https://unpkg.com/vexflow-fonts@1.0.3/';\n/**\n * These font files will be loaded from the CDN specified by `Font.WEB_FONT_HOST` when\n * `await Font.loadWebFonts()` is called. Customize this field to specify a different\n * set of fonts to load. See: `Font.loadWebFonts()`.\n */\nFont.WEB_FONT_FILES = {\n 'Roboto Slab': 'robotoslab/RobotoSlab-Medium_2.001.woff',\n PetalumaScript: 'petaluma/PetalumaScript_1.10_FS.woff',\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Mohit Cheppudira\n//\n// ## Description\n//\n// This file implements a registry for VexFlow elements. It allows users\n// to track, query, and manage some subset of generated elements, and\n// dynamically get and set attributes.\n//\n// There are two ways to register with a registry:\n//\n// 1) Explicitly call `registry.register(elem:Element, id?:string)`, or,\n// 2) Call `Registry.enableDefaultRegistry(registry)` when ready, and all future\n// elements will automatically register with it.\n//\n// Once an element is registered, selected attributes are tracked and indexed by\n// the registry. This allows fast look up of elements by attributes like id, type,\n// and class.\nimport { RuntimeError } from './util';\n// Indexes are represented as maps of maps of maps. This allows\n// for both multi-labeling (e.g., an element can have multiple classes)\n// and efficient lookup.\nclass Index {\n constructor() {\n this.id = {};\n this.type = {};\n this.class = {};\n }\n}\nexport class Registry {\n constructor() {\n this.index = new Index();\n }\n static getDefaultRegistry() {\n return Registry.defaultRegistry;\n }\n // If you call `enableDefaultRegistry`, any new elements will auto-register with\n // the provided registry as soon as they're constructed.\n static enableDefaultRegistry(registry) {\n Registry.defaultRegistry = registry;\n }\n static disableDefaultRegistry() {\n Registry.defaultRegistry = undefined;\n }\n clear() {\n this.index = new Index();\n return this;\n }\n setIndexValue(name, value, id, elem) {\n const index = this.index;\n if (!index[name][value]) {\n index[name][value] = {};\n }\n index[name][value][id] = elem;\n }\n // Updates the indexes for element 'id'. If an element's attribute changes\n // from A -> B, make sure to remove the element from A.\n updateIndex({ id, name, value, oldValue }) {\n const elem = this.getElementById(id);\n if (oldValue !== undefined && this.index[name][oldValue]) {\n delete this.index[name][oldValue][id];\n }\n if (value && elem) {\n this.setIndexValue(name, value, elem.getAttribute('id'), elem);\n }\n }\n /**\n * Register element `elem` with this registry.\n * This adds the element to its index and watches it for attribute changes.\n * @param elem\n * @param id\n * @returns this\n */\n register(elem, id) {\n id = id || elem.getAttribute('id');\n if (!id) {\n throw new RuntimeError(\"Can't add element without `id` attribute to registry\");\n }\n // Manually add id to index, then update other indexes.\n elem.setAttribute('id', id);\n this.setIndexValue('id', id, id, elem);\n this.updateIndex({ id, name: 'type', value: elem.getAttribute('type'), oldValue: undefined });\n elem.onRegister(this);\n return this;\n }\n getElementById(id) {\n var _a, _b;\n return (_b = (_a = this.index.id) === null || _a === void 0 ? void 0 : _a[id]) === null || _b === void 0 ? void 0 : _b[id]; // return undefined if the id is not found.\n }\n getElementsByAttribute(attribute, value) {\n const index_attr = this.index[attribute];\n if (index_attr) {\n const index_attr_val = index_attr[value];\n if (index_attr_val) {\n const keys = Object.keys(index_attr_val);\n return keys.map((k) => index_attr_val[k]);\n }\n }\n return [];\n }\n getElementsByType(type) {\n return this.getElementsByAttribute('type', type);\n }\n getElementsByClass(className) {\n return this.getElementsByAttribute('class', className);\n }\n // This is called by the element when an attribute value changes. If an indexed\n // attribute changes, then update the local index.\n onUpdate(info) {\n const allowedNames = ['id', 'type', 'class'];\n if (allowedNames.includes(info.name)) {\n this.updateIndex(info);\n }\n return this;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Mohit Cheppudira\n// MIT License\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Registry } from './registry';\nimport { Category } from './typeguard';\nimport { defined } from './util';\n/**\n * Element implements a generic base class for VexFlow, with implementations\n * of general functions and properties that can be inherited by all VexFlow elements.\n */\nexport class Element {\n constructor() {\n var _a;\n this.attrs = {\n id: Element.newID(),\n el: undefined,\n type: this.getCategory(),\n classes: {},\n };\n this.rendered = false;\n // If a default registry exist, then register with it right away.\n (_a = Registry.getDefaultRegistry()) === null || _a === void 0 ? void 0 : _a.register(this);\n }\n static get CATEGORY() {\n return Category.Element;\n }\n static newID() {\n return `auto${Element.ID++}`;\n }\n /** Get element category string. */\n getCategory() {\n return this.constructor.CATEGORY;\n }\n /**\n * Set the element style used to render.\n *\n * Example:\n * ```typescript\n * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' });\n * element.draw();\n * ```\n * Note: If the element draws additional sub-elements (ie.: Modifiers in a Stave),\n * the style can be applied to all of them by means of the context:\n * ```typescript\n * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' });\n * element.getContext().setFillStyle('red');\n * element.getContext().setStrokeStyle('red');\n * element.draw();\n * ```\n * or using drawWithStyle:\n * ```typescript\n * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' });\n * element.drawWithStyle();\n * ```\n */\n setStyle(style) {\n this.style = style;\n return this;\n }\n /** Get the element style used for rendering. */\n getStyle() {\n return this.style;\n }\n /** Apply the element style to `context`. */\n applyStyle(context = this.context, style = this.getStyle()) {\n if (!style)\n return this;\n if (!context)\n return this;\n context.save();\n if (style.shadowColor)\n context.setShadowColor(style.shadowColor);\n if (style.shadowBlur)\n context.setShadowBlur(style.shadowBlur);\n if (style.fillStyle)\n context.setFillStyle(style.fillStyle);\n if (style.strokeStyle)\n context.setStrokeStyle(style.strokeStyle);\n if (style.lineWidth)\n context.setLineWidth(style.lineWidth);\n return this;\n }\n /** Restore the style of `context`. */\n restoreStyle(context = this.context, style = this.getStyle()) {\n if (!style)\n return this;\n if (!context)\n return this;\n context.restore();\n return this;\n }\n /**\n * Draw the element and all its sub-elements (ie.: Modifiers in a Stave)\n * with the element style.\n */\n drawWithStyle() {\n this.checkContext();\n this.applyStyle();\n this.draw();\n this.restoreStyle();\n }\n /** Check if it has a class label (An element can have multiple class labels). */\n hasClass(className) {\n return this.attrs.classes[className] === true;\n }\n /** Add a class label (An element can have multiple class labels). */\n addClass(className) {\n var _a;\n this.attrs.classes[className] = true;\n (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({\n id: this.attrs.id,\n name: 'class',\n value: className,\n oldValue: undefined,\n });\n return this;\n }\n /** Remove a class label (An element can have multiple class labels). */\n removeClass(className) {\n var _a;\n delete this.attrs.classes[className];\n (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({\n id: this.attrs.id,\n name: 'class',\n value: undefined,\n oldValue: className,\n });\n return this;\n }\n /** Call back from registry after the element is registered. */\n onRegister(registry) {\n this.registry = registry;\n return this;\n }\n /** Return the rendered status. */\n isRendered() {\n return this.rendered;\n }\n /** Set the rendered status. */\n setRendered(rendered = true) {\n this.rendered = rendered;\n return this;\n }\n /** Return the element attributes. */\n getAttributes() {\n return this.attrs;\n }\n /** Return an attribute. */\n // eslint-disable-next-line\n getAttribute(name) {\n return this.attrs[name];\n }\n /** Set an attribute. */\n // eslint-disable-next-line\n setAttribute(name, value) {\n var _a;\n const oldID = this.attrs.id;\n const oldValue = this.attrs[name];\n this.attrs[name] = value;\n // Register with old id to support id changes.\n (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({ id: oldID, name, value, oldValue });\n return this;\n }\n /** Get the boundingBox. */\n getBoundingBox() {\n return this.boundingBox;\n }\n /** Return the context. */\n getContext() {\n return this.context;\n }\n /** Set the context. */\n setContext(context) {\n this.context = context;\n return this;\n }\n /** Validate and return the context. */\n checkContext() {\n return defined(this.context, 'NoContext', 'No rendering context attached to instance.');\n }\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // Font Handling\n /**\n * Provide a CSS compatible font string (e.g., 'bold 16px Arial').\n */\n set font(f) {\n this.setFont(f);\n }\n /** Returns the CSS compatible font string. */\n get font() {\n return Font.toCSSString(this.textFont);\n }\n /**\n * Set the element's font family, size, weight, style (e.g., `Arial`, `10pt`, `bold`, `italic`).\n * @param font is 1) a `FontInfo` object or\n * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or\n * 3) a string representing the font family (at least one of `size`, `weight`, or `style` must also be provided).\n * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt').\n * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900).\n * @param style is a string (e.g., 'italic', 'normal').\n * If no arguments are provided, then the font is set to the default font.\n * Each Element subclass may specify its own default by overriding the static `TEXT_FONT` property.\n */\n setFont(font, size, weight, style) {\n // Allow subclasses to override `TEXT_FONT`.\n const defaultTextFont = this.constructor.TEXT_FONT;\n const fontIsObject = typeof font === 'object';\n const fontIsString = typeof font === 'string';\n const fontIsUndefined = font === undefined;\n const sizeWeightStyleAreUndefined = size === undefined && weight === undefined && style === undefined;\n if (fontIsObject) {\n // `font` is case 1) a FontInfo object\n this.textFont = Object.assign(Object.assign({}, defaultTextFont), font);\n }\n else if (fontIsString && sizeWeightStyleAreUndefined) {\n // `font` is case 2) CSS font shorthand.\n this.textFont = Font.fromCSSString(font);\n }\n else if (fontIsUndefined && sizeWeightStyleAreUndefined) {\n // All arguments are undefined. Do not check for `arguments.length === 0`,\n // which fails on the edge case: `setFont(undefined)`.\n // TODO: See if we can remove this case entirely without introducing a visual diff.\n // The else case below seems like it should be equivalent to this case.\n this.textFont = Object.assign({}, defaultTextFont);\n }\n else {\n // `font` is case 3) a font family string (e.g., 'Times New Roman').\n // The other parameters represent the size, weight, and style.\n // It is okay for `font` to be undefined while one or more of the other arguments is provided.\n // Following CSS conventions, unspecified params are reset to the default.\n this.textFont = Font.validate(font !== null && font !== void 0 ? font : defaultTextFont.family, size !== null && size !== void 0 ? size : defaultTextFont.size, weight !== null && weight !== void 0 ? weight : defaultTextFont.weight, style !== null && style !== void 0 ? style : defaultTextFont.style);\n }\n return this;\n }\n getFont() {\n if (!this.textFont) {\n this.resetFont();\n }\n return Font.toCSSString(this.textFont);\n }\n /**\n * Reset the text font to the style indicated by the static `TEXT_FONT` property.\n * Subclasses can call this to initialize `textFont` for the first time.\n */\n resetFont() {\n this.setFont();\n }\n /** Return a copy of the current FontInfo object. */\n get fontInfo() {\n if (!this.textFont) {\n this.resetFont();\n }\n // We can cast to Required here, because\n // we just called resetFont() above to ensure this.textFont is set.\n return Object.assign({}, this.textFont);\n }\n set fontInfo(fontInfo) {\n this.setFont(fontInfo);\n }\n /** Change the font size, while keeping everything else the same. */\n setFontSize(size) {\n const fontInfo = this.fontInfo;\n this.setFont(fontInfo.family, size, fontInfo.weight, fontInfo.style);\n return this;\n }\n /**\n * @returns a CSS font-size string (e.g., '18pt', '12px', '1em').\n * See Element.fontSizeInPixels or Element.fontSizeInPoints if you need to get a number for calculation purposes.\n */\n getFontSize() {\n return this.fontSize;\n }\n /**\n * The size is 1) a string of the form '10pt' or '16px', compatible with the CSS font-size property.\n * or 2) a number, which is interpreted as a point size (i.e. 12 == '12pt').\n */\n set fontSize(size) {\n this.setFontSize(size);\n }\n /**\n * @returns a CSS font-size string (e.g., '18pt', '12px', '1em').\n */\n get fontSize() {\n let size = this.fontInfo.size;\n if (typeof size === 'number') {\n size = `${size}pt`;\n }\n return size;\n }\n /**\n * @returns the font size in `pt`.\n */\n get fontSizeInPoints() {\n return Font.convertSizeToPointValue(this.fontSize);\n }\n /**\n * @returns the font size in `px`.\n */\n get fontSizeInPixels() {\n return Font.convertSizeToPixelValue(this.fontSize);\n }\n /**\n * @returns a CSS font-style string (e.g., 'italic').\n */\n get fontStyle() {\n return this.fontInfo.style;\n }\n set fontStyle(style) {\n const fontInfo = this.fontInfo;\n this.setFont(fontInfo.family, fontInfo.size, fontInfo.weight, style);\n }\n /**\n * @returns a CSS font-weight string (e.g., 'bold').\n * As in CSS, font-weight is always returned as a string, even if it was set as a number.\n */\n get fontWeight() {\n return this.fontInfo.weight + '';\n }\n set fontWeight(weight) {\n const fontInfo = this.fontInfo;\n this.setFont(fontInfo.family, fontInfo.size, weight, fontInfo.style);\n }\n}\nElement.ID = 1000;\n/**\n * Default font for text. This is not related to music engraving. Instead, see `Flow.setMusicFont(...fontNames)`\n * to customize the font for musical symbols placed on the score.\n */\nElement.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: Font.SIZE,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { BoundingBox } from './boundingbox';\nimport { BoundingBoxComputation } from './boundingboxcomputation';\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nexport var OutlineCode;\n(function (OutlineCode) {\n OutlineCode[OutlineCode[\"MOVE\"] = 0] = \"MOVE\";\n OutlineCode[OutlineCode[\"LINE\"] = 1] = \"LINE\";\n OutlineCode[OutlineCode[\"QUADRATIC\"] = 2] = \"QUADRATIC\";\n OutlineCode[OutlineCode[\"BEZIER\"] = 3] = \"BEZIER\";\n})(OutlineCode || (OutlineCode = {}));\nclass GlyphCacheEntry {\n constructor(fontStack, code, category) {\n this.point = -1;\n this.metrics = Glyph.loadMetrics(fontStack, code, category);\n this.bbox = Glyph.getOutlineBoundingBox(this.metrics.outline, this.metrics.scale, this.metrics.x_shift, this.metrics.y_shift);\n if (category) {\n this.point = Glyph.lookupFontMetric(this.metrics.font, category, code, 'point', -1);\n }\n }\n}\nclass GlyphCache {\n constructor() {\n this.cache = new Map();\n }\n lookup(code, category) {\n let entries = this.cache.get(Glyph.CURRENT_CACHE_KEY);\n if (entries === undefined) {\n entries = {};\n this.cache.set(Glyph.CURRENT_CACHE_KEY, entries);\n }\n const key = category ? `${code}%${category}` : code;\n let entry = entries[key];\n if (entry === undefined) {\n entry = new GlyphCacheEntry(Glyph.MUSIC_FONT_STACK, code, category);\n entries[key] = entry;\n }\n return entry;\n }\n}\nclass GlyphOutline {\n constructor(outline, originX, originY, scale) {\n this.outline = outline;\n this.originX = originX;\n this.originY = originY;\n this.scale = scale;\n this.i = 0;\n // Automatically assign private properties: this.outline, this.originX, this.originY, and this.scale.\n }\n done() {\n return this.i >= this.outline.length;\n }\n next() {\n return this.outline[this.i++];\n }\n nextX() {\n return this.originX + this.outline[this.i++] * this.scale;\n }\n nextY() {\n return this.originY - this.outline[this.i++] * this.scale;\n }\n static parse(str) {\n const result = [];\n const parts = str.split(' ');\n let i = 0;\n while (i < parts.length) {\n switch (parts[i++]) {\n case 'm':\n result.push(OutlineCode.MOVE, parseInt(parts[i++]), parseInt(parts[i++]));\n break;\n case 'l':\n result.push(OutlineCode.LINE, parseInt(parts[i++]), parseInt(parts[i++]));\n break;\n case 'q':\n result.push(OutlineCode.QUADRATIC, parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]));\n break;\n case 'b':\n result.push(OutlineCode.BEZIER, parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]));\n break;\n }\n }\n return result;\n }\n}\nexport class Glyph extends Element {\n /**\n * @param code\n * @param point\n * @param options\n */\n constructor(code, point, options) {\n super();\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // INSTANCE MEMBERS\n this.bbox = new BoundingBox(0, 0, 0, 0);\n this.topGlyphs = [];\n this.botGlyphs = [];\n this.options = {};\n this.scale = 1;\n this.code = code;\n this.point = point;\n this.originShift = { x: 0, y: 0 };\n this.x_shift = 0;\n this.y_shift = 0;\n if (options) {\n this.setOptions(options);\n }\n else {\n this.reset();\n }\n }\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // STATIC MEMBERS\n static get CATEGORY() {\n return Category.Glyph;\n }\n /**\n * Pass a key of the form `glyphs.{category}.{code}.{key}` to Font.lookupMetric(). If the initial lookup fails,\n * try again with the path `glyphs.{category}.{key}`. If the second lookup fails, return the defaultValue.\n *\n * @param font\n * @param category any metric path under 'glyphs', so 'stem.up' could resolve to glyphs.stem.up.shiftX, glyphs.stem.up.shiftY, etc.\n * @param code\n * @param key\n * @param defaultValue\n */\n static lookupFontMetric(font, category, code, key, defaultValue) {\n let value = font.lookupMetric(`glyphs.${category}.${code}.${key}`, undefined);\n if (value === undefined) {\n // The first lookup failed, so we omit .${code} and try again (with a defaultValue this time).\n value = font.lookupMetric(`glyphs.${category}.${key}`, defaultValue);\n }\n return value;\n }\n static lookupGlyph(fontStack, code) {\n defined(fontStack, 'BadFontStack', 'Font stack is misconfigured');\n let glyph;\n let font;\n for (let i = 0; i < fontStack.length; i++) {\n font = fontStack[i];\n glyph = font.getGlyphs()[code];\n if (glyph)\n return { glyph, font };\n }\n throw new RuntimeError('BadGlyph', `Glyph ${code} does not exist in font.`);\n }\n static loadMetrics(fontStack, code, category) {\n const { glyph, font } = Glyph.lookupGlyph(fontStack, code);\n if (!glyph.o)\n throw new RuntimeError('BadGlyph', `Glyph ${code} has no outline defined.`);\n let x_shift = 0;\n let y_shift = 0;\n let scale = 1;\n if (category && font) {\n x_shift = Glyph.lookupFontMetric(font, category, code, 'shiftX', 0);\n y_shift = Glyph.lookupFontMetric(font, category, code, 'shiftY', 0);\n scale = Glyph.lookupFontMetric(font, category, code, 'scale', 1);\n }\n const x_min = glyph.x_min;\n const x_max = glyph.x_max;\n const ha = glyph.ha;\n if (!glyph.cached_outline) {\n glyph.cached_outline = GlyphOutline.parse(glyph.o);\n }\n return {\n x_min,\n x_max,\n x_shift,\n y_shift,\n scale,\n ha,\n outline: glyph.cached_outline,\n font,\n width: x_max - x_min,\n height: ha,\n };\n }\n /**\n * Renders glyphs from the default font stack.\n *\n * @param ctx Canvas or SVG context\n * @param x_pos x coordinate\n * @param y_pos y coordinate\n * @param point the point size of the font\n * @param code the glyph code in font.getGlyphs()\n * @param options\n * @returns\n */\n static renderGlyph(ctx, x_pos, y_pos, point, code, options) {\n var _a;\n const data = Glyph.cache.lookup(code, options === null || options === void 0 ? void 0 : options.category);\n const metrics = data.metrics;\n if (data.point != -1) {\n point = data.point;\n }\n const customScale = (_a = options === null || options === void 0 ? void 0 : options.scale) !== null && _a !== void 0 ? _a : 1;\n const scale = ((point * 72.0) / (metrics.font.getResolution() * 100.0)) * metrics.scale * customScale;\n Glyph.renderOutline(ctx, metrics.outline, scale, x_pos + metrics.x_shift * customScale, y_pos + metrics.y_shift * customScale);\n return metrics;\n }\n static renderOutline(ctx, outline, scale, x_pos, y_pos) {\n const go = new GlyphOutline(outline, x_pos, y_pos, scale);\n ctx.beginPath();\n let x, y;\n while (!go.done()) {\n switch (go.next()) {\n case OutlineCode.MOVE:\n ctx.moveTo(go.nextX(), go.nextY());\n break;\n case OutlineCode.LINE:\n ctx.lineTo(go.nextX(), go.nextY());\n break;\n case OutlineCode.QUADRATIC:\n x = go.nextX();\n y = go.nextY();\n ctx.quadraticCurveTo(go.nextX(), go.nextY(), x, y);\n break;\n case OutlineCode.BEZIER:\n x = go.nextX();\n y = go.nextY();\n ctx.bezierCurveTo(go.nextX(), go.nextY(), go.nextX(), go.nextY(), x, y);\n break;\n }\n }\n ctx.fill();\n }\n static getOutlineBoundingBox(outline, scale, x_pos, y_pos) {\n const go = new GlyphOutline(outline, x_pos, y_pos, scale);\n const bboxComp = new BoundingBoxComputation();\n // (penX, penY) hold the pen position: the start of each stroke.\n let penX = x_pos;\n let penY = y_pos;\n let x, y;\n while (!go.done()) {\n switch (go.next()) {\n case OutlineCode.MOVE:\n // Note that we don't add any points to the bounding box until a srroke is actually drawn.\n penX = go.nextX();\n penY = go.nextY();\n break;\n case OutlineCode.LINE:\n bboxComp.addPoint(penX, penY);\n penX = go.nextX();\n penY = go.nextY();\n bboxComp.addPoint(penX, penY);\n break;\n case OutlineCode.QUADRATIC:\n x = go.nextX();\n y = go.nextY();\n bboxComp.addQuadraticCurve(penX, penY, go.nextX(), go.nextY(), x, y);\n penX = x;\n penY = y;\n break;\n case OutlineCode.BEZIER:\n x = go.nextX();\n y = go.nextY();\n bboxComp.addBezierCurve(penX, penY, go.nextX(), go.nextY(), go.nextX(), go.nextY(), x, y);\n penX = x;\n penY = y;\n break;\n }\n }\n return new BoundingBox(bboxComp.getX1(), bboxComp.getY1(), bboxComp.width(), bboxComp.height());\n }\n static getWidth(code, point, category) {\n const data = Glyph.cache.lookup(code, category);\n if (data.point != -1) {\n point = data.point;\n }\n const scale = (point * 72) / (data.metrics.font.getResolution() * 100);\n return data.bbox.getW() * scale;\n }\n // eslint-disable-next-line\n draw(...args) {\n // DO NOTHING.\n }\n getCode() {\n return this.code;\n }\n // eslint-disable-next-line\n setOptions(options) {\n this.options = Object.assign(Object.assign({}, this.options), options);\n this.reset();\n }\n setPoint(point) {\n this.point = point;\n return this;\n }\n setStave(stave) {\n this.stave = stave;\n return this;\n }\n setXShift(x_shift) {\n this.x_shift = x_shift;\n return this;\n }\n setYShift(y_shift) {\n this.y_shift = y_shift;\n return this;\n }\n reset() {\n const data = Glyph.cache.lookup(this.code, this.options.category);\n this.metrics = data.metrics;\n // Override point from metrics file\n if (data.point != -1) {\n this.point = data.point;\n }\n this.scale = (this.point * 72) / (this.metrics.font.getResolution() * 100);\n this.bbox = new BoundingBox(data.bbox.getX() * this.scale, data.bbox.getY() * this.scale, data.bbox.getW() * this.scale, data.bbox.getH() * this.scale);\n }\n checkMetrics() {\n return defined(this.metrics, 'BadGlyph', `Glyph ${this.code} is not initialized.`);\n }\n getMetrics() {\n const metrics = this.checkMetrics();\n const metricsScale = metrics.scale;\n return {\n x_min: metrics.x_min * this.scale * metricsScale,\n x_max: metrics.x_max * this.scale * metricsScale,\n width: this.bbox.getW(),\n height: this.bbox.getH(),\n scale: this.scale * metricsScale,\n x_shift: metrics.x_shift,\n y_shift: metrics.y_shift,\n outline: metrics.outline,\n font: metrics.font,\n ha: metrics.ha,\n };\n }\n setOriginX(x) {\n const { bbox } = this;\n const originX = Math.abs(bbox.getX() / bbox.getW());\n const xShift = (x - originX) * bbox.getW();\n this.originShift.x = -xShift;\n }\n setOriginY(y) {\n const { bbox } = this;\n const originY = Math.abs(bbox.getY() / bbox.getH());\n const yShift = (y - originY) * bbox.getH();\n this.originShift.y = -yShift;\n }\n setOrigin(x, y) {\n this.setOriginX(x);\n this.setOriginY(y);\n }\n render(ctx, x, y) {\n const metrics = this.checkMetrics();\n const outline = metrics.outline;\n const scale = this.scale * metrics.scale;\n this.setRendered();\n this.applyStyle(ctx);\n const xPos = x + this.originShift.x + metrics.x_shift;\n const yPos = y + this.originShift.y + metrics.y_shift;\n Glyph.renderOutline(ctx, outline, scale, xPos, yPos);\n this.restoreStyle(ctx);\n }\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n renderToStave(x) {\n const context = this.checkContext();\n const metrics = this.checkMetrics();\n const stave = this.checkStave();\n const outline = metrics.outline;\n const scale = this.scale * metrics.scale;\n this.setRendered();\n this.applyStyle();\n const xPos = x + this.x_shift + metrics.x_shift;\n const yPos = stave.getYForGlyphs() + this.y_shift + metrics.y_shift;\n Glyph.renderOutline(context, outline, scale, xPos, yPos);\n this.restoreStyle();\n }\n}\nGlyph.cache = new GlyphCache();\n// The current cache key for GlyphCache above.\n// Computed when Flow.setMusicFont(...) is called.\n// It is set to a comma separated list of font names.\nGlyph.CURRENT_CACHE_KEY = '';\n// Used by the GlyphCache above.\n// Set when Flow.setMusicFont(...) is called.\nGlyph.MUSIC_FONT_STACK = [];\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nexport var ModifierPosition;\n(function (ModifierPosition) {\n ModifierPosition[ModifierPosition[\"CENTER\"] = 0] = \"CENTER\";\n ModifierPosition[ModifierPosition[\"LEFT\"] = 1] = \"LEFT\";\n ModifierPosition[ModifierPosition[\"RIGHT\"] = 2] = \"RIGHT\";\n ModifierPosition[ModifierPosition[\"ABOVE\"] = 3] = \"ABOVE\";\n ModifierPosition[ModifierPosition[\"BELOW\"] = 4] = \"BELOW\";\n})(ModifierPosition || (ModifierPosition = {}));\n// To enable logging for this class. Set `Vex.Flow.Modifier.DEBUG` to `true`.\n// function L(...args) { if (Modifier.DEBUG) log('Vex.Flow.Modifier', args); }\n/**\n * `Modifier` is an abstract interface for notational elements that modify\n * a `Note`. Examples of modifiers are `Accidental`, `Annotation`, `Stroke`, etc.\n *\n * For a `Modifier` instance to be positioned correctly, it must be part of\n * a `ModifierContext`. All modifiers in the same context are rendered relative to\n * one another.\n *\n * Typically, all modifiers to a note are part of the same `ModifierContext` instance. Also,\n * in multi-voice staves, all modifiers to notes on the same `tick` are part of the same\n * `ModifierContext`. This ensures that multiple voices don't trample all over each other.\n */\nexport class Modifier extends Element {\n constructor() {\n super();\n this.width = 0;\n // The `text_line` is reserved space above or below a stave.\n this.text_line = 0;\n this.position = Modifier.Position.LEFT;\n this.x_shift = 0;\n this.y_shift = 0;\n this.spacingFromNextModifier = 0;\n }\n /**\n * Modifiers category string. Every modifier has a different category.\n * The `ModifierContext` uses this to determine the type and order of the modifiers.\n */\n static get CATEGORY() {\n return Category.Modifier;\n }\n /** Modifiers can be positioned almost anywhere, relative to a note. */\n static get Position() {\n return ModifierPosition;\n }\n static get PositionString() {\n return {\n center: ModifierPosition.CENTER,\n above: ModifierPosition.ABOVE,\n below: ModifierPosition.BELOW,\n left: ModifierPosition.LEFT,\n right: ModifierPosition.RIGHT,\n };\n }\n /** Called when position changes. */\n reset() {\n // DO NOTHING.\n }\n /** Get modifier widths. */\n getWidth() {\n return this.width;\n }\n /** Set modifier widths. */\n setWidth(width) {\n this.width = width;\n return this;\n }\n /** Get attached note (`StaveNote`, `TabNote`, etc.) */\n getNote() {\n return defined(this.note, 'NoNote', 'Modifier has no note.');\n }\n /**\n * Used in draw() to check and get the attached note (`StaveNote`, `TabNote`, etc.).\n * Also verifies that the index is valid.\n */\n checkAttachedNote() {\n const category = this.getCategory();\n defined(this.index, 'NoIndex', `Can't draw ${category} without an index.`);\n return defined(this.note, 'NoNote', `Can't draw ${category} without a note.`);\n }\n /**\n * Set attached note.\n * @param note (`StaveNote`, `TabNote`, etc.)\n */\n setNote(note) {\n this.note = note;\n return this;\n }\n /** Get note index, which is a specific note in a chord. */\n getIndex() {\n return this.index;\n }\n /** Check and get note index, which is a specific note in a chord. */\n checkIndex() {\n return defined(this.index, 'NoIndex', 'Modifier has an invalid index.');\n }\n /** Set note index, which is a specific note in a chord. */\n setIndex(index) {\n this.index = index;\n return this;\n }\n /** Get `ModifierContext`. */\n getModifierContext() {\n return this.modifierContext;\n }\n /** Check and get `ModifierContext`. */\n checkModifierContext() {\n return defined(this.modifierContext, 'NoModifierContext', 'Modifier Context Required');\n }\n /** Every modifier must be part of a `ModifierContext`. */\n setModifierContext(c) {\n this.modifierContext = c;\n return this;\n }\n /** Get position. */\n getPosition() {\n return this.position;\n }\n /**\n * Set position.\n * @param position CENTER | LEFT | RIGHT | ABOVE | BELOW\n */\n setPosition(position) {\n this.position = typeof position === 'string' ? Modifier.PositionString[position] : position;\n this.reset();\n return this;\n }\n /** Set the `text_line` for the modifier. */\n setTextLine(line) {\n this.text_line = line;\n return this;\n }\n /** Shift modifier down `y` pixels. Negative values shift up. */\n setYShift(y) {\n this.y_shift = y;\n return this;\n }\n /** Set spacing from next modifier. */\n setSpacingFromNextModifier(x) {\n this.spacingFromNextModifier = x;\n }\n /** Get spacing from next modifier. */\n getSpacingFromNextModifier() {\n return this.spacingFromNextModifier;\n }\n /**\n * Shift modifier `x` pixels in the direction of the modifier. Negative values\n * shift reverse.\n */\n setXShift(x) {\n this.x_shift = 0;\n if (this.position === Modifier.Position.LEFT) {\n this.x_shift -= x;\n }\n else {\n this.x_shift += x;\n }\n return this;\n }\n /** Get shift modifier `x` */\n getXShift() {\n return this.x_shift;\n }\n /** Render the modifier onto the canvas. */\n draw() {\n this.checkContext();\n throw new RuntimeError('NotImplemented', 'draw() not implemented for this modifier.');\n }\n // aligns sub notes of NoteSubGroup (or GraceNoteGroup) to the main note with correct x-offset\n alignSubNotesWithNote(subNotes, note) {\n // Shift over the tick contexts of each note\n const tickContext = note.getTickContext();\n const metrics = tickContext.getMetrics();\n const stave = note.getStave();\n const subNoteXOffset = tickContext.getX() - metrics.modLeftPx - metrics.modRightPx + this.getSpacingFromNextModifier();\n subNotes.forEach((subNote) => {\n const subTickContext = subNote.getTickContext();\n if (stave)\n subNote.setStave(stave);\n subTickContext.setXOffset(subNoteXOffset); // don't touch baseX to avoid shift each render\n });\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { RuntimeError } from './util';\n/** Music implements some standard music theory routines. */\nexport class Music {\n /** Number of an canonical notes (12). */\n static get NUM_TONES() {\n return this.canonical_notes.length;\n }\n /** Names of root notes ('c', 'd',...) */\n static get roots() {\n return ['c', 'd', 'e', 'f', 'g', 'a', 'b'];\n }\n /** Values of the root notes.*/\n static get root_values() {\n return [0, 2, 4, 5, 7, 9, 11];\n }\n /** Indices of the root notes.*/\n static get root_indices() {\n return {\n c: 0,\n d: 1,\n e: 2,\n f: 3,\n g: 4,\n a: 5,\n b: 6,\n };\n }\n /** Names of canonical notes ('c', 'c#', 'd',...). */\n static get canonical_notes() {\n return ['c', 'c#', 'd', 'd#', 'e', 'f', 'f#', 'g', 'g#', 'a', 'a#', 'b'];\n }\n /** Names of diatonic intervals ('unison', 'm2', 'M2',...). */\n static get diatonic_intervals() {\n return ['unison', 'm2', 'M2', 'm3', 'M3', 'p4', 'dim5', 'p5', 'm6', 'M6', 'b7', 'M7', 'octave'];\n }\n /** NoteAccidental associated to diatonic intervals. */\n static get diatonic_accidentals() {\n return {\n unison: { note: 0, accidental: 0 },\n m2: { note: 1, accidental: -1 },\n M2: { note: 1, accidental: 0 },\n m3: { note: 2, accidental: -1 },\n M3: { note: 2, accidental: 0 },\n p4: { note: 3, accidental: 0 },\n dim5: { note: 4, accidental: -1 },\n p5: { note: 4, accidental: 0 },\n m6: { note: 5, accidental: -1 },\n M6: { note: 5, accidental: 0 },\n b7: { note: 6, accidental: -1 },\n M7: { note: 6, accidental: 0 },\n octave: { note: 7, accidental: 0 },\n };\n }\n /** Semitones shift associated to intervals .*/\n static get intervals() {\n return {\n u: 0,\n unison: 0,\n m2: 1,\n b2: 1,\n min2: 1,\n S: 1,\n H: 1,\n 2: 2,\n M2: 2,\n maj2: 2,\n T: 2,\n W: 2,\n m3: 3,\n b3: 3,\n min3: 3,\n M3: 4,\n 3: 4,\n maj3: 4,\n 4: 5,\n p4: 5,\n '#4': 6,\n b5: 6,\n aug4: 6,\n dim5: 6,\n 5: 7,\n p5: 7,\n '#5': 8,\n b6: 8,\n aug5: 8,\n 6: 9,\n M6: 9,\n maj6: 9,\n b7: 10,\n m7: 10,\n min7: 10,\n dom7: 10,\n M7: 11,\n maj7: 11,\n 8: 12,\n octave: 12,\n };\n }\n /** Semitones shifts associated with scales. */\n static get scales() {\n return {\n major: [2, 2, 1, 2, 2, 2, 1],\n minor: [2, 1, 2, 2, 1, 2, 2],\n ionian: [2, 2, 1, 2, 2, 2, 1],\n dorian: [2, 1, 2, 2, 2, 1, 2],\n phyrgian: [1, 2, 2, 2, 1, 2, 2],\n lydian: [2, 2, 2, 1, 2, 2, 1],\n mixolydian: [2, 2, 1, 2, 2, 1, 2],\n aeolian: [2, 1, 2, 2, 1, 2, 2],\n locrian: [1, 2, 2, 1, 2, 2, 2],\n };\n }\n /** Scales associated with m (minor) and M (major). */\n static get scaleTypes() {\n return {\n M: Music.scales.major,\n m: Music.scales.minor,\n };\n }\n /** Accidentals abbreviations. */\n static get accidentals() {\n return ['bb', 'b', 'n', '#', '##'];\n }\n /** Note values. */\n static get noteValues() {\n return {\n c: { root_index: 0, int_val: 0 },\n cn: { root_index: 0, int_val: 0 },\n 'c#': { root_index: 0, int_val: 1 },\n 'c##': { root_index: 0, int_val: 2 },\n cb: { root_index: 0, int_val: 11 },\n cbb: { root_index: 0, int_val: 10 },\n d: { root_index: 1, int_val: 2 },\n dn: { root_index: 1, int_val: 2 },\n 'd#': { root_index: 1, int_val: 3 },\n 'd##': { root_index: 1, int_val: 4 },\n db: { root_index: 1, int_val: 1 },\n dbb: { root_index: 1, int_val: 0 },\n e: { root_index: 2, int_val: 4 },\n en: { root_index: 2, int_val: 4 },\n 'e#': { root_index: 2, int_val: 5 },\n 'e##': { root_index: 2, int_val: 6 },\n eb: { root_index: 2, int_val: 3 },\n ebb: { root_index: 2, int_val: 2 },\n f: { root_index: 3, int_val: 5 },\n fn: { root_index: 3, int_val: 5 },\n 'f#': { root_index: 3, int_val: 6 },\n 'f##': { root_index: 3, int_val: 7 },\n fb: { root_index: 3, int_val: 4 },\n fbb: { root_index: 3, int_val: 3 },\n g: { root_index: 4, int_val: 7 },\n gn: { root_index: 4, int_val: 7 },\n 'g#': { root_index: 4, int_val: 8 },\n 'g##': { root_index: 4, int_val: 9 },\n gb: { root_index: 4, int_val: 6 },\n gbb: { root_index: 4, int_val: 5 },\n a: { root_index: 5, int_val: 9 },\n an: { root_index: 5, int_val: 9 },\n 'a#': { root_index: 5, int_val: 10 },\n 'a##': { root_index: 5, int_val: 11 },\n ab: { root_index: 5, int_val: 8 },\n abb: { root_index: 5, int_val: 7 },\n b: { root_index: 6, int_val: 11 },\n bn: { root_index: 6, int_val: 11 },\n 'b#': { root_index: 6, int_val: 0 },\n 'b##': { root_index: 6, int_val: 1 },\n bb: { root_index: 6, int_val: 10 },\n bbb: { root_index: 6, int_val: 9 },\n };\n }\n isValidNoteValue(note) {\n return note >= 0 && note < Music.canonical_notes.length;\n }\n isValidIntervalValue(interval) {\n return interval >= 0 && interval < Music.diatonic_intervals.length;\n }\n /** Return root and accidental associated to a note. */\n getNoteParts(noteString) {\n if (!noteString || noteString.length < 1) {\n throw new RuntimeError('BadArguments', 'Invalid note name: ' + noteString);\n }\n if (noteString.length > 3) {\n throw new RuntimeError('BadArguments', 'Invalid note name: ' + noteString);\n }\n const note = noteString.toLowerCase();\n const regex = /^([cdefgab])(b|bb|n|#|##)?$/;\n const match = regex.exec(note);\n if (match !== null) {\n const root = match[1];\n const accidental = match[2];\n return {\n root,\n accidental,\n };\n }\n else {\n throw new RuntimeError('BadArguments', 'Invalid note name: ' + noteString);\n }\n }\n /** Return root, accidental and type associated to a key. */\n getKeyParts(keyString) {\n if (!keyString || keyString.length < 1) {\n throw new RuntimeError('BadArguments', 'Invalid key: ' + keyString);\n }\n const key = keyString.toLowerCase();\n // Support Major, Minor, Melodic Minor, and Harmonic Minor key types.\n const regex = /^([cdefgab])(b|#)?(mel|harm|m|M)?$/;\n const match = regex.exec(key);\n if (match !== null) {\n const root = match[1];\n const accidental = match[2];\n let type = match[3];\n // Unspecified type implies major\n if (!type)\n type = 'M';\n return {\n root,\n accidental,\n type,\n };\n }\n else {\n throw new RuntimeError('BadArguments', `Invalid key: ${keyString}`);\n }\n }\n /** Note value associated to a note name. */\n getNoteValue(noteString) {\n const value = Music.noteValues[noteString];\n if (value === undefined) {\n throw new RuntimeError('BadArguments', `Invalid note name: ${noteString}`);\n }\n return value.int_val;\n }\n /** Interval value associated to an interval name. */\n getIntervalValue(intervalString) {\n const value = Music.intervals[intervalString];\n if (value === undefined) {\n throw new RuntimeError('BadArguments', `Invalid interval name: ${intervalString}`);\n }\n return value;\n }\n /** Canonical note name associated to a value. */\n getCanonicalNoteName(noteValue) {\n if (!this.isValidNoteValue(noteValue)) {\n throw new RuntimeError('BadArguments', `Invalid note value: ${noteValue}`);\n }\n return Music.canonical_notes[noteValue];\n }\n /** Interval name associated to a value. */\n getCanonicalIntervalName(intervalValue) {\n if (!this.isValidIntervalValue(intervalValue)) {\n throw new RuntimeError('BadArguments', `Invalid interval value: ${intervalValue}`);\n }\n return Music.diatonic_intervals[intervalValue];\n }\n /**\n * Given a note, interval, and interval direction, produce the relative note.\n */\n getRelativeNoteValue(noteValue, intervalValue, direction = 1) {\n if (direction !== 1 && direction !== -1) {\n throw new RuntimeError('BadArguments', `Invalid direction: ${direction}`);\n }\n let sum = (noteValue + direction * intervalValue) % Music.NUM_TONES;\n if (sum < 0)\n sum += Music.NUM_TONES;\n return sum;\n }\n /**\n * Given a root and note value, produce the relative note name.\n */\n getRelativeNoteName(root, noteValue) {\n const parts = this.getNoteParts(root);\n const rootValue = this.getNoteValue(parts.root);\n let interval = noteValue - rootValue;\n if (Math.abs(interval) > Music.NUM_TONES - 3) {\n let multiplier = 1;\n if (interval > 0)\n multiplier = -1;\n // Possibly wrap around. (Add +1 for modulo operator)\n const reverse_interval = ((noteValue + 1 + (rootValue + 1)) % Music.NUM_TONES) * multiplier;\n if (Math.abs(reverse_interval) > 2) {\n throw new RuntimeError('BadArguments', `Notes not related: ${root}, ${noteValue})`);\n }\n else {\n interval = reverse_interval;\n }\n }\n if (Math.abs(interval) > 2) {\n throw new RuntimeError('BadArguments', `Notes not related: ${root}, ${noteValue})`);\n }\n let relativeNoteName = parts.root;\n if (interval > 0) {\n for (let i = 1; i <= interval; ++i) {\n relativeNoteName += '#';\n }\n }\n else if (interval < 0) {\n for (let i = -1; i >= interval; --i) {\n relativeNoteName += 'b';\n }\n }\n return relativeNoteName;\n }\n /**\n * Return scale tones, given intervals. Each successive interval is\n * relative to the previous one, e.g., Major Scale:\n *\n * TTSTTTS = [2,2,1,2,2,2,1]\n *\n * When used with key = 0, returns C scale (which is isomorphic to\n * interval list).\n */\n getScaleTones(key, intervals) {\n const tones = [key];\n let nextNote = key;\n for (let i = 0; i < intervals.length; i++) {\n nextNote = this.getRelativeNoteValue(nextNote, intervals[i]);\n if (nextNote !== key)\n tones.push(nextNote);\n }\n return tones;\n }\n /**\n * Return the interval of a note, given a diatonic scale.\n * e.g., given the scale C, and the note E, returns M3.\n */\n getIntervalBetween(note1, note2, direction = 1) {\n if (direction !== 1 && direction !== -1) {\n throw new RuntimeError('BadArguments', `Invalid direction: ${direction}`);\n }\n if (!this.isValidNoteValue(note1) || !this.isValidNoteValue(note2)) {\n throw new RuntimeError('BadArguments', `Invalid notes: ${note1}, ${note2}`);\n }\n let difference = direction === 1 ? note2 - note1 : note1 - note2;\n if (difference < 0)\n difference += Music.NUM_TONES;\n return difference;\n }\n /**\n * Create a scale map that represents the pitch state for a\n * `keySignature`. For example, passing a `G` to `keySignature` would\n * return a scale map with every note naturalized except for `F` which\n * has an `F#` state.\n */\n createScaleMap(keySignature) {\n const keySigParts = this.getKeyParts(keySignature);\n if (!keySigParts.type)\n throw new RuntimeError('BadArguments', 'Unsupported key type: undefined');\n const scaleName = Music.scaleTypes[keySigParts.type];\n let keySigString = keySigParts.root;\n if (keySigParts.accidental)\n keySigString += keySigParts.accidental;\n if (!scaleName)\n throw new RuntimeError('BadArguments', 'Unsupported key type: ' + keySignature);\n const scale = this.getScaleTones(this.getNoteValue(keySigString), scaleName);\n const noteLocation = Music.root_indices[keySigParts.root];\n const scaleMap = {};\n for (let i = 0; i < Music.roots.length; ++i) {\n const index = (noteLocation + i) % Music.roots.length;\n const rootName = Music.roots[index];\n let noteName = this.getRelativeNoteName(rootName, scale[i]);\n if (noteName.length === 1) {\n noteName += 'n';\n }\n scaleMap[rootName] = noteName;\n }\n return scaleMap;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { Fraction } from './fraction';\nimport { Glyph } from './glyph';\nimport { RuntimeError } from './util';\nconst RESOLUTION = 16384;\n/**\n * Map duration numbers to 'ticks', the unit of duration used throughout VexFlow.\n * For example, a quarter note is 4, so it maps to RESOLUTION / 4 = 4096 ticks.\n */\nconst durations = {\n '1/2': RESOLUTION * 2,\n 1: RESOLUTION / 1,\n 2: RESOLUTION / 2,\n 4: RESOLUTION / 4,\n 8: RESOLUTION / 8,\n 16: RESOLUTION / 16,\n 32: RESOLUTION / 32,\n 64: RESOLUTION / 64,\n 128: RESOLUTION / 128,\n 256: RESOLUTION / 256,\n};\nconst durationAliases = {\n w: '1',\n h: '2',\n q: '4',\n // This is the default duration used to render bars (BarNote). Bars no longer\n // consume ticks, so this should be a no-op.\n // TODO(0xfe): This needs to be cleaned up.\n b: '256',\n};\nconst keySignatures = {\n C: { num: 0 },\n Am: { num: 0 },\n F: { acc: 'b', num: 1 },\n Dm: { acc: 'b', num: 1 },\n Bb: { acc: 'b', num: 2 },\n Gm: { acc: 'b', num: 2 },\n Eb: { acc: 'b', num: 3 },\n Cm: { acc: 'b', num: 3 },\n Ab: { acc: 'b', num: 4 },\n Fm: { acc: 'b', num: 4 },\n Db: { acc: 'b', num: 5 },\n Bbm: { acc: 'b', num: 5 },\n Gb: { acc: 'b', num: 6 },\n Ebm: { acc: 'b', num: 6 },\n Cb: { acc: 'b', num: 7 },\n Abm: { acc: 'b', num: 7 },\n G: { acc: '#', num: 1 },\n Em: { acc: '#', num: 1 },\n D: { acc: '#', num: 2 },\n Bm: { acc: '#', num: 2 },\n A: { acc: '#', num: 3 },\n 'F#m': { acc: '#', num: 3 },\n E: { acc: '#', num: 4 },\n 'C#m': { acc: '#', num: 4 },\n B: { acc: '#', num: 5 },\n 'G#m': { acc: '#', num: 5 },\n 'F#': { acc: '#', num: 6 },\n 'D#m': { acc: '#', num: 6 },\n 'C#': { acc: '#', num: 7 },\n 'A#m': { acc: '#', num: 7 },\n};\nconst clefs = {\n treble: { line_shift: 0 },\n bass: { line_shift: 6 },\n tenor: { line_shift: 4 },\n alto: { line_shift: 3 },\n soprano: { line_shift: 1 },\n percussion: { line_shift: 0 },\n 'mezzo-soprano': { line_shift: 2 },\n 'baritone-c': { line_shift: 5 },\n 'baritone-f': { line_shift: 5 },\n subbass: { line_shift: 7 },\n french: { line_shift: -1 },\n};\nconst notesInfo = {\n C: { index: 0, int_val: 0 },\n CN: { index: 0, int_val: 0, accidental: 'n' },\n 'C#': { index: 0, int_val: 1, accidental: '#' },\n 'C##': { index: 0, int_val: 2, accidental: '##' },\n CB: { index: 0, int_val: 11, accidental: 'b' },\n CBB: { index: 0, int_val: 10, accidental: 'bb' },\n D: { index: 1, int_val: 2 },\n DN: { index: 1, int_val: 2, accidental: 'n' },\n 'D#': { index: 1, int_val: 3, accidental: '#' },\n 'D##': { index: 1, int_val: 4, accidental: '##' },\n DB: { index: 1, int_val: 1, accidental: 'b' },\n DBB: { index: 1, int_val: 0, accidental: 'bb' },\n E: { index: 2, int_val: 4 },\n EN: { index: 2, int_val: 4, accidental: 'n' },\n 'E#': { index: 2, int_val: 5, accidental: '#' },\n 'E##': { index: 2, int_val: 6, accidental: '##' },\n EB: { index: 2, int_val: 3, accidental: 'b' },\n EBB: { index: 2, int_val: 2, accidental: 'bb' },\n F: { index: 3, int_val: 5 },\n FN: { index: 3, int_val: 5, accidental: 'n' },\n 'F#': { index: 3, int_val: 6, accidental: '#' },\n 'F##': { index: 3, int_val: 7, accidental: '##' },\n FB: { index: 3, int_val: 4, accidental: 'b' },\n FBB: { index: 3, int_val: 3, accidental: 'bb' },\n G: { index: 4, int_val: 7 },\n GN: { index: 4, int_val: 7, accidental: 'n' },\n 'G#': { index: 4, int_val: 8, accidental: '#' },\n 'G##': { index: 4, int_val: 9, accidental: '##' },\n GB: { index: 4, int_val: 6, accidental: 'b' },\n GBB: { index: 4, int_val: 5, accidental: 'bb' },\n A: { index: 5, int_val: 9 },\n AN: { index: 5, int_val: 9, accidental: 'n' },\n 'A#': { index: 5, int_val: 10, accidental: '#' },\n 'A##': { index: 5, int_val: 11, accidental: '##' },\n AB: { index: 5, int_val: 8, accidental: 'b' },\n ABB: { index: 5, int_val: 7, accidental: 'bb' },\n B: { index: 6, int_val: 11 },\n BN: { index: 6, int_val: 11, accidental: 'n' },\n 'B#': { index: 6, int_val: 12, accidental: '#' },\n 'B##': { index: 6, int_val: 13, accidental: '##' },\n BB: { index: 6, int_val: 10, accidental: 'b' },\n BBB: { index: 6, int_val: 9, accidental: 'bb' },\n R: { index: 6, rest: true },\n X: {\n index: 6,\n accidental: '',\n octave: 4,\n code: 'noteheadXBlack',\n shift_right: 5.5,\n },\n};\nconst validNoteTypes = {\n n: { name: 'note' },\n r: { name: 'rest' },\n h: { name: 'harmonic' },\n m: { name: 'muted' },\n s: { name: 'slash' },\n g: { name: 'ghost' },\n};\nconst customNoteHeads = {\n /* Diamond */\n D0: { code: 'noteheadDiamondWhole' },\n D1: { code: 'noteheadDiamondHalf' },\n D2: { code: 'noteheadDiamondBlack' },\n D3: { code: 'noteheadDiamondBlack' },\n /* Triangle */\n T0: { code: 'noteheadTriangleUpWhole' },\n T1: { code: 'noteheadTriangleUpHalf' },\n T2: { code: 'noteheadTriangleUpBlack' },\n T3: { code: 'noteheadTriangleUpBlack' },\n /* Cross */\n X0: { code: 'noteheadXWhole' },\n X1: { code: 'noteheadXHalf' },\n X2: { code: 'noteheadXBlack' },\n X3: { code: 'noteheadCircleX' },\n /* Square */\n S1: { code: 'noteheadSquareWhite' },\n S2: { code: 'noteheadSquareBlack' },\n /* Rectangle */\n R1: { code: 'vexNoteHeadRectWhite' },\n R2: { code: 'vexNoteHeadRectBlack' }, // no smufl code\n};\nconst accidentals = {\n '#': { code: 'accidentalSharp', parenRightPaddingAdjustment: -1 },\n '##': { code: 'accidentalDoubleSharp', parenRightPaddingAdjustment: -1 },\n b: { code: 'accidentalFlat', parenRightPaddingAdjustment: -2 },\n bb: { code: 'accidentalDoubleFlat', parenRightPaddingAdjustment: -2 },\n n: { code: 'accidentalNatural', parenRightPaddingAdjustment: -1 },\n '{': { code: 'accidentalParensLeft', parenRightPaddingAdjustment: -1 },\n '}': { code: 'accidentalParensRight', parenRightPaddingAdjustment: -1 },\n db: { code: 'accidentalThreeQuarterTonesFlatZimmermann', parenRightPaddingAdjustment: -1 },\n d: { code: 'accidentalQuarterToneFlatStein', parenRightPaddingAdjustment: 0 },\n '++': { code: 'accidentalThreeQuarterTonesSharpStein', parenRightPaddingAdjustment: -1 },\n '+': { code: 'accidentalQuarterToneSharpStein', parenRightPaddingAdjustment: -1 },\n '+-': { code: 'accidentalKucukMucennebSharp', parenRightPaddingAdjustment: -1 },\n bs: { code: 'accidentalBakiyeFlat', parenRightPaddingAdjustment: -1 },\n bss: { code: 'accidentalBuyukMucennebFlat', parenRightPaddingAdjustment: -1 },\n o: { code: 'accidentalSori', parenRightPaddingAdjustment: -1 },\n k: { code: 'accidentalKoron', parenRightPaddingAdjustment: -1 },\n bbs: { code: 'vexAccidentalMicrotonal1', parenRightPaddingAdjustment: -1 },\n '++-': { code: 'vexAccidentalMicrotonal2', parenRightPaddingAdjustment: -1 },\n ashs: { code: 'vexAccidentalMicrotonal3', parenRightPaddingAdjustment: -1 },\n afhf: { code: 'vexAccidentalMicrotonal4', parenRightPaddingAdjustment: -1 },\n accSagittal5v7KleismaUp: { code: 'accSagittal5v7KleismaUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v7KleismaDown: { code: 'accSagittal5v7KleismaDown', parenRightPaddingAdjustment: -1 },\n accSagittal5CommaUp: { code: 'accSagittal5CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal5CommaDown: { code: 'accSagittal5CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal7CommaUp: { code: 'accSagittal7CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal7CommaDown: { code: 'accSagittal7CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal25SmallDiesisUp: { code: 'accSagittal25SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal25SmallDiesisDown: { code: 'accSagittal25SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal35MediumDiesisUp: { code: 'accSagittal35MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal35MediumDiesisDown: { code: 'accSagittal35MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal11MediumDiesisUp: { code: 'accSagittal11MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal11MediumDiesisDown: { code: 'accSagittal11MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal11LargeDiesisUp: { code: 'accSagittal11LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal11LargeDiesisDown: { code: 'accSagittal11LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal35LargeDiesisUp: { code: 'accSagittal35LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal35LargeDiesisDown: { code: 'accSagittal35LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp25SDown: { code: 'accSagittalSharp25SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat25SUp: { code: 'accSagittalFlat25SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7CDown: { code: 'accSagittalSharp7CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7CUp: { code: 'accSagittalFlat7CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5CDown: { code: 'accSagittalSharp5CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5CUp: { code: 'accSagittalFlat5CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v7kDown: { code: 'accSagittalSharp5v7kDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v7kUp: { code: 'accSagittalFlat5v7kUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp: { code: 'accSagittalSharp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat: { code: 'accSagittalFlat', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v7kUp: { code: 'accSagittalSharp5v7kUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v7kDown: { code: 'accSagittalFlat5v7kDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5CUp: { code: 'accSagittalSharp5CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5CDown: { code: 'accSagittalFlat5CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7CUp: { code: 'accSagittalSharp7CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7CDown: { code: 'accSagittalFlat7CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp25SUp: { code: 'accSagittalSharp25SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat25SDown: { code: 'accSagittalFlat25SDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp35MUp: { code: 'accSagittalSharp35MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat35MDown: { code: 'accSagittalFlat35MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11MUp: { code: 'accSagittalSharp11MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11MDown: { code: 'accSagittalFlat11MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11LUp: { code: 'accSagittalSharp11LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11LDown: { code: 'accSagittalFlat11LDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp35LUp: { code: 'accSagittalSharp35LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat35LDown: { code: 'accSagittalFlat35LDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp25SDown: { code: 'accSagittalDoubleSharp25SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat25SUp: { code: 'accSagittalDoubleFlat25SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp7CDown: { code: 'accSagittalDoubleSharp7CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat7CUp: { code: 'accSagittalDoubleFlat7CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5CDown: { code: 'accSagittalDoubleSharp5CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5CUp: { code: 'accSagittalDoubleFlat5CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5v7kDown: { code: 'accSagittalDoubleSharp5v7kDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5v7kUp: { code: 'accSagittalDoubleFlat5v7kUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp: { code: 'accSagittalDoubleSharp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat: { code: 'accSagittalDoubleFlat', parenRightPaddingAdjustment: -1 },\n accSagittal7v11KleismaUp: { code: 'accSagittal7v11KleismaUp', parenRightPaddingAdjustment: -1 },\n accSagittal7v11KleismaDown: { code: 'accSagittal7v11KleismaDown', parenRightPaddingAdjustment: -1 },\n accSagittal17CommaUp: { code: 'accSagittal17CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal17CommaDown: { code: 'accSagittal17CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal55CommaUp: { code: 'accSagittal55CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal55CommaDown: { code: 'accSagittal55CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal7v11CommaUp: { code: 'accSagittal7v11CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal7v11CommaDown: { code: 'accSagittal7v11CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v11SmallDiesisUp: { code: 'accSagittal5v11SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v11SmallDiesisDown: { code: 'accSagittal5v11SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v11SDown: { code: 'accSagittalSharp5v11SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v11SUp: { code: 'accSagittalFlat5v11SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v11CDown: { code: 'accSagittalSharp7v11CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v11CUp: { code: 'accSagittalFlat7v11CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp55CDown: { code: 'accSagittalSharp55CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat55CUp: { code: 'accSagittalFlat55CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp17CDown: { code: 'accSagittalSharp17CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat17CUp: { code: 'accSagittalFlat17CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v11kDown: { code: 'accSagittalSharp7v11kDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v11kUp: { code: 'accSagittalFlat7v11kUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v11kUp: { code: 'accSagittalSharp7v11kUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v11kDown: { code: 'accSagittalFlat7v11kDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp17CUp: { code: 'accSagittalSharp17CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat17CDown: { code: 'accSagittalFlat17CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp55CUp: { code: 'accSagittalSharp55CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat55CDown: { code: 'accSagittalFlat55CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v11CUp: { code: 'accSagittalSharp7v11CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v11CDown: { code: 'accSagittalFlat7v11CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v11SUp: { code: 'accSagittalSharp5v11SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v11SDown: { code: 'accSagittalFlat5v11SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5v11SDown: { code: 'accSagittalDoubleSharp5v11SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5v11SUp: { code: 'accSagittalDoubleFlat5v11SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp7v11CDown: { code: 'accSagittalDoubleSharp7v11CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat7v11CUp: { code: 'accSagittalDoubleFlat7v11CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp55CDown: { code: 'accSagittalDoubleSharp55CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat55CUp: { code: 'accSagittalDoubleFlat55CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp17CDown: { code: 'accSagittalDoubleSharp17CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat17CUp: { code: 'accSagittalDoubleFlat17CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp7v11kDown: { code: 'accSagittalDoubleSharp7v11kDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat7v11kUp: { code: 'accSagittalDoubleFlat7v11kUp', parenRightPaddingAdjustment: -1 },\n accSagittal23CommaUp: { code: 'accSagittal23CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal23CommaDown: { code: 'accSagittal23CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v19CommaUp: { code: 'accSagittal5v19CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v19CommaDown: { code: 'accSagittal5v19CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v23SmallDiesisUp: { code: 'accSagittal5v23SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v23SmallDiesisDown: { code: 'accSagittal5v23SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v23SDown: { code: 'accSagittalSharp5v23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v23SUp: { code: 'accSagittalFlat5v23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v19CDown: { code: 'accSagittalSharp5v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v19CUp: { code: 'accSagittalFlat5v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp23CDown: { code: 'accSagittalSharp23CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat23CUp: { code: 'accSagittalFlat23CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp23CUp: { code: 'accSagittalSharp23CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat23CDown: { code: 'accSagittalFlat23CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v19CUp: { code: 'accSagittalSharp5v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v19CDown: { code: 'accSagittalFlat5v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v23SUp: { code: 'accSagittalSharp5v23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v23SDown: { code: 'accSagittalFlat5v23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5v23SDown: { code: 'accSagittalDoubleSharp5v23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5v23SUp: { code: 'accSagittalDoubleFlat5v23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp5v19CDown: { code: 'accSagittalDoubleSharp5v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat5v19CUp: { code: 'accSagittalDoubleFlat5v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp23CDown: { code: 'accSagittalDoubleSharp23CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat23CUp: { code: 'accSagittalDoubleFlat23CUp', parenRightPaddingAdjustment: -1 },\n accSagittal19SchismaUp: { code: 'accSagittal19SchismaUp', parenRightPaddingAdjustment: -1 },\n accSagittal19SchismaDown: { code: 'accSagittal19SchismaDown', parenRightPaddingAdjustment: -1 },\n accSagittal17KleismaUp: { code: 'accSagittal17KleismaUp', parenRightPaddingAdjustment: -1 },\n accSagittal17KleismaDown: { code: 'accSagittal17KleismaDown', parenRightPaddingAdjustment: -1 },\n accSagittal143CommaUp: { code: 'accSagittal143CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal143CommaDown: { code: 'accSagittal143CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal11v49CommaUp: { code: 'accSagittal11v49CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal11v49CommaDown: { code: 'accSagittal11v49CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal19CommaUp: { code: 'accSagittal19CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal19CommaDown: { code: 'accSagittal19CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal7v19CommaUp: { code: 'accSagittal7v19CommaUp', parenRightPaddingAdjustment: -1 },\n accSagittal7v19CommaDown: { code: 'accSagittal7v19CommaDown', parenRightPaddingAdjustment: -1 },\n accSagittal49SmallDiesisUp: { code: 'accSagittal49SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal49SmallDiesisDown: { code: 'accSagittal49SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal23SmallDiesisUp: { code: 'accSagittal23SmallDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal23SmallDiesisDown: { code: 'accSagittal23SmallDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v13MediumDiesisUp: { code: 'accSagittal5v13MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v13MediumDiesisDown: { code: 'accSagittal5v13MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal11v19MediumDiesisUp: { code: 'accSagittal11v19MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal11v19MediumDiesisDown: { code: 'accSagittal11v19MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal49MediumDiesisUp: { code: 'accSagittal49MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal49MediumDiesisDown: { code: 'accSagittal49MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v49MediumDiesisUp: { code: 'accSagittal5v49MediumDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v49MediumDiesisDown: { code: 'accSagittal5v49MediumDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal49LargeDiesisUp: { code: 'accSagittal49LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal49LargeDiesisDown: { code: 'accSagittal49LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal11v19LargeDiesisUp: { code: 'accSagittal11v19LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal11v19LargeDiesisDown: { code: 'accSagittal11v19LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittal5v13LargeDiesisUp: { code: 'accSagittal5v13LargeDiesisUp', parenRightPaddingAdjustment: -1 },\n accSagittal5v13LargeDiesisDown: { code: 'accSagittal5v13LargeDiesisDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp23SDown: { code: 'accSagittalSharp23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat23SUp: { code: 'accSagittalFlat23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp49SDown: { code: 'accSagittalSharp49SDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat49SUp: { code: 'accSagittalFlat49SUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v19CDown: { code: 'accSagittalSharp7v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v19CUp: { code: 'accSagittalFlat7v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp19CDown: { code: 'accSagittalSharp19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat19CUp: { code: 'accSagittalFlat19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11v49CDown: { code: 'accSagittalSharp11v49CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11v49CUp: { code: 'accSagittalFlat11v49CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp143CDown: { code: 'accSagittalSharp143CDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat143CUp: { code: 'accSagittalFlat143CUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp17kDown: { code: 'accSagittalSharp17kDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat17kUp: { code: 'accSagittalFlat17kUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp19sDown: { code: 'accSagittalSharp19sDown', parenRightPaddingAdjustment: -1 },\n accSagittalFlat19sUp: { code: 'accSagittalFlat19sUp', parenRightPaddingAdjustment: -1 },\n accSagittalSharp19sUp: { code: 'accSagittalSharp19sUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat19sDown: { code: 'accSagittalFlat19sDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp17kUp: { code: 'accSagittalSharp17kUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat17kDown: { code: 'accSagittalFlat17kDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp143CUp: { code: 'accSagittalSharp143CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat143CDown: { code: 'accSagittalFlat143CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11v49CUp: { code: 'accSagittalSharp11v49CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11v49CDown: { code: 'accSagittalFlat11v49CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp19CUp: { code: 'accSagittalSharp19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat19CDown: { code: 'accSagittalFlat19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp7v19CUp: { code: 'accSagittalSharp7v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat7v19CDown: { code: 'accSagittalFlat7v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp49SUp: { code: 'accSagittalSharp49SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat49SDown: { code: 'accSagittalFlat49SDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp23SUp: { code: 'accSagittalSharp23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat23SDown: { code: 'accSagittalFlat23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v13MUp: { code: 'accSagittalSharp5v13MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v13MDown: { code: 'accSagittalFlat5v13MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11v19MUp: { code: 'accSagittalSharp11v19MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11v19MDown: { code: 'accSagittalFlat11v19MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp49MUp: { code: 'accSagittalSharp49MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat49MDown: { code: 'accSagittalFlat49MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v49MUp: { code: 'accSagittalSharp5v49MUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v49MDown: { code: 'accSagittalFlat5v49MDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp49LUp: { code: 'accSagittalSharp49LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat49LDown: { code: 'accSagittalFlat49LDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp11v19LUp: { code: 'accSagittalSharp11v19LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat11v19LDown: { code: 'accSagittalFlat11v19LDown', parenRightPaddingAdjustment: -1 },\n accSagittalSharp5v13LUp: { code: 'accSagittalSharp5v13LUp', parenRightPaddingAdjustment: -1 },\n accSagittalFlat5v13LDown: { code: 'accSagittalFlat5v13LDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp23SDown: { code: 'accSagittalDoubleSharp23SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat23SUp: { code: 'accSagittalDoubleFlat23SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp49SDown: { code: 'accSagittalDoubleSharp49SDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat49SUp: { code: 'accSagittalDoubleFlat49SUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp7v19CDown: { code: 'accSagittalDoubleSharp7v19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat7v19CUp: { code: 'accSagittalDoubleFlat7v19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp19CDown: { code: 'accSagittalDoubleSharp19CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat19CUp: { code: 'accSagittalDoubleFlat19CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp11v49CDown: { code: 'accSagittalDoubleSharp11v49CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat11v49CUp: { code: 'accSagittalDoubleFlat11v49CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp143CDown: { code: 'accSagittalDoubleSharp143CDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat143CUp: { code: 'accSagittalDoubleFlat143CUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp17kDown: { code: 'accSagittalDoubleSharp17kDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat17kUp: { code: 'accSagittalDoubleFlat17kUp', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleSharp19sDown: { code: 'accSagittalDoubleSharp19sDown', parenRightPaddingAdjustment: -1 },\n accSagittalDoubleFlat19sUp: { code: 'accSagittalDoubleFlat19sUp', parenRightPaddingAdjustment: -1 },\n accSagittalShaftUp: { code: 'accSagittalShaftUp', parenRightPaddingAdjustment: -1 },\n accSagittalShaftDown: { code: 'accSagittalShaftDown', parenRightPaddingAdjustment: -1 },\n accSagittalAcute: { code: 'accSagittalAcute', parenRightPaddingAdjustment: -1 },\n accSagittalGrave: { code: 'accSagittalGrave', parenRightPaddingAdjustment: -1 },\n accSagittal1MinaUp: { code: 'accSagittal1MinaUp', parenRightPaddingAdjustment: -1 },\n accSagittal1MinaDown: { code: 'accSagittal1MinaDown', parenRightPaddingAdjustment: -1 },\n accSagittal2MinasUp: { code: 'accSagittal2MinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal2MinasDown: { code: 'accSagittal2MinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal1TinaUp: { code: 'accSagittal1TinaUp', parenRightPaddingAdjustment: -1 },\n accSagittal1TinaDown: { code: 'accSagittal1TinaDown', parenRightPaddingAdjustment: -1 },\n accSagittal2TinasUp: { code: 'accSagittal2TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal2TinasDown: { code: 'accSagittal2TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal3TinasUp: { code: 'accSagittal3TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal3TinasDown: { code: 'accSagittal3TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal4TinasUp: { code: 'accSagittal4TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal4TinasDown: { code: 'accSagittal4TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal5TinasUp: { code: 'accSagittal5TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal5TinasDown: { code: 'accSagittal5TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal6TinasUp: { code: 'accSagittal6TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal6TinasDown: { code: 'accSagittal6TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal7TinasUp: { code: 'accSagittal7TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal7TinasDown: { code: 'accSagittal7TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal8TinasUp: { code: 'accSagittal8TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal8TinasDown: { code: 'accSagittal8TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittal9TinasUp: { code: 'accSagittal9TinasUp', parenRightPaddingAdjustment: -1 },\n accSagittal9TinasDown: { code: 'accSagittal9TinasDown', parenRightPaddingAdjustment: -1 },\n accSagittalFractionalTinaUp: { code: 'accSagittalFractionalTinaUp', parenRightPaddingAdjustment: -1 },\n accSagittalFractionalTinaDown: { code: 'accSagittalFractionalTinaDown', parenRightPaddingAdjustment: -1 },\n accidentalNarrowReversedFlat: { code: 'accidentalNarrowReversedFlat', parenRightPaddingAdjustment: -1 },\n accidentalNarrowReversedFlatAndFlat: {\n code: 'accidentalNarrowReversedFlatAndFlat',\n parenRightPaddingAdjustment: -1,\n },\n accidentalWilsonPlus: { code: 'accidentalWilsonPlus', parenRightPaddingAdjustment: -1 },\n accidentalWilsonMinus: { code: 'accidentalWilsonMinus', parenRightPaddingAdjustment: -1 },\n};\n// Helps determine the layout of accidentals.\nconst accidentalColumns = {\n 1: {\n a: [1],\n b: [1],\n },\n 2: {\n a: [1, 2],\n },\n 3: {\n a: [1, 3, 2],\n b: [1, 2, 1],\n second_on_bottom: [1, 2, 3],\n },\n 4: {\n a: [1, 3, 4, 2],\n b: [1, 2, 3, 1],\n spaced_out_tetrachord: [1, 2, 1, 2],\n },\n 5: {\n a: [1, 3, 5, 4, 2],\n b: [1, 2, 4, 3, 1],\n spaced_out_pentachord: [1, 2, 3, 2, 1],\n very_spaced_out_pentachord: [1, 2, 1, 2, 1],\n },\n 6: {\n a: [1, 3, 5, 6, 4, 2],\n b: [1, 2, 4, 5, 3, 1],\n spaced_out_hexachord: [1, 3, 2, 1, 3, 2],\n very_spaced_out_hexachord: [1, 2, 1, 2, 1, 2],\n },\n};\nconst articulations = {\n 'a.': { code: 'augmentationDot', between_lines: true },\n av: {\n aboveCode: 'articStaccatissimoAbove',\n belowCode: 'articStaccatissimoBelow',\n between_lines: true,\n },\n 'a>': {\n aboveCode: 'articAccentAbove',\n belowCode: 'articAccentBelow',\n between_lines: true,\n },\n 'a-': {\n aboveCode: 'articTenutoAbove',\n belowCode: 'articTenutoBelow',\n between_lines: true,\n },\n 'a^': {\n aboveCode: 'articMarcatoAbove',\n belowCode: 'articMarcatoBelow',\n between_lines: false,\n },\n 'a+': { code: 'pluckedLeftHandPizzicato', between_lines: false },\n ao: {\n aboveCode: 'pluckedSnapPizzicatoAbove',\n belowCode: 'pluckedSnapPizzicatoBelow',\n between_lines: false,\n },\n ah: { code: 'stringsHarmonic', between_lines: false },\n 'a@': { aboveCode: 'fermataAbove', belowCode: 'fermataBelow', between_lines: false },\n 'a@a': { code: 'fermataAbove', between_lines: false },\n 'a@u': { code: 'fermataBelow', between_lines: false },\n 'a|': { code: 'stringsUpBow', between_lines: false },\n am: { code: 'stringsDownBow', between_lines: false },\n 'a,': { code: 'pictChokeCymbal', between_lines: false }, // Choked\n};\nconst ornaments = {\n mordent: { code: 'ornamentShortTrill' },\n mordent_inverted: { code: 'ornamentMordent' },\n turn: { code: 'ornamentTurn' },\n turn_inverted: { code: 'ornamentTurnSlash' },\n tr: { code: 'ornamentTrill' },\n upprall: { code: 'ornamentPrecompSlideTrillDAnglebert' },\n downprall: { code: 'ornamentPrecompDoubleCadenceUpperPrefix' },\n prallup: { code: 'ornamentPrecompTrillSuffixDandrieu' },\n pralldown: { code: 'ornamentPrecompTrillLowerSuffix' },\n upmordent: { code: 'ornamentPrecompSlideTrillBach' },\n downmordent: { code: 'ornamentPrecompDoubleCadenceUpperPrefixTurn' },\n lineprall: { code: 'ornamentPrecompAppoggTrill' },\n prallprall: { code: 'ornamentTremblement' },\n scoop: { code: 'brassScoop' },\n doit: { code: 'brassDoitMedium' },\n fall: { code: 'brassFallLipShort' },\n doitLong: { code: 'brassLiftMedium' },\n fallLong: { code: 'brassFallRoughMedium' },\n bend: { code: 'brassBend' },\n plungerClosed: { code: 'brassMuteClosed' },\n plungerOpen: { code: 'brassMuteOpen' },\n flip: { code: 'brassFlip' },\n jazzTurn: { code: 'brassJazzTurn' },\n smear: { code: 'brassSmear' },\n};\nexport class Tables {\n /**\n * @returns the `Font` object at the head of the music font stack.\n */\n static currentMusicFont() {\n if (Tables.MUSIC_FONT_STACK.length === 0) {\n throw new RuntimeError('NoFonts', 'The font stack is empty. See: await Flow.fetchMusicFont(...); Flow.setMusicFont(...).');\n }\n else {\n return Tables.MUSIC_FONT_STACK[0];\n }\n }\n static clefProperties(clef) {\n if (!clef || !(clef in clefs))\n throw new RuntimeError('BadArgument', 'Invalid clef: ' + clef);\n return clefs[clef];\n }\n /**\n * @param keyOctaveGlyph a string in the format \"key/octave\" (e.g., \"c/5\") or \"key/octave/custom-note-head-code\" (e.g., \"g/5/t3\").\n * @param clef\n * @param params a struct with one option, `octave_shift` for clef ottavation (0 = default; 1 = 8va; -1 = 8vb, etc.).\n * @returns properties for the specified note.\n */\n // eslint-disable-next-line\n static keyProperties(keyOctaveGlyph, clef = 'treble', params) {\n let options = { octave_shift: 0 };\n if (typeof params === 'object') {\n options = Object.assign(Object.assign({}, options), params);\n }\n const pieces = keyOctaveGlyph.split('/');\n if (pieces.length < 2) {\n throw new RuntimeError('BadArguments', `First argument must be note/octave or note/octave/glyph-code: ${keyOctaveGlyph}`);\n }\n const key = pieces[0].toUpperCase();\n const value = notesInfo[key];\n if (!value)\n throw new RuntimeError('BadArguments', 'Invalid key name: ' + key);\n if (value.octave)\n pieces[1] = value.octave.toString();\n let octave = parseInt(pieces[1], 10);\n // Octave_shift is the shift to compensate for clef 8va/8vb.\n octave += -1 * options.octave_shift;\n const baseIndex = octave * 7 - 4 * 7;\n let line = (baseIndex + value.index) / 2;\n line += Tables.clefProperties(clef).line_shift;\n let stroke = 0;\n if (line <= 0 && (line * 2) % 2 === 0)\n stroke = 1; // stroke up\n if (line >= 6 && (line * 2) % 2 === 0)\n stroke = -1; // stroke down\n // Integer value for note arithmetic.\n const int_value = typeof value.int_val !== 'undefined' ? octave * 12 + value.int_val : undefined;\n // If the user specified a glyph, overwrite the glyph code.\n const code = value.code;\n const shift_right = value.shift_right;\n let customNoteHeadProps = {};\n if (pieces.length > 2 && pieces[2]) {\n const glyphName = pieces[2].toUpperCase();\n customNoteHeadProps = customNoteHeads[glyphName] || {};\n }\n return Object.assign({ key,\n octave,\n line,\n int_value, accidental: value.accidental, code,\n stroke,\n shift_right, displaced: false }, customNoteHeadProps);\n }\n static integerToNote(integer) {\n if (typeof integer === 'undefined' || integer < 0 || integer > 11) {\n throw new RuntimeError('BadArguments', `integerToNote() requires an integer in the range [0, 11]: ${integer}`);\n }\n const table = {\n 0: 'C',\n 1: 'C#',\n 2: 'D',\n 3: 'D#',\n 4: 'E',\n 5: 'F',\n 6: 'F#',\n 7: 'G',\n 8: 'G#',\n 9: 'A',\n 10: 'A#',\n 11: 'B',\n };\n const noteValue = table[integer];\n if (!noteValue) {\n throw new RuntimeError('BadArguments', `Unknown note value for integer: ${integer}`);\n }\n return noteValue;\n }\n static tabToGlyph(fret, scale = 1.0) {\n let glyph = undefined;\n let width = 0;\n let shift_y = 0;\n if (fret.toUpperCase() === 'X') {\n const glyphMetrics = new Glyph('accidentalDoubleSharp', Tables.TABLATURE_FONT_SCALE).getMetrics();\n glyph = 'accidentalDoubleSharp';\n if (glyphMetrics.width == undefined || glyphMetrics.height == undefined)\n throw new RuntimeError('InvalidMetrics', 'Width and height required');\n width = glyphMetrics.width;\n shift_y = -glyphMetrics.height / 2;\n }\n else {\n width = Tables.textWidth(fret);\n }\n return {\n text: fret,\n code: glyph,\n getWidth: () => width * scale,\n shift_y,\n };\n }\n // Used by annotation.ts and bend.ts. Clearly this implementation only works for the default font size.\n // TODO: The actual width depends on the font family, size, weight, style.\n static textWidth(text) {\n return 7 * text.toString().length;\n }\n static articulationCodes(artic) {\n return articulations[artic];\n }\n static accidentalCodes(acc) {\n return accidentals[acc];\n }\n static ornamentCodes(acc) {\n return ornaments[acc];\n }\n static keySignature(spec) {\n const keySpec = keySignatures[spec];\n if (!keySpec) {\n throw new RuntimeError('BadKeySignature', `Bad key signature spec: '${spec}'`);\n }\n if (!keySpec.acc) {\n return [];\n }\n const accidentalList = {\n b: [2, 0.5, 2.5, 1, 3, 1.5, 3.5],\n '#': [0, 1.5, -0.5, 1, 2.5, 0.5, 2],\n };\n const notes = accidentalList[keySpec.acc];\n const acc_list = [];\n for (let i = 0; i < keySpec.num; ++i) {\n const line = notes[i];\n acc_list.push({ type: keySpec.acc, line });\n }\n return acc_list;\n }\n static getKeySignatures() {\n return keySignatures;\n }\n static hasKeySignature(spec) {\n return spec in keySignatures;\n }\n /**\n * Convert duration aliases to the number based duration.\n * If the input isn't an alias, simply return the input.\n * @param duration\n * @returns Example: 'q' -> '4', '8' -> '8'\n */\n static sanitizeDuration(duration) {\n const durationNumber = durationAliases[duration];\n if (durationNumber !== undefined) {\n duration = durationNumber;\n }\n if (durations[duration] === undefined) {\n throw new RuntimeError('BadArguments', `The provided duration is not valid: ${duration}`);\n }\n return duration;\n }\n /** Convert the `duration` to a fraction. */\n static durationToFraction(duration) {\n return new Fraction().parse(Tables.sanitizeDuration(duration));\n }\n /** Convert the `duration` to a number. */\n static durationToNumber(duration) {\n return Tables.durationToFraction(duration).value();\n }\n /* Convert the `duration` to total ticks. */\n static durationToTicks(duration) {\n duration = Tables.sanitizeDuration(duration);\n const ticks = durations[duration];\n if (ticks === undefined) {\n throw new RuntimeError('InvalidDuration');\n }\n return ticks;\n }\n // Return a glyph given duration and type. The type can be a custom glyph code from customNoteHeads.\n // The default type is a regular note ('n').\n // eslint-disable-next-line\n static getGlyphProps(duration, type = 'n') {\n duration = Tables.sanitizeDuration(duration);\n // Lookup duration for default glyph head code\n const code = durationCodes[duration];\n if (code === undefined) {\n return undefined;\n }\n // Get glyph properties for 'type' from duration string (note, rest, harmonic, muted, slash)\n let glyphTypeProperties = code.type[type];\n // If this isn't a standard type, then lookup the custom note head map.\n if (glyphTypeProperties === undefined) {\n // Try and get it from the custom list of note heads\n const customGlyphTypeProperties = customNoteHeads[type.toUpperCase()];\n // If not, then return with nothing.\n if (customGlyphTypeProperties === undefined) {\n return undefined;\n }\n // Otherwise set it as the code_head value\n glyphTypeProperties = Object.assign({ code_head: customGlyphTypeProperties.code }, customGlyphTypeProperties);\n }\n const code_head = glyphTypeProperties.code_head;\n // The default implementation of getWidth() calls Glyph.getWidth(code_head, scale).\n // This can be overridden by an individual glyph type (see slash noteheads below: Tables.SLASH_NOTEHEAD_WIDTH).\n const getWidth = (scale = Tables.NOTATION_FONT_SCALE) => Glyph.getWidth(code_head, scale);\n // Merge duration props for 'duration' with the note head properties.\n return Object.assign(Object.assign(Object.assign({}, code.common), { getWidth: getWidth }), glyphTypeProperties);\n }\n}\nTables.STEM_WIDTH = 1.5;\nTables.STEM_HEIGHT = 35;\nTables.STAVE_LINE_THICKNESS = 1;\nTables.RESOLUTION = RESOLUTION;\n/**\n * Customize this by calling Flow.setMusicFont(...fontNames);\n */\nTables.MUSIC_FONT_STACK = [];\nTables.NOTATION_FONT_SCALE = 39;\nTables.TABLATURE_FONT_SCALE = 39;\nTables.SLASH_NOTEHEAD_WIDTH = 15;\nTables.STAVE_LINE_DISTANCE = 10;\n// HACK:\n// Since text origins are positioned at the baseline, we must\n// compensate for the ascender of the text. Of course, 1 staff space is\n// a very poor approximation.\n//\n// This will be deprecated in the future. This is a temporary solution until\n// we have more robust text metrics.\nTables.TEXT_HEIGHT_OFFSET_HACK = 1;\nTables.accidentalMap = accidentals;\nTables.accidentalColumnsTable = accidentalColumns;\nTables.unicode = {\n // ♯ accidental sharp\n sharp: String.fromCharCode(0x266f),\n // ♭ accidental flat\n flat: String.fromCharCode(0x266d),\n // ♮ accidental natural\n natural: String.fromCharCode(0x266e),\n // △ major seventh\n triangle: String.fromCharCode(0x25b3),\n // ø half-diminished\n 'o-with-slash': String.fromCharCode(0x00f8),\n // ° diminished\n degrees: String.fromCharCode(0x00b0),\n // ○ diminished\n circle: String.fromCharCode(0x25cb),\n};\n/* The list of valid note types. Used by note.ts during parseNoteStruct(). */\nTables.validTypes = validNoteTypes;\n// Default time signature.\nTables.TIME4_4 = {\n num_beats: 4,\n beat_value: 4,\n resolution: RESOLUTION,\n};\n// 1/2, 1, 2, 4, 8, 16, 32, 64, 128\n// NOTE: There is no 256 here! However, there are other mentions of 256 in this file.\n// For example, in durations has a 256 key, and sanitizeDuration() can return 256.\n// The sanitizeDuration() bit may need to be removed by 0xfe.\n// eslint-disable-next-line\nconst durationCodes = {\n '1/2': {\n common: {\n stem: false,\n stem_offset: 0,\n flag: false,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Breve note\n code_head: 'noteheadDoubleWhole',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDoubleWhole', scale);\n // },\n },\n h: {\n // Breve note harmonic\n code_head: 'unpitchedPercussionClef1',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('unpitchedPercussionClef1', scale);\n // },\n },\n m: {\n // Breve note muted\n code_head: 'vexNoteHeadMutedBreve',\n stem_offset: 0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('vexNoteHeadMutedBreve', scale);\n // },\n },\n r: {\n // Breve rest\n code_head: 'restDoubleWhole',\n rest: true,\n position: 'B/5',\n dot_shiftY: 0.5,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('restDoubleWhole', scale);\n // },\n },\n s: {\n // Breve note slash -\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadDoubleWhole',\n },\n },\n },\n 1: {\n common: {\n stem: false,\n stem_offset: 0,\n flag: false,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Whole note\n code_head: 'noteheadWhole',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadWhole', scale);\n // },\n },\n h: {\n // Whole note harmonic\n code_head: 'noteheadDiamondWhole',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondWhole', scale);\n // },\n },\n m: {\n // Whole note muted\n code_head: 'noteheadXWhole',\n stem_offset: -3,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXWhole', scale);\n // },\n },\n r: {\n // Whole rest\n code_head: 'restWhole',\n rest: true,\n position: 'D/5',\n dot_shiftY: 0.5,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('restWhole', scale);\n // },\n },\n s: {\n // Whole note slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadWhole',\n },\n },\n },\n 2: {\n common: {\n stem: true,\n stem_offset: 0,\n flag: false,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Half note\n code_head: 'noteheadHalf',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadHalf', scale);\n // },\n },\n h: {\n // Half note harmonic\n code_head: 'noteheadDiamondHalf',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondHalf', scale);\n // },\n },\n m: {\n // Half note muted\n code_head: 'noteheadXHalf',\n stem_offset: -3,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXHalf', scale);\n // },\n },\n r: {\n // Half rest\n code_head: 'restHalf',\n stem: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('restHalf', scale);\n // },\n },\n s: {\n // Half note slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadHalf',\n },\n },\n },\n 4: {\n common: {\n stem: true,\n stem_offset: 0,\n flag: false,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Quarter note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Quarter harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Quarter muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Quarter rest\n code_head: 'restQuarter',\n stem: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n line_above: 1.5,\n line_below: 1.5,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('restQuarter', scale);\n // },\n },\n s: {\n // Quarter slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 8: {\n common: {\n stem: true,\n stem_offset: 0,\n flag: true,\n beam_count: 1,\n stem_beam_extension: 0,\n code_flag_upstem: 'flag8thUp',\n code_flag_downstem: 'flag8thDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Eighth note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Eighth note harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Eighth note muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Eighth rest\n code_head: 'rest8th',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n line_above: 1.0,\n line_below: 1.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest8th', scale);\n // },\n },\n s: {\n // Eighth slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 16: {\n common: {\n beam_count: 2,\n stem_beam_extension: 0,\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'flag16thUp',\n code_flag_downstem: 'flag16thDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Sixteenth note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Sixteenth note harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Sixteenth note muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Sixteenth rest\n code_head: 'rest16th',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n line_above: 1.0,\n line_below: 2.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest16th', scale);\n // },\n },\n s: {\n // Sixteenth slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 32: {\n common: {\n beam_count: 3,\n stem_beam_extension: 7.5,\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'flag32ndUp',\n code_flag_downstem: 'flag32ndDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Thirty-second note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Thirty-second harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Thirty-second muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Thirty-second rest\n code_head: 'rest32nd',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -1.5,\n line_above: 2.0,\n line_below: 2.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest32nd', scale);\n // },\n },\n s: {\n // Thirty-second slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 64: {\n common: {\n beam_count: 4,\n stem_beam_extension: 15,\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'flag64thUp',\n code_flag_downstem: 'flag64thDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Sixty-fourth note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Sixty-fourth harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Sixty-fourth muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Sixty-fourth rest\n code_head: 'rest64th',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -1.5,\n line_above: 2.0,\n line_below: 3.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest64th', scale);\n // },\n },\n s: {\n // Sixty-fourth slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n 128: {\n common: {\n beam_count: 5,\n stem_beam_extension: 22.5,\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'flag128thUp',\n code_flag_downstem: 'flag128thDown',\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n n: {\n // Hundred-twenty-eight note\n code_head: 'noteheadBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadBlack', scale);\n // },\n },\n h: {\n // Hundred-twenty-eight harmonic\n code_head: 'noteheadDiamondBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadDiamondBlack', scale);\n // },\n },\n m: {\n // Hundred-twenty-eight muted\n code_head: 'noteheadXBlack',\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('noteheadXBlack', scale);\n // },\n },\n r: {\n // Hundred-twenty-eight rest\n code_head: 'rest128th',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -2.5,\n line_above: 3.0,\n line_below: 3.0,\n // getWidth(scale = Tables.NOTATION_FONT_SCALE): number | undefined {\n // return Glyph.getWidth('rest128th', scale);\n // },\n },\n s: {\n // Hundred-twenty-eight slash\n // Drawn with canvas primitives\n getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n g: {\n // Ghostnote\n code_head: 'noteheadBlack',\n },\n },\n },\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// @author Mohit Cheppudira\n// @author Greg Ristow (modifications)\nimport { Fraction } from './fraction';\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Music } from './music';\nimport { Tables } from './tables';\nimport { Category, isAccidental, isGraceNote, isGraceNoteGroup, isStaveNote } from './typeguard';\nimport { defined, log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Accidental.DEBUG)\n log('Vex.Flow.Accidental', args);\n}\n/**\n * An `Accidental` inherits from `Modifier`, and is formatted within a\n * `ModifierContext`. Accidentals are modifiers that can be attached to\n * notes. Support is included for both western and microtonal accidentals.\n *\n * See `tests/accidental_tests.ts` for usage examples.\n */\nexport class Accidental extends Modifier {\n /**\n * Create accidental.\n * @param type value from `Vex.Flow.accidentalCodes.accidentals` table in `tables.ts`.\n * For example: `#`, `##`, `b`, `n`, etc.\n */\n constructor(type) {\n super();\n L('New accidental: ', type);\n this.type = type;\n this.position = Modifier.Position.LEFT;\n this.render_options = {\n // Font size for glyphs\n font_scale: 38,\n // Padding between accidental and parentheses on each side\n parenLeftPadding: 2,\n parenRightPadding: 2,\n };\n this.accidental = Tables.accidentalCodes(this.type);\n defined(this.accidental, 'ArgumentError', `Unknown accidental type: ${type}`);\n // Cautionary accidentals have parentheses around them\n this.cautionary = false;\n this.reset();\n }\n /** Accidentals category string. */\n static get CATEGORY() {\n return Category.Accidental;\n }\n /** Arrange accidentals inside a ModifierContext. */\n static format(accidentals, state) {\n // If there are no accidentals, no need to format their positions.\n if (!accidentals || accidentals.length === 0)\n return;\n const musicFont = Tables.currentMusicFont();\n const noteheadAccidentalPadding = musicFont.lookupMetric('accidental.noteheadAccidentalPadding');\n const leftShift = state.left_shift + noteheadAccidentalPadding;\n const accidentalSpacing = musicFont.lookupMetric('accidental.accidentalSpacing');\n const additionalPadding = musicFont.lookupMetric('accidental.leftPadding'); // padding to the left of all accidentals\n const accList = [];\n let prevNote = undefined;\n let shiftL = 0;\n // First determine the accidentals' Y positions from the note.keys\n for (let i = 0; i < accidentals.length; ++i) {\n const acc = accidentals[i];\n const note = acc.getNote();\n const stave = note.getStave();\n const index = acc.checkIndex();\n const props = note.getKeyProps()[index];\n if (note !== prevNote) {\n // Iterate through all notes to get the displaced pixels\n for (let n = 0; n < note.keys.length; ++n) {\n shiftL = Math.max(note.getLeftDisplacedHeadPx(), shiftL);\n }\n prevNote = note;\n }\n if (stave) {\n const lineSpace = stave.getSpacingBetweenLines();\n const y = stave.getYForLine(props.line);\n const accLine = Math.round((y / lineSpace) * 2) / 2;\n accList.push({ y, line: accLine, shift: shiftL, acc, lineSpace });\n }\n else {\n accList.push({ line: props.line, shift: shiftL, acc });\n }\n }\n // Sort accidentals by line number.\n accList.sort((a, b) => b.line - a.line);\n // FIXME: Confusing name. Each object in this array has a property called `line`.\n // So if this is a list of lines, you end up with: `line.line` which is very awkward.\n const lineList = [];\n // amount by which all accidentals must be shifted right or left for\n // stem flipping, notehead shifting concerns.\n let accShift = 0;\n let previousLine = undefined;\n // Create an array of unique line numbers (lineList) from accList\n for (let i = 0; i < accList.length; i++) {\n const acc = accList[i];\n // if this is the first line, or a new line, add a lineList\n if (previousLine === undefined || previousLine !== acc.line) {\n lineList.push({\n line: acc.line,\n flatLine: true,\n dblSharpLine: true,\n numAcc: 0,\n width: 0,\n column: 0,\n });\n }\n // if this accidental is not a flat, the accidental needs 3.0 lines lower\n // clearance instead of 2.5 lines for b or bb.\n // FIXME: Naming could use work. acc.acc is very awkward\n if (acc.acc.type !== 'b' && acc.acc.type !== 'bb') {\n lineList[lineList.length - 1].flatLine = false;\n }\n // if this accidental is not a double sharp, the accidental needs 3.0 lines above\n if (acc.acc.type !== '##') {\n lineList[lineList.length - 1].dblSharpLine = false;\n }\n // Track how many accidentals are on this line:\n lineList[lineList.length - 1].numAcc++;\n // Track the total x_offset needed for this line which will be needed\n // for formatting lines w/ multiple accidentals:\n // width = accidental width + universal spacing between accidentals\n lineList[lineList.length - 1].width += acc.acc.getWidth() + accidentalSpacing;\n // if this accShift is larger, use it to keep first column accidentals in the same line\n accShift = acc.shift > accShift ? acc.shift : accShift;\n previousLine = acc.line;\n }\n // ### Place Accidentals in Columns\n //\n // Default to a classic triangular layout (middle accidental farthest left),\n // but follow exceptions as outlined in G. Read's _Music Notation_ and\n // Elaine Gould's _Behind Bars_.\n //\n // Additionally, this implements different vertical collision rules for\n // flats (only need 2.5 lines clearance below) and double sharps (only\n // need 2.5 lines of clearance above or below).\n //\n // Classic layouts and exception patterns are found in the 'tables.js'\n // in 'Tables.accidentalColumnsTable'\n //\n // Beyond 6 vertical accidentals, default to the parallel ascending lines approach,\n // using as few columns as possible for the verticle structure.\n //\n // TODO (?): Allow column to be specified for an accidental at run-time?\n let totalColumns = 0;\n // establish the boundaries for a group of notes with clashing accidentals:\n for (let i = 0; i < lineList.length; i++) {\n let noFurtherConflicts = false;\n const groupStart = i;\n let groupEnd = i;\n while (groupEnd + 1 < lineList.length && !noFurtherConflicts) {\n // if this note conflicts with the next:\n if (this.checkCollision(lineList[groupEnd], lineList[groupEnd + 1])) {\n // include the next note in the group:\n groupEnd++;\n }\n else {\n noFurtherConflicts = true;\n }\n }\n // Gets an a line from the `lineList`, relative to the current group\n const getGroupLine = (index) => lineList[groupStart + index];\n const getGroupLines = (indexes) => indexes.map(getGroupLine);\n const lineDifference = (indexA, indexB) => {\n const [a, b] = getGroupLines([indexA, indexB]).map((item) => item.line);\n return a - b;\n };\n const notColliding = (...indexPairs) => indexPairs.map(getGroupLines).every(([line1, line2]) => !this.checkCollision(line1, line2));\n // Set columns for the lines in this group:\n const groupLength = groupEnd - groupStart + 1;\n // Set the accidental column for each line of the group\n let endCase = this.checkCollision(lineList[groupStart], lineList[groupEnd]) ? 'a' : 'b';\n switch (groupLength) {\n case 3:\n if (endCase === 'a' && lineDifference(1, 2) === 0.5 && lineDifference(0, 1) !== 0.5) {\n endCase = 'second_on_bottom';\n }\n break;\n case 4:\n if (notColliding([0, 2], [1, 3])) {\n endCase = 'spaced_out_tetrachord';\n }\n break;\n case 5:\n if (endCase === 'b' && notColliding([1, 3])) {\n endCase = 'spaced_out_pentachord';\n if (notColliding([0, 2], [2, 4])) {\n endCase = 'very_spaced_out_pentachord';\n }\n }\n break;\n case 6:\n if (notColliding([0, 3], [1, 4], [2, 5])) {\n endCase = 'spaced_out_hexachord';\n }\n if (notColliding([0, 2], [2, 4], [1, 3], [3, 5])) {\n endCase = 'very_spaced_out_hexachord';\n }\n break;\n default:\n break;\n }\n let groupMember;\n let column;\n // If the group contains seven members or more, use ascending parallel lines\n // of accidentals, using as few columns as possible while avoiding collisions.\n if (groupLength >= 7) {\n // First, determine how many columns to use:\n let patternLength = 2;\n let collisionDetected = true;\n while (collisionDetected === true) {\n collisionDetected = false;\n for (let line = 0; line + patternLength < lineList.length; line++) {\n if (this.checkCollision(lineList[line], lineList[line + patternLength])) {\n collisionDetected = true;\n patternLength++;\n break;\n }\n }\n }\n // Then, assign a column to each line of accidentals\n for (groupMember = i; groupMember <= groupEnd; groupMember++) {\n column = ((groupMember - i) % patternLength) + 1;\n lineList[groupMember].column = column;\n totalColumns = totalColumns > column ? totalColumns : column;\n }\n }\n else {\n // If the group contains fewer than seven members, use the layouts from\n // the Tables.accidentalColumnsTable (See: tables.ts).\n for (groupMember = i; groupMember <= groupEnd; groupMember++) {\n column = Tables.accidentalColumnsTable[groupLength][endCase][groupMember - i];\n lineList[groupMember].column = column;\n totalColumns = totalColumns > column ? totalColumns : column;\n }\n }\n // Increment i to the last note that was set, so that if a lower set of notes\n // does not conflict at all with this group, it can have its own classic shape.\n i = groupEnd;\n }\n // ### Convert Columns to x_offsets\n //\n // This keeps columns aligned, even if they have different accidentals within them\n // which sometimes results in a larger x_offset than is an accidental might need\n // to preserve the symmetry of the accidental shape.\n //\n // Neither A.C. Vinci nor G. Read address this, and it typically only happens in\n // music with complex chord clusters.\n //\n // TODO (?): Optionally allow closer compression of accidentals, instead of forcing\n // parallel columns.\n // track each column's max width, which will be used as initial shift of later columns:\n const columnWidths = [];\n const columnXOffsets = [];\n for (let i = 0; i <= totalColumns; i++) {\n columnWidths[i] = 0;\n columnXOffsets[i] = 0;\n }\n columnWidths[0] = accShift + leftShift;\n columnXOffsets[0] = accShift + leftShift;\n // Fill columnWidths with widest needed x-space;\n // this is what keeps the columns parallel.\n lineList.forEach((line) => {\n if (line.width > columnWidths[line.column])\n columnWidths[line.column] = line.width;\n });\n for (let i = 1; i < columnWidths.length; i++) {\n // this column's offset = this column's width + previous column's offset\n columnXOffsets[i] = columnWidths[i] + columnXOffsets[i - 1];\n }\n const totalShift = columnXOffsets[columnXOffsets.length - 1];\n // Set the xShift for each accidental according to column offsets:\n let accCount = 0;\n lineList.forEach((line) => {\n let lineWidth = 0;\n const lastAccOnLine = accCount + line.numAcc;\n // handle all of the accidentals on a given line:\n for (accCount; accCount < lastAccOnLine; accCount++) {\n const xShift = columnXOffsets[line.column - 1] + lineWidth;\n accList[accCount].acc.setXShift(xShift);\n // keep track of the width of accidentals we've added so far, so that when\n // we loop, we add space for them.\n lineWidth += accList[accCount].acc.getWidth() + accidentalSpacing;\n L('Line, accCount, shift: ', line.line, accCount, xShift);\n }\n });\n // update the overall layout with the full width of the accidental shapes:\n state.left_shift += totalShift + additionalPadding;\n }\n /** Helper function to determine whether two lines of accidentals collide vertically */\n static checkCollision(line1, line2) {\n let clearance = line2.line - line1.line;\n let clearanceRequired = 3;\n // But less clearance is required for certain accidentals: b, bb and ##.\n if (clearance > 0) {\n // then line 2 is on top\n clearanceRequired = line2.flatLine || line2.dblSharpLine ? 2.5 : 3.0;\n if (line1.dblSharpLine)\n clearance -= 0.5;\n }\n else {\n // line 1 is on top\n clearanceRequired = line1.flatLine || line1.dblSharpLine ? 2.5 : 3.0;\n if (line2.dblSharpLine)\n clearance -= 0.5;\n }\n const collision = Math.abs(clearance) < clearanceRequired;\n L('Line_1, Line_2, Collision: ', line1.line, line2.line, collision);\n return collision;\n }\n /**\n * Use this method to automatically apply accidentals to a set of `voices`.\n * The accidentals will be remembered between all the voices provided.\n * Optionally, you can also provide an initial `keySignature`.\n */\n static applyAccidentals(voices, keySignature) {\n const tickPositions = [];\n const tickNoteMap = {};\n // Sort the tickables in each voice by their tick position in the voice.\n voices.forEach((voice) => {\n const tickPosition = new Fraction(0, 1);\n const tickable = voice.getTickables();\n tickable.forEach((t) => {\n if (t.shouldIgnoreTicks())\n return;\n const notesAtPosition = tickNoteMap[tickPosition.value()];\n if (!notesAtPosition) {\n tickPositions.push(tickPosition.value());\n tickNoteMap[tickPosition.value()] = [t];\n }\n else {\n notesAtPosition.push(t);\n }\n tickPosition.add(t.getTicks());\n });\n });\n const music = new Music();\n // Default key signature is C major.\n if (!keySignature)\n keySignature = 'C';\n // Get the scale map, which represents the current state of each pitch.\n const scaleMapKey = music.createScaleMap(keySignature);\n const scaleMap = {};\n tickPositions.forEach((tickPos) => {\n const tickables = tickNoteMap[tickPos];\n // Array to store all pitches that modified accidental states\n // at this tick position\n const modifiedPitches = [];\n const processNote = (t) => {\n // Only StaveNote implements .addModifier(), which is used below.\n if (!isStaveNote(t) || t.isRest() || t.shouldIgnoreTicks()) {\n return;\n }\n // Go through each key and determine if an accidental should be applied.\n const staveNote = t;\n staveNote.keys.forEach((keyString, keyIndex) => {\n const key = music.getNoteParts(keyString.split('/')[0]);\n const octave = keyString.split('/')[1];\n // Force a natural for every key without an accidental\n const accidentalString = key.accidental || 'n';\n const pitch = key.root + accidentalString;\n // Determine if the current pitch has the same accidental\n // as the scale state\n if (!scaleMap[key.root + octave])\n scaleMap[key.root + octave] = scaleMapKey[key.root];\n const sameAccidental = scaleMap[key.root + octave] === pitch;\n // Determine if an identical pitch in the chord already\n // modified the accidental state\n const previouslyModified = modifiedPitches.indexOf(keyString) > -1;\n // Remove accidentals\n staveNote.getModifiers().forEach((modifier, index) => {\n if (isAccidental(modifier) && modifier.type == accidentalString && modifier.getIndex() == keyIndex) {\n staveNote.getModifiers().splice(index, 1);\n }\n });\n // Add the accidental to the StaveNote\n if (!sameAccidental || (sameAccidental && previouslyModified)) {\n // Modify the scale map so that the root pitch has an\n // updated state\n scaleMap[key.root + octave] = pitch;\n // Create the accidental\n const accidental = new Accidental(accidentalString);\n // Attach the accidental to the StaveNote\n staveNote.addModifier(accidental, keyIndex);\n // Add the pitch to list of pitches that modified accidentals\n modifiedPitches.push(keyString);\n }\n });\n // process grace notes\n staveNote.getModifiers().forEach((modifier) => {\n if (isGraceNoteGroup(modifier)) {\n modifier.getGraceNotes().forEach(processNote);\n }\n });\n };\n tickables.forEach(processNote);\n });\n }\n reset() {\n const fontScale = this.render_options.font_scale;\n this.glyph = new Glyph(this.accidental.code, fontScale);\n this.glyph.setOriginX(1.0);\n if (this.cautionary) {\n this.parenLeft = new Glyph(Tables.accidentalCodes('{').code, fontScale);\n this.parenRight = new Glyph(Tables.accidentalCodes('}').code, fontScale);\n this.parenLeft.setOriginX(1.0);\n this.parenRight.setOriginX(1.0);\n }\n }\n /** Get width in pixels. */\n getWidth() {\n if (this.cautionary) {\n const parenLeft = defined(this.parenLeft);\n const parenRight = defined(this.parenRight);\n const parenWidth = parenLeft.getMetrics().width +\n parenRight.getMetrics().width +\n this.render_options.parenLeftPadding +\n this.render_options.parenRightPadding;\n return this.glyph.getMetrics().width + parenWidth;\n }\n else {\n return this.glyph.getMetrics().width;\n }\n }\n /** Attach this accidental to `note`, which must be a `StaveNote`. */\n setNote(note) {\n defined(note, 'ArgumentError', `Bad note value: ${note}`);\n this.note = note;\n // Accidentals attached to grace notes are rendered smaller.\n if (isGraceNote(note)) {\n this.render_options.font_scale = 25;\n this.reset();\n }\n return this;\n }\n /** If called, draws parenthesis around accidental. */\n setAsCautionary() {\n this.cautionary = true;\n this.render_options.font_scale = 28;\n this.reset();\n return this;\n }\n /** Render accidental onto canvas. */\n draw() {\n const { type, position, index, cautionary, x_shift, y_shift, glyph, render_options: { parenLeftPadding, parenRightPadding }, } = this;\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n // Figure out the start `x` and `y` coordinates for note and index.\n const start = note.getModifierStartXY(position, index);\n let accX = start.x + x_shift;\n const accY = start.y + y_shift;\n L('Rendering: ', type, accX, accY);\n if (!cautionary) {\n glyph.render(ctx, accX, accY);\n }\n else {\n const parenLeft = defined(this.parenLeft);\n const parenRight = defined(this.parenRight);\n // Render the accidental in parentheses.\n parenRight.render(ctx, accX, accY);\n accX -= parenRight.getMetrics().width;\n accX -= parenRightPadding;\n accX -= this.accidental.parenRightPaddingAdjustment;\n glyph.render(ctx, accX, accY);\n accX -= glyph.getMetrics().width;\n accX -= parenLeftPadding;\n parenLeft.render(ctx, accX, accY);\n }\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Accidental.DEBUG` to `true`. */\nAccidental.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This file implements the `Stem` object. Generally this object is handled\n// by its parent `StemmableNote`.\nimport { Element } from './element';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Stem.DEBUG)\n log('Vex.Flow.Stem', args);\n}\nexport class Stem extends Element {\n constructor(options) {\n super();\n this.stem_up_y_offset = 0;\n this.stem_down_y_offset = 0;\n this.stem_up_y_base_offset = 0;\n this.stem_down_y_base_offset = 0;\n // Default notehead x bounds\n this.x_begin = (options === null || options === void 0 ? void 0 : options.x_begin) || 0;\n this.x_end = (options === null || options === void 0 ? void 0 : options.x_end) || 0;\n // Y bounds for top/bottom most notehead\n this.y_top = (options === null || options === void 0 ? void 0 : options.y_top) || 0;\n this.y_bottom = (options === null || options === void 0 ? void 0 : options.y_bottom) || 0;\n // Stem top extension\n this.stem_extension = (options === null || options === void 0 ? void 0 : options.stem_extension) || 0;\n // Direction of the stem\n this.stem_direction = (options === null || options === void 0 ? void 0 : options.stem_direction) || 0;\n // Flag to override all draw calls\n this.hide = (options === null || options === void 0 ? void 0 : options.hide) || false;\n this.isStemlet = (options === null || options === void 0 ? void 0 : options.isStemlet) || false;\n this.stemletHeight = (options === null || options === void 0 ? void 0 : options.stemletHeight) || 0;\n // Use to adjust the rendered height without affecting\n // the results of `.getExtents()`\n this.renderHeightAdjustment = 0;\n this.setOptions(options);\n }\n static get CATEGORY() {\n return Category.Stem;\n }\n // Stem directions\n static get UP() {\n return 1;\n }\n static get DOWN() {\n return -1;\n }\n // Theme\n static get WIDTH() {\n return Tables.STEM_WIDTH;\n }\n static get HEIGHT() {\n return Tables.STEM_HEIGHT;\n }\n setOptions(options) {\n // Changing where the stem meets the head\n this.stem_up_y_offset = (options === null || options === void 0 ? void 0 : options.stem_up_y_offset) || 0;\n this.stem_down_y_offset = (options === null || options === void 0 ? void 0 : options.stem_down_y_offset) || 0;\n this.stem_up_y_base_offset = (options === null || options === void 0 ? void 0 : options.stem_up_y_base_offset) || 0;\n this.stem_down_y_base_offset = (options === null || options === void 0 ? void 0 : options.stem_down_y_base_offset) || 0;\n }\n // Set the x bounds for the default notehead\n setNoteHeadXBounds(x_begin, x_end) {\n this.x_begin = x_begin;\n this.x_end = x_end;\n return this;\n }\n // Set the direction of the stem in relation to the noteheads\n setDirection(direction) {\n this.stem_direction = direction;\n }\n // Set the extension for the stem, generally for flags or beams\n setExtension(ext) {\n this.stem_extension = ext;\n }\n getExtension() {\n return this.stem_extension;\n }\n // The the y bounds for the top and bottom noteheads\n setYBounds(y_top, y_bottom) {\n this.y_top = y_top;\n this.y_bottom = y_bottom;\n }\n // Gets the entire height for the stem\n getHeight() {\n const y_offset = this.stem_direction === Stem.UP ? this.stem_up_y_offset : this.stem_down_y_offset;\n const unsigned_height = this.y_bottom - this.y_top + (Stem.HEIGHT - y_offset + this.stem_extension); // parentheses just for grouping.\n return unsigned_height * this.stem_direction;\n }\n getBoundingBox() {\n throw new RuntimeError('NotImplemented', 'getBoundingBox() not implemented.');\n }\n // Get the y coordinates for the very base of the stem to the top of\n // the extension\n getExtents() {\n const isStemUp = this.stem_direction === Stem.UP;\n const ys = [this.y_top, this.y_bottom];\n const stemHeight = Stem.HEIGHT + this.stem_extension;\n const innerMostNoteheadY = (isStemUp ? Math.min : Math.max)(...ys);\n const outerMostNoteheadY = (isStemUp ? Math.max : Math.min)(...ys);\n const stemTipY = innerMostNoteheadY + stemHeight * -this.stem_direction;\n return { topY: stemTipY, baseY: outerMostNoteheadY };\n }\n setVisibility(isVisible) {\n this.hide = !isVisible;\n return this;\n }\n setStemlet(isStemlet, stemletHeight) {\n this.isStemlet = isStemlet;\n this.stemletHeight = stemletHeight;\n return this;\n }\n adjustHeightForFlag() {\n this.renderHeightAdjustment = Tables.currentMusicFont().lookupMetric('stem.heightAdjustmentForFlag', -3);\n }\n adjustHeightForBeam() {\n this.renderHeightAdjustment = -Stem.WIDTH / 2;\n }\n // Render the stem onto the canvas\n draw() {\n this.setRendered();\n if (this.hide)\n return;\n const ctx = this.checkContext();\n let stem_x;\n let stem_y;\n const stem_direction = this.stem_direction;\n let y_base_offset = 0;\n if (stem_direction === Stem.DOWN) {\n // Down stems are rendered to the left of the head.\n stem_x = this.x_begin;\n stem_y = this.y_top + this.stem_down_y_offset;\n y_base_offset = this.stem_down_y_base_offset;\n }\n else {\n // Up stems are rendered to the right of the head.\n stem_x = this.x_end;\n stem_y = this.y_bottom - this.stem_up_y_offset;\n y_base_offset = this.stem_up_y_base_offset;\n }\n const stemHeight = this.getHeight();\n L('Rendering stem - ', 'Top Y: ', this.y_top, 'Bottom Y: ', this.y_bottom);\n // The offset from the stem's base which is required fo satisfy the stemlet height\n const stemletYOffset = this.isStemlet ? stemHeight - this.stemletHeight * this.stem_direction : 0;\n // Draw the stem\n ctx.save();\n this.applyStyle(ctx);\n ctx.beginPath();\n ctx.setLineWidth(Stem.WIDTH);\n ctx.moveTo(stem_x, stem_y - stemletYOffset + y_base_offset);\n ctx.lineTo(stem_x, stem_y - stemHeight - this.renderHeightAdjustment * stem_direction);\n ctx.stroke();\n this.restoreStyle(ctx);\n ctx.restore();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Stem.DEBUG` to `true`. */\nStem.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font, FontStyle, FontWeight } from './font';\nimport { log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (TextFormatter.DEBUG)\n log('Vex.Flow.TextFormatter', args);\n}\n/**\n * Text widths are stored in a cache, so we don't have to recompute widths\n * for the same font + string combination.\n *\n * The cache is first keyed by the font information. The key is of the form:\n * `${family}-${size}-${weight}-${style}`\n * The second level key is the specific text to be measured.\n *\n * The stored value is the measured width in `em` units.\n * textWidth == textWidthCache[cacheKey][textToMeasure]\n */\nconst textWidthCache = {};\n/**\n * Applications may register additional fonts via `TextFormatter.registerInfo(info)`.\n * The metrics for those fonts will be made available to the application.\n */\nconst registry = {};\nexport class TextFormatter {\n /**\n * Use `TextFormatter.create(...)` to build an instance from information previously\n * registered via `TextFormatter.registerInfo(info)`.\n */\n constructor(formatterInfo) {\n /** Font family. */\n this.family = '';\n /** Specified in `pt` units. */\n this.size = 14;\n /** Font metrics are extracted at 1000 upem (units per em). */\n this.resolution = 1000;\n /**\n * For text formatting, we do not require glyph outlines, but instead rely on glyph\n * bounding box metrics such as:\n * ```\n * {\n * x_min: 48,\n * x_max: 235,\n * y_min: -17,\n * y_max: 734,\n * ha: 751,\n * leftSideBearing: 48,\n * advanceWidth: 286,\n * }\n * ```\n */\n this.glyphs = {};\n this.serifs = false;\n this.monospaced = false;\n this.italic = false;\n this.bold = false;\n this.superscriptOffset = 0;\n this.subscriptOffset = 0;\n this.maxSizeGlyph = 'H';\n // This is an internal key used to index the `textWidthCache`.\n this.cacheKey = '';\n this.updateParams(formatterInfo);\n }\n /**\n * Return all registered font families.\n */\n static getFontFamilies() {\n const registeredFonts = [];\n for (const fontFamily in registry) {\n const formatterInfo = registry[fontFamily];\n registeredFonts.push(Object.assign({}, formatterInfo));\n }\n return registeredFonts;\n }\n /**\n * Call `TextFormatter.registerInfo(info)` to register font information before using this method.\n *\n * This method creates a formatter for the font that most closely matches the requested font.\n * We compare font family, bold, and italic attributes.\n * This method will return a fallback formatter if there are no matches.\n */\n static create(requestedFont = {}) {\n L('create: ', requestedFont);\n if (!requestedFont.family) {\n requestedFont.family = Font.SANS_SERIF;\n }\n // TODO: One potential (small) optimization is to cache the TextFormatter object\n // returned for each font info. We would probably want to clear the cache if\n // the registry is ever updated.\n const candidates = [];\n // The incoming font family is a string of comma-separated font family names.\n // (e.g., `PetalumaScript, Arial, sans-serif`).\n const requestedFamilies = requestedFont.family.split(/\\s*,\\s*/);\n for (const requestedFamily of requestedFamilies) {\n for (const fontFamily in registry) {\n // Support cases where the registry contains 'Roboto Slab Medium',\n // but the requestedFont.family is 'Roboto Slab'.\n if (fontFamily.startsWith(requestedFamily)) {\n candidates.push(registry[fontFamily]);\n }\n }\n if (candidates.length > 0) {\n break;\n }\n }\n let formatter;\n if (candidates.length === 0) {\n // No match, so return a fallback text formatter.\n formatter = new TextFormatter(Object.values(registry)[0]);\n }\n else if (candidates.length === 1) {\n formatter = new TextFormatter(candidates[0]);\n }\n else {\n const bold = Font.isBold(requestedFont.weight);\n const italic = Font.isItalic(requestedFont.style);\n const perfectMatch = candidates.find((f) => f.bold === bold && f.italic === italic);\n if (perfectMatch) {\n formatter = new TextFormatter(perfectMatch);\n }\n else {\n const partialMatch = candidates.find((f) => f.italic === italic || f.bold === bold);\n if (partialMatch) {\n formatter = new TextFormatter(partialMatch);\n }\n else {\n formatter = new TextFormatter(candidates[0]);\n }\n }\n }\n const fontSize = requestedFont.size;\n if (typeof fontSize !== 'undefined') {\n const fontSizeInPt = Font.convertSizeToPointValue(fontSize);\n formatter.setFontSize(fontSizeInPt);\n }\n return formatter;\n }\n /**\n * @param fontFamily used as a key to the font registry.\n * @returns the same info object that was passed in via `TextFormatter.registerInfo(info)`\n */\n static getInfo(fontFamily) {\n return registry[fontFamily];\n }\n /**\n * Apps may register their own fonts and metrics, and those metrics\n * will be available to the app for formatting.\n *\n * Metrics can be generated from a font file using fontgen_text.js in the tools/fonts directory.\n * @param info\n * @param overwrite\n */\n static registerInfo(info, overwrite = false) {\n L('registerInfo: ', info, overwrite);\n const fontFamily = info.family;\n const currFontInfo = registry[fontFamily];\n if (currFontInfo === undefined || overwrite) {\n registry[fontFamily] = info;\n }\n }\n updateParams(params) {\n if (params.family)\n this.family = params.family;\n if (params.resolution)\n this.resolution = params.resolution;\n if (params.glyphs)\n this.glyphs = params.glyphs;\n if (params.serifs)\n this.serifs = params.serifs;\n if (params.monospaced)\n this.monospaced = params.monospaced;\n if (params.italic)\n this.italic = params.italic;\n if (params.bold)\n this.bold = params.bold;\n if (params.maxSizeGlyph)\n this.maxSizeGlyph = params.maxSizeGlyph;\n if (params.superscriptOffset)\n this.superscriptOffset = params.superscriptOffset;\n if (params.subscriptOffset)\n this.subscriptOffset = params.subscriptOffset;\n this.updateCacheKey();\n }\n /** Create a hash with the current font data, so we can cache computed widths. */\n updateCacheKey() {\n const family = this.family.replace(/\\s+/g, '_');\n const size = this.size;\n const weight = this.bold ? FontWeight.BOLD : FontWeight.NORMAL;\n const style = this.italic ? FontStyle.ITALIC : FontStyle.NORMAL;\n // Use the same key format as SVGContext.\n this.cacheKey = `${family}%${size}%${weight}%${style}`;\n }\n /**\n * The glyphs table is indexed by the character (e.g., 'C', '@').\n * See: robotoslab_glyphs.ts & petalumascript_glyphs.ts.\n */\n getGlyphMetrics(character) {\n if (this.glyphs[character]) {\n return this.glyphs[character];\n }\n else {\n return this.glyphs[this.maxSizeGlyph];\n }\n }\n get maxHeight() {\n const metrics = this.getGlyphMetrics(this.maxSizeGlyph);\n return (metrics.ha / this.resolution) * this.fontSizeInPixels;\n }\n /**\n * Retrieve the character's advanceWidth as a fraction of an `em` unit.\n * For the space character ' ' as defined in the:\n * petalumascript_glyphs.ts: 250 advanceWidth in the 1000 unitsPerEm font returns 0.25.\n * robotoslab_glyphs.ts: 509 advanceWidth in the 2048 unitsPerEm font returns 0.2485.\n */\n getWidthForCharacterInEm(c) {\n var _a;\n const metrics = this.getGlyphMetrics(c);\n if (!metrics) {\n // An arbitrary number, close to the `em` width of the '#' and '5' characters in PetalumaScript.\n return 0.65;\n }\n else {\n const advanceWidth = (_a = metrics.advanceWidth) !== null && _a !== void 0 ? _a : 0;\n return advanceWidth / this.resolution;\n }\n }\n /**\n * Retrieve the total width of `text` in `em` units.\n */\n getWidthForTextInEm(text) {\n const key = this.cacheKey;\n // Get the cache for this specific font family, size, weight, style combination.\n // The cache contains previously computed widths for different `text` strings.\n let cachedWidths = textWidthCache[key];\n if (cachedWidths === undefined) {\n cachedWidths = {};\n textWidthCache[key] = cachedWidths;\n }\n let width = cachedWidths[text];\n if (width === undefined) {\n width = 0;\n for (let i = 0; i < text.length; ++i) {\n width += this.getWidthForCharacterInEm(text[i]);\n }\n cachedWidths[text] = width;\n }\n return width;\n }\n /** The width of the text (in `em`) is scaled by the font size (in `px`). */\n getWidthForTextInPx(text) {\n return this.getWidthForTextInEm(text) * this.fontSizeInPixels;\n }\n /**\n * @param size in pt.\n */\n setFontSize(size) {\n this.size = size;\n // The width cache key depends on the current font size.\n this.updateCacheKey();\n return this;\n }\n /** `this.size` is specified in points. Convert to pixels. */\n get fontSizeInPixels() {\n return this.size * Font.scaleToPxFrom.pt;\n }\n getResolution() {\n return this.resolution;\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.TextFormatter.DEBUG` to `true`. */\nTextFormatter.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { TextFormatter } from './textformatter';\nimport { Category, isStemmableNote, isTabNote } from './typeguard';\nimport { log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Annotation.DEBUG)\n log('Vex.Flow.Annotation', args);\n}\nexport var AnnotationHorizontalJustify;\n(function (AnnotationHorizontalJustify) {\n AnnotationHorizontalJustify[AnnotationHorizontalJustify[\"LEFT\"] = 1] = \"LEFT\";\n AnnotationHorizontalJustify[AnnotationHorizontalJustify[\"CENTER\"] = 2] = \"CENTER\";\n AnnotationHorizontalJustify[AnnotationHorizontalJustify[\"RIGHT\"] = 3] = \"RIGHT\";\n AnnotationHorizontalJustify[AnnotationHorizontalJustify[\"CENTER_STEM\"] = 4] = \"CENTER_STEM\";\n})(AnnotationHorizontalJustify || (AnnotationHorizontalJustify = {}));\nexport var AnnotationVerticalJustify;\n(function (AnnotationVerticalJustify) {\n AnnotationVerticalJustify[AnnotationVerticalJustify[\"TOP\"] = 1] = \"TOP\";\n AnnotationVerticalJustify[AnnotationVerticalJustify[\"CENTER\"] = 2] = \"CENTER\";\n AnnotationVerticalJustify[AnnotationVerticalJustify[\"BOTTOM\"] = 3] = \"BOTTOM\";\n AnnotationVerticalJustify[AnnotationVerticalJustify[\"CENTER_STEM\"] = 4] = \"CENTER_STEM\";\n})(AnnotationVerticalJustify || (AnnotationVerticalJustify = {}));\n/**\n * Annotations are modifiers that can be attached to\n * notes.\n *\n * See `tests/annotation_tests.ts` for usage examples.\n */\nexport class Annotation extends Modifier {\n /**\n * Annotations inherit from `Modifier` and is positioned correctly when\n * in a `ModifierContext`.\n * Create a new `Annotation` with the string `text`.\n */\n constructor(text) {\n super();\n this.text = text;\n this.horizontalJustification = AnnotationHorizontalJustify.CENTER;\n // warning: the default in the constructor is TOP, but in the factory the default is BOTTOM.\n // this is to support legacy application that may expect this.\n this.verticalJustification = AnnotationVerticalJustify.TOP;\n this.resetFont();\n // The default width is calculated from the text.\n this.setWidth(Tables.textWidth(text));\n }\n /** Annotations category string. */\n static get CATEGORY() {\n return Category.Annotation;\n }\n /** Arrange annotations within a `ModifierContext` */\n static format(annotations, state) {\n if (!annotations || annotations.length === 0)\n return false;\n let width = 0;\n for (let i = 0; i < annotations.length; ++i) {\n const annotation = annotations[i];\n const textFormatter = TextFormatter.create(annotation.textFont);\n // Text height is expressed in fractional stave spaces.\n const textLines = (5 + textFormatter.maxHeight) / Tables.STAVE_LINE_DISTANCE;\n let verticalSpaceNeeded = textLines;\n const note = annotation.checkAttachedNote();\n const stave = note.getStave();\n const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP;\n let stemHeight = 0;\n let lines = 5;\n if (isTabNote(note)) {\n if (note.render_options.draw_stem) {\n const stem = note.getStem();\n if (stem) {\n stemHeight = Math.abs(stem.getHeight()) / Tables.STAVE_LINE_DISTANCE;\n }\n }\n else {\n stemHeight = 0;\n }\n }\n else if (isStemmableNote(note)) {\n const stem = note.getStem();\n if (stem && note.getNoteType() === 'n') {\n stemHeight = Math.abs(stem.getHeight()) / Tables.STAVE_LINE_DISTANCE;\n }\n }\n if (stave) {\n lines = stave.getNumLines();\n }\n // Get the text width from the font metrics.\n const textWidth = textFormatter.getWidthForTextInPx(annotation.text);\n width = Math.max(width, textWidth);\n if (annotation.verticalJustification === this.VerticalJustify.TOP) {\n let noteLine = note.getLineNumber(true);\n if (isTabNote(note)) {\n noteLine = lines - (note.leastString() - 0.5);\n }\n if (stemDirection === Stem.UP) {\n noteLine += stemHeight;\n }\n const curTop = noteLine + state.top_text_line + 0.5;\n if (curTop < lines) {\n annotation.setTextLine(lines - noteLine);\n verticalSpaceNeeded += lines - noteLine;\n state.top_text_line = verticalSpaceNeeded;\n }\n else {\n annotation.setTextLine(state.top_text_line);\n state.top_text_line += verticalSpaceNeeded;\n }\n }\n else if (annotation.verticalJustification === this.VerticalJustify.BOTTOM) {\n let noteLine = lines - note.getLineNumber();\n if (isTabNote(note)) {\n noteLine = note.greatestString() - 1;\n }\n if (stemDirection === Stem.DOWN) {\n noteLine += stemHeight;\n }\n const curBottom = noteLine + state.text_line + 1;\n if (curBottom < lines) {\n annotation.setTextLine(lines - curBottom);\n verticalSpaceNeeded += lines - curBottom;\n state.text_line = verticalSpaceNeeded;\n }\n else {\n annotation.setTextLine(state.text_line);\n state.text_line += verticalSpaceNeeded;\n }\n }\n else {\n annotation.setTextLine(state.text_line);\n }\n }\n state.left_shift += width / 2;\n state.right_shift += width / 2;\n return true;\n }\n /**\n * Set vertical position of text (above or below stave).\n * @param just value in `AnnotationVerticalJustify`.\n */\n setVerticalJustification(just) {\n this.verticalJustification = typeof just === 'string' ? Annotation.VerticalJustifyString[just] : just;\n return this;\n }\n /**\n * Get horizontal justification.\n */\n getJustification() {\n return this.horizontalJustification;\n }\n /**\n * Set horizontal justification.\n * @param justification value in `Annotation.Justify`.\n */\n setJustification(just) {\n this.horizontalJustification = typeof just === 'string' ? Annotation.HorizontalJustifyString[just] : just;\n return this;\n }\n /** Render text beside the note. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP;\n const textFormatter = TextFormatter.create(this.textFont);\n const start = note.getModifierStartXY(ModifierPosition.ABOVE, this.index);\n this.setRendered();\n // We're changing context parameters. Save current state.\n ctx.save();\n const classString = Object.keys(this.getAttribute('classes')).join(' ');\n ctx.openGroup(classString, this.getAttribute('id'));\n ctx.setFont(this.textFont);\n const text_width = ctx.measureText(this.text).width;\n const text_height = textFormatter.maxHeight + 2;\n let x;\n let y;\n if (this.horizontalJustification === AnnotationHorizontalJustify.LEFT) {\n x = start.x;\n }\n else if (this.horizontalJustification === AnnotationHorizontalJustify.RIGHT) {\n x = start.x - text_width;\n }\n else if (this.horizontalJustification === AnnotationHorizontalJustify.CENTER) {\n x = start.x - text_width / 2;\n } /* CENTER_STEM */\n else {\n x = note.getStemX() - text_width / 2;\n }\n let stem_ext = {};\n let spacing = 0;\n const has_stem = note.hasStem();\n const stave = note.checkStave();\n // The position of the text varies based on whether or not the note\n // has a stem.\n if (has_stem) {\n stem_ext = note.checkStem().getExtents();\n spacing = stave.getSpacingBetweenLines();\n }\n if (this.verticalJustification === AnnotationVerticalJustify.BOTTOM) {\n // Use the largest (lowest) Y value\n const ys = note.getYs();\n y = ys.reduce((a, b) => (a > b ? a : b));\n y += (this.text_line + 1) * Tables.STAVE_LINE_DISTANCE + text_height;\n if (has_stem && stemDirection === Stem.DOWN) {\n y = Math.max(y, stem_ext.topY + text_height + spacing * this.text_line);\n }\n }\n else if (this.verticalJustification === AnnotationVerticalJustify.CENTER) {\n const yt = note.getYForTopText(this.text_line) - 1;\n const yb = stave.getYForBottomText(this.text_line);\n y = yt + (yb - yt) / 2 + text_height / 2;\n }\n else if (this.verticalJustification === AnnotationVerticalJustify.TOP) {\n y = note.getYs()[0] - (this.text_line + 1) * Tables.STAVE_LINE_DISTANCE;\n if (has_stem && stemDirection === Stem.UP) {\n // If the stem is above the stave already, go with default line width vs. actual\n // since the lines between don't really matter.\n spacing = stem_ext.topY < stave.getTopLineTopY() ? Tables.STAVE_LINE_DISTANCE : spacing;\n y = Math.min(y, stem_ext.topY - spacing * (this.text_line + 1));\n }\n } /* CENTER_STEM */\n else {\n const extents = note.getStemExtents();\n y = extents.topY + (extents.baseY - extents.topY) / 2 + text_height / 2;\n }\n L('Rendering annotation: ', this.text, x, y);\n ctx.fillText(this.text, x, y);\n ctx.closeGroup();\n ctx.restore();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Annotation.DEBUG` to `true`. */\nAnnotation.DEBUG = false;\nAnnotation.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n/** Text annotations can be positioned and justified relative to the note. */\nAnnotation.HorizontalJustify = AnnotationHorizontalJustify;\nAnnotation.HorizontalJustifyString = {\n left: AnnotationHorizontalJustify.LEFT,\n right: AnnotationHorizontalJustify.RIGHT,\n center: AnnotationHorizontalJustify.CENTER,\n centerStem: AnnotationHorizontalJustify.CENTER_STEM,\n};\nAnnotation.VerticalJustify = AnnotationVerticalJustify;\nAnnotation.VerticalJustifyString = {\n above: AnnotationVerticalJustify.TOP,\n top: AnnotationVerticalJustify.TOP,\n below: AnnotationVerticalJustify.BOTTOM,\n bottom: AnnotationVerticalJustify.BOTTOM,\n center: AnnotationVerticalJustify.CENTER,\n centerStem: AnnotationVerticalJustify.CENTER_STEM,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Larry Kuhns.\n// MIT License\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category, isGraceNote, isStaveNote, isStemmableNote, isTabNote } from './typeguard';\nimport { defined, log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Articulation.DEBUG)\n log('Vex.Flow.Articulation', args);\n}\nconst { ABOVE, BELOW } = Modifier.Position;\nfunction roundToNearestHalf(mathFn, value) {\n return mathFn(value / 0.5) * 0.5;\n}\n// This includes both staff and ledger lines\nfunction isWithinLines(line, position) {\n return position === ABOVE ? line <= 5 : line >= 1;\n}\nfunction getRoundingFunction(line, position) {\n if (isWithinLines(line, position)) {\n if (position === ABOVE) {\n return Math.ceil;\n }\n else {\n return Math.floor;\n }\n }\n else {\n return Math.round;\n }\n}\nfunction snapLineToStaff(canSitBetweenLines, line, position, offsetDirection) {\n // Initially, snap to nearest staff line or space\n const snappedLine = roundToNearestHalf(getRoundingFunction(line, position), line);\n const canSnapToStaffSpace = canSitBetweenLines && isWithinLines(snappedLine, position);\n const onStaffLine = snappedLine % 1 === 0;\n if (canSnapToStaffSpace && onStaffLine) {\n const HALF_STAFF_SPACE = 0.5;\n return snappedLine + HALF_STAFF_SPACE * -offsetDirection;\n }\n else {\n return snappedLine;\n }\n}\n// Helper function for checking if a Note object is either a StaveNote or a GraceNote.\nconst isStaveOrGraceNote = (note) => isStaveNote(note) || isGraceNote(note);\nfunction getTopY(note, textLine) {\n const stemDirection = note.getStemDirection();\n const { topY: stemTipY, baseY: stemBaseY } = note.getStemExtents();\n if (isStaveOrGraceNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return stemTipY;\n }\n else {\n return stemBaseY;\n }\n }\n else {\n return Math.min(...note.getYs());\n }\n }\n else if (isTabNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return stemTipY;\n }\n else {\n return note.checkStave().getYForTopText(textLine);\n }\n }\n else {\n return note.checkStave().getYForTopText(textLine);\n }\n }\n else {\n throw new RuntimeError('UnknownCategory', 'Only can get the top and bottom ys of stavenotes and tabnotes');\n }\n}\nfunction getBottomY(note, textLine) {\n const stemDirection = note.getStemDirection();\n const { topY: stemTipY, baseY: stemBaseY } = note.getStemExtents();\n if (isStaveOrGraceNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return stemBaseY;\n }\n else {\n return stemTipY;\n }\n }\n else {\n return Math.max(...note.getYs());\n }\n }\n else if (isTabNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return note.checkStave().getYForBottomText(textLine);\n }\n else {\n return stemTipY;\n }\n }\n else {\n return note.checkStave().getYForBottomText(textLine);\n }\n }\n else {\n throw new RuntimeError('UnknownCategory', 'Only can get the top and bottom ys of stavenotes and tabnotes');\n }\n}\n/**\n * Get the initial offset of the articulation from the y value of the starting position.\n * This is required because the top/bottom text positions already have spacing applied to\n * provide a \"visually pleasant\" default position. However the y values provided from\n * the stavenote's top/bottom do *not* have any pre-applied spacing. This function\n * normalizes this asymmetry.\n * @param note\n * @param position\n * @returns\n */\nfunction getInitialOffset(note, position) {\n const isOnStemTip = (position === ABOVE && note.getStemDirection() === Stem.UP) ||\n (position === BELOW && note.getStemDirection() === Stem.DOWN);\n if (isStaveOrGraceNote(note)) {\n if (note.hasStem() && isOnStemTip) {\n return 0.5;\n }\n else {\n // this amount is larger than the stem-tip offset because we start from\n // the center of the notehead\n return 1;\n }\n }\n else {\n if (note.hasStem() && isOnStemTip) {\n return 1;\n }\n else {\n return 0;\n }\n }\n}\n/**\n * Articulations and Accents are modifiers that can be\n * attached to notes. The complete list of articulations is available in\n * `tables.ts` under `Vex.Flow.articulationCodes`.\n *\n * See `tests/articulation_tests.ts` for usage examples.\n */\nexport class Articulation extends Modifier {\n /**\n * Create a new articulation.\n * @param type entry in `Vex.Flow.articulationCodes` in `tables.ts`\n */\n constructor(type) {\n super();\n this.type = type;\n this.position = BELOW;\n this.render_options = {\n font_scale: 38,\n };\n this.reset();\n }\n /** Articulations category string. */\n static get CATEGORY() {\n return Category.Articulation;\n }\n /**\n * FIXME:\n * Most of the complex formatting logic (ie: snapping to space) is\n * actually done in .render(). But that logic belongs in this method.\n *\n * Unfortunately, this isn't possible because, by this point, stem lengths\n * have not yet been finalized. Finalized stem lengths are required to determine the\n * initial position of any stem-side articulation.\n *\n * This indicates that all objects should have their stave set before being\n * formatted. It can't be an optional if you want accurate vertical positioning.\n * Consistently positioned articulations that play nice with other modifiers\n * won't be possible until we stop relying on render-time formatting.\n *\n * Ideally, when this function has completed, the vertical articulation positions\n * should be ready to render without further adjustment. But the current state\n * is far from this ideal.\n */\n static format(articulations, state) {\n if (!articulations || articulations.length === 0)\n return false;\n const margin = 0.5;\n const getIncrement = (articulation, line, position) => roundToNearestHalf(getRoundingFunction(line, position), defined(articulation.glyph.getMetrics().height) / 10 + margin);\n articulations.forEach((articulation) => {\n const note = articulation.checkAttachedNote();\n let lines = 5;\n const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP;\n let stemHeight = 0;\n // Decide if we need to consider beam direction in placement.\n if (isStemmableNote(note)) {\n const stem = note.getStem();\n if (stem) {\n stemHeight = Math.abs(stem.getHeight()) / Tables.STAVE_LINE_DISTANCE;\n }\n }\n const stave = note.getStave();\n if (stave) {\n lines = stave.getNumLines();\n }\n if (articulation.getPosition() === ABOVE) {\n let noteLine = note.getLineNumber(true);\n if (stemDirection === Stem.UP) {\n noteLine += stemHeight;\n }\n let increment = getIncrement(articulation, state.top_text_line, ABOVE);\n const curTop = noteLine + state.top_text_line + 0.5;\n // If articulation must be above stave, add lines between note and stave top\n if (!articulation.articulation.between_lines && curTop < lines) {\n increment += lines - curTop;\n }\n articulation.setTextLine(state.top_text_line);\n state.top_text_line += increment;\n }\n else if (articulation.getPosition() === BELOW) {\n let noteLine = Math.max(lines - note.getLineNumber(), 0);\n if (stemDirection === Stem.DOWN) {\n noteLine += stemHeight;\n }\n let increment = getIncrement(articulation, state.text_line, BELOW);\n const curBottom = noteLine + state.text_line + 0.5;\n // if articulation must be below stave, add lines from note to stave bottom\n if (!articulation.articulation.between_lines && curBottom < lines) {\n increment += lines - curBottom;\n }\n articulation.setTextLine(state.text_line);\n state.text_line += increment;\n }\n });\n const width = articulations\n .map((articulation) => articulation.getWidth())\n .reduce((maxWidth, articWidth) => Math.max(articWidth, maxWidth));\n state.left_shift += width / 2;\n state.right_shift += width / 2;\n return true;\n }\n static easyScoreHook({ articulations }, note, builder) {\n if (!articulations)\n return;\n const articNameToCode = {\n staccato: 'a.',\n tenuto: 'a-',\n accent: 'a>',\n };\n articulations\n .split(',')\n .map((articString) => articString.trim().split('.'))\n .map(([name, position]) => {\n const artic = { type: articNameToCode[name] };\n if (position)\n artic.position = Modifier.PositionString[position];\n return builder.getFactory().Articulation(artic);\n })\n .map((artic) => note.addModifier(artic, 0));\n }\n reset() {\n this.articulation = Tables.articulationCodes(this.type);\n const articulation = defined(this.articulation, 'ArgumentError', `Articulation not found: ${this.type}`);\n const code = (this.position === ABOVE ? articulation.aboveCode : articulation.belowCode) || articulation.code;\n this.glyph = new Glyph(code !== null && code !== void 0 ? code : '', this.render_options.font_scale);\n this.setWidth(defined(this.glyph.getMetrics().width));\n }\n /** Render articulation in position next to note. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const index = this.checkIndex();\n const { position, glyph, text_line: textLine } = this;\n const canSitBetweenLines = this.articulation.between_lines;\n const stave = note.checkStave();\n const staffSpace = stave.getSpacingBetweenLines();\n const isTab = isTabNote(note);\n // Articulations are centered over/under the note head.\n const { x } = note.getModifierStartXY(position, index);\n const shouldSitOutsideStaff = !canSitBetweenLines || isTab;\n const initialOffset = getInitialOffset(note, position);\n const padding = Tables.currentMusicFont().lookupMetric(`articulation.${glyph.getCode()}.padding`, 0);\n let y = {\n [ABOVE]: () => {\n glyph.setOrigin(0.5, 1);\n const y = getTopY(note, textLine) - (textLine + initialOffset) * staffSpace;\n return shouldSitOutsideStaff ? Math.min(stave.getYForTopText(Articulation.INITIAL_OFFSET), y) : y;\n },\n [BELOW]: () => {\n glyph.setOrigin(0.5, 0);\n const y = getBottomY(note, textLine) + (textLine + initialOffset) * staffSpace;\n return shouldSitOutsideStaff ? Math.max(stave.getYForBottomText(Articulation.INITIAL_OFFSET), y) : y;\n },\n }[position]();\n if (!isTab) {\n const offsetDirection = position === ABOVE ? -1 : +1;\n const noteLine = note.getKeyProps()[index].line;\n const distanceFromNote = (note.getYs()[index] - y) / staffSpace;\n const articLine = distanceFromNote + Number(noteLine);\n const snappedLine = snapLineToStaff(canSitBetweenLines, articLine, position, offsetDirection);\n if (isWithinLines(snappedLine, position))\n glyph.setOrigin(0.5, 0.5);\n y += Math.abs(snappedLine - articLine) * staffSpace * offsetDirection + padding * offsetDirection;\n }\n L(`Rendering articulation at (x: ${x}, y: ${y})`);\n glyph.render(ctx, x, y);\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Articulation.DEBUG` to `true`. */\nArticulation.DEBUG = false;\nArticulation.INITIAL_OFFSET = -0.5;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2021.\n// MIT License\nimport { Category } from './typeguard';\nexport class RenderContext {\n static get CATEGORY() {\n return Category.RenderContext;\n }\n set font(f) {\n this.setFont(f);\n }\n get font() {\n return this.getFont();\n }\n /**\n * This is kept for backwards compatibility with 3.0.9.\n * @deprecated use `setFont(...)` instead since it now supports CSS font shorthand.\n */\n setRawFont(f) {\n this.setFont(f);\n return this;\n }\n}\n/**\n * Draw a tiny dot marker on the specified context. A great debugging aid.\n * @param ctx context\n * @param x dot x coordinate\n * @param y dot y coordinate\n * @param color\n */\nexport function drawDot(ctx, x, y, color = '#F55') {\n ctx.save();\n ctx.setFillStyle(color);\n // draw a circle\n ctx.beginPath();\n ctx.arc(x, y, 3, 0, Math.PI * 2, true);\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Fraction } from './fraction';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\n/**\n * Tickable represents a element that sit on a score and\n * has a duration, i.e., Tickables occupy space in the musical rendering dimension.\n */\nexport class Tickable extends Element {\n constructor() {\n super();\n this._preFormatted = false;\n this._postFormatted = false;\n // These properties represent the duration of\n // this tickable element.\n this.ticks = new Fraction(0, 1); // Fractional value of ticks\n this.intrinsicTicks = 0; // Floating point value of ticks\n this.tickMultiplier = new Fraction(1, 1);\n // Formatter metrics\n this.width = 0;\n this.x_shift = 0; // Shift from tick context\n this.modifiers = [];\n this.tupletStack = [];\n this.align_center = false;\n this.center_x_shift = 0; // Shift from tick context if center aligned\n // This flag tells the formatter to ignore this tickable during\n // formatting and justification. It is set by tickables such as BarNote.\n this.ignore_ticks = false;\n // This is a space for an external formatting class or function to maintain\n // metrics.\n this.formatterMetrics = {\n // The freedom of a tickable is the distance it can move without colliding\n // with neighboring elements. A formatter can set these values during its\n // formatting pass, which a different formatter can then use to fine tune.\n freedom: { left: 0, right: 0 },\n // The simplified rational duration of this tick as a string. It can be\n // used as an index to a map or hashtable.\n duration: '',\n // The number of formatting iterations undergone.\n iterations: 0,\n // The space in pixels allocated by this formatter, along with the mean space\n // for tickables of this duration, and the deviation from the mean.\n space: {\n used: 0,\n mean: 0,\n deviation: 0,\n },\n };\n }\n static get CATEGORY() {\n return Category.Tickable;\n }\n /** Reset the Tickable, this function will be overloaded. */\n reset() {\n return this;\n }\n /** Return the ticks. */\n getTicks() {\n return this.ticks;\n }\n /** Check if it ignores the ticks. */\n shouldIgnoreTicks() {\n return this.ignore_ticks;\n }\n /** Ignore the ticks. */\n setIgnoreTicks(flag) {\n this.ignore_ticks = flag;\n return this;\n }\n /** Set width of note. Used by the formatter for positioning. */\n setWidth(width) {\n this.width = width;\n }\n /** Get width of note. Used by the formatter for positioning. */\n getWidth() {\n if (!this._preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call GetWidth on an unformatted note.\");\n }\n return this.width + (this.modifierContext ? this.modifierContext.getWidth() : 0);\n }\n /** Displace note by `x` pixels. Used by the formatter. */\n setXShift(x) {\n this.x_shift = x;\n return this;\n }\n /** Get the `x` displaced pixels of the note. */\n getXShift() {\n return this.x_shift;\n }\n /** Get `x` position of this tick context. */\n getX() {\n const tickContext = this.checkTickContext(`Can't getX() without a TickContext.`);\n return tickContext.getX() + this.x_shift;\n }\n /** Return the formatterMetrics. */\n getFormatterMetrics() {\n return this.formatterMetrics;\n }\n /** Return the center `x` shift. */\n getCenterXShift() {\n if (this.isCenterAligned()) {\n return this.center_x_shift;\n }\n return 0;\n }\n /** Set the center `x` shift. */\n setCenterXShift(centerXShift) {\n this.center_x_shift = centerXShift;\n return this;\n }\n // Check if tickable is center aligned. */\n isCenterAligned() {\n return this.align_center;\n }\n // Set/unset center alignment. */\n setCenterAlignment(align_center) {\n this.align_center = align_center;\n return this;\n }\n /**\n * Return the associated voice. Every tickable must be associated with a voice.\n * This allows formatters and preFormatter to associate them with the right modifierContexts.\n */\n getVoice() {\n return defined(this.voice, 'NoVoice', 'Tickable has no voice.');\n }\n /** Set the associated voice. */\n setVoice(voice) {\n this.voice = voice;\n }\n /** Get the tuplet. */\n getTuplet() {\n return this.tuplet;\n }\n /** Return the intrinsic ticks. */\n getTupletStack() {\n return this.tupletStack;\n }\n /**\n * Reset the specific Tuplet if this is not provided, all tuplets are reset.\n * Remove any prior tuplets from the tick calculation and\n * reset the intrinsic tick value.\n */\n resetTuplet(tuplet) {\n let noteCount;\n let notesOccupied;\n if (tuplet) {\n const i = this.tupletStack.indexOf(tuplet);\n if (i !== -1) {\n this.tupletStack.splice(i, 1);\n noteCount = tuplet.getNoteCount();\n notesOccupied = tuplet.getNotesOccupied();\n // Revert old multiplier by inverting numerator & denom.:\n this.applyTickMultiplier(noteCount, notesOccupied);\n }\n return this;\n }\n while (this.tupletStack.length) {\n tuplet = this.tupletStack.pop();\n noteCount = tuplet.getNoteCount();\n notesOccupied = tuplet.getNotesOccupied();\n // Revert old multiplier by inverting numerator & denom.:\n this.applyTickMultiplier(noteCount, notesOccupied);\n }\n return this;\n }\n /** Attach to new tuplet. */\n setTuplet(tuplet) {\n if (tuplet) {\n this.tupletStack.push(tuplet);\n const noteCount = tuplet.getNoteCount();\n const notesOccupied = tuplet.getNotesOccupied();\n this.applyTickMultiplier(notesOccupied, noteCount);\n }\n this.tuplet = tuplet;\n return this;\n }\n /**\n * Add self to the provided ModifierContext `mc`.\n * If this tickable has modifiers, set modifierContext.\n * @returns this\n */\n addToModifierContext(mc) {\n this.modifierContext = mc;\n for (let i = 0; i < this.modifiers.length; ++i) {\n this.modifierContext.addMember(this.modifiers[i]);\n }\n this.modifierContext.addMember(this);\n this._preFormatted = false;\n return this;\n }\n /**\n * Optional, if tickable has modifiers, associate a Modifier.\n * @param mod the modifier\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n addModifier(modifier, index = 0) {\n this.modifiers.push(modifier);\n this._preFormatted = false;\n return this;\n }\n /** Get the list of associated modifiers. */\n getModifiers() {\n return this.modifiers;\n }\n /** Set the Tick Context. */\n setTickContext(tc) {\n this.tickContext = tc;\n this._preFormatted = false;\n }\n checkTickContext(message = 'Tickable has no tick context.') {\n return defined(this.tickContext, 'NoTickContext', message);\n }\n /** Preformat the Tickable. */\n preFormat() {\n if (this._preFormatted)\n return;\n this.width = 0;\n if (this.modifierContext) {\n this.modifierContext.preFormat();\n this.width += this.modifierContext.getWidth();\n }\n }\n /** Set preformatted status. */\n set preFormatted(value) {\n this._preFormatted = value;\n }\n get preFormatted() {\n return this._preFormatted;\n }\n /** Postformat the Tickable. */\n postFormat() {\n if (this._postFormatted)\n return this;\n this._postFormatted = true;\n return this;\n }\n /** Set postformatted status. */\n set postFormatted(value) {\n this._postFormatted = value;\n }\n get postFormatted() {\n return this._postFormatted;\n }\n /** Return the intrinsic ticks. */\n getIntrinsicTicks() {\n return this.intrinsicTicks;\n }\n /** Set the intrinsic ticks. */\n setIntrinsicTicks(intrinsicTicks) {\n this.intrinsicTicks = intrinsicTicks;\n this.ticks = this.tickMultiplier.clone().multiply(this.intrinsicTicks);\n }\n /** Get the tick multiplier. */\n getTickMultiplier() {\n return this.tickMultiplier;\n }\n /** Apply a tick multiplier. */\n applyTickMultiplier(numerator, denominator) {\n this.tickMultiplier.multiply(numerator, denominator);\n this.ticks = this.tickMultiplier.clone().multiply(this.intrinsicTicks);\n }\n /** Set the duration. */\n setDuration(duration) {\n const ticks = duration.numerator * (Tables.RESOLUTION / duration.denominator);\n this.ticks = this.tickMultiplier.clone().multiply(ticks);\n this.intrinsicTicks = this.ticks.value();\n }\n getAbsoluteX() {\n const tickContext = this.checkTickContext(`Can't getAbsoluteX() without a TickContext.`);\n return tickContext.getX();\n }\n /** Attach this note to a modifier context. */\n setModifierContext(mc) {\n this.modifierContext = mc;\n return this;\n }\n /** Get `ModifierContext`. */\n getModifierContext() {\n return this.modifierContext;\n }\n /** Check and get `ModifierContext`. */\n checkModifierContext() {\n return defined(this.modifierContext, 'NoModifierContext', 'No modifier context attached to this tickable.');\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from './font';\nimport { drawDot } from './rendercontext';\nimport { Tables } from './tables';\nimport { Tickable } from './tickable';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\n/**\n * Note implements an abstract interface for notes and chords that\n * are rendered on a stave. Notes have some common properties: All of them\n * have a value (e.g., pitch, fret, etc.) and a duration (quarter, half, etc.)\n *\n * Some notes have stems, heads, dots, etc. Most notational elements that\n * surround a note are called *modifiers*, and every note has an associated\n * array of them. All notes also have a rendering context and belong to a stave.\n */\nexport class Note extends Tickable {\n /**\n * Every note is a tickable, i.e., it can be mutated by the `Formatter` class for\n * positioning and layout.\n *\n * @param noteStruct To create a new note you need to provide a `noteStruct`.\n */\n constructor(noteStruct) {\n super();\n if (!noteStruct) {\n throw new RuntimeError('BadArguments', 'Note must have valid initialization data to identify duration and type.');\n }\n /** Parses `noteStruct` and get note properties. */\n const parsedNoteStruct = Note.parseNoteStruct(noteStruct);\n if (!parsedNoteStruct) {\n throw new RuntimeError('BadArguments', `Invalid note initialization object: ${JSON.stringify(noteStruct)}`);\n }\n // Set note properties from parameters.\n this.keys = noteStruct.keys || [];\n // per-pitch properties\n this.keyProps = [];\n this.duration = parsedNoteStruct.duration;\n this.noteType = parsedNoteStruct.type;\n this.customTypes = parsedNoteStruct.customTypes;\n if (noteStruct.duration_override) {\n // Custom duration\n this.setDuration(noteStruct.duration_override);\n }\n else {\n // Default duration\n this.setIntrinsicTicks(parsedNoteStruct.ticks);\n }\n this.modifiers = [];\n // Get the glyph code for this note from the font.\n this.glyph = Tables.getGlyphProps(this.duration, this.noteType);\n this.customGlyphs = this.customTypes.map((t) => Tables.getGlyphProps(this.duration, t));\n // Note to play for audio players.\n this.playNote = undefined;\n // Positioning contexts used by the Formatter.\n this.ignore_ticks = false;\n // Positioning variables\n this.width = 0; // Width in pixels calculated after preFormat\n this.leftDisplacedHeadPx = 0; // Extra room on left for displaced note head\n this.rightDisplacedHeadPx = 0; // Extra room on right for displaced note head\n this.x_shift = 0; // X shift from tick context X\n this.ys = []; // list of y coordinates for each note\n // we need to hold on to these for ties and beams.\n if (noteStruct.align_center) {\n this.setCenterAlignment(noteStruct.align_center);\n }\n // The render surface.\n this.render_options = {\n annotation_spacing: 5,\n glyph_font_scale: 1,\n stroke_px: 1,\n scale: 1,\n font: '',\n y_shift: 0,\n };\n }\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // STATIC MEMBERS\n static get CATEGORY() {\n return Category.Note;\n }\n /** Debug helper. Displays various note metrics for the given note. */\n static plotMetrics(ctx, note, yPos) {\n const metrics = note.getMetrics();\n const xStart = note.getAbsoluteX() - metrics.modLeftPx - metrics.leftDisplacedHeadPx;\n const xPre1 = note.getAbsoluteX() - metrics.leftDisplacedHeadPx;\n const xAbs = note.getAbsoluteX();\n const xPost1 = note.getAbsoluteX() + metrics.notePx;\n const xPost2 = note.getAbsoluteX() + metrics.notePx + metrics.rightDisplacedHeadPx;\n const xEnd = note.getAbsoluteX() + metrics.notePx + metrics.rightDisplacedHeadPx + metrics.modRightPx;\n const xFreedomRight = xEnd + (note.getFormatterMetrics().freedom.right || 0);\n const xWidth = xEnd - xStart;\n ctx.save();\n ctx.setFont(Font.SANS_SERIF, 8);\n ctx.fillText(Math.round(xWidth) + 'px', xStart + note.getXShift(), yPos);\n const y = yPos + 7;\n function stroke(x1, x2, color, yy = y) {\n ctx.beginPath();\n ctx.setStrokeStyle(color);\n ctx.setFillStyle(color);\n ctx.setLineWidth(3);\n ctx.moveTo(x1 + note.getXShift(), yy);\n ctx.lineTo(x2 + note.getXShift(), yy);\n ctx.stroke();\n }\n stroke(xStart, xPre1, 'red');\n stroke(xPre1, xAbs, '#999');\n stroke(xAbs, xPost1, 'green');\n stroke(xPost1, xPost2, '#999');\n stroke(xPost2, xEnd, 'red');\n stroke(xEnd, xFreedomRight, '#DD0');\n stroke(xStart - note.getXShift(), xStart, '#BBB'); // Shift\n drawDot(ctx, xAbs + note.getXShift(), y, 'blue');\n const formatterMetrics = note.getFormatterMetrics();\n if (formatterMetrics.iterations > 0) {\n const spaceDeviation = formatterMetrics.space.deviation;\n const prefix = spaceDeviation >= 0 ? '+' : '';\n ctx.setFillStyle('red');\n ctx.fillText(prefix + Math.round(spaceDeviation), xAbs + note.getXShift(), yPos - 10);\n }\n ctx.restore();\n }\n static parseDuration(durationString) {\n if (!durationString) {\n return undefined;\n }\n const regexp = /(\\d*\\/?\\d+|[a-z])(d*)([nrhms]|$)/;\n const result = regexp.exec(durationString);\n if (!result) {\n return undefined;\n }\n const duration = result[1];\n const dots = result[2].length;\n const type = result[3] || 'n';\n return { duration, dots, type };\n }\n static parseNoteStruct(noteStruct) {\n // Preserve backwards-compatibility\n const durationProps = Note.parseDuration(noteStruct.duration);\n if (!durationProps) {\n return undefined;\n }\n // If specified type is invalid, return undefined.\n let type = noteStruct.type;\n if (type && !Tables.validTypes[type]) {\n return undefined;\n }\n // If no type specified, check duration or custom types\n const customTypes = [];\n if (!type) {\n type = durationProps.type || 'n';\n // If we have keys, try and check if we've got a custom glyph\n if (noteStruct.keys !== undefined) {\n noteStruct.keys.forEach((k, i) => {\n const result = k.split('/');\n // We have a custom glyph specified after the note eg. /X2\n customTypes[i] = (result && result.length === 3 ? result[2] : type);\n });\n }\n }\n // Calculate the tick duration of the note\n let ticks = Tables.durationToTicks(durationProps.duration);\n if (!ticks) {\n return undefined;\n }\n // Are there any dots?\n const dots = noteStruct.dots ? noteStruct.dots : durationProps.dots;\n if (typeof dots !== 'number') {\n return undefined;\n }\n // Add ticks as necessary depending on the numbr of dots\n let currentTicks = ticks;\n for (let i = 0; i < dots; i++) {\n if (currentTicks <= 1)\n return undefined;\n currentTicks = currentTicks / 2;\n ticks += currentTicks;\n }\n return {\n duration: durationProps.duration,\n type,\n customTypes,\n dots,\n ticks,\n };\n }\n /**\n * Get the play note, which is arbitrary data that can be used by an\n * audio player.\n */\n getPlayNote() {\n return this.playNote;\n }\n /**\n * Set the play note, which is arbitrary data that can be used by an\n * audio player.\n */\n setPlayNote(note) {\n this.playNote = note;\n return this;\n }\n /**\n * @returns true if this note is a type of rest.\n *\n * Rests don't have pitches, but take up space in the score.\n * Subclasses should override this default implementation.\n */\n isRest() {\n return false;\n }\n /** Add stroke. */\n addStroke(index, stroke) {\n stroke.setNote(this);\n stroke.setIndex(index);\n this.modifiers.push(stroke);\n this.preFormatted = false;\n return this;\n }\n /** Get the target stave. */\n getStave() {\n return this.stave;\n }\n /** Check and get the target stave. */\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n /** Set the target stave. */\n setStave(stave) {\n this.stave = stave;\n this.setYs([stave.getYForLine(0)]); // Update Y values if the stave is changed.\n this.setContext(this.stave.getContext());\n return this;\n }\n /** Get spacing to the left of the notes. */\n getLeftDisplacedHeadPx() {\n return this.leftDisplacedHeadPx;\n }\n /** Get spacing to the right of the notes. */\n getRightDisplacedHeadPx() {\n return this.rightDisplacedHeadPx;\n }\n /** Set spacing to the left of the notes. */\n setLeftDisplacedHeadPx(x) {\n this.leftDisplacedHeadPx = x;\n return this;\n }\n /** Set spacing to the right of the notes. */\n setRightDisplacedHeadPx(x) {\n this.rightDisplacedHeadPx = x;\n return this;\n }\n /** True if this note has no duration (e.g., bar notes, spacers, etc.). */\n shouldIgnoreTicks() {\n return this.ignore_ticks;\n }\n /** Get the stave line number for the note. */\n // eslint-disable-next-line\n getLineNumber(isTopNote) {\n return 0;\n }\n /** Get the stave line number for rest. */\n getLineForRest() {\n return 0;\n }\n /** Get the glyph associated with this note. */\n // eslint-disable-next-line\n getGlyph() {\n return this.glyph;\n }\n /** Get the glyph width. */\n getGlyphWidth() {\n // TODO: FIXME (multiple potential values for this.glyph)\n if (this.glyph) {\n if (this.glyph.getMetrics) {\n return this.glyph.getMetrics().width;\n }\n else if (this.glyph.getWidth) {\n return this.glyph.getWidth(this.render_options.glyph_font_scale);\n }\n }\n return 0;\n }\n /**\n * Set Y positions for this note. Each Y value is associated with\n * an individual pitch/key within the note/chord.\n */\n setYs(ys) {\n this.ys = ys;\n return this;\n }\n /**\n * Get Y positions for this note. Each Y value is associated with\n * an individual pitch/key within the note/chord.\n */\n getYs() {\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', 'No Y-values calculated for this note.');\n }\n return this.ys;\n }\n /**\n * Get the Y position of the space above the stave onto which text can\n * be rendered.\n */\n getYForTopText(text_line) {\n return this.checkStave().getYForTopText(text_line);\n }\n /** Return the voice that this note belongs in. */\n getVoice() {\n if (!this.voice)\n throw new RuntimeError('NoVoice', 'Note has no voice.');\n return this.voice;\n }\n /** Attach this note to `voice`. */\n setVoice(voice) {\n this.voice = voice;\n this.preFormatted = false;\n return this;\n }\n /** Get the `TickContext` for this note. */\n getTickContext() {\n return this.checkTickContext();\n }\n /** Set the `TickContext` for this note. */\n setTickContext(tc) {\n this.tickContext = tc;\n this.preFormatted = false;\n return this;\n }\n /** Accessor to duration. */\n getDuration() {\n return this.duration;\n }\n /** Accessor to isDotted. */\n isDotted() {\n return this.getModifiersByType('Dot').length > 0;\n }\n /** Accessor to hasStem. */\n hasStem() {\n return false;\n }\n /** Accessor to note type. */\n getNoteType() {\n return this.noteType;\n }\n /** Get the beam. */\n getBeam() {\n return this.beam;\n }\n /** Check and get the beam. */\n checkBeam() {\n return defined(this.beam, 'NoBeam', 'No beam attached to instance');\n }\n /** Check it has a beam. */\n hasBeam() {\n return this.beam != undefined;\n }\n /** Set the beam. */\n setBeam(beam) {\n this.beam = beam;\n return this;\n }\n /**\n * Attach a modifier to this note.\n * @param modifier the Modifier to add.\n * @param index of the key to modify.\n * @returns this\n */\n addModifier(modifier, index = 0) {\n const signature = 'Note.addModifier(modifier: Modifier, index: number=0)';\n // Backwards compatibility with 3.0.9.\n if (typeof index === 'string') {\n index = parseInt(index);\n // eslint-disable-next-line\n console.warn(signature + ' expected a number for `index`, but received a string.');\n }\n // Some versions of VexFlow had the two parameters reversed.\n // Check here and throw an error if the argument types are not correct.\n if (typeof modifier !== 'object' || typeof index !== 'number') {\n throw new RuntimeError('WrongParams', 'Incorrect call signature. Use ' + signature + ' instead.');\n }\n modifier.setNote(this);\n modifier.setIndex(index);\n super.addModifier(modifier);\n return this;\n }\n // Get all modifiers of a specific type in the `ModifierContext`\n getModifiersByType(type) {\n return this.checkModifierContext().getMembers(type);\n }\n /** Get the coordinates for where modifiers begin. */\n // eslint-disable-next-line\n getModifierStartXY(position, index, options) {\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call GetModifierStartXY on an unformatted note\");\n }\n return {\n x: this.getAbsoluteX(),\n y: this.ys[0],\n };\n }\n getRightParenthesisPx(index) {\n const props = this.getKeyProps()[index];\n return props.displaced ? this.getRightDisplacedHeadPx() : 0;\n }\n getLeftParenthesisPx(index) {\n const props = this.getKeyProps()[index];\n return props.displaced ? this.getLeftDisplacedHeadPx() : 0;\n }\n getFirstDotPx() {\n let px = this.getRightDisplacedHeadPx();\n if (this.checkModifierContext().getMembers('Parenthesis').length !== 0)\n px += Tables.currentMusicFont().lookupMetric('parenthesis.default.width');\n return px;\n }\n /** Get the metrics for this note. */\n getMetrics() {\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call getMetrics on an unformatted note.\");\n }\n const modLeftPx = this.modifierContext ? this.modifierContext.getState().left_shift : 0;\n const modRightPx = this.modifierContext ? this.modifierContext.getState().right_shift : 0;\n const width = this.getWidth();\n const glyphWidth = this.getGlyphWidth();\n const notePx = width -\n modLeftPx - // subtract left modifiers\n modRightPx - // subtract right modifiers\n this.leftDisplacedHeadPx - // subtract left displaced head\n this.rightDisplacedHeadPx; // subtract right displaced head\n // NOTE: If you change this, remember to update MockTickable.getMetrics() in the tests/ directory.\n return {\n width,\n glyphWidth,\n notePx,\n // Modifier spacing.\n modLeftPx,\n modRightPx,\n // Displaced note head on left or right.\n leftDisplacedHeadPx: this.leftDisplacedHeadPx,\n rightDisplacedHeadPx: this.rightDisplacedHeadPx,\n glyphPx: 0,\n };\n }\n /**\n * Get the absolute `X` position of this note's tick context. This\n * excludes x_shift, so you'll need to factor it in if you're\n * looking for the post-formatted x-position.\n */\n getAbsoluteX() {\n const tickContext = this.checkTickContext(`Can't getAbsoluteX() without a TickContext.`);\n // Position note to left edge of tick context.\n let x = tickContext.getX();\n if (this.stave) {\n x += this.stave.getNoteStartX() + Tables.currentMusicFont().lookupMetric('stave.padding');\n }\n if (this.isCenterAligned()) {\n x += this.getCenterXShift();\n }\n return x;\n }\n /** Get the direction of the stem. */\n getStemDirection() {\n throw new RuntimeError('NoStem', 'No stem attached to this note.');\n }\n /** Get the top and bottom `y` values of the stem. */\n getStemExtents() {\n throw new RuntimeError('NoStem', 'No stem attached to this note.');\n }\n /** Get the `x` coordinate to the right of the note. */\n getTieRightX() {\n let tieStartX = this.getAbsoluteX();\n const note_glyph_width = this.glyph.getWidth();\n tieStartX += note_glyph_width / 2;\n tieStartX += -this.width / 2 + this.width + 2;\n return tieStartX;\n }\n /** Get the `x` coordinate to the left of the note. */\n getTieLeftX() {\n let tieEndX = this.getAbsoluteX();\n const note_glyph_width = this.glyph.getWidth();\n tieEndX += note_glyph_width / 2;\n tieEndX -= this.width / 2 + 2;\n return tieEndX;\n }\n // Get the pitches in the note\n getKeys() {\n return this.keys;\n }\n // Get the properties for all the keys in the note\n getKeyProps() {\n return this.keyProps;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// A base class for stave modifiers (e.g. clefs, key signatures)\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { defined } from './util';\nexport var StaveModifierPosition;\n(function (StaveModifierPosition) {\n StaveModifierPosition[StaveModifierPosition[\"CENTER\"] = 0] = \"CENTER\";\n StaveModifierPosition[StaveModifierPosition[\"LEFT\"] = 1] = \"LEFT\";\n StaveModifierPosition[StaveModifierPosition[\"RIGHT\"] = 2] = \"RIGHT\";\n StaveModifierPosition[StaveModifierPosition[\"ABOVE\"] = 3] = \"ABOVE\";\n StaveModifierPosition[StaveModifierPosition[\"BELOW\"] = 4] = \"BELOW\";\n StaveModifierPosition[StaveModifierPosition[\"BEGIN\"] = 5] = \"BEGIN\";\n StaveModifierPosition[StaveModifierPosition[\"END\"] = 6] = \"END\";\n})(StaveModifierPosition || (StaveModifierPosition = {}));\nexport class StaveModifier extends Element {\n constructor() {\n super();\n this.width = 0;\n this.x = 0;\n this.padding = 10;\n this.position = StaveModifierPosition.ABOVE;\n }\n static get CATEGORY() {\n return Category.StaveModifier;\n }\n static get Position() {\n return StaveModifierPosition;\n }\n getPosition() {\n return this.position;\n }\n setPosition(position) {\n this.position = position;\n return this;\n }\n getStave() {\n return this.stave;\n }\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n setStave(stave) {\n this.stave = stave;\n return this;\n }\n getWidth() {\n return this.width;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n getX() {\n return this.x;\n }\n setX(x) {\n this.x = x;\n return this;\n }\n placeGlyphOnLine(glyph, stave, line, customShift = 0) {\n glyph.setYShift(stave.getYForLine(line !== null && line !== void 0 ? line : 0) - stave.getYForGlyphs() + customShift);\n }\n getPadding(index) {\n return index !== undefined && index < 2 ? 0 : this.padding;\n }\n setPadding(padding) {\n this.padding = padding;\n return this;\n }\n setLayoutMetrics(layoutMetrics) {\n this.layoutMetrics = layoutMetrics;\n return this;\n }\n getLayoutMetrics() {\n return this.layoutMetrics;\n }\n // eslint-disable-next-line\n draw(...args) {\n // DO NOTHING.\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// Author Larry Kuhns 2011\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nexport var BarlineType;\n(function (BarlineType) {\n BarlineType[BarlineType[\"SINGLE\"] = 1] = \"SINGLE\";\n BarlineType[BarlineType[\"DOUBLE\"] = 2] = \"DOUBLE\";\n BarlineType[BarlineType[\"END\"] = 3] = \"END\";\n BarlineType[BarlineType[\"REPEAT_BEGIN\"] = 4] = \"REPEAT_BEGIN\";\n BarlineType[BarlineType[\"REPEAT_END\"] = 5] = \"REPEAT_END\";\n BarlineType[BarlineType[\"REPEAT_BOTH\"] = 6] = \"REPEAT_BOTH\";\n BarlineType[BarlineType[\"NONE\"] = 7] = \"NONE\";\n})(BarlineType || (BarlineType = {}));\nexport class Barline extends StaveModifier {\n constructor(type) {\n super();\n this.thickness = Tables.STAVE_LINE_THICKNESS;\n const TYPE = BarlineType;\n this.widths = {};\n this.widths[TYPE.SINGLE] = 5;\n this.widths[TYPE.DOUBLE] = 5;\n this.widths[TYPE.END] = 5;\n this.widths[TYPE.REPEAT_BEGIN] = 5;\n this.widths[TYPE.REPEAT_END] = 5;\n this.widths[TYPE.REPEAT_BOTH] = 5;\n this.widths[TYPE.NONE] = 5;\n this.paddings = {};\n this.paddings[TYPE.SINGLE] = 0;\n this.paddings[TYPE.DOUBLE] = 0;\n this.paddings[TYPE.END] = 0;\n this.paddings[TYPE.REPEAT_BEGIN] = 15;\n this.paddings[TYPE.REPEAT_END] = 15;\n this.paddings[TYPE.REPEAT_BOTH] = 15;\n this.paddings[TYPE.NONE] = 0;\n this.layoutMetricsMap = {};\n this.layoutMetricsMap[TYPE.SINGLE] = {\n xMin: 0,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.DOUBLE] = {\n xMin: -3,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.END] = {\n xMin: -5,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.REPEAT_END] = {\n xMin: -10,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.REPEAT_BEGIN] = {\n xMin: -2,\n xMax: 10,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.REPEAT_BOTH] = {\n xMin: -10,\n xMax: 10,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.NONE] = {\n xMin: 0,\n xMax: 0,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.setPosition(StaveModifierPosition.BEGIN);\n this.setType(type);\n }\n static get CATEGORY() {\n return Category.Barline;\n }\n static get type() {\n return BarlineType;\n }\n static get typeString() {\n return {\n single: BarlineType.SINGLE,\n double: BarlineType.DOUBLE,\n end: BarlineType.END,\n repeatBegin: BarlineType.REPEAT_BEGIN,\n repeatEnd: BarlineType.REPEAT_END,\n repeatBoth: BarlineType.REPEAT_BOTH,\n none: BarlineType.NONE,\n };\n }\n getType() {\n return this.type;\n }\n setType(type) {\n this.type = typeof type === 'string' ? Barline.typeString[type] : type;\n this.setWidth(this.widths[this.type]);\n this.setPadding(this.paddings[this.type]);\n this.setLayoutMetrics(this.layoutMetricsMap[this.type]);\n return this;\n }\n // Draw barlines\n draw(stave) {\n stave.checkContext();\n this.setRendered();\n switch (this.type) {\n case BarlineType.SINGLE:\n this.drawVerticalBar(stave, this.x, false);\n break;\n case BarlineType.DOUBLE:\n this.drawVerticalBar(stave, this.x, true);\n break;\n case BarlineType.END:\n this.drawVerticalEndBar(stave, this.x);\n break;\n case BarlineType.REPEAT_BEGIN:\n // If the barline is shifted over (in front of clef/time/key)\n // Draw vertical bar at the beginning.\n this.drawRepeatBar(stave, this.x, true);\n if (stave.getX() !== this.x) {\n this.drawVerticalBar(stave, stave.getX());\n }\n break;\n case BarlineType.REPEAT_END:\n this.drawRepeatBar(stave, this.x, false);\n break;\n case BarlineType.REPEAT_BOTH:\n this.drawRepeatBar(stave, this.x, false);\n this.drawRepeatBar(stave, this.x, true);\n break;\n default:\n // Default is NONE, so nothing to draw\n break;\n }\n }\n drawVerticalBar(stave, x, double_bar) {\n const staveCtx = stave.checkContext();\n const topY = stave.getTopLineTopY();\n const botY = stave.getBottomLineBottomY();\n if (double_bar) {\n staveCtx.fillRect(x - 3, topY, 1, botY - topY);\n }\n staveCtx.fillRect(x, topY, 1, botY - topY);\n }\n drawVerticalEndBar(stave, x) {\n const staveCtx = stave.checkContext();\n const topY = stave.getTopLineTopY();\n const botY = stave.getBottomLineBottomY();\n staveCtx.fillRect(x - 5, topY, 1, botY - topY);\n staveCtx.fillRect(x - 2, topY, 3, botY - topY);\n }\n drawRepeatBar(stave, x, begin) {\n const staveCtx = stave.checkContext();\n const topY = stave.getTopLineTopY();\n const botY = stave.getBottomLineBottomY();\n let x_shift = 3;\n if (!begin) {\n x_shift = -5;\n }\n staveCtx.fillRect(x + x_shift, topY, 1, botY - topY);\n staveCtx.fillRect(x - 2, topY, 3, botY - topY);\n const dot_radius = 2;\n // Shift dots left or right\n if (begin) {\n x_shift += 4;\n }\n else {\n x_shift -= 4;\n }\n const dot_x = x + x_shift + dot_radius / 2;\n // calculate the y offset based on number of stave lines\n let y_offset = (stave.getNumLines() - 1) * stave.getSpacingBetweenLines();\n y_offset = y_offset / 2 - stave.getSpacingBetweenLines() / 2;\n let dot_y = topY + y_offset + dot_radius / 2;\n // draw the top repeat dot\n staveCtx.beginPath();\n staveCtx.arc(dot_x, dot_y, dot_radius, 0, Math.PI * 2, false);\n staveCtx.fill();\n // draw the bottom repeat dot\n dot_y += stave.getSpacingBetweenLines();\n staveCtx.beginPath();\n staveCtx.arc(dot_x, dot_y, dot_radius, 0, Math.PI * 2, false);\n staveCtx.fill();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// Author: Aaron (@AaronDavidNewman)\n//\n// This implements chord symbols above/below a chord.\n// Chord symbols are modifiers that can be attached to notes.\n// They can contain multiple 'blocks' which represent text or\n// glyphs with various positioning options.\n//\n// See `tests/chordsymbol_tests.ts` for usage examples.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Tables } from './tables';\nimport { TextFormatter } from './textformatter';\nimport { Category } from './typeguard';\nimport { log } from './util';\n// To enable logging for this class. Set `Vex.Flow.ChordSymbol.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (ChordSymbol.DEBUG)\n log('Vex.Flow.ChordSymbol', args);\n}\nexport var ChordSymbolHorizontalJustify;\n(function (ChordSymbolHorizontalJustify) {\n ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify[\"LEFT\"] = 1] = \"LEFT\";\n ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify[\"CENTER\"] = 2] = \"CENTER\";\n ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify[\"RIGHT\"] = 3] = \"RIGHT\";\n ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify[\"CENTER_STEM\"] = 4] = \"CENTER_STEM\";\n})(ChordSymbolHorizontalJustify || (ChordSymbolHorizontalJustify = {}));\nexport var ChordSymbolVerticalJustify;\n(function (ChordSymbolVerticalJustify) {\n ChordSymbolVerticalJustify[ChordSymbolVerticalJustify[\"TOP\"] = 1] = \"TOP\";\n ChordSymbolVerticalJustify[ChordSymbolVerticalJustify[\"BOTTOM\"] = 2] = \"BOTTOM\";\n})(ChordSymbolVerticalJustify || (ChordSymbolVerticalJustify = {}));\nexport var SymbolTypes;\n(function (SymbolTypes) {\n SymbolTypes[SymbolTypes[\"GLYPH\"] = 1] = \"GLYPH\";\n SymbolTypes[SymbolTypes[\"TEXT\"] = 2] = \"TEXT\";\n SymbolTypes[SymbolTypes[\"LINE\"] = 3] = \"LINE\";\n})(SymbolTypes || (SymbolTypes = {}));\nexport var SymbolModifiers;\n(function (SymbolModifiers) {\n SymbolModifiers[SymbolModifiers[\"NONE\"] = 1] = \"NONE\";\n SymbolModifiers[SymbolModifiers[\"SUBSCRIPT\"] = 2] = \"SUBSCRIPT\";\n SymbolModifiers[SymbolModifiers[\"SUPERSCRIPT\"] = 3] = \"SUPERSCRIPT\";\n})(SymbolModifiers || (SymbolModifiers = {}));\n/**\n * ChordSymbol is a modifier that creates a chord symbol above/below a chord.\n * As a modifier, it is attached to an existing note.\n */\nexport class ChordSymbol extends Modifier {\n constructor() {\n super();\n this.symbolBlocks = [];\n this.horizontal = ChordSymbolHorizontalJustify.LEFT;\n this.vertical = ChordSymbolVerticalJustify.TOP;\n this.useKerning = true;\n this.reportWidth = true;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.ChordSymbol;\n }\n static get superSubRatio() {\n return ChordSymbol.metrics.global.superSubRatio;\n }\n /** Currently unused: Globally turn off text formatting, if the built-in formatting does not work for your font. */\n static set NO_TEXT_FORMAT(val) {\n ChordSymbol.noFormat = val;\n }\n static get NO_TEXT_FORMAT() {\n return ChordSymbol.noFormat;\n }\n // eslint-disable-next-line\n static getMetricForGlyph(glyphCode) {\n if (ChordSymbol.metrics[glyphCode]) {\n return ChordSymbol.metrics[glyphCode];\n }\n return undefined;\n }\n static get engravingFontResolution() {\n return Tables.currentMusicFont().getResolution();\n }\n static get spacingBetweenBlocks() {\n return ChordSymbol.metrics.global.spacing / ChordSymbol.engravingFontResolution;\n }\n static getWidthForGlyph(glyph) {\n const metric = ChordSymbol.getMetricForGlyph(glyph.code);\n if (!metric) {\n return 0.65; // probably should do something here.\n }\n return metric.advanceWidth / ChordSymbol.engravingFontResolution;\n }\n static getYShiftForGlyph(glyph) {\n const metric = ChordSymbol.getMetricForGlyph(glyph.code);\n if (!metric) {\n return 0;\n }\n return metric.yOffset / ChordSymbol.engravingFontResolution;\n }\n static getXShiftForGlyph(glyph) {\n const metric = ChordSymbol.getMetricForGlyph(glyph.code);\n if (!metric) {\n return 0;\n }\n return (-1 * metric.leftSideBearing) / ChordSymbol.engravingFontResolution;\n }\n static get superscriptOffset() {\n return ChordSymbol.metrics.global.superscriptOffset / ChordSymbol.engravingFontResolution;\n }\n static get subscriptOffset() {\n return ChordSymbol.metrics.global.subscriptOffset / ChordSymbol.engravingFontResolution;\n }\n static get kerningOffset() {\n return ChordSymbol.metrics.global.kerningOffset / ChordSymbol.engravingFontResolution;\n }\n // eslint-disable-next-line\n static get metrics() {\n return Tables.currentMusicFont().getMetrics().glyphs.chordSymbol;\n }\n static get lowerKerningText() {\n // For example, see: `bravura_metrics.ts`\n // BravuraMetrics.glyphs.chordSymbol.global.lowerKerningText, which returns an array of letters.\n // ['D', 'F', 'P', 'T', 'V', 'Y']\n return ChordSymbol.metrics.global.lowerKerningText;\n }\n static get upperKerningText() {\n return ChordSymbol.metrics.global.upperKerningText;\n }\n static isSuperscript(block) {\n return block.symbolModifier !== undefined && block.symbolModifier === SymbolModifiers.SUPERSCRIPT;\n }\n static isSubscript(block) {\n return block.symbolModifier !== undefined && block.symbolModifier === SymbolModifiers.SUBSCRIPT;\n }\n /**\n * Estimate the width of the whole chord symbol, based on the sum of the widths of the individual blocks.\n * Estimate how many lines above/below the staff we need.\n */\n static format(symbols, state) {\n var _a;\n if (!symbols || symbols.length === 0)\n return false;\n let width = 0;\n let nonSuperWidth = 0;\n const reportedWidths = [];\n for (const symbol of symbols) {\n const fontSize = Font.convertSizeToPointValue((_a = symbol.textFont) === null || _a === void 0 ? void 0 : _a.size);\n const fontAdj = Font.scaleSize(fontSize, 0.05);\n const glyphAdj = fontAdj * 2;\n let lineSpaces = 1;\n let vAlign = false;\n for (let j = 0; j < symbol.symbolBlocks.length; ++j) {\n const block = symbol.symbolBlocks[j];\n const sup = ChordSymbol.isSuperscript(block);\n const sub = ChordSymbol.isSubscript(block);\n const superSubScale = sup || sub ? ChordSymbol.superSubRatio : 1;\n const adj = block.symbolType === SymbolTypes.GLYPH ? glyphAdj * superSubScale : fontAdj * superSubScale;\n // If there are super/subscripts, they extend beyond the line so\n // assume they take up 2 lines\n if (sup || sub) {\n lineSpaces = 2;\n }\n // If there is a symbol-specific offset, add it but consider font\n // size since font and glyphs will be interspersed.\n const fontSize = symbol.textFormatter.fontSizeInPixels;\n const superSubFontSize = fontSize * superSubScale;\n if (block.symbolType === SymbolTypes.GLYPH && block.glyph !== undefined) {\n block.width = ChordSymbol.getWidthForGlyph(block.glyph) * superSubFontSize;\n block.yShift += ChordSymbol.getYShiftForGlyph(block.glyph) * superSubFontSize;\n block.xShift += ChordSymbol.getXShiftForGlyph(block.glyph) * superSubFontSize;\n block.glyph.scale = block.glyph.scale * adj;\n }\n else if (block.symbolType === SymbolTypes.TEXT) {\n block.width = block.width * superSubFontSize;\n block.yShift += symbol.getYOffsetForText(block.text) * adj;\n }\n if (block.symbolType === SymbolTypes.GLYPH &&\n block.glyph !== undefined &&\n block.glyph.code === ChordSymbol.glyphs.over.code) {\n lineSpaces = 2;\n }\n block.width += ChordSymbol.spacingBetweenBlocks * fontSize * superSubScale;\n // If a subscript immediately follows a superscript block, try to\n // overlay them.\n if (sup && j > 0) {\n const prev = symbol.symbolBlocks[j - 1];\n if (!ChordSymbol.isSuperscript(prev)) {\n nonSuperWidth = width;\n }\n }\n if (sub && nonSuperWidth > 0) {\n vAlign = true;\n // slide the symbol over so it lines up with superscript\n block.xShift = block.xShift + (nonSuperWidth - width);\n width = nonSuperWidth;\n nonSuperWidth = 0;\n // If we have vertically lined up, turn kerning off.\n symbol.setEnableKerning(false);\n }\n if (!sup && !sub) {\n nonSuperWidth = 0;\n }\n block.vAlign = vAlign;\n width += block.width;\n }\n // make kerning adjustments after computing super/subscripts\n symbol.updateKerningAdjustments();\n symbol.updateOverBarAdjustments();\n if (symbol.getVertical() === ChordSymbolVerticalJustify.TOP) {\n symbol.setTextLine(state.top_text_line);\n state.top_text_line += lineSpaces;\n }\n else {\n symbol.setTextLine(state.text_line + 1);\n state.text_line += lineSpaces + 1;\n }\n if (symbol.getReportWidth()) {\n reportedWidths.push(width);\n }\n else {\n reportedWidths.push(0);\n }\n }\n width = reportedWidths.reduce((a, b) => a + b, 0);\n state.left_shift += width / 2;\n state.right_shift += width / 2;\n return true;\n }\n /**\n * Default text font.\n * Choose a font family that works well with the current music engraving font.\n * @override `Element.TEXT_FONT`.\n */\n static get TEXT_FONT() {\n let family = 'Roboto Slab, Times, serif';\n if (Tables.currentMusicFont().getName() === 'Petaluma') {\n // Fixes Issue #1180\n family = 'PetalumaScript, Arial, sans-serif';\n }\n return {\n family,\n size: 12,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n };\n }\n /**\n * The offset is specified in `em`. Scale this value by the font size in pixels.\n */\n get superscriptOffset() {\n return ChordSymbol.superscriptOffset * this.textFormatter.fontSizeInPixels;\n }\n get subscriptOffset() {\n return ChordSymbol.subscriptOffset * this.textFormatter.fontSizeInPixels;\n }\n setReportWidth(value) {\n this.reportWidth = value;\n return this;\n }\n getReportWidth() {\n return this.reportWidth;\n }\n updateOverBarAdjustments() {\n const barIndex = this.symbolBlocks.findIndex(({ symbolType, glyph }) => symbolType === SymbolTypes.GLYPH && glyph !== undefined && glyph.code === 'csymDiagonalArrangementSlash');\n if (barIndex < 0) {\n return;\n }\n const bar = this.symbolBlocks[barIndex];\n const xoff = bar.width / 4;\n const yoff = 0.25 * this.textFormatter.fontSizeInPixels;\n let symIndex = 0;\n for (symIndex === 0; symIndex < barIndex; ++symIndex) {\n const symbol = this.symbolBlocks[symIndex];\n symbol.xShift = symbol.xShift + xoff;\n symbol.yShift = symbol.yShift - yoff;\n }\n for (symIndex = barIndex + 1; symIndex < this.symbolBlocks.length; ++symIndex) {\n const symbol = this.symbolBlocks[symIndex];\n symbol.xShift = symbol.xShift - xoff;\n symbol.yShift = symbol.yShift + yoff;\n }\n }\n updateKerningAdjustments() {\n let accum = 0;\n for (let j = 0; j < this.symbolBlocks.length; ++j) {\n const symbol = this.symbolBlocks[j];\n accum += this.getKerningAdjustment(j);\n symbol.xShift += accum;\n }\n }\n /** Do some basic kerning so that letter chords like 'A' don't have the extensions hanging off to the right. */\n getKerningAdjustment(j) {\n if (!this.useKerning) {\n return 0;\n }\n const currSymbol = this.symbolBlocks[j];\n const prevSymbol = j > 0 ? this.symbolBlocks[j - 1] : undefined;\n let adjustment = 0;\n // Move things into the '/' over bar\n if (currSymbol.symbolType === SymbolTypes.GLYPH &&\n currSymbol.glyph !== undefined &&\n currSymbol.glyph.code === ChordSymbol.glyphs.over.code) {\n adjustment += currSymbol.glyph.metrics.x_shift;\n }\n if (prevSymbol !== undefined &&\n prevSymbol.symbolType === SymbolTypes.GLYPH &&\n prevSymbol.glyph !== undefined &&\n prevSymbol.glyph.code === ChordSymbol.glyphs.over.code) {\n adjustment += prevSymbol.glyph.metrics.x_shift;\n }\n // For superscripts that follow a letter without much top part, move it to the left slightly\n let preKernUpper = false;\n let preKernLower = false;\n if (prevSymbol !== undefined && prevSymbol.symbolType === SymbolTypes.TEXT) {\n preKernUpper = ChordSymbol.upperKerningText.some((xx) => xx === prevSymbol.text[prevSymbol.text.length - 1]);\n preKernLower = ChordSymbol.lowerKerningText.some((xx) => xx === prevSymbol.text[prevSymbol.text.length - 1]);\n }\n const kerningOffsetPixels = ChordSymbol.kerningOffset * this.textFormatter.fontSizeInPixels;\n // TODO: adjust kern for font size.\n // Where should this constant live?\n if (preKernUpper && currSymbol.symbolModifier === SymbolModifiers.SUPERSCRIPT) {\n adjustment += kerningOffsetPixels;\n }\n if (preKernLower && currSymbol.symbolType === SymbolTypes.TEXT) {\n if (currSymbol.text[0] >= 'a' && currSymbol.text[0] <= 'z') {\n adjustment += kerningOffsetPixels / 2;\n }\n if (ChordSymbol.upperKerningText.some((xx) => xx === (prevSymbol === null || prevSymbol === void 0 ? void 0 : prevSymbol.text[prevSymbol.text.length - 1]))) {\n adjustment += kerningOffsetPixels / 2;\n }\n }\n return adjustment;\n }\n /**\n * ChordSymbol allows multiple blocks so we can mix glyphs and font text.\n * Each block can have its own vertical orientation.\n */\n // eslint-disable-next-line\n getSymbolBlock(params = {}) {\n var _a, _b, _c;\n const symbolType = (_a = params.symbolType) !== null && _a !== void 0 ? _a : SymbolTypes.TEXT;\n const symbolBlock = {\n text: (_b = params.text) !== null && _b !== void 0 ? _b : '',\n symbolType,\n symbolModifier: (_c = params.symbolModifier) !== null && _c !== void 0 ? _c : SymbolModifiers.NONE,\n xShift: 0,\n yShift: 0,\n vAlign: false,\n width: 0,\n };\n // Note: symbol widths are resolution and font-independent.\n // We convert to pixel values when we know what the font is.\n if (symbolType === SymbolTypes.GLYPH && typeof params.glyph === 'string') {\n const glyphArgs = ChordSymbol.glyphs[params.glyph];\n const glyphPoints = 20;\n symbolBlock.glyph = new Glyph(glyphArgs.code, glyphPoints, { category: 'chordSymbol' });\n // Beware: glyph.metrics is not the same as glyph.getMetrics() !\n // rv.glyph.point = rv.glyph.point * rv.glyph.metrics.scale;\n // rv.width = rv.glyph.getMetrics().width;\n // don't set yShift here, b/c we need to do it at formatting time after the font is set.\n }\n else if (symbolType === SymbolTypes.TEXT) {\n symbolBlock.width = this.textFormatter.getWidthForTextInEm(symbolBlock.text);\n }\n else if (symbolType === SymbolTypes.LINE) {\n symbolBlock.width = params.width;\n }\n return symbolBlock;\n }\n /** Add a symbol to this chord, could be text, glyph or line. */\n // eslint-disable-next-line\n addSymbolBlock(parameters) {\n this.symbolBlocks.push(this.getSymbolBlock(parameters));\n return this;\n }\n // ### Convenience functions for creating different types of chord symbol parts.\n /** Add a text block. */\n // eslint-disable-next-line\n addText(text, parameters = {}) {\n const symbolType = SymbolTypes.TEXT;\n return this.addSymbolBlock(Object.assign(Object.assign({}, parameters), { text, symbolType }));\n }\n /** Add a text block with superscript modifier. */\n addTextSuperscript(text) {\n const symbolType = SymbolTypes.TEXT;\n const symbolModifier = SymbolModifiers.SUPERSCRIPT;\n return this.addSymbolBlock({ text, symbolType, symbolModifier });\n }\n /** Add a text block with subscript modifier. */\n addTextSubscript(text) {\n const symbolType = SymbolTypes.TEXT;\n const symbolModifier = SymbolModifiers.SUBSCRIPT;\n return this.addSymbolBlock({ text, symbolType, symbolModifier });\n }\n /** Add a glyph block with superscript modifier. */\n addGlyphSuperscript(glyph) {\n const symbolType = SymbolTypes.GLYPH;\n const symbolModifier = SymbolModifiers.SUPERSCRIPT;\n return this.addSymbolBlock({ glyph, symbolType, symbolModifier });\n }\n /** Add a glyph block. */\n // eslint-disable-next-line\n addGlyph(glyph, params = {}) {\n const symbolType = SymbolTypes.GLYPH;\n return this.addSymbolBlock(Object.assign(Object.assign({}, params), { glyph, symbolType }));\n }\n /**\n * Add a glyph for each character in 'text'. If the glyph is not available, use text from the font.\n * e.g. `addGlyphOrText('(+5#11)')` will use text for the '5' and '11', and glyphs for everything else.\n */\n // eslint-disable-next-line\n addGlyphOrText(text, params = {}) {\n let str = '';\n for (let i = 0; i < text.length; ++i) {\n const char = text[i];\n if (ChordSymbol.glyphs[char]) {\n if (str.length > 0) {\n this.addText(str, params);\n str = '';\n }\n this.addGlyph(char, params);\n }\n else {\n // Collect consecutive characters with no glyphs.\n str += char;\n }\n }\n if (str.length > 0) {\n this.addText(str, params);\n }\n return this;\n }\n /** Add a line of the given width, used as a continuation of the previous symbol in analysis, or lyrics, etc. */\n // eslint-disable-next-line\n addLine(width, params = {}) {\n const symbolType = SymbolTypes.LINE;\n return this.addSymbolBlock(Object.assign(Object.assign({}, params), { symbolType, width }));\n }\n /**\n * Set the chord symbol's font family, size, weight, style (e.g., `Arial`, `10pt`, `bold`, `italic`).\n *\n * @param f is 1) a `FontInfo` object or\n * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or\n * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided).\n * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt').\n * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900).\n * @param style is a string (e.g., 'italic', 'normal').\n *\n * @override See: Element.\n */\n setFont(f, size, weight, style) {\n super.setFont(f, size, weight, style);\n this.textFormatter = TextFormatter.create(this.textFont);\n return this;\n }\n setEnableKerning(val) {\n this.useKerning = val;\n return this;\n }\n /** Set vertical position of text (above or below stave). */\n setVertical(vj) {\n this.vertical = typeof vj === 'string' ? ChordSymbol.VerticalJustifyString[vj] : vj;\n return this;\n }\n getVertical() {\n return this.vertical;\n }\n /** Set horizontal justification. */\n setHorizontal(hj) {\n this.horizontal = typeof hj === 'string' ? ChordSymbol.HorizontalJustifyString[hj] : hj;\n return this;\n }\n getHorizontal() {\n return this.horizontal;\n }\n getWidth() {\n let width = 0;\n this.symbolBlocks.forEach((symbol) => {\n width += symbol.vAlign ? 0 : symbol.width;\n });\n return width;\n }\n getYOffsetForText(text) {\n var _a;\n let acc = 0;\n let i = 0;\n for (i = 0; i < text.length; ++i) {\n const metrics = this.textFormatter.getGlyphMetrics(text[i]);\n if (metrics) {\n const yMax = (_a = metrics.y_max) !== null && _a !== void 0 ? _a : 0;\n acc = yMax < acc ? yMax : acc;\n }\n }\n const resolution = this.textFormatter.getResolution();\n return i > 0 ? -1 * (acc / resolution) : 0;\n }\n /** Render text and glyphs above/below the note. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n // We're changing context parameters. Save current state.\n ctx.save();\n const classString = Object.keys(this.getAttribute('classes')).join(' ');\n ctx.openGroup(classString, this.getAttribute('id'));\n const start = note.getModifierStartXY(Modifier.Position.ABOVE, this.index);\n ctx.setFont(this.textFont);\n let y;\n // The position of the text varies based on whether or not the note\n // has a stem.\n const hasStem = note.hasStem();\n const stave = note.checkStave();\n if (this.vertical === ChordSymbolVerticalJustify.BOTTOM) {\n // HACK: We need to compensate for the text's height since its origin is bottom-right.\n y = stave.getYForBottomText(this.text_line + Tables.TEXT_HEIGHT_OFFSET_HACK);\n if (hasStem) {\n const stem_ext = note.checkStem().getExtents();\n const spacing = stave.getSpacingBetweenLines();\n const stem_base = note.getStemDirection() === 1 ? stem_ext.baseY : stem_ext.topY;\n y = Math.max(y, stem_base + spacing * (this.text_line + 2));\n }\n }\n else {\n // (this.vertical === VerticalJustify.TOP)\n y = Math.min(stave.getYForTopText(this.text_line), note.getYs()[0] - 10);\n if (hasStem) {\n const stem_ext = note.checkStem().getExtents();\n const spacing = stave.getSpacingBetweenLines();\n y = Math.min(y, stem_ext.topY - 5 - spacing * this.text_line);\n }\n }\n let x = start.x;\n if (this.horizontal === ChordSymbolHorizontalJustify.LEFT) {\n x = start.x;\n }\n else if (this.horizontal === ChordSymbolHorizontalJustify.RIGHT) {\n x = start.x + this.getWidth();\n }\n else if (this.horizontal === ChordSymbolHorizontalJustify.CENTER) {\n x = start.x - this.getWidth() / 2;\n }\n else {\n // HorizontalJustify.CENTER_STEM\n x = note.getStemX() - this.getWidth() / 2;\n }\n L('Rendering ChordSymbol: ', this.textFormatter, x, y);\n this.symbolBlocks.forEach((symbol) => {\n const isSuper = ChordSymbol.isSuperscript(symbol);\n const isSub = ChordSymbol.isSubscript(symbol);\n let curY = y;\n L('shift was ', symbol.xShift, symbol.yShift);\n L('curY pre sub ', curY);\n if (isSuper) {\n curY += this.superscriptOffset;\n }\n if (isSub) {\n curY += this.subscriptOffset;\n }\n L('curY sup/sub ', curY);\n if (symbol.symbolType === SymbolTypes.TEXT) {\n if (isSuper || isSub) {\n ctx.save();\n if (this.textFont) {\n const { family, size, weight, style } = this.textFont;\n const smallerFontSize = Font.scaleSize(size, ChordSymbol.superSubRatio);\n ctx.setFont(family, smallerFontSize, weight, style);\n }\n }\n // TODO???\n // We estimate the text width, fill it in with the empirical value so the formatting is even.\n // const textDim = ctx.measureText(symbol.text);\n // symbol.width = textDim.width;\n L('Rendering Text: ', symbol.text, x + symbol.xShift, curY + symbol.yShift);\n ctx.fillText(symbol.text, x + symbol.xShift, curY + symbol.yShift);\n if (isSuper || isSub) {\n ctx.restore();\n }\n }\n else if (symbol.symbolType === SymbolTypes.GLYPH && symbol.glyph) {\n curY += symbol.yShift;\n L('Rendering Glyph: ', symbol.glyph.code, x + symbol.xShift, curY);\n symbol.glyph.render(ctx, x + symbol.xShift, curY);\n }\n else if (symbol.symbolType === SymbolTypes.LINE) {\n L('Rendering Line : ', symbol.width, x, curY);\n ctx.beginPath();\n ctx.setLineWidth(1); // ?\n ctx.moveTo(x, y);\n ctx.lineTo(x + symbol.width, curY);\n ctx.stroke();\n }\n x += symbol.width;\n if (symbol.vAlign) {\n x += symbol.xShift;\n }\n });\n ctx.closeGroup();\n ctx.restore();\n }\n}\nChordSymbol.DEBUG = false;\n// Chord symbols can be positioned and justified relative to the note.\nChordSymbol.HorizontalJustify = ChordSymbolHorizontalJustify;\nChordSymbol.HorizontalJustifyString = {\n left: ChordSymbolHorizontalJustify.LEFT,\n right: ChordSymbolHorizontalJustify.RIGHT,\n center: ChordSymbolHorizontalJustify.CENTER,\n centerStem: ChordSymbolHorizontalJustify.CENTER_STEM,\n};\nChordSymbol.VerticalJustify = ChordSymbolVerticalJustify;\nChordSymbol.VerticalJustifyString = {\n top: ChordSymbolVerticalJustify.TOP,\n above: ChordSymbolVerticalJustify.TOP,\n below: ChordSymbolVerticalJustify.BOTTOM,\n bottom: ChordSymbolVerticalJustify.BOTTOM,\n};\n// Glyph data\nChordSymbol.glyphs = {\n diminished: {\n code: 'csymDiminished',\n },\n dim: {\n code: 'csymDiminished',\n },\n halfDiminished: {\n code: 'csymHalfDiminished',\n },\n '+': {\n code: 'csymAugmented',\n },\n augmented: {\n code: 'csymAugmented',\n },\n majorSeventh: {\n code: 'csymMajorSeventh',\n },\n minor: {\n code: 'csymMinor',\n },\n '-': {\n code: 'csymMinor',\n },\n '(': {\n code: 'csymParensLeftTall',\n },\n leftParen: {\n code: 'csymParensLeftTall',\n },\n ')': {\n code: 'csymParensRightTall',\n },\n rightParen: {\n code: 'csymParensRightTall',\n },\n leftBracket: {\n code: 'csymBracketLeftTall',\n },\n rightBracket: {\n code: 'csymBracketRightTall',\n },\n leftParenTall: {\n code: 'csymParensLeftVeryTall',\n },\n rightParenTall: {\n code: 'csymParensRightVeryTall',\n },\n '/': {\n code: 'csymDiagonalArrangementSlash',\n },\n over: {\n code: 'csymDiagonalArrangementSlash',\n },\n '#': {\n code: 'accidentalSharp',\n },\n b: {\n code: 'accidentalFlat',\n },\n};\nChordSymbol.symbolTypes = SymbolTypes;\nChordSymbol.symbolModifiers = SymbolModifiers;\n/** Currently unused. */\nChordSymbol.noFormat = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Fraction } from './fraction';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nexport var VoiceMode;\n(function (VoiceMode) {\n VoiceMode[VoiceMode[\"STRICT\"] = 1] = \"STRICT\";\n VoiceMode[VoiceMode[\"SOFT\"] = 2] = \"SOFT\";\n VoiceMode[VoiceMode[\"FULL\"] = 3] = \"FULL\";\n})(VoiceMode || (VoiceMode = {}));\n/**\n * `Voice` is mainly a container object to group `Tickables` for formatting.\n */\nexport class Voice extends Element {\n constructor(time, options) {\n super();\n this.resolutionMultiplier = 1;\n this.mode = VoiceMode.STRICT;\n this.preFormatted = false;\n this.ticksUsed = new Fraction(0, 1);\n this.largestTickWidth = 0;\n this.tickables = [];\n this.options = Object.assign({ softmaxFactor: 100 }, options);\n // Convert the `time` string into a VoiceTime object if necessary.\n let voiceTime;\n if (typeof time === 'string') {\n // Time signature shortcut: \"4/4\", \"3/8\", etc.\n const match = time.match(/(\\d+)\\/(\\d+)/);\n if (match) {\n voiceTime = {\n num_beats: parseInt(match[1]),\n beat_value: parseInt(match[2]),\n };\n }\n }\n else {\n voiceTime = time;\n }\n // Default time signature is 4/4.\n this.time = Object.assign({ num_beats: 4, beat_value: 4, resolution: Tables.RESOLUTION }, voiceTime);\n // Recalculate total ticks.\n this.totalTicks = new Fraction(this.time.num_beats * (this.time.resolution / this.time.beat_value), 1);\n this.smallestTickCount = this.totalTicks.clone();\n }\n static get CATEGORY() {\n return Category.Voice;\n }\n /**\n * Modes allow the addition of ticks in three different ways:\n * - STRICT: This is the default. Ticks must fill the voice.\n * - SOFT: Ticks can be added without restrictions.\n * - FULL: Ticks do not need to fill the voice, but can't exceed the maximum tick length.\n */\n static get Mode() {\n return VoiceMode;\n }\n /** Get the total ticks in the voice. */\n getTotalTicks() {\n return this.totalTicks;\n }\n /** Get the total ticks used in the voice by all the tickables. */\n getTicksUsed() {\n return this.ticksUsed;\n }\n /** Get the largest width of all the tickables. */\n getLargestTickWidth() {\n return this.largestTickWidth;\n }\n /** Get the tick count for the shortest tickable */\n getSmallestTickCount() {\n return this.smallestTickCount;\n }\n /** Get the tickables in the voice. */\n getTickables() {\n return this.tickables;\n }\n /** Get the voice mode. */\n getMode() {\n return this.mode;\n }\n /**\n * Set the voice mode.\n * @param mode value from `VoiceMode`\n */\n setMode(mode) {\n this.mode = mode;\n return this;\n }\n /** Get the resolution multiplier for the voice. */\n getResolutionMultiplier() {\n return this.resolutionMultiplier;\n }\n /** Get the actual tick resolution for the voice. */\n getActualResolution() {\n return this.resolutionMultiplier * this.time.resolution;\n }\n /** Set the voice's stave. */\n setStave(stave) {\n this.stave = stave;\n // Reset the bounding box so we can reformat.\n this.boundingBox = undefined;\n return this;\n }\n getStave() {\n return this.stave;\n }\n /** Get the bounding box for the voice. */\n getBoundingBox() {\n if (!this.boundingBox) {\n const stave = this.checkStave();\n let boundingBox = undefined;\n for (let i = 0; i < this.tickables.length; ++i) {\n const tickable = this.tickables[i];\n tickable.setStave(stave);\n const bb = tickable.getBoundingBox();\n if (bb) {\n boundingBox = boundingBox ? boundingBox.mergeWith(bb) : bb;\n }\n }\n this.boundingBox = boundingBox;\n }\n return this.boundingBox;\n }\n /** Set the voice mode to strict or soft. */\n setStrict(strict) {\n this.mode = strict ? VoiceMode.STRICT : VoiceMode.SOFT;\n return this;\n }\n /** Determine if the voice is complete according to the voice mode. */\n isComplete() {\n if (this.mode === VoiceMode.STRICT || this.mode === VoiceMode.FULL) {\n return this.ticksUsed.equals(this.totalTicks);\n }\n else {\n return true;\n }\n }\n /**\n * We use softmax to layout the tickables proportional to the exponent of\n * their duration. The softmax factor is used to determine the 'linearness' of\n * the layout.\n *\n * The softmax of all the tickables in this voice should sum to 1.\n */\n setSoftmaxFactor(factor) {\n this.options.softmaxFactor = factor;\n return this;\n }\n /**\n * Calculate the sum of the exponents of all the ticks in this voice to use\n * as the denominator of softmax.\n */\n reCalculateExpTicksUsed() {\n const totalTicks = this.ticksUsed.value();\n const exp = (tickable) => Math.pow(this.options.softmaxFactor, tickable.getTicks().value() / totalTicks);\n this.expTicksUsed = this.tickables.map(exp).reduce((a, b) => a + b, 0);\n return this.expTicksUsed;\n }\n /** Get the softmax-scaled value of a tick duration. 'tickValue' is a number. */\n softmax(tickValue) {\n if (!this.expTicksUsed) {\n this.expTicksUsed = this.reCalculateExpTicksUsed();\n }\n const totalTicks = this.ticksUsed.value();\n const exp = (v) => Math.pow(this.options.softmaxFactor, v / totalTicks);\n const sm = exp(tickValue) / this.expTicksUsed;\n return sm;\n }\n /** Add a tickable to the voice. */\n addTickable(tickable) {\n if (!tickable.shouldIgnoreTicks()) {\n const ticks = tickable.getTicks();\n // Update the total ticks for this line.\n this.ticksUsed.add(ticks);\n this.expTicksUsed = 0; // reset\n if ((this.mode === VoiceMode.STRICT || this.mode === VoiceMode.FULL) &&\n this.ticksUsed.greaterThan(this.totalTicks)) {\n this.ticksUsed.subtract(ticks);\n throw new RuntimeError('BadArgument', 'Too many ticks.');\n }\n // Track the smallest tickable for formatting.\n if (ticks.lessThan(this.smallestTickCount)) {\n this.smallestTickCount = ticks.clone();\n }\n this.resolutionMultiplier = this.ticksUsed.denominator;\n // Expand total ticks using denominator from ticks used.\n this.totalTicks.add(0, this.ticksUsed.denominator);\n }\n // Add the tickable to the line.\n this.tickables.push(tickable);\n tickable.setVoice(this);\n return this;\n }\n /** Add an array of tickables to the voice. */\n addTickables(tickables) {\n for (let i = 0; i < tickables.length; ++i) {\n this.addTickable(tickables[i]);\n }\n return this;\n }\n /** Preformat the voice by applying the voice's stave to each note. */\n preFormat() {\n if (this.preFormatted)\n return this;\n const stave = this.checkStave();\n this.tickables.forEach((tickable) => {\n if (!tickable.getStave()) {\n tickable.setStave(stave);\n }\n });\n this.preFormatted = true;\n return this;\n }\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n /**\n * Render the voice onto the canvas `context` and an optional `stave`.\n * If `stave` is omitted, it is expected that the notes have staves\n * already set.\n *\n * This method also calculates the voice's boundingBox while drawing\n * the notes. Note the similarities with this.getBoundingBox().\n */\n draw(context = this.checkContext(), stave) {\n stave = stave !== null && stave !== void 0 ? stave : this.stave;\n this.setRendered();\n let boundingBox = undefined;\n for (let i = 0; i < this.tickables.length; ++i) {\n const tickable = this.tickables[i];\n // Set the stave if provided.\n if (stave) {\n tickable.setStave(stave);\n }\n defined(tickable.getStave(), 'MissingStave', 'The voice cannot draw tickables without staves.');\n const bb = tickable.getBoundingBox();\n if (bb) {\n boundingBox = boundingBox ? boundingBox.mergeWith(bb) : bb;\n }\n tickable.setContext(context);\n tickable.drawWithStyle();\n }\n this.boundingBox = boundingBox;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Note } from './note';\nimport { Barline, BarlineType } from './stavebarline';\nimport { Category } from './typeguard';\nimport { log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (BarNote.DEBUG)\n log('Vex.Flow.BarNote', args);\n}\n/**\n * A `BarNote` is used to render bar lines (from `barline.ts`). `BarNote`s can\n * be added to a voice and rendered in the middle of a stave. Since it has no\n * duration, it consumes no `tick`s, and is dealt with appropriately by the formatter.\n *\n * See `tests/barnote_tests.ts` for usage examples.\n */\nexport class BarNote extends Note {\n constructor(type = BarlineType.SINGLE) {\n super({ duration: 'b' });\n this.metrics = {\n widths: {},\n };\n const TYPE = BarlineType;\n this.metrics.widths = {\n [TYPE.SINGLE]: 8,\n [TYPE.DOUBLE]: 12,\n [TYPE.END]: 15,\n [TYPE.REPEAT_BEGIN]: 14,\n [TYPE.REPEAT_END]: 14,\n [TYPE.REPEAT_BOTH]: 18,\n [TYPE.NONE]: 0,\n };\n // Tell the formatter that bar notes have no duration.\n this.ignore_ticks = true;\n this.setType(type);\n }\n static get CATEGORY() {\n return Category.BarNote;\n }\n /** Get the type of bar note.*/\n getType() {\n return this.type;\n }\n /** Set the type of bar note. */\n setType(type) {\n this.type = typeof type === 'string' ? Barline.typeString[type] : type;\n // Set width to width of relevant `Barline`.\n this.setWidth(this.metrics.widths[this.type]);\n return this;\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n /** Overridden to ignore. */\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n /** Render note to stave. */\n draw() {\n const ctx = this.checkContext();\n L('Rendering bar line at: ', this.getAbsoluteX());\n if (this.style)\n this.applyStyle(ctx);\n const barline = new Barline(this.type);\n barline.setX(this.getAbsoluteX());\n barline.draw(this.checkStave());\n if (this.style)\n this.restoreStyle(ctx);\n this.setRendered();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.BarNote.DEBUG` to `true`. */\nBarNote.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Modifier } from './modifier';\nimport { TextFormatter } from './textformatter';\nimport { Category, isTabNote } from './typeguard';\nimport { RuntimeError } from './util';\n/** Bend implements tablature bends. */\nexport class Bend extends Modifier {\n /**\n * Example of a phrase:\n * ```\n * [{\n * type: UP,\n * text: \"whole\"\n * width: 8;\n * },\n * {\n * type: DOWN,\n * text: \"whole\"\n * width: 8;\n * },\n * {\n * type: UP,\n * text: \"half\"\n * width: 8;\n * },\n * {\n * type: UP,\n * text: \"whole\"\n * width: 8;\n * },\n * {\n * type: DOWN,\n * text: \"1 1/2\"\n * width: 8;\n * }]\n * ```\n * @param text text for bend (\"Full\", \"Half\", etc.) (DEPRECATED)\n * @param release if true, render a release. (DEPRECATED)\n * @param phrase if set, ignore \"text\" and \"release\", and use the more sophisticated phrase specified\n */\n constructor(text, release = false, phrase) {\n super();\n this.text = text;\n this.x_shift = 0;\n this.release = release;\n this.tap = '';\n this.resetFont();\n this.render_options = {\n line_width: 1.5,\n line_style: '#777777',\n bend_width: 8,\n release_width: 8,\n };\n if (phrase) {\n this.phrase = phrase;\n }\n else {\n // Backward compatibility\n this.phrase = [{ type: Bend.UP, text: this.text }];\n if (this.release)\n this.phrase.push({ type: Bend.DOWN, text: '' });\n }\n this.updateWidth();\n }\n static get CATEGORY() {\n return Category.Bend;\n }\n static get UP() {\n return 0;\n }\n static get DOWN() {\n return 1;\n }\n // Arrange bends in `ModifierContext`\n static format(bends, state) {\n if (!bends || bends.length === 0)\n return false;\n let last_width = 0;\n // Format Bends\n for (let i = 0; i < bends.length; ++i) {\n const bend = bends[i];\n const note = bend.checkAttachedNote();\n if (isTabNote(note)) {\n const stringPos = note.leastString() - 1;\n if (state.top_text_line < stringPos) {\n state.top_text_line = stringPos;\n }\n }\n bend.setXShift(last_width);\n last_width = bend.getWidth();\n bend.setTextLine(state.top_text_line);\n }\n state.right_shift += last_width;\n state.top_text_line += 1;\n return true;\n }\n /** Set horizontal shift in pixels. */\n setXShift(value) {\n this.x_shift = value;\n this.updateWidth();\n return this;\n }\n setTap(value) {\n this.tap = value;\n return this;\n }\n /** Get text provided in the constructor. */\n getText() {\n return this.text;\n }\n getTextHeight() {\n const textFormatter = TextFormatter.create(this.textFont);\n return textFormatter.maxHeight;\n }\n /** Recalculate width. */\n updateWidth() {\n const textFormatter = TextFormatter.create(this.textFont);\n const measureText = (text) => {\n return textFormatter.getWidthForTextInPx(text);\n };\n let totalWidth = 0;\n for (let i = 0; i < this.phrase.length; ++i) {\n const bend = this.phrase[i];\n if (bend.width !== undefined) {\n totalWidth += bend.width;\n }\n else {\n const additional_width = bend.type === Bend.UP ? this.render_options.bend_width : this.render_options.release_width;\n bend.width = Math.max(additional_width, measureText(bend.text)) + 3;\n bend.draw_width = bend.width / 2;\n totalWidth += bend.width;\n }\n }\n this.setWidth(totalWidth + this.x_shift);\n return this;\n }\n /** Draw the bend on the rendering context. */\n draw() {\n var _a;\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(Modifier.Position.RIGHT, this.index);\n start.x += 3;\n start.y += 0.5;\n const x_shift = this.x_shift;\n const stave = note.checkStave();\n const spacing = stave.getSpacingBetweenLines();\n const lowestY = note.getYs().reduce((a, b) => (a < b ? a : b));\n // this.text_line is relative to top string in the group.\n const bend_height = start.y - ((this.text_line + 1) * spacing + start.y - lowestY) + 3;\n const annotation_y = start.y - ((this.text_line + 1) * spacing + start.y - lowestY) - 1;\n const renderBend = (x, y, width, height) => {\n const cp_x = x + width;\n const cp_y = y;\n ctx.save();\n ctx.beginPath();\n ctx.setLineWidth(this.render_options.line_width);\n ctx.setStrokeStyle(this.render_options.line_style);\n ctx.setFillStyle(this.render_options.line_style);\n ctx.moveTo(x, y);\n ctx.quadraticCurveTo(cp_x, cp_y, x + width, height);\n ctx.stroke();\n ctx.restore();\n };\n const renderRelease = (x, y, width, height) => {\n ctx.save();\n ctx.beginPath();\n ctx.setLineWidth(this.render_options.line_width);\n ctx.setStrokeStyle(this.render_options.line_style);\n ctx.setFillStyle(this.render_options.line_style);\n ctx.moveTo(x, height);\n ctx.quadraticCurveTo(x + width, height, x + width, y);\n ctx.stroke();\n ctx.restore();\n };\n const renderArrowHead = (x, y, direction) => {\n const width = 4;\n const yBase = y + width * direction;\n ctx.beginPath();\n ctx.moveTo(x, y); // tip of the arrow\n ctx.lineTo(x - width, yBase);\n ctx.lineTo(x + width, yBase);\n ctx.closePath();\n ctx.fill();\n };\n const renderText = (x, text) => {\n ctx.save();\n ctx.setFont(this.textFont);\n const render_x = x - ctx.measureText(text).width / 2;\n ctx.fillText(text, render_x, annotation_y);\n ctx.restore();\n };\n let last_bend = undefined;\n let last_bend_draw_width = 0;\n let last_drawn_width = 0;\n if ((_a = this.tap) === null || _a === void 0 ? void 0 : _a.length) {\n const tapStart = note.getModifierStartXY(Modifier.Position.CENTER, this.index);\n renderText(tapStart.x, this.tap);\n }\n for (let i = 0; i < this.phrase.length; ++i) {\n const bend = this.phrase[i];\n if (!bend.draw_width)\n bend.draw_width = 0;\n if (i === 0)\n bend.draw_width += x_shift;\n last_drawn_width = bend.draw_width + last_bend_draw_width - (i === 1 ? x_shift : 0);\n if (bend.type === Bend.UP) {\n if (last_bend && last_bend.type === Bend.UP) {\n renderArrowHead(start.x, bend_height, +1);\n }\n renderBend(start.x, start.y, last_drawn_width, bend_height);\n }\n if (bend.type === Bend.DOWN) {\n if (last_bend && last_bend.type === Bend.UP) {\n renderRelease(start.x, start.y, last_drawn_width, bend_height);\n }\n if (last_bend && last_bend.type === Bend.DOWN) {\n renderArrowHead(start.x, start.y, -1);\n renderRelease(start.x, start.y, last_drawn_width, bend_height);\n }\n if (!last_bend) {\n last_drawn_width = bend.draw_width;\n renderRelease(start.x, start.y, last_drawn_width, bend_height);\n }\n }\n renderText(start.x + last_drawn_width, bend.text);\n last_bend = bend;\n last_bend_draw_width = bend.draw_width;\n last_bend.x = start.x;\n start.x += last_drawn_width;\n }\n if (!last_bend || last_bend.x == undefined) {\n throw new RuntimeError('NoLastBendForBend', 'Internal error.');\n }\n // Final arrowhead and text\n if (last_bend.type === Bend.UP) {\n renderArrowHead(last_bend.x + last_drawn_width, bend_height, +1);\n }\n else if (last_bend.type === Bend.DOWN) {\n renderArrowHead(last_bend.x + last_drawn_width, start.y, -1);\n }\n }\n}\n/** Default text font. */\nBend.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n//\n// This class implements dot modifiers for notes.\nimport { Modifier } from './modifier';\nimport { Category, isGraceNote, isStaveNote, isTabNote } from './typeguard';\nimport { RuntimeError } from './util';\nexport class Dot extends Modifier {\n constructor() {\n super();\n this.position = Modifier.Position.RIGHT;\n this.radius = 2;\n this.setWidth(5);\n this.dot_shiftY = 0;\n }\n static get CATEGORY() {\n return Category.Dot;\n }\n /** Returns the dots associated to a Note. */\n static getDots(note) {\n return note.getModifiersByType(Dot.CATEGORY);\n }\n /** Add a dot on the specified keys to the notes. */\n static buildAndAttach(notes, options) {\n for (const note of notes) {\n if (options === null || options === void 0 ? void 0 : options.all) {\n for (let i = 0; i < note.keys.length; i++) {\n const dot = new Dot();\n dot.setDotShiftY(note.glyph.dot_shiftY);\n note.addModifier(dot, i);\n }\n }\n else if ((options === null || options === void 0 ? void 0 : options.index) != undefined) {\n const dot = new Dot();\n dot.setDotShiftY(note.glyph.dot_shiftY);\n note.addModifier(dot, options === null || options === void 0 ? void 0 : options.index);\n }\n else {\n const dot = new Dot();\n dot.setDotShiftY(note.glyph.dot_shiftY);\n note.addModifier(dot, 0);\n }\n }\n }\n // Arrange dots inside a ModifierContext.\n static format(dots, state) {\n const right_shift = state.right_shift;\n const dot_spacing = 1;\n if (!dots || dots.length === 0)\n return false;\n const dot_list = [];\n const max_shift_map = {};\n for (let i = 0; i < dots.length; ++i) {\n const dot = dots[i];\n const note = dot.getNote();\n let props;\n let shift;\n if (isStaveNote(note)) {\n const index = dot.checkIndex();\n props = note.getKeyProps()[index];\n // consider right displaced head with no previous modifier\n shift = note.getFirstDotPx();\n }\n else if (isTabNote(note)) {\n props = { line: 0.5 }; // Shim key props for dot placement\n shift = right_shift;\n }\n else {\n // note object is not StaveNote or TabNote.\n throw new RuntimeError('Internal', 'Unexpected instance.');\n }\n const note_id = note.getAttribute('id');\n dot_list.push({ line: props.line, note, note_id, dot });\n max_shift_map[note_id] = Math.max(max_shift_map[note_id] || shift, shift);\n }\n // Sort dots by line number.\n dot_list.sort((a, b) => b.line - a.line);\n let dot_shift = right_shift;\n let x_width = 0;\n let last_line = null;\n let last_note = null;\n let prev_dotted_space = null;\n let half_shiftY = 0;\n for (let i = 0; i < dot_list.length; ++i) {\n const { dot, note, note_id, line } = dot_list[i];\n // Reset the position of the dot every line.\n if (line !== last_line || note !== last_note) {\n dot_shift = max_shift_map[note_id];\n }\n if (!note.isRest() && line !== last_line) {\n if (Math.abs(line % 1) === 0.5) {\n // note is on a space, so no dot shift\n half_shiftY = 0;\n }\n else {\n // note is on a line, so shift dot to space above the line\n half_shiftY = 0.5;\n if (last_note != null && !last_note.isRest() && last_line != null && last_line - line === 0.5) {\n // previous note on a space, so shift dot to space below the line\n half_shiftY = -0.5;\n }\n else if (line + half_shiftY === prev_dotted_space) {\n // previous space is dotted, so shift dot to space below the line\n half_shiftY = -0.5;\n }\n }\n }\n // convert half_shiftY to a multiplier for dots.draw()\n if (note.isRest()) {\n dot.dot_shiftY += -half_shiftY;\n }\n else {\n dot.dot_shiftY = -half_shiftY;\n }\n prev_dotted_space = line + half_shiftY;\n dot.setXShift(dot_shift);\n dot_shift += dot.getWidth() + dot_spacing; // spacing\n x_width = dot_shift > x_width ? dot_shift : x_width;\n last_line = line;\n last_note = note;\n }\n // Update state.\n state.right_shift += x_width;\n return true;\n }\n setNote(note) {\n this.note = note;\n if (isGraceNote(note)) {\n this.radius *= 0.5;\n this.setWidth(3);\n }\n return this;\n }\n setDotShiftY(y) {\n this.dot_shiftY = y;\n return this;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const stave = note.checkStave();\n const lineSpace = stave.getSpacingBetweenLines();\n const start = note.getModifierStartXY(this.position, this.index, { forceFlagRight: true });\n // Set the starting y coordinate to the base of the stem for TabNotes.\n if (isTabNote(note)) {\n start.y = note.getStemExtents().baseY;\n }\n const x = start.x + this.x_shift + this.width - this.radius;\n const y = start.y + this.y_shift + this.dot_shiftY * lineSpace;\n ctx.beginPath();\n ctx.arc(x, y, this.radius, 0, Math.PI * 2, false);\n ctx.fill();\n }\n}\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n// Author Larry Kuhns 2013\n// Class to draws string numbers into the notation.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { Tables } from './tables';\nimport { TextFormatter } from './textformatter';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class FretHandFinger extends Modifier {\n constructor(finger) {\n super();\n this.finger = finger;\n this.width = 7;\n this.position = Modifier.Position.LEFT; // Default position above stem or note head\n this.x_shift = 0;\n this.y_shift = 0;\n this.x_offset = 0; // Horizontal offset from default\n this.y_offset = 0; // Vertical offset from default\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.FretHandFinger;\n }\n // Arrange fingerings inside a ModifierContext.\n static format(nums, state) {\n const { left_shift, right_shift } = state;\n const num_spacing = 1;\n if (!nums || nums.length === 0)\n return false;\n const nums_list = [];\n let prev_note = null;\n let shiftLeft = 0;\n let shiftRight = 0;\n for (let i = 0; i < nums.length; ++i) {\n const num = nums[i];\n const note = num.getNote();\n const pos = num.getPosition();\n const index = num.checkIndex();\n const props = note.getKeyProps()[index];\n const textFormatter = TextFormatter.create(num.textFont);\n const textHeight = textFormatter.maxHeight;\n if (num.position === ModifierPosition.ABOVE) {\n state.top_text_line += textHeight / Tables.STAVE_LINE_DISTANCE + 0.5;\n }\n if (num.position === ModifierPosition.BELOW) {\n state.text_line += textHeight / Tables.STAVE_LINE_DISTANCE + 0.5;\n }\n if (note !== prev_note) {\n for (let n = 0; n < note.keys.length; ++n) {\n if (left_shift === 0) {\n shiftLeft = Math.max(note.getLeftDisplacedHeadPx(), shiftLeft);\n }\n if (right_shift === 0) {\n shiftRight = Math.max(note.getRightDisplacedHeadPx(), shiftRight);\n }\n }\n prev_note = note;\n }\n nums_list.push({\n note,\n num,\n pos,\n line: props.line,\n shiftL: shiftLeft,\n shiftR: shiftRight,\n });\n }\n // Sort fingernumbers by line number.\n nums_list.sort((a, b) => b.line - a.line);\n let numShiftL = 0;\n let numShiftR = 0;\n let xWidthL = 0;\n let xWidthR = 0;\n let lastLine = null;\n let lastNote = null;\n for (let i = 0; i < nums_list.length; ++i) {\n let num_shift = 0;\n const { note, pos, num, line, shiftL, shiftR } = nums_list[i];\n // Reset the position of the string number every line.\n if (line !== lastLine || note !== lastNote) {\n numShiftL = left_shift + shiftL;\n numShiftR = right_shift + shiftR;\n }\n const numWidth = num.getWidth() + num_spacing;\n if (pos === Modifier.Position.LEFT) {\n num.setXShift(left_shift + numShiftL);\n num_shift = left_shift + numWidth; // spacing\n xWidthL = num_shift > xWidthL ? num_shift : xWidthL;\n }\n else if (pos === Modifier.Position.RIGHT) {\n num.setXShift(numShiftR);\n num_shift = shiftRight + numWidth; // spacing\n xWidthR = num_shift > xWidthR ? num_shift : xWidthR;\n }\n lastLine = line;\n lastNote = note;\n }\n state.left_shift += xWidthL;\n state.right_shift += xWidthR;\n return true;\n }\n static easyScoreHook({ fingerings } = {}, note, builder) {\n fingerings === null || fingerings === void 0 ? void 0 : fingerings.split(',').map((fingeringString) => {\n const split = fingeringString.trim().split('.');\n const params = { number: split[0] };\n if (split[1])\n params.position = split[1];\n return builder.getFactory().Fingering(params);\n }).map((fingering, index) => note.addModifier(fingering, index));\n }\n setFretHandFinger(finger) {\n this.finger = finger;\n return this;\n }\n getFretHandFinger() {\n return this.finger;\n }\n setOffsetX(x) {\n this.x_offset = x;\n return this;\n }\n setOffsetY(y) {\n this.y_offset = y;\n return this;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(this.position, this.index);\n let dot_x = start.x + this.x_shift + this.x_offset;\n let dot_y = start.y + this.y_shift + this.y_offset + 5;\n switch (this.position) {\n case Modifier.Position.ABOVE:\n dot_x -= 4;\n dot_y -= 12;\n break;\n case Modifier.Position.BELOW:\n dot_x -= 2;\n dot_y += 10;\n break;\n case Modifier.Position.LEFT:\n dot_x -= this.width;\n break;\n case Modifier.Position.RIGHT:\n dot_x += 1;\n break;\n default:\n throw new RuntimeError('InvalidPosition', `The position ${this.position} does not exist`);\n }\n ctx.save();\n ctx.setFont(this.textFont);\n ctx.fillText('' + this.finger, dot_x, dot_y);\n ctx.restore();\n }\n}\nFretHandFinger.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 9,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// This class implements varies types of ties between contiguous notes. The\n// ties include: regular ties, hammer ons, pull offs, and slides.\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StaveTie extends Element {\n /**\n * @param notes is a struct that has:\n *\n * {\n * first_note: Note,\n * last_note: Note,\n * first_indices: [n1, n2, n3],\n * last_indices: [n1, n2, n3]\n * }\n *\n * @param text\n */\n constructor(notes, text) {\n super();\n this.setNotes(notes);\n this.text = text;\n this.render_options = {\n cp1: 8,\n cp2: 12,\n text_shift_x: 0,\n first_x_shift: 0,\n last_x_shift: 0,\n y_shift: 7,\n tie_spacing: 0,\n };\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StaveTie;\n }\n setDirection(direction) {\n this.direction = direction;\n return this;\n }\n /**\n * Set the notes to attach this tie to.\n *\n * @param {!Object} notes The notes to tie up.\n */\n setNotes(notes) {\n if (!notes.first_note && !notes.last_note) {\n throw new RuntimeError('BadArguments', 'Tie needs to have either first_note or last_note set.');\n }\n if (!notes.first_indices) {\n notes.first_indices = [0];\n }\n if (!notes.last_indices) {\n notes.last_indices = [0];\n }\n if (notes.first_indices.length !== notes.last_indices.length) {\n throw new RuntimeError('BadArguments', 'Tied notes must have same number of indices.');\n }\n this.notes = notes;\n return this;\n }\n /**\n * @return {boolean} Returns true if this is a partial bar.\n */\n isPartial() {\n return !this.notes.first_note || !this.notes.last_note;\n }\n renderTie(params) {\n if (params.first_ys.length === 0 || params.last_ys.length === 0) {\n throw new RuntimeError('BadArguments', 'No Y-values to render');\n }\n const ctx = this.checkContext();\n let cp1 = this.render_options.cp1;\n let cp2 = this.render_options.cp2;\n if (Math.abs(params.last_x_px - params.first_x_px) < 10) {\n cp1 = 2;\n cp2 = 8;\n }\n const first_x_shift = this.render_options.first_x_shift;\n const last_x_shift = this.render_options.last_x_shift;\n const y_shift = this.render_options.y_shift * params.direction;\n // setNotes(...) verified that first_indices and last_indices are not undefined.\n // As a result, we use the ! non-null assertion operator here.\n // eslint-disable-next-line\n const first_indices = this.notes.first_indices;\n // eslint-disable-next-line\n const last_indices = this.notes.last_indices;\n for (let i = 0; i < first_indices.length; ++i) {\n const cp_x = (params.last_x_px + last_x_shift + (params.first_x_px + first_x_shift)) / 2;\n const first_y_px = params.first_ys[first_indices[i]] + y_shift;\n const last_y_px = params.last_ys[last_indices[i]] + y_shift;\n if (isNaN(first_y_px) || isNaN(last_y_px)) {\n throw new RuntimeError('BadArguments', 'Bad indices for tie rendering.');\n }\n const top_cp_y = (first_y_px + last_y_px) / 2 + cp1 * params.direction;\n const bottom_cp_y = (first_y_px + last_y_px) / 2 + cp2 * params.direction;\n ctx.beginPath();\n ctx.moveTo(params.first_x_px + first_x_shift, first_y_px);\n ctx.quadraticCurveTo(cp_x, top_cp_y, params.last_x_px + last_x_shift, last_y_px);\n ctx.quadraticCurveTo(cp_x, bottom_cp_y, params.first_x_px + first_x_shift, first_y_px);\n ctx.closePath();\n ctx.fill();\n }\n }\n renderText(first_x_px, last_x_px) {\n var _a, _b, _c;\n if (!this.text)\n return;\n const ctx = this.checkContext();\n let center_x = (first_x_px + last_x_px) / 2;\n center_x -= ctx.measureText(this.text).width / 2;\n const stave = (_b = (_a = this.notes.first_note) === null || _a === void 0 ? void 0 : _a.checkStave()) !== null && _b !== void 0 ? _b : (_c = this.notes.last_note) === null || _c === void 0 ? void 0 : _c.checkStave();\n if (stave) {\n ctx.save();\n ctx.setFont(this.textFont);\n ctx.fillText(this.text, center_x + this.render_options.text_shift_x, stave.getYForTopText() - 1);\n ctx.restore();\n }\n }\n draw() {\n this.checkContext();\n this.setRendered();\n const first_note = this.notes.first_note;\n const last_note = this.notes.last_note;\n // Provide some default values so the compiler doesn't complain.\n let first_x_px = 0;\n let last_x_px = 0;\n let first_ys = [0];\n let last_ys = [0];\n let stem_direction = 0;\n if (first_note) {\n first_x_px = first_note.getTieRightX() + this.render_options.tie_spacing;\n stem_direction = first_note.getStemDirection();\n first_ys = first_note.getYs();\n }\n else if (last_note) {\n const stave = last_note.checkStave();\n first_x_px = stave.getTieStartX();\n first_ys = last_note.getYs();\n this.notes.first_indices = this.notes.last_indices;\n }\n if (last_note) {\n last_x_px = last_note.getTieLeftX() + this.render_options.tie_spacing;\n stem_direction = last_note.getStemDirection();\n last_ys = last_note.getYs();\n }\n else if (first_note) {\n const stave = first_note.checkStave();\n last_x_px = stave.getTieEndX();\n last_ys = first_note.getYs();\n this.notes.last_indices = this.notes.first_indices;\n }\n if (this.direction) {\n stem_direction = this.direction;\n }\n this.renderTie({\n first_x_px,\n last_x_px,\n first_ys,\n last_ys,\n direction: stem_direction,\n });\n this.renderText(first_x_px, last_x_px);\n return true;\n }\n}\n/** Default text font. */\nStaveTie.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n","// / [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This class implements varies types of ties between contiguous notes. The\n// ties include: regular ties, hammer ons, pull offs, and slides.\nimport { StaveTie } from './stavetie';\nimport { Category } from './typeguard';\nexport class TabTie extends StaveTie {\n static get CATEGORY() {\n return Category.TabTie;\n }\n static createHammeron(notes) {\n return new TabTie(notes, 'H');\n }\n static createPulloff(notes) {\n return new TabTie(notes, 'P');\n }\n /**\n * @param notes is a struct that has:\n * {\n * first_note: Note,\n * last_note: Note,\n * first_indices: [n1, n2, n3],\n * last_indices: [n1, n2, n3]\n * }\n *\n * @param text\n */\n constructor(notes, text) {\n super(notes, text);\n this.render_options.cp1 = 9;\n this.render_options.cp2 = 11;\n this.render_options.y_shift = 3;\n this.direction = -1; // Tab tie's are always face up.\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements `GraceNoteGroup` which is used to format and\n// render grace notes.\nimport { Beam } from './beam';\nimport { Formatter } from './formatter';\nimport { Modifier } from './modifier';\nimport { StaveTie } from './stavetie';\nimport { Tables } from './tables';\nimport { TabTie } from './tabtie';\nimport { Category, isStaveNote } from './typeguard';\nimport { log } from './util';\nimport { Voice } from './voice';\n// To enable logging for this class. Set `GraceNoteGroup.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (GraceNoteGroup.DEBUG)\n log('Vex.Flow.GraceNoteGroup', args);\n}\n/** GraceNoteGroup is used to format and render grace notes. */\nexport class GraceNoteGroup extends Modifier {\n //** `GraceNoteGroup` inherits from `Modifier` and is placed inside a `ModifierContext`. */\n constructor(grace_notes, show_slur) {\n super();\n this.preFormatted = false;\n this.position = Modifier.Position.LEFT;\n this.grace_notes = grace_notes;\n this.width = 0;\n this.show_slur = show_slur;\n this.slur = undefined;\n this.voice = new Voice({\n num_beats: 4,\n beat_value: 4,\n resolution: Tables.RESOLUTION,\n }).setStrict(false);\n this.render_options = {\n slur_y_shift: 0,\n };\n this.beams = [];\n this.voice.addTickables(this.grace_notes);\n return this;\n }\n static get CATEGORY() {\n return Category.GraceNoteGroup;\n }\n /** Arranges groups inside a `ModifierContext`. */\n static format(gracenote_groups, state) {\n const group_spacing_stave = 4;\n const group_spacing_tab = 0;\n if (!gracenote_groups || gracenote_groups.length === 0)\n return false;\n const group_list = [];\n let prev_note = null;\n let shiftL = 0;\n for (let i = 0; i < gracenote_groups.length; ++i) {\n const gracenote_group = gracenote_groups[i];\n const note = gracenote_group.getNote();\n const is_stavenote = isStaveNote(note);\n const spacing = is_stavenote ? group_spacing_stave : group_spacing_tab;\n if (is_stavenote && note !== prev_note) {\n // Iterate through all notes to get the displaced pixels\n for (let n = 0; n < note.keys.length; ++n) {\n shiftL = Math.max(note.getLeftDisplacedHeadPx(), shiftL);\n }\n prev_note = note;\n }\n group_list.push({ shift: shiftL, gracenote_group, spacing });\n }\n // If first note left shift in case it is displaced\n let group_shift = group_list[0].shift;\n let formatWidth;\n for (let i = 0; i < group_list.length; ++i) {\n const gracenote_group = group_list[i].gracenote_group;\n gracenote_group.preFormat();\n formatWidth = gracenote_group.getWidth() + group_list[i].spacing;\n group_shift = Math.max(formatWidth, group_shift);\n }\n for (let i = 0; i < group_list.length; ++i) {\n const gracenote_group = group_list[i].gracenote_group;\n formatWidth = gracenote_group.getWidth() + group_list[i].spacing;\n gracenote_group.setSpacingFromNextModifier(group_shift - Math.min(formatWidth, group_shift));\n }\n state.left_shift += group_shift;\n return true;\n }\n preFormat() {\n if (this.preFormatted)\n return;\n if (!this.formatter) {\n this.formatter = new Formatter();\n }\n this.formatter.joinVoices([this.voice]).format([this.voice], 0, {});\n this.setWidth(this.formatter.getMinTotalWidth());\n this.preFormatted = true;\n }\n beamNotes(grace_notes) {\n grace_notes = grace_notes || this.grace_notes;\n if (grace_notes.length > 1) {\n const beam = new Beam(grace_notes);\n beam.render_options.beam_width = 3;\n beam.render_options.partial_beam_length = 4;\n this.beams.push(beam);\n }\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n getWidth() {\n return this.width;\n }\n getGraceNotes() {\n return this.grace_notes;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n L('Drawing grace note group for:', note);\n this.alignSubNotesWithNote(this.getGraceNotes(), note); // Modifier function\n // Draw grace notes.\n this.grace_notes.forEach((graceNote) => graceNote.setContext(ctx).draw());\n // Draw beams.\n this.beams.forEach((beam) => beam.setContext(ctx).draw());\n if (this.show_slur) {\n // Create and draw slur.\n const is_stavenote = isStaveNote(note);\n const TieClass = is_stavenote ? StaveTie : TabTie;\n this.slur = new TieClass({\n last_note: this.grace_notes[0],\n first_note: note,\n first_indices: [0],\n last_indices: [0],\n });\n this.slur.render_options.cp2 = 12;\n this.slur.render_options.y_shift = (is_stavenote ? 7 : 5) + this.render_options.slur_y_shift;\n this.slur.setContext(ctx).draw();\n }\n }\n}\nGraceNoteGroup.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2016\n//\n// ## Description\n//\n// This file implements `NoteSubGroup` which is used to format and\n// render notes as a `Modifier`\n// ex) ClefNote, TimeSigNote and BarNote.\nimport { Formatter } from './formatter';\nimport { Modifier } from './modifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { Voice } from './voice';\nexport class NoteSubGroup extends Modifier {\n constructor(subNotes) {\n super();\n this.preFormatted = false;\n this.position = Modifier.Position.LEFT;\n this.subNotes = subNotes;\n this.subNotes.forEach((subNote) => {\n subNote.setIgnoreTicks(false);\n });\n this.width = 0;\n this.formatter = new Formatter();\n this.voice = new Voice({\n num_beats: 4,\n beat_value: 4,\n resolution: Tables.RESOLUTION,\n }).setStrict(false);\n this.voice.addTickables(this.subNotes);\n }\n static get CATEGORY() {\n return Category.NoteSubGroup;\n }\n // Arrange groups inside a `ModifierContext`\n static format(groups, state) {\n if (!groups || groups.length === 0)\n return false;\n let width = 0;\n for (let i = 0; i < groups.length; ++i) {\n const group = groups[i];\n group.preFormat();\n width += group.getWidth();\n }\n state.left_shift += width;\n return true;\n }\n preFormat() {\n if (this.preFormatted)\n return;\n this.formatter.joinVoices([this.voice]).format([this.voice], 0);\n this.setWidth(this.formatter.getMinTotalWidth());\n this.preFormatted = true;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n getWidth() {\n return this.width;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n this.alignSubNotesWithNote(this.subNotes, note); // Modifier function\n this.subNotes.forEach((subNote) => subNote.setContext(ctx).drawWithStyle());\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// A formatter for abstract tickable objects, such as notes, chords,\n// tabs, etc.\nimport { Fraction } from './fraction';\nimport { RuntimeError } from './util';\n/**\n * TickContext formats abstract tickable objects, such as notes, chords, tabs, etc.\n */\nexport class TickContext {\n constructor(options) {\n this.preFormatted = false;\n this.postFormatted = false;\n this.tickID = options && options.tickID ? options.tickID : 0;\n this.currentTick = new Fraction(0, 1);\n this.maxTicks = new Fraction(0, 1);\n this.maxTickable = undefined; // Biggest tickable\n this.minTicks = undefined; // this can remian null if all tickables have ignore_ticks\n this.minTickable = undefined;\n this.padding = 1; // padding on each side (width += padding * 2)\n this.x = 0;\n this.xBase = 0; // base x position without xOffset\n this.xOffset = 0; // xBase and xOffset are an alternative way to describe x (x = xB + xO)\n this.tickables = []; // Notes, tabs, chords, lyrics.\n this.tickablesByVoice = {}; // Tickables indexed by voice number\n // Formatting metrics\n this.notePx = 0; // width of widest note in this context\n this.glyphPx = 0; // width of glyph (note head)\n this.leftDisplacedHeadPx = 0; // Extra left pixels for displaced notes\n this.rightDisplacedHeadPx = 0; // Extra right pixels for displaced notes\n this.modLeftPx = 0; // Left modifier pixels\n this.modRightPx = 0; // Right modifier pixels\n this.totalLeftPx = 0; // Total left pixels\n this.totalRightPx = 0; // Total right pixels\n this.tContexts = []; // Parent array of tick contexts\n this.width = 0;\n this.formatterMetrics = {\n // The freedom of a tickcontext is the distance it can move without colliding\n // with neighboring elements. A formatter can set these values during its\n // formatting pass, which a different formatter can then use to fine tune.\n freedom: { left: 0, right: 0 },\n };\n }\n static getNextContext(tContext) {\n const contexts = tContext.tContexts;\n const index = contexts.indexOf(tContext);\n if (index + 1 < contexts.length)\n return contexts[index + 1];\n }\n getTickID() {\n return this.tickID;\n }\n getX() {\n return this.x;\n }\n setX(x) {\n this.x = x;\n this.xBase = x;\n this.xOffset = 0;\n return this;\n }\n getXBase() {\n return this.xBase;\n } // use of xBase and xOffset is optional, avoids offset creep\n setXBase(xBase) {\n this.xBase = xBase;\n this.x = xBase + this.xOffset;\n }\n getXOffset() {\n return this.xOffset;\n }\n setXOffset(xOffset) {\n this.xOffset = xOffset;\n this.x = this.xBase + xOffset;\n }\n getWidth() {\n return this.width + this.padding * 2;\n }\n setPadding(padding) {\n this.padding = padding;\n return this;\n }\n getMaxTicks() {\n return this.maxTicks;\n }\n getMinTicks() {\n return this.minTicks;\n }\n getMaxTickable() {\n return this.maxTickable;\n }\n getMinTickable() {\n return this.minTickable;\n }\n getTickables() {\n return this.tickables;\n }\n /**\n * Introduced on 2020-04-17 as getTickablesForVoice(voiceIndex).\n * https://github.com/0xfe/vexflow/blame/dc97b0cc5bb93171c0038638c34362dc958222ca/src/tickcontext.js#L63\n * Renamed on 2021-08-05 to getTickableForVoice(voiceIndex). Method renamed to singular, since it returns one Tickable.\n */\n getTickableForVoice(voiceIndex) {\n return this.tickablesByVoice[voiceIndex];\n }\n getTickablesByVoice() {\n return this.tickablesByVoice;\n }\n getCenterAlignedTickables() {\n return this.tickables.filter((tickable) => tickable.isCenterAligned());\n }\n /** Gets widths context, note and left/right modifiers for formatting. */\n getMetrics() {\n const { width, glyphPx, notePx, leftDisplacedHeadPx, rightDisplacedHeadPx, modLeftPx, modRightPx, totalLeftPx, totalRightPx, } = this;\n return {\n width,\n glyphPx,\n notePx,\n leftDisplacedHeadPx,\n rightDisplacedHeadPx,\n modLeftPx,\n modRightPx,\n totalLeftPx,\n totalRightPx,\n };\n }\n getCurrentTick() {\n return this.currentTick;\n }\n setCurrentTick(tick) {\n this.currentTick = tick;\n this.preFormatted = false;\n }\n addTickable(tickable, voiceIndex) {\n if (!tickable) {\n throw new RuntimeError('BadArgument', 'Invalid tickable added.');\n }\n if (!tickable.shouldIgnoreTicks()) {\n const ticks = tickable.getTicks();\n if (ticks.greaterThan(this.maxTicks)) {\n this.maxTicks = ticks.clone();\n this.maxTickable = tickable;\n }\n if (this.minTicks == null) {\n this.minTicks = ticks.clone();\n this.minTickable = tickable;\n }\n else if (ticks.lessThan(this.minTicks)) {\n this.minTicks = ticks.clone();\n this.minTickable = tickable;\n }\n }\n tickable.setTickContext(this);\n this.tickables.push(tickable);\n this.tickablesByVoice[voiceIndex || 0] = tickable;\n this.preFormatted = false;\n return this;\n }\n preFormat() {\n if (this.preFormatted)\n return this;\n for (let i = 0; i < this.tickables.length; ++i) {\n const tickable = this.tickables[i];\n tickable.preFormat();\n const metrics = tickable.getMetrics();\n // Maintain max displaced head pixels from all tickables in the context\n this.leftDisplacedHeadPx = Math.max(this.leftDisplacedHeadPx, metrics.leftDisplacedHeadPx);\n this.rightDisplacedHeadPx = Math.max(this.rightDisplacedHeadPx, metrics.rightDisplacedHeadPx);\n // Maintain the widest note for all tickables in the context\n this.notePx = Math.max(this.notePx, metrics.notePx);\n // Maintain the widest note head\n this.glyphPx = Math.max(this.glyphPx, metrics.glyphWidth || 0);\n // Total modifier shift\n this.modLeftPx = Math.max(this.modLeftPx, metrics.modLeftPx);\n this.modRightPx = Math.max(this.modRightPx, metrics.modRightPx);\n // Total shift\n this.totalLeftPx = Math.max(this.totalLeftPx, metrics.modLeftPx + metrics.leftDisplacedHeadPx);\n this.totalRightPx = Math.max(this.totalRightPx, metrics.modRightPx + metrics.rightDisplacedHeadPx);\n // Recalculate the tick context total width\n this.width = this.notePx + this.totalLeftPx + this.totalRightPx;\n }\n return this;\n }\n postFormat() {\n if (this.postFormatted)\n return this;\n this.postFormatted = true;\n return this;\n }\n getFormatterMetrics() {\n return this.formatterMetrics;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Cyril Silverman\n// MIT License\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { TickContext } from './tickcontext';\nimport { Category, isTabNote } from './typeguard';\nimport { defined, log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Ornament.DEBUG)\n log('Vex.Flow.Ornament', args);\n}\n/**\n * Ornament implements ornaments as modifiers that can be\n * attached to notes. The complete list of ornaments is available in\n * `tables.ts` under `Vex.Flow.ornamentCodes`.\n *\n * See `tests/ornament_tests.ts` for usage examples.\n */\nexport class Ornament extends Modifier {\n /**\n * Create a new ornament of type `type`, which is an entry in\n * `Vex.Flow.ornamentCodes` in `tables.ts`.\n */\n constructor(type) {\n super();\n this.type = type;\n this.delayed = false;\n this.render_options = {\n font_scale: 38,\n accidentalLowerPadding: 3,\n accidentalUpperPadding: 3,\n };\n this.ornament = Tables.ornamentCodes(this.type);\n // new ornaments have their origin at the origin, and have more specific\n // metrics. Legacy ornaments do some\n // x scaling, and have hard-coded metrics\n const metrics = this.getMetrics();\n // some jazz ornaments are above or below depending on stem direction.\n this.adjustForStemDirection = false;\n // some jazz ornaments like falls are supposed to overlap with future bars\n // and so we report a different width than they actually take up.\n this.reportedWidth = metrics && metrics.reportedWidth ? metrics.reportedWidth : 0;\n this.stemUpYOffset = metrics && metrics.stemUpYOffset ? metrics.stemUpYOffset : 0;\n this.ornamentAlignWithNoteHead = Ornament.ornamentAlignWithNoteHead.indexOf(this.type) >= 0;\n if (!this.ornament) {\n throw new RuntimeError('ArgumentError', `Ornament not found: '${this.type}'`);\n }\n this.x_shift = metrics ? metrics.xOffset : 0;\n this.y_shift = metrics ? metrics.yOffset : 0;\n this.glyph = new Glyph(this.ornament.code, this.render_options.font_scale, {\n category: `ornament.${this.ornament.code}`,\n });\n // Is this a jazz ornament that goes between this note and the next note.\n if (Ornament.ornamentNoteTransition.indexOf(this.type) >= 0) {\n this.delayed = true;\n }\n // Legacy ornaments need this. I don't know why, but horizontal spacing issues\n // happen if I don't set it.\n if (!metrics) {\n this.glyph.setOrigin(0.5, 1.0); // FIXME: SMuFL won't require a vertical origin shift\n }\n }\n /** Ornaments category string. */\n static get CATEGORY() {\n return Category.Ornament;\n }\n /** Arrange ornaments inside `ModifierContext` */\n static format(ornaments, state) {\n if (!ornaments || ornaments.length === 0)\n return false;\n let width = 0; // width is used by ornaments, which are always centered on the note head\n let right_shift = state.right_shift; // jazz ornaments calculate r/l shift separately\n let left_shift = state.left_shift;\n let yOffset = 0;\n for (let i = 0; i < ornaments.length; ++i) {\n const ornament = ornaments[i];\n const increment = 2;\n if (Ornament.ornamentRelease.indexOf(ornament.type) >= 0) {\n ornament.x_shift += right_shift + 2;\n }\n if (Ornament.ornamentAttack.indexOf(ornament.type) >= 0) {\n ornament.x_shift -= left_shift + 2;\n }\n if (ornament.reportedWidth && ornament.x_shift < 0) {\n left_shift += ornament.reportedWidth;\n }\n else if (ornament.reportedWidth && ornament.x_shift > 0) {\n right_shift += ornament.reportedWidth;\n }\n else {\n width = Math.max(ornament.getWidth(), width);\n }\n // articulations above/below the line can be stacked.\n if (Ornament.ornamentArticulation.indexOf(ornament.type) >= 0) {\n // Unfortunately we don't know the stem direction. So we base it\n // on the line number, but also allow it to be overridden.\n const ornamentNote = defined(ornament.note, 'NoAttachedNote');\n if (ornamentNote.getLineNumber() >= 3 || ornament.getPosition() === Modifier.Position.ABOVE) {\n state.top_text_line += increment;\n ornament.y_shift += yOffset;\n yOffset -= ornament.glyph.bbox.getH();\n }\n else {\n state.text_line += increment;\n ornament.y_shift += yOffset;\n yOffset += ornament.glyph.bbox.getH();\n }\n }\n else {\n if (ornament.getPosition() === Modifier.Position.ABOVE) {\n ornament.setTextLine(state.top_text_line);\n state.top_text_line += increment;\n }\n else {\n ornament.setTextLine(state.text_line);\n state.text_line += increment;\n }\n }\n }\n // Note: 'legit' ornaments don't consider other modifiers when calculating their\n // X position, but jazz ornaments sometimes need to.\n state.left_shift = left_shift + width / 2;\n state.right_shift = right_shift + width / 2;\n return true;\n }\n /**\n * ornamentNoteTransition means the jazz ornament represents an effect from one note to another,\n * these are generally on the top of the staff.\n */\n static get ornamentNoteTransition() {\n return ['flip', 'jazzTurn', 'smear'];\n }\n /**\n * ornamentAttack indicates something that happens in the attach, placed before the note and\n * any accidentals\n */\n static get ornamentAttack() {\n return ['scoop'];\n }\n /**\n * The ornament is aligned based on the note head, but without regard to whether the\n * stem goes up or down.\n */\n static get ornamentAlignWithNoteHead() {\n return ['doit', 'fall', 'fallLong', 'doitLong', 'bend', 'plungerClosed', 'plungerOpen', 'scoop'];\n }\n /**\n * An ornament that happens on the release of the note, generally placed after the\n * note and overlapping the next beat/measure..\n */\n static get ornamentRelease() {\n return ['doit', 'fall', 'fallLong', 'doitLong', 'jazzTurn', 'smear', 'flip'];\n }\n /** ornamentArticulation goes above/below the note based on space availablity */\n static get ornamentArticulation() {\n return ['bend', 'plungerClosed', 'plungerOpen'];\n }\n /**\n * Legacy ornaments have hard-coded metrics. If additional ornament types are\n * added, get their metrics here.\n */\n // eslint-disable-next-line\n getMetrics() {\n return Tables.currentMusicFont().getMetrics().glyphs.jazzOrnaments[this.ornament.code];\n }\n /** Set whether the ornament is to be delayed. */\n setDelayed(delayed) {\n this.delayed = delayed;\n return this;\n }\n /** Set the upper accidental for the ornament. */\n setUpperAccidental(accid) {\n const scale = this.render_options.font_scale / 1.3;\n this.accidentalUpper = new Glyph(Tables.accidentalCodes(accid).code, scale);\n this.accidentalUpper.setOrigin(0.5, 1.0);\n return this;\n }\n /** Set the lower accidental for the ornament. */\n setLowerAccidental(accid) {\n const scale = this.render_options.font_scale / 1.3;\n this.accidentalLower = new Glyph(Tables.accidentalCodes(accid).code, scale);\n this.accidentalLower.setOrigin(0.5, 1.0);\n return this;\n }\n /** Render ornament in position next to note. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const stemDir = note.getStemDirection();\n const stave = note.checkStave();\n const classString = Object.keys(this.getAttribute('classes')).join(' ');\n ctx.openGroup(classString, this.getAttribute('id'));\n // Get stem extents\n const stemExtents = note.checkStem().getExtents();\n let y = stemDir === Stem.DOWN ? stemExtents.baseY : stemExtents.topY;\n // TabNotes don't have stems attached to them. Tab stems are rendered outside the stave.\n if (isTabNote(note)) {\n if (note.hasStem()) {\n if (stemDir === Stem.DOWN) {\n y = stave.getYForTopText(this.text_line);\n }\n }\n else {\n // Without a stem\n y = stave.getYForTopText(this.text_line);\n }\n }\n const isPlacedOnNoteheadSide = stemDir === Stem.DOWN;\n const spacing = stave.getSpacingBetweenLines();\n let lineSpacing = 1;\n // Beamed stems are longer than quarter note stems, adjust accordingly\n if (!isPlacedOnNoteheadSide && note.hasBeam()) {\n lineSpacing += 0.5;\n }\n const totalSpacing = spacing * (this.text_line + lineSpacing);\n const glyphYBetweenLines = y - totalSpacing;\n // Get initial coordinates for the modifier position\n const start = note.getModifierStartXY(this.position, this.index);\n let glyphX = start.x;\n // If the ornament is aligned with the note head, don't consider the stave y\n // but use the 'natural' modifier y\n let glyphY = this.ornamentAlignWithNoteHead\n ? start.y\n : Math.min(stave.getYForTopText(this.text_line), glyphYBetweenLines);\n glyphY += this.y_shift;\n // Ajdust x position if ornament is delayed\n if (this.delayed) {\n let delayXShift = 0;\n const startX = glyphX - (stave.getX() - 10);\n if (this.delayXShift !== undefined) {\n delayXShift = this.delayXShift;\n }\n else {\n delayXShift += this.glyph.getMetrics().width / 2;\n const nextContext = TickContext.getNextContext(note.getTickContext());\n if (nextContext) {\n delayXShift += (nextContext.getX() - startX) * 0.5;\n }\n else {\n delayXShift += (stave.getX() + stave.getWidth() - startX) * 0.5;\n }\n this.delayXShift = delayXShift;\n }\n glyphX += delayXShift;\n }\n L('Rendering ornament: ', this.ornament, glyphX, glyphY);\n if (this.accidentalLower) {\n this.accidentalLower.render(ctx, glyphX, glyphY);\n glyphY -= this.accidentalLower.getMetrics().height;\n glyphY -= this.render_options.accidentalLowerPadding;\n }\n if (this.stemUpYOffset && note.hasStem() && note.getStemDirection() === 1) {\n glyphY += this.stemUpYOffset;\n }\n if (note.getLineNumber() < 5 && Ornament.ornamentNoteTransition.indexOf(this.type) >= 0) {\n glyphY = note.checkStave().getBoundingBox().getY() + 40;\n }\n this.glyph.render(ctx, glyphX + this.x_shift, glyphY);\n if (this.accidentalUpper) {\n glyphY -= this.glyph.getMetrics().height + this.render_options.accidentalUpperPadding;\n this.accidentalUpper.render(ctx, glyphX, glyphY);\n }\n ctx.closeGroup();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Ornament.DEBUG` to `true`. */\nOrnament.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Rodrigo Vilar\n// MIT License\nimport { Glyph } from './glyph';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { Tables } from './tables';\nimport { Category, isGraceNote } from './typeguard';\n/** Parenthesis implements parenthesis modifiers for notes. */\nexport class Parenthesis extends Modifier {\n /**\n * Constructor\n *\n * @param position Modifier.Position.LEFT (default) or Modifier.Position.RIGHT\n */\n constructor(position) {\n super();\n this.position = position !== null && position !== void 0 ? position : Modifier.Position.LEFT;\n this.point = Tables.currentMusicFont().lookupMetric('parenthesis.default.point');\n this.setWidth(Tables.currentMusicFont().lookupMetric('parenthesis.default.width'));\n }\n static get CATEGORY() {\n return Category.Parenthesis;\n }\n /** Add parentheses to the notes. */\n static buildAndAttach(notes) {\n for (const note of notes) {\n for (let i = 0; i < note.keys.length; i++) {\n note.addModifier(new Parenthesis(ModifierPosition.LEFT), i);\n note.addModifier(new Parenthesis(ModifierPosition.RIGHT), i);\n }\n }\n }\n /** Arrange parentheses inside a ModifierContext. */\n static format(parentheses, state) {\n if (!parentheses || parentheses.length === 0)\n return false;\n let x_widthL = 0;\n let x_widthR = 0;\n for (let i = 0; i < parentheses.length; ++i) {\n const parenthesis = parentheses[i];\n const note = parenthesis.getNote();\n const pos = parenthesis.getPosition();\n const index = parenthesis.checkIndex();\n let shift = 0;\n if (pos === ModifierPosition.RIGHT) {\n shift = note.getRightParenthesisPx(index);\n x_widthR = x_widthR > shift + parenthesis.width ? x_widthR : shift + parenthesis.width;\n }\n if (pos === ModifierPosition.LEFT) {\n shift = note.getLeftParenthesisPx(index);\n x_widthL = x_widthL > shift + parenthesis.width ? x_widthL : shift + parenthesis.width;\n }\n parenthesis.setXShift(shift);\n }\n state.left_shift += x_widthL;\n state.right_shift += x_widthR;\n return true;\n }\n /** Set the associated note. */\n setNote(note) {\n this.note = note;\n this.point = Tables.currentMusicFont().lookupMetric('parenthesis.default.point');\n this.setWidth(Tables.currentMusicFont().lookupMetric('parenthesis.default.width'));\n if (isGraceNote(note)) {\n this.point = Tables.currentMusicFont().lookupMetric('parenthesis.gracenote.point');\n this.setWidth(Tables.currentMusicFont().lookupMetric('parenthesis.gracenote.width'));\n }\n return this;\n }\n /** Render the parenthesis. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(this.position, this.index, { forceFlagRight: true });\n const x = start.x + this.x_shift;\n const y = start.y + this.y_shift;\n if (this.position == Modifier.Position.RIGHT) {\n Glyph.renderGlyph(ctx, x + 1, y, this.point, 'noteheadParenthesisRight', {\n category: `noteHead.standard.noteheadParenthesisRight`,\n });\n }\n else if (this.position == Modifier.Position.LEFT) {\n Glyph.renderGlyph(ctx, x - 2, y, this.point, 'noteheadParenthesisLeft', {\n category: `noteHead.standard.noteheadParenthesisLeft`,\n });\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { BoundingBox } from './boundingbox';\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (NoteHead.DEBUG)\n log('Vex.Flow.NoteHead', args);\n}\n/**\n * Draw slashnote head manually. No glyph exists for this.\n * @param ctx the Canvas context\n * @param duration the duration of the note. ex: \"4\"\n * @param x the x coordinate to draw at\n * @param y the y coordinate to draw at\n * @param stem_direction the direction of the stem\n */\nfunction drawSlashNoteHead(ctx, duration, x, y, stem_direction, staveSpace) {\n const width = Tables.SLASH_NOTEHEAD_WIDTH;\n ctx.save();\n ctx.setLineWidth(Tables.STEM_WIDTH);\n let fill = false;\n if (Tables.durationToNumber(duration) > 2) {\n fill = true;\n }\n if (!fill)\n x -= (Tables.STEM_WIDTH / 2) * stem_direction;\n ctx.beginPath();\n ctx.moveTo(x, y + staveSpace);\n ctx.lineTo(x, y + 1);\n ctx.lineTo(x + width, y - staveSpace);\n ctx.lineTo(x + width, y);\n ctx.lineTo(x, y + staveSpace);\n ctx.closePath();\n if (fill) {\n ctx.fill();\n }\n else {\n ctx.stroke();\n }\n if (Tables.durationToFraction(duration).equals(0.5)) {\n const breve_lines = [-3, -1, width + 1, width + 3];\n for (let i = 0; i < breve_lines.length; i++) {\n ctx.beginPath();\n ctx.moveTo(x + breve_lines[i], y - 10);\n ctx.lineTo(x + breve_lines[i], y + 11);\n ctx.stroke();\n }\n }\n ctx.restore();\n}\n/**\n * `NoteHeads` are typically not manipulated\n * directly, but used internally in `StaveNote`.\n *\n * See `tests/notehead_tests.ts` for usage examples.\n */\nexport class NoteHead extends Note {\n constructor(noteStruct) {\n super(noteStruct);\n this.custom_glyph = false;\n this.stem_up_x_offset = 0;\n this.stem_down_x_offset = 0;\n this.index = noteStruct.index;\n this.x = noteStruct.x || 0;\n this.y = noteStruct.y || 0;\n if (noteStruct.note_type)\n this.noteType = noteStruct.note_type;\n this.displaced = noteStruct.displaced || false;\n this.stem_direction = noteStruct.stem_direction || Stem.UP;\n this.line = noteStruct.line || 0;\n // Get glyph code based on duration and note type. This could be\n // regular notes, rests, or other custom codes.\n this.glyph = Tables.getGlyphProps(this.duration, this.noteType);\n defined(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`);\n this.glyph_code = this.glyph.code_head;\n this.x_shift = noteStruct.x_shift || 0;\n if (noteStruct.custom_glyph_code) {\n this.custom_glyph = true;\n this.glyph_code = noteStruct.custom_glyph_code;\n this.stem_up_x_offset = noteStruct.stem_up_x_offset || 0;\n this.stem_down_x_offset = noteStruct.stem_down_x_offset || 0;\n }\n this.style = noteStruct.style;\n this.slashed = noteStruct.slashed || false;\n this.render_options = Object.assign(Object.assign({}, this.render_options), { \n // font size for note heads\n glyph_font_scale: noteStruct.glyph_font_scale || Tables.NOTATION_FONT_SCALE });\n this.setWidth(this.glyph.getWidth(this.render_options.glyph_font_scale));\n }\n static get CATEGORY() {\n return Category.NoteHead;\n }\n /** Get the width of the notehead. */\n getWidth() {\n return this.width;\n }\n /** Determine if the notehead is displaced. */\n isDisplaced() {\n return this.displaced === true;\n }\n /** Get the glyph data. */\n getGlyph() {\n return this.glyph;\n }\n /** Set the X coordinate. */\n setX(x) {\n this.x = x;\n return this;\n }\n /** Get the Y coordinate. */\n getY() {\n return this.y;\n }\n /** Set the Y coordinate. */\n setY(y) {\n this.y = y;\n return this;\n }\n /** Get the stave line the notehead is placed on. */\n getLine() {\n return this.line;\n }\n /** Set the stave line the notehead is placed on. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Get the canvas `x` coordinate position of the notehead. */\n getAbsoluteX() {\n // If the note has not been preformatted, then get the static x value\n // Otherwise, it's been formatted and we should use it's x value relative\n // to its tick context\n const x = !this.preFormatted ? this.x : super.getAbsoluteX();\n // For a more natural displaced notehead, we adjust the displacement amount\n // by half the stem width in order to maintain a slight overlap with the stem\n const displacementStemAdjustment = Stem.WIDTH / 2;\n const musicFont = Tables.currentMusicFont();\n const fontShift = musicFont.lookupMetric('notehead.shiftX', 0) * this.stem_direction;\n const displacedFontShift = musicFont.lookupMetric('noteHead.displaced.shiftX', 0) * this.stem_direction;\n return (x +\n fontShift +\n (this.displaced ? (this.width - displacementStemAdjustment) * this.stem_direction + displacedFontShift : 0));\n }\n /** Get the `BoundingBox` for the `NoteHead`. */\n getBoundingBox() {\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call getBoundingBox on an unformatted note.\");\n }\n const spacing = this.checkStave().getSpacingBetweenLines();\n const half_spacing = spacing / 2;\n const min_y = this.y - half_spacing;\n return new BoundingBox(this.getAbsoluteX(), min_y, this.width, spacing);\n }\n /** Set notehead to a provided `stave`. */\n setStave(stave) {\n const line = this.getLine();\n this.stave = stave;\n if (this.stave) {\n this.setY(this.stave.getYForNote(line));\n this.setContext(this.stave.getContext());\n }\n return this;\n }\n /** Pre-render formatting. */\n preFormat() {\n if (this.preFormatted)\n return this;\n const width = this.getWidth() + this.leftDisplacedHeadPx + this.rightDisplacedHeadPx;\n this.setWidth(width);\n this.preFormatted = true;\n return this;\n }\n /** Draw the notehead. */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n let head_x = this.getAbsoluteX();\n if (this.custom_glyph) {\n // head_x += this.x_shift;\n head_x += this.stem_direction === Stem.UP ? this.stem_up_x_offset : this.stem_down_x_offset;\n }\n const y = this.y;\n L(\"Drawing note head '\", this.noteType, this.duration, \"' at\", head_x, y);\n // Begin and end positions for head.\n const stem_direction = this.stem_direction;\n const glyph_font_scale = this.render_options.glyph_font_scale;\n if (this.style) {\n this.applyStyle(ctx);\n }\n const categorySuffix = `${this.glyph_code}Stem${stem_direction === Stem.UP ? 'Up' : 'Down'}`;\n if (this.noteType === 's') {\n const staveSpace = this.checkStave().getSpacingBetweenLines();\n drawSlashNoteHead(ctx, this.duration, head_x, y, stem_direction, staveSpace);\n }\n else {\n Glyph.renderGlyph(ctx, head_x, y, glyph_font_scale, this.glyph_code, {\n category: this.custom_glyph ? `noteHead.custom.${categorySuffix}` : `noteHead.standard.${categorySuffix}`,\n });\n }\n if (this.style) {\n this.restoreStyle(ctx);\n }\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.NoteHead.DEBUG` to `true`. */\nNoteHead.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// `StemmableNote` is an abstract interface for notes with optional stems.\n// Examples of stemmable notes are `StaveNote` and `TabNote`\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StemmableNote extends Note {\n constructor(noteStruct) {\n super(noteStruct);\n }\n static get CATEGORY() {\n return Category.StemmableNote;\n }\n // Get and set the note's `Stem`\n getStem() {\n return this.stem;\n }\n checkStem() {\n if (!this.stem) {\n throw new RuntimeError('NoStem', 'No stem attached to instance');\n }\n return this.stem;\n }\n setStem(stem) {\n this.stem = stem;\n return this;\n }\n // Builds and sets a new stem\n buildStem() {\n const stem = new Stem();\n this.setStem(stem);\n return this;\n }\n buildFlag(category = 'flag') {\n const { glyph } = this;\n if (this.hasFlag()) {\n const flagCode = this.getStemDirection() === Stem.DOWN ? glyph.code_flag_downstem : glyph.code_flag_upstem;\n this.flag = new Glyph(flagCode, this.render_options.glyph_font_scale, { category });\n }\n }\n // Get the custom glyph associated with the outer note head on the base of the stem.\n getBaseCustomNoteHeadGlyph() {\n if (this.getStemDirection() === Stem.DOWN) {\n return this.customGlyphs[this.customGlyphs.length - 1];\n }\n else {\n return this.customGlyphs[0];\n }\n }\n // Get the full length of stem\n getStemLength() {\n return Stem.HEIGHT + this.getStemExtension();\n }\n // Get the number of beams for this duration\n getBeamCount() {\n const glyph = this.getGlyph();\n if (glyph) {\n return glyph.beam_count;\n }\n else {\n return 0;\n }\n }\n // Get the minimum length of stem\n getStemMinimumLength() {\n const frac = Tables.durationToFraction(this.duration);\n let length = frac.value() <= 1 ? 0 : 20;\n // if note is flagged, cannot shorten beam\n switch (this.duration) {\n case '8':\n if (this.beam == undefined)\n length = 35;\n break;\n case '16':\n length = this.beam == undefined ? 35 : 25;\n break;\n case '32':\n length = this.beam == undefined ? 45 : 35;\n break;\n case '64':\n length = this.beam == undefined ? 50 : 40;\n break;\n case '128':\n length = this.beam == undefined ? 55 : 45;\n break;\n default:\n break;\n }\n return length;\n }\n // Get/set the direction of the stem\n getStemDirection() {\n if (!this.stem_direction)\n throw new RuntimeError('NoStem', 'No stem attached to this note.');\n return this.stem_direction;\n }\n setStemDirection(direction) {\n if (!direction)\n direction = Stem.UP;\n if (direction !== Stem.UP && direction !== Stem.DOWN) {\n throw new RuntimeError('BadArgument', `Invalid stem direction: ${direction}`);\n }\n this.stem_direction = direction;\n // Reset and reformat everything. Flag has to be built before calling getStemExtension.\n this.reset();\n if (this.hasFlag()) {\n this.buildFlag();\n }\n this.beam = undefined;\n if (this.stem) {\n this.stem.setDirection(direction);\n this.stem.setExtension(this.getStemExtension());\n // Lookup the base custom notehead (closest to the base of the stem) to extend or shorten\n // the stem appropriately. If there's no custom note head, lookup the standard notehead.\n const glyph = this.getBaseCustomNoteHeadGlyph() || this.getGlyph();\n // Get the font-specific customizations for the note heads.\n const offsets = Tables.currentMusicFont().lookupMetric(`stem.noteHead.${glyph.code_head}`, {\n offsetYBaseStemUp: 0,\n offsetYTopStemUp: 0,\n offsetYBaseStemDown: 0,\n offsetYTopStemDown: 0,\n });\n // Configure the stem to use these offsets.\n this.stem.setOptions({\n stem_up_y_offset: offsets.offsetYTopStemUp,\n stem_down_y_offset: offsets.offsetYTopStemDown,\n stem_up_y_base_offset: offsets.offsetYBaseStemUp,\n stem_down_y_base_offset: offsets.offsetYBaseStemDown, // glyph.stem_down_y_base_offset,\n });\n }\n if (this.preFormatted) {\n this.preFormat();\n }\n return this;\n }\n // Get the `x` coordinate of the stem\n getStemX() {\n const x_begin = this.getAbsoluteX() + this.x_shift;\n const x_end = this.getAbsoluteX() + this.x_shift + this.getGlyphWidth();\n const stem_x = this.stem_direction === Stem.DOWN ? x_begin : x_end;\n return stem_x;\n }\n // Get the `x` coordinate for the center of the glyph.\n // Used for `TabNote` stems and stemlets over rests\n getCenterGlyphX() {\n return this.getAbsoluteX() + this.x_shift + this.getGlyphWidth() / 2;\n }\n // Get the stem extension for the current duration\n getStemExtension() {\n const glyph = this.getGlyph();\n if (this.stem_extension_override != undefined) {\n return this.stem_extension_override;\n }\n // Use stem_beam_extension with beams\n if (this.beam) {\n return glyph.stem_beam_extension;\n }\n const flagCode = this.getStemDirection() === Stem.DOWN ? this.glyph.code_flag_downstem : this.glyph.code_flag_upstem;\n return Math.abs(Tables.currentMusicFont().lookupMetric(`glyphs.flag.${flagCode}.shiftY`, 0));\n }\n // Set the stem length to a specific. Will override the default length.\n setStemLength(height) {\n this.stem_extension_override = height - Stem.HEIGHT;\n return this;\n }\n // Get the top and bottom `y` values of the stem.\n getStemExtents() {\n if (!this.stem)\n throw new RuntimeError('NoStem', 'No stem attached to this note.');\n return this.stem.getExtents();\n }\n /** Gets the `y` value for the top modifiers at a specific `textLine`. */\n getYForTopText(textLine) {\n const stave = this.checkStave();\n if (this.hasStem()) {\n const extents = this.getStemExtents();\n if (!extents)\n throw new RuntimeError('InvalidState', 'Stem does not have extents.');\n return Math.min(stave.getYForTopText(textLine), extents.topY - this.render_options.annotation_spacing * (textLine + 1));\n }\n else {\n return stave.getYForTopText(textLine);\n }\n }\n /** Gets the `y` value for the bottom modifiers at a specific `textLine`. */\n getYForBottomText(textLine) {\n const stave = this.checkStave();\n if (this.hasStem()) {\n const extents = this.getStemExtents();\n if (!extents)\n throw new RuntimeError('InvalidState', 'Stem does not have extents.');\n return Math.max(stave.getYForTopText(textLine), extents.baseY + this.render_options.annotation_spacing * textLine);\n }\n else {\n return stave.getYForBottomText(textLine);\n }\n }\n hasFlag() {\n return Tables.getGlyphProps(this.duration).flag && !this.beam;\n }\n /** Post formats the note. */\n postFormat() {\n var _a;\n (_a = this.beam) === null || _a === void 0 ? void 0 : _a.postFormat();\n this.postFormatted = true;\n return this;\n }\n /** Renders the stem onto the canvas. */\n drawStem(stemOptions) {\n var _a;\n this.checkContext();\n this.setRendered();\n this.setStem(new Stem(stemOptions));\n (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setContext(this.getContext()).draw();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// This file implements notes for standard notation. This consists of one or\n// more `NoteHeads`, an optional stem, and an optional flag.\n//\n// Throughout these comments, a \"note\" refers to the entire `StaveNote`,\n// and a \"key\" refers to a specific pitch/notehead within a note.\n//\n// See `tests/stavenote_tests.ts` for usage examples.\nimport { BoundingBox } from './boundingbox';\nimport { Modifier } from './modifier';\nimport { NoteHead } from './notehead';\nimport { Stem } from './stem';\nimport { StemmableNote } from './stemmablenote';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, log, midLine, RuntimeError, warn } from './util';\nfunction showDeprecationWarningForNoteHeads() {\n // eslint-disable-next-line\n console.warn('StaveNote.note_heads is deprecated. Use StaveNote.noteHeads instead.', 'This accessor will be removed in VexFlow 5.0.');\n}\n// To enable logging for this class. Set `Vex.Flow.StaveNote.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (StaveNote.DEBUG)\n log('Vex.Flow.StaveNote', args);\n}\nconst isInnerNoteIndex = (note, index) => index === (note.getStemDirection() === Stem.UP ? note.keyProps.length - 1 : 0);\n// Helper methods for rest positioning in ModifierContext.\nfunction shiftRestVertical(rest, note, dir) {\n const delta = dir;\n rest.line += delta;\n rest.maxLine += delta;\n rest.minLine += delta;\n rest.note.setKeyLine(0, rest.note.getKeyLine(0) + delta);\n}\n// Called from formatNotes :: center a rest between two notes\nfunction centerRest(rest, noteU, noteL) {\n const delta = rest.line - midLine(noteU.minLine, noteL.maxLine);\n rest.note.setKeyLine(0, rest.note.getKeyLine(0) - delta);\n rest.line -= delta;\n rest.maxLine -= delta;\n rest.minLine -= delta;\n}\nexport class StaveNote extends StemmableNote {\n constructor(noteStruct) {\n var _a, _b, _c;\n super(noteStruct);\n //////////////////////////////////////////////////////////////////////////////////////////////////\n // INSTANCE MEMBERS\n this.minLine = 0;\n this.maxLine = 0;\n this.ledgerLineStyle = {};\n this.clef = (_a = noteStruct.clef) !== null && _a !== void 0 ? _a : 'treble';\n this.octave_shift = (_b = noteStruct.octave_shift) !== null && _b !== void 0 ? _b : 0;\n // Pull note rendering properties.\n this.glyph = Tables.getGlyphProps(this.duration, this.noteType);\n defined(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`);\n // if true, displace note to right\n this.displaced = false;\n this.dot_shiftY = 0;\n // for displaced ledger lines\n this.use_default_head_x = false;\n // Drawing\n this._noteHeads = [];\n this.modifiers = [];\n this.render_options = Object.assign(Object.assign({}, this.render_options), { \n // font size for note heads and rests\n glyph_font_scale: noteStruct.glyph_font_scale || Tables.NOTATION_FONT_SCALE, \n // number of stroke px to the left and right of head\n stroke_px: noteStruct.stroke_px || StaveNote.LEDGER_LINE_OFFSET });\n this.calculateKeyProps();\n this.buildStem();\n // Set the stem direction\n if (noteStruct.auto_stem) {\n this.autoStem();\n }\n else {\n this.setStemDirection((_c = noteStruct.stem_direction) !== null && _c !== void 0 ? _c : Stem.UP);\n }\n this.reset();\n this.buildFlag();\n }\n static get CATEGORY() {\n return Category.StaveNote;\n }\n /**\n * @deprecated Use Stem.UP.\n */\n static get STEM_UP() {\n return Stem.UP;\n }\n /**\n * @deprecated Use Stem.DOWN.\n */\n static get STEM_DOWN() {\n return Stem.DOWN;\n }\n static get LEDGER_LINE_OFFSET() {\n return 3;\n }\n static get minNoteheadPadding() {\n const musicFont = Tables.currentMusicFont();\n return musicFont.lookupMetric('glyphs.noteHead.minPadding');\n }\n /** Format notes inside a ModifierContext. */\n static format(notes, state) {\n if (!notes || notes.length < 2)\n return false;\n const notesList = [];\n for (let i = 0; i < notes.length; i++) {\n const props = notes[i].getKeyProps();\n const line = props[0].line;\n let minL = props[props.length - 1].line;\n const stemDirection = notes[i].getStemDirection();\n const stemMax = notes[i].getStemLength() / 10;\n const stemMin = notes[i].getStemMinimumLength() / 10;\n let maxL;\n if (notes[i].isRest()) {\n maxL = line + notes[i].glyph.line_above;\n minL = line - notes[i].glyph.line_below;\n }\n else {\n maxL = stemDirection === 1 ? props[props.length - 1].line + stemMax : props[props.length - 1].line;\n minL = stemDirection === 1 ? props[0].line : props[0].line - stemMax;\n }\n notesList.push({\n line: props[0].line,\n maxLine: maxL,\n minLine: minL,\n isrest: notes[i].isRest(),\n stemDirection: stemDirection,\n stemMax,\n stemMin,\n voice_shift: notes[i].getVoiceShiftWidth(),\n is_displaced: notes[i].isDisplaced(),\n note: notes[i],\n });\n }\n const voices = notesList.length;\n let noteU = notesList[0];\n const noteM = voices > 2 ? notesList[1] : undefined;\n let noteL = voices > 2 ? notesList[2] : notesList[1];\n // for two voice backward compatibility, ensure upper voice is stems up\n // for three voices, the voices must be in order (upper, middle, lower)\n if (voices === 2 && noteU.stemDirection === -1 && noteL.stemDirection === 1) {\n noteU = notesList[1];\n noteL = notesList[0];\n }\n const voiceXShift = Math.max(noteU.voice_shift, noteL.voice_shift);\n let xShift = 0;\n // Test for two voice note intersection\n if (voices === 2) {\n const lineSpacing = noteU.stemDirection === noteL.stemDirection ? 0.0 : 0.5;\n if (noteU.minLine <= noteL.maxLine + lineSpacing) {\n if (noteU.isrest) {\n // shift rest up\n shiftRestVertical(noteU, noteL, 1);\n }\n else if (noteL.isrest) {\n // shift rest down\n shiftRestVertical(noteL, noteU, -1);\n }\n else if (noteU.stemDirection === noteL.stemDirection) {\n // upper voice is middle voice, so shift it right\n xShift = voiceXShift + 2;\n noteU.note.setXShift(xShift);\n }\n else {\n // shift lower voice right\n xShift = voiceXShift + 2;\n noteL.note.setXShift(xShift);\n }\n }\n // format complete\n state.right_shift += xShift;\n return true;\n }\n if (!noteM)\n throw new RuntimeError('InvalidState', 'noteM not defined.');\n // For three voices, test if rests can be repositioned\n //\n // Special case 1 :: middle voice rest between two notes\n //\n if (noteM.isrest && !noteU.isrest && !noteL.isrest) {\n if (noteU.minLine <= noteM.maxLine || noteM.minLine <= noteL.maxLine) {\n const restHeight = noteM.maxLine - noteM.minLine;\n const space = noteU.minLine - noteL.maxLine;\n if (restHeight < space) {\n // center middle voice rest between the upper and lower voices\n centerRest(noteM, noteU, noteL);\n }\n else {\n xShift = voiceXShift + 2; // shift middle rest right\n noteM.note.setXShift(xShift);\n if (noteL.note.hasBeam() === false) {\n noteL.stemDirection = -1;\n noteL.note.setStemDirection(-1);\n }\n if (noteU.minLine <= noteL.maxLine && noteU.note.hasBeam() === false) {\n noteU.stemDirection = 1;\n noteU.note.setStemDirection(1);\n }\n }\n // format complete\n state.right_shift += xShift;\n return true;\n }\n }\n // Special case 2 :: all voices are rests\n if (noteU.isrest && noteM.isrest && noteL.isrest) {\n // Shift upper voice rest up\n shiftRestVertical(noteU, noteM, 1);\n // Shift lower voice rest down\n shiftRestVertical(noteL, noteM, -1);\n // format complete\n state.right_shift += xShift;\n return true;\n }\n // Test if any other rests can be repositioned\n if (noteM.isrest && noteU.isrest && noteM.minLine <= noteL.maxLine) {\n // Shift middle voice rest up\n shiftRestVertical(noteM, noteL, 1);\n }\n if (noteM.isrest && noteL.isrest && noteU.minLine <= noteM.maxLine) {\n // Shift middle voice rest down\n shiftRestVertical(noteM, noteU, -1);\n }\n if (noteU.isrest && noteU.minLine <= noteM.maxLine) {\n // shift upper voice rest up;\n shiftRestVertical(noteU, noteM, 1);\n }\n if (noteL.isrest && noteM.minLine <= noteL.maxLine) {\n // shift lower voice rest down\n shiftRestVertical(noteL, noteM, -1);\n }\n // If middle voice intersects upper or lower voice\n if (noteU.minLine <= noteM.maxLine + 0.5 || noteM.minLine <= noteL.maxLine) {\n // shift middle note right\n xShift = voiceXShift + 2;\n noteM.note.setXShift(xShift);\n if (noteL.note.hasBeam() === false) {\n noteL.stemDirection = -1;\n noteL.note.setStemDirection(-1);\n }\n if (noteU.minLine <= noteL.maxLine && noteU.note.hasBeam() === false) {\n noteU.stemDirection = 1;\n noteU.note.setStemDirection(1);\n }\n }\n state.right_shift += xShift;\n return true;\n }\n static postFormat(notes) {\n if (!notes)\n return false;\n notes.forEach((note) => note.postFormat());\n return true;\n }\n reset() {\n super.reset();\n // Save prior noteHead styles & reapply them after making new noteheads.\n const noteHeadStyles = this._noteHeads.map((noteHead) => noteHead.getStyle());\n this.buildNoteHeads();\n this._noteHeads.forEach((noteHead, index) => {\n const noteHeadStyle = noteHeadStyles[index];\n if (noteHeadStyle)\n noteHead.setStyle(noteHeadStyle);\n });\n const stave = this.stave;\n if (stave) {\n this._noteHeads.forEach((head) => head.setStave(stave));\n }\n this.calcNoteDisplacements();\n return this;\n }\n setBeam(beam) {\n this.beam = beam;\n this.calcNoteDisplacements();\n // Update stem extension is a beam is assigned.\n if (this.stem) {\n this.stem.setExtension(this.getStemExtension());\n }\n return this;\n }\n // Builds a `Stem` for the note\n buildStem() {\n this.setStem(new Stem({ hide: !!this.isRest() }));\n return this;\n }\n // Builds a `NoteHead` for each key in the note\n buildNoteHeads() {\n this._noteHeads = [];\n const stemDirection = this.getStemDirection();\n const keys = this.getKeys();\n let lastLine = undefined;\n let lineDiff = undefined;\n let displaced = false;\n // Draw notes from bottom to top.\n // For down-stem notes, we draw from top to bottom.\n let start;\n let end;\n let step;\n if (stemDirection === Stem.UP) {\n start = 0;\n end = keys.length;\n step = 1;\n }\n else {\n start = keys.length - 1;\n end = -1;\n step = -1;\n }\n for (let i = start; i !== end; i += step) {\n const noteProps = this.keyProps[i];\n const line = noteProps.line;\n // Keep track of last line with a note head, so that consecutive heads\n // are correctly displaced.\n if (lastLine === undefined) {\n lastLine = line;\n }\n else {\n lineDiff = Math.abs(lastLine - line);\n if (lineDiff === 0 || lineDiff === 0.5) {\n displaced = !displaced;\n }\n else {\n displaced = false;\n this.use_default_head_x = true;\n }\n }\n lastLine = line;\n const notehead = new NoteHead({\n duration: this.duration,\n note_type: this.noteType,\n displaced,\n stem_direction: stemDirection,\n custom_glyph_code: noteProps.code,\n glyph_font_scale: this.render_options.glyph_font_scale,\n x_shift: noteProps.shift_right,\n stem_up_x_offset: noteProps.stem_up_x_offset,\n stem_down_x_offset: noteProps.stem_down_x_offset,\n line: noteProps.line,\n });\n this._noteHeads[i] = notehead;\n }\n }\n // Automatically sets the stem direction based on the keys in the note\n autoStem() {\n this.setStemDirection(this.calculateOptimalStemDirection());\n }\n calculateOptimalStemDirection() {\n // Figure out optimal stem direction based on given notes\n this.minLine = this.keyProps[0].line;\n this.maxLine = this.keyProps[this.keyProps.length - 1].line;\n const MIDDLE_LINE = 3;\n const decider = (this.minLine + this.maxLine) / 2;\n const stemDirection = decider < MIDDLE_LINE ? Stem.UP : Stem.DOWN;\n return stemDirection;\n }\n // Calculates and stores the properties for each key in the note\n calculateKeyProps() {\n let lastLine;\n for (let i = 0; i < this.keys.length; ++i) {\n const key = this.keys[i];\n // All rests use the same position on the line.\n // if (this.glyph.rest) key = this.glyph.position;\n if (this.glyph.rest)\n this.glyph.position = key;\n const options = { octave_shift: this.octave_shift || 0 };\n const props = Tables.keyProperties(key, this.clef, options);\n if (!props) {\n throw new RuntimeError('BadArguments', `Invalid key for note properties: ${key}`);\n }\n // Override line placement for default rests\n if (props.key === 'R') {\n if (this.duration === '1' || this.duration === 'w') {\n props.line = 4;\n }\n else {\n props.line = 3;\n }\n }\n // Calculate displacement of this note\n const line = props.line;\n if (lastLine == undefined) {\n lastLine = line;\n }\n else {\n if (Math.abs(lastLine - line) === 0.5) {\n this.displaced = true;\n props.displaced = true;\n // Have to mark the previous note as\n // displaced as well, for modifier placement\n if (this.keyProps.length > 0) {\n this.keyProps[i - 1].displaced = true;\n }\n }\n }\n lastLine = line;\n this.keyProps.push(props);\n }\n // Sort the notes from lowest line to highest line\n lastLine = undefined;\n this.keyProps.forEach((key) => {\n if (lastLine && key.line < lastLine) {\n warn('Unsorted keys in note will be sorted. ' + 'See https://github.com/0xfe/vexflow/issues/104 for details.');\n }\n lastLine = key.line;\n });\n this.keyProps.sort((a, b) => a.line - b.line);\n }\n // Get the `BoundingBox` for the entire note\n getBoundingBox() {\n var _a, _b;\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call getBoundingBox on an unformatted note.\");\n }\n const { width: w, modLeftPx, leftDisplacedHeadPx } = this.getMetrics();\n const x = this.getAbsoluteX() - modLeftPx - leftDisplacedHeadPx;\n let minY = 0;\n let maxY = 0;\n const halfLineSpacing = ((_b = (_a = this.getStave()) === null || _a === void 0 ? void 0 : _a.getSpacingBetweenLines()) !== null && _b !== void 0 ? _b : 0) / 2;\n const lineSpacing = halfLineSpacing * 2;\n if (this.isRest()) {\n const y = this.ys[0];\n const frac = Tables.durationToFraction(this.duration);\n if (frac.equals(1) || frac.equals(2)) {\n minY = y - halfLineSpacing;\n maxY = y + halfLineSpacing;\n }\n else {\n minY = y - this.glyph.line_above * lineSpacing;\n maxY = y + this.glyph.line_below * lineSpacing;\n }\n }\n else if (this.glyph.stem) {\n const ys = this.getStemExtents();\n ys.baseY += halfLineSpacing * this.getStemDirection();\n minY = Math.min(ys.topY, ys.baseY);\n maxY = Math.max(ys.topY, ys.baseY);\n }\n else {\n minY = 0;\n maxY = 0;\n for (let i = 0; i < this.ys.length; ++i) {\n const yy = this.ys[i];\n if (i === 0) {\n minY = yy;\n maxY = yy;\n }\n else {\n minY = Math.min(yy, minY);\n maxY = Math.max(yy, maxY);\n }\n }\n minY -= halfLineSpacing;\n maxY += halfLineSpacing;\n }\n return new BoundingBox(x, minY, w, maxY - minY);\n }\n // Gets the line number of the bottom note in the chord.\n // If `isTopNote` is `true` then get the top note's line number instead\n getLineNumber(isTopNote) {\n if (!this.keyProps.length) {\n throw new RuntimeError('NoKeyProps', \"Can't get bottom note line, because note is not initialized properly.\");\n }\n let resultLine = this.keyProps[0].line;\n // No precondition assumed for sortedness of keyProps array\n for (let i = 0; i < this.keyProps.length; i++) {\n const thisLine = this.keyProps[i].line;\n if (isTopNote) {\n if (thisLine > resultLine)\n resultLine = thisLine;\n }\n else {\n if (thisLine < resultLine)\n resultLine = thisLine;\n }\n }\n return resultLine;\n }\n /**\n * @returns true if this note is a type of rest. Rests don't have pitches, but take up space in the score.\n */\n isRest() {\n return this.glyph.rest;\n }\n // Determine if the current note is a chord\n isChord() {\n return !this.isRest() && this.keys.length > 1;\n }\n // Determine if the `StaveNote` has a stem\n hasStem() {\n return this.glyph.stem;\n }\n hasFlag() {\n return super.hasFlag() && !this.isRest();\n }\n getStemX() {\n if (this.noteType === 'r') {\n return this.getCenterGlyphX();\n }\n else {\n // We adjust the origin of the stem because we want the stem left-aligned\n // with the notehead if stemmed-down, and right-aligned if stemmed-up\n return super.getStemX() + (this.stem_direction ? Stem.WIDTH / (2 * -this.stem_direction) : 0);\n }\n }\n // Get the `y` coordinate for text placed on the top/bottom of a\n // note at a desired `text_line`\n getYForTopText(textLine) {\n const extents = this.getStemExtents();\n return Math.min(this.checkStave().getYForTopText(textLine), extents.topY - this.render_options.annotation_spacing * (textLine + 1));\n }\n getYForBottomText(textLine) {\n const extents = this.getStemExtents();\n return Math.max(this.checkStave().getYForTopText(textLine), extents.baseY + this.render_options.annotation_spacing * textLine);\n }\n // Sets the current note to the provided `stave`. This applies\n // `y` values to the `NoteHeads`.\n setStave(stave) {\n super.setStave(stave);\n const ys = this._noteHeads.map((notehead) => {\n notehead.setStave(stave);\n return notehead.getY();\n });\n this.setYs(ys);\n if (this.stem) {\n const { y_top, y_bottom } = this.getNoteHeadBounds();\n this.stem.setYBounds(y_top, y_bottom);\n }\n return this;\n }\n // Check if note is shifted to the right\n isDisplaced() {\n return this.displaced;\n }\n // Sets whether shift note to the right. `displaced` is a `boolean`\n setNoteDisplaced(displaced) {\n this.displaced = displaced;\n return this;\n }\n // Get the starting `x` coordinate for a `StaveTie`\n getTieRightX() {\n let tieStartX = this.getAbsoluteX();\n tieStartX += this.getGlyphWidth() + this.x_shift + this.rightDisplacedHeadPx;\n if (this.modifierContext)\n tieStartX += this.modifierContext.getRightShift();\n return tieStartX;\n }\n // Get the ending `x` coordinate for a `StaveTie`\n getTieLeftX() {\n let tieEndX = this.getAbsoluteX();\n tieEndX += this.x_shift - this.leftDisplacedHeadPx;\n return tieEndX;\n }\n // Get the stave line on which to place a rest\n getLineForRest() {\n let restLine = this.keyProps[0].line;\n if (this.keyProps.length > 1) {\n const lastLine = this.keyProps[this.keyProps.length - 1].line;\n const top = Math.max(restLine, lastLine);\n const bot = Math.min(restLine, lastLine);\n restLine = midLine(top, bot);\n }\n return restLine;\n }\n // Get the default `x` and `y` coordinates for the provided `position`\n // and key `index`\n getModifierStartXY(position, index, options = {}) {\n var _a, _b;\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call GetModifierStartXY on an unformatted note\");\n }\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', 'No Y-Values calculated for this note.');\n }\n const { ABOVE, BELOW, LEFT, RIGHT } = Modifier.Position;\n let x = 0;\n if (position === LEFT) {\n // FIXME: Left modifier padding, move to font file\n x = -1 * 2;\n }\n else if (position === RIGHT) {\n // FIXME: Right modifier padding, move to font file\n x = this.getGlyphWidth() + this.x_shift + 2;\n if (this.stem_direction === Stem.UP &&\n this.hasFlag() &&\n (options.forceFlagRight || isInnerNoteIndex(this, index))) {\n x += (_b = (_a = this === null || this === void 0 ? void 0 : this.flag) === null || _a === void 0 ? void 0 : _a.getMetrics().width) !== null && _b !== void 0 ? _b : 0;\n }\n }\n else if (position === BELOW || position === ABOVE) {\n x = this.getGlyphWidth() / 2;\n }\n return {\n x: this.getAbsoluteX() + x,\n y: this.ys[index],\n };\n }\n // Sets the style of the complete StaveNote, including all keys\n // and the stem.\n setStyle(style) {\n var _a;\n super.setStyle(style);\n this._noteHeads.forEach((notehead) => notehead.setStyle(style));\n (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setStyle(style);\n return this;\n }\n setStemStyle(style) {\n const stem = this.getStem();\n stem === null || stem === void 0 ? void 0 : stem.setStyle(style);\n return this;\n }\n getStemStyle() {\n var _a;\n return (_a = this.stem) === null || _a === void 0 ? void 0 : _a.getStyle();\n }\n setLedgerLineStyle(style) {\n this.ledgerLineStyle = style;\n }\n getLedgerLineStyle() {\n return this.ledgerLineStyle;\n }\n setFlagStyle(style) {\n this.flagStyle = style;\n }\n getFlagStyle() {\n return this.flagStyle;\n }\n // Sets the notehead at `index` to the provided coloring `style`.\n //\n // `style` is an `object` with the following properties: `shadowColor`,\n // `shadowBlur`, `fillStyle`, `strokeStyle`\n setKeyStyle(index, style) {\n this._noteHeads[index].setStyle(style);\n return this;\n }\n setKeyLine(index, line) {\n this.keyProps[index].line = line;\n this.reset();\n return this;\n }\n getKeyLine(index) {\n return this.keyProps[index].line;\n }\n // Get the width of the note if it is displaced. Used for `Voice`\n // formatting\n getVoiceShiftWidth() {\n // TODO: may need to accomodate for dot here.\n return this.getGlyphWidth() * (this.displaced ? 2 : 1);\n }\n // Calculates and sets the extra pixels to the left or right\n // if the note is displaced.\n calcNoteDisplacements() {\n this.setLeftDisplacedHeadPx(this.displaced && this.stem_direction === Stem.DOWN ? this.getGlyphWidth() : 0);\n // For upstems with flags, the extra space is unnecessary, since it's taken\n // up by the flag.\n this.setRightDisplacedHeadPx(!this.hasFlag() && this.displaced && this.stem_direction === Stem.UP ? this.getGlyphWidth() : 0);\n }\n // Pre-render formatting\n preFormat() {\n if (this.preFormatted)\n return;\n let noteHeadPadding = 0;\n if (this.modifierContext) {\n this.modifierContext.preFormat();\n // If there are no modifiers on this note, make sure there is adequate padding\n // between the notes.\n if (this.modifierContext.getWidth() === 0) {\n noteHeadPadding = StaveNote.minNoteheadPadding;\n }\n }\n let width = this.getGlyphWidth() + this.leftDisplacedHeadPx + this.rightDisplacedHeadPx + noteHeadPadding;\n // For upward flagged notes, the width of the flag needs to be added\n if (this.shouldDrawFlag() && this.stem_direction === Stem.UP) {\n width += this.getGlyphWidth();\n // TODO: Add flag width as a separate metric\n }\n this.setWidth(width);\n this.preFormatted = true;\n }\n /**\n * @typedef {Object} noteHeadBounds\n * @property {number} y_top the highest notehead bound\n * @property {number} y_bottom the lowest notehead bound\n * @property {number|Null} displaced_x the starting x for displaced noteheads\n * @property {number|Null} non_displaced_x the starting x for non-displaced noteheads\n * @property {number} highest_line the highest notehead line in traditional music line\n * numbering (bottom line = 1, top line = 5)\n * @property {number} lowest_line the lowest notehead line\n * @property {number|false} highest_displaced_line the highest staff line number\n * for a displaced notehead\n * @property {number|false} lowest_displaced_line\n * @property {number} highest_non_displaced_line\n * @property {number} lowest_non_displaced_line\n */\n /**\n * Get the staff line and y value for the highest & lowest noteheads\n * @returns {noteHeadBounds}\n */\n getNoteHeadBounds() {\n // Top and bottom Y values for stem.\n let yTop = +Infinity;\n let yBottom = -Infinity;\n let nonDisplacedX;\n let displacedX;\n let highestLine = this.checkStave().getNumLines();\n let lowestLine = 1;\n let highestDisplacedLine;\n let lowestDisplacedLine;\n let highestNonDisplacedLine = highestLine;\n let lowestNonDisplacedLine = lowestLine;\n this._noteHeads.forEach((notehead) => {\n const line = notehead.getLine();\n const y = notehead.getY();\n yTop = Math.min(y, yTop);\n yBottom = Math.max(y, yBottom);\n if (displacedX === undefined && notehead.isDisplaced()) {\n displacedX = notehead.getAbsoluteX();\n }\n if (nonDisplacedX === undefined && !notehead.isDisplaced()) {\n nonDisplacedX = notehead.getAbsoluteX();\n }\n highestLine = Math.max(line, highestLine);\n lowestLine = Math.min(line, lowestLine);\n if (notehead.isDisplaced()) {\n highestDisplacedLine = highestDisplacedLine === undefined ? line : Math.max(line, highestDisplacedLine);\n lowestDisplacedLine = lowestDisplacedLine === undefined ? line : Math.min(line, lowestDisplacedLine);\n }\n else {\n highestNonDisplacedLine = Math.max(line, highestNonDisplacedLine);\n lowestNonDisplacedLine = Math.min(line, lowestNonDisplacedLine);\n }\n }, this);\n return {\n y_top: yTop,\n y_bottom: yBottom,\n displaced_x: displacedX,\n non_displaced_x: nonDisplacedX,\n highest_line: highestLine,\n lowest_line: lowestLine,\n highest_displaced_line: highestDisplacedLine,\n lowest_displaced_line: lowestDisplacedLine,\n highest_non_displaced_line: highestNonDisplacedLine,\n lowest_non_displaced_line: lowestNonDisplacedLine,\n };\n }\n // Get the starting `x` coordinate for the noteheads\n getNoteHeadBeginX() {\n return this.getAbsoluteX() + this.x_shift;\n }\n // Get the ending `x` coordinate for the noteheads\n getNoteHeadEndX() {\n const xBegin = this.getNoteHeadBeginX();\n return xBegin + this.getGlyphWidth();\n }\n get noteHeads() {\n return this._noteHeads.slice();\n }\n /** @deprecated use StaveNote.noteHeads instead. */\n get note_heads() {\n showDeprecationWarningForNoteHeads();\n return this.noteHeads;\n }\n // Draw the ledger lines between the stave and the highest/lowest keys\n drawLedgerLines() {\n const stave = this.checkStave();\n const { glyph, render_options: { stroke_px }, } = this;\n const ctx = this.checkContext();\n const width = glyph.getWidth() + stroke_px * 2;\n const doubleWidth = 2 * (glyph.getWidth() + stroke_px) - Stem.WIDTH / 2;\n if (this.isRest())\n return;\n if (!ctx) {\n throw new RuntimeError('NoCanvasContext', \"Can't draw without a canvas context.\");\n }\n const { highest_line, lowest_line, highest_displaced_line, highest_non_displaced_line, lowest_displaced_line, lowest_non_displaced_line, displaced_x, non_displaced_x, } = this.getNoteHeadBounds();\n // Early out if there are no ledger lines to draw.\n if (highest_line < 6 && lowest_line > 0)\n return;\n const min_x = Math.min(displaced_x !== null && displaced_x !== void 0 ? displaced_x : 0, non_displaced_x !== null && non_displaced_x !== void 0 ? non_displaced_x : 0);\n const drawLedgerLine = (y, normal, displaced) => {\n let x;\n if (displaced && normal)\n x = min_x - stroke_px;\n else if (normal)\n x = (non_displaced_x !== null && non_displaced_x !== void 0 ? non_displaced_x : 0) - stroke_px;\n else\n x = (displaced_x !== null && displaced_x !== void 0 ? displaced_x : 0) - stroke_px;\n const ledgerWidth = normal && displaced ? doubleWidth : width;\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(x + ledgerWidth, y);\n ctx.stroke();\n };\n const style = Object.assign(Object.assign({}, stave.getDefaultLedgerLineStyle()), this.getLedgerLineStyle());\n this.applyStyle(ctx, style);\n // Draw ledger lines below the staff:\n for (let line = 6; line <= highest_line; ++line) {\n const normal = non_displaced_x !== undefined && line <= highest_non_displaced_line;\n const displaced = highest_displaced_line !== undefined && line <= highest_displaced_line;\n drawLedgerLine(stave.getYForNote(line), normal, displaced);\n }\n // Draw ledger lines above the staff:\n for (let line = 0; line >= lowest_line; --line) {\n const normal = non_displaced_x !== undefined && line >= lowest_non_displaced_line;\n const displaced = lowest_displaced_line !== undefined && line >= lowest_displaced_line;\n drawLedgerLine(stave.getYForNote(line), normal, displaced);\n }\n this.restoreStyle(ctx, style);\n }\n // Draw all key modifiers\n drawModifiers() {\n const ctx = this.checkContext();\n ctx.openGroup('modifiers');\n for (let i = 0; i < this.modifiers.length; i++) {\n const modifier = this.modifiers[i];\n const index = modifier.checkIndex();\n const notehead = this._noteHeads[index];\n const noteheadStyle = notehead.getStyle();\n notehead.applyStyle(ctx, noteheadStyle);\n modifier.setContext(ctx);\n modifier.drawWithStyle();\n notehead.restoreStyle(ctx, noteheadStyle);\n }\n ctx.closeGroup();\n }\n shouldDrawFlag() {\n const hasStem = this.stem !== undefined;\n const hasFlag = this.glyph.flag; // specified in tables.js\n const hasNoBeam = this.beam === undefined;\n return hasStem && hasFlag && hasNoBeam;\n }\n // Draw the flag for the note\n drawFlag() {\n var _a;\n const ctx = this.checkContext();\n if (!ctx) {\n throw new RuntimeError('NoCanvasContext', \"Can't draw without a canvas context.\");\n }\n if (this.shouldDrawFlag()) {\n const { y_top, y_bottom } = this.getNoteHeadBounds();\n // eslint-disable-next-line\n const noteStemHeight = this.stem.getHeight();\n const flagX = this.getStemX();\n // FIXME: What's with the magic +/- 2\n // ANSWER: a corner of the note stem pokes out beyond the tip of the flag.\n // The extra +/- 2 pushes the flag glyph outward so it covers the stem entirely.\n // Alternatively, we could shorten the stem.\n const extension = this.flag !== undefined ? this.flag.checkMetrics().y_shift : 0;\n const flagY = this.getStemDirection() === Stem.DOWN\n ? // Down stems are below the note head and have flags on the right.\n y_top - noteStemHeight + 2 - extension\n : // Up stems are above the note head and have flags on the right.\n y_bottom - noteStemHeight - 2 - extension;\n // Draw the Flag\n ctx.openGroup('flag', undefined, { pointerBBox: true });\n this.applyStyle(ctx, this.getFlagStyle());\n (_a = this.flag) === null || _a === void 0 ? void 0 : _a.render(ctx, flagX, flagY);\n this.restoreStyle(ctx, this.getFlagStyle());\n ctx.closeGroup();\n }\n }\n // Draw the NoteHeads\n drawNoteHeads() {\n const ctx = this.checkContext();\n this._noteHeads.forEach((notehead) => {\n ctx.openGroup('notehead', undefined, { pointerBBox: true });\n notehead.setContext(ctx).draw();\n ctx.closeGroup();\n });\n }\n drawStem(stemOptions) {\n var _a;\n // GCR TODO: I can't find any context in which this is called with the stemStruct\n // argument in the codebase or tests. Nor can I find a case where super.drawStem\n // is called at all. Perhaps these should be removed?\n const ctx = this.checkContext();\n if (stemOptions) {\n this.setStem(new Stem(stemOptions));\n }\n // If we will render a flag, we shorten the stem so that the tip\n // does not poke through the flag.\n if (this.shouldDrawFlag() && this.stem) {\n this.stem.adjustHeightForFlag();\n }\n ctx.openGroup('stem', undefined, { pointerBBox: true });\n (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setContext(ctx).draw();\n ctx.closeGroup();\n }\n /**\n * Override stemmablenote stem extension to adjust for distance from middle line.\n */\n getStemExtension() {\n const super_stem_extension = super.getStemExtension();\n if (!this.glyph.stem) {\n return super_stem_extension;\n }\n const stem_direction = this.getStemDirection();\n if (stem_direction !== this.calculateOptimalStemDirection()) {\n return super_stem_extension; // no adjustment for manually set stem direction.\n }\n let mid_line_distance;\n const MIDDLE_LINE = 3;\n if (stem_direction === Stem.UP) {\n // Note that the use of maxLine here instead of minLine might\n // seem counterintuitive, but in the case of (say) treble clef\n // chord(F2, E4) stem up, we do not want to extend the stem because\n // of F2, when a normal octave-length stem above E4 is fine.\n //\n // maxLine and minLine are set in calculateOptimalStemDirection() so\n // will be known.\n mid_line_distance = MIDDLE_LINE - this.maxLine;\n }\n else {\n mid_line_distance = this.minLine - MIDDLE_LINE;\n }\n // how many lines more than an octave is the relevant notehead?\n const lines_over_octave_from_mid_line = mid_line_distance - 3.5;\n if (lines_over_octave_from_mid_line <= 0) {\n return super_stem_extension;\n }\n const stave = this.getStave();\n let spacing_between_lines = 10;\n if (stave != undefined) {\n spacing_between_lines = stave.getSpacingBetweenLines();\n }\n return super_stem_extension + lines_over_octave_from_mid_line * spacing_between_lines;\n }\n // Draws all the `StaveNote` parts. This is the main drawing method.\n draw() {\n var _a;\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', \"Can't draw note without Y values.\");\n }\n const ctx = this.checkContext();\n const xBegin = this.getNoteHeadBeginX();\n const shouldRenderStem = this.hasStem() && !this.beam;\n // Format note head x positions\n this._noteHeads.forEach((notehead) => notehead.setX(xBegin));\n // Format stem x positions\n const stemX = this.getStemX();\n (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setNoteHeadXBounds(stemX, stemX);\n L('Rendering ', this.isChord() ? 'chord :' : 'note :', this.keys);\n // Apply the overall style -- may be contradicted by local settings:\n this.applyStyle();\n this.setAttribute('el', ctx.openGroup('stavenote', this.getAttribute('id')));\n this.drawLedgerLines();\n ctx.openGroup('note', undefined, { pointerBBox: true });\n if (shouldRenderStem)\n this.drawStem();\n this.drawNoteHeads();\n this.drawFlag();\n ctx.closeGroup();\n this.drawModifiers();\n ctx.closeGroup();\n this.restoreStyle();\n this.setRendered();\n }\n}\nStaveNote.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Ron B. Yeh\n// MIT License\n//\n// Utilities for working with Web APIs.\n// See: https://developer.mozilla.org/en-US/docs/Web/API\nimport { globalObject } from './util';\n// eslint-disable-next-line\nexport function isHTMLCanvas(element) {\n if (!element)\n return false;\n const global = globalObject();\n return (\n // It's either an instance of the HTMLCanvasElement class,\n (typeof global.HTMLCanvasElement === 'function' && element instanceof global.HTMLCanvasElement) ||\n // OR it's pretending to be a element. Good enough!\n // Do not rely on .tagName, because node-canvas doesn't provide a tagName.\n (typeof element.getContext === 'function' && typeof element.toDataURL === 'function'));\n}\n// eslint-disable-next-line\nexport function isHTMLDiv(element) {\n if (!element)\n return false;\n const global = globalObject();\n return (\n // It's either an instance of the HTMLDivElement class.\n (typeof global.HTMLDivElement === 'function' && element instanceof global.HTMLDivElement) ||\n // OR it's pretending to be a
. See: svgcontext.ts.\n (typeof element.appendChild === 'function' && typeof element.style === 'object'));\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from './font';\nimport { RenderContext } from './rendercontext';\nimport { globalObject, warn } from './util';\nimport { isHTMLCanvas } from './web';\n/**\n * A rendering context for the Canvas backend. This class serves as a proxy for the\n * underlying CanvasRenderingContext2D object, part of the browser's API.\n */\nexport class CanvasContext extends RenderContext {\n constructor(context) {\n super();\n /** Height of one line of text (in pixels). */\n this.textHeight = 0;\n this.context2D = context;\n if (!context.canvas) {\n this.canvas = {\n width: CanvasContext.WIDTH,\n height: CanvasContext.HEIGHT,\n };\n }\n else {\n this.canvas = context.canvas;\n }\n }\n static get WIDTH() {\n return 600;\n }\n static get HEIGHT() {\n return 400;\n }\n static get CANVAS_BROWSER_SIZE_LIMIT() {\n return 32767; // Chrome/Firefox. Could be determined more precisely by npm module canvas-size.\n }\n /**\n * Ensure that width and height do not exceed the browser limit.\n * @returns array of [width, height] clamped to the browser limit.\n */\n static sanitizeCanvasDims(width, height) {\n const limit = this.CANVAS_BROWSER_SIZE_LIMIT;\n if (Math.max(width, height) > limit) {\n warn('Canvas dimensions exceed browser limit. Cropping to ' + limit);\n if (width > limit) {\n width = limit;\n }\n if (height > limit) {\n height = limit;\n }\n }\n return [width, height];\n }\n /**\n * Set all pixels to transparent black rgba(0,0,0,0).\n */\n clear() {\n this.context2D.clearRect(0, 0, this.canvas.width, this.canvas.height);\n }\n // eslint-disable-next-line\n openGroup(cls, id, attrs) {\n // Containers not implemented.\n }\n closeGroup() {\n // Containers not implemented.\n }\n // eslint-disable-next-line\n add(child) {\n // Containers not implemented.\n }\n setFillStyle(style) {\n this.context2D.fillStyle = style;\n return this;\n }\n /** CanvasContext ignores `setBackgroundFillStyle()`. */\n // eslint-disable-next-line\n setBackgroundFillStyle(style) {\n // DO NOTHING\n return this;\n }\n setStrokeStyle(style) {\n this.context2D.strokeStyle = style;\n return this;\n }\n setShadowColor(color) {\n this.context2D.shadowColor = color;\n return this;\n }\n setShadowBlur(blur) {\n // CanvasRenderingContext2D does not scale the shadow blur by the current\n // transform, so we have to do it manually. We assume uniform scaling\n // (though allow for rotation) because the blur can only be scaled\n // uniformly anyway.\n const t = this.context2D.getTransform();\n const scale = Math.sqrt(t.a * t.a + t.b * t.b + t.c * t.c + t.d * t.d);\n this.context2D.shadowBlur = scale * blur;\n return this;\n }\n setLineWidth(width) {\n this.context2D.lineWidth = width;\n return this;\n }\n setLineCap(capType) {\n this.context2D.lineCap = capType;\n return this;\n }\n setLineDash(dash) {\n this.context2D.setLineDash(dash);\n return this;\n }\n scale(x, y) {\n this.context2D.scale(x, y);\n return this;\n }\n resize(width, height) {\n const canvas = this.context2D.canvas;\n const devicePixelRatio = globalObject().devicePixelRatio || 1;\n // Scale the canvas size by the device pixel ratio clamping to the maximum supported size.\n [width, height] = CanvasContext.sanitizeCanvasDims(width * devicePixelRatio, height * devicePixelRatio);\n // Divide back down by the pixel ratio and convert to integers.\n width = (width / devicePixelRatio) | 0;\n height = (height / devicePixelRatio) | 0;\n canvas.width = width * devicePixelRatio;\n canvas.height = height * devicePixelRatio;\n // The canvas could be an instance of either HTMLCanvasElement or an OffscreenCanvas.\n // Only HTMLCanvasElement has a style attribute.\n if (isHTMLCanvas(canvas)) {\n canvas.style.width = width + 'px';\n canvas.style.height = height + 'px';\n }\n return this.scale(devicePixelRatio, devicePixelRatio);\n }\n rect(x, y, width, height) {\n this.context2D.rect(x, y, width, height);\n return this;\n }\n fillRect(x, y, width, height) {\n this.context2D.fillRect(x, y, width, height);\n return this;\n }\n /**\n * Set the pixels in a rectangular area to transparent black rgba(0,0,0,0).\n */\n clearRect(x, y, width, height) {\n this.context2D.clearRect(x, y, width, height);\n return this;\n }\n beginPath() {\n this.context2D.beginPath();\n return this;\n }\n moveTo(x, y) {\n this.context2D.moveTo(x, y);\n return this;\n }\n lineTo(x, y) {\n this.context2D.lineTo(x, y);\n return this;\n }\n bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) {\n this.context2D.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);\n return this;\n }\n quadraticCurveTo(cpx, cpy, x, y) {\n this.context2D.quadraticCurveTo(cpx, cpy, x, y);\n return this;\n }\n arc(x, y, radius, startAngle, endAngle, counterclockwise) {\n this.context2D.arc(x, y, radius, startAngle, endAngle, counterclockwise);\n return this;\n }\n fill() {\n this.context2D.fill();\n return this;\n }\n stroke() {\n this.context2D.stroke();\n return this;\n }\n closePath() {\n this.context2D.closePath();\n return this;\n }\n measureText(text) {\n const metrics = this.context2D.measureText(text);\n let y = 0;\n let height = 0;\n if (metrics.fontBoundingBoxAscent) {\n y = -metrics.fontBoundingBoxAscent;\n height = metrics.fontBoundingBoxDescent + metrics.fontBoundingBoxAscent;\n }\n else {\n y = -metrics.actualBoundingBoxAscent;\n height = metrics.actualBoundingBoxDescent + metrics.actualBoundingBoxAscent;\n }\n // Return x, y, width & height in the same manner as svg getBBox\n return {\n x: 0,\n y: y,\n width: metrics.width,\n height: height,\n };\n }\n fillText(text, x, y) {\n this.context2D.fillText(text, x, y);\n return this;\n }\n save() {\n this.context2D.save();\n return this;\n }\n restore() {\n this.context2D.restore();\n return this;\n }\n set fillStyle(style) {\n this.context2D.fillStyle = style;\n }\n get fillStyle() {\n return this.context2D.fillStyle;\n }\n set strokeStyle(style) {\n this.context2D.strokeStyle = style;\n }\n get strokeStyle() {\n return this.context2D.strokeStyle;\n }\n /**\n * @param f is 1) a `FontInfo` object or\n * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or\n * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided).\n * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt').\n * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900).\n * @param style is a string (e.g., 'italic', 'normal').\n */\n setFont(f, size, weight, style) {\n const fontInfo = Font.validate(f, size, weight, style);\n this.context2D.font = Font.toCSSString(fontInfo);\n this.textHeight = Font.convertSizeToPixelValue(fontInfo.size);\n return this;\n }\n /** Return a string of the form `'italic bold 15pt Arial'` */\n getFont() {\n return this.context2D.font;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// @author Gregory Ristow (2015)\nimport { Font, FontStyle, FontWeight } from './font';\nimport { RenderContext } from './rendercontext';\nimport { normalizeAngle, prefix, RuntimeError } from './util';\n/** For a particular element type (e.g., rect), we will not apply certain presentation attributes. */\nconst ATTRIBUTES_TO_IGNORE = {\n path: {\n x: true,\n y: true,\n width: true,\n height: true,\n 'font-family': true,\n 'font-weight': true,\n 'font-style': true,\n 'font-size': true,\n },\n rect: {\n 'font-family': true,\n 'font-weight': true,\n 'font-style': true,\n 'font-size': true,\n },\n text: {\n width: true,\n height: true,\n },\n};\n/** Create the SVG in the SVG namespace. */\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst TWO_PI = 2 * Math.PI;\nclass MeasureTextCache {\n constructor() {\n // The cache is keyed first by the text string, then by the font attributes\n // joined together.\n this.cache = {};\n }\n lookup(text, svg, attributes) {\n let entries = this.cache[text];\n if (entries === undefined) {\n entries = {};\n this.cache[text] = entries;\n }\n const family = attributes['font-family'];\n const size = attributes['font-size'];\n const weight = attributes['font-weight'];\n const style = attributes['font-style'];\n const key = `${family}%${size}%${weight}%${style}`;\n let entry = entries[key];\n if (entry === undefined) {\n entry = this.measureImpl(text, svg, attributes);\n entries[key] = entry;\n }\n return entry;\n }\n measureImpl(text, svg, attributes) {\n let txt = this.txt;\n if (!txt) {\n // Create the SVG text element that will be used to measure text in the event\n // of a cache miss.\n txt = document.createElementNS(SVG_NS, 'text');\n this.txt = txt;\n }\n txt.textContent = text;\n txt.setAttributeNS(null, 'font-family', attributes['font-family']);\n txt.setAttributeNS(null, 'font-size', attributes['font-size']);\n txt.setAttributeNS(null, 'font-style', attributes['font-style']);\n txt.setAttributeNS(null, 'font-weight', attributes['font-weight']);\n svg.appendChild(txt);\n const bbox = txt.getBBox();\n svg.removeChild(txt);\n return { x: bbox.x, y: bbox.y, width: bbox.width, height: bbox.height };\n }\n}\n/**\n * SVG rendering context with an API similar to CanvasRenderingContext2D.\n */\nexport class SVGContext extends RenderContext {\n constructor(element) {\n super();\n this.width = 0;\n this.height = 0;\n this.backgroundFillStyle = 'white';\n /** Formatted as CSS font shorthand (e.g., 'italic bold 12pt Arial') */\n this.fontCSSString = '';\n this.element = element;\n // Create a SVG element and add it to the container element.\n const svg = this.create('svg');\n this.element.appendChild(svg);\n this.svg = svg;\n this.parent = this.svg;\n this.groups = [this.svg];\n this.path = '';\n this.pen = { x: NaN, y: NaN };\n this.lineWidth = 1.0;\n const defaultFontAttributes = {\n 'font-family': Font.SANS_SERIF,\n 'font-size': Font.SIZE + 'pt',\n 'font-weight': FontWeight.NORMAL,\n 'font-style': FontStyle.NORMAL,\n };\n this.state = Object.assign({ scale: { x: 1, y: 1 } }, defaultFontAttributes);\n this.attributes = Object.assign({ 'stroke-width': 0.3, 'stroke-dasharray': 'none', fill: 'black', stroke: 'black' }, defaultFontAttributes);\n this.shadow_attributes = {\n width: 0,\n color: 'black',\n };\n this.state_stack = [];\n }\n create(svgElementType) {\n return document.createElementNS(SVG_NS, svgElementType);\n }\n // Allow grouping elements in containers for interactivity.\n openGroup(cls, id, attrs) {\n const group = this.create('g');\n this.groups.push(group);\n this.parent.appendChild(group);\n this.parent = group;\n if (cls)\n group.setAttribute('class', prefix(cls));\n if (id)\n group.setAttribute('id', prefix(id));\n if (attrs && attrs.pointerBBox) {\n group.setAttribute('pointer-events', 'bounding-box');\n }\n return group;\n }\n closeGroup() {\n this.groups.pop();\n this.parent = this.groups[this.groups.length - 1];\n }\n add(elem) {\n this.parent.appendChild(elem);\n }\n setFillStyle(style) {\n this.attributes.fill = style;\n return this;\n }\n /**\n * Used to set the fill color for `clearRect()`. This allows us to simulate\n * cutting a \"hole\" into the SVG drawing.\n */\n setBackgroundFillStyle(style) {\n this.backgroundFillStyle = style;\n return this;\n }\n setStrokeStyle(style) {\n this.attributes.stroke = style;\n return this;\n }\n setShadowColor(color) {\n this.shadow_attributes.color = color;\n return this;\n }\n /**\n * @param blur A non-negative float specifying the level of shadow blur, where 0\n * represents no blur and larger numbers represent increasingly more blur.\n * @returns this\n */\n setShadowBlur(blur) {\n this.shadow_attributes.width = blur;\n return this;\n }\n /**\n * @param width\n * @returns this\n */\n setLineWidth(width) {\n this.attributes['stroke-width'] = width;\n this.lineWidth = width;\n return this;\n }\n /**\n * @param lineDash an array of integers in the form of [dash, space, dash, space, etc...]\n * @returns this\n *\n * See: [SVG `stroke-dasharray` attribute](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray)\n */\n setLineDash(lineDash) {\n if (Object.prototype.toString.call(lineDash) === '[object Array]') {\n this.attributes['stroke-dasharray'] = lineDash.join(',');\n return this;\n }\n else {\n throw new RuntimeError('ArgumentError', 'lineDash must be an array of integers.');\n }\n }\n /**\n * @param capType\n * @returns this\n */\n setLineCap(capType) {\n this.attributes['stroke-linecap'] = capType;\n return this;\n }\n // ### Sizing & Scaling Methods:\n // TODO (GCR): See note at scale() -- separate our internal\n // conception of pixel-based width/height from the style.width\n // and style.height properties eventually to allow users to\n // apply responsive sizing attributes to the SVG.\n resize(width, height) {\n this.width = width;\n this.height = height;\n this.element.style.width = width.toString();\n this.svg.style.width = width.toString();\n this.svg.style.height = height.toString();\n const attributes = {\n width,\n height,\n };\n this.applyAttributes(this.svg, attributes);\n this.scale(this.state.scale.x, this.state.scale.y);\n return this;\n }\n scale(x, y) {\n // uses viewBox to scale\n // TODO (GCR): we may at some point want to distinguish the\n // style.width / style.height properties that are applied to\n // the SVG object from our internal conception of the SVG\n // width/height. This would allow us to create automatically\n // scaling SVG's that filled their containers, for instance.\n //\n // As this isn't implemented in Canvas contexts,\n // I've left as is for now, but in using the viewBox to\n // handle internal scaling, am trying to make it possible\n // for us to eventually move in that direction.\n this.state.scale = { x, y };\n const visibleWidth = this.width / x;\n const visibleHeight = this.height / y;\n this.setViewBox(0, 0, visibleWidth, visibleHeight);\n return this;\n }\n /**\n * 1 arg: string in the \"x y w h\" format\n * 4 args: x:number, y:number, w:number, h:number\n */\n setViewBox(viewBox_or_minX, minY, width, height) {\n if (typeof viewBox_or_minX === 'string') {\n this.svg.setAttribute('viewBox', viewBox_or_minX);\n }\n else {\n const viewBoxString = viewBox_or_minX + ' ' + minY + ' ' + width + ' ' + height;\n this.svg.setAttribute('viewBox', viewBoxString);\n }\n }\n // ### Drawing helper methods:\n applyAttributes(element, attributes) {\n const attrNamesToIgnore = ATTRIBUTES_TO_IGNORE[element.nodeName];\n for (const attrName in attributes) {\n if (attrNamesToIgnore && attrNamesToIgnore[attrName]) {\n continue;\n }\n element.setAttributeNS(null, attrName, attributes[attrName]);\n }\n return element;\n }\n // ### Shape & Path Methods:\n clear() {\n // Clear the SVG by removing all inner children.\n // (This approach is usually slightly more efficient\n // than removing the old SVG & adding a new one to\n // the container element, since it does not cause the\n // container to resize twice. Also, the resize\n // triggered by removing the entire SVG can trigger\n // a touchcancel event when the element resizes away\n // from a touch point.)\n while (this.svg.lastChild) {\n this.svg.removeChild(this.svg.lastChild);\n }\n // Replace the viewbox attribute we just removed.\n this.scale(this.state.scale.x, this.state.scale.y);\n }\n // ## Rectangles:\n rect(x, y, width, height, attributes) {\n // Avoid invalid negative height attributes by flipping the rectangle on its head:\n if (height < 0) {\n y += height;\n height *= -1;\n }\n const rectangle = this.create('rect');\n attributes = attributes !== null && attributes !== void 0 ? attributes : { fill: 'none', 'stroke-width': this.lineWidth, stroke: 'black' };\n this.applyAttributes(rectangle, Object.assign({ x, y, width, height }, attributes));\n this.add(rectangle);\n return this;\n }\n fillRect(x, y, width, height) {\n const attributes = { fill: this.attributes.fill };\n this.rect(x, y, width, height, attributes);\n return this;\n }\n clearRect(x, y, width, height) {\n // Currently this fills a rect with the backgroundFillStyle, rather\n // than \"cut a hole\" into the existing shapes.\n //\n // Since tabNote seems to be the only module that makes use of this\n // it may be worth creating a separate tabStave that would\n // draw lines around locations of tablature fingering.\n this.rect(x, y, width, height, { 'stroke-width': 0, fill: this.backgroundFillStyle });\n return this;\n }\n // ## Paths:\n beginPath() {\n this.path = '';\n this.pen.x = NaN;\n this.pen.y = NaN;\n return this;\n }\n moveTo(x, y) {\n this.path += 'M' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n lineTo(x, y) {\n this.path += 'L' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n bezierCurveTo(x1, y1, x2, y2, x, y) {\n this.path += 'C' + x1 + ' ' + y1 + ',' + x2 + ' ' + y2 + ',' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n quadraticCurveTo(x1, y1, x, y) {\n this.path += 'Q' + x1 + ' ' + y1 + ',' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n arc(x, y, radius, startAngle, endAngle, counterclockwise) {\n const x0 = x + radius * Math.cos(startAngle);\n const y0 = y + radius * Math.sin(startAngle);\n // Handle the edge case where arc length is greater than or equal to\n // the circle's circumference:\n // https://html.spec.whatwg.org/multipage/canvas.html#ellipse-method-steps\n if ((!counterclockwise && endAngle - startAngle >= TWO_PI) ||\n (counterclockwise && startAngle - endAngle >= TWO_PI)) {\n const x1 = x + radius * Math.cos(startAngle + Math.PI);\n const y1 = y + radius * Math.sin(startAngle + Math.PI);\n // There's no way to specify a completely circular arc in SVG so we have to\n // use two semi-circular arcs.\n this.path += `M${x0} ${y0} A${radius} ${radius} 0 0 0 ${x1} ${y1} `;\n this.path += `A${radius} ${radius} 0 0 0 ${x0} ${y0}`;\n this.pen.x = x0;\n this.pen.y = y0;\n }\n else {\n const x1 = x + radius * Math.cos(endAngle);\n const y1 = y + radius * Math.sin(endAngle);\n startAngle = normalizeAngle(startAngle);\n endAngle = normalizeAngle(endAngle);\n let large;\n if (Math.abs(endAngle - startAngle) < Math.PI) {\n large = counterclockwise;\n }\n else {\n large = !counterclockwise;\n }\n if (startAngle > endAngle) {\n large = !large;\n }\n const sweep = !counterclockwise;\n this.path += `M${x0} ${y0} A${radius} ${radius} 0 ${+large} ${+sweep} ${x1} ${y1}`;\n this.pen.x = x1;\n this.pen.y = y1;\n }\n return this;\n }\n closePath() {\n this.path += 'Z';\n return this;\n }\n getShadowStyle() {\n const sa = this.shadow_attributes;\n // A CSS drop-shadow filter blur looks different than a canvas shadowBlur\n // of the same radius, so we scale the drop-shadow radius here to make it\n // look close to the canvas shadow.\n return `filter: drop-shadow(0 0 ${sa.width / 1.5}px ${sa.color})`;\n }\n fill(attributes) {\n const path = this.create('path');\n if (typeof attributes === 'undefined') {\n attributes = Object.assign(Object.assign({}, this.attributes), { stroke: 'none' });\n }\n attributes.d = this.path;\n if (this.shadow_attributes.width > 0) {\n attributes.style = this.getShadowStyle();\n }\n this.applyAttributes(path, attributes);\n this.add(path);\n return this;\n }\n stroke() {\n const path = this.create('path');\n const attributes = Object.assign(Object.assign({}, this.attributes), { fill: 'none', 'stroke-width': this.lineWidth, d: this.path });\n if (this.shadow_attributes.width > 0) {\n attributes.style = this.getShadowStyle();\n }\n this.applyAttributes(path, attributes);\n this.add(path);\n return this;\n }\n // ## Text Methods:\n measureText(text) {\n return SVGContext.measureTextCache.lookup(text, this.svg, this.attributes);\n }\n fillText(text, x, y) {\n if (!text || text.length <= 0) {\n return this;\n }\n const attributes = Object.assign(Object.assign({}, this.attributes), { stroke: 'none', x,\n y });\n const txt = this.create('text');\n txt.textContent = text;\n this.applyAttributes(txt, attributes);\n this.add(txt);\n return this;\n }\n // TODO: State should be deep-copied.\n save() {\n this.state_stack.push({\n state: {\n 'font-family': this.state['font-family'],\n 'font-weight': this.state['font-weight'],\n 'font-style': this.state['font-style'],\n 'font-size': this.state['font-size'],\n scale: this.state.scale,\n },\n attributes: {\n 'font-family': this.attributes['font-family'],\n 'font-weight': this.attributes['font-weight'],\n 'font-style': this.attributes['font-style'],\n 'font-size': this.attributes['font-size'],\n fill: this.attributes.fill,\n stroke: this.attributes.stroke,\n 'stroke-width': this.attributes['stroke-width'],\n 'stroke-dasharray': this.attributes['stroke-dasharray'],\n },\n shadow_attributes: {\n width: this.shadow_attributes.width,\n color: this.shadow_attributes.color,\n },\n lineWidth: this.lineWidth,\n });\n return this;\n }\n // TODO: State should be deep-restored.\n restore() {\n const savedState = this.state_stack.pop();\n if (savedState) {\n const state = savedState;\n this.state['font-family'] = state.state['font-family'];\n this.state['font-weight'] = state.state['font-weight'];\n this.state['font-style'] = state.state['font-style'];\n this.state['font-size'] = state.state['font-size'];\n this.state.scale = state.state.scale;\n this.attributes['font-family'] = state.attributes['font-family'];\n this.attributes['font-weight'] = state.attributes['font-weight'];\n this.attributes['font-style'] = state.attributes['font-style'];\n this.attributes['font-size'] = state.attributes['font-size'];\n this.attributes.fill = state.attributes.fill;\n this.attributes.stroke = state.attributes.stroke;\n this.attributes['stroke-width'] = state.attributes['stroke-width'];\n this.attributes['stroke-dasharray'] = state.attributes['stroke-dasharray'];\n this.shadow_attributes.width = state.shadow_attributes.width;\n this.shadow_attributes.color = state.shadow_attributes.color;\n this.lineWidth = state.lineWidth;\n }\n return this;\n }\n set fillStyle(style) {\n this.setFillStyle(style);\n }\n get fillStyle() {\n return this.attributes.fill;\n }\n set strokeStyle(style) {\n this.setStrokeStyle(style);\n }\n get strokeStyle() {\n return this.attributes.stroke;\n }\n /**\n * @param f is 1) a `FontInfo` object or\n * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or\n * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided).\n * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt').\n * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900). It is inserted\n * into the font-weight attribute (e.g., font-weight=\"bold\")\n * @param style is a string (e.g., 'italic', 'normal') that is inserted into the\n * font-style attribute (e.g., font-style=\"italic\")\n */\n setFont(f, size, weight, style) {\n const fontInfo = Font.validate(f, size, weight, style);\n this.fontCSSString = Font.toCSSString(fontInfo);\n const fontAttributes = {\n 'font-family': fontInfo.family,\n 'font-size': fontInfo.size,\n 'font-weight': fontInfo.weight,\n 'font-style': fontInfo.style,\n };\n this.attributes = Object.assign(Object.assign({}, this.attributes), fontAttributes);\n this.state = Object.assign(Object.assign({}, this.state), fontAttributes);\n return this;\n }\n /** Return a string of the form `'italic bold 15pt Arial'` */\n getFont() {\n return this.fontCSSString;\n }\n}\nSVGContext.measureTextCache = new MeasureTextCache();\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { CanvasContext } from './canvascontext';\nimport { SVGContext } from './svgcontext';\nimport { isRenderContext } from './typeguard';\nimport { RuntimeError } from './util';\nimport { isHTMLCanvas, isHTMLDiv } from './web';\nexport var RendererBackends;\n(function (RendererBackends) {\n RendererBackends[RendererBackends[\"CANVAS\"] = 1] = \"CANVAS\";\n RendererBackends[RendererBackends[\"SVG\"] = 2] = \"SVG\";\n})(RendererBackends || (RendererBackends = {}));\n// End of line types\nexport var RendererLineEndType;\n(function (RendererLineEndType) {\n RendererLineEndType[RendererLineEndType[\"NONE\"] = 1] = \"NONE\";\n RendererLineEndType[RendererLineEndType[\"UP\"] = 2] = \"UP\";\n RendererLineEndType[RendererLineEndType[\"DOWN\"] = 3] = \"DOWN\";\n})(RendererLineEndType || (RendererLineEndType = {}));\n/**\n * Support Canvas & SVG rendering contexts.\n */\nexport class Renderer {\n constructor(arg0, arg1) {\n if (isRenderContext(arg0)) {\n // The user has provided what looks like a RenderContext, let's just use it.\n this.ctx = arg0;\n }\n else {\n if (arg1 === undefined) {\n // The backend must be specified if the render context isn't directly provided.\n throw new RuntimeError('InvalidArgument', 'Missing backend argument');\n }\n const backend = arg1;\n let element;\n if (typeof arg0 == 'string') {\n const maybeElement = document.getElementById(arg0);\n if (!maybeElement) {\n throw new RuntimeError('BadElementId', `Can't find element with ID \"${maybeElement}\"`);\n }\n element = maybeElement;\n }\n else {\n element = arg0;\n }\n // Verify backend and create context\n if (backend === Renderer.Backends.CANVAS) {\n if (!isHTMLCanvas(element)) {\n throw new RuntimeError('BadElement', 'CANVAS context requires an HTMLCanvasElement.');\n }\n const context = element.getContext('2d');\n if (!context) {\n throw new RuntimeError('BadElement', \"Can't get canvas context\");\n }\n this.ctx = new CanvasContext(context);\n }\n else if (backend === Renderer.Backends.SVG) {\n if (!isHTMLDiv(element)) {\n throw new RuntimeError('BadElement', 'SVG context requires an HTMLDivElement.');\n }\n this.ctx = new SVGContext(element);\n }\n else {\n throw new RuntimeError('InvalidBackend', `No support for backend: ${backend}`);\n }\n }\n }\n static buildContext(elementId, backend, width, height, background = '#FFF') {\n const renderer = new Renderer(elementId, backend);\n if (width && height) {\n renderer.resize(width, height);\n }\n const ctx = renderer.getContext();\n ctx.setBackgroundFillStyle(background);\n Renderer.lastContext = ctx;\n return ctx;\n }\n static getCanvasContext(elementId, width, height, background) {\n return Renderer.buildContext(elementId, Renderer.Backends.CANVAS, width, height, background);\n }\n static getSVGContext(elementId, width, height, background) {\n return Renderer.buildContext(elementId, Renderer.Backends.SVG, width, height, background);\n }\n // Draw a dashed line (horizontal, vertical or diagonal\n // dashPattern = [3,3] draws a 3 pixel dash followed by a three pixel space.\n // setting the second number to 0 draws a solid line.\n static drawDashedLine(context, fromX, fromY, toX, toY, dashPattern) {\n context.beginPath();\n const dx = toX - fromX;\n const dy = toY - fromY;\n const angle = Math.atan2(dy, dx);\n let x = fromX;\n let y = fromY;\n context.moveTo(fromX, fromY);\n let idx = 0;\n let draw = true;\n while (!((dx < 0 ? x <= toX : x >= toX) && (dy < 0 ? y <= toY : y >= toY))) {\n const dashLength = dashPattern[idx++ % dashPattern.length];\n const nx = x + Math.cos(angle) * dashLength;\n x = dx < 0 ? Math.max(toX, nx) : Math.min(toX, nx);\n const ny = y + Math.sin(angle) * dashLength;\n y = dy < 0 ? Math.max(toY, ny) : Math.min(toY, ny);\n if (draw) {\n context.lineTo(x, y);\n }\n else {\n context.moveTo(x, y);\n }\n draw = !draw;\n }\n context.closePath();\n context.stroke();\n }\n resize(width, height) {\n this.ctx.resize(width, height);\n return this;\n }\n getContext() {\n return this.ctx;\n }\n}\nRenderer.Backends = RendererBackends;\nRenderer.LineEndType = RendererLineEndType;\n// Used by vexflow_test_helpers.ts\n// Should this be private?\n// Can we do this in a cleaner way?\nRenderer.lastContext = undefined;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport var Justification;\n(function (Justification) {\n Justification[Justification[\"LEFT\"] = 1] = \"LEFT\";\n Justification[Justification[\"CENTER\"] = 2] = \"CENTER\";\n Justification[Justification[\"RIGHT\"] = 3] = \"RIGHT\";\n})(Justification || (Justification = {}));\n/**\n * `TextNote` is a notation element that is positioned in time. Generally\n * meant for objects that sit above/below the staff and inline with each other.\n * `TextNote` has to be assigned to a `Stave` before rendering by means of `setStave`.\n * Examples of this would be such as dynamics, lyrics, chord changes, etc.\n */\nexport class TextNote extends Note {\n constructor(noteStruct) {\n super(noteStruct);\n this.text = noteStruct.text || '';\n this.superscript = noteStruct.superscript;\n this.subscript = noteStruct.subscript;\n this.setFont(noteStruct.font);\n this.line = noteStruct.line || 0;\n this.smooth = noteStruct.smooth || false;\n this.ignore_ticks = noteStruct.ignore_ticks || false;\n this.justification = Justification.LEFT;\n // Determine and set initial note width. Note that the text width is\n // an approximation and isn't very accurate. The only way to accurately\n // measure the length of text is with `CanvasRenderingContext2D.measureText()`.\n if (noteStruct.glyph) {\n const struct = TextNote.GLYPHS[noteStruct.glyph];\n if (!struct)\n throw new RuntimeError('Invalid glyph type: ' + noteStruct.glyph);\n this.glyph = new Glyph(struct.code, 40, { category: 'textNote' });\n this.setWidth(this.glyph.getMetrics().width);\n }\n else {\n this.glyph = undefined;\n }\n }\n static get CATEGORY() {\n return Category.TextNote;\n }\n static get Justification() {\n return Justification;\n }\n /** Glyph data. */\n static get GLYPHS() {\n return {\n segno: {\n code: 'segno',\n },\n tr: {\n code: 'ornamentTrill',\n },\n mordent: {\n code: 'ornamentMordent',\n },\n mordent_upper: {\n code: 'ornamentShortTrill',\n },\n mordent_lower: {\n code: 'ornamentMordent',\n },\n f: {\n code: 'dynamicForte',\n },\n p: {\n code: 'dynamicPiano',\n },\n m: {\n code: 'dynamicMezzo',\n },\n s: {\n code: 'dynamicSforzando',\n },\n z: {\n code: 'dynamicZ',\n },\n coda: {\n code: 'coda',\n },\n pedal_open: {\n code: 'keyboardPedalPed',\n },\n pedal_close: {\n code: 'keyboardPedalUp',\n },\n caesura_straight: {\n code: 'caesura',\n },\n caesura_curved: {\n code: 'caesuraCurved',\n },\n breath: {\n code: 'breathMarkComma',\n },\n tick: {\n code: 'breathMarkTick',\n },\n turn: {\n code: 'ornamentTurn',\n },\n turn_inverted: {\n code: 'ornamentTurnSlash',\n },\n };\n }\n /** Set the horizontal justification of the TextNote. */\n setJustification(just) {\n this.justification = just;\n return this;\n }\n /** Set the Stave line on which the note should be placed. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Pre-render formatting. */\n preFormat() {\n if (this.preFormatted)\n return;\n const tickContext = this.checkTickContext(`Can't preformat without a TickContext.`);\n if (this.smooth) {\n this.setWidth(0);\n }\n else {\n if (this.glyph) {\n // Width already set.\n }\n else {\n const ctx = this.checkContext();\n ctx.setFont(this.textFont);\n this.setWidth(ctx.measureText(this.text).width);\n }\n }\n if (this.justification === Justification.CENTER) {\n this.leftDisplacedHeadPx = this.width / 2;\n }\n else if (this.justification === Justification.RIGHT) {\n this.leftDisplacedHeadPx = this.width;\n }\n // We reposition to the center of the note head\n this.rightDisplacedHeadPx = tickContext.getMetrics().glyphPx / 2;\n this.preFormatted = true;\n }\n /**\n * Renders the TextNote.\n * `TextNote` has to be assigned to a `Stave` before rendering by means of `setStave`.\n */\n draw() {\n const ctx = this.checkContext();\n const stave = this.checkStave();\n const tickContext = this.checkTickContext(`Can't draw without a TickContext.`);\n this.setRendered();\n // Reposition to center of note head\n let x = this.getAbsoluteX() + tickContext.getMetrics().glyphPx / 2;\n // Align based on tick-context width.\n const width = this.getWidth();\n if (this.justification === Justification.CENTER) {\n x -= width / 2;\n }\n else if (this.justification === Justification.RIGHT) {\n x -= width;\n }\n let y;\n if (this.glyph) {\n y = stave.getYForLine(this.line + -3);\n this.glyph.render(ctx, x, y);\n }\n else {\n y = stave.getYForLine(this.line + -3);\n this.applyStyle(ctx);\n ctx.setFont(this.textFont);\n ctx.fillText(this.text, x, y);\n const height = ctx.measureText(this.text).height;\n // We called this.setFont(...) in the constructor, so we know this.textFont is available.\n // eslint-disable-next-line\n const { family, size, weight, style } = this.textFont;\n // Scale the font size by 1/1.3.\n const smallerFontSize = Font.scaleSize(size, 0.769231);\n if (this.superscript) {\n ctx.setFont(family, smallerFontSize, weight, style);\n ctx.fillText(this.superscript, x + this.width + 2, y - height / 2.2);\n }\n if (this.subscript) {\n ctx.setFont(family, smallerFontSize, weight, style);\n ctx.fillText(this.subscript, x + this.width + 2, y + height / 2.2 - 1);\n }\n this.restoreStyle(ctx);\n }\n }\n}\nTextNote.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 12,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Larry Kuhns 2011\nimport { Font, FontStyle, FontWeight } from './font';\nimport { StaveModifier } from './stavemodifier';\nimport { Category } from './typeguard';\nexport var VoltaType;\n(function (VoltaType) {\n VoltaType[VoltaType[\"NONE\"] = 1] = \"NONE\";\n VoltaType[VoltaType[\"BEGIN\"] = 2] = \"BEGIN\";\n VoltaType[VoltaType[\"MID\"] = 3] = \"MID\";\n VoltaType[VoltaType[\"END\"] = 4] = \"END\";\n VoltaType[VoltaType[\"BEGIN_END\"] = 5] = \"BEGIN_END\";\n})(VoltaType || (VoltaType = {}));\nexport class Volta extends StaveModifier {\n constructor(type, number, x, y_shift) {\n super();\n this.volta = type;\n this.x = x;\n this.y_shift = y_shift;\n this.number = number;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.Volta;\n }\n static get type() {\n return VoltaType;\n }\n setShiftY(y) {\n this.y_shift = y;\n return this;\n }\n draw(stave, x) {\n const ctx = stave.checkContext();\n this.setRendered();\n let width = stave.getWidth() - x; // don't include x (offset) for width\n const top_y = stave.getYForTopText(stave.getNumLines()) + this.y_shift;\n const vert_height = 1.5 * stave.getSpacingBetweenLines();\n switch (this.volta) {\n case VoltaType.BEGIN:\n ctx.fillRect(this.x + x, top_y, 1, vert_height);\n break;\n case VoltaType.END:\n width -= 5;\n ctx.fillRect(this.x + x + width, top_y, 1, vert_height);\n break;\n case VoltaType.BEGIN_END:\n width -= 3;\n ctx.fillRect(this.x + x, top_y, 1, vert_height);\n ctx.fillRect(this.x + x + width, top_y, 1, vert_height);\n break;\n default:\n break;\n }\n // If the beginning of a volta, draw measure number\n if (this.volta === VoltaType.BEGIN || this.volta === VoltaType.BEGIN_END) {\n ctx.save();\n ctx.setFont(this.textFont);\n ctx.fillText(this.number, this.x + x + 5, top_y + 15);\n ctx.restore();\n }\n ctx.fillRect(this.x + x, top_y, width, 1);\n return this;\n }\n}\nVolta.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 9,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Larry Kuhns\n//\n// This file implements the `StringNumber` class which renders string\n// number annotations beside notes.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { Renderer } from './renderer';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category, isStaveNote, isStemmableNote } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StringNumber extends Modifier {\n constructor(number) {\n super();\n this.string_number = number;\n this.setWidth(20); // ???\n this.position = Modifier.Position.ABOVE; // Default position above stem or note head\n this.x_shift = 0;\n this.y_shift = 0;\n this.text_line = 0;\n this.stem_offset = 0;\n this.x_offset = 0; // Horizontal offset from default\n this.y_offset = 0; // Vertical offset from default\n this.dashed = true; // true - draw dashed extension false - no extension\n this.leg = Renderer.LineEndType.NONE; // draw upward/downward leg at the of extension line\n this.radius = 8;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StringNumber;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static get metrics() {\n return Tables.currentMusicFont().getMetrics().glyphs.stringNumber;\n }\n // ## Static Methods\n // Arrange string numbers inside a `ModifierContext`\n static format(nums, state) {\n const left_shift = state.left_shift;\n const right_shift = state.right_shift;\n const num_spacing = 1;\n if (!nums || nums.length === 0)\n return false;\n const nums_list = [];\n let prev_note = null;\n let shift_left = 0;\n let shift_right = 0;\n const modLines = 0;\n for (let i = 0; i < nums.length; ++i) {\n const num = nums[i];\n const note = num.getNote();\n const pos = num.getPosition();\n if (!isStaveNote(note)) {\n throw new RuntimeError('NoStaveNote');\n }\n const index = num.checkIndex();\n const props = note.getKeyProps()[index];\n const mc = note.getModifierContext();\n const verticalSpaceNeeded = (num.radius * 2) / Tables.STAVE_LINE_DISTANCE + 0.5;\n if (mc) {\n if (pos === ModifierPosition.ABOVE) {\n num.text_line = mc.getState().top_text_line;\n state.top_text_line += verticalSpaceNeeded;\n }\n else if (pos === ModifierPosition.BELOW) {\n num.text_line = mc.getState().text_line;\n state.text_line += verticalSpaceNeeded;\n }\n }\n if (note !== prev_note) {\n for (let n = 0; n < note.keys.length; ++n) {\n if (left_shift === 0) {\n shift_left = Math.max(note.getLeftDisplacedHeadPx(), shift_left);\n }\n if (right_shift === 0) {\n shift_right = Math.max(note.getRightDisplacedHeadPx(), shift_right);\n }\n }\n prev_note = note;\n }\n const glyphLine = modLines === 0 ? props.line : modLines;\n nums_list.push({\n pos,\n note,\n num,\n line: glyphLine,\n shiftL: shift_left,\n shiftR: shift_right,\n });\n }\n // Sort string numbers by line number.\n nums_list.sort((a, b) => b.line - a.line);\n let num_shiftR = 0;\n let x_widthL = 0;\n let x_widthR = 0;\n let last_line = null;\n let last_note = null;\n for (let i = 0; i < nums_list.length; ++i) {\n let num_shift = 0;\n const note = nums_list[i].note;\n const pos = nums_list[i].pos;\n const num = nums_list[i].num;\n const line = nums_list[i].line;\n const shiftR = nums_list[i].shiftR;\n // Reset the position of the string number every line.\n if (line !== last_line || note !== last_note) {\n num_shiftR = right_shift + shiftR;\n }\n const num_width = num.getWidth() + num_spacing;\n if (pos === Modifier.Position.LEFT) {\n num.setXShift(left_shift);\n num_shift = shift_left + num_width; // spacing\n x_widthL = num_shift > x_widthL ? num_shift : x_widthL;\n }\n else if (pos === Modifier.Position.RIGHT) {\n num.setXShift(num_shiftR);\n num_shift += num_width; // spacing\n x_widthR = num_shift > x_widthR ? num_shift : x_widthR;\n }\n last_line = line;\n last_note = note;\n }\n state.left_shift += x_widthL;\n state.right_shift += x_widthR;\n return true;\n }\n setLineEndType(leg) {\n if (leg >= Renderer.LineEndType.NONE && leg <= Renderer.LineEndType.DOWN) {\n this.leg = leg;\n }\n return this;\n }\n setStringNumber(number) {\n this.string_number = number;\n return this;\n }\n setOffsetX(x) {\n this.x_offset = x;\n return this;\n }\n setOffsetY(y) {\n this.y_offset = y;\n return this;\n }\n setLastNote(note) {\n this.last_note = note;\n return this;\n }\n setDashed(dashed) {\n this.dashed = dashed;\n return this;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(this.position, this.index);\n const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP;\n let dot_x = start.x + this.x_shift + this.x_offset;\n let stem_ext = {};\n if (note.hasStem()) {\n stem_ext = note.checkStem().getExtents();\n }\n let dot_y = start.y + this.y_shift + this.y_offset;\n switch (this.position) {\n case Modifier.Position.ABOVE:\n {\n const ys = note.getYs();\n dot_y = ys.reduce((a, b) => (a < b ? a : b));\n if (note.hasStem() && stemDirection == Stem.UP) {\n dot_y = stem_ext.topY + StringNumber.metrics.stemPadding;\n }\n dot_y -= this.radius + StringNumber.metrics.verticalPadding + this.text_line * Tables.STAVE_LINE_DISTANCE;\n }\n break;\n case Modifier.Position.BELOW:\n {\n const ys = note.getYs();\n dot_y = ys.reduce((a, b) => (a > b ? a : b));\n if (note.hasStem() && stemDirection == Stem.DOWN) {\n dot_y = stem_ext.topY - StringNumber.metrics.stemPadding;\n }\n dot_y += this.radius + StringNumber.metrics.verticalPadding + this.text_line * Tables.STAVE_LINE_DISTANCE;\n }\n break;\n case Modifier.Position.LEFT:\n dot_x -= this.radius / 2 + StringNumber.metrics.leftPadding;\n break;\n case Modifier.Position.RIGHT:\n dot_x += this.radius / 2 + StringNumber.metrics.rightPadding;\n break;\n default:\n throw new RuntimeError('InvalidPosition', `The position ${this.position} is invalid`);\n }\n ctx.save();\n ctx.beginPath();\n ctx.arc(dot_x, dot_y, this.radius, 0, Math.PI * 2, false);\n ctx.setLineWidth(1.5);\n ctx.stroke();\n ctx.setFont(this.textFont);\n const x = dot_x - ctx.measureText(this.string_number).width / 2;\n ctx.fillText('' + this.string_number, x, dot_y + 4.5);\n const lastNote = this.last_note;\n if (isStemmableNote(lastNote)) {\n // Only StemmableNote objects have getStemX().\n const end = lastNote.getStemX() - note.getX() + 5;\n ctx.setStrokeStyle('#000000');\n ctx.setLineCap('round');\n ctx.setLineWidth(0.6);\n if (this.dashed) {\n Renderer.drawDashedLine(ctx, dot_x + 10, dot_y, dot_x + end, dot_y, [3, 3]);\n }\n else {\n Renderer.drawDashedLine(ctx, dot_x + 10, dot_y, dot_x + end, dot_y, [3, 0]);\n }\n let len;\n let pattern;\n switch (this.leg) {\n case Renderer.LineEndType.UP:\n len = -10;\n pattern = this.dashed ? [3, 3] : [3, 0];\n Renderer.drawDashedLine(ctx, dot_x + end, dot_y, dot_x + end, dot_y + len, pattern);\n break;\n case Renderer.LineEndType.DOWN:\n len = 10;\n pattern = this.dashed ? [3, 3] : [3, 0];\n Renderer.drawDashedLine(ctx, dot_x + end, dot_y, dot_x + end, dot_y + len, pattern);\n break;\n default:\n break;\n }\n }\n ctx.restore();\n }\n}\nStringNumber.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: Font.SIZE,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Larry Kuhns\n//\n// This file implements the `Stroke` class which renders chord strokes\n// that can be arpeggiated, brushed, rasquedo, etc.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Category, isNote, isStaveNote, isTabNote } from './typeguard';\nimport { RuntimeError } from './util';\nexport class Stroke extends Modifier {\n constructor(type, options) {\n super();\n this.options = Object.assign({ all_voices: true }, options);\n // multi voice - span stroke across all voices if true\n this.all_voices = this.options.all_voices;\n // multi voice - end note of stroke, set in draw()\n this.type = type;\n this.position = Modifier.Position.LEFT;\n this.render_options = {\n font_scale: 38,\n };\n this.resetFont();\n this.setXShift(0);\n this.setWidth(10);\n }\n static get CATEGORY() {\n return Category.Stroke;\n }\n // Arrange strokes inside `ModifierContext`\n static format(strokes, state) {\n const left_shift = state.left_shift;\n const stroke_spacing = 0;\n if (!strokes || strokes.length === 0)\n return false;\n const strokeList = strokes.map((stroke) => {\n const note = stroke.getNote();\n const index = stroke.checkIndex();\n if (isStaveNote(note)) {\n // Only StaveNote objects have getKeyProps().\n const { line } = note.getKeyProps()[index];\n const shift = note.getLeftDisplacedHeadPx();\n return { line, shift, stroke };\n }\n else if (isTabNote(note)) {\n // Only TabNote objects have getPositions().\n const { str: string } = note.getPositions()[index];\n return { line: string, shift: 0, stroke };\n }\n else {\n throw new RuntimeError('Internal', 'Unexpected instance.');\n }\n });\n const strokeShift = left_shift;\n // There can only be one stroke .. if more than one, they overlay each other\n const xShift = strokeList.reduce((xShift, { stroke, shift }) => {\n stroke.setXShift(strokeShift + shift);\n return Math.max(stroke.getWidth() + stroke_spacing, xShift);\n }, 0);\n state.left_shift += xShift;\n return true;\n }\n getPosition() {\n return this.position;\n }\n addEndNote(note) {\n this.note_end = note;\n return this;\n }\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(this.position, this.index);\n let ys = note.getYs();\n let topY = start.y;\n let botY = start.y;\n const x = start.x - 5;\n const line_space = note.checkStave().getSpacingBetweenLines();\n const notes = this.checkModifierContext().getMembers(note.getCategory());\n for (let i = 0; i < notes.length; i++) {\n const note = notes[i];\n if (isNote(note)) {\n // Only Note objects have getYs().\n // note is an instance of either StaveNote or TabNote.\n ys = note.getYs();\n for (let n = 0; n < ys.length; n++) {\n if (this.note === notes[i] || this.all_voices) {\n topY = Math.min(topY, ys[n]);\n botY = Math.max(botY, ys[n]);\n }\n }\n }\n }\n let arrow = '';\n let arrow_shift_x = 0;\n let arrow_y = 0;\n let text_shift_x = 0;\n let text_y = 0;\n switch (this.type) {\n case Stroke.Type.BRUSH_DOWN:\n arrow = 'arrowheadBlackUp';\n arrow_shift_x = -3;\n arrow_y = topY - line_space / 2 + 10;\n botY += line_space / 2;\n break;\n case Stroke.Type.BRUSH_UP:\n arrow = 'arrowheadBlackDown';\n arrow_shift_x = 0.5;\n arrow_y = botY + line_space / 2;\n topY -= line_space / 2;\n break;\n case Stroke.Type.ROLL_DOWN:\n case Stroke.Type.RASQUEDO_DOWN:\n arrow = 'arrowheadBlackUp';\n arrow_shift_x = -3;\n text_shift_x = this.x_shift + arrow_shift_x - 2;\n if (isStaveNote(note)) {\n topY += 1.5 * line_space;\n if ((botY - topY) % 2 !== 0) {\n botY += 0.5 * line_space;\n }\n else {\n botY += line_space;\n }\n arrow_y = topY - line_space;\n text_y = botY + line_space + 2;\n }\n else {\n topY += 1.5 * line_space;\n botY += line_space;\n arrow_y = topY - 0.75 * line_space;\n text_y = botY + 0.25 * line_space;\n }\n break;\n case Stroke.Type.ROLL_UP:\n case Stroke.Type.RASQUEDO_UP:\n arrow = 'arrowheadBlackDown';\n arrow_shift_x = -4;\n text_shift_x = this.x_shift + arrow_shift_x - 1;\n if (isStaveNote(note)) {\n arrow_y = line_space / 2;\n topY += 0.5 * line_space;\n if ((botY - topY) % 2 === 0) {\n botY += line_space / 2;\n }\n arrow_y = botY + 0.5 * line_space;\n text_y = topY - 1.25 * line_space;\n }\n else {\n topY += 0.25 * line_space;\n botY += 0.5 * line_space;\n arrow_y = botY + 0.25 * line_space;\n text_y = topY - line_space;\n }\n break;\n case Stroke.Type.ARPEGGIO_DIRECTIONLESS:\n topY += 0.5 * line_space;\n botY += line_space; // * 0.5 can lead to slight underlap instead of overlap sometimes\n break;\n default:\n throw new RuntimeError('InvalidType', `The stroke type ${this.type} does not exist`);\n }\n let strokeLine = 'straight';\n // Draw the stroke\n if (this.type === Stroke.Type.BRUSH_DOWN || this.type === Stroke.Type.BRUSH_UP) {\n ctx.fillRect(x + this.x_shift, topY, 1, botY - topY);\n }\n else {\n strokeLine = 'wiggly';\n if (isStaveNote(note)) {\n for (let i = topY; i <= botY; i += line_space) {\n Glyph.renderGlyph(ctx, x + this.x_shift - 4, i, this.render_options.font_scale, 'vexWiggleArpeggioUp');\n }\n }\n else {\n let i;\n for (i = topY; i <= botY; i += 10) {\n Glyph.renderGlyph(ctx, x + this.x_shift - 4, i, this.render_options.font_scale, 'vexWiggleArpeggioUp');\n }\n if (this.type === Stroke.Type.RASQUEDO_DOWN) {\n text_y = i + 0.25 * line_space;\n }\n }\n }\n if (this.type === Stroke.Type.ARPEGGIO_DIRECTIONLESS) {\n return; // skip drawing arrow heads or text\n }\n // Draw the arrow head\n Glyph.renderGlyph(ctx, x + this.x_shift + arrow_shift_x, arrow_y, this.render_options.font_scale, arrow, {\n category: `stroke.${arrow}.${strokeLine}`,\n });\n // Draw the rasquedo \"R\"\n if (this.type === Stroke.Type.RASQUEDO_DOWN || this.type === Stroke.Type.RASQUEDO_UP) {\n ctx.save();\n ctx.setFont(this.textFont);\n ctx.fillText('R', x + text_shift_x, text_y);\n ctx.restore();\n }\n }\n}\nStroke.Type = {\n BRUSH_DOWN: 1,\n BRUSH_UP: 2,\n ROLL_DOWN: 3,\n ROLL_UP: 4,\n RASQUEDO_DOWN: 5,\n RASQUEDO_UP: 6,\n ARPEGGIO_DIRECTIONLESS: 7, // Arpeggiated chord without upwards or downwards arrow\n};\nStroke.TEXT_FONT = {\n family: Font.SERIF,\n size: Font.SIZE,\n weight: FontWeight.BOLD,\n style: FontStyle.ITALIC,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Bend } from './bend';\nimport { Modifier } from './modifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\n/** `Vibrato` implements diverse vibratos. */\nexport class Vibrato extends Modifier {\n constructor() {\n super();\n this.position = Modifier.Position.RIGHT;\n this.render_options = {\n harsh: false,\n vibrato_width: 20,\n wave_height: 6,\n wave_width: 4,\n wave_girth: 2,\n };\n this.setVibratoWidth(this.render_options.vibrato_width);\n }\n static get CATEGORY() {\n return Category.Vibrato;\n }\n /** Arrange vibratos inside a `ModifierContext`. */\n static format(vibratos, state, context) {\n if (!vibratos || vibratos.length === 0)\n return false;\n // Vibratos are always on top.\n let text_line = state.top_text_line;\n let width = 0;\n let shift = state.right_shift - 7;\n // If there's a bend, drop the text line\n const bends = context.getMembers(Bend.CATEGORY);\n if (bends && bends.length > 0) {\n const bendHeight = bends.map((bb) => bb.getTextHeight()).reduce((a, b) => (a > b ? a : b)) / Tables.STAVE_LINE_DISTANCE;\n text_line = text_line - (bendHeight + 1);\n }\n else {\n state.top_text_line += 1;\n }\n // Format Vibratos\n for (let i = 0; i < vibratos.length; ++i) {\n const vibrato = vibratos[i];\n vibrato.setXShift(shift);\n vibrato.setTextLine(text_line);\n width += vibrato.getWidth();\n shift += width;\n }\n state.right_shift += width;\n return true;\n }\n /** Set harsh vibrato. */\n setHarsh(harsh) {\n this.render_options.harsh = harsh;\n return this;\n }\n /** Set vibrato width in pixels. */\n setVibratoWidth(width) {\n this.render_options.vibrato_width = width;\n this.setWidth(width);\n return this;\n }\n /** Draw the vibrato on the rendering context. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const start = note.getModifierStartXY(Modifier.Position.RIGHT, this.index);\n const vx = start.x + this.x_shift;\n const vy = note.getYForTopText(this.text_line) + 2;\n Vibrato.renderVibrato(ctx, vx, vy, this.render_options);\n }\n /**\n * Static rendering method that can be called from\n * other classes (e.g. VibratoBracket).\n */\n static renderVibrato(ctx, x, y, opts) {\n const { harsh, vibrato_width, wave_width, wave_girth, wave_height } = opts;\n const num_waves = vibrato_width / wave_width;\n ctx.beginPath();\n let i;\n if (harsh) {\n ctx.moveTo(x, y + wave_girth + 1);\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.lineTo(x + wave_width, y - wave_height / 2);\n x += wave_width;\n ctx.lineTo(x + wave_width, y + wave_height / 2);\n x += wave_width;\n }\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.lineTo(x - wave_width, y - wave_height / 2 + wave_girth + 1);\n x -= wave_width;\n ctx.lineTo(x - wave_width, y + wave_height / 2 + wave_girth + 1);\n x -= wave_width;\n }\n ctx.fill();\n }\n else {\n ctx.moveTo(x, y + wave_girth);\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.quadraticCurveTo(x + wave_width / 2, y - wave_height / 2, x + wave_width, y);\n x += wave_width;\n ctx.quadraticCurveTo(x + wave_width / 2, y + wave_height / 2, x + wave_width, y);\n x += wave_width;\n }\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.quadraticCurveTo(x - wave_width / 2, y + wave_height / 2 + wave_girth, x - wave_width, y + wave_girth);\n x -= wave_width;\n ctx.quadraticCurveTo(x - wave_width / 2, y - wave_height / 2 + wave_girth, x - wave_width, y + wave_girth);\n x -= wave_width;\n }\n ctx.fill();\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This class implements various types of members to notes (e.g. bends,\n// fingering positions etc.)\nimport { Accidental } from './accidental';\nimport { Annotation } from './annotation';\nimport { Articulation } from './articulation';\nimport { Bend } from './bend';\nimport { ChordSymbol } from './chordsymbol';\nimport { Dot } from './dot';\nimport { FretHandFinger } from './frethandfinger';\nimport { GraceNoteGroup } from './gracenotegroup';\nimport { NoteSubGroup } from './notesubgroup';\nimport { Ornament } from './ornament';\nimport { Parenthesis } from './parenthesis';\nimport { StaveNote } from './stavenote';\nimport { StringNumber } from './stringnumber';\nimport { Stroke } from './strokes';\nimport { Category } from './typeguard';\nimport { log, RuntimeError } from './util';\nimport { Vibrato } from './vibrato';\n// To enable logging for this class. Set `Vex.Flow.ModifierContext.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (ModifierContext.DEBUG)\n log('Vex.Flow.ModifierContext', args);\n}\nexport class ModifierContext {\n constructor() {\n // Formatting data.\n this.state = {\n left_shift: 0,\n right_shift: 0,\n text_line: 0,\n top_text_line: 0,\n };\n // Current members\n this.members = {};\n this.preFormatted = false;\n this.postFormatted = false;\n this.formatted = false;\n this.width = 0;\n this.spacing = 0;\n }\n addModifier(member) {\n L('addModifier is deprecated, use addMember instead.');\n return this.addMember(member);\n }\n /**\n * this.members maps CATEGORY strings to arrays of Tickable | Modifier | StaveNote | TabNote.\n * Here we add a new member to this.members, and create a new array if needed.\n * @param member\n * @returns this\n */\n addMember(member) {\n const category = member.getCategory();\n if (!this.members[category]) {\n this.members[category] = [];\n }\n this.members[category].push(member);\n member.setModifierContext(this);\n this.preFormatted = false;\n return this;\n }\n /**\n * @deprecated\n */\n getModifiers(category) {\n L('getModifiers is deprecated, use getMembers instead.');\n return this.getMembers(category);\n }\n getMembers(category) {\n var _a;\n return (_a = this.members[category]) !== null && _a !== void 0 ? _a : [];\n }\n getWidth() {\n return this.width;\n }\n getLeftShift() {\n return this.state.left_shift;\n }\n getRightShift() {\n return this.state.right_shift;\n }\n getState() {\n return this.state;\n }\n getMetrics() {\n if (!this.formatted) {\n throw new RuntimeError('UnformattedMember', 'Unformatted member has no metrics.');\n }\n return {\n width: this.state.left_shift + this.state.right_shift + this.spacing,\n spacing: this.spacing,\n };\n }\n preFormat() {\n if (this.preFormatted)\n return;\n L('Preformatting ModifierContext');\n const state = this.state;\n const members = this.members;\n // The ordering below determines when different members are formatted and rendered.\n StaveNote.format(members[Category.StaveNote], state);\n Parenthesis.format(members[Category.Parenthesis], state);\n Dot.format(members[Category.Dot], state);\n FretHandFinger.format(members[Category.FretHandFinger], state);\n Accidental.format(members[Category.Accidental], state);\n Stroke.format(members[Category.Stroke], state);\n GraceNoteGroup.format(members[Category.GraceNoteGroup], state);\n NoteSubGroup.format(members[Category.NoteSubGroup], state);\n StringNumber.format(members[Category.StringNumber], state);\n Articulation.format(members[Category.Articulation], state);\n Ornament.format(members[Category.Ornament], state);\n Annotation.format(members[Category.Annotation], state);\n ChordSymbol.format(members[Category.ChordSymbol], state);\n Bend.format(members[Category.Bend], state);\n Vibrato.format(members[Category.Vibrato], state, this);\n // Update width of this member context\n this.width = state.left_shift + state.right_shift;\n this.preFormatted = true;\n }\n postFormat() {\n if (this.postFormatted)\n return;\n L('Postformatting ModifierContext');\n // If post-formatting is required for an element, add more lines below.\n StaveNote.postFormat(this.getMembers(Category.StaveNote));\n }\n}\nModifierContext.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna Cheppudira 2013.\n// Co-author: Benjamin W. Bohl\n// MIT License\nimport { Glyph } from './glyph';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, log } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Clef.DEBUG)\n log('Vex.Flow.Clef', args);\n}\n/**\n * Clef implements various types of clefs that can be rendered on a stave.\n *\n * See `tests/clef_tests.ts` for usage examples.\n */\nexport class Clef extends StaveModifier {\n /** Create a new clef. */\n constructor(type, size, annotation) {\n super();\n /**\n * The attribute `clef` must be a key from\n * `Clef.types`\n */\n this.clef = Clef.types['treble'];\n this.setPosition(StaveModifierPosition.BEGIN);\n this.setType(type, size, annotation);\n this.setWidth(Tables.currentMusicFont().lookupMetric(`clef.${this.size}.width`));\n L('Creating clef:', type);\n }\n static get CATEGORY() {\n return Category.Clef;\n }\n /**\n * Every clef name is associated with a glyph code from the font file\n * and a default stave line number.\n */\n static get types() {\n return {\n treble: {\n code: 'gClef',\n line: 3,\n point: 0,\n },\n bass: {\n code: 'fClef',\n line: 1,\n point: 0,\n },\n alto: {\n code: 'cClef',\n line: 2,\n point: 0,\n },\n tenor: {\n code: 'cClef',\n line: 1,\n point: 0,\n },\n percussion: {\n code: 'restMaxima',\n line: 2,\n point: 0,\n },\n soprano: {\n code: 'cClef',\n line: 4,\n point: 0,\n },\n 'mezzo-soprano': {\n code: 'cClef',\n line: 3,\n point: 0,\n },\n 'baritone-c': {\n code: 'cClef',\n line: 0,\n point: 0,\n },\n 'baritone-f': {\n code: 'fClef',\n line: 2,\n point: 0,\n },\n subbass: {\n code: 'fClef',\n line: 0,\n point: 0,\n },\n french: {\n code: 'gClef',\n line: 4,\n point: 0,\n },\n tab: {\n code: '6stringTabClef',\n point: 0,\n },\n };\n }\n /** Set clef type, size and annotation. */\n setType(type, size, annotation) {\n this.type = type;\n this.clef = Clef.types[type];\n if (size === undefined) {\n this.size = 'default';\n }\n else {\n this.size = size;\n }\n const musicFont = Tables.currentMusicFont();\n this.clef.point = musicFont.lookupMetric(`clef.${this.size}.point`, 0);\n this.glyph = new Glyph(this.clef.code, this.clef.point, {\n category: `clef.${this.clef.code}.${this.size}`,\n });\n // If an annotation, such as 8va, is specified, add it to the Clef object.\n if (annotation !== undefined) {\n const code = musicFont.lookupMetric(`clef.annotations.${annotation}.smuflCode`);\n const point = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.point`);\n const line = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.${this.type}.line`);\n const x_shift = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.${this.type}.shiftX`);\n this.annotation = { code, point, line, x_shift };\n this.attachment = new Glyph(this.annotation.code, this.annotation.point);\n this.attachment.metrics.x_max = 0;\n this.attachment.setXShift(this.annotation.x_shift);\n }\n else {\n this.annotation = undefined;\n }\n return this;\n }\n /** Get clef width. */\n getWidth() {\n if (this.type === 'tab') {\n defined(this.stave, 'ClefError', \"Can't get width without stave.\");\n }\n return this.width;\n }\n /** Set associated stave. */\n setStave(stave) {\n this.stave = stave;\n if (this.type === 'tab') {\n const glyph = defined(this.glyph, 'ClefError', \"Can't set stave without glyph.\");\n const numLines = this.stave.getNumLines();\n const musicFont = Tables.currentMusicFont();\n const point = musicFont.lookupMetric(`clef.lineCount.${numLines}.point`);\n const shiftY = musicFont.lookupMetric(`clef.lineCount.${numLines}.shiftY`);\n glyph.setPoint(point);\n glyph.setYShift(shiftY);\n }\n return this;\n }\n /** Render clef. */\n draw() {\n const glyph = defined(this.glyph, 'ClefError', \"Can't draw clef without glyph.\");\n const stave = this.checkStave();\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.openGroup('clef', this.getAttribute('id'));\n glyph.setStave(stave);\n glyph.setContext(ctx);\n if (this.clef.line !== undefined) {\n this.placeGlyphOnLine(glyph, stave, this.clef.line);\n }\n glyph.renderToStave(this.x);\n if (this.annotation !== undefined && this.attachment !== undefined) {\n this.placeGlyphOnLine(this.attachment, stave, this.annotation.line);\n this.attachment.setStave(stave);\n this.attachment.setContext(ctx);\n this.attachment.renderToStave(this.x);\n }\n ctx.closeGroup();\n }\n}\n/** To enable logging for this class, set `Vex.Flow.Clef.DEBUG` to `true`. */\nClef.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Cyril Silverman\n//\n// ## Description\n//\n// This file implements key signatures. A key signature sits on a stave\n// and indicates the notes with implicit accidentals.\nimport { Glyph } from './glyph';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined } from './util';\nexport class KeySignature extends StaveModifier {\n // Create a new Key Signature based on a `key_spec`\n constructor(keySpec, cancelKeySpec, alterKeySpec) {\n super();\n this.accList = [];\n this.setKeySig(keySpec, cancelKeySpec, alterKeySpec);\n this.setPosition(StaveModifierPosition.BEGIN);\n this.glyphFontScale = 38; // TODO(0xFE): Should this match StaveNote?\n this.glyphs = [];\n this.xPositions = []; // relative to this.x\n this.paddingForced = false;\n }\n static get CATEGORY() {\n return Category.KeySignature;\n }\n // Add an accidental glyph to the `KeySignature` instance which represents\n // the provided `acc`. If `nextAcc` is also provided, the appropriate\n // spacing will be included in the glyph's position\n convertToGlyph(acc, nextAcc) {\n const accGlyphData = Tables.accidentalCodes(acc.type);\n const glyph = new Glyph(accGlyphData.code, this.glyphFontScale);\n // Determine spacing between current accidental and the next accidental\n let extraWidth = 1;\n if (acc.type === 'n' && nextAcc) {\n const spacing = KeySignature.accidentalSpacing[nextAcc.type];\n if (spacing) {\n const isAbove = nextAcc.line >= acc.line;\n extraWidth = isAbove ? spacing.above : spacing.below;\n }\n }\n // Place the glyph on the stave\n this.placeGlyphOnLine(glyph, this.checkStave(), acc.line);\n this.glyphs.push(glyph);\n const xPosition = this.xPositions[this.xPositions.length - 1];\n const glyphWidth = glyph.getMetrics().width + extraWidth;\n // Store the next accidental's x position\n this.xPositions.push(xPosition + glyphWidth);\n // Expand size of key signature\n this.width += glyphWidth;\n }\n // Cancel out a key signature provided in the `spec` parameter. This will\n // place appropriate natural accidentals before the key signature.\n cancelKey(spec) {\n this.formatted = false;\n this.cancelKeySpec = spec;\n return this;\n }\n convertToCancelAccList(spec) {\n // Get the accidental list for the cancelled key signature\n const cancel_accList = Tables.keySignature(spec);\n // If the cancelled key has a different accidental type, ie: # vs b\n const different_types = this.accList.length > 0 && cancel_accList.length > 0 && cancel_accList[0].type !== this.accList[0].type;\n // Determine how many naturals needed to add\n const naturals = different_types ? cancel_accList.length : cancel_accList.length - this.accList.length;\n // Return if no naturals needed\n if (naturals < 1)\n return undefined;\n // Get the line position for each natural\n const cancelled = [];\n for (let i = 0; i < naturals; i++) {\n let index = i;\n if (!different_types) {\n index = cancel_accList.length - naturals + i;\n }\n const acc = cancel_accList[index];\n cancelled.push({ type: 'n', line: acc.line });\n }\n // Combine naturals with main accidental list for the key signature\n this.accList = cancelled.concat(this.accList);\n return {\n accList: cancelled,\n type: cancel_accList[0].type,\n };\n }\n // Deprecated\n addToStave(stave) {\n this.paddingForced = true;\n stave.addModifier(this);\n return this;\n }\n // Apply the accidental staff line placement based on the `clef` and\n // the accidental `type` for the key signature ('# or 'b').\n convertAccLines(clef, type, accList = this.accList) {\n let offset = 0.0; // if clef === \"treble\"\n let customLines; // when clef doesn't follow treble key sig shape\n switch (clef) {\n // Treble & Subbass both have offsets of 0, so are not included.\n case 'soprano':\n if (type === '#')\n customLines = [2.5, 0.5, 2, 0, 1.5, -0.5, 1];\n else\n offset = -1;\n break;\n case 'mezzo-soprano':\n if (type === 'b')\n customLines = [0, 2, 0.5, 2.5, 1, 3, 1.5];\n else\n offset = 1.5;\n break;\n case 'alto':\n offset = 0.5;\n break;\n case 'tenor':\n if (type === '#')\n customLines = [3, 1, 2.5, 0.5, 2, 0, 1.5];\n else\n offset = -0.5;\n break;\n case 'baritone-f':\n case 'baritone-c':\n if (type === 'b')\n customLines = [0.5, 2.5, 1, 3, 1.5, 3.5, 2];\n else\n offset = 2;\n break;\n case 'bass':\n case 'french':\n offset = 1;\n break;\n default:\n break;\n }\n // If there's a special case, assign those lines/spaces:\n let i;\n if (typeof customLines !== 'undefined') {\n for (i = 0; i < accList.length; ++i) {\n accList[i].line = customLines[i];\n }\n }\n else if (offset !== 0) {\n for (i = 0; i < accList.length; ++i) {\n accList[i].line += offset;\n }\n }\n }\n getPadding(index) {\n if (!this.formatted)\n this.format();\n return this.glyphs.length === 0 || (!this.paddingForced && index < 2) ? 0 : this.padding;\n }\n getWidth() {\n if (!this.formatted)\n this.format();\n return this.width;\n }\n setKeySig(keySpec, cancelKeySpec, alterKeySpec) {\n this.formatted = false;\n this.keySpec = keySpec;\n this.cancelKeySpec = cancelKeySpec;\n this.alterKeySpec = alterKeySpec;\n return this;\n }\n // Alter the accidentals of a key spec one by one.\n // Each alteration is a new accidental that replaces the\n // original accidental (or the canceled one).\n alterKey(alterKeySpec) {\n this.formatted = false;\n this.alterKeySpec = alterKeySpec;\n return this;\n }\n convertToAlterAccList(alterKeySpec) {\n const max = Math.min(alterKeySpec.length, this.accList.length);\n for (let i = 0; i < max; ++i) {\n if (alterKeySpec[i]) {\n this.accList[i].type = alterKeySpec[i];\n }\n }\n }\n format() {\n const stave = this.checkStave();\n this.width = 0;\n this.glyphs = [];\n this.xPositions = [0]; // initialize with initial x position\n this.accList = Tables.keySignature(defined(this.keySpec));\n const accList = this.accList;\n const firstAccidentalType = accList.length > 0 ? accList[0].type : undefined;\n let cancelAccList;\n if (this.cancelKeySpec) {\n cancelAccList = this.convertToCancelAccList(this.cancelKeySpec);\n }\n if (this.alterKeySpec) {\n this.convertToAlterAccList(this.alterKeySpec);\n }\n if (this.accList.length > 0) {\n const clef = (this.position === StaveModifierPosition.END ? stave.getEndClef() : stave.getClef()) || stave.getClef();\n if (cancelAccList) {\n this.convertAccLines(clef, cancelAccList.type, cancelAccList.accList);\n }\n this.convertAccLines(clef, firstAccidentalType, accList);\n for (let i = 0; i < this.accList.length; ++i) {\n this.convertToGlyph(this.accList[i], this.accList[i + 1]);\n }\n }\n this.formatted = true;\n }\n draw() {\n const stave = this.checkStave();\n const ctx = stave.checkContext();\n if (!this.formatted)\n this.format();\n this.setRendered();\n ctx.openGroup('keysignature', this.getAttribute('id'));\n for (let i = 0; i < this.glyphs.length; i++) {\n const glyph = this.glyphs[i];\n const x = this.x + this.xPositions[i];\n glyph.setStave(stave);\n glyph.setContext(ctx);\n glyph.renderToStave(x);\n }\n ctx.closeGroup();\n }\n}\n// Space between natural and following accidental depending\n// on vertical position\nKeySignature.accidentalSpacing = {\n '#': {\n above: 6,\n below: 4,\n },\n b: {\n above: 4,\n below: 7,\n },\n n: {\n above: 4,\n below: 1,\n },\n '##': {\n above: 6,\n below: 4,\n },\n bb: {\n above: 4,\n below: 7,\n },\n db: {\n above: 4,\n below: 7,\n },\n d: {\n above: 4,\n below: 7,\n },\n bbs: {\n above: 4,\n below: 7,\n },\n '++': {\n above: 6,\n below: 4,\n },\n '+': {\n above: 6,\n below: 4,\n },\n '+-': {\n above: 6,\n below: 4,\n },\n '++-': {\n above: 6,\n below: 4,\n },\n bs: {\n above: 4,\n below: 10,\n },\n bss: {\n above: 4,\n below: 10,\n },\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Larry Kuhns 2011\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { StaveModifier } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nexport class Repetition extends StaveModifier {\n constructor(type, x, y_shift) {\n super();\n this.symbol_type = type;\n this.x = x;\n this.x_shift = 0;\n this.y_shift = y_shift;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.Repetition;\n }\n setShiftX(x) {\n this.x_shift = x;\n return this;\n }\n setShiftY(y) {\n this.y_shift = y;\n return this;\n }\n draw(stave, x) {\n this.setRendered();\n switch (this.symbol_type) {\n case Repetition.type.CODA_RIGHT:\n this.drawCodaFixed(stave, x + stave.getWidth());\n break;\n case Repetition.type.CODA_LEFT:\n this.drawSymbolText(stave, x, 'Coda', true);\n break;\n case Repetition.type.SEGNO_LEFT:\n this.drawSignoFixed(stave, x);\n break;\n case Repetition.type.SEGNO_RIGHT:\n this.drawSignoFixed(stave, x + stave.getWidth());\n break;\n case Repetition.type.DC:\n this.drawSymbolText(stave, x, 'D.C.', false);\n break;\n case Repetition.type.DC_AL_CODA:\n this.drawSymbolText(stave, x, 'D.C. al', true);\n break;\n case Repetition.type.DC_AL_FINE:\n this.drawSymbolText(stave, x, 'D.C. al Fine', false);\n break;\n case Repetition.type.DS:\n this.drawSymbolText(stave, x, 'D.S.', false);\n break;\n case Repetition.type.DS_AL_CODA:\n this.drawSymbolText(stave, x, 'D.S. al', true);\n break;\n case Repetition.type.DS_AL_FINE:\n this.drawSymbolText(stave, x, 'D.S. al Fine', false);\n break;\n case Repetition.type.FINE:\n this.drawSymbolText(stave, x, 'Fine', false);\n break;\n case Repetition.type.TO_CODA:\n this.drawSymbolText(stave, x, 'To', true);\n break;\n default:\n break;\n }\n return this;\n }\n drawCodaFixed(stave, x) {\n const y = stave.getYForTopText(stave.getNumLines()) + this.y_shift;\n Glyph.renderGlyph(stave.checkContext(), this.x + x + this.x_shift, y + Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY'), 40, 'coda', { category: 'coda' });\n return this;\n }\n drawSignoFixed(stave, x) {\n const y = stave.getYForTopText(stave.getNumLines()) + this.y_shift;\n Glyph.renderGlyph(stave.checkContext(), this.x + x + this.x_shift, y + Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY'), 30, 'segno', { category: 'segno' });\n return this;\n }\n drawSymbolText(stave, x, text, draw_coda) {\n const ctx = stave.checkContext();\n ctx.save();\n ctx.setFont(this.textFont);\n let text_x = 0;\n let symbol_x = 0;\n const modifierWidth = stave.getNoteStartX() - this.x;\n switch (this.symbol_type) {\n // To the left with symbol\n case Repetition.type.CODA_LEFT:\n // Offset Coda text to right of stave beginning\n text_x = this.x + stave.getVerticalBarWidth();\n symbol_x =\n text_x +\n ctx.measureText(text).width +\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol');\n break;\n // To the right without symbol\n case Repetition.type.DC:\n case Repetition.type.DC_AL_FINE:\n case Repetition.type.DS:\n case Repetition.type.DS_AL_FINE:\n case Repetition.type.FINE:\n text_x =\n this.x +\n x +\n this.x_shift +\n stave.getWidth() -\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.spacing') -\n modifierWidth -\n ctx.measureText(text).width;\n break;\n // To the right with symbol\n default:\n text_x =\n this.x +\n x +\n this.x_shift +\n stave.getWidth() -\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.spacing') -\n modifierWidth -\n ctx.measureText(text).width -\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol');\n symbol_x =\n text_x +\n ctx.measureText(text).width +\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol');\n break;\n }\n const y = stave.getYForTopText(stave.getNumLines()) +\n this.y_shift +\n Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY');\n if (draw_coda) {\n Glyph.renderGlyph(ctx, symbol_x, y, 40, 'coda', { category: 'coda' });\n }\n ctx.fillText(text, text_x, y + 5);\n ctx.restore();\n return this;\n }\n}\nRepetition.TEXT_FONT = {\n family: Font.SERIF,\n size: 12,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\nRepetition.type = {\n NONE: 1,\n CODA_LEFT: 2,\n CODA_RIGHT: 3,\n SEGNO_LEFT: 4,\n SEGNO_RIGHT: 5,\n DC: 6,\n DC_AL_CODA: 7,\n DC_AL_FINE: 8,\n DS: 9,\n DS_AL_CODA: 10,\n DS_AL_FINE: 11,\n FINE: 12,\n TO_CODA: 13, // To Coda at end of stave\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Larry Kuhns 2011\nimport { Font, FontStyle, FontWeight } from './font';\nimport { StaveModifier } from './stavemodifier';\nimport { Category } from './typeguard';\nexport class StaveSection extends StaveModifier {\n constructor(section, x, shift_y) {\n super();\n this.setWidth(16);\n this.section = section;\n this.x = x;\n this.shift_x = 0;\n this.shift_y = shift_y;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StaveSection;\n }\n setStaveSection(section) {\n this.section = section;\n return this;\n }\n setShiftX(x) {\n this.shift_x = x;\n return this;\n }\n setShiftY(y) {\n this.shift_y = y;\n return this;\n }\n draw(stave, shift_x) {\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.save();\n ctx.setLineWidth(2);\n ctx.setFont(this.textFont);\n const paddingX = 2;\n const paddingY = 2;\n const rectWidth = 2;\n const textMeasurements = ctx.measureText(this.section);\n const textWidth = textMeasurements.width;\n const textHeight = textMeasurements.height;\n const width = textWidth + 2 * paddingX; // add left & right padding\n const height = textHeight + 2 * paddingY; // add top & bottom padding\n // Seems to be a good default y\n const y = stave.getYForTopText(2) + this.shift_y;\n const x = this.x + shift_x;\n ctx.beginPath();\n ctx.setLineWidth(rectWidth);\n ctx.rect(x, y + textMeasurements.y - paddingY, width, height);\n ctx.stroke();\n ctx.fillText(this.section, x + paddingX, y);\n ctx.restore();\n return this;\n }\n}\nStaveSection.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 10,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Radosaw Eichler 2012\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nexport class StaveTempo extends StaveModifier {\n constructor(tempo, x, shift_y) {\n super();\n /** Font size for note. */\n this.render_options = { glyph_font_scale: 30 };\n this.tempo = tempo;\n this.position = StaveModifierPosition.ABOVE;\n this.x = x;\n this.shift_x = 10;\n this.shift_y = shift_y;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StaveTempo;\n }\n setTempo(tempo) {\n this.tempo = tempo;\n return this;\n }\n setShiftX(x) {\n this.shift_x = x;\n return this;\n }\n setShiftY(y) {\n this.shift_y = y;\n return this;\n }\n draw(stave, shift_x) {\n const ctx = stave.checkContext();\n this.setRendered();\n const options = this.render_options;\n // FIXME: What does the '38' mean? Why 38? Is that supposed to\n // be the default font size for standard notation?\n const scale = options.glyph_font_scale / 38;\n const name = this.tempo.name;\n const duration = this.tempo.duration;\n const dots = this.tempo.dots || 0;\n const bpm = this.tempo.bpm;\n let x = this.x + this.shift_x + shift_x;\n const y = stave.getYForTopText(1) + this.shift_y;\n ctx.save();\n if (name) {\n ctx.setFont(this.textFont);\n ctx.fillText(name, x, y);\n x += ctx.measureText(name).width;\n }\n if (duration && bpm) {\n // Override the weight and style.\n ctx.setFont(Object.assign(Object.assign({}, this.textFont), { weight: 'normal', style: 'normal' }));\n if (name) {\n x += ctx.measureText(' ').width;\n ctx.fillText('(', x, y);\n x += ctx.measureText('(').width;\n }\n const code = Tables.getGlyphProps(duration);\n x += 3 * scale;\n Glyph.renderGlyph(ctx, x, y, options.glyph_font_scale, code.code_head);\n x += code.getWidth() * scale;\n // Draw stem and flags\n if (code.stem) {\n let stem_height = 30;\n if (code.beam_count)\n stem_height += 3 * (code.beam_count - 1);\n stem_height *= scale;\n const y_top = y - stem_height;\n ctx.fillRect(x - scale, y_top, scale, stem_height);\n if (code.flag) {\n Glyph.renderGlyph(ctx, x, y_top, options.glyph_font_scale, code.code_flag_upstem, {\n category: 'flag.staveTempo',\n });\n if (!dots)\n x += 6 * scale;\n }\n }\n // Draw dot\n for (let i = 0; i < dots; i++) {\n x += 6 * scale;\n ctx.beginPath();\n ctx.arc(x, y + 2 * scale, 2 * scale, 0, Math.PI * 2, false);\n ctx.fill();\n }\n ctx.fillText(' = ' + bpm + (name ? ')' : ''), x + 3 * scale, y);\n }\n ctx.restore();\n return this;\n }\n}\nStaveTempo.TEXT_FONT = {\n family: Font.SERIF,\n size: 14,\n weight: FontWeight.BOLD,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2014\nimport { Font, FontStyle, FontWeight } from './font';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Justification, TextNote } from './textnote';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StaveText extends StaveModifier {\n constructor(text, position, options = {}) {\n super();\n this.setWidth(16);\n this.text = text;\n this.position = position;\n this.options = Object.assign({ shift_x: 0, shift_y: 0, justification: TextNote.Justification.CENTER }, options);\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.StaveText;\n }\n setStaveText(text) {\n this.text = text;\n return this;\n }\n setShiftX(x) {\n this.shift_x = x;\n return this;\n }\n setShiftY(y) {\n this.shift_y = y;\n return this;\n }\n setText(text) {\n this.text = text;\n return this;\n }\n draw(stave) {\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.save();\n ctx.setLineWidth(2);\n ctx.setFont(this.textFont);\n const text_width = ctx.measureText('' + this.text).width;\n let x;\n let y;\n switch (this.position) {\n case StaveModifierPosition.LEFT:\n case StaveModifierPosition.RIGHT:\n y = (stave.getYForLine(0) + stave.getBottomLineY()) / 2 + this.options.shift_y;\n if (this.position === StaveModifierPosition.LEFT) {\n x = stave.getX() - text_width - 24 + this.options.shift_x;\n }\n else {\n x = stave.getX() + stave.getWidth() + 24 + this.options.shift_x;\n }\n break;\n case StaveModifierPosition.ABOVE:\n case StaveModifierPosition.BELOW:\n x = stave.getX() + this.options.shift_x;\n if (this.options.justification === Justification.CENTER) {\n x += stave.getWidth() / 2 - text_width / 2;\n }\n else if (this.options.justification === Justification.RIGHT) {\n x += stave.getWidth() - text_width;\n }\n if (this.position === StaveModifierPosition.ABOVE) {\n y = stave.getYForTopText(2) + this.options.shift_y;\n }\n else {\n y = stave.getYForBottomText(2) + this.options.shift_y;\n }\n break;\n default:\n throw new RuntimeError('InvalidPosition', 'Value Must be in Modifier.Position.');\n }\n ctx.fillText('' + this.text, x, y + 4);\n ctx.restore();\n return this;\n }\n}\nStaveText.TEXT_FONT = {\n family: Font.SERIF,\n size: 16,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// Renders time signatures glyphs for staffs\n// This class is used by TimeSignature to render the associated glyphs\nimport { Glyph } from './glyph';\nimport { defined } from './util';\nexport class TimeSignatureGlyph extends Glyph {\n constructor(timeSignature, topDigits, botDigits, code, point, options) {\n var _a;\n super(code, point, options);\n this.timeSignature = timeSignature;\n this.topGlyphs = [];\n this.botGlyphs = [];\n let topWidth = 0;\n for (let i = 0; i < topDigits.length; ++i) {\n let timeSigType = topDigits[i];\n switch (topDigits[i]) {\n case '-':\n timeSigType = 'Minus';\n break;\n case '+':\n timeSigType = botDigits.length > 0 ? 'PlusSmall' : 'Plus';\n break;\n case '(':\n timeSigType = botDigits.length > 0 ? 'ParensLeftSmall' : 'ParensLeft';\n break;\n case ')':\n timeSigType = botDigits.length > 0 ? 'ParensRightSmall' : 'ParensRight';\n break;\n }\n const topGlyph = new Glyph('timeSig' + timeSigType, this.timeSignature.point);\n this.topGlyphs.push(topGlyph);\n topWidth += (_a = topGlyph.getMetrics().width) !== null && _a !== void 0 ? _a : 0;\n }\n let botWidth = 0;\n for (let i = 0; i < botDigits.length; ++i) {\n let timeSigType = botDigits[i];\n switch (botDigits[i]) {\n case '+':\n timeSigType = 'PlusSmall';\n break;\n case '(':\n timeSigType = 'ParensLeftSmall';\n break;\n case ')':\n timeSigType = 'ParensRightSmall';\n break;\n }\n const botGlyph = new Glyph('timeSig' + timeSigType, this.timeSignature.point);\n this.botGlyphs.push(botGlyph);\n botWidth += defined(botGlyph.getMetrics().width);\n }\n this.width = Math.max(topWidth, botWidth);\n this.xMin = this.getMetrics().x_min;\n this.topStartX = (this.width - topWidth) / 2.0;\n this.botStartX = (this.width - botWidth) / 2.0;\n this.reset();\n }\n getMetrics() {\n return {\n x_min: this.xMin,\n x_max: this.xMin + this.width,\n width: this.width,\n };\n }\n renderToStave(x) {\n const stave = this.checkStave();\n const ctx = this.checkContext();\n let start_x = x + this.topStartX;\n let y = 0;\n if (this.botGlyphs.length > 0)\n y = stave.getYForLine(this.timeSignature.topLine);\n else\n y = (stave.getYForLine(this.timeSignature.topLine) + stave.getYForLine(this.timeSignature.bottomLine)) / 2;\n for (let i = 0; i < this.topGlyphs.length; ++i) {\n const glyph = this.topGlyphs[i];\n Glyph.renderOutline(ctx, glyph.getMetrics().outline, this.scale, start_x + this.x_shift, y);\n start_x += defined(glyph.getMetrics().width);\n }\n start_x = x + this.botStartX;\n y = stave.getYForLine(this.timeSignature.bottomLine);\n for (let i = 0; i < this.botGlyphs.length; ++i) {\n const glyph = this.botGlyphs[i];\n this.timeSignature.placeGlyphOnLine(glyph, stave, 0);\n Glyph.renderOutline(ctx, glyph.getMetrics().outline, this.scale, start_x + glyph.getMetrics().x_shift, y);\n start_x += defined(glyph.getMetrics().width);\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// Implements time signatures glyphs for staffs\n// See tables.js for the internal time signatures\n// representation\nimport { Glyph } from './glyph';\nimport { StaveModifier, StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { TimeSignatureGlyph } from './timesigglyph';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nconst assertIsValidTimeSig = (timeSpec) => {\n const numbers = timeSpec.split('/');\n if (numbers.length !== 2 && numbers[0] !== '+' && numbers[0] !== '-') {\n throw new RuntimeError('BadTimeSignature', `Invalid time spec: ${timeSpec}. Must be in the form \"/\"`);\n }\n numbers.forEach((number) => {\n // Characters consisting in number 0..9, '+', '-', '(' or ')'\n if (/^[0-9+\\-()]+$/.test(number) == false) {\n throw new RuntimeError('BadTimeSignature', `Invalid time spec: ${timeSpec}. Must contain valid signatures.`);\n }\n });\n};\nexport class TimeSignature extends StaveModifier {\n constructor(timeSpec = '4/4', customPadding = 15, validate_args = true) {\n super();\n this.validate_args = validate_args;\n const padding = customPadding;\n const musicFont = Tables.currentMusicFont();\n this.point = musicFont.lookupMetric('digits.point');\n const fontLineShift = musicFont.lookupMetric('digits.shiftLine', 0);\n this.topLine = 2 + fontLineShift;\n this.bottomLine = 4 + fontLineShift;\n this.setPosition(StaveModifierPosition.BEGIN);\n this.info = this.parseTimeSpec(timeSpec);\n this.setWidth(defined(this.info.glyph.getMetrics().width));\n this.setPadding(padding);\n }\n static get CATEGORY() {\n return Category.TimeSignature;\n }\n static get glyphs() {\n return {\n C: {\n code: 'timeSigCommon',\n point: 40,\n line: 2,\n },\n 'C|': {\n code: 'timeSigCutCommon',\n point: 40,\n line: 2,\n },\n };\n }\n parseTimeSpec(timeSpec) {\n var _a, _b;\n if (timeSpec === 'C' || timeSpec === 'C|') {\n const { line, code, point } = TimeSignature.glyphs[timeSpec];\n return {\n line,\n num: false,\n glyph: new Glyph(code, point),\n };\n }\n if (this.validate_args) {\n assertIsValidTimeSig(timeSpec);\n }\n const parts = timeSpec.split('/');\n return {\n num: true,\n glyph: this.makeTimeSignatureGlyph((_a = parts[0]) !== null && _a !== void 0 ? _a : '', (_b = parts[1]) !== null && _b !== void 0 ? _b : ''),\n };\n }\n makeTimeSignatureGlyph(topDigits, botDigits) {\n return new TimeSignatureGlyph(this, topDigits, botDigits, 'timeSig0', this.point);\n }\n getInfo() {\n return this.info;\n }\n setTimeSig(timeSpec) {\n this.info = this.parseTimeSpec(timeSpec);\n return this;\n }\n draw() {\n const stave = this.checkStave();\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.openGroup('timesignature', this.getAttribute('id'));\n this.info.glyph.setStave(stave);\n this.info.glyph.setContext(ctx);\n this.placeGlyphOnLine(this.info.glyph, stave, this.info.line);\n this.info.glyph.renderToStave(this.x);\n ctx.closeGroup();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { BoundingBox } from './boundingbox';\nimport { Clef } from './clef';\nimport { Element } from './element';\nimport { Font, FontStyle, FontWeight } from './font';\nimport { KeySignature } from './keysignature';\nimport { Barline, BarlineType } from './stavebarline';\nimport { StaveModifierPosition } from './stavemodifier';\nimport { Repetition } from './staverepetition';\nimport { StaveSection } from './stavesection';\nimport { StaveTempo } from './stavetempo';\nimport { StaveText } from './stavetext';\nimport { Volta } from './stavevolta';\nimport { Tables } from './tables';\nimport { TimeSignature } from './timesignature';\nimport { Category, isBarline } from './typeguard';\nimport { RuntimeError } from './util';\n// Used by Stave.format() to sort the modifiers at the beginning and end of a stave.\n// The keys (computed property names) match the CATEGORY property in the\n// Barline, Clef, KeySignature, TimeSignature classes.\nconst SORT_ORDER_BEG_MODIFIERS = {\n [Barline.CATEGORY]: 0,\n [Clef.CATEGORY]: 1,\n [KeySignature.CATEGORY]: 2,\n [TimeSignature.CATEGORY]: 3,\n};\nconst SORT_ORDER_END_MODIFIERS = {\n [TimeSignature.CATEGORY]: 0,\n [KeySignature.CATEGORY]: 1,\n [Barline.CATEGORY]: 2,\n [Clef.CATEGORY]: 3,\n};\nexport class Stave extends Element {\n constructor(x, y, width, options) {\n super();\n // Initialized by the constructor via this.resetLines().\n this.height = 0;\n this.x = x;\n this.y = y;\n this.width = width;\n this.formatted = false;\n this.start_x = x + 5;\n this.end_x = x + width;\n this.modifiers = []; // stave modifiers (clef, key, time, barlines, coda, segno, etc.)\n this.measure = 0;\n this.clef = 'treble';\n this.endClef = undefined;\n this.resetFont();\n this.options = Object.assign({ vertical_bar_width: 10, num_lines: 5, fill_style: '#999999', left_bar: true, right_bar: true, spacing_between_lines_px: Tables.STAVE_LINE_DISTANCE, space_above_staff_ln: 4, space_below_staff_ln: 4, top_text_position: 1, bottom_text_position: 4, line_config: [] }, options);\n this.bounds = { x: this.x, y: this.y, w: this.width, h: 0 };\n this.defaultLedgerLineStyle = { strokeStyle: '#444', lineWidth: 1.4 };\n this.resetLines();\n // beg bar\n this.addModifier(new Barline(this.options.left_bar ? BarlineType.SINGLE : BarlineType.NONE));\n // end bar\n this.addEndModifier(new Barline(this.options.right_bar ? BarlineType.SINGLE : BarlineType.NONE));\n }\n static get CATEGORY() {\n return Category.Stave;\n }\n // This is the sum of the padding that normally goes on left + right of a stave during\n // drawing. Used to size staves correctly with content width.\n static get defaultPadding() {\n const musicFont = Tables.currentMusicFont();\n return musicFont.lookupMetric('stave.padding') + musicFont.lookupMetric('stave.endPaddingMax');\n }\n // Right padding, used by system if startX is already determined.\n static get rightPadding() {\n const musicFont = Tables.currentMusicFont();\n return musicFont.lookupMetric('stave.endPaddingMax');\n }\n /** Set default style for ledger lines. */\n setDefaultLedgerLineStyle(style) {\n this.defaultLedgerLineStyle = style;\n }\n /** Get default style for ledger lines. */\n getDefaultLedgerLineStyle() {\n return Object.assign(Object.assign({}, this.getStyle()), this.defaultLedgerLineStyle);\n }\n space(spacing) {\n return this.options.spacing_between_lines_px * spacing;\n }\n resetLines() {\n this.options.line_config = [];\n for (let i = 0; i < this.options.num_lines; i++) {\n this.options.line_config.push({ visible: true });\n }\n this.height = (this.options.num_lines + this.options.space_above_staff_ln) * this.options.spacing_between_lines_px;\n this.options.bottom_text_position = this.options.num_lines;\n }\n setNoteStartX(x) {\n if (!this.formatted)\n this.format();\n this.start_x = x;\n const begBarline = this.modifiers[0];\n begBarline.setX(this.start_x - begBarline.getWidth());\n return this;\n }\n getNoteStartX() {\n if (!this.formatted)\n this.format();\n return this.start_x;\n }\n getNoteEndX() {\n if (!this.formatted)\n this.format();\n return this.end_x;\n }\n getTieStartX() {\n return this.start_x;\n }\n getTieEndX() {\n return this.end_x;\n }\n getX() {\n return this.x;\n }\n getNumLines() {\n return this.options.num_lines;\n }\n setNumLines(n) {\n this.options.num_lines = n;\n this.resetLines();\n return this;\n }\n setY(y) {\n this.y = y;\n return this;\n }\n getY() {\n return this.y;\n }\n getTopLineTopY() {\n return this.getYForLine(0) - Tables.STAVE_LINE_THICKNESS / 2;\n }\n getBottomLineBottomY() {\n return this.getYForLine(this.getNumLines() - 1) + Tables.STAVE_LINE_THICKNESS / 2;\n }\n setX(x) {\n const shift = x - this.x;\n this.formatted = false;\n this.x = x;\n this.start_x += shift;\n this.end_x += shift;\n for (let i = 0; i < this.modifiers.length; i++) {\n const mod = this.modifiers[i];\n mod.setX(mod.getX() + shift);\n }\n return this;\n }\n setWidth(width) {\n this.formatted = false;\n this.width = width;\n this.end_x = this.x + width;\n // reset the x position of the end barline (TODO(0xfe): This makes no sense)\n // this.modifiers[1].setX(this.end_x);\n return this;\n }\n getWidth() {\n return this.width;\n }\n getStyle() {\n return Object.assign({ fillStyle: this.options.fill_style, strokeStyle: this.options.fill_style, lineWidth: Tables.STAVE_LINE_THICKNESS }, this.style);\n }\n setMeasure(measure) {\n this.measure = measure;\n return this;\n }\n /**\n * Gets the pixels to shift from the beginning of the stave\n * following the modifier at the provided index\n * @param {Number} index The index from which to determine the shift\n * @return {Number} The amount of pixels shifted\n */\n getModifierXShift(index = 0) {\n if (typeof index !== 'number') {\n throw new RuntimeError('InvalidIndex', 'Must be of number type');\n }\n if (!this.formatted)\n this.format();\n if (this.getModifiers(StaveModifierPosition.BEGIN).length === 1) {\n return 0;\n }\n // for right position modifiers zero shift seems correct, see 'Volta + Modifier Measure Test'\n if (this.modifiers[index].getPosition() === StaveModifierPosition.RIGHT) {\n return 0;\n }\n let start_x = this.start_x - this.x;\n const begBarline = this.modifiers[0];\n if (begBarline.getType() === BarlineType.REPEAT_BEGIN && start_x > begBarline.getWidth()) {\n start_x -= begBarline.getWidth();\n }\n return start_x;\n }\n /** Coda & Segno Symbol functions */\n setRepetitionType(type, yShift = 0) {\n this.modifiers.push(new Repetition(type, this.x, yShift));\n return this;\n }\n // Volta functions\n setVoltaType(type, number_t, y) {\n this.modifiers.push(new Volta(type, number_t, this.x, y));\n return this;\n }\n // Section functions\n setSection(section, y, xOffset = 0, fontSize) {\n const staveSection = new StaveSection(section, this.x + xOffset, y);\n if (fontSize)\n staveSection.setFontSize(fontSize);\n this.modifiers.push(staveSection);\n return this;\n }\n // Tempo functions\n setTempo(tempo, y) {\n this.modifiers.push(new StaveTempo(tempo, this.x, y));\n return this;\n }\n // Text functions\n setText(text, position, options = {}) {\n this.modifiers.push(new StaveText(text, position, options));\n return this;\n }\n getHeight() {\n return this.height;\n }\n getSpacingBetweenLines() {\n return this.options.spacing_between_lines_px;\n }\n getBoundingBox() {\n return new BoundingBox(this.x, this.y, this.width, this.getBottomY() - this.y);\n }\n getBottomY() {\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const score_bottom = this.getYForLine(options.num_lines) + options.space_below_staff_ln * spacing;\n return score_bottom;\n }\n getBottomLineY() {\n return this.getYForLine(this.options.num_lines);\n }\n // This returns\n /** @returns the y for the *center* of a staff line */\n getYForLine(line) {\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const headroom = options.space_above_staff_ln;\n const y = this.y + line * spacing + headroom * spacing;\n return y;\n }\n getLineForY(y) {\n // Does the reverse of getYForLine - somewhat dumb and just calls\n // getYForLine until the right value is reaches\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const headroom = options.space_above_staff_ln;\n return (y - this.y) / spacing - headroom;\n }\n getYForTopText(line = 0) {\n return this.getYForLine(-line - this.options.top_text_position);\n }\n getYForBottomText(line = 0) {\n return this.getYForLine(this.options.bottom_text_position + line);\n }\n getYForNote(line) {\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const headroom = options.space_above_staff_ln;\n return this.y + headroom * spacing + 5 * spacing - line * spacing;\n }\n getYForGlyphs() {\n return this.getYForLine(3);\n }\n // This method adds a stave modifier to the stave. Note that the first two\n // modifiers (BarLines) are automatically added upon construction.\n addModifier(modifier, position) {\n if (position !== undefined) {\n modifier.setPosition(position);\n }\n modifier.setStave(this);\n this.formatted = false;\n this.modifiers.push(modifier);\n return this;\n }\n addEndModifier(modifier) {\n this.addModifier(modifier, StaveModifierPosition.END);\n return this;\n }\n // Bar Line functions\n setBegBarType(type) {\n // Only valid bar types at beginning of stave is none, single or begin repeat\n const { SINGLE, REPEAT_BEGIN, NONE } = BarlineType;\n if (type === SINGLE || type === REPEAT_BEGIN || type === NONE) {\n this.modifiers[0].setType(type);\n this.formatted = false;\n }\n return this;\n }\n setEndBarType(type) {\n // Repeat end not valid at end of stave\n if (type !== BarlineType.REPEAT_BEGIN) {\n this.modifiers[1].setType(type);\n this.formatted = false;\n }\n return this;\n }\n setClef(clefSpec, size, annotation, position) {\n if (position === undefined) {\n position = StaveModifierPosition.BEGIN;\n }\n if (position === StaveModifierPosition.END) {\n this.endClef = clefSpec;\n }\n else {\n this.clef = clefSpec;\n }\n const clefs = this.getModifiers(position, Clef.CATEGORY);\n if (clefs.length === 0) {\n this.addClef(clefSpec, size, annotation, position);\n }\n else {\n clefs[0].setType(clefSpec, size, annotation);\n }\n return this;\n }\n getClef() {\n return this.clef;\n }\n setEndClef(clefSpec, size, annotation) {\n this.setClef(clefSpec, size, annotation, StaveModifierPosition.END);\n return this;\n }\n getEndClef() {\n return this.endClef;\n }\n setKeySignature(keySpec, cancelKeySpec, position) {\n if (position === undefined) {\n position = StaveModifierPosition.BEGIN;\n }\n const keySignatures = this.getModifiers(position, KeySignature.CATEGORY);\n if (keySignatures.length === 0) {\n this.addKeySignature(keySpec, cancelKeySpec, position);\n }\n else {\n keySignatures[0].setKeySig(keySpec, cancelKeySpec);\n }\n return this;\n }\n setEndKeySignature(keySpec, cancelKeySpec) {\n this.setKeySignature(keySpec, cancelKeySpec, StaveModifierPosition.END);\n return this;\n }\n setTimeSignature(timeSpec, customPadding, position) {\n if (position === undefined) {\n position = StaveModifierPosition.BEGIN;\n }\n const timeSignatures = this.getModifiers(position, TimeSignature.CATEGORY);\n if (timeSignatures.length === 0) {\n this.addTimeSignature(timeSpec, customPadding, position);\n }\n else {\n timeSignatures[0].setTimeSig(timeSpec);\n }\n return this;\n }\n setEndTimeSignature(timeSpec, customPadding) {\n this.setTimeSignature(timeSpec, customPadding, StaveModifierPosition.END);\n return this;\n }\n /**\n * Add a key signature to the stave.\n *\n * Example:\n * `stave.addKeySignature('Db');`\n * @param keySpec new key specification `[A-G][b|#]?`\n * @param cancelKeySpec\n * @param position\n * @returns\n */\n addKeySignature(keySpec, cancelKeySpec, position) {\n if (position === undefined) {\n position = StaveModifierPosition.BEGIN;\n }\n this.addModifier(new KeySignature(keySpec, cancelKeySpec).setPosition(position), position);\n return this;\n }\n /**\n * Add a clef to the stave.\n *\n * Example:\n *\n * stave.addClef('treble')\n * @param clef clef (treble|bass|...) see {@link Clef.types}\n * @param size\n * @param annotation\n * @param position\n * @returns\n */\n addClef(clef, size, annotation, position) {\n if (position === undefined || position === StaveModifierPosition.BEGIN) {\n this.clef = clef;\n }\n else if (position === StaveModifierPosition.END) {\n this.endClef = clef;\n }\n this.addModifier(new Clef(clef, size, annotation), position);\n return this;\n }\n addEndClef(clef, size, annotation) {\n this.addClef(clef, size, annotation, StaveModifierPosition.END);\n return this;\n }\n /**\n * Add a time signature to the stave\n *\n * Example:\n *\n * `stave.addTimeSignature('4/4');`\n * @param timeSpec time signature specification `(C\\||C|\\d\\/\\d)`\n * @param customPadding\n * @param position\n * @returns\n */\n addTimeSignature(timeSpec, customPadding, position) {\n this.addModifier(new TimeSignature(timeSpec, customPadding), position);\n return this;\n }\n addEndTimeSignature(timeSpec, customPadding) {\n this.addTimeSignature(timeSpec, customPadding, StaveModifierPosition.END);\n return this;\n }\n // Deprecated\n addTrebleGlyph() {\n this.addClef('treble');\n return this;\n }\n /**\n * @param position\n * @param category\n * @returns array of StaveModifiers that match the provided position and category.\n */\n getModifiers(position, category) {\n const noPosition = position === undefined;\n const noCategory = category === undefined;\n if (noPosition && noCategory) {\n return this.modifiers;\n }\n else if (noPosition) {\n // A category was provided.\n return this.modifiers.filter((m) => category === m.getCategory());\n }\n else if (noCategory) {\n // A position was provided.\n return this.modifiers.filter((m) => position === m.getPosition());\n }\n else {\n // Both position and category were provided!\n return this.modifiers.filter((m) => position === m.getPosition() && category === m.getCategory());\n }\n }\n /**\n * Use the modifier's `getCategory()` as a key for the `order` array.\n * The retrieved value is used to sort modifiers from left to right (0 to to 3).\n */\n sortByCategory(items, order) {\n for (let i = items.length - 1; i >= 0; i--) {\n for (let j = 0; j < i; j++) {\n if (order[items[j].getCategory()] > order[items[j + 1].getCategory()]) {\n const temp = items[j];\n items[j] = items[j + 1];\n items[j + 1] = temp;\n }\n }\n }\n }\n format() {\n const begBarline = this.modifiers[0];\n const endBarline = this.modifiers[1];\n const begModifiers = this.getModifiers(StaveModifierPosition.BEGIN);\n const endModifiers = this.getModifiers(StaveModifierPosition.END);\n this.sortByCategory(begModifiers, SORT_ORDER_BEG_MODIFIERS);\n this.sortByCategory(endModifiers, SORT_ORDER_END_MODIFIERS);\n if (begModifiers.length > 1 && begBarline.getType() === BarlineType.REPEAT_BEGIN) {\n begModifiers.push(begModifiers.splice(0, 1)[0]);\n begModifiers.splice(0, 0, new Barline(BarlineType.SINGLE));\n }\n if (endModifiers.indexOf(endBarline) > 0) {\n endModifiers.splice(0, 0, new Barline(BarlineType.NONE));\n }\n let width;\n let padding;\n let modifier;\n let offset = 0;\n let x = this.x;\n for (let i = 0; i < begModifiers.length; i++) {\n modifier = begModifiers[i];\n padding = modifier.getPadding(i + offset);\n width = modifier.getWidth();\n x += padding;\n modifier.setX(x);\n x += width;\n if (padding + width === 0)\n offset--;\n }\n this.start_x = x;\n x = this.x + this.width;\n const widths = {\n left: 0,\n right: 0,\n paddingRight: 0,\n paddingLeft: 0,\n };\n let lastBarlineIdx = 0;\n for (let i = 0; i < endModifiers.length; i++) {\n modifier = endModifiers[i];\n lastBarlineIdx = isBarline(modifier) ? i : lastBarlineIdx;\n widths.right = 0;\n widths.left = 0;\n widths.paddingRight = 0;\n widths.paddingLeft = 0;\n const layoutMetrics = modifier.getLayoutMetrics();\n if (layoutMetrics) {\n if (i !== 0) {\n widths.right = layoutMetrics.xMax || 0;\n widths.paddingRight = layoutMetrics.paddingRight || 0;\n }\n widths.left = -layoutMetrics.xMin || 0;\n widths.paddingLeft = layoutMetrics.paddingLeft || 0;\n if (i === endModifiers.length - 1) {\n widths.paddingLeft = 0;\n }\n }\n else {\n widths.paddingRight = modifier.getPadding(i - lastBarlineIdx);\n if (i !== 0) {\n widths.right = modifier.getWidth();\n }\n if (i === 0) {\n widths.left = modifier.getWidth();\n }\n }\n x -= widths.paddingRight;\n x -= widths.right;\n modifier.setX(x);\n x -= widths.left;\n x -= widths.paddingLeft;\n }\n this.end_x = endModifiers.length === 1 ? this.x + this.width : x;\n this.formatted = true;\n }\n /**\n * All drawing functions below need the context to be set.\n */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n ctx.openGroup('stave', this.getAttribute('id'));\n if (!this.formatted)\n this.format();\n const num_lines = this.options.num_lines;\n const width = this.width;\n const x = this.x;\n let y;\n // Render lines\n for (let line = 0; line < num_lines; line++) {\n y = this.getYForLine(line);\n this.applyStyle();\n if (this.options.line_config[line].visible) {\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(x + width, y);\n ctx.stroke();\n }\n this.restoreStyle();\n }\n // Draw the modifiers (bar lines, coda, segno, repeat brackets, etc.)\n for (let i = 0; i < this.modifiers.length; i++) {\n const modifier = this.modifiers[i];\n // Only draw modifier if it has a draw function\n if (typeof modifier.draw === 'function') {\n modifier.applyStyle(ctx);\n modifier.draw(this, this.getModifierXShift(i));\n modifier.restoreStyle(ctx);\n }\n }\n // Render measure numbers\n if (this.measure > 0) {\n ctx.save();\n ctx.setFont(this.textFont);\n const textWidth = ctx.measureText('' + this.measure).width;\n y = this.getYForTopText(0) + 3;\n ctx.fillText('' + this.measure, this.x - textWidth / 2, y);\n ctx.restore();\n }\n ctx.closeGroup();\n return this;\n }\n getVerticalBarWidth() {\n return this.options.vertical_bar_width;\n }\n /**\n * Get the current configuration for the Stave.\n * @return {Array} An array of configuration objects.\n */\n getConfigForLines() {\n return this.options.line_config;\n }\n /**\n * Configure properties of the lines in the Stave\n * @param line_number The index of the line to configure.\n * @param line_config An configuration object for the specified line.\n * @throws RuntimeError \"StaveConfigError\" When the specified line number is out of\n * range of the number of lines specified in the constructor.\n */\n setConfigForLine(line_number, line_config) {\n if (line_number >= this.options.num_lines || line_number < 0) {\n throw new RuntimeError('StaveConfigError', 'The line number must be within the range of the number of lines in the Stave.');\n }\n if (line_config.visible === undefined) {\n throw new RuntimeError('StaveConfigError', \"The line configuration object is missing the 'visible' property.\");\n }\n if (typeof line_config.visible !== 'boolean') {\n throw new RuntimeError('StaveConfigError', \"The line configuration objects 'visible' property must be true or false.\");\n }\n this.options.line_config[line_number] = line_config;\n return this;\n }\n /**\n * Set the staff line configuration array for all of the lines at once.\n * @param lines_configuration An array of line configuration objects. These objects\n * are of the same format as the single one passed in to setLineConfiguration().\n * The caller can set null for any line config entry if it is desired that the default be used\n * @throws RuntimeError \"StaveConfigError\" When the lines_configuration array does not have\n * exactly the same number of elements as the num_lines configuration object set in\n * the constructor.\n */\n setConfigForLines(lines_configuration) {\n if (lines_configuration.length !== this.options.num_lines) {\n throw new RuntimeError('StaveConfigError', 'The length of the lines configuration array must match the number of lines in the Stave');\n }\n // Make sure the defaults are present in case an incomplete set of\n // configuration options were supplied.\n // eslint-disable-next-line\n for (const line_config in lines_configuration) {\n // Allow '{}' to be used if the caller just wants the default for a particular node.\n if (lines_configuration[line_config].visible == undefined) {\n lines_configuration[line_config] = this.options.line_config[line_config];\n }\n this.options.line_config[line_config] = Object.assign(Object.assign({}, this.options.line_config[line_config]), lines_configuration[line_config]);\n }\n this.options.line_config = lines_configuration;\n return this;\n }\n}\nStave.TEXT_FONT = {\n family: Font.SANS_SERIF,\n size: 8,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nfunction drawBoldDoubleLine(ctx, type, topX, topY, botY) {\n if (type !== StaveConnector.type.BOLD_DOUBLE_LEFT && type !== StaveConnector.type.BOLD_DOUBLE_RIGHT) {\n throw new RuntimeError('InvalidConnector', 'A REPEAT_BEGIN or REPEAT_END type must be provided.');\n }\n let x_shift = 3;\n let variableWidth = 3.5; // Width for avoiding anti-aliasing width issues\n const thickLineOffset = 2; // For aesthetics\n if (type === StaveConnector.type.BOLD_DOUBLE_RIGHT) {\n x_shift = -5; // Flips the side of the thin line\n variableWidth = 3;\n }\n // Thin line\n ctx.fillRect(topX + x_shift, topY, 1, botY - topY);\n // Thick line\n ctx.fillRect(topX - thickLineOffset, topY, variableWidth, botY - topY);\n}\n/** StaveConnector implements the connector lines between staves of a system. */\nexport class StaveConnector extends Element {\n constructor(top_stave, bottom_stave) {\n super();\n this.thickness = Tables.STAVE_LINE_THICKNESS;\n this.width = 3;\n this.top_stave = top_stave;\n this.bottom_stave = bottom_stave;\n this.type = StaveConnector.type.DOUBLE;\n this.resetFont();\n // 1. Offset Bold Double Left to align with offset Repeat Begin bars\n // 2. Offset BRACE type not to overlap with another StaveConnector\n this.x_shift = 0;\n this.texts = [];\n }\n static get CATEGORY() {\n return Category.StaveConnector;\n }\n /**\n * Set type.\n * @param type see {@link StaveConnector.type} & {@link StaveConnector.typeString}\n */\n setType(type) {\n type = typeof type === 'string' ? StaveConnector.typeString[type] : type;\n if (type >= StaveConnector.type.SINGLE_RIGHT && type <= StaveConnector.type.NONE) {\n this.type = type;\n }\n return this;\n }\n /** Set optional associated Text. */\n setText(text, options = {}) {\n this.texts.push({\n content: text,\n options: Object.assign({ shift_x: 0, shift_y: 0 }, options),\n });\n return this;\n }\n setXShift(x_shift) {\n if (typeof x_shift !== 'number') {\n throw new RuntimeError('InvalidType', 'x_shift must be a Number');\n }\n this.x_shift = x_shift;\n return this;\n }\n getXShift() {\n return this.x_shift;\n }\n /** Render connector and associated text. */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n let topY = this.top_stave.getYForLine(0);\n let botY = this.bottom_stave.getYForLine(this.bottom_stave.getNumLines() - 1) + this.thickness;\n let width = this.width;\n let topX = this.top_stave.getX();\n const isRightSidedConnector = this.type === StaveConnector.type.SINGLE_RIGHT ||\n this.type === StaveConnector.type.BOLD_DOUBLE_RIGHT ||\n this.type === StaveConnector.type.THIN_DOUBLE;\n if (isRightSidedConnector) {\n topX = this.top_stave.getX() + this.top_stave.getWidth();\n }\n let attachment_height = botY - topY;\n switch (this.type) {\n case StaveConnector.type.SINGLE:\n width = 1;\n break;\n case StaveConnector.type.SINGLE_LEFT:\n width = 1;\n break;\n case StaveConnector.type.SINGLE_RIGHT:\n width = 1;\n break;\n case StaveConnector.type.DOUBLE:\n topX -= this.width + 2;\n topY -= this.thickness;\n attachment_height += 0.5;\n break;\n case StaveConnector.type.BRACE: {\n width = 12;\n // May need additional code to draw brace\n const x1 = this.top_stave.getX() - 2 + this.x_shift;\n const y1 = topY;\n const x3 = x1;\n const y3 = botY;\n const x2 = x1 - width;\n const y2 = y1 + attachment_height / 2.0;\n const cpx1 = x2 - 0.9 * width;\n const cpy1 = y1 + 0.2 * attachment_height;\n const cpx2 = x1 + 1.1 * width;\n const cpy2 = y2 - 0.135 * attachment_height;\n const cpx3 = cpx2;\n const cpy3 = y2 + 0.135 * attachment_height;\n const cpx4 = cpx1;\n const cpy4 = y3 - 0.2 * attachment_height;\n const cpx5 = x2 - width;\n const cpy5 = cpy4;\n const cpx6 = x1 + 0.4 * width;\n const cpy6 = y2 + 0.135 * attachment_height;\n const cpx7 = cpx6;\n const cpy7 = y2 - 0.135 * attachment_height;\n const cpx8 = cpx5;\n const cpy8 = cpy1;\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, x2, y2);\n ctx.bezierCurveTo(cpx3, cpy3, cpx4, cpy4, x3, y3);\n ctx.bezierCurveTo(cpx5, cpy5, cpx6, cpy6, x2, y2);\n ctx.bezierCurveTo(cpx7, cpy7, cpx8, cpy8, x1, y1);\n ctx.fill();\n ctx.stroke();\n break;\n }\n case StaveConnector.type.BRACKET:\n topY -= 6;\n botY += 6;\n attachment_height = botY - topY;\n Glyph.renderGlyph(ctx, topX - 5, topY, 40, 'bracketTop');\n Glyph.renderGlyph(ctx, topX - 5, botY, 40, 'bracketBottom');\n topX -= this.width + 2;\n break;\n case StaveConnector.type.BOLD_DOUBLE_LEFT:\n drawBoldDoubleLine(ctx, this.type, topX + this.x_shift, topY, botY - this.thickness);\n break;\n case StaveConnector.type.BOLD_DOUBLE_RIGHT:\n drawBoldDoubleLine(ctx, this.type, topX, topY, botY - this.thickness);\n break;\n case StaveConnector.type.THIN_DOUBLE:\n width = 1;\n attachment_height -= this.thickness;\n break;\n case StaveConnector.type.NONE:\n break;\n default:\n throw new RuntimeError('InvalidType', `The provided StaveConnector.type (${this.type}) is invalid.`);\n }\n if (this.type !== StaveConnector.type.BRACE &&\n this.type !== StaveConnector.type.BOLD_DOUBLE_LEFT &&\n this.type !== StaveConnector.type.BOLD_DOUBLE_RIGHT &&\n this.type !== StaveConnector.type.NONE) {\n ctx.fillRect(topX, topY, width, attachment_height);\n }\n // If the connector is a thin double barline, draw the paralell line\n if (this.type === StaveConnector.type.THIN_DOUBLE) {\n ctx.fillRect(topX - 3, topY, width, attachment_height);\n }\n ctx.save();\n ctx.setLineWidth(2);\n ctx.setFont(this.textFont);\n // Add stave connector text\n for (let i = 0; i < this.texts.length; i++) {\n const text = this.texts[i];\n const text_width = ctx.measureText('' + text.content).width;\n const x = this.top_stave.getX() - text_width - 24 + text.options.shift_x;\n const y = (this.top_stave.getYForLine(0) + this.bottom_stave.getBottomLineY()) / 2 + text.options.shift_y;\n ctx.fillText('' + text.content, x, y + 4);\n }\n ctx.restore();\n }\n}\nStaveConnector.TEXT_FONT = {\n family: Font.SERIF,\n size: 16,\n weight: FontWeight.NORMAL,\n style: FontStyle.NORMAL,\n};\n/**\n * SINGLE_LEFT and SINGLE are the same value for compatibility\n * with older versions of vexflow which didn't have right sided\n * stave connectors.\n */\nStaveConnector.type = {\n SINGLE_RIGHT: 0,\n SINGLE_LEFT: 1,\n SINGLE: 1,\n DOUBLE: 2,\n BRACE: 3,\n BRACKET: 4,\n BOLD_DOUBLE_LEFT: 5,\n BOLD_DOUBLE_RIGHT: 6,\n THIN_DOUBLE: 7,\n NONE: 8,\n};\n/**\n * Connector type:\n * * \"singleRight\"\n * * \"singleLeft\"\n * * \"single\"\n * * \"double\"\n * * \"brace\"\n * * \"bracket\"\n * * \"boldDoubleLeft\"\n * * \"boldDoubleRight\"\n * * \"thinDouble\"\n * * \"none\"\n */\nStaveConnector.typeString = {\n singleRight: StaveConnector.type.SINGLE_RIGHT,\n singleLeft: StaveConnector.type.SINGLE_LEFT,\n single: StaveConnector.type.SINGLE,\n double: StaveConnector.type.DOUBLE,\n brace: StaveConnector.type.BRACE,\n bracket: StaveConnector.type.BRACKET,\n boldDoubleLeft: StaveConnector.type.BOLD_DOUBLE_LEFT,\n boldDoubleRight: StaveConnector.type.BOLD_DOUBLE_RIGHT,\n thinDouble: StaveConnector.type.THIN_DOUBLE,\n none: StaveConnector.type.NONE,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Beam } from './beam';\nimport { Font } from './font';\nimport { Fraction } from './fraction';\nimport { ModifierContext } from './modifiercontext';\nimport { Stave } from './stave';\nimport { StaveConnector } from './staveconnector';\nimport { Tables } from './tables';\nimport { TickContext } from './tickcontext';\nimport { isNote, isStaveNote } from './typeguard';\nimport { defined, log, midLine, RuntimeError } from './util';\nimport { Voice } from './voice';\n// Helper function\nconst sumArray = (arr) => arr.reduce((a, b) => a + b, 0);\n/**\n * Create `Alignment`s for each tick in `voices`. Also calculate the\n * total number of ticks in voices.\n */\nfunction createContexts(voices, makeContext, addToContext) {\n const resolutionMultiplier = Formatter.getResolutionMultiplier(voices);\n // Initialize tick maps.\n const tickToContextMap = {};\n const tickList = [];\n const contexts = [];\n // For each voice, extract notes and create a context for every\n // new tick that hasn't been seen before.\n voices.forEach((voice, voiceIndex) => {\n // Use resolution multiplier as denominator so that no additional expansion\n // of fractional tick values is needed.\n const ticksUsed = new Fraction(0, resolutionMultiplier);\n voice.getTickables().forEach((tickable) => {\n const integerTicks = ticksUsed.numerator;\n // If we have no tick context for this tick, create one.\n if (!tickToContextMap[integerTicks]) {\n const newContext = makeContext({ tickID: integerTicks });\n contexts.push(newContext);\n tickToContextMap[integerTicks] = newContext;\n // Maintain a list of unique integerTicks.\n tickList.push(integerTicks);\n }\n // Add this tickable to the TickContext.\n addToContext(tickable, tickToContextMap[integerTicks], voiceIndex);\n ticksUsed.add(tickable.getTicks());\n });\n });\n return {\n map: tickToContextMap,\n array: contexts,\n list: tickList.sort((a, b) => a - b),\n resolutionMultiplier,\n };\n}\n// eslint-disable-next-line\nfunction L(...args) {\n if (Formatter.DEBUG)\n log('Vex.Flow.Formatter', args);\n}\n/**\n * Get the rest line number of the next non-rest note(s).\n * @param notes array of Notes\n * @param currRestLine\n * @param currNoteIndex current note index\n * @param compare if true, return the midpoint between the current rest line and the next rest line\n * @returns a line number, which determines the vertical position of a rest.\n */\nfunction getRestLineForNextNoteGroup(notes, currRestLine, currNoteIndex, compare) {\n // If no valid next note group, nextRestLine is same as current.\n let nextRestLine = currRestLine;\n // Start with the next note and keep going until we find a valid non-rest note group.\n for (let noteIndex = currNoteIndex + 1; noteIndex < notes.length; noteIndex++) {\n const note = notes[noteIndex];\n if (isNote(note) && !note.isRest() && !note.shouldIgnoreTicks()) {\n nextRestLine = note.getLineForRest();\n break;\n }\n }\n // Locate the mid point between two lines.\n if (compare && currRestLine !== nextRestLine) {\n const top = Math.max(currRestLine, nextRestLine);\n const bot = Math.min(currRestLine, nextRestLine);\n nextRestLine = midLine(top, bot);\n }\n return nextRestLine;\n}\n/**\n * Format implements the formatting and layout algorithms that are used\n * to position notes in a voice. The algorithm can align multiple voices both\n * within a stave, and across multiple staves.\n *\n * To do this, the formatter breaks up voices into a grid of rational-valued\n * `ticks`, to which each note is assigned. Then, minimum widths are assigned\n * to each tick based on the widths of the notes and modifiers in that tick. This\n * establishes the smallest amount of space required for each tick.\n *\n * Finally, the formatter distributes the left over space proportionally to\n * all the ticks, setting the `x` values of the notes in each tick.\n *\n * See `tests/formatter_tests.ts` for usage examples. The helper functions included\n * here (`FormatAndDraw`, `FormatAndDrawTab`) also serve as useful usage examples.\n */\nexport class Formatter {\n constructor(options) {\n this.formatterOptions = Object.assign({ globalSoftmax: false, softmaxFactor: 100, maxIterations: 5 }, options);\n this.justifyWidth = 0;\n this.totalCost = 0;\n this.totalShift = 0;\n this.durationStats = {};\n // Minimum width required to render all the notes in the voices.\n this.minTotalWidth = 0;\n // This is set to `true` after `minTotalWidth` is calculated.\n this.hasMinTotalWidth = false;\n // Arrays of tick and modifier contexts.\n this.tickContexts = undefined;\n this.modifierContexts = undefined;\n // Gaps between contexts, for free movement of notes post\n // formatting.\n this.contextGaps = {\n total: 0,\n gaps: [],\n };\n this.voices = [];\n this.lossHistory = [];\n }\n /**\n * Helper function to layout \"notes\" one after the other without\n * regard for proportions. Useful for tests and debugging.\n */\n static SimpleFormat(notes, x = 0, { paddingBetween = 10 } = {}) {\n notes.reduce((accumulator, note) => {\n note.addToModifierContext(new ModifierContext());\n const tick = new TickContext().addTickable(note).preFormat();\n const metrics = tick.getMetrics();\n tick.setX(accumulator + metrics.totalLeftPx);\n return accumulator + tick.getWidth() + metrics.totalRightPx + paddingBetween;\n }, x);\n }\n /** Helper function to plot formatter debug info. */\n static plotDebugging(ctx, formatter, xPos, y1, y2, options) {\n options = Object.assign({ stavePadding: Tables.currentMusicFont().lookupMetric('stave.padding') }, options);\n const x = xPos + options.stavePadding;\n const contextGaps = formatter.contextGaps;\n function stroke(x1, x2, color) {\n ctx.beginPath();\n ctx.setStrokeStyle(color);\n ctx.setFillStyle(color);\n ctx.setLineWidth(1);\n ctx.fillRect(x1, y1, Math.max(x2 - x1, 0), y2 - y1);\n }\n ctx.save();\n ctx.setFont(Font.SANS_SERIF, 8);\n contextGaps.gaps.forEach((gap) => {\n stroke(x + gap.x1, x + gap.x2, 'rgba(100,200,100,0.4)');\n ctx.setFillStyle('green');\n ctx.fillText(Math.round(gap.x2 - gap.x1).toString(), x + gap.x1, y2 + 12);\n });\n ctx.setFillStyle('red');\n ctx.fillText(`Loss: ${(formatter.totalCost || 0).toFixed(2)} Shift: ${(formatter.totalShift || 0).toFixed(2)} Gap: ${contextGaps.total.toFixed(2)}`, x - 20, y2 + 27);\n ctx.restore();\n }\n /**\n * Helper function to format and draw a single voice. Returns a bounding\n * box for the notation.\n * @param ctx the rendering context\n * @param stave the stave to which to draw (`Stave` or `TabStave`)\n * @param notes array of `Note` instances (`Note`, `TextNote`, `TabNote`, etc.)\n * @param params one of below:\n * * Setting `autobeam` only `(context, stave, notes, true)` or\n * `(ctx, stave, notes, {autobeam: true})`\n * * Setting `align_rests` a struct is needed `(context, stave, notes, {align_rests: true})`\n * * Setting both a struct is needed `(context, stave, notes, {\n * autobeam: true, align_rests: true})`\n * * `autobeam` automatically generates beams for the notes.\n * * `align_rests` aligns rests with nearby notes.\n */\n static FormatAndDraw(ctx, stave, notes, params) {\n let options = {\n auto_beam: false,\n align_rests: false,\n };\n if (typeof params === 'object') {\n options = Object.assign(Object.assign({}, options), params);\n }\n else if (typeof params === 'boolean') {\n options.auto_beam = params;\n }\n // Start by creating a voice and adding all the notes to it.\n const voice = new Voice(Tables.TIME4_4).setMode(Voice.Mode.SOFT).addTickables(notes);\n // Then create beams, if requested.\n const beams = options.auto_beam ? Beam.applyAndGetBeams(voice) : [];\n // Instantiate a `Formatter` and format the notes.\n new Formatter()\n .joinVoices([voice]) // , { align_rests: options.align_rests })\n .formatToStave([voice], stave, { align_rests: options.align_rests, stave });\n // Render the voice and beams to the stave.\n voice.setStave(stave).draw(ctx, stave);\n beams.forEach((beam) => beam.setContext(ctx).draw());\n // Return the bounding box of the voice.\n return voice.getBoundingBox();\n }\n /**\n * Helper function to format and draw aligned tab and stave notes in two\n * separate staves.\n * @param ctx the rendering context\n * @param tabstave a `TabStave` instance on which to render `TabNote`s.\n * @param stave a `Stave` instance on which to render `Note`s.\n * @param notes array of `Note` instances for the stave (`Note`, `BarNote`, etc.)\n * @param tabnotes array of `Note` instances for the tab stave (`TabNote`, `BarNote`, etc.)\n * @param autobeam automatically generate beams.\n * @param params a configuration object:\n * * `autobeam` automatically generates beams for the notes.\n * * `align_rests` aligns rests with nearby notes.\n */\n static FormatAndDrawTab(ctx, tabstave, stave, tabnotes, notes, autobeam, params) {\n let opts = {\n auto_beam: autobeam,\n align_rests: false,\n };\n if (typeof params === 'object') {\n opts = Object.assign(Object.assign({}, opts), params);\n }\n else if (typeof params === 'boolean') {\n opts.auto_beam = params;\n }\n // Create a `4/4` voice for `notes`.\n const notevoice = new Voice(Tables.TIME4_4).setMode(Voice.Mode.SOFT).addTickables(notes);\n // Create a `4/4` voice for `tabnotes`.\n const tabvoice = new Voice(Tables.TIME4_4).setMode(Voice.Mode.SOFT).addTickables(tabnotes);\n // Then create beams, if requested.\n const beams = opts.auto_beam ? Beam.applyAndGetBeams(notevoice) : [];\n // Instantiate a `Formatter` and align tab and stave notes.\n new Formatter()\n .joinVoices([notevoice]) // , { align_rests: opts.align_rests })\n .joinVoices([tabvoice])\n .formatToStave([notevoice, tabvoice], stave, { align_rests: opts.align_rests });\n // Render voices and beams to staves.\n notevoice.draw(ctx, stave);\n tabvoice.draw(ctx, tabstave);\n beams.forEach((beam) => beam.setContext(ctx).draw());\n // Draw a connector between tab and note staves.\n new StaveConnector(stave, tabstave).setContext(ctx).draw();\n }\n /**\n * Automatically set the vertical position of rests based on previous/next note positions.\n * @param tickables an array of Tickables.\n * @param alignAllNotes If `false`, only align rests that are within a group of beamed notes.\n * @param alignTuplets If `false`, ignores tuplets.\n */\n static AlignRestsToNotes(tickables, alignAllNotes, alignTuplets) {\n tickables.forEach((currTickable, index) => {\n if (isStaveNote(currTickable) && currTickable.isRest()) {\n if (currTickable.getTuplet() && !alignTuplets) {\n return;\n }\n // If activated rests not on default can be rendered as specified.\n const position = currTickable.getGlyph().position.toUpperCase();\n if (position !== 'R/4' && position !== 'B/4') {\n return;\n }\n if (alignAllNotes || currTickable.getBeam()) {\n // Align rests with previous/next notes.\n const props = currTickable.getKeyProps()[0];\n if (index === 0) {\n props.line = getRestLineForNextNoteGroup(tickables, props.line, index, false);\n }\n else if (index > 0 && index < tickables.length) {\n // If previous tickable is a rest, use its line number.\n const prevTickable = tickables[index - 1];\n if (isStaveNote(prevTickable)) {\n if (prevTickable.isRest()) {\n props.line = prevTickable.getKeyProps()[0].line;\n }\n else {\n const restLine = prevTickable.getLineForRest();\n // Get the rest line for next valid non-rest note group.\n props.line = getRestLineForNextNoteGroup(tickables, restLine, index, true);\n }\n }\n }\n currTickable.setKeyLine(0, props.line);\n }\n }\n });\n }\n /**\n * Find all the rests in each of the `voices` and align them to neighboring notes.\n *\n * @param voices\n * @param alignAllNotes If `false`, only align rests within beamed groups of notes. If `true`, align all rests.\n */\n alignRests(voices, alignAllNotes) {\n if (!voices || !voices.length) {\n throw new RuntimeError('BadArgument', 'No voices to format rests');\n }\n voices.forEach((voice) => Formatter.AlignRestsToNotes(voice.getTickables(), alignAllNotes));\n }\n /**\n * Estimate the width required to render 'voices'. This is done by:\n * 1. Sum the widths of all the tick contexts\n * 2. Estimate the padding.\n * The latter is done by calculating the padding 3 different ways, and taking the\n * greatest value:\n * 1. the padding required for unaligned notes in different voices\n * 2. the padding based on the stddev of the tickable widths\n * 3. the padding based on the stddev of the tickable durations.\n *\n * The last 2 quantities estimate a 'width entropy', where notes might need more\n * room than the proportional formatting gives them. A measure of all same duration\n * and width will need no extra padding, and all these quantities will be\n * zero in that case.\n *\n * @param voices the voices that contain the notes\n * @returns the estimated width in pixels\n */\n preCalculateMinTotalWidth(voices) {\n const unalignedPadding = Tables.currentMusicFont().lookupMetric('stave.unalignedNotePadding');\n // Calculate additional padding based on 3 methods:\n // 1) unaligned beats in voices, 2) variance of width, 3) variance of durations\n let unalignedCtxCount = 0;\n let wsum = 0;\n let dsum = 0;\n const widths = [];\n const durations = [];\n // Cache results.\n if (this.hasMinTotalWidth)\n return this.minTotalWidth;\n // Create tick contexts if not already created.\n if (!this.tickContexts) {\n if (!voices) {\n throw new RuntimeError('BadArgument', \"'voices' required to run preCalculateMinTotalWidth\");\n }\n this.createTickContexts(voices);\n }\n // eslint-disable-next-line\n const { list: contextList, map: contextMap } = this.tickContexts;\n this.minTotalWidth = 0;\n // Go through each tick context and calculate total width,\n // and also accumulate values used in padding hints\n contextList.forEach((tick) => {\n const context = contextMap[tick];\n context.preFormat();\n // If this TC doesn't have all the voices on it, it's unaligned.\n // so increment the unaligned padding accumulator\n if (context.getTickables().length < voices.length) {\n unalignedCtxCount += 1;\n }\n // Calculate the 'width entropy' over all the Tickables.\n context.getTickables().forEach((t) => {\n wsum += t.getMetrics().width;\n dsum += t.getTicks().value();\n widths.push(t.getMetrics().width);\n durations.push(t.getTicks().value());\n });\n const width = context.getWidth();\n this.minTotalWidth += width;\n });\n this.hasMinTotalWidth = true;\n // normalized (0-1) STDDEV of widths/durations gives us padding hints.\n const wavg = wsum > 0 ? wsum / widths.length : 1 / widths.length;\n const wvar = sumArray(widths.map((ll) => Math.pow(ll - wavg, 2)));\n const wpads = Math.pow(wvar / widths.length, 0.5) / wavg;\n const davg = dsum / durations.length;\n const dvar = sumArray(durations.map((ll) => Math.pow(ll - davg, 2)));\n const dpads = Math.pow(dvar / durations.length, 0.5) / davg;\n // Find max of 3 methods pad the width with that\n const padmax = Math.max(dpads, wpads) * contextList.length * unalignedPadding;\n const unalignedPad = unalignedPadding * unalignedCtxCount;\n return this.minTotalWidth + Math.max(unalignedPad, padmax);\n }\n /**\n * Get minimum width required to render all voices. Either `format` or\n * `preCalculateMinTotalWidth` must be called before this method.\n */\n getMinTotalWidth() {\n if (!this.hasMinTotalWidth) {\n throw new RuntimeError('NoMinTotalWidth', \"Call 'preCalculateMinTotalWidth' or 'preFormat' before calling 'getMinTotalWidth'\");\n }\n return this.minTotalWidth;\n }\n /** Calculate the resolution multiplier for `voices`. */\n static getResolutionMultiplier(voices) {\n if (!voices || !voices.length) {\n throw new RuntimeError('BadArgument', 'No voices to format');\n }\n const totalTicks = voices[0].getTotalTicks();\n const resolutionMultiplier = voices.reduce((accumulator, voice) => {\n if (!voice.getTotalTicks().equals(totalTicks)) {\n throw new RuntimeError('TickMismatch', 'Voices should have same total note duration in ticks.');\n }\n if (voice.getMode() === Voice.Mode.STRICT && !voice.isComplete()) {\n throw new RuntimeError('IncompleteVoice', 'Voice does not have enough notes.');\n }\n return Math.max(accumulator, Fraction.LCM(accumulator, voice.getResolutionMultiplier()));\n }, 1);\n return resolutionMultiplier;\n }\n /** Create a `ModifierContext` for each tick in `voices`. */\n createModifierContexts(voices) {\n const fn = (tickable, context) => tickable.addToModifierContext(context);\n const contexts = createContexts(voices, () => new ModifierContext(), fn);\n this.modifierContexts = contexts;\n return contexts;\n }\n /**\n * Create a `TickContext` for each tick in `voices`. Also calculate the\n * total number of ticks in voices.\n */\n createTickContexts(voices) {\n const fn = (tickable, context, voiceIndex) => context.addTickable(tickable, voiceIndex);\n const contexts = createContexts(voices, (tick) => new TickContext(tick), fn);\n this.tickContexts = contexts;\n const contextArray = this.tickContexts.array;\n contextArray.forEach((context) => {\n context.tContexts = contextArray;\n });\n return contexts;\n }\n /**\n * This is the core formatter logic. Format voices and justify them\n * to `justifyWidth` pixels. `renderingContext` is required to justify elements\n * that can't retreive widths without a canvas. This method sets the `x` positions\n * of all the tickables/notes in the formatter.\n */\n preFormat(justifyWidth = 0, renderingContext, voicesParam, stave) {\n // Initialize context maps.\n const contexts = this.tickContexts;\n if (!contexts) {\n throw new RuntimeError('NoTickContexts', 'preFormat requires TickContexts');\n }\n const { list: contextList, map: contextMap } = contexts;\n // Reset loss history for evaluator.\n this.lossHistory = [];\n // If voices and a stave were provided, set the Stave for each voice\n // and preFormat to apply Y values to the notes;\n if (voicesParam && stave) {\n voicesParam.forEach((voice) => voice.setStave(stave).preFormat());\n }\n // Now distribute the ticks to each tick context, and assign them their\n // own X positions.\n let x = 0;\n let shift = 0;\n this.minTotalWidth = 0;\n let totalTicks = 0;\n // Pass 1: Give each note maximum width requested by context.\n contextList.forEach((tick) => {\n const context = contextMap[tick];\n // Make sure that all tickables in this context have calculated their\n // space requirements.\n context.preFormat();\n const width = context.getWidth();\n this.minTotalWidth += width;\n const maxTicks = context.getMaxTicks().value();\n totalTicks += maxTicks;\n const metrics = context.getMetrics();\n x = x + shift + metrics.totalLeftPx;\n context.setX(x);\n // Calculate shift for the next tick.\n shift = width - metrics.totalLeftPx;\n });\n // Use softmax based on all notes across all staves. (options.globalSoftmax)\n const { globalSoftmax, softmaxFactor, maxIterations } = this.formatterOptions;\n const exp = (tick) => Math.pow(softmaxFactor, (contextMap[tick].getMaxTicks().value() / totalTicks));\n const expTicksUsed = sumArray(contextList.map(exp));\n this.minTotalWidth = x + shift;\n this.hasMinTotalWidth = true;\n // No justification needed. End formatting.\n if (justifyWidth <= 0)\n return this.evaluate();\n // Start justification. Subtract the right extra pixels of the final context because the formatter\n // justifies based on the context's X position, which is the left-most part of the note head.\n const firstContext = contextMap[contextList[0]];\n const lastContext = contextMap[contextList[contextList.length - 1]];\n // Calculate the \"distance error\" between the tick contexts. The expected distance is the spacing proportional to\n // the softmax of the ticks.\n function calculateIdealDistances(adjustedJustifyWidth) {\n const distances = contextList.map((tick, i) => {\n const context = contextMap[tick];\n const voices = context.getTickablesByVoice();\n let backTickable;\n if (i > 0) {\n const prevContext = contextMap[contextList[i - 1]];\n // Go through each tickable and search backwards for another tickable\n // in the same voice. If found, use that duration (ticks) to calculate\n // the expected distance.\n for (let j = i - 1; j >= 0; j--) {\n const backTick = contextMap[contextList[j]];\n const backVoices = backTick.getTickablesByVoice();\n // Look for matching voices between tick contexts.\n const matchingVoices = [];\n Object.keys(voices).forEach((v) => {\n if (backVoices[v]) {\n matchingVoices.push(v);\n }\n });\n if (matchingVoices.length > 0) {\n // Found matching voices, get largest duration\n let maxTicks = 0;\n let maxNegativeShiftPx = Infinity;\n let expectedDistance = 0;\n matchingVoices.forEach((v) => {\n const ticks = backVoices[v].getTicks().value();\n if (ticks > maxTicks) {\n backTickable = backVoices[v];\n maxTicks = ticks;\n }\n // Calculate the limits of the shift based on modifiers, etc.\n const thisTickable = voices[v];\n const insideLeftEdge = thisTickable.getX() -\n (thisTickable.getMetrics().modLeftPx + thisTickable.getMetrics().leftDisplacedHeadPx);\n const backMetrics = backVoices[v].getMetrics();\n const insideRightEdge = backVoices[v].getX() + backMetrics.notePx + backMetrics.modRightPx + backMetrics.rightDisplacedHeadPx;\n // Don't allow shifting if notes in the same voice can collide\n maxNegativeShiftPx = Math.min(maxNegativeShiftPx, insideLeftEdge - insideRightEdge);\n });\n // Don't shift further left than the notehead of the last context. Actually, stay at most 5% to the right\n // so that two different tick contexts don't align across staves.\n maxNegativeShiftPx = Math.min(maxNegativeShiftPx, context.getX() - (prevContext.getX() + adjustedJustifyWidth * 0.05));\n // Calculate the expected distance of the current context from the last matching tickable. The\n // distance is scaled down by the softmax for the voice.\n if (globalSoftmax) {\n const t = totalTicks;\n expectedDistance = (Math.pow(softmaxFactor, (maxTicks / t)) / expTicksUsed) * adjustedJustifyWidth;\n }\n else if (typeof backTickable !== 'undefined') {\n expectedDistance = backTickable.getVoice().softmax(maxTicks) * adjustedJustifyWidth;\n }\n return {\n expectedDistance,\n maxNegativeShiftPx,\n fromTickable: backTickable,\n };\n }\n }\n }\n return { expectedDistance: 0, fromTickablePx: 0, maxNegativeShiftPx: 0 };\n });\n return distances;\n }\n function shiftToIdealDistances(idealDistances) {\n // Distribute ticks to the contexts based on the calculated distance error.\n const centerX = adjustedJustifyWidth / 2;\n let spaceAccum = 0;\n contextList.forEach((tick, index) => {\n const context = contextMap[tick];\n if (index > 0) {\n const contextX = context.getX();\n const ideal = idealDistances[index];\n const errorPx = defined(ideal.fromTickable).getX() + ideal.expectedDistance - (contextX + spaceAccum);\n let negativeShiftPx = 0;\n if (errorPx > 0) {\n spaceAccum += errorPx;\n }\n else if (errorPx < 0) {\n negativeShiftPx = Math.min(ideal.maxNegativeShiftPx, Math.abs(errorPx));\n spaceAccum += -negativeShiftPx;\n }\n context.setX(contextX + spaceAccum);\n }\n // Move center aligned tickables to middle\n context.getCenterAlignedTickables().forEach((tickable) => {\n tickable.setCenterXShift(centerX - context.getX());\n });\n });\n return lastContext.getX() - firstContext.getX();\n }\n const adjustedJustifyWidth = justifyWidth -\n lastContext.getMetrics().notePx -\n lastContext.getMetrics().totalRightPx -\n firstContext.getMetrics().totalLeftPx;\n const musicFont = Tables.currentMusicFont();\n const configMinPadding = musicFont.lookupMetric('stave.endPaddingMin');\n const configMaxPadding = musicFont.lookupMetric('stave.endPaddingMax');\n let targetWidth = adjustedJustifyWidth;\n const distances = calculateIdealDistances(targetWidth);\n let actualWidth = shiftToIdealDistances(distances);\n // Calculate right justification by finding max of (configured value, min distance between tickables)\n // so measures with lots of white space use it evenly, and crowded measures use at least the configured\n // space.\n const calcMinDistance = (targetWidth, distances) => {\n let mdCalc = targetWidth / 2;\n if (distances.length > 1) {\n for (let di = 1; di < distances.length; ++di) {\n mdCalc = Math.min(distances[di].expectedDistance / 2, mdCalc);\n }\n }\n return mdCalc;\n };\n const minDistance = calcMinDistance(targetWidth, distances);\n // Just one context. Done formatting.\n if (contextList.length === 1)\n return 0;\n // right justify to either the configured padding, or the min distance between notes, whichever is greatest.\n // This * 2 keeps the existing formatting unless there is 'a lot' of extra whitespace, which won't break\n // existing visual regression tests.\n const paddingMax = configMaxPadding * 2 < minDistance ? minDistance : configMaxPadding;\n const paddingMin = paddingMax - (configMaxPadding - configMinPadding);\n const maxX = adjustedJustifyWidth - paddingMin;\n let iterations = maxIterations;\n // Adjust justification width until the right margin is as close as possible to the calculated padding,\n // without going over\n while ((actualWidth > maxX && iterations > 0) || (actualWidth + paddingMax < maxX && iterations > 1)) {\n targetWidth -= actualWidth - maxX;\n actualWidth = shiftToIdealDistances(calculateIdealDistances(targetWidth));\n iterations--;\n }\n this.justifyWidth = justifyWidth;\n return this.evaluate();\n }\n /** Calculate the total cost of this formatting decision. */\n evaluate() {\n if (!this.tickContexts)\n return 0;\n const contexts = this.tickContexts;\n const justifyWidth = this.justifyWidth;\n // Calculate available slack per tick context. This works out how much freedom\n // to move a context has in either direction, without affecting other notes.\n this.contextGaps = { total: 0, gaps: [] };\n contexts.list.forEach((tick, index) => {\n if (index === 0)\n return;\n const prevTick = contexts.list[index - 1];\n const prevContext = contexts.map[prevTick];\n const context = contexts.map[tick];\n const prevMetrics = prevContext.getMetrics();\n const currMetrics = context.getMetrics();\n // Calculate X position of right edge of previous note\n const insideRightEdge = prevContext.getX() + prevMetrics.notePx + prevMetrics.totalRightPx;\n // Calculate X position of left edge of current note\n const insideLeftEdge = context.getX() - currMetrics.totalLeftPx;\n const gap = insideLeftEdge - insideRightEdge;\n this.contextGaps.total += gap;\n this.contextGaps.gaps.push({ x1: insideRightEdge, x2: insideLeftEdge });\n // Tell the tick contexts how much they can reposition themselves.\n context.getFormatterMetrics().freedom.left = gap;\n prevContext.getFormatterMetrics().freedom.right = gap;\n });\n // Calculate mean distance in each voice for each duration type, then calculate\n // how far each note is from the mean.\n this.durationStats = {};\n const durationStats = this.durationStats;\n function updateStats(duration, space) {\n const stats = durationStats[duration];\n if (stats === undefined) {\n durationStats[duration] = { mean: space, count: 1 };\n }\n else {\n stats.count += 1;\n stats.mean = (stats.mean + space) / 2;\n }\n }\n this.voices.forEach((voice) => {\n voice.getTickables().forEach((note, i, notes) => {\n const duration = note.getTicks().clone().simplify().toString();\n const metrics = note.getMetrics();\n const formatterMetrics = note.getFormatterMetrics();\n const leftNoteEdge = note.getX() + metrics.notePx + metrics.modRightPx + metrics.rightDisplacedHeadPx;\n let space = 0;\n if (i < notes.length - 1) {\n const rightNote = notes[i + 1];\n const rightMetrics = rightNote.getMetrics();\n const rightNoteEdge = rightNote.getX() - rightMetrics.modLeftPx - rightMetrics.leftDisplacedHeadPx;\n space = rightNoteEdge - leftNoteEdge;\n formatterMetrics.space.used = rightNote.getX() - note.getX();\n rightNote.getFormatterMetrics().freedom.left = space;\n }\n else {\n space = justifyWidth - leftNoteEdge;\n formatterMetrics.space.used = justifyWidth - note.getX();\n }\n formatterMetrics.freedom.right = space;\n updateStats(duration, formatterMetrics.space.used);\n });\n });\n // Calculate how much each note deviates from the mean. Loss function is square\n // root of the sum of squared deviations.\n let totalDeviation = 0;\n this.voices.forEach((voice) => {\n voice.getTickables().forEach((note) => {\n const duration = note.getTicks().clone().simplify().toString();\n const metrics = note.getFormatterMetrics();\n metrics.space.mean = durationStats[duration].mean;\n metrics.duration = duration;\n metrics.iterations += 1;\n metrics.space.deviation = metrics.space.used - metrics.space.mean;\n totalDeviation += Math.pow(metrics.space.deviation, 2);\n });\n });\n this.totalCost = Math.sqrt(totalDeviation);\n this.lossHistory.push(this.totalCost);\n return this.totalCost;\n }\n /**\n * Run a single iteration of rejustification. At a high level, this method calculates\n * the overall \"loss\" (or cost) of this layout, and repositions tickcontexts in an\n * attempt to reduce the cost. You can call this method multiple times until it finds\n * and oscillates around a global minimum.\n * @param alpha the \"learning rate\" for the formatter. It determines how much of a shift\n * the formatter should make based on its cost function.\n */\n tune(options) {\n var _a;\n const contexts = this.tickContexts;\n if (!contexts) {\n return 0;\n }\n const alpha = (_a = options === null || options === void 0 ? void 0 : options.alpha) !== null && _a !== void 0 ? _a : 0.5;\n // Move `current` tickcontext by `shift` pixels, and adjust the freedom\n // on adjacent tickcontexts.\n function move(current, shift, prev, next) {\n current.setX(current.getX() + shift);\n current.getFormatterMetrics().freedom.left += shift;\n current.getFormatterMetrics().freedom.right -= shift;\n if (prev)\n prev.getFormatterMetrics().freedom.right += shift;\n if (next)\n next.getFormatterMetrics().freedom.left -= shift;\n }\n let shift = 0;\n this.totalShift = 0;\n contexts.list.forEach((tick, index, list) => {\n const context = contexts.map[tick];\n const prevContext = index > 0 ? contexts.map[list[index - 1]] : undefined;\n const nextContext = index < list.length - 1 ? contexts.map[list[index + 1]] : undefined;\n move(context, shift, prevContext, nextContext);\n const cost = -sumArray(context.getTickables().map((t) => t.getFormatterMetrics().space.deviation));\n if (cost > 0) {\n shift = -Math.min(context.getFormatterMetrics().freedom.right, Math.abs(cost));\n }\n else if (cost < 0) {\n if (nextContext) {\n shift = Math.min(nextContext.getFormatterMetrics().freedom.right, Math.abs(cost));\n }\n else {\n shift = 0;\n }\n }\n shift *= alpha;\n this.totalShift += shift;\n });\n return this.evaluate();\n }\n /**\n * This is the top-level call for all formatting logic completed\n * after `x` *and* `y` values have been computed for the notes\n * in the voices.\n */\n postFormat() {\n const postFormatContexts = (contexts) => contexts.list.forEach((tick) => contexts.map[tick].postFormat());\n if (this.modifierContexts)\n postFormatContexts(this.modifierContexts);\n if (this.tickContexts)\n postFormatContexts(this.tickContexts);\n return this;\n }\n /**\n * Take all `voices` and create `ModifierContext`s out of them. This tells\n * the formatters that the voices belong on a single stave.\n */\n joinVoices(voices) {\n this.createModifierContexts(voices);\n this.hasMinTotalWidth = false;\n return this;\n }\n /**\n * Align rests in voices, justify the contexts, and position the notes\n * so voices are aligned and ready to render onto the stave. This method\n * mutates the `x` positions of all tickables in `voices`.\n *\n * Voices are full justified to fit in `justifyWidth` pixels.\n *\n * Set `options.context` to the rendering context. Set `options.align_rests`\n * to true to enable rest alignment.\n */\n format(voices, justifyWidth, options) {\n const opts = Object.assign({ align_rests: false }, options);\n this.voices = voices;\n const softmaxFactor = this.formatterOptions.softmaxFactor;\n if (softmaxFactor) {\n this.voices.forEach((v) => v.setSoftmaxFactor(softmaxFactor));\n }\n this.alignRests(voices, opts.align_rests);\n this.createTickContexts(voices);\n this.preFormat(justifyWidth, opts.context, voices, opts.stave);\n // Only postFormat if a stave was supplied for y value formatting\n if (opts.stave)\n this.postFormat();\n return this;\n }\n // This method is just like `format` except that the `justifyWidth` is inferred from the `stave`.\n formatToStave(voices, stave, optionsParam) {\n const options = Object.assign({ context: stave.getContext() }, optionsParam);\n // eslint-disable-next-line\n const justifyWidth = stave.getNoteEndX() - stave.getNoteStartX() - Stave.defaultPadding;\n L('Formatting voices to width: ', justifyWidth);\n return this.format(voices, justifyWidth, options);\n }\n getTickContext(tick) {\n var _a;\n return (_a = this.tickContexts) === null || _a === void 0 ? void 0 : _a.map[tick];\n }\n}\n// To enable logging for this class. Set `Vex.Flow.Formatter.DEBUG` to `true`.\nFormatter.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n/**\n * ## Description\n *\n * Create a new tuplet from the specified notes. The notes must\n * be part of the same voice. If they are of different rhythmic\n * values, then options.num_notes must be set.\n *\n * @constructor\n * @param {Array.} A set of notes: staveNotes,\n * notes, etc... any class that inherits stemmableNote at some\n * point in its prototype chain.\n * @param options: object {\n *\n * num_notes: fit this many notes into...\n * notes_occupied: ...the space of this many notes\n *\n * Together, these two properties make up the tuplet ratio\n * in the form of num_notes : notes_occupied.\n * num_notes defaults to the number of notes passed in, so\n * it is important that if you omit this property, all of\n * the notes passed should be of the same note value.\n * notes_occupied defaults to 2 -- so you should almost\n * certainly pass this parameter for anything other than\n * a basic triplet.\n *\n * location:\n * default 1, which is above the notes: ┌─── 3 ───┐\n * -1 is below the notes └─── 3 ───┘\n *\n * bracketed: boolean, draw a bracket around the tuplet number\n * when true: ┌─── 3 ───┐ when false: 3\n * defaults to true if notes are not beamed, false otherwise\n *\n * ratioed: boolean\n * when true: ┌─── 7:8 ───┐, when false: ┌─── 7 ───┐\n * defaults to true if the difference between num_notes and\n * notes_occupied is greater than 1.\n *\n * y_offset: int, default 0\n * manually offset a tuplet, for instance to avoid collisions\n * with articulations, etc...\n * }\n */\nimport { Element } from './element';\nimport { Formatter } from './formatter';\nimport { Glyph } from './glyph';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { defined, RuntimeError } from './util';\nexport var TupletLocation;\n(function (TupletLocation) {\n TupletLocation[TupletLocation[\"BOTTOM\"] = -1] = \"BOTTOM\";\n TupletLocation[TupletLocation[\"TOP\"] = 1] = \"TOP\";\n})(TupletLocation || (TupletLocation = {}));\nexport class Tuplet extends Element {\n constructor(notes, options = {}) {\n super();\n this.numerator_glyphs = [];\n this.denom_glyphs = [];\n if (!notes || !notes.length) {\n throw new RuntimeError('BadArguments', 'No notes provided for tuplet.');\n }\n this.options = options;\n this.notes = notes;\n this.num_notes = this.options.num_notes != undefined ? this.options.num_notes : notes.length;\n // We accept beats_occupied, but warn that it's deprecated:\n // the preferred property name is now notes_occupied.\n if (this.options.beats_occupied) {\n this.beatsOccupiedDeprecationWarning();\n }\n this.notes_occupied = this.options.notes_occupied || this.options.beats_occupied || 2;\n if (this.options.bracketed != undefined) {\n this.bracketed = this.options.bracketed;\n }\n else {\n this.bracketed = notes.some((note) => !note.hasBeam());\n }\n this.ratioed =\n this.options.ratioed != undefined ? this.options.ratioed : Math.abs(this.notes_occupied - this.num_notes) > 1;\n this.point = Tables.currentMusicFont().lookupMetric('digits.tupletPoint');\n this.y_pos = 16;\n this.x_pos = 100;\n this.width = 200;\n this.setTupletLocation(this.options.location || Tuplet.LOCATION_TOP);\n Formatter.AlignRestsToNotes(notes, true, true);\n this.resolveGlyphs();\n this.attach();\n }\n static get CATEGORY() {\n return Category.Tuplet;\n }\n static get LOCATION_TOP() {\n return TupletLocation.TOP;\n }\n static get LOCATION_BOTTOM() {\n return TupletLocation.BOTTOM;\n }\n static get NESTING_OFFSET() {\n return 15;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static get metrics() {\n return Tables.currentMusicFont().getMetrics().glyphs.tuplet;\n }\n attach() {\n for (let i = 0; i < this.notes.length; i++) {\n const note = this.notes[i];\n note.setTuplet(this);\n }\n }\n detach() {\n for (let i = 0; i < this.notes.length; i++) {\n const note = this.notes[i];\n note.resetTuplet(this);\n }\n }\n /**\n * Set whether or not the bracket is drawn.\n */\n setBracketed(bracketed) {\n this.bracketed = !!bracketed;\n return this;\n }\n /**\n * Set whether or not the ratio is shown.\n */\n setRatioed(ratioed) {\n this.ratioed = !!ratioed;\n return this;\n }\n /**\n * Set the tuplet indicator to be displayed either on the top or bottom of the stave.\n */\n setTupletLocation(location) {\n if (location !== Tuplet.LOCATION_TOP && location !== Tuplet.LOCATION_BOTTOM) {\n // eslint-disable-next-line\n console.warn(`Invalid tuplet location [${location}]. Using Tuplet.LOCATION_TOP.`);\n location = Tuplet.LOCATION_TOP;\n }\n this.location = location;\n return this;\n }\n getNotes() {\n return this.notes;\n }\n getNoteCount() {\n return this.num_notes;\n }\n beatsOccupiedDeprecationWarning() {\n // eslint-disable-next-line\n console.warn('beats_occupied has been deprecated as an option for tuplets. Please use notes_occupied instead.', 'Calls to getBeatsOccupied / setBeatsOccupied should now be routed to getNotesOccupied / setNotesOccupied.', 'The old methods will be removed in VexFlow 5.0.');\n }\n getBeatsOccupied() {\n this.beatsOccupiedDeprecationWarning();\n return this.getNotesOccupied();\n }\n setBeatsOccupied(beats) {\n this.beatsOccupiedDeprecationWarning();\n return this.setNotesOccupied(beats);\n }\n getNotesOccupied() {\n return this.notes_occupied;\n }\n setNotesOccupied(notes) {\n this.detach();\n this.notes_occupied = notes;\n this.resolveGlyphs();\n this.attach();\n }\n resolveGlyphs() {\n this.numerator_glyphs = [];\n let n = this.num_notes;\n while (n >= 1) {\n this.numerator_glyphs.unshift(new Glyph('timeSig' + (n % 10), this.point));\n n = parseInt((n / 10).toString(), 10);\n }\n this.denom_glyphs = [];\n n = this.notes_occupied;\n while (n >= 1) {\n this.denom_glyphs.unshift(new Glyph('timeSig' + (n % 10), this.point));\n n = parseInt((n / 10).toString(), 10);\n }\n }\n // determine how many tuplets are nested within this tuplet\n // on the same side (above/below), to calculate a y\n // offset for this tuplet:\n getNestedTupletCount() {\n const location = this.location;\n const first_note = this.notes[0];\n let maxTupletCount = countTuplets(first_note, location);\n let minTupletCount = countTuplets(first_note, location);\n // Count the tuplets that are on the same side (above/below)\n // as this tuplet:\n function countTuplets(note, location) {\n return note.getTupletStack().filter((tuplet) => tuplet.location === location).length;\n }\n this.notes.forEach((note) => {\n const tupletCount = countTuplets(note, location);\n maxTupletCount = tupletCount > maxTupletCount ? tupletCount : maxTupletCount;\n minTupletCount = tupletCount < minTupletCount ? tupletCount : minTupletCount;\n });\n return maxTupletCount - minTupletCount;\n }\n // determine the y position of the tuplet:\n getYPosition() {\n // offset the tuplet for any nested tuplets between\n // it and the notes:\n const nested_tuplet_y_offset = this.getNestedTupletCount() * Tuplet.NESTING_OFFSET * -this.location;\n // offset the tuplet for any manual y_offset:\n const y_offset = this.options.y_offset || 0;\n // now iterate through the notes and find our highest\n // or lowest locations, to form a base y_pos\n const first_note = this.notes[0];\n let y_pos;\n if (this.location === Tuplet.LOCATION_TOP) {\n y_pos = first_note.checkStave().getYForLine(0) - Tuplet.metrics.topModifierOffset;\n // check modifiers above note to see if they will collide with tuplet beam\n for (let i = 0; i < this.notes.length; ++i) {\n const note = this.notes[i];\n let modLines = 0;\n const mc = note.getModifierContext();\n if (mc) {\n modLines = Math.max(modLines, mc.getState().top_text_line);\n }\n const modY = note.getYForTopText(modLines) - Tuplet.metrics.noteHeadOffset;\n if (note.hasStem() || note.isRest()) {\n const top_y = note.getStemDirection() === Stem.UP\n ? note.getStemExtents().topY - Tuplet.metrics.stemOffset\n : note.getStemExtents().baseY - Tuplet.metrics.noteHeadOffset;\n y_pos = Math.min(top_y, y_pos);\n if (modLines > 0) {\n y_pos = Math.min(modY, y_pos);\n }\n }\n }\n }\n else {\n let lineCheck = Tuplet.metrics.bottomLine; // tuplet default on line 4\n // check modifiers below note to see if they will collide with tuplet beam\n this.notes.forEach((nn) => {\n const mc = nn.getModifierContext();\n if (mc) {\n lineCheck = Math.max(lineCheck, mc.getState().text_line + 1);\n }\n });\n y_pos = first_note.checkStave().getYForLine(lineCheck) + Tuplet.metrics.noteHeadOffset;\n for (let i = 0; i < this.notes.length; ++i) {\n if (this.notes[i].hasStem() || this.notes[i].isRest()) {\n const bottom_y = this.notes[i].getStemDirection() === Stem.UP\n ? this.notes[i].getStemExtents().baseY + Tuplet.metrics.noteHeadOffset\n : this.notes[i].getStemExtents().topY + Tuplet.metrics.stemOffset;\n if (bottom_y > y_pos) {\n y_pos = bottom_y;\n }\n }\n }\n }\n return y_pos + nested_tuplet_y_offset + y_offset;\n }\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n // determine x value of left bound of tuplet\n const first_note = this.notes[0];\n const last_note = this.notes[this.notes.length - 1];\n if (!this.bracketed) {\n this.x_pos = first_note.getStemX();\n this.width = last_note.getStemX() - this.x_pos;\n }\n else {\n this.x_pos = first_note.getTieLeftX() - 5;\n this.width = last_note.getTieRightX() - this.x_pos + 5;\n }\n // determine y value for tuplet\n this.y_pos = this.getYPosition();\n const addGlyphWidth = (width, glyph) => width + defined(glyph.getMetrics().width);\n // calculate total width of tuplet notation\n let width = this.numerator_glyphs.reduce(addGlyphWidth, 0);\n if (this.ratioed) {\n width = this.denom_glyphs.reduce(addGlyphWidth, width);\n width += this.point * 0.32;\n }\n const notation_center_x = this.x_pos + this.width / 2;\n const notation_start_x = notation_center_x - width / 2;\n // draw bracket if the tuplet is not beamed\n if (this.bracketed) {\n const line_width = this.width / 2 - width / 2 - 5;\n // only draw the bracket if it has positive length\n if (line_width > 0) {\n ctx.fillRect(this.x_pos, this.y_pos, line_width, 1);\n ctx.fillRect(this.x_pos + this.width / 2 + width / 2 + 5, this.y_pos, line_width, 1);\n ctx.fillRect(this.x_pos, this.y_pos + (this.location === Tuplet.LOCATION_BOTTOM ? 1 : 0), 1, this.location * 10);\n ctx.fillRect(this.x_pos + this.width, this.y_pos + (this.location === Tuplet.LOCATION_BOTTOM ? 1 : 0), 1, this.location * 10);\n }\n }\n // draw numerator glyphs\n const shiftY = Tables.currentMusicFont().lookupMetric('digits.shiftY', 0);\n let x_offset = 0;\n this.numerator_glyphs.forEach((glyph) => {\n glyph.render(ctx, notation_start_x + x_offset, this.y_pos + this.point / 3 - 2 + shiftY);\n x_offset += defined(glyph.getMetrics().width);\n });\n // display colon and denominator if the ratio is to be shown\n if (this.ratioed) {\n const colon_x = notation_start_x + x_offset + this.point * 0.16;\n const colon_radius = this.point * 0.06;\n ctx.beginPath();\n ctx.arc(colon_x, this.y_pos - this.point * 0.08, colon_radius, 0, Math.PI * 2, true);\n ctx.closePath();\n ctx.fill();\n ctx.beginPath();\n ctx.arc(colon_x, this.y_pos + this.point * 0.12, colon_radius, 0, Math.PI * 2, true);\n ctx.closePath();\n ctx.fill();\n x_offset += this.point * 0.32;\n this.denom_glyphs.forEach((glyph) => {\n glyph.render(ctx, notation_start_x + x_offset, this.y_pos + this.point / 3 - 2 + shiftY);\n x_offset += defined(glyph.getMetrics().width);\n });\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Fraction } from './fraction';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { TupletLocation } from './tuplet';\nimport { Category, isStaveNote, isTabNote } from './typeguard';\nimport { RuntimeError } from './util';\nfunction calculateStemDirection(notes) {\n let lineSum = 0;\n notes.forEach((note) => {\n if (note.keyProps) {\n note.keyProps.forEach((keyProp) => {\n lineSum += keyProp.line - 3;\n });\n }\n });\n if (lineSum >= 0) {\n return Stem.DOWN;\n }\n return Stem.UP;\n}\nfunction getStemSlope(firstNote, lastNote) {\n const firstStemTipY = firstNote.getStemExtents().topY;\n const firstStemX = firstNote.getStemX();\n const lastStemTipY = lastNote.getStemExtents().topY;\n const lastStemX = lastNote.getStemX();\n return (lastStemTipY - firstStemTipY) / (lastStemX - firstStemX);\n}\nconst BEAM_LEFT = 'L';\nconst BEAM_RIGHT = 'R';\nconst BEAM_BOTH = 'B';\n/** `Beams` span over a set of `StemmableNotes`. */\nexport class Beam extends Element {\n constructor(notes, auto_stem = false) {\n super();\n this.slope = 0;\n this.y_shift = 0;\n if (!notes || notes.length === 0) {\n throw new RuntimeError('BadArguments', 'No notes provided for beam.');\n }\n if (notes.length === 1) {\n throw new RuntimeError('BadArguments', 'Too few notes for beam.');\n }\n // Validate beam line, direction and ticks.\n this.ticks = notes[0].getIntrinsicTicks();\n if (this.ticks >= Tables.durationToTicks('4')) {\n throw new RuntimeError('BadArguments', 'Beams can only be applied to notes shorter than a quarter note.');\n }\n let i; // shared iterator\n let note;\n this.stem_direction = Stem.UP;\n for (i = 0; i < notes.length; ++i) {\n note = notes[i];\n if (note.hasStem()) {\n this.stem_direction = note.getStemDirection();\n break;\n }\n }\n let stem_direction = this.stem_direction;\n // Figure out optimal stem direction based on given notes\n if (auto_stem && isStaveNote(notes[0])) {\n stem_direction = calculateStemDirection(notes);\n }\n else if (auto_stem && isTabNote(notes[0])) {\n // Auto Stem TabNotes\n const stem_weight = notes.reduce((memo, note) => memo + note.getStemDirection(), 0);\n stem_direction = stem_weight > -1 ? Stem.UP : Stem.DOWN;\n }\n // Apply stem directions and attach beam to notes\n for (i = 0; i < notes.length; ++i) {\n note = notes[i];\n if (auto_stem) {\n note.setStemDirection(stem_direction);\n this.stem_direction = stem_direction;\n }\n note.setBeam(this);\n }\n this.postFormatted = false;\n this.notes = notes;\n this.beam_count = this.getBeamCount();\n this.break_on_indices = [];\n this.render_options = {\n beam_width: 5,\n max_slope: 0.25,\n min_slope: -0.25,\n slope_iterations: 20,\n slope_cost: 100,\n show_stemlets: false,\n stemlet_extension: 7,\n partial_beam_length: 10,\n flat_beams: false,\n min_flat_beam_offset: 15,\n };\n }\n static get CATEGORY() {\n return Category.Beam;\n }\n /** Get the direction of the beam */\n getStemDirection() {\n return this.stem_direction;\n }\n /**\n * Get the default beam groups for a provided time signature.\n * Attempt to guess if the time signature is not found in table.\n * Currently this is fairly naive.\n */\n static getDefaultBeamGroups(time_sig) {\n if (!time_sig || time_sig === 'c') {\n time_sig = '4/4';\n }\n const defaults = {\n '1/2': ['1/2'],\n '2/2': ['1/2'],\n '3/2': ['1/2'],\n '4/2': ['1/2'],\n '1/4': ['1/4'],\n '2/4': ['1/4'],\n '3/4': ['1/4'],\n '4/4': ['1/4'],\n '1/8': ['1/8'],\n '2/8': ['2/8'],\n '3/8': ['3/8'],\n '4/8': ['2/8'],\n '1/16': ['1/16'],\n '2/16': ['2/16'],\n '3/16': ['3/16'],\n '4/16': ['2/16'],\n };\n const groups = defaults[time_sig];\n if (groups === undefined) {\n // If no beam groups found, naively determine\n // the beam groupings from the time signature\n const beatTotal = parseInt(time_sig.split('/')[0], 10);\n const beatValue = parseInt(time_sig.split('/')[1], 10);\n const tripleMeter = beatTotal % 3 === 0;\n if (tripleMeter) {\n return [new Fraction(3, beatValue)];\n }\n else if (beatValue > 4) {\n return [new Fraction(2, beatValue)];\n }\n else if (beatValue <= 4) {\n return [new Fraction(1, beatValue)];\n }\n }\n else {\n return groups.map((group) => new Fraction().parse(group));\n }\n return [new Fraction(1, 4)];\n }\n /**\n * A helper function to automatically build basic beams for a voice. For more\n * complex auto-beaming use `Beam.generateBeams()`.\n * @param voice the voice to generate the beams for\n * @param stem_direction a stem direction to apply to the entire voice\n * @param groups an array of `Fraction` representing beat groupings for the beam\n */\n static applyAndGetBeams(voice, stem_direction, groups) {\n return Beam.generateBeams(voice.getTickables(), { groups, stem_direction });\n }\n /**\n * A helper function to autimatically build beams for a voice with\n * configuration options.\n *\n * Example configuration object:\n *\n * ```\n * config = {\n * groups: [new Vex.Flow.Fraction(2, 8)],\n * stem_direction: -1,\n * beam_rests: true,\n * beam_middle_only: true,\n * show_stemlets: false\n * };\n * ```\n * @param notes an array of notes to create the beams for\n * @param config the configuration object\n * @param config.stem_direction set to apply the same direction to all notes\n * @param config.beam_rests set to `true` to include rests in the beams\n * @param config.beam_middle_only set to `true` to only beam rests in the middle of the beat\n * @param config.show_stemlets set to `true` to draw stemlets for rests\n * @param config.maintain_stem_directions set to `true` to not apply new stem directions\n * @param config.groups array of `Fractions` that represent the beat structure to beam the notes\n *\n */\n static generateBeams(notes, config = {}) {\n if (!config.groups || !config.groups.length) {\n config.groups = [new Fraction(2, 8)];\n }\n // Convert beam groups to tick amounts\n const tickGroups = config.groups.map((group) => {\n if (!group.multiply) {\n throw new RuntimeError('InvalidBeamGroups', 'The beam groups must be an array of Vex.Flow.Fractions');\n }\n return group.clone().multiply(Tables.RESOLUTION, 1);\n });\n const unprocessedNotes = notes;\n let currentTickGroup = 0;\n let noteGroups = [];\n let currentGroup = [];\n function getTotalTicks(vf_notes) {\n return vf_notes.reduce((memo, note) => note.getTicks().clone().add(memo), new Fraction(0, 1));\n }\n function nextTickGroup() {\n if (tickGroups.length - 1 > currentTickGroup) {\n currentTickGroup += 1;\n }\n else {\n currentTickGroup = 0;\n }\n }\n function createGroups() {\n let nextGroup = [];\n // number of ticks in current group\n let currentGroupTotalTicks = new Fraction(0, 1);\n unprocessedNotes.forEach((unprocessedNote) => {\n nextGroup = [];\n if (unprocessedNote.shouldIgnoreTicks()) {\n noteGroups.push(currentGroup);\n currentGroup = nextGroup;\n return; // Ignore untickables (like bar notes)\n }\n currentGroup.push(unprocessedNote);\n const ticksPerGroup = tickGroups[currentTickGroup].clone();\n const totalTicks = getTotalTicks(currentGroup).add(currentGroupTotalTicks);\n // Double the amount of ticks in a group, if it's an unbeamable tuplet\n const unbeamable = Tables.durationToNumber(unprocessedNote.getDuration()) < 8;\n if (unbeamable && unprocessedNote.getTuplet()) {\n ticksPerGroup.numerator *= 2;\n }\n // If the note that was just added overflows the group tick total\n if (totalTicks.greaterThan(ticksPerGroup)) {\n // If the overflow note can be beamed, start the next group\n // with it. Unbeamable notes leave the group overflowed.\n if (!unbeamable) {\n const note = currentGroup.pop();\n if (note)\n nextGroup.push(note);\n }\n noteGroups.push(currentGroup);\n // We have overflown, so we're going to next tick group. As we might have\n // overflown by more than 1 group, we need to go forward as many times as\n // needed, decreasing currentGroupTotalTicks by as many ticks as there are\n // in current groups as we go forward.\n do {\n currentGroupTotalTicks = totalTicks.subtract(tickGroups[currentTickGroup]);\n nextTickGroup();\n } while (currentGroupTotalTicks.greaterThanEquals(tickGroups[currentTickGroup]));\n currentGroup = nextGroup;\n }\n else if (totalTicks.equals(ticksPerGroup)) {\n noteGroups.push(currentGroup);\n currentGroupTotalTicks = new Fraction(0, 1);\n currentGroup = nextGroup;\n nextTickGroup();\n }\n });\n // Adds any remainder notes beam\n if (currentGroup.length > 0) {\n noteGroups.push(currentGroup);\n }\n }\n function getBeamGroups() {\n return noteGroups.filter((group) => {\n if (group.length > 1) {\n let beamable = true;\n group.forEach((note) => {\n if (note.getIntrinsicTicks() >= Tables.durationToTicks('4')) {\n beamable = false;\n }\n });\n return beamable;\n }\n return false;\n });\n }\n // Splits up groups by Rest\n function sanitizeGroups() {\n const sanitizedGroups = [];\n noteGroups.forEach((group) => {\n let tempGroup = [];\n group.forEach((note, index, group) => {\n const isFirstOrLast = index === 0 || index === group.length - 1;\n const prevNote = group[index - 1];\n const breaksOnEachRest = !config.beam_rests && note.isRest();\n const breaksOnFirstOrLastRest = config.beam_rests && config.beam_middle_only && note.isRest() && isFirstOrLast;\n let breakOnStemChange = false;\n if (config.maintain_stem_directions && prevNote && !note.isRest() && !prevNote.isRest()) {\n const prevDirection = prevNote.getStemDirection();\n const currentDirection = note.getStemDirection();\n breakOnStemChange = currentDirection !== prevDirection;\n }\n const isUnbeamableDuration = parseInt(note.getDuration(), 10) < 8;\n // Determine if the group should be broken at this note\n const shouldBreak = breaksOnEachRest || breaksOnFirstOrLastRest || breakOnStemChange || isUnbeamableDuration;\n if (shouldBreak) {\n // Add current group\n if (tempGroup.length > 0) {\n sanitizedGroups.push(tempGroup);\n }\n // Start a new group. Include the current note if the group\n // was broken up by stem direction, as that note needs to start\n // the next group of notes\n tempGroup = breakOnStemChange ? [note] : [];\n }\n else {\n // Add note to group\n tempGroup.push(note);\n }\n });\n // If there is a remaining group, add it as well\n if (tempGroup.length > 0) {\n sanitizedGroups.push(tempGroup);\n }\n });\n noteGroups = sanitizedGroups;\n }\n function formatStems() {\n noteGroups.forEach((group) => {\n let stemDirection;\n if (config.maintain_stem_directions) {\n const note = findFirstNote(group);\n stemDirection = note ? note.getStemDirection() : Stem.UP;\n }\n else {\n if (config.stem_direction) {\n stemDirection = config.stem_direction;\n }\n else {\n stemDirection = calculateStemDirection(group);\n }\n }\n applyStemDirection(group, stemDirection);\n });\n }\n function findFirstNote(group) {\n for (let i = 0; i < group.length; i++) {\n const note = group[i];\n if (!note.isRest()) {\n return note;\n }\n }\n return false;\n }\n function applyStemDirection(group, direction) {\n group.forEach((note) => {\n note.setStemDirection(direction);\n });\n }\n // Get all of the tuplets in all of the note groups\n function getTuplets() {\n const uniqueTuplets = [];\n // Go through all of the note groups and inspect for tuplets\n noteGroups.forEach((group) => {\n let tuplet;\n group.forEach((note) => {\n const noteTuplet = note.getTuplet();\n if (noteTuplet && tuplet !== noteTuplet) {\n tuplet = noteTuplet;\n uniqueTuplets.push(tuplet);\n }\n });\n });\n return uniqueTuplets;\n }\n // Using closures to store the variables throughout the various functions\n // IMO Keeps it this process lot cleaner - but not super consistent with\n // the rest of the API's style - Silverwolf90 (Cyril)\n createGroups();\n sanitizeGroups();\n formatStems();\n // Get the notes to be beamed\n const beamedNoteGroups = getBeamGroups();\n // Get the tuplets in order to format them accurately\n const allTuplets = getTuplets();\n // Create a Vex.Flow.Beam from each group of notes to be beamed\n const beams = [];\n beamedNoteGroups.forEach((group) => {\n const beam = new Beam(group);\n if (config.show_stemlets) {\n beam.render_options.show_stemlets = true;\n }\n if (config.secondary_breaks) {\n beam.render_options.secondary_break_ticks = Tables.durationToTicks(config.secondary_breaks);\n }\n if (config.flat_beams === true) {\n beam.render_options.flat_beams = true;\n beam.render_options.flat_beam_offset = config.flat_beam_offset;\n }\n beams.push(beam);\n });\n // Reformat tuplets\n allTuplets.forEach((tuplet) => {\n // Set the tuplet location based on the stem direction\n const direction = tuplet.notes[0].stem_direction === Stem.DOWN ? TupletLocation.BOTTOM : TupletLocation.TOP;\n tuplet.setTupletLocation(direction);\n // If any of the notes in the tuplet are not beamed, draw a bracket.\n let bracketed = false;\n for (let i = 0; i < tuplet.notes.length; i++) {\n const note = tuplet.notes[i];\n if (!note.hasBeam()) {\n bracketed = true;\n break;\n }\n }\n tuplet.setBracketed(bracketed);\n });\n return beams;\n }\n /** Get the notes in this beam. */\n getNotes() {\n return this.notes;\n }\n /** Get the max number of beams in the set of notes. */\n getBeamCount() {\n const beamCounts = this.notes.map((note) => note.getGlyph().beam_count);\n const maxBeamCount = beamCounts.reduce((max, beamCount) => (beamCount > max ? beamCount : max));\n return maxBeamCount;\n }\n /** Set which note `indices` to break the secondary beam at. */\n breakSecondaryAt(indices) {\n this.break_on_indices = indices;\n return this;\n }\n /** Return the y coordinate for linear function. */\n getSlopeY(x, first_x_px, first_y_px, slope) {\n return first_y_px + (x - first_x_px) * slope;\n }\n /** Calculate the best possible slope for the provided notes. */\n calculateSlope() {\n const { notes, stem_direction: stemDirection, render_options: { max_slope, min_slope, slope_iterations, slope_cost }, } = this;\n const firstNote = notes[0];\n const initialSlope = getStemSlope(firstNote, notes[notes.length - 1]);\n const increment = (max_slope - min_slope) / slope_iterations;\n let minCost = Number.MAX_VALUE;\n let bestSlope = 0;\n let yShift = 0;\n // iterate through slope values to find best weighted fit\n for (let slope = min_slope; slope <= max_slope; slope += increment) {\n let totalStemExtension = 0;\n let yShiftTemp = 0;\n // iterate through notes, calculating y shift and stem extension\n for (let i = 1; i < notes.length; ++i) {\n const note = notes[i];\n if (note.hasStem() || note.isRest()) {\n const adjustedStemTipY = this.getSlopeY(note.getStemX(), firstNote.getStemX(), firstNote.getStemExtents().topY, slope) + yShiftTemp;\n const stemTipY = note.getStemExtents().topY;\n // beam needs to be shifted up to accommodate note\n if (stemTipY * stemDirection < adjustedStemTipY * stemDirection) {\n const diff = Math.abs(stemTipY - adjustedStemTipY);\n yShiftTemp += diff * -stemDirection;\n totalStemExtension += diff * i;\n }\n else {\n // beam overshoots note, account for the difference\n totalStemExtension += (stemTipY - adjustedStemTipY) * stemDirection;\n }\n }\n }\n // most engraving books suggest aiming for a slope about half the angle of the\n // difference between the first and last notes' stem length;\n const idealSlope = initialSlope / 2;\n const distanceFromIdeal = Math.abs(idealSlope - slope);\n // This tries to align most beams to something closer to the idealSlope, but\n // doesn't go crazy. To disable, set this.render_options.slope_cost = 0\n const cost = slope_cost * distanceFromIdeal + Math.abs(totalStemExtension);\n // update state when a more ideal slope is found\n if (cost < minCost) {\n minCost = cost;\n bestSlope = slope;\n yShift = yShiftTemp;\n }\n }\n this.slope = bestSlope;\n this.y_shift = yShift;\n }\n /** Calculate a slope and y-shift for flat beams. */\n calculateFlatSlope() {\n const { notes, stem_direction, render_options: { beam_width, min_flat_beam_offset, flat_beam_offset }, } = this;\n // If a flat beam offset has not yet been supplied or calculated,\n // generate one based on the notes in this particular note group\n let total = 0;\n let extremeY = 0; // Store the highest or lowest note here\n let extremeBeamCount = 0; // The beam count of the extreme note\n let currentExtreme = 0;\n for (let i = 0; i < notes.length; i++) {\n // Total up all of the offsets so we can average them out later\n const note = notes[i];\n const stemTipY = note.getStemExtents().topY;\n total += stemTipY;\n // Store the highest (stems-up) or lowest (stems-down) note so the\n // offset can be adjusted in case the average isn't enough\n if (stem_direction === Stem.DOWN && currentExtreme < stemTipY) {\n currentExtreme = stemTipY;\n extremeY = Math.max(...note.getYs());\n extremeBeamCount = note.getBeamCount();\n }\n else if (stem_direction === Stem.UP && (currentExtreme === 0 || currentExtreme > stemTipY)) {\n currentExtreme = stemTipY;\n extremeY = Math.min(...note.getYs());\n extremeBeamCount = note.getBeamCount();\n }\n }\n // Average the offsets to try and come up with a reasonable one that\n // works for all of the notes in the beam group.\n let offset = total / notes.length;\n // In case the average isn't long enough, add or subtract some more\n // based on the highest or lowest note (again, based on the stem\n // direction). This also takes into account the added height due to\n // the width of the beams.\n const beamWidth = beam_width * 1.5;\n const extremeTest = min_flat_beam_offset + extremeBeamCount * beamWidth;\n const newOffset = extremeY + extremeTest * -stem_direction;\n if (stem_direction === Stem.DOWN && offset < newOffset) {\n offset = extremeY + extremeTest;\n }\n else if (stem_direction === Stem.UP && offset > newOffset) {\n offset = extremeY - extremeTest;\n }\n if (!flat_beam_offset) {\n // Set the offset for the group based on the calculations above.\n this.render_options.flat_beam_offset = offset;\n }\n else if (stem_direction === Stem.DOWN && offset > flat_beam_offset) {\n this.render_options.flat_beam_offset = offset;\n }\n else if (stem_direction === Stem.UP && offset < flat_beam_offset) {\n this.render_options.flat_beam_offset = offset;\n }\n // for flat beams, the slope and y_shift are simply 0\n this.slope = 0;\n this.y_shift = 0;\n }\n /** Return the Beam y offset. */\n getBeamYToDraw() {\n const firstNote = this.notes[0];\n const firstStemTipY = firstNote.getStemExtents().topY;\n let beamY = firstStemTipY;\n // For flat beams, set the first and last Y to the offset, rather than\n // using the note's stem extents.\n if (this.render_options.flat_beams && this.render_options.flat_beam_offset) {\n beamY = this.render_options.flat_beam_offset;\n }\n return beamY;\n }\n /**\n * Create new stems for the notes in the beam, so that each stem\n * extends into the beams.\n */\n applyStemExtensions() {\n const { notes, slope, y_shift, stem_direction, beam_count, render_options: { show_stemlets, stemlet_extension, beam_width }, } = this;\n const firstNote = notes[0];\n const firstStemTipY = this.getBeamYToDraw();\n const firstStemX = firstNote.getStemX();\n for (let i = 0; i < notes.length; ++i) {\n const note = notes[i];\n const stem = note.getStem();\n if (stem) {\n const stemX = note.getStemX();\n const { topY: stemTipY } = note.getStemExtents();\n const beamedStemTipY = this.getSlopeY(stemX, firstStemX, firstStemTipY, slope) + y_shift;\n const preBeamExtension = stem.getExtension();\n const beamExtension = stem_direction === Stem.UP ? stemTipY - beamedStemTipY : beamedStemTipY - stemTipY;\n stem.setExtension(preBeamExtension + beamExtension);\n stem.adjustHeightForBeam();\n if (note.isRest() && show_stemlets) {\n const beamWidth = beam_width;\n const totalBeamWidth = (beam_count - 1) * beamWidth * 1.5 + beamWidth;\n stem.setVisibility(true).setStemlet(true, totalBeamWidth + stemlet_extension);\n }\n }\n }\n }\n /** Return upper level beam direction. */\n lookupBeamDirection(duration, prev_tick, tick, next_tick) {\n if (duration === '4') {\n return BEAM_LEFT;\n }\n const lookup_duration = `${Tables.durationToNumber(duration) / 2}`;\n const prev_note_gets_beam = prev_tick < Tables.durationToTicks(lookup_duration);\n const next_note_gets_beam = next_tick < Tables.durationToTicks(lookup_duration);\n const note_gets_beam = tick < Tables.durationToTicks(lookup_duration);\n if (prev_note_gets_beam && next_note_gets_beam && note_gets_beam) {\n return BEAM_BOTH;\n }\n else if (prev_note_gets_beam && !next_note_gets_beam && note_gets_beam) {\n return BEAM_LEFT;\n }\n else if (!prev_note_gets_beam && next_note_gets_beam && note_gets_beam) {\n return BEAM_RIGHT;\n }\n return this.lookupBeamDirection(lookup_duration, prev_tick, tick, next_tick);\n }\n /** Get the x coordinates for the beam lines of specific `duration`. */\n getBeamLines(duration) {\n const tick_of_duration = Tables.durationToTicks(duration);\n let beam_started = false;\n const beam_lines = [];\n let current_beam = undefined;\n const partial_beam_length = this.render_options.partial_beam_length;\n let previous_should_break = false;\n let tick_tally = 0;\n for (let i = 0; i < this.notes.length; ++i) {\n const note = this.notes[i];\n // See if we need to break secondary beams on this note.\n const ticks = note.getTicks().value();\n tick_tally += ticks;\n let should_break = false;\n // 8th note beams are always drawn.\n if (parseInt(duration, 10) >= 8) {\n // First, check to see if any indices were set up through breakSecondaryAt()\n should_break = this.break_on_indices.indexOf(i) !== -1;\n // If the secondary breaks were auto-configured in the render options,\n // handle that as well.\n if (this.render_options.secondary_break_ticks && tick_tally >= this.render_options.secondary_break_ticks) {\n tick_tally = 0;\n should_break = true;\n }\n }\n const note_gets_beam = note.getIntrinsicTicks() < tick_of_duration;\n const stem_x = note.getStemX() - Stem.WIDTH / 2;\n // Check to see if the next note in the group will get a beam at this\n // level. This will help to inform the partial beam logic below.\n const prev_note = this.notes[i - 1];\n const next_note = this.notes[i + 1];\n const next_note_gets_beam = next_note && next_note.getIntrinsicTicks() < tick_of_duration;\n const prev_note_gets_beam = prev_note && prev_note.getIntrinsicTicks() < tick_of_duration;\n const beam_alone = prev_note && next_note && note_gets_beam && !prev_note_gets_beam && !next_note_gets_beam;\n // const beam_alone = note_gets_beam && !prev_note_gets_beam && !next_note_gets_beam;\n if (note_gets_beam) {\n // This note gets a beam at the current level\n if (beam_started) {\n // We're currently in the middle of a beam. Just continue it on to\n // the stem X of the current note.\n current_beam = beam_lines[beam_lines.length - 1];\n current_beam.end = stem_x;\n // If a secondary beam break is set up, end the beam right now.\n if (should_break) {\n beam_started = false;\n if (next_note && !next_note_gets_beam && current_beam.end === undefined) {\n // This note gets a beam,.but the next one does not. This means\n // we need a partial pointing right.\n current_beam.end = current_beam.start - partial_beam_length;\n }\n }\n }\n else {\n // No beam started yet. Start a new one.\n current_beam = { start: stem_x, end: undefined };\n beam_started = true;\n if (beam_alone) {\n // previous and next beam exists and does not get a beam but current gets it.\n const prev_tick = prev_note.getIntrinsicTicks();\n const next_tick = next_note.getIntrinsicTicks();\n const tick = note.getIntrinsicTicks();\n const beam_direction = this.lookupBeamDirection(duration, prev_tick, tick, next_tick);\n if ([BEAM_LEFT, BEAM_BOTH].includes(beam_direction)) {\n current_beam.end = current_beam.start - partial_beam_length;\n }\n else {\n current_beam.end = current_beam.start + partial_beam_length;\n }\n }\n else if (!next_note_gets_beam) {\n // The next note doesn't get a beam. Draw a partial.\n if ((previous_should_break || i === 0) && next_note) {\n // This is the first note (but not the last one), or it is\n // following a secondary break. Draw a partial to the right.\n current_beam.end = current_beam.start + partial_beam_length;\n }\n else {\n // By default, draw a partial to the left.\n current_beam.end = current_beam.start - partial_beam_length;\n }\n }\n else if (should_break) {\n // This note should have a secondary break after it. Even though\n // we just started a beam, it needs to end immediately.\n current_beam.end = current_beam.start - partial_beam_length;\n beam_started = false;\n }\n beam_lines.push(current_beam);\n }\n }\n else {\n // The current note does not get a beam.\n beam_started = false;\n }\n // Store the secondary break flag to inform the partial beam logic in\n // the next iteration of the loop.\n previous_should_break = should_break;\n }\n // Add a partial beam pointing left if this is the last note in the group\n const last_beam = beam_lines[beam_lines.length - 1];\n if (last_beam && last_beam.end === undefined) {\n last_beam.end = last_beam.start - partial_beam_length;\n }\n return beam_lines;\n }\n /** Render the stems for each note. */\n drawStems(ctx) {\n this.notes.forEach((note) => {\n const stem = note.getStem();\n if (stem) {\n stem.setContext(ctx).draw();\n }\n }, this);\n }\n // Render the beam lines\n drawBeamLines(ctx) {\n const valid_beam_durations = ['4', '8', '16', '32', '64'];\n const firstNote = this.notes[0];\n let beamY = this.getBeamYToDraw();\n const firstStemX = firstNote.getStemX();\n const beamThickness = this.render_options.beam_width * this.stem_direction;\n // Draw the beams.\n for (let i = 0; i < valid_beam_durations.length; ++i) {\n const duration = valid_beam_durations[i];\n const beamLines = this.getBeamLines(duration);\n for (let j = 0; j < beamLines.length; ++j) {\n const beam_line = beamLines[j];\n const startBeamX = beam_line.start;\n const startBeamY = this.getSlopeY(startBeamX, firstStemX, beamY, this.slope);\n const lastBeamX = beam_line.end;\n if (lastBeamX) {\n const lastBeamY = this.getSlopeY(lastBeamX, firstStemX, beamY, this.slope);\n ctx.beginPath();\n ctx.moveTo(startBeamX, startBeamY);\n ctx.lineTo(startBeamX, startBeamY + beamThickness);\n ctx.lineTo(lastBeamX + 1, lastBeamY + beamThickness);\n ctx.lineTo(lastBeamX + 1, lastBeamY);\n ctx.closePath();\n ctx.fill();\n }\n else {\n throw new RuntimeError('NoLastBeamX', 'lastBeamX undefined.');\n }\n }\n beamY += beamThickness * 1.5;\n }\n }\n /** Pre-format the beam. */\n preFormat() {\n return this;\n }\n /**\n * Post-format the beam. This can only be called after\n * the notes in the beam have both `x` and `y` values. ie: they've\n * been formatted and have staves.\n */\n postFormat() {\n if (this.postFormatted)\n return;\n // Calculate a smart slope if we're not forcing the beams to be flat.\n if (isTabNote(this.notes[0]) || this.render_options.flat_beams) {\n this.calculateFlatSlope();\n }\n else {\n this.calculateSlope();\n }\n this.applyStemExtensions();\n this.postFormatted = true;\n }\n /** Render the beam to the canvas context */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n if (this.unbeamable)\n return;\n if (!this.postFormatted) {\n this.postFormat();\n }\n this.drawStems(ctx);\n this.applyStyle();\n this.drawBeamLines(ctx);\n this.restoreStyle();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2014\n// MIT License\nimport { Clef } from './clef';\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Category } from './typeguard';\n/** ClefNote implements clef annotations in measures. */\nexport class ClefNote extends Note {\n constructor(type, size, annotation) {\n super({ duration: 'b' });\n this.type = type;\n this.clef_obj = new Clef(type, size, annotation);\n this.clef = this.clef_obj.clef;\n this.glyph = new Glyph(this.clef.code, this.clef.point);\n this.setWidth(this.glyph.getMetrics().width);\n // Note properties\n this.ignore_ticks = true;\n }\n static get CATEGORY() {\n return Category.ClefNote;\n }\n /** Set clef type, size and annotation. */\n setType(type, size, annotation) {\n this.type = type;\n this.clef_obj = new Clef(type, size, annotation);\n this.clef = this.clef_obj.clef;\n this.glyph = new Glyph(this.clef.code, this.clef.point);\n this.setWidth(this.glyph.getMetrics().width);\n return this;\n }\n /** Get associated clef. */\n getClef() {\n return this.clef;\n }\n /** Set associated context. */\n setContext(context) {\n super.setContext(context);\n this.glyph.setContext(this.getContext());\n return this;\n }\n /** Get bounding box. */\n getBoundingBox() {\n return super.getBoundingBox();\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n /** Render clef note. */\n draw() {\n var _a;\n const stave = this.checkStave();\n if (!this.glyph.getContext()) {\n this.glyph.setContext(this.getContext());\n }\n this.setRendered();\n const abs_x = this.getAbsoluteX();\n this.glyph.setStave(stave);\n this.glyph.setYShift(stave.getYForLine((_a = this.clef.line) !== null && _a !== void 0 ? _a : 0) - stave.getYForGlyphs());\n this.glyph.renderToStave(abs_x);\n // If the Vex.Flow.Clef has an annotation, such as 8va, draw it.\n if (this.clef_obj.annotation !== undefined) {\n const attachment = new Glyph(this.clef_obj.annotation.code, this.clef_obj.annotation.point);\n if (!attachment.getContext()) {\n attachment.setContext(this.getContext());\n }\n attachment.setStave(stave);\n attachment.setYShift(stave.getYForLine(this.clef_obj.annotation.line) - stave.getYForGlyphs());\n attachment.setXShift(this.clef_obj.annotation.x_shift);\n attachment.renderToStave(abs_x);\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// This file implements the `Crescendo` object which draws crescendos and\n// decrescendo dynamics markings. A `Crescendo` is initialized with a\n// duration and formatted as part of a `Voice` like any other `Note`\n// type in VexFlow. This object would most likely be formatted in a Voice\n// with `TextNotes` - which are used to represent other dynamics markings.\nimport { Note } from './note';\nimport { TickContext } from './tickcontext';\nimport { Category } from './typeguard';\nimport { log } from './util';\n// To enable logging for this class. Set `Vex.Flow.Crescendo.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (Crescendo.DEBUG)\n log('Vex.Flow.Crescendo', args);\n}\n// Private helper to draw the hairpin\nfunction renderHairpin(ctx, params) {\n const begin_x = params.begin_x;\n const end_x = params.end_x;\n const y = params.y;\n const half_height = params.height / 2;\n ctx.beginPath();\n if (params.reverse) {\n ctx.moveTo(begin_x, y - half_height);\n ctx.lineTo(end_x, y);\n ctx.lineTo(begin_x, y + half_height);\n }\n else {\n ctx.moveTo(end_x, y - half_height);\n ctx.lineTo(begin_x, y);\n ctx.lineTo(end_x, y + half_height);\n }\n ctx.stroke();\n ctx.closePath();\n}\nexport class Crescendo extends Note {\n // Initialize the crescendo's properties\n constructor(noteStruct) {\n super(noteStruct);\n this.options = {\n // Extensions to the length of the crescendo on either side\n extend_left: 0,\n extend_right: 0,\n // Vertical shift\n y_shift: 0,\n };\n // Whether the object is a decrescendo\n this.decrescendo = false;\n // The staff line to be placed on\n this.line = noteStruct.line || 0;\n // The height at the open end of the cresc/decresc\n this.height = 15;\n }\n /** Crescendo category string. */\n static get CATEGORY() {\n return Category.Crescendo;\n }\n // Set the line to center the element on\n setLine(line) {\n this.line = line;\n return this;\n }\n // Set the full height at the open end\n setHeight(height) {\n this.height = height;\n return this;\n }\n // Set whether the sign should be a descresendo by passing a bool\n // to `decresc`\n setDecrescendo(decresc) {\n this.decrescendo = decresc;\n return this;\n }\n // Preformat the note\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n // Render the Crescendo object onto the canvas\n draw() {\n const ctx = this.checkContext();\n const stave = this.checkStave();\n this.setRendered();\n const tick_context = this.getTickContext();\n const next_context = TickContext.getNextContext(tick_context);\n const begin_x = this.getAbsoluteX();\n const end_x = next_context ? next_context.getX() : stave.getX() + stave.getWidth();\n const y = stave.getYForLine(this.line + -3) + 1;\n L('Drawing ', this.decrescendo ? 'decrescendo ' : 'crescendo ', this.height, 'x', begin_x - end_x);\n renderHairpin(ctx, {\n begin_x: begin_x - this.options.extend_left,\n end_x: end_x + this.options.extend_right,\n y: y + this.options.y_shift,\n height: this.height,\n reverse: this.decrescendo,\n });\n }\n}\nCrescendo.DEBUG = false;\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n//\n// This class implements curves (for slurs)\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport var CurvePosition;\n(function (CurvePosition) {\n CurvePosition[CurvePosition[\"NEAR_HEAD\"] = 1] = \"NEAR_HEAD\";\n CurvePosition[CurvePosition[\"NEAR_TOP\"] = 2] = \"NEAR_TOP\";\n})(CurvePosition || (CurvePosition = {}));\nexport class Curve extends Element {\n // from: Start note\n // to: End note\n // options:\n // cps: List of control points\n // x_shift: pixels to shift\n // y_shift: pixels to shift\n constructor(from, to, options) {\n super();\n this.render_options = Object.assign({ thickness: 2, x_shift: 0, y_shift: 10, position: CurvePosition.NEAR_HEAD, position_end: CurvePosition.NEAR_HEAD, invert: false, cps: [\n { x: 0, y: 10 },\n { x: 0, y: 10 },\n ] }, options);\n this.from = from;\n this.to = to;\n }\n static get CATEGORY() {\n return Category.Curve;\n }\n static get Position() {\n return CurvePosition;\n }\n static get PositionString() {\n return {\n nearHead: CurvePosition.NEAR_HEAD,\n nearTop: CurvePosition.NEAR_TOP,\n };\n }\n setNotes(from, to) {\n if (!from && !to) {\n throw new RuntimeError('BadArguments', 'Curve needs to have either `from` or `to` set.');\n }\n this.from = from;\n this.to = to;\n return this;\n }\n /**\n * @return {boolean} Returns true if this is a partial bar.\n */\n isPartial() {\n return !this.from || !this.to;\n }\n renderCurve(params) {\n const ctx = this.checkContext();\n const x_shift = this.render_options.x_shift;\n const y_shift = this.render_options.y_shift * params.direction;\n const first_x = params.first_x + x_shift;\n const first_y = params.first_y + y_shift;\n const last_x = params.last_x - x_shift;\n const last_y = params.last_y + y_shift;\n const thickness = this.render_options.thickness;\n const cps = this.render_options.cps;\n const { x: cp0x, y: cp0y } = cps[0];\n const { x: cp1x, y: cp1y } = cps[1];\n const cp_spacing = (last_x - first_x) / (cps.length + 2);\n ctx.beginPath();\n ctx.moveTo(first_x, first_y);\n ctx.bezierCurveTo(first_x + cp_spacing + cp0x, first_y + cp0y * params.direction, last_x - cp_spacing + cp1x, last_y + cp1y * params.direction, last_x, last_y);\n ctx.bezierCurveTo(last_x - cp_spacing + cp1x, last_y + (cp1y + thickness) * params.direction, first_x + cp_spacing + cp0x, first_y + (cp0y + thickness) * params.direction, first_x, first_y);\n ctx.stroke();\n ctx.closePath();\n ctx.fill();\n }\n draw() {\n this.checkContext();\n this.setRendered();\n const first_note = this.from;\n const last_note = this.to;\n let first_x;\n let last_x;\n let first_y;\n let last_y;\n let stem_direction = 0;\n let metric = 'baseY';\n let end_metric = 'baseY';\n function getPosition(position) {\n return typeof position === 'string' ? Curve.PositionString[position] : position;\n }\n const position = getPosition(this.render_options.position);\n const position_end = getPosition(this.render_options.position_end);\n if (position === CurvePosition.NEAR_TOP) {\n metric = 'topY';\n end_metric = 'topY';\n }\n if (position_end === CurvePosition.NEAR_HEAD) {\n end_metric = 'baseY';\n }\n else if (position_end === CurvePosition.NEAR_TOP) {\n end_metric = 'topY';\n }\n if (first_note) {\n first_x = first_note.getTieRightX();\n stem_direction = first_note.getStemDirection();\n first_y = first_note.getStemExtents()[metric];\n }\n else {\n const stave = last_note.checkStave();\n first_x = stave.getTieStartX();\n first_y = last_note.getStemExtents()[metric];\n }\n if (last_note) {\n last_x = last_note.getTieLeftX();\n stem_direction = last_note.getStemDirection();\n last_y = last_note.getStemExtents()[end_metric];\n }\n else {\n const stave = first_note.checkStave();\n last_x = stave.getTieEndX();\n last_y = first_note.getStemExtents()[end_metric];\n }\n this.renderCurve({\n first_x,\n last_x,\n first_y,\n last_y,\n direction: stem_direction * (this.render_options.invert === true ? -1 : 1),\n });\n return true;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// A generic text parsing class for VexFlow.\nimport { log, RuntimeError } from './util';\n// To enable logging for this class. Set `Vex.Flow.Parser.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (Parser.DEBUG)\n log('Vex.Flow.Parser', args);\n}\nconst NO_ERROR_POS = -1;\n// Converts parser results into an easy to reference list that can be\n// used in triggers. This function returns:\n// - nested array in which the leaf elements are string or null\n// - string (including empty strings)\n// - null\nfunction flattenMatches(r) {\n if ('matchedString' in r)\n return r.matchedString; // string\n if ('results' in r)\n return flattenMatches(r.results);\n const results = r;\n if (results.length === 1)\n return flattenMatches(results[0]);\n if (results.length === 0)\n return null;\n return results.map(flattenMatches); // nested array\n}\n// This is the base parser class. Given an arbitrary context-free grammar, it\n// can parse any line and execute code when specific rules are met (e.g.,\n// when a string is terminated.)\nexport class Parser {\n // For an example of a simple grammar, take a look at tests/parser_tests.ts or\n // the EasyScore grammar in easyscore.ts.\n constructor(grammar) {\n this.grammar = grammar;\n this.line = '';\n this.pos = 0;\n this.errorPos = NO_ERROR_POS;\n }\n // Parse `line` using current grammar. Returns `{success: true}` if the\n // line parsed correctly, otherwise returns `{success: false, errorPos: N}`\n // where `errorPos` is the location of the error in the string.\n parse(line) {\n this.line = line;\n this.pos = 0;\n this.errorPos = NO_ERROR_POS;\n const result = this.expect(this.grammar.begin());\n result.errorPos = this.errorPos;\n return result;\n }\n matchFail(returnPos) {\n if (this.errorPos === NO_ERROR_POS)\n this.errorPos = this.pos;\n this.pos = returnPos;\n }\n matchSuccess() {\n this.errorPos = NO_ERROR_POS;\n }\n // Look for `token` in this.line[this.pos], and return success\n // if one is found. `token` is specified as a regular expression.\n matchToken(token, noSpace = false) {\n const regexp = noSpace ? new RegExp('^((' + token + '))') : new RegExp('^((' + token + ')\\\\s*)');\n const workingLine = this.line.slice(this.pos);\n const result = workingLine.match(regexp);\n if (result !== null) {\n return {\n success: true,\n matchedString: result[2],\n incrementPos: result[1].length,\n pos: this.pos,\n };\n }\n else {\n return { success: false, pos: this.pos };\n }\n }\n // Execute rule to match a sequence of tokens (or rules). If `maybe` is\n // set, then return success even if the token is not found, but reset\n // the position before exiting.\n // TODO: expectOne(...) is never called with the `maybe` parameter.\n expectOne(rule, maybe = false) {\n const results = [];\n const pos = this.pos;\n let allMatches = true;\n let oneMatch = false;\n maybe = maybe === true || rule.maybe === true;\n // Execute all sub rules in sequence.\n if (rule.expect) {\n for (const next of rule.expect) {\n const localPos = this.pos;\n const result = this.expect(next);\n // If `rule.or` is set, then return success if any one\n // of the subrules match, else all subrules must match.\n if (result.success) {\n results.push(result);\n oneMatch = true;\n if (rule.or)\n break;\n }\n else {\n allMatches = false;\n if (!rule.or) {\n this.pos = localPos;\n break;\n }\n }\n }\n }\n const gotOne = (rule.or && oneMatch) || allMatches;\n const success = gotOne || maybe === true;\n const numMatches = gotOne ? 1 : 0;\n if (maybe && !gotOne)\n this.pos = pos;\n if (success) {\n this.matchSuccess();\n }\n else {\n this.matchFail(pos);\n }\n return { success, results, numMatches };\n }\n // Try to match multiple (one or more) instances of the rule. If `maybe` is set,\n // then a failed match is also a success (but the position is reset).\n expectOneOrMore(rule, maybe = false) {\n const results = [];\n const pos = this.pos;\n let numMatches = 0;\n let more = true;\n do {\n const result = this.expectOne(rule);\n if (result.success && result.results) {\n numMatches++;\n results.push(result.results);\n }\n else {\n more = false;\n }\n } while (more);\n const success = numMatches > 0 || maybe === true;\n if (maybe && !(numMatches > 0))\n this.pos = pos;\n if (success) {\n this.matchSuccess();\n }\n else {\n this.matchFail(pos);\n }\n return { success, results, numMatches };\n }\n // Match zero or more instances of `rule`. Offloads to `expectOneOrMore`.\n expectZeroOrMore(rule) {\n return this.expectOneOrMore(rule, true);\n }\n // Execute the rule produced by the provided `rules` function. This\n // offloads to one of the above matchers and consolidates the results. It is also\n // responsible for executing any code triggered by the rule (in `rule.run`.)\n expect(ruleFunc) {\n L('Evaluating rule function:', ruleFunc);\n if (!ruleFunc) {\n throw new RuntimeError('Invalid rule function');\n }\n let result;\n // Get rule from Grammar class.\n // expect(...) handles both lexing & parsing:\n // - lexer rules produce tokens.\n // - parser rules produce expressions which may trigger code via the\n // { run: () => ... } trigger functions in easyscore.ts.\n // These functions build the VexFlow objects that are displayed on screen.\n const rule = ruleFunc.bind(this.grammar)();\n if (rule.token) {\n // A lexer rule has a `token` property.\n // Base case: parse the regex and throw an error if the\n // line doesn't match.\n result = this.matchToken(rule.token, rule.noSpace === true);\n if (result.success) {\n // Token match! Update position and throw away parsed portion\n // of string.\n this.pos += result.incrementPos;\n }\n }\n else if (rule.expect) {\n // A parser rule has an `expect` property.\n if (rule.oneOrMore) {\n result = this.expectOneOrMore(rule);\n }\n else if (rule.zeroOrMore) {\n result = this.expectZeroOrMore(rule);\n }\n else {\n result = this.expectOne(rule);\n }\n }\n else {\n L(rule);\n throw new RuntimeError('Bad grammar! No `token` or `expect` property ' + rule);\n }\n // If there's a trigger attached to this rule, then run it.\n // Make the matches accessible through `state.matches` in the\n // `run: (state) => ...` trigger.\n const matches = [];\n result.matches = matches;\n if (result.results) {\n result.results.forEach((r) => matches.push(flattenMatches(r)));\n }\n if (rule.run && result.success) {\n rule.run({ matches });\n }\n return result;\n }\n}\nParser.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Articulation } from './articulation';\nimport { Dot } from './dot';\nimport { FretHandFinger } from './frethandfinger';\nimport { Music } from './music';\nimport { Parser } from './parser';\nimport { Stem } from './stem';\nimport { defined, log, RuntimeError } from './util';\n// To enable logging for this class. Set `Vex.Flow.EasyScore.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (EasyScore.DEBUG)\n log('Vex.Flow.EasyScore', args);\n}\nexport class EasyScoreGrammar {\n constructor(builder) {\n this.builder = builder;\n }\n begin() {\n return this.LINE;\n }\n LINE() {\n return {\n expect: [this.PIECE, this.PIECES, this.EOL],\n };\n }\n PIECE() {\n return {\n expect: [this.CHORDORNOTE, this.PARAMS],\n run: () => this.builder.commitPiece(),\n };\n }\n PIECES() {\n return {\n expect: [this.COMMA, this.PIECE],\n zeroOrMore: true,\n };\n }\n PARAMS() {\n return {\n expect: [this.DURATION, this.TYPE, this.DOTS, this.OPTS],\n };\n }\n CHORDORNOTE() {\n return {\n expect: [this.CHORD, this.SINGLENOTE],\n or: true,\n };\n }\n CHORD() {\n return {\n expect: [this.LPAREN, this.NOTES, this.RPAREN],\n // eslint-disable-next-line\n run: (state) => this.builder.addChord(state.matches[1]),\n };\n }\n NOTES() {\n return {\n expect: [this.NOTE],\n oneOrMore: true,\n };\n }\n NOTE() {\n return {\n expect: [this.NOTENAME, this.ACCIDENTAL, this.OCTAVE],\n };\n }\n SINGLENOTE() {\n return {\n expect: [this.NOTENAME, this.ACCIDENTAL, this.OCTAVE],\n run: (state) => {\n // eslint-disable-next-line\n const s = state;\n this.builder.addSingleNote(s.matches[0], s.matches[1], s.matches[2]);\n },\n };\n }\n ACCIDENTAL() {\n return {\n expect: [this.MICROTONES, this.ACCIDENTALS],\n maybe: true,\n or: true,\n };\n }\n DOTS() {\n return {\n expect: [this.DOT],\n zeroOrMore: true,\n // eslint-disable-next-line\n run: (state) => this.builder.setNoteDots(state.matches),\n };\n }\n TYPE() {\n return {\n expect: [this.SLASH, this.MAYBESLASH, this.TYPES],\n maybe: true,\n // eslint-disable-next-line\n run: (state) => this.builder.setNoteType(state.matches[2]),\n };\n }\n DURATION() {\n return {\n expect: [this.SLASH, this.DURATIONS],\n maybe: true,\n // eslint-disable-next-line\n run: (state) => this.builder.setNoteDuration(state.matches[1]),\n };\n }\n OPTS() {\n return {\n expect: [this.LBRACKET, this.KEYVAL, this.KEYVALS, this.RBRACKET],\n maybe: true,\n };\n }\n KEYVALS() {\n return {\n expect: [this.COMMA, this.KEYVAL],\n zeroOrMore: true,\n };\n }\n KEYVAL() {\n const unquote = (str) => str.slice(1, -1);\n return {\n expect: [this.KEY, this.EQUALS, this.VAL],\n // eslint-disable-next-line\n run: (state) => this.builder.addNoteOption(state.matches[0], unquote(state.matches[2])),\n };\n }\n VAL() {\n return {\n expect: [this.SVAL, this.DVAL],\n or: true,\n };\n }\n KEY() {\n return { token: '[a-zA-Z][a-zA-Z0-9]*' };\n }\n DVAL() {\n return { token: '[\"][^\"]*[\"]' };\n }\n SVAL() {\n return { token: \"['][^']*[']\" };\n }\n NOTENAME() {\n return { token: '[a-gA-G]' };\n }\n OCTAVE() {\n return { token: '[0-9]+' };\n }\n ACCIDENTALS() {\n return { token: 'bb|b|##|#|n' };\n }\n MICROTONES() {\n return { token: 'bbs|bss|bs|db|d|\\\\+\\\\+-|\\\\+-|\\\\+\\\\+|\\\\+|k|o' };\n }\n DURATIONS() {\n return { token: '[0-9whq]+' };\n }\n TYPES() {\n return { token: '[rRsSmMhHgG]' };\n }\n LPAREN() {\n return { token: '[(]' };\n }\n RPAREN() {\n return { token: '[)]' };\n }\n COMMA() {\n return { token: '[,]' };\n }\n DOT() {\n return { token: '[.]' };\n }\n SLASH() {\n return { token: '[/]' };\n }\n MAYBESLASH() {\n return { token: '[/]?' };\n }\n EQUALS() {\n return { token: '[=]' };\n }\n LBRACKET() {\n return { token: '\\\\[' };\n }\n RBRACKET() {\n return { token: '\\\\]' };\n }\n EOL() {\n return { token: '$' };\n }\n}\nexport class Piece {\n constructor(duration) {\n this.chord = [];\n this.dots = 0;\n this.options = {};\n this.duration = duration;\n }\n}\nexport class Builder {\n constructor(factory) {\n this.commitHooks = [];\n this.factory = factory;\n this.reset();\n }\n reset(options) {\n this.options = Object.assign({ stem: 'auto', clef: 'treble' }, options);\n this.elements = { notes: [], accidentals: [] };\n this.rollingDuration = '8';\n this.resetPiece();\n }\n getFactory() {\n return this.factory;\n }\n getElements() {\n return this.elements;\n }\n addCommitHook(commitHook) {\n this.commitHooks.push(commitHook);\n }\n resetPiece() {\n L('resetPiece');\n this.piece = new Piece(this.rollingDuration);\n }\n setNoteDots(dots) {\n L('setNoteDots:', dots);\n if (dots)\n this.piece.dots = dots.length;\n }\n setNoteDuration(duration) {\n L('setNoteDuration:', duration);\n this.rollingDuration = this.piece.duration = duration || this.rollingDuration;\n }\n setNoteType(type) {\n L('setNoteType:', type);\n if (type)\n this.piece.type = type;\n }\n addNoteOption(key, value) {\n L('addNoteOption: key:', key, 'value:', value);\n this.piece.options[key] = value;\n }\n addNote(key, accid, octave) {\n L('addNote:', key, accid, octave);\n this.piece.chord.push({\n key: key,\n accid,\n octave,\n });\n }\n addSingleNote(key, accid, octave) {\n L('addSingleNote:', key, accid, octave);\n this.addNote(key, accid, octave);\n }\n // notes is an array with 3 entries\n addChord(notes) {\n L('startChord');\n if (typeof notes[0] !== 'object') {\n this.addSingleNote(notes[0]);\n }\n else {\n notes.forEach((n) => {\n if (n)\n this.addNote(...n); // n => [string, string | null, string]\n });\n }\n L('endChord');\n }\n commitPiece() {\n L('commitPiece');\n const { factory } = this;\n if (!factory)\n return;\n const options = Object.assign(Object.assign({}, this.options), this.piece.options);\n // reset() sets this.options.stem & this.options.clef but we check to make sure nothing has changed.\n // e.g., auto | up | down\n const stem = defined(options.stem, 'BadArguments', 'options.stem is not defined').toLowerCase();\n // e.g., treble | bass\n const clef = defined(options.clef, 'BadArguments', 'options.clef is not defined').toLowerCase();\n const { chord, duration, dots, type } = this.piece;\n // Create a string[] that will be assigned to the .keys property of the StaveNote.\n // Each string in the array represents a note pitch and is of the form: {NoteName}{Accidental}/{Octave}\n // Only standard accidentals are included in the .keys property. Microtonal accidentals are not included.\n const standardAccidentals = Music.accidentals;\n const keys = chord.map((notePiece) => {\n var _a;\n return notePiece.key +\n (standardAccidentals.includes((_a = notePiece.accid) !== null && _a !== void 0 ? _a : '') ? notePiece.accid : '') +\n '/' +\n notePiece.octave;\n });\n const auto_stem = stem === 'auto'; // StaveNoteStruct expects the underscore & lowercase.\n // Build a GhostNote or StaveNote using the information we gathered.\n const note = (type === null || type === void 0 ? void 0 : type.toLowerCase()) == 'g'\n ? factory.GhostNote({ duration, dots })\n : factory.StaveNote({ keys, duration, dots, type, clef, auto_stem });\n if (!auto_stem)\n note.setStemDirection(stem === 'up' ? Stem.UP : Stem.DOWN);\n // Attach accidentals.\n const accidentals = [];\n chord.forEach((notePiece, index) => {\n const accid = notePiece.accid;\n if (typeof accid === 'string') {\n const accidental = factory.Accidental({ type: accid });\n note.addModifier(accidental, index);\n accidentals.push(accidental);\n }\n else {\n accidentals.push(undefined);\n }\n });\n // Attach dots.\n for (let i = 0; i < dots; i++)\n Dot.buildAndAttach([note], { all: true });\n this.commitHooks.forEach((commitHook) => commitHook(options, note, this));\n this.elements.notes.push(note);\n this.elements.accidentals.push(accidentals);\n this.resetPiece();\n }\n}\n/**\n * Commit hook used by EasyScore.setOptions().\n */\nfunction setId(options, note) {\n if (options.id === undefined)\n return;\n note.setAttribute('id', options.id);\n}\n// Used by setClass() below.\nconst commaSeparatedRegex = /\\s*,\\s*/;\n/**\n * Commit hook used by EasyScore.setOptions().\n */\nfunction setClass(options, note) {\n if (options.class === undefined)\n return;\n options.class.split(commaSeparatedRegex).forEach((className) => note.addClass(className));\n}\n/**\n * EasyScore implements a parser for a simple language to generate VexFlow objects.\n */\nexport class EasyScore {\n constructor(options = {}) {\n this.defaults = {\n clef: 'treble',\n time: '4/4',\n stem: 'auto',\n };\n this.setOptions(options);\n }\n /**\n * Set the score defaults.\n * clef must be set appropriately to avoid errors when adding Staves.\n * @param defaults.clef default clef ( treble | bass ...) see {@link Clef.types}\n * @param defaults.time default time signature ( 4/4 | 9/8 ...)\n * @param defaults.stem default stem arrangement (auto | up | down)\n * @returns this\n */\n set(defaults) {\n this.defaults = Object.assign(Object.assign({}, this.defaults), defaults);\n return this;\n }\n /**\n * @param options.factory is required.\n * @returns this\n */\n setOptions(options) {\n var _a, _b;\n // eslint-disable-next-line\n const factory = options.factory; // ! operator, because options.factory was set in Factory.EasyScore().\n const builder = (_a = options.builder) !== null && _a !== void 0 ? _a : new Builder(factory);\n this.options = Object.assign(Object.assign({ commitHooks: [setId, setClass, Articulation.easyScoreHook, FretHandFinger.easyScoreHook], throwOnError: false }, options), { factory,\n builder });\n this.factory = factory;\n this.builder = builder;\n this.grammar = new EasyScoreGrammar(this.builder);\n this.parser = new Parser(this.grammar);\n (_b = this.options.commitHooks) === null || _b === void 0 ? void 0 : _b.forEach((commitHook) => this.addCommitHook(commitHook));\n return this;\n }\n setContext(context) {\n this.factory.setContext(context);\n return this;\n }\n parse(line, options = {}) {\n this.builder.reset(options);\n const result = this.parser.parse(line);\n if (!result.success && this.options.throwOnError) {\n L(result);\n throw new RuntimeError('Error parsing line: ' + line);\n }\n return result;\n }\n beam(notes, options) {\n this.factory.Beam({ notes, options });\n return notes;\n }\n tuplet(notes, options) {\n this.factory.Tuplet({ notes, options });\n return notes;\n }\n notes(line, options = {}) {\n options = Object.assign({ clef: this.defaults.clef, stem: this.defaults.stem }, options);\n this.parse(line, options);\n return this.builder.getElements().notes;\n }\n voice(notes, options = {}) {\n options = Object.assign({ time: this.defaults.time }, options);\n return this.factory.Voice(options).addTickables(notes);\n }\n addCommitHook(commitHook) {\n this.builder.addCommitHook(commitHook);\n }\n}\nEasyScore.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\nimport { StemmableNote } from './stemmablenote';\nimport { Category, isAnnotation } from './typeguard';\nimport { RuntimeError } from './util';\nconst ERROR_MSG = 'Ghost note must have valid initialization data to identify duration.';\nexport class GhostNote extends StemmableNote {\n static get CATEGORY() {\n return Category.GhostNote;\n }\n constructor(parameter) {\n if (!parameter) {\n throw new RuntimeError('BadArguments', ERROR_MSG);\n }\n let noteStruct;\n if (typeof parameter === 'string') {\n // Preserve backwards-compatibility\n noteStruct = { duration: parameter };\n }\n else if (typeof parameter === 'object') {\n noteStruct = parameter;\n }\n else {\n throw new RuntimeError('BadArguments', ERROR_MSG);\n }\n super(noteStruct);\n // Note properties\n this.setWidth(0);\n }\n /**\n * @returns true if this note is a type of rest. Rests don't have pitches, but take up space in the score.\n */\n isRest() {\n return true;\n }\n setStave(stave) {\n super.setStave(stave);\n return this;\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n draw() {\n // Draw Annotations\n this.setRendered();\n for (let i = 0; i < this.modifiers.length; ++i) {\n const modifier = this.modifiers[i];\n if (isAnnotation(modifier)) {\n modifier.setContext(this.getContext());\n modifier.drawWithStyle();\n }\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { Note } from './note';\nimport { Category } from './typeguard';\nexport class GlyphNote extends Note {\n constructor(glyph, noteStruct, options) {\n super(noteStruct);\n this.options = Object.assign({ ignoreTicks: false, line: 2 }, options);\n // Note properties\n this.ignore_ticks = this.options.ignoreTicks;\n if (glyph) {\n this.setGlyph(glyph);\n }\n }\n static get CATEGORY() {\n return Category.GlyphNote;\n }\n setGlyph(glyph) {\n this.glyph = glyph;\n this.setWidth(this.glyph.getMetrics().width);\n return this;\n }\n getBoundingBox() {\n return this.glyph.getBoundingBox();\n }\n preFormat() {\n if (!this.preFormatted && this.modifierContext) {\n this.modifierContext.preFormat();\n }\n this.preFormatted = true;\n return this;\n }\n drawModifiers() {\n const ctx = this.checkContext();\n ctx.openGroup('modifiers');\n for (let i = 0; i < this.modifiers.length; i++) {\n const modifier = this.modifiers[i];\n modifier.setContext(ctx);\n modifier.drawWithStyle();\n }\n ctx.closeGroup();\n }\n draw() {\n const stave = this.checkStave();\n const ctx = stave.checkContext();\n this.setRendered();\n ctx.openGroup('glyphNote', this.getAttribute('id'));\n // Context is set when setStave is called on Note\n const glyph = this.glyph;\n if (!glyph.getContext()) {\n glyph.setContext(ctx);\n }\n glyph.setStave(stave);\n glyph.setYShift(stave.getYForLine(this.options.line) - stave.getYForGlyphs());\n const x = this.isCenterAligned() ? this.getAbsoluteX() - this.getWidth() / 2 : this.getAbsoluteX();\n glyph.renderToStave(x);\n this.drawModifiers();\n ctx.closeGroup();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { StaveNote } from './stavenote';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class GraceNote extends StaveNote {\n constructor(noteStruct) {\n super(Object.assign({ glyph_font_scale: Tables.NOTATION_FONT_SCALE * GraceNote.SCALE, stroke_px: GraceNote.LEDGER_LINE_OFFSET }, noteStruct));\n this.slash = noteStruct.slash || false;\n this.slur = true;\n this.buildNoteHeads();\n this.width = 3;\n }\n static get CATEGORY() {\n return Category.GraceNote;\n }\n static get LEDGER_LINE_OFFSET() {\n return 2;\n }\n static get SCALE() {\n return 0.66;\n }\n getStemExtension() {\n if (this.stem_extension_override) {\n return this.stem_extension_override;\n }\n const glyph = this.getGlyph();\n if (glyph) {\n let ret = super.getStemExtension();\n if (glyph.stem) {\n const staveNoteScale = this.getStaveNoteScale();\n ret = (Stem.HEIGHT + ret) * staveNoteScale - Stem.HEIGHT;\n }\n return ret;\n }\n return 0;\n }\n // FIXME: move this to more basic class.\n getStaveNoteScale() {\n return this.render_options.glyph_font_scale / Tables.NOTATION_FONT_SCALE;\n }\n draw() {\n super.draw();\n this.setRendered();\n const stem = this.stem;\n if (this.slash && stem) {\n const staveNoteScale = this.getStaveNoteScale();\n // some magic numbers are based on the staveNoteScale 0.66.\n const offsetScale = staveNoteScale / 0.66;\n let slashBBox = undefined;\n const beam = this.beam;\n if (beam) {\n // FIXME: should render slash after beam?\n if (!beam.postFormatted) {\n beam.postFormat();\n }\n slashBBox = this.calcBeamedNotesSlashBBox(8 * offsetScale, 8 * offsetScale, {\n stem: 6 * offsetScale,\n beam: 5 * offsetScale,\n });\n }\n else {\n const stem_direction = this.getStemDirection();\n const noteHeadBounds = this.getNoteHeadBounds();\n const noteStemHeight = stem.getHeight();\n let x = this.getAbsoluteX();\n let y = stem_direction === Stem.DOWN\n ? noteHeadBounds.y_top - noteStemHeight\n : noteHeadBounds.y_bottom - noteStemHeight;\n let defaultOffsetY = Tables.STEM_HEIGHT;\n defaultOffsetY -= defaultOffsetY / 2.8;\n y += defaultOffsetY * staveNoteScale * stem_direction;\n const offsets = stem_direction === Stem.UP\n ? {\n x1: 1,\n y1: 0,\n x2: 13,\n y2: -9,\n }\n : {\n x1: -4,\n y1: 1,\n x2: 13,\n y2: 9,\n };\n x += offsets.x1 * offsetScale;\n y += offsets.y1 * offsetScale;\n slashBBox = {\n x1: x,\n y1: y,\n x2: x + offsets.x2 * offsetScale,\n y2: y + offsets.y2 * offsetScale,\n };\n }\n // FIXME: avoid staff lines, ledger lines or others.\n const ctx = this.checkContext();\n ctx.save();\n ctx.setLineWidth(1 * offsetScale); // FIXME: use more appropriate value.\n ctx.beginPath();\n ctx.moveTo(slashBBox.x1, slashBBox.y1);\n ctx.lineTo(slashBBox.x2, slashBBox.y2);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n }\n }\n calcBeamedNotesSlashBBox(slashStemOffset, slashBeamOffset, protrusions) {\n const beam = this.beam;\n if (!beam)\n throw new RuntimeError('NoBeam', \"Can't calculate without a beam.\");\n const beam_slope = beam.slope;\n const isBeamEndNote = beam.notes[beam.notes.length - 1] === this;\n const scaleX = isBeamEndNote ? -1 : 1;\n const beam_angle = Math.atan(beam_slope * scaleX);\n // slash line intersecting point on beam.\n const iPointOnBeam = {\n dx: Math.cos(beam_angle) * slashBeamOffset,\n dy: Math.sin(beam_angle) * slashBeamOffset,\n };\n slashStemOffset *= this.getStemDirection();\n const slash_angle = Math.atan((iPointOnBeam.dy - slashStemOffset) / iPointOnBeam.dx);\n const protrusion_stem_dx = Math.cos(slash_angle) * protrusions.stem * scaleX;\n const protrusion_stem_dy = Math.sin(slash_angle) * protrusions.stem;\n const protrusion_beam_dx = Math.cos(slash_angle) * protrusions.beam * scaleX;\n const protrusion_beam_dy = Math.sin(slash_angle) * protrusions.beam;\n const stemX = this.getStemX();\n const stem0X = beam.notes[0].getStemX();\n const stemY = beam.getBeamYToDraw() + (stemX - stem0X) * beam_slope;\n const ret = {\n x1: stemX - protrusion_stem_dx,\n y1: stemY + slashStemOffset - protrusion_stem_dy,\n x2: stemX + iPointOnBeam.dx * scaleX + protrusion_beam_dx,\n y2: stemY + iPointOnBeam.dy + protrusion_beam_dy,\n };\n return ret;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Mark Meeus 2019\nimport { KeySignature } from './keysignature';\nimport { Note } from './note';\nimport { Category } from './typeguard';\nexport class KeySigNote extends Note {\n constructor(keySpec, cancelKeySpec, alterKeySpec) {\n super({ duration: 'b' });\n this.keySignature = new KeySignature(keySpec, cancelKeySpec, alterKeySpec);\n // Note properties\n this.ignore_ticks = true;\n }\n static get CATEGORY() {\n return Category.KeySigNote;\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n preFormat() {\n this.preFormatted = true;\n this.keySignature.setStave(this.checkStave());\n this.setWidth(this.keySignature.getWidth());\n return this;\n }\n draw() {\n const ctx = this.checkStave().checkContext();\n this.setRendered();\n this.keySignature.setX(this.getAbsoluteX());\n this.keySignature.setContext(ctx);\n this.keySignature.draw();\n }\n}\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n//\n// This class implements multiple measure rests.\nimport { Element } from './element';\nimport { Glyph } from './glyph';\nimport { NoteHead } from './notehead';\nimport { StaveModifierPosition } from './stavemodifier';\nimport { Tables } from './tables';\nimport { TimeSignature } from './timesignature';\nimport { Category, isBarline } from './typeguard';\nimport { defined } from './util';\nlet semibreve_rest;\nfunction get_semibreve_rest() {\n if (!semibreve_rest) {\n const noteHead = new NoteHead({ duration: 'w', note_type: 'r' });\n semibreve_rest = {\n glyph_font_scale: noteHead.render_options.glyph_font_scale,\n glyph_code: noteHead.glyph_code,\n width: noteHead.getWidth(),\n };\n }\n return semibreve_rest;\n}\nexport class MultiMeasureRest extends Element {\n /**\n *\n * @param number_of_measures Number of measures.\n * @param options The options object.\n */\n constructor(number_of_measures, options) {\n super();\n this.xs = { left: NaN, right: NaN };\n this.hasPaddingLeft = false;\n this.hasPaddingRight = false;\n this.hasLineThickness = false;\n this.hasSymbolSpacing = false;\n this.number_of_measures = number_of_measures;\n // Keep track of whether these four options were provided.\n this.hasPaddingLeft = typeof options.padding_left === 'number';\n this.hasPaddingRight = typeof options.padding_right === 'number';\n this.hasLineThickness = typeof options.line_thickness === 'number';\n this.hasSymbolSpacing = typeof options.symbol_spacing === 'number';\n const musicFont = Tables.currentMusicFont();\n this.render_options = Object.assign({ use_symbols: false, show_number: true, number_line: -0.5, number_glyph_point: musicFont.lookupMetric('digits.point'), line: 2, spacing_between_lines_px: Tables.STAVE_LINE_DISTANCE, serif_thickness: 2, semibreve_rest_glyph_scale: Tables.NOTATION_FONT_SCALE, padding_left: 0, padding_right: 0, line_thickness: 5, symbol_spacing: 0 }, options);\n const fontLineShift = musicFont.lookupMetric('digits.shiftLine', 0);\n this.render_options.number_line += fontLineShift;\n }\n static get CATEGORY() {\n return Category.MultiMeasureRest;\n }\n getXs() {\n return this.xs;\n }\n setStave(stave) {\n this.stave = stave;\n return this;\n }\n getStave() {\n return this.stave;\n }\n checkStave() {\n return defined(this.stave, 'NoStave', 'No stave attached to instance.');\n }\n drawLine(stave, ctx, left, right, spacingBetweenLines) {\n const options = this.render_options;\n const y = stave.getYForLine(options.line);\n const padding = (right - left) * 0.1;\n left += padding;\n right -= padding;\n let lineThicknessHalf;\n if (this.hasLineThickness) {\n lineThicknessHalf = options.line_thickness * 0.5;\n }\n else {\n lineThicknessHalf = spacingBetweenLines * 0.25;\n }\n const serifThickness = options.serif_thickness;\n const top = y - spacingBetweenLines;\n const bot = y + spacingBetweenLines;\n const leftIndented = left + serifThickness;\n const rightIndented = right - serifThickness;\n const lineTop = y - lineThicknessHalf;\n const lineBottom = y + lineThicknessHalf;\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(left, top);\n ctx.lineTo(leftIndented, top);\n ctx.lineTo(leftIndented, lineTop);\n ctx.lineTo(rightIndented, lineTop);\n ctx.lineTo(rightIndented, top);\n ctx.lineTo(right, top);\n ctx.lineTo(right, bot);\n ctx.lineTo(rightIndented, bot);\n ctx.lineTo(rightIndented, lineBottom);\n ctx.lineTo(leftIndented, lineBottom);\n ctx.lineTo(leftIndented, bot);\n ctx.lineTo(left, bot);\n ctx.closePath();\n ctx.fill();\n }\n drawSymbols(stave, ctx, left, right, spacingBetweenLines) {\n const n4 = Math.floor(this.number_of_measures / 4);\n const n = this.number_of_measures % 4;\n const n2 = Math.floor(n / 2);\n const n1 = n % 2;\n const options = this.render_options;\n // FIXME: TODO: invalidate semibreve_rest at the appropriate time\n // (e.g., if the system font settings are changed).\n semibreve_rest = undefined;\n const rest = get_semibreve_rest();\n const rest_scale = options.semibreve_rest_glyph_scale;\n const rest_width = rest.width * (rest_scale / rest.glyph_font_scale);\n const glyphs = {\n 2: {\n width: rest_width * 0.5,\n height: spacingBetweenLines,\n },\n 1: {\n width: rest_width,\n },\n };\n /* 10: normal spacingBetweenLines */\n const spacing = this.hasSymbolSpacing ? options.symbol_spacing : 10;\n const width = n4 * glyphs[2].width + n2 * glyphs[2].width + n1 * glyphs[1].width + (n4 + n2 + n1 - 1) * spacing;\n let x = left + (right - left) * 0.5 - width * 0.5;\n const line = options.line;\n const yTop = stave.getYForLine(line - 1);\n const yMiddle = stave.getYForLine(line);\n const yBottom = stave.getYForLine(line + 1);\n ctx.save();\n ctx.setStrokeStyle('none');\n ctx.setLineWidth(0);\n for (let i = 0; i < n4; ++i) {\n ctx.fillRect(x, yMiddle - glyphs[2].height, glyphs[2].width, glyphs[2].height);\n ctx.fillRect(x, yBottom - glyphs[2].height, glyphs[2].width, glyphs[2].height);\n x += glyphs[2].width + spacing;\n }\n for (let i = 0; i < n2; ++i) {\n ctx.fillRect(x, yMiddle - glyphs[2].height, glyphs[2].width, glyphs[2].height);\n x += glyphs[2].width + spacing;\n }\n for (let i = 0; i < n1; ++i) {\n Glyph.renderGlyph(ctx, x, yTop, rest_scale, rest.glyph_code);\n x += glyphs[1].width + spacing;\n }\n ctx.restore();\n }\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n const stave = this.checkStave();\n let left = stave.getNoteStartX();\n let right = stave.getNoteEndX();\n // FIXME: getNoteStartX() returns x + 5(barline width)\n // getNoteEndX() returns x + width(no barline width)\n // See Stave constructor. How do we fix this?\n // Here, we subtract the barline width.\n const begModifiers = stave.getModifiers(StaveModifierPosition.BEGIN);\n if (begModifiers.length === 1 && isBarline(begModifiers[0])) {\n left -= begModifiers[0].getWidth();\n }\n const options = this.render_options;\n if (this.hasPaddingLeft) {\n left = stave.getX() + options.padding_left;\n }\n if (this.hasPaddingRight) {\n right = stave.getX() + stave.getWidth() - options.padding_right;\n }\n this.xs.left = left;\n this.xs.right = right;\n const spacingBetweenLines = options.spacing_between_lines_px;\n if (options.use_symbols) {\n this.drawSymbols(stave, ctx, left, right, spacingBetweenLines);\n }\n else {\n this.drawLine(stave, ctx, left, right, spacingBetweenLines);\n }\n if (options.show_number) {\n const timeSpec = '/' + this.number_of_measures;\n const timeSig = new TimeSignature(timeSpec, 0, false);\n timeSig.point = options.number_glyph_point;\n timeSig.setTimeSig(timeSpec);\n timeSig.setStave(stave);\n timeSig.setX(left + (right - left) * 0.5 - timeSig.getInfo().glyph.getMetrics().width * 0.5);\n timeSig.bottomLine = options.number_line;\n timeSig.setContext(ctx).draw();\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Element } from './element';\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Glyph } from './glyph';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (PedalMarking.DEBUG)\n log('Vex.Flow.PedalMarking', args);\n}\n/**\n * Draws a pedal glyph with the provided `name` on a rendering `context`\n * at the coordinates `x` and `y. Takes into account the glyph data\n * coordinate shifts.\n */\nfunction drawPedalGlyph(name, context, x, y, point) {\n const glyph_data = PedalMarking.GLYPHS[name];\n const glyph = new Glyph(glyph_data.code, point, { category: 'pedalMarking' });\n glyph.render(context, x + glyph_data.x_shift, y + glyph_data.y_shift);\n}\n/**\n * PedalMarking implements different types of pedal markings. These notation\n * elements indicate to the performer when to depress and release the a pedal.\n *\n * In order to create \"Sostenuto\", and \"una corda\" markings, you must set\n * custom text for the release/depress pedal markings.\n */\nexport class PedalMarking extends Element {\n constructor(notes) {\n super();\n this.notes = notes;\n this.type = PedalMarking.type.TEXT;\n this.line = 0;\n // Custom text for the release/depress markings\n this.custom_depress_text = '';\n this.custom_release_text = '';\n this.resetFont();\n this.render_options = {\n bracket_height: 10,\n text_margin_right: 6,\n bracket_line_width: 1,\n color: 'black',\n };\n }\n static get CATEGORY() {\n return Category.PedalMarking;\n }\n /**\n * Create a sustain pedal marking. Returns the defaults PedalMarking.\n * Which uses the traditional \"Ped\" and \"*\"\" markings.\n */\n static createSustain(notes) {\n const pedal = new PedalMarking(notes);\n return pedal;\n }\n /** Create a sostenuto pedal marking */\n static createSostenuto(notes) {\n const pedal = new PedalMarking(notes);\n pedal.setType(PedalMarking.type.MIXED);\n pedal.setCustomText('Sost. Ped.');\n return pedal;\n }\n /** Create an una corda pedal marking */\n static createUnaCorda(notes) {\n const pedal = new PedalMarking(notes);\n pedal.setType(PedalMarking.type.TEXT);\n pedal.setCustomText('una corda', 'tre corda');\n return pedal;\n }\n /** Set pedal type. */\n setType(type) {\n type = typeof type === 'string' ? PedalMarking.typeString[type] : type;\n if (type >= PedalMarking.type.TEXT && type <= PedalMarking.type.MIXED) {\n this.type = type;\n }\n return this;\n }\n /**\n * Set custom text for the `depress`/`release` pedal markings. No text is\n * set if the parameter is falsy.\n */\n setCustomText(depress, release) {\n this.custom_depress_text = depress || '';\n this.custom_release_text = release || '';\n return this;\n }\n /** Set the staff line to render the markings on. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Draw the bracket based pedal markings. */\n drawBracketed() {\n const ctx = this.checkContext();\n let is_pedal_depressed = false;\n let prev_x;\n let prev_y;\n // Iterate through each note\n this.notes.forEach((note, index, notes) => {\n // Each note triggers the opposite pedal action\n is_pedal_depressed = !is_pedal_depressed;\n // Get the initial coordinates for the note\n const x = note.getAbsoluteX();\n const y = note.checkStave().getYForBottomText(this.line + 3);\n // Throw if current note is positioned before the previous note\n if (x < prev_x) {\n throw new RuntimeError('InvalidConfiguration', 'The notes provided must be in order of ascending x positions');\n }\n // Determine if the previous or next note are the same\n // as the current note. We need to keep track of this for\n // when adjustments are made for the release+depress action\n const next_is_same = notes[index + 1] === note;\n const prev_is_same = notes[index - 1] === note;\n let x_shift = 0;\n const point = Tables.currentMusicFont().lookupMetric(`pedalMarking.${is_pedal_depressed ? 'down' : 'up'}.point`);\n if (is_pedal_depressed) {\n // Adjustment for release+depress\n x_shift = prev_is_same ? 5 : 0;\n if (this.type === PedalMarking.type.MIXED && !prev_is_same) {\n // For MIXED style, start with text instead of bracket\n if (this.custom_depress_text) {\n // If we have custom text, use instead of the default \"Ped\" glyph\n const text_width = ctx.measureText(this.custom_depress_text).width;\n ctx.fillText(this.custom_depress_text, x - text_width / 2, y);\n x_shift = text_width / 2 + this.render_options.text_margin_right;\n }\n else {\n // Render the Ped glyph in position\n drawPedalGlyph('pedal_depress', ctx, x, y, point);\n x_shift = 20 + this.render_options.text_margin_right;\n }\n }\n else {\n // Draw start bracket\n ctx.beginPath();\n ctx.moveTo(x, y - this.render_options.bracket_height);\n ctx.lineTo(x + x_shift, y);\n ctx.stroke();\n ctx.closePath();\n }\n }\n else {\n // Adjustment for release+depress\n x_shift = next_is_same ? -5 : 0;\n // Draw end bracket\n ctx.beginPath();\n ctx.moveTo(prev_x, prev_y);\n ctx.lineTo(x + x_shift, y);\n ctx.lineTo(x, y - this.render_options.bracket_height);\n ctx.stroke();\n ctx.closePath();\n }\n // Store previous coordinates\n prev_x = x + x_shift;\n prev_y = y;\n });\n }\n /**\n * Draw the text based pedal markings. This defaults to the traditional\n * \"Ped\" and \"*\"\" symbols if no custom text has been provided.\n */\n drawText() {\n const ctx = this.checkContext();\n let is_pedal_depressed = false;\n // Iterate through each note, placing glyphs or custom text accordingly\n this.notes.forEach((note) => {\n is_pedal_depressed = !is_pedal_depressed;\n const stave = note.checkStave();\n const x = note.getAbsoluteX();\n const y = stave.getYForBottomText(this.line + 3);\n const point = Tables.currentMusicFont().lookupMetric(`pedalMarking.${is_pedal_depressed ? 'down' : 'up'}.point`);\n let text_width = 0;\n if (is_pedal_depressed) {\n if (this.custom_depress_text) {\n text_width = ctx.measureText(this.custom_depress_text).width;\n ctx.fillText(this.custom_depress_text, x - text_width / 2, y);\n }\n else {\n drawPedalGlyph('pedal_depress', ctx, x, y, point);\n }\n }\n else {\n if (this.custom_release_text) {\n text_width = ctx.measureText(this.custom_release_text).width;\n ctx.fillText(this.custom_release_text, x - text_width / 2, y);\n }\n else {\n drawPedalGlyph('pedal_release', ctx, x, y, point);\n }\n }\n });\n }\n /** Render the pedal marking in position on the rendering context. */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n ctx.save();\n ctx.setStrokeStyle(this.render_options.color);\n ctx.setFillStyle(this.render_options.color);\n ctx.setFont(this.textFont);\n L('Rendering Pedal Marking');\n if (this.type === PedalMarking.type.BRACKET || this.type === PedalMarking.type.MIXED) {\n ctx.setLineWidth(this.render_options.bracket_line_width);\n this.drawBracketed();\n }\n else if (this.type === PedalMarking.type.TEXT) {\n this.drawText();\n }\n ctx.restore();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.PedalMarking.DEBUG` to `true`. */\nPedalMarking.DEBUG = false;\nPedalMarking.TEXT_FONT = {\n family: Font.SERIF,\n size: 12,\n weight: FontWeight.BOLD,\n style: FontStyle.ITALIC,\n};\n/** Glyph data */\nPedalMarking.GLYPHS = {\n pedal_depress: {\n code: 'keyboardPedalPed',\n x_shift: -10,\n y_shift: 0,\n },\n pedal_release: {\n code: 'keyboardPedalUp',\n x_shift: -2,\n y_shift: 3,\n },\n};\n/** Pedal type as number. */\nPedalMarking.type = {\n TEXT: 1,\n BRACKET: 2,\n MIXED: 3,\n};\n/** Pedal type as string. */\nPedalMarking.typeString = {\n text: PedalMarking.type.TEXT,\n bracket: PedalMarking.type.BRACKET,\n mixed: PedalMarking.type.MIXED,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { Glyph } from './glyph';\nimport { GlyphNote } from './glyphnote';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\n// Map `type` to SMuFL glyph code.\nconst CODES = {\n '1': 'repeat1Bar',\n '2': 'repeat2Bars',\n '4': 'repeat4Bars',\n slash: 'repeatBarSlash',\n};\nexport class RepeatNote extends GlyphNote {\n static get CATEGORY() {\n return Category.RepeatNote;\n }\n constructor(type, noteStruct, options) {\n super(undefined, Object.assign({ duration: 'q', align_center: type !== 'slash' }, noteStruct), options);\n const glyphCode = CODES[type] || 'repeat1Bar';\n const glyph = new Glyph(glyphCode, Tables.currentMusicFont().lookupMetric('repeatNote.point', 40), {\n category: 'repeatNote',\n });\n this.setGlyph(glyph);\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements `StaveLine` which are simply lines that connect\n// two notes. This object is highly configurable, see the `render_options`.\n// A simple line is often used for notating glissando articulations, but you\n// can format a `StaveLine` with arrows or colors for more pedagogical\n// purposes, such as diagrams.\nimport { Element } from './element';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\n// Attribution: Arrow rendering implementations based off of\n// Patrick Horgan's article, \"Drawing lines and arcs with\n// arrow heads on HTML5 Canvas\"\n//\n// Draw an arrow head that connects between 3 coordinates.\nfunction drawArrowHead(ctx, x0, y0, x1, y1, x2, y2) {\n // all cases do this.\n ctx.beginPath();\n ctx.moveTo(x0, y0);\n ctx.lineTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.lineTo(x0, y0);\n ctx.closePath();\n ctx.fill();\n}\nexport class StaveLine extends Element {\n // Initialize the StaveLine with the given `notes`.\n //\n // `notes` is a struct that has:\n //\n // ```\n // {\n // first_note: Note,\n // last_note: Note,\n // first_indices: [n1, n2, n3],\n // last_indices: [n1, n2, n3]\n // }\n // ```\n constructor(notes) {\n super();\n this.setNotes(notes);\n this.text = '';\n this.resetFont();\n this.render_options = {\n // Space to add to the left or the right\n padding_left: 4,\n padding_right: 3,\n // The width of the line in pixels\n line_width: 1,\n // An array of line/space lengths. (TODO/QUESTION: Is this supported in SVG?).\n line_dash: undefined,\n // Can draw rounded line end, instead of a square. (TODO/QUESTION: Is this supported in SVG?).\n rounded_end: true,\n // The color of the line and arrowheads\n color: undefined,\n // Flags to draw arrows on each end of the line\n draw_start_arrow: false,\n draw_end_arrow: false,\n // The length of the arrowhead sides\n arrowhead_length: 10,\n // The angle of the arrowhead\n arrowhead_angle: Math.PI / 8,\n // The position of the text\n text_position_vertical: StaveLine.TextVerticalPosition.TOP,\n text_justification: StaveLine.TextJustification.CENTER,\n };\n }\n static get CATEGORY() {\n return Category.StaveLine;\n }\n // The the annotation for the `StaveLine`\n setText(text) {\n this.text = text;\n return this;\n }\n // Set the notes for the `StaveLine`\n setNotes(notes) {\n if (!notes.first_note && !notes.last_note) {\n throw new RuntimeError('BadArguments', 'Notes needs to have either first_note or last_note set.');\n }\n if (!notes.first_indices)\n notes.first_indices = [0];\n if (!notes.last_indices)\n notes.last_indices = [0];\n if (notes.first_indices.length !== notes.last_indices.length) {\n throw new RuntimeError('BadArguments', 'Connected notes must have same number of indices.');\n }\n this.notes = notes;\n this.first_note = notes.first_note;\n this.first_indices = notes.first_indices;\n this.last_note = notes.last_note;\n this.last_indices = notes.last_indices;\n return this;\n }\n // Apply the style of the `StaveLine` to the context\n applyLineStyle() {\n const ctx = this.checkContext();\n const render_options = this.render_options;\n if (render_options.line_dash) {\n ctx.setLineDash(render_options.line_dash);\n }\n if (render_options.line_width) {\n ctx.setLineWidth(render_options.line_width);\n }\n if (render_options.rounded_end) {\n ctx.setLineCap('round');\n }\n else {\n ctx.setLineCap('square');\n }\n }\n // Apply the text styling to the context\n applyFontStyle() {\n const ctx = this.checkContext();\n ctx.setFont(this.textFont);\n const render_options = this.render_options;\n const color = render_options.color;\n if (color) {\n ctx.setStrokeStyle(color);\n ctx.setFillStyle(color);\n }\n }\n // Helper function to draw a line with arrow heads\n drawArrowLine(ctx, pt1, pt2) {\n const both_arrows = this.render_options.draw_start_arrow && this.render_options.draw_end_arrow;\n const x1 = pt1.x;\n const y1 = pt1.y;\n const x2 = pt2.x;\n const y2 = pt2.y;\n // For ends with arrow we actually want to stop before we get to the arrow\n // so that wide lines won't put a flat end on the arrow.\n const distance = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));\n const ratio = (distance - this.render_options.arrowhead_length / 3) / distance;\n let end_x;\n let end_y;\n let start_x;\n let start_y;\n if (this.render_options.draw_end_arrow || both_arrows) {\n end_x = Math.round(x1 + (x2 - x1) * ratio);\n end_y = Math.round(y1 + (y2 - y1) * ratio);\n }\n else {\n end_x = x2;\n end_y = y2;\n }\n if (this.render_options.draw_start_arrow || both_arrows) {\n start_x = x1 + (x2 - x1) * (1 - ratio);\n start_y = y1 + (y2 - y1) * (1 - ratio);\n }\n else {\n start_x = x1;\n start_y = y1;\n }\n if (this.render_options.color) {\n ctx.setStrokeStyle(this.render_options.color);\n ctx.setFillStyle(this.render_options.color);\n }\n // Draw the shaft of the arrow\n ctx.beginPath();\n ctx.moveTo(start_x, start_y);\n ctx.lineTo(end_x, end_y);\n ctx.stroke();\n ctx.closePath();\n // calculate the angle of the line\n const line_angle = Math.atan2(y2 - y1, x2 - x1);\n // h is the line length of a side of the arrow head\n const h = Math.abs(this.render_options.arrowhead_length / Math.cos(this.render_options.arrowhead_angle));\n let angle1;\n let angle2;\n let top_x;\n let top_y;\n let bottom_x;\n let bottom_y;\n if (this.render_options.draw_end_arrow || both_arrows) {\n angle1 = line_angle + Math.PI + this.render_options.arrowhead_angle;\n top_x = x2 + Math.cos(angle1) * h;\n top_y = y2 + Math.sin(angle1) * h;\n angle2 = line_angle + Math.PI - this.render_options.arrowhead_angle;\n bottom_x = x2 + Math.cos(angle2) * h;\n bottom_y = y2 + Math.sin(angle2) * h;\n drawArrowHead(ctx, top_x, top_y, x2, y2, bottom_x, bottom_y);\n }\n if (this.render_options.draw_start_arrow || both_arrows) {\n angle1 = line_angle + this.render_options.arrowhead_angle;\n top_x = x1 + Math.cos(angle1) * h;\n top_y = y1 + Math.sin(angle1) * h;\n angle2 = line_angle - this.render_options.arrowhead_angle;\n bottom_x = x1 + Math.cos(angle2) * h;\n bottom_y = y1 + Math.sin(angle2) * h;\n drawArrowHead(ctx, top_x, top_y, x1, y1, bottom_x, bottom_y);\n }\n }\n // Renders the `StaveLine` on the context\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n const first_note = this.first_note;\n const last_note = this.last_note;\n const render_options = this.render_options;\n ctx.save();\n this.applyLineStyle();\n // Cycle through each set of indices and draw lines\n let start_position = { x: 0, y: 0 };\n let end_position = { x: 0, y: 0 };\n this.first_indices.forEach((first_index, i) => {\n const last_index = this.last_indices[i];\n // Get initial coordinates for the start/end of the line\n start_position = first_note.getModifierStartXY(2, first_index);\n end_position = last_note.getModifierStartXY(1, last_index);\n const upwards_slope = start_position.y > end_position.y;\n // Adjust `x` coordinates for modifiers\n start_position.x += first_note.getMetrics().modRightPx + render_options.padding_left;\n end_position.x -= last_note.getMetrics().modLeftPx + render_options.padding_right;\n // Adjust first `x` coordinates for displacements\n const notehead_width = first_note.getGlyph().getWidth();\n const first_displaced = first_note.getKeyProps()[first_index].displaced;\n if (first_displaced && first_note.getStemDirection() === 1) {\n start_position.x += notehead_width + render_options.padding_left;\n }\n // Adjust last `x` coordinates for displacements\n const last_displaced = last_note.getKeyProps()[last_index].displaced;\n if (last_displaced && last_note.getStemDirection() === -1) {\n end_position.x -= notehead_width + render_options.padding_right;\n }\n // Adjust y position better if it's not coming from the center of the note\n start_position.y += upwards_slope ? -3 : 1;\n end_position.y += upwards_slope ? 2 : 0;\n this.drawArrowLine(ctx, start_position, end_position);\n });\n ctx.restore();\n // Determine the x coordinate where to start the text\n const text_width = ctx.measureText(this.text).width;\n const justification = render_options.text_justification;\n let x = 0;\n if (justification === StaveLine.TextJustification.LEFT) {\n x = start_position.x;\n }\n else if (justification === StaveLine.TextJustification.CENTER) {\n const delta_x = end_position.x - start_position.x;\n const center_x = delta_x / 2 + start_position.x;\n x = center_x - text_width / 2;\n }\n else if (justification === StaveLine.TextJustification.RIGHT) {\n x = end_position.x - text_width;\n }\n // Determine the y value to start the text\n let y = 0;\n const vertical_position = render_options.text_position_vertical;\n if (vertical_position === StaveLine.TextVerticalPosition.TOP) {\n y = first_note.checkStave().getYForTopText();\n }\n else if (vertical_position === StaveLine.TextVerticalPosition.BOTTOM) {\n y = first_note.checkStave().getYForBottomText(Tables.TEXT_HEIGHT_OFFSET_HACK);\n }\n // Draw the text\n ctx.save();\n this.applyFontStyle();\n ctx.fillText(this.text, x, y);\n ctx.restore();\n return this;\n }\n}\n/** Default text font. */\nStaveLine.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n// Text Positioning\nStaveLine.TextVerticalPosition = {\n TOP: 1,\n BOTTOM: 2,\n};\nStaveLine.TextJustification = {\n LEFT: 1,\n CENTER: 2,\n RIGHT: 3,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { BoundingBox } from './boundingbox';\nimport { Element } from './element';\nimport { Formatter } from './formatter';\nimport { Note } from './note';\nimport { Stave } from './stave';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\n/**\n * System implements a musical system, which is a collection of staves,\n * each which can have one or more voices. All voices across all staves in\n * the system are formatted together.\n */\nexport class System extends Element {\n constructor(params = {}) {\n super();\n this.setOptions(params);\n this.parts = [];\n }\n static get CATEGORY() {\n return Category.System;\n }\n /** Set formatting options. */\n setOptions(options = {}) {\n if (!options.factory) {\n throw new RuntimeError('NoFactory', 'System.setOptions(options) requires a factory.');\n }\n this.factory = options.factory;\n this.options = Object.assign(Object.assign({ factory: this.factory, x: 10, y: 10, width: 500, spaceBetweenStaves: 12, autoWidth: false, noJustification: false, debugFormatter: false, formatIterations: 0, noPadding: false }, options), { details: Object.assign({ alpha: 0.5 }, options.details), formatOptions: Object.assign({}, options.formatOptions) });\n if (this.options.noJustification === false && typeof options.width === 'undefined') {\n this.options.autoWidth = true;\n }\n }\n /** Set associated context. */\n setContext(context) {\n super.setContext(context);\n this.factory.setContext(context);\n return this;\n }\n /**\n * Add connector between staves.\n * @param type see {@link StaveConnector.typeString}\n */\n addConnector(type = 'double') {\n this.connector = this.factory.StaveConnector({\n top_stave: this.parts[0].stave,\n bottom_stave: this.parts[this.parts.length - 1].stave,\n type,\n });\n return this.connector;\n }\n /**\n * Add a stave to the system.\n *\n * Example (one voice):\n *\n * `system.addStave({voices: [score.voice(score.notes('C#5/q, B4, A4, G#4'))]});`\n *\n * Example (two voices):\n *\n * `system.addStave({voices: [`\n * `score.voice(score.notes('C#5/q, B4, A4, G#4', {stem: 'up'})),`\n * `score.voice(score.notes('C#4/h, C#4', {stem: 'down'}))`\n * `]});`\n */\n addStave(params) {\n var _a;\n const staveOptions = Object.assign({ left_bar: false }, params.options);\n const stave = (_a = params.stave) !== null && _a !== void 0 ? _a : this.factory.Stave({ x: this.options.x, y: this.options.y, width: this.options.width, options: staveOptions });\n const p = Object.assign(Object.assign({ stave, \n /* voices: [], */\n spaceAbove: 0, spaceBelow: 0, debugNoteMetrics: false, noJustification: false }, params), { options: staveOptions });\n const ctx = this.getContext();\n p.voices.forEach((voice) => voice\n .setContext(ctx)\n .setStave(stave)\n .getTickables()\n .forEach((tickable) => tickable.setStave(stave)));\n this.parts.push(p);\n return stave;\n }\n /** Format the system. */\n format() {\n const options_details = this.options.details;\n let justifyWidth = 0;\n const formatter = new Formatter(options_details);\n this.formatter = formatter;\n let y = this.options.y;\n let startX = 0;\n let allVoices = [];\n const debugNoteMetricsYs = [];\n // Join the voices for each stave.\n this.parts.forEach((part) => {\n y = y + part.stave.space(part.spaceAbove);\n part.stave.setY(y);\n if (this.options.autoWidth) {\n part.voices.forEach((voice) => {\n formatter.joinVoices([voice]);\n });\n }\n else {\n formatter.joinVoices(part.voices);\n }\n y = y + part.stave.space(part.spaceBelow);\n y = y + part.stave.space(this.options.spaceBetweenStaves);\n if (part.debugNoteMetrics) {\n debugNoteMetricsYs.push({ y, voice: part.voices[0] });\n y += 15;\n }\n allVoices = allVoices.concat(part.voices);\n startX = Math.max(startX, part.stave.getNoteStartX());\n });\n // Update the start position of all staves.\n this.parts.forEach((part) => part.stave.setNoteStartX(startX));\n if (this.options.autoWidth) {\n justifyWidth = formatter.preCalculateMinTotalWidth(allVoices);\n this.parts.forEach((part) => {\n part.stave.setWidth(justifyWidth + Stave.rightPadding + (startX - this.options.x));\n });\n }\n else {\n justifyWidth = this.options.noPadding\n ? this.options.width - this.options.x\n : this.options.width - (startX - this.options.x) - Stave.defaultPadding;\n }\n formatter.format(allVoices, this.options.noJustification ? 0 : justifyWidth, this.options.formatOptions);\n for (let i = 0; i < this.options.formatIterations; i++) {\n formatter.tune(options_details);\n }\n this.startX = startX;\n this.debugNoteMetricsYs = debugNoteMetricsYs;\n this.lastY = y;\n this.boundingBox = new BoundingBox(this.options.x, this.options.y, this.options.width, this.lastY - this.options.y);\n }\n /** Render the system. */\n draw() {\n // Render debugging information, if requested.\n const ctx = this.checkContext();\n if (!this.formatter || !this.startX || !this.lastY || !this.debugNoteMetricsYs) {\n throw new RuntimeError('NoFormatter', 'format() must be called before draw()');\n }\n this.setRendered();\n if (this.options.debugFormatter) {\n Formatter.plotDebugging(ctx, this.formatter, this.startX, this.options.y, this.lastY);\n }\n this.debugNoteMetricsYs.forEach((d) => {\n d.voice.getTickables().forEach((tickable) => Note.plotMetrics(ctx, tickable, d.y));\n });\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// The file implements notes for Tablature notation. This consists of one or\n// more fret positions, and can either be drawn with or without stems.\n//\n// See `tests/tabnote_tests.ts` for usage examples.\nimport { Font } from './font';\nimport { Glyph } from './glyph';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { StemmableNote } from './stemmablenote';\nimport { Tables } from './tables';\nimport { Category, isDot } from './typeguard';\nimport { defined, RuntimeError } from './util';\n// Gets the unused strings grouped together if consecutive.\n//\n// Parameters:\n// * num_lines - The number of lines\n// * strings_used - An array of numbers representing which strings have fret positions\nfunction getUnusedStringGroups(num_lines, strings_used) {\n const stem_through = [];\n let group = [];\n for (let string = 1; string <= num_lines; string++) {\n const is_used = strings_used.indexOf(string) > -1;\n if (!is_used) {\n group.push(string);\n }\n else {\n stem_through.push(group);\n group = [];\n }\n }\n if (group.length > 0)\n stem_through.push(group);\n return stem_through;\n}\n// Gets groups of points that outline the partial stem lines\n// between fret positions\n//\n// Parameters:\n// * stem_Y - The `y` coordinate the stem is located on\n// * unused_strings - An array of groups of unused strings\n// * stave - The stave to use for reference\n// * stem_direction - The direction of the stem\nfunction getPartialStemLines(stem_y, unused_strings, stave, stem_direction) {\n const up_stem = stem_direction !== 1;\n const down_stem = stem_direction !== -1;\n const line_spacing = stave.getSpacingBetweenLines();\n const total_lines = stave.getNumLines();\n const stem_lines = [];\n unused_strings.forEach((strings) => {\n const containsLastString = strings.indexOf(total_lines) > -1;\n const containsFirstString = strings.indexOf(1) > -1;\n if ((up_stem && containsFirstString) || (down_stem && containsLastString)) {\n return;\n }\n // If there's only one string in the group, push a duplicate value.\n // We do this because we need 2 strings to convert into upper/lower y\n // values.\n if (strings.length === 1) {\n strings.push(strings[0]);\n }\n const line_ys = [];\n // Iterate through each group string and store it's y position\n strings.forEach((string, index, strings) => {\n const isTopBound = string === 1;\n const isBottomBound = string === total_lines;\n // Get the y value for the appropriate staff line,\n // we adjust for a 0 index array, since string numbers are index 1\n let y = stave.getYForLine(string - 1);\n // Unless the string is the first or last, add padding to each side\n // of the line\n if (index === 0 && !isTopBound) {\n y -= line_spacing / 2 - 1;\n }\n else if (index === strings.length - 1 && !isBottomBound) {\n y += line_spacing / 2 - 1;\n }\n // Store the y value\n line_ys.push(y);\n // Store a subsequent y value connecting this group to the main\n // stem above/below the stave if it's the top/bottom string\n if (stem_direction === 1 && isTopBound) {\n line_ys.push(stem_y - 2);\n }\n else if (stem_direction === -1 && isBottomBound) {\n line_ys.push(stem_y + 2);\n }\n });\n // Add the sorted y values to the\n stem_lines.push(line_ys.sort((a, b) => a - b));\n });\n return stem_lines;\n}\nexport class TabNote extends StemmableNote {\n // Initialize the TabNote with a `noteStruct` full of properties\n // and whether to `draw_stem` when rendering the note\n constructor(noteStruct, draw_stem = false) {\n super(noteStruct);\n this.glyphs = [];\n // Return the number of the greatest string, which is the string lowest on the display\n this.greatestString = () => {\n return this.positions.map((x) => x.str).reduce((a, b) => (a > b ? a : b));\n };\n // Return the number of the least string, which is the string highest on the display\n this.leastString = () => {\n return this.positions.map((x) => x.str).reduce((a, b) => (a < b ? a : b));\n };\n this.ghost = false; // Renders parenthesis around notes\n // Note properties\n // The fret positions in the note. An array of `{ str: X, fret: X }`\n this.positions = noteStruct.positions || [];\n // Render Options\n this.render_options = Object.assign(Object.assign({}, this.render_options), { \n // font size for note heads and rests\n glyph_font_scale: Tables.TABLATURE_FONT_SCALE, \n // Flag to draw a stem\n draw_stem, \n // Flag to draw dot modifiers\n draw_dots: draw_stem, \n // Flag to extend the main stem through the stave and fret positions\n draw_stem_through_stave: false, \n // vertical shift from stave line\n y_shift: 0, \n // normal glyph scale\n scale: 1.0, \n // default tablature font\n font: `${Font.SIZE}pt ${Font.SANS_SERIF}` });\n this.glyph = Tables.getGlyphProps(this.duration, this.noteType);\n defined(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`);\n this.buildStem();\n if (noteStruct.stem_direction) {\n this.setStemDirection(noteStruct.stem_direction);\n }\n else {\n this.setStemDirection(Stem.UP);\n }\n // Renders parenthesis around notes\n this.ghost = false;\n this.updateWidth();\n }\n static get CATEGORY() {\n return Category.TabNote;\n }\n reset() {\n super.reset();\n if (this.stave)\n this.setStave(this.stave);\n return this;\n }\n // Set as ghost `TabNote`, surrounds the fret positions with parenthesis.\n // Often used for indicating frets that are being bent to\n setGhost(ghost) {\n this.ghost = ghost;\n this.updateWidth();\n return this;\n }\n // Determine if the note has a stem\n hasStem() {\n if (this.render_options.draw_stem)\n return true;\n return false;\n }\n // Get the default stem extension for the note\n getStemExtension() {\n if (this.stem_extension_override != null) {\n return this.stem_extension_override;\n }\n if (this.flag) {\n return this.getStemDirection() === 1 ? -this.flag.checkMetrics().y_shift : this.flag.checkMetrics().y_shift;\n }\n return 0;\n }\n // Calculate and store the width of the note\n updateWidth() {\n this.glyphs = [];\n this.width = 0;\n for (let i = 0; i < this.positions.length; ++i) {\n let fret = this.positions[i].fret;\n if (this.ghost)\n fret = '(' + fret + ')';\n const glyph = Tables.tabToGlyph(fret.toString(), this.render_options.scale);\n this.glyphs.push(glyph);\n this.width = Math.max(glyph.getWidth(), this.width);\n }\n // For some reason we associate a notehead glyph with a TabNote, and this\n // glyph is used for certain width calculations. Of course, this is totally\n // incorrect since a notehead is a poor approximation for the dimensions of\n // a fret number which can have multiple digits. As a result, we must\n // overwrite getWidth() to return the correct width\n this.glyph.getWidth = () => this.width;\n }\n // Set the `stave` to the note\n setStave(stave) {\n super.setStave(stave);\n const ctx = stave.getContext();\n this.setContext(ctx);\n // Calculate the fret number width based on font used\n if (ctx) {\n this.width = 0;\n for (let i = 0; i < this.glyphs.length; ++i) {\n const glyph = this.glyphs[i];\n const text = '' + glyph.text;\n if (text.toUpperCase() !== 'X') {\n ctx.save();\n ctx.setFont(this.render_options.font);\n glyph.width = ctx.measureText(text).width;\n ctx.restore();\n glyph.getWidth = () => glyph.width;\n }\n this.width = Math.max(glyph.getWidth(), this.width);\n }\n this.glyph.getWidth = () => this.width;\n }\n // we subtract 1 from `line` because getYForLine expects a 0-based index,\n // while the position.str is a 1-based index\n const ys = this.positions.map(({ str: line }) => stave.getYForLine(Number(line) - 1));\n this.setYs(ys);\n if (this.stem) {\n this.stem.setYBounds(this.getStemY(), this.getStemY());\n }\n return this;\n }\n // Get the fret positions for the note\n getPositions() {\n return this.positions;\n }\n // Get the default `x` and `y` coordinates for a modifier at a specific\n // `position` at a fret position `index`\n getModifierStartXY(position, index) {\n if (!this.preFormatted) {\n throw new RuntimeError('UnformattedNote', \"Can't call GetModifierStartXY on an unformatted note\");\n }\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', 'No Y-Values calculated for this note.');\n }\n let x = 0;\n if (position === Modifier.Position.LEFT) {\n x = -1 * 2; // FIXME: modifier padding, move to font file\n }\n else if (position === Modifier.Position.RIGHT) {\n x = this.width + 2; // FIXME: modifier padding, move to font file\n }\n else if (position === Modifier.Position.BELOW || position === Modifier.Position.ABOVE) {\n const note_glyph_width = this.glyph.getWidth();\n x = note_glyph_width / 2;\n }\n return {\n x: this.getAbsoluteX() + x,\n y: this.ys[index],\n };\n }\n // Get the default line for rest\n getLineForRest() {\n return Number(this.positions[0].str);\n }\n // Pre-render formatting\n preFormat() {\n if (this.preFormatted)\n return;\n if (this.modifierContext)\n this.modifierContext.preFormat();\n // width is already set during init()\n this.preFormatted = true;\n }\n // Get the x position for the stem\n getStemX() {\n return this.getCenterGlyphX();\n }\n // Get the y position for the stem\n getStemY() {\n const num_lines = this.checkStave().getNumLines();\n // The decimal staff line amounts provide optimal spacing between the\n // fret number and the stem\n const stemUpLine = -0.5;\n const stemDownLine = num_lines - 0.5;\n const stemStartLine = Stem.UP === this.stem_direction ? stemUpLine : stemDownLine;\n return this.checkStave().getYForLine(stemStartLine);\n }\n // Get the stem extents for the tabnote\n getStemExtents() {\n return this.checkStem().getExtents();\n }\n // Draw the fal onto the context\n drawFlag() {\n const { beam, glyph, stem_direction, render_options: { draw_stem, glyph_font_scale }, } = this;\n const context = this.checkContext();\n const shouldDrawFlag = beam == undefined && draw_stem;\n // Now it's the flag's turn.\n if (glyph.flag && shouldDrawFlag) {\n const flag_x = this.getStemX() + 1;\n const flag_y = this.getStemY() - this.checkStem().getHeight();\n const flag_code = stem_direction === Stem.DOWN\n ? glyph.code_flag_downstem // Down stems have flags on the left.\n : glyph.code_flag_upstem;\n // Draw the Flag\n Glyph.renderGlyph(context, flag_x, flag_y, glyph_font_scale, flag_code, { category: 'flag.tabStem' });\n }\n }\n // Render the modifiers onto the context.\n drawModifiers() {\n this.modifiers.forEach((modifier) => {\n // Only draw the dots if enabled.\n if (isDot(modifier) && !this.render_options.draw_dots) {\n return;\n }\n modifier.setContext(this.getContext());\n modifier.drawWithStyle();\n });\n }\n // Render the stem extension through the fret positions\n drawStemThrough() {\n const stemX = this.getStemX();\n const stemY = this.getStemY();\n const ctx = this.checkContext();\n const drawStem = this.render_options.draw_stem;\n const stemThrough = this.render_options.draw_stem_through_stave;\n if (drawStem && stemThrough) {\n const numLines = this.checkStave().getNumLines();\n const stringsUsed = this.positions.map((position) => Number(position.str));\n const unusedStrings = getUnusedStringGroups(numLines, stringsUsed);\n const stemLines = getPartialStemLines(stemY, unusedStrings, this.checkStave(), this.getStemDirection());\n ctx.save();\n ctx.setLineWidth(Stem.WIDTH);\n stemLines.forEach((bounds) => {\n if (bounds.length === 0)\n return;\n ctx.beginPath();\n ctx.moveTo(stemX, bounds[0]);\n ctx.lineTo(stemX, bounds[bounds.length - 1]);\n ctx.stroke();\n ctx.closePath();\n });\n ctx.restore();\n }\n }\n // Render the fret positions onto the context\n drawPositions() {\n const ctx = this.checkContext();\n const x = this.getAbsoluteX();\n const ys = this.ys;\n for (let i = 0; i < this.positions.length; ++i) {\n const y = ys[i] + this.render_options.y_shift;\n const glyph = this.glyphs[i];\n // Center the fret text beneath the notation note head\n const note_glyph_width = this.glyph.getWidth();\n const tab_x = x + note_glyph_width / 2 - glyph.getWidth() / 2;\n // FIXME: Magic numbers.\n ctx.clearRect(tab_x - 2, y - 3, glyph.getWidth() + 4, 6);\n if (glyph.code) {\n Glyph.renderGlyph(ctx, tab_x, y, this.render_options.glyph_font_scale * this.render_options.scale, glyph.code);\n }\n else {\n ctx.save();\n ctx.setFont(this.render_options.font);\n const text = glyph.text.toString();\n ctx.fillText(text, tab_x, y + 5 * this.render_options.scale);\n ctx.restore();\n }\n }\n }\n // The main rendering function for the entire note.\n draw() {\n const ctx = this.checkContext();\n if (this.ys.length === 0) {\n throw new RuntimeError('NoYValues', \"Can't draw note without Y values.\");\n }\n this.setRendered();\n const render_stem = this.beam == undefined && this.render_options.draw_stem;\n ctx.openGroup('tabnote', undefined, { pointerBBox: true });\n this.drawPositions();\n this.drawStemThrough();\n if (this.stem && render_stem) {\n const stem_x = this.getStemX();\n this.stem.setNoteHeadXBounds(stem_x, stem_x);\n ctx.openGroup('stem', undefined, { pointerBBox: true });\n this.stem.setContext(ctx).draw();\n ctx.closeGroup();\n }\n this.drawFlag();\n this.drawModifiers();\n ctx.closeGroup();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\nimport { Stave } from './stave';\nimport { Category } from './typeguard';\nexport class TabStave extends Stave {\n static get CATEGORY() {\n return Category.TabStave;\n }\n constructor(x, y, width, options) {\n const tab_options = Object.assign({ spacing_between_lines_px: 13, num_lines: 6, top_text_position: 1 }, options);\n super(x, y, width, tab_options);\n }\n getYForGlyphs() {\n return this.getYForLine(2.5);\n }\n // Deprecated\n addTabGlyph() {\n this.addClef('tab');\n return this;\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Cyril Silverman\n//\n// This file implements `TextBrackets` which extend between two notes.\n// The octave transposition markings (8va, 8vb, 15va, 15vb) can be created\n// using this class.\nimport { Element } from './element';\nimport { Font, FontStyle, FontWeight } from './font';\nimport { Renderer } from './renderer';\nimport { Tables } from './tables';\nimport { Category } from './typeguard';\nimport { log, RuntimeError } from './util';\n// To enable logging for this class. Set `Vex.Flow.TextBracket.DEBUG` to `true`.\n// eslint-disable-next-line\nfunction L(...args) {\n if (TextBracket.DEBUG)\n log('Vex.Flow.TextBracket', args);\n}\nexport var TextBracketPosition;\n(function (TextBracketPosition) {\n TextBracketPosition[TextBracketPosition[\"TOP\"] = 1] = \"TOP\";\n TextBracketPosition[TextBracketPosition[\"BOTTOM\"] = -1] = \"BOTTOM\";\n})(TextBracketPosition || (TextBracketPosition = {}));\nexport class TextBracket extends Element {\n constructor({ start, stop, text = '', superscript = '', position = TextBracketPosition.TOP }) {\n super();\n this.start = start;\n this.stop = stop;\n this.text = text;\n this.superscript = superscript;\n this.position = typeof position === 'string' ? TextBracket.PositionString[position] : position;\n this.line = 1;\n this.resetFont();\n this.render_options = {\n dashed: true,\n dash: [5],\n color: 'black',\n line_width: 1,\n show_bracket: true,\n bracket_height: 8,\n // In the BOTTOM position, the bracket line can extend\n // under the superscript.\n underline_superscript: true,\n };\n }\n static get CATEGORY() {\n return Category.TextBracket;\n }\n static get Position() {\n return TextBracketPosition;\n }\n static get PositionString() {\n return {\n top: TextBracketPosition.TOP,\n bottom: TextBracketPosition.BOTTOM,\n };\n }\n /**\n * @deprecated Use `TextBracket.Position` instead.\n */\n static get Positions() {\n L('Positions is deprecated, use TextBracketPosition instead.');\n return TextBracketPosition;\n }\n /**\n * @deprecated Use `TextBracket.PositionString` instead.\n */\n static get PositionsString() {\n L('PositionsString is deprecated, use PositionString instead.');\n return TextBracket.PositionString;\n }\n /**\n * Apply the text backet styling to the provided context.\n * @param ctx\n * @returns this\n */\n applyStyle(ctx) {\n ctx.setFont(this.font);\n const options = this.render_options;\n ctx.setStrokeStyle(options.color);\n ctx.setFillStyle(options.color);\n ctx.setLineWidth(options.line_width);\n return this;\n }\n // Set whether the bracket line should be `dashed`. You can also\n // optionally set the `dash` pattern by passing in an array of numbers\n setDashed(dashed, dash) {\n this.render_options.dashed = dashed;\n if (dash)\n this.render_options.dash = dash;\n return this;\n }\n // Set the rendering `context` for the octave bracket\n setLine(line) {\n this.line = line;\n return this;\n }\n // Draw the octave bracket on the rendering context\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n let y = 0;\n switch (this.position) {\n case TextBracketPosition.TOP:\n y = this.start.checkStave().getYForTopText(this.line);\n break;\n case TextBracketPosition.BOTTOM:\n y = this.start.checkStave().getYForBottomText(this.line + Tables.TEXT_HEIGHT_OFFSET_HACK);\n break;\n default:\n throw new RuntimeError('InvalidPosition', `The position ${this.position} is invalid.`);\n }\n // Get the preliminary start and stop coordintates for the bracket\n const start = { x: this.start.getAbsoluteX(), y };\n const stop = { x: this.stop.getAbsoluteX(), y };\n L('Rendering TextBracket: start:', start, 'stop:', stop, 'y:', y);\n const bracket_height = this.render_options.bracket_height * this.position;\n ctx.save();\n this.applyStyle(ctx);\n // Draw text\n ctx.fillText(this.text, start.x, start.y);\n // Get the width and height for the octave number\n const main_measure = ctx.measureText(this.text);\n const main_width = main_measure.width;\n const main_height = main_measure.height;\n // Calculate the y position for the super script\n const super_y = start.y - main_height / 2.5;\n // We called this.resetFont() in the constructor, so we know this.textFont is available.\n // eslint-disable-next-line\n const { family, size, weight, style } = this.textFont;\n // To draw the superscript, we scale the font size by 1/1.4.\n const smallerFontSize = Font.scaleSize(size, 0.714286);\n ctx.setFont(family, smallerFontSize, weight, style);\n ctx.fillText(this.superscript, start.x + main_width + 1, super_y);\n // Determine width and height of the superscript\n const super_measure = ctx.measureText(this.superscript);\n const super_width = super_measure.width;\n const super_height = super_measure.height;\n // Setup initial coordinates for the bracket line\n let start_x = start.x;\n let line_y = super_y;\n const end_x = stop.x + this.stop.getGlyph().getWidth();\n // Adjust x and y coordinates based on position\n if (this.position === TextBracketPosition.TOP) {\n start_x += main_width + super_width + 5;\n line_y -= super_height / 2.7;\n }\n else if (this.position === TextBracketPosition.BOTTOM) {\n line_y += super_height / 2.7;\n start_x += main_width + 2;\n if (!this.render_options.underline_superscript) {\n start_x += super_width;\n }\n }\n if (this.render_options.dashed) {\n // Main line\n Renderer.drawDashedLine(ctx, start_x, line_y, end_x, line_y, this.render_options.dash);\n // Ending Bracket\n if (this.render_options.show_bracket) {\n Renderer.drawDashedLine(ctx, end_x, line_y + 1 * this.position, end_x, line_y + bracket_height, this.render_options.dash);\n }\n }\n else {\n ctx.beginPath();\n ctx.moveTo(start_x, line_y);\n // Main line\n ctx.lineTo(end_x, line_y);\n if (this.render_options.show_bracket) {\n // Ending bracket\n ctx.lineTo(end_x, line_y + bracket_height);\n }\n ctx.stroke();\n ctx.closePath();\n }\n ctx.restore();\n }\n}\nTextBracket.DEBUG = false;\nTextBracket.TEXT_FONT = {\n family: Font.SERIF,\n size: 15,\n weight: FontWeight.NORMAL,\n style: FontStyle.ITALIC,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Glyph } from './glyph';\nimport { Note } from './note';\nimport { Category } from './typeguard';\nimport { defined, log, RuntimeError } from './util';\n// eslint-disable-next-line\nfunction L(...args) {\n if (TextDynamics.DEBUG)\n log('Vex.Flow.TextDynamics', args);\n}\n/**\n * `TextDynamics` renders traditional\n * text dynamics markings, **ie: p, f, sfz, rfz, ppp**\n *\n * You can render any dynamics string that contains a combination of\n * the following letters: P, M, F, Z, R, S\n */\nexport class TextDynamics extends Note {\n /**\n * Create the dynamics marking.\n *\n * A `TextDynamics` object inherits from `Note` so that it can be formatted\n * within a `Voice`.\n *\n * @param noteStruct an object that contains a `duration` property and a\n * `sequence` of letters that represents the letters to render.\n */\n constructor(noteStruct) {\n super(noteStruct);\n this.sequence = (noteStruct.text || '').toLowerCase();\n this.line = noteStruct.line || 0;\n this.glyphs = [];\n this.render_options = Object.assign(Object.assign({}, this.render_options), { glyph_font_size: 40 });\n L('New Dynamics Text: ', this.sequence);\n }\n static get CATEGORY() {\n return Category.TextDynamics;\n }\n /** The glyph data for each dynamics letter. */\n static get GLYPHS() {\n return {\n f: {\n code: 'dynamicForte',\n width: 12,\n },\n p: {\n code: 'dynamicPiano',\n width: 14,\n },\n m: {\n code: 'dynamicMezzo',\n width: 17,\n },\n s: {\n code: 'dynamicSforzando',\n width: 10,\n },\n z: {\n code: 'dynamicZ',\n width: 12,\n },\n r: {\n code: 'dynamicRinforzando',\n width: 12,\n },\n };\n }\n /** Set the Stave line on which the note should be placed. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Preformat the dynamics text. */\n preFormat() {\n let total_width = 0;\n // length of this.glyphs must be <=\n // length of this.sequence, so if we're formatted before\n // create new glyphs.\n this.glyphs = [];\n // Iterate through each letter\n this.sequence.split('').forEach((letter) => {\n // Get the glyph data for the letter\n const glyph_data = TextDynamics.GLYPHS[letter];\n if (!glyph_data)\n throw new RuntimeError('Invalid dynamics character: ' + letter);\n const size = defined(this.render_options.glyph_font_size);\n const glyph = new Glyph(glyph_data.code, size, { category: 'textNote' });\n // Add the glyph\n this.glyphs.push(glyph);\n total_width += glyph_data.width;\n });\n // Store the width of the text\n this.setWidth(total_width);\n this.preFormatted = true;\n return this;\n }\n /** Draw the dynamics text on the rendering context. */\n draw() {\n this.setRendered();\n const x = this.getAbsoluteX();\n const y = this.checkStave().getYForLine(this.line + -3);\n L('Rendering Dynamics: ', this.sequence);\n let letter_x = x;\n this.glyphs.forEach((glyph, index) => {\n const current_letter = this.sequence[index];\n glyph.render(this.checkContext(), letter_x, y);\n letter_x += TextDynamics.GLYPHS[current_letter].width;\n });\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.TextDynamics.DEBUG` to `true`. */\nTextDynamics.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2014\nimport { Note } from './note';\nimport { TimeSignature } from './timesignature';\nimport { Category } from './typeguard';\nexport class TimeSigNote extends Note {\n constructor(timeSpec, customPadding) {\n super({ duration: 'b' });\n const timeSignature = new TimeSignature(timeSpec, customPadding);\n this.timeSigInfo = timeSignature.getInfo();\n this.setWidth(this.timeSigInfo.glyph.getMetrics().width);\n // Note properties\n this.ignore_ticks = true;\n }\n static get CATEGORY() {\n return Category.TimeSigNote;\n }\n /* Overridden to ignore */\n // eslint-disable-next-line\n addToModifierContext(mc) {\n // DO NOTHING.\n return this;\n }\n preFormat() {\n this.preFormatted = true;\n return this;\n }\n draw() {\n const stave = this.checkStave();\n const ctx = this.checkContext();\n this.setRendered();\n if (!this.timeSigInfo.glyph.getContext()) {\n this.timeSigInfo.glyph.setContext(ctx);\n }\n this.timeSigInfo.glyph.setStave(stave);\n this.timeSigInfo.glyph.setYShift(stave.getYForLine(2) - stave.getYForGlyphs());\n this.timeSigInfo.glyph.renderToStave(this.getAbsoluteX());\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Balazs Forian-Szabo\n// MIT License\nimport { Element } from './element';\nimport { Category } from './typeguard';\nimport { log } from './util';\nimport { Vibrato } from './vibrato';\n// eslint-disable-next-line\nfunction L(...args) {\n if (VibratoBracket.DEBUG)\n log('Vex.Flow.VibratoBracket', args);\n}\n/** `VibratoBracket` renders vibrato effect between two notes. */\nexport class VibratoBracket extends Element {\n /**\n * Either the stop or start note must be set, or both of them.\n * An undefined value for the start or stop note indicates that the vibrato\n * is drawn from the beginning or until the end of the stave accordingly.\n */\n constructor(bracket_data) {\n super();\n if (bracket_data.start)\n this.start = bracket_data.start;\n if (bracket_data.stop)\n this.stop = bracket_data.stop;\n this.line = 1;\n this.render_options = {\n harsh: false,\n wave_height: 6,\n wave_width: 4,\n wave_girth: 2,\n vibrato_width: 0,\n };\n }\n static get CATEGORY() {\n return Category.VibratoBracket;\n }\n /** Set line position of the vibrato bracket. */\n setLine(line) {\n this.line = line;\n return this;\n }\n /** Set harsh vibrato bracket. */\n setHarsh(harsh) {\n this.render_options.harsh = harsh;\n return this;\n }\n /** Draw the vibrato bracket on the rendering context. */\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n const y = (this.start && this.start.checkStave().getYForTopText(this.line)) ||\n (this.stop && this.stop.checkStave().getYForTopText(this.line)) ||\n 0;\n // If start note is not set then vibrato will be drawn\n // from the beginning of the stave\n const start_x = (this.start && this.start.getAbsoluteX()) || (this.stop && this.stop.checkStave().getTieStartX()) || 0;\n // If stop note is not set then vibrato will be drawn\n // until the end of the stave\n const stop_x = (this.stop && this.stop.getAbsoluteX() - this.stop.getWidth() - 5) ||\n (this.start && this.start.checkStave().getTieEndX() - 10) ||\n 0;\n this.render_options.vibrato_width = stop_x - start_x;\n L('Rendering VibratoBracket: start_x:', start_x, 'stop_x:', stop_x, 'y:', y);\n Vibrato.renderVibrato(ctx, start_x, y, this.render_options);\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.VibratoBracket.DEBUG` to `true`. */\nVibratoBracket.DEBUG = false;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Mohit Cheppudira\n// MIT License\nimport { Accidental } from './accidental';\nimport { Annotation, AnnotationHorizontalJustify, AnnotationVerticalJustify } from './annotation';\nimport { Articulation } from './articulation';\nimport { BarNote } from './barnote';\nimport { Beam } from './beam';\nimport { ChordSymbol } from './chordsymbol';\nimport { ClefNote } from './clefnote';\nimport { Curve } from './curve';\nimport { EasyScore } from './easyscore';\nimport { Element } from './element';\nimport { Formatter } from './formatter';\nimport { FretHandFinger } from './frethandfinger';\nimport { GhostNote } from './ghostnote';\nimport { GlyphNote } from './glyphnote';\nimport { GraceNote } from './gracenote';\nimport { GraceNoteGroup } from './gracenotegroup';\nimport { KeySigNote } from './keysignote';\nimport { ModifierContext } from './modifiercontext';\nimport { MultiMeasureRest } from './multimeasurerest';\nimport { NoteSubGroup } from './notesubgroup';\nimport { PedalMarking } from './pedalmarking';\nimport { Renderer } from './renderer';\nimport { RepeatNote } from './repeatnote';\nimport { Stave } from './stave';\nimport { StaveConnector } from './staveconnector';\nimport { StaveLine } from './staveline';\nimport { StaveNote } from './stavenote';\nimport { StaveTie } from './stavetie';\nimport { StringNumber } from './stringnumber';\nimport { System } from './system';\nimport { TabNote } from './tabnote';\nimport { TabStave } from './tabstave';\nimport { TextBracket } from './textbracket';\nimport { TextDynamics } from './textdynamics';\nimport { TextNote } from './textnote';\nimport { TickContext } from './tickcontext';\nimport { TimeSigNote } from './timesignote';\nimport { Tuplet } from './tuplet';\nimport { defined, log, RuntimeError } from './util';\nimport { VibratoBracket } from './vibratobracket';\nimport { Voice } from './voice';\nimport { isHTMLCanvas } from './web';\n// eslint-disable-next-line\nfunction L(...args) {\n if (Factory.DEBUG)\n log('Vex.Flow.Factory', args);\n}\n/**\n * Factory implements a high level API around VexFlow.\n */\nexport class Factory {\n /**\n * Example:\n *\n * Create an SVG renderer and attach it to the DIV element named \"boo\" to render using 1200 and 600\n *\n * `const vf: Factory = new Vex.Flow.Factory({renderer: { elementId: 'boo', width: 1200, height: 600 }});`\n */\n constructor(options = {}) {\n L('New factory: ', options);\n this.options = {\n stave: {\n space: 10,\n },\n renderer: {\n elementId: '',\n width: 500,\n height: 200,\n background: '#FFF',\n },\n font: Factory.TEXT_FONT,\n };\n this.setOptions(options);\n }\n /**\n * Static simplified function to access constructor without providing FactoryOptions\n *\n * Example:\n *\n * Create an SVG renderer and attach it to the DIV element named \"boo\" to render using 1200 and 600\n *\n * `const vf: Factory = Vex.Flow.Factory.newFromElementId('boo', 1200, 600 );`\n */\n static newFromElementId(elementId, width = 500, height = 200) {\n return new Factory({ renderer: { elementId, width, height } });\n }\n reset() {\n this.renderQ = [];\n this.systems = [];\n this.staves = [];\n this.voices = [];\n this.stave = undefined; // current stave\n }\n setOptions(options) {\n this.options = Object.assign(Object.assign({}, this.options), options);\n this.initRenderer();\n this.reset();\n }\n initRenderer() {\n const { elementId, width, height, background } = this.options.renderer;\n if (elementId == null) {\n return;\n }\n if (elementId == '') {\n L(this);\n throw new RuntimeError('renderer.elementId not set in FactoryOptions');\n }\n let backend = this.options.renderer.backend;\n if (backend === undefined) {\n const elem = document.getElementById(elementId);\n // We use a custom type check here, because node-canvas mimics canvas,\n // but is not an instance of window.HTMLCanvasElement.\n // In fact, `window` might be undefined here.\n // See: https://www.npmjs.com/package/canvas\n if (isHTMLCanvas(elem)) {\n backend = Renderer.Backends.CANVAS;\n }\n else {\n backend = Renderer.Backends.SVG;\n }\n }\n this.context = Renderer.buildContext(elementId, backend, width, height, background);\n }\n getContext() {\n return this.context;\n }\n setContext(context) {\n this.context = context;\n return this;\n }\n getStave() {\n return this.stave;\n }\n getVoices() {\n return this.voices;\n }\n /** Return pixels from current stave spacing. */\n Stave(params) {\n const staveSpace = this.options.stave.space;\n const p = Object.assign({ x: 0, y: 0, width: this.options.renderer.width - staveSpace * 1.0, options: { spacing_between_lines_px: staveSpace * 1.0 } }, params);\n const stave = new Stave(p.x, p.y, p.width, p.options);\n this.staves.push(stave);\n stave.setContext(this.context);\n this.stave = stave;\n return stave;\n }\n TabStave(params) {\n const staveSpace = this.options.stave.space;\n const p = Object.assign({ x: 0, y: 0, width: this.options.renderer.width - staveSpace * 1.0, options: { spacing_between_lines_px: staveSpace * 1.3 } }, params);\n const stave = new TabStave(p.x, p.y, p.width, p.options);\n this.staves.push(stave);\n stave.setContext(this.context);\n this.stave = stave;\n return stave;\n }\n StaveNote(noteStruct) {\n const note = new StaveNote(noteStruct);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n GlyphNote(glyph, noteStruct, options) {\n const note = new GlyphNote(glyph, noteStruct, options);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n RepeatNote(type, noteStruct, options) {\n const note = new RepeatNote(type, noteStruct, options);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n GhostNote(noteStruct) {\n const ghostNote = new GhostNote(noteStruct);\n if (this.stave)\n ghostNote.setStave(this.stave);\n ghostNote.setContext(this.context);\n this.renderQ.push(ghostNote);\n return ghostNote;\n }\n TextNote(noteStruct) {\n const textNote = new TextNote(noteStruct);\n if (this.stave)\n textNote.setStave(this.stave);\n textNote.setContext(this.context);\n this.renderQ.push(textNote);\n return textNote;\n }\n BarNote(params = {}) {\n const barNote = new BarNote(params.type);\n if (this.stave)\n barNote.setStave(this.stave);\n barNote.setContext(this.context);\n this.renderQ.push(barNote);\n return barNote;\n }\n ClefNote(params) {\n const p = Object.assign({ type: 'treble', options: {\n size: 'default',\n annotation: undefined,\n } }, params);\n const clefNote = new ClefNote(p.type, p.options.size, p.options.annotation);\n if (this.stave)\n clefNote.setStave(this.stave);\n clefNote.setContext(this.context);\n this.renderQ.push(clefNote);\n return clefNote;\n }\n TimeSigNote(params) {\n const p = Object.assign({ time: '4/4' }, params);\n const timeSigNote = new TimeSigNote(p.time);\n if (this.stave)\n timeSigNote.setStave(this.stave);\n timeSigNote.setContext(this.context);\n this.renderQ.push(timeSigNote);\n return timeSigNote;\n }\n KeySigNote(params) {\n const keySigNote = new KeySigNote(params.key, params.cancelKey, params.alterKey);\n if (this.stave)\n keySigNote.setStave(this.stave);\n keySigNote.setContext(this.context);\n this.renderQ.push(keySigNote);\n return keySigNote;\n }\n TabNote(noteStruct) {\n const note = new TabNote(noteStruct);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n GraceNote(noteStruct) {\n const note = new GraceNote(noteStruct);\n if (this.stave)\n note.setStave(this.stave);\n note.setContext(this.context);\n return note;\n }\n GraceNoteGroup(params) {\n const group = new GraceNoteGroup(params.notes, params.slur);\n group.setContext(this.context);\n return group;\n }\n Accidental(params) {\n const accid = new Accidental(params.type);\n accid.setContext(this.context);\n return accid;\n }\n Annotation(params) {\n const p = Object.assign({ text: 'p', hJustify: AnnotationHorizontalJustify.CENTER, vJustify: AnnotationVerticalJustify.BOTTOM }, params);\n const annotation = new Annotation(p.text);\n annotation.setJustification(p.hJustify);\n annotation.setVerticalJustification(p.vJustify);\n annotation.setFont(p.font);\n annotation.setContext(this.context);\n return annotation;\n }\n ChordSymbol(params) {\n const p = Object.assign({ vJustify: 'top', hJustify: 'center', kerning: true, reportWidth: true }, params);\n const chordSymbol = new ChordSymbol();\n chordSymbol.setHorizontal(p.hJustify);\n chordSymbol.setVertical(p.vJustify);\n chordSymbol.setEnableKerning(p.kerning);\n chordSymbol.setReportWidth(p.reportWidth);\n // There is a default font based on the engraving font. Only set then\n // font if it is specific, else use the default\n if (typeof p.fontFamily === 'string' && typeof p.fontSize === 'number') {\n if (typeof p.fontWeight === 'string')\n chordSymbol.setFont(p.fontFamily, p.fontSize, p.fontWeight);\n else\n chordSymbol.setFont(p.fontFamily, p.fontSize, '');\n }\n else if (typeof p.fontSize === 'number') {\n chordSymbol.setFontSize(p.fontSize);\n }\n chordSymbol.setContext(this.context);\n return chordSymbol;\n }\n Articulation(params) {\n const p = Object.assign({ type: 'a.', position: 'above' }, params);\n const articulation = new Articulation(p.type);\n articulation.setPosition(p.position);\n articulation.setContext(this.context);\n return articulation;\n }\n TextDynamics(params) {\n const p = Object.assign({ text: 'p', duration: 'q', dots: 0, line: 0 }, params);\n const text = new TextDynamics({\n text: p.text,\n line: p.line,\n duration: p.duration,\n dots: p.dots,\n });\n if (this.stave)\n text.setStave(this.stave);\n text.setContext(this.context);\n this.renderQ.push(text);\n return text;\n }\n Fingering(params) {\n const p = Object.assign({ number: '0', position: 'left' }, params);\n const fingering = new FretHandFinger(p.number);\n fingering.setPosition(p.position);\n fingering.setContext(this.context);\n return fingering;\n }\n StringNumber(params) {\n const stringNumber = new StringNumber(params.number);\n stringNumber.setPosition(params.position);\n stringNumber.setContext(this.context);\n return stringNumber;\n }\n TickContext() {\n return new TickContext();\n }\n ModifierContext() {\n return new ModifierContext();\n }\n MultiMeasureRest(params) {\n const numMeasures = defined(params.number_of_measures, 'NoNumberOfMeasures');\n const multiMeasureRest = new MultiMeasureRest(numMeasures, params);\n multiMeasureRest.setContext(this.context);\n this.renderQ.push(multiMeasureRest);\n return multiMeasureRest;\n }\n Voice(params) {\n const p = Object.assign({ time: '4/4' }, params);\n const voice = new Voice(p.time, p.options);\n this.voices.push(voice);\n return voice;\n }\n StaveConnector(params) {\n const connector = new StaveConnector(params.top_stave, params.bottom_stave);\n connector.setType(params.type).setContext(this.context);\n this.renderQ.push(connector);\n return connector;\n }\n Formatter(options) {\n return new Formatter(options);\n }\n Tuplet(params) {\n const p = Object.assign({ notes: [], options: {} }, params);\n const tuplet = new Tuplet(p.notes, p.options).setContext(this.context);\n this.renderQ.push(tuplet);\n return tuplet;\n }\n Beam(params) {\n var _a, _b, _c;\n const beam = new Beam(params.notes, (_a = params.options) === null || _a === void 0 ? void 0 : _a.autoStem).setContext(this.context);\n beam.breakSecondaryAt((_c = (_b = params.options) === null || _b === void 0 ? void 0 : _b.secondaryBeamBreaks) !== null && _c !== void 0 ? _c : []);\n this.renderQ.push(beam);\n return beam;\n }\n Curve(params) {\n const curve = new Curve(params.from, params.to, params.options).setContext(this.context);\n this.renderQ.push(curve);\n return curve;\n }\n StaveTie(params) {\n var _a;\n const tie = new StaveTie({\n first_note: params.from,\n last_note: params.to,\n first_indices: params.first_indices,\n last_indices: params.last_indices,\n }, params.text);\n if ((_a = params.options) === null || _a === void 0 ? void 0 : _a.direction)\n tie.setDirection(params.options.direction);\n tie.setContext(this.context);\n this.renderQ.push(tie);\n return tie;\n }\n StaveLine(params) {\n var _a, _b;\n const line = new StaveLine({\n first_note: params.from,\n last_note: params.to,\n first_indices: params.first_indices,\n last_indices: params.last_indices,\n });\n if ((_a = params.options) === null || _a === void 0 ? void 0 : _a.text)\n line.setText(params.options.text);\n if ((_b = params.options) === null || _b === void 0 ? void 0 : _b.font)\n line.setFont(params.options.font);\n line.setContext(this.context);\n this.renderQ.push(line);\n return line;\n }\n VibratoBracket(params) {\n const vibratoBracket = new VibratoBracket({\n start: params.from,\n stop: params.to,\n });\n if (params.options.line)\n vibratoBracket.setLine(params.options.line);\n if (params.options.harsh)\n vibratoBracket.setHarsh(params.options.harsh);\n vibratoBracket.setContext(this.context);\n this.renderQ.push(vibratoBracket);\n return vibratoBracket;\n }\n TextBracket(params) {\n const textBracket = new TextBracket({\n start: params.from,\n stop: params.to,\n text: params.text,\n superscript: params.options.superscript,\n position: params.options.position,\n });\n if (params.options.line)\n textBracket.setLine(params.options.line);\n if (params.options.font)\n textBracket.setFont(params.options.font);\n textBracket.setContext(this.context);\n this.renderQ.push(textBracket);\n return textBracket;\n }\n System(params = {}) {\n params.factory = this;\n const system = new System(params).setContext(this.context);\n this.systems.push(system);\n return system;\n }\n /**\n * Creates EasyScore. Normally the first step after constructing a Factory. For example:\n * ```\n * const vf: Factory = new Vex.Flow.Factory({renderer: { elementId: 'boo', width: 1200, height: 600 }});\n * const score: EasyScore = vf.EasyScore();\n * ```\n * @param options.factory optional instance of Factory\n * @param options.builder instance of Builder\n * @param options.commitHooks function to call after a note element is created\n * @param options.throwOnError throw error in case of parsing error\n */\n EasyScore(options = {}) {\n options.factory = this;\n return new EasyScore(options);\n }\n PedalMarking(params) {\n const p = Object.assign({ notes: [], options: {\n style: 'mixed',\n } }, params);\n const pedal = new PedalMarking(p.notes);\n pedal.setType(PedalMarking.typeString[p.options.style]);\n pedal.setContext(this.context);\n this.renderQ.push(pedal);\n return pedal;\n }\n NoteSubGroup(params) {\n const p = Object.assign({ notes: [] }, params);\n const group = new NoteSubGroup(p.notes);\n group.setContext(this.context);\n return group;\n }\n /** Render the score. */\n draw() {\n const ctx = this.context;\n this.systems.forEach((s) => s.setContext(ctx).format());\n this.staves.forEach((s) => s.setContext(ctx).draw());\n this.voices.forEach((v) => v.setContext(ctx).draw());\n this.renderQ.forEach((e) => {\n if (!e.isRendered())\n e.setContext(ctx).draw();\n });\n this.systems.forEach((s) => s.setContext(ctx).draw());\n this.reset();\n }\n}\n/** To enable logging for this class. Set `Vex.Flow.Factory.DEBUG` to `true`. */\nFactory.DEBUG = false;\n/** Default text font. */\nFactory.TEXT_FONT = Object.assign({}, Element.TEXT_FONT);\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// Author: Raffaele Viglianti, 2012 http://itisnotsound.wordpress.com/\n//\n// This class implements hairpins between notes.\n// Hairpins can be either crescendo or decrescendo.\nimport { Element } from './element';\nimport { Modifier } from './modifier';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class StaveHairpin extends Element {\n /**\n * Create a new hairpin from the specified notes.\n *\n * @param {!Object} notes The notes to tie up.\n * Notes is a struct that has:\n *\n * {\n * first_note: Note,\n * last_note: Note,\n * }\n * @param {!Object} type The type of hairpin\n */\n constructor(notes, type) {\n super();\n this.setNotes(notes);\n this.hairpin = type;\n this.position = Modifier.Position.BELOW;\n this.render_options = {\n height: 10,\n y_shift: 0,\n left_shift_px: 0,\n right_shift_px: 0,\n right_shift_ticks: 0,\n left_shift_ticks: 0,\n };\n }\n static get CATEGORY() {\n return Category.StaveHairpin;\n }\n /* Helper function to convert ticks into pixels.\n * Requires a Formatter with voices joined and formatted (to\n * get pixels per tick)\n *\n * options is struct that has:\n *\n * {\n * height: px,\n * y_shift: px, // vertical offset\n * left_shift_ticks: 0, // left horizontal offset expressed in ticks\n * right_shift_ticks: 0 // right horizontal offset expressed in ticks\n * }\n *\n **/\n static FormatByTicksAndDraw(ctx, formatter, notes, type, position, options) {\n var _a, _b;\n const ppt = formatter.pixelsPerTick;\n if (ppt == null) {\n throw new RuntimeError('BadArguments', 'A valid Formatter must be provide to draw offsets by ticks.');\n }\n const l_shift_px = ppt * ((_a = options.left_shift_ticks) !== null && _a !== void 0 ? _a : 0);\n const r_shift_px = ppt * ((_b = options.right_shift_ticks) !== null && _b !== void 0 ? _b : 0);\n const hairpin_options = {\n height: options.height,\n y_shift: options.y_shift,\n left_shift_px: l_shift_px,\n right_shift_px: r_shift_px,\n right_shift_ticks: 0,\n left_shift_ticks: 0,\n };\n new StaveHairpin({\n first_note: notes.first_note,\n last_note: notes.last_note,\n }, type)\n .setContext(ctx)\n .setRenderOptions(hairpin_options)\n .setPosition(position)\n .draw();\n }\n setPosition(position) {\n if (position === Modifier.Position.ABOVE || position === Modifier.Position.BELOW) {\n this.position = position;\n }\n return this;\n }\n setRenderOptions(options) {\n if (options.height != null &&\n options.y_shift != null &&\n options.left_shift_px != null &&\n options.right_shift_px != null) {\n this.render_options = options;\n }\n return this;\n }\n /**\n * Set the notes to attach this hairpin to.\n *\n * @param {!Object} notes The start and end notes.\n */\n setNotes(notes) {\n if (!notes.first_note && !notes.last_note) {\n throw new RuntimeError('BadArguments', 'Hairpin needs to have either first_note or last_note set.');\n }\n this.notes = notes;\n this.first_note = notes.first_note;\n this.last_note = notes.last_note;\n return this;\n }\n renderHairpin(params) {\n const ctx = this.checkContext();\n let dis = this.render_options.y_shift + 20;\n let y_shift = params.first_y;\n if (this.position === Modifier.Position.ABOVE) {\n dis = -dis + 30;\n y_shift = params.first_y - params.staff_height;\n }\n const l_shift = this.render_options.left_shift_px;\n const r_shift = this.render_options.right_shift_px;\n ctx.beginPath();\n switch (this.hairpin) {\n case StaveHairpin.type.CRESC:\n ctx.moveTo(params.last_x + r_shift, y_shift + dis);\n ctx.lineTo(params.first_x + l_shift, y_shift + this.render_options.height / 2 + dis);\n ctx.lineTo(params.last_x + r_shift, y_shift + this.render_options.height + dis);\n break;\n case StaveHairpin.type.DECRESC:\n ctx.moveTo(params.first_x + l_shift, y_shift + dis);\n ctx.lineTo(params.last_x + r_shift, y_shift + this.render_options.height / 2 + dis);\n ctx.lineTo(params.first_x + l_shift, y_shift + this.render_options.height + dis);\n break;\n default:\n // Default is NONE, so nothing to draw\n break;\n }\n ctx.stroke();\n ctx.closePath();\n }\n draw() {\n this.checkContext();\n this.setRendered();\n const firstNote = this.first_note;\n const lastNote = this.last_note;\n if (!firstNote || !lastNote)\n throw new RuntimeError('NoNote', 'Notes required to draw');\n const start = firstNote.getModifierStartXY(this.position, 0);\n const end = lastNote.getModifierStartXY(this.position, 0);\n this.renderHairpin({\n first_x: start.x,\n last_x: end.x,\n first_y: firstNote.checkStave().getY() + firstNote.checkStave().getHeight(),\n last_y: lastNote.checkStave().getY() + lastNote.checkStave().getHeight(),\n staff_height: firstNote.checkStave().getHeight(),\n });\n }\n}\nStaveHairpin.type = {\n CRESC: 1,\n DECRESC: 2,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// This class implements varies types of ties between contiguous notes. The\n// ties include: regular ties, hammer ons, pull offs, and slides.\nimport { Font, FontStyle, FontWeight } from './font';\nimport { TabTie } from './tabtie';\nimport { Category } from './typeguard';\nimport { RuntimeError } from './util';\nexport class TabSlide extends TabTie {\n /**\n * @param notes is a struct of the form:\n * {\n * first_note: Note,\n * last_note: Note,\n * first_indices: [n1, n2, n3],\n * last_indices: [n1, n2, n3]\n * }\n * @param notes.first_note the starting note of the slide\n * @param notes.last_note the ending note of the slide\n * @param notes.first_indices specifies which string + fret positions of the TabNote are used in this slide. zero indexed.\n * @param notes.last_indices currently unused. we assume it's the same as first_indices.\n *\n * @param direction TabSlide.SLIDE_UP or TabSlide.SLIDE_DOWN\n */\n constructor(notes, direction) {\n super(notes, 'sl.');\n // Determine the direction automatically if it is not provided.\n if (!direction) {\n let first_fret = notes.first_note.getPositions()[0].fret;\n if (typeof first_fret === 'string') {\n first_fret = parseInt(first_fret, 10);\n }\n let last_fret = notes.last_note.getPositions()[0].fret;\n if (typeof last_fret === 'string') {\n last_fret = parseInt(last_fret, 10);\n }\n // If either of the frets are 'X', parseInt() above will return NaN.\n // Choose TabSlide.SLIDE_UP by default.\n if (isNaN(first_fret) || isNaN(last_fret)) {\n direction = TabSlide.SLIDE_UP;\n }\n else {\n direction = first_fret > last_fret ? TabSlide.SLIDE_DOWN : TabSlide.SLIDE_UP;\n }\n }\n this.direction = direction;\n this.render_options.cp1 = 11;\n this.render_options.cp2 = 14;\n this.render_options.y_shift = 0.5;\n this.resetFont();\n }\n static get CATEGORY() {\n return Category.TabSlide;\n }\n static get SLIDE_UP() {\n return 1;\n }\n static get SLIDE_DOWN() {\n return -1;\n }\n static createSlideUp(notes) {\n return new TabSlide(notes, TabSlide.SLIDE_UP);\n }\n static createSlideDown(notes) {\n return new TabSlide(notes, TabSlide.SLIDE_DOWN);\n }\n renderTie(params) {\n if (params.first_ys.length === 0 || params.last_ys.length === 0) {\n throw new RuntimeError('BadArguments', 'No Y-values to render');\n }\n const ctx = this.checkContext();\n const first_x_px = params.first_x_px;\n const first_ys = params.first_ys;\n const last_x_px = params.last_x_px;\n const direction = params.direction;\n if (direction !== TabSlide.SLIDE_UP && direction !== TabSlide.SLIDE_DOWN) {\n throw new RuntimeError('BadSlide', 'Invalid slide direction');\n }\n // eslint-disable-next-line\n const first_indices = this.notes.first_indices;\n for (let i = 0; i < first_indices.length; ++i) {\n const slide_y = first_ys[first_indices[i]] + this.render_options.y_shift;\n if (isNaN(slide_y)) {\n throw new RuntimeError('BadArguments', 'Bad indices for slide rendering.');\n }\n ctx.beginPath();\n ctx.moveTo(first_x_px, slide_y + 3 * direction);\n ctx.lineTo(last_x_px, slide_y - 3 * direction);\n ctx.closePath();\n ctx.stroke();\n }\n this.setRendered();\n }\n}\nTabSlide.TEXT_FONT = {\n family: Font.SERIF,\n size: 10,\n weight: FontWeight.BOLD,\n style: FontStyle.ITALIC,\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Tables } from './tables';\nimport { RuntimeError } from './util';\n/** `Tuning` implements varies types of tunings for tablature. */\nexport class Tuning {\n /**\n * Constructor.\n * @param tuningString tuning name (eg. 'dagdad') or comma separated note strings\n */\n constructor(tuningString = 'E/5,B/4,G/4,D/4,A/3,E/3,B/2,E/2') {\n this.tuningValues = [];\n // Default to standard tuning.\n this.setTuning(tuningString);\n }\n static get names() {\n return {\n standard: 'E/5,B/4,G/4,D/4,A/3,E/3',\n dagdad: 'D/5,A/4,G/4,D/4,A/3,D/3',\n dropd: 'E/5,B/4,G/4,D/4,A/3,D/3',\n eb: 'Eb/5,Bb/4,Gb/4,Db/4,Ab/3,Db/3',\n standardBanjo: 'D/5,B/4,G/4,D/4,G/5',\n };\n }\n /** Return the note number associated to the note string. */\n noteToInteger(noteString) {\n return Tables.keyProperties(noteString).int_value;\n }\n /**\n * Set tuning identified by tuning name (eg. 'dagdad')\n * @param tuningString tuning name (eg. 'dagdad') or comma separated note strings\n */\n setTuning(tuningString) {\n if (Tuning.names[tuningString]) {\n tuningString = Tuning.names[tuningString];\n }\n this.tuningValues = [];\n const keys = tuningString.split(/\\s*,\\s*/);\n if (keys.length === 0) {\n throw new RuntimeError('BadArguments', `Invalid tuning string: ${tuningString}`);\n }\n for (let i = 0; i < keys.length; ++i) {\n this.tuningValues[i] = this.noteToInteger(keys[i]);\n }\n }\n /** Return the note number associated with a tablature string. */\n getValueForString(stringNum) {\n const s = Number(stringNum);\n if (s < 1 || s > this.tuningValues.length) {\n throw new RuntimeError('BadArguments', `String number must be between 1 and ${this.tuningValues.length}:${stringNum}`);\n }\n return this.tuningValues[s - 1];\n }\n /** Return the note number associated with a tablature string and fret. */\n getValueForFret(fretNum, stringNum) {\n const stringValue = this.getValueForString(stringNum);\n const f = Number(fretNum);\n if (f < 0) {\n throw new RuntimeError('BadArguments', `Fret number must be 0 or higher: ${fretNum}`);\n }\n return stringValue + f;\n }\n /** Return the note string associated with tablature string and fret. */\n getNoteForFret(fretNum, stringNum) {\n const noteValue = this.getValueForFret(fretNum, stringNum);\n const octave = Math.floor(noteValue / 12);\n const value = noteValue % 12;\n return `${Tables.integerToNote(value)}/${octave}`;\n }\n}\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { Accidental } from './accidental';\nimport { Annotation } from './annotation';\nimport { Articulation } from './articulation';\nimport { BarNote } from './barnote';\nimport { Beam } from './beam';\nimport { Bend } from './bend';\nimport { BoundingBox } from './boundingbox';\nimport { BoundingBoxComputation } from './boundingboxcomputation';\nimport { CanvasContext } from './canvascontext';\nimport { ChordSymbol } from './chordsymbol';\nimport { Clef } from './clef';\nimport { ClefNote } from './clefnote';\nimport { Crescendo } from './crescendo';\nimport { Curve } from './curve';\nimport { Dot } from './dot';\nimport { EasyScore } from './easyscore';\nimport { Element } from './element';\nimport { Factory } from './factory';\nimport { Font } from './font';\nimport { Formatter } from './formatter';\nimport { Fraction } from './fraction';\nimport { FretHandFinger } from './frethandfinger';\nimport { GhostNote } from './ghostnote';\nimport { Glyph } from './glyph';\nimport { GlyphNote } from './glyphnote';\nimport { GraceNote } from './gracenote';\nimport { GraceNoteGroup } from './gracenotegroup';\nimport { GraceTabNote } from './gracetabnote';\nimport { KeyManager } from './keymanager';\nimport { KeySignature } from './keysignature';\nimport { KeySigNote } from './keysignote';\nimport { Modifier, ModifierPosition } from './modifier';\nimport { ModifierContext } from './modifiercontext';\nimport { MultiMeasureRest } from './multimeasurerest';\nimport { Music } from './music';\nimport { Note } from './note';\nimport { NoteHead } from './notehead';\nimport { NoteSubGroup } from './notesubgroup';\nimport { Ornament } from './ornament';\nimport { Parenthesis } from './parenthesis';\nimport { Parser } from './parser';\nimport { PedalMarking } from './pedalmarking';\nimport { Registry } from './registry';\nimport { RenderContext } from './rendercontext';\nimport { Renderer } from './renderer';\nimport { RepeatNote } from './repeatnote';\nimport { Stave } from './stave';\nimport { Barline, BarlineType } from './stavebarline';\nimport { StaveConnector } from './staveconnector';\nimport { StaveHairpin } from './stavehairpin';\nimport { StaveLine } from './staveline';\nimport { StaveModifier } from './stavemodifier';\nimport { StaveNote } from './stavenote';\nimport { Repetition } from './staverepetition';\nimport { StaveTempo } from './stavetempo';\nimport { StaveText } from './stavetext';\nimport { StaveTie } from './stavetie';\nimport { Volta } from './stavevolta';\nimport { Stem } from './stem';\nimport { StringNumber } from './stringnumber';\nimport { Stroke } from './strokes';\nimport { SVGContext } from './svgcontext';\nimport { System } from './system';\nimport { Tables } from './tables';\nimport { TabNote } from './tabnote';\nimport { TabSlide } from './tabslide';\nimport { TabStave } from './tabstave';\nimport { TabTie } from './tabtie';\nimport { TextBracket } from './textbracket';\nimport { TextDynamics } from './textdynamics';\nimport { TextFormatter } from './textformatter';\nimport { TextNote } from './textnote';\nimport { TickContext } from './tickcontext';\nimport { TimeSignature } from './timesignature';\nimport { TimeSigNote } from './timesignote';\nimport { Tremolo } from './tremolo';\nimport { Tuning } from './tuning';\nimport { Tuplet } from './tuplet';\nimport { DATE, ID, VERSION } from './version';\nimport { Vibrato } from './vibrato';\nimport { VibratoBracket } from './vibratobracket';\nimport { Voice } from './voice';\nexport class Flow {\n static get BUILD() {\n return {\n /** version number. */\n VERSION: VERSION,\n /** git commit ID that this library was built from. */\n ID: ID,\n /** The date when this library was compiled. */\n DATE: DATE,\n };\n }\n static get Flow() {\n // This (circular reference) provides a handy shortcut for importing VexFlow via `require()`.\n // For example:\n // const Vex = require('vexflow');\n // const { Flow, Stave, StaveNote, Formatter, Renderer } = Vex.Flow;\n return Flow;\n }\n // ... more to come ...\n /**\n * Examples:\n * ```\n * Vex.Flow.setMusicFont('Petaluma');\n * Vex.Flow.setMusicFont('Bravura', 'Gonville');\n * ```\n *\n * **CASE 1**: You are using `vexflow.js`, which includes all music fonts (Bravura, Gonville, Petaluma, Custom).\n * In this case, calling this method is optional, since VexFlow already defaults to a music font stack of:\n * 'Bravura', 'Gonville', 'Custom'.\n *\n * **CASE 2**: You are using `vexflow-bravura.js` or `vexflow-petaluma.js` or `vexflow-gonville.js`,\n * which includes a single music font. Calling this method is unnecessary.\n *\n * **CASE 3**: You are using the light weight `vexflow-core.js` to take advantage of lazy loading for fonts.\n * In this case, the default music font stack is empty.\n * Example:\n * ```\n * await Vex.Flow.fetchMusicFont('Petaluma');\n * Vex.Flow.setMusicFont('Petaluma');\n * ... (do VexFlow stuff) ...\n * ```\n * See `demos/fonts/` for more examples.\n *\n * @returns an array of Font objects corresponding to the provided `fontNames`.\n */\n static setMusicFont(...fontNames) {\n // Convert the array of font names into an array of Font objects.\n const fonts = fontNames.map((fontName) => Font.load(fontName));\n Tables.MUSIC_FONT_STACK = fonts;\n Glyph.MUSIC_FONT_STACK = fonts.slice();\n Glyph.CURRENT_CACHE_KEY = fontNames.join(',');\n return fonts;\n }\n /**\n * Used with vexflow-core which supports dynamic font loading.\n */\n // eslint-disable-next-line\n static fetchMusicFont(fontName, fontModuleOrPath) {\n return __awaiter(this, void 0, void 0, function* () {\n // The default implementation does nothing.\n // See vexflow-core.ts for the implementation that vexflow-core.js uses.\n });\n }\n static getMusicFont() {\n const fonts = Tables.MUSIC_FONT_STACK;\n return fonts.map((font) => font.getName());\n }\n static get NOTATION_FONT_SCALE() {\n return Tables.NOTATION_FONT_SCALE;\n }\n static set NOTATION_FONT_SCALE(value) {\n Tables.NOTATION_FONT_SCALE = value;\n }\n static get TABLATURE_FONT_SCALE() {\n return Tables.TABLATURE_FONT_SCALE;\n }\n static set TABLATURE_FONT_SCALE(value) {\n Tables.TABLATURE_FONT_SCALE = value;\n }\n static get RESOLUTION() {\n return Tables.RESOLUTION;\n }\n static set RESOLUTION(value) {\n Tables.RESOLUTION = value;\n }\n static get SLASH_NOTEHEAD_WIDTH() {\n return Tables.SLASH_NOTEHEAD_WIDTH;\n }\n static set SLASH_NOTEHEAD_WIDTH(value) {\n Tables.SLASH_NOTEHEAD_WIDTH = value;\n }\n static get STAVE_LINE_DISTANCE() {\n return Tables.STAVE_LINE_DISTANCE;\n }\n static set STAVE_LINE_DISTANCE(value) {\n Tables.STAVE_LINE_DISTANCE = value;\n }\n static get STAVE_LINE_THICKNESS() {\n return Tables.STAVE_LINE_THICKNESS;\n }\n static set STAVE_LINE_THICKNESS(value) {\n Tables.STAVE_LINE_THICKNESS = value;\n }\n static get STEM_HEIGHT() {\n return Tables.STEM_HEIGHT;\n }\n static set STEM_HEIGHT(value) {\n Tables.STEM_HEIGHT = value;\n }\n static get STEM_WIDTH() {\n return Tables.STEM_WIDTH;\n }\n static set STEM_WIDTH(value) {\n Tables.STEM_WIDTH = value;\n }\n static get TIME4_4() {\n return Tables.TIME4_4;\n }\n static get accidentalMap() {\n return Tables.accidentalMap;\n }\n static get unicode() {\n return Tables.unicode;\n }\n static keySignature(spec) {\n return Tables.keySignature(spec);\n }\n static hasKeySignature(spec) {\n return Tables.hasKeySignature(spec);\n }\n static getKeySignatures() {\n return Tables.getKeySignatures();\n }\n static clefProperties(clef) {\n return Tables.clefProperties(clef);\n }\n // eslint-disable-next-line\n static keyProperties(key, clef, params) {\n return Tables.keyProperties(key, clef, params);\n }\n static durationToTicks(duration) {\n return Tables.durationToTicks(duration);\n }\n}\nFlow.Accidental = Accidental;\nFlow.Annotation = Annotation;\nFlow.Articulation = Articulation;\nFlow.Barline = Barline;\nFlow.BarNote = BarNote;\nFlow.Beam = Beam;\nFlow.Bend = Bend;\nFlow.BoundingBox = BoundingBox;\nFlow.BoundingBoxComputation = BoundingBoxComputation;\nFlow.CanvasContext = CanvasContext;\nFlow.ChordSymbol = ChordSymbol;\nFlow.Clef = Clef;\nFlow.ClefNote = ClefNote;\nFlow.Crescendo = Crescendo;\nFlow.Curve = Curve;\nFlow.Dot = Dot;\nFlow.EasyScore = EasyScore;\nFlow.Element = Element;\nFlow.Factory = Factory;\nFlow.Font = Font;\nFlow.Formatter = Formatter;\nFlow.Fraction = Fraction;\nFlow.FretHandFinger = FretHandFinger;\nFlow.GhostNote = GhostNote;\nFlow.Glyph = Glyph;\nFlow.GlyphNote = GlyphNote;\nFlow.GraceNote = GraceNote;\nFlow.GraceNoteGroup = GraceNoteGroup;\nFlow.GraceTabNote = GraceTabNote;\nFlow.KeyManager = KeyManager;\nFlow.KeySignature = KeySignature;\nFlow.KeySigNote = KeySigNote;\nFlow.Modifier = Modifier;\nFlow.ModifierContext = ModifierContext;\nFlow.MultiMeasureRest = MultiMeasureRest;\nFlow.Music = Music;\nFlow.Note = Note;\nFlow.NoteHead = NoteHead;\nFlow.NoteSubGroup = NoteSubGroup;\nFlow.Ornament = Ornament;\nFlow.Parenthesis = Parenthesis;\nFlow.Parser = Parser;\nFlow.PedalMarking = PedalMarking;\nFlow.Registry = Registry;\nFlow.RenderContext = RenderContext;\nFlow.Renderer = Renderer;\nFlow.RepeatNote = RepeatNote;\nFlow.Repetition = Repetition;\nFlow.Stave = Stave;\nFlow.StaveConnector = StaveConnector;\nFlow.StaveHairpin = StaveHairpin;\nFlow.StaveLine = StaveLine;\nFlow.StaveModifier = StaveModifier;\nFlow.StaveNote = StaveNote;\nFlow.StaveTempo = StaveTempo;\nFlow.StaveText = StaveText;\nFlow.StaveTie = StaveTie;\nFlow.Stem = Stem;\nFlow.StringNumber = StringNumber;\nFlow.Stroke = Stroke;\nFlow.SVGContext = SVGContext;\nFlow.System = System;\nFlow.TabNote = TabNote;\nFlow.TabSlide = TabSlide;\nFlow.TabStave = TabStave;\nFlow.TabTie = TabTie;\nFlow.TextBracket = TextBracket;\nFlow.TextDynamics = TextDynamics;\nFlow.TextFormatter = TextFormatter;\nFlow.TextNote = TextNote;\nFlow.TickContext = TickContext;\nFlow.TimeSignature = TimeSignature;\nFlow.TimeSigNote = TimeSigNote;\nFlow.Tremolo = Tremolo;\nFlow.Tuning = Tuning;\nFlow.Tuplet = Tuplet;\nFlow.Vibrato = Vibrato;\nFlow.VibratoBracket = VibratoBracket;\nFlow.Voice = Voice;\nFlow.Volta = Volta;\n// enums need to be exported too!\nFlow.BarlineType = BarlineType;\nFlow.ModifierPosition = ModifierPosition;\n","export const VERSION = '4.0.1-alpha.2';\nexport const ID = '0df10df6d1fab3a99f5aa306341a31c6e686d659';\nexport const DATE = '2022-02-02T09:30:30.784Z';\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Balazs Forian-Szabo\n//\n// ## Description\n//\n// A basic implementation of grace notes\n// to be rendered on a tab stave.\n//\n// See `tests/gracetabnote_tests.ts` for usage examples.\nimport { Font } from './font';\nimport { TabNote } from './tabnote';\nimport { Category } from './typeguard';\nexport class GraceTabNote extends TabNote {\n static get CATEGORY() {\n return Category.GraceTabNote;\n }\n constructor(noteStruct) {\n super(noteStruct, false);\n this.render_options = Object.assign(Object.assign({}, this.render_options), { \n // vertical shift from stave line\n y_shift: 0.3, \n // grace glyph scale\n scale: 0.6, \n // grace tablature font\n font: `7.5pt ${Font.SANS_SERIF}` });\n this.updateWidth();\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This class implements diatonic key management.\nimport { Music } from './music';\nimport { RuntimeError } from './util';\nexport class KeyManager {\n constructor(key) {\n this.music = new Music();\n this.setKey(key);\n }\n setKey(key) {\n this.key = key;\n this.reset();\n return this;\n }\n getKey() {\n return this.key;\n }\n reset() {\n this.keyParts = this.music.getKeyParts(this.key);\n this.keyString = this.keyParts.root;\n if (this.keyParts.accidental)\n this.keyString += this.keyParts.accidental;\n const is_supported_type = Music.scaleTypes[this.keyParts.type];\n if (!is_supported_type) {\n throw new RuntimeError('BadArguments', `Unsupported key type: ${this.key}`);\n }\n this.scale = this.music.getScaleTones(this.music.getNoteValue(this.keyString), Music.scaleTypes[this.keyParts.type]);\n this.scaleMap = {};\n this.scaleMapByValue = {};\n this.originalScaleMapByValue = {};\n const noteLocation = Music.root_indices[this.keyParts.root];\n for (let i = 0; i < Music.roots.length; ++i) {\n const index = (noteLocation + i) % Music.roots.length;\n const rootName = Music.roots[index];\n const noteName = this.music.getRelativeNoteName(rootName, this.scale[i]);\n this.scaleMap[rootName] = noteName;\n this.scaleMapByValue[this.scale[i]] = noteName;\n this.originalScaleMapByValue[this.scale[i]] = noteName;\n }\n return this;\n }\n getAccidental(key) {\n const root = this.music.getKeyParts(key).root;\n const parts = this.music.getNoteParts(this.scaleMap[root]);\n return {\n note: this.scaleMap[root],\n accidental: parts.accidental,\n };\n }\n selectNote(note) {\n note = note.toLowerCase();\n const parts = this.music.getNoteParts(note);\n // First look for matching note in our altered scale\n const scaleNote = this.scaleMap[parts.root];\n const modparts = this.music.getNoteParts(scaleNote);\n if (scaleNote === note) {\n return {\n note: scaleNote,\n accidental: parts.accidental,\n change: false,\n };\n }\n // Then search for a note of equivalent value in our altered scale\n const valueNote = this.scaleMapByValue[this.music.getNoteValue(note)];\n if (valueNote != null) {\n return {\n note: valueNote,\n accidental: this.music.getNoteParts(valueNote).accidental,\n change: false,\n };\n }\n // Then search for a note of equivalent value in the original scale\n const originalValueNote = this.originalScaleMapByValue[this.music.getNoteValue(note)];\n if (originalValueNote != null) {\n this.scaleMap[modparts.root] = originalValueNote;\n delete this.scaleMapByValue[this.music.getNoteValue(scaleNote)];\n this.scaleMapByValue[this.music.getNoteValue(note)] = originalValueNote;\n return {\n note: originalValueNote,\n accidental: this.music.getNoteParts(originalValueNote).accidental,\n change: true,\n };\n }\n // Then try to unmodify a currently modified note.\n if (modparts.root === note) {\n delete this.scaleMapByValue[this.music.getNoteValue(this.scaleMap[parts.root])];\n this.scaleMapByValue[this.music.getNoteValue(modparts.root)] = modparts.root;\n this.scaleMap[modparts.root] = modparts.root;\n return {\n note: modparts.root,\n accidental: undefined,\n change: true,\n };\n }\n // Last resort -- shitshoot\n delete this.scaleMapByValue[this.music.getNoteValue(this.scaleMap[parts.root])];\n this.scaleMapByValue[this.music.getNoteValue(note)] = note;\n delete this.scaleMap[modparts.root];\n this.scaleMap[modparts.root] = note;\n return {\n note,\n accidental: parts.accidental,\n change: true,\n };\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Mike Corrigan \n// MIT License\nimport { Glyph } from './glyph';\nimport { GraceNote } from './gracenote';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { Tables } from './tables';\nimport { Category, isGraceNote } from './typeguard';\n/** Tremolo implements tremolo notation. */\nexport class Tremolo extends Modifier {\n /**\n * @param num number of bars\n */\n constructor(num) {\n super();\n this.num = num;\n this.position = Modifier.Position.CENTER;\n this.code = 'tremolo1';\n // big strokes scales initialised to 1 (no scale)\n this.y_spacing_scale = 1;\n this.extra_stroke_scale = 1;\n }\n static get CATEGORY() {\n return Category.Tremolo;\n }\n /** Draw the tremolo on the rendering context. */\n draw() {\n const ctx = this.checkContext();\n const note = this.checkAttachedNote();\n this.setRendered();\n const stemDirection = note.getStemDirection();\n const start = note.getModifierStartXY(this.position, this.index);\n let x = start.x;\n const gn = isGraceNote(note);\n const scale = gn ? GraceNote.SCALE : 1;\n const category = `tremolo.${gn ? 'grace' : 'default'}`;\n const musicFont = Tables.currentMusicFont();\n let y_spacing = musicFont.lookupMetric(`${category}.spacing`) * stemDirection;\n // add y_spacing_scale for big strokes (#1258)\n y_spacing *= this.y_spacing_scale;\n const height = this.num * y_spacing;\n let y = note.getStemExtents().baseY - height;\n if (stemDirection < 0) {\n y += musicFont.lookupMetric(`${category}.offsetYStemDown`) * scale;\n }\n else {\n y += musicFont.lookupMetric(`${category}.offsetYStemUp`) * scale;\n }\n const fontScale = musicFont.lookupMetric(`${category}.point`);\n x += musicFont.lookupMetric(`${category}.offsetXStem${stemDirection === Stem.UP ? 'Up' : 'Down'}`);\n for (let i = 0; i < this.num; ++i) {\n Glyph.renderGlyph(ctx, x, y, fontScale, this.code, { category, scale: this.extra_stroke_scale });\n y += y_spacing;\n }\n }\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// Utility methods used by the rest of the VexFlow codebase.\nimport { Flow } from './flow';\nimport { log, RuntimeError } from './util';\nexport class Vex {\n // Users of `Vex.forEach(a, fn)` should use `Array.prototype.forEach()` instead.\n // static forEach(arr: T[], callbackFn: (value: T, index: number, array: T[]) => void) {\n // arr.forEach(callbackFn);\n // }\n /**\n * Take `arr` and return a new list consisting of the sorted, unique,\n * contents of arr. Does not modify `arr`.\n */\n // eslint-disable-next-line\n static sortAndUnique(arr, cmp, eq) {\n if (arr.length > 1) {\n const newArr = [];\n let last;\n arr.sort(cmp);\n for (let i = 0; i < arr.length; ++i) {\n if (i === 0 || !eq(arr[i], last)) {\n newArr.push(arr[i]);\n }\n last = arr[i];\n }\n return newArr;\n }\n else {\n return arr;\n }\n }\n /** Check if array `arr` contains `obj`. */\n // eslint-disable-next-line\n static contains(arr, obj) {\n let i = arr.length;\n while (i--) {\n if (arr[i] === obj) {\n return true;\n }\n }\n return false;\n }\n // Get the 2D Canvas context from DOM element `canvas_sel`.\n static getCanvasContext(canvasSelector) {\n if (!canvasSelector) {\n throw new RuntimeError('BadArgument', 'Invalid canvas selector: ' + canvasSelector);\n }\n const canvas = document.getElementById(canvasSelector);\n if (!(canvas && canvas.getContext)) {\n throw new RuntimeError('UnsupportedBrowserError', 'This browser does not support HTML5 Canvas');\n }\n return canvas.getContext('2d');\n }\n /** Benchmark. Run function `f` once and report time elapsed shifted by `s` milliseconds. */\n // eslint-disable-next-line\n static benchmark(s, f) {\n const start_time = new Date().getTime();\n f();\n const elapsed = new Date().getTime() - start_time;\n log(s, elapsed + 'ms');\n }\n // Get stack trace.\n static stackTrace() {\n const err = new Error();\n return err.stack;\n }\n}\nVex.Flow = Flow;\n","export const BravuraFont = {\n glyphs: {\n bracketTop: {\n x_min: 0,\n x_max: 469,\n y_min: 0,\n y_max: 295,\n ha: 295,\n o: 'm 0 0 l 180 0 b 674 390 410 43 616 150 b 675 405 675 396 675 400 b 664 425 675 416 671 422 b 628 405 651 425 635 415 b 157 179 613 389 432 199 l 12 179 b 0 168 3 179 0 177 z',\n },\n bracketBottom: {\n x_min: 0,\n x_max: 469,\n y_min: -295,\n y_max: 0,\n ha: 295,\n o: 'm 0 -168 b 12 -179 0 -177 3 -179 l 157 -179 b 628 -405 432 -199 613 -389 b 664 -425 635 -415 651 -425 b 675 -405 671 -422 675 -416 b 674 -390 675 -400 675 -396 b 180 0 616 -150 410 -43 l 0 0 z',\n },\n barlineTick: {\n x_min: 0,\n x_max: 36,\n y_min: 868,\n y_max: 1120,\n ha: 252,\n o: 'm 52 1250 l 52 1613 l 0 1613 l 0 1250 z',\n },\n breathMarkTick: {\n x_min: 0,\n x_max: 500,\n y_min: 0,\n y_max: 502,\n ha: 502,\n o: 'm 9 367 b 0 374 6 372 3 374 b 9 334 0 367 0 343 b 179 19 40 312 164 121 b 192 0 179 3 186 0 b 210 19 197 0 207 6 b 698 701 245 197 507 658 b 720 714 714 704 720 711 b 698 723 720 720 711 723 b 197 186 455 714 210 202 b 186 176 194 179 189 176 b 176 186 179 176 176 186 b 9 367 143 266 27 359 z',\n },\n segno: {\n x_min: 4,\n x_max: 550,\n y_min: -27,\n y_max: 759,\n ha: 786,\n o: 'm 194 958 b 217 939 203 958 213 955 l 220 929 b 325 805 230 890 252 805 b 425 901 384 805 425 840 b 413 969 425 923 420 946 b 220 1060 390 1035 294 1060 b 6 793 120 1060 6 936 b 29 687 6 759 13 723 b 295 449 75 582 284 454 b 304 438 301 446 304 444 b 295 415 304 432 301 425 b 78 22 285 395 78 22 b 73 3 75 16 73 9 b 114 -39 73 -20 91 -39 b 150 -17 128 -39 143 -30 b 377 395 150 -17 373 386 b 395 402 377 393 389 402 b 704 176 416 397 704 312 b 621 75 704 120 670 82 l 616 73 b 562 138 586 73 562 94 l 562 154 b 485 249 562 209 526 249 b 468 246 480 249 474 248 b 366 153 415 233 366 210 b 540 -12 366 65 455 -12 b 600 -1 559 -12 579 -9 b 792 251 716 37 792 131 b 789 292 792 264 791 278 b 523 588 768 451 540 579 b 498 611 505 598 498 603 b 501 619 498 613 500 616 b 732 1032 508 631 732 1032 b 737 1053 736 1040 737 1045 b 697 1093 737 1076 719 1093 b 661 1073 683 1093 668 1086 b 423 647 661 1073 432 660 b 410 635 419 639 416 635 b 396 639 406 635 402 636 b 128 792 383 644 166 727 b 108 868 120 808 108 838 b 186 958 108 907 125 948 z m 598 671 b 680 589 598 626 635 589 b 762 671 726 589 762 626 b 680 753 762 717 726 753 b 598 671 635 753 598 717 z m 202 380 b 120 462 202 425 166 462 b 37 380 75 462 37 425 b 120 298 37 334 75 298 b 202 380 166 298 202 334 z',\n },\n coda: {\n x_min: -4,\n x_max: 955,\n y_min: -158,\n y_max: 898,\n ha: 1056,\n o: 'm 1349 576 l 1178 576 b 729 1083 1164 847 962 1064 l 729 1269 b 694 1293 729 1287 713 1293 b 660 1269 675 1293 660 1287 l 660 1083 b 210 576 426 1064 226 848 l 20 576 b -6 541 0 576 -6 560 b 20 507 -6 523 0 507 l 210 507 b 660 0 226 238 426 19 l 660 -202 b 694 -228 660 -222 675 -228 b 729 -202 713 -228 729 -222 l 729 0 b 1178 507 962 19 1164 238 l 1349 507 b 1375 541 1369 507 1375 523 b 1349 576 1375 560 1369 576 z m 940 576 l 729 576 l 729 1002 b 940 576 930 985 940 809 z m 660 1002 l 660 576 l 455 576 b 660 1002 455 809 455 985 z m 455 507 l 660 507 l 660 69 b 455 507 474 91 456 285 z m 729 69 l 729 507 l 940 507 b 729 69 936 287 909 91 z',\n },\n gClef: {\n x_min: 0,\n x_max: 671,\n y_min: -658,\n y_max: 1098,\n ha: 1756,\n o: 'm 541 598 b 550 625 539 615 541 616 b 824 1174 706 770 824 953 b 730 1509 824 1299 789 1423 b 655 1581 708 1541 671 1581 b 562 1512 635 1581 590 1544 b 420 1064 455 1394 420 1214 b 441 828 420 981 431 887 b 428 793 444 811 445 808 b 0 125 220 622 0 416 b 524 -363 0 -125 171 -363 b 624 -354 557 -363 595 -360 b 645 -367 639 -351 642 -350 b 684 -657 662 -464 684 -589 b 455 -896 684 -870 540 -896 b 340 -854 377 -896 340 -873 b 386 -829 340 -844 353 -840 b 482 -694 431 -816 482 -778 b 344 -547 482 -615 432 -547 b 190 -713 248 -547 190 -624 b 464 -948 190 -806 246 -948 b 747 -660 560 -948 747 -904 b 706 -351 747 -577 721 -441 b 724 -327 703 -334 704 -336 b 966 16 870 -269 966 -147 b 619 363 966 200 831 363 b 577 389 582 363 582 363 z m 677 1358 b 763 1240 724 1358 763 1319 b 513 851 763 1080 626 950 b 494 863 503 842 497 844 b 485 995 488 900 485 949 b 677 1358 485 1220 589 1358 z m 520 377 b 498 343 524 350 524 351 b 289 63 372 300 289 186 b 455 -192 289 -66 357 -158 b 494 -200 467 -196 484 -200 b 511 -184 505 -200 511 -193 b 490 -166 511 -174 500 -170 b 386 -12 429 -140 386 -78 b 530 157 386 71 442 132 b 559 145 553 163 556 161 l 631 -284 b 611 -304 634 -300 632 -300 b 530 -311 588 -308 559 -311 b 115 29 278 -311 115 -171 b 249 363 115 114 130 228 b 469 567 336 459 402 513 b 490 562 484 579 487 577 z m 619 148 b 635 168 616 166 618 170 b 848 -66 752 158 848 60 b 713 -271 848 -157 793 -230 b 690 -262 696 -279 693 -279 z',\n },\n cClef: {\n x_min: 0,\n x_max: 699,\n y_min: -506,\n y_max: 506,\n ha: 1012,\n o: 'm 331 694 b 301 724 331 714 321 724 l 300 724 b 269 694 279 724 269 714 l 269 -694 b 300 -724 269 -714 279 -724 l 301 -724 b 331 -694 321 -724 331 -714 l 331 -63 b 344 -55 331 -52 338 -53 b 472 -265 382 -65 442 -102 b 500 -301 477 -288 485 -301 b 530 -262 516 -301 523 -287 b 684 -128 549 -199 582 -128 b 804 -409 778 -128 804 -220 b 651 -683 804 -598 770 -683 b 528 -644 631 -683 528 -674 b 567 -622 528 -636 552 -628 b 625 -528 596 -612 625 -583 b 527 -429 625 -465 583 -429 b 416 -547 465 -429 416 -471 b 667 -729 416 -638 495 -729 b 1007 -413 903 -729 1007 -563 b 706 -76 1007 -215 897 -76 b 618 -89 664 -76 636 -84 b 576 -88 603 -94 589 -96 b 524 0 556 -75 524 -29 b 576 88 524 29 556 75 b 618 89 589 96 603 94 b 706 76 636 84 664 76 b 1007 413 897 76 1007 215 b 667 729 1007 563 903 729 b 416 547 495 729 416 638 b 527 429 416 471 465 429 b 625 528 583 429 625 465 b 567 622 625 583 596 612 b 528 644 552 628 528 636 b 651 683 528 674 631 683 b 804 409 770 683 804 598 b 684 128 804 220 778 128 b 530 262 582 128 549 199 b 500 301 523 287 516 301 b 472 265 485 301 477 288 b 344 55 442 102 382 65 b 331 63 338 53 331 52 z m 30 724 b 0 694 10 724 0 714 l 0 -694 b 30 -724 0 -714 10 -724 l 154 -724 b 184 -694 174 -724 184 -714 l 184 694 b 154 724 184 714 174 724 z',\n },\n fClef: {\n x_min: -5,\n x_max: 684,\n y_min: -635,\n y_max: 262,\n ha: 897,\n o: 'm 363 377 b 0 56 112 377 0 194 b 177 -158 0 -59 60 -158 b 330 -6 268 -158 330 -95 b 192 144 330 86 262 144 b 120 134 153 144 138 134 b 96 160 101 134 96 145 b 330 323 96 217 183 323 b 549 -53 482 323 549 173 b 14 -871 549 -455 350 -680 b -7 -897 1 -878 -7 -886 b 12 -914 -7 -906 -1 -914 b 36 -907 19 -914 27 -912 b 765 -40 390 -734 765 -478 b 363 377 765 210 612 377 z m 906 259 b 827 180 861 259 827 225 b 906 101 827 135 861 101 b 985 180 950 101 985 135 b 906 259 985 225 950 259 z m 907 -102 b 829 -180 863 -102 829 -135 b 907 -258 829 -225 863 -258 b 985 -180 952 -258 985 -225 b 907 -102 985 -135 952 -102 z',\n },\n unpitchedPercussionClef1: {\n x_min: 0,\n x_max: 382,\n y_min: -250,\n y_max: 250,\n ha: 500,\n o: 'm 230 -338 l 230 338 b 210 360 230 350 222 360 l 20 360 b 0 338 9 360 0 350 l 0 -338 b 20 -360 0 -350 9 -360 l 210 -360 b 230 -338 222 -360 230 -350 z m 550 338 b 530 360 550 350 541 360 l 340 360 b 320 338 328 360 320 350 l 320 -338 b 340 -360 320 -350 328 -360 l 530 -360 b 550 -338 541 -360 550 -350 z',\n },\n '6stringTabClef': {\n x_min: -3,\n x_max: 408,\n y_min: -748,\n y_max: 764,\n ha: 1512,\n o: 'm 557 1024 l 557 1100 l 26 1100 l 26 1024 l 249 1024 l 249 422 l 336 422 l 336 1024 z m 588 -328 l 350 348 l 238 348 l -4 -328 l 88 -328 l 160 -125 l 420 -125 l 491 -328 z m 397 -52 l 181 -52 l 292 256 z m 544 -883 b 420 -719 544 -802 507 -752 b 514 -572 482 -690 514 -639 b 314 -399 514 -472 442 -399 l 39 -399 l 39 -1077 l 344 -1077 b 544 -883 467 -1077 544 -995 z m 428 -583 b 292 -691 428 -652 389 -691 l 125 -691 l 125 -475 l 292 -475 b 428 -583 389 -475 428 -514 z m 458 -884 b 337 -1001 458 -949 418 -1001 l 125 -1001 l 125 -768 l 337 -768 b 458 -884 418 -768 458 -818 z',\n },\n timeSig0: {\n x_min: 20,\n x_max: 450,\n y_min: -250,\n y_max: 251,\n ha: 501,\n o: 'm 648 0 b 338 361 648 200 510 361 b 29 0 167 361 29 200 b 338 -360 29 -199 167 -360 b 648 0 510 -360 648 -199 z m 338 317 b 446 10 397 317 446 180 b 338 -295 446 -158 397 -295 b 230 10 278 -295 230 -158 b 338 317 230 180 278 317 z',\n },\n timeSig1: {\n x_min: 20,\n x_max: 314,\n y_min: -250,\n y_max: 251,\n ha: 501,\n o: 'm 35 19 b 29 0 35 19 29 10 b 45 -20 29 -7 33 -16 b 58 -23 50 -22 56 -23 b 78 -10 72 -23 78 -10 b 156 117 78 -10 140 89 b 170 131 161 127 167 131 b 179 111 176 131 179 120 l 179 -261 b 115 -315 179 -294 145 -315 b 91 -337 105 -315 91 -320 b 122 -360 91 -353 104 -360 l 429 -360 b 452 -337 452 -360 452 -337 b 431 -315 452 -337 452 -315 b 384 -265 410 -315 384 -289 l 384 328 b 356 361 384 351 376 360 b 281 356 336 361 300 356 b 206 360 253 356 228 357 b 199 361 203 360 200 361 b 173 334 184 361 179 347 z',\n },\n timeSig2: {\n x_min: 20,\n x_max: 426,\n y_min: -257,\n y_max: 254,\n ha: 511,\n o: 'm 606 -131 b 589 -111 606 -114 599 -111 b 570 -127 577 -111 573 -117 l 569 -128 b 513 -192 554 -164 543 -192 b 488 -187 505 -192 498 -190 b 445 -171 469 -180 459 -179 b 289 -137 416 -160 348 -137 b 236 -145 271 -137 252 -140 b 422 -42 268 -94 390 -50 b 613 147 523 -14 613 27 b 330 366 613 300 464 366 b 69 275 229 366 140 357 b 29 170 45 245 29 209 b 42 108 29 150 33 130 b 160 29 63 63 108 29 b 261 156 248 29 261 120 b 161 275 261 242 161 246 b 275 330 164 295 190 330 b 405 192 403 330 405 233 b 193 -102 405 60 297 -39 b 33 -317 114 -153 58 -223 l 32 -321 b 69 -370 32 -340 48 -370 b 203 -282 101 -370 118 -282 b 410 -360 261 -282 282 -360 b 606 -131 472 -360 583 -354 z',\n },\n timeSig3: {\n x_min: 20,\n x_max: 401,\n y_min: -251,\n y_max: 249,\n ha: 500,\n o: 'm 307 357 b 301 357 305 357 304 357 l 291 359 b 285 359 289 359 287 359 b 37 200 161 359 37 276 b 154 84 37 153 65 89 l 161 84 b 256 177 225 84 256 130 l 256 189 b 209 248 252 242 216 245 b 180 268 202 251 180 248 l 180 274 b 240 310 183 298 228 310 b 374 199 363 310 374 233 l 374 189 b 199 36 374 82 289 40 b 164 12 184 35 164 27 b 200 -6 164 -6 189 -6 b 379 -137 366 -6 379 -118 b 269 -307 379 -289 301 -307 b 256 -305 264 -307 258 -305 b 216 -282 245 -304 217 -304 l 216 -275 b 249 -180 216 -243 248 -222 b 145 -76 249 -120 207 -76 b 130 -78 140 -76 135 -76 b 60 -115 105 -82 78 -96 b 29 -203 36 -137 29 -171 b 275 -361 32 -315 134 -359 l 288 -361 b 577 -161 431 -361 577 -288 l 577 -151 b 537 -50 575 -109 564 -82 b 503 -20 528 -39 517 -29 l 472 -3 l 425 10 b 410 17 418 12 413 12 b 409 24 409 20 409 22 b 415 37 409 30 410 36 b 459 50 431 42 446 43 b 547 181 517 78 547 115 b 307 357 547 314 367 353 z',\n },\n timeSig4: {\n x_min: 20,\n x_max: 450,\n y_min: -250,\n y_max: 251,\n ha: 501,\n o: 'm 521 -107 l 521 202 b 504 226 521 213 520 226 b 475 213 491 226 484 223 l 338 48 b 325 14 333 40 325 32 l 325 -107 l 131 -107 b 481 336 246 -9 477 318 l 482 340 b 461 361 482 353 472 361 b 363 359 448 361 389 359 b 261 361 337 359 272 361 b 228 334 248 361 228 357 b 43 -105 228 156 86 -45 l 35 -117 b 35 -118 35 -117 35 -118 l 33 -120 b 29 -137 30 -127 29 -132 b 58 -161 29 -151 40 -161 l 325 -161 l 325 -252 b 268 -302 325 -291 294 -302 b 235 -330 245 -302 235 -315 b 262 -360 235 -344 240 -360 l 569 -360 b 598 -330 583 -360 598 -350 b 566 -301 598 -310 580 -301 b 521 -246 552 -301 521 -292 l 521 -161 l 626 -161 b 648 -134 641 -161 648 -151 b 626 -107 648 -117 642 -107 z',\n },\n timeSig5: {\n x_min: 20,\n x_max: 383,\n y_min: -251,\n y_max: 246,\n ha: 497,\n o: 'm 109 85 b 117 179 109 85 115 166 b 138 197 118 190 125 197 l 144 197 b 285 184 158 194 226 184 b 492 323 485 184 492 300 b 472 353 492 341 488 353 b 295 340 454 353 341 340 b 101 354 249 340 125 351 b 66 330 75 354 68 341 l 50 10 l 50 7 b 79 -14 50 -12 65 -14 b 111 14 94 -14 95 -1 b 209 62 125 29 160 62 b 357 -125 258 62 357 35 b 235 -304 357 -284 272 -304 b 202 -300 223 -304 212 -304 b 184 -279 194 -295 186 -289 b 202 -259 184 -269 194 -264 b 256 -163 235 -239 256 -203 b 144 -50 256 -99 206 -50 b 30 -157 66 -50 35 -107 b 29 -183 29 -166 29 -174 b 284 -361 29 -302 107 -361 b 552 -125 456 -361 552 -255 b 314 112 552 6 445 112 b 122 71 230 112 168 98 b 115 69 120 69 117 69 b 109 79 109 69 109 75 z',\n },\n timeSig6: {\n x_min: 20,\n x_max: 414,\n y_min: -249,\n y_max: 251,\n ha: 500,\n o: 'm 439 120 b 554 229 500 120 554 167 b 553 245 554 235 554 239 b 348 361 539 337 426 361 b 85 209 239 360 137 307 b 29 4 53 148 29 72 l 29 -1 b 73 -200 30 -68 42 -143 b 324 -359 132 -307 203 -359 b 513 -307 389 -359 461 -348 b 596 -137 563 -266 596 -202 b 379 72 596 -24 490 72 b 248 22 333 72 285 55 b 239 19 245 19 242 19 b 226 53 230 19 226 30 b 346 327 230 320 315 327 b 393 305 374 327 393 320 b 357 251 393 285 366 268 b 347 209 350 238 347 223 b 369 150 347 187 354 166 b 439 120 379 131 420 120 z m 320 3 b 405 -158 366 3 405 -69 b 320 -320 405 -248 366 -320 b 236 -158 274 -320 236 -248 b 320 3 236 -69 274 3 z',\n },\n timeSig7: {\n x_min: 20,\n x_max: 421,\n y_min: -250,\n y_max: 249,\n ha: 499,\n o: 'm 606 294 b 582 351 606 333 606 351 b 552 336 580 351 557 346 b 485 236 541 318 521 236 b 262 359 449 236 382 359 b 137 307 179 359 157 325 b 98 281 117 288 108 282 b 60 315 86 281 68 301 b 43 325 58 321 50 325 b 29 308 36 325 29 321 l 29 71 b 45 48 29 71 30 48 b 66 76 56 48 60 60 b 164 196 81 112 99 196 b 374 88 222 196 291 88 b 446 118 415 88 435 109 b 459 124 451 121 456 124 b 469 111 465 124 468 120 b 272 -112 469 71 359 -10 b 173 -315 217 -176 173 -259 b 200 -360 173 -346 173 -360 b 294 -347 226 -360 258 -347 b 412 -360 330 -347 397 -360 b 435 -307 426 -360 435 -348 b 606 288 435 -66 606 140 z',\n },\n timeSig8: {\n x_min: 20,\n x_max: 416,\n y_min: -259,\n y_max: 259,\n ha: 518,\n o: 'm 481 52 b 567 204 533 85 567 132 b 317 373 567 351 356 373 b 36 176 150 373 36 297 b 161 -16 36 76 92 23 b 29 -190 86 -52 29 -99 b 301 -373 29 -315 158 -373 b 599 -117 445 -373 599 -311 b 481 52 599 -30 549 17 z m 406 85 b 168 240 291 125 168 150 b 314 331 168 301 251 331 b 482 207 360 331 482 308 b 406 85 482 150 454 112 z m 295 -325 b 111 -183 199 -325 111 -276 b 225 -48 111 -125 161 -72 b 436 -219 330 -94 436 -124 b 295 -325 436 -276 392 -325 z',\n },\n timeSig9: {\n x_min: 20,\n x_max: 414,\n y_min: -249,\n y_max: 251,\n ha: 500,\n o: 'm 186 -117 b 71 -226 125 -117 71 -164 b 72 -242 71 -232 71 -236 b 276 -359 86 -334 199 -359 b 540 -206 386 -357 488 -304 b 596 -1 572 -145 596 -69 l 596 4 b 552 203 595 71 583 145 b 301 361 492 310 422 361 b 112 310 236 361 164 351 b 29 140 62 269 29 204 b 246 -69 29 27 135 -69 b 377 -19 292 -69 340 -52 b 386 -16 380 -16 383 -16 b 399 -50 395 -16 399 -27 b 279 -324 395 -317 310 -324 b 232 -302 251 -324 232 -317 b 268 -248 232 -282 259 -265 b 278 -206 275 -235 278 -220 b 256 -147 278 -184 271 -163 b 186 -117 246 -128 204 -117 z m 305 0 b 220 161 259 0 220 72 b 305 323 220 251 259 323 b 389 161 351 323 389 251 b 305 0 389 72 351 0 z',\n },\n timeSigCommon: {\n x_min: 5,\n x_max: 424,\n y_min: -249,\n y_max: 251,\n ha: 500,\n o: 'm 336 361 b 7 -14 131 361 7 180 b 101 -262 7 -108 42 -190 b 321 -359 156 -328 235 -359 b 611 -88 573 -359 611 -130 b 589 -56 611 -56 595 -56 b 567 -82 577 -56 567 -58 b 363 -311 567 -268 409 -311 b 184 40 246 -311 184 -197 b 372 327 184 278 294 327 b 477 278 446 327 477 292 b 451 246 477 265 472 246 b 360 140 393 246 360 184 b 471 32 360 58 431 32 b 580 156 471 32 580 36 b 336 361 580 344 363 361 z',\n },\n timeSigCutCommon: {\n x_min: 0,\n x_max: 418,\n y_min: -359,\n y_max: 361,\n ha: 720,\n o: 'm 573 -58 b 559 -82 567 -58 559 -60 b 354 -310 559 -266 400 -310 b 317 -305 340 -310 328 -308 b 302 -284 311 -304 302 -295 l 302 287 b 338 323 302 297 328 321 b 363 324 347 324 356 324 b 468 275 436 324 468 289 b 442 243 468 264 464 243 b 351 137 384 243 351 181 b 462 30 351 56 422 30 b 572 154 462 30 572 35 b 318 357 572 295 441 357 b 302 390 310 359 302 383 l 302 495 b 276 520 302 507 292 520 b 252 495 265 520 252 507 l 252 369 b 235 346 252 359 238 346 l 196 331 b 0 -14 66 275 0 122 b 225 -346 0 -150 86 -310 b 252 -382 235 -350 252 -369 l 252 -492 b 276 -517 252 -505 265 -517 b 302 -492 292 -517 302 -505 l 302 -379 b 318 -359 302 -370 308 -363 b 602 -85 563 -354 602 -130 b 579 -58 600 -58 586 -58 z m 252 -235 b 243 -252 252 -248 248 -252 b 236 -248 240 -252 238 -251 b 177 37 197 -193 177 -96 b 232 259 177 147 200 215 b 236 262 233 262 235 262 b 252 239 243 262 252 251 z',\n },\n timeSigPlus: {\n x_min: -1,\n x_max: 499,\n y_min: -250,\n y_max: 250,\n ha: 500,\n o: 'm 432 53 b 413 79 420 53 413 65 l 413 340 b 392 360 413 350 405 360 l 325 360 b 305 340 312 360 305 350 l 305 79 b 284 53 305 66 292 53 l 19 53 b -1 33 9 53 -1 46 l -1 -33 b 19 -55 -1 -46 9 -55 l 284 -55 b 305 -75 298 -55 305 -68 l 305 -340 b 325 -360 305 -350 312 -360 l 392 -360 b 413 -340 405 -360 413 -350 l 413 -78 b 433 -55 413 -63 423 -55 l 698 -55 b 719 -33 708 -55 719 -46 l 719 33 b 698 53 719 46 708 53 z',\n },\n timeSigPlusSmall: {\n x_min: -1,\n x_max: 255,\n y_min: -133,\n y_max: 123,\n ha: 256,\n o: 'm 220 20 b 210 33 215 20 210 26 l 210 166 b 200 177 210 171 206 177 l 166 177 b 156 166 160 177 156 171 l 156 33 b 145 20 156 27 150 20 l 10 20 b -1 10 4 20 -1 16 l -1 -24 b 10 -35 -1 -30 4 -35 l 145 -35 b 156 -46 153 -35 156 -42 l 156 -180 b 166 -192 156 -186 160 -192 l 200 -192 b 210 -180 206 -192 210 -186 l 210 -48 b 222 -35 210 -39 216 -35 l 356 -35 b 367 -24 361 -35 367 -30 l 367 10 b 356 20 367 16 361 20 z',\n },\n timeSigMinus: {\n x_min: 0,\n x_max: 448,\n y_min: -35,\n y_max: 40,\n ha: 75,\n o: 'm 645 39 b 619 58 645 49 634 58 l 27 58 b 0 39 12 58 0 49 l 0 -32 b 27 -50 0 -42 12 -50 l 619 -50 b 645 -32 634 -50 645 -42 z',\n },\n timeSigParensRight: {\n x_min: 0,\n x_max: 184,\n y_min: -489,\n y_max: 491,\n ha: 980,\n o: 'm 0 -696 b 3 -704 0 -698 1 -704 b 7 -703 4 -704 6 -704 b 265 1 187 -530 265 -282 b 12 701 265 289 187 531 b 4 707 12 701 6 707 b 0 696 1 707 0 703 l 0 665 b 4 644 0 665 0 651 b 167 1 112 503 167 315 b 6 -641 167 -311 109 -497 b 0 -658 3 -644 0 -651 z',\n },\n timeSigParensRightSmall: {\n x_min: 0,\n x_max: 110,\n y_min: -251,\n y_max: 249,\n ha: 500,\n o: 'm 0 -356 b 3 -361 0 -357 1 -361 b 158 0 112 -272 158 -145 b 4 359 158 147 109 272 b 0 353 3 359 0 357 l 0 338 b 3 327 0 338 0 330 b 91 0 60 246 91 160 b 4 -328 91 -160 62 -249 b 0 -337 3 -330 0 -333 z',\n },\n timeSigParensLeft: {\n x_min: 0,\n x_max: 184,\n y_min: -489,\n y_max: 491,\n ha: 980,\n o: 'm 265 -658 b 259 -641 265 -651 262 -644 b 98 1 156 -497 98 -311 b 261 644 98 315 153 503 b 265 665 265 651 265 665 l 265 696 b 261 707 265 703 264 707 b 253 701 259 707 253 701 b 0 1 78 531 0 289 b 258 -703 0 -282 78 -530 b 262 -704 259 -704 261 -704 b 265 -696 264 -704 265 -698 z',\n },\n timeSigParensLeftSmall: {\n x_min: 0,\n x_max: 110,\n y_min: -251,\n y_max: 249,\n ha: 500,\n o: 'm 158 -337 b 154 -328 158 -333 156 -330 b 68 0 96 -249 68 -160 b 156 327 68 160 98 246 b 158 338 158 330 158 338 l 158 353 b 154 359 158 357 156 359 b 0 0 49 272 0 147 b 156 -361 0 -145 46 -272 b 158 -356 157 -361 158 -357 z',\n },\n noteheadDoubleWhole: {\n x_min: 0,\n x_max: 599,\n y_min: -155,\n y_max: 155,\n ha: 310,\n o: 'm 13 223 b 0 212 4 223 0 217 l 0 -213 b 13 -223 0 -219 4 -223 l 32 -223 b 45 -213 39 -223 45 -219 l 45 212 b 32 223 45 217 39 223 z m 96 223 b 82 212 88 223 82 217 l 82 -213 b 96 -223 82 -219 88 -223 l 114 -223 b 128 -213 121 -223 128 -219 l 128 212 b 114 223 128 217 121 223 z m 747 223 b 733 212 740 223 733 217 l 733 -213 b 747 -223 733 -219 740 -223 l 766 -223 b 780 -213 773 -223 780 -219 l 780 212 b 766 223 780 217 773 223 z m 829 223 b 815 212 824 223 815 217 l 815 -213 b 829 -223 815 -219 824 -223 l 848 -223 b 863 -213 857 -223 863 -219 l 863 212 b 848 223 863 217 857 223 z m 438 180 b 130 1 248 180 130 101 b 423 -180 130 -92 210 -180 b 733 1 657 -180 733 -98 b 438 180 733 104 572 180 z m 469 -145 b 331 -71 409 -145 369 -112 b 284 58 305 -37 284 12 b 400 147 284 131 333 147 b 577 -45 498 147 577 42 b 469 -145 577 -115 533 -145 z',\n },\n noteheadWhole: {\n x_min: 0,\n x_max: 422,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 311 180 b 0 3 120 180 0 101 b 297 -180 0 -94 82 -180 b 608 3 533 -180 608 -98 b 311 180 608 105 445 180 z m 160 91 b 274 148 176 141 229 148 b 452 -45 373 148 452 42 b 386 -141 452 -89 433 -130 b 341 -147 372 -145 356 -147 b 206 -72 289 -147 236 -112 b 156 56 177 -39 156 10 b 160 91 156 68 157 79 z',\n },\n noteheadHalf: {\n x_min: 0,\n x_max: 295,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 140 -180 b 425 60 377 -180 425 13 b 282 180 425 134 366 180 b 0 -60 68 180 0 14 b 140 -180 0 -137 60 -180 z m 108 -125 b 50 -92 78 -125 60 -109 b 42 -63 46 -84 42 -73 b 318 121 42 7 251 121 b 372 91 346 121 361 108 b 380 63 376 82 380 73 b 108 -125 380 1 177 -125 z',\n },\n noteheadBlack: {\n x_min: 0,\n x_max: 295,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 140 -180 b 425 60 268 -180 425 -62 b 285 180 425 134 367 180 b 0 -60 127 180 0 63 b 140 -180 0 -135 62 -180 z',\n },\n noteheadXWhole: {\n x_min: 0,\n x_max: 377,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 272 -95 l 364 -171 b 384 -180 370 -177 377 -180 l 511 -180 b 543 -148 528 -180 543 -164 b 531 -124 543 -140 539 -131 l 412 0 l 531 124 b 541 148 539 131 541 140 b 513 180 541 164 528 180 l 384 180 b 364 171 377 180 370 177 l 272 94 l 179 171 b 158 180 173 177 166 180 l 30 180 b 0 148 16 180 0 164 b 12 124 0 140 4 131 l 132 0 l 12 -124 b 1 -148 4 -131 1 -140 b 32 -180 1 -164 14 -180 l 158 -180 b 179 -171 166 -180 173 -177 z m 386 -141 l 272 -45 l 157 -141 l 88 -141 l 245 0 l 88 141 l 157 141 l 272 45 l 386 141 l 456 141 l 300 0 l 456 -141 z',\n },\n noteheadXHalf: {\n x_min: 0,\n x_max: 334,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 295 180 b 271 170 287 180 278 177 l 209 98 l 115 171 b 95 180 109 177 104 180 l 36 180 b 4 148 19 180 4 164 b 14 124 4 140 7 132 l 140 22 l 7 -127 b 0 -148 3 -131 0 -138 b 32 -180 0 -166 14 -180 l 184 -180 b 209 -170 193 -180 203 -177 l 271 -99 l 363 -171 b 384 -180 370 -176 377 -180 l 445 -180 b 478 -147 461 -180 478 -163 b 465 -125 478 -138 474 -131 l 341 -22 l 474 127 b 481 148 480 131 481 138 b 448 180 481 166 468 180 z m 36 148 l 95 148 l 233 33 l 334 148 l 410 148 l 274 -6 l 445 -148 l 384 -148 l 248 -35 l 147 -148 l 71 -148 l 206 4 z',\n },\n noteheadXBlack: {\n x_min: 0,\n x_max: 290,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 410 -143 l 239 0 l 410 144 b 418 160 415 147 418 154 b 399 180 418 171 408 180 b 389 177 396 180 392 179 l 207 26 l 29 177 b 17 180 26 179 22 180 b 0 161 7 180 0 170 b 7 144 0 156 3 148 l 179 0 l 7 -143 b 0 -158 1 -147 0 -153 b 19 -180 0 -170 7 -180 b 29 -176 23 -180 26 -179 l 207 -24 l 389 -176 b 399 -180 392 -179 396 -180 b 418 -160 410 -180 418 -168 b 410 -143 418 -153 415 -147 z',\n },\n noteheadCircleX: {\n x_min: 0,\n x_max: 249,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 179 180 b 0 0 81 180 0 99 b 179 -180 0 -99 81 -180 b 359 0 278 -180 359 -99 b 179 180 359 99 278 180 z m 261 112 l 180 30 l 98 112 b 179 138 121 128 148 138 b 261 112 210 138 238 128 z m 317 0 b 292 -82 317 -30 308 -59 l 209 1 l 291 84 b 317 0 307 60 317 30 z m 40 0 b 69 84 40 32 50 60 l 151 1 l 68 -84 b 40 0 49 -60 40 -30 z m 95 -111 l 180 -27 l 262 -111 b 179 -138 239 -128 210 -138 b 95 -111 148 -138 120 -128 z',\n },\n noteheadTriangleUpWhole: {\n x_min: 0,\n x_max: 319,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 445 -180 b 459 -166 454 -180 459 -173 b 458 -158 459 -163 458 -160 l 239 173 b 228 180 238 177 233 180 b 216 173 225 180 219 177 l 1 -158 b 0 -166 1 -160 0 -163 b 14 -180 0 -173 6 -180 z m 170 -137 b 145 -96 157 -137 145 -109 b 228 108 145 -17 197 56 b 310 -98 259 55 310 -17 b 288 -137 310 -111 301 -137 z',\n },\n noteheadTriangleUpHalf: {\n x_min: 0,\n x_max: 285,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 215 180 b 202 173 210 180 204 177 l 3 -157 b 0 -166 1 -160 0 -163 b 14 -180 0 -173 7 -180 l 396 -180 b 410 -166 406 -180 410 -173 b 409 -158 410 -163 410 -161 l 228 173 b 215 180 226 174 220 180 z m 246 -138 l 115 -138 l 232 76 l 297 -37 z',\n },\n noteheadTriangleUpBlack: {\n x_min: 0,\n x_max: 293,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 422 -180 l 207 180 l 0 -180 z',\n },\n noteheadDiamondWhole: {\n x_min: 0,\n x_max: 270,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 386 -23 b 389 -16 387 -20 389 -19 b 383 -7 389 -13 386 -9 l 130 179 b 122 180 128 180 125 180 b 115 177 120 180 117 180 l 3 23 b 0 17 1 20 0 19 b 4 7 0 16 3 10 l 258 -179 b 264 -180 261 -179 262 -180 b 272 -176 268 -180 271 -179 z m 66 40 b 62 48 65 42 62 45 l 109 111 b 112 112 109 112 111 112 b 118 111 115 112 117 111 l 320 -37 b 324 -46 323 -39 324 -42 b 275 -111 278 -111 276 -111 b 268 -108 272 -111 271 -109 z',\n },\n noteheadDiamondHalf: {\n x_min: 0,\n x_max: 251,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 359 -7 b 361 0 360 -6 361 -3 b 359 7 361 3 360 4 l 189 177 b 180 180 186 179 183 180 b 174 177 179 180 176 179 l 4 7 b 0 0 1 4 0 3 b 4 -7 0 -3 1 -6 l 174 -177 b 180 -180 176 -180 179 -180 b 189 -177 183 -180 186 -180 z m 266 26 b 138 -71 266 -12 176 -71 b 96 -50 121 -71 108 -63 b 88 -24 89 -43 88 -32 b 215 73 88 13 177 73 b 266 26 238 73 266 50 z',\n },\n noteheadDiamondBlack: {\n x_min: 0,\n x_max: 250,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 357 -6 b 360 1 359 -4 360 -1 b 357 9 360 4 359 7 l 189 177 b 180 180 187 179 184 180 b 171 177 177 180 173 179 l 3 9 b 0 1 0 6 0 4 b 4 -7 0 -1 1 -4 l 173 -177 b 180 -180 176 -180 177 -180 b 187 -177 181 -180 184 -180 z',\n },\n noteheadSquareWhite: {\n x_min: 0,\n x_max: 313,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 451 -180 l 451 180 l 0 180 l 0 -180 z m 40 -138 l 40 140 l 410 140 l 410 -138 z',\n },\n noteheadSquareBlack: {\n x_min: 0,\n x_max: 313,\n y_min: -125,\n y_max: 125,\n ha: 250,\n o: 'm 451 -180 l 451 180 l 0 180 l 0 -180 z',\n },\n noteheadParenthesis: {\n x_min: -73,\n x_max: 368,\n y_min: -180,\n y_max: 182,\n ha: 362,\n o: 'm 52 -249 b -30 -144 3 -212 -14 -190 b -52 4 -45 -102 -52 -56 b 52 252 -52 118 -36 179 l 46 262 b -105 3 -49 197 -105 124 b 45 -259 -105 -109 -48 -200 z m 382 -259 b 530 3 474 -202 530 -108 b 379 262 530 122 474 200 l 373 252 b 478 4 462 180 478 118 b 456 -144 478 -56 471 -102 b 373 -249 439 -190 422 -212 z',\n },\n noteheadParenthesisRight: {\n x_min: -36,\n x_max: 73,\n y_min: -181,\n y_max: 181,\n ha: 362,\n o: 'm -43 -261 b 105 1 49 -203 105 -109 b -46 261 105 121 49 199 l -52 251 b 53 3 37 179 53 117 b 32 -145 53 -58 46 -104 b -52 -251 14 -192 -3 -213 z',\n },\n noteheadParenthesisLeft: {\n x_min: 0,\n x_max: 109,\n y_min: -181,\n y_max: 181,\n ha: 362,\n o: 'm 157 -251 b 75 -145 108 -213 91 -192 b 53 3 60 -104 53 -58 b 157 251 53 117 69 177 l 151 261 b 0 1 56 196 0 122 b 150 -261 0 -111 58 -202 z',\n },\n augmentationDot: {\n x_min: 0,\n x_max: 100,\n y_min: -50,\n y_max: 50,\n ha: 100,\n o: 'm 144 0 b 72 72 144 40 112 72 b 0 0 32 72 0 40 b 72 -72 0 -40 32 -72 b 144 0 112 -72 144 -40 z',\n },\n tremolo1: {\n x_min: -150,\n x_max: 150,\n y_min: -93,\n y_max: 94,\n ha: 187,\n o: 'm 216 -45 l 216 135 l -216 46 l -216 -134 z',\n },\n flag8thUp: {\n x_min: 0,\n x_max: 264,\n y_min: -810.1921176545985,\n y_max: 9,\n ha: 819.1921176545985,\n o: 'm 343 -1138 b 380 -888 343 -1138 380 -1001 b 215 -395 380 -708 305 -539 b 58 -19 141 -281 81 -157 b 27 13 53 4 42 13 b 0 -9 12 13 0 9 l 0 -353 b 284 -688 95 -370 232 -566 b 318 -904 305 -737 318 -819 b 284 -1102 318 -969 308 -1037 b 279 -1123 281 -1110 279 -1117 b 302 -1165 279 -1146 294 -1159 b 343 -1138 311 -1171 336 -1162 z',\n },\n flag8thDown: {\n x_min: 0,\n x_max: 306,\n y_min: -14,\n y_max: 808,\n ha: 822,\n o: 'm 346 1094 b 376 897 366 1034 376 962 b 318 642 376 812 340 691 b 0 340 265 521 193 405 l 0 1 b 23 -20 0 -13 12 -20 b 58 12 36 -20 55 -12 b 262 387 82 148 189 274 b 441 881 353 530 441 701 b 400 1142 441 994 412 1096 b 377 1164 396 1158 387 1164 b 346 1094 356 1164 331 1136 z',\n },\n flag16thUp: {\n x_min: 0,\n x_max: 279,\n y_min: -813,\n y_max: 2,\n ha: 815,\n o: 'm 392 -1146 b 402 -988 397 -1139 402 -1057 l 402 -956 b 360 -783 402 -896 386 -837 b 359 -770 360 -779 359 -776 b 360 -760 359 -768 359 -765 b 396 -577 364 -752 396 -665 b 392 -526 396 -559 395 -543 b 236 -275 377 -428 340 -387 b 53 -16 158 -192 78 -168 b 24 3 50 0 33 3 b 0 -12 16 3 0 -1 l 0 -570 l 7 -570 b 298 -778 96 -573 199 -576 b 344 -992 331 -847 344 -917 b 333 -1120 344 -1034 340 -1077 b 331 -1133 331 -1126 331 -1129 b 363 -1171 331 -1152 343 -1171 b 392 -1146 373 -1171 383 -1165 z m 301 -661 b 223 -562 278 -625 253 -596 b 59 -331 156 -484 89 -449 b 58 -327 58 -330 58 -328 b 78 -312 58 -321 66 -312 l 89 -312 b 302 -464 177 -312 255 -393 b 341 -592 328 -501 341 -546 b 340 -621 341 -602 341 -611 b 330 -658 337 -632 337 -647 b 311 -667 328 -662 318 -667 b 301 -661 307 -667 304 -665 z',\n },\n flag16thDown: {\n x_min: 0,\n x_max: 290.8951581511223,\n y_min: -9,\n y_max: 812.0064,\n ha: 821.0064,\n o: 'm 346 1132 b 312 768 367 1011 367 880 b 7 559 213 566 96 562 l 0 559 l 0 1 b 24 -13 0 -6 10 -13 b 53 6 35 -13 50 -10 b 406 516 88 228 372 289 b 410 567 409 531 410 549 b 374 750 410 655 379 742 b 373 760 373 753 373 756 b 374 773 373 766 374 769 b 405 1138 426 881 428 1022 b 370 1169 397 1171 387 1169 b 346 1132 353 1168 341 1156 z m 325 657 b 344 647 333 657 343 652 b 354 611 351 636 351 622 b 356 582 356 600 356 590 b 317 454 356 534 343 491 b 89 302 269 383 177 302 l 78 302 b 58 317 66 302 58 310 b 59 321 58 318 58 320 b 238 552 89 439 170 472 b 315 651 268 585 292 613 b 325 657 318 655 321 657 z',\n },\n flag32ndUp: {\n x_min: 0,\n x_max: 261,\n y_min: -812,\n y_max: 149,\n ha: 961,\n o: 'm 374 -969 b 337 -806 372 -913 359 -858 b 336 -796 336 -804 336 -801 b 337 -788 336 -793 336 -791 b 370 -616 340 -778 370 -698 b 340 -482 370 -570 360 -524 b 369 -330 353 -445 369 -386 b 366 -289 369 -315 369 -302 b 220 -58 350 -202 317 -163 b 46 187 148 20 71 43 b 20 215 45 200 35 215 b 0 197 12 215 0 207 l 0 -609 l 7 -609 b 278 -802 91 -612 186 -615 b 323 -999 310 -865 323 -930 b 311 -1122 323 -1040 318 -1080 b 310 -1132 311 -1126 310 -1129 b 328 -1166 310 -1149 318 -1162 b 337 -1169 331 -1168 334 -1169 b 366 -1146 346 -1169 356 -1162 b 376 -1009 370 -1138 376 -1071 b 374 -969 376 -995 374 -982 z m 300 -261 b 321 -330 315 -289 321 -311 b 317 -360 321 -341 318 -350 b 300 -423 314 -374 307 -399 b 220 -334 279 -397 253 -370 b 56 -92 150 -256 79 -232 b 300 -261 135 -92 220 -127 z m 315 -657 b 308 -690 312 -668 312 -680 b 292 -698 307 -694 300 -698 b 282 -693 288 -698 284 -697 b 216 -608 261 -661 240 -636 l 209 -600 b 56 -390 147 -527 88 -495 b 73 -367 53 -380 60 -367 b 318 -622 189 -367 318 -505 b 315 -657 318 -634 317 -645 z',\n },\n flag32ndDown: {\n x_min: 0,\n x_max: 273,\n y_min: -172,\n y_max: 812,\n ha: 984,\n o: 'm 393 973 b 333 1169 393 1002 383 1169 b 324 1168 330 1169 327 1169 b 304 1130 314 1164 304 1149 b 305 1120 304 1128 305 1125 b 334 962 317 1056 334 1011 b 289 821 334 922 323 880 b 0 619 180 625 88 622 l 0 -229 b 20 -248 0 -242 9 -248 b 48 -219 35 -248 46 -232 b 229 36 72 -69 154 -46 b 380 278 330 145 364 186 b 383 320 383 291 383 305 b 351 484 383 382 364 445 b 384 629 374 526 384 580 b 356 780 384 704 361 766 b 356 783 356 782 356 783 l 351 791 b 356 804 351 796 353 799 l 361 814 b 393 958 380 850 387 865 z m 56 386 b 217 609 86 501 153 533 b 292 706 246 642 269 670 b 304 711 295 710 300 711 b 321 703 311 711 320 707 b 328 670 325 693 325 681 b 331 634 330 658 331 645 b 82 367 331 516 199 367 l 75 367 b 56 386 62 367 56 379 z m 330 350 b 334 320 331 340 334 331 b 311 248 334 301 328 278 b 59 72 229 109 141 72 b 56 76 56 73 56 75 b 229 331 81 226 154 249 b 310 423 264 369 289 397 b 330 350 318 396 325 366 z',\n },\n flag64thUp: {\n x_min: 0,\n x_max: 261,\n y_min: -812,\n y_max: 347,\n ha: 1159,\n o: 'm 374 -969 b 337 -806 372 -913 359 -858 b 336 -796 336 -804 336 -801 b 337 -788 336 -793 336 -791 b 370 -616 340 -778 370 -698 b 340 -482 370 -570 360 -524 b 369 -330 353 -445 369 -386 b 337 -203 369 -287 359 -242 b 369 -43 350 -167 369 -104 b 366 -4 369 -30 367 -17 b 220 228 350 84 317 122 b 46 472 148 305 71 328 b 20 500 45 485 32 500 b 0 482 10 500 0 492 l 0 -609 l 7 -609 b 278 -802 91 -612 186 -615 b 323 -999 310 -865 323 -930 b 311 -1122 323 -1040 318 -1080 b 310 -1132 311 -1126 310 -1129 b 328 -1166 310 -1149 318 -1162 b 337 -1169 331 -1168 334 -1169 b 366 -1146 346 -1169 356 -1162 b 376 -1009 370 -1138 376 -1071 b 374 -969 376 -995 374 -982 z m 300 24 b 321 -45 315 -4 321 -26 b 317 -75 321 -56 318 -65 l 298 -145 b 220 -58 278 -121 253 -94 b 58 187 148 20 82 43 b 56 193 58 189 58 192 b 300 24 138 193 220 157 z m 300 -261 b 321 -330 315 -289 321 -311 b 317 -360 321 -341 318 -350 b 300 -423 314 -374 307 -399 b 220 -334 279 -397 253 -370 b 56 -92 150 -256 79 -232 b 300 -261 135 -92 220 -127 z m 315 -657 b 308 -690 312 -668 312 -680 b 292 -698 307 -694 300 -698 b 282 -693 288 -698 284 -697 b 216 -608 261 -661 240 -636 l 209 -600 b 55 -386 147 -527 84 -497 b 73 -367 52 -376 63 -367 b 318 -622 189 -367 318 -505 b 315 -657 318 -634 317 -645 z',\n },\n flag64thDown: {\n x_min: 0,\n x_max: 273,\n y_min: -376,\n y_max: 812,\n ha: 1188,\n o: 'm 393 973 b 333 1169 393 1002 383 1169 b 324 1168 330 1169 327 1169 b 304 1130 314 1164 304 1149 b 305 1120 304 1128 305 1125 b 334 962 317 1056 334 1011 b 289 821 334 922 323 880 b 0 619 180 625 88 622 l 0 -523 b 20 -541 0 -534 9 -541 b 48 -513 35 -541 46 -526 b 229 -258 72 -363 154 -340 b 380 -16 330 -148 364 -108 b 384 27 383 -1 384 13 b 351 189 384 88 366 151 b 380 278 366 216 374 243 b 383 320 383 291 383 305 b 351 484 383 382 364 445 b 384 629 374 526 384 580 b 356 780 384 704 361 766 b 356 783 356 782 356 783 l 351 791 b 356 804 351 796 353 799 l 361 814 b 393 958 380 850 387 865 z m 56 386 b 217 609 86 501 153 533 b 292 706 246 642 269 670 b 304 711 295 710 300 711 b 321 703 311 711 320 707 b 328 670 325 693 325 681 b 331 634 330 658 331 645 b 82 367 331 516 199 367 l 75 367 b 56 386 62 367 56 379 z m 330 350 b 334 320 331 340 334 331 b 311 248 334 301 328 278 b 59 72 229 109 141 72 b 56 76 56 73 56 75 b 229 331 81 226 154 249 b 310 423 264 369 289 397 b 330 350 318 396 325 366 z m 330 56 b 334 26 331 46 334 37 b 311 -46 334 7 328 -16 b 56 -222 229 -184 137 -222 b 229 36 75 -86 145 -55 b 311 128 264 73 289 102 z',\n },\n flag128thUp: {\n x_min: 0,\n x_max: 261,\n y_min: -812,\n y_max: 533,\n ha: 1345,\n o: 'm 374 -969 b 337 -806 372 -913 359 -858 b 336 -796 336 -804 336 -801 b 337 -788 336 -793 336 -791 b 370 -616 340 -778 370 -698 b 340 -482 370 -570 360 -524 b 369 -330 353 -445 369 -386 b 337 -203 369 -287 359 -242 b 369 -43 350 -167 369 -104 b 366 -4 369 -30 367 -17 b 341 75 360 26 353 50 b 369 222 354 111 369 167 b 366 264 369 236 369 251 b 220 495 350 351 317 390 b 46 740 148 573 71 596 b 22 768 45 753 35 768 b 0 750 10 768 0 760 l 0 -609 l 7 -609 b 278 -802 91 -612 186 -615 b 323 -999 310 -865 323 -930 b 311 -1122 323 -1040 318 -1080 b 310 -1132 311 -1126 310 -1129 b 328 -1166 310 -1149 318 -1162 b 337 -1169 331 -1168 334 -1169 b 366 -1146 346 -1169 356 -1162 b 376 -1009 370 -1138 376 -1071 b 374 -969 376 -995 374 -982 z m 300 292 b 321 223 315 264 321 242 b 317 193 321 212 318 203 b 301 135 314 180 308 158 b 220 228 281 161 255 190 b 55 461 151 304 79 327 b 300 292 134 461 220 426 z m 300 24 b 321 -45 315 -4 321 -26 b 317 -75 321 -56 318 -65 l 298 -145 b 220 -58 278 -121 253 -94 b 56 187 148 20 81 43 b 55 193 56 189 56 192 b 300 24 137 193 220 157 z m 300 -261 b 321 -330 315 -289 321 -311 b 317 -360 321 -341 318 -350 b 300 -423 314 -374 307 -399 b 220 -334 279 -397 253 -370 b 56 -92 150 -256 79 -232 b 300 -261 135 -92 220 -127 z m 315 -657 b 308 -690 312 -668 312 -680 b 292 -698 307 -694 300 -698 b 282 -693 288 -698 284 -697 b 216 -608 261 -661 240 -636 l 209 -600 b 55 -386 147 -527 84 -497 b 73 -367 53 -376 62 -367 b 318 -622 189 -367 318 -505 b 315 -657 318 -634 317 -645 z',\n },\n flag128thDown: {\n x_min: 0,\n x_max: 273,\n y_min: -580,\n y_max: 812,\n ha: 1392,\n o: 'm 393 973 b 333 1169 393 1002 383 1169 b 324 1168 330 1169 327 1169 b 304 1130 314 1164 304 1149 b 305 1120 304 1128 305 1125 b 334 962 317 1056 334 1011 b 289 821 334 922 323 880 b 0 619 180 625 88 622 l 0 -816 b 20 -835 0 -828 7 -835 b 48 -806 33 -835 46 -819 b 229 -552 72 -657 154 -634 b 380 -310 330 -442 364 -402 b 384 -266 383 -295 384 -281 b 351 -105 384 -206 366 -143 b 384 27 372 -66 384 -16 b 351 189 384 88 366 151 b 380 278 366 216 374 243 b 383 320 383 291 383 305 b 351 484 383 382 364 445 b 384 629 374 526 384 580 b 356 780 384 704 361 766 b 356 783 356 782 356 783 l 351 791 b 356 804 351 796 353 799 l 361 814 b 393 958 380 850 387 865 z m 56 386 b 217 609 86 501 153 533 b 292 706 246 642 269 670 b 304 711 295 710 300 711 b 321 703 311 711 320 707 b 328 670 325 693 325 681 b 331 634 330 658 331 645 b 82 367 331 516 199 367 l 75 367 b 56 386 62 367 56 379 z m 330 350 b 334 320 331 340 334 331 b 311 248 334 301 328 278 b 59 72 229 109 141 72 b 56 76 56 73 56 75 b 229 331 81 226 154 249 b 310 423 264 369 289 397 b 330 350 318 396 325 366 z m 330 56 b 334 26 331 46 334 37 b 311 -46 334 7 328 -16 b 56 -222 229 -184 137 -222 b 229 36 75 -86 145 -55 b 311 128 264 73 289 102 z m 330 -238 b 334 -268 331 -248 334 -256 b 311 -340 334 -287 328 -310 b 56 -516 229 -478 137 -516 b 229 -258 75 -380 145 -348 b 311 -166 264 -220 289 -192 z',\n },\n accidentalFlat: {\n x_min: 0,\n x_max: 226,\n y_min: -175,\n y_max: 439,\n ha: 614,\n o: 'm 17 -245 b 30 -252 22 -251 26 -252 b 39 -249 35 -252 39 -249 b 153 -161 82 -225 117 -186 b 325 82 281 -72 325 16 b 196 220 325 164 262 216 b 117 196 171 220 137 209 b 85 176 108 189 92 176 b 78 177 82 176 81 176 b 62 202 68 181 62 192 b 72 608 63 233 72 579 b 45 632 72 624 59 632 b 0 592 24 632 1 618 b 17 -245 0 592 6 -230 z m 68 -117 b 63 27 68 -117 63 -30 b 66 73 63 50 65 68 b 167 144 76 102 134 144 b 226 60 209 144 226 96 b 98 -134 226 -17 160 -95 b 84 -138 92 -137 88 -138 b 68 -117 71 -138 68 -124 z',\n },\n accidentalNatural: {\n x_min: 0,\n x_max: 168,\n y_min: -335,\n y_max: 341,\n ha: 676,\n o: 'm 203 261 b 197 259 200 261 199 259 b 68 226 197 259 105 226 b 53 233 59 226 53 228 l 53 474 b 36 491 53 484 45 491 l 17 491 b 0 474 7 491 0 484 l 0 -268 b 13 -281 0 -276 4 -281 l 16 -279 b 22 -278 17 -279 20 -279 b 164 -235 42 -269 122 -235 b 189 -251 179 -235 189 -239 l 189 -465 b 206 -482 189 -475 196 -482 l 225 -482 b 242 -465 233 -482 242 -475 l 242 258 b 230 269 242 265 236 269 b 225 268 229 269 226 269 z m 53 56 b 176 114 53 76 141 114 b 189 107 184 114 189 112 l 189 -42 b 71 -101 189 -68 107 -101 b 53 -92 60 -101 53 -98 z',\n },\n accidentalSharp: {\n x_min: 0,\n x_max: 249,\n y_min: -348,\n y_max: 350,\n ha: 698,\n o: 'm 341 170 b 359 194 351 174 359 186 l 359 297 b 348 308 359 304 354 308 b 341 307 346 308 344 308 b 305 294 341 307 312 295 b 285 312 295 294 285 301 l 285 488 b 265 504 285 497 276 504 b 242 488 251 504 242 497 l 242 301 b 223 259 240 287 236 268 b 132 223 206 249 157 229 b 115 252 120 223 115 240 l 115 425 b 95 441 115 433 105 441 b 72 425 81 441 72 433 l 72 230 b 55 192 72 210 63 196 b 17 176 46 187 17 176 b 0 153 7 173 0 161 l 0 50 b 13 37 0 42 4 37 l 16 39 b 50 53 17 39 39 48 l 52 55 b 72 29 63 55 72 40 l 72 -114 b 56 -147 72 -130 65 -143 b 17 -163 48 -150 17 -163 b 0 -186 7 -166 0 -177 l 0 -288 b 13 -301 0 -297 4 -301 l 16 -300 b 50 -287 17 -300 37 -291 b 55 -285 52 -285 53 -285 b 72 -308 65 -285 72 -301 l 72 -485 b 91 -501 72 -494 81 -501 b 115 -485 105 -501 115 -494 l 115 -285 b 130 -253 115 -266 122 -256 l 217 -217 b 219 -217 217 -217 219 -217 l 222 -216 b 242 -242 235 -216 242 -233 l 242 -422 b 261 -438 242 -431 251 -438 b 285 -422 276 -438 285 -431 l 285 -217 b 301 -184 285 -206 291 -189 b 341 -168 311 -180 341 -168 b 359 -144 351 -164 359 -153 l 359 -42 b 348 -30 359 -35 354 -30 b 341 -32 346 -30 344 -30 l 304 -46 b 285 -20 295 -46 285 -37 l 285 114 b 304 156 285 124 292 151 z m 242 -65 b 132 -122 233 -94 166 -122 b 115 -115 124 -122 117 -120 b 111 -43 112 -109 111 -78 b 115 63 111 1 112 52 b 220 118 118 88 184 118 b 242 109 230 118 239 115 b 248 27 245 102 248 66 b 242 -65 248 -12 245 -52 z',\n },\n accidentalDoubleSharp: {\n x_min: 0,\n x_max: 247,\n y_min: -125,\n y_max: 127,\n ha: 252,\n o: 'm 274 -46 b 206 1 258 -37 206 -9 b 274 50 206 22 253 43 b 278 50 275 50 276 50 l 287 49 b 346 63 304 49 331 52 b 356 115 353 71 356 92 b 292 183 356 174 351 183 b 233 173 266 183 240 180 b 226 117 228 168 226 143 b 179 49 219 101 196 49 b 130 117 158 49 135 96 b 118 173 130 141 125 167 b 66 183 112 180 89 183 b 7 173 42 183 16 180 b 0 120 3 170 0 145 b 7 63 0 94 3 68 b 68 49 17 55 43 49 b 82 50 73 49 78 50 b 150 3 98 42 150 13 b 84 -46 150 -16 104 -39 l 69 -46 b 7 -56 43 -46 16 -49 b 0 -111 3 -60 0 -85 b 7 -166 0 -137 3 -163 b 65 -180 17 -174 40 -180 b 118 -166 86 -180 109 -176 b 130 -111 127 -158 130 -134 b 132 -105 130 -109 131 -107 b 177 -45 141 -85 158 -45 b 226 -111 196 -45 220 -91 b 233 -166 226 -137 228 -161 b 291 -180 243 -174 266 -180 b 356 -114 346 -180 356 -166 b 346 -56 356 -89 351 -63 b 288 -46 338 -49 312 -46 z',\n },\n accidentalDoubleFlat: {\n x_min: 0,\n x_max: 411,\n y_min: -175,\n y_max: 437,\n ha: 612,\n o: 'm 452 217 b 384 194 426 217 408 207 b 350 176 374 189 363 176 b 343 177 347 176 344 176 b 328 202 333 180 328 190 b 337 606 328 232 337 579 b 310 629 337 622 324 629 b 265 592 291 629 268 616 b 269 194 265 592 266 395 b 196 217 248 209 223 217 l 187 217 b 120 194 160 217 143 207 b 85 176 108 189 98 176 b 78 177 82 176 81 176 b 62 202 68 180 62 190 b 72 606 62 232 72 579 b 45 629 72 622 59 629 b 0 592 24 629 1 616 b 17 -245 0 592 7 -232 b 30 -252 22 -251 26 -252 b 39 -249 35 -252 39 -249 b 153 -161 84 -226 120 -186 b 274 -50 206 -124 246 -85 b 284 -245 276 -158 279 -240 b 295 -252 288 -251 292 -252 b 304 -249 300 -252 304 -249 b 416 -163 348 -226 383 -186 b 592 82 546 -72 592 16 b 461 217 592 163 528 216 z m 96 -134 b 84 -138 92 -137 86 -138 b 68 -115 72 -138 68 -124 b 63 26 68 -115 63 -30 b 66 72 63 49 65 66 b 168 144 75 101 134 144 b 226 59 212 144 226 95 b 96 -134 226 -22 161 -94 z m 361 -134 b 348 -138 356 -137 351 -138 b 333 -115 337 -138 333 -124 b 328 39 333 -115 328 -16 b 330 72 328 55 328 68 b 433 144 338 101 399 144 b 468 130 448 144 459 140 b 490 59 481 112 490 88 b 361 -134 490 -22 426 -94 z',\n },\n accidentalParensLeft: {\n x_min: 0,\n x_max: 141,\n y_min: -248,\n y_max: 247,\n ha: 495,\n o: 'm 203 331 l 203 351 b 202 356 203 354 203 356 b 0 0 60 281 0 140 b 199 -357 0 -144 60 -269 b 203 -354 200 -357 203 -356 l 203 -333 b 200 -327 203 -330 202 -328 b 86 0 118 -253 86 -160 b 200 324 86 158 120 251 b 203 331 202 325 203 327 z',\n },\n accidentalParensRight: {\n x_min: 0,\n x_max: 141,\n y_min: -248,\n y_max: 247,\n ha: 495,\n o: 'm 0 331 b 3 324 0 327 1 325 b 117 0 84 251 117 158 b 3 -327 117 -160 85 -253 b 0 -333 1 -328 0 -330 l 0 -354 b 4 -357 0 -356 3 -357 b 203 0 143 -269 203 -144 b 1 356 203 140 143 281 b 0 351 0 356 0 354 z',\n },\n accidentalQuarterToneFlatStein: {\n x_min: 1,\n x_max: 227,\n y_min: -175,\n y_max: 439,\n ha: 614,\n o: 'm 310 -245 b 327 592 321 -230 327 592 b 282 632 325 618 302 632 b 255 608 268 632 255 624 b 265 202 255 579 264 233 b 249 177 265 192 259 181 b 242 176 246 176 245 176 b 210 196 235 176 219 189 b 131 220 190 209 156 220 b 1 85 65 216 1 164 b 174 -161 1 16 46 -72 b 288 -249 210 -186 245 -225 b 297 -252 288 -249 292 -252 b 310 -245 301 -252 305 -251 z m 259 -117 b 243 -138 259 -124 256 -138 b 229 -134 239 -138 235 -137 b 101 60 167 -95 101 -17 b 160 144 101 96 118 144 b 261 73 193 144 251 102 b 264 27 262 68 264 50 b 259 -117 264 -30 259 -117 z',\n },\n accidentalThreeQuarterTonesFlatZimmermann: {\n x_min: 1,\n x_max: 466,\n y_min: -175,\n y_max: 439,\n ha: 614,\n o: 'm 363 -245 b 376 -252 367 -251 372 -252 b 384 -249 380 -252 384 -249 b 497 -161 428 -226 464 -186 b 671 84 625 -72 671 16 b 541 220 671 164 606 217 b 513 217 531 220 523 219 b 464 196 495 212 480 206 b 431 176 452 189 442 176 b 423 177 428 176 426 176 b 408 202 413 180 408 190 l 419 608 b 392 632 419 625 406 632 b 346 592 372 632 347 618 b 363 -245 346 592 351 -230 z m 289 -249 b 297 -252 289 -249 292 -252 b 310 -245 300 -252 305 -251 b 328 592 321 -230 328 592 b 282 631 327 618 302 631 b 255 608 268 631 255 624 l 266 202 b 251 177 266 190 261 180 b 243 176 248 176 246 176 b 210 196 232 176 222 189 b 164 216 196 204 180 210 l 163 217 b 132 220 151 219 143 220 b 1 84 65 217 1 163 b 177 -163 1 16 48 -72 b 289 -249 210 -186 245 -226 z m 262 72 b 265 26 264 66 265 49 b 261 -115 265 -30 261 -115 b 245 -138 261 -124 258 -138 b 230 -134 240 -138 236 -137 b 102 60 166 -92 102 -20 b 124 128 102 88 111 112 b 161 144 134 138 147 144 b 199 134 173 144 184 141 b 262 72 219 122 256 92 z m 413 -115 b 409 26 413 -115 409 -30 b 412 72 409 49 410 66 b 514 144 420 102 480 144 b 570 60 557 144 570 96 b 442 -134 570 -23 508 -91 b 429 -138 436 -137 433 -138 b 413 -115 418 -138 413 -124 z',\n },\n accidentalQuarterToneSharpStein: {\n x_min: 0,\n x_max: 179,\n y_min: -353,\n y_max: 307,\n ha: 660,\n o: 'm 258 240 b 246 252 258 248 252 252 b 240 251 245 252 242 252 b 168 225 240 251 171 225 b 150 253 156 225 150 240 l 150 426 b 130 442 150 435 141 442 b 105 418 108 442 105 429 l 105 230 b 91 193 105 219 101 202 b 17 161 65 183 42 171 b 0 138 9 158 0 147 l 0 36 b 13 23 0 27 4 23 l 16 24 b 86 53 17 24 73 49 l 88 55 b 107 30 98 55 107 42 l 107 -114 b 92 -145 107 -130 101 -143 l 17 -177 b 0 -200 9 -180 0 -192 l 0 -302 b 13 -315 0 -311 4 -315 l 16 -314 b 85 -285 17 -314 72 -291 b 105 -312 92 -282 105 -301 l 105 -492 b 125 -508 105 -501 114 -508 b 150 -484 147 -508 150 -498 l 150 -285 b 151 -274 150 -281 150 -278 b 164 -253 153 -265 158 -256 b 240 -225 176 -251 240 -225 b 258 -202 249 -222 258 -210 l 258 -99 b 245 -86 258 -91 253 -86 l 242 -88 b 240 -88 242 -88 240 -88 l 240 -86 b 168 -115 240 -86 174 -114 b 148 -91 158 -115 148 -107 l 148 43 b 167 85 148 55 156 81 b 240 114 180 91 240 114 b 258 138 249 118 258 128 z',\n },\n accidentalThreeQuarterTonesSharpStein: {\n x_min: 3,\n x_max: 317,\n y_min: -347,\n y_max: 369,\n ha: 716,\n o: 'm 456 324 b 448 336 456 330 454 336 b 393 317 445 336 400 320 b 389 315 392 315 390 315 b 383 325 386 315 383 318 l 383 508 b 360 531 383 528 379 531 b 337 508 341 531 337 527 l 337 318 b 325 291 337 300 334 294 b 268 268 320 288 287 276 b 253 281 256 268 253 274 l 253 464 b 230 487 253 484 249 487 b 207 464 212 487 207 482 l 207 264 b 194 240 207 253 204 245 l 132 217 b 131 217 132 217 132 217 l 130 216 b 118 229 122 216 118 220 l 118 420 b 95 444 118 439 114 444 b 72 420 76 444 72 439 l 72 212 b 60 190 72 197 68 193 l 16 173 b 4 161 9 170 4 167 l 4 50 b 13 39 4 45 9 39 b 58 55 16 39 46 49 b 63 56 60 56 62 56 b 72 42 71 56 72 50 l 72 -125 b 58 -150 72 -137 65 -147 l 16 -166 b 4 -177 9 -168 4 -171 l 4 -289 b 14 -301 4 -295 9 -301 b 53 -287 16 -301 40 -291 b 62 -285 56 -285 59 -285 b 72 -298 69 -285 72 -289 l 72 -477 b 95 -500 72 -495 76 -500 b 118 -477 114 -500 118 -495 l 118 -278 b 127 -259 118 -269 121 -261 l 196 -232 b 207 -243 204 -232 207 -235 l 207 -432 b 230 -455 207 -452 212 -455 b 253 -432 249 -455 253 -451 l 253 -228 b 268 -204 253 -216 259 -207 l 320 -186 b 328 -183 323 -184 325 -183 b 337 -194 334 -183 337 -187 l 337 -387 b 360 -410 337 -408 341 -410 b 383 -387 379 -410 383 -406 l 383 -174 b 395 -157 383 -166 390 -158 l 445 -138 b 456 -127 452 -135 456 -132 l 456 -14 b 448 -3 456 -10 454 -3 b 397 -22 445 -3 408 -17 l 396 -23 b 383 -6 387 -23 383 -16 l 383 163 b 392 181 383 173 384 179 b 445 202 397 183 445 202 b 456 213 452 203 456 207 z m 337 -45 b 266 -78 333 -56 287 -78 b 258 -75 262 -78 259 -76 b 253 19 255 -71 253 -27 b 258 130 253 69 255 122 b 333 163 264 141 315 163 b 337 161 334 163 337 161 b 341 78 340 157 341 120 b 337 -45 341 24 340 -37 z m 118 -127 b 114 -48 114 -121 114 -86 b 118 78 114 6 115 68 b 200 114 122 91 180 114 b 207 111 204 114 206 112 b 212 22 210 107 212 66 b 207 -94 212 -29 210 -85 b 127 -130 203 -108 148 -130 b 118 -127 122 -130 120 -128 z',\n },\n accidentalBuyukMucennebFlat: {\n x_min: 1,\n x_max: 287,\n y_min: -174,\n y_max: 438,\n ha: 612,\n o: 'm 379 452 b 370 464 379 458 377 464 b 164 389 366 464 170 392 b 156 396 163 389 156 393 b 157 436 157 409 157 428 b 167 452 157 445 161 449 b 366 526 173 455 366 526 b 379 540 374 528 379 534 l 379 611 b 370 622 379 616 377 622 b 170 550 366 622 174 552 b 160 557 163 550 160 554 b 161 608 160 585 161 602 b 134 631 161 624 148 631 b 89 590 114 631 91 616 l 89 528 b 81 517 89 526 88 518 b 16 491 76 514 16 491 b 1 480 6 490 1 485 l 1 406 b 13 395 1 400 4 395 l 14 396 b 79 419 16 396 72 415 b 89 412 86 419 89 415 b 91 376 89 399 89 386 b 82 359 91 364 89 361 b 16 331 76 356 16 331 b 1 321 6 331 1 328 l 1 248 b 13 236 1 242 4 236 b 79 262 16 236 71 258 b 92 251 89 262 92 256 b 107 -242 95 23 101 -236 b 120 -251 111 -249 115 -251 b 128 -248 124 -251 128 -248 b 240 -160 171 -225 207 -184 b 413 84 367 -71 413 16 b 284 220 413 166 350 216 b 207 196 259 220 229 209 b 170 176 196 190 184 176 l 168 177 b 151 203 157 181 151 192 b 153 269 151 210 151 236 b 163 292 153 275 153 289 b 366 367 173 297 366 367 b 379 383 374 370 379 376 z m 186 -132 b 173 -137 180 -135 176 -137 b 157 -114 161 -137 157 -122 b 153 35 157 -114 153 -22 b 154 73 153 53 153 68 b 219 135 160 92 197 124 b 255 144 232 141 243 144 b 292 130 269 144 282 140 b 314 62 305 114 314 91 b 186 -132 314 -17 251 -94 z',\n },\n accidentalBakiyeFlat: {\n x_min: -1,\n x_max: 286,\n y_min: -175,\n y_max: 439,\n ha: 614,\n o: 'm 377 454 b 369 467 377 458 376 467 b 363 465 367 467 364 467 b 161 390 363 465 167 393 b 153 399 154 390 153 395 b 157 608 154 494 157 593 b 130 632 157 624 144 632 b 86 592 111 632 88 618 b 88 377 86 592 86 501 b 76 356 88 373 88 360 l 12 331 b -1 320 3 330 -1 327 l -1 248 b 9 236 -1 242 1 236 b 81 264 12 236 78 261 b 89 258 86 264 89 261 b 104 -245 92 30 96 -236 b 115 -252 108 -251 112 -252 b 124 -249 120 -252 124 -249 b 239 -161 167 -226 203 -186 b 412 84 367 -72 412 17 b 282 220 412 166 348 216 b 255 216 274 220 264 219 b 203 196 238 212 222 206 b 171 177 193 189 177 177 b 163 179 168 177 166 177 b 147 202 153 181 147 192 b 147 216 147 204 147 209 l 150 262 b 150 276 150 269 150 275 b 158 291 150 287 154 289 b 363 370 163 292 363 370 b 377 384 373 373 377 379 z m 181 -134 b 167 -138 176 -137 171 -138 b 153 -117 156 -138 153 -125 b 148 27 153 -117 148 -30 b 151 73 148 50 150 68 b 255 144 161 105 219 144 b 312 62 298 144 312 99 b 181 -134 312 -19 249 -96 z',\n },\n accidentalKomaSharp: {\n x_min: 0,\n x_max: 229,\n y_min: -337,\n y_max: 322,\n ha: 659,\n o: 'm 312 151 b 330 176 323 156 330 166 l 330 278 b 320 289 330 285 327 289 b 312 288 318 289 315 289 b 200 246 312 288 203 248 b 181 275 187 246 181 264 l 181 448 b 163 464 181 456 173 464 b 138 441 140 464 138 452 l 138 253 b 122 215 137 240 132 225 b 17 177 92 203 45 177 b 0 153 7 173 0 163 l 0 50 b 10 39 0 43 4 39 b 17 40 13 39 14 39 l 128 81 b 138 52 138 81 138 63 l 138 -91 b 124 -124 138 -107 132 -120 b 17 -167 115 -127 17 -167 b 0 -192 7 -171 0 -181 l 0 -294 b 10 -305 0 -301 4 -305 b 17 -304 13 -305 14 -305 b 128 -261 17 -304 117 -264 l 130 -259 b 138 -276 137 -259 138 -268 l 138 -469 b 157 -485 138 -478 147 -485 b 181 -462 179 -485 181 -475 l 181 -262 b 183 -252 181 -258 181 -255 b 197 -232 186 -243 190 -235 b 312 -187 207 -228 312 -187 b 330 -163 323 -183 330 -173 l 330 -60 b 320 -49 330 -53 327 -49 b 312 -50 318 -49 315 -49 l 200 -94 b 193 -95 197 -95 194 -95 b 181 -68 183 -95 181 -85 l 181 66 b 200 108 181 92 189 104 z',\n },\n accidentalKucukMucennebSharp: {\n x_min: -1,\n x_max: 339,\n y_min: -338,\n y_max: 321,\n ha: 659,\n o: 'm 264 92 b 271 102 264 98 265 99 l 395 150 b 412 174 405 154 412 164 l 412 276 b 402 288 412 284 409 288 b 395 287 400 288 397 288 b 282 245 395 287 285 246 b 264 274 269 245 264 262 l 264 446 b 245 462 264 455 255 462 b 220 439 222 462 220 451 l 220 252 b 204 213 219 239 215 223 b 99 176 174 202 127 176 b 82 151 89 171 82 161 l 82 49 b 92 37 82 42 86 37 b 99 39 95 37 96 37 l 210 79 b 216 81 212 81 215 81 b 220 78 219 81 220 79 l 220 56 b 216 46 220 52 220 48 b 16 -29 210 45 16 -29 b -1 -45 4 -32 -1 -36 l -1 -138 b 12 -154 -1 -145 3 -154 l 215 -79 b 220 -84 219 -79 220 -81 l 220 -105 b 210 -122 220 -115 219 -120 b 99 -168 202 -127 99 -168 b 82 -193 89 -173 82 -183 l 82 -295 b 92 -307 82 -302 86 -307 b 99 -305 95 -307 96 -307 b 210 -262 99 -305 199 -265 l 212 -261 b 220 -278 219 -261 220 -269 l 220 -471 b 239 -487 220 -480 229 -487 b 264 -464 261 -487 264 -477 l 264 -264 b 265 -253 264 -259 264 -256 b 279 -233 268 -245 272 -236 b 395 -189 289 -229 395 -189 b 412 -164 405 -184 412 -174 l 412 -62 b 402 -50 412 -55 409 -50 b 395 -52 400 -50 397 -50 l 278 -96 b 264 -86 268 -96 264 -94 l 264 -68 b 269 -59 264 -62 265 -60 b 471 17 274 -58 471 17 b 488 36 484 22 488 27 l 488 127 b 475 144 488 134 487 144 l 472 141 b 471 141 472 141 471 141 l 471 143 b 272 68 471 143 282 71 l 269 66 b 264 71 264 66 264 69 z',\n },\n accidentalKoron: {\n x_min: 0,\n x_max: 300,\n y_min: -472,\n y_max: 157,\n ha: 629,\n o: 'm 432 -4 b 415 10 432 1 418 9 l 4 226 b 0 223 1 226 0 225 l 0 -672 b 7 -680 0 -677 3 -680 l 45 -680 b 52 -672 49 -680 52 -677 l 52 -193 l 415 -22 b 432 -4 418 -20 432 -13 z m 52 -137 l 52 144 l 327 -7 z',\n },\n accidentalSori: {\n x_min: 0,\n x_max: 421,\n y_min: -318,\n y_max: 328,\n ha: 646,\n o: 'm 606 10 b 589 23 606 16 592 22 l 382 109 l 382 465 b 374 472 382 469 379 472 l 337 472 b 330 465 333 472 330 469 l 330 132 l 183 194 l 183 425 b 176 432 183 429 180 432 l 138 432 b 131 425 134 432 131 429 l 131 216 l 3 269 b 0 265 0 269 0 266 l 0 223 b 3 213 0 216 0 215 l 131 160 l 131 -150 l 3 -203 b 0 -212 0 -204 0 -206 l 0 -255 b 3 -259 0 -258 1 -259 l 131 -204 l 131 -451 b 138 -458 131 -455 134 -458 l 176 -458 b 183 -451 180 -458 183 -455 l 183 -183 l 330 -120 l 330 -410 b 337 -418 330 -415 333 -418 l 374 -418 b 382 -410 379 -418 382 -415 l 382 -98 l 589 -9 b 606 10 592 -9 606 0 z m 183 -128 l 183 138 l 330 76 l 330 -66 z m 382 -45 l 382 55 l 501 6 z',\n },\n articAccentAbove: {\n x_min: 0,\n x_max: 339,\n y_min: 1,\n y_max: 245,\n ha: 244,\n o: 'm 469 151 b 488 177 488 156 488 166 b 469 203 488 189 488 197 l 37 350 b 24 353 32 351 26 353 b 3 333 12 353 7 344 b 0 318 1 327 0 323 b 20 298 0 311 4 304 b 346 187 20 298 331 193 b 356 177 353 186 356 181 b 344 167 356 173 353 170 b 20 58 328 163 20 58 b 0 36 4 50 0 43 b 3 23 0 32 1 27 b 23 1 7 13 13 1 b 29 3 24 1 27 1 z',\n },\n articAccentBelow: {\n x_min: 0,\n x_max: 339,\n y_min: -244,\n y_max: 0,\n ha: 244,\n o: 'm 469 -202 b 488 -176 488 -197 488 -187 b 469 -150 488 -164 488 -156 l 37 -3 b 24 0 32 -1 26 0 b 3 -20 12 0 7 -9 b 0 -35 1 -26 0 -30 b 20 -55 0 -42 4 -49 b 346 -166 20 -55 331 -160 b 356 -176 353 -167 356 -171 b 344 -186 356 -180 353 -183 b 20 -295 328 -190 20 -295 b 0 -317 4 -302 0 -310 b 3 -330 0 -321 1 -325 b 23 -351 7 -340 13 -351 b 29 -350 24 -351 27 -351 z',\n },\n articTenutoAbove: {\n x_min: -1,\n x_max: 338,\n y_min: 0,\n y_max: 48,\n ha: 48,\n o: 'm 452 0 b 487 35 485 0 487 16 b 452 69 487 53 487 69 l 33 69 b -1 35 -1 69 -1 53 b 33 0 -1 16 -1 0 z',\n },\n articTenutoBelow: {\n x_min: -1,\n x_max: 338,\n y_min: -48,\n y_max: 0,\n ha: 48,\n o: 'm 452 -69 b 487 -35 485 -69 487 -53 b 452 0 487 -16 487 0 l 33 0 b -1 -35 -1 0 -1 -16 b 33 -69 -1 -53 -1 -69 z',\n },\n articStaccatoAbove: {\n x_min: 0,\n x_max: 84,\n y_min: 0,\n y_max: 84,\n ha: 84,\n o: 'm 121 60 b 60 121 121 94 94 121 b 0 60 27 121 0 94 b 60 0 0 27 27 0 b 121 60 94 0 121 27 z',\n },\n articStaccatoBelow: {\n x_min: 0,\n x_max: 84,\n y_min: -84,\n y_max: 0,\n ha: 84,\n o: 'm 121 -60 b 60 0 121 -27 94 0 b 0 -60 27 0 0 -27 b 60 -121 0 -94 27 -121 b 121 -60 94 -121 121 -94 z',\n },\n articStaccatissimoAbove: {\n x_min: 1,\n x_max: 100,\n y_min: -2,\n y_max: 293,\n ha: 295,\n o: 'm 72 422 b 1 390 35 422 3 409 b 72 -3 1 369 39 -3 b 144 389 108 -3 144 356 b 72 422 144 410 111 422 z',\n },\n articStaccatissimoBelow: {\n x_min: 1,\n x_max: 100,\n y_min: -295,\n y_max: 0,\n ha: 295,\n o: 'm 72 -425 b 144 -392 111 -425 144 -413 b 72 0 144 -359 108 0 b 1 -393 39 0 1 -372 b 72 -425 3 -412 35 -425 z',\n },\n articMarcatoAbove: {\n x_min: -1,\n x_max: 235,\n y_min: -1,\n y_max: 253,\n ha: 254,\n o: 'm 181 356 b 167 364 177 361 173 364 b 153 356 157 364 153 356 l 0 23 b -1 16 -1 20 -1 19 b 9 0 -1 9 1 1 b 16 -1 10 -1 14 -1 b 32 9 22 -1 29 1 b 112 186 32 9 109 180 b 118 190 114 189 115 190 b 127 186 121 190 124 189 b 209 9 128 180 209 9 b 225 0 213 3 219 0 l 323 0 b 338 16 333 1 338 7 b 337 23 338 19 338 22 z',\n },\n articMarcatoBelow: {\n x_min: -1,\n x_max: 235,\n y_min: -254,\n y_max: 0,\n ha: 254,\n o: 'm 156 -357 b 170 -366 160 -363 164 -366 b 184 -357 180 -366 184 -357 l 337 -24 b 338 -17 338 -22 338 -20 b 328 -1 338 -10 336 -3 b 321 0 327 0 323 0 b 305 -10 315 0 308 -3 b 225 -187 305 -10 228 -181 b 219 -192 223 -190 222 -192 b 210 -187 216 -192 213 -190 b 128 -10 209 -181 128 -10 b 112 -1 124 -4 118 -1 l 14 -1 b -1 -17 4 -3 -1 -9 b 0 -24 -1 -20 -1 -23 z',\n },\n fermataAbove: {\n x_min: 3,\n x_max: 605,\n y_min: -3,\n y_max: 329,\n ha: 332,\n o: 'm 435 318 b 818 36 742 318 804 91 b 821 26 819 32 819 27 b 851 -4 831 6 837 -4 b 871 16 864 -4 871 1 b 870 30 871 20 871 24 b 438 474 780 471 480 474 b 6 30 392 474 94 471 b 4 14 4 24 4 19 b 23 -4 4 0 12 -4 b 52 26 36 -4 43 6 b 56 39 53 27 55 33 b 435 318 73 98 138 318 z m 516 75 b 436 153 516 117 480 153 b 359 75 395 153 359 117 b 436 -4 359 32 395 -4 b 516 75 480 -4 516 32 z',\n },\n fermataBelow: {\n x_min: 3,\n x_max: 605,\n y_min: -332,\n y_max: 0,\n ha: 332,\n o: 'm 435 -323 b 56 -43 138 -323 73 -102 b 52 -30 55 -37 53 -32 b 23 0 43 -10 36 0 b 4 -19 12 0 4 -4 b 6 -35 4 -23 4 -29 b 438 -478 94 -475 392 -478 b 870 -35 480 -478 780 -475 b 871 -20 871 -29 871 -24 b 851 0 871 -6 864 0 b 821 -30 837 0 831 -10 b 818 -40 819 -32 819 -36 b 435 -323 804 -95 742 -323 z m 516 -79 b 436 0 516 -36 480 0 b 359 -79 395 0 359 -36 b 436 -157 359 -121 395 -157 b 516 -79 480 -157 516 -121 z',\n },\n breathMarkComma: {\n x_min: 1,\n x_max: 152,\n y_min: 2,\n y_max: 251,\n ha: 249,\n o: 'm 104 361 b 1 271 42 361 1 321 b 82 190 1 222 35 190 b 122 160 118 190 122 160 b 125 144 124 154 125 150 b 102 88 125 124 115 105 b 37 32 78 56 40 35 b 26 17 32 29 26 26 l 27 16 b 37 3 29 6 33 3 b 181 102 85 3 158 66 b 219 239 210 147 219 197 l 219 249 b 104 361 219 317 170 361 z',\n },\n breathMarkUpbow: {\n x_min: 1,\n x_max: 249,\n y_min: 1,\n y_max: 495,\n ha: 494,\n o: 'm 181 1 b 206 22 193 1 203 10 l 359 683 l 359 688 b 338 713 359 700 351 710 l 333 713 b 308 694 321 713 311 706 l 180 140 l 53 694 b 27 713 49 706 39 713 l 22 713 b 1 690 10 710 1 700 b 3 683 1 687 1 685 l 154 22 b 181 1 157 10 167 1 z',\n },\n caesura: {\n x_min: 0,\n x_max: 384,\n y_min: -1,\n y_max: 532,\n ha: 533,\n o: 'm 40 -1 b 78 26 58 -1 72 9 l 321 713 b 323 726 323 717 323 721 b 282 766 323 747 304 766 b 245 739 265 766 251 756 l 3 52 b 0 37 1 48 0 42 b 27 1 0 22 10 7 b 40 -1 32 -1 36 -1 z m 308 26 l 552 713 b 553 726 553 717 553 721 b 513 766 553 747 534 766 b 475 739 495 766 481 756 l 232 52 b 230 39 230 48 230 43 b 258 1 230 23 240 7 b 271 -1 262 -1 266 -1 b 308 26 287 -1 302 9 z',\n },\n caesuraCurved: {\n x_min: 0,\n x_max: 373,\n y_min: 0,\n y_max: 530,\n ha: 530,\n o: 'm 491 763 b 445 719 468 763 446 744 b 252 98 432 507 340 295 l 226 39 b 223 27 225 35 223 32 b 252 0 223 13 233 0 b 276 16 262 0 272 6 b 537 716 386 230 537 478 b 491 763 537 742 518 763 z m 29 0 b 53 16 39 0 48 6 l 82 69 b 314 716 187 264 314 498 b 268 763 314 742 295 763 b 222 719 245 763 223 744 b 29 98 209 507 117 295 l 3 39 b 0 29 1 36 0 33 b 29 0 0 14 12 0 z',\n },\n restMaxima: {\n x_min: 0,\n x_max: 381,\n y_min: -249,\n y_max: 250,\n ha: 499,\n o: 'm 180 -330 l 180 331 b 156 360 180 356 170 360 l 23 360 b 0 331 10 360 0 356 l 0 -330 b 23 -359 0 -354 10 -359 l 156 -359 b 180 -330 170 -359 180 -354 z m 549 -330 l 549 331 b 524 360 549 356 539 360 l 392 360 b 369 331 379 360 369 356 l 369 -330 b 392 -359 369 -354 379 -359 l 524 -359 b 549 -330 539 -359 549 -354 z',\n },\n restDoubleWhole: {\n x_min: 0,\n x_max: 125,\n y_min: 0,\n y_max: 250,\n ha: 250,\n o: 'm 180 22 l 180 338 b 156 360 180 350 170 360 l 23 360 b 0 338 10 360 0 350 l 0 22 b 23 0 0 10 10 0 l 156 0 b 180 22 170 0 180 10 z',\n },\n restWhole: {\n x_min: 0,\n x_max: 282,\n y_min: -135,\n y_max: 9,\n ha: 144,\n o: 'm 406 -157 l 406 -24 b 369 13 406 -3 389 13 l 37 13 b 0 -24 16 13 0 -3 l 0 -157 b 37 -194 0 -177 16 -194 l 369 -194 b 406 -157 389 -194 406 -177 z',\n },\n restHalf: {\n x_min: 0,\n x_max: 282,\n y_min: -2,\n y_max: 142,\n ha: 144,\n o: 'm 406 35 l 406 167 b 369 204 406 189 389 204 l 37 204 b 0 167 16 204 0 189 l 0 35 b 37 -3 0 14 16 -3 l 369 -3 b 406 35 389 -3 406 14 z',\n },\n restQuarter: {\n x_min: 1,\n x_max: 270,\n y_min: -375,\n y_max: 373,\n ha: 748,\n o: 'm 112 -55 b 174 -141 135 -84 156 -111 b 183 -161 177 -147 183 -158 b 181 -167 183 -163 183 -166 b 166 -174 179 -173 173 -174 b 143 -170 160 -174 148 -171 b 137 -170 141 -170 138 -170 l 125 -166 b 1 -304 50 -166 1 -233 b 168 -527 1 -376 63 -446 b 206 -540 180 -536 194 -540 b 228 -531 216 -540 226 -537 b 230 -521 229 -527 230 -524 b 207 -487 230 -508 219 -497 b 170 -435 189 -487 173 -448 b 164 -397 166 -423 164 -410 b 255 -292 164 -338 194 -292 b 369 -317 297 -292 344 -308 l 370 -318 b 382 -320 376 -320 379 -320 b 389 -314 386 -320 389 -318 b 336 -232 389 -297 351 -249 b 236 -32 281 -166 236 -112 b 236 -27 236 -30 236 -29 l 238 -17 b 238 -13 238 -16 238 -14 b 333 199 243 71 295 140 b 338 220 337 206 338 213 b 333 248 338 235 333 248 b 95 526 333 248 120 501 b 69 537 88 533 78 537 b 40 507 55 537 40 527 b 46 484 40 500 42 492 b 134 291 52 468 134 395 b 48 108 134 238 112 176 b 27 66 33 94 27 78 b 42 32 27 46 42 32 z',\n },\n rest8th: {\n x_min: 0,\n x_max: 247,\n y_min: -251,\n y_max: 174,\n ha: 425,\n o: 'm 193 154 b 96 251 193 207 150 251 b 0 154 43 251 0 207 b 39 81 0 124 17 98 b 117 56 62 65 89 56 b 173 66 137 56 157 60 b 225 88 193 72 206 78 b 232 89 228 89 230 89 b 239 76 238 89 239 84 b 238 60 239 72 239 66 b 104 -343 233 39 130 -248 b 145 -361 104 -360 137 -361 b 196 -347 161 -361 181 -359 b 341 161 200 -344 341 161 b 356 217 347 187 354 210 b 338 240 356 232 341 239 b 323 235 336 240 331 240 b 193 140 312 226 240 140 z',\n },\n rest16th: {\n x_min: 0,\n x_max: 320,\n y_min: -500,\n y_max: 179,\n ha: 679,\n o: 'm 300 160 b 202 258 300 215 256 258 b 104 160 148 258 104 215 b 219 62 104 101 164 62 b 331 94 258 62 298 75 b 341 96 336 95 338 96 b 348 86 346 96 348 94 b 265 -173 348 63 275 -151 b 194 -217 253 -200 215 -217 b 196 -203 196 -212 196 -207 b 98 -105 196 -148 151 -105 b 0 -203 43 -105 0 -148 b 115 -301 0 -262 60 -301 b 223 -271 153 -301 190 -288 b 229 -279 226 -271 229 -274 l 228 -281 b 228 -282 228 -282 228 -282 l 91 -690 b 91 -691 91 -690 91 -691 l 89 -693 b 134 -720 89 -706 102 -720 b 189 -687 176 -720 183 -703 l 356 -138 b 420 81 393 -16 420 81 b 459 226 420 81 456 207 b 461 232 459 229 461 230 b 446 248 461 240 449 246 b 431 242 439 248 435 245 b 300 145 420 233 348 147 z',\n },\n rest32nd: {\n x_min: 0,\n x_max: 363,\n y_min: -500,\n y_max: 426,\n ha: 926,\n o: 'm 508 603 b 492 598 501 603 497 600 b 361 503 482 590 410 503 l 361 516 b 264 613 361 570 318 613 b 166 516 210 613 166 570 b 206 444 166 487 183 461 b 246 423 217 433 232 428 b 284 418 258 420 269 418 b 393 449 321 418 360 432 b 399 451 395 451 397 451 b 415 426 409 451 415 436 l 413 423 b 413 422 413 423 413 422 l 357 192 b 279 140 350 168 302 140 b 281 153 281 144 281 148 b 183 251 281 207 236 251 b 85 153 128 251 85 207 b 125 81 85 124 102 98 b 164 60 137 71 150 65 b 203 55 176 58 189 55 b 311 86 240 55 278 69 b 315 88 312 88 314 88 b 325 69 323 88 325 76 l 268 -167 b 194 -217 261 -197 216 -216 b 196 -203 196 -212 196 -207 b 98 -105 196 -148 153 -105 b 0 -203 45 -105 0 -148 b 115 -301 0 -262 60 -301 b 228 -269 154 -301 194 -288 b 232 -268 229 -268 230 -268 b 240 -276 236 -268 240 -272 b 138 -688 240 -282 141 -678 b 137 -697 137 -691 137 -694 b 176 -720 137 -708 145 -720 b 232 -690 222 -720 226 -706 b 484 436 236 -672 484 436 b 521 582 484 436 518 564 b 523 588 521 585 523 586 b 508 603 523 600 511 603 z',\n },\n rest64th: {\n x_min: 0,\n x_max: 423,\n y_min: -753,\n y_max: 430,\n ha: 1183,\n o: 'm 596 609 b 580 603 589 609 585 606 b 448 507 569 595 497 507 b 449 521 449 511 449 516 b 351 619 449 575 405 619 b 253 521 297 619 253 575 b 372 422 253 461 317 422 b 481 454 410 422 446 438 b 491 456 484 455 488 456 b 504 441 498 456 504 451 b 501 426 504 436 503 432 b 445 202 500 422 451 217 b 359 144 435 174 383 144 l 359 158 b 261 256 359 212 315 256 b 163 158 207 256 163 212 b 243 65 163 112 202 78 b 279 60 255 62 266 60 b 397 91 320 60 360 73 b 403 92 400 92 402 92 b 412 79 409 92 412 86 b 410 72 412 76 412 75 b 351 -161 408 59 356 -150 b 281 -212 340 -199 301 -212 l 281 -197 b 183 -99 281 -144 238 -99 b 85 -197 130 -99 85 -144 b 125 -271 85 -228 102 -253 b 166 -291 138 -279 151 -287 b 204 -297 177 -294 192 -297 b 262 -287 225 -297 245 -292 b 305 -265 282 -279 287 -274 b 310 -264 307 -264 308 -264 b 318 -284 317 -264 318 -275 b 317 -295 318 -288 317 -294 b 259 -524 315 -302 265 -508 b 194 -567 251 -554 213 -567 b 196 -554 196 -563 196 -559 b 98 -456 196 -500 153 -456 b 0 -554 45 -456 0 -500 b 40 -626 0 -583 17 -609 b 118 -652 60 -644 92 -652 b 210 -629 145 -652 186 -642 b 216 -628 213 -628 215 -628 b 228 -647 226 -628 228 -639 l 226 -651 b 226 -652 226 -651 226 -652 l 122 -1054 b 121 -1064 121 -1058 121 -1061 b 167 -1084 121 -1077 134 -1084 b 215 -1060 202 -1084 209 -1076 b 402 -278 217 -1047 229 -1021 b 436 -135 403 -278 431 -161 l 570 441 b 609 588 570 441 605 569 b 596 609 609 603 602 608 z',\n },\n rest128th: {\n x_min: 0,\n x_max: 485,\n y_min: -750,\n y_max: 689,\n ha: 1439,\n o: 'm 537 894 b 439 992 537 949 494 992 b 341 894 386 992 341 949 b 382 822 341 865 359 840 b 459 796 402 805 433 796 b 518 806 480 796 501 801 l 520 808 b 569 828 539 814 552 819 b 580 831 572 829 577 831 b 598 812 589 831 598 825 b 596 801 598 809 598 805 b 540 575 590 773 546 595 b 448 510 534 553 475 510 l 448 524 b 350 622 448 577 405 622 b 252 524 297 622 252 577 b 292 451 252 494 269 468 b 369 426 318 433 337 426 b 429 435 389 426 412 429 b 494 464 449 442 475 455 b 498 465 495 465 497 465 b 505 446 504 465 505 456 b 503 426 505 439 504 432 l 446 202 b 366 144 439 173 389 144 l 366 158 b 268 256 366 212 323 256 b 170 158 215 256 170 212 b 289 59 170 98 235 59 b 347 69 310 59 330 63 b 397 91 367 76 379 82 b 406 94 400 92 403 94 b 415 79 412 94 415 88 b 412 63 415 75 413 69 b 357 -157 408 42 364 -134 b 281 -212 346 -196 302 -212 b 282 -197 281 -207 282 -203 b 184 -99 282 -144 238 -99 b 86 -197 130 -99 86 -144 b 204 -297 86 -258 150 -297 b 262 -287 225 -297 245 -292 b 312 -265 282 -279 294 -274 b 318 -264 314 -264 317 -264 b 327 -275 324 -264 327 -269 b 266 -517 324 -287 278 -490 b 200 -569 248 -566 220 -567 l 196 -554 b 98 -456 196 -500 153 -456 b 0 -554 45 -456 0 -500 b 118 -652 0 -615 63 -652 b 177 -642 138 -652 160 -648 l 179 -641 b 229 -621 197 -635 210 -629 l 230 -619 b 239 -626 236 -619 239 -622 b 238 -632 239 -628 239 -631 b 131 -1057 235 -642 134 -1050 b 173 -1080 131 -1071 140 -1080 b 230 -1057 219 -1080 225 -1074 l 658 815 b 697 960 658 815 694 942 b 698 966 697 963 698 965 b 684 982 698 975 687 981 b 668 976 677 982 672 979 b 537 880 658 969 586 881 z',\n },\n dynamicPiano: {\n x_min: -89,\n x_max: 366,\n y_min: -142,\n y_max: 274,\n ha: 416,\n o: 'm 395 395 b 292 357 350 395 318 380 b 262 328 272 340 268 328 b 246 363 255 328 259 338 b 177 393 236 380 215 393 b 1 251 92 393 46 333 b -9 223 -6 238 -9 230 b 7 207 -9 213 -1 207 b 30 229 17 207 23 216 b 127 338 72 301 101 338 b 143 321 138 338 143 331 b 134 285 143 310 138 295 l -43 -154 b -65 -168 -48 -166 -50 -168 l -109 -168 b -128 -187 -122 -168 -128 -174 b -111 -204 -128 -199 -122 -204 l 167 -204 b 186 -186 180 -204 186 -199 b 168 -168 186 -174 180 -168 l 111 -168 b 98 -164 102 -168 98 -168 b 101 -154 98 -163 99 -158 l 166 7 b 179 24 168 14 171 24 b 213 -1 186 24 190 10 b 276 -14 233 -12 252 -14 b 527 266 415 -14 527 130 b 395 395 527 350 475 395 z m 356 341 b 389 288 380 341 389 320 b 243 35 389 217 312 35 b 207 81 219 35 207 50 b 235 180 207 111 219 140 l 264 251 b 356 341 284 300 321 341 z',\n },\n dynamicMezzo: {\n x_min: -20,\n x_max: 446,\n y_min: -10,\n y_max: 274,\n ha: 284,\n o: 'm 528 395 b 431 350 487 395 454 374 b 409 330 416 336 415 330 b 397 360 402 330 406 341 b 334 395 389 379 370 395 b 236 350 292 395 259 374 b 215 330 222 336 220 330 b 203 360 207 330 212 340 b 147 393 194 379 174 393 b -19 251 71 393 26 331 b -29 223 -26 238 -29 230 b -13 207 -29 213 -22 207 b 9 226 -3 207 1 215 b 107 338 52 300 81 338 b 122 321 118 338 122 331 b 114 285 122 310 118 295 l 9 24 b 4 9 6 17 4 13 b 20 0 4 3 9 0 l 91 0 b 114 17 104 0 108 3 l 207 251 b 287 323 225 292 255 323 b 308 302 304 323 308 314 b 294 249 308 285 302 269 b 203 24 294 248 292 248 b 199 9 200 17 199 13 b 215 0 199 3 203 0 l 285 0 b 308 17 298 0 302 3 l 402 251 b 481 323 419 292 449 323 b 503 302 498 323 503 314 b 413 43 503 252 413 104 b 478 -14 413 6 436 -14 b 629 102 533 -14 583 26 b 642 132 638 117 642 125 b 629 145 642 141 636 145 b 608 127 619 145 615 138 b 534 49 580 84 553 49 b 523 62 526 49 523 53 b 606 317 523 112 606 238 b 528 395 606 353 588 395 z',\n },\n dynamicForte: {\n x_min: -141,\n x_max: 364,\n y_min: -152,\n y_max: 444,\n ha: 596,\n o: 'm 23 380 b 0 357 7 380 0 373 b 22 336 0 343 7 336 l 105 336 b 117 330 114 336 117 336 b 114 315 117 327 115 323 l 23 0 b -101 -187 -17 -141 -43 -187 b -127 -174 -120 -187 -127 -181 b -92 -156 -127 -163 -114 -170 b -63 -102 -75 -144 -63 -125 b -128 -43 -63 -65 -89 -43 b -203 -122 -171 -43 -203 -78 b -95 -219 -203 -186 -156 -219 b 161 17 14 -219 82 -145 b 269 317 203 105 235 194 l 271 318 b 289 336 271 323 282 336 l 383 336 b 406 359 399 336 406 343 b 384 380 406 373 399 380 l 298 380 b 284 387 288 380 284 380 b 287 405 284 392 285 396 b 419 606 315 530 347 606 b 442 595 431 606 442 603 b 419 580 442 586 435 588 b 389 526 400 572 389 552 b 454 465 389 485 418 465 b 524 543 491 465 524 490 b 400 639 524 596 491 639 b 135 402 261 639 183 540 b 107 380 128 380 127 380 z',\n },\n dynamicRinforzando: {\n x_min: -20,\n x_max: 277,\n y_min: 0,\n y_max: 274,\n ha: 274,\n o: 'm 324 395 b 235 350 287 395 256 374 b 215 330 222 336 220 330 b 203 360 207 330 213 337 b 145 393 194 379 174 393 b -19 251 75 393 27 337 b -29 223 -26 238 -29 230 b -13 207 -29 213 -22 207 b 9 226 -3 207 3 215 b 107 338 52 301 81 338 b 122 321 118 338 122 331 b 114 285 122 310 118 295 l 9 24 b 4 9 6 17 4 13 b 20 0 4 3 9 0 l 91 0 b 114 17 104 0 108 3 l 207 251 b 304 351 226 298 272 351 b 318 343 312 351 318 348 b 287 285 318 330 287 325 b 338 239 287 256 308 239 b 399 318 373 239 399 268 b 324 395 399 360 377 395 z',\n },\n dynamicSforzando: {\n x_min: 0,\n x_max: 229,\n y_min: -10,\n y_max: 273,\n ha: 283,\n o: 'm 212 393 b 68 274 127 393 68 350 b 145 161 68 223 95 196 b 200 85 187 132 200 114 b 127 20 200 53 173 20 b 66 42 91 20 66 32 b 91 56 66 49 75 46 b 111 98 104 65 111 79 b 59 145 111 127 86 145 b 0 78 24 145 0 117 b 125 -14 0 30 49 -14 b 291 120 219 -14 291 36 b 220 232 291 160 276 190 b 151 314 168 271 151 287 b 213 361 151 337 168 361 b 258 346 238 361 258 356 b 240 333 258 340 251 340 b 226 298 232 325 226 314 b 276 252 226 269 248 252 b 330 307 311 252 330 279 b 212 393 330 360 285 393 z',\n },\n dynamicZ: {\n x_min: -30,\n x_max: 244,\n y_min: -10,\n y_max: 268,\n ha: 278,\n o: 'm 333 386 b 298 377 321 386 314 382 b 239 370 282 373 259 370 b 94 383 153 370 111 383 b 68 364 79 383 72 377 l 33 264 b 29 242 30 255 29 248 b 45 228 29 232 36 228 b 66 249 55 228 60 236 l 81 279 b 96 297 85 288 88 297 b 168 292 102 297 127 292 b 223 302 194 292 215 302 b 196 269 229 302 197 271 l -26 45 b -43 16 -37 33 -43 27 b -24 -1 -43 6 -36 -1 b 4 16 -12 -1 -3 10 b 39 30 16 24 27 30 b 179 -14 79 30 108 -14 b 297 102 259 -14 297 43 b 245 166 297 147 271 166 b 197 115 219 166 197 145 b 236 72 197 88 216 72 b 259 79 251 72 255 79 b 264 75 262 79 264 78 b 258 60 264 72 261 66 b 229 45 252 50 242 45 b 117 95 186 45 173 95 b 85 86 98 95 89 86 b 102 111 85 86 95 104 l 333 338 b 351 370 344 350 351 359 b 333 386 351 380 343 386 z',\n },\n ornamentTrill: {\n x_min: 0,\n x_max: 521,\n y_min: -10,\n y_max: 390,\n ha: 400,\n o: 'm 383 562 b 364 557 377 562 369 559 l 294 534 b 269 511 281 530 275 526 l 217 384 b 206 367 212 370 210 367 b 179 380 200 367 192 374 b 118 393 158 389 140 393 b 0 292 50 393 0 353 b 95 210 0 248 30 210 b 140 213 112 210 131 213 b 144 209 143 213 144 212 b 140 194 144 206 143 202 l 124 156 b 96 58 108 117 96 88 b 179 -14 96 17 124 -14 b 325 153 253 -14 325 46 b 307 251 325 187 320 219 b 302 265 304 258 302 261 b 334 294 302 274 311 281 l 343 298 b 455 348 393 328 428 348 b 474 327 468 348 474 344 b 465 285 474 312 469 295 l 360 24 b 356 9 357 17 356 13 b 372 0 356 3 360 0 l 442 0 b 465 17 455 0 459 3 l 559 251 b 655 351 577 298 624 351 b 670 343 664 351 670 348 b 638 285 670 330 638 325 b 690 239 638 256 660 239 b 750 318 724 239 750 268 b 675 395 750 360 729 395 b 586 350 638 395 608 374 b 566 330 573 336 572 330 b 553 361 559 330 564 340 b 490 393 543 380 521 393 b 347 348 432 393 377 364 b 312 333 328 338 320 333 b 308 337 310 333 308 334 b 315 359 308 343 312 351 l 387 537 b 392 553 390 544 392 549 b 383 562 392 559 389 562 z m 118 360 b 192 325 134 360 192 347 b 186 307 192 321 189 314 l 180 292 b 148 265 173 274 167 269 b 98 258 130 261 112 258 b 39 301 50 258 39 281 b 118 360 39 327 60 360 z m 272 240 b 292 151 285 240 292 164 b 212 30 292 88 253 30 b 196 48 200 30 196 37 b 207 92 196 59 202 78 b 264 230 207 94 209 94 b 272 240 266 238 268 240 z',\n },\n ornamentTurn: {\n x_min: 0,\n x_max: 460,\n y_min: 0,\n y_max: 218,\n ha: 218,\n o: 'm 534 314 b 454 251 490 314 454 294 b 505 199 454 219 475 199 b 579 232 547 199 549 232 b 626 164 603 232 626 202 b 533 72 626 102 583 72 b 377 180 487 72 439 111 b 150 312 307 258 243 312 b 0 148 55 312 0 240 b 128 0 0 45 66 0 b 209 63 173 0 209 20 b 157 115 209 95 187 115 b 84 82 115 115 114 82 b 36 150 59 82 36 112 b 130 242 36 212 79 242 b 285 134 176 242 223 203 b 513 1 356 56 419 1 b 662 166 608 1 662 73 b 534 314 662 269 596 314 z',\n },\n ornamentTurnSlash: {\n x_min: 0,\n x_max: 460,\n y_min: -90,\n y_max: 306,\n ha: 396,\n o: 'm 333 441 b 310 418 315 441 310 433 l 310 274 b 302 252 310 258 308 252 b 261 278 294 252 287 262 b 150 311 228 298 192 311 b 0 147 55 311 0 239 b 128 -1 0 43 66 -1 b 209 62 173 -1 209 19 b 157 114 209 94 187 114 b 84 81 115 114 114 81 b 36 148 59 81 36 111 b 130 240 36 210 79 240 b 285 128 176 240 222 197 b 307 79 304 108 307 105 l 307 -107 b 330 -130 307 -122 312 -130 b 353 -107 347 -130 353 -122 l 353 37 b 360 59 353 53 353 59 b 402 33 369 59 376 49 b 513 0 435 13 471 0 b 662 164 608 0 662 72 b 534 312 662 268 596 312 b 454 249 490 312 454 292 b 505 197 454 217 475 197 b 579 230 547 197 549 230 b 626 163 603 230 626 200 b 533 71 626 101 583 71 b 377 183 487 71 441 114 b 356 232 359 203 356 206 l 356 418 b 333 441 356 433 350 441 z',\n },\n ornamentMordent: {\n x_min: 1,\n x_max: 729,\n y_min: -73,\n y_max: 319,\n ha: 392,\n o: 'm 546 265 l 546 459 l 501 459 l 501 216 l 459 167 b 439 167 454 160 445 160 b 302 327 387 228 310 317 b 258 353 291 338 282 351 b 226 340 245 353 238 348 l 20 107 b 1 73 12 98 1 84 b 30 59 1 65 9 59 b 88 94 53 59 73 79 b 144 143 107 109 124 127 b 176 161 158 154 168 161 b 197 144 183 161 189 156 l 323 10 b 351 0 328 3 340 0 b 377 9 361 0 372 3 b 498 114 392 17 475 94 l 498 -105 l 544 -105 l 544 153 b 562 160 550 157 556 160 b 585 144 569 160 576 156 b 710 10 590 135 697 24 b 737 0 716 3 727 0 b 765 9 749 0 759 3 b 1030 295 776 17 1011 274 l 1032 300 b 1050 328 1041 308 1050 318 b 1012 353 1050 343 1024 353 b 986 343 1002 353 994 348 b 854 190 971 330 871 206 b 828 176 842 180 835 176 b 802 190 818 176 809 183 b 681 333 791 202 696 320 b 645 353 668 344 657 353 b 613 340 634 353 626 350 b 580 304 600 330 590 315 z',\n },\n ornamentShortTrill: {\n x_min: 0,\n x_max: 725,\n y_min: 0,\n y_max: 245,\n ha: 245,\n o: 'm 429 167 l 301 325 b 256 353 291 338 282 350 b 225 340 246 353 238 350 b 16 105 158 268 88 186 b 0 72 9 96 0 86 b 29 58 0 63 7 58 b 71 76 42 58 55 62 l 158 154 b 174 160 163 158 168 160 b 197 143 181 160 187 154 b 321 10 203 135 310 24 b 350 0 327 3 338 0 b 377 7 361 0 372 3 l 533 148 b 554 160 543 158 550 160 b 577 143 562 160 566 156 b 703 10 585 135 690 24 b 732 0 708 3 720 0 b 759 7 743 0 753 3 b 1024 294 769 16 1005 272 b 1044 327 1032 305 1044 321 b 1005 353 1044 341 1018 353 b 979 343 996 353 988 348 b 848 189 963 330 864 204 b 821 174 837 179 828 174 b 796 189 811 174 804 181 b 674 331 783 202 688 318 b 641 351 662 343 651 351 b 606 340 628 351 619 350 b 573 304 593 328 583 315 b 444 167 533 259 491 213 b 429 167 439 161 433 161 z',\n },\n ornamentTremblement: {\n x_min: 1,\n x_max: 985,\n y_min: 0,\n y_max: 244,\n ha: 244,\n o: 'm 678 325 b 634 351 667 338 657 350 b 602 338 621 351 613 348 l 448 167 b 439 167 446 164 441 164 l 302 325 b 258 351 291 338 281 350 b 228 338 245 351 238 348 b 193 304 215 328 204 315 l 19 107 b 1 72 13 96 1 76 b 30 58 1 63 9 58 b 89 92 52 58 73 78 l 144 141 b 148 144 145 143 147 143 b 176 160 160 153 170 160 b 199 143 183 160 189 154 b 324 10 204 134 311 23 b 351 0 330 3 340 0 b 379 7 363 0 373 3 l 530 148 b 552 160 536 154 546 160 b 575 143 559 160 564 154 b 698 10 580 134 687 23 b 727 0 704 3 716 0 b 755 7 739 0 749 3 l 907 147 b 930 160 922 158 923 160 b 952 143 937 160 943 154 l 1077 10 b 1107 0 1084 3 1096 0 b 1133 7 1117 0 1128 3 b 1398 294 1143 16 1380 272 b 1418 327 1407 305 1418 321 b 1381 351 1418 343 1394 351 b 1354 341 1371 351 1362 348 b 1223 189 1338 328 1238 204 b 1195 174 1211 179 1202 174 b 1171 189 1185 174 1178 181 b 1048 331 1158 200 1063 318 b 1012 351 1035 343 1024 351 b 981 338 1002 351 994 350 b 948 304 968 328 958 315 b 827 166 907 258 865 212 b 815 166 824 163 818 163 b 678 325 760 226 732 264 z',\n },\n ornamentPrecompAppoggTrill: {\n x_min: 0,\n x_max: 1119,\n y_min: 0,\n y_max: 481,\n ha: 481,\n o: 'm 1015 163 b 873 328 963 223 880 318 b 828 354 860 344 847 353 b 796 341 816 354 809 351 b 763 305 783 331 773 317 b 642 168 721 261 681 215 b 636 163 641 167 639 164 b 494 328 585 223 501 318 b 449 354 481 344 468 353 b 418 341 438 354 431 351 b 384 305 405 331 395 317 b 264 168 343 261 302 215 l 242 144 b 144 88 232 124 171 88 b 79 197 81 88 79 189 l 79 648 b 60 693 79 683 71 693 b 52 691 58 693 55 693 b 0 616 3 672 0 625 l 0 207 b 121 0 0 40 68 0 b 249 68 168 0 232 53 b 279 94 262 75 271 86 b 336 144 298 111 315 128 b 367 163 350 156 360 163 b 389 145 374 163 380 157 b 514 12 395 137 501 26 b 543 1 520 4 531 1 b 569 9 553 1 563 4 b 636 73 576 14 605 43 l 658 94 b 714 144 677 111 694 128 b 746 163 729 156 739 163 b 768 145 753 163 759 157 b 893 12 773 137 880 26 b 922 1 899 4 910 1 b 948 9 932 1 942 4 l 1012 71 b 1037 94 1022 78 1030 86 b 1092 144 1054 111 1073 128 b 1123 161 1106 156 1115 161 b 1146 145 1130 161 1136 157 b 1270 12 1152 137 1259 26 b 1299 1 1276 4 1287 1 b 1326 9 1310 1 1320 4 b 1591 297 1336 19 1572 275 b 1611 328 1600 307 1611 320 b 1574 354 1611 343 1585 354 b 1548 344 1565 354 1555 350 b 1416 192 1532 331 1431 206 b 1388 177 1404 181 1395 177 b 1365 190 1380 177 1371 184 b 1243 333 1352 203 1256 321 b 1205 354 1228 346 1217 354 b 1174 341 1195 354 1187 351 b 1140 305 1161 330 1152 317 z',\n },\n ornamentPrecompSlideTrillDAnglebert: {\n x_min: 2,\n x_max: 1150,\n y_min: -367,\n y_max: 245,\n ha: 612,\n o: 'm 1058 160 b 916 327 1007 220 923 317 b 871 353 903 343 890 351 b 840 340 860 353 852 350 b 806 304 827 330 816 315 b 685 167 765 259 724 213 l 680 160 l 615 235 b 419 344 582 275 523 344 b 3 -144 258 344 3 26 b 4 -168 3 -153 3 -160 b 246 -482 24 -315 99 -422 b 458 -528 340 -521 410 -528 b 514 -526 485 -528 504 -526 b 552 -508 531 -526 552 -517 b 514 -497 552 -503 541 -498 l 503 -497 b 194 -390 432 -494 298 -488 b 69 -151 194 -390 69 -279 b 184 96 69 -60 128 27 b 328 183 202 118 258 183 b 477 96 413 183 454 118 b 559 10 510 62 552 19 b 588 0 566 3 576 0 b 613 7 598 0 609 3 b 723 112 622 14 681 73 b 789 161 733 122 776 161 b 811 144 796 161 802 156 b 936 10 816 135 923 24 b 965 0 942 3 953 0 b 991 7 975 0 985 3 b 1051 66 996 12 1022 37 b 1081 92 1063 73 1073 84 b 1136 143 1099 109 1117 127 b 1168 160 1151 154 1159 160 b 1191 144 1175 160 1181 156 b 1315 10 1197 135 1303 24 b 1344 0 1320 3 1332 0 b 1371 7 1355 0 1365 3 b 1636 295 1381 17 1617 274 b 1656 327 1644 305 1656 318 b 1619 353 1656 341 1630 353 b 1593 343 1610 353 1600 348 b 1460 190 1577 330 1476 204 b 1433 176 1449 180 1440 176 b 1410 189 1424 176 1416 183 b 1287 331 1397 202 1300 320 b 1250 353 1273 344 1261 353 b 1218 340 1240 353 1231 350 b 1185 304 1205 328 1197 315 z',\n },\n ornamentPrecompSlideTrillBach: {\n x_min: 0,\n x_max: 1048,\n y_min: -367,\n y_max: 331,\n ha: 698,\n o: 'm 1038 477 l 979 477 l 979 238 l 912 160 b 769 327 858 220 775 317 b 724 353 756 343 743 351 b 693 340 713 353 706 350 b 660 304 680 330 670 315 b 539 167 618 259 577 213 b 533 161 536 166 534 163 b 390 327 480 220 396 317 b 346 353 377 343 364 351 l 340 353 b 308 340 330 353 321 350 b 275 304 295 330 285 315 b 117 122 220 243 168 186 b 0 -144 68 62 0 -48 b 1 -168 0 -153 0 -160 b 243 -482 22 -315 96 -422 b 455 -528 337 -521 408 -528 b 511 -526 482 -528 501 -526 b 549 -508 528 -526 549 -517 b 511 -497 549 -503 539 -498 l 500 -497 b 192 -390 429 -494 295 -488 b 68 -177 192 -390 84 -298 b 66 -151 66 -168 66 -160 b 189 105 66 -58 127 35 b 232 143 203 118 216 131 b 264 161 246 154 256 161 b 285 144 271 161 276 156 b 410 10 291 135 397 24 b 439 0 416 3 428 0 b 465 7 449 0 459 3 l 531 72 b 554 92 540 78 547 86 b 611 143 573 109 590 127 b 642 161 625 154 635 161 b 664 144 649 161 655 156 b 789 10 670 135 776 24 b 818 0 795 3 806 0 b 844 7 828 0 838 3 b 904 66 850 12 876 37 b 935 92 916 73 924 84 b 979 134 949 107 963 121 l 979 -88 l 1037 -88 l 1037 151 l 1044 144 b 1168 10 1050 135 1156 24 b 1197 0 1174 3 1185 0 b 1224 7 1208 0 1218 3 b 1489 295 1234 17 1470 274 b 1509 327 1498 305 1509 318 b 1472 353 1509 341 1483 353 b 1446 343 1463 353 1453 348 b 1313 190 1430 330 1329 204 b 1286 176 1302 180 1293 176 b 1263 189 1277 176 1269 183 b 1140 331 1250 202 1153 320 b 1103 353 1126 344 1115 353 b 1071 340 1093 353 1084 350 b 1038 304 1058 328 1050 315 z',\n },\n ornamentPrecompTrillSuffixDandrieu: {\n x_min: 0,\n x_max: 949,\n y_min: 0,\n y_max: 381,\n ha: 381,\n o: 'm 1367 314 b 1250 521 1367 419 1318 482 b 1107 549 1211 537 1145 549 b 1083 546 1096 549 1087 549 b 1066 528 1071 540 1066 534 b 1079 520 1066 524 1070 520 b 1323 351 1187 517 1323 487 b 1201 171 1323 269 1260 219 b 1194 166 1201 171 1198 168 b 1056 327 1142 226 1063 317 b 1011 353 1043 343 1030 351 b 979 340 999 353 992 350 b 946 304 966 330 956 315 b 825 167 904 259 864 213 l 821 161 b 678 327 768 222 685 317 b 634 353 665 343 652 351 b 602 340 622 353 615 350 b 569 304 589 330 579 315 b 448 167 527 259 487 213 l 444 161 b 301 327 390 222 308 317 b 256 353 288 343 275 351 b 225 340 245 353 238 350 b 192 304 212 330 202 315 b 71 167 150 259 109 213 b 17 105 52 147 36 127 b 0 73 10 98 0 84 b 29 58 0 65 7 58 b 86 92 56 59 72 79 b 143 143 105 109 122 127 b 174 161 157 154 167 161 b 196 144 181 161 187 156 b 321 10 202 135 308 24 b 350 0 327 3 338 0 b 376 7 360 0 370 3 b 485 112 384 14 444 73 b 552 161 495 122 539 161 b 573 144 559 161 564 156 b 698 10 579 135 685 24 b 727 0 704 3 716 0 b 753 7 737 0 747 3 b 863 112 762 14 821 73 b 929 161 873 122 916 161 b 950 144 936 161 942 156 b 1076 10 956 135 1063 24 b 1104 0 1081 3 1093 0 b 1130 7 1115 0 1125 3 b 1236 108 1139 14 1195 69 b 1367 314 1297 160 1367 233 z',\n },\n ornamentPrecompDoubleCadenceUpperPrefix: {\n x_min: 0,\n x_max: 1278,\n y_min: 0,\n y_max: 247,\n ha: 247,\n o: 'm 1801 356 b 1776 346 1793 356 1783 351 b 1642 192 1760 333 1659 206 b 1614 177 1630 181 1621 177 b 1591 190 1606 177 1597 184 b 1469 334 1578 203 1482 323 b 1430 356 1453 347 1441 356 b 1398 343 1420 356 1411 353 b 1365 307 1385 331 1377 318 l 1240 164 b 1097 330 1187 226 1104 320 b 1053 356 1084 346 1071 354 b 1021 343 1041 356 1034 353 b 988 307 1008 333 998 318 b 865 168 946 262 904 216 l 861 163 b 717 330 808 223 724 320 b 672 356 704 346 691 354 b 641 343 661 356 654 353 b 608 307 628 333 618 318 b 485 168 566 262 524 216 l 455 134 b 284 46 409 88 351 46 b 16 285 148 46 32 265 b 3 295 9 292 4 295 b 0 291 1 295 0 292 b 1 285 0 288 1 285 b 308 0 42 190 157 0 b 530 120 415 1 482 63 b 559 144 539 128 549 137 b 590 163 573 156 583 163 b 612 145 598 163 603 157 b 739 10 618 137 724 24 b 768 0 744 3 756 0 b 793 7 778 0 788 3 b 903 114 802 14 861 75 l 939 144 b 971 163 953 156 963 163 b 992 145 978 163 984 157 b 1119 10 998 137 1106 24 b 1148 0 1125 3 1136 0 b 1174 7 1158 0 1168 3 b 1284 114 1182 14 1241 75 b 1316 144 1282 115 1312 141 b 1348 161 1331 156 1339 161 b 1371 145 1355 161 1361 157 b 1496 10 1377 137 1485 24 b 1525 0 1502 3 1513 0 b 1552 7 1536 0 1547 3 b 1819 298 1562 17 1800 276 b 1840 330 1829 308 1840 320 b 1832 344 1840 334 1837 340 b 1801 356 1820 351 1810 356 z',\n },\n ornamentPrecompDoubleCadenceUpperPrefixTurn: {\n x_min: 0,\n x_max: 1277,\n y_min: -62,\n y_max: 333,\n ha: 395,\n o: 'm 1273 202 l 1273 480 l 1230 480 l 1230 174 l 1097 328 b 1053 354 1084 344 1071 353 b 1021 341 1041 354 1034 351 b 988 305 1008 331 998 317 b 865 167 945 261 904 215 l 861 161 b 717 328 808 222 724 318 b 672 354 704 344 691 353 b 641 341 661 354 654 351 b 608 305 628 331 618 317 b 485 167 564 261 524 215 b 455 132 474 156 465 144 b 284 45 410 88 350 45 b 14 284 148 45 30 264 b 3 294 9 291 4 294 b 0 289 1 294 0 291 b 1 284 0 287 1 284 b 308 -1 42 189 157 -1 b 530 118 415 0 481 62 b 557 143 539 127 547 135 b 590 161 572 154 582 161 b 612 144 598 161 603 156 b 737 9 618 135 724 24 b 768 -1 743 1 755 -1 b 793 6 778 -1 788 1 b 903 112 802 13 861 73 l 937 143 b 971 161 953 154 963 161 b 992 144 978 161 984 156 b 1117 9 998 135 1104 24 b 1148 -1 1123 1 1136 -1 b 1174 6 1158 -1 1168 1 l 1230 60 l 1230 -89 l 1273 -89 l 1273 102 l 1283 112 b 1348 160 1295 125 1332 160 b 1371 144 1355 160 1361 156 b 1496 9 1377 135 1483 24 b 1525 -1 1502 1 1513 -1 b 1552 6 1536 -1 1547 1 b 1819 297 1562 16 1800 275 b 1839 328 1827 307 1839 320 b 1801 354 1839 343 1813 354 b 1776 344 1793 354 1783 350 b 1642 190 1760 331 1657 206 b 1614 176 1630 180 1621 176 b 1591 189 1606 176 1597 183 b 1467 333 1578 203 1480 321 b 1430 354 1453 346 1441 354 b 1398 341 1420 354 1411 351 b 1365 305 1385 330 1377 317 z',\n },\n ornamentPrecompTrillLowerSuffix: {\n x_min: 0,\n x_max: 859,\n y_min: -222,\n y_max: 246,\n ha: 468,\n o: 'm 1164 217 b 1031 351 1138 259 1063 351 b 1011 337 1020 351 1024 347 b 828 167 952 291 886 217 l 824 164 b 683 328 772 225 690 318 b 638 354 670 344 657 353 b 606 341 626 354 619 351 b 573 305 593 331 583 317 b 451 167 530 261 490 215 l 446 161 b 302 328 393 222 310 318 b 258 354 289 344 276 353 b 226 341 246 354 239 351 b 193 305 213 331 203 317 b 71 167 150 261 109 215 b 17 105 52 147 36 127 b 0 73 10 98 0 84 b 29 58 0 65 7 58 b 86 92 56 59 72 79 b 143 143 105 109 122 127 b 176 161 157 154 168 161 b 197 144 183 161 189 156 b 323 9 203 135 310 23 b 353 -1 328 1 340 -1 b 379 6 363 -1 373 1 b 488 112 387 13 446 73 l 523 143 b 556 161 539 154 549 161 b 577 144 563 161 569 156 b 703 9 583 135 690 23 b 733 -1 708 1 721 -1 b 759 6 743 -1 753 1 b 868 112 768 13 827 73 b 955 183 878 122 943 183 b 1081 107 965 183 1031 153 b 1156 -89 1128 63 1156 6 l 1156 -102 b 948 -297 1156 -204 1048 -297 b 806 -271 904 -297 850 -282 l 792 -266 b 801 -288 792 -268 795 -282 b 948 -320 809 -297 880 -320 b 1237 -50 1092 -320 1237 -199 b 1164 217 1237 75 1218 122 z',\n },\n brassScoop: {\n x_min: 1,\n x_max: 320,\n y_min: -373,\n y_max: 13,\n ha: 386,\n o: 'm 35 -537 b 461 -12 194 -518 461 -289 b 438 19 461 13 451 19 b 410 -9 425 19 413 9 b 35 -425 357 -366 92 -403 b 1 -482 13 -433 1 -438 l 1 -505 b 26 -537 1 -526 3 -537 z',\n },\n brassDoitMedium: {\n x_min: 0,\n x_max: 489,\n y_min: -40,\n y_max: 346,\n ha: 386,\n o: 'm 33 -58 b 704 468 255 -58 683 186 b 681 498 704 494 693 498 b 654 471 668 498 658 488 b 33 55 550 118 91 76 b 0 -3 12 46 0 42 l 0 -26 b 24 -58 0 -46 1 -58 z',\n },\n brassFallLipShort: {\n x_min: 1,\n x_max: 293,\n y_min: -345,\n y_max: 42,\n ha: 387,\n o: 'm 22 60 b 1 35 4 60 1 52 l 1 6 b 26 -50 3 -40 10 -43 b 32 -52 27 -50 30 -50 b 376 -469 85 -73 327 -111 b 400 -497 379 -487 387 -497 b 422 -467 412 -497 422 -491 b 32 60 422 -187 177 40 z',\n },\n brassLiftMedium: {\n x_min: 0,\n x_max: 811,\n y_min: 0,\n y_max: 852,\n ha: 852,\n o: 'm 1138 1220 b 1135 1225 1135 1223 1135 1224 b 1129 1227 1133 1227 1130 1227 b 1117 1207 1122 1227 1117 1212 l 1117 1201 b 1109 1164 1117 1187 1117 1172 b 1100 1156 1107 1161 1104 1158 b 959 1104 1058 1128 995 1140 b 929 1032 936 1081 929 1056 b 932 1007 929 1024 930 1015 b 923 976 932 995 930 985 l 914 971 b 773 919 873 942 809 955 b 743 847 750 896 743 870 b 746 821 743 838 744 829 b 737 791 746 809 744 799 l 729 783 b 588 733 687 756 624 769 b 557 661 564 710 557 684 b 560 635 557 652 559 644 b 552 605 560 624 559 612 l 543 598 b 402 547 501 570 438 583 b 372 475 379 524 372 498 b 374 449 372 467 373 458 b 366 419 374 438 373 426 l 357 412 b 216 361 315 384 252 397 b 186 289 193 338 186 312 b 189 264 186 281 187 272 b 180 233 189 252 187 240 b 171 226 177 232 174 229 b 30 176 130 199 66 212 b 0 104 7 153 0 128 b 33 0 0 88 14 0 b 49 17 40 0 49 10 b 71 63 52 35 56 49 b 212 115 102 95 154 59 b 239 186 230 134 239 160 b 236 210 239 194 238 202 b 256 249 239 225 243 236 b 397 301 288 281 340 245 b 425 372 416 320 425 346 b 422 396 425 380 423 387 b 442 435 425 410 429 422 b 583 487 474 467 526 431 b 611 557 602 505 611 531 b 608 582 611 566 609 573 b 628 621 611 596 615 608 b 769 672 660 652 711 618 b 796 743 788 691 796 717 b 793 768 796 752 795 759 b 814 806 796 782 801 793 b 955 858 845 838 897 804 b 982 929 973 877 982 903 b 979 953 982 937 981 945 b 999 992 982 968 986 979 b 1140 1045 1031 1024 1083 989 b 1168 1116 1161 1066 1168 1090 b 1138 1220 1168 1162 1145 1207 z',\n },\n brassFallRoughMedium: {\n x_min: 0,\n x_max: 811,\n y_min: 0,\n y_max: 852,\n ha: 852,\n o: 'm 30 1220 b 0 1116 23 1207 0 1162 b 27 1045 0 1090 7 1066 b 168 992 85 989 137 1024 b 189 953 181 979 186 968 b 186 929 187 945 186 937 b 213 858 186 903 194 877 b 354 806 271 804 323 838 b 374 768 367 793 372 782 b 372 743 373 759 372 752 b 399 672 372 717 380 691 b 540 621 456 618 508 652 b 560 582 553 608 557 596 b 557 557 559 573 557 566 b 585 487 557 531 566 505 b 726 435 642 431 694 467 b 746 396 739 422 743 410 b 743 372 744 387 743 380 b 770 301 743 346 752 320 b 912 249 828 245 880 281 b 932 210 924 236 929 225 b 929 186 930 202 929 194 b 956 115 929 160 937 134 b 1097 63 1014 59 1066 95 b 1119 17 1112 49 1116 35 b 1135 0 1119 10 1128 0 b 1168 104 1153 0 1168 91 b 1138 176 1168 128 1161 153 b 996 226 1102 212 1038 199 b 988 233 994 229 991 232 b 979 264 981 240 979 252 b 982 289 981 272 982 281 b 952 361 982 312 975 338 b 811 412 916 397 852 384 l 802 419 b 793 449 795 426 793 438 b 796 475 795 458 796 467 b 766 547 796 498 789 524 b 625 598 730 583 667 570 l 616 605 b 608 635 609 612 608 624 b 611 661 609 644 611 652 b 580 733 611 684 603 710 b 439 783 544 769 481 756 l 431 791 b 422 821 423 799 422 809 b 425 847 423 829 425 838 b 395 919 425 870 418 896 b 253 971 359 955 295 942 l 245 976 b 236 1007 238 985 236 995 b 239 1032 238 1015 239 1024 b 209 1104 239 1056 232 1081 b 68 1156 173 1140 109 1128 b 59 1164 63 1158 60 1161 b 50 1201 50 1172 50 1187 l 50 1207 b 39 1227 50 1212 46 1227 b 33 1225 37 1227 35 1227 b 30 1220 33 1224 33 1223 z',\n },\n brassBend: {\n x_min: 0,\n x_max: 392,\n y_min: 0,\n y_max: 282,\n ha: 282,\n o: 'm 282 0 b 552 72 369 0 456 23 b 564 92 560 75 564 84 l 564 383 b 541 406 564 395 554 406 b 518 383 528 406 518 395 l 518 107 b 282 46 435 65 357 46 b 46 107 207 46 130 65 l 46 383 b 23 406 46 395 36 406 b 0 383 10 406 0 395 l 0 92 b 13 72 0 84 4 75 b 282 0 108 23 196 0 z',\n },\n brassMuteClosed: {\n x_min: 0,\n x_max: 272,\n y_min: 0,\n y_max: 272,\n ha: 272,\n o: 'm 392 219 l 219 219 l 219 392 l 173 392 l 173 219 l 0 219 l 0 173 l 173 173 l 173 0 l 219 0 l 219 173 l 392 173 z',\n },\n brassMuteOpen: {\n x_min: 0,\n x_max: 304,\n y_min: 0,\n y_max: 304,\n ha: 304,\n o: 'm 219 0 b 438 219 340 0 438 98 b 219 438 438 340 340 438 b 0 219 98 438 0 340 b 219 0 0 98 98 0 z m 219 392 b 392 219 314 392 392 314 b 219 46 392 124 314 46 b 46 219 124 46 46 124 b 219 392 46 314 124 392 z',\n },\n brassFlip: {\n x_min: 0,\n x_max: 379,\n y_min: 0,\n y_max: 282,\n ha: 282,\n o: 'm 523 0 b 541 9 530 0 536 3 b 546 22 544 13 546 17 b 536 42 546 29 541 36 l 36 402 b 23 406 33 405 27 406 b 0 383 12 406 0 395 l 0 23 b 23 0 0 10 10 0 b 46 23 36 0 46 10 l 46 337 l 508 4 b 523 0 513 1 517 0 z',\n },\n brassJazzTurn: {\n x_min: 0,\n x_max: 620,\n y_min: 0,\n y_max: 245,\n ha: 245,\n o: 'm 792 190 b 765 176 780 179 772 176 b 740 190 755 176 747 183 b 629 325 727 202 644 312 b 593 347 616 338 605 347 b 562 334 583 346 575 344 b 528 298 549 323 539 310 l 406 176 b 389 168 406 176 399 168 b 374 176 384 168 379 170 b 245 325 360 192 245 325 b 200 353 232 343 219 351 b 168 340 190 353 181 350 l 17 156 b 0 121 10 147 0 132 b 16 107 0 114 4 108 b 84 143 26 107 76 137 b 118 160 92 150 108 160 b 141 143 125 160 131 154 b 265 10 147 135 253 24 b 294 0 271 3 282 0 b 321 7 305 0 315 3 b 498 160 321 7 478 158 b 521 143 505 160 513 154 b 647 10 528 135 635 24 b 675 0 652 3 664 0 b 703 7 687 0 697 3 b 874 186 713 16 855 164 b 893 220 881 196 893 212 b 873 245 890 235 883 243 b 796 194 847 245 815 213 z',\n },\n brassSmear: {\n x_min: 1,\n x_max: 306,\n y_min: 0,\n y_max: 170,\n ha: 170,\n o: 'm 193 79 b 308 0 219 50 264 0 b 439 117 396 0 438 102 b 439 120 439 118 439 118 l 441 125 b 441 128 441 127 441 127 b 433 141 441 135 439 141 b 416 130 429 141 423 137 b 343 94 390 107 370 94 b 269 153 315 94 294 121 l 265 158 b 144 245 239 190 180 245 b 6 134 62 245 10 143 b 1 114 3 125 1 118 b 7 107 1 108 4 107 b 36 122 13 107 22 112 b 92 151 55 137 65 151 b 183 89 125 151 161 112 b 189 84 184 88 187 86 z',\n },\n stringsDownBow: {\n x_min: 0,\n x_max: 312,\n y_min: 0,\n y_max: 318,\n ha: 318,\n o: 'm 37 458 b 0 420 17 458 0 441 l 0 17 b 17 0 0 7 9 0 l 37 0 b 55 17 46 0 55 7 l 55 253 b 225 278 55 269 140 278 b 395 253 310 278 395 269 l 395 17 b 413 0 395 7 403 0 l 432 0 b 449 17 441 0 449 7 l 449 420 b 412 458 449 441 432 458 z',\n },\n stringsUpBow: {\n x_min: 1,\n x_max: 249,\n y_min: 1,\n y_max: 495,\n ha: 494,\n o: 'm 181 1 b 206 22 193 1 203 10 l 359 683 l 359 688 b 338 713 359 700 351 710 l 333 713 b 308 694 321 713 311 706 l 180 140 l 53 694 b 27 713 49 706 39 713 l 22 713 b 1 690 10 710 1 700 b 3 683 1 687 1 685 l 154 22 b 181 1 157 10 167 1 z',\n },\n stringsHarmonic: {\n x_min: 0,\n x_max: 200,\n y_min: 0,\n y_max: 200,\n ha: 200,\n o: 'm 288 144 b 144 288 288 225 223 288 b 0 144 65 288 0 225 b 144 0 0 65 65 0 b 288 144 223 0 288 65 z m 144 249 b 249 144 203 249 249 203 b 144 39 249 86 203 39 b 39 144 86 39 39 86 b 144 249 39 203 86 249 z',\n },\n pluckedSnapPizzicatoAbove: {\n x_min: 0,\n x_max: 200,\n y_min: 0,\n y_max: 300,\n ha: 300,\n o: 'm 0 144 b 144 0 0 63 65 0 b 288 144 223 0 288 63 b 167 285 288 215 235 275 l 167 432 l 121 432 l 121 285 b 0 144 52 275 0 215 z m 121 246 l 121 144 l 167 144 l 167 246 b 249 144 213 236 249 193 b 144 39 249 85 202 39 b 39 144 85 39 39 85 b 121 246 39 193 73 236 z',\n },\n pluckedSnapPizzicatoBelow: {\n x_min: 0,\n x_max: 200,\n y_min: 0,\n y_max: 300,\n ha: 300,\n o: 'm 288 288 b 144 432 288 369 223 432 b 0 288 65 432 0 369 b 121 145 0 216 52 157 l 121 0 l 167 0 l 167 145 b 288 288 235 157 288 216 z m 167 186 l 167 288 l 121 288 l 121 186 b 39 288 75 196 39 238 b 144 393 39 347 86 393 b 249 288 203 393 249 347 b 167 186 249 238 215 196 z',\n },\n pluckedLeftHandPizzicato: {\n x_min: 0,\n x_max: 272,\n y_min: 0,\n y_max: 272,\n ha: 272,\n o: 'm 392 219 l 219 219 l 219 392 l 173 392 l 173 219 l 0 219 l 0 173 l 173 173 l 173 0 l 219 0 l 219 173 l 392 173 z',\n },\n keyboardPedalPed: {\n x_min: 0,\n x_max: 1019,\n y_min: -8,\n y_max: 555,\n ha: 563,\n o: 'm 413 799 b 179 749 327 798 261 789 b 0 517 107 713 0 632 b 122 376 0 454 37 376 b 240 540 189 376 240 452 b 225 586 240 579 233 586 b 204 549 213 586 212 573 b 138 480 199 527 181 480 b 85 549 96 480 85 517 l 85 554 b 353 762 89 690 230 762 b 373 752 364 762 373 760 b 351 708 373 740 360 723 b 274 546 330 675 274 585 b 353 416 274 508 333 444 b 412 304 372 390 412 351 b 382 228 412 275 403 256 b 334 190 363 202 361 200 b 147 29 271 167 147 88 b 196 -12 147 4 171 -12 b 343 108 239 -12 279 33 l 363 132 b 387 150 370 141 376 150 b 543 -4 445 150 467 -4 b 631 42 567 -4 586 0 l 668 78 b 685 89 674 84 680 89 b 696 75 688 89 690 86 b 809 -9 717 29 753 -9 b 946 66 854 -9 894 13 b 988 107 971 92 981 107 b 1002 89 994 107 996 99 b 1152 -4 1030 36 1077 -4 b 1329 248 1238 -4 1329 82 b 792 717 1329 556 1047 665 b 766 720 785 719 775 720 b 747 703 752 720 747 711 b 780 680 747 693 756 685 b 1223 222 1028 621 1223 504 b 1152 39 1223 122 1205 39 b 1073 229 1104 39 1073 132 b 1132 423 1073 314 1086 377 b 1142 442 1140 432 1142 436 b 1126 458 1142 451 1136 458 b 1093 446 1119 458 1109 455 b 975 216 1022 408 975 337 l 975 190 b 943 121 975 160 972 150 b 852 69 899 76 877 69 b 776 148 816 69 786 117 b 773 163 775 154 773 158 b 786 177 773 167 776 170 l 801 187 b 937 366 867 235 937 284 b 844 454 937 422 900 454 b 665 217 711 454 665 331 b 671 153 665 197 667 176 l 671 147 b 662 134 671 143 670 140 b 605 111 639 118 625 111 b 521 160 572 111 546 135 b 451 203 497 184 474 197 b 426 212 435 207 426 206 b 436 230 426 216 429 220 b 510 389 464 269 510 340 b 429 521 510 435 480 462 b 369 629 387 570 369 599 b 402 720 369 648 384 691 b 462 763 425 759 446 763 b 611 624 540 763 611 704 b 564 575 611 592 590 575 b 501 602 540 575 520 582 b 474 622 492 611 487 622 b 459 603 465 622 459 615 b 603 471 459 570 510 471 b 711 588 670 471 711 524 b 422 799 711 742 554 799 z m 815 403 b 848 343 838 403 848 383 b 780 226 848 295 824 261 b 765 217 773 220 768 217 b 759 228 762 217 759 220 b 756 282 757 245 756 262 b 815 403 756 346 772 403 z m 1405 124 b 1344 62 1369 124 1344 98 b 1405 0 1344 26 1369 0 b 1467 62 1441 0 1467 26 b 1405 124 1467 98 1441 124 z',\n },\n keyboardPedalUp: {\n x_min: 0,\n x_max: 450,\n y_min: 0,\n y_max: 450,\n ha: 450,\n o: 'm 582 396 b 516 367 554 396 533 384 b 465 340 495 347 487 340 l 458 340 b 412 377 432 340 412 348 b 432 409 412 387 419 396 l 438 415 b 490 429 451 428 464 429 b 575 501 534 429 575 452 b 501 575 575 541 541 575 b 429 490 452 575 429 534 b 415 438 429 464 428 451 l 409 432 b 377 412 396 419 387 412 b 340 458 348 412 340 432 l 340 465 b 367 516 340 487 347 495 b 396 582 384 533 396 554 b 324 648 396 625 363 648 b 252 582 285 648 252 625 b 281 516 252 554 264 533 b 308 465 301 495 308 487 l 308 458 b 271 412 308 432 300 412 b 239 432 261 412 252 419 l 233 438 b 219 490 220 451 219 464 b 147 575 219 534 196 575 b 73 501 107 575 73 541 b 158 429 73 452 114 429 b 210 415 184 429 197 428 l 216 409 b 236 377 229 396 236 387 b 190 340 236 348 216 340 l 183 340 b 132 367 161 340 153 347 b 66 396 115 384 94 396 b 0 324 23 396 0 363 b 66 252 0 285 23 252 b 132 281 94 252 115 264 b 183 308 153 301 161 308 l 190 308 b 236 271 216 308 236 300 b 216 239 236 261 229 252 l 210 233 b 158 219 197 220 184 219 b 73 147 114 219 73 196 b 147 73 73 107 107 73 b 219 158 196 73 219 114 b 233 210 219 184 220 197 l 239 216 b 271 236 252 229 261 236 b 308 190 300 236 308 216 l 308 183 b 281 132 308 161 301 153 b 252 66 264 115 252 94 b 324 0 252 23 285 0 b 396 66 363 0 396 23 b 367 132 396 94 384 115 b 340 183 347 153 340 161 l 340 190 b 377 236 340 216 348 236 b 409 216 387 236 396 229 l 415 210 b 429 158 428 197 429 184 b 501 73 429 114 452 73 b 575 147 541 73 575 107 b 490 219 575 196 534 219 b 438 233 464 219 451 220 l 432 239 b 412 271 419 252 412 261 b 458 308 412 300 432 308 l 465 308 b 516 281 487 308 495 301 b 582 252 533 264 554 252 b 648 324 625 252 648 285 b 582 396 648 363 625 396 z m 324 271 b 271 324 291 271 271 291 b 324 377 271 357 291 377 b 377 324 357 377 377 357 b 324 271 377 291 357 271 z',\n },\n pictChokeCymbal: {\n x_min: 1,\n x_max: 152,\n y_min: 2,\n y_max: 251,\n ha: 249,\n o: 'm 104 361 b 1 271 42 361 1 321 b 82 190 1 222 35 190 b 122 160 118 190 122 160 b 125 144 124 154 125 150 b 102 88 125 124 115 105 b 37 32 78 56 40 35 b 26 17 32 29 26 26 l 27 16 b 37 3 29 6 33 3 b 181 102 85 3 158 66 b 219 239 210 147 219 197 l 219 249 b 104 361 219 317 170 361 z',\n },\n wiggleArpeggiatoUp: {\n x_min: -33,\n x_max: 292,\n y_min: 0,\n y_max: 119,\n ha: 119,\n o: 'm 130 171 b -39 68 16 171 -14 91 b -48 53 -45 62 -48 58 b -29 42 -48 46 -39 42 b -10 46 -23 42 -16 43 b 56 63 12 56 29 63 b 248 0 121 63 135 0 b 419 127 361 0 410 104 b 420 132 420 130 420 131 b 412 140 420 137 416 140 b 386 130 403 140 392 134 b 334 107 367 117 353 107 b 318 108 330 107 324 107 b 240 138 289 112 265 128 b 130 171 209 153 168 171 z',\n },\n arrowheadBlackUp: {\n x_min: 0,\n x_max: 228,\n y_min: 0,\n y_max: 299,\n ha: 299,\n o: 'm 166 431 b 0 20 111 274 0 30 b 16 0 0 12 6 0 l 17 1 b 166 50 43 16 160 50 b 310 1 171 50 289 13 l 311 0 b 328 20 321 0 328 12 b 166 431 328 30 220 274 z',\n },\n arrowheadBlackDown: {\n x_min: 0,\n x_max: 228,\n y_min: 0,\n y_max: 299,\n ha: 299,\n o: 'm 166 0 b 328 410 220 157 328 400 b 311 431 328 419 321 431 l 310 429 b 166 380 289 418 171 380 b 17 429 160 380 43 415 l 16 431 b 0 410 6 431 0 419 b 166 0 0 400 111 157 z',\n },\n arpeggiatoUp: {\n x_min: 1,\n x_max: 229,\n y_min: 7,\n y_max: 1511,\n ha: 1504,\n o: 'm 219 1848 l 330 1848 l 164 2176 l 1 1848 l 121 1848 b 92 1778 115 1822 101 1800 l 89 1773 b 59 1668 75 1741 59 1702 b 96 1555 59 1614 76 1580 b 99 1551 98 1554 99 1551 l 102 1547 b 124 1496 115 1531 124 1515 b 122 1482 124 1492 124 1488 b 92 1404 118 1453 102 1428 b 59 1293 78 1372 59 1332 b 105 1172 59 1234 81 1198 b 124 1120 118 1155 124 1143 l 122 1113 b 122 1110 122 1113 122 1112 b 92 1032 118 1081 102 1057 b 59 922 78 1001 59 960 b 115 792 59 855 86 816 b 124 760 121 782 124 773 b 122 744 124 756 124 750 b 92 667 118 716 102 693 b 59 556 78 635 59 595 b 108 433 59 495 82 458 b 124 389 117 420 124 408 b 122 374 124 384 124 379 b 92 298 118 346 102 323 l 89 292 b 59 186 75 261 59 222 b 163 19 59 73 140 42 b 177 10 168 13 173 10 b 189 29 184 10 189 19 b 184 48 189 35 187 42 b 167 114 174 69 167 85 b 230 305 167 179 229 193 b 181 423 230 357 209 396 b 167 484 173 442 167 458 b 230 675 167 547 229 563 b 179 796 230 729 206 769 b 167 850 171 812 167 827 b 230 1040 167 913 229 929 b 183 1158 230 1092 209 1130 b 167 1220 173 1178 167 1194 b 230 1411 167 1284 229 1300 b 186 1526 230 1462 210 1499 b 167 1594 176 1529 167 1584 b 230 1786 167 1659 229 1673 b 219 1848 230 1809 226 1829 z',\n },\n arpeggiatoDown: {\n x_min: 1,\n x_max: 229,\n y_min: -4,\n y_max: 1500,\n ha: 1504,\n o: 'm 219 323 b 230 384 226 341 230 361 b 167 576 229 497 167 511 b 186 644 167 586 176 641 b 230 759 210 671 230 708 b 167 950 229 870 167 886 b 183 1012 167 976 173 992 b 230 1130 209 1040 230 1079 b 167 1320 229 1241 167 1257 b 179 1374 167 1344 171 1358 b 230 1495 206 1401 230 1441 b 167 1686 229 1607 167 1623 b 181 1747 167 1712 173 1728 b 230 1865 209 1774 230 1813 b 167 2056 229 1977 167 1992 b 184 2123 167 2085 174 2101 b 189 2141 187 2128 189 2136 b 177 2160 189 2151 184 2160 b 163 2151 173 2160 168 2157 b 59 1984 140 2128 59 2097 b 89 1878 59 1948 75 1909 l 92 1872 b 122 1796 102 1848 118 1824 b 124 1781 124 1791 124 1786 b 108 1737 124 1763 117 1750 b 59 1614 82 1712 59 1675 b 92 1503 59 1575 78 1535 b 122 1426 102 1477 118 1454 b 124 1410 124 1420 124 1414 b 115 1378 124 1397 121 1388 b 59 1248 86 1354 59 1315 b 92 1138 59 1210 78 1169 b 122 1060 102 1113 118 1089 b 122 1057 122 1058 122 1058 l 124 1050 b 105 998 124 1027 118 1015 b 59 877 81 972 59 936 b 92 766 59 838 78 798 b 122 688 102 742 118 717 b 124 674 124 683 124 678 b 102 624 124 655 115 639 l 99 619 b 96 615 99 619 98 616 b 59 503 76 590 59 556 b 89 397 59 468 75 429 l 92 392 b 121 323 101 370 115 348 l 1 323 l 164 -6 l 330 323 z',\n },\n repeat1Bar: {\n x_min: 0,\n x_max: 532,\n y_min: -250,\n y_max: 279,\n ha: 529,\n o: 'm 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z m 89 288 b 0 197 40 288 0 248 b 89 108 0 148 40 108 b 180 197 140 108 180 148 b 89 288 180 248 140 288 z m 675 -71 b 586 -161 626 -71 586 -111 b 675 -251 586 -210 626 -251 b 766 -161 726 -251 766 -210 b 675 -71 766 -111 726 -71 z',\n },\n repeat2Bars: {\n x_min: 0,\n x_max: 762,\n y_min: -250,\n y_max: 279,\n ha: 529,\n o: 'm 1090 380 b 1097 395 1094 386 1097 390 b 1089 402 1097 399 1094 402 l 936 402 b 910 380 927 402 920 393 l 336 -340 b 331 -350 333 -343 331 -347 b 343 -360 331 -356 336 -360 l 485 -360 b 516 -340 498 -360 508 -348 z m 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z m 89 288 b 0 197 40 288 0 248 b 89 108 0 148 40 108 b 180 197 140 108 180 148 b 89 288 180 248 140 288 z m 1007 -71 b 917 -161 958 -71 917 -111 b 1007 -251 917 -210 958 -251 b 1097 -161 1057 -251 1097 -210 b 1007 -71 1097 -111 1057 -71 z',\n },\n repeat4Bars: {\n x_min: 0,\n x_max: 1232,\n y_min: -250,\n y_max: 279,\n ha: 529,\n o: 'm 1767 380 b 1774 395 1771 386 1774 390 b 1765 402 1774 399 1771 402 l 1613 402 b 1587 380 1604 402 1597 393 l 1012 -340 b 1008 -350 1009 -343 1008 -347 b 1020 -360 1008 -356 1012 -360 l 1162 -360 b 1192 -340 1175 -360 1185 -348 z m 1436 380 b 1443 395 1440 386 1443 390 b 1434 402 1443 399 1440 402 l 1282 402 b 1256 380 1273 402 1266 393 l 681 -340 b 677 -350 678 -343 677 -347 b 688 -360 677 -356 681 -360 l 831 -360 b 861 -340 844 -360 854 -348 z m 1090 380 b 1097 395 1094 386 1097 390 b 1089 402 1097 399 1094 402 l 936 402 b 910 380 927 402 920 393 l 336 -340 b 331 -350 333 -343 331 -347 b 343 -360 331 -356 336 -360 l 485 -360 b 516 -340 498 -360 508 -348 z m 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z m 89 288 b 0 197 40 288 0 248 b 89 108 0 148 40 108 b 180 197 140 108 180 148 b 89 288 180 248 140 288 z m 1683 -71 b 1594 -161 1634 -71 1594 -111 b 1683 -251 1594 -210 1634 -251 b 1774 -161 1734 -251 1774 -210 b 1683 -71 1774 -111 1734 -71 z',\n },\n repeatBarSlash: {\n x_min: 0,\n x_max: 532,\n y_min: -250,\n y_max: 279,\n ha: 529,\n o: 'm 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z',\n },\n csymDiminished: {\n x_min: 0,\n x_max: 473,\n y_min: 0,\n y_max: 473,\n ha: 473,\n o: 'm 341 681 b 0 341 153 681 0 530 b 341 0 0 153 153 0 b 681 341 530 0 681 153 b 341 681 681 530 530 681 z m 341 618 b 618 341 495 618 618 495 b 341 63 618 189 494 63 b 63 341 187 63 63 187 b 341 618 63 494 189 618 z',\n },\n csymHalfDiminished: {\n x_min: -16,\n x_max: 488,\n y_min: -15,\n y_max: 489,\n ha: 504,\n o: 'm 703 660 l 658 704 l 557 603 b 340 681 498 652 422 681 b -1 341 151 681 -1 530 b 78 124 -1 259 29 183 l -23 23 l 22 -22 l 122 79 b 340 0 181 30 258 0 b 680 341 528 0 680 153 b 602 559 680 423 651 500 z m 62 341 b 340 618 62 494 187 618 b 513 559 403 618 464 598 l 122 168 b 62 341 84 217 62 278 z m 616 341 b 340 63 616 189 492 63 b 167 124 276 63 216 85 l 557 514 b 616 341 596 465 616 405 z',\n },\n csymAugmented: {\n x_min: 0,\n x_max: 395,\n y_min: 1,\n y_max: 396,\n ha: 395,\n o: 'm 569 318 l 317 318 l 317 570 l 253 570 l 253 318 l 0 318 l 0 255 l 253 255 l 253 1 l 317 1 l 317 255 l 569 255 z',\n },\n csymMajorSeventh: {\n x_min: 0,\n x_max: 558,\n y_min: 1,\n y_max: 477,\n ha: 476,\n o: 'm 402 687 l 0 1 l 804 1 z m 402 562 l 693 65 l 111 65 z',\n },\n csymMinor: {\n x_min: 0,\n x_max: 325,\n y_min: 216,\n y_max: 260,\n ha: 44,\n o: 'm 468 374 l 0 374 l 0 311 l 468 311 z',\n },\n csymParensLeftTall: {\n x_min: 1,\n x_max: 185,\n y_min: 0,\n y_max: 997,\n ha: 997,\n o: 'm 266 48 b 261 65 266 55 264 62 b 92 719 157 212 92 400 b 262 1371 92 1037 154 1228 b 266 1394 266 1378 266 1394 l 266 1424 b 264 1436 266 1431 266 1436 b 259 1434 262 1436 259 1434 b 1 719 84 1261 1 1011 b 259 1 1 429 79 177 b 264 0 261 0 262 0 b 266 9 265 0 266 6 z',\n },\n csymParensRightTall: {\n x_min: -20,\n x_max: 164,\n y_min: 0,\n y_max: 997,\n ha: 997,\n o: 'm -29 9 b -26 0 -29 6 -27 0 b -22 1 -24 0 -23 0 b 236 719 158 177 236 429 b -22 1434 236 1011 154 1261 b -26 1436 -22 1434 -24 1436 b -29 1424 -29 1436 -29 1431 l -29 1394 b -24 1371 -29 1394 -29 1378 b 145 719 84 1228 145 1037 b -23 65 145 400 81 212 b -29 48 -26 62 -29 55 z',\n },\n csymBracketLeftTall: {\n x_min: 0,\n x_max: 155,\n y_min: 0,\n y_max: 1000,\n ha: 1000,\n o: 'm 217 0 b 223 9 220 0 223 4 l 223 37 b 217 46 223 42 220 46 l 92 46 l 92 1394 l 217 1394 b 223 1403 220 1394 223 1398 l 223 1431 b 217 1440 223 1436 220 1440 l 6 1440 b 0 1436 3 1440 0 1439 l 0 4 b 6 0 0 1 3 0 z',\n },\n csymBracketRightTall: {\n x_min: 1,\n x_max: 156,\n y_min: 0,\n y_max: 1000,\n ha: 1000,\n o: 'm 219 0 b 225 4 222 0 225 1 l 225 1436 b 219 1440 225 1439 222 1440 l 7 1440 b 1 1431 4 1440 1 1436 l 1 1403 b 7 1394 1 1398 4 1394 l 132 1394 l 132 46 l 7 46 b 1 37 4 46 1 42 l 1 9 b 7 0 1 4 4 0 z',\n },\n csymParensLeftVeryTall: {\n x_min: 0,\n x_max: 122,\n y_min: 0,\n y_max: 993,\n ha: 993,\n o: 'm 176 32 b 171 49 176 39 174 46 b 60 716 104 194 60 399 b 173 1382 60 1032 101 1241 b 176 1405 176 1390 176 1405 l 176 1427 b 173 1430 176 1428 174 1430 b 0 716 40 1297 0 978 b 170 3 0 428 50 179 b 171 0 170 1 170 0 b 176 6 173 0 176 4 z',\n },\n csymParensRightVeryTall: {\n x_min: -15,\n x_max: 107,\n y_min: 0,\n y_max: 993,\n ha: 993,\n o: 'm -22 6 b -17 0 -22 4 -19 0 b -16 3 -16 0 -16 1 b 154 716 104 179 154 428 b -19 1430 154 978 114 1297 b -22 1427 -20 1430 -22 1428 l -22 1405 b -19 1382 -22 1405 -22 1390 b 94 716 53 1241 94 1032 b -17 49 94 399 50 194 b -22 32 -20 46 -22 39 z',\n },\n csymDiagonalArrangementSlash: {\n x_min: 0,\n x_max: 999,\n y_min: 0,\n y_max: 1000,\n ha: 1000,\n o: 'm 1439 1380 l 1377 1440 l 0 60 l 62 0 z',\n },\n accSagittal5v7KleismaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -35 b 135 -112 68 -86 99 -112 b 225 68 194 -112 225 -53 l 180 68 b 144 -4 180 20 168 -4 b 122 0 138 -4 131 -3 b 23 248 86 14 52 96 l 0 248 z',\n },\n accSagittal5v7KleismaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 b 122 0 52 -96 86 -14 b 144 4 131 3 138 4 b 180 -68 168 4 180 -20 l 225 -68 b 135 112 225 53 194 112 b 45 35 99 112 68 86 l 45 517 l 0 517 z',\n },\n accSagittal5CommaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 225 -517 l 225 248 l 203 248 l 0 -112 l 0 -284 l 180 33 l 180 -517 z',\n },\n accSagittal5CommaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 180 517 l 180 -33 l 0 284 l 0 112 l 203 -248 l 225 -248 l 225 517 z',\n },\n accSagittal7CommaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 248 l 0 -517 l 45 -517 l 45 112 l 89 112 b 180 -68 150 112 180 53 l 180 -248 l 225 -248 l 225 68 b 135 248 225 187 194 248 z',\n },\n accSagittal7CommaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 135 -248 b 225 -68 194 -248 225 -187 l 225 248 l 180 248 l 180 68 b 89 -112 180 -53 150 -112 l 45 -112 l 45 517 l 0 517 l 0 -248 z',\n },\n accSagittal25SmallDiesisUp: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -157 l 0 -259 l 315 -89 l 315 -517 l 360 -517 l 360 248 l 337 248 l 0 68 l 0 -33 l 315 135 l 315 10 z',\n },\n accSagittal25SmallDiesisDown: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 315 -10 l 315 -135 l 0 33 l 0 -68 l 337 -248 l 360 -248 l 360 517 l 315 517 l 315 89 l 0 259 l 0 157 z',\n },\n accSagittal35MediumDiesisUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -284 l 180 33 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -68 330 112 360 53 l 360 -248 l 405 -248 l 405 68 b 315 248 405 187 374 248 l 203 248 l 0 -112 z',\n },\n accSagittal35MediumDiesisDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 203 -248 l 315 -248 b 405 -68 374 -248 405 -187 l 405 248 l 360 248 l 360 68 b 271 -112 360 -53 330 -112 l 225 -112 l 225 517 l 180 517 l 180 -33 l 0 284 z',\n },\n accSagittal11MediumDiesisUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 225 53 l 225 -517 l 271 -517 l 271 53 l 495 -248 l 495 -89 l 248 248 l 0 -89 l 0 -248 z',\n },\n accSagittal11MediumDiesisDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 248 l 0 89 l 248 -248 l 495 89 l 495 248 l 271 -53 l 271 517 l 225 517 l 225 -53 z',\n },\n accSagittal11LargeDiesisUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 112 l 315 112 b 449 -68 405 112 449 53 l 449 -248 l 495 -248 l 495 68 b 360 248 495 187 449 248 l 135 248 b 0 68 45 248 0 187 z',\n },\n accSagittal11LargeDiesisDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 360 -248 b 495 -68 449 -248 495 -187 l 495 248 l 449 248 l 449 68 b 315 -112 449 -53 405 -112 l 271 -112 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittal35LargeDiesisUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 248 -248 l 540 112 l 540 274 l 271 -58 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittal35LargeDiesisDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 248 -248 l 540 112 l 540 274 l 269 -58 l 269 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittalSharp25SDown: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 112 -112 0 -53 36 -112 l 135 -112 l 135 -517 l 180 -517 l 180 -89 b 248 26 206 -65 229 -27 b 315 -89 264 -27 287 -65 l 315 -517 l 360 -517 l 360 -112 l 383 -112 b 495 68 458 -112 495 -53 l 449 68 b 399 -4 449 20 433 -4 b 248 248 297 -4 261 171 b 122 0 216 96 176 14 b 94 -4 112 -3 102 -4 b 45 68 60 -4 45 20 z',\n },\n accSagittalFlat25SUp: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 94 4 45 -20 60 4 b 122 0 102 4 112 3 b 248 -248 176 -14 216 -96 b 399 4 261 -171 297 4 b 449 -68 433 4 449 -20 l 495 -68 b 383 112 495 53 458 112 l 360 112 l 360 517 l 315 517 l 315 89 b 248 -26 287 65 264 27 b 180 89 229 27 206 65 l 180 517 l 135 517 l 135 112 l 112 112 b 0 -68 36 112 0 53 z',\n },\n accSagittalSharp7CDown: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 112 l 89 112 b 180 104 124 112 154 109 l 180 -517 l 225 -517 l 225 89 b 315 -68 285 60 315 9 l 315 -248 l 360 -248 l 360 68 b 135 248 360 187 285 248 l 0 248 z',\n },\n accSagittalFlat7CUp: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 135 -248 b 360 -68 285 -248 360 -187 l 360 248 l 315 248 l 315 68 b 225 -89 315 -9 285 -60 l 225 517 l 180 517 l 180 -104 b 89 -112 154 -109 124 -112 l 45 -112 l 45 517 l 0 517 z',\n },\n accSagittalSharp5CDown: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -517 l 45 71 l 180 -56 l 180 -517 l 225 -517 l 225 -98 l 405 -268 l 405 -112 l 23 248 l 0 248 l 0 -517 z',\n },\n accSagittalFlat5CUp: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 517 l 0 -248 l 23 -248 l 405 112 l 405 268 l 225 98 l 225 517 l 180 517 l 180 56 l 45 -71 l 45 517 z',\n },\n accSagittalSharp5v7kDown: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -276 l 135 -82 l 135 -517 l 180 -517 l 180 -17 l 271 112 l 315 112 l 315 -517 l 360 -517 l 360 107 b 449 -68 420 89 449 30 l 449 -248 l 495 -248 l 495 68 b 360 248 495 189 449 248 l 248 248 z',\n },\n accSagittalFlat5v7kUp: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 248 -248 l 360 -248 b 495 -68 449 -248 495 -189 l 495 248 l 449 248 l 449 68 b 360 -107 449 -30 420 -89 l 360 517 l 315 517 l 315 -112 l 271 -112 l 180 17 l 180 517 l 135 517 l 135 82 l 0 276 l 0 112 z',\n },\n accSagittalSharp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 180 -53 l 180 -517 l 225 -517 l 225 0 l 292 85 l 360 0 l 360 -517 l 405 -517 l 405 -53 l 585 -274 l 585 -112 l 292 248 l 0 -112 l 0 -274 z',\n },\n accSagittalFlat: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 274 l 0 112 l 292 -248 l 585 112 l 585 274 l 405 53 l 405 517 l 360 517 l 360 0 l 292 -85 l 225 0 l 225 517 l 180 517 l 180 53 z',\n },\n accSagittalSharp5v7kUp: {\n x_min: 0,\n x_max: 312,\n y_min: -361,\n y_max: 172,\n ha: 533,\n o: 'm 45 -517 l 45 -10 b 135 -92 68 -48 98 -75 l 135 -520 l 180 -520 l 180 -108 b 248 -115 203 -112 225 -115 b 271 -112 256 -115 264 -115 l 271 -517 l 315 -517 l 315 -107 b 449 68 405 -89 449 -30 l 405 68 b 297 -4 405 19 369 -4 b 23 248 131 -4 56 85 l 0 248 l 0 -517 z',\n },\n accSagittalFlat5v7kDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 361,\n ha: 533,\n o: 'm 0 517 l 0 -248 l 23 -248 b 297 4 56 -85 131 4 b 405 -68 369 4 405 -19 l 449 -68 b 315 107 449 30 405 89 l 315 517 l 271 517 l 271 112 b 248 115 264 115 256 115 b 180 108 225 115 203 112 l 180 520 l 135 520 l 135 92 b 45 10 98 75 68 48 l 45 517 z',\n },\n accSagittalSharp5CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -266 l 135 -153 l 135 -517 l 180 -517 l 180 -115 l 271 -39 l 271 -517 l 315 -517 l 315 0 l 405 75 l 405 -517 l 449 -517 l 449 248 l 428 248 l 0 -112 z',\n },\n accSagittalFlat5CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 428 -248 l 449 -248 l 449 517 l 405 517 l 405 -75 l 315 0 l 315 517 l 271 517 l 271 39 l 180 115 l 180 517 l 135 517 l 135 153 l 0 266 z',\n },\n accSagittalSharp7CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 112 l 135 112 l 135 -517 l 180 -517 l 180 108 b 271 89 213 105 243 99 l 271 -517 l 315 -517 l 315 73 b 405 -68 374 45 405 -3 l 405 -248 l 449 -248 l 449 68 b 135 248 449 187 346 248 l 0 248 z',\n },\n accSagittalFlat7CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 135 -248 b 449 -68 346 -248 449 -187 l 449 248 l 405 248 l 405 68 b 315 -73 405 3 374 -45 l 315 517 l 271 517 l 271 -89 b 180 -108 243 -99 213 -105 l 180 517 l 135 517 l 135 -112 l 45 -112 l 45 517 l 0 517 z',\n },\n accSagittalSharp25SUp: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -30 l 495 143 l 495 14 l 0 -157 l 0 -255 l 225 -177 l 225 -517 l 271 -517 l 271 -161 l 360 -130 l 360 -517 l 405 -517 l 405 -115 l 495 -84 l 495 -517 l 540 -517 l 540 248 l 517 248 l 0 68 z',\n },\n accSagittalFlat25SDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 l 517 -248 l 540 -248 l 540 517 l 495 517 l 495 84 l 405 115 l 405 517 l 360 517 l 360 130 l 271 161 l 271 517 l 225 517 l 225 177 l 0 255 l 0 157 l 495 -14 l 495 -143 l 0 30 z',\n },\n accSagittalSharp35MUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -274 l 135 -108 l 135 -517 l 180 -517 l 180 -53 l 271 58 l 271 -517 l 315 -517 l 315 112 l 360 112 b 405 109 376 112 390 112 l 405 -517 l 449 -517 l 449 96 b 540 -68 510 72 540 17 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 z',\n },\n accSagittalFlat35MDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 292 -248 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 449 -96 540 -17 510 -72 l 449 517 l 405 517 l 405 -109 b 360 -112 390 -112 376 -112 l 315 -112 l 315 517 l 271 517 l 271 -58 l 180 53 l 180 517 l 135 517 l 135 108 l 0 274 l 0 112 z',\n },\n accSagittalSharp11MUp: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -271 l 180 -79 l 180 -517 l 225 -517 l 225 -30 l 315 65 l 315 -517 l 360 -517 l 360 65 l 449 -30 l 449 -517 l 495 -517 l 495 -79 l 675 -271 l 675 -112 l 337 248 z',\n },\n accSagittalFlat11MDown: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 337 -248 l 675 112 l 675 271 l 495 79 l 495 517 l 449 517 l 449 30 l 360 -65 l 360 517 l 315 517 l 315 -65 l 225 30 l 225 517 l 180 517 l 180 79 l 0 271 l 0 112 z',\n },\n accSagittalSharp11LUp: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 112 l 449 112 l 449 -517 l 495 -517 l 495 104 b 631 -68 585 82 631 26 l 631 -248 l 675 -248 l 675 68 b 449 248 675 187 600 248 l 225 248 b 0 68 75 248 0 187 z',\n },\n accSagittalFlat11LDown: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 449 -248 b 675 -68 600 -248 675 -187 l 675 248 l 631 248 l 631 68 b 495 -104 631 -26 585 -82 l 495 517 l 449 517 l 449 -112 l 360 -112 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z',\n },\n accSagittalSharp35LUp: {\n x_min: 0,\n x_max: 500,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 71 l 452 -17 l 452 -517 l 495 -517 l 495 -56 l 720 -268 l 720 -112 l 337 248 l 225 248 b 0 68 75 248 0 187 z',\n },\n accSagittalFlat35LDown: {\n x_min: 0,\n x_max: 500,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 337 -248 l 720 112 l 720 268 l 495 56 l 495 517 l 452 517 l 452 17 l 360 -71 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z',\n },\n accSagittalDoubleSharp25SDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 135 -112 0 -53 45 -112 b 243 -62 180 -112 215 -95 l 89 -503 l 143 -517 l 292 -82 l 445 -517 l 495 -503 l 343 -62 b 449 -112 372 -95 408 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 315 148 b 112 -4 274 148 236 -4 b 45 68 68 -4 45 20 z',\n },\n accSagittalDoubleFlat25SUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 112 4 45 -20 68 4 b 292 -248 236 4 274 -148 b 475 4 315 -148 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 b 343 62 408 112 372 95 l 495 503 l 445 517 l 292 82 l 143 517 l 89 503 l 243 62 b 135 112 215 95 180 112 b 0 -68 45 112 0 53 z',\n },\n accSagittalDoubleSharp7CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -503 l 52 -517 l 203 -82 l 354 -517 l 405 -503 l 230 0 l 271 108 b 495 -68 420 92 495 35 l 495 -248 l 540 -248 l 540 68 b 225 248 540 187 435 248 l 89 248 l 89 112 l 135 112 l 174 0 z m 213 112 l 203 82 l 192 112 z',\n },\n accSagittalDoubleFlat7CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 174 0 l 135 -112 l 89 -112 l 89 -248 l 225 -248 b 540 -68 435 -248 540 -187 l 540 248 l 495 248 l 495 68 b 271 -108 495 -35 420 -92 l 230 0 l 405 503 l 354 517 l 203 82 l 52 517 l 0 503 z m 192 -112 l 203 -82 l 213 -112 z',\n },\n accSagittalDoubleSharp5CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 405 -503 l 230 0 l 232 4 l 585 -264 l 585 -112 l 112 248 l 89 248 l 89 112 l 151 68 l 174 0 l 0 -503 l 52 -517 l 203 -82 l 354 -517 z',\n },\n accSagittalDoubleFlat5CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 354 517 l 203 82 l 52 517 l 0 503 l 174 0 l 151 -68 l 89 -112 l 89 -248 l 112 -248 l 585 112 l 585 264 l 232 -4 l 230 0 l 405 503 z',\n },\n accSagittalDoubleSharp5v7kDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -274 l 252 35 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 360 112 b 540 -68 480 112 540 53 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 l 0 -112 z',\n },\n accSagittalDoubleFlat5v7kUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 292 -248 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 360 -112 540 -53 480 -112 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 252 -35 l 0 274 z',\n },\n accSagittalDoubleSharp: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 540 -503 l 366 0 l 380 45 l 675 -271 l 675 -112 l 337 248 l 0 -112 l 0 -271 l 295 45 l 310 0 l 135 -503 l 186 -517 l 337 -82 l 488 -517 z',\n },\n accSagittalDoubleFlat: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 488 517 l 337 82 l 186 517 l 135 503 l 310 0 l 295 -45 l 0 271 l 0 112 l 337 -248 l 675 112 l 675 271 l 380 -45 l 366 0 l 540 503 z',\n },\n accSagittal7v11KleismaUp: {\n x_min: 0,\n x_max: 219,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 68 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 -45 b 248 -112 200 -89 225 -112 b 315 68 292 -112 315 -53 l 271 68 b 248 -4 271 20 264 -4 b 236 0 245 -4 240 -3 b 157 248 213 14 187 96 b 78 0 127 96 101 14 b 65 -4 73 -3 68 -4 b 45 68 50 -4 45 20 l 0 68 b 68 -112 0 -53 23 -112 z',\n },\n accSagittal7v11KleismaDown: {\n x_min: 0,\n x_max: 219,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 68 112 b 0 -68 23 112 0 53 l 45 -68 b 65 4 45 -20 50 4 b 78 0 68 4 73 3 b 157 -248 101 -14 127 -96 b 236 0 187 -96 213 -14 b 248 4 240 3 245 4 b 271 -68 264 4 271 -20 l 315 -68 b 248 112 315 53 292 112 b 180 45 225 112 200 89 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 z',\n },\n accSagittal17CommaUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 -40 b 315 -118 248 -92 279 -118 b 405 62 374 -118 405 -59 l 360 62 b 324 -10 360 14 348 -10 b 302 -6 318 -10 311 -9 b 206 217 268 9 235 84 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z',\n },\n accSagittal17CommaDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 206 -217 b 302 6 235 -84 268 -9 b 324 10 311 9 318 10 b 360 -62 348 10 360 -14 l 405 -62 b 315 118 405 59 374 118 b 225 40 279 118 248 92 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z',\n },\n accSagittal55CommaUp: {\n x_min: 0,\n x_max: 219,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 248 l 0 -517 l 45 -517 l 45 58 l 315 -274 l 315 -112 l 23 248 z',\n },\n accSagittal55CommaDown: {\n x_min: 0,\n x_max: 219,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 23 -248 l 315 112 l 315 274 l 45 -58 l 45 517 l 0 517 l 0 -248 z',\n },\n accSagittal7v11CommaUp: {\n x_min: 0,\n x_max: 188,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 248 l 135 248 b 0 68 45 248 0 187 z',\n },\n accSagittal7v11CommaDown: {\n x_min: 0,\n x_max: 188,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 271 -248 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittal5v11SmallDiesisUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 73 l 0 -248 l 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 -40 b 360 -118 295 -92 325 -118 b 449 62 420 -118 449 -59 l 405 62 b 369 -10 405 14 393 -10 b 348 -6 363 -10 356 -9 b 251 217 312 9 279 84 l 248 248 l 135 248 b 0 73 45 248 0 189 z',\n },\n accSagittal5v11SmallDiesisDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -73 b 135 -248 0 -189 45 -248 l 248 -248 l 251 -217 b 348 6 279 -84 312 -9 b 369 10 356 9 363 10 b 405 -62 393 10 405 -14 l 449 -62 b 360 118 449 59 420 118 b 271 40 325 118 295 92 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittalSharp5v11SDown: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 112 -23 45 -84 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 b 242 37 203 -23 225 -3 b 315 -89 262 -23 285 -63 l 315 -517 l 360 -517 l 360 -112 l 383 -112 b 495 68 458 -112 495 -53 l 449 68 b 399 -4 449 20 433 -4 b 248 248 297 -4 261 171 b 157 68 222 127 192 68 l 89 68 b 0 -203 30 68 0 -23 z',\n },\n accSagittalFlat5v11SUp: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 89 -68 0 23 30 -68 l 157 -68 b 248 -248 192 -68 222 -127 b 399 4 261 -171 297 4 b 449 -68 433 4 449 -20 l 495 -68 b 383 112 495 53 458 112 l 360 112 l 360 517 l 315 517 l 315 89 b 242 -37 285 63 262 23 b 180 23 225 3 203 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 84 z',\n },\n accSagittalSharp7v11CDown: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 89 -112 l 89 -517 l 135 -517 l 135 -95 b 206 37 163 -73 187 -30 b 271 -23 225 -3 248 -23 l 271 -517 l 315 -517 l 315 -23 l 383 -23 b 449 -203 428 -23 449 -84 l 495 -203 b 405 68 495 -23 465 68 l 292 68 b 203 248 258 68 228 127 b 101 0 173 98 138 16 b 81 -3 94 0 86 -3 b 45 68 56 -3 45 20 l 0 68 b 89 -112 0 -52 30 -112 z',\n },\n accSagittalFlat7v11CUp: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 112 b 0 -68 30 112 0 52 l 45 -68 b 81 3 45 -20 56 3 b 101 0 86 3 94 0 b 203 -248 138 -16 173 -98 b 292 -68 228 -127 258 -68 l 405 -68 b 495 203 465 -68 495 23 l 449 203 b 383 23 449 84 428 23 l 315 23 l 315 517 l 271 517 l 271 23 b 206 -37 248 23 225 3 b 135 95 187 30 163 73 l 135 517 l 89 517 z',\n },\n accSagittalSharp55CDown: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -271 l 135 -125 l 135 -517 l 180 -517 l 180 -78 l 315 65 l 315 -517 l 360 -517 l 360 248 l 337 248 l 0 -112 z',\n },\n accSagittalFlat55CUp: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 337 -248 l 360 -248 l 360 517 l 315 517 l 315 -65 l 180 78 l 180 517 l 135 517 l 135 125 l 0 271 z',\n },\n accSagittalSharp17CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -248 l 45 -68 b 180 109 45 36 89 95 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -89 292 13 321 -55 l 360 -517 l 405 -517 l 405 -112 l 428 -112 b 540 68 504 -112 540 -53 l 495 68 b 445 -4 495 20 480 -4 b 292 248 343 -4 307 171 l 180 248 b 0 68 60 248 0 187 l 0 -248 z',\n },\n accSagittalFlat17CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 248 l 0 -68 b 180 -248 0 -187 60 -248 l 292 -248 b 445 4 307 -171 343 4 b 495 -68 480 4 495 -20 l 540 -68 b 428 112 540 53 504 112 l 405 112 l 405 517 l 360 517 l 360 89 b 271 -112 321 55 292 -13 l 225 -112 l 225 517 l 180 517 l 180 -109 b 45 68 89 -95 45 -36 l 45 248 z',\n },\n accSagittalSharp7v11kDown: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -32 l 405 138 l 405 13 l 0 -157 l 0 -256 l 225 -161 l 225 -517 l 271 -517 l 271 -144 l 405 -86 l 405 -517 l 449 -517 l 449 248 l 428 248 l 0 68 z',\n },\n accSagittalFlat7v11kUp: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 l 428 -248 l 449 -248 l 449 517 l 405 517 l 405 86 l 271 144 l 271 517 l 225 517 l 225 161 l 0 256 l 0 157 l 405 -13 l 405 -138 l 0 32 z',\n },\n accSagittalSharp7v11kUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 135 -112 l 135 -517 l 180 -517 l 180 -105 b 271 -23 217 -94 248 -65 l 271 -517 l 315 -517 l 315 -23 b 405 -105 337 -65 369 -94 l 405 -517 l 449 -517 l 449 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 315 148 b 112 -4 274 148 236 -4 b 45 68 68 -4 45 20 l 0 68 b 135 -112 0 -53 45 -112 z',\n },\n accSagittalFlat7v11kDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 135 112 b 0 -68 45 112 0 53 l 45 -68 b 112 4 45 -20 68 4 b 292 -248 236 4 274 -148 b 475 4 315 -148 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 l 449 517 l 405 517 l 405 105 b 315 23 369 94 337 65 l 315 517 l 271 517 l 271 23 b 180 105 248 65 217 94 l 180 517 l 135 517 z',\n },\n accSagittalSharp17CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 203 -23 b 271 14 229 -23 251 -10 l 271 -517 l 315 -517 l 315 -23 b 405 -105 337 -65 369 -94 l 405 -517 l 449 -517 l 449 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 312 150 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalFlat17CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 b 475 4 312 -150 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 l 449 517 l 405 517 l 405 105 b 315 23 369 94 337 65 l 315 517 l 271 517 l 271 -14 b 203 23 251 10 229 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalSharp55CUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -517 l 45 78 l 135 10 l 135 -517 l 180 -517 l 180 -23 l 271 -92 l 271 -517 l 315 -517 l 315 -127 l 495 -264 l 495 -112 l 23 248 l 0 248 l 0 -517 z',\n },\n accSagittalFlat55CDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 517 l 0 -248 l 23 -248 l 495 112 l 495 264 l 315 127 l 315 517 l 271 517 l 271 92 l 180 23 l 180 517 l 135 517 l 135 -10 l 45 -78 l 45 517 z',\n },\n accSagittalSharp7v11CUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 86 45 6 89 58 l 180 -517 l 225 -517 l 225 98 b 315 109 252 104 282 108 l 315 -517 l 360 -517 l 360 112 l 449 112 l 449 -517 l 495 -517 l 495 248 l 360 248 b 0 68 121 248 0 189 z',\n },\n accSagittalFlat7v11CDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 360 -248 0 -189 121 -248 l 495 -248 l 495 517 l 449 517 l 449 -112 l 360 -112 l 360 517 l 315 517 l 315 -109 b 225 -98 282 -108 252 -104 l 225 517 l 180 517 l 180 -86 b 45 68 89 -58 45 -6 l 45 248 l 0 248 z',\n },\n accSagittalSharp5v11SUp: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 -23 b 449 -105 383 -65 415 -94 l 449 -517 l 495 -517 l 495 -112 b 631 68 585 -112 631 -53 l 585 68 b 520 -4 585 20 563 -4 b 337 248 396 -4 360 150 l 225 248 b 0 68 76 248 0 187 z',\n },\n accSagittalFlat5v11SDown: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 225 -248 0 -187 76 -248 l 337 -248 b 520 4 360 -150 396 4 b 585 -68 563 4 585 -20 l 631 -68 b 495 112 631 53 585 112 l 495 517 l 449 517 l 449 105 b 360 23 415 94 383 65 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z',\n },\n accSagittalDoubleSharp5v11SDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 203 -23 b 262 4 225 -23 245 -13 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 341 -60 b 449 -112 370 -95 405 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 312 150 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalDoubleFlat5v11SUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 b 475 4 312 -150 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 b 341 60 405 112 370 95 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 262 -4 b 203 23 245 13 225 23 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalDoubleSharp7v11CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 112 -112 b 193 -73 143 -112 170 -99 l 45 -501 l 95 -517 l 248 -81 l 397 -517 l 449 -503 l 275 0 l 278 4 b 337 -23 295 -13 315 -23 l 405 -23 b 495 -203 465 -23 495 -84 l 540 -203 b 428 68 540 -23 503 68 l 360 68 b 248 248 310 68 271 127 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 112 -112 0 -52 36 -112 z',\n },\n accSagittalDoubleFlat7v11CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 112 112 b 0 -68 36 112 0 52 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 b 360 -68 271 -127 310 -68 l 428 -68 b 540 203 503 -68 540 23 l 495 203 b 405 23 495 84 465 23 l 337 23 b 278 -4 315 23 295 13 l 275 0 l 449 503 l 397 517 l 248 81 l 95 517 l 45 501 l 193 73 b 112 112 170 99 143 112 z',\n },\n accSagittalDoubleSharp55CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 428 248 l 0 -112 l 0 -266 l 307 -7 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 366 0 l 386 59 l 449 112 l 449 248 z',\n },\n accSagittalDoubleFlat55CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 449 -248 l 449 -112 l 386 -59 l 366 0 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 307 7 l 0 266 l 0 112 l 428 -248 z',\n },\n accSagittalDoubleSharp17CDown: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -248 l 45 -68 b 271 112 45 53 120 112 l 310 0 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 387 -62 b 495 -112 416 -95 452 -112 b 631 68 585 -112 631 -53 l 585 68 b 520 -4 585 20 563 -4 b 337 248 396 -4 360 150 l 225 248 b 0 68 76 248 0 187 l 0 -248 z',\n },\n accSagittalDoubleFlat17CUp: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 248 l 0 -68 b 225 -248 0 -187 76 -248 l 337 -248 b 520 4 360 -150 396 4 b 585 -68 563 4 585 -20 l 631 -68 b 495 112 631 53 585 112 b 387 62 452 112 416 95 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 310 0 l 271 -112 b 45 68 120 -112 45 -53 l 45 248 z',\n },\n accSagittalDoubleSharp7v11kDown: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -30 l 366 96 l 399 0 l 392 -23 l 0 -157 l 0 -255 l 353 -135 l 225 -503 l 276 -517 l 428 -82 l 579 -517 l 631 -503 l 455 0 l 507 145 l 540 157 l 540 248 l 517 248 z m 416 115 l 442 124 l 428 82 z',\n },\n accSagittalDoubleFlat7v11kUp: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 517 -248 l 540 -248 l 540 -157 l 507 -145 l 455 0 l 631 503 l 579 517 l 428 82 l 276 517 l 225 503 l 353 135 l 0 255 l 0 157 l 392 23 l 399 0 l 366 -96 l 0 30 l 0 -68 z m 428 -82 l 442 -124 l 416 -115 z',\n },\n accSagittal23CommaUp: {\n x_min: 0,\n x_max: 188,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -4 b 68 -23 53 -17 60 -23 l 180 -23 b 225 -203 210 -23 225 -82 l 271 -203 b 206 68 271 -23 248 68 l 89 68 b 23 248 71 68 48 127 l 0 248 z',\n },\n accSagittal23CommaDown: {\n x_min: 0,\n x_max: 188,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 b 89 -68 48 -127 71 -68 l 206 -68 b 271 203 248 -68 271 23 l 225 203 b 180 23 225 82 210 23 l 68 23 b 45 4 60 23 53 17 l 45 517 l 0 517 z',\n },\n accSagittal5v19CommaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -284 l 180 33 l 180 -517 l 225 -517 l 225 248 l 203 248 b 86 112 151 157 112 112 b 45 157 59 112 45 127 l 0 157 b 76 23 0 72 26 27 l 0 -112 z',\n },\n accSagittal5v19CommaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 76 -23 b 0 -157 26 -27 0 -72 l 45 -157 b 86 -112 45 -127 59 -112 b 203 -248 112 -112 151 -157 l 225 -248 l 225 517 l 180 517 l 180 -33 l 0 284 z',\n },\n accSagittal5v23SmallDiesisUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -284 l 180 33 l 180 -517 l 225 -517 l 225 -4 b 248 -23 233 -17 240 -23 l 360 -23 b 405 -203 390 -23 405 -82 l 449 -203 b 386 68 449 -23 428 68 l 271 68 b 203 248 251 68 228 127 l 0 -112 z',\n },\n accSagittal5v23SmallDiesisDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 203 -248 b 271 -68 228 -127 251 -68 l 386 -68 b 449 203 428 -68 449 23 l 405 203 b 360 23 405 82 390 23 l 248 23 b 225 4 240 23 233 17 l 225 517 l 180 517 l 180 -33 l 0 284 z',\n },\n accSagittalSharp5v23SDown: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 6 b 89 -23 59 -13 73 -23 l 180 -23 l 180 -517 l 225 -517 l 225 -23 l 292 -23 b 360 -203 337 -23 360 -84 l 405 -203 b 315 68 405 -23 374 68 l 112 68 b 23 248 78 68 48 127 l 0 248 z',\n },\n accSagittalFlat5v23SUp: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 b 112 -68 48 -127 78 -68 l 315 -68 b 405 203 374 -68 405 23 l 360 203 b 292 23 360 84 337 23 l 225 23 l 225 517 l 180 517 l 180 23 l 89 23 b 45 -6 73 23 59 13 l 45 517 l 0 517 z',\n },\n accSagittalSharp5v19CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 89 -112 0 -52 30 -112 l 89 -517 l 135 -517 l 135 -95 b 225 112 173 -65 203 4 l 271 112 l 271 -517 l 315 -517 l 315 107 b 405 -68 374 89 405 30 l 405 -248 l 449 -248 l 449 68 b 315 248 449 189 405 248 l 203 248 b 101 0 173 98 138 16 b 81 -3 94 0 86 -3 b 45 68 56 -3 45 23 z',\n },\n accSagittalFlat5v19CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 81 3 45 -23 56 3 b 101 0 86 3 94 0 b 203 -248 138 -16 173 -98 l 315 -248 b 449 -68 405 -248 449 -189 l 449 248 l 405 248 l 405 68 b 315 -107 405 -30 374 -89 l 315 517 l 271 517 l 271 -112 l 225 -112 b 135 95 203 -4 173 65 l 135 517 l 89 517 l 89 112 b 0 -68 30 112 0 52 z',\n },\n accSagittalSharp23CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 135 -82 l 135 -517 l 180 -517 l 180 -17 l 239 68 b 315 -23 261 7 287 -23 l 315 -517 l 360 -517 l 360 -23 l 428 -23 b 495 -203 472 -23 495 -84 l 540 -203 b 449 68 540 -23 510 68 l 337 68 b 248 248 302 68 271 127 l 0 -112 l 0 -276 z',\n },\n accSagittalFlat23CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 276 l 0 112 l 248 -248 b 337 -68 271 -127 302 -68 l 449 -68 b 540 203 510 -68 540 23 l 495 203 b 428 23 495 84 472 23 l 360 23 l 360 517 l 315 517 l 315 23 b 239 -68 287 23 261 -7 l 180 17 l 180 517 l 135 517 l 135 82 z',\n },\n accSagittalSharp23CUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 14 b 112 -23 63 -10 86 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 l 271 -517 l 315 -517 l 315 -23 l 360 -23 b 449 -203 420 -23 449 -84 l 495 -203 b 383 68 495 -23 458 68 l 135 68 b 23 248 85 68 48 127 l 0 248 z',\n },\n accSagittalFlat23CDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 b 135 -68 48 -127 85 -68 l 383 -68 b 495 203 458 -68 495 23 l 449 203 b 360 23 449 84 420 23 l 315 23 l 315 517 l 271 517 l 271 23 l 180 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 -14 86 23 63 10 l 45 517 l 0 517 z',\n },\n accSagittalSharp5v19CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -266 l 135 -153 l 135 -517 l 180 -517 l 180 -115 l 271 -39 l 271 -517 l 315 -517 l 315 0 l 405 75 l 405 -517 l 449 -517 l 449 248 l 428 248 b 130 68 285 127 186 68 b 45 157 73 68 45 98 l 0 157 b 112 -20 0 53 37 -6 z',\n },\n accSagittalFlat5v19CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 112 20 b 0 -157 37 6 0 -53 l 45 -157 b 130 -68 45 -98 73 -68 b 428 -248 186 -68 285 -127 l 449 -248 l 449 517 l 405 517 l 405 -75 l 315 0 l 315 517 l 271 517 l 271 39 l 180 115 l 180 517 l 135 517 l 135 153 l 0 266 l 0 112 z',\n },\n accSagittalSharp5v23SUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 135 -108 l 135 -517 l 180 -517 l 180 -53 l 271 58 l 271 -517 l 315 -517 l 315 14 b 383 -23 334 -10 357 -23 l 405 -23 l 405 -517 l 449 -517 l 449 -23 b 540 -203 510 -23 540 -84 l 585 -203 b 472 68 585 -23 547 68 l 405 68 b 292 248 356 68 318 127 l 0 -112 l 0 -274 z',\n },\n accSagittalFlat5v23SDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 274 l 0 112 l 292 -248 b 405 -68 318 -127 356 -68 l 472 -68 b 585 203 547 -68 585 23 l 540 203 b 449 23 540 84 510 23 l 449 517 l 405 517 l 405 23 l 383 23 b 315 -14 357 23 334 10 l 315 517 l 271 517 l 271 -58 l 180 53 l 180 517 l 135 517 l 135 108 z',\n },\n accSagittalDoubleSharp5v23SDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 52 -517 l 203 -81 l 354 -517 l 405 -503 l 239 -23 l 449 -23 b 540 -203 510 -23 540 -84 l 585 -203 b 472 68 585 -23 547 68 l 225 68 b 112 248 176 68 138 127 l 89 248 l 89 112 b 170 -14 109 45 135 0 l 0 -501 z',\n },\n accSagittalDoubleFlat5v23SUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 501 l 170 14 b 89 -112 135 0 109 -45 l 89 -248 l 112 -248 b 225 -68 138 -127 176 -68 l 472 -68 b 585 203 547 -68 585 23 l 540 203 b 449 23 540 84 510 23 l 239 23 l 405 503 l 354 517 l 203 81 l 52 517 z',\n },\n accSagittalDoubleSharp5v19CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 112 -112 0 -52 36 -112 b 193 -73 143 -112 170 -99 l 45 -501 l 95 -517 l 248 -81 l 397 -517 l 449 -501 l 275 0 l 315 112 b 495 -68 435 112 495 53 l 495 -248 l 540 -248 l 540 68 b 360 248 540 189 480 248 l 248 248 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 z',\n },\n accSagittalDoubleFlat5v19CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 l 360 -248 b 540 -68 480 -248 540 -189 l 540 248 l 495 248 l 495 68 b 315 -112 495 -53 435 -112 l 275 0 l 449 501 l 397 517 l 248 81 l 95 517 l 45 501 l 193 73 b 112 112 170 99 143 112 b 0 -68 36 112 0 52 z',\n },\n accSagittalDoubleSharp23CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 252 35 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 323 4 b 383 -23 340 -13 360 -23 l 449 -23 b 540 -203 510 -23 540 -84 l 585 -203 b 472 68 585 -23 547 68 l 405 68 b 292 248 356 68 318 127 l 0 -112 l 0 -274 z',\n },\n accSagittalDoubleFlat23CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 274 l 0 112 l 292 -248 b 405 -68 318 -127 356 -68 l 472 -68 b 585 203 547 -68 585 23 l 540 203 b 449 23 540 84 510 23 l 383 23 b 323 -4 360 23 340 13 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 252 -35 z',\n },\n accSagittal19SchismaUp: {\n x_min: 0,\n x_max: 125,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 68 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 248 l 157 248 b 79 0 127 98 101 16 b 68 -3 73 0 68 -3 b 45 68 52 -3 45 20 l 0 68 b 68 -112 0 -52 23 -112 z',\n },\n accSagittal19SchismaDown: {\n x_min: 0,\n x_max: 125,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 68 112 b 0 -68 23 112 0 52 l 45 -68 b 68 3 45 -20 52 3 b 79 0 68 3 73 0 b 157 -248 101 -16 127 -98 l 180 -248 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 z',\n },\n accSagittal17KleismaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 248 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z',\n },\n accSagittal17KleismaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 225 -248 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z',\n },\n accSagittal143CommaUp: {\n x_min: 0,\n x_max: 156,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -203 l 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 248 l 203 248 b 135 68 177 127 154 68 l 105 68 b 45 157 65 68 45 98 l 0 157 b 23 20 0 95 7 50 b 0 -203 7 -23 0 -98 z',\n },\n accSagittal143CommaDown: {\n x_min: 0,\n x_max: 156,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 23 -20 0 98 7 23 b 0 -157 7 -50 0 -95 l 45 -157 b 105 -68 45 -98 65 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 225 -248 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z',\n },\n accSagittal11v49CommaUp: {\n x_min: 0,\n x_max: 188,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -292 b 89 -157 45 -203 60 -157 l 203 -157 b 225 -143 210 -157 217 -153 l 225 -517 l 271 -517 l 271 248 l 248 248 b 180 157 233 187 210 157 l 68 157 b 0 -68 23 157 0 82 l 45 -68 b 89 68 45 23 60 68 l 203 68 b 225 84 209 68 216 72 l 225 -36 b 180 -68 213 -58 199 -68 l 68 -68 b 0 -292 23 -68 0 -143 z',\n },\n accSagittal11v49CommaDown: {\n x_min: 0,\n x_max: 188,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 292 b 68 68 0 143 23 68 l 180 68 b 225 36 199 68 213 58 l 225 -84 b 203 -68 216 -72 209 -68 l 89 -68 b 45 68 60 -68 45 -23 l 0 68 b 68 -157 0 -82 23 -157 l 180 -157 b 248 -248 210 -157 233 -187 l 271 -248 l 271 517 l 225 517 l 225 143 b 203 157 217 153 210 157 l 89 157 b 45 292 60 157 45 203 z',\n },\n accSagittal19CommaUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 68 -112 0 -52 23 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 -4 b 203 -23 187 -17 196 -23 l 315 -23 b 360 -203 346 -23 360 -82 l 405 -203 b 341 68 405 -23 383 68 l 225 68 b 157 248 206 68 183 127 b 79 0 127 98 101 16 b 68 -3 73 0 68 -3 b 45 68 52 -3 45 20 z',\n },\n accSagittal19CommaDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 68 3 45 -20 52 3 b 79 0 68 3 73 0 b 157 -248 101 -16 127 -98 b 225 -68 183 -127 206 -68 l 341 -68 b 405 203 383 -68 405 23 l 360 203 b 315 23 360 82 346 23 l 203 23 b 180 4 196 23 187 17 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 b 0 -68 23 112 0 52 z',\n },\n accSagittal7v19CommaUp: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 68 -112 0 -52 23 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 112 l 225 112 b 315 -68 285 112 315 53 l 315 -248 l 360 -248 l 360 68 b 271 248 360 187 330 248 l 157 248 b 79 0 127 98 101 16 b 68 -3 73 0 68 -3 b 45 68 52 -3 45 20 z',\n },\n accSagittal7v19CommaDown: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 68 3 45 -20 52 3 b 79 0 68 3 73 0 b 157 -248 101 -16 127 -98 l 271 -248 b 360 -68 330 -248 360 -187 l 360 248 l 315 248 l 315 68 b 225 -112 315 -53 285 -112 l 180 -112 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 b 0 -68 23 112 0 52 z',\n },\n accSagittal49SmallDiesisUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -203 l 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -68 330 112 360 53 l 360 -248 l 405 -248 l 405 68 b 315 248 405 187 374 248 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z',\n },\n accSagittal49SmallDiesisDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 315 -248 b 405 -68 374 -248 405 -187 l 405 248 l 360 248 l 360 68 b 271 -112 360 -53 330 -112 l 225 -112 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z',\n },\n accSagittal23SmallDiesisUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 58 l 495 -274 l 495 -112 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z',\n },\n accSagittal23SmallDiesisDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 495 112 l 495 274 l 225 -58 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z',\n },\n accSagittal5v13MediumDiesisUp: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -259 l 315 -89 l 315 -517 l 360 -517 l 360 248 l 337 248 b 128 180 253 203 184 180 b 45 248 73 180 45 203 l 0 248 b 52 95 0 170 17 120 l 0 68 l 0 -33 l 315 135 l 315 10 l 0 -157 z',\n },\n accSagittal5v13MediumDiesisDown: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 157 l 315 -10 l 315 -135 l 0 33 l 0 -68 l 52 -95 b 0 -248 17 -120 0 -170 l 45 -248 b 128 -180 45 -203 73 -180 b 337 -248 184 -180 253 -203 l 360 -248 l 360 517 l 315 517 l 315 89 l 0 259 z',\n },\n accSagittal11v19MediumDiesisUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 -4 b 292 -23 278 -17 285 -23 l 405 -23 b 449 -203 435 -23 449 -82 l 495 -203 b 431 68 495 -23 472 68 l 315 68 b 248 248 295 68 271 127 l 135 248 b 0 68 45 248 0 187 l 0 -248 z',\n },\n accSagittal11v19MediumDiesisDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 248 l 0 -68 b 135 -248 0 -187 45 -248 l 248 -248 b 315 -68 271 -127 295 -68 l 431 -68 b 495 203 472 -68 495 23 l 449 203 b 405 23 449 82 435 23 l 292 23 b 271 4 285 23 278 17 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 z',\n },\n accSagittal49MediumDiesisUp: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -68 l 0 -248 l 45 -248 l 315 -94 l 315 -517 l 360 -517 l 360 248 l 225 248 b 0 -68 75 248 0 143 z m 45 -68 b 225 112 45 53 105 112 l 315 112 l 315 10 l 45 -145 z',\n },\n accSagittal49MediumDiesisDown: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 68 b 225 -248 0 -143 75 -248 l 360 -248 l 360 517 l 315 517 l 315 94 l 45 248 l 0 248 z m 45 145 l 315 -10 l 315 -112 l 225 -112 b 45 68 105 -112 45 -53 z',\n },\n accSagittal5v49MediumDiesisUp: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -89 l 0 -248 l 225 53 l 225 -517 l 271 -517 l 271 53 l 495 -248 l 495 -89 l 248 248 b 89 89 170 143 118 89 b 45 157 60 89 45 112 l 0 157 b 68 3 0 68 23 16 z',\n },\n accSagittal5v49MediumDiesisDown: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 68 -3 b 0 -157 23 -16 0 -68 l 45 -157 b 89 -89 45 -112 60 -89 b 248 -248 118 -89 170 -143 l 495 89 l 495 248 l 271 -53 l 271 517 l 225 517 l 225 -53 l 0 248 l 0 89 z',\n },\n accSagittal49LargeDiesisUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -89 l 360 -248 l 405 -248 l 405 -68 b 180 248 405 143 330 248 l 0 248 z m 45 12 l 45 112 l 180 112 b 360 -68 300 112 360 53 l 360 -147 z',\n },\n accSagittal49LargeDiesisDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 180 -248 b 405 68 330 -248 405 -143 l 405 248 l 360 248 l 45 89 l 45 517 l 0 517 z m 360 147 l 360 68 b 180 -112 360 -53 300 -112 l 45 -112 l 45 -12 z',\n },\n accSagittal11v19LargeDiesisUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -86 l 449 -256 l 449 -157 l 45 13 l 45 138 l 449 -30 l 449 68 l 23 248 l 0 248 z',\n },\n accSagittal11v19LargeDiesisDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 l 449 -68 l 449 30 l 45 -138 l 45 -13 l 449 157 l 449 256 l 45 86 l 45 517 l 0 517 z',\n },\n accSagittal5v13LargeDiesisUp: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 b 89 -112 0 -52 30 -112 b 180 -35 125 -112 157 -86 l 180 -517 l 225 -517 l 225 -86 l 631 -256 l 631 -157 l 225 13 l 225 138 l 631 -30 l 631 68 l 203 248 b 101 0 173 98 138 16 b 81 -3 94 0 86 -3 b 45 68 56 -3 45 20 z',\n },\n accSagittal5v13LargeDiesisDown: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -68 b 81 3 45 -20 56 3 b 101 0 86 3 94 0 b 203 -248 138 -16 173 -98 l 631 -68 l 631 30 l 225 -138 l 225 -13 l 631 157 l 631 256 l 225 86 l 225 517 l 180 517 l 180 35 b 89 112 157 86 125 112 b 0 -68 30 112 0 52 z',\n },\n accSagittalSharp23SDown: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -203 l 45 -203 b 112 -23 45 -84 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 b 315 6 287 -23 301 -13 l 315 -517 l 360 -517 l 360 248 l 337 248 b 248 68 312 127 282 68 l 194 68 b 89 157 125 68 89 98 l 45 157 b 60 59 45 118 50 85 b 0 -203 20 30 0 -56 z',\n },\n accSagittalFlat23SUp: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 60 -59 0 56 20 -30 b 45 -157 50 -85 45 -118 l 89 -157 b 194 -68 89 -98 125 -68 l 248 -68 b 337 -248 282 -68 312 -127 l 360 -248 l 360 517 l 315 517 l 315 -6 b 271 23 301 13 287 23 l 180 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 84 z',\n },\n accSagittalSharp49SDown: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -292 l 45 -292 b 112 -157 45 -203 68 -157 l 135 -157 l 135 -517 l 180 -517 l 180 -157 l 271 -157 b 315 -135 285 -157 300 -150 l 315 -517 l 360 -517 l 360 248 l 337 248 b 248 157 323 187 292 157 l 89 157 b 0 -68 30 157 0 82 l 45 -68 b 112 68 45 23 68 68 l 271 68 b 315 89 284 68 300 75 l 315 -32 b 248 -68 298 -56 275 -68 l 89 -68 b 0 -292 29 -68 0 -143 z',\n },\n accSagittalFlat49SUp: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 292 b 89 68 0 143 29 68 l 248 68 b 315 32 275 68 298 56 l 315 -89 b 271 -68 300 -75 284 -68 l 112 -68 b 45 68 68 -68 45 -23 l 0 68 b 89 -157 0 -82 30 -157 l 248 -157 b 337 -248 292 -157 323 -187 l 360 -248 l 360 517 l 315 517 l 315 135 b 271 157 300 150 285 157 l 180 157 l 180 517 l 135 517 l 135 157 l 112 157 b 45 292 68 157 45 203 z',\n },\n accSagittalSharp7v19CDown: {\n x_min: 0,\n x_max: 250,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -271 l 135 -125 l 135 -517 l 180 -517 l 180 -78 l 315 65 l 315 -517 l 360 -517 l 360 248 l 337 248 b 118 89 239 143 166 89 b 45 157 68 89 45 112 l 0 157 b 89 -20 0 53 29 -6 z',\n },\n accSagittalFlat7v19CUp: {\n x_min: 0,\n x_max: 250,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 20 b 0 -157 29 6 0 -53 l 45 -157 b 118 -89 45 -112 68 -89 b 337 -248 166 -89 239 -143 l 360 -248 l 360 517 l 315 517 l 315 -65 l 180 78 l 180 517 l 135 517 l 135 125 l 0 271 l 0 112 z',\n },\n accSagittalSharp19CDown: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 180 96 45 17 89 72 l 180 -517 l 225 -517 l 225 107 b 315 112 252 112 282 112 l 360 112 l 360 -517 l 405 -517 l 405 248 l 271 248 b 0 68 89 248 0 187 z',\n },\n accSagittalFlat19CUp: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 271 -248 0 -187 89 -248 l 405 -248 l 405 517 l 360 517 l 360 -112 l 315 -112 b 225 -107 282 -112 252 -112 l 225 517 l 180 517 l 180 -96 b 45 68 89 -72 45 -17 l 45 248 l 0 248 z',\n },\n accSagittalSharp11v49CDown: {\n x_min: 0,\n x_max: 344,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 112 -23 45 -82 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 b 271 112 215 -23 245 23 l 315 112 l 315 -517 l 360 -517 l 360 107 b 449 -68 420 89 449 30 l 449 -248 l 495 -248 l 495 68 b 360 248 495 189 449 248 l 248 248 b 157 68 222 128 192 68 l 89 68 b 0 -203 30 68 0 -23 z',\n },\n accSagittalFlat11v49CUp: {\n x_min: 0,\n x_max: 344,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 89 -68 0 23 30 -68 l 157 -68 b 248 -248 192 -68 222 -128 l 360 -248 b 495 -68 449 -248 495 -189 l 495 248 l 449 248 l 449 68 b 360 -107 449 -30 420 -89 l 360 517 l 315 517 l 315 -112 l 271 -112 b 180 23 245 -23 215 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 82 z',\n },\n accSagittalSharp143CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 112 -23 45 -84 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 b 259 76 210 -23 236 10 l 315 17 l 315 -517 l 360 -517 l 360 -30 l 585 -271 l 585 -112 l 248 248 b 157 68 222 127 192 68 l 89 68 b 0 -203 30 68 0 -23 z',\n },\n accSagittalFlat143CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 89 -68 0 23 30 -68 l 157 -68 b 248 -248 192 -68 222 -127 l 585 112 l 585 271 l 360 30 l 360 517 l 315 517 l 315 -17 l 259 -76 b 180 23 236 -10 210 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 84 z',\n },\n accSagittalSharp17kDown: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -157 l 0 -256 l 225 -161 l 225 -517 l 271 -517 l 271 -144 l 405 -86 l 405 -517 l 449 -517 l 449 248 l 428 248 b 145 171 305 196 210 171 b 45 248 78 171 45 196 l 0 248 b 79 101 0 170 26 121 l 0 68 l 0 -32 l 405 138 l 405 13 z',\n },\n accSagittalFlat17kUp: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 405 -13 l 405 -138 l 0 32 l 0 -68 l 79 -101 b 0 -248 26 -121 0 -170 l 45 -248 b 145 -171 45 -196 78 -171 b 428 -248 210 -171 305 -196 l 449 -248 l 449 517 l 405 517 l 405 86 l 271 144 l 271 517 l 225 517 l 225 161 l 0 256 l 0 157 z',\n },\n accSagittalSharp19sDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 180 109 45 36 89 95 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -23 295 23 325 -23 l 360 -517 l 405 -517 l 405 -23 l 472 -23 b 540 -203 517 -23 540 -84 l 585 -203 b 495 68 585 -23 554 68 l 383 68 b 292 248 348 68 318 127 l 180 248 b 0 68 60 248 0 187 z',\n },\n accSagittalFlat19sUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 180 -248 0 -187 60 -248 l 292 -248 b 383 -68 318 -127 348 -68 l 495 -68 b 585 203 554 -68 585 23 l 540 203 b 472 23 540 84 517 23 l 405 23 l 405 517 l 360 517 l 360 23 b 271 -112 325 23 295 -23 l 225 -112 l 225 517 l 180 517 l 180 -109 b 45 68 89 -95 45 -36 l 45 248 l 0 248 z',\n },\n accSagittalSharp19sUp: {\n x_min: 0,\n x_max: 281,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 89 -96 l 89 -517 l 135 -517 l 135 -108 b 180 -112 148 -112 163 -112 b 225 -108 196 -112 210 -112 l 225 -517 l 271 -517 l 271 -94 b 360 -12 305 -78 337 -50 l 360 -517 l 405 -517 l 405 248 l 383 248 b 190 0 353 98 288 16 b 138 -3 171 0 153 -3 b 45 68 75 -3 45 20 l 0 68 b 89 -96 0 -17 30 -72 z',\n },\n accSagittalFlat19sDown: {\n x_min: 0,\n x_max: 281,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 96 b 0 -68 30 72 0 17 l 45 -68 b 138 3 45 -20 75 3 b 190 0 153 3 171 0 b 383 -248 288 -16 353 -98 l 405 -248 l 405 517 l 360 517 l 360 12 b 271 94 337 50 305 78 l 271 517 l 225 517 l 225 108 b 180 112 210 112 196 112 b 135 108 163 112 148 112 l 135 517 l 89 517 z',\n },\n accSagittalSharp17kUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 l 271 -517 l 315 -517 l 315 -23 l 337 -23 b 405 14 363 -23 386 -10 l 405 -517 l 449 -517 l 449 248 l 428 248 b 315 68 402 127 364 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalFlat17kDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 315 -68 b 428 -248 364 -68 402 -127 l 449 -248 l 449 517 l 405 517 l 405 -14 b 337 23 386 10 363 23 l 315 23 l 315 517 l 271 517 l 271 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalSharp143CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 l 271 -517 l 315 -517 l 315 -23 l 337 -23 b 405 14 363 -23 386 -10 l 405 -517 l 449 -517 l 449 248 l 428 248 b 315 68 402 127 364 68 l 240 68 b 89 157 140 68 89 98 l 45 157 b 68 53 45 115 52 81 b 0 -203 23 23 0 -63 z',\n },\n accSagittalFlat143CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -53 0 63 23 -23 b 45 -157 52 -81 45 -115 l 89 -157 b 240 -68 89 -98 140 -68 l 315 -68 b 428 -248 364 -68 402 -127 l 449 -248 l 449 517 l 405 517 l 405 -14 b 337 23 386 10 363 23 l 315 23 l 315 517 l 271 517 l 271 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalSharp11v49CUp: {\n x_min: 0,\n x_max: 312,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -68 b 135 68 45 23 76 68 l 337 68 b 405 95 363 68 386 76 l 405 -27 b 315 -68 386 -55 356 -68 l 112 -68 b 0 -292 37 -68 0 -143 l 45 -292 b 135 -157 45 -203 75 -157 l 135 -517 l 180 -517 l 180 -157 l 271 -157 l 271 -517 l 315 -517 l 315 -157 l 337 -157 b 405 -130 360 -157 383 -148 l 405 -517 l 449 -517 l 449 248 l 428 248 b 315 157 413 187 376 157 l 112 157 b 0 -68 37 157 0 82 z',\n },\n accSagittalFlat11v49CDown: {\n x_min: 0,\n x_max: 312,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 68 b 112 -157 0 -82 37 -157 l 315 -157 b 428 -248 376 -157 413 -187 l 449 -248 l 449 517 l 405 517 l 405 130 b 337 157 383 148 360 157 l 315 157 l 315 517 l 271 517 l 271 157 l 180 157 l 180 517 l 135 517 l 135 157 b 45 292 75 157 45 203 l 0 292 b 112 68 0 143 37 68 l 315 68 b 405 27 356 68 386 55 l 405 -95 b 337 -68 386 -76 363 -68 l 135 -68 b 45 68 76 -68 45 -23 z',\n },\n accSagittalSharp19CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 89 -109 l 89 -517 l 135 -517 l 135 -109 b 225 -27 170 -102 200 -75 l 225 -517 l 271 -517 l 271 14 b 337 -23 289 -10 311 -23 l 360 -23 l 360 -517 l 405 -517 l 405 -23 b 495 -203 465 -23 495 -82 l 540 -203 b 428 68 540 -23 503 68 l 360 68 b 248 248 310 68 271 128 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 89 -109 0 -39 30 -98 z',\n },\n accSagittalFlat19CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 109 b 0 -68 30 98 0 39 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 b 360 -68 271 -128 310 -68 l 428 -68 b 540 203 503 -68 540 23 l 495 203 b 405 23 495 82 465 23 l 405 517 l 360 517 l 360 23 l 337 23 b 271 -14 311 23 289 10 l 271 517 l 225 517 l 225 27 b 135 109 200 75 170 102 l 135 517 l 89 517 z',\n },\n accSagittalSharp7v19CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 89 -109 l 89 -517 l 135 -517 l 135 -109 b 225 -27 170 -102 200 -75 l 225 -517 l 271 -517 l 271 112 l 315 112 b 360 109 331 112 346 112 l 360 -517 l 405 -517 l 405 98 b 495 -68 465 73 495 19 l 495 -248 l 540 -248 l 540 68 b 360 248 540 189 480 248 l 248 248 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 89 -109 0 -39 30 -98 z',\n },\n accSagittalFlat7v19CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 109 b 0 -68 30 98 0 39 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 l 360 -248 b 540 -68 480 -248 540 -189 l 540 248 l 495 248 l 495 68 b 405 -98 495 -19 465 -73 l 405 517 l 360 517 l 360 -109 b 315 -112 346 -112 331 -112 l 271 -112 l 271 517 l 225 517 l 225 27 b 135 109 200 75 170 102 l 135 517 l 89 517 z',\n },\n accSagittalSharp49SUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 203 -23 b 271 14 229 -23 251 -10 l 271 -517 l 315 -517 l 315 112 l 360 112 b 405 109 376 112 390 112 l 405 -517 l 449 -517 l 449 96 b 540 -68 510 72 540 17 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalFlat49SDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 449 -96 540 -17 510 -72 l 449 517 l 405 517 l 405 -109 b 360 -112 390 -112 376 -112 l 315 -112 l 315 517 l 271 517 l 271 -14 b 203 23 251 10 229 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalSharp23SUp: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 203 -23 b 271 14 229 -23 251 -10 l 271 -517 l 315 -517 l 315 71 l 405 -14 l 405 -517 l 449 -517 l 449 -56 l 675 -268 l 675 -112 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalFlat23SDown: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 675 112 l 675 268 l 449 56 l 449 517 l 405 517 l 405 14 l 315 -71 l 315 517 l 271 517 l 271 -14 b 203 23 251 10 229 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalSharp5v13MUp: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 495 141 l 495 14 l 0 -157 l 0 -256 l 225 -180 l 225 -517 l 271 -517 l 271 -161 l 360 -130 l 360 -517 l 405 -517 l 405 -115 l 495 -84 l 495 -517 l 540 -517 l 540 248 l 517 248 b 167 168 366 194 248 168 b 45 248 85 168 45 194 l 0 248 b 95 99 0 170 30 120 l 0 68 l 0 -30 z',\n },\n accSagittalFlat5v13MDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 30 l 0 -68 l 95 -99 b 0 -248 30 -120 0 -170 l 45 -248 b 167 -168 45 -194 85 -168 b 517 -248 248 -168 366 -194 l 540 -248 l 540 517 l 495 517 l 495 84 l 405 115 l 405 517 l 360 517 l 360 130 l 271 161 l 271 517 l 225 517 l 225 180 l 0 256 l 0 157 l 495 -14 l 495 -141 z',\n },\n accSagittalSharp11v19MUp: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 14 b 428 -23 379 -10 402 -23 l 449 -23 l 449 -517 l 495 -517 l 495 -23 b 585 -203 554 -23 585 -84 l 631 -203 b 517 68 631 -23 593 68 l 449 68 b 337 248 400 68 363 127 l 225 248 b 0 68 75 248 0 187 z',\n },\n accSagittalFlat11v19MDown: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 337 -248 b 449 -68 363 -127 400 -68 l 517 -68 b 631 203 593 -68 631 23 l 585 203 b 495 23 585 84 554 23 l 495 517 l 449 517 l 449 23 l 428 23 b 360 -14 402 23 379 10 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z',\n },\n accSagittalSharp49MUp: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 225 -180 l 225 -517 l 271 -517 l 271 -166 l 360 -132 l 360 -517 l 405 -517 l 405 -117 l 495 -84 l 495 -517 l 540 -517 l 540 248 l 360 248 b 0 -68 120 248 0 143 z m 45 -145 l 45 -68 b 360 112 45 53 150 112 l 495 112 l 495 14 z',\n },\n accSagittalFlat49MDown: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 68 b 360 -248 0 -143 120 -248 l 540 -248 l 540 517 l 495 517 l 495 84 l 405 117 l 405 517 l 360 517 l 360 132 l 271 166 l 271 517 l 225 517 l 225 180 l 45 248 l 0 248 z m 495 -14 l 495 -112 l 360 -112 b 45 68 150 -112 45 -53 l 45 145 z',\n },\n accSagittalSharp5v49MUp: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -271 l 180 -79 l 180 -517 l 225 -517 l 225 -30 l 315 65 l 315 -517 l 360 -517 l 360 65 l 449 -30 l 449 -517 l 495 -517 l 495 -79 l 675 -271 l 675 -112 l 337 248 b 118 89 239 143 166 89 b 45 157 68 89 45 112 l 0 157 b 107 0 0 62 36 10 l 0 -112 z',\n },\n accSagittalFlat5v49MDown: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 112 l 107 0 b 0 -157 36 -10 0 -62 l 45 -157 b 118 -89 45 -112 68 -89 b 337 -248 166 -89 239 -143 l 675 112 l 675 271 l 495 79 l 495 517 l 449 517 l 449 30 l 360 -65 l 360 517 l 315 517 l 315 -65 l 225 30 l 225 517 l 180 517 l 180 79 l 0 271 z',\n },\n accSagittalSharp49LUp: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -82 l 135 -112 l 135 -517 l 180 -517 l 180 -127 l 271 -157 l 271 -517 l 315 -517 l 315 -173 l 540 -248 l 585 -248 l 585 -68 b 180 248 585 143 449 248 l 0 248 z m 45 112 l 180 112 b 540 -68 420 112 540 53 l 540 -145 l 45 16 z',\n },\n accSagittalFlat49LDown: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 180 -248 b 585 68 449 -248 585 -143 l 585 248 l 540 248 l 315 173 l 315 517 l 271 517 l 271 157 l 180 127 l 180 517 l 135 517 l 135 112 l 45 82 l 45 517 l 0 517 z m 45 -16 l 540 145 l 540 68 b 180 -112 540 -53 420 -112 l 45 -112 z',\n },\n accSagittalSharp11v19LUp: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -517 l 45 -517 l 45 -81 l 135 -108 l 135 -517 l 180 -517 l 180 -121 l 271 -148 l 271 -517 l 315 -517 l 315 -161 l 631 -255 l 631 -157 l 45 16 l 45 144 l 631 -30 l 631 68 l 23 248 l 0 248 z',\n },\n accSagittalFlat11v19LDown: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -248 l 23 -248 l 631 -68 l 631 30 l 45 -144 l 45 -16 l 631 157 l 631 255 l 315 161 l 315 517 l 271 517 l 271 148 l 180 121 l 180 517 l 135 517 l 135 108 l 45 81 l 45 517 l 0 517 z',\n },\n accSagittalSharp5v13LUp: {\n x_min: 0,\n x_max: 500,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 89 -109 l 89 -517 l 135 -517 l 135 -109 b 225 -27 170 -102 200 -75 l 225 -517 l 271 -517 l 271 -85 l 360 -120 l 360 -517 l 405 -517 l 405 -135 l 720 -256 l 720 -157 l 271 14 l 271 141 l 720 -30 l 720 68 l 248 248 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 89 -109 0 -39 30 -98 z',\n },\n accSagittalFlat5v13LDown: {\n x_min: 0,\n x_max: 500,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 89 109 b 0 -68 30 98 0 39 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 l 720 -68 l 720 30 l 271 -141 l 271 -14 l 720 157 l 720 256 l 405 135 l 405 517 l 360 517 l 360 120 l 271 85 l 271 517 l 225 517 l 225 27 b 135 109 200 75 170 102 l 135 517 l 89 517 z',\n },\n accSagittalDoubleSharp23SDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -203 l 45 -203 b 135 -23 45 -82 76 -23 l 301 -23 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 370 -14 b 449 112 423 10 449 53 l 449 248 l 428 248 b 315 68 402 127 364 68 l 240 68 b 89 157 140 68 89 98 l 45 157 b 68 53 45 115 52 81 b 0 -203 23 23 0 -63 z',\n },\n accSagittalDoubleFlat23SUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 68 -53 0 63 23 -23 b 45 -157 52 -81 45 -115 l 89 -157 b 240 -68 89 -98 140 -68 l 315 -68 b 428 -248 364 -68 402 -127 l 449 -248 l 449 -112 b 370 14 449 -53 423 -10 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 301 23 l 135 23 b 45 203 76 23 45 82 z',\n },\n accSagittalDoubleSharp49SDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -292 l 45 -292 b 112 -157 45 -203 68 -157 l 256 -157 l 135 -503 l 187 -517 l 337 -82 l 490 -517 l 540 -503 l 366 0 l 396 89 b 449 157 416 102 435 125 l 449 248 l 428 248 b 315 157 413 187 376 157 l 112 157 b 0 -68 39 157 0 82 l 45 -68 b 135 68 45 23 76 68 l 287 68 l 311 0 l 288 -68 l 89 -68 b 0 -292 32 -68 0 -144 z',\n },\n accSagittalDoubleFlat49SUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 292 b 89 68 0 144 32 68 l 288 68 l 311 0 l 287 -68 l 135 -68 b 45 68 76 -68 45 -23 l 0 68 b 112 -157 0 -82 39 -157 l 315 -157 b 428 -248 376 -157 413 -187 l 449 -248 l 449 -157 b 396 -89 435 -125 416 -102 l 366 0 l 540 503 l 490 517 l 337 82 l 187 517 l 135 503 l 256 157 l 112 157 b 45 292 68 157 45 203 z',\n },\n accSagittalDoubleSharp7v19CDown: {\n x_min: 0,\n x_max: 375,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -112 l 0 -266 l 307 -7 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 366 0 l 386 59 l 449 112 l 449 248 l 428 248 b 130 68 285 127 186 68 b 45 157 73 68 45 98 l 0 157 b 112 -20 0 53 37 -6 z',\n },\n accSagittalDoubleFlat7v19CUp: {\n x_min: 0,\n x_max: 375,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 112 20 b 0 -157 37 6 0 -53 l 45 -157 b 130 -68 45 -98 73 -68 b 428 -248 186 -68 285 -127 l 449 -248 l 449 -112 l 386 -59 l 366 0 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 307 7 l 0 266 l 0 112 z',\n },\n accSagittalDoubleSharp19CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 315 109 45 36 135 95 l 354 0 l 180 -503 l 232 -517 l 383 -82 l 534 -517 l 585 -503 l 410 0 l 449 112 l 495 112 l 495 248 l 360 248 b 0 68 120 248 0 187 z m 372 112 l 393 112 l 383 82 z',\n },\n accSagittalDoubleFlat19CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 360 -248 0 -187 120 -248 l 495 -248 l 495 -112 l 449 -112 l 410 0 l 585 503 l 534 517 l 383 82 l 232 517 l 180 503 l 354 0 l 315 -109 b 45 68 135 -95 45 -36 l 45 248 l 0 248 z m 383 -82 l 393 -112 l 372 -112 z',\n },\n accSagittalDoubleSharp11v49CDown: {\n x_min: 0,\n x_max: 406,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 203 -23 b 262 4 225 -23 245 -13 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 360 112 b 540 -68 480 112 540 53 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalDoubleFlat11v49CUp: {\n x_min: 0,\n x_max: 406,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 360 -112 540 -53 480 -112 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 262 -4 b 203 23 245 13 225 23 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalDoubleSharp143CDown: {\n x_min: 0,\n x_max: 469,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 203 -23 b 262 4 225 -23 245 -13 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 337 49 l 675 -268 l 675 -112 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z',\n },\n accSagittalDoubleFlat143CUp: {\n x_min: 0,\n x_max: 469,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 675 112 l 675 268 l 337 -49 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 262 -4 b 203 23 245 13 225 23 l 135 23 b 45 203 75 23 45 84 z',\n },\n accSagittalDoubleSharp17kDown: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 248 b 95 101 0 170 30 121 l 0 68 l 0 -30 l 364 96 l 399 0 l 390 -23 l 0 -157 l 0 -255 l 353 -135 l 225 -503 l 275 -517 l 428 -82 l 577 -517 l 631 -503 l 455 0 l 507 145 l 540 157 l 540 248 l 517 248 b 167 168 366 194 248 168 b 45 248 85 168 45 194 z m 416 115 l 442 124 l 428 82 z',\n },\n accSagittalDoubleFlat17kUp: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 45 -248 b 167 -168 45 -194 85 -168 b 517 -248 248 -168 366 -194 l 540 -248 l 540 -157 l 507 -145 l 455 0 l 631 503 l 577 517 l 428 82 l 275 517 l 225 503 l 353 135 l 0 255 l 0 157 l 390 23 l 399 0 l 364 -96 l 0 30 l 0 -68 l 95 -101 b 0 -248 30 -121 0 -170 z m 428 -82 l 442 -124 l 416 -115 z',\n },\n accSagittalDoubleSharp19sDown: {\n x_min: 0,\n x_max: 438,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 -248 l 45 -248 l 45 -68 b 271 112 45 53 120 112 l 310 0 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 366 0 l 367 4 b 428 -23 386 -13 405 -23 l 495 -23 b 585 -203 554 -23 585 -84 l 631 -203 b 517 68 631 -23 593 68 l 449 68 b 337 248 400 68 363 127 l 225 248 b 0 68 75 248 0 187 z',\n },\n accSagittalDoubleFlat19sUp: {\n x_min: 0,\n x_max: 438,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 337 -248 b 449 -68 363 -127 400 -68 l 517 -68 b 631 203 593 -68 631 23 l 585 203 b 495 23 585 84 554 23 l 428 23 b 367 -4 405 23 386 13 l 366 0 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 310 0 l 271 -112 b 45 68 120 -112 45 -53 l 45 248 l 0 248 z',\n },\n accSagittalShaftUp: {\n x_min: 0,\n x_max: 31,\n y_min: -359,\n y_max: 172,\n ha: 531,\n o: 'm 0 112 l 0 -517 l 45 -517 l 45 112 l 23 248 z',\n },\n accSagittalShaftDown: {\n x_min: 0,\n x_max: 31,\n y_min: -172,\n y_max: 359,\n ha: 531,\n o: 'm 23 -248 l 45 -112 l 45 517 l 0 517 l 0 -112 z',\n },\n accSagittalAcute: {\n x_min: 0,\n x_max: 125,\n y_min: -62,\n y_max: 125,\n ha: 187,\n o: 'm 0 0 l 0 -89 l 180 89 l 180 180 z',\n },\n accSagittalGrave: {\n x_min: 0,\n x_max: 125,\n y_min: -125,\n y_max: 62,\n ha: 187,\n o: 'm 180 -180 l 180 -89 l 0 89 l 0 0 z',\n },\n accSagittal1MinaUp: {\n x_min: -7,\n x_max: 124,\n y_min: 16,\n y_max: 106.31676725154982,\n ha: 90.31676725154982,\n o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 134 150 179 112 163 135 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z',\n },\n accSagittal1MinaDown: {\n x_min: -7,\n x_max: 124,\n y_min: -106.31676725154983,\n y_max: -16,\n ha: 90.31676725154983,\n o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 179 -23 163 -135 179 -112 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z',\n },\n accSagittal2MinasUp: {\n x_min: -7,\n x_max: 218,\n y_min: 16,\n y_max: 106.31676725154982,\n ha: 90.31676725154982,\n o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 207 65 179 23 200 55 b 252 107 223 86 240 107 b 271 23 264 107 272 86 l 314 23 b 269 150 314 112 298 135 b 203 130 252 158 220 150 b 173 92 190 115 181 104 b 134 150 167 127 154 140 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z',\n },\n accSagittal2MinasDown: {\n x_min: -7,\n x_max: 218,\n y_min: -106.31676725154983,\n y_max: -16,\n ha: 90.31676725154983,\n o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 173 -92 154 -140 167 -127 b 203 -130 181 -104 190 -115 b 269 -150 220 -150 252 -158 b 314 -23 298 -135 314 -112 l 271 -23 b 252 -107 272 -86 264 -107 b 207 -65 240 -107 223 -86 b 179 -23 200 -55 179 -23 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z',\n },\n accSagittal1TinaUp: {\n x_min: 0,\n x_max: 93,\n y_min: 16,\n y_max: 107,\n ha: 91,\n o: 'm 134 154 l 91 154 b 81 76 91 101 91 86 b 0 68 73 69 48 68 l 0 23 b 134 154 122 23 134 36 z',\n },\n accSagittal1TinaDown: {\n x_min: 0,\n x_max: 93,\n y_min: -107,\n y_max: -16,\n ha: 91,\n o: 'm 134 -154 b 0 -23 134 -36 122 -23 l 0 -68 b 81 -76 48 -68 73 -69 b 91 -154 91 -86 91 -101 z',\n },\n accSagittal2TinasUp: {\n x_min: 0,\n x_max: 94,\n y_min: 16,\n y_max: 107,\n ha: 91,\n o: 'm 135 68 b 89 154 94 68 89 124 l 46 154 b 36 92 45 131 42 105 b 0 68 32 82 23 68 l 0 23 b 68 63 29 23 53 40 b 135 23 84 39 104 23 z',\n },\n accSagittal2TinasDown: {\n x_min: 0,\n x_max: 94,\n y_min: -107,\n y_max: -16,\n ha: 91,\n o: 'm 135 -23 b 68 -63 104 -23 84 -39 b 0 -23 53 -40 29 -23 l 0 -68 b 36 -92 23 -68 32 -82 b 46 -154 42 -105 45 -131 l 89 -154 b 135 -68 89 -124 94 -68 z',\n },\n accSagittal3TinasUp: {\n x_min: -7,\n x_max: 124,\n y_min: 16,\n y_max: 106.31676725154982,\n ha: 90.31676725154982,\n o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 134 150 179 112 163 135 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z',\n },\n accSagittal3TinasDown: {\n x_min: -7,\n x_max: 124,\n y_min: -106.31676725154983,\n y_max: -16,\n ha: 90.31676725154983,\n o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 179 -23 163 -135 179 -112 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z',\n },\n accSagittal4TinasUp: {\n x_min: 0,\n x_max: 187,\n y_min: 16,\n y_max: 106.69999999999997,\n ha: 90.69999999999997,\n o: 'm 0 68 l 0 23 b 143 45 105 23 124 26 b 203 107 153 55 183 107 b 226 23 216 107 226 86 l 269 23 b 225 150 269 112 253 135 b 160 132 207 158 181 153 b 115 81 138 112 124 88 b 0 68 104 71 94 68 z',\n },\n accSagittal4TinasDown: {\n x_min: 0,\n x_max: 187,\n y_min: -106.69999999999999,\n y_max: -16,\n ha: 90.69999999999999,\n o: 'm 0 -68 b 115 -81 94 -68 104 -71 b 160 -132 124 -88 138 -112 b 225 -150 181 -153 207 -158 b 269 -23 253 -135 269 -112 l 226 -23 b 203 -107 226 -86 216 -107 b 143 -45 183 -107 153 -55 b 0 -23 124 -26 105 -23 z',\n },\n accSagittal5TinasUp: {\n x_min: 0,\n x_max: 218,\n y_min: 16,\n y_max: 107,\n ha: 91,\n o: 'm 135 23 b 187 45 156 23 168 26 b 249 107 197 55 228 107 b 271 23 262 107 271 86 l 314 23 b 269 150 314 112 298 135 b 204 132 252 158 226 153 b 160 81 183 112 168 88 b 135 68 148 71 147 68 b 89 154 94 68 89 124 l 46 154 b 36 92 45 131 42 105 b 0 68 32 82 23 68 l 0 23 b 68 63 29 23 53 40 b 135 23 84 39 104 23 z',\n },\n accSagittal5TinasDown: {\n x_min: 0,\n x_max: 218,\n y_min: -107,\n y_max: -16,\n ha: 91,\n o: 'm 135 -23 b 68 -63 104 -23 84 -39 b 0 -23 53 -40 29 -23 l 0 -68 b 36 -92 23 -68 32 -82 b 46 -154 42 -105 45 -131 l 89 -154 b 135 -68 89 -124 94 -68 b 160 -81 147 -68 148 -71 b 204 -132 168 -88 183 -112 b 269 -150 226 -153 252 -158 b 314 -23 298 -135 314 -112 l 271 -23 b 249 -107 271 -86 262 -107 b 187 -45 228 -107 197 -55 b 135 -23 168 -26 156 -23 z',\n },\n accSagittal6TinasUp: {\n x_min: -7,\n x_max: 218,\n y_min: 16,\n y_max: 106.31676725154982,\n ha: 90.31676725154982,\n o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 207 65 179 23 200 55 b 252 107 223 86 240 107 b 271 23 264 107 272 86 l 314 23 b 269 150 314 112 298 135 b 203 130 252 158 220 150 b 173 92 190 115 181 104 b 134 150 167 127 154 140 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z',\n },\n accSagittal6TinasDown: {\n x_min: -7,\n x_max: 218,\n y_min: -106.31676725154983,\n y_max: -16,\n ha: 90.31676725154983,\n o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 173 -92 154 -140 167 -127 b 203 -130 181 -104 190 -115 b 269 -150 220 -150 252 -158 b 314 -23 298 -135 314 -112 l 271 -23 b 252 -107 272 -86 264 -107 b 207 -65 240 -107 223 -86 b 179 -23 200 -55 179 -23 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z',\n },\n accSagittal7TinasUp: {\n x_min: 0,\n x_max: 281,\n y_min: 16,\n y_max: 106.69999999999997,\n ha: 90.69999999999997,\n o: 'm 0 68 l 0 23 b 143 45 105 23 124 26 b 203 107 153 55 183 107 b 226 23 216 107 226 86 l 269 23 b 298 65 269 23 291 55 b 343 107 314 86 331 107 b 361 23 354 107 363 86 l 405 23 b 360 150 405 112 389 135 b 294 130 343 158 311 150 b 264 92 281 115 272 104 b 225 150 258 127 245 140 b 160 132 207 158 181 153 b 115 81 138 112 124 88 b 0 68 104 71 94 68 z',\n },\n accSagittal7TinasDown: {\n x_min: 0,\n x_max: 281,\n y_min: -106.69999999999999,\n y_max: -16,\n ha: 90.69999999999999,\n o: 'm 0 -68 b 115 -81 94 -68 104 -71 b 160 -132 124 -88 138 -112 b 225 -150 181 -153 207 -158 b 264 -92 245 -140 258 -127 b 294 -130 272 -104 281 -115 b 360 -150 311 -150 343 -158 b 405 -23 389 -135 405 -112 l 361 -23 b 343 -107 363 -86 354 -107 b 298 -65 331 -107 314 -86 b 269 -23 291 -55 269 -23 l 226 -23 b 203 -107 226 -86 216 -107 b 143 -45 183 -107 153 -55 b 0 -23 124 -26 105 -23 z',\n },\n accSagittal8TinasUp: {\n x_min: 0,\n x_max: 312,\n y_min: 16,\n y_max: 107,\n ha: 91,\n o: 'm 135 23 b 187 45 156 23 168 26 b 249 107 197 55 228 107 b 271 23 262 107 271 86 l 314 23 b 343 65 314 23 336 55 b 387 107 359 86 376 107 b 406 23 399 107 408 86 l 449 23 b 405 150 449 112 433 135 b 338 130 387 158 356 150 b 308 92 325 115 317 104 b 269 150 302 127 289 140 b 204 132 252 158 226 153 b 160 81 183 112 168 88 b 135 68 148 71 147 68 b 89 154 94 68 89 124 l 46 154 b 36 92 45 131 42 105 b 0 68 32 82 23 68 l 0 23 b 68 63 29 23 53 40 b 135 23 84 39 104 23 z',\n },\n accSagittal8TinasDown: {\n x_min: 0,\n x_max: 312,\n y_min: -107,\n y_max: -16,\n ha: 91,\n o: 'm 135 -23 b 68 -63 104 -23 84 -39 b 0 -23 53 -40 29 -23 l 0 -68 b 36 -92 23 -68 32 -82 b 46 -154 42 -105 45 -131 l 89 -154 b 135 -68 89 -124 94 -68 b 160 -81 147 -68 148 -71 b 204 -132 168 -88 183 -112 b 269 -150 226 -153 252 -158 b 308 -92 289 -140 302 -127 b 338 -130 317 -104 325 -115 b 405 -150 356 -150 387 -158 b 449 -23 433 -135 449 -112 l 406 -23 b 387 -107 408 -86 399 -107 b 343 -65 376 -107 359 -86 b 314 -23 336 -55 314 -23 l 271 -23 b 249 -107 271 -86 262 -107 b 187 -45 228 -107 197 -55 b 135 -23 168 -26 156 -23 z',\n },\n accSagittal9TinasUp: {\n x_min: -7,\n x_max: 312,\n y_min: 16,\n y_max: 106.31676725154982,\n ha: 90.31676725154982,\n o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 207 65 179 23 200 55 b 252 107 223 86 240 107 b 271 23 264 107 272 86 l 314 23 b 343 65 314 23 336 55 b 387 107 359 86 376 107 b 406 23 399 107 408 86 l 449 23 b 405 150 449 112 433 135 b 338 130 387 158 356 150 b 308 92 325 115 317 104 b 269 150 302 127 289 140 b 203 130 252 158 220 150 b 173 92 190 115 181 104 b 134 150 167 127 154 140 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z',\n },\n accSagittal9TinasDown: {\n x_min: -7,\n x_max: 312,\n y_min: -106.31676725154983,\n y_max: -16,\n ha: 90.31676725154983,\n o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 173 -92 154 -140 167 -127 b 203 -130 181 -104 190 -115 b 269 -150 220 -150 252 -158 b 308 -92 289 -140 302 -127 b 338 -130 317 -104 325 -115 b 405 -150 356 -150 387 -158 b 449 -23 433 -135 449 -112 l 406 -23 b 387 -107 408 -86 399 -107 b 343 -65 376 -107 359 -86 b 314 -23 336 -55 314 -23 l 271 -23 b 252 -107 272 -86 264 -107 b 207 -65 240 -107 223 -86 b 179 -23 200 -55 179 -23 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z',\n },\n accSagittalFractionalTinaUp: {\n x_min: -3,\n x_max: 35,\n y_min: 73,\n y_max: 111,\n ha: 38,\n o: 'm -4 132 b 23 105 -4 118 9 105 b 50 132 37 105 50 118 b 23 160 50 147 37 160 b -4 132 9 160 -4 147 z',\n },\n accSagittalFractionalTinaDown: {\n x_min: -3,\n x_max: 35,\n y_min: -111,\n y_max: -73,\n ha: 38,\n o: 'm -4 -132 b 23 -160 -4 -147 9 -160 b 50 -132 37 -160 50 -147 b 23 -105 50 -118 37 -105 b -4 -132 9 -105 -4 -118 z',\n },\n accidentalNarrowReversedFlat: {\n x_min: 0,\n x_max: 164,\n y_min: -194,\n y_max: 421,\n ha: 615,\n o: 'm 236 -279 l 236 606 l 192 606 l 192 179 b 85 243 150 222 114 243 b 0 84 23 243 0 134 b 112 -158 0 3 37 -78 z m 192 112 l 192 -163 l 135 -98 b 82 40 101 -50 82 -3 b 138 144 82 73 96 144 b 192 112 153 144 170 132 z',\n },\n accidentalNarrowReversedFlatAndFlat: {\n x_min: 0,\n x_max: 414,\n y_min: -194,\n y_max: 421,\n ha: 615,\n o: 'm 281 606 l 281 -268 l 438 -158 b 596 84 547 -82 596 3 b 475 243 596 154 556 243 b 325 179 435 243 384 222 l 325 606 z m 235 -279 l 235 606 l 190 606 l 190 179 b 85 243 148 222 114 243 b 12 158 52 243 27 215 b 0 84 3 134 0 108 b 112 -158 0 3 37 -78 z m 325 111 b 410 144 359 132 386 144 b 498 36 462 144 498 84 b 413 -107 498 -9 469 -58 l 325 -173 z m 192 112 l 192 -163 l 135 -98 b 81 40 99 -50 81 -3 b 91 94 81 59 84 76 b 137 144 102 127 118 144 b 192 112 153 144 170 132 z',\n },\n accidentalWilsonPlus: {\n x_min: 0,\n x_max: 281,\n y_min: -203,\n y_max: 203,\n ha: 406,\n o: 'm 405 268 l 225 98 l 225 292 l 180 292 l 180 56 l 0 -112 l 0 -268 l 180 -98 l 180 -292 l 225 -292 l 225 -56 l 405 112 z',\n },\n accidentalWilsonMinus: {\n x_min: 0,\n x_max: 281,\n y_min: -186,\n y_max: 186,\n ha: 372,\n o: 'm 0 112 l 405 -268 l 405 -112 l 0 268 z',\n },\n },\n fontFamily: 'Bravura',\n resolution: 1000,\n generatedOn: '2021-12-06T21:04:30.234Z',\n};\n","/**\n * The Bravura font was created by Daniel Spreadbury @ Steinberg.\n * https://github.com/steinbergmedia/bravura/\n */\nexport const BravuraMetrics = {\n name: 'Bravura',\n smufl: true,\n stave: {\n padding: 12,\n endPaddingMax: 10,\n endPaddingMin: 5,\n unalignedNotePadding: 10,\n },\n accidental: {\n noteheadAccidentalPadding: 1,\n leftPadding: 2,\n accidentalSpacing: 3,\n },\n clef: {\n default: {\n point: 32,\n width: 26,\n },\n small: {\n point: 26,\n width: 20,\n },\n annotations: {\n '8va': {\n smuflCode: 'timeSig8',\n default: {\n point: 18,\n treble: {\n line: -1.4,\n shiftX: 12,\n },\n },\n small: {\n point: 16,\n treble: {\n line: -0.2,\n shiftX: 8,\n },\n },\n },\n '8vb': {\n smuflCode: 'timeSig8',\n default: {\n point: 18,\n treble: {\n line: 6,\n shiftX: 10,\n },\n bass: {\n line: 3.5,\n shiftX: 1,\n },\n },\n small: {\n point: 16,\n treble: {\n line: 5.3,\n shiftX: 6,\n },\n bass: {\n line: 3.1,\n shiftX: 0.5,\n },\n },\n },\n },\n // These may no longer be necessary\n lineCount: {\n '8': { point: 55, shiftY: 14 },\n '7': { point: 47, shiftY: 8 },\n '6': { point: 32, shiftY: 1 },\n '5': { point: 30, shiftY: -6 },\n '4': { point: 23, shiftY: -12 },\n },\n },\n parenthesis: {\n default: {\n point: 39,\n width: 7,\n },\n gracenote: {\n point: (39 * 3) / 5,\n width: 3,\n },\n },\n pedalMarking: {\n up: {\n point: 40,\n },\n down: {\n point: 34,\n },\n },\n // These are for numeric digits, such as in time signatures\n digits: {\n // used by timesig\n shiftLine: -1,\n point: 34,\n // used by tuplets\n tupletPoint: 22,\n shiftY: -6,\n },\n articulation: {\n articStaccatissimoAbove: {\n padding: 2,\n },\n articStaccatissimoBelow: {\n padding: 2,\n },\n },\n tremolo: {\n default: {\n point: 25,\n spacing: 5,\n offsetYStemUp: -5,\n offsetYStemDown: 5,\n offsetXStemUp: 11,\n offsetXStemDown: 1,\n },\n grace: {\n point: 18,\n spacing: 4,\n offsetYStemUp: -5,\n offsetYStemDown: 5,\n offsetXStemUp: 7,\n offsetXStemDown: 1,\n },\n },\n staveRepetition: {\n default: {\n offsetY: 25,\n offsetSymbol: 12,\n spacing: 5,\n },\n },\n // noteHead: {\n // },\n stem: {\n heightAdjustmentForFlag: -3,\n // These are stem (Y) offsets to the note heads. To shift the\n // noteheads (x-position) themselves, see glyphs.notehead.custom.\n noteHead: {\n noteheadTriangleUpHalf: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpBlack: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpWhole: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadXHalf: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXBlack: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXWhole: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadHalf: {\n offsetYBaseStemUp: -2.55,\n offsetYBaseStemDown: 2.65,\n },\n noteheadBlack: {\n offsetYBaseStemUp: -2,\n offsetYBaseStemDown: 2,\n },\n noteheadSquareWhite: {\n offsetYBaseStemDown: -5,\n offsetYBaseStemUp: 5,\n },\n },\n },\n // Values under here are used by the Glyph class to reposition and rescale\n // glyphs based on their category. This should be the first stop for\n // custom font glyph repositioning.\n //\n // The glyph loader first looks up a specific set of settings based on the\n // glyph code, and if not found, uses the defaults from the category. See\n // glyphs.textNote for an example of this.\n //\n // Details in Glyph.lookupFontMetrics.\n glyphs: {\n coda: {\n point: 20,\n shiftX: -7,\n shiftY: 8,\n },\n segno: {\n shiftX: -7,\n },\n flag: {\n shiftX: -0.75,\n tabStem: {\n shiftX: -1.75,\n },\n staveTempo: {\n shiftX: -1,\n },\n },\n clef: {\n gClef: {\n default: { scale: 1.1, shiftY: 1 },\n small: { shiftY: 1.5 },\n },\n fClef: {\n default: { shiftY: -0.5 },\n },\n },\n ornament: {\n ornamentTurn: {\n scale: 1.2,\n },\n ornamentTurnSlash: {\n scale: 1.2,\n },\n },\n stringNumber: {\n verticalPadding: 8,\n stemPadding: 2,\n leftPadding: 5,\n rightPadding: 6,\n },\n stroke: {\n arrowheadBlackDown: {\n straight: {\n shiftX: -4.5,\n },\n wiggly: {\n shiftX: -1,\n shiftY: 1,\n },\n },\n arrowheadBlackUp: {\n straight: {\n shiftX: -0.85,\n },\n wiggly: {\n shiftX: -1,\n shiftY: 1,\n },\n },\n },\n textNote: {\n point: 34,\n breathMarkTick: {\n point: 36,\n shiftY: 9,\n },\n breathMarkComma: {\n point: 36,\n },\n segno: {\n point: 30,\n shiftX: -7,\n shiftY: 8,\n },\n coda: {\n point: 20,\n shiftX: -7,\n shiftY: 8,\n },\n ornamentTrill: {\n shiftX: -8,\n shiftY: 8,\n },\n ornamentTurn: {\n point: 42,\n },\n ornamentTurnSlash: {\n point: 42,\n },\n ornamentMordent: {\n shiftX: -8,\n },\n ornamentShortTrill: {\n shiftX: -8,\n },\n },\n noteHead: {\n minPadding: 2,\n standard: {\n restQuarterStemUp: {\n point: 35,\n },\n restQuarterStemDown: {\n point: 35,\n },\n },\n custom: {\n noteheadCircleXStemUp: {\n shiftX: 1.5,\n },\n noteheadCircleXStemDown: {\n shiftX: 0.25,\n },\n noteheadDiamondHalfStemUp: {\n shiftX: 1.5,\n },\n noteheadDiamondBlackStemUp: {\n shiftX: 1.5,\n },\n noteheadDiamondWholeStemUp: {\n shiftX: 1,\n },\n noteheadXHalfStemUp: {\n shiftX: -2,\n },\n noteheadXHalfStemDown: {\n shiftX: 1,\n },\n noteheadXWholeStemUp: {\n shiftX: -4,\n },\n noteheadXWholeStemDown: {\n shiftX: 1,\n },\n noteheadSquareWhiteStemDown: {\n shiftX: 0.25,\n },\n noteheadSquareWhiteStemUp: {\n shiftX: -0.75,\n },\n noteheadSquareBlackStemUp: {\n shiftX: -0.75,\n },\n noteheadTriangleUpWholeStemUp: {\n shiftX: -0.75,\n },\n },\n },\n chordSymbol: {\n global: {\n superscriptOffset: -400,\n subscriptOffset: 300,\n kerningOffset: -250,\n lowerKerningText: ['D', 'F', 'P', 'T', 'V', 'Y'],\n upperKerningText: ['A', 'L'],\n spacing: 100,\n superSubRatio: 0.66,\n },\n csymDiminished: {\n scale: 0.8,\n leftSideBearing: -32,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymHalfDiminished: {\n scale: 0.8,\n leftSideBearing: -32,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymAugmented: {\n scale: 1,\n leftSideBearing: 0,\n advanceWidth: 530,\n yOffset: 0,\n },\n csymParensLeftTall: {\n scale: 0.8,\n leftSideBearing: -20,\n advanceWidth: 184,\n yOffset: 250,\n },\n csymParensRightTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 189,\n yOffset: 250,\n },\n csymBracketLeftTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 328,\n yOffset: 0,\n },\n csymBracketRightTall: {\n scale: 0.8,\n leftSideBearing: 1,\n advanceWidth: 600,\n yOffset: 0,\n },\n csymParensLeftVeryTall: {\n scale: 0.9,\n leftSideBearing: 50,\n advanceWidth: 121,\n yOffset: 350,\n },\n csymParensRightVeryTall: {\n scale: 0.9,\n leftSideBearing: 0,\n advanceWidth: 111,\n yOffset: 350,\n },\n csymDiagonalArrangementSlash: {\n scale: 0.6,\n leftSideBearing: -1,\n advanceWidth: 990,\n yOffset: 0,\n },\n csymMinor: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 482,\n yOffset: 0,\n },\n csymMajorSeventh: {\n scale: 0.9,\n leftSideBearing: 200,\n yOffset: 0,\n advanceWidth: 600,\n },\n accidentalSharp: {\n scale: 0.75,\n leftSideBearing: 20,\n advanceWidth: 250,\n yOffset: -302,\n },\n accidentalFlat: {\n scale: 0.9,\n leftSideBearing: -20,\n advanceWidth: 226,\n yOffset: -184,\n },\n },\n jazzOrnaments: {\n brassScoop: {\n scale: 1.0,\n xOffset: -12,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 10,\n },\n brassDoitMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 15,\n },\n brassFallLipShort: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassLiftMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 5,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassFallRoughMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 28,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassBend: {\n scale: 1.0,\n xOffset: 2,\n yOffset: -8,\n stemUpYOffset: 25,\n reportedWidth: 5,\n },\n brassMuteClosed: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -8,\n stemUpYOffset: 25,\n reportedWidth: 5,\n },\n brassMuteOpen: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -7,\n stemUpYOffset: 25,\n reportedWidth: 5,\n },\n brassFlip: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassJazzTurn: {\n scale: 1.0,\n xOffset: 6,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassSmear: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n },\n tuplet: {\n noteHeadOffset: 20,\n stemOffset: 10,\n bottomLine: 4,\n topModifierOffset: 15,\n },\n },\n};\n","export const CustomFont = {\n resolution: 1000,\n fontFamily: 'VexFlowCustom',\n glyphs: {\n noteheadSquareWhite: {\n x_min: 0,\n x_max: 430.75,\n ha: 386,\n o: 'm 0 200 l 0 -200 l 430 -200 l 430 200 l 0 200 l 50 150 l 380 150 l 380 -150 l 50 -150 l 50 150 ',\n },\n noteheadSquareBlack: {\n x_min: 0,\n x_max: 430.75,\n ha: 386,\n o: 'm 0 200 l 0 -200 l 430 -200 l 430 200 l 0 200 ',\n },\n accidentalBuyukMucennebFlat: {\n x_min: -171.5,\n x_max: 251.8125,\n ha: 257,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 553 20 616 20 614 b 20 491 20 503 20 491 l 20 491 b 153 535 47 501 149 535 b 174 514 167 535 174 524 b 164 496 174 508 171 501 b 92 470 164 495 132 484 l 20 445 l 20 390 b 20 363 20 378 20 370 b 20 333 20 340 20 333 l 20 333 b 153 377 47 344 149 377 b 174 356 167 377 174 367 b 164 338 174 349 171 342 b 92 312 164 338 132 326 l 20 288 l 20 219 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 30 -21 -212 -21 -212 b -21 273 -21 163 -21 273 b -84 252 -21 273 -50 263 b -152 230 -133 234 -145 230 b -157 231 -155 230 -156 231 b -171 252 -166 234 -171 244 b -160 270 -171 259 -167 266 b -27 316 -159 270 -93 294 l -21 319 l -21 374 b -21 431 -21 406 -21 431 b -84 409 -21 431 -50 421 b -152 388 -133 392 -145 388 b -157 390 -155 388 -156 388 b -171 409 -166 392 -171 401 b -160 428 -171 417 -167 424 b -27 474 -159 428 -93 451 l -21 476 l -21 546 b -20 620 -21 614 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ',\n },\n accidentalBakiyeFlat: {\n x_min: -176.9375,\n x_max: 251.8125,\n ha: 257,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 503 20 616 20 614 b 20 391 20 442 20 391 b 84 424 20 391 49 406 l 147 456 l 152 456 b 153 456 153 456 153 456 b 175 435 166 456 175 446 b 172 427 175 433 174 430 b 92 380 170 420 172 421 l 20 342 l 20 245 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 54 -21 -212 -21 -212 b -21 322 -21 201 -21 322 b -85 290 -21 322 -50 308 l -148 256 l -153 256 b -155 256 -155 256 -155 256 b -176 277 -167 256 -176 266 b -174 285 -176 280 -175 283 b -93 333 -171 294 -174 292 l -21 370 l -21 494 b -20 620 -21 616 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ',\n },\n accidentalKucukMucennebSharp: {\n x_min: -1.359375,\n x_max: 255.890625,\n ha: 261,\n o: 'm 118 514 b 127 517 121 517 122 517 b 147 505 136 517 142 513 l 148 502 l 148 403 b 148 306 148 351 148 306 b 174 315 149 306 160 310 l 200 324 l 205 323 b 223 312 213 323 220 319 l 225 308 l 225 260 b 225 245 225 255 225 249 b 220 204 225 208 224 209 b 179 188 216 199 215 199 l 148 177 l 148 124 l 148 70 l 189 84 b 236 98 219 94 230 98 b 247 94 240 98 243 97 b 255 52 254 88 255 87 b 255 33 255 47 255 40 l 254 -12 l 253 -15 b 249 -22 253 -18 250 -20 l 245 -24 l 196 -41 l 148 -58 l 148 -108 b 148 -158 148 -136 148 -158 b 174 -148 148 -158 160 -154 b 204 -140 198 -140 200 -140 l 204 -140 b 224 -152 213 -140 221 -145 b 225 -201 224 -155 225 -177 b 224 -254 225 -226 224 -251 b 157 -284 220 -262 220 -262 l 148 -288 l 148 -395 l 148 -503 l 147 -506 b 127 -519 142 -514 134 -519 b 107 -506 119 -519 111 -514 l 106 -503 l 106 -403 b 106 -303 106 -316 106 -303 b 104 -303 104 -303 104 -303 b 88 -310 104 -303 96 -306 l 63 -319 b 51 -322 59 -320 55 -322 b 36 -315 46 -322 40 -319 b 31 -273 32 -309 31 -312 b 31 -258 31 -269 31 -263 l 31 -210 l 34 -206 b 40 -198 35 -204 38 -199 b 74 -186 42 -197 57 -191 l 106 -173 l 106 -123 b 106 -97 106 -112 106 -104 b 106 -72 106 -76 106 -72 b 104 -72 106 -72 106 -72 b 20 -99 89 -79 23 -99 b 0 -84 10 -99 2 -93 b -1 -37 0 -81 -1 -59 b 0 11 -1 -15 0 9 b 58 40 4 22 2 22 l 106 56 l 106 109 b 106 123 106 115 106 119 b 106 162 106 147 106 162 b 81 155 106 162 93 159 b 50 147 65 149 55 147 b 36 152 43 147 40 148 b 31 194 32 158 31 156 b 31 209 31 198 31 204 l 31 256 l 34 260 b 76 281 38 269 38 269 l 106 292 l 106 396 l 106 502 l 107 505 b 118 514 110 509 114 513 ',\n },\n accidentalKoron: {\n x_min: -20,\n x_max: 320,\n ha: 257,\n o: 'm -8 200 b -8 210 8 200 16 200 l 20 148 -199 l 23 -615 b 0 -629 9 -629 6 -629 l -21 -612 l -21 -201 l -21 216 l -20 200 m 16 200 l 310 0 l 240 0 l 16 140 l 16 -120 l 240 0 l 310 0 l 16 -200 ',\n },\n accidentalSori: {\n x_min: -10.890625,\n x_max: 299.4375,\n ha: 294,\n o: 'm 44 174 b 51 174 47 174 49 174 b 68 173 55 174 61 174 l 287 112 l 551 40 b 615 20 617 22 609 23 b 626 0 622 16 626 8 b 615 -22 626 -9 622 -18 b 613 -23 613 -23 613 -23 b 613 -23 613 -23 613 -23 b 287 -113 613 -24 597 -29 l 68 -174 b 53 -176 61 -176 57 -176 b 39 -172 47 -176 43 -174 b 27 -151 31 -167 27 -159 b 39 -129 27 -141 31 -133 b 230 -74 43 -124 20 -131 l 370 -36 l 468 -9 b 498 0 484 -4 498 -1 b 468 8 498 0 484 2 l 370 34 l 230 73 b 40 126 28 129 43 124 b 27 149 31 131 27 140 b 44 174 27 161 34 170 m 205 110 l 205 300 b 205 330 245 330 245 300 l 245 300 l 245 -300 b 245 -330 205 -330 205 -300 l 205 -300 l 205 110 l 345 90 m 345 90 l 345 330 b 345 360 385 360 385 330 l 385 330 l 385 -270 b 385 -300 345 -300 345 -270 l 345 -270 l 345 90 ',\n },\n vexAccidentalMicrotonal2: {\n x_min: -1.359375,\n x_max: 386.5625,\n ha: 394,\n o: 'm 249 535 b 257 537 251 537 253 537 b 276 524 266 537 273 533 l 277 521 l 279 419 l 279 316 l 304 323 b 337 328 319 326 330 328 b 353 316 347 328 349 324 b 355 266 355 315 355 290 b 353 215 355 241 355 217 b 319 198 349 206 347 205 b 279 187 284 190 279 188 b 279 156 279 187 279 174 b 279 136 279 151 279 144 l 279 84 l 289 87 l 330 98 b 367 105 352 102 362 105 b 378 101 372 105 375 104 b 386 61 385 95 386 94 b 386 40 386 55 386 48 l 386 -5 l 385 -8 b 374 -19 383 -12 378 -18 b 291 -40 372 -19 347 -26 b 279 -43 284 -41 279 -43 b 279 -83 279 -43 279 -59 b 279 -95 279 -87 279 -91 l 279 -145 l 304 -140 b 337 -133 321 -136 330 -133 b 349 -140 343 -133 347 -136 b 355 -181 355 -145 355 -142 l 355 -197 l 355 -210 b 349 -252 355 -249 355 -247 b 300 -269 345 -258 347 -258 b 280 -274 291 -272 281 -273 l 279 -274 l 277 -378 l 277 -483 l 276 -487 b 257 -499 273 -495 265 -499 b 238 -487 249 -499 242 -495 l 236 -483 l 236 -384 l 236 -285 l 235 -285 l 212 -291 l 170 -301 b 148 -308 159 -305 148 -306 b 147 -415 147 -308 147 -313 l 147 -523 l 145 -526 b 126 -538 141 -534 133 -538 b 106 -526 118 -538 110 -534 l 104 -523 l 104 -420 b 103 -317 104 -326 104 -317 b 103 -317 103 -317 103 -317 b 50 -330 92 -322 54 -330 b 31 -317 42 -330 35 -326 b 29 -267 29 -315 29 -315 l 29 -219 l 32 -216 b 92 -192 36 -206 36 -206 l 104 -190 l 104 -138 b 103 -87 104 -91 104 -87 b 103 -87 103 -87 103 -87 b 88 -91 103 -87 96 -88 l 49 -101 b 17 -106 32 -105 23 -106 b 6 -102 13 -106 10 -105 b -1 -62 0 -97 -1 -95 b 0 -41 -1 -56 0 -49 l 0 4 l 1 6 b 10 16 2 11 6 15 b 91 37 12 18 38 24 l 104 41 l 104 93 b 103 144 104 140 104 144 b 103 144 103 144 103 144 b 50 131 92 141 54 131 b 31 144 42 131 35 137 b 29 195 29 147 29 148 l 29 242 l 32 245 b 92 269 36 255 36 255 l 104 273 l 104 377 l 104 481 l 106 485 b 126 498 110 492 118 498 b 134 495 129 498 132 496 b 145 485 138 494 142 489 l 147 481 l 147 383 l 147 283 l 152 284 b 190 294 155 285 171 290 l 230 303 l 236 305 l 236 413 l 236 521 l 238 524 b 249 535 240 528 243 533 m 236 126 b 235 177 236 154 236 177 l 235 177 b 213 172 235 177 225 174 l 170 161 b 147 155 157 158 147 155 b 147 124 147 155 147 142 b 147 102 147 117 147 111 l 147 52 l 153 54 l 228 72 l 236 74 l 236 126 m 236 -105 b 235 -54 236 -65 236 -54 l 235 -54 b 231 -55 235 -54 234 -54 b 172 -69 227 -55 204 -62 l 149 -76 l 147 -76 l 147 -127 l 147 -179 l 152 -177 b 190 -167 155 -177 171 -173 l 230 -158 l 236 -156 l 236 -105 ',\n },\n vexAccidentalMicrotonal3: {\n x_min: 0,\n x_max: 430.75,\n ha: 360,\n o: 'm -146 537 b -138 538 -143 538 -141 538 b -118 525 -129 538 -121 533 b -117 390 -117 522 -117 521 b -115 259 -117 268 -117 259 b -115 259 -115 259 -115 259 b -59 272 -104 263 -62 272 b -39 259 -50 272 -42 267 b -37 209 -38 257 -37 233 b -39 159 -37 185 -38 162 b -85 138 -43 149 -44 149 l -117 131 l -117 21 b -115 -88 -117 -80 -117 -88 b -115 -88 -115 -88 -115 -88 b -59 -75 -104 -84 -62 -75 b -44 -81 -52 -75 -48 -77 b -38 -124 -38 -87 -38 -85 b -38 -138 -38 -124 -38 -138 b -38 -152 -38 -138 -38 -152 b -44 -195 -38 -191 -38 -190 b -85 -209 -48 -200 -48 -200 l -117 -217 l -117 -349 b -118 -486 -117 -481 -117 -482 b -138 -499 -121 -494 -129 -499 b -153 -493 -143 -499 -149 -497 b -159 -415 -158 -487 -159 -496 b -159 -355 -159 -398 -159 -379 b -159 -227 -159 -284 -159 -227 b -205 -238 -159 -227 -180 -232 b -250 -249 -230 -244 -250 -249 b -251 -386 -251 -249 -251 -311 b -252 -525 -251 -521 -251 -522 b -272 -538 -255 -534 -264 -538 b -287 -532 -277 -538 -283 -536 b -293 -452 -292 -527 -293 -536 b -293 -391 -293 -436 -293 -415 b -294 -260 -293 -269 -293 -260 b -294 -260 -294 -260 -294 -260 b -348 -272 -306 -264 -345 -272 b -368 -259 -357 -272 -365 -267 b -369 -209 -369 -257 -369 -233 b -368 -159 -369 -185 -369 -162 b -323 -139 -364 -149 -362 -148 l -293 -131 l -293 -22 b -294 87 -293 80 -293 87 b -294 87 -294 87 -294 87 b -348 75 -306 84 -345 75 b -368 88 -357 75 -365 80 b -369 138 -369 91 -369 114 b -368 188 -369 162 -369 186 b -323 209 -364 198 -362 199 l -293 216 l -293 349 b -292 486 -293 481 -293 482 b -272 499 -288 494 -280 499 b -257 493 -266 499 -261 497 b -251 414 -251 487 -251 496 b -251 354 -251 398 -251 378 b -251 226 -251 284 -251 226 b -205 238 -250 226 -230 231 b -159 249 -180 244 -159 249 b -159 385 -159 249 -159 310 b -157 525 -159 521 -159 522 b -146 537 -156 530 -151 535 z m -159 11 b -159 120 -159 98 -159 120 l -159 120 b -175 116 -160 120 -167 119 b -221 105 -184 114 -204 109 l -251 98 l -251 -12 b -251 -121 -251 -72 -251 -121 b -205 -110 -250 -121 -230 -116 b -159 -99 -180 -104 -159 -99 b -159 11 -159 -99 -159 -49 z m 89 517 b 97 519 92 518 94 519 b 117 505 106 519 114 513 b 119 376 119 502 119 501 l 119 249 l 145 258 b 176 267 169 266 172 267 b 177 267 176 267 177 267 b 196 255 186 267 192 263 l 197 252 l 197 205 b 197 181 197 195 197 187 b 193 149 197 153 197 153 b 152 131 190 144 187 143 l 119 120 l 119 10 b 119 -100 119 -62 119 -100 b 145 -91 120 -100 131 -96 b 173 -82 159 -86 171 -82 b 176 -81 174 -81 175 -81 b 196 -94 185 -81 193 -87 b 198 -151 197 -97 198 -125 b 197 -194 198 -172 197 -192 b 153 -218 193 -203 192 -204 l 119 -230 l 119 -367 l 118 -504 l 117 -507 b 97 -519 113 -514 105 -519 b 82 -512 92 -519 87 -517 b 76 -434 77 -507 76 -516 b 76 -374 76 -418 76 -398 b 76 -245 76 -303 76 -245 b 52 -254 76 -245 65 -249 b 19 -263 34 -260 25 -263 b 6 -257 13 -263 10 -261 b 0 -214 0 -251 0 -253 b 0 -200 0 -210 0 -205 b 0 -188 0 -196 0 -192 b 6 -143 0 -147 0 -149 b 46 -126 10 -139 10 -139 l 76 -115 l 76 -5 b 76 106 76 56 76 106 b 51 98 76 106 64 102 b 18 89 34 92 25 89 b 6 95 13 89 10 91 b 0 139 0 101 0 99 b 0 153 0 143 0 148 b 0 179 0 163 0 172 b 44 225 0 215 3 211 l 76 236 l 76 369 b 78 505 76 501 76 502 b 89 517 80 510 85 515 z ',\n },\n vexAccidentalMicrotonal4: {\n x_min: 0,\n x_max: 430.75,\n ha: 360,\n o: 'm 283 633 b 291 634 286 634 289 634 b 311 621 300 634 308 629 b 313 505 313 618 313 617 b 313 393 313 443 313 393 b 378 425 313 393 343 407 l 443 458 l 448 458 b 449 458 449 458 449 458 b 471 437 462 458 471 448 b 469 429 471 434 470 432 b 387 382 466 421 469 423 l 313 344 l 313 247 l 313 150 l 315 152 b 433 201 353 184 394 201 b 479 193 448 201 464 198 b 549 86 524 177 549 135 b 526 1 549 59 541 29 b 395 -143 504 -39 475 -71 b 316 -214 351 -182 341 -191 b 292 -229 302 -228 300 -229 b 272 -216 283 -229 275 -224 b 271 55 271 -212 271 -212 b 270 323 271 203 270 323 b 205 291 270 323 241 308 l 140 258 l 135 258 b 134 258 135 258 134 258 b 112 279 121 258 112 267 b 114 287 112 281 113 284 b 196 334 117 295 114 293 l 271 371 l 271 495 b 272 621 271 617 271 618 b 283 633 274 626 279 631 z m 404 133 b 391 134 400 134 395 134 b 384 134 388 134 386 134 b 318 88 358 130 335 114 l 313 81 l 313 -37 l 313 -156 l 316 -152 b 439 83 391 -71 439 22 l 439 84 b 404 133 439 115 430 128 z m -8 633 l -8 633 b 0 634 -6 634 -3 634 b 20 621 8 634 17 629 b 21 384 21 618 21 617 l 21 150 l 24 152 b 141 201 62 184 102 201 b 187 193 157 201 172 198 b 257 86 232 177 257 135 b 234 1 257 59 250 29 b 103 -143 212 -39 183 -71 b 24 -214 60 -182 49 -191 b 0 -229 10 -228 8 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 203 l -21 618 l -20 621 b -8 633 -18 626 -13 631 z m 113 133 l 113 133 b 99 134 109 134 103 134 b 93 134 97 134 94 134 b 26 88 66 130 43 114 l 21 81 l 21 -37 l 21 -156 l 25 -152 b 148 83 99 -71 148 22 l 148 84 b 113 133 148 115 138 128 z ',\n },\n vexNoteHeadRectBlack: {\n x_min: 0,\n x_max: 430.75,\n ha: 360,\n o: 'm 0 150 l 0 -150 l 430 -150 l 430 150 l 0 150 ',\n },\n vexNoteHeadRectWhite: {\n x_min: 0,\n x_max: 430.75,\n ha: 360,\n o: 'm 0 150 l 0 -150 l 430 -150 l 430 150 l 0 150 l 50 100 l 380 100 l 380 -100 l 50 -100 l 50 100',\n },\n },\n};\n","export const CustomMetrics = {\n name: 'VexFlowCustom',\n smufl: false,\n glyphs: {},\n};\n","export const GonvilleFont = {\n glyphs: {\n bracketTop: {\n x_min: 0,\n x_max: 559.421875,\n ha: 571,\n o: 'm 544 204 b 548 204 545 204 547 204 b 559 194 555 204 559 199 b 559 190 559 192 559 191 b 530 156 559 188 556 184 b 462 86 510 134 481 104 b 453 76 458 81 454 77 l 446 70 l 441 65 b 434 59 439 63 436 61 l 427 54 b 409 37 426 51 416 44 b 392 23 398 29 394 26 b 387 19 389 22 387 20 b 379 13 386 19 383 16 l 371 8 l 367 5 l 359 -1 l 337 -16 b 285 -48 319 -29 298 -41 l 279 -52 b 186 -95 255 -66 210 -87 l 175 -99 b 23 -129 127 -117 68 -129 b 17 -129 20 -129 19 -129 b 1 -123 2 -129 2 -129 b 0 -49 0 -122 0 -83 b 0 4 0 -22 0 1 b 27 11 2 9 4 9 b 185 31 78 12 145 20 b 198 34 186 31 193 33 b 314 73 234 44 277 58 b 349 88 328 79 340 84 b 353 90 352 90 353 90 b 363 94 353 90 357 93 b 371 98 367 97 371 98 b 428 129 372 98 413 120 b 461 148 441 136 454 144 b 468 151 464 149 466 151 b 472 154 469 152 470 154 b 481 161 473 155 477 158 b 525 190 490 166 518 186 l 534 197 b 540 201 536 198 539 199 b 544 204 541 202 544 204 ',\n },\n bracketBottom: {\n x_min: 0,\n x_max: 559.421875,\n ha: 571,\n o: 'm 5 127 b 14 127 6 127 9 127 b 51 126 25 127 43 127 b 175 98 93 122 138 112 l 186 94 b 279 51 210 86 255 65 b 285 47 280 51 283 48 b 319 27 291 44 311 31 l 326 22 b 359 0 332 19 352 4 l 367 -6 b 371 -9 368 -6 370 -8 l 379 -15 b 387 -22 383 -18 386 -20 l 398 -30 l 411 -40 l 417 -47 l 427 -55 l 434 -61 b 441 -66 436 -62 439 -65 l 446 -72 l 453 -77 l 462 -87 b 558 -188 490 -113 549 -176 b 559 -195 559 -191 559 -194 b 548 -205 559 -201 555 -205 b 541 -204 547 -205 544 -205 b 534 -198 539 -201 536 -199 l 525 -191 b 481 -162 518 -187 490 -167 b 472 -155 477 -159 472 -156 b 468 -152 470 -155 469 -154 b 461 -149 466 -152 464 -151 b 428 -130 454 -145 441 -137 b 371 -99 413 -122 372 -99 b 363 -95 371 -99 367 -98 b 353 -91 357 -94 353 -91 b 348 -90 353 -91 352 -91 b 332 -81 343 -87 341 -86 b 27 -12 230 -37 127 -13 b 0 -5 4 -11 2 -11 b 0 58 0 -2 0 27 b 0 122 0 88 0 120 b 5 127 1 124 4 126 ',\n },\n barlineTick: {\n x_min: -80.3125,\n x_max: 78.9375,\n ha: 81,\n o: 'm 63 191 b 69 192 65 192 66 192 b 77 188 72 192 76 191 b 78 183 78 187 78 186 b 74 158 78 179 77 172 l 66 115 b 9 -161 49 30 10 -158 b -10 -187 6 -172 -1 -181 b -34 -194 -17 -191 -25 -194 b -80 -147 -58 -194 -80 -174 b -80 -141 -80 -144 -80 -142 b 9 70 -80 -134 -73 -117 l 49 163 b 63 191 59 188 61 190 ',\n },\n breathMarkTick: {\n x_min: -80.3125,\n x_max: 78.9375,\n ha: 81,\n o: 'm 63 191 b 69 192 65 192 66 192 b 77 188 72 192 76 191 b 78 183 78 187 78 186 b 74 158 78 179 77 172 l 66 115 b 9 -161 49 30 10 -158 b -10 -187 6 -172 -1 -181 b -34 -194 -17 -191 -25 -194 b -80 -147 -58 -194 -80 -174 b -80 -141 -80 -144 -80 -142 b 9 70 -80 -134 -73 -117 l 49 163 b 63 191 59 188 61 190 ',\n },\n segno: {\n x_min: -330.75,\n x_max: 329.390625,\n ha: 336,\n o: 'm -133 483 b -117 484 -127 484 -122 484 b 31 373 -51 484 9 440 b 35 348 34 365 35 356 b -25 285 35 313 10 285 b -87 331 -55 285 -76 302 b -167 402 -100 376 -133 402 b -191 398 -175 402 -183 401 b -227 341 -215 388 -227 369 b -225 320 -227 334 -227 327 b -13 74 -209 230 -125 133 b 6 65 -4 70 5 66 l 9 63 l 10 65 b 117 231 12 68 40 112 l 189 341 l 242 424 b 268 460 262 456 264 458 b 283 464 273 463 277 464 b 308 438 296 464 308 453 l 308 437 b 287 396 308 430 308 428 l 95 98 l 59 43 l 58 41 l 65 37 b 253 -156 151 -8 217 -77 b 281 -285 272 -199 281 -244 b 148 -481 281 -381 231 -463 b 115 -485 137 -484 126 -485 b -32 -376 51 -485 -9 -442 b -36 -349 -35 -366 -36 -358 b 25 -287 -36 -315 -12 -287 b 85 -333 54 -287 74 -302 b 166 -403 99 -377 133 -403 b 190 -399 174 -403 182 -402 b 225 -342 215 -390 225 -370 b 224 -322 225 -335 225 -328 b 12 -76 208 -231 125 -134 b -8 -66 2 -72 -6 -68 l -10 -65 l -12 -66 b -118 -231 -13 -68 -42 -113 l -190 -342 l -243 -426 b -269 -462 -264 -458 -265 -458 b -284 -466 -274 -464 -279 -466 b -310 -440 -298 -466 -310 -455 l -310 -438 b -288 -398 -310 -430 -308 -430 l -96 -99 l -59 -44 l -59 -43 l -66 -38 b -281 284 -198 33 -281 158 l -281 284 b -133 483 -281 392 -220 474 m 254 177 b 266 179 258 177 262 179 b 319 149 287 179 307 167 b 329 115 326 140 329 127 b 319 79 329 102 326 90 b 268 51 307 61 287 51 b 221 72 250 51 234 58 b 205 115 210 84 205 99 b 254 177 205 142 223 170 m -281 -54 b -269 -52 -277 -52 -273 -52 b -223 -73 -253 -52 -235 -59 b -206 -116 -212 -84 -206 -101 b -216 -151 -206 -129 -209 -141 b -269 -179 -228 -170 -249 -179 b -314 -159 -285 -179 -302 -173 b -330 -116 -325 -147 -330 -131 b -281 -54 -330 -88 -313 -61 ',\n },\n coda: {\n x_min: -311.6875,\n x_max: 310.328125,\n ha: 317,\n o: 'm -9 388 b -2 390 -8 390 -5 390 b 5 388 1 390 4 390 b 19 378 10 387 16 383 b 23 333 23 371 23 371 b 24 298 23 299 24 298 b 81 276 34 298 65 285 b 213 91 145 240 190 177 b 224 24 217 76 224 36 b 257 24 224 24 235 24 b 299 19 292 24 292 24 b 310 -1 306 15 310 6 b 299 -23 310 -11 306 -19 b 257 -27 292 -27 292 -27 b 224 -29 235 -27 224 -29 b 213 -95 224 -40 217 -80 b 81 -280 190 -181 145 -244 b 24 -301 65 -290 34 -301 b 23 -335 24 -301 23 -303 l 23 -340 b 17 -381 23 -374 23 -374 b -1 -391 13 -388 5 -391 b -21 -381 -9 -391 -17 -388 b -27 -340 -27 -374 -27 -374 l -27 -335 b -28 -301 -27 -303 -27 -301 b -85 -280 -38 -301 -69 -290 b -217 -95 -149 -244 -194 -181 b -228 -29 -221 -80 -228 -40 b -259 -27 -228 -29 -238 -27 b -300 -23 -294 -27 -294 -27 b -311 -2 -307 -19 -311 -11 b -294 23 -311 8 -304 19 b -259 24 -291 23 -284 24 b -228 24 -239 24 -228 24 b -217 91 -228 36 -221 76 b -85 276 -194 177 -149 240 b -28 298 -69 285 -38 298 b -27 333 -27 298 -27 299 b -27 371 -27 362 -27 369 b -9 388 -24 378 -17 385 m -27 136 b -28 247 -27 197 -28 247 b -61 216 -31 247 -53 226 b -123 33 -95 172 -121 98 l -125 24 l -76 24 l -27 24 l -27 136 m 29 242 b 24 247 27 245 24 247 b 23 136 24 247 23 197 l 23 24 l 72 24 l 121 24 l 119 33 b 29 242 115 116 77 206 m -27 -140 l -27 -27 l -76 -27 l -125 -27 l -123 -36 b -61 -220 -121 -102 -95 -176 b -28 -251 -53 -230 -31 -251 b -27 -140 -28 -251 -27 -201 m 119 -36 l 121 -27 l 72 -27 l 23 -27 l 23 -140 b 24 -251 23 -201 24 -251 b 57 -220 27 -251 49 -230 b 119 -36 91 -176 117 -102 ',\n },\n gClef: {\n x_min: -1.359375,\n x_max: 847.96875,\n ha: 865,\n o: 'm 488 1499 b 495 1500 490 1500 492 1500 b 541 1465 507 1500 521 1490 b 679 1078 622 1372 679 1210 b 677 1050 679 1068 677 1060 b 477 642 668 893 604 764 l 443 609 l 431 596 l 431 592 l 438 562 l 449 508 l 460 458 b 481 355 475 390 481 355 b 481 355 481 355 481 355 b 490 356 481 355 485 355 b 528 358 495 356 511 358 b 558 356 540 358 552 356 b 839 95 699 338 808 237 b 847 22 845 72 847 47 b 631 -303 847 -113 766 -242 b 620 -309 623 -308 620 -309 l 620 -310 b 631 -359 620 -310 626 -333 l 646 -435 l 660 -496 b 672 -588 668 -535 672 -563 b 664 -653 672 -610 669 -630 b 383 -875 630 -792 509 -875 b 201 -810 321 -875 257 -855 b 129 -680 151 -768 129 -730 b 274 -530 129 -592 200 -530 b 351 -553 300 -530 326 -538 b 412 -669 393 -582 412 -626 b 287 -805 412 -735 366 -800 l 279 -805 l 285 -809 b 383 -830 318 -823 351 -830 b 586 -718 464 -830 540 -789 b 626 -584 612 -678 626 -631 b 619 -528 626 -566 623 -548 b 612 -495 619 -526 616 -510 b 577 -324 590 -387 577 -324 b 577 -324 577 -324 577 -324 b 568 -326 575 -324 571 -324 b 528 -334 558 -328 537 -333 b 465 -338 506 -337 485 -338 b 24 -11 269 -338 87 -206 b -1 145 8 41 -1 93 b 96 442 -1 249 32 351 b 322 714 166 541 236 626 l 352 745 l 345 782 l 332 843 l 315 921 b 303 984 310 950 304 978 b 295 1082 298 1017 295 1049 b 413 1426 295 1208 336 1329 b 488 1499 436 1456 477 1496 m 549 1301 b 541 1301 547 1301 544 1301 b 411 1207 500 1301 447 1263 b 355 1004 374 1152 355 1079 b 359 942 355 984 356 963 b 371 881 362 927 363 917 l 385 818 b 392 782 389 799 392 784 l 392 782 b 434 828 393 782 424 816 b 607 1165 534 941 594 1060 b 608 1193 608 1175 608 1183 b 597 1270 608 1224 604 1254 b 549 1301 589 1286 571 1299 m 398 528 b 393 555 396 542 393 553 b 392 555 393 555 393 555 b 317 470 390 555 347 505 b 190 298 266 408 212 334 b 127 70 148 227 127 148 b 155 -77 127 19 137 -30 b 468 -303 209 -216 333 -303 b 519 -299 484 -303 502 -302 b 568 -284 541 -295 568 -287 l 568 -284 b 563 -263 568 -284 566 -274 l 534 -120 l 511 -13 l 496 61 l 480 133 b 469 187 472 176 469 187 b 468 188 469 187 469 188 b 416 162 462 188 430 172 b 337 13 364 126 337 69 b 413 -124 337 -40 363 -93 b 428 -144 424 -131 428 -137 b 428 -149 428 -145 428 -148 b 409 -166 426 -161 419 -166 b 394 -162 405 -166 400 -165 b 240 77 302 -122 240 -27 l 240 77 b 430 342 240 197 315 301 l 436 344 l 426 394 l 398 528 m 548 194 b 526 195 540 195 532 195 b 519 195 524 195 521 195 l 514 195 l 518 177 l 539 79 l 552 15 l 566 -48 l 594 -187 l 605 -240 b 612 -266 609 -254 611 -266 b 612 -266 612 -266 612 -266 b 641 -248 613 -266 630 -256 b 744 -98 692 -212 730 -156 b 751 -40 749 -79 751 -59 b 548 194 751 76 665 181 ',\n },\n cClef: {\n x_min: 0,\n x_max: 873.828125,\n ha: 892,\n o: 'm 0 0 l 0 703 l 81 703 l 164 703 l 164 0 l 164 -705 l 81 -705 l 0 -705 l 0 0 m 225 0 l 225 703 l 246 703 l 268 703 l 268 366 l 268 30 l 274 36 b 314 79 284 44 302 63 b 413 302 357 137 392 213 b 432 327 419 324 421 327 b 449 306 443 327 447 322 b 611 115 457 195 529 115 b 651 122 624 115 638 117 b 728 316 705 140 724 188 b 729 388 728 342 729 366 b 671 635 729 533 711 602 b 581 662 649 652 616 662 b 477 637 545 662 510 653 l 475 635 l 477 634 b 503 627 488 632 495 631 b 545 556 532 612 545 584 b 491 480 545 524 526 491 b 465 474 481 476 473 474 b 379 563 417 474 379 516 b 389 602 379 576 382 588 b 541 691 409 641 479 681 b 582 694 555 692 568 694 b 865 462 714 694 834 598 b 873 392 871 440 873 416 b 865 317 873 367 871 341 b 639 84 839 194 748 101 b 612 83 630 83 620 83 b 511 116 577 83 543 94 b 504 120 509 119 506 120 b 504 120 504 120 504 120 b 469 59 504 120 488 93 l 432 -1 l 469 -61 b 504 -122 488 -94 504 -122 b 504 -122 504 -122 504 -122 b 511 -117 506 -122 509 -120 b 612 -84 543 -95 577 -84 b 665 -91 630 -84 647 -87 b 869 -338 771 -122 850 -216 b 873 -392 872 -356 873 -374 b 798 -595 873 -469 847 -539 b 581 -695 741 -662 660 -695 b 406 -626 517 -695 454 -671 b 381 -563 389 -607 381 -585 b 465 -477 381 -519 413 -477 b 545 -559 514 -477 545 -519 b 503 -628 545 -587 532 -613 b 477 -635 495 -632 488 -634 l 475 -637 l 477 -638 b 581 -663 510 -655 545 -663 b 671 -637 616 -663 649 -653 b 729 -391 711 -603 729 -534 b 728 -317 729 -367 728 -344 b 623 -117 722 -173 698 -124 b 611 -116 619 -116 615 -116 b 449 -308 528 -116 457 -198 b 432 -328 447 -323 443 -328 b 413 -303 421 -328 419 -326 b 314 -80 392 -215 357 -138 b 274 -37 302 -65 284 -45 l 268 -31 l 268 -367 l 268 -705 l 246 -705 l 225 -705 l 225 0 ',\n },\n fClef: {\n x_min: -1.359375,\n x_max: 899.703125,\n ha: 918,\n o: 'm 307 349 b 332 351 315 351 323 351 b 443 340 367 351 408 347 b 741 47 607 306 720 195 b 744 0 743 31 744 16 b 660 -303 744 -90 713 -206 b 28 -755 534 -531 304 -695 b 14 -756 23 -755 19 -756 b -1 -741 4 -756 -1 -750 b 21 -720 -1 -731 1 -728 b 567 -56 337 -601 548 -344 b 568 -11 568 -41 568 -24 b 442 285 568 129 525 233 b 325 319 406 308 367 319 b 93 177 232 319 137 266 b 84 154 91 170 84 155 b 84 154 84 154 84 154 b 88 156 84 154 85 155 b 159 177 110 170 134 177 b 257 134 194 177 231 162 b 294 41 281 108 294 73 b 171 -97 294 -24 246 -90 b 156 -98 166 -97 161 -98 b 6 74 73 -98 6 -22 b 6 80 6 76 6 79 b 307 349 10 223 141 340 m 839 215 b 845 216 841 216 842 216 b 862 213 852 216 860 215 b 899 163 887 206 899 184 b 872 117 899 145 890 127 b 847 111 865 112 856 111 b 808 130 833 111 818 117 b 796 162 800 140 796 151 b 839 215 796 187 812 212 m 839 -112 b 845 -112 841 -112 842 -112 b 862 -115 852 -112 860 -113 b 899 -165 887 -122 899 -144 b 872 -210 899 -183 890 -201 b 847 -217 865 -215 856 -217 b 808 -198 833 -217 818 -210 b 796 -165 800 -188 796 -177 b 839 -112 796 -140 812 -116 ',\n },\n unpitchedPercussionClef1: {\n x_min: 0,\n x_max: 464.140625,\n ha: 474,\n o: 'm 0 0 l 0 347 l 76 347 l 153 347 l 153 0 l 153 -348 l 76 -348 l 0 -348 l 0 0 m 308 -1 l 308 347 l 386 347 l 464 347 l 464 -1 l 464 -348 l 386 -348 l 308 -348 l 308 -1 ',\n },\n '6stringTabClef': {\n x_min: -1.359375,\n x_max: 680.5625,\n ha: 694,\n o: 'm 597 1042 b 604 1042 600 1042 602 1042 b 642 1002 627 1042 642 1022 b 619 966 642 988 635 974 b 439 927 574 942 503 927 l 426 927 l 426 921 b 430 838 428 893 430 866 b 345 480 430 696 398 560 b 179 391 307 423 249 391 b 156 392 171 391 164 392 b 138 394 149 394 142 394 b 103 434 115 396 103 416 b 129 471 103 451 111 466 b 141 474 133 473 137 474 b 172 459 153 474 164 469 b 181 455 175 456 176 455 b 187 456 182 455 185 455 b 253 520 212 460 234 483 b 315 836 294 605 315 714 b 311 928 315 867 314 898 b 302 945 310 943 311 942 b 245 953 283 950 262 953 b 130 891 193 953 149 931 b 84 860 119 870 102 860 b 36 905 61 860 39 877 b 36 910 36 907 36 909 b 80 970 36 931 50 949 b 249 1017 125 1000 187 1017 b 322 1009 273 1017 299 1014 l 341 1003 b 436 991 372 995 406 991 b 577 1031 495 991 545 1004 b 597 1042 583 1038 590 1041 m 416 360 b 424 360 419 360 421 360 b 481 309 454 360 479 338 b 503 145 484 280 495 199 b 585 -185 525 16 555 -106 b 630 -245 596 -213 613 -237 l 634 -247 l 638 -245 b 647 -244 641 -245 645 -244 b 680 -278 666 -244 680 -262 b 664 -308 680 -290 675 -301 b 638 -312 658 -310 650 -312 b 613 -309 631 -312 623 -310 b 477 -201 555 -303 502 -260 b 417 -2 460 -159 434 -72 b 416 5 417 1 416 5 b 416 5 416 5 416 5 b 411 -5 415 5 413 0 b 359 -97 397 -33 377 -70 b 353 -106 355 -102 353 -105 b 359 -112 353 -108 355 -109 b 409 -130 375 -123 390 -129 b 426 -134 420 -130 421 -131 b 431 -147 428 -137 431 -141 b 420 -162 431 -152 427 -159 b 382 -169 409 -166 396 -169 b 323 -155 363 -169 341 -165 l 317 -152 l 314 -155 b 62 -303 240 -240 148 -295 b 36 -305 55 -305 44 -305 b 23 -303 29 -305 24 -305 b -1 -273 6 -299 -1 -287 b 31 -240 -1 -256 10 -240 b 36 -240 32 -240 34 -240 b 42 -241 38 -241 39 -241 b 134 -204 63 -241 99 -226 b 367 288 265 -115 357 81 b 375 330 368 313 370 320 b 416 360 383 347 400 358 m 360 -359 b 379 -359 363 -359 371 -359 b 424 -360 396 -359 416 -359 b 646 -502 536 -373 624 -430 b 649 -527 649 -510 649 -519 b 530 -673 649 -578 604 -635 l 521 -677 l 529 -681 b 653 -811 592 -714 637 -762 b 660 -853 658 -827 660 -839 b 645 -911 660 -873 656 -892 b 426 -1021 608 -981 519 -1021 b 283 -989 377 -1021 328 -1011 b 235 -949 249 -972 239 -964 b 234 -936 234 -946 234 -941 b 234 -928 234 -934 234 -931 l 235 -925 l 234 -927 l 225 -934 b 87 -982 186 -966 138 -982 b 80 -982 85 -982 83 -982 b 55 -981 70 -981 58 -981 b 17 -943 32 -981 17 -964 b 54 -904 17 -921 35 -904 b 78 -914 62 -904 72 -909 l 83 -918 l 88 -918 b 190 -831 122 -918 166 -881 b 269 -506 242 -727 269 -612 b 268 -462 269 -492 269 -477 b 266 -449 266 -458 266 -452 b 265 -444 266 -445 266 -444 b 257 -446 264 -444 261 -445 b 132 -545 196 -470 152 -505 b 88 -573 122 -563 104 -573 b 39 -523 63 -573 39 -553 b 63 -476 39 -505 44 -494 b 360 -359 136 -408 235 -369 m 419 -424 b 393 -423 411 -423 406 -423 l 375 -423 l 377 -426 b 379 -439 377 -427 378 -434 b 383 -510 382 -463 383 -487 b 314 -811 383 -609 360 -710 b 266 -893 296 -850 285 -870 b 264 -898 265 -896 264 -898 l 264 -898 b 264 -898 264 -898 264 -898 b 268 -898 264 -898 266 -898 b 273 -898 270 -898 272 -898 b 300 -909 283 -898 291 -900 b 426 -957 340 -941 385 -957 b 476 -949 443 -957 460 -954 b 547 -853 522 -931 547 -893 b 485 -745 547 -816 526 -775 b 397 -707 460 -727 432 -714 b 366 -675 375 -703 366 -692 b 396 -642 366 -657 377 -645 b 530 -557 455 -637 511 -601 b 536 -527 534 -548 536 -537 b 419 -424 536 -480 490 -437 ',\n },\n timeSig0: {\n x_min: 0,\n x_max: 514.5,\n ha: 525,\n o: 'm 236 648 b 246 648 238 648 242 648 b 288 646 261 648 283 648 b 472 513 364 634 428 587 b 514 347 502 464 514 413 b 462 163 514 272 499 217 b 257 44 409 83 333 44 b 50 163 181 44 103 83 b 0 347 14 217 0 272 b 40 513 0 413 12 464 b 236 648 87 591 155 638 m 277 614 b 253 616 273 616 261 616 b 242 616 247 616 243 616 b 170 499 193 609 181 589 b 159 348 163 446 159 398 b 166 222 159 308 161 266 b 201 91 174 138 183 106 b 257 76 215 81 235 76 b 311 91 277 76 299 81 b 347 222 330 106 338 138 b 353 348 352 266 353 308 b 344 499 353 398 351 446 b 277 614 333 587 322 606 m 257 -1 l 258 -1 l 255 -1 l 257 -1 m 257 673 l 258 673 l 255 673 l 257 673 ',\n },\n timeSig1: {\n x_min: -1.359375,\n x_max: 344.359375,\n ha: 351,\n o: 'm 126 637 l 129 638 l 198 638 l 266 638 l 269 635 b 274 631 272 634 273 632 l 277 627 l 277 395 b 279 156 277 230 277 161 b 329 88 281 123 295 106 b 344 69 341 81 344 79 b 337 55 344 62 343 59 l 333 54 l 197 54 l 61 54 l 58 55 b 50 69 53 59 50 62 b 65 88 50 79 53 81 b 80 97 72 91 74 93 b 117 156 103 113 112 129 b 117 345 117 161 117 222 l 117 528 l 100 503 l 38 406 b 14 383 24 384 23 383 b -1 398 5 383 -1 390 b 4 415 -1 403 1 409 b 16 437 5 416 10 426 l 72 539 l 100 596 b 121 632 119 631 119 631 b 126 637 122 634 125 635 m 171 -1 l 172 -1 l 170 -1 l 171 -1 m 171 673 l 172 673 l 170 673 l 171 673 ',\n },\n timeSig2: {\n x_min: -1.359375,\n x_max: 458.6875,\n ha: 468,\n o: 'm 197 648 b 216 648 201 648 208 648 b 258 646 232 648 253 648 b 419 546 333 637 393 599 b 432 489 428 528 432 509 b 356 342 432 440 405 384 b 235 278 322 313 288 295 b 69 170 166 256 107 217 b 69 169 69 170 69 169 b 69 169 69 169 69 169 b 74 173 69 169 72 170 b 209 222 112 204 163 222 b 310 195 247 222 274 215 b 371 179 332 184 352 179 b 396 181 379 179 387 179 b 428 202 409 184 423 194 b 442 212 431 209 436 212 b 458 197 450 212 458 206 b 441 148 458 190 449 165 b 299 44 409 84 353 44 b 288 45 295 44 292 44 b 250 61 274 45 268 49 b 122 99 212 86 164 99 b 73 91 104 99 88 97 b 28 63 53 84 34 72 b 14 54 25 56 20 54 b 1 62 9 54 4 56 l -1 65 l -1 79 b 0 99 -1 91 0 95 b 2 113 1 102 2 108 b 164 309 20 197 81 272 b 285 470 232 341 277 398 b 287 487 287 476 287 481 b 171 595 287 551 239 595 b 155 595 166 595 160 595 b 142 592 145 594 142 594 b 145 589 142 592 142 591 b 179 527 168 576 179 551 b 132 455 179 496 163 467 b 104 451 122 452 112 451 b 27 530 62 451 27 487 b 29 555 27 538 27 546 b 197 648 44 601 115 639 m 228 -1 l 230 -1 l 227 -1 l 228 -1 m 228 673 l 230 673 l 227 673 l 228 673 ',\n },\n timeSig3: {\n x_min: -1.359375,\n x_max: 409.6875,\n ha: 418,\n o: 'm 174 648 b 191 648 176 648 183 648 b 225 648 204 648 220 648 b 402 523 317 638 389 588 b 404 503 404 517 404 510 b 402 484 404 495 404 488 b 264 373 389 437 334 394 b 257 370 259 371 257 371 b 257 370 257 370 257 370 b 264 369 258 370 261 369 b 409 202 359 334 409 267 b 318 72 409 152 381 104 b 200 43 281 52 240 43 b 23 113 134 43 69 68 b 0 169 6 129 0 149 b 77 249 0 210 29 249 l 77 249 b 152 174 125 249 152 212 b 103 102 152 145 137 116 b 103 102 103 102 103 102 b 147 94 103 101 132 95 b 153 94 149 94 151 94 b 265 206 219 94 265 141 b 264 226 265 213 265 219 b 147 355 253 299 204 353 b 126 371 133 356 126 362 b 147 388 126 383 132 388 b 254 474 196 391 238 424 b 259 502 258 484 259 494 b 182 592 259 544 228 582 b 156 595 175 595 166 595 b 115 592 142 595 129 594 l 111 591 l 115 588 b 152 524 141 574 152 549 b 92 449 152 491 130 458 b 76 448 87 448 81 448 b -1 530 32 448 -1 488 b 20 581 -1 548 5 566 b 174 648 55 619 108 641 m 204 -1 l 205 -1 l 202 -1 l 204 -1 m 204 673 l 205 673 l 202 673 l 204 673 ',\n },\n timeSig4: {\n x_min: 0,\n x_max: 468.21875,\n ha: 478,\n o: 'm 174 637 b 232 638 175 638 189 638 b 277 638 245 638 259 638 l 378 638 l 381 635 b 389 623 386 632 389 627 b 382 609 389 617 386 613 b 366 589 381 606 372 598 l 313 528 l 245 451 l 209 410 l 155 348 l 84 267 b 59 240 72 252 59 240 b 59 240 59 240 59 240 b 151 238 59 238 68 238 l 242 238 l 242 303 b 243 371 242 369 242 370 b 289 426 245 374 254 385 l 303 441 l 317 456 l 338 483 l 360 506 l 371 520 b 386 527 375 526 381 527 b 400 519 392 527 397 524 b 401 440 401 516 401 514 b 401 377 401 423 401 402 l 401 238 l 426 238 b 453 237 449 238 450 238 b 465 217 461 234 465 226 b 460 202 465 212 464 206 b 426 197 454 197 453 197 l 401 197 l 401 180 b 451 88 402 129 412 109 b 468 69 465 81 468 79 b 461 55 468 62 466 59 l 458 54 l 321 54 l 185 54 l 182 55 b 175 69 176 59 175 62 b 191 88 175 79 176 81 b 240 180 230 109 240 129 l 240 197 l 125 197 b 73 195 104 195 87 195 b 8 197 10 195 9 197 b 0 212 2 199 0 205 b 0 212 0 212 0 212 b 20 242 0 219 0 219 b 163 610 104 344 163 492 b 174 637 163 628 166 634 m 234 -1 l 235 -1 l 232 -1 l 234 -1 m 234 673 l 235 673 l 232 673 l 234 673 ',\n },\n timeSig5: {\n x_min: 0,\n x_max: 409.6875,\n ha: 418,\n o: 'm 47 637 b 53 638 49 638 50 638 b 69 634 55 638 61 637 b 210 610 114 619 161 610 b 363 634 259 610 311 619 b 382 638 372 637 378 638 b 392 634 386 638 389 637 b 397 623 396 630 397 627 b 393 610 397 620 396 616 b 298 505 368 552 338 520 b 212 494 277 498 246 494 b 65 517 163 494 106 502 b 61 517 62 517 61 517 b 61 517 61 517 61 517 b 51 408 61 517 51 412 b 51 408 51 408 51 408 b 51 408 51 408 51 408 b 61 412 53 408 55 409 b 125 434 80 421 103 430 b 185 441 145 440 166 441 b 409 244 310 441 409 353 b 401 191 409 227 406 209 b 197 43 375 105 287 43 b 159 47 183 43 171 44 b 23 123 112 56 61 86 b 0 180 6 140 0 159 b 76 260 0 220 31 260 b 92 259 81 260 87 259 b 152 183 132 251 152 216 b 100 112 152 152 134 122 b 95 111 98 112 95 111 b 95 111 95 111 95 111 b 129 98 95 109 119 101 b 148 97 136 97 141 97 b 264 235 206 97 261 158 b 265 248 265 240 265 244 b 210 398 265 312 243 373 b 179 408 201 406 194 408 b 174 408 178 408 176 408 b 53 369 130 408 88 394 b 34 359 39 359 38 359 b 17 374 24 359 17 365 b 39 628 17 384 38 625 b 47 637 40 631 43 635 m 204 -1 l 205 -1 l 202 -1 l 204 -1 m 204 673 l 205 673 l 202 673 l 204 673 ',\n },\n timeSig6: {\n x_min: 0,\n x_max: 475.03125,\n ha: 485,\n o: 'm 255 648 b 274 648 259 648 266 648 b 314 646 288 648 307 648 b 450 555 374 637 438 594 b 454 530 453 546 454 538 b 375 451 454 485 416 451 b 328 467 359 451 343 455 b 300 526 310 483 300 503 b 352 598 300 557 319 589 b 356 599 355 598 356 599 b 352 602 356 599 355 601 b 288 616 330 612 308 616 b 210 584 257 616 230 605 b 164 433 189 559 174 508 b 160 374 163 415 160 381 b 160 374 160 374 160 374 b 160 374 160 374 160 374 b 168 377 160 374 164 376 b 258 395 200 390 228 395 b 366 367 294 395 328 387 b 475 223 436 333 475 283 b 472 197 475 215 473 206 b 349 65 462 141 419 95 b 259 43 317 51 288 43 b 167 69 230 43 200 52 b 4 290 80 113 20 195 b 0 349 1 309 0 328 b 20 467 0 391 6 433 b 255 648 58 563 155 637 m 269 363 b 257 363 265 363 261 363 b 210 345 236 363 220 356 b 186 226 196 324 186 272 b 187 198 186 216 186 206 b 213 95 191 151 202 112 b 257 76 221 83 238 76 b 270 77 261 76 266 76 b 321 156 299 81 310 99 b 329 229 326 183 329 206 b 321 301 329 252 326 274 b 269 363 311 342 298 359 m 236 -1 l 238 -1 l 235 -1 l 236 -1 m 236 673 l 238 673 l 235 673 l 236 673 ',\n },\n timeSig7: {\n x_min: 0,\n x_max: 442.359375,\n ha: 451,\n o: 'm 147 648 b 166 649 153 649 160 649 b 313 598 217 649 273 630 b 340 587 323 588 328 587 l 341 587 b 412 628 367 587 390 601 b 427 638 416 635 421 638 b 439 632 431 638 435 637 b 442 623 441 630 442 628 b 430 569 442 616 439 603 b 352 369 408 492 377 410 b 300 259 325 324 313 298 b 273 84 283 205 273 140 b 265 55 273 65 272 59 l 261 54 l 181 54 l 99 54 l 96 55 b 91 61 95 56 92 59 l 89 63 l 89 77 b 147 263 89 133 111 202 b 261 401 176 313 212 355 b 378 541 315 449 349 489 l 382 548 l 375 544 b 240 495 333 512 285 495 b 129 535 198 495 160 509 b 84 560 108 552 95 560 b 76 559 81 560 78 560 b 31 487 59 555 43 530 b 14 470 27 473 24 470 b 1 477 8 470 4 471 l 0 480 l 0 553 l 0 627 l 1 630 b 16 638 4 635 9 638 b 23 635 17 638 20 637 b 49 626 36 626 39 626 b 96 638 59 626 80 630 b 104 639 99 638 102 639 b 117 644 107 641 112 642 b 147 648 125 645 137 648 m 220 -1 l 221 -1 l 219 -1 l 220 -1 m 220 673 l 221 673 l 219 673 l 220 673 ',\n },\n timeSig8: {\n x_min: 0,\n x_max: 488.640625,\n ha: 499,\n o: 'm 217 648 b 245 649 225 648 235 649 b 453 516 343 649 430 595 b 458 478 455 503 458 491 b 412 370 458 440 441 398 b 411 369 412 369 411 369 b 415 365 411 367 412 367 b 488 231 462 331 488 281 b 472 165 488 208 483 186 b 243 43 434 86 338 43 b 63 104 178 43 112 62 b 0 233 20 140 0 186 b 73 365 0 283 24 331 l 77 369 l 72 374 b 29 476 42 406 29 441 b 217 648 29 557 103 635 m 258 605 b 242 606 253 605 247 606 b 157 552 198 606 157 580 b 160 541 157 548 159 544 b 319 413 176 503 242 452 l 337 403 l 338 406 b 359 476 352 428 359 452 b 258 605 359 537 318 595 m 138 326 b 130 330 134 328 130 330 b 130 330 130 330 130 330 b 107 305 127 330 112 313 b 84 231 91 281 84 256 b 243 86 84 156 151 86 b 249 87 245 86 246 87 b 347 156 303 88 347 120 b 344 172 347 162 345 167 b 156 319 325 227 257 281 b 138 326 151 322 144 324 m 243 -1 l 245 -1 l 242 -1 l 243 -1 m 243 673 l 245 673 l 242 673 l 243 673 ',\n },\n timeSig9: {\n x_min: 0,\n x_max: 475.03125,\n ha: 485,\n o: 'm 191 646 b 212 649 198 648 205 649 b 255 644 227 649 243 646 b 458 448 348 616 428 539 b 475 342 469 415 475 378 b 460 244 475 308 469 274 b 193 44 421 124 303 44 b 91 69 157 44 122 51 b 19 161 43 97 19 126 b 21 181 19 167 20 174 b 98 241 32 220 65 241 b 170 186 129 241 160 223 b 172 166 171 179 172 173 b 121 94 172 134 152 102 b 117 93 118 94 117 93 b 121 90 117 93 118 91 b 185 76 142 80 164 76 b 270 119 220 76 251 91 b 308 259 287 145 300 194 b 313 317 310 277 313 310 b 313 317 313 317 313 317 b 313 317 313 317 313 317 b 304 315 313 317 308 316 b 216 295 273 302 245 295 b 145 308 193 295 170 299 b 19 398 88 327 42 360 b 0 469 5 420 0 444 b 24 551 0 496 8 526 b 191 646 54 596 125 637 m 227 614 b 215 616 224 616 220 616 b 202 614 210 616 206 616 b 152 535 174 610 163 592 b 144 463 147 509 144 485 b 152 391 144 440 147 417 b 216 328 163 344 179 328 b 280 391 253 328 269 344 b 288 463 285 417 288 440 b 280 535 288 485 285 509 b 227 614 269 594 258 610 m 236 -1 l 238 -1 l 235 -1 l 236 -1 m 236 673 l 238 673 l 235 673 l 236 673 ',\n },\n timeSigCommon: {\n x_min: -1.359375,\n x_max: 556.6875,\n ha: 568,\n o: 'm 294 322 b 318 323 299 322 308 323 b 360 320 334 323 352 322 b 526 217 430 310 490 273 b 543 166 537 202 543 184 b 447 70 543 117 503 70 b 445 70 447 70 446 70 b 359 159 394 72 359 113 b 368 201 359 173 362 187 b 442 245 382 229 412 245 b 455 244 446 245 451 245 b 460 244 458 244 460 244 b 460 244 460 244 460 244 b 454 248 460 244 458 245 b 325 291 417 276 372 291 b 285 287 313 291 299 290 b 144 -2 183 269 144 190 b 281 -290 144 -208 179 -280 b 304 -291 289 -291 298 -291 b 524 -105 412 -291 506 -212 b 541 -84 526 -88 530 -84 b 556 -101 551 -84 556 -90 b 549 -138 556 -111 553 -122 b 334 -322 521 -237 435 -310 b 302 -324 323 -323 313 -324 b 13 -101 172 -324 54 -234 b -1 -1 4 -68 -1 -34 b 294 322 -1 161 121 303 ',\n },\n timeSigCutCommon: {\n x_min: 0,\n x_max: 556.6875,\n ha: 568,\n o: 'm 289 545 b 298 546 292 545 295 546 b 318 533 306 546 315 541 b 319 428 319 530 319 528 l 319 327 l 334 327 b 526 223 412 326 485 285 b 543 172 537 206 543 190 b 447 76 543 122 503 76 b 445 76 446 76 446 76 b 359 165 394 77 359 119 b 368 205 359 179 362 192 b 441 251 382 233 412 251 b 455 249 446 251 451 251 b 460 248 458 249 460 248 b 460 248 460 248 460 248 b 454 254 460 249 458 251 b 334 295 419 280 378 294 l 319 295 l 319 4 l 319 -287 l 321 -285 b 328 -285 322 -285 325 -285 b 524 -99 424 -277 507 -198 b 541 -79 526 -84 530 -79 b 556 -97 551 -79 556 -84 b 548 -133 556 -105 553 -117 b 334 -317 521 -233 434 -306 b 322 -319 329 -317 323 -317 l 319 -319 l 319 -424 b 319 -471 319 -444 319 -459 b 313 -541 319 -544 318 -535 b 298 -548 308 -545 303 -548 b 279 -534 289 -548 281 -542 b 277 -424 277 -531 277 -530 l 277 -317 l 273 -317 b 13 -95 153 -305 51 -217 b 0 2 4 -62 0 -29 b 182 295 0 126 66 238 b 274 324 210 309 249 320 l 277 324 l 277 427 b 279 533 277 528 277 530 b 289 545 281 538 285 542 m 277 2 b 277 291 277 161 277 291 b 268 288 277 291 273 290 b 144 1 179 265 144 184 b 276 -284 144 -199 175 -267 l 277 -285 l 277 2 ',\n },\n timeSigPlus: {\n x_min: 0,\n x_max: 319.859375,\n ha: 326,\n o: 'm 149 508 b 159 509 152 509 155 509 b 186 494 170 509 181 503 b 190 440 190 487 190 488 l 190 430 l 190 377 l 242 377 l 251 377 b 303 373 298 377 296 377 b 319 345 314 367 319 356 b 304 319 319 335 314 324 b 250 315 296 315 299 315 l 242 315 l 190 315 l 190 262 l 190 252 b 186 198 190 204 190 205 b 159 183 179 188 170 183 b 132 198 148 183 138 188 b 127 252 127 205 127 204 l 127 262 l 127 315 l 76 315 l 68 315 b 14 319 20 315 21 315 b 0 347 4 324 0 335 b 14 373 0 356 4 367 b 68 377 21 377 20 377 l 76 377 l 127 377 l 127 430 l 127 440 b 132 494 127 488 127 487 b 149 508 136 501 142 505 ',\n },\n timeSigPlusSmall: {\n x_min: 0,\n x_max: 319.859375,\n ha: 326,\n o: 'm 149 508 b 159 509 152 509 155 509 b 186 494 170 509 181 503 b 190 440 190 487 190 488 l 190 430 l 190 377 l 242 377 l 251 377 b 303 373 298 377 296 377 b 319 345 314 367 319 356 b 304 319 319 335 314 324 b 250 315 296 315 299 315 l 242 315 l 190 315 l 190 262 l 190 252 b 186 198 190 204 190 205 b 159 183 179 188 170 183 b 132 198 148 183 138 188 b 127 252 127 205 127 204 l 127 262 l 127 315 l 76 315 l 68 315 b 14 319 20 315 21 315 b 0 347 4 324 0 335 b 14 373 0 356 4 367 b 68 377 21 377 20 377 l 76 377 l 127 377 l 127 430 l 127 440 b 132 494 127 488 127 487 b 149 508 136 501 142 505 ',\n },\n timeSigMinus: {\n x_min: 0,\n x_max: 318.5,\n ha: 325,\n o: 'm 20 376 b 167 377 23 377 96 377 b 296 376 231 377 294 377 b 318 347 311 371 318 359 b 296 316 318 333 311 320 b 159 315 294 315 227 315 b 21 316 91 315 24 315 b 0 345 6 320 0 333 b 20 376 0 359 6 371 ',\n },\n timeSigParensRight: {\n x_min: 25.859375,\n x_max: 164.6875,\n ha: 168,\n o: 'm 34 369 b 40 370 35 370 38 370 b 59 353 49 370 50 367 b 164 40 122 254 155 158 b 164 0 164 33 164 16 b 164 -40 164 -16 164 -34 b 59 -353 155 -158 122 -254 b 40 -371 53 -366 47 -371 b 34 -370 38 -371 36 -370 b 25 -358 28 -367 25 -363 b 31 -337 25 -352 27 -347 b 92 0 72 -234 92 -117 b 31 335 92 116 72 233 b 25 356 27 345 25 352 b 34 369 25 363 28 366 ',\n },\n timeSigParensRightSmall: {\n x_min: 25.859375,\n x_max: 164.6875,\n ha: 168,\n o: 'm 34 369 b 40 370 35 370 38 370 b 59 353 49 370 50 367 b 164 40 122 254 155 158 b 164 0 164 33 164 16 b 164 -40 164 -16 164 -34 b 59 -353 155 -158 122 -254 b 40 -371 53 -366 47 -371 b 34 -370 38 -371 36 -370 b 25 -358 28 -367 25 -363 b 31 -337 25 -352 27 -347 b 92 0 72 -234 92 -117 b 31 335 92 116 72 233 b 25 356 27 345 25 352 b 34 369 25 363 28 366 ',\n },\n timeSigParensLeft: {\n x_min: -166.0625,\n x_max: -25.859375,\n ha: 0,\n o: 'm -49 369 b -42 370 -46 369 -44 370 b -27 360 -36 370 -29 366 b -25 355 -27 359 -25 358 b -32 335 -25 351 -28 347 b -92 52 -66 248 -87 159 b -93 -1 -93 43 -93 20 b -92 -54 -93 -23 -93 -45 b -32 -337 -85 -162 -66 -251 b -25 -355 -27 -349 -25 -352 b -42 -371 -25 -365 -32 -371 b -61 -353 -50 -371 -51 -369 b -163 -63 -119 -262 -153 -165 b -166 -1 -166 -37 -166 -31 b -163 62 -166 30 -166 36 b -61 352 -153 163 -119 260 b -49 369 -54 365 -51 366 ',\n },\n timeSigParensLeftSmall: {\n x_min: -166.0625,\n x_max: -25.859375,\n ha: 0,\n o: 'm -49 369 b -42 370 -46 369 -44 370 b -27 360 -36 370 -29 366 b -25 355 -27 359 -25 358 b -32 335 -25 351 -28 347 b -92 52 -66 248 -87 159 b -93 -1 -93 43 -93 20 b -92 -54 -93 -23 -93 -45 b -32 -337 -85 -162 -66 -251 b -25 -355 -27 -349 -25 -352 b -42 -371 -25 -365 -32 -371 b -61 -353 -50 -371 -51 -369 b -163 -63 -119 -262 -153 -165 b -166 -1 -166 -37 -166 -31 b -163 62 -166 30 -166 36 b -61 352 -153 163 -119 260 b -49 369 -54 365 -51 366 ',\n },\n noteheadDoubleWhole: {\n x_min: 0,\n x_max: 902.421875,\n ha: 921,\n o: 'm 17 240 b 24 241 19 241 21 241 b 32 240 28 241 31 241 b 46 229 38 238 43 234 b 50 88 50 223 50 237 b 50 -1 50 63 50 34 b 50 -90 50 -36 50 -65 b 46 -231 50 -238 50 -224 b 25 -242 42 -238 34 -242 b 0 -224 14 -242 4 -235 b 0 2 0 -222 0 -108 b 0 223 0 112 0 220 b 17 240 2 230 9 237 m 110 240 b 118 241 111 241 114 241 b 126 240 121 241 123 241 b 142 223 133 237 140 230 b 144 123 144 220 144 205 b 144 29 144 45 144 29 b 144 29 144 29 144 29 b 393 183 166 106 264 167 b 450 186 412 184 431 186 b 756 29 600 186 732 120 b 756 29 756 29 756 29 b 758 123 758 29 758 45 b 760 227 758 226 758 223 b 784 241 766 237 774 241 b 804 229 792 241 800 237 b 809 88 808 223 809 237 l 809 -1 l 809 -90 b 804 -231 809 -238 808 -224 b 784 -242 800 -238 792 -242 b 762 -231 775 -242 766 -238 b 758 -124 756 -224 758 -231 b 756 -30 758 -47 758 -30 b 756 -30 756 -30 756 -30 b 509 -184 736 -108 637 -169 b 450 -187 488 -187 469 -187 b 144 -30 300 -187 168 -122 b 144 -30 144 -30 144 -30 b 144 -124 144 -30 144 -47 b 140 -231 144 -231 144 -224 b 118 -242 134 -238 126 -242 b 92 -224 107 -242 96 -235 b 92 2 92 -222 92 -108 b 92 223 92 112 92 220 b 110 240 95 230 102 237 m 432 161 b 413 162 426 162 420 162 b 313 41 351 162 313 109 b 347 -73 313 5 323 -34 b 487 -163 385 -133 439 -163 b 578 -97 526 -163 562 -142 b 588 -43 585 -80 588 -62 b 432 161 588 47 518 147 m 868 240 b 876 241 869 241 872 241 b 884 240 879 241 882 241 b 898 229 890 238 894 234 b 902 88 902 223 902 237 l 902 -1 l 902 -90 b 898 -231 902 -238 902 -224 b 876 -242 892 -238 884 -242 b 852 -224 865 -242 854 -235 b 850 2 850 -222 850 -108 b 852 223 850 112 850 220 b 868 240 853 230 860 237 ',\n },\n noteheadWhole: {\n x_min: 0,\n x_max: 619.3125,\n ha: 632,\n o: 'm 274 184 b 307 186 285 186 296 186 b 616 22 465 186 597 116 b 619 -1 617 13 619 5 b 308 -187 619 -104 483 -187 b 0 -1 133 -187 0 -102 b 5 36 0 11 1 23 b 274 184 29 115 141 176 m 289 161 b 272 162 284 162 277 162 b 171 41 209 162 171 108 b 205 -73 171 5 182 -34 b 345 -163 243 -133 298 -163 b 436 -98 385 -163 420 -142 b 446 -43 443 -80 446 -62 b 289 161 446 47 377 147 ',\n },\n noteheadHalf: {\n x_min: 0,\n x_max: 428.75,\n ha: 438,\n o: 'm 262 186 b 273 186 266 186 272 186 b 274 186 273 186 274 186 b 285 186 274 186 280 186 b 428 48 375 181 428 122 b 386 -68 428 12 416 -29 b 155 -187 329 -145 236 -187 b 12 -111 92 -187 38 -162 b 0 -51 4 -91 0 -72 b 262 186 0 58 122 179 m 366 131 b 352 134 362 133 357 134 b 219 81 321 134 269 115 b 47 -111 126 23 50 -62 b 47 -112 47 -111 47 -112 b 77 -136 47 -129 58 -136 b 264 -45 118 -136 194 -101 b 382 109 336 12 382 76 b 366 131 382 120 377 129 ',\n },\n noteheadBlack: {\n x_min: 0,\n x_max: 428.75,\n ha: 438,\n o: 'm 262 186 b 273 186 266 186 272 186 b 274 186 273 186 274 186 b 285 186 274 186 280 186 b 428 48 375 181 428 122 b 386 -68 428 12 416 -29 b 155 -187 329 -145 236 -187 b 12 -111 92 -187 38 -162 b 0 -51 4 -91 0 -72 b 262 186 0 58 122 179 ',\n },\n noteheadXWhole: {\n x_min: 0,\n x_max: 598.890625,\n ha: 611,\n o: 'm 62 181 b 77 183 66 183 72 183 b 91 181 83 183 88 183 b 202 131 100 180 106 177 l 299 87 l 394 131 b 517 183 499 181 502 183 b 519 183 517 183 518 183 b 598 104 567 183 598 144 b 577 49 598 84 592 65 b 518 15 567 38 563 37 b 484 0 499 6 484 0 b 518 -16 484 -1 499 -8 b 577 -51 563 -38 567 -40 b 598 -105 592 -66 598 -86 b 519 -184 598 -145 567 -184 b 517 -184 518 -184 517 -184 b 394 -133 502 -184 499 -183 l 299 -88 l 202 -133 b 81 -184 99 -183 95 -184 b 77 -184 80 -184 78 -184 b 0 -105 29 -184 0 -145 b 20 -51 0 -86 5 -66 b 80 -16 29 -40 34 -38 b 114 -1 98 -8 114 -1 b 80 15 114 0 98 6 b 20 49 34 37 29 38 b 0 104 6 65 0 84 b 62 181 0 140 23 174 m 88 134 b 74 136 85 134 80 136 b 68 134 72 136 69 136 b 46 104 54 130 46 117 b 55 81 46 95 49 88 b 149 34 59 76 53 80 b 224 -1 190 15 224 0 b 144 -38 224 -1 187 -18 b 54 -84 59 -79 58 -79 b 46 -105 49 -90 46 -98 b 76 -137 46 -122 58 -137 b 78 -137 77 -137 77 -137 b 194 -86 87 -137 76 -141 b 298 -36 250 -58 298 -36 b 298 -36 298 -36 298 -36 b 402 -84 299 -36 345 -58 b 518 -137 522 -141 510 -137 b 521 -137 519 -137 519 -137 b 551 -105 539 -137 551 -122 b 541 -83 551 -98 548 -90 b 447 -36 537 -77 544 -81 b 374 -1 406 -16 374 -1 b 447 34 374 0 406 15 b 541 81 544 80 537 76 b 551 104 548 88 551 97 b 521 136 551 120 539 136 b 518 136 519 136 519 136 b 517 136 518 136 517 136 l 517 136 b 402 83 511 136 511 136 b 298 34 345 56 299 34 b 298 34 298 34 298 34 b 194 84 298 34 250 56 b 88 134 137 111 89 133 ',\n },\n noteheadXHalf: {\n x_min: 0,\n x_max: 406.96875,\n ha: 415,\n o: 'm 55 181 b 70 183 61 183 66 183 b 111 170 85 183 99 179 b 160 130 115 167 137 149 l 202 95 l 245 130 b 319 181 299 176 302 179 b 334 183 325 183 330 183 b 406 109 375 183 406 148 b 401 81 406 99 405 91 b 348 24 394 65 390 59 b 318 -1 332 11 318 0 b 348 -26 318 -1 332 -12 b 401 -83 390 -61 394 -66 b 406 -111 405 -93 406 -101 b 334 -184 406 -149 375 -184 b 319 -183 330 -184 325 -184 b 245 -131 302 -180 299 -177 l 202 -97 l 160 -131 b 85 -183 107 -177 103 -180 b 70 -184 80 -184 76 -184 b 0 -111 31 -184 0 -149 b 4 -83 0 -101 1 -93 b 58 -26 10 -66 16 -61 b 88 -1 74 -12 88 -1 b 58 24 88 0 74 11 b 10 69 23 54 17 59 b 0 109 2 81 0 95 b 55 181 0 142 21 173 m 83 133 b 72 136 78 136 76 136 b 57 131 66 136 61 134 b 46 109 49 126 46 117 b 50 93 46 104 47 98 b 107 45 51 91 77 70 b 160 0 137 20 160 0 b 107 -47 160 -1 137 -22 b 50 -94 77 -72 51 -93 b 46 -111 47 -99 46 -105 b 59 -134 46 -120 50 -130 b 72 -137 62 -136 68 -137 b 83 -136 76 -137 80 -136 b 144 -84 84 -134 107 -116 b 202 -36 176 -58 202 -36 b 261 -84 202 -36 230 -58 b 323 -136 299 -116 321 -134 b 334 -137 326 -136 330 -137 b 345 -134 338 -137 343 -136 b 360 -111 355 -130 360 -120 b 355 -94 360 -105 359 -99 b 299 -47 353 -93 329 -72 b 245 0 269 -22 245 -1 b 299 45 245 0 269 20 b 355 93 329 70 353 91 b 360 109 359 98 360 104 b 345 133 360 119 355 129 b 334 136 343 134 338 136 b 323 134 330 136 326 134 b 261 83 321 133 299 115 b 202 34 230 56 202 34 b 144 83 202 34 176 56 b 83 133 106 115 84 133 ',\n },\n noteheadXBlack: {\n x_min: 0,\n x_max: 406.96875,\n ha: 415,\n o: 'm 21 183 b 28 183 24 183 25 183 b 42 181 34 183 39 183 b 127 108 47 179 47 179 b 202 41 168 72 202 41 b 279 108 204 41 238 72 b 357 177 321 145 356 176 b 375 183 363 181 370 183 b 406 151 392 183 406 169 b 404 137 406 147 405 141 b 322 62 401 131 398 129 b 251 0 284 27 251 0 b 322 -63 251 -1 284 -29 b 404 -138 398 -130 401 -133 b 406 -152 405 -142 406 -148 b 375 -184 406 -170 392 -184 b 357 -179 370 -184 363 -183 b 279 -109 356 -177 321 -147 b 202 -43 238 -73 204 -43 b 127 -109 202 -43 168 -73 b 49 -179 85 -147 50 -177 b 31 -184 43 -183 36 -184 b 0 -152 13 -184 0 -170 b 2 -138 0 -148 0 -142 b 83 -63 5 -133 8 -130 b 155 0 122 -29 155 -1 b 83 62 155 0 122 27 b 8 129 43 97 10 127 b 0 151 2 136 0 144 b 21 183 0 165 8 177 ',\n },\n noteheadCircleX: {\n x_min: 0,\n x_max: 484.5625,\n ha: 494,\n o: 'm 228 245 b 239 247 234 247 239 247 b 243 247 240 247 242 247 b 303 238 257 247 287 242 b 484 -2 417 208 484 104 b 412 -177 484 -65 461 -127 b 243 -248 363 -226 303 -248 b 6 -63 138 -248 36 -180 b 0 -1 1 -41 0 -20 b 228 245 0 127 98 240 m 255 181 b 240 183 247 183 245 183 b 232 181 238 183 235 183 b 142 152 200 180 168 170 l 138 149 l 190 97 l 242 44 l 294 97 l 345 149 l 340 152 b 255 181 315 169 284 180 m 147 -54 l 197 -1 l 147 51 l 95 104 l 91 99 b 62 -1 72 70 62 34 b 66 -43 62 -15 63 -29 b 91 -101 72 -63 80 -84 l 95 -106 l 147 -54 m 393 99 b 389 104 390 102 389 104 b 337 51 389 104 366 80 l 285 -1 l 337 -54 l 389 -106 l 393 -101 b 421 -1 412 -72 421 -36 b 393 99 421 34 412 69 m 294 -98 b 242 -45 265 -69 242 -45 b 190 -98 242 -45 219 -69 l 138 -151 l 142 -154 b 242 -184 172 -174 206 -184 b 340 -154 276 -184 311 -174 l 345 -151 l 294 -98 ',\n },\n noteheadTriangleUpWhole: {\n x_min: 0,\n x_max: 630.203125,\n ha: 643,\n o: 'm 308 204 b 314 205 310 205 313 205 b 326 201 319 205 323 204 b 355 154 328 199 338 180 b 401 83 362 142 392 95 l 409 72 b 431 41 412 66 424 49 b 619 -174 498 -51 570 -134 b 630 -192 626 -180 630 -186 b 626 -202 630 -195 628 -199 b 616 -206 623 -205 620 -206 b 552 -188 608 -206 592 -202 b 310 -155 488 -169 392 -155 b 268 -156 295 -155 281 -155 b 77 -188 197 -161 126 -173 b 13 -206 35 -202 20 -206 b 9 -206 12 -206 10 -206 b 0 -191 2 -202 0 -197 b 8 -176 0 -186 2 -180 b 204 49 58 -136 138 -43 l 220 72 l 227 83 b 295 188 245 108 281 166 b 308 204 299 197 304 202 m 315 147 b 314 147 315 147 314 147 b 314 147 314 147 314 147 b 306 129 314 145 310 138 l 296 105 b 281 72 292 97 284 77 l 274 56 b 181 -123 247 -4 212 -72 l 174 -134 l 176 -133 b 314 -123 215 -127 272 -123 b 451 -133 356 -123 413 -127 l 454 -134 l 449 -123 b 353 56 417 -72 381 -4 l 347 72 b 332 105 344 77 336 97 l 322 129 b 315 147 318 138 315 145 ',\n },\n noteheadTriangleUpHalf: {\n x_min: 0,\n x_max: 438.28125,\n ha: 447,\n o: 'm 212 205 b 219 205 213 205 216 205 b 239 183 228 205 231 204 b 421 -163 298 40 363 -83 b 438 -191 434 -180 438 -186 b 436 -197 438 -192 438 -195 b 424 -206 434 -204 431 -206 b 406 -201 420 -206 415 -205 b 216 -156 347 -172 281 -156 b 23 -205 148 -156 80 -173 b 14 -206 20 -206 17 -206 b 0 -191 6 -206 0 -201 b 6 -176 0 -187 1 -183 b 202 192 63 -104 142 45 b 212 205 205 199 208 202 m 264 48 l 249 81 l 243 94 l 242 91 b 89 -126 208 36 137 -66 b 81 -138 85 -133 81 -138 b 81 -138 81 -138 81 -138 b 81 -138 81 -138 81 -138 b 95 -133 81 -138 87 -136 b 280 -94 156 -108 221 -94 b 334 -98 299 -94 317 -95 b 343 -99 338 -99 343 -99 b 343 -99 343 -99 343 -99 b 338 -94 343 -99 341 -97 b 264 48 318 -58 287 1 ',\n },\n noteheadTriangleUpBlack: {\n x_min: -1.359375,\n x_max: 436.921875,\n ha: 446,\n o: 'm 213 205 b 217 205 215 205 216 205 b 234 194 224 205 234 199 b 236 187 234 194 235 190 l 245 167 l 261 129 l 270 106 b 355 -61 294 54 329 -13 b 420 -163 381 -105 402 -138 b 436 -188 435 -184 436 -184 b 436 -191 436 -190 436 -190 b 421 -206 436 -201 431 -206 l 421 -206 l 416 -206 l 405 -201 b 217 -158 347 -172 283 -158 b 31 -201 153 -158 88 -172 l 20 -206 l 14 -206 l 14 -206 b 0 -191 5 -206 0 -201 b -1 -188 0 -190 -1 -190 b 14 -163 -1 -186 0 -184 b 95 -34 36 -136 72 -77 b 166 106 119 8 148 68 l 175 129 l 183 148 l 200 188 b 213 205 205 199 208 202 ',\n },\n noteheadDiamondWhole: {\n x_min: 0,\n x_max: 627.46875,\n ha: 640,\n o: 'm 306 190 b 314 191 308 191 311 191 b 326 184 318 191 322 190 l 336 173 b 510 52 377 127 442 80 b 515 49 513 51 515 49 b 611 16 537 40 579 24 b 627 0 624 13 627 9 b 607 -18 627 -11 624 -13 b 330 -181 490 -49 389 -109 b 314 -192 323 -190 319 -192 b 306 -191 311 -192 308 -192 b 294 -177 302 -188 302 -188 b 257 -140 287 -170 265 -148 b 19 -18 193 -84 114 -44 b 0 0 2 -13 0 -11 b 16 16 0 9 2 13 b 110 49 47 24 89 40 b 117 52 111 49 114 51 b 145 65 126 56 130 58 b 281 163 200 93 245 124 b 300 186 288 170 291 174 b 306 190 300 187 303 188 m 317 137 b 313 142 315 141 314 142 b 308 137 313 142 311 141 b 161 4 276 84 220 33 b 155 0 159 1 155 0 b 163 -4 155 0 159 -2 b 308 -138 220 -34 276 -84 b 313 -142 311 -141 313 -142 b 317 -138 314 -142 315 -141 b 464 -4 351 -84 406 -34 b 470 0 468 -2 470 0 b 464 4 470 0 468 1 b 317 137 406 33 351 84 ',\n },\n noteheadDiamondHalf: {\n x_min: 0,\n x_max: 438.28125,\n ha: 447,\n o: 'm 212 190 b 219 191 213 191 216 191 b 236 176 225 191 228 190 b 419 18 277 105 341 49 b 436 5 431 13 434 11 b 438 -1 438 4 438 1 b 424 -16 438 -8 432 -13 b 356 -49 409 -20 379 -36 b 234 -180 306 -83 258 -133 b 219 -192 230 -188 224 -192 b 200 -176 213 -192 206 -187 b 9 -15 157 -102 89 -45 b 0 0 2 -12 0 -6 b 16 18 0 9 2 12 b 200 176 93 48 159 104 b 212 190 205 186 208 188 m 239 113 b 236 117 238 116 238 117 b 230 108 235 117 234 115 b 92 -15 196 58 140 8 b 88 -18 91 -16 88 -18 b 92 -20 88 -18 91 -19 b 198 -116 130 -43 166 -74 b 200 -117 200 -117 200 -117 b 201 -117 200 -117 201 -117 b 264 -43 212 -98 242 -62 b 345 15 288 -19 321 4 b 348 18 347 16 348 16 b 344 20 348 18 347 19 b 239 113 307 41 266 79 ',\n },\n noteheadDiamondBlack: {\n x_min: 0,\n x_max: 432.828125,\n ha: 442,\n o: 'm 209 186 b 213 187 210 187 212 187 b 216 187 215 187 216 187 b 224 174 216 186 220 180 b 420 -1 269 105 338 43 b 432 -12 431 -8 432 -9 b 421 -23 432 -15 432 -16 b 228 -180 345 -70 264 -137 b 219 -188 221 -188 221 -188 l 219 -188 b 208 -177 215 -188 215 -188 b 10 1 163 -106 93 -44 b 0 11 0 6 0 8 b 10 22 0 13 0 15 b 202 179 87 69 167 136 b 209 186 206 183 209 186 ',\n },\n augmentationDot: {\n x_min: 0,\n x_max: 133.390625,\n ha: 136,\n o: 'm 54 66 b 65 68 58 68 61 68 b 122 37 88 68 110 56 b 133 -1 130 26 133 12 b 104 -58 133 -23 123 -44 b 66 -69 92 -65 78 -69 b 10 -38 44 -69 23 -58 b 0 -1 2 -27 0 -13 b 54 66 0 30 20 61 ',\n },\n tremolo1: {\n x_min: -206.890625,\n x_max: 428.75,\n ha: 438,\n o: 'm 389 -351 b 394 -351 390 -351 393 -351 b 428 -385 413 -351 428 -367 b 428 -394 428 -388 428 -391 b 394 -428 426 -406 421 -410 l 332 -473 l 269 -516 l 205 -560 l 141 -603 l 77 -648 l 13 -692 l -50 -737 l -114 -780 l -145 -802 b -171 -813 -157 -810 -163 -813 b -175 -813 -172 -813 -174 -813 b -206 -777 -194 -811 -206 -795 b -202 -760 -206 -771 -205 -766 b -87 -675 -197 -752 -206 -757 l -34 -639 l 83 -557 l 145 -514 l 209 -470 l 272 -427 b 389 -351 375 -356 381 -352 ',\n },\n flag8thUp: {\n x_min: -24.5,\n x_max: 317.140625,\n ha: 324,\n o: 'm -24 -161 l -24 -5 l -20 -5 b 0 -24 -9 -5 -2 -12 b 171 -315 21 -124 84 -233 b 317 -660 268 -406 317 -531 b 187 -1014 317 -782 274 -909 b 161 -1034 172 -1034 171 -1034 b 141 -1013 149 -1034 141 -1025 b 152 -991 141 -1004 142 -1002 b 266 -682 228 -899 266 -788 b 174 -430 266 -588 236 -498 b -23 -317 136 -388 66 -348 b -24 -161 -23 -316 -24 -285 ',\n },\n flag8thDown: {\n x_min: -21.78125,\n x_max: 367.5,\n ha: 375,\n o: 'm 230 1031 b 238 1032 232 1032 235 1032 b 259 1014 245 1032 251 1027 b 367 662 330 906 367 782 b 364 602 367 641 367 621 b 232 317 352 488 304 384 b 57 120 155 245 103 187 b -1 18 31 84 6 40 b -19 4 -4 11 -12 4 l -21 4 l -21 159 l -21 315 l -16 315 b 96 335 10 315 62 324 b 315 695 227 380 315 527 b 313 738 315 709 314 724 b 224 991 304 825 273 916 b 216 1013 219 999 216 1007 b 230 1031 216 1021 220 1028 ',\n },\n flag16thUp: {\n x_min: -24.5,\n x_max: 317.140625,\n ha: 324,\n o: 'm -24 -147 l -24 -5 l -20 -5 b -1 -19 -12 -5 -4 -11 b 58 -123 6 -43 31 -86 b 196 -278 93 -173 134 -219 b 317 -570 274 -356 317 -460 b 294 -713 317 -617 308 -666 l 289 -724 l 294 -735 b 317 -873 308 -780 317 -827 b 235 -1132 317 -963 288 -1054 b 209 -1165 228 -1140 224 -1146 b 189 -1177 204 -1172 196 -1177 b 171 -1164 182 -1177 175 -1172 b 168 -1154 170 -1161 168 -1159 b 181 -1132 168 -1149 172 -1142 b 269 -891 238 -1064 269 -975 b 269 -881 269 -886 269 -884 b 262 -814 269 -857 265 -827 b 258 -800 261 -811 259 -806 b 142 -628 240 -731 198 -667 b -8 -589 112 -606 47 -589 b -20 -589 -13 -589 -19 -589 l -24 -589 l -24 -449 l -24 -308 l -20 -308 b -1 -322 -12 -308 -4 -313 b 58 -424 6 -345 31 -388 b 194 -580 93 -476 136 -523 b 259 -660 221 -606 245 -635 b 261 -663 259 -662 261 -663 b 264 -656 262 -663 262 -660 b 269 -587 268 -632 269 -610 b 264 -521 269 -566 268 -544 b 262 -512 264 -517 262 -513 b 258 -498 261 -509 259 -503 b 142 -326 240 -428 198 -365 b -8 -287 112 -303 47 -288 b -20 -287 -13 -287 -19 -287 l -24 -287 l -24 -147 ',\n },\n flag16thDown: {\n x_min: -21.78125,\n x_max: 362.0625,\n ha: 369,\n o: 'm 302 1031 b 308 1032 304 1032 307 1032 b 330 1016 318 1032 325 1027 b 362 867 351 970 362 920 b 340 738 362 824 353 780 l 336 727 l 340 717 b 362 591 355 677 362 634 b 257 323 362 496 325 401 b 204 272 243 306 227 290 b 20 56 129 206 66 133 b -1 18 12 44 0 22 b -19 4 -4 9 -12 4 l -21 4 l -21 140 l -21 276 l -12 277 b 167 333 61 288 127 309 b 319 598 262 388 319 491 b 311 664 319 620 317 642 l 310 673 l 304 664 b 204 548 279 620 250 587 b 20 333 129 483 66 409 b -1 292 12 320 0 298 b -19 280 -4 285 -12 280 l -21 280 l -21 416 l -21 552 l -12 553 b 167 609 61 564 127 585 b 319 874 264 666 319 770 b 294 992 319 914 311 954 b 288 1011 288 1004 288 1007 b 302 1031 288 1021 294 1028 ',\n },\n flag32ndUp: {\n x_min: -24.5,\n x_max: 315.78125,\n ha: 322,\n o: 'm -24 -145 l -24 -5 l -20 -5 b 1 -26 -10 -5 -6 -9 b 175 -241 31 -86 96 -166 b 314 -548 259 -323 304 -420 b 315 -589 315 -555 315 -571 b 314 -630 315 -606 315 -623 b 298 -730 311 -664 306 -699 l 295 -742 l 296 -748 b 314 -850 304 -778 311 -813 b 315 -892 315 -857 315 -874 b 314 -932 315 -909 315 -925 b 298 -1032 311 -967 306 -1002 l 295 -1045 l 296 -1050 b 314 -1153 304 -1081 311 -1115 b 315 -1193 315 -1160 315 -1177 b 314 -1235 315 -1211 315 -1228 b 217 -1526 306 -1338 270 -1444 b 201 -1533 213 -1532 208 -1533 b 182 -1522 193 -1533 185 -1529 b 179 -1514 181 -1518 179 -1517 b 189 -1489 179 -1508 182 -1501 b 266 -1217 240 -1403 266 -1308 b 262 -1156 266 -1196 265 -1177 b 110 -907 247 -1043 190 -950 b 0 -889 87 -895 50 -889 l -1 -889 l -24 -889 l -24 -749 l -24 -610 l -20 -610 b 1 -631 -10 -610 -6 -614 b 175 -846 31 -691 96 -771 b 259 -956 213 -884 236 -914 b 265 -966 262 -961 264 -966 b 265 -966 265 -966 265 -966 b 265 -953 265 -964 265 -959 b 266 -920 266 -943 266 -932 b 262 -853 266 -898 265 -873 b 110 -605 247 -741 190 -648 b 0 -587 87 -592 50 -587 l -1 -587 l -24 -587 l -24 -448 l -24 -308 l -20 -308 b 1 -328 -10 -308 -6 -312 b 175 -544 31 -388 96 -469 b 259 -655 213 -581 236 -612 b 265 -663 262 -659 264 -663 b 265 -663 265 -663 265 -663 b 265 -650 265 -663 265 -657 b 266 -617 266 -641 266 -630 b 262 -551 266 -595 265 -570 b 110 -303 247 -438 190 -345 b 0 -284 87 -290 50 -284 l -1 -284 l -24 -284 l -24 -145 ',\n },\n flag32ndDown: {\n x_min: -21.78125,\n x_max: 366.140625,\n ha: 374,\n o: 'm 276 1378 b 284 1379 279 1379 281 1379 b 306 1360 292 1379 298 1374 b 352 1247 326 1326 343 1286 b 366 1139 362 1213 366 1175 b 347 1009 366 1093 359 1049 l 344 1002 l 347 992 b 352 971 348 986 351 977 b 366 863 362 936 366 899 b 347 732 366 818 359 773 l 344 725 l 347 716 b 352 695 348 710 351 700 b 366 588 362 659 366 623 b 223 262 366 464 314 345 b 189 233 212 252 212 252 b 35 76 126 183 73 129 b -1 16 20 56 2 27 b -19 4 -4 9 -12 4 l -21 4 l -21 137 l -21 270 l -17 270 b 186 344 59 281 134 308 b 319 606 270 399 319 499 b 317 650 319 620 319 635 l 315 659 l 314 655 b 223 537 288 607 258 570 b 189 509 212 528 212 528 b 35 352 126 459 73 405 b -1 292 20 333 2 303 b -19 280 -4 285 -12 280 l -21 280 l -21 413 l -21 546 l -17 546 b 186 620 59 557 134 584 b 319 882 270 675 319 775 b 317 925 319 896 319 911 l 315 935 l 314 931 b 223 813 288 884 258 846 b 189 785 212 805 212 805 b 35 628 126 735 73 681 b -1 569 20 609 2 580 b -19 556 -4 562 -12 556 l -21 556 l -21 689 l -21 823 l -17 823 b 202 907 68 835 152 867 b 319 1157 280 968 319 1061 b 270 1338 319 1218 303 1281 b 262 1358 264 1349 262 1353 b 262 1364 262 1360 262 1363 b 276 1378 265 1371 269 1376 ',\n },\n flag64thUp: {\n x_min: -24.5,\n x_max: 314.421875,\n ha: 321,\n o: 'm -24 -145 l -24 -5 l -20 -5 b 0 -23 -9 -5 -2 -12 b 27 -87 4 -38 14 -66 b 138 -220 53 -136 88 -177 b 235 -328 179 -255 208 -288 b 314 -592 287 -409 314 -501 b 292 -732 314 -639 307 -687 l 289 -742 l 294 -756 b 314 -896 307 -802 314 -849 b 292 -1035 314 -943 307 -991 l 289 -1045 l 294 -1057 b 314 -1197 307 -1104 314 -1152 b 292 -1338 314 -1246 307 -1292 l 289 -1347 l 294 -1360 b 314 -1500 307 -1407 314 -1454 b 273 -1689 314 -1565 300 -1628 b 250 -1712 265 -1710 261 -1712 b 228 -1691 236 -1712 228 -1704 l 228 -1685 l 234 -1675 b 270 -1507 258 -1621 270 -1564 b 98 -1193 270 -1381 209 -1261 b 40 -1174 76 -1179 58 -1174 b -10 -1189 24 -1174 8 -1178 b -20 -1192 -14 -1192 -16 -1192 l -24 -1192 l -24 -1052 l -24 -913 l -20 -913 b 0 -931 -9 -913 -2 -920 b 27 -995 4 -946 14 -974 b 138 -1128 53 -1043 88 -1085 b 257 -1275 190 -1172 228 -1220 b 262 -1283 259 -1279 262 -1283 l 262 -1283 b 269 -1249 264 -1282 268 -1260 b 270 -1206 270 -1233 270 -1220 b 98 -891 270 -1075 206 -957 b 40 -871 76 -877 58 -871 b -10 -886 24 -871 8 -875 b -20 -889 -14 -889 -16 -889 l -24 -889 l -24 -749 l -24 -610 l -20 -610 b 0 -628 -9 -610 -2 -617 b 27 -692 4 -644 14 -671 b 138 -825 53 -741 88 -782 b 257 -973 190 -870 228 -917 b 262 -981 259 -977 262 -981 l 262 -981 b 269 -946 264 -979 268 -957 b 270 -903 270 -931 270 -917 b 98 -588 270 -774 206 -655 b 40 -569 76 -574 58 -569 b -10 -584 24 -569 8 -574 b -20 -587 -14 -587 -16 -587 l -24 -587 l -24 -448 l -24 -308 l -20 -308 b 0 -326 -9 -308 -2 -315 b 27 -390 4 -341 14 -369 b 138 -523 53 -438 88 -480 b 257 -670 190 -567 228 -614 b 262 -678 259 -674 262 -678 b 262 -678 262 -678 262 -678 b 269 -644 264 -677 268 -656 b 270 -601 270 -628 270 -614 b 98 -285 270 -471 206 -352 b 40 -266 76 -273 58 -266 b -10 -281 24 -266 8 -272 b -20 -284 -14 -284 -16 -284 l -24 -284 l -24 -145 ',\n },\n flag64thDown: {\n x_min: -21.78125,\n x_max: 367.5,\n ha: 375,\n o: 'm 259 1553 b 265 1553 261 1553 264 1553 b 288 1540 272 1553 277 1550 b 367 1351 340 1493 367 1424 b 336 1221 367 1308 357 1263 l 332 1211 l 333 1208 b 367 1077 356 1170 367 1124 b 336 945 367 1032 357 986 l 332 935 l 333 932 b 367 800 356 893 367 848 b 336 669 367 756 357 710 l 332 659 l 333 656 b 367 523 356 617 367 571 b 345 412 367 485 360 446 b 231 273 322 356 284 310 b -1 19 121 195 27 93 b -17 4 -4 11 -10 5 l -21 4 l -21 134 l -21 265 l -17 265 b 133 291 20 265 96 278 b 318 537 245 328 318 433 b 307 603 318 559 315 582 b 303 614 304 612 304 614 b 298 609 302 614 300 613 b 231 549 281 589 258 567 b -1 295 121 471 27 369 b -17 280 -4 287 -10 281 l -21 280 l -21 410 l -21 541 l -17 541 b 133 567 20 541 96 555 b 318 813 245 605 318 709 b 307 880 318 835 315 859 b 303 891 304 888 304 891 b 298 885 302 891 300 888 b 231 825 281 866 258 843 b -1 571 121 748 27 645 b -17 556 -4 563 -10 557 l -21 556 l -21 687 l -21 817 l -17 817 b 133 843 20 817 96 830 b 318 1089 245 881 318 985 b 307 1156 318 1111 315 1134 b 303 1167 304 1164 304 1167 b 298 1161 302 1167 300 1164 b 231 1102 281 1140 258 1120 b -1 848 121 1024 27 921 b -17 832 -4 839 -10 834 l -21 832 l -21 963 l -21 1093 l -17 1093 b 114 1113 12 1093 78 1103 b 313 1314 215 1142 289 1218 b 318 1364 317 1331 318 1347 b 255 1511 318 1422 295 1478 b 243 1532 247 1519 243 1525 b 259 1553 243 1540 250 1550 ',\n },\n flag128thUp: {\n x_min: -24.5,\n x_max: 313.0625,\n ha: 319,\n o: 'm -24 -133 l -24 -5 l -20 -5 b -1 -19 -12 -5 -4 -11 b 142 -213 13 -61 74 -144 b 258 -376 196 -269 230 -315 b 313 -605 295 -449 313 -528 b 292 -742 313 -652 306 -699 b 288 -752 289 -748 288 -752 b 288 -752 288 -752 288 -752 b 292 -764 289 -753 291 -757 b 313 -907 306 -811 313 -860 b 292 -1045 313 -954 306 -1002 b 288 -1054 289 -1050 288 -1054 b 288 -1054 288 -1054 288 -1054 b 292 -1067 289 -1054 291 -1060 b 313 -1210 306 -1113 313 -1161 b 292 -1346 313 -1257 306 -1304 b 288 -1357 289 -1353 288 -1357 b 288 -1357 288 -1357 288 -1357 b 292 -1368 289 -1357 291 -1363 b 313 -1512 306 -1415 313 -1464 b 292 -1648 313 -1560 306 -1605 b 288 -1660 289 -1654 288 -1660 b 288 -1660 288 -1660 288 -1660 b 292 -1671 289 -1660 291 -1665 b 313 -1814 306 -1719 313 -1766 b 250 -2040 313 -1897 291 -1977 b 232 -2062 238 -2057 236 -2059 b 221 -2065 230 -2063 225 -2065 b 200 -2045 210 -2065 201 -2057 b 200 -2043 200 -2044 200 -2044 b 208 -2026 200 -2037 202 -2034 b 269 -1826 249 -1966 269 -1897 b 153 -1544 269 -1726 230 -1625 b -9 -1472 115 -1506 58 -1481 b -21 -1471 -14 -1471 -19 -1471 l -24 -1471 l -24 -1343 l -24 -1215 l -20 -1215 b -1 -1229 -12 -1215 -4 -1221 b 142 -1424 13 -1270 74 -1353 b 257 -1582 196 -1478 228 -1524 b 264 -1594 261 -1589 264 -1594 l 264 -1594 b 265 -1582 264 -1594 264 -1589 b 270 -1525 268 -1562 270 -1544 b 153 -1243 270 -1424 228 -1321 b -9 -1170 115 -1203 58 -1178 b -21 -1168 -14 -1170 -19 -1168 l -24 -1168 l -24 -1041 l -24 -913 l -20 -913 b -1 -927 -12 -913 -4 -918 b 142 -1121 13 -967 74 -1050 b 257 -1281 196 -1175 228 -1221 b 264 -1292 261 -1286 264 -1292 l 264 -1292 b 265 -1279 264 -1292 264 -1286 b 270 -1222 268 -1261 270 -1242 b 153 -941 270 -1121 228 -1018 b -9 -867 115 -900 58 -875 b -21 -866 -14 -867 -19 -866 l -24 -866 l -24 -738 l -24 -610 l -20 -610 b -1 -624 -12 -610 -4 -616 b 142 -818 13 -664 74 -749 b 257 -978 196 -873 228 -918 b 264 -989 261 -984 264 -989 l 264 -989 b 265 -977 264 -989 264 -984 b 270 -920 268 -959 270 -939 b 153 -638 270 -818 228 -716 b -9 -564 115 -598 58 -573 b -21 -563 -14 -564 -19 -563 l -24 -563 l -24 -435 l -24 -308 l -20 -308 b -1 -322 -12 -308 -4 -313 b 142 -516 13 -363 74 -446 b 257 -675 196 -571 228 -616 b 264 -687 261 -681 264 -687 l 264 -687 b 265 -674 264 -687 264 -681 b 270 -617 268 -656 270 -637 b 153 -335 270 -516 228 -413 b -9 -262 115 -295 58 -270 b -21 -260 -14 -262 -19 -260 l -24 -260 l -24 -133 ',\n },\n flag128thDown: {\n x_min: -21.78125,\n x_max: 367.5,\n ha: 375,\n o: 'm 276 1900 b 284 1901 279 1900 281 1901 b 306 1883 291 1901 298 1896 b 367 1686 347 1825 367 1757 b 343 1558 367 1643 359 1600 l 338 1549 l 343 1537 b 367 1411 359 1497 367 1454 b 343 1282 367 1367 359 1324 l 338 1272 l 343 1261 b 367 1135 359 1221 367 1178 b 343 1007 367 1090 359 1047 l 338 996 l 343 985 b 367 859 359 945 367 902 b 343 731 367 814 359 771 l 338 720 l 343 709 b 367 582 359 667 367 626 b 289 362 367 503 340 426 b 239 312 276 345 259 330 b 29 77 152 237 76 152 b -1 18 14 54 2 30 b -19 4 -4 11 -12 4 l -21 4 l -21 133 l -20 260 l -13 262 b 98 299 17 269 62 284 b 111 305 103 302 110 305 b 167 334 123 310 156 327 b 319 595 264 391 319 491 b 313 659 319 616 318 638 b 310 667 311 664 311 667 b 307 663 310 667 308 666 b 240 588 289 637 269 614 b 16 331 141 505 62 413 b -1 294 8 316 1 302 b -19 280 -4 287 -12 280 l -21 280 l -21 408 l -20 537 l -13 538 b 98 576 17 545 62 560 b 111 581 103 578 110 581 b 167 610 123 587 156 603 b 319 871 264 667 319 767 b 313 935 319 892 318 913 b 310 942 311 941 311 942 b 307 939 310 942 308 941 b 240 864 289 913 269 889 b 16 607 141 781 62 689 b -1 570 8 592 1 578 b -19 556 -4 563 -12 556 l -21 556 l -21 684 l -20 813 l -13 814 b 98 852 17 821 62 836 b 111 857 103 855 110 857 b 167 886 123 863 156 880 b 319 1147 264 943 319 1043 b 313 1211 319 1168 318 1189 b 310 1218 311 1217 311 1218 b 307 1215 310 1218 308 1217 b 240 1140 289 1188 269 1165 b 16 884 141 1057 62 966 b -1 846 8 868 1 855 b -19 832 -4 839 -12 832 l -21 832 l -21 960 l -20 1089 l -13 1090 b 98 1128 17 1097 62 1111 b 111 1134 103 1131 110 1134 b 167 1163 123 1139 156 1156 b 319 1424 264 1220 319 1320 b 313 1486 319 1444 318 1465 b 310 1494 311 1493 311 1494 b 307 1492 310 1494 308 1493 b 240 1417 289 1464 269 1442 b 16 1160 141 1333 62 1242 b -1 1121 8 1145 1 1131 b -19 1109 -4 1115 -12 1109 l -21 1109 l -21 1236 l -20 1365 l -13 1367 b 98 1404 17 1374 62 1388 b 111 1410 103 1407 110 1410 b 250 1508 172 1437 215 1467 b 319 1701 296 1564 319 1633 b 270 1859 319 1757 303 1814 b 262 1882 265 1868 262 1875 b 276 1900 262 1890 266 1896 ',\n },\n accidentalFlat: {\n x_min: -21.78125,\n x_max: 251.8125,\n ha: 257,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 383 20 616 20 616 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 201 l -21 616 l -20 620 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ',\n },\n accidentalNatural: {\n x_min: 0,\n x_max: 239.5625,\n ha: 244,\n o: 'm 10 460 b 20 462 13 462 14 462 b 39 449 28 462 35 458 l 40 446 l 40 326 b 40 205 40 259 40 205 b 127 227 40 205 80 215 b 220 249 196 244 213 249 b 227 247 224 249 225 248 b 238 237 231 245 235 241 l 239 233 l 239 -106 l 239 -448 l 238 -451 b 219 -463 234 -459 225 -463 b 198 -451 210 -463 202 -459 l 197 -448 l 197 -324 b 197 -201 197 -248 197 -201 b 110 -223 196 -201 157 -210 b 17 -245 42 -240 24 -245 b 10 -242 13 -245 13 -244 b 0 -233 6 -241 2 -237 l 0 -230 l 0 108 l 0 446 l 0 449 b 10 460 2 453 6 458 m 197 22 b 197 70 197 41 197 58 b 196 116 197 113 197 116 l 196 116 b 118 97 196 116 160 106 l 40 77 l 40 -18 b 40 -112 40 -69 40 -112 l 119 -93 l 197 -73 l 197 22 ',\n },\n accidentalSharp: {\n x_min: 0,\n x_max: 323.9375,\n ha: 331,\n o: 'm 217 535 b 225 537 220 537 221 537 b 245 524 235 537 242 533 l 246 521 l 247 390 l 247 258 l 273 265 b 306 270 288 269 299 270 b 322 259 315 270 319 267 b 323 208 323 256 323 233 b 322 158 323 184 323 159 b 288 140 318 148 315 147 b 247 130 254 131 247 130 b 247 65 247 130 247 104 b 247 20 247 51 247 36 l 247 -88 l 273 -81 b 306 -76 289 -77 299 -76 b 318 -81 311 -76 315 -77 b 323 -123 323 -87 323 -86 l 323 -138 l 323 -154 b 318 -195 323 -191 323 -190 b 269 -210 314 -199 315 -199 b 249 -216 259 -213 250 -216 l 247 -216 l 247 -349 l 246 -483 l 245 -487 b 225 -499 242 -495 234 -499 b 206 -487 219 -499 210 -495 l 205 -483 l 205 -355 l 205 -227 l 204 -227 l 181 -233 l 138 -244 b 117 -249 127 -247 117 -249 b 115 -385 115 -249 115 -256 l 115 -523 l 114 -526 b 95 -538 110 -534 102 -538 b 74 -526 87 -538 78 -534 l 73 -523 l 73 -391 b 72 -260 73 -269 73 -260 b 72 -260 72 -260 72 -260 b 19 -273 61 -263 23 -273 b 0 -260 10 -273 4 -267 b 0 -209 0 -256 0 -256 l 0 -162 l 1 -158 b 61 -134 5 -148 5 -148 l 73 -131 l 73 -22 b 72 86 73 79 73 86 b 72 86 72 86 72 86 b 19 74 61 83 23 74 b 0 86 10 74 4 79 b 0 137 0 90 0 90 l 0 184 l 1 188 b 61 212 5 198 5 198 l 73 215 l 73 348 l 73 481 l 74 485 b 95 498 78 492 87 498 b 103 495 98 498 100 496 b 114 485 107 494 111 489 l 115 481 l 115 353 l 115 226 l 121 226 b 159 235 123 227 141 231 l 198 247 l 205 248 l 205 384 l 205 521 l 206 524 b 217 535 209 528 212 533 m 205 9 b 205 119 205 70 205 119 l 205 119 b 182 113 204 119 194 116 l 138 102 b 117 97 127 99 117 97 b 115 -12 115 97 115 91 l 115 -122 l 121 -120 b 159 -111 123 -119 141 -115 l 198 -101 l 205 -98 l 205 9 ',\n },\n accidentalDoubleSharp: {\n x_min: 0,\n x_max: 367.5,\n ha: 375,\n o: 'm 0 124 l 0 187 l 61 187 l 122 187 l 122 138 l 122 91 l 153 61 l 183 30 l 213 61 l 243 91 l 243 138 l 243 187 l 306 187 l 367 187 l 367 124 l 367 61 l 321 61 l 274 61 l 243 30 l 213 0 l 243 -31 l 274 -62 l 321 -62 l 367 -62 l 367 -124 l 367 -188 l 306 -188 l 243 -188 l 243 -140 l 243 -93 l 213 -62 l 183 -31 l 153 -62 l 122 -93 l 122 -140 l 122 -188 l 61 -188 l 0 -188 l 0 -124 l 0 -62 l 46 -62 l 92 -62 l 123 -31 l 153 0 l 123 30 l 92 61 l 46 61 l 0 61 l 0 124 ',\n },\n accidentalDoubleFlat: {\n x_min: -21.78125,\n x_max: 483.1875,\n ha: 493,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 383 20 616 20 616 l 20 148 l 21 151 b 140 199 59 183 102 199 b 206 179 164 199 187 192 l 210 176 l 210 396 l 210 617 l 212 621 b 231 632 216 628 223 632 b 250 620 239 632 247 628 b 251 383 251 616 251 616 l 251 148 l 254 151 b 370 199 291 183 332 199 b 415 191 385 199 400 197 b 483 84 458 176 483 134 b 461 0 483 58 476 29 b 332 -142 439 -40 411 -72 l 255 -215 b 231 -229 240 -229 239 -229 b 216 -223 224 -229 220 -227 b 210 -158 210 -217 210 -223 b 210 -120 210 -148 210 -136 l 210 -29 l 205 -34 b 100 -142 182 -65 159 -88 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 201 l -21 616 l -20 620 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 m 341 131 b 328 133 337 133 332 133 b 322 133 326 133 323 133 b 257 87 296 129 273 113 l 251 80 l 251 -37 l 251 -156 l 255 -152 b 375 81 328 -72 375 20 l 375 83 b 341 131 375 113 367 126 ',\n },\n accidentalParensLeft: {\n x_min: -166.0625,\n x_max: -25.859375,\n ha: 0,\n o: 'm -49 369 b -42 370 -46 369 -44 370 b -27 360 -36 370 -29 366 b -25 355 -27 359 -25 358 b -32 335 -25 351 -28 347 b -92 52 -66 248 -87 159 b -93 -1 -93 43 -93 20 b -92 -54 -93 -23 -93 -45 b -32 -337 -85 -162 -66 -251 b -25 -355 -27 -349 -25 -352 b -42 -371 -25 -365 -32 -371 b -61 -353 -50 -371 -51 -369 b -163 -63 -119 -262 -153 -165 b -166 -1 -166 -37 -166 -31 b -163 62 -166 30 -166 36 b -61 352 -153 163 -119 260 b -49 369 -54 365 -51 366 ',\n },\n accidentalParensRight: {\n x_min: 25.859375,\n x_max: 164.6875,\n ha: 168,\n o: 'm 34 369 b 40 370 35 370 38 370 b 59 353 49 370 50 367 b 164 40 122 254 155 158 b 164 0 164 33 164 16 b 164 -40 164 -16 164 -34 b 59 -353 155 -158 122 -254 b 40 -371 53 -366 47 -371 b 34 -370 38 -371 36 -370 b 25 -358 28 -367 25 -363 b 31 -337 25 -352 27 -347 b 92 0 72 -234 92 -117 b 31 335 92 116 72 233 b 25 356 27 345 25 352 b 34 369 25 363 28 366 ',\n },\n accidentalQuarterToneFlatStein: {\n x_min: 0,\n x_max: 272.21875,\n ha: 278,\n o: 'm 243 631 b 250 632 246 632 249 632 b 270 620 259 632 268 628 l 272 616 l 272 201 l 272 -212 l 270 -216 b 251 -229 268 -224 259 -229 b 227 -215 243 -229 240 -229 l 151 -142 b 32 -16 81 -80 53 -49 b 0 84 9 18 0 52 b 111 199 0 149 42 199 b 137 197 119 199 127 198 b 228 151 168 191 197 177 l 231 148 l 231 383 b 232 620 231 616 231 616 b 243 631 234 624 238 630 m 168 131 b 152 133 163 133 157 133 b 107 102 130 133 111 120 b 106 86 107 97 106 91 b 111 41 106 73 108 56 b 227 -152 125 -13 171 -90 l 231 -156 l 231 -37 l 231 80 l 225 87 b 168 131 210 111 190 126 ',\n },\n accidentalThreeQuarterTonesFlatZimmermann: {\n x_min: 0,\n x_max: 607.0625,\n ha: 619,\n o: 'm 243 631 b 250 632 246 632 249 632 b 270 620 259 632 268 628 l 272 616 l 272 201 l 272 -212 l 270 -216 b 251 -229 268 -224 259 -229 b 227 -215 243 -229 240 -229 l 151 -142 b 32 -16 81 -80 53 -49 b 0 84 9 18 0 52 b 111 199 0 149 42 199 b 137 197 119 199 127 198 b 228 151 168 191 197 177 l 231 148 l 231 383 b 232 620 231 616 231 616 b 243 631 234 624 238 630 m 168 131 b 152 133 163 133 157 133 b 107 102 130 133 111 120 b 106 86 107 97 106 91 b 111 41 106 73 108 56 b 227 -152 125 -13 171 -90 l 231 -156 l 231 -37 l 231 80 l 225 87 b 168 131 210 111 190 126 m 347 631 b 353 632 348 632 351 632 b 374 620 363 632 371 628 b 375 383 375 616 375 616 l 375 148 l 377 151 b 492 199 415 183 454 199 b 537 191 507 199 522 197 b 607 84 582 176 607 134 b 583 0 607 58 598 29 b 455 -142 562 -40 533 -72 l 378 -215 b 355 -229 364 -229 362 -229 b 334 -216 345 -229 337 -224 l 333 -212 l 333 201 l 333 616 l 334 620 b 347 631 337 624 341 630 m 465 131 b 451 133 461 133 455 133 b 445 133 449 133 446 133 b 379 87 419 129 396 113 l 375 80 l 375 -37 l 375 -156 l 378 -152 b 499 81 451 -72 499 20 l 499 83 b 465 131 499 113 490 126 ',\n },\n accidentalQuarterToneSharpStein: {\n x_min: 0,\n x_max: 193.28125,\n ha: 197,\n o: 'm 85 514 b 95 517 88 517 89 517 b 114 505 103 517 110 513 l 115 502 l 115 376 b 115 249 115 306 115 249 b 141 258 117 249 127 252 l 167 266 l 172 266 b 190 254 181 265 187 262 l 193 251 l 193 202 l 193 188 b 187 147 193 149 191 152 b 147 130 183 142 182 141 l 115 119 l 115 9 b 115 -99 115 -51 115 -99 b 141 -91 115 -99 127 -95 b 171 -81 166 -81 167 -81 l 171 -81 b 191 -94 181 -81 189 -87 b 193 -142 191 -97 193 -120 b 191 -195 193 -167 191 -194 b 125 -227 187 -205 187 -204 l 115 -230 l 115 -366 l 115 -503 l 114 -506 b 95 -519 110 -514 102 -519 b 74 -506 87 -519 78 -514 l 73 -503 l 73 -374 b 73 -245 73 -260 73 -245 b 73 -245 73 -245 73 -245 b 55 -252 72 -245 63 -249 l 32 -260 b 19 -263 27 -262 23 -263 b 4 -256 13 -263 8 -260 b 0 -215 0 -251 0 -254 b 0 -199 0 -210 0 -206 l 0 -152 l 1 -149 b 8 -140 2 -145 5 -141 b 42 -127 9 -140 24 -133 l 73 -116 l 73 -5 b 73 23 73 4 73 15 b 73 105 73 70 73 105 b 49 97 73 105 61 101 b 17 88 32 91 23 88 b 4 95 10 88 8 91 b 0 137 0 101 0 98 b 0 151 0 141 0 145 l 0 199 l 1 202 b 43 224 5 212 5 212 l 73 234 l 73 367 l 73 502 l 74 505 b 85 514 77 509 81 513 ',\n },\n accidentalThreeQuarterTonesSharpStein: {\n x_min: -1.359375,\n x_max: 455.96875,\n ha: 465,\n o: 'm 352 541 b 357 542 353 542 355 542 b 377 530 364 542 372 537 l 378 526 l 378 394 l 379 262 l 404 266 b 436 270 420 269 430 270 b 450 265 443 270 446 269 b 455 220 455 259 455 260 l 455 208 l 455 161 l 454 156 b 411 140 449 147 447 147 b 378 133 393 137 379 134 b 378 68 378 133 378 106 b 378 22 378 54 378 38 l 379 -87 l 404 -83 b 436 -79 420 -80 430 -79 b 450 -84 443 -79 446 -80 b 455 -129 455 -90 455 -88 l 455 -141 l 455 -188 l 454 -192 b 413 -209 449 -202 447 -202 b 382 -215 398 -212 383 -215 l 378 -215 l 378 -345 l 378 -380 b 375 -485 378 -484 378 -480 b 357 -494 371 -491 364 -494 b 340 -485 351 -494 344 -491 b 336 -383 337 -480 336 -484 l 336 -349 l 336 -223 l 334 -223 b 291 -231 334 -223 314 -227 l 247 -240 l 247 -371 l 246 -503 l 245 -506 b 225 -519 242 -514 234 -519 b 206 -506 219 -519 210 -514 l 205 -503 l 205 -376 l 205 -248 l 160 -256 l 115 -265 l 115 -396 l 115 -527 l 114 -531 b 95 -544 110 -539 102 -544 b 76 -531 87 -544 78 -539 l 73 -527 l 73 -399 b 73 -273 73 -330 73 -273 b 49 -277 73 -273 61 -274 b 17 -281 32 -280 24 -281 b 4 -276 10 -281 8 -280 b -1 -234 0 -269 -1 -272 b 0 -219 -1 -229 0 -224 l 0 -170 l 1 -167 b 10 -158 2 -163 6 -159 b 49 -149 13 -156 16 -155 l 73 -145 l 73 -34 b 73 76 73 26 73 76 b 49 72 73 76 61 74 b 17 68 32 69 24 68 b 4 73 10 68 8 69 b -1 115 0 80 -1 77 b 0 130 -1 120 0 124 l 0 179 l 1 181 b 10 191 2 186 6 190 b 49 199 13 192 16 194 l 73 204 l 73 338 b 73 374 73 352 73 365 b 77 483 73 484 73 477 b 95 492 81 489 88 492 b 111 483 100 492 107 489 b 115 378 115 477 115 483 l 115 342 b 117 212 115 223 115 212 b 204 229 117 212 200 227 l 205 229 l 205 365 l 205 502 l 206 505 b 225 517 210 513 219 517 b 245 505 234 517 242 513 l 246 502 l 247 369 l 247 237 l 249 237 b 336 254 253 238 336 254 b 337 390 336 254 337 302 l 337 526 l 338 530 b 352 541 341 535 347 539 m 336 15 b 336 126 336 102 336 126 l 336 126 b 291 117 336 126 315 122 l 247 109 l 247 -1 l 247 -112 l 249 -112 b 336 -95 253 -111 336 -95 b 336 15 336 -95 336 -56 m 205 -120 b 205 -55 205 -120 205 -93 b 205 -9 205 -41 205 -24 l 205 101 l 160 93 l 115 84 l 115 -26 b 115 -83 115 -49 115 -69 b 117 -137 115 -133 115 -137 b 205 -120 118 -137 204 -120 ',\n },\n accidentalBuyukMucennebFlat: {\n x_min: -171.5,\n x_max: 251.8125,\n ha: 257,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 553 20 616 20 614 b 20 491 20 503 20 491 l 20 491 b 153 535 47 501 149 535 b 174 514 167 535 174 524 b 164 496 174 508 171 501 b 92 470 164 495 132 484 l 20 445 l 20 390 b 20 363 20 378 20 370 b 20 333 20 340 20 333 l 20 333 b 153 377 47 344 149 377 b 174 356 167 377 174 367 b 164 338 174 349 171 342 b 92 312 164 338 132 326 l 20 288 l 20 219 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 30 -21 -212 -21 -212 b -21 273 -21 163 -21 273 b -84 252 -21 273 -50 263 b -152 230 -133 234 -145 230 b -157 231 -155 230 -156 231 b -171 252 -166 234 -171 244 b -160 270 -171 259 -167 266 b -27 316 -159 270 -93 294 l -21 319 l -21 374 b -21 431 -21 406 -21 431 b -84 409 -21 431 -50 421 b -152 388 -133 392 -145 388 b -157 390 -155 388 -156 388 b -171 409 -166 392 -171 401 b -160 428 -171 417 -167 424 b -27 474 -159 428 -93 451 l -21 476 l -21 546 b -20 620 -21 614 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ',\n },\n accidentalBakiyeFlat: {\n x_min: -176.9375,\n x_max: 251.8125,\n ha: 257,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 503 20 616 20 614 b 20 391 20 442 20 391 b 84 424 20 391 49 406 l 147 456 l 152 456 b 153 456 153 456 153 456 b 175 435 166 456 175 446 b 172 427 175 433 174 430 b 92 380 170 420 172 421 l 20 342 l 20 245 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 54 -21 -212 -21 -212 b -21 322 -21 201 -21 322 b -85 290 -21 322 -50 308 l -148 256 l -153 256 b -155 256 -155 256 -155 256 b -176 277 -167 256 -176 266 b -174 285 -176 280 -175 283 b -93 333 -171 294 -174 292 l -21 370 l -21 494 b -20 620 -21 616 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ',\n },\n accidentalKomaSharp: {\n x_min: -1.359375,\n x_max: 455.96875,\n ha: 465,\n o: 'm 352 541 b 357 542 353 542 355 542 b 377 530 364 542 372 537 l 378 526 l 378 394 l 379 262 l 404 266 b 436 270 420 269 430 270 b 450 265 443 270 446 269 b 455 220 455 259 455 260 l 455 208 l 455 161 l 454 156 b 411 140 449 147 447 147 b 378 133 393 137 379 134 b 378 68 378 133 378 106 b 378 22 378 54 378 38 l 379 -87 l 404 -83 b 436 -79 420 -80 430 -79 b 450 -84 443 -79 446 -80 b 455 -129 455 -90 455 -88 l 455 -141 l 455 -188 l 454 -192 b 413 -209 449 -202 447 -202 b 382 -215 398 -212 383 -215 l 378 -215 l 378 -345 l 378 -380 b 375 -485 378 -484 378 -480 b 357 -494 371 -491 364 -494 b 340 -485 351 -494 344 -491 b 336 -383 337 -480 336 -484 l 336 -349 l 336 -223 l 334 -223 b 291 -231 334 -223 314 -227 l 247 -240 l 247 -371 l 246 -503 l 245 -506 b 225 -519 242 -514 234 -519 b 206 -506 219 -519 210 -514 l 205 -503 l 205 -376 l 205 -248 l 160 -256 l 115 -265 l 115 -396 l 115 -527 l 114 -531 b 95 -544 110 -539 102 -544 b 76 -531 87 -544 78 -539 l 73 -527 l 73 -399 b 73 -273 73 -330 73 -273 b 49 -277 73 -273 61 -274 b 17 -281 32 -280 24 -281 b 4 -276 10 -281 8 -280 b -1 -234 0 -269 -1 -272 b 0 -219 -1 -229 0 -224 l 0 -170 l 1 -167 b 10 -158 2 -163 6 -159 b 49 -149 13 -156 16 -155 l 73 -145 l 73 -34 b 73 76 73 26 73 76 b 49 72 73 76 61 74 b 17 68 32 69 24 68 b 4 73 10 68 8 69 b -1 115 0 80 -1 77 b 0 130 -1 120 0 124 l 0 179 l 1 181 b 10 191 2 186 6 190 b 49 199 13 192 16 194 l 73 204 l 73 338 b 73 374 73 352 73 365 b 77 483 73 484 73 477 b 95 492 81 489 88 492 b 111 483 100 492 107 489 b 115 378 115 477 115 483 l 115 342 b 117 212 115 223 115 212 b 204 229 117 212 200 227 l 205 229 l 205 365 l 205 502 l 206 505 b 225 517 210 513 219 517 b 245 505 234 517 242 513 l 246 502 l 247 369 l 247 237 l 249 237 b 336 254 253 238 336 254 b 337 390 336 254 337 302 l 337 526 l 338 530 b 352 541 341 535 347 539 m 336 15 b 336 126 336 102 336 126 l 336 126 b 291 117 336 126 315 122 l 247 109 l 247 -1 l 247 -112 l 249 -112 b 336 -95 253 -111 336 -95 b 336 15 336 -95 336 -56 m 205 -120 b 205 -55 205 -120 205 -93 b 205 -9 205 -41 205 -24 l 205 101 l 160 93 l 115 84 l 115 -26 b 115 -83 115 -49 115 -69 b 117 -137 115 -133 115 -137 b 205 -120 118 -137 204 -120 ',\n },\n accidentalKucukMucennebSharp: {\n x_min: -1.359375,\n x_max: 255.890625,\n ha: 261,\n o: 'm 118 514 b 127 517 121 517 122 517 b 147 505 136 517 142 513 l 148 502 l 148 403 b 148 306 148 351 148 306 b 174 315 149 306 160 310 l 200 324 l 205 323 b 223 312 213 323 220 319 l 225 308 l 225 260 b 225 245 225 255 225 249 b 220 204 225 208 224 209 b 179 188 216 199 215 199 l 148 177 l 148 124 l 148 70 l 189 84 b 236 98 219 94 230 98 b 247 94 240 98 243 97 b 255 52 254 88 255 87 b 255 33 255 47 255 40 l 254 -12 l 253 -15 b 249 -22 253 -18 250 -20 l 245 -24 l 196 -41 l 148 -58 l 148 -108 b 148 -158 148 -136 148 -158 b 174 -148 148 -158 160 -154 b 204 -140 198 -140 200 -140 l 204 -140 b 224 -152 213 -140 221 -145 b 225 -201 224 -155 225 -177 b 224 -254 225 -226 224 -251 b 157 -284 220 -262 220 -262 l 148 -288 l 148 -395 l 148 -503 l 147 -506 b 127 -519 142 -514 134 -519 b 107 -506 119 -519 111 -514 l 106 -503 l 106 -403 b 106 -303 106 -316 106 -303 b 104 -303 104 -303 104 -303 b 88 -310 104 -303 96 -306 l 63 -319 b 51 -322 59 -320 55 -322 b 36 -315 46 -322 40 -319 b 31 -273 32 -309 31 -312 b 31 -258 31 -269 31 -263 l 31 -210 l 34 -206 b 40 -198 35 -204 38 -199 b 74 -186 42 -197 57 -191 l 106 -173 l 106 -123 b 106 -97 106 -112 106 -104 b 106 -72 106 -76 106 -72 b 104 -72 106 -72 106 -72 b 20 -99 89 -79 23 -99 b 0 -84 10 -99 2 -93 b -1 -37 0 -81 -1 -59 b 0 11 -1 -15 0 9 b 58 40 4 22 2 22 l 106 56 l 106 109 b 106 123 106 115 106 119 b 106 162 106 147 106 162 b 81 155 106 162 93 159 b 50 147 65 149 55 147 b 36 152 43 147 40 148 b 31 194 32 158 31 156 b 31 209 31 198 31 204 l 31 256 l 34 260 b 76 281 38 269 38 269 l 106 292 l 106 396 l 106 502 l 107 505 b 118 514 110 509 114 513 ',\n },\n articAccentAbove: {\n x_min: -348.4375,\n x_max: 24.5,\n ha: 25,\n o: 'm -330 155 b -322 156 -329 156 -326 156 b -315 156 -319 156 -317 156 b -298 147 -311 155 -308 154 b -19 30 -224 98 -122 55 l 2 26 b 24 -1 17 22 24 13 b 2 -27 24 -15 17 -23 l -19 -31 b -298 -148 -122 -56 -224 -99 b -322 -158 -313 -158 -315 -158 b -348 -131 -338 -158 -348 -145 b -344 -117 -348 -127 -347 -122 b -328 -104 -341 -112 -338 -111 b -127 -8 -269 -65 -202 -33 b -106 0 -115 -4 -106 -1 b -127 6 -106 0 -115 2 b -328 102 -202 31 -269 63 b -344 116 -338 109 -341 111 b -348 130 -347 120 -348 124 b -330 155 -348 141 -341 152 ',\n },\n articAccentBelow: {\n x_min: -348.4375,\n x_max: 24.5,\n ha: 25,\n o: 'm -330 155 b -322 156 -329 156 -326 156 b -315 156 -319 156 -317 156 b -298 147 -311 155 -308 154 b -19 30 -224 98 -122 55 l 2 26 b 24 -1 17 22 24 13 b 2 -27 24 -15 17 -23 l -19 -31 b -298 -148 -122 -56 -224 -99 b -322 -158 -313 -158 -315 -158 b -348 -131 -338 -158 -348 -145 b -344 -117 -348 -127 -347 -122 b -328 -104 -341 -112 -338 -111 b -127 -8 -269 -65 -202 -33 b -106 0 -115 -4 -106 -1 b -127 6 -106 0 -115 2 b -328 102 -202 31 -269 63 b -344 116 -338 109 -341 111 b -348 130 -347 120 -348 124 b -330 155 -348 141 -341 152 ',\n },\n articTenutoAbove: {\n x_min: 0,\n x_max: 318.5,\n ha: 325,\n o: 'm 20 376 b 167 377 23 377 96 377 b 296 376 231 377 294 377 b 318 347 311 371 318 359 b 296 316 318 333 311 320 b 159 315 294 315 227 315 b 21 316 91 315 24 315 b 0 345 6 320 0 333 b 20 376 0 359 6 371 ',\n },\n articTenutoBelow: {\n x_min: 0,\n x_max: 318.5,\n ha: 325,\n o: 'm 20 376 b 167 377 23 377 96 377 b 296 376 231 377 294 377 b 318 347 311 371 318 359 b 296 316 318 333 311 320 b 159 315 294 315 227 315 b 21 316 91 315 24 315 b 0 345 6 320 0 333 b 20 376 0 359 6 371 ',\n },\n articStaccatoAbove: {\n x_min: 0,\n x_max: 133.390625,\n ha: 136,\n o: 'm 54 66 b 65 68 58 68 61 68 b 122 37 88 68 110 56 b 133 -1 130 26 133 12 b 104 -58 133 -23 123 -44 b 66 -69 92 -65 78 -69 b 10 -38 44 -69 23 -58 b 0 -1 2 -27 0 -13 b 54 66 0 30 20 61 ',\n },\n articStaccatoBelow: {\n x_min: 0,\n x_max: 133.390625,\n ha: 136,\n o: 'm 54 66 b 65 68 58 68 61 68 b 122 37 88 68 110 56 b 133 -1 130 26 133 12 b 104 -58 133 -23 123 -44 b 66 -69 92 -65 78 -69 b 10 -38 44 -69 23 -58 b 0 -1 2 -27 0 -13 b 54 66 0 30 20 61 ',\n },\n articStaccatissimoAbove: {\n x_min: -73.5,\n x_max: 72.140625,\n ha: 74,\n o: 'm -72 252 l -73 254 l 0 254 l 72 254 l 70 252 b 0 -1 70 248 0 -1 b -72 252 -1 -1 -72 248 ',\n },\n articStaccatissimoBelow: {\n x_min: -73.5,\n x_max: 72.140625,\n ha: 74,\n o: 'm -72 252 l -73 254 l 0 254 l 72 254 l 70 252 b 0 -1 70 248 0 -1 b -72 252 -1 -1 -72 248 ',\n },\n articMarcatoAbove: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -8 -1 b -1 0 -5 -1 -4 0 b 16 -11 5 0 13 -4 b 83 -186 17 -12 47 -90 l 148 -358 l 148 -363 b 127 -385 148 -376 138 -385 b 112 -378 122 -385 118 -383 b 54 -226 110 -374 114 -385 b 0 -81 24 -147 0 -81 b -55 -226 -1 -81 -25 -147 b -114 -378 -115 -385 -111 -374 b -129 -385 -119 -383 -123 -385 b -149 -363 -140 -385 -149 -376 l -149 -358 l -84 -186 b -19 -11 -49 -90 -19 -12 b -8 -1 -17 -8 -12 -4 ',\n },\n articMarcatoBelow: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -8 -1 b -1 0 -5 -1 -4 0 b 16 -11 5 0 13 -4 b 83 -186 17 -12 47 -90 l 148 -358 l 148 -363 b 127 -385 148 -376 138 -385 b 112 -378 122 -385 118 -383 b 54 -226 110 -374 114 -385 b 0 -81 24 -147 0 -81 b -55 -226 -1 -81 -25 -147 b -114 -378 -115 -385 -111 -374 b -129 -385 -119 -383 -123 -385 b -149 -363 -140 -385 -149 -376 l -149 -358 l -84 -186 b -19 -11 -49 -90 -19 -12 b -8 -1 -17 -8 -12 -4 ',\n },\n fermataAbove: {\n x_min: -442.359375,\n x_max: 441,\n ha: 450,\n o: 'm -31 487 b -1 488 -21 488 -10 488 b 434 104 216 488 397 330 b 441 27 438 79 441 47 b 439 12 441 20 439 15 b 419 0 435 4 427 0 b 404 5 413 0 408 1 b 398 30 400 11 398 13 b 0 351 390 213 213 351 b -59 348 -20 351 -39 349 b -400 30 -251 324 -393 191 b -405 5 -400 13 -401 11 b -420 0 -409 1 -415 0 b -441 12 -428 0 -436 4 b -442 27 -441 15 -442 20 b -435 104 -442 47 -439 79 b -31 487 -401 316 -235 474 m -13 131 b -1 133 -9 133 -5 133 b 51 105 19 133 39 123 b 61 70 58 95 61 83 b 51 34 61 58 58 45 b -1 6 39 16 19 6 b -46 27 -17 6 -34 13 b -62 69 -57 38 -62 54 b -13 131 -62 98 -44 124 ',\n },\n fermataBelow: {\n x_min: -441,\n x_max: 439.640625,\n ha: 449,\n o: 'm -428 -2 b -421 0 -427 -1 -424 0 b -406 -6 -416 0 -409 -2 b -400 -31 -401 -12 -400 -15 b -1 -352 -392 -215 -215 -352 b 58 -349 19 -352 38 -351 b 398 -31 250 -326 392 -192 b 404 -6 398 -15 400 -12 b 419 -1 408 -2 413 -1 b 439 -13 427 -1 435 -5 b 439 -29 439 -16 439 -22 b 434 -105 439 -48 438 -80 b 0 -489 397 -333 213 -489 b -68 -484 -23 -489 -44 -488 b -441 -36 -280 -452 -436 -263 b -441 -30 -441 -34 -441 -31 b -428 -2 -441 -11 -439 -5 m -13 -9 b -1 -8 -9 -8 -5 -8 b 50 -36 19 -8 39 -19 b 61 -72 57 -47 61 -59 b 50 -106 61 -84 57 -97 b -1 -134 39 -124 19 -134 b -46 -115 -17 -134 -34 -129 b -62 -72 -57 -102 -62 -87 b -13 -9 -62 -44 -44 -16 ',\n },\n breathMarkComma: {\n x_min: -1.359375,\n x_max: 193.28125,\n ha: 197,\n o: 'm 78 233 b 87 233 81 233 84 233 b 187 140 132 233 174 195 b 193 102 190 127 193 115 b 43 -113 193 22 136 -62 b 27 -119 36 -116 31 -119 b 19 -108 21 -119 19 -115 b 29 -97 19 -102 20 -101 b 102 13 73 -72 102 -27 b 92 51 102 26 98 40 l 91 54 l 84 54 b 8 104 53 54 21 74 b -1 142 1 116 -1 130 b 78 233 -1 187 31 227 ',\n },\n breathMarkUpbow: {\n x_min: -170.140625,\n x_max: 168.78125,\n ha: 172,\n o: 'm -160 567 b -122 567 -159 567 -149 567 l -87 567 l -84 566 b -74 553 -78 563 -77 560 b -20 366 -73 551 -49 466 b 31 186 8 267 31 186 b 85 371 31 186 55 269 b 140 559 114 473 138 557 b 153 567 141 564 148 567 b 168 559 159 567 166 564 b 168 555 168 557 168 557 b 92 281 168 548 159 513 b 14 13 50 134 14 13 b 0 0 14 6 6 0 b -17 15 -8 0 -17 8 b -93 283 -17 15 -51 136 b -170 552 -166 533 -170 548 b -170 553 -170 552 -170 552 b -160 567 -170 560 -167 564 ',\n },\n caesura: {\n x_min: 0,\n x_max: 622.03125,\n ha: 635,\n o: 'm 398 417 b 406 419 401 419 404 419 b 427 398 417 419 427 409 b 427 391 427 395 427 392 b 34 -274 424 385 38 -272 b 20 -280 29 -278 25 -280 b 0 -259 9 -280 0 -270 b 0 -252 0 -256 0 -254 b 393 413 2 -247 389 410 b 398 417 394 415 397 416 m 592 417 b 600 419 594 419 597 419 b 622 398 611 419 622 409 b 620 391 622 395 620 392 b 227 -274 617 385 231 -272 b 213 -280 223 -278 219 -280 b 193 -259 202 -280 193 -270 b 194 -252 193 -256 193 -254 b 586 413 196 -247 582 410 b 592 417 588 415 590 416 ',\n },\n caesuraCurved: {\n x_min: 0,\n x_max: 503.609375,\n ha: 514,\n o: 'm 274 430 b 277 430 276 430 277 430 b 310 394 296 430 310 415 b 308 383 310 391 308 387 b 306 367 307 381 307 374 b 236 120 298 305 272 210 b 40 -273 189 -5 125 -134 b 20 -287 35 -283 27 -287 b 5 -281 14 -287 9 -285 b 0 -267 1 -277 0 -273 b 9 -242 0 -262 2 -255 b 246 395 137 -12 232 242 b 274 430 249 416 257 427 m 468 430 b 472 430 469 430 470 430 b 503 394 490 430 503 415 b 502 383 503 391 503 387 b 499 367 502 381 500 374 b 431 120 491 305 465 210 b 234 -273 382 -5 318 -134 b 213 -287 228 -283 220 -287 b 198 -281 208 -287 202 -285 b 193 -267 194 -277 193 -273 b 202 -242 193 -262 196 -255 b 439 395 330 -12 426 242 b 468 430 442 416 451 427 ',\n },\n restMaxima: {\n x_min: 0,\n x_max: 464.140625,\n ha: 474,\n o: 'm 0 0 l 0 347 l 76 347 l 153 347 l 153 0 l 153 -348 l 76 -348 l 0 -348 l 0 0 m 308 -1 l 308 347 l 386 347 l 464 347 l 464 -1 l 464 -348 l 386 -348 l 308 -348 l 308 -1 ',\n },\n restDoubleWhole: {\n x_min: 0,\n x_max: 386.5625,\n ha: 394,\n o: 'm 0 173 l 0 347 l 193 347 l 386 347 l 386 173 l 386 0 l 193 0 l 0 0 l 0 173 ',\n },\n restWhole: {\n x_min: 0,\n x_max: 447.8125,\n ha: 457,\n o: 'm 0 -87 l 0 0 l 223 0 l 447 0 l 447 -87 l 447 -174 l 223 -174 l 0 -174 l 0 -87 ',\n },\n restHalf: {\n x_min: 0,\n x_max: 447.8125,\n ha: 457,\n o: 'm 0 86 l 0 173 l 223 173 l 447 173 l 447 86 l 447 0 l 223 0 l 0 0 l 0 86 ',\n },\n restQuarter: {\n x_min: 0,\n x_max: 300.8125,\n ha: 307,\n o: 'm 49 505 b 53 506 50 505 51 506 b 70 496 58 506 62 503 b 81 485 73 492 78 488 l 96 473 l 111 459 l 122 449 l 134 438 l 182 396 l 255 330 b 292 291 292 298 292 298 l 292 290 l 292 284 l 283 270 b 209 36 234 197 209 113 b 288 -170 209 -44 235 -119 b 299 -184 295 -179 299 -181 b 300 -191 300 -187 300 -188 b 285 -206 300 -199 294 -206 b 280 -206 283 -206 281 -206 b 247 -201 270 -202 259 -201 b 176 -222 223 -201 197 -208 b 114 -340 136 -249 114 -292 b 172 -471 114 -384 134 -433 b 185 -492 182 -481 185 -487 b 181 -502 185 -496 183 -499 b 171 -508 176 -505 174 -508 b 152 -498 166 -508 160 -503 b 0 -284 65 -428 12 -352 b 0 -260 0 -278 0 -270 b 1 -238 0 -252 0 -242 b 148 -140 16 -177 73 -140 b 209 -148 167 -140 189 -142 b 215 -149 212 -148 215 -149 b 215 -149 215 -149 215 -149 l 215 -149 b 201 -136 215 -148 209 -142 l 157 -97 l 96 -41 b 17 34 21 24 17 29 b 17 37 17 36 17 36 b 17 38 17 37 17 38 b 25 56 17 44 17 44 b 110 298 81 131 110 219 b 46 474 110 367 88 431 b 38 491 40 480 38 487 b 49 505 38 498 42 502 ',\n },\n rest8th: {\n x_min: 0,\n x_max: 349.8125,\n ha: 357,\n o: 'm 88 302 b 103 303 93 302 98 303 b 202 224 149 303 191 270 b 205 199 204 216 205 208 b 178 129 205 173 196 147 l 175 126 l 182 127 b 307 249 236 142 284 190 b 313 259 308 254 311 258 b 329 267 317 265 323 267 b 349 247 340 267 349 259 b 201 -263 349 242 204 -258 b 182 -273 197 -270 190 -273 b 163 -260 174 -273 166 -269 b 161 -256 161 -259 161 -258 b 217 -59 161 -248 170 -220 b 272 129 247 43 272 127 b 272 129 272 129 272 129 b 264 122 272 129 268 126 b 140 80 227 94 183 80 b 36 115 102 80 65 91 b 0 194 10 136 0 165 b 88 302 0 244 32 292 ',\n },\n rest16th: {\n x_min: 0,\n x_max: 450.53125,\n ha: 460,\n o: 'm 189 302 b 204 303 193 302 198 303 b 303 224 250 303 292 270 b 306 199 304 216 306 208 b 279 129 306 173 296 147 l 276 126 l 281 127 b 408 249 337 142 385 190 b 412 259 409 254 412 258 b 430 267 417 265 423 267 b 450 247 441 267 450 259 b 200 -605 450 242 204 -599 b 182 -616 197 -612 190 -616 b 163 -602 174 -616 166 -610 b 161 -598 161 -601 161 -601 b 217 -402 161 -589 170 -562 b 272 -213 247 -298 272 -213 b 272 -213 272 -213 272 -213 b 264 -219 272 -213 268 -216 b 140 -262 227 -247 182 -262 b 36 -226 102 -262 65 -249 b 0 -145 12 -206 0 -176 b 17 -84 0 -124 5 -104 b 103 -38 38 -54 70 -38 b 191 -91 137 -38 172 -56 b 205 -141 201 -106 205 -124 b 178 -212 205 -167 196 -194 l 175 -215 l 182 -213 b 307 -93 236 -198 284 -151 b 372 129 308 -88 372 127 b 372 129 372 129 372 129 b 364 122 372 129 368 126 b 240 80 328 94 283 80 b 137 115 202 80 166 91 b 99 194 111 136 99 165 b 189 302 99 244 133 292 ',\n },\n rest32nd: {\n x_min: 0,\n x_max: 551.25,\n ha: 563,\n o: 'm 289 644 b 304 645 294 645 299 645 b 404 566 349 645 392 613 b 406 541 405 557 406 549 b 379 471 406 514 397 489 l 377 467 l 382 470 b 509 591 438 485 485 531 b 513 601 510 595 513 599 b 530 609 518 607 524 609 b 551 588 540 609 551 602 b 200 -605 551 584 204 -599 b 182 -616 197 -612 190 -616 b 163 -602 174 -616 166 -610 b 161 -598 161 -601 161 -601 b 217 -402 161 -589 170 -562 b 272 -213 247 -298 272 -213 b 272 -213 272 -213 272 -213 b 264 -219 272 -213 268 -216 b 140 -262 227 -247 182 -262 b 36 -226 102 -262 65 -249 b 0 -145 12 -206 0 -176 b 17 -84 0 -124 5 -104 b 103 -38 38 -54 70 -38 b 191 -91 137 -38 172 -56 b 205 -141 201 -106 205 -124 b 178 -212 205 -167 196 -194 l 175 -215 l 182 -213 b 307 -93 236 -198 284 -151 b 372 129 308 -88 372 127 b 372 129 372 129 372 129 b 364 122 372 129 368 126 b 240 80 328 94 283 80 b 137 115 202 80 166 91 b 99 195 112 136 99 165 b 118 256 99 217 106 238 b 204 303 138 287 171 303 b 292 249 238 303 273 285 b 306 199 302 234 306 217 b 279 129 306 173 296 148 l 276 126 l 281 127 b 408 248 336 142 385 190 b 473 470 409 254 473 469 b 473 470 473 470 473 470 b 465 464 473 470 469 467 b 341 421 428 435 383 421 b 236 458 303 421 266 433 b 200 537 212 478 200 508 b 289 644 200 585 234 635 ',\n },\n rest64th: {\n x_min: -1.359375,\n x_max: 651.96875,\n ha: 665,\n o: 'm 389 644 b 405 645 394 645 400 645 b 504 566 450 645 492 613 b 507 541 506 557 507 549 b 480 471 507 514 498 489 l 477 467 l 483 470 b 609 591 539 485 586 531 b 613 601 611 595 613 599 b 631 609 619 607 624 609 b 651 588 641 609 651 602 b 200 -946 651 584 204 -941 b 182 -957 197 -953 190 -957 b 163 -945 174 -957 166 -953 b 161 -939 161 -942 161 -942 b 217 -743 161 -931 170 -904 b 272 -555 247 -639 272 -555 b 272 -555 272 -555 272 -555 b 264 -560 272 -555 268 -557 b 140 -603 227 -589 182 -603 b 36 -567 102 -603 65 -592 b -1 -487 12 -548 -1 -517 b 17 -427 -1 -466 5 -445 b 103 -380 38 -395 70 -380 b 191 -433 137 -380 172 -398 b 205 -484 201 -448 205 -466 b 178 -553 205 -509 196 -535 l 175 -557 l 182 -555 b 307 -435 236 -539 284 -494 b 372 -213 308 -430 372 -215 b 372 -213 372 -213 372 -213 b 364 -219 372 -213 368 -216 b 240 -262 328 -247 283 -262 b 137 -226 202 -262 166 -249 b 99 -145 112 -206 99 -176 b 118 -84 99 -124 106 -104 b 204 -38 138 -54 171 -38 b 292 -91 238 -38 273 -56 b 306 -141 302 -106 306 -124 b 279 -212 306 -167 296 -194 l 276 -215 l 281 -213 b 408 -93 336 -198 385 -151 b 473 129 409 -88 473 127 b 473 129 473 129 473 129 b 465 122 473 129 469 126 b 341 80 428 94 383 80 b 236 115 303 80 266 91 b 200 195 213 136 200 165 b 217 256 200 217 206 238 b 304 303 239 287 272 303 b 393 249 338 303 374 285 b 406 199 402 234 406 217 b 379 129 406 173 397 148 l 377 126 l 382 127 b 509 248 436 142 485 190 b 574 470 510 254 574 469 b 574 470 574 470 574 470 b 566 464 574 470 570 467 b 442 421 529 435 484 421 b 337 458 404 421 367 433 b 300 537 313 478 300 508 b 389 644 300 585 334 635 ',\n },\n rest128th: {\n x_min: -1.359375,\n x_max: 752.703125,\n ha: 768,\n o: 'm 490 985 b 504 986 495 986 500 986 b 604 907 551 986 593 954 b 607 884 607 900 607 892 b 581 813 607 857 597 831 l 578 810 l 583 811 b 710 932 638 827 687 873 b 714 943 711 936 713 942 b 730 952 720 949 725 952 b 752 931 741 952 752 943 b 200 -946 752 927 204 -941 b 182 -957 197 -953 190 -957 b 163 -945 174 -957 166 -953 b 161 -939 161 -942 161 -942 b 217 -743 161 -931 170 -904 b 272 -555 247 -639 272 -555 b 272 -555 272 -555 272 -555 b 264 -560 272 -555 268 -557 b 140 -603 227 -589 182 -603 b 36 -567 102 -603 65 -592 b -1 -487 12 -548 -1 -517 b 17 -427 -1 -466 5 -445 b 103 -380 38 -395 70 -380 b 191 -433 137 -380 172 -398 b 205 -484 201 -448 205 -466 b 178 -553 205 -509 196 -535 l 175 -557 l 182 -555 b 307 -435 236 -539 284 -494 b 372 -213 308 -430 372 -215 b 372 -213 372 -213 372 -213 b 364 -219 372 -213 368 -216 b 240 -262 328 -247 283 -262 b 137 -226 202 -262 166 -249 b 99 -145 112 -206 99 -176 b 118 -84 99 -124 106 -104 b 204 -38 138 -54 171 -38 b 292 -91 238 -38 273 -56 b 306 -141 302 -106 306 -124 b 279 -212 306 -167 296 -194 l 276 -215 l 281 -213 b 408 -93 336 -198 385 -151 b 473 129 409 -88 473 127 b 473 129 473 129 473 129 b 465 122 473 129 469 126 b 341 80 428 94 383 80 b 236 115 303 80 266 91 b 200 195 213 136 200 165 b 217 256 200 217 206 238 b 304 303 239 287 272 303 b 393 249 338 303 374 285 b 406 199 402 234 406 217 b 379 129 406 173 397 148 l 377 126 l 382 127 b 509 248 436 142 485 190 b 574 470 510 254 574 469 b 574 470 574 470 574 470 b 566 464 574 470 570 467 b 442 421 529 435 484 421 b 337 458 404 421 367 433 b 300 538 314 477 300 508 b 318 598 300 559 306 580 b 404 645 340 630 372 645 b 494 592 439 645 475 627 b 507 541 502 577 507 559 b 480 471 507 516 498 489 l 477 467 l 483 470 b 608 589 537 485 586 531 b 675 811 611 595 675 810 b 675 811 675 811 675 811 b 666 806 675 811 671 809 b 543 763 628 777 585 763 b 438 799 504 763 468 775 b 401 878 412 820 401 849 b 490 985 401 928 434 977 ',\n },\n dynamicPiano: {\n x_min: -53.078125,\n x_max: 513.140625,\n ha: 485,\n o: 'm 185 383 b 196 384 187 383 191 384 b 277 334 230 384 259 365 b 288 301 281 324 288 306 b 288 297 288 298 288 297 b 294 302 289 297 291 299 b 394 370 323 338 367 367 b 404 371 398 370 401 371 b 510 272 453 371 498 328 b 513 237 513 262 513 251 b 507 172 513 217 511 192 b 326 -34 487 59 412 -26 b 314 -36 322 -36 318 -36 b 274 -24 298 -36 283 -31 l 265 -16 b 224 44 246 -1 232 20 b 223 49 224 47 223 49 b 223 49 223 49 223 49 b 149 -197 221 48 149 -194 b 149 -198 149 -197 149 -198 b 170 -210 149 -202 155 -205 b 187 -215 174 -210 175 -212 b 204 -231 201 -219 204 -222 b 197 -245 204 -240 202 -242 l 194 -248 l 76 -248 l -42 -248 l -46 -245 b -53 -231 -51 -242 -53 -240 b -35 -215 -53 -222 -49 -217 b -13 -210 -21 -212 -20 -212 b -6 -208 -10 -209 -8 -208 b 0 -206 -6 -208 -2 -206 b 25 -188 13 -201 21 -195 b 163 280 28 -183 163 276 b 166 291 163 283 164 287 b 167 302 167 295 167 299 b 155 324 167 315 161 324 b 155 324 155 324 155 324 b 65 230 125 322 85 280 b 53 215 61 217 58 215 b 51 215 53 215 51 215 b 42 224 46 215 42 217 b 57 263 42 231 47 244 b 140 360 77 305 104 337 b 152 370 144 365 149 369 b 185 383 157 376 172 381 m 374 306 b 366 308 371 308 368 308 b 300 273 348 308 321 294 b 284 254 288 262 287 259 b 280 242 283 249 281 245 b 257 169 279 240 270 213 l 236 98 l 236 93 b 251 48 238 77 243 61 b 279 27 258 37 272 27 b 281 27 279 27 280 27 b 291 31 281 27 287 30 b 396 170 334 52 378 109 b 406 247 402 197 406 224 b 401 277 406 259 405 270 b 374 306 397 290 383 303 ',\n },\n dynamicMezzo: {\n x_min: 46.28125,\n x_max: 669.671875,\n ha: 563,\n o: 'm 183 376 b 189 376 185 376 187 376 b 212 374 197 376 208 376 b 265 337 234 369 253 355 b 274 317 268 331 273 320 b 274 316 274 317 274 316 b 280 323 276 316 276 319 b 311 358 288 337 299 348 b 319 366 315 360 318 365 b 356 376 326 373 340 376 b 382 371 364 376 374 374 b 428 337 400 366 417 352 b 436 317 431 331 436 320 b 438 316 436 317 436 316 b 442 323 438 316 439 319 b 475 358 451 337 462 348 b 483 366 477 360 481 365 b 518 376 488 373 503 376 b 544 373 528 376 536 376 b 604 285 579 360 604 326 b 597 249 604 273 601 258 b 543 63 596 247 544 70 b 541 54 543 61 541 55 b 540 44 540 51 540 47 b 552 23 540 33 545 23 b 552 23 552 23 552 23 b 647 126 586 29 627 72 b 658 138 651 136 653 138 b 660 138 660 138 660 138 b 669 129 666 137 669 136 b 654 88 669 122 665 109 b 562 -12 631 43 602 9 l 549 -19 b 521 -27 540 -24 530 -27 b 447 30 490 -27 458 -4 b 443 58 445 38 443 48 b 450 93 443 72 446 84 b 504 278 453 97 504 272 b 507 288 506 283 506 287 b 509 298 507 292 509 295 b 491 326 509 310 502 320 b 487 327 490 327 488 327 b 479 324 484 327 483 326 b 441 270 462 316 443 288 b 435 249 441 265 436 254 b 398 127 434 248 419 195 b 362 4 379 61 362 5 b 328 -1 359 -1 362 -1 b 314 -1 323 -1 319 -1 b 302 -1 310 -1 306 -1 b 266 4 266 -1 269 -1 b 265 6 265 5 265 5 b 303 144 265 13 272 34 b 343 278 325 216 343 276 b 344 288 343 281 344 285 b 345 298 345 291 345 295 b 330 326 345 310 340 320 b 323 327 328 327 325 327 b 317 324 322 327 321 326 b 279 270 300 316 281 288 b 273 249 279 265 274 254 b 236 127 272 248 255 195 b 200 4 216 61 200 5 b 164 -1 197 -1 198 -1 b 151 -1 161 -1 156 -1 b 140 -1 147 -1 142 -1 b 103 4 104 -1 106 -1 b 103 6 103 5 103 5 b 141 144 103 13 108 34 b 181 278 161 216 179 276 b 182 288 181 281 181 285 b 183 298 182 291 183 295 b 168 324 183 310 178 320 b 160 327 166 326 163 327 b 141 320 156 327 151 324 b 69 230 112 305 85 272 b 57 215 65 217 62 215 b 55 215 57 215 55 215 b 46 224 49 215 46 217 b 59 260 46 231 50 242 b 151 363 81 306 112 341 b 161 369 155 365 160 367 b 183 376 166 371 174 374 ',\n },\n dynamicForte: {\n x_min: -118.421875,\n x_max: 597.53125,\n ha: 381,\n o: 'm 460 574 b 464 574 461 574 462 574 b 488 574 470 574 481 574 b 500 573 491 574 498 574 b 594 503 543 570 588 538 b 597 488 596 498 597 494 b 528 417 597 449 564 417 b 502 423 519 417 510 419 b 465 481 477 434 465 458 b 488 528 465 499 472 516 b 490 530 490 530 490 530 b 490 530 490 530 490 530 b 468 517 488 530 475 523 b 349 340 419 485 377 420 b 347 330 348 334 347 330 b 383 328 347 328 363 328 b 428 326 423 328 424 328 b 442 302 438 320 442 312 b 430 281 442 294 438 285 b 385 276 424 277 426 276 l 377 276 l 332 276 l 330 269 b 178 -117 303 126 250 -9 b 1 -249 129 -194 69 -237 b -20 -251 -6 -251 -13 -251 b -114 -187 -65 -251 -100 -227 b -118 -156 -117 -177 -118 -166 b -51 -84 -118 -116 -91 -84 b -31 -87 -46 -84 -39 -86 b 16 -152 0 -95 16 -124 b -12 -205 16 -173 8 -194 b -16 -208 -14 -206 -16 -208 b -14 -208 -16 -208 -14 -208 b -9 -206 -14 -208 -12 -208 b 74 -124 23 -197 54 -166 b 172 224 98 -79 125 22 b 185 276 178 252 183 274 b 185 276 185 276 185 276 b 141 276 185 276 181 276 b 91 280 96 276 96 276 b 77 302 83 285 77 294 b 91 326 77 312 83 320 b 148 328 95 328 96 328 l 198 330 l 202 341 b 460 574 249 473 351 566 ',\n },\n dynamicRinforzando: {\n x_min: 78.9375,\n x_max: 485.921875,\n ha: 417,\n o: 'm 362 378 b 378 380 367 380 372 380 b 472 348 415 380 453 367 b 485 315 481 338 485 327 b 462 273 485 298 477 281 b 439 267 454 269 446 267 b 398 290 424 267 409 274 b 344 319 385 309 364 319 b 281 269 315 319 289 301 b 279 262 280 266 279 262 b 276 256 279 260 277 258 b 274 249 276 254 274 251 b 238 127 273 248 257 192 b 201 4 217 61 201 5 b 166 -1 198 -1 200 -1 b 153 -1 163 -1 157 -1 b 141 -1 148 -1 144 -1 b 104 4 106 -1 107 -1 b 104 6 104 5 104 5 b 142 144 104 13 110 34 b 182 278 164 219 181 276 b 183 288 182 281 182 285 b 185 302 185 292 185 298 b 164 330 185 317 176 328 b 159 330 163 330 161 330 b 102 302 140 330 119 320 b 91 294 95 295 93 294 b 88 294 91 294 89 294 b 78 303 83 294 78 298 b 81 312 78 306 78 309 b 200 373 106 347 160 373 b 215 371 205 373 209 371 b 266 335 235 367 254 353 b 269 331 268 333 269 331 b 269 331 269 331 269 331 b 273 335 269 331 270 334 b 362 378 298 359 330 376 ',\n },\n dynamicSforzando: {\n x_min: 70.78125,\n x_max: 378.390625,\n ha: 315,\n o: 'm 246 373 b 254 373 249 373 251 373 b 372 324 303 373 360 351 b 378 302 377 317 378 309 b 338 251 378 278 362 255 b 328 249 334 249 332 249 b 283 294 303 249 283 270 b 288 315 283 301 284 308 b 289 319 289 317 289 319 b 289 319 289 319 289 319 b 283 320 289 320 287 320 b 270 322 279 322 274 322 b 206 288 242 322 215 308 b 206 283 206 287 206 285 b 257 223 206 267 230 238 b 284 206 272 213 277 210 b 351 90 328 173 351 130 b 340 47 351 74 348 59 b 205 -30 314 -2 264 -30 b 182 -29 198 -30 190 -30 b 84 15 147 -24 103 -5 b 70 48 74 24 70 36 b 108 99 70 70 85 94 b 121 102 112 101 117 102 b 167 56 147 102 167 80 b 159 31 167 48 164 40 l 156 26 l 157 26 b 190 20 167 22 178 20 b 220 26 201 20 212 22 b 258 65 243 34 258 51 b 257 70 258 66 258 69 b 204 126 249 94 234 109 b 114 258 148 158 114 209 b 125 302 114 273 118 288 b 246 373 147 342 193 370 ',\n },\n dynamicZ: {\n x_min: 29.9375,\n x_max: 420.578125,\n ha: 371,\n o: 'm 115 345 b 221 347 117 345 166 347 b 411 345 306 347 409 345 b 420 330 416 342 420 335 b 415 319 420 326 419 321 b 178 118 397 303 179 118 b 178 117 178 118 178 117 b 181 117 178 117 178 117 b 189 117 182 117 185 117 b 193 117 190 117 191 117 b 247 98 215 117 232 111 b 296 75 266 83 280 76 b 302 75 299 75 300 75 b 322 91 311 75 315 79 b 322 91 322 91 322 91 b 322 91 322 91 322 91 b 319 91 322 91 321 91 b 313 90 318 90 315 90 b 283 107 300 90 288 97 b 277 126 279 114 277 121 b 319 167 277 149 295 167 b 319 167 319 167 319 167 b 362 118 347 167 362 147 b 355 82 362 108 359 96 b 311 33 349 65 340 55 b 224 1 284 12 253 1 b 194 5 213 1 204 2 b 168 18 183 8 178 11 b 110 36 151 30 130 36 b 57 15 88 36 68 29 b 47 11 54 12 51 11 b 31 20 40 11 34 13 b 29 26 31 22 29 25 b 68 66 29 36 39 45 b 285 250 73 71 281 248 b 285 250 285 250 285 250 b 231 252 285 252 261 252 b 137 250 190 252 141 250 b 93 227 122 248 110 241 b 78 220 88 222 83 220 b 66 227 74 220 70 222 b 63 234 65 229 63 231 b 85 291 63 241 69 252 b 115 345 108 342 108 344 ',\n },\n ornamentTrill: {\n x_min: -340.28125,\n x_max: 338.921875,\n ha: 346,\n o: 'm -32 520 b -29 521 -31 520 -31 521 b -23 519 -27 521 -24 520 b -20 513 -21 517 -20 516 b -21 506 -20 512 -20 509 b -31 474 -23 502 -27 488 l -53 402 l -66 352 l -68 349 l -57 349 b -32 351 -51 349 -40 351 b 123 370 19 352 74 359 b 137 371 127 370 133 371 b 170 356 152 371 164 366 b 171 355 170 355 170 355 b 216 366 174 355 183 358 b 280 378 268 377 266 377 b 287 378 283 378 284 378 b 332 349 307 378 322 369 b 338 319 336 341 338 330 b 332 301 338 310 336 302 b 242 280 329 299 246 280 b 242 280 242 280 242 280 b 235 288 236 280 235 283 b 235 292 235 290 235 291 b 236 302 236 297 236 299 b 220 337 236 316 230 330 l 216 340 l 210 335 b 159 276 189 322 172 301 b 118 149 152 265 156 274 b 81 34 84 36 85 36 b -8 13 78 33 -4 13 b -8 13 -8 13 -8 13 b -14 20 -12 15 -14 15 b -8 44 -14 24 -12 31 b -2 66 -5 55 -2 65 b -2 66 -2 66 -2 66 l -2 66 b -43 41 -2 66 -21 55 b -114 4 -98 8 -98 8 b -144 0 -123 0 -134 0 b -242 99 -197 0 -242 43 b -242 109 -242 102 -242 105 b -212 219 -240 122 -242 116 b -185 312 -197 270 -185 312 l -185 312 b -189 312 -185 312 -186 312 b -259 312 -200 312 -227 312 b -321 310 -291 312 -310 310 b -334 312 -330 310 -334 312 b -340 319 -338 313 -340 316 b -336 326 -340 322 -338 324 b -291 337 -334 326 -314 331 l -247 347 l -210 348 b -172 348 -190 348 -172 348 b -168 363 -172 348 -171 355 b -145 442 -151 424 -145 441 b -133 452 -144 444 -140 446 l -77 489 b -32 520 -53 506 -32 520 m 57 334 b 53 335 55 335 54 335 b 44 334 50 335 49 335 b -70 316 8 326 -28 320 b -78 309 -78 316 -78 316 b -108 202 -80 305 -88 274 b -141 81 -136 112 -141 93 b -140 74 -141 79 -141 77 b -117 49 -137 59 -127 49 b -107 52 -114 49 -110 51 b 16 127 -106 54 14 126 b 42 217 16 127 42 215 b 49 241 42 222 44 229 b 73 320 53 251 73 317 b 57 334 73 327 65 333 ',\n },\n ornamentTurn: {\n x_min: -423.3125,\n x_max: 421.9375,\n ha: 431,\n o: 'm -262 197 b -247 197 -257 197 -253 197 b -118 162 -210 197 -163 184 b 40 45 -61 134 -13 98 b 277 -95 119 -33 200 -81 b 289 -97 281 -97 285 -97 b 378 0 332 -97 371 -55 b 378 11 378 4 378 6 b 302 83 378 55 345 83 b 242 66 283 83 262 77 b 208 56 231 59 219 56 b 148 120 175 56 148 81 b 201 186 148 151 164 172 b 261 198 220 194 240 198 b 420 45 341 198 411 136 b 421 22 421 37 421 29 b 245 -199 421 -93 338 -199 b 238 -198 243 -199 240 -199 b -44 -47 148 -194 50 -141 b -250 86 -114 22 -183 66 b -295 94 -270 91 -283 94 b -315 91 -302 94 -307 94 b -381 4 -356 81 -381 43 b -355 -56 -381 -18 -372 -40 b -298 -81 -338 -73 -319 -81 b -246 -68 -283 -81 -265 -77 b -212 -58 -234 -61 -223 -58 b -178 -69 -200 -58 -189 -62 b -151 -122 -160 -81 -151 -101 b -171 -167 -151 -138 -157 -155 b -239 -195 -185 -181 -213 -192 b -257 -197 -245 -197 -250 -197 b -423 -5 -352 -197 -423 -109 b -412 65 -423 16 -419 40 b -262 197 -389 137 -329 188 ',\n },\n ornamentTurnSlash: {\n x_min: -423.3125,\n x_max: 421.9375,\n ha: 431,\n o: 'm -10 276 b -2 277 -8 277 -5 277 b 17 265 5 277 13 273 b 19 163 19 260 19 260 l 19 68 l 39 45 b 277 -95 122 -34 200 -81 b 289 -97 281 -97 285 -97 b 378 0 332 -97 371 -54 b 378 11 378 4 378 6 b 302 83 378 55 345 83 b 242 66 283 83 262 77 b 208 56 231 59 219 56 b 148 120 175 56 148 81 b 200 186 148 151 164 172 b 261 198 220 194 240 198 b 420 45 341 198 411 137 b 421 22 421 37 421 29 b 257 -198 421 -86 347 -188 b 242 -198 251 -198 247 -198 b 20 -105 181 -198 95 -163 l 19 -104 l 19 -183 b 19 -216 19 -195 19 -206 b 12 -273 19 -272 17 -267 b -2 -278 8 -277 2 -278 b -21 -266 -10 -278 -19 -274 b -23 -165 -23 -263 -23 -262 l -23 -69 l -44 -47 b -250 86 -117 23 -183 66 b -295 94 -270 93 -284 94 b -315 91 -302 94 -308 94 b -381 5 -356 81 -381 43 b -355 -56 -381 -16 -372 -40 b -299 -81 -338 -73 -319 -81 b -246 -68 -283 -81 -265 -77 b -212 -58 -234 -61 -223 -58 b -168 -77 -196 -58 -179 -65 b -151 -122 -156 -90 -151 -105 b -179 -174 -151 -141 -160 -162 b -239 -195 -194 -184 -217 -192 b -257 -197 -245 -195 -250 -197 b -423 -5 -349 -197 -423 -113 b -423 0 -423 -4 -423 -1 b -277 194 -420 97 -362 173 b -247 197 -268 197 -258 197 b -24 104 -185 197 -100 162 l -23 102 l -23 181 b -21 265 -23 260 -23 260 b -10 276 -20 269 -14 274 ',\n },\n ornamentMordent: {\n x_min: -402.890625,\n x_max: 401.53125,\n ha: 410,\n o: 'm -10 273 b -4 274 -9 273 -6 274 b 16 262 4 274 12 269 b 17 158 17 259 17 259 l 17 56 l 62 112 b 117 174 110 172 110 172 b 122 174 118 174 119 174 b 132 173 125 174 129 173 b 295 11 134 172 171 134 l 307 -1 l 336 34 b 374 76 366 72 368 74 b 381 77 375 77 378 77 b 401 56 392 77 401 68 b 400 48 401 54 401 51 b 223 -172 397 41 230 -166 b 210 -176 220 -174 215 -176 b 201 -174 206 -176 204 -176 b 112 -87 198 -173 178 -152 b 27 0 65 -38 27 0 b 21 -6 27 0 24 -2 l 17 -12 l 17 -147 b 17 -210 17 -173 17 -194 b 10 -292 17 -297 16 -287 b -2 -299 6 -297 2 -299 b -21 -287 -10 -299 -19 -295 b -24 -174 -23 -284 -23 -284 l -24 -63 l -66 -117 b -121 -176 -110 -170 -114 -176 b -125 -176 -122 -176 -123 -176 b -296 -12 -134 -174 -125 -184 l -308 0 l -337 -34 b -375 -77 -367 -73 -370 -76 b -382 -79 -377 -79 -379 -79 b -402 -58 -393 -79 -402 -69 b -401 -49 -402 -55 -402 -52 b -224 170 -398 -43 -231 165 b -212 174 -221 173 -216 174 b -202 173 -208 174 -205 174 b -39 11 -200 172 -151 122 l -28 -1 l -25 1 l -24 4 l -24 130 b -23 260 -24 256 -24 258 b -10 273 -20 266 -16 270 ',\n },\n ornamentShortTrill: {\n x_min: -402.890625,\n x_max: 401.53125,\n ha: 410,\n o: 'm -219 173 b -213 174 -217 174 -215 174 b -202 173 -209 174 -205 173 b -114 86 -200 172 -179 151 b -28 0 -66 37 -28 0 b 40 84 -28 0 2 37 b 117 174 111 173 110 172 b 122 174 118 174 119 174 b 132 173 125 174 129 173 b 295 11 134 172 171 134 l 307 -1 l 336 34 b 374 76 366 72 368 74 b 381 77 375 77 378 77 b 401 56 392 77 401 68 b 400 48 401 54 401 51 b 223 -172 397 41 230 -166 b 210 -176 220 -174 215 -176 b 201 -174 206 -176 204 -176 b 112 -87 198 -173 178 -152 b 27 0 65 -38 27 0 b -42 -86 27 0 -4 -38 b -118 -174 -112 -174 -111 -173 b -123 -176 -119 -176 -121 -176 b -133 -174 -126 -176 -130 -174 b -296 -12 -136 -173 -172 -137 l -308 0 l -337 -34 b -375 -77 -367 -73 -370 -76 b -382 -79 -377 -79 -379 -79 b -402 -58 -393 -79 -402 -69 b -401 -49 -402 -55 -402 -52 b -224 172 -398 -43 -228 167 b -219 173 -223 172 -220 173 ',\n },\n ornamentTremblement: {\n x_min: -571.671875,\n x_max: 570.3125,\n ha: 582,\n o: 'm -386 173 b -381 174 -385 174 -383 174 b -370 173 -377 174 -372 173 b -281 86 -367 172 -347 151 b -196 0 -235 37 -196 0 b -126 84 -196 0 -164 37 b -50 174 -55 173 -57 172 b -44 174 -49 174 -47 174 b -35 173 -42 174 -38 173 b 53 86 -32 172 -12 151 b 138 0 100 37 138 0 b 208 84 140 0 170 37 b 284 174 279 173 277 172 b 289 174 285 174 288 174 b 299 173 294 174 298 173 b 462 11 303 172 338 134 l 475 -1 l 503 34 b 541 76 534 72 536 74 b 548 77 544 77 545 77 b 570 56 560 77 570 68 b 567 48 570 54 568 51 b 392 -172 564 41 397 -166 b 378 -176 387 -174 382 -176 b 368 -174 374 -176 371 -176 b 280 -87 367 -173 345 -152 b 194 0 234 -38 194 0 b 125 -86 194 0 163 -38 b 49 -174 54 -174 55 -173 b 43 -176 47 -176 46 -176 b 34 -174 40 -176 36 -174 b -54 -87 31 -173 10 -152 b -140 0 -102 -38 -140 0 b -209 -86 -141 0 -171 -38 b -285 -174 -280 -174 -279 -173 b -291 -176 -287 -176 -289 -176 b -300 -174 -295 -176 -299 -174 b -464 -12 -304 -173 -340 -137 l -476 0 l -504 -34 b -543 -77 -534 -73 -537 -76 b -549 -79 -545 -79 -547 -79 b -571 -58 -562 -79 -571 -69 b -568 -49 -571 -55 -570 -52 b -392 172 -566 -43 -396 167 b -386 173 -390 172 -387 173 ',\n },\n ornamentPrecompAppoggTrill: {\n x_min: -571.671875,\n x_max: 570.3125,\n ha: 582,\n o: 'm -559 351 b -551 352 -556 352 -553 352 b -530 338 -543 352 -533 348 b -529 169 -530 337 -529 291 l -529 1 l -507 27 l -441 112 b -382 174 -394 169 -390 174 b -378 174 -381 174 -379 174 b -281 86 -370 174 -375 179 b -196 0 -234 37 -196 0 b -126 84 -196 0 -164 37 b -50 174 -55 173 -57 172 b -44 174 -49 174 -47 174 b -35 173 -42 174 -38 173 b 53 86 -32 172 -12 151 b 138 0 100 37 138 0 b 208 84 140 0 170 37 b 284 174 279 173 279 172 b 289 174 285 174 288 174 b 300 173 294 174 298 173 b 462 11 303 172 340 134 l 475 -1 l 503 34 b 541 76 534 72 536 74 b 548 77 544 77 545 77 b 570 56 560 77 570 68 b 567 48 570 54 568 51 b 392 -172 564 41 397 -166 b 378 -176 387 -174 382 -176 b 368 -174 375 -176 371 -176 b 280 -87 367 -173 347 -152 b 194 0 234 -38 194 0 b 126 -86 194 0 163 -38 b 49 -174 54 -174 55 -173 b 44 -176 47 -176 46 -176 b 34 -174 40 -176 36 -174 b -54 -87 31 -173 10 -152 b -140 0 -102 -38 -140 0 b -209 -86 -140 0 -171 -38 b -285 -174 -280 -174 -279 -173 b -291 -176 -287 -176 -288 -176 b -300 -174 -294 -176 -298 -174 b -464 -11 -303 -173 -374 -102 l -476 0 l -506 -37 b -539 -76 -528 -65 -537 -74 b -551 -80 -543 -79 -547 -80 b -570 -68 -558 -80 -566 -76 l -571 -65 l -571 136 b -570 340 -571 331 -571 337 b -559 351 -568 344 -564 348 ',\n },\n ornamentPrecompSlideTrillDAnglebert: {\n x_min: -590.71875,\n x_max: 589.359375,\n ha: 601,\n o: 'm -367 173 b -362 174 -366 174 -364 174 b -351 173 -357 174 -353 173 b -262 86 -348 172 -328 151 b -176 0 -216 37 -176 0 b -107 84 -176 0 -145 37 b -31 174 -36 173 -38 172 b -25 174 -29 174 -28 174 b -16 173 -23 174 -19 173 b 72 86 -13 172 6 151 b 157 0 119 37 157 0 b 227 84 159 0 189 37 b 303 174 298 173 296 172 b 308 174 304 174 307 174 b 318 173 313 174 317 173 b 481 11 322 172 357 134 l 494 -1 l 522 34 b 560 76 553 72 555 74 b 567 77 563 77 564 77 b 589 56 579 77 589 68 b 586 48 589 54 588 51 b 411 -172 583 41 416 -166 b 397 -176 406 -174 401 -176 b 387 -174 393 -176 390 -176 b 299 -87 386 -173 366 -152 b 213 0 253 -38 213 0 b 144 -86 213 0 182 -38 b 68 -174 73 -174 74 -173 b 62 -176 66 -176 65 -176 b 53 -174 59 -176 55 -174 b -35 -87 50 -173 29 -152 b -121 0 -83 -38 -121 0 b -190 -86 -122 0 -152 -38 b -266 -174 -261 -174 -259 -173 b -272 -176 -268 -176 -270 -176 b -281 -174 -276 -176 -280 -174 b -371 -86 -284 -173 -304 -152 b -457 0 -417 -38 -457 0 l -457 0 b -477 -26 -457 0 -470 -16 b -548 -227 -524 -88 -548 -161 b -536 -303 -548 -254 -544 -280 b -533 -317 -534 -309 -533 -313 b -553 -338 -533 -330 -541 -338 b -577 -315 -566 -338 -571 -333 b -590 -227 -586 -287 -590 -258 b -518 -9 -590 -154 -564 -77 b -465 56 -509 2 -504 8 l -402 134 b -367 173 -375 169 -372 172 ',\n },\n ornamentPrecompSlideTrillBach: {\n x_min: -590.71875,\n x_max: 589.359375,\n ha: 601,\n o: 'm 175 273 b 182 274 178 273 181 274 b 202 262 190 274 198 269 b 204 158 204 259 204 259 l 204 56 l 250 112 b 303 174 296 172 298 172 b 308 174 304 174 307 174 b 318 173 313 174 317 173 b 481 11 322 172 357 134 l 494 -1 l 522 34 b 560 76 553 72 555 74 b 567 77 563 77 564 77 b 589 56 579 77 589 68 b 586 48 589 54 588 51 b 411 -172 583 41 416 -166 b 397 -176 406 -174 401 -176 b 387 -174 393 -176 390 -176 b 299 -87 386 -173 366 -152 b 213 0 253 -38 213 0 b 208 -6 213 0 210 -2 l 204 -12 l 204 -147 b 204 -210 204 -173 204 -194 b 198 -292 204 -297 204 -287 b 183 -299 194 -297 189 -299 b 164 -287 175 -299 167 -295 b 163 -174 163 -284 163 -284 l 161 -63 l 119 -117 b 65 -176 76 -170 73 -176 b 61 -176 63 -176 62 -176 b -35 -87 51 -174 57 -180 b -121 0 -83 -38 -121 0 b -190 -86 -122 0 -152 -38 b -266 -174 -261 -174 -259 -173 b -272 -176 -268 -176 -270 -176 b -281 -174 -276 -176 -280 -174 b -371 -86 -284 -173 -304 -152 b -457 0 -417 -38 -457 0 l -457 0 b -477 -26 -457 0 -470 -16 b -548 -227 -524 -88 -548 -161 b -536 -303 -548 -254 -544 -280 b -533 -317 -534 -309 -533 -313 b -553 -338 -533 -330 -541 -338 b -577 -315 -566 -338 -571 -333 b -590 -227 -586 -287 -590 -258 b -518 -9 -590 -154 -564 -77 b -465 56 -509 2 -504 8 l -402 134 b -363 174 -374 170 -371 174 b -359 174 -362 174 -360 174 b -262 86 -351 174 -356 179 b -176 0 -216 37 -176 0 b -107 84 -176 0 -145 37 b -31 174 -36 173 -38 172 b -25 174 -29 174 -28 174 b -16 173 -23 174 -19 173 b 147 11 -13 172 35 123 l 157 -1 l 160 1 l 163 4 l 163 130 b 164 260 163 256 163 258 b 175 273 166 266 170 270 ',\n },\n ornamentPrecompTrillSuffixDandrieu: {\n x_min: -590.71875,\n x_max: 589.359375,\n ha: 601,\n o: 'm 544 335 b 553 337 548 337 551 337 b 575 313 563 337 570 330 b 589 226 583 285 589 256 b 517 8 589 152 563 76 b 464 -58 507 -4 503 -9 l 401 -136 b 362 -176 372 -172 370 -176 b 357 -176 360 -176 359 -176 b 261 -87 349 -174 355 -180 b 175 0 215 -38 175 0 b 106 -86 175 0 144 -38 b 29 -174 35 -174 36 -173 b 24 -176 28 -176 27 -176 b 14 -174 21 -176 17 -174 b -73 -87 12 -173 -8 -152 b -159 0 -121 -38 -159 0 b -228 -86 -160 0 -190 -38 b -304 -174 -299 -174 -298 -173 b -310 -176 -306 -176 -308 -176 b -319 -174 -314 -176 -318 -174 b -483 -12 -323 -173 -359 -137 l -495 0 l -524 -34 b -562 -77 -553 -73 -556 -76 b -568 -79 -564 -79 -566 -79 b -590 -58 -581 -79 -590 -69 b -588 -49 -590 -55 -589 -52 b -412 170 -585 -43 -417 165 b -398 174 -408 173 -402 174 b -389 173 -394 174 -392 174 b -300 86 -387 172 -366 151 b -215 -1 -254 37 -215 -1 b -145 84 -215 -1 -183 37 b -69 173 -74 173 -76 172 b -63 174 -68 174 -66 174 b -54 173 -61 174 -57 173 b 34 86 -51 172 -31 151 b 119 -1 81 37 119 -1 b 189 84 121 -1 151 37 b 265 173 259 173 258 172 b 270 174 266 174 269 174 b 280 173 274 174 279 173 b 370 84 283 172 303 151 b 455 -1 416 37 455 -1 l 455 -1 b 476 24 455 -1 469 15 b 547 226 522 87 547 159 b 534 302 547 252 543 278 b 532 317 533 308 532 313 b 544 335 532 326 536 333 ',\n },\n ornamentPrecompDoubleCadenceUpperPrefix: {\n x_min: -597.53125,\n x_max: 596.171875,\n ha: 608,\n o: 'm -533 324 b -525 327 -530 326 -528 327 b -504 305 -514 327 -504 317 b -504 305 -504 305 -504 305 b -513 284 -504 299 -504 299 b -556 112 -541 226 -556 167 b -545 33 -556 84 -552 58 b -524 -20 -541 15 -532 -9 l -522 -23 l -491 15 l -413 111 b -355 174 -367 169 -363 174 b -351 174 -353 174 -352 174 b -254 86 -343 174 -348 179 b -168 -1 -208 37 -168 -1 b -100 84 -168 -1 -137 37 b -23 173 -28 173 -29 172 b -19 174 -21 174 -20 174 b -8 173 -14 174 -10 173 b 80 86 -5 172 13 151 b 166 -1 127 37 166 -1 b 235 84 166 -1 197 37 b 311 173 306 173 304 172 b 317 174 313 174 314 174 b 326 173 319 174 323 173 b 490 11 329 172 366 134 l 502 -1 l 530 34 b 568 76 560 72 563 74 b 575 77 570 77 573 77 b 596 56 586 77 596 68 b 594 48 596 54 596 51 b 417 -172 592 41 424 -166 b 405 -176 415 -174 409 -176 b 396 -174 401 -176 398 -176 b 307 -87 393 -173 372 -152 b 221 -1 259 -38 221 -1 b 152 -86 221 -1 190 -38 b 76 -176 81 -174 83 -173 b 70 -176 74 -176 73 -176 b 61 -174 66 -176 62 -174 b -27 -87 58 -173 38 -152 b -114 -1 -74 -38 -112 -1 b -182 -86 -114 -1 -145 -38 b -258 -176 -253 -174 -253 -173 b -264 -176 -259 -176 -262 -176 b -274 -174 -268 -176 -272 -174 b -438 -11 -277 -173 -348 -102 l -449 0 l -479 -37 b -524 -80 -513 -80 -514 -80 l -524 -80 b -553 -52 -534 -80 -540 -74 b -597 109 -583 -8 -597 48 b -560 280 -597 165 -585 224 b -533 324 -548 310 -540 322 ',\n },\n ornamentPrecompDoubleCadenceUpperPrefixTurn: {\n x_min: -597.53125,\n x_max: 596.171875,\n ha: 608,\n o: 'm -533 324 b -525 327 -530 326 -528 327 b -504 305 -514 327 -504 317 b -504 305 -504 305 -504 305 b -513 284 -504 299 -504 299 b -556 112 -541 226 -556 167 b -545 33 -556 84 -552 58 b -524 -20 -541 15 -532 -9 l -522 -23 l -491 15 l -413 111 b -355 174 -367 169 -363 174 b -351 174 -353 174 -352 174 b -254 86 -343 174 -348 179 b -168 -1 -208 37 -168 -1 b -100 84 -168 -1 -137 37 b -23 173 -28 173 -29 172 b -19 174 -21 174 -20 174 b -8 173 -14 174 -10 173 b 155 11 -5 172 43 123 l 166 -1 l 168 1 l 170 4 l 170 130 b 171 260 170 256 170 258 b 191 274 175 269 183 274 b 205 267 196 274 201 272 b 212 158 212 262 210 273 l 212 56 l 257 112 b 311 173 304 172 304 172 b 317 174 313 174 314 174 b 326 173 319 174 323 173 b 490 11 329 172 366 134 l 502 -1 l 530 34 b 568 76 560 72 563 74 b 575 77 570 77 573 77 b 596 56 586 77 596 68 b 594 48 596 54 596 51 b 417 -172 592 41 424 -166 b 405 -176 415 -174 409 -176 b 396 -174 401 -176 398 -176 b 307 -87 393 -173 372 -152 b 221 -1 259 -38 221 -1 b 216 -6 221 -1 219 -2 l 212 -12 l 212 -147 b 212 -210 212 -173 212 -194 b 205 -292 212 -297 210 -287 b 191 -299 201 -297 196 -299 b 172 -287 183 -299 175 -295 b 170 -174 171 -284 171 -284 l 170 -63 l 127 -117 b 73 -176 84 -170 80 -176 b 68 -176 72 -176 70 -176 b -27 -87 59 -174 65 -180 b -114 0 -74 -38 -112 0 b -182 -86 -114 0 -145 -38 b -258 -174 -253 -174 -253 -173 b -264 -176 -259 -176 -262 -176 b -274 -174 -268 -176 -272 -174 b -438 -11 -277 -173 -348 -102 l -449 0 l -479 -37 b -524 -80 -513 -80 -514 -80 l -524 -80 b -553 -52 -534 -80 -540 -74 b -597 109 -583 -8 -597 48 b -560 280 -597 165 -585 224 b -533 324 -548 310 -540 322 ',\n },\n ornamentPrecompTrillLowerSuffix: {\n x_min: -597.53125,\n x_max: 596.171875,\n ha: 608,\n o: 'm -413 173 b -408 174 -412 174 -409 174 b -397 173 -404 174 -400 173 b -308 86 -394 172 -374 151 b -223 0 -261 37 -223 0 b -153 84 -223 0 -191 37 b -77 174 -83 173 -84 172 b -72 174 -76 174 -74 174 b -62 173 -68 174 -63 173 b 25 86 -59 172 -39 151 b 112 0 73 37 111 0 b 181 84 112 0 144 37 b 257 174 251 173 251 172 b 262 174 258 174 261 174 b 273 173 266 174 270 173 b 436 9 276 172 347 101 l 447 -1 l 477 36 b 522 79 511 79 513 79 l 522 79 b 552 51 533 79 539 73 b 596 -112 582 6 596 -51 b 567 -262 596 -161 586 -213 b 539 -322 558 -287 544 -316 b 524 -327 534 -326 529 -327 b 504 -315 515 -327 507 -323 b 503 -308 503 -312 503 -309 b 511 -285 503 -302 504 -297 b 555 -113 540 -227 555 -169 b 544 -34 555 -86 551 -59 b 522 19 540 -16 530 8 l 521 22 l 481 -26 l 405 -122 b 353 -176 366 -172 362 -176 b 349 -176 352 -176 351 -176 b 253 -87 341 -176 347 -180 b 167 0 206 -38 167 0 b 99 -86 167 0 136 -38 b 21 -174 27 -174 28 -173 b 17 -176 20 -176 19 -176 b 6 -174 13 -176 9 -174 b -81 -87 4 -173 -14 -152 b -167 0 -129 -38 -167 0 b -236 -86 -167 0 -198 -38 b -313 -174 -307 -174 -306 -173 b -318 -176 -314 -176 -315 -176 b -328 -174 -321 -176 -325 -174 b -491 -12 -330 -173 -367 -137 l -503 0 l -530 -34 b -570 -77 -562 -73 -564 -76 b -577 -79 -571 -79 -574 -79 b -597 -58 -588 -79 -597 -69 b -596 -49 -597 -55 -597 -52 b -417 172 -593 -43 -423 167 b -413 173 -417 172 -415 173 ',\n },\n stringsDownBow: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -9 215 b 0 217 -6 217 -4 217 b 19 205 8 217 14 213 b 20 142 20 202 20 201 l 20 84 l 23 84 b 144 -27 81 74 129 30 b 148 -66 147 -40 148 -54 b 36 -213 148 -134 103 -197 b 0 -219 24 -217 12 -219 b -145 -104 -68 -219 -129 -173 b -149 -68 -148 -91 -149 -79 b -24 84 -149 6 -98 74 l -21 84 l -21 142 b -19 205 -20 201 -20 202 b -9 215 -17 209 -13 213 m -21 -15 b -23 41 -21 37 -21 41 b -23 41 -23 41 -23 41 b -76 11 -35 40 -62 26 b -108 -65 -98 -11 -108 -38 b -1 -176 -108 -122 -65 -176 b 107 -65 63 -176 107 -122 b 74 11 107 -38 96 -11 b 20 41 61 26 32 41 b 20 -15 20 41 20 15 b 19 -74 20 -72 20 -72 b 0 -87 14 -83 6 -87 b -19 -74 -8 -87 -16 -83 b -21 -15 -20 -72 -20 -72 ',\n },\n stringsUpBow: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -137 381 b -130 383 -134 383 -133 383 b -111 371 -122 383 -114 378 b -55 224 -110 370 -85 305 b 0 80 -25 145 -1 80 b 54 224 0 80 24 145 b 112 377 114 384 110 373 b 127 384 118 381 122 384 b 148 362 138 384 148 374 l 148 356 l 83 183 b 16 9 47 88 17 11 b -1 0 12 2 5 0 b -14 5 -5 0 -10 1 b -84 183 -19 9 -13 -6 l -149 356 l -149 362 b -137 381 -149 371 -145 378 ',\n },\n stringsHarmonic: {\n x_min: -122.5,\n x_max: 121.140625,\n ha: 124,\n o: 'm -16 145 b 0 147 -10 147 -5 147 b 121 -1 66 147 121 77 b 114 -49 121 -16 118 -33 b -1 -148 95 -112 47 -148 b -85 -106 -31 -148 -61 -134 b -122 -1 -110 -76 -122 -38 b -16 145 -122 68 -81 134 m 12 111 b 0 113 8 113 4 113 b -68 22 -29 113 -61 73 b -70 0 -69 15 -70 6 b -13 -113 -70 -49 -47 -98 b -1 -115 -9 -115 -5 -115 b 63 -40 24 -115 53 -83 b 68 -1 66 -27 68 -15 b 12 111 68 48 46 97 ',\n },\n pluckedSnapPizzicatoAbove: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -9 215 b 0 217 -6 217 -4 217 b 19 205 8 217 14 213 b 20 142 20 202 20 201 l 20 84 l 23 84 b 144 -27 81 74 129 30 b 148 -66 147 -40 148 -54 b 36 -213 148 -134 103 -197 b 0 -219 24 -217 12 -219 b -145 -104 -68 -219 -129 -173 b -149 -68 -148 -91 -149 -79 b -24 84 -149 6 -98 74 l -21 84 l -21 142 b -19 205 -20 201 -20 202 b -9 215 -17 209 -13 213 m -21 -15 b -23 41 -21 37 -21 41 b -23 41 -23 41 -23 41 b -76 11 -35 40 -62 26 b -108 -65 -98 -11 -108 -38 b -1 -176 -108 -122 -65 -176 b 107 -65 63 -176 107 -122 b 74 11 107 -38 96 -11 b 20 41 61 26 32 41 b 20 -15 20 41 20 15 b 19 -74 20 -72 20 -72 b 0 -87 14 -83 6 -87 b -19 -74 -8 -87 -16 -83 b -21 -15 -20 -72 -20 -72 ',\n },\n pluckedSnapPizzicatoBelow: {\n x_min: -149.71875,\n x_max: 148.359375,\n ha: 151,\n o: 'm -9 215 b 0 217 -6 217 -4 217 b 19 205 8 217 14 213 b 20 142 20 202 20 201 l 20 84 l 23 84 b 144 -27 81 74 129 30 b 148 -66 147 -40 148 -54 b 36 -213 148 -134 103 -197 b 0 -219 24 -217 12 -219 b -145 -104 -68 -219 -129 -173 b -149 -68 -148 -91 -149 -79 b -24 84 -149 6 -98 74 l -21 84 l -21 142 b -19 205 -20 201 -20 202 b -9 215 -17 209 -13 213 m -21 -15 b -23 41 -21 37 -21 41 b -23 41 -23 41 -23 41 b -76 11 -35 40 -62 26 b -108 -65 -98 -11 -108 -38 b -1 -176 -108 -122 -65 -176 b 107 -65 63 -176 107 -122 b 74 11 107 -38 96 -11 b 20 41 61 26 32 41 b 20 -15 20 41 20 15 b 19 -74 20 -72 20 -72 b 0 -87 14 -83 6 -87 b -19 -74 -8 -87 -16 -83 b -21 -15 -20 -72 -20 -72 ',\n },\n pluckedLeftHandPizzicato: {\n x_min: 0,\n x_max: 319.859375,\n ha: 326,\n o: 'm 149 508 b 159 509 152 509 155 509 b 186 494 170 509 181 503 b 190 440 190 487 190 488 l 190 430 l 190 377 l 242 377 l 251 377 b 303 373 298 377 296 377 b 319 345 314 367 319 356 b 304 319 319 335 314 324 b 250 315 296 315 299 315 l 242 315 l 190 315 l 190 262 l 190 252 b 186 198 190 204 190 205 b 159 183 179 188 170 183 b 132 198 148 183 138 188 b 127 252 127 205 127 204 l 127 262 l 127 315 l 76 315 l 68 315 b 14 319 20 315 21 315 b 0 347 4 324 0 335 b 14 373 0 356 4 367 b 68 377 21 377 20 377 l 76 377 l 127 377 l 127 430 l 127 440 b 132 494 127 488 127 487 b 149 508 136 501 142 505 ',\n },\n keyboardPedalPed: {\n x_min: -1.359375,\n x_max: 1064.390625,\n ha: 1086,\n o: 'm 296 692 b 314 694 302 694 307 694 b 386 685 337 694 366 689 b 548 498 480 660 548 580 b 548 481 548 492 548 487 b 455 395 541 426 499 395 b 370 462 420 395 383 417 b 362 496 364 477 362 488 b 377 514 362 509 367 514 b 393 501 386 514 390 510 b 432 474 397 484 413 474 b 470 487 445 474 458 478 b 491 530 484 496 491 510 b 490 544 491 534 491 539 b 333 660 479 606 411 657 l 323 662 l 315 646 b 269 524 285 591 269 556 b 321 431 269 492 287 466 b 349 395 338 413 343 408 b 363 342 359 378 363 362 b 359 312 363 333 362 322 b 285 158 348 266 318 206 b 281 152 283 155 281 152 b 281 152 281 152 281 152 b 287 154 283 152 284 152 b 318 155 298 154 308 155 b 461 98 371 155 419 136 l 464 97 l 483 112 b 503 129 494 120 503 127 b 504 130 503 129 504 129 b 503 138 504 131 503 134 b 500 180 500 152 500 166 b 553 326 500 238 518 288 b 604 366 560 331 592 358 b 649 381 617 376 632 381 b 696 362 665 381 681 374 b 724 302 714 347 724 324 b 695 238 724 278 714 255 b 660 210 691 234 662 212 b 579 148 658 209 582 151 b 579 148 579 148 579 148 b 596 106 579 144 589 119 b 622 77 604 88 609 83 b 657 69 632 72 645 69 b 748 112 688 69 721 84 b 755 123 754 117 755 120 b 755 127 755 124 755 126 b 751 165 752 137 751 151 b 758 219 751 183 754 202 b 894 387 774 290 820 347 b 896 390 896 388 896 388 b 891 398 896 391 895 392 b 622 560 827 477 730 535 b 600 580 605 564 600 569 b 617 596 600 591 607 596 b 628 595 622 596 624 596 b 1057 248 846 552 1020 412 b 1064 191 1061 229 1064 209 b 922 0 1064 94 1005 9 b 902 -1 916 -1 909 -1 b 774 76 847 -1 800 26 b 769 83 770 81 770 83 b 769 81 769 83 769 83 b 627 -1 733 29 677 -1 b 548 27 597 -1 570 8 b 515 88 537 37 525 61 l 513 95 l 510 93 l 453 45 b 390 0 396 0 396 0 b 390 0 390 0 390 0 b 374 15 381 0 377 4 b 268 105 359 69 314 105 b 250 104 262 105 257 105 l 243 102 l 234 90 b 155 1 201 49 159 2 b 147 -1 152 0 149 -1 b 130 15 138 -1 130 6 b 132 20 130 18 132 19 b 136 31 133 22 134 27 b 220 131 149 74 178 109 b 231 137 225 134 230 136 b 302 278 280 202 302 244 b 265 335 302 299 295 309 b 209 442 234 363 213 402 b 209 455 209 446 209 451 b 279 648 209 502 232 564 l 285 659 l 283 659 b 176 627 238 653 210 645 b 57 477 111 594 66 538 b 55 459 55 471 55 464 b 72 409 55 437 61 415 b 93 403 78 405 87 403 b 152 467 123 403 151 431 b 168 488 153 483 157 488 b 185 462 181 488 185 483 l 185 460 b 137 344 183 409 168 369 b 78 322 119 328 98 322 b 13 360 50 322 25 335 b -1 426 4 380 -1 402 b 89 610 -1 488 32 559 b 296 692 147 659 210 685 m 926 348 b 921 353 924 351 922 353 b 914 348 920 353 918 351 b 823 167 857 306 823 237 b 828 124 823 154 826 138 b 890 31 837 79 862 40 b 896 31 892 31 894 31 b 956 104 916 31 940 59 b 970 191 965 129 970 159 b 966 241 970 208 969 224 b 926 348 959 277 945 313 m 627 326 b 619 326 624 326 622 326 b 598 316 611 326 604 323 b 568 215 579 288 568 255 b 568 208 568 213 568 210 b 571 183 570 195 570 184 l 571 183 b 594 201 571 183 582 191 l 634 231 b 660 259 653 247 656 248 b 664 278 662 266 664 272 b 627 326 664 299 649 320 ',\n },\n keyboardPedalUp: {\n x_min: -1.359375,\n x_max: 592.078125,\n ha: 604,\n o: 'm 280 692 b 295 694 283 692 289 694 b 310 692 300 694 307 692 b 357 630 340 684 357 657 b 336 580 357 612 351 594 b 311 538 321 566 311 549 b 352 492 311 512 330 492 b 366 495 357 492 362 492 b 397 553 390 503 397 517 b 415 603 397 576 402 591 b 460 623 427 617 443 623 b 509 599 479 623 498 614 b 522 559 518 587 522 573 b 494 506 522 538 513 519 b 451 495 481 498 473 496 b 415 488 432 495 426 494 b 394 449 404 483 394 464 b 394 448 394 448 394 448 l 394 440 l 397 433 b 428 409 404 420 413 413 b 438 408 431 408 435 408 b 479 431 450 408 462 415 b 528 455 495 448 510 455 b 548 452 534 455 541 453 b 592 391 577 442 592 416 b 549 331 592 365 577 340 b 528 327 541 328 534 327 b 479 351 510 327 495 335 b 438 374 464 367 450 374 b 417 369 431 374 424 373 b 394 333 402 360 394 348 b 400 312 394 326 396 319 b 451 287 408 294 420 288 b 513 258 484 285 499 278 b 522 223 519 247 522 234 b 461 159 522 190 496 159 b 449 161 457 159 453 159 b 397 229 416 167 397 191 b 366 288 397 265 390 278 b 352 290 362 290 357 290 b 315 262 336 290 321 280 b 311 245 313 256 311 251 b 334 204 311 233 318 220 b 355 170 348 190 351 184 b 357 152 356 166 357 159 b 355 136 357 147 356 140 b 295 88 345 104 321 88 b 232 152 264 88 232 112 b 255 204 232 174 238 186 b 279 244 273 222 279 231 l 279 245 b 238 290 279 270 259 290 b 224 288 234 290 228 290 b 193 229 200 278 193 265 b 141 161 193 191 174 167 b 129 159 137 159 133 159 b 68 223 93 159 68 190 b 77 258 68 234 70 247 b 138 287 91 278 106 285 b 185 302 166 287 175 291 b 196 333 193 312 196 323 b 174 369 196 347 187 360 b 152 374 166 373 159 374 b 111 351 140 374 126 367 b 62 327 95 335 80 327 b 51 328 58 327 54 327 b -1 391 16 334 -1 363 b 53 455 -1 420 17 449 b 62 455 57 455 59 455 b 111 431 80 455 95 448 b 152 408 127 415 140 408 b 161 409 155 408 159 408 b 193 433 176 413 186 420 l 196 440 l 196 448 b 196 451 196 449 196 449 b 190 471 196 459 194 463 b 137 495 182 489 167 495 l 134 495 l 134 495 b 68 560 95 495 68 521 b 129 623 68 596 95 623 b 144 621 134 623 138 623 b 193 553 175 614 193 589 b 224 495 193 517 200 503 b 238 492 228 492 234 492 b 279 538 259 492 279 512 b 254 580 279 549 269 566 b 232 630 239 594 232 612 b 280 692 232 657 250 684 m 307 456 b 295 458 303 458 299 458 b 230 391 258 458 230 426 b 236 360 230 381 231 371 b 295 324 249 337 272 324 b 353 360 318 324 341 337 b 360 391 357 370 360 381 b 307 456 360 421 340 451 ',\n },\n pictChokeCymbal: {\n x_min: 0,\n x_max: 227.3125,\n ha: 232,\n o: 'm 91 213 b 100 215 93 215 96 215 b 227 58 167 215 224 144 b 227 52 227 56 227 54 b 61 -201 227 -43 164 -138 b 29 -216 44 -212 36 -216 b 23 -210 27 -216 24 -213 b 21 -205 21 -208 21 -206 b 34 -192 21 -201 25 -197 b 122 -55 89 -161 122 -106 b 104 6 122 -33 117 -12 l 103 9 l 96 9 b 4 79 57 9 17 38 b 0 112 1 90 0 101 b 91 213 0 163 36 209 ',\n },\n wiggleArpeggiatoUp: {\n x_min: 58.53125,\n x_max: 228.671875,\n ha: 294,\n o: 'm 138 371 b 142 373 140 371 141 373 b 178 342 149 373 156 366 b 228 251 217 297 228 278 b 228 244 228 248 228 247 b 176 147 227 212 212 184 b 123 73 152 122 132 93 b 121 62 122 70 121 66 b 145 13 121 48 129 31 b 153 -2 151 6 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 145 -11 b 129 -1 140 -11 136 -8 b 61 87 89 37 68 68 b 58 113 59 95 58 105 b 110 215 58 144 74 177 b 163 287 134 240 155 269 b 166 299 166 291 166 295 b 141 348 166 313 157 330 b 133 360 134 356 133 358 b 133 363 133 362 133 362 b 138 371 133 367 136 370 ',\n },\n arrowheadBlackUp: {\n x_min: -10.890625,\n x_max: 299.4375,\n ha: 294,\n o: 'm 136 460 b 142 462 137 462 140 462 b 166 449 152 462 161 456 b 171 428 168 446 168 445 b 288 131 194 322 238 209 b 298 115 295 120 296 117 b 299 106 298 112 299 109 b 273 81 299 91 287 81 b 255 86 268 81 261 83 b 155 116 225 104 183 116 l 152 116 l 149 108 b 141 83 148 102 144 91 b 134 48 137 69 134 58 b 149 9 134 34 140 24 b 153 -1 152 5 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 147 -11 b 122 2 138 -11 133 -6 b 95 61 104 20 95 38 b 107 108 95 74 99 90 b 108 113 107 111 108 112 b 107 113 108 113 108 113 b 102 113 106 113 104 113 b 31 86 76 108 53 98 b 14 80 24 81 20 80 b -10 106 0 80 -10 91 b 0 131 -10 115 -9 116 b 115 430 49 209 91 317 b 136 460 119 451 123 456 ',\n },\n arrowheadBlackDown: {\n x_min: -10.890625,\n x_max: 298.078125,\n ha: 294,\n o: 'm 138 473 b 142 474 140 473 141 474 b 164 459 148 474 153 470 b 191 402 183 442 191 423 b 181 353 191 388 187 371 b 178 349 179 352 178 349 b 179 348 178 348 179 348 b 185 349 181 348 182 348 b 255 376 210 355 234 363 b 272 381 264 381 266 381 b 298 355 287 381 298 370 b 288 330 298 348 298 345 b 171 34 238 254 194 141 b 166 13 168 16 168 16 b 144 1 161 5 152 1 b 121 15 134 1 125 5 b 115 33 119 18 117 24 b 0 330 91 145 49 252 b -10 355 -9 345 -10 348 b 13 381 -10 371 0 381 b 31 376 19 381 25 380 b 132 345 61 358 103 345 l 136 345 l 137 355 b 145 378 138 359 142 370 b 152 415 149 394 152 405 b 137 452 152 427 148 438 b 133 464 134 458 133 460 b 138 473 133 467 134 470 ',\n },\n vexAccidentalMicrotonal1: {\n x_min: -171.5,\n x_max: 483.1875,\n ha: 493,\n o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 495 20 616 20 616 b 20 373 20 427 20 373 b 115 410 20 373 63 390 l 210 448 l 210 531 b 212 620 210 614 210 616 b 231 632 215 628 223 632 b 246 627 236 632 242 631 b 251 541 251 620 251 628 l 251 463 l 315 489 b 387 514 368 509 381 514 b 393 513 390 514 392 514 b 406 494 402 510 406 502 b 397 476 406 487 404 480 b 323 446 396 474 363 462 l 251 417 l 251 283 l 251 148 l 254 151 b 370 199 291 183 332 199 b 415 191 385 199 400 197 b 483 84 458 176 483 134 b 461 0 483 58 476 29 b 332 -142 439 -40 411 -72 l 255 -215 b 231 -229 240 -229 239 -229 b 216 -223 224 -229 220 -227 b 210 -158 210 -217 210 -223 b 210 -120 210 -148 210 -136 l 210 -29 l 205 -34 b 100 -142 182 -65 159 -88 l 23 -215 b -1 -229 9 -229 6 -229 b -19 -217 -9 -229 -16 -224 l -20 -215 l -21 48 l -21 310 l -83 287 b -152 262 -133 266 -145 262 b -157 263 -153 262 -155 262 b -171 283 -166 266 -171 274 b -161 301 -171 290 -167 297 b -91 328 -160 302 -129 315 l -21 356 l -21 487 l -20 617 l -19 621 b -8 631 -17 626 -12 630 m 210 288 b 210 401 210 351 210 401 b 114 365 209 401 167 384 l 20 327 l 20 238 l 20 148 l 21 151 b 140 199 59 183 102 199 b 206 180 164 199 187 192 l 209 177 b 209 177 209 177 209 177 b 210 288 210 177 210 199 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 m 341 131 b 328 133 337 133 332 133 b 322 133 326 133 323 133 b 257 87 296 129 273 113 l 251 80 l 251 -37 l 251 -156 l 255 -152 b 375 81 328 -72 375 20 l 375 83 b 341 131 375 113 367 126 ',\n },\n vexAccidentalMicrotonal2: {\n x_min: -1.359375,\n x_max: 386.5625,\n ha: 394,\n o: 'm 249 535 b 257 537 251 537 253 537 b 276 524 266 537 273 533 l 277 521 l 279 419 l 279 316 l 304 323 b 337 328 319 326 330 328 b 353 316 347 328 349 324 b 355 266 355 315 355 290 b 353 215 355 241 355 217 b 319 198 349 206 347 205 b 279 187 284 190 279 188 b 279 156 279 187 279 174 b 279 136 279 151 279 144 l 279 84 l 289 87 l 330 98 b 367 105 352 102 362 105 b 378 101 372 105 375 104 b 386 61 385 95 386 94 b 386 40 386 55 386 48 l 386 -5 l 385 -8 b 374 -19 383 -12 378 -18 b 291 -40 372 -19 347 -26 b 279 -43 284 -41 279 -43 b 279 -83 279 -43 279 -59 b 279 -95 279 -87 279 -91 l 279 -145 l 304 -140 b 337 -133 321 -136 330 -133 b 349 -140 343 -133 347 -136 b 355 -181 355 -145 355 -142 l 355 -197 l 355 -210 b 349 -252 355 -249 355 -247 b 300 -269 345 -258 347 -258 b 280 -274 291 -272 281 -273 l 279 -274 l 277 -378 l 277 -483 l 276 -487 b 257 -499 273 -495 265 -499 b 238 -487 249 -499 242 -495 l 236 -483 l 236 -384 l 236 -285 l 235 -285 l 212 -291 l 170 -301 b 148 -308 159 -305 148 -306 b 147 -415 147 -308 147 -313 l 147 -523 l 145 -526 b 126 -538 141 -534 133 -538 b 106 -526 118 -538 110 -534 l 104 -523 l 104 -420 b 103 -317 104 -326 104 -317 b 103 -317 103 -317 103 -317 b 50 -330 92 -322 54 -330 b 31 -317 42 -330 35 -326 b 29 -267 29 -315 29 -315 l 29 -219 l 32 -216 b 92 -192 36 -206 36 -206 l 104 -190 l 104 -138 b 103 -87 104 -91 104 -87 b 103 -87 103 -87 103 -87 b 88 -91 103 -87 96 -88 l 49 -101 b 17 -106 32 -105 23 -106 b 6 -102 13 -106 10 -105 b -1 -62 0 -97 -1 -95 b 0 -41 -1 -56 0 -49 l 0 4 l 1 6 b 10 16 2 11 6 15 b 91 37 12 18 38 24 l 104 41 l 104 93 b 103 144 104 140 104 144 b 103 144 103 144 103 144 b 50 131 92 141 54 131 b 31 144 42 131 35 137 b 29 195 29 147 29 148 l 29 242 l 32 245 b 92 269 36 255 36 255 l 104 273 l 104 377 l 104 481 l 106 485 b 126 498 110 492 118 498 b 134 495 129 498 132 496 b 145 485 138 494 142 489 l 147 481 l 147 383 l 147 283 l 152 284 b 190 294 155 285 171 290 l 230 303 l 236 305 l 236 413 l 236 521 l 238 524 b 249 535 240 528 243 533 m 236 126 b 235 177 236 154 236 177 l 235 177 b 213 172 235 177 225 174 l 170 161 b 147 155 157 158 147 155 b 147 124 147 155 147 142 b 147 102 147 117 147 111 l 147 52 l 153 54 l 228 72 l 236 74 l 236 126 m 236 -105 b 235 -54 236 -65 236 -54 l 235 -54 b 231 -55 235 -54 234 -54 b 172 -69 227 -55 204 -62 l 149 -76 l 147 -76 l 147 -127 l 147 -179 l 152 -177 b 190 -167 155 -177 171 -173 l 230 -158 l 236 -156 l 236 -105 ',\n },\n vexWiggleArpeggioUp: {\n x_min: 58.53125,\n x_max: 228.671875,\n ha: 294,\n o: 'm 138 371 b 142 373 140 371 141 373 b 178 342 149 373 156 366 b 228 251 217 297 228 278 b 228 244 228 248 228 247 b 176 147 227 212 212 184 b 123 73 152 122 132 93 b 121 62 122 70 121 66 b 145 13 121 48 129 31 b 153 -2 151 6 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 145 -11 b 129 -1 140 -11 136 -8 b 61 87 89 37 68 68 b 58 113 59 95 58 105 b 110 215 58 144 74 177 b 163 287 134 240 155 269 b 166 299 166 291 166 295 b 141 348 166 313 157 330 b 133 360 134 356 133 358 b 133 363 133 362 133 362 b 138 371 133 367 136 370 ',\n },\n vexNoteHeadMutedBreve: {\n x_min: 0,\n x_max: 370.21875,\n ha: 378,\n o: 'm 0 0 l 0 277 l 61 277 l 122 277 l 122 0 l 122 -278 l 61 -278 l 0 -278 l 0 0 m 246 -1 l 246 277 l 308 277 l 370 277 l 370 -1 l 370 -278 l 308 -278 l 246 -278 l 246 -1 ',\n },\n },\n cssFontWeight: 'normal',\n ascender: 1903,\n underlinePosition: -125,\n cssFontStyle: 'normal',\n boundingBox: {\n yMin: -2065.375,\n xMin: -695.53125,\n yMax: 1901.578125,\n xMax: 1159.671875,\n },\n resolution: 1000,\n original_font_information: {\n postscript_name: 'Gonville-18',\n version_string: 'Version 0.1.8904 ',\n vendor_url: '',\n full_font_name: 'Gonville-18',\n font_family_name: 'Gonville-18',\n copyright: 'No copyright is claimed on this font file.',\n description: '',\n trademark: '',\n designer: '',\n designer_url: '',\n unique_font_identifier: 'FontForge 2.0 : Gonville-18 : 17-3-2010',\n license_url: '',\n license_description: '',\n manufacturer_name: '',\n font_sub_family_name: '18',\n },\n descender: -2066,\n fontFamily: 'Gonville-18',\n lineHeight: 4093,\n underlineThickness: 50,\n};\n","/**\n * The Gonville font was created by Simon Tatham.\n * https://www.chiark.greenend.org.uk/~sgtatham/gonville/\n */\nexport const GonvilleMetrics = {\n name: 'Gonville',\n smufl: false,\n stave: {\n padding: 12,\n endPaddingMax: 10,\n endPaddingMin: 5,\n unalignedNotePadding: 10,\n },\n accidental: {\n noteheadAccidentalPadding: 1,\n leftPadding: 2,\n accidentalSpacing: 3,\n },\n clef: {\n default: {\n point: 40,\n width: 26,\n },\n small: {\n point: 32,\n width: 20,\n },\n annotations: {\n '8va': {\n smuflCode: 'timeSig8',\n default: {\n point: 20,\n treble: {\n line: -1.2,\n shiftX: 11,\n },\n },\n small: {\n point: 18,\n treble: {\n line: -0.4,\n shiftX: 8,\n },\n },\n },\n '8vb': {\n smuflCode: 'timeSig8',\n default: {\n point: 20,\n treble: {\n line: 6.3,\n shiftX: 10,\n },\n bass: {\n line: 4,\n shiftX: 1,\n },\n },\n small: {\n point: 18,\n treble: {\n line: 5.8,\n shiftX: 6,\n },\n bass: {\n line: 3.5,\n shiftX: 0.5,\n },\n },\n },\n },\n // May not need these anymore\n lineCount: {\n '8': { point: 55, shiftY: 14 },\n '7': { point: 47, shiftY: 8 },\n '6': { point: 40, shiftY: 1 },\n '5': { point: 30, shiftY: -6 },\n '4': { point: 23, shiftY: -12 },\n },\n },\n parenthesis: {\n default: {\n point: 39,\n width: 7,\n },\n gracenote: {\n point: (39 * 3) / 5,\n width: 3,\n },\n },\n pedalMarking: {\n up: {\n point: 40,\n },\n down: {\n point: 40,\n },\n },\n // These are for numeric digits, such as in time signatures\n digits: {\n point: 40,\n tupletPoint: 28,\n },\n // articulation: {\n // },\n tremolo: {\n default: {\n point: 25,\n spacing: 4,\n offsetYStemUp: -7,\n offsetYStemDown: 7,\n offsetXStemUp: 9,\n offsetXStemDown: -0.5,\n },\n grace: {\n point: 15,\n spacing: 4,\n offsetYStemUp: -7,\n offsetYStemDown: 7,\n offsetXStemUp: 6.5,\n offsetXStemDown: -0.5,\n },\n },\n staveRepetition: {\n default: {\n offsetY: 25,\n offsetSymbol: 12,\n spacing: 5,\n },\n },\n // noteHead: {\n // },\n stem: {\n heightAdjustmentForFlag: -3,\n // These are stem (Y) offsets to the note heads. To shift the\n // noteheads (x-position) themselves, see glyphs.notehead.custom.\n noteHead: {\n noteheadTriangleUpHalf: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpBlack: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpWhole: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadXHalf: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXBlack: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXWhole: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadHalf: {\n offsetYBaseStemUp: -1.5,\n offsetYBaseStemDown: 1.5,\n },\n noteheadBlack: {\n offsetYBaseStemUp: -1.5,\n offsetYBaseStemDown: 1.5,\n },\n noteheadSquareWhite: {\n offsetYBaseStemDown: -5,\n offsetYBaseStemUp: 5,\n },\n },\n },\n glyphs: {\n flag: {\n shiftX: -0.08,\n flag8thDown: {\n shiftX: -0.16,\n },\n flag16thDown: {\n shiftX: -0.16,\n },\n flag32ndDown: {\n shiftX: -0.16,\n shiftY: 9,\n },\n flag64thDown: {\n shiftX: -0.16,\n shiftY: 13,\n },\n flag128thDown: {\n shiftX: -0.16,\n shiftY: 22,\n },\n flag32ndUp: {\n shiftY: -9,\n },\n flag64thUp: {\n shiftY: -13,\n },\n flag128thUp: {\n shiftY: -22,\n },\n },\n stringNumber: {\n verticalPadding: 8,\n stemPadding: 2,\n leftPadding: 5,\n rightPadding: 6,\n },\n textNote: {\n point: 40,\n default: {},\n ornamentTrill: {\n shiftX: -5,\n shiftY: 4,\n },\n },\n noteHead: {\n minPadding: 2,\n custom: {\n noteheadDiamondWholeStemUp: {\n shiftX: -6,\n },\n noteheadCircleXStemUp: {\n shiftX: -1.5,\n },\n noteheadXWholeStemUp: {\n shiftX: -5,\n },\n noteheadTriangleUpWholeStemUp: {\n shiftX: -6,\n },\n },\n },\n chordSymbol: {\n global: {\n superscriptOffset: -400,\n subscriptOffset: 300,\n kerningOffset: -250,\n lowerKerningText: ['D', 'F', 'P', 'T', 'V', 'Y'],\n upperKerningText: ['A', 'L'],\n spacing: 100,\n superSubRatio: 0.66,\n },\n csymDiminished: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymHalfDiminished: {\n scale: 0.8,\n leftSideBearing: -32,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymAugmented: {\n scale: 1,\n leftSideBearing: 0,\n advanceWidth: 530,\n yOffset: 0,\n },\n csymParensLeftTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 155,\n yOffset: 250,\n },\n csymParensRightTall: {\n scale: 0.8,\n leftSideBearing: -40,\n advanceWidth: 189,\n yOffset: 250,\n },\n csymBracketLeftTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 328,\n yOffset: 0,\n },\n csymBracketRightTall: {\n scale: 0.8,\n leftSideBearing: 1,\n advanceWidth: 600,\n yOffset: 0,\n },\n csymParensLeftVeryTall: {\n scale: 0.9,\n leftSideBearing: 0,\n advanceWidth: 121,\n yOffset: 350,\n },\n csymParensRightVeryTall: {\n scale: 0.9,\n leftSideBearing: 50,\n advanceWidth: 111,\n yOffset: 350,\n },\n csymDiagonalArrangementSlash: {\n scale: 0.6,\n leftSideBearing: -1,\n advanceWidth: 990,\n yOffset: 0,\n },\n csymMinor: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 482,\n yOffset: 0,\n },\n csymMajorSeventh: {\n scale: 0.9,\n leftSideBearing: 200,\n yOffset: 0,\n advanceWidth: 600,\n },\n accidentalSharp: {\n scale: 0.75,\n leftSideBearing: 40,\n advanceWidth: 250,\n yOffset: -402,\n },\n accidentalFlat: {\n scale: 0.95,\n leftSideBearing: -50,\n advanceWidth: 208,\n yOffset: -184,\n },\n },\n jazzOrnaments: {\n brassScoop: {\n scale: 1.0,\n xOffset: -12,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 10,\n },\n brassDoitMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassFallLipShort: {\n scale: 1.0,\n xOffset: 17,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassLiftMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 5,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassFallRoughMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 28,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassBend: {\n scale: 1.0,\n xOffset: 2,\n yOffset: -8,\n stemUpYOffset: 24,\n reportedWidth: 5,\n },\n brassMuteClosed: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -9,\n stemUpYOffset: 24,\n reportedWidth: 5,\n },\n brassMuteOpen: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -7,\n stemUpYOffset: 25,\n reportedWidth: 5,\n },\n brassFlip: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassJazzTurn: {\n scale: 1.0,\n xOffset: 6,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassSmear: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n },\n tremolo: {\n default: {\n shiftY: -10,\n },\n grace: {\n shiftY: -5,\n },\n },\n tuplet: {\n noteHeadOffset: 20,\n stemOffset: 10,\n bottomLine: 4,\n topModifierOffset: 15,\n },\n },\n};\n","export const PetalumaFont = {\n glyphs: {\n bracketTop: {\n x_min: 0,\n x_max: 508,\n y_min: 0,\n y_max: 370,\n ha: 370,\n o: 'm 22 0 b 122 0 55 1 89 0 l 157 0 b 713 376 425 0 622 137 b 732 467 724 406 732 436 b 726 514 732 482 730 498 b 711 533 723 528 719 533 b 693 526 707 533 700 530 b 674 498 683 520 678 508 b 635 406 662 467 652 435 b 310 164 560 281 458 193 b 154 151 258 154 206 151 b 39 154 117 151 78 154 b 1 120 17 154 4 145 b 0 84 0 108 0 96 b 0 20 0 63 1 40 b 22 0 0 4 7 0 z',\n },\n bracketBottom: {\n x_min: 0,\n x_max: 496,\n y_min: -393,\n y_max: 0,\n ha: 393,\n o: 'm 696 -566 b 711 -539 713 -566 708 -549 b 714 -521 713 -533 714 -527 b 713 -508 714 -517 713 -513 b 661 -327 706 -445 688 -384 b 392 -42 603 -203 513 -109 b 206 0 331 -7 266 0 b 160 -1 190 0 174 -1 b 26 -1 107 -1 66 -3 b 0 -19 12 -1 0 -4 l 0 -23 b 3 -50 1 -32 3 -42 b 1 -86 3 -62 1 -73 b 4 -118 1 -96 1 -108 b 45 -151 10 -145 23 -154 b 180 -143 89 -144 135 -145 b 621 -419 392 -135 523 -236 b 662 -539 641 -456 655 -497 b 696 -566 667 -557 680 -566 z',\n },\n barlineTick: {\n x_min: 0,\n x_max: 56.036101509664164,\n y_min: 876.905249806889,\n y_max: 1121.5430338167066,\n ha: 244.63778400981766,\n o: 'm 42 1263 b 66 1287 62 1261 66 1272 b 81 1583 65 1387 72 1485 b 35 1614 82 1610 53 1610 b 14 1591 17 1619 16 1604 b 0 1408 7 1525 0 1459 l 0 1292 b 42 1263 1 1263 23 1266 z',\n },\n breathMarkTick: {\n x_min: 0,\n x_max: 568,\n y_min: 0,\n y_max: 621,\n ha: 621,\n o: 'm 258 0 b 278 39 276 0 274 24 b 279 56 279 45 279 50 l 279 73 b 278 117 279 88 278 102 b 281 148 278 127 279 138 b 536 600 312 330 387 487 b 744 719 600 651 670 690 b 815 779 775 730 808 740 b 818 824 818 793 818 808 b 815 868 818 838 818 852 b 796 894 814 881 808 894 b 779 888 791 894 786 893 b 719 864 760 878 739 871 b 372 602 580 806 459 724 b 229 252 298 498 251 383 b 220 268 225 262 222 264 b 209 302 217 279 213 291 b 75 527 181 387 143 467 b 16 563 58 543 39 573 b 0 539 3 557 0 549 b 12 492 0 524 9 507 b 56 400 19 459 22 425 b 163 269 104 367 138 323 b 238 36 197 194 216 115 b 258 0 242 22 243 0 z',\n },\n segno: {\n x_min: 0,\n x_max: 798,\n y_min: -65,\n y_max: 806,\n ha: 871,\n o: 'm 16 -94 b 66 -69 39 -92 53 -85 b 177 59 102 -26 138 17 b 543 456 298 192 420 324 b 726 300 615 420 680 373 b 753 217 744 271 753 243 b 655 112 753 170 719 131 b 599 104 636 107 618 104 b 461 173 544 104 495 128 b 432 190 454 183 444 190 b 409 179 425 190 418 187 b 359 118 390 160 373 141 b 341 72 347 101 341 86 b 373 24 341 56 351 40 b 409 6 384 17 396 10 b 550 -13 454 -12 501 -14 b 599 -6 566 -12 583 -10 b 864 213 720 27 806 104 b 886 300 878 242 886 271 b 857 395 886 331 877 363 b 799 467 840 420 821 445 b 648 572 755 513 704 546 b 1110 1083 802 743 955 914 b 1140 1129 1123 1097 1136 1110 b 1149 1148 1142 1135 1149 1142 b 1145 1153 1149 1149 1148 1152 b 1123 1161 1139 1158 1130 1161 b 1109 1156 1119 1161 1113 1159 b 1089 1138 1102 1151 1094 1145 b 946 988 1040 1089 989 1041 b 595 602 834 855 711 732 l 590 598 l 549 615 b 432 793 462 647 432 723 b 534 888 432 851 474 888 b 671 834 588 888 631 864 b 710 818 684 824 696 818 b 724 821 714 818 719 819 b 809 883 757 834 788 852 b 816 901 814 890 816 896 b 802 923 816 910 812 916 b 706 984 770 945 742 971 b 593 1011 668 998 631 1011 b 516 991 567 1011 541 1005 b 333 799 433 949 380 876 b 302 693 312 765 302 729 b 330 589 302 658 311 624 b 469 488 360 533 415 511 b 485 482 475 487 480 485 b 266 249 412 405 338 327 b 121 88 217 196 170 141 b 9 -65 78 40 37 -7 b 0 -85 4 -72 0 -79 b 16 -94 0 -91 4 -94 z m 861 536 b 927 575 890 539 909 557 b 965 628 952 598 965 613 b 926 680 965 644 952 658 b 865 713 900 701 883 713 b 805 667 845 713 828 698 b 768 611 791 649 770 631 b 812 564 766 589 798 582 b 861 536 824 550 840 537 z m 251 350 b 363 436 285 348 353 403 b 354 456 366 448 360 452 b 271 518 327 477 298 497 b 243 528 261 526 252 528 b 210 513 232 528 222 523 b 157 454 190 494 176 472 b 141 428 147 444 141 436 b 158 406 141 420 147 413 b 216 361 180 393 197 376 b 245 350 225 356 235 350 z',\n },\n coda: {\n x_min: 0,\n x_max: 1380,\n y_min: -196,\n y_max: 1037,\n ha: 1233,\n o: 'm 1028 -282 b 1057 -245 1045 -282 1053 -261 b 1060 -203 1060 -232 1060 -217 b 1063 9 1060 -132 1061 -62 b 1390 194 1192 22 1303 81 b 1531 543 1467 298 1512 415 b 1532 556 1531 547 1532 552 b 1904 559 1656 557 1780 559 b 1950 582 1920 559 1941 569 b 1987 674 1970 609 1987 638 b 1984 698 1987 681 1986 690 b 1950 700 1973 698 1961 700 l 1941 700 l 1545 696 b 1535 776 1545 723 1541 749 b 1103 1113 1477 996 1326 1107 b 1080 1115 1096 1115 1087 1115 b 1081 1322 1080 1184 1080 1253 b 1079 1467 1083 1371 1081 1418 b 1061 1493 1079 1476 1080 1493 l 1060 1493 b 1028 1467 1044 1490 1031 1485 b 1020 1403 1025 1446 1020 1424 b 1017 1110 1020 1305 1018 1208 l 962 1106 b 569 914 808 1087 671 1035 b 451 683 510 844 472 766 l 161 678 b 118 680 148 678 132 680 b 79 670 101 680 86 678 b 0 544 48 636 29 592 l 37 544 l 429 549 b 428 518 428 539 428 528 b 488 285 428 435 458 360 b 681 81 526 192 593 124 b 946 9 763 40 854 19 b 1008 6 966 7 988 6 b 1005 -137 1008 -42 1005 -89 b 1012 -243 1005 -173 1005 -209 b 1028 -282 1015 -258 1011 -282 z m 1074 690 b 1079 935 1077 772 1077 852 b 1326 855 1166 932 1250 909 b 1446 694 1385 814 1426 759 b 1269 693 1387 694 1328 693 b 1074 690 1204 693 1139 691 z m 577 684 b 766 874 618 763 678 828 b 989 932 837 912 913 923 b 1015 933 998 932 1007 933 b 1014 822 1015 896 1014 860 b 1011 688 1012 791 1012 743 z m 1067 184 b 1071 553 1070 307 1068 429 b 1439 556 1194 553 1316 554 b 1437 554 1439 554 1437 554 b 1341 337 1413 478 1387 402 b 1119 192 1286 261 1211 212 b 1067 184 1102 189 1084 186 z m 1008 180 b 660 264 886 181 770 212 b 524 471 570 305 524 374 b 528 524 524 488 526 505 l 533 549 b 792 552 619 550 706 550 b 1009 553 865 553 937 552 b 1008 180 1009 428 1008 288 z',\n },\n gClef: {\n x_min: 0,\n x_max: 664,\n y_min: -559,\n y_max: 1009,\n ha: 1568,\n o: 'm 343 -805 b 366 -801 350 -805 357 -804 b 409 -773 383 -795 397 -786 b 582 -328 528 -648 577 -497 b 583 -294 582 -315 583 -294 b 612 -279 583 -294 603 -282 b 747 -197 660 -256 706 -230 b 949 143 857 -109 920 10 b 956 206 955 164 956 186 b 791 384 956 297 906 363 b 704 393 762 390 733 393 b 498 336 632 393 563 374 b 481 325 490 331 481 325 l 444 465 b 442 485 442 472 442 485 b 609 880 442 485 589 746 b 619 996 616 919 619 958 b 613 1084 619 1027 618 1056 b 534 1387 599 1188 560 1286 b 482 1453 527 1417 517 1453 b 422 1407 456 1453 438 1428 b 305 1063 348 1305 312 1188 b 304 1002 304 1043 304 1022 b 338 654 304 886 323 769 b 343 629 338 645 341 636 b 144 356 278 537 206 451 b 23 144 101 288 53 220 b 0 20 7 107 0 63 b 82 -210 0 -69 30 -160 b 207 -288 112 -239 160 -271 b 410 -328 274 -312 340 -328 b 474 -324 431 -328 452 -327 l 491 -321 b 491 -341 491 -321 492 -334 b 402 -585 475 -428 454 -513 b 294 -668 374 -622 348 -664 b 271 -693 278 -670 271 -680 b 274 -708 271 -698 272 -703 b 302 -775 282 -730 292 -753 b 343 -805 311 -795 325 -805 z m 400 717 b 382 922 389 786 382 854 b 481 1286 382 1047 408 1169 b 507 1125 498 1233 507 1179 b 500 1040 507 1097 504 1068 b 400 717 481 927 455 818 z m 252 -135 b 196 -121 232 -134 215 -127 b 117 -69 158 -108 127 -94 b 111 -32 112 -58 111 -45 b 117 19 111 -16 114 1 b 130 56 118 27 127 52 b 324 337 186 156 253 246 l 384 416 l 395 384 b 416 291 406 348 416 291 b 350 213 416 291 376 239 b 243 -42 278 143 243 55 b 251 -117 243 -66 246 -91 b 252 -135 252 -122 252 -127 z m 563 -91 b 510 168 552 3 530 78 b 513 192 508 179 508 186 b 624 202 550 199 586 202 b 730 192 660 202 694 199 b 850 141 773 183 816 176 b 858 134 852 138 855 135 b 595 -121 801 19 716 -68 l 569 -131 z m 410 -160 b 311 -147 360 -160 311 -147 b 307 -98 311 -147 307 -127 b 314 -33 307 -79 308 -56 b 429 131 328 36 377 85 b 441 138 433 135 438 138 b 449 122 446 138 448 132 b 490 -131 462 37 484 -46 b 490 -153 491 -140 490 -153 b 410 -160 490 -153 452 -163 z',\n },\n cClef: {\n x_min: 0,\n x_max: 731,\n y_min: -543,\n y_max: 543,\n ha: 1086,\n o: 'm 131 -782 b 141 -755 138 -782 140 -773 b 147 -490 143 -667 145 -577 b 160 207 150 -258 153 -24 b 168 618 164 344 158 481 b 81 768 173 690 132 732 b 45 782 66 778 55 782 b 3 740 26 782 13 768 b 0 724 1 736 0 730 l 1 710 b 4 596 4 672 4 634 l 4 382 b 9 102 4 288 4 196 b 17 -301 13 -32 10 -166 l 17 -672 b 50 -736 17 -701 27 -720 b 109 -772 69 -749 91 -759 b 131 -782 120 -778 127 -782 z m 615 -770 b 881 -684 710 -770 801 -739 b 1020 -395 986 -612 1020 -510 b 1017 -334 1020 -374 1018 -354 b 769 -62 1007 -209 896 -75 b 746 -60 762 -60 755 -60 b 639 -73 710 -60 675 -69 b 524 -109 598 -79 560 -92 b 528 -36 526 -85 528 -60 b 527 -4 528 -26 528 -14 b 528 39 527 10 528 24 b 526 99 528 59 527 79 b 592 94 549 95 570 94 b 648 99 611 94 629 95 b 912 157 744 94 844 117 b 1053 377 1009 215 1053 284 b 1050 425 1053 393 1053 409 b 914 665 1037 521 986 602 b 717 753 855 717 791 753 b 626 734 688 753 658 747 l 462 665 b 347 500 374 628 347 580 b 350 449 347 484 348 468 b 392 419 353 428 367 416 b 492 438 425 425 459 428 b 541 498 524 448 541 468 b 540 514 541 503 541 508 b 537 546 537 524 537 536 b 573 639 537 580 550 611 b 606 657 582 649 593 657 l 609 657 b 716 622 647 652 684 647 b 834 372 801 556 834 469 b 831 323 834 356 832 338 b 743 187 825 266 795 217 b 710 176 732 180 720 176 b 694 179 704 176 700 177 b 527 223 638 193 582 206 b 495 229 516 228 505 229 b 454 220 481 229 468 225 b 395 189 432 213 415 200 b 363 180 384 186 374 181 b 348 168 356 179 348 176 b 340 161 343 167 340 164 b 347 150 340 157 343 154 b 356 147 348 148 353 147 b 364 92 361 130 363 111 b 369 -37 367 49 369 6 b 363 -154 369 -76 367 -115 b 357 -236 360 -183 357 -210 b 376 -264 357 -253 361 -259 b 456 -289 402 -284 429 -289 b 521 -282 478 -289 500 -285 b 549 -255 537 -279 546 -271 b 598 -177 556 -225 577 -202 b 622 -164 605 -168 613 -164 b 636 -167 626 -164 631 -166 b 749 -225 678 -177 714 -199 b 848 -405 814 -276 848 -337 b 824 -507 848 -436 840 -471 b 657 -657 792 -582 730 -625 b 608 -668 638 -664 622 -668 b 534 -602 572 -668 547 -645 b 513 -575 530 -589 523 -575 b 507 -576 510 -575 508 -575 b 478 -582 497 -580 488 -582 b 405 -570 454 -582 428 -570 b 389 -572 399 -570 395 -570 l 363 -572 b 321 -575 348 -572 333 -569 l 321 631 b 323 662 323 641 323 652 b 315 716 323 681 321 698 b 304 736 314 723 317 736 l 302 736 b 281 716 294 734 285 729 b 275 665 276 700 275 683 l 275 382 b 276 99 275 288 275 193 b 279 -170 278 10 276 -81 b 284 -399 282 -246 284 -323 b 282 -629 284 -475 282 -553 b 289 -721 282 -660 289 -690 b 300 -736 289 -727 291 -736 b 312 -724 307 -736 310 -730 b 321 -667 323 -706 321 -687 l 321 -632 l 328 -644 l 340 -657 b 510 -757 386 -707 445 -740 b 615 -770 546 -766 580 -770 z',\n },\n fClef: {\n x_min: 0,\n x_max: 776,\n y_min: -496,\n y_max: 216,\n ha: 712,\n o: 'm 402 -706 b 804 -405 592 -678 716 -566 b 876 -53 861 -298 874 -183 b 868 33 876 -32 873 1 b 560 311 845 217 723 311 b 524 310 549 311 536 311 b 131 134 373 297 239 242 b 17 -29 84 86 37 39 b 9 -89 12 -50 9 -71 b 112 -238 9 -154 43 -206 b 124 -243 117 -239 120 -242 b 186 -261 145 -255 166 -261 b 268 -228 215 -261 242 -249 b 351 -59 325 -181 351 -124 b 343 10 351 -36 348 -13 b 340 36 341 19 340 27 b 409 105 340 75 363 102 b 441 107 420 107 431 107 b 624 36 510 107 573 86 b 744 -200 688 -27 724 -109 b 747 -230 747 -210 747 -222 b 717 -323 747 -264 736 -292 b 608 -445 688 -370 654 -410 b 307 -541 518 -513 415 -541 l 213 -541 b 39 -521 154 -541 96 -539 b 0 -552 17 -514 0 -531 b 1 -564 0 -556 0 -560 b 17 -611 6 -580 10 -596 b 101 -694 35 -648 50 -684 b 288 -714 164 -707 225 -714 b 402 -706 325 -714 363 -711 z m 1018 92 b 1080 118 1041 91 1068 96 b 1117 219 1099 150 1117 180 b 1113 252 1117 229 1116 240 b 1045 288 1102 297 1068 276 b 1017 262 1028 297 1024 274 b 984 124 989 220 996 170 b 1008 91 979 108 986 91 z m 972 -281 b 1070 -148 1024 -279 1070 -210 b 1025 -105 1070 -105 1045 -112 b 989 -127 1004 -96 998 -114 b 949 -249 963 -164 963 -209 b 969 -281 943 -265 949 -281 z',\n },\n unpitchedPercussionClef1: {\n x_min: 0,\n x_max: 379.13761966945304,\n y_min: -250,\n y_max: 250,\n ha: 500,\n o: 'm 481 -360 b 507 -357 491 -360 500 -360 b 546 -295 541 -346 547 -325 b 536 79 543 -170 540 -46 b 523 311 533 157 534 235 b 475 359 518 340 508 359 b 425 360 459 359 442 360 b 400 359 416 360 409 360 b 337 294 348 353 340 347 l 337 -73 b 336 -264 337 -137 337 -200 b 343 -294 336 -274 338 -284 b 481 -360 359 -330 431 -360 z m 144 -341 b 207 -320 167 -341 189 -331 b 217 -301 215 -315 217 -308 b 210 -262 217 -289 210 -275 b 228 187 212 -112 209 37 b 228 287 228 220 229 253 b 174 353 228 336 222 343 b 120 359 157 357 138 359 b 48 357 96 359 72 356 b 17 323 29 357 19 344 b 7 120 16 255 9 187 b 6 -109 6 43 6 -33 l 6 -204 b 0 -251 6 -220 0 -235 b 3 -269 0 -256 0 -262 b 127 -340 24 -330 79 -328 b 144 -341 132 -341 138 -341 z',\n },\n '6stringTabClef': {\n x_min: 0,\n x_max: 438,\n y_min: -768,\n y_max: 767,\n ha: 1535,\n o: 'm 369 438 b 374 439 370 438 372 438 b 384 462 383 444 384 452 l 384 474 b 390 697 386 547 390 622 b 373 1002 390 799 390 901 l 533 1002 b 560 1001 541 1004 552 1001 b 573 1007 567 1001 572 1002 b 546 1050 579 1025 559 1038 b 536 1056 543 1053 539 1053 b 324 1104 472 1102 397 1104 b 72 1090 238 1104 154 1099 b 55 1093 66 1090 60 1092 b 37 1073 46 1093 37 1089 b 60 1045 37 1061 48 1051 b 203 1001 105 1022 151 1001 b 233 1004 213 1001 223 1002 b 246 1005 238 1004 243 1005 b 272 975 264 1005 272 996 l 272 965 b 258 596 264 842 265 719 b 315 474 253 540 272 504 l 343 455 b 369 438 351 448 357 438 z m 114 -320 b 127 -304 120 -320 124 -315 b 171 -174 141 -261 158 -219 b 222 -135 179 -147 196 -137 b 426 -122 289 -131 359 -128 b 498 -164 462 -120 482 -127 b 628 -301 521 -226 575 -264 b 631 -288 631 -295 631 -291 b 628 -269 631 -281 629 -276 b 569 -134 616 -220 589 -179 b 408 225 514 -14 462 107 b 314 357 384 274 351 318 b 278 380 298 372 288 379 b 251 351 268 380 261 372 b 4 -209 156 171 75 -17 b 0 -228 1 -215 0 -222 b 19 -258 0 -240 7 -249 b 102 -314 45 -279 75 -294 b 114 -320 107 -318 111 -320 z m 425 6 b 360 20 403 17 382 20 b 274 14 331 20 302 14 l 246 14 l 340 206 b 425 6 369 137 395 75 z m 245 -1106 b 281 -1104 256 -1106 269 -1106 b 511 -888 400 -1094 511 -1035 b 454 -688 511 -814 504 -744 b 448 -678 449 -685 448 -681 b 454 -667 448 -675 449 -671 b 504 -497 503 -619 507 -559 b 324 -288 500 -383 436 -308 b 295 -287 314 -287 304 -287 l 282 -287 b 115 -330 223 -287 168 -307 b 94 -366 102 -336 94 -348 l 94 -370 b 96 -435 96 -392 96 -413 b 73 -858 89 -576 71 -717 b 78 -919 73 -878 78 -899 b 72 -950 78 -930 76 -940 b 63 -992 66 -965 63 -978 b 66 -1015 63 -999 65 -1008 b 173 -1104 84 -1106 84 -1106 b 245 -1106 197 -1104 220 -1104 z m 161 -622 b 147 -618 156 -622 151 -621 b 140 -600 141 -612 140 -606 b 144 -564 140 -589 144 -575 b 143 -554 144 -560 144 -557 l 143 -546 b 220 -451 144 -467 143 -465 b 278 -445 239 -446 259 -444 b 418 -497 328 -445 376 -461 b 429 -516 426 -504 429 -510 b 415 -533 429 -521 423 -527 b 219 -608 357 -579 287 -590 b 215 -609 217 -608 216 -609 b 161 -622 197 -609 177 -622 z m 154 -953 b 130 -933 135 -953 130 -948 l 130 -865 l 128 -865 b 135 -788 130 -838 124 -808 b 203 -769 145 -769 180 -776 b 259 -762 223 -765 242 -762 b 441 -852 330 -762 386 -805 b 449 -867 446 -858 449 -863 b 436 -884 449 -874 444 -878 b 318 -942 402 -914 363 -935 b 154 -953 264 -950 209 -953 z',\n },\n timeSig0: {\n x_min: 20,\n x_max: 513,\n y_min: -358.159536277652,\n y_max: 359,\n ha: 717.159536277652,\n o: 'm 341 -516 b 420 -510 367 -516 395 -514 b 675 -338 533 -494 622 -448 b 737 -92 716 -256 734 -171 b 739 -35 739 -73 739 -53 b 680 305 739 86 720 207 b 400 517 622 449 537 517 b 337 514 380 517 359 517 b 289 507 321 511 305 513 b 91 317 192 477 127 412 b 29 9 50 212 29 108 b 217 -458 29 -157 88 -312 b 341 -516 251 -494 291 -518 z m 412 -452 b 359 -425 393 -452 376 -444 b 187 14 242 -301 179 -158 b 268 334 193 127 212 235 b 387 448 295 383 330 428 b 406 452 395 451 400 452 b 428 444 413 452 420 449 b 517 324 471 413 497 372 b 586 -29 560 222 586 86 b 556 -271 586 -112 585 -193 b 468 -422 536 -327 508 -377 b 412 -452 449 -442 431 -452 z',\n },\n timeSig1: {\n x_min: 20,\n x_max: 283,\n y_min: -364,\n y_max: 366,\n ha: 730,\n o: 'm 264 -524 b 357 -510 297 -524 325 -516 b 374 -490 369 -508 374 -501 b 380 -438 376 -472 380 -455 l 406 246 b 408 301 408 265 408 282 b 400 445 408 348 405 396 b 288 527 395 491 338 527 b 253 520 276 527 264 526 b 240 508 249 517 245 513 b 49 409 192 445 127 413 b 29 396 33 408 29 403 b 32 380 29 392 30 386 b 59 363 36 366 49 364 b 164 348 95 356 130 348 b 222 357 183 348 203 351 b 238 361 228 360 233 360 b 252 334 248 361 252 353 b 243 59 252 242 249 150 b 219 -490 229 -124 233 -307 b 264 -524 217 -516 232 -524 z',\n },\n timeSig2: {\n x_min: 20,\n x_max: 660.4636303241031,\n y_min: -378.7201231608281,\n y_max: 382,\n ha: 760.720123160828,\n o: 'm 99 -543 b 130 -533 111 -550 121 -540 b 255 -448 168 -501 213 -475 b 338 -425 282 -431 310 -425 b 392 -431 356 -425 374 -426 b 485 -462 423 -438 454 -451 b 648 -497 540 -482 595 -497 b 834 -441 711 -497 773 -480 b 950 -242 906 -395 958 -334 b 942 -210 950 -230 950 -215 b 912 -220 932 -204 920 -213 b 861 -264 894 -235 877 -248 b 775 -317 835 -289 808 -305 b 675 -334 742 -328 708 -334 b 510 -295 619 -334 563 -318 b 372 -264 465 -278 420 -264 b 305 -272 350 -264 328 -266 b 331 -242 318 -256 324 -249 b 490 -73 386 -187 438 -131 b 675 340 595 43 664 180 b 677 369 677 350 677 360 b 556 536 677 461 638 508 b 468 550 526 546 497 550 b 297 508 409 550 353 533 b 111 354 220 475 168 412 b 29 197 65 308 29 261 b 32 164 29 187 29 176 b 29 140 33 157 29 147 b 43 125 29 132 32 125 b 73 147 55 125 65 138 b 86 163 79 153 82 158 b 238 320 134 219 183 272 b 425 389 292 367 360 389 b 575 341 480 389 531 373 b 606 298 590 330 606 317 b 600 278 606 292 603 285 b 501 107 576 217 544 158 b 304 -104 439 33 372 -35 b 111 -356 230 -180 167 -265 b 84 -446 92 -386 84 -415 b 86 -481 84 -458 85 -469 b 88 -514 88 -491 88 -503 b 99 -543 89 -526 91 -537 z',\n },\n timeSig3: {\n x_min: 19.824321427094187,\n x_max: 540,\n y_min: -392,\n y_max: 392,\n ha: 784,\n o: 'm 216 -540 b 354 -564 264 -556 310 -564 b 605 -465 445 -564 530 -530 b 729 -161 697 -383 729 -275 b 724 -82 729 -135 727 -108 b 589 95 716 -1 670 62 b 523 114 567 102 546 108 b 750 418 606 213 677 315 b 778 503 769 444 778 472 b 773 540 778 514 776 527 b 750 564 769 557 762 564 b 736 562 746 564 742 563 b 641 552 704 553 672 552 b 402 554 562 552 481 554 l 346 554 b 84 546 258 554 170 554 b 36 501 55 543 40 531 b 29 412 30 472 32 442 b 52 384 27 393 32 384 l 56 384 b 210 392 107 389 158 392 l 602 392 b 354 108 523 285 445 192 b 246 -65 300 58 246 12 b 252 -108 246 -78 248 -92 l 252 -111 b 264 -141 251 -122 251 -135 b 291 -132 274 -145 284 -140 b 425 -72 328 -95 377 -84 b 475 -65 442 -68 459 -65 b 592 -108 517 -65 557 -79 b 645 -179 615 -125 645 -147 b 642 -194 645 -184 644 -189 b 485 -376 616 -278 569 -344 b 361 -399 444 -392 402 -399 b 151 -340 289 -399 219 -376 b 88 -275 122 -323 98 -310 b 71 -249 86 -268 85 -249 b 63 -251 68 -249 66 -249 b 36 -288 48 -255 36 -266 b 55 -423 33 -336 45 -377 b 101 -482 60 -448 78 -468 b 216 -540 138 -504 174 -526 z',\n },\n timeSig4: {\n x_min: 20,\n x_max: 633.0785282750762,\n y_min: -489.59088556716864,\n y_max: 491.18559127100053,\n ha: 980.7764768381692,\n o: 'm 608 -704 b 641 -684 622 -708 634 -696 b 667 -602 660 -660 662 -631 b 685 -190 683 -465 680 -327 l 685 -176 b 831 -127 736 -166 783 -148 b 912 0 901 -94 913 -76 b 886 53 912 36 904 52 b 848 40 877 53 864 49 l 838 36 b 687 -13 789 14 739 -3 b 681 177 687 50 684 114 b 672 338 678 230 677 285 b 654 373 671 350 672 373 b 622 340 636 373 624 361 b 615 262 621 314 613 288 b 619 -22 616 167 619 72 b 569 -22 602 -23 585 -23 b 305 -3 481 -16 395 -1 b 210 -9 274 -3 242 -4 b 301 163 242 52 268 108 b 513 552 377 288 459 412 b 536 652 526 585 536 618 b 533 683 536 662 534 672 b 520 707 531 691 531 707 b 487 693 508 708 494 704 b 474 668 482 684 477 677 b 384 490 454 603 418 547 b 253 281 343 419 295 351 b 73 -13 194 181 145 78 b 29 -108 50 -42 29 -72 b 37 -147 29 -121 32 -134 b 50 -186 43 -160 50 -173 b 68 -216 52 -207 56 -215 b 92 -207 73 -216 82 -213 b 288 -166 156 -180 220 -166 b 556 -186 377 -166 467 -180 b 586 -189 566 -187 576 -187 b 616 -186 596 -189 606 -189 b 606 -432 613 -268 612 -350 b 596 -625 603 -495 596 -559 b 598 -670 596 -641 596 -655 b 608 -704 598 -683 596 -700 z',\n },\n timeSig5: {\n x_min: 19.663871085403297,\n x_max: 583,\n y_min: -389,\n y_max: 389,\n ha: 778,\n o: 'm 132 -536 b 249 -560 168 -553 209 -559 b 507 -462 351 -560 454 -514 b 677 -183 588 -384 642 -289 b 694 -85 688 -150 694 -117 b 540 138 694 12 642 94 b 422 173 501 154 462 167 b 400 187 408 174 400 177 b 405 202 400 190 402 196 b 428 284 416 228 426 255 b 469 312 431 307 442 312 b 757 372 569 312 662 343 b 840 490 821 392 840 432 b 812 560 840 540 834 560 b 763 546 801 560 785 556 b 757 543 762 546 759 544 b 465 484 665 505 570 484 b 396 484 452 484 425 487 b 353 454 377 482 366 474 b 281 300 323 405 304 351 b 245 164 262 255 245 212 b 246 144 245 158 246 151 b 233 63 249 115 243 89 b 225 35 228 50 225 40 b 264 14 225 22 236 19 b 445 -26 325 7 387 0 b 569 -151 501 -52 547 -89 b 575 -180 573 -161 575 -170 b 527 -275 575 -217 547 -245 b 347 -367 484 -334 419 -367 b 261 -351 318 -367 289 -363 b 95 -300 206 -333 154 -307 b 55 -321 73 -297 65 -302 b 29 -468 29 -367 40 -419 b 56 -505 26 -482 36 -500 b 132 -536 82 -514 108 -524 z',\n },\n timeSig6: {\n x_min: 20,\n x_max: 565,\n y_min: -363,\n y_max: 363,\n ha: 726,\n o: 'm 390 -518 b 621 -458 469 -507 549 -494 b 814 -134 753 -390 814 -281 b 652 59 814 -16 750 58 b 580 48 629 59 606 55 b 233 -334 392 -9 276 -138 b 115 -228 181 -314 143 -278 b 98 -160 104 -206 98 -183 b 107 -109 98 -144 101 -127 b 167 37 124 -59 145 -12 b 508 340 236 189 347 292 b 575 353 530 347 553 353 b 648 327 600 353 625 346 b 665 320 654 321 661 320 b 687 336 674 320 681 325 b 703 405 697 359 703 382 b 684 472 703 429 697 451 b 593 523 664 504 631 521 b 576 521 588 523 582 523 b 297 403 472 508 380 465 b 115 177 217 344 164 264 b 29 -121 60 82 29 -17 b 53 -278 29 -173 36 -225 b 226 -497 82 -374 131 -454 b 347 -523 265 -514 305 -523 b 390 -518 361 -523 376 -521 z m 351 -357 b 312 -351 337 -356 320 -363 b 325 -315 304 -340 320 -327 b 543 -120 373 -222 448 -158 b 622 -104 570 -108 596 -102 b 717 -132 655 -104 687 -112 b 740 -167 732 -143 740 -153 b 730 -196 740 -176 737 -184 b 563 -321 690 -258 634 -300 b 359 -357 497 -341 428 -354 z',\n },\n timeSig7: {\n x_min: 20.3617407597707,\n x_max: 592,\n y_min: -345,\n y_max: 345,\n ha: 690,\n o: 'm 253 -497 b 318 -485 276 -497 297 -487 b 366 -441 348 -482 360 -468 b 487 -104 390 -323 433 -210 b 835 403 580 82 701 246 b 852 436 847 416 852 428 b 815 467 852 451 840 461 b 762 474 798 471 779 474 b 674 445 732 474 701 465 b 603 410 652 431 628 420 b 383 360 533 379 459 360 b 200 435 315 360 249 382 b 88 494 168 469 131 485 b 66 497 81 495 73 497 b 33 484 52 497 39 492 b 50 436 22 469 39 451 b 295 310 114 360 199 324 b 406 301 331 304 369 301 b 593 324 468 301 530 308 b 585 307 589 314 588 310 b 265 -249 451 137 338 -46 b 207 -442 242 -312 223 -377 b 204 -462 206 -449 204 -456 b 253 -497 204 -487 220 -497 z',\n },\n timeSig8: {\n x_min: 20,\n x_max: 504.15101530718516,\n y_min: -428,\n y_max: 428,\n ha: 856,\n o: 'm 265 -616 b 289 -615 274 -616 281 -616 b 710 -271 492 -592 657 -485 b 726 -148 721 -229 727 -187 b 585 108 726 -48 687 42 b 572 127 576 114 573 120 b 576 144 572 132 575 138 b 598 301 590 196 598 249 b 586 413 598 338 593 376 b 356 616 559 531 467 616 b 233 582 317 616 275 606 b 29 233 101 505 29 384 b 104 9 29 153 46 72 b 189 -48 127 -16 160 -27 b 92 -158 141 -73 114 -114 b 37 -343 63 -217 50 -279 b 33 -390 35 -359 33 -374 b 265 -616 33 -524 148 -616 z m 258 105 b 124 148 215 105 167 117 b 96 196 105 163 96 177 b 99 217 96 202 96 209 b 197 384 120 281 151 337 b 350 451 242 429 297 451 b 516 364 412 451 472 422 b 530 331 523 354 530 343 l 530 327 l 530 320 b 468 151 520 261 507 200 b 419 122 455 135 442 125 b 258 105 370 117 320 105 z m 328 -438 b 158 -276 233 -436 160 -359 b 166 -239 158 -264 161 -252 b 230 -157 176 -203 202 -179 b 367 -72 274 -125 320 -98 b 448 -49 396 -56 423 -49 b 562 -118 491 -49 528 -72 b 611 -251 590 -157 611 -199 b 569 -341 611 -288 595 -318 b 328 -438 500 -402 416 -432 z',\n },\n timeSig9: {\n x_min: 20,\n x_max: 494,\n y_min: -421,\n y_max: 421,\n ha: 842,\n o: 'm 235 -606 b 361 -564 275 -606 318 -593 b 619 -229 487 -482 566 -366 b 706 127 664 -114 694 4 b 711 233 708 163 711 197 b 700 346 711 271 708 308 b 389 606 658 517 530 606 b 351 605 376 606 364 606 b 56 272 171 586 56 441 b 96 98 56 216 69 156 b 334 -53 144 -3 238 -53 b 544 36 408 -53 484 -24 b 652 176 586 78 622 124 b 631 71 645 141 639 105 b 467 -302 599 -63 562 -196 b 271 -442 412 -364 354 -422 b 225 -448 255 -446 239 -448 b 95 -305 148 -448 98 -395 b 89 -255 95 -288 94 -271 b 73 -233 86 -246 85 -233 b 52 -248 65 -233 56 -239 b 29 -317 42 -271 30 -291 b 49 -448 29 -361 40 -405 b 235 -606 69 -541 144 -606 z m 340 104 b 144 209 264 108 194 141 b 127 258 132 225 127 240 b 137 297 127 271 130 284 b 366 449 184 396 269 449 b 517 408 415 449 467 436 b 595 348 546 392 572 372 b 616 305 608 336 616 321 b 609 281 616 298 613 289 b 340 104 557 184 477 104 z',\n },\n timeSigCommon: {\n x_min: 20,\n x_max: 585,\n y_min: -298,\n y_max: 294.49658092772603,\n ha: 592.496580927726,\n o: 'm 444 -405 b 829 -45 626 -346 740 -207 b 842 26 842 -23 842 1 b 821 58 842 39 841 58 b 795 40 811 58 802 48 b 765 3 785 29 773 16 b 469 -223 690 -104 596 -183 b 354 -242 431 -235 392 -242 b 180 -177 292 -242 235 -223 b 135 -99 154 -157 140 -131 b 132 -59 134 -85 132 -72 b 141 7 132 -37 135 -16 b 449 274 189 160 297 243 b 477 278 459 276 468 276 b 546 203 517 278 539 253 b 517 157 550 177 533 166 b 485 143 507 153 497 143 l 482 143 b 467 148 478 143 472 144 b 374 183 438 170 406 181 b 264 118 333 183 292 161 b 238 48 246 92 238 69 b 261 -9 238 29 245 10 b 383 -73 287 -39 337 -73 b 412 -68 392 -73 402 -72 b 631 164 526 -27 586 59 b 649 252 644 193 649 222 b 636 328 649 278 645 304 b 504 423 615 400 579 429 b 242 318 408 415 317 387 b 29 -158 104 190 29 33 b 30 -176 29 -164 29 -170 b 115 -364 42 -246 52 -315 b 307 -429 177 -410 240 -429 b 444 -405 351 -429 397 -420 z',\n },\n timeSigCutCommon: {\n x_min: 20,\n x_max: 695,\n y_min: -687.0379164869064,\n y_max: 687,\n ha: 1374.0379164869064,\n o: 'm 564 -989 b 595 -945 585 -991 589 -963 l 599 -922 b 605 -628 600 -824 603 -726 l 609 -399 b 878 -251 706 -363 798 -320 b 996 -85 932 -204 976 -153 b 1001 -63 998 -78 1001 -71 b 989 -46 1001 -56 998 -49 b 978 -43 985 -45 982 -43 b 950 -59 968 -43 959 -49 b 733 -216 894 -132 815 -177 b 611 -259 694 -235 652 -249 b 616 -20 612 -179 615 -99 b 680 29 642 -7 665 9 b 698 43 685 36 690 40 b 870 251 792 82 840 160 b 877 294 874 265 877 279 b 818 410 877 338 855 382 b 683 458 779 442 730 448 b 625 468 664 462 644 465 l 625 514 b 638 958 626 662 636 811 b 626 989 638 979 635 989 b 603 981 621 989 613 986 b 422 840 534 945 481 888 b 412 805 412 832 413 818 b 426 713 410 773 420 743 b 445 678 429 690 435 678 b 474 691 452 678 461 683 b 563 755 503 710 530 732 b 564 724 564 740 564 733 b 559 469 563 639 560 554 b 462 454 526 469 494 464 b 112 143 302 399 199 281 b 33 -94 66 71 45 -10 b 29 -148 30 -112 29 -131 b 105 -351 29 -223 52 -291 b 359 -455 171 -426 258 -451 b 517 -431 409 -451 464 -446 l 539 -422 l 539 -477 b 533 -739 536 -563 539 -651 b 530 -824 531 -768 530 -795 b 546 -948 530 -865 533 -907 b 564 -989 552 -962 543 -989 z m 410 -288 b 193 -197 328 -288 253 -264 b 141 -60 160 -161 141 -108 b 157 6 141 -35 147 -12 b 259 158 189 58 217 112 b 438 291 311 215 364 266 b 528 305 468 301 498 305 b 554 304 537 305 546 304 b 553 212 554 274 554 242 b 426 115 498 199 446 164 b 416 68 419 99 416 84 b 425 12 416 49 420 30 b 474 -39 432 -17 448 -32 b 513 -43 487 -42 498 -43 b 547 -40 524 -43 536 -42 l 543 -272 b 461 -285 516 -278 488 -281 b 410 -288 444 -287 426 -288 z m 694 197 b 668 203 685 197 677 199 b 621 216 654 210 638 215 b 622 294 622 242 622 268 b 706 268 651 287 678 278 b 746 235 721 261 734 249 b 752 222 749 230 752 226 b 743 213 752 219 749 215 b 694 197 727 206 711 197 z',\n },\n timeSigPlus: {\n x_min: 0,\n x_max: 661,\n y_min: -358,\n y_max: 358,\n ha: 716,\n o: 'm 605 -516 b 629 -490 624 -516 629 -507 b 628 -475 629 -485 628 -481 b 613 -131 624 -405 616 -174 b 612 -96 612 -114 612 -96 l 647 -98 b 897 -115 730 -99 814 -109 b 940 -89 919 -117 935 -109 b 952 -24 946 -69 952 -46 b 948 9 952 -14 950 -3 b 912 39 942 26 933 37 b 609 60 822 48 609 60 b 616 392 609 60 608 291 b 567 488 619 436 605 467 b 511 516 550 498 531 514 b 498 511 507 516 503 514 b 478 446 475 501 480 469 b 467 150 474 348 469 249 b 465 59 465 121 465 59 l 372 49 b 73 14 272 36 173 24 b 49 13 65 13 56 13 b 0 -33 9 13 0 6 b 60 -141 0 -117 6 -140 b 112 -135 73 -141 91 -140 b 413 -102 213 -125 314 -112 b 464 -98 441 -99 464 -98 l 464 -145 b 477 -456 464 -249 468 -353 b 526 -510 478 -488 491 -507 b 589 -513 546 -511 569 -510 b 605 -516 595 -514 600 -516 z',\n },\n timeSigPlusSmall: {\n x_min: 0,\n x_max: 418,\n y_min: -197,\n y_max: 199,\n ha: 396,\n o: 'm 301 -284 b 330 -238 320 -284 324 -255 b 348 -46 350 -176 341 -111 b 374 -20 351 -27 356 -23 b 481 -17 409 -16 445 -17 b 566 -9 510 -17 537 -16 b 602 3 579 -7 602 -16 b 566 29 602 19 582 24 b 526 33 553 32 539 33 b 384 39 478 36 432 39 b 356 62 363 39 356 42 l 356 68 b 359 177 359 104 359 141 l 359 251 b 341 287 359 264 361 285 b 311 255 324 287 314 272 b 310 228 311 246 310 236 l 301 69 b 275 39 301 49 295 39 l 271 39 b 210 40 251 40 230 40 b 167 39 196 40 181 40 b 89 40 141 37 115 40 b 24 30 68 40 46 37 b 0 17 17 27 0 30 l 0 13 b 27 -17 3 0 7 -13 b 91 -22 49 -22 71 -22 b 153 -22 115 -22 137 -20 l 275 -22 b 295 -40 289 -22 295 -27 l 295 -48 b 288 -235 288 -109 287 -171 b 287 -264 288 -243 287 -253 b 301 -284 287 -275 289 -284 z',\n },\n timeSigMinus: {\n x_min: 0,\n x_max: 662,\n y_min: -54,\n y_max: 55,\n ha: 109,\n o: 'm 39 -78 b 49 -76 42 -78 45 -76 b 452 -75 94 -75 272 -75 b 861 -76 632 -75 814 -76 b 953 -20 927 -79 953 -66 b 948 27 953 -7 950 9 b 946 37 948 30 948 35 b 896 79 940 63 929 79 b 471 78 827 78 648 78 l 42 78 b 0 37 14 78 0 69 b 23 -66 0 0 17 -32 b 39 -78 24 -75 32 -76 z',\n },\n timeSigParensRight: {\n x_min: 0,\n x_max: 274.26483738379414,\n y_min: -722.6326530612245,\n y_max: 725,\n ha: 1447.6326530612246,\n o: 'm 37 -1038 b 69 -1031 48 -1044 59 -1038 b 88 -1015 76 -1027 82 -1021 b 164 -886 120 -976 147 -933 b 333 -351 233 -711 292 -534 b 395 118 366 -204 399 -59 b 389 245 392 144 392 194 b 120 996 369 521 265 766 b 68 1044 99 1030 84 1044 b 19 988 50 1044 36 1024 b 0 922 7 965 0 945 b 20 858 0 901 6 881 b 259 215 141 660 236 449 b 271 -1 266 143 271 71 b 252 -239 271 -82 265 -161 b 148 -667 228 -384 183 -524 b 39 -1009 120 -785 66 -893 b 33 -1031 37 -1017 33 -1024 b 37 -1038 33 -1034 35 -1037 z',\n },\n timeSigParensRightSmall: {\n x_min: 0,\n x_max: 154.4025307335204,\n y_min: -422,\n y_max: 422,\n ha: 844,\n o: 'm 43 -608 b 60 -598 48 -608 53 -605 b 117 -511 82 -572 102 -543 b 222 23 193 -350 219 -177 b 213 166 225 55 216 109 b 115 531 206 294 174 416 b 45 603 99 562 76 588 b 30 608 39 606 35 608 b 10 598 23 608 17 603 b 0 546 3 590 0 570 b 23 451 0 507 9 458 b 102 351 66 429 84 390 b 167 42 150 252 167 148 b 163 -49 167 12 166 -19 b 35 -449 151 -192 121 -330 b 14 -504 22 -467 14 -485 b 17 -527 14 -511 16 -520 l 30 -590 b 43 -608 33 -603 37 -608 z',\n },\n timeSigParensLeft: {\n x_min: 0.5555555555555556,\n x_max: 399.6216117372966,\n y_min: -728,\n y_max: 728,\n ha: 1456,\n o: 'm 562 -1048 b 573 -1043 566 -1048 570 -1047 b 553 -988 582 -1025 564 -1004 b 472 -884 527 -952 497 -920 b 210 -354 366 -717 275 -541 b 148 -6 170 -240 148 -124 b 160 148 148 45 153 96 b 315 678 189 331 242 508 b 431 901 350 755 380 834 b 459 950 451 926 461 939 b 435 995 459 962 451 972 b 364 1048 405 1034 383 1048 b 305 996 343 1048 325 1028 b 127 624 226 881 174 753 b 1 30 56 432 9 235 b 1 -32 1 9 0 -12 b 180 -629 13 -245 92 -438 b 363 -936 230 -739 298 -835 b 526 -1041 402 -995 448 -1041 b 562 -1048 537 -1040 552 -1048 z',\n },\n timeSigParensLeftSmall: {\n x_min: 0,\n x_max: 173.45497224367904,\n y_min: -405,\n y_max: 404,\n ha: 809,\n o: 'm 197 -583 b 222 -553 212 -582 219 -566 b 229 -497 226 -534 229 -516 b 213 -425 229 -472 225 -448 b 102 -177 173 -344 132 -262 b 62 30 78 -111 58 -42 b 91 183 66 82 75 134 b 215 426 118 271 156 356 b 249 552 246 465 252 505 b 230 582 249 563 246 582 b 197 563 219 582 206 576 b 71 356 144 500 105 429 b 0 50 26 259 3 158 b 13 -112 4 -3 7 -58 b 176 -559 29 -275 105 -416 b 196 -583 180 -569 186 -583 z',\n },\n noteheadDoubleWhole: {\n x_min: -0.4444444444444444,\n x_max: 614.1875,\n y_min: -223.03296670127517,\n y_max: 223,\n ha: 446.0329667012752,\n o: 'm 35 -321 b 62 -266 58 -318 58 -288 l 62 -194 b 63 50 62 -114 63 -32 b 60 189 63 96 63 143 b 43 300 59 226 60 265 b 29 321 40 308 39 321 l 26 321 b 0 292 13 318 0 310 b 0 248 0 278 -1 262 b 6 147 4 215 6 181 b 4 48 6 114 4 81 b 6 0 4 32 6 16 b 7 -36 7 -12 7 -24 l 7 -52 b 6 -156 7 -86 6 -121 b 19 -275 6 -196 9 -236 b 35 -321 23 -291 16 -323 z m 847 -314 b 871 -288 860 -315 867 -300 b 884 -187 881 -255 886 -222 b 876 115 878 -86 876 14 b 877 255 876 161 876 209 b 868 291 877 268 873 279 b 855 304 867 301 863 304 b 844 301 852 304 848 304 b 822 265 825 292 822 278 b 824 251 822 259 822 255 b 822 170 822 225 822 197 l 822 -20 b 835 -284 827 -86 825 -186 b 847 -314 837 -295 835 -311 z m 757 -291 b 793 -171 796 -255 792 -212 b 795 -49 795 -131 795 -91 b 786 207 795 36 791 121 b 779 240 786 217 783 229 b 766 258 776 246 776 258 b 762 256 765 258 763 256 b 739 236 752 253 740 252 b 733 177 737 216 732 197 b 737 20 737 125 739 73 l 737 -107 b 740 -202 737 -138 739 -170 b 757 -291 740 -230 743 -261 z m 128 -261 b 144 -251 135 -264 141 -256 b 158 -203 156 -236 157 -220 b 161 -137 161 -181 161 -158 b 157 30 161 -81 157 -26 b 158 76 157 45 157 60 l 158 101 b 156 225 158 141 158 183 b 137 253 156 235 154 253 l 134 253 b 109 222 120 251 109 242 b 104 91 108 179 104 134 b 108 -58 104 42 109 -9 b 107 -105 108 -73 108 -89 b 105 -127 107 -112 107 -120 b 118 -245 105 -167 114 -204 b 128 -261 118 -252 121 -259 z m 488 -242 b 693 -79 595 -249 685 -166 l 693 -55 b 690 0 693 -36 691 -17 b 540 187 684 84 621 164 b 449 200 508 196 480 200 b 210 104 363 200 282 163 b 186 56 196 92 186 76 b 207 -82 186 9 192 -37 b 300 -204 225 -132 248 -181 b 488 -242 356 -229 415 -240 z m 490 -88 b 449 -86 477 -88 464 -88 b 287 -56 399 -85 341 -78 b 258 -33 275 -52 258 -48 b 282 -7 258 -20 272 -13 b 458 43 340 23 399 43 b 580 14 497 43 537 35 b 618 -20 606 1 619 -9 b 592 -58 618 -30 609 -42 b 490 -88 562 -82 528 -88 z',\n },\n noteheadWhole: {\n x_min: 0,\n x_max: 380.16649762501584,\n y_min: -186.17102907059297,\n y_max: 165,\n ha: 351.17102907059297,\n o: 'm 547 40 b 223 -268 543 -151 367 -259 b 102 -233 180 -271 143 -248 l 62 -216 b 0 -127 22 -197 0 -166 b 6 -91 0 -115 1 -104 b 122 141 33 -9 69 71 b 327 238 170 204 249 238 b 514 158 397 238 467 212 b 547 40 544 125 549 84 z m 248 -107 b 384 -63 295 -102 341 -88 b 426 -23 402 -53 415 -40 b 435 3 432 -14 435 -6 b 413 32 435 14 428 24 b 301 73 376 49 343 73 b 272 69 291 73 282 72 b 121 -35 207 53 157 20 b 111 -58 117 -42 111 -50 b 125 -75 111 -65 115 -71 b 248 -107 164 -89 202 -107 z',\n },\n noteheadHalf: {\n x_min: 0,\n x_max: 334,\n y_min: -174,\n y_max: 175,\n ha: 349,\n o: 'm 480 56 b 167 -251 478 -115 331 -251 b 94 -242 143 -251 118 -248 b 9 -141 43 -229 20 -192 b 0 -68 3 -115 0 -91 b 284 249 0 95 127 200 b 304 252 289 251 297 252 b 481 78 374 252 481 170 b 480 56 481 71 481 63 z m 213 -102 b 399 6 274 -81 341 -48 b 402 17 400 7 402 13 b 399 27 402 22 400 26 b 311 94 373 53 353 88 b 292 95 305 95 300 95 b 130 27 230 95 181 55 b 69 -62 98 9 62 -29 b 161 -98 76 -98 128 -91 b 213 -102 174 -101 186 -101 z',\n },\n noteheadBlack: {\n x_min: 0,\n x_max: 334.04644433966797,\n y_min: -164,\n y_max: 164,\n ha: 328,\n o: 'm 112 -233 b 141 -236 122 -235 131 -236 b 481 104 279 -236 485 -48 b 403 222 477 141 478 192 b 334 236 382 232 359 236 b 1 -59 180 236 13 59 b 0 -85 1 -68 0 -76 b 112 -233 0 -157 32 -215 z',\n },\n noteheadXWhole: {\n x_min: 0,\n x_max: 506,\n y_min: -143.0823320899293,\n y_max: 144,\n ha: 287.0823320899293,\n o: 'm 53 -206 b 219 -163 117 -207 170 -196 b 314 -102 249 -141 282 -122 b 377 -63 334 -89 356 -76 b 514 -161 422 -96 468 -128 b 576 -196 534 -174 552 -196 b 589 -193 580 -196 585 -196 b 688 -174 625 -194 657 -181 b 711 -158 698 -171 711 -173 b 696 -143 711 -151 701 -147 b 503 -9 632 -98 567 -52 l 485 4 b 704 145 559 49 634 95 b 729 164 711 150 729 151 l 729 168 b 696 196 726 183 710 193 b 621 207 671 202 645 207 b 528 177 589 207 557 200 b 373 76 480 140 426 108 b 246 164 330 104 287 132 b 122 206 207 193 167 203 b 66 192 102 207 72 207 b 99 147 58 173 85 158 b 274 14 157 102 215 58 b 16 -164 184 -42 96 -98 b 0 -179 12 -168 0 -170 b 1 -183 0 -180 0 -183 b 26 -204 6 -193 12 -204 b 53 -206 37 -206 49 -206 z m 611 -177 b 376 -9 530 -118 452 -63 l 164 -143 b 104 -164 147 -154 130 -164 b 82 -161 96 -164 89 -164 b 230 -65 137 -125 183 -95 l 347 12 b 327 26 341 16 334 22 l 196 121 b 163 147 184 128 173 137 b 140 173 154 154 140 163 b 143 180 140 176 141 177 b 179 166 154 194 167 174 l 372 27 l 566 153 b 613 171 580 161 596 170 b 635 160 624 171 635 174 b 621 147 635 153 626 150 l 429 24 b 400 6 419 19 409 13 b 569 -117 456 -35 513 -75 b 611 -177 588 -130 608 -143 z',\n },\n noteheadXHalf: {\n x_min: 0,\n x_max: 421,\n y_min: -145.51844828189743,\n y_max: 151,\n ha: 296.51844828189746,\n o: 'm 490 -209 b 539 -207 505 -207 521 -207 b 606 -209 560 -207 583 -209 b 598 -196 602 -203 600 -199 l 406 -19 l 540 130 b 547 144 546 135 547 140 b 536 156 547 148 543 153 b 488 192 518 166 503 176 b 416 217 471 209 444 217 b 323 180 380 217 344 204 l 264 115 b 239 138 256 122 248 131 b 33 197 180 196 108 200 b 3 186 23 197 6 193 b 19 154 -1 174 10 163 b 171 12 69 107 120 59 b 19 -157 120 -45 69 -101 b 0 -177 14 -163 0 -166 b 1 -181 0 -179 0 -180 b 39 -203 9 -197 22 -203 l 186 -203 b 197 -202 190 -202 193 -200 l 213 -202 b 262 -180 228 -202 246 -199 l 314 -122 b 490 -209 363 -170 412 -216 z m 435 -148 b 291 -30 379 -112 337 -69 l 213 -118 b 190 -137 207 -125 202 -137 b 145 -111 173 -130 154 -127 b 160 -79 137 -98 151 -88 b 238 16 184 -48 212 -16 b 141 99 204 43 173 72 l 124 117 b 115 132 121 121 115 127 b 118 137 115 134 117 137 b 141 132 127 147 135 138 l 253 36 b 347 150 285 75 315 112 b 370 164 354 160 363 163 b 403 145 382 164 393 156 b 416 127 412 140 416 132 b 405 102 416 118 412 111 l 307 -10 b 413 -105 343 -42 379 -73 b 435 -148 425 -115 436 -125 z',\n },\n noteheadXBlack: {\n x_min: 0,\n x_max: 289,\n y_min: -156,\n y_max: 157,\n ha: 313,\n o: 'm 23 -225 b 69 -204 40 -223 56 -219 b 137 -131 92 -180 115 -157 l 209 -50 b 377 -197 264 -101 321 -148 b 403 -210 384 -203 393 -210 l 408 -210 b 416 -192 416 -207 416 -199 l 416 -186 b 403 -148 416 -171 413 -158 b 344 -81 384 -125 367 -101 b 252 -1 312 -55 282 -29 b 377 157 297 49 340 101 b 402 202 387 170 402 187 b 395 217 402 207 400 213 b 376 226 389 223 382 226 b 334 192 360 226 346 204 b 206 42 289 143 248 94 b 96 161 167 81 131 120 b 60 193 86 174 76 189 b 33 206 52 196 42 206 b 22 199 29 206 26 204 b 10 173 14 190 10 181 b 22 147 10 166 14 157 b 148 7 62 98 104 52 b 164 -7 154 1 158 -3 b 10 -189 111 -66 55 -122 b 0 -212 6 -197 0 -203 b 1 -217 0 -213 0 -216 b 23 -225 4 -226 14 -222 z',\n },\n noteheadCircleX: {\n x_min: 0,\n x_max: 344,\n y_min: -179,\n y_max: 175.12551922594866,\n ha: 354.12551922594866,\n o: 'm 99 -210 b 236 -258 137 -242 186 -258 b 418 -183 305 -258 374 -230 b 495 33 475 -120 495 -48 b 494 66 495 45 494 55 b 302 252 487 183 405 256 b 181 243 262 249 222 248 b 46 171 128 236 79 219 b 0 19 14 127 0 73 b 99 -210 0 -68 35 -156 z m 245 42 l 124 156 b 200 176 145 166 170 173 b 337 183 245 181 291 184 b 377 176 351 183 364 180 b 245 42 333 131 288 86 z m 392 -99 l 285 3 l 400 121 b 418 154 409 131 418 140 b 465 50 448 130 465 94 b 405 -112 462 -17 439 -73 z m 89 -120 b 48 0 56 -82 48 -42 b 89 112 48 35 59 76 b 109 101 96 111 102 108 l 210 7 l 187 -17 b 89 -120 151 -53 125 -82 z m 176 -183 b 127 -163 158 -179 141 -171 l 252 -32 l 372 -144 b 233 -189 334 -173 285 -189 b 176 -183 215 -189 196 -187 z',\n },\n noteheadTriangleUpWhole: {\n x_min: 0,\n x_max: 366,\n y_min: -145,\n y_max: 138,\n ha: 283,\n o: 'm 504 -209 b 527 -199 520 -209 527 -206 b 520 -180 527 -193 524 -187 b 459 -94 501 -151 480 -122 b 279 170 400 -6 341 82 b 242 199 266 190 253 199 b 206 167 230 199 219 189 b 10 -145 140 63 76 -42 b 0 -171 3 -156 0 -164 b 23 -200 0 -183 9 -192 b 55 -209 33 -206 45 -209 z m 202 -161 b 176 -137 183 -163 176 -156 b 187 -62 176 -111 179 -86 b 253 95 206 -10 228 42 b 337 -132 307 24 334 -49 b 311 -161 338 -153 334 -161 b 256 -160 294 -161 275 -160 b 202 -161 238 -160 220 -161 z',\n },\n noteheadTriangleUpHalf: {\n x_min: 0,\n x_max: 341.0833130378007,\n y_min: -159,\n y_max: 159,\n ha: 318,\n o: 'm 458 -226 b 478 -229 462 -223 469 -229 b 490 -222 482 -229 487 -228 b 477 -184 495 -207 484 -196 b 281 176 410 -65 346 56 b 238 225 269 194 261 213 b 225 229 232 226 228 228 b 209 215 217 229 213 225 b 4 -153 141 92 73 -30 b 0 -170 1 -158 0 -164 b 12 -189 0 -177 4 -183 b 66 -215 27 -202 43 -213 b 458 -226 194 -217 323 -222 z m 151 -167 b 298 75 204 -89 240 -1 b 301 82 300 76 301 79 l 357 -22 b 344 -43 353 -27 350 -37 b 285 -163 317 -79 312 -127 b 278 -170 282 -166 279 -167 z',\n },\n noteheadTriangleUpBlack: {\n x_min: 0,\n x_max: 346,\n y_min: -149,\n y_max: 149,\n ha: 298,\n o: 'm 481 -215 b 498 -209 487 -215 492 -215 b 482 -173 498 -194 488 -184 l 284 173 b 259 202 278 184 269 194 b 229 215 248 210 238 215 b 196 189 216 215 206 206 l 13 -150 b 3 -168 9 -156 6 -163 b 0 -180 1 -173 0 -177 b 12 -197 0 -187 4 -193 b 63 -213 29 -206 45 -213 b 481 -215 203 -213 343 -215 z',\n },\n noteheadDiamondWhole: {\n x_min: 0,\n x_max: 271,\n y_min: -132,\n y_max: 132,\n ha: 264,\n o: 'm 230 -177 b 256 -190 240 -186 249 -190 b 281 -173 265 -190 272 -184 b 382 -29 314 -124 347 -76 b 390 -10 387 -22 390 -14 b 376 12 390 -3 386 4 b 173 177 308 66 240 121 b 144 190 166 183 160 190 b 98 153 127 186 112 170 b 13 40 69 115 42 76 b 0 13 4 29 0 20 b 22 -19 0 3 7 -9 b 230 -177 92 -69 163 -122 z m 279 -128 b 261 -122 274 -134 266 -127 l 66 30 b 56 45 59 35 56 39 b 62 56 56 48 59 52 b 122 122 91 101 105 122 b 194 76 138 122 158 107 l 320 -26 b 336 -50 325 -32 336 -35 b 279 -128 318 -75 300 -102 z',\n },\n noteheadDiamondHalf: {\n x_min: 0,\n x_max: 295,\n y_min: -148,\n y_max: 148,\n ha: 296,\n o: 'm 228 -207 b 245 -213 235 -210 240 -213 b 264 -203 252 -213 258 -210 b 415 -46 314 -150 364 -98 b 425 -27 420 -40 425 -35 b 416 -10 425 -22 422 -16 b 217 200 350 60 284 131 b 194 213 212 207 204 213 b 170 196 181 213 177 203 b 14 33 118 143 68 86 b 0 7 4 23 0 16 b 17 -20 0 -1 6 -10 b 118 -114 52 -50 82 -85 b 228 -207 156 -144 184 -184 z m 209 -157 b 134 -69 177 -138 141 -115 b 130 -26 131 -55 130 -40 b 215 148 130 42 160 99 b 225 156 217 151 220 156 b 230 153 226 156 228 156 b 323 -26 276 104 321 55 b 298 -75 324 -42 315 -59 b 265 -109 287 -86 276 -99 b 209 -157 245 -125 228 -167 z',\n },\n noteheadDiamondBlack: {\n x_min: 0,\n x_max: 310,\n y_min: -146,\n y_max: 146,\n ha: 292,\n o: 'm 266 -210 b 289 -194 278 -209 284 -200 b 406 -76 330 -156 367 -115 b 446 -23 433 -49 446 -36 b 412 29 446 -10 435 3 b 405 36 409 30 408 33 b 252 196 354 89 304 143 b 225 210 243 204 235 210 b 204 202 219 210 212 209 b 10 24 141 141 75 82 b 0 9 4 19 0 14 b 9 -6 0 4 3 0 l 232 -192 b 266 -210 242 -200 256 -204 z',\n },\n noteheadSquareWhite: {\n x_min: 0,\n x_max: 350,\n y_min: -131,\n y_max: 131,\n ha: 262,\n o: 'm 468 -189 b 485 -187 474 -189 480 -189 b 500 -176 495 -187 500 -183 b 498 -168 500 -174 498 -171 b 497 -166 498 -167 497 -167 l 498 -164 b 504 -154 503 -163 504 -158 b 503 -138 504 -150 503 -144 l 503 -135 l 503 -94 b 492 66 500 -45 494 10 b 488 135 492 89 488 112 b 484 150 488 141 485 145 b 482 154 482 151 482 153 b 429 189 472 177 456 189 b 53 184 304 186 179 186 l 39 184 b 33 181 36 183 35 183 b 12 160 20 181 12 177 b 0 -109 9 71 4 -19 b 19 -137 0 -125 7 -134 b 23 -151 19 -141 20 -145 b 85 -187 37 -173 55 -187 b 468 -189 212 -187 340 -187 z m 246 -125 l 63 -125 b 66 -111 65 -122 66 -117 b 73 72 69 -50 71 10 l 73 130 b 88 128 78 128 82 128 b 148 130 108 130 128 130 b 271 128 190 130 230 128 l 271 130 l 420 130 b 428 20 425 92 425 56 l 436 -127 l 246 -127 z',\n },\n noteheadSquareBlack: {\n x_min: 0,\n x_max: 342,\n y_min: -129.98961937716263,\n y_max: 132.44444444444446,\n ha: 262.4340638216071,\n o: 'm 217 190 b 439 186 304 190 372 190 b 467 180 448 184 458 183 b 492 145 484 176 492 167 b 490 -124 490 56 490 -33 b 488 -141 490 -130 488 -135 b 456 -170 488 -163 478 -168 b 118 -183 344 -176 230 -181 b 29 -184 89 -183 60 -192 b 0 -148 4 -180 0 -168 b 1 29 1 -89 1 -30 l 1 156 b 36 190 3 187 4 190 b 217 190 102 192 168 190 z',\n },\n noteheadParenthesis: {\n x_min: -70.190112022022,\n x_max: 329,\n y_min: -196,\n y_max: 201,\n ha: 397,\n o: 'm 344 -279 b 382 -262 361 -288 370 -272 b 405 -233 390 -255 399 -245 b 474 9 455 -158 468 -73 b 416 228 474 78 448 174 b 364 282 403 249 387 271 b 344 289 359 285 350 288 b 331 279 338 289 333 287 b 325 248 328 269 325 258 b 338 225 325 238 328 229 b 412 138 379 207 396 174 b 445 1 433 92 445 45 b 346 -217 445 -81 410 -154 b 336 -252 340 -223 336 -238 b 344 -279 336 -265 338 -276 z m 19 -274 b 35 -282 24 -279 30 -281 b 49 -265 42 -282 46 -275 b 52 -243 50 -256 52 -249 b 36 -210 52 -230 49 -220 b -60 -59 -16 -173 -35 -114 b -73 9 -69 -39 -73 -16 b 33 223 -73 92 -24 189 b 50 265 43 229 50 249 b 33 288 50 278 46 289 b 4 272 23 288 14 275 b -9 261 0 269 -4 265 b -101 23 -58 193 -105 124 b -37 -206 -104 -52 -75 -130 b 19 -274 -23 -232 -6 -255 z',\n },\n noteheadParenthesisRight: {\n x_min: -30,\n x_max: 82,\n y_min: -199.08429092881173,\n y_max: 206,\n ha: 405.0842909288117,\n o: 'm -17 -282 b 24 -264 -6 -297 12 -272 b 60 -219 40 -253 52 -236 b 117 1 96 -150 112 -75 b 118 16 118 6 118 12 b 109 73 118 36 112 55 b 4 279 99 154 68 226 b -23 297 -4 287 -13 297 b -37 289 -27 297 -32 294 b -43 266 -42 285 -43 276 b -32 225 -43 251 -37 229 b 84 -7 48 170 84 82 b 32 -184 84 -69 65 -132 b -10 -222 22 -200 4 -209 b -24 -258 -20 -232 -24 -245 b -17 -282 -24 -266 -22 -276 z',\n },\n noteheadParenthesisLeft: {\n x_min: 0,\n x_max: 106,\n y_min: -197,\n y_max: 197,\n ha: 394,\n o: 'm 134 -284 b 138 -281 135 -284 137 -284 b 145 -268 144 -278 145 -274 l 144 -253 b 107 -180 138 -225 121 -204 b 42 13 71 -120 42 -56 b 49 73 42 32 43 52 b 137 210 62 128 95 171 b 153 255 147 219 153 239 b 145 278 153 265 151 274 b 130 284 140 281 135 284 b 98 259 117 284 108 268 b 0 37 35 203 1 131 b 118 -268 9 -69 53 -173 b 134 -284 121 -274 127 -284 z',\n },\n augmentationDot: {\n x_min: 0,\n x_max: 96,\n y_min: -57,\n y_max: 57,\n ha: 114,\n o: 'm 13 -82 b 16 -81 14 -82 14 -82 b 105 -73 46 -76 75 -76 b 131 -48 121 -72 131 -60 b 138 26 134 -24 138 0 b 137 48 138 33 138 40 b 108 82 134 71 125 82 b 95 81 104 82 99 82 b 33 71 75 78 53 75 b 4 46 20 68 6 62 b 0 -66 1 9 0 -29 b 13 -82 0 -73 1 -82 z',\n },\n tremolo1: {\n x_min: -158,\n x_max: 156.19381479578487,\n y_min: -88,\n y_max: 88,\n ha: 176,\n o: 'm -206 -127 b -194 -125 -203 -127 -199 -127 b 173 -36 -72 -94 50 -65 b 220 16 202 -29 215 -12 b 225 50 223 30 225 45 b 216 107 226 76 222 91 b 194 127 210 120 204 127 b 183 124 192 127 189 127 l -192 33 b -226 -9 -213 27 -222 14 b -228 -32 -226 -16 -228 -23 b -222 -108 -228 -58 -222 -82 b -206 -127 -222 -120 -217 -127 z',\n },\n flag8thUp: {\n x_min: 0,\n x_max: 261,\n y_min: -819,\n y_max: 0,\n ha: 819,\n o: 'm 265 -1171 b 351 -1035 301 -1130 336 -1087 b 376 -867 369 -979 376 -923 b 367 -755 376 -829 373 -792 b 233 -422 350 -632 311 -520 b 131 -291 199 -379 166 -334 b 65 -125 91 -239 66 -192 b 62 -75 65 -112 62 -91 b 42 0 62 -49 52 -24 l 35 0 b 0 -63 6 -13 0 -36 l 0 -144 b 96 -445 0 -255 29 -356 b 177 -547 124 -478 150 -514 b 308 -831 246 -629 298 -721 b 317 -890 310 -851 317 -871 b 311 -919 317 -900 315 -910 b 256 -1005 297 -950 282 -984 b 228 -1068 233 -1024 228 -1045 b 230 -1106 228 -1080 229 -1093 b 240 -1162 232 -1125 239 -1143 b 251 -1179 242 -1174 246 -1179 b 265 -1171 255 -1179 259 -1176 z',\n },\n flag8thDown: {\n x_min: 0,\n x_max: 261,\n y_min: 0,\n y_max: 819,\n ha: 819,\n o: 'm 265 1171 b 251 1179 259 1176 255 1179 b 240 1162 246 1179 242 1174 b 230 1106 239 1143 232 1125 b 228 1068 229 1093 228 1080 b 256 1005 228 1045 233 1024 b 311 919 282 984 297 950 b 317 890 315 910 317 900 b 308 831 317 871 310 851 b 177 547 298 721 246 629 b 96 445 150 514 124 478 b 0 144 29 356 0 255 l 0 63 b 35 0 0 36 6 13 l 42 0 b 62 75 52 24 62 49 b 59 117 62 91 59 104 b 131 291 60 183 91 239 b 233 422 166 334 199 379 b 367 755 311 520 350 632 b 376 867 373 792 376 829 b 351 1035 376 923 369 979 b 265 1171 336 1087 301 1130 z',\n },\n flag16thUp: {\n x_min: 0,\n x_max: 327.1591498636094,\n y_min: -819.3972596310256,\n y_max: 0,\n ha: 819.3972596310256,\n o: 'm 415 -1179 b 435 -1168 423 -1182 429 -1174 b 451 -1138 442 -1159 446 -1149 b 465 -1020 464 -1102 467 -1064 b 461 -962 464 -1004 464 -984 b 471 -821 467 -916 472 -870 b 465 -721 472 -791 467 -756 b 415 -520 459 -651 441 -585 b 200 -245 370 -408 284 -327 b 96 -114 160 -206 118 -168 b 75 -24 84 -85 85 -53 b 59 0 72 -16 72 0 b 53 -1 58 0 56 -1 b 27 -32 40 -6 27 -10 b 29 -68 27 -43 29 -55 b 10 -79 20 -69 13 -72 b 1 -109 6 -89 1 -99 b 0 -170 0 -130 0 -148 b 35 -410 0 -252 12 -333 b 258 -793 76 -557 156 -681 b 409 -1158 350 -896 410 -1014 b 415 -1179 409 -1165 405 -1175 z m 413 -816 b 331 -681 392 -769 364 -723 b 145 -420 266 -596 189 -521 b 86 -281 125 -374 102 -330 b 156 -370 105 -312 128 -343 b 318 -539 210 -425 269 -478 b 413 -816 383 -621 420 -713 z',\n },\n flag16thDown: {\n x_min: 0,\n x_max: 327.1591498636094,\n y_min: 0,\n y_max: 819,\n ha: 819,\n o: 'm 59 0 b 75 24 72 0 72 16 b 96 114 85 53 84 85 b 200 245 118 168 160 206 b 415 520 284 327 370 408 b 465 721 441 585 459 651 b 471 821 467 756 472 791 b 461 962 472 870 467 916 b 465 1020 464 984 464 1004 b 451 1138 467 1064 464 1102 b 435 1168 446 1149 442 1159 b 418 1179 431 1172 425 1179 l 415 1179 b 408 1169 409 1176 408 1174 b 409 1158 408 1165 409 1161 b 258 793 410 1014 350 896 b 35 410 156 681 76 557 b 0 170 12 333 0 252 l 0 88 b 29 7 0 71 6 23 b 59 0 33 4 58 0 z m 86 281 b 145 420 102 330 125 374 b 331 681 189 521 266 596 b 413 816 364 723 392 769 b 415 791 413 808 415 799 b 318 539 415 698 377 613 b 156 370 269 478 210 425 b 86 281 128 343 105 312 z',\n },\n flag32ndUp: {\n x_min: -0.19862981551275186,\n x_max: 268.0942440943661,\n y_min: -849.4710740978672,\n y_max: 149.0769891455102,\n ha: 998.5480632433774,\n o: 'm 323 -1223 b 351 -1198 337 -1227 344 -1210 b 359 -1184 354 -1194 356 -1188 b 386 -999 377 -1122 387 -1060 b 341 -783 386 -927 372 -855 b 330 -736 334 -769 330 -753 b 333 -708 330 -727 330 -717 b 344 -621 340 -678 344 -649 b 341 -579 344 -608 343 -593 b 328 -500 338 -553 328 -526 b 331 -475 328 -491 328 -484 b 347 -370 343 -438 348 -402 b 151 27 348 -212 288 -56 b 53 176 98 59 50 102 b 45 197 53 183 48 192 b 33 215 40 203 40 216 l 30 215 b 6 194 22 212 9 209 b 0 120 3 170 -1 145 b 0 -43 4 65 0 13 b 0 -98 0 -60 1 -79 b 4 -276 0 -157 6 -216 b 7 -456 4 -337 7 -397 b 66 -638 7 -523 22 -585 b 158 -724 94 -671 127 -697 b 318 -1011 246 -801 295 -899 b 321 -1044 321 -1021 321 -1032 b 312 -1152 321 -1080 312 -1116 b 317 -1192 312 -1165 314 -1179 b 323 -1223 320 -1202 311 -1220 z m 285 -376 b 121 -180 249 -289 173 -245 b 91 -105 104 -158 92 -135 b 288 -354 181 -144 288 -269 b 285 -376 288 -363 287 -370 z m 275 -657 b 111 -492 226 -589 163 -547 b 65 -376 78 -456 66 -418 b 71 -323 65 -360 68 -341 b 275 -657 164 -418 265 -504 z',\n },\n flag32ndDown: {\n x_min: -2.800802874905624,\n x_max: 268.09424409436605,\n y_min: -169.07698914551014,\n y_max: 829.4710740978672,\n ha: 998.5480632433773,\n o: 'm 323 1194 b 317 1164 311 1191 320 1174 b 312 1123 314 1151 312 1136 b 321 1015 312 1087 321 1051 b 318 982 321 1004 321 992 b 158 696 295 870 246 772 b 66 609 127 668 94 642 b 7 428 22 556 7 494 b 4 248 7 369 4 308 b -1 78 6 187 -10 137 b 0 14 0 59 0 32 l 0 -148 b 6 -223 0 -174 3 -199 b 30 -243 9 -238 22 -240 l 33 -243 b 45 -226 40 -245 40 -232 b 53 -204 48 -220 53 -212 b 151 -56 50 -131 98 -88 b 347 341 288 27 348 183 b 331 446 348 373 343 409 b 328 471 328 455 328 462 b 341 550 328 497 338 524 b 344 592 343 564 344 579 b 333 680 344 621 340 649 b 330 707 330 688 330 698 b 341 755 330 724 334 740 b 386 971 372 827 386 899 b 359 1155 387 1031 377 1093 b 351 1169 356 1159 354 1165 b 323 1194 344 1181 337 1198 z m 275 628 b 71 294 265 475 164 389 b 65 347 68 312 65 331 b 111 464 66 389 78 428 b 275 628 163 518 226 560 z m 285 347 b 288 325 287 341 288 334 b 91 76 288 240 181 115 b 121 151 92 107 104 130 b 285 347 173 216 249 261 z',\n },\n flag64thUp: {\n x_min: -4,\n x_max: 282,\n y_min: -823.5430338167067,\n y_max: 347,\n ha: 1170.5430338167066,\n o: 'm 350 -1185 b 380 -1162 364 -1189 374 -1175 b 406 -1022 399 -1119 406 -1071 b 359 -798 406 -945 384 -871 b 348 -756 353 -785 348 -772 b 350 -744 348 -753 350 -749 b 363 -621 356 -704 363 -664 b 360 -580 363 -608 363 -593 b 359 -560 359 -573 359 -567 b 373 -490 359 -536 366 -513 b 393 -346 386 -444 393 -395 b 387 -269 393 -320 390 -294 b 348 -127 382 -219 348 -173 b 351 -104 348 -120 348 -111 b 353 -65 351 -91 353 -78 b 341 37 353 -26 348 6 b 226 215 323 108 278 164 b 86 336 181 258 127 288 b 62 395 72 353 62 370 b 42 481 62 423 55 454 b 27 500 37 488 36 500 b 24 498 26 500 26 500 b -1 480 14 497 1 492 b -6 444 -4 467 -6 455 l -6 435 b -1 341 -1 403 -1 372 l -1 266 b 6 156 -1 230 0 193 b 13 35 12 117 13 75 l 13 -35 b 14 -85 13 -52 14 -68 b 29 -276 19 -150 33 -213 b 20 -448 24 -334 20 -392 b 24 -534 20 -477 22 -505 b 114 -708 30 -605 59 -664 b 197 -780 143 -732 171 -755 b 344 -1153 301 -884 341 -1011 b 343 -1172 344 -1159 343 -1166 b 350 -1185 343 -1176 344 -1182 z m 287 -88 b 62 193 186 -17 79 48 b 229 52 121 144 174 98 b 289 -33 256 29 274 -3 b 295 -56 294 -42 295 -49 b 287 -88 295 -66 292 -76 z m 298 -410 b 118 -235 238 -351 176 -295 b 76 -88 82 -197 78 -147 b 268 -252 137 -153 203 -202 b 330 -360 304 -279 330 -315 b 323 -402 330 -373 327 -387 b 311 -418 318 -413 315 -418 b 298 -410 307 -418 302 -415 z m 300 -691 b 117 -508 243 -616 168 -575 b 82 -408 94 -480 82 -448 b 84 -379 82 -397 82 -387 b 259 -553 135 -451 206 -492 b 301 -667 287 -583 301 -619 b 300 -691 301 -674 301 -683 z',\n },\n flag64thDown: {\n x_min: -5,\n x_max: 281,\n y_min: -375,\n y_max: 795.5430338167066,\n ha: 1170.5430338167066,\n o: 'm 348 1145 b 341 1132 343 1142 341 1136 b 343 1113 341 1126 343 1119 b 196 740 340 971 300 844 b 112 668 170 714 141 691 b 23 494 58 624 29 564 b 19 408 20 465 19 436 b 27 236 19 351 23 294 b 13 45 32 173 17 109 b 12 -6 13 27 12 12 l 12 -75 b 4 -196 12 -115 10 -157 b -3 -307 -1 -233 -3 -271 l -3 -382 b -7 -475 -3 -412 -3 -444 l -7 -484 b -3 -520 -7 -495 -6 -507 b 23 -539 0 -533 13 -537 b 26 -540 24 -540 24 -540 b 40 -521 35 -540 36 -528 b 60 -435 53 -494 60 -464 b 85 -376 60 -410 71 -393 b 225 -255 125 -328 180 -298 b 340 -78 276 -204 321 -148 b 351 24 347 -46 351 -14 b 350 63 351 37 350 50 b 347 86 347 71 347 79 b 386 229 347 132 380 179 b 392 305 389 253 392 279 b 372 449 392 354 384 403 b 357 520 364 472 357 495 b 359 540 357 527 357 533 b 361 580 361 553 361 567 b 348 704 361 624 354 664 b 347 716 348 708 347 713 b 357 757 347 732 351 744 b 405 982 383 831 405 904 b 379 1122 405 1031 397 1079 b 348 1145 373 1135 363 1149 z m 298 651 b 300 626 300 642 300 634 b 258 513 300 579 285 543 b 82 338 204 452 134 410 b 81 367 81 347 81 357 b 115 468 81 408 92 439 b 298 651 167 534 242 576 z m 297 370 b 310 377 301 374 305 377 b 321 361 314 377 317 373 b 328 320 325 347 328 333 b 266 212 328 275 302 239 b 75 48 202 161 135 112 b 117 194 76 107 81 157 b 297 370 174 255 236 311 z m 285 48 b 294 16 291 36 294 26 b 288 -7 294 9 292 1 b 228 -92 272 -37 255 -69 b 60 -233 173 -138 120 -184 b 285 48 78 -88 184 -23 z',\n },\n flag128thUp: {\n x_min: 0,\n x_max: 252,\n y_min: -804,\n y_max: 530,\n ha: 1334,\n o: 'm 298 -1158 b 328 -1126 312 -1158 320 -1139 b 330 -1116 330 -1123 330 -1119 b 347 -996 343 -1076 347 -1037 b 328 -837 347 -943 338 -890 b 320 -778 324 -816 320 -798 b 330 -733 320 -763 323 -749 b 340 -665 338 -714 337 -688 b 341 -645 340 -660 341 -652 b 333 -534 341 -609 333 -572 b 343 -471 333 -513 334 -492 b 361 -366 356 -436 361 -402 b 331 -202 361 -311 348 -256 b 328 -187 330 -197 328 -193 b 331 -179 328 -184 328 -181 b 363 -55 353 -137 363 -96 b 337 79 363 -12 351 33 b 327 114 333 92 327 104 b 344 144 327 124 331 132 b 359 174 353 150 357 163 b 361 228 360 193 361 210 b 243 517 361 337 325 435 b 147 596 213 546 179 569 b 75 708 111 626 75 655 b 62 744 75 723 68 733 b 50 763 58 752 58 763 b 46 762 49 763 48 762 b 17 742 36 757 22 757 b 0 697 14 726 0 711 b 1 595 0 662 3 631 b 0 469 0 552 0 511 b 1 429 0 456 0 442 b 22 289 6 382 22 337 b 24 128 22 238 24 184 b 22 66 24 108 23 86 b 19 -19 20 37 19 10 b 20 -132 19 -56 20 -95 b 13 -276 20 -180 19 -229 b 9 -359 10 -304 9 -330 b 12 -487 9 -402 12 -445 b 56 -582 12 -526 29 -554 b 197 -742 107 -632 160 -681 b 288 -1100 265 -851 276 -976 b 288 -1122 288 -1107 287 -1115 b 287 -1145 289 -1129 287 -1138 b 298 -1158 287 -1153 288 -1158 z m 304 150 b 75 475 229 256 112 334 b 304 150 233 357 305 287 z m 271 -73 b 127 72 233 -14 179 26 b 81 167 96 98 81 127 b 84 194 81 176 82 184 b 271 -73 148 102 242 39 z m 279 -396 b 132 -223 233 -330 180 -279 b 81 -112 104 -192 81 -156 b 82 -91 81 -105 81 -98 b 279 -396 167 -125 269 -281 z m 249 -609 b 69 -357 197 -520 88 -471 b 249 -609 131 -441 229 -498 z',\n },\n flag128thDown: {\n x_min: -0.8888888888888888,\n x_max: 252,\n y_min: -580,\n y_max: 754,\n ha: 1334,\n o: 'm 298 1086 b 287 1073 288 1086 287 1081 b 288 1050 287 1066 289 1057 b 288 1028 287 1043 288 1035 b 197 670 276 904 265 779 b 56 510 160 609 107 560 b 12 415 29 482 12 454 b 9 287 12 373 9 330 b 13 204 9 258 10 232 b 20 60 19 157 20 108 b 19 -53 20 23 19 -16 b 22 -138 19 -82 20 -109 b 24 -200 23 -158 24 -180 b 22 -361 24 -256 22 -310 b 1 -501 22 -409 6 -454 b 0 -541 0 -514 0 -528 b 0 -667 0 -583 -3 -624 b 0 -809 0 -675 -3 -791 b 46 -834 4 -825 36 -829 b 50 -835 48 -834 49 -835 b 62 -816 58 -835 58 -824 b 75 -780 68 -805 75 -795 b 147 -668 75 -727 111 -698 b 243 -589 179 -641 213 -618 b 361 -300 325 -507 361 -409 b 359 -246 361 -282 360 -265 b 344 -216 357 -235 353 -222 b 327 -186 331 -204 327 -196 b 337 -151 327 -176 333 -164 b 363 -17 351 -105 363 -60 b 331 107 363 24 353 65 b 328 115 328 109 328 112 b 331 130 328 121 330 125 b 361 294 348 184 361 239 b 343 399 361 330 356 364 b 333 462 334 420 333 441 b 341 573 333 500 341 537 b 340 593 341 580 340 588 b 330 661 337 616 338 642 b 320 706 323 677 320 691 b 328 765 320 726 324 744 b 347 924 338 818 347 871 b 330 1044 347 965 343 1004 b 328 1054 330 1047 330 1051 b 298 1086 320 1067 312 1086 z m 249 537 b 69 285 229 426 131 369 b 249 537 88 399 197 448 z m 279 324 b 82 19 269 209 167 53 b 81 40 81 26 81 33 b 132 151 81 84 104 120 b 279 324 180 207 233 258 z m 271 1 b 84 -266 242 -111 148 -174 b 81 -239 82 -256 81 -248 b 127 -144 81 -199 96 -170 b 271 1 179 -98 233 -58 z m 304 -222 b 75 -547 305 -359 233 -429 b 304 -222 112 -406 229 -328 z',\n },\n accidentalFlat: {\n x_min: 1,\n x_max: 209,\n y_min: -208,\n y_max: 472,\n ha: 680,\n o: 'm 29 -300 b 46 -289 33 -300 39 -297 b 107 -243 65 -274 86 -258 b 301 127 233 -153 301 -30 b 298 186 301 147 301 166 b 190 297 291 256 251 297 b 147 289 177 297 163 294 b 86 265 127 284 107 274 l 85 264 l 85 301 b 91 465 85 356 88 410 b 94 559 91 497 94 527 b 84 651 94 589 91 621 b 66 680 81 661 81 680 l 65 680 b 37 645 49 678 37 665 b 33 523 36 605 32 563 l 33 478 b 26 223 33 393 29 308 b 1 -141 22 101 1 -19 b 17 -287 1 -189 4 -239 b 29 -300 20 -295 23 -300 z m 68 -105 b 76 12 71 -68 72 -29 b 81 107 79 43 81 75 l 86 109 b 171 135 114 121 141 135 b 204 128 181 135 193 132 b 238 92 228 120 239 108 b 230 63 238 84 236 75 b 68 -105 193 -10 132 -59 z',\n },\n accidentalNatural: {\n x_min: 0,\n x_max: 213.5,\n y_min: -456,\n y_max: 462,\n ha: 918,\n o: 'm 255 -657 b 281 -624 271 -657 275 -636 b 285 -599 282 -615 285 -608 b 292 -300 288 -500 289 -400 b 289 -161 292 -253 289 -207 b 300 128 292 -65 297 32 b 304 168 300 128 302 150 l 304 173 l 305 190 l 305 199 l 307 225 b 304 259 307 229 310 246 b 272 298 297 274 302 305 b 63 266 204 279 134 272 b 72 514 68 348 72 432 b 71 595 72 541 72 567 b 56 665 71 619 66 642 b 17 579 9 651 17 608 b 3 144 19 433 7 289 b 0 -7 1 94 0 43 b 3 -134 0 -50 1 -92 b 7 -219 3 -163 7 -192 b 35 -251 7 -243 17 -251 b 49 -249 39 -251 43 -251 l 223 -223 l 230 -222 l 230 -359 b 223 -516 230 -410 223 -464 b 236 -619 223 -550 226 -585 b 255 -657 240 -634 236 -657 z m 58 -63 b 55 81 56 -14 53 33 l 56 99 b 85 99 65 99 75 98 b 232 108 134 104 183 107 l 240 109 l 236 66 b 232 -48 235 29 232 -10 b 58 -81 174 -63 115 -73 z',\n },\n accidentalSharp: {\n x_min: -22,\n x_max: 390,\n y_min: -384,\n y_max: 383,\n ha: 767,\n o: 'm 202 -553 b 219 -526 213 -552 216 -536 b 226 -471 225 -507 226 -488 b 225 -425 226 -455 225 -441 b 226 -392 225 -415 225 -402 b 233 -305 229 -363 232 -334 l 297 -292 b 331 -469 300 -353 311 -412 b 347 -485 333 -477 338 -485 b 363 -469 356 -487 359 -477 b 374 -418 373 -454 374 -435 b 376 -382 376 -405 376 -393 b 372 -276 376 -347 373 -311 l 455 -259 b 550 -156 534 -243 544 -232 b 550 -109 550 -137 552 -124 b 526 -78 549 -91 541 -78 l 523 -78 b 507 -79 517 -78 513 -78 b 403 -101 474 -88 438 -95 l 379 -105 b 382 -42 380 -85 380 -63 b 384 96 383 4 384 50 b 503 131 425 107 464 118 b 549 173 524 138 543 150 b 562 249 554 199 562 223 b 554 294 562 264 560 279 b 536 315 549 308 544 315 l 533 315 b 517 312 528 315 523 315 b 382 266 472 294 428 279 l 377 344 b 359 531 374 406 372 469 b 348 552 356 539 357 552 l 347 552 l 343 552 b 315 528 331 549 317 544 l 315 501 b 320 249 315 416 318 333 l 243 232 b 239 361 243 275 242 318 b 226 425 238 383 238 403 b 199 359 194 409 199 382 b 193 223 196 312 194 268 b 72 202 153 215 112 209 b 4 118 13 192 4 183 b 10 66 0 102 12 84 b 33 29 7 39 14 30 b 48 32 37 29 42 30 b 187 55 95 39 141 46 l 183 -75 b 176 -145 181 -99 179 -122 b 16 -179 122 -156 69 -166 b -32 -232 -14 -186 -32 -197 b -17 -331 -32 -266 -19 -298 b -1 -356 -17 -347 -13 -354 b 12 -353 1 -356 6 -354 b 167 -320 63 -341 115 -331 b 166 -377 166 -338 166 -357 b 189 -526 166 -428 171 -477 b 202 -553 192 -536 189 -553 z m 240 -132 b 243 -37 242 -101 242 -69 b 245 65 245 -3 245 30 b 315 79 269 69 292 73 b 301 -120 308 13 305 -53 z',\n },\n accidentalDoubleSharp: {\n x_min: 0,\n x_max: 287,\n y_min: -159,\n y_max: 159,\n ha: 318,\n o: 'm 84 -229 b 107 -216 91 -229 98 -225 b 200 -125 138 -186 167 -154 b 232 -95 212 -115 222 -105 b 347 -189 271 -125 310 -157 b 370 -200 356 -196 363 -200 b 396 -179 380 -200 389 -192 b 412 -102 410 -154 406 -125 b 377 -27 410 -69 400 -46 l 325 14 b 402 91 350 42 374 68 b 413 127 410 96 413 107 b 382 200 409 148 397 176 b 350 229 370 220 360 229 b 314 210 340 229 328 223 b 274 174 300 199 285 187 b 212 104 252 151 232 128 b 92 187 173 132 132 161 b 78 193 86 192 82 193 b 68 190 75 193 72 193 b 48 179 62 186 53 187 b 40 137 43 168 40 154 b 81 16 40 92 56 32 b 107 -3 89 10 98 4 b 14 -94 76 -32 45 -62 b 0 -124 6 -102 0 -114 b 12 -154 0 -134 3 -144 b 62 -215 26 -176 48 -193 b 84 -229 69 -225 76 -229 z',\n },\n accidentalDoubleFlat: {\n x_min: 0,\n x_max: 359,\n y_min: -220,\n y_max: 446,\n ha: 666,\n o: 'm 43 -317 b 72 -301 55 -317 63 -310 b 160 -186 108 -268 134 -226 b 236 -60 186 -145 212 -102 b 233 -131 235 -85 233 -108 b 239 -220 233 -161 235 -190 b 259 -246 240 -233 239 -240 b 301 -228 284 -252 291 -238 b 465 -7 369 -163 416 -85 b 517 173 500 48 517 108 b 451 307 517 229 505 284 b 409 315 436 312 422 315 b 331 287 382 315 356 305 b 311 274 324 282 320 274 l 310 274 l 310 566 b 305 621 310 585 312 603 b 294 642 301 628 305 642 l 292 642 b 264 622 282 641 266 636 b 253 575 259 606 256 590 b 246 418 248 523 246 471 b 248 243 246 360 248 302 l 248 187 b 164 238 220 225 193 238 b 85 213 140 238 112 226 b 84 229 85 220 84 225 b 86 315 85 258 86 287 b 81 528 86 386 82 458 b 71 582 81 547 78 566 b 56 603 66 590 68 603 l 53 603 b 23 580 40 600 26 598 b 19 537 20 566 19 552 b 20 514 19 530 19 521 b 26 390 24 472 26 432 b 14 66 26 282 16 174 b 0 -168 13 -12 0 -91 b 12 -279 0 -206 3 -242 b 30 -314 16 -294 14 -308 b 43 -317 35 -317 39 -317 z m 301 -72 b 302 7 302 -45 302 -19 l 302 86 b 351 158 304 121 321 145 b 383 166 361 163 373 166 b 435 143 402 166 419 157 b 445 127 441 138 445 132 b 441 114 445 122 444 118 b 301 -72 397 49 354 -14 z m 75 -147 b 73 30 75 -86 75 -29 b 118 82 73 62 92 76 b 132 84 124 84 128 84 b 190 52 156 84 174 69 b 193 40 192 49 193 45 b 192 33 193 37 193 35 b 75 -147 157 -30 125 -95 z',\n },\n accidentalParensLeft: {\n x_min: 0,\n x_max: 130.18934911242604,\n y_min: -270,\n y_max: 267.6082500723851,\n ha: 537.6082500723851,\n o: 'm 107 -389 b 127 -374 114 -389 120 -384 b 141 -347 132 -367 137 -357 b 151 -294 148 -330 151 -311 b 122 -207 151 -265 141 -236 b 63 -65 94 -164 72 -117 b 59 -10 60 -46 59 -27 b 145 223 59 78 94 153 b 187 354 176 262 189 305 b 177 384 187 364 190 380 b 143 373 166 387 153 383 b 124 354 137 367 130 361 b 0 -35 33 240 0 108 l 0 -92 b 85 -372 4 -193 27 -287 b 107 -389 92 -383 99 -389 z',\n },\n accidentalParensRight: {\n x_min: -0.4444444444444445,\n x_max: 139,\n y_min: -275,\n y_max: 277,\n ha: 552,\n o: 'm 58 -396 b 96 -354 75 -396 85 -370 b 200 13 168 -238 200 -111 b 153 268 200 109 184 190 b 49 392 131 320 101 364 b 26 399 40 397 33 399 b 0 366 10 399 0 387 b 0 318 -1 350 0 334 l 0 291 b 27 238 -3 266 7 253 b 143 9 105 180 143 98 b 141 -20 143 -1 143 -10 b 63 -225 135 -92 108 -164 b 36 -307 45 -251 36 -278 b 40 -344 36 -320 37 -331 b 42 -356 42 -347 42 -351 b 58 -396 42 -374 37 -396 z',\n },\n accidentalQuarterToneFlatStein: {\n x_min: 0,\n x_max: 208,\n y_min: -240,\n y_max: 440,\n ha: 680,\n o: 'm 272 -346 b 284 -333 278 -346 281 -341 b 300 -187 297 -285 300 -235 b 275 177 300 -65 279 55 b 268 432 272 262 268 347 l 268 477 b 264 599 269 517 265 559 b 236 634 264 619 252 632 l 235 634 b 217 605 220 634 220 615 b 207 513 210 575 207 543 b 210 419 207 481 210 451 b 216 255 213 364 216 310 l 216 217 l 215 219 b 154 243 194 228 174 238 b 111 251 138 248 124 251 b 3 140 50 251 10 210 b 0 81 0 120 0 101 b 194 -289 0 -76 68 -199 b 255 -336 215 -304 236 -320 b 272 -346 262 -343 268 -346 z m 233 -151 b 71 17 168 -105 108 -56 b 63 46 65 29 63 37 b 96 82 62 62 73 73 b 130 89 108 86 120 89 b 215 63 160 89 187 75 l 220 60 b 225 -35 220 29 222 -3 b 233 -151 229 -75 230 -114 z',\n },\n accidentalThreeQuarterTonesFlatZimmermann: {\n x_min: 0,\n x_max: 422,\n y_min: -240,\n y_max: 440,\n ha: 680,\n o: 'm 272 -346 b 284 -333 278 -346 281 -341 b 300 -187 297 -285 300 -235 b 275 177 300 -65 279 55 b 268 432 272 262 268 347 l 268 477 b 264 599 269 517 265 559 b 236 634 264 619 252 632 l 235 634 b 217 605 220 634 220 615 b 207 513 210 575 207 543 b 210 419 207 481 210 451 b 216 255 213 364 216 310 l 216 217 l 215 219 b 154 243 194 228 174 238 b 111 251 138 248 124 251 b 3 140 50 251 10 210 b 0 81 0 120 0 101 b 194 -289 0 -76 68 -199 b 255 -336 215 -304 236 -320 b 272 -346 262 -343 268 -346 z m 336 -346 b 353 -336 340 -346 346 -343 b 413 -289 372 -320 393 -304 b 608 81 540 -199 608 -76 b 605 140 608 101 608 120 b 497 251 598 210 557 251 b 454 243 484 251 469 248 b 393 219 433 238 413 228 l 392 217 l 392 255 b 397 419 392 310 395 364 b 400 513 397 451 400 481 b 390 605 400 543 397 575 b 373 634 387 615 387 634 l 372 634 b 344 599 356 632 344 619 b 340 477 343 559 338 517 l 340 432 b 333 177 340 347 336 262 b 308 -187 328 55 308 -65 b 324 -333 308 -235 311 -285 b 336 -346 327 -341 330 -346 z m 233 -151 b 71 17 168 -105 108 -56 b 63 46 65 29 63 37 b 96 82 62 62 73 73 b 130 89 108 86 120 89 b 215 63 160 89 187 75 l 220 60 b 225 -35 220 29 222 -3 b 233 -151 229 -75 230 -114 z m 374 -151 b 383 -35 377 -114 379 -75 b 387 60 386 -3 387 29 l 393 63 b 478 89 420 75 448 89 b 511 82 488 89 500 86 b 544 46 534 73 546 62 b 537 17 544 37 543 29 b 374 -151 500 -56 439 -105 z',\n },\n accidentalQuarterToneSharpStein: {\n x_min: 0,\n x_max: 300,\n y_min: -338,\n y_max: 351,\n ha: 689,\n o: 'm 194 -487 b 225 -432 215 -469 223 -452 b 238 -232 229 -366 236 -298 b 377 -199 285 -220 331 -209 b 418 -164 397 -193 410 -181 b 432 -88 428 -138 432 -114 b 412 -42 432 -55 428 -42 b 389 -46 406 -42 399 -43 l 235 -85 b 233 -20 235 -63 233 -42 b 233 105 232 22 233 63 b 312 121 259 111 285 117 b 406 226 390 134 400 145 b 373 284 409 268 402 284 b 344 281 364 284 356 282 b 232 258 307 276 269 266 b 230 308 232 275 232 291 b 210 505 229 374 232 441 b 183 471 189 501 184 490 b 180 406 181 449 180 428 b 184 246 180 353 184 300 b 48 222 140 236 94 228 b 0 168 6 216 0 209 b 7 86 1 141 4 114 b 27 66 9 73 13 66 l 35 66 b 184 94 85 66 135 84 b 187 -1 184 62 186 30 b 190 -96 189 -33 190 -65 l 112 -114 b 35 -213 27 -132 35 -132 b 33 -253 35 -226 35 -240 b 49 -276 33 -269 37 -276 b 62 -275 52 -276 56 -276 l 186 -245 l 186 -256 b 179 -387 180 -300 177 -343 b 194 -487 180 -419 179 -454 z',\n },\n accidentalThreeQuarterTonesSharpStein: {\n x_min: -23,\n x_max: 388,\n y_min: -373,\n y_max: 445,\n ha: 818,\n o: 'm 114 -537 b 138 -475 137 -518 138 -495 b 147 -292 138 -413 144 -353 b 212 -278 168 -287 190 -282 b 243 -444 215 -333 225 -389 b 261 -467 248 -454 251 -465 b 281 -446 272 -469 276 -455 b 292 -347 292 -416 288 -384 b 288 -262 289 -320 288 -291 l 374 -245 b 376 -311 374 -266 374 -288 b 390 -456 379 -357 379 -405 b 416 -396 412 -436 415 -418 b 423 -287 420 -360 423 -323 b 422 -235 423 -269 423 -252 b 451 -229 432 -233 441 -232 b 547 -98 524 -215 547 -199 l 547 -89 b 521 -49 546 -59 540 -49 b 497 -52 516 -49 507 -49 b 418 -68 469 -56 444 -63 b 423 52 419 -29 422 12 b 426 140 425 81 425 109 b 495 160 449 145 472 153 b 552 219 526 170 546 189 b 559 279 557 240 553 262 b 530 341 559 324 552 341 b 490 331 520 341 507 338 b 432 311 471 324 452 318 b 449 552 436 392 442 471 b 452 588 451 563 452 575 b 446 622 452 599 451 611 b 436 641 444 629 448 641 b 418 628 428 641 420 636 b 409 602 413 621 410 611 b 386 297 396 501 390 399 b 297 274 356 288 327 281 b 291 403 295 317 294 360 b 274 550 288 452 284 501 b 259 569 271 564 265 569 b 240 559 253 569 248 563 b 230 537 232 554 230 546 l 230 488 b 233 369 230 448 232 409 b 236 261 236 333 238 297 b 156 245 210 255 183 251 b 154 396 154 295 154 346 b 150 416 154 403 153 410 b 140 438 145 423 150 438 l 138 438 b 118 413 128 436 118 428 b 112 354 118 393 114 374 b 109 238 109 315 109 276 b 49 226 89 233 69 230 b 3 163 16 222 3 202 b 7 91 3 138 9 114 b 29 62 7 69 13 62 b 39 63 32 62 35 63 b 104 73 60 66 82 71 b 101 -10 104 46 102 17 l 92 -132 l 10 -150 b -33 -204 -19 -157 -33 -170 b -19 -310 -32 -240 -19 -274 b -6 -324 -19 -321 -13 -324 b 6 -323 -1 -324 1 -324 b 82 -307 32 -317 58 -311 b 81 -376 82 -330 81 -353 b 114 -537 81 -431 94 -484 z m 294 -92 b 297 -37 295 -73 295 -56 b 300 49 300 -9 300 20 l 300 108 b 379 127 325 114 353 120 b 374 -76 376 59 374 -9 b 294 -92 347 -82 320 -86 z m 154 -120 b 157 20 154 -73 156 -26 b 158 82 158 40 158 62 b 230 95 183 86 206 89 b 225 0 229 63 226 32 b 217 -107 223 -35 220 -71 z',\n },\n accidentalBuyukMucennebFlat: {\n x_min: 1.8692317181955784,\n x_max: 287,\n y_min: -248,\n y_max: 432.4720949426819,\n ha: 680.4720949426819,\n o: 'm 410 128 b 302 239 403 199 363 239 b 259 232 289 239 275 236 b 199 207 239 226 219 216 l 197 206 l 197 243 l 197 251 b 347 317 248 272 298 295 b 376 347 360 324 372 334 b 389 435 387 376 393 405 b 348 454 384 462 377 465 b 202 387 300 432 251 409 b 203 408 203 395 203 402 l 203 431 b 347 490 252 451 300 469 b 376 517 360 495 372 505 b 389 599 387 546 393 572 b 348 616 384 625 377 628 l 203 556 b 196 593 202 569 199 582 b 179 622 193 603 193 622 l 177 622 b 150 588 161 621 150 608 b 147 533 150 570 148 552 b 29 488 108 517 69 503 b 3 455 12 482 3 472 b 12 353 1 422 9 389 b 145 408 56 372 101 389 b 145 363 145 392 145 377 l 29 315 b 3 281 12 310 3 298 b 12 170 1 245 9 209 l 141 226 b 138 166 140 206 138 186 b 114 -199 134 43 115 -76 b 130 -344 114 -246 117 -297 b 141 -357 132 -353 135 -357 b 158 -347 145 -357 151 -354 b 219 -301 177 -331 199 -315 b 413 69 346 -210 413 -88 b 410 128 413 89 413 108 z m 350 35 b 343 6 350 26 348 17 b 180 -163 308 -69 245 -117 b 189 -46 183 -125 184 -86 b 193 49 192 -14 193 17 l 199 52 b 284 78 226 63 253 78 b 317 71 294 78 305 75 b 350 35 340 62 351 50 z',\n },\n accidentalBakiyeFlat: {\n x_min: 1.8692317181955784,\n x_max: 287,\n y_min: -236,\n y_max: 444,\n ha: 680,\n o: 'm 141 -340 b 158 -330 145 -340 151 -337 b 219 -284 177 -314 199 -298 b 413 86 346 -193 413 -71 b 410 145 413 107 413 125 b 302 256 403 216 363 256 b 259 249 289 256 275 253 b 199 225 239 243 219 233 l 197 223 l 197 261 b 199 334 197 285 199 310 b 347 406 249 357 298 382 b 376 439 360 413 372 425 b 390 516 384 465 390 490 b 389 537 390 523 390 530 b 372 564 384 556 382 564 b 348 557 367 564 359 562 b 204 487 300 537 253 510 b 206 518 206 497 206 507 b 196 611 206 549 203 580 b 179 639 193 621 193 639 l 177 639 b 150 605 161 638 150 625 b 145 482 148 564 144 523 l 145 458 b 29 405 107 439 68 420 b 3 366 12 397 3 386 b 12 243 1 325 9 287 b 143 307 56 265 99 285 l 138 183 b 114 -181 134 60 114 -59 b 130 -327 114 -229 117 -279 b 141 -340 132 -336 135 -340 z m 180 -145 b 189 -29 183 -108 184 -69 b 193 66 192 3 193 35 l 199 69 b 284 95 226 81 253 95 b 317 88 294 95 305 92 b 350 52 340 79 351 68 b 343 23 350 43 348 35 b 180 -145 305 -50 245 -99 z',\n },\n accidentalKomaSharp: {\n x_min: 0,\n x_max: 300,\n y_min: -338,\n y_max: 351,\n ha: 689,\n o: 'm 194 -487 b 225 -432 215 -469 223 -452 b 238 -232 229 -366 236 -298 b 377 -199 285 -220 331 -209 b 418 -164 397 -193 410 -181 b 432 -88 428 -138 432 -114 b 412 -42 432 -55 428 -42 b 389 -46 406 -42 399 -43 l 235 -85 b 233 -20 235 -63 233 -42 b 233 105 232 22 233 63 b 312 121 259 111 285 117 b 406 226 390 134 400 145 b 373 284 409 268 402 284 b 344 281 364 284 356 282 b 232 258 307 276 269 266 b 230 308 232 275 232 291 b 210 505 229 374 232 441 b 183 471 189 501 184 490 b 180 406 181 449 180 428 b 184 246 180 353 184 300 b 48 222 140 236 94 228 b 0 168 6 216 0 209 b 7 86 1 141 4 114 b 27 66 9 73 13 66 l 35 66 b 184 94 85 66 135 84 b 187 -1 184 62 186 30 b 190 -96 189 -33 190 -65 l 112 -114 b 35 -213 27 -132 35 -132 b 33 -253 35 -226 35 -240 b 49 -276 33 -269 37 -276 b 62 -275 52 -276 56 -276 l 186 -245 l 186 -256 b 179 -387 180 -300 177 -343 b 194 -487 180 -419 179 -454 z',\n },\n accidentalKucukMucennebSharp: {\n x_min: -0.15206251809627475,\n x_max: 359,\n y_min: -420,\n y_max: 343,\n ha: 763,\n o: 'm 236 -605 b 262 -543 256 -583 261 -564 b 269 -423 268 -503 269 -464 b 266 -340 269 -396 268 -367 l 361 -318 b 405 -276 384 -312 399 -298 b 413 -189 412 -248 416 -219 b 395 -164 412 -171 409 -164 b 382 -166 392 -164 387 -164 b 264 -193 343 -176 304 -184 b 269 -102 265 -163 268 -132 b 454 -62 331 -89 392 -78 b 501 -23 477 -58 494 -45 b 517 62 511 6 517 33 b 487 112 517 95 513 112 b 471 111 482 112 477 112 b 274 66 406 95 340 81 b 276 138 275 91 276 114 b 350 154 301 144 325 148 b 402 203 377 160 396 176 b 412 284 408 230 412 258 b 392 311 412 302 406 311 b 372 308 386 311 379 310 b 287 291 343 301 314 297 l 295 405 b 298 441 297 416 298 428 b 292 475 298 452 297 464 b 282 494 289 482 294 494 b 264 481 274 494 266 490 b 255 455 259 474 256 464 b 239 282 248 397 243 340 b 148 268 209 278 179 274 b 62 164 62 252 62 253 l 62 132 b 79 108 60 117 65 108 l 86 108 l 230 130 b 229 92 230 118 229 105 b 228 56 228 79 228 68 b 66 20 173 43 120 32 b 0 -59 6 7 3 1 l 0 -138 b 14 -160 -1 -156 4 -160 b 27 -158 19 -160 23 -160 b 222 -112 92 -141 157 -127 b 220 -203 220 -143 220 -173 b 147 -217 196 -207 171 -213 b 89 -288 92 -228 89 -229 b 95 -347 85 -305 96 -325 b 112 -374 92 -366 98 -374 b 125 -373 117 -374 121 -374 l 220 -351 b 222 -458 220 -386 220 -422 b 236 -605 223 -504 225 -552 z',\n },\n accidentalKoron: {\n x_min: 0,\n x_max: 303,\n y_min: -462.4598053473055,\n y_max: 180,\n ha: 642.4598053473055,\n o: 'm 59 -665 b 72 -649 69 -662 72 -657 b 69 -626 72 -642 69 -634 b 69 -622 69 -625 69 -624 l 69 -600 b 55 -156 60 -456 68 -311 b 86 -170 66 -166 76 -170 b 112 -163 95 -170 104 -166 b 390 -35 204 -120 298 -78 b 436 -1 409 -27 436 -27 b 396 46 436 22 413 33 l 382 55 b 46 243 271 121 157 179 b 12 259 29 253 17 259 b 0 219 1 259 0 248 b 3 -372 0 22 3 -176 b 6 -616 3 -454 6 -536 b 59 -665 6 -638 40 -671 z m 55 199 b 363 24 156 141 258 84 b 55 -118 259 -24 160 -69 z',\n },\n accidentalSori: {\n x_min: 0,\n x_max: 434,\n y_min: -295,\n y_max: 325,\n ha: 620,\n o: 'm 194 -425 b 196 -409 194 -418 196 -413 b 194 -194 196 -337 196 -266 b 364 -127 251 -171 308 -150 b 361 -321 363 -192 364 -256 b 410 -387 360 -357 373 -377 b 413 -373 412 -382 413 -377 b 418 -114 418 -287 418 -200 l 418 -105 b 595 -35 477 -82 536 -59 b 625 0 612 -27 625 -22 b 593 48 624 23 618 39 l 419 117 b 423 370 419 202 423 285 b 426 403 423 382 426 393 b 418 436 426 415 425 426 b 384 468 409 449 399 468 b 369 448 370 468 369 459 b 369 436 369 444 369 441 l 369 428 l 369 423 b 367 138 369 328 367 233 l 353 143 l 192 207 l 192 367 b 173 406 192 383 184 396 b 151 422 167 413 160 422 b 144 420 148 422 147 422 b 137 403 138 416 137 410 l 137 392 l 137 229 b 33 271 102 243 68 256 b 13 276 26 274 19 276 b 0 262 6 276 0 272 b 35 199 1 239 0 212 l 138 160 b 140 -148 138 58 138 -45 b 56 -181 111 -158 84 -170 b 24 -215 35 -189 24 -199 b 29 -235 24 -220 26 -228 b 49 -253 35 -249 42 -253 b 78 -240 59 -253 69 -243 b 140 -216 98 -233 120 -225 l 140 -356 b 194 -425 140 -406 141 -406 z m 194 -125 b 193 138 194 -37 193 50 b 315 89 233 122 275 107 b 366 71 333 84 350 76 b 364 -58 366 27 366 -16 b 194 -125 308 -81 251 -104 z m 419 49 l 526 7 l 485 -10 l 419 -36 z',\n },\n articAccentAbove: {\n x_min: 0,\n x_max: 425,\n y_min: 0,\n y_max: 326,\n ha: 326,\n o: 'm 27 1 b 78 12 46 0 62 6 b 347 112 168 45 253 91 b 521 184 409 128 459 167 b 608 259 557 194 589 220 b 612 274 611 265 612 271 b 598 292 612 281 608 287 b 477 347 559 312 518 331 b 176 465 374 384 275 425 b 156 469 168 468 161 469 b 125 456 145 469 137 465 b 53 370 96 432 78 399 b 45 353 48 363 45 357 b 68 333 45 344 52 337 b 360 225 166 298 262 261 b 192 154 302 203 249 171 b 13 36 120 132 53 105 b 0 13 9 29 0 22 l 0 9 b 16 0 3 1 10 0 l 26 0 b 27 1 27 0 27 0 z',\n },\n articAccentBelow: {\n x_min: 0,\n x_max: 425,\n y_min: -326,\n y_max: 0,\n ha: 326,\n o: 'm 26 -469 l 27 -469 b 78 -458 46 -469 62 -464 b 347 -357 168 -426 253 -380 b 521 -285 409 -341 459 -302 b 608 -210 557 -276 589 -249 b 612 -196 611 -204 612 -200 b 598 -179 612 -189 608 -183 b 477 -122 559 -157 518 -138 b 176 -4 374 -85 275 -45 b 156 0 168 -1 161 0 b 125 -13 145 0 137 -4 b 53 -99 96 -37 78 -71 b 45 -117 48 -107 45 -112 b 68 -137 45 -125 52 -132 b 360 -245 166 -171 262 -209 b 192 -315 302 -266 249 -300 b 13 -433 120 -337 53 -366 b 0 -456 9 -442 0 -448 l 0 -461 b 16 -469 3 -468 10 -469 z',\n },\n articTenutoAbove: {\n x_min: 0.35192668236256364,\n x_max: 471.1238660564107,\n y_min: 0,\n y_max: 56,\n ha: 56,\n o: 'm 137 0 b 197 1 156 0 179 1 b 409 6 268 1 338 6 b 482 4 432 6 459 6 b 556 0 508 3 534 0 b 651 10 588 0 621 3 b 678 27 662 12 678 10 b 654 59 680 45 672 53 b 511 75 606 73 560 73 b 255 81 426 78 341 81 b 160 79 222 81 193 79 l 36 79 b 1 71 24 78 7 85 b 19 32 -3 56 9 43 b 45 16 26 24 36 20 b 137 0 76 3 108 0 z',\n },\n articTenutoBelow: {\n x_min: 0.35192668236256364,\n x_max: 471.1238660564107,\n y_min: -59,\n y_max: -3,\n ha: 56,\n o: 'm 137 -85 b 197 -84 156 -85 179 -84 b 409 -79 268 -84 338 -79 b 482 -81 432 -79 459 -79 b 556 -85 508 -82 534 -85 b 651 -75 588 -85 621 -82 b 678 -58 662 -73 678 -75 b 654 -26 680 -40 672 -32 b 511 -10 606 -12 560 -12 b 255 -4 426 -7 341 -4 b 160 -6 222 -4 193 -6 l 36 -6 b 1 -14 24 -7 7 0 b 19 -53 -3 -29 9 -42 b 45 -69 26 -60 36 -65 b 137 -85 76 -82 108 -85 z',\n },\n articStaccatoAbove: {\n x_min: 1.4151102965496913,\n x_max: 112,\n y_min: 0,\n y_max: 156,\n ha: 156,\n o: 'm 98 0 b 132 23 109 0 122 7 b 161 112 150 50 161 79 b 158 148 161 124 161 137 b 125 186 154 167 131 167 b 63 225 117 215 85 216 b 23 197 45 222 30 219 b 3 91 12 163 12 127 b 19 66 0 79 4 69 b 65 27 40 62 53 46 b 98 0 76 9 88 0 z',\n },\n articStaccatoBelow: {\n x_min: 1.4151102965496913,\n x_max: 112.08403222864916,\n y_min: -156,\n y_max: 0,\n ha: 156,\n o: 'm 132 -202 b 161 -112 151 -174 163 -145 b 158 -76 161 -101 161 -88 b 125 -39 153 -58 131 -58 b 63 0 115 -10 85 -9 b 23 -27 45 -3 30 -6 b 3 -134 12 -62 10 -98 b 19 -158 0 -145 4 -156 b 65 -197 40 -164 53 -179 b 98 -225 75 -216 88 -225 b 132 -202 109 -225 122 -217 z',\n },\n articStaccatissimoAbove: {\n x_min: 0,\n x_max: 139,\n y_min: 0,\n y_max: 411,\n ha: 411,\n o: 'm 104 0 b 144 115 143 29 138 75 b 197 423 158 217 180 320 b 200 454 199 433 200 444 b 181 540 200 482 193 513 b 112 592 167 573 141 592 b 55 567 92 592 72 585 b 0 490 32 546 3 527 l 0 484 b 27 279 14 416 14 347 b 84 20 43 193 52 104 b 96 0 86 13 92 6 z',\n },\n articStaccatissimoBelow: {\n x_min: 0,\n x_max: 139,\n y_min: -411,\n y_max: 0,\n ha: 411,\n o: 'm 88 -592 b 145 -567 108 -592 128 -585 b 200 -490 168 -546 197 -527 l 200 -484 b 173 -279 186 -416 186 -347 b 117 -20 157 -193 148 -104 b 104 0 114 -13 108 -6 l 96 0 b 56 -115 58 -29 62 -75 b 3 -423 42 -217 20 -320 b 0 -454 1 -433 0 -444 b 19 -540 0 -482 7 -513 b 88 -592 33 -573 59 -592 z',\n },\n articMarcatoAbove: {\n x_min: 0.04121419527862119,\n x_max: 396,\n y_min: 0,\n y_max: 328.0000000000001,\n ha: 328.0000000000001,\n o: 'm 477 0 b 510 13 488 0 500 6 b 570 124 546 40 563 81 b 547 183 570 147 560 166 b 356 422 487 265 405 330 b 346 442 354 429 350 436 l 346 444 b 318 465 340 456 330 464 l 312 469 b 274 449 294 480 284 461 b 242 413 262 438 253 425 b 56 196 177 343 112 274 b 1 56 26 154 13 105 b 27 20 -4 35 9 20 b 42 23 32 20 37 20 b 84 53 59 29 72 39 b 255 269 141 125 193 200 b 275 229 262 255 266 242 b 448 14 324 151 390 86 b 477 0 456 4 467 0 z',\n },\n articMarcatoBelow: {\n x_min: 0,\n x_max: 395.9587858047214,\n y_min: -328.0000000000001,\n y_max: 0,\n ha: 328.0000000000001,\n o: 'm 258 -469 b 297 -449 276 -480 287 -461 b 328 -413 308 -438 317 -425 b 514 -196 393 -343 458 -274 b 569 -56 544 -154 557 -105 b 543 -20 575 -35 562 -20 b 528 -23 539 -20 533 -20 b 487 -53 511 -29 498 -39 b 315 -269 429 -125 377 -200 b 295 -229 308 -255 304 -242 b 122 -14 246 -151 180 -86 b 94 0 114 -4 104 0 b 60 -13 82 0 71 -6 b 0 -124 24 -40 7 -81 b 23 -183 0 -147 10 -166 b 215 -422 84 -265 166 -330 b 225 -442 216 -429 220 -436 l 225 -444 b 252 -465 230 -456 240 -464 z',\n },\n fermataAbove: {\n x_min: -0.04550444040404433,\n x_max: 472,\n y_min: 2.015071727506986,\n y_max: 454,\n ha: 451.984928272493,\n o: 'm 39 10 b 78 108 66 37 71 73 b 163 311 92 181 111 252 b 284 423 199 353 239 392 b 373 458 312 444 340 454 b 433 431 395 458 410 446 b 603 153 530 361 596 276 b 595 121 603 144 595 131 l 595 88 b 602 50 596 75 589 55 b 639 73 619 43 631 60 b 651 102 645 82 648 92 b 667 194 660 132 662 163 b 680 278 671 222 672 248 b 560 567 680 386 638 481 b 396 654 508 625 452 649 b 291 632 364 654 325 644 b 161 526 235 613 200 566 b 4 249 85 446 26 357 b 4 174 0 222 -3 196 b 10 19 4 124 4 69 b 29 4 12 6 16 0 b 39 10 35 4 33 4 z m 338 37 b 370 40 350 36 357 36 b 380 75 387 40 380 43 b 389 94 382 79 382 85 b 356 132 389 111 374 122 b 269 154 328 147 300 156 b 225 125 252 154 228 157 b 261 48 222 81 232 56 b 338 37 287 40 312 40 z',\n },\n fermataBelow: {\n x_min: -0.310835055998654,\n x_max: 518.570567335755,\n y_min: -430,\n y_max: -0.9161449836506543,\n ha: 429.08385501634933,\n o: 'm 344 -615 b 500 -543 402 -602 452 -576 b 713 -253 605 -471 661 -364 b 746 -98 737 -204 750 -153 b 727 -59 744 -82 744 -59 b 688 -88 711 -59 694 -68 b 678 -109 687 -96 683 -102 b 562 -314 648 -183 611 -252 b 387 -439 516 -373 458 -416 b 328 -449 367 -446 347 -449 b 180 -386 274 -449 225 -423 b 69 -179 111 -330 69 -262 b 75 -121 69 -160 71 -141 b 84 -58 78 -101 84 -79 b 82 -39 84 -52 84 -45 b 68 -1 79 -26 82 -4 b 26 -32 49 0 33 -12 b 20 -52 24 -39 22 -45 b 0 -223 9 -107 -3 -161 b 141 -553 1 -348 27 -468 b 304 -619 192 -590 243 -619 b 344 -615 317 -619 330 -618 z m 415 -190 b 435 -157 429 -192 435 -184 b 308 -27 435 -86 379 -27 b 271 -46 287 -27 272 -35 b 269 -69 269 -55 269 -62 b 364 -183 269 -128 302 -170 z',\n },\n breathMarkComma: {\n x_min: 0,\n x_max: 148,\n y_min: 0,\n y_max: 275,\n ha: 275,\n o: 'm 120 0 b 187 78 156 20 174 48 b 213 209 206 121 213 164 b 206 294 213 238 210 265 b 140 390 200 337 171 367 b 122 396 134 395 128 396 b 68 382 105 396 85 384 b 46 379 60 382 53 382 b 0 328 12 369 0 357 b 1 311 0 323 1 317 b 30 210 4 275 22 243 b 66 167 39 179 46 167 b 94 171 73 167 82 168 b 143 180 109 174 124 180 b 160 179 148 180 154 180 b 120 66 124 145 120 107 b 120 0 120 45 121 23 z',\n },\n breathMarkUpbow: {\n x_min: 0,\n x_max: 254,\n y_min: 0,\n y_max: 595,\n ha: 595,\n o: 'm 233 0 b 256 48 251 14 253 30 b 272 183 264 92 265 138 b 311 455 289 274 295 364 b 350 716 327 541 341 628 b 366 815 354 749 366 782 b 359 857 366 829 363 842 b 327 815 334 852 330 832 b 302 674 315 769 310 721 b 248 357 288 567 269 462 b 225 226 240 314 242 268 b 210 251 212 232 213 243 b 69 721 163 408 117 564 b 32 835 58 760 53 801 b 20 851 29 841 27 851 b 14 850 19 851 16 851 b 0 828 6 847 0 838 l 0 825 b 12 765 1 804 7 785 b 194 125 73 552 132 338 b 233 0 206 84 213 42 z',\n },\n caesura: {\n x_min: 0,\n x_max: 565.5831864753837,\n y_min: -0.09016994374947417,\n y_max: 562.4481112129314,\n ha: 562.5382811566809,\n o: 'm 0 76 b 49 122 24 92 37 107 b 444 613 180 287 305 455 b 528 770 484 660 518 708 b 531 792 530 778 531 785 b 524 808 531 799 530 805 b 490 792 513 815 498 802 b 390 683 456 756 420 721 b 48 262 275 543 164 400 b 0 76 0 207 7 145 z m 226 1 b 248 13 238 -4 243 7 l 353 137 b 759 638 490 302 632 464 b 814 805 795 688 819 740 b 779 786 796 805 788 796 b 628 609 724 732 678 668 b 310 242 523 485 416 363 b 217 69 265 190 217 140 b 222 30 217 58 219 45 b 222 23 222 29 220 26 b 220 12 222 20 220 16 b 226 1 220 7 222 3 z',\n },\n caesuraCurved: {\n x_min: 0,\n x_max: 386,\n y_min: -10,\n y_max: 584,\n ha: 594,\n o: 'm 180 -14 b 246 14 213 -13 230 0 b 347 144 288 52 315 99 b 526 471 420 246 488 350 b 556 671 546 537 556 603 b 543 798 556 713 553 756 b 504 837 537 822 521 828 b 490 841 500 840 494 841 b 472 832 482 841 477 838 b 406 678 436 785 406 737 b 410 638 406 665 408 652 b 425 511 419 595 425 553 b 315 186 425 395 387 287 b 180 -14 271 122 228 58 z m 14 24 b 49 39 29 24 40 32 b 120 114 76 60 99 85 b 216 276 156 166 184 223 b 317 626 281 384 317 501 b 315 664 317 639 317 651 b 301 773 314 701 311 737 b 262 808 295 795 278 808 b 245 799 256 808 249 805 b 170 641 209 750 170 706 b 171 621 170 634 170 628 b 177 511 176 585 177 549 b 114 229 177 415 160 320 b 0 26 79 161 42 95 b 14 24 6 24 10 24 z',\n },\n restMaxima: {\n x_min: 0,\n x_max: 366,\n y_min: -255,\n y_max: 255,\n ha: 510,\n o: 'm 397 -367 b 504 -343 436 -367 468 -347 b 518 -318 516 -341 518 -330 b 527 -30 518 -217 527 -117 b 526 33 527 -7 527 13 l 526 301 b 501 350 526 323 520 341 b 428 367 477 361 452 367 b 374 359 410 367 393 364 b 357 333 361 354 357 347 b 356 91 357 252 356 171 l 356 30 b 340 -307 357 -82 346 -194 b 397 -367 337 -354 350 -367 z m 46 -357 b 58 -356 49 -357 53 -357 b 154 -333 91 -351 121 -338 b 173 -305 168 -330 173 -320 l 173 302 b 132 356 173 330 157 348 b 68 364 112 363 89 364 b 3 304 19 363 1 348 l 3 4 l 0 4 b 1 -302 0 -98 0 -200 b 46 -357 1 -331 16 -357 z',\n },\n restDoubleWhole: {\n x_min: 0,\n x_max: 122,\n y_min: 0,\n y_max: 249,\n ha: 249,\n o: 'm 43 0 b 58 1 48 0 52 0 b 124 20 81 6 102 17 b 176 96 173 27 176 58 b 173 220 174 138 173 179 b 176 304 173 248 176 276 b 140 353 176 331 163 346 b 95 359 125 356 111 359 b 32 346 73 359 52 354 b 0 315 20 340 0 337 b 1 243 0 291 1 268 l 1 174 l 4 174 l 4 48 b 43 0 4 16 17 0 z',\n },\n restWhole: {\n x_min: 0.8908513171538642,\n x_max: 500,\n y_min: -120,\n y_max: 14,\n ha: 134,\n o: 'm 356 -173 l 356 -171 l 642 -171 b 719 -115 680 -171 717 -145 b 720 -82 719 -104 720 -92 b 711 -20 720 -60 719 -40 b 672 17 704 0 694 10 b 649 20 664 20 657 20 b 605 17 634 20 621 17 b 92 19 433 17 262 17 b 29 7 69 20 49 12 b 9 -17 12 4 9 -6 b 10 -43 9 -26 10 -35 b 1 -84 10 -58 3 -72 b 76 -173 0 -147 7 -173 z',\n },\n restHalf: {\n x_min: 0,\n x_max: 518.3998530468286,\n y_min: 0,\n y_max: 162,\n ha: 162,\n o: 'm 98 0 l 556 0 b 665 1 592 0 629 0 b 746 82 720 3 743 29 b 736 174 749 114 740 144 b 670 232 729 215 708 232 b 570 229 636 232 603 229 b 356 233 498 229 426 233 l 73 233 b 0 179 19 233 0 220 b 1 154 0 171 0 164 b 6 95 4 135 6 115 b 98 0 3 27 29 0 z',\n },\n restQuarter: {\n x_min: -0.3784452492533808,\n x_max: 263,\n y_min: -415,\n y_max: 415,\n ha: 830,\n o: 'm 151 -596 b 164 -563 163 -589 161 -575 b 160 -546 164 -557 161 -552 b 124 -396 148 -495 135 -446 b 122 -380 122 -390 122 -384 b 199 -255 122 -331 158 -272 b 228 -256 209 -249 217 -253 b 324 -346 274 -271 298 -310 b 353 -369 331 -356 341 -369 b 360 -367 356 -369 357 -369 b 379 -336 373 -361 379 -348 l 377 -325 b 344 -232 372 -292 366 -258 b 249 -58 301 -180 278 -117 b 242 -36 245 -49 242 -42 b 258 -7 242 -26 248 -17 b 328 78 284 20 311 45 b 354 158 344 104 354 131 b 337 216 354 177 350 196 b 213 435 294 288 249 359 b 115 575 189 487 158 536 b 78 598 105 585 92 598 b 59 592 72 598 66 596 b 39 562 45 583 39 572 b 53 527 39 550 45 539 b 168 344 98 469 125 402 b 187 307 181 328 187 317 b 153 269 187 294 176 284 b 62 213 122 252 91 235 b 40 180 48 203 40 192 b 46 158 40 173 43 166 b 99 65 60 125 79 95 b 183 -79 131 20 160 -29 b 156 -86 173 -88 164 -85 b 0 -261 58 -99 -7 -173 b 96 -557 10 -366 49 -464 b 124 -585 102 -569 109 -580 b 145 -598 132 -588 138 -598 b 151 -596 147 -598 150 -598 z',\n },\n rest8th: {\n x_min: 0,\n x_max: 289,\n y_min: -260,\n y_max: 261,\n ha: 521,\n o: 'm 164 -374 b 212 -340 190 -373 203 -357 b 276 -190 238 -292 258 -242 b 410 285 333 -36 359 128 b 416 314 413 294 416 304 l 416 321 b 393 354 415 341 410 354 b 382 353 389 354 386 354 b 292 311 347 347 315 333 b 174 225 256 276 216 251 b 157 219 168 222 163 219 b 140 228 151 219 145 222 b 131 246 134 233 131 240 b 135 262 131 252 132 256 b 147 298 141 272 147 285 b 127 367 147 323 154 354 b 94 376 114 373 102 376 b 48 336 75 376 63 363 b 3 181 20 288 12 235 b 0 150 1 170 0 160 b 109 24 0 84 35 24 b 171 36 127 24 148 27 b 289 101 213 52 248 75 b 164 -374 256 -62 193 -213 z',\n },\n rest16th: {\n x_min: 0,\n x_max: 333,\n y_min: -328.283950617284,\n y_max: 244,\n ha: 572.2839506172841,\n o: 'm 209 -471 b 246 -458 222 -477 236 -468 b 307 -338 279 -425 300 -384 b 324 -226 312 -301 317 -262 b 428 161 350 -94 386 35 b 480 318 445 215 480 259 b 467 347 480 331 477 341 b 445 351 461 350 454 351 b 408 337 432 351 419 347 b 402 333 405 336 403 334 b 223 215 344 294 294 245 b 236 259 229 233 235 246 b 238 276 238 265 238 271 b 212 338 238 302 226 334 b 193 341 206 340 199 341 b 86 289 156 341 104 317 b 59 180 66 255 59 217 b 156 27 59 76 92 27 b 236 46 179 27 204 35 b 338 101 271 59 298 82 b 289 -49 312 49 302 0 b 196 -122 276 -99 235 -107 b 176 -114 187 -127 176 -127 l 176 -111 b 157 -53 177 -88 164 -72 b 69 -9 141 -7 101 -16 b 17 -48 43 -3 29 -27 b 0 -127 4 -73 0 -99 b 6 -186 0 -147 1 -167 b 82 -294 17 -262 37 -294 b 160 -276 102 -294 128 -289 b 219 -242 181 -268 203 -259 b 236 -230 223 -236 229 -230 b 243 -232 239 -230 240 -230 b 235 -275 248 -246 239 -261 b 202 -456 220 -334 202 -395 b 209 -471 202 -462 203 -468 z',\n },\n rest32nd: {\n x_min: 0,\n x_max: 347,\n y_min: -497.5023916875033,\n y_max: 483,\n ha: 980.5023916875033,\n o: 'm 177 -716 b 217 -690 194 -720 209 -704 b 233 -655 225 -680 230 -668 b 292 -390 253 -567 275 -480 b 361 -48 312 -275 336 -161 b 452 400 393 102 422 252 b 497 629 467 477 482 553 b 500 647 498 635 500 641 b 480 691 500 665 492 684 b 464 696 475 694 469 696 b 418 674 448 696 431 685 l 361 626 b 333 611 353 618 343 612 b 308 629 325 611 317 616 b 239 667 292 651 265 661 b 204 670 228 668 216 670 b 86 559 141 670 95 628 b 85 537 86 552 85 544 b 107 416 85 495 95 455 b 161 372 114 389 134 372 b 174 373 166 372 170 372 b 226 383 192 374 209 377 b 387 478 285 402 330 444 b 364 386 379 444 364 415 b 276 271 364 323 320 298 b 265 266 272 268 268 266 b 252 276 261 266 256 269 b 143 333 229 311 186 333 b 107 327 130 333 118 330 b 43 243 62 314 46 291 b 58 145 43 210 52 179 b 150 63 68 92 99 63 b 315 132 213 63 259 98 b 266 -58 297 63 281 4 b 207 -101 259 -91 230 -96 b 186 -66 186 -107 199 -75 b 180 -50 181 -63 183 -55 b 101 -3 160 -23 135 -3 b 9 -66 59 -3 20 -32 b 0 -118 3 -84 0 -101 b 10 -196 0 -144 6 -170 b 104 -287 20 -256 52 -287 b 137 -282 114 -287 125 -287 b 184 -269 151 -281 171 -269 b 196 -275 190 -269 193 -271 b 199 -287 197 -278 199 -282 b 184 -343 199 -304 189 -325 b 181 -348 184 -346 183 -347 b 134 -595 158 -429 131 -508 b 156 -677 134 -624 150 -648 b 177 -716 158 -693 160 -713 z',\n },\n rest64th: {\n x_min: 0,\n x_max: 428,\n y_min: -720,\n y_max: 473.6797408388932,\n ha: 1193.6797408388932,\n o: 'm 200 -1037 b 229 -1012 215 -1037 222 -1025 b 238 -984 233 -1004 236 -994 b 282 -780 248 -914 265 -848 b 386 -369 317 -644 354 -507 b 491 104 422 -212 451 -53 b 600 541 528 249 550 399 b 616 629 611 570 616 599 b 600 680 616 648 615 671 b 550 665 586 687 566 677 b 480 618 527 649 501 635 b 464 611 474 613 468 611 b 448 622 458 611 454 615 b 366 662 425 651 397 662 b 331 658 354 662 343 661 b 242 572 285 647 253 619 b 236 528 239 557 236 543 b 266 400 236 484 251 442 b 325 373 274 377 301 373 b 436 409 366 373 403 383 l 494 452 b 474 360 485 416 474 389 b 383 248 474 297 435 269 b 320 328 377 288 351 310 b 276 341 305 337 291 341 b 186 269 235 341 194 311 b 181 230 183 256 181 243 b 187 153 181 204 186 179 b 279 63 192 86 233 63 b 304 65 288 63 295 63 b 416 115 344 72 379 92 b 387 -14 406 69 397 27 b 320 -95 380 -52 369 -86 b 318 -79 320 -89 320 -84 b 223 0 305 -29 271 0 b 122 -81 171 0 135 -30 b 118 -127 120 -96 118 -112 l 118 -196 b 137 -242 118 -215 125 -229 b 209 -275 157 -266 181 -275 b 249 -269 222 -275 235 -274 b 318 -248 272 -264 294 -255 b 281 -390 315 -301 292 -344 b 276 -400 279 -393 279 -397 b 259 -420 272 -408 266 -416 b 246 -429 255 -425 251 -429 b 233 -415 242 -429 238 -426 b 176 -359 225 -389 200 -372 b 121 -346 158 -348 140 -346 b 14 -408 73 -346 27 -370 b 0 -498 4 -438 0 -468 b 6 -564 0 -520 3 -543 b 91 -635 12 -611 45 -635 b 131 -629 104 -635 117 -634 b 223 -590 163 -622 190 -603 b 166 -824 203 -671 189 -747 b 148 -912 157 -852 148 -881 b 156 -955 148 -926 150 -940 b 177 -1008 161 -972 170 -991 b 200 -1037 181 -1020 183 -1037 z',\n },\n rest128th: {\n x_min: 0.6717818579024267,\n x_max: 491,\n y_min: -711,\n y_max: 719,\n ha: 1430,\n o: 'm 233 -1015 b 271 -956 256 -1002 266 -981 l 314 -723 b 393 -350 337 -598 366 -474 b 543 312 442 -128 492 91 b 687 841 583 490 635 665 b 707 958 698 880 707 919 b 706 986 707 968 707 976 b 688 1025 704 999 704 1024 b 670 1027 683 1025 677 1027 b 629 1007 655 1027 639 1022 b 559 945 613 981 586 968 b 541 1004 553 968 559 991 b 456 1035 516 1024 488 1035 b 419 1030 444 1035 431 1034 b 344 953 379 1018 353 995 b 340 900 341 936 340 917 b 341 847 340 881 341 864 b 380 779 340 815 354 793 b 464 763 406 765 435 762 b 592 814 510 763 549 786 b 546 660 575 757 556 710 b 480 585 537 619 517 598 b 478 599 480 590 478 595 b 386 678 472 641 428 678 b 294 612 343 678 304 651 b 279 477 282 567 278 521 b 363 395 281 428 317 395 b 380 396 369 395 374 395 b 488 436 416 403 449 419 b 384 233 469 357 468 275 b 359 291 373 252 377 276 b 282 318 337 310 310 318 b 181 264 243 318 203 298 b 154 107 153 216 154 161 b 242 6 154 42 187 6 b 278 10 253 6 265 7 b 408 88 330 22 366 55 b 387 -1 400 56 393 27 b 301 -112 379 -55 354 -94 b 289 -65 297 -95 302 -79 b 219 -32 269 -42 245 -32 b 183 -37 207 -32 196 -35 b 112 -109 144 -46 121 -71 b 105 -219 104 -145 108 -183 b 186 -315 101 -276 134 -315 b 230 -307 199 -315 215 -312 b 324 -256 264 -295 292 -275 b 180 -491 323 -383 266 -471 b 183 -459 180 -480 180 -469 b 184 -442 184 -454 184 -448 l 184 -436 b 135 -369 184 -403 170 -383 b 102 -363 125 -364 114 -363 b 29 -399 73 -363 45 -376 b 1 -556 -4 -448 6 -503 b 109 -670 -4 -625 43 -670 b 140 -667 118 -670 130 -668 b 253 -616 180 -658 213 -638 b 238 -688 248 -644 242 -665 b 192 -959 220 -779 192 -867 b 193 -992 192 -971 192 -981 b 210 -1024 194 -1014 199 -1024 b 233 -1015 216 -1024 223 -1021 z',\n },\n dynamicPiano: {\n x_min: -49,\n x_max: 326.5019318364244,\n y_min: -142,\n y_max: 515,\n ha: 657,\n o: 'm -56 -204 b -42 -202 -52 -204 -46 -203 b -19 -194 -35 -202 -26 -197 b 147 -138 35 -170 91 -151 b 249 -58 194 -127 223 -95 b 262 -29 255 -50 262 -39 b 258 -17 262 -24 261 -20 b 232 -7 252 -10 242 -7 b 210 -12 225 -7 217 -9 b 125 -40 184 -23 157 -30 b 183 140 153 19 171 79 b 251 167 207 144 230 153 b 469 518 383 262 480 382 b 357 687 472 626 420 687 b 315 678 344 687 330 684 b 204 600 279 664 240 634 b 210 704 206 635 209 670 b 215 721 212 710 215 716 b 206 733 215 727 212 730 b 180 742 197 736 189 742 b 164 734 176 742 170 740 b 1 575 108 684 36 645 b -7 557 -1 569 -7 563 b -6 553 -7 556 -7 554 b 7 547 -3 547 3 547 l 17 547 b 82 575 43 547 59 567 l 82 452 b 56 46 82 317 81 180 b 17 -66 49 7 46 -36 b -62 -173 -13 -99 -37 -135 b -71 -192 -66 -179 -71 -184 b -68 -199 -71 -193 -69 -196 b -56 -204 -65 -203 -60 -204 z m 196 258 b 197 266 197 261 197 264 b 200 510 200 347 199 429 b 233 543 210 521 222 533 b 281 560 249 554 266 560 b 340 503 310 560 333 540 b 344 461 343 488 344 474 b 321 323 344 413 333 369 b 268 272 315 300 295 281 b 196 258 245 265 220 261 z',\n },\n dynamicMezzo: {\n x_min: -18,\n x_max: 559,\n y_min: -50,\n y_max: 365,\n ha: 415,\n o: 'm 43 -71 b 160 19 86 -71 143 -26 b 230 264 189 99 200 184 b 282 363 243 297 259 327 b 287 320 285 347 287 333 b 284 279 287 305 285 292 l 249 -12 b 275 -43 248 -29 245 -43 b 395 45 321 -43 389 3 b 462 271 406 124 436 197 b 523 387 475 310 490 348 l 523 346 b 504 130 521 274 513 202 b 501 81 501 114 501 98 b 510 3 501 55 504 29 b 580 -72 521 -48 543 -72 b 625 -63 593 -72 608 -69 b 789 50 690 -43 744 -3 b 805 72 795 56 805 63 b 798 85 805 76 802 81 b 778 94 792 91 785 94 b 755 85 770 94 763 91 l 693 40 b 675 33 685 36 680 33 b 658 52 668 33 662 39 b 645 144 651 82 645 112 b 658 448 641 246 660 346 b 606 507 658 485 638 507 b 583 504 599 507 592 505 b 495 446 547 497 521 471 b 420 373 471 423 448 399 b 413 458 418 406 418 432 b 361 507 408 490 386 507 b 320 491 347 507 333 501 b 160 307 256 444 207 382 l 160 337 b 174 488 160 387 174 438 b 156 521 174 501 173 513 b 137 526 148 524 143 526 b 109 513 127 526 118 520 b -16 399 66 477 23 439 b -26 383 -20 395 -26 389 l -26 379 b -14 370 -24 372 -20 370 b -6 372 -12 370 -9 372 b 19 376 4 374 12 376 b 36 359 32 376 36 370 b 30 330 36 350 35 341 l 30 323 b 9 -35 23 203 17 85 b 43 -71 6 -65 19 -71 z',\n },\n dynamicForte: {\n x_min: -144,\n x_max: 311.30112136775,\n y_min: -115.3876295915697,\n y_max: 504,\n ha: 619.3876295915697,\n o: 'm -101 -166 b 173 76 7 -153 150 -30 b 206 344 192 164 202 253 b 268 338 226 343 246 341 b 384 395 317 333 353 361 b 397 419 393 405 397 412 b 367 442 397 429 387 436 b 350 444 361 444 356 444 b 206 455 302 449 255 454 l 206 474 b 202 540 204 495 202 518 b 209 593 202 557 203 576 b 236 624 215 613 225 624 b 265 612 245 624 253 619 b 308 552 287 596 302 577 b 336 533 312 534 323 533 b 448 611 366 533 444 583 b 399 696 452 648 423 671 b 382 706 395 700 387 703 b 308 726 357 720 333 726 b 207 684 272 726 239 711 b 60 455 135 622 60 560 l 10 455 b -23 448 -1 455 -13 454 b -102 372 -55 426 -76 397 b -109 357 -108 367 -109 361 b -95 347 -109 353 -105 348 b -63 346 -84 346 -73 346 b 0 344 -43 344 -22 344 l 63 344 b 53 186 63 291 59 239 b 23 0 46 124 42 60 b -35 -60 10 -42 -6 -60 b -73 -52 -45 -60 -58 -58 b -91 -48 -79 -49 -85 -48 b -109 -53 -96 -48 -102 -49 b -199 -124 -143 -72 -168 -99 b -207 -137 -203 -128 -207 -132 b -194 -148 -207 -141 -203 -145 b -101 -166 -164 -160 -132 -168 z',\n },\n dynamicRinforzando: {\n x_min: -75,\n x_max: 322.0960720195126,\n y_min: -90,\n y_max: 325,\n ha: 415,\n o: 'm 23 -130 b 40 -125 27 -130 33 -128 b 128 -9 81 -114 125 -53 b 145 200 132 62 141 130 b 148 238 147 212 148 225 b 308 321 184 291 245 321 b 363 314 325 321 344 318 b 377 310 369 312 373 310 b 384 311 380 310 382 310 b 464 415 410 317 464 389 b 446 433 465 429 455 429 b 390 445 428 441 409 445 b 305 429 361 445 334 438 b 167 346 252 413 202 393 b 153 325 163 338 158 333 b 148 438 154 363 151 399 b 121 468 147 456 134 468 b 101 458 115 468 108 465 b -63 310 46 409 -16 367 b -108 240 -78 289 -98 271 b 32 330 -50 256 -13 297 b 37 304 37 320 37 312 l 37 292 b 10 -101 27 161 20 30 b 23 -130 9 -120 12 -130 z',\n },\n dynamicSforzando: {\n x_min: 0,\n x_max: 296,\n y_min: 0,\n y_max: 379,\n ha: 379,\n o: 'm 151 0 b 174 1 160 0 166 0 b 392 158 272 14 346 71 b 405 207 400 174 405 190 b 359 287 405 236 389 265 b 261 325 328 308 294 315 b 168 413 216 340 181 366 b 166 426 167 418 166 423 b 176 438 166 432 167 436 b 199 441 183 441 190 441 b 310 393 238 441 295 422 b 334 370 317 376 325 370 b 363 386 343 370 353 379 b 422 445 386 402 408 420 b 426 458 425 449 426 454 b 422 469 426 462 425 465 b 274 546 395 518 333 546 b 161 503 232 546 190 531 b 86 405 132 472 108 439 b 71 347 75 387 71 367 b 112 256 71 312 85 279 b 209 215 141 232 176 226 b 284 168 238 206 266 197 b 300 131 291 157 300 144 b 298 120 300 127 298 122 b 278 107 294 109 285 108 b 262 108 271 107 266 108 l 259 108 b 114 157 200 107 156 125 b 96 181 104 163 96 170 l 96 184 b 102 202 96 190 102 196 b 96 209 102 204 101 207 b 63 194 82 215 72 204 b 7 109 42 168 26 138 b 0 86 3 101 0 94 b 13 60 0 78 4 68 b 151 0 53 23 101 0 z',\n },\n dynamicZ: {\n x_min: -42.73880183193087,\n x_max: 331,\n y_min: 0,\n y_max: 328,\n ha: 328,\n o: 'm -45 0 b -6 16 -32 0 -17 10 b 3 20 -3 16 0 19 b 144 60 49 48 96 60 b 284 22 190 60 238 46 b 348 4 305 10 327 4 b 461 75 393 4 435 30 b 468 91 464 81 467 86 b 456 104 468 95 465 99 b 287 173 402 131 348 167 b 239 176 271 174 255 176 b 168 174 217 176 194 174 b 367 340 236 236 298 294 b 459 423 402 363 432 392 b 477 454 467 431 475 442 b 474 462 477 456 475 459 b 454 472 469 469 462 472 b 432 468 446 472 439 469 b 356 448 406 461 380 455 b 210 422 307 433 258 422 b 109 442 177 422 144 428 b 94 445 104 444 99 445 b 69 433 85 445 76 442 b 27 390 56 419 39 406 b -9 343 16 373 -17 357 b 63 311 3 320 36 314 l 78 311 b 132 307 95 308 114 307 b 240 314 168 307 203 311 l 193 271 b -37 50 117 196 19 145 b -59 7 -46 36 -69 20 b -45 0 -55 3 -50 0 z',\n },\n ornamentTrill: {\n x_min: 1,\n x_max: 551,\n y_min: -18,\n y_max: 539,\n ha: 557,\n o: 'm 321 612 b 190 602 278 605 235 605 l 190 638 b 187 693 190 652 190 667 b 161 776 184 717 193 776 b 137 747 150 776 137 766 b 130 654 135 716 131 685 l 130 596 l 52 588 b 4 539 23 585 7 570 b 1 477 3 530 1 500 b 3 448 1 461 3 448 l 3 452 b 53 432 6 436 23 432 b 134 435 75 432 102 433 b 151 117 138 328 147 223 b 170 13 153 82 157 46 b 209 -26 179 -10 193 -26 b 222 -22 213 -26 217 -24 b 269 -17 233 -16 253 -27 b 343 135 325 19 346 66 b 343 158 343 147 344 147 b 323 192 341 171 337 187 b 291 176 311 194 300 184 l 264 148 b 229 131 261 145 238 131 b 212 170 209 131 213 154 b 194 438 203 259 199 348 l 272 442 b 284 452 276 441 279 441 b 305 462 287 461 295 462 l 312 462 b 346 477 325 462 340 464 b 366 560 357 503 366 531 b 321 612 366 598 356 618 z m 759 588 b 711 560 749 592 733 570 b 588 500 671 541 631 521 b 583 533 586 514 586 524 b 560 576 577 549 577 572 b 517 550 541 582 528 564 b 416 423 482 508 452 462 b 382 353 392 397 384 370 b 387 305 380 341 386 318 b 392 275 389 295 392 285 b 409 243 393 262 393 243 b 431 262 419 243 425 255 b 521 373 459 298 488 333 b 523 354 521 366 523 360 b 520 337 523 346 521 340 b 508 295 513 323 508 310 b 530 102 508 279 524 122 b 549 66 533 88 530 66 b 577 99 563 66 572 84 b 580 131 580 109 580 121 l 580 302 b 600 347 580 318 582 337 b 701 392 632 364 665 384 b 793 518 785 409 793 435 b 759 588 793 559 785 576 z',\n },\n ornamentTurn: {\n x_min: 0,\n x_max: 574,\n y_min: 0,\n y_max: 312,\n ha: 312,\n o: 'm 651 0 b 816 132 727 0 796 46 b 827 223 822 163 827 193 b 808 340 827 262 821 301 b 665 449 785 408 729 449 b 636 446 655 449 647 448 b 589 384 600 441 586 422 l 602 300 b 611 285 603 291 605 285 b 621 288 613 285 616 287 b 655 295 632 294 644 295 b 711 284 674 295 693 289 b 773 209 740 275 773 232 b 697 156 773 184 734 160 b 664 154 685 154 675 154 b 579 168 635 154 608 158 b 455 242 533 186 495 213 b 261 400 387 291 331 354 b 160 432 225 422 190 432 b 20 328 98 432 49 392 b 0 229 6 295 0 262 b 30 71 0 176 14 122 b 144 3 43 29 96 3 b 168 6 153 3 160 4 b 248 122 233 20 248 39 b 246 147 248 124 248 135 b 226 177 243 164 239 177 b 206 170 220 177 215 174 b 144 154 186 158 166 154 b 79 170 122 154 101 160 b 53 202 62 179 53 189 b 60 228 53 209 55 217 b 161 281 81 261 120 281 b 183 279 168 281 176 281 b 325 190 243 269 284 229 b 572 16 402 124 475 53 b 651 0 598 6 625 0 z',\n },\n ornamentTurnSlash: {\n x_min: 0,\n x_max: 574,\n y_min: -106,\n y_max: 405,\n ha: 511,\n o: 'm 441 -153 b 456 -60 455 -118 456 -89 b 455 81 455 -14 455 33 b 572 14 491 55 530 30 b 651 -1 598 4 625 -1 b 816 131 727 -1 796 45 b 827 222 822 161 827 192 b 808 338 827 261 821 300 b 665 448 785 406 729 448 b 636 445 655 448 647 446 b 589 383 600 439 586 420 l 602 298 b 611 284 603 289 605 284 b 621 287 613 284 616 285 b 655 294 632 292 644 294 b 711 282 674 294 693 288 b 773 207 740 274 773 230 b 697 154 773 183 734 158 b 664 153 685 153 675 153 b 579 167 635 153 608 157 b 455 240 533 183 495 212 b 454 242 455 240 455 242 l 454 337 b 452 488 454 386 452 439 b 433 570 452 517 451 546 b 425 583 431 575 431 583 l 422 583 b 403 566 415 582 408 573 b 402 546 400 560 402 553 l 397 287 b 261 399 353 325 310 366 b 160 431 225 420 190 431 b 20 327 98 431 48 390 b 0 228 6 294 0 261 b 30 69 0 174 14 121 b 144 1 43 27 96 1 b 168 4 153 1 160 3 b 248 121 233 19 248 37 b 246 145 248 122 248 134 b 226 176 243 163 239 176 b 206 168 220 176 215 173 b 144 153 186 157 166 153 b 79 168 122 153 101 158 b 53 200 62 177 53 187 b 60 226 53 207 55 216 b 161 279 79 259 120 279 b 183 278 168 279 176 279 b 325 189 243 266 282 226 b 395 130 348 168 372 148 b 393 71 393 109 393 89 b 441 -153 390 -6 402 -78 z',\n },\n ornamentMordent: {\n x_min: 0,\n x_max: 700,\n y_min: 0,\n y_max: 497,\n ha: 497,\n o: 'm 513 0 b 528 39 526 14 527 27 b 531 72 531 50 531 60 b 528 138 531 94 528 117 l 528 347 b 552 359 537 354 544 359 b 579 338 560 359 569 353 b 674 217 609 297 639 255 b 719 190 690 200 704 190 b 759 215 732 190 744 197 b 940 395 815 279 877 337 b 1001 490 968 422 986 455 b 1008 513 1004 495 1008 505 b 1002 524 1008 517 1007 521 b 968 516 994 530 978 524 b 960 508 965 513 963 510 b 798 356 900 464 848 410 b 778 341 791 347 783 341 b 757 354 772 341 765 346 b 661 475 720 392 690 432 b 611 517 644 504 629 517 b 563 498 598 517 583 511 b 527 471 550 490 539 481 l 527 570 b 492 716 526 619 523 671 b 472 677 480 704 472 694 b 465 399 474 585 468 491 b 439 366 456 387 448 376 b 384 320 415 336 399 320 b 330 367 369 320 354 336 b 325 376 328 369 327 373 b 226 490 291 413 265 456 b 189 505 213 500 202 505 b 157 491 177 505 167 500 b 0 229 75 420 0 346 b 1 202 0 220 0 212 b 22 215 12 203 16 209 b 124 327 55 252 89 289 b 147 343 132 337 140 343 b 171 323 156 343 164 336 b 266 197 196 276 232 236 b 337 157 291 170 314 157 b 410 207 361 157 386 174 b 461 274 428 229 444 252 b 462 166 461 238 461 202 b 513 0 465 108 487 55 z',\n },\n ornamentShortTrill: {\n x_min: 0,\n x_max: 747,\n y_min: 0,\n y_max: 243,\n ha: 243,\n o: 'm 379 0 b 428 14 395 0 410 4 b 474 56 445 26 461 39 b 552 157 500 89 526 122 b 566 168 556 163 560 168 b 575 157 569 168 572 166 b 664 36 592 107 628 72 b 733 1 685 13 710 1 b 802 35 757 1 780 13 b 1007 249 871 105 940 177 b 1067 324 1028 272 1054 295 b 1076 340 1068 330 1076 334 b 1073 346 1076 341 1076 343 b 1057 350 1068 348 1063 350 b 1047 347 1053 350 1050 350 b 1001 310 1031 336 1015 324 l 857 157 b 844 143 852 153 848 143 b 835 150 841 143 838 144 b 757 242 815 186 780 209 b 685 298 739 268 713 284 b 641 310 670 305 655 310 b 590 288 625 310 608 304 b 497 179 554 256 527 215 b 480 164 490 170 485 164 b 462 179 474 164 469 168 b 372 295 436 220 405 258 b 278 344 346 324 312 344 b 199 310 252 344 226 334 b 92 196 161 274 128 233 b 0 24 46 148 23 89 b 42 48 22 27 32 37 b 156 168 84 85 114 132 b 196 192 174 184 186 192 b 228 158 206 192 215 181 b 312 36 252 114 282 75 b 379 0 331 12 354 0 z',\n },\n ornamentTremblement: {\n x_min: 0,\n x_max: 982.17691453624,\n y_min: 0,\n y_max: 224,\n ha: 224,\n o: 'm 0 0 b 63 36 30 12 48 23 b 157 124 94 66 125 94 b 177 135 164 131 170 135 b 196 122 183 135 189 131 b 268 40 217 94 245 68 b 323 6 288 16 304 6 b 369 20 336 6 350 10 b 412 53 384 29 399 40 b 501 145 442 84 472 114 b 523 158 508 154 516 158 b 543 145 528 158 536 154 b 641 45 576 112 608 78 b 698 17 658 27 677 17 b 729 23 708 17 719 20 b 804 65 756 32 780 46 b 904 154 837 95 871 124 b 920 163 910 160 916 163 b 936 153 924 163 930 160 b 1024 60 965 121 996 92 b 1112 13 1053 29 1080 13 b 1184 39 1135 13 1158 22 b 1359 194 1248 84 1305 138 b 1413 301 1388 223 1403 261 b 1404 323 1417 315 1413 323 b 1391 320 1400 323 1395 321 b 1344 294 1375 314 1358 307 b 1224 186 1305 258 1269 216 b 1194 173 1212 179 1202 173 b 1165 193 1184 173 1175 179 b 1096 271 1145 222 1122 248 b 1001 318 1061 302 1031 318 b 903 268 969 318 937 301 b 806 186 871 239 841 210 b 782 174 796 179 789 174 b 756 193 773 174 765 180 b 652 291 729 232 693 266 b 596 308 634 302 615 308 b 530 278 573 308 552 298 l 415 168 b 393 157 408 161 400 157 b 373 171 387 157 380 161 b 305 245 353 197 330 222 b 248 276 285 266 266 278 b 189 245 229 276 210 266 b 81 144 156 209 120 174 b 0 0 33 109 26 56 z',\n },\n ornamentPrecompAppoggTrill: {\n x_min: -0.11067192132025548,\n x_max: 1066,\n y_min: -50,\n y_max: 533.1706452421108,\n ha: 583.1706452421108,\n o: 'm 187 -46 b 213 -14 197 -37 204 -26 b 285 151 251 36 266 94 b 304 189 294 177 297 189 b 337 168 311 189 320 181 b 458 33 386 131 415 76 b 495 12 472 19 484 12 b 531 40 508 12 518 22 b 580 168 557 79 569 124 b 622 235 592 213 603 235 b 683 194 636 235 655 222 b 838 26 737 140 791 86 b 919 -33 860 -1 881 -39 b 984 53 960 -27 971 19 b 1022 156 998 86 1008 122 b 1054 190 1032 179 1041 190 b 1089 167 1063 190 1074 183 b 1208 32 1129 122 1171 78 b 1244 10 1221 17 1231 10 b 1273 22 1253 10 1263 14 b 1496 206 1352 78 1427 137 b 1535 310 1526 236 1535 272 b 1531 359 1535 325 1534 343 b 1496 343 1515 360 1506 351 l 1309 192 b 1269 167 1289 176 1279 167 b 1234 199 1260 167 1251 177 b 1122 324 1200 243 1168 289 b 1074 344 1106 337 1089 344 b 1014 301 1051 344 1030 328 b 952 144 985 252 971 197 b 933 121 946 128 940 121 b 910 137 927 121 920 125 b 850 210 888 161 870 186 b 687 369 799 266 750 325 b 631 390 665 383 647 390 b 567 327 602 390 580 369 b 527 199 554 284 543 242 b 508 168 520 179 514 168 b 482 192 503 168 495 177 b 353 328 444 240 405 292 b 312 343 338 338 324 343 b 266 297 292 343 276 327 b 204 125 248 239 232 180 b 143 79 193 102 173 79 b 92 122 117 79 105 102 b 81 154 86 131 84 143 b 48 423 59 242 50 333 b 45 544 46 464 45 504 b 53 730 45 606 48 668 b 40 768 55 744 52 766 b 13 730 19 770 14 747 b 0 514 7 658 -1 586 b 26 122 3 383 6 252 b 75 -36 35 66 40 10 b 134 -72 92 -59 112 -72 b 187 -46 151 -72 170 -63 z',\n },\n ornamentPrecompSlideTrillDAnglebert: {\n x_min: 0,\n x_max: 1088,\n y_min: -380,\n y_max: 252,\n ha: 632,\n o: 'm 560 -539 b 439 -481 527 -497 484 -485 b 354 -461 409 -478 380 -477 b 131 -154 236 -389 161 -285 b 124 -98 127 -135 124 -117 b 196 55 124 -40 148 10 b 308 99 230 86 268 99 b 399 81 337 99 367 92 b 514 22 441 66 477 43 b 619 -30 567 -9 590 -30 b 719 17 642 -30 670 -16 b 861 131 769 52 818 88 b 899 150 874 144 887 150 b 936 117 913 150 926 138 b 965 43 948 94 956 68 b 1007 -1 973 24 978 -1 b 1048 30 1025 -1 1037 16 b 1070 65 1057 40 1064 52 b 1110 148 1084 92 1096 121 b 1145 190 1120 164 1120 190 b 1191 153 1169 192 1179 168 b 1256 29 1218 115 1231 68 b 1292 1 1267 10 1277 1 b 1320 10 1300 1 1309 4 b 1369 48 1339 19 1355 33 b 1515 196 1418 96 1464 148 b 1567 343 1558 238 1567 287 b 1555 363 1565 357 1562 363 b 1539 356 1551 363 1547 360 b 1433 268 1502 330 1466 301 b 1335 171 1401 236 1374 199 b 1310 163 1325 166 1318 163 b 1286 183 1302 163 1293 168 b 1218 311 1264 226 1247 272 b 1164 351 1200 337 1182 351 b 1110 308 1146 351 1128 337 b 1031 176 1084 265 1058 219 b 1015 161 1025 166 1021 161 b 999 179 1009 161 1005 167 b 955 279 985 213 973 248 b 913 307 943 300 930 307 b 887 302 904 307 896 305 b 852 281 874 298 863 291 b 693 167 804 236 747 204 b 612 140 667 150 639 140 b 549 157 592 140 570 145 b 403 220 503 181 452 202 b 271 248 360 236 315 248 b 179 229 239 248 209 242 b 0 -29 65 180 0 85 b 9 -104 0 -53 3 -78 b 397 -526 56 -317 183 -464 b 505 -547 432 -536 468 -547 b 560 -539 524 -547 541 -544 z',\n },\n ornamentPrecompSlideTrillBach: {\n x_min: 0,\n x_max: 1185,\n y_min: -380,\n y_max: 465,\n ha: 845,\n o: 'm 624 -544 b 642 -528 638 -543 642 -537 b 639 -514 642 -524 642 -520 b 590 -444 629 -487 609 -467 b 523 -413 573 -422 553 -410 b 498 -415 514 -415 507 -415 b 399 -389 464 -415 431 -405 b 89 -157 281 -330 176 -255 b 72 -117 78 -144 72 -131 b 73 -101 72 -111 72 -107 b 187 186 91 3 147 91 b 246 230 200 216 222 230 b 300 209 262 230 281 223 b 456 48 359 163 403 101 b 540 -10 494 10 518 -10 b 625 59 566 -10 589 13 b 690 148 648 88 668 118 b 711 167 697 160 704 167 b 733 153 719 167 724 163 b 844 14 769 105 808 60 b 903 -42 873 -23 886 -42 b 973 -1 919 -42 937 -27 b 1008 33 986 7 996 20 b 1048 81 1021 48 1035 65 b 1050 37 1048 66 1050 52 b 1047 -24 1050 17 1048 -3 b 1038 -275 1038 -108 1040 -192 l 1037 -289 b 1045 -302 1037 -295 1038 -301 b 1068 -284 1056 -304 1064 -292 b 1084 -242 1076 -271 1081 -256 b 1099 -109 1096 -199 1099 -154 b 1106 158 1099 -19 1106 71 b 1128 187 1113 167 1120 177 b 1168 223 1143 212 1155 223 b 1210 193 1179 223 1191 213 b 1220 183 1214 190 1215 186 b 1329 36 1261 138 1292 84 b 1374 7 1345 16 1358 7 b 1411 20 1384 7 1395 12 b 1479 84 1437 37 1459 59 b 1610 235 1521 135 1564 186 b 1706 403 1655 282 1695 334 b 1614 346 1663 400 1637 373 b 1464 170 1564 287 1515 228 b 1440 150 1453 156 1447 150 b 1414 173 1433 150 1426 158 b 1283 336 1371 228 1333 288 b 1220 366 1261 356 1240 366 b 1148 318 1194 366 1169 350 b 1103 255 1133 297 1119 275 b 1097 301 1102 271 1100 285 b 1099 334 1099 312 1099 324 b 1092 428 1099 367 1094 397 b 1071 647 1087 501 1079 575 b 1058 670 1071 657 1071 670 b 1035 648 1047 670 1038 661 b 1018 516 1024 605 1015 560 b 1041 203 1025 412 1037 307 b 1043 180 1041 196 1043 187 b 992 127 1027 161 1009 143 b 965 111 981 117 972 111 b 936 132 955 111 946 120 b 829 268 900 179 867 225 b 760 317 801 301 780 317 b 691 258 739 317 719 297 b 605 147 664 219 641 177 b 589 138 599 141 593 138 b 572 148 583 138 579 141 b 415 317 520 206 467 261 b 327 372 390 343 366 366 b 300 373 317 373 308 373 b 154 295 239 373 190 348 b 55 138 120 243 85 192 b 0 -53 22 79 0 13 b 160 -317 0 -156 49 -252 b 209 -354 177 -327 192 -343 b 510 -531 305 -419 397 -495 b 593 -547 537 -540 564 -547 b 624 -544 603 -547 613 -546 z',\n },\n ornamentPrecompTrillSuffixDandrieu: {\n x_min: 0,\n x_max: 1003,\n y_min: -20,\n y_max: 521,\n ha: 541,\n o: 'm 791 -16 b 844 33 812 -3 829 14 b 981 271 900 107 937 190 b 994 288 984 278 985 288 b 1009 269 1004 288 1007 278 b 1077 112 1034 217 1051 163 b 1158 43 1103 62 1129 43 b 1231 69 1179 43 1204 55 b 1348 189 1280 98 1315 143 b 1444 451 1407 271 1444 357 b 1431 547 1444 482 1440 514 b 1188 750 1401 665 1299 750 b 1158 747 1178 750 1168 749 b 1079 684 1119 742 1089 727 b 1063 632 1076 665 1071 648 b 1056 609 1058 622 1056 615 b 1071 599 1056 602 1060 599 b 1086 600 1076 599 1080 600 b 1130 605 1102 603 1116 605 b 1244 569 1171 605 1210 595 b 1349 346 1322 511 1349 433 b 1348 312 1349 334 1349 324 b 1289 197 1345 266 1325 228 b 1238 174 1270 181 1253 174 b 1188 215 1220 174 1202 187 b 1145 308 1172 245 1159 276 b 1096 413 1129 343 1120 382 b 1053 438 1084 431 1068 438 b 1011 413 1038 438 1022 431 b 955 324 989 384 971 354 b 850 127 920 258 886 192 b 838 112 847 121 842 112 b 824 128 828 109 825 121 b 802 193 815 150 809 171 b 730 400 779 264 766 337 b 688 431 719 420 703 431 b 647 403 674 431 660 422 b 606 338 632 383 619 361 b 513 167 575 282 546 223 b 480 122 503 150 498 122 b 452 171 459 122 459 153 b 420 255 442 199 432 228 b 337 408 399 308 380 364 b 276 436 317 428 297 436 b 215 397 253 436 230 423 b 23 72 148 289 81 184 b 0 29 17 59 0 40 b 7 17 0 23 1 20 b 59 58 26 7 46 39 b 190 276 111 127 143 206 b 216 301 202 292 207 301 b 245 279 223 301 232 294 b 311 166 278 248 292 206 b 367 16 331 117 346 65 b 402 -19 377 -7 387 -19 b 438 -4 412 -19 423 -13 b 518 88 474 17 495 55 b 628 284 562 150 592 216 b 657 223 648 266 651 243 b 717 13 677 154 696 84 b 755 -29 726 -16 737 -29 b 791 -16 765 -29 776 -24 z',\n },\n ornamentPrecompDoubleCadenceUpperPrefix: {\n x_min: 0,\n x_max: 1246,\n y_min: -30,\n y_max: 296.0302860502196,\n ha: 326.0302860502196,\n o: 'm 360 -43 b 559 59 445 -43 503 7 b 698 236 615 111 652 179 b 714 248 704 243 710 248 b 727 235 719 248 721 243 l 848 42 b 883 12 860 22 870 12 b 917 32 891 12 903 19 b 946 62 927 42 939 50 b 1037 192 972 108 1009 147 b 1057 210 1044 204 1051 210 b 1076 190 1063 210 1068 203 l 1176 12 b 1215 -19 1188 -9 1201 -19 b 1250 -6 1225 -19 1237 -14 b 1284 27 1264 3 1274 16 b 1380 190 1323 78 1351 135 b 1395 210 1384 197 1385 210 b 1413 190 1405 210 1410 197 b 1508 40 1436 134 1467 85 b 1564 3 1529 14 1547 3 b 1617 32 1580 3 1597 12 b 1767 238 1678 92 1719 167 b 1794 310 1781 259 1791 282 b 1752 294 1776 317 1764 304 b 1656 164 1711 258 1689 206 b 1629 144 1646 151 1637 144 b 1603 161 1620 144 1613 150 b 1502 315 1562 207 1525 258 b 1452 357 1490 344 1470 357 b 1397 320 1431 357 1411 344 b 1316 170 1368 271 1345 219 b 1280 127 1306 154 1303 127 b 1244 171 1256 127 1254 154 b 1145 337 1210 226 1179 282 b 1110 363 1135 354 1122 363 b 1070 338 1097 363 1084 354 b 1050 311 1063 330 1057 320 b 959 181 1017 271 992 223 b 939 167 950 173 945 167 b 920 184 933 167 927 173 b 818 343 887 238 852 291 b 759 395 795 377 778 395 b 701 344 742 395 724 377 b 698 338 700 341 700 340 b 544 154 652 272 605 207 b 412 98 501 117 458 98 b 304 130 377 98 341 108 b 95 373 204 187 144 275 b 58 426 85 393 82 428 b 19 366 26 426 26 389 b 0 307 13 346 0 327 b 4 287 0 300 1 294 b 174 36 49 194 91 102 b 360 -43 230 -9 289 -43 z',\n },\n ornamentPrecompDoubleCadenceUpperPrefixTurn: {\n x_min: 0,\n x_max: 1226,\n y_min: -237,\n y_max: 436,\n ha: 673,\n o: 'm 1279 -341 b 1293 -252 1293 -307 1295 -278 b 1277 36 1287 -156 1282 -59 l 1273 118 b 1318 176 1289 137 1303 157 b 1349 203 1332 193 1342 203 b 1378 168 1359 203 1367 192 b 1456 35 1401 122 1428 78 b 1511 -12 1476 3 1493 -12 b 1568 23 1526 -12 1544 0 b 1597 53 1578 32 1588 42 b 1705 186 1629 101 1669 143 b 1761 284 1728 216 1751 246 b 1765 300 1763 288 1765 295 b 1763 307 1765 302 1765 305 b 1737 302 1754 311 1744 308 b 1718 287 1729 298 1725 292 b 1598 145 1673 245 1637 194 b 1578 130 1590 135 1584 130 b 1557 147 1571 130 1565 135 b 1447 321 1516 202 1488 265 b 1403 351 1433 341 1417 351 b 1358 323 1388 351 1372 341 b 1269 209 1329 285 1299 248 b 1254 521 1264 314 1259 418 b 1228 616 1253 554 1247 588 b 1218 628 1224 621 1223 628 l 1215 628 b 1201 613 1210 626 1202 619 b 1200 600 1200 609 1200 605 l 1200 586 b 1211 348 1204 507 1207 428 b 1217 166 1214 288 1215 226 b 1202 181 1212 168 1208 174 b 1094 334 1168 233 1130 284 b 1048 366 1079 356 1064 366 b 1004 331 1034 366 1018 354 b 904 154 969 275 930 220 b 873 202 887 171 880 187 b 778 356 845 256 819 311 b 737 379 763 372 750 379 b 698 353 724 379 711 370 l 621 232 b 415 114 570 154 495 114 b 302 138 377 114 340 121 b 73 400 187 192 117 284 b 55 420 69 415 62 420 b 42 410 50 420 45 416 b 0 292 23 373 0 334 b 4 262 0 282 1 272 b 168 39 32 168 92 99 b 359 -26 225 -6 292 -26 b 585 76 446 -26 530 10 b 668 202 616 115 641 160 b 693 228 680 219 687 228 b 720 203 700 228 707 219 b 801 63 752 160 775 111 b 844 7 812 42 818 7 b 910 66 877 6 894 39 b 923 94 916 75 919 85 b 995 219 945 137 968 179 b 1025 184 1009 210 1017 197 b 1119 56 1054 141 1087 98 b 1166 20 1138 32 1152 20 b 1215 50 1181 20 1195 30 b 1221 56 1217 52 1218 55 b 1228 -163 1223 -17 1225 -89 b 1279 -341 1231 -223 1251 -278 z',\n },\n ornamentPrecompTrillLowerSuffix: {\n x_min: 0,\n x_max: 833,\n y_min: -309,\n y_max: 319,\n ha: 628,\n o: 'm 778 -444 b 801 -445 785 -444 793 -445 b 1037 -338 894 -445 969 -397 b 1200 37 1149 -240 1200 -109 b 1084 406 1200 171 1172 300 b 1024 444 1064 431 1043 444 b 960 390 999 444 978 426 b 841 163 923 314 886 236 b 812 128 832 150 827 128 b 786 167 796 130 793 153 b 660 418 744 251 716 341 b 599 459 639 445 619 459 b 541 410 577 459 557 444 b 439 197 507 340 474 269 b 422 179 435 190 435 179 b 338 393 392 251 379 328 b 275 439 320 423 298 439 b 212 396 253 439 230 425 b 71 219 170 333 128 268 b 0 45 17 173 16 112 b 68 98 32 62 50 78 b 194 264 112 150 153 209 b 230 292 209 282 219 292 b 264 261 240 292 251 282 b 274 242 268 255 269 248 b 346 46 304 179 325 112 b 376 10 351 32 354 10 b 412 35 392 10 403 22 b 452 107 429 56 441 82 b 541 291 481 168 511 230 b 556 307 547 302 552 307 b 573 295 562 307 567 302 b 624 217 595 272 611 246 b 721 1 657 145 685 72 b 755 -27 732 -19 742 -27 b 786 -16 765 -27 775 -24 b 857 73 819 7 840 39 b 952 256 887 134 920 194 b 978 289 963 279 969 289 b 1009 262 985 289 994 281 b 1030 235 1017 253 1024 245 b 1110 -4 1071 161 1099 81 b 1116 -68 1113 -26 1116 -48 b 1009 -243 1116 -140 1090 -200 b 848 -291 956 -272 901 -291 b 730 -261 809 -291 770 -282 b 696 -248 714 -252 703 -248 b 671 -284 684 -248 678 -258 l 662 -312 b 657 -357 658 -330 657 -344 b 744 -439 657 -403 683 -425 z',\n },\n brassScoop: {\n x_min: -0.4444444444444445,\n x_max: 312,\n y_min: -390,\n y_max: 28,\n ha: 418,\n o: 'm 0 -562 b 393 -256 171 -504 307 -412 b 449 -39 431 -189 449 -115 b 448 -1 449 -26 449 -14 b 433 40 446 14 448 40 b 408 -3 410 40 412 14 b 396 -66 403 -23 402 -46 b 45 -397 346 -243 209 -337 b 0 -451 13 -409 1 -423 b 0 -562 -1 -485 0 -520 z',\n },\n brassDoitMedium: {\n x_min: -0.32815253965710617,\n x_max: 476.21251177608565,\n y_min: -50,\n y_max: 333.1535583875376,\n ha: 383.1535583875376,\n o: 'm 16 -72 b 27 -71 19 -72 23 -72 b 215 -33 89 -56 153 -48 b 521 114 327 -7 435 35 b 685 432 615 199 691 295 b 670 480 684 449 688 475 b 642 441 654 482 648 456 b 403 183 599 321 513 240 b 79 89 301 130 192 105 b 0 -1 -12 76 0 76 b 0 -50 0 -17 1 -33 b 16 -72 0 -65 3 -72 z',\n },\n brassFallLipShort: {\n x_min: 0,\n x_max: 298,\n y_min: -344,\n y_max: 65,\n ha: 409,\n o: 'm 396 -495 b 420 -461 412 -487 418 -474 b 429 -382 428 -435 429 -409 b 426 -330 429 -364 428 -347 b 285 -6 410 -209 356 -104 b 98 94 239 59 173 94 b 39 86 79 94 58 92 b 0 49 20 81 0 73 l 0 -52 b 10 -69 0 -62 1 -69 b 20 -68 13 -69 16 -69 b 88 -56 45 -59 66 -56 b 261 -160 156 -56 213 -95 b 396 -495 333 -259 382 -369 z',\n },\n brassLiftMedium: {\n x_min: 0,\n x_max: 807,\n y_min: 0,\n y_max: 838,\n ha: 838,\n o: 'm 50 0 b 55 1 52 0 53 0 b 58 23 65 7 59 16 b 55 58 56 36 55 48 b 130 117 55 99 75 112 b 220 213 202 121 220 141 b 315 308 220 289 238 308 l 336 308 b 408 380 393 310 406 321 b 461 452 409 438 416 452 b 485 451 468 452 477 451 b 569 510 531 448 556 464 b 573 543 572 520 572 531 b 657 619 580 605 595 618 b 698 621 670 619 684 619 b 788 700 749 625 778 649 b 798 778 792 726 793 752 b 873 857 806 841 809 845 b 985 950 927 867 973 887 b 1084 1047 1002 1035 1004 1034 b 1162 1128 1133 1056 1162 1087 b 1146 1182 1162 1145 1158 1164 b 1125 1207 1140 1191 1136 1207 l 1122 1207 b 1110 1191 1113 1205 1110 1198 b 1112 1174 1110 1185 1112 1178 b 1048 1110 1109 1126 1096 1113 b 1028 1109 1043 1110 1035 1109 b 939 1022 969 1102 948 1081 b 845 922 929 949 917 936 b 746 812 773 909 753 886 b 744 780 744 802 744 791 b 635 681 737 700 717 683 b 524 583 553 680 536 665 b 439 510 514 520 503 510 b 357 431 377 510 360 492 l 357 406 b 314 364 356 379 343 364 b 238 361 288 364 264 364 b 173 300 202 357 180 334 b 167 245 168 281 167 262 b 105 174 166 192 157 180 b 75 171 95 173 85 171 b 6 112 30 166 14 153 b 0 73 1 98 0 85 b 37 10 0 45 13 26 b 50 0 42 7 46 0 z',\n },\n brassFallRoughMedium: {\n x_min: 0,\n x_max: 791,\n y_min: 0,\n y_max: 819,\n ha: 819,\n o: 'm 1117 0 b 1139 101 1129 26 1139 71 b 1138 121 1139 109 1139 115 b 1084 193 1125 171 1110 193 b 1044 183 1073 193 1060 189 b 1022 177 1035 179 1028 177 b 1007 209 1012 177 1008 186 b 876 324 1004 292 959 330 b 799 317 850 321 825 320 b 759 354 772 314 755 320 b 760 373 760 360 760 366 b 759 392 760 379 760 384 b 681 477 753 451 730 477 b 654 474 672 477 664 475 b 606 467 638 471 622 468 b 586 465 599 465 592 465 b 564 481 570 465 564 469 b 569 505 564 487 566 495 b 575 553 572 521 575 537 b 572 585 575 564 573 575 b 481 665 560 657 539 668 b 412 665 458 664 435 665 b 382 690 392 667 382 672 b 383 700 382 693 383 696 b 386 773 387 724 387 749 b 297 858 382 828 351 857 b 229 861 274 858 251 858 b 190 897 207 863 193 871 b 163 1012 186 936 180 976 b 79 1084 145 1050 124 1084 b 66 1083 75 1084 71 1083 b 43 1096 49 1081 43 1087 b 48 1112 43 1100 45 1106 b 53 1130 52 1119 53 1125 b 39 1169 53 1145 45 1158 b 26 1179 36 1175 30 1179 b 16 1171 22 1179 17 1176 b 0 1103 10 1149 0 1126 b 9 1067 0 1092 1 1079 b 91 1021 26 1031 52 1018 b 145 978 122 1024 141 1011 b 156 913 147 956 151 935 b 291 795 170 831 210 795 b 346 768 337 795 346 796 b 344 743 346 760 344 753 b 343 716 344 733 343 724 b 455 600 343 651 390 602 b 505 605 471 599 490 605 b 528 598 514 605 523 603 b 536 579 534 592 536 586 b 524 523 536 562 526 541 b 523 505 524 517 523 511 b 621 405 523 442 560 405 b 639 406 626 405 634 406 b 677 413 652 408 664 410 b 701 416 687 415 696 416 b 721 392 716 416 721 410 b 720 373 721 386 720 380 b 831 255 714 301 759 252 b 897 261 854 255 876 261 b 926 262 909 261 919 262 b 969 197 963 262 965 252 b 971 184 969 193 971 189 b 1031 115 979 137 998 115 b 1071 122 1043 115 1056 118 b 1096 130 1079 125 1086 127 b 1087 59 1094 107 1087 82 b 1117 0 1087 37 1094 17 z',\n },\n brassBend: {\n x_min: 0,\n x_max: 381,\n y_min: 0,\n y_max: 367,\n ha: 367,\n o: 'm 298 0 b 472 50 359 0 418 14 b 537 135 501 71 530 92 b 543 216 543 163 543 190 l 543 266 b 544 308 543 281 543 295 b 549 433 546 354 549 395 b 543 507 549 459 547 482 b 533 528 541 516 544 528 b 511 508 524 528 514 520 b 508 478 510 498 508 488 b 504 318 507 425 504 372 b 505 264 504 300 505 282 b 446 181 505 220 484 199 b 294 150 396 160 344 150 b 92 194 226 150 158 167 b 45 269 62 207 45 230 b 46 359 46 300 46 328 b 37 497 46 405 45 451 b 27 523 36 507 37 523 b 4 498 14 524 6 513 b 3 481 3 492 3 487 b 0 409 1 456 0 433 b 4 228 0 348 4 288 b 3 177 4 210 4 194 b 68 53 1 125 20 84 b 200 10 108 27 154 17 b 298 0 233 4 266 0 z',\n },\n brassMuteClosed: {\n x_min: 0,\n x_max: 274,\n y_min: 0,\n y_max: 260,\n ha: 260,\n o: 'm 203 0 b 209 1 206 0 207 0 b 216 13 215 4 216 9 l 215 27 l 215 153 b 216 161 216 156 216 158 b 372 164 268 163 318 164 b 395 184 383 164 395 166 l 395 189 b 357 229 392 209 386 229 b 219 228 311 229 265 228 l 223 310 b 209 357 225 328 219 344 b 189 374 203 364 197 374 b 184 373 187 374 186 373 b 177 359 179 372 177 366 l 177 348 l 173 222 l 39 222 b 0 206 12 222 0 219 b 10 174 0 199 3 189 b 46 157 19 157 30 157 b 108 160 68 158 88 160 b 171 161 130 161 150 161 l 167 58 b 184 16 167 40 171 26 b 203 0 192 12 196 0 z',\n },\n brassMuteOpen: {\n x_min: 1,\n x_max: 313.01193341111656,\n y_min: 0,\n y_max: 309,\n ha: 309,\n o: 'm 265 0 b 451 189 363 7 452 88 l 451 215 b 348 383 441 285 405 343 b 209 445 288 426 248 445 b 84 379 168 445 132 420 b 69 364 79 373 73 369 b 1 213 30 323 1 275 b 230 0 1 88 94 0 z m 210 62 b 128 73 181 62 154 66 b 40 171 71 91 42 125 b 52 226 40 187 45 206 b 197 374 79 295 130 344 b 228 382 207 380 217 382 b 300 361 252 382 276 370 b 374 308 328 350 353 331 b 410 223 397 284 410 253 b 393 163 410 202 405 181 b 210 62 354 91 288 63 z',\n },\n brassFlip: {\n x_min: 0,\n x_max: 402,\n y_min: 0,\n y_max: 361,\n ha: 361,\n o: 'm 579 0 b 511 153 579 68 557 117 b 52 504 359 271 206 387 b 29 520 45 510 39 520 b 20 517 26 520 23 518 b 0 477 3 510 0 494 l 0 125 b 17 20 1 92 1 56 b 40 84 37 40 40 60 b 42 287 40 151 42 219 l 42 363 z',\n },\n brassJazzTurn: {\n x_min: 0,\n x_max: 646,\n y_min: 0,\n y_max: 212,\n ha: 212,\n o: 'm 310 0 b 367 33 327 0 344 10 b 389 55 374 40 382 49 b 490 145 423 85 456 114 b 507 154 495 151 501 154 b 524 144 513 154 517 151 b 598 72 547 120 575 98 b 700 24 625 42 662 24 b 765 43 721 24 744 30 b 893 147 812 72 855 105 b 930 212 910 166 923 186 b 912 215 923 213 917 215 b 871 199 896 215 883 209 b 812 153 852 183 832 167 b 789 144 805 148 796 144 b 773 156 782 144 776 147 b 691 251 757 199 720 222 b 603 301 658 282 631 301 b 527 258 580 301 556 288 b 420 156 494 222 455 190 b 399 143 412 147 405 143 b 377 157 392 143 386 147 b 259 282 340 200 300 242 b 219 305 245 298 232 305 b 177 279 204 305 192 297 b 55 127 137 228 95 177 b 0 52 36 104 20 79 b 14 50 6 50 10 50 b 53 66 32 50 45 58 b 115 131 75 88 98 108 b 135 148 124 143 130 148 b 157 132 141 148 148 143 b 252 33 186 96 219 65 b 310 0 275 12 292 0 z',\n },\n brassSmear: {\n x_min: 0,\n x_max: 334,\n y_min: 0,\n y_max: 151,\n ha: 151,\n o: 'm 321 0 b 475 125 390 0 436 43 b 481 143 478 131 481 137 b 475 154 481 147 480 151 b 449 148 468 158 458 154 b 395 132 432 137 413 132 b 343 140 377 132 360 137 b 229 194 301 148 266 173 b 168 217 206 209 186 217 b 109 192 148 217 130 209 b 0 26 59 148 32 89 b 59 63 32 29 45 48 b 98 84 72 78 84 84 b 130 73 108 84 118 81 b 213 26 157 58 183 37 b 321 0 255 9 289 0 z',\n },\n stringsDownBow: {\n x_min: 0,\n x_max: 306,\n y_min: -0.09607201951262866,\n y_max: 366,\n ha: 366.09607201951263,\n o: 'm 405 0 b 425 17 413 -1 420 9 b 439 66 435 32 439 48 b 441 268 439 137 441 202 b 436 412 441 314 439 361 l 435 413 b 423 469 435 436 431 456 b 344 508 406 501 373 501 b 204 527 298 520 251 527 b 60 498 156 527 108 518 b 7 438 32 485 10 468 l 7 426 b 4 337 7 396 7 367 b 0 140 0 272 0 206 b 1 42 0 107 0 73 b 13 3 1 27 -3 4 b 40 39 29 3 35 24 b 42 53 42 43 40 49 b 49 141 48 84 49 112 b 48 215 49 167 48 192 b 49 252 48 228 48 240 l 49 312 b 130 343 72 331 99 340 b 206 347 156 346 180 347 b 372 314 262 347 318 338 l 390 307 l 390 245 b 390 138 392 212 390 176 b 397 23 390 101 392 62 b 405 0 399 14 393 1 z',\n },\n stringsUpBow: {\n x_min: 0,\n x_max: 219.2842808242076,\n y_min: 0,\n y_max: 489,\n ha: 489,\n o: 'm 151 0 b 184 42 170 12 180 26 b 297 554 223 212 261 382 b 315 690 305 598 318 645 b 304 704 315 697 311 704 b 276 670 288 704 282 697 b 157 131 236 490 196 311 l 157 144 b 73 526 134 276 104 396 b 30 677 60 576 52 638 b 13 694 26 684 22 694 b 0 674 9 694 0 691 l 0 671 b 10 603 3 649 6 626 b 105 174 42 461 72 317 b 150 0 117 117 128 58 z',\n },\n stringsHarmonic: {\n x_min: 0,\n x_max: 191,\n y_min: 0,\n y_max: 202,\n ha: 202,\n o: 'm 143 0 b 275 122 217 0 275 53 b 127 291 275 206 202 291 b 0 154 63 291 0 222 b 143 0 0 76 71 0 z m 122 68 b 43 105 89 66 59 75 b 39 124 40 111 39 117 b 79 199 39 148 56 180 b 145 226 101 216 122 226 b 199 210 163 226 180 220 b 235 150 223 196 235 173 b 203 92 235 128 225 107 b 122 68 181 76 150 68 z',\n },\n pluckedSnapPizzicatoAbove: {\n x_min: 0,\n x_max: 201,\n y_min: 0,\n y_max: 325,\n ha: 325,\n o: 'm 171 0 b 289 99 240 0 289 45 b 258 183 289 130 274 156 b 174 269 236 217 203 240 l 174 408 b 174 429 174 415 176 422 b 131 468 168 451 153 468 b 117 451 120 468 117 461 b 118 429 117 444 118 435 b 115 307 117 389 115 347 b 0 166 59 295 0 223 b 171 0 0 85 89 0 z m 134 55 b 52 131 84 55 52 85 b 115 233 52 179 81 209 b 114 192 114 220 114 206 b 174 120 114 137 114 137 l 174 228 b 233 148 200 207 223 183 b 236 130 235 143 236 135 b 197 72 236 105 223 85 b 134 55 177 60 157 55 z',\n },\n pluckedSnapPizzicatoBelow: {\n x_min: 0,\n x_max: 211,\n y_min: 0,\n y_max: 307,\n ha: 307,\n o: 'm 145 7 b 163 0 153 3 158 0 b 173 23 170 0 173 7 l 173 140 l 170 140 l 170 163 l 171 163 b 206 170 179 164 193 166 b 304 287 264 186 304 233 b 281 354 304 308 297 333 b 118 442 240 412 186 439 b 0 324 69 442 0 370 b 115 176 0 266 55 202 l 115 56 b 145 7 114 33 125 19 z m 115 220 b 62 256 92 223 73 230 b 53 292 56 269 53 281 b 78 344 53 311 60 328 b 168 384 105 372 135 384 b 213 376 183 384 199 382 b 253 321 239 366 253 346 b 246 291 253 311 251 301 b 170 226 230 256 203 236 l 170 258 b 148 305 171 278 163 292 b 128 315 143 310 135 315 l 124 315 b 115 301 117 314 115 308 z',\n },\n pluckedLeftHandPizzicato: {\n x_min: 0,\n x_max: 271,\n y_min: 0,\n y_max: 284,\n ha: 284,\n o: 'm 213 0 b 223 14 222 0 223 7 b 222 35 223 22 222 29 l 222 176 b 373 170 272 174 323 170 b 390 180 382 170 390 171 l 390 184 b 347 232 386 207 382 232 b 219 238 307 233 266 235 l 219 364 b 171 409 219 395 193 409 b 156 393 160 409 156 402 b 158 370 156 384 158 376 l 158 240 b 16 239 115 240 66 239 b 0 226 7 239 0 238 l 0 223 b 50 179 1 203 29 179 b 158 177 86 179 122 179 l 158 63 b 161 29 158 52 158 40 b 213 0 166 -1 194 1 z',\n },\n keyboardPedalPed: {\n x_min: 0,\n x_max: 944,\n y_min: -13,\n y_max: 550,\n ha: 563,\n o: 'm 22 0 b 109 78 53 0 105 46 l 144 333 b 163 376 147 347 140 372 b 364 465 238 390 301 426 b 454 599 416 497 454 540 b 452 618 454 605 454 612 b 320 770 442 694 396 747 b 248 779 295 778 272 779 b 193 778 229 779 212 779 b 160 780 181 778 167 775 b 137 792 153 789 144 791 b 109 789 128 792 118 789 b 7 719 59 789 48 737 b 23 708 16 714 20 708 b 36 710 29 710 33 710 b 53 684 52 710 53 698 l 53 674 b 43 386 53 577 53 482 b 20 164 36 312 30 238 b 1 30 14 120 7 75 b 0 19 0 26 0 22 b 22 0 0 9 4 0 z m 171 425 b 156 442 160 425 156 429 b 157 475 157 452 157 464 b 164 602 161 517 164 560 b 161 698 164 635 163 667 b 184 729 161 720 167 729 l 193 729 b 348 563 278 719 348 641 b 346 539 348 554 347 547 b 171 425 328 459 229 422 z m 979 6 b 1008 13 986 6 995 9 b 1081 101 1047 29 1079 46 b 1116 449 1087 217 1104 333 b 1143 654 1123 518 1133 586 b 1148 685 1145 664 1148 675 b 1140 704 1148 693 1146 700 b 1107 716 1130 713 1119 716 b 1056 706 1092 716 1073 710 b 1037 671 1035 703 1038 685 b 1004 439 1025 595 1014 517 b 986 419 1001 428 999 419 b 979 419 985 419 982 420 b 935 426 965 423 949 425 b 795 376 884 426 838 405 b 664 153 714 323 664 249 b 665 130 664 145 665 138 b 753 29 671 65 704 29 b 815 40 773 29 792 33 b 975 147 873 65 923 101 b 965 45 971 108 968 76 b 979 6 963 17 966 6 z m 393 -17 b 634 145 494 16 579 52 b 638 160 636 151 638 156 b 625 168 638 166 634 168 b 621 167 624 168 622 168 b 524 118 582 164 544 160 b 495 79 517 104 505 92 b 435 33 471 49 452 33 b 380 96 416 33 397 55 b 369 145 373 114 369 131 b 442 225 369 186 395 213 b 468 232 451 228 459 229 b 654 344 539 255 606 285 b 677 395 667 360 677 376 b 672 415 677 402 675 408 b 612 459 661 442 639 455 b 589 461 602 461 592 461 b 348 328 500 461 409 408 b 269 120 302 268 269 199 b 379 -19 269 45 318 -19 b 393 -17 383 -19 389 -19 z m 395 240 b 494 383 418 300 452 344 l 521 405 b 544 419 528 409 536 418 b 554 415 547 419 550 418 b 570 383 564 406 570 396 l 570 379 b 552 331 570 360 562 344 b 395 240 511 285 462 253 z m 827 89 b 792 111 815 89 804 96 b 766 204 775 131 766 158 b 845 360 772 256 799 314 b 871 372 854 369 863 372 b 897 366 880 372 888 369 b 978 279 942 353 963 320 b 976 259 981 272 981 265 b 858 104 942 203 909 147 b 827 89 847 94 837 89 z m 1282 12 b 1336 35 1303 14 1320 23 b 1359 71 1351 45 1359 58 b 1338 102 1359 82 1352 95 b 1254 130 1312 118 1284 130 b 1187 88 1223 130 1202 109 b 1178 65 1182 81 1178 72 b 1195 37 1178 55 1182 45 b 1282 12 1223 23 1253 19 z',\n },\n keyboardPedalUp: {\n x_min: 0,\n x_max: 436.6015132318337,\n y_min: 0,\n y_max: 461,\n ha: 461,\n o: 'm 330 0 b 334 1 331 0 333 0 b 340 12 338 4 340 7 l 338 26 b 340 264 338 105 338 184 b 526 95 400 206 461 148 b 559 71 536 88 547 71 b 564 72 560 71 563 71 b 580 121 580 79 580 102 l 580 127 b 543 203 585 158 573 184 b 472 259 518 219 495 238 l 445 285 b 590 292 494 288 541 291 b 622 318 609 294 618 302 b 628 359 625 331 626 346 b 586 402 632 393 621 405 b 464 395 546 399 504 396 l 559 491 b 567 524 567 500 567 510 b 564 543 567 527 567 536 b 539 596 559 563 560 590 b 494 564 521 600 508 577 b 340 413 442 514 390 464 l 340 560 b 287 664 340 600 321 632 b 271 518 274 612 272 566 b 268 445 269 494 269 469 b 117 569 219 488 168 530 b 96 579 109 575 102 579 b 85 560 89 579 85 573 b 124 446 85 518 82 477 b 209 380 153 426 181 403 b 45 374 154 377 99 376 b 0 324 9 374 0 359 b 63 266 0 265 1 265 b 144 272 89 269 117 272 l 196 272 b 108 193 167 246 138 219 b 60 135 76 164 60 151 b 99 73 60 121 73 105 b 104 68 101 72 102 71 b 114 58 107 60 111 58 b 130 66 120 58 124 62 b 259 186 173 107 217 145 b 256 117 259 163 256 140 b 311 13 256 72 271 37 b 330 0 317 10 323 0 z',\n },\n pictChokeCymbal: {\n x_min: 1,\n x_max: 147,\n y_min: 0,\n y_max: 242,\n ha: 242,\n o: 'm 79 4 b 207 158 153 32 192 88 b 212 200 210 173 212 187 b 143 336 212 253 187 298 b 98 348 131 344 115 348 b 4 295 60 348 16 327 b 1 276 1 289 1 282 b 9 249 1 266 3 258 b 121 183 35 206 72 183 b 156 186 132 183 144 183 b 26 53 134 115 91 73 b 7 39 13 49 7 45 b 19 20 7 33 12 27 b 59 0 30 9 43 0 b 79 4 65 0 72 1 z',\n },\n wiggleArpeggiatoUp: {\n x_min: -22,\n x_max: 300,\n y_min: 0,\n y_max: 176,\n ha: 176,\n o: 'm 173 4 b 196 0 180 1 189 0 b 246 26 215 0 230 9 b 301 117 271 53 285 85 b 312 131 305 125 307 131 b 327 124 315 131 321 128 b 373 86 341 112 353 101 b 412 69 389 75 402 69 b 432 94 425 69 432 79 b 373 181 432 117 413 154 b 235 252 323 216 285 245 b 220 253 229 253 225 253 b 168 215 196 253 181 240 b 111 112 151 180 140 141 b 94 102 105 105 99 102 b 78 111 89 102 84 105 b 0 181 55 135 35 160 b -32 153 -20 194 -32 168 b 0 86 -32 124 -32 109 b 94 36 22 71 73 46 b 173 4 134 16 131 17 z',\n },\n arpeggiatoUp: {\n x_min: 0,\n x_max: 262,\n y_min: 0,\n y_max: 1459,\n ha: 1459,\n o: 'm 190 0 b 160 63 187 29 170 45 b 145 108 150 81 145 95 b 183 163 145 128 157 145 b 300 246 222 190 262 216 b 347 318 333 272 347 295 b 301 393 347 341 331 364 b 258 413 289 403 272 408 b 145 449 220 425 183 436 b 117 464 135 452 120 452 b 140 491 115 477 128 484 b 294 593 192 526 243 557 b 330 647 318 611 330 626 b 314 693 330 660 324 675 b 262 736 302 714 285 729 b 170 763 230 744 200 753 b 122 783 153 768 125 768 b 160 831 120 804 143 818 b 288 922 202 861 246 890 b 333 999 318 945 333 972 b 266 1083 333 1032 310 1064 b 189 1115 240 1094 215 1103 b 122 1178 145 1133 122 1153 b 168 1250 122 1200 138 1223 l 180 1257 b 269 1333 210 1283 240 1306 b 305 1405 294 1356 305 1381 b 284 1469 305 1426 298 1447 b 228 1525 269 1492 251 1511 b 183 1600 197 1545 183 1571 b 190 1640 183 1613 184 1626 b 197 1670 193 1650 194 1660 b 272 1735 213 1719 230 1735 b 295 1734 279 1735 287 1735 b 323 1732 305 1732 314 1732 b 350 1731 333 1732 341 1732 b 377 1742 369 1729 377 1732 b 370 1761 377 1747 374 1754 l 301 1898 b 217 2066 274 1954 248 2012 b 186 2101 204 2089 196 2101 b 154 2069 177 2101 167 2091 b 12 1824 105 1987 59 1907 b 0 1787 4 1810 0 1797 b 59 1744 0 1761 20 1745 b 160 1738 92 1744 125 1740 b 145 1692 156 1721 151 1706 b 135 1633 138 1672 135 1652 b 184 1518 135 1591 151 1552 b 229 1475 199 1503 213 1488 b 259 1431 249 1456 259 1444 b 229 1388 259 1420 249 1407 b 151 1325 203 1365 177 1345 b 105 1279 134 1310 118 1296 b 73 1202 84 1251 73 1227 b 108 1123 73 1176 85 1152 b 255 1031 148 1077 199 1051 b 282 1014 274 1025 282 1021 b 262 991 282 1008 275 1001 b 151 914 226 963 189 939 b 79 851 125 896 99 877 b 63 809 69 837 63 824 b 79 769 63 796 68 783 b 202 697 111 729 154 710 b 266 670 225 690 266 688 b 210 622 266 648 232 635 b 82 534 167 593 120 570 b 55 491 63 518 55 505 b 79 448 55 478 63 465 b 255 361 127 395 192 380 b 288 343 269 359 288 357 b 266 312 288 331 275 320 b 144 223 229 278 184 253 b 85 134 104 193 85 166 b 118 53 85 111 96 85 b 190 0 135 29 160 14 z',\n },\n arpeggiatoDown: {\n x_min: 0,\n x_max: 218,\n y_min: 0,\n y_max: 1440,\n ha: 1440,\n o: 'm 161 16 b 310 261 210 98 259 180 b 314 275 312 266 314 271 b 302 295 314 282 310 289 b 252 311 287 308 269 311 b 217 310 240 311 229 310 b 190 333 202 310 194 315 b 151 412 186 363 171 389 b 102 501 120 452 102 477 b 150 588 102 524 118 547 b 161 603 154 592 158 598 b 181 661 176 622 181 641 b 173 704 181 675 179 690 b 86 795 156 746 121 770 b 53 829 63 811 53 819 b 78 868 53 840 62 851 b 102 888 85 876 94 883 b 180 956 128 912 156 933 b 216 1028 204 979 216 1002 b 203 1081 216 1044 212 1061 b 115 1171 186 1123 148 1145 b 75 1221 88 1191 75 1207 b 114 1272 75 1237 88 1251 b 173 1308 132 1284 154 1296 b 226 1339 190 1318 209 1328 b 265 1405 253 1359 265 1380 b 258 1447 265 1418 264 1431 b 154 1541 242 1499 199 1521 b 109 1581 124 1555 109 1567 b 141 1627 109 1594 121 1608 b 204 1680 163 1646 184 1662 b 233 1742 223 1699 233 1719 b 226 1777 233 1752 230 1764 b 135 1862 210 1822 173 1840 b 104 1895 114 1875 104 1884 b 118 1930 104 1904 109 1914 b 192 2006 135 1961 161 1986 b 206 2029 203 2013 206 2022 b 192 2064 206 2040 197 2052 b 180 2074 187 2071 184 2074 b 156 2061 171 2074 163 2065 b 84 1983 125 2040 102 2013 b 65 1921 71 1961 65 1941 b 88 1853 65 1899 72 1876 b 171 1784 108 1820 138 1801 b 190 1764 184 1777 190 1770 b 174 1741 190 1757 184 1750 b 107 1683 153 1722 128 1704 b 68 1610 81 1659 68 1636 b 88 1548 68 1591 75 1571 b 177 1470 109 1512 141 1489 b 223 1431 209 1453 223 1443 b 179 1390 223 1420 209 1408 b 128 1361 163 1380 145 1371 b 71 1322 108 1348 88 1338 b 32 1253 45 1300 32 1277 b 48 1198 32 1236 37 1218 b 147 1090 71 1152 108 1120 b 174 1057 166 1076 174 1067 b 153 1022 174 1047 167 1037 b 109 982 140 1008 124 995 b 37 919 85 962 59 942 b 9 860 17 899 9 880 b 26 806 9 844 14 827 b 120 717 50 769 84 740 b 138 691 132 708 138 700 b 130 668 138 684 135 677 b 92 618 118 651 105 635 b 59 531 71 589 59 560 b 84 455 59 507 68 481 b 132 386 98 431 115 408 b 148 341 144 372 148 357 b 144 317 148 333 147 324 b 121 305 140 307 131 305 l 98 305 b 82 304 94 304 88 304 l 32 304 b 0 292 10 304 0 302 b 12 266 0 287 4 279 b 60 164 32 233 46 199 b 127 20 84 117 105 68 b 144 0 132 9 137 0 b 161 16 150 0 154 4 z',\n },\n repeat1Bar: {\n x_min: 0,\n x_max: 599.1057280164835,\n y_min: -250,\n y_max: 175,\n ha: 425,\n o: 'm 216 98 b 255 75 236 84 246 75 b 291 104 265 75 274 85 b 323 147 304 117 327 125 b 289 215 323 168 314 184 b 238 252 269 239 253 252 b 187 222 222 252 207 242 b 173 206 183 216 177 212 b 157 170 163 194 157 183 b 174 138 157 160 161 150 b 216 98 189 127 200 109 z m 76 -334 b 181 -285 111 -315 148 -302 b 831 52 396 -168 613 -58 b 863 114 855 63 864 82 b 828 202 855 140 855 176 b 808 213 821 209 815 213 b 793 209 804 213 799 212 l 422 19 b 26 -179 291 -48 164 -124 b 0 -213 10 -186 0 -196 b 3 -232 0 -219 0 -225 b 52 -325 14 -265 37 -294 b 66 -337 55 -331 59 -337 b 76 -334 69 -337 72 -336 z m 769 -360 b 829 -264 779 -360 829 -284 b 769 -176 822 -232 799 -200 b 742 -163 760 -167 750 -163 b 716 -184 733 -163 723 -168 b 683 -228 708 -202 693 -213 b 672 -253 675 -236 672 -245 b 683 -281 672 -262 675 -271 b 752 -353 703 -308 732 -327 b 769 -360 756 -357 763 -360 z',\n },\n repeat2Bars: {\n x_min: 0.008571918423331715,\n x_max: 775,\n y_min: -246.92374029115243,\n y_max: 362.82068246705313,\n ha: 609.7444227582056,\n o: 'm 909 412 b 873 351 906 384 893 367 b 436 50 729 249 585 147 l 91 -179 b 62 -174 76 -189 68 -183 b 12 -96 48 -147 24 -125 b 36 -16 -7 -53 -6 -43 b 220 104 96 24 158 65 b 819 507 425 232 624 369 b 881 495 852 530 861 528 b 909 412 899 469 900 439 z m 333 338 b 302 240 330 307 317 274 b 276 235 297 225 287 228 l 233 269 b 203 376 186 307 183 318 b 225 441 212 397 217 419 b 246 454 228 452 232 458 b 333 338 284 441 333 380 z m 1116 228 b 1067 158 1115 192 1092 174 b 910 59 1015 125 963 92 b 478 -240 762 -33 622 -140 b 311 -350 423 -279 366 -314 b 285 -344 298 -360 289 -356 b 239 -258 272 -314 251 -288 b 261 -196 228 -228 235 -210 b 517 -29 348 -144 436 -91 b 1030 321 681 98 861 202 b 1093 307 1060 343 1076 340 b 1116 228 1107 281 1109 252 z m 1070 -105 b 1020 -210 1057 -143 1038 -176 b 998 -210 1014 -219 1004 -215 l 924 -153 b 913 -88 899 -135 897 -112 b 949 -22 926 -66 939 -45 b 998 -7 960 6 976 9 b 1070 -105 1032 -32 1058 -63 z',\n },\n repeat4Bars: {\n x_min: 0,\n x_max: 1374,\n y_min: -304,\n y_max: 304,\n ha: 608,\n o: 'm 78 -266 b 92 -258 82 -266 88 -264 b 114 -240 98 -251 107 -246 b 638 107 289 -125 467 -14 b 873 271 716 161 793 216 b 907 337 894 285 906 305 b 887 400 901 354 897 379 b 852 438 877 426 867 438 b 814 420 842 438 829 432 b 135 -33 592 262 366 111 b 12 -121 92 -60 48 -84 b 0 -144 4 -128 0 -135 b 4 -160 0 -148 1 -154 b 63 -255 17 -196 45 -223 b 78 -266 68 -262 72 -266 z m 291 148 b 325 223 302 148 308 170 b 333 256 328 235 330 246 b 264 363 330 305 298 336 b 242 373 255 369 248 373 b 220 347 232 373 225 364 b 202 288 216 327 213 305 b 190 252 193 275 190 262 b 222 200 190 232 202 215 b 291 148 264 170 279 148 z m 815 -367 b 829 -359 819 -367 824 -364 b 851 -343 835 -353 844 -347 b 1375 6 1027 -228 1205 -117 l 1610 170 b 1644 235 1632 184 1643 203 b 1626 300 1639 253 1634 276 b 1590 337 1614 325 1604 337 b 1551 320 1580 337 1567 330 b 873 -135 1329 161 1103 10 b 749 -222 829 -161 785 -184 b 737 -245 742 -230 737 -238 b 742 -261 737 -249 739 -255 b 802 -357 755 -297 782 -325 b 815 -367 805 -363 809 -367 z m 396 -360 b 408 -356 400 -360 403 -359 b 609 -223 471 -307 543 -269 b 896 -19 706 -156 795 -81 b 1164 154 985 37 1074 96 b 1214 223 1189 170 1211 187 b 1176 321 1204 253 1205 292 b 1159 330 1169 327 1165 330 b 1145 324 1155 330 1151 328 b 1048 258 1113 302 1081 278 b 357 -202 809 117 598 -65 b 333 -238 341 -212 333 -223 b 338 -262 333 -245 334 -253 b 384 -350 350 -294 372 -318 b 396 -360 386 -354 390 -360 z m 1162 -438 b 1174 -433 1166 -438 1169 -436 b 1374 -300 1237 -384 1309 -346 b 1660 -96 1470 -233 1561 -158 b 1930 76 1751 -39 1840 19 b 1979 147 1954 92 1977 109 b 1943 243 1968 177 1971 216 b 1924 253 1935 251 1930 253 b 1911 248 1920 253 1915 252 b 1814 181 1878 225 1848 202 b 1123 -279 1575 40 1364 -141 b 1099 -315 1106 -289 1099 -300 b 1103 -338 1099 -321 1100 -330 b 1149 -426 1115 -370 1138 -396 b 1162 -438 1151 -432 1156 -438 z m 1875 -295 b 1882 -291 1878 -295 1879 -294 b 1934 -189 1904 -258 1921 -223 b 1872 -96 1925 -147 1901 -120 b 1840 -78 1858 -84 1848 -78 b 1812 -109 1830 -78 1823 -88 l 1777 -173 b 1770 -199 1773 -181 1770 -190 b 1786 -230 1770 -210 1774 -220 b 1862 -289 1809 -253 1837 -269 b 1875 -295 1865 -292 1871 -295 z',\n },\n repeatBarSlash: {\n x_min: 0,\n x_max: 630,\n y_min: -225.19160170741762,\n y_max: 265.12618221237005,\n ha: 490.31778391978764,\n o: 'm 78 -324 b 92 -314 82 -325 88 -321 b 114 -298 96 -307 107 -302 b 638 49 289 -183 467 -72 b 873 215 716 104 792 161 b 907 279 894 229 906 248 b 887 344 901 298 897 321 b 852 382 877 369 867 380 b 814 363 842 383 829 376 b 135 -91 603 192 364 55 b 12 -177 92 -118 45 -137 b 0 -202 4 -186 0 -192 b 4 -217 0 -206 1 -212 b 63 -312 17 -253 42 -284 b 78 -324 68 -318 72 -323 z',\n },\n csymDiminished: {\n x_min: 0,\n x_max: 506,\n y_min: -0.011036179317259481,\n y_max: 500,\n ha: 500.0110361793173,\n o: 'm 397 0 b 729 265 576 -1 729 95 b 711 367 729 297 723 331 b 472 670 668 498 586 595 b 315 720 423 701 372 720 b 253 713 295 720 275 719 b 32 514 144 687 75 615 b 0 374 12 468 0 420 b 27 251 0 333 9 292 b 140 117 52 196 92 153 b 397 0 223 52 317 4 z m 340 95 b 132 314 233 84 122 216 b 324 589 145 438 200 539 b 415 611 360 603 389 611 b 544 505 469 611 505 576 b 590 392 564 471 583 432 b 596 343 593 374 596 359 b 340 95 596 210 485 96 z',\n },\n csymHalfDiminished: {\n x_min: -32,\n x_max: 496,\n y_min: -33,\n y_max: 492,\n ha: 525,\n o: 'm -29 -48 b 0 -36 -19 -48 -9 -40 b 17 -20 7 -32 12 -24 b 134 94 56 19 95 56 b 372 0 207 43 282 0 b 455 13 397 0 426 4 b 677 258 556 45 671 141 b 678 289 677 268 678 278 b 593 539 678 380 654 467 b 592 541 593 540 592 540 l 684 632 b 713 678 700 647 711 665 b 714 691 714 684 714 688 b 707 704 714 698 711 701 b 691 708 701 707 696 708 b 660 691 680 708 670 701 l 552 585 b 478 634 530 606 507 624 b 361 684 438 648 397 661 b 301 703 341 697 320 703 b 226 677 275 703 251 693 b 27 449 140 618 72 543 b 0 324 9 410 -4 370 b 88 128 -1 243 30 177 b -30 -7 43 86 0 46 b -46 -33 -35 -16 -46 -24 b -42 -42 -46 -36 -45 -39 b -29 -48 -37 -46 -33 -48 z m 141 179 b 121 251 128 200 121 225 b 128 297 121 265 124 281 b 351 575 163 420 248 505 b 377 582 359 579 369 580 b 501 536 422 586 468 567 b 141 179 382 416 261 298 z m 281 105 b 179 137 240 105 206 117 b 210 168 189 147 200 157 l 537 487 b 547 455 541 477 544 467 b 556 370 552 426 556 397 b 429 154 556 274 503 207 b 281 105 384 122 336 105 z',\n },\n csymAugmented: {\n x_min: 0,\n x_max: 530,\n y_min: 0,\n y_max: 539,\n ha: 539,\n o: 'm 380 0 b 393 14 384 4 390 9 b 397 46 397 24 397 36 l 397 333 b 736 327 511 331 624 330 b 763 343 755 327 763 333 b 755 361 763 348 760 354 b 635 431 726 402 688 431 l 390 431 l 390 485 b 386 606 392 526 386 566 b 392 664 386 625 387 645 b 395 690 393 672 395 681 b 376 753 395 711 389 734 b 357 776 372 762 369 776 b 350 775 354 776 353 776 b 327 740 337 769 327 759 b 327 621 328 700 327 661 b 330 438 328 559 328 498 l 29 438 b 4 431 20 438 7 442 b 0 413 3 425 0 419 b 7 399 0 408 1 403 b 131 338 45 369 85 340 b 331 334 199 336 265 334 b 333 163 333 276 333 220 b 366 13 333 109 348 63 b 380 0 367 7 374 4 z',\n },\n csymMajorSeventh: {\n x_min: 0,\n x_max: 593.1050509327923,\n y_min: 0,\n y_max: 569,\n ha: 569,\n o: 'm 124 1 l 497 27 b 819 50 605 35 711 43 b 854 98 847 52 855 63 b 812 200 845 128 835 166 b 564 585 730 328 648 456 b 435 786 521 652 480 720 b 397 819 419 809 408 819 b 369 792 387 819 379 811 b 7 173 248 585 128 379 b 0 150 3 166 0 158 b 7 128 0 143 3 135 b 89 10 30 86 65 50 b 109 0 95 1 102 0 z m 163 147 b 153 153 158 147 156 148 b 164 179 147 163 158 170 b 426 644 251 334 338 488 b 442 660 432 655 436 660 b 458 645 446 660 452 655 b 727 220 547 503 636 361 b 736 202 732 213 736 206 b 714 190 736 196 730 192 b 179 148 537 177 359 163 b 163 147 174 150 168 147 z',\n },\n csymMinor: {\n x_min: 0,\n x_max: 481.64484584675915,\n y_min: 193,\n y_max: 265.20435472429375,\n ha: 72.20435472429375,\n o: 'm 168 278 b 197 279 177 278 187 278 b 431 292 275 287 353 288 l 431 291 b 661 302 508 295 585 300 b 693 311 672 304 688 300 b 674 346 697 324 685 338 b 564 382 641 366 606 384 l 27 360 b 0 347 17 360 1 366 b 19 314 0 333 3 321 b 168 278 66 291 115 278 z',\n },\n csymParensLeftTall: {\n x_min: 0,\n x_max: 185,\n y_min: 0,\n y_max: 1034,\n ha: 1034,\n o: 'm 215 0 b 226 17 223 1 223 10 b 229 37 229 24 229 32 b 220 81 229 52 225 66 b 167 203 206 124 181 160 b 86 616 124 338 89 474 b 82 765 85 665 82 716 b 91 886 82 805 84 845 b 245 1319 120 1038 171 1184 b 266 1397 259 1346 266 1371 b 259 1443 266 1411 264 1427 b 226 1489 253 1463 248 1489 b 193 1454 212 1489 203 1467 b 114 1292 158 1404 140 1346 b 0 806 40 1138 0 978 b 3 721 0 779 0 750 b 1 677 1 707 1 693 b 36 418 1 593 16 504 b 144 96 62 307 95 199 b 196 12 158 66 179 39 b 212 0 200 7 204 0 z',\n },\n csymParensRightTall: {\n x_min: -40,\n x_max: 188.5411603861406,\n y_min: 0.20204102886728756,\n y_max: 1058,\n ha: 1057.7979589711326,\n o: 'm 30 1 b 63 14 42 -3 55 6 b 122 99 86 40 108 68 b 189 258 145 153 166 204 b 271 667 239 379 268 503 b 246 852 275 708 261 780 b 10 1495 197 1077 128 1295 b -14 1524 4 1505 1 1524 b -16 1522 -14 1524 -16 1524 b -46 1489 -33 1521 -43 1503 b -58 1417 -53 1464 -58 1440 b -36 1335 -58 1390 -52 1364 b 68 1138 0 1270 35 1204 b 163 883 108 1056 137 969 b 206 668 184 814 200 742 b 207 631 207 655 207 642 b 166 426 207 560 192 492 b 46 143 130 330 111 228 b 19 29 19 109 17 69 b 30 1 20 19 24 3 z',\n },\n csymBracketLeftTall: {\n x_min: 0,\n x_max: 328,\n y_min: 2,\n y_max: 807,\n ha: 805,\n o: 'm 68 3 b 76 4 71 3 73 3 b 186 13 112 12 150 13 b 240 13 204 13 222 13 l 287 13 b 379 17 317 13 348 13 b 472 121 435 24 472 69 b 467 156 472 132 469 144 b 446 174 462 168 456 174 l 439 174 b 327 166 402 167 364 166 b 265 167 307 166 285 167 l 209 167 b 187 475 199 269 189 372 b 166 985 186 645 187 815 l 377 1002 b 415 1001 389 1002 402 1001 b 456 1027 432 1001 448 1005 b 472 1096 467 1048 472 1073 b 464 1146 472 1113 469 1130 b 439 1162 459 1161 452 1162 b 40 1129 305 1151 173 1139 b 1 1093 17 1128 1 1120 b 0 1009 0 1064 0 1037 b 13 975 0 991 3 981 b 30 670 23 873 30 772 b 29 608 30 649 29 628 l 29 563 b 56 88 29 405 49 246 b 53 22 55 66 55 43 b 68 3 53 12 56 3 z',\n },\n csymBracketRightTall: {\n x_min: 0.8519422934604696,\n x_max: 306,\n y_min: -0.17180889215212544,\n y_max: 829.1037519824849,\n ha: 829.2755608746371,\n o: 'm 117 0 b 372 29 203 -3 287 20 l 373 29 b 406 32 383 30 395 30 b 436 60 428 33 432 43 b 441 109 439 76 441 92 b 433 200 441 140 436 170 b 409 696 422 366 409 530 b 416 887 409 763 416 831 b 415 920 416 899 415 910 l 415 1106 b 412 1135 415 1116 415 1126 l 412 1145 b 373 1189 413 1171 408 1192 b 321 1189 356 1189 338 1189 l 215 1189 l 215 1194 l 56 1194 b 6 1153 27 1195 10 1187 b 1 1064 3 1123 4 1093 b 22 1043 0 1050 6 1043 b 84 1044 42 1044 63 1044 b 264 1038 144 1044 203 1040 b 265 958 264 1011 265 985 b 262 845 265 920 264 883 b 259 710 259 801 259 755 b 279 243 259 554 271 399 b 285 170 281 219 284 194 b 95 151 222 161 158 156 b 29 81 27 147 27 147 l 29 73 b 105 0 33 0 33 0 z',\n },\n csymParensLeftVeryTall: {\n x_min: 0,\n x_max: 116,\n y_min: 0,\n y_max: 934.1531437146923,\n ha: 934.1531437146923,\n o: 'm 128 0 b 147 17 137 0 144 9 b 167 102 160 45 167 73 b 158 154 167 120 164 137 b 117 307 141 204 130 256 b 63 698 84 435 71 567 b 62 788 62 729 62 757 b 69 916 62 829 63 873 b 109 1172 81 1001 94 1087 b 132 1320 118 1221 137 1269 b 124 1345 131 1329 134 1342 b 96 1332 114 1346 102 1341 b 71 1269 82 1313 75 1292 b 39 1104 59 1214 48 1159 b 0 742 19 988 0 871 b 10 559 3 688 6 624 b 58 226 16 446 33 336 b 112 20 73 157 94 89 b 128 0 115 13 118 0 z',\n },\n csymParensRightVeryTall: {\n x_min: -20,\n x_max: 111.4332498248095,\n y_min: -0.07657185734616112,\n y_max: 1009,\n ha: 1009.0765718573462,\n o: 'm -3 0 b 20 22 9 -1 14 12 b 36 56 26 33 32 45 b 99 274 58 128 84 199 b 160 788 135 439 163 605 b 122 1181 164 912 145 1047 b 50 1431 108 1267 86 1351 b 36 1453 48 1439 46 1453 l 35 1453 l 30 1453 b 7 1423 17 1449 7 1440 b 27 1287 9 1377 10 1331 b 96 963 71 1184 85 1074 b 105 818 102 914 105 867 b 91 624 105 753 99 688 b -4 213 72 484 48 344 b -29 101 -19 174 -29 138 b -16 27 -29 76 -24 52 b -3 0 -13 17 -14 3 z',\n },\n csymDiagonalArrangementSlash: {\n x_min: -0.19862981551275186,\n x_max: 990,\n y_min: -26.946823529189132,\n y_max: 1027.5514326488437,\n ha: 1054.4982561780328,\n o: 'm 14 -37 b 58 -9 35 -45 46 -22 b 392 333 170 105 279 217 l 765 711 b 1372 1329 968 916 1168 1125 b 1424 1439 1403 1359 1417 1397 b 1426 1457 1424 1444 1426 1450 b 1416 1477 1426 1466 1423 1475 b 1374 1462 1400 1485 1385 1473 b 1181 1269 1309 1397 1246 1331 b 736 831 1031 1122 884 979 b 356 452 609 704 485 576 b 32 132 246 347 143 236 b 0 50 7 109 1 84 b 6 9 -1 37 3 23 b 14 -37 10 -9 0 -32 z',\n },\n accidentalNarrowReversedFlat: {\n x_min: 0,\n x_max: 208,\n y_min: -231,\n y_max: 449,\n ha: 680,\n o: 'm 272 -333 b 284 -320 278 -333 281 -328 b 300 -174 297 -272 300 -222 b 275 190 298 -52 279 68 b 268 445 272 275 268 360 l 268 490 b 264 612 269 530 265 572 b 236 647 264 632 252 645 l 235 647 b 217 618 220 647 220 628 b 207 526 210 588 207 556 b 210 432 207 494 210 464 b 216 268 213 377 215 323 l 216 230 l 215 232 b 154 256 194 240 174 251 b 111 264 138 261 124 264 b 3 153 50 264 10 223 b 0 94 0 132 0 114 b 194 -276 0 -63 68 -186 b 255 -323 215 -291 236 -307 b 272 -333 262 -330 268 -333 z m 233 -138 b 71 30 168 -92 105 -45 b 63 59 65 42 63 50 b 96 95 62 75 73 86 b 130 102 108 99 120 102 b 215 76 160 102 187 88 l 220 73 b 225 -22 220 42 222 10 b 233 -138 229 -62 230 -101 z',\n },\n accidentalNarrowReversedFlatAndFlat: {\n x_min: 0,\n x_max: 335,\n y_min: -231,\n y_max: 449,\n ha: 680,\n o: 'm 151 490 b 148 612 151 530 150 572 b 132 647 148 632 141 645 b 122 618 124 647 124 628 b 117 526 118 588 117 556 b 118 432 117 494 118 464 b 121 268 120 377 121 323 l 121 232 b 86 256 109 240 98 251 b 62 264 78 261 69 264 b 1 153 29 264 6 223 b 0 94 0 132 0 114 b 109 -276 0 -63 37 -186 b 144 -323 121 -291 132 -307 b 153 -333 147 -330 151 -333 b 160 -320 157 -333 158 -328 b 168 -174 167 -272 168 -222 b 154 190 168 -52 157 68 b 151 445 153 275 151 360 z m 480 153 b 372 264 472 223 432 264 b 328 256 359 264 344 261 b 268 232 308 251 288 240 l 266 230 l 266 268 b 272 432 266 323 269 377 b 275 526 272 464 275 494 b 265 618 275 556 272 588 b 248 647 262 628 262 647 l 246 647 b 219 612 230 645 219 632 b 215 490 217 572 213 530 l 215 445 b 207 190 215 360 210 275 b 183 -174 203 68 183 -52 b 199 -320 183 -222 186 -272 b 210 -333 202 -328 204 -333 b 228 -323 215 -333 220 -330 b 288 -276 246 -307 268 -291 b 482 94 415 -186 482 -63 b 480 153 482 114 482 132 z m 40 30 b 36 59 36 42 36 50 b 55 95 35 75 42 86 b 73 102 60 99 68 102 b 121 76 89 102 105 88 l 124 73 b 127 -22 124 42 125 10 l 131 -138 b 40 30 95 -92 60 -43 z m 419 59 b 412 30 419 50 418 42 b 249 -138 374 -43 314 -92 b 258 -22 252 -101 253 -62 b 262 73 261 10 262 42 l 268 76 b 353 102 295 88 323 102 b 386 95 363 102 374 99 b 419 59 409 86 420 75 z',\n },\n accidentalWilsonPlus: {\n x_min: 0,\n x_max: 298,\n y_min: -218,\n y_max: 218,\n ha: 436,\n o: 'm 232 -314 b 236 -301 236 -310 236 -305 l 236 -295 b 243 -52 239 -213 242 -132 l 369 62 b 429 200 413 101 425 147 b 416 243 429 216 428 236 b 383 225 406 251 393 232 l 377 220 b 246 98 336 177 291 138 b 249 242 248 145 246 193 b 225 304 251 265 242 287 b 209 314 220 308 215 314 b 204 312 207 314 206 312 b 196 292 196 310 196 300 b 193 184 194 256 194 220 b 187 48 192 140 190 94 b 46 -72 141 7 94 -32 b 0 -163 13 -98 0 -127 b 1 -187 0 -170 0 -179 b 10 -235 4 -203 6 -219 b 20 -255 12 -242 14 -251 b 36 -245 26 -259 30 -249 b 181 -109 85 -200 132 -154 b 176 -258 180 -158 176 -209 b 232 -314 176 -298 186 -307 z',\n },\n accidentalWilsonMinus: {\n x_min: 0,\n x_max: 284.2093390143919,\n y_min: -163,\n y_max: 163,\n ha: 326,\n o: 'm 386 -232 b 409 -163 415 -222 408 -180 b 382 -69 410 -120 408 -89 b 32 228 264 30 141 118 b 17 235 26 233 22 235 b 3 219 9 235 3 228 b 0 157 3 199 0 179 b 29 69 0 125 6 95 b 323 -194 115 -29 222 -111 b 374 -235 338 -206 353 -235 b 386 -232 377 -235 382 -233 z',\n },\n },\n fontFamily: 'Petaluma',\n resolution: 1000,\n generatedOn: '2021-12-06T21:04:23.441Z',\n};\n","/**\n * The Petaluma font was created by Steinberg Media.\n * https://github.com/steinbergmedia/petaluma\n */\nexport const PetalumaMetrics = {\n name: 'Petaluma',\n smufl: true,\n stave: {\n padding: 15,\n endPaddingMax: 15,\n endPaddingMin: 7,\n unalignedNotePadding: 12,\n },\n accidental: {\n noteheadAccidentalPadding: 1,\n leftPadding: 2,\n accidentalSpacing: 3,\n },\n clef: {\n default: {\n point: 32,\n width: 26,\n },\n small: {\n point: 26,\n width: 20,\n },\n annotations: {\n '8va': {\n smuflCode: 'timeSig8',\n default: {\n point: 18,\n treble: {\n line: -1.4,\n shiftX: 12,\n },\n },\n small: {\n point: 16,\n treble: {\n line: -0.2,\n shiftX: 8,\n },\n },\n },\n '8vb': {\n smuflCode: 'timeSig8',\n default: {\n point: 18,\n treble: {\n line: 6,\n shiftX: 10,\n },\n bass: {\n line: 3.5,\n shiftX: 1,\n },\n },\n small: {\n point: 16,\n treble: {\n line: 5.3,\n shiftX: 6,\n },\n bass: {\n line: 3.1,\n shiftX: 0.5,\n },\n },\n },\n },\n // These may no longer be necessary\n lineCount: {\n '8': { point: 55, shiftY: 14 },\n '7': { point: 47, shiftY: 8 },\n '6': { point: 32, shiftY: 1 },\n '5': { point: 30, shiftY: -6 },\n '4': { point: 23, shiftY: -12 },\n },\n },\n parenthesis: {\n default: {\n point: 39,\n width: 7,\n },\n gracenote: {\n point: (39 * 3) / 5,\n width: 3,\n },\n },\n pedalMarking: {\n up: {\n point: 40,\n },\n down: {\n point: 34,\n },\n },\n // These are for numeric digits, such as in time signatures\n digits: {\n // used by timesig\n shiftLine: -1,\n point: 22,\n // used by tuplets\n tupletPoint: 16,\n shiftY: -2,\n },\n articulation: {\n articStaccatissimoAbove: {\n padding: 2,\n },\n articStaccatissimoBelow: {\n padding: 2,\n },\n },\n tremolo: {\n default: {\n point: 25,\n spacing: 5,\n offsetYStemUp: -5,\n offsetYStemDown: 5,\n offsetXStemUp: 13,\n offsetXStemDown: 1,\n },\n grace: {\n point: 18,\n spacing: 4,\n offsetYStemUp: -5,\n offsetYStemDown: 5,\n offsetXStemUp: 8,\n offsetXStemDown: 1,\n },\n },\n staveRepetition: {\n default: {\n offsetY: 25,\n offsetSymbol: 12,\n spacing: 5,\n },\n },\n noteHead: {\n displaced: {\n shiftX: -2,\n },\n },\n stem: {\n heightAdjustmentForFlag: -3,\n // These are stem (Y) offsets to the note heads. To shift the\n // noteheads (x-position) themselves, see glyphs.notehead.custom.\n noteHead: {\n noteheadTriangleUpHalf: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpBlack: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadTriangleUpWhole: {\n offsetYBaseStemUp: 5,\n offsetYBaseStemDown: 4,\n },\n noteheadXHalf: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXBlack: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadXWhole: {\n offsetYBaseStemUp: -4,\n offsetYBaseStemDown: 4,\n },\n noteheadHalf: {\n offsetYBaseStemDown: 1.8,\n offsetYBaseStemUp: -1.8,\n },\n noteheadBlack: {\n offsetYBaseStemDown: 2,\n offsetYBaseStemUp: -2,\n },\n noteheadSquareWhite: {\n offsetYBaseStemDown: -5,\n offsetYBaseStemUp: 5,\n },\n },\n },\n // Values under here are used by the Glyph class to reposition and rescale\n // glyphs based on their category. This should be the first stop for\n // custom font glyph repositioning.\n //\n // The glyph loader first looks up a specific set of settings based on the\n // glyph code, and if not found, uses the defaults from the category. See\n // glyphs.textNote for an example of this.\n //\n // Details in Glyph.lookupFontMetrics.\n glyphs: {\n coda: {\n point: 20,\n shiftX: -7,\n shiftY: 8,\n },\n segno: {\n shiftX: -7,\n },\n flag: {\n shiftX: -0.77,\n flag16thUp: {\n shiftX: -0.75,\n },\n flag32ndUp: {\n shiftX: -0.85,\n },\n flag64thUp: {\n shiftX: -1.55,\n },\n flag128thUp: {\n shiftX: -1.3,\n },\n flag16thDown: {\n shiftX: -0.75,\n },\n flag32ndDown: {\n shiftX: -0.76,\n },\n flag64thDown: {\n shiftX: -1.5,\n },\n flag128thDown: {\n shiftX: -1.2,\n },\n tabStem: {\n shiftX: -1.75,\n },\n staveTempo: {\n shiftX: -1,\n },\n },\n clef: {\n gClef: {\n default: { scale: 1.1, shiftY: 1 },\n small: { shiftY: 1.5 },\n },\n fClef: {\n default: { shiftY: -0.5 },\n },\n },\n ornament: {\n ornamentTurn: {\n scale: 1.2,\n },\n ornamentTurnSlash: {\n scale: 1.2,\n },\n },\n stringNumber: {\n verticalPadding: 8,\n stemPadding: 2,\n leftPadding: 5,\n rightPadding: 6,\n },\n stroke: {\n arrowheadBlackDown: {\n straight: {\n shiftX: -4.5,\n },\n wiggly: {\n shiftX: -1,\n shiftY: 1,\n },\n },\n arrowheadBlackUp: {\n straight: {\n shiftX: -0.85,\n },\n wiggly: {\n shiftX: -1,\n shiftY: 1,\n },\n },\n },\n textNote: {\n point: 34,\n breathMarkTick: {\n point: 36,\n shiftY: 9,\n },\n breathMarkComma: {\n point: 36,\n },\n segno: {\n point: 30,\n shiftX: -7,\n shiftY: 8,\n },\n coda: {\n point: 20,\n shiftX: -7,\n shiftY: 8,\n },\n ornamentTrill: {\n shiftX: -10,\n shiftY: 8,\n },\n ornamentMordent: {\n shiftX: -8,\n },\n ornamentShortTrill: {\n shiftX: -8,\n },\n },\n noteHead: {\n minPadding: 2,\n standard: {\n noteheadBlackStemUp: {\n shiftX: 0.5,\n },\n noteheadHalfStemUp: {\n shiftX: 0.725,\n },\n noteheadWholeStemUp: {\n shiftX: 1,\n },\n },\n custom: {\n noteheadCircleXStemUp: {\n shiftX: -1,\n },\n noteheadCircleXStemDown: {\n shiftX: 0.25,\n },\n noteheadDiamondHalfStemUp: {\n shiftX: 1.5,\n },\n noteheadDiamondBlackStemUp: {\n shiftX: 1.5,\n },\n noteheadDiamondWholeStemUp: {\n shiftX: 1,\n },\n noteheadXBlackStemUp: {\n shiftX: 1,\n },\n noteheadXHalfStemUp: {\n shiftX: -3,\n },\n noteheadXHalfStemDown: {\n shiftX: 1,\n },\n noteheadXWholeStemUp: {\n shiftX: -7,\n },\n noteheadXWholeStemDown: {\n shiftX: 1,\n },\n noteheadSquareWhiteStemDown: {\n shiftX: 0.25,\n },\n noteheadSquareWhiteStemUp: {\n shiftX: -0.75,\n },\n noteheadSquareBlackStemUp: {\n shiftX: -0.75,\n },\n noteheadTriangleUpWholeStemUp: {\n shiftX: -0.75,\n },\n },\n },\n chordSymbol: {\n global: {\n superscriptOffset: -400,\n subscriptOffset: 300,\n kerningOffset: -150,\n lowerKerningText: ['D', 'F', 'P', 'T', 'V', 'Y'],\n upperKerningText: ['L'],\n spacing: 20,\n superSubRatio: 0.73,\n },\n csymDiminished: {\n scale: 0.8,\n leftSideBearing: -95,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymHalfDiminished: {\n scale: 0.8,\n leftSideBearing: -32,\n advanceWidth: 506,\n yOffset: 0,\n },\n csymAugmented: {\n scale: 1,\n leftSideBearing: -25,\n advanceWidth: 530,\n yOffset: 0,\n },\n csymParensLeftTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 155,\n yOffset: 150,\n },\n csymParensRightTall: {\n scale: 0.8,\n leftSideBearing: 40,\n advanceWidth: 189,\n yOffset: 150,\n },\n csymBracketLeftTall: {\n scale: 0.8,\n leftSideBearing: 0,\n advanceWidth: 328,\n yOffset: 0,\n },\n csymBracketRightTall: {\n scale: 0.8,\n leftSideBearing: 1,\n advanceWidth: 600,\n yOffset: 0,\n },\n csymParensLeftVeryTall: {\n scale: 0.95,\n leftSideBearing: 0,\n advanceWidth: 210,\n yOffset: 250,\n },\n csymParensRightVeryTall: {\n scale: 0.9,\n leftSideBearing: -100,\n advanceWidth: 111,\n yOffset: 250,\n },\n csymDiagonalArrangementSlash: {\n scale: 0.6,\n leftSideBearing: -1,\n advanceWidth: 990,\n yOffset: 0,\n },\n csymMinor: {\n scale: 0.7,\n leftSideBearing: 0,\n advanceWidth: 482,\n yOffset: 0,\n },\n csymMajorSeventh: {\n scale: 0.8,\n leftSideBearing: 100,\n yOffset: 0,\n advanceWidth: 600,\n },\n accidentalSharp: {\n scale: 0.7,\n leftSideBearing: 0,\n advanceWidth: 425,\n yOffset: -422,\n },\n accidentalFlat: {\n scale: 0.8,\n leftSideBearing: -10,\n advanceWidth: 228,\n yOffset: -284,\n },\n },\n jazzOrnaments: {\n brassScoop: {\n scale: 1.0,\n xOffset: -12,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 10,\n },\n brassDoitMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassFallLipShort: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 0,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassLiftMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 5,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassFallRoughMedium: {\n scale: 1.0,\n xOffset: 16,\n yOffset: 26,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassBend: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -8,\n stemUpYOffset: 28,\n reportedWidth: 5,\n },\n brassMuteClosed: {\n scale: 1.0,\n xOffset: 3,\n yOffset: -8,\n stemUpYOffset: 26,\n reportedWidth: 5,\n },\n brassMuteOpen: {\n scale: 1.0,\n xOffset: 4,\n yOffset: -8,\n stemUpYOffset: 27,\n reportedWidth: 5,\n },\n brassFlip: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassJazzTurn: {\n scale: 1.0,\n xOffset: 6,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n brassSmear: {\n scale: 1.0,\n xOffset: 10,\n yOffset: -4,\n stemUpYOffset: 0,\n reportedWidth: 5,\n },\n },\n tuplet: {\n noteHeadOffset: 20,\n stemOffset: 10,\n bottomLine: 4,\n topModifierOffset: 20,\n },\n },\n};\n","export const PetalumaScriptFont = {\n spacing: 50,\n glyphs: {\n ' ': {\n x_min: 0,\n x_max: 250,\n y_min: 0,\n y_max: 500,\n ha: 500,\n leftSideBearing: 0,\n advanceWidth: 250,\n },\n '0': {\n x_min: 33,\n x_max: 534,\n y_min: -13,\n y_max: 751,\n ha: 764,\n leftSideBearing: 33,\n advanceWidth: 570,\n },\n '1': {\n x_min: 48,\n x_max: 235,\n y_min: -17,\n y_max: 734,\n ha: 751,\n leftSideBearing: 48,\n advanceWidth: 286,\n },\n '2': {\n x_min: 56,\n x_max: 571,\n y_min: -19,\n y_max: 741,\n ha: 760,\n leftSideBearing: 56,\n advanceWidth: 626,\n },\n '3': {\n x_min: 50,\n x_max: 528,\n y_min: -7,\n y_max: 731,\n ha: 738,\n leftSideBearing: 50,\n advanceWidth: 589,\n },\n '4': {\n x_min: 38,\n x_max: 564,\n y_min: -13,\n y_max: 743,\n ha: 756,\n leftSideBearing: 38,\n advanceWidth: 614,\n },\n '5': {\n x_min: 42,\n x_max: 601,\n y_min: -34,\n y_max: 743,\n ha: 777,\n leftSideBearing: 42,\n advanceWidth: 648,\n },\n '6': {\n x_min: 47,\n x_max: 606,\n y_min: -16,\n y_max: 743,\n ha: 759,\n leftSideBearing: 47,\n advanceWidth: 667,\n },\n '7': {\n x_min: 47,\n x_max: 567,\n y_min: 5,\n y_max: 739,\n ha: 734,\n leftSideBearing: 0,\n advanceWidth: 615,\n },\n '8': {\n x_min: 40,\n x_max: 541,\n y_min: -15,\n y_max: 752,\n ha: 767,\n leftSideBearing: 40,\n advanceWidth: 585,\n },\n '9': {\n x_min: 40,\n x_max: 537,\n y_min: -52,\n y_max: 736,\n ha: 788,\n leftSideBearing: 40,\n advanceWidth: 592,\n },\n '!': {\n x_min: 49,\n x_max: 180,\n y_min: -7,\n y_max: 761,\n ha: 768,\n leftSideBearing: 49,\n advanceWidth: 230,\n },\n '\"': {\n x_min: 39,\n x_max: 304,\n y_min: 596,\n y_max: 804,\n ha: 208,\n leftSideBearing: 39,\n advanceWidth: 353,\n },\n '#': {\n x_min: 33,\n x_max: 599,\n y_min: -8,\n y_max: 765,\n ha: 773,\n leftSideBearing: 33,\n advanceWidth: 648,\n },\n $: {\n x_min: 53,\n x_max: 495,\n y_min: -111,\n y_max: 823,\n ha: 934,\n leftSideBearing: 53,\n advanceWidth: 560,\n },\n '%': {\n x_min: 35,\n x_max: 656,\n y_min: -128,\n y_max: 808,\n ha: 936,\n leftSideBearing: 35,\n advanceWidth: 711,\n },\n '&': {\n x_min: 53,\n x_max: 441,\n y_min: -3,\n y_max: 753,\n ha: 756,\n leftSideBearing: 53,\n advanceWidth: 500,\n },\n \"'\": {\n x_min: 43,\n x_max: 161,\n y_min: 590,\n y_max: 811,\n ha: 221,\n leftSideBearing: 43,\n advanceWidth: 217,\n },\n '(': {\n x_min: 41,\n x_max: 311,\n y_min: -36,\n y_max: 845,\n ha: 881,\n leftSideBearing: 41,\n advanceWidth: 308,\n },\n ')': {\n x_min: -8,\n x_max: 257,\n y_min: -21,\n y_max: 852,\n ha: 873,\n leftSideBearing: -8,\n advanceWidth: 280,\n },\n '*': {\n x_min: 59,\n x_max: 539,\n y_min: 175,\n y_max: 589,\n ha: 414,\n leftSideBearing: 59,\n advanceWidth: 601,\n },\n '+': {\n x_min: 33,\n x_max: 361,\n y_min: 180,\n y_max: 587,\n ha: 407,\n leftSideBearing: 33,\n advanceWidth: 400,\n },\n ',': {\n x_min: 15,\n x_max: 176,\n y_min: -129,\n y_max: 92,\n ha: 221,\n leftSideBearing: 15,\n advanceWidth: 205,\n },\n '-': {\n x_min: 40,\n x_max: 380,\n y_min: 317,\n y_max: 452,\n ha: 135,\n leftSideBearing: 40,\n advanceWidth: 422,\n },\n '.': {\n x_min: 48,\n x_max: 185,\n y_min: -56,\n y_max: 84,\n ha: 140,\n leftSideBearing: 48,\n advanceWidth: 227,\n },\n '/': {\n x_min: -58,\n x_max: 654,\n y_min: -122,\n y_max: 844,\n ha: 966,\n leftSideBearing: -58,\n advanceWidth: 626,\n },\n ':': {\n x_min: 65,\n x_max: 225,\n y_min: 97,\n y_max: 536,\n ha: 439,\n leftSideBearing: 65,\n advanceWidth: 302,\n },\n ';': {\n x_min: 13,\n x_max: 295,\n y_min: -139,\n y_max: 536,\n ha: 675,\n leftSideBearing: 13,\n advanceWidth: 334,\n },\n '<': {\n x_min: 28,\n x_max: 438,\n y_min: -1,\n y_max: 607,\n ha: 608,\n leftSideBearing: 28,\n advanceWidth: 475,\n },\n '=': {\n x_min: 40,\n x_max: 383,\n y_min: 199.9598640852289,\n y_max: 541,\n ha: 341.0401359147711,\n leftSideBearing: 40,\n advanceWidth: 422,\n },\n '>': {\n x_min: 35,\n x_max: 421,\n y_min: 28,\n y_max: 632,\n ha: 604,\n leftSideBearing: 35,\n advanceWidth: 466,\n },\n '?': {\n x_min: 45,\n x_max: 548,\n y_min: -17,\n y_max: 767,\n ha: 784,\n leftSideBearing: 45,\n advanceWidth: 592,\n },\n '@': {\n x_min: 51,\n x_max: 730,\n y_min: -78,\n y_max: 753,\n ha: 831,\n leftSideBearing: 51,\n advanceWidth: 781,\n },\n A: {\n x_min: 37,\n x_max: 554,\n y_min: -4,\n y_max: 746,\n ha: 750,\n leftSideBearing: 37,\n advanceWidth: 617,\n },\n B: {\n x_min: 37,\n x_max: 532,\n y_min: 3,\n y_max: 783,\n ha: 780,\n leftSideBearing: 37,\n advanceWidth: 579,\n },\n C: {\n x_min: 37,\n x_max: 583,\n y_min: -3,\n y_max: 775,\n ha: 778,\n leftSideBearing: 37,\n advanceWidth: 623,\n },\n D: {\n x_min: 50,\n x_max: 530,\n y_min: -15,\n y_max: 749,\n ha: 764,\n leftSideBearing: 50,\n advanceWidth: 579,\n },\n E: {\n x_min: 45,\n x_max: 531,\n y_min: -1,\n y_max: 743,\n ha: 744,\n leftSideBearing: 45,\n advanceWidth: 585,\n },\n F: {\n x_min: 45,\n x_max: 459,\n y_min: 23,\n y_max: 727,\n ha: 704,\n leftSideBearing: 45,\n advanceWidth: 510,\n },\n G: {\n x_min: 31,\n x_max: 577,\n y_min: -8,\n y_max: 733,\n ha: 741,\n leftSideBearing: 31,\n advanceWidth: 611,\n },\n H: {\n x_min: 37,\n x_max: 493,\n y_min: -22,\n y_max: 758,\n ha: 780,\n leftSideBearing: 37,\n advanceWidth: 535,\n },\n I: {\n x_min: 47,\n x_max: 501,\n y_min: -3,\n y_max: 731,\n ha: 734,\n leftSideBearing: 47,\n advanceWidth: 541,\n },\n J: {\n x_min: 33,\n x_max: 531,\n y_min: -23,\n y_max: 725,\n ha: 748,\n leftSideBearing: 33,\n advanceWidth: 573,\n },\n K: {\n x_min: 43,\n x_max: 505,\n y_min: -10,\n y_max: 740,\n ha: 750,\n leftSideBearing: 43,\n advanceWidth: 560,\n },\n L: {\n x_min: 49,\n x_max: 457,\n y_min: -2,\n y_max: 746,\n ha: 748,\n leftSideBearing: 49,\n advanceWidth: 510,\n },\n M: {\n x_min: 35,\n x_max: 699,\n y_min: 1,\n y_max: 744,\n ha: 743,\n leftSideBearing: 35,\n advanceWidth: 743,\n },\n N: {\n x_min: 34,\n x_max: 533,\n y_min: -17,\n y_max: 761,\n ha: 778,\n leftSideBearing: 34,\n advanceWidth: 579,\n },\n O: {\n x_min: 41,\n x_max: 608,\n y_min: -5,\n y_max: 735,\n ha: 740,\n leftSideBearing: 41,\n advanceWidth: 667,\n },\n P: {\n x_min: 53,\n x_max: 451,\n y_min: -18,\n y_max: 735,\n ha: 753,\n leftSideBearing: 53,\n advanceWidth: 497,\n },\n Q: {\n x_min: 40,\n x_max: 599,\n y_min: -67,\n y_max: 744,\n ha: 811,\n leftSideBearing: 40,\n advanceWidth: 648,\n },\n R: {\n x_min: 39,\n x_max: 487,\n y_min: 16,\n y_max: 735,\n ha: 719,\n leftSideBearing: 39,\n advanceWidth: 535,\n },\n S: {\n x_min: 35,\n x_max: 552,\n y_min: -47,\n y_max: 708,\n ha: 755,\n leftSideBearing: 35,\n advanceWidth: 604,\n },\n T: {\n x_min: 26,\n x_max: 656,\n y_min: -13,\n y_max: 718,\n ha: 731,\n leftSideBearing: 26,\n advanceWidth: 705,\n },\n U: {\n x_min: 41,\n x_max: 518,\n y_min: -20,\n y_max: 748,\n ha: 768,\n leftSideBearing: 41,\n advanceWidth: 567,\n },\n V: {\n x_min: 47,\n x_max: 509,\n y_min: -26,\n y_max: 744,\n ha: 770,\n leftSideBearing: 47,\n advanceWidth: 567,\n },\n W: {\n x_min: 44,\n x_max: 789,\n y_min: -35,\n y_max: 720,\n ha: 755,\n leftSideBearing: 44,\n advanceWidth: 833,\n },\n X: {\n x_min: 63,\n x_max: 635,\n y_min: -10,\n y_max: 745,\n ha: 755,\n leftSideBearing: 63,\n advanceWidth: 680,\n },\n Y: {\n x_min: 43,\n x_max: 503,\n y_min: -21,\n y_max: 734,\n ha: 755,\n leftSideBearing: 43,\n advanceWidth: 541,\n },\n Z: {\n x_min: 42,\n x_max: 584,\n y_min: -10,\n y_max: 739,\n ha: 749,\n leftSideBearing: 42,\n advanceWidth: 629,\n },\n '[': {\n x_min: 46,\n x_max: 346,\n y_min: -150,\n y_max: 884,\n ha: 1034,\n leftSideBearing: 46,\n advanceWidth: 291,\n },\n '\\\\': {\n x_min: 20,\n x_max: 616,\n y_min: -100,\n y_max: 797,\n ha: 897,\n leftSideBearing: 20,\n advanceWidth: 645,\n },\n ']': {\n x_min: -76,\n x_max: 226,\n y_min: -150,\n y_max: 881,\n ha: 1031,\n leftSideBearing: -76,\n advanceWidth: 297,\n },\n '^': {\n x_min: 43,\n x_max: 437,\n y_min: 517,\n y_max: 812,\n ha: 295,\n leftSideBearing: 43,\n advanceWidth: 478,\n },\n _: {\n x_min: 29,\n x_max: 563,\n y_min: -110,\n y_max: -1,\n ha: 109,\n leftSideBearing: 29,\n advanceWidth: 598,\n },\n '`': {\n x_min: 54,\n x_max: 321,\n y_min: 540,\n y_max: 747,\n ha: 207,\n leftSideBearing: 54,\n advanceWidth: 368,\n },\n a: {\n x_min: 20,\n x_max: 447,\n y_min: -17,\n y_max: 495,\n ha: 512,\n leftSideBearing: 20,\n advanceWidth: 494,\n },\n b: {\n x_min: 37,\n x_max: 466,\n y_min: -27,\n y_max: 770,\n ha: 797,\n leftSideBearing: 37,\n advanceWidth: 510,\n },\n c: {\n x_min: 35,\n x_max: 456,\n y_min: -9,\n y_max: 507,\n ha: 516,\n leftSideBearing: 35,\n advanceWidth: 460,\n },\n d: {\n x_min: 45,\n x_max: 520,\n y_min: -15,\n y_max: 764,\n ha: 779,\n leftSideBearing: 45,\n advanceWidth: 560,\n },\n e: {\n x_min: 33,\n x_max: 370,\n y_min: -5,\n y_max: 501,\n ha: 506,\n leftSideBearing: 33,\n advanceWidth: 397,\n },\n f: {\n x_min: 35,\n x_max: 411,\n y_min: -13,\n y_max: 695,\n ha: 708,\n leftSideBearing: 35,\n advanceWidth: 453,\n },\n g: {\n x_min: 33,\n x_max: 551,\n y_min: -257,\n y_max: 505,\n ha: 762,\n leftSideBearing: 33,\n advanceWidth: 611,\n },\n h: {\n x_min: 32,\n x_max: 458,\n y_min: -29,\n y_max: 743,\n ha: 772,\n leftSideBearing: 32,\n advanceWidth: 491,\n },\n i: {\n x_min: 45,\n x_max: 167,\n y_min: -13,\n y_max: 631,\n ha: 644,\n leftSideBearing: 45,\n advanceWidth: 220,\n },\n j: {\n x_min: -127,\n x_max: 261,\n y_min: -231,\n y_max: 601,\n ha: 832,\n leftSideBearing: -127,\n advanceWidth: 308,\n },\n k: {\n x_min: 39,\n x_max: 443,\n y_min: -3,\n y_max: 700,\n ha: 703,\n leftSideBearing: 39,\n advanceWidth: 497,\n },\n l: {\n x_min: 58,\n x_max: 168,\n y_min: -8,\n y_max: 686,\n ha: 694,\n leftSideBearing: 58,\n advanceWidth: 227,\n },\n m: {\n x_min: 39,\n x_max: 688,\n y_min: -14,\n y_max: 501,\n ha: 515,\n leftSideBearing: 39,\n advanceWidth: 718,\n },\n n: {\n x_min: 45,\n x_max: 491,\n y_min: -32,\n y_max: 512,\n ha: 544,\n leftSideBearing: 45,\n advanceWidth: 541,\n },\n o: {\n x_min: 41,\n x_max: 424,\n y_min: -12,\n y_max: 493,\n ha: 505,\n leftSideBearing: 41,\n advanceWidth: 447,\n },\n p: {\n x_min: 25,\n x_max: 529,\n y_min: -260,\n y_max: 500,\n ha: 760,\n leftSideBearing: 25,\n advanceWidth: 573,\n },\n q: {\n x_min: 53,\n x_max: 603,\n y_min: -235,\n y_max: 514,\n ha: 749,\n leftSideBearing: 53,\n advanceWidth: 623,\n },\n r: {\n x_min: 32,\n x_max: 407,\n y_min: -7,\n y_max: 492,\n ha: 499,\n leftSideBearing: 32,\n advanceWidth: 460,\n },\n s: {\n x_min: 49,\n x_max: 416,\n y_min: -12,\n y_max: 519,\n ha: 531,\n leftSideBearing: 49,\n advanceWidth: 460,\n },\n t: {\n x_min: 32,\n x_max: 442,\n y_min: -5,\n y_max: 684,\n ha: 689,\n leftSideBearing: 32,\n advanceWidth: 469,\n },\n u: {\n x_min: 41,\n x_max: 487,\n y_min: -5,\n y_max: 507,\n ha: 512,\n leftSideBearing: 41,\n advanceWidth: 510,\n },\n v: {\n x_min: 16,\n x_max: 441,\n y_min: -20,\n y_max: 542,\n ha: 562,\n leftSideBearing: 16,\n advanceWidth: 456,\n },\n w: {\n x_min: 39,\n x_max: 639,\n y_min: -22,\n y_max: 505,\n ha: 527,\n leftSideBearing: 39,\n advanceWidth: 661,\n },\n x: {\n x_min: 15,\n x_max: 505,\n y_min: -39,\n y_max: 539,\n ha: 578,\n leftSideBearing: 15,\n advanceWidth: 541,\n },\n y: {\n x_min: -98,\n x_max: 501,\n y_min: -242,\n y_max: 511,\n ha: 753,\n leftSideBearing: -98,\n advanceWidth: 548,\n },\n z: {\n x_min: 27,\n x_max: 479,\n y_min: -3,\n y_max: 494,\n ha: 497,\n leftSideBearing: 27,\n advanceWidth: 494,\n },\n '{': {\n x_min: 0,\n x_max: 0,\n y_min: 0,\n y_max: 0,\n ha: 0,\n leftSideBearing: 0,\n advanceWidth: 308,\n },\n '|': {\n x_min: 0,\n x_max: 0,\n y_min: 0,\n y_max: 0,\n ha: 0,\n leftSideBearing: 0,\n advanceWidth: 308,\n },\n '}': {\n x_min: 0,\n x_max: 0,\n y_min: 0,\n y_max: 0,\n ha: 0,\n leftSideBearing: 0,\n advanceWidth: 308,\n },\n '~': {\n x_min: 0,\n x_max: 0,\n y_min: 0,\n y_max: 0,\n ha: 0,\n leftSideBearing: 0,\n advanceWidth: 308,\n },\n },\n fontFamily: 'PetalumaScript',\n resolution: 1000,\n generatedOn: '2020-06-14T18:33:25.407Z',\n};\n","export const RobotoSlabFont = {\n spacing: 50,\n glyphs: {\n ' ': {\n x_min: 0,\n x_max: 509,\n y_min: 0,\n y_max: 2000,\n ha: 2000,\n leftSideBearing: 0,\n advanceWidth: 509,\n },\n '0': {\n x_min: 121,\n x_max: 1048,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 121,\n advanceWidth: 1168,\n },\n '1': {\n x_min: 117,\n x_max: 767,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 117,\n advanceWidth: 844,\n },\n '2': {\n x_min: 75.8474576645637,\n x_max: 1040,\n y_min: 0,\n y_max: 1477,\n ha: 1477,\n leftSideBearing: 75,\n advanceWidth: 1131,\n },\n '3': {\n x_min: 74.85365853658536,\n x_max: 994,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 74,\n advanceWidth: 1106,\n },\n '4': {\n x_min: 63,\n x_max: 1114,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 63,\n advanceWidth: 1187,\n },\n '5': {\n x_min: 96.8448275474953,\n x_max: 982,\n y_min: -21,\n y_max: 1456,\n ha: 1477,\n leftSideBearing: 96,\n advanceWidth: 1081,\n },\n '6': {\n x_min: 121,\n x_max: 1067,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 121,\n advanceWidth: 1144,\n },\n '7': {\n x_min: 76,\n x_max: 1060,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: -30,\n advanceWidth: 1128,\n },\n '8': {\n x_min: 92,\n x_max: 1039,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 92,\n advanceWidth: 1131,\n },\n '9': {\n x_min: 84,\n x_max: 1026,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 84,\n advanceWidth: 1154,\n },\n '!': {\n x_min: 143,\n x_max: 340,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 143,\n advanceWidth: 483,\n },\n '\"': {\n x_min: 166,\n x_max: 634,\n y_min: 1055,\n y_max: 1560,\n ha: 505,\n leftSideBearing: 166,\n advanceWidth: 770,\n },\n '#': {\n x_min: 63,\n x_max: 1179,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 63,\n advanceWidth: 1246,\n },\n $: {\n x_min: 81.92156915727656,\n x_max: 1012,\n y_min: -208,\n y_max: 1693,\n ha: 1901,\n leftSideBearing: 81,\n advanceWidth: 1110,\n },\n '%': {\n x_min: 77,\n x_max: 1384,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 77,\n advanceWidth: 1460,\n },\n '&': {\n x_min: 74,\n x_max: 1242,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 74,\n advanceWidth: 1289,\n },\n \"'\": {\n x_min: 166,\n x_max: 324,\n y_min: 1055,\n y_max: 1560,\n ha: 505,\n leftSideBearing: 166,\n advanceWidth: 460,\n },\n '(': {\n x_min: 114,\n x_max: 650,\n y_min: -463,\n y_max: 1636,\n ha: 2099,\n leftSideBearing: 114,\n advanceWidth: 662,\n },\n ')': {\n x_min: 11,\n x_max: 547,\n y_min: -463,\n y_max: 1636,\n ha: 2099,\n leftSideBearing: 11,\n advanceWidth: 654,\n },\n '*': {\n x_min: 66,\n x_max: 893,\n y_min: 607,\n y_max: 1456,\n ha: 849,\n leftSideBearing: 66,\n advanceWidth: 958,\n },\n '+': {\n x_min: 73,\n x_max: 1071,\n y_min: 146,\n y_max: 1206,\n ha: 1060,\n leftSideBearing: 73,\n advanceWidth: 1145,\n },\n ',': {\n x_min: 23,\n x_max: 315,\n y_min: -311,\n y_max: 221,\n ha: 532,\n leftSideBearing: 23,\n advanceWidth: 404,\n },\n '-': {\n x_min: 154,\n x_max: 643,\n y_min: 538,\n y_max: 692,\n ha: 154,\n leftSideBearing: 154,\n advanceWidth: 797,\n },\n '.': {\n x_min: 145,\n x_max: 342,\n y_min: 0,\n y_max: 202,\n ha: 202,\n leftSideBearing: 145,\n advanceWidth: 493,\n },\n '/': {\n x_min: 0,\n x_max: 774,\n y_min: -125,\n y_max: 1456,\n ha: 1581,\n leftSideBearing: 0,\n advanceWidth: 824,\n },\n ':': {\n x_min: 145,\n x_max: 342,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 145,\n advanceWidth: 419,\n },\n ';': {\n x_min: 53,\n x_max: 345,\n y_min: -311,\n y_max: 1082,\n ha: 1393,\n leftSideBearing: 53,\n advanceWidth: 424,\n },\n '<': {\n x_min: 76,\n x_max: 892,\n y_min: 107,\n y_max: 1013,\n ha: 906,\n leftSideBearing: 76,\n advanceWidth: 1017,\n },\n '=': {\n x_min: 147,\n x_max: 981,\n y_min: 407,\n y_max: 987,\n ha: 580,\n leftSideBearing: 147,\n advanceWidth: 1127,\n },\n '>': {\n x_min: 125,\n x_max: 980,\n y_min: 87,\n y_max: 993,\n ha: 906,\n leftSideBearing: 125,\n advanceWidth: 1060,\n },\n '?': {\n x_min: 65.92660602419838,\n x_max: 890,\n y_min: 0,\n y_max: 1477,\n ha: 1477,\n leftSideBearing: 65,\n advanceWidth: 953,\n },\n '@': {\n x_min: 84.3592218305664,\n x_max: 1705.2346925277395,\n y_min: -453,\n y_max: 1431,\n ha: 1884,\n leftSideBearing: 84,\n advanceWidth: 1821,\n },\n A: {\n x_min: 70,\n x_max: 1463,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 70,\n advanceWidth: 1533,\n },\n B: {\n x_min: 81,\n x_max: 1253,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1322,\n },\n C: {\n x_min: 80,\n x_max: 1174,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 80,\n advanceWidth: 1290,\n },\n D: {\n x_min: 81,\n x_max: 1291,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1356,\n },\n E: {\n x_min: 81,\n x_max: 1190,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1306,\n },\n F: {\n x_min: 81,\n x_max: 1176,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1256,\n },\n G: {\n x_min: 80,\n x_max: 1226,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 80,\n advanceWidth: 1346,\n },\n H: {\n x_min: 81,\n x_max: 1497,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1578,\n },\n I: {\n x_min: 81,\n x_max: 604,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 685,\n },\n J: {\n x_min: 60,\n x_max: 1100,\n y_min: -21,\n y_max: 1456,\n ha: 1477,\n leftSideBearing: 60,\n advanceWidth: 1169,\n },\n K: {\n x_min: 81,\n x_max: 1427,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1501,\n },\n L: {\n x_min: 81,\n x_max: 1130,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1210,\n },\n M: {\n x_min: 94,\n x_max: 1888,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 94,\n advanceWidth: 1982,\n },\n N: {\n x_min: 83,\n x_max: 1509,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 83,\n advanceWidth: 1592,\n },\n O: {\n x_min: 70,\n x_max: 1281,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 70,\n advanceWidth: 1351,\n },\n P: {\n x_min: 81,\n x_max: 1242,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 81,\n advanceWidth: 1297,\n },\n Q: {\n x_min: 70,\n x_max: 1348,\n y_min: -245,\n y_max: 1477,\n ha: 1722,\n leftSideBearing: 70,\n advanceWidth: 1376,\n },\n R: {\n x_min: 81,\n x_max: 1285,\n y_min: 0,\n y_max: 1455,\n ha: 1455,\n leftSideBearing: 81,\n advanceWidth: 1385,\n },\n S: {\n x_min: 115,\n x_max: 1116,\n y_min: -21,\n y_max: 1477,\n ha: 1498,\n leftSideBearing: 115,\n advanceWidth: 1206,\n },\n T: {\n x_min: 96,\n x_max: 1306,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 96,\n advanceWidth: 1406,\n },\n U: {\n x_min: 70,\n x_max: 1452,\n y_min: -21,\n y_max: 1456,\n ha: 1477,\n leftSideBearing: 70,\n advanceWidth: 1522,\n },\n V: {\n x_min: 65,\n x_max: 1443,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 65,\n advanceWidth: 1508,\n },\n W: {\n x_min: 72,\n x_max: 2057,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 72,\n advanceWidth: 2129,\n },\n X: {\n x_min: 80,\n x_max: 1449,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 80,\n advanceWidth: 1529,\n },\n Y: {\n x_min: 65,\n x_max: 1396,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 65,\n advanceWidth: 1461,\n },\n Z: {\n x_min: 90,\n x_max: 1107,\n y_min: 0,\n y_max: 1456,\n ha: 1456,\n leftSideBearing: 90,\n advanceWidth: 1197,\n },\n '[': {\n x_min: 157,\n x_max: 541,\n y_min: -312,\n y_max: 1664,\n ha: 1976,\n leftSideBearing: 157,\n advanceWidth: 573,\n },\n '\\\\': {\n x_min: 36,\n x_max: 830,\n y_min: -125,\n y_max: 1456,\n ha: 1581,\n leftSideBearing: 36,\n advanceWidth: 841,\n },\n ']': {\n x_min: 23,\n x_max: 408,\n y_min: -312,\n y_max: 1664,\n ha: 1976,\n leftSideBearing: 23,\n advanceWidth: 552,\n },\n '^': {\n x_min: 71,\n x_max: 802,\n y_min: 729,\n y_max: 1456,\n ha: 727,\n leftSideBearing: 71,\n advanceWidth: 864,\n },\n _: {\n x_min: 119,\n x_max: 1041,\n y_min: -154,\n y_max: 0,\n ha: 154,\n leftSideBearing: 119,\n advanceWidth: 1168,\n },\n '`': {\n x_min: 40,\n x_max: 456,\n y_min: 1288,\n y_max: 1560,\n ha: 272,\n leftSideBearing: 40,\n advanceWidth: 496,\n },\n a: {\n x_min: 79,\n x_max: 1053,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 79,\n advanceWidth: 1132,\n },\n b: {\n x_min: -16,\n x_max: 1071,\n y_min: -21,\n y_max: 1560,\n ha: 1581,\n leftSideBearing: -16,\n advanceWidth: 1145,\n },\n c: {\n x_min: 78,\n x_max: 988,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 78,\n advanceWidth: 1067,\n },\n d: {\n x_min: 78,\n x_max: 1156,\n y_min: -21,\n y_max: 1560,\n ha: 1581,\n leftSideBearing: 78,\n advanceWidth: 1218,\n },\n e: {\n x_min: 74,\n x_max: 980,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 74,\n advanceWidth: 1059,\n },\n f: {\n x_min: 64,\n x_max: 731,\n y_min: 0,\n y_max: 1581,\n ha: 1581,\n leftSideBearing: 64,\n advanceWidth: 725,\n },\n g: {\n x_min: 78,\n x_max: 1133,\n y_min: -437,\n y_max: 1102,\n ha: 1539,\n leftSideBearing: 78,\n advanceWidth: 1157,\n },\n h: {\n x_min: 49,\n x_max: 1255,\n y_min: 0,\n y_max: 1560,\n ha: 1560,\n leftSideBearing: 49,\n advanceWidth: 1315,\n },\n i: {\n x_min: 67,\n x_max: 590,\n y_min: 0,\n y_max: 1560,\n ha: 1560,\n leftSideBearing: 67,\n advanceWidth: 652,\n },\n j: {\n x_min: -56,\n x_max: 381,\n y_min: -437,\n y_max: 1560,\n ha: 1997,\n leftSideBearing: -56,\n advanceWidth: 525,\n },\n k: {\n x_min: 64,\n x_max: 1248,\n y_min: 0,\n y_max: 1560,\n ha: 1560,\n leftSideBearing: 64,\n advanceWidth: 1287,\n },\n l: {\n x_min: 64,\n x_max: 587,\n y_min: 0,\n y_max: 1560,\n ha: 1560,\n leftSideBearing: 64,\n advanceWidth: 653,\n },\n m: {\n x_min: 74,\n x_max: 1905,\n y_min: 0,\n y_max: 1102,\n ha: 1102,\n leftSideBearing: 74,\n advanceWidth: 1977,\n },\n n: {\n x_min: 74,\n x_max: 1278,\n y_min: 0,\n y_max: 1102,\n ha: 1102,\n leftSideBearing: 74,\n advanceWidth: 1343,\n },\n o: {\n x_min: 78,\n x_max: 1046,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 78,\n advanceWidth: 1124,\n },\n p: {\n x_min: 34,\n x_max: 1119,\n y_min: -416,\n y_max: 1102,\n ha: 1518,\n leftSideBearing: 34,\n advanceWidth: 1197,\n },\n q: {\n x_min: 78,\n x_max: 1135,\n y_min: -416,\n y_max: 1102,\n ha: 1518,\n leftSideBearing: 78,\n advanceWidth: 1139,\n },\n r: {\n x_min: 72,\n x_max: 808,\n y_min: 0,\n y_max: 1102,\n ha: 1102,\n leftSideBearing: 72,\n advanceWidth: 854,\n },\n s: {\n x_min: 104,\n x_max: 933,\n y_min: -21,\n y_max: 1102,\n ha: 1123,\n leftSideBearing: 104,\n advanceWidth: 1022,\n },\n t: {\n x_min: 24,\n x_max: 678,\n y_min: -17,\n y_max: 1343,\n ha: 1360,\n leftSideBearing: 24,\n advanceWidth: 730,\n },\n u: {\n x_min: 52,\n x_max: 1181,\n y_min: -21,\n y_max: 1082,\n ha: 1103,\n leftSideBearing: 52,\n advanceWidth: 1245,\n },\n v: {\n x_min: 26,\n x_max: 1176,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 26,\n advanceWidth: 1206,\n },\n w: {\n x_min: 52,\n x_max: 1777,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 52,\n advanceWidth: 1823,\n },\n x: {\n x_min: 42,\n x_max: 1163,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 42,\n advanceWidth: 1203,\n },\n y: {\n x_min: 24,\n x_max: 1172,\n y_min: -437,\n y_max: 1082,\n ha: 1519,\n leftSideBearing: 24,\n advanceWidth: 1192,\n },\n z: {\n x_min: 88,\n x_max: 960,\n y_min: 0,\n y_max: 1082,\n ha: 1082,\n leftSideBearing: 88,\n advanceWidth: 1032,\n },\n '{': {\n x_min: 63,\n x_max: 671,\n y_min: -364,\n y_max: 1597,\n ha: 1961,\n leftSideBearing: 63,\n advanceWidth: 701,\n },\n '|': {\n x_min: 150,\n x_max: 307,\n y_min: -270,\n y_max: 1456,\n ha: 1726,\n leftSideBearing: 150,\n advanceWidth: 451,\n },\n '}': {\n x_min: 27,\n x_max: 635,\n y_min: -364,\n y_max: 1597,\n ha: 1961,\n leftSideBearing: 27,\n advanceWidth: 701,\n },\n '~': {\n x_min: 121,\n x_max: 1257,\n y_min: 401,\n y_max: 803,\n ha: 402,\n leftSideBearing: 121,\n advanceWidth: 1386,\n },\n },\n fontFamily: 'Roboto Slab',\n resolution: 2048,\n generatedOn: '2020-06-15T19:12:58.120Z',\n};\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n// If you are adding a new music engraving font, search for instances of ADD_MUSIC_FONT throughout the code base.\n// To compile your new font into vexflow.js, take a look at src/fonts/load_all.ts\n// You can export a font module which can be dynamically loaded by vexflow-core.js (see: Gruntfile.js).\n// ADD_MUSIC_FONT\n// To add a new music engraving font XXX, make a copy of this file and name it load_xxx.ts.\n// Then you will need to generate xxx_glyphs.ts and xxx_metrics.ts.\n// xxx_glyphs.ts is created by tools/fonts/fontgen_smufl.js\n// xxx_metrics.ts is created by hand. You could copy bravura_metrics.ts and modify/remove/add entries where necessary.\nimport { Font } from '../font';\nimport { BravuraFont } from './bravura_glyphs';\nimport { BravuraMetrics } from './bravura_metrics';\nexport function loadBravura() {\n Font.load('Bravura', BravuraFont, BravuraMetrics);\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from '../font';\nimport { GonvilleFont } from './gonville_glyphs';\nimport { GonvilleMetrics } from './gonville_metrics';\nexport function loadGonville() {\n Font.load('Gonville', GonvilleFont, GonvilleMetrics);\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from '../font';\nimport { PetalumaFont } from './petaluma_glyphs';\nimport { PetalumaMetrics } from './petaluma_metrics';\nexport function loadPetaluma() {\n Font.load('Petaluma', PetalumaFont, PetalumaMetrics);\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from '../font';\nimport { CustomFont } from './custom_glyphs';\nimport { CustomMetrics } from './custom_metrics';\nexport function loadCustom() {\n Font.load('Custom', CustomFont, CustomMetrics);\n}\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\n//\n// vexflow.ts is the entry point for the build output file vexflow.js.\n// It statically bundles all the music engraving fonts, and sets the music font stack to:\n// Flow.setMusicFont('Bravura', 'Gonville', 'Custom');\n// The webpack config inside Gruntfile.js sets the mode to 'production' to produce a minified build.\nimport { Vex } from '../src/vex';\nimport { Flow } from '../src/flow';\nimport { loadAllMusicFonts } from '../src/fonts/load_all';\nimport { loadTextFonts } from '../src/fonts/textfonts';\nloadAllMusicFonts();\nFlow.setMusicFont('Bravura', 'Gonville', 'Custom');\nloadTextFonts();\nexport * from '../src/index';\nexport default Vex;\n","// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// MIT License\nimport { Font } from '../font';\nimport { TextFormatter } from '../textformatter';\nimport { PetalumaScriptFont } from './petalumascript_glyphs';\nimport { RobotoSlabFont } from './robotoslab_glyphs';\nexport function loadTextFonts() {\n // Roboto Slab\n {\n const fontData = RobotoSlabFont;\n const { fontFamily, resolution, glyphs } = fontData;\n Font.load(fontFamily, fontData);\n // Previously we used 'H', but it isn't actually the tallest or the widest.\n // Interestingly, the lowercase 'b' is the tallest glyph.\n const maxSizeGlyph = 'b';\n TextFormatter.registerInfo({\n family: fontFamily,\n resolution,\n glyphs,\n maxSizeGlyph,\n monospaced: false,\n bold: false,\n italic: false,\n superscriptOffset: 0.66,\n subscriptOffset: 0.66,\n serifs: true,\n description: 'Text font to pair with the Bravura / Gonville music fonts.',\n });\n }\n // PetalumaScript\n {\n const fontData = PetalumaScriptFont;\n const { fontFamily, resolution, glyphs } = fontData;\n Font.load(fontFamily, fontData);\n // M is wider, but H is taller. :-)\n // Lowercase b is also taller in this font.\n const maxSizeGlyph = 'b';\n TextFormatter.registerInfo({\n family: fontFamily,\n resolution,\n glyphs,\n maxSizeGlyph,\n monospaced: false,\n bold: false,\n italic: false,\n superscriptOffset: 0.66,\n subscriptOffset: 0.66,\n serifs: false,\n description: 'Text font to pair with the Petaluma music font.',\n });\n }\n}\n"],"names":["root","factory","exports","module","define","amd","window","globalThis","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","g","Function","e","obj","prop","prototype","hasOwnProperty","call","isCategory","category","checkAncestors","constructorFcn","constructor","CATEGORY","getPrototypeOf","isBarline","Category","Barline","isGraceNote","GraceNote","isNote","Note","isStaveNote","StaveNote","isStemmableNote","StemmableNote","isTabNote","TabNote","RuntimeError","Error","code","message","super","globalObject","self","defined","x","undefined","log","block","args","line","Array","slice","join","console","warn","err","stack","midLine","a","b","mid_line","n","parseInt","prefix","text","normalizeAngle","Math","PI","Fraction","numerator","denominator","set","static","Number","isNaN","t","GCD","length","LCM","shift","LCMM","value","simplify","u","d","gcd","add","param1","param2","otherNumerator","otherDenominator","getNumeratorAndDenominator","lcm","subtract","multiply","divide","equals","compare","__staticFractionA","copy","__staticFractionB","greaterThan","greaterThanEquals","lessThan","lessThanEquals","clone","other","quotient","floor","remainder","makeAbs","abs","toString","toSimplifiedString","__staticFractionTmp","toMixedString","s","q","f","parse","str","i","split","BoundingBox","y","w","h","that","getX","getY","getW","getH","setX","setY","setW","setH","move","mergeWith","boundingBox","new_x","new_y","new_w","max","new_h","BoundingBoxComputation","x1","NaN","y1","x2","y2","getX1","getY1","width","height","addPoint","addX","addY","addQuadraticCurve","p0x","p0y","p1x","p1y","p2x","p2y","p01x","denom","it","p01y","addBezierCurve","p3x","p3y","p0","p1","p2","p3","pow","c","b2ac","t1","sqrt","t2","FontWeight","FontStyle","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","rejected","result","done","then","apply","fontParser","Fonts","Font","fontName","name","fontSize","SIZE","_a","scaleToPxFrom","pt","parseFloat","unit","replace","toLowerCase","size","weight","style","fromCSSString","family","SANS_SERIF","NORMAL","cssFontShorthand","document","createElement","font","fontFamily","fontWeight","fontStyle","fontInfo","st","trim","wt","sz","scaleFactor","parsedWeight","ITALIC","woffURL","includeWoff2","fontFace","FontFace","load","fonts","host","WEB_FONT_HOST","files","WEB_FONT_FILES","fontPath","loadWebFont","data","metrics","setData","setMetrics","getName","getData","getMetrics","hasData","getResolution","resolution","getGlyphs","glyphs","lookupMetric","defaultValue","keyParts","currObj","SERIF","px","em","in","mm","cm","PetalumaScript","Index","id","type","class","Registry","index","defaultRegistry","registry","clear","setIndexValue","elem","updateIndex","oldValue","getElementById","getAttribute","register","setAttribute","onRegister","_b","getElementsByAttribute","attribute","index_attr","index_attr_val","keys","map","k","getElementsByType","getElementsByClass","className","onUpdate","info","includes","Element","attrs","newID","el","getCategory","classes","rendered","getDefaultRegistry","ID","setStyle","getStyle","applyStyle","context","save","shadowColor","setShadowColor","shadowBlur","setShadowBlur","fillStyle","setFillStyle","strokeStyle","setStrokeStyle","lineWidth","setLineWidth","restoreStyle","restore","drawWithStyle","checkContext","draw","hasClass","addClass","removeClass","isRendered","setRendered","getAttributes","oldID","getBoundingBox","getContext","setContext","setFont","toCSSString","textFont","defaultTextFont","TEXT_FONT","fontIsObject","fontIsString","fontIsUndefined","sizeWeightStyleAreUndefined","assign","validate","getFont","resetFont","setFontSize","getFontSize","fontSizeInPoints","convertSizeToPointValue","fontSizeInPixels","convertSizeToPixelValue","OutlineCode","ModifierPosition","GlyphCacheEntry","fontStack","point","Glyph","loadMetrics","bbox","getOutlineBoundingBox","outline","scale","x_shift","y_shift","lookupFontMetric","GlyphOutline","originX","originY","nextX","nextY","parts","push","MOVE","LINE","QUADRATIC","BEZIER","options","topGlyphs","botGlyphs","originShift","setOptions","reset","glyph","lookupGlyph","x_min","x_max","ha","cached_outline","ctx","x_pos","y_pos","cache","lookup","customScale","renderOutline","go","beginPath","moveTo","lineTo","quadraticCurveTo","bezierCurveTo","fill","bboxComp","penX","penY","getCode","setPoint","setStave","stave","setXShift","setYShift","checkMetrics","metricsScale","setOriginX","xShift","setOriginY","yShift","setOrigin","render","xPos","yPos","checkStave","renderToStave","getYForGlyphs","Map","entries","CURRENT_CACHE_KEY","entry","MUSIC_FONT_STACK","Modifier","text_line","position","Position","LEFT","spacingFromNextModifier","PositionString","center","CENTER","above","ABOVE","below","BELOW","left","right","RIGHT","getWidth","setWidth","getNote","note","checkAttachedNote","setNote","getIndex","checkIndex","setIndex","getModifierContext","modifierContext","checkModifierContext","setModifierContext","getPosition","setPosition","setTextLine","setSpacingFromNextModifier","getSpacingFromNextModifier","getXShift","alignSubNotesWithNote","subNotes","tickContext","getTickContext","getStave","subNoteXOffset","modLeftPx","modRightPx","forEach","subNote","subTickContext","setXOffset","Music","NUM_TONES","canonical_notes","roots","root_values","root_indices","diatonic_intervals","diatonic_accidentals","unison","accidental","m2","M2","m3","M3","p4","dim5","p5","m6","M6","b7","M7","octave","intervals","b2","min2","S","H","maj2","T","W","b3","min3","maj3","b5","aug4","b6","aug5","maj6","m7","min7","dom7","maj7","scales","major","minor","ionian","dorian","phyrgian","lydian","mixolydian","aeolian","locrian","scaleTypes","M","m","accidentals","noteValues","root_index","int_val","cn","cb","cbb","dn","db","dbb","en","eb","ebb","fn","fb","fbb","gn","gb","gbb","an","ab","abb","bn","bb","bbb","isValidNoteValue","isValidIntervalValue","interval","getNoteParts","noteString","match","exec","getKeyParts","keyString","getNoteValue","getIntervalValue","intervalString","getCanonicalNoteName","noteValue","getCanonicalIntervalName","intervalValue","getRelativeNoteValue","direction","sum","getRelativeNoteName","rootValue","multiplier","reverse_interval","relativeNoteName","getScaleTones","tones","nextNote","getIntervalBetween","note1","note2","difference","createScaleMap","keySignature","keySigParts","scaleName","keySigString","noteLocation","scaleMap","rootName","noteName","RESOLUTION","durations","durationAliases","keySignatures","C","num","Am","F","acc","Dm","Bb","Gm","Eb","Cm","Ab","Fm","Db","Bbm","Gb","Ebm","Cb","Abm","G","Em","D","Bm","A","E","B","clefs","treble","line_shift","bass","tenor","alto","soprano","percussion","subbass","french","notesInfo","CN","CB","CBB","DN","DB","DBB","EN","EB","EBB","FN","FB","FBB","GN","GB","GBB","AN","AB","ABB","BN","BB","BBB","R","rest","X","shift_right","customNoteHeads","D0","D1","D2","D3","T0","T1","T2","T3","X0","X1","X2","X3","S1","S2","R1","R2","parenRightPaddingAdjustment","bs","bss","bbs","ashs","afhf","accSagittal5v7KleismaUp","accSagittal5v7KleismaDown","accSagittal5CommaUp","accSagittal5CommaDown","accSagittal7CommaUp","accSagittal7CommaDown","accSagittal25SmallDiesisUp","accSagittal25SmallDiesisDown","accSagittal35MediumDiesisUp","accSagittal35MediumDiesisDown","accSagittal11MediumDiesisUp","accSagittal11MediumDiesisDown","accSagittal11LargeDiesisUp","accSagittal11LargeDiesisDown","accSagittal35LargeDiesisUp","accSagittal35LargeDiesisDown","accSagittalSharp25SDown","accSagittalFlat25SUp","accSagittalSharp7CDown","accSagittalFlat7CUp","accSagittalSharp5CDown","accSagittalFlat5CUp","accSagittalSharp5v7kDown","accSagittalFlat5v7kUp","accSagittalSharp","accSagittalFlat","accSagittalSharp5v7kUp","accSagittalFlat5v7kDown","accSagittalSharp5CUp","accSagittalFlat5CDown","accSagittalSharp7CUp","accSagittalFlat7CDown","accSagittalSharp25SUp","accSagittalFlat25SDown","accSagittalSharp35MUp","accSagittalFlat35MDown","accSagittalSharp11MUp","accSagittalFlat11MDown","accSagittalSharp11LUp","accSagittalFlat11LDown","accSagittalSharp35LUp","accSagittalFlat35LDown","accSagittalDoubleSharp25SDown","accSagittalDoubleFlat25SUp","accSagittalDoubleSharp7CDown","accSagittalDoubleFlat7CUp","accSagittalDoubleSharp5CDown","accSagittalDoubleFlat5CUp","accSagittalDoubleSharp5v7kDown","accSagittalDoubleFlat5v7kUp","accSagittalDoubleSharp","accSagittalDoubleFlat","accSagittal7v11KleismaUp","accSagittal7v11KleismaDown","accSagittal17CommaUp","accSagittal17CommaDown","accSagittal55CommaUp","accSagittal55CommaDown","accSagittal7v11CommaUp","accSagittal7v11CommaDown","accSagittal5v11SmallDiesisUp","accSagittal5v11SmallDiesisDown","accSagittalSharp5v11SDown","accSagittalFlat5v11SUp","accSagittalSharp7v11CDown","accSagittalFlat7v11CUp","accSagittalSharp55CDown","accSagittalFlat55CUp","accSagittalSharp17CDown","accSagittalFlat17CUp","accSagittalSharp7v11kDown","accSagittalFlat7v11kUp","accSagittalSharp7v11kUp","accSagittalFlat7v11kDown","accSagittalSharp17CUp","accSagittalFlat17CDown","accSagittalSharp55CUp","accSagittalFlat55CDown","accSagittalSharp7v11CUp","accSagittalFlat7v11CDown","accSagittalSharp5v11SUp","accSagittalFlat5v11SDown","accSagittalDoubleSharp5v11SDown","accSagittalDoubleFlat5v11SUp","accSagittalDoubleSharp7v11CDown","accSagittalDoubleFlat7v11CUp","accSagittalDoubleSharp55CDown","accSagittalDoubleFlat55CUp","accSagittalDoubleSharp17CDown","accSagittalDoubleFlat17CUp","accSagittalDoubleSharp7v11kDown","accSagittalDoubleFlat7v11kUp","accSagittal23CommaUp","accSagittal23CommaDown","accSagittal5v19CommaUp","accSagittal5v19CommaDown","accSagittal5v23SmallDiesisUp","accSagittal5v23SmallDiesisDown","accSagittalSharp5v23SDown","accSagittalFlat5v23SUp","accSagittalSharp5v19CDown","accSagittalFlat5v19CUp","accSagittalSharp23CDown","accSagittalFlat23CUp","accSagittalSharp23CUp","accSagittalFlat23CDown","accSagittalSharp5v19CUp","accSagittalFlat5v19CDown","accSagittalSharp5v23SUp","accSagittalFlat5v23SDown","accSagittalDoubleSharp5v23SDown","accSagittalDoubleFlat5v23SUp","accSagittalDoubleSharp5v19CDown","accSagittalDoubleFlat5v19CUp","accSagittalDoubleSharp23CDown","accSagittalDoubleFlat23CUp","accSagittal19SchismaUp","accSagittal19SchismaDown","accSagittal17KleismaUp","accSagittal17KleismaDown","accSagittal143CommaUp","accSagittal143CommaDown","accSagittal11v49CommaUp","accSagittal11v49CommaDown","accSagittal19CommaUp","accSagittal19CommaDown","accSagittal7v19CommaUp","accSagittal7v19CommaDown","accSagittal49SmallDiesisUp","accSagittal49SmallDiesisDown","accSagittal23SmallDiesisUp","accSagittal23SmallDiesisDown","accSagittal5v13MediumDiesisUp","accSagittal5v13MediumDiesisDown","accSagittal11v19MediumDiesisUp","accSagittal11v19MediumDiesisDown","accSagittal49MediumDiesisUp","accSagittal49MediumDiesisDown","accSagittal5v49MediumDiesisUp","accSagittal5v49MediumDiesisDown","accSagittal49LargeDiesisUp","accSagittal49LargeDiesisDown","accSagittal11v19LargeDiesisUp","accSagittal11v19LargeDiesisDown","accSagittal5v13LargeDiesisUp","accSagittal5v13LargeDiesisDown","accSagittalSharp23SDown","accSagittalFlat23SUp","accSagittalSharp49SDown","accSagittalFlat49SUp","accSagittalSharp7v19CDown","accSagittalFlat7v19CUp","accSagittalSharp19CDown","accSagittalFlat19CUp","accSagittalSharp11v49CDown","accSagittalFlat11v49CUp","accSagittalSharp143CDown","accSagittalFlat143CUp","accSagittalSharp17kDown","accSagittalFlat17kUp","accSagittalSharp19sDown","accSagittalFlat19sUp","accSagittalSharp19sUp","accSagittalFlat19sDown","accSagittalSharp17kUp","accSagittalFlat17kDown","accSagittalSharp143CUp","accSagittalFlat143CDown","accSagittalSharp11v49CUp","accSagittalFlat11v49CDown","accSagittalSharp19CUp","accSagittalFlat19CDown","accSagittalSharp7v19CUp","accSagittalFlat7v19CDown","accSagittalSharp49SUp","accSagittalFlat49SDown","accSagittalSharp23SUp","accSagittalFlat23SDown","accSagittalSharp5v13MUp","accSagittalFlat5v13MDown","accSagittalSharp11v19MUp","accSagittalFlat11v19MDown","accSagittalSharp49MUp","accSagittalFlat49MDown","accSagittalSharp5v49MUp","accSagittalFlat5v49MDown","accSagittalSharp49LUp","accSagittalFlat49LDown","accSagittalSharp11v19LUp","accSagittalFlat11v19LDown","accSagittalSharp5v13LUp","accSagittalFlat5v13LDown","accSagittalDoubleSharp23SDown","accSagittalDoubleFlat23SUp","accSagittalDoubleSharp49SDown","accSagittalDoubleFlat49SUp","accSagittalDoubleSharp7v19CDown","accSagittalDoubleFlat7v19CUp","accSagittalDoubleSharp19CDown","accSagittalDoubleFlat19CUp","accSagittalDoubleSharp11v49CDown","accSagittalDoubleFlat11v49CUp","accSagittalDoubleSharp143CDown","accSagittalDoubleFlat143CUp","accSagittalDoubleSharp17kDown","accSagittalDoubleFlat17kUp","accSagittalDoubleSharp19sDown","accSagittalDoubleFlat19sUp","accSagittalShaftUp","accSagittalShaftDown","accSagittalAcute","accSagittalGrave","accSagittal1MinaUp","accSagittal1MinaDown","accSagittal2MinasUp","accSagittal2MinasDown","accSagittal1TinaUp","accSagittal1TinaDown","accSagittal2TinasUp","accSagittal2TinasDown","accSagittal3TinasUp","accSagittal3TinasDown","accSagittal4TinasUp","accSagittal4TinasDown","accSagittal5TinasUp","accSagittal5TinasDown","accSagittal6TinasUp","accSagittal6TinasDown","accSagittal7TinasUp","accSagittal7TinasDown","accSagittal8TinasUp","accSagittal8TinasDown","accSagittal9TinasUp","accSagittal9TinasDown","accSagittalFractionalTinaUp","accSagittalFractionalTinaDown","accidentalNarrowReversedFlat","accidentalNarrowReversedFlatAndFlat","accidentalWilsonPlus","accidentalWilsonMinus","articulations","between_lines","av","aboveCode","belowCode","ao","ah","am","ornaments","mordent","mordent_inverted","turn","turn_inverted","tr","upprall","downprall","prallup","pralldown","upmordent","downmordent","lineprall","prallprall","scoop","doit","fall","doitLong","fallLong","bend","plungerClosed","plungerOpen","flip","jazzTurn","smear","Tables","clef","keyOctaveGlyph","params","octave_shift","pieces","toUpperCase","clefProperties","stroke","int_value","customNoteHeadProps","glyphName","displaced","integer","fret","shift_y","glyphMetrics","TABLATURE_FONT_SCALE","textWidth","artic","spec","keySpec","notes","acc_list","duration","durationNumber","sanitizeDuration","durationToFraction","ticks","durationCodes","glyphTypeProperties","customGlyphTypeProperties","code_head","common","NOTATION_FONT_SCALE","STEM_WIDTH","STEM_HEIGHT","STAVE_LINE_THICKNESS","SLASH_NOTEHEAD_WIDTH","STAVE_LINE_DISTANCE","TEXT_HEIGHT_OFFSET_HACK","accidentalMap","accidentalColumnsTable","second_on_bottom","spaced_out_tetrachord","spaced_out_pentachord","very_spaced_out_pentachord","spaced_out_hexachord","very_spaced_out_hexachord","unicode","sharp","String","fromCharCode","flat","natural","triangle","degrees","circle","validTypes","r","TIME4_4","num_beats","beat_value","stem","stem_offset","flag","dot_shiftY","line_above","line_below","beam_count","stem_beam_extension","code_flag_upstem","code_flag_downstem","L","Accidental","DEBUG","render_options","font_scale","parenLeftPadding","parenRightPadding","accidentalCodes","cautionary","state","musicFont","currentMusicFont","noteheadAccidentalPadding","leftShift","left_shift","accidentalSpacing","additionalPadding","accList","prevNote","shiftL","props","getKeyProps","getLeftDisplacedHeadPx","lineSpace","getSpacingBetweenLines","getYForLine","accLine","round","sort","lineList","previousLine","accShift","flatLine","dblSharpLine","numAcc","column","totalColumns","noFurtherConflicts","groupStart","groupEnd","checkCollision","getGroupLine","getGroupLines","indexes","lineDifference","indexA","indexB","item","notColliding","indexPairs","every","line1","line2","groupLength","groupMember","endCase","patternLength","collisionDetected","columnWidths","columnXOffsets","totalShift","accCount","lastAccOnLine","clearance","clearanceRequired","collision","voices","tickPositions","tickNoteMap","voice","tickPosition","getTickables","shouldIgnoreTicks","notesAtPosition","getTicks","music","scaleMapKey","tickPos","tickables","modifiedPitches","processNote","isRest","staveNote","keyIndex","accidentalString","pitch","sameAccidental","previouslyModified","indexOf","getModifiers","modifier","splice","addModifier","GraceNoteGroup","getGraceNotes","fontScale","parenLeft","parenRight","parenWidth","setAsCautionary","start","getModifierStartXY","accX","accY","Stem","stem_up_y_offset","stem_down_y_offset","stem_up_y_base_offset","stem_down_y_base_offset","x_begin","x_end","y_top","y_bottom","stem_extension","stem_direction","hide","isStemlet","stemletHeight","renderHeightAdjustment","UP","DOWN","WIDTH","HEIGHT","setNoteHeadXBounds","setDirection","setExtension","ext","getExtension","setYBounds","getHeight","y_offset","getExtents","isStemUp","ys","stemHeight","innerMostNoteheadY","min","outerMostNoteheadY","topY","baseY","setVisibility","isVisible","setStemlet","adjustHeightForFlag","adjustHeightForBeam","stem_x","stem_y","y_base_offset","stemletYOffset","TextFormatter","textWidthCache","formatterInfo","serifs","monospaced","italic","bold","superscriptOffset","subscriptOffset","maxSizeGlyph","cacheKey","updateParams","registeredFonts","requestedFont","candidates","requestedFamilies","requestedFamily","startsWith","formatter","values","isBold","isItalic","perfectMatch","find","partialMatch","fontSizeInPt","overwrite","updateCacheKey","BOLD","getGlyphMetrics","character","maxHeight","getWidthForCharacterInEm","advanceWidth","getWidthForTextInEm","cachedWidths","getWidthForTextInPx","AnnotationHorizontalJustify","AnnotationVerticalJustify","Annotation","horizontalJustification","verticalJustification","TOP","annotations","annotation","textFormatter","create","verticalSpaceNeeded","stemDirection","hasStem","getStemDirection","lines","draw_stem","getStem","getNoteType","getNumLines","VerticalJustify","noteLine","getLineNumber","leastString","top_text_line","BOTTOM","greatestString","curBottom","right_shift","setVerticalJustification","just","VerticalJustifyString","getJustification","setJustification","HorizontalJustifyString","classString","openGroup","text_width","measureText","text_height","getStemX","stem_ext","spacing","has_stem","checkStem","getYs","reduce","yt","getYForTopText","getYForBottomText","getTopLineTopY","extents","getStemExtents","fillText","closeGroup","HorizontalJustify","centerStem","CENTER_STEM","top","bottom","roundToNearestHalf","mathFn","isWithinLines","getRoundingFunction","ceil","isStaveOrGraceNote","Articulation","getIncrement","articulation","increment","curTop","maxWidth","articWidth","builder","articNameToCode","staccato","tenuto","accent","articString","getFactory","articulationCodes","textLine","canSitBetweenLines","staffSpace","isTab","shouldSitOutsideStaff","initialOffset","isOnStemTip","getInitialOffset","padding","stemTipY","stemBaseY","getTopY","INITIAL_OFFSET","getBottomY","offsetDirection","articLine","snappedLine","snapLineToStaff","RenderContext","setRawFont","Tickable","_preFormatted","_postFormatted","intrinsicTicks","tickMultiplier","modifiers","tupletStack","align_center","center_x_shift","ignore_ticks","formatterMetrics","freedom","iterations","space","used","mean","deviation","setIgnoreTicks","checkTickContext","getFormatterMetrics","getCenterXShift","isCenterAligned","setCenterXShift","centerXShift","setCenterAlignment","getVoice","setVoice","getTuplet","tuplet","getTupletStack","resetTuplet","noteCount","notesOccupied","getNoteCount","getNotesOccupied","applyTickMultiplier","pop","setTuplet","addToModifierContext","mc","addMember","setTickContext","tc","preFormat","preFormatted","postFormat","postFormatted","getIntrinsicTicks","setIntrinsicTicks","getTickMultiplier","setDuration","getAbsoluteX","noteStruct","parsedNoteStruct","parseNoteStruct","JSON","stringify","keyProps","noteType","customTypes","duration_override","getGlyphProps","customGlyphs","playNote","leftDisplacedHeadPx","rightDisplacedHeadPx","annotation_spacing","glyph_font_scale","stroke_px","xStart","xPre1","xAbs","xPost1","notePx","xPost2","xEnd","xFreedomRight","xWidth","color","yy","arc","closePath","drawDot","spaceDeviation","durationString","dots","durationProps","parseDuration","durationToTicks","currentTicks","getPlayNote","setPlayNote","addStroke","setYs","getRightDisplacedHeadPx","setLeftDisplacedHeadPx","setRightDisplacedHeadPx","isTopNote","getLineForRest","getGlyph","getGlyphWidth","getDuration","isDotted","getModifiersByType","getBeam","beam","checkBeam","hasBeam","setBeam","signature","getMembers","getRightParenthesisPx","getLeftParenthesisPx","getFirstDotPx","getState","glyphWidth","glyphPx","getNoteStartX","getTieRightX","tieStartX","getTieLeftX","tieEndX","getKeys","StaveModifierPosition","BarlineType","ChordSymbolHorizontalJustify","ChordSymbolVerticalJustify","SymbolTypes","SymbolModifiers","VoiceMode","StaveModifier","placeGlyphOnLine","customShift","getPadding","setPadding","setLayoutMetrics","layoutMetrics","getLayoutMetrics","thickness","TYPE","widths","SINGLE","DOUBLE","END","REPEAT_BEGIN","REPEAT_END","REPEAT_BOTH","NONE","paddings","layoutMetricsMap","xMin","xMax","paddingLeft","paddingRight","BEGIN","setType","typeString","single","double","end","repeatBegin","repeatEnd","repeatBoth","none","getType","drawVerticalBar","drawVerticalEndBar","drawRepeatBar","double_bar","staveCtx","botY","getBottomLineBottomY","fillRect","begin","dot_x","dot_radius","dot_y","BarNote","barline","Bend","release","phrase","tap","line_width","line_style","bend_width","release_width","updateWidth","bends","last_width","stringPos","setTap","getText","getTextHeight","totalWidth","additional_width","draw_width","lowestY","bend_height","annotation_y","renderBend","cp_x","cp_y","renderRelease","renderArrowHead","yBase","renderText","render_x","last_bend","last_bend_draw_width","last_drawn_width","ChordSymbol","symbolBlocks","horizontal","vertical","useKerning","reportWidth","superSubRatio","global","NO_TEXT_FORMAT","val","noFormat","glyphCode","engravingFontResolution","spacingBetweenBlocks","metric","getMetricForGlyph","yOffset","leftSideBearing","kerningOffset","chordSymbol","lowerKerningText","upperKerningText","symbolModifier","SUPERSCRIPT","SUBSCRIPT","symbols","nonSuperWidth","reportedWidths","symbol","fontAdj","scaleSize","glyphAdj","lineSpaces","vAlign","j","sup","isSuperscript","sub","isSubscript","superSubScale","adj","symbolType","GLYPH","superSubFontSize","getWidthForGlyph","getYShiftForGlyph","getXShiftForGlyph","TEXT","getYOffsetForText","over","prev","setEnableKerning","updateKerningAdjustments","updateOverBarAdjustments","getVertical","getReportWidth","setReportWidth","barIndex","findIndex","xoff","yoff","symIndex","accum","getKerningAdjustment","currSymbol","prevSymbol","adjustment","preKernUpper","preKernLower","some","xx","kerningOffsetPixels","getSymbolBlock","_c","symbolBlock","glyphArgs","glyphPoints","addSymbolBlock","parameters","addText","addTextSuperscript","addTextSubscript","addGlyphSuperscript","addGlyph","addGlyphOrText","char","addLine","setVertical","vj","setHorizontal","hj","getHorizontal","yMax","y_max","stem_base","isSuper","isSub","curY","smallerFontSize","diminished","dim","halfDiminished","augmented","majorSeventh","leftParen","rightParen","leftBracket","rightBracket","leftParenTall","rightParenTall","symbolTypes","symbolModifiers","Dot","radius","all","dot","setDotShiftY","dot_list","max_shift_map","note_id","dot_shift","x_width","last_line","last_note","prev_dotted_space","half_shiftY","forceFlagRight","FretHandFinger","finger","x_offset","nums","nums_list","prev_note","shiftLeft","shiftRight","pos","textHeight","shiftR","numShiftL","numShiftR","xWidthL","xWidthR","lastLine","lastNote","num_shift","numWidth","fingerings","fingeringString","number","Fingering","fingering","setFretHandFinger","getFretHandFinger","setOffsetX","setOffsetY","StaveTie","setNotes","cp1","cp2","text_shift_x","first_x_shift","last_x_shift","tie_spacing","first_note","first_indices","last_indices","isPartial","renderTie","first_ys","last_ys","last_x_px","first_x_px","first_y_px","last_y_px","top_cp_y","bottom_cp_y","center_x","getTieStartX","getTieEndX","TabTie","Voice","time","voiceTime","resolutionMultiplier","mode","STRICT","ticksUsed","largestTickWidth","softmaxFactor","totalTicks","smallestTickCount","Mode","getTotalTicks","getTicksUsed","getLargestTickWidth","getSmallestTickCount","getMode","setMode","getResolutionMultiplier","getActualResolution","tickable","setStrict","strict","SOFT","isComplete","FULL","setSoftmaxFactor","factor","reCalculateExpTicksUsed","expTicksUsed","softmax","tickValue","v","exp","addTickable","addTickables","grace_notes","show_slur","slur","slur_y_shift","beams","gracenote_groups","group_list","gracenote_group","is_stavenote","formatWidth","group_shift","Formatter","joinVoices","format","getMinTotalWidth","beamNotes","Beam","beam_width","partial_beam_length","graceNote","TieClass","NoteSubGroup","groups","group","TickContext","tickID","currentTick","maxTicks","maxTickable","minTicks","minTickable","xBase","xOffset","tickablesByVoice","totalLeftPx","totalRightPx","tContexts","tContext","contexts","getTickID","getXBase","setXBase","getXOffset","getMaxTicks","getMinTicks","getMaxTickable","getMinTickable","getTickableForVoice","voiceIndex","getTickablesByVoice","getCenterAlignedTickables","filter","getCurrentTick","setCurrentTick","tick","Ornament","delayed","accidentalLowerPadding","accidentalUpperPadding","ornament","ornamentCodes","adjustForStemDirection","reportedWidth","stemUpYOffset","ornamentAlignWithNoteHead","ornamentNoteTransition","ornamentRelease","ornamentAttack","ornamentArticulation","jazzOrnaments","setDelayed","setUpperAccidental","accid","accidentalUpper","setLowerAccidental","accidentalLower","stemDir","stemExtents","isPlacedOnNoteheadSide","lineSpacing","glyphYBetweenLines","glyphX","glyphY","delayXShift","startX","nextContext","getNextContext","Parenthesis","parentheses","x_widthL","x_widthR","parenthesis","renderGlyph","NoteHead","custom_glyph","stem_up_x_offset","stem_down_x_offset","note_type","glyph_code","custom_glyph_code","slashed","isDisplaced","getLine","setLine","displacementStemAdjustment","fontShift","displacedFontShift","half_spacing","min_y","getYForNote","head_x","categorySuffix","staveSpace","durationToNumber","breve_lines","drawSlashNoteHead","setStem","buildStem","buildFlag","hasFlag","flagCode","getBaseCustomNoteHeadGlyph","getStemLength","getStemExtension","getBeamCount","getStemMinimumLength","setStemDirection","offsets","offsetYBaseStemUp","offsetYTopStemUp","offsetYBaseStemDown","offsetYTopStemDown","getCenterGlyphX","stem_extension_override","setStemLength","drawStem","stemOptions","shiftRestVertical","dir","delta","maxLine","minLine","setKeyLine","getKeyLine","ledgerLineStyle","use_default_head_x","_noteHeads","LEDGER_LINE_OFFSET","calculateKeyProps","auto_stem","autoStem","STEM_UP","STEM_DOWN","minNoteheadPadding","notesList","minL","stemMax","stemMin","maxL","isrest","voice_shift","getVoiceShiftWidth","is_displaced","noteU","noteM","noteL","voiceXShift","centerRest","noteHeadStyles","noteHead","buildNoteHeads","noteHeadStyle","head","calcNoteDisplacements","lineDiff","noteProps","notehead","calculateOptimalStemDirection","keyProperties","minY","maxY","halfLineSpacing","frac","resultLine","thisLine","isChord","getNoteHeadBounds","setNoteDisplaced","getRightShift","restLine","isInnerNoteIndex","setStemStyle","getStemStyle","setLedgerLineStyle","getLedgerLineStyle","setFlagStyle","flagStyle","getFlagStyle","setKeyStyle","noteHeadPadding","shouldDrawFlag","nonDisplacedX","displacedX","highestDisplacedLine","lowestDisplacedLine","yTop","Infinity","yBottom","highestLine","lowestLine","highestNonDisplacedLine","lowestNonDisplacedLine","displaced_x","non_displaced_x","highest_line","lowest_line","highest_displaced_line","lowest_displaced_line","highest_non_displaced_line","lowest_non_displaced_line","getNoteHeadBeginX","getNoteHeadEndX","noteHeads","note_heads","drawLedgerLines","doubleWidth","min_x","drawLedgerLine","normal","ledgerWidth","getDefaultLedgerLineStyle","drawModifiers","noteheadStyle","hasNoBeam","drawFlag","noteStemHeight","flagX","extension","flagY","pointerBBox","drawNoteHeads","super_stem_extension","mid_line_distance","lines_over_octave_from_mid_line","spacing_between_lines","xBegin","shouldRenderStem","stemX","isHTMLCanvas","element","HTMLCanvasElement","toDataURL","CanvasContext","context2D","canvas","CANVAS_BROWSER_SIZE_LIMIT","limit","clearRect","cls","child","setBackgroundFillStyle","blur","getTransform","setLineCap","capType","lineCap","setLineDash","dash","resize","devicePixelRatio","sanitizeCanvasDims","rect","cp1x","cp1y","cp2x","cp2y","cpx","cpy","startAngle","endAngle","counterclockwise","fontBoundingBoxAscent","fontBoundingBoxDescent","actualBoundingBoxAscent","actualBoundingBoxDescent","ATTRIBUTES_TO_IGNORE","path","SVG_NS","TWO_PI","SVGContext","backgroundFillStyle","fontCSSString","svg","appendChild","parent","pen","defaultFontAttributes","attributes","shadow_attributes","state_stack","svgElementType","createElementNS","lineDash","applyAttributes","visibleWidth","visibleHeight","setViewBox","viewBox_or_minX","viewBoxString","attrNamesToIgnore","nodeName","attrName","setAttributeNS","lastChild","removeChild","rectangle","x0","cos","y0","sin","large","sweep","getShadowStyle","sa","measureTextCache","txt","textContent","savedState","fontAttributes","RendererBackends","RendererLineEndType","Justification","VoltaType","measureImpl","getBBox","Renderer","arg0","arg1","backend","maybeElement","Backends","CANVAS","SVG","HTMLDivElement","isHTMLDiv","elementId","background","renderer","lastContext","buildContext","fromX","fromY","toX","toY","dashPattern","dx","dy","angle","atan2","idx","dashLength","nx","ny","LineEndType","StringNumber","string_number","dashed","leg","stringNumber","shift_left","glyphLine","num_shiftR","num_width","setLineEndType","setStringNumber","setLastNote","setDashed","stemPadding","verticalPadding","leftPadding","rightPadding","len","pattern","drawDashedLine","Stroke","all_voices","strokes","strokeList","string","getPositions","strokeShift","addEndNote","note_end","line_space","arrow","arrow_shift_x","arrow_y","text_y","Type","BRUSH_DOWN","BRUSH_UP","ROLL_DOWN","RASQUEDO_DOWN","ROLL_UP","RASQUEDO_UP","ARPEGGIO_DIRECTIONLESS","strokeLine","Vibrato","harsh","vibrato_width","wave_height","wave_width","wave_girth","setVibratoWidth","vibratos","vibrato","setHarsh","vx","vy","renderVibrato","opts","num_waves","ModifierContext","members","formatted","member","getLeftShift","Clef","types","tab","attachment","numLines","shiftY","KeySignature","cancelKeySpec","alterKeySpec","setKeySig","glyphFontScale","xPositions","paddingForced","convertToGlyph","nextAcc","accGlyphData","extraWidth","xPosition","cancelKey","convertToCancelAccList","cancel_accList","different_types","naturals","cancelled","concat","addToStave","convertAccLines","customLines","offset","alterKey","convertToAlterAccList","firstAccidentalType","cancelAccList","getEndClef","getClef","Repetition","symbol_type","setShiftX","setShiftY","CODA_RIGHT","drawCodaFixed","CODA_LEFT","drawSymbolText","SEGNO_LEFT","drawSignoFixed","SEGNO_RIGHT","DC","DC_AL_CODA","DC_AL_FINE","DS","DS_AL_CODA","DS_AL_FINE","FINE","TO_CODA","draw_coda","text_x","symbol_x","modifierWidth","getVerticalBarWidth","StaveSection","section","shift_x","setStaveSection","textMeasurements","StaveTempo","tempo","setTempo","bpm","stem_height","TextNote","superscript","subscript","smooth","justification","struct","GLYPHS","segno","mordent_upper","mordent_lower","p","z","coda","pedal_open","pedal_close","caesura_straight","caesura_curved","breath","StaveText","setStaveText","setText","getBottomLineY","Volta","volta","top_y","vert_height","BEGIN_END","TimeSignatureGlyph","timeSignature","topDigits","botDigits","topWidth","timeSigType","topGlyph","botWidth","botGlyph","topStartX","botStartX","start_x","topLine","bottomLine","TimeSignature","timeSpec","customPadding","validate_args","fontLineShift","parseTimeSpec","numbers","test","assertIsValidTimeSig","makeTimeSignatureGlyph","getInfo","setTimeSig","SORT_ORDER_BEG_MODIFIERS","SORT_ORDER_END_MODIFIERS","Stave","end_x","measure","endClef","vertical_bar_width","num_lines","fill_style","left_bar","right_bar","spacing_between_lines_px","space_above_staff_ln","space_below_staff_ln","top_text_position","bottom_text_position","line_config","bounds","defaultLedgerLineStyle","resetLines","addEndModifier","defaultPadding","setDefaultLedgerLineStyle","visible","setNoteStartX","begBarline","getNoteEndX","setNumLines","mod","setMeasure","getModifierXShift","setRepetitionType","setVoltaType","number_t","setSection","staveSection","headroom","getLineForY","setBegBarType","setEndBarType","setClef","clefSpec","addClef","setEndClef","setKeySignature","addKeySignature","setEndKeySignature","setTimeSignature","timeSignatures","addTimeSignature","setEndTimeSignature","addEndClef","addEndTimeSignature","addTrebleGlyph","noPosition","noCategory","sortByCategory","items","order","temp","endBarline","begModifiers","endModifiers","lastBarlineIdx","getConfigForLines","setConfigForLine","line_number","setConfigForLines","lines_configuration","drawBoldDoubleLine","topX","StaveConnector","BOLD_DOUBLE_LEFT","BOLD_DOUBLE_RIGHT","variableWidth","top_stave","bottom_stave","texts","SINGLE_RIGHT","content","THIN_DOUBLE","attachment_height","SINGLE_LEFT","BRACE","x3","y3","cpx1","cpy1","cpx2","cpy2","cpx3","cpy3","cpx4","cpy4","cpx5","cpy5","cpx6","cpy6","cpx7","cpy7","cpx8","cpy8","BRACKET","singleRight","singleLeft","brace","bracket","boldDoubleLeft","boldDoubleRight","thinDouble","sumArray","arr","createContexts","makeContext","addToContext","tickToContextMap","tickList","integerTicks","newContext","array","list","getRestLineForNextNoteGroup","currRestLine","currNoteIndex","nextRestLine","noteIndex","formatterOptions","globalSoftmax","maxIterations","justifyWidth","totalCost","durationStats","minTotalWidth","hasMinTotalWidth","tickContexts","modifierContexts","contextGaps","total","gaps","lossHistory","paddingBetween","accumulator","stavePadding","gap","toFixed","auto_beam","align_rests","applyAndGetBeams","formatToStave","tabstave","tabnotes","autobeam","notevoice","tabvoice","alignAllNotes","alignTuplets","currTickable","prevTickable","alignRests","AlignRestsToNotes","preCalculateMinTotalWidth","unalignedPadding","unalignedCtxCount","wsum","dsum","createTickContexts","contextList","contextMap","wavg","wvar","ll","wpads","davg","dvar","dpads","padmax","unalignedPad","createModifierContexts","contextArray","renderingContext","voicesParam","evaluate","firstContext","calculateIdealDistances","adjustedJustifyWidth","backTickable","prevContext","backVoices","matchingVoices","maxNegativeShiftPx","expectedDistance","thisTickable","insideLeftEdge","backMetrics","insideRightEdge","fromTickable","fromTickablePx","shiftToIdealDistances","idealDistances","centerX","spaceAccum","contextX","ideal","errorPx","negativeShiftPx","configMinPadding","configMaxPadding","targetWidth","distances","actualWidth","minDistance","mdCalc","di","calcMinDistance","paddingMax","maxX","prevTick","prevMetrics","currMetrics","leftNoteEdge","rightNote","rightMetrics","stats","count","updateStats","totalDeviation","tune","alpha","current","cost","postFormatContexts","optionsParam","TupletLocation","Tuplet","numerator_glyphs","denom_glyphs","num_notes","beats_occupied","beatsOccupiedDeprecationWarning","notes_occupied","bracketed","ratioed","setTupletLocation","location","LOCATION_TOP","resolveGlyphs","attach","LOCATION_BOTTOM","NESTING_OFFSET","detach","setBracketed","setRatioed","getNotes","getBeatsOccupied","setBeatsOccupied","beats","setNotesOccupied","unshift","getNestedTupletCount","maxTupletCount","countTuplets","minTupletCount","tupletCount","getYPosition","nested_tuplet_y_offset","topModifierOffset","modLines","modY","noteHeadOffset","stemOffset","lineCheck","nn","bottom_y","addGlyphWidth","notation_start_x","colon_x","colon_radius","calculateStemDirection","lineSum","keyProp","BEAM_LEFT","BEAM_BOTH","slope","stem_weight","memo","break_on_indices","max_slope","min_slope","slope_iterations","slope_cost","show_stemlets","stemlet_extension","flat_beams","min_flat_beam_offset","time_sig","beatTotal","beatValue","generateBeams","config","tickGroups","unprocessedNotes","currentTickGroup","noteGroups","currentGroup","nextTickGroup","nextGroup","currentGroupTotalTicks","unprocessedNote","ticksPerGroup","vf_notes","unbeamable","createGroups","sanitizedGroups","tempGroup","isFirstOrLast","breaksOnEachRest","beam_rests","breaksOnFirstOrLastRest","beam_middle_only","breakOnStemChange","maintain_stem_directions","prevDirection","isUnbeamableDuration","sanitizeGroups","findFirstNote","applyStemDirection","beamedNoteGroups","beamable","allTuplets","uniqueTuplets","noteTuplet","getTuplets","secondary_breaks","secondary_break_ticks","flat_beam_offset","beamCount","breakSecondaryAt","indices","getSlopeY","calculateSlope","firstNote","initialSlope","firstStemTipY","firstStemX","getStemSlope","minCost","MAX_VALUE","bestSlope","totalStemExtension","yShiftTemp","adjustedStemTipY","diff","idealSlope","calculateFlatSlope","extremeY","extremeBeamCount","currentExtreme","extremeTest","newOffset","getBeamYToDraw","beamY","applyStemExtensions","beamedStemTipY","preBeamExtension","beamExtension","totalBeamWidth","lookupBeamDirection","prev_tick","next_tick","lookup_duration","prev_note_gets_beam","next_note_gets_beam","note_gets_beam","getBeamLines","tick_of_duration","beam_started","beam_lines","current_beam","previous_should_break","tick_tally","should_break","next_note","beam_alone","beam_direction","last_beam","drawStems","drawBeamLines","valid_beam_durations","beamThickness","beamLines","beam_line","startBeamX","startBeamY","lastBeamX","lastBeamY","ClefNote","clef_obj","abs_x","Crescendo","extend_left","extend_right","decrescendo","setHeight","setDecrescendo","decresc","tick_context","next_context","begin_x","half_height","reverse","renderHairpin","CurvePosition","Curve","from","to","NEAR_HEAD","position_end","invert","cps","nearHead","nearTop","NEAR_TOP","renderCurve","first_x","first_y","last_x","last_y","cp0x","cp0y","cp_spacing","end_metric","Parser","flattenMatches","matchedString","results","grammar","errorPos","expect","matchFail","returnPos","matchSuccess","matchToken","token","noSpace","regexp","RegExp","success","incrementPos","expectOne","rule","maybe","allMatches","oneMatch","localPos","or","gotOne","numMatches","expectOneOrMore","more","expectZeroOrMore","ruleFunc","bind","oneOrMore","zeroOrMore","matches","run","EasyScore","EasyScoreGrammar","PIECE","PIECES","EOL","CHORDORNOTE","PARAMS","commitPiece","COMMA","DURATION","DOTS","OPTS","CHORD","SINGLENOTE","LPAREN","NOTES","RPAREN","addChord","NOTE","NOTENAME","ACCIDENTAL","OCTAVE","addSingleNote","MICROTONES","ACCIDENTALS","DOT","setNoteDots","SLASH","MAYBESLASH","TYPES","setNoteType","DURATIONS","setNoteDuration","LBRACKET","KEYVAL","KEYVALS","RBRACKET","KEY","EQUALS","VAL","addNoteOption","SVAL","DVAL","Piece","chord","Builder","commitHooks","elements","rollingDuration","resetPiece","getElements","addCommitHook","commitHook","piece","addNote","standardAccidentals","notePiece","GhostNote","buildAndAttach","setId","commaSeparatedRegex","setClass","defaults","easyScoreHook","throwOnError","parser","ERROR_MSG","parameter","GlyphNote","ignoreTicks","setGlyph","SCALE","slash","ret","staveNoteScale","getStaveNoteScale","offsetScale","slashBBox","calcBeamedNotesSlashBBox","noteHeadBounds","defaultOffsetY","slashStemOffset","slashBeamOffset","protrusions","beam_slope","scaleX","beam_angle","atan","iPointOnBeam","slash_angle","protrusion_stem_dx","protrusion_stem_dy","protrusion_beam_dx","protrusion_beam_dy","stem0X","stemY","KeySigNote","semibreve_rest","MultiMeasureRest","number_of_measures","xs","hasPaddingLeft","hasPaddingRight","hasLineThickness","hasSymbolSpacing","padding_left","padding_right","line_thickness","symbol_spacing","use_symbols","show_number","number_line","number_glyph_point","serif_thickness","semibreve_rest_glyph_scale","getXs","drawLine","spacingBetweenLines","lineThicknessHalf","serifThickness","bot","leftIndented","rightIndented","lineTop","lineBottom","drawSymbols","n4","n2","n1","get_semibreve_rest","rest_scale","rest_width","yMiddle","timeSig","drawPedalGlyph","glyph_data","PedalMarking","custom_depress_text","custom_release_text","bracket_height","text_margin_right","bracket_line_width","pedal","MIXED","setCustomText","depress","drawBracketed","prev_x","prev_y","is_pedal_depressed","next_is_same","prev_is_same","drawText","pedal_depress","pedal_release","mixed","CODES","RepeatNote","drawArrowHead","StaveLine","line_dash","rounded_end","draw_start_arrow","draw_end_arrow","arrowhead_length","arrowhead_angle","text_position_vertical","TextVerticalPosition","text_justification","TextJustification","applyLineStyle","applyFontStyle","drawArrowLine","pt1","pt2","both_arrows","distance","ratio","end_y","start_y","line_angle","angle1","angle2","top_x","bottom_x","start_position","end_position","first_index","last_index","upwards_slope","notehead_width","vertical_position","System","spaceBetweenStaves","autoWidth","noJustification","debugFormatter","formatIterations","noPadding","details","formatOptions","addConnector","connector","addStave","staveOptions","spaceAbove","spaceBelow","debugNoteMetrics","options_details","allVoices","debugNoteMetricsYs","part","lastY","plotDebugging","plotMetrics","positions","ghost","draw_dots","draw_stem_through_stave","setGhost","tabToGlyph","getStemY","stemDownLine","stemStartLine","flag_x","flag_y","flag_code","drawStemThrough","stemThrough","stemLines","unused_strings","up_stem","down_stem","line_spacing","total_lines","stem_lines","strings","containsLastString","containsFirstString","line_ys","isTopBound","isBottomBound","getPartialStemLines","strings_used","stem_through","getUnusedStringGroups","drawPositions","tab_x","render_stem","TabStave","addTabGlyph","TextBracket","TextBracketPosition","stop","show_bracket","underline_superscript","Positions","PositionsString","main_measure","main_width","main_height","super_y","super_measure","super_width","super_height","line_y","TextDynamics","sequence","glyph_font_size","total_width","letter","letter_x","current_letter","TimeSigNote","timeSigInfo","VibratoBracket","bracket_data","stop_x","Factory","renderQ","systems","staves","initRenderer","getVoices","ghostNote","textNote","barNote","clefNote","timeSigNote","keySigNote","hJustify","vJustify","kerning","numMeasures","multiMeasureRest","secondaryBeamBreaks","curve","tie","vibratoBracket","textBracket","system","StaveHairpin","hairpin","left_shift_px","right_shift_px","right_shift_ticks","left_shift_ticks","ppt","pixelsPerTick","l_shift_px","r_shift_px","hairpin_options","setRenderOptions","dis","staff_height","l_shift","r_shift","CRESC","DECRESC","TabSlide","first_fret","last_fret","SLIDE_UP","SLIDE_DOWN","slide_y","Tuning","tuningString","tuningValues","setTuning","names","standard","dagdad","dropd","standardBanjo","noteToInteger","getValueForString","stringNum","getValueForFret","fretNum","stringValue","getNoteForFret","integerToNote","Flow","BUILD","VERSION","DATE","fontNames","fontModuleOrPath","hasKeySignature","getKeySignatures","GraceTabNote","KeyManager","setKey","getKey","scaleMapByValue","originalScaleMapByValue","getAccidental","selectNote","scaleNote","modparts","change","valueNote","originalValueNote","Tremolo","y_spacing_scale","extra_stroke_scale","y_spacing","cmp","eq","newArr","last","canvasSelector","start_time","Date","getTime","BravuraFont","bracketTop","y_min","bracketBottom","barlineTick","breathMarkTick","gClef","cClef","fClef","unpitchedPercussionClef1","timeSig0","timeSig1","timeSig2","timeSig3","timeSig4","timeSig5","timeSig6","timeSig7","timeSig8","timeSig9","timeSigCommon","timeSigCutCommon","timeSigPlus","timeSigPlusSmall","timeSigMinus","timeSigParensRight","timeSigParensRightSmall","timeSigParensLeft","timeSigParensLeftSmall","noteheadDoubleWhole","noteheadWhole","noteheadHalf","noteheadBlack","noteheadXWhole","noteheadXHalf","noteheadXBlack","noteheadCircleX","noteheadTriangleUpWhole","noteheadTriangleUpHalf","noteheadTriangleUpBlack","noteheadDiamondWhole","noteheadDiamondHalf","noteheadDiamondBlack","noteheadSquareWhite","noteheadSquareBlack","noteheadParenthesis","noteheadParenthesisRight","noteheadParenthesisLeft","augmentationDot","tremolo1","flag8thUp","flag8thDown","flag16thUp","flag16thDown","flag32ndUp","flag32ndDown","flag64thUp","flag64thDown","flag128thUp","flag128thDown","accidentalFlat","accidentalNatural","accidentalSharp","accidentalDoubleSharp","accidentalDoubleFlat","accidentalParensLeft","accidentalParensRight","accidentalQuarterToneFlatStein","accidentalThreeQuarterTonesFlatZimmermann","accidentalQuarterToneSharpStein","accidentalThreeQuarterTonesSharpStein","accidentalBuyukMucennebFlat","accidentalBakiyeFlat","accidentalKomaSharp","accidentalKucukMucennebSharp","accidentalKoron","accidentalSori","articAccentAbove","articAccentBelow","articTenutoAbove","articTenutoBelow","articStaccatoAbove","articStaccatoBelow","articStaccatissimoAbove","articStaccatissimoBelow","articMarcatoAbove","articMarcatoBelow","fermataAbove","fermataBelow","breathMarkComma","breathMarkUpbow","caesura","caesuraCurved","restMaxima","restDoubleWhole","restWhole","restHalf","restQuarter","rest8th","rest16th","rest32nd","rest64th","rest128th","dynamicPiano","dynamicMezzo","dynamicForte","dynamicRinforzando","dynamicSforzando","dynamicZ","ornamentTrill","ornamentTurn","ornamentTurnSlash","ornamentMordent","ornamentShortTrill","ornamentTremblement","ornamentPrecompAppoggTrill","ornamentPrecompSlideTrillDAnglebert","ornamentPrecompSlideTrillBach","ornamentPrecompTrillSuffixDandrieu","ornamentPrecompDoubleCadenceUpperPrefix","ornamentPrecompDoubleCadenceUpperPrefixTurn","ornamentPrecompTrillLowerSuffix","brassScoop","brassDoitMedium","brassFallLipShort","brassLiftMedium","brassFallRoughMedium","brassBend","brassMuteClosed","brassMuteOpen","brassFlip","brassJazzTurn","brassSmear","stringsDownBow","stringsUpBow","stringsHarmonic","pluckedSnapPizzicatoAbove","pluckedSnapPizzicatoBelow","pluckedLeftHandPizzicato","keyboardPedalPed","keyboardPedalUp","pictChokeCymbal","wiggleArpeggiatoUp","arrowheadBlackUp","arrowheadBlackDown","arpeggiatoUp","arpeggiatoDown","repeat1Bar","repeat2Bars","repeat4Bars","repeatBarSlash","csymDiminished","csymHalfDiminished","csymAugmented","csymMajorSeventh","csymMinor","csymParensLeftTall","csymParensRightTall","csymBracketLeftTall","csymBracketRightTall","csymParensLeftVeryTall","csymParensRightVeryTall","csymDiagonalArrangementSlash","generatedOn","BravuraMetrics","smufl","endPaddingMax","endPaddingMin","unalignedNotePadding","default","small","smuflCode","shiftX","lineCount","gracenote","pedalMarking","up","down","digits","shiftLine","tupletPoint","tremolo","offsetYStemUp","offsetYStemDown","offsetXStemUp","offsetXStemDown","grace","staveRepetition","offsetY","offsetSymbol","heightAdjustmentForFlag","tabStem","staveTempo","straight","wiggly","minPadding","restQuarterStemUp","restQuarterStemDown","custom","noteheadCircleXStemUp","noteheadCircleXStemDown","noteheadDiamondHalfStemUp","noteheadDiamondBlackStemUp","noteheadDiamondWholeStemUp","noteheadXHalfStemUp","noteheadXHalfStemDown","noteheadXWholeStemUp","noteheadXWholeStemDown","noteheadSquareWhiteStemDown","noteheadSquareWhiteStemUp","noteheadSquareBlackStemUp","noteheadTriangleUpWholeStemUp","CustomFont","vexAccidentalMicrotonal2","vexAccidentalMicrotonal3","vexAccidentalMicrotonal4","vexNoteHeadRectBlack","vexNoteHeadRectWhite","CustomMetrics","GonvilleFont","vexAccidentalMicrotonal1","vexWiggleArpeggioUp","vexNoteHeadMutedBreve","cssFontWeight","ascender","underlinePosition","cssFontStyle","yMin","original_font_information","postscript_name","version_string","vendor_url","full_font_name","font_family_name","copyright","description","trademark","designer","designer_url","unique_font_identifier","license_url","license_description","manufacturer_name","font_sub_family_name","descender","lineHeight","underlineThickness","GonvilleMetrics","PetalumaFont","PetalumaMetrics","noteheadBlackStemUp","noteheadHalfStemUp","noteheadWholeStemUp","noteheadXBlackStemUp","PetalumaScriptFont","$","I","J","K","N","O","Q","U","V","Y","Z","_","l","RobotoSlabFont","setMusicFont","fontData","registerInfo","loadTextFonts"],"sourceRoot":""} \ No newline at end of file diff --git a/build/esm/entry/vexflow-bravura.js b/build/esm/entry/vexflow-bravura.js new file mode 100644 index 0000000000..e40e0dfa9f --- /dev/null +++ b/build/esm/entry/vexflow-bravura.js @@ -0,0 +1,11 @@ +import { Vex } from '../src/vex.js'; +import { Flow } from '../src/flow.js'; +import { loadBravura } from '../src/fonts/load_bravura.js'; +import { loadCustom } from '../src/fonts/load_custom.js'; +import { loadTextFonts } from '../src/fonts/textfonts.js'; +loadBravura(); +loadCustom(); +Flow.setMusicFont('Bravura', 'Custom'); +loadTextFonts(); +export * from '../src/index.js'; +export default Vex; diff --git a/build/esm/entry/vexflow-core.js b/build/esm/entry/vexflow-core.js new file mode 100644 index 0000000000..004129f999 --- /dev/null +++ b/build/esm/entry/vexflow-core.js @@ -0,0 +1,54 @@ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +import { Vex } from '../src/vex.js'; +import { Flow } from '../src/flow.js'; +import { Font } from '../src/font.js'; +import { loadTextFonts } from '../src/fonts/textfonts.js'; +import { globalObject, RuntimeError } from '../src/util.js'; +const fontModules = { + Bravura: './vexflow-font-bravura.js', + Gonville: './vexflow-font-gonville.js', + Petaluma: './vexflow-font-petaluma.js', + Custom: './vexflow-font-custom.js', +}; +Flow.fetchMusicFont = (fontName, fontModuleOrPath) => __awaiter(void 0, void 0, void 0, function* () { + const font = Font.load(fontName); + if (font.hasData()) { + return; + } + if (!fontModuleOrPath) { + if (fontName in fontModules) { + fontModuleOrPath = fontModules[fontName]; + } + else { + throw new RuntimeError('UnknownFont', `Music font ${fontName} does not exist.`); + } + } + let fontModule; + if (typeof fontModuleOrPath === 'string') { + const module = yield import(fontModuleOrPath); + const g = globalObject(); + const VexFlowFont = g['VexFlowFont']; + if (typeof VexFlowFont !== 'undefined' && typeof VexFlowFont[fontName] !== 'undefined') { + fontModule = VexFlowFont[fontName]; + } + else { + fontModule = module.Font; + } + } + else { + fontModule = fontModuleOrPath; + } + font.setData(fontModule.data); + font.setMetrics(fontModule.metrics); +}); +loadTextFonts(); +export * from '../src/index.js'; +export default Vex; diff --git a/build/esm/entry/vexflow-debug-with-tests.js b/build/esm/entry/vexflow-debug-with-tests.js new file mode 100644 index 0000000000..8a180725bb --- /dev/null +++ b/build/esm/entry/vexflow-debug-with-tests.js @@ -0,0 +1,4 @@ +import { Vex } from './vexflow.js'; +export * from '../src/index.js'; +export * from '../tests/index.js'; +export default Vex; diff --git a/build/esm/entry/vexflow-debug.js b/build/esm/entry/vexflow-debug.js new file mode 100644 index 0000000000..187436ecc8 --- /dev/null +++ b/build/esm/entry/vexflow-debug.js @@ -0,0 +1,3 @@ +import { Vex } from './vexflow.js'; +export * from '../src/index.js'; +export default Vex; diff --git a/build/esm/entry/vexflow-font-bravura.js b/build/esm/entry/vexflow-font-bravura.js new file mode 100644 index 0000000000..8f8364c432 --- /dev/null +++ b/build/esm/entry/vexflow-font-bravura.js @@ -0,0 +1,7 @@ +import { BravuraFont } from '../src/fonts/bravura_glyphs.js'; +import { BravuraMetrics } from '../src/fonts/bravura_metrics.js'; +export const Font = { + data: BravuraFont, + metrics: BravuraMetrics, +}; +export default Font; diff --git a/build/esm/entry/vexflow-font-custom.js b/build/esm/entry/vexflow-font-custom.js new file mode 100644 index 0000000000..1d6e7e9668 --- /dev/null +++ b/build/esm/entry/vexflow-font-custom.js @@ -0,0 +1,7 @@ +import { CustomFont } from '../src/fonts/custom_glyphs.js'; +import { CustomMetrics } from '../src/fonts/custom_metrics.js'; +export const Font = { + data: CustomFont, + metrics: CustomMetrics, +}; +export default Font; diff --git a/build/esm/entry/vexflow-font-gonville.js b/build/esm/entry/vexflow-font-gonville.js new file mode 100644 index 0000000000..8e4d9f72cb --- /dev/null +++ b/build/esm/entry/vexflow-font-gonville.js @@ -0,0 +1,7 @@ +import { GonvilleFont } from '../src/fonts/gonville_glyphs.js'; +import { GonvilleMetrics } from '../src/fonts/gonville_metrics.js'; +export const Font = { + data: GonvilleFont, + metrics: GonvilleMetrics, +}; +export default Font; diff --git a/build/esm/entry/vexflow-font-petaluma.js b/build/esm/entry/vexflow-font-petaluma.js new file mode 100644 index 0000000000..6c1cdd9dad --- /dev/null +++ b/build/esm/entry/vexflow-font-petaluma.js @@ -0,0 +1,7 @@ +import { PetalumaFont } from '../src/fonts/petaluma_glyphs.js'; +import { PetalumaMetrics } from '../src/fonts/petaluma_metrics.js'; +export const Font = { + data: PetalumaFont, + metrics: PetalumaMetrics, +}; +export default Font; diff --git a/build/esm/entry/vexflow-gonville.js b/build/esm/entry/vexflow-gonville.js new file mode 100644 index 0000000000..f84a637756 --- /dev/null +++ b/build/esm/entry/vexflow-gonville.js @@ -0,0 +1,11 @@ +import { Vex } from '../src/vex.js'; +import { Flow } from '../src/flow.js'; +import { loadCustom } from '../src/fonts/load_custom.js'; +import { loadGonville } from '../src/fonts/load_gonville.js'; +import { loadTextFonts } from '../src/fonts/textfonts.js'; +loadGonville(); +loadCustom(); +Flow.setMusicFont('Gonville', 'Custom'); +loadTextFonts(); +export * from '../src/index.js'; +export default Vex; diff --git a/build/esm/entry/vexflow-petaluma.js b/build/esm/entry/vexflow-petaluma.js new file mode 100644 index 0000000000..40a83e25ad --- /dev/null +++ b/build/esm/entry/vexflow-petaluma.js @@ -0,0 +1,11 @@ +import { Vex } from '../src/vex.js'; +import { Flow } from '../src/flow.js'; +import { loadCustom } from '../src/fonts/load_custom.js'; +import { loadPetaluma } from '../src/fonts/load_petaluma.js'; +import { loadTextFonts } from '../src/fonts/textfonts.js'; +loadPetaluma(); +loadCustom(); +Flow.setMusicFont('Petaluma', 'Custom'); +loadTextFonts(); +export * from '../src/index.js'; +export default Vex; diff --git a/build/esm/entry/vexflow.js b/build/esm/entry/vexflow.js new file mode 100644 index 0000000000..e0460bf5d1 --- /dev/null +++ b/build/esm/entry/vexflow.js @@ -0,0 +1,9 @@ +import { Vex } from '../src/vex.js'; +import { Flow } from '../src/flow.js'; +import { loadAllMusicFonts } from '../src/fonts/load_all.js'; +import { loadTextFonts } from '../src/fonts/textfonts.js'; +loadAllMusicFonts(); +Flow.setMusicFont('Bravura', 'Gonville', 'Custom'); +loadTextFonts(); +export * from '../src/index.js'; +export default Vex; diff --git a/build/esm/package.json b/build/esm/package.json new file mode 100644 index 0000000000..3dbc1ca591 --- /dev/null +++ b/build/esm/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/build/esm/src/accidental.js b/build/esm/src/accidental.js new file mode 100644 index 0000000000..fb3e90eaeb --- /dev/null +++ b/build/esm/src/accidental.js @@ -0,0 +1,348 @@ +import { Fraction } from './fraction.js'; +import { Glyph } from './glyph.js'; +import { Modifier } from './modifier.js'; +import { Music } from './music.js'; +import { Tables } from './tables.js'; +import { isAccidental, isGraceNote, isGraceNoteGroup, isStaveNote } from './typeguard.js'; +import { defined, log } from './util.js'; +function L(...args) { + if (Accidental.DEBUG) + log('Vex.Flow.Accidental', args); +} +export class Accidental extends Modifier { + constructor(type) { + super(); + L('New accidental: ', type); + this.type = type; + this.position = Modifier.Position.LEFT; + this.render_options = { + font_scale: 38, + parenLeftPadding: 2, + parenRightPadding: 2, + }; + this.accidental = Tables.accidentalCodes(this.type); + defined(this.accidental, 'ArgumentError', `Unknown accidental type: ${type}`); + this.cautionary = false; + this.reset(); + } + static get CATEGORY() { + return "Accidental"; + } + static format(accidentals, state) { + if (!accidentals || accidentals.length === 0) + return; + const musicFont = Tables.currentMusicFont(); + const noteheadAccidentalPadding = musicFont.lookupMetric('accidental.noteheadAccidentalPadding'); + const leftShift = state.left_shift + noteheadAccidentalPadding; + const accidentalSpacing = musicFont.lookupMetric('accidental.accidentalSpacing'); + const additionalPadding = musicFont.lookupMetric('accidental.leftPadding'); + const accList = []; + let prevNote = undefined; + let shiftL = 0; + for (let i = 0; i < accidentals.length; ++i) { + const acc = accidentals[i]; + const note = acc.getNote(); + const stave = note.getStave(); + const index = acc.checkIndex(); + const props = note.getKeyProps()[index]; + if (note !== prevNote) { + for (let n = 0; n < note.keys.length; ++n) { + shiftL = Math.max(note.getLeftDisplacedHeadPx(), shiftL); + } + prevNote = note; + } + if (stave) { + const lineSpace = stave.getSpacingBetweenLines(); + const y = stave.getYForLine(props.line); + const accLine = Math.round((y / lineSpace) * 2) / 2; + accList.push({ y, line: accLine, shift: shiftL, acc, lineSpace }); + } + else { + accList.push({ line: props.line, shift: shiftL, acc }); + } + } + accList.sort((a, b) => b.line - a.line); + const lineList = []; + let accShift = 0; + let previousLine = undefined; + for (let i = 0; i < accList.length; i++) { + const acc = accList[i]; + if (previousLine === undefined || previousLine !== acc.line) { + lineList.push({ + line: acc.line, + flatLine: true, + dblSharpLine: true, + numAcc: 0, + width: 0, + column: 0, + }); + } + if (acc.acc.type !== 'b' && acc.acc.type !== 'bb') { + lineList[lineList.length - 1].flatLine = false; + } + if (acc.acc.type !== '##') { + lineList[lineList.length - 1].dblSharpLine = false; + } + lineList[lineList.length - 1].numAcc++; + lineList[lineList.length - 1].width += acc.acc.getWidth() + accidentalSpacing; + accShift = acc.shift > accShift ? acc.shift : accShift; + previousLine = acc.line; + } + let totalColumns = 0; + for (let i = 0; i < lineList.length; i++) { + let noFurtherConflicts = false; + const groupStart = i; + let groupEnd = i; + while (groupEnd + 1 < lineList.length && !noFurtherConflicts) { + if (this.checkCollision(lineList[groupEnd], lineList[groupEnd + 1])) { + groupEnd++; + } + else { + noFurtherConflicts = true; + } + } + const getGroupLine = (index) => lineList[groupStart + index]; + const getGroupLines = (indexes) => indexes.map(getGroupLine); + const lineDifference = (indexA, indexB) => { + const [a, b] = getGroupLines([indexA, indexB]).map((item) => item.line); + return a - b; + }; + const notColliding = (...indexPairs) => indexPairs.map(getGroupLines).every(([line1, line2]) => !this.checkCollision(line1, line2)); + const groupLength = groupEnd - groupStart + 1; + let endCase = this.checkCollision(lineList[groupStart], lineList[groupEnd]) ? 'a' : 'b'; + switch (groupLength) { + case 3: + if (endCase === 'a' && lineDifference(1, 2) === 0.5 && lineDifference(0, 1) !== 0.5) { + endCase = 'second_on_bottom'; + } + break; + case 4: + if (notColliding([0, 2], [1, 3])) { + endCase = 'spaced_out_tetrachord'; + } + break; + case 5: + if (endCase === 'b' && notColliding([1, 3])) { + endCase = 'spaced_out_pentachord'; + if (notColliding([0, 2], [2, 4])) { + endCase = 'very_spaced_out_pentachord'; + } + } + break; + case 6: + if (notColliding([0, 3], [1, 4], [2, 5])) { + endCase = 'spaced_out_hexachord'; + } + if (notColliding([0, 2], [2, 4], [1, 3], [3, 5])) { + endCase = 'very_spaced_out_hexachord'; + } + break; + default: + break; + } + let groupMember; + let column; + if (groupLength >= 7) { + let patternLength = 2; + let collisionDetected = true; + while (collisionDetected === true) { + collisionDetected = false; + for (let line = 0; line + patternLength < lineList.length; line++) { + if (this.checkCollision(lineList[line], lineList[line + patternLength])) { + collisionDetected = true; + patternLength++; + break; + } + } + } + for (groupMember = i; groupMember <= groupEnd; groupMember++) { + column = ((groupMember - i) % patternLength) + 1; + lineList[groupMember].column = column; + totalColumns = totalColumns > column ? totalColumns : column; + } + } + else { + for (groupMember = i; groupMember <= groupEnd; groupMember++) { + column = Tables.accidentalColumnsTable[groupLength][endCase][groupMember - i]; + lineList[groupMember].column = column; + totalColumns = totalColumns > column ? totalColumns : column; + } + } + i = groupEnd; + } + const columnWidths = []; + const columnXOffsets = []; + for (let i = 0; i <= totalColumns; i++) { + columnWidths[i] = 0; + columnXOffsets[i] = 0; + } + columnWidths[0] = accShift + leftShift; + columnXOffsets[0] = accShift + leftShift; + lineList.forEach((line) => { + if (line.width > columnWidths[line.column]) + columnWidths[line.column] = line.width; + }); + for (let i = 1; i < columnWidths.length; i++) { + columnXOffsets[i] = columnWidths[i] + columnXOffsets[i - 1]; + } + const totalShift = columnXOffsets[columnXOffsets.length - 1]; + let accCount = 0; + lineList.forEach((line) => { + let lineWidth = 0; + const lastAccOnLine = accCount + line.numAcc; + for (accCount; accCount < lastAccOnLine; accCount++) { + const xShift = columnXOffsets[line.column - 1] + lineWidth; + accList[accCount].acc.setXShift(xShift); + lineWidth += accList[accCount].acc.getWidth() + accidentalSpacing; + L('Line, accCount, shift: ', line.line, accCount, xShift); + } + }); + state.left_shift += totalShift + additionalPadding; + } + static checkCollision(line1, line2) { + let clearance = line2.line - line1.line; + let clearanceRequired = 3; + if (clearance > 0) { + clearanceRequired = line2.flatLine || line2.dblSharpLine ? 2.5 : 3.0; + if (line1.dblSharpLine) + clearance -= 0.5; + } + else { + clearanceRequired = line1.flatLine || line1.dblSharpLine ? 2.5 : 3.0; + if (line2.dblSharpLine) + clearance -= 0.5; + } + const collision = Math.abs(clearance) < clearanceRequired; + L('Line_1, Line_2, Collision: ', line1.line, line2.line, collision); + return collision; + } + static applyAccidentals(voices, keySignature) { + const tickPositions = []; + const tickNoteMap = {}; + voices.forEach((voice) => { + const tickPosition = new Fraction(0, 1); + const tickable = voice.getTickables(); + tickable.forEach((t) => { + if (t.shouldIgnoreTicks()) + return; + const notesAtPosition = tickNoteMap[tickPosition.value()]; + if (!notesAtPosition) { + tickPositions.push(tickPosition.value()); + tickNoteMap[tickPosition.value()] = [t]; + } + else { + notesAtPosition.push(t); + } + tickPosition.add(t.getTicks()); + }); + }); + const music = new Music(); + if (!keySignature) + keySignature = 'C'; + const scaleMapKey = music.createScaleMap(keySignature); + const scaleMap = {}; + tickPositions.forEach((tickPos) => { + const tickables = tickNoteMap[tickPos]; + const modifiedPitches = []; + const processNote = (t) => { + if (!isStaveNote(t) || t.isRest() || t.shouldIgnoreTicks()) { + return; + } + const staveNote = t; + staveNote.keys.forEach((keyString, keyIndex) => { + const key = music.getNoteParts(keyString.split('/')[0]); + const octave = keyString.split('/')[1]; + const accidentalString = key.accidental || 'n'; + const pitch = key.root + accidentalString; + if (!scaleMap[key.root + octave]) + scaleMap[key.root + octave] = scaleMapKey[key.root]; + const sameAccidental = scaleMap[key.root + octave] === pitch; + const previouslyModified = modifiedPitches.indexOf(keyString) > -1; + staveNote.getModifiers().forEach((modifier, index) => { + if (isAccidental(modifier) && modifier.type == accidentalString && modifier.getIndex() == keyIndex) { + staveNote.getModifiers().splice(index, 1); + } + }); + if (!sameAccidental || (sameAccidental && previouslyModified)) { + scaleMap[key.root + octave] = pitch; + const accidental = new Accidental(accidentalString); + staveNote.addModifier(accidental, keyIndex); + modifiedPitches.push(keyString); + } + }); + staveNote.getModifiers().forEach((modifier) => { + if (isGraceNoteGroup(modifier)) { + modifier.getGraceNotes().forEach(processNote); + } + }); + }; + tickables.forEach(processNote); + }); + } + reset() { + const fontScale = this.render_options.font_scale; + this.glyph = new Glyph(this.accidental.code, fontScale); + this.glyph.setOriginX(1.0); + if (this.cautionary) { + this.parenLeft = new Glyph(Tables.accidentalCodes('{').code, fontScale); + this.parenRight = new Glyph(Tables.accidentalCodes('}').code, fontScale); + this.parenLeft.setOriginX(1.0); + this.parenRight.setOriginX(1.0); + } + } + getWidth() { + if (this.cautionary) { + const parenLeft = defined(this.parenLeft); + const parenRight = defined(this.parenRight); + const parenWidth = parenLeft.getMetrics().width + + parenRight.getMetrics().width + + this.render_options.parenLeftPadding + + this.render_options.parenRightPadding; + return this.glyph.getMetrics().width + parenWidth; + } + else { + return this.glyph.getMetrics().width; + } + } + setNote(note) { + defined(note, 'ArgumentError', `Bad note value: ${note}`); + this.note = note; + if (isGraceNote(note)) { + this.render_options.font_scale = 25; + this.reset(); + } + return this; + } + setAsCautionary() { + this.cautionary = true; + this.render_options.font_scale = 28; + this.reset(); + return this; + } + draw() { + const { type, position, index, cautionary, x_shift, y_shift, glyph, render_options: { parenLeftPadding, parenRightPadding }, } = this; + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const start = note.getModifierStartXY(position, index); + let accX = start.x + x_shift; + const accY = start.y + y_shift; + L('Rendering: ', type, accX, accY); + if (!cautionary) { + glyph.render(ctx, accX, accY); + } + else { + const parenLeft = defined(this.parenLeft); + const parenRight = defined(this.parenRight); + parenRight.render(ctx, accX, accY); + accX -= parenRight.getMetrics().width; + accX -= parenRightPadding; + accX -= this.accidental.parenRightPaddingAdjustment; + glyph.render(ctx, accX, accY); + accX -= glyph.getMetrics().width; + accX -= parenLeftPadding; + parenLeft.render(ctx, accX, accY); + } + } +} +Accidental.DEBUG = false; diff --git a/build/esm/src/annotation.js b/build/esm/src/annotation.js new file mode 100644 index 0000000000..1a2cdea645 --- /dev/null +++ b/build/esm/src/annotation.js @@ -0,0 +1,213 @@ +import { Element } from './element.js'; +import { Modifier, ModifierPosition } from './modifier.js'; +import { Stem } from './stem.js'; +import { Tables } from './tables.js'; +import { TextFormatter } from './textformatter.js'; +import { isStemmableNote, isTabNote } from './typeguard.js'; +import { log } from './util.js'; +function L(...args) { + if (Annotation.DEBUG) + log('Vex.Flow.Annotation', args); +} +export var AnnotationHorizontalJustify; +(function (AnnotationHorizontalJustify) { + AnnotationHorizontalJustify[AnnotationHorizontalJustify["LEFT"] = 1] = "LEFT"; + AnnotationHorizontalJustify[AnnotationHorizontalJustify["CENTER"] = 2] = "CENTER"; + AnnotationHorizontalJustify[AnnotationHorizontalJustify["RIGHT"] = 3] = "RIGHT"; + AnnotationHorizontalJustify[AnnotationHorizontalJustify["CENTER_STEM"] = 4] = "CENTER_STEM"; +})(AnnotationHorizontalJustify || (AnnotationHorizontalJustify = {})); +export var AnnotationVerticalJustify; +(function (AnnotationVerticalJustify) { + AnnotationVerticalJustify[AnnotationVerticalJustify["TOP"] = 1] = "TOP"; + AnnotationVerticalJustify[AnnotationVerticalJustify["CENTER"] = 2] = "CENTER"; + AnnotationVerticalJustify[AnnotationVerticalJustify["BOTTOM"] = 3] = "BOTTOM"; + AnnotationVerticalJustify[AnnotationVerticalJustify["CENTER_STEM"] = 4] = "CENTER_STEM"; +})(AnnotationVerticalJustify || (AnnotationVerticalJustify = {})); +export class Annotation extends Modifier { + constructor(text) { + super(); + this.text = text; + this.horizontalJustification = AnnotationHorizontalJustify.CENTER; + this.verticalJustification = AnnotationVerticalJustify.TOP; + this.resetFont(); + this.setWidth(Tables.textWidth(text)); + } + static get CATEGORY() { + return "Annotation"; + } + static format(annotations, state) { + if (!annotations || annotations.length === 0) + return false; + let width = 0; + for (let i = 0; i < annotations.length; ++i) { + const annotation = annotations[i]; + const textFormatter = TextFormatter.create(annotation.textFont); + const textLines = (5 + textFormatter.maxHeight) / Tables.STAVE_LINE_DISTANCE; + let verticalSpaceNeeded = textLines; + const note = annotation.checkAttachedNote(); + const stave = note.getStave(); + const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP; + let stemHeight = 0; + let lines = 5; + if (isTabNote(note)) { + if (note.render_options.draw_stem) { + const stem = note.getStem(); + if (stem) { + stemHeight = Math.abs(stem.getHeight()) / Tables.STAVE_LINE_DISTANCE; + } + } + else { + stemHeight = 0; + } + } + else if (isStemmableNote(note)) { + const stem = note.getStem(); + if (stem && note.getNoteType() === 'n') { + stemHeight = Math.abs(stem.getHeight()) / Tables.STAVE_LINE_DISTANCE; + } + } + if (stave) { + lines = stave.getNumLines(); + } + const textWidth = textFormatter.getWidthForTextInPx(annotation.text); + width = Math.max(width, textWidth); + if (annotation.verticalJustification === this.VerticalJustify.TOP) { + let noteLine = note.getLineNumber(true); + if (isTabNote(note)) { + noteLine = lines - (note.leastString() - 0.5); + } + if (stemDirection === Stem.UP) { + noteLine += stemHeight; + } + const curTop = noteLine + state.top_text_line + 0.5; + if (curTop < lines) { + annotation.setTextLine(lines - noteLine); + verticalSpaceNeeded += lines - noteLine; + state.top_text_line = verticalSpaceNeeded; + } + else { + annotation.setTextLine(state.top_text_line); + state.top_text_line += verticalSpaceNeeded; + } + } + else if (annotation.verticalJustification === this.VerticalJustify.BOTTOM) { + let noteLine = lines - note.getLineNumber(); + if (isTabNote(note)) { + noteLine = note.greatestString() - 1; + } + if (stemDirection === Stem.DOWN) { + noteLine += stemHeight; + } + const curBottom = noteLine + state.text_line + 1; + if (curBottom < lines) { + annotation.setTextLine(lines - curBottom); + verticalSpaceNeeded += lines - curBottom; + state.text_line = verticalSpaceNeeded; + } + else { + annotation.setTextLine(state.text_line); + state.text_line += verticalSpaceNeeded; + } + } + else { + annotation.setTextLine(state.text_line); + } + } + state.left_shift += width / 2; + state.right_shift += width / 2; + return true; + } + setVerticalJustification(just) { + this.verticalJustification = typeof just === 'string' ? Annotation.VerticalJustifyString[just] : just; + return this; + } + getJustification() { + return this.horizontalJustification; + } + setJustification(just) { + this.horizontalJustification = typeof just === 'string' ? Annotation.HorizontalJustifyString[just] : just; + return this; + } + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP; + const textFormatter = TextFormatter.create(this.textFont); + const start = note.getModifierStartXY(ModifierPosition.ABOVE, this.index); + this.setRendered(); + ctx.save(); + const classString = Object.keys(this.getAttribute('classes')).join(' '); + ctx.openGroup(classString, this.getAttribute('id')); + ctx.setFont(this.textFont); + const text_width = ctx.measureText(this.text).width; + const text_height = textFormatter.maxHeight + 2; + let x; + let y; + if (this.horizontalJustification === AnnotationHorizontalJustify.LEFT) { + x = start.x; + } + else if (this.horizontalJustification === AnnotationHorizontalJustify.RIGHT) { + x = start.x - text_width; + } + else if (this.horizontalJustification === AnnotationHorizontalJustify.CENTER) { + x = start.x - text_width / 2; + } + else { + x = note.getStemX() - text_width / 2; + } + let stem_ext = {}; + let spacing = 0; + const has_stem = note.hasStem(); + const stave = note.checkStave(); + if (has_stem) { + stem_ext = note.checkStem().getExtents(); + spacing = stave.getSpacingBetweenLines(); + } + if (this.verticalJustification === AnnotationVerticalJustify.BOTTOM) { + const ys = note.getYs(); + y = ys.reduce((a, b) => (a > b ? a : b)); + y += (this.text_line + 1) * Tables.STAVE_LINE_DISTANCE + text_height; + if (has_stem && stemDirection === Stem.DOWN) { + y = Math.max(y, stem_ext.topY + text_height + spacing * this.text_line); + } + } + else if (this.verticalJustification === AnnotationVerticalJustify.CENTER) { + const yt = note.getYForTopText(this.text_line) - 1; + const yb = stave.getYForBottomText(this.text_line); + y = yt + (yb - yt) / 2 + text_height / 2; + } + else if (this.verticalJustification === AnnotationVerticalJustify.TOP) { + y = note.getYs()[0] - (this.text_line + 1) * Tables.STAVE_LINE_DISTANCE; + if (has_stem && stemDirection === Stem.UP) { + spacing = stem_ext.topY < stave.getTopLineTopY() ? Tables.STAVE_LINE_DISTANCE : spacing; + y = Math.min(y, stem_ext.topY - spacing * (this.text_line + 1)); + } + } + else { + const extents = note.getStemExtents(); + y = extents.topY + (extents.baseY - extents.topY) / 2 + text_height / 2; + } + L('Rendering annotation: ', this.text, x, y); + ctx.fillText(this.text, x, y); + ctx.closeGroup(); + ctx.restore(); + } +} +Annotation.DEBUG = false; +Annotation.TEXT_FONT = Object.assign({}, Element.TEXT_FONT); +Annotation.HorizontalJustify = AnnotationHorizontalJustify; +Annotation.HorizontalJustifyString = { + left: AnnotationHorizontalJustify.LEFT, + right: AnnotationHorizontalJustify.RIGHT, + center: AnnotationHorizontalJustify.CENTER, + centerStem: AnnotationHorizontalJustify.CENTER_STEM, +}; +Annotation.VerticalJustify = AnnotationVerticalJustify; +Annotation.VerticalJustifyString = { + above: AnnotationVerticalJustify.TOP, + top: AnnotationVerticalJustify.TOP, + below: AnnotationVerticalJustify.BOTTOM, + bottom: AnnotationVerticalJustify.BOTTOM, + center: AnnotationVerticalJustify.CENTER, + centerStem: AnnotationVerticalJustify.CENTER_STEM, +}; diff --git a/build/esm/src/articulation.js b/build/esm/src/articulation.js new file mode 100644 index 0000000000..3897d54819 --- /dev/null +++ b/build/esm/src/articulation.js @@ -0,0 +1,264 @@ +import { Glyph } from './glyph.js'; +import { Modifier } from './modifier.js'; +import { Stem } from './stem.js'; +import { Tables } from './tables.js'; +import { isGraceNote, isStaveNote, isStemmableNote, isTabNote } from './typeguard.js'; +import { defined, log, RuntimeError } from './util.js'; +function L(...args) { + if (Articulation.DEBUG) + log('Vex.Flow.Articulation', args); +} +const { ABOVE, BELOW } = Modifier.Position; +function roundToNearestHalf(mathFn, value) { + return mathFn(value / 0.5) * 0.5; +} +function isWithinLines(line, position) { + return position === ABOVE ? line <= 5 : line >= 1; +} +function getRoundingFunction(line, position) { + if (isWithinLines(line, position)) { + if (position === ABOVE) { + return Math.ceil; + } + else { + return Math.floor; + } + } + else { + return Math.round; + } +} +function snapLineToStaff(canSitBetweenLines, line, position, offsetDirection) { + const snappedLine = roundToNearestHalf(getRoundingFunction(line, position), line); + const canSnapToStaffSpace = canSitBetweenLines && isWithinLines(snappedLine, position); + const onStaffLine = snappedLine % 1 === 0; + if (canSnapToStaffSpace && onStaffLine) { + const HALF_STAFF_SPACE = 0.5; + return snappedLine + HALF_STAFF_SPACE * -offsetDirection; + } + else { + return snappedLine; + } +} +const isStaveOrGraceNote = (note) => isStaveNote(note) || isGraceNote(note); +function getTopY(note, textLine) { + const stemDirection = note.getStemDirection(); + const { topY: stemTipY, baseY: stemBaseY } = note.getStemExtents(); + if (isStaveOrGraceNote(note)) { + if (note.hasStem()) { + if (stemDirection === Stem.UP) { + return stemTipY; + } + else { + return stemBaseY; + } + } + else { + return Math.min(...note.getYs()); + } + } + else if (isTabNote(note)) { + if (note.hasStem()) { + if (stemDirection === Stem.UP) { + return stemTipY; + } + else { + return note.checkStave().getYForTopText(textLine); + } + } + else { + return note.checkStave().getYForTopText(textLine); + } + } + else { + throw new RuntimeError('UnknownCategory', 'Only can get the top and bottom ys of stavenotes and tabnotes'); + } +} +function getBottomY(note, textLine) { + const stemDirection = note.getStemDirection(); + const { topY: stemTipY, baseY: stemBaseY } = note.getStemExtents(); + if (isStaveOrGraceNote(note)) { + if (note.hasStem()) { + if (stemDirection === Stem.UP) { + return stemBaseY; + } + else { + return stemTipY; + } + } + else { + return Math.max(...note.getYs()); + } + } + else if (isTabNote(note)) { + if (note.hasStem()) { + if (stemDirection === Stem.UP) { + return note.checkStave().getYForBottomText(textLine); + } + else { + return stemTipY; + } + } + else { + return note.checkStave().getYForBottomText(textLine); + } + } + else { + throw new RuntimeError('UnknownCategory', 'Only can get the top and bottom ys of stavenotes and tabnotes'); + } +} +function getInitialOffset(note, position) { + const isOnStemTip = (position === ABOVE && note.getStemDirection() === Stem.UP) || + (position === BELOW && note.getStemDirection() === Stem.DOWN); + if (isStaveOrGraceNote(note)) { + if (note.hasStem() && isOnStemTip) { + return 0.5; + } + else { + return 1; + } + } + else { + if (note.hasStem() && isOnStemTip) { + return 1; + } + else { + return 0; + } + } +} +export class Articulation extends Modifier { + constructor(type) { + super(); + this.type = type; + this.position = BELOW; + this.render_options = { + font_scale: 38, + }; + this.reset(); + } + static get CATEGORY() { + return "Articulation"; + } + static format(articulations, state) { + if (!articulations || articulations.length === 0) + return false; + const margin = 0.5; + const getIncrement = (articulation, line, position) => roundToNearestHalf(getRoundingFunction(line, position), defined(articulation.glyph.getMetrics().height) / 10 + margin); + articulations.forEach((articulation) => { + const note = articulation.checkAttachedNote(); + let lines = 5; + const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP; + let stemHeight = 0; + if (isStemmableNote(note)) { + const stem = note.getStem(); + if (stem) { + stemHeight = Math.abs(stem.getHeight()) / Tables.STAVE_LINE_DISTANCE; + } + } + const stave = note.getStave(); + if (stave) { + lines = stave.getNumLines(); + } + if (articulation.getPosition() === ABOVE) { + let noteLine = note.getLineNumber(true); + if (stemDirection === Stem.UP) { + noteLine += stemHeight; + } + let increment = getIncrement(articulation, state.top_text_line, ABOVE); + const curTop = noteLine + state.top_text_line + 0.5; + if (!articulation.articulation.between_lines && curTop < lines) { + increment += lines - curTop; + } + articulation.setTextLine(state.top_text_line); + state.top_text_line += increment; + } + else if (articulation.getPosition() === BELOW) { + let noteLine = Math.max(lines - note.getLineNumber(), 0); + if (stemDirection === Stem.DOWN) { + noteLine += stemHeight; + } + let increment = getIncrement(articulation, state.text_line, BELOW); + const curBottom = noteLine + state.text_line + 0.5; + if (!articulation.articulation.between_lines && curBottom < lines) { + increment += lines - curBottom; + } + articulation.setTextLine(state.text_line); + state.text_line += increment; + } + }); + const width = articulations + .map((articulation) => articulation.getWidth()) + .reduce((maxWidth, articWidth) => Math.max(articWidth, maxWidth)); + state.left_shift += width / 2; + state.right_shift += width / 2; + return true; + } + static easyScoreHook({ articulations }, note, builder) { + if (!articulations) + return; + const articNameToCode = { + staccato: 'a.', + tenuto: 'a-', + accent: 'a>', + }; + articulations + .split(',') + .map((articString) => articString.trim().split('.')) + .map(([name, position]) => { + const artic = { type: articNameToCode[name] }; + if (position) + artic.position = Modifier.PositionString[position]; + return builder.getFactory().Articulation(artic); + }) + .map((artic) => note.addModifier(artic, 0)); + } + reset() { + this.articulation = Tables.articulationCodes(this.type); + const articulation = defined(this.articulation, 'ArgumentError', `Articulation not found: ${this.type}`); + const code = (this.position === ABOVE ? articulation.aboveCode : articulation.belowCode) || articulation.code; + this.glyph = new Glyph(code !== null && code !== void 0 ? code : '', this.render_options.font_scale); + this.setWidth(defined(this.glyph.getMetrics().width)); + } + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const index = this.checkIndex(); + const { position, glyph, text_line: textLine } = this; + const canSitBetweenLines = this.articulation.between_lines; + const stave = note.checkStave(); + const staffSpace = stave.getSpacingBetweenLines(); + const isTab = isTabNote(note); + const { x } = note.getModifierStartXY(position, index); + const shouldSitOutsideStaff = !canSitBetweenLines || isTab; + const initialOffset = getInitialOffset(note, position); + const padding = Tables.currentMusicFont().lookupMetric(`articulation.${glyph.getCode()}.padding`, 0); + let y = { + [ABOVE]: () => { + glyph.setOrigin(0.5, 1); + const y = getTopY(note, textLine) - (textLine + initialOffset) * staffSpace; + return shouldSitOutsideStaff ? Math.min(stave.getYForTopText(Articulation.INITIAL_OFFSET), y) : y; + }, + [BELOW]: () => { + glyph.setOrigin(0.5, 0); + const y = getBottomY(note, textLine) + (textLine + initialOffset) * staffSpace; + return shouldSitOutsideStaff ? Math.max(stave.getYForBottomText(Articulation.INITIAL_OFFSET), y) : y; + }, + }[position](); + if (!isTab) { + const offsetDirection = position === ABOVE ? -1 : +1; + const noteLine = note.getKeyProps()[index].line; + const distanceFromNote = (note.getYs()[index] - y) / staffSpace; + const articLine = distanceFromNote + Number(noteLine); + const snappedLine = snapLineToStaff(canSitBetweenLines, articLine, position, offsetDirection); + if (isWithinLines(snappedLine, position)) + glyph.setOrigin(0.5, 0.5); + y += Math.abs(snappedLine - articLine) * staffSpace * offsetDirection + padding * offsetDirection; + } + L(`Rendering articulation at (x: ${x}, y: ${y})`); + glyph.render(ctx, x, y); + } +} +Articulation.DEBUG = false; +Articulation.INITIAL_OFFSET = -0.5; diff --git a/build/esm/src/barnote.js b/build/esm/src/barnote.js new file mode 100644 index 0000000000..6d2316788d --- /dev/null +++ b/build/esm/src/barnote.js @@ -0,0 +1,58 @@ +import { Note } from './note.js'; +import { Barline, BarlineType } from './stavebarline.js'; +import { log } from './util.js'; +function L(...args) { + if (BarNote.DEBUG) + log('Vex.Flow.BarNote', args); +} +export class BarNote extends Note { + constructor(type = BarlineType.SINGLE) { + super({ duration: 'b' }); + this.metrics = { + widths: {}, + }; + const TYPE = BarlineType; + this.metrics.widths = { + [TYPE.SINGLE]: 8, + [TYPE.DOUBLE]: 12, + [TYPE.END]: 15, + [TYPE.REPEAT_BEGIN]: 14, + [TYPE.REPEAT_END]: 14, + [TYPE.REPEAT_BOTH]: 18, + [TYPE.NONE]: 0, + }; + this.ignore_ticks = true; + this.setType(type); + } + static get CATEGORY() { + return "BarNote"; + } + getType() { + return this.type; + } + setType(type) { + this.type = typeof type === 'string' ? Barline.typeString[type] : type; + this.setWidth(this.metrics.widths[this.type]); + return this; + } + addToModifierContext(mc) { + return this; + } + preFormat() { + this.preFormatted = true; + return this; + } + draw() { + const ctx = this.checkContext(); + L('Rendering bar line at: ', this.getAbsoluteX()); + if (this.style) + this.applyStyle(ctx); + const barline = new Barline(this.type); + barline.setX(this.getAbsoluteX()); + barline.draw(this.checkStave()); + if (this.style) + this.restoreStyle(ctx); + this.setRendered(); + } +} +BarNote.DEBUG = false; diff --git a/build/esm/src/beam.js b/build/esm/src/beam.js new file mode 100644 index 0000000000..b0266c71fb --- /dev/null +++ b/build/esm/src/beam.js @@ -0,0 +1,628 @@ +import { Element } from './element.js'; +import { Fraction } from './fraction.js'; +import { Stem } from './stem.js'; +import { Tables } from './tables.js'; +import { isStaveNote, isTabNote } from './typeguard.js'; +import { RuntimeError } from './util.js'; +function calculateStemDirection(notes) { + let lineSum = 0; + notes.forEach((note) => { + if (note.keyProps) { + note.keyProps.forEach((keyProp) => { + lineSum += keyProp.line - 3; + }); + } + }); + if (lineSum >= 0) { + return Stem.DOWN; + } + return Stem.UP; +} +function getStemSlope(firstNote, lastNote) { + const firstStemTipY = firstNote.getStemExtents().topY; + const firstStemX = firstNote.getStemX(); + const lastStemTipY = lastNote.getStemExtents().topY; + const lastStemX = lastNote.getStemX(); + return (lastStemTipY - firstStemTipY) / (lastStemX - firstStemX); +} +const BEAM_LEFT = 'L'; +const BEAM_RIGHT = 'R'; +const BEAM_BOTH = 'B'; +export class Beam extends Element { + constructor(notes, auto_stem = false) { + super(); + this.slope = 0; + this.y_shift = 0; + if (!notes || notes.length === 0) { + throw new RuntimeError('BadArguments', 'No notes provided for beam.'); + } + if (notes.length === 1) { + throw new RuntimeError('BadArguments', 'Too few notes for beam.'); + } + this.ticks = notes[0].getIntrinsicTicks(); + if (this.ticks >= Tables.durationToTicks('4')) { + throw new RuntimeError('BadArguments', 'Beams can only be applied to notes shorter than a quarter note.'); + } + let i; + let note; + this.stem_direction = Stem.UP; + for (i = 0; i < notes.length; ++i) { + note = notes[i]; + if (note.hasStem()) { + this.stem_direction = note.getStemDirection(); + break; + } + } + let stem_direction = this.stem_direction; + if (auto_stem && isStaveNote(notes[0])) { + stem_direction = calculateStemDirection(notes); + } + else if (auto_stem && isTabNote(notes[0])) { + const stem_weight = notes.reduce((memo, note) => memo + note.getStemDirection(), 0); + stem_direction = stem_weight > -1 ? Stem.UP : Stem.DOWN; + } + for (i = 0; i < notes.length; ++i) { + note = notes[i]; + if (auto_stem) { + note.setStemDirection(stem_direction); + this.stem_direction = stem_direction; + } + note.setBeam(this); + } + this.postFormatted = false; + this.notes = notes; + this.beam_count = this.getBeamCount(); + this.break_on_indices = []; + this.render_options = { + beam_width: 5, + max_slope: 0.25, + min_slope: -0.25, + slope_iterations: 20, + slope_cost: 100, + show_stemlets: false, + stemlet_extension: 7, + partial_beam_length: 10, + flat_beams: false, + min_flat_beam_offset: 15, + }; + } + static get CATEGORY() { + return "Beam"; + } + getStemDirection() { + return this.stem_direction; + } + static getDefaultBeamGroups(time_sig) { + if (!time_sig || time_sig === 'c') { + time_sig = '4/4'; + } + const defaults = { + '1/2': ['1/2'], + '2/2': ['1/2'], + '3/2': ['1/2'], + '4/2': ['1/2'], + '1/4': ['1/4'], + '2/4': ['1/4'], + '3/4': ['1/4'], + '4/4': ['1/4'], + '1/8': ['1/8'], + '2/8': ['2/8'], + '3/8': ['3/8'], + '4/8': ['2/8'], + '1/16': ['1/16'], + '2/16': ['2/16'], + '3/16': ['3/16'], + '4/16': ['2/16'], + }; + const groups = defaults[time_sig]; + if (groups === undefined) { + const beatTotal = parseInt(time_sig.split('/')[0], 10); + const beatValue = parseInt(time_sig.split('/')[1], 10); + const tripleMeter = beatTotal % 3 === 0; + if (tripleMeter) { + return [new Fraction(3, beatValue)]; + } + else if (beatValue > 4) { + return [new Fraction(2, beatValue)]; + } + else if (beatValue <= 4) { + return [new Fraction(1, beatValue)]; + } + } + else { + return groups.map((group) => new Fraction().parse(group)); + } + return [new Fraction(1, 4)]; + } + static applyAndGetBeams(voice, stem_direction, groups) { + return Beam.generateBeams(voice.getTickables(), { groups, stem_direction }); + } + static generateBeams(notes, config = {}) { + if (!config.groups || !config.groups.length) { + config.groups = [new Fraction(2, 8)]; + } + const tickGroups = config.groups.map((group) => { + if (!group.multiply) { + throw new RuntimeError('InvalidBeamGroups', 'The beam groups must be an array of Vex.Flow.Fractions'); + } + return group.clone().multiply(Tables.RESOLUTION, 1); + }); + const unprocessedNotes = notes; + let currentTickGroup = 0; + let noteGroups = []; + let currentGroup = []; + function getTotalTicks(vf_notes) { + return vf_notes.reduce((memo, note) => note.getTicks().clone().add(memo), new Fraction(0, 1)); + } + function nextTickGroup() { + if (tickGroups.length - 1 > currentTickGroup) { + currentTickGroup += 1; + } + else { + currentTickGroup = 0; + } + } + function createGroups() { + let nextGroup = []; + let currentGroupTotalTicks = new Fraction(0, 1); + unprocessedNotes.forEach((unprocessedNote) => { + nextGroup = []; + if (unprocessedNote.shouldIgnoreTicks()) { + noteGroups.push(currentGroup); + currentGroup = nextGroup; + return; + } + currentGroup.push(unprocessedNote); + const ticksPerGroup = tickGroups[currentTickGroup].clone(); + const totalTicks = getTotalTicks(currentGroup).add(currentGroupTotalTicks); + const unbeamable = Tables.durationToNumber(unprocessedNote.getDuration()) < 8; + if (unbeamable && unprocessedNote.getTuplet()) { + ticksPerGroup.numerator *= 2; + } + if (totalTicks.greaterThan(ticksPerGroup)) { + if (!unbeamable) { + const note = currentGroup.pop(); + if (note) + nextGroup.push(note); + } + noteGroups.push(currentGroup); + do { + currentGroupTotalTicks = totalTicks.subtract(tickGroups[currentTickGroup]); + nextTickGroup(); + } while (currentGroupTotalTicks.greaterThanEquals(tickGroups[currentTickGroup])); + currentGroup = nextGroup; + } + else if (totalTicks.equals(ticksPerGroup)) { + noteGroups.push(currentGroup); + currentGroupTotalTicks = new Fraction(0, 1); + currentGroup = nextGroup; + nextTickGroup(); + } + }); + if (currentGroup.length > 0) { + noteGroups.push(currentGroup); + } + } + function getBeamGroups() { + return noteGroups.filter((group) => { + if (group.length > 1) { + let beamable = true; + group.forEach((note) => { + if (note.getIntrinsicTicks() >= Tables.durationToTicks('4')) { + beamable = false; + } + }); + return beamable; + } + return false; + }); + } + function sanitizeGroups() { + const sanitizedGroups = []; + noteGroups.forEach((group) => { + let tempGroup = []; + group.forEach((note, index, group) => { + const isFirstOrLast = index === 0 || index === group.length - 1; + const prevNote = group[index - 1]; + const breaksOnEachRest = !config.beam_rests && note.isRest(); + const breaksOnFirstOrLastRest = config.beam_rests && config.beam_middle_only && note.isRest() && isFirstOrLast; + let breakOnStemChange = false; + if (config.maintain_stem_directions && prevNote && !note.isRest() && !prevNote.isRest()) { + const prevDirection = prevNote.getStemDirection(); + const currentDirection = note.getStemDirection(); + breakOnStemChange = currentDirection !== prevDirection; + } + const isUnbeamableDuration = parseInt(note.getDuration(), 10) < 8; + const shouldBreak = breaksOnEachRest || breaksOnFirstOrLastRest || breakOnStemChange || isUnbeamableDuration; + if (shouldBreak) { + if (tempGroup.length > 0) { + sanitizedGroups.push(tempGroup); + } + tempGroup = breakOnStemChange ? [note] : []; + } + else { + tempGroup.push(note); + } + }); + if (tempGroup.length > 0) { + sanitizedGroups.push(tempGroup); + } + }); + noteGroups = sanitizedGroups; + } + function formatStems() { + noteGroups.forEach((group) => { + let stemDirection; + if (config.maintain_stem_directions) { + const note = findFirstNote(group); + stemDirection = note ? note.getStemDirection() : Stem.UP; + } + else { + if (config.stem_direction) { + stemDirection = config.stem_direction; + } + else { + stemDirection = calculateStemDirection(group); + } + } + applyStemDirection(group, stemDirection); + }); + } + function findFirstNote(group) { + for (let i = 0; i < group.length; i++) { + const note = group[i]; + if (!note.isRest()) { + return note; + } + } + return false; + } + function applyStemDirection(group, direction) { + group.forEach((note) => { + note.setStemDirection(direction); + }); + } + function getTuplets() { + const uniqueTuplets = []; + noteGroups.forEach((group) => { + let tuplet; + group.forEach((note) => { + const noteTuplet = note.getTuplet(); + if (noteTuplet && tuplet !== noteTuplet) { + tuplet = noteTuplet; + uniqueTuplets.push(tuplet); + } + }); + }); + return uniqueTuplets; + } + createGroups(); + sanitizeGroups(); + formatStems(); + const beamedNoteGroups = getBeamGroups(); + const allTuplets = getTuplets(); + const beams = []; + beamedNoteGroups.forEach((group) => { + const beam = new Beam(group); + if (config.show_stemlets) { + beam.render_options.show_stemlets = true; + } + if (config.secondary_breaks) { + beam.render_options.secondary_break_ticks = Tables.durationToTicks(config.secondary_breaks); + } + if (config.flat_beams === true) { + beam.render_options.flat_beams = true; + beam.render_options.flat_beam_offset = config.flat_beam_offset; + } + beams.push(beam); + }); + allTuplets.forEach((tuplet) => { + const direction = tuplet.notes[0].stem_direction === Stem.DOWN ? -1 : 1; + tuplet.setTupletLocation(direction); + let bracketed = false; + for (let i = 0; i < tuplet.notes.length; i++) { + const note = tuplet.notes[i]; + if (!note.hasBeam()) { + bracketed = true; + break; + } + } + tuplet.setBracketed(bracketed); + }); + return beams; + } + getNotes() { + return this.notes; + } + getBeamCount() { + const beamCounts = this.notes.map((note) => note.getGlyph().beam_count); + const maxBeamCount = beamCounts.reduce((max, beamCount) => (beamCount > max ? beamCount : max)); + return maxBeamCount; + } + breakSecondaryAt(indices) { + this.break_on_indices = indices; + return this; + } + getSlopeY(x, first_x_px, first_y_px, slope) { + return first_y_px + (x - first_x_px) * slope; + } + calculateSlope() { + const { notes, stem_direction: stemDirection, render_options: { max_slope, min_slope, slope_iterations, slope_cost }, } = this; + const firstNote = notes[0]; + const initialSlope = getStemSlope(firstNote, notes[notes.length - 1]); + const increment = (max_slope - min_slope) / slope_iterations; + let minCost = Number.MAX_VALUE; + let bestSlope = 0; + let yShift = 0; + for (let slope = min_slope; slope <= max_slope; slope += increment) { + let totalStemExtension = 0; + let yShiftTemp = 0; + for (let i = 1; i < notes.length; ++i) { + const note = notes[i]; + if (note.hasStem() || note.isRest()) { + const adjustedStemTipY = this.getSlopeY(note.getStemX(), firstNote.getStemX(), firstNote.getStemExtents().topY, slope) + yShiftTemp; + const stemTipY = note.getStemExtents().topY; + if (stemTipY * stemDirection < adjustedStemTipY * stemDirection) { + const diff = Math.abs(stemTipY - adjustedStemTipY); + yShiftTemp += diff * -stemDirection; + totalStemExtension += diff * i; + } + else { + totalStemExtension += (stemTipY - adjustedStemTipY) * stemDirection; + } + } + } + const idealSlope = initialSlope / 2; + const distanceFromIdeal = Math.abs(idealSlope - slope); + const cost = slope_cost * distanceFromIdeal + Math.abs(totalStemExtension); + if (cost < minCost) { + minCost = cost; + bestSlope = slope; + yShift = yShiftTemp; + } + } + this.slope = bestSlope; + this.y_shift = yShift; + } + calculateFlatSlope() { + const { notes, stem_direction, render_options: { beam_width, min_flat_beam_offset, flat_beam_offset }, } = this; + let total = 0; + let extremeY = 0; + let extremeBeamCount = 0; + let currentExtreme = 0; + for (let i = 0; i < notes.length; i++) { + const note = notes[i]; + const stemTipY = note.getStemExtents().topY; + total += stemTipY; + if (stem_direction === Stem.DOWN && currentExtreme < stemTipY) { + currentExtreme = stemTipY; + extremeY = Math.max(...note.getYs()); + extremeBeamCount = note.getBeamCount(); + } + else if (stem_direction === Stem.UP && (currentExtreme === 0 || currentExtreme > stemTipY)) { + currentExtreme = stemTipY; + extremeY = Math.min(...note.getYs()); + extremeBeamCount = note.getBeamCount(); + } + } + let offset = total / notes.length; + const beamWidth = beam_width * 1.5; + const extremeTest = min_flat_beam_offset + extremeBeamCount * beamWidth; + const newOffset = extremeY + extremeTest * -stem_direction; + if (stem_direction === Stem.DOWN && offset < newOffset) { + offset = extremeY + extremeTest; + } + else if (stem_direction === Stem.UP && offset > newOffset) { + offset = extremeY - extremeTest; + } + if (!flat_beam_offset) { + this.render_options.flat_beam_offset = offset; + } + else if (stem_direction === Stem.DOWN && offset > flat_beam_offset) { + this.render_options.flat_beam_offset = offset; + } + else if (stem_direction === Stem.UP && offset < flat_beam_offset) { + this.render_options.flat_beam_offset = offset; + } + this.slope = 0; + this.y_shift = 0; + } + getBeamYToDraw() { + const firstNote = this.notes[0]; + const firstStemTipY = firstNote.getStemExtents().topY; + let beamY = firstStemTipY; + if (this.render_options.flat_beams && this.render_options.flat_beam_offset) { + beamY = this.render_options.flat_beam_offset; + } + return beamY; + } + applyStemExtensions() { + const { notes, slope, y_shift, stem_direction, beam_count, render_options: { show_stemlets, stemlet_extension, beam_width }, } = this; + const firstNote = notes[0]; + const firstStemTipY = this.getBeamYToDraw(); + const firstStemX = firstNote.getStemX(); + for (let i = 0; i < notes.length; ++i) { + const note = notes[i]; + const stem = note.getStem(); + if (stem) { + const stemX = note.getStemX(); + const { topY: stemTipY } = note.getStemExtents(); + const beamedStemTipY = this.getSlopeY(stemX, firstStemX, firstStemTipY, slope) + y_shift; + const preBeamExtension = stem.getExtension(); + const beamExtension = stem_direction === Stem.UP ? stemTipY - beamedStemTipY : beamedStemTipY - stemTipY; + stem.setExtension(preBeamExtension + beamExtension); + stem.adjustHeightForBeam(); + if (note.isRest() && show_stemlets) { + const beamWidth = beam_width; + const totalBeamWidth = (beam_count - 1) * beamWidth * 1.5 + beamWidth; + stem.setVisibility(true).setStemlet(true, totalBeamWidth + stemlet_extension); + } + } + } + } + lookupBeamDirection(duration, prev_tick, tick, next_tick) { + if (duration === '4') { + return BEAM_LEFT; + } + const lookup_duration = `${Tables.durationToNumber(duration) / 2}`; + const prev_note_gets_beam = prev_tick < Tables.durationToTicks(lookup_duration); + const next_note_gets_beam = next_tick < Tables.durationToTicks(lookup_duration); + const note_gets_beam = tick < Tables.durationToTicks(lookup_duration); + if (prev_note_gets_beam && next_note_gets_beam && note_gets_beam) { + return BEAM_BOTH; + } + else if (prev_note_gets_beam && !next_note_gets_beam && note_gets_beam) { + return BEAM_LEFT; + } + else if (!prev_note_gets_beam && next_note_gets_beam && note_gets_beam) { + return BEAM_RIGHT; + } + return this.lookupBeamDirection(lookup_duration, prev_tick, tick, next_tick); + } + getBeamLines(duration) { + const tick_of_duration = Tables.durationToTicks(duration); + let beam_started = false; + const beam_lines = []; + let current_beam = undefined; + const partial_beam_length = this.render_options.partial_beam_length; + let previous_should_break = false; + let tick_tally = 0; + for (let i = 0; i < this.notes.length; ++i) { + const note = this.notes[i]; + const ticks = note.getTicks().value(); + tick_tally += ticks; + let should_break = false; + if (parseInt(duration, 10) >= 8) { + should_break = this.break_on_indices.indexOf(i) !== -1; + if (this.render_options.secondary_break_ticks && tick_tally >= this.render_options.secondary_break_ticks) { + tick_tally = 0; + should_break = true; + } + } + const note_gets_beam = note.getIntrinsicTicks() < tick_of_duration; + const stem_x = note.getStemX() - Stem.WIDTH / 2; + const prev_note = this.notes[i - 1]; + const next_note = this.notes[i + 1]; + const next_note_gets_beam = next_note && next_note.getIntrinsicTicks() < tick_of_duration; + const prev_note_gets_beam = prev_note && prev_note.getIntrinsicTicks() < tick_of_duration; + const beam_alone = prev_note && next_note && note_gets_beam && !prev_note_gets_beam && !next_note_gets_beam; + if (note_gets_beam) { + if (beam_started) { + current_beam = beam_lines[beam_lines.length - 1]; + current_beam.end = stem_x; + if (should_break) { + beam_started = false; + if (next_note && !next_note_gets_beam && current_beam.end === undefined) { + current_beam.end = current_beam.start - partial_beam_length; + } + } + } + else { + current_beam = { start: stem_x, end: undefined }; + beam_started = true; + if (beam_alone) { + const prev_tick = prev_note.getIntrinsicTicks(); + const next_tick = next_note.getIntrinsicTicks(); + const tick = note.getIntrinsicTicks(); + const beam_direction = this.lookupBeamDirection(duration, prev_tick, tick, next_tick); + if ([BEAM_LEFT, BEAM_BOTH].includes(beam_direction)) { + current_beam.end = current_beam.start - partial_beam_length; + } + else { + current_beam.end = current_beam.start + partial_beam_length; + } + } + else if (!next_note_gets_beam) { + if ((previous_should_break || i === 0) && next_note) { + current_beam.end = current_beam.start + partial_beam_length; + } + else { + current_beam.end = current_beam.start - partial_beam_length; + } + } + else if (should_break) { + current_beam.end = current_beam.start - partial_beam_length; + beam_started = false; + } + beam_lines.push(current_beam); + } + } + else { + beam_started = false; + } + previous_should_break = should_break; + } + const last_beam = beam_lines[beam_lines.length - 1]; + if (last_beam && last_beam.end === undefined) { + last_beam.end = last_beam.start - partial_beam_length; + } + return beam_lines; + } + drawStems(ctx) { + this.notes.forEach((note) => { + const stem = note.getStem(); + if (stem) { + stem.setContext(ctx).draw(); + } + }, this); + } + drawBeamLines(ctx) { + const valid_beam_durations = ['4', '8', '16', '32', '64']; + const firstNote = this.notes[0]; + let beamY = this.getBeamYToDraw(); + const firstStemX = firstNote.getStemX(); + const beamThickness = this.render_options.beam_width * this.stem_direction; + for (let i = 0; i < valid_beam_durations.length; ++i) { + const duration = valid_beam_durations[i]; + const beamLines = this.getBeamLines(duration); + for (let j = 0; j < beamLines.length; ++j) { + const beam_line = beamLines[j]; + const startBeamX = beam_line.start; + const startBeamY = this.getSlopeY(startBeamX, firstStemX, beamY, this.slope); + const lastBeamX = beam_line.end; + if (lastBeamX) { + const lastBeamY = this.getSlopeY(lastBeamX, firstStemX, beamY, this.slope); + ctx.beginPath(); + ctx.moveTo(startBeamX, startBeamY); + ctx.lineTo(startBeamX, startBeamY + beamThickness); + ctx.lineTo(lastBeamX + 1, lastBeamY + beamThickness); + ctx.lineTo(lastBeamX + 1, lastBeamY); + ctx.closePath(); + ctx.fill(); + } + else { + throw new RuntimeError('NoLastBeamX', 'lastBeamX undefined.'); + } + } + beamY += beamThickness * 1.5; + } + } + preFormat() { + return this; + } + postFormat() { + if (this.postFormatted) + return; + if (isTabNote(this.notes[0]) || this.render_options.flat_beams) { + this.calculateFlatSlope(); + } + else { + this.calculateSlope(); + } + this.applyStemExtensions(); + this.postFormatted = true; + } + draw() { + const ctx = this.checkContext(); + this.setRendered(); + if (this.unbeamable) + return; + if (!this.postFormatted) { + this.postFormat(); + } + this.drawStems(ctx); + this.applyStyle(); + this.drawBeamLines(ctx); + this.restoreStyle(); + } +} diff --git a/build/esm/src/bend.js b/build/esm/src/bend.js new file mode 100644 index 0000000000..8868af6b91 --- /dev/null +++ b/build/esm/src/bend.js @@ -0,0 +1,202 @@ +import { Element } from './element.js'; +import { Modifier } from './modifier.js'; +import { TextFormatter } from './textformatter.js'; +import { isTabNote } from './typeguard.js'; +import { RuntimeError } from './util.js'; +export class Bend extends Modifier { + constructor(text, release = false, phrase) { + super(); + this.text = text; + this.x_shift = 0; + this.release = release; + this.tap = ''; + this.resetFont(); + this.render_options = { + line_width: 1.5, + line_style: '#777777', + bend_width: 8, + release_width: 8, + }; + if (phrase) { + this.phrase = phrase; + } + else { + this.phrase = [{ type: Bend.UP, text: this.text }]; + if (this.release) + this.phrase.push({ type: Bend.DOWN, text: '' }); + } + this.updateWidth(); + } + static get CATEGORY() { + return "Bend"; + } + static get UP() { + return 0; + } + static get DOWN() { + return 1; + } + static format(bends, state) { + if (!bends || bends.length === 0) + return false; + let last_width = 0; + for (let i = 0; i < bends.length; ++i) { + const bend = bends[i]; + const note = bend.checkAttachedNote(); + if (isTabNote(note)) { + const stringPos = note.leastString() - 1; + if (state.top_text_line < stringPos) { + state.top_text_line = stringPos; + } + } + bend.setXShift(last_width); + last_width = bend.getWidth(); + bend.setTextLine(state.top_text_line); + } + state.right_shift += last_width; + state.top_text_line += 1; + return true; + } + setXShift(value) { + this.x_shift = value; + this.updateWidth(); + return this; + } + setTap(value) { + this.tap = value; + return this; + } + getText() { + return this.text; + } + getTextHeight() { + const textFormatter = TextFormatter.create(this.textFont); + return textFormatter.maxHeight; + } + updateWidth() { + const textFormatter = TextFormatter.create(this.textFont); + const measureText = (text) => { + return textFormatter.getWidthForTextInPx(text); + }; + let totalWidth = 0; + for (let i = 0; i < this.phrase.length; ++i) { + const bend = this.phrase[i]; + if (bend.width !== undefined) { + totalWidth += bend.width; + } + else { + const additional_width = bend.type === Bend.UP ? this.render_options.bend_width : this.render_options.release_width; + bend.width = Math.max(additional_width, measureText(bend.text)) + 3; + bend.draw_width = bend.width / 2; + totalWidth += bend.width; + } + } + this.setWidth(totalWidth + this.x_shift); + return this; + } + draw() { + var _a; + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const start = note.getModifierStartXY(Modifier.Position.RIGHT, this.index); + start.x += 3; + start.y += 0.5; + const x_shift = this.x_shift; + const stave = note.checkStave(); + const spacing = stave.getSpacingBetweenLines(); + const lowestY = note.getYs().reduce((a, b) => (a < b ? a : b)); + const bend_height = start.y - ((this.text_line + 1) * spacing + start.y - lowestY) + 3; + const annotation_y = start.y - ((this.text_line + 1) * spacing + start.y - lowestY) - 1; + const renderBend = (x, y, width, height) => { + const cp_x = x + width; + const cp_y = y; + ctx.save(); + ctx.beginPath(); + ctx.setLineWidth(this.render_options.line_width); + ctx.setStrokeStyle(this.render_options.line_style); + ctx.setFillStyle(this.render_options.line_style); + ctx.moveTo(x, y); + ctx.quadraticCurveTo(cp_x, cp_y, x + width, height); + ctx.stroke(); + ctx.restore(); + }; + const renderRelease = (x, y, width, height) => { + ctx.save(); + ctx.beginPath(); + ctx.setLineWidth(this.render_options.line_width); + ctx.setStrokeStyle(this.render_options.line_style); + ctx.setFillStyle(this.render_options.line_style); + ctx.moveTo(x, height); + ctx.quadraticCurveTo(x + width, height, x + width, y); + ctx.stroke(); + ctx.restore(); + }; + const renderArrowHead = (x, y, direction) => { + const width = 4; + const yBase = y + width * direction; + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.lineTo(x - width, yBase); + ctx.lineTo(x + width, yBase); + ctx.closePath(); + ctx.fill(); + }; + const renderText = (x, text) => { + ctx.save(); + ctx.setFont(this.textFont); + const render_x = x - ctx.measureText(text).width / 2; + ctx.fillText(text, render_x, annotation_y); + ctx.restore(); + }; + let last_bend = undefined; + let last_bend_draw_width = 0; + let last_drawn_width = 0; + if ((_a = this.tap) === null || _a === void 0 ? void 0 : _a.length) { + const tapStart = note.getModifierStartXY(Modifier.Position.CENTER, this.index); + renderText(tapStart.x, this.tap); + } + for (let i = 0; i < this.phrase.length; ++i) { + const bend = this.phrase[i]; + if (!bend.draw_width) + bend.draw_width = 0; + if (i === 0) + bend.draw_width += x_shift; + last_drawn_width = bend.draw_width + last_bend_draw_width - (i === 1 ? x_shift : 0); + if (bend.type === Bend.UP) { + if (last_bend && last_bend.type === Bend.UP) { + renderArrowHead(start.x, bend_height, +1); + } + renderBend(start.x, start.y, last_drawn_width, bend_height); + } + if (bend.type === Bend.DOWN) { + if (last_bend && last_bend.type === Bend.UP) { + renderRelease(start.x, start.y, last_drawn_width, bend_height); + } + if (last_bend && last_bend.type === Bend.DOWN) { + renderArrowHead(start.x, start.y, -1); + renderRelease(start.x, start.y, last_drawn_width, bend_height); + } + if (!last_bend) { + last_drawn_width = bend.draw_width; + renderRelease(start.x, start.y, last_drawn_width, bend_height); + } + } + renderText(start.x + last_drawn_width, bend.text); + last_bend = bend; + last_bend_draw_width = bend.draw_width; + last_bend.x = start.x; + start.x += last_drawn_width; + } + if (!last_bend || last_bend.x == undefined) { + throw new RuntimeError('NoLastBendForBend', 'Internal error.'); + } + if (last_bend.type === Bend.UP) { + renderArrowHead(last_bend.x + last_drawn_width, bend_height, +1); + } + else if (last_bend.type === Bend.DOWN) { + renderArrowHead(last_bend.x + last_drawn_width, start.y, -1); + } + } +} +Bend.TEXT_FONT = Object.assign({}, Element.TEXT_FONT); diff --git a/build/esm/src/boundingbox.js b/build/esm/src/boundingbox.js new file mode 100644 index 0000000000..2c7c1dd123 --- /dev/null +++ b/build/esm/src/boundingbox.js @@ -0,0 +1,59 @@ +export class BoundingBox { + constructor(x, y, w, h) { + this.x = x; + this.y = y; + this.w = w; + this.h = h; + } + static copy(that) { + return new BoundingBox(that.x, that.y, that.w, that.h); + } + getX() { + return this.x; + } + getY() { + return this.y; + } + getW() { + return this.w; + } + getH() { + return this.h; + } + setX(x) { + this.x = x; + return this; + } + setY(y) { + this.y = y; + return this; + } + setW(w) { + this.w = w; + return this; + } + setH(h) { + this.h = h; + return this; + } + move(x, y) { + this.x += x; + this.y += y; + return this; + } + clone() { + return BoundingBox.copy(this); + } + mergeWith(boundingBox) { + const that = boundingBox; + const new_x = this.x < that.x ? this.x : that.x; + const new_y = this.y < that.y ? this.y : that.y; + const new_w = Math.max(this.x + this.w, that.x + that.w) - new_x; + const new_h = Math.max(this.y + this.h, that.y + that.h) - new_y; + this.x = new_x; + this.y = new_y; + this.w = new_w; + this.h = new_h; + return this; + } +} diff --git a/build/esm/src/boundingboxcomputation.js b/build/esm/src/boundingboxcomputation.js new file mode 100644 index 0000000000..ee8588e456 --- /dev/null +++ b/build/esm/src/boundingboxcomputation.js @@ -0,0 +1,107 @@ +export class BoundingBoxComputation { + constructor() { + this.x1 = Number.NaN; + this.y1 = Number.NaN; + this.x2 = Number.NaN; + this.y2 = Number.NaN; + } + getX1() { + return this.x1; + } + getY1() { + return this.y1; + } + width() { + return this.x2 - this.x1; + } + height() { + return this.y2 - this.y1; + } + addPoint(x, y) { + if (isNaN(this.x1) || x < this.x1) + this.x1 = x; + if (isNaN(this.x2) || x > this.x2) + this.x2 = x; + if (isNaN(this.y1) || y < this.y1) + this.y1 = y; + if (isNaN(this.y2) || y > this.y2) + this.y2 = y; + } + addX(x) { + this.addPoint(x, this.y1); + } + addY(y) { + this.addPoint(this.x1, y); + } + addQuadraticCurve(p0x, p0y, p1x, p1y, p2x, p2y) { + this.addPoint(p0x, p0y); + this.addPoint(p2x, p2y); + const p01x = p1x - p0x; + const p12x = p2x - p1x; + let denom = p01x - p12x; + if (denom != 0) { + const t = p01x / denom; + if (t > 0 && t < 1) { + const it = 1 - t; + this.addX(it * it * p0x + 2 * it * t * p1x + t * t * p2x); + } + } + const p01y = p1y - p0y; + const p12y = p2y - p1y; + denom = p01y - p12y; + if (denom != 0) { + const t = p01y / denom; + if (t > 0 && t < 1) { + const it = 1 - t; + this.addY(it * it * p0y + 2 * it * t * p1y + t * t * p2y); + } + } + } + addBezierCurve(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) { + const p0 = [p0x, p0y]; + const p1 = [p1x, p1y]; + const p2 = [p2x, p2y]; + const p3 = [p3x, p3y]; + let i; + this.addPoint(p0[0], p0[1]); + this.addPoint(p3[0], p3[1]); + const f = (t, i) => Math.pow(1 - t, 3) * p0[i] + + 3 * Math.pow(1 - t, 2) * t * p1[i] + + 3 * (1 - t) * Math.pow(t, 2) * p2[i] + + Math.pow(t, 3) * p3[i]; + for (i = 0; i <= 1; i++) { + const b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i]; + const a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i]; + const c = 3 * p1[i] - 3 * p0[i]; + if (a === 0) { + if (b === 0) + continue; + const t = -c / b; + if (0 < t && t < 1) { + if (i === 0) + this.addX(f(t, i)); + if (i === 1) + this.addY(f(t, i)); + } + continue; + } + const b2ac = Math.pow(b, 2) - 4 * c * a; + if (b2ac < 0) + continue; + const t1 = (-b + Math.sqrt(b2ac)) / (2 * a); + if (0 < t1 && t1 < 1) { + if (i === 0) + this.addX(f(t1, i)); + if (i === 1) + this.addY(f(t1, i)); + } + const t2 = (-b - Math.sqrt(b2ac)) / (2 * a); + if (0 < t2 && t2 < 1) { + if (i === 0) + this.addX(f(t2, i)); + if (i === 1) + this.addY(f(t2, i)); + } + } + } +} diff --git a/build/esm/src/canvascontext.js b/build/esm/src/canvascontext.js new file mode 100644 index 0000000000..09a48492ff --- /dev/null +++ b/build/esm/src/canvascontext.js @@ -0,0 +1,202 @@ +import { Font } from './font.js'; +import { RenderContext } from './rendercontext.js'; +import { globalObject, warn } from './util.js'; +import { isHTMLCanvas } from './web.js'; +export class CanvasContext extends RenderContext { + constructor(context) { + super(); + this.textHeight = 0; + this.context2D = context; + if (!context.canvas) { + this.canvas = { + width: CanvasContext.WIDTH, + height: CanvasContext.HEIGHT, + }; + } + else { + this.canvas = context.canvas; + } + } + static get WIDTH() { + return 600; + } + static get HEIGHT() { + return 400; + } + static get CANVAS_BROWSER_SIZE_LIMIT() { + return 32767; + } + static sanitizeCanvasDims(width, height) { + const limit = this.CANVAS_BROWSER_SIZE_LIMIT; + if (Math.max(width, height) > limit) { + warn('Canvas dimensions exceed browser limit. Cropping to ' + limit); + if (width > limit) { + width = limit; + } + if (height > limit) { + height = limit; + } + } + return [width, height]; + } + clear() { + this.context2D.clearRect(0, 0, this.canvas.width, this.canvas.height); + } + openGroup(cls, id, attrs) { + } + closeGroup() { + } + add(child) { + } + setFillStyle(style) { + this.context2D.fillStyle = style; + return this; + } + setBackgroundFillStyle(style) { + return this; + } + setStrokeStyle(style) { + this.context2D.strokeStyle = style; + return this; + } + setShadowColor(color) { + this.context2D.shadowColor = color; + return this; + } + setShadowBlur(blur) { + const t = this.context2D.getTransform(); + const scale = Math.sqrt(t.a * t.a + t.b * t.b + t.c * t.c + t.d * t.d); + this.context2D.shadowBlur = scale * blur; + return this; + } + setLineWidth(width) { + this.context2D.lineWidth = width; + return this; + } + setLineCap(capType) { + this.context2D.lineCap = capType; + return this; + } + setLineDash(dash) { + this.context2D.setLineDash(dash); + return this; + } + scale(x, y) { + this.context2D.scale(x, y); + return this; + } + resize(width, height) { + const canvas = this.context2D.canvas; + const devicePixelRatio = globalObject().devicePixelRatio || 1; + [width, height] = CanvasContext.sanitizeCanvasDims(width * devicePixelRatio, height * devicePixelRatio); + width = (width / devicePixelRatio) | 0; + height = (height / devicePixelRatio) | 0; + canvas.width = width * devicePixelRatio; + canvas.height = height * devicePixelRatio; + if (isHTMLCanvas(canvas)) { + canvas.style.width = width + 'px'; + canvas.style.height = height + 'px'; + } + return this.scale(devicePixelRatio, devicePixelRatio); + } + rect(x, y, width, height) { + this.context2D.rect(x, y, width, height); + return this; + } + fillRect(x, y, width, height) { + this.context2D.fillRect(x, y, width, height); + return this; + } + clearRect(x, y, width, height) { + this.context2D.clearRect(x, y, width, height); + return this; + } + beginPath() { + this.context2D.beginPath(); + return this; + } + moveTo(x, y) { + this.context2D.moveTo(x, y); + return this; + } + lineTo(x, y) { + this.context2D.lineTo(x, y); + return this; + } + bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) { + this.context2D.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y); + return this; + } + quadraticCurveTo(cpx, cpy, x, y) { + this.context2D.quadraticCurveTo(cpx, cpy, x, y); + return this; + } + arc(x, y, radius, startAngle, endAngle, counterclockwise) { + this.context2D.arc(x, y, radius, startAngle, endAngle, counterclockwise); + return this; + } + fill() { + this.context2D.fill(); + return this; + } + stroke() { + this.context2D.stroke(); + return this; + } + closePath() { + this.context2D.closePath(); + return this; + } + measureText(text) { + const metrics = this.context2D.measureText(text); + let y = 0; + let height = 0; + if (metrics.fontBoundingBoxAscent) { + y = -metrics.fontBoundingBoxAscent; + height = metrics.fontBoundingBoxDescent + metrics.fontBoundingBoxAscent; + } + else { + y = -metrics.actualBoundingBoxAscent; + height = metrics.actualBoundingBoxDescent + metrics.actualBoundingBoxAscent; + } + return { + x: 0, + y: y, + width: metrics.width, + height: height, + }; + } + fillText(text, x, y) { + this.context2D.fillText(text, x, y); + return this; + } + save() { + this.context2D.save(); + return this; + } + restore() { + this.context2D.restore(); + return this; + } + set fillStyle(style) { + this.context2D.fillStyle = style; + } + get fillStyle() { + return this.context2D.fillStyle; + } + set strokeStyle(style) { + this.context2D.strokeStyle = style; + } + get strokeStyle() { + return this.context2D.strokeStyle; + } + setFont(f, size, weight, style) { + const fontInfo = Font.validate(f, size, weight, style); + this.context2D.font = Font.toCSSString(fontInfo); + this.textHeight = Font.convertSizeToPixelValue(fontInfo.size); + return this; + } + getFont() { + return this.context2D.font; + } +} diff --git a/build/esm/src/chordsymbol.js b/build/esm/src/chordsymbol.js new file mode 100644 index 0000000000..7a6f04cc66 --- /dev/null +++ b/build/esm/src/chordsymbol.js @@ -0,0 +1,578 @@ +import { Font, FontStyle, FontWeight } from './font.js'; +import { Glyph } from './glyph.js'; +import { Modifier } from './modifier.js'; +import { Tables } from './tables.js'; +import { TextFormatter } from './textformatter.js'; +import { log } from './util.js'; +function L(...args) { + if (ChordSymbol.DEBUG) + log('Vex.Flow.ChordSymbol', args); +} +export var ChordSymbolHorizontalJustify; +(function (ChordSymbolHorizontalJustify) { + ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify["LEFT"] = 1] = "LEFT"; + ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify["CENTER"] = 2] = "CENTER"; + ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify["RIGHT"] = 3] = "RIGHT"; + ChordSymbolHorizontalJustify[ChordSymbolHorizontalJustify["CENTER_STEM"] = 4] = "CENTER_STEM"; +})(ChordSymbolHorizontalJustify || (ChordSymbolHorizontalJustify = {})); +export var ChordSymbolVerticalJustify; +(function (ChordSymbolVerticalJustify) { + ChordSymbolVerticalJustify[ChordSymbolVerticalJustify["TOP"] = 1] = "TOP"; + ChordSymbolVerticalJustify[ChordSymbolVerticalJustify["BOTTOM"] = 2] = "BOTTOM"; +})(ChordSymbolVerticalJustify || (ChordSymbolVerticalJustify = {})); +export var SymbolTypes; +(function (SymbolTypes) { + SymbolTypes[SymbolTypes["GLYPH"] = 1] = "GLYPH"; + SymbolTypes[SymbolTypes["TEXT"] = 2] = "TEXT"; + SymbolTypes[SymbolTypes["LINE"] = 3] = "LINE"; +})(SymbolTypes || (SymbolTypes = {})); +export var SymbolModifiers; +(function (SymbolModifiers) { + SymbolModifiers[SymbolModifiers["NONE"] = 1] = "NONE"; + SymbolModifiers[SymbolModifiers["SUBSCRIPT"] = 2] = "SUBSCRIPT"; + SymbolModifiers[SymbolModifiers["SUPERSCRIPT"] = 3] = "SUPERSCRIPT"; +})(SymbolModifiers || (SymbolModifiers = {})); +export class ChordSymbol extends Modifier { + constructor() { + super(); + this.symbolBlocks = []; + this.horizontal = ChordSymbolHorizontalJustify.LEFT; + this.vertical = ChordSymbolVerticalJustify.TOP; + this.useKerning = true; + this.reportWidth = true; + this.resetFont(); + } + static get CATEGORY() { + return "ChordSymbol"; + } + static get superSubRatio() { + return ChordSymbol.metrics.global.superSubRatio; + } + static set NO_TEXT_FORMAT(val) { + ChordSymbol.noFormat = val; + } + static get NO_TEXT_FORMAT() { + return ChordSymbol.noFormat; + } + static getMetricForGlyph(glyphCode) { + if (ChordSymbol.metrics[glyphCode]) { + return ChordSymbol.metrics[glyphCode]; + } + return undefined; + } + static get engravingFontResolution() { + return Tables.currentMusicFont().getResolution(); + } + static get spacingBetweenBlocks() { + return ChordSymbol.metrics.global.spacing / ChordSymbol.engravingFontResolution; + } + static getWidthForGlyph(glyph) { + const metric = ChordSymbol.getMetricForGlyph(glyph.code); + if (!metric) { + return 0.65; + } + return metric.advanceWidth / ChordSymbol.engravingFontResolution; + } + static getYShiftForGlyph(glyph) { + const metric = ChordSymbol.getMetricForGlyph(glyph.code); + if (!metric) { + return 0; + } + return metric.yOffset / ChordSymbol.engravingFontResolution; + } + static getXShiftForGlyph(glyph) { + const metric = ChordSymbol.getMetricForGlyph(glyph.code); + if (!metric) { + return 0; + } + return (-1 * metric.leftSideBearing) / ChordSymbol.engravingFontResolution; + } + static get superscriptOffset() { + return ChordSymbol.metrics.global.superscriptOffset / ChordSymbol.engravingFontResolution; + } + static get subscriptOffset() { + return ChordSymbol.metrics.global.subscriptOffset / ChordSymbol.engravingFontResolution; + } + static get kerningOffset() { + return ChordSymbol.metrics.global.kerningOffset / ChordSymbol.engravingFontResolution; + } + static get metrics() { + return Tables.currentMusicFont().getMetrics().glyphs.chordSymbol; + } + static get lowerKerningText() { + return ChordSymbol.metrics.global.lowerKerningText; + } + static get upperKerningText() { + return ChordSymbol.metrics.global.upperKerningText; + } + static isSuperscript(block) { + return block.symbolModifier !== undefined && block.symbolModifier === SymbolModifiers.SUPERSCRIPT; + } + static isSubscript(block) { + return block.symbolModifier !== undefined && block.symbolModifier === SymbolModifiers.SUBSCRIPT; + } + static format(symbols, state) { + var _a; + if (!symbols || symbols.length === 0) + return false; + let width = 0; + let nonSuperWidth = 0; + const reportedWidths = []; + for (const symbol of symbols) { + const fontSize = Font.convertSizeToPointValue((_a = symbol.textFont) === null || _a === void 0 ? void 0 : _a.size); + const fontAdj = Font.scaleSize(fontSize, 0.05); + const glyphAdj = fontAdj * 2; + let lineSpaces = 1; + let vAlign = false; + for (let j = 0; j < symbol.symbolBlocks.length; ++j) { + const block = symbol.symbolBlocks[j]; + const sup = ChordSymbol.isSuperscript(block); + const sub = ChordSymbol.isSubscript(block); + const superSubScale = sup || sub ? ChordSymbol.superSubRatio : 1; + const adj = block.symbolType === SymbolTypes.GLYPH ? glyphAdj * superSubScale : fontAdj * superSubScale; + if (sup || sub) { + lineSpaces = 2; + } + const fontSize = symbol.textFormatter.fontSizeInPixels; + const superSubFontSize = fontSize * superSubScale; + if (block.symbolType === SymbolTypes.GLYPH && block.glyph !== undefined) { + block.width = ChordSymbol.getWidthForGlyph(block.glyph) * superSubFontSize; + block.yShift += ChordSymbol.getYShiftForGlyph(block.glyph) * superSubFontSize; + block.xShift += ChordSymbol.getXShiftForGlyph(block.glyph) * superSubFontSize; + block.glyph.scale = block.glyph.scale * adj; + } + else if (block.symbolType === SymbolTypes.TEXT) { + block.width = block.width * superSubFontSize; + block.yShift += symbol.getYOffsetForText(block.text) * adj; + } + if (block.symbolType === SymbolTypes.GLYPH && + block.glyph !== undefined && + block.glyph.code === ChordSymbol.glyphs.over.code) { + lineSpaces = 2; + } + block.width += ChordSymbol.spacingBetweenBlocks * fontSize * superSubScale; + if (sup && j > 0) { + const prev = symbol.symbolBlocks[j - 1]; + if (!ChordSymbol.isSuperscript(prev)) { + nonSuperWidth = width; + } + } + if (sub && nonSuperWidth > 0) { + vAlign = true; + block.xShift = block.xShift + (nonSuperWidth - width); + width = nonSuperWidth; + nonSuperWidth = 0; + symbol.setEnableKerning(false); + } + if (!sup && !sub) { + nonSuperWidth = 0; + } + block.vAlign = vAlign; + width += block.width; + } + symbol.updateKerningAdjustments(); + symbol.updateOverBarAdjustments(); + if (symbol.getVertical() === ChordSymbolVerticalJustify.TOP) { + symbol.setTextLine(state.top_text_line); + state.top_text_line += lineSpaces; + } + else { + symbol.setTextLine(state.text_line + 1); + state.text_line += lineSpaces + 1; + } + if (symbol.getReportWidth()) { + reportedWidths.push(width); + } + else { + reportedWidths.push(0); + } + } + width = reportedWidths.reduce((a, b) => a + b, 0); + state.left_shift += width / 2; + state.right_shift += width / 2; + return true; + } + static get TEXT_FONT() { + let family = 'Roboto Slab, Times, serif'; + if (Tables.currentMusicFont().getName() === 'Petaluma') { + family = 'PetalumaScript, Arial, sans-serif'; + } + return { + family, + size: 12, + weight: FontWeight.NORMAL, + style: FontStyle.NORMAL, + }; + } + get superscriptOffset() { + return ChordSymbol.superscriptOffset * this.textFormatter.fontSizeInPixels; + } + get subscriptOffset() { + return ChordSymbol.subscriptOffset * this.textFormatter.fontSizeInPixels; + } + setReportWidth(value) { + this.reportWidth = value; + return this; + } + getReportWidth() { + return this.reportWidth; + } + updateOverBarAdjustments() { + const barIndex = this.symbolBlocks.findIndex(({ symbolType, glyph }) => symbolType === SymbolTypes.GLYPH && glyph !== undefined && glyph.code === 'csymDiagonalArrangementSlash'); + if (barIndex < 0) { + return; + } + const bar = this.symbolBlocks[barIndex]; + const xoff = bar.width / 4; + const yoff = 0.25 * this.textFormatter.fontSizeInPixels; + let symIndex = 0; + for (symIndex === 0; symIndex < barIndex; ++symIndex) { + const symbol = this.symbolBlocks[symIndex]; + symbol.xShift = symbol.xShift + xoff; + symbol.yShift = symbol.yShift - yoff; + } + for (symIndex = barIndex + 1; symIndex < this.symbolBlocks.length; ++symIndex) { + const symbol = this.symbolBlocks[symIndex]; + symbol.xShift = symbol.xShift - xoff; + symbol.yShift = symbol.yShift + yoff; + } + } + updateKerningAdjustments() { + let accum = 0; + for (let j = 0; j < this.symbolBlocks.length; ++j) { + const symbol = this.symbolBlocks[j]; + accum += this.getKerningAdjustment(j); + symbol.xShift += accum; + } + } + getKerningAdjustment(j) { + if (!this.useKerning) { + return 0; + } + const currSymbol = this.symbolBlocks[j]; + const prevSymbol = j > 0 ? this.symbolBlocks[j - 1] : undefined; + let adjustment = 0; + if (currSymbol.symbolType === SymbolTypes.GLYPH && + currSymbol.glyph !== undefined && + currSymbol.glyph.code === ChordSymbol.glyphs.over.code) { + adjustment += currSymbol.glyph.metrics.x_shift; + } + if (prevSymbol !== undefined && + prevSymbol.symbolType === SymbolTypes.GLYPH && + prevSymbol.glyph !== undefined && + prevSymbol.glyph.code === ChordSymbol.glyphs.over.code) { + adjustment += prevSymbol.glyph.metrics.x_shift; + } + let preKernUpper = false; + let preKernLower = false; + if (prevSymbol !== undefined && prevSymbol.symbolType === SymbolTypes.TEXT) { + preKernUpper = ChordSymbol.upperKerningText.some((xx) => xx === prevSymbol.text[prevSymbol.text.length - 1]); + preKernLower = ChordSymbol.lowerKerningText.some((xx) => xx === prevSymbol.text[prevSymbol.text.length - 1]); + } + const kerningOffsetPixels = ChordSymbol.kerningOffset * this.textFormatter.fontSizeInPixels; + if (preKernUpper && currSymbol.symbolModifier === SymbolModifiers.SUPERSCRIPT) { + adjustment += kerningOffsetPixels; + } + if (preKernLower && currSymbol.symbolType === SymbolTypes.TEXT) { + if (currSymbol.text[0] >= 'a' && currSymbol.text[0] <= 'z') { + adjustment += kerningOffsetPixels / 2; + } + if (ChordSymbol.upperKerningText.some((xx) => xx === (prevSymbol === null || prevSymbol === void 0 ? void 0 : prevSymbol.text[prevSymbol.text.length - 1]))) { + adjustment += kerningOffsetPixels / 2; + } + } + return adjustment; + } + getSymbolBlock(params = {}) { + var _a, _b, _c; + const symbolType = (_a = params.symbolType) !== null && _a !== void 0 ? _a : SymbolTypes.TEXT; + const symbolBlock = { + text: (_b = params.text) !== null && _b !== void 0 ? _b : '', + symbolType, + symbolModifier: (_c = params.symbolModifier) !== null && _c !== void 0 ? _c : SymbolModifiers.NONE, + xShift: 0, + yShift: 0, + vAlign: false, + width: 0, + }; + if (symbolType === SymbolTypes.GLYPH && typeof params.glyph === 'string') { + const glyphArgs = ChordSymbol.glyphs[params.glyph]; + const glyphPoints = 20; + symbolBlock.glyph = new Glyph(glyphArgs.code, glyphPoints, { category: 'chordSymbol' }); + } + else if (symbolType === SymbolTypes.TEXT) { + symbolBlock.width = this.textFormatter.getWidthForTextInEm(symbolBlock.text); + } + else if (symbolType === SymbolTypes.LINE) { + symbolBlock.width = params.width; + } + return symbolBlock; + } + addSymbolBlock(parameters) { + this.symbolBlocks.push(this.getSymbolBlock(parameters)); + return this; + } + addText(text, parameters = {}) { + const symbolType = SymbolTypes.TEXT; + return this.addSymbolBlock(Object.assign(Object.assign({}, parameters), { text, symbolType })); + } + addTextSuperscript(text) { + const symbolType = SymbolTypes.TEXT; + const symbolModifier = SymbolModifiers.SUPERSCRIPT; + return this.addSymbolBlock({ text, symbolType, symbolModifier }); + } + addTextSubscript(text) { + const symbolType = SymbolTypes.TEXT; + const symbolModifier = SymbolModifiers.SUBSCRIPT; + return this.addSymbolBlock({ text, symbolType, symbolModifier }); + } + addGlyphSuperscript(glyph) { + const symbolType = SymbolTypes.GLYPH; + const symbolModifier = SymbolModifiers.SUPERSCRIPT; + return this.addSymbolBlock({ glyph, symbolType, symbolModifier }); + } + addGlyph(glyph, params = {}) { + const symbolType = SymbolTypes.GLYPH; + return this.addSymbolBlock(Object.assign(Object.assign({}, params), { glyph, symbolType })); + } + addGlyphOrText(text, params = {}) { + let str = ''; + for (let i = 0; i < text.length; ++i) { + const char = text[i]; + if (ChordSymbol.glyphs[char]) { + if (str.length > 0) { + this.addText(str, params); + str = ''; + } + this.addGlyph(char, params); + } + else { + str += char; + } + } + if (str.length > 0) { + this.addText(str, params); + } + return this; + } + addLine(width, params = {}) { + const symbolType = SymbolTypes.LINE; + return this.addSymbolBlock(Object.assign(Object.assign({}, params), { symbolType, width })); + } + setFont(f, size, weight, style) { + super.setFont(f, size, weight, style); + this.textFormatter = TextFormatter.create(this.textFont); + return this; + } + setEnableKerning(val) { + this.useKerning = val; + return this; + } + setVertical(vj) { + this.vertical = typeof vj === 'string' ? ChordSymbol.VerticalJustifyString[vj] : vj; + return this; + } + getVertical() { + return this.vertical; + } + setHorizontal(hj) { + this.horizontal = typeof hj === 'string' ? ChordSymbol.HorizontalJustifyString[hj] : hj; + return this; + } + getHorizontal() { + return this.horizontal; + } + getWidth() { + let width = 0; + this.symbolBlocks.forEach((symbol) => { + width += symbol.vAlign ? 0 : symbol.width; + }); + return width; + } + getYOffsetForText(text) { + var _a; + let acc = 0; + let i = 0; + for (i = 0; i < text.length; ++i) { + const metrics = this.textFormatter.getGlyphMetrics(text[i]); + if (metrics) { + const yMax = (_a = metrics.y_max) !== null && _a !== void 0 ? _a : 0; + acc = yMax < acc ? yMax : acc; + } + } + const resolution = this.textFormatter.getResolution(); + return i > 0 ? -1 * (acc / resolution) : 0; + } + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + ctx.save(); + const classString = Object.keys(this.getAttribute('classes')).join(' '); + ctx.openGroup(classString, this.getAttribute('id')); + const start = note.getModifierStartXY(Modifier.Position.ABOVE, this.index); + ctx.setFont(this.textFont); + let y; + const hasStem = note.hasStem(); + const stave = note.checkStave(); + if (this.vertical === ChordSymbolVerticalJustify.BOTTOM) { + y = stave.getYForBottomText(this.text_line + Tables.TEXT_HEIGHT_OFFSET_HACK); + if (hasStem) { + const stem_ext = note.checkStem().getExtents(); + const spacing = stave.getSpacingBetweenLines(); + const stem_base = note.getStemDirection() === 1 ? stem_ext.baseY : stem_ext.topY; + y = Math.max(y, stem_base + spacing * (this.text_line + 2)); + } + } + else { + y = Math.min(stave.getYForTopText(this.text_line), note.getYs()[0] - 10); + if (hasStem) { + const stem_ext = note.checkStem().getExtents(); + const spacing = stave.getSpacingBetweenLines(); + y = Math.min(y, stem_ext.topY - 5 - spacing * this.text_line); + } + } + let x = start.x; + if (this.horizontal === ChordSymbolHorizontalJustify.LEFT) { + x = start.x; + } + else if (this.horizontal === ChordSymbolHorizontalJustify.RIGHT) { + x = start.x + this.getWidth(); + } + else if (this.horizontal === ChordSymbolHorizontalJustify.CENTER) { + x = start.x - this.getWidth() / 2; + } + else { + x = note.getStemX() - this.getWidth() / 2; + } + L('Rendering ChordSymbol: ', this.textFormatter, x, y); + this.symbolBlocks.forEach((symbol) => { + const isSuper = ChordSymbol.isSuperscript(symbol); + const isSub = ChordSymbol.isSubscript(symbol); + let curY = y; + L('shift was ', symbol.xShift, symbol.yShift); + L('curY pre sub ', curY); + if (isSuper) { + curY += this.superscriptOffset; + } + if (isSub) { + curY += this.subscriptOffset; + } + L('curY sup/sub ', curY); + if (symbol.symbolType === SymbolTypes.TEXT) { + if (isSuper || isSub) { + ctx.save(); + if (this.textFont) { + const { family, size, weight, style } = this.textFont; + const smallerFontSize = Font.scaleSize(size, ChordSymbol.superSubRatio); + ctx.setFont(family, smallerFontSize, weight, style); + } + } + L('Rendering Text: ', symbol.text, x + symbol.xShift, curY + symbol.yShift); + ctx.fillText(symbol.text, x + symbol.xShift, curY + symbol.yShift); + if (isSuper || isSub) { + ctx.restore(); + } + } + else if (symbol.symbolType === SymbolTypes.GLYPH && symbol.glyph) { + curY += symbol.yShift; + L('Rendering Glyph: ', symbol.glyph.code, x + symbol.xShift, curY); + symbol.glyph.render(ctx, x + symbol.xShift, curY); + } + else if (symbol.symbolType === SymbolTypes.LINE) { + L('Rendering Line : ', symbol.width, x, curY); + ctx.beginPath(); + ctx.setLineWidth(1); + ctx.moveTo(x, y); + ctx.lineTo(x + symbol.width, curY); + ctx.stroke(); + } + x += symbol.width; + if (symbol.vAlign) { + x += symbol.xShift; + } + }); + ctx.closeGroup(); + ctx.restore(); + } +} +ChordSymbol.DEBUG = false; +ChordSymbol.HorizontalJustify = ChordSymbolHorizontalJustify; +ChordSymbol.HorizontalJustifyString = { + left: ChordSymbolHorizontalJustify.LEFT, + right: ChordSymbolHorizontalJustify.RIGHT, + center: ChordSymbolHorizontalJustify.CENTER, + centerStem: ChordSymbolHorizontalJustify.CENTER_STEM, +}; +ChordSymbol.VerticalJustify = ChordSymbolVerticalJustify; +ChordSymbol.VerticalJustifyString = { + top: ChordSymbolVerticalJustify.TOP, + above: ChordSymbolVerticalJustify.TOP, + below: ChordSymbolVerticalJustify.BOTTOM, + bottom: ChordSymbolVerticalJustify.BOTTOM, +}; +ChordSymbol.glyphs = { + diminished: { + code: 'csymDiminished', + }, + dim: { + code: 'csymDiminished', + }, + halfDiminished: { + code: 'csymHalfDiminished', + }, + '+': { + code: 'csymAugmented', + }, + augmented: { + code: 'csymAugmented', + }, + majorSeventh: { + code: 'csymMajorSeventh', + }, + minor: { + code: 'csymMinor', + }, + '-': { + code: 'csymMinor', + }, + '(': { + code: 'csymParensLeftTall', + }, + leftParen: { + code: 'csymParensLeftTall', + }, + ')': { + code: 'csymParensRightTall', + }, + rightParen: { + code: 'csymParensRightTall', + }, + leftBracket: { + code: 'csymBracketLeftTall', + }, + rightBracket: { + code: 'csymBracketRightTall', + }, + leftParenTall: { + code: 'csymParensLeftVeryTall', + }, + rightParenTall: { + code: 'csymParensRightVeryTall', + }, + '/': { + code: 'csymDiagonalArrangementSlash', + }, + over: { + code: 'csymDiagonalArrangementSlash', + }, + '#': { + code: 'accidentalSharp', + }, + b: { + code: 'accidentalFlat', + }, +}; +ChordSymbol.symbolTypes = SymbolTypes; +ChordSymbol.symbolModifiers = SymbolModifiers; +ChordSymbol.noFormat = false; diff --git a/build/esm/src/clef.js b/build/esm/src/clef.js new file mode 100644 index 0000000000..b304c7ab83 --- /dev/null +++ b/build/esm/src/clef.js @@ -0,0 +1,153 @@ +import { Glyph } from './glyph.js'; +import { StaveModifier, StaveModifierPosition } from './stavemodifier.js'; +import { Tables } from './tables.js'; +import { defined, log } from './util.js'; +function L(...args) { + if (Clef.DEBUG) + log('Vex.Flow.Clef', args); +} +export class Clef extends StaveModifier { + constructor(type, size, annotation) { + super(); + this.clef = Clef.types['treble']; + this.setPosition(StaveModifierPosition.BEGIN); + this.setType(type, size, annotation); + this.setWidth(Tables.currentMusicFont().lookupMetric(`clef.${this.size}.width`)); + L('Creating clef:', type); + } + static get CATEGORY() { + return "Clef"; + } + static get types() { + return { + treble: { + code: 'gClef', + line: 3, + point: 0, + }, + bass: { + code: 'fClef', + line: 1, + point: 0, + }, + alto: { + code: 'cClef', + line: 2, + point: 0, + }, + tenor: { + code: 'cClef', + line: 1, + point: 0, + }, + percussion: { + code: 'restMaxima', + line: 2, + point: 0, + }, + soprano: { + code: 'cClef', + line: 4, + point: 0, + }, + 'mezzo-soprano': { + code: 'cClef', + line: 3, + point: 0, + }, + 'baritone-c': { + code: 'cClef', + line: 0, + point: 0, + }, + 'baritone-f': { + code: 'fClef', + line: 2, + point: 0, + }, + subbass: { + code: 'fClef', + line: 0, + point: 0, + }, + french: { + code: 'gClef', + line: 4, + point: 0, + }, + tab: { + code: '6stringTabClef', + point: 0, + }, + }; + } + setType(type, size, annotation) { + this.type = type; + this.clef = Clef.types[type]; + if (size === undefined) { + this.size = 'default'; + } + else { + this.size = size; + } + const musicFont = Tables.currentMusicFont(); + this.clef.point = musicFont.lookupMetric(`clef.${this.size}.point`, 0); + this.glyph = new Glyph(this.clef.code, this.clef.point, { + category: `clef.${this.clef.code}.${this.size}`, + }); + if (annotation !== undefined) { + const code = musicFont.lookupMetric(`clef.annotations.${annotation}.smuflCode`); + const point = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.point`); + const line = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.${this.type}.line`); + const x_shift = musicFont.lookupMetric(`clef.annotations.${annotation}.${this.size}.${this.type}.shiftX`); + this.annotation = { code, point, line, x_shift }; + this.attachment = new Glyph(this.annotation.code, this.annotation.point); + this.attachment.metrics.x_max = 0; + this.attachment.setXShift(this.annotation.x_shift); + } + else { + this.annotation = undefined; + } + return this; + } + getWidth() { + if (this.type === 'tab') { + defined(this.stave, 'ClefError', "Can't get width without stave."); + } + return this.width; + } + setStave(stave) { + this.stave = stave; + if (this.type === 'tab') { + const glyph = defined(this.glyph, 'ClefError', "Can't set stave without glyph."); + const numLines = this.stave.getNumLines(); + const musicFont = Tables.currentMusicFont(); + const point = musicFont.lookupMetric(`clef.lineCount.${numLines}.point`); + const shiftY = musicFont.lookupMetric(`clef.lineCount.${numLines}.shiftY`); + glyph.setPoint(point); + glyph.setYShift(shiftY); + } + return this; + } + draw() { + const glyph = defined(this.glyph, 'ClefError', "Can't draw clef without glyph."); + const stave = this.checkStave(); + const ctx = stave.checkContext(); + this.setRendered(); + ctx.openGroup('clef', this.getAttribute('id')); + glyph.setStave(stave); + glyph.setContext(ctx); + if (this.clef.line !== undefined) { + this.placeGlyphOnLine(glyph, stave, this.clef.line); + } + glyph.renderToStave(this.x); + if (this.annotation !== undefined && this.attachment !== undefined) { + this.placeGlyphOnLine(this.attachment, stave, this.annotation.line); + this.attachment.setStave(stave); + this.attachment.setContext(ctx); + this.attachment.renderToStave(this.x); + } + ctx.closeGroup(); + } +} +Clef.DEBUG = false; diff --git a/build/esm/src/clefnote.js b/build/esm/src/clefnote.js new file mode 100644 index 0000000000..656488eb62 --- /dev/null +++ b/build/esm/src/clefnote.js @@ -0,0 +1,65 @@ +import { Clef } from './clef.js'; +import { Glyph } from './glyph.js'; +import { Note } from './note.js'; +export class ClefNote extends Note { + constructor(type, size, annotation) { + super({ duration: 'b' }); + this.type = type; + this.clef_obj = new Clef(type, size, annotation); + this.clef = this.clef_obj.clef; + this.glyph = new Glyph(this.clef.code, this.clef.point); + this.setWidth(this.glyph.getMetrics().width); + this.ignore_ticks = true; + } + static get CATEGORY() { + return "ClefNote"; + } + setType(type, size, annotation) { + this.type = type; + this.clef_obj = new Clef(type, size, annotation); + this.clef = this.clef_obj.clef; + this.glyph = new Glyph(this.clef.code, this.clef.point); + this.setWidth(this.glyph.getMetrics().width); + return this; + } + getClef() { + return this.clef; + } + setContext(context) { + super.setContext(context); + this.glyph.setContext(this.getContext()); + return this; + } + getBoundingBox() { + return super.getBoundingBox(); + } + addToModifierContext(mc) { + return this; + } + preFormat() { + this.preFormatted = true; + return this; + } + draw() { + var _a; + const stave = this.checkStave(); + if (!this.glyph.getContext()) { + this.glyph.setContext(this.getContext()); + } + this.setRendered(); + const abs_x = this.getAbsoluteX(); + this.glyph.setStave(stave); + this.glyph.setYShift(stave.getYForLine((_a = this.clef.line) !== null && _a !== void 0 ? _a : 0) - stave.getYForGlyphs()); + this.glyph.renderToStave(abs_x); + if (this.clef_obj.annotation !== undefined) { + const attachment = new Glyph(this.clef_obj.annotation.code, this.clef_obj.annotation.point); + if (!attachment.getContext()) { + attachment.setContext(this.getContext()); + } + attachment.setStave(stave); + attachment.setYShift(stave.getYForLine(this.clef_obj.annotation.line) - stave.getYForGlyphs()); + attachment.setXShift(this.clef_obj.annotation.x_shift); + attachment.renderToStave(abs_x); + } + } +} diff --git a/build/esm/src/crescendo.js b/build/esm/src/crescendo.js new file mode 100644 index 0000000000..c70d3b7769 --- /dev/null +++ b/build/esm/src/crescendo.js @@ -0,0 +1,77 @@ +import { Note } from './note.js'; +import { TickContext } from './tickcontext.js'; +import { log } from './util.js'; +function L(...args) { + if (Crescendo.DEBUG) + log('Vex.Flow.Crescendo', args); +} +function renderHairpin(ctx, params) { + const begin_x = params.begin_x; + const end_x = params.end_x; + const y = params.y; + const half_height = params.height / 2; + ctx.beginPath(); + if (params.reverse) { + ctx.moveTo(begin_x, y - half_height); + ctx.lineTo(end_x, y); + ctx.lineTo(begin_x, y + half_height); + } + else { + ctx.moveTo(end_x, y - half_height); + ctx.lineTo(begin_x, y); + ctx.lineTo(end_x, y + half_height); + } + ctx.stroke(); + ctx.closePath(); +} +export class Crescendo extends Note { + constructor(noteStruct) { + super(noteStruct); + this.options = { + extend_left: 0, + extend_right: 0, + y_shift: 0, + }; + this.decrescendo = false; + this.line = noteStruct.line || 0; + this.height = 15; + } + static get CATEGORY() { + return "Crescendo"; + } + setLine(line) { + this.line = line; + return this; + } + setHeight(height) { + this.height = height; + return this; + } + setDecrescendo(decresc) { + this.decrescendo = decresc; + return this; + } + preFormat() { + this.preFormatted = true; + return this; + } + draw() { + const ctx = this.checkContext(); + const stave = this.checkStave(); + this.setRendered(); + const tick_context = this.getTickContext(); + const next_context = TickContext.getNextContext(tick_context); + const begin_x = this.getAbsoluteX(); + const end_x = next_context ? next_context.getX() : stave.getX() + stave.getWidth(); + const y = stave.getYForLine(this.line + -3) + 1; + L('Drawing ', this.decrescendo ? 'decrescendo ' : 'crescendo ', this.height, 'x', begin_x - end_x); + renderHairpin(ctx, { + begin_x: begin_x - this.options.extend_left, + end_x: end_x + this.options.extend_right, + y: y + this.options.y_shift, + height: this.height, + reverse: this.decrescendo, + }); + } +} +Crescendo.DEBUG = false; diff --git a/build/esm/src/curve.js b/build/esm/src/curve.js new file mode 100644 index 0000000000..0294f49b3b --- /dev/null +++ b/build/esm/src/curve.js @@ -0,0 +1,118 @@ +import { Element } from './element.js'; +import { RuntimeError } from './util.js'; +export var CurvePosition; +(function (CurvePosition) { + CurvePosition[CurvePosition["NEAR_HEAD"] = 1] = "NEAR_HEAD"; + CurvePosition[CurvePosition["NEAR_TOP"] = 2] = "NEAR_TOP"; +})(CurvePosition || (CurvePosition = {})); +export class Curve extends Element { + constructor(from, to, options) { + super(); + this.render_options = Object.assign({ thickness: 2, x_shift: 0, y_shift: 10, position: CurvePosition.NEAR_HEAD, position_end: CurvePosition.NEAR_HEAD, invert: false, cps: [ + { x: 0, y: 10 }, + { x: 0, y: 10 }, + ] }, options); + this.from = from; + this.to = to; + } + static get CATEGORY() { + return "Curve"; + } + static get Position() { + return CurvePosition; + } + static get PositionString() { + return { + nearHead: CurvePosition.NEAR_HEAD, + nearTop: CurvePosition.NEAR_TOP, + }; + } + setNotes(from, to) { + if (!from && !to) { + throw new RuntimeError('BadArguments', 'Curve needs to have either `from` or `to` set.'); + } + this.from = from; + this.to = to; + return this; + } + isPartial() { + return !this.from || !this.to; + } + renderCurve(params) { + const ctx = this.checkContext(); + const x_shift = this.render_options.x_shift; + const y_shift = this.render_options.y_shift * params.direction; + const first_x = params.first_x + x_shift; + const first_y = params.first_y + y_shift; + const last_x = params.last_x - x_shift; + const last_y = params.last_y + y_shift; + const thickness = this.render_options.thickness; + const cps = this.render_options.cps; + const { x: cp0x, y: cp0y } = cps[0]; + const { x: cp1x, y: cp1y } = cps[1]; + const cp_spacing = (last_x - first_x) / (cps.length + 2); + ctx.beginPath(); + ctx.moveTo(first_x, first_y); + ctx.bezierCurveTo(first_x + cp_spacing + cp0x, first_y + cp0y * params.direction, last_x - cp_spacing + cp1x, last_y + cp1y * params.direction, last_x, last_y); + ctx.bezierCurveTo(last_x - cp_spacing + cp1x, last_y + (cp1y + thickness) * params.direction, first_x + cp_spacing + cp0x, first_y + (cp0y + thickness) * params.direction, first_x, first_y); + ctx.stroke(); + ctx.closePath(); + ctx.fill(); + } + draw() { + this.checkContext(); + this.setRendered(); + const first_note = this.from; + const last_note = this.to; + let first_x; + let last_x; + let first_y; + let last_y; + let stem_direction = 0; + let metric = 'baseY'; + let end_metric = 'baseY'; + function getPosition(position) { + return typeof position === 'string' ? Curve.PositionString[position] : position; + } + const position = getPosition(this.render_options.position); + const position_end = getPosition(this.render_options.position_end); + if (position === CurvePosition.NEAR_TOP) { + metric = 'topY'; + end_metric = 'topY'; + } + if (position_end === CurvePosition.NEAR_HEAD) { + end_metric = 'baseY'; + } + else if (position_end === CurvePosition.NEAR_TOP) { + end_metric = 'topY'; + } + if (first_note) { + first_x = first_note.getTieRightX(); + stem_direction = first_note.getStemDirection(); + first_y = first_note.getStemExtents()[metric]; + } + else { + const stave = last_note.checkStave(); + first_x = stave.getTieStartX(); + first_y = last_note.getStemExtents()[metric]; + } + if (last_note) { + last_x = last_note.getTieLeftX(); + stem_direction = last_note.getStemDirection(); + last_y = last_note.getStemExtents()[end_metric]; + } + else { + const stave = first_note.checkStave(); + last_x = stave.getTieEndX(); + last_y = first_note.getStemExtents()[end_metric]; + } + this.renderCurve({ + first_x, + last_x, + first_y, + last_y, + direction: stem_direction * (this.render_options.invert === true ? -1 : 1), + }); + return true; + } +} diff --git a/build/esm/src/dot.js b/build/esm/src/dot.js new file mode 100644 index 0000000000..ce7a5d438b --- /dev/null +++ b/build/esm/src/dot.js @@ -0,0 +1,137 @@ +import { Modifier } from './modifier.js'; +import { isGraceNote, isStaveNote, isTabNote } from './typeguard.js'; +import { RuntimeError } from './util.js'; +export class Dot extends Modifier { + constructor() { + super(); + this.position = Modifier.Position.RIGHT; + this.radius = 2; + this.setWidth(5); + this.dot_shiftY = 0; + } + static get CATEGORY() { + return "Dot"; + } + static getDots(note) { + return note.getModifiersByType(Dot.CATEGORY); + } + static buildAndAttach(notes, options) { + for (const note of notes) { + if (options === null || options === void 0 ? void 0 : options.all) { + for (let i = 0; i < note.keys.length; i++) { + const dot = new Dot(); + dot.setDotShiftY(note.glyph.dot_shiftY); + note.addModifier(dot, i); + } + } + else if ((options === null || options === void 0 ? void 0 : options.index) != undefined) { + const dot = new Dot(); + dot.setDotShiftY(note.glyph.dot_shiftY); + note.addModifier(dot, options === null || options === void 0 ? void 0 : options.index); + } + else { + const dot = new Dot(); + dot.setDotShiftY(note.glyph.dot_shiftY); + note.addModifier(dot, 0); + } + } + } + static format(dots, state) { + const right_shift = state.right_shift; + const dot_spacing = 1; + if (!dots || dots.length === 0) + return false; + const dot_list = []; + const max_shift_map = {}; + for (let i = 0; i < dots.length; ++i) { + const dot = dots[i]; + const note = dot.getNote(); + let props; + let shift; + if (isStaveNote(note)) { + const index = dot.checkIndex(); + props = note.getKeyProps()[index]; + shift = note.getFirstDotPx(); + } + else if (isTabNote(note)) { + props = { line: 0.5 }; + shift = right_shift; + } + else { + throw new RuntimeError('Internal', 'Unexpected instance.'); + } + const note_id = note.getAttribute('id'); + dot_list.push({ line: props.line, note, note_id, dot }); + max_shift_map[note_id] = Math.max(max_shift_map[note_id] || shift, shift); + } + dot_list.sort((a, b) => b.line - a.line); + let dot_shift = right_shift; + let x_width = 0; + let last_line = null; + let last_note = null; + let prev_dotted_space = null; + let half_shiftY = 0; + for (let i = 0; i < dot_list.length; ++i) { + const { dot, note, note_id, line } = dot_list[i]; + if (line !== last_line || note !== last_note) { + dot_shift = max_shift_map[note_id]; + } + if (!note.isRest() && line !== last_line) { + if (Math.abs(line % 1) === 0.5) { + half_shiftY = 0; + } + else { + half_shiftY = 0.5; + if (last_note != null && !last_note.isRest() && last_line != null && last_line - line === 0.5) { + half_shiftY = -0.5; + } + else if (line + half_shiftY === prev_dotted_space) { + half_shiftY = -0.5; + } + } + } + if (note.isRest()) { + dot.dot_shiftY += -half_shiftY; + } + else { + dot.dot_shiftY = -half_shiftY; + } + prev_dotted_space = line + half_shiftY; + dot.setXShift(dot_shift); + dot_shift += dot.getWidth() + dot_spacing; + x_width = dot_shift > x_width ? dot_shift : x_width; + last_line = line; + last_note = note; + } + state.right_shift += x_width; + return true; + } + setNote(note) { + this.note = note; + if (isGraceNote(note)) { + this.radius *= 0.5; + this.setWidth(3); + } + return this; + } + setDotShiftY(y) { + this.dot_shiftY = y; + return this; + } + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const stave = note.checkStave(); + const lineSpace = stave.getSpacingBetweenLines(); + const start = note.getModifierStartXY(this.position, this.index, { forceFlagRight: true }); + if (isTabNote(note)) { + start.y = note.getStemExtents().baseY; + } + const x = start.x + this.x_shift + this.width - this.radius; + const y = start.y + this.y_shift + this.dot_shiftY * lineSpace; + ctx.beginPath(); + ctx.arc(x, y, this.radius, 0, Math.PI * 2, false); + ctx.fill(); + } +} diff --git a/build/esm/src/easyscore.js b/build/esm/src/easyscore.js new file mode 100644 index 0000000000..16ed373f4f --- /dev/null +++ b/build/esm/src/easyscore.js @@ -0,0 +1,374 @@ +import { Articulation } from './articulation.js'; +import { Dot } from './dot.js'; +import { FretHandFinger } from './frethandfinger.js'; +import { Music } from './music.js'; +import { Parser } from './parser.js'; +import { Stem } from './stem.js'; +import { defined, log, RuntimeError } from './util.js'; +function L(...args) { + if (EasyScore.DEBUG) + log('Vex.Flow.EasyScore', args); +} +export class EasyScoreGrammar { + constructor(builder) { + this.builder = builder; + } + begin() { + return this.LINE; + } + LINE() { + return { + expect: [this.PIECE, this.PIECES, this.EOL], + }; + } + PIECE() { + return { + expect: [this.CHORDORNOTE, this.PARAMS], + run: () => this.builder.commitPiece(), + }; + } + PIECES() { + return { + expect: [this.COMMA, this.PIECE], + zeroOrMore: true, + }; + } + PARAMS() { + return { + expect: [this.DURATION, this.TYPE, this.DOTS, this.OPTS], + }; + } + CHORDORNOTE() { + return { + expect: [this.CHORD, this.SINGLENOTE], + or: true, + }; + } + CHORD() { + return { + expect: [this.LPAREN, this.NOTES, this.RPAREN], + run: (state) => this.builder.addChord(state.matches[1]), + }; + } + NOTES() { + return { + expect: [this.NOTE], + oneOrMore: true, + }; + } + NOTE() { + return { + expect: [this.NOTENAME, this.ACCIDENTAL, this.OCTAVE], + }; + } + SINGLENOTE() { + return { + expect: [this.NOTENAME, this.ACCIDENTAL, this.OCTAVE], + run: (state) => { + const s = state; + this.builder.addSingleNote(s.matches[0], s.matches[1], s.matches[2]); + }, + }; + } + ACCIDENTAL() { + return { + expect: [this.MICROTONES, this.ACCIDENTALS], + maybe: true, + or: true, + }; + } + DOTS() { + return { + expect: [this.DOT], + zeroOrMore: true, + run: (state) => this.builder.setNoteDots(state.matches), + }; + } + TYPE() { + return { + expect: [this.SLASH, this.MAYBESLASH, this.TYPES], + maybe: true, + run: (state) => this.builder.setNoteType(state.matches[2]), + }; + } + DURATION() { + return { + expect: [this.SLASH, this.DURATIONS], + maybe: true, + run: (state) => this.builder.setNoteDuration(state.matches[1]), + }; + } + OPTS() { + return { + expect: [this.LBRACKET, this.KEYVAL, this.KEYVALS, this.RBRACKET], + maybe: true, + }; + } + KEYVALS() { + return { + expect: [this.COMMA, this.KEYVAL], + zeroOrMore: true, + }; + } + KEYVAL() { + const unquote = (str) => str.slice(1, -1); + return { + expect: [this.KEY, this.EQUALS, this.VAL], + run: (state) => this.builder.addNoteOption(state.matches[0], unquote(state.matches[2])), + }; + } + VAL() { + return { + expect: [this.SVAL, this.DVAL], + or: true, + }; + } + KEY() { + return { token: '[a-zA-Z][a-zA-Z0-9]*' }; + } + DVAL() { + return { token: '["][^"]*["]' }; + } + SVAL() { + return { token: "['][^']*[']" }; + } + NOTENAME() { + return { token: '[a-gA-G]' }; + } + OCTAVE() { + return { token: '[0-9]+' }; + } + ACCIDENTALS() { + return { token: 'bb|b|##|#|n' }; + } + MICROTONES() { + return { token: 'bbs|bss|bs|db|d|\\+\\+-|\\+-|\\+\\+|\\+|k|o' }; + } + DURATIONS() { + return { token: '[0-9whq]+' }; + } + TYPES() { + return { token: '[rRsSmMhHgG]' }; + } + LPAREN() { + return { token: '[(]' }; + } + RPAREN() { + return { token: '[)]' }; + } + COMMA() { + return { token: '[,]' }; + } + DOT() { + return { token: '[.]' }; + } + SLASH() { + return { token: '[/]' }; + } + MAYBESLASH() { + return { token: '[/]?' }; + } + EQUALS() { + return { token: '[=]' }; + } + LBRACKET() { + return { token: '\\[' }; + } + RBRACKET() { + return { token: '\\]' }; + } + EOL() { + return { token: '$' }; + } +} +export class Piece { + constructor(duration) { + this.chord = []; + this.dots = 0; + this.options = {}; + this.duration = duration; + } +} +export class Builder { + constructor(factory) { + this.commitHooks = []; + this.factory = factory; + this.reset(); + } + reset(options) { + this.options = Object.assign({ stem: 'auto', clef: 'treble' }, options); + this.elements = { notes: [], accidentals: [] }; + this.rollingDuration = '8'; + this.resetPiece(); + } + getFactory() { + return this.factory; + } + getElements() { + return this.elements; + } + addCommitHook(commitHook) { + this.commitHooks.push(commitHook); + } + resetPiece() { + L('resetPiece'); + this.piece = new Piece(this.rollingDuration); + } + setNoteDots(dots) { + L('setNoteDots:', dots); + if (dots) + this.piece.dots = dots.length; + } + setNoteDuration(duration) { + L('setNoteDuration:', duration); + this.rollingDuration = this.piece.duration = duration || this.rollingDuration; + } + setNoteType(type) { + L('setNoteType:', type); + if (type) + this.piece.type = type; + } + addNoteOption(key, value) { + L('addNoteOption: key:', key, 'value:', value); + this.piece.options[key] = value; + } + addNote(key, accid, octave) { + L('addNote:', key, accid, octave); + this.piece.chord.push({ + key: key, + accid, + octave, + }); + } + addSingleNote(key, accid, octave) { + L('addSingleNote:', key, accid, octave); + this.addNote(key, accid, octave); + } + addChord(notes) { + L('startChord'); + if (typeof notes[0] !== 'object') { + this.addSingleNote(notes[0]); + } + else { + notes.forEach((n) => { + if (n) + this.addNote(...n); + }); + } + L('endChord'); + } + commitPiece() { + L('commitPiece'); + const { factory } = this; + if (!factory) + return; + const options = Object.assign(Object.assign({}, this.options), this.piece.options); + const stem = defined(options.stem, 'BadArguments', 'options.stem is not defined').toLowerCase(); + const clef = defined(options.clef, 'BadArguments', 'options.clef is not defined').toLowerCase(); + const { chord, duration, dots, type } = this.piece; + const standardAccidentals = Music.accidentals; + const keys = chord.map((notePiece) => { + var _a; + return notePiece.key + + (standardAccidentals.includes((_a = notePiece.accid) !== null && _a !== void 0 ? _a : '') ? notePiece.accid : '') + + '/' + + notePiece.octave; + }); + const auto_stem = stem === 'auto'; + const note = (type === null || type === void 0 ? void 0 : type.toLowerCase()) == 'g' + ? factory.GhostNote({ duration, dots }) + : factory.StaveNote({ keys, duration, dots, type, clef, auto_stem }); + if (!auto_stem) + note.setStemDirection(stem === 'up' ? Stem.UP : Stem.DOWN); + const accidentals = []; + chord.forEach((notePiece, index) => { + const accid = notePiece.accid; + if (typeof accid === 'string') { + const accidental = factory.Accidental({ type: accid }); + note.addModifier(accidental, index); + accidentals.push(accidental); + } + else { + accidentals.push(undefined); + } + }); + for (let i = 0; i < dots; i++) + Dot.buildAndAttach([note], { all: true }); + this.commitHooks.forEach((commitHook) => commitHook(options, note, this)); + this.elements.notes.push(note); + this.elements.accidentals.push(accidentals); + this.resetPiece(); + } +} +function setId(options, note) { + if (options.id === undefined) + return; + note.setAttribute('id', options.id); +} +const commaSeparatedRegex = /\s*,\s*/; +function setClass(options, note) { + if (options.class === undefined) + return; + options.class.split(commaSeparatedRegex).forEach((className) => note.addClass(className)); +} +export class EasyScore { + constructor(options = {}) { + this.defaults = { + clef: 'treble', + time: '4/4', + stem: 'auto', + }; + this.setOptions(options); + } + set(defaults) { + this.defaults = Object.assign(Object.assign({}, this.defaults), defaults); + return this; + } + setOptions(options) { + var _a, _b; + const factory = options.factory; + const builder = (_a = options.builder) !== null && _a !== void 0 ? _a : new Builder(factory); + this.options = Object.assign(Object.assign({ commitHooks: [setId, setClass, Articulation.easyScoreHook, FretHandFinger.easyScoreHook], throwOnError: false }, options), { factory, + builder }); + this.factory = factory; + this.builder = builder; + this.grammar = new EasyScoreGrammar(this.builder); + this.parser = new Parser(this.grammar); + (_b = this.options.commitHooks) === null || _b === void 0 ? void 0 : _b.forEach((commitHook) => this.addCommitHook(commitHook)); + return this; + } + setContext(context) { + this.factory.setContext(context); + return this; + } + parse(line, options = {}) { + this.builder.reset(options); + const result = this.parser.parse(line); + if (!result.success && this.options.throwOnError) { + L(result); + throw new RuntimeError('Error parsing line: ' + line); + } + return result; + } + beam(notes, options) { + this.factory.Beam({ notes, options }); + return notes; + } + tuplet(notes, options) { + this.factory.Tuplet({ notes, options }); + return notes; + } + notes(line, options = {}) { + options = Object.assign({ clef: this.defaults.clef, stem: this.defaults.stem }, options); + this.parse(line, options); + return this.builder.getElements().notes; + } + voice(notes, options = {}) { + options = Object.assign({ time: this.defaults.time }, options); + return this.factory.Voice(options).addTickables(notes); + } + addCommitHook(commitHook) { + this.builder.addCommitHook(commitHook); + } +} +EasyScore.DEBUG = false; diff --git a/build/esm/src/element.js b/build/esm/src/element.js new file mode 100644 index 0000000000..8cb94bceae --- /dev/null +++ b/build/esm/src/element.js @@ -0,0 +1,216 @@ +import { Font, FontStyle, FontWeight } from './font.js'; +import { Registry } from './registry.js'; +import { defined } from './util.js'; +export class Element { + constructor() { + var _a; + this.attrs = { + id: Element.newID(), + el: undefined, + type: this.getCategory(), + classes: {}, + }; + this.rendered = false; + (_a = Registry.getDefaultRegistry()) === null || _a === void 0 ? void 0 : _a.register(this); + } + static get CATEGORY() { + return "Element"; + } + static newID() { + return `auto${Element.ID++}`; + } + getCategory() { + return this.constructor.CATEGORY; + } + setStyle(style) { + this.style = style; + return this; + } + getStyle() { + return this.style; + } + applyStyle(context = this.context, style = this.getStyle()) { + if (!style) + return this; + if (!context) + return this; + context.save(); + if (style.shadowColor) + context.setShadowColor(style.shadowColor); + if (style.shadowBlur) + context.setShadowBlur(style.shadowBlur); + if (style.fillStyle) + context.setFillStyle(style.fillStyle); + if (style.strokeStyle) + context.setStrokeStyle(style.strokeStyle); + if (style.lineWidth) + context.setLineWidth(style.lineWidth); + return this; + } + restoreStyle(context = this.context, style = this.getStyle()) { + if (!style) + return this; + if (!context) + return this; + context.restore(); + return this; + } + drawWithStyle() { + this.checkContext(); + this.applyStyle(); + this.draw(); + this.restoreStyle(); + } + hasClass(className) { + return this.attrs.classes[className] === true; + } + addClass(className) { + var _a; + this.attrs.classes[className] = true; + (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({ + id: this.attrs.id, + name: 'class', + value: className, + oldValue: undefined, + }); + return this; + } + removeClass(className) { + var _a; + delete this.attrs.classes[className]; + (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({ + id: this.attrs.id, + name: 'class', + value: undefined, + oldValue: className, + }); + return this; + } + onRegister(registry) { + this.registry = registry; + return this; + } + isRendered() { + return this.rendered; + } + setRendered(rendered = true) { + this.rendered = rendered; + return this; + } + getAttributes() { + return this.attrs; + } + getAttribute(name) { + return this.attrs[name]; + } + setAttribute(name, value) { + var _a; + const oldID = this.attrs.id; + const oldValue = this.attrs[name]; + this.attrs[name] = value; + (_a = this.registry) === null || _a === void 0 ? void 0 : _a.onUpdate({ id: oldID, name, value, oldValue }); + return this; + } + getBoundingBox() { + return this.boundingBox; + } + getContext() { + return this.context; + } + setContext(context) { + this.context = context; + return this; + } + checkContext() { + return defined(this.context, 'NoContext', 'No rendering context attached to instance.'); + } + set font(f) { + this.setFont(f); + } + get font() { + return Font.toCSSString(this.textFont); + } + setFont(font, size, weight, style) { + const defaultTextFont = this.constructor.TEXT_FONT; + const fontIsObject = typeof font === 'object'; + const fontIsString = typeof font === 'string'; + const fontIsUndefined = font === undefined; + const sizeWeightStyleAreUndefined = size === undefined && weight === undefined && style === undefined; + if (fontIsObject) { + this.textFont = Object.assign(Object.assign({}, defaultTextFont), font); + } + else if (fontIsString && sizeWeightStyleAreUndefined) { + this.textFont = Font.fromCSSString(font); + } + else if (fontIsUndefined && sizeWeightStyleAreUndefined) { + this.textFont = Object.assign({}, defaultTextFont); + } + else { + this.textFont = Font.validate(font !== null && font !== void 0 ? font : defaultTextFont.family, size !== null && size !== void 0 ? size : defaultTextFont.size, weight !== null && weight !== void 0 ? weight : defaultTextFont.weight, style !== null && style !== void 0 ? style : defaultTextFont.style); + } + return this; + } + getFont() { + if (!this.textFont) { + this.resetFont(); + } + return Font.toCSSString(this.textFont); + } + resetFont() { + this.setFont(); + } + get fontInfo() { + if (!this.textFont) { + this.resetFont(); + } + return Object.assign({}, this.textFont); + } + set fontInfo(fontInfo) { + this.setFont(fontInfo); + } + setFontSize(size) { + const fontInfo = this.fontInfo; + this.setFont(fontInfo.family, size, fontInfo.weight, fontInfo.style); + return this; + } + getFontSize() { + return this.fontSize; + } + set fontSize(size) { + this.setFontSize(size); + } + get fontSize() { + let size = this.fontInfo.size; + if (typeof size === 'number') { + size = `${size}pt`; + } + return size; + } + get fontSizeInPoints() { + return Font.convertSizeToPointValue(this.fontSize); + } + get fontSizeInPixels() { + return Font.convertSizeToPixelValue(this.fontSize); + } + get fontStyle() { + return this.fontInfo.style; + } + set fontStyle(style) { + const fontInfo = this.fontInfo; + this.setFont(fontInfo.family, fontInfo.size, fontInfo.weight, style); + } + get fontWeight() { + return this.fontInfo.weight + ''; + } + set fontWeight(weight) { + const fontInfo = this.fontInfo; + this.setFont(fontInfo.family, fontInfo.size, weight, fontInfo.style); + } +} +Element.ID = 1000; +Element.TEXT_FONT = { + family: Font.SANS_SERIF, + size: Font.SIZE, + weight: FontWeight.NORMAL, + style: FontStyle.NORMAL, +}; diff --git a/build/esm/src/factory.js b/build/esm/src/factory.js new file mode 100644 index 0000000000..771cdab31e --- /dev/null +++ b/build/esm/src/factory.js @@ -0,0 +1,440 @@ +import { Accidental } from './accidental.js'; +import { Annotation, AnnotationHorizontalJustify, AnnotationVerticalJustify } from './annotation.js'; +import { Articulation } from './articulation.js'; +import { BarNote } from './barnote.js'; +import { Beam } from './beam.js'; +import { ChordSymbol } from './chordsymbol.js'; +import { ClefNote } from './clefnote.js'; +import { Curve } from './curve.js'; +import { EasyScore } from './easyscore.js'; +import { Element } from './element.js'; +import { Formatter } from './formatter.js'; +import { FretHandFinger } from './frethandfinger.js'; +import { GhostNote } from './ghostnote.js'; +import { GlyphNote } from './glyphnote.js'; +import { GraceNote } from './gracenote.js'; +import { GraceNoteGroup } from './gracenotegroup.js'; +import { KeySigNote } from './keysignote.js'; +import { ModifierContext } from './modifiercontext.js'; +import { MultiMeasureRest } from './multimeasurerest.js'; +import { NoteSubGroup } from './notesubgroup.js'; +import { PedalMarking } from './pedalmarking.js'; +import { Renderer } from './renderer.js'; +import { RepeatNote } from './repeatnote.js'; +import { Stave } from './stave.js'; +import { StaveConnector } from './staveconnector.js'; +import { StaveLine } from './staveline.js'; +import { StaveNote } from './stavenote.js'; +import { StaveTie } from './stavetie.js'; +import { StringNumber } from './stringnumber.js'; +import { System } from './system.js'; +import { TabNote } from './tabnote.js'; +import { TabStave } from './tabstave.js'; +import { TextBracket } from './textbracket.js'; +import { TextDynamics } from './textdynamics.js'; +import { TextNote } from './textnote.js'; +import { TickContext } from './tickcontext.js'; +import { TimeSigNote } from './timesignote.js'; +import { Tuplet } from './tuplet.js'; +import { defined, log, RuntimeError } from './util.js'; +import { VibratoBracket } from './vibratobracket.js'; +import { Voice } from './voice.js'; +import { isHTMLCanvas } from './web.js'; +function L(...args) { + if (Factory.DEBUG) + log('Vex.Flow.Factory', args); +} +export class Factory { + constructor(options = {}) { + L('New factory: ', options); + this.options = { + stave: { + space: 10, + }, + renderer: { + elementId: '', + width: 500, + height: 200, + background: '#FFF', + }, + font: Factory.TEXT_FONT, + }; + this.setOptions(options); + } + static newFromElementId(elementId, width = 500, height = 200) { + return new Factory({ renderer: { elementId, width, height } }); + } + reset() { + this.renderQ = []; + this.systems = []; + this.staves = []; + this.voices = []; + this.stave = undefined; + } + setOptions(options) { + this.options = Object.assign(Object.assign({}, this.options), options); + this.initRenderer(); + this.reset(); + } + initRenderer() { + const { elementId, width, height, background } = this.options.renderer; + if (elementId == null) { + return; + } + if (elementId == '') { + L(this); + throw new RuntimeError('renderer.elementId not set in FactoryOptions'); + } + let backend = this.options.renderer.backend; + if (backend === undefined) { + const elem = document.getElementById(elementId); + if (isHTMLCanvas(elem)) { + backend = Renderer.Backends.CANVAS; + } + else { + backend = Renderer.Backends.SVG; + } + } + this.context = Renderer.buildContext(elementId, backend, width, height, background); + } + getContext() { + return this.context; + } + setContext(context) { + this.context = context; + return this; + } + getStave() { + return this.stave; + } + getVoices() { + return this.voices; + } + Stave(params) { + const staveSpace = this.options.stave.space; + const p = Object.assign({ x: 0, y: 0, width: this.options.renderer.width - staveSpace * 1.0, options: { spacing_between_lines_px: staveSpace * 1.0 } }, params); + const stave = new Stave(p.x, p.y, p.width, p.options); + this.staves.push(stave); + stave.setContext(this.context); + this.stave = stave; + return stave; + } + TabStave(params) { + const staveSpace = this.options.stave.space; + const p = Object.assign({ x: 0, y: 0, width: this.options.renderer.width - staveSpace * 1.0, options: { spacing_between_lines_px: staveSpace * 1.3 } }, params); + const stave = new TabStave(p.x, p.y, p.width, p.options); + this.staves.push(stave); + stave.setContext(this.context); + this.stave = stave; + return stave; + } + StaveNote(noteStruct) { + const note = new StaveNote(noteStruct); + if (this.stave) + note.setStave(this.stave); + note.setContext(this.context); + this.renderQ.push(note); + return note; + } + GlyphNote(glyph, noteStruct, options) { + const note = new GlyphNote(glyph, noteStruct, options); + if (this.stave) + note.setStave(this.stave); + note.setContext(this.context); + this.renderQ.push(note); + return note; + } + RepeatNote(type, noteStruct, options) { + const note = new RepeatNote(type, noteStruct, options); + if (this.stave) + note.setStave(this.stave); + note.setContext(this.context); + this.renderQ.push(note); + return note; + } + GhostNote(noteStruct) { + const ghostNote = new GhostNote(noteStruct); + if (this.stave) + ghostNote.setStave(this.stave); + ghostNote.setContext(this.context); + this.renderQ.push(ghostNote); + return ghostNote; + } + TextNote(noteStruct) { + const textNote = new TextNote(noteStruct); + if (this.stave) + textNote.setStave(this.stave); + textNote.setContext(this.context); + this.renderQ.push(textNote); + return textNote; + } + BarNote(params = {}) { + const barNote = new BarNote(params.type); + if (this.stave) + barNote.setStave(this.stave); + barNote.setContext(this.context); + this.renderQ.push(barNote); + return barNote; + } + ClefNote(params) { + const p = Object.assign({ type: 'treble', options: { + size: 'default', + annotation: undefined, + } }, params); + const clefNote = new ClefNote(p.type, p.options.size, p.options.annotation); + if (this.stave) + clefNote.setStave(this.stave); + clefNote.setContext(this.context); + this.renderQ.push(clefNote); + return clefNote; + } + TimeSigNote(params) { + const p = Object.assign({ time: '4/4' }, params); + const timeSigNote = new TimeSigNote(p.time); + if (this.stave) + timeSigNote.setStave(this.stave); + timeSigNote.setContext(this.context); + this.renderQ.push(timeSigNote); + return timeSigNote; + } + KeySigNote(params) { + const keySigNote = new KeySigNote(params.key, params.cancelKey, params.alterKey); + if (this.stave) + keySigNote.setStave(this.stave); + keySigNote.setContext(this.context); + this.renderQ.push(keySigNote); + return keySigNote; + } + TabNote(noteStruct) { + const note = new TabNote(noteStruct); + if (this.stave) + note.setStave(this.stave); + note.setContext(this.context); + this.renderQ.push(note); + return note; + } + GraceNote(noteStruct) { + const note = new GraceNote(noteStruct); + if (this.stave) + note.setStave(this.stave); + note.setContext(this.context); + return note; + } + GraceNoteGroup(params) { + const group = new GraceNoteGroup(params.notes, params.slur); + group.setContext(this.context); + return group; + } + Accidental(params) { + const accid = new Accidental(params.type); + accid.setContext(this.context); + return accid; + } + Annotation(params) { + const p = Object.assign({ text: 'p', hJustify: AnnotationHorizontalJustify.CENTER, vJustify: AnnotationVerticalJustify.BOTTOM }, params); + const annotation = new Annotation(p.text); + annotation.setJustification(p.hJustify); + annotation.setVerticalJustification(p.vJustify); + annotation.setFont(p.font); + annotation.setContext(this.context); + return annotation; + } + ChordSymbol(params) { + const p = Object.assign({ vJustify: 'top', hJustify: 'center', kerning: true, reportWidth: true }, params); + const chordSymbol = new ChordSymbol(); + chordSymbol.setHorizontal(p.hJustify); + chordSymbol.setVertical(p.vJustify); + chordSymbol.setEnableKerning(p.kerning); + chordSymbol.setReportWidth(p.reportWidth); + if (typeof p.fontFamily === 'string' && typeof p.fontSize === 'number') { + if (typeof p.fontWeight === 'string') + chordSymbol.setFont(p.fontFamily, p.fontSize, p.fontWeight); + else + chordSymbol.setFont(p.fontFamily, p.fontSize, ''); + } + else if (typeof p.fontSize === 'number') { + chordSymbol.setFontSize(p.fontSize); + } + chordSymbol.setContext(this.context); + return chordSymbol; + } + Articulation(params) { + const p = Object.assign({ type: 'a.', position: 'above' }, params); + const articulation = new Articulation(p.type); + articulation.setPosition(p.position); + articulation.setContext(this.context); + return articulation; + } + TextDynamics(params) { + const p = Object.assign({ text: 'p', duration: 'q', dots: 0, line: 0 }, params); + const text = new TextDynamics({ + text: p.text, + line: p.line, + duration: p.duration, + dots: p.dots, + }); + if (this.stave) + text.setStave(this.stave); + text.setContext(this.context); + this.renderQ.push(text); + return text; + } + Fingering(params) { + const p = Object.assign({ number: '0', position: 'left' }, params); + const fingering = new FretHandFinger(p.number); + fingering.setPosition(p.position); + fingering.setContext(this.context); + return fingering; + } + StringNumber(params) { + const stringNumber = new StringNumber(params.number); + stringNumber.setPosition(params.position); + stringNumber.setContext(this.context); + return stringNumber; + } + TickContext() { + return new TickContext(); + } + ModifierContext() { + return new ModifierContext(); + } + MultiMeasureRest(params) { + const numMeasures = defined(params.number_of_measures, 'NoNumberOfMeasures'); + const multiMeasureRest = new MultiMeasureRest(numMeasures, params); + multiMeasureRest.setContext(this.context); + this.renderQ.push(multiMeasureRest); + return multiMeasureRest; + } + Voice(params) { + const p = Object.assign({ time: '4/4' }, params); + const voice = new Voice(p.time, p.options); + this.voices.push(voice); + return voice; + } + StaveConnector(params) { + const connector = new StaveConnector(params.top_stave, params.bottom_stave); + connector.setType(params.type).setContext(this.context); + this.renderQ.push(connector); + return connector; + } + Formatter(options) { + return new Formatter(options); + } + Tuplet(params) { + const p = Object.assign({ notes: [], options: {} }, params); + const tuplet = new Tuplet(p.notes, p.options).setContext(this.context); + this.renderQ.push(tuplet); + return tuplet; + } + Beam(params) { + var _a, _b, _c; + const beam = new Beam(params.notes, (_a = params.options) === null || _a === void 0 ? void 0 : _a.autoStem).setContext(this.context); + beam.breakSecondaryAt((_c = (_b = params.options) === null || _b === void 0 ? void 0 : _b.secondaryBeamBreaks) !== null && _c !== void 0 ? _c : []); + this.renderQ.push(beam); + return beam; + } + Curve(params) { + const curve = new Curve(params.from, params.to, params.options).setContext(this.context); + this.renderQ.push(curve); + return curve; + } + StaveTie(params) { + var _a; + const tie = new StaveTie({ + first_note: params.from, + last_note: params.to, + first_indices: params.first_indices, + last_indices: params.last_indices, + }, params.text); + if ((_a = params.options) === null || _a === void 0 ? void 0 : _a.direction) + tie.setDirection(params.options.direction); + tie.setContext(this.context); + this.renderQ.push(tie); + return tie; + } + StaveLine(params) { + var _a, _b; + const line = new StaveLine({ + first_note: params.from, + last_note: params.to, + first_indices: params.first_indices, + last_indices: params.last_indices, + }); + if ((_a = params.options) === null || _a === void 0 ? void 0 : _a.text) + line.setText(params.options.text); + if ((_b = params.options) === null || _b === void 0 ? void 0 : _b.font) + line.setFont(params.options.font); + line.setContext(this.context); + this.renderQ.push(line); + return line; + } + VibratoBracket(params) { + const vibratoBracket = new VibratoBracket({ + start: params.from, + stop: params.to, + }); + if (params.options.line) + vibratoBracket.setLine(params.options.line); + if (params.options.harsh) + vibratoBracket.setHarsh(params.options.harsh); + vibratoBracket.setContext(this.context); + this.renderQ.push(vibratoBracket); + return vibratoBracket; + } + TextBracket(params) { + const textBracket = new TextBracket({ + start: params.from, + stop: params.to, + text: params.text, + superscript: params.options.superscript, + position: params.options.position, + }); + if (params.options.line) + textBracket.setLine(params.options.line); + if (params.options.font) + textBracket.setFont(params.options.font); + textBracket.setContext(this.context); + this.renderQ.push(textBracket); + return textBracket; + } + System(params = {}) { + params.factory = this; + const system = new System(params).setContext(this.context); + this.systems.push(system); + return system; + } + EasyScore(options = {}) { + options.factory = this; + return new EasyScore(options); + } + PedalMarking(params) { + const p = Object.assign({ notes: [], options: { + style: 'mixed', + } }, params); + const pedal = new PedalMarking(p.notes); + pedal.setType(PedalMarking.typeString[p.options.style]); + pedal.setContext(this.context); + this.renderQ.push(pedal); + return pedal; + } + NoteSubGroup(params) { + const p = Object.assign({ notes: [] }, params); + const group = new NoteSubGroup(p.notes); + group.setContext(this.context); + return group; + } + draw() { + const ctx = this.context; + this.systems.forEach((s) => s.setContext(ctx).format()); + this.staves.forEach((s) => s.setContext(ctx).draw()); + this.voices.forEach((v) => v.setContext(ctx).draw()); + this.renderQ.forEach((e) => { + if (!e.isRendered()) + e.setContext(ctx).draw(); + }); + this.systems.forEach((s) => s.setContext(ctx).draw()); + this.reset(); + } +} +Factory.DEBUG = false; +Factory.TEXT_FONT = Object.assign({}, Element.TEXT_FONT); diff --git a/build/esm/src/flow.js b/build/esm/src/flow.js new file mode 100644 index 0000000000..639833bf38 --- /dev/null +++ b/build/esm/src/flow.js @@ -0,0 +1,275 @@ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +import { Accidental } from './accidental.js'; +import { Annotation } from './annotation.js'; +import { Articulation } from './articulation.js'; +import { BarNote } from './barnote.js'; +import { Beam } from './beam.js'; +import { Bend } from './bend.js'; +import { BoundingBox } from './boundingbox.js'; +import { BoundingBoxComputation } from './boundingboxcomputation.js'; +import { CanvasContext } from './canvascontext.js'; +import { ChordSymbol } from './chordsymbol.js'; +import { Clef } from './clef.js'; +import { ClefNote } from './clefnote.js'; +import { Crescendo } from './crescendo.js'; +import { Curve } from './curve.js'; +import { Dot } from './dot.js'; +import { EasyScore } from './easyscore.js'; +import { Element } from './element.js'; +import { Factory } from './factory.js'; +import { Font } from './font.js'; +import { Formatter } from './formatter.js'; +import { Fraction } from './fraction.js'; +import { FretHandFinger } from './frethandfinger.js'; +import { GhostNote } from './ghostnote.js'; +import { Glyph } from './glyph.js'; +import { GlyphNote } from './glyphnote.js'; +import { GraceNote } from './gracenote.js'; +import { GraceNoteGroup } from './gracenotegroup.js'; +import { GraceTabNote } from './gracetabnote.js'; +import { KeyManager } from './keymanager.js'; +import { KeySignature } from './keysignature.js'; +import { KeySigNote } from './keysignote.js'; +import { Modifier, ModifierPosition } from './modifier.js'; +import { ModifierContext } from './modifiercontext.js'; +import { MultiMeasureRest } from './multimeasurerest.js'; +import { Music } from './music.js'; +import { Note } from './note.js'; +import { NoteHead } from './notehead.js'; +import { NoteSubGroup } from './notesubgroup.js'; +import { Ornament } from './ornament.js'; +import { Parenthesis } from './parenthesis.js'; +import { Parser } from './parser.js'; +import { PedalMarking } from './pedalmarking.js'; +import { Registry } from './registry.js'; +import { RenderContext } from './rendercontext.js'; +import { Renderer } from './renderer.js'; +import { RepeatNote } from './repeatnote.js'; +import { Stave } from './stave.js'; +import { Barline, BarlineType } from './stavebarline.js'; +import { StaveConnector } from './staveconnector.js'; +import { StaveHairpin } from './stavehairpin.js'; +import { StaveLine } from './staveline.js'; +import { StaveModifier } from './stavemodifier.js'; +import { StaveNote } from './stavenote.js'; +import { Repetition } from './staverepetition.js'; +import { StaveTempo } from './stavetempo.js'; +import { StaveText } from './stavetext.js'; +import { StaveTie } from './stavetie.js'; +import { Volta } from './stavevolta.js'; +import { Stem } from './stem.js'; +import { StringNumber } from './stringnumber.js'; +import { Stroke } from './strokes.js'; +import { SVGContext } from './svgcontext.js'; +import { System } from './system.js'; +import { Tables } from './tables.js'; +import { TabNote } from './tabnote.js'; +import { TabSlide } from './tabslide.js'; +import { TabStave } from './tabstave.js'; +import { TabTie } from './tabtie.js'; +import { TextBracket } from './textbracket.js'; +import { TextDynamics } from './textdynamics.js'; +import { TextFormatter } from './textformatter.js'; +import { TextNote } from './textnote.js'; +import { TickContext } from './tickcontext.js'; +import { TimeSignature } from './timesignature.js'; +import { TimeSigNote } from './timesignote.js'; +import { Tremolo } from './tremolo.js'; +import { Tuning } from './tuning.js'; +import { Tuplet } from './tuplet.js'; +import { DATE, ID, VERSION } from './version.js'; +import { Vibrato } from './vibrato.js'; +import { VibratoBracket } from './vibratobracket.js'; +import { Voice } from './voice.js'; +export class Flow { + static get BUILD() { + return { + VERSION: VERSION, + ID: ID, + DATE: DATE, + }; + } + static get Flow() { + return Flow; + } + static setMusicFont(...fontNames) { + const fonts = fontNames.map((fontName) => Font.load(fontName)); + Tables.MUSIC_FONT_STACK = fonts; + Glyph.MUSIC_FONT_STACK = fonts.slice(); + Glyph.CURRENT_CACHE_KEY = fontNames.join(','); + return fonts; + } + static fetchMusicFont(fontName, fontModuleOrPath) { + return __awaiter(this, void 0, void 0, function* () { + }); + } + static getMusicFont() { + const fonts = Tables.MUSIC_FONT_STACK; + return fonts.map((font) => font.getName()); + } + static get NOTATION_FONT_SCALE() { + return Tables.NOTATION_FONT_SCALE; + } + static set NOTATION_FONT_SCALE(value) { + Tables.NOTATION_FONT_SCALE = value; + } + static get TABLATURE_FONT_SCALE() { + return Tables.TABLATURE_FONT_SCALE; + } + static set TABLATURE_FONT_SCALE(value) { + Tables.TABLATURE_FONT_SCALE = value; + } + static get RESOLUTION() { + return Tables.RESOLUTION; + } + static set RESOLUTION(value) { + Tables.RESOLUTION = value; + } + static get SLASH_NOTEHEAD_WIDTH() { + return Tables.SLASH_NOTEHEAD_WIDTH; + } + static set SLASH_NOTEHEAD_WIDTH(value) { + Tables.SLASH_NOTEHEAD_WIDTH = value; + } + static get STAVE_LINE_DISTANCE() { + return Tables.STAVE_LINE_DISTANCE; + } + static set STAVE_LINE_DISTANCE(value) { + Tables.STAVE_LINE_DISTANCE = value; + } + static get STAVE_LINE_THICKNESS() { + return Tables.STAVE_LINE_THICKNESS; + } + static set STAVE_LINE_THICKNESS(value) { + Tables.STAVE_LINE_THICKNESS = value; + } + static get STEM_HEIGHT() { + return Tables.STEM_HEIGHT; + } + static set STEM_HEIGHT(value) { + Tables.STEM_HEIGHT = value; + } + static get STEM_WIDTH() { + return Tables.STEM_WIDTH; + } + static set STEM_WIDTH(value) { + Tables.STEM_WIDTH = value; + } + static get TIME4_4() { + return Tables.TIME4_4; + } + static get accidentalMap() { + return Tables.accidentalMap; + } + static get unicode() { + return Tables.unicode; + } + static keySignature(spec) { + return Tables.keySignature(spec); + } + static hasKeySignature(spec) { + return Tables.hasKeySignature(spec); + } + static getKeySignatures() { + return Tables.getKeySignatures(); + } + static clefProperties(clef) { + return Tables.clefProperties(clef); + } + static keyProperties(key, clef, params) { + return Tables.keyProperties(key, clef, params); + } + static durationToTicks(duration) { + return Tables.durationToTicks(duration); + } +} +Flow.Accidental = Accidental; +Flow.Annotation = Annotation; +Flow.Articulation = Articulation; +Flow.Barline = Barline; +Flow.BarNote = BarNote; +Flow.Beam = Beam; +Flow.Bend = Bend; +Flow.BoundingBox = BoundingBox; +Flow.BoundingBoxComputation = BoundingBoxComputation; +Flow.CanvasContext = CanvasContext; +Flow.ChordSymbol = ChordSymbol; +Flow.Clef = Clef; +Flow.ClefNote = ClefNote; +Flow.Crescendo = Crescendo; +Flow.Curve = Curve; +Flow.Dot = Dot; +Flow.EasyScore = EasyScore; +Flow.Element = Element; +Flow.Factory = Factory; +Flow.Font = Font; +Flow.Formatter = Formatter; +Flow.Fraction = Fraction; +Flow.FretHandFinger = FretHandFinger; +Flow.GhostNote = GhostNote; +Flow.Glyph = Glyph; +Flow.GlyphNote = GlyphNote; +Flow.GraceNote = GraceNote; +Flow.GraceNoteGroup = GraceNoteGroup; +Flow.GraceTabNote = GraceTabNote; +Flow.KeyManager = KeyManager; +Flow.KeySignature = KeySignature; +Flow.KeySigNote = KeySigNote; +Flow.Modifier = Modifier; +Flow.ModifierContext = ModifierContext; +Flow.MultiMeasureRest = MultiMeasureRest; +Flow.Music = Music; +Flow.Note = Note; +Flow.NoteHead = NoteHead; +Flow.NoteSubGroup = NoteSubGroup; +Flow.Ornament = Ornament; +Flow.Parenthesis = Parenthesis; +Flow.Parser = Parser; +Flow.PedalMarking = PedalMarking; +Flow.Registry = Registry; +Flow.RenderContext = RenderContext; +Flow.Renderer = Renderer; +Flow.RepeatNote = RepeatNote; +Flow.Repetition = Repetition; +Flow.Stave = Stave; +Flow.StaveConnector = StaveConnector; +Flow.StaveHairpin = StaveHairpin; +Flow.StaveLine = StaveLine; +Flow.StaveModifier = StaveModifier; +Flow.StaveNote = StaveNote; +Flow.StaveTempo = StaveTempo; +Flow.StaveText = StaveText; +Flow.StaveTie = StaveTie; +Flow.Stem = Stem; +Flow.StringNumber = StringNumber; +Flow.Stroke = Stroke; +Flow.SVGContext = SVGContext; +Flow.System = System; +Flow.TabNote = TabNote; +Flow.TabSlide = TabSlide; +Flow.TabStave = TabStave; +Flow.TabTie = TabTie; +Flow.TextBracket = TextBracket; +Flow.TextDynamics = TextDynamics; +Flow.TextFormatter = TextFormatter; +Flow.TextNote = TextNote; +Flow.TickContext = TickContext; +Flow.TimeSignature = TimeSignature; +Flow.TimeSigNote = TimeSigNote; +Flow.Tremolo = Tremolo; +Flow.Tuning = Tuning; +Flow.Tuplet = Tuplet; +Flow.Vibrato = Vibrato; +Flow.VibratoBracket = VibratoBracket; +Flow.Voice = Voice; +Flow.Volta = Volta; +Flow.BarlineType = BarlineType; +Flow.ModifierPosition = ModifierPosition; diff --git a/build/esm/src/font.js b/build/esm/src/font.js new file mode 100644 index 0000000000..8821c5b9e3 --- /dev/null +++ b/build/esm/src/font.js @@ -0,0 +1,264 @@ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +import { defined } from './util.js'; +export var FontWeight; +(function (FontWeight) { + FontWeight["NORMAL"] = "normal"; + FontWeight["BOLD"] = "bold"; +})(FontWeight || (FontWeight = {})); +export var FontStyle; +(function (FontStyle) { + FontStyle["NORMAL"] = "normal"; + FontStyle["ITALIC"] = "italic"; +})(FontStyle || (FontStyle = {})); +let fontParser; +const Fonts = {}; +export class Font { + constructor(fontName) { + this.name = fontName; + } + static convertSizeToPixelValue(fontSize = Font.SIZE) { + var _a; + if (typeof fontSize === 'number') { + return fontSize * Font.scaleToPxFrom.pt; + } + else { + const value = parseFloat(fontSize); + if (isNaN(value)) { + return 0; + } + const unit = fontSize.replace(/[\d.\s]/g, '').toLowerCase(); + const conversionFactor = (_a = Font.scaleToPxFrom[unit]) !== null && _a !== void 0 ? _a : 1; + return value * conversionFactor; + } + } + static convertSizeToPointValue(fontSize = Font.SIZE) { + var _a; + if (typeof fontSize === 'number') { + return fontSize; + } + else { + const value = parseFloat(fontSize); + if (isNaN(value)) { + return 0; + } + const unit = fontSize.replace(/[\d.\s]/g, '').toLowerCase(); + const conversionFactor = ((_a = Font.scaleToPxFrom[unit]) !== null && _a !== void 0 ? _a : 1) / Font.scaleToPxFrom.pt; + return value * conversionFactor; + } + } + static validate(f, size, weight, style) { + if (typeof f === 'string' && size === undefined && weight === undefined && style === undefined) { + return Font.fromCSSString(f); + } + let family; + if (typeof f === 'object') { + family = f.family; + size = f.size; + weight = f.weight; + style = f.style; + } + else { + family = f; + } + family = family !== null && family !== void 0 ? family : Font.SANS_SERIF; + size = size !== null && size !== void 0 ? size : Font.SIZE + 'pt'; + weight = weight !== null && weight !== void 0 ? weight : FontWeight.NORMAL; + style = style !== null && style !== void 0 ? style : FontStyle.NORMAL; + if (weight === '') { + weight = FontWeight.NORMAL; + } + if (style === '') { + style = FontStyle.NORMAL; + } + if (typeof size === 'number') { + size = `${size}pt`; + } + if (typeof weight === 'number') { + weight = weight.toString(); + } + return { family, size, weight, style }; + } + static fromCSSString(cssFontShorthand) { + if (!fontParser) { + fontParser = document.createElement('span'); + } + fontParser.style.font = cssFontShorthand; + const { fontFamily, fontSize, fontWeight, fontStyle } = fontParser.style; + return { family: fontFamily, size: fontSize, weight: fontWeight, style: fontStyle }; + } + static toCSSString(fontInfo) { + var _a; + if (!fontInfo) { + return ''; + } + let style; + const st = fontInfo.style; + if (st === FontStyle.NORMAL || st === '' || st === undefined) { + style = ''; + } + else { + style = st.trim() + ' '; + } + let weight; + const wt = fontInfo.weight; + if (wt === FontWeight.NORMAL || wt === '' || wt === undefined) { + weight = ''; + } + else if (typeof wt === 'number') { + weight = wt + ' '; + } + else { + weight = wt.trim() + ' '; + } + let size; + const sz = fontInfo.size; + if (sz === undefined) { + size = Font.SIZE + 'pt '; + } + else if (typeof sz === 'number') { + size = sz + 'pt '; + } + else { + size = sz.trim() + ' '; + } + const family = (_a = fontInfo.family) !== null && _a !== void 0 ? _a : Font.SANS_SERIF; + return `${style}${weight}${size}${family}`; + } + static scaleSize(fontSize, scaleFactor) { + if (typeof fontSize === 'number') { + return (fontSize * scaleFactor); + } + else { + const value = parseFloat(fontSize); + const unit = fontSize.replace(/[\d.\s]/g, ''); + return `${value * scaleFactor}${unit}`; + } + } + static isBold(weight) { + if (!weight) { + return false; + } + else if (typeof weight === 'number') { + return weight >= 600; + } + else { + const parsedWeight = parseInt(weight, 10); + if (isNaN(parsedWeight)) { + return weight.toLowerCase() === 'bold'; + } + else { + return parsedWeight >= 600; + } + } + } + static isItalic(style) { + if (!style) { + return false; + } + else { + return style.toLowerCase() === FontStyle.ITALIC; + } + } + static loadWebFont(fontName, woffURL, includeWoff2 = true) { + return __awaiter(this, void 0, void 0, function* () { + const woff2URL = includeWoff2 ? `url(${woffURL}2) format('woff2'), ` : ''; + const woff1URL = `url(${woffURL}) format('woff')`; + const woffURLs = woff2URL + woff1URL; + const fontFace = new FontFace(fontName, woffURLs); + yield fontFace.load(); + document.fonts.add(fontFace); + return fontFace; + }); + } + static loadWebFonts() { + return __awaiter(this, void 0, void 0, function* () { + const host = Font.WEB_FONT_HOST; + const files = Font.WEB_FONT_FILES; + for (const fontName in files) { + const fontPath = files[fontName]; + Font.loadWebFont(fontName, host + fontPath); + } + }); + } + static loadTextFonts() { + } + static load(fontName, data, metrics) { + let font = Fonts[fontName]; + if (!font) { + font = new Font(fontName); + Fonts[fontName] = font; + } + if (data) { + font.setData(data); + } + if (metrics) { + font.setMetrics(metrics); + } + return font; + } + getName() { + return this.name; + } + getData() { + return defined(this.data, 'FontError', 'Missing font data'); + } + getMetrics() { + return defined(this.metrics, 'FontError', 'Missing metrics'); + } + setData(data) { + this.data = data; + } + setMetrics(metrics) { + this.metrics = metrics; + } + hasData() { + return this.data !== undefined; + } + getResolution() { + return this.getData().resolution; + } + getGlyphs() { + return this.getData().glyphs; + } + lookupMetric(key, defaultValue) { + const keyParts = key.split('.'); + let currObj = this.getMetrics(); + for (let i = 0; i < keyParts.length; i++) { + const keyPart = keyParts[i]; + const value = currObj[keyPart]; + if (value === undefined) { + return defaultValue; + } + currObj = value; + } + return currObj; + } + toString() { + return '[' + this.name + ' Font]'; + } +} +Font.SANS_SERIF = 'Arial, sans-serif'; +Font.SERIF = 'Times New Roman, serif'; +Font.SIZE = 10; +Font.scaleToPxFrom = { + pt: 4 / 3, + px: 1, + em: 16, + '%': 4 / 25, + in: 96, + mm: 96 / 25.4, + cm: 96 / 2.54, +}; +Font.WEB_FONT_HOST = 'https://unpkg.com/vexflow-fonts@1.0.3/'; +Font.WEB_FONT_FILES = { + 'Roboto Slab': 'robotoslab/RobotoSlab-Medium_2.001.woff', + PetalumaScript: 'petaluma/PetalumaScript_1.10_FS.woff', +}; diff --git a/build/esm/src/fonts/bravura_glyphs.js b/build/esm/src/fonts/bravura_glyphs.js new file mode 100644 index 0000000000..bfdd985afa --- /dev/null +++ b/build/esm/src/fonts/bravura_glyphs.js @@ -0,0 +1,3239 @@ +export const BravuraFont = { + glyphs: { + bracketTop: { + x_min: 0, + x_max: 469, + y_min: 0, + y_max: 295, + ha: 295, + o: 'm 0 0 l 180 0 b 674 390 410 43 616 150 b 675 405 675 396 675 400 b 664 425 675 416 671 422 b 628 405 651 425 635 415 b 157 179 613 389 432 199 l 12 179 b 0 168 3 179 0 177 z', + }, + bracketBottom: { + x_min: 0, + x_max: 469, + y_min: -295, + y_max: 0, + ha: 295, + o: 'm 0 -168 b 12 -179 0 -177 3 -179 l 157 -179 b 628 -405 432 -199 613 -389 b 664 -425 635 -415 651 -425 b 675 -405 671 -422 675 -416 b 674 -390 675 -400 675 -396 b 180 0 616 -150 410 -43 l 0 0 z', + }, + barlineTick: { + x_min: 0, + x_max: 36, + y_min: 868, + y_max: 1120, + ha: 252, + o: 'm 52 1250 l 52 1613 l 0 1613 l 0 1250 z', + }, + breathMarkTick: { + x_min: 0, + x_max: 500, + y_min: 0, + y_max: 502, + ha: 502, + o: 'm 9 367 b 0 374 6 372 3 374 b 9 334 0 367 0 343 b 179 19 40 312 164 121 b 192 0 179 3 186 0 b 210 19 197 0 207 6 b 698 701 245 197 507 658 b 720 714 714 704 720 711 b 698 723 720 720 711 723 b 197 186 455 714 210 202 b 186 176 194 179 189 176 b 176 186 179 176 176 186 b 9 367 143 266 27 359 z', + }, + segno: { + x_min: 4, + x_max: 550, + y_min: -27, + y_max: 759, + ha: 786, + o: 'm 194 958 b 217 939 203 958 213 955 l 220 929 b 325 805 230 890 252 805 b 425 901 384 805 425 840 b 413 969 425 923 420 946 b 220 1060 390 1035 294 1060 b 6 793 120 1060 6 936 b 29 687 6 759 13 723 b 295 449 75 582 284 454 b 304 438 301 446 304 444 b 295 415 304 432 301 425 b 78 22 285 395 78 22 b 73 3 75 16 73 9 b 114 -39 73 -20 91 -39 b 150 -17 128 -39 143 -30 b 377 395 150 -17 373 386 b 395 402 377 393 389 402 b 704 176 416 397 704 312 b 621 75 704 120 670 82 l 616 73 b 562 138 586 73 562 94 l 562 154 b 485 249 562 209 526 249 b 468 246 480 249 474 248 b 366 153 415 233 366 210 b 540 -12 366 65 455 -12 b 600 -1 559 -12 579 -9 b 792 251 716 37 792 131 b 789 292 792 264 791 278 b 523 588 768 451 540 579 b 498 611 505 598 498 603 b 501 619 498 613 500 616 b 732 1032 508 631 732 1032 b 737 1053 736 1040 737 1045 b 697 1093 737 1076 719 1093 b 661 1073 683 1093 668 1086 b 423 647 661 1073 432 660 b 410 635 419 639 416 635 b 396 639 406 635 402 636 b 128 792 383 644 166 727 b 108 868 120 808 108 838 b 186 958 108 907 125 948 z m 598 671 b 680 589 598 626 635 589 b 762 671 726 589 762 626 b 680 753 762 717 726 753 b 598 671 635 753 598 717 z m 202 380 b 120 462 202 425 166 462 b 37 380 75 462 37 425 b 120 298 37 334 75 298 b 202 380 166 298 202 334 z', + }, + coda: { + x_min: -4, + x_max: 955, + y_min: -158, + y_max: 898, + ha: 1056, + o: 'm 1349 576 l 1178 576 b 729 1083 1164 847 962 1064 l 729 1269 b 694 1293 729 1287 713 1293 b 660 1269 675 1293 660 1287 l 660 1083 b 210 576 426 1064 226 848 l 20 576 b -6 541 0 576 -6 560 b 20 507 -6 523 0 507 l 210 507 b 660 0 226 238 426 19 l 660 -202 b 694 -228 660 -222 675 -228 b 729 -202 713 -228 729 -222 l 729 0 b 1178 507 962 19 1164 238 l 1349 507 b 1375 541 1369 507 1375 523 b 1349 576 1375 560 1369 576 z m 940 576 l 729 576 l 729 1002 b 940 576 930 985 940 809 z m 660 1002 l 660 576 l 455 576 b 660 1002 455 809 455 985 z m 455 507 l 660 507 l 660 69 b 455 507 474 91 456 285 z m 729 69 l 729 507 l 940 507 b 729 69 936 287 909 91 z', + }, + gClef: { + x_min: 0, + x_max: 671, + y_min: -658, + y_max: 1098, + ha: 1756, + o: 'm 541 598 b 550 625 539 615 541 616 b 824 1174 706 770 824 953 b 730 1509 824 1299 789 1423 b 655 1581 708 1541 671 1581 b 562 1512 635 1581 590 1544 b 420 1064 455 1394 420 1214 b 441 828 420 981 431 887 b 428 793 444 811 445 808 b 0 125 220 622 0 416 b 524 -363 0 -125 171 -363 b 624 -354 557 -363 595 -360 b 645 -367 639 -351 642 -350 b 684 -657 662 -464 684 -589 b 455 -896 684 -870 540 -896 b 340 -854 377 -896 340 -873 b 386 -829 340 -844 353 -840 b 482 -694 431 -816 482 -778 b 344 -547 482 -615 432 -547 b 190 -713 248 -547 190 -624 b 464 -948 190 -806 246 -948 b 747 -660 560 -948 747 -904 b 706 -351 747 -577 721 -441 b 724 -327 703 -334 704 -336 b 966 16 870 -269 966 -147 b 619 363 966 200 831 363 b 577 389 582 363 582 363 z m 677 1358 b 763 1240 724 1358 763 1319 b 513 851 763 1080 626 950 b 494 863 503 842 497 844 b 485 995 488 900 485 949 b 677 1358 485 1220 589 1358 z m 520 377 b 498 343 524 350 524 351 b 289 63 372 300 289 186 b 455 -192 289 -66 357 -158 b 494 -200 467 -196 484 -200 b 511 -184 505 -200 511 -193 b 490 -166 511 -174 500 -170 b 386 -12 429 -140 386 -78 b 530 157 386 71 442 132 b 559 145 553 163 556 161 l 631 -284 b 611 -304 634 -300 632 -300 b 530 -311 588 -308 559 -311 b 115 29 278 -311 115 -171 b 249 363 115 114 130 228 b 469 567 336 459 402 513 b 490 562 484 579 487 577 z m 619 148 b 635 168 616 166 618 170 b 848 -66 752 158 848 60 b 713 -271 848 -157 793 -230 b 690 -262 696 -279 693 -279 z', + }, + cClef: { + x_min: 0, + x_max: 699, + y_min: -506, + y_max: 506, + ha: 1012, + o: 'm 331 694 b 301 724 331 714 321 724 l 300 724 b 269 694 279 724 269 714 l 269 -694 b 300 -724 269 -714 279 -724 l 301 -724 b 331 -694 321 -724 331 -714 l 331 -63 b 344 -55 331 -52 338 -53 b 472 -265 382 -65 442 -102 b 500 -301 477 -288 485 -301 b 530 -262 516 -301 523 -287 b 684 -128 549 -199 582 -128 b 804 -409 778 -128 804 -220 b 651 -683 804 -598 770 -683 b 528 -644 631 -683 528 -674 b 567 -622 528 -636 552 -628 b 625 -528 596 -612 625 -583 b 527 -429 625 -465 583 -429 b 416 -547 465 -429 416 -471 b 667 -729 416 -638 495 -729 b 1007 -413 903 -729 1007 -563 b 706 -76 1007 -215 897 -76 b 618 -89 664 -76 636 -84 b 576 -88 603 -94 589 -96 b 524 0 556 -75 524 -29 b 576 88 524 29 556 75 b 618 89 589 96 603 94 b 706 76 636 84 664 76 b 1007 413 897 76 1007 215 b 667 729 1007 563 903 729 b 416 547 495 729 416 638 b 527 429 416 471 465 429 b 625 528 583 429 625 465 b 567 622 625 583 596 612 b 528 644 552 628 528 636 b 651 683 528 674 631 683 b 804 409 770 683 804 598 b 684 128 804 220 778 128 b 530 262 582 128 549 199 b 500 301 523 287 516 301 b 472 265 485 301 477 288 b 344 55 442 102 382 65 b 331 63 338 53 331 52 z m 30 724 b 0 694 10 724 0 714 l 0 -694 b 30 -724 0 -714 10 -724 l 154 -724 b 184 -694 174 -724 184 -714 l 184 694 b 154 724 184 714 174 724 z', + }, + fClef: { + x_min: -5, + x_max: 684, + y_min: -635, + y_max: 262, + ha: 897, + o: 'm 363 377 b 0 56 112 377 0 194 b 177 -158 0 -59 60 -158 b 330 -6 268 -158 330 -95 b 192 144 330 86 262 144 b 120 134 153 144 138 134 b 96 160 101 134 96 145 b 330 323 96 217 183 323 b 549 -53 482 323 549 173 b 14 -871 549 -455 350 -680 b -7 -897 1 -878 -7 -886 b 12 -914 -7 -906 -1 -914 b 36 -907 19 -914 27 -912 b 765 -40 390 -734 765 -478 b 363 377 765 210 612 377 z m 906 259 b 827 180 861 259 827 225 b 906 101 827 135 861 101 b 985 180 950 101 985 135 b 906 259 985 225 950 259 z m 907 -102 b 829 -180 863 -102 829 -135 b 907 -258 829 -225 863 -258 b 985 -180 952 -258 985 -225 b 907 -102 985 -135 952 -102 z', + }, + unpitchedPercussionClef1: { + x_min: 0, + x_max: 382, + y_min: -250, + y_max: 250, + ha: 500, + o: 'm 230 -338 l 230 338 b 210 360 230 350 222 360 l 20 360 b 0 338 9 360 0 350 l 0 -338 b 20 -360 0 -350 9 -360 l 210 -360 b 230 -338 222 -360 230 -350 z m 550 338 b 530 360 550 350 541 360 l 340 360 b 320 338 328 360 320 350 l 320 -338 b 340 -360 320 -350 328 -360 l 530 -360 b 550 -338 541 -360 550 -350 z', + }, + '6stringTabClef': { + x_min: -3, + x_max: 408, + y_min: -748, + y_max: 764, + ha: 1512, + o: 'm 557 1024 l 557 1100 l 26 1100 l 26 1024 l 249 1024 l 249 422 l 336 422 l 336 1024 z m 588 -328 l 350 348 l 238 348 l -4 -328 l 88 -328 l 160 -125 l 420 -125 l 491 -328 z m 397 -52 l 181 -52 l 292 256 z m 544 -883 b 420 -719 544 -802 507 -752 b 514 -572 482 -690 514 -639 b 314 -399 514 -472 442 -399 l 39 -399 l 39 -1077 l 344 -1077 b 544 -883 467 -1077 544 -995 z m 428 -583 b 292 -691 428 -652 389 -691 l 125 -691 l 125 -475 l 292 -475 b 428 -583 389 -475 428 -514 z m 458 -884 b 337 -1001 458 -949 418 -1001 l 125 -1001 l 125 -768 l 337 -768 b 458 -884 418 -768 458 -818 z', + }, + timeSig0: { + x_min: 20, + x_max: 450, + y_min: -250, + y_max: 251, + ha: 501, + o: 'm 648 0 b 338 361 648 200 510 361 b 29 0 167 361 29 200 b 338 -360 29 -199 167 -360 b 648 0 510 -360 648 -199 z m 338 317 b 446 10 397 317 446 180 b 338 -295 446 -158 397 -295 b 230 10 278 -295 230 -158 b 338 317 230 180 278 317 z', + }, + timeSig1: { + x_min: 20, + x_max: 314, + y_min: -250, + y_max: 251, + ha: 501, + o: 'm 35 19 b 29 0 35 19 29 10 b 45 -20 29 -7 33 -16 b 58 -23 50 -22 56 -23 b 78 -10 72 -23 78 -10 b 156 117 78 -10 140 89 b 170 131 161 127 167 131 b 179 111 176 131 179 120 l 179 -261 b 115 -315 179 -294 145 -315 b 91 -337 105 -315 91 -320 b 122 -360 91 -353 104 -360 l 429 -360 b 452 -337 452 -360 452 -337 b 431 -315 452 -337 452 -315 b 384 -265 410 -315 384 -289 l 384 328 b 356 361 384 351 376 360 b 281 356 336 361 300 356 b 206 360 253 356 228 357 b 199 361 203 360 200 361 b 173 334 184 361 179 347 z', + }, + timeSig2: { + x_min: 20, + x_max: 426, + y_min: -257, + y_max: 254, + ha: 511, + o: 'm 606 -131 b 589 -111 606 -114 599 -111 b 570 -127 577 -111 573 -117 l 569 -128 b 513 -192 554 -164 543 -192 b 488 -187 505 -192 498 -190 b 445 -171 469 -180 459 -179 b 289 -137 416 -160 348 -137 b 236 -145 271 -137 252 -140 b 422 -42 268 -94 390 -50 b 613 147 523 -14 613 27 b 330 366 613 300 464 366 b 69 275 229 366 140 357 b 29 170 45 245 29 209 b 42 108 29 150 33 130 b 160 29 63 63 108 29 b 261 156 248 29 261 120 b 161 275 261 242 161 246 b 275 330 164 295 190 330 b 405 192 403 330 405 233 b 193 -102 405 60 297 -39 b 33 -317 114 -153 58 -223 l 32 -321 b 69 -370 32 -340 48 -370 b 203 -282 101 -370 118 -282 b 410 -360 261 -282 282 -360 b 606 -131 472 -360 583 -354 z', + }, + timeSig3: { + x_min: 20, + x_max: 401, + y_min: -251, + y_max: 249, + ha: 500, + o: 'm 307 357 b 301 357 305 357 304 357 l 291 359 b 285 359 289 359 287 359 b 37 200 161 359 37 276 b 154 84 37 153 65 89 l 161 84 b 256 177 225 84 256 130 l 256 189 b 209 248 252 242 216 245 b 180 268 202 251 180 248 l 180 274 b 240 310 183 298 228 310 b 374 199 363 310 374 233 l 374 189 b 199 36 374 82 289 40 b 164 12 184 35 164 27 b 200 -6 164 -6 189 -6 b 379 -137 366 -6 379 -118 b 269 -307 379 -289 301 -307 b 256 -305 264 -307 258 -305 b 216 -282 245 -304 217 -304 l 216 -275 b 249 -180 216 -243 248 -222 b 145 -76 249 -120 207 -76 b 130 -78 140 -76 135 -76 b 60 -115 105 -82 78 -96 b 29 -203 36 -137 29 -171 b 275 -361 32 -315 134 -359 l 288 -361 b 577 -161 431 -361 577 -288 l 577 -151 b 537 -50 575 -109 564 -82 b 503 -20 528 -39 517 -29 l 472 -3 l 425 10 b 410 17 418 12 413 12 b 409 24 409 20 409 22 b 415 37 409 30 410 36 b 459 50 431 42 446 43 b 547 181 517 78 547 115 b 307 357 547 314 367 353 z', + }, + timeSig4: { + x_min: 20, + x_max: 450, + y_min: -250, + y_max: 251, + ha: 501, + o: 'm 521 -107 l 521 202 b 504 226 521 213 520 226 b 475 213 491 226 484 223 l 338 48 b 325 14 333 40 325 32 l 325 -107 l 131 -107 b 481 336 246 -9 477 318 l 482 340 b 461 361 482 353 472 361 b 363 359 448 361 389 359 b 261 361 337 359 272 361 b 228 334 248 361 228 357 b 43 -105 228 156 86 -45 l 35 -117 b 35 -118 35 -117 35 -118 l 33 -120 b 29 -137 30 -127 29 -132 b 58 -161 29 -151 40 -161 l 325 -161 l 325 -252 b 268 -302 325 -291 294 -302 b 235 -330 245 -302 235 -315 b 262 -360 235 -344 240 -360 l 569 -360 b 598 -330 583 -360 598 -350 b 566 -301 598 -310 580 -301 b 521 -246 552 -301 521 -292 l 521 -161 l 626 -161 b 648 -134 641 -161 648 -151 b 626 -107 648 -117 642 -107 z', + }, + timeSig5: { + x_min: 20, + x_max: 383, + y_min: -251, + y_max: 246, + ha: 497, + o: 'm 109 85 b 117 179 109 85 115 166 b 138 197 118 190 125 197 l 144 197 b 285 184 158 194 226 184 b 492 323 485 184 492 300 b 472 353 492 341 488 353 b 295 340 454 353 341 340 b 101 354 249 340 125 351 b 66 330 75 354 68 341 l 50 10 l 50 7 b 79 -14 50 -12 65 -14 b 111 14 94 -14 95 -1 b 209 62 125 29 160 62 b 357 -125 258 62 357 35 b 235 -304 357 -284 272 -304 b 202 -300 223 -304 212 -304 b 184 -279 194 -295 186 -289 b 202 -259 184 -269 194 -264 b 256 -163 235 -239 256 -203 b 144 -50 256 -99 206 -50 b 30 -157 66 -50 35 -107 b 29 -183 29 -166 29 -174 b 284 -361 29 -302 107 -361 b 552 -125 456 -361 552 -255 b 314 112 552 6 445 112 b 122 71 230 112 168 98 b 115 69 120 69 117 69 b 109 79 109 69 109 75 z', + }, + timeSig6: { + x_min: 20, + x_max: 414, + y_min: -249, + y_max: 251, + ha: 500, + o: 'm 439 120 b 554 229 500 120 554 167 b 553 245 554 235 554 239 b 348 361 539 337 426 361 b 85 209 239 360 137 307 b 29 4 53 148 29 72 l 29 -1 b 73 -200 30 -68 42 -143 b 324 -359 132 -307 203 -359 b 513 -307 389 -359 461 -348 b 596 -137 563 -266 596 -202 b 379 72 596 -24 490 72 b 248 22 333 72 285 55 b 239 19 245 19 242 19 b 226 53 230 19 226 30 b 346 327 230 320 315 327 b 393 305 374 327 393 320 b 357 251 393 285 366 268 b 347 209 350 238 347 223 b 369 150 347 187 354 166 b 439 120 379 131 420 120 z m 320 3 b 405 -158 366 3 405 -69 b 320 -320 405 -248 366 -320 b 236 -158 274 -320 236 -248 b 320 3 236 -69 274 3 z', + }, + timeSig7: { + x_min: 20, + x_max: 421, + y_min: -250, + y_max: 249, + ha: 499, + o: 'm 606 294 b 582 351 606 333 606 351 b 552 336 580 351 557 346 b 485 236 541 318 521 236 b 262 359 449 236 382 359 b 137 307 179 359 157 325 b 98 281 117 288 108 282 b 60 315 86 281 68 301 b 43 325 58 321 50 325 b 29 308 36 325 29 321 l 29 71 b 45 48 29 71 30 48 b 66 76 56 48 60 60 b 164 196 81 112 99 196 b 374 88 222 196 291 88 b 446 118 415 88 435 109 b 459 124 451 121 456 124 b 469 111 465 124 468 120 b 272 -112 469 71 359 -10 b 173 -315 217 -176 173 -259 b 200 -360 173 -346 173 -360 b 294 -347 226 -360 258 -347 b 412 -360 330 -347 397 -360 b 435 -307 426 -360 435 -348 b 606 288 435 -66 606 140 z', + }, + timeSig8: { + x_min: 20, + x_max: 416, + y_min: -259, + y_max: 259, + ha: 518, + o: 'm 481 52 b 567 204 533 85 567 132 b 317 373 567 351 356 373 b 36 176 150 373 36 297 b 161 -16 36 76 92 23 b 29 -190 86 -52 29 -99 b 301 -373 29 -315 158 -373 b 599 -117 445 -373 599 -311 b 481 52 599 -30 549 17 z m 406 85 b 168 240 291 125 168 150 b 314 331 168 301 251 331 b 482 207 360 331 482 308 b 406 85 482 150 454 112 z m 295 -325 b 111 -183 199 -325 111 -276 b 225 -48 111 -125 161 -72 b 436 -219 330 -94 436 -124 b 295 -325 436 -276 392 -325 z', + }, + timeSig9: { + x_min: 20, + x_max: 414, + y_min: -249, + y_max: 251, + ha: 500, + o: 'm 186 -117 b 71 -226 125 -117 71 -164 b 72 -242 71 -232 71 -236 b 276 -359 86 -334 199 -359 b 540 -206 386 -357 488 -304 b 596 -1 572 -145 596 -69 l 596 4 b 552 203 595 71 583 145 b 301 361 492 310 422 361 b 112 310 236 361 164 351 b 29 140 62 269 29 204 b 246 -69 29 27 135 -69 b 377 -19 292 -69 340 -52 b 386 -16 380 -16 383 -16 b 399 -50 395 -16 399 -27 b 279 -324 395 -317 310 -324 b 232 -302 251 -324 232 -317 b 268 -248 232 -282 259 -265 b 278 -206 275 -235 278 -220 b 256 -147 278 -184 271 -163 b 186 -117 246 -128 204 -117 z m 305 0 b 220 161 259 0 220 72 b 305 323 220 251 259 323 b 389 161 351 323 389 251 b 305 0 389 72 351 0 z', + }, + timeSigCommon: { + x_min: 5, + x_max: 424, + y_min: -249, + y_max: 251, + ha: 500, + o: 'm 336 361 b 7 -14 131 361 7 180 b 101 -262 7 -108 42 -190 b 321 -359 156 -328 235 -359 b 611 -88 573 -359 611 -130 b 589 -56 611 -56 595 -56 b 567 -82 577 -56 567 -58 b 363 -311 567 -268 409 -311 b 184 40 246 -311 184 -197 b 372 327 184 278 294 327 b 477 278 446 327 477 292 b 451 246 477 265 472 246 b 360 140 393 246 360 184 b 471 32 360 58 431 32 b 580 156 471 32 580 36 b 336 361 580 344 363 361 z', + }, + timeSigCutCommon: { + x_min: 0, + x_max: 418, + y_min: -359, + y_max: 361, + ha: 720, + o: 'm 573 -58 b 559 -82 567 -58 559 -60 b 354 -310 559 -266 400 -310 b 317 -305 340 -310 328 -308 b 302 -284 311 -304 302 -295 l 302 287 b 338 323 302 297 328 321 b 363 324 347 324 356 324 b 468 275 436 324 468 289 b 442 243 468 264 464 243 b 351 137 384 243 351 181 b 462 30 351 56 422 30 b 572 154 462 30 572 35 b 318 357 572 295 441 357 b 302 390 310 359 302 383 l 302 495 b 276 520 302 507 292 520 b 252 495 265 520 252 507 l 252 369 b 235 346 252 359 238 346 l 196 331 b 0 -14 66 275 0 122 b 225 -346 0 -150 86 -310 b 252 -382 235 -350 252 -369 l 252 -492 b 276 -517 252 -505 265 -517 b 302 -492 292 -517 302 -505 l 302 -379 b 318 -359 302 -370 308 -363 b 602 -85 563 -354 602 -130 b 579 -58 600 -58 586 -58 z m 252 -235 b 243 -252 252 -248 248 -252 b 236 -248 240 -252 238 -251 b 177 37 197 -193 177 -96 b 232 259 177 147 200 215 b 236 262 233 262 235 262 b 252 239 243 262 252 251 z', + }, + timeSigPlus: { + x_min: -1, + x_max: 499, + y_min: -250, + y_max: 250, + ha: 500, + o: 'm 432 53 b 413 79 420 53 413 65 l 413 340 b 392 360 413 350 405 360 l 325 360 b 305 340 312 360 305 350 l 305 79 b 284 53 305 66 292 53 l 19 53 b -1 33 9 53 -1 46 l -1 -33 b 19 -55 -1 -46 9 -55 l 284 -55 b 305 -75 298 -55 305 -68 l 305 -340 b 325 -360 305 -350 312 -360 l 392 -360 b 413 -340 405 -360 413 -350 l 413 -78 b 433 -55 413 -63 423 -55 l 698 -55 b 719 -33 708 -55 719 -46 l 719 33 b 698 53 719 46 708 53 z', + }, + timeSigPlusSmall: { + x_min: -1, + x_max: 255, + y_min: -133, + y_max: 123, + ha: 256, + o: 'm 220 20 b 210 33 215 20 210 26 l 210 166 b 200 177 210 171 206 177 l 166 177 b 156 166 160 177 156 171 l 156 33 b 145 20 156 27 150 20 l 10 20 b -1 10 4 20 -1 16 l -1 -24 b 10 -35 -1 -30 4 -35 l 145 -35 b 156 -46 153 -35 156 -42 l 156 -180 b 166 -192 156 -186 160 -192 l 200 -192 b 210 -180 206 -192 210 -186 l 210 -48 b 222 -35 210 -39 216 -35 l 356 -35 b 367 -24 361 -35 367 -30 l 367 10 b 356 20 367 16 361 20 z', + }, + timeSigMinus: { + x_min: 0, + x_max: 448, + y_min: -35, + y_max: 40, + ha: 75, + o: 'm 645 39 b 619 58 645 49 634 58 l 27 58 b 0 39 12 58 0 49 l 0 -32 b 27 -50 0 -42 12 -50 l 619 -50 b 645 -32 634 -50 645 -42 z', + }, + timeSigParensRight: { + x_min: 0, + x_max: 184, + y_min: -489, + y_max: 491, + ha: 980, + o: 'm 0 -696 b 3 -704 0 -698 1 -704 b 7 -703 4 -704 6 -704 b 265 1 187 -530 265 -282 b 12 701 265 289 187 531 b 4 707 12 701 6 707 b 0 696 1 707 0 703 l 0 665 b 4 644 0 665 0 651 b 167 1 112 503 167 315 b 6 -641 167 -311 109 -497 b 0 -658 3 -644 0 -651 z', + }, + timeSigParensRightSmall: { + x_min: 0, + x_max: 110, + y_min: -251, + y_max: 249, + ha: 500, + o: 'm 0 -356 b 3 -361 0 -357 1 -361 b 158 0 112 -272 158 -145 b 4 359 158 147 109 272 b 0 353 3 359 0 357 l 0 338 b 3 327 0 338 0 330 b 91 0 60 246 91 160 b 4 -328 91 -160 62 -249 b 0 -337 3 -330 0 -333 z', + }, + timeSigParensLeft: { + x_min: 0, + x_max: 184, + y_min: -489, + y_max: 491, + ha: 980, + o: 'm 265 -658 b 259 -641 265 -651 262 -644 b 98 1 156 -497 98 -311 b 261 644 98 315 153 503 b 265 665 265 651 265 665 l 265 696 b 261 707 265 703 264 707 b 253 701 259 707 253 701 b 0 1 78 531 0 289 b 258 -703 0 -282 78 -530 b 262 -704 259 -704 261 -704 b 265 -696 264 -704 265 -698 z', + }, + timeSigParensLeftSmall: { + x_min: 0, + x_max: 110, + y_min: -251, + y_max: 249, + ha: 500, + o: 'm 158 -337 b 154 -328 158 -333 156 -330 b 68 0 96 -249 68 -160 b 156 327 68 160 98 246 b 158 338 158 330 158 338 l 158 353 b 154 359 158 357 156 359 b 0 0 49 272 0 147 b 156 -361 0 -145 46 -272 b 158 -356 157 -361 158 -357 z', + }, + noteheadDoubleWhole: { + x_min: 0, + x_max: 599, + y_min: -155, + y_max: 155, + ha: 310, + o: 'm 13 223 b 0 212 4 223 0 217 l 0 -213 b 13 -223 0 -219 4 -223 l 32 -223 b 45 -213 39 -223 45 -219 l 45 212 b 32 223 45 217 39 223 z m 96 223 b 82 212 88 223 82 217 l 82 -213 b 96 -223 82 -219 88 -223 l 114 -223 b 128 -213 121 -223 128 -219 l 128 212 b 114 223 128 217 121 223 z m 747 223 b 733 212 740 223 733 217 l 733 -213 b 747 -223 733 -219 740 -223 l 766 -223 b 780 -213 773 -223 780 -219 l 780 212 b 766 223 780 217 773 223 z m 829 223 b 815 212 824 223 815 217 l 815 -213 b 829 -223 815 -219 824 -223 l 848 -223 b 863 -213 857 -223 863 -219 l 863 212 b 848 223 863 217 857 223 z m 438 180 b 130 1 248 180 130 101 b 423 -180 130 -92 210 -180 b 733 1 657 -180 733 -98 b 438 180 733 104 572 180 z m 469 -145 b 331 -71 409 -145 369 -112 b 284 58 305 -37 284 12 b 400 147 284 131 333 147 b 577 -45 498 147 577 42 b 469 -145 577 -115 533 -145 z', + }, + noteheadWhole: { + x_min: 0, + x_max: 422, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 311 180 b 0 3 120 180 0 101 b 297 -180 0 -94 82 -180 b 608 3 533 -180 608 -98 b 311 180 608 105 445 180 z m 160 91 b 274 148 176 141 229 148 b 452 -45 373 148 452 42 b 386 -141 452 -89 433 -130 b 341 -147 372 -145 356 -147 b 206 -72 289 -147 236 -112 b 156 56 177 -39 156 10 b 160 91 156 68 157 79 z', + }, + noteheadHalf: { + x_min: 0, + x_max: 295, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 140 -180 b 425 60 377 -180 425 13 b 282 180 425 134 366 180 b 0 -60 68 180 0 14 b 140 -180 0 -137 60 -180 z m 108 -125 b 50 -92 78 -125 60 -109 b 42 -63 46 -84 42 -73 b 318 121 42 7 251 121 b 372 91 346 121 361 108 b 380 63 376 82 380 73 b 108 -125 380 1 177 -125 z', + }, + noteheadBlack: { + x_min: 0, + x_max: 295, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 140 -180 b 425 60 268 -180 425 -62 b 285 180 425 134 367 180 b 0 -60 127 180 0 63 b 140 -180 0 -135 62 -180 z', + }, + noteheadXWhole: { + x_min: 0, + x_max: 377, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 272 -95 l 364 -171 b 384 -180 370 -177 377 -180 l 511 -180 b 543 -148 528 -180 543 -164 b 531 -124 543 -140 539 -131 l 412 0 l 531 124 b 541 148 539 131 541 140 b 513 180 541 164 528 180 l 384 180 b 364 171 377 180 370 177 l 272 94 l 179 171 b 158 180 173 177 166 180 l 30 180 b 0 148 16 180 0 164 b 12 124 0 140 4 131 l 132 0 l 12 -124 b 1 -148 4 -131 1 -140 b 32 -180 1 -164 14 -180 l 158 -180 b 179 -171 166 -180 173 -177 z m 386 -141 l 272 -45 l 157 -141 l 88 -141 l 245 0 l 88 141 l 157 141 l 272 45 l 386 141 l 456 141 l 300 0 l 456 -141 z', + }, + noteheadXHalf: { + x_min: 0, + x_max: 334, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 295 180 b 271 170 287 180 278 177 l 209 98 l 115 171 b 95 180 109 177 104 180 l 36 180 b 4 148 19 180 4 164 b 14 124 4 140 7 132 l 140 22 l 7 -127 b 0 -148 3 -131 0 -138 b 32 -180 0 -166 14 -180 l 184 -180 b 209 -170 193 -180 203 -177 l 271 -99 l 363 -171 b 384 -180 370 -176 377 -180 l 445 -180 b 478 -147 461 -180 478 -163 b 465 -125 478 -138 474 -131 l 341 -22 l 474 127 b 481 148 480 131 481 138 b 448 180 481 166 468 180 z m 36 148 l 95 148 l 233 33 l 334 148 l 410 148 l 274 -6 l 445 -148 l 384 -148 l 248 -35 l 147 -148 l 71 -148 l 206 4 z', + }, + noteheadXBlack: { + x_min: 0, + x_max: 290, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 410 -143 l 239 0 l 410 144 b 418 160 415 147 418 154 b 399 180 418 171 408 180 b 389 177 396 180 392 179 l 207 26 l 29 177 b 17 180 26 179 22 180 b 0 161 7 180 0 170 b 7 144 0 156 3 148 l 179 0 l 7 -143 b 0 -158 1 -147 0 -153 b 19 -180 0 -170 7 -180 b 29 -176 23 -180 26 -179 l 207 -24 l 389 -176 b 399 -180 392 -179 396 -180 b 418 -160 410 -180 418 -168 b 410 -143 418 -153 415 -147 z', + }, + noteheadCircleX: { + x_min: 0, + x_max: 249, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 179 180 b 0 0 81 180 0 99 b 179 -180 0 -99 81 -180 b 359 0 278 -180 359 -99 b 179 180 359 99 278 180 z m 261 112 l 180 30 l 98 112 b 179 138 121 128 148 138 b 261 112 210 138 238 128 z m 317 0 b 292 -82 317 -30 308 -59 l 209 1 l 291 84 b 317 0 307 60 317 30 z m 40 0 b 69 84 40 32 50 60 l 151 1 l 68 -84 b 40 0 49 -60 40 -30 z m 95 -111 l 180 -27 l 262 -111 b 179 -138 239 -128 210 -138 b 95 -111 148 -138 120 -128 z', + }, + noteheadTriangleUpWhole: { + x_min: 0, + x_max: 319, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 445 -180 b 459 -166 454 -180 459 -173 b 458 -158 459 -163 458 -160 l 239 173 b 228 180 238 177 233 180 b 216 173 225 180 219 177 l 1 -158 b 0 -166 1 -160 0 -163 b 14 -180 0 -173 6 -180 z m 170 -137 b 145 -96 157 -137 145 -109 b 228 108 145 -17 197 56 b 310 -98 259 55 310 -17 b 288 -137 310 -111 301 -137 z', + }, + noteheadTriangleUpHalf: { + x_min: 0, + x_max: 285, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 215 180 b 202 173 210 180 204 177 l 3 -157 b 0 -166 1 -160 0 -163 b 14 -180 0 -173 7 -180 l 396 -180 b 410 -166 406 -180 410 -173 b 409 -158 410 -163 410 -161 l 228 173 b 215 180 226 174 220 180 z m 246 -138 l 115 -138 l 232 76 l 297 -37 z', + }, + noteheadTriangleUpBlack: { + x_min: 0, + x_max: 293, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 422 -180 l 207 180 l 0 -180 z', + }, + noteheadDiamondWhole: { + x_min: 0, + x_max: 270, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 386 -23 b 389 -16 387 -20 389 -19 b 383 -7 389 -13 386 -9 l 130 179 b 122 180 128 180 125 180 b 115 177 120 180 117 180 l 3 23 b 0 17 1 20 0 19 b 4 7 0 16 3 10 l 258 -179 b 264 -180 261 -179 262 -180 b 272 -176 268 -180 271 -179 z m 66 40 b 62 48 65 42 62 45 l 109 111 b 112 112 109 112 111 112 b 118 111 115 112 117 111 l 320 -37 b 324 -46 323 -39 324 -42 b 275 -111 278 -111 276 -111 b 268 -108 272 -111 271 -109 z', + }, + noteheadDiamondHalf: { + x_min: 0, + x_max: 251, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 359 -7 b 361 0 360 -6 361 -3 b 359 7 361 3 360 4 l 189 177 b 180 180 186 179 183 180 b 174 177 179 180 176 179 l 4 7 b 0 0 1 4 0 3 b 4 -7 0 -3 1 -6 l 174 -177 b 180 -180 176 -180 179 -180 b 189 -177 183 -180 186 -180 z m 266 26 b 138 -71 266 -12 176 -71 b 96 -50 121 -71 108 -63 b 88 -24 89 -43 88 -32 b 215 73 88 13 177 73 b 266 26 238 73 266 50 z', + }, + noteheadDiamondBlack: { + x_min: 0, + x_max: 250, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 357 -6 b 360 1 359 -4 360 -1 b 357 9 360 4 359 7 l 189 177 b 180 180 187 179 184 180 b 171 177 177 180 173 179 l 3 9 b 0 1 0 6 0 4 b 4 -7 0 -1 1 -4 l 173 -177 b 180 -180 176 -180 177 -180 b 187 -177 181 -180 184 -180 z', + }, + noteheadSquareWhite: { + x_min: 0, + x_max: 313, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 451 -180 l 451 180 l 0 180 l 0 -180 z m 40 -138 l 40 140 l 410 140 l 410 -138 z', + }, + noteheadSquareBlack: { + x_min: 0, + x_max: 313, + y_min: -125, + y_max: 125, + ha: 250, + o: 'm 451 -180 l 451 180 l 0 180 l 0 -180 z', + }, + noteheadParenthesis: { + x_min: -73, + x_max: 368, + y_min: -180, + y_max: 182, + ha: 362, + o: 'm 52 -249 b -30 -144 3 -212 -14 -190 b -52 4 -45 -102 -52 -56 b 52 252 -52 118 -36 179 l 46 262 b -105 3 -49 197 -105 124 b 45 -259 -105 -109 -48 -200 z m 382 -259 b 530 3 474 -202 530 -108 b 379 262 530 122 474 200 l 373 252 b 478 4 462 180 478 118 b 456 -144 478 -56 471 -102 b 373 -249 439 -190 422 -212 z', + }, + noteheadParenthesisRight: { + x_min: -36, + x_max: 73, + y_min: -181, + y_max: 181, + ha: 362, + o: 'm -43 -261 b 105 1 49 -203 105 -109 b -46 261 105 121 49 199 l -52 251 b 53 3 37 179 53 117 b 32 -145 53 -58 46 -104 b -52 -251 14 -192 -3 -213 z', + }, + noteheadParenthesisLeft: { + x_min: 0, + x_max: 109, + y_min: -181, + y_max: 181, + ha: 362, + o: 'm 157 -251 b 75 -145 108 -213 91 -192 b 53 3 60 -104 53 -58 b 157 251 53 117 69 177 l 151 261 b 0 1 56 196 0 122 b 150 -261 0 -111 58 -202 z', + }, + augmentationDot: { + x_min: 0, + x_max: 100, + y_min: -50, + y_max: 50, + ha: 100, + o: 'm 144 0 b 72 72 144 40 112 72 b 0 0 32 72 0 40 b 72 -72 0 -40 32 -72 b 144 0 112 -72 144 -40 z', + }, + tremolo1: { + x_min: -150, + x_max: 150, + y_min: -93, + y_max: 94, + ha: 187, + o: 'm 216 -45 l 216 135 l -216 46 l -216 -134 z', + }, + flag8thUp: { + x_min: 0, + x_max: 264, + y_min: -810.1921176545985, + y_max: 9, + ha: 819.1921176545985, + o: 'm 343 -1138 b 380 -888 343 -1138 380 -1001 b 215 -395 380 -708 305 -539 b 58 -19 141 -281 81 -157 b 27 13 53 4 42 13 b 0 -9 12 13 0 9 l 0 -353 b 284 -688 95 -370 232 -566 b 318 -904 305 -737 318 -819 b 284 -1102 318 -969 308 -1037 b 279 -1123 281 -1110 279 -1117 b 302 -1165 279 -1146 294 -1159 b 343 -1138 311 -1171 336 -1162 z', + }, + flag8thDown: { + x_min: 0, + x_max: 306, + y_min: -14, + y_max: 808, + ha: 822, + o: 'm 346 1094 b 376 897 366 1034 376 962 b 318 642 376 812 340 691 b 0 340 265 521 193 405 l 0 1 b 23 -20 0 -13 12 -20 b 58 12 36 -20 55 -12 b 262 387 82 148 189 274 b 441 881 353 530 441 701 b 400 1142 441 994 412 1096 b 377 1164 396 1158 387 1164 b 346 1094 356 1164 331 1136 z', + }, + flag16thUp: { + x_min: 0, + x_max: 279, + y_min: -813, + y_max: 2, + ha: 815, + o: 'm 392 -1146 b 402 -988 397 -1139 402 -1057 l 402 -956 b 360 -783 402 -896 386 -837 b 359 -770 360 -779 359 -776 b 360 -760 359 -768 359 -765 b 396 -577 364 -752 396 -665 b 392 -526 396 -559 395 -543 b 236 -275 377 -428 340 -387 b 53 -16 158 -192 78 -168 b 24 3 50 0 33 3 b 0 -12 16 3 0 -1 l 0 -570 l 7 -570 b 298 -778 96 -573 199 -576 b 344 -992 331 -847 344 -917 b 333 -1120 344 -1034 340 -1077 b 331 -1133 331 -1126 331 -1129 b 363 -1171 331 -1152 343 -1171 b 392 -1146 373 -1171 383 -1165 z m 301 -661 b 223 -562 278 -625 253 -596 b 59 -331 156 -484 89 -449 b 58 -327 58 -330 58 -328 b 78 -312 58 -321 66 -312 l 89 -312 b 302 -464 177 -312 255 -393 b 341 -592 328 -501 341 -546 b 340 -621 341 -602 341 -611 b 330 -658 337 -632 337 -647 b 311 -667 328 -662 318 -667 b 301 -661 307 -667 304 -665 z', + }, + flag16thDown: { + x_min: 0, + x_max: 290.8951581511223, + y_min: -9, + y_max: 812.0064, + ha: 821.0064, + o: 'm 346 1132 b 312 768 367 1011 367 880 b 7 559 213 566 96 562 l 0 559 l 0 1 b 24 -13 0 -6 10 -13 b 53 6 35 -13 50 -10 b 406 516 88 228 372 289 b 410 567 409 531 410 549 b 374 750 410 655 379 742 b 373 760 373 753 373 756 b 374 773 373 766 374 769 b 405 1138 426 881 428 1022 b 370 1169 397 1171 387 1169 b 346 1132 353 1168 341 1156 z m 325 657 b 344 647 333 657 343 652 b 354 611 351 636 351 622 b 356 582 356 600 356 590 b 317 454 356 534 343 491 b 89 302 269 383 177 302 l 78 302 b 58 317 66 302 58 310 b 59 321 58 318 58 320 b 238 552 89 439 170 472 b 315 651 268 585 292 613 b 325 657 318 655 321 657 z', + }, + flag32ndUp: { + x_min: 0, + x_max: 261, + y_min: -812, + y_max: 149, + ha: 961, + o: 'm 374 -969 b 337 -806 372 -913 359 -858 b 336 -796 336 -804 336 -801 b 337 -788 336 -793 336 -791 b 370 -616 340 -778 370 -698 b 340 -482 370 -570 360 -524 b 369 -330 353 -445 369 -386 b 366 -289 369 -315 369 -302 b 220 -58 350 -202 317 -163 b 46 187 148 20 71 43 b 20 215 45 200 35 215 b 0 197 12 215 0 207 l 0 -609 l 7 -609 b 278 -802 91 -612 186 -615 b 323 -999 310 -865 323 -930 b 311 -1122 323 -1040 318 -1080 b 310 -1132 311 -1126 310 -1129 b 328 -1166 310 -1149 318 -1162 b 337 -1169 331 -1168 334 -1169 b 366 -1146 346 -1169 356 -1162 b 376 -1009 370 -1138 376 -1071 b 374 -969 376 -995 374 -982 z m 300 -261 b 321 -330 315 -289 321 -311 b 317 -360 321 -341 318 -350 b 300 -423 314 -374 307 -399 b 220 -334 279 -397 253 -370 b 56 -92 150 -256 79 -232 b 300 -261 135 -92 220 -127 z m 315 -657 b 308 -690 312 -668 312 -680 b 292 -698 307 -694 300 -698 b 282 -693 288 -698 284 -697 b 216 -608 261 -661 240 -636 l 209 -600 b 56 -390 147 -527 88 -495 b 73 -367 53 -380 60 -367 b 318 -622 189 -367 318 -505 b 315 -657 318 -634 317 -645 z', + }, + flag32ndDown: { + x_min: 0, + x_max: 273, + y_min: -172, + y_max: 812, + ha: 984, + o: 'm 393 973 b 333 1169 393 1002 383 1169 b 324 1168 330 1169 327 1169 b 304 1130 314 1164 304 1149 b 305 1120 304 1128 305 1125 b 334 962 317 1056 334 1011 b 289 821 334 922 323 880 b 0 619 180 625 88 622 l 0 -229 b 20 -248 0 -242 9 -248 b 48 -219 35 -248 46 -232 b 229 36 72 -69 154 -46 b 380 278 330 145 364 186 b 383 320 383 291 383 305 b 351 484 383 382 364 445 b 384 629 374 526 384 580 b 356 780 384 704 361 766 b 356 783 356 782 356 783 l 351 791 b 356 804 351 796 353 799 l 361 814 b 393 958 380 850 387 865 z m 56 386 b 217 609 86 501 153 533 b 292 706 246 642 269 670 b 304 711 295 710 300 711 b 321 703 311 711 320 707 b 328 670 325 693 325 681 b 331 634 330 658 331 645 b 82 367 331 516 199 367 l 75 367 b 56 386 62 367 56 379 z m 330 350 b 334 320 331 340 334 331 b 311 248 334 301 328 278 b 59 72 229 109 141 72 b 56 76 56 73 56 75 b 229 331 81 226 154 249 b 310 423 264 369 289 397 b 330 350 318 396 325 366 z', + }, + flag64thUp: { + x_min: 0, + x_max: 261, + y_min: -812, + y_max: 347, + ha: 1159, + o: 'm 374 -969 b 337 -806 372 -913 359 -858 b 336 -796 336 -804 336 -801 b 337 -788 336 -793 336 -791 b 370 -616 340 -778 370 -698 b 340 -482 370 -570 360 -524 b 369 -330 353 -445 369 -386 b 337 -203 369 -287 359 -242 b 369 -43 350 -167 369 -104 b 366 -4 369 -30 367 -17 b 220 228 350 84 317 122 b 46 472 148 305 71 328 b 20 500 45 485 32 500 b 0 482 10 500 0 492 l 0 -609 l 7 -609 b 278 -802 91 -612 186 -615 b 323 -999 310 -865 323 -930 b 311 -1122 323 -1040 318 -1080 b 310 -1132 311 -1126 310 -1129 b 328 -1166 310 -1149 318 -1162 b 337 -1169 331 -1168 334 -1169 b 366 -1146 346 -1169 356 -1162 b 376 -1009 370 -1138 376 -1071 b 374 -969 376 -995 374 -982 z m 300 24 b 321 -45 315 -4 321 -26 b 317 -75 321 -56 318 -65 l 298 -145 b 220 -58 278 -121 253 -94 b 58 187 148 20 82 43 b 56 193 58 189 58 192 b 300 24 138 193 220 157 z m 300 -261 b 321 -330 315 -289 321 -311 b 317 -360 321 -341 318 -350 b 300 -423 314 -374 307 -399 b 220 -334 279 -397 253 -370 b 56 -92 150 -256 79 -232 b 300 -261 135 -92 220 -127 z m 315 -657 b 308 -690 312 -668 312 -680 b 292 -698 307 -694 300 -698 b 282 -693 288 -698 284 -697 b 216 -608 261 -661 240 -636 l 209 -600 b 55 -386 147 -527 84 -497 b 73 -367 52 -376 63 -367 b 318 -622 189 -367 318 -505 b 315 -657 318 -634 317 -645 z', + }, + flag64thDown: { + x_min: 0, + x_max: 273, + y_min: -376, + y_max: 812, + ha: 1188, + o: 'm 393 973 b 333 1169 393 1002 383 1169 b 324 1168 330 1169 327 1169 b 304 1130 314 1164 304 1149 b 305 1120 304 1128 305 1125 b 334 962 317 1056 334 1011 b 289 821 334 922 323 880 b 0 619 180 625 88 622 l 0 -523 b 20 -541 0 -534 9 -541 b 48 -513 35 -541 46 -526 b 229 -258 72 -363 154 -340 b 380 -16 330 -148 364 -108 b 384 27 383 -1 384 13 b 351 189 384 88 366 151 b 380 278 366 216 374 243 b 383 320 383 291 383 305 b 351 484 383 382 364 445 b 384 629 374 526 384 580 b 356 780 384 704 361 766 b 356 783 356 782 356 783 l 351 791 b 356 804 351 796 353 799 l 361 814 b 393 958 380 850 387 865 z m 56 386 b 217 609 86 501 153 533 b 292 706 246 642 269 670 b 304 711 295 710 300 711 b 321 703 311 711 320 707 b 328 670 325 693 325 681 b 331 634 330 658 331 645 b 82 367 331 516 199 367 l 75 367 b 56 386 62 367 56 379 z m 330 350 b 334 320 331 340 334 331 b 311 248 334 301 328 278 b 59 72 229 109 141 72 b 56 76 56 73 56 75 b 229 331 81 226 154 249 b 310 423 264 369 289 397 b 330 350 318 396 325 366 z m 330 56 b 334 26 331 46 334 37 b 311 -46 334 7 328 -16 b 56 -222 229 -184 137 -222 b 229 36 75 -86 145 -55 b 311 128 264 73 289 102 z', + }, + flag128thUp: { + x_min: 0, + x_max: 261, + y_min: -812, + y_max: 533, + ha: 1345, + o: 'm 374 -969 b 337 -806 372 -913 359 -858 b 336 -796 336 -804 336 -801 b 337 -788 336 -793 336 -791 b 370 -616 340 -778 370 -698 b 340 -482 370 -570 360 -524 b 369 -330 353 -445 369 -386 b 337 -203 369 -287 359 -242 b 369 -43 350 -167 369 -104 b 366 -4 369 -30 367 -17 b 341 75 360 26 353 50 b 369 222 354 111 369 167 b 366 264 369 236 369 251 b 220 495 350 351 317 390 b 46 740 148 573 71 596 b 22 768 45 753 35 768 b 0 750 10 768 0 760 l 0 -609 l 7 -609 b 278 -802 91 -612 186 -615 b 323 -999 310 -865 323 -930 b 311 -1122 323 -1040 318 -1080 b 310 -1132 311 -1126 310 -1129 b 328 -1166 310 -1149 318 -1162 b 337 -1169 331 -1168 334 -1169 b 366 -1146 346 -1169 356 -1162 b 376 -1009 370 -1138 376 -1071 b 374 -969 376 -995 374 -982 z m 300 292 b 321 223 315 264 321 242 b 317 193 321 212 318 203 b 301 135 314 180 308 158 b 220 228 281 161 255 190 b 55 461 151 304 79 327 b 300 292 134 461 220 426 z m 300 24 b 321 -45 315 -4 321 -26 b 317 -75 321 -56 318 -65 l 298 -145 b 220 -58 278 -121 253 -94 b 56 187 148 20 81 43 b 55 193 56 189 56 192 b 300 24 137 193 220 157 z m 300 -261 b 321 -330 315 -289 321 -311 b 317 -360 321 -341 318 -350 b 300 -423 314 -374 307 -399 b 220 -334 279 -397 253 -370 b 56 -92 150 -256 79 -232 b 300 -261 135 -92 220 -127 z m 315 -657 b 308 -690 312 -668 312 -680 b 292 -698 307 -694 300 -698 b 282 -693 288 -698 284 -697 b 216 -608 261 -661 240 -636 l 209 -600 b 55 -386 147 -527 84 -497 b 73 -367 53 -376 62 -367 b 318 -622 189 -367 318 -505 b 315 -657 318 -634 317 -645 z', + }, + flag128thDown: { + x_min: 0, + x_max: 273, + y_min: -580, + y_max: 812, + ha: 1392, + o: 'm 393 973 b 333 1169 393 1002 383 1169 b 324 1168 330 1169 327 1169 b 304 1130 314 1164 304 1149 b 305 1120 304 1128 305 1125 b 334 962 317 1056 334 1011 b 289 821 334 922 323 880 b 0 619 180 625 88 622 l 0 -816 b 20 -835 0 -828 7 -835 b 48 -806 33 -835 46 -819 b 229 -552 72 -657 154 -634 b 380 -310 330 -442 364 -402 b 384 -266 383 -295 384 -281 b 351 -105 384 -206 366 -143 b 384 27 372 -66 384 -16 b 351 189 384 88 366 151 b 380 278 366 216 374 243 b 383 320 383 291 383 305 b 351 484 383 382 364 445 b 384 629 374 526 384 580 b 356 780 384 704 361 766 b 356 783 356 782 356 783 l 351 791 b 356 804 351 796 353 799 l 361 814 b 393 958 380 850 387 865 z m 56 386 b 217 609 86 501 153 533 b 292 706 246 642 269 670 b 304 711 295 710 300 711 b 321 703 311 711 320 707 b 328 670 325 693 325 681 b 331 634 330 658 331 645 b 82 367 331 516 199 367 l 75 367 b 56 386 62 367 56 379 z m 330 350 b 334 320 331 340 334 331 b 311 248 334 301 328 278 b 59 72 229 109 141 72 b 56 76 56 73 56 75 b 229 331 81 226 154 249 b 310 423 264 369 289 397 b 330 350 318 396 325 366 z m 330 56 b 334 26 331 46 334 37 b 311 -46 334 7 328 -16 b 56 -222 229 -184 137 -222 b 229 36 75 -86 145 -55 b 311 128 264 73 289 102 z m 330 -238 b 334 -268 331 -248 334 -256 b 311 -340 334 -287 328 -310 b 56 -516 229 -478 137 -516 b 229 -258 75 -380 145 -348 b 311 -166 264 -220 289 -192 z', + }, + accidentalFlat: { + x_min: 0, + x_max: 226, + y_min: -175, + y_max: 439, + ha: 614, + o: 'm 17 -245 b 30 -252 22 -251 26 -252 b 39 -249 35 -252 39 -249 b 153 -161 82 -225 117 -186 b 325 82 281 -72 325 16 b 196 220 325 164 262 216 b 117 196 171 220 137 209 b 85 176 108 189 92 176 b 78 177 82 176 81 176 b 62 202 68 181 62 192 b 72 608 63 233 72 579 b 45 632 72 624 59 632 b 0 592 24 632 1 618 b 17 -245 0 592 6 -230 z m 68 -117 b 63 27 68 -117 63 -30 b 66 73 63 50 65 68 b 167 144 76 102 134 144 b 226 60 209 144 226 96 b 98 -134 226 -17 160 -95 b 84 -138 92 -137 88 -138 b 68 -117 71 -138 68 -124 z', + }, + accidentalNatural: { + x_min: 0, + x_max: 168, + y_min: -335, + y_max: 341, + ha: 676, + o: 'm 203 261 b 197 259 200 261 199 259 b 68 226 197 259 105 226 b 53 233 59 226 53 228 l 53 474 b 36 491 53 484 45 491 l 17 491 b 0 474 7 491 0 484 l 0 -268 b 13 -281 0 -276 4 -281 l 16 -279 b 22 -278 17 -279 20 -279 b 164 -235 42 -269 122 -235 b 189 -251 179 -235 189 -239 l 189 -465 b 206 -482 189 -475 196 -482 l 225 -482 b 242 -465 233 -482 242 -475 l 242 258 b 230 269 242 265 236 269 b 225 268 229 269 226 269 z m 53 56 b 176 114 53 76 141 114 b 189 107 184 114 189 112 l 189 -42 b 71 -101 189 -68 107 -101 b 53 -92 60 -101 53 -98 z', + }, + accidentalSharp: { + x_min: 0, + x_max: 249, + y_min: -348, + y_max: 350, + ha: 698, + o: 'm 341 170 b 359 194 351 174 359 186 l 359 297 b 348 308 359 304 354 308 b 341 307 346 308 344 308 b 305 294 341 307 312 295 b 285 312 295 294 285 301 l 285 488 b 265 504 285 497 276 504 b 242 488 251 504 242 497 l 242 301 b 223 259 240 287 236 268 b 132 223 206 249 157 229 b 115 252 120 223 115 240 l 115 425 b 95 441 115 433 105 441 b 72 425 81 441 72 433 l 72 230 b 55 192 72 210 63 196 b 17 176 46 187 17 176 b 0 153 7 173 0 161 l 0 50 b 13 37 0 42 4 37 l 16 39 b 50 53 17 39 39 48 l 52 55 b 72 29 63 55 72 40 l 72 -114 b 56 -147 72 -130 65 -143 b 17 -163 48 -150 17 -163 b 0 -186 7 -166 0 -177 l 0 -288 b 13 -301 0 -297 4 -301 l 16 -300 b 50 -287 17 -300 37 -291 b 55 -285 52 -285 53 -285 b 72 -308 65 -285 72 -301 l 72 -485 b 91 -501 72 -494 81 -501 b 115 -485 105 -501 115 -494 l 115 -285 b 130 -253 115 -266 122 -256 l 217 -217 b 219 -217 217 -217 219 -217 l 222 -216 b 242 -242 235 -216 242 -233 l 242 -422 b 261 -438 242 -431 251 -438 b 285 -422 276 -438 285 -431 l 285 -217 b 301 -184 285 -206 291 -189 b 341 -168 311 -180 341 -168 b 359 -144 351 -164 359 -153 l 359 -42 b 348 -30 359 -35 354 -30 b 341 -32 346 -30 344 -30 l 304 -46 b 285 -20 295 -46 285 -37 l 285 114 b 304 156 285 124 292 151 z m 242 -65 b 132 -122 233 -94 166 -122 b 115 -115 124 -122 117 -120 b 111 -43 112 -109 111 -78 b 115 63 111 1 112 52 b 220 118 118 88 184 118 b 242 109 230 118 239 115 b 248 27 245 102 248 66 b 242 -65 248 -12 245 -52 z', + }, + accidentalDoubleSharp: { + x_min: 0, + x_max: 247, + y_min: -125, + y_max: 127, + ha: 252, + o: 'm 274 -46 b 206 1 258 -37 206 -9 b 274 50 206 22 253 43 b 278 50 275 50 276 50 l 287 49 b 346 63 304 49 331 52 b 356 115 353 71 356 92 b 292 183 356 174 351 183 b 233 173 266 183 240 180 b 226 117 228 168 226 143 b 179 49 219 101 196 49 b 130 117 158 49 135 96 b 118 173 130 141 125 167 b 66 183 112 180 89 183 b 7 173 42 183 16 180 b 0 120 3 170 0 145 b 7 63 0 94 3 68 b 68 49 17 55 43 49 b 82 50 73 49 78 50 b 150 3 98 42 150 13 b 84 -46 150 -16 104 -39 l 69 -46 b 7 -56 43 -46 16 -49 b 0 -111 3 -60 0 -85 b 7 -166 0 -137 3 -163 b 65 -180 17 -174 40 -180 b 118 -166 86 -180 109 -176 b 130 -111 127 -158 130 -134 b 132 -105 130 -109 131 -107 b 177 -45 141 -85 158 -45 b 226 -111 196 -45 220 -91 b 233 -166 226 -137 228 -161 b 291 -180 243 -174 266 -180 b 356 -114 346 -180 356 -166 b 346 -56 356 -89 351 -63 b 288 -46 338 -49 312 -46 z', + }, + accidentalDoubleFlat: { + x_min: 0, + x_max: 411, + y_min: -175, + y_max: 437, + ha: 612, + o: 'm 452 217 b 384 194 426 217 408 207 b 350 176 374 189 363 176 b 343 177 347 176 344 176 b 328 202 333 180 328 190 b 337 606 328 232 337 579 b 310 629 337 622 324 629 b 265 592 291 629 268 616 b 269 194 265 592 266 395 b 196 217 248 209 223 217 l 187 217 b 120 194 160 217 143 207 b 85 176 108 189 98 176 b 78 177 82 176 81 176 b 62 202 68 180 62 190 b 72 606 62 232 72 579 b 45 629 72 622 59 629 b 0 592 24 629 1 616 b 17 -245 0 592 7 -232 b 30 -252 22 -251 26 -252 b 39 -249 35 -252 39 -249 b 153 -161 84 -226 120 -186 b 274 -50 206 -124 246 -85 b 284 -245 276 -158 279 -240 b 295 -252 288 -251 292 -252 b 304 -249 300 -252 304 -249 b 416 -163 348 -226 383 -186 b 592 82 546 -72 592 16 b 461 217 592 163 528 216 z m 96 -134 b 84 -138 92 -137 86 -138 b 68 -115 72 -138 68 -124 b 63 26 68 -115 63 -30 b 66 72 63 49 65 66 b 168 144 75 101 134 144 b 226 59 212 144 226 95 b 96 -134 226 -22 161 -94 z m 361 -134 b 348 -138 356 -137 351 -138 b 333 -115 337 -138 333 -124 b 328 39 333 -115 328 -16 b 330 72 328 55 328 68 b 433 144 338 101 399 144 b 468 130 448 144 459 140 b 490 59 481 112 490 88 b 361 -134 490 -22 426 -94 z', + }, + accidentalParensLeft: { + x_min: 0, + x_max: 141, + y_min: -248, + y_max: 247, + ha: 495, + o: 'm 203 331 l 203 351 b 202 356 203 354 203 356 b 0 0 60 281 0 140 b 199 -357 0 -144 60 -269 b 203 -354 200 -357 203 -356 l 203 -333 b 200 -327 203 -330 202 -328 b 86 0 118 -253 86 -160 b 200 324 86 158 120 251 b 203 331 202 325 203 327 z', + }, + accidentalParensRight: { + x_min: 0, + x_max: 141, + y_min: -248, + y_max: 247, + ha: 495, + o: 'm 0 331 b 3 324 0 327 1 325 b 117 0 84 251 117 158 b 3 -327 117 -160 85 -253 b 0 -333 1 -328 0 -330 l 0 -354 b 4 -357 0 -356 3 -357 b 203 0 143 -269 203 -144 b 1 356 203 140 143 281 b 0 351 0 356 0 354 z', + }, + accidentalQuarterToneFlatStein: { + x_min: 1, + x_max: 227, + y_min: -175, + y_max: 439, + ha: 614, + o: 'm 310 -245 b 327 592 321 -230 327 592 b 282 632 325 618 302 632 b 255 608 268 632 255 624 b 265 202 255 579 264 233 b 249 177 265 192 259 181 b 242 176 246 176 245 176 b 210 196 235 176 219 189 b 131 220 190 209 156 220 b 1 85 65 216 1 164 b 174 -161 1 16 46 -72 b 288 -249 210 -186 245 -225 b 297 -252 288 -249 292 -252 b 310 -245 301 -252 305 -251 z m 259 -117 b 243 -138 259 -124 256 -138 b 229 -134 239 -138 235 -137 b 101 60 167 -95 101 -17 b 160 144 101 96 118 144 b 261 73 193 144 251 102 b 264 27 262 68 264 50 b 259 -117 264 -30 259 -117 z', + }, + accidentalThreeQuarterTonesFlatZimmermann: { + x_min: 1, + x_max: 466, + y_min: -175, + y_max: 439, + ha: 614, + o: 'm 363 -245 b 376 -252 367 -251 372 -252 b 384 -249 380 -252 384 -249 b 497 -161 428 -226 464 -186 b 671 84 625 -72 671 16 b 541 220 671 164 606 217 b 513 217 531 220 523 219 b 464 196 495 212 480 206 b 431 176 452 189 442 176 b 423 177 428 176 426 176 b 408 202 413 180 408 190 l 419 608 b 392 632 419 625 406 632 b 346 592 372 632 347 618 b 363 -245 346 592 351 -230 z m 289 -249 b 297 -252 289 -249 292 -252 b 310 -245 300 -252 305 -251 b 328 592 321 -230 328 592 b 282 631 327 618 302 631 b 255 608 268 631 255 624 l 266 202 b 251 177 266 190 261 180 b 243 176 248 176 246 176 b 210 196 232 176 222 189 b 164 216 196 204 180 210 l 163 217 b 132 220 151 219 143 220 b 1 84 65 217 1 163 b 177 -163 1 16 48 -72 b 289 -249 210 -186 245 -226 z m 262 72 b 265 26 264 66 265 49 b 261 -115 265 -30 261 -115 b 245 -138 261 -124 258 -138 b 230 -134 240 -138 236 -137 b 102 60 166 -92 102 -20 b 124 128 102 88 111 112 b 161 144 134 138 147 144 b 199 134 173 144 184 141 b 262 72 219 122 256 92 z m 413 -115 b 409 26 413 -115 409 -30 b 412 72 409 49 410 66 b 514 144 420 102 480 144 b 570 60 557 144 570 96 b 442 -134 570 -23 508 -91 b 429 -138 436 -137 433 -138 b 413 -115 418 -138 413 -124 z', + }, + accidentalQuarterToneSharpStein: { + x_min: 0, + x_max: 179, + y_min: -353, + y_max: 307, + ha: 660, + o: 'm 258 240 b 246 252 258 248 252 252 b 240 251 245 252 242 252 b 168 225 240 251 171 225 b 150 253 156 225 150 240 l 150 426 b 130 442 150 435 141 442 b 105 418 108 442 105 429 l 105 230 b 91 193 105 219 101 202 b 17 161 65 183 42 171 b 0 138 9 158 0 147 l 0 36 b 13 23 0 27 4 23 l 16 24 b 86 53 17 24 73 49 l 88 55 b 107 30 98 55 107 42 l 107 -114 b 92 -145 107 -130 101 -143 l 17 -177 b 0 -200 9 -180 0 -192 l 0 -302 b 13 -315 0 -311 4 -315 l 16 -314 b 85 -285 17 -314 72 -291 b 105 -312 92 -282 105 -301 l 105 -492 b 125 -508 105 -501 114 -508 b 150 -484 147 -508 150 -498 l 150 -285 b 151 -274 150 -281 150 -278 b 164 -253 153 -265 158 -256 b 240 -225 176 -251 240 -225 b 258 -202 249 -222 258 -210 l 258 -99 b 245 -86 258 -91 253 -86 l 242 -88 b 240 -88 242 -88 240 -88 l 240 -86 b 168 -115 240 -86 174 -114 b 148 -91 158 -115 148 -107 l 148 43 b 167 85 148 55 156 81 b 240 114 180 91 240 114 b 258 138 249 118 258 128 z', + }, + accidentalThreeQuarterTonesSharpStein: { + x_min: 3, + x_max: 317, + y_min: -347, + y_max: 369, + ha: 716, + o: 'm 456 324 b 448 336 456 330 454 336 b 393 317 445 336 400 320 b 389 315 392 315 390 315 b 383 325 386 315 383 318 l 383 508 b 360 531 383 528 379 531 b 337 508 341 531 337 527 l 337 318 b 325 291 337 300 334 294 b 268 268 320 288 287 276 b 253 281 256 268 253 274 l 253 464 b 230 487 253 484 249 487 b 207 464 212 487 207 482 l 207 264 b 194 240 207 253 204 245 l 132 217 b 131 217 132 217 132 217 l 130 216 b 118 229 122 216 118 220 l 118 420 b 95 444 118 439 114 444 b 72 420 76 444 72 439 l 72 212 b 60 190 72 197 68 193 l 16 173 b 4 161 9 170 4 167 l 4 50 b 13 39 4 45 9 39 b 58 55 16 39 46 49 b 63 56 60 56 62 56 b 72 42 71 56 72 50 l 72 -125 b 58 -150 72 -137 65 -147 l 16 -166 b 4 -177 9 -168 4 -171 l 4 -289 b 14 -301 4 -295 9 -301 b 53 -287 16 -301 40 -291 b 62 -285 56 -285 59 -285 b 72 -298 69 -285 72 -289 l 72 -477 b 95 -500 72 -495 76 -500 b 118 -477 114 -500 118 -495 l 118 -278 b 127 -259 118 -269 121 -261 l 196 -232 b 207 -243 204 -232 207 -235 l 207 -432 b 230 -455 207 -452 212 -455 b 253 -432 249 -455 253 -451 l 253 -228 b 268 -204 253 -216 259 -207 l 320 -186 b 328 -183 323 -184 325 -183 b 337 -194 334 -183 337 -187 l 337 -387 b 360 -410 337 -408 341 -410 b 383 -387 379 -410 383 -406 l 383 -174 b 395 -157 383 -166 390 -158 l 445 -138 b 456 -127 452 -135 456 -132 l 456 -14 b 448 -3 456 -10 454 -3 b 397 -22 445 -3 408 -17 l 396 -23 b 383 -6 387 -23 383 -16 l 383 163 b 392 181 383 173 384 179 b 445 202 397 183 445 202 b 456 213 452 203 456 207 z m 337 -45 b 266 -78 333 -56 287 -78 b 258 -75 262 -78 259 -76 b 253 19 255 -71 253 -27 b 258 130 253 69 255 122 b 333 163 264 141 315 163 b 337 161 334 163 337 161 b 341 78 340 157 341 120 b 337 -45 341 24 340 -37 z m 118 -127 b 114 -48 114 -121 114 -86 b 118 78 114 6 115 68 b 200 114 122 91 180 114 b 207 111 204 114 206 112 b 212 22 210 107 212 66 b 207 -94 212 -29 210 -85 b 127 -130 203 -108 148 -130 b 118 -127 122 -130 120 -128 z', + }, + accidentalBuyukMucennebFlat: { + x_min: 1, + x_max: 287, + y_min: -174, + y_max: 438, + ha: 612, + o: 'm 379 452 b 370 464 379 458 377 464 b 164 389 366 464 170 392 b 156 396 163 389 156 393 b 157 436 157 409 157 428 b 167 452 157 445 161 449 b 366 526 173 455 366 526 b 379 540 374 528 379 534 l 379 611 b 370 622 379 616 377 622 b 170 550 366 622 174 552 b 160 557 163 550 160 554 b 161 608 160 585 161 602 b 134 631 161 624 148 631 b 89 590 114 631 91 616 l 89 528 b 81 517 89 526 88 518 b 16 491 76 514 16 491 b 1 480 6 490 1 485 l 1 406 b 13 395 1 400 4 395 l 14 396 b 79 419 16 396 72 415 b 89 412 86 419 89 415 b 91 376 89 399 89 386 b 82 359 91 364 89 361 b 16 331 76 356 16 331 b 1 321 6 331 1 328 l 1 248 b 13 236 1 242 4 236 b 79 262 16 236 71 258 b 92 251 89 262 92 256 b 107 -242 95 23 101 -236 b 120 -251 111 -249 115 -251 b 128 -248 124 -251 128 -248 b 240 -160 171 -225 207 -184 b 413 84 367 -71 413 16 b 284 220 413 166 350 216 b 207 196 259 220 229 209 b 170 176 196 190 184 176 l 168 177 b 151 203 157 181 151 192 b 153 269 151 210 151 236 b 163 292 153 275 153 289 b 366 367 173 297 366 367 b 379 383 374 370 379 376 z m 186 -132 b 173 -137 180 -135 176 -137 b 157 -114 161 -137 157 -122 b 153 35 157 -114 153 -22 b 154 73 153 53 153 68 b 219 135 160 92 197 124 b 255 144 232 141 243 144 b 292 130 269 144 282 140 b 314 62 305 114 314 91 b 186 -132 314 -17 251 -94 z', + }, + accidentalBakiyeFlat: { + x_min: -1, + x_max: 286, + y_min: -175, + y_max: 439, + ha: 614, + o: 'm 377 454 b 369 467 377 458 376 467 b 363 465 367 467 364 467 b 161 390 363 465 167 393 b 153 399 154 390 153 395 b 157 608 154 494 157 593 b 130 632 157 624 144 632 b 86 592 111 632 88 618 b 88 377 86 592 86 501 b 76 356 88 373 88 360 l 12 331 b -1 320 3 330 -1 327 l -1 248 b 9 236 -1 242 1 236 b 81 264 12 236 78 261 b 89 258 86 264 89 261 b 104 -245 92 30 96 -236 b 115 -252 108 -251 112 -252 b 124 -249 120 -252 124 -249 b 239 -161 167 -226 203 -186 b 412 84 367 -72 412 17 b 282 220 412 166 348 216 b 255 216 274 220 264 219 b 203 196 238 212 222 206 b 171 177 193 189 177 177 b 163 179 168 177 166 177 b 147 202 153 181 147 192 b 147 216 147 204 147 209 l 150 262 b 150 276 150 269 150 275 b 158 291 150 287 154 289 b 363 370 163 292 363 370 b 377 384 373 373 377 379 z m 181 -134 b 167 -138 176 -137 171 -138 b 153 -117 156 -138 153 -125 b 148 27 153 -117 148 -30 b 151 73 148 50 150 68 b 255 144 161 105 219 144 b 312 62 298 144 312 99 b 181 -134 312 -19 249 -96 z', + }, + accidentalKomaSharp: { + x_min: 0, + x_max: 229, + y_min: -337, + y_max: 322, + ha: 659, + o: 'm 312 151 b 330 176 323 156 330 166 l 330 278 b 320 289 330 285 327 289 b 312 288 318 289 315 289 b 200 246 312 288 203 248 b 181 275 187 246 181 264 l 181 448 b 163 464 181 456 173 464 b 138 441 140 464 138 452 l 138 253 b 122 215 137 240 132 225 b 17 177 92 203 45 177 b 0 153 7 173 0 163 l 0 50 b 10 39 0 43 4 39 b 17 40 13 39 14 39 l 128 81 b 138 52 138 81 138 63 l 138 -91 b 124 -124 138 -107 132 -120 b 17 -167 115 -127 17 -167 b 0 -192 7 -171 0 -181 l 0 -294 b 10 -305 0 -301 4 -305 b 17 -304 13 -305 14 -305 b 128 -261 17 -304 117 -264 l 130 -259 b 138 -276 137 -259 138 -268 l 138 -469 b 157 -485 138 -478 147 -485 b 181 -462 179 -485 181 -475 l 181 -262 b 183 -252 181 -258 181 -255 b 197 -232 186 -243 190 -235 b 312 -187 207 -228 312 -187 b 330 -163 323 -183 330 -173 l 330 -60 b 320 -49 330 -53 327 -49 b 312 -50 318 -49 315 -49 l 200 -94 b 193 -95 197 -95 194 -95 b 181 -68 183 -95 181 -85 l 181 66 b 200 108 181 92 189 104 z', + }, + accidentalKucukMucennebSharp: { + x_min: -1, + x_max: 339, + y_min: -338, + y_max: 321, + ha: 659, + o: 'm 264 92 b 271 102 264 98 265 99 l 395 150 b 412 174 405 154 412 164 l 412 276 b 402 288 412 284 409 288 b 395 287 400 288 397 288 b 282 245 395 287 285 246 b 264 274 269 245 264 262 l 264 446 b 245 462 264 455 255 462 b 220 439 222 462 220 451 l 220 252 b 204 213 219 239 215 223 b 99 176 174 202 127 176 b 82 151 89 171 82 161 l 82 49 b 92 37 82 42 86 37 b 99 39 95 37 96 37 l 210 79 b 216 81 212 81 215 81 b 220 78 219 81 220 79 l 220 56 b 216 46 220 52 220 48 b 16 -29 210 45 16 -29 b -1 -45 4 -32 -1 -36 l -1 -138 b 12 -154 -1 -145 3 -154 l 215 -79 b 220 -84 219 -79 220 -81 l 220 -105 b 210 -122 220 -115 219 -120 b 99 -168 202 -127 99 -168 b 82 -193 89 -173 82 -183 l 82 -295 b 92 -307 82 -302 86 -307 b 99 -305 95 -307 96 -307 b 210 -262 99 -305 199 -265 l 212 -261 b 220 -278 219 -261 220 -269 l 220 -471 b 239 -487 220 -480 229 -487 b 264 -464 261 -487 264 -477 l 264 -264 b 265 -253 264 -259 264 -256 b 279 -233 268 -245 272 -236 b 395 -189 289 -229 395 -189 b 412 -164 405 -184 412 -174 l 412 -62 b 402 -50 412 -55 409 -50 b 395 -52 400 -50 397 -50 l 278 -96 b 264 -86 268 -96 264 -94 l 264 -68 b 269 -59 264 -62 265 -60 b 471 17 274 -58 471 17 b 488 36 484 22 488 27 l 488 127 b 475 144 488 134 487 144 l 472 141 b 471 141 472 141 471 141 l 471 143 b 272 68 471 143 282 71 l 269 66 b 264 71 264 66 264 69 z', + }, + accidentalKoron: { + x_min: 0, + x_max: 300, + y_min: -472, + y_max: 157, + ha: 629, + o: 'm 432 -4 b 415 10 432 1 418 9 l 4 226 b 0 223 1 226 0 225 l 0 -672 b 7 -680 0 -677 3 -680 l 45 -680 b 52 -672 49 -680 52 -677 l 52 -193 l 415 -22 b 432 -4 418 -20 432 -13 z m 52 -137 l 52 144 l 327 -7 z', + }, + accidentalSori: { + x_min: 0, + x_max: 421, + y_min: -318, + y_max: 328, + ha: 646, + o: 'm 606 10 b 589 23 606 16 592 22 l 382 109 l 382 465 b 374 472 382 469 379 472 l 337 472 b 330 465 333 472 330 469 l 330 132 l 183 194 l 183 425 b 176 432 183 429 180 432 l 138 432 b 131 425 134 432 131 429 l 131 216 l 3 269 b 0 265 0 269 0 266 l 0 223 b 3 213 0 216 0 215 l 131 160 l 131 -150 l 3 -203 b 0 -212 0 -204 0 -206 l 0 -255 b 3 -259 0 -258 1 -259 l 131 -204 l 131 -451 b 138 -458 131 -455 134 -458 l 176 -458 b 183 -451 180 -458 183 -455 l 183 -183 l 330 -120 l 330 -410 b 337 -418 330 -415 333 -418 l 374 -418 b 382 -410 379 -418 382 -415 l 382 -98 l 589 -9 b 606 10 592 -9 606 0 z m 183 -128 l 183 138 l 330 76 l 330 -66 z m 382 -45 l 382 55 l 501 6 z', + }, + articAccentAbove: { + x_min: 0, + x_max: 339, + y_min: 1, + y_max: 245, + ha: 244, + o: 'm 469 151 b 488 177 488 156 488 166 b 469 203 488 189 488 197 l 37 350 b 24 353 32 351 26 353 b 3 333 12 353 7 344 b 0 318 1 327 0 323 b 20 298 0 311 4 304 b 346 187 20 298 331 193 b 356 177 353 186 356 181 b 344 167 356 173 353 170 b 20 58 328 163 20 58 b 0 36 4 50 0 43 b 3 23 0 32 1 27 b 23 1 7 13 13 1 b 29 3 24 1 27 1 z', + }, + articAccentBelow: { + x_min: 0, + x_max: 339, + y_min: -244, + y_max: 0, + ha: 244, + o: 'm 469 -202 b 488 -176 488 -197 488 -187 b 469 -150 488 -164 488 -156 l 37 -3 b 24 0 32 -1 26 0 b 3 -20 12 0 7 -9 b 0 -35 1 -26 0 -30 b 20 -55 0 -42 4 -49 b 346 -166 20 -55 331 -160 b 356 -176 353 -167 356 -171 b 344 -186 356 -180 353 -183 b 20 -295 328 -190 20 -295 b 0 -317 4 -302 0 -310 b 3 -330 0 -321 1 -325 b 23 -351 7 -340 13 -351 b 29 -350 24 -351 27 -351 z', + }, + articTenutoAbove: { + x_min: -1, + x_max: 338, + y_min: 0, + y_max: 48, + ha: 48, + o: 'm 452 0 b 487 35 485 0 487 16 b 452 69 487 53 487 69 l 33 69 b -1 35 -1 69 -1 53 b 33 0 -1 16 -1 0 z', + }, + articTenutoBelow: { + x_min: -1, + x_max: 338, + y_min: -48, + y_max: 0, + ha: 48, + o: 'm 452 -69 b 487 -35 485 -69 487 -53 b 452 0 487 -16 487 0 l 33 0 b -1 -35 -1 0 -1 -16 b 33 -69 -1 -53 -1 -69 z', + }, + articStaccatoAbove: { + x_min: 0, + x_max: 84, + y_min: 0, + y_max: 84, + ha: 84, + o: 'm 121 60 b 60 121 121 94 94 121 b 0 60 27 121 0 94 b 60 0 0 27 27 0 b 121 60 94 0 121 27 z', + }, + articStaccatoBelow: { + x_min: 0, + x_max: 84, + y_min: -84, + y_max: 0, + ha: 84, + o: 'm 121 -60 b 60 0 121 -27 94 0 b 0 -60 27 0 0 -27 b 60 -121 0 -94 27 -121 b 121 -60 94 -121 121 -94 z', + }, + articStaccatissimoAbove: { + x_min: 1, + x_max: 100, + y_min: -2, + y_max: 293, + ha: 295, + o: 'm 72 422 b 1 390 35 422 3 409 b 72 -3 1 369 39 -3 b 144 389 108 -3 144 356 b 72 422 144 410 111 422 z', + }, + articStaccatissimoBelow: { + x_min: 1, + x_max: 100, + y_min: -295, + y_max: 0, + ha: 295, + o: 'm 72 -425 b 144 -392 111 -425 144 -413 b 72 0 144 -359 108 0 b 1 -393 39 0 1 -372 b 72 -425 3 -412 35 -425 z', + }, + articMarcatoAbove: { + x_min: -1, + x_max: 235, + y_min: -1, + y_max: 253, + ha: 254, + o: 'm 181 356 b 167 364 177 361 173 364 b 153 356 157 364 153 356 l 0 23 b -1 16 -1 20 -1 19 b 9 0 -1 9 1 1 b 16 -1 10 -1 14 -1 b 32 9 22 -1 29 1 b 112 186 32 9 109 180 b 118 190 114 189 115 190 b 127 186 121 190 124 189 b 209 9 128 180 209 9 b 225 0 213 3 219 0 l 323 0 b 338 16 333 1 338 7 b 337 23 338 19 338 22 z', + }, + articMarcatoBelow: { + x_min: -1, + x_max: 235, + y_min: -254, + y_max: 0, + ha: 254, + o: 'm 156 -357 b 170 -366 160 -363 164 -366 b 184 -357 180 -366 184 -357 l 337 -24 b 338 -17 338 -22 338 -20 b 328 -1 338 -10 336 -3 b 321 0 327 0 323 0 b 305 -10 315 0 308 -3 b 225 -187 305 -10 228 -181 b 219 -192 223 -190 222 -192 b 210 -187 216 -192 213 -190 b 128 -10 209 -181 128 -10 b 112 -1 124 -4 118 -1 l 14 -1 b -1 -17 4 -3 -1 -9 b 0 -24 -1 -20 -1 -23 z', + }, + fermataAbove: { + x_min: 3, + x_max: 605, + y_min: -3, + y_max: 329, + ha: 332, + o: 'm 435 318 b 818 36 742 318 804 91 b 821 26 819 32 819 27 b 851 -4 831 6 837 -4 b 871 16 864 -4 871 1 b 870 30 871 20 871 24 b 438 474 780 471 480 474 b 6 30 392 474 94 471 b 4 14 4 24 4 19 b 23 -4 4 0 12 -4 b 52 26 36 -4 43 6 b 56 39 53 27 55 33 b 435 318 73 98 138 318 z m 516 75 b 436 153 516 117 480 153 b 359 75 395 153 359 117 b 436 -4 359 32 395 -4 b 516 75 480 -4 516 32 z', + }, + fermataBelow: { + x_min: 3, + x_max: 605, + y_min: -332, + y_max: 0, + ha: 332, + o: 'm 435 -323 b 56 -43 138 -323 73 -102 b 52 -30 55 -37 53 -32 b 23 0 43 -10 36 0 b 4 -19 12 0 4 -4 b 6 -35 4 -23 4 -29 b 438 -478 94 -475 392 -478 b 870 -35 480 -478 780 -475 b 871 -20 871 -29 871 -24 b 851 0 871 -6 864 0 b 821 -30 837 0 831 -10 b 818 -40 819 -32 819 -36 b 435 -323 804 -95 742 -323 z m 516 -79 b 436 0 516 -36 480 0 b 359 -79 395 0 359 -36 b 436 -157 359 -121 395 -157 b 516 -79 480 -157 516 -121 z', + }, + breathMarkComma: { + x_min: 1, + x_max: 152, + y_min: 2, + y_max: 251, + ha: 249, + o: 'm 104 361 b 1 271 42 361 1 321 b 82 190 1 222 35 190 b 122 160 118 190 122 160 b 125 144 124 154 125 150 b 102 88 125 124 115 105 b 37 32 78 56 40 35 b 26 17 32 29 26 26 l 27 16 b 37 3 29 6 33 3 b 181 102 85 3 158 66 b 219 239 210 147 219 197 l 219 249 b 104 361 219 317 170 361 z', + }, + breathMarkUpbow: { + x_min: 1, + x_max: 249, + y_min: 1, + y_max: 495, + ha: 494, + o: 'm 181 1 b 206 22 193 1 203 10 l 359 683 l 359 688 b 338 713 359 700 351 710 l 333 713 b 308 694 321 713 311 706 l 180 140 l 53 694 b 27 713 49 706 39 713 l 22 713 b 1 690 10 710 1 700 b 3 683 1 687 1 685 l 154 22 b 181 1 157 10 167 1 z', + }, + caesura: { + x_min: 0, + x_max: 384, + y_min: -1, + y_max: 532, + ha: 533, + o: 'm 40 -1 b 78 26 58 -1 72 9 l 321 713 b 323 726 323 717 323 721 b 282 766 323 747 304 766 b 245 739 265 766 251 756 l 3 52 b 0 37 1 48 0 42 b 27 1 0 22 10 7 b 40 -1 32 -1 36 -1 z m 308 26 l 552 713 b 553 726 553 717 553 721 b 513 766 553 747 534 766 b 475 739 495 766 481 756 l 232 52 b 230 39 230 48 230 43 b 258 1 230 23 240 7 b 271 -1 262 -1 266 -1 b 308 26 287 -1 302 9 z', + }, + caesuraCurved: { + x_min: 0, + x_max: 373, + y_min: 0, + y_max: 530, + ha: 530, + o: 'm 491 763 b 445 719 468 763 446 744 b 252 98 432 507 340 295 l 226 39 b 223 27 225 35 223 32 b 252 0 223 13 233 0 b 276 16 262 0 272 6 b 537 716 386 230 537 478 b 491 763 537 742 518 763 z m 29 0 b 53 16 39 0 48 6 l 82 69 b 314 716 187 264 314 498 b 268 763 314 742 295 763 b 222 719 245 763 223 744 b 29 98 209 507 117 295 l 3 39 b 0 29 1 36 0 33 b 29 0 0 14 12 0 z', + }, + restMaxima: { + x_min: 0, + x_max: 381, + y_min: -249, + y_max: 250, + ha: 499, + o: 'm 180 -330 l 180 331 b 156 360 180 356 170 360 l 23 360 b 0 331 10 360 0 356 l 0 -330 b 23 -359 0 -354 10 -359 l 156 -359 b 180 -330 170 -359 180 -354 z m 549 -330 l 549 331 b 524 360 549 356 539 360 l 392 360 b 369 331 379 360 369 356 l 369 -330 b 392 -359 369 -354 379 -359 l 524 -359 b 549 -330 539 -359 549 -354 z', + }, + restDoubleWhole: { + x_min: 0, + x_max: 125, + y_min: 0, + y_max: 250, + ha: 250, + o: 'm 180 22 l 180 338 b 156 360 180 350 170 360 l 23 360 b 0 338 10 360 0 350 l 0 22 b 23 0 0 10 10 0 l 156 0 b 180 22 170 0 180 10 z', + }, + restWhole: { + x_min: 0, + x_max: 282, + y_min: -135, + y_max: 9, + ha: 144, + o: 'm 406 -157 l 406 -24 b 369 13 406 -3 389 13 l 37 13 b 0 -24 16 13 0 -3 l 0 -157 b 37 -194 0 -177 16 -194 l 369 -194 b 406 -157 389 -194 406 -177 z', + }, + restHalf: { + x_min: 0, + x_max: 282, + y_min: -2, + y_max: 142, + ha: 144, + o: 'm 406 35 l 406 167 b 369 204 406 189 389 204 l 37 204 b 0 167 16 204 0 189 l 0 35 b 37 -3 0 14 16 -3 l 369 -3 b 406 35 389 -3 406 14 z', + }, + restQuarter: { + x_min: 1, + x_max: 270, + y_min: -375, + y_max: 373, + ha: 748, + o: 'm 112 -55 b 174 -141 135 -84 156 -111 b 183 -161 177 -147 183 -158 b 181 -167 183 -163 183 -166 b 166 -174 179 -173 173 -174 b 143 -170 160 -174 148 -171 b 137 -170 141 -170 138 -170 l 125 -166 b 1 -304 50 -166 1 -233 b 168 -527 1 -376 63 -446 b 206 -540 180 -536 194 -540 b 228 -531 216 -540 226 -537 b 230 -521 229 -527 230 -524 b 207 -487 230 -508 219 -497 b 170 -435 189 -487 173 -448 b 164 -397 166 -423 164 -410 b 255 -292 164 -338 194 -292 b 369 -317 297 -292 344 -308 l 370 -318 b 382 -320 376 -320 379 -320 b 389 -314 386 -320 389 -318 b 336 -232 389 -297 351 -249 b 236 -32 281 -166 236 -112 b 236 -27 236 -30 236 -29 l 238 -17 b 238 -13 238 -16 238 -14 b 333 199 243 71 295 140 b 338 220 337 206 338 213 b 333 248 338 235 333 248 b 95 526 333 248 120 501 b 69 537 88 533 78 537 b 40 507 55 537 40 527 b 46 484 40 500 42 492 b 134 291 52 468 134 395 b 48 108 134 238 112 176 b 27 66 33 94 27 78 b 42 32 27 46 42 32 z', + }, + rest8th: { + x_min: 0, + x_max: 247, + y_min: -251, + y_max: 174, + ha: 425, + o: 'm 193 154 b 96 251 193 207 150 251 b 0 154 43 251 0 207 b 39 81 0 124 17 98 b 117 56 62 65 89 56 b 173 66 137 56 157 60 b 225 88 193 72 206 78 b 232 89 228 89 230 89 b 239 76 238 89 239 84 b 238 60 239 72 239 66 b 104 -343 233 39 130 -248 b 145 -361 104 -360 137 -361 b 196 -347 161 -361 181 -359 b 341 161 200 -344 341 161 b 356 217 347 187 354 210 b 338 240 356 232 341 239 b 323 235 336 240 331 240 b 193 140 312 226 240 140 z', + }, + rest16th: { + x_min: 0, + x_max: 320, + y_min: -500, + y_max: 179, + ha: 679, + o: 'm 300 160 b 202 258 300 215 256 258 b 104 160 148 258 104 215 b 219 62 104 101 164 62 b 331 94 258 62 298 75 b 341 96 336 95 338 96 b 348 86 346 96 348 94 b 265 -173 348 63 275 -151 b 194 -217 253 -200 215 -217 b 196 -203 196 -212 196 -207 b 98 -105 196 -148 151 -105 b 0 -203 43 -105 0 -148 b 115 -301 0 -262 60 -301 b 223 -271 153 -301 190 -288 b 229 -279 226 -271 229 -274 l 228 -281 b 228 -282 228 -282 228 -282 l 91 -690 b 91 -691 91 -690 91 -691 l 89 -693 b 134 -720 89 -706 102 -720 b 189 -687 176 -720 183 -703 l 356 -138 b 420 81 393 -16 420 81 b 459 226 420 81 456 207 b 461 232 459 229 461 230 b 446 248 461 240 449 246 b 431 242 439 248 435 245 b 300 145 420 233 348 147 z', + }, + rest32nd: { + x_min: 0, + x_max: 363, + y_min: -500, + y_max: 426, + ha: 926, + o: 'm 508 603 b 492 598 501 603 497 600 b 361 503 482 590 410 503 l 361 516 b 264 613 361 570 318 613 b 166 516 210 613 166 570 b 206 444 166 487 183 461 b 246 423 217 433 232 428 b 284 418 258 420 269 418 b 393 449 321 418 360 432 b 399 451 395 451 397 451 b 415 426 409 451 415 436 l 413 423 b 413 422 413 423 413 422 l 357 192 b 279 140 350 168 302 140 b 281 153 281 144 281 148 b 183 251 281 207 236 251 b 85 153 128 251 85 207 b 125 81 85 124 102 98 b 164 60 137 71 150 65 b 203 55 176 58 189 55 b 311 86 240 55 278 69 b 315 88 312 88 314 88 b 325 69 323 88 325 76 l 268 -167 b 194 -217 261 -197 216 -216 b 196 -203 196 -212 196 -207 b 98 -105 196 -148 153 -105 b 0 -203 45 -105 0 -148 b 115 -301 0 -262 60 -301 b 228 -269 154 -301 194 -288 b 232 -268 229 -268 230 -268 b 240 -276 236 -268 240 -272 b 138 -688 240 -282 141 -678 b 137 -697 137 -691 137 -694 b 176 -720 137 -708 145 -720 b 232 -690 222 -720 226 -706 b 484 436 236 -672 484 436 b 521 582 484 436 518 564 b 523 588 521 585 523 586 b 508 603 523 600 511 603 z', + }, + rest64th: { + x_min: 0, + x_max: 423, + y_min: -753, + y_max: 430, + ha: 1183, + o: 'm 596 609 b 580 603 589 609 585 606 b 448 507 569 595 497 507 b 449 521 449 511 449 516 b 351 619 449 575 405 619 b 253 521 297 619 253 575 b 372 422 253 461 317 422 b 481 454 410 422 446 438 b 491 456 484 455 488 456 b 504 441 498 456 504 451 b 501 426 504 436 503 432 b 445 202 500 422 451 217 b 359 144 435 174 383 144 l 359 158 b 261 256 359 212 315 256 b 163 158 207 256 163 212 b 243 65 163 112 202 78 b 279 60 255 62 266 60 b 397 91 320 60 360 73 b 403 92 400 92 402 92 b 412 79 409 92 412 86 b 410 72 412 76 412 75 b 351 -161 408 59 356 -150 b 281 -212 340 -199 301 -212 l 281 -197 b 183 -99 281 -144 238 -99 b 85 -197 130 -99 85 -144 b 125 -271 85 -228 102 -253 b 166 -291 138 -279 151 -287 b 204 -297 177 -294 192 -297 b 262 -287 225 -297 245 -292 b 305 -265 282 -279 287 -274 b 310 -264 307 -264 308 -264 b 318 -284 317 -264 318 -275 b 317 -295 318 -288 317 -294 b 259 -524 315 -302 265 -508 b 194 -567 251 -554 213 -567 b 196 -554 196 -563 196 -559 b 98 -456 196 -500 153 -456 b 0 -554 45 -456 0 -500 b 40 -626 0 -583 17 -609 b 118 -652 60 -644 92 -652 b 210 -629 145 -652 186 -642 b 216 -628 213 -628 215 -628 b 228 -647 226 -628 228 -639 l 226 -651 b 226 -652 226 -651 226 -652 l 122 -1054 b 121 -1064 121 -1058 121 -1061 b 167 -1084 121 -1077 134 -1084 b 215 -1060 202 -1084 209 -1076 b 402 -278 217 -1047 229 -1021 b 436 -135 403 -278 431 -161 l 570 441 b 609 588 570 441 605 569 b 596 609 609 603 602 608 z', + }, + rest128th: { + x_min: 0, + x_max: 485, + y_min: -750, + y_max: 689, + ha: 1439, + o: 'm 537 894 b 439 992 537 949 494 992 b 341 894 386 992 341 949 b 382 822 341 865 359 840 b 459 796 402 805 433 796 b 518 806 480 796 501 801 l 520 808 b 569 828 539 814 552 819 b 580 831 572 829 577 831 b 598 812 589 831 598 825 b 596 801 598 809 598 805 b 540 575 590 773 546 595 b 448 510 534 553 475 510 l 448 524 b 350 622 448 577 405 622 b 252 524 297 622 252 577 b 292 451 252 494 269 468 b 369 426 318 433 337 426 b 429 435 389 426 412 429 b 494 464 449 442 475 455 b 498 465 495 465 497 465 b 505 446 504 465 505 456 b 503 426 505 439 504 432 l 446 202 b 366 144 439 173 389 144 l 366 158 b 268 256 366 212 323 256 b 170 158 215 256 170 212 b 289 59 170 98 235 59 b 347 69 310 59 330 63 b 397 91 367 76 379 82 b 406 94 400 92 403 94 b 415 79 412 94 415 88 b 412 63 415 75 413 69 b 357 -157 408 42 364 -134 b 281 -212 346 -196 302 -212 b 282 -197 281 -207 282 -203 b 184 -99 282 -144 238 -99 b 86 -197 130 -99 86 -144 b 204 -297 86 -258 150 -297 b 262 -287 225 -297 245 -292 b 312 -265 282 -279 294 -274 b 318 -264 314 -264 317 -264 b 327 -275 324 -264 327 -269 b 266 -517 324 -287 278 -490 b 200 -569 248 -566 220 -567 l 196 -554 b 98 -456 196 -500 153 -456 b 0 -554 45 -456 0 -500 b 118 -652 0 -615 63 -652 b 177 -642 138 -652 160 -648 l 179 -641 b 229 -621 197 -635 210 -629 l 230 -619 b 239 -626 236 -619 239 -622 b 238 -632 239 -628 239 -631 b 131 -1057 235 -642 134 -1050 b 173 -1080 131 -1071 140 -1080 b 230 -1057 219 -1080 225 -1074 l 658 815 b 697 960 658 815 694 942 b 698 966 697 963 698 965 b 684 982 698 975 687 981 b 668 976 677 982 672 979 b 537 880 658 969 586 881 z', + }, + dynamicPiano: { + x_min: -89, + x_max: 366, + y_min: -142, + y_max: 274, + ha: 416, + o: 'm 395 395 b 292 357 350 395 318 380 b 262 328 272 340 268 328 b 246 363 255 328 259 338 b 177 393 236 380 215 393 b 1 251 92 393 46 333 b -9 223 -6 238 -9 230 b 7 207 -9 213 -1 207 b 30 229 17 207 23 216 b 127 338 72 301 101 338 b 143 321 138 338 143 331 b 134 285 143 310 138 295 l -43 -154 b -65 -168 -48 -166 -50 -168 l -109 -168 b -128 -187 -122 -168 -128 -174 b -111 -204 -128 -199 -122 -204 l 167 -204 b 186 -186 180 -204 186 -199 b 168 -168 186 -174 180 -168 l 111 -168 b 98 -164 102 -168 98 -168 b 101 -154 98 -163 99 -158 l 166 7 b 179 24 168 14 171 24 b 213 -1 186 24 190 10 b 276 -14 233 -12 252 -14 b 527 266 415 -14 527 130 b 395 395 527 350 475 395 z m 356 341 b 389 288 380 341 389 320 b 243 35 389 217 312 35 b 207 81 219 35 207 50 b 235 180 207 111 219 140 l 264 251 b 356 341 284 300 321 341 z', + }, + dynamicMezzo: { + x_min: -20, + x_max: 446, + y_min: -10, + y_max: 274, + ha: 284, + o: 'm 528 395 b 431 350 487 395 454 374 b 409 330 416 336 415 330 b 397 360 402 330 406 341 b 334 395 389 379 370 395 b 236 350 292 395 259 374 b 215 330 222 336 220 330 b 203 360 207 330 212 340 b 147 393 194 379 174 393 b -19 251 71 393 26 331 b -29 223 -26 238 -29 230 b -13 207 -29 213 -22 207 b 9 226 -3 207 1 215 b 107 338 52 300 81 338 b 122 321 118 338 122 331 b 114 285 122 310 118 295 l 9 24 b 4 9 6 17 4 13 b 20 0 4 3 9 0 l 91 0 b 114 17 104 0 108 3 l 207 251 b 287 323 225 292 255 323 b 308 302 304 323 308 314 b 294 249 308 285 302 269 b 203 24 294 248 292 248 b 199 9 200 17 199 13 b 215 0 199 3 203 0 l 285 0 b 308 17 298 0 302 3 l 402 251 b 481 323 419 292 449 323 b 503 302 498 323 503 314 b 413 43 503 252 413 104 b 478 -14 413 6 436 -14 b 629 102 533 -14 583 26 b 642 132 638 117 642 125 b 629 145 642 141 636 145 b 608 127 619 145 615 138 b 534 49 580 84 553 49 b 523 62 526 49 523 53 b 606 317 523 112 606 238 b 528 395 606 353 588 395 z', + }, + dynamicForte: { + x_min: -141, + x_max: 364, + y_min: -152, + y_max: 444, + ha: 596, + o: 'm 23 380 b 0 357 7 380 0 373 b 22 336 0 343 7 336 l 105 336 b 117 330 114 336 117 336 b 114 315 117 327 115 323 l 23 0 b -101 -187 -17 -141 -43 -187 b -127 -174 -120 -187 -127 -181 b -92 -156 -127 -163 -114 -170 b -63 -102 -75 -144 -63 -125 b -128 -43 -63 -65 -89 -43 b -203 -122 -171 -43 -203 -78 b -95 -219 -203 -186 -156 -219 b 161 17 14 -219 82 -145 b 269 317 203 105 235 194 l 271 318 b 289 336 271 323 282 336 l 383 336 b 406 359 399 336 406 343 b 384 380 406 373 399 380 l 298 380 b 284 387 288 380 284 380 b 287 405 284 392 285 396 b 419 606 315 530 347 606 b 442 595 431 606 442 603 b 419 580 442 586 435 588 b 389 526 400 572 389 552 b 454 465 389 485 418 465 b 524 543 491 465 524 490 b 400 639 524 596 491 639 b 135 402 261 639 183 540 b 107 380 128 380 127 380 z', + }, + dynamicRinforzando: { + x_min: -20, + x_max: 277, + y_min: 0, + y_max: 274, + ha: 274, + o: 'm 324 395 b 235 350 287 395 256 374 b 215 330 222 336 220 330 b 203 360 207 330 213 337 b 145 393 194 379 174 393 b -19 251 75 393 27 337 b -29 223 -26 238 -29 230 b -13 207 -29 213 -22 207 b 9 226 -3 207 3 215 b 107 338 52 301 81 338 b 122 321 118 338 122 331 b 114 285 122 310 118 295 l 9 24 b 4 9 6 17 4 13 b 20 0 4 3 9 0 l 91 0 b 114 17 104 0 108 3 l 207 251 b 304 351 226 298 272 351 b 318 343 312 351 318 348 b 287 285 318 330 287 325 b 338 239 287 256 308 239 b 399 318 373 239 399 268 b 324 395 399 360 377 395 z', + }, + dynamicSforzando: { + x_min: 0, + x_max: 229, + y_min: -10, + y_max: 273, + ha: 283, + o: 'm 212 393 b 68 274 127 393 68 350 b 145 161 68 223 95 196 b 200 85 187 132 200 114 b 127 20 200 53 173 20 b 66 42 91 20 66 32 b 91 56 66 49 75 46 b 111 98 104 65 111 79 b 59 145 111 127 86 145 b 0 78 24 145 0 117 b 125 -14 0 30 49 -14 b 291 120 219 -14 291 36 b 220 232 291 160 276 190 b 151 314 168 271 151 287 b 213 361 151 337 168 361 b 258 346 238 361 258 356 b 240 333 258 340 251 340 b 226 298 232 325 226 314 b 276 252 226 269 248 252 b 330 307 311 252 330 279 b 212 393 330 360 285 393 z', + }, + dynamicZ: { + x_min: -30, + x_max: 244, + y_min: -10, + y_max: 268, + ha: 278, + o: 'm 333 386 b 298 377 321 386 314 382 b 239 370 282 373 259 370 b 94 383 153 370 111 383 b 68 364 79 383 72 377 l 33 264 b 29 242 30 255 29 248 b 45 228 29 232 36 228 b 66 249 55 228 60 236 l 81 279 b 96 297 85 288 88 297 b 168 292 102 297 127 292 b 223 302 194 292 215 302 b 196 269 229 302 197 271 l -26 45 b -43 16 -37 33 -43 27 b -24 -1 -43 6 -36 -1 b 4 16 -12 -1 -3 10 b 39 30 16 24 27 30 b 179 -14 79 30 108 -14 b 297 102 259 -14 297 43 b 245 166 297 147 271 166 b 197 115 219 166 197 145 b 236 72 197 88 216 72 b 259 79 251 72 255 79 b 264 75 262 79 264 78 b 258 60 264 72 261 66 b 229 45 252 50 242 45 b 117 95 186 45 173 95 b 85 86 98 95 89 86 b 102 111 85 86 95 104 l 333 338 b 351 370 344 350 351 359 b 333 386 351 380 343 386 z', + }, + ornamentTrill: { + x_min: 0, + x_max: 521, + y_min: -10, + y_max: 390, + ha: 400, + o: 'm 383 562 b 364 557 377 562 369 559 l 294 534 b 269 511 281 530 275 526 l 217 384 b 206 367 212 370 210 367 b 179 380 200 367 192 374 b 118 393 158 389 140 393 b 0 292 50 393 0 353 b 95 210 0 248 30 210 b 140 213 112 210 131 213 b 144 209 143 213 144 212 b 140 194 144 206 143 202 l 124 156 b 96 58 108 117 96 88 b 179 -14 96 17 124 -14 b 325 153 253 -14 325 46 b 307 251 325 187 320 219 b 302 265 304 258 302 261 b 334 294 302 274 311 281 l 343 298 b 455 348 393 328 428 348 b 474 327 468 348 474 344 b 465 285 474 312 469 295 l 360 24 b 356 9 357 17 356 13 b 372 0 356 3 360 0 l 442 0 b 465 17 455 0 459 3 l 559 251 b 655 351 577 298 624 351 b 670 343 664 351 670 348 b 638 285 670 330 638 325 b 690 239 638 256 660 239 b 750 318 724 239 750 268 b 675 395 750 360 729 395 b 586 350 638 395 608 374 b 566 330 573 336 572 330 b 553 361 559 330 564 340 b 490 393 543 380 521 393 b 347 348 432 393 377 364 b 312 333 328 338 320 333 b 308 337 310 333 308 334 b 315 359 308 343 312 351 l 387 537 b 392 553 390 544 392 549 b 383 562 392 559 389 562 z m 118 360 b 192 325 134 360 192 347 b 186 307 192 321 189 314 l 180 292 b 148 265 173 274 167 269 b 98 258 130 261 112 258 b 39 301 50 258 39 281 b 118 360 39 327 60 360 z m 272 240 b 292 151 285 240 292 164 b 212 30 292 88 253 30 b 196 48 200 30 196 37 b 207 92 196 59 202 78 b 264 230 207 94 209 94 b 272 240 266 238 268 240 z', + }, + ornamentTurn: { + x_min: 0, + x_max: 460, + y_min: 0, + y_max: 218, + ha: 218, + o: 'm 534 314 b 454 251 490 314 454 294 b 505 199 454 219 475 199 b 579 232 547 199 549 232 b 626 164 603 232 626 202 b 533 72 626 102 583 72 b 377 180 487 72 439 111 b 150 312 307 258 243 312 b 0 148 55 312 0 240 b 128 0 0 45 66 0 b 209 63 173 0 209 20 b 157 115 209 95 187 115 b 84 82 115 115 114 82 b 36 150 59 82 36 112 b 130 242 36 212 79 242 b 285 134 176 242 223 203 b 513 1 356 56 419 1 b 662 166 608 1 662 73 b 534 314 662 269 596 314 z', + }, + ornamentTurnSlash: { + x_min: 0, + x_max: 460, + y_min: -90, + y_max: 306, + ha: 396, + o: 'm 333 441 b 310 418 315 441 310 433 l 310 274 b 302 252 310 258 308 252 b 261 278 294 252 287 262 b 150 311 228 298 192 311 b 0 147 55 311 0 239 b 128 -1 0 43 66 -1 b 209 62 173 -1 209 19 b 157 114 209 94 187 114 b 84 81 115 114 114 81 b 36 148 59 81 36 111 b 130 240 36 210 79 240 b 285 128 176 240 222 197 b 307 79 304 108 307 105 l 307 -107 b 330 -130 307 -122 312 -130 b 353 -107 347 -130 353 -122 l 353 37 b 360 59 353 53 353 59 b 402 33 369 59 376 49 b 513 0 435 13 471 0 b 662 164 608 0 662 72 b 534 312 662 268 596 312 b 454 249 490 312 454 292 b 505 197 454 217 475 197 b 579 230 547 197 549 230 b 626 163 603 230 626 200 b 533 71 626 101 583 71 b 377 183 487 71 441 114 b 356 232 359 203 356 206 l 356 418 b 333 441 356 433 350 441 z', + }, + ornamentMordent: { + x_min: 1, + x_max: 729, + y_min: -73, + y_max: 319, + ha: 392, + o: 'm 546 265 l 546 459 l 501 459 l 501 216 l 459 167 b 439 167 454 160 445 160 b 302 327 387 228 310 317 b 258 353 291 338 282 351 b 226 340 245 353 238 348 l 20 107 b 1 73 12 98 1 84 b 30 59 1 65 9 59 b 88 94 53 59 73 79 b 144 143 107 109 124 127 b 176 161 158 154 168 161 b 197 144 183 161 189 156 l 323 10 b 351 0 328 3 340 0 b 377 9 361 0 372 3 b 498 114 392 17 475 94 l 498 -105 l 544 -105 l 544 153 b 562 160 550 157 556 160 b 585 144 569 160 576 156 b 710 10 590 135 697 24 b 737 0 716 3 727 0 b 765 9 749 0 759 3 b 1030 295 776 17 1011 274 l 1032 300 b 1050 328 1041 308 1050 318 b 1012 353 1050 343 1024 353 b 986 343 1002 353 994 348 b 854 190 971 330 871 206 b 828 176 842 180 835 176 b 802 190 818 176 809 183 b 681 333 791 202 696 320 b 645 353 668 344 657 353 b 613 340 634 353 626 350 b 580 304 600 330 590 315 z', + }, + ornamentShortTrill: { + x_min: 0, + x_max: 725, + y_min: 0, + y_max: 245, + ha: 245, + o: 'm 429 167 l 301 325 b 256 353 291 338 282 350 b 225 340 246 353 238 350 b 16 105 158 268 88 186 b 0 72 9 96 0 86 b 29 58 0 63 7 58 b 71 76 42 58 55 62 l 158 154 b 174 160 163 158 168 160 b 197 143 181 160 187 154 b 321 10 203 135 310 24 b 350 0 327 3 338 0 b 377 7 361 0 372 3 l 533 148 b 554 160 543 158 550 160 b 577 143 562 160 566 156 b 703 10 585 135 690 24 b 732 0 708 3 720 0 b 759 7 743 0 753 3 b 1024 294 769 16 1005 272 b 1044 327 1032 305 1044 321 b 1005 353 1044 341 1018 353 b 979 343 996 353 988 348 b 848 189 963 330 864 204 b 821 174 837 179 828 174 b 796 189 811 174 804 181 b 674 331 783 202 688 318 b 641 351 662 343 651 351 b 606 340 628 351 619 350 b 573 304 593 328 583 315 b 444 167 533 259 491 213 b 429 167 439 161 433 161 z', + }, + ornamentTremblement: { + x_min: 1, + x_max: 985, + y_min: 0, + y_max: 244, + ha: 244, + o: 'm 678 325 b 634 351 667 338 657 350 b 602 338 621 351 613 348 l 448 167 b 439 167 446 164 441 164 l 302 325 b 258 351 291 338 281 350 b 228 338 245 351 238 348 b 193 304 215 328 204 315 l 19 107 b 1 72 13 96 1 76 b 30 58 1 63 9 58 b 89 92 52 58 73 78 l 144 141 b 148 144 145 143 147 143 b 176 160 160 153 170 160 b 199 143 183 160 189 154 b 324 10 204 134 311 23 b 351 0 330 3 340 0 b 379 7 363 0 373 3 l 530 148 b 552 160 536 154 546 160 b 575 143 559 160 564 154 b 698 10 580 134 687 23 b 727 0 704 3 716 0 b 755 7 739 0 749 3 l 907 147 b 930 160 922 158 923 160 b 952 143 937 160 943 154 l 1077 10 b 1107 0 1084 3 1096 0 b 1133 7 1117 0 1128 3 b 1398 294 1143 16 1380 272 b 1418 327 1407 305 1418 321 b 1381 351 1418 343 1394 351 b 1354 341 1371 351 1362 348 b 1223 189 1338 328 1238 204 b 1195 174 1211 179 1202 174 b 1171 189 1185 174 1178 181 b 1048 331 1158 200 1063 318 b 1012 351 1035 343 1024 351 b 981 338 1002 351 994 350 b 948 304 968 328 958 315 b 827 166 907 258 865 212 b 815 166 824 163 818 163 b 678 325 760 226 732 264 z', + }, + ornamentPrecompAppoggTrill: { + x_min: 0, + x_max: 1119, + y_min: 0, + y_max: 481, + ha: 481, + o: 'm 1015 163 b 873 328 963 223 880 318 b 828 354 860 344 847 353 b 796 341 816 354 809 351 b 763 305 783 331 773 317 b 642 168 721 261 681 215 b 636 163 641 167 639 164 b 494 328 585 223 501 318 b 449 354 481 344 468 353 b 418 341 438 354 431 351 b 384 305 405 331 395 317 b 264 168 343 261 302 215 l 242 144 b 144 88 232 124 171 88 b 79 197 81 88 79 189 l 79 648 b 60 693 79 683 71 693 b 52 691 58 693 55 693 b 0 616 3 672 0 625 l 0 207 b 121 0 0 40 68 0 b 249 68 168 0 232 53 b 279 94 262 75 271 86 b 336 144 298 111 315 128 b 367 163 350 156 360 163 b 389 145 374 163 380 157 b 514 12 395 137 501 26 b 543 1 520 4 531 1 b 569 9 553 1 563 4 b 636 73 576 14 605 43 l 658 94 b 714 144 677 111 694 128 b 746 163 729 156 739 163 b 768 145 753 163 759 157 b 893 12 773 137 880 26 b 922 1 899 4 910 1 b 948 9 932 1 942 4 l 1012 71 b 1037 94 1022 78 1030 86 b 1092 144 1054 111 1073 128 b 1123 161 1106 156 1115 161 b 1146 145 1130 161 1136 157 b 1270 12 1152 137 1259 26 b 1299 1 1276 4 1287 1 b 1326 9 1310 1 1320 4 b 1591 297 1336 19 1572 275 b 1611 328 1600 307 1611 320 b 1574 354 1611 343 1585 354 b 1548 344 1565 354 1555 350 b 1416 192 1532 331 1431 206 b 1388 177 1404 181 1395 177 b 1365 190 1380 177 1371 184 b 1243 333 1352 203 1256 321 b 1205 354 1228 346 1217 354 b 1174 341 1195 354 1187 351 b 1140 305 1161 330 1152 317 z', + }, + ornamentPrecompSlideTrillDAnglebert: { + x_min: 2, + x_max: 1150, + y_min: -367, + y_max: 245, + ha: 612, + o: 'm 1058 160 b 916 327 1007 220 923 317 b 871 353 903 343 890 351 b 840 340 860 353 852 350 b 806 304 827 330 816 315 b 685 167 765 259 724 213 l 680 160 l 615 235 b 419 344 582 275 523 344 b 3 -144 258 344 3 26 b 4 -168 3 -153 3 -160 b 246 -482 24 -315 99 -422 b 458 -528 340 -521 410 -528 b 514 -526 485 -528 504 -526 b 552 -508 531 -526 552 -517 b 514 -497 552 -503 541 -498 l 503 -497 b 194 -390 432 -494 298 -488 b 69 -151 194 -390 69 -279 b 184 96 69 -60 128 27 b 328 183 202 118 258 183 b 477 96 413 183 454 118 b 559 10 510 62 552 19 b 588 0 566 3 576 0 b 613 7 598 0 609 3 b 723 112 622 14 681 73 b 789 161 733 122 776 161 b 811 144 796 161 802 156 b 936 10 816 135 923 24 b 965 0 942 3 953 0 b 991 7 975 0 985 3 b 1051 66 996 12 1022 37 b 1081 92 1063 73 1073 84 b 1136 143 1099 109 1117 127 b 1168 160 1151 154 1159 160 b 1191 144 1175 160 1181 156 b 1315 10 1197 135 1303 24 b 1344 0 1320 3 1332 0 b 1371 7 1355 0 1365 3 b 1636 295 1381 17 1617 274 b 1656 327 1644 305 1656 318 b 1619 353 1656 341 1630 353 b 1593 343 1610 353 1600 348 b 1460 190 1577 330 1476 204 b 1433 176 1449 180 1440 176 b 1410 189 1424 176 1416 183 b 1287 331 1397 202 1300 320 b 1250 353 1273 344 1261 353 b 1218 340 1240 353 1231 350 b 1185 304 1205 328 1197 315 z', + }, + ornamentPrecompSlideTrillBach: { + x_min: 0, + x_max: 1048, + y_min: -367, + y_max: 331, + ha: 698, + o: 'm 1038 477 l 979 477 l 979 238 l 912 160 b 769 327 858 220 775 317 b 724 353 756 343 743 351 b 693 340 713 353 706 350 b 660 304 680 330 670 315 b 539 167 618 259 577 213 b 533 161 536 166 534 163 b 390 327 480 220 396 317 b 346 353 377 343 364 351 l 340 353 b 308 340 330 353 321 350 b 275 304 295 330 285 315 b 117 122 220 243 168 186 b 0 -144 68 62 0 -48 b 1 -168 0 -153 0 -160 b 243 -482 22 -315 96 -422 b 455 -528 337 -521 408 -528 b 511 -526 482 -528 501 -526 b 549 -508 528 -526 549 -517 b 511 -497 549 -503 539 -498 l 500 -497 b 192 -390 429 -494 295 -488 b 68 -177 192 -390 84 -298 b 66 -151 66 -168 66 -160 b 189 105 66 -58 127 35 b 232 143 203 118 216 131 b 264 161 246 154 256 161 b 285 144 271 161 276 156 b 410 10 291 135 397 24 b 439 0 416 3 428 0 b 465 7 449 0 459 3 l 531 72 b 554 92 540 78 547 86 b 611 143 573 109 590 127 b 642 161 625 154 635 161 b 664 144 649 161 655 156 b 789 10 670 135 776 24 b 818 0 795 3 806 0 b 844 7 828 0 838 3 b 904 66 850 12 876 37 b 935 92 916 73 924 84 b 979 134 949 107 963 121 l 979 -88 l 1037 -88 l 1037 151 l 1044 144 b 1168 10 1050 135 1156 24 b 1197 0 1174 3 1185 0 b 1224 7 1208 0 1218 3 b 1489 295 1234 17 1470 274 b 1509 327 1498 305 1509 318 b 1472 353 1509 341 1483 353 b 1446 343 1463 353 1453 348 b 1313 190 1430 330 1329 204 b 1286 176 1302 180 1293 176 b 1263 189 1277 176 1269 183 b 1140 331 1250 202 1153 320 b 1103 353 1126 344 1115 353 b 1071 340 1093 353 1084 350 b 1038 304 1058 328 1050 315 z', + }, + ornamentPrecompTrillSuffixDandrieu: { + x_min: 0, + x_max: 949, + y_min: 0, + y_max: 381, + ha: 381, + o: 'm 1367 314 b 1250 521 1367 419 1318 482 b 1107 549 1211 537 1145 549 b 1083 546 1096 549 1087 549 b 1066 528 1071 540 1066 534 b 1079 520 1066 524 1070 520 b 1323 351 1187 517 1323 487 b 1201 171 1323 269 1260 219 b 1194 166 1201 171 1198 168 b 1056 327 1142 226 1063 317 b 1011 353 1043 343 1030 351 b 979 340 999 353 992 350 b 946 304 966 330 956 315 b 825 167 904 259 864 213 l 821 161 b 678 327 768 222 685 317 b 634 353 665 343 652 351 b 602 340 622 353 615 350 b 569 304 589 330 579 315 b 448 167 527 259 487 213 l 444 161 b 301 327 390 222 308 317 b 256 353 288 343 275 351 b 225 340 245 353 238 350 b 192 304 212 330 202 315 b 71 167 150 259 109 213 b 17 105 52 147 36 127 b 0 73 10 98 0 84 b 29 58 0 65 7 58 b 86 92 56 59 72 79 b 143 143 105 109 122 127 b 174 161 157 154 167 161 b 196 144 181 161 187 156 b 321 10 202 135 308 24 b 350 0 327 3 338 0 b 376 7 360 0 370 3 b 485 112 384 14 444 73 b 552 161 495 122 539 161 b 573 144 559 161 564 156 b 698 10 579 135 685 24 b 727 0 704 3 716 0 b 753 7 737 0 747 3 b 863 112 762 14 821 73 b 929 161 873 122 916 161 b 950 144 936 161 942 156 b 1076 10 956 135 1063 24 b 1104 0 1081 3 1093 0 b 1130 7 1115 0 1125 3 b 1236 108 1139 14 1195 69 b 1367 314 1297 160 1367 233 z', + }, + ornamentPrecompDoubleCadenceUpperPrefix: { + x_min: 0, + x_max: 1278, + y_min: 0, + y_max: 247, + ha: 247, + o: 'm 1801 356 b 1776 346 1793 356 1783 351 b 1642 192 1760 333 1659 206 b 1614 177 1630 181 1621 177 b 1591 190 1606 177 1597 184 b 1469 334 1578 203 1482 323 b 1430 356 1453 347 1441 356 b 1398 343 1420 356 1411 353 b 1365 307 1385 331 1377 318 l 1240 164 b 1097 330 1187 226 1104 320 b 1053 356 1084 346 1071 354 b 1021 343 1041 356 1034 353 b 988 307 1008 333 998 318 b 865 168 946 262 904 216 l 861 163 b 717 330 808 223 724 320 b 672 356 704 346 691 354 b 641 343 661 356 654 353 b 608 307 628 333 618 318 b 485 168 566 262 524 216 l 455 134 b 284 46 409 88 351 46 b 16 285 148 46 32 265 b 3 295 9 292 4 295 b 0 291 1 295 0 292 b 1 285 0 288 1 285 b 308 0 42 190 157 0 b 530 120 415 1 482 63 b 559 144 539 128 549 137 b 590 163 573 156 583 163 b 612 145 598 163 603 157 b 739 10 618 137 724 24 b 768 0 744 3 756 0 b 793 7 778 0 788 3 b 903 114 802 14 861 75 l 939 144 b 971 163 953 156 963 163 b 992 145 978 163 984 157 b 1119 10 998 137 1106 24 b 1148 0 1125 3 1136 0 b 1174 7 1158 0 1168 3 b 1284 114 1182 14 1241 75 b 1316 144 1282 115 1312 141 b 1348 161 1331 156 1339 161 b 1371 145 1355 161 1361 157 b 1496 10 1377 137 1485 24 b 1525 0 1502 3 1513 0 b 1552 7 1536 0 1547 3 b 1819 298 1562 17 1800 276 b 1840 330 1829 308 1840 320 b 1832 344 1840 334 1837 340 b 1801 356 1820 351 1810 356 z', + }, + ornamentPrecompDoubleCadenceUpperPrefixTurn: { + x_min: 0, + x_max: 1277, + y_min: -62, + y_max: 333, + ha: 395, + o: 'm 1273 202 l 1273 480 l 1230 480 l 1230 174 l 1097 328 b 1053 354 1084 344 1071 353 b 1021 341 1041 354 1034 351 b 988 305 1008 331 998 317 b 865 167 945 261 904 215 l 861 161 b 717 328 808 222 724 318 b 672 354 704 344 691 353 b 641 341 661 354 654 351 b 608 305 628 331 618 317 b 485 167 564 261 524 215 b 455 132 474 156 465 144 b 284 45 410 88 350 45 b 14 284 148 45 30 264 b 3 294 9 291 4 294 b 0 289 1 294 0 291 b 1 284 0 287 1 284 b 308 -1 42 189 157 -1 b 530 118 415 0 481 62 b 557 143 539 127 547 135 b 590 161 572 154 582 161 b 612 144 598 161 603 156 b 737 9 618 135 724 24 b 768 -1 743 1 755 -1 b 793 6 778 -1 788 1 b 903 112 802 13 861 73 l 937 143 b 971 161 953 154 963 161 b 992 144 978 161 984 156 b 1117 9 998 135 1104 24 b 1148 -1 1123 1 1136 -1 b 1174 6 1158 -1 1168 1 l 1230 60 l 1230 -89 l 1273 -89 l 1273 102 l 1283 112 b 1348 160 1295 125 1332 160 b 1371 144 1355 160 1361 156 b 1496 9 1377 135 1483 24 b 1525 -1 1502 1 1513 -1 b 1552 6 1536 -1 1547 1 b 1819 297 1562 16 1800 275 b 1839 328 1827 307 1839 320 b 1801 354 1839 343 1813 354 b 1776 344 1793 354 1783 350 b 1642 190 1760 331 1657 206 b 1614 176 1630 180 1621 176 b 1591 189 1606 176 1597 183 b 1467 333 1578 203 1480 321 b 1430 354 1453 346 1441 354 b 1398 341 1420 354 1411 351 b 1365 305 1385 330 1377 317 z', + }, + ornamentPrecompTrillLowerSuffix: { + x_min: 0, + x_max: 859, + y_min: -222, + y_max: 246, + ha: 468, + o: 'm 1164 217 b 1031 351 1138 259 1063 351 b 1011 337 1020 351 1024 347 b 828 167 952 291 886 217 l 824 164 b 683 328 772 225 690 318 b 638 354 670 344 657 353 b 606 341 626 354 619 351 b 573 305 593 331 583 317 b 451 167 530 261 490 215 l 446 161 b 302 328 393 222 310 318 b 258 354 289 344 276 353 b 226 341 246 354 239 351 b 193 305 213 331 203 317 b 71 167 150 261 109 215 b 17 105 52 147 36 127 b 0 73 10 98 0 84 b 29 58 0 65 7 58 b 86 92 56 59 72 79 b 143 143 105 109 122 127 b 176 161 157 154 168 161 b 197 144 183 161 189 156 b 323 9 203 135 310 23 b 353 -1 328 1 340 -1 b 379 6 363 -1 373 1 b 488 112 387 13 446 73 l 523 143 b 556 161 539 154 549 161 b 577 144 563 161 569 156 b 703 9 583 135 690 23 b 733 -1 708 1 721 -1 b 759 6 743 -1 753 1 b 868 112 768 13 827 73 b 955 183 878 122 943 183 b 1081 107 965 183 1031 153 b 1156 -89 1128 63 1156 6 l 1156 -102 b 948 -297 1156 -204 1048 -297 b 806 -271 904 -297 850 -282 l 792 -266 b 801 -288 792 -268 795 -282 b 948 -320 809 -297 880 -320 b 1237 -50 1092 -320 1237 -199 b 1164 217 1237 75 1218 122 z', + }, + brassScoop: { + x_min: 1, + x_max: 320, + y_min: -373, + y_max: 13, + ha: 386, + o: 'm 35 -537 b 461 -12 194 -518 461 -289 b 438 19 461 13 451 19 b 410 -9 425 19 413 9 b 35 -425 357 -366 92 -403 b 1 -482 13 -433 1 -438 l 1 -505 b 26 -537 1 -526 3 -537 z', + }, + brassDoitMedium: { + x_min: 0, + x_max: 489, + y_min: -40, + y_max: 346, + ha: 386, + o: 'm 33 -58 b 704 468 255 -58 683 186 b 681 498 704 494 693 498 b 654 471 668 498 658 488 b 33 55 550 118 91 76 b 0 -3 12 46 0 42 l 0 -26 b 24 -58 0 -46 1 -58 z', + }, + brassFallLipShort: { + x_min: 1, + x_max: 293, + y_min: -345, + y_max: 42, + ha: 387, + o: 'm 22 60 b 1 35 4 60 1 52 l 1 6 b 26 -50 3 -40 10 -43 b 32 -52 27 -50 30 -50 b 376 -469 85 -73 327 -111 b 400 -497 379 -487 387 -497 b 422 -467 412 -497 422 -491 b 32 60 422 -187 177 40 z', + }, + brassLiftMedium: { + x_min: 0, + x_max: 811, + y_min: 0, + y_max: 852, + ha: 852, + o: 'm 1138 1220 b 1135 1225 1135 1223 1135 1224 b 1129 1227 1133 1227 1130 1227 b 1117 1207 1122 1227 1117 1212 l 1117 1201 b 1109 1164 1117 1187 1117 1172 b 1100 1156 1107 1161 1104 1158 b 959 1104 1058 1128 995 1140 b 929 1032 936 1081 929 1056 b 932 1007 929 1024 930 1015 b 923 976 932 995 930 985 l 914 971 b 773 919 873 942 809 955 b 743 847 750 896 743 870 b 746 821 743 838 744 829 b 737 791 746 809 744 799 l 729 783 b 588 733 687 756 624 769 b 557 661 564 710 557 684 b 560 635 557 652 559 644 b 552 605 560 624 559 612 l 543 598 b 402 547 501 570 438 583 b 372 475 379 524 372 498 b 374 449 372 467 373 458 b 366 419 374 438 373 426 l 357 412 b 216 361 315 384 252 397 b 186 289 193 338 186 312 b 189 264 186 281 187 272 b 180 233 189 252 187 240 b 171 226 177 232 174 229 b 30 176 130 199 66 212 b 0 104 7 153 0 128 b 33 0 0 88 14 0 b 49 17 40 0 49 10 b 71 63 52 35 56 49 b 212 115 102 95 154 59 b 239 186 230 134 239 160 b 236 210 239 194 238 202 b 256 249 239 225 243 236 b 397 301 288 281 340 245 b 425 372 416 320 425 346 b 422 396 425 380 423 387 b 442 435 425 410 429 422 b 583 487 474 467 526 431 b 611 557 602 505 611 531 b 608 582 611 566 609 573 b 628 621 611 596 615 608 b 769 672 660 652 711 618 b 796 743 788 691 796 717 b 793 768 796 752 795 759 b 814 806 796 782 801 793 b 955 858 845 838 897 804 b 982 929 973 877 982 903 b 979 953 982 937 981 945 b 999 992 982 968 986 979 b 1140 1045 1031 1024 1083 989 b 1168 1116 1161 1066 1168 1090 b 1138 1220 1168 1162 1145 1207 z', + }, + brassFallRoughMedium: { + x_min: 0, + x_max: 811, + y_min: 0, + y_max: 852, + ha: 852, + o: 'm 30 1220 b 0 1116 23 1207 0 1162 b 27 1045 0 1090 7 1066 b 168 992 85 989 137 1024 b 189 953 181 979 186 968 b 186 929 187 945 186 937 b 213 858 186 903 194 877 b 354 806 271 804 323 838 b 374 768 367 793 372 782 b 372 743 373 759 372 752 b 399 672 372 717 380 691 b 540 621 456 618 508 652 b 560 582 553 608 557 596 b 557 557 559 573 557 566 b 585 487 557 531 566 505 b 726 435 642 431 694 467 b 746 396 739 422 743 410 b 743 372 744 387 743 380 b 770 301 743 346 752 320 b 912 249 828 245 880 281 b 932 210 924 236 929 225 b 929 186 930 202 929 194 b 956 115 929 160 937 134 b 1097 63 1014 59 1066 95 b 1119 17 1112 49 1116 35 b 1135 0 1119 10 1128 0 b 1168 104 1153 0 1168 91 b 1138 176 1168 128 1161 153 b 996 226 1102 212 1038 199 b 988 233 994 229 991 232 b 979 264 981 240 979 252 b 982 289 981 272 982 281 b 952 361 982 312 975 338 b 811 412 916 397 852 384 l 802 419 b 793 449 795 426 793 438 b 796 475 795 458 796 467 b 766 547 796 498 789 524 b 625 598 730 583 667 570 l 616 605 b 608 635 609 612 608 624 b 611 661 609 644 611 652 b 580 733 611 684 603 710 b 439 783 544 769 481 756 l 431 791 b 422 821 423 799 422 809 b 425 847 423 829 425 838 b 395 919 425 870 418 896 b 253 971 359 955 295 942 l 245 976 b 236 1007 238 985 236 995 b 239 1032 238 1015 239 1024 b 209 1104 239 1056 232 1081 b 68 1156 173 1140 109 1128 b 59 1164 63 1158 60 1161 b 50 1201 50 1172 50 1187 l 50 1207 b 39 1227 50 1212 46 1227 b 33 1225 37 1227 35 1227 b 30 1220 33 1224 33 1223 z', + }, + brassBend: { + x_min: 0, + x_max: 392, + y_min: 0, + y_max: 282, + ha: 282, + o: 'm 282 0 b 552 72 369 0 456 23 b 564 92 560 75 564 84 l 564 383 b 541 406 564 395 554 406 b 518 383 528 406 518 395 l 518 107 b 282 46 435 65 357 46 b 46 107 207 46 130 65 l 46 383 b 23 406 46 395 36 406 b 0 383 10 406 0 395 l 0 92 b 13 72 0 84 4 75 b 282 0 108 23 196 0 z', + }, + brassMuteClosed: { + x_min: 0, + x_max: 272, + y_min: 0, + y_max: 272, + ha: 272, + o: 'm 392 219 l 219 219 l 219 392 l 173 392 l 173 219 l 0 219 l 0 173 l 173 173 l 173 0 l 219 0 l 219 173 l 392 173 z', + }, + brassMuteOpen: { + x_min: 0, + x_max: 304, + y_min: 0, + y_max: 304, + ha: 304, + o: 'm 219 0 b 438 219 340 0 438 98 b 219 438 438 340 340 438 b 0 219 98 438 0 340 b 219 0 0 98 98 0 z m 219 392 b 392 219 314 392 392 314 b 219 46 392 124 314 46 b 46 219 124 46 46 124 b 219 392 46 314 124 392 z', + }, + brassFlip: { + x_min: 0, + x_max: 379, + y_min: 0, + y_max: 282, + ha: 282, + o: 'm 523 0 b 541 9 530 0 536 3 b 546 22 544 13 546 17 b 536 42 546 29 541 36 l 36 402 b 23 406 33 405 27 406 b 0 383 12 406 0 395 l 0 23 b 23 0 0 10 10 0 b 46 23 36 0 46 10 l 46 337 l 508 4 b 523 0 513 1 517 0 z', + }, + brassJazzTurn: { + x_min: 0, + x_max: 620, + y_min: 0, + y_max: 245, + ha: 245, + o: 'm 792 190 b 765 176 780 179 772 176 b 740 190 755 176 747 183 b 629 325 727 202 644 312 b 593 347 616 338 605 347 b 562 334 583 346 575 344 b 528 298 549 323 539 310 l 406 176 b 389 168 406 176 399 168 b 374 176 384 168 379 170 b 245 325 360 192 245 325 b 200 353 232 343 219 351 b 168 340 190 353 181 350 l 17 156 b 0 121 10 147 0 132 b 16 107 0 114 4 108 b 84 143 26 107 76 137 b 118 160 92 150 108 160 b 141 143 125 160 131 154 b 265 10 147 135 253 24 b 294 0 271 3 282 0 b 321 7 305 0 315 3 b 498 160 321 7 478 158 b 521 143 505 160 513 154 b 647 10 528 135 635 24 b 675 0 652 3 664 0 b 703 7 687 0 697 3 b 874 186 713 16 855 164 b 893 220 881 196 893 212 b 873 245 890 235 883 243 b 796 194 847 245 815 213 z', + }, + brassSmear: { + x_min: 1, + x_max: 306, + y_min: 0, + y_max: 170, + ha: 170, + o: 'm 193 79 b 308 0 219 50 264 0 b 439 117 396 0 438 102 b 439 120 439 118 439 118 l 441 125 b 441 128 441 127 441 127 b 433 141 441 135 439 141 b 416 130 429 141 423 137 b 343 94 390 107 370 94 b 269 153 315 94 294 121 l 265 158 b 144 245 239 190 180 245 b 6 134 62 245 10 143 b 1 114 3 125 1 118 b 7 107 1 108 4 107 b 36 122 13 107 22 112 b 92 151 55 137 65 151 b 183 89 125 151 161 112 b 189 84 184 88 187 86 z', + }, + stringsDownBow: { + x_min: 0, + x_max: 312, + y_min: 0, + y_max: 318, + ha: 318, + o: 'm 37 458 b 0 420 17 458 0 441 l 0 17 b 17 0 0 7 9 0 l 37 0 b 55 17 46 0 55 7 l 55 253 b 225 278 55 269 140 278 b 395 253 310 278 395 269 l 395 17 b 413 0 395 7 403 0 l 432 0 b 449 17 441 0 449 7 l 449 420 b 412 458 449 441 432 458 z', + }, + stringsUpBow: { + x_min: 1, + x_max: 249, + y_min: 1, + y_max: 495, + ha: 494, + o: 'm 181 1 b 206 22 193 1 203 10 l 359 683 l 359 688 b 338 713 359 700 351 710 l 333 713 b 308 694 321 713 311 706 l 180 140 l 53 694 b 27 713 49 706 39 713 l 22 713 b 1 690 10 710 1 700 b 3 683 1 687 1 685 l 154 22 b 181 1 157 10 167 1 z', + }, + stringsHarmonic: { + x_min: 0, + x_max: 200, + y_min: 0, + y_max: 200, + ha: 200, + o: 'm 288 144 b 144 288 288 225 223 288 b 0 144 65 288 0 225 b 144 0 0 65 65 0 b 288 144 223 0 288 65 z m 144 249 b 249 144 203 249 249 203 b 144 39 249 86 203 39 b 39 144 86 39 39 86 b 144 249 39 203 86 249 z', + }, + pluckedSnapPizzicatoAbove: { + x_min: 0, + x_max: 200, + y_min: 0, + y_max: 300, + ha: 300, + o: 'm 0 144 b 144 0 0 63 65 0 b 288 144 223 0 288 63 b 167 285 288 215 235 275 l 167 432 l 121 432 l 121 285 b 0 144 52 275 0 215 z m 121 246 l 121 144 l 167 144 l 167 246 b 249 144 213 236 249 193 b 144 39 249 85 202 39 b 39 144 85 39 39 85 b 121 246 39 193 73 236 z', + }, + pluckedSnapPizzicatoBelow: { + x_min: 0, + x_max: 200, + y_min: 0, + y_max: 300, + ha: 300, + o: 'm 288 288 b 144 432 288 369 223 432 b 0 288 65 432 0 369 b 121 145 0 216 52 157 l 121 0 l 167 0 l 167 145 b 288 288 235 157 288 216 z m 167 186 l 167 288 l 121 288 l 121 186 b 39 288 75 196 39 238 b 144 393 39 347 86 393 b 249 288 203 393 249 347 b 167 186 249 238 215 196 z', + }, + pluckedLeftHandPizzicato: { + x_min: 0, + x_max: 272, + y_min: 0, + y_max: 272, + ha: 272, + o: 'm 392 219 l 219 219 l 219 392 l 173 392 l 173 219 l 0 219 l 0 173 l 173 173 l 173 0 l 219 0 l 219 173 l 392 173 z', + }, + keyboardPedalPed: { + x_min: 0, + x_max: 1019, + y_min: -8, + y_max: 555, + ha: 563, + o: 'm 413 799 b 179 749 327 798 261 789 b 0 517 107 713 0 632 b 122 376 0 454 37 376 b 240 540 189 376 240 452 b 225 586 240 579 233 586 b 204 549 213 586 212 573 b 138 480 199 527 181 480 b 85 549 96 480 85 517 l 85 554 b 353 762 89 690 230 762 b 373 752 364 762 373 760 b 351 708 373 740 360 723 b 274 546 330 675 274 585 b 353 416 274 508 333 444 b 412 304 372 390 412 351 b 382 228 412 275 403 256 b 334 190 363 202 361 200 b 147 29 271 167 147 88 b 196 -12 147 4 171 -12 b 343 108 239 -12 279 33 l 363 132 b 387 150 370 141 376 150 b 543 -4 445 150 467 -4 b 631 42 567 -4 586 0 l 668 78 b 685 89 674 84 680 89 b 696 75 688 89 690 86 b 809 -9 717 29 753 -9 b 946 66 854 -9 894 13 b 988 107 971 92 981 107 b 1002 89 994 107 996 99 b 1152 -4 1030 36 1077 -4 b 1329 248 1238 -4 1329 82 b 792 717 1329 556 1047 665 b 766 720 785 719 775 720 b 747 703 752 720 747 711 b 780 680 747 693 756 685 b 1223 222 1028 621 1223 504 b 1152 39 1223 122 1205 39 b 1073 229 1104 39 1073 132 b 1132 423 1073 314 1086 377 b 1142 442 1140 432 1142 436 b 1126 458 1142 451 1136 458 b 1093 446 1119 458 1109 455 b 975 216 1022 408 975 337 l 975 190 b 943 121 975 160 972 150 b 852 69 899 76 877 69 b 776 148 816 69 786 117 b 773 163 775 154 773 158 b 786 177 773 167 776 170 l 801 187 b 937 366 867 235 937 284 b 844 454 937 422 900 454 b 665 217 711 454 665 331 b 671 153 665 197 667 176 l 671 147 b 662 134 671 143 670 140 b 605 111 639 118 625 111 b 521 160 572 111 546 135 b 451 203 497 184 474 197 b 426 212 435 207 426 206 b 436 230 426 216 429 220 b 510 389 464 269 510 340 b 429 521 510 435 480 462 b 369 629 387 570 369 599 b 402 720 369 648 384 691 b 462 763 425 759 446 763 b 611 624 540 763 611 704 b 564 575 611 592 590 575 b 501 602 540 575 520 582 b 474 622 492 611 487 622 b 459 603 465 622 459 615 b 603 471 459 570 510 471 b 711 588 670 471 711 524 b 422 799 711 742 554 799 z m 815 403 b 848 343 838 403 848 383 b 780 226 848 295 824 261 b 765 217 773 220 768 217 b 759 228 762 217 759 220 b 756 282 757 245 756 262 b 815 403 756 346 772 403 z m 1405 124 b 1344 62 1369 124 1344 98 b 1405 0 1344 26 1369 0 b 1467 62 1441 0 1467 26 b 1405 124 1467 98 1441 124 z', + }, + keyboardPedalUp: { + x_min: 0, + x_max: 450, + y_min: 0, + y_max: 450, + ha: 450, + o: 'm 582 396 b 516 367 554 396 533 384 b 465 340 495 347 487 340 l 458 340 b 412 377 432 340 412 348 b 432 409 412 387 419 396 l 438 415 b 490 429 451 428 464 429 b 575 501 534 429 575 452 b 501 575 575 541 541 575 b 429 490 452 575 429 534 b 415 438 429 464 428 451 l 409 432 b 377 412 396 419 387 412 b 340 458 348 412 340 432 l 340 465 b 367 516 340 487 347 495 b 396 582 384 533 396 554 b 324 648 396 625 363 648 b 252 582 285 648 252 625 b 281 516 252 554 264 533 b 308 465 301 495 308 487 l 308 458 b 271 412 308 432 300 412 b 239 432 261 412 252 419 l 233 438 b 219 490 220 451 219 464 b 147 575 219 534 196 575 b 73 501 107 575 73 541 b 158 429 73 452 114 429 b 210 415 184 429 197 428 l 216 409 b 236 377 229 396 236 387 b 190 340 236 348 216 340 l 183 340 b 132 367 161 340 153 347 b 66 396 115 384 94 396 b 0 324 23 396 0 363 b 66 252 0 285 23 252 b 132 281 94 252 115 264 b 183 308 153 301 161 308 l 190 308 b 236 271 216 308 236 300 b 216 239 236 261 229 252 l 210 233 b 158 219 197 220 184 219 b 73 147 114 219 73 196 b 147 73 73 107 107 73 b 219 158 196 73 219 114 b 233 210 219 184 220 197 l 239 216 b 271 236 252 229 261 236 b 308 190 300 236 308 216 l 308 183 b 281 132 308 161 301 153 b 252 66 264 115 252 94 b 324 0 252 23 285 0 b 396 66 363 0 396 23 b 367 132 396 94 384 115 b 340 183 347 153 340 161 l 340 190 b 377 236 340 216 348 236 b 409 216 387 236 396 229 l 415 210 b 429 158 428 197 429 184 b 501 73 429 114 452 73 b 575 147 541 73 575 107 b 490 219 575 196 534 219 b 438 233 464 219 451 220 l 432 239 b 412 271 419 252 412 261 b 458 308 412 300 432 308 l 465 308 b 516 281 487 308 495 301 b 582 252 533 264 554 252 b 648 324 625 252 648 285 b 582 396 648 363 625 396 z m 324 271 b 271 324 291 271 271 291 b 324 377 271 357 291 377 b 377 324 357 377 377 357 b 324 271 377 291 357 271 z', + }, + pictChokeCymbal: { + x_min: 1, + x_max: 152, + y_min: 2, + y_max: 251, + ha: 249, + o: 'm 104 361 b 1 271 42 361 1 321 b 82 190 1 222 35 190 b 122 160 118 190 122 160 b 125 144 124 154 125 150 b 102 88 125 124 115 105 b 37 32 78 56 40 35 b 26 17 32 29 26 26 l 27 16 b 37 3 29 6 33 3 b 181 102 85 3 158 66 b 219 239 210 147 219 197 l 219 249 b 104 361 219 317 170 361 z', + }, + wiggleArpeggiatoUp: { + x_min: -33, + x_max: 292, + y_min: 0, + y_max: 119, + ha: 119, + o: 'm 130 171 b -39 68 16 171 -14 91 b -48 53 -45 62 -48 58 b -29 42 -48 46 -39 42 b -10 46 -23 42 -16 43 b 56 63 12 56 29 63 b 248 0 121 63 135 0 b 419 127 361 0 410 104 b 420 132 420 130 420 131 b 412 140 420 137 416 140 b 386 130 403 140 392 134 b 334 107 367 117 353 107 b 318 108 330 107 324 107 b 240 138 289 112 265 128 b 130 171 209 153 168 171 z', + }, + arrowheadBlackUp: { + x_min: 0, + x_max: 228, + y_min: 0, + y_max: 299, + ha: 299, + o: 'm 166 431 b 0 20 111 274 0 30 b 16 0 0 12 6 0 l 17 1 b 166 50 43 16 160 50 b 310 1 171 50 289 13 l 311 0 b 328 20 321 0 328 12 b 166 431 328 30 220 274 z', + }, + arrowheadBlackDown: { + x_min: 0, + x_max: 228, + y_min: 0, + y_max: 299, + ha: 299, + o: 'm 166 0 b 328 410 220 157 328 400 b 311 431 328 419 321 431 l 310 429 b 166 380 289 418 171 380 b 17 429 160 380 43 415 l 16 431 b 0 410 6 431 0 419 b 166 0 0 400 111 157 z', + }, + arpeggiatoUp: { + x_min: 1, + x_max: 229, + y_min: 7, + y_max: 1511, + ha: 1504, + o: 'm 219 1848 l 330 1848 l 164 2176 l 1 1848 l 121 1848 b 92 1778 115 1822 101 1800 l 89 1773 b 59 1668 75 1741 59 1702 b 96 1555 59 1614 76 1580 b 99 1551 98 1554 99 1551 l 102 1547 b 124 1496 115 1531 124 1515 b 122 1482 124 1492 124 1488 b 92 1404 118 1453 102 1428 b 59 1293 78 1372 59 1332 b 105 1172 59 1234 81 1198 b 124 1120 118 1155 124 1143 l 122 1113 b 122 1110 122 1113 122 1112 b 92 1032 118 1081 102 1057 b 59 922 78 1001 59 960 b 115 792 59 855 86 816 b 124 760 121 782 124 773 b 122 744 124 756 124 750 b 92 667 118 716 102 693 b 59 556 78 635 59 595 b 108 433 59 495 82 458 b 124 389 117 420 124 408 b 122 374 124 384 124 379 b 92 298 118 346 102 323 l 89 292 b 59 186 75 261 59 222 b 163 19 59 73 140 42 b 177 10 168 13 173 10 b 189 29 184 10 189 19 b 184 48 189 35 187 42 b 167 114 174 69 167 85 b 230 305 167 179 229 193 b 181 423 230 357 209 396 b 167 484 173 442 167 458 b 230 675 167 547 229 563 b 179 796 230 729 206 769 b 167 850 171 812 167 827 b 230 1040 167 913 229 929 b 183 1158 230 1092 209 1130 b 167 1220 173 1178 167 1194 b 230 1411 167 1284 229 1300 b 186 1526 230 1462 210 1499 b 167 1594 176 1529 167 1584 b 230 1786 167 1659 229 1673 b 219 1848 230 1809 226 1829 z', + }, + arpeggiatoDown: { + x_min: 1, + x_max: 229, + y_min: -4, + y_max: 1500, + ha: 1504, + o: 'm 219 323 b 230 384 226 341 230 361 b 167 576 229 497 167 511 b 186 644 167 586 176 641 b 230 759 210 671 230 708 b 167 950 229 870 167 886 b 183 1012 167 976 173 992 b 230 1130 209 1040 230 1079 b 167 1320 229 1241 167 1257 b 179 1374 167 1344 171 1358 b 230 1495 206 1401 230 1441 b 167 1686 229 1607 167 1623 b 181 1747 167 1712 173 1728 b 230 1865 209 1774 230 1813 b 167 2056 229 1977 167 1992 b 184 2123 167 2085 174 2101 b 189 2141 187 2128 189 2136 b 177 2160 189 2151 184 2160 b 163 2151 173 2160 168 2157 b 59 1984 140 2128 59 2097 b 89 1878 59 1948 75 1909 l 92 1872 b 122 1796 102 1848 118 1824 b 124 1781 124 1791 124 1786 b 108 1737 124 1763 117 1750 b 59 1614 82 1712 59 1675 b 92 1503 59 1575 78 1535 b 122 1426 102 1477 118 1454 b 124 1410 124 1420 124 1414 b 115 1378 124 1397 121 1388 b 59 1248 86 1354 59 1315 b 92 1138 59 1210 78 1169 b 122 1060 102 1113 118 1089 b 122 1057 122 1058 122 1058 l 124 1050 b 105 998 124 1027 118 1015 b 59 877 81 972 59 936 b 92 766 59 838 78 798 b 122 688 102 742 118 717 b 124 674 124 683 124 678 b 102 624 124 655 115 639 l 99 619 b 96 615 99 619 98 616 b 59 503 76 590 59 556 b 89 397 59 468 75 429 l 92 392 b 121 323 101 370 115 348 l 1 323 l 164 -6 l 330 323 z', + }, + repeat1Bar: { + x_min: 0, + x_max: 532, + y_min: -250, + y_max: 279, + ha: 529, + o: 'm 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z m 89 288 b 0 197 40 288 0 248 b 89 108 0 148 40 108 b 180 197 140 108 180 148 b 89 288 180 248 140 288 z m 675 -71 b 586 -161 626 -71 586 -111 b 675 -251 586 -210 626 -251 b 766 -161 726 -251 766 -210 b 675 -71 766 -111 726 -71 z', + }, + repeat2Bars: { + x_min: 0, + x_max: 762, + y_min: -250, + y_max: 279, + ha: 529, + o: 'm 1090 380 b 1097 395 1094 386 1097 390 b 1089 402 1097 399 1094 402 l 936 402 b 910 380 927 402 920 393 l 336 -340 b 331 -350 333 -343 331 -347 b 343 -360 331 -356 336 -360 l 485 -360 b 516 -340 498 -360 508 -348 z m 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z m 89 288 b 0 197 40 288 0 248 b 89 108 0 148 40 108 b 180 197 140 108 180 148 b 89 288 180 248 140 288 z m 1007 -71 b 917 -161 958 -71 917 -111 b 1007 -251 917 -210 958 -251 b 1097 -161 1057 -251 1097 -210 b 1007 -71 1097 -111 1057 -71 z', + }, + repeat4Bars: { + x_min: 0, + x_max: 1232, + y_min: -250, + y_max: 279, + ha: 529, + o: 'm 1767 380 b 1774 395 1771 386 1774 390 b 1765 402 1774 399 1771 402 l 1613 402 b 1587 380 1604 402 1597 393 l 1012 -340 b 1008 -350 1009 -343 1008 -347 b 1020 -360 1008 -356 1012 -360 l 1162 -360 b 1192 -340 1175 -360 1185 -348 z m 1436 380 b 1443 395 1440 386 1443 390 b 1434 402 1443 399 1440 402 l 1282 402 b 1256 380 1273 402 1266 393 l 681 -340 b 677 -350 678 -343 677 -347 b 688 -360 677 -356 681 -360 l 831 -360 b 861 -340 844 -360 854 -348 z m 1090 380 b 1097 395 1094 386 1097 390 b 1089 402 1097 399 1094 402 l 936 402 b 910 380 927 402 920 393 l 336 -340 b 331 -350 333 -343 331 -347 b 343 -360 331 -356 336 -360 l 485 -360 b 516 -340 498 -360 508 -348 z m 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z m 89 288 b 0 197 40 288 0 248 b 89 108 0 148 40 108 b 180 197 140 108 180 148 b 89 288 180 248 140 288 z m 1683 -71 b 1594 -161 1634 -71 1594 -111 b 1683 -251 1594 -210 1634 -251 b 1774 -161 1734 -251 1774 -210 b 1683 -71 1774 -111 1734 -71 z', + }, + repeatBarSlash: { + x_min: 0, + x_max: 532, + y_min: -250, + y_max: 279, + ha: 529, + o: 'm 759 380 b 766 395 763 386 766 390 b 757 402 766 399 763 402 l 605 402 b 579 380 596 402 589 393 l 4 -340 b 0 -350 1 -343 0 -347 b 12 -360 0 -356 4 -360 l 154 -360 b 184 -340 167 -360 177 -348 z', + }, + csymDiminished: { + x_min: 0, + x_max: 473, + y_min: 0, + y_max: 473, + ha: 473, + o: 'm 341 681 b 0 341 153 681 0 530 b 341 0 0 153 153 0 b 681 341 530 0 681 153 b 341 681 681 530 530 681 z m 341 618 b 618 341 495 618 618 495 b 341 63 618 189 494 63 b 63 341 187 63 63 187 b 341 618 63 494 189 618 z', + }, + csymHalfDiminished: { + x_min: -16, + x_max: 488, + y_min: -15, + y_max: 489, + ha: 504, + o: 'm 703 660 l 658 704 l 557 603 b 340 681 498 652 422 681 b -1 341 151 681 -1 530 b 78 124 -1 259 29 183 l -23 23 l 22 -22 l 122 79 b 340 0 181 30 258 0 b 680 341 528 0 680 153 b 602 559 680 423 651 500 z m 62 341 b 340 618 62 494 187 618 b 513 559 403 618 464 598 l 122 168 b 62 341 84 217 62 278 z m 616 341 b 340 63 616 189 492 63 b 167 124 276 63 216 85 l 557 514 b 616 341 596 465 616 405 z', + }, + csymAugmented: { + x_min: 0, + x_max: 395, + y_min: 1, + y_max: 396, + ha: 395, + o: 'm 569 318 l 317 318 l 317 570 l 253 570 l 253 318 l 0 318 l 0 255 l 253 255 l 253 1 l 317 1 l 317 255 l 569 255 z', + }, + csymMajorSeventh: { + x_min: 0, + x_max: 558, + y_min: 1, + y_max: 477, + ha: 476, + o: 'm 402 687 l 0 1 l 804 1 z m 402 562 l 693 65 l 111 65 z', + }, + csymMinor: { + x_min: 0, + x_max: 325, + y_min: 216, + y_max: 260, + ha: 44, + o: 'm 468 374 l 0 374 l 0 311 l 468 311 z', + }, + csymParensLeftTall: { + x_min: 1, + x_max: 185, + y_min: 0, + y_max: 997, + ha: 997, + o: 'm 266 48 b 261 65 266 55 264 62 b 92 719 157 212 92 400 b 262 1371 92 1037 154 1228 b 266 1394 266 1378 266 1394 l 266 1424 b 264 1436 266 1431 266 1436 b 259 1434 262 1436 259 1434 b 1 719 84 1261 1 1011 b 259 1 1 429 79 177 b 264 0 261 0 262 0 b 266 9 265 0 266 6 z', + }, + csymParensRightTall: { + x_min: -20, + x_max: 164, + y_min: 0, + y_max: 997, + ha: 997, + o: 'm -29 9 b -26 0 -29 6 -27 0 b -22 1 -24 0 -23 0 b 236 719 158 177 236 429 b -22 1434 236 1011 154 1261 b -26 1436 -22 1434 -24 1436 b -29 1424 -29 1436 -29 1431 l -29 1394 b -24 1371 -29 1394 -29 1378 b 145 719 84 1228 145 1037 b -23 65 145 400 81 212 b -29 48 -26 62 -29 55 z', + }, + csymBracketLeftTall: { + x_min: 0, + x_max: 155, + y_min: 0, + y_max: 1000, + ha: 1000, + o: 'm 217 0 b 223 9 220 0 223 4 l 223 37 b 217 46 223 42 220 46 l 92 46 l 92 1394 l 217 1394 b 223 1403 220 1394 223 1398 l 223 1431 b 217 1440 223 1436 220 1440 l 6 1440 b 0 1436 3 1440 0 1439 l 0 4 b 6 0 0 1 3 0 z', + }, + csymBracketRightTall: { + x_min: 1, + x_max: 156, + y_min: 0, + y_max: 1000, + ha: 1000, + o: 'm 219 0 b 225 4 222 0 225 1 l 225 1436 b 219 1440 225 1439 222 1440 l 7 1440 b 1 1431 4 1440 1 1436 l 1 1403 b 7 1394 1 1398 4 1394 l 132 1394 l 132 46 l 7 46 b 1 37 4 46 1 42 l 1 9 b 7 0 1 4 4 0 z', + }, + csymParensLeftVeryTall: { + x_min: 0, + x_max: 122, + y_min: 0, + y_max: 993, + ha: 993, + o: 'm 176 32 b 171 49 176 39 174 46 b 60 716 104 194 60 399 b 173 1382 60 1032 101 1241 b 176 1405 176 1390 176 1405 l 176 1427 b 173 1430 176 1428 174 1430 b 0 716 40 1297 0 978 b 170 3 0 428 50 179 b 171 0 170 1 170 0 b 176 6 173 0 176 4 z', + }, + csymParensRightVeryTall: { + x_min: -15, + x_max: 107, + y_min: 0, + y_max: 993, + ha: 993, + o: 'm -22 6 b -17 0 -22 4 -19 0 b -16 3 -16 0 -16 1 b 154 716 104 179 154 428 b -19 1430 154 978 114 1297 b -22 1427 -20 1430 -22 1428 l -22 1405 b -19 1382 -22 1405 -22 1390 b 94 716 53 1241 94 1032 b -17 49 94 399 50 194 b -22 32 -20 46 -22 39 z', + }, + csymDiagonalArrangementSlash: { + x_min: 0, + x_max: 999, + y_min: 0, + y_max: 1000, + ha: 1000, + o: 'm 1439 1380 l 1377 1440 l 0 60 l 62 0 z', + }, + accSagittal5v7KleismaUp: { + x_min: 0, + x_max: 156, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 -35 b 135 -112 68 -86 99 -112 b 225 68 194 -112 225 -53 l 180 68 b 144 -4 180 20 168 -4 b 122 0 138 -4 131 -3 b 23 248 86 14 52 96 l 0 248 z', + }, + accSagittal5v7KleismaDown: { + x_min: 0, + x_max: 156, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 23 -248 b 122 0 52 -96 86 -14 b 144 4 131 3 138 4 b 180 -68 168 4 180 -20 l 225 -68 b 135 112 225 53 194 112 b 45 35 99 112 68 86 l 45 517 l 0 517 z', + }, + accSagittal5CommaUp: { + x_min: 0, + x_max: 156, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 225 -517 l 225 248 l 203 248 l 0 -112 l 0 -284 l 180 33 l 180 -517 z', + }, + accSagittal5CommaDown: { + x_min: 0, + x_max: 156, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 180 517 l 180 -33 l 0 284 l 0 112 l 203 -248 l 225 -248 l 225 517 z', + }, + accSagittal7CommaUp: { + x_min: 0, + x_max: 156, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 248 l 0 -517 l 45 -517 l 45 112 l 89 112 b 180 -68 150 112 180 53 l 180 -248 l 225 -248 l 225 68 b 135 248 225 187 194 248 z', + }, + accSagittal7CommaDown: { + x_min: 0, + x_max: 156, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 135 -248 b 225 -68 194 -248 225 -187 l 225 248 l 180 248 l 180 68 b 89 -112 180 -53 150 -112 l 45 -112 l 45 517 l 0 517 l 0 -248 z', + }, + accSagittal25SmallDiesisUp: { + x_min: 0, + x_max: 250, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -157 l 0 -259 l 315 -89 l 315 -517 l 360 -517 l 360 248 l 337 248 l 0 68 l 0 -33 l 315 135 l 315 10 z', + }, + accSagittal25SmallDiesisDown: { + x_min: 0, + x_max: 250, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 315 -10 l 315 -135 l 0 33 l 0 -68 l 337 -248 l 360 -248 l 360 517 l 315 517 l 315 89 l 0 259 l 0 157 z', + }, + accSagittal35MediumDiesisUp: { + x_min: 0, + x_max: 281, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -284 l 180 33 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -68 330 112 360 53 l 360 -248 l 405 -248 l 405 68 b 315 248 405 187 374 248 l 203 248 l 0 -112 z', + }, + accSagittal35MediumDiesisDown: { + x_min: 0, + x_max: 281, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 112 l 203 -248 l 315 -248 b 405 -68 374 -248 405 -187 l 405 248 l 360 248 l 360 68 b 271 -112 360 -53 330 -112 l 225 -112 l 225 517 l 180 517 l 180 -33 l 0 284 z', + }, + accSagittal11MediumDiesisUp: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 225 53 l 225 -517 l 271 -517 l 271 53 l 495 -248 l 495 -89 l 248 248 l 0 -89 l 0 -248 z', + }, + accSagittal11MediumDiesisDown: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 248 l 0 89 l 248 -248 l 495 89 l 495 248 l 271 -53 l 271 517 l 225 517 l 225 -53 z', + }, + accSagittal11LargeDiesisUp: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 112 l 315 112 b 449 -68 405 112 449 53 l 449 -248 l 495 -248 l 495 68 b 360 248 495 187 449 248 l 135 248 b 0 68 45 248 0 187 z', + }, + accSagittal11LargeDiesisDown: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 360 -248 b 495 -68 449 -248 495 -187 l 495 248 l 449 248 l 449 68 b 315 -112 449 -53 405 -112 l 271 -112 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z', + }, + accSagittal35LargeDiesisUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 248 -248 l 540 112 l 540 274 l 271 -58 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z', + }, + accSagittal35LargeDiesisDown: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 248 -248 l 540 112 l 540 274 l 269 -58 l 269 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z', + }, + accSagittalSharp25SDown: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 b 112 -112 0 -53 36 -112 l 135 -112 l 135 -517 l 180 -517 l 180 -89 b 248 26 206 -65 229 -27 b 315 -89 264 -27 287 -65 l 315 -517 l 360 -517 l 360 -112 l 383 -112 b 495 68 458 -112 495 -53 l 449 68 b 399 -4 449 20 433 -4 b 248 248 297 -4 261 171 b 122 0 216 96 176 14 b 94 -4 112 -3 102 -4 b 45 68 60 -4 45 20 z', + }, + accSagittalFlat25SUp: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 45 -68 b 94 4 45 -20 60 4 b 122 0 102 4 112 3 b 248 -248 176 -14 216 -96 b 399 4 261 -171 297 4 b 449 -68 433 4 449 -20 l 495 -68 b 383 112 495 53 458 112 l 360 112 l 360 517 l 315 517 l 315 89 b 248 -26 287 65 264 27 b 180 89 229 27 206 65 l 180 517 l 135 517 l 135 112 l 112 112 b 0 -68 36 112 0 53 z', + }, + accSagittalSharp7CDown: { + x_min: 0, + x_max: 250, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 112 l 89 112 b 180 104 124 112 154 109 l 180 -517 l 225 -517 l 225 89 b 315 -68 285 60 315 9 l 315 -248 l 360 -248 l 360 68 b 135 248 360 187 285 248 l 0 248 z', + }, + accSagittalFlat7CUp: { + x_min: 0, + x_max: 250, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 135 -248 b 360 -68 285 -248 360 -187 l 360 248 l 315 248 l 315 68 b 225 -89 315 -9 285 -60 l 225 517 l 180 517 l 180 -104 b 89 -112 154 -109 124 -112 l 45 -112 l 45 517 l 0 517 z', + }, + accSagittalSharp5CDown: { + x_min: 0, + x_max: 281, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -517 l 45 71 l 180 -56 l 180 -517 l 225 -517 l 225 -98 l 405 -268 l 405 -112 l 23 248 l 0 248 l 0 -517 z', + }, + accSagittalFlat5CUp: { + x_min: 0, + x_max: 281, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 517 l 0 -248 l 23 -248 l 405 112 l 405 268 l 225 98 l 225 517 l 180 517 l 180 56 l 45 -71 l 45 517 z', + }, + accSagittalSharp5v7kDown: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -112 l 0 -276 l 135 -82 l 135 -517 l 180 -517 l 180 -17 l 271 112 l 315 112 l 315 -517 l 360 -517 l 360 107 b 449 -68 420 89 449 30 l 449 -248 l 495 -248 l 495 68 b 360 248 495 189 449 248 l 248 248 z', + }, + accSagittalFlat5v7kUp: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 248 -248 l 360 -248 b 495 -68 449 -248 495 -189 l 495 248 l 449 248 l 449 68 b 360 -107 449 -30 420 -89 l 360 517 l 315 517 l 315 -112 l 271 -112 l 180 17 l 180 517 l 135 517 l 135 82 l 0 276 l 0 112 z', + }, + accSagittalSharp: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 180 -53 l 180 -517 l 225 -517 l 225 0 l 292 85 l 360 0 l 360 -517 l 405 -517 l 405 -53 l 585 -274 l 585 -112 l 292 248 l 0 -112 l 0 -274 z', + }, + accSagittalFlat: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 274 l 0 112 l 292 -248 l 585 112 l 585 274 l 405 53 l 405 517 l 360 517 l 360 0 l 292 -85 l 225 0 l 225 517 l 180 517 l 180 53 z', + }, + accSagittalSharp5v7kUp: { + x_min: 0, + x_max: 312, + y_min: -361, + y_max: 172, + ha: 533, + o: 'm 45 -517 l 45 -10 b 135 -92 68 -48 98 -75 l 135 -520 l 180 -520 l 180 -108 b 248 -115 203 -112 225 -115 b 271 -112 256 -115 264 -115 l 271 -517 l 315 -517 l 315 -107 b 449 68 405 -89 449 -30 l 405 68 b 297 -4 405 19 369 -4 b 23 248 131 -4 56 85 l 0 248 l 0 -517 z', + }, + accSagittalFlat5v7kDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 361, + ha: 533, + o: 'm 0 517 l 0 -248 l 23 -248 b 297 4 56 -85 131 4 b 405 -68 369 4 405 -19 l 449 -68 b 315 107 449 30 405 89 l 315 517 l 271 517 l 271 112 b 248 115 264 115 256 115 b 180 108 225 115 203 112 l 180 520 l 135 520 l 135 92 b 45 10 98 75 68 48 l 45 517 z', + }, + accSagittalSharp5CUp: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -266 l 135 -153 l 135 -517 l 180 -517 l 180 -115 l 271 -39 l 271 -517 l 315 -517 l 315 0 l 405 75 l 405 -517 l 449 -517 l 449 248 l 428 248 l 0 -112 z', + }, + accSagittalFlat5CDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 112 l 428 -248 l 449 -248 l 449 517 l 405 517 l 405 -75 l 315 0 l 315 517 l 271 517 l 271 39 l 180 115 l 180 517 l 135 517 l 135 153 l 0 266 z', + }, + accSagittalSharp7CUp: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 112 l 135 112 l 135 -517 l 180 -517 l 180 108 b 271 89 213 105 243 99 l 271 -517 l 315 -517 l 315 73 b 405 -68 374 45 405 -3 l 405 -248 l 449 -248 l 449 68 b 135 248 449 187 346 248 l 0 248 z', + }, + accSagittalFlat7CDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 135 -248 b 449 -68 346 -248 449 -187 l 449 248 l 405 248 l 405 68 b 315 -73 405 3 374 -45 l 315 517 l 271 517 l 271 -89 b 180 -108 243 -99 213 -105 l 180 517 l 135 517 l 135 -112 l 45 -112 l 45 517 l 0 517 z', + }, + accSagittalSharp25SUp: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -30 l 495 143 l 495 14 l 0 -157 l 0 -255 l 225 -177 l 225 -517 l 271 -517 l 271 -161 l 360 -130 l 360 -517 l 405 -517 l 405 -115 l 495 -84 l 495 -517 l 540 -517 l 540 248 l 517 248 l 0 68 z', + }, + accSagittalFlat25SDown: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 l 517 -248 l 540 -248 l 540 517 l 495 517 l 495 84 l 405 115 l 405 517 l 360 517 l 360 130 l 271 161 l 271 517 l 225 517 l 225 177 l 0 255 l 0 157 l 495 -14 l 495 -143 l 0 30 z', + }, + accSagittalSharp35MUp: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -112 l 0 -274 l 135 -108 l 135 -517 l 180 -517 l 180 -53 l 271 58 l 271 -517 l 315 -517 l 315 112 l 360 112 b 405 109 376 112 390 112 l 405 -517 l 449 -517 l 449 96 b 540 -68 510 72 540 17 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 z', + }, + accSagittalFlat35MDown: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 292 -248 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 449 -96 540 -17 510 -72 l 449 517 l 405 517 l 405 -109 b 360 -112 390 -112 376 -112 l 315 -112 l 315 517 l 271 517 l 271 -58 l 180 53 l 180 517 l 135 517 l 135 108 l 0 274 l 0 112 z', + }, + accSagittalSharp11MUp: { + x_min: 0, + x_max: 469, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -112 l 0 -271 l 180 -79 l 180 -517 l 225 -517 l 225 -30 l 315 65 l 315 -517 l 360 -517 l 360 65 l 449 -30 l 449 -517 l 495 -517 l 495 -79 l 675 -271 l 675 -112 l 337 248 z', + }, + accSagittalFlat11MDown: { + x_min: 0, + x_max: 469, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 337 -248 l 675 112 l 675 271 l 495 79 l 495 517 l 449 517 l 449 30 l 360 -65 l 360 517 l 315 517 l 315 -65 l 225 30 l 225 517 l 180 517 l 180 79 l 0 271 l 0 112 z', + }, + accSagittalSharp11LUp: { + x_min: 0, + x_max: 469, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 112 l 449 112 l 449 -517 l 495 -517 l 495 104 b 631 -68 585 82 631 26 l 631 -248 l 675 -248 l 675 68 b 449 248 675 187 600 248 l 225 248 b 0 68 75 248 0 187 z', + }, + accSagittalFlat11LDown: { + x_min: 0, + x_max: 469, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 449 -248 b 675 -68 600 -248 675 -187 l 675 248 l 631 248 l 631 68 b 495 -104 631 -26 585 -82 l 495 517 l 449 517 l 449 -112 l 360 -112 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z', + }, + accSagittalSharp35LUp: { + x_min: 0, + x_max: 500, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 71 l 452 -17 l 452 -517 l 495 -517 l 495 -56 l 720 -268 l 720 -112 l 337 248 l 225 248 b 0 68 75 248 0 187 z', + }, + accSagittalFlat35LDown: { + x_min: 0, + x_max: 500, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 337 -248 l 720 112 l 720 268 l 495 56 l 495 517 l 452 517 l 452 17 l 360 -71 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z', + }, + accSagittalDoubleSharp25SDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 b 135 -112 0 -53 45 -112 b 243 -62 180 -112 215 -95 l 89 -503 l 143 -517 l 292 -82 l 445 -517 l 495 -503 l 343 -62 b 449 -112 372 -95 408 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 315 148 b 112 -4 274 148 236 -4 b 45 68 68 -4 45 20 z', + }, + accSagittalDoubleFlat25SUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 45 -68 b 112 4 45 -20 68 4 b 292 -248 236 4 274 -148 b 475 4 315 -148 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 b 343 62 408 112 372 95 l 495 503 l 445 517 l 292 82 l 143 517 l 89 503 l 243 62 b 135 112 215 95 180 112 b 0 -68 45 112 0 53 z', + }, + accSagittalDoubleSharp7CDown: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -503 l 52 -517 l 203 -82 l 354 -517 l 405 -503 l 230 0 l 271 108 b 495 -68 420 92 495 35 l 495 -248 l 540 -248 l 540 68 b 225 248 540 187 435 248 l 89 248 l 89 112 l 135 112 l 174 0 z m 213 112 l 203 82 l 192 112 z', + }, + accSagittalDoubleFlat7CUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 174 0 l 135 -112 l 89 -112 l 89 -248 l 225 -248 b 540 -68 435 -248 540 -187 l 540 248 l 495 248 l 495 68 b 271 -108 495 -35 420 -92 l 230 0 l 405 503 l 354 517 l 203 82 l 52 517 l 0 503 z m 192 -112 l 203 -82 l 213 -112 z', + }, + accSagittalDoubleSharp5CDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 405 -503 l 230 0 l 232 4 l 585 -264 l 585 -112 l 112 248 l 89 248 l 89 112 l 151 68 l 174 0 l 0 -503 l 52 -517 l 203 -82 l 354 -517 z', + }, + accSagittalDoubleFlat5CUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 354 517 l 203 82 l 52 517 l 0 503 l 174 0 l 151 -68 l 89 -112 l 89 -248 l 112 -248 l 585 112 l 585 264 l 232 -4 l 230 0 l 405 503 z', + }, + accSagittalDoubleSharp5v7kDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -274 l 252 35 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 360 112 b 540 -68 480 112 540 53 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 l 0 -112 z', + }, + accSagittalDoubleFlat5v7kUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 112 l 292 -248 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 360 -112 540 -53 480 -112 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 252 -35 l 0 274 z', + }, + accSagittalDoubleSharp: { + x_min: 0, + x_max: 469, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 540 -503 l 366 0 l 380 45 l 675 -271 l 675 -112 l 337 248 l 0 -112 l 0 -271 l 295 45 l 310 0 l 135 -503 l 186 -517 l 337 -82 l 488 -517 z', + }, + accSagittalDoubleFlat: { + x_min: 0, + x_max: 469, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 488 517 l 337 82 l 186 517 l 135 503 l 310 0 l 295 -45 l 0 271 l 0 112 l 337 -248 l 675 112 l 675 271 l 380 -45 l 366 0 l 540 503 z', + }, + accSagittal7v11KleismaUp: { + x_min: 0, + x_max: 219, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 68 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 -45 b 248 -112 200 -89 225 -112 b 315 68 292 -112 315 -53 l 271 68 b 248 -4 271 20 264 -4 b 236 0 245 -4 240 -3 b 157 248 213 14 187 96 b 78 0 127 96 101 14 b 65 -4 73 -3 68 -4 b 45 68 50 -4 45 20 l 0 68 b 68 -112 0 -53 23 -112 z', + }, + accSagittal7v11KleismaDown: { + x_min: 0, + x_max: 219, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 68 112 b 0 -68 23 112 0 53 l 45 -68 b 65 4 45 -20 50 4 b 78 0 68 4 73 3 b 157 -248 101 -14 127 -96 b 236 0 187 -96 213 -14 b 248 4 240 3 245 4 b 271 -68 264 4 271 -20 l 315 -68 b 248 112 315 53 292 112 b 180 45 225 112 200 89 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 z', + }, + accSagittal17CommaUp: { + x_min: 0, + x_max: 281, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 -40 b 315 -118 248 -92 279 -118 b 405 62 374 -118 405 -59 l 360 62 b 324 -10 360 14 348 -10 b 302 -6 318 -10 311 -9 b 206 217 268 9 235 84 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z', + }, + accSagittal17CommaDown: { + x_min: 0, + x_max: 281, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 206 -217 b 302 6 235 -84 268 -9 b 324 10 311 9 318 10 b 360 -62 348 10 360 -14 l 405 -62 b 315 118 405 59 374 118 b 225 40 279 118 248 92 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z', + }, + accSagittal55CommaUp: { + x_min: 0, + x_max: 219, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 248 l 0 -517 l 45 -517 l 45 58 l 315 -274 l 315 -112 l 23 248 z', + }, + accSagittal55CommaDown: { + x_min: 0, + x_max: 219, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 23 -248 l 315 112 l 315 274 l 45 -58 l 45 517 l 0 517 l 0 -248 z', + }, + accSagittal7v11CommaUp: { + x_min: 0, + x_max: 188, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -248 l 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 248 l 135 248 b 0 68 45 248 0 187 z', + }, + accSagittal7v11CommaDown: { + x_min: 0, + x_max: 188, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 135 -248 0 -187 45 -248 l 271 -248 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z', + }, + accSagittal5v11SmallDiesisUp: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 73 l 0 -248 l 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 -40 b 360 -118 295 -92 325 -118 b 449 62 420 -118 449 -59 l 405 62 b 369 -10 405 14 393 -10 b 348 -6 363 -10 356 -9 b 251 217 312 9 279 84 l 248 248 l 135 248 b 0 73 45 248 0 189 z', + }, + accSagittal5v11SmallDiesisDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -73 b 135 -248 0 -189 45 -248 l 248 -248 l 251 -217 b 348 6 279 -84 312 -9 b 369 10 356 9 363 10 b 405 -62 393 10 405 -14 l 449 -62 b 360 118 449 59 420 118 b 271 40 325 118 295 92 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 l 0 248 z', + }, + accSagittalSharp5v11SDown: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 112 -23 45 -84 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 b 242 37 203 -23 225 -3 b 315 -89 262 -23 285 -63 l 315 -517 l 360 -517 l 360 -112 l 383 -112 b 495 68 458 -112 495 -53 l 449 68 b 399 -4 449 20 433 -4 b 248 248 297 -4 261 171 b 157 68 222 127 192 68 l 89 68 b 0 -203 30 68 0 -23 z', + }, + accSagittalFlat5v11SUp: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 89 -68 0 23 30 -68 l 157 -68 b 248 -248 192 -68 222 -127 b 399 4 261 -171 297 4 b 449 -68 433 4 449 -20 l 495 -68 b 383 112 495 53 458 112 l 360 112 l 360 517 l 315 517 l 315 89 b 242 -37 285 63 262 23 b 180 23 225 3 203 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 84 z', + }, + accSagittalSharp7v11CDown: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 89 -112 l 89 -517 l 135 -517 l 135 -95 b 206 37 163 -73 187 -30 b 271 -23 225 -3 248 -23 l 271 -517 l 315 -517 l 315 -23 l 383 -23 b 449 -203 428 -23 449 -84 l 495 -203 b 405 68 495 -23 465 68 l 292 68 b 203 248 258 68 228 127 b 101 0 173 98 138 16 b 81 -3 94 0 86 -3 b 45 68 56 -3 45 20 l 0 68 b 89 -112 0 -52 30 -112 z', + }, + accSagittalFlat7v11CUp: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 89 112 b 0 -68 30 112 0 52 l 45 -68 b 81 3 45 -20 56 3 b 101 0 86 3 94 0 b 203 -248 138 -16 173 -98 b 292 -68 228 -127 258 -68 l 405 -68 b 495 203 465 -68 495 23 l 449 203 b 383 23 449 84 428 23 l 315 23 l 315 517 l 271 517 l 271 23 b 206 -37 248 23 225 3 b 135 95 187 30 163 73 l 135 517 l 89 517 z', + }, + accSagittalSharp55CDown: { + x_min: 0, + x_max: 250, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -271 l 135 -125 l 135 -517 l 180 -517 l 180 -78 l 315 65 l 315 -517 l 360 -517 l 360 248 l 337 248 l 0 -112 z', + }, + accSagittalFlat55CUp: { + x_min: 0, + x_max: 250, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 112 l 337 -248 l 360 -248 l 360 517 l 315 517 l 315 -65 l 180 78 l 180 517 l 135 517 l 135 125 l 0 271 z', + }, + accSagittalSharp17CDown: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -248 l 45 -68 b 180 109 45 36 89 95 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -89 292 13 321 -55 l 360 -517 l 405 -517 l 405 -112 l 428 -112 b 540 68 504 -112 540 -53 l 495 68 b 445 -4 495 20 480 -4 b 292 248 343 -4 307 171 l 180 248 b 0 68 60 248 0 187 l 0 -248 z', + }, + accSagittalFlat17CUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 248 l 0 -68 b 180 -248 0 -187 60 -248 l 292 -248 b 445 4 307 -171 343 4 b 495 -68 480 4 495 -20 l 540 -68 b 428 112 540 53 504 112 l 405 112 l 405 517 l 360 517 l 360 89 b 271 -112 321 55 292 -13 l 225 -112 l 225 517 l 180 517 l 180 -109 b 45 68 89 -95 45 -36 l 45 248 z', + }, + accSagittalSharp7v11kDown: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -32 l 405 138 l 405 13 l 0 -157 l 0 -256 l 225 -161 l 225 -517 l 271 -517 l 271 -144 l 405 -86 l 405 -517 l 449 -517 l 449 248 l 428 248 l 0 68 z', + }, + accSagittalFlat7v11kUp: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 l 428 -248 l 449 -248 l 449 517 l 405 517 l 405 86 l 271 144 l 271 517 l 225 517 l 225 161 l 0 256 l 0 157 l 405 -13 l 405 -138 l 0 32 z', + }, + accSagittalSharp7v11kUp: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 135 -112 l 135 -517 l 180 -517 l 180 -105 b 271 -23 217 -94 248 -65 l 271 -517 l 315 -517 l 315 -23 b 405 -105 337 -65 369 -94 l 405 -517 l 449 -517 l 449 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 315 148 b 112 -4 274 148 236 -4 b 45 68 68 -4 45 20 l 0 68 b 135 -112 0 -53 45 -112 z', + }, + accSagittalFlat7v11kDown: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 135 112 b 0 -68 45 112 0 53 l 45 -68 b 112 4 45 -20 68 4 b 292 -248 236 4 274 -148 b 475 4 315 -148 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 l 449 517 l 405 517 l 405 105 b 315 23 369 94 337 65 l 315 517 l 271 517 l 271 23 b 180 105 248 65 217 94 l 180 517 l 135 517 z', + }, + accSagittalSharp17CUp: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 203 -23 b 271 14 229 -23 251 -10 l 271 -517 l 315 -517 l 315 -23 b 405 -105 337 -65 369 -94 l 405 -517 l 449 -517 l 449 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 312 150 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z', + }, + accSagittalFlat17CDown: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 b 475 4 312 -150 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 l 449 517 l 405 517 l 405 105 b 315 23 369 94 337 65 l 315 517 l 271 517 l 271 -14 b 203 23 251 10 229 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z', + }, + accSagittalSharp55CUp: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -517 l 45 78 l 135 10 l 135 -517 l 180 -517 l 180 -23 l 271 -92 l 271 -517 l 315 -517 l 315 -127 l 495 -264 l 495 -112 l 23 248 l 0 248 l 0 -517 z', + }, + accSagittalFlat55CDown: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 517 l 0 -248 l 23 -248 l 495 112 l 495 264 l 315 127 l 315 517 l 271 517 l 271 92 l 180 23 l 180 517 l 135 517 l 135 -10 l 45 -78 l 45 517 z', + }, + accSagittalSharp7v11CUp: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 86 45 6 89 58 l 180 -517 l 225 -517 l 225 98 b 315 109 252 104 282 108 l 315 -517 l 360 -517 l 360 112 l 449 112 l 449 -517 l 495 -517 l 495 248 l 360 248 b 0 68 121 248 0 189 z', + }, + accSagittalFlat7v11CDown: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 360 -248 0 -189 121 -248 l 495 -248 l 495 517 l 449 517 l 449 -112 l 360 -112 l 360 517 l 315 517 l 315 -109 b 225 -98 282 -108 252 -104 l 225 517 l 180 517 l 180 -86 b 45 68 89 -58 45 -6 l 45 248 l 0 248 z', + }, + accSagittalSharp5v11SUp: { + x_min: 0, + x_max: 438, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 -23 b 449 -105 383 -65 415 -94 l 449 -517 l 495 -517 l 495 -112 b 631 68 585 -112 631 -53 l 585 68 b 520 -4 585 20 563 -4 b 337 248 396 -4 360 150 l 225 248 b 0 68 76 248 0 187 z', + }, + accSagittalFlat5v11SDown: { + x_min: 0, + x_max: 438, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 225 -248 0 -187 76 -248 l 337 -248 b 520 4 360 -150 396 4 b 585 -68 563 4 585 -20 l 631 -68 b 495 112 631 53 585 112 l 495 517 l 449 517 l 449 105 b 360 23 415 94 383 65 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z', + }, + accSagittalDoubleSharp5v11SDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 203 -23 b 262 4 225 -23 245 -13 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 341 -60 b 449 -112 370 -95 405 -112 b 585 68 540 -112 585 -53 l 540 68 b 475 -4 540 20 517 -4 b 292 248 350 -4 312 150 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z', + }, + accSagittalDoubleFlat5v11SUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 b 475 4 312 -150 350 4 b 540 -68 517 4 540 -20 l 585 -68 b 449 112 585 53 540 112 b 341 60 405 112 370 95 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 262 -4 b 203 23 245 13 225 23 l 135 23 b 45 203 75 23 45 84 z', + }, + accSagittalDoubleSharp7v11CDown: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 112 -112 b 193 -73 143 -112 170 -99 l 45 -501 l 95 -517 l 248 -81 l 397 -517 l 449 -503 l 275 0 l 278 4 b 337 -23 295 -13 315 -23 l 405 -23 b 495 -203 465 -23 495 -84 l 540 -203 b 428 68 540 -23 503 68 l 360 68 b 248 248 310 68 271 127 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 112 -112 0 -52 36 -112 z', + }, + accSagittalDoubleFlat7v11CUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 112 112 b 0 -68 36 112 0 52 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 b 360 -68 271 -127 310 -68 l 428 -68 b 540 203 503 -68 540 23 l 495 203 b 405 23 495 84 465 23 l 337 23 b 278 -4 315 23 295 13 l 275 0 l 449 503 l 397 517 l 248 81 l 95 517 l 45 501 l 193 73 b 112 112 170 99 143 112 z', + }, + accSagittalDoubleSharp55CDown: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 428 248 l 0 -112 l 0 -266 l 307 -7 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 366 0 l 386 59 l 449 112 l 449 248 z', + }, + accSagittalDoubleFlat55CUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 449 -248 l 449 -112 l 386 -59 l 366 0 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 307 7 l 0 266 l 0 112 l 428 -248 z', + }, + accSagittalDoubleSharp17CDown: { + x_min: 0, + x_max: 438, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -248 l 45 -68 b 271 112 45 53 120 112 l 310 0 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 387 -62 b 495 -112 416 -95 452 -112 b 631 68 585 -112 631 -53 l 585 68 b 520 -4 585 20 563 -4 b 337 248 396 -4 360 150 l 225 248 b 0 68 76 248 0 187 l 0 -248 z', + }, + accSagittalDoubleFlat17CUp: { + x_min: 0, + x_max: 438, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 248 l 0 -68 b 225 -248 0 -187 76 -248 l 337 -248 b 520 4 360 -150 396 4 b 585 -68 563 4 585 -20 l 631 -68 b 495 112 631 53 585 112 b 387 62 452 112 416 95 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 310 0 l 271 -112 b 45 68 120 -112 45 -53 l 45 248 z', + }, + accSagittalDoubleSharp7v11kDown: { + x_min: 0, + x_max: 438, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 l 0 -30 l 366 96 l 399 0 l 392 -23 l 0 -157 l 0 -255 l 353 -135 l 225 -503 l 276 -517 l 428 -82 l 579 -517 l 631 -503 l 455 0 l 507 145 l 540 157 l 540 248 l 517 248 z m 416 115 l 442 124 l 428 82 z', + }, + accSagittalDoubleFlat7v11kUp: { + x_min: 0, + x_max: 438, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 517 -248 l 540 -248 l 540 -157 l 507 -145 l 455 0 l 631 503 l 579 517 l 428 82 l 276 517 l 225 503 l 353 135 l 0 255 l 0 157 l 392 23 l 399 0 l 366 -96 l 0 30 l 0 -68 z m 428 -82 l 442 -124 l 416 -115 z', + }, + accSagittal23CommaUp: { + x_min: 0, + x_max: 188, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 -4 b 68 -23 53 -17 60 -23 l 180 -23 b 225 -203 210 -23 225 -82 l 271 -203 b 206 68 271 -23 248 68 l 89 68 b 23 248 71 68 48 127 l 0 248 z', + }, + accSagittal23CommaDown: { + x_min: 0, + x_max: 188, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 23 -248 b 89 -68 48 -127 71 -68 l 206 -68 b 271 203 248 -68 271 23 l 225 203 b 180 23 225 82 210 23 l 68 23 b 45 4 60 23 53 17 l 45 517 l 0 517 z', + }, + accSagittal5v19CommaUp: { + x_min: 0, + x_max: 156, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -284 l 180 33 l 180 -517 l 225 -517 l 225 248 l 203 248 b 86 112 151 157 112 112 b 45 157 59 112 45 127 l 0 157 b 76 23 0 72 26 27 l 0 -112 z', + }, + accSagittal5v19CommaDown: { + x_min: 0, + x_max: 156, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 112 l 76 -23 b 0 -157 26 -27 0 -72 l 45 -157 b 86 -112 45 -127 59 -112 b 203 -248 112 -112 151 -157 l 225 -248 l 225 517 l 180 517 l 180 -33 l 0 284 z', + }, + accSagittal5v23SmallDiesisUp: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -284 l 180 33 l 180 -517 l 225 -517 l 225 -4 b 248 -23 233 -17 240 -23 l 360 -23 b 405 -203 390 -23 405 -82 l 449 -203 b 386 68 449 -23 428 68 l 271 68 b 203 248 251 68 228 127 l 0 -112 z', + }, + accSagittal5v23SmallDiesisDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 112 l 203 -248 b 271 -68 228 -127 251 -68 l 386 -68 b 449 203 428 -68 449 23 l 405 203 b 360 23 405 82 390 23 l 248 23 b 225 4 240 23 233 17 l 225 517 l 180 517 l 180 -33 l 0 284 z', + }, + accSagittalSharp5v23SDown: { + x_min: 0, + x_max: 281, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 6 b 89 -23 59 -13 73 -23 l 180 -23 l 180 -517 l 225 -517 l 225 -23 l 292 -23 b 360 -203 337 -23 360 -84 l 405 -203 b 315 68 405 -23 374 68 l 112 68 b 23 248 78 68 48 127 l 0 248 z', + }, + accSagittalFlat5v23SUp: { + x_min: 0, + x_max: 281, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 23 -248 b 112 -68 48 -127 78 -68 l 315 -68 b 405 203 374 -68 405 23 l 360 203 b 292 23 360 84 337 23 l 225 23 l 225 517 l 180 517 l 180 23 l 89 23 b 45 -6 73 23 59 13 l 45 517 l 0 517 z', + }, + accSagittalSharp5v19CDown: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 b 89 -112 0 -52 30 -112 l 89 -517 l 135 -517 l 135 -95 b 225 112 173 -65 203 4 l 271 112 l 271 -517 l 315 -517 l 315 107 b 405 -68 374 89 405 30 l 405 -248 l 449 -248 l 449 68 b 315 248 449 189 405 248 l 203 248 b 101 0 173 98 138 16 b 81 -3 94 0 86 -3 b 45 68 56 -3 45 23 z', + }, + accSagittalFlat5v19CUp: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 45 -68 b 81 3 45 -23 56 3 b 101 0 86 3 94 0 b 203 -248 138 -16 173 -98 l 315 -248 b 449 -68 405 -248 449 -189 l 449 248 l 405 248 l 405 68 b 315 -107 405 -30 374 -89 l 315 517 l 271 517 l 271 -112 l 225 -112 b 135 95 203 -4 173 65 l 135 517 l 89 517 l 89 112 b 0 -68 30 112 0 52 z', + }, + accSagittalSharp23CDown: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 135 -82 l 135 -517 l 180 -517 l 180 -17 l 239 68 b 315 -23 261 7 287 -23 l 315 -517 l 360 -517 l 360 -23 l 428 -23 b 495 -203 472 -23 495 -84 l 540 -203 b 449 68 540 -23 510 68 l 337 68 b 248 248 302 68 271 127 l 0 -112 l 0 -276 z', + }, + accSagittalFlat23CUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 276 l 0 112 l 248 -248 b 337 -68 271 -127 302 -68 l 449 -68 b 540 203 510 -68 540 23 l 495 203 b 428 23 495 84 472 23 l 360 23 l 360 517 l 315 517 l 315 23 b 239 -68 287 23 261 -7 l 180 17 l 180 517 l 135 517 l 135 82 z', + }, + accSagittalSharp23CUp: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 14 b 112 -23 63 -10 86 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 l 271 -517 l 315 -517 l 315 -23 l 360 -23 b 449 -203 420 -23 449 -84 l 495 -203 b 383 68 495 -23 458 68 l 135 68 b 23 248 85 68 48 127 l 0 248 z', + }, + accSagittalFlat23CDown: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 23 -248 b 135 -68 48 -127 85 -68 l 383 -68 b 495 203 458 -68 495 23 l 449 203 b 360 23 449 84 420 23 l 315 23 l 315 517 l 271 517 l 271 23 l 180 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 -14 86 23 63 10 l 45 517 l 0 517 z', + }, + accSagittalSharp5v19CUp: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -112 l 0 -266 l 135 -153 l 135 -517 l 180 -517 l 180 -115 l 271 -39 l 271 -517 l 315 -517 l 315 0 l 405 75 l 405 -517 l 449 -517 l 449 248 l 428 248 b 130 68 285 127 186 68 b 45 157 73 68 45 98 l 0 157 b 112 -20 0 53 37 -6 z', + }, + accSagittalFlat5v19CDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 112 20 b 0 -157 37 6 0 -53 l 45 -157 b 130 -68 45 -98 73 -68 b 428 -248 186 -68 285 -127 l 449 -248 l 449 517 l 405 517 l 405 -75 l 315 0 l 315 517 l 271 517 l 271 39 l 180 115 l 180 517 l 135 517 l 135 153 l 0 266 l 0 112 z', + }, + accSagittalSharp5v23SUp: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 135 -108 l 135 -517 l 180 -517 l 180 -53 l 271 58 l 271 -517 l 315 -517 l 315 14 b 383 -23 334 -10 357 -23 l 405 -23 l 405 -517 l 449 -517 l 449 -23 b 540 -203 510 -23 540 -84 l 585 -203 b 472 68 585 -23 547 68 l 405 68 b 292 248 356 68 318 127 l 0 -112 l 0 -274 z', + }, + accSagittalFlat5v23SDown: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 274 l 0 112 l 292 -248 b 405 -68 318 -127 356 -68 l 472 -68 b 585 203 547 -68 585 23 l 540 203 b 449 23 540 84 510 23 l 449 517 l 405 517 l 405 23 l 383 23 b 315 -14 357 23 334 10 l 315 517 l 271 517 l 271 -58 l 180 53 l 180 517 l 135 517 l 135 108 z', + }, + accSagittalDoubleSharp5v23SDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 52 -517 l 203 -81 l 354 -517 l 405 -503 l 239 -23 l 449 -23 b 540 -203 510 -23 540 -84 l 585 -203 b 472 68 585 -23 547 68 l 225 68 b 112 248 176 68 138 127 l 89 248 l 89 112 b 170 -14 109 45 135 0 l 0 -501 z', + }, + accSagittalDoubleFlat5v23SUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 501 l 170 14 b 89 -112 135 0 109 -45 l 89 -248 l 112 -248 b 225 -68 138 -127 176 -68 l 472 -68 b 585 203 547 -68 585 23 l 540 203 b 449 23 540 84 510 23 l 239 23 l 405 503 l 354 517 l 203 81 l 52 517 z', + }, + accSagittalDoubleSharp5v19CDown: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 b 112 -112 0 -52 36 -112 b 193 -73 143 -112 170 -99 l 45 -501 l 95 -517 l 248 -81 l 397 -517 l 449 -501 l 275 0 l 315 112 b 495 -68 435 112 495 53 l 495 -248 l 540 -248 l 540 68 b 360 248 540 189 480 248 l 248 248 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 z', + }, + accSagittalDoubleFlat5v19CUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 l 360 -248 b 540 -68 480 -248 540 -189 l 540 248 l 495 248 l 495 68 b 315 -112 495 -53 435 -112 l 275 0 l 449 501 l 397 517 l 248 81 l 95 517 l 45 501 l 193 73 b 112 112 170 99 143 112 b 0 -68 36 112 0 52 z', + }, + accSagittalDoubleSharp23CDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 252 35 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 323 4 b 383 -23 340 -13 360 -23 l 449 -23 b 540 -203 510 -23 540 -84 l 585 -203 b 472 68 585 -23 547 68 l 405 68 b 292 248 356 68 318 127 l 0 -112 l 0 -274 z', + }, + accSagittalDoubleFlat23CUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 274 l 0 112 l 292 -248 b 405 -68 318 -127 356 -68 l 472 -68 b 585 203 547 -68 585 23 l 540 203 b 449 23 540 84 510 23 l 383 23 b 323 -4 360 23 340 13 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 252 -35 z', + }, + accSagittal19SchismaUp: { + x_min: 0, + x_max: 125, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 68 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 248 l 157 248 b 79 0 127 98 101 16 b 68 -3 73 0 68 -3 b 45 68 52 -3 45 20 l 0 68 b 68 -112 0 -52 23 -112 z', + }, + accSagittal19SchismaDown: { + x_min: 0, + x_max: 125, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 68 112 b 0 -68 23 112 0 52 l 45 -68 b 68 3 45 -20 52 3 b 79 0 68 3 73 0 b 157 -248 101 -16 127 -98 l 180 -248 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 z', + }, + accSagittal17KleismaUp: { + x_min: 0, + x_max: 156, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 248 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z', + }, + accSagittal17KleismaDown: { + x_min: 0, + x_max: 156, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 225 -248 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z', + }, + accSagittal143CommaUp: { + x_min: 0, + x_max: 156, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -203 l 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 248 l 203 248 b 135 68 177 127 154 68 l 105 68 b 45 157 65 68 45 98 l 0 157 b 23 20 0 95 7 50 b 0 -203 7 -23 0 -98 z', + }, + accSagittal143CommaDown: { + x_min: 0, + x_max: 156, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 23 -20 0 98 7 23 b 0 -157 7 -50 0 -95 l 45 -157 b 105 -68 45 -98 65 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 225 -248 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z', + }, + accSagittal11v49CommaUp: { + x_min: 0, + x_max: 188, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -292 b 89 -157 45 -203 60 -157 l 203 -157 b 225 -143 210 -157 217 -153 l 225 -517 l 271 -517 l 271 248 l 248 248 b 180 157 233 187 210 157 l 68 157 b 0 -68 23 157 0 82 l 45 -68 b 89 68 45 23 60 68 l 203 68 b 225 84 209 68 216 72 l 225 -36 b 180 -68 213 -58 199 -68 l 68 -68 b 0 -292 23 -68 0 -143 z', + }, + accSagittal11v49CommaDown: { + x_min: 0, + x_max: 188, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 292 b 68 68 0 143 23 68 l 180 68 b 225 36 199 68 213 58 l 225 -84 b 203 -68 216 -72 209 -68 l 89 -68 b 45 68 60 -68 45 -23 l 0 68 b 68 -157 0 -82 23 -157 l 180 -157 b 248 -248 210 -157 233 -187 l 271 -248 l 271 517 l 225 517 l 225 143 b 203 157 217 153 210 157 l 89 157 b 45 292 60 157 45 203 z', + }, + accSagittal19CommaUp: { + x_min: 0, + x_max: 281, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 b 68 -112 0 -52 23 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 -4 b 203 -23 187 -17 196 -23 l 315 -23 b 360 -203 346 -23 360 -82 l 405 -203 b 341 68 405 -23 383 68 l 225 68 b 157 248 206 68 183 127 b 79 0 127 98 101 16 b 68 -3 73 0 68 -3 b 45 68 52 -3 45 20 z', + }, + accSagittal19CommaDown: { + x_min: 0, + x_max: 281, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 45 -68 b 68 3 45 -20 52 3 b 79 0 68 3 73 0 b 157 -248 101 -16 127 -98 b 225 -68 183 -127 206 -68 l 341 -68 b 405 203 383 -68 405 23 l 360 203 b 315 23 360 82 346 23 l 203 23 b 180 4 196 23 187 17 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 b 0 -68 23 112 0 52 z', + }, + accSagittal7v19CommaUp: { + x_min: 0, + x_max: 250, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 b 68 -112 0 -52 23 -112 b 135 -45 89 -112 112 -89 l 135 -517 l 180 -517 l 180 112 l 225 112 b 315 -68 285 112 315 53 l 315 -248 l 360 -248 l 360 68 b 271 248 360 187 330 248 l 157 248 b 79 0 127 98 101 16 b 68 -3 73 0 68 -3 b 45 68 52 -3 45 20 z', + }, + accSagittal7v19CommaDown: { + x_min: 0, + x_max: 250, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 45 -68 b 68 3 45 -20 52 3 b 79 0 68 3 73 0 b 157 -248 101 -16 127 -98 l 271 -248 b 360 -68 330 -248 360 -187 l 360 248 l 315 248 l 315 68 b 225 -112 315 -53 285 -112 l 180 -112 l 180 517 l 135 517 l 135 45 b 68 112 112 89 89 112 b 0 -68 23 112 0 52 z', + }, + accSagittal49SmallDiesisUp: { + x_min: 0, + x_max: 281, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -203 l 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -68 330 112 360 53 l 360 -248 l 405 -248 l 405 68 b 315 248 405 187 374 248 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z', + }, + accSagittal49SmallDiesisDown: { + x_min: 0, + x_max: 281, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 315 -248 b 405 -68 374 -248 405 -187 l 405 248 l 360 248 l 360 68 b 271 -112 360 -53 330 -112 l 225 -112 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z', + }, + accSagittal23SmallDiesisUp: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 89 -23 45 -82 60 -23 l 157 -23 b 180 -4 164 -23 173 -17 l 180 -517 l 225 -517 l 225 58 l 495 -274 l 495 -112 l 203 248 b 135 68 177 127 154 68 l 68 68 b 0 -203 23 68 0 -23 z', + }, + accSagittal23SmallDiesisDown: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 68 -68 0 23 23 -68 l 135 -68 b 203 -248 154 -68 177 -127 l 495 112 l 495 274 l 225 -58 l 225 517 l 180 517 l 180 4 b 157 23 173 17 164 23 l 89 23 b 45 203 60 23 45 82 z', + }, + accSagittal5v13MediumDiesisUp: { + x_min: 0, + x_max: 250, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -259 l 315 -89 l 315 -517 l 360 -517 l 360 248 l 337 248 b 128 180 253 203 184 180 b 45 248 73 180 45 203 l 0 248 b 52 95 0 170 17 120 l 0 68 l 0 -33 l 315 135 l 315 10 l 0 -157 z', + }, + accSagittal5v13MediumDiesisDown: { + x_min: 0, + x_max: 250, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 157 l 315 -10 l 315 -135 l 0 33 l 0 -68 l 52 -95 b 0 -248 17 -120 0 -170 l 45 -248 b 128 -180 45 -203 73 -180 b 337 -248 184 -180 253 -203 l 360 -248 l 360 517 l 315 517 l 315 89 l 0 259 z', + }, + accSagittal11v19MediumDiesisUp: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -248 l 45 -68 b 180 112 45 53 89 112 l 225 112 l 225 -517 l 271 -517 l 271 -4 b 292 -23 278 -17 285 -23 l 405 -23 b 449 -203 435 -23 449 -82 l 495 -203 b 431 68 495 -23 472 68 l 315 68 b 248 248 295 68 271 127 l 135 248 b 0 68 45 248 0 187 l 0 -248 z', + }, + accSagittal11v19MediumDiesisDown: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 248 l 0 -68 b 135 -248 0 -187 45 -248 l 248 -248 b 315 -68 271 -127 295 -68 l 431 -68 b 495 203 472 -68 495 23 l 449 203 b 405 23 449 82 435 23 l 292 23 b 271 4 285 23 278 17 l 271 517 l 225 517 l 225 -112 l 180 -112 b 45 68 89 -112 45 -53 l 45 248 z', + }, + accSagittal49MediumDiesisUp: { + x_min: 0, + x_max: 250, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -68 l 0 -248 l 45 -248 l 315 -94 l 315 -517 l 360 -517 l 360 248 l 225 248 b 0 -68 75 248 0 143 z m 45 -68 b 225 112 45 53 105 112 l 315 112 l 315 10 l 45 -145 z', + }, + accSagittal49MediumDiesisDown: { + x_min: 0, + x_max: 250, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 68 b 225 -248 0 -143 75 -248 l 360 -248 l 360 517 l 315 517 l 315 94 l 45 248 l 0 248 z m 45 145 l 315 -10 l 315 -112 l 225 -112 b 45 68 105 -112 45 -53 z', + }, + accSagittal5v49MediumDiesisUp: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -89 l 0 -248 l 225 53 l 225 -517 l 271 -517 l 271 53 l 495 -248 l 495 -89 l 248 248 b 89 89 170 143 118 89 b 45 157 60 89 45 112 l 0 157 b 68 3 0 68 23 16 z', + }, + accSagittal5v49MediumDiesisDown: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 68 -3 b 0 -157 23 -16 0 -68 l 45 -157 b 89 -89 45 -112 60 -89 b 248 -248 118 -89 170 -143 l 495 89 l 495 248 l 271 -53 l 271 517 l 225 517 l 225 -53 l 0 248 l 0 89 z', + }, + accSagittal49LargeDiesisUp: { + x_min: 0, + x_max: 281, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 -89 l 360 -248 l 405 -248 l 405 -68 b 180 248 405 143 330 248 l 0 248 z m 45 12 l 45 112 l 180 112 b 360 -68 300 112 360 53 l 360 -147 z', + }, + accSagittal49LargeDiesisDown: { + x_min: 0, + x_max: 281, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 180 -248 b 405 68 330 -248 405 -143 l 405 248 l 360 248 l 45 89 l 45 517 l 0 517 z m 360 147 l 360 68 b 180 -112 360 -53 300 -112 l 45 -112 l 45 -12 z', + }, + accSagittal11v19LargeDiesisUp: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 -86 l 449 -256 l 449 -157 l 45 13 l 45 138 l 449 -30 l 449 68 l 23 248 l 0 248 z', + }, + accSagittal11v19LargeDiesisDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 23 -248 l 449 -68 l 449 30 l 45 -138 l 45 -13 l 449 157 l 449 256 l 45 86 l 45 517 l 0 517 z', + }, + accSagittal5v13LargeDiesisUp: { + x_min: 0, + x_max: 438, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 b 89 -112 0 -52 30 -112 b 180 -35 125 -112 157 -86 l 180 -517 l 225 -517 l 225 -86 l 631 -256 l 631 -157 l 225 13 l 225 138 l 631 -30 l 631 68 l 203 248 b 101 0 173 98 138 16 b 81 -3 94 0 86 -3 b 45 68 56 -3 45 20 z', + }, + accSagittal5v13LargeDiesisDown: { + x_min: 0, + x_max: 438, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 45 -68 b 81 3 45 -20 56 3 b 101 0 86 3 94 0 b 203 -248 138 -16 173 -98 l 631 -68 l 631 30 l 225 -138 l 225 -13 l 631 157 l 631 256 l 225 86 l 225 517 l 180 517 l 180 35 b 89 112 157 86 125 112 b 0 -68 30 112 0 52 z', + }, + accSagittalSharp23SDown: { + x_min: 0, + x_max: 250, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -203 l 45 -203 b 112 -23 45 -84 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 b 315 6 287 -23 301 -13 l 315 -517 l 360 -517 l 360 248 l 337 248 b 248 68 312 127 282 68 l 194 68 b 89 157 125 68 89 98 l 45 157 b 60 59 45 118 50 85 b 0 -203 20 30 0 -56 z', + }, + accSagittalFlat23SUp: { + x_min: 0, + x_max: 250, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 60 -59 0 56 20 -30 b 45 -157 50 -85 45 -118 l 89 -157 b 194 -68 89 -98 125 -68 l 248 -68 b 337 -248 282 -68 312 -127 l 360 -248 l 360 517 l 315 517 l 315 -6 b 271 23 301 13 287 23 l 180 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 84 z', + }, + accSagittalSharp49SDown: { + x_min: 0, + x_max: 250, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -292 l 45 -292 b 112 -157 45 -203 68 -157 l 135 -157 l 135 -517 l 180 -517 l 180 -157 l 271 -157 b 315 -135 285 -157 300 -150 l 315 -517 l 360 -517 l 360 248 l 337 248 b 248 157 323 187 292 157 l 89 157 b 0 -68 30 157 0 82 l 45 -68 b 112 68 45 23 68 68 l 271 68 b 315 89 284 68 300 75 l 315 -32 b 248 -68 298 -56 275 -68 l 89 -68 b 0 -292 29 -68 0 -143 z', + }, + accSagittalFlat49SUp: { + x_min: 0, + x_max: 250, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 292 b 89 68 0 143 29 68 l 248 68 b 315 32 275 68 298 56 l 315 -89 b 271 -68 300 -75 284 -68 l 112 -68 b 45 68 68 -68 45 -23 l 0 68 b 89 -157 0 -82 30 -157 l 248 -157 b 337 -248 292 -157 323 -187 l 360 -248 l 360 517 l 315 517 l 315 135 b 271 157 300 150 285 157 l 180 157 l 180 517 l 135 517 l 135 157 l 112 157 b 45 292 68 157 45 203 z', + }, + accSagittalSharp7v19CDown: { + x_min: 0, + x_max: 250, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -112 l 0 -271 l 135 -125 l 135 -517 l 180 -517 l 180 -78 l 315 65 l 315 -517 l 360 -517 l 360 248 l 337 248 b 118 89 239 143 166 89 b 45 157 68 89 45 112 l 0 157 b 89 -20 0 53 29 -6 z', + }, + accSagittalFlat7v19CUp: { + x_min: 0, + x_max: 250, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 89 20 b 0 -157 29 6 0 -53 l 45 -157 b 118 -89 45 -112 68 -89 b 337 -248 166 -89 239 -143 l 360 -248 l 360 517 l 315 517 l 315 -65 l 180 78 l 180 517 l 135 517 l 135 125 l 0 271 l 0 112 z', + }, + accSagittalSharp19CDown: { + x_min: 0, + x_max: 281, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -248 l 45 -248 l 45 -68 b 180 96 45 17 89 72 l 180 -517 l 225 -517 l 225 107 b 315 112 252 112 282 112 l 360 112 l 360 -517 l 405 -517 l 405 248 l 271 248 b 0 68 89 248 0 187 z', + }, + accSagittalFlat19CUp: { + x_min: 0, + x_max: 281, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 271 -248 0 -187 89 -248 l 405 -248 l 405 517 l 360 517 l 360 -112 l 315 -112 b 225 -107 282 -112 252 -112 l 225 517 l 180 517 l 180 -96 b 45 68 89 -72 45 -17 l 45 248 l 0 248 z', + }, + accSagittalSharp11v49CDown: { + x_min: 0, + x_max: 344, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 112 -23 45 -82 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 b 271 112 215 -23 245 23 l 315 112 l 315 -517 l 360 -517 l 360 107 b 449 -68 420 89 449 30 l 449 -248 l 495 -248 l 495 68 b 360 248 495 189 449 248 l 248 248 b 157 68 222 128 192 68 l 89 68 b 0 -203 30 68 0 -23 z', + }, + accSagittalFlat11v49CUp: { + x_min: 0, + x_max: 344, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 89 -68 0 23 30 -68 l 157 -68 b 248 -248 192 -68 222 -128 l 360 -248 b 495 -68 449 -248 495 -189 l 495 248 l 449 248 l 449 68 b 360 -107 449 -30 420 -89 l 360 517 l 315 517 l 315 -112 l 271 -112 b 180 23 245 -23 215 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 82 z', + }, + accSagittalSharp143CDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 112 -23 45 -84 68 -23 l 135 -23 l 135 -517 l 180 -517 l 180 -23 b 259 76 210 -23 236 10 l 315 17 l 315 -517 l 360 -517 l 360 -30 l 585 -271 l 585 -112 l 248 248 b 157 68 222 127 192 68 l 89 68 b 0 -203 30 68 0 -23 z', + }, + accSagittalFlat143CUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 89 -68 0 23 30 -68 l 157 -68 b 248 -248 192 -68 222 -127 l 585 112 l 585 271 l 360 30 l 360 517 l 315 517 l 315 -17 l 259 -76 b 180 23 236 -10 210 23 l 180 517 l 135 517 l 135 23 l 112 23 b 45 203 68 23 45 84 z', + }, + accSagittalSharp17kDown: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -157 l 0 -256 l 225 -161 l 225 -517 l 271 -517 l 271 -144 l 405 -86 l 405 -517 l 449 -517 l 449 248 l 428 248 b 145 171 305 196 210 171 b 45 248 78 171 45 196 l 0 248 b 79 101 0 170 26 121 l 0 68 l 0 -32 l 405 138 l 405 13 z', + }, + accSagittalFlat17kUp: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 405 -13 l 405 -138 l 0 32 l 0 -68 l 79 -101 b 0 -248 26 -121 0 -170 l 45 -248 b 145 -171 45 -196 78 -171 b 428 -248 210 -171 305 -196 l 449 -248 l 449 517 l 405 517 l 405 86 l 271 144 l 271 517 l 225 517 l 225 161 l 0 256 l 0 157 z', + }, + accSagittalSharp19sDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -248 l 45 -248 l 45 -68 b 180 109 45 36 89 95 l 180 -517 l 225 -517 l 225 112 l 271 112 b 360 -23 295 23 325 -23 l 360 -517 l 405 -517 l 405 -23 l 472 -23 b 540 -203 517 -23 540 -84 l 585 -203 b 495 68 585 -23 554 68 l 383 68 b 292 248 348 68 318 127 l 180 248 b 0 68 60 248 0 187 z', + }, + accSagittalFlat19sUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 180 -248 0 -187 60 -248 l 292 -248 b 383 -68 318 -127 348 -68 l 495 -68 b 585 203 554 -68 585 23 l 540 203 b 472 23 540 84 517 23 l 405 23 l 405 517 l 360 517 l 360 23 b 271 -112 325 23 295 -23 l 225 -112 l 225 517 l 180 517 l 180 -109 b 45 68 89 -95 45 -36 l 45 248 l 0 248 z', + }, + accSagittalSharp19sUp: { + x_min: 0, + x_max: 281, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 89 -96 l 89 -517 l 135 -517 l 135 -108 b 180 -112 148 -112 163 -112 b 225 -108 196 -112 210 -112 l 225 -517 l 271 -517 l 271 -94 b 360 -12 305 -78 337 -50 l 360 -517 l 405 -517 l 405 248 l 383 248 b 190 0 353 98 288 16 b 138 -3 171 0 153 -3 b 45 68 75 -3 45 20 l 0 68 b 89 -96 0 -17 30 -72 z', + }, + accSagittalFlat19sDown: { + x_min: 0, + x_max: 281, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 89 96 b 0 -68 30 72 0 17 l 45 -68 b 138 3 45 -20 75 3 b 190 0 153 3 171 0 b 383 -248 288 -16 353 -98 l 405 -248 l 405 517 l 360 517 l 360 12 b 271 94 337 50 305 78 l 271 517 l 225 517 l 225 108 b 180 112 210 112 196 112 b 135 108 163 112 148 112 l 135 517 l 89 517 z', + }, + accSagittalSharp17kUp: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 l 271 -517 l 315 -517 l 315 -23 l 337 -23 b 405 14 363 -23 386 -10 l 405 -517 l 449 -517 l 449 248 l 428 248 b 315 68 402 127 364 68 l 112 68 b 0 -203 37 68 0 -23 z', + }, + accSagittalFlat17kDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 112 -68 0 23 37 -68 l 315 -68 b 428 -248 364 -68 402 -127 l 449 -248 l 449 517 l 405 517 l 405 -14 b 337 23 386 10 363 23 l 315 23 l 315 517 l 271 517 l 271 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z', + }, + accSagittalSharp143CUp: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 271 -23 l 271 -517 l 315 -517 l 315 -23 l 337 -23 b 405 14 363 -23 386 -10 l 405 -517 l 449 -517 l 449 248 l 428 248 b 315 68 402 127 364 68 l 240 68 b 89 157 140 68 89 98 l 45 157 b 68 53 45 115 52 81 b 0 -203 23 23 0 -63 z', + }, + accSagittalFlat143CDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 68 -53 0 63 23 -23 b 45 -157 52 -81 45 -115 l 89 -157 b 240 -68 89 -98 140 -68 l 315 -68 b 428 -248 364 -68 402 -127 l 449 -248 l 449 517 l 405 517 l 405 -14 b 337 23 386 10 363 23 l 315 23 l 315 517 l 271 517 l 271 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z', + }, + accSagittalSharp11v49CUp: { + x_min: 0, + x_max: 312, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -68 b 135 68 45 23 76 68 l 337 68 b 405 95 363 68 386 76 l 405 -27 b 315 -68 386 -55 356 -68 l 112 -68 b 0 -292 37 -68 0 -143 l 45 -292 b 135 -157 45 -203 75 -157 l 135 -517 l 180 -517 l 180 -157 l 271 -157 l 271 -517 l 315 -517 l 315 -157 l 337 -157 b 405 -130 360 -157 383 -148 l 405 -517 l 449 -517 l 449 248 l 428 248 b 315 157 413 187 376 157 l 112 157 b 0 -68 37 157 0 82 z', + }, + accSagittalFlat11v49CDown: { + x_min: 0, + x_max: 312, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 68 b 112 -157 0 -82 37 -157 l 315 -157 b 428 -248 376 -157 413 -187 l 449 -248 l 449 517 l 405 517 l 405 130 b 337 157 383 148 360 157 l 315 157 l 315 517 l 271 517 l 271 157 l 180 157 l 180 517 l 135 517 l 135 157 b 45 292 75 157 45 203 l 0 292 b 112 68 0 143 37 68 l 315 68 b 405 27 356 68 386 55 l 405 -95 b 337 -68 386 -76 363 -68 l 135 -68 b 45 68 76 -68 45 -23 z', + }, + accSagittalSharp19CUp: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 89 -109 l 89 -517 l 135 -517 l 135 -109 b 225 -27 170 -102 200 -75 l 225 -517 l 271 -517 l 271 14 b 337 -23 289 -10 311 -23 l 360 -23 l 360 -517 l 405 -517 l 405 -23 b 495 -203 465 -23 495 -82 l 540 -203 b 428 68 540 -23 503 68 l 360 68 b 248 248 310 68 271 128 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 89 -109 0 -39 30 -98 z', + }, + accSagittalFlat19CDown: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 89 109 b 0 -68 30 98 0 39 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 b 360 -68 271 -128 310 -68 l 428 -68 b 540 203 503 -68 540 23 l 495 203 b 405 23 495 82 465 23 l 405 517 l 360 517 l 360 23 l 337 23 b 271 -14 311 23 289 10 l 271 517 l 225 517 l 225 27 b 135 109 200 75 170 102 l 135 517 l 89 517 z', + }, + accSagittalSharp7v19CUp: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 89 -109 l 89 -517 l 135 -517 l 135 -109 b 225 -27 170 -102 200 -75 l 225 -517 l 271 -517 l 271 112 l 315 112 b 360 109 331 112 346 112 l 360 -517 l 405 -517 l 405 98 b 495 -68 465 73 495 19 l 495 -248 l 540 -248 l 540 68 b 360 248 540 189 480 248 l 248 248 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 89 -109 0 -39 30 -98 z', + }, + accSagittalFlat7v19CDown: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 89 109 b 0 -68 30 98 0 39 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 l 360 -248 b 540 -68 480 -248 540 -189 l 540 248 l 495 248 l 495 68 b 405 -98 495 -19 465 -73 l 405 517 l 360 517 l 360 -109 b 315 -112 346 -112 331 -112 l 271 -112 l 271 517 l 225 517 l 225 27 b 135 109 200 75 170 102 l 135 517 l 89 517 z', + }, + accSagittalSharp49SUp: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 203 -23 b 271 14 229 -23 251 -10 l 271 -517 l 315 -517 l 315 112 l 360 112 b 405 109 376 112 390 112 l 405 -517 l 449 -517 l 449 96 b 540 -68 510 72 540 17 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z', + }, + accSagittalFlat49SDown: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 449 -96 540 -17 510 -72 l 449 517 l 405 517 l 405 -109 b 360 -112 390 -112 376 -112 l 315 -112 l 315 517 l 271 517 l 271 -14 b 203 23 251 10 229 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z', + }, + accSagittalSharp23SUp: { + x_min: 0, + x_max: 469, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 135 -517 l 180 -517 l 180 -23 l 203 -23 b 271 14 229 -23 251 -10 l 271 -517 l 315 -517 l 315 71 l 405 -14 l 405 -517 l 449 -517 l 449 -56 l 675 -268 l 675 -112 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z', + }, + accSagittalFlat23SDown: { + x_min: 0, + x_max: 469, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 675 112 l 675 268 l 449 56 l 449 517 l 405 517 l 405 14 l 315 -71 l 315 517 l 271 517 l 271 -14 b 203 23 251 10 229 23 l 180 23 l 180 517 l 135 517 l 135 23 b 45 203 75 23 45 84 z', + }, + accSagittalSharp5v13MUp: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 495 141 l 495 14 l 0 -157 l 0 -256 l 225 -180 l 225 -517 l 271 -517 l 271 -161 l 360 -130 l 360 -517 l 405 -517 l 405 -115 l 495 -84 l 495 -517 l 540 -517 l 540 248 l 517 248 b 167 168 366 194 248 168 b 45 248 85 168 45 194 l 0 248 b 95 99 0 170 30 120 l 0 68 l 0 -30 z', + }, + accSagittalFlat5v13MDown: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 30 l 0 -68 l 95 -99 b 0 -248 30 -120 0 -170 l 45 -248 b 167 -168 45 -194 85 -168 b 517 -248 248 -168 366 -194 l 540 -248 l 540 517 l 495 517 l 495 84 l 405 115 l 405 517 l 360 517 l 360 130 l 271 161 l 271 517 l 225 517 l 225 180 l 0 256 l 0 157 l 495 -14 l 495 -141 z', + }, + accSagittalSharp11v19MUp: { + x_min: 0, + x_max: 438, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 180 104 45 26 89 82 l 180 -517 l 225 -517 l 225 112 l 315 112 l 315 -517 l 360 -517 l 360 14 b 428 -23 379 -10 402 -23 l 449 -23 l 449 -517 l 495 -517 l 495 -23 b 585 -203 554 -23 585 -84 l 631 -203 b 517 68 631 -23 593 68 l 449 68 b 337 248 400 68 363 127 l 225 248 b 0 68 75 248 0 187 z', + }, + accSagittalFlat11v19MDown: { + x_min: 0, + x_max: 438, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 337 -248 b 449 -68 363 -127 400 -68 l 517 -68 b 631 203 593 -68 631 23 l 585 203 b 495 23 585 84 554 23 l 495 517 l 449 517 l 449 23 l 428 23 b 360 -14 402 23 379 10 l 360 517 l 315 517 l 315 -112 l 225 -112 l 225 517 l 180 517 l 180 -104 b 45 68 89 -82 45 -26 l 45 248 l 0 248 z', + }, + accSagittalSharp49MUp: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -248 l 45 -248 l 225 -180 l 225 -517 l 271 -517 l 271 -166 l 360 -132 l 360 -517 l 405 -517 l 405 -117 l 495 -84 l 495 -517 l 540 -517 l 540 248 l 360 248 b 0 -68 120 248 0 143 z m 45 -145 l 45 -68 b 360 112 45 53 150 112 l 495 112 l 495 14 z', + }, + accSagittalFlat49MDown: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 68 b 360 -248 0 -143 120 -248 l 540 -248 l 540 517 l 495 517 l 495 84 l 405 117 l 405 517 l 360 517 l 360 132 l 271 166 l 271 517 l 225 517 l 225 180 l 45 248 l 0 248 z m 495 -14 l 495 -112 l 360 -112 b 45 68 150 -112 45 -53 l 45 145 z', + }, + accSagittalSharp5v49MUp: { + x_min: 0, + x_max: 469, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -271 l 180 -79 l 180 -517 l 225 -517 l 225 -30 l 315 65 l 315 -517 l 360 -517 l 360 65 l 449 -30 l 449 -517 l 495 -517 l 495 -79 l 675 -271 l 675 -112 l 337 248 b 118 89 239 143 166 89 b 45 157 68 89 45 112 l 0 157 b 107 0 0 62 36 10 l 0 -112 z', + }, + accSagittalFlat5v49MDown: { + x_min: 0, + x_max: 469, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 112 l 107 0 b 0 -157 36 -10 0 -62 l 45 -157 b 118 -89 45 -112 68 -89 b 337 -248 166 -89 239 -143 l 675 112 l 675 271 l 495 79 l 495 517 l 449 517 l 449 30 l 360 -65 l 360 517 l 315 517 l 315 -65 l 225 30 l 225 517 l 180 517 l 180 79 l 0 271 z', + }, + accSagittalSharp49LUp: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 -82 l 135 -112 l 135 -517 l 180 -517 l 180 -127 l 271 -157 l 271 -517 l 315 -517 l 315 -173 l 540 -248 l 585 -248 l 585 -68 b 180 248 585 143 449 248 l 0 248 z m 45 112 l 180 112 b 540 -68 420 112 540 53 l 540 -145 l 45 16 z', + }, + accSagittalFlat49LDown: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 180 -248 b 585 68 449 -248 585 -143 l 585 248 l 540 248 l 315 173 l 315 517 l 271 517 l 271 157 l 180 127 l 180 517 l 135 517 l 135 112 l 45 82 l 45 517 l 0 517 z m 45 -16 l 540 145 l 540 68 b 180 -112 540 -53 420 -112 l 45 -112 z', + }, + accSagittalSharp11v19LUp: { + x_min: 0, + x_max: 438, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -517 l 45 -517 l 45 -81 l 135 -108 l 135 -517 l 180 -517 l 180 -121 l 271 -148 l 271 -517 l 315 -517 l 315 -161 l 631 -255 l 631 -157 l 45 16 l 45 144 l 631 -30 l 631 68 l 23 248 l 0 248 z', + }, + accSagittalFlat11v19LDown: { + x_min: 0, + x_max: 438, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -248 l 23 -248 l 631 -68 l 631 30 l 45 -144 l 45 -16 l 631 157 l 631 255 l 315 161 l 315 517 l 271 517 l 271 148 l 180 121 l 180 517 l 135 517 l 135 108 l 45 81 l 45 517 l 0 517 z', + }, + accSagittalSharp5v13LUp: { + x_min: 0, + x_max: 500, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 89 -109 l 89 -517 l 135 -517 l 135 -109 b 225 -27 170 -102 200 -75 l 225 -517 l 271 -517 l 271 -85 l 360 -120 l 360 -517 l 405 -517 l 405 -135 l 720 -256 l 720 -157 l 271 14 l 271 141 l 720 -30 l 720 68 l 248 248 b 122 0 217 98 176 16 b 95 -3 112 0 104 -3 b 45 68 60 -3 45 20 l 0 68 b 89 -109 0 -39 30 -98 z', + }, + accSagittalFlat5v13LDown: { + x_min: 0, + x_max: 500, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 89 109 b 0 -68 30 98 0 39 l 45 -68 b 95 3 45 -20 60 3 b 122 0 104 3 112 0 b 248 -248 176 -16 217 -98 l 720 -68 l 720 30 l 271 -141 l 271 -14 l 720 157 l 720 256 l 405 135 l 405 517 l 360 517 l 360 120 l 271 85 l 271 517 l 225 517 l 225 27 b 135 109 200 75 170 102 l 135 517 l 89 517 z', + }, + accSagittalDoubleSharp23SDown: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -203 l 45 -203 b 135 -23 45 -82 76 -23 l 301 -23 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 370 -14 b 449 112 423 10 449 53 l 449 248 l 428 248 b 315 68 402 127 364 68 l 240 68 b 89 157 140 68 89 98 l 45 157 b 68 53 45 115 52 81 b 0 -203 23 23 0 -63 z', + }, + accSagittalDoubleFlat23SUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 68 -53 0 63 23 -23 b 45 -157 52 -81 45 -115 l 89 -157 b 240 -68 89 -98 140 -68 l 315 -68 b 428 -248 364 -68 402 -127 l 449 -248 l 449 -112 b 370 14 449 -53 423 -10 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 301 23 l 135 23 b 45 203 76 23 45 82 z', + }, + accSagittalDoubleSharp49SDown: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -292 l 45 -292 b 112 -157 45 -203 68 -157 l 256 -157 l 135 -503 l 187 -517 l 337 -82 l 490 -517 l 540 -503 l 366 0 l 396 89 b 449 157 416 102 435 125 l 449 248 l 428 248 b 315 157 413 187 376 157 l 112 157 b 0 -68 39 157 0 82 l 45 -68 b 135 68 45 23 76 68 l 287 68 l 311 0 l 288 -68 l 89 -68 b 0 -292 32 -68 0 -144 z', + }, + accSagittalDoubleFlat49SUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 292 b 89 68 0 144 32 68 l 288 68 l 311 0 l 287 -68 l 135 -68 b 45 68 76 -68 45 -23 l 0 68 b 112 -157 0 -82 39 -157 l 315 -157 b 428 -248 376 -157 413 -187 l 449 -248 l 449 -157 b 396 -89 435 -125 416 -102 l 366 0 l 540 503 l 490 517 l 337 82 l 187 517 l 135 503 l 256 157 l 112 157 b 45 292 68 157 45 203 z', + }, + accSagittalDoubleSharp7v19CDown: { + x_min: 0, + x_max: 375, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -112 l 0 -266 l 307 -7 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 366 0 l 386 59 l 449 112 l 449 248 l 428 248 b 130 68 285 127 186 68 b 45 157 73 68 45 98 l 0 157 b 112 -20 0 53 37 -6 z', + }, + accSagittalDoubleFlat7v19CUp: { + x_min: 0, + x_max: 375, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 112 20 b 0 -157 37 6 0 -53 l 45 -157 b 130 -68 45 -98 73 -68 b 428 -248 186 -68 285 -127 l 449 -248 l 449 -112 l 386 -59 l 366 0 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 307 7 l 0 266 l 0 112 z', + }, + accSagittalDoubleSharp19CDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 68 l 0 -248 l 45 -248 l 45 -68 b 315 109 45 36 135 95 l 354 0 l 180 -503 l 232 -517 l 383 -82 l 534 -517 l 585 -503 l 410 0 l 449 112 l 495 112 l 495 248 l 360 248 b 0 68 120 248 0 187 z m 372 112 l 393 112 l 383 82 z', + }, + accSagittalDoubleFlat19CUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 360 -248 0 -187 120 -248 l 495 -248 l 495 -112 l 449 -112 l 410 0 l 585 503 l 534 517 l 383 82 l 232 517 l 180 503 l 354 0 l 315 -109 b 45 68 135 -95 45 -36 l 45 248 l 0 248 z m 383 -82 l 393 -112 l 372 -112 z', + }, + accSagittalDoubleSharp11v49CDown: { + x_min: 0, + x_max: 406, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 203 -23 b 262 4 225 -23 245 -13 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 360 112 b 540 -68 480 112 540 53 l 540 -248 l 585 -248 l 585 68 b 405 248 585 187 526 248 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z', + }, + accSagittalDoubleFlat11v49CUp: { + x_min: 0, + x_max: 406, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 405 -248 b 585 -68 526 -248 585 -187 l 585 248 l 540 248 l 540 68 b 360 -112 540 -53 480 -112 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 262 -4 b 203 23 245 13 225 23 l 135 23 b 45 203 75 23 45 84 z', + }, + accSagittalDoubleSharp143CDown: { + x_min: 0, + x_max: 469, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 45 -203 b 135 -23 45 -84 75 -23 l 203 -23 b 262 4 225 -23 245 -13 l 265 0 l 89 -503 l 141 -517 l 292 -82 l 444 -517 l 495 -503 l 321 0 l 337 49 l 675 -268 l 675 -112 l 292 248 b 180 68 268 127 230 68 l 112 68 b 0 -203 37 68 0 -23 z', + }, + accSagittalDoubleFlat143CUp: { + x_min: 0, + x_max: 469, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 203 b 112 -68 0 23 37 -68 l 180 -68 b 292 -248 230 -68 268 -127 l 675 112 l 675 268 l 337 -49 l 321 0 l 495 503 l 444 517 l 292 82 l 141 517 l 89 503 l 265 0 l 262 -4 b 203 23 245 13 225 23 l 135 23 b 45 203 75 23 45 84 z', + }, + accSagittalDoubleSharp17kDown: { + x_min: 0, + x_max: 438, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 248 b 95 101 0 170 30 121 l 0 68 l 0 -30 l 364 96 l 399 0 l 390 -23 l 0 -157 l 0 -255 l 353 -135 l 225 -503 l 275 -517 l 428 -82 l 577 -517 l 631 -503 l 455 0 l 507 145 l 540 157 l 540 248 l 517 248 b 167 168 366 194 248 168 b 45 248 85 168 45 194 z m 416 115 l 442 124 l 428 82 z', + }, + accSagittalDoubleFlat17kUp: { + x_min: 0, + x_max: 438, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 45 -248 b 167 -168 45 -194 85 -168 b 517 -248 248 -168 366 -194 l 540 -248 l 540 -157 l 507 -145 l 455 0 l 631 503 l 577 517 l 428 82 l 275 517 l 225 503 l 353 135 l 0 255 l 0 157 l 390 23 l 399 0 l 364 -96 l 0 30 l 0 -68 l 95 -101 b 0 -248 30 -121 0 -170 z m 428 -82 l 442 -124 l 416 -115 z', + }, + accSagittalDoubleSharp19sDown: { + x_min: 0, + x_max: 438, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 -248 l 45 -248 l 45 -68 b 271 112 45 53 120 112 l 310 0 l 135 -503 l 186 -517 l 337 -82 l 488 -517 l 540 -503 l 366 0 l 367 4 b 428 -23 386 -13 405 -23 l 495 -23 b 585 -203 554 -23 585 -84 l 631 -203 b 517 68 631 -23 593 68 l 449 68 b 337 248 400 68 363 127 l 225 248 b 0 68 75 248 0 187 z', + }, + accSagittalDoubleFlat19sUp: { + x_min: 0, + x_max: 438, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 0 -68 b 225 -248 0 -187 75 -248 l 337 -248 b 449 -68 363 -127 400 -68 l 517 -68 b 631 203 593 -68 631 23 l 585 203 b 495 23 585 84 554 23 l 428 23 b 367 -4 405 23 386 13 l 366 0 l 540 503 l 488 517 l 337 82 l 186 517 l 135 503 l 310 0 l 271 -112 b 45 68 120 -112 45 -53 l 45 248 l 0 248 z', + }, + accSagittalShaftUp: { + x_min: 0, + x_max: 31, + y_min: -359, + y_max: 172, + ha: 531, + o: 'm 0 112 l 0 -517 l 45 -517 l 45 112 l 23 248 z', + }, + accSagittalShaftDown: { + x_min: 0, + x_max: 31, + y_min: -172, + y_max: 359, + ha: 531, + o: 'm 23 -248 l 45 -112 l 45 517 l 0 517 l 0 -112 z', + }, + accSagittalAcute: { + x_min: 0, + x_max: 125, + y_min: -62, + y_max: 125, + ha: 187, + o: 'm 0 0 l 0 -89 l 180 89 l 180 180 z', + }, + accSagittalGrave: { + x_min: 0, + x_max: 125, + y_min: -125, + y_max: 62, + ha: 187, + o: 'm 180 -180 l 180 -89 l 0 89 l 0 0 z', + }, + accSagittal1MinaUp: { + x_min: -7, + x_max: 124, + y_min: 16, + y_max: 106.31676725154982, + ha: 90.31676725154982, + o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 134 150 179 112 163 135 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z', + }, + accSagittal1MinaDown: { + x_min: -7, + x_max: 124, + y_min: -106.31676725154983, + y_max: -16, + ha: 90.31676725154983, + o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 179 -23 163 -135 179 -112 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z', + }, + accSagittal2MinasUp: { + x_min: -7, + x_max: 218, + y_min: 16, + y_max: 106.31676725154982, + ha: 90.31676725154982, + o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 207 65 179 23 200 55 b 252 107 223 86 240 107 b 271 23 264 107 272 86 l 314 23 b 269 150 314 112 298 135 b 203 130 252 158 220 150 b 173 92 190 115 181 104 b 134 150 167 127 154 140 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z', + }, + accSagittal2MinasDown: { + x_min: -7, + x_max: 218, + y_min: -106.31676725154983, + y_max: -16, + ha: 90.31676725154983, + o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 173 -92 154 -140 167 -127 b 203 -130 181 -104 190 -115 b 269 -150 220 -150 252 -158 b 314 -23 298 -135 314 -112 l 271 -23 b 252 -107 272 -86 264 -107 b 207 -65 240 -107 223 -86 b 179 -23 200 -55 179 -23 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z', + }, + accSagittal1TinaUp: { + x_min: 0, + x_max: 93, + y_min: 16, + y_max: 107, + ha: 91, + o: 'm 134 154 l 91 154 b 81 76 91 101 91 86 b 0 68 73 69 48 68 l 0 23 b 134 154 122 23 134 36 z', + }, + accSagittal1TinaDown: { + x_min: 0, + x_max: 93, + y_min: -107, + y_max: -16, + ha: 91, + o: 'm 134 -154 b 0 -23 134 -36 122 -23 l 0 -68 b 81 -76 48 -68 73 -69 b 91 -154 91 -86 91 -101 z', + }, + accSagittal2TinasUp: { + x_min: 0, + x_max: 94, + y_min: 16, + y_max: 107, + ha: 91, + o: 'm 135 68 b 89 154 94 68 89 124 l 46 154 b 36 92 45 131 42 105 b 0 68 32 82 23 68 l 0 23 b 68 63 29 23 53 40 b 135 23 84 39 104 23 z', + }, + accSagittal2TinasDown: { + x_min: 0, + x_max: 94, + y_min: -107, + y_max: -16, + ha: 91, + o: 'm 135 -23 b 68 -63 104 -23 84 -39 b 0 -23 53 -40 29 -23 l 0 -68 b 36 -92 23 -68 32 -82 b 46 -154 42 -105 45 -131 l 89 -154 b 135 -68 89 -124 94 -68 z', + }, + accSagittal3TinasUp: { + x_min: -7, + x_max: 124, + y_min: 16, + y_max: 106.31676725154982, + ha: 90.31676725154982, + o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 134 150 179 112 163 135 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z', + }, + accSagittal3TinasDown: { + x_min: -7, + x_max: 124, + y_min: -106.31676725154983, + y_max: -16, + ha: 90.31676725154983, + o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 179 -23 163 -135 179 -112 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z', + }, + accSagittal4TinasUp: { + x_min: 0, + x_max: 187, + y_min: 16, + y_max: 106.69999999999997, + ha: 90.69999999999997, + o: 'm 0 68 l 0 23 b 143 45 105 23 124 26 b 203 107 153 55 183 107 b 226 23 216 107 226 86 l 269 23 b 225 150 269 112 253 135 b 160 132 207 158 181 153 b 115 81 138 112 124 88 b 0 68 104 71 94 68 z', + }, + accSagittal4TinasDown: { + x_min: 0, + x_max: 187, + y_min: -106.69999999999999, + y_max: -16, + ha: 90.69999999999999, + o: 'm 0 -68 b 115 -81 94 -68 104 -71 b 160 -132 124 -88 138 -112 b 225 -150 181 -153 207 -158 b 269 -23 253 -135 269 -112 l 226 -23 b 203 -107 226 -86 216 -107 b 143 -45 183 -107 153 -55 b 0 -23 124 -26 105 -23 z', + }, + accSagittal5TinasUp: { + x_min: 0, + x_max: 218, + y_min: 16, + y_max: 107, + ha: 91, + o: 'm 135 23 b 187 45 156 23 168 26 b 249 107 197 55 228 107 b 271 23 262 107 271 86 l 314 23 b 269 150 314 112 298 135 b 204 132 252 158 226 153 b 160 81 183 112 168 88 b 135 68 148 71 147 68 b 89 154 94 68 89 124 l 46 154 b 36 92 45 131 42 105 b 0 68 32 82 23 68 l 0 23 b 68 63 29 23 53 40 b 135 23 84 39 104 23 z', + }, + accSagittal5TinasDown: { + x_min: 0, + x_max: 218, + y_min: -107, + y_max: -16, + ha: 91, + o: 'm 135 -23 b 68 -63 104 -23 84 -39 b 0 -23 53 -40 29 -23 l 0 -68 b 36 -92 23 -68 32 -82 b 46 -154 42 -105 45 -131 l 89 -154 b 135 -68 89 -124 94 -68 b 160 -81 147 -68 148 -71 b 204 -132 168 -88 183 -112 b 269 -150 226 -153 252 -158 b 314 -23 298 -135 314 -112 l 271 -23 b 249 -107 271 -86 262 -107 b 187 -45 228 -107 197 -55 b 135 -23 168 -26 156 -23 z', + }, + accSagittal6TinasUp: { + x_min: -7, + x_max: 218, + y_min: 16, + y_max: 106.31676725154982, + ha: 90.31676725154982, + o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 207 65 179 23 200 55 b 252 107 223 86 240 107 b 271 23 264 107 272 86 l 314 23 b 269 150 314 112 298 135 b 203 130 252 158 220 150 b 173 92 190 115 181 104 b 134 150 167 127 154 140 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z', + }, + accSagittal6TinasDown: { + x_min: -7, + x_max: 218, + y_min: -106.31676725154983, + y_max: -16, + ha: 90.31676725154983, + o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 173 -92 154 -140 167 -127 b 203 -130 181 -104 190 -115 b 269 -150 220 -150 252 -158 b 314 -23 298 -135 314 -112 l 271 -23 b 252 -107 272 -86 264 -107 b 207 -65 240 -107 223 -86 b 179 -23 200 -55 179 -23 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z', + }, + accSagittal7TinasUp: { + x_min: 0, + x_max: 281, + y_min: 16, + y_max: 106.69999999999997, + ha: 90.69999999999997, + o: 'm 0 68 l 0 23 b 143 45 105 23 124 26 b 203 107 153 55 183 107 b 226 23 216 107 226 86 l 269 23 b 298 65 269 23 291 55 b 343 107 314 86 331 107 b 361 23 354 107 363 86 l 405 23 b 360 150 405 112 389 135 b 294 130 343 158 311 150 b 264 92 281 115 272 104 b 225 150 258 127 245 140 b 160 132 207 158 181 153 b 115 81 138 112 124 88 b 0 68 104 71 94 68 z', + }, + accSagittal7TinasDown: { + x_min: 0, + x_max: 281, + y_min: -106.69999999999999, + y_max: -16, + ha: 90.69999999999999, + o: 'm 0 -68 b 115 -81 94 -68 104 -71 b 160 -132 124 -88 138 -112 b 225 -150 181 -153 207 -158 b 264 -92 245 -140 258 -127 b 294 -130 272 -104 281 -115 b 360 -150 311 -150 343 -158 b 405 -23 389 -135 405 -112 l 361 -23 b 343 -107 363 -86 354 -107 b 298 -65 331 -107 314 -86 b 269 -23 291 -55 269 -23 l 226 -23 b 203 -107 226 -86 216 -107 b 143 -45 183 -107 153 -55 b 0 -23 124 -26 105 -23 z', + }, + accSagittal8TinasUp: { + x_min: 0, + x_max: 312, + y_min: 16, + y_max: 107, + ha: 91, + o: 'm 135 23 b 187 45 156 23 168 26 b 249 107 197 55 228 107 b 271 23 262 107 271 86 l 314 23 b 343 65 314 23 336 55 b 387 107 359 86 376 107 b 406 23 399 107 408 86 l 449 23 b 405 150 449 112 433 135 b 338 130 387 158 356 150 b 308 92 325 115 317 104 b 269 150 302 127 289 140 b 204 132 252 158 226 153 b 160 81 183 112 168 88 b 135 68 148 71 147 68 b 89 154 94 68 89 124 l 46 154 b 36 92 45 131 42 105 b 0 68 32 82 23 68 l 0 23 b 68 63 29 23 53 40 b 135 23 84 39 104 23 z', + }, + accSagittal8TinasDown: { + x_min: 0, + x_max: 312, + y_min: -107, + y_max: -16, + ha: 91, + o: 'm 135 -23 b 68 -63 104 -23 84 -39 b 0 -23 53 -40 29 -23 l 0 -68 b 36 -92 23 -68 32 -82 b 46 -154 42 -105 45 -131 l 89 -154 b 135 -68 89 -124 94 -68 b 160 -81 147 -68 148 -71 b 204 -132 168 -88 183 -112 b 269 -150 226 -153 252 -158 b 308 -92 289 -140 302 -127 b 338 -130 317 -104 325 -115 b 405 -150 356 -150 387 -158 b 449 -23 433 -135 449 -112 l 406 -23 b 387 -107 408 -86 399 -107 b 343 -65 376 -107 359 -86 b 314 -23 336 -55 314 -23 l 271 -23 b 249 -107 271 -86 262 -107 b 187 -45 228 -107 197 -55 b 135 -23 168 -26 156 -23 z', + }, + accSagittal9TinasUp: { + x_min: -7, + x_max: 312, + y_min: 16, + y_max: 106.31676725154982, + ha: 90.31676725154982, + o: 'm -10 23 l 43 23 b 72 65 43 23 65 55 b 117 107 88 86 105 107 b 135 23 128 107 137 86 l 179 23 b 207 65 179 23 200 55 b 252 107 223 86 240 107 b 271 23 264 107 272 86 l 314 23 b 343 65 314 23 336 55 b 387 107 359 86 376 107 b 406 23 399 107 408 86 l 449 23 b 405 150 449 112 433 135 b 338 130 387 158 356 150 b 308 92 325 115 317 104 b 269 150 302 127 289 140 b 203 130 252 158 220 150 b 173 92 190 115 181 104 b 134 150 167 127 154 140 b 68 130 117 158 85 150 b -10 23 43 101 13 58 z', + }, + accSagittal9TinasDown: { + x_min: -7, + x_max: 312, + y_min: -106.31676725154983, + y_max: -16, + ha: 90.31676725154983, + o: 'm -10 -23 b 68 -130 13 -58 43 -101 b 134 -150 85 -150 117 -158 b 173 -92 154 -140 167 -127 b 203 -130 181 -104 190 -115 b 269 -150 220 -150 252 -158 b 308 -92 289 -140 302 -127 b 338 -130 317 -104 325 -115 b 405 -150 356 -150 387 -158 b 449 -23 433 -135 449 -112 l 406 -23 b 387 -107 408 -86 399 -107 b 343 -65 376 -107 359 -86 b 314 -23 336 -55 314 -23 l 271 -23 b 252 -107 272 -86 264 -107 b 207 -65 240 -107 223 -86 b 179 -23 200 -55 179 -23 l 135 -23 b 117 -107 137 -86 128 -107 b 72 -65 105 -107 88 -86 b 43 -23 65 -55 43 -23 z', + }, + accSagittalFractionalTinaUp: { + x_min: -3, + x_max: 35, + y_min: 73, + y_max: 111, + ha: 38, + o: 'm -4 132 b 23 105 -4 118 9 105 b 50 132 37 105 50 118 b 23 160 50 147 37 160 b -4 132 9 160 -4 147 z', + }, + accSagittalFractionalTinaDown: { + x_min: -3, + x_max: 35, + y_min: -111, + y_max: -73, + ha: 38, + o: 'm -4 -132 b 23 -160 -4 -147 9 -160 b 50 -132 37 -160 50 -147 b 23 -105 50 -118 37 -105 b -4 -132 9 -105 -4 -118 z', + }, + accidentalNarrowReversedFlat: { + x_min: 0, + x_max: 164, + y_min: -194, + y_max: 421, + ha: 615, + o: 'm 236 -279 l 236 606 l 192 606 l 192 179 b 85 243 150 222 114 243 b 0 84 23 243 0 134 b 112 -158 0 3 37 -78 z m 192 112 l 192 -163 l 135 -98 b 82 40 101 -50 82 -3 b 138 144 82 73 96 144 b 192 112 153 144 170 132 z', + }, + accidentalNarrowReversedFlatAndFlat: { + x_min: 0, + x_max: 414, + y_min: -194, + y_max: 421, + ha: 615, + o: 'm 281 606 l 281 -268 l 438 -158 b 596 84 547 -82 596 3 b 475 243 596 154 556 243 b 325 179 435 243 384 222 l 325 606 z m 235 -279 l 235 606 l 190 606 l 190 179 b 85 243 148 222 114 243 b 12 158 52 243 27 215 b 0 84 3 134 0 108 b 112 -158 0 3 37 -78 z m 325 111 b 410 144 359 132 386 144 b 498 36 462 144 498 84 b 413 -107 498 -9 469 -58 l 325 -173 z m 192 112 l 192 -163 l 135 -98 b 81 40 99 -50 81 -3 b 91 94 81 59 84 76 b 137 144 102 127 118 144 b 192 112 153 144 170 132 z', + }, + accidentalWilsonPlus: { + x_min: 0, + x_max: 281, + y_min: -203, + y_max: 203, + ha: 406, + o: 'm 405 268 l 225 98 l 225 292 l 180 292 l 180 56 l 0 -112 l 0 -268 l 180 -98 l 180 -292 l 225 -292 l 225 -56 l 405 112 z', + }, + accidentalWilsonMinus: { + x_min: 0, + x_max: 281, + y_min: -186, + y_max: 186, + ha: 372, + o: 'm 0 112 l 405 -268 l 405 -112 l 0 268 z', + }, + }, + fontFamily: 'Bravura', + resolution: 1000, + generatedOn: '2021-12-06T21:04:30.234Z', +}; diff --git a/build/esm/src/fonts/bravura_metrics.js b/build/esm/src/fonts/bravura_metrics.js new file mode 100644 index 0000000000..3814f18cd1 --- /dev/null +++ b/build/esm/src/fonts/bravura_metrics.js @@ -0,0 +1,504 @@ +export const BravuraMetrics = { + name: 'Bravura', + smufl: true, + stave: { + padding: 12, + endPaddingMax: 10, + endPaddingMin: 5, + unalignedNotePadding: 10, + }, + accidental: { + noteheadAccidentalPadding: 1, + leftPadding: 2, + accidentalSpacing: 3, + }, + clef: { + default: { + point: 32, + width: 26, + }, + small: { + point: 26, + width: 20, + }, + annotations: { + '8va': { + smuflCode: 'timeSig8', + default: { + point: 18, + treble: { + line: -1.4, + shiftX: 12, + }, + }, + small: { + point: 16, + treble: { + line: -0.2, + shiftX: 8, + }, + }, + }, + '8vb': { + smuflCode: 'timeSig8', + default: { + point: 18, + treble: { + line: 6, + shiftX: 10, + }, + bass: { + line: 3.5, + shiftX: 1, + }, + }, + small: { + point: 16, + treble: { + line: 5.3, + shiftX: 6, + }, + bass: { + line: 3.1, + shiftX: 0.5, + }, + }, + }, + }, + lineCount: { + '8': { point: 55, shiftY: 14 }, + '7': { point: 47, shiftY: 8 }, + '6': { point: 32, shiftY: 1 }, + '5': { point: 30, shiftY: -6 }, + '4': { point: 23, shiftY: -12 }, + }, + }, + parenthesis: { + default: { + point: 39, + width: 7, + }, + gracenote: { + point: (39 * 3) / 5, + width: 3, + }, + }, + pedalMarking: { + up: { + point: 40, + }, + down: { + point: 34, + }, + }, + digits: { + shiftLine: -1, + point: 34, + tupletPoint: 22, + shiftY: -6, + }, + articulation: { + articStaccatissimoAbove: { + padding: 2, + }, + articStaccatissimoBelow: { + padding: 2, + }, + }, + tremolo: { + default: { + point: 25, + spacing: 5, + offsetYStemUp: -5, + offsetYStemDown: 5, + offsetXStemUp: 11, + offsetXStemDown: 1, + }, + grace: { + point: 18, + spacing: 4, + offsetYStemUp: -5, + offsetYStemDown: 5, + offsetXStemUp: 7, + offsetXStemDown: 1, + }, + }, + staveRepetition: { + default: { + offsetY: 25, + offsetSymbol: 12, + spacing: 5, + }, + }, + stem: { + heightAdjustmentForFlag: -3, + noteHead: { + noteheadTriangleUpHalf: { + offsetYBaseStemUp: 5, + offsetYBaseStemDown: 4, + }, + noteheadTriangleUpBlack: { + offsetYBaseStemUp: 5, + offsetYBaseStemDown: 4, + }, + noteheadTriangleUpWhole: { + offsetYBaseStemUp: 5, + offsetYBaseStemDown: 4, + }, + noteheadXHalf: { + offsetYBaseStemUp: -4, + offsetYBaseStemDown: 4, + }, + noteheadXBlack: { + offsetYBaseStemUp: -4, + offsetYBaseStemDown: 4, + }, + noteheadXWhole: { + offsetYBaseStemUp: -4, + offsetYBaseStemDown: 4, + }, + noteheadHalf: { + offsetYBaseStemUp: -2.55, + offsetYBaseStemDown: 2.65, + }, + noteheadBlack: { + offsetYBaseStemUp: -2, + offsetYBaseStemDown: 2, + }, + noteheadSquareWhite: { + offsetYBaseStemDown: -5, + offsetYBaseStemUp: 5, + }, + }, + }, + glyphs: { + coda: { + point: 20, + shiftX: -7, + shiftY: 8, + }, + segno: { + shiftX: -7, + }, + flag: { + shiftX: -0.75, + tabStem: { + shiftX: -1.75, + }, + staveTempo: { + shiftX: -1, + }, + }, + clef: { + gClef: { + default: { scale: 1.1, shiftY: 1 }, + small: { shiftY: 1.5 }, + }, + fClef: { + default: { shiftY: -0.5 }, + }, + }, + ornament: { + ornamentTurn: { + scale: 1.2, + }, + ornamentTurnSlash: { + scale: 1.2, + }, + }, + stringNumber: { + verticalPadding: 8, + stemPadding: 2, + leftPadding: 5, + rightPadding: 6, + }, + stroke: { + arrowheadBlackDown: { + straight: { + shiftX: -4.5, + }, + wiggly: { + shiftX: -1, + shiftY: 1, + }, + }, + arrowheadBlackUp: { + straight: { + shiftX: -0.85, + }, + wiggly: { + shiftX: -1, + shiftY: 1, + }, + }, + }, + textNote: { + point: 34, + breathMarkTick: { + point: 36, + shiftY: 9, + }, + breathMarkComma: { + point: 36, + }, + segno: { + point: 30, + shiftX: -7, + shiftY: 8, + }, + coda: { + point: 20, + shiftX: -7, + shiftY: 8, + }, + ornamentTrill: { + shiftX: -8, + shiftY: 8, + }, + ornamentTurn: { + point: 42, + }, + ornamentTurnSlash: { + point: 42, + }, + ornamentMordent: { + shiftX: -8, + }, + ornamentShortTrill: { + shiftX: -8, + }, + }, + noteHead: { + minPadding: 2, + standard: { + restQuarterStemUp: { + point: 35, + }, + restQuarterStemDown: { + point: 35, + }, + }, + custom: { + noteheadCircleXStemUp: { + shiftX: 1.5, + }, + noteheadCircleXStemDown: { + shiftX: 0.25, + }, + noteheadDiamondHalfStemUp: { + shiftX: 1.5, + }, + noteheadDiamondBlackStemUp: { + shiftX: 1.5, + }, + noteheadDiamondWholeStemUp: { + shiftX: 1, + }, + noteheadXHalfStemUp: { + shiftX: -2, + }, + noteheadXHalfStemDown: { + shiftX: 1, + }, + noteheadXWholeStemUp: { + shiftX: -4, + }, + noteheadXWholeStemDown: { + shiftX: 1, + }, + noteheadSquareWhiteStemDown: { + shiftX: 0.25, + }, + noteheadSquareWhiteStemUp: { + shiftX: -0.75, + }, + noteheadSquareBlackStemUp: { + shiftX: -0.75, + }, + noteheadTriangleUpWholeStemUp: { + shiftX: -0.75, + }, + }, + }, + chordSymbol: { + global: { + superscriptOffset: -400, + subscriptOffset: 300, + kerningOffset: -250, + lowerKerningText: ['D', 'F', 'P', 'T', 'V', 'Y'], + upperKerningText: ['A', 'L'], + spacing: 100, + superSubRatio: 0.66, + }, + csymDiminished: { + scale: 0.8, + leftSideBearing: -32, + advanceWidth: 506, + yOffset: 0, + }, + csymHalfDiminished: { + scale: 0.8, + leftSideBearing: -32, + advanceWidth: 506, + yOffset: 0, + }, + csymAugmented: { + scale: 1, + leftSideBearing: 0, + advanceWidth: 530, + yOffset: 0, + }, + csymParensLeftTall: { + scale: 0.8, + leftSideBearing: -20, + advanceWidth: 184, + yOffset: 250, + }, + csymParensRightTall: { + scale: 0.8, + leftSideBearing: 0, + advanceWidth: 189, + yOffset: 250, + }, + csymBracketLeftTall: { + scale: 0.8, + leftSideBearing: 0, + advanceWidth: 328, + yOffset: 0, + }, + csymBracketRightTall: { + scale: 0.8, + leftSideBearing: 1, + advanceWidth: 600, + yOffset: 0, + }, + csymParensLeftVeryTall: { + scale: 0.9, + leftSideBearing: 50, + advanceWidth: 121, + yOffset: 350, + }, + csymParensRightVeryTall: { + scale: 0.9, + leftSideBearing: 0, + advanceWidth: 111, + yOffset: 350, + }, + csymDiagonalArrangementSlash: { + scale: 0.6, + leftSideBearing: -1, + advanceWidth: 990, + yOffset: 0, + }, + csymMinor: { + scale: 0.8, + leftSideBearing: 0, + advanceWidth: 482, + yOffset: 0, + }, + csymMajorSeventh: { + scale: 0.9, + leftSideBearing: 200, + yOffset: 0, + advanceWidth: 600, + }, + accidentalSharp: { + scale: 0.75, + leftSideBearing: 20, + advanceWidth: 250, + yOffset: -302, + }, + accidentalFlat: { + scale: 0.9, + leftSideBearing: -20, + advanceWidth: 226, + yOffset: -184, + }, + }, + jazzOrnaments: { + brassScoop: { + scale: 1.0, + xOffset: -12, + yOffset: 0, + stemUpYOffset: 0, + reportedWidth: 10, + }, + brassDoitMedium: { + scale: 1.0, + xOffset: 16, + yOffset: 0, + stemUpYOffset: 0, + reportedWidth: 15, + }, + brassFallLipShort: { + scale: 1.0, + xOffset: 16, + yOffset: 0, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassLiftMedium: { + scale: 1.0, + xOffset: 16, + yOffset: 5, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassFallRoughMedium: { + scale: 1.0, + xOffset: 16, + yOffset: 28, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassBend: { + scale: 1.0, + xOffset: 2, + yOffset: -8, + stemUpYOffset: 25, + reportedWidth: 5, + }, + brassMuteClosed: { + scale: 1.0, + xOffset: 3, + yOffset: -8, + stemUpYOffset: 25, + reportedWidth: 5, + }, + brassMuteOpen: { + scale: 1.0, + xOffset: 3, + yOffset: -7, + stemUpYOffset: 25, + reportedWidth: 5, + }, + brassFlip: { + scale: 1.0, + xOffset: 10, + yOffset: -4, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassJazzTurn: { + scale: 1.0, + xOffset: 6, + yOffset: -4, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassSmear: { + scale: 1.0, + xOffset: 10, + yOffset: -4, + stemUpYOffset: 0, + reportedWidth: 5, + }, + }, + tuplet: { + noteHeadOffset: 20, + stemOffset: 10, + bottomLine: 4, + topModifierOffset: 15, + }, + }, +}; diff --git a/build/esm/src/fonts/custom_glyphs.js b/build/esm/src/fonts/custom_glyphs.js new file mode 100644 index 0000000000..9ce490bf82 --- /dev/null +++ b/build/esm/src/fonts/custom_glyphs.js @@ -0,0 +1,78 @@ +export const CustomFont = { + resolution: 1000, + fontFamily: 'VexFlowCustom', + glyphs: { + noteheadSquareWhite: { + x_min: 0, + x_max: 430.75, + ha: 386, + o: 'm 0 200 l 0 -200 l 430 -200 l 430 200 l 0 200 l 50 150 l 380 150 l 380 -150 l 50 -150 l 50 150 ', + }, + noteheadSquareBlack: { + x_min: 0, + x_max: 430.75, + ha: 386, + o: 'm 0 200 l 0 -200 l 430 -200 l 430 200 l 0 200 ', + }, + accidentalBuyukMucennebFlat: { + x_min: -171.5, + x_max: 251.8125, + ha: 257, + o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 553 20 616 20 614 b 20 491 20 503 20 491 l 20 491 b 153 535 47 501 149 535 b 174 514 167 535 174 524 b 164 496 174 508 171 501 b 92 470 164 495 132 484 l 20 445 l 20 390 b 20 363 20 378 20 370 b 20 333 20 340 20 333 l 20 333 b 153 377 47 344 149 377 b 174 356 167 377 174 367 b 164 338 174 349 171 342 b 92 312 164 338 132 326 l 20 288 l 20 219 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 30 -21 -212 -21 -212 b -21 273 -21 163 -21 273 b -84 252 -21 273 -50 263 b -152 230 -133 234 -145 230 b -157 231 -155 230 -156 231 b -171 252 -166 234 -171 244 b -160 270 -171 259 -167 266 b -27 316 -159 270 -93 294 l -21 319 l -21 374 b -21 431 -21 406 -21 431 b -84 409 -21 431 -50 421 b -152 388 -133 392 -145 388 b -157 390 -155 388 -156 388 b -171 409 -166 392 -171 401 b -160 428 -171 417 -167 424 b -27 474 -159 428 -93 451 l -21 476 l -21 546 b -20 620 -21 614 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ', + }, + accidentalBakiyeFlat: { + x_min: -176.9375, + x_max: 251.8125, + ha: 257, + o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 503 20 616 20 614 b 20 391 20 442 20 391 b 84 424 20 391 49 406 l 147 456 l 152 456 b 153 456 153 456 153 456 b 175 435 166 456 175 446 b 172 427 175 433 174 430 b 92 380 170 420 172 421 l 20 342 l 20 245 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 54 -21 -212 -21 -212 b -21 322 -21 201 -21 322 b -85 290 -21 322 -50 308 l -148 256 l -153 256 b -155 256 -155 256 -155 256 b -176 277 -167 256 -176 266 b -174 285 -176 280 -175 283 b -93 333 -171 294 -174 292 l -21 370 l -21 494 b -20 620 -21 616 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ', + }, + accidentalKucukMucennebSharp: { + x_min: -1.359375, + x_max: 255.890625, + ha: 261, + o: 'm 118 514 b 127 517 121 517 122 517 b 147 505 136 517 142 513 l 148 502 l 148 403 b 148 306 148 351 148 306 b 174 315 149 306 160 310 l 200 324 l 205 323 b 223 312 213 323 220 319 l 225 308 l 225 260 b 225 245 225 255 225 249 b 220 204 225 208 224 209 b 179 188 216 199 215 199 l 148 177 l 148 124 l 148 70 l 189 84 b 236 98 219 94 230 98 b 247 94 240 98 243 97 b 255 52 254 88 255 87 b 255 33 255 47 255 40 l 254 -12 l 253 -15 b 249 -22 253 -18 250 -20 l 245 -24 l 196 -41 l 148 -58 l 148 -108 b 148 -158 148 -136 148 -158 b 174 -148 148 -158 160 -154 b 204 -140 198 -140 200 -140 l 204 -140 b 224 -152 213 -140 221 -145 b 225 -201 224 -155 225 -177 b 224 -254 225 -226 224 -251 b 157 -284 220 -262 220 -262 l 148 -288 l 148 -395 l 148 -503 l 147 -506 b 127 -519 142 -514 134 -519 b 107 -506 119 -519 111 -514 l 106 -503 l 106 -403 b 106 -303 106 -316 106 -303 b 104 -303 104 -303 104 -303 b 88 -310 104 -303 96 -306 l 63 -319 b 51 -322 59 -320 55 -322 b 36 -315 46 -322 40 -319 b 31 -273 32 -309 31 -312 b 31 -258 31 -269 31 -263 l 31 -210 l 34 -206 b 40 -198 35 -204 38 -199 b 74 -186 42 -197 57 -191 l 106 -173 l 106 -123 b 106 -97 106 -112 106 -104 b 106 -72 106 -76 106 -72 b 104 -72 106 -72 106 -72 b 20 -99 89 -79 23 -99 b 0 -84 10 -99 2 -93 b -1 -37 0 -81 -1 -59 b 0 11 -1 -15 0 9 b 58 40 4 22 2 22 l 106 56 l 106 109 b 106 123 106 115 106 119 b 106 162 106 147 106 162 b 81 155 106 162 93 159 b 50 147 65 149 55 147 b 36 152 43 147 40 148 b 31 194 32 158 31 156 b 31 209 31 198 31 204 l 31 256 l 34 260 b 76 281 38 269 38 269 l 106 292 l 106 396 l 106 502 l 107 505 b 118 514 110 509 114 513 ', + }, + accidentalKoron: { + x_min: -20, + x_max: 320, + ha: 257, + o: 'm -8 200 b -8 210 8 200 16 200 l 20 148 -199 l 23 -615 b 0 -629 9 -629 6 -629 l -21 -612 l -21 -201 l -21 216 l -20 200 m 16 200 l 310 0 l 240 0 l 16 140 l 16 -120 l 240 0 l 310 0 l 16 -200 ', + }, + accidentalSori: { + x_min: -10.890625, + x_max: 299.4375, + ha: 294, + o: 'm 44 174 b 51 174 47 174 49 174 b 68 173 55 174 61 174 l 287 112 l 551 40 b 615 20 617 22 609 23 b 626 0 622 16 626 8 b 615 -22 626 -9 622 -18 b 613 -23 613 -23 613 -23 b 613 -23 613 -23 613 -23 b 287 -113 613 -24 597 -29 l 68 -174 b 53 -176 61 -176 57 -176 b 39 -172 47 -176 43 -174 b 27 -151 31 -167 27 -159 b 39 -129 27 -141 31 -133 b 230 -74 43 -124 20 -131 l 370 -36 l 468 -9 b 498 0 484 -4 498 -1 b 468 8 498 0 484 2 l 370 34 l 230 73 b 40 126 28 129 43 124 b 27 149 31 131 27 140 b 44 174 27 161 34 170 m 205 110 l 205 300 b 205 330 245 330 245 300 l 245 300 l 245 -300 b 245 -330 205 -330 205 -300 l 205 -300 l 205 110 l 345 90 m 345 90 l 345 330 b 345 360 385 360 385 330 l 385 330 l 385 -270 b 385 -300 345 -300 345 -270 l 345 -270 l 345 90 ', + }, + vexAccidentalMicrotonal2: { + x_min: -1.359375, + x_max: 386.5625, + ha: 394, + o: 'm 249 535 b 257 537 251 537 253 537 b 276 524 266 537 273 533 l 277 521 l 279 419 l 279 316 l 304 323 b 337 328 319 326 330 328 b 353 316 347 328 349 324 b 355 266 355 315 355 290 b 353 215 355 241 355 217 b 319 198 349 206 347 205 b 279 187 284 190 279 188 b 279 156 279 187 279 174 b 279 136 279 151 279 144 l 279 84 l 289 87 l 330 98 b 367 105 352 102 362 105 b 378 101 372 105 375 104 b 386 61 385 95 386 94 b 386 40 386 55 386 48 l 386 -5 l 385 -8 b 374 -19 383 -12 378 -18 b 291 -40 372 -19 347 -26 b 279 -43 284 -41 279 -43 b 279 -83 279 -43 279 -59 b 279 -95 279 -87 279 -91 l 279 -145 l 304 -140 b 337 -133 321 -136 330 -133 b 349 -140 343 -133 347 -136 b 355 -181 355 -145 355 -142 l 355 -197 l 355 -210 b 349 -252 355 -249 355 -247 b 300 -269 345 -258 347 -258 b 280 -274 291 -272 281 -273 l 279 -274 l 277 -378 l 277 -483 l 276 -487 b 257 -499 273 -495 265 -499 b 238 -487 249 -499 242 -495 l 236 -483 l 236 -384 l 236 -285 l 235 -285 l 212 -291 l 170 -301 b 148 -308 159 -305 148 -306 b 147 -415 147 -308 147 -313 l 147 -523 l 145 -526 b 126 -538 141 -534 133 -538 b 106 -526 118 -538 110 -534 l 104 -523 l 104 -420 b 103 -317 104 -326 104 -317 b 103 -317 103 -317 103 -317 b 50 -330 92 -322 54 -330 b 31 -317 42 -330 35 -326 b 29 -267 29 -315 29 -315 l 29 -219 l 32 -216 b 92 -192 36 -206 36 -206 l 104 -190 l 104 -138 b 103 -87 104 -91 104 -87 b 103 -87 103 -87 103 -87 b 88 -91 103 -87 96 -88 l 49 -101 b 17 -106 32 -105 23 -106 b 6 -102 13 -106 10 -105 b -1 -62 0 -97 -1 -95 b 0 -41 -1 -56 0 -49 l 0 4 l 1 6 b 10 16 2 11 6 15 b 91 37 12 18 38 24 l 104 41 l 104 93 b 103 144 104 140 104 144 b 103 144 103 144 103 144 b 50 131 92 141 54 131 b 31 144 42 131 35 137 b 29 195 29 147 29 148 l 29 242 l 32 245 b 92 269 36 255 36 255 l 104 273 l 104 377 l 104 481 l 106 485 b 126 498 110 492 118 498 b 134 495 129 498 132 496 b 145 485 138 494 142 489 l 147 481 l 147 383 l 147 283 l 152 284 b 190 294 155 285 171 290 l 230 303 l 236 305 l 236 413 l 236 521 l 238 524 b 249 535 240 528 243 533 m 236 126 b 235 177 236 154 236 177 l 235 177 b 213 172 235 177 225 174 l 170 161 b 147 155 157 158 147 155 b 147 124 147 155 147 142 b 147 102 147 117 147 111 l 147 52 l 153 54 l 228 72 l 236 74 l 236 126 m 236 -105 b 235 -54 236 -65 236 -54 l 235 -54 b 231 -55 235 -54 234 -54 b 172 -69 227 -55 204 -62 l 149 -76 l 147 -76 l 147 -127 l 147 -179 l 152 -177 b 190 -167 155 -177 171 -173 l 230 -158 l 236 -156 l 236 -105 ', + }, + vexAccidentalMicrotonal3: { + x_min: 0, + x_max: 430.75, + ha: 360, + o: 'm -146 537 b -138 538 -143 538 -141 538 b -118 525 -129 538 -121 533 b -117 390 -117 522 -117 521 b -115 259 -117 268 -117 259 b -115 259 -115 259 -115 259 b -59 272 -104 263 -62 272 b -39 259 -50 272 -42 267 b -37 209 -38 257 -37 233 b -39 159 -37 185 -38 162 b -85 138 -43 149 -44 149 l -117 131 l -117 21 b -115 -88 -117 -80 -117 -88 b -115 -88 -115 -88 -115 -88 b -59 -75 -104 -84 -62 -75 b -44 -81 -52 -75 -48 -77 b -38 -124 -38 -87 -38 -85 b -38 -138 -38 -124 -38 -138 b -38 -152 -38 -138 -38 -152 b -44 -195 -38 -191 -38 -190 b -85 -209 -48 -200 -48 -200 l -117 -217 l -117 -349 b -118 -486 -117 -481 -117 -482 b -138 -499 -121 -494 -129 -499 b -153 -493 -143 -499 -149 -497 b -159 -415 -158 -487 -159 -496 b -159 -355 -159 -398 -159 -379 b -159 -227 -159 -284 -159 -227 b -205 -238 -159 -227 -180 -232 b -250 -249 -230 -244 -250 -249 b -251 -386 -251 -249 -251 -311 b -252 -525 -251 -521 -251 -522 b -272 -538 -255 -534 -264 -538 b -287 -532 -277 -538 -283 -536 b -293 -452 -292 -527 -293 -536 b -293 -391 -293 -436 -293 -415 b -294 -260 -293 -269 -293 -260 b -294 -260 -294 -260 -294 -260 b -348 -272 -306 -264 -345 -272 b -368 -259 -357 -272 -365 -267 b -369 -209 -369 -257 -369 -233 b -368 -159 -369 -185 -369 -162 b -323 -139 -364 -149 -362 -148 l -293 -131 l -293 -22 b -294 87 -293 80 -293 87 b -294 87 -294 87 -294 87 b -348 75 -306 84 -345 75 b -368 88 -357 75 -365 80 b -369 138 -369 91 -369 114 b -368 188 -369 162 -369 186 b -323 209 -364 198 -362 199 l -293 216 l -293 349 b -292 486 -293 481 -293 482 b -272 499 -288 494 -280 499 b -257 493 -266 499 -261 497 b -251 414 -251 487 -251 496 b -251 354 -251 398 -251 378 b -251 226 -251 284 -251 226 b -205 238 -250 226 -230 231 b -159 249 -180 244 -159 249 b -159 385 -159 249 -159 310 b -157 525 -159 521 -159 522 b -146 537 -156 530 -151 535 z m -159 11 b -159 120 -159 98 -159 120 l -159 120 b -175 116 -160 120 -167 119 b -221 105 -184 114 -204 109 l -251 98 l -251 -12 b -251 -121 -251 -72 -251 -121 b -205 -110 -250 -121 -230 -116 b -159 -99 -180 -104 -159 -99 b -159 11 -159 -99 -159 -49 z m 89 517 b 97 519 92 518 94 519 b 117 505 106 519 114 513 b 119 376 119 502 119 501 l 119 249 l 145 258 b 176 267 169 266 172 267 b 177 267 176 267 177 267 b 196 255 186 267 192 263 l 197 252 l 197 205 b 197 181 197 195 197 187 b 193 149 197 153 197 153 b 152 131 190 144 187 143 l 119 120 l 119 10 b 119 -100 119 -62 119 -100 b 145 -91 120 -100 131 -96 b 173 -82 159 -86 171 -82 b 176 -81 174 -81 175 -81 b 196 -94 185 -81 193 -87 b 198 -151 197 -97 198 -125 b 197 -194 198 -172 197 -192 b 153 -218 193 -203 192 -204 l 119 -230 l 119 -367 l 118 -504 l 117 -507 b 97 -519 113 -514 105 -519 b 82 -512 92 -519 87 -517 b 76 -434 77 -507 76 -516 b 76 -374 76 -418 76 -398 b 76 -245 76 -303 76 -245 b 52 -254 76 -245 65 -249 b 19 -263 34 -260 25 -263 b 6 -257 13 -263 10 -261 b 0 -214 0 -251 0 -253 b 0 -200 0 -210 0 -205 b 0 -188 0 -196 0 -192 b 6 -143 0 -147 0 -149 b 46 -126 10 -139 10 -139 l 76 -115 l 76 -5 b 76 106 76 56 76 106 b 51 98 76 106 64 102 b 18 89 34 92 25 89 b 6 95 13 89 10 91 b 0 139 0 101 0 99 b 0 153 0 143 0 148 b 0 179 0 163 0 172 b 44 225 0 215 3 211 l 76 236 l 76 369 b 78 505 76 501 76 502 b 89 517 80 510 85 515 z ', + }, + vexAccidentalMicrotonal4: { + x_min: 0, + x_max: 430.75, + ha: 360, + o: 'm 283 633 b 291 634 286 634 289 634 b 311 621 300 634 308 629 b 313 505 313 618 313 617 b 313 393 313 443 313 393 b 378 425 313 393 343 407 l 443 458 l 448 458 b 449 458 449 458 449 458 b 471 437 462 458 471 448 b 469 429 471 434 470 432 b 387 382 466 421 469 423 l 313 344 l 313 247 l 313 150 l 315 152 b 433 201 353 184 394 201 b 479 193 448 201 464 198 b 549 86 524 177 549 135 b 526 1 549 59 541 29 b 395 -143 504 -39 475 -71 b 316 -214 351 -182 341 -191 b 292 -229 302 -228 300 -229 b 272 -216 283 -229 275 -224 b 271 55 271 -212 271 -212 b 270 323 271 203 270 323 b 205 291 270 323 241 308 l 140 258 l 135 258 b 134 258 135 258 134 258 b 112 279 121 258 112 267 b 114 287 112 281 113 284 b 196 334 117 295 114 293 l 271 371 l 271 495 b 272 621 271 617 271 618 b 283 633 274 626 279 631 z m 404 133 b 391 134 400 134 395 134 b 384 134 388 134 386 134 b 318 88 358 130 335 114 l 313 81 l 313 -37 l 313 -156 l 316 -152 b 439 83 391 -71 439 22 l 439 84 b 404 133 439 115 430 128 z m -8 633 l -8 633 b 0 634 -6 634 -3 634 b 20 621 8 634 17 629 b 21 384 21 618 21 617 l 21 150 l 24 152 b 141 201 62 184 102 201 b 187 193 157 201 172 198 b 257 86 232 177 257 135 b 234 1 257 59 250 29 b 103 -143 212 -39 183 -71 b 24 -214 60 -182 49 -191 b 0 -229 10 -228 8 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 203 l -21 618 l -20 621 b -8 633 -18 626 -13 631 z m 113 133 l 113 133 b 99 134 109 134 103 134 b 93 134 97 134 94 134 b 26 88 66 130 43 114 l 21 81 l 21 -37 l 21 -156 l 25 -152 b 148 83 99 -71 148 22 l 148 84 b 113 133 148 115 138 128 z ', + }, + vexNoteHeadRectBlack: { + x_min: 0, + x_max: 430.75, + ha: 360, + o: 'm 0 150 l 0 -150 l 430 -150 l 430 150 l 0 150 ', + }, + vexNoteHeadRectWhite: { + x_min: 0, + x_max: 430.75, + ha: 360, + o: 'm 0 150 l 0 -150 l 430 -150 l 430 150 l 0 150 l 50 100 l 380 100 l 380 -100 l 50 -100 l 50 100', + }, + }, +}; diff --git a/build/esm/src/fonts/custom_metrics.js b/build/esm/src/fonts/custom_metrics.js new file mode 100644 index 0000000000..2aa6b37f4a --- /dev/null +++ b/build/esm/src/fonts/custom_metrics.js @@ -0,0 +1,5 @@ +export const CustomMetrics = { + name: 'VexFlowCustom', + smufl: false, + glyphs: {}, +}; diff --git a/build/esm/src/fonts/gonville_glyphs.js b/build/esm/src/fonts/gonville_glyphs.js new file mode 100644 index 0000000000..968f84a265 --- /dev/null +++ b/build/esm/src/fonts/gonville_glyphs.js @@ -0,0 +1,828 @@ +export const GonvilleFont = { + glyphs: { + bracketTop: { + x_min: 0, + x_max: 559.421875, + ha: 571, + o: 'm 544 204 b 548 204 545 204 547 204 b 559 194 555 204 559 199 b 559 190 559 192 559 191 b 530 156 559 188 556 184 b 462 86 510 134 481 104 b 453 76 458 81 454 77 l 446 70 l 441 65 b 434 59 439 63 436 61 l 427 54 b 409 37 426 51 416 44 b 392 23 398 29 394 26 b 387 19 389 22 387 20 b 379 13 386 19 383 16 l 371 8 l 367 5 l 359 -1 l 337 -16 b 285 -48 319 -29 298 -41 l 279 -52 b 186 -95 255 -66 210 -87 l 175 -99 b 23 -129 127 -117 68 -129 b 17 -129 20 -129 19 -129 b 1 -123 2 -129 2 -129 b 0 -49 0 -122 0 -83 b 0 4 0 -22 0 1 b 27 11 2 9 4 9 b 185 31 78 12 145 20 b 198 34 186 31 193 33 b 314 73 234 44 277 58 b 349 88 328 79 340 84 b 353 90 352 90 353 90 b 363 94 353 90 357 93 b 371 98 367 97 371 98 b 428 129 372 98 413 120 b 461 148 441 136 454 144 b 468 151 464 149 466 151 b 472 154 469 152 470 154 b 481 161 473 155 477 158 b 525 190 490 166 518 186 l 534 197 b 540 201 536 198 539 199 b 544 204 541 202 544 204 ', + }, + bracketBottom: { + x_min: 0, + x_max: 559.421875, + ha: 571, + o: 'm 5 127 b 14 127 6 127 9 127 b 51 126 25 127 43 127 b 175 98 93 122 138 112 l 186 94 b 279 51 210 86 255 65 b 285 47 280 51 283 48 b 319 27 291 44 311 31 l 326 22 b 359 0 332 19 352 4 l 367 -6 b 371 -9 368 -6 370 -8 l 379 -15 b 387 -22 383 -18 386 -20 l 398 -30 l 411 -40 l 417 -47 l 427 -55 l 434 -61 b 441 -66 436 -62 439 -65 l 446 -72 l 453 -77 l 462 -87 b 558 -188 490 -113 549 -176 b 559 -195 559 -191 559 -194 b 548 -205 559 -201 555 -205 b 541 -204 547 -205 544 -205 b 534 -198 539 -201 536 -199 l 525 -191 b 481 -162 518 -187 490 -167 b 472 -155 477 -159 472 -156 b 468 -152 470 -155 469 -154 b 461 -149 466 -152 464 -151 b 428 -130 454 -145 441 -137 b 371 -99 413 -122 372 -99 b 363 -95 371 -99 367 -98 b 353 -91 357 -94 353 -91 b 348 -90 353 -91 352 -91 b 332 -81 343 -87 341 -86 b 27 -12 230 -37 127 -13 b 0 -5 4 -11 2 -11 b 0 58 0 -2 0 27 b 0 122 0 88 0 120 b 5 127 1 124 4 126 ', + }, + barlineTick: { + x_min: -80.3125, + x_max: 78.9375, + ha: 81, + o: 'm 63 191 b 69 192 65 192 66 192 b 77 188 72 192 76 191 b 78 183 78 187 78 186 b 74 158 78 179 77 172 l 66 115 b 9 -161 49 30 10 -158 b -10 -187 6 -172 -1 -181 b -34 -194 -17 -191 -25 -194 b -80 -147 -58 -194 -80 -174 b -80 -141 -80 -144 -80 -142 b 9 70 -80 -134 -73 -117 l 49 163 b 63 191 59 188 61 190 ', + }, + breathMarkTick: { + x_min: -80.3125, + x_max: 78.9375, + ha: 81, + o: 'm 63 191 b 69 192 65 192 66 192 b 77 188 72 192 76 191 b 78 183 78 187 78 186 b 74 158 78 179 77 172 l 66 115 b 9 -161 49 30 10 -158 b -10 -187 6 -172 -1 -181 b -34 -194 -17 -191 -25 -194 b -80 -147 -58 -194 -80 -174 b -80 -141 -80 -144 -80 -142 b 9 70 -80 -134 -73 -117 l 49 163 b 63 191 59 188 61 190 ', + }, + segno: { + x_min: -330.75, + x_max: 329.390625, + ha: 336, + o: 'm -133 483 b -117 484 -127 484 -122 484 b 31 373 -51 484 9 440 b 35 348 34 365 35 356 b -25 285 35 313 10 285 b -87 331 -55 285 -76 302 b -167 402 -100 376 -133 402 b -191 398 -175 402 -183 401 b -227 341 -215 388 -227 369 b -225 320 -227 334 -227 327 b -13 74 -209 230 -125 133 b 6 65 -4 70 5 66 l 9 63 l 10 65 b 117 231 12 68 40 112 l 189 341 l 242 424 b 268 460 262 456 264 458 b 283 464 273 463 277 464 b 308 438 296 464 308 453 l 308 437 b 287 396 308 430 308 428 l 95 98 l 59 43 l 58 41 l 65 37 b 253 -156 151 -8 217 -77 b 281 -285 272 -199 281 -244 b 148 -481 281 -381 231 -463 b 115 -485 137 -484 126 -485 b -32 -376 51 -485 -9 -442 b -36 -349 -35 -366 -36 -358 b 25 -287 -36 -315 -12 -287 b 85 -333 54 -287 74 -302 b 166 -403 99 -377 133 -403 b 190 -399 174 -403 182 -402 b 225 -342 215 -390 225 -370 b 224 -322 225 -335 225 -328 b 12 -76 208 -231 125 -134 b -8 -66 2 -72 -6 -68 l -10 -65 l -12 -66 b -118 -231 -13 -68 -42 -113 l -190 -342 l -243 -426 b -269 -462 -264 -458 -265 -458 b -284 -466 -274 -464 -279 -466 b -310 -440 -298 -466 -310 -455 l -310 -438 b -288 -398 -310 -430 -308 -430 l -96 -99 l -59 -44 l -59 -43 l -66 -38 b -281 284 -198 33 -281 158 l -281 284 b -133 483 -281 392 -220 474 m 254 177 b 266 179 258 177 262 179 b 319 149 287 179 307 167 b 329 115 326 140 329 127 b 319 79 329 102 326 90 b 268 51 307 61 287 51 b 221 72 250 51 234 58 b 205 115 210 84 205 99 b 254 177 205 142 223 170 m -281 -54 b -269 -52 -277 -52 -273 -52 b -223 -73 -253 -52 -235 -59 b -206 -116 -212 -84 -206 -101 b -216 -151 -206 -129 -209 -141 b -269 -179 -228 -170 -249 -179 b -314 -159 -285 -179 -302 -173 b -330 -116 -325 -147 -330 -131 b -281 -54 -330 -88 -313 -61 ', + }, + coda: { + x_min: -311.6875, + x_max: 310.328125, + ha: 317, + o: 'm -9 388 b -2 390 -8 390 -5 390 b 5 388 1 390 4 390 b 19 378 10 387 16 383 b 23 333 23 371 23 371 b 24 298 23 299 24 298 b 81 276 34 298 65 285 b 213 91 145 240 190 177 b 224 24 217 76 224 36 b 257 24 224 24 235 24 b 299 19 292 24 292 24 b 310 -1 306 15 310 6 b 299 -23 310 -11 306 -19 b 257 -27 292 -27 292 -27 b 224 -29 235 -27 224 -29 b 213 -95 224 -40 217 -80 b 81 -280 190 -181 145 -244 b 24 -301 65 -290 34 -301 b 23 -335 24 -301 23 -303 l 23 -340 b 17 -381 23 -374 23 -374 b -1 -391 13 -388 5 -391 b -21 -381 -9 -391 -17 -388 b -27 -340 -27 -374 -27 -374 l -27 -335 b -28 -301 -27 -303 -27 -301 b -85 -280 -38 -301 -69 -290 b -217 -95 -149 -244 -194 -181 b -228 -29 -221 -80 -228 -40 b -259 -27 -228 -29 -238 -27 b -300 -23 -294 -27 -294 -27 b -311 -2 -307 -19 -311 -11 b -294 23 -311 8 -304 19 b -259 24 -291 23 -284 24 b -228 24 -239 24 -228 24 b -217 91 -228 36 -221 76 b -85 276 -194 177 -149 240 b -28 298 -69 285 -38 298 b -27 333 -27 298 -27 299 b -27 371 -27 362 -27 369 b -9 388 -24 378 -17 385 m -27 136 b -28 247 -27 197 -28 247 b -61 216 -31 247 -53 226 b -123 33 -95 172 -121 98 l -125 24 l -76 24 l -27 24 l -27 136 m 29 242 b 24 247 27 245 24 247 b 23 136 24 247 23 197 l 23 24 l 72 24 l 121 24 l 119 33 b 29 242 115 116 77 206 m -27 -140 l -27 -27 l -76 -27 l -125 -27 l -123 -36 b -61 -220 -121 -102 -95 -176 b -28 -251 -53 -230 -31 -251 b -27 -140 -28 -251 -27 -201 m 119 -36 l 121 -27 l 72 -27 l 23 -27 l 23 -140 b 24 -251 23 -201 24 -251 b 57 -220 27 -251 49 -230 b 119 -36 91 -176 117 -102 ', + }, + gClef: { + x_min: -1.359375, + x_max: 847.96875, + ha: 865, + o: 'm 488 1499 b 495 1500 490 1500 492 1500 b 541 1465 507 1500 521 1490 b 679 1078 622 1372 679 1210 b 677 1050 679 1068 677 1060 b 477 642 668 893 604 764 l 443 609 l 431 596 l 431 592 l 438 562 l 449 508 l 460 458 b 481 355 475 390 481 355 b 481 355 481 355 481 355 b 490 356 481 355 485 355 b 528 358 495 356 511 358 b 558 356 540 358 552 356 b 839 95 699 338 808 237 b 847 22 845 72 847 47 b 631 -303 847 -113 766 -242 b 620 -309 623 -308 620 -309 l 620 -310 b 631 -359 620 -310 626 -333 l 646 -435 l 660 -496 b 672 -588 668 -535 672 -563 b 664 -653 672 -610 669 -630 b 383 -875 630 -792 509 -875 b 201 -810 321 -875 257 -855 b 129 -680 151 -768 129 -730 b 274 -530 129 -592 200 -530 b 351 -553 300 -530 326 -538 b 412 -669 393 -582 412 -626 b 287 -805 412 -735 366 -800 l 279 -805 l 285 -809 b 383 -830 318 -823 351 -830 b 586 -718 464 -830 540 -789 b 626 -584 612 -678 626 -631 b 619 -528 626 -566 623 -548 b 612 -495 619 -526 616 -510 b 577 -324 590 -387 577 -324 b 577 -324 577 -324 577 -324 b 568 -326 575 -324 571 -324 b 528 -334 558 -328 537 -333 b 465 -338 506 -337 485 -338 b 24 -11 269 -338 87 -206 b -1 145 8 41 -1 93 b 96 442 -1 249 32 351 b 322 714 166 541 236 626 l 352 745 l 345 782 l 332 843 l 315 921 b 303 984 310 950 304 978 b 295 1082 298 1017 295 1049 b 413 1426 295 1208 336 1329 b 488 1499 436 1456 477 1496 m 549 1301 b 541 1301 547 1301 544 1301 b 411 1207 500 1301 447 1263 b 355 1004 374 1152 355 1079 b 359 942 355 984 356 963 b 371 881 362 927 363 917 l 385 818 b 392 782 389 799 392 784 l 392 782 b 434 828 393 782 424 816 b 607 1165 534 941 594 1060 b 608 1193 608 1175 608 1183 b 597 1270 608 1224 604 1254 b 549 1301 589 1286 571 1299 m 398 528 b 393 555 396 542 393 553 b 392 555 393 555 393 555 b 317 470 390 555 347 505 b 190 298 266 408 212 334 b 127 70 148 227 127 148 b 155 -77 127 19 137 -30 b 468 -303 209 -216 333 -303 b 519 -299 484 -303 502 -302 b 568 -284 541 -295 568 -287 l 568 -284 b 563 -263 568 -284 566 -274 l 534 -120 l 511 -13 l 496 61 l 480 133 b 469 187 472 176 469 187 b 468 188 469 187 469 188 b 416 162 462 188 430 172 b 337 13 364 126 337 69 b 413 -124 337 -40 363 -93 b 428 -144 424 -131 428 -137 b 428 -149 428 -145 428 -148 b 409 -166 426 -161 419 -166 b 394 -162 405 -166 400 -165 b 240 77 302 -122 240 -27 l 240 77 b 430 342 240 197 315 301 l 436 344 l 426 394 l 398 528 m 548 194 b 526 195 540 195 532 195 b 519 195 524 195 521 195 l 514 195 l 518 177 l 539 79 l 552 15 l 566 -48 l 594 -187 l 605 -240 b 612 -266 609 -254 611 -266 b 612 -266 612 -266 612 -266 b 641 -248 613 -266 630 -256 b 744 -98 692 -212 730 -156 b 751 -40 749 -79 751 -59 b 548 194 751 76 665 181 ', + }, + cClef: { + x_min: 0, + x_max: 873.828125, + ha: 892, + o: 'm 0 0 l 0 703 l 81 703 l 164 703 l 164 0 l 164 -705 l 81 -705 l 0 -705 l 0 0 m 225 0 l 225 703 l 246 703 l 268 703 l 268 366 l 268 30 l 274 36 b 314 79 284 44 302 63 b 413 302 357 137 392 213 b 432 327 419 324 421 327 b 449 306 443 327 447 322 b 611 115 457 195 529 115 b 651 122 624 115 638 117 b 728 316 705 140 724 188 b 729 388 728 342 729 366 b 671 635 729 533 711 602 b 581 662 649 652 616 662 b 477 637 545 662 510 653 l 475 635 l 477 634 b 503 627 488 632 495 631 b 545 556 532 612 545 584 b 491 480 545 524 526 491 b 465 474 481 476 473 474 b 379 563 417 474 379 516 b 389 602 379 576 382 588 b 541 691 409 641 479 681 b 582 694 555 692 568 694 b 865 462 714 694 834 598 b 873 392 871 440 873 416 b 865 317 873 367 871 341 b 639 84 839 194 748 101 b 612 83 630 83 620 83 b 511 116 577 83 543 94 b 504 120 509 119 506 120 b 504 120 504 120 504 120 b 469 59 504 120 488 93 l 432 -1 l 469 -61 b 504 -122 488 -94 504 -122 b 504 -122 504 -122 504 -122 b 511 -117 506 -122 509 -120 b 612 -84 543 -95 577 -84 b 665 -91 630 -84 647 -87 b 869 -338 771 -122 850 -216 b 873 -392 872 -356 873 -374 b 798 -595 873 -469 847 -539 b 581 -695 741 -662 660 -695 b 406 -626 517 -695 454 -671 b 381 -563 389 -607 381 -585 b 465 -477 381 -519 413 -477 b 545 -559 514 -477 545 -519 b 503 -628 545 -587 532 -613 b 477 -635 495 -632 488 -634 l 475 -637 l 477 -638 b 581 -663 510 -655 545 -663 b 671 -637 616 -663 649 -653 b 729 -391 711 -603 729 -534 b 728 -317 729 -367 728 -344 b 623 -117 722 -173 698 -124 b 611 -116 619 -116 615 -116 b 449 -308 528 -116 457 -198 b 432 -328 447 -323 443 -328 b 413 -303 421 -328 419 -326 b 314 -80 392 -215 357 -138 b 274 -37 302 -65 284 -45 l 268 -31 l 268 -367 l 268 -705 l 246 -705 l 225 -705 l 225 0 ', + }, + fClef: { + x_min: -1.359375, + x_max: 899.703125, + ha: 918, + o: 'm 307 349 b 332 351 315 351 323 351 b 443 340 367 351 408 347 b 741 47 607 306 720 195 b 744 0 743 31 744 16 b 660 -303 744 -90 713 -206 b 28 -755 534 -531 304 -695 b 14 -756 23 -755 19 -756 b -1 -741 4 -756 -1 -750 b 21 -720 -1 -731 1 -728 b 567 -56 337 -601 548 -344 b 568 -11 568 -41 568 -24 b 442 285 568 129 525 233 b 325 319 406 308 367 319 b 93 177 232 319 137 266 b 84 154 91 170 84 155 b 84 154 84 154 84 154 b 88 156 84 154 85 155 b 159 177 110 170 134 177 b 257 134 194 177 231 162 b 294 41 281 108 294 73 b 171 -97 294 -24 246 -90 b 156 -98 166 -97 161 -98 b 6 74 73 -98 6 -22 b 6 80 6 76 6 79 b 307 349 10 223 141 340 m 839 215 b 845 216 841 216 842 216 b 862 213 852 216 860 215 b 899 163 887 206 899 184 b 872 117 899 145 890 127 b 847 111 865 112 856 111 b 808 130 833 111 818 117 b 796 162 800 140 796 151 b 839 215 796 187 812 212 m 839 -112 b 845 -112 841 -112 842 -112 b 862 -115 852 -112 860 -113 b 899 -165 887 -122 899 -144 b 872 -210 899 -183 890 -201 b 847 -217 865 -215 856 -217 b 808 -198 833 -217 818 -210 b 796 -165 800 -188 796 -177 b 839 -112 796 -140 812 -116 ', + }, + unpitchedPercussionClef1: { + x_min: 0, + x_max: 464.140625, + ha: 474, + o: 'm 0 0 l 0 347 l 76 347 l 153 347 l 153 0 l 153 -348 l 76 -348 l 0 -348 l 0 0 m 308 -1 l 308 347 l 386 347 l 464 347 l 464 -1 l 464 -348 l 386 -348 l 308 -348 l 308 -1 ', + }, + '6stringTabClef': { + x_min: -1.359375, + x_max: 680.5625, + ha: 694, + o: 'm 597 1042 b 604 1042 600 1042 602 1042 b 642 1002 627 1042 642 1022 b 619 966 642 988 635 974 b 439 927 574 942 503 927 l 426 927 l 426 921 b 430 838 428 893 430 866 b 345 480 430 696 398 560 b 179 391 307 423 249 391 b 156 392 171 391 164 392 b 138 394 149 394 142 394 b 103 434 115 396 103 416 b 129 471 103 451 111 466 b 141 474 133 473 137 474 b 172 459 153 474 164 469 b 181 455 175 456 176 455 b 187 456 182 455 185 455 b 253 520 212 460 234 483 b 315 836 294 605 315 714 b 311 928 315 867 314 898 b 302 945 310 943 311 942 b 245 953 283 950 262 953 b 130 891 193 953 149 931 b 84 860 119 870 102 860 b 36 905 61 860 39 877 b 36 910 36 907 36 909 b 80 970 36 931 50 949 b 249 1017 125 1000 187 1017 b 322 1009 273 1017 299 1014 l 341 1003 b 436 991 372 995 406 991 b 577 1031 495 991 545 1004 b 597 1042 583 1038 590 1041 m 416 360 b 424 360 419 360 421 360 b 481 309 454 360 479 338 b 503 145 484 280 495 199 b 585 -185 525 16 555 -106 b 630 -245 596 -213 613 -237 l 634 -247 l 638 -245 b 647 -244 641 -245 645 -244 b 680 -278 666 -244 680 -262 b 664 -308 680 -290 675 -301 b 638 -312 658 -310 650 -312 b 613 -309 631 -312 623 -310 b 477 -201 555 -303 502 -260 b 417 -2 460 -159 434 -72 b 416 5 417 1 416 5 b 416 5 416 5 416 5 b 411 -5 415 5 413 0 b 359 -97 397 -33 377 -70 b 353 -106 355 -102 353 -105 b 359 -112 353 -108 355 -109 b 409 -130 375 -123 390 -129 b 426 -134 420 -130 421 -131 b 431 -147 428 -137 431 -141 b 420 -162 431 -152 427 -159 b 382 -169 409 -166 396 -169 b 323 -155 363 -169 341 -165 l 317 -152 l 314 -155 b 62 -303 240 -240 148 -295 b 36 -305 55 -305 44 -305 b 23 -303 29 -305 24 -305 b -1 -273 6 -299 -1 -287 b 31 -240 -1 -256 10 -240 b 36 -240 32 -240 34 -240 b 42 -241 38 -241 39 -241 b 134 -204 63 -241 99 -226 b 367 288 265 -115 357 81 b 375 330 368 313 370 320 b 416 360 383 347 400 358 m 360 -359 b 379 -359 363 -359 371 -359 b 424 -360 396 -359 416 -359 b 646 -502 536 -373 624 -430 b 649 -527 649 -510 649 -519 b 530 -673 649 -578 604 -635 l 521 -677 l 529 -681 b 653 -811 592 -714 637 -762 b 660 -853 658 -827 660 -839 b 645 -911 660 -873 656 -892 b 426 -1021 608 -981 519 -1021 b 283 -989 377 -1021 328 -1011 b 235 -949 249 -972 239 -964 b 234 -936 234 -946 234 -941 b 234 -928 234 -934 234 -931 l 235 -925 l 234 -927 l 225 -934 b 87 -982 186 -966 138 -982 b 80 -982 85 -982 83 -982 b 55 -981 70 -981 58 -981 b 17 -943 32 -981 17 -964 b 54 -904 17 -921 35 -904 b 78 -914 62 -904 72 -909 l 83 -918 l 88 -918 b 190 -831 122 -918 166 -881 b 269 -506 242 -727 269 -612 b 268 -462 269 -492 269 -477 b 266 -449 266 -458 266 -452 b 265 -444 266 -445 266 -444 b 257 -446 264 -444 261 -445 b 132 -545 196 -470 152 -505 b 88 -573 122 -563 104 -573 b 39 -523 63 -573 39 -553 b 63 -476 39 -505 44 -494 b 360 -359 136 -408 235 -369 m 419 -424 b 393 -423 411 -423 406 -423 l 375 -423 l 377 -426 b 379 -439 377 -427 378 -434 b 383 -510 382 -463 383 -487 b 314 -811 383 -609 360 -710 b 266 -893 296 -850 285 -870 b 264 -898 265 -896 264 -898 l 264 -898 b 264 -898 264 -898 264 -898 b 268 -898 264 -898 266 -898 b 273 -898 270 -898 272 -898 b 300 -909 283 -898 291 -900 b 426 -957 340 -941 385 -957 b 476 -949 443 -957 460 -954 b 547 -853 522 -931 547 -893 b 485 -745 547 -816 526 -775 b 397 -707 460 -727 432 -714 b 366 -675 375 -703 366 -692 b 396 -642 366 -657 377 -645 b 530 -557 455 -637 511 -601 b 536 -527 534 -548 536 -537 b 419 -424 536 -480 490 -437 ', + }, + timeSig0: { + x_min: 0, + x_max: 514.5, + ha: 525, + o: 'm 236 648 b 246 648 238 648 242 648 b 288 646 261 648 283 648 b 472 513 364 634 428 587 b 514 347 502 464 514 413 b 462 163 514 272 499 217 b 257 44 409 83 333 44 b 50 163 181 44 103 83 b 0 347 14 217 0 272 b 40 513 0 413 12 464 b 236 648 87 591 155 638 m 277 614 b 253 616 273 616 261 616 b 242 616 247 616 243 616 b 170 499 193 609 181 589 b 159 348 163 446 159 398 b 166 222 159 308 161 266 b 201 91 174 138 183 106 b 257 76 215 81 235 76 b 311 91 277 76 299 81 b 347 222 330 106 338 138 b 353 348 352 266 353 308 b 344 499 353 398 351 446 b 277 614 333 587 322 606 m 257 -1 l 258 -1 l 255 -1 l 257 -1 m 257 673 l 258 673 l 255 673 l 257 673 ', + }, + timeSig1: { + x_min: -1.359375, + x_max: 344.359375, + ha: 351, + o: 'm 126 637 l 129 638 l 198 638 l 266 638 l 269 635 b 274 631 272 634 273 632 l 277 627 l 277 395 b 279 156 277 230 277 161 b 329 88 281 123 295 106 b 344 69 341 81 344 79 b 337 55 344 62 343 59 l 333 54 l 197 54 l 61 54 l 58 55 b 50 69 53 59 50 62 b 65 88 50 79 53 81 b 80 97 72 91 74 93 b 117 156 103 113 112 129 b 117 345 117 161 117 222 l 117 528 l 100 503 l 38 406 b 14 383 24 384 23 383 b -1 398 5 383 -1 390 b 4 415 -1 403 1 409 b 16 437 5 416 10 426 l 72 539 l 100 596 b 121 632 119 631 119 631 b 126 637 122 634 125 635 m 171 -1 l 172 -1 l 170 -1 l 171 -1 m 171 673 l 172 673 l 170 673 l 171 673 ', + }, + timeSig2: { + x_min: -1.359375, + x_max: 458.6875, + ha: 468, + o: 'm 197 648 b 216 648 201 648 208 648 b 258 646 232 648 253 648 b 419 546 333 637 393 599 b 432 489 428 528 432 509 b 356 342 432 440 405 384 b 235 278 322 313 288 295 b 69 170 166 256 107 217 b 69 169 69 170 69 169 b 69 169 69 169 69 169 b 74 173 69 169 72 170 b 209 222 112 204 163 222 b 310 195 247 222 274 215 b 371 179 332 184 352 179 b 396 181 379 179 387 179 b 428 202 409 184 423 194 b 442 212 431 209 436 212 b 458 197 450 212 458 206 b 441 148 458 190 449 165 b 299 44 409 84 353 44 b 288 45 295 44 292 44 b 250 61 274 45 268 49 b 122 99 212 86 164 99 b 73 91 104 99 88 97 b 28 63 53 84 34 72 b 14 54 25 56 20 54 b 1 62 9 54 4 56 l -1 65 l -1 79 b 0 99 -1 91 0 95 b 2 113 1 102 2 108 b 164 309 20 197 81 272 b 285 470 232 341 277 398 b 287 487 287 476 287 481 b 171 595 287 551 239 595 b 155 595 166 595 160 595 b 142 592 145 594 142 594 b 145 589 142 592 142 591 b 179 527 168 576 179 551 b 132 455 179 496 163 467 b 104 451 122 452 112 451 b 27 530 62 451 27 487 b 29 555 27 538 27 546 b 197 648 44 601 115 639 m 228 -1 l 230 -1 l 227 -1 l 228 -1 m 228 673 l 230 673 l 227 673 l 228 673 ', + }, + timeSig3: { + x_min: -1.359375, + x_max: 409.6875, + ha: 418, + o: 'm 174 648 b 191 648 176 648 183 648 b 225 648 204 648 220 648 b 402 523 317 638 389 588 b 404 503 404 517 404 510 b 402 484 404 495 404 488 b 264 373 389 437 334 394 b 257 370 259 371 257 371 b 257 370 257 370 257 370 b 264 369 258 370 261 369 b 409 202 359 334 409 267 b 318 72 409 152 381 104 b 200 43 281 52 240 43 b 23 113 134 43 69 68 b 0 169 6 129 0 149 b 77 249 0 210 29 249 l 77 249 b 152 174 125 249 152 212 b 103 102 152 145 137 116 b 103 102 103 102 103 102 b 147 94 103 101 132 95 b 153 94 149 94 151 94 b 265 206 219 94 265 141 b 264 226 265 213 265 219 b 147 355 253 299 204 353 b 126 371 133 356 126 362 b 147 388 126 383 132 388 b 254 474 196 391 238 424 b 259 502 258 484 259 494 b 182 592 259 544 228 582 b 156 595 175 595 166 595 b 115 592 142 595 129 594 l 111 591 l 115 588 b 152 524 141 574 152 549 b 92 449 152 491 130 458 b 76 448 87 448 81 448 b -1 530 32 448 -1 488 b 20 581 -1 548 5 566 b 174 648 55 619 108 641 m 204 -1 l 205 -1 l 202 -1 l 204 -1 m 204 673 l 205 673 l 202 673 l 204 673 ', + }, + timeSig4: { + x_min: 0, + x_max: 468.21875, + ha: 478, + o: 'm 174 637 b 232 638 175 638 189 638 b 277 638 245 638 259 638 l 378 638 l 381 635 b 389 623 386 632 389 627 b 382 609 389 617 386 613 b 366 589 381 606 372 598 l 313 528 l 245 451 l 209 410 l 155 348 l 84 267 b 59 240 72 252 59 240 b 59 240 59 240 59 240 b 151 238 59 238 68 238 l 242 238 l 242 303 b 243 371 242 369 242 370 b 289 426 245 374 254 385 l 303 441 l 317 456 l 338 483 l 360 506 l 371 520 b 386 527 375 526 381 527 b 400 519 392 527 397 524 b 401 440 401 516 401 514 b 401 377 401 423 401 402 l 401 238 l 426 238 b 453 237 449 238 450 238 b 465 217 461 234 465 226 b 460 202 465 212 464 206 b 426 197 454 197 453 197 l 401 197 l 401 180 b 451 88 402 129 412 109 b 468 69 465 81 468 79 b 461 55 468 62 466 59 l 458 54 l 321 54 l 185 54 l 182 55 b 175 69 176 59 175 62 b 191 88 175 79 176 81 b 240 180 230 109 240 129 l 240 197 l 125 197 b 73 195 104 195 87 195 b 8 197 10 195 9 197 b 0 212 2 199 0 205 b 0 212 0 212 0 212 b 20 242 0 219 0 219 b 163 610 104 344 163 492 b 174 637 163 628 166 634 m 234 -1 l 235 -1 l 232 -1 l 234 -1 m 234 673 l 235 673 l 232 673 l 234 673 ', + }, + timeSig5: { + x_min: 0, + x_max: 409.6875, + ha: 418, + o: 'm 47 637 b 53 638 49 638 50 638 b 69 634 55 638 61 637 b 210 610 114 619 161 610 b 363 634 259 610 311 619 b 382 638 372 637 378 638 b 392 634 386 638 389 637 b 397 623 396 630 397 627 b 393 610 397 620 396 616 b 298 505 368 552 338 520 b 212 494 277 498 246 494 b 65 517 163 494 106 502 b 61 517 62 517 61 517 b 61 517 61 517 61 517 b 51 408 61 517 51 412 b 51 408 51 408 51 408 b 51 408 51 408 51 408 b 61 412 53 408 55 409 b 125 434 80 421 103 430 b 185 441 145 440 166 441 b 409 244 310 441 409 353 b 401 191 409 227 406 209 b 197 43 375 105 287 43 b 159 47 183 43 171 44 b 23 123 112 56 61 86 b 0 180 6 140 0 159 b 76 260 0 220 31 260 b 92 259 81 260 87 259 b 152 183 132 251 152 216 b 100 112 152 152 134 122 b 95 111 98 112 95 111 b 95 111 95 111 95 111 b 129 98 95 109 119 101 b 148 97 136 97 141 97 b 264 235 206 97 261 158 b 265 248 265 240 265 244 b 210 398 265 312 243 373 b 179 408 201 406 194 408 b 174 408 178 408 176 408 b 53 369 130 408 88 394 b 34 359 39 359 38 359 b 17 374 24 359 17 365 b 39 628 17 384 38 625 b 47 637 40 631 43 635 m 204 -1 l 205 -1 l 202 -1 l 204 -1 m 204 673 l 205 673 l 202 673 l 204 673 ', + }, + timeSig6: { + x_min: 0, + x_max: 475.03125, + ha: 485, + o: 'm 255 648 b 274 648 259 648 266 648 b 314 646 288 648 307 648 b 450 555 374 637 438 594 b 454 530 453 546 454 538 b 375 451 454 485 416 451 b 328 467 359 451 343 455 b 300 526 310 483 300 503 b 352 598 300 557 319 589 b 356 599 355 598 356 599 b 352 602 356 599 355 601 b 288 616 330 612 308 616 b 210 584 257 616 230 605 b 164 433 189 559 174 508 b 160 374 163 415 160 381 b 160 374 160 374 160 374 b 160 374 160 374 160 374 b 168 377 160 374 164 376 b 258 395 200 390 228 395 b 366 367 294 395 328 387 b 475 223 436 333 475 283 b 472 197 475 215 473 206 b 349 65 462 141 419 95 b 259 43 317 51 288 43 b 167 69 230 43 200 52 b 4 290 80 113 20 195 b 0 349 1 309 0 328 b 20 467 0 391 6 433 b 255 648 58 563 155 637 m 269 363 b 257 363 265 363 261 363 b 210 345 236 363 220 356 b 186 226 196 324 186 272 b 187 198 186 216 186 206 b 213 95 191 151 202 112 b 257 76 221 83 238 76 b 270 77 261 76 266 76 b 321 156 299 81 310 99 b 329 229 326 183 329 206 b 321 301 329 252 326 274 b 269 363 311 342 298 359 m 236 -1 l 238 -1 l 235 -1 l 236 -1 m 236 673 l 238 673 l 235 673 l 236 673 ', + }, + timeSig7: { + x_min: 0, + x_max: 442.359375, + ha: 451, + o: 'm 147 648 b 166 649 153 649 160 649 b 313 598 217 649 273 630 b 340 587 323 588 328 587 l 341 587 b 412 628 367 587 390 601 b 427 638 416 635 421 638 b 439 632 431 638 435 637 b 442 623 441 630 442 628 b 430 569 442 616 439 603 b 352 369 408 492 377 410 b 300 259 325 324 313 298 b 273 84 283 205 273 140 b 265 55 273 65 272 59 l 261 54 l 181 54 l 99 54 l 96 55 b 91 61 95 56 92 59 l 89 63 l 89 77 b 147 263 89 133 111 202 b 261 401 176 313 212 355 b 378 541 315 449 349 489 l 382 548 l 375 544 b 240 495 333 512 285 495 b 129 535 198 495 160 509 b 84 560 108 552 95 560 b 76 559 81 560 78 560 b 31 487 59 555 43 530 b 14 470 27 473 24 470 b 1 477 8 470 4 471 l 0 480 l 0 553 l 0 627 l 1 630 b 16 638 4 635 9 638 b 23 635 17 638 20 637 b 49 626 36 626 39 626 b 96 638 59 626 80 630 b 104 639 99 638 102 639 b 117 644 107 641 112 642 b 147 648 125 645 137 648 m 220 -1 l 221 -1 l 219 -1 l 220 -1 m 220 673 l 221 673 l 219 673 l 220 673 ', + }, + timeSig8: { + x_min: 0, + x_max: 488.640625, + ha: 499, + o: 'm 217 648 b 245 649 225 648 235 649 b 453 516 343 649 430 595 b 458 478 455 503 458 491 b 412 370 458 440 441 398 b 411 369 412 369 411 369 b 415 365 411 367 412 367 b 488 231 462 331 488 281 b 472 165 488 208 483 186 b 243 43 434 86 338 43 b 63 104 178 43 112 62 b 0 233 20 140 0 186 b 73 365 0 283 24 331 l 77 369 l 72 374 b 29 476 42 406 29 441 b 217 648 29 557 103 635 m 258 605 b 242 606 253 605 247 606 b 157 552 198 606 157 580 b 160 541 157 548 159 544 b 319 413 176 503 242 452 l 337 403 l 338 406 b 359 476 352 428 359 452 b 258 605 359 537 318 595 m 138 326 b 130 330 134 328 130 330 b 130 330 130 330 130 330 b 107 305 127 330 112 313 b 84 231 91 281 84 256 b 243 86 84 156 151 86 b 249 87 245 86 246 87 b 347 156 303 88 347 120 b 344 172 347 162 345 167 b 156 319 325 227 257 281 b 138 326 151 322 144 324 m 243 -1 l 245 -1 l 242 -1 l 243 -1 m 243 673 l 245 673 l 242 673 l 243 673 ', + }, + timeSig9: { + x_min: 0, + x_max: 475.03125, + ha: 485, + o: 'm 191 646 b 212 649 198 648 205 649 b 255 644 227 649 243 646 b 458 448 348 616 428 539 b 475 342 469 415 475 378 b 460 244 475 308 469 274 b 193 44 421 124 303 44 b 91 69 157 44 122 51 b 19 161 43 97 19 126 b 21 181 19 167 20 174 b 98 241 32 220 65 241 b 170 186 129 241 160 223 b 172 166 171 179 172 173 b 121 94 172 134 152 102 b 117 93 118 94 117 93 b 121 90 117 93 118 91 b 185 76 142 80 164 76 b 270 119 220 76 251 91 b 308 259 287 145 300 194 b 313 317 310 277 313 310 b 313 317 313 317 313 317 b 313 317 313 317 313 317 b 304 315 313 317 308 316 b 216 295 273 302 245 295 b 145 308 193 295 170 299 b 19 398 88 327 42 360 b 0 469 5 420 0 444 b 24 551 0 496 8 526 b 191 646 54 596 125 637 m 227 614 b 215 616 224 616 220 616 b 202 614 210 616 206 616 b 152 535 174 610 163 592 b 144 463 147 509 144 485 b 152 391 144 440 147 417 b 216 328 163 344 179 328 b 280 391 253 328 269 344 b 288 463 285 417 288 440 b 280 535 288 485 285 509 b 227 614 269 594 258 610 m 236 -1 l 238 -1 l 235 -1 l 236 -1 m 236 673 l 238 673 l 235 673 l 236 673 ', + }, + timeSigCommon: { + x_min: -1.359375, + x_max: 556.6875, + ha: 568, + o: 'm 294 322 b 318 323 299 322 308 323 b 360 320 334 323 352 322 b 526 217 430 310 490 273 b 543 166 537 202 543 184 b 447 70 543 117 503 70 b 445 70 447 70 446 70 b 359 159 394 72 359 113 b 368 201 359 173 362 187 b 442 245 382 229 412 245 b 455 244 446 245 451 245 b 460 244 458 244 460 244 b 460 244 460 244 460 244 b 454 248 460 244 458 245 b 325 291 417 276 372 291 b 285 287 313 291 299 290 b 144 -2 183 269 144 190 b 281 -290 144 -208 179 -280 b 304 -291 289 -291 298 -291 b 524 -105 412 -291 506 -212 b 541 -84 526 -88 530 -84 b 556 -101 551 -84 556 -90 b 549 -138 556 -111 553 -122 b 334 -322 521 -237 435 -310 b 302 -324 323 -323 313 -324 b 13 -101 172 -324 54 -234 b -1 -1 4 -68 -1 -34 b 294 322 -1 161 121 303 ', + }, + timeSigCutCommon: { + x_min: 0, + x_max: 556.6875, + ha: 568, + o: 'm 289 545 b 298 546 292 545 295 546 b 318 533 306 546 315 541 b 319 428 319 530 319 528 l 319 327 l 334 327 b 526 223 412 326 485 285 b 543 172 537 206 543 190 b 447 76 543 122 503 76 b 445 76 446 76 446 76 b 359 165 394 77 359 119 b 368 205 359 179 362 192 b 441 251 382 233 412 251 b 455 249 446 251 451 251 b 460 248 458 249 460 248 b 460 248 460 248 460 248 b 454 254 460 249 458 251 b 334 295 419 280 378 294 l 319 295 l 319 4 l 319 -287 l 321 -285 b 328 -285 322 -285 325 -285 b 524 -99 424 -277 507 -198 b 541 -79 526 -84 530 -79 b 556 -97 551 -79 556 -84 b 548 -133 556 -105 553 -117 b 334 -317 521 -233 434 -306 b 322 -319 329 -317 323 -317 l 319 -319 l 319 -424 b 319 -471 319 -444 319 -459 b 313 -541 319 -544 318 -535 b 298 -548 308 -545 303 -548 b 279 -534 289 -548 281 -542 b 277 -424 277 -531 277 -530 l 277 -317 l 273 -317 b 13 -95 153 -305 51 -217 b 0 2 4 -62 0 -29 b 182 295 0 126 66 238 b 274 324 210 309 249 320 l 277 324 l 277 427 b 279 533 277 528 277 530 b 289 545 281 538 285 542 m 277 2 b 277 291 277 161 277 291 b 268 288 277 291 273 290 b 144 1 179 265 144 184 b 276 -284 144 -199 175 -267 l 277 -285 l 277 2 ', + }, + timeSigPlus: { + x_min: 0, + x_max: 319.859375, + ha: 326, + o: 'm 149 508 b 159 509 152 509 155 509 b 186 494 170 509 181 503 b 190 440 190 487 190 488 l 190 430 l 190 377 l 242 377 l 251 377 b 303 373 298 377 296 377 b 319 345 314 367 319 356 b 304 319 319 335 314 324 b 250 315 296 315 299 315 l 242 315 l 190 315 l 190 262 l 190 252 b 186 198 190 204 190 205 b 159 183 179 188 170 183 b 132 198 148 183 138 188 b 127 252 127 205 127 204 l 127 262 l 127 315 l 76 315 l 68 315 b 14 319 20 315 21 315 b 0 347 4 324 0 335 b 14 373 0 356 4 367 b 68 377 21 377 20 377 l 76 377 l 127 377 l 127 430 l 127 440 b 132 494 127 488 127 487 b 149 508 136 501 142 505 ', + }, + timeSigPlusSmall: { + x_min: 0, + x_max: 319.859375, + ha: 326, + o: 'm 149 508 b 159 509 152 509 155 509 b 186 494 170 509 181 503 b 190 440 190 487 190 488 l 190 430 l 190 377 l 242 377 l 251 377 b 303 373 298 377 296 377 b 319 345 314 367 319 356 b 304 319 319 335 314 324 b 250 315 296 315 299 315 l 242 315 l 190 315 l 190 262 l 190 252 b 186 198 190 204 190 205 b 159 183 179 188 170 183 b 132 198 148 183 138 188 b 127 252 127 205 127 204 l 127 262 l 127 315 l 76 315 l 68 315 b 14 319 20 315 21 315 b 0 347 4 324 0 335 b 14 373 0 356 4 367 b 68 377 21 377 20 377 l 76 377 l 127 377 l 127 430 l 127 440 b 132 494 127 488 127 487 b 149 508 136 501 142 505 ', + }, + timeSigMinus: { + x_min: 0, + x_max: 318.5, + ha: 325, + o: 'm 20 376 b 167 377 23 377 96 377 b 296 376 231 377 294 377 b 318 347 311 371 318 359 b 296 316 318 333 311 320 b 159 315 294 315 227 315 b 21 316 91 315 24 315 b 0 345 6 320 0 333 b 20 376 0 359 6 371 ', + }, + timeSigParensRight: { + x_min: 25.859375, + x_max: 164.6875, + ha: 168, + o: 'm 34 369 b 40 370 35 370 38 370 b 59 353 49 370 50 367 b 164 40 122 254 155 158 b 164 0 164 33 164 16 b 164 -40 164 -16 164 -34 b 59 -353 155 -158 122 -254 b 40 -371 53 -366 47 -371 b 34 -370 38 -371 36 -370 b 25 -358 28 -367 25 -363 b 31 -337 25 -352 27 -347 b 92 0 72 -234 92 -117 b 31 335 92 116 72 233 b 25 356 27 345 25 352 b 34 369 25 363 28 366 ', + }, + timeSigParensRightSmall: { + x_min: 25.859375, + x_max: 164.6875, + ha: 168, + o: 'm 34 369 b 40 370 35 370 38 370 b 59 353 49 370 50 367 b 164 40 122 254 155 158 b 164 0 164 33 164 16 b 164 -40 164 -16 164 -34 b 59 -353 155 -158 122 -254 b 40 -371 53 -366 47 -371 b 34 -370 38 -371 36 -370 b 25 -358 28 -367 25 -363 b 31 -337 25 -352 27 -347 b 92 0 72 -234 92 -117 b 31 335 92 116 72 233 b 25 356 27 345 25 352 b 34 369 25 363 28 366 ', + }, + timeSigParensLeft: { + x_min: -166.0625, + x_max: -25.859375, + ha: 0, + o: 'm -49 369 b -42 370 -46 369 -44 370 b -27 360 -36 370 -29 366 b -25 355 -27 359 -25 358 b -32 335 -25 351 -28 347 b -92 52 -66 248 -87 159 b -93 -1 -93 43 -93 20 b -92 -54 -93 -23 -93 -45 b -32 -337 -85 -162 -66 -251 b -25 -355 -27 -349 -25 -352 b -42 -371 -25 -365 -32 -371 b -61 -353 -50 -371 -51 -369 b -163 -63 -119 -262 -153 -165 b -166 -1 -166 -37 -166 -31 b -163 62 -166 30 -166 36 b -61 352 -153 163 -119 260 b -49 369 -54 365 -51 366 ', + }, + timeSigParensLeftSmall: { + x_min: -166.0625, + x_max: -25.859375, + ha: 0, + o: 'm -49 369 b -42 370 -46 369 -44 370 b -27 360 -36 370 -29 366 b -25 355 -27 359 -25 358 b -32 335 -25 351 -28 347 b -92 52 -66 248 -87 159 b -93 -1 -93 43 -93 20 b -92 -54 -93 -23 -93 -45 b -32 -337 -85 -162 -66 -251 b -25 -355 -27 -349 -25 -352 b -42 -371 -25 -365 -32 -371 b -61 -353 -50 -371 -51 -369 b -163 -63 -119 -262 -153 -165 b -166 -1 -166 -37 -166 -31 b -163 62 -166 30 -166 36 b -61 352 -153 163 -119 260 b -49 369 -54 365 -51 366 ', + }, + noteheadDoubleWhole: { + x_min: 0, + x_max: 902.421875, + ha: 921, + o: 'm 17 240 b 24 241 19 241 21 241 b 32 240 28 241 31 241 b 46 229 38 238 43 234 b 50 88 50 223 50 237 b 50 -1 50 63 50 34 b 50 -90 50 -36 50 -65 b 46 -231 50 -238 50 -224 b 25 -242 42 -238 34 -242 b 0 -224 14 -242 4 -235 b 0 2 0 -222 0 -108 b 0 223 0 112 0 220 b 17 240 2 230 9 237 m 110 240 b 118 241 111 241 114 241 b 126 240 121 241 123 241 b 142 223 133 237 140 230 b 144 123 144 220 144 205 b 144 29 144 45 144 29 b 144 29 144 29 144 29 b 393 183 166 106 264 167 b 450 186 412 184 431 186 b 756 29 600 186 732 120 b 756 29 756 29 756 29 b 758 123 758 29 758 45 b 760 227 758 226 758 223 b 784 241 766 237 774 241 b 804 229 792 241 800 237 b 809 88 808 223 809 237 l 809 -1 l 809 -90 b 804 -231 809 -238 808 -224 b 784 -242 800 -238 792 -242 b 762 -231 775 -242 766 -238 b 758 -124 756 -224 758 -231 b 756 -30 758 -47 758 -30 b 756 -30 756 -30 756 -30 b 509 -184 736 -108 637 -169 b 450 -187 488 -187 469 -187 b 144 -30 300 -187 168 -122 b 144 -30 144 -30 144 -30 b 144 -124 144 -30 144 -47 b 140 -231 144 -231 144 -224 b 118 -242 134 -238 126 -242 b 92 -224 107 -242 96 -235 b 92 2 92 -222 92 -108 b 92 223 92 112 92 220 b 110 240 95 230 102 237 m 432 161 b 413 162 426 162 420 162 b 313 41 351 162 313 109 b 347 -73 313 5 323 -34 b 487 -163 385 -133 439 -163 b 578 -97 526 -163 562 -142 b 588 -43 585 -80 588 -62 b 432 161 588 47 518 147 m 868 240 b 876 241 869 241 872 241 b 884 240 879 241 882 241 b 898 229 890 238 894 234 b 902 88 902 223 902 237 l 902 -1 l 902 -90 b 898 -231 902 -238 902 -224 b 876 -242 892 -238 884 -242 b 852 -224 865 -242 854 -235 b 850 2 850 -222 850 -108 b 852 223 850 112 850 220 b 868 240 853 230 860 237 ', + }, + noteheadWhole: { + x_min: 0, + x_max: 619.3125, + ha: 632, + o: 'm 274 184 b 307 186 285 186 296 186 b 616 22 465 186 597 116 b 619 -1 617 13 619 5 b 308 -187 619 -104 483 -187 b 0 -1 133 -187 0 -102 b 5 36 0 11 1 23 b 274 184 29 115 141 176 m 289 161 b 272 162 284 162 277 162 b 171 41 209 162 171 108 b 205 -73 171 5 182 -34 b 345 -163 243 -133 298 -163 b 436 -98 385 -163 420 -142 b 446 -43 443 -80 446 -62 b 289 161 446 47 377 147 ', + }, + noteheadHalf: { + x_min: 0, + x_max: 428.75, + ha: 438, + o: 'm 262 186 b 273 186 266 186 272 186 b 274 186 273 186 274 186 b 285 186 274 186 280 186 b 428 48 375 181 428 122 b 386 -68 428 12 416 -29 b 155 -187 329 -145 236 -187 b 12 -111 92 -187 38 -162 b 0 -51 4 -91 0 -72 b 262 186 0 58 122 179 m 366 131 b 352 134 362 133 357 134 b 219 81 321 134 269 115 b 47 -111 126 23 50 -62 b 47 -112 47 -111 47 -112 b 77 -136 47 -129 58 -136 b 264 -45 118 -136 194 -101 b 382 109 336 12 382 76 b 366 131 382 120 377 129 ', + }, + noteheadBlack: { + x_min: 0, + x_max: 428.75, + ha: 438, + o: 'm 262 186 b 273 186 266 186 272 186 b 274 186 273 186 274 186 b 285 186 274 186 280 186 b 428 48 375 181 428 122 b 386 -68 428 12 416 -29 b 155 -187 329 -145 236 -187 b 12 -111 92 -187 38 -162 b 0 -51 4 -91 0 -72 b 262 186 0 58 122 179 ', + }, + noteheadXWhole: { + x_min: 0, + x_max: 598.890625, + ha: 611, + o: 'm 62 181 b 77 183 66 183 72 183 b 91 181 83 183 88 183 b 202 131 100 180 106 177 l 299 87 l 394 131 b 517 183 499 181 502 183 b 519 183 517 183 518 183 b 598 104 567 183 598 144 b 577 49 598 84 592 65 b 518 15 567 38 563 37 b 484 0 499 6 484 0 b 518 -16 484 -1 499 -8 b 577 -51 563 -38 567 -40 b 598 -105 592 -66 598 -86 b 519 -184 598 -145 567 -184 b 517 -184 518 -184 517 -184 b 394 -133 502 -184 499 -183 l 299 -88 l 202 -133 b 81 -184 99 -183 95 -184 b 77 -184 80 -184 78 -184 b 0 -105 29 -184 0 -145 b 20 -51 0 -86 5 -66 b 80 -16 29 -40 34 -38 b 114 -1 98 -8 114 -1 b 80 15 114 0 98 6 b 20 49 34 37 29 38 b 0 104 6 65 0 84 b 62 181 0 140 23 174 m 88 134 b 74 136 85 134 80 136 b 68 134 72 136 69 136 b 46 104 54 130 46 117 b 55 81 46 95 49 88 b 149 34 59 76 53 80 b 224 -1 190 15 224 0 b 144 -38 224 -1 187 -18 b 54 -84 59 -79 58 -79 b 46 -105 49 -90 46 -98 b 76 -137 46 -122 58 -137 b 78 -137 77 -137 77 -137 b 194 -86 87 -137 76 -141 b 298 -36 250 -58 298 -36 b 298 -36 298 -36 298 -36 b 402 -84 299 -36 345 -58 b 518 -137 522 -141 510 -137 b 521 -137 519 -137 519 -137 b 551 -105 539 -137 551 -122 b 541 -83 551 -98 548 -90 b 447 -36 537 -77 544 -81 b 374 -1 406 -16 374 -1 b 447 34 374 0 406 15 b 541 81 544 80 537 76 b 551 104 548 88 551 97 b 521 136 551 120 539 136 b 518 136 519 136 519 136 b 517 136 518 136 517 136 l 517 136 b 402 83 511 136 511 136 b 298 34 345 56 299 34 b 298 34 298 34 298 34 b 194 84 298 34 250 56 b 88 134 137 111 89 133 ', + }, + noteheadXHalf: { + x_min: 0, + x_max: 406.96875, + ha: 415, + o: 'm 55 181 b 70 183 61 183 66 183 b 111 170 85 183 99 179 b 160 130 115 167 137 149 l 202 95 l 245 130 b 319 181 299 176 302 179 b 334 183 325 183 330 183 b 406 109 375 183 406 148 b 401 81 406 99 405 91 b 348 24 394 65 390 59 b 318 -1 332 11 318 0 b 348 -26 318 -1 332 -12 b 401 -83 390 -61 394 -66 b 406 -111 405 -93 406 -101 b 334 -184 406 -149 375 -184 b 319 -183 330 -184 325 -184 b 245 -131 302 -180 299 -177 l 202 -97 l 160 -131 b 85 -183 107 -177 103 -180 b 70 -184 80 -184 76 -184 b 0 -111 31 -184 0 -149 b 4 -83 0 -101 1 -93 b 58 -26 10 -66 16 -61 b 88 -1 74 -12 88 -1 b 58 24 88 0 74 11 b 10 69 23 54 17 59 b 0 109 2 81 0 95 b 55 181 0 142 21 173 m 83 133 b 72 136 78 136 76 136 b 57 131 66 136 61 134 b 46 109 49 126 46 117 b 50 93 46 104 47 98 b 107 45 51 91 77 70 b 160 0 137 20 160 0 b 107 -47 160 -1 137 -22 b 50 -94 77 -72 51 -93 b 46 -111 47 -99 46 -105 b 59 -134 46 -120 50 -130 b 72 -137 62 -136 68 -137 b 83 -136 76 -137 80 -136 b 144 -84 84 -134 107 -116 b 202 -36 176 -58 202 -36 b 261 -84 202 -36 230 -58 b 323 -136 299 -116 321 -134 b 334 -137 326 -136 330 -137 b 345 -134 338 -137 343 -136 b 360 -111 355 -130 360 -120 b 355 -94 360 -105 359 -99 b 299 -47 353 -93 329 -72 b 245 0 269 -22 245 -1 b 299 45 245 0 269 20 b 355 93 329 70 353 91 b 360 109 359 98 360 104 b 345 133 360 119 355 129 b 334 136 343 134 338 136 b 323 134 330 136 326 134 b 261 83 321 133 299 115 b 202 34 230 56 202 34 b 144 83 202 34 176 56 b 83 133 106 115 84 133 ', + }, + noteheadXBlack: { + x_min: 0, + x_max: 406.96875, + ha: 415, + o: 'm 21 183 b 28 183 24 183 25 183 b 42 181 34 183 39 183 b 127 108 47 179 47 179 b 202 41 168 72 202 41 b 279 108 204 41 238 72 b 357 177 321 145 356 176 b 375 183 363 181 370 183 b 406 151 392 183 406 169 b 404 137 406 147 405 141 b 322 62 401 131 398 129 b 251 0 284 27 251 0 b 322 -63 251 -1 284 -29 b 404 -138 398 -130 401 -133 b 406 -152 405 -142 406 -148 b 375 -184 406 -170 392 -184 b 357 -179 370 -184 363 -183 b 279 -109 356 -177 321 -147 b 202 -43 238 -73 204 -43 b 127 -109 202 -43 168 -73 b 49 -179 85 -147 50 -177 b 31 -184 43 -183 36 -184 b 0 -152 13 -184 0 -170 b 2 -138 0 -148 0 -142 b 83 -63 5 -133 8 -130 b 155 0 122 -29 155 -1 b 83 62 155 0 122 27 b 8 129 43 97 10 127 b 0 151 2 136 0 144 b 21 183 0 165 8 177 ', + }, + noteheadCircleX: { + x_min: 0, + x_max: 484.5625, + ha: 494, + o: 'm 228 245 b 239 247 234 247 239 247 b 243 247 240 247 242 247 b 303 238 257 247 287 242 b 484 -2 417 208 484 104 b 412 -177 484 -65 461 -127 b 243 -248 363 -226 303 -248 b 6 -63 138 -248 36 -180 b 0 -1 1 -41 0 -20 b 228 245 0 127 98 240 m 255 181 b 240 183 247 183 245 183 b 232 181 238 183 235 183 b 142 152 200 180 168 170 l 138 149 l 190 97 l 242 44 l 294 97 l 345 149 l 340 152 b 255 181 315 169 284 180 m 147 -54 l 197 -1 l 147 51 l 95 104 l 91 99 b 62 -1 72 70 62 34 b 66 -43 62 -15 63 -29 b 91 -101 72 -63 80 -84 l 95 -106 l 147 -54 m 393 99 b 389 104 390 102 389 104 b 337 51 389 104 366 80 l 285 -1 l 337 -54 l 389 -106 l 393 -101 b 421 -1 412 -72 421 -36 b 393 99 421 34 412 69 m 294 -98 b 242 -45 265 -69 242 -45 b 190 -98 242 -45 219 -69 l 138 -151 l 142 -154 b 242 -184 172 -174 206 -184 b 340 -154 276 -184 311 -174 l 345 -151 l 294 -98 ', + }, + noteheadTriangleUpWhole: { + x_min: 0, + x_max: 630.203125, + ha: 643, + o: 'm 308 204 b 314 205 310 205 313 205 b 326 201 319 205 323 204 b 355 154 328 199 338 180 b 401 83 362 142 392 95 l 409 72 b 431 41 412 66 424 49 b 619 -174 498 -51 570 -134 b 630 -192 626 -180 630 -186 b 626 -202 630 -195 628 -199 b 616 -206 623 -205 620 -206 b 552 -188 608 -206 592 -202 b 310 -155 488 -169 392 -155 b 268 -156 295 -155 281 -155 b 77 -188 197 -161 126 -173 b 13 -206 35 -202 20 -206 b 9 -206 12 -206 10 -206 b 0 -191 2 -202 0 -197 b 8 -176 0 -186 2 -180 b 204 49 58 -136 138 -43 l 220 72 l 227 83 b 295 188 245 108 281 166 b 308 204 299 197 304 202 m 315 147 b 314 147 315 147 314 147 b 314 147 314 147 314 147 b 306 129 314 145 310 138 l 296 105 b 281 72 292 97 284 77 l 274 56 b 181 -123 247 -4 212 -72 l 174 -134 l 176 -133 b 314 -123 215 -127 272 -123 b 451 -133 356 -123 413 -127 l 454 -134 l 449 -123 b 353 56 417 -72 381 -4 l 347 72 b 332 105 344 77 336 97 l 322 129 b 315 147 318 138 315 145 ', + }, + noteheadTriangleUpHalf: { + x_min: 0, + x_max: 438.28125, + ha: 447, + o: 'm 212 205 b 219 205 213 205 216 205 b 239 183 228 205 231 204 b 421 -163 298 40 363 -83 b 438 -191 434 -180 438 -186 b 436 -197 438 -192 438 -195 b 424 -206 434 -204 431 -206 b 406 -201 420 -206 415 -205 b 216 -156 347 -172 281 -156 b 23 -205 148 -156 80 -173 b 14 -206 20 -206 17 -206 b 0 -191 6 -206 0 -201 b 6 -176 0 -187 1 -183 b 202 192 63 -104 142 45 b 212 205 205 199 208 202 m 264 48 l 249 81 l 243 94 l 242 91 b 89 -126 208 36 137 -66 b 81 -138 85 -133 81 -138 b 81 -138 81 -138 81 -138 b 81 -138 81 -138 81 -138 b 95 -133 81 -138 87 -136 b 280 -94 156 -108 221 -94 b 334 -98 299 -94 317 -95 b 343 -99 338 -99 343 -99 b 343 -99 343 -99 343 -99 b 338 -94 343 -99 341 -97 b 264 48 318 -58 287 1 ', + }, + noteheadTriangleUpBlack: { + x_min: -1.359375, + x_max: 436.921875, + ha: 446, + o: 'm 213 205 b 217 205 215 205 216 205 b 234 194 224 205 234 199 b 236 187 234 194 235 190 l 245 167 l 261 129 l 270 106 b 355 -61 294 54 329 -13 b 420 -163 381 -105 402 -138 b 436 -188 435 -184 436 -184 b 436 -191 436 -190 436 -190 b 421 -206 436 -201 431 -206 l 421 -206 l 416 -206 l 405 -201 b 217 -158 347 -172 283 -158 b 31 -201 153 -158 88 -172 l 20 -206 l 14 -206 l 14 -206 b 0 -191 5 -206 0 -201 b -1 -188 0 -190 -1 -190 b 14 -163 -1 -186 0 -184 b 95 -34 36 -136 72 -77 b 166 106 119 8 148 68 l 175 129 l 183 148 l 200 188 b 213 205 205 199 208 202 ', + }, + noteheadDiamondWhole: { + x_min: 0, + x_max: 627.46875, + ha: 640, + o: 'm 306 190 b 314 191 308 191 311 191 b 326 184 318 191 322 190 l 336 173 b 510 52 377 127 442 80 b 515 49 513 51 515 49 b 611 16 537 40 579 24 b 627 0 624 13 627 9 b 607 -18 627 -11 624 -13 b 330 -181 490 -49 389 -109 b 314 -192 323 -190 319 -192 b 306 -191 311 -192 308 -192 b 294 -177 302 -188 302 -188 b 257 -140 287 -170 265 -148 b 19 -18 193 -84 114 -44 b 0 0 2 -13 0 -11 b 16 16 0 9 2 13 b 110 49 47 24 89 40 b 117 52 111 49 114 51 b 145 65 126 56 130 58 b 281 163 200 93 245 124 b 300 186 288 170 291 174 b 306 190 300 187 303 188 m 317 137 b 313 142 315 141 314 142 b 308 137 313 142 311 141 b 161 4 276 84 220 33 b 155 0 159 1 155 0 b 163 -4 155 0 159 -2 b 308 -138 220 -34 276 -84 b 313 -142 311 -141 313 -142 b 317 -138 314 -142 315 -141 b 464 -4 351 -84 406 -34 b 470 0 468 -2 470 0 b 464 4 470 0 468 1 b 317 137 406 33 351 84 ', + }, + noteheadDiamondHalf: { + x_min: 0, + x_max: 438.28125, + ha: 447, + o: 'm 212 190 b 219 191 213 191 216 191 b 236 176 225 191 228 190 b 419 18 277 105 341 49 b 436 5 431 13 434 11 b 438 -1 438 4 438 1 b 424 -16 438 -8 432 -13 b 356 -49 409 -20 379 -36 b 234 -180 306 -83 258 -133 b 219 -192 230 -188 224 -192 b 200 -176 213 -192 206 -187 b 9 -15 157 -102 89 -45 b 0 0 2 -12 0 -6 b 16 18 0 9 2 12 b 200 176 93 48 159 104 b 212 190 205 186 208 188 m 239 113 b 236 117 238 116 238 117 b 230 108 235 117 234 115 b 92 -15 196 58 140 8 b 88 -18 91 -16 88 -18 b 92 -20 88 -18 91 -19 b 198 -116 130 -43 166 -74 b 200 -117 200 -117 200 -117 b 201 -117 200 -117 201 -117 b 264 -43 212 -98 242 -62 b 345 15 288 -19 321 4 b 348 18 347 16 348 16 b 344 20 348 18 347 19 b 239 113 307 41 266 79 ', + }, + noteheadDiamondBlack: { + x_min: 0, + x_max: 432.828125, + ha: 442, + o: 'm 209 186 b 213 187 210 187 212 187 b 216 187 215 187 216 187 b 224 174 216 186 220 180 b 420 -1 269 105 338 43 b 432 -12 431 -8 432 -9 b 421 -23 432 -15 432 -16 b 228 -180 345 -70 264 -137 b 219 -188 221 -188 221 -188 l 219 -188 b 208 -177 215 -188 215 -188 b 10 1 163 -106 93 -44 b 0 11 0 6 0 8 b 10 22 0 13 0 15 b 202 179 87 69 167 136 b 209 186 206 183 209 186 ', + }, + augmentationDot: { + x_min: 0, + x_max: 133.390625, + ha: 136, + o: 'm 54 66 b 65 68 58 68 61 68 b 122 37 88 68 110 56 b 133 -1 130 26 133 12 b 104 -58 133 -23 123 -44 b 66 -69 92 -65 78 -69 b 10 -38 44 -69 23 -58 b 0 -1 2 -27 0 -13 b 54 66 0 30 20 61 ', + }, + tremolo1: { + x_min: -206.890625, + x_max: 428.75, + ha: 438, + o: 'm 389 -351 b 394 -351 390 -351 393 -351 b 428 -385 413 -351 428 -367 b 428 -394 428 -388 428 -391 b 394 -428 426 -406 421 -410 l 332 -473 l 269 -516 l 205 -560 l 141 -603 l 77 -648 l 13 -692 l -50 -737 l -114 -780 l -145 -802 b -171 -813 -157 -810 -163 -813 b -175 -813 -172 -813 -174 -813 b -206 -777 -194 -811 -206 -795 b -202 -760 -206 -771 -205 -766 b -87 -675 -197 -752 -206 -757 l -34 -639 l 83 -557 l 145 -514 l 209 -470 l 272 -427 b 389 -351 375 -356 381 -352 ', + }, + flag8thUp: { + x_min: -24.5, + x_max: 317.140625, + ha: 324, + o: 'm -24 -161 l -24 -5 l -20 -5 b 0 -24 -9 -5 -2 -12 b 171 -315 21 -124 84 -233 b 317 -660 268 -406 317 -531 b 187 -1014 317 -782 274 -909 b 161 -1034 172 -1034 171 -1034 b 141 -1013 149 -1034 141 -1025 b 152 -991 141 -1004 142 -1002 b 266 -682 228 -899 266 -788 b 174 -430 266 -588 236 -498 b -23 -317 136 -388 66 -348 b -24 -161 -23 -316 -24 -285 ', + }, + flag8thDown: { + x_min: -21.78125, + x_max: 367.5, + ha: 375, + o: 'm 230 1031 b 238 1032 232 1032 235 1032 b 259 1014 245 1032 251 1027 b 367 662 330 906 367 782 b 364 602 367 641 367 621 b 232 317 352 488 304 384 b 57 120 155 245 103 187 b -1 18 31 84 6 40 b -19 4 -4 11 -12 4 l -21 4 l -21 159 l -21 315 l -16 315 b 96 335 10 315 62 324 b 315 695 227 380 315 527 b 313 738 315 709 314 724 b 224 991 304 825 273 916 b 216 1013 219 999 216 1007 b 230 1031 216 1021 220 1028 ', + }, + flag16thUp: { + x_min: -24.5, + x_max: 317.140625, + ha: 324, + o: 'm -24 -147 l -24 -5 l -20 -5 b -1 -19 -12 -5 -4 -11 b 58 -123 6 -43 31 -86 b 196 -278 93 -173 134 -219 b 317 -570 274 -356 317 -460 b 294 -713 317 -617 308 -666 l 289 -724 l 294 -735 b 317 -873 308 -780 317 -827 b 235 -1132 317 -963 288 -1054 b 209 -1165 228 -1140 224 -1146 b 189 -1177 204 -1172 196 -1177 b 171 -1164 182 -1177 175 -1172 b 168 -1154 170 -1161 168 -1159 b 181 -1132 168 -1149 172 -1142 b 269 -891 238 -1064 269 -975 b 269 -881 269 -886 269 -884 b 262 -814 269 -857 265 -827 b 258 -800 261 -811 259 -806 b 142 -628 240 -731 198 -667 b -8 -589 112 -606 47 -589 b -20 -589 -13 -589 -19 -589 l -24 -589 l -24 -449 l -24 -308 l -20 -308 b -1 -322 -12 -308 -4 -313 b 58 -424 6 -345 31 -388 b 194 -580 93 -476 136 -523 b 259 -660 221 -606 245 -635 b 261 -663 259 -662 261 -663 b 264 -656 262 -663 262 -660 b 269 -587 268 -632 269 -610 b 264 -521 269 -566 268 -544 b 262 -512 264 -517 262 -513 b 258 -498 261 -509 259 -503 b 142 -326 240 -428 198 -365 b -8 -287 112 -303 47 -288 b -20 -287 -13 -287 -19 -287 l -24 -287 l -24 -147 ', + }, + flag16thDown: { + x_min: -21.78125, + x_max: 362.0625, + ha: 369, + o: 'm 302 1031 b 308 1032 304 1032 307 1032 b 330 1016 318 1032 325 1027 b 362 867 351 970 362 920 b 340 738 362 824 353 780 l 336 727 l 340 717 b 362 591 355 677 362 634 b 257 323 362 496 325 401 b 204 272 243 306 227 290 b 20 56 129 206 66 133 b -1 18 12 44 0 22 b -19 4 -4 9 -12 4 l -21 4 l -21 140 l -21 276 l -12 277 b 167 333 61 288 127 309 b 319 598 262 388 319 491 b 311 664 319 620 317 642 l 310 673 l 304 664 b 204 548 279 620 250 587 b 20 333 129 483 66 409 b -1 292 12 320 0 298 b -19 280 -4 285 -12 280 l -21 280 l -21 416 l -21 552 l -12 553 b 167 609 61 564 127 585 b 319 874 264 666 319 770 b 294 992 319 914 311 954 b 288 1011 288 1004 288 1007 b 302 1031 288 1021 294 1028 ', + }, + flag32ndUp: { + x_min: -24.5, + x_max: 315.78125, + ha: 322, + o: 'm -24 -145 l -24 -5 l -20 -5 b 1 -26 -10 -5 -6 -9 b 175 -241 31 -86 96 -166 b 314 -548 259 -323 304 -420 b 315 -589 315 -555 315 -571 b 314 -630 315 -606 315 -623 b 298 -730 311 -664 306 -699 l 295 -742 l 296 -748 b 314 -850 304 -778 311 -813 b 315 -892 315 -857 315 -874 b 314 -932 315 -909 315 -925 b 298 -1032 311 -967 306 -1002 l 295 -1045 l 296 -1050 b 314 -1153 304 -1081 311 -1115 b 315 -1193 315 -1160 315 -1177 b 314 -1235 315 -1211 315 -1228 b 217 -1526 306 -1338 270 -1444 b 201 -1533 213 -1532 208 -1533 b 182 -1522 193 -1533 185 -1529 b 179 -1514 181 -1518 179 -1517 b 189 -1489 179 -1508 182 -1501 b 266 -1217 240 -1403 266 -1308 b 262 -1156 266 -1196 265 -1177 b 110 -907 247 -1043 190 -950 b 0 -889 87 -895 50 -889 l -1 -889 l -24 -889 l -24 -749 l -24 -610 l -20 -610 b 1 -631 -10 -610 -6 -614 b 175 -846 31 -691 96 -771 b 259 -956 213 -884 236 -914 b 265 -966 262 -961 264 -966 b 265 -966 265 -966 265 -966 b 265 -953 265 -964 265 -959 b 266 -920 266 -943 266 -932 b 262 -853 266 -898 265 -873 b 110 -605 247 -741 190 -648 b 0 -587 87 -592 50 -587 l -1 -587 l -24 -587 l -24 -448 l -24 -308 l -20 -308 b 1 -328 -10 -308 -6 -312 b 175 -544 31 -388 96 -469 b 259 -655 213 -581 236 -612 b 265 -663 262 -659 264 -663 b 265 -663 265 -663 265 -663 b 265 -650 265 -663 265 -657 b 266 -617 266 -641 266 -630 b 262 -551 266 -595 265 -570 b 110 -303 247 -438 190 -345 b 0 -284 87 -290 50 -284 l -1 -284 l -24 -284 l -24 -145 ', + }, + flag32ndDown: { + x_min: -21.78125, + x_max: 366.140625, + ha: 374, + o: 'm 276 1378 b 284 1379 279 1379 281 1379 b 306 1360 292 1379 298 1374 b 352 1247 326 1326 343 1286 b 366 1139 362 1213 366 1175 b 347 1009 366 1093 359 1049 l 344 1002 l 347 992 b 352 971 348 986 351 977 b 366 863 362 936 366 899 b 347 732 366 818 359 773 l 344 725 l 347 716 b 352 695 348 710 351 700 b 366 588 362 659 366 623 b 223 262 366 464 314 345 b 189 233 212 252 212 252 b 35 76 126 183 73 129 b -1 16 20 56 2 27 b -19 4 -4 9 -12 4 l -21 4 l -21 137 l -21 270 l -17 270 b 186 344 59 281 134 308 b 319 606 270 399 319 499 b 317 650 319 620 319 635 l 315 659 l 314 655 b 223 537 288 607 258 570 b 189 509 212 528 212 528 b 35 352 126 459 73 405 b -1 292 20 333 2 303 b -19 280 -4 285 -12 280 l -21 280 l -21 413 l -21 546 l -17 546 b 186 620 59 557 134 584 b 319 882 270 675 319 775 b 317 925 319 896 319 911 l 315 935 l 314 931 b 223 813 288 884 258 846 b 189 785 212 805 212 805 b 35 628 126 735 73 681 b -1 569 20 609 2 580 b -19 556 -4 562 -12 556 l -21 556 l -21 689 l -21 823 l -17 823 b 202 907 68 835 152 867 b 319 1157 280 968 319 1061 b 270 1338 319 1218 303 1281 b 262 1358 264 1349 262 1353 b 262 1364 262 1360 262 1363 b 276 1378 265 1371 269 1376 ', + }, + flag64thUp: { + x_min: -24.5, + x_max: 314.421875, + ha: 321, + o: 'm -24 -145 l -24 -5 l -20 -5 b 0 -23 -9 -5 -2 -12 b 27 -87 4 -38 14 -66 b 138 -220 53 -136 88 -177 b 235 -328 179 -255 208 -288 b 314 -592 287 -409 314 -501 b 292 -732 314 -639 307 -687 l 289 -742 l 294 -756 b 314 -896 307 -802 314 -849 b 292 -1035 314 -943 307 -991 l 289 -1045 l 294 -1057 b 314 -1197 307 -1104 314 -1152 b 292 -1338 314 -1246 307 -1292 l 289 -1347 l 294 -1360 b 314 -1500 307 -1407 314 -1454 b 273 -1689 314 -1565 300 -1628 b 250 -1712 265 -1710 261 -1712 b 228 -1691 236 -1712 228 -1704 l 228 -1685 l 234 -1675 b 270 -1507 258 -1621 270 -1564 b 98 -1193 270 -1381 209 -1261 b 40 -1174 76 -1179 58 -1174 b -10 -1189 24 -1174 8 -1178 b -20 -1192 -14 -1192 -16 -1192 l -24 -1192 l -24 -1052 l -24 -913 l -20 -913 b 0 -931 -9 -913 -2 -920 b 27 -995 4 -946 14 -974 b 138 -1128 53 -1043 88 -1085 b 257 -1275 190 -1172 228 -1220 b 262 -1283 259 -1279 262 -1283 l 262 -1283 b 269 -1249 264 -1282 268 -1260 b 270 -1206 270 -1233 270 -1220 b 98 -891 270 -1075 206 -957 b 40 -871 76 -877 58 -871 b -10 -886 24 -871 8 -875 b -20 -889 -14 -889 -16 -889 l -24 -889 l -24 -749 l -24 -610 l -20 -610 b 0 -628 -9 -610 -2 -617 b 27 -692 4 -644 14 -671 b 138 -825 53 -741 88 -782 b 257 -973 190 -870 228 -917 b 262 -981 259 -977 262 -981 l 262 -981 b 269 -946 264 -979 268 -957 b 270 -903 270 -931 270 -917 b 98 -588 270 -774 206 -655 b 40 -569 76 -574 58 -569 b -10 -584 24 -569 8 -574 b -20 -587 -14 -587 -16 -587 l -24 -587 l -24 -448 l -24 -308 l -20 -308 b 0 -326 -9 -308 -2 -315 b 27 -390 4 -341 14 -369 b 138 -523 53 -438 88 -480 b 257 -670 190 -567 228 -614 b 262 -678 259 -674 262 -678 b 262 -678 262 -678 262 -678 b 269 -644 264 -677 268 -656 b 270 -601 270 -628 270 -614 b 98 -285 270 -471 206 -352 b 40 -266 76 -273 58 -266 b -10 -281 24 -266 8 -272 b -20 -284 -14 -284 -16 -284 l -24 -284 l -24 -145 ', + }, + flag64thDown: { + x_min: -21.78125, + x_max: 367.5, + ha: 375, + o: 'm 259 1553 b 265 1553 261 1553 264 1553 b 288 1540 272 1553 277 1550 b 367 1351 340 1493 367 1424 b 336 1221 367 1308 357 1263 l 332 1211 l 333 1208 b 367 1077 356 1170 367 1124 b 336 945 367 1032 357 986 l 332 935 l 333 932 b 367 800 356 893 367 848 b 336 669 367 756 357 710 l 332 659 l 333 656 b 367 523 356 617 367 571 b 345 412 367 485 360 446 b 231 273 322 356 284 310 b -1 19 121 195 27 93 b -17 4 -4 11 -10 5 l -21 4 l -21 134 l -21 265 l -17 265 b 133 291 20 265 96 278 b 318 537 245 328 318 433 b 307 603 318 559 315 582 b 303 614 304 612 304 614 b 298 609 302 614 300 613 b 231 549 281 589 258 567 b -1 295 121 471 27 369 b -17 280 -4 287 -10 281 l -21 280 l -21 410 l -21 541 l -17 541 b 133 567 20 541 96 555 b 318 813 245 605 318 709 b 307 880 318 835 315 859 b 303 891 304 888 304 891 b 298 885 302 891 300 888 b 231 825 281 866 258 843 b -1 571 121 748 27 645 b -17 556 -4 563 -10 557 l -21 556 l -21 687 l -21 817 l -17 817 b 133 843 20 817 96 830 b 318 1089 245 881 318 985 b 307 1156 318 1111 315 1134 b 303 1167 304 1164 304 1167 b 298 1161 302 1167 300 1164 b 231 1102 281 1140 258 1120 b -1 848 121 1024 27 921 b -17 832 -4 839 -10 834 l -21 832 l -21 963 l -21 1093 l -17 1093 b 114 1113 12 1093 78 1103 b 313 1314 215 1142 289 1218 b 318 1364 317 1331 318 1347 b 255 1511 318 1422 295 1478 b 243 1532 247 1519 243 1525 b 259 1553 243 1540 250 1550 ', + }, + flag128thUp: { + x_min: -24.5, + x_max: 313.0625, + ha: 319, + o: 'm -24 -133 l -24 -5 l -20 -5 b -1 -19 -12 -5 -4 -11 b 142 -213 13 -61 74 -144 b 258 -376 196 -269 230 -315 b 313 -605 295 -449 313 -528 b 292 -742 313 -652 306 -699 b 288 -752 289 -748 288 -752 b 288 -752 288 -752 288 -752 b 292 -764 289 -753 291 -757 b 313 -907 306 -811 313 -860 b 292 -1045 313 -954 306 -1002 b 288 -1054 289 -1050 288 -1054 b 288 -1054 288 -1054 288 -1054 b 292 -1067 289 -1054 291 -1060 b 313 -1210 306 -1113 313 -1161 b 292 -1346 313 -1257 306 -1304 b 288 -1357 289 -1353 288 -1357 b 288 -1357 288 -1357 288 -1357 b 292 -1368 289 -1357 291 -1363 b 313 -1512 306 -1415 313 -1464 b 292 -1648 313 -1560 306 -1605 b 288 -1660 289 -1654 288 -1660 b 288 -1660 288 -1660 288 -1660 b 292 -1671 289 -1660 291 -1665 b 313 -1814 306 -1719 313 -1766 b 250 -2040 313 -1897 291 -1977 b 232 -2062 238 -2057 236 -2059 b 221 -2065 230 -2063 225 -2065 b 200 -2045 210 -2065 201 -2057 b 200 -2043 200 -2044 200 -2044 b 208 -2026 200 -2037 202 -2034 b 269 -1826 249 -1966 269 -1897 b 153 -1544 269 -1726 230 -1625 b -9 -1472 115 -1506 58 -1481 b -21 -1471 -14 -1471 -19 -1471 l -24 -1471 l -24 -1343 l -24 -1215 l -20 -1215 b -1 -1229 -12 -1215 -4 -1221 b 142 -1424 13 -1270 74 -1353 b 257 -1582 196 -1478 228 -1524 b 264 -1594 261 -1589 264 -1594 l 264 -1594 b 265 -1582 264 -1594 264 -1589 b 270 -1525 268 -1562 270 -1544 b 153 -1243 270 -1424 228 -1321 b -9 -1170 115 -1203 58 -1178 b -21 -1168 -14 -1170 -19 -1168 l -24 -1168 l -24 -1041 l -24 -913 l -20 -913 b -1 -927 -12 -913 -4 -918 b 142 -1121 13 -967 74 -1050 b 257 -1281 196 -1175 228 -1221 b 264 -1292 261 -1286 264 -1292 l 264 -1292 b 265 -1279 264 -1292 264 -1286 b 270 -1222 268 -1261 270 -1242 b 153 -941 270 -1121 228 -1018 b -9 -867 115 -900 58 -875 b -21 -866 -14 -867 -19 -866 l -24 -866 l -24 -738 l -24 -610 l -20 -610 b -1 -624 -12 -610 -4 -616 b 142 -818 13 -664 74 -749 b 257 -978 196 -873 228 -918 b 264 -989 261 -984 264 -989 l 264 -989 b 265 -977 264 -989 264 -984 b 270 -920 268 -959 270 -939 b 153 -638 270 -818 228 -716 b -9 -564 115 -598 58 -573 b -21 -563 -14 -564 -19 -563 l -24 -563 l -24 -435 l -24 -308 l -20 -308 b -1 -322 -12 -308 -4 -313 b 142 -516 13 -363 74 -446 b 257 -675 196 -571 228 -616 b 264 -687 261 -681 264 -687 l 264 -687 b 265 -674 264 -687 264 -681 b 270 -617 268 -656 270 -637 b 153 -335 270 -516 228 -413 b -9 -262 115 -295 58 -270 b -21 -260 -14 -262 -19 -260 l -24 -260 l -24 -133 ', + }, + flag128thDown: { + x_min: -21.78125, + x_max: 367.5, + ha: 375, + o: 'm 276 1900 b 284 1901 279 1900 281 1901 b 306 1883 291 1901 298 1896 b 367 1686 347 1825 367 1757 b 343 1558 367 1643 359 1600 l 338 1549 l 343 1537 b 367 1411 359 1497 367 1454 b 343 1282 367 1367 359 1324 l 338 1272 l 343 1261 b 367 1135 359 1221 367 1178 b 343 1007 367 1090 359 1047 l 338 996 l 343 985 b 367 859 359 945 367 902 b 343 731 367 814 359 771 l 338 720 l 343 709 b 367 582 359 667 367 626 b 289 362 367 503 340 426 b 239 312 276 345 259 330 b 29 77 152 237 76 152 b -1 18 14 54 2 30 b -19 4 -4 11 -12 4 l -21 4 l -21 133 l -20 260 l -13 262 b 98 299 17 269 62 284 b 111 305 103 302 110 305 b 167 334 123 310 156 327 b 319 595 264 391 319 491 b 313 659 319 616 318 638 b 310 667 311 664 311 667 b 307 663 310 667 308 666 b 240 588 289 637 269 614 b 16 331 141 505 62 413 b -1 294 8 316 1 302 b -19 280 -4 287 -12 280 l -21 280 l -21 408 l -20 537 l -13 538 b 98 576 17 545 62 560 b 111 581 103 578 110 581 b 167 610 123 587 156 603 b 319 871 264 667 319 767 b 313 935 319 892 318 913 b 310 942 311 941 311 942 b 307 939 310 942 308 941 b 240 864 289 913 269 889 b 16 607 141 781 62 689 b -1 570 8 592 1 578 b -19 556 -4 563 -12 556 l -21 556 l -21 684 l -20 813 l -13 814 b 98 852 17 821 62 836 b 111 857 103 855 110 857 b 167 886 123 863 156 880 b 319 1147 264 943 319 1043 b 313 1211 319 1168 318 1189 b 310 1218 311 1217 311 1218 b 307 1215 310 1218 308 1217 b 240 1140 289 1188 269 1165 b 16 884 141 1057 62 966 b -1 846 8 868 1 855 b -19 832 -4 839 -12 832 l -21 832 l -21 960 l -20 1089 l -13 1090 b 98 1128 17 1097 62 1111 b 111 1134 103 1131 110 1134 b 167 1163 123 1139 156 1156 b 319 1424 264 1220 319 1320 b 313 1486 319 1444 318 1465 b 310 1494 311 1493 311 1494 b 307 1492 310 1494 308 1493 b 240 1417 289 1464 269 1442 b 16 1160 141 1333 62 1242 b -1 1121 8 1145 1 1131 b -19 1109 -4 1115 -12 1109 l -21 1109 l -21 1236 l -20 1365 l -13 1367 b 98 1404 17 1374 62 1388 b 111 1410 103 1407 110 1410 b 250 1508 172 1437 215 1467 b 319 1701 296 1564 319 1633 b 270 1859 319 1757 303 1814 b 262 1882 265 1868 262 1875 b 276 1900 262 1890 266 1896 ', + }, + accidentalFlat: { + x_min: -21.78125, + x_max: 251.8125, + ha: 257, + o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 383 20 616 20 616 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 201 l -21 616 l -20 620 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ', + }, + accidentalNatural: { + x_min: 0, + x_max: 239.5625, + ha: 244, + o: 'm 10 460 b 20 462 13 462 14 462 b 39 449 28 462 35 458 l 40 446 l 40 326 b 40 205 40 259 40 205 b 127 227 40 205 80 215 b 220 249 196 244 213 249 b 227 247 224 249 225 248 b 238 237 231 245 235 241 l 239 233 l 239 -106 l 239 -448 l 238 -451 b 219 -463 234 -459 225 -463 b 198 -451 210 -463 202 -459 l 197 -448 l 197 -324 b 197 -201 197 -248 197 -201 b 110 -223 196 -201 157 -210 b 17 -245 42 -240 24 -245 b 10 -242 13 -245 13 -244 b 0 -233 6 -241 2 -237 l 0 -230 l 0 108 l 0 446 l 0 449 b 10 460 2 453 6 458 m 197 22 b 197 70 197 41 197 58 b 196 116 197 113 197 116 l 196 116 b 118 97 196 116 160 106 l 40 77 l 40 -18 b 40 -112 40 -69 40 -112 l 119 -93 l 197 -73 l 197 22 ', + }, + accidentalSharp: { + x_min: 0, + x_max: 323.9375, + ha: 331, + o: 'm 217 535 b 225 537 220 537 221 537 b 245 524 235 537 242 533 l 246 521 l 247 390 l 247 258 l 273 265 b 306 270 288 269 299 270 b 322 259 315 270 319 267 b 323 208 323 256 323 233 b 322 158 323 184 323 159 b 288 140 318 148 315 147 b 247 130 254 131 247 130 b 247 65 247 130 247 104 b 247 20 247 51 247 36 l 247 -88 l 273 -81 b 306 -76 289 -77 299 -76 b 318 -81 311 -76 315 -77 b 323 -123 323 -87 323 -86 l 323 -138 l 323 -154 b 318 -195 323 -191 323 -190 b 269 -210 314 -199 315 -199 b 249 -216 259 -213 250 -216 l 247 -216 l 247 -349 l 246 -483 l 245 -487 b 225 -499 242 -495 234 -499 b 206 -487 219 -499 210 -495 l 205 -483 l 205 -355 l 205 -227 l 204 -227 l 181 -233 l 138 -244 b 117 -249 127 -247 117 -249 b 115 -385 115 -249 115 -256 l 115 -523 l 114 -526 b 95 -538 110 -534 102 -538 b 74 -526 87 -538 78 -534 l 73 -523 l 73 -391 b 72 -260 73 -269 73 -260 b 72 -260 72 -260 72 -260 b 19 -273 61 -263 23 -273 b 0 -260 10 -273 4 -267 b 0 -209 0 -256 0 -256 l 0 -162 l 1 -158 b 61 -134 5 -148 5 -148 l 73 -131 l 73 -22 b 72 86 73 79 73 86 b 72 86 72 86 72 86 b 19 74 61 83 23 74 b 0 86 10 74 4 79 b 0 137 0 90 0 90 l 0 184 l 1 188 b 61 212 5 198 5 198 l 73 215 l 73 348 l 73 481 l 74 485 b 95 498 78 492 87 498 b 103 495 98 498 100 496 b 114 485 107 494 111 489 l 115 481 l 115 353 l 115 226 l 121 226 b 159 235 123 227 141 231 l 198 247 l 205 248 l 205 384 l 205 521 l 206 524 b 217 535 209 528 212 533 m 205 9 b 205 119 205 70 205 119 l 205 119 b 182 113 204 119 194 116 l 138 102 b 117 97 127 99 117 97 b 115 -12 115 97 115 91 l 115 -122 l 121 -120 b 159 -111 123 -119 141 -115 l 198 -101 l 205 -98 l 205 9 ', + }, + accidentalDoubleSharp: { + x_min: 0, + x_max: 367.5, + ha: 375, + o: 'm 0 124 l 0 187 l 61 187 l 122 187 l 122 138 l 122 91 l 153 61 l 183 30 l 213 61 l 243 91 l 243 138 l 243 187 l 306 187 l 367 187 l 367 124 l 367 61 l 321 61 l 274 61 l 243 30 l 213 0 l 243 -31 l 274 -62 l 321 -62 l 367 -62 l 367 -124 l 367 -188 l 306 -188 l 243 -188 l 243 -140 l 243 -93 l 213 -62 l 183 -31 l 153 -62 l 122 -93 l 122 -140 l 122 -188 l 61 -188 l 0 -188 l 0 -124 l 0 -62 l 46 -62 l 92 -62 l 123 -31 l 153 0 l 123 30 l 92 61 l 46 61 l 0 61 l 0 124 ', + }, + accidentalDoubleFlat: { + x_min: -21.78125, + x_max: 483.1875, + ha: 493, + o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 383 20 616 20 616 l 20 148 l 21 151 b 140 199 59 183 102 199 b 206 179 164 199 187 192 l 210 176 l 210 396 l 210 617 l 212 621 b 231 632 216 628 223 632 b 250 620 239 632 247 628 b 251 383 251 616 251 616 l 251 148 l 254 151 b 370 199 291 183 332 199 b 415 191 385 199 400 197 b 483 84 458 176 483 134 b 461 0 483 58 476 29 b 332 -142 439 -40 411 -72 l 255 -215 b 231 -229 240 -229 239 -229 b 216 -223 224 -229 220 -227 b 210 -158 210 -217 210 -223 b 210 -120 210 -148 210 -136 l 210 -29 l 205 -34 b 100 -142 182 -65 159 -88 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 201 l -21 616 l -20 620 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 m 341 131 b 328 133 337 133 332 133 b 322 133 326 133 323 133 b 257 87 296 129 273 113 l 251 80 l 251 -37 l 251 -156 l 255 -152 b 375 81 328 -72 375 20 l 375 83 b 341 131 375 113 367 126 ', + }, + accidentalParensLeft: { + x_min: -166.0625, + x_max: -25.859375, + ha: 0, + o: 'm -49 369 b -42 370 -46 369 -44 370 b -27 360 -36 370 -29 366 b -25 355 -27 359 -25 358 b -32 335 -25 351 -28 347 b -92 52 -66 248 -87 159 b -93 -1 -93 43 -93 20 b -92 -54 -93 -23 -93 -45 b -32 -337 -85 -162 -66 -251 b -25 -355 -27 -349 -25 -352 b -42 -371 -25 -365 -32 -371 b -61 -353 -50 -371 -51 -369 b -163 -63 -119 -262 -153 -165 b -166 -1 -166 -37 -166 -31 b -163 62 -166 30 -166 36 b -61 352 -153 163 -119 260 b -49 369 -54 365 -51 366 ', + }, + accidentalParensRight: { + x_min: 25.859375, + x_max: 164.6875, + ha: 168, + o: 'm 34 369 b 40 370 35 370 38 370 b 59 353 49 370 50 367 b 164 40 122 254 155 158 b 164 0 164 33 164 16 b 164 -40 164 -16 164 -34 b 59 -353 155 -158 122 -254 b 40 -371 53 -366 47 -371 b 34 -370 38 -371 36 -370 b 25 -358 28 -367 25 -363 b 31 -337 25 -352 27 -347 b 92 0 72 -234 92 -117 b 31 335 92 116 72 233 b 25 356 27 345 25 352 b 34 369 25 363 28 366 ', + }, + accidentalQuarterToneFlatStein: { + x_min: 0, + x_max: 272.21875, + ha: 278, + o: 'm 243 631 b 250 632 246 632 249 632 b 270 620 259 632 268 628 l 272 616 l 272 201 l 272 -212 l 270 -216 b 251 -229 268 -224 259 -229 b 227 -215 243 -229 240 -229 l 151 -142 b 32 -16 81 -80 53 -49 b 0 84 9 18 0 52 b 111 199 0 149 42 199 b 137 197 119 199 127 198 b 228 151 168 191 197 177 l 231 148 l 231 383 b 232 620 231 616 231 616 b 243 631 234 624 238 630 m 168 131 b 152 133 163 133 157 133 b 107 102 130 133 111 120 b 106 86 107 97 106 91 b 111 41 106 73 108 56 b 227 -152 125 -13 171 -90 l 231 -156 l 231 -37 l 231 80 l 225 87 b 168 131 210 111 190 126 ', + }, + accidentalThreeQuarterTonesFlatZimmermann: { + x_min: 0, + x_max: 607.0625, + ha: 619, + o: 'm 243 631 b 250 632 246 632 249 632 b 270 620 259 632 268 628 l 272 616 l 272 201 l 272 -212 l 270 -216 b 251 -229 268 -224 259 -229 b 227 -215 243 -229 240 -229 l 151 -142 b 32 -16 81 -80 53 -49 b 0 84 9 18 0 52 b 111 199 0 149 42 199 b 137 197 119 199 127 198 b 228 151 168 191 197 177 l 231 148 l 231 383 b 232 620 231 616 231 616 b 243 631 234 624 238 630 m 168 131 b 152 133 163 133 157 133 b 107 102 130 133 111 120 b 106 86 107 97 106 91 b 111 41 106 73 108 56 b 227 -152 125 -13 171 -90 l 231 -156 l 231 -37 l 231 80 l 225 87 b 168 131 210 111 190 126 m 347 631 b 353 632 348 632 351 632 b 374 620 363 632 371 628 b 375 383 375 616 375 616 l 375 148 l 377 151 b 492 199 415 183 454 199 b 537 191 507 199 522 197 b 607 84 582 176 607 134 b 583 0 607 58 598 29 b 455 -142 562 -40 533 -72 l 378 -215 b 355 -229 364 -229 362 -229 b 334 -216 345 -229 337 -224 l 333 -212 l 333 201 l 333 616 l 334 620 b 347 631 337 624 341 630 m 465 131 b 451 133 461 133 455 133 b 445 133 449 133 446 133 b 379 87 419 129 396 113 l 375 80 l 375 -37 l 375 -156 l 378 -152 b 499 81 451 -72 499 20 l 499 83 b 465 131 499 113 490 126 ', + }, + accidentalQuarterToneSharpStein: { + x_min: 0, + x_max: 193.28125, + ha: 197, + o: 'm 85 514 b 95 517 88 517 89 517 b 114 505 103 517 110 513 l 115 502 l 115 376 b 115 249 115 306 115 249 b 141 258 117 249 127 252 l 167 266 l 172 266 b 190 254 181 265 187 262 l 193 251 l 193 202 l 193 188 b 187 147 193 149 191 152 b 147 130 183 142 182 141 l 115 119 l 115 9 b 115 -99 115 -51 115 -99 b 141 -91 115 -99 127 -95 b 171 -81 166 -81 167 -81 l 171 -81 b 191 -94 181 -81 189 -87 b 193 -142 191 -97 193 -120 b 191 -195 193 -167 191 -194 b 125 -227 187 -205 187 -204 l 115 -230 l 115 -366 l 115 -503 l 114 -506 b 95 -519 110 -514 102 -519 b 74 -506 87 -519 78 -514 l 73 -503 l 73 -374 b 73 -245 73 -260 73 -245 b 73 -245 73 -245 73 -245 b 55 -252 72 -245 63 -249 l 32 -260 b 19 -263 27 -262 23 -263 b 4 -256 13 -263 8 -260 b 0 -215 0 -251 0 -254 b 0 -199 0 -210 0 -206 l 0 -152 l 1 -149 b 8 -140 2 -145 5 -141 b 42 -127 9 -140 24 -133 l 73 -116 l 73 -5 b 73 23 73 4 73 15 b 73 105 73 70 73 105 b 49 97 73 105 61 101 b 17 88 32 91 23 88 b 4 95 10 88 8 91 b 0 137 0 101 0 98 b 0 151 0 141 0 145 l 0 199 l 1 202 b 43 224 5 212 5 212 l 73 234 l 73 367 l 73 502 l 74 505 b 85 514 77 509 81 513 ', + }, + accidentalThreeQuarterTonesSharpStein: { + x_min: -1.359375, + x_max: 455.96875, + ha: 465, + o: 'm 352 541 b 357 542 353 542 355 542 b 377 530 364 542 372 537 l 378 526 l 378 394 l 379 262 l 404 266 b 436 270 420 269 430 270 b 450 265 443 270 446 269 b 455 220 455 259 455 260 l 455 208 l 455 161 l 454 156 b 411 140 449 147 447 147 b 378 133 393 137 379 134 b 378 68 378 133 378 106 b 378 22 378 54 378 38 l 379 -87 l 404 -83 b 436 -79 420 -80 430 -79 b 450 -84 443 -79 446 -80 b 455 -129 455 -90 455 -88 l 455 -141 l 455 -188 l 454 -192 b 413 -209 449 -202 447 -202 b 382 -215 398 -212 383 -215 l 378 -215 l 378 -345 l 378 -380 b 375 -485 378 -484 378 -480 b 357 -494 371 -491 364 -494 b 340 -485 351 -494 344 -491 b 336 -383 337 -480 336 -484 l 336 -349 l 336 -223 l 334 -223 b 291 -231 334 -223 314 -227 l 247 -240 l 247 -371 l 246 -503 l 245 -506 b 225 -519 242 -514 234 -519 b 206 -506 219 -519 210 -514 l 205 -503 l 205 -376 l 205 -248 l 160 -256 l 115 -265 l 115 -396 l 115 -527 l 114 -531 b 95 -544 110 -539 102 -544 b 76 -531 87 -544 78 -539 l 73 -527 l 73 -399 b 73 -273 73 -330 73 -273 b 49 -277 73 -273 61 -274 b 17 -281 32 -280 24 -281 b 4 -276 10 -281 8 -280 b -1 -234 0 -269 -1 -272 b 0 -219 -1 -229 0 -224 l 0 -170 l 1 -167 b 10 -158 2 -163 6 -159 b 49 -149 13 -156 16 -155 l 73 -145 l 73 -34 b 73 76 73 26 73 76 b 49 72 73 76 61 74 b 17 68 32 69 24 68 b 4 73 10 68 8 69 b -1 115 0 80 -1 77 b 0 130 -1 120 0 124 l 0 179 l 1 181 b 10 191 2 186 6 190 b 49 199 13 192 16 194 l 73 204 l 73 338 b 73 374 73 352 73 365 b 77 483 73 484 73 477 b 95 492 81 489 88 492 b 111 483 100 492 107 489 b 115 378 115 477 115 483 l 115 342 b 117 212 115 223 115 212 b 204 229 117 212 200 227 l 205 229 l 205 365 l 205 502 l 206 505 b 225 517 210 513 219 517 b 245 505 234 517 242 513 l 246 502 l 247 369 l 247 237 l 249 237 b 336 254 253 238 336 254 b 337 390 336 254 337 302 l 337 526 l 338 530 b 352 541 341 535 347 539 m 336 15 b 336 126 336 102 336 126 l 336 126 b 291 117 336 126 315 122 l 247 109 l 247 -1 l 247 -112 l 249 -112 b 336 -95 253 -111 336 -95 b 336 15 336 -95 336 -56 m 205 -120 b 205 -55 205 -120 205 -93 b 205 -9 205 -41 205 -24 l 205 101 l 160 93 l 115 84 l 115 -26 b 115 -83 115 -49 115 -69 b 117 -137 115 -133 115 -137 b 205 -120 118 -137 204 -120 ', + }, + accidentalBuyukMucennebFlat: { + x_min: -171.5, + x_max: 251.8125, + ha: 257, + o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 553 20 616 20 614 b 20 491 20 503 20 491 l 20 491 b 153 535 47 501 149 535 b 174 514 167 535 174 524 b 164 496 174 508 171 501 b 92 470 164 495 132 484 l 20 445 l 20 390 b 20 363 20 378 20 370 b 20 333 20 340 20 333 l 20 333 b 153 377 47 344 149 377 b 174 356 167 377 174 367 b 164 338 174 349 171 342 b 92 312 164 338 132 326 l 20 288 l 20 219 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 30 -21 -212 -21 -212 b -21 273 -21 163 -21 273 b -84 252 -21 273 -50 263 b -152 230 -133 234 -145 230 b -157 231 -155 230 -156 231 b -171 252 -166 234 -171 244 b -160 270 -171 259 -167 266 b -27 316 -159 270 -93 294 l -21 319 l -21 374 b -21 431 -21 406 -21 431 b -84 409 -21 431 -50 421 b -152 388 -133 392 -145 388 b -157 390 -155 388 -156 388 b -171 409 -166 392 -171 401 b -160 428 -171 417 -167 424 b -27 474 -159 428 -93 451 l -21 476 l -21 546 b -20 620 -21 614 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ', + }, + accidentalBakiyeFlat: { + x_min: -176.9375, + x_max: 251.8125, + ha: 257, + o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 503 20 616 20 614 b 20 391 20 442 20 391 b 84 424 20 391 49 406 l 147 456 l 152 456 b 153 456 153 456 153 456 b 175 435 166 456 175 446 b 172 427 175 433 174 430 b 92 380 170 420 172 421 l 20 342 l 20 245 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 54 -21 -212 -21 -212 b -21 322 -21 201 -21 322 b -85 290 -21 322 -50 308 l -148 256 l -153 256 b -155 256 -155 256 -155 256 b -176 277 -167 256 -176 266 b -174 285 -176 280 -175 283 b -93 333 -171 294 -174 292 l -21 370 l -21 494 b -20 620 -21 616 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 ', + }, + accidentalKomaSharp: { + x_min: -1.359375, + x_max: 455.96875, + ha: 465, + o: 'm 352 541 b 357 542 353 542 355 542 b 377 530 364 542 372 537 l 378 526 l 378 394 l 379 262 l 404 266 b 436 270 420 269 430 270 b 450 265 443 270 446 269 b 455 220 455 259 455 260 l 455 208 l 455 161 l 454 156 b 411 140 449 147 447 147 b 378 133 393 137 379 134 b 378 68 378 133 378 106 b 378 22 378 54 378 38 l 379 -87 l 404 -83 b 436 -79 420 -80 430 -79 b 450 -84 443 -79 446 -80 b 455 -129 455 -90 455 -88 l 455 -141 l 455 -188 l 454 -192 b 413 -209 449 -202 447 -202 b 382 -215 398 -212 383 -215 l 378 -215 l 378 -345 l 378 -380 b 375 -485 378 -484 378 -480 b 357 -494 371 -491 364 -494 b 340 -485 351 -494 344 -491 b 336 -383 337 -480 336 -484 l 336 -349 l 336 -223 l 334 -223 b 291 -231 334 -223 314 -227 l 247 -240 l 247 -371 l 246 -503 l 245 -506 b 225 -519 242 -514 234 -519 b 206 -506 219 -519 210 -514 l 205 -503 l 205 -376 l 205 -248 l 160 -256 l 115 -265 l 115 -396 l 115 -527 l 114 -531 b 95 -544 110 -539 102 -544 b 76 -531 87 -544 78 -539 l 73 -527 l 73 -399 b 73 -273 73 -330 73 -273 b 49 -277 73 -273 61 -274 b 17 -281 32 -280 24 -281 b 4 -276 10 -281 8 -280 b -1 -234 0 -269 -1 -272 b 0 -219 -1 -229 0 -224 l 0 -170 l 1 -167 b 10 -158 2 -163 6 -159 b 49 -149 13 -156 16 -155 l 73 -145 l 73 -34 b 73 76 73 26 73 76 b 49 72 73 76 61 74 b 17 68 32 69 24 68 b 4 73 10 68 8 69 b -1 115 0 80 -1 77 b 0 130 -1 120 0 124 l 0 179 l 1 181 b 10 191 2 186 6 190 b 49 199 13 192 16 194 l 73 204 l 73 338 b 73 374 73 352 73 365 b 77 483 73 484 73 477 b 95 492 81 489 88 492 b 111 483 100 492 107 489 b 115 378 115 477 115 483 l 115 342 b 117 212 115 223 115 212 b 204 229 117 212 200 227 l 205 229 l 205 365 l 205 502 l 206 505 b 225 517 210 513 219 517 b 245 505 234 517 242 513 l 246 502 l 247 369 l 247 237 l 249 237 b 336 254 253 238 336 254 b 337 390 336 254 337 302 l 337 526 l 338 530 b 352 541 341 535 347 539 m 336 15 b 336 126 336 102 336 126 l 336 126 b 291 117 336 126 315 122 l 247 109 l 247 -1 l 247 -112 l 249 -112 b 336 -95 253 -111 336 -95 b 336 15 336 -95 336 -56 m 205 -120 b 205 -55 205 -120 205 -93 b 205 -9 205 -41 205 -24 l 205 101 l 160 93 l 115 84 l 115 -26 b 115 -83 115 -49 115 -69 b 117 -137 115 -133 115 -137 b 205 -120 118 -137 204 -120 ', + }, + accidentalKucukMucennebSharp: { + x_min: -1.359375, + x_max: 255.890625, + ha: 261, + o: 'm 118 514 b 127 517 121 517 122 517 b 147 505 136 517 142 513 l 148 502 l 148 403 b 148 306 148 351 148 306 b 174 315 149 306 160 310 l 200 324 l 205 323 b 223 312 213 323 220 319 l 225 308 l 225 260 b 225 245 225 255 225 249 b 220 204 225 208 224 209 b 179 188 216 199 215 199 l 148 177 l 148 124 l 148 70 l 189 84 b 236 98 219 94 230 98 b 247 94 240 98 243 97 b 255 52 254 88 255 87 b 255 33 255 47 255 40 l 254 -12 l 253 -15 b 249 -22 253 -18 250 -20 l 245 -24 l 196 -41 l 148 -58 l 148 -108 b 148 -158 148 -136 148 -158 b 174 -148 148 -158 160 -154 b 204 -140 198 -140 200 -140 l 204 -140 b 224 -152 213 -140 221 -145 b 225 -201 224 -155 225 -177 b 224 -254 225 -226 224 -251 b 157 -284 220 -262 220 -262 l 148 -288 l 148 -395 l 148 -503 l 147 -506 b 127 -519 142 -514 134 -519 b 107 -506 119 -519 111 -514 l 106 -503 l 106 -403 b 106 -303 106 -316 106 -303 b 104 -303 104 -303 104 -303 b 88 -310 104 -303 96 -306 l 63 -319 b 51 -322 59 -320 55 -322 b 36 -315 46 -322 40 -319 b 31 -273 32 -309 31 -312 b 31 -258 31 -269 31 -263 l 31 -210 l 34 -206 b 40 -198 35 -204 38 -199 b 74 -186 42 -197 57 -191 l 106 -173 l 106 -123 b 106 -97 106 -112 106 -104 b 106 -72 106 -76 106 -72 b 104 -72 106 -72 106 -72 b 20 -99 89 -79 23 -99 b 0 -84 10 -99 2 -93 b -1 -37 0 -81 -1 -59 b 0 11 -1 -15 0 9 b 58 40 4 22 2 22 l 106 56 l 106 109 b 106 123 106 115 106 119 b 106 162 106 147 106 162 b 81 155 106 162 93 159 b 50 147 65 149 55 147 b 36 152 43 147 40 148 b 31 194 32 158 31 156 b 31 209 31 198 31 204 l 31 256 l 34 260 b 76 281 38 269 38 269 l 106 292 l 106 396 l 106 502 l 107 505 b 118 514 110 509 114 513 ', + }, + articAccentAbove: { + x_min: -348.4375, + x_max: 24.5, + ha: 25, + o: 'm -330 155 b -322 156 -329 156 -326 156 b -315 156 -319 156 -317 156 b -298 147 -311 155 -308 154 b -19 30 -224 98 -122 55 l 2 26 b 24 -1 17 22 24 13 b 2 -27 24 -15 17 -23 l -19 -31 b -298 -148 -122 -56 -224 -99 b -322 -158 -313 -158 -315 -158 b -348 -131 -338 -158 -348 -145 b -344 -117 -348 -127 -347 -122 b -328 -104 -341 -112 -338 -111 b -127 -8 -269 -65 -202 -33 b -106 0 -115 -4 -106 -1 b -127 6 -106 0 -115 2 b -328 102 -202 31 -269 63 b -344 116 -338 109 -341 111 b -348 130 -347 120 -348 124 b -330 155 -348 141 -341 152 ', + }, + articAccentBelow: { + x_min: -348.4375, + x_max: 24.5, + ha: 25, + o: 'm -330 155 b -322 156 -329 156 -326 156 b -315 156 -319 156 -317 156 b -298 147 -311 155 -308 154 b -19 30 -224 98 -122 55 l 2 26 b 24 -1 17 22 24 13 b 2 -27 24 -15 17 -23 l -19 -31 b -298 -148 -122 -56 -224 -99 b -322 -158 -313 -158 -315 -158 b -348 -131 -338 -158 -348 -145 b -344 -117 -348 -127 -347 -122 b -328 -104 -341 -112 -338 -111 b -127 -8 -269 -65 -202 -33 b -106 0 -115 -4 -106 -1 b -127 6 -106 0 -115 2 b -328 102 -202 31 -269 63 b -344 116 -338 109 -341 111 b -348 130 -347 120 -348 124 b -330 155 -348 141 -341 152 ', + }, + articTenutoAbove: { + x_min: 0, + x_max: 318.5, + ha: 325, + o: 'm 20 376 b 167 377 23 377 96 377 b 296 376 231 377 294 377 b 318 347 311 371 318 359 b 296 316 318 333 311 320 b 159 315 294 315 227 315 b 21 316 91 315 24 315 b 0 345 6 320 0 333 b 20 376 0 359 6 371 ', + }, + articTenutoBelow: { + x_min: 0, + x_max: 318.5, + ha: 325, + o: 'm 20 376 b 167 377 23 377 96 377 b 296 376 231 377 294 377 b 318 347 311 371 318 359 b 296 316 318 333 311 320 b 159 315 294 315 227 315 b 21 316 91 315 24 315 b 0 345 6 320 0 333 b 20 376 0 359 6 371 ', + }, + articStaccatoAbove: { + x_min: 0, + x_max: 133.390625, + ha: 136, + o: 'm 54 66 b 65 68 58 68 61 68 b 122 37 88 68 110 56 b 133 -1 130 26 133 12 b 104 -58 133 -23 123 -44 b 66 -69 92 -65 78 -69 b 10 -38 44 -69 23 -58 b 0 -1 2 -27 0 -13 b 54 66 0 30 20 61 ', + }, + articStaccatoBelow: { + x_min: 0, + x_max: 133.390625, + ha: 136, + o: 'm 54 66 b 65 68 58 68 61 68 b 122 37 88 68 110 56 b 133 -1 130 26 133 12 b 104 -58 133 -23 123 -44 b 66 -69 92 -65 78 -69 b 10 -38 44 -69 23 -58 b 0 -1 2 -27 0 -13 b 54 66 0 30 20 61 ', + }, + articStaccatissimoAbove: { + x_min: -73.5, + x_max: 72.140625, + ha: 74, + o: 'm -72 252 l -73 254 l 0 254 l 72 254 l 70 252 b 0 -1 70 248 0 -1 b -72 252 -1 -1 -72 248 ', + }, + articStaccatissimoBelow: { + x_min: -73.5, + x_max: 72.140625, + ha: 74, + o: 'm -72 252 l -73 254 l 0 254 l 72 254 l 70 252 b 0 -1 70 248 0 -1 b -72 252 -1 -1 -72 248 ', + }, + articMarcatoAbove: { + x_min: -149.71875, + x_max: 148.359375, + ha: 151, + o: 'm -8 -1 b -1 0 -5 -1 -4 0 b 16 -11 5 0 13 -4 b 83 -186 17 -12 47 -90 l 148 -358 l 148 -363 b 127 -385 148 -376 138 -385 b 112 -378 122 -385 118 -383 b 54 -226 110 -374 114 -385 b 0 -81 24 -147 0 -81 b -55 -226 -1 -81 -25 -147 b -114 -378 -115 -385 -111 -374 b -129 -385 -119 -383 -123 -385 b -149 -363 -140 -385 -149 -376 l -149 -358 l -84 -186 b -19 -11 -49 -90 -19 -12 b -8 -1 -17 -8 -12 -4 ', + }, + articMarcatoBelow: { + x_min: -149.71875, + x_max: 148.359375, + ha: 151, + o: 'm -8 -1 b -1 0 -5 -1 -4 0 b 16 -11 5 0 13 -4 b 83 -186 17 -12 47 -90 l 148 -358 l 148 -363 b 127 -385 148 -376 138 -385 b 112 -378 122 -385 118 -383 b 54 -226 110 -374 114 -385 b 0 -81 24 -147 0 -81 b -55 -226 -1 -81 -25 -147 b -114 -378 -115 -385 -111 -374 b -129 -385 -119 -383 -123 -385 b -149 -363 -140 -385 -149 -376 l -149 -358 l -84 -186 b -19 -11 -49 -90 -19 -12 b -8 -1 -17 -8 -12 -4 ', + }, + fermataAbove: { + x_min: -442.359375, + x_max: 441, + ha: 450, + o: 'm -31 487 b -1 488 -21 488 -10 488 b 434 104 216 488 397 330 b 441 27 438 79 441 47 b 439 12 441 20 439 15 b 419 0 435 4 427 0 b 404 5 413 0 408 1 b 398 30 400 11 398 13 b 0 351 390 213 213 351 b -59 348 -20 351 -39 349 b -400 30 -251 324 -393 191 b -405 5 -400 13 -401 11 b -420 0 -409 1 -415 0 b -441 12 -428 0 -436 4 b -442 27 -441 15 -442 20 b -435 104 -442 47 -439 79 b -31 487 -401 316 -235 474 m -13 131 b -1 133 -9 133 -5 133 b 51 105 19 133 39 123 b 61 70 58 95 61 83 b 51 34 61 58 58 45 b -1 6 39 16 19 6 b -46 27 -17 6 -34 13 b -62 69 -57 38 -62 54 b -13 131 -62 98 -44 124 ', + }, + fermataBelow: { + x_min: -441, + x_max: 439.640625, + ha: 449, + o: 'm -428 -2 b -421 0 -427 -1 -424 0 b -406 -6 -416 0 -409 -2 b -400 -31 -401 -12 -400 -15 b -1 -352 -392 -215 -215 -352 b 58 -349 19 -352 38 -351 b 398 -31 250 -326 392 -192 b 404 -6 398 -15 400 -12 b 419 -1 408 -2 413 -1 b 439 -13 427 -1 435 -5 b 439 -29 439 -16 439 -22 b 434 -105 439 -48 438 -80 b 0 -489 397 -333 213 -489 b -68 -484 -23 -489 -44 -488 b -441 -36 -280 -452 -436 -263 b -441 -30 -441 -34 -441 -31 b -428 -2 -441 -11 -439 -5 m -13 -9 b -1 -8 -9 -8 -5 -8 b 50 -36 19 -8 39 -19 b 61 -72 57 -47 61 -59 b 50 -106 61 -84 57 -97 b -1 -134 39 -124 19 -134 b -46 -115 -17 -134 -34 -129 b -62 -72 -57 -102 -62 -87 b -13 -9 -62 -44 -44 -16 ', + }, + breathMarkComma: { + x_min: -1.359375, + x_max: 193.28125, + ha: 197, + o: 'm 78 233 b 87 233 81 233 84 233 b 187 140 132 233 174 195 b 193 102 190 127 193 115 b 43 -113 193 22 136 -62 b 27 -119 36 -116 31 -119 b 19 -108 21 -119 19 -115 b 29 -97 19 -102 20 -101 b 102 13 73 -72 102 -27 b 92 51 102 26 98 40 l 91 54 l 84 54 b 8 104 53 54 21 74 b -1 142 1 116 -1 130 b 78 233 -1 187 31 227 ', + }, + breathMarkUpbow: { + x_min: -170.140625, + x_max: 168.78125, + ha: 172, + o: 'm -160 567 b -122 567 -159 567 -149 567 l -87 567 l -84 566 b -74 553 -78 563 -77 560 b -20 366 -73 551 -49 466 b 31 186 8 267 31 186 b 85 371 31 186 55 269 b 140 559 114 473 138 557 b 153 567 141 564 148 567 b 168 559 159 567 166 564 b 168 555 168 557 168 557 b 92 281 168 548 159 513 b 14 13 50 134 14 13 b 0 0 14 6 6 0 b -17 15 -8 0 -17 8 b -93 283 -17 15 -51 136 b -170 552 -166 533 -170 548 b -170 553 -170 552 -170 552 b -160 567 -170 560 -167 564 ', + }, + caesura: { + x_min: 0, + x_max: 622.03125, + ha: 635, + o: 'm 398 417 b 406 419 401 419 404 419 b 427 398 417 419 427 409 b 427 391 427 395 427 392 b 34 -274 424 385 38 -272 b 20 -280 29 -278 25 -280 b 0 -259 9 -280 0 -270 b 0 -252 0 -256 0 -254 b 393 413 2 -247 389 410 b 398 417 394 415 397 416 m 592 417 b 600 419 594 419 597 419 b 622 398 611 419 622 409 b 620 391 622 395 620 392 b 227 -274 617 385 231 -272 b 213 -280 223 -278 219 -280 b 193 -259 202 -280 193 -270 b 194 -252 193 -256 193 -254 b 586 413 196 -247 582 410 b 592 417 588 415 590 416 ', + }, + caesuraCurved: { + x_min: 0, + x_max: 503.609375, + ha: 514, + o: 'm 274 430 b 277 430 276 430 277 430 b 310 394 296 430 310 415 b 308 383 310 391 308 387 b 306 367 307 381 307 374 b 236 120 298 305 272 210 b 40 -273 189 -5 125 -134 b 20 -287 35 -283 27 -287 b 5 -281 14 -287 9 -285 b 0 -267 1 -277 0 -273 b 9 -242 0 -262 2 -255 b 246 395 137 -12 232 242 b 274 430 249 416 257 427 m 468 430 b 472 430 469 430 470 430 b 503 394 490 430 503 415 b 502 383 503 391 503 387 b 499 367 502 381 500 374 b 431 120 491 305 465 210 b 234 -273 382 -5 318 -134 b 213 -287 228 -283 220 -287 b 198 -281 208 -287 202 -285 b 193 -267 194 -277 193 -273 b 202 -242 193 -262 196 -255 b 439 395 330 -12 426 242 b 468 430 442 416 451 427 ', + }, + restMaxima: { + x_min: 0, + x_max: 464.140625, + ha: 474, + o: 'm 0 0 l 0 347 l 76 347 l 153 347 l 153 0 l 153 -348 l 76 -348 l 0 -348 l 0 0 m 308 -1 l 308 347 l 386 347 l 464 347 l 464 -1 l 464 -348 l 386 -348 l 308 -348 l 308 -1 ', + }, + restDoubleWhole: { + x_min: 0, + x_max: 386.5625, + ha: 394, + o: 'm 0 173 l 0 347 l 193 347 l 386 347 l 386 173 l 386 0 l 193 0 l 0 0 l 0 173 ', + }, + restWhole: { + x_min: 0, + x_max: 447.8125, + ha: 457, + o: 'm 0 -87 l 0 0 l 223 0 l 447 0 l 447 -87 l 447 -174 l 223 -174 l 0 -174 l 0 -87 ', + }, + restHalf: { + x_min: 0, + x_max: 447.8125, + ha: 457, + o: 'm 0 86 l 0 173 l 223 173 l 447 173 l 447 86 l 447 0 l 223 0 l 0 0 l 0 86 ', + }, + restQuarter: { + x_min: 0, + x_max: 300.8125, + ha: 307, + o: 'm 49 505 b 53 506 50 505 51 506 b 70 496 58 506 62 503 b 81 485 73 492 78 488 l 96 473 l 111 459 l 122 449 l 134 438 l 182 396 l 255 330 b 292 291 292 298 292 298 l 292 290 l 292 284 l 283 270 b 209 36 234 197 209 113 b 288 -170 209 -44 235 -119 b 299 -184 295 -179 299 -181 b 300 -191 300 -187 300 -188 b 285 -206 300 -199 294 -206 b 280 -206 283 -206 281 -206 b 247 -201 270 -202 259 -201 b 176 -222 223 -201 197 -208 b 114 -340 136 -249 114 -292 b 172 -471 114 -384 134 -433 b 185 -492 182 -481 185 -487 b 181 -502 185 -496 183 -499 b 171 -508 176 -505 174 -508 b 152 -498 166 -508 160 -503 b 0 -284 65 -428 12 -352 b 0 -260 0 -278 0 -270 b 1 -238 0 -252 0 -242 b 148 -140 16 -177 73 -140 b 209 -148 167 -140 189 -142 b 215 -149 212 -148 215 -149 b 215 -149 215 -149 215 -149 l 215 -149 b 201 -136 215 -148 209 -142 l 157 -97 l 96 -41 b 17 34 21 24 17 29 b 17 37 17 36 17 36 b 17 38 17 37 17 38 b 25 56 17 44 17 44 b 110 298 81 131 110 219 b 46 474 110 367 88 431 b 38 491 40 480 38 487 b 49 505 38 498 42 502 ', + }, + rest8th: { + x_min: 0, + x_max: 349.8125, + ha: 357, + o: 'm 88 302 b 103 303 93 302 98 303 b 202 224 149 303 191 270 b 205 199 204 216 205 208 b 178 129 205 173 196 147 l 175 126 l 182 127 b 307 249 236 142 284 190 b 313 259 308 254 311 258 b 329 267 317 265 323 267 b 349 247 340 267 349 259 b 201 -263 349 242 204 -258 b 182 -273 197 -270 190 -273 b 163 -260 174 -273 166 -269 b 161 -256 161 -259 161 -258 b 217 -59 161 -248 170 -220 b 272 129 247 43 272 127 b 272 129 272 129 272 129 b 264 122 272 129 268 126 b 140 80 227 94 183 80 b 36 115 102 80 65 91 b 0 194 10 136 0 165 b 88 302 0 244 32 292 ', + }, + rest16th: { + x_min: 0, + x_max: 450.53125, + ha: 460, + o: 'm 189 302 b 204 303 193 302 198 303 b 303 224 250 303 292 270 b 306 199 304 216 306 208 b 279 129 306 173 296 147 l 276 126 l 281 127 b 408 249 337 142 385 190 b 412 259 409 254 412 258 b 430 267 417 265 423 267 b 450 247 441 267 450 259 b 200 -605 450 242 204 -599 b 182 -616 197 -612 190 -616 b 163 -602 174 -616 166 -610 b 161 -598 161 -601 161 -601 b 217 -402 161 -589 170 -562 b 272 -213 247 -298 272 -213 b 272 -213 272 -213 272 -213 b 264 -219 272 -213 268 -216 b 140 -262 227 -247 182 -262 b 36 -226 102 -262 65 -249 b 0 -145 12 -206 0 -176 b 17 -84 0 -124 5 -104 b 103 -38 38 -54 70 -38 b 191 -91 137 -38 172 -56 b 205 -141 201 -106 205 -124 b 178 -212 205 -167 196 -194 l 175 -215 l 182 -213 b 307 -93 236 -198 284 -151 b 372 129 308 -88 372 127 b 372 129 372 129 372 129 b 364 122 372 129 368 126 b 240 80 328 94 283 80 b 137 115 202 80 166 91 b 99 194 111 136 99 165 b 189 302 99 244 133 292 ', + }, + rest32nd: { + x_min: 0, + x_max: 551.25, + ha: 563, + o: 'm 289 644 b 304 645 294 645 299 645 b 404 566 349 645 392 613 b 406 541 405 557 406 549 b 379 471 406 514 397 489 l 377 467 l 382 470 b 509 591 438 485 485 531 b 513 601 510 595 513 599 b 530 609 518 607 524 609 b 551 588 540 609 551 602 b 200 -605 551 584 204 -599 b 182 -616 197 -612 190 -616 b 163 -602 174 -616 166 -610 b 161 -598 161 -601 161 -601 b 217 -402 161 -589 170 -562 b 272 -213 247 -298 272 -213 b 272 -213 272 -213 272 -213 b 264 -219 272 -213 268 -216 b 140 -262 227 -247 182 -262 b 36 -226 102 -262 65 -249 b 0 -145 12 -206 0 -176 b 17 -84 0 -124 5 -104 b 103 -38 38 -54 70 -38 b 191 -91 137 -38 172 -56 b 205 -141 201 -106 205 -124 b 178 -212 205 -167 196 -194 l 175 -215 l 182 -213 b 307 -93 236 -198 284 -151 b 372 129 308 -88 372 127 b 372 129 372 129 372 129 b 364 122 372 129 368 126 b 240 80 328 94 283 80 b 137 115 202 80 166 91 b 99 195 112 136 99 165 b 118 256 99 217 106 238 b 204 303 138 287 171 303 b 292 249 238 303 273 285 b 306 199 302 234 306 217 b 279 129 306 173 296 148 l 276 126 l 281 127 b 408 248 336 142 385 190 b 473 470 409 254 473 469 b 473 470 473 470 473 470 b 465 464 473 470 469 467 b 341 421 428 435 383 421 b 236 458 303 421 266 433 b 200 537 212 478 200 508 b 289 644 200 585 234 635 ', + }, + rest64th: { + x_min: -1.359375, + x_max: 651.96875, + ha: 665, + o: 'm 389 644 b 405 645 394 645 400 645 b 504 566 450 645 492 613 b 507 541 506 557 507 549 b 480 471 507 514 498 489 l 477 467 l 483 470 b 609 591 539 485 586 531 b 613 601 611 595 613 599 b 631 609 619 607 624 609 b 651 588 641 609 651 602 b 200 -946 651 584 204 -941 b 182 -957 197 -953 190 -957 b 163 -945 174 -957 166 -953 b 161 -939 161 -942 161 -942 b 217 -743 161 -931 170 -904 b 272 -555 247 -639 272 -555 b 272 -555 272 -555 272 -555 b 264 -560 272 -555 268 -557 b 140 -603 227 -589 182 -603 b 36 -567 102 -603 65 -592 b -1 -487 12 -548 -1 -517 b 17 -427 -1 -466 5 -445 b 103 -380 38 -395 70 -380 b 191 -433 137 -380 172 -398 b 205 -484 201 -448 205 -466 b 178 -553 205 -509 196 -535 l 175 -557 l 182 -555 b 307 -435 236 -539 284 -494 b 372 -213 308 -430 372 -215 b 372 -213 372 -213 372 -213 b 364 -219 372 -213 368 -216 b 240 -262 328 -247 283 -262 b 137 -226 202 -262 166 -249 b 99 -145 112 -206 99 -176 b 118 -84 99 -124 106 -104 b 204 -38 138 -54 171 -38 b 292 -91 238 -38 273 -56 b 306 -141 302 -106 306 -124 b 279 -212 306 -167 296 -194 l 276 -215 l 281 -213 b 408 -93 336 -198 385 -151 b 473 129 409 -88 473 127 b 473 129 473 129 473 129 b 465 122 473 129 469 126 b 341 80 428 94 383 80 b 236 115 303 80 266 91 b 200 195 213 136 200 165 b 217 256 200 217 206 238 b 304 303 239 287 272 303 b 393 249 338 303 374 285 b 406 199 402 234 406 217 b 379 129 406 173 397 148 l 377 126 l 382 127 b 509 248 436 142 485 190 b 574 470 510 254 574 469 b 574 470 574 470 574 470 b 566 464 574 470 570 467 b 442 421 529 435 484 421 b 337 458 404 421 367 433 b 300 537 313 478 300 508 b 389 644 300 585 334 635 ', + }, + rest128th: { + x_min: -1.359375, + x_max: 752.703125, + ha: 768, + o: 'm 490 985 b 504 986 495 986 500 986 b 604 907 551 986 593 954 b 607 884 607 900 607 892 b 581 813 607 857 597 831 l 578 810 l 583 811 b 710 932 638 827 687 873 b 714 943 711 936 713 942 b 730 952 720 949 725 952 b 752 931 741 952 752 943 b 200 -946 752 927 204 -941 b 182 -957 197 -953 190 -957 b 163 -945 174 -957 166 -953 b 161 -939 161 -942 161 -942 b 217 -743 161 -931 170 -904 b 272 -555 247 -639 272 -555 b 272 -555 272 -555 272 -555 b 264 -560 272 -555 268 -557 b 140 -603 227 -589 182 -603 b 36 -567 102 -603 65 -592 b -1 -487 12 -548 -1 -517 b 17 -427 -1 -466 5 -445 b 103 -380 38 -395 70 -380 b 191 -433 137 -380 172 -398 b 205 -484 201 -448 205 -466 b 178 -553 205 -509 196 -535 l 175 -557 l 182 -555 b 307 -435 236 -539 284 -494 b 372 -213 308 -430 372 -215 b 372 -213 372 -213 372 -213 b 364 -219 372 -213 368 -216 b 240 -262 328 -247 283 -262 b 137 -226 202 -262 166 -249 b 99 -145 112 -206 99 -176 b 118 -84 99 -124 106 -104 b 204 -38 138 -54 171 -38 b 292 -91 238 -38 273 -56 b 306 -141 302 -106 306 -124 b 279 -212 306 -167 296 -194 l 276 -215 l 281 -213 b 408 -93 336 -198 385 -151 b 473 129 409 -88 473 127 b 473 129 473 129 473 129 b 465 122 473 129 469 126 b 341 80 428 94 383 80 b 236 115 303 80 266 91 b 200 195 213 136 200 165 b 217 256 200 217 206 238 b 304 303 239 287 272 303 b 393 249 338 303 374 285 b 406 199 402 234 406 217 b 379 129 406 173 397 148 l 377 126 l 382 127 b 509 248 436 142 485 190 b 574 470 510 254 574 469 b 574 470 574 470 574 470 b 566 464 574 470 570 467 b 442 421 529 435 484 421 b 337 458 404 421 367 433 b 300 538 314 477 300 508 b 318 598 300 559 306 580 b 404 645 340 630 372 645 b 494 592 439 645 475 627 b 507 541 502 577 507 559 b 480 471 507 516 498 489 l 477 467 l 483 470 b 608 589 537 485 586 531 b 675 811 611 595 675 810 b 675 811 675 811 675 811 b 666 806 675 811 671 809 b 543 763 628 777 585 763 b 438 799 504 763 468 775 b 401 878 412 820 401 849 b 490 985 401 928 434 977 ', + }, + dynamicPiano: { + x_min: -53.078125, + x_max: 513.140625, + ha: 485, + o: 'm 185 383 b 196 384 187 383 191 384 b 277 334 230 384 259 365 b 288 301 281 324 288 306 b 288 297 288 298 288 297 b 294 302 289 297 291 299 b 394 370 323 338 367 367 b 404 371 398 370 401 371 b 510 272 453 371 498 328 b 513 237 513 262 513 251 b 507 172 513 217 511 192 b 326 -34 487 59 412 -26 b 314 -36 322 -36 318 -36 b 274 -24 298 -36 283 -31 l 265 -16 b 224 44 246 -1 232 20 b 223 49 224 47 223 49 b 223 49 223 49 223 49 b 149 -197 221 48 149 -194 b 149 -198 149 -197 149 -198 b 170 -210 149 -202 155 -205 b 187 -215 174 -210 175 -212 b 204 -231 201 -219 204 -222 b 197 -245 204 -240 202 -242 l 194 -248 l 76 -248 l -42 -248 l -46 -245 b -53 -231 -51 -242 -53 -240 b -35 -215 -53 -222 -49 -217 b -13 -210 -21 -212 -20 -212 b -6 -208 -10 -209 -8 -208 b 0 -206 -6 -208 -2 -206 b 25 -188 13 -201 21 -195 b 163 280 28 -183 163 276 b 166 291 163 283 164 287 b 167 302 167 295 167 299 b 155 324 167 315 161 324 b 155 324 155 324 155 324 b 65 230 125 322 85 280 b 53 215 61 217 58 215 b 51 215 53 215 51 215 b 42 224 46 215 42 217 b 57 263 42 231 47 244 b 140 360 77 305 104 337 b 152 370 144 365 149 369 b 185 383 157 376 172 381 m 374 306 b 366 308 371 308 368 308 b 300 273 348 308 321 294 b 284 254 288 262 287 259 b 280 242 283 249 281 245 b 257 169 279 240 270 213 l 236 98 l 236 93 b 251 48 238 77 243 61 b 279 27 258 37 272 27 b 281 27 279 27 280 27 b 291 31 281 27 287 30 b 396 170 334 52 378 109 b 406 247 402 197 406 224 b 401 277 406 259 405 270 b 374 306 397 290 383 303 ', + }, + dynamicMezzo: { + x_min: 46.28125, + x_max: 669.671875, + ha: 563, + o: 'm 183 376 b 189 376 185 376 187 376 b 212 374 197 376 208 376 b 265 337 234 369 253 355 b 274 317 268 331 273 320 b 274 316 274 317 274 316 b 280 323 276 316 276 319 b 311 358 288 337 299 348 b 319 366 315 360 318 365 b 356 376 326 373 340 376 b 382 371 364 376 374 374 b 428 337 400 366 417 352 b 436 317 431 331 436 320 b 438 316 436 317 436 316 b 442 323 438 316 439 319 b 475 358 451 337 462 348 b 483 366 477 360 481 365 b 518 376 488 373 503 376 b 544 373 528 376 536 376 b 604 285 579 360 604 326 b 597 249 604 273 601 258 b 543 63 596 247 544 70 b 541 54 543 61 541 55 b 540 44 540 51 540 47 b 552 23 540 33 545 23 b 552 23 552 23 552 23 b 647 126 586 29 627 72 b 658 138 651 136 653 138 b 660 138 660 138 660 138 b 669 129 666 137 669 136 b 654 88 669 122 665 109 b 562 -12 631 43 602 9 l 549 -19 b 521 -27 540 -24 530 -27 b 447 30 490 -27 458 -4 b 443 58 445 38 443 48 b 450 93 443 72 446 84 b 504 278 453 97 504 272 b 507 288 506 283 506 287 b 509 298 507 292 509 295 b 491 326 509 310 502 320 b 487 327 490 327 488 327 b 479 324 484 327 483 326 b 441 270 462 316 443 288 b 435 249 441 265 436 254 b 398 127 434 248 419 195 b 362 4 379 61 362 5 b 328 -1 359 -1 362 -1 b 314 -1 323 -1 319 -1 b 302 -1 310 -1 306 -1 b 266 4 266 -1 269 -1 b 265 6 265 5 265 5 b 303 144 265 13 272 34 b 343 278 325 216 343 276 b 344 288 343 281 344 285 b 345 298 345 291 345 295 b 330 326 345 310 340 320 b 323 327 328 327 325 327 b 317 324 322 327 321 326 b 279 270 300 316 281 288 b 273 249 279 265 274 254 b 236 127 272 248 255 195 b 200 4 216 61 200 5 b 164 -1 197 -1 198 -1 b 151 -1 161 -1 156 -1 b 140 -1 147 -1 142 -1 b 103 4 104 -1 106 -1 b 103 6 103 5 103 5 b 141 144 103 13 108 34 b 181 278 161 216 179 276 b 182 288 181 281 181 285 b 183 298 182 291 183 295 b 168 324 183 310 178 320 b 160 327 166 326 163 327 b 141 320 156 327 151 324 b 69 230 112 305 85 272 b 57 215 65 217 62 215 b 55 215 57 215 55 215 b 46 224 49 215 46 217 b 59 260 46 231 50 242 b 151 363 81 306 112 341 b 161 369 155 365 160 367 b 183 376 166 371 174 374 ', + }, + dynamicForte: { + x_min: -118.421875, + x_max: 597.53125, + ha: 381, + o: 'm 460 574 b 464 574 461 574 462 574 b 488 574 470 574 481 574 b 500 573 491 574 498 574 b 594 503 543 570 588 538 b 597 488 596 498 597 494 b 528 417 597 449 564 417 b 502 423 519 417 510 419 b 465 481 477 434 465 458 b 488 528 465 499 472 516 b 490 530 490 530 490 530 b 490 530 490 530 490 530 b 468 517 488 530 475 523 b 349 340 419 485 377 420 b 347 330 348 334 347 330 b 383 328 347 328 363 328 b 428 326 423 328 424 328 b 442 302 438 320 442 312 b 430 281 442 294 438 285 b 385 276 424 277 426 276 l 377 276 l 332 276 l 330 269 b 178 -117 303 126 250 -9 b 1 -249 129 -194 69 -237 b -20 -251 -6 -251 -13 -251 b -114 -187 -65 -251 -100 -227 b -118 -156 -117 -177 -118 -166 b -51 -84 -118 -116 -91 -84 b -31 -87 -46 -84 -39 -86 b 16 -152 0 -95 16 -124 b -12 -205 16 -173 8 -194 b -16 -208 -14 -206 -16 -208 b -14 -208 -16 -208 -14 -208 b -9 -206 -14 -208 -12 -208 b 74 -124 23 -197 54 -166 b 172 224 98 -79 125 22 b 185 276 178 252 183 274 b 185 276 185 276 185 276 b 141 276 185 276 181 276 b 91 280 96 276 96 276 b 77 302 83 285 77 294 b 91 326 77 312 83 320 b 148 328 95 328 96 328 l 198 330 l 202 341 b 460 574 249 473 351 566 ', + }, + dynamicRinforzando: { + x_min: 78.9375, + x_max: 485.921875, + ha: 417, + o: 'm 362 378 b 378 380 367 380 372 380 b 472 348 415 380 453 367 b 485 315 481 338 485 327 b 462 273 485 298 477 281 b 439 267 454 269 446 267 b 398 290 424 267 409 274 b 344 319 385 309 364 319 b 281 269 315 319 289 301 b 279 262 280 266 279 262 b 276 256 279 260 277 258 b 274 249 276 254 274 251 b 238 127 273 248 257 192 b 201 4 217 61 201 5 b 166 -1 198 -1 200 -1 b 153 -1 163 -1 157 -1 b 141 -1 148 -1 144 -1 b 104 4 106 -1 107 -1 b 104 6 104 5 104 5 b 142 144 104 13 110 34 b 182 278 164 219 181 276 b 183 288 182 281 182 285 b 185 302 185 292 185 298 b 164 330 185 317 176 328 b 159 330 163 330 161 330 b 102 302 140 330 119 320 b 91 294 95 295 93 294 b 88 294 91 294 89 294 b 78 303 83 294 78 298 b 81 312 78 306 78 309 b 200 373 106 347 160 373 b 215 371 205 373 209 371 b 266 335 235 367 254 353 b 269 331 268 333 269 331 b 269 331 269 331 269 331 b 273 335 269 331 270 334 b 362 378 298 359 330 376 ', + }, + dynamicSforzando: { + x_min: 70.78125, + x_max: 378.390625, + ha: 315, + o: 'm 246 373 b 254 373 249 373 251 373 b 372 324 303 373 360 351 b 378 302 377 317 378 309 b 338 251 378 278 362 255 b 328 249 334 249 332 249 b 283 294 303 249 283 270 b 288 315 283 301 284 308 b 289 319 289 317 289 319 b 289 319 289 319 289 319 b 283 320 289 320 287 320 b 270 322 279 322 274 322 b 206 288 242 322 215 308 b 206 283 206 287 206 285 b 257 223 206 267 230 238 b 284 206 272 213 277 210 b 351 90 328 173 351 130 b 340 47 351 74 348 59 b 205 -30 314 -2 264 -30 b 182 -29 198 -30 190 -30 b 84 15 147 -24 103 -5 b 70 48 74 24 70 36 b 108 99 70 70 85 94 b 121 102 112 101 117 102 b 167 56 147 102 167 80 b 159 31 167 48 164 40 l 156 26 l 157 26 b 190 20 167 22 178 20 b 220 26 201 20 212 22 b 258 65 243 34 258 51 b 257 70 258 66 258 69 b 204 126 249 94 234 109 b 114 258 148 158 114 209 b 125 302 114 273 118 288 b 246 373 147 342 193 370 ', + }, + dynamicZ: { + x_min: 29.9375, + x_max: 420.578125, + ha: 371, + o: 'm 115 345 b 221 347 117 345 166 347 b 411 345 306 347 409 345 b 420 330 416 342 420 335 b 415 319 420 326 419 321 b 178 118 397 303 179 118 b 178 117 178 118 178 117 b 181 117 178 117 178 117 b 189 117 182 117 185 117 b 193 117 190 117 191 117 b 247 98 215 117 232 111 b 296 75 266 83 280 76 b 302 75 299 75 300 75 b 322 91 311 75 315 79 b 322 91 322 91 322 91 b 322 91 322 91 322 91 b 319 91 322 91 321 91 b 313 90 318 90 315 90 b 283 107 300 90 288 97 b 277 126 279 114 277 121 b 319 167 277 149 295 167 b 319 167 319 167 319 167 b 362 118 347 167 362 147 b 355 82 362 108 359 96 b 311 33 349 65 340 55 b 224 1 284 12 253 1 b 194 5 213 1 204 2 b 168 18 183 8 178 11 b 110 36 151 30 130 36 b 57 15 88 36 68 29 b 47 11 54 12 51 11 b 31 20 40 11 34 13 b 29 26 31 22 29 25 b 68 66 29 36 39 45 b 285 250 73 71 281 248 b 285 250 285 250 285 250 b 231 252 285 252 261 252 b 137 250 190 252 141 250 b 93 227 122 248 110 241 b 78 220 88 222 83 220 b 66 227 74 220 70 222 b 63 234 65 229 63 231 b 85 291 63 241 69 252 b 115 345 108 342 108 344 ', + }, + ornamentTrill: { + x_min: -340.28125, + x_max: 338.921875, + ha: 346, + o: 'm -32 520 b -29 521 -31 520 -31 521 b -23 519 -27 521 -24 520 b -20 513 -21 517 -20 516 b -21 506 -20 512 -20 509 b -31 474 -23 502 -27 488 l -53 402 l -66 352 l -68 349 l -57 349 b -32 351 -51 349 -40 351 b 123 370 19 352 74 359 b 137 371 127 370 133 371 b 170 356 152 371 164 366 b 171 355 170 355 170 355 b 216 366 174 355 183 358 b 280 378 268 377 266 377 b 287 378 283 378 284 378 b 332 349 307 378 322 369 b 338 319 336 341 338 330 b 332 301 338 310 336 302 b 242 280 329 299 246 280 b 242 280 242 280 242 280 b 235 288 236 280 235 283 b 235 292 235 290 235 291 b 236 302 236 297 236 299 b 220 337 236 316 230 330 l 216 340 l 210 335 b 159 276 189 322 172 301 b 118 149 152 265 156 274 b 81 34 84 36 85 36 b -8 13 78 33 -4 13 b -8 13 -8 13 -8 13 b -14 20 -12 15 -14 15 b -8 44 -14 24 -12 31 b -2 66 -5 55 -2 65 b -2 66 -2 66 -2 66 l -2 66 b -43 41 -2 66 -21 55 b -114 4 -98 8 -98 8 b -144 0 -123 0 -134 0 b -242 99 -197 0 -242 43 b -242 109 -242 102 -242 105 b -212 219 -240 122 -242 116 b -185 312 -197 270 -185 312 l -185 312 b -189 312 -185 312 -186 312 b -259 312 -200 312 -227 312 b -321 310 -291 312 -310 310 b -334 312 -330 310 -334 312 b -340 319 -338 313 -340 316 b -336 326 -340 322 -338 324 b -291 337 -334 326 -314 331 l -247 347 l -210 348 b -172 348 -190 348 -172 348 b -168 363 -172 348 -171 355 b -145 442 -151 424 -145 441 b -133 452 -144 444 -140 446 l -77 489 b -32 520 -53 506 -32 520 m 57 334 b 53 335 55 335 54 335 b 44 334 50 335 49 335 b -70 316 8 326 -28 320 b -78 309 -78 316 -78 316 b -108 202 -80 305 -88 274 b -141 81 -136 112 -141 93 b -140 74 -141 79 -141 77 b -117 49 -137 59 -127 49 b -107 52 -114 49 -110 51 b 16 127 -106 54 14 126 b 42 217 16 127 42 215 b 49 241 42 222 44 229 b 73 320 53 251 73 317 b 57 334 73 327 65 333 ', + }, + ornamentTurn: { + x_min: -423.3125, + x_max: 421.9375, + ha: 431, + o: 'm -262 197 b -247 197 -257 197 -253 197 b -118 162 -210 197 -163 184 b 40 45 -61 134 -13 98 b 277 -95 119 -33 200 -81 b 289 -97 281 -97 285 -97 b 378 0 332 -97 371 -55 b 378 11 378 4 378 6 b 302 83 378 55 345 83 b 242 66 283 83 262 77 b 208 56 231 59 219 56 b 148 120 175 56 148 81 b 201 186 148 151 164 172 b 261 198 220 194 240 198 b 420 45 341 198 411 136 b 421 22 421 37 421 29 b 245 -199 421 -93 338 -199 b 238 -198 243 -199 240 -199 b -44 -47 148 -194 50 -141 b -250 86 -114 22 -183 66 b -295 94 -270 91 -283 94 b -315 91 -302 94 -307 94 b -381 4 -356 81 -381 43 b -355 -56 -381 -18 -372 -40 b -298 -81 -338 -73 -319 -81 b -246 -68 -283 -81 -265 -77 b -212 -58 -234 -61 -223 -58 b -178 -69 -200 -58 -189 -62 b -151 -122 -160 -81 -151 -101 b -171 -167 -151 -138 -157 -155 b -239 -195 -185 -181 -213 -192 b -257 -197 -245 -197 -250 -197 b -423 -5 -352 -197 -423 -109 b -412 65 -423 16 -419 40 b -262 197 -389 137 -329 188 ', + }, + ornamentTurnSlash: { + x_min: -423.3125, + x_max: 421.9375, + ha: 431, + o: 'm -10 276 b -2 277 -8 277 -5 277 b 17 265 5 277 13 273 b 19 163 19 260 19 260 l 19 68 l 39 45 b 277 -95 122 -34 200 -81 b 289 -97 281 -97 285 -97 b 378 0 332 -97 371 -54 b 378 11 378 4 378 6 b 302 83 378 55 345 83 b 242 66 283 83 262 77 b 208 56 231 59 219 56 b 148 120 175 56 148 81 b 200 186 148 151 164 172 b 261 198 220 194 240 198 b 420 45 341 198 411 137 b 421 22 421 37 421 29 b 257 -198 421 -86 347 -188 b 242 -198 251 -198 247 -198 b 20 -105 181 -198 95 -163 l 19 -104 l 19 -183 b 19 -216 19 -195 19 -206 b 12 -273 19 -272 17 -267 b -2 -278 8 -277 2 -278 b -21 -266 -10 -278 -19 -274 b -23 -165 -23 -263 -23 -262 l -23 -69 l -44 -47 b -250 86 -117 23 -183 66 b -295 94 -270 93 -284 94 b -315 91 -302 94 -308 94 b -381 5 -356 81 -381 43 b -355 -56 -381 -16 -372 -40 b -299 -81 -338 -73 -319 -81 b -246 -68 -283 -81 -265 -77 b -212 -58 -234 -61 -223 -58 b -168 -77 -196 -58 -179 -65 b -151 -122 -156 -90 -151 -105 b -179 -174 -151 -141 -160 -162 b -239 -195 -194 -184 -217 -192 b -257 -197 -245 -195 -250 -197 b -423 -5 -349 -197 -423 -113 b -423 0 -423 -4 -423 -1 b -277 194 -420 97 -362 173 b -247 197 -268 197 -258 197 b -24 104 -185 197 -100 162 l -23 102 l -23 181 b -21 265 -23 260 -23 260 b -10 276 -20 269 -14 274 ', + }, + ornamentMordent: { + x_min: -402.890625, + x_max: 401.53125, + ha: 410, + o: 'm -10 273 b -4 274 -9 273 -6 274 b 16 262 4 274 12 269 b 17 158 17 259 17 259 l 17 56 l 62 112 b 117 174 110 172 110 172 b 122 174 118 174 119 174 b 132 173 125 174 129 173 b 295 11 134 172 171 134 l 307 -1 l 336 34 b 374 76 366 72 368 74 b 381 77 375 77 378 77 b 401 56 392 77 401 68 b 400 48 401 54 401 51 b 223 -172 397 41 230 -166 b 210 -176 220 -174 215 -176 b 201 -174 206 -176 204 -176 b 112 -87 198 -173 178 -152 b 27 0 65 -38 27 0 b 21 -6 27 0 24 -2 l 17 -12 l 17 -147 b 17 -210 17 -173 17 -194 b 10 -292 17 -297 16 -287 b -2 -299 6 -297 2 -299 b -21 -287 -10 -299 -19 -295 b -24 -174 -23 -284 -23 -284 l -24 -63 l -66 -117 b -121 -176 -110 -170 -114 -176 b -125 -176 -122 -176 -123 -176 b -296 -12 -134 -174 -125 -184 l -308 0 l -337 -34 b -375 -77 -367 -73 -370 -76 b -382 -79 -377 -79 -379 -79 b -402 -58 -393 -79 -402 -69 b -401 -49 -402 -55 -402 -52 b -224 170 -398 -43 -231 165 b -212 174 -221 173 -216 174 b -202 173 -208 174 -205 174 b -39 11 -200 172 -151 122 l -28 -1 l -25 1 l -24 4 l -24 130 b -23 260 -24 256 -24 258 b -10 273 -20 266 -16 270 ', + }, + ornamentShortTrill: { + x_min: -402.890625, + x_max: 401.53125, + ha: 410, + o: 'm -219 173 b -213 174 -217 174 -215 174 b -202 173 -209 174 -205 173 b -114 86 -200 172 -179 151 b -28 0 -66 37 -28 0 b 40 84 -28 0 2 37 b 117 174 111 173 110 172 b 122 174 118 174 119 174 b 132 173 125 174 129 173 b 295 11 134 172 171 134 l 307 -1 l 336 34 b 374 76 366 72 368 74 b 381 77 375 77 378 77 b 401 56 392 77 401 68 b 400 48 401 54 401 51 b 223 -172 397 41 230 -166 b 210 -176 220 -174 215 -176 b 201 -174 206 -176 204 -176 b 112 -87 198 -173 178 -152 b 27 0 65 -38 27 0 b -42 -86 27 0 -4 -38 b -118 -174 -112 -174 -111 -173 b -123 -176 -119 -176 -121 -176 b -133 -174 -126 -176 -130 -174 b -296 -12 -136 -173 -172 -137 l -308 0 l -337 -34 b -375 -77 -367 -73 -370 -76 b -382 -79 -377 -79 -379 -79 b -402 -58 -393 -79 -402 -69 b -401 -49 -402 -55 -402 -52 b -224 172 -398 -43 -228 167 b -219 173 -223 172 -220 173 ', + }, + ornamentTremblement: { + x_min: -571.671875, + x_max: 570.3125, + ha: 582, + o: 'm -386 173 b -381 174 -385 174 -383 174 b -370 173 -377 174 -372 173 b -281 86 -367 172 -347 151 b -196 0 -235 37 -196 0 b -126 84 -196 0 -164 37 b -50 174 -55 173 -57 172 b -44 174 -49 174 -47 174 b -35 173 -42 174 -38 173 b 53 86 -32 172 -12 151 b 138 0 100 37 138 0 b 208 84 140 0 170 37 b 284 174 279 173 277 172 b 289 174 285 174 288 174 b 299 173 294 174 298 173 b 462 11 303 172 338 134 l 475 -1 l 503 34 b 541 76 534 72 536 74 b 548 77 544 77 545 77 b 570 56 560 77 570 68 b 567 48 570 54 568 51 b 392 -172 564 41 397 -166 b 378 -176 387 -174 382 -176 b 368 -174 374 -176 371 -176 b 280 -87 367 -173 345 -152 b 194 0 234 -38 194 0 b 125 -86 194 0 163 -38 b 49 -174 54 -174 55 -173 b 43 -176 47 -176 46 -176 b 34 -174 40 -176 36 -174 b -54 -87 31 -173 10 -152 b -140 0 -102 -38 -140 0 b -209 -86 -141 0 -171 -38 b -285 -174 -280 -174 -279 -173 b -291 -176 -287 -176 -289 -176 b -300 -174 -295 -176 -299 -174 b -464 -12 -304 -173 -340 -137 l -476 0 l -504 -34 b -543 -77 -534 -73 -537 -76 b -549 -79 -545 -79 -547 -79 b -571 -58 -562 -79 -571 -69 b -568 -49 -571 -55 -570 -52 b -392 172 -566 -43 -396 167 b -386 173 -390 172 -387 173 ', + }, + ornamentPrecompAppoggTrill: { + x_min: -571.671875, + x_max: 570.3125, + ha: 582, + o: 'm -559 351 b -551 352 -556 352 -553 352 b -530 338 -543 352 -533 348 b -529 169 -530 337 -529 291 l -529 1 l -507 27 l -441 112 b -382 174 -394 169 -390 174 b -378 174 -381 174 -379 174 b -281 86 -370 174 -375 179 b -196 0 -234 37 -196 0 b -126 84 -196 0 -164 37 b -50 174 -55 173 -57 172 b -44 174 -49 174 -47 174 b -35 173 -42 174 -38 173 b 53 86 -32 172 -12 151 b 138 0 100 37 138 0 b 208 84 140 0 170 37 b 284 174 279 173 279 172 b 289 174 285 174 288 174 b 300 173 294 174 298 173 b 462 11 303 172 340 134 l 475 -1 l 503 34 b 541 76 534 72 536 74 b 548 77 544 77 545 77 b 570 56 560 77 570 68 b 567 48 570 54 568 51 b 392 -172 564 41 397 -166 b 378 -176 387 -174 382 -176 b 368 -174 375 -176 371 -176 b 280 -87 367 -173 347 -152 b 194 0 234 -38 194 0 b 126 -86 194 0 163 -38 b 49 -174 54 -174 55 -173 b 44 -176 47 -176 46 -176 b 34 -174 40 -176 36 -174 b -54 -87 31 -173 10 -152 b -140 0 -102 -38 -140 0 b -209 -86 -140 0 -171 -38 b -285 -174 -280 -174 -279 -173 b -291 -176 -287 -176 -288 -176 b -300 -174 -294 -176 -298 -174 b -464 -11 -303 -173 -374 -102 l -476 0 l -506 -37 b -539 -76 -528 -65 -537 -74 b -551 -80 -543 -79 -547 -80 b -570 -68 -558 -80 -566 -76 l -571 -65 l -571 136 b -570 340 -571 331 -571 337 b -559 351 -568 344 -564 348 ', + }, + ornamentPrecompSlideTrillDAnglebert: { + x_min: -590.71875, + x_max: 589.359375, + ha: 601, + o: 'm -367 173 b -362 174 -366 174 -364 174 b -351 173 -357 174 -353 173 b -262 86 -348 172 -328 151 b -176 0 -216 37 -176 0 b -107 84 -176 0 -145 37 b -31 174 -36 173 -38 172 b -25 174 -29 174 -28 174 b -16 173 -23 174 -19 173 b 72 86 -13 172 6 151 b 157 0 119 37 157 0 b 227 84 159 0 189 37 b 303 174 298 173 296 172 b 308 174 304 174 307 174 b 318 173 313 174 317 173 b 481 11 322 172 357 134 l 494 -1 l 522 34 b 560 76 553 72 555 74 b 567 77 563 77 564 77 b 589 56 579 77 589 68 b 586 48 589 54 588 51 b 411 -172 583 41 416 -166 b 397 -176 406 -174 401 -176 b 387 -174 393 -176 390 -176 b 299 -87 386 -173 366 -152 b 213 0 253 -38 213 0 b 144 -86 213 0 182 -38 b 68 -174 73 -174 74 -173 b 62 -176 66 -176 65 -176 b 53 -174 59 -176 55 -174 b -35 -87 50 -173 29 -152 b -121 0 -83 -38 -121 0 b -190 -86 -122 0 -152 -38 b -266 -174 -261 -174 -259 -173 b -272 -176 -268 -176 -270 -176 b -281 -174 -276 -176 -280 -174 b -371 -86 -284 -173 -304 -152 b -457 0 -417 -38 -457 0 l -457 0 b -477 -26 -457 0 -470 -16 b -548 -227 -524 -88 -548 -161 b -536 -303 -548 -254 -544 -280 b -533 -317 -534 -309 -533 -313 b -553 -338 -533 -330 -541 -338 b -577 -315 -566 -338 -571 -333 b -590 -227 -586 -287 -590 -258 b -518 -9 -590 -154 -564 -77 b -465 56 -509 2 -504 8 l -402 134 b -367 173 -375 169 -372 172 ', + }, + ornamentPrecompSlideTrillBach: { + x_min: -590.71875, + x_max: 589.359375, + ha: 601, + o: 'm 175 273 b 182 274 178 273 181 274 b 202 262 190 274 198 269 b 204 158 204 259 204 259 l 204 56 l 250 112 b 303 174 296 172 298 172 b 308 174 304 174 307 174 b 318 173 313 174 317 173 b 481 11 322 172 357 134 l 494 -1 l 522 34 b 560 76 553 72 555 74 b 567 77 563 77 564 77 b 589 56 579 77 589 68 b 586 48 589 54 588 51 b 411 -172 583 41 416 -166 b 397 -176 406 -174 401 -176 b 387 -174 393 -176 390 -176 b 299 -87 386 -173 366 -152 b 213 0 253 -38 213 0 b 208 -6 213 0 210 -2 l 204 -12 l 204 -147 b 204 -210 204 -173 204 -194 b 198 -292 204 -297 204 -287 b 183 -299 194 -297 189 -299 b 164 -287 175 -299 167 -295 b 163 -174 163 -284 163 -284 l 161 -63 l 119 -117 b 65 -176 76 -170 73 -176 b 61 -176 63 -176 62 -176 b -35 -87 51 -174 57 -180 b -121 0 -83 -38 -121 0 b -190 -86 -122 0 -152 -38 b -266 -174 -261 -174 -259 -173 b -272 -176 -268 -176 -270 -176 b -281 -174 -276 -176 -280 -174 b -371 -86 -284 -173 -304 -152 b -457 0 -417 -38 -457 0 l -457 0 b -477 -26 -457 0 -470 -16 b -548 -227 -524 -88 -548 -161 b -536 -303 -548 -254 -544 -280 b -533 -317 -534 -309 -533 -313 b -553 -338 -533 -330 -541 -338 b -577 -315 -566 -338 -571 -333 b -590 -227 -586 -287 -590 -258 b -518 -9 -590 -154 -564 -77 b -465 56 -509 2 -504 8 l -402 134 b -363 174 -374 170 -371 174 b -359 174 -362 174 -360 174 b -262 86 -351 174 -356 179 b -176 0 -216 37 -176 0 b -107 84 -176 0 -145 37 b -31 174 -36 173 -38 172 b -25 174 -29 174 -28 174 b -16 173 -23 174 -19 173 b 147 11 -13 172 35 123 l 157 -1 l 160 1 l 163 4 l 163 130 b 164 260 163 256 163 258 b 175 273 166 266 170 270 ', + }, + ornamentPrecompTrillSuffixDandrieu: { + x_min: -590.71875, + x_max: 589.359375, + ha: 601, + o: 'm 544 335 b 553 337 548 337 551 337 b 575 313 563 337 570 330 b 589 226 583 285 589 256 b 517 8 589 152 563 76 b 464 -58 507 -4 503 -9 l 401 -136 b 362 -176 372 -172 370 -176 b 357 -176 360 -176 359 -176 b 261 -87 349 -174 355 -180 b 175 0 215 -38 175 0 b 106 -86 175 0 144 -38 b 29 -174 35 -174 36 -173 b 24 -176 28 -176 27 -176 b 14 -174 21 -176 17 -174 b -73 -87 12 -173 -8 -152 b -159 0 -121 -38 -159 0 b -228 -86 -160 0 -190 -38 b -304 -174 -299 -174 -298 -173 b -310 -176 -306 -176 -308 -176 b -319 -174 -314 -176 -318 -174 b -483 -12 -323 -173 -359 -137 l -495 0 l -524 -34 b -562 -77 -553 -73 -556 -76 b -568 -79 -564 -79 -566 -79 b -590 -58 -581 -79 -590 -69 b -588 -49 -590 -55 -589 -52 b -412 170 -585 -43 -417 165 b -398 174 -408 173 -402 174 b -389 173 -394 174 -392 174 b -300 86 -387 172 -366 151 b -215 -1 -254 37 -215 -1 b -145 84 -215 -1 -183 37 b -69 173 -74 173 -76 172 b -63 174 -68 174 -66 174 b -54 173 -61 174 -57 173 b 34 86 -51 172 -31 151 b 119 -1 81 37 119 -1 b 189 84 121 -1 151 37 b 265 173 259 173 258 172 b 270 174 266 174 269 174 b 280 173 274 174 279 173 b 370 84 283 172 303 151 b 455 -1 416 37 455 -1 l 455 -1 b 476 24 455 -1 469 15 b 547 226 522 87 547 159 b 534 302 547 252 543 278 b 532 317 533 308 532 313 b 544 335 532 326 536 333 ', + }, + ornamentPrecompDoubleCadenceUpperPrefix: { + x_min: -597.53125, + x_max: 596.171875, + ha: 608, + o: 'm -533 324 b -525 327 -530 326 -528 327 b -504 305 -514 327 -504 317 b -504 305 -504 305 -504 305 b -513 284 -504 299 -504 299 b -556 112 -541 226 -556 167 b -545 33 -556 84 -552 58 b -524 -20 -541 15 -532 -9 l -522 -23 l -491 15 l -413 111 b -355 174 -367 169 -363 174 b -351 174 -353 174 -352 174 b -254 86 -343 174 -348 179 b -168 -1 -208 37 -168 -1 b -100 84 -168 -1 -137 37 b -23 173 -28 173 -29 172 b -19 174 -21 174 -20 174 b -8 173 -14 174 -10 173 b 80 86 -5 172 13 151 b 166 -1 127 37 166 -1 b 235 84 166 -1 197 37 b 311 173 306 173 304 172 b 317 174 313 174 314 174 b 326 173 319 174 323 173 b 490 11 329 172 366 134 l 502 -1 l 530 34 b 568 76 560 72 563 74 b 575 77 570 77 573 77 b 596 56 586 77 596 68 b 594 48 596 54 596 51 b 417 -172 592 41 424 -166 b 405 -176 415 -174 409 -176 b 396 -174 401 -176 398 -176 b 307 -87 393 -173 372 -152 b 221 -1 259 -38 221 -1 b 152 -86 221 -1 190 -38 b 76 -176 81 -174 83 -173 b 70 -176 74 -176 73 -176 b 61 -174 66 -176 62 -174 b -27 -87 58 -173 38 -152 b -114 -1 -74 -38 -112 -1 b -182 -86 -114 -1 -145 -38 b -258 -176 -253 -174 -253 -173 b -264 -176 -259 -176 -262 -176 b -274 -174 -268 -176 -272 -174 b -438 -11 -277 -173 -348 -102 l -449 0 l -479 -37 b -524 -80 -513 -80 -514 -80 l -524 -80 b -553 -52 -534 -80 -540 -74 b -597 109 -583 -8 -597 48 b -560 280 -597 165 -585 224 b -533 324 -548 310 -540 322 ', + }, + ornamentPrecompDoubleCadenceUpperPrefixTurn: { + x_min: -597.53125, + x_max: 596.171875, + ha: 608, + o: 'm -533 324 b -525 327 -530 326 -528 327 b -504 305 -514 327 -504 317 b -504 305 -504 305 -504 305 b -513 284 -504 299 -504 299 b -556 112 -541 226 -556 167 b -545 33 -556 84 -552 58 b -524 -20 -541 15 -532 -9 l -522 -23 l -491 15 l -413 111 b -355 174 -367 169 -363 174 b -351 174 -353 174 -352 174 b -254 86 -343 174 -348 179 b -168 -1 -208 37 -168 -1 b -100 84 -168 -1 -137 37 b -23 173 -28 173 -29 172 b -19 174 -21 174 -20 174 b -8 173 -14 174 -10 173 b 155 11 -5 172 43 123 l 166 -1 l 168 1 l 170 4 l 170 130 b 171 260 170 256 170 258 b 191 274 175 269 183 274 b 205 267 196 274 201 272 b 212 158 212 262 210 273 l 212 56 l 257 112 b 311 173 304 172 304 172 b 317 174 313 174 314 174 b 326 173 319 174 323 173 b 490 11 329 172 366 134 l 502 -1 l 530 34 b 568 76 560 72 563 74 b 575 77 570 77 573 77 b 596 56 586 77 596 68 b 594 48 596 54 596 51 b 417 -172 592 41 424 -166 b 405 -176 415 -174 409 -176 b 396 -174 401 -176 398 -176 b 307 -87 393 -173 372 -152 b 221 -1 259 -38 221 -1 b 216 -6 221 -1 219 -2 l 212 -12 l 212 -147 b 212 -210 212 -173 212 -194 b 205 -292 212 -297 210 -287 b 191 -299 201 -297 196 -299 b 172 -287 183 -299 175 -295 b 170 -174 171 -284 171 -284 l 170 -63 l 127 -117 b 73 -176 84 -170 80 -176 b 68 -176 72 -176 70 -176 b -27 -87 59 -174 65 -180 b -114 0 -74 -38 -112 0 b -182 -86 -114 0 -145 -38 b -258 -174 -253 -174 -253 -173 b -264 -176 -259 -176 -262 -176 b -274 -174 -268 -176 -272 -174 b -438 -11 -277 -173 -348 -102 l -449 0 l -479 -37 b -524 -80 -513 -80 -514 -80 l -524 -80 b -553 -52 -534 -80 -540 -74 b -597 109 -583 -8 -597 48 b -560 280 -597 165 -585 224 b -533 324 -548 310 -540 322 ', + }, + ornamentPrecompTrillLowerSuffix: { + x_min: -597.53125, + x_max: 596.171875, + ha: 608, + o: 'm -413 173 b -408 174 -412 174 -409 174 b -397 173 -404 174 -400 173 b -308 86 -394 172 -374 151 b -223 0 -261 37 -223 0 b -153 84 -223 0 -191 37 b -77 174 -83 173 -84 172 b -72 174 -76 174 -74 174 b -62 173 -68 174 -63 173 b 25 86 -59 172 -39 151 b 112 0 73 37 111 0 b 181 84 112 0 144 37 b 257 174 251 173 251 172 b 262 174 258 174 261 174 b 273 173 266 174 270 173 b 436 9 276 172 347 101 l 447 -1 l 477 36 b 522 79 511 79 513 79 l 522 79 b 552 51 533 79 539 73 b 596 -112 582 6 596 -51 b 567 -262 596 -161 586 -213 b 539 -322 558 -287 544 -316 b 524 -327 534 -326 529 -327 b 504 -315 515 -327 507 -323 b 503 -308 503 -312 503 -309 b 511 -285 503 -302 504 -297 b 555 -113 540 -227 555 -169 b 544 -34 555 -86 551 -59 b 522 19 540 -16 530 8 l 521 22 l 481 -26 l 405 -122 b 353 -176 366 -172 362 -176 b 349 -176 352 -176 351 -176 b 253 -87 341 -176 347 -180 b 167 0 206 -38 167 0 b 99 -86 167 0 136 -38 b 21 -174 27 -174 28 -173 b 17 -176 20 -176 19 -176 b 6 -174 13 -176 9 -174 b -81 -87 4 -173 -14 -152 b -167 0 -129 -38 -167 0 b -236 -86 -167 0 -198 -38 b -313 -174 -307 -174 -306 -173 b -318 -176 -314 -176 -315 -176 b -328 -174 -321 -176 -325 -174 b -491 -12 -330 -173 -367 -137 l -503 0 l -530 -34 b -570 -77 -562 -73 -564 -76 b -577 -79 -571 -79 -574 -79 b -597 -58 -588 -79 -597 -69 b -596 -49 -597 -55 -597 -52 b -417 172 -593 -43 -423 167 b -413 173 -417 172 -415 173 ', + }, + stringsDownBow: { + x_min: -149.71875, + x_max: 148.359375, + ha: 151, + o: 'm -9 215 b 0 217 -6 217 -4 217 b 19 205 8 217 14 213 b 20 142 20 202 20 201 l 20 84 l 23 84 b 144 -27 81 74 129 30 b 148 -66 147 -40 148 -54 b 36 -213 148 -134 103 -197 b 0 -219 24 -217 12 -219 b -145 -104 -68 -219 -129 -173 b -149 -68 -148 -91 -149 -79 b -24 84 -149 6 -98 74 l -21 84 l -21 142 b -19 205 -20 201 -20 202 b -9 215 -17 209 -13 213 m -21 -15 b -23 41 -21 37 -21 41 b -23 41 -23 41 -23 41 b -76 11 -35 40 -62 26 b -108 -65 -98 -11 -108 -38 b -1 -176 -108 -122 -65 -176 b 107 -65 63 -176 107 -122 b 74 11 107 -38 96 -11 b 20 41 61 26 32 41 b 20 -15 20 41 20 15 b 19 -74 20 -72 20 -72 b 0 -87 14 -83 6 -87 b -19 -74 -8 -87 -16 -83 b -21 -15 -20 -72 -20 -72 ', + }, + stringsUpBow: { + x_min: -149.71875, + x_max: 148.359375, + ha: 151, + o: 'm -137 381 b -130 383 -134 383 -133 383 b -111 371 -122 383 -114 378 b -55 224 -110 370 -85 305 b 0 80 -25 145 -1 80 b 54 224 0 80 24 145 b 112 377 114 384 110 373 b 127 384 118 381 122 384 b 148 362 138 384 148 374 l 148 356 l 83 183 b 16 9 47 88 17 11 b -1 0 12 2 5 0 b -14 5 -5 0 -10 1 b -84 183 -19 9 -13 -6 l -149 356 l -149 362 b -137 381 -149 371 -145 378 ', + }, + stringsHarmonic: { + x_min: -122.5, + x_max: 121.140625, + ha: 124, + o: 'm -16 145 b 0 147 -10 147 -5 147 b 121 -1 66 147 121 77 b 114 -49 121 -16 118 -33 b -1 -148 95 -112 47 -148 b -85 -106 -31 -148 -61 -134 b -122 -1 -110 -76 -122 -38 b -16 145 -122 68 -81 134 m 12 111 b 0 113 8 113 4 113 b -68 22 -29 113 -61 73 b -70 0 -69 15 -70 6 b -13 -113 -70 -49 -47 -98 b -1 -115 -9 -115 -5 -115 b 63 -40 24 -115 53 -83 b 68 -1 66 -27 68 -15 b 12 111 68 48 46 97 ', + }, + pluckedSnapPizzicatoAbove: { + x_min: -149.71875, + x_max: 148.359375, + ha: 151, + o: 'm -9 215 b 0 217 -6 217 -4 217 b 19 205 8 217 14 213 b 20 142 20 202 20 201 l 20 84 l 23 84 b 144 -27 81 74 129 30 b 148 -66 147 -40 148 -54 b 36 -213 148 -134 103 -197 b 0 -219 24 -217 12 -219 b -145 -104 -68 -219 -129 -173 b -149 -68 -148 -91 -149 -79 b -24 84 -149 6 -98 74 l -21 84 l -21 142 b -19 205 -20 201 -20 202 b -9 215 -17 209 -13 213 m -21 -15 b -23 41 -21 37 -21 41 b -23 41 -23 41 -23 41 b -76 11 -35 40 -62 26 b -108 -65 -98 -11 -108 -38 b -1 -176 -108 -122 -65 -176 b 107 -65 63 -176 107 -122 b 74 11 107 -38 96 -11 b 20 41 61 26 32 41 b 20 -15 20 41 20 15 b 19 -74 20 -72 20 -72 b 0 -87 14 -83 6 -87 b -19 -74 -8 -87 -16 -83 b -21 -15 -20 -72 -20 -72 ', + }, + pluckedSnapPizzicatoBelow: { + x_min: -149.71875, + x_max: 148.359375, + ha: 151, + o: 'm -9 215 b 0 217 -6 217 -4 217 b 19 205 8 217 14 213 b 20 142 20 202 20 201 l 20 84 l 23 84 b 144 -27 81 74 129 30 b 148 -66 147 -40 148 -54 b 36 -213 148 -134 103 -197 b 0 -219 24 -217 12 -219 b -145 -104 -68 -219 -129 -173 b -149 -68 -148 -91 -149 -79 b -24 84 -149 6 -98 74 l -21 84 l -21 142 b -19 205 -20 201 -20 202 b -9 215 -17 209 -13 213 m -21 -15 b -23 41 -21 37 -21 41 b -23 41 -23 41 -23 41 b -76 11 -35 40 -62 26 b -108 -65 -98 -11 -108 -38 b -1 -176 -108 -122 -65 -176 b 107 -65 63 -176 107 -122 b 74 11 107 -38 96 -11 b 20 41 61 26 32 41 b 20 -15 20 41 20 15 b 19 -74 20 -72 20 -72 b 0 -87 14 -83 6 -87 b -19 -74 -8 -87 -16 -83 b -21 -15 -20 -72 -20 -72 ', + }, + pluckedLeftHandPizzicato: { + x_min: 0, + x_max: 319.859375, + ha: 326, + o: 'm 149 508 b 159 509 152 509 155 509 b 186 494 170 509 181 503 b 190 440 190 487 190 488 l 190 430 l 190 377 l 242 377 l 251 377 b 303 373 298 377 296 377 b 319 345 314 367 319 356 b 304 319 319 335 314 324 b 250 315 296 315 299 315 l 242 315 l 190 315 l 190 262 l 190 252 b 186 198 190 204 190 205 b 159 183 179 188 170 183 b 132 198 148 183 138 188 b 127 252 127 205 127 204 l 127 262 l 127 315 l 76 315 l 68 315 b 14 319 20 315 21 315 b 0 347 4 324 0 335 b 14 373 0 356 4 367 b 68 377 21 377 20 377 l 76 377 l 127 377 l 127 430 l 127 440 b 132 494 127 488 127 487 b 149 508 136 501 142 505 ', + }, + keyboardPedalPed: { + x_min: -1.359375, + x_max: 1064.390625, + ha: 1086, + o: 'm 296 692 b 314 694 302 694 307 694 b 386 685 337 694 366 689 b 548 498 480 660 548 580 b 548 481 548 492 548 487 b 455 395 541 426 499 395 b 370 462 420 395 383 417 b 362 496 364 477 362 488 b 377 514 362 509 367 514 b 393 501 386 514 390 510 b 432 474 397 484 413 474 b 470 487 445 474 458 478 b 491 530 484 496 491 510 b 490 544 491 534 491 539 b 333 660 479 606 411 657 l 323 662 l 315 646 b 269 524 285 591 269 556 b 321 431 269 492 287 466 b 349 395 338 413 343 408 b 363 342 359 378 363 362 b 359 312 363 333 362 322 b 285 158 348 266 318 206 b 281 152 283 155 281 152 b 281 152 281 152 281 152 b 287 154 283 152 284 152 b 318 155 298 154 308 155 b 461 98 371 155 419 136 l 464 97 l 483 112 b 503 129 494 120 503 127 b 504 130 503 129 504 129 b 503 138 504 131 503 134 b 500 180 500 152 500 166 b 553 326 500 238 518 288 b 604 366 560 331 592 358 b 649 381 617 376 632 381 b 696 362 665 381 681 374 b 724 302 714 347 724 324 b 695 238 724 278 714 255 b 660 210 691 234 662 212 b 579 148 658 209 582 151 b 579 148 579 148 579 148 b 596 106 579 144 589 119 b 622 77 604 88 609 83 b 657 69 632 72 645 69 b 748 112 688 69 721 84 b 755 123 754 117 755 120 b 755 127 755 124 755 126 b 751 165 752 137 751 151 b 758 219 751 183 754 202 b 894 387 774 290 820 347 b 896 390 896 388 896 388 b 891 398 896 391 895 392 b 622 560 827 477 730 535 b 600 580 605 564 600 569 b 617 596 600 591 607 596 b 628 595 622 596 624 596 b 1057 248 846 552 1020 412 b 1064 191 1061 229 1064 209 b 922 0 1064 94 1005 9 b 902 -1 916 -1 909 -1 b 774 76 847 -1 800 26 b 769 83 770 81 770 83 b 769 81 769 83 769 83 b 627 -1 733 29 677 -1 b 548 27 597 -1 570 8 b 515 88 537 37 525 61 l 513 95 l 510 93 l 453 45 b 390 0 396 0 396 0 b 390 0 390 0 390 0 b 374 15 381 0 377 4 b 268 105 359 69 314 105 b 250 104 262 105 257 105 l 243 102 l 234 90 b 155 1 201 49 159 2 b 147 -1 152 0 149 -1 b 130 15 138 -1 130 6 b 132 20 130 18 132 19 b 136 31 133 22 134 27 b 220 131 149 74 178 109 b 231 137 225 134 230 136 b 302 278 280 202 302 244 b 265 335 302 299 295 309 b 209 442 234 363 213 402 b 209 455 209 446 209 451 b 279 648 209 502 232 564 l 285 659 l 283 659 b 176 627 238 653 210 645 b 57 477 111 594 66 538 b 55 459 55 471 55 464 b 72 409 55 437 61 415 b 93 403 78 405 87 403 b 152 467 123 403 151 431 b 168 488 153 483 157 488 b 185 462 181 488 185 483 l 185 460 b 137 344 183 409 168 369 b 78 322 119 328 98 322 b 13 360 50 322 25 335 b -1 426 4 380 -1 402 b 89 610 -1 488 32 559 b 296 692 147 659 210 685 m 926 348 b 921 353 924 351 922 353 b 914 348 920 353 918 351 b 823 167 857 306 823 237 b 828 124 823 154 826 138 b 890 31 837 79 862 40 b 896 31 892 31 894 31 b 956 104 916 31 940 59 b 970 191 965 129 970 159 b 966 241 970 208 969 224 b 926 348 959 277 945 313 m 627 326 b 619 326 624 326 622 326 b 598 316 611 326 604 323 b 568 215 579 288 568 255 b 568 208 568 213 568 210 b 571 183 570 195 570 184 l 571 183 b 594 201 571 183 582 191 l 634 231 b 660 259 653 247 656 248 b 664 278 662 266 664 272 b 627 326 664 299 649 320 ', + }, + keyboardPedalUp: { + x_min: -1.359375, + x_max: 592.078125, + ha: 604, + o: 'm 280 692 b 295 694 283 692 289 694 b 310 692 300 694 307 692 b 357 630 340 684 357 657 b 336 580 357 612 351 594 b 311 538 321 566 311 549 b 352 492 311 512 330 492 b 366 495 357 492 362 492 b 397 553 390 503 397 517 b 415 603 397 576 402 591 b 460 623 427 617 443 623 b 509 599 479 623 498 614 b 522 559 518 587 522 573 b 494 506 522 538 513 519 b 451 495 481 498 473 496 b 415 488 432 495 426 494 b 394 449 404 483 394 464 b 394 448 394 448 394 448 l 394 440 l 397 433 b 428 409 404 420 413 413 b 438 408 431 408 435 408 b 479 431 450 408 462 415 b 528 455 495 448 510 455 b 548 452 534 455 541 453 b 592 391 577 442 592 416 b 549 331 592 365 577 340 b 528 327 541 328 534 327 b 479 351 510 327 495 335 b 438 374 464 367 450 374 b 417 369 431 374 424 373 b 394 333 402 360 394 348 b 400 312 394 326 396 319 b 451 287 408 294 420 288 b 513 258 484 285 499 278 b 522 223 519 247 522 234 b 461 159 522 190 496 159 b 449 161 457 159 453 159 b 397 229 416 167 397 191 b 366 288 397 265 390 278 b 352 290 362 290 357 290 b 315 262 336 290 321 280 b 311 245 313 256 311 251 b 334 204 311 233 318 220 b 355 170 348 190 351 184 b 357 152 356 166 357 159 b 355 136 357 147 356 140 b 295 88 345 104 321 88 b 232 152 264 88 232 112 b 255 204 232 174 238 186 b 279 244 273 222 279 231 l 279 245 b 238 290 279 270 259 290 b 224 288 234 290 228 290 b 193 229 200 278 193 265 b 141 161 193 191 174 167 b 129 159 137 159 133 159 b 68 223 93 159 68 190 b 77 258 68 234 70 247 b 138 287 91 278 106 285 b 185 302 166 287 175 291 b 196 333 193 312 196 323 b 174 369 196 347 187 360 b 152 374 166 373 159 374 b 111 351 140 374 126 367 b 62 327 95 335 80 327 b 51 328 58 327 54 327 b -1 391 16 334 -1 363 b 53 455 -1 420 17 449 b 62 455 57 455 59 455 b 111 431 80 455 95 448 b 152 408 127 415 140 408 b 161 409 155 408 159 408 b 193 433 176 413 186 420 l 196 440 l 196 448 b 196 451 196 449 196 449 b 190 471 196 459 194 463 b 137 495 182 489 167 495 l 134 495 l 134 495 b 68 560 95 495 68 521 b 129 623 68 596 95 623 b 144 621 134 623 138 623 b 193 553 175 614 193 589 b 224 495 193 517 200 503 b 238 492 228 492 234 492 b 279 538 259 492 279 512 b 254 580 279 549 269 566 b 232 630 239 594 232 612 b 280 692 232 657 250 684 m 307 456 b 295 458 303 458 299 458 b 230 391 258 458 230 426 b 236 360 230 381 231 371 b 295 324 249 337 272 324 b 353 360 318 324 341 337 b 360 391 357 370 360 381 b 307 456 360 421 340 451 ', + }, + pictChokeCymbal: { + x_min: 0, + x_max: 227.3125, + ha: 232, + o: 'm 91 213 b 100 215 93 215 96 215 b 227 58 167 215 224 144 b 227 52 227 56 227 54 b 61 -201 227 -43 164 -138 b 29 -216 44 -212 36 -216 b 23 -210 27 -216 24 -213 b 21 -205 21 -208 21 -206 b 34 -192 21 -201 25 -197 b 122 -55 89 -161 122 -106 b 104 6 122 -33 117 -12 l 103 9 l 96 9 b 4 79 57 9 17 38 b 0 112 1 90 0 101 b 91 213 0 163 36 209 ', + }, + wiggleArpeggiatoUp: { + x_min: 58.53125, + x_max: 228.671875, + ha: 294, + o: 'm 138 371 b 142 373 140 371 141 373 b 178 342 149 373 156 366 b 228 251 217 297 228 278 b 228 244 228 248 228 247 b 176 147 227 212 212 184 b 123 73 152 122 132 93 b 121 62 122 70 121 66 b 145 13 121 48 129 31 b 153 -2 151 6 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 145 -11 b 129 -1 140 -11 136 -8 b 61 87 89 37 68 68 b 58 113 59 95 58 105 b 110 215 58 144 74 177 b 163 287 134 240 155 269 b 166 299 166 291 166 295 b 141 348 166 313 157 330 b 133 360 134 356 133 358 b 133 363 133 362 133 362 b 138 371 133 367 136 370 ', + }, + arrowheadBlackUp: { + x_min: -10.890625, + x_max: 299.4375, + ha: 294, + o: 'm 136 460 b 142 462 137 462 140 462 b 166 449 152 462 161 456 b 171 428 168 446 168 445 b 288 131 194 322 238 209 b 298 115 295 120 296 117 b 299 106 298 112 299 109 b 273 81 299 91 287 81 b 255 86 268 81 261 83 b 155 116 225 104 183 116 l 152 116 l 149 108 b 141 83 148 102 144 91 b 134 48 137 69 134 58 b 149 9 134 34 140 24 b 153 -1 152 5 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 147 -11 b 122 2 138 -11 133 -6 b 95 61 104 20 95 38 b 107 108 95 74 99 90 b 108 113 107 111 108 112 b 107 113 108 113 108 113 b 102 113 106 113 104 113 b 31 86 76 108 53 98 b 14 80 24 81 20 80 b -10 106 0 80 -10 91 b 0 131 -10 115 -9 116 b 115 430 49 209 91 317 b 136 460 119 451 123 456 ', + }, + arrowheadBlackDown: { + x_min: -10.890625, + x_max: 298.078125, + ha: 294, + o: 'm 138 473 b 142 474 140 473 141 474 b 164 459 148 474 153 470 b 191 402 183 442 191 423 b 181 353 191 388 187 371 b 178 349 179 352 178 349 b 179 348 178 348 179 348 b 185 349 181 348 182 348 b 255 376 210 355 234 363 b 272 381 264 381 266 381 b 298 355 287 381 298 370 b 288 330 298 348 298 345 b 171 34 238 254 194 141 b 166 13 168 16 168 16 b 144 1 161 5 152 1 b 121 15 134 1 125 5 b 115 33 119 18 117 24 b 0 330 91 145 49 252 b -10 355 -9 345 -10 348 b 13 381 -10 371 0 381 b 31 376 19 381 25 380 b 132 345 61 358 103 345 l 136 345 l 137 355 b 145 378 138 359 142 370 b 152 415 149 394 152 405 b 137 452 152 427 148 438 b 133 464 134 458 133 460 b 138 473 133 467 134 470 ', + }, + vexAccidentalMicrotonal1: { + x_min: -171.5, + x_max: 483.1875, + ha: 493, + o: 'm -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 495 20 616 20 616 b 20 373 20 427 20 373 b 115 410 20 373 63 390 l 210 448 l 210 531 b 212 620 210 614 210 616 b 231 632 215 628 223 632 b 246 627 236 632 242 631 b 251 541 251 620 251 628 l 251 463 l 315 489 b 387 514 368 509 381 514 b 393 513 390 514 392 514 b 406 494 402 510 406 502 b 397 476 406 487 404 480 b 323 446 396 474 363 462 l 251 417 l 251 283 l 251 148 l 254 151 b 370 199 291 183 332 199 b 415 191 385 199 400 197 b 483 84 458 176 483 134 b 461 0 483 58 476 29 b 332 -142 439 -40 411 -72 l 255 -215 b 231 -229 240 -229 239 -229 b 216 -223 224 -229 220 -227 b 210 -158 210 -217 210 -223 b 210 -120 210 -148 210 -136 l 210 -29 l 205 -34 b 100 -142 182 -65 159 -88 l 23 -215 b -1 -229 9 -229 6 -229 b -19 -217 -9 -229 -16 -224 l -20 -215 l -21 48 l -21 310 l -83 287 b -152 262 -133 266 -145 262 b -157 263 -153 262 -155 262 b -171 283 -166 266 -171 274 b -161 301 -171 290 -167 297 b -91 328 -160 302 -129 315 l -21 356 l -21 487 l -20 617 l -19 621 b -8 631 -17 626 -12 630 m 210 288 b 210 401 210 351 210 401 b 114 365 209 401 167 384 l 20 327 l 20 238 l 20 148 l 21 151 b 140 199 59 183 102 199 b 206 180 164 199 187 192 l 209 177 b 209 177 209 177 209 177 b 210 288 210 177 210 199 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 m 341 131 b 328 133 337 133 332 133 b 322 133 326 133 323 133 b 257 87 296 129 273 113 l 251 80 l 251 -37 l 251 -156 l 255 -152 b 375 81 328 -72 375 20 l 375 83 b 341 131 375 113 367 126 ', + }, + vexAccidentalMicrotonal2: { + x_min: -1.359375, + x_max: 386.5625, + ha: 394, + o: 'm 249 535 b 257 537 251 537 253 537 b 276 524 266 537 273 533 l 277 521 l 279 419 l 279 316 l 304 323 b 337 328 319 326 330 328 b 353 316 347 328 349 324 b 355 266 355 315 355 290 b 353 215 355 241 355 217 b 319 198 349 206 347 205 b 279 187 284 190 279 188 b 279 156 279 187 279 174 b 279 136 279 151 279 144 l 279 84 l 289 87 l 330 98 b 367 105 352 102 362 105 b 378 101 372 105 375 104 b 386 61 385 95 386 94 b 386 40 386 55 386 48 l 386 -5 l 385 -8 b 374 -19 383 -12 378 -18 b 291 -40 372 -19 347 -26 b 279 -43 284 -41 279 -43 b 279 -83 279 -43 279 -59 b 279 -95 279 -87 279 -91 l 279 -145 l 304 -140 b 337 -133 321 -136 330 -133 b 349 -140 343 -133 347 -136 b 355 -181 355 -145 355 -142 l 355 -197 l 355 -210 b 349 -252 355 -249 355 -247 b 300 -269 345 -258 347 -258 b 280 -274 291 -272 281 -273 l 279 -274 l 277 -378 l 277 -483 l 276 -487 b 257 -499 273 -495 265 -499 b 238 -487 249 -499 242 -495 l 236 -483 l 236 -384 l 236 -285 l 235 -285 l 212 -291 l 170 -301 b 148 -308 159 -305 148 -306 b 147 -415 147 -308 147 -313 l 147 -523 l 145 -526 b 126 -538 141 -534 133 -538 b 106 -526 118 -538 110 -534 l 104 -523 l 104 -420 b 103 -317 104 -326 104 -317 b 103 -317 103 -317 103 -317 b 50 -330 92 -322 54 -330 b 31 -317 42 -330 35 -326 b 29 -267 29 -315 29 -315 l 29 -219 l 32 -216 b 92 -192 36 -206 36 -206 l 104 -190 l 104 -138 b 103 -87 104 -91 104 -87 b 103 -87 103 -87 103 -87 b 88 -91 103 -87 96 -88 l 49 -101 b 17 -106 32 -105 23 -106 b 6 -102 13 -106 10 -105 b -1 -62 0 -97 -1 -95 b 0 -41 -1 -56 0 -49 l 0 4 l 1 6 b 10 16 2 11 6 15 b 91 37 12 18 38 24 l 104 41 l 104 93 b 103 144 104 140 104 144 b 103 144 103 144 103 144 b 50 131 92 141 54 131 b 31 144 42 131 35 137 b 29 195 29 147 29 148 l 29 242 l 32 245 b 92 269 36 255 36 255 l 104 273 l 104 377 l 104 481 l 106 485 b 126 498 110 492 118 498 b 134 495 129 498 132 496 b 145 485 138 494 142 489 l 147 481 l 147 383 l 147 283 l 152 284 b 190 294 155 285 171 290 l 230 303 l 236 305 l 236 413 l 236 521 l 238 524 b 249 535 240 528 243 533 m 236 126 b 235 177 236 154 236 177 l 235 177 b 213 172 235 177 225 174 l 170 161 b 147 155 157 158 147 155 b 147 124 147 155 147 142 b 147 102 147 117 147 111 l 147 52 l 153 54 l 228 72 l 236 74 l 236 126 m 236 -105 b 235 -54 236 -65 236 -54 l 235 -54 b 231 -55 235 -54 234 -54 b 172 -69 227 -55 204 -62 l 149 -76 l 147 -76 l 147 -127 l 147 -179 l 152 -177 b 190 -167 155 -177 171 -173 l 230 -158 l 236 -156 l 236 -105 ', + }, + vexWiggleArpeggioUp: { + x_min: 58.53125, + x_max: 228.671875, + ha: 294, + o: 'm 138 371 b 142 373 140 371 141 373 b 178 342 149 373 156 366 b 228 251 217 297 228 278 b 228 244 228 248 228 247 b 176 147 227 212 212 184 b 123 73 152 122 132 93 b 121 62 122 70 121 66 b 145 13 121 48 129 31 b 153 -2 151 6 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 145 -11 b 129 -1 140 -11 136 -8 b 61 87 89 37 68 68 b 58 113 59 95 58 105 b 110 215 58 144 74 177 b 163 287 134 240 155 269 b 166 299 166 291 166 295 b 141 348 166 313 157 330 b 133 360 134 356 133 358 b 133 363 133 362 133 362 b 138 371 133 367 136 370 ', + }, + vexNoteHeadMutedBreve: { + x_min: 0, + x_max: 370.21875, + ha: 378, + o: 'm 0 0 l 0 277 l 61 277 l 122 277 l 122 0 l 122 -278 l 61 -278 l 0 -278 l 0 0 m 246 -1 l 246 277 l 308 277 l 370 277 l 370 -1 l 370 -278 l 308 -278 l 246 -278 l 246 -1 ', + }, + }, + cssFontWeight: 'normal', + ascender: 1903, + underlinePosition: -125, + cssFontStyle: 'normal', + boundingBox: { + yMin: -2065.375, + xMin: -695.53125, + yMax: 1901.578125, + xMax: 1159.671875, + }, + resolution: 1000, + original_font_information: { + postscript_name: 'Gonville-18', + version_string: 'Version 0.1.8904 ', + vendor_url: '', + full_font_name: 'Gonville-18', + font_family_name: 'Gonville-18', + copyright: 'No copyright is claimed on this font file.', + description: '', + trademark: '', + designer: '', + designer_url: '', + unique_font_identifier: 'FontForge 2.0 : Gonville-18 : 17-3-2010', + license_url: '', + license_description: '', + manufacturer_name: '', + font_sub_family_name: '18', + }, + descender: -2066, + fontFamily: 'Gonville-18', + lineHeight: 4093, + underlineThickness: 50, +}; diff --git a/build/esm/src/fonts/gonville_metrics.js b/build/esm/src/fonts/gonville_metrics.js new file mode 100644 index 0000000000..0f4bcfda96 --- /dev/null +++ b/build/esm/src/fonts/gonville_metrics.js @@ -0,0 +1,415 @@ +export const GonvilleMetrics = { + name: 'Gonville', + smufl: false, + stave: { + padding: 12, + endPaddingMax: 10, + endPaddingMin: 5, + unalignedNotePadding: 10, + }, + accidental: { + noteheadAccidentalPadding: 1, + leftPadding: 2, + accidentalSpacing: 3, + }, + clef: { + default: { + point: 40, + width: 26, + }, + small: { + point: 32, + width: 20, + }, + annotations: { + '8va': { + smuflCode: 'timeSig8', + default: { + point: 20, + treble: { + line: -1.2, + shiftX: 11, + }, + }, + small: { + point: 18, + treble: { + line: -0.4, + shiftX: 8, + }, + }, + }, + '8vb': { + smuflCode: 'timeSig8', + default: { + point: 20, + treble: { + line: 6.3, + shiftX: 10, + }, + bass: { + line: 4, + shiftX: 1, + }, + }, + small: { + point: 18, + treble: { + line: 5.8, + shiftX: 6, + }, + bass: { + line: 3.5, + shiftX: 0.5, + }, + }, + }, + }, + lineCount: { + '8': { point: 55, shiftY: 14 }, + '7': { point: 47, shiftY: 8 }, + '6': { point: 40, shiftY: 1 }, + '5': { point: 30, shiftY: -6 }, + '4': { point: 23, shiftY: -12 }, + }, + }, + parenthesis: { + default: { + point: 39, + width: 7, + }, + gracenote: { + point: (39 * 3) / 5, + width: 3, + }, + }, + pedalMarking: { + up: { + point: 40, + }, + down: { + point: 40, + }, + }, + digits: { + point: 40, + tupletPoint: 28, + }, + tremolo: { + default: { + point: 25, + spacing: 4, + offsetYStemUp: -7, + offsetYStemDown: 7, + offsetXStemUp: 9, + offsetXStemDown: -0.5, + }, + grace: { + point: 15, + spacing: 4, + offsetYStemUp: -7, + offsetYStemDown: 7, + offsetXStemUp: 6.5, + offsetXStemDown: -0.5, + }, + }, + staveRepetition: { + default: { + offsetY: 25, + offsetSymbol: 12, + spacing: 5, + }, + }, + stem: { + heightAdjustmentForFlag: -3, + noteHead: { + noteheadTriangleUpHalf: { + offsetYBaseStemUp: 5, + offsetYBaseStemDown: 4, + }, + noteheadTriangleUpBlack: { + offsetYBaseStemUp: 5, + offsetYBaseStemDown: 4, + }, + noteheadTriangleUpWhole: { + offsetYBaseStemUp: 5, + offsetYBaseStemDown: 4, + }, + noteheadXHalf: { + offsetYBaseStemUp: -4, + offsetYBaseStemDown: 4, + }, + noteheadXBlack: { + offsetYBaseStemUp: -4, + offsetYBaseStemDown: 4, + }, + noteheadXWhole: { + offsetYBaseStemUp: -4, + offsetYBaseStemDown: 4, + }, + noteheadHalf: { + offsetYBaseStemUp: -1.5, + offsetYBaseStemDown: 1.5, + }, + noteheadBlack: { + offsetYBaseStemUp: -1.5, + offsetYBaseStemDown: 1.5, + }, + noteheadSquareWhite: { + offsetYBaseStemDown: -5, + offsetYBaseStemUp: 5, + }, + }, + }, + glyphs: { + flag: { + shiftX: -0.08, + flag8thDown: { + shiftX: -0.16, + }, + flag16thDown: { + shiftX: -0.16, + }, + flag32ndDown: { + shiftX: -0.16, + shiftY: 9, + }, + flag64thDown: { + shiftX: -0.16, + shiftY: 13, + }, + flag128thDown: { + shiftX: -0.16, + shiftY: 22, + }, + flag32ndUp: { + shiftY: -9, + }, + flag64thUp: { + shiftY: -13, + }, + flag128thUp: { + shiftY: -22, + }, + }, + stringNumber: { + verticalPadding: 8, + stemPadding: 2, + leftPadding: 5, + rightPadding: 6, + }, + textNote: { + point: 40, + default: {}, + ornamentTrill: { + shiftX: -5, + shiftY: 4, + }, + }, + noteHead: { + minPadding: 2, + custom: { + noteheadDiamondWholeStemUp: { + shiftX: -6, + }, + noteheadCircleXStemUp: { + shiftX: -1.5, + }, + noteheadXWholeStemUp: { + shiftX: -5, + }, + noteheadTriangleUpWholeStemUp: { + shiftX: -6, + }, + }, + }, + chordSymbol: { + global: { + superscriptOffset: -400, + subscriptOffset: 300, + kerningOffset: -250, + lowerKerningText: ['D', 'F', 'P', 'T', 'V', 'Y'], + upperKerningText: ['A', 'L'], + spacing: 100, + superSubRatio: 0.66, + }, + csymDiminished: { + scale: 0.8, + leftSideBearing: 0, + advanceWidth: 506, + yOffset: 0, + }, + csymHalfDiminished: { + scale: 0.8, + leftSideBearing: -32, + advanceWidth: 506, + yOffset: 0, + }, + csymAugmented: { + scale: 1, + leftSideBearing: 0, + advanceWidth: 530, + yOffset: 0, + }, + csymParensLeftTall: { + scale: 0.8, + leftSideBearing: 0, + advanceWidth: 155, + yOffset: 250, + }, + csymParensRightTall: { + scale: 0.8, + leftSideBearing: -40, + advanceWidth: 189, + yOffset: 250, + }, + csymBracketLeftTall: { + scale: 0.8, + leftSideBearing: 0, + advanceWidth: 328, + yOffset: 0, + }, + csymBracketRightTall: { + scale: 0.8, + leftSideBearing: 1, + advanceWidth: 600, + yOffset: 0, + }, + csymParensLeftVeryTall: { + scale: 0.9, + leftSideBearing: 0, + advanceWidth: 121, + yOffset: 350, + }, + csymParensRightVeryTall: { + scale: 0.9, + leftSideBearing: 50, + advanceWidth: 111, + yOffset: 350, + }, + csymDiagonalArrangementSlash: { + scale: 0.6, + leftSideBearing: -1, + advanceWidth: 990, + yOffset: 0, + }, + csymMinor: { + scale: 0.8, + leftSideBearing: 0, + advanceWidth: 482, + yOffset: 0, + }, + csymMajorSeventh: { + scale: 0.9, + leftSideBearing: 200, + yOffset: 0, + advanceWidth: 600, + }, + accidentalSharp: { + scale: 0.75, + leftSideBearing: 40, + advanceWidth: 250, + yOffset: -402, + }, + accidentalFlat: { + scale: 0.95, + leftSideBearing: -50, + advanceWidth: 208, + yOffset: -184, + }, + }, + jazzOrnaments: { + brassScoop: { + scale: 1.0, + xOffset: -12, + yOffset: 0, + stemUpYOffset: 0, + reportedWidth: 10, + }, + brassDoitMedium: { + scale: 1.0, + xOffset: 16, + yOffset: 0, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassFallLipShort: { + scale: 1.0, + xOffset: 17, + yOffset: 0, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassLiftMedium: { + scale: 1.0, + xOffset: 16, + yOffset: 5, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassFallRoughMedium: { + scale: 1.0, + xOffset: 16, + yOffset: 28, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassBend: { + scale: 1.0, + xOffset: 2, + yOffset: -8, + stemUpYOffset: 24, + reportedWidth: 5, + }, + brassMuteClosed: { + scale: 1.0, + xOffset: 3, + yOffset: -9, + stemUpYOffset: 24, + reportedWidth: 5, + }, + brassMuteOpen: { + scale: 1.0, + xOffset: 3, + yOffset: -7, + stemUpYOffset: 25, + reportedWidth: 5, + }, + brassFlip: { + scale: 1.0, + xOffset: 10, + yOffset: -4, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassJazzTurn: { + scale: 1.0, + xOffset: 6, + yOffset: -4, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassSmear: { + scale: 1.0, + xOffset: 10, + yOffset: -4, + stemUpYOffset: 0, + reportedWidth: 5, + }, + }, + tremolo: { + default: { + shiftY: -10, + }, + grace: { + shiftY: -5, + }, + }, + tuplet: { + noteHeadOffset: 20, + stemOffset: 10, + bottomLine: 4, + topModifierOffset: 15, + }, + }, +}; diff --git a/build/esm/src/fonts/load_all.js b/build/esm/src/fonts/load_all.js new file mode 100644 index 0000000000..ace8f9b177 --- /dev/null +++ b/build/esm/src/fonts/load_all.js @@ -0,0 +1,10 @@ +import { loadBravura } from './load_bravura.js'; +import { loadCustom } from './load_custom.js'; +import { loadGonville } from './load_gonville.js'; +import { loadPetaluma } from './load_petaluma.js'; +export function loadAllMusicFonts() { + loadBravura(); + loadGonville(); + loadPetaluma(); + loadCustom(); +} diff --git a/build/esm/src/fonts/load_bravura.js b/build/esm/src/fonts/load_bravura.js new file mode 100644 index 0000000000..db708aa73b --- /dev/null +++ b/build/esm/src/fonts/load_bravura.js @@ -0,0 +1,6 @@ +import { Font } from '../font.js'; +import { BravuraFont } from './bravura_glyphs.js'; +import { BravuraMetrics } from './bravura_metrics.js'; +export function loadBravura() { + Font.load('Bravura', BravuraFont, BravuraMetrics); +} diff --git a/build/esm/src/fonts/load_custom.js b/build/esm/src/fonts/load_custom.js new file mode 100644 index 0000000000..0a1bb4f9df --- /dev/null +++ b/build/esm/src/fonts/load_custom.js @@ -0,0 +1,6 @@ +import { Font } from '../font.js'; +import { CustomFont } from './custom_glyphs.js'; +import { CustomMetrics } from './custom_metrics.js'; +export function loadCustom() { + Font.load('Custom', CustomFont, CustomMetrics); +} diff --git a/build/esm/src/fonts/load_gonville.js b/build/esm/src/fonts/load_gonville.js new file mode 100644 index 0000000000..16980d80cc --- /dev/null +++ b/build/esm/src/fonts/load_gonville.js @@ -0,0 +1,6 @@ +import { Font } from '../font.js'; +import { GonvilleFont } from './gonville_glyphs.js'; +import { GonvilleMetrics } from './gonville_metrics.js'; +export function loadGonville() { + Font.load('Gonville', GonvilleFont, GonvilleMetrics); +} diff --git a/build/esm/src/fonts/load_petaluma.js b/build/esm/src/fonts/load_petaluma.js new file mode 100644 index 0000000000..c3d416ba25 --- /dev/null +++ b/build/esm/src/fonts/load_petaluma.js @@ -0,0 +1,6 @@ +import { Font } from '../font.js'; +import { PetalumaFont } from './petaluma_glyphs.js'; +import { PetalumaMetrics } from './petaluma_metrics.js'; +export function loadPetaluma() { + Font.load('Petaluma', PetalumaFont, PetalumaMetrics); +} diff --git a/build/esm/src/fonts/petaluma_glyphs.js b/build/esm/src/fonts/petaluma_glyphs.js new file mode 100644 index 0000000000..b59340e38e --- /dev/null +++ b/build/esm/src/fonts/petaluma_glyphs.js @@ -0,0 +1,1335 @@ +export const PetalumaFont = { + glyphs: { + bracketTop: { + x_min: 0, + x_max: 508, + y_min: 0, + y_max: 370, + ha: 370, + o: 'm 22 0 b 122 0 55 1 89 0 l 157 0 b 713 376 425 0 622 137 b 732 467 724 406 732 436 b 726 514 732 482 730 498 b 711 533 723 528 719 533 b 693 526 707 533 700 530 b 674 498 683 520 678 508 b 635 406 662 467 652 435 b 310 164 560 281 458 193 b 154 151 258 154 206 151 b 39 154 117 151 78 154 b 1 120 17 154 4 145 b 0 84 0 108 0 96 b 0 20 0 63 1 40 b 22 0 0 4 7 0 z', + }, + bracketBottom: { + x_min: 0, + x_max: 496, + y_min: -393, + y_max: 0, + ha: 393, + o: 'm 696 -566 b 711 -539 713 -566 708 -549 b 714 -521 713 -533 714 -527 b 713 -508 714 -517 713 -513 b 661 -327 706 -445 688 -384 b 392 -42 603 -203 513 -109 b 206 0 331 -7 266 0 b 160 -1 190 0 174 -1 b 26 -1 107 -1 66 -3 b 0 -19 12 -1 0 -4 l 0 -23 b 3 -50 1 -32 3 -42 b 1 -86 3 -62 1 -73 b 4 -118 1 -96 1 -108 b 45 -151 10 -145 23 -154 b 180 -143 89 -144 135 -145 b 621 -419 392 -135 523 -236 b 662 -539 641 -456 655 -497 b 696 -566 667 -557 680 -566 z', + }, + barlineTick: { + x_min: 0, + x_max: 56.036101509664164, + y_min: 876.905249806889, + y_max: 1121.5430338167066, + ha: 244.63778400981766, + o: 'm 42 1263 b 66 1287 62 1261 66 1272 b 81 1583 65 1387 72 1485 b 35 1614 82 1610 53 1610 b 14 1591 17 1619 16 1604 b 0 1408 7 1525 0 1459 l 0 1292 b 42 1263 1 1263 23 1266 z', + }, + breathMarkTick: { + x_min: 0, + x_max: 568, + y_min: 0, + y_max: 621, + ha: 621, + o: 'm 258 0 b 278 39 276 0 274 24 b 279 56 279 45 279 50 l 279 73 b 278 117 279 88 278 102 b 281 148 278 127 279 138 b 536 600 312 330 387 487 b 744 719 600 651 670 690 b 815 779 775 730 808 740 b 818 824 818 793 818 808 b 815 868 818 838 818 852 b 796 894 814 881 808 894 b 779 888 791 894 786 893 b 719 864 760 878 739 871 b 372 602 580 806 459 724 b 229 252 298 498 251 383 b 220 268 225 262 222 264 b 209 302 217 279 213 291 b 75 527 181 387 143 467 b 16 563 58 543 39 573 b 0 539 3 557 0 549 b 12 492 0 524 9 507 b 56 400 19 459 22 425 b 163 269 104 367 138 323 b 238 36 197 194 216 115 b 258 0 242 22 243 0 z', + }, + segno: { + x_min: 0, + x_max: 798, + y_min: -65, + y_max: 806, + ha: 871, + o: 'm 16 -94 b 66 -69 39 -92 53 -85 b 177 59 102 -26 138 17 b 543 456 298 192 420 324 b 726 300 615 420 680 373 b 753 217 744 271 753 243 b 655 112 753 170 719 131 b 599 104 636 107 618 104 b 461 173 544 104 495 128 b 432 190 454 183 444 190 b 409 179 425 190 418 187 b 359 118 390 160 373 141 b 341 72 347 101 341 86 b 373 24 341 56 351 40 b 409 6 384 17 396 10 b 550 -13 454 -12 501 -14 b 599 -6 566 -12 583 -10 b 864 213 720 27 806 104 b 886 300 878 242 886 271 b 857 395 886 331 877 363 b 799 467 840 420 821 445 b 648 572 755 513 704 546 b 1110 1083 802 743 955 914 b 1140 1129 1123 1097 1136 1110 b 1149 1148 1142 1135 1149 1142 b 1145 1153 1149 1149 1148 1152 b 1123 1161 1139 1158 1130 1161 b 1109 1156 1119 1161 1113 1159 b 1089 1138 1102 1151 1094 1145 b 946 988 1040 1089 989 1041 b 595 602 834 855 711 732 l 590 598 l 549 615 b 432 793 462 647 432 723 b 534 888 432 851 474 888 b 671 834 588 888 631 864 b 710 818 684 824 696 818 b 724 821 714 818 719 819 b 809 883 757 834 788 852 b 816 901 814 890 816 896 b 802 923 816 910 812 916 b 706 984 770 945 742 971 b 593 1011 668 998 631 1011 b 516 991 567 1011 541 1005 b 333 799 433 949 380 876 b 302 693 312 765 302 729 b 330 589 302 658 311 624 b 469 488 360 533 415 511 b 485 482 475 487 480 485 b 266 249 412 405 338 327 b 121 88 217 196 170 141 b 9 -65 78 40 37 -7 b 0 -85 4 -72 0 -79 b 16 -94 0 -91 4 -94 z m 861 536 b 927 575 890 539 909 557 b 965 628 952 598 965 613 b 926 680 965 644 952 658 b 865 713 900 701 883 713 b 805 667 845 713 828 698 b 768 611 791 649 770 631 b 812 564 766 589 798 582 b 861 536 824 550 840 537 z m 251 350 b 363 436 285 348 353 403 b 354 456 366 448 360 452 b 271 518 327 477 298 497 b 243 528 261 526 252 528 b 210 513 232 528 222 523 b 157 454 190 494 176 472 b 141 428 147 444 141 436 b 158 406 141 420 147 413 b 216 361 180 393 197 376 b 245 350 225 356 235 350 z', + }, + coda: { + x_min: 0, + x_max: 1380, + y_min: -196, + y_max: 1037, + ha: 1233, + o: 'm 1028 -282 b 1057 -245 1045 -282 1053 -261 b 1060 -203 1060 -232 1060 -217 b 1063 9 1060 -132 1061 -62 b 1390 194 1192 22 1303 81 b 1531 543 1467 298 1512 415 b 1532 556 1531 547 1532 552 b 1904 559 1656 557 1780 559 b 1950 582 1920 559 1941 569 b 1987 674 1970 609 1987 638 b 1984 698 1987 681 1986 690 b 1950 700 1973 698 1961 700 l 1941 700 l 1545 696 b 1535 776 1545 723 1541 749 b 1103 1113 1477 996 1326 1107 b 1080 1115 1096 1115 1087 1115 b 1081 1322 1080 1184 1080 1253 b 1079 1467 1083 1371 1081 1418 b 1061 1493 1079 1476 1080 1493 l 1060 1493 b 1028 1467 1044 1490 1031 1485 b 1020 1403 1025 1446 1020 1424 b 1017 1110 1020 1305 1018 1208 l 962 1106 b 569 914 808 1087 671 1035 b 451 683 510 844 472 766 l 161 678 b 118 680 148 678 132 680 b 79 670 101 680 86 678 b 0 544 48 636 29 592 l 37 544 l 429 549 b 428 518 428 539 428 528 b 488 285 428 435 458 360 b 681 81 526 192 593 124 b 946 9 763 40 854 19 b 1008 6 966 7 988 6 b 1005 -137 1008 -42 1005 -89 b 1012 -243 1005 -173 1005 -209 b 1028 -282 1015 -258 1011 -282 z m 1074 690 b 1079 935 1077 772 1077 852 b 1326 855 1166 932 1250 909 b 1446 694 1385 814 1426 759 b 1269 693 1387 694 1328 693 b 1074 690 1204 693 1139 691 z m 577 684 b 766 874 618 763 678 828 b 989 932 837 912 913 923 b 1015 933 998 932 1007 933 b 1014 822 1015 896 1014 860 b 1011 688 1012 791 1012 743 z m 1067 184 b 1071 553 1070 307 1068 429 b 1439 556 1194 553 1316 554 b 1437 554 1439 554 1437 554 b 1341 337 1413 478 1387 402 b 1119 192 1286 261 1211 212 b 1067 184 1102 189 1084 186 z m 1008 180 b 660 264 886 181 770 212 b 524 471 570 305 524 374 b 528 524 524 488 526 505 l 533 549 b 792 552 619 550 706 550 b 1009 553 865 553 937 552 b 1008 180 1009 428 1008 288 z', + }, + gClef: { + x_min: 0, + x_max: 664, + y_min: -559, + y_max: 1009, + ha: 1568, + o: 'm 343 -805 b 366 -801 350 -805 357 -804 b 409 -773 383 -795 397 -786 b 582 -328 528 -648 577 -497 b 583 -294 582 -315 583 -294 b 612 -279 583 -294 603 -282 b 747 -197 660 -256 706 -230 b 949 143 857 -109 920 10 b 956 206 955 164 956 186 b 791 384 956 297 906 363 b 704 393 762 390 733 393 b 498 336 632 393 563 374 b 481 325 490 331 481 325 l 444 465 b 442 485 442 472 442 485 b 609 880 442 485 589 746 b 619 996 616 919 619 958 b 613 1084 619 1027 618 1056 b 534 1387 599 1188 560 1286 b 482 1453 527 1417 517 1453 b 422 1407 456 1453 438 1428 b 305 1063 348 1305 312 1188 b 304 1002 304 1043 304 1022 b 338 654 304 886 323 769 b 343 629 338 645 341 636 b 144 356 278 537 206 451 b 23 144 101 288 53 220 b 0 20 7 107 0 63 b 82 -210 0 -69 30 -160 b 207 -288 112 -239 160 -271 b 410 -328 274 -312 340 -328 b 474 -324 431 -328 452 -327 l 491 -321 b 491 -341 491 -321 492 -334 b 402 -585 475 -428 454 -513 b 294 -668 374 -622 348 -664 b 271 -693 278 -670 271 -680 b 274 -708 271 -698 272 -703 b 302 -775 282 -730 292 -753 b 343 -805 311 -795 325 -805 z m 400 717 b 382 922 389 786 382 854 b 481 1286 382 1047 408 1169 b 507 1125 498 1233 507 1179 b 500 1040 507 1097 504 1068 b 400 717 481 927 455 818 z m 252 -135 b 196 -121 232 -134 215 -127 b 117 -69 158 -108 127 -94 b 111 -32 112 -58 111 -45 b 117 19 111 -16 114 1 b 130 56 118 27 127 52 b 324 337 186 156 253 246 l 384 416 l 395 384 b 416 291 406 348 416 291 b 350 213 416 291 376 239 b 243 -42 278 143 243 55 b 251 -117 243 -66 246 -91 b 252 -135 252 -122 252 -127 z m 563 -91 b 510 168 552 3 530 78 b 513 192 508 179 508 186 b 624 202 550 199 586 202 b 730 192 660 202 694 199 b 850 141 773 183 816 176 b 858 134 852 138 855 135 b 595 -121 801 19 716 -68 l 569 -131 z m 410 -160 b 311 -147 360 -160 311 -147 b 307 -98 311 -147 307 -127 b 314 -33 307 -79 308 -56 b 429 131 328 36 377 85 b 441 138 433 135 438 138 b 449 122 446 138 448 132 b 490 -131 462 37 484 -46 b 490 -153 491 -140 490 -153 b 410 -160 490 -153 452 -163 z', + }, + cClef: { + x_min: 0, + x_max: 731, + y_min: -543, + y_max: 543, + ha: 1086, + o: 'm 131 -782 b 141 -755 138 -782 140 -773 b 147 -490 143 -667 145 -577 b 160 207 150 -258 153 -24 b 168 618 164 344 158 481 b 81 768 173 690 132 732 b 45 782 66 778 55 782 b 3 740 26 782 13 768 b 0 724 1 736 0 730 l 1 710 b 4 596 4 672 4 634 l 4 382 b 9 102 4 288 4 196 b 17 -301 13 -32 10 -166 l 17 -672 b 50 -736 17 -701 27 -720 b 109 -772 69 -749 91 -759 b 131 -782 120 -778 127 -782 z m 615 -770 b 881 -684 710 -770 801 -739 b 1020 -395 986 -612 1020 -510 b 1017 -334 1020 -374 1018 -354 b 769 -62 1007 -209 896 -75 b 746 -60 762 -60 755 -60 b 639 -73 710 -60 675 -69 b 524 -109 598 -79 560 -92 b 528 -36 526 -85 528 -60 b 527 -4 528 -26 528 -14 b 528 39 527 10 528 24 b 526 99 528 59 527 79 b 592 94 549 95 570 94 b 648 99 611 94 629 95 b 912 157 744 94 844 117 b 1053 377 1009 215 1053 284 b 1050 425 1053 393 1053 409 b 914 665 1037 521 986 602 b 717 753 855 717 791 753 b 626 734 688 753 658 747 l 462 665 b 347 500 374 628 347 580 b 350 449 347 484 348 468 b 392 419 353 428 367 416 b 492 438 425 425 459 428 b 541 498 524 448 541 468 b 540 514 541 503 541 508 b 537 546 537 524 537 536 b 573 639 537 580 550 611 b 606 657 582 649 593 657 l 609 657 b 716 622 647 652 684 647 b 834 372 801 556 834 469 b 831 323 834 356 832 338 b 743 187 825 266 795 217 b 710 176 732 180 720 176 b 694 179 704 176 700 177 b 527 223 638 193 582 206 b 495 229 516 228 505 229 b 454 220 481 229 468 225 b 395 189 432 213 415 200 b 363 180 384 186 374 181 b 348 168 356 179 348 176 b 340 161 343 167 340 164 b 347 150 340 157 343 154 b 356 147 348 148 353 147 b 364 92 361 130 363 111 b 369 -37 367 49 369 6 b 363 -154 369 -76 367 -115 b 357 -236 360 -183 357 -210 b 376 -264 357 -253 361 -259 b 456 -289 402 -284 429 -289 b 521 -282 478 -289 500 -285 b 549 -255 537 -279 546 -271 b 598 -177 556 -225 577 -202 b 622 -164 605 -168 613 -164 b 636 -167 626 -164 631 -166 b 749 -225 678 -177 714 -199 b 848 -405 814 -276 848 -337 b 824 -507 848 -436 840 -471 b 657 -657 792 -582 730 -625 b 608 -668 638 -664 622 -668 b 534 -602 572 -668 547 -645 b 513 -575 530 -589 523 -575 b 507 -576 510 -575 508 -575 b 478 -582 497 -580 488 -582 b 405 -570 454 -582 428 -570 b 389 -572 399 -570 395 -570 l 363 -572 b 321 -575 348 -572 333 -569 l 321 631 b 323 662 323 641 323 652 b 315 716 323 681 321 698 b 304 736 314 723 317 736 l 302 736 b 281 716 294 734 285 729 b 275 665 276 700 275 683 l 275 382 b 276 99 275 288 275 193 b 279 -170 278 10 276 -81 b 284 -399 282 -246 284 -323 b 282 -629 284 -475 282 -553 b 289 -721 282 -660 289 -690 b 300 -736 289 -727 291 -736 b 312 -724 307 -736 310 -730 b 321 -667 323 -706 321 -687 l 321 -632 l 328 -644 l 340 -657 b 510 -757 386 -707 445 -740 b 615 -770 546 -766 580 -770 z', + }, + fClef: { + x_min: 0, + x_max: 776, + y_min: -496, + y_max: 216, + ha: 712, + o: 'm 402 -706 b 804 -405 592 -678 716 -566 b 876 -53 861 -298 874 -183 b 868 33 876 -32 873 1 b 560 311 845 217 723 311 b 524 310 549 311 536 311 b 131 134 373 297 239 242 b 17 -29 84 86 37 39 b 9 -89 12 -50 9 -71 b 112 -238 9 -154 43 -206 b 124 -243 117 -239 120 -242 b 186 -261 145 -255 166 -261 b 268 -228 215 -261 242 -249 b 351 -59 325 -181 351 -124 b 343 10 351 -36 348 -13 b 340 36 341 19 340 27 b 409 105 340 75 363 102 b 441 107 420 107 431 107 b 624 36 510 107 573 86 b 744 -200 688 -27 724 -109 b 747 -230 747 -210 747 -222 b 717 -323 747 -264 736 -292 b 608 -445 688 -370 654 -410 b 307 -541 518 -513 415 -541 l 213 -541 b 39 -521 154 -541 96 -539 b 0 -552 17 -514 0 -531 b 1 -564 0 -556 0 -560 b 17 -611 6 -580 10 -596 b 101 -694 35 -648 50 -684 b 288 -714 164 -707 225 -714 b 402 -706 325 -714 363 -711 z m 1018 92 b 1080 118 1041 91 1068 96 b 1117 219 1099 150 1117 180 b 1113 252 1117 229 1116 240 b 1045 288 1102 297 1068 276 b 1017 262 1028 297 1024 274 b 984 124 989 220 996 170 b 1008 91 979 108 986 91 z m 972 -281 b 1070 -148 1024 -279 1070 -210 b 1025 -105 1070 -105 1045 -112 b 989 -127 1004 -96 998 -114 b 949 -249 963 -164 963 -209 b 969 -281 943 -265 949 -281 z', + }, + unpitchedPercussionClef1: { + x_min: 0, + x_max: 379.13761966945304, + y_min: -250, + y_max: 250, + ha: 500, + o: 'm 481 -360 b 507 -357 491 -360 500 -360 b 546 -295 541 -346 547 -325 b 536 79 543 -170 540 -46 b 523 311 533 157 534 235 b 475 359 518 340 508 359 b 425 360 459 359 442 360 b 400 359 416 360 409 360 b 337 294 348 353 340 347 l 337 -73 b 336 -264 337 -137 337 -200 b 343 -294 336 -274 338 -284 b 481 -360 359 -330 431 -360 z m 144 -341 b 207 -320 167 -341 189 -331 b 217 -301 215 -315 217 -308 b 210 -262 217 -289 210 -275 b 228 187 212 -112 209 37 b 228 287 228 220 229 253 b 174 353 228 336 222 343 b 120 359 157 357 138 359 b 48 357 96 359 72 356 b 17 323 29 357 19 344 b 7 120 16 255 9 187 b 6 -109 6 43 6 -33 l 6 -204 b 0 -251 6 -220 0 -235 b 3 -269 0 -256 0 -262 b 127 -340 24 -330 79 -328 b 144 -341 132 -341 138 -341 z', + }, + '6stringTabClef': { + x_min: 0, + x_max: 438, + y_min: -768, + y_max: 767, + ha: 1535, + o: 'm 369 438 b 374 439 370 438 372 438 b 384 462 383 444 384 452 l 384 474 b 390 697 386 547 390 622 b 373 1002 390 799 390 901 l 533 1002 b 560 1001 541 1004 552 1001 b 573 1007 567 1001 572 1002 b 546 1050 579 1025 559 1038 b 536 1056 543 1053 539 1053 b 324 1104 472 1102 397 1104 b 72 1090 238 1104 154 1099 b 55 1093 66 1090 60 1092 b 37 1073 46 1093 37 1089 b 60 1045 37 1061 48 1051 b 203 1001 105 1022 151 1001 b 233 1004 213 1001 223 1002 b 246 1005 238 1004 243 1005 b 272 975 264 1005 272 996 l 272 965 b 258 596 264 842 265 719 b 315 474 253 540 272 504 l 343 455 b 369 438 351 448 357 438 z m 114 -320 b 127 -304 120 -320 124 -315 b 171 -174 141 -261 158 -219 b 222 -135 179 -147 196 -137 b 426 -122 289 -131 359 -128 b 498 -164 462 -120 482 -127 b 628 -301 521 -226 575 -264 b 631 -288 631 -295 631 -291 b 628 -269 631 -281 629 -276 b 569 -134 616 -220 589 -179 b 408 225 514 -14 462 107 b 314 357 384 274 351 318 b 278 380 298 372 288 379 b 251 351 268 380 261 372 b 4 -209 156 171 75 -17 b 0 -228 1 -215 0 -222 b 19 -258 0 -240 7 -249 b 102 -314 45 -279 75 -294 b 114 -320 107 -318 111 -320 z m 425 6 b 360 20 403 17 382 20 b 274 14 331 20 302 14 l 246 14 l 340 206 b 425 6 369 137 395 75 z m 245 -1106 b 281 -1104 256 -1106 269 -1106 b 511 -888 400 -1094 511 -1035 b 454 -688 511 -814 504 -744 b 448 -678 449 -685 448 -681 b 454 -667 448 -675 449 -671 b 504 -497 503 -619 507 -559 b 324 -288 500 -383 436 -308 b 295 -287 314 -287 304 -287 l 282 -287 b 115 -330 223 -287 168 -307 b 94 -366 102 -336 94 -348 l 94 -370 b 96 -435 96 -392 96 -413 b 73 -858 89 -576 71 -717 b 78 -919 73 -878 78 -899 b 72 -950 78 -930 76 -940 b 63 -992 66 -965 63 -978 b 66 -1015 63 -999 65 -1008 b 173 -1104 84 -1106 84 -1106 b 245 -1106 197 -1104 220 -1104 z m 161 -622 b 147 -618 156 -622 151 -621 b 140 -600 141 -612 140 -606 b 144 -564 140 -589 144 -575 b 143 -554 144 -560 144 -557 l 143 -546 b 220 -451 144 -467 143 -465 b 278 -445 239 -446 259 -444 b 418 -497 328 -445 376 -461 b 429 -516 426 -504 429 -510 b 415 -533 429 -521 423 -527 b 219 -608 357 -579 287 -590 b 215 -609 217 -608 216 -609 b 161 -622 197 -609 177 -622 z m 154 -953 b 130 -933 135 -953 130 -948 l 130 -865 l 128 -865 b 135 -788 130 -838 124 -808 b 203 -769 145 -769 180 -776 b 259 -762 223 -765 242 -762 b 441 -852 330 -762 386 -805 b 449 -867 446 -858 449 -863 b 436 -884 449 -874 444 -878 b 318 -942 402 -914 363 -935 b 154 -953 264 -950 209 -953 z', + }, + timeSig0: { + x_min: 20, + x_max: 513, + y_min: -358.159536277652, + y_max: 359, + ha: 717.159536277652, + o: 'm 341 -516 b 420 -510 367 -516 395 -514 b 675 -338 533 -494 622 -448 b 737 -92 716 -256 734 -171 b 739 -35 739 -73 739 -53 b 680 305 739 86 720 207 b 400 517 622 449 537 517 b 337 514 380 517 359 517 b 289 507 321 511 305 513 b 91 317 192 477 127 412 b 29 9 50 212 29 108 b 217 -458 29 -157 88 -312 b 341 -516 251 -494 291 -518 z m 412 -452 b 359 -425 393 -452 376 -444 b 187 14 242 -301 179 -158 b 268 334 193 127 212 235 b 387 448 295 383 330 428 b 406 452 395 451 400 452 b 428 444 413 452 420 449 b 517 324 471 413 497 372 b 586 -29 560 222 586 86 b 556 -271 586 -112 585 -193 b 468 -422 536 -327 508 -377 b 412 -452 449 -442 431 -452 z', + }, + timeSig1: { + x_min: 20, + x_max: 283, + y_min: -364, + y_max: 366, + ha: 730, + o: 'm 264 -524 b 357 -510 297 -524 325 -516 b 374 -490 369 -508 374 -501 b 380 -438 376 -472 380 -455 l 406 246 b 408 301 408 265 408 282 b 400 445 408 348 405 396 b 288 527 395 491 338 527 b 253 520 276 527 264 526 b 240 508 249 517 245 513 b 49 409 192 445 127 413 b 29 396 33 408 29 403 b 32 380 29 392 30 386 b 59 363 36 366 49 364 b 164 348 95 356 130 348 b 222 357 183 348 203 351 b 238 361 228 360 233 360 b 252 334 248 361 252 353 b 243 59 252 242 249 150 b 219 -490 229 -124 233 -307 b 264 -524 217 -516 232 -524 z', + }, + timeSig2: { + x_min: 20, + x_max: 660.4636303241031, + y_min: -378.7201231608281, + y_max: 382, + ha: 760.720123160828, + o: 'm 99 -543 b 130 -533 111 -550 121 -540 b 255 -448 168 -501 213 -475 b 338 -425 282 -431 310 -425 b 392 -431 356 -425 374 -426 b 485 -462 423 -438 454 -451 b 648 -497 540 -482 595 -497 b 834 -441 711 -497 773 -480 b 950 -242 906 -395 958 -334 b 942 -210 950 -230 950 -215 b 912 -220 932 -204 920 -213 b 861 -264 894 -235 877 -248 b 775 -317 835 -289 808 -305 b 675 -334 742 -328 708 -334 b 510 -295 619 -334 563 -318 b 372 -264 465 -278 420 -264 b 305 -272 350 -264 328 -266 b 331 -242 318 -256 324 -249 b 490 -73 386 -187 438 -131 b 675 340 595 43 664 180 b 677 369 677 350 677 360 b 556 536 677 461 638 508 b 468 550 526 546 497 550 b 297 508 409 550 353 533 b 111 354 220 475 168 412 b 29 197 65 308 29 261 b 32 164 29 187 29 176 b 29 140 33 157 29 147 b 43 125 29 132 32 125 b 73 147 55 125 65 138 b 86 163 79 153 82 158 b 238 320 134 219 183 272 b 425 389 292 367 360 389 b 575 341 480 389 531 373 b 606 298 590 330 606 317 b 600 278 606 292 603 285 b 501 107 576 217 544 158 b 304 -104 439 33 372 -35 b 111 -356 230 -180 167 -265 b 84 -446 92 -386 84 -415 b 86 -481 84 -458 85 -469 b 88 -514 88 -491 88 -503 b 99 -543 89 -526 91 -537 z', + }, + timeSig3: { + x_min: 19.824321427094187, + x_max: 540, + y_min: -392, + y_max: 392, + ha: 784, + o: 'm 216 -540 b 354 -564 264 -556 310 -564 b 605 -465 445 -564 530 -530 b 729 -161 697 -383 729 -275 b 724 -82 729 -135 727 -108 b 589 95 716 -1 670 62 b 523 114 567 102 546 108 b 750 418 606 213 677 315 b 778 503 769 444 778 472 b 773 540 778 514 776 527 b 750 564 769 557 762 564 b 736 562 746 564 742 563 b 641 552 704 553 672 552 b 402 554 562 552 481 554 l 346 554 b 84 546 258 554 170 554 b 36 501 55 543 40 531 b 29 412 30 472 32 442 b 52 384 27 393 32 384 l 56 384 b 210 392 107 389 158 392 l 602 392 b 354 108 523 285 445 192 b 246 -65 300 58 246 12 b 252 -108 246 -78 248 -92 l 252 -111 b 264 -141 251 -122 251 -135 b 291 -132 274 -145 284 -140 b 425 -72 328 -95 377 -84 b 475 -65 442 -68 459 -65 b 592 -108 517 -65 557 -79 b 645 -179 615 -125 645 -147 b 642 -194 645 -184 644 -189 b 485 -376 616 -278 569 -344 b 361 -399 444 -392 402 -399 b 151 -340 289 -399 219 -376 b 88 -275 122 -323 98 -310 b 71 -249 86 -268 85 -249 b 63 -251 68 -249 66 -249 b 36 -288 48 -255 36 -266 b 55 -423 33 -336 45 -377 b 101 -482 60 -448 78 -468 b 216 -540 138 -504 174 -526 z', + }, + timeSig4: { + x_min: 20, + x_max: 633.0785282750762, + y_min: -489.59088556716864, + y_max: 491.18559127100053, + ha: 980.7764768381692, + o: 'm 608 -704 b 641 -684 622 -708 634 -696 b 667 -602 660 -660 662 -631 b 685 -190 683 -465 680 -327 l 685 -176 b 831 -127 736 -166 783 -148 b 912 0 901 -94 913 -76 b 886 53 912 36 904 52 b 848 40 877 53 864 49 l 838 36 b 687 -13 789 14 739 -3 b 681 177 687 50 684 114 b 672 338 678 230 677 285 b 654 373 671 350 672 373 b 622 340 636 373 624 361 b 615 262 621 314 613 288 b 619 -22 616 167 619 72 b 569 -22 602 -23 585 -23 b 305 -3 481 -16 395 -1 b 210 -9 274 -3 242 -4 b 301 163 242 52 268 108 b 513 552 377 288 459 412 b 536 652 526 585 536 618 b 533 683 536 662 534 672 b 520 707 531 691 531 707 b 487 693 508 708 494 704 b 474 668 482 684 477 677 b 384 490 454 603 418 547 b 253 281 343 419 295 351 b 73 -13 194 181 145 78 b 29 -108 50 -42 29 -72 b 37 -147 29 -121 32 -134 b 50 -186 43 -160 50 -173 b 68 -216 52 -207 56 -215 b 92 -207 73 -216 82 -213 b 288 -166 156 -180 220 -166 b 556 -186 377 -166 467 -180 b 586 -189 566 -187 576 -187 b 616 -186 596 -189 606 -189 b 606 -432 613 -268 612 -350 b 596 -625 603 -495 596 -559 b 598 -670 596 -641 596 -655 b 608 -704 598 -683 596 -700 z', + }, + timeSig5: { + x_min: 19.663871085403297, + x_max: 583, + y_min: -389, + y_max: 389, + ha: 778, + o: 'm 132 -536 b 249 -560 168 -553 209 -559 b 507 -462 351 -560 454 -514 b 677 -183 588 -384 642 -289 b 694 -85 688 -150 694 -117 b 540 138 694 12 642 94 b 422 173 501 154 462 167 b 400 187 408 174 400 177 b 405 202 400 190 402 196 b 428 284 416 228 426 255 b 469 312 431 307 442 312 b 757 372 569 312 662 343 b 840 490 821 392 840 432 b 812 560 840 540 834 560 b 763 546 801 560 785 556 b 757 543 762 546 759 544 b 465 484 665 505 570 484 b 396 484 452 484 425 487 b 353 454 377 482 366 474 b 281 300 323 405 304 351 b 245 164 262 255 245 212 b 246 144 245 158 246 151 b 233 63 249 115 243 89 b 225 35 228 50 225 40 b 264 14 225 22 236 19 b 445 -26 325 7 387 0 b 569 -151 501 -52 547 -89 b 575 -180 573 -161 575 -170 b 527 -275 575 -217 547 -245 b 347 -367 484 -334 419 -367 b 261 -351 318 -367 289 -363 b 95 -300 206 -333 154 -307 b 55 -321 73 -297 65 -302 b 29 -468 29 -367 40 -419 b 56 -505 26 -482 36 -500 b 132 -536 82 -514 108 -524 z', + }, + timeSig6: { + x_min: 20, + x_max: 565, + y_min: -363, + y_max: 363, + ha: 726, + o: 'm 390 -518 b 621 -458 469 -507 549 -494 b 814 -134 753 -390 814 -281 b 652 59 814 -16 750 58 b 580 48 629 59 606 55 b 233 -334 392 -9 276 -138 b 115 -228 181 -314 143 -278 b 98 -160 104 -206 98 -183 b 107 -109 98 -144 101 -127 b 167 37 124 -59 145 -12 b 508 340 236 189 347 292 b 575 353 530 347 553 353 b 648 327 600 353 625 346 b 665 320 654 321 661 320 b 687 336 674 320 681 325 b 703 405 697 359 703 382 b 684 472 703 429 697 451 b 593 523 664 504 631 521 b 576 521 588 523 582 523 b 297 403 472 508 380 465 b 115 177 217 344 164 264 b 29 -121 60 82 29 -17 b 53 -278 29 -173 36 -225 b 226 -497 82 -374 131 -454 b 347 -523 265 -514 305 -523 b 390 -518 361 -523 376 -521 z m 351 -357 b 312 -351 337 -356 320 -363 b 325 -315 304 -340 320 -327 b 543 -120 373 -222 448 -158 b 622 -104 570 -108 596 -102 b 717 -132 655 -104 687 -112 b 740 -167 732 -143 740 -153 b 730 -196 740 -176 737 -184 b 563 -321 690 -258 634 -300 b 359 -357 497 -341 428 -354 z', + }, + timeSig7: { + x_min: 20.3617407597707, + x_max: 592, + y_min: -345, + y_max: 345, + ha: 690, + o: 'm 253 -497 b 318 -485 276 -497 297 -487 b 366 -441 348 -482 360 -468 b 487 -104 390 -323 433 -210 b 835 403 580 82 701 246 b 852 436 847 416 852 428 b 815 467 852 451 840 461 b 762 474 798 471 779 474 b 674 445 732 474 701 465 b 603 410 652 431 628 420 b 383 360 533 379 459 360 b 200 435 315 360 249 382 b 88 494 168 469 131 485 b 66 497 81 495 73 497 b 33 484 52 497 39 492 b 50 436 22 469 39 451 b 295 310 114 360 199 324 b 406 301 331 304 369 301 b 593 324 468 301 530 308 b 585 307 589 314 588 310 b 265 -249 451 137 338 -46 b 207 -442 242 -312 223 -377 b 204 -462 206 -449 204 -456 b 253 -497 204 -487 220 -497 z', + }, + timeSig8: { + x_min: 20, + x_max: 504.15101530718516, + y_min: -428, + y_max: 428, + ha: 856, + o: 'm 265 -616 b 289 -615 274 -616 281 -616 b 710 -271 492 -592 657 -485 b 726 -148 721 -229 727 -187 b 585 108 726 -48 687 42 b 572 127 576 114 573 120 b 576 144 572 132 575 138 b 598 301 590 196 598 249 b 586 413 598 338 593 376 b 356 616 559 531 467 616 b 233 582 317 616 275 606 b 29 233 101 505 29 384 b 104 9 29 153 46 72 b 189 -48 127 -16 160 -27 b 92 -158 141 -73 114 -114 b 37 -343 63 -217 50 -279 b 33 -390 35 -359 33 -374 b 265 -616 33 -524 148 -616 z m 258 105 b 124 148 215 105 167 117 b 96 196 105 163 96 177 b 99 217 96 202 96 209 b 197 384 120 281 151 337 b 350 451 242 429 297 451 b 516 364 412 451 472 422 b 530 331 523 354 530 343 l 530 327 l 530 320 b 468 151 520 261 507 200 b 419 122 455 135 442 125 b 258 105 370 117 320 105 z m 328 -438 b 158 -276 233 -436 160 -359 b 166 -239 158 -264 161 -252 b 230 -157 176 -203 202 -179 b 367 -72 274 -125 320 -98 b 448 -49 396 -56 423 -49 b 562 -118 491 -49 528 -72 b 611 -251 590 -157 611 -199 b 569 -341 611 -288 595 -318 b 328 -438 500 -402 416 -432 z', + }, + timeSig9: { + x_min: 20, + x_max: 494, + y_min: -421, + y_max: 421, + ha: 842, + o: 'm 235 -606 b 361 -564 275 -606 318 -593 b 619 -229 487 -482 566 -366 b 706 127 664 -114 694 4 b 711 233 708 163 711 197 b 700 346 711 271 708 308 b 389 606 658 517 530 606 b 351 605 376 606 364 606 b 56 272 171 586 56 441 b 96 98 56 216 69 156 b 334 -53 144 -3 238 -53 b 544 36 408 -53 484 -24 b 652 176 586 78 622 124 b 631 71 645 141 639 105 b 467 -302 599 -63 562 -196 b 271 -442 412 -364 354 -422 b 225 -448 255 -446 239 -448 b 95 -305 148 -448 98 -395 b 89 -255 95 -288 94 -271 b 73 -233 86 -246 85 -233 b 52 -248 65 -233 56 -239 b 29 -317 42 -271 30 -291 b 49 -448 29 -361 40 -405 b 235 -606 69 -541 144 -606 z m 340 104 b 144 209 264 108 194 141 b 127 258 132 225 127 240 b 137 297 127 271 130 284 b 366 449 184 396 269 449 b 517 408 415 449 467 436 b 595 348 546 392 572 372 b 616 305 608 336 616 321 b 609 281 616 298 613 289 b 340 104 557 184 477 104 z', + }, + timeSigCommon: { + x_min: 20, + x_max: 585, + y_min: -298, + y_max: 294.49658092772603, + ha: 592.496580927726, + o: 'm 444 -405 b 829 -45 626 -346 740 -207 b 842 26 842 -23 842 1 b 821 58 842 39 841 58 b 795 40 811 58 802 48 b 765 3 785 29 773 16 b 469 -223 690 -104 596 -183 b 354 -242 431 -235 392 -242 b 180 -177 292 -242 235 -223 b 135 -99 154 -157 140 -131 b 132 -59 134 -85 132 -72 b 141 7 132 -37 135 -16 b 449 274 189 160 297 243 b 477 278 459 276 468 276 b 546 203 517 278 539 253 b 517 157 550 177 533 166 b 485 143 507 153 497 143 l 482 143 b 467 148 478 143 472 144 b 374 183 438 170 406 181 b 264 118 333 183 292 161 b 238 48 246 92 238 69 b 261 -9 238 29 245 10 b 383 -73 287 -39 337 -73 b 412 -68 392 -73 402 -72 b 631 164 526 -27 586 59 b 649 252 644 193 649 222 b 636 328 649 278 645 304 b 504 423 615 400 579 429 b 242 318 408 415 317 387 b 29 -158 104 190 29 33 b 30 -176 29 -164 29 -170 b 115 -364 42 -246 52 -315 b 307 -429 177 -410 240 -429 b 444 -405 351 -429 397 -420 z', + }, + timeSigCutCommon: { + x_min: 20, + x_max: 695, + y_min: -687.0379164869064, + y_max: 687, + ha: 1374.0379164869064, + o: 'm 564 -989 b 595 -945 585 -991 589 -963 l 599 -922 b 605 -628 600 -824 603 -726 l 609 -399 b 878 -251 706 -363 798 -320 b 996 -85 932 -204 976 -153 b 1001 -63 998 -78 1001 -71 b 989 -46 1001 -56 998 -49 b 978 -43 985 -45 982 -43 b 950 -59 968 -43 959 -49 b 733 -216 894 -132 815 -177 b 611 -259 694 -235 652 -249 b 616 -20 612 -179 615 -99 b 680 29 642 -7 665 9 b 698 43 685 36 690 40 b 870 251 792 82 840 160 b 877 294 874 265 877 279 b 818 410 877 338 855 382 b 683 458 779 442 730 448 b 625 468 664 462 644 465 l 625 514 b 638 958 626 662 636 811 b 626 989 638 979 635 989 b 603 981 621 989 613 986 b 422 840 534 945 481 888 b 412 805 412 832 413 818 b 426 713 410 773 420 743 b 445 678 429 690 435 678 b 474 691 452 678 461 683 b 563 755 503 710 530 732 b 564 724 564 740 564 733 b 559 469 563 639 560 554 b 462 454 526 469 494 464 b 112 143 302 399 199 281 b 33 -94 66 71 45 -10 b 29 -148 30 -112 29 -131 b 105 -351 29 -223 52 -291 b 359 -455 171 -426 258 -451 b 517 -431 409 -451 464 -446 l 539 -422 l 539 -477 b 533 -739 536 -563 539 -651 b 530 -824 531 -768 530 -795 b 546 -948 530 -865 533 -907 b 564 -989 552 -962 543 -989 z m 410 -288 b 193 -197 328 -288 253 -264 b 141 -60 160 -161 141 -108 b 157 6 141 -35 147 -12 b 259 158 189 58 217 112 b 438 291 311 215 364 266 b 528 305 468 301 498 305 b 554 304 537 305 546 304 b 553 212 554 274 554 242 b 426 115 498 199 446 164 b 416 68 419 99 416 84 b 425 12 416 49 420 30 b 474 -39 432 -17 448 -32 b 513 -43 487 -42 498 -43 b 547 -40 524 -43 536 -42 l 543 -272 b 461 -285 516 -278 488 -281 b 410 -288 444 -287 426 -288 z m 694 197 b 668 203 685 197 677 199 b 621 216 654 210 638 215 b 622 294 622 242 622 268 b 706 268 651 287 678 278 b 746 235 721 261 734 249 b 752 222 749 230 752 226 b 743 213 752 219 749 215 b 694 197 727 206 711 197 z', + }, + timeSigPlus: { + x_min: 0, + x_max: 661, + y_min: -358, + y_max: 358, + ha: 716, + o: 'm 605 -516 b 629 -490 624 -516 629 -507 b 628 -475 629 -485 628 -481 b 613 -131 624 -405 616 -174 b 612 -96 612 -114 612 -96 l 647 -98 b 897 -115 730 -99 814 -109 b 940 -89 919 -117 935 -109 b 952 -24 946 -69 952 -46 b 948 9 952 -14 950 -3 b 912 39 942 26 933 37 b 609 60 822 48 609 60 b 616 392 609 60 608 291 b 567 488 619 436 605 467 b 511 516 550 498 531 514 b 498 511 507 516 503 514 b 478 446 475 501 480 469 b 467 150 474 348 469 249 b 465 59 465 121 465 59 l 372 49 b 73 14 272 36 173 24 b 49 13 65 13 56 13 b 0 -33 9 13 0 6 b 60 -141 0 -117 6 -140 b 112 -135 73 -141 91 -140 b 413 -102 213 -125 314 -112 b 464 -98 441 -99 464 -98 l 464 -145 b 477 -456 464 -249 468 -353 b 526 -510 478 -488 491 -507 b 589 -513 546 -511 569 -510 b 605 -516 595 -514 600 -516 z', + }, + timeSigPlusSmall: { + x_min: 0, + x_max: 418, + y_min: -197, + y_max: 199, + ha: 396, + o: 'm 301 -284 b 330 -238 320 -284 324 -255 b 348 -46 350 -176 341 -111 b 374 -20 351 -27 356 -23 b 481 -17 409 -16 445 -17 b 566 -9 510 -17 537 -16 b 602 3 579 -7 602 -16 b 566 29 602 19 582 24 b 526 33 553 32 539 33 b 384 39 478 36 432 39 b 356 62 363 39 356 42 l 356 68 b 359 177 359 104 359 141 l 359 251 b 341 287 359 264 361 285 b 311 255 324 287 314 272 b 310 228 311 246 310 236 l 301 69 b 275 39 301 49 295 39 l 271 39 b 210 40 251 40 230 40 b 167 39 196 40 181 40 b 89 40 141 37 115 40 b 24 30 68 40 46 37 b 0 17 17 27 0 30 l 0 13 b 27 -17 3 0 7 -13 b 91 -22 49 -22 71 -22 b 153 -22 115 -22 137 -20 l 275 -22 b 295 -40 289 -22 295 -27 l 295 -48 b 288 -235 288 -109 287 -171 b 287 -264 288 -243 287 -253 b 301 -284 287 -275 289 -284 z', + }, + timeSigMinus: { + x_min: 0, + x_max: 662, + y_min: -54, + y_max: 55, + ha: 109, + o: 'm 39 -78 b 49 -76 42 -78 45 -76 b 452 -75 94 -75 272 -75 b 861 -76 632 -75 814 -76 b 953 -20 927 -79 953 -66 b 948 27 953 -7 950 9 b 946 37 948 30 948 35 b 896 79 940 63 929 79 b 471 78 827 78 648 78 l 42 78 b 0 37 14 78 0 69 b 23 -66 0 0 17 -32 b 39 -78 24 -75 32 -76 z', + }, + timeSigParensRight: { + x_min: 0, + x_max: 274.26483738379414, + y_min: -722.6326530612245, + y_max: 725, + ha: 1447.6326530612246, + o: 'm 37 -1038 b 69 -1031 48 -1044 59 -1038 b 88 -1015 76 -1027 82 -1021 b 164 -886 120 -976 147 -933 b 333 -351 233 -711 292 -534 b 395 118 366 -204 399 -59 b 389 245 392 144 392 194 b 120 996 369 521 265 766 b 68 1044 99 1030 84 1044 b 19 988 50 1044 36 1024 b 0 922 7 965 0 945 b 20 858 0 901 6 881 b 259 215 141 660 236 449 b 271 -1 266 143 271 71 b 252 -239 271 -82 265 -161 b 148 -667 228 -384 183 -524 b 39 -1009 120 -785 66 -893 b 33 -1031 37 -1017 33 -1024 b 37 -1038 33 -1034 35 -1037 z', + }, + timeSigParensRightSmall: { + x_min: 0, + x_max: 154.4025307335204, + y_min: -422, + y_max: 422, + ha: 844, + o: 'm 43 -608 b 60 -598 48 -608 53 -605 b 117 -511 82 -572 102 -543 b 222 23 193 -350 219 -177 b 213 166 225 55 216 109 b 115 531 206 294 174 416 b 45 603 99 562 76 588 b 30 608 39 606 35 608 b 10 598 23 608 17 603 b 0 546 3 590 0 570 b 23 451 0 507 9 458 b 102 351 66 429 84 390 b 167 42 150 252 167 148 b 163 -49 167 12 166 -19 b 35 -449 151 -192 121 -330 b 14 -504 22 -467 14 -485 b 17 -527 14 -511 16 -520 l 30 -590 b 43 -608 33 -603 37 -608 z', + }, + timeSigParensLeft: { + x_min: 0.5555555555555556, + x_max: 399.6216117372966, + y_min: -728, + y_max: 728, + ha: 1456, + o: 'm 562 -1048 b 573 -1043 566 -1048 570 -1047 b 553 -988 582 -1025 564 -1004 b 472 -884 527 -952 497 -920 b 210 -354 366 -717 275 -541 b 148 -6 170 -240 148 -124 b 160 148 148 45 153 96 b 315 678 189 331 242 508 b 431 901 350 755 380 834 b 459 950 451 926 461 939 b 435 995 459 962 451 972 b 364 1048 405 1034 383 1048 b 305 996 343 1048 325 1028 b 127 624 226 881 174 753 b 1 30 56 432 9 235 b 1 -32 1 9 0 -12 b 180 -629 13 -245 92 -438 b 363 -936 230 -739 298 -835 b 526 -1041 402 -995 448 -1041 b 562 -1048 537 -1040 552 -1048 z', + }, + timeSigParensLeftSmall: { + x_min: 0, + x_max: 173.45497224367904, + y_min: -405, + y_max: 404, + ha: 809, + o: 'm 197 -583 b 222 -553 212 -582 219 -566 b 229 -497 226 -534 229 -516 b 213 -425 229 -472 225 -448 b 102 -177 173 -344 132 -262 b 62 30 78 -111 58 -42 b 91 183 66 82 75 134 b 215 426 118 271 156 356 b 249 552 246 465 252 505 b 230 582 249 563 246 582 b 197 563 219 582 206 576 b 71 356 144 500 105 429 b 0 50 26 259 3 158 b 13 -112 4 -3 7 -58 b 176 -559 29 -275 105 -416 b 196 -583 180 -569 186 -583 z', + }, + noteheadDoubleWhole: { + x_min: -0.4444444444444444, + x_max: 614.1875, + y_min: -223.03296670127517, + y_max: 223, + ha: 446.0329667012752, + o: 'm 35 -321 b 62 -266 58 -318 58 -288 l 62 -194 b 63 50 62 -114 63 -32 b 60 189 63 96 63 143 b 43 300 59 226 60 265 b 29 321 40 308 39 321 l 26 321 b 0 292 13 318 0 310 b 0 248 0 278 -1 262 b 6 147 4 215 6 181 b 4 48 6 114 4 81 b 6 0 4 32 6 16 b 7 -36 7 -12 7 -24 l 7 -52 b 6 -156 7 -86 6 -121 b 19 -275 6 -196 9 -236 b 35 -321 23 -291 16 -323 z m 847 -314 b 871 -288 860 -315 867 -300 b 884 -187 881 -255 886 -222 b 876 115 878 -86 876 14 b 877 255 876 161 876 209 b 868 291 877 268 873 279 b 855 304 867 301 863 304 b 844 301 852 304 848 304 b 822 265 825 292 822 278 b 824 251 822 259 822 255 b 822 170 822 225 822 197 l 822 -20 b 835 -284 827 -86 825 -186 b 847 -314 837 -295 835 -311 z m 757 -291 b 793 -171 796 -255 792 -212 b 795 -49 795 -131 795 -91 b 786 207 795 36 791 121 b 779 240 786 217 783 229 b 766 258 776 246 776 258 b 762 256 765 258 763 256 b 739 236 752 253 740 252 b 733 177 737 216 732 197 b 737 20 737 125 739 73 l 737 -107 b 740 -202 737 -138 739 -170 b 757 -291 740 -230 743 -261 z m 128 -261 b 144 -251 135 -264 141 -256 b 158 -203 156 -236 157 -220 b 161 -137 161 -181 161 -158 b 157 30 161 -81 157 -26 b 158 76 157 45 157 60 l 158 101 b 156 225 158 141 158 183 b 137 253 156 235 154 253 l 134 253 b 109 222 120 251 109 242 b 104 91 108 179 104 134 b 108 -58 104 42 109 -9 b 107 -105 108 -73 108 -89 b 105 -127 107 -112 107 -120 b 118 -245 105 -167 114 -204 b 128 -261 118 -252 121 -259 z m 488 -242 b 693 -79 595 -249 685 -166 l 693 -55 b 690 0 693 -36 691 -17 b 540 187 684 84 621 164 b 449 200 508 196 480 200 b 210 104 363 200 282 163 b 186 56 196 92 186 76 b 207 -82 186 9 192 -37 b 300 -204 225 -132 248 -181 b 488 -242 356 -229 415 -240 z m 490 -88 b 449 -86 477 -88 464 -88 b 287 -56 399 -85 341 -78 b 258 -33 275 -52 258 -48 b 282 -7 258 -20 272 -13 b 458 43 340 23 399 43 b 580 14 497 43 537 35 b 618 -20 606 1 619 -9 b 592 -58 618 -30 609 -42 b 490 -88 562 -82 528 -88 z', + }, + noteheadWhole: { + x_min: 0, + x_max: 380.16649762501584, + y_min: -186.17102907059297, + y_max: 165, + ha: 351.17102907059297, + o: 'm 547 40 b 223 -268 543 -151 367 -259 b 102 -233 180 -271 143 -248 l 62 -216 b 0 -127 22 -197 0 -166 b 6 -91 0 -115 1 -104 b 122 141 33 -9 69 71 b 327 238 170 204 249 238 b 514 158 397 238 467 212 b 547 40 544 125 549 84 z m 248 -107 b 384 -63 295 -102 341 -88 b 426 -23 402 -53 415 -40 b 435 3 432 -14 435 -6 b 413 32 435 14 428 24 b 301 73 376 49 343 73 b 272 69 291 73 282 72 b 121 -35 207 53 157 20 b 111 -58 117 -42 111 -50 b 125 -75 111 -65 115 -71 b 248 -107 164 -89 202 -107 z', + }, + noteheadHalf: { + x_min: 0, + x_max: 334, + y_min: -174, + y_max: 175, + ha: 349, + o: 'm 480 56 b 167 -251 478 -115 331 -251 b 94 -242 143 -251 118 -248 b 9 -141 43 -229 20 -192 b 0 -68 3 -115 0 -91 b 284 249 0 95 127 200 b 304 252 289 251 297 252 b 481 78 374 252 481 170 b 480 56 481 71 481 63 z m 213 -102 b 399 6 274 -81 341 -48 b 402 17 400 7 402 13 b 399 27 402 22 400 26 b 311 94 373 53 353 88 b 292 95 305 95 300 95 b 130 27 230 95 181 55 b 69 -62 98 9 62 -29 b 161 -98 76 -98 128 -91 b 213 -102 174 -101 186 -101 z', + }, + noteheadBlack: { + x_min: 0, + x_max: 334.04644433966797, + y_min: -164, + y_max: 164, + ha: 328, + o: 'm 112 -233 b 141 -236 122 -235 131 -236 b 481 104 279 -236 485 -48 b 403 222 477 141 478 192 b 334 236 382 232 359 236 b 1 -59 180 236 13 59 b 0 -85 1 -68 0 -76 b 112 -233 0 -157 32 -215 z', + }, + noteheadXWhole: { + x_min: 0, + x_max: 506, + y_min: -143.0823320899293, + y_max: 144, + ha: 287.0823320899293, + o: 'm 53 -206 b 219 -163 117 -207 170 -196 b 314 -102 249 -141 282 -122 b 377 -63 334 -89 356 -76 b 514 -161 422 -96 468 -128 b 576 -196 534 -174 552 -196 b 589 -193 580 -196 585 -196 b 688 -174 625 -194 657 -181 b 711 -158 698 -171 711 -173 b 696 -143 711 -151 701 -147 b 503 -9 632 -98 567 -52 l 485 4 b 704 145 559 49 634 95 b 729 164 711 150 729 151 l 729 168 b 696 196 726 183 710 193 b 621 207 671 202 645 207 b 528 177 589 207 557 200 b 373 76 480 140 426 108 b 246 164 330 104 287 132 b 122 206 207 193 167 203 b 66 192 102 207 72 207 b 99 147 58 173 85 158 b 274 14 157 102 215 58 b 16 -164 184 -42 96 -98 b 0 -179 12 -168 0 -170 b 1 -183 0 -180 0 -183 b 26 -204 6 -193 12 -204 b 53 -206 37 -206 49 -206 z m 611 -177 b 376 -9 530 -118 452 -63 l 164 -143 b 104 -164 147 -154 130 -164 b 82 -161 96 -164 89 -164 b 230 -65 137 -125 183 -95 l 347 12 b 327 26 341 16 334 22 l 196 121 b 163 147 184 128 173 137 b 140 173 154 154 140 163 b 143 180 140 176 141 177 b 179 166 154 194 167 174 l 372 27 l 566 153 b 613 171 580 161 596 170 b 635 160 624 171 635 174 b 621 147 635 153 626 150 l 429 24 b 400 6 419 19 409 13 b 569 -117 456 -35 513 -75 b 611 -177 588 -130 608 -143 z', + }, + noteheadXHalf: { + x_min: 0, + x_max: 421, + y_min: -145.51844828189743, + y_max: 151, + ha: 296.51844828189746, + o: 'm 490 -209 b 539 -207 505 -207 521 -207 b 606 -209 560 -207 583 -209 b 598 -196 602 -203 600 -199 l 406 -19 l 540 130 b 547 144 546 135 547 140 b 536 156 547 148 543 153 b 488 192 518 166 503 176 b 416 217 471 209 444 217 b 323 180 380 217 344 204 l 264 115 b 239 138 256 122 248 131 b 33 197 180 196 108 200 b 3 186 23 197 6 193 b 19 154 -1 174 10 163 b 171 12 69 107 120 59 b 19 -157 120 -45 69 -101 b 0 -177 14 -163 0 -166 b 1 -181 0 -179 0 -180 b 39 -203 9 -197 22 -203 l 186 -203 b 197 -202 190 -202 193 -200 l 213 -202 b 262 -180 228 -202 246 -199 l 314 -122 b 490 -209 363 -170 412 -216 z m 435 -148 b 291 -30 379 -112 337 -69 l 213 -118 b 190 -137 207 -125 202 -137 b 145 -111 173 -130 154 -127 b 160 -79 137 -98 151 -88 b 238 16 184 -48 212 -16 b 141 99 204 43 173 72 l 124 117 b 115 132 121 121 115 127 b 118 137 115 134 117 137 b 141 132 127 147 135 138 l 253 36 b 347 150 285 75 315 112 b 370 164 354 160 363 163 b 403 145 382 164 393 156 b 416 127 412 140 416 132 b 405 102 416 118 412 111 l 307 -10 b 413 -105 343 -42 379 -73 b 435 -148 425 -115 436 -125 z', + }, + noteheadXBlack: { + x_min: 0, + x_max: 289, + y_min: -156, + y_max: 157, + ha: 313, + o: 'm 23 -225 b 69 -204 40 -223 56 -219 b 137 -131 92 -180 115 -157 l 209 -50 b 377 -197 264 -101 321 -148 b 403 -210 384 -203 393 -210 l 408 -210 b 416 -192 416 -207 416 -199 l 416 -186 b 403 -148 416 -171 413 -158 b 344 -81 384 -125 367 -101 b 252 -1 312 -55 282 -29 b 377 157 297 49 340 101 b 402 202 387 170 402 187 b 395 217 402 207 400 213 b 376 226 389 223 382 226 b 334 192 360 226 346 204 b 206 42 289 143 248 94 b 96 161 167 81 131 120 b 60 193 86 174 76 189 b 33 206 52 196 42 206 b 22 199 29 206 26 204 b 10 173 14 190 10 181 b 22 147 10 166 14 157 b 148 7 62 98 104 52 b 164 -7 154 1 158 -3 b 10 -189 111 -66 55 -122 b 0 -212 6 -197 0 -203 b 1 -217 0 -213 0 -216 b 23 -225 4 -226 14 -222 z', + }, + noteheadCircleX: { + x_min: 0, + x_max: 344, + y_min: -179, + y_max: 175.12551922594866, + ha: 354.12551922594866, + o: 'm 99 -210 b 236 -258 137 -242 186 -258 b 418 -183 305 -258 374 -230 b 495 33 475 -120 495 -48 b 494 66 495 45 494 55 b 302 252 487 183 405 256 b 181 243 262 249 222 248 b 46 171 128 236 79 219 b 0 19 14 127 0 73 b 99 -210 0 -68 35 -156 z m 245 42 l 124 156 b 200 176 145 166 170 173 b 337 183 245 181 291 184 b 377 176 351 183 364 180 b 245 42 333 131 288 86 z m 392 -99 l 285 3 l 400 121 b 418 154 409 131 418 140 b 465 50 448 130 465 94 b 405 -112 462 -17 439 -73 z m 89 -120 b 48 0 56 -82 48 -42 b 89 112 48 35 59 76 b 109 101 96 111 102 108 l 210 7 l 187 -17 b 89 -120 151 -53 125 -82 z m 176 -183 b 127 -163 158 -179 141 -171 l 252 -32 l 372 -144 b 233 -189 334 -173 285 -189 b 176 -183 215 -189 196 -187 z', + }, + noteheadTriangleUpWhole: { + x_min: 0, + x_max: 366, + y_min: -145, + y_max: 138, + ha: 283, + o: 'm 504 -209 b 527 -199 520 -209 527 -206 b 520 -180 527 -193 524 -187 b 459 -94 501 -151 480 -122 b 279 170 400 -6 341 82 b 242 199 266 190 253 199 b 206 167 230 199 219 189 b 10 -145 140 63 76 -42 b 0 -171 3 -156 0 -164 b 23 -200 0 -183 9 -192 b 55 -209 33 -206 45 -209 z m 202 -161 b 176 -137 183 -163 176 -156 b 187 -62 176 -111 179 -86 b 253 95 206 -10 228 42 b 337 -132 307 24 334 -49 b 311 -161 338 -153 334 -161 b 256 -160 294 -161 275 -160 b 202 -161 238 -160 220 -161 z', + }, + noteheadTriangleUpHalf: { + x_min: 0, + x_max: 341.0833130378007, + y_min: -159, + y_max: 159, + ha: 318, + o: 'm 458 -226 b 478 -229 462 -223 469 -229 b 490 -222 482 -229 487 -228 b 477 -184 495 -207 484 -196 b 281 176 410 -65 346 56 b 238 225 269 194 261 213 b 225 229 232 226 228 228 b 209 215 217 229 213 225 b 4 -153 141 92 73 -30 b 0 -170 1 -158 0 -164 b 12 -189 0 -177 4 -183 b 66 -215 27 -202 43 -213 b 458 -226 194 -217 323 -222 z m 151 -167 b 298 75 204 -89 240 -1 b 301 82 300 76 301 79 l 357 -22 b 344 -43 353 -27 350 -37 b 285 -163 317 -79 312 -127 b 278 -170 282 -166 279 -167 z', + }, + noteheadTriangleUpBlack: { + x_min: 0, + x_max: 346, + y_min: -149, + y_max: 149, + ha: 298, + o: 'm 481 -215 b 498 -209 487 -215 492 -215 b 482 -173 498 -194 488 -184 l 284 173 b 259 202 278 184 269 194 b 229 215 248 210 238 215 b 196 189 216 215 206 206 l 13 -150 b 3 -168 9 -156 6 -163 b 0 -180 1 -173 0 -177 b 12 -197 0 -187 4 -193 b 63 -213 29 -206 45 -213 b 481 -215 203 -213 343 -215 z', + }, + noteheadDiamondWhole: { + x_min: 0, + x_max: 271, + y_min: -132, + y_max: 132, + ha: 264, + o: 'm 230 -177 b 256 -190 240 -186 249 -190 b 281 -173 265 -190 272 -184 b 382 -29 314 -124 347 -76 b 390 -10 387 -22 390 -14 b 376 12 390 -3 386 4 b 173 177 308 66 240 121 b 144 190 166 183 160 190 b 98 153 127 186 112 170 b 13 40 69 115 42 76 b 0 13 4 29 0 20 b 22 -19 0 3 7 -9 b 230 -177 92 -69 163 -122 z m 279 -128 b 261 -122 274 -134 266 -127 l 66 30 b 56 45 59 35 56 39 b 62 56 56 48 59 52 b 122 122 91 101 105 122 b 194 76 138 122 158 107 l 320 -26 b 336 -50 325 -32 336 -35 b 279 -128 318 -75 300 -102 z', + }, + noteheadDiamondHalf: { + x_min: 0, + x_max: 295, + y_min: -148, + y_max: 148, + ha: 296, + o: 'm 228 -207 b 245 -213 235 -210 240 -213 b 264 -203 252 -213 258 -210 b 415 -46 314 -150 364 -98 b 425 -27 420 -40 425 -35 b 416 -10 425 -22 422 -16 b 217 200 350 60 284 131 b 194 213 212 207 204 213 b 170 196 181 213 177 203 b 14 33 118 143 68 86 b 0 7 4 23 0 16 b 17 -20 0 -1 6 -10 b 118 -114 52 -50 82 -85 b 228 -207 156 -144 184 -184 z m 209 -157 b 134 -69 177 -138 141 -115 b 130 -26 131 -55 130 -40 b 215 148 130 42 160 99 b 225 156 217 151 220 156 b 230 153 226 156 228 156 b 323 -26 276 104 321 55 b 298 -75 324 -42 315 -59 b 265 -109 287 -86 276 -99 b 209 -157 245 -125 228 -167 z', + }, + noteheadDiamondBlack: { + x_min: 0, + x_max: 310, + y_min: -146, + y_max: 146, + ha: 292, + o: 'm 266 -210 b 289 -194 278 -209 284 -200 b 406 -76 330 -156 367 -115 b 446 -23 433 -49 446 -36 b 412 29 446 -10 435 3 b 405 36 409 30 408 33 b 252 196 354 89 304 143 b 225 210 243 204 235 210 b 204 202 219 210 212 209 b 10 24 141 141 75 82 b 0 9 4 19 0 14 b 9 -6 0 4 3 0 l 232 -192 b 266 -210 242 -200 256 -204 z', + }, + noteheadSquareWhite: { + x_min: 0, + x_max: 350, + y_min: -131, + y_max: 131, + ha: 262, + o: 'm 468 -189 b 485 -187 474 -189 480 -189 b 500 -176 495 -187 500 -183 b 498 -168 500 -174 498 -171 b 497 -166 498 -167 497 -167 l 498 -164 b 504 -154 503 -163 504 -158 b 503 -138 504 -150 503 -144 l 503 -135 l 503 -94 b 492 66 500 -45 494 10 b 488 135 492 89 488 112 b 484 150 488 141 485 145 b 482 154 482 151 482 153 b 429 189 472 177 456 189 b 53 184 304 186 179 186 l 39 184 b 33 181 36 183 35 183 b 12 160 20 181 12 177 b 0 -109 9 71 4 -19 b 19 -137 0 -125 7 -134 b 23 -151 19 -141 20 -145 b 85 -187 37 -173 55 -187 b 468 -189 212 -187 340 -187 z m 246 -125 l 63 -125 b 66 -111 65 -122 66 -117 b 73 72 69 -50 71 10 l 73 130 b 88 128 78 128 82 128 b 148 130 108 130 128 130 b 271 128 190 130 230 128 l 271 130 l 420 130 b 428 20 425 92 425 56 l 436 -127 l 246 -127 z', + }, + noteheadSquareBlack: { + x_min: 0, + x_max: 342, + y_min: -129.98961937716263, + y_max: 132.44444444444446, + ha: 262.4340638216071, + o: 'm 217 190 b 439 186 304 190 372 190 b 467 180 448 184 458 183 b 492 145 484 176 492 167 b 490 -124 490 56 490 -33 b 488 -141 490 -130 488 -135 b 456 -170 488 -163 478 -168 b 118 -183 344 -176 230 -181 b 29 -184 89 -183 60 -192 b 0 -148 4 -180 0 -168 b 1 29 1 -89 1 -30 l 1 156 b 36 190 3 187 4 190 b 217 190 102 192 168 190 z', + }, + noteheadParenthesis: { + x_min: -70.190112022022, + x_max: 329, + y_min: -196, + y_max: 201, + ha: 397, + o: 'm 344 -279 b 382 -262 361 -288 370 -272 b 405 -233 390 -255 399 -245 b 474 9 455 -158 468 -73 b 416 228 474 78 448 174 b 364 282 403 249 387 271 b 344 289 359 285 350 288 b 331 279 338 289 333 287 b 325 248 328 269 325 258 b 338 225 325 238 328 229 b 412 138 379 207 396 174 b 445 1 433 92 445 45 b 346 -217 445 -81 410 -154 b 336 -252 340 -223 336 -238 b 344 -279 336 -265 338 -276 z m 19 -274 b 35 -282 24 -279 30 -281 b 49 -265 42 -282 46 -275 b 52 -243 50 -256 52 -249 b 36 -210 52 -230 49 -220 b -60 -59 -16 -173 -35 -114 b -73 9 -69 -39 -73 -16 b 33 223 -73 92 -24 189 b 50 265 43 229 50 249 b 33 288 50 278 46 289 b 4 272 23 288 14 275 b -9 261 0 269 -4 265 b -101 23 -58 193 -105 124 b -37 -206 -104 -52 -75 -130 b 19 -274 -23 -232 -6 -255 z', + }, + noteheadParenthesisRight: { + x_min: -30, + x_max: 82, + y_min: -199.08429092881173, + y_max: 206, + ha: 405.0842909288117, + o: 'm -17 -282 b 24 -264 -6 -297 12 -272 b 60 -219 40 -253 52 -236 b 117 1 96 -150 112 -75 b 118 16 118 6 118 12 b 109 73 118 36 112 55 b 4 279 99 154 68 226 b -23 297 -4 287 -13 297 b -37 289 -27 297 -32 294 b -43 266 -42 285 -43 276 b -32 225 -43 251 -37 229 b 84 -7 48 170 84 82 b 32 -184 84 -69 65 -132 b -10 -222 22 -200 4 -209 b -24 -258 -20 -232 -24 -245 b -17 -282 -24 -266 -22 -276 z', + }, + noteheadParenthesisLeft: { + x_min: 0, + x_max: 106, + y_min: -197, + y_max: 197, + ha: 394, + o: 'm 134 -284 b 138 -281 135 -284 137 -284 b 145 -268 144 -278 145 -274 l 144 -253 b 107 -180 138 -225 121 -204 b 42 13 71 -120 42 -56 b 49 73 42 32 43 52 b 137 210 62 128 95 171 b 153 255 147 219 153 239 b 145 278 153 265 151 274 b 130 284 140 281 135 284 b 98 259 117 284 108 268 b 0 37 35 203 1 131 b 118 -268 9 -69 53 -173 b 134 -284 121 -274 127 -284 z', + }, + augmentationDot: { + x_min: 0, + x_max: 96, + y_min: -57, + y_max: 57, + ha: 114, + o: 'm 13 -82 b 16 -81 14 -82 14 -82 b 105 -73 46 -76 75 -76 b 131 -48 121 -72 131 -60 b 138 26 134 -24 138 0 b 137 48 138 33 138 40 b 108 82 134 71 125 82 b 95 81 104 82 99 82 b 33 71 75 78 53 75 b 4 46 20 68 6 62 b 0 -66 1 9 0 -29 b 13 -82 0 -73 1 -82 z', + }, + tremolo1: { + x_min: -158, + x_max: 156.19381479578487, + y_min: -88, + y_max: 88, + ha: 176, + o: 'm -206 -127 b -194 -125 -203 -127 -199 -127 b 173 -36 -72 -94 50 -65 b 220 16 202 -29 215 -12 b 225 50 223 30 225 45 b 216 107 226 76 222 91 b 194 127 210 120 204 127 b 183 124 192 127 189 127 l -192 33 b -226 -9 -213 27 -222 14 b -228 -32 -226 -16 -228 -23 b -222 -108 -228 -58 -222 -82 b -206 -127 -222 -120 -217 -127 z', + }, + flag8thUp: { + x_min: 0, + x_max: 261, + y_min: -819, + y_max: 0, + ha: 819, + o: 'm 265 -1171 b 351 -1035 301 -1130 336 -1087 b 376 -867 369 -979 376 -923 b 367 -755 376 -829 373 -792 b 233 -422 350 -632 311 -520 b 131 -291 199 -379 166 -334 b 65 -125 91 -239 66 -192 b 62 -75 65 -112 62 -91 b 42 0 62 -49 52 -24 l 35 0 b 0 -63 6 -13 0 -36 l 0 -144 b 96 -445 0 -255 29 -356 b 177 -547 124 -478 150 -514 b 308 -831 246 -629 298 -721 b 317 -890 310 -851 317 -871 b 311 -919 317 -900 315 -910 b 256 -1005 297 -950 282 -984 b 228 -1068 233 -1024 228 -1045 b 230 -1106 228 -1080 229 -1093 b 240 -1162 232 -1125 239 -1143 b 251 -1179 242 -1174 246 -1179 b 265 -1171 255 -1179 259 -1176 z', + }, + flag8thDown: { + x_min: 0, + x_max: 261, + y_min: 0, + y_max: 819, + ha: 819, + o: 'm 265 1171 b 251 1179 259 1176 255 1179 b 240 1162 246 1179 242 1174 b 230 1106 239 1143 232 1125 b 228 1068 229 1093 228 1080 b 256 1005 228 1045 233 1024 b 311 919 282 984 297 950 b 317 890 315 910 317 900 b 308 831 317 871 310 851 b 177 547 298 721 246 629 b 96 445 150 514 124 478 b 0 144 29 356 0 255 l 0 63 b 35 0 0 36 6 13 l 42 0 b 62 75 52 24 62 49 b 59 117 62 91 59 104 b 131 291 60 183 91 239 b 233 422 166 334 199 379 b 367 755 311 520 350 632 b 376 867 373 792 376 829 b 351 1035 376 923 369 979 b 265 1171 336 1087 301 1130 z', + }, + flag16thUp: { + x_min: 0, + x_max: 327.1591498636094, + y_min: -819.3972596310256, + y_max: 0, + ha: 819.3972596310256, + o: 'm 415 -1179 b 435 -1168 423 -1182 429 -1174 b 451 -1138 442 -1159 446 -1149 b 465 -1020 464 -1102 467 -1064 b 461 -962 464 -1004 464 -984 b 471 -821 467 -916 472 -870 b 465 -721 472 -791 467 -756 b 415 -520 459 -651 441 -585 b 200 -245 370 -408 284 -327 b 96 -114 160 -206 118 -168 b 75 -24 84 -85 85 -53 b 59 0 72 -16 72 0 b 53 -1 58 0 56 -1 b 27 -32 40 -6 27 -10 b 29 -68 27 -43 29 -55 b 10 -79 20 -69 13 -72 b 1 -109 6 -89 1 -99 b 0 -170 0 -130 0 -148 b 35 -410 0 -252 12 -333 b 258 -793 76 -557 156 -681 b 409 -1158 350 -896 410 -1014 b 415 -1179 409 -1165 405 -1175 z m 413 -816 b 331 -681 392 -769 364 -723 b 145 -420 266 -596 189 -521 b 86 -281 125 -374 102 -330 b 156 -370 105 -312 128 -343 b 318 -539 210 -425 269 -478 b 413 -816 383 -621 420 -713 z', + }, + flag16thDown: { + x_min: 0, + x_max: 327.1591498636094, + y_min: 0, + y_max: 819, + ha: 819, + o: 'm 59 0 b 75 24 72 0 72 16 b 96 114 85 53 84 85 b 200 245 118 168 160 206 b 415 520 284 327 370 408 b 465 721 441 585 459 651 b 471 821 467 756 472 791 b 461 962 472 870 467 916 b 465 1020 464 984 464 1004 b 451 1138 467 1064 464 1102 b 435 1168 446 1149 442 1159 b 418 1179 431 1172 425 1179 l 415 1179 b 408 1169 409 1176 408 1174 b 409 1158 408 1165 409 1161 b 258 793 410 1014 350 896 b 35 410 156 681 76 557 b 0 170 12 333 0 252 l 0 88 b 29 7 0 71 6 23 b 59 0 33 4 58 0 z m 86 281 b 145 420 102 330 125 374 b 331 681 189 521 266 596 b 413 816 364 723 392 769 b 415 791 413 808 415 799 b 318 539 415 698 377 613 b 156 370 269 478 210 425 b 86 281 128 343 105 312 z', + }, + flag32ndUp: { + x_min: -0.19862981551275186, + x_max: 268.0942440943661, + y_min: -849.4710740978672, + y_max: 149.0769891455102, + ha: 998.5480632433774, + o: 'm 323 -1223 b 351 -1198 337 -1227 344 -1210 b 359 -1184 354 -1194 356 -1188 b 386 -999 377 -1122 387 -1060 b 341 -783 386 -927 372 -855 b 330 -736 334 -769 330 -753 b 333 -708 330 -727 330 -717 b 344 -621 340 -678 344 -649 b 341 -579 344 -608 343 -593 b 328 -500 338 -553 328 -526 b 331 -475 328 -491 328 -484 b 347 -370 343 -438 348 -402 b 151 27 348 -212 288 -56 b 53 176 98 59 50 102 b 45 197 53 183 48 192 b 33 215 40 203 40 216 l 30 215 b 6 194 22 212 9 209 b 0 120 3 170 -1 145 b 0 -43 4 65 0 13 b 0 -98 0 -60 1 -79 b 4 -276 0 -157 6 -216 b 7 -456 4 -337 7 -397 b 66 -638 7 -523 22 -585 b 158 -724 94 -671 127 -697 b 318 -1011 246 -801 295 -899 b 321 -1044 321 -1021 321 -1032 b 312 -1152 321 -1080 312 -1116 b 317 -1192 312 -1165 314 -1179 b 323 -1223 320 -1202 311 -1220 z m 285 -376 b 121 -180 249 -289 173 -245 b 91 -105 104 -158 92 -135 b 288 -354 181 -144 288 -269 b 285 -376 288 -363 287 -370 z m 275 -657 b 111 -492 226 -589 163 -547 b 65 -376 78 -456 66 -418 b 71 -323 65 -360 68 -341 b 275 -657 164 -418 265 -504 z', + }, + flag32ndDown: { + x_min: -2.800802874905624, + x_max: 268.09424409436605, + y_min: -169.07698914551014, + y_max: 829.4710740978672, + ha: 998.5480632433773, + o: 'm 323 1194 b 317 1164 311 1191 320 1174 b 312 1123 314 1151 312 1136 b 321 1015 312 1087 321 1051 b 318 982 321 1004 321 992 b 158 696 295 870 246 772 b 66 609 127 668 94 642 b 7 428 22 556 7 494 b 4 248 7 369 4 308 b -1 78 6 187 -10 137 b 0 14 0 59 0 32 l 0 -148 b 6 -223 0 -174 3 -199 b 30 -243 9 -238 22 -240 l 33 -243 b 45 -226 40 -245 40 -232 b 53 -204 48 -220 53 -212 b 151 -56 50 -131 98 -88 b 347 341 288 27 348 183 b 331 446 348 373 343 409 b 328 471 328 455 328 462 b 341 550 328 497 338 524 b 344 592 343 564 344 579 b 333 680 344 621 340 649 b 330 707 330 688 330 698 b 341 755 330 724 334 740 b 386 971 372 827 386 899 b 359 1155 387 1031 377 1093 b 351 1169 356 1159 354 1165 b 323 1194 344 1181 337 1198 z m 275 628 b 71 294 265 475 164 389 b 65 347 68 312 65 331 b 111 464 66 389 78 428 b 275 628 163 518 226 560 z m 285 347 b 288 325 287 341 288 334 b 91 76 288 240 181 115 b 121 151 92 107 104 130 b 285 347 173 216 249 261 z', + }, + flag64thUp: { + x_min: -4, + x_max: 282, + y_min: -823.5430338167067, + y_max: 347, + ha: 1170.5430338167066, + o: 'm 350 -1185 b 380 -1162 364 -1189 374 -1175 b 406 -1022 399 -1119 406 -1071 b 359 -798 406 -945 384 -871 b 348 -756 353 -785 348 -772 b 350 -744 348 -753 350 -749 b 363 -621 356 -704 363 -664 b 360 -580 363 -608 363 -593 b 359 -560 359 -573 359 -567 b 373 -490 359 -536 366 -513 b 393 -346 386 -444 393 -395 b 387 -269 393 -320 390 -294 b 348 -127 382 -219 348 -173 b 351 -104 348 -120 348 -111 b 353 -65 351 -91 353 -78 b 341 37 353 -26 348 6 b 226 215 323 108 278 164 b 86 336 181 258 127 288 b 62 395 72 353 62 370 b 42 481 62 423 55 454 b 27 500 37 488 36 500 b 24 498 26 500 26 500 b -1 480 14 497 1 492 b -6 444 -4 467 -6 455 l -6 435 b -1 341 -1 403 -1 372 l -1 266 b 6 156 -1 230 0 193 b 13 35 12 117 13 75 l 13 -35 b 14 -85 13 -52 14 -68 b 29 -276 19 -150 33 -213 b 20 -448 24 -334 20 -392 b 24 -534 20 -477 22 -505 b 114 -708 30 -605 59 -664 b 197 -780 143 -732 171 -755 b 344 -1153 301 -884 341 -1011 b 343 -1172 344 -1159 343 -1166 b 350 -1185 343 -1176 344 -1182 z m 287 -88 b 62 193 186 -17 79 48 b 229 52 121 144 174 98 b 289 -33 256 29 274 -3 b 295 -56 294 -42 295 -49 b 287 -88 295 -66 292 -76 z m 298 -410 b 118 -235 238 -351 176 -295 b 76 -88 82 -197 78 -147 b 268 -252 137 -153 203 -202 b 330 -360 304 -279 330 -315 b 323 -402 330 -373 327 -387 b 311 -418 318 -413 315 -418 b 298 -410 307 -418 302 -415 z m 300 -691 b 117 -508 243 -616 168 -575 b 82 -408 94 -480 82 -448 b 84 -379 82 -397 82 -387 b 259 -553 135 -451 206 -492 b 301 -667 287 -583 301 -619 b 300 -691 301 -674 301 -683 z', + }, + flag64thDown: { + x_min: -5, + x_max: 281, + y_min: -375, + y_max: 795.5430338167066, + ha: 1170.5430338167066, + o: 'm 348 1145 b 341 1132 343 1142 341 1136 b 343 1113 341 1126 343 1119 b 196 740 340 971 300 844 b 112 668 170 714 141 691 b 23 494 58 624 29 564 b 19 408 20 465 19 436 b 27 236 19 351 23 294 b 13 45 32 173 17 109 b 12 -6 13 27 12 12 l 12 -75 b 4 -196 12 -115 10 -157 b -3 -307 -1 -233 -3 -271 l -3 -382 b -7 -475 -3 -412 -3 -444 l -7 -484 b -3 -520 -7 -495 -6 -507 b 23 -539 0 -533 13 -537 b 26 -540 24 -540 24 -540 b 40 -521 35 -540 36 -528 b 60 -435 53 -494 60 -464 b 85 -376 60 -410 71 -393 b 225 -255 125 -328 180 -298 b 340 -78 276 -204 321 -148 b 351 24 347 -46 351 -14 b 350 63 351 37 350 50 b 347 86 347 71 347 79 b 386 229 347 132 380 179 b 392 305 389 253 392 279 b 372 449 392 354 384 403 b 357 520 364 472 357 495 b 359 540 357 527 357 533 b 361 580 361 553 361 567 b 348 704 361 624 354 664 b 347 716 348 708 347 713 b 357 757 347 732 351 744 b 405 982 383 831 405 904 b 379 1122 405 1031 397 1079 b 348 1145 373 1135 363 1149 z m 298 651 b 300 626 300 642 300 634 b 258 513 300 579 285 543 b 82 338 204 452 134 410 b 81 367 81 347 81 357 b 115 468 81 408 92 439 b 298 651 167 534 242 576 z m 297 370 b 310 377 301 374 305 377 b 321 361 314 377 317 373 b 328 320 325 347 328 333 b 266 212 328 275 302 239 b 75 48 202 161 135 112 b 117 194 76 107 81 157 b 297 370 174 255 236 311 z m 285 48 b 294 16 291 36 294 26 b 288 -7 294 9 292 1 b 228 -92 272 -37 255 -69 b 60 -233 173 -138 120 -184 b 285 48 78 -88 184 -23 z', + }, + flag128thUp: { + x_min: 0, + x_max: 252, + y_min: -804, + y_max: 530, + ha: 1334, + o: 'm 298 -1158 b 328 -1126 312 -1158 320 -1139 b 330 -1116 330 -1123 330 -1119 b 347 -996 343 -1076 347 -1037 b 328 -837 347 -943 338 -890 b 320 -778 324 -816 320 -798 b 330 -733 320 -763 323 -749 b 340 -665 338 -714 337 -688 b 341 -645 340 -660 341 -652 b 333 -534 341 -609 333 -572 b 343 -471 333 -513 334 -492 b 361 -366 356 -436 361 -402 b 331 -202 361 -311 348 -256 b 328 -187 330 -197 328 -193 b 331 -179 328 -184 328 -181 b 363 -55 353 -137 363 -96 b 337 79 363 -12 351 33 b 327 114 333 92 327 104 b 344 144 327 124 331 132 b 359 174 353 150 357 163 b 361 228 360 193 361 210 b 243 517 361 337 325 435 b 147 596 213 546 179 569 b 75 708 111 626 75 655 b 62 744 75 723 68 733 b 50 763 58 752 58 763 b 46 762 49 763 48 762 b 17 742 36 757 22 757 b 0 697 14 726 0 711 b 1 595 0 662 3 631 b 0 469 0 552 0 511 b 1 429 0 456 0 442 b 22 289 6 382 22 337 b 24 128 22 238 24 184 b 22 66 24 108 23 86 b 19 -19 20 37 19 10 b 20 -132 19 -56 20 -95 b 13 -276 20 -180 19 -229 b 9 -359 10 -304 9 -330 b 12 -487 9 -402 12 -445 b 56 -582 12 -526 29 -554 b 197 -742 107 -632 160 -681 b 288 -1100 265 -851 276 -976 b 288 -1122 288 -1107 287 -1115 b 287 -1145 289 -1129 287 -1138 b 298 -1158 287 -1153 288 -1158 z m 304 150 b 75 475 229 256 112 334 b 304 150 233 357 305 287 z m 271 -73 b 127 72 233 -14 179 26 b 81 167 96 98 81 127 b 84 194 81 176 82 184 b 271 -73 148 102 242 39 z m 279 -396 b 132 -223 233 -330 180 -279 b 81 -112 104 -192 81 -156 b 82 -91 81 -105 81 -98 b 279 -396 167 -125 269 -281 z m 249 -609 b 69 -357 197 -520 88 -471 b 249 -609 131 -441 229 -498 z', + }, + flag128thDown: { + x_min: -0.8888888888888888, + x_max: 252, + y_min: -580, + y_max: 754, + ha: 1334, + o: 'm 298 1086 b 287 1073 288 1086 287 1081 b 288 1050 287 1066 289 1057 b 288 1028 287 1043 288 1035 b 197 670 276 904 265 779 b 56 510 160 609 107 560 b 12 415 29 482 12 454 b 9 287 12 373 9 330 b 13 204 9 258 10 232 b 20 60 19 157 20 108 b 19 -53 20 23 19 -16 b 22 -138 19 -82 20 -109 b 24 -200 23 -158 24 -180 b 22 -361 24 -256 22 -310 b 1 -501 22 -409 6 -454 b 0 -541 0 -514 0 -528 b 0 -667 0 -583 -3 -624 b 0 -809 0 -675 -3 -791 b 46 -834 4 -825 36 -829 b 50 -835 48 -834 49 -835 b 62 -816 58 -835 58 -824 b 75 -780 68 -805 75 -795 b 147 -668 75 -727 111 -698 b 243 -589 179 -641 213 -618 b 361 -300 325 -507 361 -409 b 359 -246 361 -282 360 -265 b 344 -216 357 -235 353 -222 b 327 -186 331 -204 327 -196 b 337 -151 327 -176 333 -164 b 363 -17 351 -105 363 -60 b 331 107 363 24 353 65 b 328 115 328 109 328 112 b 331 130 328 121 330 125 b 361 294 348 184 361 239 b 343 399 361 330 356 364 b 333 462 334 420 333 441 b 341 573 333 500 341 537 b 340 593 341 580 340 588 b 330 661 337 616 338 642 b 320 706 323 677 320 691 b 328 765 320 726 324 744 b 347 924 338 818 347 871 b 330 1044 347 965 343 1004 b 328 1054 330 1047 330 1051 b 298 1086 320 1067 312 1086 z m 249 537 b 69 285 229 426 131 369 b 249 537 88 399 197 448 z m 279 324 b 82 19 269 209 167 53 b 81 40 81 26 81 33 b 132 151 81 84 104 120 b 279 324 180 207 233 258 z m 271 1 b 84 -266 242 -111 148 -174 b 81 -239 82 -256 81 -248 b 127 -144 81 -199 96 -170 b 271 1 179 -98 233 -58 z m 304 -222 b 75 -547 305 -359 233 -429 b 304 -222 112 -406 229 -328 z', + }, + accidentalFlat: { + x_min: 1, + x_max: 209, + y_min: -208, + y_max: 472, + ha: 680, + o: 'm 29 -300 b 46 -289 33 -300 39 -297 b 107 -243 65 -274 86 -258 b 301 127 233 -153 301 -30 b 298 186 301 147 301 166 b 190 297 291 256 251 297 b 147 289 177 297 163 294 b 86 265 127 284 107 274 l 85 264 l 85 301 b 91 465 85 356 88 410 b 94 559 91 497 94 527 b 84 651 94 589 91 621 b 66 680 81 661 81 680 l 65 680 b 37 645 49 678 37 665 b 33 523 36 605 32 563 l 33 478 b 26 223 33 393 29 308 b 1 -141 22 101 1 -19 b 17 -287 1 -189 4 -239 b 29 -300 20 -295 23 -300 z m 68 -105 b 76 12 71 -68 72 -29 b 81 107 79 43 81 75 l 86 109 b 171 135 114 121 141 135 b 204 128 181 135 193 132 b 238 92 228 120 239 108 b 230 63 238 84 236 75 b 68 -105 193 -10 132 -59 z', + }, + accidentalNatural: { + x_min: 0, + x_max: 213.5, + y_min: -456, + y_max: 462, + ha: 918, + o: 'm 255 -657 b 281 -624 271 -657 275 -636 b 285 -599 282 -615 285 -608 b 292 -300 288 -500 289 -400 b 289 -161 292 -253 289 -207 b 300 128 292 -65 297 32 b 304 168 300 128 302 150 l 304 173 l 305 190 l 305 199 l 307 225 b 304 259 307 229 310 246 b 272 298 297 274 302 305 b 63 266 204 279 134 272 b 72 514 68 348 72 432 b 71 595 72 541 72 567 b 56 665 71 619 66 642 b 17 579 9 651 17 608 b 3 144 19 433 7 289 b 0 -7 1 94 0 43 b 3 -134 0 -50 1 -92 b 7 -219 3 -163 7 -192 b 35 -251 7 -243 17 -251 b 49 -249 39 -251 43 -251 l 223 -223 l 230 -222 l 230 -359 b 223 -516 230 -410 223 -464 b 236 -619 223 -550 226 -585 b 255 -657 240 -634 236 -657 z m 58 -63 b 55 81 56 -14 53 33 l 56 99 b 85 99 65 99 75 98 b 232 108 134 104 183 107 l 240 109 l 236 66 b 232 -48 235 29 232 -10 b 58 -81 174 -63 115 -73 z', + }, + accidentalSharp: { + x_min: -22, + x_max: 390, + y_min: -384, + y_max: 383, + ha: 767, + o: 'm 202 -553 b 219 -526 213 -552 216 -536 b 226 -471 225 -507 226 -488 b 225 -425 226 -455 225 -441 b 226 -392 225 -415 225 -402 b 233 -305 229 -363 232 -334 l 297 -292 b 331 -469 300 -353 311 -412 b 347 -485 333 -477 338 -485 b 363 -469 356 -487 359 -477 b 374 -418 373 -454 374 -435 b 376 -382 376 -405 376 -393 b 372 -276 376 -347 373 -311 l 455 -259 b 550 -156 534 -243 544 -232 b 550 -109 550 -137 552 -124 b 526 -78 549 -91 541 -78 l 523 -78 b 507 -79 517 -78 513 -78 b 403 -101 474 -88 438 -95 l 379 -105 b 382 -42 380 -85 380 -63 b 384 96 383 4 384 50 b 503 131 425 107 464 118 b 549 173 524 138 543 150 b 562 249 554 199 562 223 b 554 294 562 264 560 279 b 536 315 549 308 544 315 l 533 315 b 517 312 528 315 523 315 b 382 266 472 294 428 279 l 377 344 b 359 531 374 406 372 469 b 348 552 356 539 357 552 l 347 552 l 343 552 b 315 528 331 549 317 544 l 315 501 b 320 249 315 416 318 333 l 243 232 b 239 361 243 275 242 318 b 226 425 238 383 238 403 b 199 359 194 409 199 382 b 193 223 196 312 194 268 b 72 202 153 215 112 209 b 4 118 13 192 4 183 b 10 66 0 102 12 84 b 33 29 7 39 14 30 b 48 32 37 29 42 30 b 187 55 95 39 141 46 l 183 -75 b 176 -145 181 -99 179 -122 b 16 -179 122 -156 69 -166 b -32 -232 -14 -186 -32 -197 b -17 -331 -32 -266 -19 -298 b -1 -356 -17 -347 -13 -354 b 12 -353 1 -356 6 -354 b 167 -320 63 -341 115 -331 b 166 -377 166 -338 166 -357 b 189 -526 166 -428 171 -477 b 202 -553 192 -536 189 -553 z m 240 -132 b 243 -37 242 -101 242 -69 b 245 65 245 -3 245 30 b 315 79 269 69 292 73 b 301 -120 308 13 305 -53 z', + }, + accidentalDoubleSharp: { + x_min: 0, + x_max: 287, + y_min: -159, + y_max: 159, + ha: 318, + o: 'm 84 -229 b 107 -216 91 -229 98 -225 b 200 -125 138 -186 167 -154 b 232 -95 212 -115 222 -105 b 347 -189 271 -125 310 -157 b 370 -200 356 -196 363 -200 b 396 -179 380 -200 389 -192 b 412 -102 410 -154 406 -125 b 377 -27 410 -69 400 -46 l 325 14 b 402 91 350 42 374 68 b 413 127 410 96 413 107 b 382 200 409 148 397 176 b 350 229 370 220 360 229 b 314 210 340 229 328 223 b 274 174 300 199 285 187 b 212 104 252 151 232 128 b 92 187 173 132 132 161 b 78 193 86 192 82 193 b 68 190 75 193 72 193 b 48 179 62 186 53 187 b 40 137 43 168 40 154 b 81 16 40 92 56 32 b 107 -3 89 10 98 4 b 14 -94 76 -32 45 -62 b 0 -124 6 -102 0 -114 b 12 -154 0 -134 3 -144 b 62 -215 26 -176 48 -193 b 84 -229 69 -225 76 -229 z', + }, + accidentalDoubleFlat: { + x_min: 0, + x_max: 359, + y_min: -220, + y_max: 446, + ha: 666, + o: 'm 43 -317 b 72 -301 55 -317 63 -310 b 160 -186 108 -268 134 -226 b 236 -60 186 -145 212 -102 b 233 -131 235 -85 233 -108 b 239 -220 233 -161 235 -190 b 259 -246 240 -233 239 -240 b 301 -228 284 -252 291 -238 b 465 -7 369 -163 416 -85 b 517 173 500 48 517 108 b 451 307 517 229 505 284 b 409 315 436 312 422 315 b 331 287 382 315 356 305 b 311 274 324 282 320 274 l 310 274 l 310 566 b 305 621 310 585 312 603 b 294 642 301 628 305 642 l 292 642 b 264 622 282 641 266 636 b 253 575 259 606 256 590 b 246 418 248 523 246 471 b 248 243 246 360 248 302 l 248 187 b 164 238 220 225 193 238 b 85 213 140 238 112 226 b 84 229 85 220 84 225 b 86 315 85 258 86 287 b 81 528 86 386 82 458 b 71 582 81 547 78 566 b 56 603 66 590 68 603 l 53 603 b 23 580 40 600 26 598 b 19 537 20 566 19 552 b 20 514 19 530 19 521 b 26 390 24 472 26 432 b 14 66 26 282 16 174 b 0 -168 13 -12 0 -91 b 12 -279 0 -206 3 -242 b 30 -314 16 -294 14 -308 b 43 -317 35 -317 39 -317 z m 301 -72 b 302 7 302 -45 302 -19 l 302 86 b 351 158 304 121 321 145 b 383 166 361 163 373 166 b 435 143 402 166 419 157 b 445 127 441 138 445 132 b 441 114 445 122 444 118 b 301 -72 397 49 354 -14 z m 75 -147 b 73 30 75 -86 75 -29 b 118 82 73 62 92 76 b 132 84 124 84 128 84 b 190 52 156 84 174 69 b 193 40 192 49 193 45 b 192 33 193 37 193 35 b 75 -147 157 -30 125 -95 z', + }, + accidentalParensLeft: { + x_min: 0, + x_max: 130.18934911242604, + y_min: -270, + y_max: 267.6082500723851, + ha: 537.6082500723851, + o: 'm 107 -389 b 127 -374 114 -389 120 -384 b 141 -347 132 -367 137 -357 b 151 -294 148 -330 151 -311 b 122 -207 151 -265 141 -236 b 63 -65 94 -164 72 -117 b 59 -10 60 -46 59 -27 b 145 223 59 78 94 153 b 187 354 176 262 189 305 b 177 384 187 364 190 380 b 143 373 166 387 153 383 b 124 354 137 367 130 361 b 0 -35 33 240 0 108 l 0 -92 b 85 -372 4 -193 27 -287 b 107 -389 92 -383 99 -389 z', + }, + accidentalParensRight: { + x_min: -0.4444444444444445, + x_max: 139, + y_min: -275, + y_max: 277, + ha: 552, + o: 'm 58 -396 b 96 -354 75 -396 85 -370 b 200 13 168 -238 200 -111 b 153 268 200 109 184 190 b 49 392 131 320 101 364 b 26 399 40 397 33 399 b 0 366 10 399 0 387 b 0 318 -1 350 0 334 l 0 291 b 27 238 -3 266 7 253 b 143 9 105 180 143 98 b 141 -20 143 -1 143 -10 b 63 -225 135 -92 108 -164 b 36 -307 45 -251 36 -278 b 40 -344 36 -320 37 -331 b 42 -356 42 -347 42 -351 b 58 -396 42 -374 37 -396 z', + }, + accidentalQuarterToneFlatStein: { + x_min: 0, + x_max: 208, + y_min: -240, + y_max: 440, + ha: 680, + o: 'm 272 -346 b 284 -333 278 -346 281 -341 b 300 -187 297 -285 300 -235 b 275 177 300 -65 279 55 b 268 432 272 262 268 347 l 268 477 b 264 599 269 517 265 559 b 236 634 264 619 252 632 l 235 634 b 217 605 220 634 220 615 b 207 513 210 575 207 543 b 210 419 207 481 210 451 b 216 255 213 364 216 310 l 216 217 l 215 219 b 154 243 194 228 174 238 b 111 251 138 248 124 251 b 3 140 50 251 10 210 b 0 81 0 120 0 101 b 194 -289 0 -76 68 -199 b 255 -336 215 -304 236 -320 b 272 -346 262 -343 268 -346 z m 233 -151 b 71 17 168 -105 108 -56 b 63 46 65 29 63 37 b 96 82 62 62 73 73 b 130 89 108 86 120 89 b 215 63 160 89 187 75 l 220 60 b 225 -35 220 29 222 -3 b 233 -151 229 -75 230 -114 z', + }, + accidentalThreeQuarterTonesFlatZimmermann: { + x_min: 0, + x_max: 422, + y_min: -240, + y_max: 440, + ha: 680, + o: 'm 272 -346 b 284 -333 278 -346 281 -341 b 300 -187 297 -285 300 -235 b 275 177 300 -65 279 55 b 268 432 272 262 268 347 l 268 477 b 264 599 269 517 265 559 b 236 634 264 619 252 632 l 235 634 b 217 605 220 634 220 615 b 207 513 210 575 207 543 b 210 419 207 481 210 451 b 216 255 213 364 216 310 l 216 217 l 215 219 b 154 243 194 228 174 238 b 111 251 138 248 124 251 b 3 140 50 251 10 210 b 0 81 0 120 0 101 b 194 -289 0 -76 68 -199 b 255 -336 215 -304 236 -320 b 272 -346 262 -343 268 -346 z m 336 -346 b 353 -336 340 -346 346 -343 b 413 -289 372 -320 393 -304 b 608 81 540 -199 608 -76 b 605 140 608 101 608 120 b 497 251 598 210 557 251 b 454 243 484 251 469 248 b 393 219 433 238 413 228 l 392 217 l 392 255 b 397 419 392 310 395 364 b 400 513 397 451 400 481 b 390 605 400 543 397 575 b 373 634 387 615 387 634 l 372 634 b 344 599 356 632 344 619 b 340 477 343 559 338 517 l 340 432 b 333 177 340 347 336 262 b 308 -187 328 55 308 -65 b 324 -333 308 -235 311 -285 b 336 -346 327 -341 330 -346 z m 233 -151 b 71 17 168 -105 108 -56 b 63 46 65 29 63 37 b 96 82 62 62 73 73 b 130 89 108 86 120 89 b 215 63 160 89 187 75 l 220 60 b 225 -35 220 29 222 -3 b 233 -151 229 -75 230 -114 z m 374 -151 b 383 -35 377 -114 379 -75 b 387 60 386 -3 387 29 l 393 63 b 478 89 420 75 448 89 b 511 82 488 89 500 86 b 544 46 534 73 546 62 b 537 17 544 37 543 29 b 374 -151 500 -56 439 -105 z', + }, + accidentalQuarterToneSharpStein: { + x_min: 0, + x_max: 300, + y_min: -338, + y_max: 351, + ha: 689, + o: 'm 194 -487 b 225 -432 215 -469 223 -452 b 238 -232 229 -366 236 -298 b 377 -199 285 -220 331 -209 b 418 -164 397 -193 410 -181 b 432 -88 428 -138 432 -114 b 412 -42 432 -55 428 -42 b 389 -46 406 -42 399 -43 l 235 -85 b 233 -20 235 -63 233 -42 b 233 105 232 22 233 63 b 312 121 259 111 285 117 b 406 226 390 134 400 145 b 373 284 409 268 402 284 b 344 281 364 284 356 282 b 232 258 307 276 269 266 b 230 308 232 275 232 291 b 210 505 229 374 232 441 b 183 471 189 501 184 490 b 180 406 181 449 180 428 b 184 246 180 353 184 300 b 48 222 140 236 94 228 b 0 168 6 216 0 209 b 7 86 1 141 4 114 b 27 66 9 73 13 66 l 35 66 b 184 94 85 66 135 84 b 187 -1 184 62 186 30 b 190 -96 189 -33 190 -65 l 112 -114 b 35 -213 27 -132 35 -132 b 33 -253 35 -226 35 -240 b 49 -276 33 -269 37 -276 b 62 -275 52 -276 56 -276 l 186 -245 l 186 -256 b 179 -387 180 -300 177 -343 b 194 -487 180 -419 179 -454 z', + }, + accidentalThreeQuarterTonesSharpStein: { + x_min: -23, + x_max: 388, + y_min: -373, + y_max: 445, + ha: 818, + o: 'm 114 -537 b 138 -475 137 -518 138 -495 b 147 -292 138 -413 144 -353 b 212 -278 168 -287 190 -282 b 243 -444 215 -333 225 -389 b 261 -467 248 -454 251 -465 b 281 -446 272 -469 276 -455 b 292 -347 292 -416 288 -384 b 288 -262 289 -320 288 -291 l 374 -245 b 376 -311 374 -266 374 -288 b 390 -456 379 -357 379 -405 b 416 -396 412 -436 415 -418 b 423 -287 420 -360 423 -323 b 422 -235 423 -269 423 -252 b 451 -229 432 -233 441 -232 b 547 -98 524 -215 547 -199 l 547 -89 b 521 -49 546 -59 540 -49 b 497 -52 516 -49 507 -49 b 418 -68 469 -56 444 -63 b 423 52 419 -29 422 12 b 426 140 425 81 425 109 b 495 160 449 145 472 153 b 552 219 526 170 546 189 b 559 279 557 240 553 262 b 530 341 559 324 552 341 b 490 331 520 341 507 338 b 432 311 471 324 452 318 b 449 552 436 392 442 471 b 452 588 451 563 452 575 b 446 622 452 599 451 611 b 436 641 444 629 448 641 b 418 628 428 641 420 636 b 409 602 413 621 410 611 b 386 297 396 501 390 399 b 297 274 356 288 327 281 b 291 403 295 317 294 360 b 274 550 288 452 284 501 b 259 569 271 564 265 569 b 240 559 253 569 248 563 b 230 537 232 554 230 546 l 230 488 b 233 369 230 448 232 409 b 236 261 236 333 238 297 b 156 245 210 255 183 251 b 154 396 154 295 154 346 b 150 416 154 403 153 410 b 140 438 145 423 150 438 l 138 438 b 118 413 128 436 118 428 b 112 354 118 393 114 374 b 109 238 109 315 109 276 b 49 226 89 233 69 230 b 3 163 16 222 3 202 b 7 91 3 138 9 114 b 29 62 7 69 13 62 b 39 63 32 62 35 63 b 104 73 60 66 82 71 b 101 -10 104 46 102 17 l 92 -132 l 10 -150 b -33 -204 -19 -157 -33 -170 b -19 -310 -32 -240 -19 -274 b -6 -324 -19 -321 -13 -324 b 6 -323 -1 -324 1 -324 b 82 -307 32 -317 58 -311 b 81 -376 82 -330 81 -353 b 114 -537 81 -431 94 -484 z m 294 -92 b 297 -37 295 -73 295 -56 b 300 49 300 -9 300 20 l 300 108 b 379 127 325 114 353 120 b 374 -76 376 59 374 -9 b 294 -92 347 -82 320 -86 z m 154 -120 b 157 20 154 -73 156 -26 b 158 82 158 40 158 62 b 230 95 183 86 206 89 b 225 0 229 63 226 32 b 217 -107 223 -35 220 -71 z', + }, + accidentalBuyukMucennebFlat: { + x_min: 1.8692317181955784, + x_max: 287, + y_min: -248, + y_max: 432.4720949426819, + ha: 680.4720949426819, + o: 'm 410 128 b 302 239 403 199 363 239 b 259 232 289 239 275 236 b 199 207 239 226 219 216 l 197 206 l 197 243 l 197 251 b 347 317 248 272 298 295 b 376 347 360 324 372 334 b 389 435 387 376 393 405 b 348 454 384 462 377 465 b 202 387 300 432 251 409 b 203 408 203 395 203 402 l 203 431 b 347 490 252 451 300 469 b 376 517 360 495 372 505 b 389 599 387 546 393 572 b 348 616 384 625 377 628 l 203 556 b 196 593 202 569 199 582 b 179 622 193 603 193 622 l 177 622 b 150 588 161 621 150 608 b 147 533 150 570 148 552 b 29 488 108 517 69 503 b 3 455 12 482 3 472 b 12 353 1 422 9 389 b 145 408 56 372 101 389 b 145 363 145 392 145 377 l 29 315 b 3 281 12 310 3 298 b 12 170 1 245 9 209 l 141 226 b 138 166 140 206 138 186 b 114 -199 134 43 115 -76 b 130 -344 114 -246 117 -297 b 141 -357 132 -353 135 -357 b 158 -347 145 -357 151 -354 b 219 -301 177 -331 199 -315 b 413 69 346 -210 413 -88 b 410 128 413 89 413 108 z m 350 35 b 343 6 350 26 348 17 b 180 -163 308 -69 245 -117 b 189 -46 183 -125 184 -86 b 193 49 192 -14 193 17 l 199 52 b 284 78 226 63 253 78 b 317 71 294 78 305 75 b 350 35 340 62 351 50 z', + }, + accidentalBakiyeFlat: { + x_min: 1.8692317181955784, + x_max: 287, + y_min: -236, + y_max: 444, + ha: 680, + o: 'm 141 -340 b 158 -330 145 -340 151 -337 b 219 -284 177 -314 199 -298 b 413 86 346 -193 413 -71 b 410 145 413 107 413 125 b 302 256 403 216 363 256 b 259 249 289 256 275 253 b 199 225 239 243 219 233 l 197 223 l 197 261 b 199 334 197 285 199 310 b 347 406 249 357 298 382 b 376 439 360 413 372 425 b 390 516 384 465 390 490 b 389 537 390 523 390 530 b 372 564 384 556 382 564 b 348 557 367 564 359 562 b 204 487 300 537 253 510 b 206 518 206 497 206 507 b 196 611 206 549 203 580 b 179 639 193 621 193 639 l 177 639 b 150 605 161 638 150 625 b 145 482 148 564 144 523 l 145 458 b 29 405 107 439 68 420 b 3 366 12 397 3 386 b 12 243 1 325 9 287 b 143 307 56 265 99 285 l 138 183 b 114 -181 134 60 114 -59 b 130 -327 114 -229 117 -279 b 141 -340 132 -336 135 -340 z m 180 -145 b 189 -29 183 -108 184 -69 b 193 66 192 3 193 35 l 199 69 b 284 95 226 81 253 95 b 317 88 294 95 305 92 b 350 52 340 79 351 68 b 343 23 350 43 348 35 b 180 -145 305 -50 245 -99 z', + }, + accidentalKomaSharp: { + x_min: 0, + x_max: 300, + y_min: -338, + y_max: 351, + ha: 689, + o: 'm 194 -487 b 225 -432 215 -469 223 -452 b 238 -232 229 -366 236 -298 b 377 -199 285 -220 331 -209 b 418 -164 397 -193 410 -181 b 432 -88 428 -138 432 -114 b 412 -42 432 -55 428 -42 b 389 -46 406 -42 399 -43 l 235 -85 b 233 -20 235 -63 233 -42 b 233 105 232 22 233 63 b 312 121 259 111 285 117 b 406 226 390 134 400 145 b 373 284 409 268 402 284 b 344 281 364 284 356 282 b 232 258 307 276 269 266 b 230 308 232 275 232 291 b 210 505 229 374 232 441 b 183 471 189 501 184 490 b 180 406 181 449 180 428 b 184 246 180 353 184 300 b 48 222 140 236 94 228 b 0 168 6 216 0 209 b 7 86 1 141 4 114 b 27 66 9 73 13 66 l 35 66 b 184 94 85 66 135 84 b 187 -1 184 62 186 30 b 190 -96 189 -33 190 -65 l 112 -114 b 35 -213 27 -132 35 -132 b 33 -253 35 -226 35 -240 b 49 -276 33 -269 37 -276 b 62 -275 52 -276 56 -276 l 186 -245 l 186 -256 b 179 -387 180 -300 177 -343 b 194 -487 180 -419 179 -454 z', + }, + accidentalKucukMucennebSharp: { + x_min: -0.15206251809627475, + x_max: 359, + y_min: -420, + y_max: 343, + ha: 763, + o: 'm 236 -605 b 262 -543 256 -583 261 -564 b 269 -423 268 -503 269 -464 b 266 -340 269 -396 268 -367 l 361 -318 b 405 -276 384 -312 399 -298 b 413 -189 412 -248 416 -219 b 395 -164 412 -171 409 -164 b 382 -166 392 -164 387 -164 b 264 -193 343 -176 304 -184 b 269 -102 265 -163 268 -132 b 454 -62 331 -89 392 -78 b 501 -23 477 -58 494 -45 b 517 62 511 6 517 33 b 487 112 517 95 513 112 b 471 111 482 112 477 112 b 274 66 406 95 340 81 b 276 138 275 91 276 114 b 350 154 301 144 325 148 b 402 203 377 160 396 176 b 412 284 408 230 412 258 b 392 311 412 302 406 311 b 372 308 386 311 379 310 b 287 291 343 301 314 297 l 295 405 b 298 441 297 416 298 428 b 292 475 298 452 297 464 b 282 494 289 482 294 494 b 264 481 274 494 266 490 b 255 455 259 474 256 464 b 239 282 248 397 243 340 b 148 268 209 278 179 274 b 62 164 62 252 62 253 l 62 132 b 79 108 60 117 65 108 l 86 108 l 230 130 b 229 92 230 118 229 105 b 228 56 228 79 228 68 b 66 20 173 43 120 32 b 0 -59 6 7 3 1 l 0 -138 b 14 -160 -1 -156 4 -160 b 27 -158 19 -160 23 -160 b 222 -112 92 -141 157 -127 b 220 -203 220 -143 220 -173 b 147 -217 196 -207 171 -213 b 89 -288 92 -228 89 -229 b 95 -347 85 -305 96 -325 b 112 -374 92 -366 98 -374 b 125 -373 117 -374 121 -374 l 220 -351 b 222 -458 220 -386 220 -422 b 236 -605 223 -504 225 -552 z', + }, + accidentalKoron: { + x_min: 0, + x_max: 303, + y_min: -462.4598053473055, + y_max: 180, + ha: 642.4598053473055, + o: 'm 59 -665 b 72 -649 69 -662 72 -657 b 69 -626 72 -642 69 -634 b 69 -622 69 -625 69 -624 l 69 -600 b 55 -156 60 -456 68 -311 b 86 -170 66 -166 76 -170 b 112 -163 95 -170 104 -166 b 390 -35 204 -120 298 -78 b 436 -1 409 -27 436 -27 b 396 46 436 22 413 33 l 382 55 b 46 243 271 121 157 179 b 12 259 29 253 17 259 b 0 219 1 259 0 248 b 3 -372 0 22 3 -176 b 6 -616 3 -454 6 -536 b 59 -665 6 -638 40 -671 z m 55 199 b 363 24 156 141 258 84 b 55 -118 259 -24 160 -69 z', + }, + accidentalSori: { + x_min: 0, + x_max: 434, + y_min: -295, + y_max: 325, + ha: 620, + o: 'm 194 -425 b 196 -409 194 -418 196 -413 b 194 -194 196 -337 196 -266 b 364 -127 251 -171 308 -150 b 361 -321 363 -192 364 -256 b 410 -387 360 -357 373 -377 b 413 -373 412 -382 413 -377 b 418 -114 418 -287 418 -200 l 418 -105 b 595 -35 477 -82 536 -59 b 625 0 612 -27 625 -22 b 593 48 624 23 618 39 l 419 117 b 423 370 419 202 423 285 b 426 403 423 382 426 393 b 418 436 426 415 425 426 b 384 468 409 449 399 468 b 369 448 370 468 369 459 b 369 436 369 444 369 441 l 369 428 l 369 423 b 367 138 369 328 367 233 l 353 143 l 192 207 l 192 367 b 173 406 192 383 184 396 b 151 422 167 413 160 422 b 144 420 148 422 147 422 b 137 403 138 416 137 410 l 137 392 l 137 229 b 33 271 102 243 68 256 b 13 276 26 274 19 276 b 0 262 6 276 0 272 b 35 199 1 239 0 212 l 138 160 b 140 -148 138 58 138 -45 b 56 -181 111 -158 84 -170 b 24 -215 35 -189 24 -199 b 29 -235 24 -220 26 -228 b 49 -253 35 -249 42 -253 b 78 -240 59 -253 69 -243 b 140 -216 98 -233 120 -225 l 140 -356 b 194 -425 140 -406 141 -406 z m 194 -125 b 193 138 194 -37 193 50 b 315 89 233 122 275 107 b 366 71 333 84 350 76 b 364 -58 366 27 366 -16 b 194 -125 308 -81 251 -104 z m 419 49 l 526 7 l 485 -10 l 419 -36 z', + }, + articAccentAbove: { + x_min: 0, + x_max: 425, + y_min: 0, + y_max: 326, + ha: 326, + o: 'm 27 1 b 78 12 46 0 62 6 b 347 112 168 45 253 91 b 521 184 409 128 459 167 b 608 259 557 194 589 220 b 612 274 611 265 612 271 b 598 292 612 281 608 287 b 477 347 559 312 518 331 b 176 465 374 384 275 425 b 156 469 168 468 161 469 b 125 456 145 469 137 465 b 53 370 96 432 78 399 b 45 353 48 363 45 357 b 68 333 45 344 52 337 b 360 225 166 298 262 261 b 192 154 302 203 249 171 b 13 36 120 132 53 105 b 0 13 9 29 0 22 l 0 9 b 16 0 3 1 10 0 l 26 0 b 27 1 27 0 27 0 z', + }, + articAccentBelow: { + x_min: 0, + x_max: 425, + y_min: -326, + y_max: 0, + ha: 326, + o: 'm 26 -469 l 27 -469 b 78 -458 46 -469 62 -464 b 347 -357 168 -426 253 -380 b 521 -285 409 -341 459 -302 b 608 -210 557 -276 589 -249 b 612 -196 611 -204 612 -200 b 598 -179 612 -189 608 -183 b 477 -122 559 -157 518 -138 b 176 -4 374 -85 275 -45 b 156 0 168 -1 161 0 b 125 -13 145 0 137 -4 b 53 -99 96 -37 78 -71 b 45 -117 48 -107 45 -112 b 68 -137 45 -125 52 -132 b 360 -245 166 -171 262 -209 b 192 -315 302 -266 249 -300 b 13 -433 120 -337 53 -366 b 0 -456 9 -442 0 -448 l 0 -461 b 16 -469 3 -468 10 -469 z', + }, + articTenutoAbove: { + x_min: 0.35192668236256364, + x_max: 471.1238660564107, + y_min: 0, + y_max: 56, + ha: 56, + o: 'm 137 0 b 197 1 156 0 179 1 b 409 6 268 1 338 6 b 482 4 432 6 459 6 b 556 0 508 3 534 0 b 651 10 588 0 621 3 b 678 27 662 12 678 10 b 654 59 680 45 672 53 b 511 75 606 73 560 73 b 255 81 426 78 341 81 b 160 79 222 81 193 79 l 36 79 b 1 71 24 78 7 85 b 19 32 -3 56 9 43 b 45 16 26 24 36 20 b 137 0 76 3 108 0 z', + }, + articTenutoBelow: { + x_min: 0.35192668236256364, + x_max: 471.1238660564107, + y_min: -59, + y_max: -3, + ha: 56, + o: 'm 137 -85 b 197 -84 156 -85 179 -84 b 409 -79 268 -84 338 -79 b 482 -81 432 -79 459 -79 b 556 -85 508 -82 534 -85 b 651 -75 588 -85 621 -82 b 678 -58 662 -73 678 -75 b 654 -26 680 -40 672 -32 b 511 -10 606 -12 560 -12 b 255 -4 426 -7 341 -4 b 160 -6 222 -4 193 -6 l 36 -6 b 1 -14 24 -7 7 0 b 19 -53 -3 -29 9 -42 b 45 -69 26 -60 36 -65 b 137 -85 76 -82 108 -85 z', + }, + articStaccatoAbove: { + x_min: 1.4151102965496913, + x_max: 112, + y_min: 0, + y_max: 156, + ha: 156, + o: 'm 98 0 b 132 23 109 0 122 7 b 161 112 150 50 161 79 b 158 148 161 124 161 137 b 125 186 154 167 131 167 b 63 225 117 215 85 216 b 23 197 45 222 30 219 b 3 91 12 163 12 127 b 19 66 0 79 4 69 b 65 27 40 62 53 46 b 98 0 76 9 88 0 z', + }, + articStaccatoBelow: { + x_min: 1.4151102965496913, + x_max: 112.08403222864916, + y_min: -156, + y_max: 0, + ha: 156, + o: 'm 132 -202 b 161 -112 151 -174 163 -145 b 158 -76 161 -101 161 -88 b 125 -39 153 -58 131 -58 b 63 0 115 -10 85 -9 b 23 -27 45 -3 30 -6 b 3 -134 12 -62 10 -98 b 19 -158 0 -145 4 -156 b 65 -197 40 -164 53 -179 b 98 -225 75 -216 88 -225 b 132 -202 109 -225 122 -217 z', + }, + articStaccatissimoAbove: { + x_min: 0, + x_max: 139, + y_min: 0, + y_max: 411, + ha: 411, + o: 'm 104 0 b 144 115 143 29 138 75 b 197 423 158 217 180 320 b 200 454 199 433 200 444 b 181 540 200 482 193 513 b 112 592 167 573 141 592 b 55 567 92 592 72 585 b 0 490 32 546 3 527 l 0 484 b 27 279 14 416 14 347 b 84 20 43 193 52 104 b 96 0 86 13 92 6 z', + }, + articStaccatissimoBelow: { + x_min: 0, + x_max: 139, + y_min: -411, + y_max: 0, + ha: 411, + o: 'm 88 -592 b 145 -567 108 -592 128 -585 b 200 -490 168 -546 197 -527 l 200 -484 b 173 -279 186 -416 186 -347 b 117 -20 157 -193 148 -104 b 104 0 114 -13 108 -6 l 96 0 b 56 -115 58 -29 62 -75 b 3 -423 42 -217 20 -320 b 0 -454 1 -433 0 -444 b 19 -540 0 -482 7 -513 b 88 -592 33 -573 59 -592 z', + }, + articMarcatoAbove: { + x_min: 0.04121419527862119, + x_max: 396, + y_min: 0, + y_max: 328.0000000000001, + ha: 328.0000000000001, + o: 'm 477 0 b 510 13 488 0 500 6 b 570 124 546 40 563 81 b 547 183 570 147 560 166 b 356 422 487 265 405 330 b 346 442 354 429 350 436 l 346 444 b 318 465 340 456 330 464 l 312 469 b 274 449 294 480 284 461 b 242 413 262 438 253 425 b 56 196 177 343 112 274 b 1 56 26 154 13 105 b 27 20 -4 35 9 20 b 42 23 32 20 37 20 b 84 53 59 29 72 39 b 255 269 141 125 193 200 b 275 229 262 255 266 242 b 448 14 324 151 390 86 b 477 0 456 4 467 0 z', + }, + articMarcatoBelow: { + x_min: 0, + x_max: 395.9587858047214, + y_min: -328.0000000000001, + y_max: 0, + ha: 328.0000000000001, + o: 'm 258 -469 b 297 -449 276 -480 287 -461 b 328 -413 308 -438 317 -425 b 514 -196 393 -343 458 -274 b 569 -56 544 -154 557 -105 b 543 -20 575 -35 562 -20 b 528 -23 539 -20 533 -20 b 487 -53 511 -29 498 -39 b 315 -269 429 -125 377 -200 b 295 -229 308 -255 304 -242 b 122 -14 246 -151 180 -86 b 94 0 114 -4 104 0 b 60 -13 82 0 71 -6 b 0 -124 24 -40 7 -81 b 23 -183 0 -147 10 -166 b 215 -422 84 -265 166 -330 b 225 -442 216 -429 220 -436 l 225 -444 b 252 -465 230 -456 240 -464 z', + }, + fermataAbove: { + x_min: -0.04550444040404433, + x_max: 472, + y_min: 2.015071727506986, + y_max: 454, + ha: 451.984928272493, + o: 'm 39 10 b 78 108 66 37 71 73 b 163 311 92 181 111 252 b 284 423 199 353 239 392 b 373 458 312 444 340 454 b 433 431 395 458 410 446 b 603 153 530 361 596 276 b 595 121 603 144 595 131 l 595 88 b 602 50 596 75 589 55 b 639 73 619 43 631 60 b 651 102 645 82 648 92 b 667 194 660 132 662 163 b 680 278 671 222 672 248 b 560 567 680 386 638 481 b 396 654 508 625 452 649 b 291 632 364 654 325 644 b 161 526 235 613 200 566 b 4 249 85 446 26 357 b 4 174 0 222 -3 196 b 10 19 4 124 4 69 b 29 4 12 6 16 0 b 39 10 35 4 33 4 z m 338 37 b 370 40 350 36 357 36 b 380 75 387 40 380 43 b 389 94 382 79 382 85 b 356 132 389 111 374 122 b 269 154 328 147 300 156 b 225 125 252 154 228 157 b 261 48 222 81 232 56 b 338 37 287 40 312 40 z', + }, + fermataBelow: { + x_min: -0.310835055998654, + x_max: 518.570567335755, + y_min: -430, + y_max: -0.9161449836506543, + ha: 429.08385501634933, + o: 'm 344 -615 b 500 -543 402 -602 452 -576 b 713 -253 605 -471 661 -364 b 746 -98 737 -204 750 -153 b 727 -59 744 -82 744 -59 b 688 -88 711 -59 694 -68 b 678 -109 687 -96 683 -102 b 562 -314 648 -183 611 -252 b 387 -439 516 -373 458 -416 b 328 -449 367 -446 347 -449 b 180 -386 274 -449 225 -423 b 69 -179 111 -330 69 -262 b 75 -121 69 -160 71 -141 b 84 -58 78 -101 84 -79 b 82 -39 84 -52 84 -45 b 68 -1 79 -26 82 -4 b 26 -32 49 0 33 -12 b 20 -52 24 -39 22 -45 b 0 -223 9 -107 -3 -161 b 141 -553 1 -348 27 -468 b 304 -619 192 -590 243 -619 b 344 -615 317 -619 330 -618 z m 415 -190 b 435 -157 429 -192 435 -184 b 308 -27 435 -86 379 -27 b 271 -46 287 -27 272 -35 b 269 -69 269 -55 269 -62 b 364 -183 269 -128 302 -170 z', + }, + breathMarkComma: { + x_min: 0, + x_max: 148, + y_min: 0, + y_max: 275, + ha: 275, + o: 'm 120 0 b 187 78 156 20 174 48 b 213 209 206 121 213 164 b 206 294 213 238 210 265 b 140 390 200 337 171 367 b 122 396 134 395 128 396 b 68 382 105 396 85 384 b 46 379 60 382 53 382 b 0 328 12 369 0 357 b 1 311 0 323 1 317 b 30 210 4 275 22 243 b 66 167 39 179 46 167 b 94 171 73 167 82 168 b 143 180 109 174 124 180 b 160 179 148 180 154 180 b 120 66 124 145 120 107 b 120 0 120 45 121 23 z', + }, + breathMarkUpbow: { + x_min: 0, + x_max: 254, + y_min: 0, + y_max: 595, + ha: 595, + o: 'm 233 0 b 256 48 251 14 253 30 b 272 183 264 92 265 138 b 311 455 289 274 295 364 b 350 716 327 541 341 628 b 366 815 354 749 366 782 b 359 857 366 829 363 842 b 327 815 334 852 330 832 b 302 674 315 769 310 721 b 248 357 288 567 269 462 b 225 226 240 314 242 268 b 210 251 212 232 213 243 b 69 721 163 408 117 564 b 32 835 58 760 53 801 b 20 851 29 841 27 851 b 14 850 19 851 16 851 b 0 828 6 847 0 838 l 0 825 b 12 765 1 804 7 785 b 194 125 73 552 132 338 b 233 0 206 84 213 42 z', + }, + caesura: { + x_min: 0, + x_max: 565.5831864753837, + y_min: -0.09016994374947417, + y_max: 562.4481112129314, + ha: 562.5382811566809, + o: 'm 0 76 b 49 122 24 92 37 107 b 444 613 180 287 305 455 b 528 770 484 660 518 708 b 531 792 530 778 531 785 b 524 808 531 799 530 805 b 490 792 513 815 498 802 b 390 683 456 756 420 721 b 48 262 275 543 164 400 b 0 76 0 207 7 145 z m 226 1 b 248 13 238 -4 243 7 l 353 137 b 759 638 490 302 632 464 b 814 805 795 688 819 740 b 779 786 796 805 788 796 b 628 609 724 732 678 668 b 310 242 523 485 416 363 b 217 69 265 190 217 140 b 222 30 217 58 219 45 b 222 23 222 29 220 26 b 220 12 222 20 220 16 b 226 1 220 7 222 3 z', + }, + caesuraCurved: { + x_min: 0, + x_max: 386, + y_min: -10, + y_max: 584, + ha: 594, + o: 'm 180 -14 b 246 14 213 -13 230 0 b 347 144 288 52 315 99 b 526 471 420 246 488 350 b 556 671 546 537 556 603 b 543 798 556 713 553 756 b 504 837 537 822 521 828 b 490 841 500 840 494 841 b 472 832 482 841 477 838 b 406 678 436 785 406 737 b 410 638 406 665 408 652 b 425 511 419 595 425 553 b 315 186 425 395 387 287 b 180 -14 271 122 228 58 z m 14 24 b 49 39 29 24 40 32 b 120 114 76 60 99 85 b 216 276 156 166 184 223 b 317 626 281 384 317 501 b 315 664 317 639 317 651 b 301 773 314 701 311 737 b 262 808 295 795 278 808 b 245 799 256 808 249 805 b 170 641 209 750 170 706 b 171 621 170 634 170 628 b 177 511 176 585 177 549 b 114 229 177 415 160 320 b 0 26 79 161 42 95 b 14 24 6 24 10 24 z', + }, + restMaxima: { + x_min: 0, + x_max: 366, + y_min: -255, + y_max: 255, + ha: 510, + o: 'm 397 -367 b 504 -343 436 -367 468 -347 b 518 -318 516 -341 518 -330 b 527 -30 518 -217 527 -117 b 526 33 527 -7 527 13 l 526 301 b 501 350 526 323 520 341 b 428 367 477 361 452 367 b 374 359 410 367 393 364 b 357 333 361 354 357 347 b 356 91 357 252 356 171 l 356 30 b 340 -307 357 -82 346 -194 b 397 -367 337 -354 350 -367 z m 46 -357 b 58 -356 49 -357 53 -357 b 154 -333 91 -351 121 -338 b 173 -305 168 -330 173 -320 l 173 302 b 132 356 173 330 157 348 b 68 364 112 363 89 364 b 3 304 19 363 1 348 l 3 4 l 0 4 b 1 -302 0 -98 0 -200 b 46 -357 1 -331 16 -357 z', + }, + restDoubleWhole: { + x_min: 0, + x_max: 122, + y_min: 0, + y_max: 249, + ha: 249, + o: 'm 43 0 b 58 1 48 0 52 0 b 124 20 81 6 102 17 b 176 96 173 27 176 58 b 173 220 174 138 173 179 b 176 304 173 248 176 276 b 140 353 176 331 163 346 b 95 359 125 356 111 359 b 32 346 73 359 52 354 b 0 315 20 340 0 337 b 1 243 0 291 1 268 l 1 174 l 4 174 l 4 48 b 43 0 4 16 17 0 z', + }, + restWhole: { + x_min: 0.8908513171538642, + x_max: 500, + y_min: -120, + y_max: 14, + ha: 134, + o: 'm 356 -173 l 356 -171 l 642 -171 b 719 -115 680 -171 717 -145 b 720 -82 719 -104 720 -92 b 711 -20 720 -60 719 -40 b 672 17 704 0 694 10 b 649 20 664 20 657 20 b 605 17 634 20 621 17 b 92 19 433 17 262 17 b 29 7 69 20 49 12 b 9 -17 12 4 9 -6 b 10 -43 9 -26 10 -35 b 1 -84 10 -58 3 -72 b 76 -173 0 -147 7 -173 z', + }, + restHalf: { + x_min: 0, + x_max: 518.3998530468286, + y_min: 0, + y_max: 162, + ha: 162, + o: 'm 98 0 l 556 0 b 665 1 592 0 629 0 b 746 82 720 3 743 29 b 736 174 749 114 740 144 b 670 232 729 215 708 232 b 570 229 636 232 603 229 b 356 233 498 229 426 233 l 73 233 b 0 179 19 233 0 220 b 1 154 0 171 0 164 b 6 95 4 135 6 115 b 98 0 3 27 29 0 z', + }, + restQuarter: { + x_min: -0.3784452492533808, + x_max: 263, + y_min: -415, + y_max: 415, + ha: 830, + o: 'm 151 -596 b 164 -563 163 -589 161 -575 b 160 -546 164 -557 161 -552 b 124 -396 148 -495 135 -446 b 122 -380 122 -390 122 -384 b 199 -255 122 -331 158 -272 b 228 -256 209 -249 217 -253 b 324 -346 274 -271 298 -310 b 353 -369 331 -356 341 -369 b 360 -367 356 -369 357 -369 b 379 -336 373 -361 379 -348 l 377 -325 b 344 -232 372 -292 366 -258 b 249 -58 301 -180 278 -117 b 242 -36 245 -49 242 -42 b 258 -7 242 -26 248 -17 b 328 78 284 20 311 45 b 354 158 344 104 354 131 b 337 216 354 177 350 196 b 213 435 294 288 249 359 b 115 575 189 487 158 536 b 78 598 105 585 92 598 b 59 592 72 598 66 596 b 39 562 45 583 39 572 b 53 527 39 550 45 539 b 168 344 98 469 125 402 b 187 307 181 328 187 317 b 153 269 187 294 176 284 b 62 213 122 252 91 235 b 40 180 48 203 40 192 b 46 158 40 173 43 166 b 99 65 60 125 79 95 b 183 -79 131 20 160 -29 b 156 -86 173 -88 164 -85 b 0 -261 58 -99 -7 -173 b 96 -557 10 -366 49 -464 b 124 -585 102 -569 109 -580 b 145 -598 132 -588 138 -598 b 151 -596 147 -598 150 -598 z', + }, + rest8th: { + x_min: 0, + x_max: 289, + y_min: -260, + y_max: 261, + ha: 521, + o: 'm 164 -374 b 212 -340 190 -373 203 -357 b 276 -190 238 -292 258 -242 b 410 285 333 -36 359 128 b 416 314 413 294 416 304 l 416 321 b 393 354 415 341 410 354 b 382 353 389 354 386 354 b 292 311 347 347 315 333 b 174 225 256 276 216 251 b 157 219 168 222 163 219 b 140 228 151 219 145 222 b 131 246 134 233 131 240 b 135 262 131 252 132 256 b 147 298 141 272 147 285 b 127 367 147 323 154 354 b 94 376 114 373 102 376 b 48 336 75 376 63 363 b 3 181 20 288 12 235 b 0 150 1 170 0 160 b 109 24 0 84 35 24 b 171 36 127 24 148 27 b 289 101 213 52 248 75 b 164 -374 256 -62 193 -213 z', + }, + rest16th: { + x_min: 0, + x_max: 333, + y_min: -328.283950617284, + y_max: 244, + ha: 572.2839506172841, + o: 'm 209 -471 b 246 -458 222 -477 236 -468 b 307 -338 279 -425 300 -384 b 324 -226 312 -301 317 -262 b 428 161 350 -94 386 35 b 480 318 445 215 480 259 b 467 347 480 331 477 341 b 445 351 461 350 454 351 b 408 337 432 351 419 347 b 402 333 405 336 403 334 b 223 215 344 294 294 245 b 236 259 229 233 235 246 b 238 276 238 265 238 271 b 212 338 238 302 226 334 b 193 341 206 340 199 341 b 86 289 156 341 104 317 b 59 180 66 255 59 217 b 156 27 59 76 92 27 b 236 46 179 27 204 35 b 338 101 271 59 298 82 b 289 -49 312 49 302 0 b 196 -122 276 -99 235 -107 b 176 -114 187 -127 176 -127 l 176 -111 b 157 -53 177 -88 164 -72 b 69 -9 141 -7 101 -16 b 17 -48 43 -3 29 -27 b 0 -127 4 -73 0 -99 b 6 -186 0 -147 1 -167 b 82 -294 17 -262 37 -294 b 160 -276 102 -294 128 -289 b 219 -242 181 -268 203 -259 b 236 -230 223 -236 229 -230 b 243 -232 239 -230 240 -230 b 235 -275 248 -246 239 -261 b 202 -456 220 -334 202 -395 b 209 -471 202 -462 203 -468 z', + }, + rest32nd: { + x_min: 0, + x_max: 347, + y_min: -497.5023916875033, + y_max: 483, + ha: 980.5023916875033, + o: 'm 177 -716 b 217 -690 194 -720 209 -704 b 233 -655 225 -680 230 -668 b 292 -390 253 -567 275 -480 b 361 -48 312 -275 336 -161 b 452 400 393 102 422 252 b 497 629 467 477 482 553 b 500 647 498 635 500 641 b 480 691 500 665 492 684 b 464 696 475 694 469 696 b 418 674 448 696 431 685 l 361 626 b 333 611 353 618 343 612 b 308 629 325 611 317 616 b 239 667 292 651 265 661 b 204 670 228 668 216 670 b 86 559 141 670 95 628 b 85 537 86 552 85 544 b 107 416 85 495 95 455 b 161 372 114 389 134 372 b 174 373 166 372 170 372 b 226 383 192 374 209 377 b 387 478 285 402 330 444 b 364 386 379 444 364 415 b 276 271 364 323 320 298 b 265 266 272 268 268 266 b 252 276 261 266 256 269 b 143 333 229 311 186 333 b 107 327 130 333 118 330 b 43 243 62 314 46 291 b 58 145 43 210 52 179 b 150 63 68 92 99 63 b 315 132 213 63 259 98 b 266 -58 297 63 281 4 b 207 -101 259 -91 230 -96 b 186 -66 186 -107 199 -75 b 180 -50 181 -63 183 -55 b 101 -3 160 -23 135 -3 b 9 -66 59 -3 20 -32 b 0 -118 3 -84 0 -101 b 10 -196 0 -144 6 -170 b 104 -287 20 -256 52 -287 b 137 -282 114 -287 125 -287 b 184 -269 151 -281 171 -269 b 196 -275 190 -269 193 -271 b 199 -287 197 -278 199 -282 b 184 -343 199 -304 189 -325 b 181 -348 184 -346 183 -347 b 134 -595 158 -429 131 -508 b 156 -677 134 -624 150 -648 b 177 -716 158 -693 160 -713 z', + }, + rest64th: { + x_min: 0, + x_max: 428, + y_min: -720, + y_max: 473.6797408388932, + ha: 1193.6797408388932, + o: 'm 200 -1037 b 229 -1012 215 -1037 222 -1025 b 238 -984 233 -1004 236 -994 b 282 -780 248 -914 265 -848 b 386 -369 317 -644 354 -507 b 491 104 422 -212 451 -53 b 600 541 528 249 550 399 b 616 629 611 570 616 599 b 600 680 616 648 615 671 b 550 665 586 687 566 677 b 480 618 527 649 501 635 b 464 611 474 613 468 611 b 448 622 458 611 454 615 b 366 662 425 651 397 662 b 331 658 354 662 343 661 b 242 572 285 647 253 619 b 236 528 239 557 236 543 b 266 400 236 484 251 442 b 325 373 274 377 301 373 b 436 409 366 373 403 383 l 494 452 b 474 360 485 416 474 389 b 383 248 474 297 435 269 b 320 328 377 288 351 310 b 276 341 305 337 291 341 b 186 269 235 341 194 311 b 181 230 183 256 181 243 b 187 153 181 204 186 179 b 279 63 192 86 233 63 b 304 65 288 63 295 63 b 416 115 344 72 379 92 b 387 -14 406 69 397 27 b 320 -95 380 -52 369 -86 b 318 -79 320 -89 320 -84 b 223 0 305 -29 271 0 b 122 -81 171 0 135 -30 b 118 -127 120 -96 118 -112 l 118 -196 b 137 -242 118 -215 125 -229 b 209 -275 157 -266 181 -275 b 249 -269 222 -275 235 -274 b 318 -248 272 -264 294 -255 b 281 -390 315 -301 292 -344 b 276 -400 279 -393 279 -397 b 259 -420 272 -408 266 -416 b 246 -429 255 -425 251 -429 b 233 -415 242 -429 238 -426 b 176 -359 225 -389 200 -372 b 121 -346 158 -348 140 -346 b 14 -408 73 -346 27 -370 b 0 -498 4 -438 0 -468 b 6 -564 0 -520 3 -543 b 91 -635 12 -611 45 -635 b 131 -629 104 -635 117 -634 b 223 -590 163 -622 190 -603 b 166 -824 203 -671 189 -747 b 148 -912 157 -852 148 -881 b 156 -955 148 -926 150 -940 b 177 -1008 161 -972 170 -991 b 200 -1037 181 -1020 183 -1037 z', + }, + rest128th: { + x_min: 0.6717818579024267, + x_max: 491, + y_min: -711, + y_max: 719, + ha: 1430, + o: 'm 233 -1015 b 271 -956 256 -1002 266 -981 l 314 -723 b 393 -350 337 -598 366 -474 b 543 312 442 -128 492 91 b 687 841 583 490 635 665 b 707 958 698 880 707 919 b 706 986 707 968 707 976 b 688 1025 704 999 704 1024 b 670 1027 683 1025 677 1027 b 629 1007 655 1027 639 1022 b 559 945 613 981 586 968 b 541 1004 553 968 559 991 b 456 1035 516 1024 488 1035 b 419 1030 444 1035 431 1034 b 344 953 379 1018 353 995 b 340 900 341 936 340 917 b 341 847 340 881 341 864 b 380 779 340 815 354 793 b 464 763 406 765 435 762 b 592 814 510 763 549 786 b 546 660 575 757 556 710 b 480 585 537 619 517 598 b 478 599 480 590 478 595 b 386 678 472 641 428 678 b 294 612 343 678 304 651 b 279 477 282 567 278 521 b 363 395 281 428 317 395 b 380 396 369 395 374 395 b 488 436 416 403 449 419 b 384 233 469 357 468 275 b 359 291 373 252 377 276 b 282 318 337 310 310 318 b 181 264 243 318 203 298 b 154 107 153 216 154 161 b 242 6 154 42 187 6 b 278 10 253 6 265 7 b 408 88 330 22 366 55 b 387 -1 400 56 393 27 b 301 -112 379 -55 354 -94 b 289 -65 297 -95 302 -79 b 219 -32 269 -42 245 -32 b 183 -37 207 -32 196 -35 b 112 -109 144 -46 121 -71 b 105 -219 104 -145 108 -183 b 186 -315 101 -276 134 -315 b 230 -307 199 -315 215 -312 b 324 -256 264 -295 292 -275 b 180 -491 323 -383 266 -471 b 183 -459 180 -480 180 -469 b 184 -442 184 -454 184 -448 l 184 -436 b 135 -369 184 -403 170 -383 b 102 -363 125 -364 114 -363 b 29 -399 73 -363 45 -376 b 1 -556 -4 -448 6 -503 b 109 -670 -4 -625 43 -670 b 140 -667 118 -670 130 -668 b 253 -616 180 -658 213 -638 b 238 -688 248 -644 242 -665 b 192 -959 220 -779 192 -867 b 193 -992 192 -971 192 -981 b 210 -1024 194 -1014 199 -1024 b 233 -1015 216 -1024 223 -1021 z', + }, + dynamicPiano: { + x_min: -49, + x_max: 326.5019318364244, + y_min: -142, + y_max: 515, + ha: 657, + o: 'm -56 -204 b -42 -202 -52 -204 -46 -203 b -19 -194 -35 -202 -26 -197 b 147 -138 35 -170 91 -151 b 249 -58 194 -127 223 -95 b 262 -29 255 -50 262 -39 b 258 -17 262 -24 261 -20 b 232 -7 252 -10 242 -7 b 210 -12 225 -7 217 -9 b 125 -40 184 -23 157 -30 b 183 140 153 19 171 79 b 251 167 207 144 230 153 b 469 518 383 262 480 382 b 357 687 472 626 420 687 b 315 678 344 687 330 684 b 204 600 279 664 240 634 b 210 704 206 635 209 670 b 215 721 212 710 215 716 b 206 733 215 727 212 730 b 180 742 197 736 189 742 b 164 734 176 742 170 740 b 1 575 108 684 36 645 b -7 557 -1 569 -7 563 b -6 553 -7 556 -7 554 b 7 547 -3 547 3 547 l 17 547 b 82 575 43 547 59 567 l 82 452 b 56 46 82 317 81 180 b 17 -66 49 7 46 -36 b -62 -173 -13 -99 -37 -135 b -71 -192 -66 -179 -71 -184 b -68 -199 -71 -193 -69 -196 b -56 -204 -65 -203 -60 -204 z m 196 258 b 197 266 197 261 197 264 b 200 510 200 347 199 429 b 233 543 210 521 222 533 b 281 560 249 554 266 560 b 340 503 310 560 333 540 b 344 461 343 488 344 474 b 321 323 344 413 333 369 b 268 272 315 300 295 281 b 196 258 245 265 220 261 z', + }, + dynamicMezzo: { + x_min: -18, + x_max: 559, + y_min: -50, + y_max: 365, + ha: 415, + o: 'm 43 -71 b 160 19 86 -71 143 -26 b 230 264 189 99 200 184 b 282 363 243 297 259 327 b 287 320 285 347 287 333 b 284 279 287 305 285 292 l 249 -12 b 275 -43 248 -29 245 -43 b 395 45 321 -43 389 3 b 462 271 406 124 436 197 b 523 387 475 310 490 348 l 523 346 b 504 130 521 274 513 202 b 501 81 501 114 501 98 b 510 3 501 55 504 29 b 580 -72 521 -48 543 -72 b 625 -63 593 -72 608 -69 b 789 50 690 -43 744 -3 b 805 72 795 56 805 63 b 798 85 805 76 802 81 b 778 94 792 91 785 94 b 755 85 770 94 763 91 l 693 40 b 675 33 685 36 680 33 b 658 52 668 33 662 39 b 645 144 651 82 645 112 b 658 448 641 246 660 346 b 606 507 658 485 638 507 b 583 504 599 507 592 505 b 495 446 547 497 521 471 b 420 373 471 423 448 399 b 413 458 418 406 418 432 b 361 507 408 490 386 507 b 320 491 347 507 333 501 b 160 307 256 444 207 382 l 160 337 b 174 488 160 387 174 438 b 156 521 174 501 173 513 b 137 526 148 524 143 526 b 109 513 127 526 118 520 b -16 399 66 477 23 439 b -26 383 -20 395 -26 389 l -26 379 b -14 370 -24 372 -20 370 b -6 372 -12 370 -9 372 b 19 376 4 374 12 376 b 36 359 32 376 36 370 b 30 330 36 350 35 341 l 30 323 b 9 -35 23 203 17 85 b 43 -71 6 -65 19 -71 z', + }, + dynamicForte: { + x_min: -144, + x_max: 311.30112136775, + y_min: -115.3876295915697, + y_max: 504, + ha: 619.3876295915697, + o: 'm -101 -166 b 173 76 7 -153 150 -30 b 206 344 192 164 202 253 b 268 338 226 343 246 341 b 384 395 317 333 353 361 b 397 419 393 405 397 412 b 367 442 397 429 387 436 b 350 444 361 444 356 444 b 206 455 302 449 255 454 l 206 474 b 202 540 204 495 202 518 b 209 593 202 557 203 576 b 236 624 215 613 225 624 b 265 612 245 624 253 619 b 308 552 287 596 302 577 b 336 533 312 534 323 533 b 448 611 366 533 444 583 b 399 696 452 648 423 671 b 382 706 395 700 387 703 b 308 726 357 720 333 726 b 207 684 272 726 239 711 b 60 455 135 622 60 560 l 10 455 b -23 448 -1 455 -13 454 b -102 372 -55 426 -76 397 b -109 357 -108 367 -109 361 b -95 347 -109 353 -105 348 b -63 346 -84 346 -73 346 b 0 344 -43 344 -22 344 l 63 344 b 53 186 63 291 59 239 b 23 0 46 124 42 60 b -35 -60 10 -42 -6 -60 b -73 -52 -45 -60 -58 -58 b -91 -48 -79 -49 -85 -48 b -109 -53 -96 -48 -102 -49 b -199 -124 -143 -72 -168 -99 b -207 -137 -203 -128 -207 -132 b -194 -148 -207 -141 -203 -145 b -101 -166 -164 -160 -132 -168 z', + }, + dynamicRinforzando: { + x_min: -75, + x_max: 322.0960720195126, + y_min: -90, + y_max: 325, + ha: 415, + o: 'm 23 -130 b 40 -125 27 -130 33 -128 b 128 -9 81 -114 125 -53 b 145 200 132 62 141 130 b 148 238 147 212 148 225 b 308 321 184 291 245 321 b 363 314 325 321 344 318 b 377 310 369 312 373 310 b 384 311 380 310 382 310 b 464 415 410 317 464 389 b 446 433 465 429 455 429 b 390 445 428 441 409 445 b 305 429 361 445 334 438 b 167 346 252 413 202 393 b 153 325 163 338 158 333 b 148 438 154 363 151 399 b 121 468 147 456 134 468 b 101 458 115 468 108 465 b -63 310 46 409 -16 367 b -108 240 -78 289 -98 271 b 32 330 -50 256 -13 297 b 37 304 37 320 37 312 l 37 292 b 10 -101 27 161 20 30 b 23 -130 9 -120 12 -130 z', + }, + dynamicSforzando: { + x_min: 0, + x_max: 296, + y_min: 0, + y_max: 379, + ha: 379, + o: 'm 151 0 b 174 1 160 0 166 0 b 392 158 272 14 346 71 b 405 207 400 174 405 190 b 359 287 405 236 389 265 b 261 325 328 308 294 315 b 168 413 216 340 181 366 b 166 426 167 418 166 423 b 176 438 166 432 167 436 b 199 441 183 441 190 441 b 310 393 238 441 295 422 b 334 370 317 376 325 370 b 363 386 343 370 353 379 b 422 445 386 402 408 420 b 426 458 425 449 426 454 b 422 469 426 462 425 465 b 274 546 395 518 333 546 b 161 503 232 546 190 531 b 86 405 132 472 108 439 b 71 347 75 387 71 367 b 112 256 71 312 85 279 b 209 215 141 232 176 226 b 284 168 238 206 266 197 b 300 131 291 157 300 144 b 298 120 300 127 298 122 b 278 107 294 109 285 108 b 262 108 271 107 266 108 l 259 108 b 114 157 200 107 156 125 b 96 181 104 163 96 170 l 96 184 b 102 202 96 190 102 196 b 96 209 102 204 101 207 b 63 194 82 215 72 204 b 7 109 42 168 26 138 b 0 86 3 101 0 94 b 13 60 0 78 4 68 b 151 0 53 23 101 0 z', + }, + dynamicZ: { + x_min: -42.73880183193087, + x_max: 331, + y_min: 0, + y_max: 328, + ha: 328, + o: 'm -45 0 b -6 16 -32 0 -17 10 b 3 20 -3 16 0 19 b 144 60 49 48 96 60 b 284 22 190 60 238 46 b 348 4 305 10 327 4 b 461 75 393 4 435 30 b 468 91 464 81 467 86 b 456 104 468 95 465 99 b 287 173 402 131 348 167 b 239 176 271 174 255 176 b 168 174 217 176 194 174 b 367 340 236 236 298 294 b 459 423 402 363 432 392 b 477 454 467 431 475 442 b 474 462 477 456 475 459 b 454 472 469 469 462 472 b 432 468 446 472 439 469 b 356 448 406 461 380 455 b 210 422 307 433 258 422 b 109 442 177 422 144 428 b 94 445 104 444 99 445 b 69 433 85 445 76 442 b 27 390 56 419 39 406 b -9 343 16 373 -17 357 b 63 311 3 320 36 314 l 78 311 b 132 307 95 308 114 307 b 240 314 168 307 203 311 l 193 271 b -37 50 117 196 19 145 b -59 7 -46 36 -69 20 b -45 0 -55 3 -50 0 z', + }, + ornamentTrill: { + x_min: 1, + x_max: 551, + y_min: -18, + y_max: 539, + ha: 557, + o: 'm 321 612 b 190 602 278 605 235 605 l 190 638 b 187 693 190 652 190 667 b 161 776 184 717 193 776 b 137 747 150 776 137 766 b 130 654 135 716 131 685 l 130 596 l 52 588 b 4 539 23 585 7 570 b 1 477 3 530 1 500 b 3 448 1 461 3 448 l 3 452 b 53 432 6 436 23 432 b 134 435 75 432 102 433 b 151 117 138 328 147 223 b 170 13 153 82 157 46 b 209 -26 179 -10 193 -26 b 222 -22 213 -26 217 -24 b 269 -17 233 -16 253 -27 b 343 135 325 19 346 66 b 343 158 343 147 344 147 b 323 192 341 171 337 187 b 291 176 311 194 300 184 l 264 148 b 229 131 261 145 238 131 b 212 170 209 131 213 154 b 194 438 203 259 199 348 l 272 442 b 284 452 276 441 279 441 b 305 462 287 461 295 462 l 312 462 b 346 477 325 462 340 464 b 366 560 357 503 366 531 b 321 612 366 598 356 618 z m 759 588 b 711 560 749 592 733 570 b 588 500 671 541 631 521 b 583 533 586 514 586 524 b 560 576 577 549 577 572 b 517 550 541 582 528 564 b 416 423 482 508 452 462 b 382 353 392 397 384 370 b 387 305 380 341 386 318 b 392 275 389 295 392 285 b 409 243 393 262 393 243 b 431 262 419 243 425 255 b 521 373 459 298 488 333 b 523 354 521 366 523 360 b 520 337 523 346 521 340 b 508 295 513 323 508 310 b 530 102 508 279 524 122 b 549 66 533 88 530 66 b 577 99 563 66 572 84 b 580 131 580 109 580 121 l 580 302 b 600 347 580 318 582 337 b 701 392 632 364 665 384 b 793 518 785 409 793 435 b 759 588 793 559 785 576 z', + }, + ornamentTurn: { + x_min: 0, + x_max: 574, + y_min: 0, + y_max: 312, + ha: 312, + o: 'm 651 0 b 816 132 727 0 796 46 b 827 223 822 163 827 193 b 808 340 827 262 821 301 b 665 449 785 408 729 449 b 636 446 655 449 647 448 b 589 384 600 441 586 422 l 602 300 b 611 285 603 291 605 285 b 621 288 613 285 616 287 b 655 295 632 294 644 295 b 711 284 674 295 693 289 b 773 209 740 275 773 232 b 697 156 773 184 734 160 b 664 154 685 154 675 154 b 579 168 635 154 608 158 b 455 242 533 186 495 213 b 261 400 387 291 331 354 b 160 432 225 422 190 432 b 20 328 98 432 49 392 b 0 229 6 295 0 262 b 30 71 0 176 14 122 b 144 3 43 29 96 3 b 168 6 153 3 160 4 b 248 122 233 20 248 39 b 246 147 248 124 248 135 b 226 177 243 164 239 177 b 206 170 220 177 215 174 b 144 154 186 158 166 154 b 79 170 122 154 101 160 b 53 202 62 179 53 189 b 60 228 53 209 55 217 b 161 281 81 261 120 281 b 183 279 168 281 176 281 b 325 190 243 269 284 229 b 572 16 402 124 475 53 b 651 0 598 6 625 0 z', + }, + ornamentTurnSlash: { + x_min: 0, + x_max: 574, + y_min: -106, + y_max: 405, + ha: 511, + o: 'm 441 -153 b 456 -60 455 -118 456 -89 b 455 81 455 -14 455 33 b 572 14 491 55 530 30 b 651 -1 598 4 625 -1 b 816 131 727 -1 796 45 b 827 222 822 161 827 192 b 808 338 827 261 821 300 b 665 448 785 406 729 448 b 636 445 655 448 647 446 b 589 383 600 439 586 420 l 602 298 b 611 284 603 289 605 284 b 621 287 613 284 616 285 b 655 294 632 292 644 294 b 711 282 674 294 693 288 b 773 207 740 274 773 230 b 697 154 773 183 734 158 b 664 153 685 153 675 153 b 579 167 635 153 608 157 b 455 240 533 183 495 212 b 454 242 455 240 455 242 l 454 337 b 452 488 454 386 452 439 b 433 570 452 517 451 546 b 425 583 431 575 431 583 l 422 583 b 403 566 415 582 408 573 b 402 546 400 560 402 553 l 397 287 b 261 399 353 325 310 366 b 160 431 225 420 190 431 b 20 327 98 431 48 390 b 0 228 6 294 0 261 b 30 69 0 174 14 121 b 144 1 43 27 96 1 b 168 4 153 1 160 3 b 248 121 233 19 248 37 b 246 145 248 122 248 134 b 226 176 243 163 239 176 b 206 168 220 176 215 173 b 144 153 186 157 166 153 b 79 168 122 153 101 158 b 53 200 62 177 53 187 b 60 226 53 207 55 216 b 161 279 79 259 120 279 b 183 278 168 279 176 279 b 325 189 243 266 282 226 b 395 130 348 168 372 148 b 393 71 393 109 393 89 b 441 -153 390 -6 402 -78 z', + }, + ornamentMordent: { + x_min: 0, + x_max: 700, + y_min: 0, + y_max: 497, + ha: 497, + o: 'm 513 0 b 528 39 526 14 527 27 b 531 72 531 50 531 60 b 528 138 531 94 528 117 l 528 347 b 552 359 537 354 544 359 b 579 338 560 359 569 353 b 674 217 609 297 639 255 b 719 190 690 200 704 190 b 759 215 732 190 744 197 b 940 395 815 279 877 337 b 1001 490 968 422 986 455 b 1008 513 1004 495 1008 505 b 1002 524 1008 517 1007 521 b 968 516 994 530 978 524 b 960 508 965 513 963 510 b 798 356 900 464 848 410 b 778 341 791 347 783 341 b 757 354 772 341 765 346 b 661 475 720 392 690 432 b 611 517 644 504 629 517 b 563 498 598 517 583 511 b 527 471 550 490 539 481 l 527 570 b 492 716 526 619 523 671 b 472 677 480 704 472 694 b 465 399 474 585 468 491 b 439 366 456 387 448 376 b 384 320 415 336 399 320 b 330 367 369 320 354 336 b 325 376 328 369 327 373 b 226 490 291 413 265 456 b 189 505 213 500 202 505 b 157 491 177 505 167 500 b 0 229 75 420 0 346 b 1 202 0 220 0 212 b 22 215 12 203 16 209 b 124 327 55 252 89 289 b 147 343 132 337 140 343 b 171 323 156 343 164 336 b 266 197 196 276 232 236 b 337 157 291 170 314 157 b 410 207 361 157 386 174 b 461 274 428 229 444 252 b 462 166 461 238 461 202 b 513 0 465 108 487 55 z', + }, + ornamentShortTrill: { + x_min: 0, + x_max: 747, + y_min: 0, + y_max: 243, + ha: 243, + o: 'm 379 0 b 428 14 395 0 410 4 b 474 56 445 26 461 39 b 552 157 500 89 526 122 b 566 168 556 163 560 168 b 575 157 569 168 572 166 b 664 36 592 107 628 72 b 733 1 685 13 710 1 b 802 35 757 1 780 13 b 1007 249 871 105 940 177 b 1067 324 1028 272 1054 295 b 1076 340 1068 330 1076 334 b 1073 346 1076 341 1076 343 b 1057 350 1068 348 1063 350 b 1047 347 1053 350 1050 350 b 1001 310 1031 336 1015 324 l 857 157 b 844 143 852 153 848 143 b 835 150 841 143 838 144 b 757 242 815 186 780 209 b 685 298 739 268 713 284 b 641 310 670 305 655 310 b 590 288 625 310 608 304 b 497 179 554 256 527 215 b 480 164 490 170 485 164 b 462 179 474 164 469 168 b 372 295 436 220 405 258 b 278 344 346 324 312 344 b 199 310 252 344 226 334 b 92 196 161 274 128 233 b 0 24 46 148 23 89 b 42 48 22 27 32 37 b 156 168 84 85 114 132 b 196 192 174 184 186 192 b 228 158 206 192 215 181 b 312 36 252 114 282 75 b 379 0 331 12 354 0 z', + }, + ornamentTremblement: { + x_min: 0, + x_max: 982.17691453624, + y_min: 0, + y_max: 224, + ha: 224, + o: 'm 0 0 b 63 36 30 12 48 23 b 157 124 94 66 125 94 b 177 135 164 131 170 135 b 196 122 183 135 189 131 b 268 40 217 94 245 68 b 323 6 288 16 304 6 b 369 20 336 6 350 10 b 412 53 384 29 399 40 b 501 145 442 84 472 114 b 523 158 508 154 516 158 b 543 145 528 158 536 154 b 641 45 576 112 608 78 b 698 17 658 27 677 17 b 729 23 708 17 719 20 b 804 65 756 32 780 46 b 904 154 837 95 871 124 b 920 163 910 160 916 163 b 936 153 924 163 930 160 b 1024 60 965 121 996 92 b 1112 13 1053 29 1080 13 b 1184 39 1135 13 1158 22 b 1359 194 1248 84 1305 138 b 1413 301 1388 223 1403 261 b 1404 323 1417 315 1413 323 b 1391 320 1400 323 1395 321 b 1344 294 1375 314 1358 307 b 1224 186 1305 258 1269 216 b 1194 173 1212 179 1202 173 b 1165 193 1184 173 1175 179 b 1096 271 1145 222 1122 248 b 1001 318 1061 302 1031 318 b 903 268 969 318 937 301 b 806 186 871 239 841 210 b 782 174 796 179 789 174 b 756 193 773 174 765 180 b 652 291 729 232 693 266 b 596 308 634 302 615 308 b 530 278 573 308 552 298 l 415 168 b 393 157 408 161 400 157 b 373 171 387 157 380 161 b 305 245 353 197 330 222 b 248 276 285 266 266 278 b 189 245 229 276 210 266 b 81 144 156 209 120 174 b 0 0 33 109 26 56 z', + }, + ornamentPrecompAppoggTrill: { + x_min: -0.11067192132025548, + x_max: 1066, + y_min: -50, + y_max: 533.1706452421108, + ha: 583.1706452421108, + o: 'm 187 -46 b 213 -14 197 -37 204 -26 b 285 151 251 36 266 94 b 304 189 294 177 297 189 b 337 168 311 189 320 181 b 458 33 386 131 415 76 b 495 12 472 19 484 12 b 531 40 508 12 518 22 b 580 168 557 79 569 124 b 622 235 592 213 603 235 b 683 194 636 235 655 222 b 838 26 737 140 791 86 b 919 -33 860 -1 881 -39 b 984 53 960 -27 971 19 b 1022 156 998 86 1008 122 b 1054 190 1032 179 1041 190 b 1089 167 1063 190 1074 183 b 1208 32 1129 122 1171 78 b 1244 10 1221 17 1231 10 b 1273 22 1253 10 1263 14 b 1496 206 1352 78 1427 137 b 1535 310 1526 236 1535 272 b 1531 359 1535 325 1534 343 b 1496 343 1515 360 1506 351 l 1309 192 b 1269 167 1289 176 1279 167 b 1234 199 1260 167 1251 177 b 1122 324 1200 243 1168 289 b 1074 344 1106 337 1089 344 b 1014 301 1051 344 1030 328 b 952 144 985 252 971 197 b 933 121 946 128 940 121 b 910 137 927 121 920 125 b 850 210 888 161 870 186 b 687 369 799 266 750 325 b 631 390 665 383 647 390 b 567 327 602 390 580 369 b 527 199 554 284 543 242 b 508 168 520 179 514 168 b 482 192 503 168 495 177 b 353 328 444 240 405 292 b 312 343 338 338 324 343 b 266 297 292 343 276 327 b 204 125 248 239 232 180 b 143 79 193 102 173 79 b 92 122 117 79 105 102 b 81 154 86 131 84 143 b 48 423 59 242 50 333 b 45 544 46 464 45 504 b 53 730 45 606 48 668 b 40 768 55 744 52 766 b 13 730 19 770 14 747 b 0 514 7 658 -1 586 b 26 122 3 383 6 252 b 75 -36 35 66 40 10 b 134 -72 92 -59 112 -72 b 187 -46 151 -72 170 -63 z', + }, + ornamentPrecompSlideTrillDAnglebert: { + x_min: 0, + x_max: 1088, + y_min: -380, + y_max: 252, + ha: 632, + o: 'm 560 -539 b 439 -481 527 -497 484 -485 b 354 -461 409 -478 380 -477 b 131 -154 236 -389 161 -285 b 124 -98 127 -135 124 -117 b 196 55 124 -40 148 10 b 308 99 230 86 268 99 b 399 81 337 99 367 92 b 514 22 441 66 477 43 b 619 -30 567 -9 590 -30 b 719 17 642 -30 670 -16 b 861 131 769 52 818 88 b 899 150 874 144 887 150 b 936 117 913 150 926 138 b 965 43 948 94 956 68 b 1007 -1 973 24 978 -1 b 1048 30 1025 -1 1037 16 b 1070 65 1057 40 1064 52 b 1110 148 1084 92 1096 121 b 1145 190 1120 164 1120 190 b 1191 153 1169 192 1179 168 b 1256 29 1218 115 1231 68 b 1292 1 1267 10 1277 1 b 1320 10 1300 1 1309 4 b 1369 48 1339 19 1355 33 b 1515 196 1418 96 1464 148 b 1567 343 1558 238 1567 287 b 1555 363 1565 357 1562 363 b 1539 356 1551 363 1547 360 b 1433 268 1502 330 1466 301 b 1335 171 1401 236 1374 199 b 1310 163 1325 166 1318 163 b 1286 183 1302 163 1293 168 b 1218 311 1264 226 1247 272 b 1164 351 1200 337 1182 351 b 1110 308 1146 351 1128 337 b 1031 176 1084 265 1058 219 b 1015 161 1025 166 1021 161 b 999 179 1009 161 1005 167 b 955 279 985 213 973 248 b 913 307 943 300 930 307 b 887 302 904 307 896 305 b 852 281 874 298 863 291 b 693 167 804 236 747 204 b 612 140 667 150 639 140 b 549 157 592 140 570 145 b 403 220 503 181 452 202 b 271 248 360 236 315 248 b 179 229 239 248 209 242 b 0 -29 65 180 0 85 b 9 -104 0 -53 3 -78 b 397 -526 56 -317 183 -464 b 505 -547 432 -536 468 -547 b 560 -539 524 -547 541 -544 z', + }, + ornamentPrecompSlideTrillBach: { + x_min: 0, + x_max: 1185, + y_min: -380, + y_max: 465, + ha: 845, + o: 'm 624 -544 b 642 -528 638 -543 642 -537 b 639 -514 642 -524 642 -520 b 590 -444 629 -487 609 -467 b 523 -413 573 -422 553 -410 b 498 -415 514 -415 507 -415 b 399 -389 464 -415 431 -405 b 89 -157 281 -330 176 -255 b 72 -117 78 -144 72 -131 b 73 -101 72 -111 72 -107 b 187 186 91 3 147 91 b 246 230 200 216 222 230 b 300 209 262 230 281 223 b 456 48 359 163 403 101 b 540 -10 494 10 518 -10 b 625 59 566 -10 589 13 b 690 148 648 88 668 118 b 711 167 697 160 704 167 b 733 153 719 167 724 163 b 844 14 769 105 808 60 b 903 -42 873 -23 886 -42 b 973 -1 919 -42 937 -27 b 1008 33 986 7 996 20 b 1048 81 1021 48 1035 65 b 1050 37 1048 66 1050 52 b 1047 -24 1050 17 1048 -3 b 1038 -275 1038 -108 1040 -192 l 1037 -289 b 1045 -302 1037 -295 1038 -301 b 1068 -284 1056 -304 1064 -292 b 1084 -242 1076 -271 1081 -256 b 1099 -109 1096 -199 1099 -154 b 1106 158 1099 -19 1106 71 b 1128 187 1113 167 1120 177 b 1168 223 1143 212 1155 223 b 1210 193 1179 223 1191 213 b 1220 183 1214 190 1215 186 b 1329 36 1261 138 1292 84 b 1374 7 1345 16 1358 7 b 1411 20 1384 7 1395 12 b 1479 84 1437 37 1459 59 b 1610 235 1521 135 1564 186 b 1706 403 1655 282 1695 334 b 1614 346 1663 400 1637 373 b 1464 170 1564 287 1515 228 b 1440 150 1453 156 1447 150 b 1414 173 1433 150 1426 158 b 1283 336 1371 228 1333 288 b 1220 366 1261 356 1240 366 b 1148 318 1194 366 1169 350 b 1103 255 1133 297 1119 275 b 1097 301 1102 271 1100 285 b 1099 334 1099 312 1099 324 b 1092 428 1099 367 1094 397 b 1071 647 1087 501 1079 575 b 1058 670 1071 657 1071 670 b 1035 648 1047 670 1038 661 b 1018 516 1024 605 1015 560 b 1041 203 1025 412 1037 307 b 1043 180 1041 196 1043 187 b 992 127 1027 161 1009 143 b 965 111 981 117 972 111 b 936 132 955 111 946 120 b 829 268 900 179 867 225 b 760 317 801 301 780 317 b 691 258 739 317 719 297 b 605 147 664 219 641 177 b 589 138 599 141 593 138 b 572 148 583 138 579 141 b 415 317 520 206 467 261 b 327 372 390 343 366 366 b 300 373 317 373 308 373 b 154 295 239 373 190 348 b 55 138 120 243 85 192 b 0 -53 22 79 0 13 b 160 -317 0 -156 49 -252 b 209 -354 177 -327 192 -343 b 510 -531 305 -419 397 -495 b 593 -547 537 -540 564 -547 b 624 -544 603 -547 613 -546 z', + }, + ornamentPrecompTrillSuffixDandrieu: { + x_min: 0, + x_max: 1003, + y_min: -20, + y_max: 521, + ha: 541, + o: 'm 791 -16 b 844 33 812 -3 829 14 b 981 271 900 107 937 190 b 994 288 984 278 985 288 b 1009 269 1004 288 1007 278 b 1077 112 1034 217 1051 163 b 1158 43 1103 62 1129 43 b 1231 69 1179 43 1204 55 b 1348 189 1280 98 1315 143 b 1444 451 1407 271 1444 357 b 1431 547 1444 482 1440 514 b 1188 750 1401 665 1299 750 b 1158 747 1178 750 1168 749 b 1079 684 1119 742 1089 727 b 1063 632 1076 665 1071 648 b 1056 609 1058 622 1056 615 b 1071 599 1056 602 1060 599 b 1086 600 1076 599 1080 600 b 1130 605 1102 603 1116 605 b 1244 569 1171 605 1210 595 b 1349 346 1322 511 1349 433 b 1348 312 1349 334 1349 324 b 1289 197 1345 266 1325 228 b 1238 174 1270 181 1253 174 b 1188 215 1220 174 1202 187 b 1145 308 1172 245 1159 276 b 1096 413 1129 343 1120 382 b 1053 438 1084 431 1068 438 b 1011 413 1038 438 1022 431 b 955 324 989 384 971 354 b 850 127 920 258 886 192 b 838 112 847 121 842 112 b 824 128 828 109 825 121 b 802 193 815 150 809 171 b 730 400 779 264 766 337 b 688 431 719 420 703 431 b 647 403 674 431 660 422 b 606 338 632 383 619 361 b 513 167 575 282 546 223 b 480 122 503 150 498 122 b 452 171 459 122 459 153 b 420 255 442 199 432 228 b 337 408 399 308 380 364 b 276 436 317 428 297 436 b 215 397 253 436 230 423 b 23 72 148 289 81 184 b 0 29 17 59 0 40 b 7 17 0 23 1 20 b 59 58 26 7 46 39 b 190 276 111 127 143 206 b 216 301 202 292 207 301 b 245 279 223 301 232 294 b 311 166 278 248 292 206 b 367 16 331 117 346 65 b 402 -19 377 -7 387 -19 b 438 -4 412 -19 423 -13 b 518 88 474 17 495 55 b 628 284 562 150 592 216 b 657 223 648 266 651 243 b 717 13 677 154 696 84 b 755 -29 726 -16 737 -29 b 791 -16 765 -29 776 -24 z', + }, + ornamentPrecompDoubleCadenceUpperPrefix: { + x_min: 0, + x_max: 1246, + y_min: -30, + y_max: 296.0302860502196, + ha: 326.0302860502196, + o: 'm 360 -43 b 559 59 445 -43 503 7 b 698 236 615 111 652 179 b 714 248 704 243 710 248 b 727 235 719 248 721 243 l 848 42 b 883 12 860 22 870 12 b 917 32 891 12 903 19 b 946 62 927 42 939 50 b 1037 192 972 108 1009 147 b 1057 210 1044 204 1051 210 b 1076 190 1063 210 1068 203 l 1176 12 b 1215 -19 1188 -9 1201 -19 b 1250 -6 1225 -19 1237 -14 b 1284 27 1264 3 1274 16 b 1380 190 1323 78 1351 135 b 1395 210 1384 197 1385 210 b 1413 190 1405 210 1410 197 b 1508 40 1436 134 1467 85 b 1564 3 1529 14 1547 3 b 1617 32 1580 3 1597 12 b 1767 238 1678 92 1719 167 b 1794 310 1781 259 1791 282 b 1752 294 1776 317 1764 304 b 1656 164 1711 258 1689 206 b 1629 144 1646 151 1637 144 b 1603 161 1620 144 1613 150 b 1502 315 1562 207 1525 258 b 1452 357 1490 344 1470 357 b 1397 320 1431 357 1411 344 b 1316 170 1368 271 1345 219 b 1280 127 1306 154 1303 127 b 1244 171 1256 127 1254 154 b 1145 337 1210 226 1179 282 b 1110 363 1135 354 1122 363 b 1070 338 1097 363 1084 354 b 1050 311 1063 330 1057 320 b 959 181 1017 271 992 223 b 939 167 950 173 945 167 b 920 184 933 167 927 173 b 818 343 887 238 852 291 b 759 395 795 377 778 395 b 701 344 742 395 724 377 b 698 338 700 341 700 340 b 544 154 652 272 605 207 b 412 98 501 117 458 98 b 304 130 377 98 341 108 b 95 373 204 187 144 275 b 58 426 85 393 82 428 b 19 366 26 426 26 389 b 0 307 13 346 0 327 b 4 287 0 300 1 294 b 174 36 49 194 91 102 b 360 -43 230 -9 289 -43 z', + }, + ornamentPrecompDoubleCadenceUpperPrefixTurn: { + x_min: 0, + x_max: 1226, + y_min: -237, + y_max: 436, + ha: 673, + o: 'm 1279 -341 b 1293 -252 1293 -307 1295 -278 b 1277 36 1287 -156 1282 -59 l 1273 118 b 1318 176 1289 137 1303 157 b 1349 203 1332 193 1342 203 b 1378 168 1359 203 1367 192 b 1456 35 1401 122 1428 78 b 1511 -12 1476 3 1493 -12 b 1568 23 1526 -12 1544 0 b 1597 53 1578 32 1588 42 b 1705 186 1629 101 1669 143 b 1761 284 1728 216 1751 246 b 1765 300 1763 288 1765 295 b 1763 307 1765 302 1765 305 b 1737 302 1754 311 1744 308 b 1718 287 1729 298 1725 292 b 1598 145 1673 245 1637 194 b 1578 130 1590 135 1584 130 b 1557 147 1571 130 1565 135 b 1447 321 1516 202 1488 265 b 1403 351 1433 341 1417 351 b 1358 323 1388 351 1372 341 b 1269 209 1329 285 1299 248 b 1254 521 1264 314 1259 418 b 1228 616 1253 554 1247 588 b 1218 628 1224 621 1223 628 l 1215 628 b 1201 613 1210 626 1202 619 b 1200 600 1200 609 1200 605 l 1200 586 b 1211 348 1204 507 1207 428 b 1217 166 1214 288 1215 226 b 1202 181 1212 168 1208 174 b 1094 334 1168 233 1130 284 b 1048 366 1079 356 1064 366 b 1004 331 1034 366 1018 354 b 904 154 969 275 930 220 b 873 202 887 171 880 187 b 778 356 845 256 819 311 b 737 379 763 372 750 379 b 698 353 724 379 711 370 l 621 232 b 415 114 570 154 495 114 b 302 138 377 114 340 121 b 73 400 187 192 117 284 b 55 420 69 415 62 420 b 42 410 50 420 45 416 b 0 292 23 373 0 334 b 4 262 0 282 1 272 b 168 39 32 168 92 99 b 359 -26 225 -6 292 -26 b 585 76 446 -26 530 10 b 668 202 616 115 641 160 b 693 228 680 219 687 228 b 720 203 700 228 707 219 b 801 63 752 160 775 111 b 844 7 812 42 818 7 b 910 66 877 6 894 39 b 923 94 916 75 919 85 b 995 219 945 137 968 179 b 1025 184 1009 210 1017 197 b 1119 56 1054 141 1087 98 b 1166 20 1138 32 1152 20 b 1215 50 1181 20 1195 30 b 1221 56 1217 52 1218 55 b 1228 -163 1223 -17 1225 -89 b 1279 -341 1231 -223 1251 -278 z', + }, + ornamentPrecompTrillLowerSuffix: { + x_min: 0, + x_max: 833, + y_min: -309, + y_max: 319, + ha: 628, + o: 'm 778 -444 b 801 -445 785 -444 793 -445 b 1037 -338 894 -445 969 -397 b 1200 37 1149 -240 1200 -109 b 1084 406 1200 171 1172 300 b 1024 444 1064 431 1043 444 b 960 390 999 444 978 426 b 841 163 923 314 886 236 b 812 128 832 150 827 128 b 786 167 796 130 793 153 b 660 418 744 251 716 341 b 599 459 639 445 619 459 b 541 410 577 459 557 444 b 439 197 507 340 474 269 b 422 179 435 190 435 179 b 338 393 392 251 379 328 b 275 439 320 423 298 439 b 212 396 253 439 230 425 b 71 219 170 333 128 268 b 0 45 17 173 16 112 b 68 98 32 62 50 78 b 194 264 112 150 153 209 b 230 292 209 282 219 292 b 264 261 240 292 251 282 b 274 242 268 255 269 248 b 346 46 304 179 325 112 b 376 10 351 32 354 10 b 412 35 392 10 403 22 b 452 107 429 56 441 82 b 541 291 481 168 511 230 b 556 307 547 302 552 307 b 573 295 562 307 567 302 b 624 217 595 272 611 246 b 721 1 657 145 685 72 b 755 -27 732 -19 742 -27 b 786 -16 765 -27 775 -24 b 857 73 819 7 840 39 b 952 256 887 134 920 194 b 978 289 963 279 969 289 b 1009 262 985 289 994 281 b 1030 235 1017 253 1024 245 b 1110 -4 1071 161 1099 81 b 1116 -68 1113 -26 1116 -48 b 1009 -243 1116 -140 1090 -200 b 848 -291 956 -272 901 -291 b 730 -261 809 -291 770 -282 b 696 -248 714 -252 703 -248 b 671 -284 684 -248 678 -258 l 662 -312 b 657 -357 658 -330 657 -344 b 744 -439 657 -403 683 -425 z', + }, + brassScoop: { + x_min: -0.4444444444444445, + x_max: 312, + y_min: -390, + y_max: 28, + ha: 418, + o: 'm 0 -562 b 393 -256 171 -504 307 -412 b 449 -39 431 -189 449 -115 b 448 -1 449 -26 449 -14 b 433 40 446 14 448 40 b 408 -3 410 40 412 14 b 396 -66 403 -23 402 -46 b 45 -397 346 -243 209 -337 b 0 -451 13 -409 1 -423 b 0 -562 -1 -485 0 -520 z', + }, + brassDoitMedium: { + x_min: -0.32815253965710617, + x_max: 476.21251177608565, + y_min: -50, + y_max: 333.1535583875376, + ha: 383.1535583875376, + o: 'm 16 -72 b 27 -71 19 -72 23 -72 b 215 -33 89 -56 153 -48 b 521 114 327 -7 435 35 b 685 432 615 199 691 295 b 670 480 684 449 688 475 b 642 441 654 482 648 456 b 403 183 599 321 513 240 b 79 89 301 130 192 105 b 0 -1 -12 76 0 76 b 0 -50 0 -17 1 -33 b 16 -72 0 -65 3 -72 z', + }, + brassFallLipShort: { + x_min: 0, + x_max: 298, + y_min: -344, + y_max: 65, + ha: 409, + o: 'm 396 -495 b 420 -461 412 -487 418 -474 b 429 -382 428 -435 429 -409 b 426 -330 429 -364 428 -347 b 285 -6 410 -209 356 -104 b 98 94 239 59 173 94 b 39 86 79 94 58 92 b 0 49 20 81 0 73 l 0 -52 b 10 -69 0 -62 1 -69 b 20 -68 13 -69 16 -69 b 88 -56 45 -59 66 -56 b 261 -160 156 -56 213 -95 b 396 -495 333 -259 382 -369 z', + }, + brassLiftMedium: { + x_min: 0, + x_max: 807, + y_min: 0, + y_max: 838, + ha: 838, + o: 'm 50 0 b 55 1 52 0 53 0 b 58 23 65 7 59 16 b 55 58 56 36 55 48 b 130 117 55 99 75 112 b 220 213 202 121 220 141 b 315 308 220 289 238 308 l 336 308 b 408 380 393 310 406 321 b 461 452 409 438 416 452 b 485 451 468 452 477 451 b 569 510 531 448 556 464 b 573 543 572 520 572 531 b 657 619 580 605 595 618 b 698 621 670 619 684 619 b 788 700 749 625 778 649 b 798 778 792 726 793 752 b 873 857 806 841 809 845 b 985 950 927 867 973 887 b 1084 1047 1002 1035 1004 1034 b 1162 1128 1133 1056 1162 1087 b 1146 1182 1162 1145 1158 1164 b 1125 1207 1140 1191 1136 1207 l 1122 1207 b 1110 1191 1113 1205 1110 1198 b 1112 1174 1110 1185 1112 1178 b 1048 1110 1109 1126 1096 1113 b 1028 1109 1043 1110 1035 1109 b 939 1022 969 1102 948 1081 b 845 922 929 949 917 936 b 746 812 773 909 753 886 b 744 780 744 802 744 791 b 635 681 737 700 717 683 b 524 583 553 680 536 665 b 439 510 514 520 503 510 b 357 431 377 510 360 492 l 357 406 b 314 364 356 379 343 364 b 238 361 288 364 264 364 b 173 300 202 357 180 334 b 167 245 168 281 167 262 b 105 174 166 192 157 180 b 75 171 95 173 85 171 b 6 112 30 166 14 153 b 0 73 1 98 0 85 b 37 10 0 45 13 26 b 50 0 42 7 46 0 z', + }, + brassFallRoughMedium: { + x_min: 0, + x_max: 791, + y_min: 0, + y_max: 819, + ha: 819, + o: 'm 1117 0 b 1139 101 1129 26 1139 71 b 1138 121 1139 109 1139 115 b 1084 193 1125 171 1110 193 b 1044 183 1073 193 1060 189 b 1022 177 1035 179 1028 177 b 1007 209 1012 177 1008 186 b 876 324 1004 292 959 330 b 799 317 850 321 825 320 b 759 354 772 314 755 320 b 760 373 760 360 760 366 b 759 392 760 379 760 384 b 681 477 753 451 730 477 b 654 474 672 477 664 475 b 606 467 638 471 622 468 b 586 465 599 465 592 465 b 564 481 570 465 564 469 b 569 505 564 487 566 495 b 575 553 572 521 575 537 b 572 585 575 564 573 575 b 481 665 560 657 539 668 b 412 665 458 664 435 665 b 382 690 392 667 382 672 b 383 700 382 693 383 696 b 386 773 387 724 387 749 b 297 858 382 828 351 857 b 229 861 274 858 251 858 b 190 897 207 863 193 871 b 163 1012 186 936 180 976 b 79 1084 145 1050 124 1084 b 66 1083 75 1084 71 1083 b 43 1096 49 1081 43 1087 b 48 1112 43 1100 45 1106 b 53 1130 52 1119 53 1125 b 39 1169 53 1145 45 1158 b 26 1179 36 1175 30 1179 b 16 1171 22 1179 17 1176 b 0 1103 10 1149 0 1126 b 9 1067 0 1092 1 1079 b 91 1021 26 1031 52 1018 b 145 978 122 1024 141 1011 b 156 913 147 956 151 935 b 291 795 170 831 210 795 b 346 768 337 795 346 796 b 344 743 346 760 344 753 b 343 716 344 733 343 724 b 455 600 343 651 390 602 b 505 605 471 599 490 605 b 528 598 514 605 523 603 b 536 579 534 592 536 586 b 524 523 536 562 526 541 b 523 505 524 517 523 511 b 621 405 523 442 560 405 b 639 406 626 405 634 406 b 677 413 652 408 664 410 b 701 416 687 415 696 416 b 721 392 716 416 721 410 b 720 373 721 386 720 380 b 831 255 714 301 759 252 b 897 261 854 255 876 261 b 926 262 909 261 919 262 b 969 197 963 262 965 252 b 971 184 969 193 971 189 b 1031 115 979 137 998 115 b 1071 122 1043 115 1056 118 b 1096 130 1079 125 1086 127 b 1087 59 1094 107 1087 82 b 1117 0 1087 37 1094 17 z', + }, + brassBend: { + x_min: 0, + x_max: 381, + y_min: 0, + y_max: 367, + ha: 367, + o: 'm 298 0 b 472 50 359 0 418 14 b 537 135 501 71 530 92 b 543 216 543 163 543 190 l 543 266 b 544 308 543 281 543 295 b 549 433 546 354 549 395 b 543 507 549 459 547 482 b 533 528 541 516 544 528 b 511 508 524 528 514 520 b 508 478 510 498 508 488 b 504 318 507 425 504 372 b 505 264 504 300 505 282 b 446 181 505 220 484 199 b 294 150 396 160 344 150 b 92 194 226 150 158 167 b 45 269 62 207 45 230 b 46 359 46 300 46 328 b 37 497 46 405 45 451 b 27 523 36 507 37 523 b 4 498 14 524 6 513 b 3 481 3 492 3 487 b 0 409 1 456 0 433 b 4 228 0 348 4 288 b 3 177 4 210 4 194 b 68 53 1 125 20 84 b 200 10 108 27 154 17 b 298 0 233 4 266 0 z', + }, + brassMuteClosed: { + x_min: 0, + x_max: 274, + y_min: 0, + y_max: 260, + ha: 260, + o: 'm 203 0 b 209 1 206 0 207 0 b 216 13 215 4 216 9 l 215 27 l 215 153 b 216 161 216 156 216 158 b 372 164 268 163 318 164 b 395 184 383 164 395 166 l 395 189 b 357 229 392 209 386 229 b 219 228 311 229 265 228 l 223 310 b 209 357 225 328 219 344 b 189 374 203 364 197 374 b 184 373 187 374 186 373 b 177 359 179 372 177 366 l 177 348 l 173 222 l 39 222 b 0 206 12 222 0 219 b 10 174 0 199 3 189 b 46 157 19 157 30 157 b 108 160 68 158 88 160 b 171 161 130 161 150 161 l 167 58 b 184 16 167 40 171 26 b 203 0 192 12 196 0 z', + }, + brassMuteOpen: { + x_min: 1, + x_max: 313.01193341111656, + y_min: 0, + y_max: 309, + ha: 309, + o: 'm 265 0 b 451 189 363 7 452 88 l 451 215 b 348 383 441 285 405 343 b 209 445 288 426 248 445 b 84 379 168 445 132 420 b 69 364 79 373 73 369 b 1 213 30 323 1 275 b 230 0 1 88 94 0 z m 210 62 b 128 73 181 62 154 66 b 40 171 71 91 42 125 b 52 226 40 187 45 206 b 197 374 79 295 130 344 b 228 382 207 380 217 382 b 300 361 252 382 276 370 b 374 308 328 350 353 331 b 410 223 397 284 410 253 b 393 163 410 202 405 181 b 210 62 354 91 288 63 z', + }, + brassFlip: { + x_min: 0, + x_max: 402, + y_min: 0, + y_max: 361, + ha: 361, + o: 'm 579 0 b 511 153 579 68 557 117 b 52 504 359 271 206 387 b 29 520 45 510 39 520 b 20 517 26 520 23 518 b 0 477 3 510 0 494 l 0 125 b 17 20 1 92 1 56 b 40 84 37 40 40 60 b 42 287 40 151 42 219 l 42 363 z', + }, + brassJazzTurn: { + x_min: 0, + x_max: 646, + y_min: 0, + y_max: 212, + ha: 212, + o: 'm 310 0 b 367 33 327 0 344 10 b 389 55 374 40 382 49 b 490 145 423 85 456 114 b 507 154 495 151 501 154 b 524 144 513 154 517 151 b 598 72 547 120 575 98 b 700 24 625 42 662 24 b 765 43 721 24 744 30 b 893 147 812 72 855 105 b 930 212 910 166 923 186 b 912 215 923 213 917 215 b 871 199 896 215 883 209 b 812 153 852 183 832 167 b 789 144 805 148 796 144 b 773 156 782 144 776 147 b 691 251 757 199 720 222 b 603 301 658 282 631 301 b 527 258 580 301 556 288 b 420 156 494 222 455 190 b 399 143 412 147 405 143 b 377 157 392 143 386 147 b 259 282 340 200 300 242 b 219 305 245 298 232 305 b 177 279 204 305 192 297 b 55 127 137 228 95 177 b 0 52 36 104 20 79 b 14 50 6 50 10 50 b 53 66 32 50 45 58 b 115 131 75 88 98 108 b 135 148 124 143 130 148 b 157 132 141 148 148 143 b 252 33 186 96 219 65 b 310 0 275 12 292 0 z', + }, + brassSmear: { + x_min: 0, + x_max: 334, + y_min: 0, + y_max: 151, + ha: 151, + o: 'm 321 0 b 475 125 390 0 436 43 b 481 143 478 131 481 137 b 475 154 481 147 480 151 b 449 148 468 158 458 154 b 395 132 432 137 413 132 b 343 140 377 132 360 137 b 229 194 301 148 266 173 b 168 217 206 209 186 217 b 109 192 148 217 130 209 b 0 26 59 148 32 89 b 59 63 32 29 45 48 b 98 84 72 78 84 84 b 130 73 108 84 118 81 b 213 26 157 58 183 37 b 321 0 255 9 289 0 z', + }, + stringsDownBow: { + x_min: 0, + x_max: 306, + y_min: -0.09607201951262866, + y_max: 366, + ha: 366.09607201951263, + o: 'm 405 0 b 425 17 413 -1 420 9 b 439 66 435 32 439 48 b 441 268 439 137 441 202 b 436 412 441 314 439 361 l 435 413 b 423 469 435 436 431 456 b 344 508 406 501 373 501 b 204 527 298 520 251 527 b 60 498 156 527 108 518 b 7 438 32 485 10 468 l 7 426 b 4 337 7 396 7 367 b 0 140 0 272 0 206 b 1 42 0 107 0 73 b 13 3 1 27 -3 4 b 40 39 29 3 35 24 b 42 53 42 43 40 49 b 49 141 48 84 49 112 b 48 215 49 167 48 192 b 49 252 48 228 48 240 l 49 312 b 130 343 72 331 99 340 b 206 347 156 346 180 347 b 372 314 262 347 318 338 l 390 307 l 390 245 b 390 138 392 212 390 176 b 397 23 390 101 392 62 b 405 0 399 14 393 1 z', + }, + stringsUpBow: { + x_min: 0, + x_max: 219.2842808242076, + y_min: 0, + y_max: 489, + ha: 489, + o: 'm 151 0 b 184 42 170 12 180 26 b 297 554 223 212 261 382 b 315 690 305 598 318 645 b 304 704 315 697 311 704 b 276 670 288 704 282 697 b 157 131 236 490 196 311 l 157 144 b 73 526 134 276 104 396 b 30 677 60 576 52 638 b 13 694 26 684 22 694 b 0 674 9 694 0 691 l 0 671 b 10 603 3 649 6 626 b 105 174 42 461 72 317 b 150 0 117 117 128 58 z', + }, + stringsHarmonic: { + x_min: 0, + x_max: 191, + y_min: 0, + y_max: 202, + ha: 202, + o: 'm 143 0 b 275 122 217 0 275 53 b 127 291 275 206 202 291 b 0 154 63 291 0 222 b 143 0 0 76 71 0 z m 122 68 b 43 105 89 66 59 75 b 39 124 40 111 39 117 b 79 199 39 148 56 180 b 145 226 101 216 122 226 b 199 210 163 226 180 220 b 235 150 223 196 235 173 b 203 92 235 128 225 107 b 122 68 181 76 150 68 z', + }, + pluckedSnapPizzicatoAbove: { + x_min: 0, + x_max: 201, + y_min: 0, + y_max: 325, + ha: 325, + o: 'm 171 0 b 289 99 240 0 289 45 b 258 183 289 130 274 156 b 174 269 236 217 203 240 l 174 408 b 174 429 174 415 176 422 b 131 468 168 451 153 468 b 117 451 120 468 117 461 b 118 429 117 444 118 435 b 115 307 117 389 115 347 b 0 166 59 295 0 223 b 171 0 0 85 89 0 z m 134 55 b 52 131 84 55 52 85 b 115 233 52 179 81 209 b 114 192 114 220 114 206 b 174 120 114 137 114 137 l 174 228 b 233 148 200 207 223 183 b 236 130 235 143 236 135 b 197 72 236 105 223 85 b 134 55 177 60 157 55 z', + }, + pluckedSnapPizzicatoBelow: { + x_min: 0, + x_max: 211, + y_min: 0, + y_max: 307, + ha: 307, + o: 'm 145 7 b 163 0 153 3 158 0 b 173 23 170 0 173 7 l 173 140 l 170 140 l 170 163 l 171 163 b 206 170 179 164 193 166 b 304 287 264 186 304 233 b 281 354 304 308 297 333 b 118 442 240 412 186 439 b 0 324 69 442 0 370 b 115 176 0 266 55 202 l 115 56 b 145 7 114 33 125 19 z m 115 220 b 62 256 92 223 73 230 b 53 292 56 269 53 281 b 78 344 53 311 60 328 b 168 384 105 372 135 384 b 213 376 183 384 199 382 b 253 321 239 366 253 346 b 246 291 253 311 251 301 b 170 226 230 256 203 236 l 170 258 b 148 305 171 278 163 292 b 128 315 143 310 135 315 l 124 315 b 115 301 117 314 115 308 z', + }, + pluckedLeftHandPizzicato: { + x_min: 0, + x_max: 271, + y_min: 0, + y_max: 284, + ha: 284, + o: 'm 213 0 b 223 14 222 0 223 7 b 222 35 223 22 222 29 l 222 176 b 373 170 272 174 323 170 b 390 180 382 170 390 171 l 390 184 b 347 232 386 207 382 232 b 219 238 307 233 266 235 l 219 364 b 171 409 219 395 193 409 b 156 393 160 409 156 402 b 158 370 156 384 158 376 l 158 240 b 16 239 115 240 66 239 b 0 226 7 239 0 238 l 0 223 b 50 179 1 203 29 179 b 158 177 86 179 122 179 l 158 63 b 161 29 158 52 158 40 b 213 0 166 -1 194 1 z', + }, + keyboardPedalPed: { + x_min: 0, + x_max: 944, + y_min: -13, + y_max: 550, + ha: 563, + o: 'm 22 0 b 109 78 53 0 105 46 l 144 333 b 163 376 147 347 140 372 b 364 465 238 390 301 426 b 454 599 416 497 454 540 b 452 618 454 605 454 612 b 320 770 442 694 396 747 b 248 779 295 778 272 779 b 193 778 229 779 212 779 b 160 780 181 778 167 775 b 137 792 153 789 144 791 b 109 789 128 792 118 789 b 7 719 59 789 48 737 b 23 708 16 714 20 708 b 36 710 29 710 33 710 b 53 684 52 710 53 698 l 53 674 b 43 386 53 577 53 482 b 20 164 36 312 30 238 b 1 30 14 120 7 75 b 0 19 0 26 0 22 b 22 0 0 9 4 0 z m 171 425 b 156 442 160 425 156 429 b 157 475 157 452 157 464 b 164 602 161 517 164 560 b 161 698 164 635 163 667 b 184 729 161 720 167 729 l 193 729 b 348 563 278 719 348 641 b 346 539 348 554 347 547 b 171 425 328 459 229 422 z m 979 6 b 1008 13 986 6 995 9 b 1081 101 1047 29 1079 46 b 1116 449 1087 217 1104 333 b 1143 654 1123 518 1133 586 b 1148 685 1145 664 1148 675 b 1140 704 1148 693 1146 700 b 1107 716 1130 713 1119 716 b 1056 706 1092 716 1073 710 b 1037 671 1035 703 1038 685 b 1004 439 1025 595 1014 517 b 986 419 1001 428 999 419 b 979 419 985 419 982 420 b 935 426 965 423 949 425 b 795 376 884 426 838 405 b 664 153 714 323 664 249 b 665 130 664 145 665 138 b 753 29 671 65 704 29 b 815 40 773 29 792 33 b 975 147 873 65 923 101 b 965 45 971 108 968 76 b 979 6 963 17 966 6 z m 393 -17 b 634 145 494 16 579 52 b 638 160 636 151 638 156 b 625 168 638 166 634 168 b 621 167 624 168 622 168 b 524 118 582 164 544 160 b 495 79 517 104 505 92 b 435 33 471 49 452 33 b 380 96 416 33 397 55 b 369 145 373 114 369 131 b 442 225 369 186 395 213 b 468 232 451 228 459 229 b 654 344 539 255 606 285 b 677 395 667 360 677 376 b 672 415 677 402 675 408 b 612 459 661 442 639 455 b 589 461 602 461 592 461 b 348 328 500 461 409 408 b 269 120 302 268 269 199 b 379 -19 269 45 318 -19 b 393 -17 383 -19 389 -19 z m 395 240 b 494 383 418 300 452 344 l 521 405 b 544 419 528 409 536 418 b 554 415 547 419 550 418 b 570 383 564 406 570 396 l 570 379 b 552 331 570 360 562 344 b 395 240 511 285 462 253 z m 827 89 b 792 111 815 89 804 96 b 766 204 775 131 766 158 b 845 360 772 256 799 314 b 871 372 854 369 863 372 b 897 366 880 372 888 369 b 978 279 942 353 963 320 b 976 259 981 272 981 265 b 858 104 942 203 909 147 b 827 89 847 94 837 89 z m 1282 12 b 1336 35 1303 14 1320 23 b 1359 71 1351 45 1359 58 b 1338 102 1359 82 1352 95 b 1254 130 1312 118 1284 130 b 1187 88 1223 130 1202 109 b 1178 65 1182 81 1178 72 b 1195 37 1178 55 1182 45 b 1282 12 1223 23 1253 19 z', + }, + keyboardPedalUp: { + x_min: 0, + x_max: 436.6015132318337, + y_min: 0, + y_max: 461, + ha: 461, + o: 'm 330 0 b 334 1 331 0 333 0 b 340 12 338 4 340 7 l 338 26 b 340 264 338 105 338 184 b 526 95 400 206 461 148 b 559 71 536 88 547 71 b 564 72 560 71 563 71 b 580 121 580 79 580 102 l 580 127 b 543 203 585 158 573 184 b 472 259 518 219 495 238 l 445 285 b 590 292 494 288 541 291 b 622 318 609 294 618 302 b 628 359 625 331 626 346 b 586 402 632 393 621 405 b 464 395 546 399 504 396 l 559 491 b 567 524 567 500 567 510 b 564 543 567 527 567 536 b 539 596 559 563 560 590 b 494 564 521 600 508 577 b 340 413 442 514 390 464 l 340 560 b 287 664 340 600 321 632 b 271 518 274 612 272 566 b 268 445 269 494 269 469 b 117 569 219 488 168 530 b 96 579 109 575 102 579 b 85 560 89 579 85 573 b 124 446 85 518 82 477 b 209 380 153 426 181 403 b 45 374 154 377 99 376 b 0 324 9 374 0 359 b 63 266 0 265 1 265 b 144 272 89 269 117 272 l 196 272 b 108 193 167 246 138 219 b 60 135 76 164 60 151 b 99 73 60 121 73 105 b 104 68 101 72 102 71 b 114 58 107 60 111 58 b 130 66 120 58 124 62 b 259 186 173 107 217 145 b 256 117 259 163 256 140 b 311 13 256 72 271 37 b 330 0 317 10 323 0 z', + }, + pictChokeCymbal: { + x_min: 1, + x_max: 147, + y_min: 0, + y_max: 242, + ha: 242, + o: 'm 79 4 b 207 158 153 32 192 88 b 212 200 210 173 212 187 b 143 336 212 253 187 298 b 98 348 131 344 115 348 b 4 295 60 348 16 327 b 1 276 1 289 1 282 b 9 249 1 266 3 258 b 121 183 35 206 72 183 b 156 186 132 183 144 183 b 26 53 134 115 91 73 b 7 39 13 49 7 45 b 19 20 7 33 12 27 b 59 0 30 9 43 0 b 79 4 65 0 72 1 z', + }, + wiggleArpeggiatoUp: { + x_min: -22, + x_max: 300, + y_min: 0, + y_max: 176, + ha: 176, + o: 'm 173 4 b 196 0 180 1 189 0 b 246 26 215 0 230 9 b 301 117 271 53 285 85 b 312 131 305 125 307 131 b 327 124 315 131 321 128 b 373 86 341 112 353 101 b 412 69 389 75 402 69 b 432 94 425 69 432 79 b 373 181 432 117 413 154 b 235 252 323 216 285 245 b 220 253 229 253 225 253 b 168 215 196 253 181 240 b 111 112 151 180 140 141 b 94 102 105 105 99 102 b 78 111 89 102 84 105 b 0 181 55 135 35 160 b -32 153 -20 194 -32 168 b 0 86 -32 124 -32 109 b 94 36 22 71 73 46 b 173 4 134 16 131 17 z', + }, + arpeggiatoUp: { + x_min: 0, + x_max: 262, + y_min: 0, + y_max: 1459, + ha: 1459, + o: 'm 190 0 b 160 63 187 29 170 45 b 145 108 150 81 145 95 b 183 163 145 128 157 145 b 300 246 222 190 262 216 b 347 318 333 272 347 295 b 301 393 347 341 331 364 b 258 413 289 403 272 408 b 145 449 220 425 183 436 b 117 464 135 452 120 452 b 140 491 115 477 128 484 b 294 593 192 526 243 557 b 330 647 318 611 330 626 b 314 693 330 660 324 675 b 262 736 302 714 285 729 b 170 763 230 744 200 753 b 122 783 153 768 125 768 b 160 831 120 804 143 818 b 288 922 202 861 246 890 b 333 999 318 945 333 972 b 266 1083 333 1032 310 1064 b 189 1115 240 1094 215 1103 b 122 1178 145 1133 122 1153 b 168 1250 122 1200 138 1223 l 180 1257 b 269 1333 210 1283 240 1306 b 305 1405 294 1356 305 1381 b 284 1469 305 1426 298 1447 b 228 1525 269 1492 251 1511 b 183 1600 197 1545 183 1571 b 190 1640 183 1613 184 1626 b 197 1670 193 1650 194 1660 b 272 1735 213 1719 230 1735 b 295 1734 279 1735 287 1735 b 323 1732 305 1732 314 1732 b 350 1731 333 1732 341 1732 b 377 1742 369 1729 377 1732 b 370 1761 377 1747 374 1754 l 301 1898 b 217 2066 274 1954 248 2012 b 186 2101 204 2089 196 2101 b 154 2069 177 2101 167 2091 b 12 1824 105 1987 59 1907 b 0 1787 4 1810 0 1797 b 59 1744 0 1761 20 1745 b 160 1738 92 1744 125 1740 b 145 1692 156 1721 151 1706 b 135 1633 138 1672 135 1652 b 184 1518 135 1591 151 1552 b 229 1475 199 1503 213 1488 b 259 1431 249 1456 259 1444 b 229 1388 259 1420 249 1407 b 151 1325 203 1365 177 1345 b 105 1279 134 1310 118 1296 b 73 1202 84 1251 73 1227 b 108 1123 73 1176 85 1152 b 255 1031 148 1077 199 1051 b 282 1014 274 1025 282 1021 b 262 991 282 1008 275 1001 b 151 914 226 963 189 939 b 79 851 125 896 99 877 b 63 809 69 837 63 824 b 79 769 63 796 68 783 b 202 697 111 729 154 710 b 266 670 225 690 266 688 b 210 622 266 648 232 635 b 82 534 167 593 120 570 b 55 491 63 518 55 505 b 79 448 55 478 63 465 b 255 361 127 395 192 380 b 288 343 269 359 288 357 b 266 312 288 331 275 320 b 144 223 229 278 184 253 b 85 134 104 193 85 166 b 118 53 85 111 96 85 b 190 0 135 29 160 14 z', + }, + arpeggiatoDown: { + x_min: 0, + x_max: 218, + y_min: 0, + y_max: 1440, + ha: 1440, + o: 'm 161 16 b 310 261 210 98 259 180 b 314 275 312 266 314 271 b 302 295 314 282 310 289 b 252 311 287 308 269 311 b 217 310 240 311 229 310 b 190 333 202 310 194 315 b 151 412 186 363 171 389 b 102 501 120 452 102 477 b 150 588 102 524 118 547 b 161 603 154 592 158 598 b 181 661 176 622 181 641 b 173 704 181 675 179 690 b 86 795 156 746 121 770 b 53 829 63 811 53 819 b 78 868 53 840 62 851 b 102 888 85 876 94 883 b 180 956 128 912 156 933 b 216 1028 204 979 216 1002 b 203 1081 216 1044 212 1061 b 115 1171 186 1123 148 1145 b 75 1221 88 1191 75 1207 b 114 1272 75 1237 88 1251 b 173 1308 132 1284 154 1296 b 226 1339 190 1318 209 1328 b 265 1405 253 1359 265 1380 b 258 1447 265 1418 264 1431 b 154 1541 242 1499 199 1521 b 109 1581 124 1555 109 1567 b 141 1627 109 1594 121 1608 b 204 1680 163 1646 184 1662 b 233 1742 223 1699 233 1719 b 226 1777 233 1752 230 1764 b 135 1862 210 1822 173 1840 b 104 1895 114 1875 104 1884 b 118 1930 104 1904 109 1914 b 192 2006 135 1961 161 1986 b 206 2029 203 2013 206 2022 b 192 2064 206 2040 197 2052 b 180 2074 187 2071 184 2074 b 156 2061 171 2074 163 2065 b 84 1983 125 2040 102 2013 b 65 1921 71 1961 65 1941 b 88 1853 65 1899 72 1876 b 171 1784 108 1820 138 1801 b 190 1764 184 1777 190 1770 b 174 1741 190 1757 184 1750 b 107 1683 153 1722 128 1704 b 68 1610 81 1659 68 1636 b 88 1548 68 1591 75 1571 b 177 1470 109 1512 141 1489 b 223 1431 209 1453 223 1443 b 179 1390 223 1420 209 1408 b 128 1361 163 1380 145 1371 b 71 1322 108 1348 88 1338 b 32 1253 45 1300 32 1277 b 48 1198 32 1236 37 1218 b 147 1090 71 1152 108 1120 b 174 1057 166 1076 174 1067 b 153 1022 174 1047 167 1037 b 109 982 140 1008 124 995 b 37 919 85 962 59 942 b 9 860 17 899 9 880 b 26 806 9 844 14 827 b 120 717 50 769 84 740 b 138 691 132 708 138 700 b 130 668 138 684 135 677 b 92 618 118 651 105 635 b 59 531 71 589 59 560 b 84 455 59 507 68 481 b 132 386 98 431 115 408 b 148 341 144 372 148 357 b 144 317 148 333 147 324 b 121 305 140 307 131 305 l 98 305 b 82 304 94 304 88 304 l 32 304 b 0 292 10 304 0 302 b 12 266 0 287 4 279 b 60 164 32 233 46 199 b 127 20 84 117 105 68 b 144 0 132 9 137 0 b 161 16 150 0 154 4 z', + }, + repeat1Bar: { + x_min: 0, + x_max: 599.1057280164835, + y_min: -250, + y_max: 175, + ha: 425, + o: 'm 216 98 b 255 75 236 84 246 75 b 291 104 265 75 274 85 b 323 147 304 117 327 125 b 289 215 323 168 314 184 b 238 252 269 239 253 252 b 187 222 222 252 207 242 b 173 206 183 216 177 212 b 157 170 163 194 157 183 b 174 138 157 160 161 150 b 216 98 189 127 200 109 z m 76 -334 b 181 -285 111 -315 148 -302 b 831 52 396 -168 613 -58 b 863 114 855 63 864 82 b 828 202 855 140 855 176 b 808 213 821 209 815 213 b 793 209 804 213 799 212 l 422 19 b 26 -179 291 -48 164 -124 b 0 -213 10 -186 0 -196 b 3 -232 0 -219 0 -225 b 52 -325 14 -265 37 -294 b 66 -337 55 -331 59 -337 b 76 -334 69 -337 72 -336 z m 769 -360 b 829 -264 779 -360 829 -284 b 769 -176 822 -232 799 -200 b 742 -163 760 -167 750 -163 b 716 -184 733 -163 723 -168 b 683 -228 708 -202 693 -213 b 672 -253 675 -236 672 -245 b 683 -281 672 -262 675 -271 b 752 -353 703 -308 732 -327 b 769 -360 756 -357 763 -360 z', + }, + repeat2Bars: { + x_min: 0.008571918423331715, + x_max: 775, + y_min: -246.92374029115243, + y_max: 362.82068246705313, + ha: 609.7444227582056, + o: 'm 909 412 b 873 351 906 384 893 367 b 436 50 729 249 585 147 l 91 -179 b 62 -174 76 -189 68 -183 b 12 -96 48 -147 24 -125 b 36 -16 -7 -53 -6 -43 b 220 104 96 24 158 65 b 819 507 425 232 624 369 b 881 495 852 530 861 528 b 909 412 899 469 900 439 z m 333 338 b 302 240 330 307 317 274 b 276 235 297 225 287 228 l 233 269 b 203 376 186 307 183 318 b 225 441 212 397 217 419 b 246 454 228 452 232 458 b 333 338 284 441 333 380 z m 1116 228 b 1067 158 1115 192 1092 174 b 910 59 1015 125 963 92 b 478 -240 762 -33 622 -140 b 311 -350 423 -279 366 -314 b 285 -344 298 -360 289 -356 b 239 -258 272 -314 251 -288 b 261 -196 228 -228 235 -210 b 517 -29 348 -144 436 -91 b 1030 321 681 98 861 202 b 1093 307 1060 343 1076 340 b 1116 228 1107 281 1109 252 z m 1070 -105 b 1020 -210 1057 -143 1038 -176 b 998 -210 1014 -219 1004 -215 l 924 -153 b 913 -88 899 -135 897 -112 b 949 -22 926 -66 939 -45 b 998 -7 960 6 976 9 b 1070 -105 1032 -32 1058 -63 z', + }, + repeat4Bars: { + x_min: 0, + x_max: 1374, + y_min: -304, + y_max: 304, + ha: 608, + o: 'm 78 -266 b 92 -258 82 -266 88 -264 b 114 -240 98 -251 107 -246 b 638 107 289 -125 467 -14 b 873 271 716 161 793 216 b 907 337 894 285 906 305 b 887 400 901 354 897 379 b 852 438 877 426 867 438 b 814 420 842 438 829 432 b 135 -33 592 262 366 111 b 12 -121 92 -60 48 -84 b 0 -144 4 -128 0 -135 b 4 -160 0 -148 1 -154 b 63 -255 17 -196 45 -223 b 78 -266 68 -262 72 -266 z m 291 148 b 325 223 302 148 308 170 b 333 256 328 235 330 246 b 264 363 330 305 298 336 b 242 373 255 369 248 373 b 220 347 232 373 225 364 b 202 288 216 327 213 305 b 190 252 193 275 190 262 b 222 200 190 232 202 215 b 291 148 264 170 279 148 z m 815 -367 b 829 -359 819 -367 824 -364 b 851 -343 835 -353 844 -347 b 1375 6 1027 -228 1205 -117 l 1610 170 b 1644 235 1632 184 1643 203 b 1626 300 1639 253 1634 276 b 1590 337 1614 325 1604 337 b 1551 320 1580 337 1567 330 b 873 -135 1329 161 1103 10 b 749 -222 829 -161 785 -184 b 737 -245 742 -230 737 -238 b 742 -261 737 -249 739 -255 b 802 -357 755 -297 782 -325 b 815 -367 805 -363 809 -367 z m 396 -360 b 408 -356 400 -360 403 -359 b 609 -223 471 -307 543 -269 b 896 -19 706 -156 795 -81 b 1164 154 985 37 1074 96 b 1214 223 1189 170 1211 187 b 1176 321 1204 253 1205 292 b 1159 330 1169 327 1165 330 b 1145 324 1155 330 1151 328 b 1048 258 1113 302 1081 278 b 357 -202 809 117 598 -65 b 333 -238 341 -212 333 -223 b 338 -262 333 -245 334 -253 b 384 -350 350 -294 372 -318 b 396 -360 386 -354 390 -360 z m 1162 -438 b 1174 -433 1166 -438 1169 -436 b 1374 -300 1237 -384 1309 -346 b 1660 -96 1470 -233 1561 -158 b 1930 76 1751 -39 1840 19 b 1979 147 1954 92 1977 109 b 1943 243 1968 177 1971 216 b 1924 253 1935 251 1930 253 b 1911 248 1920 253 1915 252 b 1814 181 1878 225 1848 202 b 1123 -279 1575 40 1364 -141 b 1099 -315 1106 -289 1099 -300 b 1103 -338 1099 -321 1100 -330 b 1149 -426 1115 -370 1138 -396 b 1162 -438 1151 -432 1156 -438 z m 1875 -295 b 1882 -291 1878 -295 1879 -294 b 1934 -189 1904 -258 1921 -223 b 1872 -96 1925 -147 1901 -120 b 1840 -78 1858 -84 1848 -78 b 1812 -109 1830 -78 1823 -88 l 1777 -173 b 1770 -199 1773 -181 1770 -190 b 1786 -230 1770 -210 1774 -220 b 1862 -289 1809 -253 1837 -269 b 1875 -295 1865 -292 1871 -295 z', + }, + repeatBarSlash: { + x_min: 0, + x_max: 630, + y_min: -225.19160170741762, + y_max: 265.12618221237005, + ha: 490.31778391978764, + o: 'm 78 -324 b 92 -314 82 -325 88 -321 b 114 -298 96 -307 107 -302 b 638 49 289 -183 467 -72 b 873 215 716 104 792 161 b 907 279 894 229 906 248 b 887 344 901 298 897 321 b 852 382 877 369 867 380 b 814 363 842 383 829 376 b 135 -91 603 192 364 55 b 12 -177 92 -118 45 -137 b 0 -202 4 -186 0 -192 b 4 -217 0 -206 1 -212 b 63 -312 17 -253 42 -284 b 78 -324 68 -318 72 -323 z', + }, + csymDiminished: { + x_min: 0, + x_max: 506, + y_min: -0.011036179317259481, + y_max: 500, + ha: 500.0110361793173, + o: 'm 397 0 b 729 265 576 -1 729 95 b 711 367 729 297 723 331 b 472 670 668 498 586 595 b 315 720 423 701 372 720 b 253 713 295 720 275 719 b 32 514 144 687 75 615 b 0 374 12 468 0 420 b 27 251 0 333 9 292 b 140 117 52 196 92 153 b 397 0 223 52 317 4 z m 340 95 b 132 314 233 84 122 216 b 324 589 145 438 200 539 b 415 611 360 603 389 611 b 544 505 469 611 505 576 b 590 392 564 471 583 432 b 596 343 593 374 596 359 b 340 95 596 210 485 96 z', + }, + csymHalfDiminished: { + x_min: -32, + x_max: 496, + y_min: -33, + y_max: 492, + ha: 525, + o: 'm -29 -48 b 0 -36 -19 -48 -9 -40 b 17 -20 7 -32 12 -24 b 134 94 56 19 95 56 b 372 0 207 43 282 0 b 455 13 397 0 426 4 b 677 258 556 45 671 141 b 678 289 677 268 678 278 b 593 539 678 380 654 467 b 592 541 593 540 592 540 l 684 632 b 713 678 700 647 711 665 b 714 691 714 684 714 688 b 707 704 714 698 711 701 b 691 708 701 707 696 708 b 660 691 680 708 670 701 l 552 585 b 478 634 530 606 507 624 b 361 684 438 648 397 661 b 301 703 341 697 320 703 b 226 677 275 703 251 693 b 27 449 140 618 72 543 b 0 324 9 410 -4 370 b 88 128 -1 243 30 177 b -30 -7 43 86 0 46 b -46 -33 -35 -16 -46 -24 b -42 -42 -46 -36 -45 -39 b -29 -48 -37 -46 -33 -48 z m 141 179 b 121 251 128 200 121 225 b 128 297 121 265 124 281 b 351 575 163 420 248 505 b 377 582 359 579 369 580 b 501 536 422 586 468 567 b 141 179 382 416 261 298 z m 281 105 b 179 137 240 105 206 117 b 210 168 189 147 200 157 l 537 487 b 547 455 541 477 544 467 b 556 370 552 426 556 397 b 429 154 556 274 503 207 b 281 105 384 122 336 105 z', + }, + csymAugmented: { + x_min: 0, + x_max: 530, + y_min: 0, + y_max: 539, + ha: 539, + o: 'm 380 0 b 393 14 384 4 390 9 b 397 46 397 24 397 36 l 397 333 b 736 327 511 331 624 330 b 763 343 755 327 763 333 b 755 361 763 348 760 354 b 635 431 726 402 688 431 l 390 431 l 390 485 b 386 606 392 526 386 566 b 392 664 386 625 387 645 b 395 690 393 672 395 681 b 376 753 395 711 389 734 b 357 776 372 762 369 776 b 350 775 354 776 353 776 b 327 740 337 769 327 759 b 327 621 328 700 327 661 b 330 438 328 559 328 498 l 29 438 b 4 431 20 438 7 442 b 0 413 3 425 0 419 b 7 399 0 408 1 403 b 131 338 45 369 85 340 b 331 334 199 336 265 334 b 333 163 333 276 333 220 b 366 13 333 109 348 63 b 380 0 367 7 374 4 z', + }, + csymMajorSeventh: { + x_min: 0, + x_max: 593.1050509327923, + y_min: 0, + y_max: 569, + ha: 569, + o: 'm 124 1 l 497 27 b 819 50 605 35 711 43 b 854 98 847 52 855 63 b 812 200 845 128 835 166 b 564 585 730 328 648 456 b 435 786 521 652 480 720 b 397 819 419 809 408 819 b 369 792 387 819 379 811 b 7 173 248 585 128 379 b 0 150 3 166 0 158 b 7 128 0 143 3 135 b 89 10 30 86 65 50 b 109 0 95 1 102 0 z m 163 147 b 153 153 158 147 156 148 b 164 179 147 163 158 170 b 426 644 251 334 338 488 b 442 660 432 655 436 660 b 458 645 446 660 452 655 b 727 220 547 503 636 361 b 736 202 732 213 736 206 b 714 190 736 196 730 192 b 179 148 537 177 359 163 b 163 147 174 150 168 147 z', + }, + csymMinor: { + x_min: 0, + x_max: 481.64484584675915, + y_min: 193, + y_max: 265.20435472429375, + ha: 72.20435472429375, + o: 'm 168 278 b 197 279 177 278 187 278 b 431 292 275 287 353 288 l 431 291 b 661 302 508 295 585 300 b 693 311 672 304 688 300 b 674 346 697 324 685 338 b 564 382 641 366 606 384 l 27 360 b 0 347 17 360 1 366 b 19 314 0 333 3 321 b 168 278 66 291 115 278 z', + }, + csymParensLeftTall: { + x_min: 0, + x_max: 185, + y_min: 0, + y_max: 1034, + ha: 1034, + o: 'm 215 0 b 226 17 223 1 223 10 b 229 37 229 24 229 32 b 220 81 229 52 225 66 b 167 203 206 124 181 160 b 86 616 124 338 89 474 b 82 765 85 665 82 716 b 91 886 82 805 84 845 b 245 1319 120 1038 171 1184 b 266 1397 259 1346 266 1371 b 259 1443 266 1411 264 1427 b 226 1489 253 1463 248 1489 b 193 1454 212 1489 203 1467 b 114 1292 158 1404 140 1346 b 0 806 40 1138 0 978 b 3 721 0 779 0 750 b 1 677 1 707 1 693 b 36 418 1 593 16 504 b 144 96 62 307 95 199 b 196 12 158 66 179 39 b 212 0 200 7 204 0 z', + }, + csymParensRightTall: { + x_min: -40, + x_max: 188.5411603861406, + y_min: 0.20204102886728756, + y_max: 1058, + ha: 1057.7979589711326, + o: 'm 30 1 b 63 14 42 -3 55 6 b 122 99 86 40 108 68 b 189 258 145 153 166 204 b 271 667 239 379 268 503 b 246 852 275 708 261 780 b 10 1495 197 1077 128 1295 b -14 1524 4 1505 1 1524 b -16 1522 -14 1524 -16 1524 b -46 1489 -33 1521 -43 1503 b -58 1417 -53 1464 -58 1440 b -36 1335 -58 1390 -52 1364 b 68 1138 0 1270 35 1204 b 163 883 108 1056 137 969 b 206 668 184 814 200 742 b 207 631 207 655 207 642 b 166 426 207 560 192 492 b 46 143 130 330 111 228 b 19 29 19 109 17 69 b 30 1 20 19 24 3 z', + }, + csymBracketLeftTall: { + x_min: 0, + x_max: 328, + y_min: 2, + y_max: 807, + ha: 805, + o: 'm 68 3 b 76 4 71 3 73 3 b 186 13 112 12 150 13 b 240 13 204 13 222 13 l 287 13 b 379 17 317 13 348 13 b 472 121 435 24 472 69 b 467 156 472 132 469 144 b 446 174 462 168 456 174 l 439 174 b 327 166 402 167 364 166 b 265 167 307 166 285 167 l 209 167 b 187 475 199 269 189 372 b 166 985 186 645 187 815 l 377 1002 b 415 1001 389 1002 402 1001 b 456 1027 432 1001 448 1005 b 472 1096 467 1048 472 1073 b 464 1146 472 1113 469 1130 b 439 1162 459 1161 452 1162 b 40 1129 305 1151 173 1139 b 1 1093 17 1128 1 1120 b 0 1009 0 1064 0 1037 b 13 975 0 991 3 981 b 30 670 23 873 30 772 b 29 608 30 649 29 628 l 29 563 b 56 88 29 405 49 246 b 53 22 55 66 55 43 b 68 3 53 12 56 3 z', + }, + csymBracketRightTall: { + x_min: 0.8519422934604696, + x_max: 306, + y_min: -0.17180889215212544, + y_max: 829.1037519824849, + ha: 829.2755608746371, + o: 'm 117 0 b 372 29 203 -3 287 20 l 373 29 b 406 32 383 30 395 30 b 436 60 428 33 432 43 b 441 109 439 76 441 92 b 433 200 441 140 436 170 b 409 696 422 366 409 530 b 416 887 409 763 416 831 b 415 920 416 899 415 910 l 415 1106 b 412 1135 415 1116 415 1126 l 412 1145 b 373 1189 413 1171 408 1192 b 321 1189 356 1189 338 1189 l 215 1189 l 215 1194 l 56 1194 b 6 1153 27 1195 10 1187 b 1 1064 3 1123 4 1093 b 22 1043 0 1050 6 1043 b 84 1044 42 1044 63 1044 b 264 1038 144 1044 203 1040 b 265 958 264 1011 265 985 b 262 845 265 920 264 883 b 259 710 259 801 259 755 b 279 243 259 554 271 399 b 285 170 281 219 284 194 b 95 151 222 161 158 156 b 29 81 27 147 27 147 l 29 73 b 105 0 33 0 33 0 z', + }, + csymParensLeftVeryTall: { + x_min: 0, + x_max: 116, + y_min: 0, + y_max: 934.1531437146923, + ha: 934.1531437146923, + o: 'm 128 0 b 147 17 137 0 144 9 b 167 102 160 45 167 73 b 158 154 167 120 164 137 b 117 307 141 204 130 256 b 63 698 84 435 71 567 b 62 788 62 729 62 757 b 69 916 62 829 63 873 b 109 1172 81 1001 94 1087 b 132 1320 118 1221 137 1269 b 124 1345 131 1329 134 1342 b 96 1332 114 1346 102 1341 b 71 1269 82 1313 75 1292 b 39 1104 59 1214 48 1159 b 0 742 19 988 0 871 b 10 559 3 688 6 624 b 58 226 16 446 33 336 b 112 20 73 157 94 89 b 128 0 115 13 118 0 z', + }, + csymParensRightVeryTall: { + x_min: -20, + x_max: 111.4332498248095, + y_min: -0.07657185734616112, + y_max: 1009, + ha: 1009.0765718573462, + o: 'm -3 0 b 20 22 9 -1 14 12 b 36 56 26 33 32 45 b 99 274 58 128 84 199 b 160 788 135 439 163 605 b 122 1181 164 912 145 1047 b 50 1431 108 1267 86 1351 b 36 1453 48 1439 46 1453 l 35 1453 l 30 1453 b 7 1423 17 1449 7 1440 b 27 1287 9 1377 10 1331 b 96 963 71 1184 85 1074 b 105 818 102 914 105 867 b 91 624 105 753 99 688 b -4 213 72 484 48 344 b -29 101 -19 174 -29 138 b -16 27 -29 76 -24 52 b -3 0 -13 17 -14 3 z', + }, + csymDiagonalArrangementSlash: { + x_min: -0.19862981551275186, + x_max: 990, + y_min: -26.946823529189132, + y_max: 1027.5514326488437, + ha: 1054.4982561780328, + o: 'm 14 -37 b 58 -9 35 -45 46 -22 b 392 333 170 105 279 217 l 765 711 b 1372 1329 968 916 1168 1125 b 1424 1439 1403 1359 1417 1397 b 1426 1457 1424 1444 1426 1450 b 1416 1477 1426 1466 1423 1475 b 1374 1462 1400 1485 1385 1473 b 1181 1269 1309 1397 1246 1331 b 736 831 1031 1122 884 979 b 356 452 609 704 485 576 b 32 132 246 347 143 236 b 0 50 7 109 1 84 b 6 9 -1 37 3 23 b 14 -37 10 -9 0 -32 z', + }, + accidentalNarrowReversedFlat: { + x_min: 0, + x_max: 208, + y_min: -231, + y_max: 449, + ha: 680, + o: 'm 272 -333 b 284 -320 278 -333 281 -328 b 300 -174 297 -272 300 -222 b 275 190 298 -52 279 68 b 268 445 272 275 268 360 l 268 490 b 264 612 269 530 265 572 b 236 647 264 632 252 645 l 235 647 b 217 618 220 647 220 628 b 207 526 210 588 207 556 b 210 432 207 494 210 464 b 216 268 213 377 215 323 l 216 230 l 215 232 b 154 256 194 240 174 251 b 111 264 138 261 124 264 b 3 153 50 264 10 223 b 0 94 0 132 0 114 b 194 -276 0 -63 68 -186 b 255 -323 215 -291 236 -307 b 272 -333 262 -330 268 -333 z m 233 -138 b 71 30 168 -92 105 -45 b 63 59 65 42 63 50 b 96 95 62 75 73 86 b 130 102 108 99 120 102 b 215 76 160 102 187 88 l 220 73 b 225 -22 220 42 222 10 b 233 -138 229 -62 230 -101 z', + }, + accidentalNarrowReversedFlatAndFlat: { + x_min: 0, + x_max: 335, + y_min: -231, + y_max: 449, + ha: 680, + o: 'm 151 490 b 148 612 151 530 150 572 b 132 647 148 632 141 645 b 122 618 124 647 124 628 b 117 526 118 588 117 556 b 118 432 117 494 118 464 b 121 268 120 377 121 323 l 121 232 b 86 256 109 240 98 251 b 62 264 78 261 69 264 b 1 153 29 264 6 223 b 0 94 0 132 0 114 b 109 -276 0 -63 37 -186 b 144 -323 121 -291 132 -307 b 153 -333 147 -330 151 -333 b 160 -320 157 -333 158 -328 b 168 -174 167 -272 168 -222 b 154 190 168 -52 157 68 b 151 445 153 275 151 360 z m 480 153 b 372 264 472 223 432 264 b 328 256 359 264 344 261 b 268 232 308 251 288 240 l 266 230 l 266 268 b 272 432 266 323 269 377 b 275 526 272 464 275 494 b 265 618 275 556 272 588 b 248 647 262 628 262 647 l 246 647 b 219 612 230 645 219 632 b 215 490 217 572 213 530 l 215 445 b 207 190 215 360 210 275 b 183 -174 203 68 183 -52 b 199 -320 183 -222 186 -272 b 210 -333 202 -328 204 -333 b 228 -323 215 -333 220 -330 b 288 -276 246 -307 268 -291 b 482 94 415 -186 482 -63 b 480 153 482 114 482 132 z m 40 30 b 36 59 36 42 36 50 b 55 95 35 75 42 86 b 73 102 60 99 68 102 b 121 76 89 102 105 88 l 124 73 b 127 -22 124 42 125 10 l 131 -138 b 40 30 95 -92 60 -43 z m 419 59 b 412 30 419 50 418 42 b 249 -138 374 -43 314 -92 b 258 -22 252 -101 253 -62 b 262 73 261 10 262 42 l 268 76 b 353 102 295 88 323 102 b 386 95 363 102 374 99 b 419 59 409 86 420 75 z', + }, + accidentalWilsonPlus: { + x_min: 0, + x_max: 298, + y_min: -218, + y_max: 218, + ha: 436, + o: 'm 232 -314 b 236 -301 236 -310 236 -305 l 236 -295 b 243 -52 239 -213 242 -132 l 369 62 b 429 200 413 101 425 147 b 416 243 429 216 428 236 b 383 225 406 251 393 232 l 377 220 b 246 98 336 177 291 138 b 249 242 248 145 246 193 b 225 304 251 265 242 287 b 209 314 220 308 215 314 b 204 312 207 314 206 312 b 196 292 196 310 196 300 b 193 184 194 256 194 220 b 187 48 192 140 190 94 b 46 -72 141 7 94 -32 b 0 -163 13 -98 0 -127 b 1 -187 0 -170 0 -179 b 10 -235 4 -203 6 -219 b 20 -255 12 -242 14 -251 b 36 -245 26 -259 30 -249 b 181 -109 85 -200 132 -154 b 176 -258 180 -158 176 -209 b 232 -314 176 -298 186 -307 z', + }, + accidentalWilsonMinus: { + x_min: 0, + x_max: 284.2093390143919, + y_min: -163, + y_max: 163, + ha: 326, + o: 'm 386 -232 b 409 -163 415 -222 408 -180 b 382 -69 410 -120 408 -89 b 32 228 264 30 141 118 b 17 235 26 233 22 235 b 3 219 9 235 3 228 b 0 157 3 199 0 179 b 29 69 0 125 6 95 b 323 -194 115 -29 222 -111 b 374 -235 338 -206 353 -235 b 386 -232 377 -235 382 -233 z', + }, + }, + fontFamily: 'Petaluma', + resolution: 1000, + generatedOn: '2021-12-06T21:04:23.441Z', +}; diff --git a/build/esm/src/fonts/petaluma_metrics.js b/build/esm/src/fonts/petaluma_metrics.js new file mode 100644 index 0000000000..9e068310cc --- /dev/null +++ b/build/esm/src/fonts/petaluma_metrics.js @@ -0,0 +1,533 @@ +export const PetalumaMetrics = { + name: 'Petaluma', + smufl: true, + stave: { + padding: 15, + endPaddingMax: 15, + endPaddingMin: 7, + unalignedNotePadding: 12, + }, + accidental: { + noteheadAccidentalPadding: 1, + leftPadding: 2, + accidentalSpacing: 3, + }, + clef: { + default: { + point: 32, + width: 26, + }, + small: { + point: 26, + width: 20, + }, + annotations: { + '8va': { + smuflCode: 'timeSig8', + default: { + point: 18, + treble: { + line: -1.4, + shiftX: 12, + }, + }, + small: { + point: 16, + treble: { + line: -0.2, + shiftX: 8, + }, + }, + }, + '8vb': { + smuflCode: 'timeSig8', + default: { + point: 18, + treble: { + line: 6, + shiftX: 10, + }, + bass: { + line: 3.5, + shiftX: 1, + }, + }, + small: { + point: 16, + treble: { + line: 5.3, + shiftX: 6, + }, + bass: { + line: 3.1, + shiftX: 0.5, + }, + }, + }, + }, + lineCount: { + '8': { point: 55, shiftY: 14 }, + '7': { point: 47, shiftY: 8 }, + '6': { point: 32, shiftY: 1 }, + '5': { point: 30, shiftY: -6 }, + '4': { point: 23, shiftY: -12 }, + }, + }, + parenthesis: { + default: { + point: 39, + width: 7, + }, + gracenote: { + point: (39 * 3) / 5, + width: 3, + }, + }, + pedalMarking: { + up: { + point: 40, + }, + down: { + point: 34, + }, + }, + digits: { + shiftLine: -1, + point: 22, + tupletPoint: 16, + shiftY: -2, + }, + articulation: { + articStaccatissimoAbove: { + padding: 2, + }, + articStaccatissimoBelow: { + padding: 2, + }, + }, + tremolo: { + default: { + point: 25, + spacing: 5, + offsetYStemUp: -5, + offsetYStemDown: 5, + offsetXStemUp: 13, + offsetXStemDown: 1, + }, + grace: { + point: 18, + spacing: 4, + offsetYStemUp: -5, + offsetYStemDown: 5, + offsetXStemUp: 8, + offsetXStemDown: 1, + }, + }, + staveRepetition: { + default: { + offsetY: 25, + offsetSymbol: 12, + spacing: 5, + }, + }, + noteHead: { + displaced: { + shiftX: -2, + }, + }, + stem: { + heightAdjustmentForFlag: -3, + noteHead: { + noteheadTriangleUpHalf: { + offsetYBaseStemUp: 5, + offsetYBaseStemDown: 4, + }, + noteheadTriangleUpBlack: { + offsetYBaseStemUp: 5, + offsetYBaseStemDown: 4, + }, + noteheadTriangleUpWhole: { + offsetYBaseStemUp: 5, + offsetYBaseStemDown: 4, + }, + noteheadXHalf: { + offsetYBaseStemUp: -4, + offsetYBaseStemDown: 4, + }, + noteheadXBlack: { + offsetYBaseStemUp: -4, + offsetYBaseStemDown: 4, + }, + noteheadXWhole: { + offsetYBaseStemUp: -4, + offsetYBaseStemDown: 4, + }, + noteheadHalf: { + offsetYBaseStemDown: 1.8, + offsetYBaseStemUp: -1.8, + }, + noteheadBlack: { + offsetYBaseStemDown: 2, + offsetYBaseStemUp: -2, + }, + noteheadSquareWhite: { + offsetYBaseStemDown: -5, + offsetYBaseStemUp: 5, + }, + }, + }, + glyphs: { + coda: { + point: 20, + shiftX: -7, + shiftY: 8, + }, + segno: { + shiftX: -7, + }, + flag: { + shiftX: -0.77, + flag16thUp: { + shiftX: -0.75, + }, + flag32ndUp: { + shiftX: -0.85, + }, + flag64thUp: { + shiftX: -1.55, + }, + flag128thUp: { + shiftX: -1.3, + }, + flag16thDown: { + shiftX: -0.75, + }, + flag32ndDown: { + shiftX: -0.76, + }, + flag64thDown: { + shiftX: -1.5, + }, + flag128thDown: { + shiftX: -1.2, + }, + tabStem: { + shiftX: -1.75, + }, + staveTempo: { + shiftX: -1, + }, + }, + clef: { + gClef: { + default: { scale: 1.1, shiftY: 1 }, + small: { shiftY: 1.5 }, + }, + fClef: { + default: { shiftY: -0.5 }, + }, + }, + ornament: { + ornamentTurn: { + scale: 1.2, + }, + ornamentTurnSlash: { + scale: 1.2, + }, + }, + stringNumber: { + verticalPadding: 8, + stemPadding: 2, + leftPadding: 5, + rightPadding: 6, + }, + stroke: { + arrowheadBlackDown: { + straight: { + shiftX: -4.5, + }, + wiggly: { + shiftX: -1, + shiftY: 1, + }, + }, + arrowheadBlackUp: { + straight: { + shiftX: -0.85, + }, + wiggly: { + shiftX: -1, + shiftY: 1, + }, + }, + }, + textNote: { + point: 34, + breathMarkTick: { + point: 36, + shiftY: 9, + }, + breathMarkComma: { + point: 36, + }, + segno: { + point: 30, + shiftX: -7, + shiftY: 8, + }, + coda: { + point: 20, + shiftX: -7, + shiftY: 8, + }, + ornamentTrill: { + shiftX: -10, + shiftY: 8, + }, + ornamentMordent: { + shiftX: -8, + }, + ornamentShortTrill: { + shiftX: -8, + }, + }, + noteHead: { + minPadding: 2, + standard: { + noteheadBlackStemUp: { + shiftX: 0.5, + }, + noteheadHalfStemUp: { + shiftX: 0.725, + }, + noteheadWholeStemUp: { + shiftX: 1, + }, + }, + custom: { + noteheadCircleXStemUp: { + shiftX: -1, + }, + noteheadCircleXStemDown: { + shiftX: 0.25, + }, + noteheadDiamondHalfStemUp: { + shiftX: 1.5, + }, + noteheadDiamondBlackStemUp: { + shiftX: 1.5, + }, + noteheadDiamondWholeStemUp: { + shiftX: 1, + }, + noteheadXBlackStemUp: { + shiftX: 1, + }, + noteheadXHalfStemUp: { + shiftX: -3, + }, + noteheadXHalfStemDown: { + shiftX: 1, + }, + noteheadXWholeStemUp: { + shiftX: -7, + }, + noteheadXWholeStemDown: { + shiftX: 1, + }, + noteheadSquareWhiteStemDown: { + shiftX: 0.25, + }, + noteheadSquareWhiteStemUp: { + shiftX: -0.75, + }, + noteheadSquareBlackStemUp: { + shiftX: -0.75, + }, + noteheadTriangleUpWholeStemUp: { + shiftX: -0.75, + }, + }, + }, + chordSymbol: { + global: { + superscriptOffset: -400, + subscriptOffset: 300, + kerningOffset: -150, + lowerKerningText: ['D', 'F', 'P', 'T', 'V', 'Y'], + upperKerningText: ['L'], + spacing: 20, + superSubRatio: 0.73, + }, + csymDiminished: { + scale: 0.8, + leftSideBearing: -95, + advanceWidth: 506, + yOffset: 0, + }, + csymHalfDiminished: { + scale: 0.8, + leftSideBearing: -32, + advanceWidth: 506, + yOffset: 0, + }, + csymAugmented: { + scale: 1, + leftSideBearing: -25, + advanceWidth: 530, + yOffset: 0, + }, + csymParensLeftTall: { + scale: 0.8, + leftSideBearing: 0, + advanceWidth: 155, + yOffset: 150, + }, + csymParensRightTall: { + scale: 0.8, + leftSideBearing: 40, + advanceWidth: 189, + yOffset: 150, + }, + csymBracketLeftTall: { + scale: 0.8, + leftSideBearing: 0, + advanceWidth: 328, + yOffset: 0, + }, + csymBracketRightTall: { + scale: 0.8, + leftSideBearing: 1, + advanceWidth: 600, + yOffset: 0, + }, + csymParensLeftVeryTall: { + scale: 0.95, + leftSideBearing: 0, + advanceWidth: 210, + yOffset: 250, + }, + csymParensRightVeryTall: { + scale: 0.9, + leftSideBearing: -100, + advanceWidth: 111, + yOffset: 250, + }, + csymDiagonalArrangementSlash: { + scale: 0.6, + leftSideBearing: -1, + advanceWidth: 990, + yOffset: 0, + }, + csymMinor: { + scale: 0.7, + leftSideBearing: 0, + advanceWidth: 482, + yOffset: 0, + }, + csymMajorSeventh: { + scale: 0.8, + leftSideBearing: 100, + yOffset: 0, + advanceWidth: 600, + }, + accidentalSharp: { + scale: 0.7, + leftSideBearing: 0, + advanceWidth: 425, + yOffset: -422, + }, + accidentalFlat: { + scale: 0.8, + leftSideBearing: -10, + advanceWidth: 228, + yOffset: -284, + }, + }, + jazzOrnaments: { + brassScoop: { + scale: 1.0, + xOffset: -12, + yOffset: 0, + stemUpYOffset: 0, + reportedWidth: 10, + }, + brassDoitMedium: { + scale: 1.0, + xOffset: 16, + yOffset: 0, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassFallLipShort: { + scale: 1.0, + xOffset: 16, + yOffset: 0, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassLiftMedium: { + scale: 1.0, + xOffset: 16, + yOffset: 5, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassFallRoughMedium: { + scale: 1.0, + xOffset: 16, + yOffset: 26, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassBend: { + scale: 1.0, + xOffset: 3, + yOffset: -8, + stemUpYOffset: 28, + reportedWidth: 5, + }, + brassMuteClosed: { + scale: 1.0, + xOffset: 3, + yOffset: -8, + stemUpYOffset: 26, + reportedWidth: 5, + }, + brassMuteOpen: { + scale: 1.0, + xOffset: 4, + yOffset: -8, + stemUpYOffset: 27, + reportedWidth: 5, + }, + brassFlip: { + scale: 1.0, + xOffset: 10, + yOffset: -4, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassJazzTurn: { + scale: 1.0, + xOffset: 6, + yOffset: -4, + stemUpYOffset: 0, + reportedWidth: 5, + }, + brassSmear: { + scale: 1.0, + xOffset: 10, + yOffset: -4, + stemUpYOffset: 0, + reportedWidth: 5, + }, + }, + tuplet: { + noteHeadOffset: 20, + stemOffset: 10, + bottomLine: 4, + topModifierOffset: 20, + }, + }, +}; diff --git a/build/esm/src/fonts/petalumascript_glyphs.js b/build/esm/src/fonts/petalumascript_glyphs.js new file mode 100644 index 0000000000..2589c61a67 --- /dev/null +++ b/build/esm/src/fonts/petalumascript_glyphs.js @@ -0,0 +1,863 @@ +export const PetalumaScriptFont = { + spacing: 50, + glyphs: { + ' ': { + x_min: 0, + x_max: 250, + y_min: 0, + y_max: 500, + ha: 500, + leftSideBearing: 0, + advanceWidth: 250, + }, + '0': { + x_min: 33, + x_max: 534, + y_min: -13, + y_max: 751, + ha: 764, + leftSideBearing: 33, + advanceWidth: 570, + }, + '1': { + x_min: 48, + x_max: 235, + y_min: -17, + y_max: 734, + ha: 751, + leftSideBearing: 48, + advanceWidth: 286, + }, + '2': { + x_min: 56, + x_max: 571, + y_min: -19, + y_max: 741, + ha: 760, + leftSideBearing: 56, + advanceWidth: 626, + }, + '3': { + x_min: 50, + x_max: 528, + y_min: -7, + y_max: 731, + ha: 738, + leftSideBearing: 50, + advanceWidth: 589, + }, + '4': { + x_min: 38, + x_max: 564, + y_min: -13, + y_max: 743, + ha: 756, + leftSideBearing: 38, + advanceWidth: 614, + }, + '5': { + x_min: 42, + x_max: 601, + y_min: -34, + y_max: 743, + ha: 777, + leftSideBearing: 42, + advanceWidth: 648, + }, + '6': { + x_min: 47, + x_max: 606, + y_min: -16, + y_max: 743, + ha: 759, + leftSideBearing: 47, + advanceWidth: 667, + }, + '7': { + x_min: 47, + x_max: 567, + y_min: 5, + y_max: 739, + ha: 734, + leftSideBearing: 0, + advanceWidth: 615, + }, + '8': { + x_min: 40, + x_max: 541, + y_min: -15, + y_max: 752, + ha: 767, + leftSideBearing: 40, + advanceWidth: 585, + }, + '9': { + x_min: 40, + x_max: 537, + y_min: -52, + y_max: 736, + ha: 788, + leftSideBearing: 40, + advanceWidth: 592, + }, + '!': { + x_min: 49, + x_max: 180, + y_min: -7, + y_max: 761, + ha: 768, + leftSideBearing: 49, + advanceWidth: 230, + }, + '"': { + x_min: 39, + x_max: 304, + y_min: 596, + y_max: 804, + ha: 208, + leftSideBearing: 39, + advanceWidth: 353, + }, + '#': { + x_min: 33, + x_max: 599, + y_min: -8, + y_max: 765, + ha: 773, + leftSideBearing: 33, + advanceWidth: 648, + }, + $: { + x_min: 53, + x_max: 495, + y_min: -111, + y_max: 823, + ha: 934, + leftSideBearing: 53, + advanceWidth: 560, + }, + '%': { + x_min: 35, + x_max: 656, + y_min: -128, + y_max: 808, + ha: 936, + leftSideBearing: 35, + advanceWidth: 711, + }, + '&': { + x_min: 53, + x_max: 441, + y_min: -3, + y_max: 753, + ha: 756, + leftSideBearing: 53, + advanceWidth: 500, + }, + "'": { + x_min: 43, + x_max: 161, + y_min: 590, + y_max: 811, + ha: 221, + leftSideBearing: 43, + advanceWidth: 217, + }, + '(': { + x_min: 41, + x_max: 311, + y_min: -36, + y_max: 845, + ha: 881, + leftSideBearing: 41, + advanceWidth: 308, + }, + ')': { + x_min: -8, + x_max: 257, + y_min: -21, + y_max: 852, + ha: 873, + leftSideBearing: -8, + advanceWidth: 280, + }, + '*': { + x_min: 59, + x_max: 539, + y_min: 175, + y_max: 589, + ha: 414, + leftSideBearing: 59, + advanceWidth: 601, + }, + '+': { + x_min: 33, + x_max: 361, + y_min: 180, + y_max: 587, + ha: 407, + leftSideBearing: 33, + advanceWidth: 400, + }, + ',': { + x_min: 15, + x_max: 176, + y_min: -129, + y_max: 92, + ha: 221, + leftSideBearing: 15, + advanceWidth: 205, + }, + '-': { + x_min: 40, + x_max: 380, + y_min: 317, + y_max: 452, + ha: 135, + leftSideBearing: 40, + advanceWidth: 422, + }, + '.': { + x_min: 48, + x_max: 185, + y_min: -56, + y_max: 84, + ha: 140, + leftSideBearing: 48, + advanceWidth: 227, + }, + '/': { + x_min: -58, + x_max: 654, + y_min: -122, + y_max: 844, + ha: 966, + leftSideBearing: -58, + advanceWidth: 626, + }, + ':': { + x_min: 65, + x_max: 225, + y_min: 97, + y_max: 536, + ha: 439, + leftSideBearing: 65, + advanceWidth: 302, + }, + ';': { + x_min: 13, + x_max: 295, + y_min: -139, + y_max: 536, + ha: 675, + leftSideBearing: 13, + advanceWidth: 334, + }, + '<': { + x_min: 28, + x_max: 438, + y_min: -1, + y_max: 607, + ha: 608, + leftSideBearing: 28, + advanceWidth: 475, + }, + '=': { + x_min: 40, + x_max: 383, + y_min: 199.9598640852289, + y_max: 541, + ha: 341.0401359147711, + leftSideBearing: 40, + advanceWidth: 422, + }, + '>': { + x_min: 35, + x_max: 421, + y_min: 28, + y_max: 632, + ha: 604, + leftSideBearing: 35, + advanceWidth: 466, + }, + '?': { + x_min: 45, + x_max: 548, + y_min: -17, + y_max: 767, + ha: 784, + leftSideBearing: 45, + advanceWidth: 592, + }, + '@': { + x_min: 51, + x_max: 730, + y_min: -78, + y_max: 753, + ha: 831, + leftSideBearing: 51, + advanceWidth: 781, + }, + A: { + x_min: 37, + x_max: 554, + y_min: -4, + y_max: 746, + ha: 750, + leftSideBearing: 37, + advanceWidth: 617, + }, + B: { + x_min: 37, + x_max: 532, + y_min: 3, + y_max: 783, + ha: 780, + leftSideBearing: 37, + advanceWidth: 579, + }, + C: { + x_min: 37, + x_max: 583, + y_min: -3, + y_max: 775, + ha: 778, + leftSideBearing: 37, + advanceWidth: 623, + }, + D: { + x_min: 50, + x_max: 530, + y_min: -15, + y_max: 749, + ha: 764, + leftSideBearing: 50, + advanceWidth: 579, + }, + E: { + x_min: 45, + x_max: 531, + y_min: -1, + y_max: 743, + ha: 744, + leftSideBearing: 45, + advanceWidth: 585, + }, + F: { + x_min: 45, + x_max: 459, + y_min: 23, + y_max: 727, + ha: 704, + leftSideBearing: 45, + advanceWidth: 510, + }, + G: { + x_min: 31, + x_max: 577, + y_min: -8, + y_max: 733, + ha: 741, + leftSideBearing: 31, + advanceWidth: 611, + }, + H: { + x_min: 37, + x_max: 493, + y_min: -22, + y_max: 758, + ha: 780, + leftSideBearing: 37, + advanceWidth: 535, + }, + I: { + x_min: 47, + x_max: 501, + y_min: -3, + y_max: 731, + ha: 734, + leftSideBearing: 47, + advanceWidth: 541, + }, + J: { + x_min: 33, + x_max: 531, + y_min: -23, + y_max: 725, + ha: 748, + leftSideBearing: 33, + advanceWidth: 573, + }, + K: { + x_min: 43, + x_max: 505, + y_min: -10, + y_max: 740, + ha: 750, + leftSideBearing: 43, + advanceWidth: 560, + }, + L: { + x_min: 49, + x_max: 457, + y_min: -2, + y_max: 746, + ha: 748, + leftSideBearing: 49, + advanceWidth: 510, + }, + M: { + x_min: 35, + x_max: 699, + y_min: 1, + y_max: 744, + ha: 743, + leftSideBearing: 35, + advanceWidth: 743, + }, + N: { + x_min: 34, + x_max: 533, + y_min: -17, + y_max: 761, + ha: 778, + leftSideBearing: 34, + advanceWidth: 579, + }, + O: { + x_min: 41, + x_max: 608, + y_min: -5, + y_max: 735, + ha: 740, + leftSideBearing: 41, + advanceWidth: 667, + }, + P: { + x_min: 53, + x_max: 451, + y_min: -18, + y_max: 735, + ha: 753, + leftSideBearing: 53, + advanceWidth: 497, + }, + Q: { + x_min: 40, + x_max: 599, + y_min: -67, + y_max: 744, + ha: 811, + leftSideBearing: 40, + advanceWidth: 648, + }, + R: { + x_min: 39, + x_max: 487, + y_min: 16, + y_max: 735, + ha: 719, + leftSideBearing: 39, + advanceWidth: 535, + }, + S: { + x_min: 35, + x_max: 552, + y_min: -47, + y_max: 708, + ha: 755, + leftSideBearing: 35, + advanceWidth: 604, + }, + T: { + x_min: 26, + x_max: 656, + y_min: -13, + y_max: 718, + ha: 731, + leftSideBearing: 26, + advanceWidth: 705, + }, + U: { + x_min: 41, + x_max: 518, + y_min: -20, + y_max: 748, + ha: 768, + leftSideBearing: 41, + advanceWidth: 567, + }, + V: { + x_min: 47, + x_max: 509, + y_min: -26, + y_max: 744, + ha: 770, + leftSideBearing: 47, + advanceWidth: 567, + }, + W: { + x_min: 44, + x_max: 789, + y_min: -35, + y_max: 720, + ha: 755, + leftSideBearing: 44, + advanceWidth: 833, + }, + X: { + x_min: 63, + x_max: 635, + y_min: -10, + y_max: 745, + ha: 755, + leftSideBearing: 63, + advanceWidth: 680, + }, + Y: { + x_min: 43, + x_max: 503, + y_min: -21, + y_max: 734, + ha: 755, + leftSideBearing: 43, + advanceWidth: 541, + }, + Z: { + x_min: 42, + x_max: 584, + y_min: -10, + y_max: 739, + ha: 749, + leftSideBearing: 42, + advanceWidth: 629, + }, + '[': { + x_min: 46, + x_max: 346, + y_min: -150, + y_max: 884, + ha: 1034, + leftSideBearing: 46, + advanceWidth: 291, + }, + '\\': { + x_min: 20, + x_max: 616, + y_min: -100, + y_max: 797, + ha: 897, + leftSideBearing: 20, + advanceWidth: 645, + }, + ']': { + x_min: -76, + x_max: 226, + y_min: -150, + y_max: 881, + ha: 1031, + leftSideBearing: -76, + advanceWidth: 297, + }, + '^': { + x_min: 43, + x_max: 437, + y_min: 517, + y_max: 812, + ha: 295, + leftSideBearing: 43, + advanceWidth: 478, + }, + _: { + x_min: 29, + x_max: 563, + y_min: -110, + y_max: -1, + ha: 109, + leftSideBearing: 29, + advanceWidth: 598, + }, + '`': { + x_min: 54, + x_max: 321, + y_min: 540, + y_max: 747, + ha: 207, + leftSideBearing: 54, + advanceWidth: 368, + }, + a: { + x_min: 20, + x_max: 447, + y_min: -17, + y_max: 495, + ha: 512, + leftSideBearing: 20, + advanceWidth: 494, + }, + b: { + x_min: 37, + x_max: 466, + y_min: -27, + y_max: 770, + ha: 797, + leftSideBearing: 37, + advanceWidth: 510, + }, + c: { + x_min: 35, + x_max: 456, + y_min: -9, + y_max: 507, + ha: 516, + leftSideBearing: 35, + advanceWidth: 460, + }, + d: { + x_min: 45, + x_max: 520, + y_min: -15, + y_max: 764, + ha: 779, + leftSideBearing: 45, + advanceWidth: 560, + }, + e: { + x_min: 33, + x_max: 370, + y_min: -5, + y_max: 501, + ha: 506, + leftSideBearing: 33, + advanceWidth: 397, + }, + f: { + x_min: 35, + x_max: 411, + y_min: -13, + y_max: 695, + ha: 708, + leftSideBearing: 35, + advanceWidth: 453, + }, + g: { + x_min: 33, + x_max: 551, + y_min: -257, + y_max: 505, + ha: 762, + leftSideBearing: 33, + advanceWidth: 611, + }, + h: { + x_min: 32, + x_max: 458, + y_min: -29, + y_max: 743, + ha: 772, + leftSideBearing: 32, + advanceWidth: 491, + }, + i: { + x_min: 45, + x_max: 167, + y_min: -13, + y_max: 631, + ha: 644, + leftSideBearing: 45, + advanceWidth: 220, + }, + j: { + x_min: -127, + x_max: 261, + y_min: -231, + y_max: 601, + ha: 832, + leftSideBearing: -127, + advanceWidth: 308, + }, + k: { + x_min: 39, + x_max: 443, + y_min: -3, + y_max: 700, + ha: 703, + leftSideBearing: 39, + advanceWidth: 497, + }, + l: { + x_min: 58, + x_max: 168, + y_min: -8, + y_max: 686, + ha: 694, + leftSideBearing: 58, + advanceWidth: 227, + }, + m: { + x_min: 39, + x_max: 688, + y_min: -14, + y_max: 501, + ha: 515, + leftSideBearing: 39, + advanceWidth: 718, + }, + n: { + x_min: 45, + x_max: 491, + y_min: -32, + y_max: 512, + ha: 544, + leftSideBearing: 45, + advanceWidth: 541, + }, + o: { + x_min: 41, + x_max: 424, + y_min: -12, + y_max: 493, + ha: 505, + leftSideBearing: 41, + advanceWidth: 447, + }, + p: { + x_min: 25, + x_max: 529, + y_min: -260, + y_max: 500, + ha: 760, + leftSideBearing: 25, + advanceWidth: 573, + }, + q: { + x_min: 53, + x_max: 603, + y_min: -235, + y_max: 514, + ha: 749, + leftSideBearing: 53, + advanceWidth: 623, + }, + r: { + x_min: 32, + x_max: 407, + y_min: -7, + y_max: 492, + ha: 499, + leftSideBearing: 32, + advanceWidth: 460, + }, + s: { + x_min: 49, + x_max: 416, + y_min: -12, + y_max: 519, + ha: 531, + leftSideBearing: 49, + advanceWidth: 460, + }, + t: { + x_min: 32, + x_max: 442, + y_min: -5, + y_max: 684, + ha: 689, + leftSideBearing: 32, + advanceWidth: 469, + }, + u: { + x_min: 41, + x_max: 487, + y_min: -5, + y_max: 507, + ha: 512, + leftSideBearing: 41, + advanceWidth: 510, + }, + v: { + x_min: 16, + x_max: 441, + y_min: -20, + y_max: 542, + ha: 562, + leftSideBearing: 16, + advanceWidth: 456, + }, + w: { + x_min: 39, + x_max: 639, + y_min: -22, + y_max: 505, + ha: 527, + leftSideBearing: 39, + advanceWidth: 661, + }, + x: { + x_min: 15, + x_max: 505, + y_min: -39, + y_max: 539, + ha: 578, + leftSideBearing: 15, + advanceWidth: 541, + }, + y: { + x_min: -98, + x_max: 501, + y_min: -242, + y_max: 511, + ha: 753, + leftSideBearing: -98, + advanceWidth: 548, + }, + z: { + x_min: 27, + x_max: 479, + y_min: -3, + y_max: 494, + ha: 497, + leftSideBearing: 27, + advanceWidth: 494, + }, + '{': { + x_min: 0, + x_max: 0, + y_min: 0, + y_max: 0, + ha: 0, + leftSideBearing: 0, + advanceWidth: 308, + }, + '|': { + x_min: 0, + x_max: 0, + y_min: 0, + y_max: 0, + ha: 0, + leftSideBearing: 0, + advanceWidth: 308, + }, + '}': { + x_min: 0, + x_max: 0, + y_min: 0, + y_max: 0, + ha: 0, + leftSideBearing: 0, + advanceWidth: 308, + }, + '~': { + x_min: 0, + x_max: 0, + y_min: 0, + y_max: 0, + ha: 0, + leftSideBearing: 0, + advanceWidth: 308, + }, + }, + fontFamily: 'PetalumaScript', + resolution: 1000, + generatedOn: '2020-06-14T18:33:25.407Z', +}; diff --git a/build/esm/src/fonts/robotoslab_glyphs.js b/build/esm/src/fonts/robotoslab_glyphs.js new file mode 100644 index 0000000000..e7f8b1d3e9 --- /dev/null +++ b/build/esm/src/fonts/robotoslab_glyphs.js @@ -0,0 +1,863 @@ +export const RobotoSlabFont = { + spacing: 50, + glyphs: { + ' ': { + x_min: 0, + x_max: 509, + y_min: 0, + y_max: 2000, + ha: 2000, + leftSideBearing: 0, + advanceWidth: 509, + }, + '0': { + x_min: 121, + x_max: 1048, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 121, + advanceWidth: 1168, + }, + '1': { + x_min: 117, + x_max: 767, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 117, + advanceWidth: 844, + }, + '2': { + x_min: 75.8474576645637, + x_max: 1040, + y_min: 0, + y_max: 1477, + ha: 1477, + leftSideBearing: 75, + advanceWidth: 1131, + }, + '3': { + x_min: 74.85365853658536, + x_max: 994, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 74, + advanceWidth: 1106, + }, + '4': { + x_min: 63, + x_max: 1114, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 63, + advanceWidth: 1187, + }, + '5': { + x_min: 96.8448275474953, + x_max: 982, + y_min: -21, + y_max: 1456, + ha: 1477, + leftSideBearing: 96, + advanceWidth: 1081, + }, + '6': { + x_min: 121, + x_max: 1067, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 121, + advanceWidth: 1144, + }, + '7': { + x_min: 76, + x_max: 1060, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: -30, + advanceWidth: 1128, + }, + '8': { + x_min: 92, + x_max: 1039, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 92, + advanceWidth: 1131, + }, + '9': { + x_min: 84, + x_max: 1026, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 84, + advanceWidth: 1154, + }, + '!': { + x_min: 143, + x_max: 340, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 143, + advanceWidth: 483, + }, + '"': { + x_min: 166, + x_max: 634, + y_min: 1055, + y_max: 1560, + ha: 505, + leftSideBearing: 166, + advanceWidth: 770, + }, + '#': { + x_min: 63, + x_max: 1179, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 63, + advanceWidth: 1246, + }, + $: { + x_min: 81.92156915727656, + x_max: 1012, + y_min: -208, + y_max: 1693, + ha: 1901, + leftSideBearing: 81, + advanceWidth: 1110, + }, + '%': { + x_min: 77, + x_max: 1384, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 77, + advanceWidth: 1460, + }, + '&': { + x_min: 74, + x_max: 1242, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 74, + advanceWidth: 1289, + }, + "'": { + x_min: 166, + x_max: 324, + y_min: 1055, + y_max: 1560, + ha: 505, + leftSideBearing: 166, + advanceWidth: 460, + }, + '(': { + x_min: 114, + x_max: 650, + y_min: -463, + y_max: 1636, + ha: 2099, + leftSideBearing: 114, + advanceWidth: 662, + }, + ')': { + x_min: 11, + x_max: 547, + y_min: -463, + y_max: 1636, + ha: 2099, + leftSideBearing: 11, + advanceWidth: 654, + }, + '*': { + x_min: 66, + x_max: 893, + y_min: 607, + y_max: 1456, + ha: 849, + leftSideBearing: 66, + advanceWidth: 958, + }, + '+': { + x_min: 73, + x_max: 1071, + y_min: 146, + y_max: 1206, + ha: 1060, + leftSideBearing: 73, + advanceWidth: 1145, + }, + ',': { + x_min: 23, + x_max: 315, + y_min: -311, + y_max: 221, + ha: 532, + leftSideBearing: 23, + advanceWidth: 404, + }, + '-': { + x_min: 154, + x_max: 643, + y_min: 538, + y_max: 692, + ha: 154, + leftSideBearing: 154, + advanceWidth: 797, + }, + '.': { + x_min: 145, + x_max: 342, + y_min: 0, + y_max: 202, + ha: 202, + leftSideBearing: 145, + advanceWidth: 493, + }, + '/': { + x_min: 0, + x_max: 774, + y_min: -125, + y_max: 1456, + ha: 1581, + leftSideBearing: 0, + advanceWidth: 824, + }, + ':': { + x_min: 145, + x_max: 342, + y_min: 0, + y_max: 1082, + ha: 1082, + leftSideBearing: 145, + advanceWidth: 419, + }, + ';': { + x_min: 53, + x_max: 345, + y_min: -311, + y_max: 1082, + ha: 1393, + leftSideBearing: 53, + advanceWidth: 424, + }, + '<': { + x_min: 76, + x_max: 892, + y_min: 107, + y_max: 1013, + ha: 906, + leftSideBearing: 76, + advanceWidth: 1017, + }, + '=': { + x_min: 147, + x_max: 981, + y_min: 407, + y_max: 987, + ha: 580, + leftSideBearing: 147, + advanceWidth: 1127, + }, + '>': { + x_min: 125, + x_max: 980, + y_min: 87, + y_max: 993, + ha: 906, + leftSideBearing: 125, + advanceWidth: 1060, + }, + '?': { + x_min: 65.92660602419838, + x_max: 890, + y_min: 0, + y_max: 1477, + ha: 1477, + leftSideBearing: 65, + advanceWidth: 953, + }, + '@': { + x_min: 84.3592218305664, + x_max: 1705.2346925277395, + y_min: -453, + y_max: 1431, + ha: 1884, + leftSideBearing: 84, + advanceWidth: 1821, + }, + A: { + x_min: 70, + x_max: 1463, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 70, + advanceWidth: 1533, + }, + B: { + x_min: 81, + x_max: 1253, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 81, + advanceWidth: 1322, + }, + C: { + x_min: 80, + x_max: 1174, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 80, + advanceWidth: 1290, + }, + D: { + x_min: 81, + x_max: 1291, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 81, + advanceWidth: 1356, + }, + E: { + x_min: 81, + x_max: 1190, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 81, + advanceWidth: 1306, + }, + F: { + x_min: 81, + x_max: 1176, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 81, + advanceWidth: 1256, + }, + G: { + x_min: 80, + x_max: 1226, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 80, + advanceWidth: 1346, + }, + H: { + x_min: 81, + x_max: 1497, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 81, + advanceWidth: 1578, + }, + I: { + x_min: 81, + x_max: 604, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 81, + advanceWidth: 685, + }, + J: { + x_min: 60, + x_max: 1100, + y_min: -21, + y_max: 1456, + ha: 1477, + leftSideBearing: 60, + advanceWidth: 1169, + }, + K: { + x_min: 81, + x_max: 1427, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 81, + advanceWidth: 1501, + }, + L: { + x_min: 81, + x_max: 1130, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 81, + advanceWidth: 1210, + }, + M: { + x_min: 94, + x_max: 1888, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 94, + advanceWidth: 1982, + }, + N: { + x_min: 83, + x_max: 1509, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 83, + advanceWidth: 1592, + }, + O: { + x_min: 70, + x_max: 1281, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 70, + advanceWidth: 1351, + }, + P: { + x_min: 81, + x_max: 1242, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 81, + advanceWidth: 1297, + }, + Q: { + x_min: 70, + x_max: 1348, + y_min: -245, + y_max: 1477, + ha: 1722, + leftSideBearing: 70, + advanceWidth: 1376, + }, + R: { + x_min: 81, + x_max: 1285, + y_min: 0, + y_max: 1455, + ha: 1455, + leftSideBearing: 81, + advanceWidth: 1385, + }, + S: { + x_min: 115, + x_max: 1116, + y_min: -21, + y_max: 1477, + ha: 1498, + leftSideBearing: 115, + advanceWidth: 1206, + }, + T: { + x_min: 96, + x_max: 1306, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 96, + advanceWidth: 1406, + }, + U: { + x_min: 70, + x_max: 1452, + y_min: -21, + y_max: 1456, + ha: 1477, + leftSideBearing: 70, + advanceWidth: 1522, + }, + V: { + x_min: 65, + x_max: 1443, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 65, + advanceWidth: 1508, + }, + W: { + x_min: 72, + x_max: 2057, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 72, + advanceWidth: 2129, + }, + X: { + x_min: 80, + x_max: 1449, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 80, + advanceWidth: 1529, + }, + Y: { + x_min: 65, + x_max: 1396, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 65, + advanceWidth: 1461, + }, + Z: { + x_min: 90, + x_max: 1107, + y_min: 0, + y_max: 1456, + ha: 1456, + leftSideBearing: 90, + advanceWidth: 1197, + }, + '[': { + x_min: 157, + x_max: 541, + y_min: -312, + y_max: 1664, + ha: 1976, + leftSideBearing: 157, + advanceWidth: 573, + }, + '\\': { + x_min: 36, + x_max: 830, + y_min: -125, + y_max: 1456, + ha: 1581, + leftSideBearing: 36, + advanceWidth: 841, + }, + ']': { + x_min: 23, + x_max: 408, + y_min: -312, + y_max: 1664, + ha: 1976, + leftSideBearing: 23, + advanceWidth: 552, + }, + '^': { + x_min: 71, + x_max: 802, + y_min: 729, + y_max: 1456, + ha: 727, + leftSideBearing: 71, + advanceWidth: 864, + }, + _: { + x_min: 119, + x_max: 1041, + y_min: -154, + y_max: 0, + ha: 154, + leftSideBearing: 119, + advanceWidth: 1168, + }, + '`': { + x_min: 40, + x_max: 456, + y_min: 1288, + y_max: 1560, + ha: 272, + leftSideBearing: 40, + advanceWidth: 496, + }, + a: { + x_min: 79, + x_max: 1053, + y_min: -21, + y_max: 1102, + ha: 1123, + leftSideBearing: 79, + advanceWidth: 1132, + }, + b: { + x_min: -16, + x_max: 1071, + y_min: -21, + y_max: 1560, + ha: 1581, + leftSideBearing: -16, + advanceWidth: 1145, + }, + c: { + x_min: 78, + x_max: 988, + y_min: -21, + y_max: 1102, + ha: 1123, + leftSideBearing: 78, + advanceWidth: 1067, + }, + d: { + x_min: 78, + x_max: 1156, + y_min: -21, + y_max: 1560, + ha: 1581, + leftSideBearing: 78, + advanceWidth: 1218, + }, + e: { + x_min: 74, + x_max: 980, + y_min: -21, + y_max: 1102, + ha: 1123, + leftSideBearing: 74, + advanceWidth: 1059, + }, + f: { + x_min: 64, + x_max: 731, + y_min: 0, + y_max: 1581, + ha: 1581, + leftSideBearing: 64, + advanceWidth: 725, + }, + g: { + x_min: 78, + x_max: 1133, + y_min: -437, + y_max: 1102, + ha: 1539, + leftSideBearing: 78, + advanceWidth: 1157, + }, + h: { + x_min: 49, + x_max: 1255, + y_min: 0, + y_max: 1560, + ha: 1560, + leftSideBearing: 49, + advanceWidth: 1315, + }, + i: { + x_min: 67, + x_max: 590, + y_min: 0, + y_max: 1560, + ha: 1560, + leftSideBearing: 67, + advanceWidth: 652, + }, + j: { + x_min: -56, + x_max: 381, + y_min: -437, + y_max: 1560, + ha: 1997, + leftSideBearing: -56, + advanceWidth: 525, + }, + k: { + x_min: 64, + x_max: 1248, + y_min: 0, + y_max: 1560, + ha: 1560, + leftSideBearing: 64, + advanceWidth: 1287, + }, + l: { + x_min: 64, + x_max: 587, + y_min: 0, + y_max: 1560, + ha: 1560, + leftSideBearing: 64, + advanceWidth: 653, + }, + m: { + x_min: 74, + x_max: 1905, + y_min: 0, + y_max: 1102, + ha: 1102, + leftSideBearing: 74, + advanceWidth: 1977, + }, + n: { + x_min: 74, + x_max: 1278, + y_min: 0, + y_max: 1102, + ha: 1102, + leftSideBearing: 74, + advanceWidth: 1343, + }, + o: { + x_min: 78, + x_max: 1046, + y_min: -21, + y_max: 1102, + ha: 1123, + leftSideBearing: 78, + advanceWidth: 1124, + }, + p: { + x_min: 34, + x_max: 1119, + y_min: -416, + y_max: 1102, + ha: 1518, + leftSideBearing: 34, + advanceWidth: 1197, + }, + q: { + x_min: 78, + x_max: 1135, + y_min: -416, + y_max: 1102, + ha: 1518, + leftSideBearing: 78, + advanceWidth: 1139, + }, + r: { + x_min: 72, + x_max: 808, + y_min: 0, + y_max: 1102, + ha: 1102, + leftSideBearing: 72, + advanceWidth: 854, + }, + s: { + x_min: 104, + x_max: 933, + y_min: -21, + y_max: 1102, + ha: 1123, + leftSideBearing: 104, + advanceWidth: 1022, + }, + t: { + x_min: 24, + x_max: 678, + y_min: -17, + y_max: 1343, + ha: 1360, + leftSideBearing: 24, + advanceWidth: 730, + }, + u: { + x_min: 52, + x_max: 1181, + y_min: -21, + y_max: 1082, + ha: 1103, + leftSideBearing: 52, + advanceWidth: 1245, + }, + v: { + x_min: 26, + x_max: 1176, + y_min: 0, + y_max: 1082, + ha: 1082, + leftSideBearing: 26, + advanceWidth: 1206, + }, + w: { + x_min: 52, + x_max: 1777, + y_min: 0, + y_max: 1082, + ha: 1082, + leftSideBearing: 52, + advanceWidth: 1823, + }, + x: { + x_min: 42, + x_max: 1163, + y_min: 0, + y_max: 1082, + ha: 1082, + leftSideBearing: 42, + advanceWidth: 1203, + }, + y: { + x_min: 24, + x_max: 1172, + y_min: -437, + y_max: 1082, + ha: 1519, + leftSideBearing: 24, + advanceWidth: 1192, + }, + z: { + x_min: 88, + x_max: 960, + y_min: 0, + y_max: 1082, + ha: 1082, + leftSideBearing: 88, + advanceWidth: 1032, + }, + '{': { + x_min: 63, + x_max: 671, + y_min: -364, + y_max: 1597, + ha: 1961, + leftSideBearing: 63, + advanceWidth: 701, + }, + '|': { + x_min: 150, + x_max: 307, + y_min: -270, + y_max: 1456, + ha: 1726, + leftSideBearing: 150, + advanceWidth: 451, + }, + '}': { + x_min: 27, + x_max: 635, + y_min: -364, + y_max: 1597, + ha: 1961, + leftSideBearing: 27, + advanceWidth: 701, + }, + '~': { + x_min: 121, + x_max: 1257, + y_min: 401, + y_max: 803, + ha: 402, + leftSideBearing: 121, + advanceWidth: 1386, + }, + }, + fontFamily: 'Roboto Slab', + resolution: 2048, + generatedOn: '2020-06-15T19:12:58.120Z', +}; diff --git a/build/esm/src/fonts/textfonts.js b/build/esm/src/fonts/textfonts.js new file mode 100644 index 0000000000..e81301e0c1 --- /dev/null +++ b/build/esm/src/fonts/textfonts.js @@ -0,0 +1,44 @@ +import { Font } from '../font.js'; +import { TextFormatter } from '../textformatter.js'; +import { PetalumaScriptFont } from './petalumascript_glyphs.js'; +import { RobotoSlabFont } from './robotoslab_glyphs.js'; +export function loadTextFonts() { + { + const fontData = RobotoSlabFont; + const { fontFamily, resolution, glyphs } = fontData; + Font.load(fontFamily, fontData); + const maxSizeGlyph = 'b'; + TextFormatter.registerInfo({ + family: fontFamily, + resolution, + glyphs, + maxSizeGlyph, + monospaced: false, + bold: false, + italic: false, + superscriptOffset: 0.66, + subscriptOffset: 0.66, + serifs: true, + description: 'Text font to pair with the Bravura / Gonville music fonts.', + }); + } + { + const fontData = PetalumaScriptFont; + const { fontFamily, resolution, glyphs } = fontData; + Font.load(fontFamily, fontData); + const maxSizeGlyph = 'b'; + TextFormatter.registerInfo({ + family: fontFamily, + resolution, + glyphs, + maxSizeGlyph, + monospaced: false, + bold: false, + italic: false, + superscriptOffset: 0.66, + subscriptOffset: 0.66, + serifs: false, + description: 'Text font to pair with the Petaluma music font.', + }); + } +} diff --git a/build/esm/src/formatter.js b/build/esm/src/formatter.js new file mode 100644 index 0000000000..cb28b16b1f --- /dev/null +++ b/build/esm/src/formatter.js @@ -0,0 +1,568 @@ +import { Beam } from './beam.js'; +import { Font } from './font.js'; +import { Fraction } from './fraction.js'; +import { ModifierContext } from './modifiercontext.js'; +import { Stave } from './stave.js'; +import { StaveConnector } from './staveconnector.js'; +import { Tables } from './tables.js'; +import { TickContext } from './tickcontext.js'; +import { isNote, isStaveNote } from './typeguard.js'; +import { defined, log, midLine, RuntimeError } from './util.js'; +import { Voice } from './voice.js'; +const sumArray = (arr) => arr.reduce((a, b) => a + b, 0); +function createContexts(voices, makeContext, addToContext) { + const resolutionMultiplier = Formatter.getResolutionMultiplier(voices); + const tickToContextMap = {}; + const tickList = []; + const contexts = []; + voices.forEach((voice, voiceIndex) => { + const ticksUsed = new Fraction(0, resolutionMultiplier); + voice.getTickables().forEach((tickable) => { + const integerTicks = ticksUsed.numerator; + if (!tickToContextMap[integerTicks]) { + const newContext = makeContext({ tickID: integerTicks }); + contexts.push(newContext); + tickToContextMap[integerTicks] = newContext; + tickList.push(integerTicks); + } + addToContext(tickable, tickToContextMap[integerTicks], voiceIndex); + ticksUsed.add(tickable.getTicks()); + }); + }); + return { + map: tickToContextMap, + array: contexts, + list: tickList.sort((a, b) => a - b), + resolutionMultiplier, + }; +} +function L(...args) { + if (Formatter.DEBUG) + log('Vex.Flow.Formatter', args); +} +function getRestLineForNextNoteGroup(notes, currRestLine, currNoteIndex, compare) { + let nextRestLine = currRestLine; + for (let noteIndex = currNoteIndex + 1; noteIndex < notes.length; noteIndex++) { + const note = notes[noteIndex]; + if (isNote(note) && !note.isRest() && !note.shouldIgnoreTicks()) { + nextRestLine = note.getLineForRest(); + break; + } + } + if (compare && currRestLine !== nextRestLine) { + const top = Math.max(currRestLine, nextRestLine); + const bot = Math.min(currRestLine, nextRestLine); + nextRestLine = midLine(top, bot); + } + return nextRestLine; +} +export class Formatter { + constructor(options) { + this.formatterOptions = Object.assign({ globalSoftmax: false, softmaxFactor: 100, maxIterations: 5 }, options); + this.justifyWidth = 0; + this.totalCost = 0; + this.totalShift = 0; + this.durationStats = {}; + this.minTotalWidth = 0; + this.hasMinTotalWidth = false; + this.tickContexts = undefined; + this.modifierContexts = undefined; + this.contextGaps = { + total: 0, + gaps: [], + }; + this.voices = []; + this.lossHistory = []; + } + static SimpleFormat(notes, x = 0, { paddingBetween = 10 } = {}) { + notes.reduce((accumulator, note) => { + note.addToModifierContext(new ModifierContext()); + const tick = new TickContext().addTickable(note).preFormat(); + const metrics = tick.getMetrics(); + tick.setX(accumulator + metrics.totalLeftPx); + return accumulator + tick.getWidth() + metrics.totalRightPx + paddingBetween; + }, x); + } + static plotDebugging(ctx, formatter, xPos, y1, y2, options) { + options = Object.assign({ stavePadding: Tables.currentMusicFont().lookupMetric('stave.padding') }, options); + const x = xPos + options.stavePadding; + const contextGaps = formatter.contextGaps; + function stroke(x1, x2, color) { + ctx.beginPath(); + ctx.setStrokeStyle(color); + ctx.setFillStyle(color); + ctx.setLineWidth(1); + ctx.fillRect(x1, y1, Math.max(x2 - x1, 0), y2 - y1); + } + ctx.save(); + ctx.setFont(Font.SANS_SERIF, 8); + contextGaps.gaps.forEach((gap) => { + stroke(x + gap.x1, x + gap.x2, 'rgba(100,200,100,0.4)'); + ctx.setFillStyle('green'); + ctx.fillText(Math.round(gap.x2 - gap.x1).toString(), x + gap.x1, y2 + 12); + }); + ctx.setFillStyle('red'); + ctx.fillText(`Loss: ${(formatter.totalCost || 0).toFixed(2)} Shift: ${(formatter.totalShift || 0).toFixed(2)} Gap: ${contextGaps.total.toFixed(2)}`, x - 20, y2 + 27); + ctx.restore(); + } + static FormatAndDraw(ctx, stave, notes, params) { + let options = { + auto_beam: false, + align_rests: false, + }; + if (typeof params === 'object') { + options = Object.assign(Object.assign({}, options), params); + } + else if (typeof params === 'boolean') { + options.auto_beam = params; + } + const voice = new Voice(Tables.TIME4_4).setMode(Voice.Mode.SOFT).addTickables(notes); + const beams = options.auto_beam ? Beam.applyAndGetBeams(voice) : []; + new Formatter() + .joinVoices([voice]) + .formatToStave([voice], stave, { align_rests: options.align_rests, stave }); + voice.setStave(stave).draw(ctx, stave); + beams.forEach((beam) => beam.setContext(ctx).draw()); + return voice.getBoundingBox(); + } + static FormatAndDrawTab(ctx, tabstave, stave, tabnotes, notes, autobeam, params) { + let opts = { + auto_beam: autobeam, + align_rests: false, + }; + if (typeof params === 'object') { + opts = Object.assign(Object.assign({}, opts), params); + } + else if (typeof params === 'boolean') { + opts.auto_beam = params; + } + const notevoice = new Voice(Tables.TIME4_4).setMode(Voice.Mode.SOFT).addTickables(notes); + const tabvoice = new Voice(Tables.TIME4_4).setMode(Voice.Mode.SOFT).addTickables(tabnotes); + const beams = opts.auto_beam ? Beam.applyAndGetBeams(notevoice) : []; + new Formatter() + .joinVoices([notevoice]) + .joinVoices([tabvoice]) + .formatToStave([notevoice, tabvoice], stave, { align_rests: opts.align_rests }); + notevoice.draw(ctx, stave); + tabvoice.draw(ctx, tabstave); + beams.forEach((beam) => beam.setContext(ctx).draw()); + new StaveConnector(stave, tabstave).setContext(ctx).draw(); + } + static AlignRestsToNotes(tickables, alignAllNotes, alignTuplets) { + tickables.forEach((currTickable, index) => { + if (isStaveNote(currTickable) && currTickable.isRest()) { + if (currTickable.getTuplet() && !alignTuplets) { + return; + } + const position = currTickable.getGlyph().position.toUpperCase(); + if (position !== 'R/4' && position !== 'B/4') { + return; + } + if (alignAllNotes || currTickable.getBeam()) { + const props = currTickable.getKeyProps()[0]; + if (index === 0) { + props.line = getRestLineForNextNoteGroup(tickables, props.line, index, false); + } + else if (index > 0 && index < tickables.length) { + const prevTickable = tickables[index - 1]; + if (isStaveNote(prevTickable)) { + if (prevTickable.isRest()) { + props.line = prevTickable.getKeyProps()[0].line; + } + else { + const restLine = prevTickable.getLineForRest(); + props.line = getRestLineForNextNoteGroup(tickables, restLine, index, true); + } + } + } + currTickable.setKeyLine(0, props.line); + } + } + }); + } + alignRests(voices, alignAllNotes) { + if (!voices || !voices.length) { + throw new RuntimeError('BadArgument', 'No voices to format rests'); + } + voices.forEach((voice) => Formatter.AlignRestsToNotes(voice.getTickables(), alignAllNotes)); + } + preCalculateMinTotalWidth(voices) { + const unalignedPadding = Tables.currentMusicFont().lookupMetric('stave.unalignedNotePadding'); + let unalignedCtxCount = 0; + let wsum = 0; + let dsum = 0; + const widths = []; + const durations = []; + if (this.hasMinTotalWidth) + return this.minTotalWidth; + if (!this.tickContexts) { + if (!voices) { + throw new RuntimeError('BadArgument', "'voices' required to run preCalculateMinTotalWidth"); + } + this.createTickContexts(voices); + } + const { list: contextList, map: contextMap } = this.tickContexts; + this.minTotalWidth = 0; + contextList.forEach((tick) => { + const context = contextMap[tick]; + context.preFormat(); + if (context.getTickables().length < voices.length) { + unalignedCtxCount += 1; + } + context.getTickables().forEach((t) => { + wsum += t.getMetrics().width; + dsum += t.getTicks().value(); + widths.push(t.getMetrics().width); + durations.push(t.getTicks().value()); + }); + const width = context.getWidth(); + this.minTotalWidth += width; + }); + this.hasMinTotalWidth = true; + const wavg = wsum > 0 ? wsum / widths.length : 1 / widths.length; + const wvar = sumArray(widths.map((ll) => Math.pow(ll - wavg, 2))); + const wpads = Math.pow(wvar / widths.length, 0.5) / wavg; + const davg = dsum / durations.length; + const dvar = sumArray(durations.map((ll) => Math.pow(ll - davg, 2))); + const dpads = Math.pow(dvar / durations.length, 0.5) / davg; + const padmax = Math.max(dpads, wpads) * contextList.length * unalignedPadding; + const unalignedPad = unalignedPadding * unalignedCtxCount; + return this.minTotalWidth + Math.max(unalignedPad, padmax); + } + getMinTotalWidth() { + if (!this.hasMinTotalWidth) { + throw new RuntimeError('NoMinTotalWidth', "Call 'preCalculateMinTotalWidth' or 'preFormat' before calling 'getMinTotalWidth'"); + } + return this.minTotalWidth; + } + static getResolutionMultiplier(voices) { + if (!voices || !voices.length) { + throw new RuntimeError('BadArgument', 'No voices to format'); + } + const totalTicks = voices[0].getTotalTicks(); + const resolutionMultiplier = voices.reduce((accumulator, voice) => { + if (!voice.getTotalTicks().equals(totalTicks)) { + throw new RuntimeError('TickMismatch', 'Voices should have same total note duration in ticks.'); + } + if (voice.getMode() === Voice.Mode.STRICT && !voice.isComplete()) { + throw new RuntimeError('IncompleteVoice', 'Voice does not have enough notes.'); + } + return Math.max(accumulator, Fraction.LCM(accumulator, voice.getResolutionMultiplier())); + }, 1); + return resolutionMultiplier; + } + createModifierContexts(voices) { + const fn = (tickable, context) => tickable.addToModifierContext(context); + const contexts = createContexts(voices, () => new ModifierContext(), fn); + this.modifierContexts = contexts; + return contexts; + } + createTickContexts(voices) { + const fn = (tickable, context, voiceIndex) => context.addTickable(tickable, voiceIndex); + const contexts = createContexts(voices, (tick) => new TickContext(tick), fn); + this.tickContexts = contexts; + const contextArray = this.tickContexts.array; + contextArray.forEach((context) => { + context.tContexts = contextArray; + }); + return contexts; + } + preFormat(justifyWidth = 0, renderingContext, voicesParam, stave) { + const contexts = this.tickContexts; + if (!contexts) { + throw new RuntimeError('NoTickContexts', 'preFormat requires TickContexts'); + } + const { list: contextList, map: contextMap } = contexts; + this.lossHistory = []; + if (voicesParam && stave) { + voicesParam.forEach((voice) => voice.setStave(stave).preFormat()); + } + let x = 0; + let shift = 0; + this.minTotalWidth = 0; + let totalTicks = 0; + contextList.forEach((tick) => { + const context = contextMap[tick]; + context.preFormat(); + const width = context.getWidth(); + this.minTotalWidth += width; + const maxTicks = context.getMaxTicks().value(); + totalTicks += maxTicks; + const metrics = context.getMetrics(); + x = x + shift + metrics.totalLeftPx; + context.setX(x); + shift = width - metrics.totalLeftPx; + }); + const { globalSoftmax, softmaxFactor, maxIterations } = this.formatterOptions; + const exp = (tick) => Math.pow(softmaxFactor, (contextMap[tick].getMaxTicks().value() / totalTicks)); + const expTicksUsed = sumArray(contextList.map(exp)); + this.minTotalWidth = x + shift; + this.hasMinTotalWidth = true; + if (justifyWidth <= 0) + return this.evaluate(); + const firstContext = contextMap[contextList[0]]; + const lastContext = contextMap[contextList[contextList.length - 1]]; + function calculateIdealDistances(adjustedJustifyWidth) { + const distances = contextList.map((tick, i) => { + const context = contextMap[tick]; + const voices = context.getTickablesByVoice(); + let backTickable; + if (i > 0) { + const prevContext = contextMap[contextList[i - 1]]; + for (let j = i - 1; j >= 0; j--) { + const backTick = contextMap[contextList[j]]; + const backVoices = backTick.getTickablesByVoice(); + const matchingVoices = []; + Object.keys(voices).forEach((v) => { + if (backVoices[v]) { + matchingVoices.push(v); + } + }); + if (matchingVoices.length > 0) { + let maxTicks = 0; + let maxNegativeShiftPx = Infinity; + let expectedDistance = 0; + matchingVoices.forEach((v) => { + const ticks = backVoices[v].getTicks().value(); + if (ticks > maxTicks) { + backTickable = backVoices[v]; + maxTicks = ticks; + } + const thisTickable = voices[v]; + const insideLeftEdge = thisTickable.getX() - + (thisTickable.getMetrics().modLeftPx + thisTickable.getMetrics().leftDisplacedHeadPx); + const backMetrics = backVoices[v].getMetrics(); + const insideRightEdge = backVoices[v].getX() + backMetrics.notePx + backMetrics.modRightPx + backMetrics.rightDisplacedHeadPx; + maxNegativeShiftPx = Math.min(maxNegativeShiftPx, insideLeftEdge - insideRightEdge); + }); + maxNegativeShiftPx = Math.min(maxNegativeShiftPx, context.getX() - (prevContext.getX() + adjustedJustifyWidth * 0.05)); + if (globalSoftmax) { + const t = totalTicks; + expectedDistance = (Math.pow(softmaxFactor, (maxTicks / t)) / expTicksUsed) * adjustedJustifyWidth; + } + else if (typeof backTickable !== 'undefined') { + expectedDistance = backTickable.getVoice().softmax(maxTicks) * adjustedJustifyWidth; + } + return { + expectedDistance, + maxNegativeShiftPx, + fromTickable: backTickable, + }; + } + } + } + return { expectedDistance: 0, fromTickablePx: 0, maxNegativeShiftPx: 0 }; + }); + return distances; + } + function shiftToIdealDistances(idealDistances) { + const centerX = adjustedJustifyWidth / 2; + let spaceAccum = 0; + contextList.forEach((tick, index) => { + const context = contextMap[tick]; + if (index > 0) { + const contextX = context.getX(); + const ideal = idealDistances[index]; + const errorPx = defined(ideal.fromTickable).getX() + ideal.expectedDistance - (contextX + spaceAccum); + let negativeShiftPx = 0; + if (errorPx > 0) { + spaceAccum += errorPx; + } + else if (errorPx < 0) { + negativeShiftPx = Math.min(ideal.maxNegativeShiftPx, Math.abs(errorPx)); + spaceAccum += -negativeShiftPx; + } + context.setX(contextX + spaceAccum); + } + context.getCenterAlignedTickables().forEach((tickable) => { + tickable.setCenterXShift(centerX - context.getX()); + }); + }); + return lastContext.getX() - firstContext.getX(); + } + const adjustedJustifyWidth = justifyWidth - + lastContext.getMetrics().notePx - + lastContext.getMetrics().totalRightPx - + firstContext.getMetrics().totalLeftPx; + const musicFont = Tables.currentMusicFont(); + const configMinPadding = musicFont.lookupMetric('stave.endPaddingMin'); + const configMaxPadding = musicFont.lookupMetric('stave.endPaddingMax'); + let targetWidth = adjustedJustifyWidth; + const distances = calculateIdealDistances(targetWidth); + let actualWidth = shiftToIdealDistances(distances); + const calcMinDistance = (targetWidth, distances) => { + let mdCalc = targetWidth / 2; + if (distances.length > 1) { + for (let di = 1; di < distances.length; ++di) { + mdCalc = Math.min(distances[di].expectedDistance / 2, mdCalc); + } + } + return mdCalc; + }; + const minDistance = calcMinDistance(targetWidth, distances); + if (contextList.length === 1) + return 0; + const paddingMax = configMaxPadding * 2 < minDistance ? minDistance : configMaxPadding; + const paddingMin = paddingMax - (configMaxPadding - configMinPadding); + const maxX = adjustedJustifyWidth - paddingMin; + let iterations = maxIterations; + while ((actualWidth > maxX && iterations > 0) || (actualWidth + paddingMax < maxX && iterations > 1)) { + targetWidth -= actualWidth - maxX; + actualWidth = shiftToIdealDistances(calculateIdealDistances(targetWidth)); + iterations--; + } + this.justifyWidth = justifyWidth; + return this.evaluate(); + } + evaluate() { + if (!this.tickContexts) + return 0; + const contexts = this.tickContexts; + const justifyWidth = this.justifyWidth; + this.contextGaps = { total: 0, gaps: [] }; + contexts.list.forEach((tick, index) => { + if (index === 0) + return; + const prevTick = contexts.list[index - 1]; + const prevContext = contexts.map[prevTick]; + const context = contexts.map[tick]; + const prevMetrics = prevContext.getMetrics(); + const currMetrics = context.getMetrics(); + const insideRightEdge = prevContext.getX() + prevMetrics.notePx + prevMetrics.totalRightPx; + const insideLeftEdge = context.getX() - currMetrics.totalLeftPx; + const gap = insideLeftEdge - insideRightEdge; + this.contextGaps.total += gap; + this.contextGaps.gaps.push({ x1: insideRightEdge, x2: insideLeftEdge }); + context.getFormatterMetrics().freedom.left = gap; + prevContext.getFormatterMetrics().freedom.right = gap; + }); + this.durationStats = {}; + const durationStats = this.durationStats; + function updateStats(duration, space) { + const stats = durationStats[duration]; + if (stats === undefined) { + durationStats[duration] = { mean: space, count: 1 }; + } + else { + stats.count += 1; + stats.mean = (stats.mean + space) / 2; + } + } + this.voices.forEach((voice) => { + voice.getTickables().forEach((note, i, notes) => { + const duration = note.getTicks().clone().simplify().toString(); + const metrics = note.getMetrics(); + const formatterMetrics = note.getFormatterMetrics(); + const leftNoteEdge = note.getX() + metrics.notePx + metrics.modRightPx + metrics.rightDisplacedHeadPx; + let space = 0; + if (i < notes.length - 1) { + const rightNote = notes[i + 1]; + const rightMetrics = rightNote.getMetrics(); + const rightNoteEdge = rightNote.getX() - rightMetrics.modLeftPx - rightMetrics.leftDisplacedHeadPx; + space = rightNoteEdge - leftNoteEdge; + formatterMetrics.space.used = rightNote.getX() - note.getX(); + rightNote.getFormatterMetrics().freedom.left = space; + } + else { + space = justifyWidth - leftNoteEdge; + formatterMetrics.space.used = justifyWidth - note.getX(); + } + formatterMetrics.freedom.right = space; + updateStats(duration, formatterMetrics.space.used); + }); + }); + let totalDeviation = 0; + this.voices.forEach((voice) => { + voice.getTickables().forEach((note) => { + const duration = note.getTicks().clone().simplify().toString(); + const metrics = note.getFormatterMetrics(); + metrics.space.mean = durationStats[duration].mean; + metrics.duration = duration; + metrics.iterations += 1; + metrics.space.deviation = metrics.space.used - metrics.space.mean; + totalDeviation += Math.pow(metrics.space.deviation, 2); + }); + }); + this.totalCost = Math.sqrt(totalDeviation); + this.lossHistory.push(this.totalCost); + return this.totalCost; + } + tune(options) { + var _a; + const contexts = this.tickContexts; + if (!contexts) { + return 0; + } + const alpha = (_a = options === null || options === void 0 ? void 0 : options.alpha) !== null && _a !== void 0 ? _a : 0.5; + function move(current, shift, prev, next) { + current.setX(current.getX() + shift); + current.getFormatterMetrics().freedom.left += shift; + current.getFormatterMetrics().freedom.right -= shift; + if (prev) + prev.getFormatterMetrics().freedom.right += shift; + if (next) + next.getFormatterMetrics().freedom.left -= shift; + } + let shift = 0; + this.totalShift = 0; + contexts.list.forEach((tick, index, list) => { + const context = contexts.map[tick]; + const prevContext = index > 0 ? contexts.map[list[index - 1]] : undefined; + const nextContext = index < list.length - 1 ? contexts.map[list[index + 1]] : undefined; + move(context, shift, prevContext, nextContext); + const cost = -sumArray(context.getTickables().map((t) => t.getFormatterMetrics().space.deviation)); + if (cost > 0) { + shift = -Math.min(context.getFormatterMetrics().freedom.right, Math.abs(cost)); + } + else if (cost < 0) { + if (nextContext) { + shift = Math.min(nextContext.getFormatterMetrics().freedom.right, Math.abs(cost)); + } + else { + shift = 0; + } + } + shift *= alpha; + this.totalShift += shift; + }); + return this.evaluate(); + } + postFormat() { + const postFormatContexts = (contexts) => contexts.list.forEach((tick) => contexts.map[tick].postFormat()); + if (this.modifierContexts) + postFormatContexts(this.modifierContexts); + if (this.tickContexts) + postFormatContexts(this.tickContexts); + return this; + } + joinVoices(voices) { + this.createModifierContexts(voices); + this.hasMinTotalWidth = false; + return this; + } + format(voices, justifyWidth, options) { + const opts = Object.assign({ align_rests: false }, options); + this.voices = voices; + const softmaxFactor = this.formatterOptions.softmaxFactor; + if (softmaxFactor) { + this.voices.forEach((v) => v.setSoftmaxFactor(softmaxFactor)); + } + this.alignRests(voices, opts.align_rests); + this.createTickContexts(voices); + this.preFormat(justifyWidth, opts.context, voices, opts.stave); + if (opts.stave) + this.postFormat(); + return this; + } + formatToStave(voices, stave, optionsParam) { + const options = Object.assign({ context: stave.getContext() }, optionsParam); + const justifyWidth = stave.getNoteEndX() - stave.getNoteStartX() - Stave.defaultPadding; + L('Formatting voices to width: ', justifyWidth); + return this.format(voices, justifyWidth, options); + } + getTickContext(tick) { + var _a; + return (_a = this.tickContexts) === null || _a === void 0 ? void 0 : _a.map[tick]; + } +} +Formatter.DEBUG = false; diff --git a/build/esm/src/fraction.js b/build/esm/src/fraction.js new file mode 100644 index 0000000000..d87c70825c --- /dev/null +++ b/build/esm/src/fraction.js @@ -0,0 +1,171 @@ +import { RuntimeError } from './util.js'; +export class Fraction { + constructor(numerator, denominator) { + this.numerator = 1; + this.denominator = 1; + this.set(numerator, denominator); + } + static get CATEGORY() { + return "Fraction"; + } + static GCD(a, b) { + if (typeof a !== 'number' || Number.isNaN(a) || typeof b !== 'number' || Number.isNaN(b)) { + throw new RuntimeError('BadArgument', `Invalid numbers: ${a}, ${b}`); + } + let t; + while (b !== 0) { + t = b; + b = a % b; + a = t; + } + return a; + } + static LCM(a, b) { + return (a * b) / Fraction.GCD(a, b); + } + static LCMM(args) { + if (args.length === 0) { + return 0; + } + else if (args.length === 1) { + return args[0]; + } + else if (args.length === 2) { + return Fraction.LCM(args[0], args[1]); + } + else { + return Fraction.LCM(args.shift(), Fraction.LCMM(args)); + } + } + set(numerator = 1, denominator = 1) { + this.numerator = numerator; + this.denominator = denominator; + return this; + } + value() { + return this.numerator / this.denominator; + } + simplify() { + let u = this.numerator; + let d = this.denominator; + const gcd = Fraction.GCD(u, d); + u /= gcd; + d /= gcd; + if (d < 0) { + d = -d; + u = -u; + } + return this.set(u, d); + } + add(param1 = 0, param2 = 1) { + const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2); + const lcm = Fraction.LCM(this.denominator, otherDenominator); + const a = lcm / this.denominator; + const b = lcm / otherDenominator; + const u = this.numerator * a + otherNumerator * b; + return this.set(u, lcm); + } + subtract(param1 = 0, param2 = 1) { + const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2); + const lcm = Fraction.LCM(this.denominator, otherDenominator); + const a = lcm / this.denominator; + const b = lcm / otherDenominator; + const u = this.numerator * a - otherNumerator * b; + return this.set(u, lcm); + } + multiply(param1 = 1, param2 = 1) { + const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2); + return this.set(this.numerator * otherNumerator, this.denominator * otherDenominator); + } + divide(param1 = 1, param2 = 1) { + const [otherNumerator, otherDenominator] = getNumeratorAndDenominator(param1, param2); + return this.set(this.numerator * otherDenominator, this.denominator * otherNumerator); + } + equals(compare) { + const a = Fraction.__staticFractionA.copy(compare).simplify(); + const b = Fraction.__staticFractionB.copy(this).simplify(); + return a.numerator === b.numerator && a.denominator === b.denominator; + } + greaterThan(compare) { + const a = Fraction.__staticFractionB.copy(this); + a.subtract(compare); + return a.numerator > 0; + } + greaterThanEquals(compare) { + const a = Fraction.__staticFractionB.copy(this); + a.subtract(compare); + return a.numerator >= 0; + } + lessThan(compare) { + return !this.greaterThanEquals(compare); + } + lessThanEquals(compare) { + return !this.greaterThan(compare); + } + clone() { + return new Fraction(this.numerator, this.denominator); + } + copy(other) { + if (typeof other === 'number') { + return this.set(other, 1); + } + else { + return this.set(other.numerator, other.denominator); + } + } + quotient() { + return Math.floor(this.numerator / this.denominator); + } + remainder() { + return this.numerator % this.denominator; + } + makeAbs() { + this.denominator = Math.abs(this.denominator); + this.numerator = Math.abs(this.numerator); + return this; + } + toString() { + return `${this.numerator}/${this.denominator}`; + } + toSimplifiedString() { + return Fraction.__staticFractionTmp.copy(this).simplify().toString(); + } + toMixedString() { + let s = ''; + const q = this.quotient(); + const f = Fraction.__staticFractionTmp.copy(this); + if (q < 0) { + f.makeAbs(); + } + if (q !== 0) { + s += q; + if (f.numerator !== 0) { + s += ` ${f.toSimplifiedString()}`; + } + } + else if (f.numerator === 0) { + s = '0'; + } + else { + s = f.toSimplifiedString(); + } + return s; + } + parse(str) { + const i = str.split('/'); + const n = parseInt(i[0], 10); + const d = i[1] ? parseInt(i[1], 10) : 1; + return this.set(n, d); + } +} +Fraction.__staticFractionA = new Fraction(); +Fraction.__staticFractionB = new Fraction(); +Fraction.__staticFractionTmp = new Fraction(); +function getNumeratorAndDenominator(n, d = 1) { + if (typeof n === 'number') { + return [n, d]; + } + else { + return [n.numerator, n.denominator]; + } +} diff --git a/build/esm/src/frethandfinger.js b/build/esm/src/frethandfinger.js new file mode 100644 index 0000000000..e2c1e8badc --- /dev/null +++ b/build/esm/src/frethandfinger.js @@ -0,0 +1,156 @@ +import { Font, FontStyle, FontWeight } from './font.js'; +import { Modifier, ModifierPosition } from './modifier.js'; +import { Tables } from './tables.js'; +import { TextFormatter } from './textformatter.js'; +import { RuntimeError } from './util.js'; +export class FretHandFinger extends Modifier { + constructor(finger) { + super(); + this.finger = finger; + this.width = 7; + this.position = Modifier.Position.LEFT; + this.x_shift = 0; + this.y_shift = 0; + this.x_offset = 0; + this.y_offset = 0; + this.resetFont(); + } + static get CATEGORY() { + return "FretHandFinger"; + } + static format(nums, state) { + const { left_shift, right_shift } = state; + const num_spacing = 1; + if (!nums || nums.length === 0) + return false; + const nums_list = []; + let prev_note = null; + let shiftLeft = 0; + let shiftRight = 0; + for (let i = 0; i < nums.length; ++i) { + const num = nums[i]; + const note = num.getNote(); + const pos = num.getPosition(); + const index = num.checkIndex(); + const props = note.getKeyProps()[index]; + const textFormatter = TextFormatter.create(num.textFont); + const textHeight = textFormatter.maxHeight; + if (num.position === ModifierPosition.ABOVE) { + state.top_text_line += textHeight / Tables.STAVE_LINE_DISTANCE + 0.5; + } + if (num.position === ModifierPosition.BELOW) { + state.text_line += textHeight / Tables.STAVE_LINE_DISTANCE + 0.5; + } + if (note !== prev_note) { + for (let n = 0; n < note.keys.length; ++n) { + if (left_shift === 0) { + shiftLeft = Math.max(note.getLeftDisplacedHeadPx(), shiftLeft); + } + if (right_shift === 0) { + shiftRight = Math.max(note.getRightDisplacedHeadPx(), shiftRight); + } + } + prev_note = note; + } + nums_list.push({ + note, + num, + pos, + line: props.line, + shiftL: shiftLeft, + shiftR: shiftRight, + }); + } + nums_list.sort((a, b) => b.line - a.line); + let numShiftL = 0; + let numShiftR = 0; + let xWidthL = 0; + let xWidthR = 0; + let lastLine = null; + let lastNote = null; + for (let i = 0; i < nums_list.length; ++i) { + let num_shift = 0; + const { note, pos, num, line, shiftL, shiftR } = nums_list[i]; + if (line !== lastLine || note !== lastNote) { + numShiftL = left_shift + shiftL; + numShiftR = right_shift + shiftR; + } + const numWidth = num.getWidth() + num_spacing; + if (pos === Modifier.Position.LEFT) { + num.setXShift(left_shift + numShiftL); + num_shift = left_shift + numWidth; + xWidthL = num_shift > xWidthL ? num_shift : xWidthL; + } + else if (pos === Modifier.Position.RIGHT) { + num.setXShift(numShiftR); + num_shift = shiftRight + numWidth; + xWidthR = num_shift > xWidthR ? num_shift : xWidthR; + } + lastLine = line; + lastNote = note; + } + state.left_shift += xWidthL; + state.right_shift += xWidthR; + return true; + } + static easyScoreHook({ fingerings } = {}, note, builder) { + fingerings === null || fingerings === void 0 ? void 0 : fingerings.split(',').map((fingeringString) => { + const split = fingeringString.trim().split('.'); + const params = { number: split[0] }; + if (split[1]) + params.position = split[1]; + return builder.getFactory().Fingering(params); + }).map((fingering, index) => note.addModifier(fingering, index)); + } + setFretHandFinger(finger) { + this.finger = finger; + return this; + } + getFretHandFinger() { + return this.finger; + } + setOffsetX(x) { + this.x_offset = x; + return this; + } + setOffsetY(y) { + this.y_offset = y; + return this; + } + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const start = note.getModifierStartXY(this.position, this.index); + let dot_x = start.x + this.x_shift + this.x_offset; + let dot_y = start.y + this.y_shift + this.y_offset + 5; + switch (this.position) { + case Modifier.Position.ABOVE: + dot_x -= 4; + dot_y -= 12; + break; + case Modifier.Position.BELOW: + dot_x -= 2; + dot_y += 10; + break; + case Modifier.Position.LEFT: + dot_x -= this.width; + break; + case Modifier.Position.RIGHT: + dot_x += 1; + break; + default: + throw new RuntimeError('InvalidPosition', `The position ${this.position} does not exist`); + } + ctx.save(); + ctx.setFont(this.textFont); + ctx.fillText('' + this.finger, dot_x, dot_y); + ctx.restore(); + } +} +FretHandFinger.TEXT_FONT = { + family: Font.SANS_SERIF, + size: 9, + weight: FontWeight.BOLD, + style: FontStyle.NORMAL, +}; diff --git a/build/esm/src/ghostnote.js b/build/esm/src/ghostnote.js new file mode 100644 index 0000000000..02b3f05342 --- /dev/null +++ b/build/esm/src/ghostnote.js @@ -0,0 +1,50 @@ +import { StemmableNote } from './stemmablenote.js'; +import { isAnnotation } from './typeguard.js'; +import { RuntimeError } from './util.js'; +const ERROR_MSG = 'Ghost note must have valid initialization data to identify duration.'; +export class GhostNote extends StemmableNote { + static get CATEGORY() { + return "GhostNote"; + } + constructor(parameter) { + if (!parameter) { + throw new RuntimeError('BadArguments', ERROR_MSG); + } + let noteStruct; + if (typeof parameter === 'string') { + noteStruct = { duration: parameter }; + } + else if (typeof parameter === 'object') { + noteStruct = parameter; + } + else { + throw new RuntimeError('BadArguments', ERROR_MSG); + } + super(noteStruct); + this.setWidth(0); + } + isRest() { + return true; + } + setStave(stave) { + super.setStave(stave); + return this; + } + addToModifierContext(mc) { + return this; + } + preFormat() { + this.preFormatted = true; + return this; + } + draw() { + this.setRendered(); + for (let i = 0; i < this.modifiers.length; ++i) { + const modifier = this.modifiers[i]; + if (isAnnotation(modifier)) { + modifier.setContext(this.getContext()); + modifier.drawWithStyle(); + } + } + } +} diff --git a/build/esm/src/glyph.js b/build/esm/src/glyph.js new file mode 100644 index 0000000000..a3ecce3f8e --- /dev/null +++ b/build/esm/src/glyph.js @@ -0,0 +1,331 @@ +import { BoundingBox } from './boundingbox.js'; +import { BoundingBoxComputation } from './boundingboxcomputation.js'; +import { Element } from './element.js'; +import { defined, RuntimeError } from './util.js'; +class GlyphCacheEntry { + constructor(fontStack, code, category) { + this.point = -1; + this.metrics = Glyph.loadMetrics(fontStack, code, category); + this.bbox = Glyph.getOutlineBoundingBox(this.metrics.outline, this.metrics.scale, this.metrics.x_shift, this.metrics.y_shift); + if (category) { + this.point = Glyph.lookupFontMetric(this.metrics.font, category, code, 'point', -1); + } + } +} +class GlyphCache { + constructor() { + this.cache = new Map(); + } + lookup(code, category) { + let entries = this.cache.get(Glyph.CURRENT_CACHE_KEY); + if (entries === undefined) { + entries = {}; + this.cache.set(Glyph.CURRENT_CACHE_KEY, entries); + } + const key = category ? `${code}%${category}` : code; + let entry = entries[key]; + if (entry === undefined) { + entry = new GlyphCacheEntry(Glyph.MUSIC_FONT_STACK, code, category); + entries[key] = entry; + } + return entry; + } +} +class GlyphOutline { + constructor(outline, originX, originY, scale) { + this.outline = outline; + this.originX = originX; + this.originY = originY; + this.scale = scale; + this.i = 0; + } + done() { + return this.i >= this.outline.length; + } + next() { + return this.outline[this.i++]; + } + nextX() { + return this.originX + this.outline[this.i++] * this.scale; + } + nextY() { + return this.originY - this.outline[this.i++] * this.scale; + } + static parse(str) { + const result = []; + const parts = str.split(' '); + let i = 0; + while (i < parts.length) { + switch (parts[i++]) { + case 'm': + result.push(0, parseInt(parts[i++]), parseInt(parts[i++])); + break; + case 'l': + result.push(1, parseInt(parts[i++]), parseInt(parts[i++])); + break; + case 'q': + result.push(2, parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++])); + break; + case 'b': + result.push(3, parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++]), parseInt(parts[i++])); + break; + } + } + return result; + } +} +export class Glyph extends Element { + constructor(code, point, options) { + super(); + this.bbox = new BoundingBox(0, 0, 0, 0); + this.topGlyphs = []; + this.botGlyphs = []; + this.options = {}; + this.scale = 1; + this.code = code; + this.point = point; + this.originShift = { x: 0, y: 0 }; + this.x_shift = 0; + this.y_shift = 0; + if (options) { + this.setOptions(options); + } + else { + this.reset(); + } + } + static get CATEGORY() { + return "Glyph"; + } + static lookupFontMetric(font, category, code, key, defaultValue) { + let value = font.lookupMetric(`glyphs.${category}.${code}.${key}`, undefined); + if (value === undefined) { + value = font.lookupMetric(`glyphs.${category}.${key}`, defaultValue); + } + return value; + } + static lookupGlyph(fontStack, code) { + defined(fontStack, 'BadFontStack', 'Font stack is misconfigured'); + let glyph; + let font; + for (let i = 0; i < fontStack.length; i++) { + font = fontStack[i]; + glyph = font.getGlyphs()[code]; + if (glyph) + return { glyph, font }; + } + throw new RuntimeError('BadGlyph', `Glyph ${code} does not exist in font.`); + } + static loadMetrics(fontStack, code, category) { + const { glyph, font } = Glyph.lookupGlyph(fontStack, code); + if (!glyph.o) + throw new RuntimeError('BadGlyph', `Glyph ${code} has no outline defined.`); + let x_shift = 0; + let y_shift = 0; + let scale = 1; + if (category && font) { + x_shift = Glyph.lookupFontMetric(font, category, code, 'shiftX', 0); + y_shift = Glyph.lookupFontMetric(font, category, code, 'shiftY', 0); + scale = Glyph.lookupFontMetric(font, category, code, 'scale', 1); + } + const x_min = glyph.x_min; + const x_max = glyph.x_max; + const ha = glyph.ha; + if (!glyph.cached_outline) { + glyph.cached_outline = GlyphOutline.parse(glyph.o); + } + return { + x_min, + x_max, + x_shift, + y_shift, + scale, + ha, + outline: glyph.cached_outline, + font, + width: x_max - x_min, + height: ha, + }; + } + static renderGlyph(ctx, x_pos, y_pos, point, code, options) { + var _a; + const data = Glyph.cache.lookup(code, options === null || options === void 0 ? void 0 : options.category); + const metrics = data.metrics; + if (data.point != -1) { + point = data.point; + } + const customScale = (_a = options === null || options === void 0 ? void 0 : options.scale) !== null && _a !== void 0 ? _a : 1; + const scale = ((point * 72.0) / (metrics.font.getResolution() * 100.0)) * metrics.scale * customScale; + Glyph.renderOutline(ctx, metrics.outline, scale, x_pos + metrics.x_shift * customScale, y_pos + metrics.y_shift * customScale); + return metrics; + } + static renderOutline(ctx, outline, scale, x_pos, y_pos) { + const go = new GlyphOutline(outline, x_pos, y_pos, scale); + ctx.beginPath(); + let x, y; + while (!go.done()) { + switch (go.next()) { + case 0: + ctx.moveTo(go.nextX(), go.nextY()); + break; + case 1: + ctx.lineTo(go.nextX(), go.nextY()); + break; + case 2: + x = go.nextX(); + y = go.nextY(); + ctx.quadraticCurveTo(go.nextX(), go.nextY(), x, y); + break; + case 3: + x = go.nextX(); + y = go.nextY(); + ctx.bezierCurveTo(go.nextX(), go.nextY(), go.nextX(), go.nextY(), x, y); + break; + } + } + ctx.fill(); + } + static getOutlineBoundingBox(outline, scale, x_pos, y_pos) { + const go = new GlyphOutline(outline, x_pos, y_pos, scale); + const bboxComp = new BoundingBoxComputation(); + let penX = x_pos; + let penY = y_pos; + let x, y; + while (!go.done()) { + switch (go.next()) { + case 0: + penX = go.nextX(); + penY = go.nextY(); + break; + case 1: + bboxComp.addPoint(penX, penY); + penX = go.nextX(); + penY = go.nextY(); + bboxComp.addPoint(penX, penY); + break; + case 2: + x = go.nextX(); + y = go.nextY(); + bboxComp.addQuadraticCurve(penX, penY, go.nextX(), go.nextY(), x, y); + penX = x; + penY = y; + break; + case 3: + x = go.nextX(); + y = go.nextY(); + bboxComp.addBezierCurve(penX, penY, go.nextX(), go.nextY(), go.nextX(), go.nextY(), x, y); + penX = x; + penY = y; + break; + } + } + return new BoundingBox(bboxComp.getX1(), bboxComp.getY1(), bboxComp.width(), bboxComp.height()); + } + static getWidth(code, point, category) { + const data = Glyph.cache.lookup(code, category); + if (data.point != -1) { + point = data.point; + } + const scale = (point * 72) / (data.metrics.font.getResolution() * 100); + return data.bbox.getW() * scale; + } + draw(...args) { + } + getCode() { + return this.code; + } + setOptions(options) { + this.options = Object.assign(Object.assign({}, this.options), options); + this.reset(); + } + setPoint(point) { + this.point = point; + return this; + } + setStave(stave) { + this.stave = stave; + return this; + } + setXShift(x_shift) { + this.x_shift = x_shift; + return this; + } + setYShift(y_shift) { + this.y_shift = y_shift; + return this; + } + reset() { + const data = Glyph.cache.lookup(this.code, this.options.category); + this.metrics = data.metrics; + if (data.point != -1) { + this.point = data.point; + } + this.scale = (this.point * 72) / (this.metrics.font.getResolution() * 100); + this.bbox = new BoundingBox(data.bbox.getX() * this.scale, data.bbox.getY() * this.scale, data.bbox.getW() * this.scale, data.bbox.getH() * this.scale); + } + checkMetrics() { + return defined(this.metrics, 'BadGlyph', `Glyph ${this.code} is not initialized.`); + } + getMetrics() { + const metrics = this.checkMetrics(); + const metricsScale = metrics.scale; + return { + x_min: metrics.x_min * this.scale * metricsScale, + x_max: metrics.x_max * this.scale * metricsScale, + width: this.bbox.getW(), + height: this.bbox.getH(), + scale: this.scale * metricsScale, + x_shift: metrics.x_shift, + y_shift: metrics.y_shift, + outline: metrics.outline, + font: metrics.font, + ha: metrics.ha, + }; + } + setOriginX(x) { + const { bbox } = this; + const originX = Math.abs(bbox.getX() / bbox.getW()); + const xShift = (x - originX) * bbox.getW(); + this.originShift.x = -xShift; + } + setOriginY(y) { + const { bbox } = this; + const originY = Math.abs(bbox.getY() / bbox.getH()); + const yShift = (y - originY) * bbox.getH(); + this.originShift.y = -yShift; + } + setOrigin(x, y) { + this.setOriginX(x); + this.setOriginY(y); + } + render(ctx, x, y) { + const metrics = this.checkMetrics(); + const outline = metrics.outline; + const scale = this.scale * metrics.scale; + this.setRendered(); + this.applyStyle(ctx); + const xPos = x + this.originShift.x + metrics.x_shift; + const yPos = y + this.originShift.y + metrics.y_shift; + Glyph.renderOutline(ctx, outline, scale, xPos, yPos); + this.restoreStyle(ctx); + } + checkStave() { + return defined(this.stave, 'NoStave', 'No stave attached to instance.'); + } + renderToStave(x) { + const context = this.checkContext(); + const metrics = this.checkMetrics(); + const stave = this.checkStave(); + const outline = metrics.outline; + const scale = this.scale * metrics.scale; + this.setRendered(); + this.applyStyle(); + const xPos = x + this.x_shift + metrics.x_shift; + const yPos = stave.getYForGlyphs() + this.y_shift + metrics.y_shift; + Glyph.renderOutline(context, outline, scale, xPos, yPos); + this.restoreStyle(); + } +} +Glyph.cache = new GlyphCache(); +Glyph.CURRENT_CACHE_KEY = ''; +Glyph.MUSIC_FONT_STACK = []; diff --git a/build/esm/src/glyphnote.js b/build/esm/src/glyphnote.js new file mode 100644 index 0000000000..434ad74951 --- /dev/null +++ b/build/esm/src/glyphnote.js @@ -0,0 +1,55 @@ +import { Note } from './note.js'; +export class GlyphNote extends Note { + constructor(glyph, noteStruct, options) { + super(noteStruct); + this.options = Object.assign({ ignoreTicks: false, line: 2 }, options); + this.ignore_ticks = this.options.ignoreTicks; + if (glyph) { + this.setGlyph(glyph); + } + } + static get CATEGORY() { + return "GlyphNote"; + } + setGlyph(glyph) { + this.glyph = glyph; + this.setWidth(this.glyph.getMetrics().width); + return this; + } + getBoundingBox() { + return this.glyph.getBoundingBox(); + } + preFormat() { + if (!this.preFormatted && this.modifierContext) { + this.modifierContext.preFormat(); + } + this.preFormatted = true; + return this; + } + drawModifiers() { + const ctx = this.checkContext(); + ctx.openGroup('modifiers'); + for (let i = 0; i < this.modifiers.length; i++) { + const modifier = this.modifiers[i]; + modifier.setContext(ctx); + modifier.drawWithStyle(); + } + ctx.closeGroup(); + } + draw() { + const stave = this.checkStave(); + const ctx = stave.checkContext(); + this.setRendered(); + ctx.openGroup('glyphNote', this.getAttribute('id')); + const glyph = this.glyph; + if (!glyph.getContext()) { + glyph.setContext(ctx); + } + glyph.setStave(stave); + glyph.setYShift(stave.getYForLine(this.options.line) - stave.getYForGlyphs()); + const x = this.isCenterAligned() ? this.getAbsoluteX() - this.getWidth() / 2 : this.getAbsoluteX(); + glyph.renderToStave(x); + this.drawModifiers(); + ctx.closeGroup(); + } +} diff --git a/build/esm/src/gracenote.js b/build/esm/src/gracenote.js new file mode 100644 index 0000000000..bfede2e0d5 --- /dev/null +++ b/build/esm/src/gracenote.js @@ -0,0 +1,131 @@ +import { StaveNote } from './stavenote.js'; +import { Stem } from './stem.js'; +import { Tables } from './tables.js'; +import { RuntimeError } from './util.js'; +export class GraceNote extends StaveNote { + constructor(noteStruct) { + super(Object.assign({ glyph_font_scale: Tables.NOTATION_FONT_SCALE * GraceNote.SCALE, stroke_px: GraceNote.LEDGER_LINE_OFFSET }, noteStruct)); + this.slash = noteStruct.slash || false; + this.slur = true; + this.buildNoteHeads(); + this.width = 3; + } + static get CATEGORY() { + return "GraceNote"; + } + static get LEDGER_LINE_OFFSET() { + return 2; + } + static get SCALE() { + return 0.66; + } + getStemExtension() { + if (this.stem_extension_override) { + return this.stem_extension_override; + } + const glyph = this.getGlyph(); + if (glyph) { + let ret = super.getStemExtension(); + if (glyph.stem) { + const staveNoteScale = this.getStaveNoteScale(); + ret = (Stem.HEIGHT + ret) * staveNoteScale - Stem.HEIGHT; + } + return ret; + } + return 0; + } + getStaveNoteScale() { + return this.render_options.glyph_font_scale / Tables.NOTATION_FONT_SCALE; + } + draw() { + super.draw(); + this.setRendered(); + const stem = this.stem; + if (this.slash && stem) { + const staveNoteScale = this.getStaveNoteScale(); + const offsetScale = staveNoteScale / 0.66; + let slashBBox = undefined; + const beam = this.beam; + if (beam) { + if (!beam.postFormatted) { + beam.postFormat(); + } + slashBBox = this.calcBeamedNotesSlashBBox(8 * offsetScale, 8 * offsetScale, { + stem: 6 * offsetScale, + beam: 5 * offsetScale, + }); + } + else { + const stem_direction = this.getStemDirection(); + const noteHeadBounds = this.getNoteHeadBounds(); + const noteStemHeight = stem.getHeight(); + let x = this.getAbsoluteX(); + let y = stem_direction === Stem.DOWN + ? noteHeadBounds.y_top - noteStemHeight + : noteHeadBounds.y_bottom - noteStemHeight; + let defaultOffsetY = Tables.STEM_HEIGHT; + defaultOffsetY -= defaultOffsetY / 2.8; + y += defaultOffsetY * staveNoteScale * stem_direction; + const offsets = stem_direction === Stem.UP + ? { + x1: 1, + y1: 0, + x2: 13, + y2: -9, + } + : { + x1: -4, + y1: 1, + x2: 13, + y2: 9, + }; + x += offsets.x1 * offsetScale; + y += offsets.y1 * offsetScale; + slashBBox = { + x1: x, + y1: y, + x2: x + offsets.x2 * offsetScale, + y2: y + offsets.y2 * offsetScale, + }; + } + const ctx = this.checkContext(); + ctx.save(); + ctx.setLineWidth(1 * offsetScale); + ctx.beginPath(); + ctx.moveTo(slashBBox.x1, slashBBox.y1); + ctx.lineTo(slashBBox.x2, slashBBox.y2); + ctx.closePath(); + ctx.stroke(); + ctx.restore(); + } + } + calcBeamedNotesSlashBBox(slashStemOffset, slashBeamOffset, protrusions) { + const beam = this.beam; + if (!beam) + throw new RuntimeError('NoBeam', "Can't calculate without a beam."); + const beam_slope = beam.slope; + const isBeamEndNote = beam.notes[beam.notes.length - 1] === this; + const scaleX = isBeamEndNote ? -1 : 1; + const beam_angle = Math.atan(beam_slope * scaleX); + const iPointOnBeam = { + dx: Math.cos(beam_angle) * slashBeamOffset, + dy: Math.sin(beam_angle) * slashBeamOffset, + }; + slashStemOffset *= this.getStemDirection(); + const slash_angle = Math.atan((iPointOnBeam.dy - slashStemOffset) / iPointOnBeam.dx); + const protrusion_stem_dx = Math.cos(slash_angle) * protrusions.stem * scaleX; + const protrusion_stem_dy = Math.sin(slash_angle) * protrusions.stem; + const protrusion_beam_dx = Math.cos(slash_angle) * protrusions.beam * scaleX; + const protrusion_beam_dy = Math.sin(slash_angle) * protrusions.beam; + const stemX = this.getStemX(); + const stem0X = beam.notes[0].getStemX(); + const stemY = beam.getBeamYToDraw() + (stemX - stem0X) * beam_slope; + const ret = { + x1: stemX - protrusion_stem_dx, + y1: stemY + slashStemOffset - protrusion_stem_dy, + x2: stemX + iPointOnBeam.dx * scaleX + protrusion_beam_dx, + y2: stemY + iPointOnBeam.dy + protrusion_beam_dy, + }; + return ret; + } +} diff --git a/build/esm/src/gracenotegroup.js b/build/esm/src/gracenotegroup.js new file mode 100644 index 0000000000..6b0867ce10 --- /dev/null +++ b/build/esm/src/gracenotegroup.js @@ -0,0 +1,128 @@ +import { Beam } from './beam.js'; +import { Formatter } from './formatter.js'; +import { Modifier } from './modifier.js'; +import { StaveTie } from './stavetie.js'; +import { Tables } from './tables.js'; +import { TabTie } from './tabtie.js'; +import { isStaveNote } from './typeguard.js'; +import { log } from './util.js'; +import { Voice } from './voice.js'; +function L(...args) { + if (GraceNoteGroup.DEBUG) + log('Vex.Flow.GraceNoteGroup', args); +} +export class GraceNoteGroup extends Modifier { + constructor(grace_notes, show_slur) { + super(); + this.preFormatted = false; + this.position = Modifier.Position.LEFT; + this.grace_notes = grace_notes; + this.width = 0; + this.show_slur = show_slur; + this.slur = undefined; + this.voice = new Voice({ + num_beats: 4, + beat_value: 4, + resolution: Tables.RESOLUTION, + }).setStrict(false); + this.render_options = { + slur_y_shift: 0, + }; + this.beams = []; + this.voice.addTickables(this.grace_notes); + return this; + } + static get CATEGORY() { + return "GraceNoteGroup"; + } + static format(gracenote_groups, state) { + const group_spacing_stave = 4; + const group_spacing_tab = 0; + if (!gracenote_groups || gracenote_groups.length === 0) + return false; + const group_list = []; + let prev_note = null; + let shiftL = 0; + for (let i = 0; i < gracenote_groups.length; ++i) { + const gracenote_group = gracenote_groups[i]; + const note = gracenote_group.getNote(); + const is_stavenote = isStaveNote(note); + const spacing = is_stavenote ? group_spacing_stave : group_spacing_tab; + if (is_stavenote && note !== prev_note) { + for (let n = 0; n < note.keys.length; ++n) { + shiftL = Math.max(note.getLeftDisplacedHeadPx(), shiftL); + } + prev_note = note; + } + group_list.push({ shift: shiftL, gracenote_group, spacing }); + } + let group_shift = group_list[0].shift; + let formatWidth; + for (let i = 0; i < group_list.length; ++i) { + const gracenote_group = group_list[i].gracenote_group; + gracenote_group.preFormat(); + formatWidth = gracenote_group.getWidth() + group_list[i].spacing; + group_shift = Math.max(formatWidth, group_shift); + } + for (let i = 0; i < group_list.length; ++i) { + const gracenote_group = group_list[i].gracenote_group; + formatWidth = gracenote_group.getWidth() + group_list[i].spacing; + gracenote_group.setSpacingFromNextModifier(group_shift - Math.min(formatWidth, group_shift)); + } + state.left_shift += group_shift; + return true; + } + preFormat() { + if (this.preFormatted) + return; + if (!this.formatter) { + this.formatter = new Formatter(); + } + this.formatter.joinVoices([this.voice]).format([this.voice], 0, {}); + this.setWidth(this.formatter.getMinTotalWidth()); + this.preFormatted = true; + } + beamNotes(grace_notes) { + grace_notes = grace_notes || this.grace_notes; + if (grace_notes.length > 1) { + const beam = new Beam(grace_notes); + beam.render_options.beam_width = 3; + beam.render_options.partial_beam_length = 4; + this.beams.push(beam); + } + return this; + } + setWidth(width) { + this.width = width; + return this; + } + getWidth() { + return this.width; + } + getGraceNotes() { + return this.grace_notes; + } + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + L('Drawing grace note group for:', note); + this.alignSubNotesWithNote(this.getGraceNotes(), note); + this.grace_notes.forEach((graceNote) => graceNote.setContext(ctx).draw()); + this.beams.forEach((beam) => beam.setContext(ctx).draw()); + if (this.show_slur) { + const is_stavenote = isStaveNote(note); + const TieClass = is_stavenote ? StaveTie : TabTie; + this.slur = new TieClass({ + last_note: this.grace_notes[0], + first_note: note, + first_indices: [0], + last_indices: [0], + }); + this.slur.render_options.cp2 = 12; + this.slur.render_options.y_shift = (is_stavenote ? 7 : 5) + this.render_options.slur_y_shift; + this.slur.setContext(ctx).draw(); + } + } +} +GraceNoteGroup.DEBUG = false; diff --git a/build/esm/src/gracetabnote.js b/build/esm/src/gracetabnote.js new file mode 100644 index 0000000000..8aba164203 --- /dev/null +++ b/build/esm/src/gracetabnote.js @@ -0,0 +1,12 @@ +import { Font } from './font.js'; +import { TabNote } from './tabnote.js'; +export class GraceTabNote extends TabNote { + static get CATEGORY() { + return "GraceTabNote"; + } + constructor(noteStruct) { + super(noteStruct, false); + this.render_options = Object.assign(Object.assign({}, this.render_options), { y_shift: 0.3, scale: 0.6, font: `7.5pt ${Font.SANS_SERIF}` }); + this.updateWidth(); + } +} diff --git a/build/esm/src/index.js b/build/esm/src/index.js new file mode 100644 index 0000000000..5c7d869fbe --- /dev/null +++ b/build/esm/src/index.js @@ -0,0 +1,91 @@ +import { Vex } from './vex.js'; +export * from './accidental.js'; +export * from './annotation.js'; +export * from './articulation.js'; +export * from './barnote.js'; +export * from './beam.js'; +export * from './bend.js'; +export * from './boundingbox.js'; +export * from './boundingboxcomputation.js'; +export * from './canvascontext.js'; +export * from './chordsymbol.js'; +export * from './clef.js'; +export * from './clefnote.js'; +export * from './crescendo.js'; +export * from './curve.js'; +export * from './dot.js'; +export * from './easyscore.js'; +export * from './element.js'; +export * from './factory.js'; +export * from './flow.js'; +export * from './font.js'; +export * from './formatter.js'; +export * from './fraction.js'; +export * from './frethandfinger.js'; +export * from './ghostnote.js'; +export * from './glyph.js'; +export * from './glyphnote.js'; +export * from './gracenote.js'; +export * from './gracenotegroup.js'; +export * from './gracetabnote.js'; +export * from './keymanager.js'; +export * from './keysignature.js'; +export * from './keysignote.js'; +export * from './modifier.js'; +export * from './modifiercontext.js'; +export * from './multimeasurerest.js'; +export * from './music.js'; +export * from './note.js'; +export * from './notehead.js'; +export * from './notesubgroup.js'; +export * from './ornament.js'; +export * from './parenthesis.js'; +export * from './parser.js'; +export * from './pedalmarking.js'; +export * from './registry.js'; +export * from './rendercontext.js'; +export * from './renderer.js'; +export * from './repeatnote.js'; +export * from './stave.js'; +export * from './stavebarline.js'; +export * from './staveconnector.js'; +export * from './stavehairpin.js'; +export * from './staveline.js'; +export * from './stavemodifier.js'; +export * from './stavenote.js'; +export * from './staverepetition.js'; +export * from './stavesection.js'; +export * from './stavetempo.js'; +export * from './stavetext.js'; +export * from './stavetie.js'; +export * from './stavevolta.js'; +export * from './stem.js'; +export * from './stemmablenote.js'; +export * from './stringnumber.js'; +export * from './strokes.js'; +export * from './svgcontext.js'; +export * from './system.js'; +export * from './tabnote.js'; +export * from './tabslide.js'; +export * from './tabstave.js'; +export * from './tabtie.js'; +export * from './textbracket.js'; +export * from './textdynamics.js'; +export * from './textformatter.js'; +export * from './textnote.js'; +export * from './tickable.js'; +export * from './tickcontext.js'; +export * from './timesigglyph.js'; +export * from './timesignature.js'; +export * from './timesignote.js'; +export * from './tremolo.js'; +export * from './tuning.js'; +export * from './tuplet.js'; +export * from './typeguard.js'; +export * from './util.js'; +export * from './vibrato.js'; +export * from './vibratobracket.js'; +export * from './voice.js'; +export * from './web.js'; +export { Vex }; +export default Vex; diff --git a/build/esm/src/keymanager.js b/build/esm/src/keymanager.js new file mode 100644 index 0000000000..6ccffe83c2 --- /dev/null +++ b/build/esm/src/keymanager.js @@ -0,0 +1,99 @@ +import { Music } from './music.js'; +import { RuntimeError } from './util.js'; +export class KeyManager { + constructor(key) { + this.music = new Music(); + this.setKey(key); + } + setKey(key) { + this.key = key; + this.reset(); + return this; + } + getKey() { + return this.key; + } + reset() { + this.keyParts = this.music.getKeyParts(this.key); + this.keyString = this.keyParts.root; + if (this.keyParts.accidental) + this.keyString += this.keyParts.accidental; + const is_supported_type = Music.scaleTypes[this.keyParts.type]; + if (!is_supported_type) { + throw new RuntimeError('BadArguments', `Unsupported key type: ${this.key}`); + } + this.scale = this.music.getScaleTones(this.music.getNoteValue(this.keyString), Music.scaleTypes[this.keyParts.type]); + this.scaleMap = {}; + this.scaleMapByValue = {}; + this.originalScaleMapByValue = {}; + const noteLocation = Music.root_indices[this.keyParts.root]; + for (let i = 0; i < Music.roots.length; ++i) { + const index = (noteLocation + i) % Music.roots.length; + const rootName = Music.roots[index]; + const noteName = this.music.getRelativeNoteName(rootName, this.scale[i]); + this.scaleMap[rootName] = noteName; + this.scaleMapByValue[this.scale[i]] = noteName; + this.originalScaleMapByValue[this.scale[i]] = noteName; + } + return this; + } + getAccidental(key) { + const root = this.music.getKeyParts(key).root; + const parts = this.music.getNoteParts(this.scaleMap[root]); + return { + note: this.scaleMap[root], + accidental: parts.accidental, + }; + } + selectNote(note) { + note = note.toLowerCase(); + const parts = this.music.getNoteParts(note); + const scaleNote = this.scaleMap[parts.root]; + const modparts = this.music.getNoteParts(scaleNote); + if (scaleNote === note) { + return { + note: scaleNote, + accidental: parts.accidental, + change: false, + }; + } + const valueNote = this.scaleMapByValue[this.music.getNoteValue(note)]; + if (valueNote != null) { + return { + note: valueNote, + accidental: this.music.getNoteParts(valueNote).accidental, + change: false, + }; + } + const originalValueNote = this.originalScaleMapByValue[this.music.getNoteValue(note)]; + if (originalValueNote != null) { + this.scaleMap[modparts.root] = originalValueNote; + delete this.scaleMapByValue[this.music.getNoteValue(scaleNote)]; + this.scaleMapByValue[this.music.getNoteValue(note)] = originalValueNote; + return { + note: originalValueNote, + accidental: this.music.getNoteParts(originalValueNote).accidental, + change: true, + }; + } + if (modparts.root === note) { + delete this.scaleMapByValue[this.music.getNoteValue(this.scaleMap[parts.root])]; + this.scaleMapByValue[this.music.getNoteValue(modparts.root)] = modparts.root; + this.scaleMap[modparts.root] = modparts.root; + return { + note: modparts.root, + accidental: undefined, + change: true, + }; + } + delete this.scaleMapByValue[this.music.getNoteValue(this.scaleMap[parts.root])]; + this.scaleMapByValue[this.music.getNoteValue(note)] = note; + delete this.scaleMap[modparts.root]; + this.scaleMap[modparts.root] = note; + return { + note, + accidental: parts.accidental, + change: true, + }; + } +} diff --git a/build/esm/src/keysignature.js b/build/esm/src/keysignature.js new file mode 100644 index 0000000000..a1476cb541 --- /dev/null +++ b/build/esm/src/keysignature.js @@ -0,0 +1,250 @@ +import { Glyph } from './glyph.js'; +import { StaveModifier, StaveModifierPosition } from './stavemodifier.js'; +import { Tables } from './tables.js'; +import { defined } from './util.js'; +export class KeySignature extends StaveModifier { + constructor(keySpec, cancelKeySpec, alterKeySpec) { + super(); + this.accList = []; + this.setKeySig(keySpec, cancelKeySpec, alterKeySpec); + this.setPosition(StaveModifierPosition.BEGIN); + this.glyphFontScale = 38; + this.glyphs = []; + this.xPositions = []; + this.paddingForced = false; + } + static get CATEGORY() { + return "KeySignature"; + } + convertToGlyph(acc, nextAcc) { + const accGlyphData = Tables.accidentalCodes(acc.type); + const glyph = new Glyph(accGlyphData.code, this.glyphFontScale); + let extraWidth = 1; + if (acc.type === 'n' && nextAcc) { + const spacing = KeySignature.accidentalSpacing[nextAcc.type]; + if (spacing) { + const isAbove = nextAcc.line >= acc.line; + extraWidth = isAbove ? spacing.above : spacing.below; + } + } + this.placeGlyphOnLine(glyph, this.checkStave(), acc.line); + this.glyphs.push(glyph); + const xPosition = this.xPositions[this.xPositions.length - 1]; + const glyphWidth = glyph.getMetrics().width + extraWidth; + this.xPositions.push(xPosition + glyphWidth); + this.width += glyphWidth; + } + cancelKey(spec) { + this.formatted = false; + this.cancelKeySpec = spec; + return this; + } + convertToCancelAccList(spec) { + const cancel_accList = Tables.keySignature(spec); + const different_types = this.accList.length > 0 && cancel_accList.length > 0 && cancel_accList[0].type !== this.accList[0].type; + const naturals = different_types ? cancel_accList.length : cancel_accList.length - this.accList.length; + if (naturals < 1) + return undefined; + const cancelled = []; + for (let i = 0; i < naturals; i++) { + let index = i; + if (!different_types) { + index = cancel_accList.length - naturals + i; + } + const acc = cancel_accList[index]; + cancelled.push({ type: 'n', line: acc.line }); + } + this.accList = cancelled.concat(this.accList); + return { + accList: cancelled, + type: cancel_accList[0].type, + }; + } + addToStave(stave) { + this.paddingForced = true; + stave.addModifier(this); + return this; + } + convertAccLines(clef, type, accList = this.accList) { + let offset = 0.0; + let customLines; + switch (clef) { + case 'soprano': + if (type === '#') + customLines = [2.5, 0.5, 2, 0, 1.5, -0.5, 1]; + else + offset = -1; + break; + case 'mezzo-soprano': + if (type === 'b') + customLines = [0, 2, 0.5, 2.5, 1, 3, 1.5]; + else + offset = 1.5; + break; + case 'alto': + offset = 0.5; + break; + case 'tenor': + if (type === '#') + customLines = [3, 1, 2.5, 0.5, 2, 0, 1.5]; + else + offset = -0.5; + break; + case 'baritone-f': + case 'baritone-c': + if (type === 'b') + customLines = [0.5, 2.5, 1, 3, 1.5, 3.5, 2]; + else + offset = 2; + break; + case 'bass': + case 'french': + offset = 1; + break; + default: + break; + } + let i; + if (typeof customLines !== 'undefined') { + for (i = 0; i < accList.length; ++i) { + accList[i].line = customLines[i]; + } + } + else if (offset !== 0) { + for (i = 0; i < accList.length; ++i) { + accList[i].line += offset; + } + } + } + getPadding(index) { + if (!this.formatted) + this.format(); + return this.glyphs.length === 0 || (!this.paddingForced && index < 2) ? 0 : this.padding; + } + getWidth() { + if (!this.formatted) + this.format(); + return this.width; + } + setKeySig(keySpec, cancelKeySpec, alterKeySpec) { + this.formatted = false; + this.keySpec = keySpec; + this.cancelKeySpec = cancelKeySpec; + this.alterKeySpec = alterKeySpec; + return this; + } + alterKey(alterKeySpec) { + this.formatted = false; + this.alterKeySpec = alterKeySpec; + return this; + } + convertToAlterAccList(alterKeySpec) { + const max = Math.min(alterKeySpec.length, this.accList.length); + for (let i = 0; i < max; ++i) { + if (alterKeySpec[i]) { + this.accList[i].type = alterKeySpec[i]; + } + } + } + format() { + const stave = this.checkStave(); + this.width = 0; + this.glyphs = []; + this.xPositions = [0]; + this.accList = Tables.keySignature(defined(this.keySpec)); + const accList = this.accList; + const firstAccidentalType = accList.length > 0 ? accList[0].type : undefined; + let cancelAccList; + if (this.cancelKeySpec) { + cancelAccList = this.convertToCancelAccList(this.cancelKeySpec); + } + if (this.alterKeySpec) { + this.convertToAlterAccList(this.alterKeySpec); + } + if (this.accList.length > 0) { + const clef = (this.position === StaveModifierPosition.END ? stave.getEndClef() : stave.getClef()) || stave.getClef(); + if (cancelAccList) { + this.convertAccLines(clef, cancelAccList.type, cancelAccList.accList); + } + this.convertAccLines(clef, firstAccidentalType, accList); + for (let i = 0; i < this.accList.length; ++i) { + this.convertToGlyph(this.accList[i], this.accList[i + 1]); + } + } + this.formatted = true; + } + draw() { + const stave = this.checkStave(); + const ctx = stave.checkContext(); + if (!this.formatted) + this.format(); + this.setRendered(); + ctx.openGroup('keysignature', this.getAttribute('id')); + for (let i = 0; i < this.glyphs.length; i++) { + const glyph = this.glyphs[i]; + const x = this.x + this.xPositions[i]; + glyph.setStave(stave); + glyph.setContext(ctx); + glyph.renderToStave(x); + } + ctx.closeGroup(); + } +} +KeySignature.accidentalSpacing = { + '#': { + above: 6, + below: 4, + }, + b: { + above: 4, + below: 7, + }, + n: { + above: 4, + below: 1, + }, + '##': { + above: 6, + below: 4, + }, + bb: { + above: 4, + below: 7, + }, + db: { + above: 4, + below: 7, + }, + d: { + above: 4, + below: 7, + }, + bbs: { + above: 4, + below: 7, + }, + '++': { + above: 6, + below: 4, + }, + '+': { + above: 6, + below: 4, + }, + '+-': { + above: 6, + below: 4, + }, + '++-': { + above: 6, + below: 4, + }, + bs: { + above: 4, + below: 10, + }, + bss: { + above: 4, + below: 10, + }, +}; diff --git a/build/esm/src/keysignote.js b/build/esm/src/keysignote.js new file mode 100644 index 0000000000..8006c64a40 --- /dev/null +++ b/build/esm/src/keysignote.js @@ -0,0 +1,28 @@ +import { KeySignature } from './keysignature.js'; +import { Note } from './note.js'; +export class KeySigNote extends Note { + constructor(keySpec, cancelKeySpec, alterKeySpec) { + super({ duration: 'b' }); + this.keySignature = new KeySignature(keySpec, cancelKeySpec, alterKeySpec); + this.ignore_ticks = true; + } + static get CATEGORY() { + return "KeySigNote"; + } + addToModifierContext(mc) { + return this; + } + preFormat() { + this.preFormatted = true; + this.keySignature.setStave(this.checkStave()); + this.setWidth(this.keySignature.getWidth()); + return this; + } + draw() { + const ctx = this.checkStave().checkContext(); + this.setRendered(); + this.keySignature.setX(this.getAbsoluteX()); + this.keySignature.setContext(ctx); + this.keySignature.draw(); + } +} diff --git a/build/esm/src/modifier.js b/build/esm/src/modifier.js new file mode 100644 index 0000000000..7847de42bf --- /dev/null +++ b/build/esm/src/modifier.js @@ -0,0 +1,128 @@ +import { Element } from './element.js'; +import { defined, RuntimeError } from './util.js'; +export var ModifierPosition; +(function (ModifierPosition) { + ModifierPosition[ModifierPosition["CENTER"] = 0] = "CENTER"; + ModifierPosition[ModifierPosition["LEFT"] = 1] = "LEFT"; + ModifierPosition[ModifierPosition["RIGHT"] = 2] = "RIGHT"; + ModifierPosition[ModifierPosition["ABOVE"] = 3] = "ABOVE"; + ModifierPosition[ModifierPosition["BELOW"] = 4] = "BELOW"; +})(ModifierPosition || (ModifierPosition = {})); +export class Modifier extends Element { + constructor() { + super(); + this.width = 0; + this.text_line = 0; + this.position = Modifier.Position.LEFT; + this.x_shift = 0; + this.y_shift = 0; + this.spacingFromNextModifier = 0; + } + static get CATEGORY() { + return "Modifier"; + } + static get Position() { + return ModifierPosition; + } + static get PositionString() { + return { + center: ModifierPosition.CENTER, + above: ModifierPosition.ABOVE, + below: ModifierPosition.BELOW, + left: ModifierPosition.LEFT, + right: ModifierPosition.RIGHT, + }; + } + reset() { + } + getWidth() { + return this.width; + } + setWidth(width) { + this.width = width; + return this; + } + getNote() { + return defined(this.note, 'NoNote', 'Modifier has no note.'); + } + checkAttachedNote() { + const category = this.getCategory(); + defined(this.index, 'NoIndex', `Can't draw ${category} without an index.`); + return defined(this.note, 'NoNote', `Can't draw ${category} without a note.`); + } + setNote(note) { + this.note = note; + return this; + } + getIndex() { + return this.index; + } + checkIndex() { + return defined(this.index, 'NoIndex', 'Modifier has an invalid index.'); + } + setIndex(index) { + this.index = index; + return this; + } + getModifierContext() { + return this.modifierContext; + } + checkModifierContext() { + return defined(this.modifierContext, 'NoModifierContext', 'Modifier Context Required'); + } + setModifierContext(c) { + this.modifierContext = c; + return this; + } + getPosition() { + return this.position; + } + setPosition(position) { + this.position = typeof position === 'string' ? Modifier.PositionString[position] : position; + this.reset(); + return this; + } + setTextLine(line) { + this.text_line = line; + return this; + } + setYShift(y) { + this.y_shift = y; + return this; + } + setSpacingFromNextModifier(x) { + this.spacingFromNextModifier = x; + } + getSpacingFromNextModifier() { + return this.spacingFromNextModifier; + } + setXShift(x) { + this.x_shift = 0; + if (this.position === Modifier.Position.LEFT) { + this.x_shift -= x; + } + else { + this.x_shift += x; + } + return this; + } + getXShift() { + return this.x_shift; + } + draw() { + this.checkContext(); + throw new RuntimeError('NotImplemented', 'draw() not implemented for this modifier.'); + } + alignSubNotesWithNote(subNotes, note) { + const tickContext = note.getTickContext(); + const metrics = tickContext.getMetrics(); + const stave = note.getStave(); + const subNoteXOffset = tickContext.getX() - metrics.modLeftPx - metrics.modRightPx + this.getSpacingFromNextModifier(); + subNotes.forEach((subNote) => { + const subTickContext = subNote.getTickContext(); + if (stave) + subNote.setStave(stave); + subTickContext.setXOffset(subNoteXOffset); + }); + } +} diff --git a/build/esm/src/modifiercontext.js b/build/esm/src/modifiercontext.js new file mode 100644 index 0000000000..dc3d3bdc14 --- /dev/null +++ b/build/esm/src/modifiercontext.js @@ -0,0 +1,110 @@ +import { Accidental } from './accidental.js'; +import { Annotation } from './annotation.js'; +import { Articulation } from './articulation.js'; +import { Bend } from './bend.js'; +import { ChordSymbol } from './chordsymbol.js'; +import { Dot } from './dot.js'; +import { FretHandFinger } from './frethandfinger.js'; +import { GraceNoteGroup } from './gracenotegroup.js'; +import { NoteSubGroup } from './notesubgroup.js'; +import { Ornament } from './ornament.js'; +import { Parenthesis } from './parenthesis.js'; +import { StaveNote } from './stavenote.js'; +import { StringNumber } from './stringnumber.js'; +import { Stroke } from './strokes.js'; +import { log, RuntimeError } from './util.js'; +import { Vibrato } from './vibrato.js'; +function L(...args) { + if (ModifierContext.DEBUG) + log('Vex.Flow.ModifierContext', args); +} +export class ModifierContext { + constructor() { + this.state = { + left_shift: 0, + right_shift: 0, + text_line: 0, + top_text_line: 0, + }; + this.members = {}; + this.preFormatted = false; + this.postFormatted = false; + this.formatted = false; + this.width = 0; + this.spacing = 0; + } + addModifier(member) { + L('addModifier is deprecated, use addMember instead.'); + return this.addMember(member); + } + addMember(member) { + const category = member.getCategory(); + if (!this.members[category]) { + this.members[category] = []; + } + this.members[category].push(member); + member.setModifierContext(this); + this.preFormatted = false; + return this; + } + getModifiers(category) { + L('getModifiers is deprecated, use getMembers instead.'); + return this.getMembers(category); + } + getMembers(category) { + var _a; + return (_a = this.members[category]) !== null && _a !== void 0 ? _a : []; + } + getWidth() { + return this.width; + } + getLeftShift() { + return this.state.left_shift; + } + getRightShift() { + return this.state.right_shift; + } + getState() { + return this.state; + } + getMetrics() { + if (!this.formatted) { + throw new RuntimeError('UnformattedMember', 'Unformatted member has no metrics.'); + } + return { + width: this.state.left_shift + this.state.right_shift + this.spacing, + spacing: this.spacing, + }; + } + preFormat() { + if (this.preFormatted) + return; + L('Preformatting ModifierContext'); + const state = this.state; + const members = this.members; + StaveNote.format(members["StaveNote"], state); + Parenthesis.format(members["Parenthesis"], state); + Dot.format(members["Dot"], state); + FretHandFinger.format(members["FretHandFinger"], state); + Accidental.format(members["Accidental"], state); + Stroke.format(members["Stroke"], state); + GraceNoteGroup.format(members["GraceNoteGroup"], state); + NoteSubGroup.format(members["NoteSubGroup"], state); + StringNumber.format(members["StringNumber"], state); + Articulation.format(members["Articulation"], state); + Ornament.format(members["Ornament"], state); + Annotation.format(members["Annotation"], state); + ChordSymbol.format(members["ChordSymbol"], state); + Bend.format(members["Bend"], state); + Vibrato.format(members["Vibrato"], state, this); + this.width = state.left_shift + state.right_shift; + this.preFormatted = true; + } + postFormat() { + if (this.postFormatted) + return; + L('Postformatting ModifierContext'); + StaveNote.postFormat(this.getMembers("StaveNote")); + } +} +ModifierContext.DEBUG = false; diff --git a/build/esm/src/multimeasurerest.js b/build/esm/src/multimeasurerest.js new file mode 100644 index 0000000000..03c9b60b53 --- /dev/null +++ b/build/esm/src/multimeasurerest.js @@ -0,0 +1,173 @@ +import { Element } from './element.js'; +import { Glyph } from './glyph.js'; +import { NoteHead } from './notehead.js'; +import { StaveModifierPosition } from './stavemodifier.js'; +import { Tables } from './tables.js'; +import { TimeSignature } from './timesignature.js'; +import { isBarline } from './typeguard.js'; +import { defined } from './util.js'; +let semibreve_rest; +function get_semibreve_rest() { + if (!semibreve_rest) { + const noteHead = new NoteHead({ duration: 'w', note_type: 'r' }); + semibreve_rest = { + glyph_font_scale: noteHead.render_options.glyph_font_scale, + glyph_code: noteHead.glyph_code, + width: noteHead.getWidth(), + }; + } + return semibreve_rest; +} +export class MultiMeasureRest extends Element { + constructor(number_of_measures, options) { + super(); + this.xs = { left: NaN, right: NaN }; + this.hasPaddingLeft = false; + this.hasPaddingRight = false; + this.hasLineThickness = false; + this.hasSymbolSpacing = false; + this.number_of_measures = number_of_measures; + this.hasPaddingLeft = typeof options.padding_left === 'number'; + this.hasPaddingRight = typeof options.padding_right === 'number'; + this.hasLineThickness = typeof options.line_thickness === 'number'; + this.hasSymbolSpacing = typeof options.symbol_spacing === 'number'; + const musicFont = Tables.currentMusicFont(); + this.render_options = Object.assign({ use_symbols: false, show_number: true, number_line: -0.5, number_glyph_point: musicFont.lookupMetric('digits.point'), line: 2, spacing_between_lines_px: Tables.STAVE_LINE_DISTANCE, serif_thickness: 2, semibreve_rest_glyph_scale: Tables.NOTATION_FONT_SCALE, padding_left: 0, padding_right: 0, line_thickness: 5, symbol_spacing: 0 }, options); + const fontLineShift = musicFont.lookupMetric('digits.shiftLine', 0); + this.render_options.number_line += fontLineShift; + } + static get CATEGORY() { + return "MultiMeasureRest"; + } + getXs() { + return this.xs; + } + setStave(stave) { + this.stave = stave; + return this; + } + getStave() { + return this.stave; + } + checkStave() { + return defined(this.stave, 'NoStave', 'No stave attached to instance.'); + } + drawLine(stave, ctx, left, right, spacingBetweenLines) { + const options = this.render_options; + const y = stave.getYForLine(options.line); + const padding = (right - left) * 0.1; + left += padding; + right -= padding; + let lineThicknessHalf; + if (this.hasLineThickness) { + lineThicknessHalf = options.line_thickness * 0.5; + } + else { + lineThicknessHalf = spacingBetweenLines * 0.25; + } + const serifThickness = options.serif_thickness; + const top = y - spacingBetweenLines; + const bot = y + spacingBetweenLines; + const leftIndented = left + serifThickness; + const rightIndented = right - serifThickness; + const lineTop = y - lineThicknessHalf; + const lineBottom = y + lineThicknessHalf; + ctx.save(); + ctx.beginPath(); + ctx.moveTo(left, top); + ctx.lineTo(leftIndented, top); + ctx.lineTo(leftIndented, lineTop); + ctx.lineTo(rightIndented, lineTop); + ctx.lineTo(rightIndented, top); + ctx.lineTo(right, top); + ctx.lineTo(right, bot); + ctx.lineTo(rightIndented, bot); + ctx.lineTo(rightIndented, lineBottom); + ctx.lineTo(leftIndented, lineBottom); + ctx.lineTo(leftIndented, bot); + ctx.lineTo(left, bot); + ctx.closePath(); + ctx.fill(); + } + drawSymbols(stave, ctx, left, right, spacingBetweenLines) { + const n4 = Math.floor(this.number_of_measures / 4); + const n = this.number_of_measures % 4; + const n2 = Math.floor(n / 2); + const n1 = n % 2; + const options = this.render_options; + semibreve_rest = undefined; + const rest = get_semibreve_rest(); + const rest_scale = options.semibreve_rest_glyph_scale; + const rest_width = rest.width * (rest_scale / rest.glyph_font_scale); + const glyphs = { + 2: { + width: rest_width * 0.5, + height: spacingBetweenLines, + }, + 1: { + width: rest_width, + }, + }; + const spacing = this.hasSymbolSpacing ? options.symbol_spacing : 10; + const width = n4 * glyphs[2].width + n2 * glyphs[2].width + n1 * glyphs[1].width + (n4 + n2 + n1 - 1) * spacing; + let x = left + (right - left) * 0.5 - width * 0.5; + const line = options.line; + const yTop = stave.getYForLine(line - 1); + const yMiddle = stave.getYForLine(line); + const yBottom = stave.getYForLine(line + 1); + ctx.save(); + ctx.setStrokeStyle('none'); + ctx.setLineWidth(0); + for (let i = 0; i < n4; ++i) { + ctx.fillRect(x, yMiddle - glyphs[2].height, glyphs[2].width, glyphs[2].height); + ctx.fillRect(x, yBottom - glyphs[2].height, glyphs[2].width, glyphs[2].height); + x += glyphs[2].width + spacing; + } + for (let i = 0; i < n2; ++i) { + ctx.fillRect(x, yMiddle - glyphs[2].height, glyphs[2].width, glyphs[2].height); + x += glyphs[2].width + spacing; + } + for (let i = 0; i < n1; ++i) { + Glyph.renderGlyph(ctx, x, yTop, rest_scale, rest.glyph_code); + x += glyphs[1].width + spacing; + } + ctx.restore(); + } + draw() { + const ctx = this.checkContext(); + this.setRendered(); + const stave = this.checkStave(); + let left = stave.getNoteStartX(); + let right = stave.getNoteEndX(); + const begModifiers = stave.getModifiers(StaveModifierPosition.BEGIN); + if (begModifiers.length === 1 && isBarline(begModifiers[0])) { + left -= begModifiers[0].getWidth(); + } + const options = this.render_options; + if (this.hasPaddingLeft) { + left = stave.getX() + options.padding_left; + } + if (this.hasPaddingRight) { + right = stave.getX() + stave.getWidth() - options.padding_right; + } + this.xs.left = left; + this.xs.right = right; + const spacingBetweenLines = options.spacing_between_lines_px; + if (options.use_symbols) { + this.drawSymbols(stave, ctx, left, right, spacingBetweenLines); + } + else { + this.drawLine(stave, ctx, left, right, spacingBetweenLines); + } + if (options.show_number) { + const timeSpec = '/' + this.number_of_measures; + const timeSig = new TimeSignature(timeSpec, 0, false); + timeSig.point = options.number_glyph_point; + timeSig.setTimeSig(timeSpec); + timeSig.setStave(stave); + timeSig.setX(left + (right - left) * 0.5 - timeSig.getInfo().glyph.getMetrics().width * 0.5); + timeSig.bottomLine = options.number_line; + timeSig.setContext(ctx).draw(); + } + } +} diff --git a/build/esm/src/music.js b/build/esm/src/music.js new file mode 100644 index 0000000000..d92c3749fe --- /dev/null +++ b/build/esm/src/music.js @@ -0,0 +1,322 @@ +import { RuntimeError } from './util.js'; +export class Music { + static get NUM_TONES() { + return this.canonical_notes.length; + } + static get roots() { + return ['c', 'd', 'e', 'f', 'g', 'a', 'b']; + } + static get root_values() { + return [0, 2, 4, 5, 7, 9, 11]; + } + static get root_indices() { + return { + c: 0, + d: 1, + e: 2, + f: 3, + g: 4, + a: 5, + b: 6, + }; + } + static get canonical_notes() { + return ['c', 'c#', 'd', 'd#', 'e', 'f', 'f#', 'g', 'g#', 'a', 'a#', 'b']; + } + static get diatonic_intervals() { + return ['unison', 'm2', 'M2', 'm3', 'M3', 'p4', 'dim5', 'p5', 'm6', 'M6', 'b7', 'M7', 'octave']; + } + static get diatonic_accidentals() { + return { + unison: { note: 0, accidental: 0 }, + m2: { note: 1, accidental: -1 }, + M2: { note: 1, accidental: 0 }, + m3: { note: 2, accidental: -1 }, + M3: { note: 2, accidental: 0 }, + p4: { note: 3, accidental: 0 }, + dim5: { note: 4, accidental: -1 }, + p5: { note: 4, accidental: 0 }, + m6: { note: 5, accidental: -1 }, + M6: { note: 5, accidental: 0 }, + b7: { note: 6, accidental: -1 }, + M7: { note: 6, accidental: 0 }, + octave: { note: 7, accidental: 0 }, + }; + } + static get intervals() { + return { + u: 0, + unison: 0, + m2: 1, + b2: 1, + min2: 1, + S: 1, + H: 1, + 2: 2, + M2: 2, + maj2: 2, + T: 2, + W: 2, + m3: 3, + b3: 3, + min3: 3, + M3: 4, + 3: 4, + maj3: 4, + 4: 5, + p4: 5, + '#4': 6, + b5: 6, + aug4: 6, + dim5: 6, + 5: 7, + p5: 7, + '#5': 8, + b6: 8, + aug5: 8, + 6: 9, + M6: 9, + maj6: 9, + b7: 10, + m7: 10, + min7: 10, + dom7: 10, + M7: 11, + maj7: 11, + 8: 12, + octave: 12, + }; + } + static get scales() { + return { + major: [2, 2, 1, 2, 2, 2, 1], + minor: [2, 1, 2, 2, 1, 2, 2], + ionian: [2, 2, 1, 2, 2, 2, 1], + dorian: [2, 1, 2, 2, 2, 1, 2], + phyrgian: [1, 2, 2, 2, 1, 2, 2], + lydian: [2, 2, 2, 1, 2, 2, 1], + mixolydian: [2, 2, 1, 2, 2, 1, 2], + aeolian: [2, 1, 2, 2, 1, 2, 2], + locrian: [1, 2, 2, 1, 2, 2, 2], + }; + } + static get scaleTypes() { + return { + M: Music.scales.major, + m: Music.scales.minor, + }; + } + static get accidentals() { + return ['bb', 'b', 'n', '#', '##']; + } + static get noteValues() { + return { + c: { root_index: 0, int_val: 0 }, + cn: { root_index: 0, int_val: 0 }, + 'c#': { root_index: 0, int_val: 1 }, + 'c##': { root_index: 0, int_val: 2 }, + cb: { root_index: 0, int_val: 11 }, + cbb: { root_index: 0, int_val: 10 }, + d: { root_index: 1, int_val: 2 }, + dn: { root_index: 1, int_val: 2 }, + 'd#': { root_index: 1, int_val: 3 }, + 'd##': { root_index: 1, int_val: 4 }, + db: { root_index: 1, int_val: 1 }, + dbb: { root_index: 1, int_val: 0 }, + e: { root_index: 2, int_val: 4 }, + en: { root_index: 2, int_val: 4 }, + 'e#': { root_index: 2, int_val: 5 }, + 'e##': { root_index: 2, int_val: 6 }, + eb: { root_index: 2, int_val: 3 }, + ebb: { root_index: 2, int_val: 2 }, + f: { root_index: 3, int_val: 5 }, + fn: { root_index: 3, int_val: 5 }, + 'f#': { root_index: 3, int_val: 6 }, + 'f##': { root_index: 3, int_val: 7 }, + fb: { root_index: 3, int_val: 4 }, + fbb: { root_index: 3, int_val: 3 }, + g: { root_index: 4, int_val: 7 }, + gn: { root_index: 4, int_val: 7 }, + 'g#': { root_index: 4, int_val: 8 }, + 'g##': { root_index: 4, int_val: 9 }, + gb: { root_index: 4, int_val: 6 }, + gbb: { root_index: 4, int_val: 5 }, + a: { root_index: 5, int_val: 9 }, + an: { root_index: 5, int_val: 9 }, + 'a#': { root_index: 5, int_val: 10 }, + 'a##': { root_index: 5, int_val: 11 }, + ab: { root_index: 5, int_val: 8 }, + abb: { root_index: 5, int_val: 7 }, + b: { root_index: 6, int_val: 11 }, + bn: { root_index: 6, int_val: 11 }, + 'b#': { root_index: 6, int_val: 0 }, + 'b##': { root_index: 6, int_val: 1 }, + bb: { root_index: 6, int_val: 10 }, + bbb: { root_index: 6, int_val: 9 }, + }; + } + isValidNoteValue(note) { + return note >= 0 && note < Music.canonical_notes.length; + } + isValidIntervalValue(interval) { + return interval >= 0 && interval < Music.diatonic_intervals.length; + } + getNoteParts(noteString) { + if (!noteString || noteString.length < 1) { + throw new RuntimeError('BadArguments', 'Invalid note name: ' + noteString); + } + if (noteString.length > 3) { + throw new RuntimeError('BadArguments', 'Invalid note name: ' + noteString); + } + const note = noteString.toLowerCase(); + const regex = /^([cdefgab])(b|bb|n|#|##)?$/; + const match = regex.exec(note); + if (match !== null) { + const root = match[1]; + const accidental = match[2]; + return { + root, + accidental, + }; + } + else { + throw new RuntimeError('BadArguments', 'Invalid note name: ' + noteString); + } + } + getKeyParts(keyString) { + if (!keyString || keyString.length < 1) { + throw new RuntimeError('BadArguments', 'Invalid key: ' + keyString); + } + const key = keyString.toLowerCase(); + const regex = /^([cdefgab])(b|#)?(mel|harm|m|M)?$/; + const match = regex.exec(key); + if (match !== null) { + const root = match[1]; + const accidental = match[2]; + let type = match[3]; + if (!type) + type = 'M'; + return { + root, + accidental, + type, + }; + } + else { + throw new RuntimeError('BadArguments', `Invalid key: ${keyString}`); + } + } + getNoteValue(noteString) { + const value = Music.noteValues[noteString]; + if (value === undefined) { + throw new RuntimeError('BadArguments', `Invalid note name: ${noteString}`); + } + return value.int_val; + } + getIntervalValue(intervalString) { + const value = Music.intervals[intervalString]; + if (value === undefined) { + throw new RuntimeError('BadArguments', `Invalid interval name: ${intervalString}`); + } + return value; + } + getCanonicalNoteName(noteValue) { + if (!this.isValidNoteValue(noteValue)) { + throw new RuntimeError('BadArguments', `Invalid note value: ${noteValue}`); + } + return Music.canonical_notes[noteValue]; + } + getCanonicalIntervalName(intervalValue) { + if (!this.isValidIntervalValue(intervalValue)) { + throw new RuntimeError('BadArguments', `Invalid interval value: ${intervalValue}`); + } + return Music.diatonic_intervals[intervalValue]; + } + getRelativeNoteValue(noteValue, intervalValue, direction = 1) { + if (direction !== 1 && direction !== -1) { + throw new RuntimeError('BadArguments', `Invalid direction: ${direction}`); + } + let sum = (noteValue + direction * intervalValue) % Music.NUM_TONES; + if (sum < 0) + sum += Music.NUM_TONES; + return sum; + } + getRelativeNoteName(root, noteValue) { + const parts = this.getNoteParts(root); + const rootValue = this.getNoteValue(parts.root); + let interval = noteValue - rootValue; + if (Math.abs(interval) > Music.NUM_TONES - 3) { + let multiplier = 1; + if (interval > 0) + multiplier = -1; + const reverse_interval = ((noteValue + 1 + (rootValue + 1)) % Music.NUM_TONES) * multiplier; + if (Math.abs(reverse_interval) > 2) { + throw new RuntimeError('BadArguments', `Notes not related: ${root}, ${noteValue})`); + } + else { + interval = reverse_interval; + } + } + if (Math.abs(interval) > 2) { + throw new RuntimeError('BadArguments', `Notes not related: ${root}, ${noteValue})`); + } + let relativeNoteName = parts.root; + if (interval > 0) { + for (let i = 1; i <= interval; ++i) { + relativeNoteName += '#'; + } + } + else if (interval < 0) { + for (let i = -1; i >= interval; --i) { + relativeNoteName += 'b'; + } + } + return relativeNoteName; + } + getScaleTones(key, intervals) { + const tones = [key]; + let nextNote = key; + for (let i = 0; i < intervals.length; i++) { + nextNote = this.getRelativeNoteValue(nextNote, intervals[i]); + if (nextNote !== key) + tones.push(nextNote); + } + return tones; + } + getIntervalBetween(note1, note2, direction = 1) { + if (direction !== 1 && direction !== -1) { + throw new RuntimeError('BadArguments', `Invalid direction: ${direction}`); + } + if (!this.isValidNoteValue(note1) || !this.isValidNoteValue(note2)) { + throw new RuntimeError('BadArguments', `Invalid notes: ${note1}, ${note2}`); + } + let difference = direction === 1 ? note2 - note1 : note1 - note2; + if (difference < 0) + difference += Music.NUM_TONES; + return difference; + } + createScaleMap(keySignature) { + const keySigParts = this.getKeyParts(keySignature); + if (!keySigParts.type) + throw new RuntimeError('BadArguments', 'Unsupported key type: undefined'); + const scaleName = Music.scaleTypes[keySigParts.type]; + let keySigString = keySigParts.root; + if (keySigParts.accidental) + keySigString += keySigParts.accidental; + if (!scaleName) + throw new RuntimeError('BadArguments', 'Unsupported key type: ' + keySignature); + const scale = this.getScaleTones(this.getNoteValue(keySigString), scaleName); + const noteLocation = Music.root_indices[keySigParts.root]; + const scaleMap = {}; + for (let i = 0; i < Music.roots.length; ++i) { + const index = (noteLocation + i) % Music.roots.length; + const rootName = Music.roots[index]; + let noteName = this.getRelativeNoteName(rootName, scale[i]); + if (noteName.length === 1) { + noteName += 'n'; + } + scaleMap[rootName] = noteName; + } + return scaleMap; + } +} diff --git a/build/esm/src/note.js b/build/esm/src/note.js new file mode 100644 index 0000000000..43b299f8c7 --- /dev/null +++ b/build/esm/src/note.js @@ -0,0 +1,371 @@ +import { Font } from './font.js'; +import { drawDot } from './rendercontext.js'; +import { Tables } from './tables.js'; +import { Tickable } from './tickable.js'; +import { defined, RuntimeError } from './util.js'; +export class Note extends Tickable { + constructor(noteStruct) { + super(); + if (!noteStruct) { + throw new RuntimeError('BadArguments', 'Note must have valid initialization data to identify duration and type.'); + } + const parsedNoteStruct = Note.parseNoteStruct(noteStruct); + if (!parsedNoteStruct) { + throw new RuntimeError('BadArguments', `Invalid note initialization object: ${JSON.stringify(noteStruct)}`); + } + this.keys = noteStruct.keys || []; + this.keyProps = []; + this.duration = parsedNoteStruct.duration; + this.noteType = parsedNoteStruct.type; + this.customTypes = parsedNoteStruct.customTypes; + if (noteStruct.duration_override) { + this.setDuration(noteStruct.duration_override); + } + else { + this.setIntrinsicTicks(parsedNoteStruct.ticks); + } + this.modifiers = []; + this.glyph = Tables.getGlyphProps(this.duration, this.noteType); + this.customGlyphs = this.customTypes.map((t) => Tables.getGlyphProps(this.duration, t)); + this.playNote = undefined; + this.ignore_ticks = false; + this.width = 0; + this.leftDisplacedHeadPx = 0; + this.rightDisplacedHeadPx = 0; + this.x_shift = 0; + this.ys = []; + if (noteStruct.align_center) { + this.setCenterAlignment(noteStruct.align_center); + } + this.render_options = { + annotation_spacing: 5, + glyph_font_scale: 1, + stroke_px: 1, + scale: 1, + font: '', + y_shift: 0, + }; + } + static get CATEGORY() { + return "Note"; + } + static plotMetrics(ctx, note, yPos) { + const metrics = note.getMetrics(); + const xStart = note.getAbsoluteX() - metrics.modLeftPx - metrics.leftDisplacedHeadPx; + const xPre1 = note.getAbsoluteX() - metrics.leftDisplacedHeadPx; + const xAbs = note.getAbsoluteX(); + const xPost1 = note.getAbsoluteX() + metrics.notePx; + const xPost2 = note.getAbsoluteX() + metrics.notePx + metrics.rightDisplacedHeadPx; + const xEnd = note.getAbsoluteX() + metrics.notePx + metrics.rightDisplacedHeadPx + metrics.modRightPx; + const xFreedomRight = xEnd + (note.getFormatterMetrics().freedom.right || 0); + const xWidth = xEnd - xStart; + ctx.save(); + ctx.setFont(Font.SANS_SERIF, 8); + ctx.fillText(Math.round(xWidth) + 'px', xStart + note.getXShift(), yPos); + const y = yPos + 7; + function stroke(x1, x2, color, yy = y) { + ctx.beginPath(); + ctx.setStrokeStyle(color); + ctx.setFillStyle(color); + ctx.setLineWidth(3); + ctx.moveTo(x1 + note.getXShift(), yy); + ctx.lineTo(x2 + note.getXShift(), yy); + ctx.stroke(); + } + stroke(xStart, xPre1, 'red'); + stroke(xPre1, xAbs, '#999'); + stroke(xAbs, xPost1, 'green'); + stroke(xPost1, xPost2, '#999'); + stroke(xPost2, xEnd, 'red'); + stroke(xEnd, xFreedomRight, '#DD0'); + stroke(xStart - note.getXShift(), xStart, '#BBB'); + drawDot(ctx, xAbs + note.getXShift(), y, 'blue'); + const formatterMetrics = note.getFormatterMetrics(); + if (formatterMetrics.iterations > 0) { + const spaceDeviation = formatterMetrics.space.deviation; + const prefix = spaceDeviation >= 0 ? '+' : ''; + ctx.setFillStyle('red'); + ctx.fillText(prefix + Math.round(spaceDeviation), xAbs + note.getXShift(), yPos - 10); + } + ctx.restore(); + } + static parseDuration(durationString) { + if (!durationString) { + return undefined; + } + const regexp = /(\d*\/?\d+|[a-z])(d*)([nrhms]|$)/; + const result = regexp.exec(durationString); + if (!result) { + return undefined; + } + const duration = result[1]; + const dots = result[2].length; + const type = result[3] || 'n'; + return { duration, dots, type }; + } + static parseNoteStruct(noteStruct) { + const durationProps = Note.parseDuration(noteStruct.duration); + if (!durationProps) { + return undefined; + } + let type = noteStruct.type; + if (type && !Tables.validTypes[type]) { + return undefined; + } + const customTypes = []; + if (!type) { + type = durationProps.type || 'n'; + if (noteStruct.keys !== undefined) { + noteStruct.keys.forEach((k, i) => { + const result = k.split('/'); + customTypes[i] = (result && result.length === 3 ? result[2] : type); + }); + } + } + let ticks = Tables.durationToTicks(durationProps.duration); + if (!ticks) { + return undefined; + } + const dots = noteStruct.dots ? noteStruct.dots : durationProps.dots; + if (typeof dots !== 'number') { + return undefined; + } + let currentTicks = ticks; + for (let i = 0; i < dots; i++) { + if (currentTicks <= 1) + return undefined; + currentTicks = currentTicks / 2; + ticks += currentTicks; + } + return { + duration: durationProps.duration, + type, + customTypes, + dots, + ticks, + }; + } + getPlayNote() { + return this.playNote; + } + setPlayNote(note) { + this.playNote = note; + return this; + } + isRest() { + return false; + } + addStroke(index, stroke) { + stroke.setNote(this); + stroke.setIndex(index); + this.modifiers.push(stroke); + this.preFormatted = false; + return this; + } + getStave() { + return this.stave; + } + checkStave() { + return defined(this.stave, 'NoStave', 'No stave attached to instance.'); + } + setStave(stave) { + this.stave = stave; + this.setYs([stave.getYForLine(0)]); + this.setContext(this.stave.getContext()); + return this; + } + getLeftDisplacedHeadPx() { + return this.leftDisplacedHeadPx; + } + getRightDisplacedHeadPx() { + return this.rightDisplacedHeadPx; + } + setLeftDisplacedHeadPx(x) { + this.leftDisplacedHeadPx = x; + return this; + } + setRightDisplacedHeadPx(x) { + this.rightDisplacedHeadPx = x; + return this; + } + shouldIgnoreTicks() { + return this.ignore_ticks; + } + getLineNumber(isTopNote) { + return 0; + } + getLineForRest() { + return 0; + } + getGlyph() { + return this.glyph; + } + getGlyphWidth() { + if (this.glyph) { + if (this.glyph.getMetrics) { + return this.glyph.getMetrics().width; + } + else if (this.glyph.getWidth) { + return this.glyph.getWidth(this.render_options.glyph_font_scale); + } + } + return 0; + } + setYs(ys) { + this.ys = ys; + return this; + } + getYs() { + if (this.ys.length === 0) { + throw new RuntimeError('NoYValues', 'No Y-values calculated for this note.'); + } + return this.ys; + } + getYForTopText(text_line) { + return this.checkStave().getYForTopText(text_line); + } + getVoice() { + if (!this.voice) + throw new RuntimeError('NoVoice', 'Note has no voice.'); + return this.voice; + } + setVoice(voice) { + this.voice = voice; + this.preFormatted = false; + return this; + } + getTickContext() { + return this.checkTickContext(); + } + setTickContext(tc) { + this.tickContext = tc; + this.preFormatted = false; + return this; + } + getDuration() { + return this.duration; + } + isDotted() { + return this.getModifiersByType('Dot').length > 0; + } + hasStem() { + return false; + } + getNoteType() { + return this.noteType; + } + getBeam() { + return this.beam; + } + checkBeam() { + return defined(this.beam, 'NoBeam', 'No beam attached to instance'); + } + hasBeam() { + return this.beam != undefined; + } + setBeam(beam) { + this.beam = beam; + return this; + } + addModifier(modifier, index = 0) { + const signature = 'Note.addModifier(modifier: Modifier, index: number=0)'; + if (typeof index === 'string') { + index = parseInt(index); + console.warn(signature + ' expected a number for `index`, but received a string.'); + } + if (typeof modifier !== 'object' || typeof index !== 'number') { + throw new RuntimeError('WrongParams', 'Incorrect call signature. Use ' + signature + ' instead.'); + } + modifier.setNote(this); + modifier.setIndex(index); + super.addModifier(modifier); + return this; + } + getModifiersByType(type) { + return this.checkModifierContext().getMembers(type); + } + getModifierStartXY(position, index, options) { + if (!this.preFormatted) { + throw new RuntimeError('UnformattedNote', "Can't call GetModifierStartXY on an unformatted note"); + } + return { + x: this.getAbsoluteX(), + y: this.ys[0], + }; + } + getRightParenthesisPx(index) { + const props = this.getKeyProps()[index]; + return props.displaced ? this.getRightDisplacedHeadPx() : 0; + } + getLeftParenthesisPx(index) { + const props = this.getKeyProps()[index]; + return props.displaced ? this.getLeftDisplacedHeadPx() : 0; + } + getFirstDotPx() { + let px = this.getRightDisplacedHeadPx(); + if (this.checkModifierContext().getMembers('Parenthesis').length !== 0) + px += Tables.currentMusicFont().lookupMetric('parenthesis.default.width'); + return px; + } + getMetrics() { + if (!this.preFormatted) { + throw new RuntimeError('UnformattedNote', "Can't call getMetrics on an unformatted note."); + } + const modLeftPx = this.modifierContext ? this.modifierContext.getState().left_shift : 0; + const modRightPx = this.modifierContext ? this.modifierContext.getState().right_shift : 0; + const width = this.getWidth(); + const glyphWidth = this.getGlyphWidth(); + const notePx = width - + modLeftPx - + modRightPx - + this.leftDisplacedHeadPx - + this.rightDisplacedHeadPx; + return { + width, + glyphWidth, + notePx, + modLeftPx, + modRightPx, + leftDisplacedHeadPx: this.leftDisplacedHeadPx, + rightDisplacedHeadPx: this.rightDisplacedHeadPx, + glyphPx: 0, + }; + } + getAbsoluteX() { + const tickContext = this.checkTickContext(`Can't getAbsoluteX() without a TickContext.`); + let x = tickContext.getX(); + if (this.stave) { + x += this.stave.getNoteStartX() + Tables.currentMusicFont().lookupMetric('stave.padding'); + } + if (this.isCenterAligned()) { + x += this.getCenterXShift(); + } + return x; + } + getStemDirection() { + throw new RuntimeError('NoStem', 'No stem attached to this note.'); + } + getStemExtents() { + throw new RuntimeError('NoStem', 'No stem attached to this note.'); + } + getTieRightX() { + let tieStartX = this.getAbsoluteX(); + const note_glyph_width = this.glyph.getWidth(); + tieStartX += note_glyph_width / 2; + tieStartX += -this.width / 2 + this.width + 2; + return tieStartX; + } + getTieLeftX() { + let tieEndX = this.getAbsoluteX(); + const note_glyph_width = this.glyph.getWidth(); + tieEndX += note_glyph_width / 2; + tieEndX -= this.width / 2 + 2; + return tieEndX; + } + getKeys() { + return this.keys; + } + getKeyProps() { + return this.keyProps; + } +} diff --git a/build/esm/src/notehead.js b/build/esm/src/notehead.js new file mode 100644 index 0000000000..e3fc4e07ed --- /dev/null +++ b/build/esm/src/notehead.js @@ -0,0 +1,169 @@ +import { BoundingBox } from './boundingbox.js'; +import { Glyph } from './glyph.js'; +import { Note } from './note.js'; +import { Stem } from './stem.js'; +import { Tables } from './tables.js'; +import { defined, log, RuntimeError } from './util.js'; +function L(...args) { + if (NoteHead.DEBUG) + log('Vex.Flow.NoteHead', args); +} +function drawSlashNoteHead(ctx, duration, x, y, stem_direction, staveSpace) { + const width = Tables.SLASH_NOTEHEAD_WIDTH; + ctx.save(); + ctx.setLineWidth(Tables.STEM_WIDTH); + let fill = false; + if (Tables.durationToNumber(duration) > 2) { + fill = true; + } + if (!fill) + x -= (Tables.STEM_WIDTH / 2) * stem_direction; + ctx.beginPath(); + ctx.moveTo(x, y + staveSpace); + ctx.lineTo(x, y + 1); + ctx.lineTo(x + width, y - staveSpace); + ctx.lineTo(x + width, y); + ctx.lineTo(x, y + staveSpace); + ctx.closePath(); + if (fill) { + ctx.fill(); + } + else { + ctx.stroke(); + } + if (Tables.durationToFraction(duration).equals(0.5)) { + const breve_lines = [-3, -1, width + 1, width + 3]; + for (let i = 0; i < breve_lines.length; i++) { + ctx.beginPath(); + ctx.moveTo(x + breve_lines[i], y - 10); + ctx.lineTo(x + breve_lines[i], y + 11); + ctx.stroke(); + } + } + ctx.restore(); +} +export class NoteHead extends Note { + constructor(noteStruct) { + super(noteStruct); + this.custom_glyph = false; + this.stem_up_x_offset = 0; + this.stem_down_x_offset = 0; + this.index = noteStruct.index; + this.x = noteStruct.x || 0; + this.y = noteStruct.y || 0; + if (noteStruct.note_type) + this.noteType = noteStruct.note_type; + this.displaced = noteStruct.displaced || false; + this.stem_direction = noteStruct.stem_direction || Stem.UP; + this.line = noteStruct.line || 0; + this.glyph = Tables.getGlyphProps(this.duration, this.noteType); + defined(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`); + this.glyph_code = this.glyph.code_head; + this.x_shift = noteStruct.x_shift || 0; + if (noteStruct.custom_glyph_code) { + this.custom_glyph = true; + this.glyph_code = noteStruct.custom_glyph_code; + this.stem_up_x_offset = noteStruct.stem_up_x_offset || 0; + this.stem_down_x_offset = noteStruct.stem_down_x_offset || 0; + } + this.style = noteStruct.style; + this.slashed = noteStruct.slashed || false; + this.render_options = Object.assign(Object.assign({}, this.render_options), { glyph_font_scale: noteStruct.glyph_font_scale || Tables.NOTATION_FONT_SCALE }); + this.setWidth(this.glyph.getWidth(this.render_options.glyph_font_scale)); + } + static get CATEGORY() { + return "NoteHead"; + } + getWidth() { + return this.width; + } + isDisplaced() { + return this.displaced === true; + } + getGlyph() { + return this.glyph; + } + setX(x) { + this.x = x; + return this; + } + getY() { + return this.y; + } + setY(y) { + this.y = y; + return this; + } + getLine() { + return this.line; + } + setLine(line) { + this.line = line; + return this; + } + getAbsoluteX() { + const x = !this.preFormatted ? this.x : super.getAbsoluteX(); + const displacementStemAdjustment = Stem.WIDTH / 2; + const musicFont = Tables.currentMusicFont(); + const fontShift = musicFont.lookupMetric('notehead.shiftX', 0) * this.stem_direction; + const displacedFontShift = musicFont.lookupMetric('noteHead.displaced.shiftX', 0) * this.stem_direction; + return (x + + fontShift + + (this.displaced ? (this.width - displacementStemAdjustment) * this.stem_direction + displacedFontShift : 0)); + } + getBoundingBox() { + if (!this.preFormatted) { + throw new RuntimeError('UnformattedNote', "Can't call getBoundingBox on an unformatted note."); + } + const spacing = this.checkStave().getSpacingBetweenLines(); + const half_spacing = spacing / 2; + const min_y = this.y - half_spacing; + return new BoundingBox(this.getAbsoluteX(), min_y, this.width, spacing); + } + setStave(stave) { + const line = this.getLine(); + this.stave = stave; + if (this.stave) { + this.setY(this.stave.getYForNote(line)); + this.setContext(this.stave.getContext()); + } + return this; + } + preFormat() { + if (this.preFormatted) + return this; + const width = this.getWidth() + this.leftDisplacedHeadPx + this.rightDisplacedHeadPx; + this.setWidth(width); + this.preFormatted = true; + return this; + } + draw() { + const ctx = this.checkContext(); + this.setRendered(); + let head_x = this.getAbsoluteX(); + if (this.custom_glyph) { + head_x += this.stem_direction === Stem.UP ? this.stem_up_x_offset : this.stem_down_x_offset; + } + const y = this.y; + L("Drawing note head '", this.noteType, this.duration, "' at", head_x, y); + const stem_direction = this.stem_direction; + const glyph_font_scale = this.render_options.glyph_font_scale; + if (this.style) { + this.applyStyle(ctx); + } + const categorySuffix = `${this.glyph_code}Stem${stem_direction === Stem.UP ? 'Up' : 'Down'}`; + if (this.noteType === 's') { + const staveSpace = this.checkStave().getSpacingBetweenLines(); + drawSlashNoteHead(ctx, this.duration, head_x, y, stem_direction, staveSpace); + } + else { + Glyph.renderGlyph(ctx, head_x, y, glyph_font_scale, this.glyph_code, { + category: this.custom_glyph ? `noteHead.custom.${categorySuffix}` : `noteHead.standard.${categorySuffix}`, + }); + } + if (this.style) { + this.restoreStyle(ctx); + } + } +} +NoteHead.DEBUG = false; diff --git a/build/esm/src/notesubgroup.js b/build/esm/src/notesubgroup.js new file mode 100644 index 0000000000..dda43ee27c --- /dev/null +++ b/build/esm/src/notesubgroup.js @@ -0,0 +1,59 @@ +import { Formatter } from './formatter.js'; +import { Modifier } from './modifier.js'; +import { Tables } from './tables.js'; +import { Voice } from './voice.js'; +export class NoteSubGroup extends Modifier { + constructor(subNotes) { + super(); + this.preFormatted = false; + this.position = Modifier.Position.LEFT; + this.subNotes = subNotes; + this.subNotes.forEach((subNote) => { + subNote.setIgnoreTicks(false); + }); + this.width = 0; + this.formatter = new Formatter(); + this.voice = new Voice({ + num_beats: 4, + beat_value: 4, + resolution: Tables.RESOLUTION, + }).setStrict(false); + this.voice.addTickables(this.subNotes); + } + static get CATEGORY() { + return "NoteSubGroup"; + } + static format(groups, state) { + if (!groups || groups.length === 0) + return false; + let width = 0; + for (let i = 0; i < groups.length; ++i) { + const group = groups[i]; + group.preFormat(); + width += group.getWidth(); + } + state.left_shift += width; + return true; + } + preFormat() { + if (this.preFormatted) + return; + this.formatter.joinVoices([this.voice]).format([this.voice], 0); + this.setWidth(this.formatter.getMinTotalWidth()); + this.preFormatted = true; + } + setWidth(width) { + this.width = width; + return this; + } + getWidth() { + return this.width; + } + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + this.alignSubNotesWithNote(this.subNotes, note); + this.subNotes.forEach((subNote) => subNote.setContext(ctx).drawWithStyle()); + } +} diff --git a/build/esm/src/ornament.js b/build/esm/src/ornament.js new file mode 100644 index 0000000000..b078b93d75 --- /dev/null +++ b/build/esm/src/ornament.js @@ -0,0 +1,206 @@ +import { Glyph } from './glyph.js'; +import { Modifier } from './modifier.js'; +import { Stem } from './stem.js'; +import { Tables } from './tables.js'; +import { TickContext } from './tickcontext.js'; +import { isTabNote } from './typeguard.js'; +import { defined, log, RuntimeError } from './util.js'; +function L(...args) { + if (Ornament.DEBUG) + log('Vex.Flow.Ornament', args); +} +export class Ornament extends Modifier { + constructor(type) { + super(); + this.type = type; + this.delayed = false; + this.render_options = { + font_scale: 38, + accidentalLowerPadding: 3, + accidentalUpperPadding: 3, + }; + this.ornament = Tables.ornamentCodes(this.type); + const metrics = this.getMetrics(); + this.adjustForStemDirection = false; + this.reportedWidth = metrics && metrics.reportedWidth ? metrics.reportedWidth : 0; + this.stemUpYOffset = metrics && metrics.stemUpYOffset ? metrics.stemUpYOffset : 0; + this.ornamentAlignWithNoteHead = Ornament.ornamentAlignWithNoteHead.indexOf(this.type) >= 0; + if (!this.ornament) { + throw new RuntimeError('ArgumentError', `Ornament not found: '${this.type}'`); + } + this.x_shift = metrics ? metrics.xOffset : 0; + this.y_shift = metrics ? metrics.yOffset : 0; + this.glyph = new Glyph(this.ornament.code, this.render_options.font_scale, { + category: `ornament.${this.ornament.code}`, + }); + if (Ornament.ornamentNoteTransition.indexOf(this.type) >= 0) { + this.delayed = true; + } + if (!metrics) { + this.glyph.setOrigin(0.5, 1.0); + } + } + static get CATEGORY() { + return "Ornament"; + } + static format(ornaments, state) { + if (!ornaments || ornaments.length === 0) + return false; + let width = 0; + let right_shift = state.right_shift; + let left_shift = state.left_shift; + let yOffset = 0; + for (let i = 0; i < ornaments.length; ++i) { + const ornament = ornaments[i]; + const increment = 2; + if (Ornament.ornamentRelease.indexOf(ornament.type) >= 0) { + ornament.x_shift += right_shift + 2; + } + if (Ornament.ornamentAttack.indexOf(ornament.type) >= 0) { + ornament.x_shift -= left_shift + 2; + } + if (ornament.reportedWidth && ornament.x_shift < 0) { + left_shift += ornament.reportedWidth; + } + else if (ornament.reportedWidth && ornament.x_shift > 0) { + right_shift += ornament.reportedWidth; + } + else { + width = Math.max(ornament.getWidth(), width); + } + if (Ornament.ornamentArticulation.indexOf(ornament.type) >= 0) { + const ornamentNote = defined(ornament.note, 'NoAttachedNote'); + if (ornamentNote.getLineNumber() >= 3 || ornament.getPosition() === Modifier.Position.ABOVE) { + state.top_text_line += increment; + ornament.y_shift += yOffset; + yOffset -= ornament.glyph.bbox.getH(); + } + else { + state.text_line += increment; + ornament.y_shift += yOffset; + yOffset += ornament.glyph.bbox.getH(); + } + } + else { + if (ornament.getPosition() === Modifier.Position.ABOVE) { + ornament.setTextLine(state.top_text_line); + state.top_text_line += increment; + } + else { + ornament.setTextLine(state.text_line); + state.text_line += increment; + } + } + } + state.left_shift = left_shift + width / 2; + state.right_shift = right_shift + width / 2; + return true; + } + static get ornamentNoteTransition() { + return ['flip', 'jazzTurn', 'smear']; + } + static get ornamentAttack() { + return ['scoop']; + } + static get ornamentAlignWithNoteHead() { + return ['doit', 'fall', 'fallLong', 'doitLong', 'bend', 'plungerClosed', 'plungerOpen', 'scoop']; + } + static get ornamentRelease() { + return ['doit', 'fall', 'fallLong', 'doitLong', 'jazzTurn', 'smear', 'flip']; + } + static get ornamentArticulation() { + return ['bend', 'plungerClosed', 'plungerOpen']; + } + getMetrics() { + return Tables.currentMusicFont().getMetrics().glyphs.jazzOrnaments[this.ornament.code]; + } + setDelayed(delayed) { + this.delayed = delayed; + return this; + } + setUpperAccidental(accid) { + const scale = this.render_options.font_scale / 1.3; + this.accidentalUpper = new Glyph(Tables.accidentalCodes(accid).code, scale); + this.accidentalUpper.setOrigin(0.5, 1.0); + return this; + } + setLowerAccidental(accid) { + const scale = this.render_options.font_scale / 1.3; + this.accidentalLower = new Glyph(Tables.accidentalCodes(accid).code, scale); + this.accidentalLower.setOrigin(0.5, 1.0); + return this; + } + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const stemDir = note.getStemDirection(); + const stave = note.checkStave(); + const classString = Object.keys(this.getAttribute('classes')).join(' '); + ctx.openGroup(classString, this.getAttribute('id')); + const stemExtents = note.checkStem().getExtents(); + let y = stemDir === Stem.DOWN ? stemExtents.baseY : stemExtents.topY; + if (isTabNote(note)) { + if (note.hasStem()) { + if (stemDir === Stem.DOWN) { + y = stave.getYForTopText(this.text_line); + } + } + else { + y = stave.getYForTopText(this.text_line); + } + } + const isPlacedOnNoteheadSide = stemDir === Stem.DOWN; + const spacing = stave.getSpacingBetweenLines(); + let lineSpacing = 1; + if (!isPlacedOnNoteheadSide && note.hasBeam()) { + lineSpacing += 0.5; + } + const totalSpacing = spacing * (this.text_line + lineSpacing); + const glyphYBetweenLines = y - totalSpacing; + const start = note.getModifierStartXY(this.position, this.index); + let glyphX = start.x; + let glyphY = this.ornamentAlignWithNoteHead + ? start.y + : Math.min(stave.getYForTopText(this.text_line), glyphYBetweenLines); + glyphY += this.y_shift; + if (this.delayed) { + let delayXShift = 0; + const startX = glyphX - (stave.getX() - 10); + if (this.delayXShift !== undefined) { + delayXShift = this.delayXShift; + } + else { + delayXShift += this.glyph.getMetrics().width / 2; + const nextContext = TickContext.getNextContext(note.getTickContext()); + if (nextContext) { + delayXShift += (nextContext.getX() - startX) * 0.5; + } + else { + delayXShift += (stave.getX() + stave.getWidth() - startX) * 0.5; + } + this.delayXShift = delayXShift; + } + glyphX += delayXShift; + } + L('Rendering ornament: ', this.ornament, glyphX, glyphY); + if (this.accidentalLower) { + this.accidentalLower.render(ctx, glyphX, glyphY); + glyphY -= this.accidentalLower.getMetrics().height; + glyphY -= this.render_options.accidentalLowerPadding; + } + if (this.stemUpYOffset && note.hasStem() && note.getStemDirection() === 1) { + glyphY += this.stemUpYOffset; + } + if (note.getLineNumber() < 5 && Ornament.ornamentNoteTransition.indexOf(this.type) >= 0) { + glyphY = note.checkStave().getBoundingBox().getY() + 40; + } + this.glyph.render(ctx, glyphX + this.x_shift, glyphY); + if (this.accidentalUpper) { + glyphY -= this.glyph.getMetrics().height + this.render_options.accidentalUpperPadding; + this.accidentalUpper.render(ctx, glyphX, glyphY); + } + ctx.closeGroup(); + } +} +Ornament.DEBUG = false; diff --git a/build/esm/src/parenthesis.js b/build/esm/src/parenthesis.js new file mode 100644 index 0000000000..db336f3c31 --- /dev/null +++ b/build/esm/src/parenthesis.js @@ -0,0 +1,76 @@ +import { Glyph } from './glyph.js'; +import { Modifier, ModifierPosition } from './modifier.js'; +import { Tables } from './tables.js'; +import { isGraceNote } from './typeguard.js'; +export class Parenthesis extends Modifier { + constructor(position) { + super(); + this.position = position !== null && position !== void 0 ? position : Modifier.Position.LEFT; + this.point = Tables.currentMusicFont().lookupMetric('parenthesis.default.point'); + this.setWidth(Tables.currentMusicFont().lookupMetric('parenthesis.default.width')); + } + static get CATEGORY() { + return "Parenthesis"; + } + static buildAndAttach(notes) { + for (const note of notes) { + for (let i = 0; i < note.keys.length; i++) { + note.addModifier(new Parenthesis(ModifierPosition.LEFT), i); + note.addModifier(new Parenthesis(ModifierPosition.RIGHT), i); + } + } + } + static format(parentheses, state) { + if (!parentheses || parentheses.length === 0) + return false; + let x_widthL = 0; + let x_widthR = 0; + for (let i = 0; i < parentheses.length; ++i) { + const parenthesis = parentheses[i]; + const note = parenthesis.getNote(); + const pos = parenthesis.getPosition(); + const index = parenthesis.checkIndex(); + let shift = 0; + if (pos === ModifierPosition.RIGHT) { + shift = note.getRightParenthesisPx(index); + x_widthR = x_widthR > shift + parenthesis.width ? x_widthR : shift + parenthesis.width; + } + if (pos === ModifierPosition.LEFT) { + shift = note.getLeftParenthesisPx(index); + x_widthL = x_widthL > shift + parenthesis.width ? x_widthL : shift + parenthesis.width; + } + parenthesis.setXShift(shift); + } + state.left_shift += x_widthL; + state.right_shift += x_widthR; + return true; + } + setNote(note) { + this.note = note; + this.point = Tables.currentMusicFont().lookupMetric('parenthesis.default.point'); + this.setWidth(Tables.currentMusicFont().lookupMetric('parenthesis.default.width')); + if (isGraceNote(note)) { + this.point = Tables.currentMusicFont().lookupMetric('parenthesis.gracenote.point'); + this.setWidth(Tables.currentMusicFont().lookupMetric('parenthesis.gracenote.width')); + } + return this; + } + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const start = note.getModifierStartXY(this.position, this.index, { forceFlagRight: true }); + const x = start.x + this.x_shift; + const y = start.y + this.y_shift; + if (this.position == Modifier.Position.RIGHT) { + Glyph.renderGlyph(ctx, x + 1, y, this.point, 'noteheadParenthesisRight', { + category: `noteHead.standard.noteheadParenthesisRight`, + }); + } + else if (this.position == Modifier.Position.LEFT) { + Glyph.renderGlyph(ctx, x - 2, y, this.point, 'noteheadParenthesisLeft', { + category: `noteHead.standard.noteheadParenthesisLeft`, + }); + } + } +} diff --git a/build/esm/src/parser.js b/build/esm/src/parser.js new file mode 100644 index 0000000000..2cb5274923 --- /dev/null +++ b/build/esm/src/parser.js @@ -0,0 +1,164 @@ +import { log, RuntimeError } from './util.js'; +function L(...args) { + if (Parser.DEBUG) + log('Vex.Flow.Parser', args); +} +const NO_ERROR_POS = -1; +function flattenMatches(r) { + if ('matchedString' in r) + return r.matchedString; + if ('results' in r) + return flattenMatches(r.results); + const results = r; + if (results.length === 1) + return flattenMatches(results[0]); + if (results.length === 0) + return null; + return results.map(flattenMatches); +} +export class Parser { + constructor(grammar) { + this.grammar = grammar; + this.line = ''; + this.pos = 0; + this.errorPos = NO_ERROR_POS; + } + parse(line) { + this.line = line; + this.pos = 0; + this.errorPos = NO_ERROR_POS; + const result = this.expect(this.grammar.begin()); + result.errorPos = this.errorPos; + return result; + } + matchFail(returnPos) { + if (this.errorPos === NO_ERROR_POS) + this.errorPos = this.pos; + this.pos = returnPos; + } + matchSuccess() { + this.errorPos = NO_ERROR_POS; + } + matchToken(token, noSpace = false) { + const regexp = noSpace ? new RegExp('^((' + token + '))') : new RegExp('^((' + token + ')\\s*)'); + const workingLine = this.line.slice(this.pos); + const result = workingLine.match(regexp); + if (result !== null) { + return { + success: true, + matchedString: result[2], + incrementPos: result[1].length, + pos: this.pos, + }; + } + else { + return { success: false, pos: this.pos }; + } + } + expectOne(rule, maybe = false) { + const results = []; + const pos = this.pos; + let allMatches = true; + let oneMatch = false; + maybe = maybe === true || rule.maybe === true; + if (rule.expect) { + for (const next of rule.expect) { + const localPos = this.pos; + const result = this.expect(next); + if (result.success) { + results.push(result); + oneMatch = true; + if (rule.or) + break; + } + else { + allMatches = false; + if (!rule.or) { + this.pos = localPos; + break; + } + } + } + } + const gotOne = (rule.or && oneMatch) || allMatches; + const success = gotOne || maybe === true; + const numMatches = gotOne ? 1 : 0; + if (maybe && !gotOne) + this.pos = pos; + if (success) { + this.matchSuccess(); + } + else { + this.matchFail(pos); + } + return { success, results, numMatches }; + } + expectOneOrMore(rule, maybe = false) { + const results = []; + const pos = this.pos; + let numMatches = 0; + let more = true; + do { + const result = this.expectOne(rule); + if (result.success && result.results) { + numMatches++; + results.push(result.results); + } + else { + more = false; + } + } while (more); + const success = numMatches > 0 || maybe === true; + if (maybe && !(numMatches > 0)) + this.pos = pos; + if (success) { + this.matchSuccess(); + } + else { + this.matchFail(pos); + } + return { success, results, numMatches }; + } + expectZeroOrMore(rule) { + return this.expectOneOrMore(rule, true); + } + expect(ruleFunc) { + L('Evaluating rule function:', ruleFunc); + if (!ruleFunc) { + throw new RuntimeError('Invalid rule function'); + } + let result; + const rule = ruleFunc.bind(this.grammar)(); + if (rule.token) { + result = this.matchToken(rule.token, rule.noSpace === true); + if (result.success) { + this.pos += result.incrementPos; + } + } + else if (rule.expect) { + if (rule.oneOrMore) { + result = this.expectOneOrMore(rule); + } + else if (rule.zeroOrMore) { + result = this.expectZeroOrMore(rule); + } + else { + result = this.expectOne(rule); + } + } + else { + L(rule); + throw new RuntimeError('Bad grammar! No `token` or `expect` property ' + rule); + } + const matches = []; + result.matches = matches; + if (result.results) { + result.results.forEach((r) => matches.push(flattenMatches(r))); + } + if (rule.run && result.success) { + rule.run({ matches }); + } + return result; + } +} +Parser.DEBUG = false; diff --git a/build/esm/src/pedalmarking.js b/build/esm/src/pedalmarking.js new file mode 100644 index 0000000000..d422c4e39c --- /dev/null +++ b/build/esm/src/pedalmarking.js @@ -0,0 +1,192 @@ +import { Element } from './element.js'; +import { Font, FontStyle, FontWeight } from './font.js'; +import { Glyph } from './glyph.js'; +import { Tables } from './tables.js'; +import { log, RuntimeError } from './util.js'; +function L(...args) { + if (PedalMarking.DEBUG) + log('Vex.Flow.PedalMarking', args); +} +function drawPedalGlyph(name, context, x, y, point) { + const glyph_data = PedalMarking.GLYPHS[name]; + const glyph = new Glyph(glyph_data.code, point, { category: 'pedalMarking' }); + glyph.render(context, x + glyph_data.x_shift, y + glyph_data.y_shift); +} +export class PedalMarking extends Element { + constructor(notes) { + super(); + this.notes = notes; + this.type = PedalMarking.type.TEXT; + this.line = 0; + this.custom_depress_text = ''; + this.custom_release_text = ''; + this.resetFont(); + this.render_options = { + bracket_height: 10, + text_margin_right: 6, + bracket_line_width: 1, + color: 'black', + }; + } + static get CATEGORY() { + return "PedalMarking"; + } + static createSustain(notes) { + const pedal = new PedalMarking(notes); + return pedal; + } + static createSostenuto(notes) { + const pedal = new PedalMarking(notes); + pedal.setType(PedalMarking.type.MIXED); + pedal.setCustomText('Sost. Ped.'); + return pedal; + } + static createUnaCorda(notes) { + const pedal = new PedalMarking(notes); + pedal.setType(PedalMarking.type.TEXT); + pedal.setCustomText('una corda', 'tre corda'); + return pedal; + } + setType(type) { + type = typeof type === 'string' ? PedalMarking.typeString[type] : type; + if (type >= PedalMarking.type.TEXT && type <= PedalMarking.type.MIXED) { + this.type = type; + } + return this; + } + setCustomText(depress, release) { + this.custom_depress_text = depress || ''; + this.custom_release_text = release || ''; + return this; + } + setLine(line) { + this.line = line; + return this; + } + drawBracketed() { + const ctx = this.checkContext(); + let is_pedal_depressed = false; + let prev_x; + let prev_y; + this.notes.forEach((note, index, notes) => { + is_pedal_depressed = !is_pedal_depressed; + const x = note.getAbsoluteX(); + const y = note.checkStave().getYForBottomText(this.line + 3); + if (x < prev_x) { + throw new RuntimeError('InvalidConfiguration', 'The notes provided must be in order of ascending x positions'); + } + const next_is_same = notes[index + 1] === note; + const prev_is_same = notes[index - 1] === note; + let x_shift = 0; + const point = Tables.currentMusicFont().lookupMetric(`pedalMarking.${is_pedal_depressed ? 'down' : 'up'}.point`); + if (is_pedal_depressed) { + x_shift = prev_is_same ? 5 : 0; + if (this.type === PedalMarking.type.MIXED && !prev_is_same) { + if (this.custom_depress_text) { + const text_width = ctx.measureText(this.custom_depress_text).width; + ctx.fillText(this.custom_depress_text, x - text_width / 2, y); + x_shift = text_width / 2 + this.render_options.text_margin_right; + } + else { + drawPedalGlyph('pedal_depress', ctx, x, y, point); + x_shift = 20 + this.render_options.text_margin_right; + } + } + else { + ctx.beginPath(); + ctx.moveTo(x, y - this.render_options.bracket_height); + ctx.lineTo(x + x_shift, y); + ctx.stroke(); + ctx.closePath(); + } + } + else { + x_shift = next_is_same ? -5 : 0; + ctx.beginPath(); + ctx.moveTo(prev_x, prev_y); + ctx.lineTo(x + x_shift, y); + ctx.lineTo(x, y - this.render_options.bracket_height); + ctx.stroke(); + ctx.closePath(); + } + prev_x = x + x_shift; + prev_y = y; + }); + } + drawText() { + const ctx = this.checkContext(); + let is_pedal_depressed = false; + this.notes.forEach((note) => { + is_pedal_depressed = !is_pedal_depressed; + const stave = note.checkStave(); + const x = note.getAbsoluteX(); + const y = stave.getYForBottomText(this.line + 3); + const point = Tables.currentMusicFont().lookupMetric(`pedalMarking.${is_pedal_depressed ? 'down' : 'up'}.point`); + let text_width = 0; + if (is_pedal_depressed) { + if (this.custom_depress_text) { + text_width = ctx.measureText(this.custom_depress_text).width; + ctx.fillText(this.custom_depress_text, x - text_width / 2, y); + } + else { + drawPedalGlyph('pedal_depress', ctx, x, y, point); + } + } + else { + if (this.custom_release_text) { + text_width = ctx.measureText(this.custom_release_text).width; + ctx.fillText(this.custom_release_text, x - text_width / 2, y); + } + else { + drawPedalGlyph('pedal_release', ctx, x, y, point); + } + } + }); + } + draw() { + const ctx = this.checkContext(); + this.setRendered(); + ctx.save(); + ctx.setStrokeStyle(this.render_options.color); + ctx.setFillStyle(this.render_options.color); + ctx.setFont(this.textFont); + L('Rendering Pedal Marking'); + if (this.type === PedalMarking.type.BRACKET || this.type === PedalMarking.type.MIXED) { + ctx.setLineWidth(this.render_options.bracket_line_width); + this.drawBracketed(); + } + else if (this.type === PedalMarking.type.TEXT) { + this.drawText(); + } + ctx.restore(); + } +} +PedalMarking.DEBUG = false; +PedalMarking.TEXT_FONT = { + family: Font.SERIF, + size: 12, + weight: FontWeight.BOLD, + style: FontStyle.ITALIC, +}; +PedalMarking.GLYPHS = { + pedal_depress: { + code: 'keyboardPedalPed', + x_shift: -10, + y_shift: 0, + }, + pedal_release: { + code: 'keyboardPedalUp', + x_shift: -2, + y_shift: 3, + }, +}; +PedalMarking.type = { + TEXT: 1, + BRACKET: 2, + MIXED: 3, +}; +PedalMarking.typeString = { + text: PedalMarking.type.TEXT, + bracket: PedalMarking.type.BRACKET, + mixed: PedalMarking.type.MIXED, +}; diff --git a/build/esm/src/publicpath.js b/build/esm/src/publicpath.js new file mode 100644 index 0000000000..3918c74e44 --- /dev/null +++ b/build/esm/src/publicpath.js @@ -0,0 +1 @@ +"use strict"; diff --git a/build/esm/src/registry.js b/build/esm/src/registry.js new file mode 100644 index 0000000000..cb60d78c91 --- /dev/null +++ b/build/esm/src/registry.js @@ -0,0 +1,81 @@ +import { RuntimeError } from './util.js'; +class Index { + constructor() { + this.id = {}; + this.type = {}; + this.class = {}; + } +} +export class Registry { + constructor() { + this.index = new Index(); + } + static getDefaultRegistry() { + return Registry.defaultRegistry; + } + static enableDefaultRegistry(registry) { + Registry.defaultRegistry = registry; + } + static disableDefaultRegistry() { + Registry.defaultRegistry = undefined; + } + clear() { + this.index = new Index(); + return this; + } + setIndexValue(name, value, id, elem) { + const index = this.index; + if (!index[name][value]) { + index[name][value] = {}; + } + index[name][value][id] = elem; + } + updateIndex({ id, name, value, oldValue }) { + const elem = this.getElementById(id); + if (oldValue !== undefined && this.index[name][oldValue]) { + delete this.index[name][oldValue][id]; + } + if (value && elem) { + this.setIndexValue(name, value, elem.getAttribute('id'), elem); + } + } + register(elem, id) { + id = id || elem.getAttribute('id'); + if (!id) { + throw new RuntimeError("Can't add element without `id` attribute to registry"); + } + elem.setAttribute('id', id); + this.setIndexValue('id', id, id, elem); + this.updateIndex({ id, name: 'type', value: elem.getAttribute('type'), oldValue: undefined }); + elem.onRegister(this); + return this; + } + getElementById(id) { + var _a, _b; + return (_b = (_a = this.index.id) === null || _a === void 0 ? void 0 : _a[id]) === null || _b === void 0 ? void 0 : _b[id]; + } + getElementsByAttribute(attribute, value) { + const index_attr = this.index[attribute]; + if (index_attr) { + const index_attr_val = index_attr[value]; + if (index_attr_val) { + const keys = Object.keys(index_attr_val); + return keys.map((k) => index_attr_val[k]); + } + } + return []; + } + getElementsByType(type) { + return this.getElementsByAttribute('type', type); + } + getElementsByClass(className) { + return this.getElementsByAttribute('class', className); + } + onUpdate(info) { + const allowedNames = ['id', 'type', 'class']; + if (allowedNames.includes(info.name)) { + this.updateIndex(info); + } + return this; + } +} diff --git a/build/esm/src/rendercontext.js b/build/esm/src/rendercontext.js new file mode 100644 index 0000000000..264da382ed --- /dev/null +++ b/build/esm/src/rendercontext.js @@ -0,0 +1,24 @@ +export class RenderContext { + static get CATEGORY() { + return "RenderContext"; + } + set font(f) { + this.setFont(f); + } + get font() { + return this.getFont(); + } + setRawFont(f) { + this.setFont(f); + return this; + } +} +export function drawDot(ctx, x, y, color = '#F55') { + ctx.save(); + ctx.setFillStyle(color); + ctx.beginPath(); + ctx.arc(x, y, 3, 0, Math.PI * 2, true); + ctx.closePath(); + ctx.fill(); + ctx.restore(); +} diff --git a/build/esm/src/renderer.js b/build/esm/src/renderer.js new file mode 100644 index 0000000000..d925f77f9b --- /dev/null +++ b/build/esm/src/renderer.js @@ -0,0 +1,112 @@ +import { CanvasContext } from './canvascontext.js'; +import { SVGContext } from './svgcontext.js'; +import { isRenderContext } from './typeguard.js'; +import { RuntimeError } from './util.js'; +import { isHTMLCanvas, isHTMLDiv } from './web.js'; +export var RendererBackends; +(function (RendererBackends) { + RendererBackends[RendererBackends["CANVAS"] = 1] = "CANVAS"; + RendererBackends[RendererBackends["SVG"] = 2] = "SVG"; +})(RendererBackends || (RendererBackends = {})); +export var RendererLineEndType; +(function (RendererLineEndType) { + RendererLineEndType[RendererLineEndType["NONE"] = 1] = "NONE"; + RendererLineEndType[RendererLineEndType["UP"] = 2] = "UP"; + RendererLineEndType[RendererLineEndType["DOWN"] = 3] = "DOWN"; +})(RendererLineEndType || (RendererLineEndType = {})); +export class Renderer { + constructor(arg0, arg1) { + if (isRenderContext(arg0)) { + this.ctx = arg0; + } + else { + if (arg1 === undefined) { + throw new RuntimeError('InvalidArgument', 'Missing backend argument'); + } + const backend = arg1; + let element; + if (typeof arg0 == 'string') { + const maybeElement = document.getElementById(arg0); + if (!maybeElement) { + throw new RuntimeError('BadElementId', `Can't find element with ID "${maybeElement}"`); + } + element = maybeElement; + } + else { + element = arg0; + } + if (backend === Renderer.Backends.CANVAS) { + if (!isHTMLCanvas(element)) { + throw new RuntimeError('BadElement', 'CANVAS context requires an HTMLCanvasElement.'); + } + const context = element.getContext('2d'); + if (!context) { + throw new RuntimeError('BadElement', "Can't get canvas context"); + } + this.ctx = new CanvasContext(context); + } + else if (backend === Renderer.Backends.SVG) { + if (!isHTMLDiv(element)) { + throw new RuntimeError('BadElement', 'SVG context requires an HTMLDivElement.'); + } + this.ctx = new SVGContext(element); + } + else { + throw new RuntimeError('InvalidBackend', `No support for backend: ${backend}`); + } + } + } + static buildContext(elementId, backend, width, height, background = '#FFF') { + const renderer = new Renderer(elementId, backend); + if (width && height) { + renderer.resize(width, height); + } + const ctx = renderer.getContext(); + ctx.setBackgroundFillStyle(background); + Renderer.lastContext = ctx; + return ctx; + } + static getCanvasContext(elementId, width, height, background) { + return Renderer.buildContext(elementId, Renderer.Backends.CANVAS, width, height, background); + } + static getSVGContext(elementId, width, height, background) { + return Renderer.buildContext(elementId, Renderer.Backends.SVG, width, height, background); + } + static drawDashedLine(context, fromX, fromY, toX, toY, dashPattern) { + context.beginPath(); + const dx = toX - fromX; + const dy = toY - fromY; + const angle = Math.atan2(dy, dx); + let x = fromX; + let y = fromY; + context.moveTo(fromX, fromY); + let idx = 0; + let draw = true; + while (!((dx < 0 ? x <= toX : x >= toX) && (dy < 0 ? y <= toY : y >= toY))) { + const dashLength = dashPattern[idx++ % dashPattern.length]; + const nx = x + Math.cos(angle) * dashLength; + x = dx < 0 ? Math.max(toX, nx) : Math.min(toX, nx); + const ny = y + Math.sin(angle) * dashLength; + y = dy < 0 ? Math.max(toY, ny) : Math.min(toY, ny); + if (draw) { + context.lineTo(x, y); + } + else { + context.moveTo(x, y); + } + draw = !draw; + } + context.closePath(); + context.stroke(); + } + resize(width, height) { + this.ctx.resize(width, height); + return this; + } + getContext() { + return this.ctx; + } +} +Renderer.Backends = RendererBackends; +Renderer.LineEndType = RendererLineEndType; +Renderer.lastContext = undefined; diff --git a/build/esm/src/repeatnote.js b/build/esm/src/repeatnote.js new file mode 100644 index 0000000000..de9f137e53 --- /dev/null +++ b/build/esm/src/repeatnote.js @@ -0,0 +1,22 @@ +import { Glyph } from './glyph.js'; +import { GlyphNote } from './glyphnote.js'; +import { Tables } from './tables.js'; +const CODES = { + '1': 'repeat1Bar', + '2': 'repeat2Bars', + '4': 'repeat4Bars', + slash: 'repeatBarSlash', +}; +export class RepeatNote extends GlyphNote { + static get CATEGORY() { + return "RepeatNote"; + } + constructor(type, noteStruct, options) { + super(undefined, Object.assign({ duration: 'q', align_center: type !== 'slash' }, noteStruct), options); + const glyphCode = CODES[type] || 'repeat1Bar'; + const glyph = new Glyph(glyphCode, Tables.currentMusicFont().lookupMetric('repeatNote.point', 40), { + category: 'repeatNote', + }); + this.setGlyph(glyph); + } +} diff --git a/build/esm/src/stave.js b/build/esm/src/stave.js new file mode 100644 index 0000000000..c921c4ab1a --- /dev/null +++ b/build/esm/src/stave.js @@ -0,0 +1,547 @@ +import { BoundingBox } from './boundingbox.js'; +import { Clef } from './clef.js'; +import { Element } from './element.js'; +import { Font, FontStyle, FontWeight } from './font.js'; +import { KeySignature } from './keysignature.js'; +import { Barline, BarlineType } from './stavebarline.js'; +import { StaveModifierPosition } from './stavemodifier.js'; +import { Repetition } from './staverepetition.js'; +import { StaveSection } from './stavesection.js'; +import { StaveTempo } from './stavetempo.js'; +import { StaveText } from './stavetext.js'; +import { Volta } from './stavevolta.js'; +import { Tables } from './tables.js'; +import { TimeSignature } from './timesignature.js'; +import { isBarline } from './typeguard.js'; +import { RuntimeError } from './util.js'; +const SORT_ORDER_BEG_MODIFIERS = { + [Barline.CATEGORY]: 0, + [Clef.CATEGORY]: 1, + [KeySignature.CATEGORY]: 2, + [TimeSignature.CATEGORY]: 3, +}; +const SORT_ORDER_END_MODIFIERS = { + [TimeSignature.CATEGORY]: 0, + [KeySignature.CATEGORY]: 1, + [Barline.CATEGORY]: 2, + [Clef.CATEGORY]: 3, +}; +export class Stave extends Element { + constructor(x, y, width, options) { + super(); + this.height = 0; + this.x = x; + this.y = y; + this.width = width; + this.formatted = false; + this.start_x = x + 5; + this.end_x = x + width; + this.modifiers = []; + this.measure = 0; + this.clef = 'treble'; + this.endClef = undefined; + this.resetFont(); + this.options = Object.assign({ vertical_bar_width: 10, num_lines: 5, fill_style: '#999999', left_bar: true, right_bar: true, spacing_between_lines_px: Tables.STAVE_LINE_DISTANCE, space_above_staff_ln: 4, space_below_staff_ln: 4, top_text_position: 1, bottom_text_position: 4, line_config: [] }, options); + this.bounds = { x: this.x, y: this.y, w: this.width, h: 0 }; + this.defaultLedgerLineStyle = { strokeStyle: '#444', lineWidth: 1.4 }; + this.resetLines(); + this.addModifier(new Barline(this.options.left_bar ? BarlineType.SINGLE : BarlineType.NONE)); + this.addEndModifier(new Barline(this.options.right_bar ? BarlineType.SINGLE : BarlineType.NONE)); + } + static get CATEGORY() { + return "Stave"; + } + static get defaultPadding() { + const musicFont = Tables.currentMusicFont(); + return musicFont.lookupMetric('stave.padding') + musicFont.lookupMetric('stave.endPaddingMax'); + } + static get rightPadding() { + const musicFont = Tables.currentMusicFont(); + return musicFont.lookupMetric('stave.endPaddingMax'); + } + setDefaultLedgerLineStyle(style) { + this.defaultLedgerLineStyle = style; + } + getDefaultLedgerLineStyle() { + return Object.assign(Object.assign({}, this.getStyle()), this.defaultLedgerLineStyle); + } + space(spacing) { + return this.options.spacing_between_lines_px * spacing; + } + resetLines() { + this.options.line_config = []; + for (let i = 0; i < this.options.num_lines; i++) { + this.options.line_config.push({ visible: true }); + } + this.height = (this.options.num_lines + this.options.space_above_staff_ln) * this.options.spacing_between_lines_px; + this.options.bottom_text_position = this.options.num_lines; + } + setNoteStartX(x) { + if (!this.formatted) + this.format(); + this.start_x = x; + const begBarline = this.modifiers[0]; + begBarline.setX(this.start_x - begBarline.getWidth()); + return this; + } + getNoteStartX() { + if (!this.formatted) + this.format(); + return this.start_x; + } + getNoteEndX() { + if (!this.formatted) + this.format(); + return this.end_x; + } + getTieStartX() { + return this.start_x; + } + getTieEndX() { + return this.end_x; + } + getX() { + return this.x; + } + getNumLines() { + return this.options.num_lines; + } + setNumLines(n) { + this.options.num_lines = n; + this.resetLines(); + return this; + } + setY(y) { + this.y = y; + return this; + } + getY() { + return this.y; + } + getTopLineTopY() { + return this.getYForLine(0) - Tables.STAVE_LINE_THICKNESS / 2; + } + getBottomLineBottomY() { + return this.getYForLine(this.getNumLines() - 1) + Tables.STAVE_LINE_THICKNESS / 2; + } + setX(x) { + const shift = x - this.x; + this.formatted = false; + this.x = x; + this.start_x += shift; + this.end_x += shift; + for (let i = 0; i < this.modifiers.length; i++) { + const mod = this.modifiers[i]; + mod.setX(mod.getX() + shift); + } + return this; + } + setWidth(width) { + this.formatted = false; + this.width = width; + this.end_x = this.x + width; + return this; + } + getWidth() { + return this.width; + } + getStyle() { + return Object.assign({ fillStyle: this.options.fill_style, strokeStyle: this.options.fill_style, lineWidth: Tables.STAVE_LINE_THICKNESS }, this.style); + } + setMeasure(measure) { + this.measure = measure; + return this; + } + getModifierXShift(index = 0) { + if (typeof index !== 'number') { + throw new RuntimeError('InvalidIndex', 'Must be of number type'); + } + if (!this.formatted) + this.format(); + if (this.getModifiers(StaveModifierPosition.BEGIN).length === 1) { + return 0; + } + if (this.modifiers[index].getPosition() === StaveModifierPosition.RIGHT) { + return 0; + } + let start_x = this.start_x - this.x; + const begBarline = this.modifiers[0]; + if (begBarline.getType() === BarlineType.REPEAT_BEGIN && start_x > begBarline.getWidth()) { + start_x -= begBarline.getWidth(); + } + return start_x; + } + setRepetitionType(type, yShift = 0) { + this.modifiers.push(new Repetition(type, this.x, yShift)); + return this; + } + setVoltaType(type, number_t, y) { + this.modifiers.push(new Volta(type, number_t, this.x, y)); + return this; + } + setSection(section, y, xOffset = 0, fontSize) { + const staveSection = new StaveSection(section, this.x + xOffset, y); + if (fontSize) + staveSection.setFontSize(fontSize); + this.modifiers.push(staveSection); + return this; + } + setTempo(tempo, y) { + this.modifiers.push(new StaveTempo(tempo, this.x, y)); + return this; + } + setText(text, position, options = {}) { + this.modifiers.push(new StaveText(text, position, options)); + return this; + } + getHeight() { + return this.height; + } + getSpacingBetweenLines() { + return this.options.spacing_between_lines_px; + } + getBoundingBox() { + return new BoundingBox(this.x, this.y, this.width, this.getBottomY() - this.y); + } + getBottomY() { + const options = this.options; + const spacing = options.spacing_between_lines_px; + const score_bottom = this.getYForLine(options.num_lines) + options.space_below_staff_ln * spacing; + return score_bottom; + } + getBottomLineY() { + return this.getYForLine(this.options.num_lines); + } + getYForLine(line) { + const options = this.options; + const spacing = options.spacing_between_lines_px; + const headroom = options.space_above_staff_ln; + const y = this.y + line * spacing + headroom * spacing; + return y; + } + getLineForY(y) { + const options = this.options; + const spacing = options.spacing_between_lines_px; + const headroom = options.space_above_staff_ln; + return (y - this.y) / spacing - headroom; + } + getYForTopText(line = 0) { + return this.getYForLine(-line - this.options.top_text_position); + } + getYForBottomText(line = 0) { + return this.getYForLine(this.options.bottom_text_position + line); + } + getYForNote(line) { + const options = this.options; + const spacing = options.spacing_between_lines_px; + const headroom = options.space_above_staff_ln; + return this.y + headroom * spacing + 5 * spacing - line * spacing; + } + getYForGlyphs() { + return this.getYForLine(3); + } + addModifier(modifier, position) { + if (position !== undefined) { + modifier.setPosition(position); + } + modifier.setStave(this); + this.formatted = false; + this.modifiers.push(modifier); + return this; + } + addEndModifier(modifier) { + this.addModifier(modifier, StaveModifierPosition.END); + return this; + } + setBegBarType(type) { + const { SINGLE, REPEAT_BEGIN, NONE } = BarlineType; + if (type === SINGLE || type === REPEAT_BEGIN || type === NONE) { + this.modifiers[0].setType(type); + this.formatted = false; + } + return this; + } + setEndBarType(type) { + if (type !== BarlineType.REPEAT_BEGIN) { + this.modifiers[1].setType(type); + this.formatted = false; + } + return this; + } + setClef(clefSpec, size, annotation, position) { + if (position === undefined) { + position = StaveModifierPosition.BEGIN; + } + if (position === StaveModifierPosition.END) { + this.endClef = clefSpec; + } + else { + this.clef = clefSpec; + } + const clefs = this.getModifiers(position, Clef.CATEGORY); + if (clefs.length === 0) { + this.addClef(clefSpec, size, annotation, position); + } + else { + clefs[0].setType(clefSpec, size, annotation); + } + return this; + } + getClef() { + return this.clef; + } + setEndClef(clefSpec, size, annotation) { + this.setClef(clefSpec, size, annotation, StaveModifierPosition.END); + return this; + } + getEndClef() { + return this.endClef; + } + setKeySignature(keySpec, cancelKeySpec, position) { + if (position === undefined) { + position = StaveModifierPosition.BEGIN; + } + const keySignatures = this.getModifiers(position, KeySignature.CATEGORY); + if (keySignatures.length === 0) { + this.addKeySignature(keySpec, cancelKeySpec, position); + } + else { + keySignatures[0].setKeySig(keySpec, cancelKeySpec); + } + return this; + } + setEndKeySignature(keySpec, cancelKeySpec) { + this.setKeySignature(keySpec, cancelKeySpec, StaveModifierPosition.END); + return this; + } + setTimeSignature(timeSpec, customPadding, position) { + if (position === undefined) { + position = StaveModifierPosition.BEGIN; + } + const timeSignatures = this.getModifiers(position, TimeSignature.CATEGORY); + if (timeSignatures.length === 0) { + this.addTimeSignature(timeSpec, customPadding, position); + } + else { + timeSignatures[0].setTimeSig(timeSpec); + } + return this; + } + setEndTimeSignature(timeSpec, customPadding) { + this.setTimeSignature(timeSpec, customPadding, StaveModifierPosition.END); + return this; + } + addKeySignature(keySpec, cancelKeySpec, position) { + if (position === undefined) { + position = StaveModifierPosition.BEGIN; + } + this.addModifier(new KeySignature(keySpec, cancelKeySpec).setPosition(position), position); + return this; + } + addClef(clef, size, annotation, position) { + if (position === undefined || position === StaveModifierPosition.BEGIN) { + this.clef = clef; + } + else if (position === StaveModifierPosition.END) { + this.endClef = clef; + } + this.addModifier(new Clef(clef, size, annotation), position); + return this; + } + addEndClef(clef, size, annotation) { + this.addClef(clef, size, annotation, StaveModifierPosition.END); + return this; + } + addTimeSignature(timeSpec, customPadding, position) { + this.addModifier(new TimeSignature(timeSpec, customPadding), position); + return this; + } + addEndTimeSignature(timeSpec, customPadding) { + this.addTimeSignature(timeSpec, customPadding, StaveModifierPosition.END); + return this; + } + addTrebleGlyph() { + this.addClef('treble'); + return this; + } + getModifiers(position, category) { + const noPosition = position === undefined; + const noCategory = category === undefined; + if (noPosition && noCategory) { + return this.modifiers; + } + else if (noPosition) { + return this.modifiers.filter((m) => category === m.getCategory()); + } + else if (noCategory) { + return this.modifiers.filter((m) => position === m.getPosition()); + } + else { + return this.modifiers.filter((m) => position === m.getPosition() && category === m.getCategory()); + } + } + sortByCategory(items, order) { + for (let i = items.length - 1; i >= 0; i--) { + for (let j = 0; j < i; j++) { + if (order[items[j].getCategory()] > order[items[j + 1].getCategory()]) { + const temp = items[j]; + items[j] = items[j + 1]; + items[j + 1] = temp; + } + } + } + } + format() { + const begBarline = this.modifiers[0]; + const endBarline = this.modifiers[1]; + const begModifiers = this.getModifiers(StaveModifierPosition.BEGIN); + const endModifiers = this.getModifiers(StaveModifierPosition.END); + this.sortByCategory(begModifiers, SORT_ORDER_BEG_MODIFIERS); + this.sortByCategory(endModifiers, SORT_ORDER_END_MODIFIERS); + if (begModifiers.length > 1 && begBarline.getType() === BarlineType.REPEAT_BEGIN) { + begModifiers.push(begModifiers.splice(0, 1)[0]); + begModifiers.splice(0, 0, new Barline(BarlineType.SINGLE)); + } + if (endModifiers.indexOf(endBarline) > 0) { + endModifiers.splice(0, 0, new Barline(BarlineType.NONE)); + } + let width; + let padding; + let modifier; + let offset = 0; + let x = this.x; + for (let i = 0; i < begModifiers.length; i++) { + modifier = begModifiers[i]; + padding = modifier.getPadding(i + offset); + width = modifier.getWidth(); + x += padding; + modifier.setX(x); + x += width; + if (padding + width === 0) + offset--; + } + this.start_x = x; + x = this.x + this.width; + const widths = { + left: 0, + right: 0, + paddingRight: 0, + paddingLeft: 0, + }; + let lastBarlineIdx = 0; + for (let i = 0; i < endModifiers.length; i++) { + modifier = endModifiers[i]; + lastBarlineIdx = isBarline(modifier) ? i : lastBarlineIdx; + widths.right = 0; + widths.left = 0; + widths.paddingRight = 0; + widths.paddingLeft = 0; + const layoutMetrics = modifier.getLayoutMetrics(); + if (layoutMetrics) { + if (i !== 0) { + widths.right = layoutMetrics.xMax || 0; + widths.paddingRight = layoutMetrics.paddingRight || 0; + } + widths.left = -layoutMetrics.xMin || 0; + widths.paddingLeft = layoutMetrics.paddingLeft || 0; + if (i === endModifiers.length - 1) { + widths.paddingLeft = 0; + } + } + else { + widths.paddingRight = modifier.getPadding(i - lastBarlineIdx); + if (i !== 0) { + widths.right = modifier.getWidth(); + } + if (i === 0) { + widths.left = modifier.getWidth(); + } + } + x -= widths.paddingRight; + x -= widths.right; + modifier.setX(x); + x -= widths.left; + x -= widths.paddingLeft; + } + this.end_x = endModifiers.length === 1 ? this.x + this.width : x; + this.formatted = true; + } + draw() { + const ctx = this.checkContext(); + this.setRendered(); + ctx.openGroup('stave', this.getAttribute('id')); + if (!this.formatted) + this.format(); + const num_lines = this.options.num_lines; + const width = this.width; + const x = this.x; + let y; + for (let line = 0; line < num_lines; line++) { + y = this.getYForLine(line); + this.applyStyle(); + if (this.options.line_config[line].visible) { + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.lineTo(x + width, y); + ctx.stroke(); + } + this.restoreStyle(); + } + for (let i = 0; i < this.modifiers.length; i++) { + const modifier = this.modifiers[i]; + if (typeof modifier.draw === 'function') { + modifier.applyStyle(ctx); + modifier.draw(this, this.getModifierXShift(i)); + modifier.restoreStyle(ctx); + } + } + if (this.measure > 0) { + ctx.save(); + ctx.setFont(this.textFont); + const textWidth = ctx.measureText('' + this.measure).width; + y = this.getYForTopText(0) + 3; + ctx.fillText('' + this.measure, this.x - textWidth / 2, y); + ctx.restore(); + } + ctx.closeGroup(); + return this; + } + getVerticalBarWidth() { + return this.options.vertical_bar_width; + } + getConfigForLines() { + return this.options.line_config; + } + setConfigForLine(line_number, line_config) { + if (line_number >= this.options.num_lines || line_number < 0) { + throw new RuntimeError('StaveConfigError', 'The line number must be within the range of the number of lines in the Stave.'); + } + if (line_config.visible === undefined) { + throw new RuntimeError('StaveConfigError', "The line configuration object is missing the 'visible' property."); + } + if (typeof line_config.visible !== 'boolean') { + throw new RuntimeError('StaveConfigError', "The line configuration objects 'visible' property must be true or false."); + } + this.options.line_config[line_number] = line_config; + return this; + } + setConfigForLines(lines_configuration) { + if (lines_configuration.length !== this.options.num_lines) { + throw new RuntimeError('StaveConfigError', 'The length of the lines configuration array must match the number of lines in the Stave'); + } + for (const line_config in lines_configuration) { + if (lines_configuration[line_config].visible == undefined) { + lines_configuration[line_config] = this.options.line_config[line_config]; + } + this.options.line_config[line_config] = Object.assign(Object.assign({}, this.options.line_config[line_config]), lines_configuration[line_config]); + } + this.options.line_config = lines_configuration; + return this; + } +} +Stave.TEXT_FONT = { + family: Font.SANS_SERIF, + size: 8, + weight: FontWeight.NORMAL, + style: FontStyle.NORMAL, +}; diff --git a/build/esm/src/stavebarline.js b/build/esm/src/stavebarline.js new file mode 100644 index 0000000000..e950a6124e --- /dev/null +++ b/build/esm/src/stavebarline.js @@ -0,0 +1,182 @@ +import { StaveModifier, StaveModifierPosition } from './stavemodifier.js'; +import { Tables } from './tables.js'; +export var BarlineType; +(function (BarlineType) { + BarlineType[BarlineType["SINGLE"] = 1] = "SINGLE"; + BarlineType[BarlineType["DOUBLE"] = 2] = "DOUBLE"; + BarlineType[BarlineType["END"] = 3] = "END"; + BarlineType[BarlineType["REPEAT_BEGIN"] = 4] = "REPEAT_BEGIN"; + BarlineType[BarlineType["REPEAT_END"] = 5] = "REPEAT_END"; + BarlineType[BarlineType["REPEAT_BOTH"] = 6] = "REPEAT_BOTH"; + BarlineType[BarlineType["NONE"] = 7] = "NONE"; +})(BarlineType || (BarlineType = {})); +export class Barline extends StaveModifier { + constructor(type) { + super(); + this.thickness = Tables.STAVE_LINE_THICKNESS; + const TYPE = BarlineType; + this.widths = {}; + this.widths[TYPE.SINGLE] = 5; + this.widths[TYPE.DOUBLE] = 5; + this.widths[TYPE.END] = 5; + this.widths[TYPE.REPEAT_BEGIN] = 5; + this.widths[TYPE.REPEAT_END] = 5; + this.widths[TYPE.REPEAT_BOTH] = 5; + this.widths[TYPE.NONE] = 5; + this.paddings = {}; + this.paddings[TYPE.SINGLE] = 0; + this.paddings[TYPE.DOUBLE] = 0; + this.paddings[TYPE.END] = 0; + this.paddings[TYPE.REPEAT_BEGIN] = 15; + this.paddings[TYPE.REPEAT_END] = 15; + this.paddings[TYPE.REPEAT_BOTH] = 15; + this.paddings[TYPE.NONE] = 0; + this.layoutMetricsMap = {}; + this.layoutMetricsMap[TYPE.SINGLE] = { + xMin: 0, + xMax: 1, + paddingLeft: 5, + paddingRight: 5, + }; + this.layoutMetricsMap[TYPE.DOUBLE] = { + xMin: -3, + xMax: 1, + paddingLeft: 5, + paddingRight: 5, + }; + this.layoutMetricsMap[TYPE.END] = { + xMin: -5, + xMax: 1, + paddingLeft: 5, + paddingRight: 5, + }; + this.layoutMetricsMap[TYPE.REPEAT_END] = { + xMin: -10, + xMax: 1, + paddingLeft: 5, + paddingRight: 5, + }; + this.layoutMetricsMap[TYPE.REPEAT_BEGIN] = { + xMin: -2, + xMax: 10, + paddingLeft: 5, + paddingRight: 5, + }; + this.layoutMetricsMap[TYPE.REPEAT_BOTH] = { + xMin: -10, + xMax: 10, + paddingLeft: 5, + paddingRight: 5, + }; + this.layoutMetricsMap[TYPE.NONE] = { + xMin: 0, + xMax: 0, + paddingLeft: 5, + paddingRight: 5, + }; + this.setPosition(StaveModifierPosition.BEGIN); + this.setType(type); + } + static get CATEGORY() { + return "Barline"; + } + static get type() { + return BarlineType; + } + static get typeString() { + return { + single: BarlineType.SINGLE, + double: BarlineType.DOUBLE, + end: BarlineType.END, + repeatBegin: BarlineType.REPEAT_BEGIN, + repeatEnd: BarlineType.REPEAT_END, + repeatBoth: BarlineType.REPEAT_BOTH, + none: BarlineType.NONE, + }; + } + getType() { + return this.type; + } + setType(type) { + this.type = typeof type === 'string' ? Barline.typeString[type] : type; + this.setWidth(this.widths[this.type]); + this.setPadding(this.paddings[this.type]); + this.setLayoutMetrics(this.layoutMetricsMap[this.type]); + return this; + } + draw(stave) { + stave.checkContext(); + this.setRendered(); + switch (this.type) { + case BarlineType.SINGLE: + this.drawVerticalBar(stave, this.x, false); + break; + case BarlineType.DOUBLE: + this.drawVerticalBar(stave, this.x, true); + break; + case BarlineType.END: + this.drawVerticalEndBar(stave, this.x); + break; + case BarlineType.REPEAT_BEGIN: + this.drawRepeatBar(stave, this.x, true); + if (stave.getX() !== this.x) { + this.drawVerticalBar(stave, stave.getX()); + } + break; + case BarlineType.REPEAT_END: + this.drawRepeatBar(stave, this.x, false); + break; + case BarlineType.REPEAT_BOTH: + this.drawRepeatBar(stave, this.x, false); + this.drawRepeatBar(stave, this.x, true); + break; + default: + break; + } + } + drawVerticalBar(stave, x, double_bar) { + const staveCtx = stave.checkContext(); + const topY = stave.getTopLineTopY(); + const botY = stave.getBottomLineBottomY(); + if (double_bar) { + staveCtx.fillRect(x - 3, topY, 1, botY - topY); + } + staveCtx.fillRect(x, topY, 1, botY - topY); + } + drawVerticalEndBar(stave, x) { + const staveCtx = stave.checkContext(); + const topY = stave.getTopLineTopY(); + const botY = stave.getBottomLineBottomY(); + staveCtx.fillRect(x - 5, topY, 1, botY - topY); + staveCtx.fillRect(x - 2, topY, 3, botY - topY); + } + drawRepeatBar(stave, x, begin) { + const staveCtx = stave.checkContext(); + const topY = stave.getTopLineTopY(); + const botY = stave.getBottomLineBottomY(); + let x_shift = 3; + if (!begin) { + x_shift = -5; + } + staveCtx.fillRect(x + x_shift, topY, 1, botY - topY); + staveCtx.fillRect(x - 2, topY, 3, botY - topY); + const dot_radius = 2; + if (begin) { + x_shift += 4; + } + else { + x_shift -= 4; + } + const dot_x = x + x_shift + dot_radius / 2; + let y_offset = (stave.getNumLines() - 1) * stave.getSpacingBetweenLines(); + y_offset = y_offset / 2 - stave.getSpacingBetweenLines() / 2; + let dot_y = topY + y_offset + dot_radius / 2; + staveCtx.beginPath(); + staveCtx.arc(dot_x, dot_y, dot_radius, 0, Math.PI * 2, false); + staveCtx.fill(); + dot_y += stave.getSpacingBetweenLines(); + staveCtx.beginPath(); + staveCtx.arc(dot_x, dot_y, dot_radius, 0, Math.PI * 2, false); + staveCtx.fill(); + } +} diff --git a/build/esm/src/staveconnector.js b/build/esm/src/staveconnector.js new file mode 100644 index 0000000000..17be68751c --- /dev/null +++ b/build/esm/src/staveconnector.js @@ -0,0 +1,196 @@ +import { Element } from './element.js'; +import { Font, FontStyle, FontWeight } from './font.js'; +import { Glyph } from './glyph.js'; +import { Tables } from './tables.js'; +import { RuntimeError } from './util.js'; +function drawBoldDoubleLine(ctx, type, topX, topY, botY) { + if (type !== StaveConnector.type.BOLD_DOUBLE_LEFT && type !== StaveConnector.type.BOLD_DOUBLE_RIGHT) { + throw new RuntimeError('InvalidConnector', 'A REPEAT_BEGIN or REPEAT_END type must be provided.'); + } + let x_shift = 3; + let variableWidth = 3.5; + const thickLineOffset = 2; + if (type === StaveConnector.type.BOLD_DOUBLE_RIGHT) { + x_shift = -5; + variableWidth = 3; + } + ctx.fillRect(topX + x_shift, topY, 1, botY - topY); + ctx.fillRect(topX - thickLineOffset, topY, variableWidth, botY - topY); +} +export class StaveConnector extends Element { + constructor(top_stave, bottom_stave) { + super(); + this.thickness = Tables.STAVE_LINE_THICKNESS; + this.width = 3; + this.top_stave = top_stave; + this.bottom_stave = bottom_stave; + this.type = StaveConnector.type.DOUBLE; + this.resetFont(); + this.x_shift = 0; + this.texts = []; + } + static get CATEGORY() { + return "StaveConnector"; + } + setType(type) { + type = typeof type === 'string' ? StaveConnector.typeString[type] : type; + if (type >= StaveConnector.type.SINGLE_RIGHT && type <= StaveConnector.type.NONE) { + this.type = type; + } + return this; + } + setText(text, options = {}) { + this.texts.push({ + content: text, + options: Object.assign({ shift_x: 0, shift_y: 0 }, options), + }); + return this; + } + setXShift(x_shift) { + if (typeof x_shift !== 'number') { + throw new RuntimeError('InvalidType', 'x_shift must be a Number'); + } + this.x_shift = x_shift; + return this; + } + getXShift() { + return this.x_shift; + } + draw() { + const ctx = this.checkContext(); + this.setRendered(); + let topY = this.top_stave.getYForLine(0); + let botY = this.bottom_stave.getYForLine(this.bottom_stave.getNumLines() - 1) + this.thickness; + let width = this.width; + let topX = this.top_stave.getX(); + const isRightSidedConnector = this.type === StaveConnector.type.SINGLE_RIGHT || + this.type === StaveConnector.type.BOLD_DOUBLE_RIGHT || + this.type === StaveConnector.type.THIN_DOUBLE; + if (isRightSidedConnector) { + topX = this.top_stave.getX() + this.top_stave.getWidth(); + } + let attachment_height = botY - topY; + switch (this.type) { + case StaveConnector.type.SINGLE: + width = 1; + break; + case StaveConnector.type.SINGLE_LEFT: + width = 1; + break; + case StaveConnector.type.SINGLE_RIGHT: + width = 1; + break; + case StaveConnector.type.DOUBLE: + topX -= this.width + 2; + topY -= this.thickness; + attachment_height += 0.5; + break; + case StaveConnector.type.BRACE: { + width = 12; + const x1 = this.top_stave.getX() - 2 + this.x_shift; + const y1 = topY; + const x3 = x1; + const y3 = botY; + const x2 = x1 - width; + const y2 = y1 + attachment_height / 2.0; + const cpx1 = x2 - 0.9 * width; + const cpy1 = y1 + 0.2 * attachment_height; + const cpx2 = x1 + 1.1 * width; + const cpy2 = y2 - 0.135 * attachment_height; + const cpx3 = cpx2; + const cpy3 = y2 + 0.135 * attachment_height; + const cpx4 = cpx1; + const cpy4 = y3 - 0.2 * attachment_height; + const cpx5 = x2 - width; + const cpy5 = cpy4; + const cpx6 = x1 + 0.4 * width; + const cpy6 = y2 + 0.135 * attachment_height; + const cpx7 = cpx6; + const cpy7 = y2 - 0.135 * attachment_height; + const cpx8 = cpx5; + const cpy8 = cpy1; + ctx.beginPath(); + ctx.moveTo(x1, y1); + ctx.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, x2, y2); + ctx.bezierCurveTo(cpx3, cpy3, cpx4, cpy4, x3, y3); + ctx.bezierCurveTo(cpx5, cpy5, cpx6, cpy6, x2, y2); + ctx.bezierCurveTo(cpx7, cpy7, cpx8, cpy8, x1, y1); + ctx.fill(); + ctx.stroke(); + break; + } + case StaveConnector.type.BRACKET: + topY -= 6; + botY += 6; + attachment_height = botY - topY; + Glyph.renderGlyph(ctx, topX - 5, topY, 40, 'bracketTop'); + Glyph.renderGlyph(ctx, topX - 5, botY, 40, 'bracketBottom'); + topX -= this.width + 2; + break; + case StaveConnector.type.BOLD_DOUBLE_LEFT: + drawBoldDoubleLine(ctx, this.type, topX + this.x_shift, topY, botY - this.thickness); + break; + case StaveConnector.type.BOLD_DOUBLE_RIGHT: + drawBoldDoubleLine(ctx, this.type, topX, topY, botY - this.thickness); + break; + case StaveConnector.type.THIN_DOUBLE: + width = 1; + attachment_height -= this.thickness; + break; + case StaveConnector.type.NONE: + break; + default: + throw new RuntimeError('InvalidType', `The provided StaveConnector.type (${this.type}) is invalid.`); + } + if (this.type !== StaveConnector.type.BRACE && + this.type !== StaveConnector.type.BOLD_DOUBLE_LEFT && + this.type !== StaveConnector.type.BOLD_DOUBLE_RIGHT && + this.type !== StaveConnector.type.NONE) { + ctx.fillRect(topX, topY, width, attachment_height); + } + if (this.type === StaveConnector.type.THIN_DOUBLE) { + ctx.fillRect(topX - 3, topY, width, attachment_height); + } + ctx.save(); + ctx.setLineWidth(2); + ctx.setFont(this.textFont); + for (let i = 0; i < this.texts.length; i++) { + const text = this.texts[i]; + const text_width = ctx.measureText('' + text.content).width; + const x = this.top_stave.getX() - text_width - 24 + text.options.shift_x; + const y = (this.top_stave.getYForLine(0) + this.bottom_stave.getBottomLineY()) / 2 + text.options.shift_y; + ctx.fillText('' + text.content, x, y + 4); + } + ctx.restore(); + } +} +StaveConnector.TEXT_FONT = { + family: Font.SERIF, + size: 16, + weight: FontWeight.NORMAL, + style: FontStyle.NORMAL, +}; +StaveConnector.type = { + SINGLE_RIGHT: 0, + SINGLE_LEFT: 1, + SINGLE: 1, + DOUBLE: 2, + BRACE: 3, + BRACKET: 4, + BOLD_DOUBLE_LEFT: 5, + BOLD_DOUBLE_RIGHT: 6, + THIN_DOUBLE: 7, + NONE: 8, +}; +StaveConnector.typeString = { + singleRight: StaveConnector.type.SINGLE_RIGHT, + singleLeft: StaveConnector.type.SINGLE_LEFT, + single: StaveConnector.type.SINGLE, + double: StaveConnector.type.DOUBLE, + brace: StaveConnector.type.BRACE, + bracket: StaveConnector.type.BRACKET, + boldDoubleLeft: StaveConnector.type.BOLD_DOUBLE_LEFT, + boldDoubleRight: StaveConnector.type.BOLD_DOUBLE_RIGHT, + thinDouble: StaveConnector.type.THIN_DOUBLE, + none: StaveConnector.type.NONE, +}; diff --git a/build/esm/src/stavehairpin.js b/build/esm/src/stavehairpin.js new file mode 100644 index 0000000000..b5991e8f8e --- /dev/null +++ b/build/esm/src/stavehairpin.js @@ -0,0 +1,120 @@ +import { Element } from './element.js'; +import { Modifier } from './modifier.js'; +import { RuntimeError } from './util.js'; +export class StaveHairpin extends Element { + constructor(notes, type) { + super(); + this.setNotes(notes); + this.hairpin = type; + this.position = Modifier.Position.BELOW; + this.render_options = { + height: 10, + y_shift: 0, + left_shift_px: 0, + right_shift_px: 0, + right_shift_ticks: 0, + left_shift_ticks: 0, + }; + } + static get CATEGORY() { + return "StaveHairpin"; + } + static FormatByTicksAndDraw(ctx, formatter, notes, type, position, options) { + var _a, _b; + const ppt = formatter.pixelsPerTick; + if (ppt == null) { + throw new RuntimeError('BadArguments', 'A valid Formatter must be provide to draw offsets by ticks.'); + } + const l_shift_px = ppt * ((_a = options.left_shift_ticks) !== null && _a !== void 0 ? _a : 0); + const r_shift_px = ppt * ((_b = options.right_shift_ticks) !== null && _b !== void 0 ? _b : 0); + const hairpin_options = { + height: options.height, + y_shift: options.y_shift, + left_shift_px: l_shift_px, + right_shift_px: r_shift_px, + right_shift_ticks: 0, + left_shift_ticks: 0, + }; + new StaveHairpin({ + first_note: notes.first_note, + last_note: notes.last_note, + }, type) + .setContext(ctx) + .setRenderOptions(hairpin_options) + .setPosition(position) + .draw(); + } + setPosition(position) { + if (position === Modifier.Position.ABOVE || position === Modifier.Position.BELOW) { + this.position = position; + } + return this; + } + setRenderOptions(options) { + if (options.height != null && + options.y_shift != null && + options.left_shift_px != null && + options.right_shift_px != null) { + this.render_options = options; + } + return this; + } + setNotes(notes) { + if (!notes.first_note && !notes.last_note) { + throw new RuntimeError('BadArguments', 'Hairpin needs to have either first_note or last_note set.'); + } + this.notes = notes; + this.first_note = notes.first_note; + this.last_note = notes.last_note; + return this; + } + renderHairpin(params) { + const ctx = this.checkContext(); + let dis = this.render_options.y_shift + 20; + let y_shift = params.first_y; + if (this.position === Modifier.Position.ABOVE) { + dis = -dis + 30; + y_shift = params.first_y - params.staff_height; + } + const l_shift = this.render_options.left_shift_px; + const r_shift = this.render_options.right_shift_px; + ctx.beginPath(); + switch (this.hairpin) { + case StaveHairpin.type.CRESC: + ctx.moveTo(params.last_x + r_shift, y_shift + dis); + ctx.lineTo(params.first_x + l_shift, y_shift + this.render_options.height / 2 + dis); + ctx.lineTo(params.last_x + r_shift, y_shift + this.render_options.height + dis); + break; + case StaveHairpin.type.DECRESC: + ctx.moveTo(params.first_x + l_shift, y_shift + dis); + ctx.lineTo(params.last_x + r_shift, y_shift + this.render_options.height / 2 + dis); + ctx.lineTo(params.first_x + l_shift, y_shift + this.render_options.height + dis); + break; + default: + break; + } + ctx.stroke(); + ctx.closePath(); + } + draw() { + this.checkContext(); + this.setRendered(); + const firstNote = this.first_note; + const lastNote = this.last_note; + if (!firstNote || !lastNote) + throw new RuntimeError('NoNote', 'Notes required to draw'); + const start = firstNote.getModifierStartXY(this.position, 0); + const end = lastNote.getModifierStartXY(this.position, 0); + this.renderHairpin({ + first_x: start.x, + last_x: end.x, + first_y: firstNote.checkStave().getY() + firstNote.checkStave().getHeight(), + last_y: lastNote.checkStave().getY() + lastNote.checkStave().getHeight(), + staff_height: firstNote.checkStave().getHeight(), + }); + } +} +StaveHairpin.type = { + CRESC: 1, + DECRESC: 2, +}; diff --git a/build/esm/src/staveline.js b/build/esm/src/staveline.js new file mode 100644 index 0000000000..83108c0b7c --- /dev/null +++ b/build/esm/src/staveline.js @@ -0,0 +1,218 @@ +import { Element } from './element.js'; +import { Tables } from './tables.js'; +import { RuntimeError } from './util.js'; +function drawArrowHead(ctx, x0, y0, x1, y1, x2, y2) { + ctx.beginPath(); + ctx.moveTo(x0, y0); + ctx.lineTo(x1, y1); + ctx.lineTo(x2, y2); + ctx.lineTo(x0, y0); + ctx.closePath(); + ctx.fill(); +} +export class StaveLine extends Element { + constructor(notes) { + super(); + this.setNotes(notes); + this.text = ''; + this.resetFont(); + this.render_options = { + padding_left: 4, + padding_right: 3, + line_width: 1, + line_dash: undefined, + rounded_end: true, + color: undefined, + draw_start_arrow: false, + draw_end_arrow: false, + arrowhead_length: 10, + arrowhead_angle: Math.PI / 8, + text_position_vertical: StaveLine.TextVerticalPosition.TOP, + text_justification: StaveLine.TextJustification.CENTER, + }; + } + static get CATEGORY() { + return "StaveLine"; + } + setText(text) { + this.text = text; + return this; + } + setNotes(notes) { + if (!notes.first_note && !notes.last_note) { + throw new RuntimeError('BadArguments', 'Notes needs to have either first_note or last_note set.'); + } + if (!notes.first_indices) + notes.first_indices = [0]; + if (!notes.last_indices) + notes.last_indices = [0]; + if (notes.first_indices.length !== notes.last_indices.length) { + throw new RuntimeError('BadArguments', 'Connected notes must have same number of indices.'); + } + this.notes = notes; + this.first_note = notes.first_note; + this.first_indices = notes.first_indices; + this.last_note = notes.last_note; + this.last_indices = notes.last_indices; + return this; + } + applyLineStyle() { + const ctx = this.checkContext(); + const render_options = this.render_options; + if (render_options.line_dash) { + ctx.setLineDash(render_options.line_dash); + } + if (render_options.line_width) { + ctx.setLineWidth(render_options.line_width); + } + if (render_options.rounded_end) { + ctx.setLineCap('round'); + } + else { + ctx.setLineCap('square'); + } + } + applyFontStyle() { + const ctx = this.checkContext(); + ctx.setFont(this.textFont); + const render_options = this.render_options; + const color = render_options.color; + if (color) { + ctx.setStrokeStyle(color); + ctx.setFillStyle(color); + } + } + drawArrowLine(ctx, pt1, pt2) { + const both_arrows = this.render_options.draw_start_arrow && this.render_options.draw_end_arrow; + const x1 = pt1.x; + const y1 = pt1.y; + const x2 = pt2.x; + const y2 = pt2.y; + const distance = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); + const ratio = (distance - this.render_options.arrowhead_length / 3) / distance; + let end_x; + let end_y; + let start_x; + let start_y; + if (this.render_options.draw_end_arrow || both_arrows) { + end_x = Math.round(x1 + (x2 - x1) * ratio); + end_y = Math.round(y1 + (y2 - y1) * ratio); + } + else { + end_x = x2; + end_y = y2; + } + if (this.render_options.draw_start_arrow || both_arrows) { + start_x = x1 + (x2 - x1) * (1 - ratio); + start_y = y1 + (y2 - y1) * (1 - ratio); + } + else { + start_x = x1; + start_y = y1; + } + if (this.render_options.color) { + ctx.setStrokeStyle(this.render_options.color); + ctx.setFillStyle(this.render_options.color); + } + ctx.beginPath(); + ctx.moveTo(start_x, start_y); + ctx.lineTo(end_x, end_y); + ctx.stroke(); + ctx.closePath(); + const line_angle = Math.atan2(y2 - y1, x2 - x1); + const h = Math.abs(this.render_options.arrowhead_length / Math.cos(this.render_options.arrowhead_angle)); + let angle1; + let angle2; + let top_x; + let top_y; + let bottom_x; + let bottom_y; + if (this.render_options.draw_end_arrow || both_arrows) { + angle1 = line_angle + Math.PI + this.render_options.arrowhead_angle; + top_x = x2 + Math.cos(angle1) * h; + top_y = y2 + Math.sin(angle1) * h; + angle2 = line_angle + Math.PI - this.render_options.arrowhead_angle; + bottom_x = x2 + Math.cos(angle2) * h; + bottom_y = y2 + Math.sin(angle2) * h; + drawArrowHead(ctx, top_x, top_y, x2, y2, bottom_x, bottom_y); + } + if (this.render_options.draw_start_arrow || both_arrows) { + angle1 = line_angle + this.render_options.arrowhead_angle; + top_x = x1 + Math.cos(angle1) * h; + top_y = y1 + Math.sin(angle1) * h; + angle2 = line_angle - this.render_options.arrowhead_angle; + bottom_x = x1 + Math.cos(angle2) * h; + bottom_y = y1 + Math.sin(angle2) * h; + drawArrowHead(ctx, top_x, top_y, x1, y1, bottom_x, bottom_y); + } + } + draw() { + const ctx = this.checkContext(); + this.setRendered(); + const first_note = this.first_note; + const last_note = this.last_note; + const render_options = this.render_options; + ctx.save(); + this.applyLineStyle(); + let start_position = { x: 0, y: 0 }; + let end_position = { x: 0, y: 0 }; + this.first_indices.forEach((first_index, i) => { + const last_index = this.last_indices[i]; + start_position = first_note.getModifierStartXY(2, first_index); + end_position = last_note.getModifierStartXY(1, last_index); + const upwards_slope = start_position.y > end_position.y; + start_position.x += first_note.getMetrics().modRightPx + render_options.padding_left; + end_position.x -= last_note.getMetrics().modLeftPx + render_options.padding_right; + const notehead_width = first_note.getGlyph().getWidth(); + const first_displaced = first_note.getKeyProps()[first_index].displaced; + if (first_displaced && first_note.getStemDirection() === 1) { + start_position.x += notehead_width + render_options.padding_left; + } + const last_displaced = last_note.getKeyProps()[last_index].displaced; + if (last_displaced && last_note.getStemDirection() === -1) { + end_position.x -= notehead_width + render_options.padding_right; + } + start_position.y += upwards_slope ? -3 : 1; + end_position.y += upwards_slope ? 2 : 0; + this.drawArrowLine(ctx, start_position, end_position); + }); + ctx.restore(); + const text_width = ctx.measureText(this.text).width; + const justification = render_options.text_justification; + let x = 0; + if (justification === StaveLine.TextJustification.LEFT) { + x = start_position.x; + } + else if (justification === StaveLine.TextJustification.CENTER) { + const delta_x = end_position.x - start_position.x; + const center_x = delta_x / 2 + start_position.x; + x = center_x - text_width / 2; + } + else if (justification === StaveLine.TextJustification.RIGHT) { + x = end_position.x - text_width; + } + let y = 0; + const vertical_position = render_options.text_position_vertical; + if (vertical_position === StaveLine.TextVerticalPosition.TOP) { + y = first_note.checkStave().getYForTopText(); + } + else if (vertical_position === StaveLine.TextVerticalPosition.BOTTOM) { + y = first_note.checkStave().getYForBottomText(Tables.TEXT_HEIGHT_OFFSET_HACK); + } + ctx.save(); + this.applyFontStyle(); + ctx.fillText(this.text, x, y); + ctx.restore(); + return this; + } +} +StaveLine.TEXT_FONT = Object.assign({}, Element.TEXT_FONT); +StaveLine.TextVerticalPosition = { + TOP: 1, + BOTTOM: 2, +}; +StaveLine.TextJustification = { + LEFT: 1, + CENTER: 2, + RIGHT: 3, +}; diff --git a/build/esm/src/stavemodifier.js b/build/esm/src/stavemodifier.js new file mode 100644 index 0000000000..e64fd4970a --- /dev/null +++ b/build/esm/src/stavemodifier.js @@ -0,0 +1,77 @@ +import { Element } from './element.js'; +import { defined } from './util.js'; +export var StaveModifierPosition; +(function (StaveModifierPosition) { + StaveModifierPosition[StaveModifierPosition["CENTER"] = 0] = "CENTER"; + StaveModifierPosition[StaveModifierPosition["LEFT"] = 1] = "LEFT"; + StaveModifierPosition[StaveModifierPosition["RIGHT"] = 2] = "RIGHT"; + StaveModifierPosition[StaveModifierPosition["ABOVE"] = 3] = "ABOVE"; + StaveModifierPosition[StaveModifierPosition["BELOW"] = 4] = "BELOW"; + StaveModifierPosition[StaveModifierPosition["BEGIN"] = 5] = "BEGIN"; + StaveModifierPosition[StaveModifierPosition["END"] = 6] = "END"; +})(StaveModifierPosition || (StaveModifierPosition = {})); +export class StaveModifier extends Element { + constructor() { + super(); + this.width = 0; + this.x = 0; + this.padding = 10; + this.position = StaveModifierPosition.ABOVE; + } + static get CATEGORY() { + return "StaveModifier"; + } + static get Position() { + return StaveModifierPosition; + } + getPosition() { + return this.position; + } + setPosition(position) { + this.position = position; + return this; + } + getStave() { + return this.stave; + } + checkStave() { + return defined(this.stave, 'NoStave', 'No stave attached to instance.'); + } + setStave(stave) { + this.stave = stave; + return this; + } + getWidth() { + return this.width; + } + setWidth(width) { + this.width = width; + return this; + } + getX() { + return this.x; + } + setX(x) { + this.x = x; + return this; + } + placeGlyphOnLine(glyph, stave, line, customShift = 0) { + glyph.setYShift(stave.getYForLine(line !== null && line !== void 0 ? line : 0) - stave.getYForGlyphs() + customShift); + } + getPadding(index) { + return index !== undefined && index < 2 ? 0 : this.padding; + } + setPadding(padding) { + this.padding = padding; + return this; + } + setLayoutMetrics(layoutMetrics) { + this.layoutMetrics = layoutMetrics; + return this; + } + getLayoutMetrics() { + return this.layoutMetrics; + } + draw(...args) { + } +} diff --git a/build/esm/src/stavenote.js b/build/esm/src/stavenote.js new file mode 100644 index 0000000000..32230451e7 --- /dev/null +++ b/build/esm/src/stavenote.js @@ -0,0 +1,789 @@ +import { BoundingBox } from './boundingbox.js'; +import { Modifier } from './modifier.js'; +import { NoteHead } from './notehead.js'; +import { Stem } from './stem.js'; +import { StemmableNote } from './stemmablenote.js'; +import { Tables } from './tables.js'; +import { defined, log, midLine, RuntimeError, warn } from './util.js'; +function showDeprecationWarningForNoteHeads() { + console.warn('StaveNote.note_heads is deprecated. Use StaveNote.noteHeads instead.', 'This accessor will be removed in VexFlow 5.0.'); +} +function L(...args) { + if (StaveNote.DEBUG) + log('Vex.Flow.StaveNote', args); +} +const isInnerNoteIndex = (note, index) => index === (note.getStemDirection() === Stem.UP ? note.keyProps.length - 1 : 0); +function shiftRestVertical(rest, note, dir) { + const delta = dir; + rest.line += delta; + rest.maxLine += delta; + rest.minLine += delta; + rest.note.setKeyLine(0, rest.note.getKeyLine(0) + delta); +} +function centerRest(rest, noteU, noteL) { + const delta = rest.line - midLine(noteU.minLine, noteL.maxLine); + rest.note.setKeyLine(0, rest.note.getKeyLine(0) - delta); + rest.line -= delta; + rest.maxLine -= delta; + rest.minLine -= delta; +} +export class StaveNote extends StemmableNote { + constructor(noteStruct) { + var _a, _b, _c; + super(noteStruct); + this.minLine = 0; + this.maxLine = 0; + this.ledgerLineStyle = {}; + this.clef = (_a = noteStruct.clef) !== null && _a !== void 0 ? _a : 'treble'; + this.octave_shift = (_b = noteStruct.octave_shift) !== null && _b !== void 0 ? _b : 0; + this.glyph = Tables.getGlyphProps(this.duration, this.noteType); + defined(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`); + this.displaced = false; + this.dot_shiftY = 0; + this.use_default_head_x = false; + this._noteHeads = []; + this.modifiers = []; + this.render_options = Object.assign(Object.assign({}, this.render_options), { glyph_font_scale: noteStruct.glyph_font_scale || Tables.NOTATION_FONT_SCALE, stroke_px: noteStruct.stroke_px || StaveNote.LEDGER_LINE_OFFSET }); + this.calculateKeyProps(); + this.buildStem(); + if (noteStruct.auto_stem) { + this.autoStem(); + } + else { + this.setStemDirection((_c = noteStruct.stem_direction) !== null && _c !== void 0 ? _c : Stem.UP); + } + this.reset(); + this.buildFlag(); + } + static get CATEGORY() { + return "StaveNote"; + } + static get STEM_UP() { + return Stem.UP; + } + static get STEM_DOWN() { + return Stem.DOWN; + } + static get LEDGER_LINE_OFFSET() { + return 3; + } + static get minNoteheadPadding() { + const musicFont = Tables.currentMusicFont(); + return musicFont.lookupMetric('glyphs.noteHead.minPadding'); + } + static format(notes, state) { + if (!notes || notes.length < 2) + return false; + const notesList = []; + for (let i = 0; i < notes.length; i++) { + const props = notes[i].getKeyProps(); + const line = props[0].line; + let minL = props[props.length - 1].line; + const stemDirection = notes[i].getStemDirection(); + const stemMax = notes[i].getStemLength() / 10; + const stemMin = notes[i].getStemMinimumLength() / 10; + let maxL; + if (notes[i].isRest()) { + maxL = line + notes[i].glyph.line_above; + minL = line - notes[i].glyph.line_below; + } + else { + maxL = stemDirection === 1 ? props[props.length - 1].line + stemMax : props[props.length - 1].line; + minL = stemDirection === 1 ? props[0].line : props[0].line - stemMax; + } + notesList.push({ + line: props[0].line, + maxLine: maxL, + minLine: minL, + isrest: notes[i].isRest(), + stemDirection: stemDirection, + stemMax, + stemMin, + voice_shift: notes[i].getVoiceShiftWidth(), + is_displaced: notes[i].isDisplaced(), + note: notes[i], + }); + } + const voices = notesList.length; + let noteU = notesList[0]; + const noteM = voices > 2 ? notesList[1] : undefined; + let noteL = voices > 2 ? notesList[2] : notesList[1]; + if (voices === 2 && noteU.stemDirection === -1 && noteL.stemDirection === 1) { + noteU = notesList[1]; + noteL = notesList[0]; + } + const voiceXShift = Math.max(noteU.voice_shift, noteL.voice_shift); + let xShift = 0; + if (voices === 2) { + const lineSpacing = noteU.stemDirection === noteL.stemDirection ? 0.0 : 0.5; + if (noteU.minLine <= noteL.maxLine + lineSpacing) { + if (noteU.isrest) { + shiftRestVertical(noteU, noteL, 1); + } + else if (noteL.isrest) { + shiftRestVertical(noteL, noteU, -1); + } + else if (noteU.stemDirection === noteL.stemDirection) { + xShift = voiceXShift + 2; + noteU.note.setXShift(xShift); + } + else { + xShift = voiceXShift + 2; + noteL.note.setXShift(xShift); + } + } + state.right_shift += xShift; + return true; + } + if (!noteM) + throw new RuntimeError('InvalidState', 'noteM not defined.'); + if (noteM.isrest && !noteU.isrest && !noteL.isrest) { + if (noteU.minLine <= noteM.maxLine || noteM.minLine <= noteL.maxLine) { + const restHeight = noteM.maxLine - noteM.minLine; + const space = noteU.minLine - noteL.maxLine; + if (restHeight < space) { + centerRest(noteM, noteU, noteL); + } + else { + xShift = voiceXShift + 2; + noteM.note.setXShift(xShift); + if (noteL.note.hasBeam() === false) { + noteL.stemDirection = -1; + noteL.note.setStemDirection(-1); + } + if (noteU.minLine <= noteL.maxLine && noteU.note.hasBeam() === false) { + noteU.stemDirection = 1; + noteU.note.setStemDirection(1); + } + } + state.right_shift += xShift; + return true; + } + } + if (noteU.isrest && noteM.isrest && noteL.isrest) { + shiftRestVertical(noteU, noteM, 1); + shiftRestVertical(noteL, noteM, -1); + state.right_shift += xShift; + return true; + } + if (noteM.isrest && noteU.isrest && noteM.minLine <= noteL.maxLine) { + shiftRestVertical(noteM, noteL, 1); + } + if (noteM.isrest && noteL.isrest && noteU.minLine <= noteM.maxLine) { + shiftRestVertical(noteM, noteU, -1); + } + if (noteU.isrest && noteU.minLine <= noteM.maxLine) { + shiftRestVertical(noteU, noteM, 1); + } + if (noteL.isrest && noteM.minLine <= noteL.maxLine) { + shiftRestVertical(noteL, noteM, -1); + } + if (noteU.minLine <= noteM.maxLine + 0.5 || noteM.minLine <= noteL.maxLine) { + xShift = voiceXShift + 2; + noteM.note.setXShift(xShift); + if (noteL.note.hasBeam() === false) { + noteL.stemDirection = -1; + noteL.note.setStemDirection(-1); + } + if (noteU.minLine <= noteL.maxLine && noteU.note.hasBeam() === false) { + noteU.stemDirection = 1; + noteU.note.setStemDirection(1); + } + } + state.right_shift += xShift; + return true; + } + static postFormat(notes) { + if (!notes) + return false; + notes.forEach((note) => note.postFormat()); + return true; + } + reset() { + super.reset(); + const noteHeadStyles = this._noteHeads.map((noteHead) => noteHead.getStyle()); + this.buildNoteHeads(); + this._noteHeads.forEach((noteHead, index) => { + const noteHeadStyle = noteHeadStyles[index]; + if (noteHeadStyle) + noteHead.setStyle(noteHeadStyle); + }); + const stave = this.stave; + if (stave) { + this._noteHeads.forEach((head) => head.setStave(stave)); + } + this.calcNoteDisplacements(); + return this; + } + setBeam(beam) { + this.beam = beam; + this.calcNoteDisplacements(); + if (this.stem) { + this.stem.setExtension(this.getStemExtension()); + } + return this; + } + buildStem() { + this.setStem(new Stem({ hide: !!this.isRest() })); + return this; + } + buildNoteHeads() { + this._noteHeads = []; + const stemDirection = this.getStemDirection(); + const keys = this.getKeys(); + let lastLine = undefined; + let lineDiff = undefined; + let displaced = false; + let start; + let end; + let step; + if (stemDirection === Stem.UP) { + start = 0; + end = keys.length; + step = 1; + } + else { + start = keys.length - 1; + end = -1; + step = -1; + } + for (let i = start; i !== end; i += step) { + const noteProps = this.keyProps[i]; + const line = noteProps.line; + if (lastLine === undefined) { + lastLine = line; + } + else { + lineDiff = Math.abs(lastLine - line); + if (lineDiff === 0 || lineDiff === 0.5) { + displaced = !displaced; + } + else { + displaced = false; + this.use_default_head_x = true; + } + } + lastLine = line; + const notehead = new NoteHead({ + duration: this.duration, + note_type: this.noteType, + displaced, + stem_direction: stemDirection, + custom_glyph_code: noteProps.code, + glyph_font_scale: this.render_options.glyph_font_scale, + x_shift: noteProps.shift_right, + stem_up_x_offset: noteProps.stem_up_x_offset, + stem_down_x_offset: noteProps.stem_down_x_offset, + line: noteProps.line, + }); + this._noteHeads[i] = notehead; + } + } + autoStem() { + this.setStemDirection(this.calculateOptimalStemDirection()); + } + calculateOptimalStemDirection() { + this.minLine = this.keyProps[0].line; + this.maxLine = this.keyProps[this.keyProps.length - 1].line; + const MIDDLE_LINE = 3; + const decider = (this.minLine + this.maxLine) / 2; + const stemDirection = decider < MIDDLE_LINE ? Stem.UP : Stem.DOWN; + return stemDirection; + } + calculateKeyProps() { + let lastLine; + for (let i = 0; i < this.keys.length; ++i) { + const key = this.keys[i]; + if (this.glyph.rest) + this.glyph.position = key; + const options = { octave_shift: this.octave_shift || 0 }; + const props = Tables.keyProperties(key, this.clef, options); + if (!props) { + throw new RuntimeError('BadArguments', `Invalid key for note properties: ${key}`); + } + if (props.key === 'R') { + if (this.duration === '1' || this.duration === 'w') { + props.line = 4; + } + else { + props.line = 3; + } + } + const line = props.line; + if (lastLine == undefined) { + lastLine = line; + } + else { + if (Math.abs(lastLine - line) === 0.5) { + this.displaced = true; + props.displaced = true; + if (this.keyProps.length > 0) { + this.keyProps[i - 1].displaced = true; + } + } + } + lastLine = line; + this.keyProps.push(props); + } + lastLine = undefined; + this.keyProps.forEach((key) => { + if (lastLine && key.line < lastLine) { + warn('Unsorted keys in note will be sorted. ' + 'See https://github.com/0xfe/vexflow/issues/104 for details.'); + } + lastLine = key.line; + }); + this.keyProps.sort((a, b) => a.line - b.line); + } + getBoundingBox() { + var _a, _b; + if (!this.preFormatted) { + throw new RuntimeError('UnformattedNote', "Can't call getBoundingBox on an unformatted note."); + } + const { width: w, modLeftPx, leftDisplacedHeadPx } = this.getMetrics(); + const x = this.getAbsoluteX() - modLeftPx - leftDisplacedHeadPx; + let minY = 0; + let maxY = 0; + const halfLineSpacing = ((_b = (_a = this.getStave()) === null || _a === void 0 ? void 0 : _a.getSpacingBetweenLines()) !== null && _b !== void 0 ? _b : 0) / 2; + const lineSpacing = halfLineSpacing * 2; + if (this.isRest()) { + const y = this.ys[0]; + const frac = Tables.durationToFraction(this.duration); + if (frac.equals(1) || frac.equals(2)) { + minY = y - halfLineSpacing; + maxY = y + halfLineSpacing; + } + else { + minY = y - this.glyph.line_above * lineSpacing; + maxY = y + this.glyph.line_below * lineSpacing; + } + } + else if (this.glyph.stem) { + const ys = this.getStemExtents(); + ys.baseY += halfLineSpacing * this.getStemDirection(); + minY = Math.min(ys.topY, ys.baseY); + maxY = Math.max(ys.topY, ys.baseY); + } + else { + minY = 0; + maxY = 0; + for (let i = 0; i < this.ys.length; ++i) { + const yy = this.ys[i]; + if (i === 0) { + minY = yy; + maxY = yy; + } + else { + minY = Math.min(yy, minY); + maxY = Math.max(yy, maxY); + } + } + minY -= halfLineSpacing; + maxY += halfLineSpacing; + } + return new BoundingBox(x, minY, w, maxY - minY); + } + getLineNumber(isTopNote) { + if (!this.keyProps.length) { + throw new RuntimeError('NoKeyProps', "Can't get bottom note line, because note is not initialized properly."); + } + let resultLine = this.keyProps[0].line; + for (let i = 0; i < this.keyProps.length; i++) { + const thisLine = this.keyProps[i].line; + if (isTopNote) { + if (thisLine > resultLine) + resultLine = thisLine; + } + else { + if (thisLine < resultLine) + resultLine = thisLine; + } + } + return resultLine; + } + isRest() { + return this.glyph.rest; + } + isChord() { + return !this.isRest() && this.keys.length > 1; + } + hasStem() { + return this.glyph.stem; + } + hasFlag() { + return super.hasFlag() && !this.isRest(); + } + getStemX() { + if (this.noteType === 'r') { + return this.getCenterGlyphX(); + } + else { + return super.getStemX() + (this.stem_direction ? Stem.WIDTH / (2 * -this.stem_direction) : 0); + } + } + getYForTopText(textLine) { + const extents = this.getStemExtents(); + return Math.min(this.checkStave().getYForTopText(textLine), extents.topY - this.render_options.annotation_spacing * (textLine + 1)); + } + getYForBottomText(textLine) { + const extents = this.getStemExtents(); + return Math.max(this.checkStave().getYForTopText(textLine), extents.baseY + this.render_options.annotation_spacing * textLine); + } + setStave(stave) { + super.setStave(stave); + const ys = this._noteHeads.map((notehead) => { + notehead.setStave(stave); + return notehead.getY(); + }); + this.setYs(ys); + if (this.stem) { + const { y_top, y_bottom } = this.getNoteHeadBounds(); + this.stem.setYBounds(y_top, y_bottom); + } + return this; + } + isDisplaced() { + return this.displaced; + } + setNoteDisplaced(displaced) { + this.displaced = displaced; + return this; + } + getTieRightX() { + let tieStartX = this.getAbsoluteX(); + tieStartX += this.getGlyphWidth() + this.x_shift + this.rightDisplacedHeadPx; + if (this.modifierContext) + tieStartX += this.modifierContext.getRightShift(); + return tieStartX; + } + getTieLeftX() { + let tieEndX = this.getAbsoluteX(); + tieEndX += this.x_shift - this.leftDisplacedHeadPx; + return tieEndX; + } + getLineForRest() { + let restLine = this.keyProps[0].line; + if (this.keyProps.length > 1) { + const lastLine = this.keyProps[this.keyProps.length - 1].line; + const top = Math.max(restLine, lastLine); + const bot = Math.min(restLine, lastLine); + restLine = midLine(top, bot); + } + return restLine; + } + getModifierStartXY(position, index, options = {}) { + var _a, _b; + if (!this.preFormatted) { + throw new RuntimeError('UnformattedNote', "Can't call GetModifierStartXY on an unformatted note"); + } + if (this.ys.length === 0) { + throw new RuntimeError('NoYValues', 'No Y-Values calculated for this note.'); + } + const { ABOVE, BELOW, LEFT, RIGHT } = Modifier.Position; + let x = 0; + if (position === LEFT) { + x = -1 * 2; + } + else if (position === RIGHT) { + x = this.getGlyphWidth() + this.x_shift + 2; + if (this.stem_direction === Stem.UP && + this.hasFlag() && + (options.forceFlagRight || isInnerNoteIndex(this, index))) { + x += (_b = (_a = this === null || this === void 0 ? void 0 : this.flag) === null || _a === void 0 ? void 0 : _a.getMetrics().width) !== null && _b !== void 0 ? _b : 0; + } + } + else if (position === BELOW || position === ABOVE) { + x = this.getGlyphWidth() / 2; + } + return { + x: this.getAbsoluteX() + x, + y: this.ys[index], + }; + } + setStyle(style) { + var _a; + super.setStyle(style); + this._noteHeads.forEach((notehead) => notehead.setStyle(style)); + (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setStyle(style); + return this; + } + setStemStyle(style) { + const stem = this.getStem(); + stem === null || stem === void 0 ? void 0 : stem.setStyle(style); + return this; + } + getStemStyle() { + var _a; + return (_a = this.stem) === null || _a === void 0 ? void 0 : _a.getStyle(); + } + setLedgerLineStyle(style) { + this.ledgerLineStyle = style; + } + getLedgerLineStyle() { + return this.ledgerLineStyle; + } + setFlagStyle(style) { + this.flagStyle = style; + } + getFlagStyle() { + return this.flagStyle; + } + setKeyStyle(index, style) { + this._noteHeads[index].setStyle(style); + return this; + } + setKeyLine(index, line) { + this.keyProps[index].line = line; + this.reset(); + return this; + } + getKeyLine(index) { + return this.keyProps[index].line; + } + getVoiceShiftWidth() { + return this.getGlyphWidth() * (this.displaced ? 2 : 1); + } + calcNoteDisplacements() { + this.setLeftDisplacedHeadPx(this.displaced && this.stem_direction === Stem.DOWN ? this.getGlyphWidth() : 0); + this.setRightDisplacedHeadPx(!this.hasFlag() && this.displaced && this.stem_direction === Stem.UP ? this.getGlyphWidth() : 0); + } + preFormat() { + if (this.preFormatted) + return; + let noteHeadPadding = 0; + if (this.modifierContext) { + this.modifierContext.preFormat(); + if (this.modifierContext.getWidth() === 0) { + noteHeadPadding = StaveNote.minNoteheadPadding; + } + } + let width = this.getGlyphWidth() + this.leftDisplacedHeadPx + this.rightDisplacedHeadPx + noteHeadPadding; + if (this.shouldDrawFlag() && this.stem_direction === Stem.UP) { + width += this.getGlyphWidth(); + } + this.setWidth(width); + this.preFormatted = true; + } + getNoteHeadBounds() { + let yTop = +Infinity; + let yBottom = -Infinity; + let nonDisplacedX; + let displacedX; + let highestLine = this.checkStave().getNumLines(); + let lowestLine = 1; + let highestDisplacedLine; + let lowestDisplacedLine; + let highestNonDisplacedLine = highestLine; + let lowestNonDisplacedLine = lowestLine; + this._noteHeads.forEach((notehead) => { + const line = notehead.getLine(); + const y = notehead.getY(); + yTop = Math.min(y, yTop); + yBottom = Math.max(y, yBottom); + if (displacedX === undefined && notehead.isDisplaced()) { + displacedX = notehead.getAbsoluteX(); + } + if (nonDisplacedX === undefined && !notehead.isDisplaced()) { + nonDisplacedX = notehead.getAbsoluteX(); + } + highestLine = Math.max(line, highestLine); + lowestLine = Math.min(line, lowestLine); + if (notehead.isDisplaced()) { + highestDisplacedLine = highestDisplacedLine === undefined ? line : Math.max(line, highestDisplacedLine); + lowestDisplacedLine = lowestDisplacedLine === undefined ? line : Math.min(line, lowestDisplacedLine); + } + else { + highestNonDisplacedLine = Math.max(line, highestNonDisplacedLine); + lowestNonDisplacedLine = Math.min(line, lowestNonDisplacedLine); + } + }, this); + return { + y_top: yTop, + y_bottom: yBottom, + displaced_x: displacedX, + non_displaced_x: nonDisplacedX, + highest_line: highestLine, + lowest_line: lowestLine, + highest_displaced_line: highestDisplacedLine, + lowest_displaced_line: lowestDisplacedLine, + highest_non_displaced_line: highestNonDisplacedLine, + lowest_non_displaced_line: lowestNonDisplacedLine, + }; + } + getNoteHeadBeginX() { + return this.getAbsoluteX() + this.x_shift; + } + getNoteHeadEndX() { + const xBegin = this.getNoteHeadBeginX(); + return xBegin + this.getGlyphWidth(); + } + get noteHeads() { + return this._noteHeads.slice(); + } + get note_heads() { + showDeprecationWarningForNoteHeads(); + return this.noteHeads; + } + drawLedgerLines() { + const stave = this.checkStave(); + const { glyph, render_options: { stroke_px }, } = this; + const ctx = this.checkContext(); + const width = glyph.getWidth() + stroke_px * 2; + const doubleWidth = 2 * (glyph.getWidth() + stroke_px) - Stem.WIDTH / 2; + if (this.isRest()) + return; + if (!ctx) { + throw new RuntimeError('NoCanvasContext', "Can't draw without a canvas context."); + } + const { highest_line, lowest_line, highest_displaced_line, highest_non_displaced_line, lowest_displaced_line, lowest_non_displaced_line, displaced_x, non_displaced_x, } = this.getNoteHeadBounds(); + if (highest_line < 6 && lowest_line > 0) + return; + const min_x = Math.min(displaced_x !== null && displaced_x !== void 0 ? displaced_x : 0, non_displaced_x !== null && non_displaced_x !== void 0 ? non_displaced_x : 0); + const drawLedgerLine = (y, normal, displaced) => { + let x; + if (displaced && normal) + x = min_x - stroke_px; + else if (normal) + x = (non_displaced_x !== null && non_displaced_x !== void 0 ? non_displaced_x : 0) - stroke_px; + else + x = (displaced_x !== null && displaced_x !== void 0 ? displaced_x : 0) - stroke_px; + const ledgerWidth = normal && displaced ? doubleWidth : width; + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.lineTo(x + ledgerWidth, y); + ctx.stroke(); + }; + const style = Object.assign(Object.assign({}, stave.getDefaultLedgerLineStyle()), this.getLedgerLineStyle()); + this.applyStyle(ctx, style); + for (let line = 6; line <= highest_line; ++line) { + const normal = non_displaced_x !== undefined && line <= highest_non_displaced_line; + const displaced = highest_displaced_line !== undefined && line <= highest_displaced_line; + drawLedgerLine(stave.getYForNote(line), normal, displaced); + } + for (let line = 0; line >= lowest_line; --line) { + const normal = non_displaced_x !== undefined && line >= lowest_non_displaced_line; + const displaced = lowest_displaced_line !== undefined && line >= lowest_displaced_line; + drawLedgerLine(stave.getYForNote(line), normal, displaced); + } + this.restoreStyle(ctx, style); + } + drawModifiers() { + const ctx = this.checkContext(); + ctx.openGroup('modifiers'); + for (let i = 0; i < this.modifiers.length; i++) { + const modifier = this.modifiers[i]; + const index = modifier.checkIndex(); + const notehead = this._noteHeads[index]; + const noteheadStyle = notehead.getStyle(); + notehead.applyStyle(ctx, noteheadStyle); + modifier.setContext(ctx); + modifier.drawWithStyle(); + notehead.restoreStyle(ctx, noteheadStyle); + } + ctx.closeGroup(); + } + shouldDrawFlag() { + const hasStem = this.stem !== undefined; + const hasFlag = this.glyph.flag; + const hasNoBeam = this.beam === undefined; + return hasStem && hasFlag && hasNoBeam; + } + drawFlag() { + var _a; + const ctx = this.checkContext(); + if (!ctx) { + throw new RuntimeError('NoCanvasContext', "Can't draw without a canvas context."); + } + if (this.shouldDrawFlag()) { + const { y_top, y_bottom } = this.getNoteHeadBounds(); + const noteStemHeight = this.stem.getHeight(); + const flagX = this.getStemX(); + const extension = this.flag !== undefined ? this.flag.checkMetrics().y_shift : 0; + const flagY = this.getStemDirection() === Stem.DOWN + ? + y_top - noteStemHeight + 2 - extension + : + y_bottom - noteStemHeight - 2 - extension; + ctx.openGroup('flag', undefined, { pointerBBox: true }); + this.applyStyle(ctx, this.getFlagStyle()); + (_a = this.flag) === null || _a === void 0 ? void 0 : _a.render(ctx, flagX, flagY); + this.restoreStyle(ctx, this.getFlagStyle()); + ctx.closeGroup(); + } + } + drawNoteHeads() { + const ctx = this.checkContext(); + this._noteHeads.forEach((notehead) => { + ctx.openGroup('notehead', undefined, { pointerBBox: true }); + notehead.setContext(ctx).draw(); + ctx.closeGroup(); + }); + } + drawStem(stemOptions) { + var _a; + const ctx = this.checkContext(); + if (stemOptions) { + this.setStem(new Stem(stemOptions)); + } + if (this.shouldDrawFlag() && this.stem) { + this.stem.adjustHeightForFlag(); + } + ctx.openGroup('stem', undefined, { pointerBBox: true }); + (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setContext(ctx).draw(); + ctx.closeGroup(); + } + getStemExtension() { + const super_stem_extension = super.getStemExtension(); + if (!this.glyph.stem) { + return super_stem_extension; + } + const stem_direction = this.getStemDirection(); + if (stem_direction !== this.calculateOptimalStemDirection()) { + return super_stem_extension; + } + let mid_line_distance; + const MIDDLE_LINE = 3; + if (stem_direction === Stem.UP) { + mid_line_distance = MIDDLE_LINE - this.maxLine; + } + else { + mid_line_distance = this.minLine - MIDDLE_LINE; + } + const lines_over_octave_from_mid_line = mid_line_distance - 3.5; + if (lines_over_octave_from_mid_line <= 0) { + return super_stem_extension; + } + const stave = this.getStave(); + let spacing_between_lines = 10; + if (stave != undefined) { + spacing_between_lines = stave.getSpacingBetweenLines(); + } + return super_stem_extension + lines_over_octave_from_mid_line * spacing_between_lines; + } + draw() { + var _a; + if (this.ys.length === 0) { + throw new RuntimeError('NoYValues', "Can't draw note without Y values."); + } + const ctx = this.checkContext(); + const xBegin = this.getNoteHeadBeginX(); + const shouldRenderStem = this.hasStem() && !this.beam; + this._noteHeads.forEach((notehead) => notehead.setX(xBegin)); + const stemX = this.getStemX(); + (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setNoteHeadXBounds(stemX, stemX); + L('Rendering ', this.isChord() ? 'chord :' : 'note :', this.keys); + this.applyStyle(); + this.setAttribute('el', ctx.openGroup('stavenote', this.getAttribute('id'))); + this.drawLedgerLines(); + ctx.openGroup('note', undefined, { pointerBBox: true }); + if (shouldRenderStem) + this.drawStem(); + this.drawNoteHeads(); + this.drawFlag(); + ctx.closeGroup(); + this.drawModifiers(); + ctx.closeGroup(); + this.restoreStyle(); + this.setRendered(); + } +} +StaveNote.DEBUG = false; diff --git a/build/esm/src/staverepetition.js b/build/esm/src/staverepetition.js new file mode 100644 index 0000000000..e36985fb9d --- /dev/null +++ b/build/esm/src/staverepetition.js @@ -0,0 +1,155 @@ +import { Font, FontStyle, FontWeight } from './font.js'; +import { Glyph } from './glyph.js'; +import { StaveModifier } from './stavemodifier.js'; +import { Tables } from './tables.js'; +export class Repetition extends StaveModifier { + constructor(type, x, y_shift) { + super(); + this.symbol_type = type; + this.x = x; + this.x_shift = 0; + this.y_shift = y_shift; + this.resetFont(); + } + static get CATEGORY() { + return "Repetition"; + } + setShiftX(x) { + this.x_shift = x; + return this; + } + setShiftY(y) { + this.y_shift = y; + return this; + } + draw(stave, x) { + this.setRendered(); + switch (this.symbol_type) { + case Repetition.type.CODA_RIGHT: + this.drawCodaFixed(stave, x + stave.getWidth()); + break; + case Repetition.type.CODA_LEFT: + this.drawSymbolText(stave, x, 'Coda', true); + break; + case Repetition.type.SEGNO_LEFT: + this.drawSignoFixed(stave, x); + break; + case Repetition.type.SEGNO_RIGHT: + this.drawSignoFixed(stave, x + stave.getWidth()); + break; + case Repetition.type.DC: + this.drawSymbolText(stave, x, 'D.C.', false); + break; + case Repetition.type.DC_AL_CODA: + this.drawSymbolText(stave, x, 'D.C. al', true); + break; + case Repetition.type.DC_AL_FINE: + this.drawSymbolText(stave, x, 'D.C. al Fine', false); + break; + case Repetition.type.DS: + this.drawSymbolText(stave, x, 'D.S.', false); + break; + case Repetition.type.DS_AL_CODA: + this.drawSymbolText(stave, x, 'D.S. al', true); + break; + case Repetition.type.DS_AL_FINE: + this.drawSymbolText(stave, x, 'D.S. al Fine', false); + break; + case Repetition.type.FINE: + this.drawSymbolText(stave, x, 'Fine', false); + break; + case Repetition.type.TO_CODA: + this.drawSymbolText(stave, x, 'To', true); + break; + default: + break; + } + return this; + } + drawCodaFixed(stave, x) { + const y = stave.getYForTopText(stave.getNumLines()) + this.y_shift; + Glyph.renderGlyph(stave.checkContext(), this.x + x + this.x_shift, y + Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY'), 40, 'coda', { category: 'coda' }); + return this; + } + drawSignoFixed(stave, x) { + const y = stave.getYForTopText(stave.getNumLines()) + this.y_shift; + Glyph.renderGlyph(stave.checkContext(), this.x + x + this.x_shift, y + Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY'), 30, 'segno', { category: 'segno' }); + return this; + } + drawSymbolText(stave, x, text, draw_coda) { + const ctx = stave.checkContext(); + ctx.save(); + ctx.setFont(this.textFont); + let text_x = 0; + let symbol_x = 0; + const modifierWidth = stave.getNoteStartX() - this.x; + switch (this.symbol_type) { + case Repetition.type.CODA_LEFT: + text_x = this.x + stave.getVerticalBarWidth(); + symbol_x = + text_x + + ctx.measureText(text).width + + Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol'); + break; + case Repetition.type.DC: + case Repetition.type.DC_AL_FINE: + case Repetition.type.DS: + case Repetition.type.DS_AL_FINE: + case Repetition.type.FINE: + text_x = + this.x + + x + + this.x_shift + + stave.getWidth() - + Tables.currentMusicFont().lookupMetric('staveRepetition.default.spacing') - + modifierWidth - + ctx.measureText(text).width; + break; + default: + text_x = + this.x + + x + + this.x_shift + + stave.getWidth() - + Tables.currentMusicFont().lookupMetric('staveRepetition.default.spacing') - + modifierWidth - + ctx.measureText(text).width - + Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol'); + symbol_x = + text_x + + ctx.measureText(text).width + + Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetSymbol'); + break; + } + const y = stave.getYForTopText(stave.getNumLines()) + + this.y_shift + + Tables.currentMusicFont().lookupMetric('staveRepetition.default.offsetY'); + if (draw_coda) { + Glyph.renderGlyph(ctx, symbol_x, y, 40, 'coda', { category: 'coda' }); + } + ctx.fillText(text, text_x, y + 5); + ctx.restore(); + return this; + } +} +Repetition.TEXT_FONT = { + family: Font.SERIF, + size: 12, + weight: FontWeight.BOLD, + style: FontStyle.NORMAL, +}; +Repetition.type = { + NONE: 1, + CODA_LEFT: 2, + CODA_RIGHT: 3, + SEGNO_LEFT: 4, + SEGNO_RIGHT: 5, + DC: 6, + DC_AL_CODA: 7, + DC_AL_FINE: 8, + DS: 9, + DS_AL_CODA: 10, + DS_AL_FINE: 11, + FINE: 12, + TO_CODA: 13, +}; diff --git a/build/esm/src/stavesection.js b/build/esm/src/stavesection.js new file mode 100644 index 0000000000..096e06157a --- /dev/null +++ b/build/esm/src/stavesection.js @@ -0,0 +1,58 @@ +import { Font, FontStyle, FontWeight } from './font.js'; +import { StaveModifier } from './stavemodifier.js'; +export class StaveSection extends StaveModifier { + constructor(section, x, shift_y) { + super(); + this.setWidth(16); + this.section = section; + this.x = x; + this.shift_x = 0; + this.shift_y = shift_y; + this.resetFont(); + } + static get CATEGORY() { + return "StaveSection"; + } + setStaveSection(section) { + this.section = section; + return this; + } + setShiftX(x) { + this.shift_x = x; + return this; + } + setShiftY(y) { + this.shift_y = y; + return this; + } + draw(stave, shift_x) { + const ctx = stave.checkContext(); + this.setRendered(); + ctx.save(); + ctx.setLineWidth(2); + ctx.setFont(this.textFont); + const paddingX = 2; + const paddingY = 2; + const rectWidth = 2; + const textMeasurements = ctx.measureText(this.section); + const textWidth = textMeasurements.width; + const textHeight = textMeasurements.height; + const width = textWidth + 2 * paddingX; + const height = textHeight + 2 * paddingY; + const y = stave.getYForTopText(2) + this.shift_y; + const x = this.x + shift_x; + ctx.beginPath(); + ctx.setLineWidth(rectWidth); + ctx.rect(x, y + textMeasurements.y - paddingY, width, height); + ctx.stroke(); + ctx.fillText(this.section, x + paddingX, y); + ctx.restore(); + return this; + } +} +StaveSection.TEXT_FONT = { + family: Font.SANS_SERIF, + size: 10, + weight: FontWeight.BOLD, + style: FontStyle.NORMAL, +}; diff --git a/build/esm/src/stavetempo.js b/build/esm/src/stavetempo.js new file mode 100644 index 0000000000..3489a05d46 --- /dev/null +++ b/build/esm/src/stavetempo.js @@ -0,0 +1,91 @@ +import { Font, FontStyle, FontWeight } from './font.js'; +import { Glyph } from './glyph.js'; +import { StaveModifier, StaveModifierPosition } from './stavemodifier.js'; +import { Tables } from './tables.js'; +export class StaveTempo extends StaveModifier { + constructor(tempo, x, shift_y) { + super(); + this.render_options = { glyph_font_scale: 30 }; + this.tempo = tempo; + this.position = StaveModifierPosition.ABOVE; + this.x = x; + this.shift_x = 10; + this.shift_y = shift_y; + this.resetFont(); + } + static get CATEGORY() { + return "StaveTempo"; + } + setTempo(tempo) { + this.tempo = tempo; + return this; + } + setShiftX(x) { + this.shift_x = x; + return this; + } + setShiftY(y) { + this.shift_y = y; + return this; + } + draw(stave, shift_x) { + const ctx = stave.checkContext(); + this.setRendered(); + const options = this.render_options; + const scale = options.glyph_font_scale / 38; + const name = this.tempo.name; + const duration = this.tempo.duration; + const dots = this.tempo.dots || 0; + const bpm = this.tempo.bpm; + let x = this.x + this.shift_x + shift_x; + const y = stave.getYForTopText(1) + this.shift_y; + ctx.save(); + if (name) { + ctx.setFont(this.textFont); + ctx.fillText(name, x, y); + x += ctx.measureText(name).width; + } + if (duration && bpm) { + ctx.setFont(Object.assign(Object.assign({}, this.textFont), { weight: 'normal', style: 'normal' })); + if (name) { + x += ctx.measureText(' ').width; + ctx.fillText('(', x, y); + x += ctx.measureText('(').width; + } + const code = Tables.getGlyphProps(duration); + x += 3 * scale; + Glyph.renderGlyph(ctx, x, y, options.glyph_font_scale, code.code_head); + x += code.getWidth() * scale; + if (code.stem) { + let stem_height = 30; + if (code.beam_count) + stem_height += 3 * (code.beam_count - 1); + stem_height *= scale; + const y_top = y - stem_height; + ctx.fillRect(x - scale, y_top, scale, stem_height); + if (code.flag) { + Glyph.renderGlyph(ctx, x, y_top, options.glyph_font_scale, code.code_flag_upstem, { + category: 'flag.staveTempo', + }); + if (!dots) + x += 6 * scale; + } + } + for (let i = 0; i < dots; i++) { + x += 6 * scale; + ctx.beginPath(); + ctx.arc(x, y + 2 * scale, 2 * scale, 0, Math.PI * 2, false); + ctx.fill(); + } + ctx.fillText(' = ' + bpm + (name ? ')' : ''), x + 3 * scale, y); + } + ctx.restore(); + return this; + } +} +StaveTempo.TEXT_FONT = { + family: Font.SERIF, + size: 14, + weight: FontWeight.BOLD, + style: FontStyle.NORMAL, +}; diff --git a/build/esm/src/stavetext.js b/build/esm/src/stavetext.js new file mode 100644 index 0000000000..5861634ff7 --- /dev/null +++ b/build/esm/src/stavetext.js @@ -0,0 +1,82 @@ +import { Font, FontStyle, FontWeight } from './font.js'; +import { StaveModifier, StaveModifierPosition } from './stavemodifier.js'; +import { Justification, TextNote } from './textnote.js'; +import { RuntimeError } from './util.js'; +export class StaveText extends StaveModifier { + constructor(text, position, options = {}) { + super(); + this.setWidth(16); + this.text = text; + this.position = position; + this.options = Object.assign({ shift_x: 0, shift_y: 0, justification: TextNote.Justification.CENTER }, options); + this.resetFont(); + } + static get CATEGORY() { + return "StaveText"; + } + setStaveText(text) { + this.text = text; + return this; + } + setShiftX(x) { + this.shift_x = x; + return this; + } + setShiftY(y) { + this.shift_y = y; + return this; + } + setText(text) { + this.text = text; + return this; + } + draw(stave) { + const ctx = stave.checkContext(); + this.setRendered(); + ctx.save(); + ctx.setLineWidth(2); + ctx.setFont(this.textFont); + const text_width = ctx.measureText('' + this.text).width; + let x; + let y; + switch (this.position) { + case StaveModifierPosition.LEFT: + case StaveModifierPosition.RIGHT: + y = (stave.getYForLine(0) + stave.getBottomLineY()) / 2 + this.options.shift_y; + if (this.position === StaveModifierPosition.LEFT) { + x = stave.getX() - text_width - 24 + this.options.shift_x; + } + else { + x = stave.getX() + stave.getWidth() + 24 + this.options.shift_x; + } + break; + case StaveModifierPosition.ABOVE: + case StaveModifierPosition.BELOW: + x = stave.getX() + this.options.shift_x; + if (this.options.justification === Justification.CENTER) { + x += stave.getWidth() / 2 - text_width / 2; + } + else if (this.options.justification === Justification.RIGHT) { + x += stave.getWidth() - text_width; + } + if (this.position === StaveModifierPosition.ABOVE) { + y = stave.getYForTopText(2) + this.options.shift_y; + } + else { + y = stave.getYForBottomText(2) + this.options.shift_y; + } + break; + default: + throw new RuntimeError('InvalidPosition', 'Value Must be in Modifier.Position.'); + } + ctx.fillText('' + this.text, x, y + 4); + ctx.restore(); + return this; + } +} +StaveText.TEXT_FONT = { + family: Font.SERIF, + size: 16, + weight: FontWeight.NORMAL, + style: FontStyle.NORMAL, +}; diff --git a/build/esm/src/stavetie.js b/build/esm/src/stavetie.js new file mode 100644 index 0000000000..11491a94e2 --- /dev/null +++ b/build/esm/src/stavetie.js @@ -0,0 +1,139 @@ +import { Element } from './element.js'; +import { RuntimeError } from './util.js'; +export class StaveTie extends Element { + constructor(notes, text) { + super(); + this.setNotes(notes); + this.text = text; + this.render_options = { + cp1: 8, + cp2: 12, + text_shift_x: 0, + first_x_shift: 0, + last_x_shift: 0, + y_shift: 7, + tie_spacing: 0, + }; + this.resetFont(); + } + static get CATEGORY() { + return "StaveTie"; + } + setDirection(direction) { + this.direction = direction; + return this; + } + setNotes(notes) { + if (!notes.first_note && !notes.last_note) { + throw new RuntimeError('BadArguments', 'Tie needs to have either first_note or last_note set.'); + } + if (!notes.first_indices) { + notes.first_indices = [0]; + } + if (!notes.last_indices) { + notes.last_indices = [0]; + } + if (notes.first_indices.length !== notes.last_indices.length) { + throw new RuntimeError('BadArguments', 'Tied notes must have same number of indices.'); + } + this.notes = notes; + return this; + } + isPartial() { + return !this.notes.first_note || !this.notes.last_note; + } + renderTie(params) { + if (params.first_ys.length === 0 || params.last_ys.length === 0) { + throw new RuntimeError('BadArguments', 'No Y-values to render'); + } + const ctx = this.checkContext(); + let cp1 = this.render_options.cp1; + let cp2 = this.render_options.cp2; + if (Math.abs(params.last_x_px - params.first_x_px) < 10) { + cp1 = 2; + cp2 = 8; + } + const first_x_shift = this.render_options.first_x_shift; + const last_x_shift = this.render_options.last_x_shift; + const y_shift = this.render_options.y_shift * params.direction; + const first_indices = this.notes.first_indices; + const last_indices = this.notes.last_indices; + for (let i = 0; i < first_indices.length; ++i) { + const cp_x = (params.last_x_px + last_x_shift + (params.first_x_px + first_x_shift)) / 2; + const first_y_px = params.first_ys[first_indices[i]] + y_shift; + const last_y_px = params.last_ys[last_indices[i]] + y_shift; + if (isNaN(first_y_px) || isNaN(last_y_px)) { + throw new RuntimeError('BadArguments', 'Bad indices for tie rendering.'); + } + const top_cp_y = (first_y_px + last_y_px) / 2 + cp1 * params.direction; + const bottom_cp_y = (first_y_px + last_y_px) / 2 + cp2 * params.direction; + ctx.beginPath(); + ctx.moveTo(params.first_x_px + first_x_shift, first_y_px); + ctx.quadraticCurveTo(cp_x, top_cp_y, params.last_x_px + last_x_shift, last_y_px); + ctx.quadraticCurveTo(cp_x, bottom_cp_y, params.first_x_px + first_x_shift, first_y_px); + ctx.closePath(); + ctx.fill(); + } + } + renderText(first_x_px, last_x_px) { + var _a, _b, _c; + if (!this.text) + return; + const ctx = this.checkContext(); + let center_x = (first_x_px + last_x_px) / 2; + center_x -= ctx.measureText(this.text).width / 2; + const stave = (_b = (_a = this.notes.first_note) === null || _a === void 0 ? void 0 : _a.checkStave()) !== null && _b !== void 0 ? _b : (_c = this.notes.last_note) === null || _c === void 0 ? void 0 : _c.checkStave(); + if (stave) { + ctx.save(); + ctx.setFont(this.textFont); + ctx.fillText(this.text, center_x + this.render_options.text_shift_x, stave.getYForTopText() - 1); + ctx.restore(); + } + } + draw() { + this.checkContext(); + this.setRendered(); + const first_note = this.notes.first_note; + const last_note = this.notes.last_note; + let first_x_px = 0; + let last_x_px = 0; + let first_ys = [0]; + let last_ys = [0]; + let stem_direction = 0; + if (first_note) { + first_x_px = first_note.getTieRightX() + this.render_options.tie_spacing; + stem_direction = first_note.getStemDirection(); + first_ys = first_note.getYs(); + } + else if (last_note) { + const stave = last_note.checkStave(); + first_x_px = stave.getTieStartX(); + first_ys = last_note.getYs(); + this.notes.first_indices = this.notes.last_indices; + } + if (last_note) { + last_x_px = last_note.getTieLeftX() + this.render_options.tie_spacing; + stem_direction = last_note.getStemDirection(); + last_ys = last_note.getYs(); + } + else if (first_note) { + const stave = first_note.checkStave(); + last_x_px = stave.getTieEndX(); + last_ys = first_note.getYs(); + this.notes.last_indices = this.notes.first_indices; + } + if (this.direction) { + stem_direction = this.direction; + } + this.renderTie({ + first_x_px, + last_x_px, + first_ys, + last_ys, + direction: stem_direction, + }); + this.renderText(first_x_px, last_x_px); + return true; + } +} +StaveTie.TEXT_FONT = Object.assign({}, Element.TEXT_FONT); diff --git a/build/esm/src/stavevolta.js b/build/esm/src/stavevolta.js new file mode 100644 index 0000000000..fa39fdd50f --- /dev/null +++ b/build/esm/src/stavevolta.js @@ -0,0 +1,67 @@ +import { Font, FontStyle, FontWeight } from './font.js'; +import { StaveModifier } from './stavemodifier.js'; +export var VoltaType; +(function (VoltaType) { + VoltaType[VoltaType["NONE"] = 1] = "NONE"; + VoltaType[VoltaType["BEGIN"] = 2] = "BEGIN"; + VoltaType[VoltaType["MID"] = 3] = "MID"; + VoltaType[VoltaType["END"] = 4] = "END"; + VoltaType[VoltaType["BEGIN_END"] = 5] = "BEGIN_END"; +})(VoltaType || (VoltaType = {})); +export class Volta extends StaveModifier { + constructor(type, number, x, y_shift) { + super(); + this.volta = type; + this.x = x; + this.y_shift = y_shift; + this.number = number; + this.resetFont(); + } + static get CATEGORY() { + return "Volta"; + } + static get type() { + return VoltaType; + } + setShiftY(y) { + this.y_shift = y; + return this; + } + draw(stave, x) { + const ctx = stave.checkContext(); + this.setRendered(); + let width = stave.getWidth() - x; + const top_y = stave.getYForTopText(stave.getNumLines()) + this.y_shift; + const vert_height = 1.5 * stave.getSpacingBetweenLines(); + switch (this.volta) { + case VoltaType.BEGIN: + ctx.fillRect(this.x + x, top_y, 1, vert_height); + break; + case VoltaType.END: + width -= 5; + ctx.fillRect(this.x + x + width, top_y, 1, vert_height); + break; + case VoltaType.BEGIN_END: + width -= 3; + ctx.fillRect(this.x + x, top_y, 1, vert_height); + ctx.fillRect(this.x + x + width, top_y, 1, vert_height); + break; + default: + break; + } + if (this.volta === VoltaType.BEGIN || this.volta === VoltaType.BEGIN_END) { + ctx.save(); + ctx.setFont(this.textFont); + ctx.fillText(this.number, this.x + x + 5, top_y + 15); + ctx.restore(); + } + ctx.fillRect(this.x + x, top_y, width, 1); + return this; + } +} +Volta.TEXT_FONT = { + family: Font.SANS_SERIF, + size: 9, + weight: FontWeight.BOLD, + style: FontStyle.NORMAL, +}; diff --git a/build/esm/src/stem.js b/build/esm/src/stem.js new file mode 100644 index 0000000000..f284c5ef5a --- /dev/null +++ b/build/esm/src/stem.js @@ -0,0 +1,131 @@ +import { Element } from './element.js'; +import { Tables } from './tables.js'; +import { log, RuntimeError } from './util.js'; +function L(...args) { + if (Stem.DEBUG) + log('Vex.Flow.Stem', args); +} +export class Stem extends Element { + constructor(options) { + super(); + this.stem_up_y_offset = 0; + this.stem_down_y_offset = 0; + this.stem_up_y_base_offset = 0; + this.stem_down_y_base_offset = 0; + this.x_begin = (options === null || options === void 0 ? void 0 : options.x_begin) || 0; + this.x_end = (options === null || options === void 0 ? void 0 : options.x_end) || 0; + this.y_top = (options === null || options === void 0 ? void 0 : options.y_top) || 0; + this.y_bottom = (options === null || options === void 0 ? void 0 : options.y_bottom) || 0; + this.stem_extension = (options === null || options === void 0 ? void 0 : options.stem_extension) || 0; + this.stem_direction = (options === null || options === void 0 ? void 0 : options.stem_direction) || 0; + this.hide = (options === null || options === void 0 ? void 0 : options.hide) || false; + this.isStemlet = (options === null || options === void 0 ? void 0 : options.isStemlet) || false; + this.stemletHeight = (options === null || options === void 0 ? void 0 : options.stemletHeight) || 0; + this.renderHeightAdjustment = 0; + this.setOptions(options); + } + static get CATEGORY() { + return "Stem"; + } + static get UP() { + return 1; + } + static get DOWN() { + return -1; + } + static get WIDTH() { + return Tables.STEM_WIDTH; + } + static get HEIGHT() { + return Tables.STEM_HEIGHT; + } + setOptions(options) { + this.stem_up_y_offset = (options === null || options === void 0 ? void 0 : options.stem_up_y_offset) || 0; + this.stem_down_y_offset = (options === null || options === void 0 ? void 0 : options.stem_down_y_offset) || 0; + this.stem_up_y_base_offset = (options === null || options === void 0 ? void 0 : options.stem_up_y_base_offset) || 0; + this.stem_down_y_base_offset = (options === null || options === void 0 ? void 0 : options.stem_down_y_base_offset) || 0; + } + setNoteHeadXBounds(x_begin, x_end) { + this.x_begin = x_begin; + this.x_end = x_end; + return this; + } + setDirection(direction) { + this.stem_direction = direction; + } + setExtension(ext) { + this.stem_extension = ext; + } + getExtension() { + return this.stem_extension; + } + setYBounds(y_top, y_bottom) { + this.y_top = y_top; + this.y_bottom = y_bottom; + } + getHeight() { + const y_offset = this.stem_direction === Stem.UP ? this.stem_up_y_offset : this.stem_down_y_offset; + const unsigned_height = this.y_bottom - this.y_top + (Stem.HEIGHT - y_offset + this.stem_extension); + return unsigned_height * this.stem_direction; + } + getBoundingBox() { + throw new RuntimeError('NotImplemented', 'getBoundingBox() not implemented.'); + } + getExtents() { + const isStemUp = this.stem_direction === Stem.UP; + const ys = [this.y_top, this.y_bottom]; + const stemHeight = Stem.HEIGHT + this.stem_extension; + const innerMostNoteheadY = (isStemUp ? Math.min : Math.max)(...ys); + const outerMostNoteheadY = (isStemUp ? Math.max : Math.min)(...ys); + const stemTipY = innerMostNoteheadY + stemHeight * -this.stem_direction; + return { topY: stemTipY, baseY: outerMostNoteheadY }; + } + setVisibility(isVisible) { + this.hide = !isVisible; + return this; + } + setStemlet(isStemlet, stemletHeight) { + this.isStemlet = isStemlet; + this.stemletHeight = stemletHeight; + return this; + } + adjustHeightForFlag() { + this.renderHeightAdjustment = Tables.currentMusicFont().lookupMetric('stem.heightAdjustmentForFlag', -3); + } + adjustHeightForBeam() { + this.renderHeightAdjustment = -Stem.WIDTH / 2; + } + draw() { + this.setRendered(); + if (this.hide) + return; + const ctx = this.checkContext(); + let stem_x; + let stem_y; + const stem_direction = this.stem_direction; + let y_base_offset = 0; + if (stem_direction === Stem.DOWN) { + stem_x = this.x_begin; + stem_y = this.y_top + this.stem_down_y_offset; + y_base_offset = this.stem_down_y_base_offset; + } + else { + stem_x = this.x_end; + stem_y = this.y_bottom - this.stem_up_y_offset; + y_base_offset = this.stem_up_y_base_offset; + } + const stemHeight = this.getHeight(); + L('Rendering stem - ', 'Top Y: ', this.y_top, 'Bottom Y: ', this.y_bottom); + const stemletYOffset = this.isStemlet ? stemHeight - this.stemletHeight * this.stem_direction : 0; + ctx.save(); + this.applyStyle(ctx); + ctx.beginPath(); + ctx.setLineWidth(Stem.WIDTH); + ctx.moveTo(stem_x, stem_y - stemletYOffset + y_base_offset); + ctx.lineTo(stem_x, stem_y - stemHeight - this.renderHeightAdjustment * stem_direction); + ctx.stroke(); + this.restoreStyle(ctx); + ctx.restore(); + } +} +Stem.DEBUG = false; diff --git a/build/esm/src/stemmablenote.js b/build/esm/src/stemmablenote.js new file mode 100644 index 0000000000..504cf1f195 --- /dev/null +++ b/build/esm/src/stemmablenote.js @@ -0,0 +1,191 @@ +import { Glyph } from './glyph.js'; +import { Note } from './note.js'; +import { Stem } from './stem.js'; +import { Tables } from './tables.js'; +import { RuntimeError } from './util.js'; +export class StemmableNote extends Note { + constructor(noteStruct) { + super(noteStruct); + } + static get CATEGORY() { + return "StemmableNote"; + } + getStem() { + return this.stem; + } + checkStem() { + if (!this.stem) { + throw new RuntimeError('NoStem', 'No stem attached to instance'); + } + return this.stem; + } + setStem(stem) { + this.stem = stem; + return this; + } + buildStem() { + const stem = new Stem(); + this.setStem(stem); + return this; + } + buildFlag(category = 'flag') { + const { glyph } = this; + if (this.hasFlag()) { + const flagCode = this.getStemDirection() === Stem.DOWN ? glyph.code_flag_downstem : glyph.code_flag_upstem; + this.flag = new Glyph(flagCode, this.render_options.glyph_font_scale, { category }); + } + } + getBaseCustomNoteHeadGlyph() { + if (this.getStemDirection() === Stem.DOWN) { + return this.customGlyphs[this.customGlyphs.length - 1]; + } + else { + return this.customGlyphs[0]; + } + } + getStemLength() { + return Stem.HEIGHT + this.getStemExtension(); + } + getBeamCount() { + const glyph = this.getGlyph(); + if (glyph) { + return glyph.beam_count; + } + else { + return 0; + } + } + getStemMinimumLength() { + const frac = Tables.durationToFraction(this.duration); + let length = frac.value() <= 1 ? 0 : 20; + switch (this.duration) { + case '8': + if (this.beam == undefined) + length = 35; + break; + case '16': + length = this.beam == undefined ? 35 : 25; + break; + case '32': + length = this.beam == undefined ? 45 : 35; + break; + case '64': + length = this.beam == undefined ? 50 : 40; + break; + case '128': + length = this.beam == undefined ? 55 : 45; + break; + default: + break; + } + return length; + } + getStemDirection() { + if (!this.stem_direction) + throw new RuntimeError('NoStem', 'No stem attached to this note.'); + return this.stem_direction; + } + setStemDirection(direction) { + if (!direction) + direction = Stem.UP; + if (direction !== Stem.UP && direction !== Stem.DOWN) { + throw new RuntimeError('BadArgument', `Invalid stem direction: ${direction}`); + } + this.stem_direction = direction; + this.reset(); + if (this.hasFlag()) { + this.buildFlag(); + } + this.beam = undefined; + if (this.stem) { + this.stem.setDirection(direction); + this.stem.setExtension(this.getStemExtension()); + const glyph = this.getBaseCustomNoteHeadGlyph() || this.getGlyph(); + const offsets = Tables.currentMusicFont().lookupMetric(`stem.noteHead.${glyph.code_head}`, { + offsetYBaseStemUp: 0, + offsetYTopStemUp: 0, + offsetYBaseStemDown: 0, + offsetYTopStemDown: 0, + }); + this.stem.setOptions({ + stem_up_y_offset: offsets.offsetYTopStemUp, + stem_down_y_offset: offsets.offsetYTopStemDown, + stem_up_y_base_offset: offsets.offsetYBaseStemUp, + stem_down_y_base_offset: offsets.offsetYBaseStemDown, + }); + } + if (this.preFormatted) { + this.preFormat(); + } + return this; + } + getStemX() { + const x_begin = this.getAbsoluteX() + this.x_shift; + const x_end = this.getAbsoluteX() + this.x_shift + this.getGlyphWidth(); + const stem_x = this.stem_direction === Stem.DOWN ? x_begin : x_end; + return stem_x; + } + getCenterGlyphX() { + return this.getAbsoluteX() + this.x_shift + this.getGlyphWidth() / 2; + } + getStemExtension() { + const glyph = this.getGlyph(); + if (this.stem_extension_override != undefined) { + return this.stem_extension_override; + } + if (this.beam) { + return glyph.stem_beam_extension; + } + const flagCode = this.getStemDirection() === Stem.DOWN ? this.glyph.code_flag_downstem : this.glyph.code_flag_upstem; + return Math.abs(Tables.currentMusicFont().lookupMetric(`glyphs.flag.${flagCode}.shiftY`, 0)); + } + setStemLength(height) { + this.stem_extension_override = height - Stem.HEIGHT; + return this; + } + getStemExtents() { + if (!this.stem) + throw new RuntimeError('NoStem', 'No stem attached to this note.'); + return this.stem.getExtents(); + } + getYForTopText(textLine) { + const stave = this.checkStave(); + if (this.hasStem()) { + const extents = this.getStemExtents(); + if (!extents) + throw new RuntimeError('InvalidState', 'Stem does not have extents.'); + return Math.min(stave.getYForTopText(textLine), extents.topY - this.render_options.annotation_spacing * (textLine + 1)); + } + else { + return stave.getYForTopText(textLine); + } + } + getYForBottomText(textLine) { + const stave = this.checkStave(); + if (this.hasStem()) { + const extents = this.getStemExtents(); + if (!extents) + throw new RuntimeError('InvalidState', 'Stem does not have extents.'); + return Math.max(stave.getYForTopText(textLine), extents.baseY + this.render_options.annotation_spacing * textLine); + } + else { + return stave.getYForBottomText(textLine); + } + } + hasFlag() { + return Tables.getGlyphProps(this.duration).flag && !this.beam; + } + postFormat() { + var _a; + (_a = this.beam) === null || _a === void 0 ? void 0 : _a.postFormat(); + this.postFormatted = true; + return this; + } + drawStem(stemOptions) { + var _a; + this.checkContext(); + this.setRendered(); + this.setStem(new Stem(stemOptions)); + (_a = this.stem) === null || _a === void 0 ? void 0 : _a.setContext(this.getContext()).draw(); + } +} diff --git a/build/esm/src/stringnumber.js b/build/esm/src/stringnumber.js new file mode 100644 index 0000000000..a73061fcb0 --- /dev/null +++ b/build/esm/src/stringnumber.js @@ -0,0 +1,231 @@ +import { Font, FontStyle, FontWeight } from './font.js'; +import { Modifier, ModifierPosition } from './modifier.js'; +import { Renderer } from './renderer.js'; +import { Stem } from './stem.js'; +import { Tables } from './tables.js'; +import { isStaveNote, isStemmableNote } from './typeguard.js'; +import { RuntimeError } from './util.js'; +export class StringNumber extends Modifier { + constructor(number) { + super(); + this.string_number = number; + this.setWidth(20); + this.position = Modifier.Position.ABOVE; + this.x_shift = 0; + this.y_shift = 0; + this.text_line = 0; + this.stem_offset = 0; + this.x_offset = 0; + this.y_offset = 0; + this.dashed = true; + this.leg = Renderer.LineEndType.NONE; + this.radius = 8; + this.resetFont(); + } + static get CATEGORY() { + return "StringNumber"; + } + static get metrics() { + return Tables.currentMusicFont().getMetrics().glyphs.stringNumber; + } + static format(nums, state) { + const left_shift = state.left_shift; + const right_shift = state.right_shift; + const num_spacing = 1; + if (!nums || nums.length === 0) + return false; + const nums_list = []; + let prev_note = null; + let shift_left = 0; + let shift_right = 0; + const modLines = 0; + for (let i = 0; i < nums.length; ++i) { + const num = nums[i]; + const note = num.getNote(); + const pos = num.getPosition(); + if (!isStaveNote(note)) { + throw new RuntimeError('NoStaveNote'); + } + const index = num.checkIndex(); + const props = note.getKeyProps()[index]; + const mc = note.getModifierContext(); + const verticalSpaceNeeded = (num.radius * 2) / Tables.STAVE_LINE_DISTANCE + 0.5; + if (mc) { + if (pos === ModifierPosition.ABOVE) { + num.text_line = mc.getState().top_text_line; + state.top_text_line += verticalSpaceNeeded; + } + else if (pos === ModifierPosition.BELOW) { + num.text_line = mc.getState().text_line; + state.text_line += verticalSpaceNeeded; + } + } + if (note !== prev_note) { + for (let n = 0; n < note.keys.length; ++n) { + if (left_shift === 0) { + shift_left = Math.max(note.getLeftDisplacedHeadPx(), shift_left); + } + if (right_shift === 0) { + shift_right = Math.max(note.getRightDisplacedHeadPx(), shift_right); + } + } + prev_note = note; + } + const glyphLine = modLines === 0 ? props.line : modLines; + nums_list.push({ + pos, + note, + num, + line: glyphLine, + shiftL: shift_left, + shiftR: shift_right, + }); + } + nums_list.sort((a, b) => b.line - a.line); + let num_shiftR = 0; + let x_widthL = 0; + let x_widthR = 0; + let last_line = null; + let last_note = null; + for (let i = 0; i < nums_list.length; ++i) { + let num_shift = 0; + const note = nums_list[i].note; + const pos = nums_list[i].pos; + const num = nums_list[i].num; + const line = nums_list[i].line; + const shiftR = nums_list[i].shiftR; + if (line !== last_line || note !== last_note) { + num_shiftR = right_shift + shiftR; + } + const num_width = num.getWidth() + num_spacing; + if (pos === Modifier.Position.LEFT) { + num.setXShift(left_shift); + num_shift = shift_left + num_width; + x_widthL = num_shift > x_widthL ? num_shift : x_widthL; + } + else if (pos === Modifier.Position.RIGHT) { + num.setXShift(num_shiftR); + num_shift += num_width; + x_widthR = num_shift > x_widthR ? num_shift : x_widthR; + } + last_line = line; + last_note = note; + } + state.left_shift += x_widthL; + state.right_shift += x_widthR; + return true; + } + setLineEndType(leg) { + if (leg >= Renderer.LineEndType.NONE && leg <= Renderer.LineEndType.DOWN) { + this.leg = leg; + } + return this; + } + setStringNumber(number) { + this.string_number = number; + return this; + } + setOffsetX(x) { + this.x_offset = x; + return this; + } + setOffsetY(y) { + this.y_offset = y; + return this; + } + setLastNote(note) { + this.last_note = note; + return this; + } + setDashed(dashed) { + this.dashed = dashed; + return this; + } + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const start = note.getModifierStartXY(this.position, this.index); + const stemDirection = note.hasStem() ? note.getStemDirection() : Stem.UP; + let dot_x = start.x + this.x_shift + this.x_offset; + let stem_ext = {}; + if (note.hasStem()) { + stem_ext = note.checkStem().getExtents(); + } + let dot_y = start.y + this.y_shift + this.y_offset; + switch (this.position) { + case Modifier.Position.ABOVE: + { + const ys = note.getYs(); + dot_y = ys.reduce((a, b) => (a < b ? a : b)); + if (note.hasStem() && stemDirection == Stem.UP) { + dot_y = stem_ext.topY + StringNumber.metrics.stemPadding; + } + dot_y -= this.radius + StringNumber.metrics.verticalPadding + this.text_line * Tables.STAVE_LINE_DISTANCE; + } + break; + case Modifier.Position.BELOW: + { + const ys = note.getYs(); + dot_y = ys.reduce((a, b) => (a > b ? a : b)); + if (note.hasStem() && stemDirection == Stem.DOWN) { + dot_y = stem_ext.topY - StringNumber.metrics.stemPadding; + } + dot_y += this.radius + StringNumber.metrics.verticalPadding + this.text_line * Tables.STAVE_LINE_DISTANCE; + } + break; + case Modifier.Position.LEFT: + dot_x -= this.radius / 2 + StringNumber.metrics.leftPadding; + break; + case Modifier.Position.RIGHT: + dot_x += this.radius / 2 + StringNumber.metrics.rightPadding; + break; + default: + throw new RuntimeError('InvalidPosition', `The position ${this.position} is invalid`); + } + ctx.save(); + ctx.beginPath(); + ctx.arc(dot_x, dot_y, this.radius, 0, Math.PI * 2, false); + ctx.setLineWidth(1.5); + ctx.stroke(); + ctx.setFont(this.textFont); + const x = dot_x - ctx.measureText(this.string_number).width / 2; + ctx.fillText('' + this.string_number, x, dot_y + 4.5); + const lastNote = this.last_note; + if (isStemmableNote(lastNote)) { + const end = lastNote.getStemX() - note.getX() + 5; + ctx.setStrokeStyle('#000000'); + ctx.setLineCap('round'); + ctx.setLineWidth(0.6); + if (this.dashed) { + Renderer.drawDashedLine(ctx, dot_x + 10, dot_y, dot_x + end, dot_y, [3, 3]); + } + else { + Renderer.drawDashedLine(ctx, dot_x + 10, dot_y, dot_x + end, dot_y, [3, 0]); + } + let len; + let pattern; + switch (this.leg) { + case Renderer.LineEndType.UP: + len = -10; + pattern = this.dashed ? [3, 3] : [3, 0]; + Renderer.drawDashedLine(ctx, dot_x + end, dot_y, dot_x + end, dot_y + len, pattern); + break; + case Renderer.LineEndType.DOWN: + len = 10; + pattern = this.dashed ? [3, 3] : [3, 0]; + Renderer.drawDashedLine(ctx, dot_x + end, dot_y, dot_x + end, dot_y + len, pattern); + break; + default: + break; + } + } + ctx.restore(); + } +} +StringNumber.TEXT_FONT = { + family: Font.SANS_SERIF, + size: Font.SIZE, + weight: FontWeight.BOLD, + style: FontStyle.NORMAL, +}; diff --git a/build/esm/src/strokes.js b/build/esm/src/strokes.js new file mode 100644 index 0000000000..a8cb374b2f --- /dev/null +++ b/build/esm/src/strokes.js @@ -0,0 +1,200 @@ +import { Font, FontStyle, FontWeight } from './font.js'; +import { Glyph } from './glyph.js'; +import { Modifier } from './modifier.js'; +import { isNote, isStaveNote, isTabNote } from './typeguard.js'; +import { RuntimeError } from './util.js'; +export class Stroke extends Modifier { + constructor(type, options) { + super(); + this.options = Object.assign({ all_voices: true }, options); + this.all_voices = this.options.all_voices; + this.type = type; + this.position = Modifier.Position.LEFT; + this.render_options = { + font_scale: 38, + }; + this.resetFont(); + this.setXShift(0); + this.setWidth(10); + } + static get CATEGORY() { + return "Stroke"; + } + static format(strokes, state) { + const left_shift = state.left_shift; + const stroke_spacing = 0; + if (!strokes || strokes.length === 0) + return false; + const strokeList = strokes.map((stroke) => { + const note = stroke.getNote(); + const index = stroke.checkIndex(); + if (isStaveNote(note)) { + const { line } = note.getKeyProps()[index]; + const shift = note.getLeftDisplacedHeadPx(); + return { line, shift, stroke }; + } + else if (isTabNote(note)) { + const { str: string } = note.getPositions()[index]; + return { line: string, shift: 0, stroke }; + } + else { + throw new RuntimeError('Internal', 'Unexpected instance.'); + } + }); + const strokeShift = left_shift; + const xShift = strokeList.reduce((xShift, { stroke, shift }) => { + stroke.setXShift(strokeShift + shift); + return Math.max(stroke.getWidth() + stroke_spacing, xShift); + }, 0); + state.left_shift += xShift; + return true; + } + getPosition() { + return this.position; + } + addEndNote(note) { + this.note_end = note; + return this; + } + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const start = note.getModifierStartXY(this.position, this.index); + let ys = note.getYs(); + let topY = start.y; + let botY = start.y; + const x = start.x - 5; + const line_space = note.checkStave().getSpacingBetweenLines(); + const notes = this.checkModifierContext().getMembers(note.getCategory()); + for (let i = 0; i < notes.length; i++) { + const note = notes[i]; + if (isNote(note)) { + ys = note.getYs(); + for (let n = 0; n < ys.length; n++) { + if (this.note === notes[i] || this.all_voices) { + topY = Math.min(topY, ys[n]); + botY = Math.max(botY, ys[n]); + } + } + } + } + let arrow = ''; + let arrow_shift_x = 0; + let arrow_y = 0; + let text_shift_x = 0; + let text_y = 0; + switch (this.type) { + case Stroke.Type.BRUSH_DOWN: + arrow = 'arrowheadBlackUp'; + arrow_shift_x = -3; + arrow_y = topY - line_space / 2 + 10; + botY += line_space / 2; + break; + case Stroke.Type.BRUSH_UP: + arrow = 'arrowheadBlackDown'; + arrow_shift_x = 0.5; + arrow_y = botY + line_space / 2; + topY -= line_space / 2; + break; + case Stroke.Type.ROLL_DOWN: + case Stroke.Type.RASQUEDO_DOWN: + arrow = 'arrowheadBlackUp'; + arrow_shift_x = -3; + text_shift_x = this.x_shift + arrow_shift_x - 2; + if (isStaveNote(note)) { + topY += 1.5 * line_space; + if ((botY - topY) % 2 !== 0) { + botY += 0.5 * line_space; + } + else { + botY += line_space; + } + arrow_y = topY - line_space; + text_y = botY + line_space + 2; + } + else { + topY += 1.5 * line_space; + botY += line_space; + arrow_y = topY - 0.75 * line_space; + text_y = botY + 0.25 * line_space; + } + break; + case Stroke.Type.ROLL_UP: + case Stroke.Type.RASQUEDO_UP: + arrow = 'arrowheadBlackDown'; + arrow_shift_x = -4; + text_shift_x = this.x_shift + arrow_shift_x - 1; + if (isStaveNote(note)) { + arrow_y = line_space / 2; + topY += 0.5 * line_space; + if ((botY - topY) % 2 === 0) { + botY += line_space / 2; + } + arrow_y = botY + 0.5 * line_space; + text_y = topY - 1.25 * line_space; + } + else { + topY += 0.25 * line_space; + botY += 0.5 * line_space; + arrow_y = botY + 0.25 * line_space; + text_y = topY - line_space; + } + break; + case Stroke.Type.ARPEGGIO_DIRECTIONLESS: + topY += 0.5 * line_space; + botY += line_space; + break; + default: + throw new RuntimeError('InvalidType', `The stroke type ${this.type} does not exist`); + } + let strokeLine = 'straight'; + if (this.type === Stroke.Type.BRUSH_DOWN || this.type === Stroke.Type.BRUSH_UP) { + ctx.fillRect(x + this.x_shift, topY, 1, botY - topY); + } + else { + strokeLine = 'wiggly'; + if (isStaveNote(note)) { + for (let i = topY; i <= botY; i += line_space) { + Glyph.renderGlyph(ctx, x + this.x_shift - 4, i, this.render_options.font_scale, 'vexWiggleArpeggioUp'); + } + } + else { + let i; + for (i = topY; i <= botY; i += 10) { + Glyph.renderGlyph(ctx, x + this.x_shift - 4, i, this.render_options.font_scale, 'vexWiggleArpeggioUp'); + } + if (this.type === Stroke.Type.RASQUEDO_DOWN) { + text_y = i + 0.25 * line_space; + } + } + } + if (this.type === Stroke.Type.ARPEGGIO_DIRECTIONLESS) { + return; + } + Glyph.renderGlyph(ctx, x + this.x_shift + arrow_shift_x, arrow_y, this.render_options.font_scale, arrow, { + category: `stroke.${arrow}.${strokeLine}`, + }); + if (this.type === Stroke.Type.RASQUEDO_DOWN || this.type === Stroke.Type.RASQUEDO_UP) { + ctx.save(); + ctx.setFont(this.textFont); + ctx.fillText('R', x + text_shift_x, text_y); + ctx.restore(); + } + } +} +Stroke.Type = { + BRUSH_DOWN: 1, + BRUSH_UP: 2, + ROLL_DOWN: 3, + ROLL_UP: 4, + RASQUEDO_DOWN: 5, + RASQUEDO_UP: 6, + ARPEGGIO_DIRECTIONLESS: 7, +}; +Stroke.TEXT_FONT = { + family: Font.SERIF, + size: Font.SIZE, + weight: FontWeight.BOLD, + style: FontStyle.ITALIC, +}; diff --git a/build/esm/src/svgcontext.js b/build/esm/src/svgcontext.js new file mode 100644 index 0000000000..0545b962c0 --- /dev/null +++ b/build/esm/src/svgcontext.js @@ -0,0 +1,414 @@ +import { Font, FontStyle, FontWeight } from './font.js'; +import { RenderContext } from './rendercontext.js'; +import { normalizeAngle, prefix, RuntimeError } from './util.js'; +const ATTRIBUTES_TO_IGNORE = { + path: { + x: true, + y: true, + width: true, + height: true, + 'font-family': true, + 'font-weight': true, + 'font-style': true, + 'font-size': true, + }, + rect: { + 'font-family': true, + 'font-weight': true, + 'font-style': true, + 'font-size': true, + }, + text: { + width: true, + height: true, + }, +}; +const SVG_NS = 'http://www.w3.org/2000/svg'; +const TWO_PI = 2 * Math.PI; +class MeasureTextCache { + constructor() { + this.cache = {}; + } + lookup(text, svg, attributes) { + let entries = this.cache[text]; + if (entries === undefined) { + entries = {}; + this.cache[text] = entries; + } + const family = attributes['font-family']; + const size = attributes['font-size']; + const weight = attributes['font-weight']; + const style = attributes['font-style']; + const key = `${family}%${size}%${weight}%${style}`; + let entry = entries[key]; + if (entry === undefined) { + entry = this.measureImpl(text, svg, attributes); + entries[key] = entry; + } + return entry; + } + measureImpl(text, svg, attributes) { + let txt = this.txt; + if (!txt) { + txt = document.createElementNS(SVG_NS, 'text'); + this.txt = txt; + } + txt.textContent = text; + txt.setAttributeNS(null, 'font-family', attributes['font-family']); + txt.setAttributeNS(null, 'font-size', attributes['font-size']); + txt.setAttributeNS(null, 'font-style', attributes['font-style']); + txt.setAttributeNS(null, 'font-weight', attributes['font-weight']); + svg.appendChild(txt); + const bbox = txt.getBBox(); + svg.removeChild(txt); + return { x: bbox.x, y: bbox.y, width: bbox.width, height: bbox.height }; + } +} +export class SVGContext extends RenderContext { + constructor(element) { + super(); + this.width = 0; + this.height = 0; + this.backgroundFillStyle = 'white'; + this.fontCSSString = ''; + this.element = element; + const svg = this.create('svg'); + this.element.appendChild(svg); + this.svg = svg; + this.parent = this.svg; + this.groups = [this.svg]; + this.path = ''; + this.pen = { x: NaN, y: NaN }; + this.lineWidth = 1.0; + const defaultFontAttributes = { + 'font-family': Font.SANS_SERIF, + 'font-size': Font.SIZE + 'pt', + 'font-weight': FontWeight.NORMAL, + 'font-style': FontStyle.NORMAL, + }; + this.state = Object.assign({ scale: { x: 1, y: 1 } }, defaultFontAttributes); + this.attributes = Object.assign({ 'stroke-width': 0.3, 'stroke-dasharray': 'none', fill: 'black', stroke: 'black' }, defaultFontAttributes); + this.shadow_attributes = { + width: 0, + color: 'black', + }; + this.state_stack = []; + } + create(svgElementType) { + return document.createElementNS(SVG_NS, svgElementType); + } + openGroup(cls, id, attrs) { + const group = this.create('g'); + this.groups.push(group); + this.parent.appendChild(group); + this.parent = group; + if (cls) + group.setAttribute('class', prefix(cls)); + if (id) + group.setAttribute('id', prefix(id)); + if (attrs && attrs.pointerBBox) { + group.setAttribute('pointer-events', 'bounding-box'); + } + return group; + } + closeGroup() { + this.groups.pop(); + this.parent = this.groups[this.groups.length - 1]; + } + add(elem) { + this.parent.appendChild(elem); + } + setFillStyle(style) { + this.attributes.fill = style; + return this; + } + setBackgroundFillStyle(style) { + this.backgroundFillStyle = style; + return this; + } + setStrokeStyle(style) { + this.attributes.stroke = style; + return this; + } + setShadowColor(color) { + this.shadow_attributes.color = color; + return this; + } + setShadowBlur(blur) { + this.shadow_attributes.width = blur; + return this; + } + setLineWidth(width) { + this.attributes['stroke-width'] = width; + this.lineWidth = width; + return this; + } + setLineDash(lineDash) { + if (Object.prototype.toString.call(lineDash) === '[object Array]') { + this.attributes['stroke-dasharray'] = lineDash.join(','); + return this; + } + else { + throw new RuntimeError('ArgumentError', 'lineDash must be an array of integers.'); + } + } + setLineCap(capType) { + this.attributes['stroke-linecap'] = capType; + return this; + } + resize(width, height) { + this.width = width; + this.height = height; + this.element.style.width = width.toString(); + this.svg.style.width = width.toString(); + this.svg.style.height = height.toString(); + const attributes = { + width, + height, + }; + this.applyAttributes(this.svg, attributes); + this.scale(this.state.scale.x, this.state.scale.y); + return this; + } + scale(x, y) { + this.state.scale = { x, y }; + const visibleWidth = this.width / x; + const visibleHeight = this.height / y; + this.setViewBox(0, 0, visibleWidth, visibleHeight); + return this; + } + setViewBox(viewBox_or_minX, minY, width, height) { + if (typeof viewBox_or_minX === 'string') { + this.svg.setAttribute('viewBox', viewBox_or_minX); + } + else { + const viewBoxString = viewBox_or_minX + ' ' + minY + ' ' + width + ' ' + height; + this.svg.setAttribute('viewBox', viewBoxString); + } + } + applyAttributes(element, attributes) { + const attrNamesToIgnore = ATTRIBUTES_TO_IGNORE[element.nodeName]; + for (const attrName in attributes) { + if (attrNamesToIgnore && attrNamesToIgnore[attrName]) { + continue; + } + element.setAttributeNS(null, attrName, attributes[attrName]); + } + return element; + } + clear() { + while (this.svg.lastChild) { + this.svg.removeChild(this.svg.lastChild); + } + this.scale(this.state.scale.x, this.state.scale.y); + } + rect(x, y, width, height, attributes) { + if (height < 0) { + y += height; + height *= -1; + } + const rectangle = this.create('rect'); + attributes = attributes !== null && attributes !== void 0 ? attributes : { fill: 'none', 'stroke-width': this.lineWidth, stroke: 'black' }; + this.applyAttributes(rectangle, Object.assign({ x, y, width, height }, attributes)); + this.add(rectangle); + return this; + } + fillRect(x, y, width, height) { + const attributes = { fill: this.attributes.fill }; + this.rect(x, y, width, height, attributes); + return this; + } + clearRect(x, y, width, height) { + this.rect(x, y, width, height, { 'stroke-width': 0, fill: this.backgroundFillStyle }); + return this; + } + beginPath() { + this.path = ''; + this.pen.x = NaN; + this.pen.y = NaN; + return this; + } + moveTo(x, y) { + this.path += 'M' + x + ' ' + y; + this.pen.x = x; + this.pen.y = y; + return this; + } + lineTo(x, y) { + this.path += 'L' + x + ' ' + y; + this.pen.x = x; + this.pen.y = y; + return this; + } + bezierCurveTo(x1, y1, x2, y2, x, y) { + this.path += 'C' + x1 + ' ' + y1 + ',' + x2 + ' ' + y2 + ',' + x + ' ' + y; + this.pen.x = x; + this.pen.y = y; + return this; + } + quadraticCurveTo(x1, y1, x, y) { + this.path += 'Q' + x1 + ' ' + y1 + ',' + x + ' ' + y; + this.pen.x = x; + this.pen.y = y; + return this; + } + arc(x, y, radius, startAngle, endAngle, counterclockwise) { + const x0 = x + radius * Math.cos(startAngle); + const y0 = y + radius * Math.sin(startAngle); + if ((!counterclockwise && endAngle - startAngle >= TWO_PI) || + (counterclockwise && startAngle - endAngle >= TWO_PI)) { + const x1 = x + radius * Math.cos(startAngle + Math.PI); + const y1 = y + radius * Math.sin(startAngle + Math.PI); + this.path += `M${x0} ${y0} A${radius} ${radius} 0 0 0 ${x1} ${y1} `; + this.path += `A${radius} ${radius} 0 0 0 ${x0} ${y0}`; + this.pen.x = x0; + this.pen.y = y0; + } + else { + const x1 = x + radius * Math.cos(endAngle); + const y1 = y + radius * Math.sin(endAngle); + startAngle = normalizeAngle(startAngle); + endAngle = normalizeAngle(endAngle); + let large; + if (Math.abs(endAngle - startAngle) < Math.PI) { + large = counterclockwise; + } + else { + large = !counterclockwise; + } + if (startAngle > endAngle) { + large = !large; + } + const sweep = !counterclockwise; + this.path += `M${x0} ${y0} A${radius} ${radius} 0 ${+large} ${+sweep} ${x1} ${y1}`; + this.pen.x = x1; + this.pen.y = y1; + } + return this; + } + closePath() { + this.path += 'Z'; + return this; + } + getShadowStyle() { + const sa = this.shadow_attributes; + return `filter: drop-shadow(0 0 ${sa.width / 1.5}px ${sa.color})`; + } + fill(attributes) { + const path = this.create('path'); + if (typeof attributes === 'undefined') { + attributes = Object.assign(Object.assign({}, this.attributes), { stroke: 'none' }); + } + attributes.d = this.path; + if (this.shadow_attributes.width > 0) { + attributes.style = this.getShadowStyle(); + } + this.applyAttributes(path, attributes); + this.add(path); + return this; + } + stroke() { + const path = this.create('path'); + const attributes = Object.assign(Object.assign({}, this.attributes), { fill: 'none', 'stroke-width': this.lineWidth, d: this.path }); + if (this.shadow_attributes.width > 0) { + attributes.style = this.getShadowStyle(); + } + this.applyAttributes(path, attributes); + this.add(path); + return this; + } + measureText(text) { + return SVGContext.measureTextCache.lookup(text, this.svg, this.attributes); + } + fillText(text, x, y) { + if (!text || text.length <= 0) { + return this; + } + const attributes = Object.assign(Object.assign({}, this.attributes), { stroke: 'none', x, + y }); + const txt = this.create('text'); + txt.textContent = text; + this.applyAttributes(txt, attributes); + this.add(txt); + return this; + } + save() { + this.state_stack.push({ + state: { + 'font-family': this.state['font-family'], + 'font-weight': this.state['font-weight'], + 'font-style': this.state['font-style'], + 'font-size': this.state['font-size'], + scale: this.state.scale, + }, + attributes: { + 'font-family': this.attributes['font-family'], + 'font-weight': this.attributes['font-weight'], + 'font-style': this.attributes['font-style'], + 'font-size': this.attributes['font-size'], + fill: this.attributes.fill, + stroke: this.attributes.stroke, + 'stroke-width': this.attributes['stroke-width'], + 'stroke-dasharray': this.attributes['stroke-dasharray'], + }, + shadow_attributes: { + width: this.shadow_attributes.width, + color: this.shadow_attributes.color, + }, + lineWidth: this.lineWidth, + }); + return this; + } + restore() { + const savedState = this.state_stack.pop(); + if (savedState) { + const state = savedState; + this.state['font-family'] = state.state['font-family']; + this.state['font-weight'] = state.state['font-weight']; + this.state['font-style'] = state.state['font-style']; + this.state['font-size'] = state.state['font-size']; + this.state.scale = state.state.scale; + this.attributes['font-family'] = state.attributes['font-family']; + this.attributes['font-weight'] = state.attributes['font-weight']; + this.attributes['font-style'] = state.attributes['font-style']; + this.attributes['font-size'] = state.attributes['font-size']; + this.attributes.fill = state.attributes.fill; + this.attributes.stroke = state.attributes.stroke; + this.attributes['stroke-width'] = state.attributes['stroke-width']; + this.attributes['stroke-dasharray'] = state.attributes['stroke-dasharray']; + this.shadow_attributes.width = state.shadow_attributes.width; + this.shadow_attributes.color = state.shadow_attributes.color; + this.lineWidth = state.lineWidth; + } + return this; + } + set fillStyle(style) { + this.setFillStyle(style); + } + get fillStyle() { + return this.attributes.fill; + } + set strokeStyle(style) { + this.setStrokeStyle(style); + } + get strokeStyle() { + return this.attributes.stroke; + } + setFont(f, size, weight, style) { + const fontInfo = Font.validate(f, size, weight, style); + this.fontCSSString = Font.toCSSString(fontInfo); + const fontAttributes = { + 'font-family': fontInfo.family, + 'font-size': fontInfo.size, + 'font-weight': fontInfo.weight, + 'font-style': fontInfo.style, + }; + this.attributes = Object.assign(Object.assign({}, this.attributes), fontAttributes); + this.state = Object.assign(Object.assign({}, this.state), fontAttributes); + return this; + } + getFont() { + return this.fontCSSString; + } +} +SVGContext.measureTextCache = new MeasureTextCache(); diff --git a/build/esm/src/system.js b/build/esm/src/system.js new file mode 100644 index 0000000000..9d90d92212 --- /dev/null +++ b/build/esm/src/system.js @@ -0,0 +1,116 @@ +import { BoundingBox } from './boundingbox.js'; +import { Element } from './element.js'; +import { Formatter } from './formatter.js'; +import { Note } from './note.js'; +import { Stave } from './stave.js'; +import { RuntimeError } from './util.js'; +export class System extends Element { + constructor(params = {}) { + super(); + this.setOptions(params); + this.parts = []; + } + static get CATEGORY() { + return "System"; + } + setOptions(options = {}) { + if (!options.factory) { + throw new RuntimeError('NoFactory', 'System.setOptions(options) requires a factory.'); + } + this.factory = options.factory; + this.options = Object.assign(Object.assign({ factory: this.factory, x: 10, y: 10, width: 500, spaceBetweenStaves: 12, autoWidth: false, noJustification: false, debugFormatter: false, formatIterations: 0, noPadding: false }, options), { details: Object.assign({ alpha: 0.5 }, options.details), formatOptions: Object.assign({}, options.formatOptions) }); + if (this.options.noJustification === false && typeof options.width === 'undefined') { + this.options.autoWidth = true; + } + } + setContext(context) { + super.setContext(context); + this.factory.setContext(context); + return this; + } + addConnector(type = 'double') { + this.connector = this.factory.StaveConnector({ + top_stave: this.parts[0].stave, + bottom_stave: this.parts[this.parts.length - 1].stave, + type, + }); + return this.connector; + } + addStave(params) { + var _a; + const staveOptions = Object.assign({ left_bar: false }, params.options); + const stave = (_a = params.stave) !== null && _a !== void 0 ? _a : this.factory.Stave({ x: this.options.x, y: this.options.y, width: this.options.width, options: staveOptions }); + const p = Object.assign(Object.assign({ stave, spaceAbove: 0, spaceBelow: 0, debugNoteMetrics: false, noJustification: false }, params), { options: staveOptions }); + const ctx = this.getContext(); + p.voices.forEach((voice) => voice + .setContext(ctx) + .setStave(stave) + .getTickables() + .forEach((tickable) => tickable.setStave(stave))); + this.parts.push(p); + return stave; + } + format() { + const options_details = this.options.details; + let justifyWidth = 0; + const formatter = new Formatter(options_details); + this.formatter = formatter; + let y = this.options.y; + let startX = 0; + let allVoices = []; + const debugNoteMetricsYs = []; + this.parts.forEach((part) => { + y = y + part.stave.space(part.spaceAbove); + part.stave.setY(y); + if (this.options.autoWidth) { + part.voices.forEach((voice) => { + formatter.joinVoices([voice]); + }); + } + else { + formatter.joinVoices(part.voices); + } + y = y + part.stave.space(part.spaceBelow); + y = y + part.stave.space(this.options.spaceBetweenStaves); + if (part.debugNoteMetrics) { + debugNoteMetricsYs.push({ y, voice: part.voices[0] }); + y += 15; + } + allVoices = allVoices.concat(part.voices); + startX = Math.max(startX, part.stave.getNoteStartX()); + }); + this.parts.forEach((part) => part.stave.setNoteStartX(startX)); + if (this.options.autoWidth) { + justifyWidth = formatter.preCalculateMinTotalWidth(allVoices); + this.parts.forEach((part) => { + part.stave.setWidth(justifyWidth + Stave.rightPadding + (startX - this.options.x)); + }); + } + else { + justifyWidth = this.options.noPadding + ? this.options.width - this.options.x + : this.options.width - (startX - this.options.x) - Stave.defaultPadding; + } + formatter.format(allVoices, this.options.noJustification ? 0 : justifyWidth, this.options.formatOptions); + for (let i = 0; i < this.options.formatIterations; i++) { + formatter.tune(options_details); + } + this.startX = startX; + this.debugNoteMetricsYs = debugNoteMetricsYs; + this.lastY = y; + this.boundingBox = new BoundingBox(this.options.x, this.options.y, this.options.width, this.lastY - this.options.y); + } + draw() { + const ctx = this.checkContext(); + if (!this.formatter || !this.startX || !this.lastY || !this.debugNoteMetricsYs) { + throw new RuntimeError('NoFormatter', 'format() must be called before draw()'); + } + this.setRendered(); + if (this.options.debugFormatter) { + Formatter.plotDebugging(ctx, this.formatter, this.startX, this.options.y, this.lastY); + } + this.debugNoteMetricsYs.forEach((d) => { + d.voice.getTickables().forEach((tickable) => Note.plotMetrics(ctx, tickable, d.y)); + }); + } +} diff --git a/build/esm/src/tables.js b/build/esm/src/tables.js new file mode 100644 index 0000000000..fd9ed1ae0f --- /dev/null +++ b/build/esm/src/tables.js @@ -0,0 +1,1066 @@ +import { Fraction } from './fraction.js'; +import { Glyph } from './glyph.js'; +import { RuntimeError } from './util.js'; +const RESOLUTION = 16384; +const durations = { + '1/2': RESOLUTION * 2, + 1: RESOLUTION / 1, + 2: RESOLUTION / 2, + 4: RESOLUTION / 4, + 8: RESOLUTION / 8, + 16: RESOLUTION / 16, + 32: RESOLUTION / 32, + 64: RESOLUTION / 64, + 128: RESOLUTION / 128, + 256: RESOLUTION / 256, +}; +const durationAliases = { + w: '1', + h: '2', + q: '4', + b: '256', +}; +const keySignatures = { + C: { num: 0 }, + Am: { num: 0 }, + F: { acc: 'b', num: 1 }, + Dm: { acc: 'b', num: 1 }, + Bb: { acc: 'b', num: 2 }, + Gm: { acc: 'b', num: 2 }, + Eb: { acc: 'b', num: 3 }, + Cm: { acc: 'b', num: 3 }, + Ab: { acc: 'b', num: 4 }, + Fm: { acc: 'b', num: 4 }, + Db: { acc: 'b', num: 5 }, + Bbm: { acc: 'b', num: 5 }, + Gb: { acc: 'b', num: 6 }, + Ebm: { acc: 'b', num: 6 }, + Cb: { acc: 'b', num: 7 }, + Abm: { acc: 'b', num: 7 }, + G: { acc: '#', num: 1 }, + Em: { acc: '#', num: 1 }, + D: { acc: '#', num: 2 }, + Bm: { acc: '#', num: 2 }, + A: { acc: '#', num: 3 }, + 'F#m': { acc: '#', num: 3 }, + E: { acc: '#', num: 4 }, + 'C#m': { acc: '#', num: 4 }, + B: { acc: '#', num: 5 }, + 'G#m': { acc: '#', num: 5 }, + 'F#': { acc: '#', num: 6 }, + 'D#m': { acc: '#', num: 6 }, + 'C#': { acc: '#', num: 7 }, + 'A#m': { acc: '#', num: 7 }, +}; +const clefs = { + treble: { line_shift: 0 }, + bass: { line_shift: 6 }, + tenor: { line_shift: 4 }, + alto: { line_shift: 3 }, + soprano: { line_shift: 1 }, + percussion: { line_shift: 0 }, + 'mezzo-soprano': { line_shift: 2 }, + 'baritone-c': { line_shift: 5 }, + 'baritone-f': { line_shift: 5 }, + subbass: { line_shift: 7 }, + french: { line_shift: -1 }, +}; +const notesInfo = { + C: { index: 0, int_val: 0 }, + CN: { index: 0, int_val: 0, accidental: 'n' }, + 'C#': { index: 0, int_val: 1, accidental: '#' }, + 'C##': { index: 0, int_val: 2, accidental: '##' }, + CB: { index: 0, int_val: 11, accidental: 'b' }, + CBB: { index: 0, int_val: 10, accidental: 'bb' }, + D: { index: 1, int_val: 2 }, + DN: { index: 1, int_val: 2, accidental: 'n' }, + 'D#': { index: 1, int_val: 3, accidental: '#' }, + 'D##': { index: 1, int_val: 4, accidental: '##' }, + DB: { index: 1, int_val: 1, accidental: 'b' }, + DBB: { index: 1, int_val: 0, accidental: 'bb' }, + E: { index: 2, int_val: 4 }, + EN: { index: 2, int_val: 4, accidental: 'n' }, + 'E#': { index: 2, int_val: 5, accidental: '#' }, + 'E##': { index: 2, int_val: 6, accidental: '##' }, + EB: { index: 2, int_val: 3, accidental: 'b' }, + EBB: { index: 2, int_val: 2, accidental: 'bb' }, + F: { index: 3, int_val: 5 }, + FN: { index: 3, int_val: 5, accidental: 'n' }, + 'F#': { index: 3, int_val: 6, accidental: '#' }, + 'F##': { index: 3, int_val: 7, accidental: '##' }, + FB: { index: 3, int_val: 4, accidental: 'b' }, + FBB: { index: 3, int_val: 3, accidental: 'bb' }, + G: { index: 4, int_val: 7 }, + GN: { index: 4, int_val: 7, accidental: 'n' }, + 'G#': { index: 4, int_val: 8, accidental: '#' }, + 'G##': { index: 4, int_val: 9, accidental: '##' }, + GB: { index: 4, int_val: 6, accidental: 'b' }, + GBB: { index: 4, int_val: 5, accidental: 'bb' }, + A: { index: 5, int_val: 9 }, + AN: { index: 5, int_val: 9, accidental: 'n' }, + 'A#': { index: 5, int_val: 10, accidental: '#' }, + 'A##': { index: 5, int_val: 11, accidental: '##' }, + AB: { index: 5, int_val: 8, accidental: 'b' }, + ABB: { index: 5, int_val: 7, accidental: 'bb' }, + B: { index: 6, int_val: 11 }, + BN: { index: 6, int_val: 11, accidental: 'n' }, + 'B#': { index: 6, int_val: 12, accidental: '#' }, + 'B##': { index: 6, int_val: 13, accidental: '##' }, + BB: { index: 6, int_val: 10, accidental: 'b' }, + BBB: { index: 6, int_val: 9, accidental: 'bb' }, + R: { index: 6, rest: true }, + X: { + index: 6, + accidental: '', + octave: 4, + code: 'noteheadXBlack', + shift_right: 5.5, + }, +}; +const validNoteTypes = { + n: { name: 'note' }, + r: { name: 'rest' }, + h: { name: 'harmonic' }, + m: { name: 'muted' }, + s: { name: 'slash' }, + g: { name: 'ghost' }, +}; +const customNoteHeads = { + D0: { code: 'noteheadDiamondWhole' }, + D1: { code: 'noteheadDiamondHalf' }, + D2: { code: 'noteheadDiamondBlack' }, + D3: { code: 'noteheadDiamondBlack' }, + T0: { code: 'noteheadTriangleUpWhole' }, + T1: { code: 'noteheadTriangleUpHalf' }, + T2: { code: 'noteheadTriangleUpBlack' }, + T3: { code: 'noteheadTriangleUpBlack' }, + X0: { code: 'noteheadXWhole' }, + X1: { code: 'noteheadXHalf' }, + X2: { code: 'noteheadXBlack' }, + X3: { code: 'noteheadCircleX' }, + S1: { code: 'noteheadSquareWhite' }, + S2: { code: 'noteheadSquareBlack' }, + R1: { code: 'vexNoteHeadRectWhite' }, + R2: { code: 'vexNoteHeadRectBlack' }, +}; +const accidentals = { + '#': { code: 'accidentalSharp', parenRightPaddingAdjustment: -1 }, + '##': { code: 'accidentalDoubleSharp', parenRightPaddingAdjustment: -1 }, + b: { code: 'accidentalFlat', parenRightPaddingAdjustment: -2 }, + bb: { code: 'accidentalDoubleFlat', parenRightPaddingAdjustment: -2 }, + n: { code: 'accidentalNatural', parenRightPaddingAdjustment: -1 }, + '{': { code: 'accidentalParensLeft', parenRightPaddingAdjustment: -1 }, + '}': { code: 'accidentalParensRight', parenRightPaddingAdjustment: -1 }, + db: { code: 'accidentalThreeQuarterTonesFlatZimmermann', parenRightPaddingAdjustment: -1 }, + d: { code: 'accidentalQuarterToneFlatStein', parenRightPaddingAdjustment: 0 }, + '++': { code: 'accidentalThreeQuarterTonesSharpStein', parenRightPaddingAdjustment: -1 }, + '+': { code: 'accidentalQuarterToneSharpStein', parenRightPaddingAdjustment: -1 }, + '+-': { code: 'accidentalKucukMucennebSharp', parenRightPaddingAdjustment: -1 }, + bs: { code: 'accidentalBakiyeFlat', parenRightPaddingAdjustment: -1 }, + bss: { code: 'accidentalBuyukMucennebFlat', parenRightPaddingAdjustment: -1 }, + o: { code: 'accidentalSori', parenRightPaddingAdjustment: -1 }, + k: { code: 'accidentalKoron', parenRightPaddingAdjustment: -1 }, + bbs: { code: 'vexAccidentalMicrotonal1', parenRightPaddingAdjustment: -1 }, + '++-': { code: 'vexAccidentalMicrotonal2', parenRightPaddingAdjustment: -1 }, + ashs: { code: 'vexAccidentalMicrotonal3', parenRightPaddingAdjustment: -1 }, + afhf: { code: 'vexAccidentalMicrotonal4', parenRightPaddingAdjustment: -1 }, + accSagittal5v7KleismaUp: { code: 'accSagittal5v7KleismaUp', parenRightPaddingAdjustment: -1 }, + accSagittal5v7KleismaDown: { code: 'accSagittal5v7KleismaDown', parenRightPaddingAdjustment: -1 }, + accSagittal5CommaUp: { code: 'accSagittal5CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal5CommaDown: { code: 'accSagittal5CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal7CommaUp: { code: 'accSagittal7CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal7CommaDown: { code: 'accSagittal7CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal25SmallDiesisUp: { code: 'accSagittal25SmallDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal25SmallDiesisDown: { code: 'accSagittal25SmallDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal35MediumDiesisUp: { code: 'accSagittal35MediumDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal35MediumDiesisDown: { code: 'accSagittal35MediumDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal11MediumDiesisUp: { code: 'accSagittal11MediumDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal11MediumDiesisDown: { code: 'accSagittal11MediumDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal11LargeDiesisUp: { code: 'accSagittal11LargeDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal11LargeDiesisDown: { code: 'accSagittal11LargeDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal35LargeDiesisUp: { code: 'accSagittal35LargeDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal35LargeDiesisDown: { code: 'accSagittal35LargeDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp25SDown: { code: 'accSagittalSharp25SDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat25SUp: { code: 'accSagittalFlat25SUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp7CDown: { code: 'accSagittalSharp7CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat7CUp: { code: 'accSagittalFlat7CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5CDown: { code: 'accSagittalSharp5CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5CUp: { code: 'accSagittalFlat5CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v7kDown: { code: 'accSagittalSharp5v7kDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v7kUp: { code: 'accSagittalFlat5v7kUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp: { code: 'accSagittalSharp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat: { code: 'accSagittalFlat', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v7kUp: { code: 'accSagittalSharp5v7kUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v7kDown: { code: 'accSagittalFlat5v7kDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5CUp: { code: 'accSagittalSharp5CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5CDown: { code: 'accSagittalFlat5CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp7CUp: { code: 'accSagittalSharp7CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat7CDown: { code: 'accSagittalFlat7CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp25SUp: { code: 'accSagittalSharp25SUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat25SDown: { code: 'accSagittalFlat25SDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp35MUp: { code: 'accSagittalSharp35MUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat35MDown: { code: 'accSagittalFlat35MDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp11MUp: { code: 'accSagittalSharp11MUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat11MDown: { code: 'accSagittalFlat11MDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp11LUp: { code: 'accSagittalSharp11LUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat11LDown: { code: 'accSagittalFlat11LDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp35LUp: { code: 'accSagittalSharp35LUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat35LDown: { code: 'accSagittalFlat35LDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp25SDown: { code: 'accSagittalDoubleSharp25SDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat25SUp: { code: 'accSagittalDoubleFlat25SUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp7CDown: { code: 'accSagittalDoubleSharp7CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat7CUp: { code: 'accSagittalDoubleFlat7CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp5CDown: { code: 'accSagittalDoubleSharp5CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat5CUp: { code: 'accSagittalDoubleFlat5CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp5v7kDown: { code: 'accSagittalDoubleSharp5v7kDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat5v7kUp: { code: 'accSagittalDoubleFlat5v7kUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp: { code: 'accSagittalDoubleSharp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat: { code: 'accSagittalDoubleFlat', parenRightPaddingAdjustment: -1 }, + accSagittal7v11KleismaUp: { code: 'accSagittal7v11KleismaUp', parenRightPaddingAdjustment: -1 }, + accSagittal7v11KleismaDown: { code: 'accSagittal7v11KleismaDown', parenRightPaddingAdjustment: -1 }, + accSagittal17CommaUp: { code: 'accSagittal17CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal17CommaDown: { code: 'accSagittal17CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal55CommaUp: { code: 'accSagittal55CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal55CommaDown: { code: 'accSagittal55CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal7v11CommaUp: { code: 'accSagittal7v11CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal7v11CommaDown: { code: 'accSagittal7v11CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal5v11SmallDiesisUp: { code: 'accSagittal5v11SmallDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal5v11SmallDiesisDown: { code: 'accSagittal5v11SmallDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v11SDown: { code: 'accSagittalSharp5v11SDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v11SUp: { code: 'accSagittalFlat5v11SUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp7v11CDown: { code: 'accSagittalSharp7v11CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat7v11CUp: { code: 'accSagittalFlat7v11CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp55CDown: { code: 'accSagittalSharp55CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat55CUp: { code: 'accSagittalFlat55CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp17CDown: { code: 'accSagittalSharp17CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat17CUp: { code: 'accSagittalFlat17CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp7v11kDown: { code: 'accSagittalSharp7v11kDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat7v11kUp: { code: 'accSagittalFlat7v11kUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp7v11kUp: { code: 'accSagittalSharp7v11kUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat7v11kDown: { code: 'accSagittalFlat7v11kDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp17CUp: { code: 'accSagittalSharp17CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat17CDown: { code: 'accSagittalFlat17CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp55CUp: { code: 'accSagittalSharp55CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat55CDown: { code: 'accSagittalFlat55CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp7v11CUp: { code: 'accSagittalSharp7v11CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat7v11CDown: { code: 'accSagittalFlat7v11CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v11SUp: { code: 'accSagittalSharp5v11SUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v11SDown: { code: 'accSagittalFlat5v11SDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp5v11SDown: { code: 'accSagittalDoubleSharp5v11SDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat5v11SUp: { code: 'accSagittalDoubleFlat5v11SUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp7v11CDown: { code: 'accSagittalDoubleSharp7v11CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat7v11CUp: { code: 'accSagittalDoubleFlat7v11CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp55CDown: { code: 'accSagittalDoubleSharp55CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat55CUp: { code: 'accSagittalDoubleFlat55CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp17CDown: { code: 'accSagittalDoubleSharp17CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat17CUp: { code: 'accSagittalDoubleFlat17CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp7v11kDown: { code: 'accSagittalDoubleSharp7v11kDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat7v11kUp: { code: 'accSagittalDoubleFlat7v11kUp', parenRightPaddingAdjustment: -1 }, + accSagittal23CommaUp: { code: 'accSagittal23CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal23CommaDown: { code: 'accSagittal23CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal5v19CommaUp: { code: 'accSagittal5v19CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal5v19CommaDown: { code: 'accSagittal5v19CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal5v23SmallDiesisUp: { code: 'accSagittal5v23SmallDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal5v23SmallDiesisDown: { code: 'accSagittal5v23SmallDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v23SDown: { code: 'accSagittalSharp5v23SDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v23SUp: { code: 'accSagittalFlat5v23SUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v19CDown: { code: 'accSagittalSharp5v19CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v19CUp: { code: 'accSagittalFlat5v19CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp23CDown: { code: 'accSagittalSharp23CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat23CUp: { code: 'accSagittalFlat23CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp23CUp: { code: 'accSagittalSharp23CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat23CDown: { code: 'accSagittalFlat23CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v19CUp: { code: 'accSagittalSharp5v19CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v19CDown: { code: 'accSagittalFlat5v19CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v23SUp: { code: 'accSagittalSharp5v23SUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v23SDown: { code: 'accSagittalFlat5v23SDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp5v23SDown: { code: 'accSagittalDoubleSharp5v23SDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat5v23SUp: { code: 'accSagittalDoubleFlat5v23SUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp5v19CDown: { code: 'accSagittalDoubleSharp5v19CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat5v19CUp: { code: 'accSagittalDoubleFlat5v19CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp23CDown: { code: 'accSagittalDoubleSharp23CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat23CUp: { code: 'accSagittalDoubleFlat23CUp', parenRightPaddingAdjustment: -1 }, + accSagittal19SchismaUp: { code: 'accSagittal19SchismaUp', parenRightPaddingAdjustment: -1 }, + accSagittal19SchismaDown: { code: 'accSagittal19SchismaDown', parenRightPaddingAdjustment: -1 }, + accSagittal17KleismaUp: { code: 'accSagittal17KleismaUp', parenRightPaddingAdjustment: -1 }, + accSagittal17KleismaDown: { code: 'accSagittal17KleismaDown', parenRightPaddingAdjustment: -1 }, + accSagittal143CommaUp: { code: 'accSagittal143CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal143CommaDown: { code: 'accSagittal143CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal11v49CommaUp: { code: 'accSagittal11v49CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal11v49CommaDown: { code: 'accSagittal11v49CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal19CommaUp: { code: 'accSagittal19CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal19CommaDown: { code: 'accSagittal19CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal7v19CommaUp: { code: 'accSagittal7v19CommaUp', parenRightPaddingAdjustment: -1 }, + accSagittal7v19CommaDown: { code: 'accSagittal7v19CommaDown', parenRightPaddingAdjustment: -1 }, + accSagittal49SmallDiesisUp: { code: 'accSagittal49SmallDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal49SmallDiesisDown: { code: 'accSagittal49SmallDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal23SmallDiesisUp: { code: 'accSagittal23SmallDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal23SmallDiesisDown: { code: 'accSagittal23SmallDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal5v13MediumDiesisUp: { code: 'accSagittal5v13MediumDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal5v13MediumDiesisDown: { code: 'accSagittal5v13MediumDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal11v19MediumDiesisUp: { code: 'accSagittal11v19MediumDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal11v19MediumDiesisDown: { code: 'accSagittal11v19MediumDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal49MediumDiesisUp: { code: 'accSagittal49MediumDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal49MediumDiesisDown: { code: 'accSagittal49MediumDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal5v49MediumDiesisUp: { code: 'accSagittal5v49MediumDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal5v49MediumDiesisDown: { code: 'accSagittal5v49MediumDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal49LargeDiesisUp: { code: 'accSagittal49LargeDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal49LargeDiesisDown: { code: 'accSagittal49LargeDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal11v19LargeDiesisUp: { code: 'accSagittal11v19LargeDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal11v19LargeDiesisDown: { code: 'accSagittal11v19LargeDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittal5v13LargeDiesisUp: { code: 'accSagittal5v13LargeDiesisUp', parenRightPaddingAdjustment: -1 }, + accSagittal5v13LargeDiesisDown: { code: 'accSagittal5v13LargeDiesisDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp23SDown: { code: 'accSagittalSharp23SDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat23SUp: { code: 'accSagittalFlat23SUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp49SDown: { code: 'accSagittalSharp49SDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat49SUp: { code: 'accSagittalFlat49SUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp7v19CDown: { code: 'accSagittalSharp7v19CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat7v19CUp: { code: 'accSagittalFlat7v19CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp19CDown: { code: 'accSagittalSharp19CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat19CUp: { code: 'accSagittalFlat19CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp11v49CDown: { code: 'accSagittalSharp11v49CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat11v49CUp: { code: 'accSagittalFlat11v49CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp143CDown: { code: 'accSagittalSharp143CDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat143CUp: { code: 'accSagittalFlat143CUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp17kDown: { code: 'accSagittalSharp17kDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat17kUp: { code: 'accSagittalFlat17kUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp19sDown: { code: 'accSagittalSharp19sDown', parenRightPaddingAdjustment: -1 }, + accSagittalFlat19sUp: { code: 'accSagittalFlat19sUp', parenRightPaddingAdjustment: -1 }, + accSagittalSharp19sUp: { code: 'accSagittalSharp19sUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat19sDown: { code: 'accSagittalFlat19sDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp17kUp: { code: 'accSagittalSharp17kUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat17kDown: { code: 'accSagittalFlat17kDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp143CUp: { code: 'accSagittalSharp143CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat143CDown: { code: 'accSagittalFlat143CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp11v49CUp: { code: 'accSagittalSharp11v49CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat11v49CDown: { code: 'accSagittalFlat11v49CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp19CUp: { code: 'accSagittalSharp19CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat19CDown: { code: 'accSagittalFlat19CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp7v19CUp: { code: 'accSagittalSharp7v19CUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat7v19CDown: { code: 'accSagittalFlat7v19CDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp49SUp: { code: 'accSagittalSharp49SUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat49SDown: { code: 'accSagittalFlat49SDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp23SUp: { code: 'accSagittalSharp23SUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat23SDown: { code: 'accSagittalFlat23SDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v13MUp: { code: 'accSagittalSharp5v13MUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v13MDown: { code: 'accSagittalFlat5v13MDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp11v19MUp: { code: 'accSagittalSharp11v19MUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat11v19MDown: { code: 'accSagittalFlat11v19MDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp49MUp: { code: 'accSagittalSharp49MUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat49MDown: { code: 'accSagittalFlat49MDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v49MUp: { code: 'accSagittalSharp5v49MUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v49MDown: { code: 'accSagittalFlat5v49MDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp49LUp: { code: 'accSagittalSharp49LUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat49LDown: { code: 'accSagittalFlat49LDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp11v19LUp: { code: 'accSagittalSharp11v19LUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat11v19LDown: { code: 'accSagittalFlat11v19LDown', parenRightPaddingAdjustment: -1 }, + accSagittalSharp5v13LUp: { code: 'accSagittalSharp5v13LUp', parenRightPaddingAdjustment: -1 }, + accSagittalFlat5v13LDown: { code: 'accSagittalFlat5v13LDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp23SDown: { code: 'accSagittalDoubleSharp23SDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat23SUp: { code: 'accSagittalDoubleFlat23SUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp49SDown: { code: 'accSagittalDoubleSharp49SDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat49SUp: { code: 'accSagittalDoubleFlat49SUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp7v19CDown: { code: 'accSagittalDoubleSharp7v19CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat7v19CUp: { code: 'accSagittalDoubleFlat7v19CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp19CDown: { code: 'accSagittalDoubleSharp19CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat19CUp: { code: 'accSagittalDoubleFlat19CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp11v49CDown: { code: 'accSagittalDoubleSharp11v49CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat11v49CUp: { code: 'accSagittalDoubleFlat11v49CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp143CDown: { code: 'accSagittalDoubleSharp143CDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat143CUp: { code: 'accSagittalDoubleFlat143CUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp17kDown: { code: 'accSagittalDoubleSharp17kDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat17kUp: { code: 'accSagittalDoubleFlat17kUp', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleSharp19sDown: { code: 'accSagittalDoubleSharp19sDown', parenRightPaddingAdjustment: -1 }, + accSagittalDoubleFlat19sUp: { code: 'accSagittalDoubleFlat19sUp', parenRightPaddingAdjustment: -1 }, + accSagittalShaftUp: { code: 'accSagittalShaftUp', parenRightPaddingAdjustment: -1 }, + accSagittalShaftDown: { code: 'accSagittalShaftDown', parenRightPaddingAdjustment: -1 }, + accSagittalAcute: { code: 'accSagittalAcute', parenRightPaddingAdjustment: -1 }, + accSagittalGrave: { code: 'accSagittalGrave', parenRightPaddingAdjustment: -1 }, + accSagittal1MinaUp: { code: 'accSagittal1MinaUp', parenRightPaddingAdjustment: -1 }, + accSagittal1MinaDown: { code: 'accSagittal1MinaDown', parenRightPaddingAdjustment: -1 }, + accSagittal2MinasUp: { code: 'accSagittal2MinasUp', parenRightPaddingAdjustment: -1 }, + accSagittal2MinasDown: { code: 'accSagittal2MinasDown', parenRightPaddingAdjustment: -1 }, + accSagittal1TinaUp: { code: 'accSagittal1TinaUp', parenRightPaddingAdjustment: -1 }, + accSagittal1TinaDown: { code: 'accSagittal1TinaDown', parenRightPaddingAdjustment: -1 }, + accSagittal2TinasUp: { code: 'accSagittal2TinasUp', parenRightPaddingAdjustment: -1 }, + accSagittal2TinasDown: { code: 'accSagittal2TinasDown', parenRightPaddingAdjustment: -1 }, + accSagittal3TinasUp: { code: 'accSagittal3TinasUp', parenRightPaddingAdjustment: -1 }, + accSagittal3TinasDown: { code: 'accSagittal3TinasDown', parenRightPaddingAdjustment: -1 }, + accSagittal4TinasUp: { code: 'accSagittal4TinasUp', parenRightPaddingAdjustment: -1 }, + accSagittal4TinasDown: { code: 'accSagittal4TinasDown', parenRightPaddingAdjustment: -1 }, + accSagittal5TinasUp: { code: 'accSagittal5TinasUp', parenRightPaddingAdjustment: -1 }, + accSagittal5TinasDown: { code: 'accSagittal5TinasDown', parenRightPaddingAdjustment: -1 }, + accSagittal6TinasUp: { code: 'accSagittal6TinasUp', parenRightPaddingAdjustment: -1 }, + accSagittal6TinasDown: { code: 'accSagittal6TinasDown', parenRightPaddingAdjustment: -1 }, + accSagittal7TinasUp: { code: 'accSagittal7TinasUp', parenRightPaddingAdjustment: -1 }, + accSagittal7TinasDown: { code: 'accSagittal7TinasDown', parenRightPaddingAdjustment: -1 }, + accSagittal8TinasUp: { code: 'accSagittal8TinasUp', parenRightPaddingAdjustment: -1 }, + accSagittal8TinasDown: { code: 'accSagittal8TinasDown', parenRightPaddingAdjustment: -1 }, + accSagittal9TinasUp: { code: 'accSagittal9TinasUp', parenRightPaddingAdjustment: -1 }, + accSagittal9TinasDown: { code: 'accSagittal9TinasDown', parenRightPaddingAdjustment: -1 }, + accSagittalFractionalTinaUp: { code: 'accSagittalFractionalTinaUp', parenRightPaddingAdjustment: -1 }, + accSagittalFractionalTinaDown: { code: 'accSagittalFractionalTinaDown', parenRightPaddingAdjustment: -1 }, + accidentalNarrowReversedFlat: { code: 'accidentalNarrowReversedFlat', parenRightPaddingAdjustment: -1 }, + accidentalNarrowReversedFlatAndFlat: { + code: 'accidentalNarrowReversedFlatAndFlat', + parenRightPaddingAdjustment: -1, + }, + accidentalWilsonPlus: { code: 'accidentalWilsonPlus', parenRightPaddingAdjustment: -1 }, + accidentalWilsonMinus: { code: 'accidentalWilsonMinus', parenRightPaddingAdjustment: -1 }, +}; +const accidentalColumns = { + 1: { + a: [1], + b: [1], + }, + 2: { + a: [1, 2], + }, + 3: { + a: [1, 3, 2], + b: [1, 2, 1], + second_on_bottom: [1, 2, 3], + }, + 4: { + a: [1, 3, 4, 2], + b: [1, 2, 3, 1], + spaced_out_tetrachord: [1, 2, 1, 2], + }, + 5: { + a: [1, 3, 5, 4, 2], + b: [1, 2, 4, 3, 1], + spaced_out_pentachord: [1, 2, 3, 2, 1], + very_spaced_out_pentachord: [1, 2, 1, 2, 1], + }, + 6: { + a: [1, 3, 5, 6, 4, 2], + b: [1, 2, 4, 5, 3, 1], + spaced_out_hexachord: [1, 3, 2, 1, 3, 2], + very_spaced_out_hexachord: [1, 2, 1, 2, 1, 2], + }, +}; +const articulations = { + 'a.': { code: 'augmentationDot', between_lines: true }, + av: { + aboveCode: 'articStaccatissimoAbove', + belowCode: 'articStaccatissimoBelow', + between_lines: true, + }, + 'a>': { + aboveCode: 'articAccentAbove', + belowCode: 'articAccentBelow', + between_lines: true, + }, + 'a-': { + aboveCode: 'articTenutoAbove', + belowCode: 'articTenutoBelow', + between_lines: true, + }, + 'a^': { + aboveCode: 'articMarcatoAbove', + belowCode: 'articMarcatoBelow', + between_lines: false, + }, + 'a+': { code: 'pluckedLeftHandPizzicato', between_lines: false }, + ao: { + aboveCode: 'pluckedSnapPizzicatoAbove', + belowCode: 'pluckedSnapPizzicatoBelow', + between_lines: false, + }, + ah: { code: 'stringsHarmonic', between_lines: false }, + 'a@': { aboveCode: 'fermataAbove', belowCode: 'fermataBelow', between_lines: false }, + 'a@a': { code: 'fermataAbove', between_lines: false }, + 'a@u': { code: 'fermataBelow', between_lines: false }, + 'a|': { code: 'stringsUpBow', between_lines: false }, + am: { code: 'stringsDownBow', between_lines: false }, + 'a,': { code: 'pictChokeCymbal', between_lines: false }, +}; +const ornaments = { + mordent: { code: 'ornamentShortTrill' }, + mordent_inverted: { code: 'ornamentMordent' }, + turn: { code: 'ornamentTurn' }, + turn_inverted: { code: 'ornamentTurnSlash' }, + tr: { code: 'ornamentTrill' }, + upprall: { code: 'ornamentPrecompSlideTrillDAnglebert' }, + downprall: { code: 'ornamentPrecompDoubleCadenceUpperPrefix' }, + prallup: { code: 'ornamentPrecompTrillSuffixDandrieu' }, + pralldown: { code: 'ornamentPrecompTrillLowerSuffix' }, + upmordent: { code: 'ornamentPrecompSlideTrillBach' }, + downmordent: { code: 'ornamentPrecompDoubleCadenceUpperPrefixTurn' }, + lineprall: { code: 'ornamentPrecompAppoggTrill' }, + prallprall: { code: 'ornamentTremblement' }, + scoop: { code: 'brassScoop' }, + doit: { code: 'brassDoitMedium' }, + fall: { code: 'brassFallLipShort' }, + doitLong: { code: 'brassLiftMedium' }, + fallLong: { code: 'brassFallRoughMedium' }, + bend: { code: 'brassBend' }, + plungerClosed: { code: 'brassMuteClosed' }, + plungerOpen: { code: 'brassMuteOpen' }, + flip: { code: 'brassFlip' }, + jazzTurn: { code: 'brassJazzTurn' }, + smear: { code: 'brassSmear' }, +}; +export class Tables { + static currentMusicFont() { + if (Tables.MUSIC_FONT_STACK.length === 0) { + throw new RuntimeError('NoFonts', 'The font stack is empty. See: await Flow.fetchMusicFont(...); Flow.setMusicFont(...).'); + } + else { + return Tables.MUSIC_FONT_STACK[0]; + } + } + static clefProperties(clef) { + if (!clef || !(clef in clefs)) + throw new RuntimeError('BadArgument', 'Invalid clef: ' + clef); + return clefs[clef]; + } + static keyProperties(keyOctaveGlyph, clef = 'treble', params) { + let options = { octave_shift: 0 }; + if (typeof params === 'object') { + options = Object.assign(Object.assign({}, options), params); + } + const pieces = keyOctaveGlyph.split('/'); + if (pieces.length < 2) { + throw new RuntimeError('BadArguments', `First argument must be note/octave or note/octave/glyph-code: ${keyOctaveGlyph}`); + } + const key = pieces[0].toUpperCase(); + const value = notesInfo[key]; + if (!value) + throw new RuntimeError('BadArguments', 'Invalid key name: ' + key); + if (value.octave) + pieces[1] = value.octave.toString(); + let octave = parseInt(pieces[1], 10); + octave += -1 * options.octave_shift; + const baseIndex = octave * 7 - 4 * 7; + let line = (baseIndex + value.index) / 2; + line += Tables.clefProperties(clef).line_shift; + let stroke = 0; + if (line <= 0 && (line * 2) % 2 === 0) + stroke = 1; + if (line >= 6 && (line * 2) % 2 === 0) + stroke = -1; + const int_value = typeof value.int_val !== 'undefined' ? octave * 12 + value.int_val : undefined; + const code = value.code; + const shift_right = value.shift_right; + let customNoteHeadProps = {}; + if (pieces.length > 2 && pieces[2]) { + const glyphName = pieces[2].toUpperCase(); + customNoteHeadProps = customNoteHeads[glyphName] || {}; + } + return Object.assign({ key, + octave, + line, + int_value, accidental: value.accidental, code, + stroke, + shift_right, displaced: false }, customNoteHeadProps); + } + static integerToNote(integer) { + if (typeof integer === 'undefined' || integer < 0 || integer > 11) { + throw new RuntimeError('BadArguments', `integerToNote() requires an integer in the range [0, 11]: ${integer}`); + } + const table = { + 0: 'C', + 1: 'C#', + 2: 'D', + 3: 'D#', + 4: 'E', + 5: 'F', + 6: 'F#', + 7: 'G', + 8: 'G#', + 9: 'A', + 10: 'A#', + 11: 'B', + }; + const noteValue = table[integer]; + if (!noteValue) { + throw new RuntimeError('BadArguments', `Unknown note value for integer: ${integer}`); + } + return noteValue; + } + static tabToGlyph(fret, scale = 1.0) { + let glyph = undefined; + let width = 0; + let shift_y = 0; + if (fret.toUpperCase() === 'X') { + const glyphMetrics = new Glyph('accidentalDoubleSharp', Tables.TABLATURE_FONT_SCALE).getMetrics(); + glyph = 'accidentalDoubleSharp'; + if (glyphMetrics.width == undefined || glyphMetrics.height == undefined) + throw new RuntimeError('InvalidMetrics', 'Width and height required'); + width = glyphMetrics.width; + shift_y = -glyphMetrics.height / 2; + } + else { + width = Tables.textWidth(fret); + } + return { + text: fret, + code: glyph, + getWidth: () => width * scale, + shift_y, + }; + } + static textWidth(text) { + return 7 * text.toString().length; + } + static articulationCodes(artic) { + return articulations[artic]; + } + static accidentalCodes(acc) { + return accidentals[acc]; + } + static ornamentCodes(acc) { + return ornaments[acc]; + } + static keySignature(spec) { + const keySpec = keySignatures[spec]; + if (!keySpec) { + throw new RuntimeError('BadKeySignature', `Bad key signature spec: '${spec}'`); + } + if (!keySpec.acc) { + return []; + } + const accidentalList = { + b: [2, 0.5, 2.5, 1, 3, 1.5, 3.5], + '#': [0, 1.5, -0.5, 1, 2.5, 0.5, 2], + }; + const notes = accidentalList[keySpec.acc]; + const acc_list = []; + for (let i = 0; i < keySpec.num; ++i) { + const line = notes[i]; + acc_list.push({ type: keySpec.acc, line }); + } + return acc_list; + } + static getKeySignatures() { + return keySignatures; + } + static hasKeySignature(spec) { + return spec in keySignatures; + } + static sanitizeDuration(duration) { + const durationNumber = durationAliases[duration]; + if (durationNumber !== undefined) { + duration = durationNumber; + } + if (durations[duration] === undefined) { + throw new RuntimeError('BadArguments', `The provided duration is not valid: ${duration}`); + } + return duration; + } + static durationToFraction(duration) { + return new Fraction().parse(Tables.sanitizeDuration(duration)); + } + static durationToNumber(duration) { + return Tables.durationToFraction(duration).value(); + } + static durationToTicks(duration) { + duration = Tables.sanitizeDuration(duration); + const ticks = durations[duration]; + if (ticks === undefined) { + throw new RuntimeError('InvalidDuration'); + } + return ticks; + } + static getGlyphProps(duration, type = 'n') { + duration = Tables.sanitizeDuration(duration); + const code = durationCodes[duration]; + if (code === undefined) { + return undefined; + } + let glyphTypeProperties = code.type[type]; + if (glyphTypeProperties === undefined) { + const customGlyphTypeProperties = customNoteHeads[type.toUpperCase()]; + if (customGlyphTypeProperties === undefined) { + return undefined; + } + glyphTypeProperties = Object.assign({ code_head: customGlyphTypeProperties.code }, customGlyphTypeProperties); + } + const code_head = glyphTypeProperties.code_head; + const getWidth = (scale = Tables.NOTATION_FONT_SCALE) => Glyph.getWidth(code_head, scale); + return Object.assign(Object.assign(Object.assign({}, code.common), { getWidth: getWidth }), glyphTypeProperties); + } +} +Tables.STEM_WIDTH = 1.5; +Tables.STEM_HEIGHT = 35; +Tables.STAVE_LINE_THICKNESS = 1; +Tables.RESOLUTION = RESOLUTION; +Tables.MUSIC_FONT_STACK = []; +Tables.NOTATION_FONT_SCALE = 39; +Tables.TABLATURE_FONT_SCALE = 39; +Tables.SLASH_NOTEHEAD_WIDTH = 15; +Tables.STAVE_LINE_DISTANCE = 10; +Tables.TEXT_HEIGHT_OFFSET_HACK = 1; +Tables.accidentalMap = accidentals; +Tables.accidentalColumnsTable = accidentalColumns; +Tables.unicode = { + sharp: String.fromCharCode(0x266f), + flat: String.fromCharCode(0x266d), + natural: String.fromCharCode(0x266e), + triangle: String.fromCharCode(0x25b3), + 'o-with-slash': String.fromCharCode(0x00f8), + degrees: String.fromCharCode(0x00b0), + circle: String.fromCharCode(0x25cb), +}; +Tables.validTypes = validNoteTypes; +Tables.TIME4_4 = { + num_beats: 4, + beat_value: 4, + resolution: RESOLUTION, +}; +const durationCodes = { + '1/2': { + common: { + stem: false, + stem_offset: 0, + flag: false, + dot_shiftY: 0, + line_above: 0, + line_below: 0, + }, + type: { + n: { + code_head: 'noteheadDoubleWhole', + }, + h: { + code_head: 'unpitchedPercussionClef1', + }, + m: { + code_head: 'vexNoteHeadMutedBreve', + stem_offset: 0, + }, + r: { + code_head: 'restDoubleWhole', + rest: true, + position: 'B/5', + dot_shiftY: 0.5, + }, + s: { + getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH, + position: 'B/4', + }, + g: { + code_head: 'noteheadDoubleWhole', + }, + }, + }, + 1: { + common: { + stem: false, + stem_offset: 0, + flag: false, + dot_shiftY: 0, + line_above: 0, + line_below: 0, + }, + type: { + n: { + code_head: 'noteheadWhole', + }, + h: { + code_head: 'noteheadDiamondWhole', + }, + m: { + code_head: 'noteheadXWhole', + stem_offset: -3, + }, + r: { + code_head: 'restWhole', + rest: true, + position: 'D/5', + dot_shiftY: 0.5, + }, + s: { + getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH, + position: 'B/4', + }, + g: { + code_head: 'noteheadWhole', + }, + }, + }, + 2: { + common: { + stem: true, + stem_offset: 0, + flag: false, + dot_shiftY: 0, + line_above: 0, + line_below: 0, + }, + type: { + n: { + code_head: 'noteheadHalf', + }, + h: { + code_head: 'noteheadDiamondHalf', + }, + m: { + code_head: 'noteheadXHalf', + stem_offset: -3, + }, + r: { + code_head: 'restHalf', + stem: false, + rest: true, + position: 'B/4', + dot_shiftY: -0.5, + }, + s: { + getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH, + position: 'B/4', + }, + g: { + code_head: 'noteheadHalf', + }, + }, + }, + 4: { + common: { + stem: true, + stem_offset: 0, + flag: false, + dot_shiftY: 0, + line_above: 0, + line_below: 0, + }, + type: { + n: { + code_head: 'noteheadBlack', + }, + h: { + code_head: 'noteheadDiamondBlack', + }, + m: { + code_head: 'noteheadXBlack', + }, + r: { + code_head: 'restQuarter', + stem: false, + rest: true, + position: 'B/4', + dot_shiftY: -0.5, + line_above: 1.5, + line_below: 1.5, + }, + s: { + getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH, + position: 'B/4', + }, + g: { + code_head: 'noteheadBlack', + }, + }, + }, + 8: { + common: { + stem: true, + stem_offset: 0, + flag: true, + beam_count: 1, + stem_beam_extension: 0, + code_flag_upstem: 'flag8thUp', + code_flag_downstem: 'flag8thDown', + dot_shiftY: 0, + line_above: 0, + line_below: 0, + }, + type: { + n: { + code_head: 'noteheadBlack', + }, + h: { + code_head: 'noteheadDiamondBlack', + }, + m: { + code_head: 'noteheadXBlack', + }, + r: { + code_head: 'rest8th', + stem: false, + flag: false, + rest: true, + position: 'B/4', + dot_shiftY: -0.5, + line_above: 1.0, + line_below: 1.0, + }, + s: { + getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH, + position: 'B/4', + }, + g: { + code_head: 'noteheadBlack', + }, + }, + }, + 16: { + common: { + beam_count: 2, + stem_beam_extension: 0, + stem: true, + stem_offset: 0, + flag: true, + code_flag_upstem: 'flag16thUp', + code_flag_downstem: 'flag16thDown', + dot_shiftY: 0, + line_above: 0, + line_below: 0, + }, + type: { + n: { + code_head: 'noteheadBlack', + }, + h: { + code_head: 'noteheadDiamondBlack', + }, + m: { + code_head: 'noteheadXBlack', + }, + r: { + code_head: 'rest16th', + stem: false, + flag: false, + rest: true, + position: 'B/4', + dot_shiftY: -0.5, + line_above: 1.0, + line_below: 2.0, + }, + s: { + getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH, + position: 'B/4', + }, + g: { + code_head: 'noteheadBlack', + }, + }, + }, + 32: { + common: { + beam_count: 3, + stem_beam_extension: 7.5, + stem: true, + stem_offset: 0, + flag: true, + code_flag_upstem: 'flag32ndUp', + code_flag_downstem: 'flag32ndDown', + dot_shiftY: 0, + line_above: 0, + line_below: 0, + }, + type: { + n: { + code_head: 'noteheadBlack', + }, + h: { + code_head: 'noteheadDiamondBlack', + }, + m: { + code_head: 'noteheadXBlack', + }, + r: { + code_head: 'rest32nd', + stem: false, + flag: false, + rest: true, + position: 'B/4', + dot_shiftY: -1.5, + line_above: 2.0, + line_below: 2.0, + }, + s: { + getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH, + position: 'B/4', + }, + g: { + code_head: 'noteheadBlack', + }, + }, + }, + 64: { + common: { + beam_count: 4, + stem_beam_extension: 15, + stem: true, + stem_offset: 0, + flag: true, + code_flag_upstem: 'flag64thUp', + code_flag_downstem: 'flag64thDown', + dot_shiftY: 0, + line_above: 0, + line_below: 0, + }, + type: { + n: { + code_head: 'noteheadBlack', + }, + h: { + code_head: 'noteheadDiamondBlack', + }, + m: { + code_head: 'noteheadXBlack', + }, + r: { + code_head: 'rest64th', + stem: false, + flag: false, + rest: true, + position: 'B/4', + dot_shiftY: -1.5, + line_above: 2.0, + line_below: 3.0, + }, + s: { + getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH, + position: 'B/4', + }, + g: { + code_head: 'noteheadBlack', + }, + }, + }, + 128: { + common: { + beam_count: 5, + stem_beam_extension: 22.5, + stem: true, + stem_offset: 0, + flag: true, + code_flag_upstem: 'flag128thUp', + code_flag_downstem: 'flag128thDown', + dot_shiftY: 0, + line_above: 0, + line_below: 0, + }, + type: { + n: { + code_head: 'noteheadBlack', + }, + h: { + code_head: 'noteheadDiamondBlack', + }, + m: { + code_head: 'noteheadXBlack', + }, + r: { + code_head: 'rest128th', + stem: false, + flag: false, + rest: true, + position: 'B/4', + dot_shiftY: -2.5, + line_above: 3.0, + line_below: 3.0, + }, + s: { + getWidth: () => Tables.SLASH_NOTEHEAD_WIDTH, + position: 'B/4', + }, + g: { + code_head: 'noteheadBlack', + }, + }, + }, +}; diff --git a/build/esm/src/tabnote.js b/build/esm/src/tabnote.js new file mode 100644 index 0000000000..853de67ea7 --- /dev/null +++ b/build/esm/src/tabnote.js @@ -0,0 +1,296 @@ +import { Font } from './font.js'; +import { Glyph } from './glyph.js'; +import { Modifier } from './modifier.js'; +import { Stem } from './stem.js'; +import { StemmableNote } from './stemmablenote.js'; +import { Tables } from './tables.js'; +import { isDot } from './typeguard.js'; +import { defined, RuntimeError } from './util.js'; +function getUnusedStringGroups(num_lines, strings_used) { + const stem_through = []; + let group = []; + for (let string = 1; string <= num_lines; string++) { + const is_used = strings_used.indexOf(string) > -1; + if (!is_used) { + group.push(string); + } + else { + stem_through.push(group); + group = []; + } + } + if (group.length > 0) + stem_through.push(group); + return stem_through; +} +function getPartialStemLines(stem_y, unused_strings, stave, stem_direction) { + const up_stem = stem_direction !== 1; + const down_stem = stem_direction !== -1; + const line_spacing = stave.getSpacingBetweenLines(); + const total_lines = stave.getNumLines(); + const stem_lines = []; + unused_strings.forEach((strings) => { + const containsLastString = strings.indexOf(total_lines) > -1; + const containsFirstString = strings.indexOf(1) > -1; + if ((up_stem && containsFirstString) || (down_stem && containsLastString)) { + return; + } + if (strings.length === 1) { + strings.push(strings[0]); + } + const line_ys = []; + strings.forEach((string, index, strings) => { + const isTopBound = string === 1; + const isBottomBound = string === total_lines; + let y = stave.getYForLine(string - 1); + if (index === 0 && !isTopBound) { + y -= line_spacing / 2 - 1; + } + else if (index === strings.length - 1 && !isBottomBound) { + y += line_spacing / 2 - 1; + } + line_ys.push(y); + if (stem_direction === 1 && isTopBound) { + line_ys.push(stem_y - 2); + } + else if (stem_direction === -1 && isBottomBound) { + line_ys.push(stem_y + 2); + } + }); + stem_lines.push(line_ys.sort((a, b) => a - b)); + }); + return stem_lines; +} +export class TabNote extends StemmableNote { + constructor(noteStruct, draw_stem = false) { + super(noteStruct); + this.glyphs = []; + this.greatestString = () => { + return this.positions.map((x) => x.str).reduce((a, b) => (a > b ? a : b)); + }; + this.leastString = () => { + return this.positions.map((x) => x.str).reduce((a, b) => (a < b ? a : b)); + }; + this.ghost = false; + this.positions = noteStruct.positions || []; + this.render_options = Object.assign(Object.assign({}, this.render_options), { glyph_font_scale: Tables.TABLATURE_FONT_SCALE, draw_stem, draw_dots: draw_stem, draw_stem_through_stave: false, y_shift: 0, scale: 1.0, font: `${Font.SIZE}pt ${Font.SANS_SERIF}` }); + this.glyph = Tables.getGlyphProps(this.duration, this.noteType); + defined(this.glyph, 'BadArguments', `No glyph found for duration '${this.duration}' and type '${this.noteType}'`); + this.buildStem(); + if (noteStruct.stem_direction) { + this.setStemDirection(noteStruct.stem_direction); + } + else { + this.setStemDirection(Stem.UP); + } + this.ghost = false; + this.updateWidth(); + } + static get CATEGORY() { + return "TabNote"; + } + reset() { + super.reset(); + if (this.stave) + this.setStave(this.stave); + return this; + } + setGhost(ghost) { + this.ghost = ghost; + this.updateWidth(); + return this; + } + hasStem() { + if (this.render_options.draw_stem) + return true; + return false; + } + getStemExtension() { + if (this.stem_extension_override != null) { + return this.stem_extension_override; + } + if (this.flag) { + return this.getStemDirection() === 1 ? -this.flag.checkMetrics().y_shift : this.flag.checkMetrics().y_shift; + } + return 0; + } + updateWidth() { + this.glyphs = []; + this.width = 0; + for (let i = 0; i < this.positions.length; ++i) { + let fret = this.positions[i].fret; + if (this.ghost) + fret = '(' + fret + ')'; + const glyph = Tables.tabToGlyph(fret.toString(), this.render_options.scale); + this.glyphs.push(glyph); + this.width = Math.max(glyph.getWidth(), this.width); + } + this.glyph.getWidth = () => this.width; + } + setStave(stave) { + super.setStave(stave); + const ctx = stave.getContext(); + this.setContext(ctx); + if (ctx) { + this.width = 0; + for (let i = 0; i < this.glyphs.length; ++i) { + const glyph = this.glyphs[i]; + const text = '' + glyph.text; + if (text.toUpperCase() !== 'X') { + ctx.save(); + ctx.setFont(this.render_options.font); + glyph.width = ctx.measureText(text).width; + ctx.restore(); + glyph.getWidth = () => glyph.width; + } + this.width = Math.max(glyph.getWidth(), this.width); + } + this.glyph.getWidth = () => this.width; + } + const ys = this.positions.map(({ str: line }) => stave.getYForLine(Number(line) - 1)); + this.setYs(ys); + if (this.stem) { + this.stem.setYBounds(this.getStemY(), this.getStemY()); + } + return this; + } + getPositions() { + return this.positions; + } + getModifierStartXY(position, index) { + if (!this.preFormatted) { + throw new RuntimeError('UnformattedNote', "Can't call GetModifierStartXY on an unformatted note"); + } + if (this.ys.length === 0) { + throw new RuntimeError('NoYValues', 'No Y-Values calculated for this note.'); + } + let x = 0; + if (position === Modifier.Position.LEFT) { + x = -1 * 2; + } + else if (position === Modifier.Position.RIGHT) { + x = this.width + 2; + } + else if (position === Modifier.Position.BELOW || position === Modifier.Position.ABOVE) { + const note_glyph_width = this.glyph.getWidth(); + x = note_glyph_width / 2; + } + return { + x: this.getAbsoluteX() + x, + y: this.ys[index], + }; + } + getLineForRest() { + return Number(this.positions[0].str); + } + preFormat() { + if (this.preFormatted) + return; + if (this.modifierContext) + this.modifierContext.preFormat(); + this.preFormatted = true; + } + getStemX() { + return this.getCenterGlyphX(); + } + getStemY() { + const num_lines = this.checkStave().getNumLines(); + const stemUpLine = -0.5; + const stemDownLine = num_lines - 0.5; + const stemStartLine = Stem.UP === this.stem_direction ? stemUpLine : stemDownLine; + return this.checkStave().getYForLine(stemStartLine); + } + getStemExtents() { + return this.checkStem().getExtents(); + } + drawFlag() { + const { beam, glyph, stem_direction, render_options: { draw_stem, glyph_font_scale }, } = this; + const context = this.checkContext(); + const shouldDrawFlag = beam == undefined && draw_stem; + if (glyph.flag && shouldDrawFlag) { + const flag_x = this.getStemX() + 1; + const flag_y = this.getStemY() - this.checkStem().getHeight(); + const flag_code = stem_direction === Stem.DOWN + ? glyph.code_flag_downstem + : glyph.code_flag_upstem; + Glyph.renderGlyph(context, flag_x, flag_y, glyph_font_scale, flag_code, { category: 'flag.tabStem' }); + } + } + drawModifiers() { + this.modifiers.forEach((modifier) => { + if (isDot(modifier) && !this.render_options.draw_dots) { + return; + } + modifier.setContext(this.getContext()); + modifier.drawWithStyle(); + }); + } + drawStemThrough() { + const stemX = this.getStemX(); + const stemY = this.getStemY(); + const ctx = this.checkContext(); + const drawStem = this.render_options.draw_stem; + const stemThrough = this.render_options.draw_stem_through_stave; + if (drawStem && stemThrough) { + const numLines = this.checkStave().getNumLines(); + const stringsUsed = this.positions.map((position) => Number(position.str)); + const unusedStrings = getUnusedStringGroups(numLines, stringsUsed); + const stemLines = getPartialStemLines(stemY, unusedStrings, this.checkStave(), this.getStemDirection()); + ctx.save(); + ctx.setLineWidth(Stem.WIDTH); + stemLines.forEach((bounds) => { + if (bounds.length === 0) + return; + ctx.beginPath(); + ctx.moveTo(stemX, bounds[0]); + ctx.lineTo(stemX, bounds[bounds.length - 1]); + ctx.stroke(); + ctx.closePath(); + }); + ctx.restore(); + } + } + drawPositions() { + const ctx = this.checkContext(); + const x = this.getAbsoluteX(); + const ys = this.ys; + for (let i = 0; i < this.positions.length; ++i) { + const y = ys[i] + this.render_options.y_shift; + const glyph = this.glyphs[i]; + const note_glyph_width = this.glyph.getWidth(); + const tab_x = x + note_glyph_width / 2 - glyph.getWidth() / 2; + ctx.clearRect(tab_x - 2, y - 3, glyph.getWidth() + 4, 6); + if (glyph.code) { + Glyph.renderGlyph(ctx, tab_x, y, this.render_options.glyph_font_scale * this.render_options.scale, glyph.code); + } + else { + ctx.save(); + ctx.setFont(this.render_options.font); + const text = glyph.text.toString(); + ctx.fillText(text, tab_x, y + 5 * this.render_options.scale); + ctx.restore(); + } + } + } + draw() { + const ctx = this.checkContext(); + if (this.ys.length === 0) { + throw new RuntimeError('NoYValues', "Can't draw note without Y values."); + } + this.setRendered(); + const render_stem = this.beam == undefined && this.render_options.draw_stem; + ctx.openGroup('tabnote', undefined, { pointerBBox: true }); + this.drawPositions(); + this.drawStemThrough(); + if (this.stem && render_stem) { + const stem_x = this.getStemX(); + this.stem.setNoteHeadXBounds(stem_x, stem_x); + ctx.openGroup('stem', undefined, { pointerBBox: true }); + this.stem.setContext(ctx).draw(); + ctx.closeGroup(); + } + this.drawFlag(); + this.drawModifiers(); + ctx.closeGroup(); + } +} diff --git a/build/esm/src/tabslide.js b/build/esm/src/tabslide.js new file mode 100644 index 0000000000..cdf35a6441 --- /dev/null +++ b/build/esm/src/tabslide.js @@ -0,0 +1,76 @@ +import { Font, FontStyle, FontWeight } from './font.js'; +import { TabTie } from './tabtie.js'; +import { RuntimeError } from './util.js'; +export class TabSlide extends TabTie { + constructor(notes, direction) { + super(notes, 'sl.'); + if (!direction) { + let first_fret = notes.first_note.getPositions()[0].fret; + if (typeof first_fret === 'string') { + first_fret = parseInt(first_fret, 10); + } + let last_fret = notes.last_note.getPositions()[0].fret; + if (typeof last_fret === 'string') { + last_fret = parseInt(last_fret, 10); + } + if (isNaN(first_fret) || isNaN(last_fret)) { + direction = TabSlide.SLIDE_UP; + } + else { + direction = first_fret > last_fret ? TabSlide.SLIDE_DOWN : TabSlide.SLIDE_UP; + } + } + this.direction = direction; + this.render_options.cp1 = 11; + this.render_options.cp2 = 14; + this.render_options.y_shift = 0.5; + this.resetFont(); + } + static get CATEGORY() { + return "TabSlide"; + } + static get SLIDE_UP() { + return 1; + } + static get SLIDE_DOWN() { + return -1; + } + static createSlideUp(notes) { + return new TabSlide(notes, TabSlide.SLIDE_UP); + } + static createSlideDown(notes) { + return new TabSlide(notes, TabSlide.SLIDE_DOWN); + } + renderTie(params) { + if (params.first_ys.length === 0 || params.last_ys.length === 0) { + throw new RuntimeError('BadArguments', 'No Y-values to render'); + } + const ctx = this.checkContext(); + const first_x_px = params.first_x_px; + const first_ys = params.first_ys; + const last_x_px = params.last_x_px; + const direction = params.direction; + if (direction !== TabSlide.SLIDE_UP && direction !== TabSlide.SLIDE_DOWN) { + throw new RuntimeError('BadSlide', 'Invalid slide direction'); + } + const first_indices = this.notes.first_indices; + for (let i = 0; i < first_indices.length; ++i) { + const slide_y = first_ys[first_indices[i]] + this.render_options.y_shift; + if (isNaN(slide_y)) { + throw new RuntimeError('BadArguments', 'Bad indices for slide rendering.'); + } + ctx.beginPath(); + ctx.moveTo(first_x_px, slide_y + 3 * direction); + ctx.lineTo(last_x_px, slide_y - 3 * direction); + ctx.closePath(); + ctx.stroke(); + } + this.setRendered(); + } +} +TabSlide.TEXT_FONT = { + family: Font.SERIF, + size: 10, + weight: FontWeight.BOLD, + style: FontStyle.ITALIC, +}; diff --git a/build/esm/src/tabstave.js b/build/esm/src/tabstave.js new file mode 100644 index 0000000000..e71d724a53 --- /dev/null +++ b/build/esm/src/tabstave.js @@ -0,0 +1,17 @@ +import { Stave } from './stave.js'; +export class TabStave extends Stave { + static get CATEGORY() { + return "TabStave"; + } + constructor(x, y, width, options) { + const tab_options = Object.assign({ spacing_between_lines_px: 13, num_lines: 6, top_text_position: 1 }, options); + super(x, y, width, tab_options); + } + getYForGlyphs() { + return this.getYForLine(2.5); + } + addTabGlyph() { + this.addClef('tab'); + return this; + } +} diff --git a/build/esm/src/tabtie.js b/build/esm/src/tabtie.js new file mode 100644 index 0000000000..18a303cc73 --- /dev/null +++ b/build/esm/src/tabtie.js @@ -0,0 +1,19 @@ +import { StaveTie } from './stavetie.js'; +export class TabTie extends StaveTie { + static get CATEGORY() { + return "TabTie"; + } + static createHammeron(notes) { + return new TabTie(notes, 'H'); + } + static createPulloff(notes) { + return new TabTie(notes, 'P'); + } + constructor(notes, text) { + super(notes, text); + this.render_options.cp1 = 9; + this.render_options.cp2 = 11; + this.render_options.y_shift = 3; + this.direction = -1; + } +} diff --git a/build/esm/src/textbracket.js b/build/esm/src/textbracket.js new file mode 100644 index 0000000000..43dd44f786 --- /dev/null +++ b/build/esm/src/textbracket.js @@ -0,0 +1,144 @@ +import { Element } from './element.js'; +import { Font, FontStyle, FontWeight } from './font.js'; +import { Renderer } from './renderer.js'; +import { Tables } from './tables.js'; +import { log, RuntimeError } from './util.js'; +function L(...args) { + if (TextBracket.DEBUG) + log('Vex.Flow.TextBracket', args); +} +export var TextBracketPosition; +(function (TextBracketPosition) { + TextBracketPosition[TextBracketPosition["TOP"] = 1] = "TOP"; + TextBracketPosition[TextBracketPosition["BOTTOM"] = -1] = "BOTTOM"; +})(TextBracketPosition || (TextBracketPosition = {})); +export class TextBracket extends Element { + constructor({ start, stop, text = '', superscript = '', position = TextBracketPosition.TOP }) { + super(); + this.start = start; + this.stop = stop; + this.text = text; + this.superscript = superscript; + this.position = typeof position === 'string' ? TextBracket.PositionString[position] : position; + this.line = 1; + this.resetFont(); + this.render_options = { + dashed: true, + dash: [5], + color: 'black', + line_width: 1, + show_bracket: true, + bracket_height: 8, + underline_superscript: true, + }; + } + static get CATEGORY() { + return "TextBracket"; + } + static get Position() { + return TextBracketPosition; + } + static get PositionString() { + return { + top: TextBracketPosition.TOP, + bottom: TextBracketPosition.BOTTOM, + }; + } + static get Positions() { + L('Positions is deprecated, use TextBracketPosition instead.'); + return TextBracketPosition; + } + static get PositionsString() { + L('PositionsString is deprecated, use PositionString instead.'); + return TextBracket.PositionString; + } + applyStyle(ctx) { + ctx.setFont(this.font); + const options = this.render_options; + ctx.setStrokeStyle(options.color); + ctx.setFillStyle(options.color); + ctx.setLineWidth(options.line_width); + return this; + } + setDashed(dashed, dash) { + this.render_options.dashed = dashed; + if (dash) + this.render_options.dash = dash; + return this; + } + setLine(line) { + this.line = line; + return this; + } + draw() { + const ctx = this.checkContext(); + this.setRendered(); + let y = 0; + switch (this.position) { + case TextBracketPosition.TOP: + y = this.start.checkStave().getYForTopText(this.line); + break; + case TextBracketPosition.BOTTOM: + y = this.start.checkStave().getYForBottomText(this.line + Tables.TEXT_HEIGHT_OFFSET_HACK); + break; + default: + throw new RuntimeError('InvalidPosition', `The position ${this.position} is invalid.`); + } + const start = { x: this.start.getAbsoluteX(), y }; + const stop = { x: this.stop.getAbsoluteX(), y }; + L('Rendering TextBracket: start:', start, 'stop:', stop, 'y:', y); + const bracket_height = this.render_options.bracket_height * this.position; + ctx.save(); + this.applyStyle(ctx); + ctx.fillText(this.text, start.x, start.y); + const main_measure = ctx.measureText(this.text); + const main_width = main_measure.width; + const main_height = main_measure.height; + const super_y = start.y - main_height / 2.5; + const { family, size, weight, style } = this.textFont; + const smallerFontSize = Font.scaleSize(size, 0.714286); + ctx.setFont(family, smallerFontSize, weight, style); + ctx.fillText(this.superscript, start.x + main_width + 1, super_y); + const super_measure = ctx.measureText(this.superscript); + const super_width = super_measure.width; + const super_height = super_measure.height; + let start_x = start.x; + let line_y = super_y; + const end_x = stop.x + this.stop.getGlyph().getWidth(); + if (this.position === TextBracketPosition.TOP) { + start_x += main_width + super_width + 5; + line_y -= super_height / 2.7; + } + else if (this.position === TextBracketPosition.BOTTOM) { + line_y += super_height / 2.7; + start_x += main_width + 2; + if (!this.render_options.underline_superscript) { + start_x += super_width; + } + } + if (this.render_options.dashed) { + Renderer.drawDashedLine(ctx, start_x, line_y, end_x, line_y, this.render_options.dash); + if (this.render_options.show_bracket) { + Renderer.drawDashedLine(ctx, end_x, line_y + 1 * this.position, end_x, line_y + bracket_height, this.render_options.dash); + } + } + else { + ctx.beginPath(); + ctx.moveTo(start_x, line_y); + ctx.lineTo(end_x, line_y); + if (this.render_options.show_bracket) { + ctx.lineTo(end_x, line_y + bracket_height); + } + ctx.stroke(); + ctx.closePath(); + } + ctx.restore(); + } +} +TextBracket.DEBUG = false; +TextBracket.TEXT_FONT = { + family: Font.SERIF, + size: 15, + weight: FontWeight.NORMAL, + style: FontStyle.ITALIC, +}; diff --git a/build/esm/src/textdynamics.js b/build/esm/src/textdynamics.js new file mode 100644 index 0000000000..363800a944 --- /dev/null +++ b/build/esm/src/textdynamics.js @@ -0,0 +1,81 @@ +import { Glyph } from './glyph.js'; +import { Note } from './note.js'; +import { defined, log, RuntimeError } from './util.js'; +function L(...args) { + if (TextDynamics.DEBUG) + log('Vex.Flow.TextDynamics', args); +} +export class TextDynamics extends Note { + constructor(noteStruct) { + super(noteStruct); + this.sequence = (noteStruct.text || '').toLowerCase(); + this.line = noteStruct.line || 0; + this.glyphs = []; + this.render_options = Object.assign(Object.assign({}, this.render_options), { glyph_font_size: 40 }); + L('New Dynamics Text: ', this.sequence); + } + static get CATEGORY() { + return "TextDynamics"; + } + static get GLYPHS() { + return { + f: { + code: 'dynamicForte', + width: 12, + }, + p: { + code: 'dynamicPiano', + width: 14, + }, + m: { + code: 'dynamicMezzo', + width: 17, + }, + s: { + code: 'dynamicSforzando', + width: 10, + }, + z: { + code: 'dynamicZ', + width: 12, + }, + r: { + code: 'dynamicRinforzando', + width: 12, + }, + }; + } + setLine(line) { + this.line = line; + return this; + } + preFormat() { + let total_width = 0; + this.glyphs = []; + this.sequence.split('').forEach((letter) => { + const glyph_data = TextDynamics.GLYPHS[letter]; + if (!glyph_data) + throw new RuntimeError('Invalid dynamics character: ' + letter); + const size = defined(this.render_options.glyph_font_size); + const glyph = new Glyph(glyph_data.code, size, { category: 'textNote' }); + this.glyphs.push(glyph); + total_width += glyph_data.width; + }); + this.setWidth(total_width); + this.preFormatted = true; + return this; + } + draw() { + this.setRendered(); + const x = this.getAbsoluteX(); + const y = this.checkStave().getYForLine(this.line + -3); + L('Rendering Dynamics: ', this.sequence); + let letter_x = x; + this.glyphs.forEach((glyph, index) => { + const current_letter = this.sequence[index]; + glyph.render(this.checkContext(), letter_x, y); + letter_x += TextDynamics.GLYPHS[current_letter].width; + }); + } +} +TextDynamics.DEBUG = false; diff --git a/build/esm/src/textformatter.js b/build/esm/src/textformatter.js new file mode 100644 index 0000000000..3839b80e5b --- /dev/null +++ b/build/esm/src/textformatter.js @@ -0,0 +1,177 @@ +import { Font, FontStyle, FontWeight } from './font.js'; +import { log } from './util.js'; +function L(...args) { + if (TextFormatter.DEBUG) + log('Vex.Flow.TextFormatter', args); +} +const textWidthCache = {}; +const registry = {}; +export class TextFormatter { + constructor(formatterInfo) { + this.family = ''; + this.size = 14; + this.resolution = 1000; + this.glyphs = {}; + this.serifs = false; + this.monospaced = false; + this.italic = false; + this.bold = false; + this.superscriptOffset = 0; + this.subscriptOffset = 0; + this.maxSizeGlyph = 'H'; + this.cacheKey = ''; + this.updateParams(formatterInfo); + } + static getFontFamilies() { + const registeredFonts = []; + for (const fontFamily in registry) { + const formatterInfo = registry[fontFamily]; + registeredFonts.push(Object.assign({}, formatterInfo)); + } + return registeredFonts; + } + static create(requestedFont = {}) { + L('create: ', requestedFont); + if (!requestedFont.family) { + requestedFont.family = Font.SANS_SERIF; + } + const candidates = []; + const requestedFamilies = requestedFont.family.split(/\s*,\s*/); + for (const requestedFamily of requestedFamilies) { + for (const fontFamily in registry) { + if (fontFamily.startsWith(requestedFamily)) { + candidates.push(registry[fontFamily]); + } + } + if (candidates.length > 0) { + break; + } + } + let formatter; + if (candidates.length === 0) { + formatter = new TextFormatter(Object.values(registry)[0]); + } + else if (candidates.length === 1) { + formatter = new TextFormatter(candidates[0]); + } + else { + const bold = Font.isBold(requestedFont.weight); + const italic = Font.isItalic(requestedFont.style); + const perfectMatch = candidates.find((f) => f.bold === bold && f.italic === italic); + if (perfectMatch) { + formatter = new TextFormatter(perfectMatch); + } + else { + const partialMatch = candidates.find((f) => f.italic === italic || f.bold === bold); + if (partialMatch) { + formatter = new TextFormatter(partialMatch); + } + else { + formatter = new TextFormatter(candidates[0]); + } + } + } + const fontSize = requestedFont.size; + if (typeof fontSize !== 'undefined') { + const fontSizeInPt = Font.convertSizeToPointValue(fontSize); + formatter.setFontSize(fontSizeInPt); + } + return formatter; + } + static getInfo(fontFamily) { + return registry[fontFamily]; + } + static registerInfo(info, overwrite = false) { + L('registerInfo: ', info, overwrite); + const fontFamily = info.family; + const currFontInfo = registry[fontFamily]; + if (currFontInfo === undefined || overwrite) { + registry[fontFamily] = info; + } + } + updateParams(params) { + if (params.family) + this.family = params.family; + if (params.resolution) + this.resolution = params.resolution; + if (params.glyphs) + this.glyphs = params.glyphs; + if (params.serifs) + this.serifs = params.serifs; + if (params.monospaced) + this.monospaced = params.monospaced; + if (params.italic) + this.italic = params.italic; + if (params.bold) + this.bold = params.bold; + if (params.maxSizeGlyph) + this.maxSizeGlyph = params.maxSizeGlyph; + if (params.superscriptOffset) + this.superscriptOffset = params.superscriptOffset; + if (params.subscriptOffset) + this.subscriptOffset = params.subscriptOffset; + this.updateCacheKey(); + } + updateCacheKey() { + const family = this.family.replace(/\s+/g, '_'); + const size = this.size; + const weight = this.bold ? FontWeight.BOLD : FontWeight.NORMAL; + const style = this.italic ? FontStyle.ITALIC : FontStyle.NORMAL; + this.cacheKey = `${family}%${size}%${weight}%${style}`; + } + getGlyphMetrics(character) { + if (this.glyphs[character]) { + return this.glyphs[character]; + } + else { + return this.glyphs[this.maxSizeGlyph]; + } + } + get maxHeight() { + const metrics = this.getGlyphMetrics(this.maxSizeGlyph); + return (metrics.ha / this.resolution) * this.fontSizeInPixels; + } + getWidthForCharacterInEm(c) { + var _a; + const metrics = this.getGlyphMetrics(c); + if (!metrics) { + return 0.65; + } + else { + const advanceWidth = (_a = metrics.advanceWidth) !== null && _a !== void 0 ? _a : 0; + return advanceWidth / this.resolution; + } + } + getWidthForTextInEm(text) { + const key = this.cacheKey; + let cachedWidths = textWidthCache[key]; + if (cachedWidths === undefined) { + cachedWidths = {}; + textWidthCache[key] = cachedWidths; + } + let width = cachedWidths[text]; + if (width === undefined) { + width = 0; + for (let i = 0; i < text.length; ++i) { + width += this.getWidthForCharacterInEm(text[i]); + } + cachedWidths[text] = width; + } + return width; + } + getWidthForTextInPx(text) { + return this.getWidthForTextInEm(text) * this.fontSizeInPixels; + } + setFontSize(size) { + this.size = size; + this.updateCacheKey(); + return this; + } + get fontSizeInPixels() { + return this.size * Font.scaleToPxFrom.pt; + } + getResolution() { + return this.resolution; + } +} +TextFormatter.DEBUG = false; diff --git a/build/esm/src/textnote.js b/build/esm/src/textnote.js new file mode 100644 index 0000000000..a569ef9772 --- /dev/null +++ b/build/esm/src/textnote.js @@ -0,0 +1,176 @@ +import { Font, FontStyle, FontWeight } from './font.js'; +import { Glyph } from './glyph.js'; +import { Note } from './note.js'; +import { RuntimeError } from './util.js'; +export var Justification; +(function (Justification) { + Justification[Justification["LEFT"] = 1] = "LEFT"; + Justification[Justification["CENTER"] = 2] = "CENTER"; + Justification[Justification["RIGHT"] = 3] = "RIGHT"; +})(Justification || (Justification = {})); +export class TextNote extends Note { + constructor(noteStruct) { + super(noteStruct); + this.text = noteStruct.text || ''; + this.superscript = noteStruct.superscript; + this.subscript = noteStruct.subscript; + this.setFont(noteStruct.font); + this.line = noteStruct.line || 0; + this.smooth = noteStruct.smooth || false; + this.ignore_ticks = noteStruct.ignore_ticks || false; + this.justification = Justification.LEFT; + if (noteStruct.glyph) { + const struct = TextNote.GLYPHS[noteStruct.glyph]; + if (!struct) + throw new RuntimeError('Invalid glyph type: ' + noteStruct.glyph); + this.glyph = new Glyph(struct.code, 40, { category: 'textNote' }); + this.setWidth(this.glyph.getMetrics().width); + } + else { + this.glyph = undefined; + } + } + static get CATEGORY() { + return "TextNote"; + } + static get Justification() { + return Justification; + } + static get GLYPHS() { + return { + segno: { + code: 'segno', + }, + tr: { + code: 'ornamentTrill', + }, + mordent: { + code: 'ornamentMordent', + }, + mordent_upper: { + code: 'ornamentShortTrill', + }, + mordent_lower: { + code: 'ornamentMordent', + }, + f: { + code: 'dynamicForte', + }, + p: { + code: 'dynamicPiano', + }, + m: { + code: 'dynamicMezzo', + }, + s: { + code: 'dynamicSforzando', + }, + z: { + code: 'dynamicZ', + }, + coda: { + code: 'coda', + }, + pedal_open: { + code: 'keyboardPedalPed', + }, + pedal_close: { + code: 'keyboardPedalUp', + }, + caesura_straight: { + code: 'caesura', + }, + caesura_curved: { + code: 'caesuraCurved', + }, + breath: { + code: 'breathMarkComma', + }, + tick: { + code: 'breathMarkTick', + }, + turn: { + code: 'ornamentTurn', + }, + turn_inverted: { + code: 'ornamentTurnSlash', + }, + }; + } + setJustification(just) { + this.justification = just; + return this; + } + setLine(line) { + this.line = line; + return this; + } + preFormat() { + if (this.preFormatted) + return; + const tickContext = this.checkTickContext(`Can't preformat without a TickContext.`); + if (this.smooth) { + this.setWidth(0); + } + else { + if (this.glyph) { + } + else { + const ctx = this.checkContext(); + ctx.setFont(this.textFont); + this.setWidth(ctx.measureText(this.text).width); + } + } + if (this.justification === Justification.CENTER) { + this.leftDisplacedHeadPx = this.width / 2; + } + else if (this.justification === Justification.RIGHT) { + this.leftDisplacedHeadPx = this.width; + } + this.rightDisplacedHeadPx = tickContext.getMetrics().glyphPx / 2; + this.preFormatted = true; + } + draw() { + const ctx = this.checkContext(); + const stave = this.checkStave(); + const tickContext = this.checkTickContext(`Can't draw without a TickContext.`); + this.setRendered(); + let x = this.getAbsoluteX() + tickContext.getMetrics().glyphPx / 2; + const width = this.getWidth(); + if (this.justification === Justification.CENTER) { + x -= width / 2; + } + else if (this.justification === Justification.RIGHT) { + x -= width; + } + let y; + if (this.glyph) { + y = stave.getYForLine(this.line + -3); + this.glyph.render(ctx, x, y); + } + else { + y = stave.getYForLine(this.line + -3); + this.applyStyle(ctx); + ctx.setFont(this.textFont); + ctx.fillText(this.text, x, y); + const height = ctx.measureText(this.text).height; + const { family, size, weight, style } = this.textFont; + const smallerFontSize = Font.scaleSize(size, 0.769231); + if (this.superscript) { + ctx.setFont(family, smallerFontSize, weight, style); + ctx.fillText(this.superscript, x + this.width + 2, y - height / 2.2); + } + if (this.subscript) { + ctx.setFont(family, smallerFontSize, weight, style); + ctx.fillText(this.subscript, x + this.width + 2, y + height / 2.2 - 1); + } + this.restoreStyle(ctx); + } + } +} +TextNote.TEXT_FONT = { + family: Font.SANS_SERIF, + size: 12, + weight: FontWeight.NORMAL, + style: FontStyle.NORMAL, +}; diff --git a/build/esm/src/tickable.js b/build/esm/src/tickable.js new file mode 100644 index 0000000000..49eb5b7910 --- /dev/null +++ b/build/esm/src/tickable.js @@ -0,0 +1,214 @@ +import { Element } from './element.js'; +import { Fraction } from './fraction.js'; +import { Tables } from './tables.js'; +import { defined, RuntimeError } from './util.js'; +export class Tickable extends Element { + constructor() { + super(); + this._preFormatted = false; + this._postFormatted = false; + this.ticks = new Fraction(0, 1); + this.intrinsicTicks = 0; + this.tickMultiplier = new Fraction(1, 1); + this.width = 0; + this.x_shift = 0; + this.modifiers = []; + this.tupletStack = []; + this.align_center = false; + this.center_x_shift = 0; + this.ignore_ticks = false; + this.formatterMetrics = { + freedom: { left: 0, right: 0 }, + duration: '', + iterations: 0, + space: { + used: 0, + mean: 0, + deviation: 0, + }, + }; + } + static get CATEGORY() { + return "Tickable"; + } + reset() { + return this; + } + getTicks() { + return this.ticks; + } + shouldIgnoreTicks() { + return this.ignore_ticks; + } + setIgnoreTicks(flag) { + this.ignore_ticks = flag; + return this; + } + setWidth(width) { + this.width = width; + } + getWidth() { + if (!this._preFormatted) { + throw new RuntimeError('UnformattedNote', "Can't call GetWidth on an unformatted note."); + } + return this.width + (this.modifierContext ? this.modifierContext.getWidth() : 0); + } + setXShift(x) { + this.x_shift = x; + return this; + } + getXShift() { + return this.x_shift; + } + getX() { + const tickContext = this.checkTickContext(`Can't getX() without a TickContext.`); + return tickContext.getX() + this.x_shift; + } + getFormatterMetrics() { + return this.formatterMetrics; + } + getCenterXShift() { + if (this.isCenterAligned()) { + return this.center_x_shift; + } + return 0; + } + setCenterXShift(centerXShift) { + this.center_x_shift = centerXShift; + return this; + } + isCenterAligned() { + return this.align_center; + } + setCenterAlignment(align_center) { + this.align_center = align_center; + return this; + } + getVoice() { + return defined(this.voice, 'NoVoice', 'Tickable has no voice.'); + } + setVoice(voice) { + this.voice = voice; + } + getTuplet() { + return this.tuplet; + } + getTupletStack() { + return this.tupletStack; + } + resetTuplet(tuplet) { + let noteCount; + let notesOccupied; + if (tuplet) { + const i = this.tupletStack.indexOf(tuplet); + if (i !== -1) { + this.tupletStack.splice(i, 1); + noteCount = tuplet.getNoteCount(); + notesOccupied = tuplet.getNotesOccupied(); + this.applyTickMultiplier(noteCount, notesOccupied); + } + return this; + } + while (this.tupletStack.length) { + tuplet = this.tupletStack.pop(); + noteCount = tuplet.getNoteCount(); + notesOccupied = tuplet.getNotesOccupied(); + this.applyTickMultiplier(noteCount, notesOccupied); + } + return this; + } + setTuplet(tuplet) { + if (tuplet) { + this.tupletStack.push(tuplet); + const noteCount = tuplet.getNoteCount(); + const notesOccupied = tuplet.getNotesOccupied(); + this.applyTickMultiplier(notesOccupied, noteCount); + } + this.tuplet = tuplet; + return this; + } + addToModifierContext(mc) { + this.modifierContext = mc; + for (let i = 0; i < this.modifiers.length; ++i) { + this.modifierContext.addMember(this.modifiers[i]); + } + this.modifierContext.addMember(this); + this._preFormatted = false; + return this; + } + addModifier(modifier, index = 0) { + this.modifiers.push(modifier); + this._preFormatted = false; + return this; + } + getModifiers() { + return this.modifiers; + } + setTickContext(tc) { + this.tickContext = tc; + this._preFormatted = false; + } + checkTickContext(message = 'Tickable has no tick context.') { + return defined(this.tickContext, 'NoTickContext', message); + } + preFormat() { + if (this._preFormatted) + return; + this.width = 0; + if (this.modifierContext) { + this.modifierContext.preFormat(); + this.width += this.modifierContext.getWidth(); + } + } + set preFormatted(value) { + this._preFormatted = value; + } + get preFormatted() { + return this._preFormatted; + } + postFormat() { + if (this._postFormatted) + return this; + this._postFormatted = true; + return this; + } + set postFormatted(value) { + this._postFormatted = value; + } + get postFormatted() { + return this._postFormatted; + } + getIntrinsicTicks() { + return this.intrinsicTicks; + } + setIntrinsicTicks(intrinsicTicks) { + this.intrinsicTicks = intrinsicTicks; + this.ticks = this.tickMultiplier.clone().multiply(this.intrinsicTicks); + } + getTickMultiplier() { + return this.tickMultiplier; + } + applyTickMultiplier(numerator, denominator) { + this.tickMultiplier.multiply(numerator, denominator); + this.ticks = this.tickMultiplier.clone().multiply(this.intrinsicTicks); + } + setDuration(duration) { + const ticks = duration.numerator * (Tables.RESOLUTION / duration.denominator); + this.ticks = this.tickMultiplier.clone().multiply(ticks); + this.intrinsicTicks = this.ticks.value(); + } + getAbsoluteX() { + const tickContext = this.checkTickContext(`Can't getAbsoluteX() without a TickContext.`); + return tickContext.getX(); + } + setModifierContext(mc) { + this.modifierContext = mc; + return this; + } + getModifierContext() { + return this.modifierContext; + } + checkModifierContext() { + return defined(this.modifierContext, 'NoModifierContext', 'No modifier context attached to this tickable.'); + } +} diff --git a/build/esm/src/tickcontext.js b/build/esm/src/tickcontext.js new file mode 100644 index 0000000000..d21e395457 --- /dev/null +++ b/build/esm/src/tickcontext.js @@ -0,0 +1,170 @@ +import { Fraction } from './fraction.js'; +import { RuntimeError } from './util.js'; +export class TickContext { + constructor(options) { + this.preFormatted = false; + this.postFormatted = false; + this.tickID = options && options.tickID ? options.tickID : 0; + this.currentTick = new Fraction(0, 1); + this.maxTicks = new Fraction(0, 1); + this.maxTickable = undefined; + this.minTicks = undefined; + this.minTickable = undefined; + this.padding = 1; + this.x = 0; + this.xBase = 0; + this.xOffset = 0; + this.tickables = []; + this.tickablesByVoice = {}; + this.notePx = 0; + this.glyphPx = 0; + this.leftDisplacedHeadPx = 0; + this.rightDisplacedHeadPx = 0; + this.modLeftPx = 0; + this.modRightPx = 0; + this.totalLeftPx = 0; + this.totalRightPx = 0; + this.tContexts = []; + this.width = 0; + this.formatterMetrics = { + freedom: { left: 0, right: 0 }, + }; + } + static getNextContext(tContext) { + const contexts = tContext.tContexts; + const index = contexts.indexOf(tContext); + if (index + 1 < contexts.length) + return contexts[index + 1]; + } + getTickID() { + return this.tickID; + } + getX() { + return this.x; + } + setX(x) { + this.x = x; + this.xBase = x; + this.xOffset = 0; + return this; + } + getXBase() { + return this.xBase; + } + setXBase(xBase) { + this.xBase = xBase; + this.x = xBase + this.xOffset; + } + getXOffset() { + return this.xOffset; + } + setXOffset(xOffset) { + this.xOffset = xOffset; + this.x = this.xBase + xOffset; + } + getWidth() { + return this.width + this.padding * 2; + } + setPadding(padding) { + this.padding = padding; + return this; + } + getMaxTicks() { + return this.maxTicks; + } + getMinTicks() { + return this.minTicks; + } + getMaxTickable() { + return this.maxTickable; + } + getMinTickable() { + return this.minTickable; + } + getTickables() { + return this.tickables; + } + getTickableForVoice(voiceIndex) { + return this.tickablesByVoice[voiceIndex]; + } + getTickablesByVoice() { + return this.tickablesByVoice; + } + getCenterAlignedTickables() { + return this.tickables.filter((tickable) => tickable.isCenterAligned()); + } + getMetrics() { + const { width, glyphPx, notePx, leftDisplacedHeadPx, rightDisplacedHeadPx, modLeftPx, modRightPx, totalLeftPx, totalRightPx, } = this; + return { + width, + glyphPx, + notePx, + leftDisplacedHeadPx, + rightDisplacedHeadPx, + modLeftPx, + modRightPx, + totalLeftPx, + totalRightPx, + }; + } + getCurrentTick() { + return this.currentTick; + } + setCurrentTick(tick) { + this.currentTick = tick; + this.preFormatted = false; + } + addTickable(tickable, voiceIndex) { + if (!tickable) { + throw new RuntimeError('BadArgument', 'Invalid tickable added.'); + } + if (!tickable.shouldIgnoreTicks()) { + const ticks = tickable.getTicks(); + if (ticks.greaterThan(this.maxTicks)) { + this.maxTicks = ticks.clone(); + this.maxTickable = tickable; + } + if (this.minTicks == null) { + this.minTicks = ticks.clone(); + this.minTickable = tickable; + } + else if (ticks.lessThan(this.minTicks)) { + this.minTicks = ticks.clone(); + this.minTickable = tickable; + } + } + tickable.setTickContext(this); + this.tickables.push(tickable); + this.tickablesByVoice[voiceIndex || 0] = tickable; + this.preFormatted = false; + return this; + } + preFormat() { + if (this.preFormatted) + return this; + for (let i = 0; i < this.tickables.length; ++i) { + const tickable = this.tickables[i]; + tickable.preFormat(); + const metrics = tickable.getMetrics(); + this.leftDisplacedHeadPx = Math.max(this.leftDisplacedHeadPx, metrics.leftDisplacedHeadPx); + this.rightDisplacedHeadPx = Math.max(this.rightDisplacedHeadPx, metrics.rightDisplacedHeadPx); + this.notePx = Math.max(this.notePx, metrics.notePx); + this.glyphPx = Math.max(this.glyphPx, metrics.glyphWidth || 0); + this.modLeftPx = Math.max(this.modLeftPx, metrics.modLeftPx); + this.modRightPx = Math.max(this.modRightPx, metrics.modRightPx); + this.totalLeftPx = Math.max(this.totalLeftPx, metrics.modLeftPx + metrics.leftDisplacedHeadPx); + this.totalRightPx = Math.max(this.totalRightPx, metrics.modRightPx + metrics.rightDisplacedHeadPx); + this.width = this.notePx + this.totalLeftPx + this.totalRightPx; + } + return this; + } + postFormat() { + if (this.postFormatted) + return this; + this.postFormatted = true; + return this; + } + getFormatterMetrics() { + return this.formatterMetrics; + } +} diff --git a/build/esm/src/timesigglyph.js b/build/esm/src/timesigglyph.js new file mode 100644 index 0000000000..4b786e6695 --- /dev/null +++ b/build/esm/src/timesigglyph.js @@ -0,0 +1,85 @@ +import { Glyph } from './glyph.js'; +import { defined } from './util.js'; +export class TimeSignatureGlyph extends Glyph { + constructor(timeSignature, topDigits, botDigits, code, point, options) { + var _a; + super(code, point, options); + this.timeSignature = timeSignature; + this.topGlyphs = []; + this.botGlyphs = []; + let topWidth = 0; + for (let i = 0; i < topDigits.length; ++i) { + let timeSigType = topDigits[i]; + switch (topDigits[i]) { + case '-': + timeSigType = 'Minus'; + break; + case '+': + timeSigType = botDigits.length > 0 ? 'PlusSmall' : 'Plus'; + break; + case '(': + timeSigType = botDigits.length > 0 ? 'ParensLeftSmall' : 'ParensLeft'; + break; + case ')': + timeSigType = botDigits.length > 0 ? 'ParensRightSmall' : 'ParensRight'; + break; + } + const topGlyph = new Glyph('timeSig' + timeSigType, this.timeSignature.point); + this.topGlyphs.push(topGlyph); + topWidth += (_a = topGlyph.getMetrics().width) !== null && _a !== void 0 ? _a : 0; + } + let botWidth = 0; + for (let i = 0; i < botDigits.length; ++i) { + let timeSigType = botDigits[i]; + switch (botDigits[i]) { + case '+': + timeSigType = 'PlusSmall'; + break; + case '(': + timeSigType = 'ParensLeftSmall'; + break; + case ')': + timeSigType = 'ParensRightSmall'; + break; + } + const botGlyph = new Glyph('timeSig' + timeSigType, this.timeSignature.point); + this.botGlyphs.push(botGlyph); + botWidth += defined(botGlyph.getMetrics().width); + } + this.width = Math.max(topWidth, botWidth); + this.xMin = this.getMetrics().x_min; + this.topStartX = (this.width - topWidth) / 2.0; + this.botStartX = (this.width - botWidth) / 2.0; + this.reset(); + } + getMetrics() { + return { + x_min: this.xMin, + x_max: this.xMin + this.width, + width: this.width, + }; + } + renderToStave(x) { + const stave = this.checkStave(); + const ctx = this.checkContext(); + let start_x = x + this.topStartX; + let y = 0; + if (this.botGlyphs.length > 0) + y = stave.getYForLine(this.timeSignature.topLine); + else + y = (stave.getYForLine(this.timeSignature.topLine) + stave.getYForLine(this.timeSignature.bottomLine)) / 2; + for (let i = 0; i < this.topGlyphs.length; ++i) { + const glyph = this.topGlyphs[i]; + Glyph.renderOutline(ctx, glyph.getMetrics().outline, this.scale, start_x + this.x_shift, y); + start_x += defined(glyph.getMetrics().width); + } + start_x = x + this.botStartX; + y = stave.getYForLine(this.timeSignature.bottomLine); + for (let i = 0; i < this.botGlyphs.length; ++i) { + const glyph = this.botGlyphs[i]; + this.timeSignature.placeGlyphOnLine(glyph, stave, 0); + Glyph.renderOutline(ctx, glyph.getMetrics().outline, this.scale, start_x + glyph.getMetrics().x_shift, y); + start_x += defined(glyph.getMetrics().width); + } + } +} diff --git a/build/esm/src/timesignature.js b/build/esm/src/timesignature.js new file mode 100644 index 0000000000..bca5eb8f21 --- /dev/null +++ b/build/esm/src/timesignature.js @@ -0,0 +1,89 @@ +import { Glyph } from './glyph.js'; +import { StaveModifier, StaveModifierPosition } from './stavemodifier.js'; +import { Tables } from './tables.js'; +import { TimeSignatureGlyph } from './timesigglyph.js'; +import { defined, RuntimeError } from './util.js'; +const assertIsValidTimeSig = (timeSpec) => { + const numbers = timeSpec.split('/'); + if (numbers.length !== 2 && numbers[0] !== '+' && numbers[0] !== '-') { + throw new RuntimeError('BadTimeSignature', `Invalid time spec: ${timeSpec}. Must be in the form "/"`); + } + numbers.forEach((number) => { + if (/^[0-9+\-()]+$/.test(number) == false) { + throw new RuntimeError('BadTimeSignature', `Invalid time spec: ${timeSpec}. Must contain valid signatures.`); + } + }); +}; +export class TimeSignature extends StaveModifier { + constructor(timeSpec = '4/4', customPadding = 15, validate_args = true) { + super(); + this.validate_args = validate_args; + const padding = customPadding; + const musicFont = Tables.currentMusicFont(); + this.point = musicFont.lookupMetric('digits.point'); + const fontLineShift = musicFont.lookupMetric('digits.shiftLine', 0); + this.topLine = 2 + fontLineShift; + this.bottomLine = 4 + fontLineShift; + this.setPosition(StaveModifierPosition.BEGIN); + this.info = this.parseTimeSpec(timeSpec); + this.setWidth(defined(this.info.glyph.getMetrics().width)); + this.setPadding(padding); + } + static get CATEGORY() { + return "TimeSignature"; + } + static get glyphs() { + return { + C: { + code: 'timeSigCommon', + point: 40, + line: 2, + }, + 'C|': { + code: 'timeSigCutCommon', + point: 40, + line: 2, + }, + }; + } + parseTimeSpec(timeSpec) { + var _a, _b; + if (timeSpec === 'C' || timeSpec === 'C|') { + const { line, code, point } = TimeSignature.glyphs[timeSpec]; + return { + line, + num: false, + glyph: new Glyph(code, point), + }; + } + if (this.validate_args) { + assertIsValidTimeSig(timeSpec); + } + const parts = timeSpec.split('/'); + return { + num: true, + glyph: this.makeTimeSignatureGlyph((_a = parts[0]) !== null && _a !== void 0 ? _a : '', (_b = parts[1]) !== null && _b !== void 0 ? _b : ''), + }; + } + makeTimeSignatureGlyph(topDigits, botDigits) { + return new TimeSignatureGlyph(this, topDigits, botDigits, 'timeSig0', this.point); + } + getInfo() { + return this.info; + } + setTimeSig(timeSpec) { + this.info = this.parseTimeSpec(timeSpec); + return this; + } + draw() { + const stave = this.checkStave(); + const ctx = stave.checkContext(); + this.setRendered(); + ctx.openGroup('timesignature', this.getAttribute('id')); + this.info.glyph.setStave(stave); + this.info.glyph.setContext(ctx); + this.placeGlyphOnLine(this.info.glyph, stave, this.info.line); + this.info.glyph.renderToStave(this.x); + ctx.closeGroup(); + } +} diff --git a/build/esm/src/timesignote.js b/build/esm/src/timesignote.js new file mode 100644 index 0000000000..09e9518a82 --- /dev/null +++ b/build/esm/src/timesignote.js @@ -0,0 +1,32 @@ +import { Note } from './note.js'; +import { TimeSignature } from './timesignature.js'; +export class TimeSigNote extends Note { + constructor(timeSpec, customPadding) { + super({ duration: 'b' }); + const timeSignature = new TimeSignature(timeSpec, customPadding); + this.timeSigInfo = timeSignature.getInfo(); + this.setWidth(this.timeSigInfo.glyph.getMetrics().width); + this.ignore_ticks = true; + } + static get CATEGORY() { + return "TimeSigNote"; + } + addToModifierContext(mc) { + return this; + } + preFormat() { + this.preFormatted = true; + return this; + } + draw() { + const stave = this.checkStave(); + const ctx = this.checkContext(); + this.setRendered(); + if (!this.timeSigInfo.glyph.getContext()) { + this.timeSigInfo.glyph.setContext(ctx); + } + this.timeSigInfo.glyph.setStave(stave); + this.timeSigInfo.glyph.setYShift(stave.getYForLine(2) - stave.getYForGlyphs()); + this.timeSigInfo.glyph.renderToStave(this.getAbsoluteX()); + } +} diff --git a/build/esm/src/tremolo.js b/build/esm/src/tremolo.js new file mode 100644 index 0000000000..c76512f516 --- /dev/null +++ b/build/esm/src/tremolo.js @@ -0,0 +1,47 @@ +import { Glyph } from './glyph.js'; +import { GraceNote } from './gracenote.js'; +import { Modifier } from './modifier.js'; +import { Stem } from './stem.js'; +import { Tables } from './tables.js'; +import { isGraceNote } from './typeguard.js'; +export class Tremolo extends Modifier { + constructor(num) { + super(); + this.num = num; + this.position = Modifier.Position.CENTER; + this.code = 'tremolo1'; + this.y_spacing_scale = 1; + this.extra_stroke_scale = 1; + } + static get CATEGORY() { + return "Tremolo"; + } + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const stemDirection = note.getStemDirection(); + const start = note.getModifierStartXY(this.position, this.index); + let x = start.x; + const gn = isGraceNote(note); + const scale = gn ? GraceNote.SCALE : 1; + const category = `tremolo.${gn ? 'grace' : 'default'}`; + const musicFont = Tables.currentMusicFont(); + let y_spacing = musicFont.lookupMetric(`${category}.spacing`) * stemDirection; + y_spacing *= this.y_spacing_scale; + const height = this.num * y_spacing; + let y = note.getStemExtents().baseY - height; + if (stemDirection < 0) { + y += musicFont.lookupMetric(`${category}.offsetYStemDown`) * scale; + } + else { + y += musicFont.lookupMetric(`${category}.offsetYStemUp`) * scale; + } + const fontScale = musicFont.lookupMetric(`${category}.point`); + x += musicFont.lookupMetric(`${category}.offsetXStem${stemDirection === Stem.UP ? 'Up' : 'Down'}`); + for (let i = 0; i < this.num; ++i) { + Glyph.renderGlyph(ctx, x, y, fontScale, this.code, { category, scale: this.extra_stroke_scale }); + y += y_spacing; + } + } +} diff --git a/build/esm/src/tuning.js b/build/esm/src/tuning.js new file mode 100644 index 0000000000..3051bd8a4e --- /dev/null +++ b/build/esm/src/tuning.js @@ -0,0 +1,54 @@ +import { Tables } from './tables.js'; +import { RuntimeError } from './util.js'; +export class Tuning { + constructor(tuningString = 'E/5,B/4,G/4,D/4,A/3,E/3,B/2,E/2') { + this.tuningValues = []; + this.setTuning(tuningString); + } + static get names() { + return { + standard: 'E/5,B/4,G/4,D/4,A/3,E/3', + dagdad: 'D/5,A/4,G/4,D/4,A/3,D/3', + dropd: 'E/5,B/4,G/4,D/4,A/3,D/3', + eb: 'Eb/5,Bb/4,Gb/4,Db/4,Ab/3,Db/3', + standardBanjo: 'D/5,B/4,G/4,D/4,G/5', + }; + } + noteToInteger(noteString) { + return Tables.keyProperties(noteString).int_value; + } + setTuning(tuningString) { + if (Tuning.names[tuningString]) { + tuningString = Tuning.names[tuningString]; + } + this.tuningValues = []; + const keys = tuningString.split(/\s*,\s*/); + if (keys.length === 0) { + throw new RuntimeError('BadArguments', `Invalid tuning string: ${tuningString}`); + } + for (let i = 0; i < keys.length; ++i) { + this.tuningValues[i] = this.noteToInteger(keys[i]); + } + } + getValueForString(stringNum) { + const s = Number(stringNum); + if (s < 1 || s > this.tuningValues.length) { + throw new RuntimeError('BadArguments', `String number must be between 1 and ${this.tuningValues.length}:${stringNum}`); + } + return this.tuningValues[s - 1]; + } + getValueForFret(fretNum, stringNum) { + const stringValue = this.getValueForString(stringNum); + const f = Number(fretNum); + if (f < 0) { + throw new RuntimeError('BadArguments', `Fret number must be 0 or higher: ${fretNum}`); + } + return stringValue + f; + } + getNoteForFret(fretNum, stringNum) { + const noteValue = this.getValueForFret(fretNum, stringNum); + const octave = Math.floor(noteValue / 12); + const value = noteValue % 12; + return `${Tables.integerToNote(value)}/${octave}`; + } +} diff --git a/build/esm/src/tuplet.js b/build/esm/src/tuplet.js new file mode 100644 index 0000000000..01dc6041d6 --- /dev/null +++ b/build/esm/src/tuplet.js @@ -0,0 +1,240 @@ +import { Element } from './element.js'; +import { Formatter } from './formatter.js'; +import { Glyph } from './glyph.js'; +import { Stem } from './stem.js'; +import { Tables } from './tables.js'; +import { defined, RuntimeError } from './util.js'; +export class Tuplet extends Element { + constructor(notes, options = {}) { + super(); + this.numerator_glyphs = []; + this.denom_glyphs = []; + if (!notes || !notes.length) { + throw new RuntimeError('BadArguments', 'No notes provided for tuplet.'); + } + this.options = options; + this.notes = notes; + this.num_notes = this.options.num_notes != undefined ? this.options.num_notes : notes.length; + if (this.options.beats_occupied) { + this.beatsOccupiedDeprecationWarning(); + } + this.notes_occupied = this.options.notes_occupied || this.options.beats_occupied || 2; + if (this.options.bracketed != undefined) { + this.bracketed = this.options.bracketed; + } + else { + this.bracketed = notes.some((note) => !note.hasBeam()); + } + this.ratioed = + this.options.ratioed != undefined ? this.options.ratioed : Math.abs(this.notes_occupied - this.num_notes) > 1; + this.point = Tables.currentMusicFont().lookupMetric('digits.tupletPoint'); + this.y_pos = 16; + this.x_pos = 100; + this.width = 200; + this.setTupletLocation(this.options.location || Tuplet.LOCATION_TOP); + Formatter.AlignRestsToNotes(notes, true, true); + this.resolveGlyphs(); + this.attach(); + } + static get CATEGORY() { + return "Tuplet"; + } + static get LOCATION_TOP() { + return 1; + } + static get LOCATION_BOTTOM() { + return -1; + } + static get NESTING_OFFSET() { + return 15; + } + static get metrics() { + return Tables.currentMusicFont().getMetrics().glyphs.tuplet; + } + attach() { + for (let i = 0; i < this.notes.length; i++) { + const note = this.notes[i]; + note.setTuplet(this); + } + } + detach() { + for (let i = 0; i < this.notes.length; i++) { + const note = this.notes[i]; + note.resetTuplet(this); + } + } + setBracketed(bracketed) { + this.bracketed = !!bracketed; + return this; + } + setRatioed(ratioed) { + this.ratioed = !!ratioed; + return this; + } + setTupletLocation(location) { + if (location !== Tuplet.LOCATION_TOP && location !== Tuplet.LOCATION_BOTTOM) { + console.warn(`Invalid tuplet location [${location}]. Using Tuplet.LOCATION_TOP.`); + location = Tuplet.LOCATION_TOP; + } + this.location = location; + return this; + } + getNotes() { + return this.notes; + } + getNoteCount() { + return this.num_notes; + } + beatsOccupiedDeprecationWarning() { + console.warn('beats_occupied has been deprecated as an option for tuplets. Please use notes_occupied instead.', 'Calls to getBeatsOccupied / setBeatsOccupied should now be routed to getNotesOccupied / setNotesOccupied.', 'The old methods will be removed in VexFlow 5.0.'); + } + getBeatsOccupied() { + this.beatsOccupiedDeprecationWarning(); + return this.getNotesOccupied(); + } + setBeatsOccupied(beats) { + this.beatsOccupiedDeprecationWarning(); + return this.setNotesOccupied(beats); + } + getNotesOccupied() { + return this.notes_occupied; + } + setNotesOccupied(notes) { + this.detach(); + this.notes_occupied = notes; + this.resolveGlyphs(); + this.attach(); + } + resolveGlyphs() { + this.numerator_glyphs = []; + let n = this.num_notes; + while (n >= 1) { + this.numerator_glyphs.unshift(new Glyph('timeSig' + (n % 10), this.point)); + n = parseInt((n / 10).toString(), 10); + } + this.denom_glyphs = []; + n = this.notes_occupied; + while (n >= 1) { + this.denom_glyphs.unshift(new Glyph('timeSig' + (n % 10), this.point)); + n = parseInt((n / 10).toString(), 10); + } + } + getNestedTupletCount() { + const location = this.location; + const first_note = this.notes[0]; + let maxTupletCount = countTuplets(first_note, location); + let minTupletCount = countTuplets(first_note, location); + function countTuplets(note, location) { + return note.getTupletStack().filter((tuplet) => tuplet.location === location).length; + } + this.notes.forEach((note) => { + const tupletCount = countTuplets(note, location); + maxTupletCount = tupletCount > maxTupletCount ? tupletCount : maxTupletCount; + minTupletCount = tupletCount < minTupletCount ? tupletCount : minTupletCount; + }); + return maxTupletCount - minTupletCount; + } + getYPosition() { + const nested_tuplet_y_offset = this.getNestedTupletCount() * Tuplet.NESTING_OFFSET * -this.location; + const y_offset = this.options.y_offset || 0; + const first_note = this.notes[0]; + let y_pos; + if (this.location === Tuplet.LOCATION_TOP) { + y_pos = first_note.checkStave().getYForLine(0) - Tuplet.metrics.topModifierOffset; + for (let i = 0; i < this.notes.length; ++i) { + const note = this.notes[i]; + let modLines = 0; + const mc = note.getModifierContext(); + if (mc) { + modLines = Math.max(modLines, mc.getState().top_text_line); + } + const modY = note.getYForTopText(modLines) - Tuplet.metrics.noteHeadOffset; + if (note.hasStem() || note.isRest()) { + const top_y = note.getStemDirection() === Stem.UP + ? note.getStemExtents().topY - Tuplet.metrics.stemOffset + : note.getStemExtents().baseY - Tuplet.metrics.noteHeadOffset; + y_pos = Math.min(top_y, y_pos); + if (modLines > 0) { + y_pos = Math.min(modY, y_pos); + } + } + } + } + else { + let lineCheck = Tuplet.metrics.bottomLine; + this.notes.forEach((nn) => { + const mc = nn.getModifierContext(); + if (mc) { + lineCheck = Math.max(lineCheck, mc.getState().text_line + 1); + } + }); + y_pos = first_note.checkStave().getYForLine(lineCheck) + Tuplet.metrics.noteHeadOffset; + for (let i = 0; i < this.notes.length; ++i) { + if (this.notes[i].hasStem() || this.notes[i].isRest()) { + const bottom_y = this.notes[i].getStemDirection() === Stem.UP + ? this.notes[i].getStemExtents().baseY + Tuplet.metrics.noteHeadOffset + : this.notes[i].getStemExtents().topY + Tuplet.metrics.stemOffset; + if (bottom_y > y_pos) { + y_pos = bottom_y; + } + } + } + } + return y_pos + nested_tuplet_y_offset + y_offset; + } + draw() { + const ctx = this.checkContext(); + this.setRendered(); + const first_note = this.notes[0]; + const last_note = this.notes[this.notes.length - 1]; + if (!this.bracketed) { + this.x_pos = first_note.getStemX(); + this.width = last_note.getStemX() - this.x_pos; + } + else { + this.x_pos = first_note.getTieLeftX() - 5; + this.width = last_note.getTieRightX() - this.x_pos + 5; + } + this.y_pos = this.getYPosition(); + const addGlyphWidth = (width, glyph) => width + defined(glyph.getMetrics().width); + let width = this.numerator_glyphs.reduce(addGlyphWidth, 0); + if (this.ratioed) { + width = this.denom_glyphs.reduce(addGlyphWidth, width); + width += this.point * 0.32; + } + const notation_center_x = this.x_pos + this.width / 2; + const notation_start_x = notation_center_x - width / 2; + if (this.bracketed) { + const line_width = this.width / 2 - width / 2 - 5; + if (line_width > 0) { + ctx.fillRect(this.x_pos, this.y_pos, line_width, 1); + ctx.fillRect(this.x_pos + this.width / 2 + width / 2 + 5, this.y_pos, line_width, 1); + ctx.fillRect(this.x_pos, this.y_pos + (this.location === Tuplet.LOCATION_BOTTOM ? 1 : 0), 1, this.location * 10); + ctx.fillRect(this.x_pos + this.width, this.y_pos + (this.location === Tuplet.LOCATION_BOTTOM ? 1 : 0), 1, this.location * 10); + } + } + const shiftY = Tables.currentMusicFont().lookupMetric('digits.shiftY', 0); + let x_offset = 0; + this.numerator_glyphs.forEach((glyph) => { + glyph.render(ctx, notation_start_x + x_offset, this.y_pos + this.point / 3 - 2 + shiftY); + x_offset += defined(glyph.getMetrics().width); + }); + if (this.ratioed) { + const colon_x = notation_start_x + x_offset + this.point * 0.16; + const colon_radius = this.point * 0.06; + ctx.beginPath(); + ctx.arc(colon_x, this.y_pos - this.point * 0.08, colon_radius, 0, Math.PI * 2, true); + ctx.closePath(); + ctx.fill(); + ctx.beginPath(); + ctx.arc(colon_x, this.y_pos + this.point * 0.12, colon_radius, 0, Math.PI * 2, true); + ctx.closePath(); + ctx.fill(); + x_offset += this.point * 0.32; + this.denom_glyphs.forEach((glyph) => { + glyph.render(ctx, notation_start_x + x_offset, this.y_pos + this.point / 3 - 2 + shiftY); + x_offset += defined(glyph.getMetrics().width); + }); + } + } +} diff --git a/build/esm/src/typeguard.js b/build/esm/src/typeguard.js new file mode 100644 index 0000000000..bc5cfbd703 --- /dev/null +++ b/build/esm/src/typeguard.js @@ -0,0 +1,30 @@ +export function isCategory(obj, category, checkAncestors = true) { + if (typeof obj !== 'object' || obj === null) { + return false; + } + let constructorFcn = obj.constructor; + if (checkAncestors) { + while (obj !== null) { + constructorFcn = obj.constructor; + if ('CATEGORY' in constructorFcn && constructorFcn.CATEGORY === category) { + return true; + } + obj = Object.getPrototypeOf(obj); + } + return false; + } + else { + return 'CATEGORY' in constructorFcn && constructorFcn.CATEGORY === category; + } +} +export const isAccidental = (obj) => isCategory(obj, "Accidental"); +export const isAnnotation = (obj) => isCategory(obj, "Annotation"); +export const isBarline = (obj) => isCategory(obj, "Barline"); +export const isDot = (obj) => isCategory(obj, "Dot"); +export const isGraceNote = (obj) => isCategory(obj, "GraceNote"); +export const isGraceNoteGroup = (obj) => isCategory(obj, "GraceNoteGroup"); +export const isNote = (obj) => isCategory(obj, "Note"); +export const isRenderContext = (obj) => isCategory(obj, "RenderContext"); +export const isStaveNote = (obj) => isCategory(obj, "StaveNote"); +export const isStemmableNote = (obj) => isCategory(obj, "StemmableNote"); +export const isTabNote = (obj) => isCategory(obj, "TabNote"); diff --git a/build/esm/src/util.js b/build/esm/src/util.js new file mode 100644 index 0000000000..3a3c51137c --- /dev/null +++ b/build/esm/src/util.js @@ -0,0 +1,58 @@ +export class RuntimeError extends Error { + constructor(code, message = '') { + super('[RuntimeError] ' + code + ': ' + message); + this.code = code; + } +} +export function globalObject() { + if (typeof globalThis !== 'undefined') { + return globalThis; + } + if (typeof self !== 'undefined') { + return self; + } + if (typeof window !== 'undefined') { + return window; + } + if (typeof global !== 'undefined') { + return global; + } + return Function('return this')(); +} +export function defined(x, code = 'undefined', message = '') { + if (x === undefined) { + throw new RuntimeError(code, message); + } + return x; +} +export function log(block, ...args) { + if (!args) + return; + const line = Array.prototype.slice.call(args).join(' '); + globalObject().console.log(block + ': ' + line); +} +export function warn(...args) { + const line = args.join(' '); + const err = new Error(); + globalObject().console.log('Warning: ', line, err.stack); +} +function roundN(x, n) { + return x % n >= n / 2 ? parseInt(`${x / n}`, 10) * n + n : parseInt(`${x / n}`, 10) * n; +} +export function midLine(a, b) { + let mid_line = b + (a - b) / 2; + if (mid_line % 2 > 0) { + mid_line = roundN(mid_line * 10, 5) / 10; + } + return mid_line; +} +export function prefix(text) { + return `vf-${text}`; +} +export function normalizeAngle(a) { + a = a % (2 * Math.PI); + if (a < 0) { + a += 2 * Math.PI; + } + return a; +} diff --git a/build/esm/src/version.js b/build/esm/src/version.js new file mode 100644 index 0000000000..c5e4f0cb45 --- /dev/null +++ b/build/esm/src/version.js @@ -0,0 +1,3 @@ +export const VERSION = '4.0.1-alpha.2'; +export const ID = '0df10df6d1fab3a99f5aa306341a31c6e686d659'; +export const DATE = '2022-02-02T09:30:30.784Z'; \ No newline at end of file diff --git a/build/esm/src/vex.js b/build/esm/src/vex.js new file mode 100644 index 0000000000..fbb7026a5b --- /dev/null +++ b/build/esm/src/vex.js @@ -0,0 +1,51 @@ +import { Flow } from './flow.js'; +import { log, RuntimeError } from './util.js'; +export class Vex { + static sortAndUnique(arr, cmp, eq) { + if (arr.length > 1) { + const newArr = []; + let last; + arr.sort(cmp); + for (let i = 0; i < arr.length; ++i) { + if (i === 0 || !eq(arr[i], last)) { + newArr.push(arr[i]); + } + last = arr[i]; + } + return newArr; + } + else { + return arr; + } + } + static contains(arr, obj) { + let i = arr.length; + while (i--) { + if (arr[i] === obj) { + return true; + } + } + return false; + } + static getCanvasContext(canvasSelector) { + if (!canvasSelector) { + throw new RuntimeError('BadArgument', 'Invalid canvas selector: ' + canvasSelector); + } + const canvas = document.getElementById(canvasSelector); + if (!(canvas && canvas.getContext)) { + throw new RuntimeError('UnsupportedBrowserError', 'This browser does not support HTML5 Canvas'); + } + return canvas.getContext('2d'); + } + static benchmark(s, f) { + const start_time = new Date().getTime(); + f(); + const elapsed = new Date().getTime() - start_time; + log(s, elapsed + 'ms'); + } + static stackTrace() { + const err = new Error(); + return err.stack; + } +} +Vex.Flow = Flow; diff --git a/build/esm/src/vibrato.js b/build/esm/src/vibrato.js new file mode 100644 index 0000000000..2d29233ea7 --- /dev/null +++ b/build/esm/src/vibrato.js @@ -0,0 +1,100 @@ +import { Bend } from './bend.js'; +import { Modifier } from './modifier.js'; +import { Tables } from './tables.js'; +export class Vibrato extends Modifier { + constructor() { + super(); + this.position = Modifier.Position.RIGHT; + this.render_options = { + harsh: false, + vibrato_width: 20, + wave_height: 6, + wave_width: 4, + wave_girth: 2, + }; + this.setVibratoWidth(this.render_options.vibrato_width); + } + static get CATEGORY() { + return "Vibrato"; + } + static format(vibratos, state, context) { + if (!vibratos || vibratos.length === 0) + return false; + let text_line = state.top_text_line; + let width = 0; + let shift = state.right_shift - 7; + const bends = context.getMembers(Bend.CATEGORY); + if (bends && bends.length > 0) { + const bendHeight = bends.map((bb) => bb.getTextHeight()).reduce((a, b) => (a > b ? a : b)) / Tables.STAVE_LINE_DISTANCE; + text_line = text_line - (bendHeight + 1); + } + else { + state.top_text_line += 1; + } + for (let i = 0; i < vibratos.length; ++i) { + const vibrato = vibratos[i]; + vibrato.setXShift(shift); + vibrato.setTextLine(text_line); + width += vibrato.getWidth(); + shift += width; + } + state.right_shift += width; + return true; + } + setHarsh(harsh) { + this.render_options.harsh = harsh; + return this; + } + setVibratoWidth(width) { + this.render_options.vibrato_width = width; + this.setWidth(width); + return this; + } + draw() { + const ctx = this.checkContext(); + const note = this.checkAttachedNote(); + this.setRendered(); + const start = note.getModifierStartXY(Modifier.Position.RIGHT, this.index); + const vx = start.x + this.x_shift; + const vy = note.getYForTopText(this.text_line) + 2; + Vibrato.renderVibrato(ctx, vx, vy, this.render_options); + } + static renderVibrato(ctx, x, y, opts) { + const { harsh, vibrato_width, wave_width, wave_girth, wave_height } = opts; + const num_waves = vibrato_width / wave_width; + ctx.beginPath(); + let i; + if (harsh) { + ctx.moveTo(x, y + wave_girth + 1); + for (i = 0; i < num_waves / 2; ++i) { + ctx.lineTo(x + wave_width, y - wave_height / 2); + x += wave_width; + ctx.lineTo(x + wave_width, y + wave_height / 2); + x += wave_width; + } + for (i = 0; i < num_waves / 2; ++i) { + ctx.lineTo(x - wave_width, y - wave_height / 2 + wave_girth + 1); + x -= wave_width; + ctx.lineTo(x - wave_width, y + wave_height / 2 + wave_girth + 1); + x -= wave_width; + } + ctx.fill(); + } + else { + ctx.moveTo(x, y + wave_girth); + for (i = 0; i < num_waves / 2; ++i) { + ctx.quadraticCurveTo(x + wave_width / 2, y - wave_height / 2, x + wave_width, y); + x += wave_width; + ctx.quadraticCurveTo(x + wave_width / 2, y + wave_height / 2, x + wave_width, y); + x += wave_width; + } + for (i = 0; i < num_waves / 2; ++i) { + ctx.quadraticCurveTo(x - wave_width / 2, y + wave_height / 2 + wave_girth, x - wave_width, y + wave_girth); + x -= wave_width; + ctx.quadraticCurveTo(x - wave_width / 2, y - wave_height / 2 + wave_girth, x - wave_width, y + wave_girth); + x -= wave_width; + } + ctx.fill(); + } + } +} diff --git a/build/esm/src/vibratobracket.js b/build/esm/src/vibratobracket.js new file mode 100644 index 0000000000..24a6487803 --- /dev/null +++ b/build/esm/src/vibratobracket.js @@ -0,0 +1,50 @@ +import { Element } from './element.js'; +import { log } from './util.js'; +import { Vibrato } from './vibrato.js'; +function L(...args) { + if (VibratoBracket.DEBUG) + log('Vex.Flow.VibratoBracket', args); +} +export class VibratoBracket extends Element { + constructor(bracket_data) { + super(); + if (bracket_data.start) + this.start = bracket_data.start; + if (bracket_data.stop) + this.stop = bracket_data.stop; + this.line = 1; + this.render_options = { + harsh: false, + wave_height: 6, + wave_width: 4, + wave_girth: 2, + vibrato_width: 0, + }; + } + static get CATEGORY() { + return "VibratoBracket"; + } + setLine(line) { + this.line = line; + return this; + } + setHarsh(harsh) { + this.render_options.harsh = harsh; + return this; + } + draw() { + const ctx = this.checkContext(); + this.setRendered(); + const y = (this.start && this.start.checkStave().getYForTopText(this.line)) || + (this.stop && this.stop.checkStave().getYForTopText(this.line)) || + 0; + const start_x = (this.start && this.start.getAbsoluteX()) || (this.stop && this.stop.checkStave().getTieStartX()) || 0; + const stop_x = (this.stop && this.stop.getAbsoluteX() - this.stop.getWidth() - 5) || + (this.start && this.start.checkStave().getTieEndX() - 10) || + 0; + this.render_options.vibrato_width = stop_x - start_x; + L('Rendering VibratoBracket: start_x:', start_x, 'stop_x:', stop_x, 'y:', y); + Vibrato.renderVibrato(ctx, start_x, y, this.render_options); + } +} +VibratoBracket.DEBUG = false; diff --git a/build/esm/src/voice.js b/build/esm/src/voice.js new file mode 100644 index 0000000000..896b34f140 --- /dev/null +++ b/build/esm/src/voice.js @@ -0,0 +1,187 @@ +import { Element } from './element.js'; +import { Fraction } from './fraction.js'; +import { Tables } from './tables.js'; +import { defined, RuntimeError } from './util.js'; +export var VoiceMode; +(function (VoiceMode) { + VoiceMode[VoiceMode["STRICT"] = 1] = "STRICT"; + VoiceMode[VoiceMode["SOFT"] = 2] = "SOFT"; + VoiceMode[VoiceMode["FULL"] = 3] = "FULL"; +})(VoiceMode || (VoiceMode = {})); +export class Voice extends Element { + constructor(time, options) { + super(); + this.resolutionMultiplier = 1; + this.mode = VoiceMode.STRICT; + this.preFormatted = false; + this.ticksUsed = new Fraction(0, 1); + this.largestTickWidth = 0; + this.tickables = []; + this.options = Object.assign({ softmaxFactor: 100 }, options); + let voiceTime; + if (typeof time === 'string') { + const match = time.match(/(\d+)\/(\d+)/); + if (match) { + voiceTime = { + num_beats: parseInt(match[1]), + beat_value: parseInt(match[2]), + }; + } + } + else { + voiceTime = time; + } + this.time = Object.assign({ num_beats: 4, beat_value: 4, resolution: Tables.RESOLUTION }, voiceTime); + this.totalTicks = new Fraction(this.time.num_beats * (this.time.resolution / this.time.beat_value), 1); + this.smallestTickCount = this.totalTicks.clone(); + } + static get CATEGORY() { + return "Voice"; + } + static get Mode() { + return VoiceMode; + } + getTotalTicks() { + return this.totalTicks; + } + getTicksUsed() { + return this.ticksUsed; + } + getLargestTickWidth() { + return this.largestTickWidth; + } + getSmallestTickCount() { + return this.smallestTickCount; + } + getTickables() { + return this.tickables; + } + getMode() { + return this.mode; + } + setMode(mode) { + this.mode = mode; + return this; + } + getResolutionMultiplier() { + return this.resolutionMultiplier; + } + getActualResolution() { + return this.resolutionMultiplier * this.time.resolution; + } + setStave(stave) { + this.stave = stave; + this.boundingBox = undefined; + return this; + } + getStave() { + return this.stave; + } + getBoundingBox() { + if (!this.boundingBox) { + const stave = this.checkStave(); + let boundingBox = undefined; + for (let i = 0; i < this.tickables.length; ++i) { + const tickable = this.tickables[i]; + tickable.setStave(stave); + const bb = tickable.getBoundingBox(); + if (bb) { + boundingBox = boundingBox ? boundingBox.mergeWith(bb) : bb; + } + } + this.boundingBox = boundingBox; + } + return this.boundingBox; + } + setStrict(strict) { + this.mode = strict ? VoiceMode.STRICT : VoiceMode.SOFT; + return this; + } + isComplete() { + if (this.mode === VoiceMode.STRICT || this.mode === VoiceMode.FULL) { + return this.ticksUsed.equals(this.totalTicks); + } + else { + return true; + } + } + setSoftmaxFactor(factor) { + this.options.softmaxFactor = factor; + return this; + } + reCalculateExpTicksUsed() { + const totalTicks = this.ticksUsed.value(); + const exp = (tickable) => Math.pow(this.options.softmaxFactor, tickable.getTicks().value() / totalTicks); + this.expTicksUsed = this.tickables.map(exp).reduce((a, b) => a + b, 0); + return this.expTicksUsed; + } + softmax(tickValue) { + if (!this.expTicksUsed) { + this.expTicksUsed = this.reCalculateExpTicksUsed(); + } + const totalTicks = this.ticksUsed.value(); + const exp = (v) => Math.pow(this.options.softmaxFactor, v / totalTicks); + const sm = exp(tickValue) / this.expTicksUsed; + return sm; + } + addTickable(tickable) { + if (!tickable.shouldIgnoreTicks()) { + const ticks = tickable.getTicks(); + this.ticksUsed.add(ticks); + this.expTicksUsed = 0; + if ((this.mode === VoiceMode.STRICT || this.mode === VoiceMode.FULL) && + this.ticksUsed.greaterThan(this.totalTicks)) { + this.ticksUsed.subtract(ticks); + throw new RuntimeError('BadArgument', 'Too many ticks.'); + } + if (ticks.lessThan(this.smallestTickCount)) { + this.smallestTickCount = ticks.clone(); + } + this.resolutionMultiplier = this.ticksUsed.denominator; + this.totalTicks.add(0, this.ticksUsed.denominator); + } + this.tickables.push(tickable); + tickable.setVoice(this); + return this; + } + addTickables(tickables) { + for (let i = 0; i < tickables.length; ++i) { + this.addTickable(tickables[i]); + } + return this; + } + preFormat() { + if (this.preFormatted) + return this; + const stave = this.checkStave(); + this.tickables.forEach((tickable) => { + if (!tickable.getStave()) { + tickable.setStave(stave); + } + }); + this.preFormatted = true; + return this; + } + checkStave() { + return defined(this.stave, 'NoStave', 'No stave attached to instance.'); + } + draw(context = this.checkContext(), stave) { + stave = stave !== null && stave !== void 0 ? stave : this.stave; + this.setRendered(); + let boundingBox = undefined; + for (let i = 0; i < this.tickables.length; ++i) { + const tickable = this.tickables[i]; + if (stave) { + tickable.setStave(stave); + } + defined(tickable.getStave(), 'MissingStave', 'The voice cannot draw tickables without staves.'); + const bb = tickable.getBoundingBox(); + if (bb) { + boundingBox = boundingBox ? boundingBox.mergeWith(bb) : bb; + } + tickable.setContext(context); + tickable.drawWithStyle(); + } + this.boundingBox = boundingBox; + } +} diff --git a/build/esm/src/web.js b/build/esm/src/web.js new file mode 100644 index 0000000000..f27804df9c --- /dev/null +++ b/build/esm/src/web.js @@ -0,0 +1,15 @@ +import { globalObject } from './util.js'; +export function isHTMLCanvas(element) { + if (!element) + return false; + const global = globalObject(); + return ((typeof global.HTMLCanvasElement === 'function' && element instanceof global.HTMLCanvasElement) || + (typeof element.getContext === 'function' && typeof element.toDataURL === 'function')); +} +export function isHTMLDiv(element) { + if (!element) + return false; + const global = globalObject(); + return ((typeof global.HTMLDivElement === 'function' && element instanceof global.HTMLDivElement) || + (typeof element.appendChild === 'function' && typeof element.style === 'object')); +} diff --git a/build/esm/tests/accidental_tests.js b/build/esm/tests/accidental_tests.js new file mode 100644 index 0000000000..aaca1320df --- /dev/null +++ b/build/esm/tests/accidental_tests.js @@ -0,0 +1,974 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Accidental } from '../src/accidental.js'; +import { Beam } from '../src/beam.js'; +import { Dot } from '../src/dot.js'; +import { Flow } from '../src/flow.js'; +import { Formatter } from '../src/formatter.js'; +import { ModifierContext } from '../src/modifiercontext.js'; +import { Note } from '../src/note.js'; +import { Stave } from '../src/stave.js'; +import { StaveNote } from '../src/stavenote.js'; +import { Stem } from '../src/stem.js'; +import { TickContext } from '../src/tickcontext.js'; +import { TimeSigNote } from '../src/timesignote.js'; +import { isAccidental } from '../src/typeguard.js'; +import { Voice } from '../src/voice.js'; +const AccidentalTests = { + Start() { + QUnit.module('Accidental'); + test('Automatic Accidentals - Simple Tests', autoAccidentalWorking); + const run = VexFlowTests.runTests; + run('Accidental Padding', formatAccidentalSpaces); + run('Basic', basic); + run('Stem Down', basicStemDown); + run('Cautionary Accidental', cautionary); + run('Accidental Arrangement Special Cases', specialCases); + run('Multi Voice', multiVoice); + run('Microtonal', microtonal); + run('Microtonal (Iranian)', microtonal_iranian); + run('Sagittal', sagittal); + run('Automatic Accidentals', automaticAccidentals0); + run('Automatic Accidentals - C major scale in Ab', automaticAccidentals1); + run('Automatic Accidentals - No Accidentals Necessary', automaticAccidentals2); + run('Automatic Accidentals - No Accidentals Necessary (EasyScore)', automaticAccidentals3); + run('Automatic Accidentals - Multi Voice Inline', automaticAccidentalsMultiVoiceInline); + run('Automatic Accidentals - Multi Voice Offset', automaticAccidentalsMultiVoiceOffset); + run('Automatic Accidentals - Key C, Single Octave', automaticAccidentalsCornerCases1); + run('Automatic Accidentals - Key C, Two Octaves', automaticAccidentalsCornerCases2); + run('Automatic Accidentals - Key C#, Single Octave', automaticAccidentalsCornerCases3); + run('Automatic Accidentals - Key C#, Two Octaves', automaticAccidentalsCornerCases4); + run('Factory API', factoryAPI); + }, +}; +function hasAccidental(note) { + return note.getModifiers().some((modifier) => isAccidental(modifier)); +} +function makeNewAccid(factory) { + return (type) => factory.Accidental({ type }); +} +function autoAccidentalWorking() { + const createStaveNote = (noteStruct) => new StaveNote(noteStruct); + let notes = [ + { keys: ['bb/4'], duration: '4' }, + { keys: ['bb/4'], duration: '4' }, + { keys: ['g#/4'], duration: '4' }, + { keys: ['g/4'], duration: '4' }, + { keys: ['b/4'], duration: '4' }, + { keys: ['b/4'], duration: '4' }, + { keys: ['a#/4'], duration: '4' }, + { keys: ['g#/4'], duration: '4' }, + ].map(createStaveNote); + let voice = new Voice().setMode(Voice.Mode.SOFT).addTickables(notes); + Accidental.applyAccidentals([voice], 'F'); + equal(hasAccidental(notes[0]), false, 'No flat because of key signature'); + equal(hasAccidental(notes[1]), false, 'No flat because of key signature'); + equal(hasAccidental(notes[2]), true, 'Added a sharp'); + equal(hasAccidental(notes[3]), true, 'Back to natural'); + equal(hasAccidental(notes[4]), true, 'Back to natural'); + equal(hasAccidental(notes[5]), false, 'Natural remembered'); + equal(hasAccidental(notes[6]), true, 'Added sharp'); + equal(hasAccidental(notes[7]), true, 'Added sharp'); + notes = [ + { keys: ['e#/4'], duration: '4' }, + { keys: ['cb/4'], duration: '4' }, + { keys: ['fb/4'], duration: '4' }, + { keys: ['b#/4'], duration: '4' }, + { keys: ['b#/4'], duration: '4' }, + { keys: ['cb/5'], duration: '4' }, + { keys: ['fb/5'], duration: '4' }, + { keys: ['e#/4'], duration: '4' }, + ].map(createStaveNote); + voice = new Voice().setMode(Voice.Mode.SOFT).addTickables(notes); + Accidental.applyAccidentals([voice], 'A'); + equal(hasAccidental(notes[0]), true, 'Added sharp'); + equal(hasAccidental(notes[1]), true, 'Added flat'); + equal(hasAccidental(notes[2]), true, 'Added flat'); + equal(hasAccidental(notes[3]), true, 'Added sharp'); + equal(hasAccidental(notes[4]), false, 'Sharp remembered'); + equal(hasAccidental(notes[5]), true, 'Added flat(different octave)'); + equal(hasAccidental(notes[6]), true, 'Added flat(different octave)'); + equal(hasAccidental(notes[7]), false, 'sharp remembered'); + notes = [ + { keys: ['c/4'], duration: '4' }, + { keys: ['cb/4'], duration: '4' }, + { keys: ['cb/4'], duration: '4' }, + { keys: ['c#/4'], duration: '4' }, + { keys: ['c#/4'], duration: '4' }, + { keys: ['cbb/4'], duration: '4' }, + { keys: ['cbb/4'], duration: '4' }, + { keys: ['c##/4'], duration: '4' }, + { keys: ['c##/4'], duration: '4' }, + { keys: ['c/4'], duration: '4' }, + { keys: ['c/4'], duration: '4' }, + ].map(createStaveNote); + voice = new Voice().setMode(Voice.Mode.SOFT).addTickables(notes); + Accidental.applyAccidentals([voice], 'C'); + equal(hasAccidental(notes[0]), false, 'No accidental'); + equal(hasAccidental(notes[1]), true, 'Added flat'); + equal(hasAccidental(notes[2]), false, 'Flat remembered'); + equal(hasAccidental(notes[3]), true, 'Sharp added'); + equal(hasAccidental(notes[4]), false, 'Sharp remembered'); + equal(hasAccidental(notes[5]), true, 'Added doubled flat'); + equal(hasAccidental(notes[6]), false, 'Double flat remembered'); + equal(hasAccidental(notes[7]), true, 'Added double sharp'); + equal(hasAccidental(notes[8]), false, 'Double sharp rememberd'); + equal(hasAccidental(notes[9]), true, 'Added natural'); + equal(hasAccidental(notes[10]), false, 'Natural remembered'); +} +function formatAccidentalSpaces(options) { + const f = VexFlowTests.makeFactory(options, 750, 280); + const context = f.getContext(); + const softmaxFactor = 100; + const notes = [ + new StaveNote({ + keys: ['e##/5'], + duration: '8d', + }).addModifier(new Accidental('##'), 0), + new StaveNote({ + keys: ['b/4'], + duration: '16', + }).addModifier(new Accidental('b'), 0), + new StaveNote({ + keys: ['f/3'], + duration: '8', + }), + new StaveNote({ + keys: ['a/3'], + duration: '16', + }), + new StaveNote({ + keys: ['e/4', 'g/4'], + duration: '16', + }) + .addModifier(new Accidental('bb'), 0) + .addModifier(new Accidental('bb'), 1), + new StaveNote({ + keys: ['d/4'], + duration: '16', + }), + new StaveNote({ + keys: ['e/4', 'g/4'], + duration: '16', + }) + .addModifier(new Accidental('#'), 0) + .addModifier(new Accidental('#'), 1), + new StaveNote({ + keys: ['g/4'], + duration: '32', + }), + new StaveNote({ + keys: ['a/4'], + duration: '32', + }), + new StaveNote({ + keys: ['g/4'], + duration: '16', + }), + new StaveNote({ + keys: ['d/4'], + duration: 'q', + }), + ]; + Dot.buildAndAttach([notes[0]], { all: true }); + const beams = Beam.generateBeams(notes); + const voice = new Voice({ + num_beats: 4, + beat_value: 4, + }); + voice.addTickables(notes); + const formatter = new Formatter({ softmaxFactor }).joinVoices([voice]); + const width = formatter.preCalculateMinTotalWidth([voice]); + const stave = new Stave(10, 40, width + 20); + stave.setContext(context).draw(); + formatter.format([voice], width); + voice.draw(context, stave); + beams.forEach((b) => b.setContext(context).draw()); + notes.forEach((note) => Note.plotMetrics(context, note, 30)); + VexFlowTests.plotLegendForNoteWidth(context, 300, 150); + ok(true); +} +function basic(options) { + const f = VexFlowTests.makeFactory(options, 700, 240); + const accid = makeNewAccid(f); + f.Stave({ x: 10, y: 10, width: 550 }); + const notes = [ + f + .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: '1' }) + .addModifier(accid('b'), 0) + .addModifier(accid('#'), 1), + f + .StaveNote({ keys: ['d/4', 'e/4', 'f/4', 'a/4', 'c/5', 'e/5', 'g/5'], duration: '2' }) + .addModifier(accid('##'), 0) + .addModifier(accid('n'), 1) + .addModifier(accid('bb'), 2) + .addModifier(accid('b'), 3) + .addModifier(accid('#'), 4) + .addModifier(accid('n'), 5) + .addModifier(accid('bb'), 6), + f + .StaveNote({ keys: ['f/4', 'g/4', 'a/4', 'b/4', 'c/5', 'e/5', 'g/5'], duration: '16' }) + .addModifier(accid('n'), 0) + .addModifier(accid('#'), 1) + .addModifier(accid('#'), 2) + .addModifier(accid('b'), 3) + .addModifier(accid('bb'), 4) + .addModifier(accid('##'), 5) + .addModifier(accid('#'), 6), + f + .StaveNote({ keys: ['a/3', 'c/4', 'e/4', 'b/4', 'd/5', 'g/5'], duration: '1' }) + .addModifier(accid('#'), 0) + .addModifier(accid('##').setAsCautionary(), 1) + .addModifier(accid('#').setAsCautionary(), 2) + .addModifier(accid('b'), 3) + .addModifier(accid('bb').setAsCautionary(), 4) + .addModifier(accid('b').setAsCautionary(), 5), + ]; + Formatter.SimpleFormat(notes, 10, { paddingBetween: 45 }); + notes.forEach((note, index) => { + Note.plotMetrics(f.getContext(), note, 140); + ok(note.getModifiersByType('Accidental').length > 0, 'Note ' + index + ' has accidentals'); + note.getModifiersByType('Accidental').forEach((accid, index) => { + ok(accid.getWidth() > 0, 'Accidental ' + index + ' has set width'); + }); + }); + f.draw(); + VexFlowTests.plotLegendForNoteWidth(f.getContext(), 480, 140); + ok(true, 'Full Accidental'); +} +function cautionary(options) { + const staveCount = 12; + const scale = 0.85; + const staveWidth = 840; + let i = 0; + let j = 0; + const f = VexFlowTests.makeFactory(options, staveWidth + 10, 175 * staveCount + 10); + f.getContext().scale(scale, scale); + const accids = Object.keys(Flow.accidentalMap).filter((accid) => accid !== '{' && accid !== '}'); + const mod = Math.round(accids.length / staveCount); + for (i = 0; i < staveCount; ++i) { + const stave = f.Stave({ x: 0, y: 10 + 200 * i, width: staveWidth / scale }); + const score = f.EasyScore(); + const rowMap = []; + for (j = 0; j < mod && j + i * staveCount < accids.length; ++j) { + rowMap.push(accids[j + i * staveCount]); + } + const notes = rowMap.map((accidType) => f + .StaveNote({ keys: ['a/4'], duration: '4', stem_direction: Stem.UP }) + .addModifier(f.Accidental({ type: accidType }), 0)); + const voice = score.voice(notes, { time: rowMap.length + '/4' }); + voice.getTickables().forEach((tickable) => { + tickable + .getModifiers() + .filter((modifier) => modifier.getAttribute('type') === Accidental.CATEGORY) + .forEach((accid) => accid.setAsCautionary()); + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + } + ok(true, 'Must successfully render cautionary accidentals'); +} +function specialCases(options) { + const f = VexFlowTests.makeFactory(options, 700, 240); + const accid = makeNewAccid(f); + f.Stave({ x: 10, y: 10, width: 550 }); + const notes = [ + f + .StaveNote({ keys: ['f/4', 'd/5'], duration: '1' }) + .addModifier(accid('#'), 0) + .addModifier(accid('b'), 1), + f + .StaveNote({ keys: ['c/4', 'g/4'], duration: '2' }) + .addModifier(accid('##'), 0) + .addModifier(accid('##'), 1), + f + .StaveNote({ keys: ['b/3', 'd/4', 'f/4'], duration: '16' }) + .addModifier(accid('#'), 0) + .addModifier(accid('#'), 1) + .addModifier(accid('##'), 2), + f + .StaveNote({ keys: ['g/4', 'a/4', 'c/5', 'e/5'], duration: '16' }) + .addModifier(accid('b'), 0) + .addModifier(accid('b'), 1) + .addModifier(accid('n'), 3), + f + .StaveNote({ keys: ['e/4', 'g/4', 'b/4', 'c/5'], duration: '4' }) + .addModifier(accid('b').setAsCautionary(), 0) + .addModifier(accid('b').setAsCautionary(), 1) + .addModifier(accid('bb'), 2) + .addModifier(accid('b'), 3), + f + .StaveNote({ keys: ['b/3', 'e/4', 'a/4', 'd/5', 'g/5'], duration: '8' }) + .addModifier(accid('bb'), 0) + .addModifier(accid('b').setAsCautionary(), 1) + .addModifier(accid('n').setAsCautionary(), 2) + .addModifier(accid('#'), 3) + .addModifier(accid('n').setAsCautionary(), 4), + ]; + Formatter.SimpleFormat(notes, 0, { paddingBetween: 20 }); + notes.forEach((note, index) => { + Note.plotMetrics(f.getContext(), note, 140); + ok(note.getModifiersByType('Accidental').length > 0, 'Note ' + index + ' has accidentals'); + note.getModifiersByType('Accidental').forEach((accid, index) => { + ok(accid.getWidth() > 0, 'Accidental ' + index + ' has set width'); + }); + }); + f.draw(); + VexFlowTests.plotLegendForNoteWidth(f.getContext(), 480, 140); + ok(true, 'Full Accidental'); +} +function basicStemDown(options) { + const f = VexFlowTests.makeFactory(options, 700, 240); + const accid = makeNewAccid(f); + f.Stave({ x: 10, y: 10, width: 550 }); + const notes = [ + f + .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: 'w', stem_direction: -1 }) + .addModifier(accid('b'), 0) + .addModifier(accid('#'), 1), + f + .StaveNote({ keys: ['d/4', 'e/4', 'f/4', 'a/4', 'c/5', 'e/5', 'g/5'], duration: '2', stem_direction: -1 }) + .addModifier(accid('##'), 0) + .addModifier(accid('n'), 1) + .addModifier(accid('bb'), 2) + .addModifier(accid('b'), 3) + .addModifier(accid('#'), 4) + .addModifier(accid('n'), 5) + .addModifier(accid('bb'), 6), + f + .StaveNote({ keys: ['f/4', 'g/4', 'a/4', 'b/4', 'c/5', 'e/5', 'g/5'], duration: '16', stem_direction: -1 }) + .addModifier(accid('n'), 0) + .addModifier(accid('#'), 1) + .addModifier(accid('#'), 2) + .addModifier(accid('b'), 3) + .addModifier(accid('bb'), 4) + .addModifier(accid('##'), 5) + .addModifier(accid('#'), 6), + ]; + Formatter.SimpleFormat(notes, 0, { paddingBetween: 30 }); + notes.forEach((note, noteIndex) => { + Note.plotMetrics(f.getContext(), note, 140); + ok(note.getModifiersByType('Accidental').length > 0, 'Note ' + noteIndex + ' has accidentals'); + note.getModifiersByType('Accidental').forEach((accid, accidIndex) => { + ok(accid.getWidth() > 0, 'Accidental ' + accidIndex + ' has set width'); + }); + }); + f.draw(); + VexFlowTests.plotLegendForNoteWidth(f.getContext(), 480, 140); + ok(true, 'Full Accidental'); +} +function multiVoice(options) { + function showNotes(note1, note2, stave, ctx, x) { + const modifierContext = new ModifierContext(); + note1.addToModifierContext(modifierContext); + note2.addToModifierContext(modifierContext); + new TickContext().addTickable(note1).addTickable(note2).preFormat().setX(x); + note1.setContext(ctx).draw(); + note2.setContext(ctx).draw(); + Note.plotMetrics(ctx, note1, 180); + Note.plotMetrics(ctx, note2, 15); + } + const f = VexFlowTests.makeFactory(options, 460, 250); + const accid = makeNewAccid(f); + const stave = f.Stave({ x: 10, y: 45, width: 420 }); + const ctx = f.getContext(); + stave.draw(); + let note1 = f + .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: '2', stem_direction: -1 }) + .addModifier(accid('b'), 0) + .addModifier(accid('n'), 1) + .addModifier(accid('#'), 2) + .setStave(stave); + let note2 = f + .StaveNote({ keys: ['d/5', 'a/5', 'b/5'], duration: '2', stem_direction: 1 }) + .addModifier(accid('b'), 0) + .addModifier(accid('bb'), 1) + .addModifier(accid('##'), 2) + .setStave(stave); + showNotes(note1, note2, stave, ctx, 60); + note1 = f + .StaveNote({ keys: ['c/4', 'e/4', 'c/5'], duration: '2', stem_direction: -1 }) + .addModifier(accid('b'), 0) + .addModifier(accid('n'), 1) + .addModifier(accid('#'), 2) + .setStave(stave); + note2 = f + .StaveNote({ keys: ['d/5', 'a/5', 'b/5'], duration: '4', stem_direction: 1 }) + .addModifier(accid('b'), 0) + .setStave(stave); + showNotes(note1, note2, stave, ctx, 150); + note1 = f + .StaveNote({ keys: ['d/4', 'c/5', 'd/5'], duration: '2', stem_direction: -1 }) + .addModifier(accid('b'), 0) + .addModifier(accid('n'), 1) + .addModifier(accid('#'), 2) + .setStave(stave); + note2 = f + .StaveNote({ keys: ['d/5', 'a/5', 'b/5'], duration: '4', stem_direction: 1 }) + .addModifier(accid('b'), 0) + .setStave(stave); + showNotes(note1, note2, stave, ctx, 250); + VexFlowTests.plotLegendForNoteWidth(ctx, 350, 150); + ok(true, 'Full Accidental'); +} +function microtonal(options) { + const f = VexFlowTests.makeFactory(options, 700, 240); + const accid = makeNewAccid(f); + const ctx = f.getContext(); + f.Stave({ x: 10, y: 10, width: 650 }); + const notes = [ + f + .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: '1' }) + .addModifier(accid('db'), 0) + .addModifier(accid('d'), 1), + f + .StaveNote({ keys: ['d/4', 'e/4', 'f/4', 'a/4', 'c/5', 'e/5', 'g/5'], duration: '2' }) + .addModifier(accid('bbs'), 0) + .addModifier(accid('++'), 1) + .addModifier(accid('+'), 2) + .addModifier(accid('d'), 3) + .addModifier(accid('db'), 4) + .addModifier(accid('+'), 5) + .addModifier(accid('##'), 6), + f + .StaveNote({ keys: ['f/4', 'g/4', 'a/4', 'b/4', 'c/5', 'e/5', 'g/5'], duration: '16' }) + .addModifier(accid('++'), 0) + .addModifier(accid('bbs'), 1) + .addModifier(accid('+'), 2) + .addModifier(accid('b'), 3) + .addModifier(accid('db'), 4) + .addModifier(accid('##'), 5) + .addModifier(accid('#'), 6), + f + .StaveNote({ keys: ['a/3', 'c/4', 'e/4', 'b/4', 'd/5', 'g/5'], duration: '1' }) + .addModifier(accid('#'), 0) + .addModifier(accid('db').setAsCautionary(), 1) + .addModifier(accid('bbs').setAsCautionary(), 2) + .addModifier(accid('b'), 3) + .addModifier(accid('++').setAsCautionary(), 4) + .addModifier(accid('d').setAsCautionary(), 5), + f + .StaveNote({ keys: ['f/4', 'g/4', 'a/4', 'b/4', 'd/5', 'g/5'], duration: '16' }) + .addModifier(accid('++-'), 0) + .addModifier(accid('+-'), 1) + .addModifier(accid('bs'), 2) + .addModifier(accid('bss'), 3) + .addModifier(accid('afhf'), 4) + .addModifier(accid('ashs'), 5), + ]; + Formatter.SimpleFormat(notes, 0, { paddingBetween: 35 }); + notes.forEach((note, index) => { + Note.plotMetrics(f.getContext(), note, 140); + ok(note.getModifiersByType('Accidental').length > 0, 'Note ' + index + ' has accidentals'); + note.getModifiersByType('Accidental').forEach((accid, index) => { + ok(accid.getWidth() > 0, 'Accidental ' + index + ' has set width'); + }); + }); + f.draw(); + VexFlowTests.plotLegendForNoteWidth(ctx, 580, 140); + ok(true, 'Microtonal Accidental'); +} +function microtonal_iranian(options) { + const f = VexFlowTests.makeFactory(options, 700, 240); + const accid = makeNewAccid(f); + const ctx = f.getContext(); + f.Stave({ x: 10, y: 10, width: 650 }); + const notes = [ + f + .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: '1' }) + .addModifier(accid('k'), 0) + .addModifier(accid('o'), 1), + f + .StaveNote({ keys: ['d/4', 'e/4', 'f/4', 'a/4', 'c/5', 'e/5', 'g/5'], duration: '2' }) + .addModifier(accid('b'), 0) + .addModifier(accid('k'), 1) + .addModifier(accid('n'), 2) + .addModifier(accid('o'), 3) + .addModifier(accid('#'), 4) + .addModifier(accid('bb'), 5) + .addModifier(accid('##'), 6), + f + .StaveNote({ keys: ['f/4', 'g/4', 'a/4', 'b/4', 'c/5', 'e/5', 'g/5'], duration: '16' }) + .addModifier(accid('o'), 0) + .addModifier(accid('k'), 1) + .addModifier(accid('n'), 2) + .addModifier(accid('b'), 3) + .addModifier(accid('bb'), 4) + .addModifier(accid('##'), 5) + .addModifier(accid('#'), 6), + f + .StaveNote({ keys: ['a/3', 'c/4', 'e/4', 'b/4', 'd/5', 'g/5'], duration: '1' }) + .addModifier(accid('#'), 0) + .addModifier(accid('o').setAsCautionary(), 1) + .addModifier(accid('n').setAsCautionary(), 2) + .addModifier(accid('b'), 3) + .addModifier(accid('k').setAsCautionary(), 4), + f + .StaveNote({ keys: ['f/4', 'g/4', 'a/4', 'b/4'], duration: '16' }) + .addModifier(accid('k'), 0) + .addModifier(accid('k'), 1) + .addModifier(accid('k'), 2) + .addModifier(accid('k'), 3), + ]; + Formatter.SimpleFormat(notes, 0, { paddingBetween: 35 }); + notes.forEach((note, index) => { + Note.plotMetrics(f.getContext(), note, 140); + ok(note.getModifiersByType('Accidental').length > 0, 'Note ' + index + ' has accidentals'); + note.getModifiersByType('Accidental').forEach((accid, index) => { + ok(accid.getWidth() > 0, 'Accidental ' + index + ' has set width'); + }); + }); + f.draw(); + VexFlowTests.plotLegendForNoteWidth(ctx, 580, 140); + ok(true, 'Microtonal Accidental (Iranian)'); +} +function sagittal(options) { + const f = VexFlowTests.makeFactory(options, 700, 240); + const accid = makeNewAccid(f); + const ctx = f.getContext(); + f.Stave({ x: 10, y: 10, width: 650 }); + const notes = [ + f + .StaveNote({ keys: ['d/4', 'f/4', 'b/4', 'b/4'], duration: '4' }) + .addModifier(accid('accSagittal11MediumDiesisUp'), 1) + .addModifier(accid('accSagittal5CommaDown'), 2) + .addModifier(accid('b'), 3) + .addModifier(accid('accSagittal7CommaDown'), 3), + f + .StaveNote({ keys: ['d/4', 'f/4', 'a/4', 'b/4'], duration: '4' }) + .addModifier(accid('accSagittal35LargeDiesisDown'), 2), + f.StaveNote({ keys: ['c/4', 'e/4', 'g/4', 'c/5'], duration: '8' }).addModifier(accid('accSagittal5CommaDown'), 1), + f + .StaveNote({ keys: ['c/4', 'e/4', 'g/4', 'b/4'], duration: '8' }) + .addModifier(accid('b'), 1) + .addModifier(accid('accSagittal7CommaDown'), 1) + .addModifier(accid('accSagittal11LargeDiesisDown'), 3), + f + .StaveNote({ keys: ['d/4', 'f/4', 'b/4', 'b/4'], duration: '4' }) + .addModifier(accid('accSagittal11MediumDiesisUp'), 1) + .addModifier(accid('accSagittal5CommaDown'), 2) + .addModifier(accid('accSagittalFlat7CDown'), 3), + f + .StaveNote({ keys: ['d/4', 'f/4', 'a/4', 'b/4'], duration: '4' }) + .addModifier(accid('accSagittal35LargeDiesisDown'), 2), + f.StaveNote({ keys: ['c/4', 'e/4', 'g/4', 'c/5'], duration: '8' }).addModifier(accid('accSagittal5CommaDown'), 1), + f + .StaveNote({ keys: ['c/4', 'e/4', 'g/4', 'b/4'], duration: '8' }) + .addModifier(accid('accSagittalFlat7CDown'), 1) + .addModifier(accid('accSagittal11LargeDiesisDown'), 3), + ]; + f.StaveTie({ + from: notes[0], + to: notes[1], + first_indices: [0, 1], + last_indices: [0, 1], + }); + f.StaveTie({ + from: notes[0], + to: notes[1], + first_indices: [3], + last_indices: [3], + options: { + direction: Stem.DOWN, + }, + }); + f.StaveTie({ + from: notes[4], + to: notes[5], + first_indices: [0, 1], + last_indices: [0, 1], + }); + f.StaveTie({ + from: notes[4], + to: notes[5], + first_indices: [3], + last_indices: [3], + options: { + direction: Stem.DOWN, + }, + }); + f.Beam({ notes: notes.slice(2, 4) }); + f.Beam({ notes: notes.slice(6, 8) }); + Formatter.SimpleFormat(notes); + notes.forEach((note, index) => { + Note.plotMetrics(f.getContext(), note, 140); + ok(note.getModifiersByType('Accidental').length > 0, 'Note ' + index + ' has accidentals'); + note.getModifiersByType('Accidental').forEach((accid, index) => { + ok(accid.getWidth() > 0, 'Accidental ' + index + ' has set width'); + }); + }); + f.draw(); + VexFlowTests.plotLegendForNoteWidth(ctx, 580, 140); + ok(true, 'Sagittal'); +} +function automaticAccidentals0(options) { + const f = VexFlowTests.makeFactory(options, 700, 200); + const stave = f.Stave(); + const notes = [ + { keys: ['c/4', 'c/5'], duration: '4' }, + { keys: ['c#/4', 'c#/5'], duration: '4' }, + { keys: ['c#/4', 'c#/5'], duration: '4' }, + { keys: ['c##/4', 'c##/5'], duration: '4' }, + { keys: ['c##/4', 'c##/5'], duration: '4' }, + { keys: ['c/4', 'c/5'], duration: '4' }, + { keys: ['cn/4', 'cn/5'], duration: '4' }, + { keys: ['cbb/4', 'cbb/5'], duration: '4' }, + { keys: ['cbb/4', 'cbb/5'], duration: '4' }, + { keys: ['cb/4', 'cb/5'], duration: '4' }, + { keys: ['cb/4', 'cb/5'], duration: '4' }, + { keys: ['c/4', 'c/5'], duration: '4' }, + ].map(f.StaveNote.bind(f)); + const gracenotes = [{ keys: ['d#/4'], duration: '16', slash: true }].map(f.GraceNote.bind(f)); + notes[0].addModifier(f.GraceNoteGroup({ notes: gracenotes }).beamNotes(), 0); + const voice = f + .Voice() + .setMode(Voice.Mode.SOFT) + .addTickable(new TimeSigNote('12/4').setStave(stave)) + .addTickables(notes); + Accidental.applyAccidentals([voice], 'C'); + new Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true); +} +function automaticAccidentals1(options) { + const f = VexFlowTests.makeFactory(options, 700, 150); + const stave = f.Stave().addKeySignature('Ab'); + const notes = [ + { keys: ['c/4'], duration: '4' }, + { keys: ['d/4'], duration: '4' }, + { keys: ['e/4'], duration: '4' }, + { keys: ['f/4'], duration: '4' }, + { keys: ['g/4'], duration: '4' }, + { keys: ['a/4'], duration: '4' }, + { keys: ['b/4'], duration: '4' }, + { keys: ['c/5'], duration: '4' }, + ].map(f.StaveNote.bind(f)); + const voice = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes); + Accidental.applyAccidentals([voice], 'Ab'); + new Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true); +} +function automaticAccidentals2(options) { + const f = VexFlowTests.makeFactory(options, 700, 150); + const stave = f.Stave().addKeySignature('A'); + const notes = [ + { keys: ['a/4'], duration: '4' }, + { keys: ['b/4'], duration: '4' }, + { keys: ['c#/5'], duration: '4' }, + { keys: ['d/5'], duration: '4' }, + { keys: ['e/5'], duration: '4' }, + { keys: ['f#/5'], duration: '4' }, + { keys: ['g#/5'], duration: '4' }, + { keys: ['a/5'], duration: '4' }, + ].map(f.StaveNote.bind(f)); + const voice = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes); + Accidental.applyAccidentals([voice], 'A'); + new Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true); +} +function automaticAccidentals3(options) { + const f = VexFlowTests.makeFactory(options, 700, 150); + const stave = f.Stave().addKeySignature('A'); + const score = f.EasyScore(); + score.set({ time: '8/4' }); + const notes = score.notes('A4/q, B4/q, C#5/q, D5/q, E5/q,F#5/q, G#5/q, A5/q', { stem: 'UP' }); + const voice = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes); + Accidental.applyAccidentals([voice], 'A'); + new Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true); +} +function automaticAccidentalsMultiVoiceInline(options) { + const f = VexFlowTests.makeFactory(options, 700, 150); + const stave = f.Stave().addKeySignature('Ab'); + const notes0 = [ + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['d/4'], duration: '4', stem_direction: -1 }, + { keys: ['e/4'], duration: '4', stem_direction: -1 }, + { keys: ['f/4'], duration: '4', stem_direction: -1 }, + { keys: ['g/4'], duration: '4', stem_direction: -1 }, + { keys: ['a/4'], duration: '4', stem_direction: -1 }, + { keys: ['b/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/5'], duration: '4', stem_direction: -1 }, + ].map(f.StaveNote.bind(f)); + const notes1 = [ + { keys: ['c/5'], duration: '4' }, + { keys: ['d/5'], duration: '4' }, + { keys: ['e/5'], duration: '4' }, + { keys: ['f/5'], duration: '4' }, + { keys: ['g/5'], duration: '4' }, + { keys: ['a/5'], duration: '4' }, + { keys: ['b/5'], duration: '4' }, + { keys: ['c/6'], duration: '4' }, + ].map(f.StaveNote.bind(f)); + const voice0 = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes0); + const voice1 = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes1); + Accidental.applyAccidentals([voice0, voice1], 'Ab'); + equal(hasAccidental(notes0[0]), false); + equal(hasAccidental(notes0[1]), true); + equal(hasAccidental(notes0[2]), true); + equal(hasAccidental(notes0[3]), false); + equal(hasAccidental(notes0[4]), false); + equal(hasAccidental(notes0[5]), true); + equal(hasAccidental(notes0[6]), true); + equal(hasAccidental(notes0[7]), false); + equal(hasAccidental(notes1[0]), false); + equal(hasAccidental(notes1[1]), true); + equal(hasAccidental(notes1[2]), true); + equal(hasAccidental(notes1[3]), false); + equal(hasAccidental(notes1[4]), false); + equal(hasAccidental(notes1[5]), true); + equal(hasAccidental(notes1[6]), true); + equal(hasAccidental(notes1[7]), false); + new Formatter().joinVoices([voice0, voice1]).formatToStave([voice0, voice1], stave); + f.draw(); + ok(true); +} +function automaticAccidentalsMultiVoiceOffset(options) { + const f = VexFlowTests.makeFactory(options, 700, 150); + const stave = f.Stave().addKeySignature('Cb'); + const notes0 = [ + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['d/4'], duration: '4', stem_direction: -1 }, + { keys: ['e/4'], duration: '4', stem_direction: -1 }, + { keys: ['f/4'], duration: '4', stem_direction: -1 }, + { keys: ['g/4'], duration: '4', stem_direction: -1 }, + { keys: ['a/4'], duration: '4', stem_direction: -1 }, + { keys: ['b/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/5'], duration: '4', stem_direction: -1 }, + ].map(f.StaveNote.bind(f)); + const notes1 = [ + { keys: ['c/5'], duration: '8' }, + { keys: ['c/5'], duration: '4' }, + { keys: ['d/5'], duration: '4' }, + { keys: ['e/5'], duration: '4' }, + { keys: ['f/5'], duration: '4' }, + { keys: ['g/5'], duration: '4' }, + { keys: ['a/5'], duration: '4' }, + { keys: ['b/5'], duration: '4' }, + { keys: ['c/6'], duration: '4' }, + ].map(f.StaveNote.bind(f)); + const voice0 = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes0); + const voice1 = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes1); + Accidental.applyAccidentals([voice0, voice1], 'Cb'); + equal(hasAccidental(notes0[0]), true); + equal(hasAccidental(notes0[1]), true); + equal(hasAccidental(notes0[2]), true); + equal(hasAccidental(notes0[3]), true); + equal(hasAccidental(notes0[4]), true); + equal(hasAccidental(notes0[5]), true); + equal(hasAccidental(notes0[6]), true); + equal(hasAccidental(notes0[7]), false, 'Natural Remembered'); + equal(hasAccidental(notes1[0]), true); + equal(hasAccidental(notes1[1]), false); + equal(hasAccidental(notes1[2]), true); + equal(hasAccidental(notes1[3]), true); + equal(hasAccidental(notes1[4]), true); + equal(hasAccidental(notes1[5]), true); + equal(hasAccidental(notes1[6]), true); + equal(hasAccidental(notes1[7]), true); + new Formatter().joinVoices([voice0, voice1]).formatToStave([voice0, voice1], stave); + f.draw(); + ok(true); +} +function automaticAccidentalsCornerCases1(options) { + const f = VexFlowTests.makeFactory(options, 700, 150); + const stave = f.Stave().addKeySignature('C'); + const notes0 = [ + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c#/4'], duration: '4', stem_direction: -1 }, + { keys: ['c#/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['cb/4'], duration: '4', stem_direction: -1 }, + { keys: ['cb/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + ].map(f.StaveNote.bind(f)); + const voice0 = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes0); + Accidental.applyAccidentals([voice0], 'C'); + equal(hasAccidental(notes0[0]), false); + equal(hasAccidental(notes0[1]), true); + equal(hasAccidental(notes0[2]), false); + equal(hasAccidental(notes0[3]), true); + equal(hasAccidental(notes0[4]), false); + equal(hasAccidental(notes0[5]), true); + equal(hasAccidental(notes0[6]), false); + equal(hasAccidental(notes0[7]), true); + equal(hasAccidental(notes0[8]), false); + new Formatter().joinVoices([voice0]).formatToStave([voice0], stave); + f.draw(); + ok(true); +} +function automaticAccidentalsCornerCases2(options) { + const f = VexFlowTests.makeFactory(options, 700, 150); + const stave = f.Stave().addKeySignature('C'); + const notes0 = [ + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/5'], duration: '4', stem_direction: -1 }, + { keys: ['c#/4'], duration: '4', stem_direction: -1 }, + { keys: ['c#/5'], duration: '4', stem_direction: -1 }, + { keys: ['c#/4'], duration: '4', stem_direction: -1 }, + { keys: ['c#/5'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/5'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/5'], duration: '4', stem_direction: -1 }, + { keys: ['cb/4'], duration: '4', stem_direction: -1 }, + { keys: ['cb/5'], duration: '4', stem_direction: -1 }, + { keys: ['cb/4'], duration: '4', stem_direction: -1 }, + { keys: ['cb/5'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/5'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/5'], duration: '4', stem_direction: -1 }, + ].map(f.StaveNote.bind(f)); + const voice0 = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes0); + Accidental.applyAccidentals([voice0], 'C'); + equal(hasAccidental(notes0[0]), false); + equal(hasAccidental(notes0[2]), true); + equal(hasAccidental(notes0[4]), false); + equal(hasAccidental(notes0[6]), true); + equal(hasAccidental(notes0[8]), false); + equal(hasAccidental(notes0[10]), true); + equal(hasAccidental(notes0[12]), false); + equal(hasAccidental(notes0[14]), true); + equal(hasAccidental(notes0[16]), false); + equal(hasAccidental(notes0[1]), false); + equal(hasAccidental(notes0[3]), true); + equal(hasAccidental(notes0[5]), false); + equal(hasAccidental(notes0[7]), true); + equal(hasAccidental(notes0[9]), false); + equal(hasAccidental(notes0[11]), true); + equal(hasAccidental(notes0[13]), false); + equal(hasAccidental(notes0[15]), true); + equal(hasAccidental(notes0[17]), false); + new Formatter().joinVoices([voice0]).formatToStave([voice0], stave); + f.draw(); + ok(true); +} +function automaticAccidentalsCornerCases3(options) { + const f = VexFlowTests.makeFactory(options, 700, 150); + const stave = f.Stave().addKeySignature('C#'); + const notes0 = [ + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c#/4'], duration: '4', stem_direction: -1 }, + { keys: ['c#/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['cb/4'], duration: '4', stem_direction: -1 }, + { keys: ['cb/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + ].map(f.StaveNote.bind(f)); + const voice0 = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes0); + Accidental.applyAccidentals([voice0], 'C#'); + equal(hasAccidental(notes0[0]), true); + equal(hasAccidental(notes0[1]), true); + equal(hasAccidental(notes0[2]), false); + equal(hasAccidental(notes0[3]), true); + equal(hasAccidental(notes0[4]), false); + equal(hasAccidental(notes0[5]), true); + equal(hasAccidental(notes0[6]), false); + equal(hasAccidental(notes0[7]), true); + equal(hasAccidental(notes0[8]), false); + new Formatter().joinVoices([voice0]).formatToStave([voice0], stave); + f.draw(); + ok(true); +} +function automaticAccidentalsCornerCases4(options) { + const f = VexFlowTests.makeFactory(options, 700, 150); + const stave = f.Stave().addKeySignature('C#'); + const notes0 = [ + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/5'], duration: '4', stem_direction: -1 }, + { keys: ['c#/4'], duration: '4', stem_direction: -1 }, + { keys: ['c#/5'], duration: '4', stem_direction: -1 }, + { keys: ['c#/4'], duration: '4', stem_direction: -1 }, + { keys: ['c#/5'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/5'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/5'], duration: '4', stem_direction: -1 }, + { keys: ['cb/4'], duration: '4', stem_direction: -1 }, + { keys: ['cb/5'], duration: '4', stem_direction: -1 }, + { keys: ['cb/4'], duration: '4', stem_direction: -1 }, + { keys: ['cb/5'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/5'], duration: '4', stem_direction: -1 }, + { keys: ['c/4'], duration: '4', stem_direction: -1 }, + { keys: ['c/5'], duration: '4', stem_direction: -1 }, + ].map(f.StaveNote.bind(f)); + const voice0 = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes0); + Accidental.applyAccidentals([voice0], 'C#'); + equal(hasAccidental(notes0[0]), true); + equal(hasAccidental(notes0[2]), true); + equal(hasAccidental(notes0[4]), false); + equal(hasAccidental(notes0[6]), true); + equal(hasAccidental(notes0[8]), false); + equal(hasAccidental(notes0[10]), true); + equal(hasAccidental(notes0[12]), false); + equal(hasAccidental(notes0[14]), true); + equal(hasAccidental(notes0[16]), false); + equal(hasAccidental(notes0[1]), true); + equal(hasAccidental(notes0[3]), true); + equal(hasAccidental(notes0[5]), false); + equal(hasAccidental(notes0[7]), true); + equal(hasAccidental(notes0[9]), false); + equal(hasAccidental(notes0[11]), true); + equal(hasAccidental(notes0[13]), false); + equal(hasAccidental(notes0[15]), true); + equal(hasAccidental(notes0[17]), false); + new Formatter().joinVoices([voice0]).formatToStave([voice0], stave); + f.draw(); + ok(true); +} +function factoryAPI(options) { + const f = VexFlowTests.makeFactory(options, 700, 240); + f.Stave({ x: 10, y: 10, width: 550 }); + const accid = makeNewAccid(f); + const notes = [ + f + .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: 'w' }) + .addModifier(accid('b'), 0) + .addModifier(accid('#'), 1), + f + .StaveNote({ keys: ['d/4', 'e/4', 'f/4', 'a/4', 'c/5', 'e/5', 'g/5'], duration: 'h' }) + .addModifier(accid('##'), 0) + .addModifier(accid('n'), 1) + .addModifier(accid('bb'), 2) + .addModifier(accid('b'), 3) + .addModifier(accid('#'), 4) + .addModifier(accid('n'), 5) + .addModifier(accid('bb'), 6), + f + .StaveNote({ keys: ['f/4', 'g/4', 'a/4', 'b/4', 'c/5', 'e/5', 'g/5'], duration: '16' }) + .addModifier(accid('n'), 0) + .addModifier(accid('#'), 1) + .addModifier(accid('#'), 2) + .addModifier(accid('b'), 3) + .addModifier(accid('bb'), 4) + .addModifier(accid('##'), 5) + .addModifier(accid('#'), 6), + f + .StaveNote({ keys: ['a/3', 'c/4', 'e/4', 'b/4', 'd/5', 'g/5'], duration: 'w' }) + .addModifier(accid('#'), 0) + .addModifier(accid('##').setAsCautionary(), 1) + .addModifier(accid('#').setAsCautionary(), 2) + .addModifier(accid('b'), 3) + .addModifier(accid('bb').setAsCautionary(), 4) + .addModifier(accid('b').setAsCautionary(), 5), + ]; + Formatter.SimpleFormat(notes); + notes.forEach((n, i) => { + ok(n.getModifiersByType('Accidental').length > 0, 'Note ' + i + ' has accidentals'); + n.getModifiersByType('Accidental').forEach((accid, i) => { + ok(accid.getWidth() > 0, 'Accidental ' + i + ' has set width'); + }); + }); + f.draw(); + ok(true, 'Factory API'); +} +VexFlowTests.register(AccidentalTests); +export { AccidentalTests }; diff --git a/build/esm/tests/annotation_tests.js b/build/esm/tests/annotation_tests.js new file mode 100644 index 0000000000..3a727cfbfe --- /dev/null +++ b/build/esm/tests/annotation_tests.js @@ -0,0 +1,377 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Annotation, AnnotationVerticalJustify } from '../src/annotation.js'; +import { Articulation } from '../src/articulation.js'; +import { Beam } from '../src/beam.js'; +import { Bend } from '../src/bend.js'; +import { Flow } from '../src/flow.js'; +import { Font, FontStyle, FontWeight } from '../src/font.js'; +import { Formatter } from '../src/formatter.js'; +import { ModifierPosition } from '../src/modifier.js'; +import { Registry } from '../src/registry.js'; +import { Stave } from '../src/stave.js'; +import { StaveNote } from '../src/stavenote.js'; +import { Stem } from '../src/stem.js'; +import { TabNote } from '../src/tabnote.js'; +import { TabStave } from '../src/tabstave.js'; +import { Vibrato } from '../src/vibrato.js'; +import { Voice } from '../src/voice.js'; +const AnnotationTests = { + Start() { + QUnit.module('Annotation'); + const run = VexFlowTests.runTests; + run('Placement', placement); + run('Lyrics', lyrics); + run('Simple Annotation', simple); + run('Standard Notation Annotation', standard); + run('Harmonics', harmonic); + run('Fingerpicking', picking); + run('Bottom Annotation', bottom); + run('Bottom Annotations with Beams', bottomWithBeam); + run('Test Justification Annotation Stem Up', justificationStemUp); + run('Test Justification Annotation Stem Down', justificationStemDown); + run('TabNote Annotations', tabNotes); + }, +}; +const FONT_SIZE = VexFlowTests.Font.size; +const tabNote = (noteStruct) => new TabNote(noteStruct); +const staveNote = (noteStruct) => new StaveNote(noteStruct); +function lyrics(options) { + let fontSize = FONT_SIZE; + let x = 10; + let width = 170; + let ratio = 1; + const registry = new Registry(); + Registry.enableDefaultRegistry(registry); + const f = VexFlowTests.makeFactory(options, 750, 260); + for (let i = 0; i < 3; ++i) { + const score = f.EasyScore(); + score.set({ time: '3/4' }); + const system = f.System({ width, x }); + system.addStave({ + voices: [ + score.voice(score.notes('(C4 F4)/2[id="n0"]').concat(score.beam(score.notes('(C4 A4)/8[id="n1"], (C#4 A4)/8[id="n2"]')))), + ], + }); + ['hand,', 'and', 'me', 'pears', 'lead', 'the'].forEach((text, ix) => { + const verse = Math.floor(ix / 3); + const noteGroupID = 'n' + (ix % 3); + const noteGroup = registry.getElementById(noteGroupID); + const lyricsAnnotation = f.Annotation({ text }).setFont('Roboto Slab', fontSize); + lyricsAnnotation.setPosition(ModifierPosition.BELOW); + noteGroup.addModifier(lyricsAnnotation, verse); + }); + system.addStave({ + voices: [score.voice(score.notes('(F4 D5)/2').concat(score.beam(score.notes('(F4 F5)/8, (F4 F5)/8'))))], + }); + f.draw(); + ratio = (fontSize + 2) / fontSize; + width = width * ratio; + x = x + width; + fontSize = fontSize + 2; + } + ok(true); +} +function simple(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 500, 240); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + ctx.font = '10pt Arial, sans-serif'; + const stave = new TabStave(10, 10, 450).addTabGlyph().setContext(ctx).draw(); + const notes = [ + tabNote({ + positions: [ + { str: 2, fret: 10 }, + { str: 4, fret: 9 }, + ], + duration: 'h', + }).addModifier(new Annotation('T'), 0), + tabNote({ + positions: [{ str: 2, fret: 10 }], + duration: 'h', + }).addModifier(new Bend('Full').setTap('T'), 0), + ]; + Formatter.FormatAndDraw(ctx, stave, notes); + ok(true, 'Simple Annotation'); +} +function standard(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 500, 240); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + const stave = new Stave(10, 10, 450).addClef('treble').setContext(ctx).draw(); + const annotation = (text) => new Annotation(text).setFont(Font.SERIF, FONT_SIZE, 'normal', 'italic'); + const notes = [ + staveNote({ keys: ['c/4', 'e/4'], duration: 'h' }).addModifier(annotation('quiet'), 0), + staveNote({ keys: ['c/4', 'e/4', 'c/5'], duration: 'h' }).addModifier(annotation('Allegro'), 2), + ]; + Formatter.FormatAndDraw(ctx, stave, notes); + ok(true, 'Standard Notation Annotation'); +} +function harmonic(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 500, 240); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + ctx.font = '10pt Arial'; + const stave = new TabStave(10, 10, 450).addTabGlyph().setContext(ctx).draw(); + const notes = [ + tabNote({ + positions: [ + { str: 2, fret: 12 }, + { str: 3, fret: 12 }, + ], + duration: 'h', + }).addModifier(new Annotation('Harm.'), 0), + tabNote({ + positions: [{ str: 2, fret: 9 }], + duration: 'h', + }) + .addModifier(new Annotation('(8va)').setFont(Font.SERIF, FONT_SIZE, FontWeight.NORMAL, FontStyle.ITALIC), 0) + .addModifier(new Annotation('A.H.'), 0), + ]; + Formatter.FormatAndDraw(ctx, stave, notes); + ok(true, 'Simple Annotation'); +} +function picking(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 500, 240); + ctx.setFillStyle('#221'); + ctx.setStrokeStyle('#221'); + ctx.setFont(Font.SANS_SERIF, FONT_SIZE); + const stave = new TabStave(10, 10, 450).addTabGlyph().setContext(ctx).draw(); + const annotation = (text) => new Annotation(text).setFont(Font.SERIF, FONT_SIZE, FontWeight.NORMAL, FontStyle.ITALIC); + const notes = [ + tabNote({ + positions: [ + { str: 1, fret: 0 }, + { str: 2, fret: 1 }, + { str: 3, fret: 2 }, + { str: 4, fret: 2 }, + { str: 5, fret: 0 }, + ], + duration: 'h', + }).addModifier(new Vibrato().setVibratoWidth(40), 0), + tabNote({ + positions: [{ str: 6, fret: 9 }], + duration: '8', + }).addModifier(annotation('p').setVerticalJustification(AnnotationVerticalJustify.TOP), 0), + tabNote({ + positions: [{ str: 3, fret: 9 }], + duration: '8', + }).addModifier(annotation('i').setVerticalJustification(AnnotationVerticalJustify.TOP), 0), + tabNote({ + positions: [{ str: 2, fret: 9 }], + duration: '8', + }).addModifier(annotation('m').setVerticalJustification(AnnotationVerticalJustify.TOP), 0), + tabNote({ + positions: [{ str: 1, fret: 9 }], + duration: '8', + }).addModifier(annotation('a').setVerticalJustification(AnnotationVerticalJustify.TOP), 0), + ]; + Formatter.FormatAndDraw(ctx, stave, notes); + ok(true, 'Fingerpicking'); +} +function placement(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 750, 300); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + const stave = new Stave(10, 50, 750).addClef('treble').setContext(ctx).draw(); + const annotation = (text, fontSize, vj) => new Annotation(text).setFont(Font.SERIF, fontSize).setVerticalJustification(vj); + const notes = [ + staveNote({ keys: ['e/4'], duration: 'q', stem_direction: Stem.DOWN }) + .addModifier(new Articulation('a.').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(new Articulation('a-').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(annotation('v1', 10, AnnotationVerticalJustify.TOP), 0) + .addModifier(annotation('v2', 10, AnnotationVerticalJustify.TOP), 0), + staveNote({ keys: ['b/4'], duration: 'q', stem_direction: Stem.DOWN }) + .addModifier(new Articulation('a.').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(new Articulation('a-').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(annotation('v1', 10, AnnotationVerticalJustify.TOP), 0) + .addModifier(annotation('v2', 10, AnnotationVerticalJustify.TOP), 0), + staveNote({ keys: ['c/5'], duration: 'q', stem_direction: Stem.DOWN }) + .addModifier(new Articulation('a.').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(new Articulation('a-').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(annotation('v1', 10, AnnotationVerticalJustify.TOP), 0) + .addModifier(annotation('v2', 10, AnnotationVerticalJustify.TOP), 0), + staveNote({ keys: ['f/4'], duration: 'q' }) + .addModifier(annotation('v1', 14, AnnotationVerticalJustify.TOP), 0) + .addModifier(annotation('v2', 14, AnnotationVerticalJustify.TOP), 0), + staveNote({ keys: ['f/4'], duration: 'q', stem_direction: Stem.DOWN }) + .addModifier(new Articulation('am').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(new Articulation('a.').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(new Articulation('a-').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(annotation('v1', 10, AnnotationVerticalJustify.TOP), 0) + .addModifier(annotation('v2', 20, AnnotationVerticalJustify.TOP), 0), + staveNote({ keys: ['f/5'], duration: 'q' }) + .addModifier(annotation('v1', 11, AnnotationVerticalJustify.TOP), 0) + .addModifier(annotation('v2', 11, AnnotationVerticalJustify.TOP), 0), + staveNote({ keys: ['f/5'], duration: 'q' }) + .addModifier(annotation('v1', 11, AnnotationVerticalJustify.TOP), 0) + .addModifier(annotation('v2', 20, AnnotationVerticalJustify.TOP), 0), + staveNote({ keys: ['f/4'], duration: 'q' }) + .addModifier(annotation('v1', 12, AnnotationVerticalJustify.BOTTOM), 0) + .addModifier(annotation('v2', 12, AnnotationVerticalJustify.BOTTOM), 0), + staveNote({ keys: ['f/5'], duration: 'q' }) + .addModifier(new Articulation('a.').setPosition(ModifierPosition.BELOW), 0) + .addModifier(annotation('v1', 11, AnnotationVerticalJustify.BOTTOM), 0) + .addModifier(annotation('v2', 20, AnnotationVerticalJustify.BOTTOM), 0), + staveNote({ keys: ['f/5'], duration: 'q', stem_direction: Stem.DOWN }) + .addModifier(new Articulation('am').setPosition(ModifierPosition.BELOW), 0) + .addModifier(annotation('v1', 10, AnnotationVerticalJustify.BOTTOM), 0) + .addModifier(annotation('v2', 20, AnnotationVerticalJustify.BOTTOM), 0), + staveNote({ keys: ['f/4'], duration: 'q', stem_direction: Stem.DOWN }) + .addModifier(annotation('v1', 10, AnnotationVerticalJustify.BOTTOM), 0) + .addModifier(annotation('v2', 20, AnnotationVerticalJustify.BOTTOM), 0), + staveNote({ keys: ['f/5'], duration: 'w' }) + .addModifier(new Articulation('a@u').setPosition(ModifierPosition.BELOW), 0) + .addModifier(annotation('v1', 11, AnnotationVerticalJustify.BOTTOM), 0) + .addModifier(annotation('v2', 16, AnnotationVerticalJustify.BOTTOM), 0), + ]; + Formatter.FormatAndDraw(ctx, stave, notes); + ok(true, ' Annotation Placement'); +} +function bottom(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 500, 240); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + const stave = new Stave(10, 10, 300).addClef('treble').setContext(ctx).draw(); + const annotation = (text) => new Annotation(text).setFont(Font.SERIF, FONT_SIZE).setVerticalJustification(Annotation.VerticalJustify.BOTTOM); + const notes = [ + staveNote({ keys: ['f/4'], duration: 'w' }).addModifier(annotation('F'), 0), + staveNote({ keys: ['a/4'], duration: 'w' }).addModifier(annotation('A'), 0), + staveNote({ keys: ['c/5'], duration: 'w' }).addModifier(annotation('C'), 0), + staveNote({ keys: ['e/5'], duration: 'w' }).addModifier(annotation('E'), 0), + ]; + Formatter.FormatAndDraw(ctx, stave, notes); + ok(true, 'Bottom Annotation'); +} +function bottomWithBeam(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 500, 240); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + const stave = new Stave(10, 10, 300).addClef('treble').setContext(ctx).draw(); + const notes = [ + new StaveNote({ keys: ['a/3'], duration: '8' }).addModifier(new Annotation('good').setVerticalJustification(Annotation.VerticalJustify.BOTTOM)), + new StaveNote({ keys: ['g/3'], duration: '8' }).addModifier(new Annotation('even').setVerticalJustification(Annotation.VerticalJustify.BOTTOM)), + new StaveNote({ keys: ['c/4'], duration: '8' }).addModifier(new Annotation('under').setVerticalJustification(Annotation.VerticalJustify.BOTTOM)), + new StaveNote({ keys: ['d/4'], duration: '8' }).addModifier(new Annotation('beam').setVerticalJustification(Annotation.VerticalJustify.BOTTOM)), + ]; + const beam = new Beam(notes.slice(1)); + Formatter.FormatAndDraw(ctx, stave, notes); + beam.setContext(ctx).draw(); + ok(true, 'Bottom Annotation with Beams'); +} +function justificationStemUp(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 650, 950); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + const annotation = (text, hJustification, vJustification) => new Annotation(text) + .setFont(Font.SANS_SERIF, FONT_SIZE) + .setJustification(hJustification) + .setVerticalJustification(vJustification); + for (let v = 1; v <= 4; ++v) { + const stave = new Stave(10, (v - 1) * 150 + 40, 400).addClef('treble').setContext(ctx).draw(); + const notes = [ + staveNote({ keys: ['c/3'], duration: 'q' }).addModifier(annotation('Text', 1, v), 0), + staveNote({ keys: ['c/4'], duration: 'q' }).addModifier(annotation('Text', 2, v), 0), + staveNote({ keys: ['c/5'], duration: 'q' }).addModifier(annotation('Text', 3, v), 0), + staveNote({ keys: ['c/6'], duration: 'q' }).addModifier(annotation('Text', 4, v), 0), + ]; + Formatter.FormatAndDraw(ctx, stave, notes); + } + ok(true, 'Test Justification Annotation'); +} +function justificationStemDown(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 650, 1000); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + const annotation = (text, hJustification, vJustification) => new Annotation(text) + .setFont(Font.SANS_SERIF, FONT_SIZE) + .setJustification(hJustification) + .setVerticalJustification(vJustification); + for (let v = 1; v <= 4; ++v) { + const stave = new Stave(10, (v - 1) * 150 + 40, 400).addClef('treble').setContext(ctx).draw(); + const notes = [ + staveNote({ keys: ['c/3'], duration: 'q', stem_direction: -1 }).addModifier(annotation('Text', 1, v), 0), + staveNote({ keys: ['c/4'], duration: 'q', stem_direction: -1 }).addModifier(annotation('Text', 2, v), 0), + staveNote({ keys: ['c/5'], duration: 'q', stem_direction: -1 }).addModifier(annotation('Text', 3, v), 0), + staveNote({ keys: ['c/6'], duration: 'q', stem_direction: -1 }).addModifier(annotation('Text', 4, v), 0), + ]; + Formatter.FormatAndDraw(ctx, stave, notes); + } + ok(true, 'Test Justification Annotation'); +} +function tabNotes(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 600, 200); + ctx.font = '10pt Arial, sans-serif'; + const stave = new TabStave(10, 10, 550); + stave.setContext(ctx); + stave.draw(); + const specs = [ + { + positions: [ + { str: 3, fret: 6 }, + { str: 4, fret: 25 }, + ], + duration: '8', + }, + { + positions: [ + { str: 2, fret: 10 }, + { str: 5, fret: 12 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 3, fret: 5 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 3, fret: 5 }, + ], + duration: '8', + }, + ]; + const notes1 = specs.map((noteSpec) => { + const note = new TabNote(noteSpec); + note.render_options.draw_stem = true; + return note; + }); + const notes2 = specs.map((noteSpec) => { + const note = new TabNote(noteSpec); + note.render_options.draw_stem = true; + note.setStemDirection(-1); + return note; + }); + const notes3 = specs.map((noteSpec) => new TabNote(noteSpec)); + notes1[0].addModifier(new Annotation('Text').setJustification(1).setVerticalJustification(1)); + notes1[1].addModifier(new Annotation('Text').setJustification(2).setVerticalJustification(2)); + notes1[2].addModifier(new Annotation('Text').setJustification(3).setVerticalJustification(3)); + notes1[3].addModifier(new Annotation('Text').setJustification(4).setVerticalJustification(4)); + notes2[0].addModifier(new Annotation('Text').setJustification(3).setVerticalJustification(1)); + notes2[1].addModifier(new Annotation('Text').setJustification(3).setVerticalJustification(2)); + notes2[2].addModifier(new Annotation('Text').setJustification(3).setVerticalJustification(3)); + notes2[3].addModifier(new Annotation('Text').setJustification(3).setVerticalJustification(4)); + notes3[0].addModifier(new Annotation('Text').setVerticalJustification(1)); + notes3[1].addModifier(new Annotation('Text').setVerticalJustification(2)); + notes3[2].addModifier(new Annotation('Text').setVerticalJustification(3)); + notes3[3].addModifier(new Annotation('Text').setVerticalJustification(4)); + const voice = new Voice(Flow.TIME4_4).setMode(Voice.Mode.SOFT); + voice.addTickables(notes1); + voice.addTickables(notes2); + voice.addTickables(notes3); + new Formatter().joinVoices([voice]).formatToStave([voice], stave, { stave }); + voice.draw(ctx, stave); + ok(true, 'TabNotes successfully drawn'); +} +VexFlowTests.register(AnnotationTests); +export { AnnotationTests }; diff --git a/build/esm/tests/articulation_tests.js b/build/esm/tests/articulation_tests.js new file mode 100644 index 0000000000..27a0330d76 --- /dev/null +++ b/build/esm/tests/articulation_tests.js @@ -0,0 +1,378 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Articulation } from '../src/articulation.js'; +import { Beam } from '../src/beam.js'; +import { Flow } from '../src/flow.js'; +import { Font } from '../src/font.js'; +import { Formatter } from '../src/formatter.js'; +import { ModifierPosition } from '../src/modifier.js'; +import { Stave } from '../src/stave.js'; +import { Barline } from '../src/stavebarline.js'; +import { StaveNote } from '../src/stavenote.js'; +import { Stem } from '../src/stem.js'; +import { TabNote } from '../src/tabnote.js'; +import { TabStave } from '../src/tabstave.js'; +import { Voice } from '../src/voice.js'; +const ArticulationTests = { + Start() { + QUnit.module('Articulation'); + const run = VexFlowTests.runTests; + run('Articulation - Vertical Placement', verticalPlacement); + run('Articulation - Staccato/Staccatissimo', drawArticulations, { sym1: 'a.', sym2: 'av' }); + run('Articulation - Accent/Tenuto', drawArticulations, { sym1: 'a>', sym2: 'a-' }); + run('Articulation - Marcato/L.H. Pizzicato', drawArticulations, { sym1: 'a^', sym2: 'a+' }); + run('Articulation - Snap Pizzicato/Fermata', drawArticulations, { sym1: 'ao', sym2: 'ao' }); + run('Articulation - Up-stroke/Down-Stroke', drawArticulations, { sym1: 'a|', sym2: 'am' }); + run('Articulation - Fermata Above/Below', drawFermata, { sym1: 'a@a', sym2: 'a@u' }); + run('Articulation - Inline/Multiple', drawArticulations2, { sym1: 'a.', sym2: 'a.' }); + run('TabNote Articulation', tabNotes, { sym1: 'a.', sym2: 'a.' }); + }, +}; +function drawArticulations(options) { + const sym1 = options.params.sym1; + const sym2 = options.params.sym2; + const width = 125 - Stave.defaultPadding; + const f = VexFlowTests.makeFactory(options, 675, 195); + const ctx = f.getContext(); + expect(0); + let x = 10; + const y = 30; + const score = f.EasyScore(); + const formatAndDrawToWidth = (x, y, width, notes, barline) => { + const voices = [score.voice(notes, { time: '4/4' })]; + const formatter = f.Formatter(); + voices.forEach((v) => formatter.joinVoices([v])); + const nwidth = Math.max(formatter.preCalculateMinTotalWidth(voices), width); + formatter.format(voices, nwidth); + const stave = f + .Stave({ x, y, width: nwidth + Stave.defaultPadding }) + .setEndBarType(barline) + .setContext(ctx) + .draw(); + voices.forEach((voice) => voice.draw(ctx, stave)); + return stave.getWidth(); + }; + const notesBar1 = [ + f.StaveNote({ keys: ['a/3'], duration: 'q', stem_direction: 1 }), + f.StaveNote({ keys: ['a/4'], duration: 'q', stem_direction: 1 }), + f.StaveNote({ keys: ['c/4'], duration: 'q', stem_direction: 1 }), + f.StaveNote({ keys: ['a/4'], duration: 'q', stem_direction: 1 }), + ]; + notesBar1[0].addModifier(new Articulation(sym1).setPosition(4), 0); + notesBar1[1].addModifier(new Articulation(sym1).setPosition(4), 0); + notesBar1[2].addModifier(new Articulation(sym1).setPosition(3), 0); + notesBar1[3].addModifier(new Articulation(sym1).setPosition(3), 0); + x += formatAndDrawToWidth(x, y, width, notesBar1, Barline.type.NONE); + const notesBar2 = [ + f.StaveNote({ keys: ['c/5'], duration: 'q', stem_direction: -1 }), + f.StaveNote({ keys: ['a/5'], duration: 'q', stem_direction: -1 }), + f.StaveNote({ keys: ['c/5'], duration: 'q', stem_direction: -1 }), + f.StaveNote({ keys: ['a/5'], duration: 'q', stem_direction: -1 }), + ]; + notesBar2[0].addModifier(new Articulation(sym1).setPosition(3), 0); + notesBar2[1].addModifier(new Articulation(sym1).setPosition(3), 0); + notesBar2[2].addModifier(new Articulation(sym1).setPosition(4), 0); + notesBar2[3].addModifier(new Articulation(sym1).setPosition(4), 0); + x += formatAndDrawToWidth(x, y, width, notesBar2, Barline.type.DOUBLE); + const notesBar3 = [ + f.StaveNote({ keys: ['c/4'], duration: 'q', stem_direction: 1 }), + f.StaveNote({ keys: ['c/5'], duration: 'q', stem_direction: 1 }), + f.StaveNote({ keys: ['c/4'], duration: 'q', stem_direction: 1 }), + f.StaveNote({ keys: ['a/4'], duration: 'q', stem_direction: 1 }), + ]; + notesBar3[0].addModifier(new Articulation(sym2).setPosition(4), 0); + notesBar3[1].addModifier(new Articulation(sym2).setPosition(4), 0); + notesBar3[2].addModifier(new Articulation(sym2).setPosition(3), 0); + notesBar3[3].addModifier(new Articulation(sym2).setPosition(3), 0); + x += formatAndDrawToWidth(x, y, width, notesBar3, Barline.type.NONE); + const notesBar4 = [ + f.StaveNote({ keys: ['a/4'], duration: 'q', stem_direction: -1 }), + f.StaveNote({ keys: ['a/5'], duration: 'q', stem_direction: -1 }), + f.StaveNote({ keys: ['c/5'], duration: 'q', stem_direction: -1 }), + f.StaveNote({ keys: ['a/5'], duration: 'q', stem_direction: -1 }), + ]; + notesBar4[0].addModifier(new Articulation(sym2).setPosition(3), 0); + notesBar4[1].addModifier(new Articulation(sym2).setPosition(3), 0); + notesBar4[2].addModifier(new Articulation(sym2).setPosition(4), 0); + notesBar4[3].addModifier(new Articulation(sym2).setPosition(4), 0); + formatAndDrawToWidth(x, y, width, notesBar4, Barline.type.END); +} +function drawFermata(options) { + const sym1 = options.params.sym1; + const sym2 = options.params.sym2; + const f = VexFlowTests.makeFactory(options, 400, 195); + const ctx = f.getContext(); + const score = f.EasyScore(); + const width = 150 - Stave.defaultPadding; + let x = 50; + const y = 30; + const formatAndDrawToWidth = (x, y, width, notes, barline) => { + const voices = [score.voice(notes, { time: '4/4' })]; + const formatter = f.Formatter(); + voices.forEach((v) => formatter.joinVoices([v])); + const nwidth = Math.max(formatter.preCalculateMinTotalWidth(voices), width); + formatter.format(voices, nwidth); + const stave = f + .Stave({ x, y, width: nwidth + Stave.defaultPadding }) + .setEndBarType(barline) + .setContext(ctx) + .draw(); + voices.forEach((voice) => voice.draw(ctx, stave)); + return stave.getWidth(); + }; + expect(0); + const notesBar1 = [ + f.StaveNote({ keys: ['c/4'], duration: 'q', stem_direction: 1 }), + f.StaveNote({ keys: ['a/4'], duration: 'q', stem_direction: 1 }), + f.StaveNote({ keys: ['c/4'], duration: 'q', stem_direction: -1 }), + f.StaveNote({ keys: ['a/4'], duration: 'q', stem_direction: -1 }), + ]; + notesBar1[0].addModifier(new Articulation(sym1).setPosition(3), 0); + notesBar1[1].addModifier(new Articulation(sym1).setPosition(3), 0); + notesBar1[2].addModifier(new Articulation(sym2).setPosition(4), 0); + notesBar1[3].addModifier(new Articulation(sym2).setPosition(4), 0); + x += formatAndDrawToWidth(x, y, width, notesBar1, Barline.type.NONE); + const notesBar2 = [ + f.StaveNote({ keys: ['c/5'], duration: 'q', stem_direction: 1 }), + f.StaveNote({ keys: ['a/5'], duration: 'q', stem_direction: 1 }), + f.StaveNote({ keys: ['c/5'], duration: 'q', stem_direction: -1 }), + f.StaveNote({ keys: ['a/5'], duration: 'q', stem_direction: -1 }), + ]; + notesBar2[0].addModifier(new Articulation(sym1).setPosition(3), 0); + notesBar2[1].addModifier(new Articulation(sym1).setPosition(3), 0); + notesBar2[2].addModifier(new Articulation(sym2).setPosition(4), 0); + notesBar2[3].addModifier(new Articulation(sym2).setPosition(4), 0); + formatAndDrawToWidth(x, y, width, notesBar2, Barline.type.DOUBLE); +} +function verticalPlacement(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 750, 300); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + const staveNote = (noteStruct) => new StaveNote(noteStruct); + const stave = new Stave(10, 50, 750).addClef('treble').setContext(ctx).draw(); + const notes = [ + staveNote({ keys: ['f/4'], duration: 'q' }) + .addModifier(new Articulation('a@u').setPosition(ModifierPosition.BELOW), 0) + .addModifier(new Articulation('a.').setPosition(ModifierPosition.BELOW), 0) + .addModifier(new Articulation('a-').setPosition(ModifierPosition.BELOW), 0), + staveNote({ keys: ['g/4'], duration: 'q', stem_direction: Stem.DOWN }) + .addModifier(new Articulation('a@u').setPosition(ModifierPosition.BELOW), 0) + .addModifier(new Articulation('a.').setPosition(ModifierPosition.BELOW), 0) + .addModifier(new Articulation('a-').setPosition(ModifierPosition.BELOW), 0), + staveNote({ keys: ['c/5'], duration: 'q' }) + .addModifier(new Articulation('a@u').setPosition(ModifierPosition.BELOW), 0) + .addModifier(new Articulation('a.').setPosition(ModifierPosition.BELOW), 0) + .addModifier(new Articulation('a-').setPosition(ModifierPosition.BELOW), 0), + staveNote({ keys: ['f/4'], duration: 'q' }) + .addModifier(new Articulation('a.').setPosition(ModifierPosition.BELOW), 0) + .addModifier(new Articulation('a-').setPosition(ModifierPosition.BELOW), 0) + .addModifier(new Articulation('a@u').setPosition(ModifierPosition.BELOW), 0), + staveNote({ keys: ['g/4'], duration: 'q', stem_direction: Stem.DOWN }) + .addModifier(new Articulation('a.').setPosition(ModifierPosition.BELOW), 0) + .addModifier(new Articulation('a-').setPosition(ModifierPosition.BELOW), 0) + .addModifier(new Articulation('a@u').setPosition(ModifierPosition.BELOW), 0), + staveNote({ keys: ['c/5'], duration: 'q' }) + .addModifier(new Articulation('a.').setPosition(ModifierPosition.BELOW), 0) + .addModifier(new Articulation('a-').setPosition(ModifierPosition.BELOW), 0) + .addModifier(new Articulation('a@u').setPosition(ModifierPosition.BELOW), 0), + staveNote({ keys: ['a/5'], duration: 'q', stem_direction: Stem.DOWN }) + .addModifier(new Articulation('a@a').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(new Articulation('a.').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(new Articulation('a-').setPosition(ModifierPosition.ABOVE), 0), + staveNote({ keys: ['f/5'], duration: 'q' }) + .addModifier(new Articulation('a@a').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(new Articulation('a.').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(new Articulation('a-').setPosition(ModifierPosition.ABOVE), 0), + staveNote({ keys: ['b/4'], duration: 'q', stem_direction: Stem.DOWN }) + .addModifier(new Articulation('a@a').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(new Articulation('a.').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(new Articulation('a-').setPosition(ModifierPosition.ABOVE), 0), + staveNote({ keys: ['a/5'], duration: 'q', stem_direction: Stem.DOWN }) + .addModifier(new Articulation('a.').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(new Articulation('a-').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(new Articulation('a@a').setPosition(ModifierPosition.ABOVE), 0), + staveNote({ keys: ['f/5'], duration: 'q' }) + .addModifier(new Articulation('a.').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(new Articulation('a-').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(new Articulation('a@a').setPosition(ModifierPosition.ABOVE), 0), + staveNote({ keys: ['b/4'], duration: 'q', stem_direction: Stem.DOWN }) + .addModifier(new Articulation('a.').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(new Articulation('a-').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(new Articulation('a@a').setPosition(ModifierPosition.ABOVE), 0), + ]; + Formatter.FormatAndDraw(ctx, stave, notes); + ok(true, ' Annotation Placement'); +} +function drawArticulations2(options) { + expect(0); + const scale = 0.8; + let x = 10; + const y = 30; + const width = 350 - Stave.defaultPadding; + const f = VexFlowTests.makeFactory(options, 1000, 195); + const ctx = f.getContext(); + ctx.scale(scale, scale); + const score = f.EasyScore(); + const formatAndDrawToWidth = (x, y, width, notes, barline, beams) => { + const voices = [score.voice(notes, { time: '4/4' })]; + const formatter = f.Formatter(); + voices.forEach((v) => formatter.joinVoices([v])); + const nwidth = Math.max(formatter.preCalculateMinTotalWidth(voices), width); + formatter.format(voices, nwidth); + const stave = f + .Stave({ x: x, y: y, width: nwidth + Stave.defaultPadding }) + .setEndBarType(barline) + .setContext(ctx) + .draw(); + voices.forEach((voice) => voice.draw(ctx, stave)); + beams.forEach((beam) => beam.setContext(ctx).draw()); + return stave.getWidth(); + }; + const notesBar1 = [ + f.StaveNote({ keys: ['c/4'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['d/4'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['e/4'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['f/4'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['g/4'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['a/4'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['b/4'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['c/5'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['d/5'], duration: '16', stem_direction: -1 }), + f.StaveNote({ keys: ['e/5'], duration: '16', stem_direction: -1 }), + f.StaveNote({ keys: ['f/5'], duration: '16', stem_direction: -1 }), + f.StaveNote({ keys: ['g/5'], duration: '16', stem_direction: -1 }), + f.StaveNote({ keys: ['a/5'], duration: '16', stem_direction: -1 }), + f.StaveNote({ keys: ['b/5'], duration: '16', stem_direction: -1 }), + f.StaveNote({ keys: ['c/6'], duration: '16', stem_direction: -1 }), + f.StaveNote({ keys: ['d/6'], duration: '16', stem_direction: -1 }), + ]; + let i; + for (i = 0; i < 16; i++) { + notesBar1[i].addModifier(new Articulation('a.').setPosition(4), 0); + notesBar1[i].addModifier(new Articulation('a>').setPosition(4), 0); + if (i === 15) { + notesBar1[i].addModifier(new Articulation('a@u').setPosition(4), 0); + } + } + const beam1 = new Beam(notesBar1.slice(0, 8)); + const beam2 = new Beam(notesBar1.slice(8, 16)); + x += formatAndDrawToWidth(x, y, width, notesBar1, Barline.type.NONE, [beam1, beam2]); + beam1.setContext(ctx).draw(); + beam2.setContext(ctx).draw(); + const notesBar2 = [ + f.StaveNote({ keys: ['f/3'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['g/3'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['a/3'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['b/3'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['c/4'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['d/4'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['e/4'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['f/4'], duration: '16', stem_direction: 1 }), + f.StaveNote({ keys: ['g/4'], duration: '16', stem_direction: -1 }), + f.StaveNote({ keys: ['a/4'], duration: '16', stem_direction: -1 }), + f.StaveNote({ keys: ['b/4'], duration: '16', stem_direction: -1 }), + f.StaveNote({ keys: ['c/5'], duration: '16', stem_direction: -1 }), + f.StaveNote({ keys: ['d/5'], duration: '16', stem_direction: -1 }), + f.StaveNote({ keys: ['e/5'], duration: '16', stem_direction: -1 }), + f.StaveNote({ keys: ['f/5'], duration: '16', stem_direction: -1 }), + f.StaveNote({ keys: ['g/5'], duration: '16', stem_direction: -1 }), + ]; + for (i = 0; i < 16; i++) { + notesBar2[i].addModifier(new Articulation('a-').setPosition(3), 0); + notesBar2[i].addModifier(new Articulation('a^').setPosition(3), 0); + if (i === 15) { + notesBar2[i].addModifier(new Articulation('a@u').setPosition(4), 0); + } + } + const beam3 = new Beam(notesBar2.slice(0, 8)); + const beam4 = new Beam(notesBar2.slice(8, 16)); + x += formatAndDrawToWidth(x, y, width, notesBar2, Barline.type.NONE, [beam3, beam4]); + const notesBar3 = [f.StaveNote({ keys: ['c/4'], duration: 'w', stem_direction: 1 })]; + notesBar3[0].addModifier(new Articulation('a-').setPosition(3), 0); + notesBar3[0].addModifier(new Articulation('a>').setPosition(3), 0); + notesBar3[0].addModifier(new Articulation('a@a').setPosition(3), 0); + x += formatAndDrawToWidth(x, y, width, notesBar3, Barline.type.NONE, []); + const notesBar4 = [ + f.StaveNote({ keys: ['c/5'], duration: 'q', stem_direction: -1 }), + f.StaveNote({ keys: ['a/5'], duration: 'q', stem_direction: -1 }), + f.StaveNote({ keys: ['c/5'], duration: 'q', stem_direction: -1 }), + f.StaveNote({ keys: ['a/5'], duration: 'q', stem_direction: -1 }), + ]; + for (i = 0; i < 4; i++) { + let position1 = 3; + if (i > 1) { + position1 = 4; + } + notesBar4[i].addModifier(new Articulation('a-').setPosition(position1), 0); + } + formatAndDrawToWidth(x, y, width, notesBar4, Barline.type.END, []); +} +function tabNotes(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 600, 200); + ctx.font = '10pt ' + Font.SANS_SERIF; + const stave = new TabStave(10, 10, 550); + stave.setContext(ctx); + stave.draw(); + const specs = [ + { + positions: [ + { str: 3, fret: 6 }, + { str: 4, fret: 25 }, + ], + duration: '8', + }, + { + positions: [ + { str: 2, fret: 10 }, + { str: 5, fret: 12 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 3, fret: 5 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 3, fret: 5 }, + ], + duration: '8', + }, + ]; + const notes1 = specs.map((noteSpec) => { + const tabNote = new TabNote(noteSpec); + tabNote.render_options.draw_stem = true; + return tabNote; + }); + const notes2 = specs.map((noteSpec) => { + const tabNote = new TabNote(noteSpec); + tabNote.render_options.draw_stem = true; + tabNote.setStemDirection(-1); + return tabNote; + }); + const notes3 = specs.map((noteSpec) => new TabNote(noteSpec)); + notes1[0].addModifier(new Articulation('a>').setPosition(3), 0); + notes1[1].addModifier(new Articulation('a>').setPosition(4), 0); + notes1[2].addModifier(new Articulation('a.').setPosition(3), 0); + notes1[3].addModifier(new Articulation('a.').setPosition(4), 0); + notes2[0].addModifier(new Articulation('a>').setPosition(3), 0); + notes2[1].addModifier(new Articulation('a>').setPosition(4), 0); + notes2[2].addModifier(new Articulation('a.').setPosition(3), 0); + notes2[3].addModifier(new Articulation('a.').setPosition(4), 0); + notes3[0].addModifier(new Articulation('a>').setPosition(3), 0); + notes3[1].addModifier(new Articulation('a>').setPosition(4), 0); + notes3[2].addModifier(new Articulation('a.').setPosition(3), 0); + notes3[3].addModifier(new Articulation('a.').setPosition(4), 0); + const voice = new Voice(Flow.TIME4_4).setMode(Voice.Mode.SOFT); + voice.addTickables(notes1); + voice.addTickables(notes2); + voice.addTickables(notes3); + new Formatter().joinVoices([voice]).formatToStave([voice], stave); + voice.draw(ctx, stave); + ok(true, 'TabNotes successfully drawn'); +} +VexFlowTests.register(ArticulationTests); +export { ArticulationTests }; diff --git a/build/esm/tests/auto_beam_formatting_tests.js b/build/esm/tests/auto_beam_formatting_tests.js new file mode 100644 index 0000000000..e6daf36ab8 --- /dev/null +++ b/build/esm/tests/auto_beam_formatting_tests.js @@ -0,0 +1,548 @@ +import { concat, VexFlowTests } from './vexflow_test_helpers.js'; +import { Beam } from '../src/beam.js'; +import { Fraction } from '../src/fraction.js'; +import { Stem } from '../src/stem.js'; +const AutoBeamFormattingTests = { + Start() { + QUnit.module('Auto-Beaming'); + const run = VexFlowTests.runTests; + run('Simple Auto Beaming', simpleAuto); + run('Auto Beaming With Overflow Group', simpleAutoWithOverflowGroup); + run('Even Group Stem Directions', evenGroupStemDirections); + run('Odd Group Stem Directions', oddGroupStemDirections); + run('Odd Beam Groups Auto Beaming', oddBeamGroups); + run('More Simple Auto Beaming 0', moreSimple0); + run('More Simple Auto Beaming 1', moreSimple1); + run('Beam Across All Rests', beamAcrossAllRests); + run('Beam Across All Rests with Stemlets', beamAcrossAllRestsWithStemlets); + run('Break Beams on Middle Rests Only', beamAcrossMiddleRests); + run('Break Beams on Rest', breakBeamsOnRests); + run('Maintain Stem Directions', maintainStemDirections); + run('Maintain Stem Directions - Beam Over Rests', maintainStemDirectionsBeamAcrossRests); + run('Beat group with unbeamable note - 2/2', groupWithUnbeamableNote); + run('Offset beat grouping - 6/8 ', groupWithUnbeamableNote1); + run('Odd Time - Guessing Default Beam Groups', autoOddBeamGroups); + run('Custom Beam Groups', customBeamGroups); + run('Simple Tuplet Auto Beaming', simpleTuplets); + run('More Simple Tuplet Auto Beaming', moreSimpleTuplets); + run('More Automatic Beaming', moreBeaming); + run('Automatic Beaming 4/4 with 3, 3, 2 Pattern', beamingWithSeveralGroups1); + run('Automatic Beaming 4/4 with 3, 3, 2 Pattern and Overflow', beamingWithSeveralGroupsOverflow); + run('Automatic Beaming 8/4 with 3, 2, 3 Pattern and 2 Overflows', beamingWithSeveralGroupsOverflow2); + run('Automatic Beaming 8/4 with 3, 2, 3 Pattern and 3 Overflows', beamingWithSeveralGroupsOverflow3); + run('Duration-Based Secondary Beam Breaks', secondaryBreaks1); + run('Duration-Based Secondary Beam Breaks 2', secondaryBreaks2); + run('Flat Beams Up', flatBeamsUp); + run('Flat Beams Down', flatBeamsDown); + run('Flat Beams Mixed Direction', flatBeamsMixed); + run('Flat Beams Up (uniform)', flatBeamsUpUniform); + run('Flat Beams Down (uniform)', flatBeamsDownUniform); + run('Flat Beams Up Bounds', flatBeamsUpBounds); + run('Flat Beams Down Bounds', flatBeamsDownBounds); + }, +}; +function simpleAuto(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('f5/8, e5, d5, c5/16, c5, d5/8, e5, f5, f5/32, f5, f5, f5'), { time: '4/4' }); + const beams = Beam.applyAndGetBeams(voice); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beaming Applicator Test'); +} +function simpleAutoWithOverflowGroup(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('f5/4., e5/8, d5/8, d5/16, c5/16, c5/16, c5/16, f5/16, f5/32, f5/32'), { + time: '4/4', + }); + const beams = Beam.applyAndGetBeams(voice); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beaming Applicator Test'); +} +function evenGroupStemDirections(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('a4/8, b4, g4, c5, f4, d5, e4, e5, b4, b4, g4, d5'), { time: '6/4' }); + const beams = Beam.applyAndGetBeams(voice); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + equal(beams[0].getStemDirection(), Stem.UP); + equal(beams[1].getStemDirection(), Stem.UP); + equal(beams[2].getStemDirection(), Stem.UP); + equal(beams[3].getStemDirection(), Stem.UP); + equal(beams[4].getStemDirection(), Stem.DOWN); + equal(beams[5].getStemDirection(), Stem.DOWN); + ok(true, 'Auto Beaming Applicator Test'); +} +function oddGroupStemDirections(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('g4/8, b4, d5, c5, f4, d5, e4, g5, g4, b4, g4, d5, a4, c5, a4'), { + time: '15/8', + }); + const groups = [new Fraction(3, 8)]; + const beams = Beam.applyAndGetBeams(voice, undefined, groups); + equal(beams[0].getStemDirection(), Stem.DOWN, 'Notes are equidistant from middle line'); + equal(beams[1].getStemDirection(), Stem.DOWN); + equal(beams[2].getStemDirection(), Stem.UP); + equal(beams[3].getStemDirection(), Stem.DOWN, 'Notes are equidistant from middle line'); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beaming Applicator Test'); +} +function oddBeamGroups(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('f5, e5, d5, c5, c5, d5, e5, f5, f5, f4, f3, f5/16, f5'), { time: '6/4' }); + const groups = [new Fraction(2, 8), new Fraction(3, 8), new Fraction(1, 8)]; + const beams = Beam.applyAndGetBeams(voice, undefined, groups); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function moreSimple0(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('c4/8, g4, c5, g5, a5, c4, d4, a5'), { time: '4/4' }); + const beams = Beam.applyAndGetBeams(voice); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function moreSimple1(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('c5/16, g5, c5, c5/r, c5/r, (c4 e4 g4), d4, a5, c4, g4, c5, b4/r, (c4 e4), b4/r, b4/r, a4'), { time: '4/4' }); + const beams = Beam.applyAndGetBeams(voice); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function breakBeamsOnRests(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('c5/16, g5, c5, c5/r, c5/r, (c4 e4 g4), d4, a5, c4, g4, c5, b4/r, (c4 e4), b4/r, b4/r, a4'), { time: '4/4' }); + const beams = Beam.generateBeams(voice.getTickables(), { + beam_rests: false, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function beamAcrossAllRestsWithStemlets(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('c5/16, g5, c5, c5/r, c5/r, (c4 e4 g4), d4, a5, c4, g4, c5, b4/r, (c4 e4), b4/r, b4/r, a4'), { time: '4/4' }); + const beams = Beam.generateBeams(voice.getTickables(), { + beam_rests: true, + show_stemlets: true, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function beamAcrossAllRests(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('c5/16, g5, c5, c5/r, c5/r, (c4 e4 g4), d4, a5, c4, g4, c5, b4/r, (c4 e4), b4/r, b4/r, a4'), { time: '4/4' }); + const beams = Beam.generateBeams(voice.getTickables(), { + beam_rests: true, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function beamAcrossMiddleRests(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('c5/16, g5, c5, c5/r, c5/r, (c4 e4 g4), d4, a5, c4, g4, c5, b4/r, (c4 e4), b4/r, b4/r, a4'), { time: '4/4' }); + const beams = Beam.generateBeams(voice.getTickables(), { + beam_rests: true, + beam_middle_only: true, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function maintainStemDirections(options) { + const f = VexFlowTests.makeFactory(options, 450, 200); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes([ + 'b4/16, b4, b4[stem="down"], b4/r', + 'b4/r, b4[stem="down"], b4, b4', + 'b4[stem="down"], b4[stem="down"], b4, b4/r', + 'b4/32, b4[stem="down"], b4[stem="down"], b4, b4/16/r, b4', + ].join(', '), { stem: 'up' }), { time: '4/4' }); + const beams = Beam.generateBeams(voice.getTickables(), { + beam_rests: false, + maintain_stem_directions: true, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function maintainStemDirectionsBeamAcrossRests(options) { + const f = VexFlowTests.makeFactory(options, 450, 200); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes([ + 'b4/16, b4, b4[stem="down"], b4/r', + 'b4/r, b4[stem="down"], b4, b4', + 'b4[stem="down"], b4[stem="down"], b4, b4/r', + 'b4/32, b4[stem="down"], b4[stem="down"], b4, b4/16/r, b4', + ].join(', '), { stem: 'up' }), { time: '4/4' }); + const beams = Beam.generateBeams(voice.getTickables(), { + beam_rests: true, + maintain_stem_directions: true, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function groupWithUnbeamableNote(options) { + const f = VexFlowTests.makeFactory(options, 450, 200); + const stave = f.Stave().addTimeSignature('2/4'); + const score = f.EasyScore(); + const voice = score.voice(score.notes('b4/16, b4, b4/4, b4/16, b4'), { time: '2/4' }); + const beams = Beam.generateBeams(voice.getTickables(), { + groups: [new Fraction(2, 2)], + beam_rests: false, + maintain_stem_directions: true, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function groupWithUnbeamableNote1(options) { + const f = VexFlowTests.makeFactory(options, 450, 200); + const stave = f.Stave().addTimeSignature('6/8'); + const score = f.EasyScore(); + const voice = score.voice(score.notes('b4/4, b4/4, b4/8, b4/8'), { time: '6/8' }); + const beams = Beam.generateBeams(voice.getTickables(), { + groups: [new Fraction(3, 8)], + beam_rests: false, + maintain_stem_directions: true, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function autoOddBeamGroups(options) { + const f = VexFlowTests.makeFactory(options, 450, 400); + const score = f.EasyScore(); + const stave1 = f.Stave({ y: 10 }).addTimeSignature('5/4'); + const voice1 = score.voice(score.notes('c5/8, g5, c5, b4, b4, c4, d4, a5, c4, g4'), { time: '5/4' }); + const stave2 = f.Stave({ y: 150 }).addTimeSignature('5/8'); + const voice2 = score.voice(score.notes('c5/8, g5, c5, b4, b4'), { time: '5/8' }); + const stave3 = f.Stave({ y: 290 }).addTimeSignature('13/16'); + const voice3 = score.voice(score.notes('c5/16, g5, c5, b4, b4, c5, g5, c5, b4, b4, c5, b4, b4'), { + time: '13/16', + }); + const beams = [ + ...Beam.applyAndGetBeams(voice1, undefined, Beam.getDefaultBeamGroups('5/4')), + ...Beam.applyAndGetBeams(voice2, undefined, Beam.getDefaultBeamGroups('5/8')), + ...Beam.applyAndGetBeams(voice3, undefined, Beam.getDefaultBeamGroups('13/16')), + ]; + f.Formatter().formatToStave([voice1], stave1).formatToStave([voice2], stave2).formatToStave([voice3], stave3); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function customBeamGroups(options) { + const f = VexFlowTests.makeFactory(options, 450, 400); + const score = f.EasyScore(); + const stave1 = f.Stave({ y: 10 }).addTimeSignature('5/4'); + const voice1 = score.voice(score.notes('c5/8, g5, c5, b4, b4, c4, d4, a5, c4, g4'), { time: '5/4' }); + const stave2 = f.Stave({ y: 150 }).addTimeSignature('5/8'); + const voice2 = score.voice(score.notes('c5/8, g5, c5, b4, b4'), { time: '5/8' }); + const stave3 = f.Stave({ y: 290 }).addTimeSignature('13/16'); + const voice3 = score.voice(score.notes('c5/16, g5, c5, b4, b4, c5, g5, c5, b4, b4, c5, b4, b4'), { time: '13/16' }); + const group1 = [new Fraction(5, 8)]; + const group2 = [new Fraction(3, 8), new Fraction(2, 8)]; + const group3 = [new Fraction(7, 16), new Fraction(2, 16), new Fraction(4, 16)]; + const beams = [ + ...Beam.applyAndGetBeams(voice1, undefined, group1), + ...Beam.applyAndGetBeams(voice2, undefined, group2), + ...Beam.applyAndGetBeams(voice3, undefined, group3), + ]; + f.Formatter().formatToStave([voice1], stave1).formatToStave([voice2], stave2).formatToStave([voice3], stave3); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function createShortcuts(score) { + return { + notes: score.notes.bind(score), + tuplet: score.tuplet.bind(score), + }; +} +function simpleTuplets(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const { notes, tuplet } = createShortcuts(score); + const voice = score.voice([ + ...tuplet(notes('c4/8, g4, c5')), + ...notes('g5/8, a5'), + ...tuplet(notes('a5/16, (c5 e5), a5, d5, a5'), { ratioed: false, notes_occupied: 4 }), + ], { time: '3/4' }); + const beams = Beam.applyAndGetBeams(voice); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function moreSimpleTuplets(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const { notes, tuplet } = createShortcuts(score); + const voice = score.voice([...tuplet(notes('d4/4, g4, c5')), ...notes('g5/16, a5, a5, (c5 e5)')], { time: '3/4' }); + const beams = Beam.applyAndGetBeams(voice); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function moreBeaming(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('c4/8, g4/4, c5/8., g5/16, a5/4, a5/16, (c5 e5)/16, a5/8'), { time: '9/8' }); + const beams = Beam.applyAndGetBeams(voice, undefined, Beam.getDefaultBeamGroups('9/8')); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function beamingWithSeveralGroups1(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('c4/8, g4/4, c5/8, g5, a5, a5, f5'), { time: '4/4' }); + const beams = Beam.applyAndGetBeams(voice, undefined, [new Fraction(3, 8), new Fraction(3, 8), new Fraction(2, 8)]); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function beamingWithSeveralGroupsOverflow(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('c4/8, g4/4., c5/8, g5, a5, a5'), { time: '4/4' }); + const beams = Beam.applyAndGetBeams(voice, undefined, [new Fraction(3, 8), new Fraction(3, 8), new Fraction(2, 8)]); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function beamingWithSeveralGroupsOverflow2(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('c4/16, g4/2, f4/16, c5/8, a4/16, c4/16, g4/8, b4, c5, g5, f5, e5, c5, a4/4'), { + time: '8/4', + }); + const beams = Beam.applyAndGetBeams(voice, undefined, [new Fraction(3, 8), new Fraction(2, 8), new Fraction(3, 8)]); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function beamingWithSeveralGroupsOverflow3(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('c4/16, g4/1, f4/16, c5/8, g5, f5, e5, c5, a4/4'), { time: '8/4' }); + const beams = Beam.applyAndGetBeams(voice, undefined, [new Fraction(3, 8), new Fraction(2, 8), new Fraction(3, 8)]); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Auto Beam Applicator Test'); +} +function secondaryBreaks1(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes([ + 'f5/32, f5, f5, f5, f5/16., f5/32', + 'f5/16, f5/8, f5/16', + 'f5/32, f5/16., f5., f5/32', + 'f5/16., f5/32, f5, f5/16.', + ].join(','))); + const beams = Beam.generateBeams(voice.getTickables(), { secondary_breaks: '8' }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Duration-Based Secondary Breaks Test'); +} +function secondaryBreaks2(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const { notes, tuplet } = createShortcuts(score); + const voice = score.voice([ + tuplet(notes('e5/16, f5, f5')), + tuplet(notes('f5/16, f5, c5')), + notes('a4/16., f4/32'), + tuplet(notes('d4/16, d4, d4')), + tuplet(notes('a5/8, (e5 g5), a5')), + tuplet(notes('f5/16, f5, f5')), + tuplet(notes('f5/16, f5, a4')), + ].reduce(concat)); + const beams = Beam.generateBeams(voice.getTickables(), { secondary_breaks: '8' }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Duration-Based Secondary Breaks Test'); +} +function flatBeamsUp(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave({ y: 40 }); + const score = f.EasyScore(); + const { notes, tuplet } = createShortcuts(score); + const voice = score.voice([ + tuplet(notes('c4/8, g4, f5')), + notes('d5/8'), + tuplet(notes('c5/16, (c4 e4 g4), f4')), + notes('d5/8, e5, c4, f5/32, f5, f5, f5'), + ].reduce(concat)); + const beams = Beam.generateBeams(voice.getTickables(), { + flat_beams: true, + stem_direction: 1, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Flat Beams Up Test'); +} +function flatBeamsDown(options) { + const f = VexFlowTests.makeFactory(options, 450, 200); + const stave = f.Stave({ y: 40 }); + const score = f.EasyScore(); + const voice = score.voice(score.notes('c5/64, c5, c5, c5, c5, c5, c5, c5, a5/8, g5, (d4 f4 a4)/16, d4, d5/8, e5, g5, a6/32, a6, a6, g4/64, g4')); + const beams = Beam.generateBeams(voice.getTickables(), { + flat_beams: true, + stem_direction: -1, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Flat Beams Down Test'); +} +function flatBeamsMixed(options) { + const f = VexFlowTests.makeFactory(options, 450, 200); + const stave = f.Stave({ y: 40 }); + const score = f.EasyScore(); + const voice = score.voice(score.notes('c5/64, d5, e5, c5, f5, c5, a5, c5, a5/8, g5, (d4 f4 a4)/16, d4, d5/8, e5, c4, a4/32, a4, a4, g4/64, g4')); + const beams = Beam.generateBeams(voice.getTickables(), { flat_beams: true }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Flat Beams Mixed Direction Test'); +} +function flatBeamsUpUniform(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave({ y: 40 }); + const score = f.EasyScore(); + const { notes, tuplet } = createShortcuts(score); + const voice = score.voice([ + ...tuplet(notes('c4/8, g4, g5')), + ...notes('d5/8, c5/16, (c4 e4 g4), d5/8, e5, c4, f5/32, f5, f5, f5'), + ]); + const beams = Beam.generateBeams(voice.getTickables(), { + flat_beams: true, + flat_beam_offset: 50, + stem_direction: 1, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Flat Beams Up (uniform) Test'); +} +function flatBeamsDownUniform(options) { + const f = VexFlowTests.makeFactory(options, 450, 200); + const stave = f.Stave({ y: 40 }); + const score = f.EasyScore(); + const voice = score.voice(score.notes('c5/64, c5, c5, c5, c5, c5, c5, c5, a5/8, g5, (e4 g4 b4)/16, e5, d5/8, e5/8, g5/8, a6/32, a6, a6, g4/64, g4')); + const beams = Beam.generateBeams(voice.getTickables(), { + flat_beams: true, + flat_beam_offset: 155, + stem_direction: -1, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Flat Beams Down (uniform) Test'); +} +function flatBeamsUpBounds(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave({ y: 40 }); + const score = f.EasyScore(); + const { notes, tuplet } = createShortcuts(score); + const voice = score.voice([ + ...tuplet(notes('c4/8, g4/8, g5/8')), + ...notes('d5/8, c5/16, (c4 e4 g4)/16, d5/8, e5/8, c4/8, f5/32, f5/32, f5/32, f5/32'), + ]); + const beams = Beam.generateBeams(voice.getTickables(), { + flat_beams: true, + flat_beam_offset: 60, + stem_direction: 1, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Flat Beams Up (uniform) Test'); +} +function flatBeamsDownBounds(options) { + const f = VexFlowTests.makeFactory(options, 450, 200); + const stave = f.Stave({ y: 40 }); + const score = f.EasyScore(); + const voice = score.voice(score.notes([ + 'g5/8, a6/32, a6/32, a6/32, g4/64, g4/64', + 'c5/64, c5/64, c5/64, c5/64, c5/64, c5/64, c5/64, c5/64, a5/8', + 'g5/8, (e4 g4 b4)/16, e5/16', + 'd5/8, e5/8', + ].join(','), { stem: 'down' })); + const beams = Beam.generateBeams(voice.getTickables(), { + flat_beams: true, + flat_beam_offset: 145, + stem_direction: -1, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'Flat Beams Down (uniform) Test'); +} +VexFlowTests.register(AutoBeamFormattingTests); +export { AutoBeamFormattingTests }; diff --git a/build/esm/tests/bach_tests.js b/build/esm/tests/bach_tests.js new file mode 100644 index 0000000000..857789e1a3 --- /dev/null +++ b/build/esm/tests/bach_tests.js @@ -0,0 +1,335 @@ +import { concat, VexFlowTests } from './vexflow_test_helpers.js'; +import { BarlineType, Registry } from '../src/index.js'; +const BachDemoTests = { + Start() { + QUnit.module('Bach Demo'); + VexFlowTests.runTests('Minuet 1', minuet1); + }, +}; +function minuet1(options) { + const registry = new Registry(); + Registry.enableDefaultRegistry(registry); + const id = (id) => registry.getElementById(id); + const f = VexFlowTests.makeFactory(options, 1100, 900); + const score = f.EasyScore({ throwOnError: true }); + const voice = score.voice.bind(score); + const notes = score.notes.bind(score); + const beam = score.beam.bind(score); + let x = 120; + let y = 80; + function appendSystem(width) { + const system = f.System({ x, y, width, spaceBetweenStaves: 10 }); + x += width; + return system; + } + score.set({ time: '3/4' }); + let system = appendSystem(220); + system + .addStave({ + voices: [ + voice([notes('D5/q[id="m1a"]'), beam(notes('G4/8, A4, B4, C5', { stem: 'up' }))].reduce(concat)), + voice([f.TextDynamics({ text: 'p', duration: 'h', dots: 1, line: 9 })]), + ], + }) + .addClef('treble') + .addKeySignature('G') + .addTimeSignature('3/4') + .setTempo({ name: 'Allegretto', duration: 'h', dots: 1, bpm: 66 }, -30); + system + .addStave({ voices: [voice(notes('(G3 B3 D4)/h, A3/q', { clef: 'bass' }))] }) + .addClef('bass') + .addKeySignature('G') + .addTimeSignature('3/4'); + system.addConnector('brace'); + system.addConnector('singleRight'); + system.addConnector('singleLeft'); + id('m1a').addModifier(f.Fingering({ number: '5' }), 0); + system = appendSystem(150); + system.addStave({ voices: [voice(notes('D5/q[id="m2a"], G4[id="m2b"], G4[id="m2c"]'))] }); + system.addStave({ voices: [voice(notes('B3/h.', { clef: 'bass' }))] }); + system.addConnector('singleRight'); + id('m2a').addModifier(f.Articulation({ type: 'a.', position: 'above' }), 0); + id('m2b').addModifier(f.Articulation({ type: 'a.', position: 'below' }), 0); + id('m2c').addModifier(f.Articulation({ type: 'a.', position: 'below' }), 0); + f.Curve({ + from: id('m1a'), + to: id('m2a'), + options: { + cps: [ + { x: 0, y: 40 }, + { x: 0, y: 40 }, + ], + }, + }); + system = appendSystem(150); + system.addStave({ + voices: [voice([notes('E5/q[id="m3a"]'), beam(notes('C5/8, D5, E5, F5', { stem: 'down' }))].reduce(concat))], + }); + id('m3a').addModifier(f.Fingering({ number: '3', position: 'above' }), 0); + system.addStave({ voices: [voice(notes('C4/h.', { clef: 'bass' }))] }); + system.addConnector('singleRight'); + system = appendSystem(150); + system.addStave({ voices: [voice(notes('G5/q[id="m4a"], G4[id="m4b"], G4[id="m4c"]'))] }); + system.addStave({ voices: [voice(notes('B3/h.', { clef: 'bass' }))] }); + system.addConnector('singleRight'); + id('m4a').addModifier(f.Articulation({ type: 'a.', position: 'above' }), 0); + id('m4b').addModifier(f.Articulation({ type: 'a.', position: 'below' }), 0); + id('m4c').addModifier(f.Articulation({ type: 'a.', position: 'below' }), 0); + f.Curve({ + from: id('m3a'), + to: id('m4a'), + options: { + cps: [ + { x: 0, y: 20 }, + { x: 0, y: 20 }, + ], + }, + }); + system = appendSystem(150); + system.addStave({ + voices: [voice([notes('C5/q[id="m5a"]'), beam(notes('D5/8, C5, B4, A4', { stem: 'down' }))].reduce(concat))], + }); + id('m5a').addModifier(f.Fingering({ number: '4', position: 'above' }), 0); + system.addStave({ voices: [voice(notes('A3/h.', { clef: 'bass' }))] }); + system.addConnector('singleRight'); + system = appendSystem(150); + system.addStave({ + voices: [voice([notes('B4/q'), beam(notes('C5/8, B4, A4, G4[id="m6a"]', { stem: 'up' }))].reduce(concat))], + }); + system.addStave({ voices: [voice(notes('G3/h.', { clef: 'bass' }))] }); + system.addConnector('singleRight'); + f.Curve({ + from: id('m5a'), + to: id('m6a'), + options: { + cps: [ + { x: 0, y: 20 }, + { x: 0, y: 20 }, + ], + invert: true, + position_end: 'nearTop', + y_shift: 20, + }, + }); + x = 20; + y += 230; + system = appendSystem(220); + system + .addStave({ + voices: [ + voice([notes('F4/q[id="m7a"]'), beam(notes('G4/8[id="m7b"], A4, B4, G4', { stem: 'up' }))].reduce(concat)), + ], + }) + .addClef('treble') + .addKeySignature('G'); + system + .addStave({ voices: [voice(notes('D4/q, B3[id="m7c"], G3', { clef: 'bass' }))] }) + .addClef('bass') + .addKeySignature('G'); + system.addConnector('brace'); + system.addConnector('singleRight'); + system.addConnector('singleLeft'); + id('m7a').addModifier(f.Fingering({ number: '2', position: 'below' }), 0); + id('m7b').addModifier(f.Fingering({ number: '1' }), 0); + id('m7c').addModifier(f.Fingering({ number: '3', position: 'above' }), 0); + system = appendSystem(180); + const grace = f.GraceNote({ keys: ['d/3'], clef: 'bass', duration: '8', slash: true }); + system.addStave({ voices: [voice(notes('A4/h.[id="m8c"]'))] }); + system.addStave({ + voices: [ + score + .set({ clef: 'bass' }) + .voice([notes('D4/q[id="m8a"]'), beam(notes('D3/8, C4, B3[id="m8b"], A3', { stem: 'down' }))].reduce(concat)), + ], + }); + system.addConnector('singleRight'); + id('m8b').addModifier(f.Fingering({ number: '1', position: 'above' }), 0); + id('m8c').addModifier(f.GraceNoteGroup({ notes: [grace] }), 0); + f.Curve({ + from: id('m7a'), + to: id('m8c'), + options: { + cps: [ + { x: 0, y: 20 }, + { x: 0, y: 20 }, + ], + invert: true, + position: 'nearTop', + position_end: 'nearTop', + }, + }); + f.StaveTie({ from: grace, to: id('m8c') }); + system = appendSystem(180); + system.addStave({ + voices: [ + score + .set({ clef: 'treble' }) + .voice([notes('D5/q[id="m9a"]'), beam(notes('G4/8, A4, B4, C5', { stem: 'up' }))].reduce(concat)), + ], + }); + system.addStave({ voices: [voice(notes('B3/h, A3/q', { clef: 'bass' }))] }); + system.addConnector('singleRight'); + id('m9a').addModifier(f.Fingering({ number: '5' }), 0); + system = appendSystem(170); + system.addStave({ voices: [voice(notes('D5/q[id="m10a"], G4[id="m10b"], G4[id="m10c"]'))] }); + system.addStave({ voices: [voice(notes('G3/q[id="m10d"], B3, G3', { clef: 'bass' }))] }); + system.addConnector('singleRight'); + id('m10a').addModifier(f.Articulation({ type: 'a.', position: 'above' }), 0); + id('m10b').addModifier(f.Articulation({ type: 'a.', position: 'below' }), 0); + id('m10c').addModifier(f.Articulation({ type: 'a.', position: 'below' }), 0); + id('m10d').addModifier(f.Fingering({ number: '4' }), 0); + f.Curve({ + from: id('m9a'), + to: id('m10a'), + options: { + cps: [ + { x: 0, y: 40 }, + { x: 0, y: 40 }, + ], + }, + }); + system = appendSystem(150); + system.addStave({ + voices: [voice([notes('E5/q[id="m11a"]'), beam(notes('C5/8, D5, E5, F5', { stem: 'down' }))].reduce(concat))], + }); + id('m11a').addModifier(f.Fingering({ number: '3', position: 'above' }), 0); + system.addStave({ voices: [voice(notes('C4/h.', { clef: 'bass' }))] }); + system.addConnector('singleRight'); + system = appendSystem(170); + system.addStave({ voices: [voice(notes('G5/q[id="m12a"], G4[id="m12b"], G4[id="m12c"]'))] }); + system.addStave({ + voices: [ + score + .set({ clef: 'bass' }) + .voice([notes('B3/q[id="m12d"]'), beam(notes('C4/8, B3, A3, G3[id="m12e"]', { stem: 'down' }))].reduce(concat)), + ], + }); + system.addConnector('singleRight'); + id('m12a').addModifier(f.Articulation({ type: 'a.', position: 'above' }), 0); + id('m12b').addModifier(f.Articulation({ type: 'a.', position: 'below' }), 0); + id('m12c').addModifier(f.Articulation({ type: 'a.', position: 'below' }), 0); + id('m12d').addModifier(f.Fingering({ number: '2', position: 'above' }), 0); + id('m12e').addModifier(f.Fingering({ number: '4', position: 'above' }), 0); + f.Curve({ + from: id('m11a'), + to: id('m12a'), + options: { + cps: [ + { x: 0, y: 20 }, + { x: 0, y: 20 }, + ], + }, + }); + x = 20; + y += 230; + system = appendSystem(220); + system + .addStave({ + voices: [ + score + .set({ clef: 'treble' }) + .voice([notes('c5/q[id="m13a"]'), beam(notes('d5/8, c5, b4, a4', { stem: 'down' }))].reduce(concat)), + ], + }) + .addClef('treble') + .addKeySignature('G'); + system + .addStave({ voices: [voice(notes('a3/h[id="m13b"], f3/q[id="m13c"]', { clef: 'bass' }))] }) + .addClef('bass') + .addKeySignature('G'); + system.addConnector('brace'); + system.addConnector('singleRight'); + system.addConnector('singleLeft'); + id('m13a').addModifier(f.Fingering({ number: '4', position: 'above' }), 0); + id('m13b').addModifier(f.Fingering({ number: '1' }), 0); + id('m13c').addModifier(f.Fingering({ number: '3', position: 'above' }), 0); + system = appendSystem(180); + system.addStave({ + voices: [ + score + .set({ clef: 'treble' }) + .voice([notes('B4/q'), beam(notes('C5/8, b4, a4, g4', { stem: 'up' }))].reduce(concat)), + ], + }); + system.addStave({ voices: [voice(notes('g3/h[id="m14a"], b3/q[id="m14b"]', { clef: 'bass' }))] }); + system.addConnector('singleRight'); + id('m14a').addModifier(f.Fingering({ number: '2' }), 0); + id('m14b').addModifier(f.Fingering({ number: '1' }), 0); + system = appendSystem(180); + system.addStave({ + voices: [ + score + .set({ clef: 'treble' }) + .voice([notes('a4/q'), beam(notes('b4/8, a4, g4, f4[id="m15a"]', { stem: 'up' }))].reduce(concat)), + ], + }); + system.addStave({ voices: [voice(notes('c4/q[id="m15b"], d4, d3', { clef: 'bass' }))] }); + system.addConnector('singleRight'); + id('m15a').addModifier(f.Fingering({ number: '2' }), 0); + id('m15b').addModifier(f.Fingering({ number: '2' }), 0); + system = appendSystem(130); + system + .addStave({ + voices: [score.set({ clef: 'treble' }).voice([notes('g4/h.[id="m16a"]')].reduce(concat))], + }) + .setEndBarType(BarlineType.REPEAT_END); + system + .addStave({ voices: [voice(notes('g3/h[id="m16b"], g2/q', { clef: 'bass' }))] }) + .setEndBarType(BarlineType.REPEAT_END); + system.addConnector('boldDoubleRight'); + id('m16a').addModifier(f.Fingering({ number: '1' }), 0); + id('m16b').addModifier(f.Fingering({ number: '1' }), 0); + f.Curve({ + from: id('m13a'), + to: id('m16a'), + options: { + cps: [ + { x: 0, y: 50 }, + { x: 0, y: 20 }, + ], + invert: true, + position_end: 'nearTop', + }, + }); + system = appendSystem(180); + system + .addStave({ + voices: [ + score + .set({ clef: 'treble' }) + .voice([notes('b5/q[id="m17a"]'), beam(notes('g5/8, a5, b5, g5', { stem: 'down' }))].reduce(concat)), + voice([f.TextDynamics({ text: 'mf', duration: 'h', dots: 1, line: 10 })]), + ], + }) + .setBegBarType(BarlineType.REPEAT_BEGIN); + system.addStave({ voices: [voice(notes('g3/h.', { clef: 'bass' }))] }).setBegBarType(BarlineType.REPEAT_BEGIN); + system.addConnector('boldDoubleLeft'); + system.addConnector('singleRight'); + id('m17a').addModifier(f.Fingering({ number: '5', position: 'above' }), 0); + system = appendSystem(180); + system.addStave({ + voices: [ + score + .set({ clef: 'treble' }) + .voice([notes('a5/q[id="m18a"]'), beam(notes('d5/8, e5, f5, d5[id="m18b"]', { stem: 'down' }))].reduce(concat)), + ], + }); + system.addStave({ voices: [voice(notes('f3/h.', { clef: 'bass' }))] }); + system.addConnector('singleRight'); + id('m18a').addModifier(f.Fingering({ number: '4', position: 'above' }), 0); + f.Curve({ + from: id('m17a'), + to: id('m18b'), + options: { + cps: [ + { x: 0, y: 20 }, + { x: 0, y: 30 }, + ], + }, + }); + f.draw(); + Registry.disableDefaultRegistry(); + ok(true, 'Bach Minuet 1'); +} +VexFlowTests.register(BachDemoTests); +export { BachDemoTests }; diff --git a/build/esm/tests/barline_tests.js b/build/esm/tests/barline_tests.js new file mode 100644 index 0000000000..73d2d18e4a --- /dev/null +++ b/build/esm/tests/barline_tests.js @@ -0,0 +1,52 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Barline, BarlineType } from '../src/stavebarline.js'; +const BarlineTests = { + Start() { + QUnit.module('Barline'); + test('Enums', enums); + const run = VexFlowTests.runTests; + run('Simple BarNotes', simple); + run('Style BarNotes', style); + }, +}; +function enums() { + equal(Barline.type, BarlineType); + const a = BarlineType['DOUBLE']; + const b = BarlineType.DOUBLE; + equal(a, b); +} +function simple(options) { + const f = VexFlowTests.makeFactory(options, 380, 160); + const stave = f.Stave(); + const notes = [ + f.StaveNote({ keys: ['d/4', 'e/4', 'f/4'], stem_direction: -1, duration: '2' }), + f.BarNote({ type: 'single' }), + f + .StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: '2' }) + .addModifier(f.Accidental({ type: 'n' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1), + ]; + const voice = f.Voice().addTickables(notes); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Simple Test'); +} +function style(options) { + const f = VexFlowTests.makeFactory(options, 380, 160); + const stave = f.Stave(); + const notes = [ + f.StaveNote({ keys: ['d/4', 'e/4', 'f/4'], stem_direction: -1, duration: '2' }), + f.BarNote({ type: 'single' }), + f + .StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: '2' }) + .addModifier(f.Accidental({ type: 'n' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1), + ]; + notes[1].setStyle({ shadowBlur: 15, shadowColor: 'blue', fillStyle: 'blue', strokeStyle: 'blue' }); + const voice = f.Voice().addTickables(notes); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Style'); +} +VexFlowTests.register(BarlineTests); +export { BarlineTests }; diff --git a/build/esm/tests/beam_tests.js b/build/esm/tests/beam_tests.js new file mode 100644 index 0000000000..136281ef52 --- /dev/null +++ b/build/esm/tests/beam_tests.js @@ -0,0 +1,595 @@ +import { concat, VexFlowTests } from './vexflow_test_helpers.js'; +import { AnnotationVerticalJustify, Beam, Dot, Font, FontStyle, FontWeight, Stem, Voice, } from '../src/index.js'; +const BeamTests = { + Start() { + QUnit.module('Beam'); + const run = VexFlowTests.runTests; + run('Simple Beam', simple); + run('Multi Beam', multi); + run('Sixteenth Beam', sixteenth); + run('Slopey Beam', slopey); + run('Auto-stemmed Beam', autoStem); + run('Mixed Beam 1', mixed); + run('Mixed Beam 2', mixed2); + run('Dotted Beam', dotted); + run('Partial Beam', partial); + run('Close Trade-offs Beam', tradeoffs); + run('Insane Beam', insane); + run('Lengthy Beam', lenghty); + run('Outlier Beam', outlier); + run('Break Secondary Beams', breakSecondaryBeams); + run('TabNote Beams Up', tabBeamsUp); + run('TabNote Beams Down', tabBeamsDown); + run('TabNote Auto Create Beams', autoTabBeams); + run('TabNote Beams Auto Stem', tabBeamsAutoStem); + run('Complex Beams with Annotations', complexWithAnnotation); + run('Complex Beams with Articulations', complexWithArticulation); + }, +}; +function simple(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const beam = score.beam.bind(score); + const notes = score.notes.bind(score); + const voice = score.voice([ + notes('(cb4 e#4 a4)/2'), + beam(notes('(cb4 e#4 a4)/8, (d4 f4 a4), (ebb4 g##4 b4), (f4 a4 c5)', { stem: 'up' })), + ].reduce(concat), { time: '2/2' }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Simple Test'); +} +function multi(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice.bind(score); + const beam = score.beam.bind(score); + const notes = score.notes.bind(score); + const voices = [ + voice([beam(notes('f5/8, e5, d5, c5', { stem: 'up' })), beam(notes('c5, d5, e5, f5', { stem: 'up' }))].reduce(concat)), + voice([beam(notes('f4/8, e4, d4, c4', { stem: 'down' })), beam(notes('c4/8, d4, e4, f4', { stem: 'down' }))].reduce(concat)), + ]; + f.Formatter().joinVoices(voices).formatToStave(voices, stave); + f.draw(); + ok(true, 'Multi Test'); +} +function sixteenth(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice.bind(score); + const beam = score.beam.bind(score); + const notes = score.notes.bind(score); + const voices = [ + voice([ + beam(notes('f5/16, f5, d5, c5', { stem: 'up' })), + beam(notes('c5/16, d5, f5, e5', { stem: 'up' })), + notes('f5/2', { stem: 'up' }), + ].reduce(concat)), + voice([ + beam(notes('f4/16, e4/16, d4/16, c4/16', { stem: 'down' })), + beam(notes('c4/16, d4/16, f4/16, e4/16', { stem: 'down' })), + notes('f4/2', { stem: 'down' }), + ].reduce(concat)), + ]; + f.Formatter().joinVoices(voices).formatToStave(voices, stave); + f.draw(); + ok(true, 'Sixteenth Test'); +} +function breakSecondaryBeams(options) { + const f = VexFlowTests.makeFactory(options, 600, 200); + const stave = f.Stave({ y: 20 }); + const score = f.EasyScore(); + const voice = score.voice.bind(score); + const beam = score.beam.bind(score); + const notes = score.notes.bind(score); + const voices = [ + voice([ + beam(notes('f5/16., f5/32, c5/16., d5/32, c5/16., d5/32', { stem: 'up' }), { secondaryBeamBreaks: [1, 3] }), + beam(notes('f5/16, e5, e5, e5, e5, e5', { stem: 'up' }), { secondaryBeamBreaks: [2] }), + ].reduce(concat), { time: '3/4' }), + voice([ + beam(notes('f4/32, d4, e4, c4, d4, c4, f4, d4, e4, c4, c4, d4', { stem: 'down' }), { + secondaryBeamBreaks: [3, 7], + }), + beam(notes('d4/16, f4, d4, e4, e4, e4', { stem: 'down' }), { secondaryBeamBreaks: [3] }), + ].reduce(concat), { time: '3/4' }), + ]; + f.Formatter().joinVoices(voices).formatToStave(voices, stave); + f.draw(); + ok(true, 'Breaking Secondary Beams Test'); +} +function slopey(options) { + const f = VexFlowTests.makeFactory(options, 350, 140); + const stave = f.Stave({ y: 20 }); + const score = f.EasyScore(); + const beam = score.beam.bind(score); + const notes = score.notes.bind(score); + const voice = score.voice([ + beam(notes('c4/8, f4/8, d5/8, g5/8', { stem: 'up' })), + beam(notes('d6/8, f5/8, d4/8, g3/8', { stem: 'up' })), + ].reduce(concat)); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Slopey Test'); +} +function autoStem(options) { + const f = VexFlowTests.makeFactory(options, 350, 140); + const stave = f.Stave({ y: 20 }); + const score = f.EasyScore(); + const voice = score.voice(score.notes('a4/8, b4/8, g4/8, c5/8, f4/8, d5/8, e4/8, e5/8, b4/8, b4/8, g4/8, d5/8'), { + time: '6/4', + }); + const notes = voice.getTickables(); + const beams = [ + f.Beam({ notes: notes.slice(0, 2), options: { autoStem: true } }), + f.Beam({ notes: notes.slice(2, 4), options: { autoStem: true } }), + f.Beam({ notes: notes.slice(4, 6), options: { autoStem: true } }), + f.Beam({ notes: notes.slice(6, 8), options: { autoStem: true } }), + f.Beam({ notes: notes.slice(8, 10), options: { autoStem: true } }), + f.Beam({ notes: notes.slice(10, 12), options: { autoStem: true } }), + ]; + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + const UP = Stem.UP; + const DOWN = Stem.DOWN; + equal(beams[0].getStemDirection(), UP); + equal(beams[1].getStemDirection(), UP); + equal(beams[2].getStemDirection(), UP); + equal(beams[3].getStemDirection(), UP); + equal(beams[4].getStemDirection(), DOWN); + equal(beams[5].getStemDirection(), DOWN); + f.draw(); + ok(true, 'AutoStem Beam Test'); +} +function mixed(options) { + const f = VexFlowTests.makeFactory(options, 350, 140); + const stave = f.Stave({ y: 20 }); + const score = f.EasyScore(); + const voice1 = score.voice(score.notes('f5/8, d5/16, c5/16, c5/16, d5/16, e5/8, f5/8, d5/16, c5/16, c5/16, d5/16, e5/8', { stem: 'up' })); + const voice2 = score.voice(score.notes('f4/16, e4/8, d4/16, c4/16, d4/8, f4/16, f4/16, e4/8, d4/16, c4/16, d4/8, f4/16', { stem: 'down' })); + [ + [0, 4], + [4, 8], + [8, 12], + ].forEach((range) => f.Beam({ notes: voice1.getTickables().slice(range[0], range[1]) })); + [ + [0, 4], + [4, 8], + [8, 12], + ].forEach((range) => f.Beam({ notes: voice2.getTickables().slice(range[0], range[1]) })); + f.Formatter().joinVoices([voice1, voice2]).formatToStave([voice1, voice2], stave); + f.draw(); + ok(true, 'Multi Test'); +} +function mixed2(options) { + const f = VexFlowTests.makeFactory(options, 450, 180); + const stave = f.Stave({ y: 20 }); + const score = f.EasyScore(); + const voice = score.voice(score.notes('f5/32, d5/16, c5/32, c5/64, d5/128, e5/8, f5/16, d5/32, c5/64, c5/32, d5/16, e5/128', { + stem: 'up', + }), { time: '31/64' }); + const voice2 = score.voice(score.notes('f4/32, d4/16, c4/32, c4/64, d4/128, e4/8, f4/16, d4/32, c4/64, c4/32, d4/16, e4/128', { + stem: 'down', + }), { time: '31/64' }); + f.Beam({ notes: voice.getTickables().slice(0, 12) }); + f.Beam({ notes: voice2.getTickables().slice(0, 12) }); + f.Formatter().joinVoices([voice, voice2]).formatToStave([voice, voice2], stave); + f.draw(); + ok(true, 'Multi Test'); +} +function dotted(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('d4/8, b3/8., a3/16, a3/8, b3/8., c4/16, d4/8, b3/8, a3/8., a3/16, b3/8., c4/16', { stem: 'up' }), { time: '6/4' }); + const notes = voice.getTickables(); + f.Beam({ notes: notes.slice(0, 4) }); + f.Beam({ notes: notes.slice(4, 8) }); + f.Beam({ notes: notes.slice(8, 12) }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Dotted Test'); +} +function partial(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('d4/8, b3/32, c4/16., d4/16., e4/8, c4/64, c4/32, a3/8., b3/32., c4/8, e4/64, b3/16., b3/64, f4/8, e4/8, g4/64, e4/8'), { time: '89/64' }); + const notes = voice.getTickables(); + f.Beam({ notes: notes.slice(0, 3) }); + f.Beam({ notes: notes.slice(3, 9) }); + f.Beam({ notes: notes.slice(9, 13) }); + f.Beam({ notes: notes.slice(13, 17) }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Partial Test'); +} +function tradeoffs(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave(); + const score = f.EasyScore(); + const voice = score.voice(score.notes('a4/8, b4/8, c4/8, d4/8, g4/8, a4/8, b4/8, c4/8', { stem: 'up' })); + const notes = voice.getTickables(); + f.Beam({ notes: notes.slice(0, 4) }); + f.Beam({ notes: notes.slice(4, 8) }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Close Trade-offs Test'); +} +function insane(options) { + const f = VexFlowTests.makeFactory(options, 450, 180); + const stave = f.Stave({ y: 20 }); + const score = f.EasyScore(); + const voice = score.voice(score.notes('g4/8, g5/8, c4/8, b5/8, g4/8[stem="down"], a5[stem="down"], b4[stem="down"], c4/8', { stem: 'up' })); + const notes = voice.getTickables(); + f.Beam({ notes: notes.slice(0, 4) }); + f.Beam({ notes: notes.slice(4, 7) }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Insane Test'); +} +function lenghty(options) { + const f = VexFlowTests.makeFactory(options, 450, 180); + const stave = f.Stave({ y: 20 }); + const score = f.EasyScore(); + const voice = score.voice(score.beam(score.notes('g4/8, g4, g4, a4', { stem: 'up' })), { time: '2/4' }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Lengthy Test'); +} +function outlier(options) { + const f = VexFlowTests.makeFactory(options, 450, 180); + const stave = f.Stave({ y: 20 }); + const score = f.EasyScore(); + const voice = score.voice(score.notes([ + 'g4/8[stem="up"], f4[stem="up"], d5[stem="up"], e4[stem="up"]', + 'd5/8[stem="down"], d5[stem="down"], c5[stem="down"], d5[stem="down"]', + ].join())); + const notes = voice.getTickables(); + f.Beam({ notes: notes.slice(0, 4) }); + f.Beam({ notes: notes.slice(4, 8) }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave, { stave: stave }); + f.draw(); + ok(true, 'Outlier Test'); +} +function tabBeamsUp(options) { + const f = VexFlowTests.makeFactory(options, 600, 200); + const stave = f.TabStave({ y: 20 }); + const specs = [ + { + positions: [ + { str: 3, fret: 6 }, + { str: 4, fret: 25 }, + ], + duration: '4', + }, + { + positions: [ + { str: 2, fret: 10 }, + { str: 5, fret: 12 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '16', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '32', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '64', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '128', + }, + { positions: [{ str: 3, fret: 6 }], duration: '8' }, + { positions: [{ str: 3, fret: 6 }], duration: '8' }, + { positions: [{ str: 3, fret: 6 }], duration: '8' }, + { positions: [{ str: 3, fret: 6 }], duration: '8' }, + ]; + const notes = specs.map((struct) => { + const tabNote = f.TabNote(struct); + tabNote.render_options.draw_stem = true; + return tabNote; + }); + f.Beam({ notes: notes.slice(1, 7) }); + f.Beam({ notes: notes.slice(8, 11) }); + f.Tuplet({ notes: notes.slice(8, 11), options: { ratioed: true } }); + const voice = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'All objects have been drawn'); +} +function tabBeamsDown(options) { + const f = VexFlowTests.makeFactory(options, 600, 250); + const stave = f.TabStave({ options: { num_lines: 10 } }); + const specs = [ + { + stem_direction: -1, + positions: [ + { str: 3, fret: 6 }, + { str: 4, fret: 25 }, + ], + duration: '4', + }, + { + stem_direction: -1, + positions: [ + { str: 2, fret: 10 }, + { str: 5, fret: 12 }, + ], + duration: '8dd', + }, + { + stem_direction: -1, + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '8', + }, + { + stem_direction: -1, + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '16', + }, + { + stem_direction: -1, + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '32', + }, + { + stem_direction: -1, + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '64', + }, + { + stem_direction: -1, + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '128', + }, + { stem_direction: -1, positions: [{ str: 1, fret: 6 }], duration: '8' }, + { stem_direction: -1, positions: [{ str: 1, fret: 6 }], duration: '8' }, + { stem_direction: -1, positions: [{ str: 1, fret: 6 }], duration: '8' }, + { stem_direction: -1, positions: [{ str: 7, fret: 6 }], duration: '8' }, + { stem_direction: -1, positions: [{ str: 7, fret: 6 }], duration: '8' }, + { stem_direction: -1, positions: [{ str: 10, fret: 6 }], duration: '8' }, + { stem_direction: -1, positions: [{ str: 10, fret: 6 }], duration: '8' }, + ]; + const notes = specs.map((struct) => { + const tabNote = f.TabNote(struct); + tabNote.render_options.draw_stem = true; + tabNote.render_options.draw_dots = true; + return tabNote; + }); + Dot.buildAndAttach([notes[1], notes[1]]); + f.Beam({ notes: notes.slice(1, 7) }); + f.Beam({ notes: notes.slice(8, 11) }); + f.Tuplet({ notes: notes.slice(8, 11), options: { location: -1 } }); + f.Tuplet({ notes: notes.slice(11, 14), options: { location: -1 } }); + const voice = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'All objects have been drawn'); +} +function autoTabBeams(options) { + const f = VexFlowTests.makeFactory(options, 600, 200); + const stave = f.TabStave(); + const specs = [ + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '16', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '16', + }, + { positions: [{ str: 1, fret: 6 }], duration: '32' }, + { positions: [{ str: 1, fret: 6 }], duration: '32' }, + { positions: [{ str: 1, fret: 6 }], duration: '32' }, + { positions: [{ str: 6, fret: 6 }], duration: '32' }, + { positions: [{ str: 6, fret: 6 }], duration: '16' }, + { positions: [{ str: 6, fret: 6 }], duration: '16' }, + { positions: [{ str: 6, fret: 6 }], duration: '16' }, + { positions: [{ str: 6, fret: 6 }], duration: '16' }, + ]; + const notes = specs.map((struct) => { + const tabNote = f.TabNote(struct); + tabNote.render_options.draw_stem = true; + tabNote.render_options.draw_dots = true; + return tabNote; + }); + const voice = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes); + const beams = Beam.applyAndGetBeams(voice, -1); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + beams.forEach((beam) => beam.setContext(f.getContext()).draw()); + ok(true, 'All objects have been drawn'); +} +function tabBeamsAutoStem(options) { + const f = VexFlowTests.makeFactory(options, 600, 300); + const stave = f.TabStave(); + const specs = [ + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '8', + stem_direction: -1, + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '8', + stem_direction: 1, + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '16', + stem_direction: -1, + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '16', + stem_direction: 1, + }, + { positions: [{ str: 1, fret: 6 }], duration: '32', stem_direction: 1 }, + { positions: [{ str: 1, fret: 6 }], duration: '32', stem_direction: -1 }, + { positions: [{ str: 1, fret: 6 }], duration: '32', stem_direction: -1 }, + { positions: [{ str: 6, fret: 6 }], duration: '32', stem_direction: -1 }, + { positions: [{ str: 6, fret: 6 }], duration: '16', stem_direction: 1 }, + { positions: [{ str: 6, fret: 6 }], duration: '16', stem_direction: 1 }, + { positions: [{ str: 6, fret: 6 }], duration: '16', stem_direction: 1 }, + { positions: [{ str: 6, fret: 6 }], duration: '16', stem_direction: -1 }, + ]; + const notes = specs.map((struct) => { + const tabNote = f.TabNote(struct); + tabNote.render_options.draw_stem = true; + tabNote.render_options.draw_dots = true; + return tabNote; + }); + f.Beam({ notes: notes.slice(0, 8), options: { autoStem: true } }); + f.Beam({ notes: notes.slice(8, 12), options: { autoStem: true } }); + const voice = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'All objects have been drawn'); +} +function complexWithAnnotation(options) { + const factory = VexFlowTests.makeFactory(options, 500, 200); + const stave = factory.Stave({ y: 40 }); + const s1 = [ + { keys: ['e/4'], duration: '128', stem_direction: 1 }, + { keys: ['d/4'], duration: '16', stem_direction: 1 }, + { keys: ['e/4'], duration: '8', stem_direction: 1 }, + { keys: ['c/4', 'g/4'], duration: '32', stem_direction: 1 }, + { keys: ['c/4'], duration: '32', stem_direction: 1 }, + { keys: ['c/4'], duration: '32', stem_direction: 1 }, + { keys: ['c/4'], duration: '32', stem_direction: 1 }, + ]; + const s2 = [ + { keys: ['e/5'], duration: '128', stem_direction: -1 }, + { keys: ['d/5'], duration: '16', stem_direction: -1 }, + { keys: ['e/5'], duration: '8', stem_direction: -1 }, + { keys: ['c/5', 'g/5'], duration: '32', stem_direction: -1 }, + { keys: ['c/5'], duration: '32', stem_direction: -1 }, + { keys: ['c/5'], duration: '32', stem_direction: -1 }, + { keys: ['c/5'], duration: '32', stem_direction: -1 }, + ]; + const font = { + family: Font.SERIF, + size: 14, + weight: FontWeight.BOLD, + style: FontStyle.ITALIC, + }; + const notes1 = s1.map((struct) => factory + .StaveNote(struct) + .addModifier(factory.Annotation({ text: '1', vJustify: AnnotationVerticalJustify.TOP, font }), 0)); + const notes2 = s2.map((struct) => factory + .StaveNote(struct) + .addModifier(factory.Annotation({ text: '3', vJustify: AnnotationVerticalJustify.BOTTOM, font }), 0)); + factory.Beam({ notes: notes1 }); + factory.Beam({ notes: notes2 }); + const voice = factory.Voice().setMode(Voice.Mode.SOFT).addTickables(notes1).addTickables(notes2); + factory.Formatter().joinVoices([voice]).formatToStave([voice], stave, { stave: stave }); + factory.draw(); + ok(true, 'Complex beam annotations'); +} +function complexWithArticulation(options) { + const f = VexFlowTests.makeFactory(options, 500, 200); + const stave = f.Stave({ y: 40 }); + const s1 = [ + { keys: ['e/4'], duration: '128', stem_direction: 1 }, + { keys: ['d/4'], duration: '16', stem_direction: 1 }, + { keys: ['e/4'], duration: '8', stem_direction: 1 }, + { keys: ['c/4', 'g/4'], duration: '32', stem_direction: 1 }, + { keys: ['c/4'], duration: '32', stem_direction: 1 }, + { keys: ['c/4'], duration: '32', stem_direction: 1 }, + { keys: ['c/4'], duration: '32', stem_direction: 1 }, + ]; + const s2 = [ + { keys: ['e/5'], duration: '128', stem_direction: -1 }, + { keys: ['d/5'], duration: '16', stem_direction: -1 }, + { keys: ['e/5'], duration: '8', stem_direction: -1 }, + { keys: ['c/5', 'g/5'], duration: '32', stem_direction: -1 }, + { keys: ['c/5'], duration: '32', stem_direction: -1 }, + { keys: ['c/5'], duration: '32', stem_direction: -1 }, + { keys: ['c/5'], duration: '32', stem_direction: -1 }, + ]; + const notes1 = s1.map((struct) => f.StaveNote(struct).addModifier(f.Articulation({ type: 'am', position: 'above' }), 0)); + const notes2 = s2.map((struct) => f.StaveNote(struct).addModifier(f.Articulation({ type: 'a>', position: 'below' }), 0)); + f.Beam({ notes: notes1 }); + f.Beam({ notes: notes2 }); + const voice = f.Voice().setMode(Voice.Mode.SOFT).addTickables(notes1).addTickables(notes2); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave, { stave: stave }); + f.draw(); + ok(true, 'Complex beam articulations'); +} +VexFlowTests.register(BeamTests); +export { BeamTests }; diff --git a/build/esm/tests/bend_tests.js b/build/esm/tests/bend_tests.js new file mode 100644 index 0000000000..56fa567261 --- /dev/null +++ b/build/esm/tests/bend_tests.js @@ -0,0 +1,215 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Bend } from '../src/bend.js'; +import { Font } from '../src/font.js'; +import { Formatter } from '../src/formatter.js'; +import { ModifierContext } from '../src/modifiercontext.js'; +import { Note } from '../src/note.js'; +import { TabNote } from '../src/tabnote.js'; +import { TabStave } from '../src/tabstave.js'; +import { TickContext } from '../src/tickcontext.js'; +const BendTests = { + Start() { + QUnit.module('Bend'); + const run = VexFlowTests.runTests; + run('Double Bends', doubleBends); + run('Reverse Bends', reverseBends); + run('Bend Phrase', bendPhrase); + run('Double Bends With Release', doubleBendsWithRelease); + run('Whako Bend', whackoBends); + }, +}; +const note = (noteStruct) => new TabNote(noteStruct); +const bendWithText = (text, release = false) => new Bend(text, release); +const bendWithPhrase = (phrase) => new Bend('', false, phrase); +function doubleBends(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 500, 240); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + ctx.font = '10pt Arial'; + const stave = new TabStave(10, 10, 450).addTabGlyph().setContext(ctx).draw(); + const notes = [ + note({ + positions: [ + { str: 2, fret: 10 }, + { str: 4, fret: 9 }, + ], + duration: 'q', + }) + .addModifier(bendWithText('Full'), 0) + .addModifier(bendWithText('1/2'), 1), + note({ + positions: [ + { str: 2, fret: 5 }, + { str: 3, fret: 5 }, + ], + duration: 'q', + }) + .addModifier(bendWithText('1/4'), 0) + .addModifier(bendWithText('1/4'), 1), + note({ + positions: [{ str: 4, fret: 7 }], + duration: 'h', + }), + ]; + Formatter.FormatAndDraw(ctx, stave, notes); + notes.forEach((note) => Note.plotMetrics(ctx, note, 140)); + ok(true, 'Double Bends'); +} +function doubleBendsWithRelease(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 550, 240); + ctx.scale(1.0, 1.0); + ctx.setBackgroundFillStyle('#FFF'); + ctx.setFont('Arial', VexFlowTests.Font.size); + const stave = new TabStave(10, 10, 550).addTabGlyph().setContext(ctx).draw(); + const notes = [ + note({ + positions: [ + { str: 1, fret: 10 }, + { str: 4, fret: 9 }, + ], + duration: 'q', + }) + .addModifier(bendWithText('1/2', true), 0) + .addModifier(bendWithText('Full', true), 1), + note({ + positions: [ + { str: 2, fret: 5 }, + { str: 3, fret: 5 }, + { str: 4, fret: 5 }, + ], + duration: 'q', + }) + .addModifier(bendWithText('1/4', true), 0) + .addModifier(bendWithText('Monstrous', true), 1) + .addModifier(bendWithText('1/4', true), 2), + note({ + positions: [{ str: 4, fret: 7 }], + duration: 'q', + }), + note({ + positions: [{ str: 4, fret: 7 }], + duration: 'q', + }), + ]; + Formatter.FormatAndDraw(ctx, stave, notes); + notes.forEach((note) => Note.plotMetrics(ctx, note, 140)); + ok(true, 'Bend Release'); +} +function reverseBends(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 500, 240); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + ctx.setFont('10pt Arial'); + const stave = new TabStave(10, 10, 450).addTabGlyph().setContext(ctx).draw(); + const notes = [ + note({ + positions: [ + { str: 2, fret: 10 }, + { str: 4, fret: 9 }, + ], + duration: 'w', + }) + .addModifier(bendWithText('Full'), 1) + .addModifier(bendWithText('1/2'), 0), + note({ + positions: [ + { str: 2, fret: 5 }, + { str: 3, fret: 5 }, + ], + duration: 'w', + }) + .addModifier(bendWithText('1/4'), 1) + .addModifier(bendWithText('1/4'), 0), + note({ + positions: [{ str: 4, fret: 7 }], + duration: 'w', + }), + ]; + for (let i = 0; i < notes.length; ++i) { + const note = notes[i]; + const mc = new ModifierContext(); + note.addToModifierContext(mc); + const tickContext = new TickContext(); + tickContext + .addTickable(note) + .preFormat() + .setX(75 * i); + note.setStave(stave).setContext(ctx).draw(); + Note.plotMetrics(ctx, note, 140); + ok(true, 'Bend ' + i); + } +} +function bendPhrase(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 500, 240); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + ctx.font = Font.SIZE + 'pt ' + Font.SANS_SERIF; + const stave = new TabStave(10, 10, 450).addTabGlyph().setContext(ctx).draw(); + const phrase1 = [ + { type: Bend.UP, text: 'Full' }, + { type: Bend.DOWN, text: 'Monstrous' }, + { type: Bend.UP, text: '1/2' }, + { type: Bend.DOWN, text: '' }, + ]; + const bend1 = bendWithPhrase(phrase1).setContext(ctx); + const notes = [ + note({ + positions: [{ str: 2, fret: 10 }], + duration: 'w', + }).addModifier(bend1, 0), + ]; + for (let i = 0; i < notes.length; ++i) { + const note = notes[i]; + note.addToModifierContext(new ModifierContext()); + const tickContext = new TickContext(); + tickContext + .addTickable(note) + .preFormat() + .setX(75 * i); + note.setStave(stave).setContext(ctx).draw(); + Note.plotMetrics(ctx, note, 140); + ok(true, 'Bend ' + i); + } +} +function whackoBends(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 240); + ctx.scale(1.0, 1.0); + ctx.setBackgroundFillStyle('#FFF'); + ctx.setFont('Arial', VexFlowTests.Font.size); + const stave = new TabStave(10, 10, 350).addTabGlyph().setContext(ctx).draw(); + const phrase1 = [ + { type: Bend.UP, text: 'Full' }, + { type: Bend.DOWN, text: '' }, + { type: Bend.UP, text: '1/2' }, + { type: Bend.DOWN, text: '' }, + ]; + const phrase2 = [ + { type: Bend.UP, text: 'Full' }, + { type: Bend.UP, text: 'Full' }, + { type: Bend.UP, text: '1/2' }, + { type: Bend.DOWN, text: '' }, + { type: Bend.DOWN, text: 'Full' }, + { type: Bend.DOWN, text: 'Full' }, + { type: Bend.UP, text: '1/2' }, + { type: Bend.DOWN, text: '' }, + ]; + const notes = [ + note({ + positions: [ + { str: 2, fret: 10 }, + { str: 3, fret: 9 }, + ], + duration: 'q', + }) + .addModifier(bendWithPhrase(phrase1), 0) + .addModifier(bendWithPhrase(phrase2), 1), + ]; + Formatter.FormatAndDraw(ctx, stave, notes); + Note.plotMetrics(ctx, notes[0], 140); + ok(true, 'Whacko Bend & Release'); +} +VexFlowTests.register(BendTests); +export { BendTests }; diff --git a/build/esm/tests/boundingbox_tests.js b/build/esm/tests/boundingbox_tests.js new file mode 100644 index 0000000000..9ee34301c4 --- /dev/null +++ b/build/esm/tests/boundingbox_tests.js @@ -0,0 +1,53 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { BoundingBox } from '../src/index.js'; +const BoundingBoxTests = { + Start() { + QUnit.module('BoundingBox'); + test('Initialization Test', initialization); + test('Merging Text', merging); + }, +}; +function initialization() { + const bb = new BoundingBox(4, 5, 6, 7); + equal(bb.getX(), 4, 'Bad X'); + equal(bb.getY(), 5, 'Bad Y'); + equal(bb.getW(), 6, 'Bad W'); + equal(bb.getH(), 7, 'Bad H'); + bb.setX(5); + equal(bb.getX(), 5, 'Bad X'); +} +function merging() { + const tests = [ + { + type: 'Intersection', + bb1: new BoundingBox(10, 10, 10, 10), + bb2: new BoundingBox(15, 20, 10, 10), + merged: new BoundingBox(10, 10, 15, 20), + }, + { + type: '1 contains 2', + bb1: new BoundingBox(10, 10, 30, 30), + bb2: new BoundingBox(15, 15, 10, 10), + merged: new BoundingBox(10, 10, 30, 30), + }, + { + type: '2 contains 1', + bb1: new BoundingBox(15, 15, 10, 10), + bb2: new BoundingBox(10, 10, 30, 30), + merged: new BoundingBox(10, 10, 30, 30), + }, + ]; + tests.forEach((test) => { + const type = test.type; + const bb1 = test.bb1; + const bb2 = test.bb2; + const merged = test.merged; + bb1.mergeWith(bb2); + equal(bb1.getX(), merged.getX(), type + ' - Bad X'); + equal(bb1.getY(), merged.getY(), type + ' - Bad Y'); + equal(bb1.getW(), merged.getW(), type + ' - Bad W'); + equal(bb1.getH(), merged.getH(), type + ' - Bad H'); + }); +} +VexFlowTests.register(BoundingBoxTests); +export { BoundingBoxTests }; diff --git a/build/esm/tests/boundingboxcomputation_tests.js b/build/esm/tests/boundingboxcomputation_tests.js new file mode 100644 index 0000000000..f4f9d51b30 --- /dev/null +++ b/build/esm/tests/boundingboxcomputation_tests.js @@ -0,0 +1,183 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { BoundingBoxComputation, Glyph } from '../src/index.js'; +const BoundingBoxComputationTests = { + Start() { + QUnit.module('BoundingBoxComputation'); + test('Point Test', point); + const run = VexFlowTests.runTests; + quadraticParams.forEach((params, index) => { + run(`Quadratic Test ${index}`, quadratic, params); + }); + cubicParams.forEach((params, index) => { + run(`Cubic Test ${index}`, cubic, params); + }); + }, +}; +function point() { + const bboxComp = new BoundingBoxComputation(); + bboxComp.addPoint(2, 3); + equal(bboxComp.getX1(), 2, 'Bad X1'); + equal(bboxComp.getY1(), 3, 'Bad Y1'); + equal(bboxComp.width(), 0, 'Bad width'); + equal(bboxComp.height(), 0, 'Bad height'); + bboxComp.addPoint(-5, 7); + equal(bboxComp.getX1(), -5, 'Bad X1'); + equal(bboxComp.getY1(), 3, 'Bad Y1'); + equal(bboxComp.width(), 7, 'Bad width'); + equal(bboxComp.height(), 4, 'Bad height'); +} +function createContext(options) { + const points = options.params.points; + let w = points[0]; + let h = points[1]; + for (let i = 2; i < points.length; i += 2) { + w = Math.max(w, points[i]); + h = Math.max(h, points[i + 1]); + } + const f = VexFlowTests.makeFactory(options, w + 20, h + 20); + const ctx = f.getContext(); + ctx.setLineCap('square'); + return ctx; +} +function rect(ctx, style, lineWidth, x, y, w, h) { + ctx.strokeStyle = style; + ctx.setLineWidth(lineWidth); + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.lineTo(x + w, y); + ctx.lineTo(x + w, y + h); + ctx.lineTo(x, y + h); + ctx.lineTo(x, y); + ctx.stroke(); +} +const quadraticParams = [ + { + points: [10, 10, 100, 20, 110, 110], + box: [10, 10, 100, 100], + }, + { + points: [110, 10, 60, 110, 10, 20], + box: [10, 10, 100, 52.63], + }, + { + points: [10, 10, 30, 20, 50, 30], + box: [10, 10, 40, 20], + }, + { + points: [100, 30, 30, 110, 20, 30], + box: [20, 30, 80, 40], + }, +]; +function quadratic(options) { + const points = options.params.points; + const box = options.params.box; + const ctx = createContext(options); + const [x0, y0, x1, y1, x2, y2] = points; + let [bx, by, bw, bh] = box; + rect(ctx, '#0f0', 5, bx, by, bw, bh); + const bboxComp = new BoundingBoxComputation(); + bboxComp.addQuadraticCurve(x0, y0, x1, y1, x2, y2); + [bx, by, bw, bh] = [bboxComp.getX1(), bboxComp.getY1(), bboxComp.width(), bboxComp.height()]; + rect(ctx, '#00f', 3, bx, by, bw, bh); + const o = [0, x0, -y0, 2, x2, -y2, x1, -y1]; + const bbox = Glyph.getOutlineBoundingBox(o, 1, 0, 0); + rect(ctx, '#fa0', 1, bbox.getX(), bbox.getY(), bbox.getW(), bbox.getH()); + ctx.setLineWidth(1); + ctx.fillStyle = '#000'; + Glyph.renderOutline(ctx, o, 1, 0, 0); + ctx.strokeStyle = '#f00'; + ctx.beginPath(); + ctx.moveTo(x0, y0); + ctx.lineTo(x1, y1); + ctx.lineTo(x2, y2); + ctx.stroke(); + ok(Math.abs(bboxComp.getX1() - box[0]) < 0.01, `Bad X1: ${bboxComp.getX1()}`); + ok(Math.abs(bboxComp.getY1() - box[1]) < 0.01, `Bad Y1: ${bboxComp.getY1()}`); + ok(Math.abs(bboxComp.width() - box[2]) < 0.01, `Bad width: ${bboxComp.width()}`); + ok(Math.abs(bboxComp.height() - box[3]) < 0.01, `Bad height: ${bboxComp.height()}`); + ok(Math.abs(bbox.getX() - box[0]) < 0.01, `Bad X: ${bbox.getX()}`); + ok(Math.abs(bbox.getY() - box[1]) < 0.01, `Bad Y: ${bbox.getY()}`); + ok(Math.abs(bbox.getW() - box[2]) < 0.01, `Bad W: ${bbox.getW()}`); + ok(Math.abs(bbox.getH() - box[3]) < 0.01, `Bad H: ${bbox.getH()}`); +} +const cubicParams = [ + { + points: [10, 10, 60, 20, 100, 60, 110, 110], + box: [10, 10, 100, 100], + }, + { + points: [10, 10, 35, 110, 85, 110, 110, 10], + box: [10, 10, 100, 75], + }, + { + points: [10, 110, 90, 10, 30, 10, 110, 110], + box: [10, 35, 100, 75], + }, + { + points: [10, 10, 110, 110, 110, 10, 10, 110], + box: [10, 10, 75, 100], + }, + { + points: [10, 10, 130, 110, -10, 110, 110, 10], + box: [10, 10, 100, 75], + }, + { + points: [50, 10, 10, 110, 110, 110, 74, 10], + box: [40.38, 10, 41.59, 75], + }, + { + points: [10, 30, 35, 60, 110, 110, 60, 10], + box: [10, 10, 66.82, 59.37], + }, + { + points: [210, 70, 10, 10, 190, 10, 120, 90], + box: [112.02, 27.23, 97.98, 62.77], + }, + { + points: [20, 10, 210, 90, 10, 90, 100, 38], + box: [20, 10, 85.33, 64.06], + }, + { + points: [60, 14, 10, 14, 90, 14, 70, 14], + box: [43.28, 14, 30.01, 0], + }, + { + points: [10, 60, 20, 100, 100, 20, 110, 60], + box: [10, 48.45, 100, 23.1], + }, +]; +function cubic(options) { + const points = options.params.points; + const box = options.params.box; + const ctx = createContext(options); + const [x0, y0, x1, y1, x2, y2, x3, y3] = points; + let [bx, by, bw, bh] = box; + rect(ctx, '#0f0', 5, bx, by, bw, bh); + const bboxComp = new BoundingBoxComputation(); + bboxComp.addBezierCurve(x0, y0, x1, y1, x2, y2, x3, y3); + [bx, by, bw, bh] = [bboxComp.getX1(), bboxComp.getY1(), bboxComp.width(), bboxComp.height()]; + rect(ctx, '#00f', 3, bx, by, bw, bh); + const o = [0, x0, -y0, 3, x3, -y3, x1, -y1, x2, -y2]; + const bbox = Glyph.getOutlineBoundingBox(o, 1, 0, 0); + rect(ctx, '#fa0', 1, bbox.getX(), bbox.getY(), bbox.getW(), bbox.getH()); + ctx.setLineWidth(1); + ctx.fillStyle = '#000'; + Glyph.renderOutline(ctx, o, 1, 0, 0); + ctx.strokeStyle = '#f00'; + ctx.beginPath(); + ctx.moveTo(x0, y0); + ctx.lineTo(x1, y1); + ctx.lineTo(x2, y2); + ctx.lineTo(x3, y3); + ctx.stroke(); + ok(Math.abs(bboxComp.getX1() - box[0]) < 0.01, `Bad X1: ${bboxComp.getX1()}`); + ok(Math.abs(bboxComp.getY1() - box[1]) < 0.01, `Bad Y1: ${bboxComp.getY1()}`); + ok(Math.abs(bboxComp.width() - box[2]) < 0.01, `Bad width: ${bboxComp.width()}`); + ok(Math.abs(bboxComp.height() - box[3]) < 0.01, `Bad height: ${bboxComp.height()}`); + ok(Math.abs(bbox.getX() - box[0]) < 0.01, `Bad X: ${bbox.getX()}`); + ok(Math.abs(bbox.getY() - box[1]) < 0.01, `Bad Y: ${bbox.getY()}`); + ok(Math.abs(bbox.getW() - box[2]) < 0.01, `Bad W: ${bbox.getW()}`); + ok(Math.abs(bbox.getH() - box[3]) < 0.01, `Bad H: ${bbox.getH()}`); +} +VexFlowTests.register(BoundingBoxComputationTests); +export { BoundingBoxComputationTests }; diff --git a/build/esm/tests/chordsymbol_tests.js b/build/esm/tests/chordsymbol_tests.js new file mode 100644 index 0000000000..5a43d5e13b --- /dev/null +++ b/build/esm/tests/chordsymbol_tests.js @@ -0,0 +1,320 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Accidental } from '../src/accidental.js'; +import { ChordSymbol } from '../src/chordsymbol.js'; +import { Formatter } from '../src/formatter.js'; +import { Stave } from '../src/stave.js'; +import { StaveNote } from '../src/stavenote.js'; +const ChordSymbolTests = { + Start() { + QUnit.module('ChordSymbol'); + const run = VexFlowTests.runTests; + run('Chord Symbol Font Size Tests', fontSize); + run('Chord Symbol Kerning Tests', kern); + run('Top Chord Symbols', top); + run('Top Chord Symbols Justified', topJustify); + run('Bottom Chord Symbols', bottom); + run('Bottom Stem Down Chord Symbols', bottomStemDown); + run('Double Bottom Chord Symbols', doubleBottom); + }, +}; +const superscript = { symbolModifier: ChordSymbol.symbolModifiers.SUPERSCRIPT }; +const subscript = { symbolModifier: ChordSymbol.symbolModifiers.SUBSCRIPT }; +const note = (factory, keys, duration, chordSymbol) => factory.StaveNote({ keys, duration }).addModifier(chordSymbol, 0); +function fontSize(options) { + const f = VexFlowTests.makeFactory(options, 750, 580); + const ctx = f.getContext(); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + function draw(chords, y) { + const stave = f.Stave({ x: 10, y, width: 450 }).addClef('treble'); + const notes = [ + note(f, ['c/4'], 'q', chords[0]), + note(f, ['c/4'], 'q', chords[1]), + note(f, ['c/4'], 'q', chords[2]), + note(f, ['c/4'], 'q', chords[3]), + ]; + const score = f.EasyScore(); + const voice = score.voice(notes, { time: '4/4' }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + } + let chords = []; + chords.push(f + .ChordSymbol({ fontSize: 10 }) + .addText('F7') + .addGlyph('leftParenTall') + .addGlyphOrText('b9', superscript) + .addGlyphOrText('#11', subscript) + .addGlyph('rightParenTall') + .setReportWidth(false)); + chords.push(f + .ChordSymbol({ fontSize: 12 }) + .addText('F7') + .addGlyphOrText('b9', superscript) + .addGlyphOrText('#11', subscript) + .setReportWidth(false)); + chords.push(f + .ChordSymbol({ fontSize: 14 }) + .addText('F7') + .addGlyph('leftParenTall') + .addGlyphOrText('add 3', superscript) + .addGlyphOrText('omit 9', subscript) + .addGlyph('rightParenTall') + .setReportWidth(false)); + chords.push(f + .ChordSymbol({ fontSize: 16 }) + .addText('F7') + .addGlyph('leftParenTall') + .addGlyphOrText('b9', superscript) + .addGlyphOrText('#11', subscript) + .addGlyph('rightParenTall') + .setReportWidth(false)); + draw(chords, 40); + chords = []; + chords.push(f + .ChordSymbol({ fontSize: 10 }) + .setFontSize(10) + .addText('F7') + .addGlyphOrText('#11', superscript) + .addGlyphOrText('b9', subscript)); + chords.push(f.ChordSymbol({ fontSize: 12 }).addText('F7').addGlyphOrText('#11', superscript).addGlyphOrText('b9', subscript)); + chords.push(f.ChordSymbol({ fontSize: 14 }).addText('F7').addGlyphOrText('#11', superscript).addGlyphOrText('b9', subscript)); + chords.push(f + .ChordSymbol({ fontSize: 16 }) + .setFontSize(16) + .addText('F7') + .addGlyphOrText('#11', superscript) + .addGlyphOrText('b9', subscript)); + draw(chords, 140); + chords = [ + f.ChordSymbol({ fontSize: 10 }).addGlyphOrText('Ab').addGlyphOrText('7(#11b9)', superscript), + f.ChordSymbol({ fontSize: 14 }).addGlyphOrText('C#').addGlyphOrText('7(#11b9)', superscript), + f.ChordSymbol({ fontSize: 16 }).addGlyphOrText('Ab').addGlyphOrText('7(#11b9)', superscript), + f.ChordSymbol({ fontSize: 18 }).addGlyphOrText('C#').addGlyphOrText('7(#11b9)', superscript), + ]; + draw(chords, 240); + ok(true, 'Font Size Chord Symbol'); +} +function kern(options) { + const f = VexFlowTests.makeFactory(options, 650, 650); + const ctx = f.getContext(); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + function draw(chords, y) { + const stave = f.Stave({ x: 10, y, width: 450 }).addClef('treble').setContext(ctx).draw(); + const notes = [ + note(f, ['C/4'], 'q', chords[0]), + note(f, ['C/4'], 'q', chords[1]), + note(f, ['C/4'], 'q', chords[2]), + note(f, ['C/4'], 'q', chords[3]), + ]; + const score = f.EasyScore(); + const voice = score.voice(notes, { time: '4/4' }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + } + let chords = [ + f.ChordSymbol().addText('A').addGlyphSuperscript('dim').setReportWidth(false), + f.ChordSymbol({ kerning: false, reportWidth: false }).addText('A').addGlyphSuperscript('dim'), + f.ChordSymbol({ hJustify: 'left', reportWidth: false }).addText('C').addGlyph('halfDiminished', superscript), + f.ChordSymbol({ reportWidth: false }).addText('D').addGlyph('halfDiminished', superscript), + ]; + draw(chords, 10); + chords = [ + f.ChordSymbol().addText('A').addGlyphSuperscript('dim'), + f.ChordSymbol({ kerning: false }).addText('A').addGlyphSuperscript('dim'), + f.ChordSymbol().addText('A').addGlyphSuperscript('+').addTextSuperscript('5'), + f.ChordSymbol().addText('G').addGlyphSuperscript('+').addTextSuperscript('5'), + ]; + draw(chords, 110); + chords = [ + f.ChordSymbol().addText('A').addGlyph('-'), + f.ChordSymbol().addText('E').addGlyph('-'), + f.ChordSymbol().addText('A').addGlyphOrText('(#11)', superscript), + f.ChordSymbol().addText('E').addGlyphOrText('(#9)', superscript), + ]; + draw(chords, 210); + chords = [ + f.ChordSymbol().addGlyphOrText('F/B').addGlyphOrText('b', superscript), + f.ChordSymbol().addText('E').addGlyphOrText('V/V'), + f.ChordSymbol().addText('A').addGlyphOrText('(#11)', superscript), + f.ChordSymbol().addText('E').addGlyphOrText('(#9)', superscript), + ]; + draw(chords, 310); + ok(true, 'Chord Symbol Kerning Tests'); +} +function top(options) { + const f = VexFlowTests.makeFactory(options, 650, 650); + const ctx = f.getContext(); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + function draw(c1, c2, y) { + const stave = f.Stave({ x: 10, y, width: 450 }).addClef('treble').setContext(ctx).draw(); + const notes = [ + note(f, ['e/4', 'a/4', 'd/5'], 'h', c1).addModifier(new Accidental('b'), 0), + note(f, ['c/4', 'e/4', 'b/4'], 'h', c2), + ]; + const score = f.EasyScore(); + const voice = score.voice(notes, { time: '4/4' }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + } + let chord1 = f + .ChordSymbol({ reportWidth: false }) + .addText('F7') + .setHorizontal('left') + .addGlyphOrText('(#11b9)', superscript); + let chord2 = f + .ChordSymbol({ reportWidth: false }) + .addText('C') + .setHorizontal('left') + .addGlyphSuperscript('majorSeventh'); + draw(chord1, chord2, 40); + chord1 = f + .ChordSymbol() + .addText('F7') + .addTextSuperscript('(') + .addGlyphOrText('#11b9', superscript) + .addTextSuperscript(')'); + chord2 = f.ChordSymbol().addText('C').setHorizontal('left').addTextSuperscript('Maj.'); + draw(chord1, chord2, 140); + chord1 = f + .ChordSymbol() + .addText('F7') + .setHorizontal('left') + .addGlyphOrText('#11', superscript) + .addGlyphOrText('b9', subscript); + chord2 = f.ChordSymbol().addText('C').addTextSuperscript('sus4'); + draw(chord1, chord2, 240); + ok(true, 'Top Chord Symbol'); +} +function topJustify(options) { + const f = VexFlowTests.makeFactory(options, 500, 680); + const ctx = f.getContext(); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + function draw(chord1, chord2, y) { + const stave = new Stave(10, y, 450).addClef('treble').setContext(ctx).draw(); + const notes = [ + note(f, ['e/4', 'a/4', 'd/5'], 'h', chord1).addModifier(new Accidental('b'), 0), + note(f, ['c/4', 'e/4', 'B/4'], 'h', chord2), + ]; + Formatter.FormatAndDraw(ctx, stave, notes); + } + let chord1 = f.ChordSymbol().addText('F7').setHorizontal('left').addGlyphOrText('(#11b9)', superscript); + let chord2 = f.ChordSymbol({ hJustify: 'left' }).addText('C').addGlyphSuperscript('majorSeventh'); + draw(chord1, chord2, 40); + chord1 = f + .ChordSymbol({ hJustify: 'center' }) + .addText('F7') + .setHorizontal('left') + .addGlyphOrText('(#11b9)', superscript); + chord2 = f.ChordSymbol({ hJustify: 'center' }).addText('C').addTextSuperscript('Maj.'); + draw(chord1, chord2, 140); + chord1 = f + .ChordSymbol({ hJustify: 'right' }) + .addText('F7') + .setHorizontal('left') + .addGlyphOrText('#11', superscript) + .addGlyphOrText('b9', subscript); + chord2 = f.ChordSymbol({ hJustify: 'right' }).addText('C').addTextSuperscript('Maj.'); + draw(chord1, chord2, 240); + chord1 = f + .ChordSymbol({ hJustify: 'left' }) + .addText('F7') + .setHorizontal('left') + .addGlyphOrText('#11', superscript) + .addGlyphOrText('b9', subscript); + chord2 = f.ChordSymbol({ hJustify: 'centerStem' }).addText('C').addTextSuperscript('Maj.'); + draw(chord1, chord2, 340); + ok(true, 'Top Chord Justified'); +} +function bottom(options) { + const f = VexFlowTests.makeFactory(options, 600, 230); + const ctx = f.getContext(); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + function draw(chords, y) { + const stave = new Stave(10, y, 400).addClef('treble').setContext(ctx).draw(); + const notes = [ + note(f, ['c/4', 'f/4', 'a/4'], 'q', chords[0]), + note(f, ['c/4', 'e/4', 'b/4'], 'q', chords[1]).addModifier(new Accidental('b'), 2), + note(f, ['c/4', 'e/4', 'g/4'], 'q', chords[2]), + note(f, ['c/4', 'f/4', 'a/4'], 'q', chords[3]).addModifier(new Accidental('#'), 1), + ]; + Formatter.FormatAndDraw(ctx, stave, notes); + } + const chords = [ + f.ChordSymbol({ vJustify: 'bottom' }).addText('I').addTextSuperscript('6').addTextSubscript('4'), + f.ChordSymbol({ vJustify: 'bottom' }).addGlyphOrText('V'), + f.ChordSymbol({ vJustify: 'bottom' }).addLine(12), + f.ChordSymbol({ vJustify: 'bottom' }).addGlyphOrText('V/V'), + ]; + draw(chords, 10); + ok(true, 'Bottom Chord Symbol'); +} +function bottomStemDown(options) { + const f = VexFlowTests.makeFactory(options, 600, 330); + const ctx = f.getContext(); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + function draw(chords, y) { + const note = (keys, duration, chordSymbol) => new StaveNote({ keys, duration, stem_direction: -1 }).addModifier(chordSymbol, 0); + const stave = new Stave(10, y, 400).addClef('treble').setContext(ctx).draw(); + const notes = [ + note(['c/4', 'f/4', 'a/4'], 'q', chords[0]), + note(['c/4', 'e/4', 'b/4'], 'q', chords[1]).addModifier(new Accidental('b'), 2), + note(['c/4', 'e/4', 'g/4'], 'q', chords[2]), + note(['c/4', 'f/4', 'a/4'], 'q', chords[3]).addModifier(new Accidental('#'), 1), + ]; + Formatter.FormatAndDraw(ctx, stave, notes); + } + const chords = [ + f.ChordSymbol({ vJustify: 'bottom' }).addGlyphOrText('F'), + f.ChordSymbol({ vJustify: 'bottom' }).addGlyphOrText('C7'), + f.ChordSymbol({ vJustify: 'bottom' }).addLine(12), + f.ChordSymbol({ vJustify: 'bottom' }).addText('A').addGlyphSuperscript('dim'), + ]; + draw(chords, 10); + ok(true, 'Bottom Stem Down Chord Symbol'); +} +function doubleBottom(options) { + const f = VexFlowTests.makeFactory(options, 600, 260); + const ctx = f.getContext(); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + function draw(chords, chords2, y) { + const note = (keys, duration, chordSymbol1, chordSymbol2) => new StaveNote({ keys, duration }).addModifier(chordSymbol1, 0).addModifier(chordSymbol2, 0); + const stave = new Stave(10, y, 450).addClef('treble').setContext(ctx).draw(); + const notes = [ + note(['c/4', 'f/4', 'a/4'], 'q', chords[0], chords2[0]), + note(['c/4', 'e/4', 'b/4'], 'q', chords[1], chords2[1]).addModifier(new Accidental('b'), 2), + note(['c/4', 'e/4', 'g/4'], 'q', chords[2], chords2[2]), + note(['c/4', 'f/4', 'a/4'], 'q', chords[3], chords2[3]).addModifier(new Accidental('#'), 1), + ]; + Formatter.FormatAndDraw(ctx, stave, notes); + } + const chords1 = [ + f.ChordSymbol({ vJustify: 'bottom' }).addText('I').addTextSuperscript('6').addTextSubscript('4'), + f.ChordSymbol({ vJustify: 'bottom' }).addGlyphOrText('V'), + f.ChordSymbol({ vJustify: 'bottom' }).addLine(12), + f.ChordSymbol({ vJustify: 'bottom' }).addGlyphOrText('V/V'), + ]; + const chords2 = [ + f.ChordSymbol({ vJustify: 'bottom' }).addText('T'), + f.ChordSymbol({ vJustify: 'bottom' }).addText('D'), + f.ChordSymbol({ vJustify: 'bottom' }).addText('D'), + f.ChordSymbol({ vJustify: 'bottom' }).addText('SD'), + ]; + draw(chords1, chords2, 10); + ok(true, '2 Bottom Chord Symbol'); +} +VexFlowTests.register(ChordSymbolTests); +export { ChordSymbolTests }; diff --git a/build/esm/tests/clef_tests.js b/build/esm/tests/clef_tests.js new file mode 100644 index 0000000000..230c60d2d9 --- /dev/null +++ b/build/esm/tests/clef_tests.js @@ -0,0 +1,131 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +const ClefTests = { + Start() { + QUnit.module('Clef'); + const run = VexFlowTests.runTests; + run('Clef Test', draw); + run('Clef End Test', drawEnd); + run('Small Clef Test', drawSmall); + run('Small Clef End Test', drawSmallEnd); + run('Clef Change Test', drawClefChange); + }, +}; +function draw(options) { + const f = VexFlowTests.makeFactory(options, 800, 120); + f.Stave() + .addClef('treble') + .addClef('treble', 'default', '8va') + .addClef('treble', 'default', '8vb') + .addClef('alto') + .addClef('tenor') + .addClef('soprano') + .addClef('bass') + .addClef('bass', 'default', '8vb') + .addClef('mezzo-soprano') + .addClef('baritone-c') + .addClef('baritone-f') + .addClef('subbass') + .addClef('percussion') + .addClef('french') + .addEndClef('treble'); + f.draw(); + ok(true, 'all pass'); +} +function drawEnd(options) { + const f = VexFlowTests.makeFactory(options, 800, 120); + f.Stave() + .addClef('bass') + .addEndClef('treble') + .addEndClef('treble', 'default', '8va') + .addEndClef('treble', 'default', '8vb') + .addEndClef('alto') + .addEndClef('tenor') + .addEndClef('soprano') + .addEndClef('bass') + .addEndClef('bass', 'default', '8vb') + .addEndClef('mezzo-soprano') + .addEndClef('baritone-c') + .addEndClef('baritone-f') + .addEndClef('subbass') + .addEndClef('percussion') + .addEndClef('french'); + f.draw(); + ok(true, 'all pass'); +} +function drawSmall(options) { + const f = VexFlowTests.makeFactory(options, 800, 120); + f.Stave() + .addClef('treble', 'small') + .addClef('treble', 'small', '8va') + .addClef('treble', 'small', '8vb') + .addClef('alto', 'small') + .addClef('tenor', 'small') + .addClef('soprano', 'small') + .addClef('bass', 'small') + .addClef('bass', 'small', '8vb') + .addClef('mezzo-soprano', 'small') + .addClef('baritone-c', 'small') + .addClef('baritone-f', 'small') + .addClef('subbass', 'small') + .addClef('percussion', 'small') + .addClef('french', 'small') + .addEndClef('treble', 'small'); + f.draw(); + ok(true, 'all pass'); +} +function drawSmallEnd(options) { + const f = VexFlowTests.makeFactory(options, 800, 120); + f.Stave() + .addClef('bass', 'small') + .addEndClef('treble', 'small') + .addEndClef('treble', 'small', '8va') + .addEndClef('treble', 'small', '8vb') + .addEndClef('alto', 'small') + .addEndClef('tenor', 'small') + .addEndClef('soprano', 'small') + .addEndClef('bass', 'small') + .addEndClef('bass', 'small', '8vb') + .addEndClef('mezzo-soprano', 'small') + .addEndClef('baritone-c', 'small') + .addEndClef('baritone-f', 'small') + .addEndClef('subbass', 'small') + .addEndClef('percussion', 'small') + .addEndClef('french', 'small'); + f.draw(); + ok(true, 'all pass'); +} +function drawClefChange(options) { + const f = VexFlowTests.makeFactory(options, 800, 180); + const stave = f.Stave().addClef('treble'); + const notes = [ + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'treble' }), + f.ClefNote({ type: 'alto', options: { size: 'small' } }), + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'alto' }), + f.ClefNote({ type: 'tenor', options: { size: 'small' } }), + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'tenor' }), + f.ClefNote({ type: 'soprano', options: { size: 'small' } }), + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'soprano' }), + f.ClefNote({ type: 'bass', options: { size: 'small' } }), + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'bass' }), + f.ClefNote({ type: 'mezzo-soprano', options: { size: 'small' } }), + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'mezzo-soprano' }), + f.ClefNote({ type: 'baritone-c', options: { size: 'small' } }), + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'baritone-c' }), + f.ClefNote({ type: 'baritone-f', options: { size: 'small' } }), + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'baritone-f' }), + f.ClefNote({ type: 'subbass', options: { size: 'small' } }), + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'subbass' }), + f.ClefNote({ type: 'french', options: { size: 'small' } }), + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'french' }), + f.ClefNote({ type: 'treble', options: { size: 'small', annotation: '8vb' } }), + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'treble', octave_shift: -1 }), + f.ClefNote({ type: 'treble', options: { size: 'small', annotation: '8va' } }), + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'treble', octave_shift: 1 }), + ]; + const voice = f.Voice({ time: '12/4' }).addTickables(notes); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'all pass'); +} +VexFlowTests.register(ClefTests); +export { ClefTests }; diff --git a/build/esm/tests/curve_tests.js b/build/esm/tests/curve_tests.js new file mode 100644 index 0000000000..2a6f501162 --- /dev/null +++ b/build/esm/tests/curve_tests.js @@ -0,0 +1,118 @@ +import { concat, VexFlowTests } from './vexflow_test_helpers.js'; +import { CurvePosition } from '../src/curve.js'; +const CurveTests = { + Start() { + QUnit.module('Curve'); + const run = VexFlowTests.runTests; + run('Simple Curve', simple); + run('Rounded Curve', rounded); + run('Thick Thin Curves', thickThin); + run('Top Curve', top); + }, +}; +function createTest(noteGroup1, noteGroup2, setupCurves) { + return (options) => { + const factory = VexFlowTests.makeFactory(options, 350, 200); + const stave = factory.Stave({ y: 50 }); + const score = factory.EasyScore(); + const staveNotes = [ + score.beam(score.notes(...noteGroup1)), + score.beam(score.notes(...noteGroup2)), + ].reduce(concat); + setupCurves(factory, staveNotes); + const voices = [score.voice(staveNotes, { time: '4/4' })]; + factory.Formatter().joinVoices(voices).formatToStave(voices, stave); + factory.draw(); + ok('Simple Curve'); + }; +} +const simple = createTest(['c4/8, f5, d5, g5', { stem: 'up' }], ['d6/8, f5, d5, g5', { stem: 'down' }], (f, notes) => { + f.Curve({ + from: notes[0], + to: notes[3], + options: { + cps: [ + { x: 0, y: 10 }, + { x: 0, y: 50 }, + ], + }, + }); + f.Curve({ + from: notes[4], + to: notes[7], + options: { + cps: [ + { x: 0, y: 10 }, + { x: 0, y: 20 }, + ], + }, + }); +}); +const rounded = createTest(['c5/8, f4, d4, g5', { stem: 'up' }], ['d5/8, d6, d6, g5', { stem: 'down' }], (f, notes) => { + f.Curve({ + from: notes[0], + to: notes[3], + options: { + x_shift: -10, + y_shift: 30, + cps: [ + { x: 0, y: 20 }, + { x: 0, y: 50 }, + ], + }, + }); + f.Curve({ + from: notes[4], + to: notes[7], + options: { + cps: [ + { x: 0, y: 50 }, + { x: 0, y: 50 }, + ], + }, + }); +}); +const thickThin = createTest(['c5/8, f4, d4, g5', { stem: 'up' }], ['d5/8, d6, d6, g5', { stem: 'down' }], (f, notes) => { + f.Curve({ + from: notes[0], + to: notes[3], + options: { + thickness: 10, + x_shift: -10, + y_shift: 30, + cps: [ + { x: 0, y: 20 }, + { x: 0, y: 50 }, + ], + }, + }); + f.Curve({ + from: notes[4], + to: notes[7], + options: { + thickness: 0, + cps: [ + { x: 0, y: 50 }, + { x: 0, y: 50 }, + ], + }, + }); +}); +const top = createTest(['c5/8, f4, d4, g5', { stem: 'up' }], ['d5/8, d6, d6, g5', { stem: 'down' }], (f, notes) => { + f.Curve({ + from: notes[0], + to: notes[7], + options: { + x_shift: -3, + y_shift: 10, + position: CurvePosition.NEAR_TOP, + position_end: CurvePosition.NEAR_HEAD, + cps: [ + { x: 0, y: 20 }, + { x: 40, y: 80 }, + ], + }, + }); +}); +VexFlowTests.register(CurveTests); +export { CurveTests }; diff --git a/build/esm/tests/dot_tests.js b/build/esm/tests/dot_tests.js new file mode 100644 index 0000000000..5b9bac424e --- /dev/null +++ b/build/esm/tests/dot_tests.js @@ -0,0 +1,123 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Beam } from '../src/beam.js'; +import { Dot } from '../src/dot.js'; +import { Formatter } from '../src/formatter.js'; +import { ModifierContext } from '../src/modifiercontext.js'; +import { Note } from '../src/note.js'; +import { Stave } from '../src/stave.js'; +import { StaveNote } from '../src/stavenote.js'; +import { TickContext } from '../src/tickcontext.js'; +import { Voice } from '../src/voice.js'; +const DotTests = { + Start() { + QUnit.module('Dot'); + const run = VexFlowTests.runTests; + run('Basic', basic); + run('Multi Voice', multiVoice); + }, +}; +function showOneNote(note1, stave, ctx, x) { + const modifierContext = new ModifierContext(); + note1.setStave(stave).addToModifierContext(modifierContext); + new TickContext().addTickable(note1).preFormat().setX(x); + note1.setContext(ctx).draw(); + Note.plotMetrics(ctx, note1, 140); +} +function basic(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 1000, 240); + ctx.setFillStyle('#221'); + ctx.setStrokeStyle('#221'); + const stave = new Stave(10, 10, 975); + stave.setContext(ctx); + stave.draw(); + const notes = [ + new StaveNote({ keys: ['c/4', 'e/4', 'a/4', 'b/4'], duration: 'w' }), + new StaveNote({ keys: ['a/4', 'b/4', 'c/5'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['g/4', 'a/4', 'b/4'], duration: '4', stem_direction: -1 }), + new StaveNote({ keys: ['e/4', 'f/4', 'b/4', 'c/5'], duration: '4' }), + new StaveNote({ + keys: ['g/4', 'a/4', 'd/5', 'e/5', 'g/5'], + duration: '4', + stem_direction: -1, + }), + new StaveNote({ keys: ['g/4', 'b/4', 'd/5', 'e/5'], duration: '4', stem_direction: -1 }), + new StaveNote({ keys: ['e/4', 'g/4', 'b/4', 'c/5'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['d/4', 'e/4', 'f/4', 'a/4', 'c/5', 'e/5', 'g/5'], duration: '2' }), + new StaveNote({ + keys: ['f/4', 'g/4', 'a/4', 'b/4', 'c/5', 'e/5', 'g/5'], + duration: '16', + stem_direction: -1, + }), + new StaveNote({ keys: ['f/4', 'g/4', 'a/4', 'b/4', 'c/5', 'e/5', 'g/5'], duration: '16', stem_direction: 1 }), + new StaveNote({ + keys: ['e/4', 'g/4', 'a/4', 'b/4', 'c/5', 'e/5', 'f/5'], + duration: '16', + stem_direction: 1, + }), + new StaveNote({ + keys: ['e/4', 'g/4', 'a/4', 'b/4', 'c/5'], + duration: '16', + stem_direction: 1, + }), + new StaveNote({ keys: ['e/4', 'a/4', 'b/4', 'c/5'], duration: '16', stem_direction: 1 }), + ]; + Dot.buildAndAttach(notes, { all: true }); + Dot.buildAndAttach([notes[7], notes[8], notes[9]], { all: true }); + Dot.buildAndAttach([notes[8], notes[9]], { all: true }); + const beam = new Beam(notes.slice(notes.length - 2)); + for (let i = 0; i < notes.length; i++) { + showOneNote(notes[i], stave, ctx, 30 + i * 65); + const dots = notes[i].getModifiersByType('Dot'); + ok(dots.length > 0, 'Note ' + i + ' has dots'); + for (let j = 0; j < dots.length; ++j) { + ok(dots[j].getWidth() > 0, 'Dot ' + j + ' has width set'); + } + } + beam.setContext(ctx).draw(); + VexFlowTests.plotLegendForNoteWidth(ctx, 890, 140); + ok(true, 'Full Dot'); +} +function multiVoice(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 750, 300); + ctx.setFillStyle('#221'); + ctx.setStrokeStyle('#221'); + const stave = new Stave(30, 45, 700).setContext(ctx).draw(); + const notes1 = [ + new StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: '2', stem_direction: -1 }), + new StaveNote({ keys: ['c/4', 'e/4', 'c/5'], duration: '2', stem_direction: -1 }), + new StaveNote({ keys: ['d/4', 'c/5', 'd/5'], duration: '2', stem_direction: -1 }), + new StaveNote({ keys: ['d/4', 'c/5', 'd/5'], duration: '8', stem_direction: -1 }), + new StaveNote({ keys: ['d/4', 'c/5', 'd/5'], duration: '8', stem_direction: -1 }), + ]; + Dot.buildAndAttach([notes1[0], notes1[2], notes1[3], notes1[4]], { all: true }); + Dot.buildAndAttach([notes1[0], notes1[2], notes1[3], notes1[4]], { all: true }); + Dot.buildAndAttach([notes1[1]], { index: 0 }); + Dot.buildAndAttach([notes1[1]], { index: 0 }); + Dot.buildAndAttach([notes1[1]], { index: 1 }); + Dot.buildAndAttach([notes1[1]], { index: 1 }); + Dot.buildAndAttach([notes1[1]], { index: 2 }); + Dot.buildAndAttach([notes1[1]], { index: 2 }); + Dot.buildAndAttach([notes1[1]], { index: 2 }); + Dot.buildAndAttach([notes1[2], notes1[3], notes1[4]]); + const notes2 = [ + new StaveNote({ keys: ['d/5', 'a/5', 'b/5'], duration: '2', stem_direction: 1 }), + new StaveNote({ keys: ['d/5', 'a/5', 'b/5'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['d/5', 'a/5', 'b/5'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['d/5', 'g/5', 'a/5', 'b/5'], duration: '8', stem_direction: 1 }), + new StaveNote({ keys: ['d/5', 'a/5', 'b/5'], duration: '8', stem_direction: 1 }), + ]; + Dot.buildAndAttach(notes2, { all: true }); + Dot.buildAndAttach([notes2[1]], { all: true }); + const voice1 = new Voice().setMode(Voice.Mode.SOFT).addTickables(notes1); + const voice2 = new Voice().setMode(Voice.Mode.SOFT).addTickables(notes2); + const formatter = new Formatter().joinVoices([voice1, voice2]); + formatter.format([voice1, voice2], 700); + voice1.draw(ctx, stave); + voice2.draw(ctx, stave); + notes1.forEach((note) => Note.plotMetrics(ctx, note, 190)); + notes2.forEach((note) => Note.plotMetrics(ctx, note, 20)); + VexFlowTests.plotLegendForNoteWidth(ctx, 620, 220); + ok(true, 'Full Dot'); +} +VexFlowTests.register(DotTests); +export { DotTests }; diff --git a/build/esm/tests/easyscore_tests.js b/build/esm/tests/easyscore_tests.js new file mode 100644 index 0000000000..0eb14b98fe --- /dev/null +++ b/build/esm/tests/easyscore_tests.js @@ -0,0 +1,459 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Articulation } from '../src/articulation.js'; +import { EasyScore } from '../src/easyscore.js'; +import { FretHandFinger } from '../src/frethandfinger.js'; +import { Modifier } from '../src/modifier.js'; +import { Parenthesis } from '../src/parenthesis.js'; +import { StaveConnector } from '../src/staveconnector.js'; +import { Stem } from '../src/stem.js'; +import { Tuplet } from '../src/tuplet.js'; +const EasyScoreTests = { + Start() { + QUnit.module('EasyScore'); + test('Basic', basic); + test('Accidentals', accidentals); + test('Durations', durations); + test('Chords', chords); + test('Dots', dots); + test('Types', types); + test('Options', options); + const run = VexFlowTests.runTests; + run('Draw Basic', drawBasicTest); + run('Draw Basic Muted', drawBasicMutedTest); + run('Draw Basic Harmonic', drawBasicHarmonicTest); + run('Draw Basic Slash', drawBasicSlashTest); + run('Draw Ghostnote Basic', drawGhostBasicTest); + run('Draw Ghostnote Dotted', drawGhostDottedTest); + run('Draw Parenthesised', drawParenthesisedTest); + run('Draw Accidentals', drawAccidentalsTest); + run('Draw Beams', drawBeamsTest); + run('Draw Tuplets', drawTupletsTest); + run('Draw Dots', drawDotsTest); + run('Draw Options', drawOptionsTest); + run('Draw Fingerings', drawFingeringsTest); + run('Keys', keys); + }, +}; +function createShortcuts(score) { + return { + voice: score.voice.bind(score), + notes: score.notes.bind(score), + beam: score.beam.bind(score), + tuplet: score.tuplet.bind(score), + }; +} +function basic() { + const score = new EasyScore(); + const mustPass = ['c4', 'c#4', 'c4/r', 'c#5', 'c3/m', 'c3//m', 'c3//h', 'c3/s', 'c3//s', 'c3/g', 'c3//g']; + const mustFail = ['', '()', '7', '(c#4 e5 g6']; + mustPass.forEach((line) => equal(score.parse(line).success, true, line)); + mustFail.forEach((line) => equal(score.parse(line).success, false, line)); +} +function accidentals() { + const score = new EasyScore(); + const mustPass = [ + 'c3', + 'c##3, cb3', + 'Cn3', + 'f3//m', + '(c##3 cbb3 cn3), cb3', + 'cbbs7', + 'cbb7', + 'cbss7', + 'cbs7', + 'cb7', + 'cdb7', + 'cd7', + 'c##7', + 'c#7', + 'cn7', + 'c++-7', + 'c++7', + 'c+-7', + 'c+7', + '(cbs3 bbs3 dbs3), ebs3', + '(cd7 cbb3 cn3), cb3', + 'co7', + 'ck7', + ]; + const mustFail = [ + 'ct3', + 'cdbb7', + '(cq cbb3 cn3), cb3', + '(cdd7 cbb3 cn3), cb3', + 'cbbbs7', + 'cbbss7', + 'cbsss7', + 'csbs7', + 'cddb7', + 'cddbb7', + 'cdd7', + 'c##b7', + 'c#bs7', + 'cnb#7', + 'c+#+b-d7', + 'c+--7', + 'c++--7', + 'c+++7', + 'cbk7', + 'cok7', + 'cko7', + 'c#s7', + ]; + mustPass.forEach((line) => equal(score.parse(line).success, true, line)); + mustFail.forEach((line) => equal(score.parse(line).success, false, line)); +} +function durations() { + const score = new EasyScore(); + const mustPass = ['c3/4', 'c##3/w, cb3', 'c##3/w, cb3/q', 'c##3/q, cb3/32', '(c##3 cbb3 cn3), cb3']; + const mustFail = ['Cn3/]', '/', '(cq cbb3 cn3), cb3', '(cdd7 cbb3 cn3), cb3']; + mustPass.forEach((line) => equal(score.parse(line).success, true, line)); + mustFail.forEach((line) => equal(score.parse(line).success, false, line)); +} +function chords() { + const score = new EasyScore(); + const mustPass = [ + '(c5)', + '(c3 e0 g9)', + '(c##4 cbb4 cn4)/w, (c#5 cb2 a3)/32', + '(d##4 cbb4 cn4)/w/r, (c#5 cb2 a3)', + '(c##4 cbb4 cn4)/4, (c#5 cb2 a3)', + '(c##4 cbb4 cn4)/m, (c#5 cb2 a3)', + ]; + const mustFail = ['(c)']; + mustPass.forEach((line) => equal(score.parse(line).success, true, line)); + mustFail.forEach((line) => equal(score.parse(line).success, false, line)); +} +function dots() { + const score = new EasyScore(); + const mustPass = [ + 'c3/4.', + 'c##3/w.., cb3', + 'f##3/s, cb3/q...', + 'c##3/q, cb3/32', + '(c##3 cbb3 cn3)., cb3', + '(c5).', + '(c##4 cbb4 cn4)/w.., (c#5 cb2 a3)/32', + ]; + const mustFail = ['.', 'c.#', 'c#4./4']; + mustPass.forEach((line) => equal(score.parse(line).success, true, line)); + mustFail.forEach((line) => equal(score.parse(line).success, false, line)); +} +function types() { + const score = new EasyScore(); + const mustPass = ['c3/4/m.', 'c##3//r.., cb3', 'c##3/m.., cb3', 'c##3/r.., cb3', 'd##3/w/s, cb3/q...', 'Fb4']; + const mustFail = ['c4/q/U', '(c##4, cbb4 cn4)/w.., (c#5 cb2 a3)/32', 'z#3']; + mustPass.forEach((line) => equal(score.parse(line).success, true, line)); + mustFail.forEach((line) => equal(score.parse(line).success, false, line)); +} +function options() { + const score = new EasyScore(); + const mustPass = [ + 'c3/4.[foo="bar"]', + 'c##3/w.., cb3[id="blah"]', + 'c##3/q, cb3/32', + '(c##3 cbb3 cn3).[blah="bod4o"], cb3', + '(c5)[fooooo="booo"]', + 'c#5[id="foobar"]', + ]; + const mustFail = ['.[', 'f##3/w[], cb3/q...']; + mustPass.forEach((line) => equal(score.parse(line).success, true, line)); + mustFail.forEach((line) => equal(score.parse(line).success, false, line)); +} +function drawBasicTest(options) { + const f = VexFlowTests.makeFactory(options, 600, 350); + const score = f.EasyScore(); + const system = f.System(); + const { voice, notes } = createShortcuts(score); + system + .addStave({ + voices: [ + voice(notes('(d4 e4 g4)/q, c4/q, c4/q/r, c4/q', { stem: 'down' })), + voice(notes('c#5/h., c5/q', { stem: 'up' })), + ], + }) + .addClef('treble'); + system + .addStave({ + voices: [voice(notes('c#3/q, cn3/q, bb3/q, d##3/q', { clef: 'bass' }))], + }) + .addClef('bass'); + system.addConnector().setType(StaveConnector.type.BRACKET); + f.draw(); + expect(0); +} +function drawBasicMutedTest(options) { + const f = VexFlowTests.makeFactory(options, 600, 350); + const score = f.EasyScore(); + const system = f.System(); + const { voice, notes } = createShortcuts(score); + system + .addStave({ + voices: [ + voice(notes('(d4 e4 g4)/q/m, c4/q/m, c4/q/r, c4/q/m', { stem: 'down' })), + voice(notes('c#5/h/m., c5/q/m', { stem: 'up' })), + ], + }) + .addClef('treble'); + system + .addStave({ + voices: [voice(notes('c#3/q/m, cn3/q/m, bb3/q/m, d##3/q/m', { clef: 'bass' }))], + }) + .addClef('bass'); + system.addConnector().setType(StaveConnector.type.BRACKET); + f.draw(); + expect(0); +} +function drawBasicHarmonicTest(options) { + const f = VexFlowTests.makeFactory(options, 600, 350); + const score = f.EasyScore(); + const system = f.System(); + const { voice, notes } = createShortcuts(score); + system + .addStave({ + voices: [ + voice(notes('(d4 e4 g4)/q/h, c4/q/h, c4/q/r, c4/q/h', { stem: 'down' })), + voice(notes('c#5/h/h., c5/q/h', { stem: 'up' })), + ], + }) + .addClef('treble'); + system + .addStave({ + voices: [voice(notes('c#3/q/h, cn3/q/h, bb3/q/h, d##3/q/h', { clef: 'bass' }))], + }) + .addClef('bass'); + system.addConnector().setType(StaveConnector.type.BRACKET); + f.draw(); + expect(0); +} +function drawBasicSlashTest(options) { + const f = VexFlowTests.makeFactory(options, 600, 350); + const score = f.EasyScore(); + const system = f.System(); + const { voice, notes } = createShortcuts(score); + system + .addStave({ + voices: [ + voice(notes('(d4 e4 g4)/q/s, c4/q/s, c4/q/r, c4/q/s', { stem: 'down' })), + voice(notes('c#5/h/s., c5/q/s', { stem: 'up' })), + ], + }) + .addClef('treble'); + system + .addStave({ + voices: [voice(notes('c#3/q/s, cn3/q/s, bb3/q/s, d##3/q/s', { clef: 'bass' }))], + }) + .addClef('bass'); + system.addConnector().setType(StaveConnector.type.BRACKET); + f.draw(); + expect(0); +} +function drawGhostBasicTest(options) { + const f = VexFlowTests.makeFactory(options, 550); + const score = f.EasyScore(); + const system = f.System(); + system.addStave({ + voices: [ + score.voice([ + ...score.notes('f#5/4, f5, db5, c5', { stem: 'up' }), + ...score.beam(score.notes('c5/8, d5, fn5, e5', { stem: 'up' })), + ...score.beam(score.notes('d5, c5', { stem: 'up' })), + ], { time: '7/4' }), + score.voice(score.notes('c4/h/g, f4/4, c4/4/g, e4/4, c4/8/g, d##4/8, c4/8, c4/8', { stem: 'down' }), { + time: '7/4', + }), + ], + }); + f.draw(); + expect(0); +} +function drawGhostDottedTest(options) { + const f = VexFlowTests.makeFactory(options, 550); + const score = f.EasyScore(); + const system = f.System(); + system.addStave({ + voices: [ + score.voice([ + ...score.notes('c4/4/g., fbb5/8, d5/4', { stem: 'up' }), + ...score.beam(score.notes('c5/8, c#5/16, d5/16', { stem: 'up' })), + ...score.notes('c4/2/g.., fn5/8', { stem: 'up' }), + ], { time: '8/4' }), + score.voice([ + ...score.notes('f#4/4', { stem: 'down' }), + ...score.beam(score.notes('e4/8, d4/8', { stem: 'down' })), + ...score.notes('c4/4/g.., cb4/16, c#4/h, d4/4', { stem: 'down' }), + ...score.beam(score.notes('fn4/8, e4/8', { stem: 'down' })), + ], { time: '8/4' }), + ], + }); + f.draw(); + expect(0); +} +function drawParenthesisedTest(options) { + const f = VexFlowTests.makeFactory(options, 600, 350); + const score = f.EasyScore(); + const system = f.System(); + const { voice, notes } = createShortcuts(score); + const notes1 = notes('(d4 e4 g4)/q, c4/q, c4/q/r, c4/q', { stem: 'down' }); + Parenthesis.buildAndAttach([notes1[0], notes1[3]]); + const notes2 = notes('c#5/h., c5/q', { stem: 'down' }); + Parenthesis.buildAndAttach([notes2[0], notes2[1]]); + system + .addStave({ + voices: [voice(notes1), voice(notes2)], + }) + .addClef('treble'); + const notes3 = notes('c#3/q, cn3/q, bb3/q, d##3/q', { stem: 'down' }); + Parenthesis.buildAndAttach(notes3); + system + .addStave({ + voices: [voice(notes3)], + }) + .addClef('bass'); + system.addConnector().setType(StaveConnector.type.BRACKET); + f.draw(); + expect(0); +} +function drawAccidentalsTest(options) { + const f = VexFlowTests.makeFactory(options, 600, 350); + const score = f.EasyScore(); + const system = f.System(); + const { voice, notes } = createShortcuts(score); + system + .addStave({ + voices: [ + voice(notes('(cbbs4 ebb4 gbss4)/q, cbs4/q, cdb4/q/r, cd4/q', { stem: 'down' })), + voice(notes('c++-5/h., c++5/q', { stem: 'up' })), + ], + }) + .addClef('treble'); + system + .addStave({ + voices: [voice(notes('c+-3/q, c+3/q, bb3/q, d##3/q', { clef: 'bass' }))], + }) + .addClef('bass'); + system.addConnector().setType(StaveConnector.type.BRACKET); + f.draw(); + expect(0); +} +function drawBeamsTest(options) { + const f = VexFlowTests.makeFactory(options, 600, 250); + const score = f.EasyScore(); + const system = f.System(); + const { voice, notes, beam } = createShortcuts(score); + system + .addStave({ + voices: [ + voice(notes('(c4 e4 g4)/q, c4/q, c4/q/r, c4/q', { stem: 'down' })), + voice([...notes('c#5/h.', { stem: 'up' }), ...beam(notes('c5/8, c5/8', { stem: 'up' }))]), + ], + }) + .addClef('treble'); + f.draw(); + expect(0); +} +function drawTupletsTest(options) { + const f = VexFlowTests.makeFactory(options, 600, 250); + const score = f.EasyScore(); + const system = f.System(); + const { voice, notes, tuplet, beam } = createShortcuts(score); + const v1_tuplet = tuplet(notes('(c4 e4 g4)/q, cbb4/q, c4/q', { stem: 'down' }), { + location: Tuplet.LOCATION_BOTTOM, + }); + const v1_halfNote = notes('c4/h', { stem: 'down' }); + const v1 = voice([...v1_tuplet, ...v1_halfNote]); + const v2_halfNote = notes('c#5/h.', { stem: 'up' }); + const v2_tuplet = tuplet(beam(notes('cb5/8, cn5/8, c5/8', { stem: 'up' }))); + const v2 = voice([...v2_halfNote, ...v2_tuplet]); + system.addStave({ voices: [v1, v2] }).addClef('treble'); + f.draw(); + expect(0); +} +function drawDotsTest(options) { + const f = VexFlowTests.makeFactory(options, 600, 250); + const score = f.EasyScore(); + const system = f.System(); + const { voice, notes } = createShortcuts(score); + system + .addStave({ + voices: [voice(notes('(c4 e4 g4)/8., (c4 e4 g4)/8.., (c4 e4 g4)/8..., (c4 e4 g4)/8...., (c4 e4 g4)/16...'))], + }) + .addClef('treble'); + f.draw(); + expect(0); +} +function drawOptionsTest(options) { + const f = VexFlowTests.makeFactory(options, 500, 200); + const score = f.EasyScore(); + const system = f.System(); + const notes = score.notes('B4/h[id="foobar", class="red,bold", stem="up", articulations="staccato.below,tenuto"], B4/q[articulations="accent.above"], B4/q[stem="down"]'); + system.addStave({ voices: [score.voice(notes)] }); + f.draw(); + const note0 = notes[0]; + const note1 = notes[1]; + const note0_modifier0 = note0.getModifiers()[0]; + const note0_modifier1 = note0.getModifiers()[1]; + const note1_modifier0 = note1.getModifiers()[0]; + equal(note0.getAttribute('id'), 'foobar'); + ok(note0.hasClass('red')); + ok(note0.hasClass('bold')); + equal(note0_modifier0.getCategory(), Articulation.CATEGORY); + equal(note0_modifier0.type, 'a.'); + equal(note0_modifier0.getPosition(), Modifier.Position.BELOW); + equal(note0_modifier1.getCategory(), Articulation.CATEGORY); + equal(note0_modifier1.type, 'a-'); + equal(note0_modifier1.getPosition(), Modifier.Position.ABOVE); + equal(note0.getStemDirection(), Stem.UP); + equal(note1_modifier0.getCategory(), Articulation.CATEGORY); + equal(note1_modifier0.type, 'a>'); + equal(note1_modifier0.getPosition(), Modifier.Position.ABOVE); + equal(notes[2].getStemDirection(), Stem.DOWN); +} +function drawFingeringsTest(options) { + const f = VexFlowTests.makeFactory(options, 500, 200); + const score = f.EasyScore(); + const system = f.System(); + const notes = score.notes('C4/q[fingerings="1"], E4[fingerings="3.above"], G4[fingerings="5.below"], (C4 E4 G4)[fingerings="1,3,5"]'); + system.addStave({ voices: [score.voice(notes)] }); + f.draw(); + const note0_modifier0 = notes[0].getModifiers()[0]; + equal(note0_modifier0.getCategory(), FretHandFinger.CATEGORY); + equal(note0_modifier0.getFretHandFinger(), '1'); + equal(note0_modifier0.getPosition(), Modifier.Position.LEFT); + const note1_modifier0 = notes[1].getModifiers()[0]; + equal(note1_modifier0.getCategory(), FretHandFinger.CATEGORY); + equal(note1_modifier0.getFretHandFinger(), '3'); + equal(note1_modifier0.getPosition(), Modifier.Position.ABOVE); + const note2_modifier0 = notes[2].getModifiers()[0]; + equal(note2_modifier0.getCategory(), FretHandFinger.CATEGORY); + equal(note2_modifier0.getFretHandFinger(), '5'); + equal(note2_modifier0.getPosition(), Modifier.Position.BELOW); + const note3_modifiers = notes[3].getModifiers(); + const note3_modifier0 = note3_modifiers[0]; + const note3_modifier1 = note3_modifiers[1]; + const note3_modifier2 = note3_modifiers[2]; + equal(note3_modifier0.getCategory(), FretHandFinger.CATEGORY); + equal(note3_modifier0.getFretHandFinger(), '1'); + equal(note3_modifier0.getPosition(), Modifier.Position.LEFT); + equal(note3_modifier1.getCategory(), FretHandFinger.CATEGORY); + equal(note3_modifier1.getFretHandFinger(), '3'); + equal(note3_modifier1.getPosition(), Modifier.Position.LEFT); + equal(note3_modifier2.getCategory(), FretHandFinger.CATEGORY); + equal(note3_modifier2.getFretHandFinger(), '5'); + equal(note3_modifier2.getPosition(), Modifier.Position.LEFT); +} +function keys(options) { + const f = VexFlowTests.makeFactory(options, 500, 200); + const score = f.EasyScore(); + const notes = score.notes('c#3/q, c##3, cb3, cbb3, cn3, c3, cbbs3, cbss3, cbs3, cdb3, cd3, c++-3, c++3, c+-3, c+3, co3, ck3'); + equal(notes[0].keys, 'c#/3'); + equal(notes[1].keys, 'c##/3'); + equal(notes[2].keys, 'cb/3'); + equal(notes[3].keys, 'cbb/3'); + equal(notes[4].keys, 'cn/3'); + for (let i = 5; i < notes.length; i++) { + equal(notes[i].keys, 'c/3'); + } +} +VexFlowTests.register(EasyScoreTests); +export { EasyScoreTests }; diff --git a/build/esm/tests/factory_tests.js b/build/esm/tests/factory_tests.js new file mode 100644 index 0000000000..0d03e28937 --- /dev/null +++ b/build/esm/tests/factory_tests.js @@ -0,0 +1,44 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Factory } from '../src/factory.js'; +import { Barline } from '../src/stavebarline.js'; +const FactoryTests = { + Start() { + QUnit.module('Factory'); + test('Defaults', defaults); + const run = VexFlowTests.runTests; + run('Draw', draw); + run('Draw Tab (repeat barlines must be aligned)', drawTab); + }, +}; +function defaults() { + throws(() => new Factory({ renderer: { elementId: '', width: 700, height: 500 } }), 'Empty string for elementId throws an exception.'); + const factory = new Factory({ + renderer: { elementId: null, width: 700, height: 500 }, + }); + const options = factory.options; + equal(options.renderer.width, 700); + equal(options.renderer.height, 500); + equal(options.renderer.elementId, null); + equal(options.stave.space, 10); +} +function draw(options) { + const f = Factory.newFromElementId(options.elementId); + f.Stave().setClef('treble'); + f.draw(); + expect(0); +} +function drawTab(options) { + const factory = VexFlowTests.makeFactory(options, 500, 400); + const system = factory.System({ width: 500 }); + const stave = factory.Stave().setClef('treble').setKeySignature('C#').setBegBarType(Barline.type.REPEAT_BEGIN); + const voices = [factory.Voice().addTickables([factory.GhostNote({ duration: 'w' })])]; + system.addStave({ stave, voices }); + const tabStave = factory.TabStave().setClef('tab').setBegBarType(Barline.type.REPEAT_BEGIN); + const tabVoices = [factory.Voice().addTickables([factory.GhostNote({ duration: 'w' })])]; + system.addStave({ stave: tabStave, voices: tabVoices }); + factory.draw(); + equal(stave.getModifiers()[0].getX(), tabStave.getModifiers()[0].getX()); + expect(1); +} +VexFlowTests.register(FactoryTests); +export { FactoryTests }; diff --git a/build/esm/tests/font_tests.js b/build/esm/tests/font_tests.js new file mode 100644 index 0000000000..510f724e16 --- /dev/null +++ b/build/esm/tests/font_tests.js @@ -0,0 +1,135 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Accidental } from '../src/accidental.js'; +import { Bend } from '../src/bend.js'; +import { CanvasContext } from '../src/canvascontext.js'; +import { Element } from '../src/element.js'; +import { Flow } from '../src/flow.js'; +import { Font, FontStyle, FontWeight } from '../src/font.js'; +import { PedalMarking } from '../src/pedalmarking.js'; +import { StaveNote } from '../src/stavenote.js'; +import { TextBracket } from '../src/textbracket.js'; +import { TextNote } from '../src/textnote.js'; +import { Voice } from '../src/voice.js'; +const FontTests = { + Start() { + QUnit.module('Font'); + test('setFont', setFont); + test('Parsing', fontParsing); + test('Sizes', fontSizes); + const run = VexFlowTests.runTests; + run('Set Text Font to Georgia', setTextFontToGeorgia); + run('Set Music Font to Petaluma', setMusicFontToPetaluma); + }, +}; +function setFont() { + const canvas = document.createElement('canvas'); + canvas.width = 800; + canvas.height = 400; + const ctx = new CanvasContext(canvas.getContext('2d')); + ctx.setFont('PetalumaScript', '100px', 'normal', 'italic'); + equal(ctx.font, 'italic 100px PetalumaScript'); + const voice = new Voice(); + propEqual(voice.fontInfo, Element.TEXT_FONT); + voice.setFont('bold 32pt Arial'); + const fontInfo = voice.fontInfo; + equal(fontInfo === null || fontInfo === void 0 ? void 0 : fontInfo.size, '32pt'); + const flat = new Accidental('b'); + equal(flat.textFont, undefined); + flat.setFont(undefined, undefined, undefined, FontStyle.ITALIC); + equal(flat.getFont(), 'italic 10pt Arial, sans-serif'); + flat.setFont(undefined, undefined, FontWeight.BOLD, undefined); + equal(flat.getFont(), 'bold 10pt Arial, sans-serif'); + flat.setFont(undefined, undefined, FontWeight.BOLD, FontStyle.ITALIC); + equal(flat.getFont(), 'italic bold 10pt Arial, sans-serif'); + flat.setFont(undefined, undefined, FontWeight.BOLD, 'oblique'); + equal(flat.getFont(), 'oblique bold 10pt Arial, sans-serif'); + flat.setFont(undefined, undefined, 'normal', ''); + equal(flat.getFont(), '10pt Arial, sans-serif'); +} +function fontParsing() { + const b = new Bend('1/2', true); + const bFont = b.fontInfo; + equal(bFont === null || bFont === void 0 ? void 0 : bFont.family, Font.SANS_SERIF); + equal(bFont === null || bFont === void 0 ? void 0 : bFont.size, Font.SIZE); + equal(bFont === null || bFont === void 0 ? void 0 : bFont.weight, FontWeight.NORMAL); + equal(bFont === null || bFont === void 0 ? void 0 : bFont.style, FontStyle.NORMAL); + const f1 = 'Roboto Slab, serif'; + const t = new TextNote({ duration: '4', font: { family: f1 } }); + equal(f1, t.fontInfo.family); + const n1 = new StaveNote({ keys: ['e/5'], duration: '4' }); + const n2 = new StaveNote({ keys: ['c/5'], duration: '4' }); + const tb = new TextBracket({ start: n1, stop: n2 }); + const f2 = tb.fontInfo; + equal(f2 === null || f2 === void 0 ? void 0 : f2.size, 15); + equal(f2 === null || f2 === void 0 ? void 0 : f2.style, FontStyle.ITALIC); + const f3 = Font.fromCSSString(`bold 1.5em/3 "Lucida Sans Typewriter", "Lucida Console", Consolas, monospace`); + const f3SizeInPx = Font.convertSizeToPixelValue(f3.size); + equal(f3SizeInPx, 24); +} +function fontSizes() { + { + const size = '17px'; + const sizeInEm = Font.convertSizeToPixelValue(size) / Font.scaleToPxFrom.em; + equal(sizeInEm, 1.0625); + } + { + const size = '2em'; + const sizeInPx = Font.convertSizeToPixelValue(size); + equal(sizeInPx, 32); + } + { + const pedal = new PedalMarking([]); + equal(pedal.getFont(), 'italic bold 12pt Times New Roman, serif'); + equal(pedal.fontSizeInPoints, 12); + equal(pedal.fontSizeInPixels, 16); + const doubledSizePx = pedal.fontSizeInPixels * 2; + equal(doubledSizePx, 32); + const doubledSizePt = Font.scaleSize(pedal.fontSizeInPoints, 2); + equal(doubledSizePt, 24); + equal(Font.scaleSize('1.5em', 3), '4.5em'); + } +} +function setTextFontToGeorgia(options) { + const factory = VexFlowTests.makeFactory(options, 400, 200); + const stave = factory.Stave({ y: 40 }); + const score = factory.EasyScore(); + const voice1 = score.voice([ + factory.StaveNote({ keys: ['c/4', 'e/4', 'a/4'], stem_direction: -1, duration: 'h' }), + factory.StaveNote({ keys: ['d/4', 'f/4'], stem_direction: -1, duration: 'q' }), + factory.StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: 'q' }), + ]); + const defaultFont = TextNote.TEXT_FONT; + TextNote.TEXT_FONT = { + family: 'Georgia, Courier New, serif', + size: 14, + weight: 'bold', + style: 'italic', + }; + const voice2 = score.voice([ + factory + .TextNote({ text: 'Here are some fun lyrics...', duration: 'w' }) + .setJustification(TextNote.Justification.LEFT), + ]); + const formatter = factory.Formatter(); + formatter.joinVoices([voice1, voice2]).formatToStave([voice1, voice2], stave); + factory.draw(); + TextNote.TEXT_FONT = defaultFont; + ok(true); +} +function setMusicFontToPetaluma(options) { + Flow.setMusicFont('Petaluma'); + const factory = VexFlowTests.makeFactory(options, 400, 200); + const stave = factory.Stave({ y: 40 }); + const score = factory.EasyScore(); + const voice = score.voice([ + factory.StaveNote({ keys: ['c/4', 'e/4', 'a/4'], stem_direction: -1, duration: 'h' }), + factory.StaveNote({ keys: ['d/4', 'f/4'], stem_direction: -1, duration: 'q' }), + factory.StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: 'q' }), + ]); + const formatter = factory.Formatter(); + formatter.joinVoices([voice]).formatToStave([voice], stave); + factory.draw(); + ok(true); +} +VexFlowTests.register(FontTests); +export { FontTests }; diff --git a/build/esm/tests/formatter/framestack.js b/build/esm/tests/formatter/framestack.js new file mode 100644 index 0000000000..87b85af75b --- /dev/null +++ b/build/esm/tests/formatter/framestack.js @@ -0,0 +1,61 @@ +"use strict"; +class FrameStack { + constructor(parentEl, numFrames, params) { + this.parentEl = parentEl; + this.numFrames = numFrames; + this.options = Object.assign({ prefix: 'vex-frame-', width: 700, height: 800, iterationCallback: null }, params); + this.frames = []; + this.currentFrame = 0; + document.getElementById(this.parentEl).innerHTML = ''; + for (let i = 0; i < this.numFrames; i++) { + const div = document.createElement('div'); + div.id = this.frameID(i); + div.style.position = 'absolute'; + div.style.top = 0; + div.style.left = 0; + div.style.width = `${this.options.width}px`; + div.style.height = `${this.options.height}px`; + div.style.display = 'none'; + this.frames[i] = div; + } + } + frameID(i) { + return `${this.options.prefix}${i}`; + } + install() { + this.show(0); + setTimeout(() => { + const fragment = document.createDocumentFragment(); + for (let i = 0; i < this.numFrames; i++) { + fragment.appendChild(this.frames[i]); + } + const parent = document.getElementById(this.parentEl); + parent.appendChild(fragment); + parent.style.width = `${this.options.width}px`; + parent.style.height = `${this.options.height}px`; + }, 0); + } + get(i) { + return this.frames[i]; + } + show(i) { + this.frames[this.currentFrame].style.display = 'none'; + this.frames[i].style.display = 'block'; + this.currentFrame = i; + } + start(params) { + const options = Object.assign({ start: 0, end: this.numFrames, intervalms: 100 }, params); + this.animationTimer = setInterval(() => { + const frame = this.currentFrame + 1 === this.numFrames ? 0 : this.currentFrame + 1; + this.show(frame); + if (this.options.iterationCallback) + this.options.iterationCallback(frame); + }, options.intervalms); + } + stop() { + clearInterval(this.animationTimer); + } +} +if (typeof module != 'undefined') { + module.exports = { FrameStack }; +} diff --git a/build/esm/tests/formatter/tests.js b/build/esm/tests/formatter/tests.js new file mode 100644 index 0000000000..4140ad78db --- /dev/null +++ b/build/esm/tests/formatter/tests.js @@ -0,0 +1,203 @@ +"use strict"; +const VF = Vex.Flow; +function subgroup(el, iterations, params) { + const options = Object.assign({ systemWidth: 550, debug: true }, params); + const f = new VF.Factory({ + renderer: { + elementId: el, + width: options.width, + height: options.height, + }, + }); + f.StaveNote = f.StaveNote.bind(f); + const stave1 = f.Stave({ x: 15, y: 40, width: options.systemWidth }).setClef('treble'); + const notes1 = [ + { keys: ['f/5'], stem_direction: 1, duration: '4' }, + { keys: ['d/4'], stem_direction: 1, duration: '4', clef: 'bass' }, + { keys: ['c/5'], stem_direction: 1, duration: '4', clef: 'alto' }, + { keys: ['c/5'], stem_direction: 1, duration: '4', clef: 'soprano' }, + ].map(f.StaveNote); + const notes2 = [ + { keys: ['c/4'], stem_direction: -1, duration: '4' }, + { keys: ['c/3'], stem_direction: -1, duration: '4', clef: 'bass' }, + { keys: ['d/4'], stem_direction: -1, duration: '4', clef: 'alto' }, + { keys: ['f/4'], stem_direction: -1, duration: '4', clef: 'soprano' }, + ].map(f.StaveNote); + const stave2 = f.Stave({ x: 15, y: 160, width: options.systemWidth }).setClef('bass'); + const notes3 = [ + { keys: ['e/3'], duration: '8', stem_direction: -1, clef: 'bass' }, + { keys: ['g/4'], duration: '8', stem_direction: 1, clef: 'treble' }, + { keys: ['d/4'], duration: '8', stem_direction: 1, clef: 'treble' }, + { keys: ['f/4'], duration: '8', stem_direction: 1, clef: 'treble' }, + { keys: ['c/4'], duration: '8', stem_direction: 1, clef: 'treble' }, + { keys: ['g/3'], duration: '8', stem_direction: -1, clef: 'bass' }, + { keys: ['d/3'], duration: '8', stem_direction: -1, clef: 'bass' }, + { keys: ['f/3'], duration: '8', stem_direction: -1, clef: 'bass' }, + ].map(f.StaveNote); + f.StaveConnector({ top_stave: stave1, bottom_stave: stave2, type: 'brace' }); + f.StaveConnector({ top_stave: stave1, bottom_stave: stave2, type: 'singleLeft' }); + f.StaveConnector({ top_stave: stave1, bottom_stave: stave2, type: 'singleRight' }); + function addAccidental(note, acc) { + return note.addModifier(f.Accidental({ type: acc }), 0); + } + function addSubGroup(note, subNotes) { + return note.addModifier(f.NoteSubGroup({ notes: subNotes }), 0); + } + f.Beam({ notes: notes3.slice(1, 4) }); + f.Beam({ notes: notes3.slice(5) }); + addAccidental(notes1[1], '#'); + addSubGroup(notes1[1], [f.ClefNote({ type: 'bass', options: { size: 'small' } }), f.TimeSigNote({ time: '3/4' })]); + addSubGroup(notes2[2], [f.ClefNote({ type: 'alto', options: { size: 'small' } }), f.TimeSigNote({ time: '9/8' })]); + addSubGroup(notes1[3], [f.ClefNote({ type: 'soprano', options: { size: 'small' } })]); + addSubGroup(notes3[1], [f.ClefNote({ type: 'treble', options: { size: 'small' } })]); + addSubGroup(notes3[5], [f.ClefNote({ type: 'bass', options: { size: 'small' } })]); + addAccidental(notes3[0], '#'); + addAccidental(notes3[3], 'b'); + addAccidental(notes3[5], '#'); + addAccidental(notes1[2], 'b'); + addAccidental(notes2[3], '#'); + const voice = f.Voice().addTickables(notes1); + const voice2 = f.Voice().addTickables(notes2); + const voice3 = f.Voice().addTickables(notes3); + const formatter = f.Formatter(); + formatter.joinVoices([voice, voice2]).joinVoices([voice3]).formatToStave([voice, voice2, voice3], stave1); + for (let i = 0; i < iterations; i++) { + formatter.tune({ alpha: 0.01 }); + } + f.draw(); + if (options.debug) { + VF.Formatter.plotDebugging(f.getContext(), formatter, stave1.getNoteStartX(), 20, 320); + } +} +function tuplets(el, iterations, params) { + const options = Object.assign({ systemWidth: 500, debug: true }, params); + const f = new VF.Factory({ + renderer: { + elementId: el, + width: options.width, + height: options.height, + }, + }); + const system = f.System({ + x: 50, + width: options.systemWidth, + debugFormatter: options.debug, + formatIterations: iterations, + }); + const score = f.EasyScore(); + const newVoice = function (notes) { + return score.voice(notes, { time: '1/4' }); + }; + const newStave = function (voice) { + return system + .addStave({ voices: [voice], debugNoteMetrics: options.debug }) + .addClef('treble') + .addTimeSignature('1/4'); + }; + const voices = [ + score.notes('c5/8, c5'), + score.tuplet(score.notes('a4/8, a4, a4'), { notes_occupied: 2 }), + score.notes('c5/16, c5, c5, c5'), + score.tuplet(score.notes('a4/16, a4, a4, a4, a4'), { notes_occupied: 4 }), + score.tuplet(score.notes('a4/32, a4, a4, a4, a4, a4, a4'), { notes_occupied: 8 }), + ]; + voices.map(newVoice).forEach(newStave); + system.addConnector().setType(VF.StaveConnector.type.BRACKET); + f.draw(); +} +function multistave(el, iterations, params) { + const options = Object.assign({ systemWidth: 550, debug: true, justify: true, alpha: 0.1 }, params); + const f = new VF.Factory({ + renderer: { + elementId: el, + width: options.width, + height: options.height, + }, + }); + const score = f.EasyScore(); + const stave11 = f.Stave({ y: 20, width: 275 }).addTrebleGlyph().addTimeSignature('6/8'); + const notes11 = score.notes('f4/4, d4/8, g4/4, eb4/8'); + const voice11 = score.voice(notes11, { time: '6/8' }); + const stave21 = f.Stave({ y: 130, width: 275 }).addTrebleGlyph().addTimeSignature('6/8'); + const notes21 = score.notes('d4/8, d4, d4, d4, eb4, eb4'); + const voice21 = score.voice(notes21, { time: '6/8' }); + const stave31 = f.Stave({ y: 250, width: 275 }).addClef('bass').addTimeSignature('6/8'); + const notes31 = score.notes('a5/8, a5, a5, a5, a5, a5', { stem: 'down' }); + const voice31 = score.voice(notes31, { time: '6/8' }); + f.StaveConnector({ + top_stave: stave21, + bottom_stave: stave31, + type: 'brace', + }); + f.Beam({ notes: notes21.slice(0, 3) }); + f.Beam({ notes: notes21.slice(3, 6) }); + f.Beam({ notes: notes31.slice(0, 3) }); + f.Beam({ notes: notes31.slice(3, 6) }); + let formatter = f.Formatter().joinVoices([voice11]).joinVoices([voice21]).joinVoices([voice31]); + if (options.justify) { + formatter.formatToStave([voice11, voice21, voice31], stave11); + } + else { + formatter.format([voice11, voice21, voice31], 0); + } + for (let i = 0; i < iterations; i++) { + formatter.tune({ alphs: options.alpha }); + } + if (options.debug) { + VF.Formatter.plotDebugging(f.getContext(), formatter, stave11.getNoteStartX(), 20, 320); + } + const stave12 = f.Stave({ + x: stave11.width + stave11.x, + y: stave11.y, + width: stave11.width, + }); + var notes12 = score.notes('ab4/4, bb4/8, (cb5 eb5)/4[stem="down"], d5/8[stem="down"]'); + var voice12 = score.voice(notes12, { time: '6/8' }); + f.Stave({ + x: stave21.width + stave21.x, + y: stave21.y, + width: stave21.width, + }); + var notes22 = score.notes('(eb4 ab4)/4., (c4 eb4 ab4)/4, db5/8', { stem: 'up' }); + var voice22 = score.voice(notes22, { time: '6/8' }); + f.Stave({ + x: stave31.width + stave31.x, + y: stave31.y, + width: stave31.width, + }); + var notes32 = score.notes('a5/8, a5, a5, a5, a5, a5', { stem: 'down' }); + var voice32 = score.voice(notes32, { time: '6/8' }); + formatter = f.Formatter().joinVoices([voice12]).joinVoices([voice22]).joinVoices([voice32]); + if (options.justify) { + formatter.formatToStave([voice12, voice22, voice32], stave12); + } + else { + formatter.format([voice12, voice22, voice32], 0); + } + for (var j = 0; j < iterations; j++) { + formatter.tune({ alpha: options.alpha }); + } + f.Beam({ notes: notes32.slice(0, 3) }); + f.Beam({ notes: notes32.slice(3, 6) }); + f.draw(); + if (options.debug) { + VF.Formatter.plotDebugging(f.getContext(), formatter, stave12.getNoteStartX(), 20, 320); + } +} +const Tests = { + tuplets: { + options: { width: 600, height: 750, debug: true }, + fn: tuplets, + }, + subgroup: { + options: { width: 650, height: 350, debug: true }, + fn: subgroup, + }, + multistave: { + options: { width: 650, height: 350, debug: true }, + fn: multistave, + }, +}; +if (typeof module != 'undefined') { + module.exports = Tests; +} diff --git a/build/esm/tests/formatter_tests.js b/build/esm/tests/formatter_tests.js new file mode 100644 index 0000000000..9bed803bd0 --- /dev/null +++ b/build/esm/tests/formatter_tests.js @@ -0,0 +1,669 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Accidental } from '../src/accidental.js'; +import { Annotation, AnnotationVerticalJustify } from '../src/annotation.js'; +import { Articulation } from '../src/articulation.js'; +import { Beam } from '../src/beam.js'; +import { Bend } from '../src/bend.js'; +import { Dot } from '../src/dot.js'; +import { Flow } from '../src/flow.js'; +import { Font, FontWeight } from '../src/font.js'; +import { Formatter } from '../src/formatter.js'; +import { FretHandFinger } from '../src/frethandfinger.js'; +import { ModifierPosition } from '../src/modifier.js'; +import { Note } from '../src/note.js'; +import { Registry } from '../src/registry.js'; +import { Stave } from '../src/stave.js'; +import { StaveConnector } from '../src/staveconnector.js'; +import { StaveNote } from '../src/stavenote.js'; +import { Stem } from '../src/stem.js'; +import { StringNumber } from '../src/stringnumber.js'; +import { Tables } from '../src/tables.js'; +import { Tuplet } from '../src/tuplet.js'; +import { Voice } from '../src/voice.js'; +import { MockTickable } from './mocks.js'; +const FormatterTests = { + Start() { + QUnit.module('Formatter'); + test('TickContext Building', buildTickContexts); + const run = VexFlowTests.runTests; + run('Whitespace and justify', rightJustify); + run('Notehead padding', noteHeadPadding); + run('Justification and alignment with accidentals', accidentalJustification); + run('Long measure taking full space', longMeasureProblems); + run('Vertical alignment - few unaligned beats', unalignedNoteDurations1); + run('Vertical alignment - many unaligned beats', unalignedNoteDurations2, { globalSoftmax: false }); + run('Vertical alignment - many unaligned beats (global softmax)', unalignedNoteDurations2, { globalSoftmax: true }); + run('Vertical alignment - many mixed elements', alignedMixedElements, { globalSoftmax: true }); + run('StaveNote - Justification', justifyStaveNotes); + run('Notes with Tab', notesWithTab); + run('Multiple Staves - Justified', multiStaves, { debug: true }); + run('Softmax', softMax); + run('Mixtime', mixTime); + run('Tight', tightNotes1); + run('Tight 2', tightNotes2); + run('Annotations', annotations); + run('Proportional Formatting - No Tuning', proportional, { debug: true, iterations: 0 }); + run('Proportional Formatting - No Justification', proportional, { justify: false, debug: true, iterations: 0 }); + run('Proportional Formatting (20 iterations)', proportional, { debug: true, iterations: 20, alpha: 0.5 }); + }, +}; +function getGlyphWidth(glyphName) { + const musicFont = Tables.currentMusicFont(); + const glyph = musicFont.getGlyphs()[glyphName]; + const widthInEm = (glyph.x_max - glyph.x_min) / musicFont.getResolution(); + return widthInEm * 38 * Font.scaleToPxFrom.pt; +} +function buildTickContexts() { + function createTickable(beat) { + return new MockTickable().setTicks(beat); + } + const BEAT = (1 * Flow.RESOLUTION) / 4; + const tickables1 = [ + createTickable(BEAT).setWidth(10), + createTickable(BEAT * 2).setWidth(20), + createTickable(BEAT).setWidth(30), + ]; + const tickables2 = [ + createTickable(BEAT * 2).setWidth(10), + createTickable(BEAT).setWidth(20), + createTickable(BEAT).setWidth(30), + ]; + const voice1 = new Voice(Flow.TIME4_4); + const voice2 = new Voice(Flow.TIME4_4); + voice1.addTickables(tickables1); + voice2.addTickables(tickables2); + const formatter = new Formatter(); + const tContexts = formatter.createTickContexts([voice1, voice2]); + equal(tContexts.list.length, 4, 'Voices should have four tick contexts'); + throws(() => formatter.getMinTotalWidth(), /NoMinTotalWidth/, 'Expected to throw exception'); + ok(formatter.preCalculateMinTotalWidth([voice1, voice2]), 'Successfully runs preCalculateMinTotalWidth'); + equal(formatter.getMinTotalWidth(), 88, 'Get minimum total width without passing voices'); + formatter.preFormat(); + equal(formatter.getMinTotalWidth(), 88, 'Minimum total width'); + equal(tickables1[0].getX(), tickables2[0].getX(), 'First notes of both voices have the same X'); + equal(tickables1[2].getX(), tickables2[2].getX(), 'Last notes of both voices have the same X'); + ok(tickables1[1].getX() < tickables2[1].getX(), 'Second note of voice 2 is to the right of the second note of voice 1'); +} +function rightJustify(options) { + const f = VexFlowTests.makeFactory(options, 1200, 300); + const getTickables = (time, n, duration) => { + const tickar = []; + let i = 0; + for (i = 0; i < n; ++i) { + tickar.push(new StaveNote({ keys: ['f/4'], duration })); + } + return new Voice(time).addTickables(tickar); + }; + const renderTest = (time, n, duration, x, width) => { + const formatter = f.Formatter(); + const stave = f.Stave({ x, y: 40, width }); + const voice = getTickables(time, n, duration); + formatter.joinVoices([voice]).formatToStave([voice], stave); + stave.draw(); + voice.draw(f.getContext(), stave); + }; + renderTest({ num_beats: 4, beat_value: 4, resolution: 4 * 4096 }, 2, '2', 10, 300); + renderTest({ num_beats: 4, beat_value: 4, resolution: 4 * 4096 }, 1, 'w', 310, 300); + renderTest({ num_beats: 3, beat_value: 4, resolution: 4 * 4096 }, 3, '4', 610, 300); + renderTest({ num_beats: 3, beat_value: 4, resolution: 4 * 4096 }, 6, '8', 910, 300); + ok(true); +} +function noteHeadPadding(options) { + const registry = new Registry(); + Registry.enableDefaultRegistry(registry); + const f = VexFlowTests.makeFactory(options, 600, 300); + const score = f.EasyScore(); + score.set({ time: '9/8' }); + const notes1 = score.notes('(d5 f5)/8,(c5 e5)/8,(d5 f5)/8,(c5 e5)/2.'); + const beams = [new Beam(notes1.slice(0, 3), true)]; + const voice1 = new Voice().setMode(Voice.Mode.SOFT); + const notes2 = score.notes('(g4 an4)/2.,(g4 a4)/4.', { clef: 'treble' }); + const voice2 = new Voice().setMode(Voice.Mode.SOFT); + voice2.addTickables(notes2); + voice1.addTickables(notes1); + const formatter = f.Formatter().joinVoices([voice1]).joinVoices([voice2]); + const width = formatter.preCalculateMinTotalWidth([voice1, voice2]); + formatter.format([voice1, voice2], width); + const staveWidth = width + Stave.defaultPadding; + const stave1 = f.Stave({ y: 50, width: staveWidth }); + const stave2 = f.Stave({ y: 150, width: staveWidth }); + stave1.draw(); + stave2.draw(); + voice1.draw(f.getContext(), stave1); + voice2.draw(f.getContext(), stave2); + beams.forEach((b) => b.setContext(f.getContext()).draw()); + ok(true); +} +function longMeasureProblems(options) { + const registry = new Registry(); + Registry.enableDefaultRegistry(registry); + const f = VexFlowTests.makeFactory(options, 1500, 300); + const score = f.EasyScore(); + score.set({ time: '4/4' }); + const notes1 = score.notes('b4/4,b4/8,b4/8,b4/4,b4/4,b4/2,b4/2,b4/4,b4/8,b4/8,b4/4,b4/4,b4/2,b4/2,b4/4,b4/8,b4/8,b4/4,b4/4,b4/2,b4/2,b4/4,b4/2,b4/8,b4/8'); + const voice1 = new Voice().setMode(Voice.Mode.SOFT); + const notes2 = score.notes('d3/4,(ab3 f4)/2,d3/4,ab3/4,d3/2,ab3/4,d3/4,ab3/2,d3/4,ab3/4,d3/2,ab3/4,d3/4,ab3/2,d3/4,ab3/4,d3/2,ab3/4,d4/4,d4/2,d4/4', { clef: 'bass' }); + const voice2 = new Voice().setMode(Voice.Mode.SOFT); + voice2.addTickables(notes2); + voice1.addTickables(notes1); + const formatter = f.Formatter().joinVoices([voice1]).joinVoices([voice2]); + const width = formatter.preCalculateMinTotalWidth([voice1, voice2]); + formatter.format([voice1, voice2], width); + const stave1 = f.Stave({ y: 50, width: width + Stave.defaultPadding }); + const stave2 = f.Stave({ y: 200, width: width + Stave.defaultPadding }); + stave1.draw(); + stave2.draw(); + voice1.draw(f.getContext(), stave1); + voice2.draw(f.getContext(), stave2); + ok(true); +} +function accidentalJustification(options) { + const f = VexFlowTests.makeFactory(options, 600, 300); + const score = f.EasyScore(); + const notes11 = score.notes('a4/2, a4/4, a4/8, ab4/16, an4/16'); + const voice11 = score.voice(notes11, { time: '4/4' }); + const notes21 = score.notes('c4/2, d4/8, d4/8, e4/8, e4/8'); + const voice21 = score.voice(notes21, { time: '4/4' }); + let beams = Beam.generateBeams(notes11.slice(2)); + beams = beams.concat(beams, Beam.generateBeams(notes21.slice(1, 3))); + beams = beams.concat(Beam.generateBeams(notes21.slice(3))); + const formatter = f.Formatter({ softmaxFactor: 100 }).joinVoices([voice11]).joinVoices([voice21]); + const width = formatter.preCalculateMinTotalWidth([voice11, voice21]); + const stave11 = f.Stave({ y: 20, width: width + Stave.defaultPadding }); + const stave21 = f.Stave({ y: 130, width: width + Stave.defaultPadding }); + formatter.format([voice11, voice21], width); + const ctx = f.getContext(); + stave11.setContext(ctx).draw(); + stave21.setContext(ctx).draw(); + voice11.draw(ctx, stave11); + voice21.draw(ctx, stave21); + beams.forEach((b) => b.setContext(ctx).draw()); + ok(true); +} +function unalignedNoteDurations1(options) { + const f = VexFlowTests.makeFactory(options, 600, 250); + const score = f.EasyScore(); + const notes11 = [ + new StaveNote({ keys: ['a/4'], duration: '8' }), + new StaveNote({ keys: ['b/4'], duration: '4' }), + new StaveNote({ keys: ['b/4'], duration: '8' }), + ]; + const notes21 = [ + new StaveNote({ keys: ['a/4'], duration: '16' }), + new StaveNote({ keys: ['b/4.'], duration: '4' }), + new StaveNote({ keys: ['a/4'], duration: '8d' }), + ]; + Dot.buildAndAttach([notes21[2]], { all: true }); + const ctx = f.getContext(); + const voice11 = score.voice(notes11, { time: '2/4' }).setMode(Voice.Mode.SOFT); + const voice21 = score.voice(notes21, { time: '2/4' }).setMode(Voice.Mode.SOFT); + const beams21 = Beam.generateBeams(notes21); + const beams11 = Beam.generateBeams(notes11); + const formatter = new Formatter(); + formatter.joinVoices([voice11]); + formatter.joinVoices([voice21]); + const width = formatter.preCalculateMinTotalWidth([voice11, voice21]); + const stave11 = f.Stave({ y: 20, width: width + Stave.defaultPadding }); + const stave21 = f.Stave({ y: 130, width: width + Stave.defaultPadding }); + formatter.format([voice11, voice21], width); + stave11.setContext(ctx).draw(); + stave21.setContext(ctx).draw(); + voice11.draw(ctx, stave11); + voice21.draw(ctx, stave21); + beams21.forEach((b) => b.setContext(ctx).draw()); + beams11.forEach((b) => b.setContext(ctx).draw()); + ok(voice11.getTickables()[1].getX() > voice21.getTickables()[1].getX()); +} +function unalignedNoteDurations2(options) { + const notes1 = [ + new StaveNote({ keys: ['b/4'], duration: '8r' }), + new StaveNote({ keys: ['g/4'], duration: '16' }), + new StaveNote({ keys: ['c/5'], duration: '16' }), + new StaveNote({ keys: ['e/5'], duration: '16' }), + new StaveNote({ keys: ['g/4'], duration: '16' }), + new StaveNote({ keys: ['c/5'], duration: '16' }), + new StaveNote({ keys: ['e/5'], duration: '16' }), + new StaveNote({ keys: ['b/4'], duration: '8r' }), + new StaveNote({ keys: ['g/4'], duration: '16' }), + new StaveNote({ keys: ['c/5'], duration: '16' }), + new StaveNote({ keys: ['e/5'], duration: '16' }), + new StaveNote({ keys: ['g/4'], duration: '16' }), + new StaveNote({ keys: ['c/5'], duration: '16' }), + new StaveNote({ keys: ['e/5'], duration: '16' }), + ]; + const notes2 = [ + new StaveNote({ keys: ['a/4'], duration: '16r' }), + new StaveNote({ keys: ['e/4.'], duration: '8d' }), + new StaveNote({ keys: ['e/4'], duration: '4' }), + new StaveNote({ keys: ['a/4'], duration: '16r' }), + new StaveNote({ keys: ['e/4.'], duration: '8d' }), + new StaveNote({ keys: ['e/4'], duration: '4' }), + ]; + const f = VexFlowTests.makeFactory(options, 750, 280); + const context = f.getContext(); + const voice1 = new Voice({ num_beats: 4, beat_value: 4 }); + voice1.addTickables(notes1); + const voice2 = new Voice({ num_beats: 4, beat_value: 4 }); + voice2.addTickables(notes2); + const formatter = new Formatter({ softmaxFactor: 100, globalSoftmax: options.params.globalSoftmax }); + formatter.joinVoices([voice1]); + formatter.joinVoices([voice2]); + const width = formatter.preCalculateMinTotalWidth([voice1, voice2]); + formatter.format([voice1, voice2], width); + const stave1 = new Stave(10, 40, width + Stave.defaultPadding); + const stave2 = new Stave(10, 100, width + Stave.defaultPadding); + stave1.setContext(context).draw(); + stave2.setContext(context).draw(); + voice1.draw(context, stave1); + voice2.draw(context, stave2); + ok(voice1.getTickables()[1].getX() > voice2.getTickables()[1].getX()); +} +function alignedMixedElements(options) { + const f = VexFlowTests.makeFactory(options, 800, 500); + const context = f.getContext(); + const stave = new Stave(10, 200, 400); + const stave2 = new Stave(410, 200, 400); + const notes = [ + new StaveNote({ keys: ['c/5'], duration: '8' }) + .addModifier(new Accidental('##'), 0) + .addModifier(new FretHandFinger('4').setPosition(ModifierPosition.BELOW), 0) + .addModifier(new StringNumber('3').setPosition(ModifierPosition.BELOW), 0) + .addModifier(new Articulation('a.').setPosition(ModifierPosition.BELOW), 0) + .addModifier(new Articulation('a>').setPosition(ModifierPosition.BELOW), 0) + .addModifier(new Articulation('a^').setPosition(ModifierPosition.BELOW), 0) + .addModifier(new Articulation('am').setPosition(ModifierPosition.BELOW), 0) + .addModifier(new Articulation('a@u').setPosition(ModifierPosition.BELOW), 0) + .addModifier(new Annotation('yyyy').setVerticalJustification(AnnotationVerticalJustify.BOTTOM), 0) + .addModifier(new Annotation('xxxx').setVerticalJustification(AnnotationVerticalJustify.BOTTOM).setFont('sans-serif', 20), 0) + .addModifier(new Annotation('ttt').setVerticalJustification(AnnotationVerticalJustify.BOTTOM).setFont('sans-serif', 20), 0), + new StaveNote({ keys: ['c/5'], duration: '8', stem_direction: Stem.DOWN }) + .addModifier(new StringNumber('3').setPosition(ModifierPosition.BELOW), 0) + .addModifier(new Articulation('a.').setPosition(ModifierPosition.BELOW), 0) + .addModifier(new Articulation('a>').setPosition(ModifierPosition.BELOW), 0), + new StaveNote({ keys: ['c/5'], duration: '8' }), + ]; + const notes2 = [ + new StaveNote({ keys: ['c/5'], duration: '8' }) + .addModifier(new StringNumber('3').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(new Articulation('a.').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(new Annotation('yyyy').setVerticalJustification(AnnotationVerticalJustify.TOP), 0), + new StaveNote({ keys: ['c/5'], duration: '8', stem_direction: Stem.DOWN }) + .addModifier(new FretHandFinger('4').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(new StringNumber('3').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(new Articulation('a.').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(new Articulation('a>').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(new Articulation('a^').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(new Articulation('am').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(new Articulation('a@u').setPosition(ModifierPosition.ABOVE), 0) + .addModifier(new Annotation('yyyy').setVerticalJustification(AnnotationVerticalJustify.TOP), 0) + .addModifier(new Annotation('xxxx').setVerticalJustification(AnnotationVerticalJustify.TOP).setFont('sans-serif', 20), 0) + .addModifier(new Annotation('ttt').setVerticalJustification(AnnotationVerticalJustify.TOP).setFont('sans-serif', 20), 0), + new StaveNote({ keys: ['c/5'], duration: '8' }), + ]; + const tuplet = new Tuplet(notes).setTupletLocation(-1); + const tuplet2 = new Tuplet(notes2).setTupletLocation(1); + Formatter.FormatAndDraw(context, stave, notes); + Formatter.FormatAndDraw(context, stave2, notes2); + stave.setContext(context).draw(); + stave2.setContext(context).draw(); + tuplet.setContext(context).draw(); + tuplet2.setContext(context).draw(); + ok(true); +} +function justifyStaveNotes(options) { + const f = VexFlowTests.makeFactory(options, 520, 280); + const ctx = f.getContext(); + const score = f.EasyScore(); + let y = 30; + function justifyToWidth(width) { + f.Stave({ y: y }).addClef('treble'); + const voices = [ + score.voice(score.notes('(cbb4 en4 a4)/2, (d4 e4 f4)/8, (d4 f4 a4)/8, (cn4 f#4 a4)/4', { stem: 'down' })), + score.voice(score.notes('(bb4 e#5 a5)/4, (d5 e5 f5)/2, (c##5 fb5 a5)/4', { stem: 'up' })), + ]; + f.Formatter() + .joinVoices(voices) + .format(voices, width - (Stave.defaultPadding + getGlyphWidth('gClef'))); + voices[0].getTickables().forEach((note) => Note.plotMetrics(ctx, note, y + 140)); + voices[1].getTickables().forEach((note) => Note.plotMetrics(ctx, note, y - 20)); + y += 210; + } + justifyToWidth(520); + f.draw(); + ok(true); +} +function notesWithTab(options) { + const f = VexFlowTests.makeFactory(options, 420, 580); + const score = f.EasyScore(); + let y = 10; + function justifyToWidth(width) { + const stave = f.Stave({ y: y }).addClef('treble'); + const voice = score.voice(score.notes('d#4/2, (c4 d4)/8, d4/8, (c#4 e4 a4)/4', { stem: 'up' })); + y += 100; + f.TabStave({ y: y }).addTabGlyph().setNoteStartX(stave.getNoteStartX()); + const tabVoice = score.voice([ + f.TabNote({ positions: [{ str: 3, fret: 6 }], duration: '2' }).addModifier(new Bend('Full'), 0), + f + .TabNote({ + positions: [ + { str: 2, fret: 3 }, + { str: 3, fret: 5 }, + ], + duration: '8', + }) + .addModifier(new Bend('Unison'), 1), + f.TabNote({ positions: [{ str: 3, fret: 7 }], duration: '8' }), + f.TabNote({ + positions: [ + { str: 3, fret: 6 }, + { str: 4, fret: 7 }, + { str: 2, fret: 5 }, + ], + duration: '4', + }), + ]); + f.Formatter().joinVoices([voice]).joinVoices([tabVoice]).format([voice, tabVoice], width); + y += 150; + } + justifyToWidth(0); + justifyToWidth(300); + f.draw(); + ok(true); +} +function multiStaves(options) { + const f = VexFlowTests.makeFactory(options, 600, 400); + const ctx = f.getContext(); + const score = f.EasyScore(); + const notes11 = score.notes('f4/4, d4/8, g4/4, eb4/8'); + const notes21 = score.notes('d4/8, d4, d4, d4, e4, eb4'); + const notes31 = score.notes('a5/8, a5, a5, a5, a5, a5', { stem: 'down' }); + let voices = [ + score.voice(notes11, { time: '6/8' }), + score.voice(notes21, { time: '6/8' }), + score.voice(notes31, { time: '6/8' }), + ]; + let formatter = f.Formatter(); + voices.forEach((v) => formatter.joinVoices([v])); + let width = formatter.preCalculateMinTotalWidth(voices); + formatter.format(voices, width); + let beams = [ + new Beam(notes21.slice(0, 3), true), + new Beam(notes21.slice(3, 6), true), + new Beam(notes31.slice(0, 3), true), + new Beam(notes31.slice(3, 6), true), + ]; + const staveYs = [20, 130, 250]; + let staveWidth = width + getGlyphWidth('gClef') + getGlyphWidth('timeSig8') + Stave.defaultPadding; + let staves = [ + f.Stave({ y: staveYs[0], width: staveWidth }).addClef('treble').addTimeSignature('6/8'), + f.Stave({ y: staveYs[1], width: staveWidth }).addClef('treble').addTimeSignature('6/8'), + f.Stave({ y: staveYs[2], width: staveWidth }).addClef('bass').addTimeSignature('6/8'), + ]; + f.StaveConnector({ + top_stave: staves[1], + bottom_stave: staves[2], + type: 'brace', + }); + for (let i = 0; i < staves.length; ++i) { + staves[i].setContext(ctx).draw(); + voices[i].draw(ctx, staves[i]); + } + beams.forEach((beam) => beam.setContext(ctx).draw()); + const notes12 = score.notes('ab4/4, bb4/8, (cb5 eb5)/4[stem="down"], d5/8[stem="down"]'); + const notes22 = score.notes('(eb4 ab4)/4., (c4 eb4 ab4)/4, db5/8', { stem: 'up' }); + const notes32 = score.notes('a5/8, a5, a5, a5, a5, a5', { stem: 'down' }); + voices = [ + score.voice(notes12, { time: '6/8' }), + score.voice(notes22, { time: '6/8' }), + score.voice(notes32, { time: '6/8' }), + ]; + formatter = f.Formatter(); + voices.forEach((v) => formatter.joinVoices([v])); + width = formatter.preCalculateMinTotalWidth(voices); + const staveX = staves[0].getX() + staves[0].getWidth(); + staveWidth = width + Stave.defaultPadding; + staves = [ + f.Stave({ x: staveX, y: staveYs[0], width: staveWidth }), + f.Stave({ x: staveX, y: staveYs[1], width: staveWidth }), + f.Stave({ x: staveX, y: staveYs[2], width: staveWidth }), + ]; + formatter.format(voices, width); + beams = [ + new Beam(notes32.slice(0, 3), true), + new Beam(notes32.slice(3, 6), true), + ]; + for (let i = 0; i < staves.length; ++i) { + staves[i].setContext(ctx).draw(); + voices[i].draw(ctx, staves[i]); + voices[i].getTickables().forEach((note) => Note.plotMetrics(ctx, note, staveYs[i] - 20)); + } + beams.forEach((beam) => beam.setContext(ctx).draw()); + ok(true); +} +function proportional(options) { + const debug = options.params.debug; + Registry.enableDefaultRegistry(new Registry()); + const f = VexFlowTests.makeFactory(options, 775, 750); + const system = f.System({ + x: 50, + autoWidth: true, + debugFormatter: debug, + noJustification: !(options.params.justify === undefined && true), + formatIterations: options.params.iterations, + details: { alpha: options.params.alpha }, + }); + const score = f.EasyScore(); + const voices = [ + score.notes('c5/8, c5'), + score.tuplet(score.notes('a4/8, a4, a4'), { notes_occupied: 2 }), + score.notes('c5/16, c5, c5, c5'), + score.tuplet(score.notes('a4/16, a4, a4, a4, a4'), { notes_occupied: 4 }), + score.tuplet(score.notes('a4/32, a4, a4, a4, a4, a4, a4'), { notes_occupied: 8 }), + ]; + const createVoice = (notes) => score.voice(notes, { time: '1/4' }); + const createStave = (voice) => system + .addStave({ voices: [voice], debugNoteMetrics: debug }) + .addClef('treble') + .addTimeSignature('1/4'); + voices.map(createVoice).forEach(createStave); + system.addConnector().setType(StaveConnector.type.BRACKET); + f.draw(); + Registry.disableDefaultRegistry(); + ok(true); +} +function softMax(options) { + const f = VexFlowTests.makeFactory(options, 550, 500); + f.getContext().scale(0.8, 0.8); + function draw(y, factor) { + const score = f.EasyScore(); + const system = f.System({ + x: 100, + y, + details: { softmaxFactor: factor }, + autoWidth: true, + }); + system + .addStave({ + voices: [ + score.voice(score + .notes('C#5/h, a4/q') + .concat(score.beam(score.notes('Abb4/8, A4/8'))) + .concat(score.beam(score.notes('A4/16, A#4, A4, Ab4/32, A4'))), { time: '5/4' }), + ], + }) + .addClef('treble') + .addTimeSignature('5/4'); + f.draw(); + ok(true); + } + draw(50, 1); + draw(150, 2); + draw(250, 10); + draw(350, 20); + draw(450, 200); +} +function mixTime(options) { + const f = VexFlowTests.makeFactory(options, 400 + Stave.defaultPadding, 250); + f.getContext().scale(0.8, 0.8); + const score = f.EasyScore(); + const system = f.System({ + details: { softmaxFactor: 100 }, + autoWidth: true, + debugFormatter: true, + }); + system + .addStave({ + voices: [score.voice(score.notes('C#5/q, B4').concat(score.beam(score.notes('A4/8, E4, C4, D4'))))], + }) + .addClef('treble') + .addTimeSignature('4/4'); + system + .addStave({ + voices: [score.voice(score.notes('C#5/q, B4, B4').concat(score.tuplet(score.beam(score.notes('A4/8, E4, C4')))))], + }) + .addClef('treble') + .addTimeSignature('4/4'); + f.draw(); + ok(true); +} +function tightNotes1(options) { + const f = VexFlowTests.makeFactory(options, 440, 250); + f.getContext().scale(0.8, 0.8); + const score = f.EasyScore(); + const system = f.System({ + autoWidth: true, + debugFormatter: true, + details: { maxIterations: 10 }, + }); + system + .addStave({ + voices: [ + score.voice(score.beam(score.notes('B4/16, B4, B4, B4, B4, B4, B4, B4')).concat(score.notes('B4/q, B4'))), + ], + }) + .addClef('treble') + .addTimeSignature('4/4'); + system + .addStave({ + voices: [ + score.voice(score.notes('B4/q, B4').concat(score.beam(score.notes('B4/16, B4, B4, B4, B4, B4, B4, B4')))), + ], + }) + .addClef('treble') + .addTimeSignature('4/4'); + f.draw(); + ok(true); +} +function tightNotes2(options) { + const f = VexFlowTests.makeFactory(options, 440, 250); + f.getContext().scale(0.8, 0.8); + const score = f.EasyScore(); + const system = f.System({ + autoWidth: true, + debugFormatter: true, + }); + system + .addStave({ + voices: [ + score.voice(score.beam(score.notes('B4/16, B4, B4, B4, B4, B4, B4, B4')).concat(score.notes('B4/q, B4'))), + ], + }) + .addClef('treble') + .addTimeSignature('4/4'); + system + .addStave({ + voices: [score.voice(score.notes('B4/w'))], + }) + .addClef('treble') + .addTimeSignature('4/4'); + f.draw(); + ok(true); +} +function annotations(options) { + const pageWidth = 916; + const pageHeight = 600; + const f = VexFlowTests.makeFactory(options, pageWidth, pageHeight); + const context = f.getContext(); + const lyrics1 = ['ipso', 'ipso-', 'ipso', 'ipso', 'ipsoz', 'ipso-', 'ipso', 'ipso', 'ipso', 'ip', 'ipso']; + const lyrics2 = ['ipso', 'ipso-', 'ipsoz', 'ipso', 'ipso', 'ipso-', 'ipso', 'ipso', 'ipso', 'ip', 'ipso']; + const smar = [ + { + sm: 5, + width: 550, + lyrics: lyrics1, + title: '550px,softMax:5', + }, + { + sm: 10, + width: 550, + lyrics: lyrics2, + title: '550px,softmax:10,different word order', + }, + { + sm: 5, + width: 550, + lyrics: lyrics2, + title: '550px,softmax:5', + }, + { + sm: 100, + width: 550, + lyrics: lyrics2, + title: '550px,softmax:100', + }, + ]; + const rowSize = 140; + const beats = 12; + const beatsPer = 8; + const beamGroup = 3; + const durations = ['8d', '16', '8', '8d', '16', '8', '8d', '16', '8', '4', '8']; + const beams = []; + let y = 40; + smar.forEach((sm) => { + const stave = new Stave(10, y, sm.width); + const notes = []; + let iii = 0; + context.fillText(sm.title, 100, y); + y += rowSize; + durations.forEach((dd) => { + const note = new StaveNote({ keys: ['b/4'], duration: dd }); + if (dd.indexOf('d') >= 0) { + Dot.buildAndAttach([note], { all: true }); + } + if (sm.lyrics.length > iii) { + note.addModifier(new Annotation(sm.lyrics[iii]) + .setVerticalJustification(Annotation.VerticalJustify.BOTTOM) + .setFont(Font.SERIF, 12, FontWeight.NORMAL)); + } + notes.push(note); + iii += 1; + }); + notes.forEach((note) => { + if (note.getDuration().indexOf('d') >= 0) { + Dot.buildAndAttach([note], { all: true }); + } + }); + let notesToBeam = []; + notes.forEach((note) => { + if (note.getIntrinsicTicks() < 4096) { + notesToBeam.push(note); + if (notesToBeam.length >= beamGroup) { + beams.push(new Beam(notesToBeam)); + notesToBeam = []; + } + } + else { + notesToBeam = []; + } + }); + const voice1 = new Voice({ num_beats: beats, beat_value: beatsPer }).setMode(Voice.Mode.SOFT).addTickables(notes); + const fmt = new Formatter({ softmaxFactor: sm.sm, maxIterations: 2 }).joinVoices([voice1]); + fmt.format([voice1], sm.width - 11); + stave.setContext(context).draw(); + voice1.draw(context, stave); + beams.forEach((b) => b.setContext(context).draw()); + }); + ok(true); +} +VexFlowTests.register(FormatterTests); +export { FormatterTests }; diff --git a/build/esm/tests/fraction_tests.js b/build/esm/tests/fraction_tests.js new file mode 100644 index 0000000000..7094c607a7 --- /dev/null +++ b/build/esm/tests/fraction_tests.js @@ -0,0 +1,72 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Fraction } from '../src/fraction.js'; +const FractionTests = { + Start() { + QUnit.module('Fraction'); + test('Basic', basic); + test('With Other Fractions', withOtherFractions); + }, +}; +function basic() { + const f_1_2 = new Fraction(1, 2); + ok(f_1_2.equals(0.5), 'Fraction: 1/2 equals 0.5'); + ok(f_1_2.equals(new Fraction(1, 2)), 'Fraction: 1/2 equals 1/2'); + ok(f_1_2.equals(new Fraction(2, 4)), 'Fraction: 1/2 equals 2/4'); + notOk(f_1_2.greaterThan(1), 'Fraction: ! 1/2 > 1'); + ok(f_1_2.greaterThan(0.2), 'Fraction: 1/2 > 0.2'); + ok(f_1_2.greaterThanEquals(0.2), 'Fraction: 1/2 >= 0.2'); + ok(f_1_2.greaterThanEquals(0.5), 'Fraction: 1/2 >= 0.5'); + notOk(f_1_2.greaterThanEquals(1), 'Fraction: ! 1/2 >= 1'); + notOk(f_1_2.lessThan(0.5), 'Fraction: ! 1/2 < 0.5'); + ok(f_1_2.lessThan(1), 'Fraction: 1/2 < 1'); + ok(f_1_2.lessThanEquals(0.6), 'Fraction: 1/2 <= 0.6'); + ok(f_1_2.lessThanEquals(0.5), 'Fraction: 1/2 <= 0.5'); + notOk(f_1_2.lessThanEquals(0.4), 'Fraction: ! 1/2 <= 0.4'); + const f_05 = f_1_2.copy(0.5); + strictEqual(f_05, f_1_2, 'Fraction: f_05 === f_1_2'); + strictEqual(f_05.toString(), '0.5/1', 'Fraction: f_05.toString() === "0.5/1"'); + strictEqual(f_05.toSimplifiedString(), '1/2', 'Fraction: f_05.toSimplifiedString() === "1/2"'); + const tF_n = f_05.clone(); + notStrictEqual(tF_n, f_05, 'Fraction: tF_n !== f_05'); + notEqual(tF_n, f_05, 'Fraction: tF_n != f_05'); + deepEqual(tF_n, f_05, 'tF_n deepEqual f_05'); + notDeepEqual(tF_n, {}, 'tF_n notDeepEqual {}'); + tF_n.subtract(-0.5); + ok(tF_n.equals(1), 'Fraction: 0.5 -(-0.5) equals 1'); + tF_n.add(1); + ok(tF_n.equals(2), 'Fraction: 1 + 1 equals 2'); + tF_n.multiply(2); + ok(tF_n.equals(4), 'Fraction: 2 * 2 equals 4'); + tF_n.divide(2); + ok(tF_n.equals(2), 'Fraction: 4 / 2 equals 2'); + equal(Fraction.LCMM([]), 0); + equal(Fraction.LCMM([17]), 17); + equal(Fraction.LCMM([2, 5]), 10); + equal(Fraction.LCMM([15, 3, 5]), 15); + equal(Fraction.LCMM([2, 4, 6]), 12); + equal(Fraction.LCMM([2, 3, 4, 5]), 60); + equal(Fraction.LCMM([12, 15, 10, 75]), 300); + equal(Fraction.GCD(0, 0), 0); + equal(Fraction.GCD(0, 99), 99); + equal(Fraction.GCD(77, 0), 77); + equal(Fraction.GCD(42, 14), 14); + equal(Fraction.GCD(15, 10), 5); +} +function withOtherFractions() { + const f_1_2 = new Fraction(1, 2); + const f_1_4 = new Fraction(1, 4); + const f_1_8 = new Fraction(1, 8); + const f_2 = new Fraction(2, 1); + const a = f_1_2.clone().multiply(f_1_2); + ok(a.equals(f_1_4), '1/2 x 1/2 == 1/4'); + const b = f_1_2.clone().divide(f_1_4); + ok(b.equals(f_2), '1/2 / 1/4 == 2'); + const c = f_2.clone().subtract(f_1_2).subtract(f_1_2).subtract(f_1_4); + const d = f_1_8.clone().add(f_1_8).add(f_1_8).multiply(f_2); + ok(c.equals(d), '2-1/2-1/2-1/4 == (1/8+1/8+1/8)*(2/1)'); + equal(c.value(), 0.75, '3/4 == 0.75'); + const e = f_1_8.clone().add(f_1_4).add(f_1_8); + ok(e.equals(f_1_2), '1/8 + 1/4 + 1/8 == 1/2'); +} +VexFlowTests.register(FractionTests); +export { FractionTests }; diff --git a/build/esm/tests/ghostnote_tests.js b/build/esm/tests/ghostnote_tests.js new file mode 100644 index 0000000000..76820b198d --- /dev/null +++ b/build/esm/tests/ghostnote_tests.js @@ -0,0 +1,77 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +const GhostNoteTests = { + Start() { + QUnit.module('GhostNote'); + const run = VexFlowTests.runTests; + run('GhostNote Basic', basic); + run('GhostNote Dotted', dotted); + }, +}; +function createTest(addItems) { + return (options) => { + const factory = VexFlowTests.makeFactory(options, 550); + const stave = factory.Stave(); + const score = factory.EasyScore(); + addItems(factory, score); + const voices = factory.getVoices(); + factory.Formatter().joinVoices(voices).formatToStave(voices, stave); + factory.draw(); + ok(true, 'all pass'); + }; +} +const basic = createTest((f, score) => { + const voiceTop = score.voice(score.notes('f#5/4, f5, db5, c5, c5/8, d5, fn5, e5, d5, c5', { stem: 'up' }), { + time: '7/4', + }); + const notesTop = voiceTop.getTickables(); + f.Beam({ notes: notesTop.slice(4, 8) }); + f.Beam({ notes: notesTop.slice(8, 10) }); + score.voice([ + f.GhostNote({ duration: '2' }), + f.StaveNote({ keys: ['f/4'], stem_direction: -1, duration: '4' }), + f.GhostNote({ duration: '4' }), + f.StaveNote({ keys: ['e/4'], stem_direction: -1, duration: '4' }), + f.GhostNote({ duration: '8' }), + f.StaveNote({ keys: ['d/4'], stem_direction: -1, duration: '8' }).addModifier(f.Accidental({ type: '##' }), 0), + f.StaveNote({ keys: ['c/4'], stem_direction: -1, duration: '8' }), + f.StaveNote({ keys: ['c/4'], stem_direction: -1, duration: '8' }), + ], { time: '7/4' }); +}); +const dotted = createTest((f, score) => { + const voice1 = score.voice([ + f.GhostNote({ duration: '4d' }), + f.StaveNote({ duration: '8', keys: ['f/5'], stem_direction: 1 }), + f.StaveNote({ duration: '4', keys: ['d/5'], stem_direction: 1 }), + f.StaveNote({ duration: '8', keys: ['c/5'], stem_direction: 1 }), + f.StaveNote({ duration: '16', keys: ['c/5'], stem_direction: 1 }), + f.StaveNote({ duration: '16', keys: ['d/5'], stem_direction: 1 }), + f.GhostNote({ duration: '2dd' }), + f.StaveNote({ duration: '8', keys: ['f/5'], stem_direction: 1 }), + ], { time: '8/4' }); + const voice2 = score.voice([ + f.StaveNote({ duration: '4', keys: ['f/4'], stem_direction: -1 }), + f.StaveNote({ duration: '8', keys: ['e/4'], stem_direction: -1 }), + f.StaveNote({ duration: '8', keys: ['d/4'], stem_direction: -1 }), + f.GhostNote({ duration: '4dd' }), + f.StaveNote({ duration: '16', keys: ['c/4'], stem_direction: -1 }), + f.StaveNote({ duration: '2', keys: ['c/4'], stem_direction: -1 }), + f.StaveNote({ duration: '4', keys: ['d/4'], stem_direction: -1 }), + f.StaveNote({ duration: '8', keys: ['f/4'], stem_direction: -1 }), + f.StaveNote({ duration: '8', keys: ['e/4'], stem_direction: -1 }), + ], { time: '8/4' }); + const notes1 = voice1.getTickables(); + const notes2 = voice2.getTickables(); + const addAccidental = (note, type) => note.addModifier(f.Accidental({ type }), 0); + addAccidental(notes1[1], 'bb'); + addAccidental(notes1[4], '#'); + addAccidental(notes1[7], 'n'); + addAccidental(notes2[0], '#'); + addAccidental(notes2[4], 'b'); + addAccidental(notes2[5], '#'); + addAccidental(notes2[7], 'n'); + f.Beam({ notes: notes1.slice(3, 6) }); + f.Beam({ notes: notes2.slice(1, 3) }); + f.Beam({ notes: notes2.slice(7, 9) }); +}); +VexFlowTests.register(GhostNoteTests); +export { GhostNoteTests }; diff --git a/build/esm/tests/glyphnote_tests.js b/build/esm/tests/glyphnote_tests.js new file mode 100644 index 0000000000..13e6b80429 --- /dev/null +++ b/build/esm/tests/glyphnote_tests.js @@ -0,0 +1,113 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { ChordSymbol } from '../src/chordsymbol.js'; +import { Glyph } from '../src/glyph.js'; +import { Registry } from '../src/registry.js'; +import { StaveConnector } from '../src/staveconnector.js'; +const GlyphNoteTests = { + Start() { + QUnit.module('GlyphNote'); + const run = VexFlowTests.runTests; + run('GlyphNote with ChordSymbols', chordChanges, { debug: false, noPadding: false }); + run('GlyphNote Positioning', basic, { debug: false, noPadding: false }); + run('GlyphNote No Stave Padding', basic, { debug: true, noPadding: true }); + run('GlyphNote RepeatNote', repeatNote, { debug: false, noPadding: true }); + }, +}; +function chordChanges(options) { + Registry.enableDefaultRegistry(new Registry()); + const f = VexFlowTests.makeFactory(options, 300, 200); + const system = f.System({ + x: 50, + width: 250, + debugFormatter: options.params.debug, + noPadding: options.params.noPadding, + details: { alpha: options.params.alpha }, + }); + const score = f.EasyScore(); + const notes = [ + f.GlyphNote(new Glyph('repeatBarSlash', 40), { duration: 'q' }), + f.GlyphNote(new Glyph('repeatBarSlash', 40), { duration: 'q' }), + f.GlyphNote(new Glyph('repeatBarSlash', 40), { duration: 'q' }), + f.GlyphNote(new Glyph('repeatBarSlash', 40), { duration: 'q' }), + ]; + const chord1 = f + .ChordSymbol({ reportWidth: false }) + .addText('F7') + .setHorizontal('left') + .addGlyphOrText('(#11b9)', { symbolModifier: ChordSymbol.symbolModifiers.SUPERSCRIPT }); + const chord2 = f + .ChordSymbol() + .addText('F7') + .setHorizontal('left') + .addGlyphOrText('#11', { symbolModifier: ChordSymbol.symbolModifiers.SUPERSCRIPT }) + .addGlyphOrText('b9', { symbolModifier: ChordSymbol.symbolModifiers.SUBSCRIPT }); + notes[0].addModifier(chord1, 0); + notes[2].addModifier(chord2, 0); + const voice = score.voice(notes); + system.addStave({ voices: [voice], debugNoteMetrics: options.params.debug }); + system.addConnector().setType(StaveConnector.type.BRACKET); + f.draw(); + Registry.disableDefaultRegistry(); + ok(true); +} +function basic(options) { + Registry.enableDefaultRegistry(new Registry()); + const f = VexFlowTests.makeFactory(options, 300, 400); + const system = f.System({ + x: 50, + width: 250, + debugFormatter: options.params.debug, + noPadding: options.params.noPadding, + details: { alpha: options.params.alpha }, + }); + const score = f.EasyScore(); + const newVoice = (notes) => score.voice(notes, { time: '1/4' }); + const newStave = (voice) => system.addStave({ voices: [voice], debugNoteMetrics: options.params.debug }); + const voices = [ + [f.GlyphNote(new Glyph('repeat1Bar', 40), { duration: 'q' }, { line: 4 })], + [f.GlyphNote(new Glyph('repeat2Bars', 40), { duration: 'q', align_center: true })], + [ + f.GlyphNote(new Glyph('repeatBarSlash', 40), { duration: '16' }), + f.GlyphNote(new Glyph('repeatBarSlash', 40), { duration: '16' }), + f.GlyphNote(new Glyph('repeat4Bars', 40), { duration: '16' }), + f.GlyphNote(new Glyph('repeatBarSlash', 40), { duration: '16' }), + ], + ]; + voices.map(newVoice).forEach(newStave); + system.addConnector().setType(StaveConnector.type.BRACKET); + f.draw(); + Registry.disableDefaultRegistry(); + ok(true); +} +function repeatNote(options) { + Registry.enableDefaultRegistry(new Registry()); + const f = VexFlowTests.makeFactory(options, 300, 500); + const system = f.System({ + x: 50, + width: 250, + debugFormatter: options.params.debug, + noPadding: options.params.noPadding, + details: { alpha: options.params.alpha }, + }); + const score = f.EasyScore(); + const createVoice = (notes) => score.voice(notes, { time: '1/4' }); + const addStaveWithVoice = (voice) => system.addStave({ voices: [voice], debugNoteMetrics: options.params.debug }); + const voices = [ + [f.RepeatNote('1')], + [f.RepeatNote('2')], + [f.RepeatNote('4')], + [ + f.RepeatNote('slash', { duration: '16' }), + f.RepeatNote('slash', { duration: '16' }), + f.RepeatNote('slash', { duration: '16' }), + f.RepeatNote('slash', { duration: '16' }), + ], + ]; + voices.map(createVoice).forEach(addStaveWithVoice); + system.addConnector().setType(StaveConnector.type.BRACKET); + f.draw(); + Registry.disableDefaultRegistry(); + ok(true); +} +VexFlowTests.register(GlyphNoteTests); +export { GlyphNoteTests }; diff --git a/build/esm/tests/gracenote_tests.js b/build/esm/tests/gracenote_tests.js new file mode 100644 index 0000000000..b32d87dd01 --- /dev/null +++ b/build/esm/tests/gracenote_tests.js @@ -0,0 +1,370 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Dot } from '../src/dot.js'; +import { Formatter } from '../src/formatter.js'; +const GraceNoteTests = { + Start() { + QUnit.module('Grace Notes'); + const run = VexFlowTests.runTests; + run('Grace Note Basic', basic); + run('Grace Note Basic with Slurs', basicSlurred); + run('Grace Note Stem', stem); + run('Grace Note Stem with Beams 1', stemWithBeamed, { + keys1: ['g/4'], + stemDirection1: 1, + keys2: ['d/5'], + stemDirection2: -1, + }); + run('Grace Note Stem with Beams 2', stemWithBeamed, { + keys1: ['a/3'], + stemDirection1: 1, + keys2: ['a/5'], + stemDirection2: -1, + }); + run('Grace Note Stem with Beams 3', stemWithBeamed, { + keys1: ['c/4'], + stemDirection1: 1, + keys2: ['c/6'], + stemDirection2: -1, + }); + run('Grace Note Slash', slash); + run('Grace Note Slash with Beams', slashWithBeams); + run('Grace Notes Multiple Voices', multipleVoices); + run('Grace Notes Multiple Voices Multiple Draws', multipleVoicesMultipleDraws); + }, +}; +function basic(options) { + const f = VexFlowTests.makeFactory(options, 700, 130); + const stave = f.Stave({ x: 10, y: 10, width: 650 }); + const gracenotes = [ + { keys: ['e/4'], duration: '32' }, + { keys: ['f/4'], duration: '32' }, + { keys: ['g/4'], duration: '32' }, + { keys: ['a/4'], duration: '32' }, + ].map(f.GraceNote.bind(f)); + const gracenotes1 = [{ keys: ['b/4'], duration: '8', slash: false }].map(f.GraceNote.bind(f)); + const gracenotes2 = [{ keys: ['b/4'], duration: '8', slash: true }].map(f.GraceNote.bind(f)); + const gracenotes3 = [ + { keys: ['e/4'], duration: '8' }, + { keys: ['f/4'], duration: '16' }, + { keys: ['e/4', 'g/4'], duration: '8' }, + { keys: ['a/4'], duration: '32' }, + { keys: ['b/4'], duration: '32' }, + ].map(f.GraceNote.bind(f)); + const gracenotes4 = [ + { keys: ['g/4'], duration: '8' }, + { keys: ['g/4'], duration: '16' }, + { keys: ['g/4'], duration: '16' }, + ].map(f.GraceNote.bind(f)); + gracenotes[1].addModifier(f.Accidental({ type: '##' }), 0); + gracenotes3[3].addModifier(f.Accidental({ type: 'bb' }), 0); + Dot.buildAndAttach([gracenotes4[0]], { all: true }); + const notes = [ + f + .StaveNote({ keys: ['b/4'], duration: '4', auto_stem: true }) + .addModifier(f.GraceNoteGroup({ notes: gracenotes }).beamNotes(), 0), + f + .StaveNote({ keys: ['c/5'], duration: '4', auto_stem: true }) + .addModifier(f.Accidental({ type: '#' }), 0) + .addModifier(f.GraceNoteGroup({ notes: gracenotes1 }).beamNotes(), 0), + f + .StaveNote({ keys: ['c/5', 'd/5'], duration: '4', auto_stem: true }) + .addModifier(f.GraceNoteGroup({ notes: gracenotes2 }).beamNotes(), 0), + f + .StaveNote({ keys: ['a/4'], duration: '4', auto_stem: true }) + .addModifier(f.GraceNoteGroup({ notes: gracenotes3 }).beamNotes(), 0), + f + .StaveNote({ keys: ['a/4'], duration: '4', auto_stem: true }) + .addModifier(f.GraceNoteGroup({ notes: gracenotes4 }).beamNotes(), 0), + ]; + const voice = f.Voice().setStrict(false).addTickables(notes); + new Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'GraceNoteBasic'); +} +function basicSlurred(options) { + const f = VexFlowTests.makeFactory(options, 700, 130); + const stave = f.Stave({ x: 10, y: 10, width: 650 }); + const gracenotes0 = [ + { keys: ['e/4'], duration: '32' }, + { keys: ['f/4'], duration: '32' }, + { keys: ['g/4'], duration: '32' }, + { keys: ['a/4'], duration: '32' }, + ].map(f.GraceNote.bind(f)); + const gracenotes1 = [{ keys: ['b/4'], duration: '8', slash: false }].map(f.GraceNote.bind(f)); + const gracenotes2 = [{ keys: ['b/4'], duration: '8', slash: true }].map(f.GraceNote.bind(f)); + const gracenotes3 = [ + { keys: ['e/4'], duration: '8' }, + { keys: ['f/4'], duration: '16' }, + { keys: ['e/4', 'g/4'], duration: '8' }, + { keys: ['a/4'], duration: '32' }, + { keys: ['b/4'], duration: '32' }, + ].map(f.GraceNote.bind(f)); + const gracenotes4 = [ + { keys: ['a/4'], duration: '8' }, + { keys: ['a/4'], duration: '16' }, + { keys: ['a/4'], duration: '16' }, + ].map(f.GraceNote.bind(f)); + gracenotes0[1].addModifier(f.Accidental({ type: '#' }), 0); + gracenotes3[3].addModifier(f.Accidental({ type: 'b' }), 0); + gracenotes3[2].addModifier(f.Accidental({ type: 'n' }), 0); + Dot.buildAndAttach([gracenotes4[0]], { all: true }); + const notes = [ + f + .StaveNote({ keys: ['b/4'], duration: '4', auto_stem: true }) + .addModifier(f.GraceNoteGroup({ notes: gracenotes0, slur: true }).beamNotes(), 0), + f + .StaveNote({ keys: ['c/5'], duration: '4', auto_stem: true }) + .addModifier(f.Accidental({ type: '#' }), 0) + .addModifier(f.GraceNoteGroup({ notes: gracenotes1, slur: true }).beamNotes(), 0), + f + .StaveNote({ keys: ['c/5', 'd/5'], duration: '4', auto_stem: true }) + .addModifier(f.GraceNoteGroup({ notes: gracenotes2, slur: true }).beamNotes(), 0), + f + .StaveNote({ keys: ['a/4'], duration: '4', auto_stem: true }) + .addModifier(f.GraceNoteGroup({ notes: gracenotes3, slur: true }).beamNotes(), 0), + f + .StaveNote({ keys: ['a/4'], duration: '4', auto_stem: true }) + .addModifier(f.GraceNoteGroup({ notes: gracenotes4, slur: true }).beamNotes(), 0), + f.StaveNote({ keys: ['a/4'], duration: '4', auto_stem: true }), + ]; + const voice = f.Voice().setStrict(false).addTickables(notes); + new Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'GraceNoteBasic'); +} +const createNoteForStemTest = (duration, noteBuilder, keys, stem_direction, slash = false) => { + const struct = { duration, slash }; + struct.stem_direction = stem_direction; + struct.keys = keys; + return noteBuilder(struct); +}; +const durationsForStemTest = ['8', '16', '32', '64', '128']; +function stem(options) { + const f = VexFlowTests.makeFactory(options, 700, 130); + const stave = f.Stave({ x: 10, y: 10, width: 650 }); + function createNotes(noteBuilder, keys, stem_direction) { + return durationsForStemTest.map((duration) => createNoteForStemTest(duration, noteBuilder, keys, stem_direction)); + } + function createNoteBlock(keys, stem_direction) { + const staveNotes = createNotes(f.StaveNote.bind(f), keys, stem_direction); + const gracenotes = createNotes(f.GraceNote.bind(f), keys, stem_direction); + staveNotes[0].addModifier(f.GraceNoteGroup({ notes: gracenotes }), 0); + return staveNotes; + } + const voice = f.Voice().setStrict(false); + voice.addTickables(createNoteBlock(['g/4'], 1)); + voice.addTickables(createNoteBlock(['d/5'], -1)); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'GraceNoteStem'); +} +function stemWithBeamed(options) { + const f = VexFlowTests.makeFactory(options, 700, 130); + const stave = f.Stave({ x: 10, y: 10, width: 650 }); + function createBeamedNotes(noteBuilder, keys, stem_direction, beams, isGrace = false, notesToBeam) { + const ret = []; + durationsForStemTest.map((duration) => { + const n0 = createNoteForStemTest(duration, noteBuilder, keys, stem_direction); + const n1 = createNoteForStemTest(duration, noteBuilder, keys, stem_direction); + ret.push(n0); + ret.push(n1); + if (notesToBeam) { + notesToBeam.push([n0, n1]); + } + if (!isGrace) { + beams.push(f.Beam({ notes: [n0, n1] })); + } + }); + return ret; + } + function createBeamedNoteBlock(keys, stem_direction, beams) { + const bnotes = createBeamedNotes(f.StaveNote.bind(f), keys, stem_direction, beams); + const notesToBeam = []; + const gracenotes = createBeamedNotes(f.GraceNote.bind(f), keys, stem_direction, beams, true, notesToBeam); + const graceNoteGroup = f.GraceNoteGroup({ notes: gracenotes }); + notesToBeam.map(graceNoteGroup.beamNotes.bind(graceNoteGroup)); + bnotes[0].addModifier(graceNoteGroup, 0); + return bnotes; + } + const beams = []; + const voice = f.Voice().setStrict(false); + voice.addTickables(createBeamedNoteBlock(options.params.keys1, options.params.stemDirection1, beams)); + voice.addTickables(createBeamedNoteBlock(options.params.keys2, options.params.stemDirection2, beams)); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'GraceNoteStem'); +} +function slash(options) { + const f = VexFlowTests.makeFactory(options, 700, 130); + const stave = f.Stave({ x: 10, y: 10, width: 650 }); + function createNotes(noteT, keys, stem_direction, slash) { + return durationsForStemTest.map((d) => createNoteForStemTest(d, noteT, keys, stem_direction, slash)); + } + function createNoteBlock(keys, stem_direction) { + const notes = [f.StaveNote({ keys: ['f/4'], stem_direction, duration: '16' })]; + let graceNotes = createNotes(f.GraceNote.bind(f), keys, stem_direction, true); + const duration = '8'; + const gns = [ + { keys: ['d/4', 'a/4'], stem_direction, duration, slash: true }, + { keys: ['d/4', 'a/4'], stem_direction, duration, slash: true }, + { keys: ['d/4', 'a/4'], stem_direction, duration, slash: true }, + { keys: ['e/4', 'a/4'], stem_direction, duration, slash: true }, + { keys: ['e/4', 'a/4'], stem_direction, duration, slash: true }, + { keys: ['b/4', 'f/5'], stem_direction, duration, slash: true }, + { keys: ['b/4', 'f/5'], stem_direction, duration, slash: true }, + { keys: ['b/4', 'f/5'], stem_direction, duration, slash: true }, + { keys: ['e/4', 'a/4'], stem_direction, duration, slash: true }, + ].map(f.GraceNote.bind(f)); + const notesToBeam = []; + notesToBeam.push([gns[0], gns[1], gns[2]]); + notesToBeam.push([gns[3], gns[4], gns[5]]); + notesToBeam.push([gns[6], gns[7], gns[8]]); + graceNotes = graceNotes.concat(gns); + const graceNoteGroup = f.GraceNoteGroup({ notes: graceNotes }); + notesToBeam.forEach((notes) => graceNoteGroup.beamNotes(notes)); + notes[0].addModifier(graceNoteGroup, 0); + return notes; + } + const voice = f.Voice().setStrict(false); + voice.addTickables(createNoteBlock(['d/4', 'a/4'], 1)); + voice.addTickables(createNoteBlock(['d/4', 'a/4'], -1)); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'GraceNoteSlash'); +} +function slashWithBeams(options) { + const f = VexFlowTests.makeFactory(options, 800, 130); + const stave = f.Stave({ x: 10, y: 10, width: 750 }); + function createNoteBlock(keys, stem_direction) { + const notes = [f.StaveNote({ keys: ['f/4'], stem_direction, duration: '16' })]; + let allGraceNotes = []; + const graceNotesToBeam = []; + ['8', '16', '32', '64'].forEach(function (duration) { + const graceNotes = [ + { keys: ['d/4', 'a/4'], stem_direction, duration, slash: true }, + { keys: ['d/4', 'a/4'], stem_direction, duration, slash: false }, + { keys: ['e/4', 'a/4'], stem_direction, duration, slash: true }, + { keys: ['b/4', 'f/5'], stem_direction, duration, slash: false }, + { keys: ['b/4', 'f/5'], stem_direction, duration, slash: true }, + { keys: ['e/4', 'a/4'], stem_direction, duration, slash: false }, + ].map(f.GraceNote.bind(f)); + graceNotesToBeam.push([graceNotes[0], graceNotes[1]]); + graceNotesToBeam.push([graceNotes[2], graceNotes[3]]); + graceNotesToBeam.push([graceNotes[4], graceNotes[5]]); + allGraceNotes = allGraceNotes.concat(graceNotes); + }); + const graceNoteGroup = f.GraceNoteGroup({ notes: allGraceNotes }); + graceNotesToBeam.forEach((g) => graceNoteGroup.beamNotes(g)); + notes[0].addModifier(graceNoteGroup, 0); + return notes; + } + const voice = f.Voice().setStrict(false); + voice.addTickables(createNoteBlock(['d/4', 'a/4'], 1)); + voice.addTickables(createNoteBlock(['d/4', 'a/4'], -1)); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'GraceNoteSlashWithBeams'); +} +function multipleVoices(options) { + const f = VexFlowTests.makeFactory(options, 450, 140); + const stave = f.Stave({ x: 10, y: 10, width: 450 }); + const notes = [ + { keys: ['f/5'], stem_direction: 1, duration: '16' }, + { keys: ['f/5'], stem_direction: 1, duration: '16' }, + { keys: ['d/5'], stem_direction: 1, duration: '16' }, + { keys: ['c/5'], stem_direction: 1, duration: '16' }, + { keys: ['c/5'], stem_direction: 1, duration: '16' }, + { keys: ['d/5'], stem_direction: 1, duration: '16' }, + { keys: ['f/5'], stem_direction: 1, duration: '16' }, + { keys: ['e/5'], stem_direction: 1, duration: '16' }, + ].map(f.StaveNote.bind(f)); + const notes2 = [ + { keys: ['f/4'], stem_direction: -1, duration: '16' }, + { keys: ['e/4'], stem_direction: -1, duration: '16' }, + { keys: ['d/4'], stem_direction: -1, duration: '16' }, + { keys: ['c/4'], stem_direction: -1, duration: '16' }, + { keys: ['c/4'], stem_direction: -1, duration: '16' }, + { keys: ['d/4'], stem_direction: -1, duration: '16' }, + { keys: ['f/4'], stem_direction: -1, duration: '16' }, + { keys: ['e/4'], stem_direction: -1, duration: '16' }, + ].map(f.StaveNote.bind(f)); + const gracenotes1 = [{ keys: ['b/4'], stem_direction: 1, duration: '8', slash: true }].map(f.GraceNote.bind(f)); + const gracenotes2 = [{ keys: ['f/4'], stem_direction: -1, duration: '8', slash: true }].map(f.GraceNote.bind(f)); + const gracenotes3 = [ + { keys: ['f/4'], duration: '32', stem_direction: -1 }, + { keys: ['e/4'], duration: '32', stem_direction: -1 }, + ].map(f.GraceNote.bind(f)); + const gracenotes4 = [ + { keys: ['f/5'], duration: '32', stem_direction: 1 }, + { keys: ['e/5'], duration: '32', stem_direction: 1 }, + { keys: ['e/5'], duration: '8', stem_direction: 1 }, + ].map(f.GraceNote.bind(f)); + gracenotes2[0].setStemDirection(-1); + gracenotes2[0].addModifier(f.Accidental({ type: '#' }), 0); + notes[1].addModifier(f.GraceNoteGroup({ notes: gracenotes4 }).beamNotes(), 0); + notes[3].addModifier(f.GraceNoteGroup({ notes: gracenotes1 }), 0); + notes2[1].addModifier(f.GraceNoteGroup({ notes: gracenotes2 }).beamNotes(), 0); + notes2[5].addModifier(f.GraceNoteGroup({ notes: gracenotes3 }).beamNotes(), 0); + const voice = f.Voice().setStrict(false).addTickables(notes); + const voice2 = f.Voice().setStrict(false).addTickables(notes2); + f.Beam({ notes: notes.slice(0, 4) }); + f.Beam({ notes: notes.slice(4, 8) }); + f.Beam({ notes: notes2.slice(0, 4) }); + f.Beam({ notes: notes2.slice(4, 8) }); + f.Formatter().joinVoices([voice, voice2]).formatToStave([voice, voice2], stave); + f.draw(); + ok(true, 'Sixteenth Test'); +} +function multipleVoicesMultipleDraws(options) { + const f = VexFlowTests.makeFactory(options, 450, 140); + const stave = f.Stave({ x: 10, y: 10, width: 450 }); + const notes = [ + { keys: ['f/5'], stem_direction: 1, duration: '16' }, + { keys: ['f/5'], stem_direction: 1, duration: '16' }, + { keys: ['d/5'], stem_direction: 1, duration: '16' }, + { keys: ['c/5'], stem_direction: 1, duration: '16' }, + { keys: ['c/5'], stem_direction: 1, duration: '16' }, + { keys: ['d/5'], stem_direction: 1, duration: '16' }, + { keys: ['f/5'], stem_direction: 1, duration: '16' }, + { keys: ['e/5'], stem_direction: 1, duration: '16' }, + ].map(f.StaveNote.bind(f)); + const notes2 = [ + { keys: ['f/4'], stem_direction: -1, duration: '16' }, + { keys: ['e/4'], stem_direction: -1, duration: '16' }, + { keys: ['d/4'], stem_direction: -1, duration: '16' }, + { keys: ['c/4'], stem_direction: -1, duration: '16' }, + { keys: ['c/4'], stem_direction: -1, duration: '16' }, + { keys: ['d/4'], stem_direction: -1, duration: '16' }, + { keys: ['f/4'], stem_direction: -1, duration: '16' }, + { keys: ['e/4'], stem_direction: -1, duration: '16' }, + ].map(f.StaveNote.bind(f)); + const gracenotes1 = [{ keys: ['b/4'], stem_direction: 1, duration: '8', slash: true }].map(f.GraceNote.bind(f)); + const gracenotes2 = [{ keys: ['f/4'], stem_direction: -1, duration: '8', slash: true }].map(f.GraceNote.bind(f)); + const gracenotes3 = [ + { keys: ['f/4'], duration: '32', stem_direction: -1 }, + { keys: ['e/4'], duration: '32', stem_direction: -1 }, + ].map(f.GraceNote.bind(f)); + const gracenotes4 = [ + { keys: ['f/5'], duration: '32', stem_direction: 1 }, + { keys: ['e/5'], duration: '32', stem_direction: 1 }, + { keys: ['e/5'], duration: '8', stem_direction: 1 }, + ].map(f.GraceNote.bind(f)); + gracenotes2[0].setStemDirection(-1); + gracenotes2[0].addModifier(f.Accidental({ type: '#' }), 0); + notes[1].addModifier(f.GraceNoteGroup({ notes: gracenotes4 }).beamNotes(), 0); + notes[3].addModifier(f.GraceNoteGroup({ notes: gracenotes1 }), 0); + notes2[1].addModifier(f.GraceNoteGroup({ notes: gracenotes2 }).beamNotes(), 0); + notes2[5].addModifier(f.GraceNoteGroup({ notes: gracenotes3 }).beamNotes(), 0); + const voice = f.Voice().setStrict(false).addTickables(notes); + const voice2 = f.Voice().setStrict(false).addTickables(notes2); + f.Beam({ notes: notes.slice(0, 4) }); + f.Beam({ notes: notes.slice(4, 8) }); + f.Beam({ notes: notes2.slice(0, 4) }); + f.Beam({ notes: notes2.slice(4, 8) }); + f.Formatter().joinVoices([voice, voice2]).formatToStave([voice, voice2], stave); + f.draw(); + f.draw(); + ok(true, 'Seventeenth Test'); +} +VexFlowTests.register(GraceNoteTests); +export { GraceNoteTests }; diff --git a/build/esm/tests/gracetabnote_tests.js b/build/esm/tests/gracetabnote_tests.js new file mode 100644 index 0000000000..d1f8c40e55 --- /dev/null +++ b/build/esm/tests/gracetabnote_tests.js @@ -0,0 +1,79 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Flow } from '../src/flow.js'; +import { Formatter } from '../src/formatter.js'; +import { GraceNoteGroup } from '../src/gracenotegroup.js'; +import { GraceTabNote } from '../src/gracetabnote.js'; +import { TabNote } from '../src/tabnote.js'; +import { TabStave } from '../src/tabstave.js'; +import { Voice } from '../src/voice.js'; +const GraceTabNoteTests = { + Start() { + QUnit.module('Grace Tab Notes'); + const run = VexFlowTests.runTests; + run('Grace Tab Note Simple', simple); + run('Grace Tab Note Slurred', slurred); + }, +}; +const tabNote = (noteStruct) => new TabNote(noteStruct); +const graceTabNote = (noteStruct) => new GraceTabNote(noteStruct); +function setupContext(opts, ctxBuilder) { + const context = ctxBuilder(opts.elementId, 350, 140); + const stave = new TabStave(10, 10, 350).addTabGlyph().setContext(context).draw(); + return { context, stave }; +} +function simple(options, contextBuilder) { + const { context, stave } = setupContext(options, contextBuilder); + const note0 = tabNote({ positions: [{ str: 4, fret: 6 }], duration: '4' }); + const note1 = tabNote({ positions: [{ str: 4, fret: 12 }], duration: '4' }); + const note2 = tabNote({ positions: [{ str: 4, fret: 10 }], duration: '4' }); + const note3 = tabNote({ positions: [{ str: 4, fret: 10 }], duration: '4' }); + const gracenote_group0 = [{ positions: [{ str: 4, fret: 'x' }], duration: '8' }]; + const gracenote_group1 = [ + { positions: [{ str: 4, fret: 9 }], duration: '16' }, + { positions: [{ str: 4, fret: 10 }], duration: '16' }, + ]; + const gracenote_group2 = [{ positions: [{ str: 4, fret: 9 }], duration: '8' }]; + const gracenote_group3 = [ + { positions: [{ str: 5, fret: 10 }], duration: '8' }, + { positions: [{ str: 4, fret: 9 }], duration: '8' }, + ]; + const gracenotes0 = gracenote_group0.map(graceTabNote); + const gracenotes1 = gracenote_group1.map(graceTabNote); + const gracenotes2 = gracenote_group2.map(graceTabNote); + gracenotes2[0].setGhost(true); + const gracenotes3 = gracenote_group3.map(graceTabNote); + note0.addModifier(new GraceNoteGroup(gracenotes0), 0); + note1.addModifier(new GraceNoteGroup(gracenotes1), 0); + note2.addModifier(new GraceNoteGroup(gracenotes2), 0); + note3.addModifier(new GraceNoteGroup(gracenotes3), 0); + const voice = new Voice(Flow.TIME4_4); + voice.addTickables([note0, note1, note2, note3]); + new Formatter().joinVoices([voice]).format([voice], 250); + voice.draw(context, stave); + ok(true, 'Simple Test'); +} +function slurred(options, contextBuilder) { + const { context, stave } = setupContext(options, contextBuilder); + const note0 = tabNote({ positions: [{ str: 4, fret: 12 }], duration: 'h' }); + const note1 = tabNote({ positions: [{ str: 4, fret: 10 }], duration: 'h' }); + const gracenote_group0 = [ + { positions: [{ str: 4, fret: 9 }], duration: '8' }, + { positions: [{ str: 4, fret: 10 }], duration: '8' }, + ]; + const gracenote_group1 = [ + { positions: [{ str: 4, fret: 7 }], duration: '16' }, + { positions: [{ str: 4, fret: 8 }], duration: '16' }, + { positions: [{ str: 4, fret: 9 }], duration: '16' }, + ]; + const gracenotes0 = gracenote_group0.map(graceTabNote); + const gracenotes1 = gracenote_group1.map(graceTabNote); + note0.addModifier(new GraceNoteGroup(gracenotes0, true), 0); + note1.addModifier(new GraceNoteGroup(gracenotes1, true), 0); + const voice = new Voice(Flow.TIME4_4); + voice.addTickables([note0, note1]); + new Formatter().joinVoices([voice]).format([voice], 200); + voice.draw(context, stave); + ok(true, 'Slurred Test'); +} +VexFlowTests.register(GraceTabNoteTests); +export { GraceTabNoteTests }; diff --git a/build/esm/tests/index.js b/build/esm/tests/index.js new file mode 100644 index 0000000000..20aff4b3cf --- /dev/null +++ b/build/esm/tests/index.js @@ -0,0 +1,68 @@ +export * from './accidental_tests.js'; +export * from './annotation_tests.js'; +export * from './articulation_tests.js'; +export * from './auto_beam_formatting_tests.js'; +export * from './bach_tests.js'; +export * from './barline_tests.js'; +export * from './beam_tests.js'; +export * from './bend_tests.js'; +export * from './boundingbox_tests.js'; +export * from './boundingboxcomputation_tests.js'; +export * from './chordsymbol_tests.js'; +export * from './clef_tests.js'; +export * from './curve_tests.js'; +export * from './dot_tests.js'; +export * from './easyscore_tests.js'; +export * from './factory_tests.js'; +export * from './font_tests.js'; +export * from './formatter_tests.js'; +export * from './fraction_tests.js'; +export * from './ghostnote_tests.js'; +export * from './glyphnote_tests.js'; +export * from './gracenote_tests.js'; +export * from './gracetabnote_tests.js'; +export * from './key_clef_tests.js'; +export * from './keymanager_tests.js'; +export * from './keysignature_tests.js'; +export * from './modifier_tests.js'; +export * from './multimeasurerest_tests.js'; +export * from './music_tests.js'; +export * from './notehead_tests.js'; +export * from './notesubgroup_tests.js'; +export * from './offscreencanvas_tests.js'; +export * from './ornament_tests.js'; +export * from './parser_tests.js'; +export * from './pedalmarking_tests.js'; +export * from './percussion_tests.js'; +export * from './registry_tests.js'; +export * from './renderer_tests.js'; +export * from './rests_tests.js'; +export * from './rhythm_tests.js'; +export * from './stave_tests.js'; +export * from './staveconnector_tests.js'; +export * from './stavehairpin_tests.js'; +export * from './staveline_tests.js'; +export * from './stavemodifier_tests.js'; +export * from './stavenote_tests.js'; +export * from './stavetie_tests.js'; +export * from './stringnumber_tests.js'; +export * from './strokes_tests.js'; +export * from './style_tests.js'; +export * from './tabnote_tests.js'; +export * from './tabslide_tests.js'; +export * from './tabstave_tests.js'; +export * from './tabtie_tests.js'; +export * from './textbracket_tests.js'; +export * from './textformatter_tests.js'; +export * from './textnote_tests.js'; +export * from './threevoice_tests.js'; +export * from './tickcontext_tests.js'; +export * from './timesignature_tests.js'; +export * from './tremolo_tests.js'; +export * from './tuning_tests.js'; +export * from './tuplet_tests.js'; +export * from './typeguard_tests.js'; +export * from './vf_prefix_tests.js'; +export * from './vibrato_tests.js'; +export * from './vibratobracket_tests.js'; +export * from './voice_tests.js'; diff --git a/build/esm/tests/key_clef_tests.js b/build/esm/tests/key_clef_tests.js new file mode 100644 index 0000000000..7e7c0756f9 --- /dev/null +++ b/build/esm/tests/key_clef_tests.js @@ -0,0 +1,103 @@ +import { MAJOR_KEYS, MINOR_KEYS, VexFlowTests } from './vexflow_test_helpers.js'; +import { Glyph } from '../src/glyph.js'; +import { KeySignature } from '../src/keysignature.js'; +import { Stave } from '../src/stave.js'; +const ClefKeySignatureTests = { + Start() { + QUnit.module('Clef Keys'); + const run = VexFlowTests.runTests; + run('Major Key Clef Test', keys, { majorKeys: true }); + run('Minor Key Clef Test', keys, { majorKeys: false }); + run('Stave Helper', staveHelper); + }, +}; +const fontWidths = () => { + const glyphScale = 39; + const sharpWidth = Glyph.getWidth('accidentalSharp', glyphScale) + 1; + const flatWidth = Glyph.getWidth('accidentalFlat', glyphScale) + 1; + const ksPadding = 10; + const naturalWidth = Glyph.getWidth('accidentalNatural', glyphScale) + 2; + const clefWidth = Glyph.getWidth('gClef', glyphScale); + return { sharpWidth, flatWidth, naturalWidth, clefWidth, ksPadding }; +}; +function keys(options, contextBuilder) { + const w = fontWidths(); + const accidentalCount = 28; + const sharpTestWidth = accidentalCount * w.sharpWidth + w.clefWidth + Stave.defaultPadding + 6 * w.ksPadding; + const flatTestWidth = accidentalCount * w.flatWidth + w.clefWidth + Stave.defaultPadding + 6 * w.ksPadding; + const clefs = [ + 'treble', + 'soprano', + 'mezzo-soprano', + 'alto', + 'tenor', + 'baritone-f', + 'baritone-c', + 'bass', + 'french', + 'subbass', + 'percussion', + ]; + const ctx = contextBuilder(options.elementId, Math.max(sharpTestWidth, flatTestWidth) + 100, 20 + 80 * 2 * clefs.length); + const staves = []; + const keys = options.params.majorKeys ? MAJOR_KEYS : MINOR_KEYS; + let i; + let flat; + let sharp; + let keySig; + const yOffsetForFlatStaves = 10 + 80 * clefs.length; + for (i = 0; i < clefs.length; i++) { + staves[i] = new Stave(10, 10 + 80 * i, flatTestWidth); + staves[i].addClef(clefs[i]); + staves[i + clefs.length] = new Stave(10, yOffsetForFlatStaves + 10 + 80 * i, sharpTestWidth); + staves[i + clefs.length].addClef(clefs[i]); + for (flat = 0; flat < 8; flat++) { + keySig = new KeySignature(keys[flat]); + keySig.addToStave(staves[i]); + } + for (sharp = 8; sharp < keys.length; sharp++) { + keySig = new KeySignature(keys[sharp]); + keySig.addToStave(staves[i + clefs.length]); + } + staves[i].setContext(ctx); + staves[i].draw(); + staves[i + clefs.length].setContext(ctx); + staves[i + clefs.length].draw(); + } + ok(true, 'all pass'); +} +function staveHelper(options, contextBuilder) { + const w = fontWidths(); + const accidentalCount = 28; + const sharpTestWidth = accidentalCount * w.sharpWidth + w.clefWidth + Stave.defaultPadding + 7 * w.ksPadding; + const flatTestWidth = accidentalCount * w.flatWidth + w.clefWidth + Stave.defaultPadding + 7 * w.ksPadding; + const ctx = contextBuilder(options.elementId, Math.max(sharpTestWidth, flatTestWidth) + 100, 400); + const stave1 = new Stave(10, 10, flatTestWidth); + const stave2 = new Stave(10, 90, flatTestWidth); + const stave3 = new Stave(10, 170, sharpTestWidth); + const stave4 = new Stave(10, 260, sharpTestWidth); + const keys = MAJOR_KEYS; + stave1.addClef('treble'); + stave2.addClef('bass'); + stave3.addClef('alto'); + stave4.addClef('tenor'); + for (let n = 0; n < 8; ++n) { + stave1.addKeySignature(keys[n]); + stave2.addKeySignature(keys[n]); + } + for (let i = 8; i < keys.length; ++i) { + stave3.addKeySignature(keys[i]); + stave4.addKeySignature(keys[i]); + } + stave1.setContext(ctx); + stave1.draw(); + stave2.setContext(ctx); + stave2.draw(); + stave3.setContext(ctx); + stave3.draw(); + stave4.setContext(ctx); + stave4.draw(); + ok(true, 'all pass'); +} +VexFlowTests.register(ClefKeySignatureTests); +export { ClefKeySignatureTests }; diff --git a/build/esm/tests/keymanager_tests.js b/build/esm/tests/keymanager_tests.js new file mode 100644 index 0000000000..6cc5f7a1b4 --- /dev/null +++ b/build/esm/tests/keymanager_tests.js @@ -0,0 +1,68 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { KeyManager } from '../src/index.js'; +const KeyManagerTests = { + Start() { + QUnit.module('KeyManager'); + test('Valid Notes', works); + test('Select Notes', selectNotes); + }, +}; +function works() { + const manager = new KeyManager('g'); + equal(manager.getAccidental('f').accidental, '#'); + manager.setKey('a'); + equal(manager.getAccidental('c').accidental, '#'); + equal(manager.getAccidental('a').accidental, null); + equal(manager.getAccidental('f').accidental, '#'); + manager.setKey('A'); + equal(manager.getAccidental('c').accidental, '#'); + equal(manager.getAccidental('a').accidental, null); + equal(manager.getAccidental('f').accidental, '#'); +} +function selectNotes() { + const manager = new KeyManager('f'); + equal(manager.selectNote('bb').note, 'bb'); + equal(manager.selectNote('bb').accidental, 'b'); + equal(manager.selectNote('g').note, 'g'); + equal(manager.selectNote('g').accidental, null); + equal(manager.selectNote('b').note, 'b'); + equal(manager.selectNote('b').accidental, null); + equal(manager.selectNote('a#').note, 'bb'); + equal(manager.selectNote('g#').note, 'g#'); + equal(manager.selectNote('g#').note, 'g#'); + equal(manager.selectNote('bb').note, 'bb'); + equal(manager.selectNote('bb').accidental, 'b'); + equal(manager.selectNote('g').note, 'g'); + equal(manager.selectNote('g').accidental, null); + equal(manager.selectNote('b').note, 'b'); + equal(manager.selectNote('b').accidental, null); + equal(manager.selectNote('a#').note, 'bb'); + equal(manager.selectNote('g#').note, 'g#'); + manager.reset(); + equal(manager.selectNote('g#').change, true); + equal(manager.selectNote('g#').change, false); + equal(manager.selectNote('g').change, true); + equal(manager.selectNote('g').change, false); + equal(manager.selectNote('g#').change, true); + manager.reset(); + let note = manager.selectNote('bb'); + equal(note.change, false); + equal(note.accidental, 'b'); + note = manager.selectNote('g'); + equal(note.change, false); + equal(note.accidental, null); + note = manager.selectNote('g#'); + equal(note.change, true); + equal(note.accidental, '#'); + note = manager.selectNote('g'); + equal(note.change, true); + equal(note.accidental, null); + note = manager.selectNote('g'); + equal(note.change, false); + equal(note.accidental, null); + note = manager.selectNote('g#'); + equal(note.change, true); + equal(note.accidental, '#'); +} +VexFlowTests.register(KeyManagerTests); +export { KeyManagerTests }; diff --git a/build/esm/tests/keysignature_tests.js b/build/esm/tests/keysignature_tests.js new file mode 100644 index 0000000000..e5c92135a0 --- /dev/null +++ b/build/esm/tests/keysignature_tests.js @@ -0,0 +1,308 @@ +import { MAJOR_KEYS, MINOR_KEYS, VexFlowTests } from './vexflow_test_helpers.js'; +import { Flow } from '../src/flow.js'; +import { Glyph } from '../src/glyph.js'; +import { KeySignature } from '../src/keysignature.js'; +import { Stave } from '../src/stave.js'; +import { BarlineType } from '../src/stavebarline.js'; +const KeySignatureTests = { + Start() { + QUnit.module('KeySignature'); + test('Key Parser Test', parser); + const run = VexFlowTests.runTests; + run('Major Key Test', majorKeys); + run('Minor Key Test', minorKeys); + run('Stave Helper', staveHelper); + run('Cancelled key test', majorKeysCanceled); + run('Cancelled key (for each clef) test', keysCanceledForEachClef); + run('Altered key test', majorKeysAltered); + run('End key with clef test', endKeyWithClef); + run('Key Signature Change test', changeKey); + }, +}; +const fontWidths = () => { + const glyphScale = 39; + const sharpWidth = Glyph.getWidth('accidentalSharp', glyphScale) + 1; + const flatWidth = Glyph.getWidth('accidentalFlat', glyphScale) + 1; + const naturalWidth = Glyph.getWidth('accidentalNatural', glyphScale) + 2; + const clefWidth = Glyph.getWidth('gClef', glyphScale) * 2; + return { sharpWidth, flatWidth, naturalWidth, clefWidth }; +}; +function parser() { + expect(11); + function catchError(spec) { + throws(() => Flow.keySignature(spec), /BadKeySignature/); + } + catchError('asdf'); + catchError('D!'); + catchError('E#'); + catchError('D#'); + catchError('#'); + catchError('b'); + catchError('Kb'); + catchError('Fb'); + catchError('Dbm'); + catchError('B#m'); + Flow.keySignature('B'); + Flow.keySignature('C'); + Flow.keySignature('Fm'); + Flow.keySignature('Ab'); + Flow.keySignature('Abm'); + Flow.keySignature('F#'); + Flow.keySignature('G#m'); + ok(true, 'all pass'); +} +function majorKeys(options, contextBuilder) { + const w = fontWidths(); + const accidentalCount = 28; + const casePadding = 10; + const testCases = 7; + const sharpTestWidth = accidentalCount * w.sharpWidth + casePadding * testCases + Stave.defaultPadding; + const flatTestWidth = accidentalCount * w.flatWidth + casePadding * testCases + Stave.defaultPadding; + const ctx = contextBuilder(options.elementId, Math.max(sharpTestWidth, flatTestWidth) + 100, 240); + const stave1 = new Stave(10, 10, flatTestWidth); + const stave2 = new Stave(10, 90, sharpTestWidth); + const keys = MAJOR_KEYS; + let keySig = null; + for (let i = 0; i < 8; ++i) { + keySig = new KeySignature(keys[i]); + keySig.addToStave(stave1); + } + for (let n = 8; n < keys.length; ++n) { + keySig = new KeySignature(keys[n]); + keySig.addToStave(stave2); + } + stave1.setContext(ctx); + stave1.draw(); + stave2.setContext(ctx); + stave2.draw(); + ok(true, 'all pass'); +} +function majorKeysCanceled(options, contextBuilder) { + const scale = 0.9; + const w = fontWidths(); + const flatPadding = 18; + const sharpPadding = 20; + const flatTestCases = 8; + const sharpTestCases = 7; + const sharpTestWidth = 28 * w.sharpWidth + 21 * w.naturalWidth + sharpPadding * sharpTestCases + Stave.defaultPadding + w.clefWidth; + const flatTestWidth = 28 * w.flatWidth + 28 * w.naturalWidth + flatPadding * flatTestCases + Stave.defaultPadding + w.clefWidth; + const eFlatTestWidth = 28 * w.flatWidth + 32 * w.naturalWidth + flatPadding * flatTestCases + Stave.defaultPadding + w.clefWidth; + const eSharpTestWidth = 28 * w.sharpWidth + 28 * w.naturalWidth + sharpPadding * sharpTestCases + Stave.defaultPadding + w.clefWidth; + const maxWidth = Math.max(Math.max(sharpTestWidth, flatTestWidth, Math.max(eSharpTestWidth, eFlatTestWidth))); + const ctx = contextBuilder(options.elementId, maxWidth + 100, 500); + ctx.scale(scale, scale); + const stave1 = new Stave(10, 10, flatTestWidth).addClef('treble'); + const stave2 = new Stave(10, 90, sharpTestWidth).addClef('treble'); + const stave3 = new Stave(10, 170, eFlatTestWidth).addClef('treble'); + const stave4 = new Stave(10, 250, eSharpTestWidth).addClef('treble'); + const keys = MAJOR_KEYS; + let keySig = null; + let i; + let n; + for (i = 0; i < 8; ++i) { + keySig = new KeySignature(keys[i]); + keySig.cancelKey('Cb'); + keySig.setPadding(flatPadding); + keySig.addToStave(stave1); + } + for (n = 8; n < keys.length; ++n) { + keySig = new KeySignature(keys[n]); + keySig.cancelKey('C#'); + keySig.setPadding(sharpPadding); + keySig.addToStave(stave2); + } + for (i = 0; i < 8; ++i) { + keySig = new KeySignature(keys[i]); + keySig.cancelKey('E'); + keySig.setPadding(flatPadding); + keySig.addToStave(stave3); + } + for (n = 8; n < keys.length; ++n) { + keySig = new KeySignature(keys[n]); + keySig.cancelKey('Ab'); + keySig.setPadding(sharpPadding); + keySig.addToStave(stave4); + } + stave1.setContext(ctx); + stave1.draw(); + stave2.setContext(ctx); + stave2.draw(); + stave3.setContext(ctx); + stave3.draw(); + stave4.setContext(ctx); + stave4.draw(); + ok(true, 'all pass'); +} +function keysCanceledForEachClef(options, contextBuilder) { + const scale = 0.8; + const w = fontWidths(); + const keyPadding = 10; + const keys = ['C#', 'Cb']; + const flatsKey = [7, 14]; + const sharpsKey = [14, 7]; + const natsKey = [7, 7]; + const max = 21 * Math.max(w.sharpWidth, w.flatWidth) * 2 + keyPadding * 6 + Stave.defaultPadding + w.clefWidth; + const ctx = contextBuilder(options.elementId, max + 100, 380); + ctx.scale(scale, scale); + const x = 20; + let y = 20; + let tx = x; + ['bass', 'tenor', 'soprano', 'mezzo-soprano', 'baritone-f'].forEach(function (clef) { + keys.forEach((key, keyIx) => { + const cancelKey = keys[(keyIx + 1) % 2]; + const width = flatsKey[keyIx] * w.flatWidth + + natsKey[keyIx] * w.naturalWidth + + sharpsKey[keyIx] * w.sharpWidth + + keyPadding * 3 + + w.clefWidth + + Stave.defaultPadding; + const stave = new Stave(tx, y, width); + stave.setClef(clef); + stave.addKeySignature(cancelKey); + stave.addKeySignature(key, cancelKey); + stave.addKeySignature(key); + stave.setContext(ctx).draw(); + tx += width; + }); + tx = x; + y += 80; + }); + ok(true, 'all pass'); +} +function majorKeysAltered(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 780, 500); + ctx.scale(0.9, 0.9); + const stave1 = new Stave(10, 10, 750).addClef('treble'); + const stave2 = new Stave(10, 90, 750).addClef('treble'); + const stave3 = new Stave(10, 170, 750).addClef('treble'); + const stave4 = new Stave(10, 250, 750).addClef('treble'); + const keys = MAJOR_KEYS; + let keySig = null; + let i; + let n; + for (i = 0; i < 8; ++i) { + keySig = new KeySignature(keys[i]); + keySig.alterKey(['bs', 'bs']); + keySig.setPadding(18); + keySig.addToStave(stave1); + } + for (n = 8; n < keys.length; ++n) { + keySig = new KeySignature(keys[n]); + keySig.alterKey(['+', '+', '+']); + keySig.setPadding(20); + keySig.addToStave(stave2); + } + for (i = 0; i < 8; ++i) { + keySig = new KeySignature(keys[i]); + keySig.alterKey(['n', 'bs', 'bb']); + keySig.setPadding(18); + keySig.addToStave(stave3); + } + for (n = 8; n < keys.length; ++n) { + keySig = new KeySignature(keys[n]); + keySig.alterKey(['++', '+', 'n', '+']); + keySig.setPadding(20); + keySig.addToStave(stave4); + } + stave1.setContext(ctx); + stave1.draw(); + stave2.setContext(ctx); + stave2.draw(); + stave3.setContext(ctx); + stave3.draw(); + stave4.setContext(ctx); + stave4.draw(); + ok(true, 'all pass'); +} +function minorKeys(options, contextBuilder) { + const accidentalCount = 28; + const w = fontWidths(); + const casePadding = 10; + const testCases = 7; + const sharpTestWidth = accidentalCount * w.sharpWidth + casePadding * testCases + Stave.defaultPadding; + const flatTestWidth = accidentalCount * w.flatWidth + casePadding * testCases + Stave.defaultPadding; + const ctx = contextBuilder(options.elementId, Math.max(sharpTestWidth, flatTestWidth) + 100, 240); + const stave1 = new Stave(10, 10, flatTestWidth); + const stave2 = new Stave(10, 90, sharpTestWidth); + const keys = MINOR_KEYS; + let keySig = null; + for (let i = 0; i < 8; ++i) { + keySig = new KeySignature(keys[i]); + keySig.addToStave(stave1); + } + for (let n = 8; n < keys.length; ++n) { + keySig = new KeySignature(keys[n]); + keySig.addToStave(stave2); + } + stave1.setContext(ctx); + stave1.draw(); + stave2.setContext(ctx); + stave2.draw(); + ok(true, 'all pass'); +} +function endKeyWithClef(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 200); + ctx.scale(0.9, 0.9); + const stave1 = new Stave(10, 10, 350); + stave1 + .setKeySignature('G') + .setBegBarType(BarlineType.REPEAT_BEGIN) + .setEndBarType(BarlineType.REPEAT_END) + .setClef('treble') + .addTimeSignature('4/4') + .setEndClef('bass') + .setEndKeySignature('Cb'); + const stave2 = new Stave(10, 90, 350); + stave2.setKeySignature('Cb').setClef('bass').setEndClef('treble').setEndKeySignature('G'); + stave1.setContext(ctx).draw(); + stave2.setContext(ctx).draw(); + ok(true, 'all pass'); +} +function staveHelper(options, contextBuilder) { + const w = fontWidths(); + const accidentalCount = 28; + const casePadding = 10; + const testCases = 7; + const sharpTestWidth = accidentalCount * w.sharpWidth + casePadding * testCases + Stave.defaultPadding; + const flatTestWidth = accidentalCount * w.flatWidth + casePadding * testCases + Stave.defaultPadding; + const ctx = contextBuilder(options.elementId, Math.max(sharpTestWidth, flatTestWidth) + 100, 240); + const stave1 = new Stave(10, 10, flatTestWidth); + const stave2 = new Stave(10, 90, sharpTestWidth); + const keys = MAJOR_KEYS; + for (let i = 0; i < 8; ++i) { + stave1.addKeySignature(keys[i]); + } + for (let n = 8; n < keys.length; ++n) { + stave2.addKeySignature(keys[n]); + } + stave1.setContext(ctx); + stave1.draw(); + stave2.setContext(ctx); + stave2.draw(); + ok(true, 'all pass'); +} +function changeKey(options) { + const f = VexFlowTests.makeFactory(options, 900); + const stave = f.Stave({ x: 10, y: 10, width: 800 }).addClef('treble').addTimeSignature('C|'); + const voice = f + .Voice() + .setStrict(false) + .addTickables([ + f.KeySigNote({ key: 'Bb' }), + f.StaveNote({ keys: ['c/4'], duration: '1' }), + f.BarNote(), + f.KeySigNote({ key: 'D', cancelKey: 'Bb' }), + f.StaveNote({ keys: ['c/4'], duration: '1' }), + f.BarNote(), + f.KeySigNote({ key: 'Bb' }), + f.StaveNote({ keys: ['c/4'], duration: '1' }), + f.BarNote(), + f.KeySigNote({ key: 'D', alterKey: ['b', 'n'] }), + f.StaveNote({ keys: ['c/4'], duration: '1' }), + ]); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'all pass'); +} +VexFlowTests.register(KeySignatureTests); +export { KeySignatureTests }; diff --git a/build/esm/tests/mocks.js b/build/esm/tests/mocks.js new file mode 100644 index 0000000000..64d6a6f680 --- /dev/null +++ b/build/esm/tests/mocks.js @@ -0,0 +1,71 @@ +import { Fraction } from '../src/fraction.js'; +import { Tickable } from '../src/tickable.js'; +class MockTickable extends Tickable { + constructor() { + super(...arguments); + this.ticks = new Fraction(1, 1); + this.width = 0; + this.ignore_ticks = false; + } + init() { + } + getX() { + return this.tickContext.getX(); + } + getIntrinsicTicks() { + return this.ticks.value(); + } + getTicks() { + return this.ticks; + } + setTicks(t) { + this.ticks = new Fraction(t, 1); + return this; + } + getMetrics() { + return { + width: 0, + glyphWidth: 0, + notePx: this.width, + modLeftPx: 0, + modRightPx: 0, + leftDisplacedHeadPx: 0, + rightDisplacedHeadPx: 0, + glyphPx: 0, + }; + } + getWidth() { + return this.width; + } + setWidth(w) { + this.width = w; + return this; + } + setVoice(v) { + this.voice = v; + return this; + } + setStave(stave) { + this.stave = stave; + return this; + } + getStave() { + return this.stave; + } + setTickContext(tc) { + this.tickContext = tc; + return this; + } + setIgnoreTicks(flag) { + this.ignore_ticks = flag; + return this; + } + shouldIgnoreTicks() { + return this.ignore_ticks; + } + preFormat() { + } + draw(...args) { + } +} +export { MockTickable }; diff --git a/build/esm/tests/modifier_tests.js b/build/esm/tests/modifier_tests.js new file mode 100644 index 0000000000..2b0c1a110d --- /dev/null +++ b/build/esm/tests/modifier_tests.js @@ -0,0 +1,24 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Modifier, ModifierContext } from '../src/index.js'; +const ModifierContextTests = { + Start() { + QUnit.module('ModifierContext'); + test('Modifier Width Test', width); + test('Modifier Management', management); + }, +}; +function width() { + const mc = new ModifierContext(); + equal(mc.getWidth(), 0, 'New modifier context has no width'); +} +function management() { + const mc = new ModifierContext(); + const modifier1 = new Modifier(); + const modifier2 = new Modifier(); + mc.addMember(modifier1); + mc.addMember(modifier2); + const modifiers = mc.getMembers(Modifier.CATEGORY); + equal(modifiers.length, 2, 'Added two modifiers'); +} +VexFlowTests.register(ModifierContextTests); +export { ModifierContextTests }; diff --git a/build/esm/tests/multimeasurerest_tests.js b/build/esm/tests/multimeasurerest_tests.js new file mode 100644 index 0000000000..aa3043562b --- /dev/null +++ b/build/esm/tests/multimeasurerest_tests.js @@ -0,0 +1,141 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Flow } from '../src/flow.js'; +import { Font } from '../src/font.js'; +const MultiMeasureRestTests = { + Start() { + QUnit.module('MultiMeasureRest'); + const run = VexFlowTests.runTests; + run('Simple Test', simple); + run('Stave with modifiers Test', staveWithModifiers); + }, +}; +function simple(options) { + const width = 910; + const f = VexFlowTests.makeFactory(options, width, 300); + const line_spacing_15px = { options: { spacing_between_lines_px: 15 } }; + const params = [ + [{}, { number_of_measures: 2, show_number: false }], + [{}, { number_of_measures: 2 }], + [{}, { number_of_measures: 2, line_thickness: 8, serif_thickness: 3 }], + [{}, { number_of_measures: 1, use_symbols: true }], + [{}, { number_of_measures: 2, use_symbols: true }], + [{}, { number_of_measures: 3, use_symbols: true }], + [{}, { number_of_measures: 4, use_symbols: true }], + [{}, { number_of_measures: 5, use_symbols: true }], + [{}, { number_of_measures: 6, use_symbols: true }], + [{}, { number_of_measures: 7, use_symbols: true }], + [{}, { number_of_measures: 8, use_symbols: true }], + [{}, { number_of_measures: 9, use_symbols: true }], + [{}, { number_of_measures: 10, use_symbols: true }], + [{}, { number_of_measures: 11, use_symbols: true }], + [{}, { number_of_measures: 11, use_symbols: false, padding_left: 20, padding_right: 20 }], + [{}, { number_of_measures: 11, use_symbols: true, symbol_spacing: 5 }], + [{}, { number_of_measures: 11, use_symbols: false, line: 3, number_line: 2 }], + [{}, { number_of_measures: 11, use_symbols: true, line: 3, number_line: 2 }], + [line_spacing_15px, { number_of_measures: 12 }], + [line_spacing_15px, { number_of_measures: 9, use_symbols: true }], + [line_spacing_15px, { number_of_measures: 12, spacing_between_lines_px: 15, number_glyph_point: 40 * 1.5 }], + [ + line_spacing_15px, + { + number_of_measures: 9, + spacing_between_lines_px: 15, + use_symbols: true, + number_glyph_point: 40 * 1.5, + }, + ], + [ + line_spacing_15px, + { + number_of_measures: 9, + spacing_between_lines_px: 15, + use_symbols: true, + number_glyph_point: 40 * 1.5, + semibreve_rest_glyph_scale: Flow.NOTATION_FONT_SCALE * 1.5, + }, + ], + ]; + const staveWidth = 100; + let x = 0; + let y = 0; + const mmRests = params.map((param) => { + if (x + staveWidth * 2 > width) { + x = 0; + y += 80; + } + const staveParams = param[0]; + const mmRestParams = param[1]; + staveParams.x = x; + staveParams.y = y; + staveParams.width = staveWidth; + x += staveWidth; + const stave = f.Stave(staveParams); + return f.MultiMeasureRest(mmRestParams).setStave(stave); + }); + f.draw(); + const xs = mmRests[0].getXs(); + const strY = mmRests[0].getStave().getYForLine(-0.5); + const str = 'TACET'; + const context = f.getContext(); + context.save(); + context.setFont(Font.SERIF, 16, 'bold'); + const metrics = context.measureText(str); + context.fillText(str, xs.left + (xs.right - xs.left) * 0.5 - metrics.width * 0.5, strY); + context.restore(); + ok(true, 'Simple Test'); +} +function staveWithModifiers(options) { + const width = 910; + const f = VexFlowTests.makeFactory(options, width, 200); + let x = 0; + let y = 0; + const params = [ + [{ clef: 'treble', params: { width: 150 } }, { number_of_measures: 5 }], + [{ clef: 'treble', keySig: 'G', params: { width: 150 } }, { number_of_measures: 5 }], + [{ clef: 'treble', timeSig: '4/4', keySig: 'G', params: { width: 150 } }, { number_of_measures: 5 }], + [{ clef: 'treble', endClef: 'bass', params: { width: 150 } }, { number_of_measures: 5 }], + [{ clef: 'treble', endKeySig: 'F', params: { width: 150 } }, { number_of_measures: 5 }], + [{ clef: 'treble', endTimeSig: '2/4', params: { width: 150 } }, { number_of_measures: 5 }], + [{ clef: 'treble', endClef: 'bass', endTimeSig: '2/4', params: { width: 150 } }, { number_of_measures: 5 }], + [ + { clef: 'treble', endClef: 'bass', endTimeSig: '2/4', params: { width: 150 } }, + { number_of_measures: 5, use_symbols: true }, + ], + ]; + params.forEach((param) => { + const staveOptions = param[0]; + const staveParams = staveOptions.params; + const mmrestParams = param[1]; + if (x + staveParams.width > width) { + x = 0; + y += 80; + } + staveParams.x = x; + x += staveParams.width; + staveParams.y = y; + const stave = f.Stave(staveParams); + if (staveOptions.clef) { + stave.addClef(staveOptions.clef); + } + if (staveOptions.timeSig) { + stave.addTimeSignature(staveOptions.timeSig); + } + if (staveOptions.keySig) { + stave.addKeySignature(staveOptions.keySig); + } + if (staveOptions.endClef) { + stave.addEndClef(staveOptions.endClef); + } + if (staveOptions.endKeySig) { + stave.setEndKeySignature(staveOptions.endKeySig); + } + if (staveOptions.endTimeSig) { + stave.setEndTimeSignature(staveOptions.endTimeSig); + } + return f.MultiMeasureRest(mmrestParams).setStave(stave); + }); + f.draw(); + ok(true, 'Stave with modifiers Test'); +} +VexFlowTests.register(MultiMeasureRestTests); +export { MultiMeasureRestTests }; diff --git a/build/esm/tests/music_tests.js b/build/esm/tests/music_tests.js new file mode 100644 index 0000000000..404d779b5b --- /dev/null +++ b/build/esm/tests/music_tests.js @@ -0,0 +1,161 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { KeyManager } from '../src/keymanager.js'; +import { Music } from '../src/music.js'; +const MusicTests = { + Start() { + QUnit.module('MusicTests'); + test('Valid Notes', validNotes); + test('Valid Keys', validKeys); + test('Note Values', noteValue); + test('Interval Values', intervalValue); + test('Relative Notes', relativeNotes); + test('Relative Note Names', relativeNoteNames); + test('Canonical Notes', canonicalNotes); + test('Canonical Intervals', canonicalIntervals); + test('Scale Tones', scaleTones); + test('Scale Intervals', scaleIntervals); + }, +}; +function validNotes() { + expect(10); + const music = new Music(); + let parts = music.getNoteParts('c'); + equal(parts.root, 'c'); + equal(parts.accidental, null); + parts = music.getNoteParts('C'); + equal(parts.root, 'c'); + equal(parts.accidental, null); + parts = music.getNoteParts('c#'); + equal(parts.root, 'c'); + equal(parts.accidental, '#'); + parts = music.getNoteParts('c##'); + equal(parts.root, 'c'); + equal(parts.accidental, '##'); + throws(() => music.getNoteParts('r'), /BadArguments/, 'Invalid note: r'); + throws(() => music.getNoteParts(''), /BadArguments/, "Invalid note: ''"); +} +function validKeys() { + expect(18); + const music = new Music(); + let parts = music.getKeyParts('c'); + equal(parts.root, 'c'); + equal(parts.accidental, null); + equal(parts.type, 'M'); + parts = music.getKeyParts('d#'); + equal(parts.root, 'd'); + equal(parts.accidental, '#'); + equal(parts.type, 'M'); + parts = music.getKeyParts('fbm'); + equal(parts.root, 'f'); + equal(parts.accidental, 'b'); + equal(parts.type, 'm'); + parts = music.getKeyParts('c#mel'); + equal(parts.root, 'c'); + equal(parts.accidental, '#'); + equal(parts.type, 'mel'); + parts = music.getKeyParts('g#harm'); + equal(parts.root, 'g'); + equal(parts.accidental, '#'); + equal(parts.type, 'harm'); + throws(() => music.getKeyParts('r'), /BadArguments/, 'Invalid key: r'); + throws(() => music.getKeyParts(''), /BadArguments/, `Invalid key: ''`); + throws(() => music.getKeyParts('#m'), /BadArguments/, 'Invalid key: #m'); +} +function noteValue() { + expect(3); + const music = new Music(); + let note = music.getNoteValue('c'); + equal(note, 0); + throws(() => music.getNoteValue('r'), /BadArguments/, 'Invalid note name'); + note = music.getNoteValue('f#'); + equal(note, 6); +} +function intervalValue() { + expect(2); + const music = new Music(); + const value = music.getIntervalValue('b2'); + equal(value, 1); + throws(() => music.getIntervalValue('7'), /BadArguments/, 'Invalid interval name'); +} +function relativeNotes() { + expect(8); + const music = new Music(); + let value = music.getRelativeNoteValue(music.getNoteValue('c'), music.getIntervalValue('b5')); + equal(value, 6); + throws(() => music.getRelativeNoteValue(music.getNoteValue('bc'), music.getIntervalValue('b2')), /BadArguments/, 'Invalid note'); + throws(() => music.getRelativeNoteValue(music.getNoteValue('b'), music.getIntervalValue('p3')), /BadArguments/, 'Invalid interval'); + value = music.getRelativeNoteValue(music.getNoteValue('d'), music.getIntervalValue('2'), -1); + equal(value, 0); + throws(() => music.getRelativeNoteValue(music.getNoteValue('b'), music.getIntervalValue('p4'), 0), /BadArguments/, 'Invalid direction: 0'); + value = music.getRelativeNoteValue(music.getNoteValue('b'), music.getIntervalValue('b5')); + equal(value, 5); + value = music.getRelativeNoteValue(music.getNoteValue('c'), music.getIntervalValue('b2'), -1); + equal(value, 11); + value = music.getRelativeNoteValue(music.getNoteValue('g'), music.getIntervalValue('p5')); + equal(value, 2); +} +function relativeNoteNames() { + expect(9); + const music = new Music(); + equal(music.getRelativeNoteName('b', music.getNoteValue('c#')), 'b##'); + equal(music.getRelativeNoteName('c', music.getNoteValue('c')), 'c'); + equal(music.getRelativeNoteName('c', music.getNoteValue('db')), 'c#'); + equal(music.getRelativeNoteName('c', music.getNoteValue('b')), 'cb'); + equal(music.getRelativeNoteName('c#', music.getNoteValue('db')), 'c#'); + equal(music.getRelativeNoteName('e', music.getNoteValue('f#')), 'e##'); + equal(music.getRelativeNoteName('e', music.getNoteValue('d#')), 'eb'); + equal(music.getRelativeNoteName('e', music.getNoteValue('fb')), 'e'); + throws(() => music.getRelativeNoteName('e', music.getNoteValue('g#')), /BadArguments/, 'Too far away. Notes not related.'); +} +function canonicalNotes() { + expect(3); + const music = new Music(); + equal(music.getCanonicalNoteName(0), 'c'); + equal(music.getCanonicalNoteName(2), 'd'); + throws(() => music.getCanonicalNoteName(-1), /BadArguments/, 'Invalid note value'); +} +function canonicalIntervals() { + expect(3); + const music = new Music(); + equal(music.getCanonicalIntervalName(0), 'unison'); + equal(music.getCanonicalIntervalName(2), 'M2'); + throws(() => music.getCanonicalIntervalName(-1), /BadArguments/, 'Invalid interval value'); +} +function scaleTones() { + expect(24); + const music = new Music(); + const manager = new KeyManager('CM'); + const c_major = music.getScaleTones(music.getNoteValue('c'), Music.scales.major); + let values = ['c', 'd', 'e', 'f', 'g', 'a', 'b']; + equal(c_major.length, 7); + for (let i = 0; i < c_major.length; ++i) { + equal(music.getCanonicalNoteName(c_major[i]), values[i]); + } + const c_dorian = music.getScaleTones(music.getNoteValue('c'), Music.scales.dorian); + values = ['c', 'd', 'eb', 'f', 'g', 'a', 'bb']; + let note = null; + equal(c_dorian.length, 7); + for (let i = 0; i < c_dorian.length; ++i) { + note = music.getCanonicalNoteName(c_dorian[i]); + equal(manager.selectNote(note).note, values[i]); + } + const c_mixolydian = music.getScaleTones(music.getNoteValue('c'), Music.scales.mixolydian); + values = ['c', 'd', 'e', 'f', 'g', 'a', 'bb']; + equal(c_mixolydian.length, 7); + for (let i = 0; i < c_mixolydian.length; ++i) { + note = music.getCanonicalNoteName(c_mixolydian[i]); + equal(manager.selectNote(note).note, values[i]); + } +} +function scaleIntervals() { + expect(6); + const m = new Music(); + equal(m.getCanonicalIntervalName(m.getIntervalBetween(m.getNoteValue('c'), m.getNoteValue('d'))), 'M2'); + equal(m.getCanonicalIntervalName(m.getIntervalBetween(m.getNoteValue('g'), m.getNoteValue('c'))), 'p4'); + equal(m.getCanonicalIntervalName(m.getIntervalBetween(m.getNoteValue('c'), m.getNoteValue('c'))), 'unison'); + equal(m.getCanonicalIntervalName(m.getIntervalBetween(m.getNoteValue('f'), m.getNoteValue('cb'))), 'dim5'); + equal(m.getCanonicalIntervalName(m.getIntervalBetween(m.getNoteValue('d'), m.getNoteValue('c'), 1)), 'b7'); + equal(m.getCanonicalIntervalName(m.getIntervalBetween(m.getNoteValue('d'), m.getNoteValue('c'), -1)), 'M2'); +} +VexFlowTests.register(MusicTests); +export { MusicTests }; diff --git a/build/esm/tests/notehead_tests.js b/build/esm/tests/notehead_tests.js new file mode 100644 index 0000000000..d694378143 --- /dev/null +++ b/build/esm/tests/notehead_tests.js @@ -0,0 +1,137 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Flow } from '../src/flow.js'; +import { Formatter } from '../src/formatter.js'; +import { NoteHead } from '../src/notehead.js'; +import { Stave } from '../src/stave.js'; +import { StaveNote } from '../src/stavenote.js'; +import { TickContext } from '../src/tickcontext.js'; +import { Voice } from '../src/voice.js'; +const NoteHeadTests = { + Start() { + QUnit.module('NoteHead'); + const run = VexFlowTests.runTests; + run('Basic', basic); + run('Various Heads', variousHeads); + run('Drum Chord Heads', drumChordHeads); + run('Bounding Boxes', basicBoundingBoxes); + }, +}; +function setContextStyle(ctx) { + ctx.scale(1.8, 1.8); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + ctx.font = '10pt Arial'; +} +function basic(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 450, 250); + setContextStyle(ctx); + const stave = new Stave(10, 0, 250).addClef('treble'); + stave.setContext(ctx).draw(); + const formatter = new Formatter(); + const voice = new Voice(Flow.TIME4_4).setStrict(false); + const note_head1 = new NoteHead({ duration: '4', line: 3 }); + const note_head2 = new NoteHead({ duration: '1', line: 2.5 }); + const note_head3 = new NoteHead({ duration: '2', line: 0 }); + voice.addTickables([note_head1, note_head2, note_head3]); + formatter.joinVoices([voice]).formatToStave([voice], stave); + voice.draw(ctx, stave); + ok('Basic NoteHead test'); +} +function showNote(noteStruct, stave, ctx, x) { + const note = new StaveNote(noteStruct).setStave(stave); + new TickContext().addTickable(note).preFormat().setX(x); + note.setContext(ctx).draw(); + return note; +} +function variousHeads(options, contextBuilder) { + const notes = [ + { keys: ['g/5/d0'], duration: '4' }, + { keys: ['g/5/d1'], duration: '4' }, + { keys: ['g/5/d2'], duration: '4' }, + { keys: ['g/5/d3'], duration: '4' }, + { keys: ['x/'], duration: '1' }, + { keys: ['g/5/t0'], duration: '1' }, + { keys: ['g/5/t1'], duration: '4' }, + { keys: ['g/5/t2'], duration: '4' }, + { keys: ['g/5/t3'], duration: '4' }, + { keys: ['x/'], duration: '1' }, + { keys: ['g/5/x0'], duration: '1' }, + { keys: ['g/5/x1'], duration: '4' }, + { keys: ['g/5/x2'], duration: '4' }, + { keys: ['g/5/x3'], duration: '4' }, + { keys: ['x/'], duration: '1' }, + { keys: ['g/5/s1'], duration: '4' }, + { keys: ['g/5/s2'], duration: '4' }, + { keys: ['x/'], duration: '1' }, + { keys: ['g/5/r1'], duration: '4' }, + { keys: ['g/5/r2'], duration: '4' }, + ]; + const ctx = contextBuilder(options.elementId, notes.length * 25 + 100, 240); + for (let staveNum = 0; staveNum < 2; ++staveNum) { + const stave = new Stave(10, 10 + staveNum * 120, notes.length * 25 + 75) + .addClef('percussion') + .setContext(ctx) + .draw(); + for (let i = 0; i < notes.length; ++i) { + const note = notes[i]; + note.stem_direction = staveNum === 0 ? -1 : 1; + const staveNote = showNote(note, stave, ctx, (i + 1) * 25); + ok(staveNote.getX() > 0, 'Note ' + i + ' has X value'); + ok(staveNote.getYs().length > 0, 'Note ' + i + ' has Y values'); + } + } +} +function drumChordHeads(options, contextBuilder) { + const notes = [ + { keys: ['a/4/d0', 'g/5/x3'], duration: '4' }, + { keys: ['a/4/x3', 'g/5/d0'], duration: '4' }, + { keys: ['a/4/d1', 'g/5/x2'], duration: '4' }, + { keys: ['a/4/x2', 'g/5/d1'], duration: '4' }, + { keys: ['a/4/d2', 'g/5/x1'], duration: '4' }, + { keys: ['a/4/x1', 'g/5/d2'], duration: '4' }, + { keys: ['a/4/d3', 'g/5/x0'], duration: '4' }, + { keys: ['a/4/x0', 'g/5/d3'], duration: '4' }, + { keys: ['a/4', 'g/5/d0'], duration: '4' }, + { keys: ['a/4/x3', 'g/5'], duration: '4' }, + { keys: ['a/4/t0', 'g/5/s1'], duration: '4' }, + { keys: ['a/4/s1', 'g/5/t0'], duration: '4' }, + { keys: ['a/4/t1', 'g/5/s2'], duration: '4' }, + { keys: ['a/4/s2', 'g/5/t1'], duration: '4' }, + { keys: ['a/4/t2', 'g/5/r1'], duration: '4' }, + { keys: ['a/4/r1', 'g/5/t2'], duration: '4' }, + { keys: ['a/4/t3', 'g/5/r2'], duration: '4' }, + { keys: ['a/4/r2', 'g/5/t3'], duration: '4' }, + ]; + const ctx = contextBuilder(options.elementId, notes.length * 25 + 100, 240); + for (let h = 0; h < 2; ++h) { + const stave = new Stave(10, 10 + h * 120, notes.length * 25 + 75).addClef('percussion').setContext(ctx).draw(); + for (let i = 0; i < notes.length; ++i) { + const note = notes[i]; + note.stem_direction = h === 0 ? -1 : 1; + const staveNote = showNote(note, stave, ctx, (i + 1) * 25); + ok(staveNote.getX() > 0, 'Note ' + i + ' has X value'); + ok(staveNote.getYs().length > 0, 'Note ' + i + ' has Y values'); + } + } +} +function basicBoundingBoxes(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 450, 250); + setContextStyle(ctx); + const stave = new Stave(10, 0, 250).addClef('treble'); + stave.setContext(ctx).draw(); + const formatter = new Formatter(); + const voice = new Voice(Flow.TIME4_4).setStrict(false); + const nh1 = new NoteHead({ duration: '4', line: 3 }); + const nh2 = new NoteHead({ duration: '2', line: 2.5 }); + const nh3 = new NoteHead({ duration: '1', line: 0 }); + voice.addTickables([nh1, nh2, nh3]); + formatter.joinVoices([voice]).formatToStave([voice], stave); + voice.draw(ctx, stave); + for (const bb of [nh1.getBoundingBox(), nh2.getBoundingBox(), nh3.getBoundingBox()]) { + ctx.rect(bb.getX(), bb.getY(), bb.getW(), bb.getH()); + } + ctx.stroke(); + ok('NoteHead Bounding Boxes'); +} +VexFlowTests.register(NoteHeadTests); +export { NoteHeadTests }; diff --git a/build/esm/tests/notesubgroup_tests.js b/build/esm/tests/notesubgroup_tests.js new file mode 100644 index 0000000000..36e2626389 --- /dev/null +++ b/build/esm/tests/notesubgroup_tests.js @@ -0,0 +1,149 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { BarNote } from '../src/barnote.js'; +import { Note } from '../src/note.js'; +import { BarlineType } from '../src/stavebarline.js'; +const NoteSubGroupTests = { + Start() { + QUnit.module('NoteSubGroup'); + const run = VexFlowTests.runTests; + run('Basic - ClefNote, TimeSigNote and BarNote', basic); + run('Multi Voice', multiVoiceSingleDraw); + run('Multi Voice Multiple Draws', multiVoiceDoubleDraw); + run('Multi Staff', multiStaff); + }, +}; +function createShortcuts(f) { + return { + createStaveNote: (noteStruct) => f.StaveNote(noteStruct), + addAccidental: (note, accid) => note.addModifier(f.Accidental({ type: accid }), 0), + addSubGroup: (note, subNotes) => note.addModifier(f.NoteSubGroup({ notes: subNotes }), 0), + }; +} +function basic(options) { + const f = VexFlowTests.makeFactory(options, 750, 200); + const ctx = f.getContext(); + const stave = f.Stave({ width: 600 }).addClef('treble'); + const { createStaveNote, addAccidental, addSubGroup } = createShortcuts(f); + const notes = [ + { keys: ['f/5'], stem_direction: -1, duration: '4' }, + { keys: ['d/4'], stem_direction: -1, duration: '4', clef: 'bass' }, + { keys: ['g/4'], stem_direction: -1, duration: '4', clef: 'alto' }, + { keys: ['a/4'], stem_direction: -1, duration: '4', clef: 'alto' }, + { keys: ['c/4'], stem_direction: -1, duration: '4', clef: 'tenor' }, + { keys: ['c/3'], stem_direction: +1, duration: '4', clef: 'tenor' }, + { keys: ['d/4'], stem_direction: -1, duration: '4', clef: 'tenor' }, + { keys: ['f/4'], stem_direction: -1, duration: '4', clef: 'tenor' }, + ].map(createStaveNote); + addAccidental(notes[1], '#'); + addAccidental(notes[2], 'n'); + addSubGroup(notes[1], [f.ClefNote({ type: 'bass', options: { size: 'small' } })]); + addSubGroup(notes[2], [f.ClefNote({ type: 'alto', options: { size: 'small' } })]); + addSubGroup(notes[4], [f.ClefNote({ type: 'tenor', options: { size: 'small' } }), new BarNote()]); + addSubGroup(notes[5], [f.TimeSigNote({ time: '6/8' })]); + addSubGroup(notes[6], [new BarNote(BarlineType.REPEAT_BEGIN)]); + addAccidental(notes[4], 'b'); + addAccidental(notes[6], 'bb'); + const voice = f.Voice().setStrict(false).addTickables(notes); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + notes.forEach((note) => Note.plotMetrics(ctx, note, 150)); + VexFlowTests.plotLegendForNoteWidth(ctx, 620, 120); + ok(true, 'all pass'); +} +function multiVoiceSingleDraw(options) { + multiVoiceHelper(options, 1); +} +function multiVoiceDoubleDraw(options) { + multiVoiceHelper(options, 2); +} +function multiVoiceHelper(options, numDraws) { + const f = VexFlowTests.makeFactory(options, 550, 200); + const ctx = f.getContext(); + const stave = f.Stave().addClef('treble'); + const { createStaveNote, addAccidental, addSubGroup } = createShortcuts(f); + const notes1 = [ + { keys: ['f/5'], stem_direction: 1, duration: '4' }, + { keys: ['d/4'], stem_direction: 1, duration: '4', clef: 'bass' }, + { keys: ['c/5'], stem_direction: 1, duration: '4', clef: 'alto' }, + { keys: ['c/5'], stem_direction: 1, duration: '4', clef: 'soprano' }, + ].map(createStaveNote); + const notes2 = [ + { keys: ['c/4'], stem_direction: -1, duration: '4' }, + { keys: ['c/3'], stem_direction: -1, duration: '4', clef: 'bass' }, + { keys: ['d/4'], stem_direction: -1, duration: '4', clef: 'alto' }, + { keys: ['f/4'], stem_direction: -1, duration: '4', clef: 'soprano' }, + ].map(createStaveNote); + addAccidental(notes1[1], '#'); + addSubGroup(notes1[1], [ + f.ClefNote({ type: 'bass', options: { size: 'small' } }), + new BarNote(BarlineType.REPEAT_BEGIN), + f.TimeSigNote({ time: '3/4' }), + ]); + addSubGroup(notes2[2], [ + f.ClefNote({ type: 'alto', options: { size: 'small' } }), + f.TimeSigNote({ time: '9/8' }), + new BarNote(BarlineType.DOUBLE), + ]); + addSubGroup(notes1[3], [f.ClefNote({ type: 'soprano', options: { size: 'small' } })]); + addAccidental(notes1[2], 'b'); + addAccidental(notes2[3], '#'); + const voices = [f.Voice().addTickables(notes1), f.Voice().addTickables(notes2)]; + f.Formatter().joinVoices(voices).formatToStave(voices, stave); + for (let i = 0; i < numDraws; i++) { + f.draw(); + } + notes1.forEach((note) => Note.plotMetrics(ctx, note, 150)); + ok(true, 'all pass'); +} +function multiStaff(options) { + const f = VexFlowTests.makeFactory(options, 550, 400); + const { createStaveNote, addAccidental, addSubGroup } = createShortcuts(f); + const stave1 = f.Stave({ x: 15, y: 30, width: 500 }).setClef('treble'); + const notes1 = [ + { keys: ['f/5'], stem_direction: 1, duration: '4' }, + { keys: ['d/4'], stem_direction: 1, duration: '4', clef: 'bass' }, + { keys: ['c/5'], stem_direction: 1, duration: '4', clef: 'alto' }, + { keys: ['c/5'], stem_direction: 1, duration: '4', clef: 'soprano' }, + ].map(createStaveNote); + const notes2 = [ + { keys: ['c/4'], stem_direction: -1, duration: '4' }, + { keys: ['c/3'], stem_direction: -1, duration: '4', clef: 'bass' }, + { keys: ['d/4'], stem_direction: -1, duration: '4', clef: 'alto' }, + { keys: ['f/4'], stem_direction: -1, duration: '4', clef: 'soprano' }, + ].map(createStaveNote); + const stave2 = f.Stave({ x: 15, y: 150, width: 500 }).setClef('bass'); + const notes3 = [ + { keys: ['e/3'], duration: '8', stem_direction: -1, clef: 'bass' }, + { keys: ['g/4'], duration: '8', stem_direction: 1, clef: 'treble' }, + { keys: ['d/4'], duration: '8', stem_direction: 1, clef: 'treble' }, + { keys: ['f/4'], duration: '8', stem_direction: 1, clef: 'treble' }, + { keys: ['c/4'], duration: '8', stem_direction: 1, clef: 'treble' }, + { keys: ['g/3'], duration: '8', stem_direction: -1, clef: 'bass' }, + { keys: ['d/3'], duration: '8', stem_direction: -1, clef: 'bass' }, + { keys: ['f/3'], duration: '8', stem_direction: -1, clef: 'bass' }, + ].map(createStaveNote); + f.StaveConnector({ top_stave: stave1, bottom_stave: stave2, type: 'brace' }); + f.StaveConnector({ top_stave: stave1, bottom_stave: stave2, type: 'singleLeft' }); + f.StaveConnector({ top_stave: stave1, bottom_stave: stave2, type: 'singleRight' }); + f.Beam({ notes: notes3.slice(1, 4) }); + f.Beam({ notes: notes3.slice(5) }); + addAccidental(notes1[1], '#'); + addSubGroup(notes1[1], [f.ClefNote({ type: 'bass', options: { size: 'small' } }), f.TimeSigNote({ time: '3/4' })]); + addSubGroup(notes2[2], [f.ClefNote({ type: 'alto', options: { size: 'small' } }), f.TimeSigNote({ time: '9/8' })]); + addSubGroup(notes1[3], [f.ClefNote({ type: 'soprano', options: { size: 'small' } })]); + addSubGroup(notes3[1], [f.ClefNote({ type: 'treble', options: { size: 'small' } })]); + addSubGroup(notes3[5], [f.ClefNote({ type: 'bass', options: { size: 'small' } })]); + addAccidental(notes3[0], '#'); + addAccidental(notes3[3], 'b'); + addAccidental(notes3[5], '#'); + addAccidental(notes1[2], 'b'); + addAccidental(notes2[3], '#'); + const voice1 = f.Voice().addTickables(notes1); + const voice2 = f.Voice().addTickables(notes2); + const voice3 = f.Voice().addTickables(notes3); + f.Formatter().joinVoices([voice1, voice2]).joinVoices([voice3]).formatToStave([voice1, voice2, voice3], stave1); + f.draw(); + ok(true, 'all pass'); +} +VexFlowTests.register(NoteSubGroupTests); +export { NoteSubGroupTests }; diff --git a/build/esm/tests/offscreencanvas_tests.js b/build/esm/tests/offscreencanvas_tests.js new file mode 100644 index 0000000000..b1c3899b1a --- /dev/null +++ b/build/esm/tests/offscreencanvas_tests.js @@ -0,0 +1,47 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { CanvasContext } from '../src/canvascontext.js'; +import { Formatter } from '../src/formatter.js'; +import { Stave } from '../src/stave.js'; +import { BarlineType } from '../src/stavebarline.js'; +import { StaveNote } from '../src/stavenote.js'; +import { globalObject } from '../src/util.js'; +const OffscreenCanvasTests = { + Start() { + if (globalObject().OffscreenCanvas === undefined) { + return; + } + QUnit.module('OffscreenCanvas'); + test('Simple Test', simpleTest); + }, +}; +function simpleTest() { + const offscreenCanvas = new OffscreenCanvas(550, 200); + const offscreenCtx = offscreenCanvas.getContext('2d'); + if (offscreenCtx == null) { + throw new Error("Couldn't create offscreen context"); + } + const ctx = new CanvasContext(offscreenCtx); + const stave = new Stave(10, 50, 200); + stave.setEndBarType(BarlineType.END); + stave.addClef('treble').setContext(ctx).draw(); + const notes = [ + new StaveNote({ keys: ['c/4'], duration: 'q' }), + new StaveNote({ keys: ['d/4'], duration: 'q' }), + new StaveNote({ keys: ['b/4'], duration: 'qr' }), + new StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: 'q' }), + ]; + Formatter.FormatAndDraw(ctx, stave, notes); + const imgBmp = offscreenCanvas.transferToImageBitmap(); + const canvas = document.createElement('canvas'); + canvas.width = offscreenCanvas.width; + canvas.height = offscreenCanvas.height; + const canvasCtx = canvas.getContext('2d'); + if (canvasCtx == null) { + throw new Error("Couldn't create canvas context"); + } + canvasCtx.drawImage(imgBmp, 0, 0); + document.body.appendChild(canvas); + ok(true, 'all pass'); +} +VexFlowTests.register(OffscreenCanvasTests); +export { OffscreenCanvasTests }; diff --git a/build/esm/tests/ornament_tests.js b/build/esm/tests/ornament_tests.js new file mode 100644 index 0000000000..8206ff5371 --- /dev/null +++ b/build/esm/tests/ornament_tests.js @@ -0,0 +1,299 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Accidental } from '../src/accidental.js'; +import { Beam } from '../src/beam.js'; +import { Dot } from '../src/dot.js'; +import { Formatter } from '../src/formatter.js'; +import { Glyph } from '../src/glyph.js'; +import { Ornament } from '../src/ornament.js'; +import { Stave } from '../src/stave.js'; +import { StaveNote } from '../src/stavenote.js'; +import { Voice, VoiceMode } from '../src/voice.js'; +const OrnamentTests = { + Start() { + QUnit.module('Ornament'); + const run = VexFlowTests.runTests; + run('Ornaments', drawOrnaments); + run('Ornaments Vertically Shifted', drawOrnamentsDisplaced); + run('Ornaments - Delayed turns', drawOrnamentsDelayed); + run('Ornaments - Delayed turns, Multiple Draws', drawOrnamentsDelayedMultipleDraws); + run('Stacked', drawOrnamentsStacked); + run('With Upper/Lower Accidentals', drawOrnamentsWithAccidentals); + run('Jazz Ornaments', jazzOrnaments); + }, +}; +function drawOrnaments(options, contextBuilder) { + expect(0); + const ctx = contextBuilder(options.elementId, 750, 195); + const stave = new Stave(10, 30, 700); + stave.setContext(ctx).draw(); + const notes = [ + new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + ]; + notes[0].addModifier(new Ornament('mordent'), 0); + notes[1].addModifier(new Ornament('mordent_inverted'), 0); + notes[2].addModifier(new Ornament('turn'), 0); + notes[3].addModifier(new Ornament('turn_inverted'), 0); + notes[4].addModifier(new Ornament('tr'), 0); + notes[5].addModifier(new Ornament('upprall'), 0); + notes[6].addModifier(new Ornament('downprall'), 0); + notes[7].addModifier(new Ornament('prallup'), 0); + notes[8].addModifier(new Ornament('pralldown'), 0); + notes[9].addModifier(new Ornament('upmordent'), 0); + notes[10].addModifier(new Ornament('downmordent'), 0); + notes[11].addModifier(new Ornament('lineprall'), 0); + notes[12].addModifier(new Ornament('prallprall'), 0); + Formatter.FormatAndDraw(ctx, stave, notes); +} +function drawOrnamentsDisplaced(options, contextBuilder) { + expect(0); + const ctx = contextBuilder(options.elementId, 750, 195); + const stave = new Stave(10, 30, 700); + stave.setContext(ctx).draw(); + const notes = [ + new StaveNote({ keys: ['a/5'], duration: '4', stem_direction: -1 }), + new StaveNote({ keys: ['a/5'], duration: '4', stem_direction: -1 }), + new StaveNote({ keys: ['a/5'], duration: '4', stem_direction: -1 }), + new StaveNote({ keys: ['a/5'], duration: '4', stem_direction: -1 }), + new StaveNote({ keys: ['a/5'], duration: '4', stem_direction: -1 }), + new StaveNote({ keys: ['a/5'], duration: '4', stem_direction: -1 }), + new StaveNote({ keys: ['a/5'], duration: '4', stem_direction: -1 }), + new StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }), + ]; + notes[0].addModifier(new Ornament('mordent'), 0); + notes[1].addModifier(new Ornament('mordent_inverted'), 0); + notes[1].addModifier(new Ornament('mordent_inverted'), 0); + notes[2].addModifier(new Ornament('turn'), 0); + notes[3].addModifier(new Ornament('turn_inverted'), 0); + notes[4].addModifier(new Ornament('tr'), 0); + notes[5].addModifier(new Ornament('upprall'), 0); + notes[6].addModifier(new Ornament('downprall'), 0); + notes[7].addModifier(new Ornament('prallup'), 0); + notes[8].addModifier(new Ornament('pralldown'), 0); + notes[9].addModifier(new Ornament('upmordent'), 0); + notes[10].addModifier(new Ornament('downmordent'), 0); + notes[11].addModifier(new Ornament('lineprall'), 0); + notes[12].addModifier(new Ornament('prallprall'), 0); + Formatter.FormatAndDraw(ctx, stave, notes); +} +const addDelayedTurns = (options, contextBuilder) => { + const context = contextBuilder(options.elementId, 550, 195); + const stave = new Stave(10, 30, 500); + stave.setContext(context).draw(); + const notes = [ + new StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }), + ]; + notes[0].addModifier(new Ornament('turn').setDelayed(true), 0); + notes[1].addModifier(new Ornament('turn_inverted').setDelayed(true), 0); + notes[2].addModifier(new Ornament('turn_inverted').setDelayed(true), 0); + notes[3].addModifier(new Ornament('turn').setDelayed(true), 0); + return { context, stave, notes }; +}; +function drawOrnamentsDelayed(options, contextBuilder) { + expect(0); + const { context, stave, notes } = addDelayedTurns(options, contextBuilder); + Formatter.FormatAndDraw(context, stave, notes); +} +function drawOrnamentsDelayedMultipleDraws(options, contextBuilder) { + expect(0); + const { context, stave, notes } = addDelayedTurns(options, contextBuilder); + Formatter.FormatAndDraw(context, stave, notes); + Formatter.FormatAndDraw(context, stave, notes); +} +function drawOrnamentsStacked(options, contextBuilder) { + expect(0); + const ctx = contextBuilder(options.elementId, 550, 195); + const stave = new Stave(10, 30, 500); + stave.setContext(ctx).draw(); + const notes = [ + new StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['a/4'], duration: '4', stem_direction: 1 }), + ]; + notes[0].addModifier(new Ornament('mordent'), 0); + notes[1].addModifier(new Ornament('turn_inverted'), 0); + notes[2].addModifier(new Ornament('turn'), 0); + notes[3].addModifier(new Ornament('turn_inverted'), 0); + notes[0].addModifier(new Ornament('turn'), 0); + notes[1].addModifier(new Ornament('prallup'), 0); + notes[2].addModifier(new Ornament('upmordent'), 0); + notes[3].addModifier(new Ornament('lineprall'), 0); + Formatter.FormatAndDraw(ctx, stave, notes); +} +function drawOrnamentsWithAccidentals(options, contextBuilder) { + expect(0); + const ctx = contextBuilder(options.elementId, 650, 250); + const stave = new Stave(10, 60, 600); + stave.setContext(ctx).draw(); + const notes = [ + new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + new StaveNote({ keys: ['f/4'], duration: '4', stem_direction: 1 }), + ]; + notes[0].addModifier(new Ornament('mordent').setUpperAccidental('#').setLowerAccidental('#'), 0); + notes[1].addModifier(new Ornament('turn_inverted').setLowerAccidental('b').setUpperAccidental('b'), 0); + notes[1].addModifier(new Ornament('turn_inverted').setLowerAccidental('b').setUpperAccidental('b'), 0); + notes[2].addModifier(new Ornament('turn').setUpperAccidental('##').setLowerAccidental('##'), 0); + notes[3].addModifier(new Ornament('mordent_inverted').setLowerAccidental('db').setUpperAccidental('db'), 0); + notes[4].addModifier(new Ornament('turn_inverted').setUpperAccidental('++').setLowerAccidental('++'), 0); + notes[5].addModifier(new Ornament('tr').setUpperAccidental('n').setLowerAccidental('n'), 0); + notes[6].addModifier(new Ornament('prallup').setUpperAccidental('d').setLowerAccidental('d'), 0); + notes[7].addModifier(new Ornament('lineprall').setUpperAccidental('db').setLowerAccidental('db'), 0); + notes[8].addModifier(new Ornament('upmordent').setUpperAccidental('bbs').setLowerAccidental('bbs'), 0); + notes[9].addModifier(new Ornament('prallprall').setUpperAccidental('bb').setLowerAccidental('bb'), 0); + notes[10].addModifier(new Ornament('turn_inverted').setUpperAccidental('+').setLowerAccidental('+'), 0); + Formatter.FormatAndDraw(ctx, stave, notes); +} +function jazzOrnaments(options) { + const clefWidth = Glyph.getWidth('gClef', 38); + function draw(modifiers, keys, x, width, y, stemDirection) { + const note = (keys, duration, modifier, stemDirection) => { + const n = new StaveNote({ keys, duration, stem_direction: stemDirection }) + .addModifier(modifier, 0) + .addModifier(new Accidental('b'), 0); + const dot = duration.indexOf('d') >= 0; + if (dot) { + Dot.buildAndAttach([n], { all: true }); + } + return n; + }; + const stave = new Stave(x, y, width).addClef('treble').setContext(ctx).draw(); + const notes = [ + note(keys, '4d', modifiers[0], stemDirection), + note(keys, '8', modifiers[1], stemDirection), + note(keys, '4d', modifiers[2], stemDirection), + note(keys, '8', modifiers[3], stemDirection), + ]; + if (modifiers.length > 4) { + notes[3].addModifier(modifiers[4], 0); + } + Beam.generateBeams(notes); + const voice = new Voice({ + num_beats: 4, + beat_value: 4, + }).setMode(VoiceMode.SOFT); + voice.addTickables(notes); + const formatter = new Formatter().joinVoices([voice]); + formatter.format([voice], width - Stave.defaultPadding - clefWidth); + stave.setContext(ctx).draw(); + voice.draw(ctx, stave); + } + expect(0); + const f = VexFlowTests.makeFactory(options, 950, 400); + const ctx = f.getContext(); + ctx.scale(1, 1); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + const xStart = 10; + const width = 300; + const yStart = 50; + const staffHeight = 70; + let curX = xStart; + let curY = yStart; + let mods = [ + new Ornament('scoop'), + new Ornament('doit'), + new Ornament('fall'), + new Ornament('doitLong'), + ]; + draw(mods, ['a/5'], curX, width, curY, -1); + curX += width; + mods = [ + new Ornament('fallLong'), + new Ornament('bend'), + new Ornament('plungerClosed'), + new Ornament('plungerOpen'), + new Ornament('bend'), + ]; + draw(mods, ['a/5'], curX, width, curY, -1); + curX += width; + mods = [ + new Ornament('flip'), + new Ornament('jazzTurn'), + new Ornament('smear'), + new Ornament('doit'), + ]; + draw(mods, ['a/5'], curX, width, curY, 1); + curX = xStart; + curY += staffHeight; + mods = [ + new Ornament('scoop'), + new Ornament('doit'), + new Ornament('fall'), + new Ornament('doitLong'), + ]; + draw(mods, ['e/5'], curX, width, curY); + curX += width; + mods = [ + new Ornament('fallLong'), + new Ornament('bend'), + new Ornament('plungerClosed'), + new Ornament('plungerOpen'), + new Ornament('bend'), + ]; + draw(mods, ['e/5'], curX, width, curY); + curX += width; + mods = [ + new Ornament('flip'), + new Ornament('jazzTurn'), + new Ornament('smear'), + new Ornament('doit'), + ]; + draw(mods, ['e/5'], curX, width, curY); + curX = xStart; + curY += staffHeight; + mods = [ + new Ornament('scoop'), + new Ornament('doit'), + new Ornament('fall'), + new Ornament('doitLong'), + ]; + draw(mods, ['e/4'], curX, width, curY); + curX += width; + mods = [ + new Ornament('fallLong'), + new Ornament('bend'), + new Ornament('plungerClosed'), + new Ornament('plungerOpen'), + new Ornament('bend'), + ]; + draw(mods, ['e/4'], curX, width, curY); + curX += width; + mods = [ + new Ornament('flip'), + new Ornament('jazzTurn'), + new Ornament('smear'), + new Ornament('doit'), + ]; + draw(mods, ['e/4'], curX, width, curY); +} +VexFlowTests.register(OrnamentTests); +export { OrnamentTests }; diff --git a/build/esm/tests/parser_tests.js b/build/esm/tests/parser_tests.js new file mode 100644 index 0000000000..3682126413 --- /dev/null +++ b/build/esm/tests/parser_tests.js @@ -0,0 +1,122 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Parser } from '../src/parser.js'; +const ParserTests = { + Start() { + QUnit.module('Parser'); + test('Basic', basic); + test('Advanced', advanced); + test('Mixed', mixed); + test('Micro Score', microscore); + }, +}; +class TestGrammar { + begin() { + return () => ({ expect: this.expect }); + } + BIGORLITTLE() { + return { expect: [this.BIGLINE, this.LITTLELINE], or: true }; + } + BIGLINE() { + return { expect: [this.LBRACE, this.WORD, this.WORDS, this.MAYBEEXCLAIM, this.RBRACE] }; + } + LITTLELINE() { + return { expect: [this.WORD, this.WORDS] }; + } + WORDS() { + return { expect: [this.COMMA, this.WORD], zeroOrMore: true }; + } + MAYBEEXCLAIM() { + return { expect: [this.EXCLAIM], maybe: true }; + } + LBRACE() { + return { token: '[{]' }; + } + RBRACE() { + return { token: '[}]' }; + } + WORD() { + return { token: '[a-zA-Z]+' }; + } + COMMA() { + return { token: '[,]' }; + } + EXCLAIM() { + return { token: '[!]' }; + } + EOL() { + return { token: '$' }; + } +} +class MicroScoreGrammar { + constructor() { + this.ITEM = () => ({ expect: [this.PIANO_KEY_NUMBER, this.CHORD], or: true }); + this.MAYBE_MORE_ITEMS = () => ({ expect: [this.ITEM], zeroOrMore: true }); + this.PIANO_KEY_NUMBER = () => ({ expect: [this.NUM], oneOrMore: true }); + this.CHORD = () => ({ expect: [this.LEFT_BRACKET, this.PIANO_KEY_NUMBER, this.MORE_CHORD_PARTS, this.RIGHT_BRACKET] }); + this.MORE_CHORD_PARTS = () => ({ expect: [this.PERIOD, this.PIANO_KEY_NUMBER], oneOrMore: true }); + this.NUM = () => ({ token: '\\d+' }); + this.WHITESPACE = () => ({ token: '\\s+' }); + this.PERIOD = () => ({ token: '\\.' }); + this.LEFT_BRACKET = () => ({ token: '\\[' }); + this.RIGHT_BRACKET = () => ({ token: '\\]' }); + this.EOL = () => ({ token: '$' }); + } + begin() { + return () => ({ expect: [this.ITEM, this.MAYBE_MORE_ITEMS, this.EOL] }); + } +} +function fails(result, expectedErrorPos, msg) { + notOk(result.success, msg); + equal(result.errorPos, expectedErrorPos, msg); +} +function basic() { + const grammar = new TestGrammar(); + grammar.expect = [grammar.LITTLELINE, grammar.EOL]; + const parser = new Parser(grammar); + const mustPass = ['first, second', 'first,second', 'first', 'first,second, third']; + mustPass.forEach((line) => equal(parser.parse(line).success, true, line)); + fails(parser.parse(''), 0); + fails(parser.parse('first second'), 6); + fails(parser.parse('first,,'), 5); + fails(parser.parse('first,'), 5); + fails(parser.parse(',,'), 0); +} +function advanced() { + const grammar = new TestGrammar(); + grammar.expect = [grammar.BIGLINE, grammar.EOL]; + const parser = new Parser(grammar); + const mustPass = ['{first}', '{first!}', '{first,second}', '{first,second!}', '{first,second,third!}']; + mustPass.forEach((line) => equal(parser.parse(line).success, true, line)); + fails(parser.parse('{first,second,third,}'), 19); + fails(parser.parse('first,second,third'), 0); + fails(parser.parse('{first,second,third'), 19); + fails(parser.parse('{!}'), 1); +} +function mixed() { + const grammar = new TestGrammar(); + grammar.expect = [grammar.BIGORLITTLE, grammar.EOL]; + const parser = new Parser(grammar); + const mustPass = ['{first,second,third!}', 'first, second']; + mustPass.forEach((line) => equal(parser.parse(line).success, true, line)); + fails(parser.parse('first second'), 6); +} +function microscore() { + const grammar = new MicroScoreGrammar(); + const parser = new Parser(grammar); + const mustPass = [ + '40 42 44 45 47 49 51 52', + '[40.44.47] [45.49.52] [47.51.54] [49.52.56]', + '40 [40.44.47] 45 47 [44.47.51]', + ]; + mustPass.forEach((line) => { + var _a; + const result = parser.parse(line); + equal(result.success, true, line); + equal((_a = result.matches) === null || _a === void 0 ? void 0 : _a.length, 3, line); + }); + fails(parser.parse('40 42 44 45 47 49 5A 52'), 19); + fails(parser.parse('40.44.47] [45.49.52] [47.51.54] [49.52.56]'), 2); + fails(parser.parse('40 [40] 45 47 [44.47.51]'), 3); +} +VexFlowTests.register(ParserTests); +export { ParserTests }; diff --git a/build/esm/tests/pedalmarking_tests.js b/build/esm/tests/pedalmarking_tests.js new file mode 100644 index 0000000000..dee713e61d --- /dev/null +++ b/build/esm/tests/pedalmarking_tests.js @@ -0,0 +1,64 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +const PedalMarkingTests = { + Start() { + QUnit.module('PedalMarking'); + const run = VexFlowTests.runTests; + run('Simple Pedal 1', simple1); + run('Simple Pedal 2', simple2); + run('Simple Pedal 3', simple3); + run('Release and Depress on Same Note 1', releaseDepress1); + run('Release and Depress on Same Note 2', releaseDepress2); + run('Custom Text 1', customTest1); + run('Custom Text 2', customTest2); + }, +}; +function createTest(makePedal) { + return (options) => { + const f = VexFlowTests.makeFactory(options, 550, 200); + const score = f.EasyScore(); + const stave0 = f.Stave({ width: 250 }).addClef('treble'); + const voice0 = score.voice(score.notes('b4/4, b4, b4, b4[stem="down"]', { stem: 'up' })); + f.Formatter().joinVoices([voice0]).formatToStave([voice0], stave0); + const stave1 = f.Stave({ width: 260, x: 250 }); + const voice1 = score.voice(score.notes('c4/4, c4, c4, c4', { stem: 'up' })); + f.Formatter().joinVoices([voice1]).formatToStave([voice1], stave1); + makePedal(f, voice0.getTickables(), voice1.getTickables()); + f.draw(); + ok(true, 'Must render'); + }; +} +function withSimplePedal(style) { + return (factory, notes0, notes1) => factory.PedalMarking({ + notes: [notes0[0], notes0[2], notes0[3], notes1[3]], + options: { style }, + }); +} +function withReleaseAndDepressedPedal(style) { + return (factory, notes0, notes1) => factory.PedalMarking({ + notes: [notes0[0], notes0[3], notes0[3], notes1[1], notes1[1], notes1[3]], + options: { style }, + }); +} +const simple1 = createTest(withSimplePedal('text')); +const simple2 = createTest(withSimplePedal('bracket')); +const simple3 = createTest(withSimplePedal('mixed')); +const releaseDepress1 = createTest(withReleaseAndDepressedPedal('bracket')); +const releaseDepress2 = createTest(withReleaseAndDepressedPedal('mixed')); +const customTest1 = createTest((factory, notes0, notes1) => { + const pedal = factory.PedalMarking({ + notes: [notes0[0], notes1[3]], + options: { style: 'text' }, + }); + pedal.setCustomText('una corda', 'tre corda'); + return pedal; +}); +const customTest2 = createTest((factory, notes0, notes1) => { + const pedal = factory.PedalMarking({ + notes: [notes0[0], notes1[3]], + options: { style: 'mixed' }, + }); + pedal.setCustomText('Sost. Ped.'); + return pedal; +}); +VexFlowTests.register(PedalMarkingTests); +export { PedalMarkingTests }; diff --git a/build/esm/tests/percussion_tests.js b/build/esm/tests/percussion_tests.js new file mode 100644 index 0000000000..853333ca73 --- /dev/null +++ b/build/esm/tests/percussion_tests.js @@ -0,0 +1,180 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Dot, Font, FontStyle, FontWeight, Stave, StaveNote, TickContext, Tremolo, } from '../src/index.js'; +const PercussionTests = { + Start() { + QUnit.module('Percussion'); + const run = VexFlowTests.runTests; + run('Percussion Clef', draw); + run('Percussion Notes', drawNotes); + run('Percussion Basic0', basic0); + run('Percussion Basic1', basic1); + run('Percussion Basic2', basic2); + run('Percussion Snare0', snare0); + run('Percussion Snare1', snare1); + run('Percussion Snare2', snare2); + run('Percussion Snare3', snare3); + }, +}; +function draw(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 120); + new Stave(10, 10, 300).addClef('percussion').setContext(ctx).draw(); + ok(true); +} +function showNote(struct, stave, ctx, x) { + const staveNote = new StaveNote(struct).setStave(stave); + new TickContext().addTickable(staveNote).preFormat().setX(x); + staveNote.setContext(ctx).draw(); + return staveNote; +} +function drawNotes(options, contextBuilder) { + const notes = [ + { keys: ['g/5/d0'], duration: '4' }, + { keys: ['g/5/d1'], duration: '4' }, + { keys: ['g/5/d2'], duration: '4' }, + { keys: ['g/5/d3'], duration: '4' }, + { keys: ['x/'], duration: '1' }, + { keys: ['g/5/t0'], duration: '1' }, + { keys: ['g/5/t1'], duration: '4' }, + { keys: ['g/5/t2'], duration: '4' }, + { keys: ['g/5/t3'], duration: '4' }, + { keys: ['x/'], duration: '1' }, + { keys: ['g/5/x0'], duration: '1' }, + { keys: ['g/5/x1'], duration: '4' }, + { keys: ['g/5/x2'], duration: '4' }, + { keys: ['g/5/x3'], duration: '4' }, + ]; + const ctx = contextBuilder(options.elementId, notes.length * 25 + 100, 240); + for (let h = 0; h < 2; ++h) { + const stave = new Stave(10, 10 + h * 120, notes.length * 25 + 75).addClef('percussion').setContext(ctx).draw(); + for (let i = 0; i < notes.length; ++i) { + const note = notes[i]; + note.stem_direction = h === 0 ? -1 : 1; + const staveNote = showNote(note, stave, ctx, (i + 1) * 25); + ok(staveNote.getX() > 0, 'Note ' + i + ' has X value'); + ok(staveNote.getYs().length > 0, 'Note ' + i + ' has Y values'); + } + } +} +function createSingleMeasureTest(setup) { + return (options) => { + const f = VexFlowTests.makeFactory(options, 500); + const stave = f.Stave().addClef('percussion'); + setup(f); + f.Formatter().joinVoices(f.getVoices()).formatToStave(f.getVoices(), stave); + f.draw(); + ok(true); + }; +} +const basic0 = createSingleMeasureTest((f) => { + const voice0 = f + .Voice() + .addTickables([ + f.StaveNote({ keys: ['g/5/x2'], duration: '8' }), + f.StaveNote({ keys: ['g/5/x2'], duration: '8' }), + f.StaveNote({ keys: ['g/5/x2'], duration: '8' }), + f.StaveNote({ keys: ['g/5/x2'], duration: '8' }), + f.StaveNote({ keys: ['g/5/x2'], duration: '8' }), + f.StaveNote({ keys: ['g/5/x2'], duration: '8' }), + f.StaveNote({ keys: ['g/5/x2'], duration: '8' }), + f.StaveNote({ keys: ['g/5/x2'], duration: '8' }), + ]); + const voice1 = f + .Voice() + .addTickables([ + f.StaveNote({ keys: ['f/4'], duration: '8', stem_direction: -1 }), + f.StaveNote({ keys: ['f/4'], duration: '8', stem_direction: -1 }), + f.StaveNote({ keys: ['d/4/x2', 'c/5'], duration: '4', stem_direction: -1 }), + f.StaveNote({ keys: ['f/4'], duration: '8', stem_direction: -1 }), + f.StaveNote({ keys: ['f/4'], duration: '8', stem_direction: -1 }), + f.StaveNote({ keys: ['d/4/x2', 'c/5'], duration: '4', stem_direction: -1 }), + ]); + f.Beam({ notes: voice0.getTickables() }); + f.Beam({ notes: voice1.getTickables().slice(0, 2) }); + f.Beam({ notes: voice1.getTickables().slice(3, 5) }); +}); +const basic1 = createSingleMeasureTest((f) => { + f.Voice().addTickables([ + f.StaveNote({ keys: ['f/5/x2'], duration: '4' }), + f.StaveNote({ keys: ['f/5/x2'], duration: '4' }), + f.StaveNote({ keys: ['f/5/x2'], duration: '4' }), + f.StaveNote({ keys: ['f/5/x2'], duration: '4' }), + ]); + f.Voice().addTickables([ + f.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: -1 }), + f.StaveNote({ keys: ['d/4/x2', 'c/5'], duration: '4', stem_direction: -1 }), + f.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: -1 }), + f.StaveNote({ keys: ['d/4/x2', 'c/5'], duration: '4', stem_direction: -1 }), + ]); +}); +const basic2 = createSingleMeasureTest((f) => { + const voice0 = f + .Voice() + .addTickables([ + f.StaveNote({ keys: ['a/5/x3'], duration: '8' }), + f.StaveNote({ keys: ['g/5/x2'], duration: '8' }), + f.StaveNote({ keys: ['g/5'], duration: '8' }), + f.StaveNote({ keys: ['g/4/n', 'g/5/x2'], duration: '8' }), + f.StaveNote({ keys: ['g/5/x2'], duration: '8' }), + f.StaveNote({ keys: ['g/5/x2'], duration: '8' }), + f.StaveNote({ keys: ['g/5/x2'], duration: '8' }), + f.StaveNote({ keys: ['g/5/x2'], duration: '8' }), + ]); + f.Beam({ notes: voice0.getTickables().slice(1, 8) }); + const notes1 = [ + f.StaveNote({ keys: ['f/4'], duration: '8', stem_direction: -1 }), + f.StaveNote({ keys: ['f/4'], duration: '8', stem_direction: -1 }), + f.StaveNote({ keys: ['d/4/x2', 'c/5'], duration: '4', stem_direction: -1 }), + f.StaveNote({ keys: ['f/4'], duration: '4', stem_direction: -1 }), + f.StaveNote({ keys: ['d/4/x2', 'c/5'], duration: '8d', stem_direction: -1 }), + f.StaveNote({ keys: ['c/5'], duration: '16', stem_direction: -1 }), + ]; + Dot.buildAndAttach([notes1[4]], { all: true }); + const voice1 = f.Voice().addTickables(notes1); + f.Beam({ notes: voice1.getTickables().slice(0, 2) }); + f.Beam({ notes: voice1.getTickables().slice(4, 6) }); +}); +const snare0 = createSingleMeasureTest((f) => { + const font = { + family: Font.SERIF, + size: 14, + weight: FontWeight.BOLD, + style: FontStyle.ITALIC, + }; + f.Voice().addTickables([ + f + .StaveNote({ keys: ['c/5'], duration: '4', stem_direction: -1 }) + .addModifier(f.Articulation({ type: 'a>' }), 0) + .addModifier(f.Annotation({ text: 'L', font }), 0), + f.StaveNote({ keys: ['c/5'], duration: '4', stem_direction: -1 }).addModifier(f.Annotation({ text: 'R', font }), 0), + f.StaveNote({ keys: ['c/5'], duration: '4', stem_direction: -1 }).addModifier(f.Annotation({ text: 'L', font }), 0), + f.StaveNote({ keys: ['c/5'], duration: '4', stem_direction: -1 }).addModifier(f.Annotation({ text: 'L', font }), 0), + ]); +}); +const snare1 = createSingleMeasureTest((f) => { + f.Voice().addTickables([ + f.StaveNote({ keys: ['g/5/x2'], duration: '4', stem_direction: -1 }).addModifier(f.Articulation({ type: 'ah' }), 0), + f.StaveNote({ keys: ['g/5/x2'], duration: '4', stem_direction: -1 }), + f.StaveNote({ keys: ['g/5/x2'], duration: '4', stem_direction: -1 }).addModifier(f.Articulation({ type: 'ah' }), 0), + f.StaveNote({ keys: ['a/5/x3'], duration: '4', stem_direction: -1 }).addModifier(f.Articulation({ type: 'a,' }), 0), + ]); +}); +const snare2 = createSingleMeasureTest((f) => { + f.Voice().addTickables([ + f.StaveNote({ keys: ['c/5'], duration: '4', stem_direction: -1 }).addModifier(new Tremolo(1), 0), + f.GraceNote({ keys: ['c/5'], duration: '4', stem_direction: -1 }).addModifier(new Tremolo(1), 0), + f.StaveNote({ keys: ['c/5'], duration: '4', stem_direction: -1 }).addModifier(new Tremolo(3), 0), + f.StaveNote({ keys: ['c/5'], duration: '4', stem_direction: -1 }).addModifier(new Tremolo(5), 0), + ]); +}); +const snare3 = createSingleMeasureTest((factory) => { + factory + .Voice() + .addTickables([ + factory.StaveNote({ keys: ['c/5'], duration: '4', stem_direction: 1 }).addModifier(new Tremolo(2), 0), + factory.GraceNote({ keys: ['c/5'], duration: '4', stem_direction: 1 }).addModifier(new Tremolo(2), 0), + factory.GraceNote({ keys: ['c/5'], duration: '4', stem_direction: 1 }).addModifier(new Tremolo(3), 0), + factory.StaveNote({ keys: ['c/5'], duration: '4', stem_direction: 1 }).addModifier(new Tremolo(5), 0), + ]); +}); +VexFlowTests.register(PercussionTests); +export { PercussionTests }; diff --git a/build/esm/tests/registry_tests.js b/build/esm/tests/registry_tests.js new file mode 100644 index 0000000000..b8264f18f5 --- /dev/null +++ b/build/esm/tests/registry_tests.js @@ -0,0 +1,64 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { EasyScore, Factory, Registry, StaveNote } from '../src/index.js'; +const RegistryTests = { + Start() { + QUnit.module('Registry'); + test('Register and Clear', registerAndClear); + test('Default Registry', defaultRegistry); + test('Multiple Classes', classes); + }, +}; +function registerAndClear() { + const registry = new Registry(); + const score = new EasyScore({ factory: Factory.newFromElementId(null) }); + registry.register(score.notes('C4')[0], 'foobar'); + const foobar = registry.getElementById('foobar'); + ok(foobar); + equal(foobar.getAttribute('id'), 'foobar'); + registry.clear(); + notOk(registry.getElementById('foobar')); + throws(() => registry.register(score.notes('C4'))); + registry.clear(); + ok(registry.register(score.notes('C4[id="boobar"]')[0]).getElementById('boobar')); +} +function defaultRegistry() { + const registry = new Registry(); + const score = new EasyScore({ factory: Factory.newFromElementId(null) }); + Registry.enableDefaultRegistry(registry); + score.notes('C4[id="foobar"]'); + const note = registry.getElementById('foobar'); + ok(note); + note.setAttribute('id', 'boobar'); + ok(registry.getElementById('boobar')); + notOk(registry.getElementById('foobar')); + registry.clear(); + equal(registry.getElementsByType(StaveNote.CATEGORY).length, 0); + score.notes('C5'); + const elements = registry.getElementsByType(StaveNote.CATEGORY); + equal(elements.length, 1); +} +function classes() { + const registry = new Registry(); + const score = new EasyScore({ factory: Factory.newFromElementId(null) }); + Registry.enableDefaultRegistry(registry); + score.notes('C4[id="foobar"]'); + const note = registry.getElementById('foobar'); + note.addClass('foo'); + ok(note.hasClass('foo')); + notOk(note.hasClass('boo')); + equal(registry.getElementsByClass('foo').length, 1); + equal(registry.getElementsByClass('boo').length, 0); + note.addClass('boo'); + ok(note.hasClass('foo')); + ok(note.hasClass('boo')); + equal(registry.getElementsByClass('foo').length, 1); + equal(registry.getElementsByClass('boo').length, 1); + note.removeClass('boo'); + note.removeClass('foo'); + notOk(note.hasClass('foo')); + notOk(note.hasClass('boo')); + equal(registry.getElementsByClass('foo').length, 0); + equal(registry.getElementsByClass('boo').length, 0); +} +VexFlowTests.register(RegistryTests); +export { RegistryTests }; diff --git a/build/esm/tests/renderer_tests.js b/build/esm/tests/renderer_tests.js new file mode 100644 index 0000000000..7439b1e122 --- /dev/null +++ b/build/esm/tests/renderer_tests.js @@ -0,0 +1,113 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { CanvasContext, Factory, Formatter, isHTMLCanvas, Renderer, RuntimeError, Stave, StaveNote, SVGContext, } from '../src/index.js'; +const STAVE_WIDTH = 700; +const STAVE_HEIGHT = 100; +const STAVE_RIGHT_MARGIN = 10; +const USE_RENDERER = { useRendererAPI: true }; +const USE_FACTORY = { useRendererAPI: false }; +const RendererTests = { + Start() { + QUnit.module('Renderer'); + const run = VexFlowTests.runTests; + run('Random', random); + run('Renderer API with element ID string', stringElementId, USE_RENDERER); + run('Renderer API with canvas or div', canvasOrDivElement, USE_RENDERER); + run('Renderer API with context', passRenderContext); + run('Factory API with element ID string', stringElementId, USE_FACTORY); + run('Factory API with canvas or div', canvasOrDivElement, USE_FACTORY); + }, +}; +function drawStave(stave, context) { + stave.addClef('bass').addTimeSignature('3/4').draw(); + Formatter.FormatAndDraw(context, stave, [ + new StaveNote({ keys: ['C/4'], duration: '4' }), + new StaveNote({ keys: ['E/4'], duration: '4' }), + new StaveNote({ keys: ['G/4'], duration: '4' }), + ]); +} +function random(options) { + const useElementIDString = Math.random() > 0.5; + const useRendererAPI = Math.random() > 0.5; + options.params = { useRendererAPI }; + if (useElementIDString) { + stringElementId(options); + } + else { + canvasOrDivElement(options); + } + const element = document.getElementById(options.elementId); + const colorForElementType = useElementIDString ? '#CCCCCC' : '#0074d9'; + const lineStyleForWhichAPI = useRendererAPI ? 'solid' : 'dashed'; + const borderStyle = `3px ${lineStyleForWhichAPI} ${colorForElementType}`; + let elementType; + if (options.backend === Renderer.Backends.CANVAS) { + element.style.border = borderStyle; + elementType = '<canvas> element object'; + } + else { + element.children[0].style.border = borderStyle; + elementType = '<svg> element object'; + } + if (useElementIDString) { + elementType = 'elementID string'; + } + const whichAPI = useRendererAPI ? 'Renderer API' : 'Factory API'; + element.parentElement.insertAdjacentHTML('beforeend', `
` + + `${whichAPI}` + + ` with ` + + `${elementType}` + + `

`); +} +function useRendererAPI(e, backend) { + const renderer = new Renderer(e, backend); + renderer.resize(STAVE_WIDTH, STAVE_HEIGHT); + const context = renderer.getContext(); + drawStave(new Stave(0, 0, STAVE_WIDTH - STAVE_RIGHT_MARGIN).setContext(context), context); +} +function useFactoryAPI(e, backend) { + const opts = { + renderer: { elementId: e, width: STAVE_WIDTH, height: STAVE_HEIGHT, backend }, + }; + const factory = new Factory(opts); + drawStave(factory.Stave(), factory.getContext()); +} +function stringElementId(options) { + const elementId = options.elementId; + if (options.params.useRendererAPI) { + useRendererAPI(elementId, options.backend); + } + else { + useFactoryAPI(elementId, options.backend); + } + ok(true); +} +function canvasOrDivElement(options) { + const element = document.getElementById(options.elementId); + if (options.params.useRendererAPI) { + useRendererAPI(element, options.backend); + } + else { + useFactoryAPI(element, options.backend); + } + ok(true); +} +function passRenderContext(options) { + let context; + const element = document.getElementById(options.elementId); + if (isHTMLCanvas(element)) { + const ctx = element.getContext('2d'); + if (!ctx) { + throw new RuntimeError(`Couldn't get context from element "${options.elementId}"`); + } + context = new CanvasContext(ctx); + } + else { + context = new SVGContext(element); + } + const renderer = new Renderer(context); + renderer.resize(STAVE_WIDTH, STAVE_HEIGHT); + drawStave(new Stave(0, 0, STAVE_WIDTH - STAVE_RIGHT_MARGIN).setContext(context), context); + ok(true); +} +VexFlowTests.register(RendererTests); +export { RendererTests }; diff --git a/build/esm/tests/rests_tests.js b/build/esm/tests/rests_tests.js new file mode 100644 index 0000000000..3afef682d1 --- /dev/null +++ b/build/esm/tests/rests_tests.js @@ -0,0 +1,248 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Beam } from '../src/beam.js'; +import { Dot } from '../src/dot.js'; +import { Flow } from '../src/flow.js'; +import { Formatter } from '../src/formatter.js'; +import { Stave } from '../src/stave.js'; +import { StaveNote } from '../src/stavenote.js'; +import { Tuplet } from '../src/tuplet.js'; +import { Voice } from '../src/voice.js'; +const RestsTests = { + Start() { + QUnit.module('Rests'); + const run = VexFlowTests.runTests; + run('Rests - Dotted', basic); + run('Auto Align Rests - Beamed Notes Stems Up', beamsUp); + run('Auto Align Rests - Beamed Notes Stems Down', beamsDown); + run('Auto Align Rests - Tuplets Stems Up', tupletsUp); + run('Auto Align Rests - Tuplets Stems Down', tupletsDown); + run('Auto Align Rests - Single Voice (Default)', singleVoiceDefaultAlignment); + run('Auto Align Rests - Single Voice (Align All)', singleVoiceAlignAll); + run('Auto Align Rests - Multi Voice', multiVoice); + }, +}; +function setupContext(options, contextBuilder, width = 350, height = 150) { + const context = contextBuilder(options.elementId, width, height); + context.scale(0.9, 0.9); + context.fillStyle = '#221'; + context.strokeStyle = '#221'; + context.font = '10pt Arial'; + const stave = new Stave(10, 30, width).addClef('treble').addTimeSignature('4/4').setContext(context).draw(); + return { context, stave }; +} +function basic(options, contextBuilder) { + const { context, stave } = setupContext(options, contextBuilder, 700); + const notes = [ + new StaveNote({ keys: ['b/4'], stem_direction: 1, duration: 'wr' }), + new StaveNote({ keys: ['b/4'], stem_direction: 1, duration: 'hr' }), + new StaveNote({ keys: ['b/4'], stem_direction: 1, duration: '4r' }), + new StaveNote({ keys: ['b/4'], stem_direction: 1, duration: '8r' }), + new StaveNote({ keys: ['b/4'], stem_direction: 1, duration: '16r' }), + new StaveNote({ keys: ['b/4'], stem_direction: 1, duration: '32r' }), + new StaveNote({ keys: ['b/4'], stem_direction: 1, duration: '64r' }), + new StaveNote({ keys: ['b/4'], stem_direction: 1, duration: '128r' }), + ]; + Dot.buildAndAttach(notes, { all: true }); + Formatter.FormatAndDraw(context, stave, notes); + ok(true, 'Dotted Rest Test'); +} +const note = (noteStruct) => new StaveNote(noteStruct); +function beamsUp(options, contextBuilder) { + const { context, stave } = setupContext(options, contextBuilder, 600, 160); + const notes = [ + note({ keys: ['e/5'], stem_direction: 1, duration: '8' }), + note({ keys: ['b/4'], stem_direction: 1, duration: '8r' }), + note({ keys: ['b/5'], stem_direction: 1, duration: '8' }), + note({ keys: ['c/5'], stem_direction: 1, duration: '8' }), + note({ keys: ['b/4', 'd/5', 'a/5'], stem_direction: 1, duration: '8' }), + note({ keys: ['b/4'], stem_direction: 1, duration: '8r' }), + note({ keys: ['b/4'], stem_direction: 1, duration: '8r' }), + note({ keys: ['c/4'], stem_direction: 1, duration: '8' }), + note({ keys: ['b/4', 'd/5', 'a/5'], stem_direction: 1, duration: '8' }), + note({ keys: ['b/4'], stem_direction: 1, duration: '8' }), + note({ keys: ['b/4'], stem_direction: 1, duration: '8r' }), + note({ keys: ['c/4'], stem_direction: 1, duration: '8' }), + ]; + const beam1 = new Beam(notes.slice(0, 4)); + const beam2 = new Beam(notes.slice(4, 8)); + const beam3 = new Beam(notes.slice(8, 12)); + Formatter.FormatAndDraw(context, stave, notes); + beam1.setContext(context).draw(); + beam2.setContext(context).draw(); + beam3.setContext(context).draw(); + ok(true, 'Auto Align Rests - Beams Up Test'); +} +function beamsDown(options, contextBuilder) { + const { context, stave } = setupContext(options, contextBuilder, 600, 160); + const notes = [ + note({ keys: ['a/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), + note({ keys: ['b/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['c/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['b/4', 'd/5', 'a/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), + note({ keys: ['e/4'], stem_direction: -1, duration: '8' }), + note({ keys: ['b/4', 'd/5', 'a/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '8' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), + note({ keys: ['e/4'], stem_direction: -1, duration: '8' }), + ]; + const beam1 = new Beam(notes.slice(0, 4)); + const beam2 = new Beam(notes.slice(4, 8)); + const beam3 = new Beam(notes.slice(8, 12)); + Formatter.FormatAndDraw(context, stave, notes); + beam1.setContext(context).draw(); + beam2.setContext(context).draw(); + beam3.setContext(context).draw(); + ok(true, 'Auto Align Rests - Beams Down Test'); +} +function tupletsUp(options, contextBuilder) { + const { context, stave } = setupContext(options, contextBuilder, 600, 160); + const notes = [ + note({ keys: ['b/4'], stem_direction: 1, duration: '4' }), + note({ keys: ['b/4'], stem_direction: 1, duration: '4' }), + note({ keys: ['a/5'], stem_direction: 1, duration: '4r' }), + note({ keys: ['a/5'], stem_direction: 1, duration: '4r' }), + note({ keys: ['g/5'], stem_direction: 1, duration: '4r' }), + note({ keys: ['b/5'], stem_direction: 1, duration: '4' }), + note({ keys: ['a/5'], stem_direction: 1, duration: '4' }), + note({ keys: ['g/5'], stem_direction: 1, duration: '4r' }), + note({ keys: ['b/4'], stem_direction: 1, duration: '4' }), + note({ keys: ['a/5'], stem_direction: 1, duration: '4' }), + note({ keys: ['b/4'], stem_direction: 1, duration: '4r' }), + note({ keys: ['b/4'], stem_direction: 1, duration: '4r' }), + ]; + const tuplet1 = new Tuplet(notes.slice(0, 3)).setTupletLocation(Tuplet.LOCATION_TOP); + const tuplet2 = new Tuplet(notes.slice(3, 6)).setTupletLocation(Tuplet.LOCATION_TOP); + const tuplet3 = new Tuplet(notes.slice(6, 9)).setTupletLocation(Tuplet.LOCATION_TOP); + const tuplet4 = new Tuplet(notes.slice(9, 12)).setTupletLocation(Tuplet.LOCATION_TOP); + Formatter.FormatAndDraw(context, stave, notes); + tuplet1.setContext(context).draw(); + tuplet2.setContext(context).draw(); + tuplet3.setContext(context).draw(); + tuplet4.setContext(context).draw(); + ok(true, 'Auto Align Rests - Tuplets Stem Up Test'); +} +function tupletsDown(options, contextBuilder) { + const { context, stave } = setupContext(options, contextBuilder, 600, 160); + const notes = [ + note({ keys: ['a/5'], stem_direction: -1, duration: '8r' }), + note({ keys: ['g/5'], stem_direction: -1, duration: '8r' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '8' }), + note({ keys: ['a/5'], stem_direction: -1, duration: '8r' }), + note({ keys: ['g/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['b/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['a/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['g/5'], stem_direction: -1, duration: '8r' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '8' }), + note({ keys: ['a/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['g/5'], stem_direction: -1, duration: '8r' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), + ]; + const beam1 = new Beam(notes.slice(0, 3)); + const beam2 = new Beam(notes.slice(3, 6)); + const beam3 = new Beam(notes.slice(6, 9)); + const beam4 = new Beam(notes.slice(9, 12)); + const tuplet1 = new Tuplet(notes.slice(0, 3)).setTupletLocation(Tuplet.LOCATION_BOTTOM); + const tuplet2 = new Tuplet(notes.slice(3, 6)).setTupletLocation(Tuplet.LOCATION_BOTTOM); + const tuplet3 = new Tuplet(notes.slice(6, 9)).setTupletLocation(Tuplet.LOCATION_BOTTOM); + const tuplet4 = new Tuplet(notes.slice(9, 12)).setTupletLocation(Tuplet.LOCATION_BOTTOM); + Formatter.FormatAndDraw(context, stave, notes); + tuplet1.setContext(context).draw(); + tuplet2.setContext(context).draw(); + tuplet3.setContext(context).draw(); + tuplet4.setContext(context).draw(); + beam1.setContext(context).draw(); + beam2.setContext(context).draw(); + beam3.setContext(context).draw(); + beam4.setContext(context).draw(); + ok(true, 'Auto Align Rests - Tuplets Stem Down Test'); +} +function singleVoiceDefaultAlignment(options, contextBuilder) { + const { context, stave } = setupContext(options, contextBuilder, 600, 160); + const notes = [ + note({ keys: ['b/4'], stem_direction: -1, duration: '4r' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '4r' }), + note({ keys: ['f/4'], stem_direction: -1, duration: '4' }), + note({ keys: ['e/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), + note({ keys: ['a/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '8' }), + note({ keys: ['e/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['a/5'], stem_direction: 1, duration: '4' }), + note({ keys: ['b/4'], stem_direction: 1, duration: '4r' }), + note({ keys: ['b/5'], stem_direction: 1, duration: '4' }), + note({ keys: ['d/5'], stem_direction: -1, duration: '4' }), + note({ keys: ['g/5'], stem_direction: -1, duration: '4' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '4r' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '4r' }), + ]; + const beam = new Beam(notes.slice(5, 9)); + const tuplet = new Tuplet(notes.slice(9, 12)).setTupletLocation(Tuplet.LOCATION_TOP); + Formatter.FormatAndDraw(context, stave, notes); + tuplet.setContext(context).draw(); + beam.setContext(context).draw(); + ok(true, 'Auto Align Rests - Default Test'); +} +function singleVoiceAlignAll(options, contextBuilder) { + const { context, stave } = setupContext(options, contextBuilder, 600, 160); + const notes = [ + note({ keys: ['b/4'], stem_direction: -1, duration: '4r' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '4r' }), + note({ keys: ['f/4'], stem_direction: -1, duration: '4' }), + note({ keys: ['e/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), + note({ keys: ['a/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '8' }), + note({ keys: ['e/5'], stem_direction: -1, duration: '8' }), + note({ keys: ['a/5'], stem_direction: 1, duration: '4' }), + note({ keys: ['b/4'], stem_direction: 1, duration: '4r' }), + note({ keys: ['b/5'], stem_direction: 1, duration: '4' }), + note({ keys: ['d/5'], stem_direction: -1, duration: '4' }), + note({ keys: ['g/5'], stem_direction: -1, duration: '4' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '4r' }), + note({ keys: ['b/4'], stem_direction: -1, duration: '4r' }), + ]; + const beam = new Beam(notes.slice(5, 9)); + const tuplet = new Tuplet(notes.slice(9, 12)).setTupletLocation(Tuplet.LOCATION_TOP); + Formatter.FormatAndDraw(context, stave, notes, { align_rests: true }); + tuplet.setContext(context).draw(); + beam.setContext(context).draw(); + ok(true, 'Auto Align Rests - Align All Test'); +} +function multiVoice(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 600, 200); + const stave = new Stave(50, 10, 500).addClef('treble').setContext(ctx).addTimeSignature('4/4').draw(); + const noteOnStave = (noteStruct) => new StaveNote(noteStruct).setStave(stave); + const notes1 = [ + noteOnStave({ keys: ['c/4', 'e/4', 'g/4'], duration: '4' }), + noteOnStave({ keys: ['b/4'], duration: '4r' }), + noteOnStave({ keys: ['c/4', 'd/4', 'a/4'], duration: '4' }), + noteOnStave({ keys: ['b/4'], duration: '4r' }), + ]; + const notes2 = [ + noteOnStave({ keys: ['e/3'], stem_direction: -1, duration: '8' }), + noteOnStave({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), + noteOnStave({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), + noteOnStave({ keys: ['e/3'], stem_direction: -1, duration: '8' }), + noteOnStave({ keys: ['e/3'], stem_direction: -1, duration: '8' }), + noteOnStave({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), + noteOnStave({ keys: ['e/3'], stem_direction: -1, duration: '8' }), + noteOnStave({ keys: ['e/3'], stem_direction: -1, duration: '8' }), + ]; + const voice1 = new Voice(Flow.TIME4_4).addTickables(notes1); + const voice2 = new Voice(Flow.TIME4_4).addTickables(notes2); + new Formatter().joinVoices([voice1, voice2]).formatToStave([voice1, voice2], stave, { align_rests: true }); + const beam2_1 = new Beam(notes2.slice(0, 4)); + const beam2_2 = new Beam(notes2.slice(4, 8)); + voice2.draw(ctx); + voice1.draw(ctx); + beam2_1.setContext(ctx).draw(); + beam2_2.setContext(ctx).draw(); + ok(true, 'Strokes Test Multi Voice'); +} +VexFlowTests.register(RestsTests); +export { RestsTests }; diff --git a/build/esm/tests/rhythm_tests.js b/build/esm/tests/rhythm_tests.js new file mode 100644 index 0000000000..c2eca911de --- /dev/null +++ b/build/esm/tests/rhythm_tests.js @@ -0,0 +1,357 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Annotation } from '../src/annotation.js'; +import { Beam } from '../src/beam.js'; +import { Formatter } from '../src/formatter.js'; +import { Stave } from '../src/stave.js'; +import { BarlineType } from '../src/stavebarline.js'; +import { StaveNote } from '../src/stavenote.js'; +const RhythmTests = { + Start() { + QUnit.module('Rhythm'); + const run = VexFlowTests.runTests; + run('Rhythm Draw - slash notes', drawBasic); + run('Rhythm Draw - beamed slash notes', drawBeamedSlashNotes); + run('Rhythm Draw - beamed slash notes, some rests', drawSlashAndBeamAndRests); + run('Rhythm Draw - 16th note rhythm with scratches', drawSixtenthWithScratches); + run('Rhythm Draw - 32nd note rhythm with scratches', drawThirtySecondWithScratches); + }, +}; +function drawBasic(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 800, 150); + const staveBar1 = new Stave(10, 30, 150); + staveBar1.setBegBarType(BarlineType.DOUBLE); + staveBar1.setEndBarType(BarlineType.SINGLE); + staveBar1.addClef('treble'); + staveBar1.addTimeSignature('4/4'); + staveBar1.addKeySignature('C'); + staveBar1.setContext(ctx).draw(); + const notesBar1 = [new StaveNote({ keys: ['b/4'], duration: '1s', stem_direction: -1 })]; + Formatter.FormatAndDraw(ctx, staveBar1, notesBar1); + const staveBar2 = new Stave(staveBar1.getWidth() + staveBar1.getX(), staveBar1.getY(), 120); + staveBar2.setBegBarType(BarlineType.SINGLE); + staveBar2.setEndBarType(BarlineType.SINGLE); + staveBar2.setContext(ctx).draw(); + const notesBar2 = [ + new StaveNote({ keys: ['b/4'], duration: '2s', stem_direction: -1 }), + new StaveNote({ keys: ['b/4'], duration: '2s', stem_direction: -1 }), + ]; + Formatter.FormatAndDraw(ctx, staveBar2, notesBar2); + const staveBar3 = new Stave(staveBar2.getWidth() + staveBar2.getX(), staveBar2.getY(), 170); + staveBar3.setContext(ctx).draw(); + const notesBar3 = [ + new StaveNote({ + keys: ['b/4'], + duration: '4s', + stem_direction: -1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '4s', + stem_direction: -1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '4s', + stem_direction: -1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '4s', + stem_direction: -1, + }), + ]; + Formatter.FormatAndDraw(ctx, staveBar3, notesBar3); + const staveBar4 = new Stave(staveBar3.getWidth() + staveBar3.getX(), staveBar3.getY(), 200); + staveBar4.setContext(ctx).draw(); + const notesBar4 = [ + new StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + ]; + Formatter.FormatAndDraw(ctx, staveBar4, notesBar4); + expect(0); +} +function drawBeamedSlashNotes(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 800, 150); + const staveBar1 = new Stave(10, 30, 300); + staveBar1.setBegBarType(BarlineType.DOUBLE); + staveBar1.setEndBarType(BarlineType.SINGLE); + staveBar1.addClef('treble'); + staveBar1.addTimeSignature('4/4'); + staveBar1.addKeySignature('C'); + staveBar1.setContext(ctx).draw(); + const notesBar1_part1 = [ + new StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + ]; + const notesBar1_part2 = [ + new StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + ]; + const beam1 = new Beam(notesBar1_part1); + const beam2 = new Beam(notesBar1_part2); + const notesBar1 = notesBar1_part1.concat(notesBar1_part2); + Formatter.FormatAndDraw(ctx, staveBar1, notesBar1); + beam1.setContext(ctx).draw(); + beam2.setContext(ctx).draw(); + expect(0); +} +function drawSlashAndBeamAndRests(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 800, 150); + const staveBar1 = new Stave(10, 30, 300); + staveBar1.setBegBarType(BarlineType.DOUBLE); + staveBar1.setEndBarType(BarlineType.SINGLE); + staveBar1.addClef('treble'); + staveBar1.addTimeSignature('4/4'); + staveBar1.addKeySignature('F'); + staveBar1.setContext(ctx).draw(); + const notesBar1_part1 = [ + new StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new StaveNote({ keys: ['b/4'], duration: '8s', stem_direction: -1 }), + ]; + notesBar1_part1[0].addModifier(new Annotation('C7').setFont('Times', VexFlowTests.Font.size + 2), 0); + const notesBar1_part2 = [ + new StaveNote({ + keys: ['b/4'], + duration: '8r', + stem_direction: -1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '8r', + stem_direction: -1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '8r', + stem_direction: -1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '8s', + stem_direction: -1, + }), + ]; + const beam1 = new Beam(notesBar1_part1); + Formatter.FormatAndDraw(ctx, staveBar1, notesBar1_part1.concat(notesBar1_part2)); + beam1.setContext(ctx).draw(); + const staveBar2 = new Stave(staveBar1.getWidth() + staveBar1.getX(), staveBar1.getY(), 220); + staveBar2.setContext(ctx).draw(); + const notesBar2 = [ + new StaveNote({ + keys: ['b/4'], + duration: '1s', + stem_direction: -1, + }), + ]; + notesBar2[0].addModifier(new Annotation('F').setFont('Times', VexFlowTests.Font.size + 2), 0); + Formatter.FormatAndDraw(ctx, staveBar2, notesBar2); + expect(0); +} +function drawSixtenthWithScratches(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 800, 150); + const staveBar1 = new Stave(10, 30, 300); + staveBar1.setBegBarType(BarlineType.DOUBLE); + staveBar1.setEndBarType(BarlineType.SINGLE); + staveBar1.addClef('treble'); + staveBar1.addTimeSignature('4/4'); + staveBar1.addKeySignature('F'); + staveBar1.setContext(ctx).draw(); + const notesBar1_part1 = [ + new StaveNote({ + keys: ['b/4'], + duration: '16s', + stem_direction: -1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '16s', + stem_direction: -1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '16m', + stem_direction: -1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '16s', + stem_direction: -1, + }), + ]; + const notesBar1_part2 = [ + new StaveNote({ + keys: ['b/4'], + duration: '16m', + stem_direction: -1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '16s', + stem_direction: -1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '16r', + stem_direction: -1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '16s', + stem_direction: -1, + }), + ]; + notesBar1_part1[0].addModifier(new Annotation('C7').setFont('Times', VexFlowTests.Font.size + 3), 0); + const beam1 = new Beam(notesBar1_part1); + const beam2 = new Beam(notesBar1_part2); + Formatter.FormatAndDraw(ctx, staveBar1, notesBar1_part1.concat(notesBar1_part2)); + beam1.setContext(ctx).draw(); + beam2.setContext(ctx).draw(); + expect(0); +} +function drawThirtySecondWithScratches(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 800, 150); + const staveBar1 = new Stave(10, 30, 300); + staveBar1.setBegBarType(BarlineType.DOUBLE); + staveBar1.setEndBarType(BarlineType.SINGLE); + staveBar1.addClef('treble'); + staveBar1.addTimeSignature('4/4'); + staveBar1.addKeySignature('F'); + staveBar1.setContext(ctx).draw(); + const notesBar1_part1 = [ + new StaveNote({ + keys: ['b/4'], + duration: '32s', + stem_direction: 1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '32s', + stem_direction: 1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '32m', + stem_direction: 1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '32s', + stem_direction: 1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '32m', + stem_direction: 1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '32s', + stem_direction: 1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '32r', + stem_direction: 1, + }), + new StaveNote({ + keys: ['b/4'], + duration: '32s', + stem_direction: 1, + }), + ]; + notesBar1_part1[0].addModifier(new Annotation('C7').setFont('Times', VexFlowTests.Font.size + 3), 0); + const beam1 = new Beam(notesBar1_part1); + Formatter.FormatAndDraw(ctx, staveBar1, notesBar1_part1); + beam1.setContext(ctx).draw(); + expect(0); +} +VexFlowTests.register(RhythmTests); +export { RhythmTests }; diff --git a/build/esm/tests/stave_tests.js b/build/esm/tests/stave_tests.js new file mode 100644 index 0000000000..34215abb61 --- /dev/null +++ b/build/esm/tests/stave_tests.js @@ -0,0 +1,560 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Accidental } from '../src/accidental.js'; +import { Beam } from '../src/beam.js'; +import { Clef } from '../src/clef.js'; +import { Formatter } from '../src/formatter.js'; +import { KeySignature } from '../src/keysignature.js'; +import { Modifier } from '../src/modifier.js'; +import { Stave } from '../src/stave.js'; +import { Barline, BarlineType } from '../src/stavebarline.js'; +import { StaveNote } from '../src/stavenote.js'; +import { Repetition } from '../src/staverepetition.js'; +import { VoltaType } from '../src/stavevolta.js'; +import { Justification } from '../src/textnote.js'; +import { TimeSignature } from '../src/timesignature.js'; +const StaveTests = { + Start() { + QUnit.module('Stave'); + test('StaveModifiers SortByCategory', sortByCategory); + const run = VexFlowTests.runTests; + run('Stave Draw Test', draw); + run('Open Stave Draw Test', drawOpenStave); + run('Multiple Stave Barline Test', drawMultipleMeasures); + run('Multiple Stave Barline Test (14pt Section)', drawMultipleMeasures, { fontSize: 14 }); + run('Multiple Stave Repeats Test', drawRepeats); + run('Stave End Modifiers Test', drawEndModifiers); + run('Stave Repetition (CODA) Positioning', drawStaveRepetition, { yShift: 0 }); + run('Stave Repetition (CODA) Positioning (-20)', drawStaveRepetition, { yShift: -20 }); + run('Stave Repetition (CODA) Positioning (+10)', drawStaveRepetition, { yShift: +10 }); + run('Multiple Staves Volta Test', drawVolta); + run('Volta + Modifier Measure Test', drawVoltaModifier); + run('Tempo Test', drawTempo); + run('Single Line Configuration Test', configureSingleLine); + run('Batch Line Configuration Test', configureAllLines); + run('Stave Text Test', drawStaveText); + run('Multiple Line Stave Text Test', drawStaveTextMultiLine); + run('Factory API', factoryAPI); + }, +}; +function sortByCategory() { + const stave = new Stave(0, 0, 300); + const clef0 = new Clef('treble'); + const clef1 = new Clef('alto'); + const clef2 = new Clef('bass'); + const time0 = new TimeSignature('C'); + const time1 = new TimeSignature('C|'); + const time2 = new TimeSignature('9/8'); + const key0 = new KeySignature('G'); + const key1 = new KeySignature('F'); + const key2 = new KeySignature('D'); + const bar0 = new Barline(BarlineType.SINGLE); + const bar1 = new Barline(BarlineType.DOUBLE); + const bar2 = new Barline(BarlineType.NONE); + const order0 = { Barline: 0, Clef: 1, KeySignature: 2, TimeSignature: 3 }; + const order1 = { TimeSignature: 0, KeySignature: 1, Barline: 2, Clef: 3 }; + const sortAndCompare = (title, a, b, order) => { + stave.sortByCategory(a, order); + let isSame = true; + if (a.length !== b.length) + isSame = false; + for (let i = 0; i < a.length; ++i) { + if (a[i] !== b[i]) + isSame = false; + } + ok(isSame, title); + }; + sortAndCompare('Keep the original order 1', [bar0, bar1, clef0, clef1, key0, key1, time0, time1], [bar0, bar1, clef0, clef1, key0, key1, time0, time1], order0); + sortAndCompare('Keep the original order 2', [time0, time1, key0, key1, bar0, bar1, clef0, clef1], [time0, time1, key0, key1, bar0, bar1, clef0, clef1], order1); + sortAndCompare('Sort and keep 1', [bar0, bar1, clef0, clef1, key0, key1, time0, time1], [time0, time1, key0, key1, bar0, bar1, clef0, clef1], order1); + sortAndCompare('Sort and keep 2', [bar0, clef0, key0, time0, key1, time1, clef1, bar1, time2, clef2, bar2, key2], [bar0, bar1, bar2, clef0, clef1, clef2, key0, key1, key2, time0, time1, time2], order0); + sortAndCompare('Sort and keep 3', [bar2, clef2, key2, time0, key0, time2, clef1, bar1, time1, clef0, bar0, key1], [time0, time2, time1, key2, key0, key1, bar2, bar1, bar0, clef2, clef1, clef0], order1); +} +function draw(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 150); + const stave = new Stave(10, 10, 300); + stave.setContext(ctx); + stave.draw(); + equal(stave.getYForNote(0), 100, 'getYForNote(0)'); + equal(stave.getYForLine(5), 100, 'getYForLine(5)'); + equal(stave.getYForLine(0), 50, 'getYForLine(0) - Top Line'); + equal(stave.getYForLine(4), 90, 'getYForLine(4) - Bottom Line'); + ok(true, 'all pass'); +} +function drawOpenStave(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 350); + let stave = new Stave(10, 10, 300, { left_bar: false }); + stave.setContext(ctx); + stave.draw(); + stave = new Stave(10, 150, 300, { right_bar: false }); + stave.setContext(ctx); + stave.draw(); + ok(true, 'all pass'); +} +function drawMultipleMeasures(options, contextBuilder) { + var _a, _b; + expect(0); + const ctx = contextBuilder(options.elementId, 550, 200); + const staveBar1 = new Stave(10, 50, 200); + staveBar1.setBegBarType(BarlineType.REPEAT_BEGIN); + staveBar1.setEndBarType(BarlineType.DOUBLE); + staveBar1.setSection('A', 0, 0, (_a = options.params) === null || _a === void 0 ? void 0 : _a.fontSize); + staveBar1.addClef('treble').setContext(ctx).draw(); + const notesBar1 = [ + new StaveNote({ keys: ['c/4'], duration: 'q' }), + new StaveNote({ keys: ['d/4'], duration: 'q' }), + new StaveNote({ keys: ['b/4'], duration: 'qr' }), + new StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: 'q' }), + ]; + Formatter.FormatAndDraw(ctx, staveBar1, notesBar1); + const staveBar2 = new Stave(staveBar1.getWidth() + staveBar1.getX(), staveBar1.getY(), 300); + staveBar2.setSection('B', 0, 0, (_b = options.params) === null || _b === void 0 ? void 0 : _b.fontSize); + staveBar2.setEndBarType(BarlineType.END); + staveBar2.setContext(ctx).draw(); + const notesBar2_part1 = [ + new StaveNote({ keys: ['c/4'], duration: '8' }), + new StaveNote({ keys: ['d/4'], duration: '8' }), + new StaveNote({ keys: ['g/4'], duration: '8' }), + new StaveNote({ keys: ['e/4'], duration: '8' }), + ]; + const notesBar2_part2 = [ + new StaveNote({ keys: ['c/4'], duration: '8' }), + new StaveNote({ keys: ['d/4'], duration: '8' }), + new StaveNote({ keys: ['g/4'], duration: '8' }), + new StaveNote({ keys: ['e/4'], duration: '8' }), + ]; + const beam1 = new Beam(notesBar2_part1); + const beam2 = new Beam(notesBar2_part2); + const notesBar2 = notesBar2_part1.concat(notesBar2_part2); + Formatter.FormatAndDraw(ctx, staveBar2, notesBar2); + beam1.setContext(ctx).draw(); + beam2.setContext(ctx).draw(); +} +function drawRepeats(options, contextBuilder) { + expect(0); + const ctx = contextBuilder(options.elementId, 750, 120); + const staveBar1 = new Stave(10, 0, 250); + staveBar1.setBegBarType(BarlineType.REPEAT_BEGIN); + staveBar1.setEndBarType(BarlineType.REPEAT_END); + staveBar1.addClef('treble'); + staveBar1.addKeySignature('A'); + staveBar1.setContext(ctx).draw(); + const notesBar1 = [ + new StaveNote({ keys: ['c/4'], duration: 'q' }), + new StaveNote({ keys: ['d/4'], duration: 'q' }), + new StaveNote({ keys: ['b/4'], duration: 'qr' }), + new StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: 'q' }), + ]; + Formatter.FormatAndDraw(ctx, staveBar1, notesBar1); + const staveBar2 = new Stave(staveBar1.getWidth() + staveBar1.getX(), staveBar1.getY(), 250); + staveBar2.setBegBarType(BarlineType.REPEAT_BEGIN); + staveBar2.setEndBarType(BarlineType.REPEAT_END); + staveBar2.setContext(ctx).draw(); + const notesBar2_part1 = [ + new StaveNote({ keys: ['c/4'], duration: '8' }), + new StaveNote({ keys: ['d/4'], duration: '8' }), + new StaveNote({ keys: ['g/4'], duration: '8' }), + new StaveNote({ keys: ['e/4'], duration: '8' }), + ]; + const notesBar2_part2 = [ + new StaveNote({ keys: ['c/4'], duration: '8' }), + new StaveNote({ keys: ['d/4'], duration: '8' }), + new StaveNote({ keys: ['g/4'], duration: '8' }), + new StaveNote({ keys: ['e/4'], duration: '8' }), + ]; + notesBar2_part2[0].addModifier(new Accidental('#'), 0); + notesBar2_part2[1].addModifier(new Accidental('#'), 0); + notesBar2_part2[3].addModifier(new Accidental('b'), 0); + const beam1 = new Beam(notesBar2_part1); + const beam2 = new Beam(notesBar2_part2); + const notesBar2 = notesBar2_part1.concat(notesBar2_part2); + Formatter.FormatAndDraw(ctx, staveBar2, notesBar2); + beam1.setContext(ctx).draw(); + beam2.setContext(ctx).draw(); + const staveBar3 = new Stave(staveBar2.getWidth() + staveBar2.getX(), staveBar2.getY(), 50); + staveBar3.setContext(ctx).draw(); + const notesBar3 = [new StaveNote({ keys: ['d/5'], duration: 'wr' })]; + Formatter.FormatAndDraw(ctx, staveBar3, notesBar3); + const staveBar4 = new Stave(staveBar3.getWidth() + staveBar3.getX(), staveBar3.getY(), 250 - staveBar1.getModifierXShift()); + staveBar4.setBegBarType(BarlineType.REPEAT_BEGIN); + staveBar4.setEndBarType(BarlineType.REPEAT_END); + staveBar4.setContext(ctx).draw(); + const notesBar4 = [ + new StaveNote({ keys: ['c/4'], duration: 'q' }), + new StaveNote({ keys: ['d/4'], duration: 'q' }), + new StaveNote({ keys: ['b/4'], duration: 'qr' }), + new StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: 'q' }), + ]; + Formatter.FormatAndDraw(ctx, staveBar4, notesBar4); +} +function drawEndModifiers(options, contextBuilder) { + expect(0); + const staveWidth = 230; + const blockHeight = 80; + let x = 10; + let y = 0; + const ctx = contextBuilder(options.elementId, 800, 700); + function drawStavesInTwoLines(endBarLine) { + function drawStave(x, y, width, begMods, endMods) { + const staveBar = new Stave(x, y, width - 10); + if (begMods) { + if (begMods.barLine !== undefined) { + staveBar.setBegBarType(begMods.barLine); + } + if (begMods.clef !== undefined) { + staveBar.addClef(begMods.clef); + } + if (begMods.keySig !== undefined) { + staveBar.addKeySignature(begMods.keySig); + } + if (begMods.timeSig !== undefined) { + staveBar.setTimeSignature(begMods.timeSig); + } + } + if (endMods) { + if (endMods.barLine !== undefined) { + staveBar.setEndBarType(endMods.barLine); + } + if (endMods.clef !== undefined) { + staveBar.addEndClef(endMods.clef); + } + if (endMods.keySig !== undefined) { + staveBar.setEndKeySignature(endMods.keySig); + } + if (endMods.timeSig !== undefined) { + staveBar.setEndTimeSignature(endMods.timeSig); + } + } + staveBar.setContext(ctx).draw(); + const notesBar = [ + new StaveNote({ keys: ['c/4'], duration: 'q' }), + new StaveNote({ keys: ['d/4'], duration: 'q' }), + new StaveNote({ keys: ['b/4'], duration: 'qr' }), + new StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: 'q' }), + ]; + Formatter.FormatAndDraw(ctx, staveBar, notesBar); + } + drawStave(x, y, staveWidth + 50, { barLine: BarlineType.REPEAT_BEGIN, clef: 'treble', keySig: 'A' }, { barLine: endBarLine, clef: 'bass' }); + x += staveWidth + 50; + drawStave(x, y, staveWidth, { barLine: BarlineType.REPEAT_BEGIN }, { barLine: endBarLine, keySig: 'E' }); + x += staveWidth; + drawStave(x, y, staveWidth, { barLine: BarlineType.REPEAT_BEGIN }, { barLine: endBarLine, timeSig: '2/4' }); + x += staveWidth; + x = 10; + y += blockHeight; + drawStave(x, y, staveWidth, { barLine: BarlineType.REPEAT_BEGIN }, { barLine: endBarLine, clef: 'bass', timeSig: '2/4' }); + x += staveWidth; + drawStave(x, y, staveWidth, { barLine: BarlineType.REPEAT_BEGIN }, { barLine: endBarLine, clef: 'treble', keySig: 'Ab' }); + x += staveWidth; + drawStave(x, y, staveWidth, { barLine: BarlineType.REPEAT_BEGIN }, { barLine: endBarLine, clef: 'bass', keySig: 'Ab', timeSig: '2/4' }); + x += staveWidth; + } + y = 0; + x = 10; + drawStavesInTwoLines(BarlineType.SINGLE); + y += blockHeight + 10; + x = 10; + drawStavesInTwoLines(BarlineType.DOUBLE); + y += blockHeight + 10; + x = 10; + drawStavesInTwoLines(BarlineType.REPEAT_END); + y += blockHeight + 10; + x = 10; + drawStavesInTwoLines(BarlineType.REPEAT_BOTH); +} +function drawStaveRepetition(options, contextBuilder) { + expect(0); + const ctx = contextBuilder(options.elementId, 725, 200); + const mm1 = new Stave(10, 50, 150); + mm1.addClef('treble'); + mm1.setRepetitionType(Repetition.type.DS_AL_FINE, options.params.yShift); + mm1.setMeasure(1); + mm1.setContext(ctx).draw(); + const notesmm1 = [ + new StaveNote({ keys: ['a/4'], duration: 'q' }), + new StaveNote({ keys: ['f/4'], duration: 'q' }), + new StaveNote({ keys: ['f/4'], duration: 'q' }), + new StaveNote({ keys: ['a/4'], duration: 'q' }), + ]; + Formatter.FormatAndDraw(ctx, mm1, notesmm1); + const mm2 = new Stave(mm1.getWidth() + mm1.getX(), mm1.getY(), 150); + mm2.setRepetitionType(Repetition.type.TO_CODA, options.params.yShift); + mm2.setMeasure(2); + mm2.setContext(ctx).draw(); + const notesmm2 = [ + new StaveNote({ keys: ['a/4'], duration: 'q' }), + new StaveNote({ keys: ['f/4'], duration: 'q' }), + new StaveNote({ keys: ['f/4'], duration: 'q' }), + new StaveNote({ keys: ['a/4'], duration: 'q' }), + ]; + Formatter.FormatAndDraw(ctx, mm2, notesmm2); + const mm3 = new Stave(mm2.getWidth() + mm2.getX(), mm1.getY(), 150); + mm3.setRepetitionType(Repetition.type.DS_AL_CODA, options.params.yShift); + mm3.setMeasure(3); + mm3.setContext(ctx).draw(); + const notesmm3 = [ + new StaveNote({ keys: ['a/4'], duration: 'q' }), + new StaveNote({ keys: ['f/4'], duration: 'q' }), + new StaveNote({ keys: ['f/4'], duration: 'q' }), + new StaveNote({ keys: ['a/4'], duration: 'q' }), + ]; + Formatter.FormatAndDraw(ctx, mm3, notesmm3); + const mm4 = new Stave(mm3.getWidth() + mm3.getX(), mm1.getY(), 150); + mm4.setRepetitionType(Repetition.type.CODA_LEFT, options.params.yShift); + mm4.setMeasure(4); + mm4.setContext(ctx).draw(); + const notesmm4 = [ + new StaveNote({ keys: ['a/4'], duration: 'q' }), + new StaveNote({ keys: ['f/4'], duration: 'q' }), + new StaveNote({ keys: ['f/4'], duration: 'q' }), + new StaveNote({ keys: ['a/4'], duration: 'q' }), + ]; + Formatter.FormatAndDraw(ctx, mm4, notesmm4); +} +function drawVolta(options, contextBuilder) { + expect(0); + const ctx = contextBuilder(options.elementId, 725, 200); + const mm1 = new Stave(10, 50, 125); + mm1.setBegBarType(BarlineType.REPEAT_BEGIN); + mm1.setRepetitionType(Repetition.type.SEGNO_LEFT); + mm1.addClef('treble'); + mm1.addKeySignature('A'); + mm1.setMeasure(1); + mm1.setSection('A', 0); + mm1.setContext(ctx).draw(); + const notesmm1 = [new StaveNote({ keys: ['c/4'], duration: 'w' })]; + Formatter.FormatAndDraw(ctx, mm1, notesmm1); + const mm2 = new Stave(mm1.getWidth() + mm1.getX(), mm1.getY(), 60); + mm2.setRepetitionType(Repetition.type.CODA_RIGHT); + mm2.setMeasure(2); + mm2.setContext(ctx).draw(); + const notesmm2 = [new StaveNote({ keys: ['d/4'], duration: 'w' })]; + Formatter.FormatAndDraw(ctx, mm2, notesmm2); + const mm3 = new Stave(mm2.getWidth() + mm2.getX(), mm1.getY(), 60); + mm3.setVoltaType(VoltaType.BEGIN, '1.', -5); + mm3.setMeasure(3); + mm3.setContext(ctx).draw(); + const notesmm3 = [new StaveNote({ keys: ['e/4'], duration: 'w' })]; + Formatter.FormatAndDraw(ctx, mm3, notesmm3); + const mm4 = new Stave(mm3.getWidth() + mm3.getX(), mm1.getY(), 60); + mm4.setVoltaType(VoltaType.MID, '', -5); + mm4.setMeasure(4); + mm4.setContext(ctx).draw(); + const notesmm4 = [new StaveNote({ keys: ['f/4'], duration: 'w' })]; + Formatter.FormatAndDraw(ctx, mm4, notesmm4); + const mm5 = new Stave(mm4.getWidth() + mm4.getX(), mm1.getY(), 60); + mm5.setEndBarType(BarlineType.REPEAT_END); + mm5.setVoltaType(VoltaType.END, '', -5); + mm5.setMeasure(5); + mm5.setContext(ctx).draw(); + const notesmm5 = [new StaveNote({ keys: ['g/4'], duration: 'w' })]; + Formatter.FormatAndDraw(ctx, mm5, notesmm5); + const mm6 = new Stave(mm5.getWidth() + mm5.getX(), mm1.getY(), 60); + mm6.setVoltaType(VoltaType.BEGIN_END, '2.', -5); + mm6.setEndBarType(BarlineType.DOUBLE); + mm6.setMeasure(6); + mm6.setContext(ctx).draw(); + const notesmm6 = [new StaveNote({ keys: ['a/4'], duration: 'w' })]; + Formatter.FormatAndDraw(ctx, mm6, notesmm6); + const mm7 = new Stave(mm6.getWidth() + mm6.getX(), mm1.getY(), 60); + mm7.setMeasure(7); + mm7.setSection('B', 0); + mm7.setContext(ctx).draw(); + const notesmm7 = [new StaveNote({ keys: ['b/4'], duration: 'w' })]; + Formatter.FormatAndDraw(ctx, mm7, notesmm7); + const mm8 = new Stave(mm7.getWidth() + mm7.getX(), mm1.getY(), 60); + mm8.setEndBarType(BarlineType.DOUBLE); + mm8.setRepetitionType(Repetition.type.DS_AL_CODA); + mm8.setMeasure(8); + mm8.setContext(ctx).draw(); + const notesmm8 = [new StaveNote({ keys: ['c/5'], duration: 'w' })]; + Formatter.FormatAndDraw(ctx, mm8, notesmm8); + const mm9 = new Stave(mm8.getWidth() + mm8.getX() + 20, mm1.getY(), 125); + mm9.setEndBarType(BarlineType.END); + mm9.setRepetitionType(Repetition.type.CODA_LEFT); + mm9.addClef('treble'); + mm9.addKeySignature('A'); + mm9.setMeasure(9); + mm9.setContext(ctx).draw(); + const notesmm9 = [new StaveNote({ keys: ['d/5'], duration: 'w' })]; + Formatter.FormatAndDraw(ctx, mm9, notesmm9); +} +function drawVoltaModifier(options, contextBuilder) { + expect(0); + const ctx = contextBuilder(options.elementId, 1100, 200); + const mm1 = new Stave(10, 50, 175); + mm1.setBegBarType(BarlineType.REPEAT_BEGIN); + mm1.setVoltaType(VoltaType.BEGIN_END, '1.', -5); + mm1.addClef('treble'); + mm1.addKeySignature('A'); + mm1.setMeasure(1); + mm1.setSection('A', 0); + mm1.setContext(ctx).draw(); + const notesmm1 = [new StaveNote({ keys: ['c/4'], duration: 'w' })]; + Formatter.FormatAndDraw(ctx, mm1, notesmm1); + const mm2 = new Stave(mm1.getX() + mm1.getWidth(), mm1.getY(), 175); + mm2.setBegBarType(BarlineType.REPEAT_BEGIN); + mm2.setRepetitionType(Repetition.type.DS); + mm2.setVoltaType(VoltaType.BEGIN, '2.', -5); + mm2.addClef('treble'); + mm2.addKeySignature('A'); + mm2.setMeasure(2); + mm2.setContext(ctx).draw(); + const notesmm2 = [new StaveNote({ keys: ['c/4'], duration: 'w' })]; + Formatter.FormatAndDraw(ctx, mm2, notesmm2); + const mm3 = new Stave(mm2.getX() + mm2.getWidth(), mm2.getY(), 175); + mm3.setVoltaType(VoltaType.MID, '', -5); + mm3.setRepetitionType(Repetition.type.DS); + mm3.addClef('treble'); + mm3.addKeySignature('B'); + mm3.setMeasure(3); + mm3.setSection('B', 0); + mm3.setContext(ctx).draw(); + const notesmm3 = [new StaveNote({ keys: ['c/4'], duration: 'w' })]; + Formatter.FormatAndDraw(ctx, mm3, notesmm3); + const mm4 = new Stave(mm3.getX() + mm3.getWidth(), mm3.getY(), 175); + mm4.setVoltaType(VoltaType.END, '1.', -5); + mm4.setRepetitionType(Repetition.type.DS); + mm4.addClef('treble'); + mm4.addKeySignature('A'); + mm4.setMeasure(4); + mm4.setSection('C', 0); + mm4.setContext(ctx).draw(); + const notesmm4 = [new StaveNote({ keys: ['c/4'], duration: 'w' })]; + Formatter.FormatAndDraw(ctx, mm4, notesmm4); + const mm5 = new Stave(mm4.getX() + mm4.getWidth(), mm4.getY(), 175); + mm5.setEndBarType(BarlineType.DOUBLE); + mm5.setRepetitionType(Repetition.type.DS); + mm5.addClef('treble'); + mm5.addKeySignature('A'); + mm5.setMeasure(5); + mm5.setSection('D', 0); + mm5.setContext(ctx).draw(); + const notesmm5 = [new StaveNote({ keys: ['c/4'], duration: 'w' })]; + Formatter.FormatAndDraw(ctx, mm5, notesmm5); + const mm6 = new Stave(mm5.getX() + mm5.getWidth(), mm5.getY(), 175); + mm6.setRepetitionType(Repetition.type.DS); + mm6.setMeasure(6); + mm6.setSection('E', 0); + mm6.setContext(ctx).draw(); + const notesmm6 = [new StaveNote({ keys: ['c/4'], duration: 'w' })]; + Formatter.FormatAndDraw(ctx, mm6, notesmm6); +} +function drawTempo(options, contextBuilder) { + expect(0); + const ctx = contextBuilder(options.elementId, 725, 350); + const padding = 10; + let x = 0; + let y = 50; + function drawTempoStaveBar(width, tempo, tempo_y, notes) { + const staveBar = new Stave(padding + x, y, width); + if (x === 0) + staveBar.addClef('treble'); + staveBar.setTempo(tempo, tempo_y); + staveBar.setContext(ctx).draw(); + const notesBar = notes || [ + new StaveNote({ keys: ['c/4'], duration: 'q' }), + new StaveNote({ keys: ['d/4'], duration: 'q' }), + new StaveNote({ keys: ['b/4'], duration: 'q' }), + new StaveNote({ keys: ['c/4'], duration: 'q' }), + ]; + Formatter.FormatAndDraw(ctx, staveBar, notesBar); + x += width; + } + drawTempoStaveBar(120, { duration: 'q', dots: 1, bpm: 80 }, 0); + drawTempoStaveBar(100, { duration: '8', dots: 2, bpm: 90 }, 0); + drawTempoStaveBar(100, { duration: '16', dots: 1, bpm: 96 }, 0); + drawTempoStaveBar(100, { duration: '32', bpm: 70 }, 0); + drawTempoStaveBar(250, { name: 'Andante', bpm: 120 }, -20, [ + new StaveNote({ keys: ['c/4'], duration: '8' }), + new StaveNote({ keys: ['d/4'], duration: '8' }), + new StaveNote({ keys: ['g/4'], duration: '8' }), + new StaveNote({ keys: ['e/5'], duration: '8' }), + new StaveNote({ keys: ['c/4'], duration: '8' }), + new StaveNote({ keys: ['d/4'], duration: '8' }), + new StaveNote({ keys: ['g/4'], duration: '8' }), + new StaveNote({ keys: ['e/4'], duration: '8' }), + ]); + x = 0; + y += 150; + drawTempoStaveBar(120, { duration: 'w', bpm: 80 }, 0); + drawTempoStaveBar(100, { duration: 'h', bpm: 90 }, 0); + drawTempoStaveBar(100, { duration: 'q', bpm: 96 }, 0); + drawTempoStaveBar(100, { duration: '8', bpm: 70 }, 0); + drawTempoStaveBar(250, { name: 'Andante grazioso' }, 0, [ + new StaveNote({ keys: ['c/4'], duration: '8' }), + new StaveNote({ keys: ['d/4'], duration: '8' }), + new StaveNote({ keys: ['g/4'], duration: '8' }), + new StaveNote({ keys: ['e/4'], duration: '8' }), + new StaveNote({ keys: ['c/4'], duration: '8' }), + new StaveNote({ keys: ['d/4'], duration: '8' }), + new StaveNote({ keys: ['g/4'], duration: '8' }), + new StaveNote({ keys: ['e/4'], duration: '8' }), + ]); +} +function configureSingleLine(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 120); + const stave = new Stave(10, 10, 300); + stave + .setConfigForLine(0, { visible: true }) + .setConfigForLine(1, { visible: false }) + .setConfigForLine(2, { visible: true }) + .setConfigForLine(3, { visible: false }) + .setConfigForLine(4, { visible: true }); + stave.setContext(ctx).draw(); + const config = stave.getConfigForLines(); + equal(config[0].visible, true, 'getLinesConfiguration() - Line 0'); + equal(config[1].visible, false, 'getLinesConfiguration() - Line 1'); + equal(config[2].visible, true, 'getLinesConfiguration() - Line 2'); + equal(config[3].visible, false, 'getLinesConfiguration() - Line 3'); + equal(config[4].visible, true, 'getLinesConfiguration() - Line 4'); + ok(true, 'all pass'); +} +function configureAllLines(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 120); + const stave = new Stave(10, 10, 300); + stave + .setConfigForLines([{ visible: false }, {}, { visible: false }, { visible: true }, { visible: false }]) + .setContext(ctx) + .draw(); + const config = stave.getConfigForLines(); + equal(config[0].visible, false, 'getLinesConfiguration() - Line 0'); + equal(config[1].visible, true, 'getLinesConfiguration() - Line 1'); + equal(config[2].visible, false, 'getLinesConfiguration() - Line 2'); + equal(config[3].visible, true, 'getLinesConfiguration() - Line 3'); + equal(config[4].visible, false, 'getLinesConfiguration() - Line 4'); + ok(true, 'all pass'); +} +function drawStaveText(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 900, 140); + const stave = new Stave(300, 10, 300); + stave.setText('Violin', Modifier.Position.LEFT); + stave.setText('Right Text', Modifier.Position.RIGHT); + stave.setText('Above Text', Modifier.Position.ABOVE); + stave.setText('Below Text', Modifier.Position.BELOW); + stave.setContext(ctx).draw(); + ok(true, 'all pass'); +} +function drawStaveTextMultiLine(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 900, 200); + const stave = new Stave(300, 40, 300); + stave.setText('Violin', Modifier.Position.LEFT, { shift_y: -10 }); + stave.setText('2nd line', Modifier.Position.LEFT, { shift_y: 10 }); + stave.setText('Right Text', Modifier.Position.RIGHT, { shift_y: -10 }); + stave.setText('2nd line', Modifier.Position.RIGHT, { shift_y: 10 }); + stave.setText('Above Text', Modifier.Position.ABOVE, { shift_y: -10 }); + stave.setText('2nd line', Modifier.Position.ABOVE, { shift_y: 10 }); + stave.setText('Left Below Text', Modifier.Position.BELOW, { shift_y: -10, justification: Justification.LEFT }); + stave.setText('Right Below Text', Modifier.Position.BELOW, { shift_y: 10, justification: Justification.RIGHT }); + stave.setContext(ctx).draw(); + ok(true, 'all pass'); +} +function factoryAPI(options) { + const f = VexFlowTests.makeFactory(options, 900, 200); + const stave = f.Stave({ x: 300, y: 40, width: 300 }); + stave.setText('Violin', Modifier.Position.LEFT, { shift_y: -10 }); + stave.setText('2nd line', Modifier.Position.LEFT, { shift_y: 10 }); + f.draw(); + ok(true, 'all pass'); +} +VexFlowTests.register(StaveTests); +export { StaveTests }; diff --git a/build/esm/tests/staveconnector_tests.js b/build/esm/tests/staveconnector_tests.js new file mode 100644 index 0000000000..76fb9b7e38 --- /dev/null +++ b/build/esm/tests/staveconnector_tests.js @@ -0,0 +1,402 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Flow } from '../src/flow.js'; +import { Modifier } from '../src/modifier.js'; +import { Stave } from '../src/stave.js'; +import { BarlineType } from '../src/stavebarline.js'; +import { StaveConnector } from '../src/staveconnector.js'; +const StaveConnectorTests = { + Start() { + QUnit.module('StaveConnector'); + const run = VexFlowTests.runTests; + run('Single Draw Test', drawSingle); + run('Single Draw Test, 4px Stave Line Thickness', drawSingle4pxStaveLines); + run('Single Both Sides Test', drawSingleBoth); + run('Double Draw Test', drawDouble); + run('Bold Double Line Left Draw Test', drawRepeatBegin); + run('Bold Double Line Right Draw Test', drawRepeatEnd); + run('Thin Double Line Right Draw Test', drawThinDouble); + run('Bold Double Lines Overlapping Draw Test', drawRepeatAdjacent); + run('Bold Double Lines Offset Draw Test', drawRepeatOffset); + run('Bold Double Lines Offset Draw Test 2', drawRepeatOffset2); + run('Brace Draw Test', drawBrace); + run('Brace Wide Draw Test', drawBraceWide); + run('Bracket Draw Test', drawBracket); + run('Combined Draw Test', drawCombined); + }, +}; +function drawSingle(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 300); + const stave1 = new Stave(25, 10, 300); + const stave2 = new Stave(25, 120, 300); + stave1.setContext(ctx); + stave2.setContext(ctx); + const connector = new StaveConnector(stave1, stave2); + connector.setType(StaveConnector.type.SINGLE); + connector.setContext(ctx); + stave1.draw(); + stave2.draw(); + connector.draw(); + ok(true, 'all pass'); +} +function drawSingle4pxStaveLines(options, contextBuilder) { + const oldThickness = Flow.STAVE_LINE_THICKNESS; + Flow.STAVE_LINE_THICKNESS = 4; + const ctx = contextBuilder(options.elementId, 400, 300); + const stave1 = new Stave(25, 10, 300); + const stave2 = new Stave(25, 120, 300); + stave1.setContext(ctx); + stave2.setContext(ctx); + const connector = new StaveConnector(stave1, stave2); + connector.setType(StaveConnector.type.SINGLE); + connector.setContext(ctx); + stave1.draw(); + stave2.draw(); + connector.draw(); + Flow.STAVE_LINE_THICKNESS = oldThickness; + ok(true, 'all pass'); +} +function drawSingleBoth(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 300); + const stave1 = new Stave(25, 10, 300); + const stave2 = new Stave(25, 120, 300); + stave1.setContext(ctx); + stave2.setContext(ctx); + const connector1 = new StaveConnector(stave1, stave2); + connector1.setType(StaveConnector.type.SINGLE_LEFT); + connector1.setContext(ctx); + const connector2 = new StaveConnector(stave1, stave2); + connector2.setType(StaveConnector.type.SINGLE_RIGHT); + connector2.setContext(ctx); + stave1.draw(); + stave2.draw(); + connector1.draw(); + connector2.draw(); + ok(true, 'all pass'); +} +function drawDouble(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 300); + const stave1 = new Stave(25, 10, 300); + const stave2 = new Stave(25, 120, 300); + stave1.setContext(ctx); + stave2.setContext(ctx); + const connector = new StaveConnector(stave1, stave2); + const line = new StaveConnector(stave1, stave2); + connector.setType(StaveConnector.type.DOUBLE); + connector.setContext(ctx); + line.setType(StaveConnector.type.SINGLE); + connector.setContext(ctx); + line.setContext(ctx); + stave1.draw(); + stave2.draw(); + connector.draw(); + line.draw(); + ok(true, 'all pass'); +} +function drawBrace(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 450, 300); + const stave1 = new Stave(100, 10, 300); + const stave2 = new Stave(100, 120, 300); + stave1.setContext(ctx); + stave2.setContext(ctx); + const connector = new StaveConnector(stave1, stave2); + const line = new StaveConnector(stave1, stave2); + connector.setType(StaveConnector.type.BRACE); + connector.setContext(ctx); + connector.setText('Piano'); + line.setType(StaveConnector.type.SINGLE); + connector.setContext(ctx); + line.setContext(ctx); + stave1.draw(); + stave2.draw(); + connector.draw(); + line.draw(); + ok(true, 'all pass'); +} +function drawBraceWide(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 300); + const stave1 = new Stave(25, -20, 300); + const stave2 = new Stave(25, 200, 300); + stave1.setContext(ctx); + stave2.setContext(ctx); + const connector = new StaveConnector(stave1, stave2); + const line = new StaveConnector(stave1, stave2); + connector.setType(StaveConnector.type.BRACE); + connector.setContext(ctx); + line.setType(StaveConnector.type.SINGLE); + connector.setContext(ctx); + line.setContext(ctx); + stave1.draw(); + stave2.draw(); + connector.draw(); + line.draw(); + ok(true, 'all pass'); +} +function drawBracket(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 300); + const stave1 = new Stave(25, 10, 300); + const stave2 = new Stave(25, 120, 300); + stave1.setContext(ctx); + stave2.setContext(ctx); + const connector = new StaveConnector(stave1, stave2); + const line = new StaveConnector(stave1, stave2); + connector.setType(StaveConnector.type.BRACKET); + connector.setContext(ctx); + line.setType(StaveConnector.type.SINGLE); + connector.setContext(ctx); + line.setContext(ctx); + stave1.draw(); + stave2.draw(); + connector.draw(); + line.draw(); + ok(true, 'all pass'); +} +function drawRepeatBegin(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 300); + const stave1 = new Stave(25, 10, 300); + const stave2 = new Stave(25, 120, 300); + stave1.setContext(ctx); + stave2.setContext(ctx); + stave1.setBegBarType(BarlineType.REPEAT_BEGIN); + stave2.setBegBarType(BarlineType.REPEAT_BEGIN); + const line = new StaveConnector(stave1, stave2); + line.setType(StaveConnector.type.BOLD_DOUBLE_LEFT); + line.setContext(ctx); + stave1.draw(); + stave2.draw(); + line.draw(); + ok(true, 'all pass'); +} +function drawRepeatEnd(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 300); + const stave1 = new Stave(25, 10, 300); + const stave2 = new Stave(25, 120, 300); + stave1.setContext(ctx); + stave2.setContext(ctx); + stave1.setEndBarType(BarlineType.REPEAT_END); + stave2.setEndBarType(BarlineType.REPEAT_END); + const line = new StaveConnector(stave1, stave2); + line.setType(StaveConnector.type.BOLD_DOUBLE_RIGHT); + line.setContext(ctx); + stave1.draw(); + stave2.draw(); + line.draw(); + ok(true, 'all pass'); +} +function drawThinDouble(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 300); + const stave1 = new Stave(25, 10, 300); + const stave2 = new Stave(25, 120, 300); + stave1.setContext(ctx); + stave2.setContext(ctx); + stave1.setEndBarType(BarlineType.DOUBLE); + stave2.setEndBarType(BarlineType.DOUBLE); + const line = new StaveConnector(stave1, stave2); + line.setType(StaveConnector.type.THIN_DOUBLE); + line.setContext(ctx); + stave1.draw(); + stave2.draw(); + line.draw(); + ok(true, 'all pass'); +} +function drawRepeatAdjacent(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 300); + const stave1 = new Stave(25, 10, 150); + const stave2 = new Stave(25, 120, 150); + const stave3 = new Stave(175, 10, 150); + const stave4 = new Stave(175, 120, 150); + stave1.setContext(ctx); + stave2.setContext(ctx); + stave3.setContext(ctx); + stave4.setContext(ctx); + stave1.setEndBarType(BarlineType.REPEAT_END); + stave2.setEndBarType(BarlineType.REPEAT_END); + stave3.setEndBarType(BarlineType.END); + stave4.setEndBarType(BarlineType.END); + stave1.setBegBarType(BarlineType.REPEAT_BEGIN); + stave2.setBegBarType(BarlineType.REPEAT_BEGIN); + stave3.setBegBarType(BarlineType.REPEAT_BEGIN); + stave4.setBegBarType(BarlineType.REPEAT_BEGIN); + const connector1 = new StaveConnector(stave1, stave2); + const connector2 = new StaveConnector(stave1, stave2); + const connector3 = new StaveConnector(stave3, stave4); + const connector4 = new StaveConnector(stave3, stave4); + connector1.setContext(ctx); + connector2.setContext(ctx); + connector3.setContext(ctx); + connector4.setContext(ctx); + connector1.setType(StaveConnector.type.BOLD_DOUBLE_LEFT); + connector2.setType(StaveConnector.type.BOLD_DOUBLE_RIGHT); + connector3.setType(StaveConnector.type.BOLD_DOUBLE_LEFT); + connector4.setType(StaveConnector.type.BOLD_DOUBLE_RIGHT); + stave1.draw(); + stave2.draw(); + stave3.draw(); + stave4.draw(); + connector1.draw(); + connector2.draw(); + connector3.draw(); + connector4.draw(); + ok(true, 'all pass'); +} +function drawRepeatOffset2(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 300); + const stave1 = new Stave(25, 10, 150); + const stave2 = new Stave(25, 120, 150); + const stave3 = new Stave(175, 10, 150); + const stave4 = new Stave(175, 120, 150); + stave1.setContext(ctx); + stave2.setContext(ctx); + stave3.setContext(ctx); + stave4.setContext(ctx); + stave1.addClef('treble'); + stave2.addClef('bass'); + stave3.addClef('alto'); + stave4.addClef('treble'); + stave1.addTimeSignature('4/4'); + stave2.addTimeSignature('4/4'); + stave3.addTimeSignature('6/8'); + stave4.addTimeSignature('6/8'); + stave1.setEndBarType(BarlineType.REPEAT_END); + stave2.setEndBarType(BarlineType.REPEAT_END); + stave3.setEndBarType(BarlineType.END); + stave4.setEndBarType(BarlineType.END); + stave1.setBegBarType(BarlineType.REPEAT_BEGIN); + stave2.setBegBarType(BarlineType.REPEAT_BEGIN); + stave3.setBegBarType(BarlineType.REPEAT_BEGIN); + stave4.setBegBarType(BarlineType.REPEAT_BEGIN); + const connector1 = new StaveConnector(stave1, stave2); + const connector2 = new StaveConnector(stave1, stave2); + const connector3 = new StaveConnector(stave3, stave4); + const connector4 = new StaveConnector(stave3, stave4); + const connector5 = new StaveConnector(stave3, stave4); + connector1.setContext(ctx); + connector2.setContext(ctx); + connector3.setContext(ctx); + connector4.setContext(ctx); + connector5.setContext(ctx); + connector1.setType(StaveConnector.type.BOLD_DOUBLE_LEFT); + connector2.setType(StaveConnector.type.BOLD_DOUBLE_RIGHT); + connector3.setType(StaveConnector.type.BOLD_DOUBLE_LEFT); + connector4.setType(StaveConnector.type.BOLD_DOUBLE_RIGHT); + connector5.setType(StaveConnector.type.SINGLE_LEFT); + connector1.setXShift(stave1.getModifierXShift()); + connector3.setXShift(stave3.getModifierXShift()); + stave1.draw(); + stave2.draw(); + stave3.draw(); + stave4.draw(); + connector1.draw(); + connector2.draw(); + connector3.draw(); + connector4.draw(); + connector5.draw(); + ok(true, 'all pass'); +} +function drawRepeatOffset(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 300); + const stave1 = new Stave(25, 10, 150); + const stave2 = new Stave(25, 120, 150); + const stave3 = new Stave(185, 10, 150); + const stave4 = new Stave(185, 120, 150); + stave1.setContext(ctx); + stave2.setContext(ctx); + stave3.setContext(ctx); + stave4.setContext(ctx); + stave1.addClef('bass'); + stave2.addClef('alto'); + stave3.addClef('treble'); + stave4.addClef('tenor'); + stave3.addKeySignature('Ab'); + stave4.addKeySignature('Ab'); + stave1.addTimeSignature('4/4'); + stave2.addTimeSignature('4/4'); + stave3.addTimeSignature('6/8'); + stave4.addTimeSignature('6/8'); + stave1.setEndBarType(BarlineType.REPEAT_END); + stave2.setEndBarType(BarlineType.REPEAT_END); + stave3.setEndBarType(BarlineType.END); + stave4.setEndBarType(BarlineType.END); + stave1.setBegBarType(BarlineType.REPEAT_BEGIN); + stave2.setBegBarType(BarlineType.REPEAT_BEGIN); + stave3.setBegBarType(BarlineType.REPEAT_BEGIN); + stave4.setBegBarType(BarlineType.REPEAT_BEGIN); + const connector1 = new StaveConnector(stave1, stave2); + const connector2 = new StaveConnector(stave1, stave2); + const connector3 = new StaveConnector(stave3, stave4); + const connector4 = new StaveConnector(stave3, stave4); + const connector5 = new StaveConnector(stave3, stave4); + connector1.setContext(ctx); + connector2.setContext(ctx); + connector3.setContext(ctx); + connector4.setContext(ctx); + connector5.setContext(ctx); + connector1.setType(StaveConnector.type.BOLD_DOUBLE_LEFT); + connector2.setType(StaveConnector.type.BOLD_DOUBLE_RIGHT); + connector3.setType(StaveConnector.type.BOLD_DOUBLE_LEFT); + connector4.setType(StaveConnector.type.BOLD_DOUBLE_RIGHT); + connector5.setType(StaveConnector.type.SINGLE_LEFT); + connector1.setXShift(stave1.getModifierXShift()); + connector3.setXShift(stave3.getModifierXShift()); + stave1.draw(); + stave2.draw(); + stave3.draw(); + stave4.draw(); + connector1.draw(); + connector2.draw(); + connector3.draw(); + connector4.draw(); + connector5.draw(); + ok(true, 'all pass'); +} +function drawCombined(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 550, 700); + const stave1 = new Stave(150, 10, 300); + const stave2 = new Stave(150, 100, 300); + const stave3 = new Stave(150, 190, 300); + const stave4 = new Stave(150, 280, 300); + const stave5 = new Stave(150, 370, 300); + const stave6 = new Stave(150, 460, 300); + const stave7 = new Stave(150, 560, 300); + stave1.setText('Violin', Modifier.Position.LEFT); + stave1.setContext(ctx); + stave2.setContext(ctx); + stave3.setContext(ctx); + stave4.setContext(ctx); + stave5.setContext(ctx); + stave6.setContext(ctx); + stave7.setContext(ctx); + const conn_single = new StaveConnector(stave1, stave7); + const conn_double = new StaveConnector(stave2, stave3); + const conn_bracket = new StaveConnector(stave4, stave7); + const conn_none = new StaveConnector(stave4, stave5); + const conn_brace = new StaveConnector(stave6, stave7); + conn_single.setType(StaveConnector.type.SINGLE); + conn_double.setType(StaveConnector.type.DOUBLE); + conn_bracket.setType(StaveConnector.type.BRACKET); + conn_brace.setType(StaveConnector.type.BRACE); + conn_brace.setXShift(-5); + conn_double.setText('Piano'); + conn_none.setText('Multiple', { shift_y: -15 }); + conn_none.setText('Line Text', { shift_y: 15 }); + conn_brace.setText('Harpsichord'); + conn_single.setContext(ctx); + conn_double.setContext(ctx); + conn_bracket.setContext(ctx); + conn_none.setContext(ctx); + conn_brace.setContext(ctx); + stave1.draw(); + stave2.draw(); + stave3.draw(); + stave4.draw(); + stave5.draw(); + stave6.draw(); + stave7.draw(); + conn_single.draw(); + conn_double.draw(); + conn_bracket.draw(); + conn_none.draw(); + conn_brace.draw(); + ok(true, 'all pass'); +} +VexFlowTests.register(StaveConnectorTests); +export { StaveConnectorTests }; diff --git a/build/esm/tests/stavehairpin_tests.js b/build/esm/tests/stavehairpin_tests.js new file mode 100644 index 0000000000..b176dec5fe --- /dev/null +++ b/build/esm/tests/stavehairpin_tests.js @@ -0,0 +1,90 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { StaveHairpin } from '../src/stavehairpin.js'; +const StaveHairpinTests = { + Start() { + QUnit.module('StaveHairpin'); + const run = VexFlowTests.runTests; + run('Simple StaveHairpin', simple); + run('Horizontal Offset StaveHairpin', horizontal); + run('Vertical Offset StaveHairpin', vertical); + run('Height StaveHairpin', height); + }, +}; +function drawHairpin(first_note, last_note, ctx, type, position, options) { + const hairpin = new StaveHairpin({ first_note, last_note }, type); + hairpin.setContext(ctx); + hairpin.setPosition(position); + if (options) { + hairpin.setRenderOptions(options); + } + hairpin.draw(); +} +function createTest(drawTwoHairpins) { + return (options) => { + const factory = VexFlowTests.makeFactory(options); + const ctx = factory.getContext(); + const stave = factory.Stave(); + const notes = [ + factory + .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], stem_direction: 1, duration: '4' }) + .addModifier(factory.Accidental({ type: 'b' }), 0) + .addModifier(factory.Accidental({ type: '#' }), 1), + factory.StaveNote({ keys: ['d/4'], stem_direction: 1, duration: '4' }), + factory.StaveNote({ keys: ['e/4'], stem_direction: 1, duration: '4' }), + factory.StaveNote({ keys: ['f/4'], stem_direction: 1, duration: '4' }), + ]; + const voice = factory.Voice().addTickables(notes); + factory.Formatter().joinVoices([voice]).formatToStave([voice], stave); + factory.draw(); + drawTwoHairpins(ctx, notes); + ok(true, 'Simple Test'); + }; +} +const simple = createTest((ctx, notes) => { + drawHairpin(notes[0], notes[2], ctx, 1, 4); + drawHairpin(notes[1], notes[3], ctx, 2, 3); +}); +const horizontal = createTest((ctx, notes) => { + drawHairpin(notes[0], notes[2], ctx, 1, 3, { + height: 10, + vo: 20, + left_ho: 20, + right_ho: -20, + }); + drawHairpin(notes[3], notes[3], ctx, 2, 4, { + height: 10, + y_shift: 0, + left_shift_px: 0, + right_shift_px: 120, + }); +}); +const vertical = createTest((ctx, notes) => { + drawHairpin(notes[0], notes[2], ctx, 1, 4, { + height: 10, + y_shift: 0, + left_shift_px: 0, + right_shift_px: 0, + }); + drawHairpin(notes[2], notes[3], ctx, 2, 4, { + height: 10, + y_shift: -15, + left_shift_px: 2, + right_shift_px: 0, + }); +}); +const height = createTest((ctx, notes) => { + drawHairpin(notes[0], notes[2], ctx, 1, 4, { + height: 10, + y_shift: 0, + left_shift_px: 0, + right_shift_px: 0, + }); + drawHairpin(notes[2], notes[3], ctx, 2, 4, { + height: 15, + y_shift: 0, + left_shift_px: 2, + right_shift_px: 0, + }); +}); +VexFlowTests.register(StaveHairpinTests); +export { StaveHairpinTests }; diff --git a/build/esm/tests/staveline_tests.js b/build/esm/tests/staveline_tests.js new file mode 100644 index 0000000000..2534aad5cd --- /dev/null +++ b/build/esm/tests/staveline_tests.js @@ -0,0 +1,122 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Dot } from '../src/dot.js'; +import { Font, FontStyle } from '../src/font.js'; +const StaveLineTests = { + Start() { + QUnit.module('StaveLine'); + const run = VexFlowTests.runTests; + run('Simple StaveLine', simple0); + run('StaveLine Arrow Options', simple1); + }, +}; +function simple0(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave().addClef('treble'); + const notes = [ + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'treble' }), + f.StaveNote({ keys: ['c/5'], duration: '4', clef: 'treble' }), + f.StaveNote({ keys: ['c/4', 'g/4', 'b/4'], duration: '4', clef: 'treble' }), + f.StaveNote({ keys: ['f/4', 'a/4', 'f/5'], duration: '4', clef: 'treble' }), + ]; + const voice = f.Voice().addTickables(notes); + f.StaveLine({ + from: notes[0], + to: notes[1], + first_indices: [0], + last_indices: [0], + options: { + font: { family: Font.SERIF, size: 12, style: FontStyle.ITALIC }, + text: 'gliss.', + }, + }); + const staveLine2 = f.StaveLine({ + from: notes[2], + to: notes[3], + first_indices: [2, 1, 0], + last_indices: [0, 1, 2], + }); + staveLine2.render_options.line_dash = [10, 10]; + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true); +} +function simple1(options) { + const f = VexFlowTests.makeFactory(options, 770); + const stave = f.Stave().addClef('treble'); + const notes = [ + f.StaveNote({ keys: ['c#/5', 'd/5'], duration: '4', clef: 'treble', stem_direction: -1 }), + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'treble' }).addModifier(f.Accidental({ type: '#' }), 0), + f.StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: '4', clef: 'treble' }), + f + .StaveNote({ keys: ['f/4', 'a/4', 'c/5'], duration: '4', clef: 'treble' }) + .addModifier(f.Accidental({ type: '#' }), 2), + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'treble' }).addModifier(f.Accidental({ type: '#' }), 0), + f.StaveNote({ keys: ['c#/5', 'd/5'], duration: '4', clef: 'treble', stem_direction: -1 }), + f.StaveNote({ keys: ['c/4', 'd/4', 'g/4'], duration: '4', clef: 'treble' }), + f + .StaveNote({ keys: ['f/4', 'a/4', 'c/5'], duration: '4', clef: 'treble' }) + .addModifier(f.Accidental({ type: '#' }), 2), + ]; + Dot.buildAndAttach([notes[0]], { all: true }); + const voice = f.Voice().setStrict(false).addTickables(notes); + const staveLine0 = f.StaveLine({ + from: notes[0], + to: notes[1], + first_indices: [0], + last_indices: [0], + options: { text: 'Left' }, + }); + const staveLine4 = f.StaveLine({ + from: notes[2], + to: notes[3], + first_indices: [1], + last_indices: [1], + options: { text: 'Right' }, + }); + const staveLine1 = f.StaveLine({ + from: notes[4], + to: notes[5], + first_indices: [0], + last_indices: [0], + options: { text: 'Center' }, + }); + const staveLine2 = f.StaveLine({ + from: notes[6], + to: notes[7], + first_indices: [1], + last_indices: [0], + }); + const staveLine3 = f.StaveLine({ + from: notes[6], + to: notes[7], + first_indices: [2], + last_indices: [2], + options: { text: 'Top' }, + }); + staveLine0.render_options.draw_end_arrow = true; + staveLine0.render_options.text_justification = 1; + staveLine0.render_options.text_position_vertical = 2; + staveLine1.render_options.draw_end_arrow = true; + staveLine1.render_options.arrowhead_length = 30; + staveLine1.render_options.line_width = 5; + staveLine1.render_options.text_justification = 2; + staveLine1.render_options.text_position_vertical = 2; + staveLine4.render_options.line_width = 2; + staveLine4.render_options.draw_end_arrow = true; + staveLine4.render_options.draw_start_arrow = true; + staveLine4.render_options.arrowhead_angle = 0.5; + staveLine4.render_options.arrowhead_length = 20; + staveLine4.render_options.text_justification = 3; + staveLine4.render_options.text_position_vertical = 2; + staveLine2.render_options.draw_start_arrow = true; + staveLine2.render_options.line_dash = [5, 4]; + staveLine3.render_options.draw_end_arrow = true; + staveLine3.render_options.draw_start_arrow = true; + staveLine3.render_options.color = 'red'; + staveLine3.render_options.text_position_vertical = 1; + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true); +} +VexFlowTests.register(StaveLineTests); +export { StaveLineTests }; diff --git a/build/esm/tests/stavemodifier_tests.js b/build/esm/tests/stavemodifier_tests.js new file mode 100644 index 0000000000..89e4619003 --- /dev/null +++ b/build/esm/tests/stavemodifier_tests.js @@ -0,0 +1,51 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Stave } from '../src/stave.js'; +import { BarlineType } from '../src/stavebarline.js'; +import { StaveModifierPosition } from '../src/stavemodifier.js'; +const StaveModifierTests = { + Start() { + QUnit.module('StaveModifier'); + const run = VexFlowTests.runTests; + run('Stave Draw Test', draw); + run('Begin & End StaveModifier Test', drawBeginAndEnd); + }, +}; +function draw(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 120); + const stave = new Stave(10, 10, 300); + stave.setContext(ctx); + stave.draw(); + equal(stave.getYForNote(0), 100, 'getYForNote(0)'); + equal(stave.getYForLine(5), 100, 'getYForLine(5)'); + equal(stave.getYForLine(0), 50, 'getYForLine(0) - Top Line'); + equal(stave.getYForLine(4), 90, 'getYForLine(4) - Bottom Line'); + ok(true, 'all pass'); +} +function drawBeginAndEnd(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 500, 240); + const stave = new Stave(10, 10, 400); + stave.setContext(ctx); + stave.setTimeSignature('C|'); + stave.setKeySignature('Db'); + stave.setClef('treble'); + stave.setBegBarType(BarlineType.REPEAT_BEGIN); + stave.setEndClef('alto'); + stave.setEndTimeSignature('9/8'); + stave.setEndKeySignature('G', 'C#'); + stave.setEndBarType(BarlineType.DOUBLE); + stave.draw(); + const END = StaveModifierPosition.END; + stave.setY(100); + stave.setTimeSignature('3/4'); + stave.setKeySignature('G', 'C#'); + stave.setClef('bass'); + stave.setBegBarType(BarlineType.SINGLE); + stave.setClef('treble', undefined, undefined, END); + stave.setTimeSignature('C', undefined, END); + stave.setKeySignature('F', undefined, END); + stave.setEndBarType(BarlineType.SINGLE); + stave.draw(); + ok(true, 'all pass'); +} +VexFlowTests.register(StaveModifierTests); +export { StaveModifierTests }; diff --git a/build/esm/tests/stavenote_tests.js b/build/esm/tests/stavenote_tests.js new file mode 100644 index 0000000000..0be6ab8b03 --- /dev/null +++ b/build/esm/tests/stavenote_tests.js @@ -0,0 +1,835 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Accidental } from '../src/accidental.js'; +import { Annotation, AnnotationVerticalJustify } from '../src/annotation.js'; +import { Articulation } from '../src/articulation.js'; +import { Beam } from '../src/beam.js'; +import { Dot } from '../src/dot.js'; +import { Flow } from '../src/flow.js'; +import { Formatter } from '../src/formatter.js'; +import { Fraction } from '../src/fraction.js'; +import { FretHandFinger } from '../src/frethandfinger.js'; +import { Modifier } from '../src/modifier.js'; +import { ModifierContext } from '../src/modifiercontext.js'; +import { Stave } from '../src/stave.js'; +import { StaveNote } from '../src/stavenote.js'; +import { Stem } from '../src/stem.js'; +import { StringNumber } from '../src/stringnumber.js'; +import { Stroke } from '../src/strokes.js'; +import { TickContext } from '../src/tickcontext.js'; +const StaveNoteTests = { + Start() { + QUnit.module('StaveNote'); + test('Tick', ticks); + test('Tick - New API', ticksNewAPI); + test('Stem', stem); + test('Automatic Stem Direction', autoStem); + test('Stem Extension Pitch', stemExtensionPitch); + test('Displacement after calling setStemDirection', setStemDirectionDisplacement); + test('StaveLine', staveLine); + test('Width', width); + test('TickContext', tickContext); + const run = VexFlowTests.runTests; + run('StaveNote Draw - Treble', drawBasic, { clef: 'treble', octaveShift: 0, restKey: 'r/4' }); + run('StaveNote BoundingBoxes - Treble', drawBoundingBoxes, { clef: 'treble', octaveShift: 0, restKey: 'r/4' }); + run('StaveNote Draw - Alto', drawBasic, { clef: 'alto', octaveShift: -1, restKey: 'r/4' }); + run('StaveNote Draw - Tenor', drawBasic, { clef: 'tenor', octaveShift: -1, restKey: 'r/3' }); + run('StaveNote Draw - Bass', drawBasic, { clef: 'bass', octaveShift: -2, restKey: 'r/3' }); + run('StaveNote Draw - Harmonic And Muted', drawHarmonicAndMuted); + run('StaveNote Draw - Slash', drawSlash); + run('Displacements', displacements); + run('StaveNote Draw - Bass 2', drawBass); + run('StaveNote Draw - Key Styles', drawKeyStyles); + run('StaveNote Draw - StaveNote Stem Styles', drawNoteStemStyles); + run('StaveNote Draw - StaveNote Stem Lengths', drawNoteStemLengths); + run('StaveNote Draw - StaveNote Flag Styles', drawNoteStylesWithFlag); + run('StaveNote Draw - StaveNote Styles', drawNoteStyles); + run('Stave, Ledger Line, Beam, Stem and Flag Styles', drawBeamStyles); + run('Flag and Dot Placement - Stem Up', dotsAndFlagsStemUp); + run('Flag and Dots Placement - Stem Down', dotsAndFlagsStemDown); + run('Beam and Dot Placement - Stem Up', dotsAndBeamsUp); + run('Beam and Dot Placement - Stem Down', dotsAndBeamsDown); + run('Center Aligned Note', centerAlignedRest); + run('Center Aligned Note with Articulation', centerAlignedRestFermata); + run('Center Aligned Note with Annotation', centerAlignedRestAnnotation); + run('Center Aligned Note - Multi Voice', centerAlignedMultiVoice); + run('Center Aligned Note with Multiple Modifiers', centerAlignedNoteMultiModifiers); + VexFlowTests.runSVGTest('Interactive Mouseover StaveNote', drawBasic, { + clef: 'treble', + octaveShift: 0, + restKey: 'r/4', + ui: true, + }); + }, +}; +const staveNote = (struct) => new StaveNote(struct); +function draw(note, stave, context, x, drawBoundingBox = false, addModifierContext = true) { + note.setStave(stave); + if (addModifierContext) { + note.addToModifierContext(new ModifierContext()); + } + new TickContext().addTickable(note).preFormat().setX(x); + note.setContext(context).draw(); + if (drawBoundingBox) { + const bb = note.getBoundingBox(); + context.rect(bb.getX(), bb.getY(), bb.getW(), bb.getH()); + context.stroke(); + } + return note; +} +function ticks() { + const BEAT = (1 * Flow.RESOLUTION) / 4; + const tickTests = { + 'Breve note': ['1/2', 8.0, 'n'], + 'Whole note': ['w', 4.0, 'n'], + 'Quarter note': ['q', 1.0, 'n'], + 'Dotted half note': ['hd', 3.0, 'n'], + 'Doubled-dotted half note': ['hdd', 3.5, 'n'], + 'Triple-dotted half note': ['hddd', 3.75, 'n'], + 'Dotted half rest': ['hdr', 3.0, 'r'], + 'Double-dotted half rest': ['hddr', 3.5, 'r'], + 'Triple-dotted half rest': ['hdddr', 3.75, 'r'], + 'Dotted harmonic quarter note': ['qdh', 1.5, 'h'], + 'Double-dotted harmonic quarter note': ['qddh', 1.75, 'h'], + 'Triple-dotted harmonic quarter note': ['qdddh', 1.875, 'h'], + 'Dotted muted 8th note': ['8dm', 0.75, 'm'], + 'Double-dotted muted 8th note': ['8ddm', 0.875, 'm'], + 'Triple-dotted muted 8th note': ['8dddm', 0.9375, 'm'], + }; + Object.keys(tickTests).forEach((testName) => { + const testData = tickTests[testName]; + const durationString = testData[0]; + const expectedBeats = testData[1]; + const expectedNoteType = testData[2]; + const note = new StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: durationString }); + equal(note.getTicks().value(), BEAT * expectedBeats, testName + ' must have ' + expectedBeats + ' beats'); + equal(note.getNoteType(), expectedNoteType, 'Note type must be ' + expectedNoteType); + }); + throws(() => new StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: '8.7dddm' }), /BadArguments/, "Invalid note duration '8.7' throws BadArguments exception"); + throws(() => new StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: '2Z' }), /BadArguments/, "Invalid note type 'Z' throws BadArguments exception"); + throws(() => new StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: '2dddZ' }), /BadArguments/, "Invalid note type 'Z' throws BadArguments exception"); +} +function ticksNewAPI() { + const BEAT = (1 * Flow.RESOLUTION) / 4; + const tickTests = { + 'Breve note': [{ duration: '1/2' }, 8.0, 'n'], + 'Whole note': [{ duration: 'w' }, 4.0, 'n'], + 'Quarter note': [{ duration: 'q' }, 1.0, 'n'], + 'Dotted half note': [{ duration: 'h', dots: 1 }, 3.0, 'n'], + 'Doubled-dotted half note': [{ duration: 'h', dots: 2 }, 3.5, 'n'], + 'Triple-dotted half note': [{ duration: 'h', dots: 3 }, 3.75, 'n'], + 'Dotted half rest': [{ duration: 'h', dots: 1, type: 'r' }, 3.0, 'r'], + 'Double-dotted half rest': [{ duration: 'h', dots: 2, type: 'r' }, 3.5, 'r'], + 'Triple-dotted half rest': [{ duration: 'h', dots: 3, type: 'r' }, 3.75, 'r'], + 'Dotted harmonic quarter note': [{ duration: 'q', dots: 1, type: 'h' }, 1.5, 'h'], + 'Double-dotted harmonic quarter note': [{ duration: 'q', dots: 2, type: 'h' }, 1.75, 'h'], + 'Triple-dotted harmonic quarter note': [{ duration: 'q', dots: 3, type: 'h' }, 1.875, 'h'], + 'Dotted muted 8th note': [{ duration: '8', dots: 1, type: 'm' }, 0.75, 'm'], + 'Double-dotted muted 8th note': [{ duration: '8', dots: 2, type: 'm' }, 0.875, 'm'], + 'Triple-dotted muted 8th note': [{ duration: '8', dots: 3, type: 'm' }, 0.9375, 'm'], + }; + Object.keys(tickTests).forEach(function (testName) { + const testData = tickTests[testName]; + const noteData = testData[0]; + const expectedBeats = testData[1]; + const expectedNoteType = testData[2]; + noteData.keys = ['c/4', 'e/4', 'g/4']; + const note = new StaveNote(noteData); + equal(note.getTicks().value(), BEAT * expectedBeats, testName + ' must have ' + expectedBeats + ' beats'); + equal(note.getNoteType(), expectedNoteType, 'Note type must be ' + expectedNoteType); + }); + throws(() => new StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: '8.7dddm' }), /BadArguments/, "Invalid note duration '8.7' throws BadArguments exception"); + throws(() => new StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: '2Z' }), /BadArguments/, "Invalid note type 'Z' throws BadArguments exception"); + throws(() => new StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: '2dddZ' }), /BadArguments/, "Invalid note type 'Z' throws BadArguments exception"); +} +function stem() { + const note = new StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: 'w' }); + equal(note.getStemDirection(), Stem.UP, 'Default note has UP stem'); +} +function autoStem() { + const testData = [ + [['c/5', 'e/5', 'g/5'], Stem.DOWN], + [['e/4', 'g/4', 'c/5'], Stem.UP], + [['c/5'], Stem.DOWN], + [['a/4', 'e/5', 'g/5'], Stem.DOWN], + [['b/4'], Stem.DOWN], + ]; + testData.forEach((td) => { + const keys = td[0]; + const expectedStemDirection = td[1]; + const note = new StaveNote({ keys: keys, auto_stem: true, duration: '8' }); + equal(note.getStemDirection(), expectedStemDirection, 'Stem must be ' + (expectedStemDirection === Stem.UP ? 'up' : 'down')); + }); +} +function stemExtensionPitch() { + const testData = [ + [['c/5', 'e/5', 'g/5'], 0, 0], + [['e/4', 'g/4', 'c/5'], 0, 0], + [['c/5'], 0, 0], + [['f/3'], 15, 0], + [['f/3'], 15, Stem.UP], + [['f/3'], 0, Stem.DOWN], + [['f/3', 'e/5'], 0, 0], + [['g/6'], 25, 0], + [['g/6'], 25, Stem.DOWN], + [['g/6'], 0, Stem.UP], + ]; + testData.forEach((td) => { + const keys = td[0]; + const expectedStemExtension = td[1]; + const overrideStemDirection = td[2]; + let note; + if (overrideStemDirection === 0) { + note = new StaveNote({ keys: keys, auto_stem: true, duration: '4' }); + } + else { + note = new StaveNote({ keys: keys, duration: '4', stem_direction: overrideStemDirection }); + } + equal(note.getStemExtension(), expectedStemExtension, 'For ' + keys.toString() + ' StemExtension must be ' + expectedStemExtension); + const stave = new Stave(10, 10, 300, { spacing_between_lines_px: 20 }); + note.setStave(stave); + equal(note.getStemExtension(), expectedStemExtension * 2, 'For wide staff ' + keys.toString() + ' StemExtension must be ' + expectedStemExtension * 2); + }); +} +function setStemDirectionDisplacement() { + function getDisplacements(note) { + return note.noteHeads.map((noteHead) => noteHead.isDisplaced()); + } + const stemUpDisplacements = [false, true, false]; + const stemDownDisplacements = [true, false, false]; + const note = new StaveNote({ keys: ['c/5', 'd/5', 'g/5'], stem_direction: Stem.UP, duration: '4' }); + deepEqual(getDisplacements(note), stemUpDisplacements); + note.setStemDirection(Stem.DOWN); + deepEqual(getDisplacements(note), stemDownDisplacements); + note.setStemDirection(Stem.UP); + deepEqual(getDisplacements(note), stemUpDisplacements); +} +function staveLine() { + const stave = new Stave(10, 10, 300); + const note = new StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: 'w' }); + note.setStave(stave); + const props = note.getKeyProps(); + equal(props[0].line, 0, 'C/4 on line 0'); + equal(props[1].line, 1, 'E/4 on line 1'); + equal(props[2].line, 2.5, 'A/4 on line 2.5'); + const ys = note.getYs(); + equal(ys.length, 3, 'Chord should be rendered on three lines'); + equal(ys[0], 100, 'Line for C/4'); + equal(ys[1], 90, 'Line for E/4'); + equal(ys[2], 75, 'Line for A/4'); +} +function width() { + const note = new StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: 'w' }); + throws(() => note.getWidth(), /UnformattedNote/, 'Unformatted note should have no width'); +} +function tickContext() { + const stave = new Stave(10, 10, 400); + const note = new StaveNote({ keys: ['c/4', 'e/4', 'a/4'], duration: 'w' }).setStave(stave); + new TickContext().addTickable(note).preFormat().setX(10).setPadding(0); + expect(0); +} +function drawBasic(options, contextBuilder) { + const clef = options.params.clef; + const octaveShift = options.params.octaveShift; + const restKey = options.params.restKey; + const ctx = contextBuilder(options.elementId, 700, 180); + const stave = new Stave(10, 30, 750); + stave.setContext(ctx); + stave.addClef(clef); + stave.draw(); + const lowerKeys = ['c/', 'e/', 'a/']; + const higherKeys = ['c/', 'e/', 'a/']; + for (let k = 0; k < lowerKeys.length; k++) { + lowerKeys[k] = lowerKeys[k] + (4 + octaveShift); + higherKeys[k] = higherKeys[k] + (5 + octaveShift); + } + const restKeys = [restKey]; + const noteStructs = [ + { clef: clef, keys: higherKeys, duration: '1/2' }, + { clef: clef, keys: lowerKeys, duration: 'w' }, + { clef: clef, keys: higherKeys, duration: 'h' }, + { clef: clef, keys: lowerKeys, duration: 'q' }, + { clef: clef, keys: higherKeys, duration: '8' }, + { clef: clef, keys: lowerKeys, duration: '16' }, + { clef: clef, keys: higherKeys, duration: '32' }, + { clef: clef, keys: higherKeys, duration: '64' }, + { clef: clef, keys: higherKeys, duration: '128' }, + { clef: clef, keys: lowerKeys, duration: '1/2', stem_direction: Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: 'w', stem_direction: Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: 'h', stem_direction: Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: 'q', stem_direction: Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: '8', stem_direction: Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: '16', stem_direction: Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: '32', stem_direction: Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: '64', stem_direction: Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: '128', stem_direction: Stem.DOWN }, + { clef: clef, keys: restKeys, duration: '1/2r' }, + { clef: clef, keys: restKeys, duration: 'wr' }, + { clef: clef, keys: restKeys, duration: 'hr' }, + { clef: clef, keys: restKeys, duration: 'qr' }, + { clef: clef, keys: restKeys, duration: '8r' }, + { clef: clef, keys: restKeys, duration: '16r' }, + { clef: clef, keys: restKeys, duration: '32r' }, + { clef: clef, keys: restKeys, duration: '64r' }, + { clef: clef, keys: restKeys, duration: '128r' }, + { keys: ['x/4'], duration: 'h' }, + ]; + expect(noteStructs.length * 2); + const colorDescendants = (parentItem, color) => () => parentItem.querySelectorAll('*').forEach((child) => { + child.setAttribute('fill', color); + child.setAttribute('stroke', color); + }); + for (let i = 0; i < noteStructs.length; ++i) { + const note = draw(staveNote(noteStructs[i]), stave, ctx, (i + 1) * 25); + if (options.params.ui) { + const item = note.getAttribute('el'); + item.addEventListener('mouseover', colorDescendants(item, 'green'), false); + item.addEventListener('mouseout', colorDescendants(item, 'black'), false); + } + ok(note.getX() > 0, 'Note ' + i + ' has X value'); + ok(note.getYs().length > 0, 'Note ' + i + ' has Y values'); + } +} +function drawBoundingBoxes(options, contextBuilder) { + const clef = options.params.clef; + const octaveShift = options.params.octaveShift; + const restKey = options.params.restKey; + const ctx = contextBuilder(options.elementId, 700, 180); + const stave = new Stave(10, 30, 750); + stave.setContext(ctx); + stave.addClef(clef); + stave.draw(); + const lowerKeys = ['c/', 'e/', 'a/']; + const higherKeys = ['c/', 'e/', 'a/']; + for (let k = 0; k < lowerKeys.length; k++) { + lowerKeys[k] = lowerKeys[k] + (4 + octaveShift); + higherKeys[k] = higherKeys[k] + (5 + octaveShift); + } + const restKeys = [restKey]; + const noteStructs = [ + { clef: clef, keys: higherKeys, duration: '1/2' }, + { clef: clef, keys: lowerKeys, duration: 'w' }, + { clef: clef, keys: higherKeys, duration: 'h' }, + { clef: clef, keys: lowerKeys, duration: 'q' }, + { clef: clef, keys: higherKeys, duration: '8' }, + { clef: clef, keys: lowerKeys, duration: '16' }, + { clef: clef, keys: higherKeys, duration: '32' }, + { clef: clef, keys: higherKeys, duration: '64' }, + { clef: clef, keys: higherKeys, duration: '128' }, + { clef: clef, keys: lowerKeys, duration: '1/2', stem_direction: Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: 'w', stem_direction: Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: 'h', stem_direction: Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: 'q', stem_direction: Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: '8', stem_direction: Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: '16', stem_direction: Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: '32', stem_direction: Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: '64', stem_direction: Stem.DOWN }, + { clef: clef, keys: lowerKeys, duration: '128' }, + { clef: clef, keys: restKeys, duration: '1/2r' }, + { clef: clef, keys: restKeys, duration: 'wr' }, + { clef: clef, keys: restKeys, duration: 'hr' }, + { clef: clef, keys: restKeys, duration: 'qr' }, + { clef: clef, keys: restKeys, duration: '8r' }, + { clef: clef, keys: restKeys, duration: '16r' }, + { clef: clef, keys: restKeys, duration: '32r' }, + { clef: clef, keys: restKeys, duration: '64r' }, + { clef: clef, keys: restKeys, duration: '128r' }, + { keys: ['x/4'], duration: 'h' }, + ]; + expect(noteStructs.length * 2); + for (let i = 0; i < noteStructs.length; ++i) { + const note = draw(staveNote(noteStructs[i]), stave, ctx, (i + 1) * 25, true, false); + ok(note.getX() > 0, 'Note ' + i + ' has X value'); + ok(note.getYs().length > 0, 'Note ' + i + ' has Y values'); + } +} +function drawBass(options, contextBuilder) { + expect(40); + const ctx = contextBuilder(options.elementId, 600, 280); + const stave = new Stave(10, 10, 650); + stave.setContext(ctx); + stave.addClef('bass'); + stave.draw(); + const noteStructs = [ + { clef: 'bass', keys: ['c/3', 'e/3', 'a/3'], duration: '1/2' }, + { clef: 'bass', keys: ['c/2', 'e/2', 'a/2'], duration: 'w' }, + { clef: 'bass', keys: ['c/3', 'e/3', 'a/3'], duration: 'h' }, + { clef: 'bass', keys: ['c/2', 'e/2', 'a/2'], duration: 'q' }, + { clef: 'bass', keys: ['c/3', 'e/3', 'a/3'], duration: '8' }, + { clef: 'bass', keys: ['c/2', 'e/2', 'a/2'], duration: '16' }, + { clef: 'bass', keys: ['c/3', 'e/3', 'a/3'], duration: '32' }, + { clef: 'bass', keys: ['c/2', 'e/2', 'a/2'], duration: 'h', stem_direction: Stem.DOWN }, + { clef: 'bass', keys: ['c/2', 'e/2', 'a/2'], duration: 'q', stem_direction: Stem.DOWN }, + { clef: 'bass', keys: ['c/2', 'e/2', 'a/2'], duration: '8', stem_direction: Stem.DOWN }, + { clef: 'bass', keys: ['c/2', 'e/2', 'a/2'], duration: '16', stem_direction: Stem.DOWN }, + { clef: 'bass', keys: ['c/2', 'e/2', 'a/2'], duration: '32', stem_direction: Stem.DOWN }, + { keys: ['r/4'], duration: '1/2r' }, + { keys: ['r/4'], duration: 'wr' }, + { keys: ['r/4'], duration: 'hr' }, + { keys: ['r/4'], duration: 'qr' }, + { keys: ['r/4'], duration: '8r' }, + { keys: ['r/4'], duration: '16r' }, + { keys: ['r/4'], duration: '32r' }, + { keys: ['x/4'], duration: 'h' }, + ]; + for (let i = 0; i < noteStructs.length; ++i) { + const note = draw(staveNote(noteStructs[i]), stave, ctx, (i + 1) * 25); + ok(note.getX() > 0, 'Note ' + i + ' has X value'); + ok(note.getYs().length > 0, 'Note ' + i + ' has Y values'); + } +} +function displacements(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 700, 155); + ctx.scale(0.9, 0.9); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + const stave = new Stave(10, 10, 675); + stave.setContext(ctx); + stave.draw(); + const noteStructs = [ + { keys: ['g/3', 'a/3', 'c/4', 'd/4', 'e/4'], duration: '1/2' }, + { keys: ['g/3', 'a/3', 'c/4', 'd/4', 'e/4'], duration: 'w' }, + { keys: ['d/4', 'e/4', 'f/4'], duration: 'h' }, + { keys: ['f/4', 'g/4', 'a/4', 'b/4'], duration: 'q' }, + { keys: ['e/3', 'b/3', 'c/4', 'e/4', 'f/4', 'g/5', 'a/5'], duration: '8' }, + { keys: ['a/3', 'c/4', 'e/4', 'g/4', 'a/4', 'b/4'], duration: '16' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '32' }, + { keys: ['c/4', 'e/4', 'a/4', 'a/4'], duration: '64' }, + { keys: ['g/3', 'c/4', 'd/4', 'e/4'], duration: 'h', stem_direction: Stem.DOWN }, + { keys: ['d/4', 'e/4', 'f/4'], duration: 'q', stem_direction: Stem.DOWN }, + { keys: ['f/4', 'g/4', 'a/4', 'b/4'], duration: '8', stem_direction: Stem.DOWN }, + { keys: ['c/4', 'd/4', 'e/4', 'f/4', 'g/4', 'a/4'], duration: '16', stem_direction: Stem.DOWN }, + { keys: ['b/3', 'c/4', 'e/4', 'a/4', 'b/5', 'c/6', 'e/6'], duration: '32', stem_direction: Stem.DOWN }, + { + keys: ['b/3', 'c/4', 'e/4', 'a/4', 'b/5', 'c/6', 'e/6', 'e/6'], + duration: '64', + stem_direction: Stem.DOWN, + }, + ]; + expect(noteStructs.length * 2); + for (let i = 0; i < noteStructs.length; ++i) { + const note = draw(staveNote(noteStructs[i]), stave, ctx, (i + 1) * 45); + ok(note.getX() > 0, 'Note ' + i + ' has X value'); + ok(note.getYs().length > 0, 'Note ' + i + ' has Y values'); + } +} +function drawHarmonicAndMuted(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 1000, 180); + const stave = new Stave(10, 10, 950); + stave.setContext(ctx); + stave.draw(); + const noteStructs = [ + { keys: ['c/4', 'e/4', 'a/4'], duration: '1/2h' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: 'wh' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: 'hh' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: 'qh' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '8h' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '16h' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '32h' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '64h' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '128h' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '1/2h', stem_direction: Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: 'wh', stem_direction: Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: 'hh', stem_direction: Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: 'qh', stem_direction: Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '8h', stem_direction: Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '16h', stem_direction: Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '32h', stem_direction: Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '64h', stem_direction: Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '128h', stem_direction: Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '1/2m' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: 'wm' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: 'hm' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: 'qm' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '8m' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '16m' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '32m' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '64m' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '128m' }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '1/2m', stem_direction: Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: 'wm', stem_direction: Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: 'hm', stem_direction: Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: 'qm', stem_direction: Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '8m', stem_direction: Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '16m', stem_direction: Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '32m', stem_direction: Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '64m', stem_direction: Stem.DOWN }, + { keys: ['c/4', 'e/4', 'a/4'], duration: '128m', stem_direction: Stem.DOWN }, + ]; + expect(noteStructs.length * 2); + for (let i = 0; i < noteStructs.length; ++i) { + const note = draw(staveNote(noteStructs[i]), stave, ctx, i * 25 + 5); + ok(note.getX() > 0, 'Note ' + i + ' has X value'); + ok(note.getYs().length > 0, 'Note ' + i + ' has Y values'); + } +} +function drawSlash(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 700, 180); + const stave = new Stave(10, 10, 650); + stave.setContext(ctx); + stave.draw(); + const notes = [ + { keys: ['b/4'], duration: '1/2s', stem_direction: Stem.DOWN }, + { keys: ['b/4'], duration: 'ws', stem_direction: Stem.DOWN }, + { keys: ['b/4'], duration: 'hs', stem_direction: Stem.DOWN }, + { keys: ['b/4'], duration: 'qs', stem_direction: Stem.DOWN }, + { keys: ['b/4'], duration: '8s', stem_direction: Stem.DOWN }, + { keys: ['b/4'], duration: '16s', stem_direction: Stem.DOWN }, + { keys: ['b/4'], duration: '32s', stem_direction: Stem.DOWN }, + { keys: ['b/4'], duration: '64s', stem_direction: Stem.DOWN }, + { keys: ['b/4'], duration: '128s', stem_direction: Stem.DOWN }, + { keys: ['b/4'], duration: '1/2s', stem_direction: Stem.UP }, + { keys: ['b/4'], duration: 'ws', stem_direction: Stem.UP }, + { keys: ['b/4'], duration: 'hs', stem_direction: Stem.UP }, + { keys: ['b/4'], duration: 'qs', stem_direction: Stem.UP }, + { keys: ['b/4'], duration: '8s', stem_direction: Stem.UP }, + { keys: ['b/4'], duration: '16s', stem_direction: Stem.UP }, + { keys: ['b/4'], duration: '32s', stem_direction: Stem.UP }, + { keys: ['b/4'], duration: '64s', stem_direction: Stem.UP }, + { keys: ['b/4'], duration: '128s', stem_direction: Stem.UP }, + { keys: ['b/4'], duration: '8s', stem_direction: Stem.DOWN }, + { keys: ['b/4'], duration: '8s', stem_direction: Stem.DOWN }, + { keys: ['b/4'], duration: '8s', stem_direction: Stem.UP }, + { keys: ['b/4'], duration: '8s', stem_direction: Stem.UP }, + ]; + const stave_notes = notes.map((struct) => new StaveNote(struct)); + const beam1 = new Beam([stave_notes[16], stave_notes[17]]); + const beam2 = new Beam([stave_notes[18], stave_notes[19]]); + Formatter.FormatAndDraw(ctx, stave, stave_notes, false); + beam1.setContext(ctx).draw(); + beam2.setContext(ctx).draw(); + ok('Slash Note Heads'); +} +function drawKeyStyles(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 300, 280); + ctx.scale(3, 3); + const stave = new Stave(10, 0, 100); + const note = new StaveNote({ keys: ['g/4', 'bb/4', 'd/5'], duration: 'q' }) + .setStave(stave) + .addModifier(new Accidental('b'), 1) + .setKeyStyle(1, { shadowBlur: 2, shadowColor: 'blue', fillStyle: 'blue' }); + new TickContext().addTickable(note).preFormat().setX(25); + stave.setContext(ctx).draw(); + note.setContext(ctx).draw(); + ok(note.getX() > 0, 'Note has X value'); + ok(note.getYs().length > 0, 'Note has Y values'); +} +function drawNoteStyles(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 300, 280); + const stave = new Stave(10, 0, 100); + ctx.scale(3, 3); + const note = new StaveNote({ keys: ['g/4', 'bb/4', 'd/5'], duration: '8' }) + .setStave(stave) + .addModifier(new Accidental('b'), 1); + note.setStyle({ shadowBlur: 2, shadowColor: 'blue', fillStyle: 'blue', strokeStyle: 'blue' }); + new TickContext().addTickable(note).preFormat().setX(25); + stave.setContext(ctx).draw(); + note.setContext(ctx).draw(); + ok(note.getX() > 0, 'Note has X value'); + ok(note.getYs().length > 0, 'Note has Y values'); +} +function drawNoteStemStyles(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 300, 280); + const stave = new Stave(10, 0, 100); + ctx.scale(3, 3); + const note = new StaveNote({ keys: ['g/4', 'bb/4', 'd/5'], duration: 'q' }) + .setStave(stave) + .addModifier(new Accidental('b'), 1); + note.setStemStyle({ shadowBlur: 2, shadowColor: 'blue', fillStyle: 'blue', strokeStyle: 'blue' }); + new TickContext().addTickable(note).preFormat().setX(25); + stave.setContext(ctx).draw(); + note.setContext(ctx).draw(); + ok('Note Stem Style'); +} +function drawNoteStemLengths(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 975, 150); + const stave = new Stave(10, 10, 975); + stave.setContext(ctx).draw(); + const keys = [ + 'e/3', + 'f/3', + 'g/3', + 'a/3', + 'b/3', + 'c/4', + 'd/4', + 'e/4', + 'f/4', + 'g/4', + 'f/5', + 'g/5', + 'a/5', + 'b/5', + 'c/6', + 'd/6', + 'e/6', + 'f/6', + 'g/6', + 'a/6', + ]; + const notes = []; + let note; + let i; + for (i = 0; i < keys.length; i++) { + let duration = 'q'; + if (i % 2 === 1) { + duration = '8'; + } + note = new StaveNote({ keys: [keys[i]], duration, auto_stem: true }).setStave(stave); + new TickContext().addTickable(note); + note.setContext(ctx); + notes.push(note); + } + const whole_keys = ['e/3', 'a/3', 'f/5', 'a/5', 'd/6', 'a/6']; + for (i = 0; i < whole_keys.length; i++) { + note = new StaveNote({ keys: [whole_keys[i]], duration: 'w' }).setStave(stave); + new TickContext().addTickable(note); + note.setContext(ctx); + notes.push(note); + } + Formatter.FormatAndDraw(ctx, stave, notes); + ok('Note Stem Length'); +} +function drawNoteStylesWithFlag(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 300, 280); + const stave = new Stave(10, 0, 100); + ctx.scale(3, 3); + const note = new StaveNote({ keys: ['g/4', 'bb/4', 'd/5'], duration: '8' }) + .setStave(stave) + .addModifier(new Accidental('b'), 1); + note.setFlagStyle({ shadowBlur: 2, shadowColor: 'blue', fillStyle: 'blue', strokeStyle: 'blue' }); + new TickContext().addTickable(note).preFormat().setX(25); + stave.setContext(ctx).draw(); + note.setContext(ctx).draw(); + ok(note.getX() > 0, 'Note has X value'); + ok(note.getYs().length > 0, 'Note has Y values'); +} +function drawBeamStyles(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 160); + const stave = new Stave(10, 10, 380); + stave.setStyle({ strokeStyle: '#EEAAEE', lineWidth: 3 }); + stave.setContext(ctx); + stave.draw(); + const notes = [ + { keys: ['b/4'], duration: '8', stem_direction: Stem.DOWN }, + { keys: ['b/4'], duration: '8', stem_direction: Stem.DOWN }, + { keys: ['b/4'], duration: '8', stem_direction: Stem.DOWN }, + { keys: ['b/4'], duration: '8', stem_direction: Stem.DOWN }, + { keys: ['b/4'], duration: '8', stem_direction: Stem.DOWN }, + { keys: ['b/4'], duration: '8', stem_direction: Stem.UP }, + { keys: ['b/4'], duration: '8', stem_direction: Stem.UP }, + { keys: ['d/6'], duration: '8', stem_direction: Stem.DOWN }, + { keys: ['c/6', 'd/6'], duration: '8', stem_direction: Stem.DOWN }, + { keys: ['d/6', 'e/6'], duration: '8', stem_direction: Stem.DOWN }, + { keys: ['e/6', 'f/6'], duration: '8', stem_direction: Stem.DOWN }, + ]; + const staveNotes = notes.map((note) => new StaveNote(note)); + const beam1 = new Beam(staveNotes.slice(0, 2)); + const beam2 = new Beam(staveNotes.slice(3, 5)); + const beam3 = new Beam(staveNotes.slice(5, 7)); + const beam4 = new Beam(staveNotes.slice(7, 9)); + beam1.setStyle({ fillStyle: 'blue', strokeStyle: 'blue' }); + staveNotes[0].setKeyStyle(0, { fillStyle: 'purple' }); + staveNotes[0].setStemStyle({ strokeStyle: 'green' }); + staveNotes[1].setStemStyle({ strokeStyle: 'orange' }); + staveNotes[1].setKeyStyle(0, { fillStyle: 'darkturquoise' }); + staveNotes[5].setStyle({ fillStyle: 'tomato', strokeStyle: 'tomato' }); + beam3.setStyle({ shadowBlur: 4, shadowColor: 'blue' }); + staveNotes[9].setLedgerLineStyle({ fillStyle: 'lawngreen', strokeStyle: 'lawngreen', lineWidth: 1 }); + staveNotes[9].setFlagStyle({ fillStyle: 'orange', strokeStyle: 'orange' }); + Formatter.FormatAndDraw(ctx, stave, staveNotes, false); + beam1.setContext(ctx).draw(); + beam2.setContext(ctx).draw(); + beam3.setContext(ctx).draw(); + beam4.setContext(ctx).draw(); + ok('draw beam styles'); +} +function dotsAndFlagsStemUp(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 800, 150); + ctx.scale(1.0, 1.0); + ctx.setFillStyle('#221'); + ctx.setStrokeStyle('#221'); + const stave = new Stave(10, 10, 975); + const notes = [ + staveNote({ keys: ['f/4'], duration: '4', stem_direction: Stem.UP }), + staveNote({ keys: ['f/4'], duration: '8', stem_direction: Stem.UP }), + staveNote({ keys: ['f/4'], duration: '16', stem_direction: Stem.UP }), + staveNote({ keys: ['f/4'], duration: '32', stem_direction: Stem.UP }), + staveNote({ keys: ['f/4'], duration: '64', stem_direction: Stem.UP }), + staveNote({ keys: ['f/4'], duration: '128', stem_direction: Stem.UP }), + staveNote({ keys: ['g/4'], duration: '4', stem_direction: Stem.UP }), + staveNote({ keys: ['g/4'], duration: '8', stem_direction: Stem.UP }), + staveNote({ keys: ['g/4'], duration: '16', stem_direction: Stem.UP }), + staveNote({ keys: ['g/4'], duration: '32' }), + staveNote({ keys: ['g/4'], duration: '64', stem_direction: Stem.UP }), + staveNote({ keys: ['g/4'], duration: '128', stem_direction: Stem.UP }), + ]; + Dot.buildAndAttach(notes, { all: true }); + Dot.buildAndAttach([notes[5], notes[11]], { all: true }); + stave.setContext(ctx).draw(); + for (let i = 0; i < notes.length; ++i) { + draw(notes[i], stave, ctx, i * 65); + } + ok(true, 'Full Dot'); +} +function dotsAndFlagsStemDown(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 800, 160); + ctx.scale(1.0, 1.0); + ctx.setFillStyle('#221'); + ctx.setStrokeStyle('#221'); + const stave = new Stave(10, 10, 975); + const staveNotes = [ + staveNote({ keys: ['e/5'], duration: '4', stem_direction: Stem.DOWN }), + staveNote({ keys: ['e/5'], duration: '8', stem_direction: Stem.DOWN }), + staveNote({ keys: ['e/5'], duration: '16', stem_direction: Stem.DOWN }), + staveNote({ keys: ['e/5'], duration: '32', stem_direction: Stem.DOWN }), + staveNote({ keys: ['e/5'], duration: '64', stem_direction: Stem.DOWN }), + staveNote({ keys: ['e/5'], duration: '128', stem_direction: Stem.DOWN }), + staveNote({ keys: ['d/5'], duration: '4', stem_direction: Stem.DOWN }), + staveNote({ keys: ['d/5'], duration: '8', stem_direction: Stem.DOWN }), + staveNote({ keys: ['d/5'], duration: '16', stem_direction: Stem.DOWN }), + staveNote({ keys: ['d/5'], duration: '32', stem_direction: Stem.DOWN }), + staveNote({ keys: ['d/5'], duration: '64', stem_direction: Stem.DOWN }), + staveNote({ keys: ['d/5'], duration: '128', stem_direction: Stem.DOWN }), + ]; + Dot.buildAndAttach(staveNotes, { all: true }); + stave.setContext(ctx).draw(); + for (let i = 0; i < staveNotes.length; ++i) { + draw(staveNotes[i], stave, ctx, i * 65); + } + ok(true, 'Full Dot'); +} +function dotsAndBeamsUp(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 800, 150); + ctx.scale(1.0, 1.0); + ctx.setFillStyle('#221'); + ctx.setStrokeStyle('#221'); + const stave = new Stave(10, 10, 975); + const staveNotes = [ + staveNote({ keys: ['f/4'], duration: '8', stem_direction: Stem.UP }), + staveNote({ keys: ['f/4'], duration: '16', stem_direction: Stem.UP }), + staveNote({ keys: ['f/4'], duration: '32', stem_direction: Stem.UP }), + staveNote({ keys: ['f/4'], duration: '64', stem_direction: Stem.UP }), + staveNote({ keys: ['f/4'], duration: '128', stem_direction: Stem.UP }), + staveNote({ keys: ['g/4'], duration: '8', stem_direction: Stem.UP }), + staveNote({ keys: ['g/4'], duration: '16', stem_direction: Stem.UP }), + staveNote({ keys: ['g/4'], duration: '32' }), + staveNote({ keys: ['g/4'], duration: '64', stem_direction: Stem.UP }), + staveNote({ keys: ['g/4'], duration: '128', stem_direction: Stem.UP }), + ]; + Dot.buildAndAttach(staveNotes, { all: true }); + Dot.buildAndAttach([staveNotes[4], staveNotes[9]], { all: true }); + const beam = new Beam(staveNotes); + stave.setContext(ctx).draw(); + for (let i = 0; i < staveNotes.length; ++i) { + draw(staveNotes[i], stave, ctx, i * 65); + } + beam.setContext(ctx).draw(); + ok(true, 'Full Dot'); +} +function dotsAndBeamsDown(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 800, 160); + ctx.scale(1.0, 1.0); + ctx.setFillStyle('#221'); + ctx.setStrokeStyle('#221'); + const stave = new Stave(10, 10, 975); + const staveNotes = [ + staveNote({ keys: ['e/5'], duration: '8', stem_direction: Stem.DOWN }), + staveNote({ keys: ['e/5'], duration: '16', stem_direction: Stem.DOWN }), + staveNote({ keys: ['e/5'], duration: '32', stem_direction: Stem.DOWN }), + staveNote({ keys: ['e/5'], duration: '64', stem_direction: Stem.DOWN }), + staveNote({ keys: ['e/5'], duration: '128', stem_direction: Stem.DOWN }), + staveNote({ keys: ['d/5'], duration: '8', stem_direction: Stem.DOWN }), + staveNote({ keys: ['d/5'], duration: '16', stem_direction: Stem.DOWN }), + staveNote({ keys: ['d/5'], duration: '32', stem_direction: Stem.DOWN }), + staveNote({ keys: ['d/5'], duration: '64', stem_direction: Stem.DOWN }), + staveNote({ keys: ['d/5'], duration: '128', stem_direction: Stem.DOWN }), + ]; + Dot.buildAndAttach(staveNotes, { all: true }); + const beam = new Beam(staveNotes); + stave.setContext(ctx).draw(); + for (let i = 0; i < staveNotes.length; ++i) { + draw(staveNotes[i], stave, ctx, i * 65); + } + beam.setContext(ctx).draw(); + ok(true, 'Full Dot'); +} +function centerAlignedRest(options) { + const f = VexFlowTests.makeFactory(options, 400, 160); + const stave = f.Stave({ x: 10, y: 10, width: 350 }).addClef('treble').addTimeSignature('4/4'); + const note = f.StaveNote({ keys: ['b/4'], duration: '1r', align_center: true }); + const voice = f.Voice().setStrict(false).addTickables([note]); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true); +} +function centerAlignedRestFermata(options) { + const f = VexFlowTests.makeFactory(options, 400, 160); + const stave = f.Stave({ x: 10, y: 10, width: 350 }).addClef('treble').addTimeSignature('4/4'); + const note = f + .StaveNote({ keys: ['b/4'], duration: '1r', align_center: true }) + .addModifier(new Articulation('a@a').setPosition(3), 0); + const voice = f.Voice().setStrict(false).addTickables([note]); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true); +} +function centerAlignedRestAnnotation(options) { + const f = VexFlowTests.makeFactory(options, 400, 160); + const stave = f.Stave({ x: 10, y: 10, width: 350 }).addClef('treble').addTimeSignature('4/4'); + const note = f + .StaveNote({ keys: ['b/4'], duration: '1r', align_center: true }) + .addModifier(new Annotation('Whole measure rest').setVerticalJustification(AnnotationVerticalJustify.TOP), 0); + const voice = f.Voice().setStrict(false).addTickables([note]); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true); +} +function centerAlignedNoteMultiModifiers(options) { + const f = VexFlowTests.makeFactory(options, 400, 160); + const stave = f.Stave({ x: 10, y: 10, width: 350 }).addClef('treble').addTimeSignature('4/4'); + function newFinger(num, pos) { + return new FretHandFinger(num).setPosition(pos); + } + const note = f + .StaveNote({ keys: ['c/4', 'e/4', 'g/4'], duration: '4', align_center: true }) + .addModifier(new Annotation('Test').setPosition(3), 0) + .addStroke(0, new Stroke(2)) + .addModifier(new Accidental('#'), 1) + .addModifier(newFinger('3', Modifier.Position.LEFT), 0) + .addModifier(newFinger('2', Modifier.Position.LEFT), 2) + .addModifier(newFinger('1', Modifier.Position.RIGHT), 1) + .addModifier(new StringNumber('4').setPosition(Modifier.Position.BELOW), 2); + Dot.buildAndAttach([note], { all: true }); + const voice = f.Voice().setStrict(false).addTickables([note]); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true); +} +function centerAlignedMultiVoice(options) { + const f = VexFlowTests.makeFactory(options, 400, 160); + const stave = f.Stave({ x: 10, y: 10, width: 350 }).addClef('treble').addTimeSignature('3/8'); + const custom_duration = new Fraction(3, 8); + const notes0 = [ + f.StaveNote({ + keys: ['c/4'], + duration: '1r', + align_center: true, + duration_override: custom_duration, + }), + ]; + const createStaveNote = (struct) => f.StaveNote(struct); + const notes1 = [ + { keys: ['b/4'], duration: '8' }, + { keys: ['b/4'], duration: '8' }, + { keys: ['b/4'], duration: '8' }, + ].map(createStaveNote); + notes1[1].addModifier(f.Accidental({ type: '#' }), 0); + f.Beam({ notes: notes1 }); + const voice0 = f.Voice({ time: '3/8' }).setStrict(false).addTickables(notes0); + const voice1 = f.Voice({ time: '3/8' }).setStrict(false).addTickables(notes1); + f.Formatter().joinVoices([voice0, voice1]).formatToStave([voice0, voice1], stave); + f.draw(); + ok(true); +} +VexFlowTests.register(StaveNoteTests); +export { StaveNoteTests }; diff --git a/build/esm/tests/stavetie_tests.js b/build/esm/tests/stavetie_tests.js new file mode 100644 index 0000000000..aacc43c620 --- /dev/null +++ b/build/esm/tests/stavetie_tests.js @@ -0,0 +1,108 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Stem } from '../src/stem.js'; +const StaveTieTests = { + Start() { + QUnit.module('StaveTie'); + const run = VexFlowTests.runTests; + run('Simple StaveTie', simple); + run('Chord StaveTie', chord); + run('Stem Up StaveTie', stemUp); + run('No End Note With Clef', noEndNote1); + run('No End Note', noEndNote2); + run('No Start Note With Clef', noStartNote1); + run('No Start Note', noStartNote2); + run('Set Direction Down', setDirectionDown); + run('Set Direction Up', setDirectionUp); + }, +}; +function createTest(notesData, setupTies) { + return (options) => { + const factory = VexFlowTests.makeFactory(options, 300); + const stave = factory.Stave(); + const score = factory.EasyScore(); + const notes = score.notes(notesData[0], notesData[1]); + const voice = score.voice(notes); + setupTies(factory, notes, stave); + factory.Formatter().joinVoices([voice]).formatToStave([voice], stave); + factory.draw(); + ok(true); + }; +} +const simple = createTest(['(cb4 e#4 a4)/2, (d4 e4 f4)', { stem: 'down' }], (f, notes) => { + f.StaveTie({ + from: notes[0], + to: notes[1], + first_indices: [0, 1], + last_indices: [0, 1], + }); +}); +const chord = createTest(['(d4 e4 f4)/2, (cn4 f#4 a4)', { stem: 'down' }], (f, notes) => { + f.StaveTie({ + from: notes[0], + to: notes[1], + first_indices: [0, 1, 2], + last_indices: [0, 1, 2], + }); +}); +const stemUp = createTest(['(d4 e4 f4)/2, (cn4 f#4 a4)', { stem: 'up' }], (f, notes) => { + f.StaveTie({ + from: notes[0], + to: notes[1], + first_indices: [0, 1, 2], + last_indices: [0, 1, 2], + }); +}); +const noEndNote1 = createTest(['(cb4 e#4 a4)/2, (d4 e4 f4)', { stem: 'down' }], (f, notes, stave) => { + stave.addEndClef('treble'); + f.StaveTie({ + from: notes[1], + first_indices: [2], + last_indices: [2], + text: 'slow.', + }); +}); +const noEndNote2 = createTest(['(cb4 e#4 a4)/2, (d4 e4 f4)', { stem: 'down' }], (f, notes) => { + f.StaveTie({ + from: notes[1], + first_indices: [2], + last_indices: [2], + text: 'slow.', + }); +}); +const noStartNote1 = createTest(['(cb4 e#4 a4)/2, (d4 e4 f4)', { stem: 'down' }], (f, notes, stave) => { + stave.addClef('treble'); + f.StaveTie({ + to: notes[0], + first_indices: [2], + last_indices: [2], + text: 'H', + }); +}); +const noStartNote2 = createTest(['(cb4 e#4 a4)/2, (d4 e4 f4)', { stem: 'down' }], (f, notes) => { + f.StaveTie({ + to: notes[0], + first_indices: [2], + last_indices: [2], + text: 'H', + }); +}); +const setDirectionDown = createTest(['(cb4 e#4 a4)/2, (d4 e4 f4)', { stem: 'down' }], (f, notes) => { + f.StaveTie({ + from: notes[0], + to: notes[1], + first_indices: [0, 1], + last_indices: [0, 1], + options: { direction: Stem.DOWN }, + }); +}); +const setDirectionUp = createTest(['(cb4 e#4 a4)/2, (d4 e4 f4)', { stem: 'down' }], (f, notes) => { + f.StaveTie({ + from: notes[0], + to: notes[1], + first_indices: [0, 1], + last_indices: [0, 1], + options: { direction: Stem.UP }, + }); +}); +VexFlowTests.register(StaveTieTests); +export { StaveTieTests }; diff --git a/build/esm/tests/stringnumber_tests.js b/build/esm/tests/stringnumber_tests.js new file mode 100644 index 0000000000..11dbbf7bde --- /dev/null +++ b/build/esm/tests/stringnumber_tests.js @@ -0,0 +1,259 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Glyph } from '../src/glyph.js'; +import { Renderer } from '../src/renderer.js'; +import { Stave } from '../src/stave.js'; +import { BarlineType } from '../src/stavebarline.js'; +import { Stroke } from '../src/strokes.js'; +const StringNumberTests = { + Start() { + QUnit.module('StringNumber'); + const run = VexFlowTests.runTests; + run('String Number In Notation', drawMultipleMeasures); + run('Fret Hand Finger In Notation', drawFretHandFingers); + run('Multi Voice With Strokes, String & Finger Numbers', multi); + run('Complex Measure With String & Finger Numbers', drawAccidentals); + }, +}; +function drawMultipleMeasures(options) { + const f = VexFlowTests.makeFactory(options, 775, 200); + const score = f.EasyScore(); + const stave1 = f.Stave({ width: 300 }).setEndBarType(BarlineType.DOUBLE).addClef('treble'); + const notes1 = score.notes('(c4 e4 g4)/4., (c5 e5 g5)/8, (c4 f4 g4)/4, (c4 f4 g4)/4', { stem: 'down' }); + notes1[0] + .addModifier(f.StringNumber({ number: '5', position: 'right' }), 0) + .addModifier(f.StringNumber({ number: '4', position: 'left' }), 1) + .addModifier(f.StringNumber({ number: '3', position: 'right' }), 2); + notes1[1] + .addModifier(f.Accidental({ type: '#' }), 0) + .addModifier(f.StringNumber({ number: '5', position: 'below' }), 0) + .addModifier(f.Accidental({ type: '#' }).setAsCautionary(), 1) + .addModifier(f + .StringNumber({ number: '3', position: 'above' }) + .setLastNote(notes1[3]) + .setLineEndType(Renderer.LineEndType.DOWN), 2); + notes1[2] + .addModifier(f.StringNumber({ number: '5', position: 'left' }), 0) + .addModifier(f.StringNumber({ number: '3', position: 'left' }), 2) + .addModifier(f.Accidental({ type: '#' }), 1); + notes1[3] + .addModifier(f.StringNumber({ number: '5', position: 'right' }).setOffsetY(7), 0) + .addModifier(f.StringNumber({ number: '4', position: 'right' }).setOffsetY(6), 1) + .addModifier(f.StringNumber({ number: '3', position: 'right' }).setOffsetY(-6), 2); + const voice1 = score.voice(notes1); + f.Formatter().joinVoices([voice1]).formatToStave([voice1], stave1); + const stave2 = f + .Stave({ x: stave1.getWidth() + stave1.getX(), y: stave1.getY(), width: 300 }) + .setEndBarType(BarlineType.DOUBLE); + const notes2 = score.notes('(c4 e4 g4)/4, (c5 e5 g5), (c4 f4 g4), (c4 f4 g4)', { stem: 'up' }); + notes2[0] + .addModifier(f.StringNumber({ number: '5', position: 'right' }), 0) + .addModifier(f.StringNumber({ number: '4', position: 'left' }), 1) + .addModifier(f.StringNumber({ number: '3', position: 'right' }), 2); + notes2[1] + .addModifier(f.Accidental({ type: '#' }), 0) + .addModifier(f.StringNumber({ number: '5', position: 'below' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1) + .addModifier(f.StringNumber({ number: '3', position: 'above' }).setLastNote(notes2[3]).setDashed(false), 2); + notes2[2] + .addModifier(f.StringNumber({ number: '3', position: 'left' }), 2) + .addModifier(f.Accidental({ type: '#' }), 1); + notes2[3] + .addModifier(f.StringNumber({ number: '5', position: 'right' }).setOffsetY(7), 0) + .addModifier(f.StringNumber({ number: '4', position: 'right' }).setOffsetY(6), 1) + .addModifier(f.StringNumber({ number: '3', position: 'right' }).setOffsetY(-6), 2); + const voice2 = score.voice(notes2); + f.Formatter().joinVoices([voice2]).formatToStave([voice2], stave2); + const stave3 = f + .Stave({ x: stave2.getWidth() + stave2.getX(), y: stave2.getY(), width: 150 }) + .setEndBarType(BarlineType.END); + const notesBar3 = score.notes('(c4 e4 g4 a4)/1.'); + notesBar3[0] + .addModifier(f.StringNumber({ number: '5', position: 'below' }), 0) + .addModifier(f.StringNumber({ number: '4', position: 'right' }), 1) + .addModifier(f.StringNumber({ number: '3', position: 'left' }), 2) + .addModifier(f.StringNumber({ number: '2', position: 'above' }), 3); + const voice3 = score.voice(notesBar3, { time: '6/4' }); + f.Formatter().joinVoices([voice3]).formatToStave([voice3], stave3); + f.draw(); + ok(true, 'String Number'); +} +function drawFretHandFingers(options) { + const f = VexFlowTests.makeFactory(options, 725, 200); + const score = f.EasyScore(); + const stave1 = f.Stave({ width: 350 }).setEndBarType(BarlineType.DOUBLE).addClef('treble'); + const notes1 = score.notes('(c4 e4 g4)/4, (c5 e5 g5), (c4 f4 g4), (c4 f4 g4)', { stem: 'down' }); + notes1[0] + .addModifier(f.Fingering({ number: '3', position: 'left' }), 0) + .addModifier(f.Fingering({ number: '2', position: 'left' }), 1) + .addModifier(f.Fingering({ number: '0', position: 'left' }), 2); + notes1[1] + .addModifier(f.Accidental({ type: '#' }), 0) + .addModifier(f.Fingering({ number: '3', position: 'left' }), 0) + .addModifier(f.Fingering({ number: '2', position: 'left' }), 1) + .addModifier(f.Accidental({ type: '#' }), 1) + .addModifier(f.Fingering({ number: '0', position: 'left' }), 2); + notes1[2] + .addModifier(f.Fingering({ number: '3', position: 'below' }), 0) + .addModifier(f.Fingering({ number: '4', position: 'left' }), 1) + .addModifier(f.StringNumber({ number: '4', position: 'left' }), 1) + .addModifier(f.Fingering({ number: '0', position: 'above' }), 2) + .addModifier(f.Accidental({ type: '#' }), 1); + notes1[3] + .addModifier(f.Fingering({ number: '3', position: 'right' }), 0) + .addModifier(f.StringNumber({ number: '5', position: 'right' }).setOffsetY(7), 0) + .addModifier(f.Fingering({ number: '4', position: 'right' }), 1) + .addModifier(f.StringNumber({ number: '4', position: 'right' }).setOffsetY(6), 1) + .addModifier(f.Fingering({ number: '0', position: 'right' }).setOffsetY(-5), 2) + .addModifier(f.StringNumber({ number: '3', position: 'right' }).setOffsetY(-6), 2); + const voice1 = score.voice(notes1); + f.Formatter().joinVoices([voice1]).formatToStave([voice1], stave1); + const stave2 = f + .Stave({ x: stave1.getWidth() + stave1.getX(), y: stave1.getY(), width: 350 }) + .setEndBarType(BarlineType.END); + const notes2 = score.notes('(c4 e4 g4)/4., (c5 e5 g5)/8, (c4 f4 g4)/8, (c4 f4 g4)/4.[stem="down"]', { + stem: 'up', + }); + notes2[0] + .addModifier(f.Fingering({ number: '3', position: 'right' }), 0) + .addModifier(f.Fingering({ number: '2', position: 'left' }), 1) + .addModifier(f.StringNumber({ number: '4', position: 'right' }), 1) + .addModifier(f.Fingering({ number: '0', position: 'above' }), 2); + notes2[1] + .addModifier(f.Accidental({ type: '#' }), 0) + .addModifier(f.Fingering({ number: '3', position: 'right' }), 0) + .addModifier(f.Fingering({ number: '2', position: 'left' }), 1) + .addModifier(f.Accidental({ type: '#' }), 1) + .addModifier(f.Fingering({ number: '0', position: 'left' }), 2); + notes2[2] + .addModifier(f.Fingering({ number: '3', position: 'below' }), 0) + .addModifier(f.Fingering({ number: '2', position: 'left' }), 1) + .addModifier(f.StringNumber({ number: '4', position: 'left' }), 1) + .addModifier(f.Fingering({ number: '1', position: 'right' }), 2) + .addModifier(f.Accidental({ type: '#' }), 2); + notes2[3] + .addModifier(f.Fingering({ number: '3', position: 'right' }), 0) + .addModifier(f.StringNumber({ number: '5', position: 'right' }).setOffsetY(7), 0) + .addModifier(f.Fingering({ number: '4', position: 'right' }), 1) + .addModifier(f.StringNumber({ number: '4', position: 'right' }).setOffsetY(6), 1) + .addModifier(f.Fingering({ number: '1', position: 'right' }).setOffsetY(-6), 2) + .addModifier(f.StringNumber({ number: '3', position: 'right' }).setOffsetY(-6), 2); + const voice2 = score.voice(notes2); + f.Formatter().joinVoices([voice2]).formatToStave([voice2], stave2); + f.draw(); + ok(true, 'String Number'); +} +function multi(options) { + const f = VexFlowTests.makeFactory(options, 700, 200); + const score = f.EasyScore(); + const stave = f.Stave(); + const notes1 = score.notes('(c4 e4 g4)/4, (a3 e4 g4), (c4 d4 a4), (c4 d4 a4)', { stem: 'up' }); + notes1[0] + .addStroke(0, new Stroke(5)) + .addModifier(f.Fingering({ number: '3', position: 'left' }), 0) + .addModifier(f.Fingering({ number: '2', position: 'left' }), 1) + .addModifier(f.Fingering({ number: '0', position: 'left' }), 2) + .addModifier(f.StringNumber({ number: '4', position: 'left' }), 1) + .addModifier(f.StringNumber({ number: '3', position: 'above' }), 2); + notes1[1] + .addStroke(0, new Stroke(6)) + .addModifier(f.StringNumber({ number: '4', position: 'right' }), 1) + .addModifier(f.StringNumber({ number: '3', position: 'above' }), 2) + .addModifier(f.Accidental({ type: '#' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1) + .addModifier(f.Accidental({ type: '#' }), 2); + notes1[2] + .addStroke(0, new Stroke(2)) + .addModifier(f.Fingering({ number: '3', position: 'left' }), 0) + .addModifier(f.Fingering({ number: '0', position: 'right' }), 1) + .addModifier(f.StringNumber({ number: '4', position: 'right' }), 1) + .addModifier(f.Fingering({ number: '1', position: 'left' }), 2) + .addModifier(f.StringNumber({ number: '3', position: 'right' }), 2); + notes1[3] + .addStroke(0, new Stroke(1)) + .addModifier(f.StringNumber({ number: '3', position: 'left' }), 2) + .addModifier(f.StringNumber({ number: '4', position: 'right' }), 1); + const notes2 = score.notes('e3/8, e3, e3, e3, e3, e3, e3, e3', { stem: 'down' }); + notes2[0] + .addModifier(f.Fingering({ number: '0', position: 'left' }), 0) + .addModifier(f.StringNumber({ number: '6', position: 'below' }), 0); + notes2[2].addModifier(f.Accidental({ type: '#' }), 0); + notes2[4].addModifier(f.Fingering({ number: '0', position: 'left' }), 0); + notes2[4].addModifier(f.StringNumber({ number: '6', position: 'left' }).setOffsetX(15).setOffsetY(18), 0); + const voices = [score.voice(notes2), score.voice(notes1)]; + f.Formatter().joinVoices(voices).formatToStave(voices, stave); + f.Beam({ notes: notes2.slice(0, 4) }); + f.Beam({ notes: notes2.slice(4, 8) }); + f.draw(); + ok(true, 'Strokes Test Multi Voice'); +} +function drawAccidentals(options) { + const f = VexFlowTests.makeFactory(options, 750); + const glyphScale = 39; + const clefWidth = Glyph.getWidth('gClef', glyphScale); + const notes = [ + f.StaveNote({ keys: ['c/4', 'e/4', 'g/4', 'c/5', 'e/5', 'g/5'], stem_direction: 1, duration: '4' }), + f.StaveNote({ keys: ['c/4', 'e/4', 'g/4', 'd/5', 'e/5', 'g/5'], stem_direction: 1, duration: '4' }), + f.StaveNote({ keys: ['c/4', 'e/4', 'g/4', 'd/5', 'e/5', 'g/5'], stem_direction: -1, duration: '4' }), + f.StaveNote({ keys: ['c/4', 'e/4', 'g/4', 'd/5', 'e/5', 'g/5'], stem_direction: -1, duration: '4' }), + ]; + notes[0] + .addModifier(f.Fingering({ number: '3', position: 'left' }), 0) + .addModifier(f.Accidental({ type: '#' }), 0) + .addModifier(f.Fingering({ number: '2', position: 'left' }), 1) + .addModifier(f.StringNumber({ number: '2', position: 'left' }), 1) + .addModifier(f.Accidental({ type: '#' }), 1) + .addModifier(f.Fingering({ number: '0', position: 'left' }), 2) + .addModifier(f.Accidental({ type: '#' }), 2) + .addModifier(f.Fingering({ number: '3', position: 'left' }), 3) + .addModifier(f.Accidental({ type: '#' }), 3) + .addModifier(f.Fingering({ number: '2', position: 'right' }), 4) + .addModifier(f.StringNumber({ number: '3', position: 'right' }), 4) + .addModifier(f.Accidental({ type: '#' }), 4) + .addModifier(f.Fingering({ number: '0', position: 'left' }), 5) + .addModifier(f.Accidental({ type: '#' }), 5); + notes[1] + .addModifier(f.Accidental({ type: '#' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1) + .addModifier(f.Accidental({ type: '#' }), 2) + .addModifier(f.Accidental({ type: '#' }), 3) + .addModifier(f.Accidental({ type: '#' }), 4) + .addModifier(f.Accidental({ type: '#' }), 5); + notes[2] + .addModifier(f.Fingering({ number: '3', position: 'left' }), 0) + .addModifier(f.Accidental({ type: '#' }), 0) + .addModifier(f.Fingering({ number: '2', position: 'left' }), 1) + .addModifier(f.StringNumber({ number: '2', position: 'left' }), 1) + .addModifier(f.Accidental({ type: '#' }), 1) + .addModifier(f.Fingering({ number: '0', position: 'left' }), 2) + .addModifier(f.Accidental({ type: '#' }), 2) + .addModifier(f.Fingering({ number: '3', position: 'left' }), 3) + .addModifier(f.Accidental({ type: '#' }), 3) + .addModifier(f.Fingering({ number: '2', position: 'right' }), 4) + .addModifier(f.StringNumber({ number: '3', position: 'right' }), 4) + .addModifier(f.Accidental({ type: '#' }), 4) + .addModifier(f.Fingering({ number: '0', position: 'left' }), 5) + .addModifier(f.Accidental({ type: '#' }), 5); + notes[3] + .addModifier(f.Accidental({ type: '#' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1) + .addModifier(f.Accidental({ type: '#' }), 2) + .addModifier(f.Accidental({ type: '#' }), 3) + .addModifier(f.Accidental({ type: '#' }), 4) + .addModifier(f.Accidental({ type: '#' }), 5); + const voice = f.Voice().addTickables(notes); + const ctx = f.getContext(); + const formatter = f.Formatter().joinVoices([voice]); + const stavePadding = clefWidth + Stave.defaultPadding + 10; + const nwidth = Math.max(formatter.preCalculateMinTotalWidth([voice]), 490 - stavePadding); + formatter.format([voice], nwidth); + const stave = f + .Stave({ x: 0, y: 0, width: nwidth + stavePadding }) + .setContext(ctx) + .setEndBarType(BarlineType.DOUBLE) + .addClef('treble') + .draw(); + voice.draw(ctx, stave); + ok(true, 'String Number'); +} +VexFlowTests.register(StringNumberTests); +export { StringNumberTests }; diff --git a/build/esm/tests/strokes_tests.js b/build/esm/tests/strokes_tests.js new file mode 100644 index 0000000000..1a84f75a76 --- /dev/null +++ b/build/esm/tests/strokes_tests.js @@ -0,0 +1,275 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Barline, Beam, Bend, Stroke } from '../src/index.js'; +const StrokesTests = { + Start() { + QUnit.module('Strokes'); + const run = VexFlowTests.runTests; + run('Strokes - Brush/Roll/Rasquedo', brushRollRasquedo); + run('Strokes - Arpeggio directionless (without arrows)', arpeggioDirectionless); + run('Strokes - Multi Voice', multiVoice); + run('Strokes - Notation and Tab', notesWithTab); + run('Strokes - Multi-Voice Notation and Tab', multiNotationAndTab); + }, +}; +function brushRollRasquedo(options) { + const f = VexFlowTests.makeFactory(options, 600, 200); + const score = f.EasyScore(); + const stave1 = f.Stave({ width: 250 }).setEndBarType(Barline.type.DOUBLE); + const notes1 = score.notes('(a3 e4 a4)/4, (c4 e4 g4), (c4 e4 g4), (c4 e4 g4)', { stem: 'up' }); + notes1[0].addStroke(0, new Stroke(1)); + notes1[1] + .addStroke(0, new Stroke(2)) + .addModifier(f.Accidental({ type: '#' }), 1) + .addModifier(f.Accidental({ type: '#' }), 2) + .addModifier(f.Accidental({ type: '#' }), 0); + notes1[2].addStroke(0, new Stroke(1)); + notes1[3].addStroke(0, new Stroke(2)); + const voice1 = score.voice(notes1); + f.Formatter().joinVoices([voice1]).formatToStave([voice1], stave1); + const stave2 = f + .Stave({ x: stave1.getWidth() + stave1.getX(), y: stave1.getY(), width: 300 }) + .setEndBarType(Barline.type.DOUBLE); + const notes2 = score.notes('(c4 d4 g4)/4, (c4 d4 g4), (c4 d4 g4), (c4 d4 a4)', { stem: 'up' }); + notes2[0].addStroke(0, new Stroke(3)); + notes2[1].addStroke(0, new Stroke(4)); + notes2[2].addStroke(0, new Stroke(5)); + notes2[3] + .addStroke(0, new Stroke(6)) + .addModifier(f.Accidental({ type: 'bb' }), 0) + .addModifier(f.Accidental({ type: 'bb' }), 1) + .addModifier(f.Accidental({ type: 'bb' }), 2); + const voice2 = score.voice(notes2); + f.Formatter().joinVoices([voice2]).formatToStave([voice2], stave2); + f.draw(); + ok(true, 'Brush/Roll/Rasquedo'); +} +function arpeggioDirectionless(options) { + const f = VexFlowTests.makeFactory(options, 700, 200); + const score = f.EasyScore(); + const stave1 = f.Stave({ x: 100, width: 500 }).setEndBarType(Barline.type.DOUBLE); + const notes1 = score.notes('(g4 b4 d5)/4, (g4 b4 d5 g5), (g4 b4 d5 g5), (g4 b4 d5)', { stem: 'up' }); + const graceNoteStructs = [ + { keys: ['e/4'], duration: '32' }, + { keys: ['f/4'], duration: '32' }, + { keys: ['g/4'], duration: '32' }, + ]; + const graceNotes = graceNoteStructs.map((graceNoteStruct) => f.GraceNote(graceNoteStruct)); + const graceNoteGroup = f.GraceNoteGroup({ notes: graceNotes, slur: false }); + graceNoteGroup.beamNotes(); + notes1[0].addStroke(0, new Stroke(7)); + notes1[1] + .addStroke(0, new Stroke(7)) + .addModifier(f.Accidental({ type: '#' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1) + .addModifier(f.Accidental({ type: '#' }), 2) + .addModifier(f.Accidental({ type: '#' }), 3); + notes1[2] + .addStroke(0, new Stroke(7)) + .addModifier(f.Accidental({ type: 'b' }), 1) + .addModifier(graceNoteGroup, 0); + notes1[3].addStroke(0, new Stroke(7)).addModifier(f.NoteSubGroup({ + notes: [f.ClefNote({ type: 'treble', options: { size: 'default', annotation: '8va' } })], + }), 0); + const voice1 = score.voice(notes1); + f.Formatter().joinVoices([voice1]).formatToStave([voice1], stave1); + f.draw(); + ok(true, 'Arpeggio directionless (without arrows)'); +} +function multiVoice(options) { + const f = VexFlowTests.makeFactory(options, 500, 200); + const score = f.EasyScore(); + const stave = f.Stave(); + const notes1 = score.notes('(c4 e4 g4)/4, (c4 e4 g4), (c4 d4 a4), (c4 d4 a4)', { stem: 'up' }); + notes1[0].addStroke(0, new Stroke(5)); + notes1[1] + .addStroke(0, new Stroke(6)) + .addModifier(f.Accidental({ type: '#' }), 0) + .addModifier(f.Accidental({ type: '#' }), 2); + notes1[2].addStroke(0, new Stroke(2)); + notes1[3].addStroke(0, new Stroke(1)); + const notes2 = score.notes('e3/8, e3, e3, e3, e3, e3, e3, e3', { stem: 'down' }); + f.Beam({ notes: notes2.slice(0, 4) }); + f.Beam({ notes: notes2.slice(4, 8) }); + const voices = [notes1, notes2].map((notes) => score.voice(notes)); + f.Formatter().joinVoices(voices).formatToStave(voices, stave); + f.draw(); + ok(true, 'Strokes Test Multi Voice'); +} +function multiNotationAndTab(options) { + const f = VexFlowTests.makeFactory(options, 400, 275); + const score = f.EasyScore(); + const stave = f.Stave().addClef('treble'); + const notes1 = score.notes('(g4 b4 e5)/4, (g4 b4 e5), (g4 b4 e5), (g4 b4 e5)', { stem: 'up' }); + notes1[0].addStroke(0, new Stroke(3, { all_voices: false })); + notes1[1].addStroke(0, new Stroke(6)); + notes1[2].addStroke(0, new Stroke(2, { all_voices: false })); + notes1[3].addStroke(0, new Stroke(1)); + const notes2 = score.notes('g3/4, g3, g3, g3', { stem: 'down' }); + f.TabStave({ y: 100 }).addClef('tab').setNoteStartX(stave.getNoteStartX()); + const tabNotes1 = [ + f.TabNote({ + positions: [ + { str: 3, fret: 0 }, + { str: 2, fret: 0 }, + { str: 1, fret: 1 }, + ], + duration: '4', + }), + f.TabNote({ + positions: [ + { str: 3, fret: 0 }, + { str: 2, fret: 0 }, + { str: 1, fret: 1 }, + ], + duration: '4', + }), + f.TabNote({ + positions: [ + { str: 3, fret: 0 }, + { str: 2, fret: 0 }, + { str: 1, fret: 1 }, + ], + duration: '4', + }), + f.TabNote({ + positions: [ + { str: 3, fret: 0 }, + { str: 2, fret: 0 }, + { str: 1, fret: 1 }, + ], + duration: '4', + }), + ]; + tabNotes1[0].addStroke(0, new Stroke(3, { all_voices: false })); + tabNotes1[1].addStroke(0, new Stroke(6)); + tabNotes1[2].addStroke(0, new Stroke(2, { all_voices: false })); + tabNotes1[3].addStroke(0, new Stroke(1)); + const tabNotes2 = [ + f.TabNote({ positions: [{ str: 6, fret: 3 }], duration: '4' }), + f.TabNote({ positions: [{ str: 6, fret: 3 }], duration: '4' }), + f.TabNote({ positions: [{ str: 6, fret: 3 }], duration: '4' }), + f.TabNote({ positions: [{ str: 6, fret: 3 }], duration: '4' }), + ]; + const voices = [notes1, notes2, tabNotes1, tabNotes2].map((notes) => score.voice(notes)); + f.Formatter().joinVoices(voices).formatToStave(voices, stave); + f.draw(); + ok(true, 'Strokes Test Notation & Tab Multi Voice'); +} +function notesWithTab(options) { + const f = VexFlowTests.makeFactory(options, 500, 300); + const stave = f.Stave({ x: 15, y: 40, width: 450 }).addClef('treble'); + const notes = [ + f + .StaveNote({ keys: ['b/4', 'd/5', 'g/5'], stem_direction: -1, duration: '4' }) + .addModifier(f.Accidental({ type: 'b' }), 1) + .addModifier(f.Accidental({ type: 'b' }), 0), + f.StaveNote({ keys: ['c/5', 'd/5'], stem_direction: -1, duration: '4' }), + f.StaveNote({ keys: ['b/3', 'e/4', 'a/4', 'd/5'], stem_direction: 1, duration: '8' }), + f + .StaveNote({ keys: ['a/3', 'e/4', 'a/4', 'c/5', 'e/5', 'a/5'], stem_direction: 1, duration: '8' }) + .addModifier(f.Accidental({ type: '#' }), 3), + f.StaveNote({ keys: ['b/3', 'e/4', 'a/4', 'd/5'], stem_direction: 1, duration: '8' }), + f + .StaveNote({ keys: ['a/3', 'e/4', 'a/4', 'c/5', 'f/5', 'a/5'], stem_direction: 1, duration: '8' }) + .addModifier(f.Accidental({ type: '#' }), 3) + .addModifier(f.Accidental({ type: '#' }), 4), + ]; + const tabstave = f + .TabStave({ x: stave.getX(), y: 140, width: 450 }) + .addClef('tab') + .setNoteStartX(stave.getNoteStartX()); + const tabNotes = [ + f + .TabNote({ + positions: [ + { str: 1, fret: 3 }, + { str: 2, fret: 2 }, + { str: 3, fret: 3 }, + ], + duration: '4', + }) + .addModifier(new Bend('Full'), 0), + f + .TabNote({ + positions: [ + { str: 2, fret: 3 }, + { str: 3, fret: 5 }, + ], + duration: '4', + }) + .addModifier(new Bend('Unison'), 1), + f.TabNote({ + positions: [ + { str: 3, fret: 7 }, + { str: 4, fret: 7 }, + { str: 5, fret: 7 }, + { str: 6, fret: 7 }, + ], + duration: '8', + }), + f.TabNote({ + positions: [ + { str: 1, fret: 5 }, + { str: 2, fret: 5 }, + { str: 3, fret: 6 }, + { str: 4, fret: 7 }, + { str: 5, fret: 7 }, + { str: 6, fret: 5 }, + ], + duration: '8', + }), + f.TabNote({ + positions: [ + { str: 3, fret: 7 }, + { str: 4, fret: 7 }, + { str: 5, fret: 7 }, + { str: 6, fret: 7 }, + ], + duration: '8', + }), + f.TabNote({ + positions: [ + { str: 1, fret: 5 }, + { str: 2, fret: 5 }, + { str: 3, fret: 6 }, + { str: 4, fret: 7 }, + { str: 5, fret: 7 }, + { str: 6, fret: 5 }, + ], + duration: '8', + }), + ]; + notes[0].addStroke(0, new Stroke(1)); + notes[1].addStroke(0, new Stroke(2)); + notes[2].addStroke(0, new Stroke(3)); + notes[3].addStroke(0, new Stroke(4)); + notes[4].addStroke(0, new Stroke(5)); + notes[5].addStroke(0, new Stroke(6)); + tabNotes[0].addStroke(0, new Stroke(1)); + tabNotes[1].addStroke(0, new Stroke(2)); + tabNotes[2].addStroke(0, new Stroke(3)); + tabNotes[3].addStroke(0, new Stroke(4)); + tabNotes[4].addStroke(0, new Stroke(5)); + tabNotes[5].addStroke(0, new Stroke(6)); + f.StaveConnector({ + top_stave: stave, + bottom_stave: tabstave, + type: 'bracket', + }); + f.StaveConnector({ + top_stave: stave, + bottom_stave: tabstave, + type: 'single', + }); + const voice = f.Voice().addTickables(notes); + const tabVoice = f.Voice().addTickables(tabNotes); + const beams = Beam.applyAndGetBeams(voice); + f.Formatter().joinVoices([voice]).joinVoices([tabVoice]).formatToStave([voice, tabVoice], stave); + f.draw(); + beams.forEach(function (beam) { + beam.setContext(f.getContext()).draw(); + }); + ok(true); +} +VexFlowTests.register(StrokesTests); +export { StrokesTests }; diff --git a/build/esm/tests/style_tests.js b/build/esm/tests/style_tests.js new file mode 100644 index 0000000000..f32fb870c6 --- /dev/null +++ b/build/esm/tests/style_tests.js @@ -0,0 +1,98 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Annotation } from '../src/annotation.js'; +import { Articulation } from '../src/articulation.js'; +import { Bend } from '../src/bend.js'; +import { Formatter } from '../src/formatter.js'; +import { KeySignature } from '../src/keysignature.js'; +import { NoteSubGroup } from '../src/notesubgroup.js'; +import { Ornament } from '../src/ornament.js'; +import { StaveModifierPosition } from '../src/stavemodifier.js'; +import { Stroke } from '../src/strokes.js'; +import { TabNote } from '../src/tabnote.js'; +import { TabStave } from '../src/tabstave.js'; +import { TimeSignature } from '../src/timesignature.js'; +const StyleTests = { + Start() { + QUnit.module('Style'); + const run = VexFlowTests.runTests; + run('Basic Style', stave); + run('TabNote modifiers Style', tab); + }, +}; +function FS(fillStyle, strokeStyle) { + const ret = { fillStyle }; + if (strokeStyle) { + ret.strokeStyle = strokeStyle; + } + return ret; +} +function stave(options) { + const f = VexFlowTests.makeFactory(options, 600, 150); + const stave = f.Stave({ x: 25, y: 20, width: 500 }); + const keySig = new KeySignature('D'); + keySig.addToStave(stave); + keySig.setStyle(FS('blue')); + stave.addTimeSignature('4/4'); + const timeSig = stave.getModifiers(StaveModifierPosition.BEGIN, TimeSignature.CATEGORY); + timeSig[0].setStyle(FS('brown')); + const notes = [ + f + .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], stem_direction: 1, duration: '4' }) + .addModifier(f.Accidental({ type: 'b' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1), + f + .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], stem_direction: 1, duration: '4' }) + .addModifier(f.Accidental({ type: 'b' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1), + f.StaveNote({ keys: ['e/4'], stem_direction: 1, duration: '4' }), + f.StaveNote({ keys: ['f/4'], stem_direction: 1, duration: '8' }), + f.TextDynamics({ text: 'sfz', duration: '16' }).setStyle(FS('blue')), + f.GhostNote({ duration: '16' }).addModifier(new Annotation('GhostNote green text').setStyle(FS('green')), 0), + ]; + const notes0 = notes[0]; + const notes1 = notes[1]; + notes0.setKeyStyle(0, FS('red')); + notes1.setKeyStyle(0, FS('red')); + const mods1 = notes1.getModifiers(); + mods1[0].setStyle(FS('green')); + notes0.addModifier(new Articulation('a.').setPosition(4).setStyle(FS('green')), 0); + notes0.addModifier(new Ornament('mordent').setStyle(FS('lightgreen')), 0); + notes1.addModifier(new Annotation('blue').setStyle(FS('blue')), 0); + notes1.addModifier(new NoteSubGroup([f.ClefNote({ options: { size: 'small' } }).setStyle(FS('blue'))]), 0); + const voice = f.Voice().addTickables(notes); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Basic Style'); +} +function tab(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 500, 140); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + ctx.font = '10pt Arial'; + const stave = new TabStave(10, 10, 450).addTabGlyph(); + stave.getModifiers()[2].setStyle(FS('blue')); + stave.setContext(ctx).draw(); + const tabNote = (noteStruct) => new TabNote(noteStruct); + const notes = [ + tabNote({ + positions: [ + { str: 2, fret: 10 }, + { str: 4, fret: 9 }, + ], + duration: 'h', + }).addModifier(new Annotation('green text').setStyle(FS('green')), 0), + tabNote({ + positions: [ + { str: 2, fret: 10 }, + { str: 4, fret: 9 }, + ], + duration: 'h', + }) + .addModifier(new Bend('Full').setStyle(FS('brown')), 0) + .addStroke(0, new Stroke(1, { all_voices: false }).setStyle(FS('blue'))), + ]; + Formatter.FormatAndDraw(ctx, stave, notes); + ok(true, 'TabNote Modifiers Style'); +} +VexFlowTests.register(StyleTests); +export { StyleTests }; diff --git a/build/esm/tests/support/qunit.js b/build/esm/tests/support/qunit.js new file mode 100644 index 0000000000..f3104a009e --- /dev/null +++ b/build/esm/tests/support/qunit.js @@ -0,0 +1,2765 @@ +"use strict"; +/*! + * QUnit 1.19.0 + * http://qunitjs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2015-09-01T15:00Z + */ +(function (global) { + var QUnit = {}; + var Date = global.Date; + var now = Date.now || + function () { + return new Date().getTime(); + }; + var setTimeout = global.setTimeout; + var clearTimeout = global.clearTimeout; + var window = global.window; + var defined = { + document: window && window.document !== undefined, + setTimeout: setTimeout !== undefined, + sessionStorage: (function () { + var x = 'qunit-test-string'; + try { + sessionStorage.setItem(x, x); + sessionStorage.removeItem(x); + return true; + } + catch (e) { + return false; + } + })(), + }; + var fileName = (sourceFromStacktrace(0) || '').replace(/(:\d+)+\)?/, '').replace(/.+\//, ''); + var globalStartCalled = false; + var runStarted = false; + var toString = Object.prototype.toString, hasOwn = Object.prototype.hasOwnProperty; + function diff(a, b) { + var i, j, result = a.slice(); + for (i = 0; i < result.length; i++) { + for (j = 0; j < b.length; j++) { + if (result[i] === b[j]) { + result.splice(i, 1); + i--; + break; + } + } + } + return result; + } + function inArray(elem, array) { + if (array.indexOf) { + return array.indexOf(elem); + } + for (var i = 0, length = array.length; i < length; i++) { + if (array[i] === elem) { + return i; + } + } + return -1; + } + function objectValues(obj) { + var key, val, vals = QUnit.is('array', obj) ? [] : {}; + for (key in obj) { + if (hasOwn.call(obj, key)) { + val = obj[key]; + vals[key] = val === Object(val) ? objectValues(val) : val; + } + } + return vals; + } + function extend(a, b, undefOnly) { + for (var prop in b) { + if (hasOwn.call(b, prop)) { + if (prop !== 'constructor' || a !== global) { + if (b[prop] === undefined) { + delete a[prop]; + } + else if (!(undefOnly && typeof a[prop] !== 'undefined')) { + a[prop] = b[prop]; + } + } + } + } + return a; + } + function objectType(obj) { + if (typeof obj === 'undefined') { + return 'undefined'; + } + if (obj === null) { + return 'null'; + } + var match = toString.call(obj).match(/^\[object\s(.*)\]$/), type = (match && match[1]) || ''; + switch (type) { + case 'Number': + if (isNaN(obj)) { + return 'nan'; + } + return 'number'; + case 'String': + case 'Boolean': + case 'Array': + case 'Set': + case 'Map': + case 'Date': + case 'RegExp': + case 'Function': + return type.toLowerCase(); + } + if (typeof obj === 'object') { + return 'object'; + } + return undefined; + } + function is(type, obj) { + return QUnit.objectType(obj) === type; + } + var getUrlParams = function () { + var i, current; + var urlParams = {}; + var location = window.location; + var params = location.search.slice(1).split('&'); + var length = params.length; + if (params[0]) { + for (i = 0; i < length; i++) { + current = params[i].split('='); + current[0] = decodeURIComponent(current[0]); + current[1] = current[1] ? decodeURIComponent(current[1]) : true; + if (urlParams[current[0]]) { + urlParams[current[0]] = [].concat(urlParams[current[0]], current[1]); + } + else { + urlParams[current[0]] = current[1]; + } + } + } + return urlParams; + }; + function extractStacktrace(e, offset) { + offset = offset === undefined ? 4 : offset; + var stack, include, i; + if (e.stack) { + stack = e.stack.split('\n'); + if (/^error$/i.test(stack[0])) { + stack.shift(); + } + if (fileName) { + include = []; + for (i = offset; i < stack.length; i++) { + if (stack[i].indexOf(fileName) !== -1) { + break; + } + include.push(stack[i]); + } + if (include.length) { + return include.join('\n'); + } + } + return stack[offset]; + } + else if (e.sourceURL) { + if (/qunit.js$/.test(e.sourceURL)) { + return; + } + return e.sourceURL + ':' + e.line; + } + } + function sourceFromStacktrace(offset) { + var error = new Error(); + if (!error.stack) { + try { + throw error; + } + catch (err) { + error = err; + } + } + return extractStacktrace(error, offset); + } + var config = { + queue: [], + blocking: true, + reorder: true, + altertitle: true, + scrolltop: true, + maxDepth: 5, + requireExpects: false, + urlConfig: [ + { + id: 'hidepassed', + label: 'Hide passed tests', + tooltip: 'Only show tests and assertions that fail. Stored as query-strings.', + }, + { + id: 'noglobals', + label: 'Check for Globals', + tooltip: 'Enabling this will test if any test introduces new properties on the ' + + 'global object (`window` in Browsers). Stored as query-strings.', + }, + { + id: 'notrycatch', + label: 'No try-catch', + tooltip: 'Enabling this will run tests outside of a try-catch block. Makes debugging ' + + 'exceptions in IE reasonable. Stored as query-strings.', + }, + ], + modules: [], + currentModule: { + name: '', + tests: [], + }, + callbacks: {}, + }; + var urlParams = defined.document ? getUrlParams() : {}; + config.modules.push(config.currentModule); + if (urlParams.filter === true) { + delete urlParams.filter; + } + config.filter = urlParams.filter; + config.testId = []; + if (urlParams.testId) { + urlParams.testId = decodeURIComponent(urlParams.testId).split(','); + for (var i = 0; i < urlParams.testId.length; i++) { + config.testId.push(urlParams.testId[i]); + } + } + var loggingCallbacks = {}; + function registerLoggingCallbacks(obj) { + var i, l, key, callbackNames = ['begin', 'done', 'log', 'testStart', 'testDone', 'moduleStart', 'moduleDone']; + function registerLoggingCallback(key) { + var loggingCallback = function (callback) { + if (objectType(callback) !== 'function') { + throw new Error('QUnit logging methods require a callback function as their first parameters.'); + } + config.callbacks[key].push(callback); + }; + loggingCallbacks[key] = loggingCallback; + return loggingCallback; + } + for (i = 0, l = callbackNames.length; i < l; i++) { + key = callbackNames[i]; + if (objectType(config.callbacks[key]) === 'undefined') { + config.callbacks[key] = []; + } + obj[key] = registerLoggingCallback(key); + } + } + function runLoggingCallbacks(key, args) { + var i, l, callbacks; + callbacks = config.callbacks[key]; + for (i = 0, l = callbacks.length; i < l; i++) { + callbacks[i](args); + } + } + function verifyLoggingCallbacks() { + var loggingCallback, userCallback; + for (loggingCallback in loggingCallbacks) { + if (QUnit[loggingCallback] !== loggingCallbacks[loggingCallback]) { + userCallback = QUnit[loggingCallback]; + QUnit[loggingCallback] = loggingCallbacks[loggingCallback]; + QUnit[loggingCallback](userCallback); + if (global.console && global.console.warn) { + global.console.warn('QUnit.' + + loggingCallback + + ' was replaced with a new value.\n' + + 'Please, check out the documentation on how to apply logging callbacks.\n' + + 'Reference: http://api.qunitjs.com/category/callbacks/'); + } + } + } + } + (function () { + if (!defined.document) { + return; + } + var onErrorFnPrev = window.onerror; + window.onerror = function (error, filePath, linerNr) { + var ret = false; + if (onErrorFnPrev) { + ret = onErrorFnPrev(error, filePath, linerNr); + } + if (ret !== true) { + if (QUnit.config.current) { + if (QUnit.config.current.ignoreGlobalErrors) { + return true; + } + QUnit.pushFailure(error, filePath + ':' + linerNr); + } + else { + QUnit.test('global failure', extend(function () { + QUnit.pushFailure(error, filePath + ':' + linerNr); + }, { validTest: true })); + } + return false; + } + return ret; + }; + })(); + QUnit.urlParams = urlParams; + QUnit.isLocal = !(defined.document && window.location.protocol !== 'file:'); + QUnit.version = '1.19.0'; + extend(QUnit, { + module: function (name, testEnvironment) { + var currentModule = { + name: name, + testEnvironment: testEnvironment, + tests: [], + }; + if (testEnvironment && testEnvironment.setup) { + testEnvironment.beforeEach = testEnvironment.setup; + delete testEnvironment.setup; + } + if (testEnvironment && testEnvironment.teardown) { + testEnvironment.afterEach = testEnvironment.teardown; + delete testEnvironment.teardown; + } + config.modules.push(currentModule); + config.currentModule = currentModule; + }, + asyncTest: asyncTest, + test: test, + skip: skip, + start: function (count) { + var globalStartAlreadyCalled = globalStartCalled; + if (!config.current) { + globalStartCalled = true; + if (runStarted) { + throw new Error('Called start() outside of a test context while already started'); + } + else if (globalStartAlreadyCalled || count > 1) { + throw new Error('Called start() outside of a test context too many times'); + } + else if (config.autostart) { + throw new Error('Called start() outside of a test context when ' + 'QUnit.config.autostart was true'); + } + else if (!config.pageLoaded) { + config.autostart = true; + return; + } + } + else { + config.current.semaphore -= count || 1; + if (config.current.semaphore > 0) { + return; + } + if (config.current.semaphore < 0) { + config.current.semaphore = 0; + QUnit.pushFailure("Called start() while already started (test's semaphore was 0 already)", sourceFromStacktrace(2)); + return; + } + } + resumeProcessing(); + }, + stop: function (count) { + if (!config.current) { + throw new Error('Called stop() outside of a test context'); + } + config.current.semaphore += count || 1; + pauseProcessing(); + }, + config: config, + is: is, + objectType: objectType, + extend: extend, + load: function () { + config.pageLoaded = true; + extend(config, { + stats: { all: 0, bad: 0 }, + moduleStats: { all: 0, bad: 0 }, + started: 0, + updateRate: 1000, + autostart: true, + filter: '', + }, true); + config.blocking = false; + if (config.autostart) { + resumeProcessing(); + } + }, + stack: function (offset) { + offset = (offset || 0) + 2; + return sourceFromStacktrace(offset); + }, + }); + registerLoggingCallbacks(QUnit); + function begin() { + var i, l, modulesLog = []; + if (!config.started) { + config.started = now(); + verifyLoggingCallbacks(); + if (config.modules[0].name === '' && config.modules[0].tests.length === 0) { + config.modules.shift(); + } + for (i = 0, l = config.modules.length; i < l; i++) { + modulesLog.push({ + name: config.modules[i].name, + tests: config.modules[i].tests, + }); + } + runLoggingCallbacks('begin', { + totalTests: Test.count, + modules: modulesLog, + }); + } + config.blocking = false; + process(true); + } + function process(last) { + function next() { + process(last); + } + var start = now(); + config.depth = (config.depth || 0) + 1; + while (config.queue.length && !config.blocking) { + if (!defined.setTimeout || config.updateRate <= 0 || now() - start < config.updateRate) { + if (config.current) { + config.current.usedAsync = false; + } + config.queue.shift()(); + } + else { + setTimeout(next, 13); + break; + } + } + config.depth--; + if (last && !config.blocking && !config.queue.length && config.depth === 0) { + done(); + } + } + function pauseProcessing() { + config.blocking = true; + if (config.testTimeout && defined.setTimeout) { + clearTimeout(config.timeout); + config.timeout = setTimeout(function () { + if (config.current) { + config.current.semaphore = 0; + QUnit.pushFailure('Test timed out', sourceFromStacktrace(2)); + } + else { + throw new Error('Test timed out'); + } + resumeProcessing(); + }, config.testTimeout); + } + } + function resumeProcessing() { + runStarted = true; + if (defined.setTimeout) { + setTimeout(function () { + if (config.current && config.current.semaphore > 0) { + return; + } + if (config.timeout) { + clearTimeout(config.timeout); + } + begin(); + }, 13); + } + else { + begin(); + } + } + function done() { + var runtime, passed; + config.autorun = true; + if (config.previousModule) { + runLoggingCallbacks('moduleDone', { + name: config.previousModule.name, + tests: config.previousModule.tests, + failed: config.moduleStats.bad, + passed: config.moduleStats.all - config.moduleStats.bad, + total: config.moduleStats.all, + runtime: now() - config.moduleStats.started, + }); + } + delete config.previousModule; + runtime = now() - config.started; + passed = config.stats.all - config.stats.bad; + runLoggingCallbacks('done', { + failed: config.stats.bad, + passed: passed, + total: config.stats.all, + runtime: runtime, + }); + } + function Test(settings) { + var i, l; + ++Test.count; + extend(this, settings); + this.assertions = []; + this.semaphore = 0; + this.usedAsync = false; + this.module = config.currentModule; + this.stack = sourceFromStacktrace(3); + for (i = 0, l = this.module.tests; i < l.length; i++) { + if (this.module.tests[i].name === this.testName) { + this.testName += ' '; + } + } + this.testId = generateHash(this.module.name, this.testName); + this.module.tests.push({ + name: this.testName, + testId: this.testId, + }); + if (settings.skip) { + this.callback = function () { }; + this.async = false; + this.expected = 0; + } + else { + this.assert = new Assert(this); + } + } + Test.count = 0; + Test.prototype = { + before: function () { + if (this.module !== config.previousModule || + !hasOwn.call(config, 'previousModule')) { + if (hasOwn.call(config, 'previousModule')) { + runLoggingCallbacks('moduleDone', { + name: config.previousModule.name, + tests: config.previousModule.tests, + failed: config.moduleStats.bad, + passed: config.moduleStats.all - config.moduleStats.bad, + total: config.moduleStats.all, + runtime: now() - config.moduleStats.started, + }); + } + config.previousModule = this.module; + config.moduleStats = { all: 0, bad: 0, started: now() }; + runLoggingCallbacks('moduleStart', { + name: this.module.name, + tests: this.module.tests, + }); + } + config.current = this; + if (this.module.testEnvironment) { + delete this.module.testEnvironment.beforeEach; + delete this.module.testEnvironment.afterEach; + } + this.testEnvironment = extend({}, this.module.testEnvironment); + this.started = now(); + runLoggingCallbacks('testStart', { + name: this.testName, + module: this.module.name, + testId: this.testId, + }); + if (!config.pollution) { + saveGlobal(); + } + }, + run: function () { + var promise; + config.current = this; + if (this.async) { + QUnit.stop(); + } + this.callbackStarted = now(); + if (config.notrycatch) { + promise = this.callback.call(this.testEnvironment, this.assert); + this.resolvePromise(promise); + return; + } + try { + promise = this.callback.call(this.testEnvironment, this.assert); + this.resolvePromise(promise); + } + catch (e) { + this.pushFailure('Died on test #' + (this.assertions.length + 1) + ' ' + this.stack + ': ' + (e.message || e), extractStacktrace(e, 0)); + saveGlobal(); + if (config.blocking) { + QUnit.start(); + } + } + }, + after: function () { + checkPollution(); + }, + queueHook: function (hook, hookName) { + var promise, test = this; + return function runHook() { + config.current = test; + if (config.notrycatch) { + promise = hook.call(test.testEnvironment, test.assert); + test.resolvePromise(promise, hookName); + return; + } + try { + promise = hook.call(test.testEnvironment, test.assert); + test.resolvePromise(promise, hookName); + } + catch (error) { + test.pushFailure(hookName + ' failed on ' + test.testName + ': ' + (error.message || error), extractStacktrace(error, 0)); + } + }; + }, + hooks: function (handler) { + var hooks = []; + if (this.skip) { + return hooks; + } + if (this.module.testEnvironment && QUnit.objectType(this.module.testEnvironment[handler]) === 'function') { + hooks.push(this.queueHook(this.module.testEnvironment[handler], handler)); + } + return hooks; + }, + finish: function () { + config.current = this; + if (config.requireExpects && this.expected === null) { + this.pushFailure('Expected number of assertions to be defined, but expect() was ' + 'not called.', this.stack); + } + else if (this.expected !== null && this.expected !== this.assertions.length) { + this.pushFailure('Expected ' + this.expected + ' assertions, but ' + this.assertions.length + ' were run', this.stack); + } + else if (this.expected === null && !this.assertions.length) { + this.pushFailure('Expected at least one assertion, but none were run - call ' + 'expect(0) to accept zero assertions.', this.stack); + } + var i, bad = 0; + this.runtime = now() - this.started; + config.stats.all += this.assertions.length; + config.moduleStats.all += this.assertions.length; + for (i = 0; i < this.assertions.length; i++) { + if (!this.assertions[i].result) { + bad++; + config.stats.bad++; + config.moduleStats.bad++; + } + } + runLoggingCallbacks('testDone', { + name: this.testName, + module: this.module.name, + skipped: !!this.skip, + failed: bad, + passed: this.assertions.length - bad, + total: this.assertions.length, + runtime: this.runtime, + assertions: this.assertions, + testId: this.testId, + source: this.stack, + duration: this.runtime, + }); + QUnit.reset(); + config.current = undefined; + }, + queue: function () { + var bad, test = this; + if (!this.valid()) { + return; + } + function run() { + synchronize([ + function () { + test.before(); + }, + test.hooks('beforeEach'), + function () { + test.run(); + }, + test.hooks('afterEach').reverse(), + function () { + test.after(); + }, + function () { + test.finish(); + }, + ]); + } + bad = + QUnit.config.reorder && + defined.sessionStorage && + +sessionStorage.getItem('qunit-test-' + this.module.name + '-' + this.testName); + if (bad) { + run(); + } + else { + synchronize(run, true); + } + }, + push: function (result, actual, expected, message, negative) { + var source, details = { + module: this.module.name, + name: this.testName, + result: result, + message: message, + actual: actual, + expected: expected, + testId: this.testId, + negative: negative || false, + runtime: now() - this.started, + }; + if (!result) { + source = sourceFromStacktrace(); + if (source) { + details.source = source; + } + } + runLoggingCallbacks('log', details); + this.assertions.push({ + result: !!result, + message: message, + }); + }, + pushFailure: function (message, source, actual) { + if (!(this instanceof Test)) { + throw new Error('pushFailure() assertion outside test context, was ' + sourceFromStacktrace(2)); + } + var details = { + module: this.module.name, + name: this.testName, + result: false, + message: message || 'error', + actual: actual || null, + testId: this.testId, + runtime: now() - this.started, + }; + if (source) { + details.source = source; + } + runLoggingCallbacks('log', details); + this.assertions.push({ + result: false, + message: message, + }); + }, + resolvePromise: function (promise, phase) { + var then, message, test = this; + if (promise != null) { + then = promise.then; + if (QUnit.objectType(then) === 'function') { + QUnit.stop(); + then.call(promise, function () { + QUnit.start(); + }, function (error) { + message = + 'Promise rejected ' + + (!phase ? 'during' : phase.replace(/Each$/, '')) + + ' ' + + test.testName + + ': ' + + (error.message || error); + test.pushFailure(message, extractStacktrace(error, 0)); + saveGlobal(); + QUnit.start(); + }); + } + } + }, + valid: function () { + var include, filter = config.filter && config.filter.toLowerCase(), module = QUnit.urlParams.module && QUnit.urlParams.module.toLowerCase(), fullName = (this.module.name + ': ' + this.testName).toLowerCase(); + if (this.callback && this.callback.validTest) { + return true; + } + if (config.testId.length > 0 && inArray(this.testId, config.testId) < 0) { + return false; + } + if (module && (!this.module.name || this.module.name.toLowerCase() !== module)) { + return false; + } + if (!filter) { + return true; + } + include = filter.charAt(0) !== '!'; + if (!include) { + filter = filter.slice(1); + } + if (fullName.indexOf(filter) !== -1) { + return include; + } + return !include; + }, + }; + QUnit.reset = function () { + if (!defined.document) { + return; + } + var fixture = defined.document && document.getElementById && document.getElementById('qunit-fixture'); + if (fixture) { + fixture.innerHTML = config.fixture; + } + }; + QUnit.pushFailure = function () { + if (!QUnit.config.current) { + throw new Error('pushFailure() assertion outside test context, in ' + sourceFromStacktrace(2)); + } + var currentTest = QUnit.config.current; + return currentTest.pushFailure.apply(currentTest, arguments); + }; + function generateHash(module, testName) { + var hex, i = 0, hash = 0, str = module + '\x1C' + testName, len = str.length; + for (; i < len; i++) { + hash = (hash << 5) - hash + str.charCodeAt(i); + hash |= 0; + } + hex = (0x100000000 + hash).toString(16); + if (hex.length < 8) { + hex = '0000000' + hex; + } + return hex.slice(-8); + } + function synchronize(callback, last) { + if (QUnit.objectType(callback) === 'array') { + while (callback.length) { + synchronize(callback.shift()); + } + return; + } + config.queue.push(callback); + if (config.autorun && !config.blocking) { + process(last); + } + } + function saveGlobal() { + config.pollution = []; + if (config.noglobals) { + for (var key in global) { + if (hasOwn.call(global, key)) { + if (/^qunit-test-output/.test(key)) { + continue; + } + config.pollution.push(key); + } + } + } + } + function checkPollution() { + var newGlobals, deletedGlobals, old = config.pollution; + saveGlobal(); + newGlobals = diff(config.pollution, old); + if (newGlobals.length > 0) { + QUnit.pushFailure('Introduced global variable(s): ' + newGlobals.join(', ')); + } + deletedGlobals = diff(old, config.pollution); + if (deletedGlobals.length > 0) { + QUnit.pushFailure('Deleted global variable(s): ' + deletedGlobals.join(', ')); + } + } + function asyncTest(testName, expected, callback) { + if (arguments.length === 2) { + callback = expected; + expected = null; + } + QUnit.test(testName, expected, callback, true); + } + function test(testName, expected, callback, async) { + var newTest; + if (arguments.length === 2) { + callback = expected; + expected = null; + } + newTest = new Test({ + testName: testName, + expected: expected, + async: async, + callback: callback, + }); + newTest.queue(); + } + function skip(testName) { + var test = new Test({ + testName: testName, + skip: true, + }); + test.queue(); + } + function Assert(testContext) { + this.test = testContext; + } + QUnit.assert = Assert.prototype = { + expect: function (asserts) { + if (arguments.length === 1) { + this.test.expected = asserts; + } + else { + return this.test.expected; + } + }, + async: function () { + var test = this.test, popped = false; + test.semaphore += 1; + test.usedAsync = true; + pauseProcessing(); + return function done() { + if (!popped) { + test.semaphore -= 1; + popped = true; + resumeProcessing(); + } + else { + test.pushFailure('Called the callback returned from `assert.async` more than once', sourceFromStacktrace(2)); + } + }; + }, + push: function () { + var assert = this, currentTest = (assert instanceof Assert && assert.test) || QUnit.config.current; + if (!currentTest) { + throw new Error('assertion outside test context, in ' + sourceFromStacktrace(2)); + } + if (currentTest.usedAsync === true && currentTest.semaphore === 0) { + currentTest.pushFailure('Assertion after the final `assert.async` was resolved', sourceFromStacktrace(2)); + } + if (!(assert instanceof Assert)) { + assert = currentTest.assert; + } + return assert.test.push.apply(assert.test, arguments); + }, + ok: function (result, message) { + message = + message || (result ? 'okay' : 'failed, expected argument to be truthy, was: ' + QUnit.dump.parse(result)); + this.push(!!result, result, true, message); + }, + notOk: function (result, message) { + message = + message || (!result ? 'okay' : 'failed, expected argument to be falsy, was: ' + QUnit.dump.parse(result)); + this.push(!result, result, false, message, true); + }, + equal: function (actual, expected, message) { + this.push(expected == actual, actual, expected, message); + }, + notEqual: function (actual, expected, message) { + this.push(expected != actual, actual, expected, message, true); + }, + propEqual: function (actual, expected, message) { + actual = objectValues(actual); + expected = objectValues(expected); + this.push(QUnit.equiv(actual, expected), actual, expected, message); + }, + notPropEqual: function (actual, expected, message) { + actual = objectValues(actual); + expected = objectValues(expected); + this.push(!QUnit.equiv(actual, expected), actual, expected, message, true); + }, + deepEqual: function (actual, expected, message) { + this.push(QUnit.equiv(actual, expected), actual, expected, message); + }, + notDeepEqual: function (actual, expected, message) { + this.push(!QUnit.equiv(actual, expected), actual, expected, message, true); + }, + strictEqual: function (actual, expected, message) { + this.push(expected === actual, actual, expected, message); + }, + notStrictEqual: function (actual, expected, message) { + this.push(expected !== actual, actual, expected, message, true); + }, + throws: function (block, expected, message) { + var actual, expectedType, expectedOutput = expected, ok = false, currentTest = (this instanceof Assert && this.test) || QUnit.config.current; + if (message == null && typeof expected === 'string') { + message = expected; + expected = null; + } + currentTest.ignoreGlobalErrors = true; + try { + block.call(currentTest.testEnvironment); + } + catch (e) { + actual = e; + } + currentTest.ignoreGlobalErrors = false; + if (actual) { + expectedType = QUnit.objectType(expected); + if (!expected) { + ok = true; + expectedOutput = null; + } + else if (expectedType === 'regexp') { + ok = expected.test(errorString(actual)); + } + else if (expectedType === 'string') { + ok = expected === errorString(actual); + } + else if (expectedType === 'function' && actual instanceof expected) { + ok = true; + } + else if (expectedType === 'object') { + ok = + actual instanceof expected.constructor && + actual.name === expected.name && + actual.message === expected.message; + } + else if (expectedType === 'function' && expected.call({}, actual) === true) { + expectedOutput = null; + ok = true; + } + } + currentTest.assert.push(ok, actual, expectedOutput, message); + }, + }; + (function () { + Assert.prototype.raises = Assert.prototype['throws']; + })(); + function errorString(error) { + var name, message, resultErrorString = error.toString(); + if (resultErrorString.substring(0, 7) === '[object') { + name = error.name ? error.name.toString() : 'Error'; + message = error.message ? error.message.toString() : ''; + if (name && message) { + return name + ': ' + message; + } + else if (name) { + return name; + } + else if (message) { + return message; + } + else { + return 'Error'; + } + } + else { + return resultErrorString; + } + } + QUnit.equiv = (function () { + function bindCallbacks(o, callbacks, args) { + var prop = QUnit.objectType(o); + if (prop) { + if (QUnit.objectType(callbacks[prop]) === 'function') { + return callbacks[prop].apply(callbacks, args); + } + else { + return callbacks[prop]; + } + } + } + var innerEquiv, callers = [], parents = [], parentsB = [], getProto = Object.getPrototypeOf || + function (obj) { + return obj.__proto__; + }, callbacks = (function () { + function useStrictEquality(b, a) { + if (b instanceof a.constructor || a instanceof b.constructor) { + return a == b; + } + else { + return a === b; + } + } + return { + string: useStrictEquality, + boolean: useStrictEquality, + number: useStrictEquality, + null: useStrictEquality, + undefined: useStrictEquality, + nan: function (b) { + return isNaN(b); + }, + date: function (b, a) { + return QUnit.objectType(b) === 'date' && a.valueOf() === b.valueOf(); + }, + regexp: function (b, a) { + return (QUnit.objectType(b) === 'regexp' && + a.source === b.source && + a.global === b.global && + a.ignoreCase === b.ignoreCase && + a.multiline === b.multiline && + a.sticky === b.sticky); + }, + function: function () { + var caller = callers[callers.length - 1]; + return caller !== Object && typeof caller !== 'undefined'; + }, + array: function (b, a) { + var i, j, len, loop, aCircular, bCircular; + if (QUnit.objectType(b) !== 'array') { + return false; + } + len = a.length; + if (len !== b.length) { + return false; + } + parents.push(a); + parentsB.push(b); + for (i = 0; i < len; i++) { + loop = false; + for (j = 0; j < parents.length; j++) { + aCircular = parents[j] === a[i]; + bCircular = parentsB[j] === b[i]; + if (aCircular || bCircular) { + if (a[i] === b[i] || (aCircular && bCircular)) { + loop = true; + } + else { + parents.pop(); + parentsB.pop(); + return false; + } + } + } + if (!loop && !innerEquiv(a[i], b[i])) { + parents.pop(); + parentsB.pop(); + return false; + } + } + parents.pop(); + parentsB.pop(); + return true; + }, + set: function (b, a) { + var aArray, bArray; + if (QUnit.objectType(b) !== 'set') { + return false; + } + aArray = []; + a.forEach(function (v) { + aArray.push(v); + }); + bArray = []; + b.forEach(function (v) { + bArray.push(v); + }); + return innerEquiv(bArray, aArray); + }, + map: function (b, a) { + var aArray, bArray; + if (QUnit.objectType(b) !== 'map') { + return false; + } + aArray = []; + a.forEach(function (v, k) { + aArray.push([k, v]); + }); + bArray = []; + b.forEach(function (v, k) { + bArray.push([k, v]); + }); + return innerEquiv(bArray, aArray); + }, + object: function (b, a) { + var i, j, loop, aCircular, bCircular, eq = true, aProperties = [], bProperties = []; + if (a.constructor !== b.constructor) { + if (!((getProto(a) === null && getProto(b) === Object.prototype) || + (getProto(b) === null && getProto(a) === Object.prototype))) { + return false; + } + } + callers.push(a.constructor); + parents.push(a); + parentsB.push(b); + for (i in a) { + loop = false; + for (j = 0; j < parents.length; j++) { + aCircular = parents[j] === a[i]; + bCircular = parentsB[j] === b[i]; + if (aCircular || bCircular) { + if (a[i] === b[i] || (aCircular && bCircular)) { + loop = true; + } + else { + eq = false; + break; + } + } + } + aProperties.push(i); + if (!loop && !innerEquiv(a[i], b[i])) { + eq = false; + break; + } + } + parents.pop(); + parentsB.pop(); + callers.pop(); + for (i in b) { + bProperties.push(i); + } + return eq && innerEquiv(aProperties.sort(), bProperties.sort()); + }, + }; + })(); + innerEquiv = function () { + var args = [].slice.apply(arguments); + if (args.length < 2) { + return true; + } + return ((function (a, b) { + if (a === b) { + return true; + } + else if (a === null || + b === null || + typeof a === 'undefined' || + typeof b === 'undefined' || + QUnit.objectType(a) !== QUnit.objectType(b)) { + return false; + } + else { + return bindCallbacks(a, callbacks, [b, a]); + } + })(args[0], args[1]) && innerEquiv.apply(this, args.splice(1, args.length - 1))); + }; + return innerEquiv; + })(); + QUnit.dump = (function () { + function quote(str) { + return '"' + str.toString().replace(/\\/g, '\\\\').replace(/"/g, '\\"') + '"'; + } + function literal(o) { + return o + ''; + } + function join(pre, arr, post) { + var s = dump.separator(), base = dump.indent(), inner = dump.indent(1); + if (arr.join) { + arr = arr.join(',' + s + inner); + } + if (!arr) { + return pre + post; + } + return [pre, inner + arr, base + post].join(s); + } + function array(arr, stack) { + var i = arr.length, ret = new Array(i); + if (dump.maxDepth && dump.depth > dump.maxDepth) { + return '[object Array]'; + } + this.up(); + while (i--) { + ret[i] = this.parse(arr[i], undefined, stack); + } + this.down(); + return join('[', ret, ']'); + } + var reName = /^function (\w+)/, dump = { + parse: function (obj, objType, stack) { + stack = stack || []; + var res, parser, parserType, inStack = inArray(obj, stack); + if (inStack !== -1) { + return 'recursion(' + (inStack - stack.length) + ')'; + } + objType = objType || this.typeOf(obj); + parser = this.parsers[objType]; + parserType = typeof parser; + if (parserType === 'function') { + stack.push(obj); + res = parser.call(this, obj, stack); + stack.pop(); + return res; + } + return parserType === 'string' ? parser : this.parsers.error; + }, + typeOf: function (obj) { + var type; + if (obj === null) { + type = 'null'; + } + else if (typeof obj === 'undefined') { + type = 'undefined'; + } + else if (QUnit.is('regexp', obj)) { + type = 'regexp'; + } + else if (QUnit.is('date', obj)) { + type = 'date'; + } + else if (QUnit.is('function', obj)) { + type = 'function'; + } + else if (obj.setInterval !== undefined && obj.document !== undefined && obj.nodeType === undefined) { + type = 'window'; + } + else if (obj.nodeType === 9) { + type = 'document'; + } + else if (obj.nodeType) { + type = 'node'; + } + else if (toString.call(obj) === '[object Array]' || + (typeof obj.length === 'number' && + obj.item !== undefined && + (obj.length ? obj.item(0) === obj[0] : obj.item(0) === null && obj[0] === undefined))) { + type = 'array'; + } + else if (obj.constructor === Error.prototype.constructor) { + type = 'error'; + } + else { + type = typeof obj; + } + return type; + }, + separator: function () { + return this.multiline ? (this.HTML ? '
' : '\n') : this.HTML ? ' ' : ' '; + }, + indent: function (extra) { + if (!this.multiline) { + return ''; + } + var chr = this.indentChar; + if (this.HTML) { + chr = chr.replace(/\t/g, ' ').replace(/ /g, ' '); + } + return new Array(this.depth + (extra || 0)).join(chr); + }, + up: function (a) { + this.depth += a || 1; + }, + down: function (a) { + this.depth -= a || 1; + }, + setParser: function (name, parser) { + this.parsers[name] = parser; + }, + quote: quote, + literal: literal, + join: join, + depth: 1, + maxDepth: QUnit.config.maxDepth, + parsers: { + window: '[Window]', + document: '[Document]', + error: function (error) { + return 'Error("' + error.message + '")'; + }, + unknown: '[Unknown]', + null: 'null', + undefined: 'undefined', + function: function (fn) { + var ret = 'function', name = 'name' in fn ? fn.name : (reName.exec(fn) || [])[1]; + if (name) { + ret += ' ' + name; + } + ret += '( '; + ret = [ret, dump.parse(fn, 'functionArgs'), '){'].join(''); + return join(ret, dump.parse(fn, 'functionCode'), '}'); + }, + array: array, + nodelist: array, + arguments: array, + object: function (map, stack) { + var keys, key, val, i, nonEnumerableProperties, ret = []; + if (dump.maxDepth && dump.depth > dump.maxDepth) { + return '[object Object]'; + } + dump.up(); + keys = []; + for (key in map) { + keys.push(key); + } + nonEnumerableProperties = ['message', 'name']; + for (i in nonEnumerableProperties) { + key = nonEnumerableProperties[i]; + if (key in map && inArray(key, keys) < 0) { + keys.push(key); + } + } + keys.sort(); + for (i = 0; i < keys.length; i++) { + key = keys[i]; + val = map[key]; + ret.push(dump.parse(key, 'key') + ': ' + dump.parse(val, undefined, stack)); + } + dump.down(); + return join('{', ret, '}'); + }, + node: function (node) { + var len, i, val, open = dump.HTML ? '<' : '<', close = dump.HTML ? '>' : '>', tag = node.nodeName.toLowerCase(), ret = open + tag, attrs = node.attributes; + if (attrs) { + for (i = 0, len = attrs.length; i < len; i++) { + val = attrs[i].nodeValue; + if (val && val !== 'inherit') { + ret += ' ' + attrs[i].nodeName + '=' + dump.parse(val, 'attribute'); + } + } + } + ret += close; + if (node.nodeType === 3 || node.nodeType === 4) { + ret += node.nodeValue; + } + return ret + open + '/' + tag + close; + }, + functionArgs: function (fn) { + var args, l = fn.length; + if (!l) { + return ''; + } + args = new Array(l); + while (l--) { + args[l] = String.fromCharCode(97 + l); + } + return ' ' + args.join(', ') + ' '; + }, + key: quote, + functionCode: '[code]', + attribute: quote, + string: quote, + date: quote, + regexp: literal, + number: literal, + boolean: literal, + }, + HTML: false, + indentChar: ' ', + multiline: true, + }; + return dump; + })(); + QUnit.jsDump = QUnit.dump; + if (defined.document) { + (function () { + var i, assertions = Assert.prototype; + function applyCurrent(current) { + return function () { + var assert = new Assert(QUnit.config.current); + current.apply(assert, arguments); + }; + } + for (i in assertions) { + QUnit[i] = applyCurrent(assertions[i]); + } + })(); + (function () { + var i, l, keys = [ + 'test', + 'module', + 'expect', + 'asyncTest', + 'start', + 'stop', + 'ok', + 'notOk', + 'equal', + 'notEqual', + 'propEqual', + 'notPropEqual', + 'deepEqual', + 'notDeepEqual', + 'strictEqual', + 'notStrictEqual', + 'throws', + ]; + for (i = 0, l = keys.length; i < l; i++) { + window[keys[i]] = QUnit[keys[i]]; + } + })(); + window.QUnit = QUnit; + } + if (typeof module !== 'undefined' && module && module.exports) { + module.exports = QUnit; + module.exports.QUnit = QUnit; + } + if (typeof exports !== 'undefined' && exports) { + exports.QUnit = QUnit; + } + if (typeof define === 'function' && define.amd) { + define(function () { + return QUnit; + }); + QUnit.config.autostart = false; + } + QUnit.diff = (function () { + function DiffMatchPatch() { } + var DIFF_DELETE = -1, DIFF_INSERT = 1, DIFF_EQUAL = 0; + DiffMatchPatch.prototype.DiffMain = function (text1, text2, optChecklines) { + var deadline, checklines, commonlength, commonprefix, commonsuffix, diffs; + deadline = new Date().getTime() + 1000; + if (text1 === null || text2 === null) { + throw new Error('Null input. (DiffMain)'); + } + if (text1 === text2) { + if (text1) { + return [[DIFF_EQUAL, text1]]; + } + return []; + } + if (typeof optChecklines === 'undefined') { + optChecklines = true; + } + checklines = optChecklines; + commonlength = this.diffCommonPrefix(text1, text2); + commonprefix = text1.substring(0, commonlength); + text1 = text1.substring(commonlength); + text2 = text2.substring(commonlength); + commonlength = this.diffCommonSuffix(text1, text2); + commonsuffix = text1.substring(text1.length - commonlength); + text1 = text1.substring(0, text1.length - commonlength); + text2 = text2.substring(0, text2.length - commonlength); + diffs = this.diffCompute(text1, text2, checklines, deadline); + if (commonprefix) { + diffs.unshift([DIFF_EQUAL, commonprefix]); + } + if (commonsuffix) { + diffs.push([DIFF_EQUAL, commonsuffix]); + } + this.diffCleanupMerge(diffs); + return diffs; + }; + DiffMatchPatch.prototype.diffCleanupEfficiency = function (diffs) { + var changes, equalities, equalitiesLength, lastequality, pointer, preIns, preDel, postIns, postDel; + changes = false; + equalities = []; + equalitiesLength = 0; + lastequality = null; + pointer = 0; + preIns = false; + preDel = false; + postIns = false; + postDel = false; + while (pointer < diffs.length) { + if (diffs[pointer][0] === DIFF_EQUAL) { + if (diffs[pointer][1].length < 4 && (postIns || postDel)) { + equalities[equalitiesLength++] = pointer; + preIns = postIns; + preDel = postDel; + lastequality = diffs[pointer][1]; + } + else { + equalitiesLength = 0; + lastequality = null; + } + postIns = postDel = false; + } + else { + if (diffs[pointer][0] === DIFF_DELETE) { + postDel = true; + } + else { + postIns = true; + } + if (lastequality && + ((preIns && preDel && postIns && postDel) || + (lastequality.length < 2 && preIns + preDel + postIns + postDel === 3))) { + diffs.splice(equalities[equalitiesLength - 1], 0, [DIFF_DELETE, lastequality]); + diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT; + equalitiesLength--; + lastequality = null; + if (preIns && preDel) { + postIns = postDel = true; + equalitiesLength = 0; + } + else { + equalitiesLength--; + pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1; + postIns = postDel = false; + } + changes = true; + } + } + pointer++; + } + if (changes) { + this.diffCleanupMerge(diffs); + } + }; + DiffMatchPatch.prototype.diffPrettyHtml = function (diffs) { + var op, data, x, html = []; + for (x = 0; x < diffs.length; x++) { + op = diffs[x][0]; + data = diffs[x][1]; + switch (op) { + case DIFF_INSERT: + html[x] = '' + data + ''; + break; + case DIFF_DELETE: + html[x] = '' + data + ''; + break; + case DIFF_EQUAL: + html[x] = '' + data + ''; + break; + } + } + return html.join(''); + }; + DiffMatchPatch.prototype.diffCommonPrefix = function (text1, text2) { + var pointermid, pointermax, pointermin, pointerstart; + if (!text1 || !text2 || text1.charAt(0) !== text2.charAt(0)) { + return 0; + } + pointermin = 0; + pointermax = Math.min(text1.length, text2.length); + pointermid = pointermax; + pointerstart = 0; + while (pointermin < pointermid) { + if (text1.substring(pointerstart, pointermid) === text2.substring(pointerstart, pointermid)) { + pointermin = pointermid; + pointerstart = pointermin; + } + else { + pointermax = pointermid; + } + pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin); + } + return pointermid; + }; + DiffMatchPatch.prototype.diffCommonSuffix = function (text1, text2) { + var pointermid, pointermax, pointermin, pointerend; + if (!text1 || !text2 || text1.charAt(text1.length - 1) !== text2.charAt(text2.length - 1)) { + return 0; + } + pointermin = 0; + pointermax = Math.min(text1.length, text2.length); + pointermid = pointermax; + pointerend = 0; + while (pointermin < pointermid) { + if (text1.substring(text1.length - pointermid, text1.length - pointerend) === + text2.substring(text2.length - pointermid, text2.length - pointerend)) { + pointermin = pointermid; + pointerend = pointermin; + } + else { + pointermax = pointermid; + } + pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin); + } + return pointermid; + }; + DiffMatchPatch.prototype.diffCompute = function (text1, text2, checklines, deadline) { + var diffs, longtext, shorttext, i, hm, text1A, text2A, text1B, text2B, midCommon, diffsA, diffsB; + if (!text1) { + return [[DIFF_INSERT, text2]]; + } + if (!text2) { + return [[DIFF_DELETE, text1]]; + } + longtext = text1.length > text2.length ? text1 : text2; + shorttext = text1.length > text2.length ? text2 : text1; + i = longtext.indexOf(shorttext); + if (i !== -1) { + diffs = [ + [DIFF_INSERT, longtext.substring(0, i)], + [DIFF_EQUAL, shorttext], + [DIFF_INSERT, longtext.substring(i + shorttext.length)], + ]; + if (text1.length > text2.length) { + diffs[0][0] = diffs[2][0] = DIFF_DELETE; + } + return diffs; + } + if (shorttext.length === 1) { + return [ + [DIFF_DELETE, text1], + [DIFF_INSERT, text2], + ]; + } + hm = this.diffHalfMatch(text1, text2); + if (hm) { + text1A = hm[0]; + text1B = hm[1]; + text2A = hm[2]; + text2B = hm[3]; + midCommon = hm[4]; + diffsA = this.DiffMain(text1A, text2A, checklines, deadline); + diffsB = this.DiffMain(text1B, text2B, checklines, deadline); + return diffsA.concat([[DIFF_EQUAL, midCommon]], diffsB); + } + if (checklines && text1.length > 100 && text2.length > 100) { + return this.diffLineMode(text1, text2, deadline); + } + return this.diffBisect(text1, text2, deadline); + }; + DiffMatchPatch.prototype.diffHalfMatch = function (text1, text2) { + var longtext, shorttext, dmp, text1A, text2B, text2A, text1B, midCommon, hm1, hm2, hm; + longtext = text1.length > text2.length ? text1 : text2; + shorttext = text1.length > text2.length ? text2 : text1; + if (longtext.length < 4 || shorttext.length * 2 < longtext.length) { + return null; + } + dmp = this; + function diffHalfMatchI(longtext, shorttext, i) { + var seed, j, bestCommon, prefixLength, suffixLength, bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB; + seed = longtext.substring(i, i + Math.floor(longtext.length / 4)); + j = -1; + bestCommon = ''; + while ((j = shorttext.indexOf(seed, j + 1)) !== -1) { + prefixLength = dmp.diffCommonPrefix(longtext.substring(i), shorttext.substring(j)); + suffixLength = dmp.diffCommonSuffix(longtext.substring(0, i), shorttext.substring(0, j)); + if (bestCommon.length < suffixLength + prefixLength) { + bestCommon = shorttext.substring(j - suffixLength, j) + shorttext.substring(j, j + prefixLength); + bestLongtextA = longtext.substring(0, i - suffixLength); + bestLongtextB = longtext.substring(i + prefixLength); + bestShorttextA = shorttext.substring(0, j - suffixLength); + bestShorttextB = shorttext.substring(j + prefixLength); + } + } + if (bestCommon.length * 2 >= longtext.length) { + return [bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB, bestCommon]; + } + else { + return null; + } + } + hm1 = diffHalfMatchI(longtext, shorttext, Math.ceil(longtext.length / 4)); + hm2 = diffHalfMatchI(longtext, shorttext, Math.ceil(longtext.length / 2)); + if (!hm1 && !hm2) { + return null; + } + else if (!hm2) { + hm = hm1; + } + else if (!hm1) { + hm = hm2; + } + else { + hm = hm1[4].length > hm2[4].length ? hm1 : hm2; + } + text1A, text1B, text2A, text2B; + if (text1.length > text2.length) { + text1A = hm[0]; + text1B = hm[1]; + text2A = hm[2]; + text2B = hm[3]; + } + else { + text2A = hm[0]; + text2B = hm[1]; + text1A = hm[2]; + text1B = hm[3]; + } + midCommon = hm[4]; + return [text1A, text1B, text2A, text2B, midCommon]; + }; + DiffMatchPatch.prototype.diffLineMode = function (text1, text2, deadline) { + var a, diffs, linearray, pointer, countInsert, countDelete, textInsert, textDelete, j; + a = this.diffLinesToChars(text1, text2); + text1 = a.chars1; + text2 = a.chars2; + linearray = a.lineArray; + diffs = this.DiffMain(text1, text2, false, deadline); + this.diffCharsToLines(diffs, linearray); + this.diffCleanupSemantic(diffs); + diffs.push([DIFF_EQUAL, '']); + pointer = 0; + countDelete = 0; + countInsert = 0; + textDelete = ''; + textInsert = ''; + while (pointer < diffs.length) { + switch (diffs[pointer][0]) { + case DIFF_INSERT: + countInsert++; + textInsert += diffs[pointer][1]; + break; + case DIFF_DELETE: + countDelete++; + textDelete += diffs[pointer][1]; + break; + case DIFF_EQUAL: + if (countDelete >= 1 && countInsert >= 1) { + diffs.splice(pointer - countDelete - countInsert, countDelete + countInsert); + pointer = pointer - countDelete - countInsert; + a = this.DiffMain(textDelete, textInsert, false, deadline); + for (j = a.length - 1; j >= 0; j--) { + diffs.splice(pointer, 0, a[j]); + } + pointer = pointer + a.length; + } + countInsert = 0; + countDelete = 0; + textDelete = ''; + textInsert = ''; + break; + } + pointer++; + } + diffs.pop(); + return diffs; + }; + DiffMatchPatch.prototype.diffBisect = function (text1, text2, deadline) { + var text1Length, text2Length, maxD, vOffset, vLength, v1, v2, x, delta, front, k1start, k1end, k2start, k2end, k2Offset, k1Offset, x1, x2, y1, y2, d, k1, k2; + text1Length = text1.length; + text2Length = text2.length; + maxD = Math.ceil((text1Length + text2Length) / 2); + vOffset = maxD; + vLength = 2 * maxD; + v1 = new Array(vLength); + v2 = new Array(vLength); + for (x = 0; x < vLength; x++) { + v1[x] = -1; + v2[x] = -1; + } + v1[vOffset + 1] = 0; + v2[vOffset + 1] = 0; + delta = text1Length - text2Length; + front = delta % 2 !== 0; + k1start = 0; + k1end = 0; + k2start = 0; + k2end = 0; + for (d = 0; d < maxD; d++) { + if (new Date().getTime() > deadline) { + break; + } + for (k1 = -d + k1start; k1 <= d - k1end; k1 += 2) { + k1Offset = vOffset + k1; + if (k1 === -d || (k1 !== d && v1[k1Offset - 1] < v1[k1Offset + 1])) { + x1 = v1[k1Offset + 1]; + } + else { + x1 = v1[k1Offset - 1] + 1; + } + y1 = x1 - k1; + while (x1 < text1Length && y1 < text2Length && text1.charAt(x1) === text2.charAt(y1)) { + x1++; + y1++; + } + v1[k1Offset] = x1; + if (x1 > text1Length) { + k1end += 2; + } + else if (y1 > text2Length) { + k1start += 2; + } + else if (front) { + k2Offset = vOffset + delta - k1; + if (k2Offset >= 0 && k2Offset < vLength && v2[k2Offset] !== -1) { + x2 = text1Length - v2[k2Offset]; + if (x1 >= x2) { + return this.diffBisectSplit(text1, text2, x1, y1, deadline); + } + } + } + } + for (k2 = -d + k2start; k2 <= d - k2end; k2 += 2) { + k2Offset = vOffset + k2; + if (k2 === -d || (k2 !== d && v2[k2Offset - 1] < v2[k2Offset + 1])) { + x2 = v2[k2Offset + 1]; + } + else { + x2 = v2[k2Offset - 1] + 1; + } + y2 = x2 - k2; + while (x2 < text1Length && + y2 < text2Length && + text1.charAt(text1Length - x2 - 1) === text2.charAt(text2Length - y2 - 1)) { + x2++; + y2++; + } + v2[k2Offset] = x2; + if (x2 > text1Length) { + k2end += 2; + } + else if (y2 > text2Length) { + k2start += 2; + } + else if (!front) { + k1Offset = vOffset + delta - k2; + if (k1Offset >= 0 && k1Offset < vLength && v1[k1Offset] !== -1) { + x1 = v1[k1Offset]; + y1 = vOffset + x1 - k1Offset; + x2 = text1Length - x2; + if (x1 >= x2) { + return this.diffBisectSplit(text1, text2, x1, y1, deadline); + } + } + } + } + } + return [ + [DIFF_DELETE, text1], + [DIFF_INSERT, text2], + ]; + }; + DiffMatchPatch.prototype.diffBisectSplit = function (text1, text2, x, y, deadline) { + var text1a, text1b, text2a, text2b, diffs, diffsb; + text1a = text1.substring(0, x); + text2a = text2.substring(0, y); + text1b = text1.substring(x); + text2b = text2.substring(y); + diffs = this.DiffMain(text1a, text2a, false, deadline); + diffsb = this.DiffMain(text1b, text2b, false, deadline); + return diffs.concat(diffsb); + }; + DiffMatchPatch.prototype.diffCleanupSemantic = function (diffs) { + var changes, equalities, equalitiesLength, lastequality, pointer, lengthInsertions2, lengthDeletions2, lengthInsertions1, lengthDeletions1, deletion, insertion, overlapLength1, overlapLength2; + changes = false; + equalities = []; + equalitiesLength = 0; + lastequality = null; + pointer = 0; + lengthInsertions1 = 0; + lengthDeletions1 = 0; + lengthInsertions2 = 0; + lengthDeletions2 = 0; + while (pointer < diffs.length) { + if (diffs[pointer][0] === DIFF_EQUAL) { + equalities[equalitiesLength++] = pointer; + lengthInsertions1 = lengthInsertions2; + lengthDeletions1 = lengthDeletions2; + lengthInsertions2 = 0; + lengthDeletions2 = 0; + lastequality = diffs[pointer][1]; + } + else { + if (diffs[pointer][0] === DIFF_INSERT) { + lengthInsertions2 += diffs[pointer][1].length; + } + else { + lengthDeletions2 += diffs[pointer][1].length; + } + if (lastequality && + lastequality.length <= Math.max(lengthInsertions1, lengthDeletions1) && + lastequality.length <= Math.max(lengthInsertions2, lengthDeletions2)) { + diffs.splice(equalities[equalitiesLength - 1], 0, [DIFF_DELETE, lastequality]); + diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT; + equalitiesLength--; + equalitiesLength--; + pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1; + lengthInsertions1 = 0; + lengthDeletions1 = 0; + lengthInsertions2 = 0; + lengthDeletions2 = 0; + lastequality = null; + changes = true; + } + } + pointer++; + } + if (changes) { + this.diffCleanupMerge(diffs); + } + pointer = 1; + while (pointer < diffs.length) { + if (diffs[pointer - 1][0] === DIFF_DELETE && diffs[pointer][0] === DIFF_INSERT) { + deletion = diffs[pointer - 1][1]; + insertion = diffs[pointer][1]; + overlapLength1 = this.diffCommonOverlap(deletion, insertion); + overlapLength2 = this.diffCommonOverlap(insertion, deletion); + if (overlapLength1 >= overlapLength2) { + if (overlapLength1 >= deletion.length / 2 || overlapLength1 >= insertion.length / 2) { + diffs.splice(pointer, 0, [DIFF_EQUAL, insertion.substring(0, overlapLength1)]); + diffs[pointer - 1][1] = deletion.substring(0, deletion.length - overlapLength1); + diffs[pointer + 1][1] = insertion.substring(overlapLength1); + pointer++; + } + } + else { + if (overlapLength2 >= deletion.length / 2 || overlapLength2 >= insertion.length / 2) { + diffs.splice(pointer, 0, [DIFF_EQUAL, deletion.substring(0, overlapLength2)]); + diffs[pointer - 1][0] = DIFF_INSERT; + diffs[pointer - 1][1] = insertion.substring(0, insertion.length - overlapLength2); + diffs[pointer + 1][0] = DIFF_DELETE; + diffs[pointer + 1][1] = deletion.substring(overlapLength2); + pointer++; + } + } + pointer++; + } + pointer++; + } + }; + DiffMatchPatch.prototype.diffCommonOverlap = function (text1, text2) { + var text1Length, text2Length, textLength, best, length, pattern, found; + text1Length = text1.length; + text2Length = text2.length; + if (text1Length === 0 || text2Length === 0) { + return 0; + } + if (text1Length > text2Length) { + text1 = text1.substring(text1Length - text2Length); + } + else if (text1Length < text2Length) { + text2 = text2.substring(0, text1Length); + } + textLength = Math.min(text1Length, text2Length); + if (text1 === text2) { + return textLength; + } + best = 0; + length = 1; + while (true) { + pattern = text1.substring(textLength - length); + found = text2.indexOf(pattern); + if (found === -1) { + return best; + } + length += found; + if (found === 0 || text1.substring(textLength - length) === text2.substring(0, length)) { + best = length; + length++; + } + } + }; + DiffMatchPatch.prototype.diffLinesToChars = function (text1, text2) { + var lineArray, lineHash, chars1, chars2; + lineArray = []; + lineHash = {}; + lineArray[0] = ''; + function diffLinesToCharsMunge(text) { + var chars, lineStart, lineEnd, lineArrayLength, line; + chars = ''; + lineStart = 0; + lineEnd = -1; + lineArrayLength = lineArray.length; + while (lineEnd < text.length - 1) { + lineEnd = text.indexOf('\n', lineStart); + if (lineEnd === -1) { + lineEnd = text.length - 1; + } + line = text.substring(lineStart, lineEnd + 1); + lineStart = lineEnd + 1; + if (lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) : lineHash[line] !== undefined) { + chars += String.fromCharCode(lineHash[line]); + } + else { + chars += String.fromCharCode(lineArrayLength); + lineHash[line] = lineArrayLength; + lineArray[lineArrayLength++] = line; + } + } + return chars; + } + chars1 = diffLinesToCharsMunge(text1); + chars2 = diffLinesToCharsMunge(text2); + return { + chars1: chars1, + chars2: chars2, + lineArray: lineArray, + }; + }; + DiffMatchPatch.prototype.diffCharsToLines = function (diffs, lineArray) { + var x, chars, text, y; + for (x = 0; x < diffs.length; x++) { + chars = diffs[x][1]; + text = []; + for (y = 0; y < chars.length; y++) { + text[y] = lineArray[chars.charCodeAt(y)]; + } + diffs[x][1] = text.join(''); + } + }; + DiffMatchPatch.prototype.diffCleanupMerge = function (diffs) { + var pointer, countDelete, countInsert, textInsert, textDelete, commonlength, changes, diffPointer, position; + diffs.push([DIFF_EQUAL, '']); + pointer = 0; + countDelete = 0; + countInsert = 0; + textDelete = ''; + textInsert = ''; + commonlength; + while (pointer < diffs.length) { + switch (diffs[pointer][0]) { + case DIFF_INSERT: + countInsert++; + textInsert += diffs[pointer][1]; + pointer++; + break; + case DIFF_DELETE: + countDelete++; + textDelete += diffs[pointer][1]; + pointer++; + break; + case DIFF_EQUAL: + if (countDelete + countInsert > 1) { + if (countDelete !== 0 && countInsert !== 0) { + commonlength = this.diffCommonPrefix(textInsert, textDelete); + if (commonlength !== 0) { + if (pointer - countDelete - countInsert > 0 && + diffs[pointer - countDelete - countInsert - 1][0] === DIFF_EQUAL) { + diffs[pointer - countDelete - countInsert - 1][1] += textInsert.substring(0, commonlength); + } + else { + diffs.splice(0, 0, [DIFF_EQUAL, textInsert.substring(0, commonlength)]); + pointer++; + } + textInsert = textInsert.substring(commonlength); + textDelete = textDelete.substring(commonlength); + } + commonlength = this.diffCommonSuffix(textInsert, textDelete); + if (commonlength !== 0) { + diffs[pointer][1] = textInsert.substring(textInsert.length - commonlength) + diffs[pointer][1]; + textInsert = textInsert.substring(0, textInsert.length - commonlength); + textDelete = textDelete.substring(0, textDelete.length - commonlength); + } + } + if (countDelete === 0) { + diffs.splice(pointer - countInsert, countDelete + countInsert, [DIFF_INSERT, textInsert]); + } + else if (countInsert === 0) { + diffs.splice(pointer - countDelete, countDelete + countInsert, [DIFF_DELETE, textDelete]); + } + else { + diffs.splice(pointer - countDelete - countInsert, countDelete + countInsert, [DIFF_DELETE, textDelete], [DIFF_INSERT, textInsert]); + } + pointer = pointer - countDelete - countInsert + (countDelete ? 1 : 0) + (countInsert ? 1 : 0) + 1; + } + else if (pointer !== 0 && diffs[pointer - 1][0] === DIFF_EQUAL) { + diffs[pointer - 1][1] += diffs[pointer][1]; + diffs.splice(pointer, 1); + } + else { + pointer++; + } + countInsert = 0; + countDelete = 0; + textDelete = ''; + textInsert = ''; + break; + } + } + if (diffs[diffs.length - 1][1] === '') { + diffs.pop(); + } + changes = false; + pointer = 1; + while (pointer < diffs.length - 1) { + if (diffs[pointer - 1][0] === DIFF_EQUAL && diffs[pointer + 1][0] === DIFF_EQUAL) { + diffPointer = diffs[pointer][1]; + position = diffPointer.substring(diffPointer.length - diffs[pointer - 1][1].length); + if (position === diffs[pointer - 1][1]) { + diffs[pointer][1] = + diffs[pointer - 1][1] + + diffs[pointer][1].substring(0, diffs[pointer][1].length - diffs[pointer - 1][1].length); + diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1]; + diffs.splice(pointer - 1, 1); + changes = true; + } + else if (diffPointer.substring(0, diffs[pointer + 1][1].length) === diffs[pointer + 1][1]) { + diffs[pointer - 1][1] += diffs[pointer + 1][1]; + diffs[pointer][1] = diffs[pointer][1].substring(diffs[pointer + 1][1].length) + diffs[pointer + 1][1]; + diffs.splice(pointer + 1, 1); + changes = true; + } + } + pointer++; + } + if (changes) { + this.diffCleanupMerge(diffs); + } + }; + return function (o, n) { + var diff, output, text; + diff = new DiffMatchPatch(); + output = diff.DiffMain(o, n); + diff.diffCleanupEfficiency(output); + text = diff.diffPrettyHtml(output); + return text; + }; + })(); +})((function () { + return this; +})()); +(function () { + if (typeof window === 'undefined' || !window.document) { + return; + } + QUnit.init = function () { + var tests, banner, result, qunit, config = QUnit.config; + config.stats = { all: 0, bad: 0 }; + config.moduleStats = { all: 0, bad: 0 }; + config.started = 0; + config.updateRate = 1000; + config.blocking = false; + config.autostart = true; + config.autorun = false; + config.filter = ''; + config.queue = []; + if (typeof window === 'undefined') { + return; + } + qunit = id('qunit'); + if (qunit) { + qunit.innerHTML = + "

" + + escapeText(document.title) + + '

' + + "

" + + "
" + + "

" + + "
    "; + } + tests = id('qunit-tests'); + banner = id('qunit-banner'); + result = id('qunit-testresult'); + if (tests) { + tests.innerHTML = ''; + } + if (banner) { + banner.className = ''; + } + if (result) { + result.parentNode.removeChild(result); + } + if (tests) { + result = document.createElement('p'); + result.id = 'qunit-testresult'; + result.className = 'result'; + tests.parentNode.insertBefore(result, tests); + result.innerHTML = 'Running...
     '; + } + }; + var config = QUnit.config, hasOwn = Object.prototype.hasOwnProperty, defined = { + document: window.document !== undefined, + sessionStorage: (function () { + var x = 'qunit-test-string'; + try { + sessionStorage.setItem(x, x); + sessionStorage.removeItem(x); + return true; + } + catch (e) { + return false; + } + })(), + }, modulesList = []; + function escapeText(s) { + if (!s) { + return ''; + } + s = s + ''; + return s.replace(/['"<>&]/g, function (s) { + switch (s) { + case "'": + return '''; + case '"': + return '"'; + case '<': + return '<'; + case '>': + return '>'; + case '&': + return '&'; + } + }); + } + function addEvent(elem, type, fn) { + if (elem.addEventListener) { + elem.addEventListener(type, fn, false); + } + else if (elem.attachEvent) { + elem.attachEvent('on' + type, function () { + var event = window.event; + if (!event.target) { + event.target = event.srcElement || document; + } + fn.call(elem, event); + }); + } + } + function addEvents(elems, type, fn) { + var i = elems.length; + while (i--) { + addEvent(elems[i], type, fn); + } + } + function hasClass(elem, name) { + return (' ' + elem.className + ' ').indexOf(' ' + name + ' ') >= 0; + } + function addClass(elem, name) { + if (!hasClass(elem, name)) { + elem.className += (elem.className ? ' ' : '') + name; + } + } + function toggleClass(elem, name) { + if (hasClass(elem, name)) { + removeClass(elem, name); + } + else { + addClass(elem, name); + } + } + function removeClass(elem, name) { + var set = ' ' + elem.className + ' '; + while (set.indexOf(' ' + name + ' ') >= 0) { + set = set.replace(' ' + name + ' ', ' '); + } + elem.className = typeof set.trim === 'function' ? set.trim() : set.replace(/^\s+|\s+$/g, ''); + } + function id(name) { + return defined.document && document.getElementById && document.getElementById(name); + } + function getUrlConfigHtml() { + var i, j, val, escaped, escapedTooltip, selection = false, len = config.urlConfig.length, urlConfigHtml = ''; + for (i = 0; i < len; i++) { + val = config.urlConfig[i]; + if (typeof val === 'string') { + val = { + id: val, + label: val, + }; + } + escaped = escapeText(val.id); + escapedTooltip = escapeText(val.tooltip); + if (config[val.id] === undefined) { + config[val.id] = QUnit.urlParams[val.id]; + } + if (!val.value || typeof val.value === 'string') { + urlConfigHtml += + "'; + } + else { + urlConfigHtml += + "'; + } + } + return urlConfigHtml; + } + function toolbarChanged() { + var updatedUrl, value, field = this, params = {}; + if ('selectedIndex' in field) { + value = field.options[field.selectedIndex].value || undefined; + } + else { + value = field.checked ? field.defaultValue || true : undefined; + } + params[field.name] = value; + updatedUrl = setUrl(params); + if ('hidepassed' === field.name && 'replaceState' in window.history) { + config[field.name] = value || false; + if (value) { + addClass(id('qunit-tests'), 'hidepass'); + } + else { + removeClass(id('qunit-tests'), 'hidepass'); + } + window.history.replaceState(null, '', updatedUrl); + } + else { + window.location = updatedUrl; + } + } + function setUrl(params) { + var key, querystring = '?'; + params = QUnit.extend(QUnit.extend({}, QUnit.urlParams), params); + for (key in params) { + if (hasOwn.call(params, key)) { + if (params[key] === undefined) { + continue; + } + querystring += encodeURIComponent(key); + if (params[key] !== true) { + querystring += '=' + encodeURIComponent(params[key]); + } + querystring += '&'; + } + } + return location.protocol + '//' + location.host + location.pathname + querystring.slice(0, -1); + } + function applyUrlParams() { + var selectedModule, modulesList = id('qunit-modulefilter'), filter = id('qunit-filter-input').value; + selectedModule = modulesList ? decodeURIComponent(modulesList.options[modulesList.selectedIndex].value) : undefined; + window.location = setUrl({ + module: selectedModule === '' ? undefined : selectedModule, + filter: filter === '' ? undefined : filter, + testId: undefined, + }); + } + function toolbarUrlConfigContainer() { + var urlConfigContainer = document.createElement('span'); + urlConfigContainer.innerHTML = getUrlConfigHtml(); + addClass(urlConfigContainer, 'qunit-url-config'); + addEvents(urlConfigContainer.getElementsByTagName('input'), 'click', toolbarChanged); + addEvents(urlConfigContainer.getElementsByTagName('select'), 'change', toolbarChanged); + return urlConfigContainer; + } + function toolbarLooseFilter() { + var filter = document.createElement('form'), label = document.createElement('label'), input = document.createElement('input'), button = document.createElement('button'); + addClass(filter, 'qunit-filter'); + label.innerHTML = 'Filter: '; + input.type = 'text'; + input.value = config.filter || ''; + input.name = 'filter'; + input.id = 'qunit-filter-input'; + button.innerHTML = 'Go'; + label.appendChild(input); + filter.appendChild(label); + filter.appendChild(button); + addEvent(filter, 'submit', function (ev) { + applyUrlParams(); + if (ev && ev.preventDefault) { + ev.preventDefault(); + } + return false; + }); + return filter; + } + function toolbarModuleFilterHtml() { + var i, moduleFilterHtml = ''; + if (!modulesList.length) { + return false; + } + modulesList.sort(function (a, b) { + return a.localeCompare(b); + }); + moduleFilterHtml += + "" + + "'; + return moduleFilterHtml; + } + function toolbarModuleFilter() { + var toolbar = id('qunit-testrunner-toolbar'), moduleFilter = document.createElement('span'), moduleFilterHtml = toolbarModuleFilterHtml(); + if (!toolbar || !moduleFilterHtml) { + return false; + } + moduleFilter.setAttribute('id', 'qunit-modulefilter-container'); + moduleFilter.innerHTML = moduleFilterHtml; + addEvent(moduleFilter.lastChild, 'change', applyUrlParams); + toolbar.appendChild(moduleFilter); + } + function appendToolbar() { + var toolbar = id('qunit-testrunner-toolbar'); + if (toolbar) { + toolbar.appendChild(toolbarUrlConfigContainer()); + toolbar.appendChild(toolbarLooseFilter()); + } + } + function appendHeader() { + var header = id('qunit-header'); + if (header) { + header.innerHTML = + "" + + header.innerHTML + + ' '; + } + } + function appendBanner() { + var banner = id('qunit-banner'); + if (banner) { + banner.className = ''; + } + } + function appendTestResults() { + var tests = id('qunit-tests'), result = id('qunit-testresult'); + if (result) { + result.parentNode.removeChild(result); + } + if (tests) { + tests.innerHTML = ''; + result = document.createElement('p'); + result.id = 'qunit-testresult'; + result.className = 'result'; + tests.parentNode.insertBefore(result, tests); + result.innerHTML = 'Running...
     '; + } + } + function storeFixture() { + var fixture = id('qunit-fixture'); + if (fixture) { + config.fixture = fixture.innerHTML; + } + } + function appendUserAgent() { + var userAgent = id('qunit-userAgent'); + if (userAgent) { + userAgent.innerHTML = ''; + userAgent.appendChild(document.createTextNode('QUnit ' + QUnit.version + '; ' + navigator.userAgent)); + } + } + function appendTestsList(modules) { + var i, l, x, z, test, moduleObj; + for (i = 0, l = modules.length; i < l; i++) { + moduleObj = modules[i]; + if (moduleObj.name) { + modulesList.push(moduleObj.name); + } + for (x = 0, z = moduleObj.tests.length; x < z; x++) { + test = moduleObj.tests[x]; + appendTest(test.name, test.testId, moduleObj.name); + } + } + } + function appendTest(name, testId, moduleName) { + var title, rerunTrigger, testBlock, assertList, tests = id('qunit-tests'); + if (!tests) { + return; + } + title = document.createElement('strong'); + title.innerHTML = getNameHtml(name, moduleName); + rerunTrigger = document.createElement('a'); + rerunTrigger.innerHTML = 'Rerun'; + rerunTrigger.href = setUrl({ testId: testId }); + testBlock = document.createElement('li'); + testBlock.appendChild(title); + testBlock.appendChild(rerunTrigger); + testBlock.id = 'qunit-test-output-' + testId; + assertList = document.createElement('ol'); + assertList.className = 'qunit-assert-list'; + testBlock.appendChild(assertList); + tests.appendChild(testBlock); + } + QUnit.begin(function (details) { + var qunit = id('qunit'); + storeFixture(); + if (qunit) { + qunit.innerHTML = + "

    " + + escapeText(document.title) + + '

    ' + + "

    " + + "
    " + + "

    " + + "
      "; + } + appendHeader(); + appendBanner(); + appendTestResults(); + appendUserAgent(); + appendToolbar(); + appendTestsList(details.modules); + toolbarModuleFilter(); + if (qunit && config.hidepassed) { + addClass(qunit.lastChild, 'hidepass'); + } + }); + QUnit.done(function (details) { + var i, key, banner = id('qunit-banner'), tests = id('qunit-tests'), html = [ + 'Tests completed in ', + details.runtime, + ' milliseconds.
      ', + "", + details.passed, + " assertions of ", + details.total, + " passed, ", + details.failed, + ' failed.', + ].join(''); + if (banner) { + banner.className = details.failed ? 'qunit-fail' : 'qunit-pass'; + } + if (tests) { + id('qunit-testresult').innerHTML = html; + } + if (config.altertitle && defined.document && document.title) { + document.title = [details.failed ? '\u2716' : '\u2714', document.title.replace(/^[\u2714\u2716] /i, '')].join(' '); + } + if (config.reorder && defined.sessionStorage && details.failed === 0) { + for (i = 0; i < sessionStorage.length; i++) { + key = sessionStorage.key(i++); + if (key.indexOf('qunit-test-') === 0) { + sessionStorage.removeItem(key); + } + } + } + if (config.scrolltop && window.scrollTo) { + window.scrollTo(0, 0); + } + }); + function getNameHtml(name, module) { + var nameHtml = ''; + if (module) { + nameHtml = "" + escapeText(module) + ': '; + } + nameHtml += "" + escapeText(name) + ''; + return nameHtml; + } + QUnit.testStart(function (details) { + var running, testBlock, bad; + testBlock = id('qunit-test-output-' + details.testId); + if (testBlock) { + testBlock.className = 'running'; + } + else { + appendTest(details.name, details.testId, details.module); + } + running = id('qunit-testresult'); + if (running) { + bad = + QUnit.config.reorder && + defined.sessionStorage && + +sessionStorage.getItem('qunit-test-' + details.module + '-' + details.name); + running.innerHTML = + (bad ? 'Rerunning previously failed test:
      ' : 'Running:
      ') + + getNameHtml(details.name, details.module); + } + }); + function stripHtml(string) { + return string + .replace(/<\/?[^>]+(>|$)/g, '') + .replace(/\"/g, '') + .replace(/\s+/g, ''); + } + QUnit.log(function (details) { + var assertList, assertLi, message, expected, actual, diff, showDiff = false, testItem = id('qunit-test-output-' + details.testId); + if (!testItem) { + return; + } + message = escapeText(details.message) || (details.result ? 'okay' : 'failed'); + message = "" + message + ''; + message += "@ " + details.runtime + ' ms'; + if (!details.result && hasOwn.call(details, 'expected')) { + if (details.negative) { + expected = escapeText('NOT ' + QUnit.dump.parse(details.expected)); + } + else { + expected = escapeText(QUnit.dump.parse(details.expected)); + } + actual = escapeText(QUnit.dump.parse(details.actual)); + message += "'; + if (actual !== expected) { + message += "'; + if (!/^(true|false)$/.test(actual) && !/^(true|false)$/.test(expected)) { + diff = QUnit.diff(expected, actual); + showDiff = stripHtml(diff).length !== stripHtml(expected).length + stripHtml(actual).length; + } + if (showDiff) { + message += "'; + } + } + else if (expected.indexOf('[object Array]') !== -1 || expected.indexOf('[object Object]') !== -1) { + message += + "'; + } + if (details.source) { + message += + "'; + } + message += '
      Expected:
      " + expected + '
      Result:
      " + actual + '
      Diff:
      " + diff + '
      Message: " + + 'Diff suppressed as the depth of object is more than current max depth (' + + QUnit.config.maxDepth + + ').

      Hint: Use QUnit.dump.maxDepth to ' + + " run with a higher max depth or " + + 'Rerun without max depth.

      Source:
      " + escapeText(details.source) + '
      '; + } + else if (!details.result && details.source) { + message += + '' + + "' + + '
      Source:
      " +
      +                    escapeText(details.source) +
      +                    '
      '; + } + assertList = testItem.getElementsByTagName('ol')[0]; + assertLi = document.createElement('li'); + assertLi.className = details.result ? 'pass' : 'fail'; + assertLi.innerHTML = message; + assertList.appendChild(assertLi); + }); + QUnit.testDone(function (details) { + var testTitle, time, testItem, assertList, good, bad, testCounts, skipped, sourceName, tests = id('qunit-tests'); + if (!tests) { + return; + } + testItem = id('qunit-test-output-' + details.testId); + assertList = testItem.getElementsByTagName('ol')[0]; + good = details.passed; + bad = details.failed; + if (config.reorder && defined.sessionStorage) { + if (bad) { + sessionStorage.setItem('qunit-test-' + details.module + '-' + details.name, bad); + } + else { + sessionStorage.removeItem('qunit-test-' + details.module + '-' + details.name); + } + } + if (bad === 0) { + addClass(assertList, 'qunit-collapsed'); + } + testTitle = testItem.firstChild; + testCounts = bad ? "" + bad + ', ' + "" + good + ', ' : ''; + testTitle.innerHTML += " (" + testCounts + details.assertions.length + ')'; + if (details.skipped) { + testItem.className = 'skipped'; + skipped = document.createElement('em'); + skipped.className = 'qunit-skipped-label'; + skipped.innerHTML = 'skipped'; + testItem.insertBefore(skipped, testTitle); + } + else { + addEvent(testTitle, 'click', function () { + toggleClass(assertList, 'qunit-collapsed'); + }); + testItem.className = bad ? 'fail' : 'pass'; + time = document.createElement('span'); + time.className = 'runtime'; + time.innerHTML = details.runtime + ' ms'; + testItem.insertBefore(time, assertList); + } + if (details.source) { + sourceName = document.createElement('p'); + sourceName.innerHTML = 'Source: ' + details.source; + addClass(sourceName, 'qunit-source'); + if (bad === 0) { + addClass(sourceName, 'qunit-collapsed'); + } + addEvent(testTitle, 'click', function () { + toggleClass(sourceName, 'qunit-collapsed'); + }); + testItem.appendChild(sourceName); + } + }); + if (defined.document) { + var notPhantom = (function (p) { + return !(p && p.version && p.version.major > 0); + })(window.phantom); + if (notPhantom && document.readyState === 'complete') { + QUnit.load(); + } + else { + addEvent(window, 'load', QUnit.load); + } + } + else { + config.pageLoaded = true; + config.autorun = true; + } +})(); diff --git a/build/esm/tests/tabnote_tests.js b/build/esm/tests/tabnote_tests.js new file mode 100644 index 0000000000..1cfbba3a6f --- /dev/null +++ b/build/esm/tests/tabnote_tests.js @@ -0,0 +1,474 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Dot } from '../src/dot.js'; +import { Flow } from '../src/flow.js'; +import { Font, FontWeight } from '../src/font.js'; +import { Formatter } from '../src/formatter.js'; +import { Stave } from '../src/stave.js'; +import { TabNote } from '../src/tabnote.js'; +import { TabStave } from '../src/tabstave.js'; +import { TickContext } from '../src/tickcontext.js'; +import { Voice, VoiceMode } from '../src/voice.js'; +const TabNoteTests = { + Start() { + QUnit.module('TabNote'); + test('Tick', ticks); + test('TabStave Line', tabStaveLine); + test('Width', width); + test('TickContext', tickContext); + const run = VexFlowTests.runTests; + run('TabNote Draw', draw); + run('TabNote Stems Up', drawStemsUp); + run('TabNote Stems Down', drawStemsDown); + run('TabNote Stems Up Through Stave', drawStemsUpThrough); + run('TabNote Stems Down Through Stave', drawStemsDownThrough); + run('TabNote Stems with Dots', drawStemsDotted); + }, +}; +function ticks() { + const BEAT = (1 * Flow.RESOLUTION) / 4; + let note = new TabNote({ positions: [{ str: 6, fret: 6 }], duration: '1' }); + equal(note.getTicks().value(), BEAT * 4, 'Whole note has 4 beats'); + note = new TabNote({ positions: [{ str: 3, fret: 4 }], duration: '4' }); + equal(note.getTicks().value(), BEAT, 'Quarter note has 1 beat'); +} +function tabStaveLine() { + const note = new TabNote({ + positions: [ + { str: 6, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '1', + }); + const positions = note.getPositions(); + equal(positions[0].str, 6, 'String 6, Fret 6'); + equal(positions[0].fret, 6, 'String 6, Fret 6'); + equal(positions[1].str, 4, 'String 4, Fret 5'); + equal(positions[1].fret, 5, 'String 4, Fret 5'); + const stave = new Stave(10, 10, 300); + note.setStave(stave); + const ys = note.getYs(); + equal(ys.length, 2, 'Chord should be rendered on two lines'); + equal(ys[0], 100, 'Line for String 6, Fret 6'); + equal(ys[1], 80, 'Line for String 4, Fret 5'); +} +function width() { + expect(1); + const note = new TabNote({ + positions: [ + { str: 6, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '1', + }); + throws(() => note.getWidth(), /UnformattedNote/, 'Unformatted note should have no width'); +} +function tickContext() { + const note = new TabNote({ + positions: [ + { str: 6, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '1', + }); + const tickContext = new TickContext().addTickable(note).preFormat().setX(10).setPadding(0); + equal(tickContext.getWidth(), 7); +} +function draw(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 600, 140); + ctx.font = '10pt Arial'; + const stave = new TabStave(10, 10, 550); + stave.setContext(ctx); + stave.draw(); + const notes = [ + { positions: [{ str: 6, fret: 6 }], duration: '4' }, + { + positions: [ + { str: 3, fret: 6 }, + { str: 4, fret: 25 }, + ], + duration: '4', + }, + { + positions: [ + { str: 2, fret: 'x' }, + { str: 5, fret: 15 }, + ], + duration: '4', + }, + { + positions: [ + { str: 2, fret: 'x' }, + { str: 5, fret: 5 }, + ], + duration: '4', + }, + { + positions: [ + { str: 2, fret: 10 }, + { str: 5, fret: 12 }, + ], + duration: '4', + }, + { + positions: [ + { str: 6, fret: 0 }, + { str: 5, fret: 5 }, + { str: 4, fret: 5 }, + { str: 3, fret: 4 }, + { str: 2, fret: 3 }, + { str: 1, fret: 0 }, + ], + duration: '4', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '4', + }, + ]; + function showNote(noteStruct, stave, ctx, x) { + const tabNote = new TabNote(noteStruct); + const tickContext = new TickContext(); + tickContext.addTickable(tabNote).preFormat().setX(x); + tabNote.setContext(ctx).setStave(stave); + tabNote.draw(); + return tabNote; + } + for (let i = 0; i < notes.length; ++i) { + const note = notes[i]; + const tabNote = showNote(note, stave, ctx, (i + 1) * 25); + ok(tabNote.getX() > 0, 'Note ' + i + ' has X value'); + ok(tabNote.getYs().length > 0, 'Note ' + i + ' has Y values'); + } +} +function drawStemsUp(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 600, 200); + ctx.font = '10pt Arial'; + const stave = new TabStave(10, 30, 550); + stave.setContext(ctx); + stave.draw(); + const specs = [ + { + positions: [ + { str: 3, fret: 6 }, + { str: 4, fret: 25 }, + ], + duration: '4', + }, + { + positions: [ + { str: 2, fret: 10 }, + { str: 5, fret: 12 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '16', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '32', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '64', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '128', + }, + ]; + const notes = specs.map((struct) => { + const tabNote = new TabNote(struct); + tabNote.render_options.draw_stem = true; + return tabNote; + }); + const voice = new Voice(Flow.TIME4_4).setMode(VoiceMode.SOFT); + voice.addTickables(notes); + new Formatter().joinVoices([voice]).formatToStave([voice], stave); + voice.draw(ctx, stave); + ok(true, 'TabNotes successfully drawn'); +} +function drawStemsDown(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 600, 200); + ctx.font = '10pt Arial'; + const stave = new TabStave(10, 10, 550); + stave.setContext(ctx); + stave.draw(); + const specs = [ + { + positions: [ + { str: 3, fret: 6 }, + { str: 4, fret: 25 }, + ], + duration: '4', + }, + { + positions: [ + { str: 2, fret: 10 }, + { str: 5, fret: 12 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '16', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '32', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '64', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '128', + }, + ]; + const notes = specs.map((struct) => { + const tabNote = new TabNote(struct); + tabNote.render_options.draw_stem = true; + tabNote.setStemDirection(-1); + return tabNote; + }); + const voice = new Voice(Flow.TIME4_4).setMode(VoiceMode.SOFT); + voice.addTickables(notes); + new Formatter().joinVoices([voice]).formatToStave([voice], stave); + voice.draw(ctx, stave); + ok(true, 'All objects have been drawn'); +} +function drawStemsUpThrough(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 600, 200); + ctx.font = '10pt Arial'; + const stave = new TabStave(10, 30, 550); + stave.setContext(ctx); + stave.draw(); + const specs = [ + { + positions: [ + { str: 3, fret: 6 }, + { str: 4, fret: 25 }, + ], + duration: '4', + }, + { + positions: [ + { str: 2, fret: 10 }, + { str: 5, fret: 12 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '16', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '32', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '64', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '128', + }, + ]; + const notes = specs.map((struct) => { + const tabNote = new TabNote(struct); + tabNote.render_options.draw_stem = true; + tabNote.render_options.draw_stem_through_stave = true; + return tabNote; + }); + ctx.setFont(Font.SANS_SERIF, 10, FontWeight.BOLD); + const voice = new Voice(Flow.TIME4_4).setMode(VoiceMode.SOFT); + voice.addTickables(notes); + new Formatter().joinVoices([voice]).formatToStave([voice], stave); + voice.draw(ctx, stave); + ok(true, 'TabNotes successfully drawn'); +} +function drawStemsDownThrough(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 600, 250); + ctx.font = '10pt Arial'; + const stave = new TabStave(10, 10, 550, { num_lines: 8 }); + stave.setContext(ctx); + stave.draw(); + const specs = [ + { + positions: [ + { str: 3, fret: 6 }, + { str: 4, fret: 25 }, + ], + duration: '4', + }, + { + positions: [ + { str: 2, fret: 10 }, + { str: 5, fret: 12 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '16', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + { str: 6, fret: 10 }, + ], + duration: '32', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '64', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 3, fret: 5 }, + { str: 5, fret: 5 }, + { str: 7, fret: 5 }, + ], + duration: '128', + }, + ]; + const notes = specs.map((struct) => { + const tabNote = new TabNote(struct); + tabNote.render_options.draw_stem = true; + tabNote.render_options.draw_stem_through_stave = true; + tabNote.setStemDirection(-1); + return tabNote; + }); + ctx.setFont('Arial', 10, 'bold'); + const voice = new Voice(Flow.TIME4_4).setMode(VoiceMode.SOFT); + voice.addTickables(notes); + new Formatter().joinVoices([voice]).formatToStave([voice], stave); + voice.draw(ctx, stave); + ok(true, 'All objects have been drawn'); +} +function drawStemsDotted(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 600, 200); + ctx.font = '10pt Arial'; + const stave = new TabStave(10, 10, 550); + stave.setContext(ctx); + stave.draw(); + const specs = [ + { + positions: [ + { str: 3, fret: 6 }, + { str: 4, fret: 25 }, + ], + duration: '4d', + }, + { + positions: [ + { str: 2, fret: 10 }, + { str: 5, fret: 12 }, + ], + duration: '8', + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '4dd', + stem_direction: -1, + }, + { + positions: [ + { str: 1, fret: 6 }, + { str: 4, fret: 5 }, + ], + duration: '16', + stem_direction: -1, + }, + ]; + const notes = specs.map((struct) => new TabNote(struct, true)); + Dot.buildAndAttach([notes[0], notes[2], notes[2]]); + const voice = new Voice(Flow.TIME4_4).setMode(VoiceMode.SOFT); + voice.addTickables(notes); + new Formatter().joinVoices([voice]).formatToStave([voice], stave); + voice.draw(ctx, stave); + ok(true, 'TabNotes successfully drawn'); +} +VexFlowTests.register(TabNoteTests); +export { TabNoteTests }; diff --git a/build/esm/tests/tabslide_tests.js b/build/esm/tests/tabslide_tests.js new file mode 100644 index 0000000000..9d68fcda16 --- /dev/null +++ b/build/esm/tests/tabslide_tests.js @@ -0,0 +1,135 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Flow } from '../src/flow.js'; +import { Formatter } from '../src/formatter.js'; +import { TabNote } from '../src/tabnote.js'; +import { TabSlide } from '../src/tabslide.js'; +import { TabStave } from '../src/tabstave.js'; +import { Voice } from '../src/voice.js'; +const TabSlideTests = { + Start() { + QUnit.module('TabSlide'); + const run = VexFlowTests.runTests; + run('Simple TabSlide', simple); + run('Slide Up', slideUp); + run('Slide Down', slideDown); + }, +}; +function tieNotes(notes, indices, stave, ctx) { + const voice = new Voice(Flow.TIME4_4); + voice.addTickables(notes); + new Formatter().joinVoices([voice]).format([voice], 100); + voice.draw(ctx, stave); + const tie = new TabSlide({ + first_note: notes[0], + last_note: notes[1], + first_indices: indices, + last_indices: indices, + }, TabSlide.SLIDE_UP); + tie.setContext(ctx); + tie.draw(); +} +function setupContext(options, width) { + const context = options.contextBuilder(options.elementId, 350, 140); + context.scale(0.9, 0.9); + context.fillStyle = '#221'; + context.strokeStyle = '#221'; + context.font = '10pt Arial'; + const stave = new TabStave(10, 10, width || 350).addTabGlyph().setContext(context).draw(); + return { context, stave }; +} +const tabNote = (noteStruct) => new TabNote(noteStruct); +function simple(options, contextBuilder) { + options.contextBuilder = contextBuilder; + const { stave, context } = setupContext(options); + tieNotes([ + tabNote({ positions: [{ str: 4, fret: 4 }], duration: 'h' }), + tabNote({ positions: [{ str: 4, fret: 6 }], duration: 'h' }), + ], [0], stave, context); + ok(true, 'Simple Test'); +} +function multiTest(options, buildTabSlide) { + const { context, stave } = setupContext(options, 440); + const notes = [ + tabNote({ positions: [{ str: 4, fret: 4 }], duration: '8' }), + tabNote({ positions: [{ str: 4, fret: 4 }], duration: '8' }), + tabNote({ + positions: [ + { str: 4, fret: 4 }, + { str: 5, fret: 4 }, + ], + duration: '8', + }), + tabNote({ + positions: [ + { str: 4, fret: 6 }, + { str: 5, fret: 6 }, + ], + duration: '8', + }), + tabNote({ positions: [{ str: 2, fret: 14 }], duration: '8' }), + tabNote({ positions: [{ str: 2, fret: 16 }], duration: '8' }), + tabNote({ + positions: [ + { str: 2, fret: 14 }, + { str: 3, fret: 14 }, + ], + duration: '8', + }), + tabNote({ + positions: [ + { str: 2, fret: 16 }, + { str: 3, fret: 16 }, + ], + duration: '8', + }), + ]; + const voice = new Voice(Flow.TIME4_4).addTickables(notes); + new Formatter().joinVoices([voice]).format([voice], 300); + voice.draw(context, stave); + buildTabSlide({ + first_note: notes[0], + last_note: notes[1], + first_indices: [0], + last_indices: [0], + }) + .setContext(context) + .draw(); + ok(true, 'Single note'); + buildTabSlide({ + first_note: notes[2], + last_note: notes[3], + first_indices: [0, 1], + last_indices: [0, 1], + }) + .setContext(context) + .draw(); + ok(true, 'Chord'); + buildTabSlide({ + first_note: notes[4], + last_note: notes[5], + first_indices: [0], + last_indices: [0], + }) + .setContext(context) + .draw(); + ok(true, 'Single note high-fret'); + buildTabSlide({ + first_note: notes[6], + last_note: notes[7], + first_indices: [0, 1], + last_indices: [0, 1], + }) + .setContext(context) + .draw(); + ok(true, 'Chord high-fret'); +} +function slideUp(options, contextBuilder) { + options.contextBuilder = contextBuilder; + multiTest(options, TabSlide.createSlideUp); +} +function slideDown(options, contextBuilder) { + options.contextBuilder = contextBuilder; + multiTest(options, TabSlide.createSlideDown); +} +VexFlowTests.register(TabSlideTests); +export { TabSlideTests }; diff --git a/build/esm/tests/tabstave_tests.js b/build/esm/tests/tabstave_tests.js new file mode 100644 index 0000000000..791d933fa7 --- /dev/null +++ b/build/esm/tests/tabstave_tests.js @@ -0,0 +1,23 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { TabStave } from '../src/tabstave.js'; +const TabStaveTests = { + Start() { + QUnit.module('TabStave'); + const run = VexFlowTests.runTests; + run('TabStave Draw Test', draw); + }, +}; +function draw(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 160); + const stave = new TabStave(10, 10, 300); + stave.setNumLines(6); + stave.setContext(ctx); + stave.draw(); + equal(stave.getYForNote(0), 127, 'getYForNote(0)'); + equal(stave.getYForLine(5), 127, 'getYForLine(5)'); + equal(stave.getYForLine(0), 62, 'getYForLine(0) - Top Line'); + equal(stave.getYForLine(4), 114, 'getYForLine(4) - Bottom Line'); + ok(true, 'all pass'); +} +VexFlowTests.register(TabStaveTests); +export { TabStaveTests }; diff --git a/build/esm/tests/tabtie_tests.js b/build/esm/tests/tabtie_tests.js new file mode 100644 index 0000000000..f31b77ebd9 --- /dev/null +++ b/build/esm/tests/tabtie_tests.js @@ -0,0 +1,173 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Annotation } from '../src/annotation.js'; +import { Flow } from '../src/flow.js'; +import { Formatter } from '../src/formatter.js'; +import { TabNote } from '../src/tabnote.js'; +import { TabStave } from '../src/tabstave.js'; +import { TabTie } from '../src/tabtie.js'; +import { Voice } from '../src/voice.js'; +const TabTieTests = { + Start() { + QUnit.module('TabTie'); + const run = VexFlowTests.runTests; + run('Simple TabTie', simple); + run('Hammerons', simpleHammerOn); + run('Pulloffs', simplePullOff); + run('Tapping', tap); + run('Continuous', continuous); + }, +}; +const tabNote = (noteStruct) => new TabNote(noteStruct); +function setupContext(options, w = 0, h = 0) { + const context = options.contextBuilder(options.elementId, w || 350, h || 160); + context.fillStyle = '#221'; + context.strokeStyle = '#221'; + context.setFont('Arial', VexFlowTests.Font.size); + const stave = new TabStave(10, 10, w || 350).addTabGlyph().setContext(context).draw(); + return { context, stave }; +} +function tieNotes(notes, indices, stave, ctx, text) { + const voice = new Voice(Flow.TIME4_4); + voice.addTickables(notes); + new Formatter().joinVoices([voice]).format([voice], 100); + voice.draw(ctx, stave); + const tie = new TabTie({ + first_note: notes[0], + last_note: notes[1], + first_indices: indices, + last_indices: indices, + }, text !== null && text !== void 0 ? text : 'Annotation'); + tie.setContext(ctx); + tie.draw(); +} +function simple(options, contextBuilder) { + options.contextBuilder = contextBuilder; + const { context, stave } = setupContext(options); + const note1 = tabNote({ positions: [{ str: 4, fret: 4 }], duration: 'h' }); + const note2 = tabNote({ positions: [{ str: 4, fret: 6 }], duration: 'h' }); + tieNotes([note1, note2], [0], stave, context); + ok(true, 'Simple Test'); +} +function simpleHammerOn(options, contextBuilder) { + options.contextBuilder = contextBuilder; + multiTest(options, TabTie.createHammeron); +} +function simplePullOff(options, contextBuilder) { + options.contextBuilder = contextBuilder; + multiTest(options, TabTie.createPulloff); +} +function multiTest(options, createTabTie) { + const { context, stave } = setupContext(options, 440, 140); + const notes = [ + tabNote({ positions: [{ str: 4, fret: 4 }], duration: '8' }), + tabNote({ positions: [{ str: 4, fret: 4 }], duration: '8' }), + tabNote({ + positions: [ + { str: 4, fret: 4 }, + { str: 5, fret: 4 }, + ], + duration: '8', + }), + tabNote({ + positions: [ + { str: 4, fret: 6 }, + { str: 5, fret: 6 }, + ], + duration: '8', + }), + tabNote({ positions: [{ str: 2, fret: 14 }], duration: '8' }), + tabNote({ positions: [{ str: 2, fret: 16 }], duration: '8' }), + tabNote({ + positions: [ + { str: 2, fret: 14 }, + { str: 3, fret: 14 }, + ], + duration: '8', + }), + tabNote({ + positions: [ + { str: 2, fret: 16 }, + { str: 3, fret: 16 }, + ], + duration: '8', + }), + ]; + const voice = new Voice(Flow.TIME4_4).addTickables(notes); + new Formatter().joinVoices([voice]).format([voice], 300); + voice.draw(context, stave); + createTabTie({ + first_note: notes[0], + last_note: notes[1], + first_indices: [0], + last_indices: [0], + }) + .setContext(context) + .draw(); + ok(true, 'Single note'); + createTabTie({ + first_note: notes[2], + last_note: notes[3], + first_indices: [0, 1], + last_indices: [0, 1], + }) + .setContext(context) + .draw(); + ok(true, 'Chord'); + createTabTie({ + first_note: notes[4], + last_note: notes[5], + first_indices: [0], + last_indices: [0], + }) + .setContext(context) + .draw(); + ok(true, 'Single note high-fret'); + createTabTie({ + first_note: notes[6], + last_note: notes[7], + first_indices: [0, 1], + last_indices: [0, 1], + }) + .setContext(context) + .draw(); + ok(true, 'Chord high-fret'); +} +function tap(options, contextBuilder) { + options.contextBuilder = contextBuilder; + const { context, stave } = setupContext(options); + const note1 = tabNote({ positions: [{ str: 4, fret: 12 }], duration: 'h' }).addModifier(new Annotation('T'), 0); + const note2 = tabNote({ positions: [{ str: 4, fret: 10 }], duration: 'h' }); + tieNotes([note1, note2], [0], stave, context, 'P'); + ok(true, 'Tapping Test'); +} +function continuous(options, contextBuilder) { + options.contextBuilder = contextBuilder; + const { context, stave } = setupContext(options, 440, 140); + const notes = [ + tabNote({ positions: [{ str: 4, fret: 4 }], duration: 'q' }), + tabNote({ positions: [{ str: 4, fret: 5 }], duration: 'q' }), + tabNote({ positions: [{ str: 4, fret: 6 }], duration: 'h' }), + ]; + const voice = new Voice(Flow.TIME4_4).addTickables(notes); + new Formatter().joinVoices([voice]).format([voice], 300); + voice.draw(context, stave); + TabTie.createHammeron({ + first_note: notes[0], + last_note: notes[1], + first_indices: [0], + last_indices: [0], + }) + .setContext(context) + .draw(); + TabTie.createPulloff({ + first_note: notes[1], + last_note: notes[2], + first_indices: [0], + last_indices: [0], + }) + .setContext(context) + .draw(); + ok(true, 'Continuous Hammeron'); +} +VexFlowTests.register(TabTieTests); +export { TabTieTests }; diff --git a/build/esm/tests/textbracket_tests.js b/build/esm/tests/textbracket_tests.js new file mode 100644 index 0000000000..16dd574984 --- /dev/null +++ b/build/esm/tests/textbracket_tests.js @@ -0,0 +1,100 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +const TextBracketTests = { + Start() { + QUnit.module('TextBracket'); + const run = VexFlowTests.runTests; + run('Simple TextBracket', simple0); + run('TextBracket Styles', simple1); + }, +}; +function simple0(options) { + const f = VexFlowTests.makeFactory(options, 550); + const stave = f.Stave(); + const score = f.EasyScore(); + const notes = score.notes('c4/4, c4, c4, c4, c4', { stem: 'up' }); + const voice = score.voice(notes, { time: '5/4' }); + f.TextBracket({ + from: notes[0], + to: notes[4], + text: '15', + options: { + superscript: 'va', + position: 'top', + }, + }); + f.TextBracket({ + from: notes[0], + to: notes[4], + text: '8', + options: { + superscript: 'vb', + position: 'bottom', + line: 3, + }, + }); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true); +} +function simple1(options) { + const f = VexFlowTests.makeFactory(options, 550); + const stave = f.Stave(); + const score = f.EasyScore(); + const notes = score.notes('c4/4, c4, c4, c4, c4', { stem: 'up' }); + const voice = score.voice(notes, { time: '5/4' }); + const topOctaves = [ + f.TextBracket({ + from: notes[0], + to: notes[1], + text: 'Cool notes', + options: { + superscript: '', + position: 'top', + }, + }), + f.TextBracket({ + from: notes[2], + to: notes[4], + text: 'Testing', + options: { + position: 'top', + superscript: 'superscript', + font: { family: 'Arial', size: 15, weight: 'normal', style: 'normal' }, + }, + }), + ]; + const bottomOctaves = [ + f.TextBracket({ + from: notes[0], + to: notes[1], + text: '8', + options: { + superscript: 'vb', + position: 'bottom', + line: 3, + font: { size: 30 }, + }, + }), + f.TextBracket({ + from: notes[2], + to: notes[4], + text: 'Not cool notes', + options: { + superscript: ' super uncool', + position: 'bottom', + line: 4, + }, + }), + ]; + topOctaves[1].render_options.line_width = 2; + topOctaves[1].render_options.show_bracket = false; + bottomOctaves[0].render_options.underline_superscript = false; + bottomOctaves[0].setDashed(false); + bottomOctaves[1].render_options.bracket_height = 40; + bottomOctaves[1].setDashed(true, [2, 2]); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true); +} +VexFlowTests.register(TextBracketTests); +export { TextBracketTests }; diff --git a/build/esm/tests/textformatter_tests.js b/build/esm/tests/textformatter_tests.js new file mode 100644 index 0000000000..ce475c8c76 --- /dev/null +++ b/build/esm/tests/textformatter_tests.js @@ -0,0 +1,24 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { TextFormatter } from '../src/textformatter.js'; +const TextFormatterTests = { + Start() { + QUnit.module('TextFormatter'); + test('Basic', basic); + }, +}; +function basic() { + var _a; + const registeredFamilies = TextFormatter.getFontFamilies(); + equal(registeredFamilies.length, 2, `There are two registered font families: 'Roboto Slab' & 'PetalumaScript'`); + const petalumaFormatterInfo = TextFormatter.getInfo('PetalumaScript'); + equal((_a = petalumaFormatterInfo === null || petalumaFormatterInfo === void 0 ? void 0 : petalumaFormatterInfo.glyphs) === null || _a === void 0 ? void 0 : _a.C.advanceWidth, 623, 'PetalumaScript advanceWidth of C character is 623.'); + const formatterForPetalumaScript = TextFormatter.create({ family: 'PetalumaScript', size: '100px' }); + const metricsPetalumaScriptH = formatterForPetalumaScript.getGlyphMetrics('H'); + equal(metricsPetalumaScriptH.leftSideBearing, 37); + const formatterForRobotoSlab = TextFormatter.create({ family: 'Roboto Slab', size: '100px', style: 'italic' }); + const metricsRobotoSlabH = formatterForRobotoSlab.getGlyphMetrics('H'); + equal(metricsRobotoSlabH.advanceWidth, 1578); + equal(formatterForRobotoSlab.cacheKey, 'Roboto_Slab%75%normal%normal'); +} +VexFlowTests.register(TextFormatterTests); +export { TextFormatterTests }; diff --git a/build/esm/tests/textnote_tests.js b/build/esm/tests/textnote_tests.js new file mode 100644 index 0000000000..bf388d4b1e --- /dev/null +++ b/build/esm/tests/textnote_tests.js @@ -0,0 +1,215 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Crescendo } from '../src/crescendo.js'; +import { Flow } from '../src/flow.js'; +import { Font } from '../src/font.js'; +import { Note } from '../src/note.js'; +import { Stave } from '../src/stave.js'; +import { TextNote } from '../src/textnote.js'; +const TextNoteTests = { + Start() { + QUnit.module('TextNote'); + const run = VexFlowTests.runTests; + run('TextNote Formatting', formatTextNotes); + run('TextNote Formatting 2', formatTextNotes2); + run('TextNote Superscript and Subscript', superscriptAndSubscript); + run('TextNote Formatting With Glyphs 0', formatTextGlyphs0); + run('TextNote Formatting With Glyphs 1', formatTextGlyphs1); + run('Crescendo', crescendo); + run('Text Dynamics', textDynamics); + }, +}; +function formatTextNotes(options) { + const f = VexFlowTests.makeFactory(options, 400, 200); + const stave = f.Stave({ y: 40 }); + const score = f.EasyScore(); + const voice1 = score.voice([ + f + .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], stem_direction: -1, duration: 'h' }) + .addModifier(f.Accidental({ type: 'b' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1), + f.StaveNote({ keys: ['d/4', 'e/4', 'f/4'], stem_direction: -1, duration: 'q' }), + f + .StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: 'q' }) + .addModifier(f.Accidental({ type: 'n' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1), + ]); + const voice2 = score.voice([ + f.TextNote({ text: 'Center Justification', duration: 'h' }).setJustification(TextNote.Justification.CENTER), + f.TextNote({ text: 'Left Line 1', duration: 'q' }).setLine(1), + f.TextNote({ text: 'Right', duration: 'q' }).setJustification(TextNote.Justification.RIGHT), + ]); + const formatter = f.Formatter(); + formatter.joinVoices([voice1, voice2]).formatToStave([voice1, voice2], stave); + f.draw(); + ok(true); +} +function formatTextNotes2(options) { + const f = VexFlowTests.makeFactory(options, 600, 200); + const stave = f.Stave({ y: 40 }); + const score = f.EasyScore(); + const voice1 = score.voice([ + f.StaveNote({ keys: ['g/4'], stem_direction: 1, duration: '16' }), + f.StaveNote({ keys: ['g/4'], stem_direction: 1, duration: '16' }), + f.StaveNote({ keys: ['g/4'], stem_direction: 1, duration: '16' }), + f.StaveNote({ keys: ['g/5'], stem_direction: -1, duration: '16' }), + f.StaveNote({ keys: ['g/5'], stem_direction: -1, duration: '16' }), + f.StaveNote({ keys: ['g/5'], stem_direction: -1, duration: '16' }), + f.StaveNote({ keys: ['g/5', 'a/5'], stem_direction: -1, duration: '16' }), + f.StaveNote({ keys: ['g/5', 'a/5'], stem_direction: -1, duration: '16' }), + f.StaveNote({ keys: ['g/5', 'a/5'], stem_direction: -1, duration: '16' }), + f.StaveNote({ keys: ['g/4', 'a/4'], stem_direction: 1, duration: '16' }), + f.StaveNote({ keys: ['g/4', 'a/4'], stem_direction: 1, duration: '16' }), + f.StaveNote({ keys: ['g/4', 'a/4'], stem_direction: 1, duration: '16' }), + f.StaveNote({ keys: ['g/4', 'a/4'], stem_direction: 1, duration: 'q' }), + ]); + const voice2 = score.voice([ + f.TextNote({ text: 'C', duration: '16' }).setJustification(TextNote.Justification.CENTER), + f.TextNote({ text: 'L', duration: '16' }), + f.TextNote({ text: 'R', duration: '16' }).setJustification(TextNote.Justification.RIGHT), + f.TextNote({ text: 'C', duration: '16' }).setJustification(TextNote.Justification.CENTER), + f.TextNote({ text: 'L', duration: '16' }), + f.TextNote({ text: 'R', duration: '16' }).setJustification(TextNote.Justification.RIGHT), + f.TextNote({ text: 'C', duration: '16' }).setJustification(TextNote.Justification.CENTER), + f.TextNote({ text: 'L', duration: '16' }), + f.TextNote({ text: 'R', duration: '16' }).setJustification(TextNote.Justification.RIGHT), + f.TextNote({ text: 'C', duration: '16' }).setJustification(TextNote.Justification.CENTER), + f.TextNote({ text: 'L', duration: '16' }), + f.TextNote({ text: 'R', duration: '16' }).setJustification(TextNote.Justification.RIGHT), + f.TextNote({ text: 'R', duration: 'q' }).setJustification(TextNote.Justification.RIGHT), + ]); + f.Formatter().joinVoices([voice1, voice2]).formatToStave([voice1, voice2], stave); + voice2.getTickables().forEach((note) => Note.plotMetrics(f.getContext(), note, 170)); + f.draw(); + ok(true); +} +function superscriptAndSubscript(options) { + const f = VexFlowTests.makeFactory(options, 600, 230); + const stave = f.Stave({ y: 40 }); + const score = f.EasyScore(); + const voice1 = score.voice([ + f + .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], stem_direction: 1, duration: 'h' }) + .addModifier(f.Accidental({ type: 'b' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1), + f.StaveNote({ keys: ['d/4', 'e/4', 'f/4'], stem_direction: 1, duration: 'q' }), + f + .StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: 1, duration: 'q' }) + .addModifier(f.Accidental({ type: 'n' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1), + ]); + const voice2 = score.voice([ + f.TextNote({ text: Flow.unicode.flat + 'I', superscript: '+5', duration: '8' }), + f.TextNote({ text: 'D' + Flow.unicode.sharp + '/F', duration: '4d', superscript: 'sus2' }), + f.TextNote({ text: 'ii', superscript: '6', subscript: '4', duration: '8' }), + f.TextNote({ text: 'C', superscript: Flow.unicode.triangle + '7', subscript: '', duration: '8' }), + f.TextNote({ text: 'vii', superscript: Flow.unicode['o-with-slash'] + '7', duration: '8' }), + f.TextNote({ text: 'V', superscript: '7', duration: '8' }), + ]); + voice2.getTickables().forEach((note) => { + const textNote = note; + textNote.setFont({ family: Font.SERIF, size: 15 }); + textNote.setLine(13); + textNote.setJustification(TextNote.Justification.LEFT); + }); + f.Formatter().joinVoices([voice1, voice2]).formatToStave([voice1, voice2], stave); + f.draw(); + ok(true); +} +function formatTextGlyphs0(options) { + const f = VexFlowTests.makeFactory(options, 600, 230); + const stave = f.Stave({ y: 40 }); + const score = f.EasyScore(); + const voice1 = score.voice([ + f + .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], stem_direction: -1, duration: 'h' }) + .addModifier(f.Accidental({ type: 'b' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1), + f.StaveNote({ keys: ['d/4', 'e/4', 'f/4'], stem_direction: -1, duration: '8' }), + f.StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: '8' }), + f.StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: '8' }), + f.StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: '8' }), + ]); + const voice2 = score.voice([ + f.TextNote({ text: 'Center', duration: '8' }).setJustification(TextNote.Justification.CENTER), + f.TextNote({ glyph: 'f', duration: '8' }), + f.TextNote({ glyph: 'p', duration: '8' }), + f.TextNote({ glyph: 'm', duration: '8' }), + f.TextNote({ glyph: 'z', duration: '8' }), + f.TextNote({ glyph: 'mordent_upper', duration: '16' }), + f.TextNote({ glyph: 'mordent_lower', duration: '16' }), + f.TextNote({ glyph: 'segno', duration: '8' }), + f.TextNote({ glyph: 'coda', duration: '8' }), + ]); + voice2.getTickables().forEach((n) => n.setJustification(TextNote.Justification.CENTER)); + f.Formatter().joinVoices([voice1, voice2]).formatToStave([voice1, voice2], stave); + f.draw(); + ok(true); +} +function formatTextGlyphs1(options) { + const f = VexFlowTests.makeFactory(options, 600, 230); + const stave = f.Stave({ y: 40 }); + const score = f.EasyScore(); + const voice1 = score.voice([ + f + .StaveNote({ keys: ['c/4', 'e/4', 'a/4'], stem_direction: -1, duration: 'h' }) + .addModifier(f.Accidental({ type: 'b' }), 0) + .addModifier(f.Accidental({ type: '#' }), 1), + f.StaveNote({ keys: ['d/4', 'e/4', 'f/4'], stem_direction: -1, duration: '8' }), + f.StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: '8' }), + f.StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: '8' }), + f.StaveNote({ keys: ['c/4', 'f/4', 'a/4'], stem_direction: -1, duration: '8' }), + ]); + const voice2 = score.voice([ + f.TextNote({ glyph: 'turn', duration: '16' }), + f.TextNote({ glyph: 'turn_inverted', duration: '16' }), + f.TextNote({ glyph: 'pedal_open', duration: '8' }).setLine(10), + f.TextNote({ glyph: 'pedal_close', duration: '8' }).setLine(10), + f.TextNote({ glyph: 'caesura_curved', duration: '8' }).setLine(3), + f.TextNote({ glyph: 'caesura_straight', duration: '8' }).setLine(3), + f.TextNote({ glyph: 'breath', duration: '8' }).setLine(2), + f.TextNote({ glyph: 'tick', duration: '8' }).setLine(3), + f.TextNote({ glyph: 'tr', duration: '8', smooth: true }).setJustification(TextNote.Justification.CENTER), + ]); + voice2.getTickables().forEach((n) => n.setJustification(TextNote.Justification.CENTER)); + f.Formatter().joinVoices([voice1, voice2]).formatToStave([voice1, voice2], stave); + f.draw(); + ok(true); +} +function crescendo(options) { + const f = VexFlowTests.makeFactory(options, 600, 230); + const stave = f.Stave({ y: 40 }); + const score = f.EasyScore(); + const voice = score.voice([ + f.TextNote({ glyph: 'p', duration: '16' }), + new Crescendo({ duration: '4d' }).setLine(0).setHeight(25).setStave(stave), + f.TextNote({ glyph: 'f', duration: '16' }), + new Crescendo({ duration: '4' }).setLine(5).setStave(stave), + new Crescendo({ duration: '4' }).setLine(10).setDecrescendo(true).setHeight(5).setStave(stave), + ]); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true); +} +function textDynamics(options) { + const f = VexFlowTests.makeFactory(options, 600, 230); + const score = f.EasyScore(); + const voice = score.voice([ + f.TextDynamics({ text: 'sfz', duration: '4' }), + f.TextDynamics({ text: 'rfz', duration: '4' }), + f.TextDynamics({ text: 'mp', duration: '4' }), + f.TextDynamics({ text: 'ppp', duration: '4' }), + f.TextDynamics({ text: 'fff', duration: '4' }), + f.TextDynamics({ text: 'mf', duration: '4' }), + f.TextDynamics({ text: 'sff', duration: '4' }), + ], { time: '7/4' }); + const formatter = f.Formatter(); + formatter.joinVoices([voice]); + const width = formatter.preCalculateMinTotalWidth([voice]); + formatter.format([voice]); + const stave = f.Stave({ y: 40, width: width + Stave.defaultPadding }); + stave.draw(); + voice.draw(f.getContext(), stave); + ok(true); +} +VexFlowTests.register(TextNoteTests); +export { TextNoteTests }; diff --git a/build/esm/tests/threevoice_tests.js b/build/esm/tests/threevoice_tests.js new file mode 100644 index 0000000000..9fe6ead737 --- /dev/null +++ b/build/esm/tests/threevoice_tests.js @@ -0,0 +1,132 @@ +import { concat, VexFlowTests } from './vexflow_test_helpers.js'; +import { Beam } from '../src/beam.js'; +const ThreeVoicesTests = { + Start() { + QUnit.module('Three Voice Rests'); + const run = VexFlowTests.runTests; + run('Three Voices - #1', threeVoices1); + run('Three Voices - #2 Complex', threeVoices2); + run('Three Voices - #3', threeVoices3); + run('Auto Adjust Rest Positions - Two Voices', autoRestTwoVoices); + run('Auto Adjust Rest Positions - Three Voices #1', autoRestThreeVoices1); + run('Auto Adjust Rest Positions - Three Voices #2', autoRestThreeVoices2); + }, +}; +function createThreeVoicesTest(noteGroup1, noteGroup2, noteGroup3, setup) { + return (options) => { + const factory = VexFlowTests.makeFactory(options, 600, 200); + const stave = factory.Stave().addClef('treble').addTimeSignature('4/4'); + const score = factory.EasyScore(); + const noteGroups = [noteGroup1, noteGroup2, noteGroup3].map((args) => score.notes(...args)); + const voices = noteGroups.map((notes) => score.voice(notes)); + setup(factory, voices); + const beams = [ + Beam.applyAndGetBeams(voices[0], +1), + Beam.applyAndGetBeams(voices[1], -1), + Beam.applyAndGetBeams(voices[2], -1), + ].reduce(concat); + factory.Formatter().joinVoices(voices).formatToStave(voices, stave); + factory.draw(); + for (let i = 0; i < beams.length; i++) { + beams[i].setContext(factory.getContext()).draw(); + } + ok(true); + }; +} +const threeVoices1 = createThreeVoicesTest(['e5/2, e5', { stem: 'up' }], ['(d4 a4 d#5)/8, b4, (d4 a4 c5), b4, (d4 a4 c5), b4, (d4 a4 c5), b4', { stem: 'down' }], ['b3/4, e3, f3, a3', { stem: 'down' }], (f, voices) => { + voices[0].getTickables()[0].addModifier(f.Fingering({ number: '0', position: 'left' }), 0); + voices[1] + .getTickables()[0] + .addModifier(f.Fingering({ number: '0', position: 'left' }), 0) + .addModifier(f.Fingering({ number: '4', position: 'left' }), 1); +}); +const threeVoices2 = createThreeVoicesTest(['(a4 e5)/16, e5, e5, e5, e5/8, e5, e5/2', { stem: 'up' }], ['(d4 d#5)/16, (b4 c5), d5, e5, (d4 a4 c5)/8, b4, (d4 a4 c5), b4, (d4 a4 c5), b4', { stem: 'down' }], ['b3/8, b3, e3/4, f3, a3', { stem: 'down' }], (f, voices) => { + voices[0] + .getTickables()[0] + .addModifier(f.Fingering({ number: '2', position: 'left' }), 0) + .addModifier(f.Fingering({ number: '0', position: 'above' }), 1); + voices[1] + .getTickables()[0] + .addModifier(f.Fingering({ number: '0', position: 'left' }), 0) + .addModifier(f.Fingering({ number: '4', position: 'left' }), 1); +}); +const threeVoices3 = createThreeVoicesTest(['(g4 e5)/4, e5, (g4 e5)/2', { stem: 'up' }], ['c#5/4, b4/8, b4/8/r, a4/4., g4/8', { stem: 'down' }], ['c4/4, b3, a3, g3', { stem: 'down' }], (f, voices) => { + voices[0] + .getTickables()[0] + .addModifier(f.Fingering({ number: '0', position: 'left' }), 0) + .addModifier(f.Fingering({ number: '0', position: 'left' }), 1); + voices[1].getTickables()[0].addModifier(f.Fingering({ number: '1', position: 'left' }), 0); + voices[2].getTickables()[0].addModifier(f.Fingering({ number: '3', position: 'left' }), 0); +}); +function autoRestTwoVoices(options) { + const f = VexFlowTests.makeFactory(options, 900, 200); + const score = f.EasyScore(); + let x = 10; + let beams = []; + function createMeasure(measureTitle, width, align_rests) { + const stave = f.Stave({ x: x, y: 50, width: width }).setBegBarType(1); + x += width; + const noteArrays = [ + score.notes('b4/8/r, e5/16, b4/r, b4/8/r, e5/16, b4/r, b4/8/r, d5/16, b4/r, e5/4', { stem: 'up' }), + score.notes('c5/16, c4, b4/r, d4, e4, f4, b4/r, g4, g4[stem="up"], a4[stem="up"], b4/r, b4[stem="up"], e4/4', { + stem: 'down', + }), + [f.TextNote({ text: measureTitle, line: -1, duration: '1', smooth: true })], + ]; + const voices = noteArrays.map((notes) => score.voice(notes)); + beams = beams.concat(Beam.applyAndGetBeams(voices[0], 1)).concat(Beam.applyAndGetBeams(voices[1], -1)); + f.Formatter().joinVoices(voices).formatToStave(voices, stave, { align_rests }); + } + createMeasure('Default Rest Positions', 400, false); + createMeasure('Rests Repositioned To Avoid Collisions', 400, true); + f.draw(); + for (let i = 0; i < beams.length; i++) { + beams[i].setContext(f.getContext()).draw(); + } + ok(true, 'Auto Adjust Rests - Two Voices'); +} +function autoRestThreeVoices1(options) { + const f = VexFlowTests.makeFactory(options, 850, 200); + const score = f.EasyScore(); + let x = 10; + function createMeasure(measureTitle, width, align_rests) { + const stave = f.Stave({ x: x, y: 50, width: width }).setBegBarType(1); + const voices = [ + score.voice(score.notes('b4/4/r, e5, e5/r, e5/r, e5, e5, e5, e5/r', { stem: 'up' }), { time: '8/4' }), + score.voice(score.notes('b4/4/r, b4/r, b4/r, b4, b4/r, b4/r, b4, b4', { stem: 'down' }), { time: '8/4' }), + score.voice(score.notes('e4/4/r, e4/r, f4, b4/r, g4, c4, e4/r, c4', { stem: 'down' }), { time: '8/4' }), + score.voice([ + f.TextNote({ text: measureTitle, duration: '1', line: -1, smooth: true }), + f.TextNote({ text: '', duration: '1', line: -1, smooth: true }), + ], { time: '8/4' }), + ]; + f.Formatter().joinVoices(voices).formatToStave(voices, stave, { align_rests }); + x += width; + } + createMeasure('Default Rest Positions', 400, false); + createMeasure('Rests Repositioned To Avoid Collisions', 400, true); + f.draw(); + ok(true); +} +function autoRestThreeVoices2(options) { + const f = VexFlowTests.makeFactory(options, 850, 200); + const score = f.EasyScore(); + let x = 10; + function createMeasure(measureTitle, width, align_rests) { + const stave = f.Stave({ x: x, y: 50, width: width }).setBegBarType(1); + const voices = [ + score.voice(score.notes('b4/16/r, e5, e5/r, e5/r, e5, e5, e5, e5/r'), { time: '2/4' }), + score.voice(score.notes('b4/16/r, b4/r, b4/r, b4, b4/r, b4/r, b4, b4'), { time: '2/4' }), + score.voice(score.notes('e4/16/r, e4/r, f4, b4/r, g4, c4, e4/r, c4'), { time: '2/4' }), + score.voice([f.TextNote({ text: measureTitle, duration: 'h', line: -1, smooth: true })], { time: '2/4' }), + ]; + f.Formatter().joinVoices(voices).formatToStave(voices, stave, { align_rests }); + x += width; + } + createMeasure('Default Rest Positions', 400, false); + createMeasure('Rests Repositioned To Avoid Collisions', 400, true); + f.draw(); + ok(true); +} +VexFlowTests.register(ThreeVoicesTests); +export { ThreeVoicesTests }; diff --git a/build/esm/tests/tickcontext_tests.js b/build/esm/tests/tickcontext_tests.js new file mode 100644 index 0000000000..e9d325be9d --- /dev/null +++ b/build/esm/tests/tickcontext_tests.js @@ -0,0 +1,36 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Flow } from '../src/flow.js'; +import { TickContext } from '../src/tickcontext.js'; +import { MockTickable } from './mocks.js'; +const TickContextTests = { + Start() { + QUnit.module('TickContext'); + test('Current Tick Test', currentTick); + test('Tracking Test', tracking); + }, +}; +function currentTick() { + const tc = new TickContext(); + equal(tc.getCurrentTick().value(), 0, 'New tick context has no ticks'); +} +function tracking() { + const BEAT = (1 * Flow.RESOLUTION) / 4; + const tickables = [ + new MockTickable().setTicks(BEAT).setWidth(10), + new MockTickable().setTicks(BEAT * 2).setWidth(20), + new MockTickable().setTicks(BEAT).setWidth(30), + ]; + const tc = new TickContext(); + tc.setPadding(0); + tc.addTickable(tickables[0]); + equal(tc.getMaxTicks().value(), BEAT); + tc.addTickable(tickables[1]); + equal(tc.getMaxTicks().value(), BEAT * 2); + tc.addTickable(tickables[2]); + equal(tc.getMaxTicks().value(), BEAT * 2); + equal(tc.getWidth(), 0); + tc.preFormat(); + equal(tc.getWidth(), 30); +} +VexFlowTests.register(TickContextTests); +export { TickContextTests }; diff --git a/build/esm/tests/timesignature_tests.js b/build/esm/tests/timesignature_tests.js new file mode 100644 index 0000000000..1ab8ed8de9 --- /dev/null +++ b/build/esm/tests/timesignature_tests.js @@ -0,0 +1,134 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Stave } from '../src/stave.js'; +import { StaveConnector } from '../src/staveconnector.js'; +import { TimeSignature } from '../src/timesignature.js'; +const TimeSignatureTests = { + Start() { + QUnit.module('TimeSignature'); + test('Time Signature Parser', parser); + const run = VexFlowTests.runTests; + run('Basic Time Signatures', basic); + run('Big Signature Test', big); + run('Additive Signature Test', additive); + run('Alternating Signature Test', alternating); + run('Interchangeable Signature Test', interchangeable); + run('Aggregate Signature Test', agregate); + run('Complex Signature Test', complex); + run('Time Signature multiple staves alignment test', multiple); + run('Time Signature Change Test', change); + }, +}; +function parser() { + const timeSig = new TimeSignature(); + const mustFail = ['asdf', '123/', '/10', '/', '4567', 'C+', '1+', '+1', '(3+', '+3)', '()', '(+)']; + mustFail.forEach((invalidString) => { + throws(() => timeSig.parseTimeSpec(invalidString), /BadTimeSignature/); + }); + const mustPass = ['4/4', '10/12', '1/8', '1234567890/1234567890', 'C', 'C|', '+']; + mustPass.forEach((validString) => timeSig.parseTimeSpec(validString)); + ok(true, 'all pass'); +} +function basic(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 600, 120); + new Stave(10, 10, 500) + .addTimeSignature('2/2') + .addTimeSignature('3/4') + .addTimeSignature('4/4') + .addTimeSignature('6/8') + .addTimeSignature('C') + .addTimeSignature('C|') + .addEndTimeSignature('2/2') + .addEndTimeSignature('3/4') + .addEndTimeSignature('4/4') + .addEndClef('treble') + .addEndTimeSignature('6/8') + .addEndTimeSignature('C') + .addEndTimeSignature('C|') + .setContext(ctx) + .draw(); + ok(true, 'all pass'); +} +function big(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 120); + new Stave(10, 10, 300) + .addTimeSignature('12/8') + .addTimeSignature('7/16') + .addTimeSignature('1234567/890') + .addTimeSignature('987/654321') + .setContext(ctx) + .draw(); + ok(true, 'all pass'); +} +function additive(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 120); + new Stave(10, 10, 300).addTimeSignature('2+3+2/8').setContext(ctx).draw(); + ok(true, 'all pass'); +} +function alternating(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 120); + new Stave(10, 10, 300).addTimeSignature('6/8').addTimeSignature('+').addTimeSignature('3/4').setContext(ctx).draw(); + ok(true, 'all pass'); +} +function interchangeable(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 120); + new Stave(10, 10, 300).addTimeSignature('3/4').addTimeSignature('-').addTimeSignature('2/4').setContext(ctx).draw(); + ok(true, 'all pass'); +} +function agregate(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 120); + new Stave(10, 10, 300) + .addTimeSignature('2/4') + .addTimeSignature('+') + .addTimeSignature('3/8') + .addTimeSignature('+') + .addTimeSignature('5/4') + .setContext(ctx) + .draw(); + ok(true, 'all pass'); +} +function complex(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 120); + new Stave(10, 10, 300) + .addTimeSignature('(2+3)/16') + .addTimeSignature('+') + .addTimeSignature('3/8') + .setContext(ctx) + .draw(); + ok(true, 'all pass'); +} +function multiple(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 400, 350); + const stave1LineConfig = [false, false, true, false, false].map((visible) => ({ visible })); + const stave1 = new Stave(15, 0, 300) + .setConfigForLines(stave1LineConfig) + .addClef('percussion') + .addTimeSignature('4/4', 25) + .setContext(ctx) + .draw(); + const stave2 = new Stave(15, 110, 300).addClef('treble').addTimeSignature('4/4').setContext(ctx).draw(); + const stave3 = new Stave(15, 220, 300).addClef('bass').addTimeSignature('4/4').setContext(ctx).draw(); + new StaveConnector(stave1, stave2).setType('single').setContext(ctx).draw(); + new StaveConnector(stave2, stave3).setType('single').setContext(ctx).draw(); + new StaveConnector(stave2, stave3).setType('brace').setContext(ctx).draw(); + ok(true, 'all pass'); +} +function change(options) { + const f = VexFlowTests.makeFactory(options, 900); + const stave = f.Stave({ x: 0, y: 0 }).addClef('treble').addTimeSignature('C|'); + const tickables = [ + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'treble' }), + f.TimeSigNote({ time: '3/4' }), + f.StaveNote({ keys: ['d/4'], duration: '4', clef: 'alto' }), + f.StaveNote({ keys: ['b/3'], duration: '4r', clef: 'alto' }), + f.TimeSigNote({ time: 'C' }), + f.StaveNote({ keys: ['c/3', 'e/3', 'g/3'], duration: '4', clef: 'bass' }), + f.TimeSigNote({ time: '9/8' }), + f.StaveNote({ keys: ['c/4'], duration: '4', clef: 'treble' }), + ]; + const voice = f.Voice().setStrict(false).addTickables(tickables); + f.Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'all pass'); +} +VexFlowTests.register(TimeSignatureTests); +export { TimeSignatureTests }; diff --git a/build/esm/tests/tremolo_tests.js b/build/esm/tests/tremolo_tests.js new file mode 100644 index 0000000000..23be8a1fc5 --- /dev/null +++ b/build/esm/tests/tremolo_tests.js @@ -0,0 +1,75 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Barline } from '../src/stavebarline.js'; +import { Tremolo } from '../src/tremolo.js'; +const TremoloTests = { + Start() { + QUnit.module('Tremolo'); + const run = VexFlowTests.runTests; + run('Tremolo - Basic', tremoloBasic); + run('Tremolo - Big', tremoloBig); + }, +}; +function tremoloBasic(options) { + const f = VexFlowTests.makeFactory(options, 600, 200); + const score = f.EasyScore(); + const stave1 = f.Stave({ width: 250 }).setEndBarType(Barline.type.DOUBLE); + const notes1 = score.notes('e4/4, e4, e4, e4', { stem: 'up' }); + notes1[0].addModifier(new Tremolo(3), 0); + notes1[1].addModifier(new Tremolo(2), 0); + notes1[2].addModifier(new Tremolo(1), 0); + const voice1 = score.voice(notes1); + f.Formatter().joinVoices([voice1]).formatToStave([voice1], stave1); + const stave2 = f + .Stave({ x: stave1.getWidth() + stave1.getX(), y: stave1.getY(), width: 300 }) + .setEndBarType(Barline.type.DOUBLE); + const notes2 = score.notes('e5/4, e5, e5, e5', { stem: 'down' }); + notes2[1].addModifier(new Tremolo(1), 0); + notes2[2].addModifier(new Tremolo(2), 0); + notes2[3].addModifier(new Tremolo(3), 0); + const voice2 = score.voice(notes2); + f.Formatter().joinVoices([voice2]).formatToStave([voice2], stave2); + f.draw(); + ok(true, 'Tremolo - Basic'); +} +function tremoloBig(options) { + const f = VexFlowTests.makeFactory(options, 600, 200); + const score = f.EasyScore(); + const stave1 = f.Stave({ width: 250 }).setEndBarType(Barline.type.DOUBLE); + const notes1 = score.notes('e4/4, e4, e4, e4', { stem: 'up' }); + const tremolo1 = new Tremolo(3); + tremolo1.extra_stroke_scale = 1.7; + tremolo1.y_spacing_scale = 1.5; + const tremolo2 = new Tremolo(2); + tremolo2.extra_stroke_scale = 1.7; + tremolo2.y_spacing_scale = 1.5; + const tremolo3 = new Tremolo(1); + tremolo3.extra_stroke_scale = 1.7; + tremolo3.y_spacing_scale = 1.5; + notes1[0].addModifier(tremolo1, 0); + notes1[1].addModifier(tremolo2, 0); + notes1[2].addModifier(tremolo3, 0); + const voice1 = score.voice(notes1); + f.Formatter().joinVoices([voice1]).formatToStave([voice1], stave1); + const stave2 = f + .Stave({ x: stave1.getWidth() + stave1.getX(), y: stave1.getY(), width: 300 }) + .setEndBarType(Barline.type.DOUBLE); + const notes2 = score.notes('e5/4, e5, e5, e5', { stem: 'down' }); + const tremolo4 = new Tremolo(1); + tremolo4.extra_stroke_scale = 1.7; + tremolo4.y_spacing_scale = 1.5; + const tremolo5 = new Tremolo(2); + tremolo5.extra_stroke_scale = 1.7; + tremolo5.y_spacing_scale = 1.5; + const tremolo6 = new Tremolo(3); + tremolo6.extra_stroke_scale = 1.7; + tremolo6.y_spacing_scale = 1.5; + notes2[1].addModifier(tremolo4, 0); + notes2[2].addModifier(tremolo5, 0); + notes2[3].addModifier(tremolo6, 0); + const voice2 = score.voice(notes2); + f.Formatter().joinVoices([voice2]).formatToStave([voice2], stave2); + f.draw(); + ok(true, 'Tremolo - Big'); +} +VexFlowTests.register(TremoloTests); +export { TremoloTests }; diff --git a/build/esm/tests/tuning_tests.js b/build/esm/tests/tuning_tests.js new file mode 100644 index 0000000000..b386ba8a60 --- /dev/null +++ b/build/esm/tests/tuning_tests.js @@ -0,0 +1,56 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Tuning } from '../src/tuning.js'; +const TuningTests = { + Start() { + QUnit.module('Tuning'); + test('Standard Tuning', standard); + test('Standard Banjo Tuning', banjo); + test('Return note for fret', noteForFret); + }, +}; +function checkStandard(tuning) { + throws(() => tuning.getValueForString(0), /BadArguments/, 'String 0'); + throws(() => tuning.getValueForString(9), /BadArguments/, 'String 9'); + equal(tuning.getValueForString(6), 40, 'Low E string'); + equal(tuning.getValueForString(5), 45, 'A string'); + equal(tuning.getValueForString(4), 50, 'D string'); + equal(tuning.getValueForString(3), 55, 'G string'); + equal(tuning.getValueForString(2), 59, 'B string'); + equal(tuning.getValueForString(1), 64, 'High E string'); +} +function checkStandardBanjo(tuning) { + throws(() => tuning.getValueForString(0), /BadArguments/, 'String 0'); + throws(() => tuning.getValueForString(6), /BadArguments/, 'String 6'); + equal(tuning.getValueForString(5), 67, 'High G string'); + equal(tuning.getValueForString(4), 50, 'D string'); + equal(tuning.getValueForString(3), 55, 'G string'); + equal(tuning.getValueForString(2), 59, 'B string'); + equal(tuning.getValueForString(1), 62, 'High D string'); +} +function standard() { + expect(16); + const tuning = new Tuning(); + checkStandard(tuning); + tuning.setTuning('standard'); + checkStandard(tuning); +} +function banjo() { + expect(7); + const tuning = new Tuning(); + tuning.setTuning('standardBanjo'); + checkStandardBanjo(tuning); +} +function noteForFret() { + expect(8); + const tuning = new Tuning('E/5,B/4,G/4,D/4,A/3,E/3'); + throws(() => tuning.getNoteForFret(-1, 1), /BadArguments/, 'Fret = -1'); + throws(() => tuning.getNoteForFret(1, -1), /BadArguments/, 'String = -1'); + equal(tuning.getNoteForFret(0, 1), 'E/5', 'High E string'); + equal(tuning.getNoteForFret(5, 1), 'A/5', 'High E string, fret 5'); + equal(tuning.getNoteForFret(0, 2), 'B/4', 'B string'); + equal(tuning.getNoteForFret(0, 3), 'G/4', 'G string'); + equal(tuning.getNoteForFret(12, 2), 'B/5', 'B string, fret 12'); + equal(tuning.getNoteForFret(0, 6), 'E/3', 'Low E string'); +} +VexFlowTests.register(TuningTests); +export { TuningTests }; diff --git a/build/esm/tests/tuplet_tests.js b/build/esm/tests/tuplet_tests.js new file mode 100644 index 0000000000..d8aea22e7b --- /dev/null +++ b/build/esm/tests/tuplet_tests.js @@ -0,0 +1,450 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Dot } from '../src/dot.js'; +import { Formatter } from '../src/formatter.js'; +import { Stem } from '../src/stem.js'; +import { Tuplet } from '../src/tuplet.js'; +const TupletTests = { + Start() { + QUnit.module('Tuplet'); + const run = VexFlowTests.runTests; + run('Simple Tuplet', simple); + run('Beamed Tuplet', beamed); + run('Ratioed Tuplet', ratio); + run('Bottom Tuplet', bottom); + run('Bottom Ratioed Tuplet', bottomRatio); + run('Awkward Tuplet', awkward); + run('Complex Tuplet', complex); + run('Mixed Stem Direction Tuplet', mixedTop); + run('Mixed Stem Direction Bottom Tuplet', mixedBottom); + run('Nested Tuplets', nested); + run('Single Tuplets', single); + }, +}; +const set = (key) => (value) => (object) => { + object[key] = value; + return object; +}; +const setStemDirection = set('stem_direction'); +const setStemUp = setStemDirection(Stem.UP); +const setStemDown = setStemDirection(Stem.DOWN); +const setDurationToQuarterNote = set('duration')('4'); +function simple(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave({ x: 10, y: 10, width: 350 }).addTimeSignature('3/4'); + const notes = [ + { keys: ['g/4'], duration: '4' }, + { keys: ['a/4'], duration: '4' }, + { keys: ['b/4'], duration: '4' }, + { keys: ['b/4'], duration: '8' }, + { keys: ['a/4'], duration: '8' }, + { keys: ['g/4'], duration: '8' }, + ] + .map(setStemUp) + .map(f.StaveNote.bind(f)); + f.Tuplet({ notes: notes.slice(0, 3) }); + f.Tuplet({ notes: notes.slice(3, 6) }); + const voice = f + .Voice({ time: { num_beats: 3, beat_value: 4 } }) + .setStrict(true) + .addTickables(notes); + new Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Simple Test'); +} +function beamed(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave({ x: 10, y: 10, width: 350 }).addTimeSignature('3/8'); + const notes = [ + { keys: ['b/4'], duration: '16' }, + { keys: ['a/4'], duration: '16' }, + { keys: ['g/4'], duration: '16' }, + { keys: ['a/4'], duration: '8' }, + { keys: ['f/4'], duration: '8' }, + { keys: ['a/4'], duration: '8' }, + { keys: ['f/4'], duration: '8' }, + { keys: ['a/4'], duration: '8' }, + { keys: ['f/4'], duration: '8' }, + { keys: ['g/4'], duration: '8' }, + ] + .map(setStemUp) + .map(f.StaveNote.bind(f)); + f.Beam({ notes: notes.slice(0, 3) }); + f.Beam({ notes: notes.slice(3, 10) }); + f.Tuplet({ notes: notes.slice(0, 3) }); + f.Tuplet({ notes: notes.slice(3, 10) }); + const voice = f + .Voice({ time: { num_beats: 3, beat_value: 8 } }) + .setStrict(true) + .addTickables(notes); + new Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Beamed Test'); +} +function ratio(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave({ x: 10, y: 10, width: 350 }).addTimeSignature('4/4'); + const notes = [ + { keys: ['f/4'], duration: '4' }, + { keys: ['a/4'], duration: '4' }, + { keys: ['b/4'], duration: '4' }, + { keys: ['g/4'], duration: '8' }, + { keys: ['e/4'], duration: '8' }, + { keys: ['g/4'], duration: '8' }, + ] + .map(setStemUp) + .map(f.StaveNote.bind(f)); + f.Beam({ + notes: notes.slice(3, 6), + }); + f.Tuplet({ + notes: notes.slice(0, 3), + options: { + ratioed: true, + }, + }); + f.Tuplet({ + notes: notes.slice(3, 6), + options: { + ratioed: true, + notes_occupied: 4, + }, + }); + const voice = f.Voice().setStrict(true).addTickables(notes); + new Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Ratioed Test'); +} +function bottom(options) { + const f = VexFlowTests.makeFactory(options, 350, 160); + const stave = f.Stave({ x: 10, y: 10 }).addTimeSignature('3/4'); + const notes = [ + { keys: ['f/4'], duration: '4' }, + { keys: ['c/4'], duration: '4' }, + { keys: ['g/4'], duration: '4' }, + { keys: ['d/5'], duration: '8' }, + { keys: ['g/3'], duration: '8' }, + { keys: ['b/4'], duration: '8' }, + ] + .map(setStemDown) + .map(f.StaveNote.bind(f)); + f.Beam({ + notes: notes.slice(3, 6), + }); + f.Tuplet({ + notes: notes.slice(0, 3), + options: { location: Tuplet.LOCATION_BOTTOM }, + }); + f.Tuplet({ + notes: notes.slice(3, 6), + options: { location: Tuplet.LOCATION_BOTTOM }, + }); + const voice = f + .Voice({ time: { num_beats: 3, beat_value: 4 } }) + .setStrict(true) + .addTickables(notes); + new Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Bottom Test'); +} +function bottomRatio(options) { + const f = VexFlowTests.makeFactory(options, 350, 160); + const stave = f.Stave({ x: 10, y: 10 }).addTimeSignature('5/8'); + const notes = [ + { keys: ['f/4'], duration: '4' }, + { keys: ['c/4'], duration: '4' }, + { keys: ['d/4'], duration: '4' }, + { keys: ['d/5'], duration: '8' }, + { keys: ['g/5'], duration: '8' }, + { keys: ['b/4'], duration: '8' }, + ] + .map(setStemDown) + .map(f.StaveNote.bind(f)); + f.Beam({ + notes: notes.slice(3, 6), + }); + f.Tuplet({ + notes: notes.slice(0, 3), + options: { + location: Tuplet.LOCATION_BOTTOM, + ratioed: true, + }, + }); + f.Tuplet({ + notes: notes.slice(3, 6), + options: { + location: Tuplet.LOCATION_BOTTOM, + notes_occupied: 1, + }, + }); + const voice = f + .Voice({ time: { num_beats: 5, beat_value: 8 } }) + .setStrict(true) + .addTickables(notes); + new Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Bottom Ratioed Test'); +} +function awkward(options) { + const f = VexFlowTests.makeFactory(options, 370, 160); + const stave = f.Stave({ x: 10, y: 10 }); + const notes = [ + { keys: ['g/4'], duration: '16' }, + { keys: ['b/4'], duration: '16' }, + { keys: ['a/4'], duration: '16' }, + { keys: ['a/4'], duration: '16' }, + { keys: ['g/4'], duration: '16' }, + { keys: ['f/4'], duration: '16' }, + { keys: ['e/4'], duration: '16' }, + { keys: ['c/4'], duration: '16' }, + { keys: ['g/4'], duration: '16' }, + { keys: ['a/4'], duration: '16' }, + { keys: ['f/4'], duration: '16' }, + { keys: ['e/4'], duration: '16' }, + { keys: ['c/4'], duration: '8' }, + { keys: ['d/4'], duration: '8' }, + { keys: ['e/4'], duration: '8' }, + ] + .map(setStemUp) + .map(f.StaveNote.bind(f)); + f.Beam({ notes: notes.slice(0, 12) }); + f.Tuplet({ + notes: notes.slice(0, 12), + options: { + notes_occupied: 142, + ratioed: true, + }, + }); + f.Tuplet({ + notes: notes.slice(12, 15), + options: { + ratioed: true, + }, + }).setBracketed(true); + const voice = f.Voice().setStrict(false).addTickables(notes); + new Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Awkward Test'); +} +function complex(options) { + const f = VexFlowTests.makeFactory(options, 600); + const stave = f.Stave({ x: 10, y: 10 }).addTimeSignature('4/4'); + const notes1 = [ + { keys: ['b/4'], duration: '8d' }, + { keys: ['a/4'], duration: '16' }, + { keys: ['g/4'], duration: '8' }, + { keys: ['a/4'], duration: '16' }, + { keys: ['b/4'], duration: '16r' }, + { keys: ['g/4'], duration: '32' }, + { keys: ['f/4'], duration: '32' }, + { keys: ['g/4'], duration: '32' }, + { keys: ['f/4'], duration: '32' }, + { keys: ['a/4'], duration: '16' }, + { keys: ['f/4'], duration: '8' }, + { keys: ['b/4'], duration: '8' }, + { keys: ['a/4'], duration: '8' }, + { keys: ['g/4'], duration: '8' }, + { keys: ['b/4'], duration: '8' }, + { keys: ['a/4'], duration: '8' }, + ] + .map(setStemUp) + .map(f.StaveNote.bind(f)); + Dot.buildAndAttach([notes1[0]], { all: true }); + const notes2 = [{ keys: ['c/4'] }, { keys: ['c/4'] }, { keys: ['c/4'] }, { keys: ['c/4'] }] + .map(setDurationToQuarterNote) + .map(setStemDown) + .map(f.StaveNote.bind(f)); + f.Beam({ notes: notes1.slice(0, 3) }); + f.Beam({ notes: notes1.slice(5, 9) }); + f.Beam({ notes: notes1.slice(11, 16) }); + f.Tuplet({ + notes: notes1.slice(0, 3), + }); + f.Tuplet({ + notes: notes1.slice(3, 11), + options: { + num_notes: 7, + notes_occupied: 4, + ratioed: false, + }, + }); + f.Tuplet({ + notes: notes1.slice(11, 16), + options: { + notes_occupied: 4, + }, + }); + const voice1 = f.Voice().setStrict(true).addTickables(notes1); + const voice2 = f.Voice().setStrict(true).addTickables(notes2); + new Formatter().joinVoices([voice1, voice2]).formatToStave([voice1, voice2], stave); + f.draw(); + ok(true, 'Complex Test'); +} +function mixedTop(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave({ x: 10, y: 10 }); + const notes = [ + { keys: ['a/4'], stem_direction: 1 }, + { keys: ['c/6'], stem_direction: -1 }, + { keys: ['a/4'], stem_direction: 1 }, + { keys: ['f/5'], stem_direction: 1 }, + { keys: ['a/4'], stem_direction: -1 }, + { keys: ['c/6'], stem_direction: -1 }, + ] + .map(setDurationToQuarterNote) + .map(f.StaveNote.bind(f)); + f.Tuplet({ + notes: notes.slice(0, 2), + options: { + notes_occupied: 3, + }, + }); + f.Tuplet({ + notes: notes.slice(2, 4), + options: { + notes_occupied: 3, + }, + }); + f.Tuplet({ + notes: notes.slice(4, 6), + options: { + notes_occupied: 3, + }, + }); + const voice = f.Voice().setStrict(false).addTickables(notes); + new Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Mixed Stem Direction Tuplet'); +} +function mixedBottom(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave({ x: 10, y: 10 }); + const notes = [ + { keys: ['f/3'], stem_direction: 1 }, + { keys: ['a/5'], stem_direction: -1 }, + { keys: ['a/4'], stem_direction: 1 }, + { keys: ['f/3'], stem_direction: 1 }, + { keys: ['a/4'], stem_direction: -1 }, + { keys: ['c/4'], stem_direction: -1 }, + ] + .map(setDurationToQuarterNote) + .map(f.StaveNote.bind(f)); + f.Tuplet({ + notes: notes.slice(0, 2), + options: { + notes_occupied: 3, + }, + }); + f.Tuplet({ + notes: notes.slice(2, 4), + options: { + notes_occupied: 3, + }, + }); + f.Tuplet({ + notes: notes.slice(4, 6), + options: { + notes_occupied: 3, + }, + }); + const voice = f.Voice().setStrict(false).addTickables(notes); + new Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Mixed Stem Direction Bottom Tuplet'); +} +function nested(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave({ x: 10, y: 10 }).addTimeSignature('4/4'); + const notes = [ + { keys: ['b/4'], duration: '4' }, + { keys: ['a/4'], duration: '4' }, + { keys: ['g/4'], duration: '16' }, + { keys: ['a/4'], duration: '16' }, + { keys: ['f/4'], duration: '16' }, + { keys: ['a/4'], duration: '16' }, + { keys: ['g/4'], duration: '16' }, + { keys: ['b/4'], duration: '2' }, + ] + .map(setStemUp) + .map(f.StaveNote.bind(f)); + f.Beam({ + notes: notes.slice(2, 7), + }); + f.Tuplet({ + notes: notes.slice(0, 7), + options: { + notes_occupied: 2, + num_notes: 3, + }, + }); + f.Tuplet({ + notes: notes.slice(2, 7), + options: { + notes_occupied: 4, + num_notes: 5, + }, + }); + const voice = f.Voice().setStrict(true).addTickables(notes); + new Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Nested Tuplets'); +} +function single(options) { + const f = VexFlowTests.makeFactory(options); + const stave = f.Stave({ x: 10, y: 10 }).addTimeSignature('4/4'); + const notes = [ + { keys: ['c/4'], duration: '4' }, + { keys: ['d/4'], duration: '8' }, + { keys: ['e/4'], duration: '8' }, + { keys: ['f/4'], duration: '8' }, + { keys: ['g/4'], duration: '8' }, + { keys: ['a/4'], duration: '2' }, + { keys: ['b/4'], duration: '4' }, + ] + .map(setStemUp) + .map(f.StaveNote.bind(f)); + f.Beam({ + notes: notes.slice(1, 4), + }); + f.Tuplet({ + notes: notes.slice(0, -1), + options: { + num_notes: 4, + notes_occupied: 3, + ratioed: true, + bracketed: true, + }, + }); + f.Tuplet({ + notes: notes.slice(0, 1), + options: { + num_notes: 3, + notes_occupied: 2, + ratioed: true, + }, + }); + f.Tuplet({ + notes: notes.slice(1, 4), + options: { + num_notes: 3, + notes_occupied: 2, + }, + }); + f.Tuplet({ + notes: notes.slice(4, 5), + options: { + num_notes: 3, + notes_occupied: 2, + ratioed: true, + bracketed: true, + }, + }); + const voice = f + .Voice({ time: { num_beats: 4, beat_value: 4 } }) + .setStrict(true) + .addTickables(notes); + new Formatter().joinVoices([voice]).formatToStave([voice], stave); + f.draw(); + ok(true, 'Nested Tuplets'); +} +VexFlowTests.register(TupletTests); +export { TupletTests }; diff --git a/build/esm/tests/typeguard_tests.js b/build/esm/tests/typeguard_tests.js new file mode 100644 index 0000000000..a985aa718b --- /dev/null +++ b/build/esm/tests/typeguard_tests.js @@ -0,0 +1,82 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { CanvasContext } from '../src/canvascontext.js'; +import { StaveNote } from '../src/stavenote.js'; +import { StemmableNote } from '../src/stemmablenote.js'; +import { TabNote } from '../src/tabnote.js'; +import { isCategory, isNote, isRenderContext, isStaveNote, isStemmableNote, isTabNote } from '../src/typeguard.js'; +const TypeGuardTests = { + Start() { + QUnit.module('TypeGuard'); + test('Real VexFlow Types', real); + test('Fake VexFlow Types in ES5', fakeES5); + test('Fake VexFlow Types in ES6', fakeES6); + test('Edge Case ES5/ES6', edgeCaseES5vsES6); + }, +}; +function real() { + const s = new StaveNote({ keys: ['c/4'], duration: 'w' }); + ok(isStaveNote(s), 'isStaveNote helper function'); + ok(isCategory(s, 'StaveNote'), 'Use isCategory(s, "StaveNote") directly'); + notOk(isTabNote(s), 'isTabNote helper function. s is NOT a TabNote.'); + const t = new TabNote({ positions: [{ str: 2, fret: 1 }], duration: '1' }); + ok(isTabNote(t), 'isTabNote helper function'); + notOk(isStaveNote(t), 't is NOT a StaveNote'); + ok(isNote(s), 'StaveNote extends StemmableNote which extends Note, so s is a Note'); + ok(isStemmableNote(t), 'TabNote extends StemmableNote'); + ok(isNote(t), 'TabNote extends StemmableNote which extends Note, so t is a Note'); + const canvas = document.createElement('canvas'); + canvas.width = 800; + canvas.height = 400; + const ctx = new CanvasContext(canvas.getContext('2d')); + ok(isRenderContext(ctx), 'ctx is a RenderContext'); +} +function checkFakeObjects(fakeStemmableNote, fakeStaveNote) { + ok(isStemmableNote(fakeStemmableNote), 'Fake StemmableNote is a StemmableNote.'); + notOk(isNote(fakeStemmableNote), 'Fake StemmableNote is not a Note (no ancestors with the correct CATEGORY).'); + ok(isCategory(fakeStaveNote, 'StaveNote'), 'Fake StaveNote is a StaveNote.'); + ok(isStaveNote(fakeStaveNote), 'Fake StaveNote is a StaveNote (via helper function).'); + ok(isCategory(fakeStaveNote, 'StemmableNote'), 'Fake StaveNote is also a StemmableNote (via inheritance).'); + notOk(isNote(fakeStaveNote), 'Fake StaveNote is not a Note. CATEGORY does not match.'); +} +function fakeES5() { + function FakeStemmableNote() { + this.isFake = true; + } + FakeStemmableNote.CATEGORY = StemmableNote.CATEGORY; + function FakeStaveNote() { + FakeStemmableNote.call(this); + } + FakeStaveNote.CATEGORY = StaveNote.CATEGORY; + FakeStaveNote.prototype = Object.create(FakeStemmableNote.prototype); + FakeStaveNote.prototype.constructor = FakeStaveNote; + const fakeStemmableNote = new FakeStemmableNote(); + const fakeStaveNote = new FakeStaveNote(); + checkFakeObjects(fakeStemmableNote, fakeStaveNote); +} +function fakeES6() { + class FakeStemmableNote { + } + FakeStemmableNote.CATEGORY = StemmableNote.CATEGORY; + class FakeStaveNote extends FakeStemmableNote { + } + FakeStaveNote.CATEGORY = StaveNote.CATEGORY; + const fakeStemmableNote = new FakeStemmableNote(); + const fakeStaveNote = new FakeStaveNote(); + checkFakeObjects(fakeStemmableNote, fakeStaveNote); +} +function edgeCaseES5vsES6() { + class Z extends Object { + } + class Y extends Z { + } + class X extends Y { + } + const zInstance = new Z(); + const xInstance = new X(); + ok(xInstance instanceof Object, 'es5 & es6: x IS an instanceof Object'); + ok(zInstance instanceof Z, 'es6: z IS an instanceof Z'); + ok(xInstance instanceof Y, 'es6: x IS an instanceof Y'); + ok(xInstance instanceof Z, 'es6: x IS an instanceof Z'); +} +VexFlowTests.register(TypeGuardTests); +export { TypeGuardTests }; diff --git a/build/esm/tests/vexflow_test_helpers.js b/build/esm/tests/vexflow_test_helpers.js new file mode 100644 index 0000000000..5097b8fd6c --- /dev/null +++ b/build/esm/tests/vexflow_test_helpers.js @@ -0,0 +1,266 @@ +import { Factory, Flow, Font, Renderer } from '../src/index.js'; +import { globalObject } from '../src/util.js'; +const global = globalObject(); +let originalFontNames; +function useTempFontStack(fontName) { + originalFontNames = Flow.getMusicFont(); + Flow.setMusicFont(...VexFlowTests.FONT_STACKS[fontName]); +} +function restoreOriginalFontStack() { + Flow.setMusicFont(...originalFontNames); +} +if (!global.$) { + global.$ = (param) => { + let element; + if (typeof param !== 'string') { + element = param; + } + else if (param.startsWith('<')) { + const tagName = param.match(/[A-Za-z]+/g)[0]; + element = document.createElement(tagName); + } + else { + element = document.querySelector(param); + } + const $element = { + get(index) { + return element; + }, + addClass(c) { + element.classList.add(c); + return $element; + }, + text(t) { + element.textContent = t; + return $element; + }, + html(h) { + if (!h) { + return element.innerHTML; + } + else { + element.innerHTML = h; + return $element; + } + }, + append(...elementsToAppend) { + elementsToAppend.forEach((e) => { + element.appendChild(e); + }); + return $element; + }, + attr(attrName, val) { + element.setAttribute(attrName, val); + return $element; + }, + }; + return $element; + }; +} +function sanitizeName(name) { + return name.replace(/[^a-zA-Z0-9]/g, '_'); +} +const CANVAS_TEST_CONFIG = { + backend: Renderer.Backends.CANVAS, + tagName: 'canvas', + testType: 'Canvas', + fontStacks: ['Bravura'], +}; +const SVG_TEST_CONFIG = { + backend: Renderer.Backends.SVG, + tagName: 'div', + testType: 'SVG', + fontStacks: ['Bravura', 'Gonville', 'Petaluma'], +}; +const NODE_TEST_CONFIG = { + backend: Renderer.Backends.CANVAS, + tagName: 'canvas', + testType: 'NodeCanvas', + fontStacks: ['Bravura', 'Gonville', 'Petaluma'], +}; +export class VexFlowTests { + static register(test) { + VexFlowTests.tests.push(test); + } + static parseJobOptions(runOptions) { + let { jobs, job } = runOptions || { jobs: 1, job: 0 }; + if (window) { + const { location } = window; + if (location) { + const sps = new URLSearchParams(location.search); + const jobsParam = sps.get('jobs'); + const jobParam = sps.get('job'); + if (jobsParam) { + jobs = parseInt(jobsParam, 10); + } + if (jobParam) { + job = parseInt(jobParam, 10); + } + } + } + return { + jobs, + job, + }; + } + static run(runOptions) { + const { jobs, job } = VexFlowTests.parseJobOptions(runOptions); + VexFlowTests.tests.forEach((test, idx) => { + if (jobs === 1 || idx % jobs === job) { + test.Start(); + } + }); + } + static set NODE_FONT_STACKS(fontStacks) { + NODE_TEST_CONFIG.fontStacks = fontStacks; + } + static generateTestID(prefix) { + return prefix + '_' + VexFlowTests.NEXT_TEST_ID++; + } + static runTests(name, testFunc, params) { + VexFlowTests.runCanvasTest(name, testFunc, params); + VexFlowTests.runSVGTest(name, testFunc, params); + VexFlowTests.runNodeTest(name, testFunc, params); + } + static createTest(elementId, testTitle, tagName, titleId = '') { + const anchorTestTitle = `${testTitle}`; + const title = $('
      ').addClass('name').attr('id', titleId).html(anchorTestTitle).get(0); + const vexOutput = $(`<${tagName}/>`).addClass('vex-tabdiv').attr('id', elementId).get(0); + const container = $('
      ').addClass('testcanvas').append(title, vexOutput).get(0); + $('#vexflow_testoutput').append(container); + return vexOutput; + } + static makeFactory(options, width = 450, height = 140) { + const { elementId, backend } = options; + return new Factory({ renderer: { elementId, backend, width, height } }); + } + static runCanvasTest(name, testFunc, params) { + if (VexFlowTests.RUN_CANVAS_TESTS) { + const helper = null; + VexFlowTests.runWithParams(Object.assign(Object.assign({}, CANVAS_TEST_CONFIG), { name, testFunc, params, helper })); + } + } + static runSVGTest(name, testFunc, params) { + if (VexFlowTests.RUN_SVG_TESTS) { + const helper = null; + VexFlowTests.runWithParams(Object.assign(Object.assign({}, SVG_TEST_CONFIG), { name, testFunc, params, helper })); + } + } + static runNodeTest(name, testFunc, params) { + if (VexFlowTests.RUN_NODE_TESTS) { + const helper = VexFlowTests.runNodeTestHelper; + VexFlowTests.runWithParams(Object.assign(Object.assign({}, NODE_TEST_CONFIG), { name, testFunc, params, helper })); + } + } + static runNodeTestHelper(fontName, element) { + if (Renderer.lastContext !== undefined) { + const moduleName = sanitizeName(QUnit.current_module); + const testName = sanitizeName(QUnit.current_test); + const onlyBravura = NODE_TEST_CONFIG.fontStacks.length === 1 && fontName === 'Bravura'; + const fontInfo = onlyBravura ? '' : `.${fontName}`; + const fileName = `${VexFlowTests.NODE_IMAGEDIR}/${moduleName}.${testName}${fontInfo}.png`; + const imageData = element.toDataURL().split(';base64,').pop(); + const imageBuffer = Buffer.from(imageData, 'base64'); + VexFlowTests.shims.fs.writeFileSync(fileName, imageBuffer, { encoding: 'base64' }); + } + } + static runWithParams({ fontStacks, testFunc, name, params, backend, tagName, testType, helper }) { + if (name === undefined) { + throw new Error('Test name is undefined.'); + } + const testTypeLowerCase = testType.toLowerCase(); + fontStacks.forEach((fontStackName) => { + QUnit.test(name, (assert) => { + useTempFontStack(fontStackName); + const elementId = VexFlowTests.generateTestID(`${testTypeLowerCase}_` + fontStackName); + const moduleName = assert.test.module.name; + const title = moduleName + ' › ' + name + ` › ${testType} + ${fontStackName}`; + let prefix = ''; + if (testTypeLowerCase === 'canvas') { + prefix = testTypeLowerCase + '_'; + } + else { + } + const titleId = `${prefix}${sanitizeName(moduleName)}.${sanitizeName(name)}.${fontStackName}`; + const element = VexFlowTests.createTest(elementId, title, tagName, titleId); + const options = { elementId, params, assert, backend }; + const isSVG = backend === Renderer.Backends.SVG; + const contextBuilder = isSVG ? Renderer.getSVGContext : Renderer.getCanvasContext; + testFunc(options, contextBuilder); + restoreOriginalFontStack(); + if (helper) + helper(fontStackName, element); + }); + }); + } + static plotLegendForNoteWidth(ctx, x, y) { + ctx.save(); + ctx.setFont(Font.SANS_SERIF, 8); + const spacing = 12; + let lastY = y; + function legend(color, text) { + ctx.beginPath(); + ctx.setStrokeStyle(color); + ctx.setFillStyle(color); + ctx.setLineWidth(10); + ctx.moveTo(x, lastY - 4); + ctx.lineTo(x + 10, lastY - 4); + ctx.stroke(); + ctx.setFillStyle('black'); + ctx.fillText(text, x + 15, lastY); + lastY += spacing; + } + legend('green', 'Note + Flag'); + legend('red', 'Modifiers'); + legend('#999', 'Displaced Head'); + legend('#DDD', 'Formatter Shift'); + ctx.restore(); + } +} +VexFlowTests.tests = []; +VexFlowTests.RUN_CANVAS_TESTS = true; +VexFlowTests.RUN_SVG_TESTS = true; +VexFlowTests.RUN_NODE_TESTS = false; +VexFlowTests.Font = { size: 10 }; +VexFlowTests.FONT_STACKS = { + Bravura: ['Bravura', 'Gonville', 'Custom'], + Gonville: ['Gonville', 'Bravura', 'Custom'], + Petaluma: ['Petaluma', 'Gonville', 'Bravura', 'Custom'], +}; +VexFlowTests.NEXT_TEST_ID = 0; +export const concat = (a, b) => a.concat(b); +export const MAJOR_KEYS = [ + 'C', + 'F', + 'Bb', + 'Eb', + 'Ab', + 'Db', + 'Gb', + 'Cb', + 'G', + 'D', + 'A', + 'E', + 'B', + 'F#', + 'C#', +]; +export const MINOR_KEYS = [ + 'Am', + 'Dm', + 'Gm', + 'Cm', + 'Fm', + 'Bbm', + 'Ebm', + 'Abm', + 'Em', + 'Bm', + 'F#m', + 'C#m', + 'G#m', + 'D#m', + 'A#m', +]; +Flow.Test = VexFlowTests; diff --git a/build/esm/tests/vf_prefix_tests.js b/build/esm/tests/vf_prefix_tests.js new file mode 100644 index 0000000000..d21fe87882 --- /dev/null +++ b/build/esm/tests/vf_prefix_tests.js @@ -0,0 +1,115 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Accidental, Annotation, Articulation, Barline, BarNote, Beam, Bend, BoundingBox, BoundingBoxComputation, ChordSymbol, Clef, ClefNote, Crescendo, Curve, Dot, EasyScore, Element, Factory, Flow, Font, Formatter, Fraction, FretHandFinger, GhostNote, Glyph, GlyphNote, GraceNote, GraceNoteGroup, GraceTabNote, KeyManager, KeySignature, KeySigNote, Modifier, ModifierContext, MultiMeasureRest, Music, Note, NoteHead, NoteSubGroup, Ornament, Parser, PedalMarking, Registry, Renderer, RepeatNote, Repetition, Stave, StaveConnector, StaveHairpin, StaveLine, StaveModifier, StaveNote, StaveTempo, StaveText, StaveTie, Stem, StringNumber, Stroke, System, TabNote, TabSlide, TabStave, TabTie, TextBracket, TextDynamics, TextFormatter, TextNote, TickContext, TimeSignature, TimeSigNote, Tremolo, Tuning, Tuplet, Vibrato, VibratoBracket, Voice, Volta, } from '../src/index.js'; +const VFPrefixTests = { + Start() { + QUnit.module('VF.* API'); + test('VF.* API', VF_Prefix); + test('VF Alias', VF_Alias); + }, +}; +function VF_Prefix() { + const VF = Vex.Flow; + equal(Accidental, VF.Accidental); + equal(Annotation, VF.Annotation); + equal(Articulation, VF.Articulation); + equal(Barline, VF.Barline); + equal(BarNote, VF.BarNote); + equal(Beam, VF.Beam); + equal(Bend, VF.Bend); + equal(BoundingBox, VF.BoundingBox); + equal(BoundingBoxComputation, VF.BoundingBoxComputation); + equal(ChordSymbol, VF.ChordSymbol); + equal(Clef, VF.Clef); + equal(ClefNote, VF.ClefNote); + equal(Crescendo, VF.Crescendo); + equal(Curve, VF.Curve); + equal(Dot, VF.Dot); + equal(EasyScore, VF.EasyScore); + equal(Element, VF.Element); + equal(Factory, VF.Factory); + equal(Flow.RESOLUTION, VF.RESOLUTION); + equal(Font, VF.Font); + equal(Formatter, VF.Formatter); + propEqual(new Formatter(), new VF.Formatter(), 'new Formatter()'); + equal(Fraction, VF.Fraction); + equal(FretHandFinger, VF.FretHandFinger); + equal(GhostNote, VF.GhostNote); + equal(Glyph, VF.Glyph); + equal(GlyphNote, VF.GlyphNote); + equal(GraceNote, VF.GraceNote); + equal(GraceNoteGroup, VF.GraceNoteGroup); + equal(GraceTabNote, VF.GraceTabNote); + equal(KeyManager, VF.KeyManager); + equal(KeySignature, VF.KeySignature); + equal(KeySigNote, VF.KeySigNote); + equal(Modifier, VF.Modifier); + equal(ModifierContext, VF.ModifierContext); + equal(MultiMeasureRest, VF.MultiMeasureRest); + equal(Music, VF.Music); + equal(Note, VF.Note); + equal(NoteHead, VF.NoteHead); + equal(NoteSubGroup, VF.NoteSubGroup); + equal(Ornament, VF.Ornament); + equal(Parser, VF.Parser); + equal(PedalMarking, VF.PedalMarking); + equal(Registry, VF.Registry); + equal(Renderer, VF.Renderer); + equal(RepeatNote, VF.RepeatNote); + equal(Repetition, VF.Repetition); + equal(Stave, VF.Stave); + notEqual(Stave, VF.StaveNote); + equal(StaveConnector, VF.StaveConnector); + equal(StaveHairpin, VF.StaveHairpin); + equal(StaveLine, VF.StaveLine); + equal(StaveModifier, VF.StaveModifier); + equal(StaveNote, VF.StaveNote); + equal(StaveTempo, VF.StaveTempo); + equal(StaveText, VF.StaveText); + equal(StaveTie, VF.StaveTie); + equal(Stem, VF.Stem); + equal(StringNumber, VF.StringNumber); + equal(Stroke, VF.Stroke); + equal(System, VF.System); + equal(TabNote, VF.TabNote); + equal(TabSlide, VF.TabSlide); + equal(TabStave, VF.TabStave); + equal(TabTie, VF.TabTie); + equal(TextBracket, VF.TextBracket); + equal(TextDynamics, VF.TextDynamics); + equal(TextFormatter, VF.TextFormatter); + equal(TextNote, VF.TextNote); + equal(TickContext, VF.TickContext); + equal(TimeSignature, VF.TimeSignature); + equal(TimeSigNote, VF.TimeSigNote); + equal(Tremolo, VF.Tremolo); + equal(Tuning, VF.Tuning); + equal(Tuplet, VF.Tuplet); + equal(Vibrato, VF.Vibrato); + equal(VibratoBracket, VF.VibratoBracket); + equal(Voice, VF.Voice); + equal(Volta, VF.Volta); +} +function VF_Alias() { + const Flow = Vex.Flow; + const VFAliases = { + get VFAccidental() { + return Flow.Accidental; + }, + get VFAnnotation() { + return Flow.Annotation; + }, + get VFVibrato() { + return Flow.Vibrato; + }, + }; + const { VFVibrato, VFAccidental, VFAnnotation } = VFAliases; + equal(Accidental, VFAccidental); + equal(Annotation, VFAnnotation); + const vibrato = new VFVibrato(); + ok(vibrato); + const acc1 = new VFAccidental('##'); + const acc2 = new Accidental('##'); + equal(acc1.type, acc2.type); +} +VexFlowTests.register(VFPrefixTests); +export { VFPrefixTests }; diff --git a/build/esm/tests/vibrato_tests.js b/build/esm/tests/vibrato_tests.js new file mode 100644 index 0000000000..f2d5ed3460 --- /dev/null +++ b/build/esm/tests/vibrato_tests.js @@ -0,0 +1,92 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Bend, Font, Formatter, TabNote, TabStave, Vibrato } from '../src/index.js'; +const VibratoTests = { + Start() { + QUnit.module('Vibrato'); + const run = VexFlowTests.runTests; + run('Simple Vibrato', simple); + run('Harsh Vibrato', harsh); + run('Vibrato with Bend', withBend); + }, +}; +const tabNote = (noteStruct) => new TabNote(noteStruct); +function simple(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 500, 240); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + ctx.font = '10pt Arial'; + const stave = new TabStave(10, 10, 450).addTabGlyph().setContext(ctx).draw(); + const notes = [ + tabNote({ + positions: [ + { str: 2, fret: 10 }, + { str: 4, fret: 9 }, + ], + duration: 'h', + }).addModifier(new Vibrato(), 0), + tabNote({ + positions: [{ str: 2, fret: 10 }], + duration: 'h', + }).addModifier(new Vibrato(), 0), + ]; + Formatter.FormatAndDraw(ctx, stave, notes); + ok(true, 'Simple Vibrato'); +} +function harsh(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 500, 240); + ctx.scale(1.5, 1.5); + ctx.fillStyle = '#221'; + ctx.strokeStyle = '#221'; + ctx.font = '10pt Arial'; + const stave = new TabStave(10, 10, 450).addTabGlyph().setContext(ctx).draw(); + const notes = [ + tabNote({ + positions: [ + { str: 2, fret: 10 }, + { str: 4, fret: 9 }, + ], + duration: 'h', + }).addModifier(new Vibrato().setHarsh(true), 0), + tabNote({ + positions: [{ str: 2, fret: 10 }], + duration: 'h', + }).addModifier(new Vibrato().setHarsh(true), 0), + ]; + Formatter.FormatAndDraw(ctx, stave, notes); + ok(true, 'Harsh Vibrato'); +} +function withBend(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 500, 240); + ctx.scale(1.3, 1.3); + ctx.setFillStyle('#221'); + ctx.setStrokeStyle('#221'); + ctx.setFont(Font.SANS_SERIF, VexFlowTests.Font.size); + const stave = new TabStave(10, 10, 450).addTabGlyph().setContext(ctx).draw(); + const notes = [ + tabNote({ + positions: [ + { str: 2, fret: 9 }, + { str: 3, fret: 9 }, + ], + duration: 'q', + }) + .addModifier(new Bend('1/2', true), 0) + .addModifier(new Bend('1/2', true), 1) + .addModifier(new Vibrato(), 0), + tabNote({ + positions: [{ str: 2, fret: 10 }], + duration: 'q', + }) + .addModifier(new Bend('Full', false), 0) + .addModifier(new Vibrato().setVibratoWidth(60), 0), + tabNote({ + positions: [{ str: 2, fret: 10 }], + duration: 'h', + }).addModifier(new Vibrato().setVibratoWidth(120).setHarsh(true), 0), + ]; + Formatter.FormatAndDraw(ctx, stave, notes); + ok(true, 'Vibrato with Bend'); +} +VexFlowTests.register(VibratoTests); +export { VibratoTests }; diff --git a/build/esm/tests/vibratobracket_tests.js b/build/esm/tests/vibratobracket_tests.js new file mode 100644 index 0000000000..4d77ecad41 --- /dev/null +++ b/build/esm/tests/vibratobracket_tests.js @@ -0,0 +1,45 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +const VibratoBracketTests = { + Start() { + QUnit.module('VibratoBracket'); + const run = VexFlowTests.runTests; + run('Simple VibratoBracket', simple); + run('Harsh VibratoBracket Without End Note', withoutEndNote); + run('Harsh VibratoBracket Without Start Note', withoutStartNote); + }, +}; +function createTest(noteGroup, setupVibratoBracket) { + return (options) => { + const factory = VexFlowTests.makeFactory(options, 650, 200); + const stave = factory.Stave(); + const score = factory.EasyScore(); + const voice = score.voice(score.notes(noteGroup)); + setupVibratoBracket(factory, voice.getTickables()); + factory.Formatter().joinVoices([voice]).formatToStave([voice], stave); + factory.draw(); + ok(true); + }; +} +const simple = createTest('c4/4, c4, c4, c4', (factory, notes) => { + factory.VibratoBracket({ + from: notes[0], + to: notes[3], + options: { line: 2 }, + }); +}); +const withoutEndNote = createTest('c4/4, c4, c4, c4', (factory, notes) => { + factory.VibratoBracket({ + from: notes[2], + to: null, + options: { line: 2, harsh: true }, + }); +}); +const withoutStartNote = createTest('c4/4, c4, c4, c4', (factory, notes) => { + factory.VibratoBracket({ + from: null, + to: notes[2], + options: { line: 2, harsh: true }, + }); +}); +VexFlowTests.register(VibratoBracketTests); +export { VibratoBracketTests }; diff --git a/build/esm/tests/voice_tests.js b/build/esm/tests/voice_tests.js new file mode 100644 index 0000000000..31c1967c6d --- /dev/null +++ b/build/esm/tests/voice_tests.js @@ -0,0 +1,69 @@ +import { VexFlowTests } from './vexflow_test_helpers.js'; +import { Flow } from '../src/flow.js'; +import { Formatter } from '../src/formatter.js'; +import { Stave } from '../src/stave.js'; +import { Barline } from '../src/stavebarline.js'; +import { StaveNote } from '../src/stavenote.js'; +import { Voice } from '../src/voice.js'; +import { MockTickable } from './mocks.js'; +const VoiceTests = { + Start() { + QUnit.module('Voice'); + test('Strict Test', strict); + test('Ignore Test', ignore); + VexFlowTests.runTests('Full Voice Mode Test', full); + }, +}; +const BEAT = (1 * Flow.RESOLUTION) / 4; +const createTickable = () => new MockTickable().setTicks(BEAT); +function strict() { + expect(8); + const tickables = [createTickable(), createTickable(), createTickable()]; + const voice = new Voice(Flow.TIME4_4); + equal(voice.getTotalTicks().value(), BEAT * 4, '4/4 Voice has 4 beats'); + equal(voice.getTicksUsed().value(), BEAT * 0, 'No beats in voice'); + voice.addTickables(tickables); + equal(voice.getTicksUsed().value(), BEAT * 3, 'Three beats in voice'); + voice.addTickable(createTickable()); + equal(voice.getTicksUsed().value(), BEAT * 4, 'Four beats in voice'); + equal(voice.isComplete(), true, 'Voice is complete'); + const numeratorBeforeException = voice.getTicksUsed().numerator; + throws(() => voice.addTickable(createTickable()), /BadArgument/, '"Too many ticks" exception'); + equal(voice.getTicksUsed().numerator, numeratorBeforeException, 'Revert `ticksUsed` after a "Too many ticks" exception'); + equal(voice.getSmallestTickCount().value(), BEAT, 'Smallest tick count is BEAT'); +} +function ignore() { + const tickables = [ + createTickable(), + createTickable(), + createTickable().setIgnoreTicks(true), + createTickable(), + createTickable().setIgnoreTicks(true), + createTickable(), + ]; + const voice = new Voice(Flow.TIME4_4); + voice.addTickables(tickables); + ok(true, 'all pass'); +} +function full(options, contextBuilder) { + const ctx = contextBuilder(options.elementId, 550, 200); + const stave = new Stave(10, 50, 500).addClef('treble').addTimeSignature('4/4').setEndBarType(Barline.type.END); + const notes = [ + new StaveNote({ keys: ['c/4'], duration: '4' }), + new StaveNote({ keys: ['d/4'], duration: '4' }), + new StaveNote({ keys: ['r/4'], duration: '4r' }), + ]; + notes.forEach((note) => note.setStave(stave)); + const voice = new Voice(Flow.TIME4_4).setMode(Voice.Mode.FULL).addTickables(notes); + new Formatter().joinVoices([voice]).formatToStave([voice], stave); + stave.setContext(ctx).draw(); + voice.draw(ctx); + const bb = voice.getBoundingBox(); + if (bb) { + ctx.rect(bb.getX(), bb.getY(), bb.getW(), bb.getH()); + } + ctx.stroke(); + throws(() => voice.addTickable(new StaveNote({ keys: ['c/4'], duration: '2' })), /BadArgument/, 'Voice cannot exceed full amount of ticks'); +} +VexFlowTests.register(VoiceTests); +export { VoiceTests }; diff --git a/build/types/entry/vexflow-bravura.d.ts b/build/types/entry/vexflow-bravura.d.ts new file mode 100644 index 0000000000..30b1c341ee --- /dev/null +++ b/build/types/entry/vexflow-bravura.d.ts @@ -0,0 +1,3 @@ +import { Vex } from '../src/vex'; +export * from '../src/index'; +export default Vex; diff --git a/build/types/entry/vexflow-core.d.ts b/build/types/entry/vexflow-core.d.ts new file mode 100644 index 0000000000..30b1c341ee --- /dev/null +++ b/build/types/entry/vexflow-core.d.ts @@ -0,0 +1,3 @@ +import { Vex } from '../src/vex'; +export * from '../src/index'; +export default Vex; diff --git a/build/types/entry/vexflow-debug.d.ts b/build/types/entry/vexflow-debug.d.ts new file mode 100644 index 0000000000..8d4dc8319c --- /dev/null +++ b/build/types/entry/vexflow-debug.d.ts @@ -0,0 +1,3 @@ +import { Vex } from './vexflow'; +export * from '../src/index'; +export default Vex; diff --git a/build/types/entry/vexflow-font-bravura.d.ts b/build/types/entry/vexflow-font-bravura.d.ts new file mode 100644 index 0000000000..8610869741 --- /dev/null +++ b/build/types/entry/vexflow-font-bravura.d.ts @@ -0,0 +1,3768 @@ +export declare const Font: { + data: { + glyphs: { + bracketTop: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + bracketBottom: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + barlineTick: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + breathMarkTick: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + segno: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + coda: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + gClef: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + cClef: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + fClef: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + unpitchedPercussionClef1: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + '6stringTabClef': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig0: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig1: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig2: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig3: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig4: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig5: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig6: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig7: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig8: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig9: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigCommon: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigCutCommon: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigPlus: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigPlusSmall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigMinus: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigParensRight: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigParensRightSmall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigParensLeft: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigParensLeftSmall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadDoubleWhole: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadWhole: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadHalf: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadBlack: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadXWhole: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadXHalf: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadXBlack: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadCircleX: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadTriangleUpWhole: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadTriangleUpHalf: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadTriangleUpBlack: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadDiamondWhole: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadDiamondHalf: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadDiamondBlack: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadSquareWhite: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadSquareBlack: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadParenthesis: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadParenthesisRight: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadParenthesisLeft: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + augmentationDot: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + tremolo1: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag8thUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag8thDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag16thUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag16thDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag32ndUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag32ndDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag64thUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag64thDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag128thUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag128thDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalFlat: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalNatural: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalSharp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalDoubleSharp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalDoubleFlat: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalParensLeft: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalParensRight: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalQuarterToneFlatStein: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalThreeQuarterTonesFlatZimmermann: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalQuarterToneSharpStein: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalThreeQuarterTonesSharpStein: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalBuyukMucennebFlat: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalBakiyeFlat: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalKomaSharp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalKucukMucennebSharp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalKoron: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalSori: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articAccentAbove: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articAccentBelow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articTenutoAbove: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articTenutoBelow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articStaccatoAbove: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articStaccatoBelow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articStaccatissimoAbove: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articStaccatissimoBelow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articMarcatoAbove: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articMarcatoBelow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + fermataAbove: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + fermataBelow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + breathMarkComma: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + breathMarkUpbow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + caesura: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + caesuraCurved: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + restMaxima: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + restDoubleWhole: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + restWhole: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + restHalf: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + restQuarter: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + rest8th: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + rest16th: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + rest32nd: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + rest64th: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + rest128th: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + dynamicPiano: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + dynamicMezzo: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + dynamicForte: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + dynamicRinforzando: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + dynamicSforzando: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + dynamicZ: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentTrill: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentTurn: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentTurnSlash: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentMordent: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentShortTrill: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentTremblement: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentPrecompAppoggTrill: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentPrecompSlideTrillDAnglebert: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentPrecompSlideTrillBach: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentPrecompTrillSuffixDandrieu: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentPrecompDoubleCadenceUpperPrefix: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentPrecompDoubleCadenceUpperPrefixTurn: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentPrecompTrillLowerSuffix: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassScoop: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassDoitMedium: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassFallLipShort: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassLiftMedium: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassFallRoughMedium: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassBend: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassMuteClosed: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassMuteOpen: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassFlip: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassJazzTurn: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassSmear: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + stringsDownBow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + stringsUpBow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + stringsHarmonic: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + pluckedSnapPizzicatoAbove: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + pluckedSnapPizzicatoBelow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + pluckedLeftHandPizzicato: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + keyboardPedalPed: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + keyboardPedalUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + pictChokeCymbal: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + wiggleArpeggiatoUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + arrowheadBlackUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + arrowheadBlackDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + arpeggiatoUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + arpeggiatoDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + repeat1Bar: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + repeat2Bars: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + repeat4Bars: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + repeatBarSlash: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymDiminished: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymHalfDiminished: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymAugmented: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymMajorSeventh: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymMinor: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymParensLeftTall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymParensRightTall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymBracketLeftTall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymBracketRightTall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymParensLeftVeryTall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymParensRightVeryTall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymDiagonalArrangementSlash: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5v7KleismaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5v7KleismaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5CommaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5CommaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal7CommaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal7CommaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal25SmallDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal25SmallDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal35MediumDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal35MediumDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal11MediumDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal11MediumDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal11LargeDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal11LargeDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal35LargeDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal35LargeDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp25SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat25SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp7CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat7CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp5CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat5CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp5v7kDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat5v7kUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp5v7kUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat5v7kDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp5CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat5CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp7CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat7CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp25SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat25SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp35MUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat35MDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp11MUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat11MDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp11LUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat11LDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp35LUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat35LDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp25SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat25SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp7CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat7CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp5CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat5CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp5v7kDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat5v7kUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal7v11KleismaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal7v11KleismaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal17CommaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal17CommaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal55CommaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal55CommaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal7v11CommaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal7v11CommaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5v11SmallDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5v11SmallDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp5v11SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat5v11SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp7v11CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat7v11CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp55CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat55CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp17CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat17CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp7v11kDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat7v11kUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp7v11kUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat7v11kDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp17CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat17CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp55CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat55CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp7v11CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat7v11CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp5v11SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat5v11SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp5v11SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat5v11SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp7v11CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat7v11CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp55CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat55CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp17CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat17CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp7v11kDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat7v11kUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal23CommaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal23CommaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5v19CommaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5v19CommaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5v23SmallDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5v23SmallDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp5v23SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat5v23SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp5v19CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat5v19CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp23CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat23CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp23CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat23CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp5v19CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat5v19CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp5v23SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat5v23SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp5v23SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat5v23SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp5v19CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat5v19CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp23CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat23CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal19SchismaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal19SchismaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal17KleismaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal17KleismaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal143CommaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal143CommaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal11v49CommaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal11v49CommaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal19CommaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal19CommaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal7v19CommaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal7v19CommaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal49SmallDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal49SmallDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal23SmallDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal23SmallDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5v13MediumDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5v13MediumDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal11v19MediumDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal11v19MediumDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal49MediumDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal49MediumDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5v49MediumDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5v49MediumDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal49LargeDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal49LargeDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal11v19LargeDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal11v19LargeDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5v13LargeDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5v13LargeDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp23SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat23SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp49SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat49SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp7v19CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat7v19CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp19CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat19CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp11v49CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat11v49CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp143CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat143CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp17kDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat17kUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp19sDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat19sUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp19sUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat19sDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp17kUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat17kDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp143CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat143CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp11v49CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat11v49CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp19CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat19CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp7v19CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat7v19CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp49SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat49SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp23SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat23SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp5v13MUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat5v13MDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp11v19MUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat11v19MDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp49MUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat49MDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp5v49MUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat5v49MDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp49LUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat49LDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp11v19LUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat11v19LDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp5v13LUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat5v13LDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp23SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat23SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp49SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat49SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp7v19CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat7v19CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp19CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat19CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp11v49CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat11v49CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp143CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat143CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp17kDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat17kUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp19sDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat19sUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalShaftUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalShaftDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalAcute: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalGrave: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal1MinaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal1MinaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal2MinasUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal2MinasDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal1TinaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal1TinaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal2TinasUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal2TinasDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal3TinasUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal3TinasDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal4TinasUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal4TinasDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5TinasUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5TinasDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal6TinasUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal6TinasDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal7TinasUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal7TinasDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal8TinasUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal8TinasDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal9TinasUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal9TinasDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFractionalTinaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFractionalTinaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalNarrowReversedFlat: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalNarrowReversedFlatAndFlat: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalWilsonPlus: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalWilsonMinus: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + }; + fontFamily: string; + resolution: number; + generatedOn: string; + }; + metrics: { + name: string; + smufl: boolean; + stave: { + padding: number; + endPaddingMax: number; + endPaddingMin: number; + unalignedNotePadding: number; + }; + accidental: { + noteheadAccidentalPadding: number; + leftPadding: number; + accidentalSpacing: number; + }; + clef: { + default: { + point: number; + width: number; + }; + small: { + point: number; + width: number; + }; + annotations: { + '8va': { + smuflCode: string; + default: { + point: number; + treble: { + line: number; + shiftX: number; + }; + }; + small: { + point: number; + treble: { + line: number; + shiftX: number; + }; + }; + }; + '8vb': { + smuflCode: string; + default: { + point: number; + treble: { + line: number; + shiftX: number; + }; + bass: { + line: number; + shiftX: number; + }; + }; + small: { + point: number; + treble: { + line: number; + shiftX: number; + }; + bass: { + line: number; + shiftX: number; + }; + }; + }; + }; + lineCount: { + '8': { + point: number; + shiftY: number; + }; + '7': { + point: number; + shiftY: number; + }; + '6': { + point: number; + shiftY: number; + }; + '5': { + point: number; + shiftY: number; + }; + '4': { + point: number; + shiftY: number; + }; + }; + }; + parenthesis: { + default: { + point: number; + width: number; + }; + gracenote: { + point: number; + width: number; + }; + }; + pedalMarking: { + up: { + point: number; + }; + down: { + point: number; + }; + }; + digits: { + shiftLine: number; + point: number; + tupletPoint: number; + shiftY: number; + }; + articulation: { + articStaccatissimoAbove: { + padding: number; + }; + articStaccatissimoBelow: { + padding: number; + }; + }; + tremolo: { + default: { + point: number; + spacing: number; + offsetYStemUp: number; + offsetYStemDown: number; + offsetXStemUp: number; + offsetXStemDown: number; + }; + grace: { + point: number; + spacing: number; + offsetYStemUp: number; + offsetYStemDown: number; + offsetXStemUp: number; + offsetXStemDown: number; + }; + }; + staveRepetition: { + default: { + offsetY: number; + offsetSymbol: number; + spacing: number; + }; + }; + stem: { + heightAdjustmentForFlag: number; + noteHead: { + noteheadTriangleUpHalf: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadTriangleUpBlack: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadTriangleUpWhole: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadXHalf: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadXBlack: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadXWhole: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadHalf: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadBlack: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadSquareWhite: { + offsetYBaseStemDown: number; + offsetYBaseStemUp: number; + }; + }; + }; + glyphs: { + coda: { + point: number; + shiftX: number; + shiftY: number; + }; + segno: { + shiftX: number; + }; + flag: { + shiftX: number; + tabStem: { + shiftX: number; + }; + staveTempo: { + shiftX: number; + }; + }; + clef: { + gClef: { + default: { + scale: number; + shiftY: number; + }; + small: { + shiftY: number; + }; + }; + fClef: { + default: { + shiftY: number; + }; + }; + }; + ornament: { + ornamentTurn: { + scale: number; + }; + ornamentTurnSlash: { + scale: number; + }; + }; + stringNumber: { + verticalPadding: number; + stemPadding: number; + leftPadding: number; + rightPadding: number; + }; + stroke: { + arrowheadBlackDown: { + straight: { + shiftX: number; + }; + wiggly: { + shiftX: number; + shiftY: number; + }; + }; + arrowheadBlackUp: { + straight: { + shiftX: number; + }; + wiggly: { + shiftX: number; + shiftY: number; + }; + }; + }; + textNote: { + point: number; + breathMarkTick: { + point: number; + shiftY: number; + }; + breathMarkComma: { + point: number; + }; + segno: { + point: number; + shiftX: number; + shiftY: number; + }; + coda: { + point: number; + shiftX: number; + shiftY: number; + }; + ornamentTrill: { + shiftX: number; + shiftY: number; + }; + ornamentTurn: { + point: number; + }; + ornamentTurnSlash: { + point: number; + }; + ornamentMordent: { + shiftX: number; + }; + ornamentShortTrill: { + shiftX: number; + }; + }; + noteHead: { + minPadding: number; + standard: { + restQuarterStemUp: { + point: number; + }; + restQuarterStemDown: { + point: number; + }; + }; + custom: { + noteheadCircleXStemUp: { + shiftX: number; + }; + noteheadCircleXStemDown: { + shiftX: number; + }; + noteheadDiamondHalfStemUp: { + shiftX: number; + }; + noteheadDiamondBlackStemUp: { + shiftX: number; + }; + noteheadDiamondWholeStemUp: { + shiftX: number; + }; + noteheadXHalfStemUp: { + shiftX: number; + }; + noteheadXHalfStemDown: { + shiftX: number; + }; + noteheadXWholeStemUp: { + shiftX: number; + }; + noteheadXWholeStemDown: { + shiftX: number; + }; + noteheadSquareWhiteStemDown: { + shiftX: number; + }; + noteheadSquareWhiteStemUp: { + shiftX: number; + }; + noteheadSquareBlackStemUp: { + shiftX: number; + }; + noteheadTriangleUpWholeStemUp: { + shiftX: number; + }; + }; + }; + chordSymbol: { + global: { + superscriptOffset: number; + subscriptOffset: number; + kerningOffset: number; + lowerKerningText: string[]; + upperKerningText: string[]; + spacing: number; + superSubRatio: number; + }; + csymDiminished: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymHalfDiminished: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymAugmented: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymParensLeftTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymParensRightTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymBracketLeftTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymBracketRightTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymParensLeftVeryTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymParensRightVeryTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymDiagonalArrangementSlash: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymMinor: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymMajorSeventh: { + scale: number; + leftSideBearing: number; + yOffset: number; + advanceWidth: number; + }; + accidentalSharp: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + accidentalFlat: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + }; + jazzOrnaments: { + brassScoop: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassDoitMedium: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassFallLipShort: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassLiftMedium: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassFallRoughMedium: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassBend: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassMuteClosed: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassMuteOpen: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassFlip: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassJazzTurn: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassSmear: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + }; + tuplet: { + noteHeadOffset: number; + stemOffset: number; + bottomLine: number; + topModifierOffset: number; + }; + }; + }; +}; +export default Font; diff --git a/build/types/entry/vexflow-font-custom.d.ts b/build/types/entry/vexflow-font-custom.d.ts new file mode 100644 index 0000000000..f675de9c75 --- /dev/null +++ b/build/types/entry/vexflow-font-custom.d.ts @@ -0,0 +1,86 @@ +export declare const Font: { + data: { + resolution: number; + fontFamily: string; + glyphs: { + noteheadSquareWhite: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadSquareBlack: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalBuyukMucennebFlat: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalBakiyeFlat: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalKucukMucennebSharp: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalKoron: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalSori: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + vexAccidentalMicrotonal2: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + vexAccidentalMicrotonal3: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + vexAccidentalMicrotonal4: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + vexNoteHeadRectBlack: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + vexNoteHeadRectWhite: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + }; + }; + metrics: { + name: string; + smufl: boolean; + glyphs: {}; + }; +}; +export default Font; diff --git a/build/types/entry/vexflow-font-gonville.d.ts b/build/types/entry/vexflow-font-gonville.d.ts new file mode 100644 index 0000000000..d3b6e3281d --- /dev/null +++ b/build/types/entry/vexflow-font-gonville.d.ts @@ -0,0 +1,1261 @@ +export declare const Font: { + data: { + glyphs: { + bracketTop: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + bracketBottom: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + barlineTick: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + breathMarkTick: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + segno: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + coda: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + gClef: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + cClef: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + fClef: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + unpitchedPercussionClef1: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + '6stringTabClef': { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSig0: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSig1: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSig2: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSig3: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSig4: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSig5: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSig6: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSig7: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSig8: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSig9: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSigCommon: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSigCutCommon: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSigPlus: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSigPlusSmall: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSigMinus: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSigParensRight: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSigParensRightSmall: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSigParensLeft: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSigParensLeftSmall: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadDoubleWhole: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadWhole: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadHalf: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadBlack: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadXWhole: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadXHalf: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadXBlack: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadCircleX: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadTriangleUpWhole: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadTriangleUpHalf: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadTriangleUpBlack: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadDiamondWhole: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadDiamondHalf: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadDiamondBlack: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + augmentationDot: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + tremolo1: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + flag8thUp: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + flag8thDown: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + flag16thUp: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + flag16thDown: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + flag32ndUp: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + flag32ndDown: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + flag64thUp: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + flag64thDown: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + flag128thUp: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + flag128thDown: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalFlat: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalNatural: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalSharp: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalDoubleSharp: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalDoubleFlat: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalParensLeft: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalParensRight: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalQuarterToneFlatStein: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalThreeQuarterTonesFlatZimmermann: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalQuarterToneSharpStein: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalThreeQuarterTonesSharpStein: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalBuyukMucennebFlat: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalBakiyeFlat: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalKomaSharp: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalKucukMucennebSharp: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + articAccentAbove: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + articAccentBelow: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + articTenutoAbove: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + articTenutoBelow: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + articStaccatoAbove: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + articStaccatoBelow: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + articStaccatissimoAbove: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + articStaccatissimoBelow: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + articMarcatoAbove: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + articMarcatoBelow: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + fermataAbove: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + fermataBelow: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + breathMarkComma: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + breathMarkUpbow: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + caesura: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + caesuraCurved: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + restMaxima: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + restDoubleWhole: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + restWhole: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + restHalf: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + restQuarter: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + rest8th: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + rest16th: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + rest32nd: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + rest64th: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + rest128th: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + dynamicPiano: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + dynamicMezzo: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + dynamicForte: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + dynamicRinforzando: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + dynamicSforzando: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + dynamicZ: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + ornamentTrill: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + ornamentTurn: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + ornamentTurnSlash: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + ornamentMordent: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + ornamentShortTrill: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + ornamentTremblement: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + ornamentPrecompAppoggTrill: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + ornamentPrecompSlideTrillDAnglebert: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + ornamentPrecompSlideTrillBach: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + ornamentPrecompTrillSuffixDandrieu: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + ornamentPrecompDoubleCadenceUpperPrefix: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + ornamentPrecompDoubleCadenceUpperPrefixTurn: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + ornamentPrecompTrillLowerSuffix: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + stringsDownBow: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + stringsUpBow: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + stringsHarmonic: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + pluckedSnapPizzicatoAbove: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + pluckedSnapPizzicatoBelow: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + pluckedLeftHandPizzicato: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + keyboardPedalPed: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + keyboardPedalUp: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + pictChokeCymbal: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + wiggleArpeggiatoUp: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + arrowheadBlackUp: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + arrowheadBlackDown: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + vexAccidentalMicrotonal1: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + vexAccidentalMicrotonal2: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + vexWiggleArpeggioUp: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + vexNoteHeadMutedBreve: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + }; + cssFontWeight: string; + ascender: number; + underlinePosition: number; + cssFontStyle: string; + boundingBox: { + yMin: number; + xMin: number; + yMax: number; + xMax: number; + }; + resolution: number; + original_font_information: { + postscript_name: string; + version_string: string; + vendor_url: string; + full_font_name: string; + font_family_name: string; + copyright: string; + description: string; + trademark: string; + designer: string; + designer_url: string; + unique_font_identifier: string; + license_url: string; + license_description: string; + manufacturer_name: string; + font_sub_family_name: string; + }; + descender: number; + fontFamily: string; + lineHeight: number; + underlineThickness: number; + }; + metrics: { + name: string; + smufl: boolean; + stave: { + padding: number; + endPaddingMax: number; + endPaddingMin: number; + unalignedNotePadding: number; + }; + accidental: { + noteheadAccidentalPadding: number; + leftPadding: number; + accidentalSpacing: number; + }; + clef: { + default: { + point: number; + width: number; + }; + small: { + point: number; + width: number; + }; + annotations: { + '8va': { + smuflCode: string; + default: { + point: number; + treble: { + line: number; + shiftX: number; + }; + }; + small: { + point: number; + treble: { + line: number; + shiftX: number; + }; + }; + }; + '8vb': { + smuflCode: string; + default: { + point: number; + treble: { + line: number; + shiftX: number; + }; + bass: { + line: number; + shiftX: number; + }; + }; + small: { + point: number; + treble: { + line: number; + shiftX: number; + }; + bass: { + line: number; + shiftX: number; + }; + }; + }; + }; + lineCount: { + '8': { + point: number; + shiftY: number; + }; + '7': { + point: number; + shiftY: number; + }; + '6': { + point: number; + shiftY: number; + }; + '5': { + point: number; + shiftY: number; + }; + '4': { + point: number; + shiftY: number; + }; + }; + }; + parenthesis: { + default: { + point: number; + width: number; + }; + gracenote: { + point: number; + width: number; + }; + }; + pedalMarking: { + up: { + point: number; + }; + down: { + point: number; + }; + }; + digits: { + point: number; + tupletPoint: number; + }; + tremolo: { + default: { + point: number; + spacing: number; + offsetYStemUp: number; + offsetYStemDown: number; + offsetXStemUp: number; + offsetXStemDown: number; + }; + grace: { + point: number; + spacing: number; + offsetYStemUp: number; + offsetYStemDown: number; + offsetXStemUp: number; + offsetXStemDown: number; + }; + }; + staveRepetition: { + default: { + offsetY: number; + offsetSymbol: number; + spacing: number; + }; + }; + stem: { + heightAdjustmentForFlag: number; + noteHead: { + noteheadTriangleUpHalf: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadTriangleUpBlack: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadTriangleUpWhole: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadXHalf: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadXBlack: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadXWhole: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadHalf: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadBlack: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadSquareWhite: { + offsetYBaseStemDown: number; + offsetYBaseStemUp: number; + }; + }; + }; + glyphs: { + flag: { + shiftX: number; + flag8thDown: { + shiftX: number; + }; + flag16thDown: { + shiftX: number; + }; + flag32ndDown: { + shiftX: number; + shiftY: number; + }; + flag64thDown: { + shiftX: number; + shiftY: number; + }; + flag128thDown: { + shiftX: number; + shiftY: number; + }; + flag32ndUp: { + shiftY: number; + }; + flag64thUp: { + shiftY: number; + }; + flag128thUp: { + shiftY: number; + }; + }; + stringNumber: { + verticalPadding: number; + stemPadding: number; + leftPadding: number; + rightPadding: number; + }; + textNote: { + point: number; + default: {}; + ornamentTrill: { + shiftX: number; + shiftY: number; + }; + }; + noteHead: { + minPadding: number; + custom: { + noteheadDiamondWholeStemUp: { + shiftX: number; + }; + noteheadCircleXStemUp: { + shiftX: number; + }; + noteheadXWholeStemUp: { + shiftX: number; + }; + noteheadTriangleUpWholeStemUp: { + shiftX: number; + }; + }; + }; + chordSymbol: { + global: { + superscriptOffset: number; + subscriptOffset: number; + kerningOffset: number; + lowerKerningText: string[]; + upperKerningText: string[]; + spacing: number; + superSubRatio: number; + }; + csymDiminished: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymHalfDiminished: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymAugmented: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymParensLeftTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymParensRightTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymBracketLeftTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymBracketRightTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymParensLeftVeryTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymParensRightVeryTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymDiagonalArrangementSlash: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymMinor: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymMajorSeventh: { + scale: number; + leftSideBearing: number; + yOffset: number; + advanceWidth: number; + }; + accidentalSharp: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + accidentalFlat: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + }; + jazzOrnaments: { + brassScoop: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassDoitMedium: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassFallLipShort: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassLiftMedium: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassFallRoughMedium: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassBend: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassMuteClosed: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassMuteOpen: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassFlip: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassJazzTurn: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassSmear: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + }; + tremolo: { + default: { + shiftY: number; + }; + grace: { + shiftY: number; + }; + }; + tuplet: { + noteHeadOffset: number; + stemOffset: number; + bottomLine: number; + topModifierOffset: number; + }; + }; + }; +}; +export default Font; diff --git a/build/types/entry/vexflow-font-petaluma.d.ts b/build/types/entry/vexflow-font-petaluma.d.ts new file mode 100644 index 0000000000..2e514ca16f --- /dev/null +++ b/build/types/entry/vexflow-font-petaluma.d.ts @@ -0,0 +1,1893 @@ +export declare const Font: { + data: { + glyphs: { + bracketTop: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + bracketBottom: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + barlineTick: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + breathMarkTick: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + segno: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + coda: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + gClef: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + cClef: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + fClef: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + unpitchedPercussionClef1: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + '6stringTabClef': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig0: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig1: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig2: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig3: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig4: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig5: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig6: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig7: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig8: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig9: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigCommon: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigCutCommon: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigPlus: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigPlusSmall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigMinus: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigParensRight: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigParensRightSmall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigParensLeft: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigParensLeftSmall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadDoubleWhole: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadWhole: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadHalf: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadBlack: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadXWhole: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadXHalf: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadXBlack: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadCircleX: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadTriangleUpWhole: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadTriangleUpHalf: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadTriangleUpBlack: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadDiamondWhole: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadDiamondHalf: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadDiamondBlack: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadSquareWhite: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadSquareBlack: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadParenthesis: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadParenthesisRight: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadParenthesisLeft: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + augmentationDot: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + tremolo1: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag8thUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag8thDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag16thUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag16thDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag32ndUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag32ndDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag64thUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag64thDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag128thUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag128thDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalFlat: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalNatural: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalSharp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalDoubleSharp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalDoubleFlat: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalParensLeft: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalParensRight: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalQuarterToneFlatStein: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalThreeQuarterTonesFlatZimmermann: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalQuarterToneSharpStein: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalThreeQuarterTonesSharpStein: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalBuyukMucennebFlat: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalBakiyeFlat: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalKomaSharp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalKucukMucennebSharp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalKoron: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalSori: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articAccentAbove: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articAccentBelow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articTenutoAbove: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articTenutoBelow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articStaccatoAbove: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articStaccatoBelow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articStaccatissimoAbove: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articStaccatissimoBelow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articMarcatoAbove: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articMarcatoBelow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + fermataAbove: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + fermataBelow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + breathMarkComma: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + breathMarkUpbow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + caesura: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + caesuraCurved: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + restMaxima: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + restDoubleWhole: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + restWhole: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + restHalf: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + restQuarter: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + rest8th: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + rest16th: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + rest32nd: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + rest64th: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + rest128th: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + dynamicPiano: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + dynamicMezzo: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + dynamicForte: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + dynamicRinforzando: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + dynamicSforzando: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + dynamicZ: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentTrill: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentTurn: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentTurnSlash: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentMordent: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentShortTrill: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentTremblement: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentPrecompAppoggTrill: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentPrecompSlideTrillDAnglebert: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentPrecompSlideTrillBach: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentPrecompTrillSuffixDandrieu: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentPrecompDoubleCadenceUpperPrefix: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentPrecompDoubleCadenceUpperPrefixTurn: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentPrecompTrillLowerSuffix: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassScoop: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassDoitMedium: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassFallLipShort: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassLiftMedium: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassFallRoughMedium: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassBend: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassMuteClosed: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassMuteOpen: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassFlip: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassJazzTurn: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassSmear: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + stringsDownBow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + stringsUpBow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + stringsHarmonic: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + pluckedSnapPizzicatoAbove: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + pluckedSnapPizzicatoBelow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + pluckedLeftHandPizzicato: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + keyboardPedalPed: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + keyboardPedalUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + pictChokeCymbal: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + wiggleArpeggiatoUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + arpeggiatoUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + arpeggiatoDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + repeat1Bar: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + repeat2Bars: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + repeat4Bars: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + repeatBarSlash: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymDiminished: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymHalfDiminished: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymAugmented: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymMajorSeventh: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymMinor: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymParensLeftTall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymParensRightTall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymBracketLeftTall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymBracketRightTall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymParensLeftVeryTall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymParensRightVeryTall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymDiagonalArrangementSlash: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalNarrowReversedFlat: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalNarrowReversedFlatAndFlat: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalWilsonPlus: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalWilsonMinus: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + }; + fontFamily: string; + resolution: number; + generatedOn: string; + }; + metrics: { + name: string; + smufl: boolean; + stave: { + padding: number; + endPaddingMax: number; + endPaddingMin: number; + unalignedNotePadding: number; + }; + accidental: { + noteheadAccidentalPadding: number; + leftPadding: number; + accidentalSpacing: number; + }; + clef: { + default: { + point: number; + width: number; + }; + small: { + point: number; + width: number; + }; + annotations: { + '8va': { + smuflCode: string; + default: { + point: number; + treble: { + line: number; + shiftX: number; + }; + }; + small: { + point: number; + treble: { + line: number; + shiftX: number; + }; + }; + }; + '8vb': { + smuflCode: string; + default: { + point: number; + treble: { + line: number; + shiftX: number; + }; + bass: { + line: number; + shiftX: number; + }; + }; + small: { + point: number; + treble: { + line: number; + shiftX: number; + }; + bass: { + line: number; + shiftX: number; + }; + }; + }; + }; + lineCount: { + '8': { + point: number; + shiftY: number; + }; + '7': { + point: number; + shiftY: number; + }; + '6': { + point: number; + shiftY: number; + }; + '5': { + point: number; + shiftY: number; + }; + '4': { + point: number; + shiftY: number; + }; + }; + }; + parenthesis: { + default: { + point: number; + width: number; + }; + gracenote: { + point: number; + width: number; + }; + }; + pedalMarking: { + up: { + point: number; + }; + down: { + point: number; + }; + }; + digits: { + shiftLine: number; + point: number; + tupletPoint: number; + shiftY: number; + }; + articulation: { + articStaccatissimoAbove: { + padding: number; + }; + articStaccatissimoBelow: { + padding: number; + }; + }; + tremolo: { + default: { + point: number; + spacing: number; + offsetYStemUp: number; + offsetYStemDown: number; + offsetXStemUp: number; + offsetXStemDown: number; + }; + grace: { + point: number; + spacing: number; + offsetYStemUp: number; + offsetYStemDown: number; + offsetXStemUp: number; + offsetXStemDown: number; + }; + }; + staveRepetition: { + default: { + offsetY: number; + offsetSymbol: number; + spacing: number; + }; + }; + noteHead: { + displaced: { + shiftX: number; + }; + }; + stem: { + heightAdjustmentForFlag: number; + noteHead: { + noteheadTriangleUpHalf: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadTriangleUpBlack: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadTriangleUpWhole: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadXHalf: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadXBlack: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadXWhole: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadHalf: { + offsetYBaseStemDown: number; + offsetYBaseStemUp: number; + }; + noteheadBlack: { + offsetYBaseStemDown: number; + offsetYBaseStemUp: number; + }; + noteheadSquareWhite: { + offsetYBaseStemDown: number; + offsetYBaseStemUp: number; + }; + }; + }; + glyphs: { + coda: { + point: number; + shiftX: number; + shiftY: number; + }; + segno: { + shiftX: number; + }; + flag: { + shiftX: number; + flag16thUp: { + shiftX: number; + }; + flag32ndUp: { + shiftX: number; + }; + flag64thUp: { + shiftX: number; + }; + flag128thUp: { + shiftX: number; + }; + flag16thDown: { + shiftX: number; + }; + flag32ndDown: { + shiftX: number; + }; + flag64thDown: { + shiftX: number; + }; + flag128thDown: { + shiftX: number; + }; + tabStem: { + shiftX: number; + }; + staveTempo: { + shiftX: number; + }; + }; + clef: { + gClef: { + default: { + scale: number; + shiftY: number; + }; + small: { + shiftY: number; + }; + }; + fClef: { + default: { + shiftY: number; + }; + }; + }; + ornament: { + ornamentTurn: { + scale: number; + }; + ornamentTurnSlash: { + scale: number; + }; + }; + stringNumber: { + verticalPadding: number; + stemPadding: number; + leftPadding: number; + rightPadding: number; + }; + stroke: { + arrowheadBlackDown: { + straight: { + shiftX: number; + }; + wiggly: { + shiftX: number; + shiftY: number; + }; + }; + arrowheadBlackUp: { + straight: { + shiftX: number; + }; + wiggly: { + shiftX: number; + shiftY: number; + }; + }; + }; + textNote: { + point: number; + breathMarkTick: { + point: number; + shiftY: number; + }; + breathMarkComma: { + point: number; + }; + segno: { + point: number; + shiftX: number; + shiftY: number; + }; + coda: { + point: number; + shiftX: number; + shiftY: number; + }; + ornamentTrill: { + shiftX: number; + shiftY: number; + }; + ornamentMordent: { + shiftX: number; + }; + ornamentShortTrill: { + shiftX: number; + }; + }; + noteHead: { + minPadding: number; + standard: { + noteheadBlackStemUp: { + shiftX: number; + }; + noteheadHalfStemUp: { + shiftX: number; + }; + noteheadWholeStemUp: { + shiftX: number; + }; + }; + custom: { + noteheadCircleXStemUp: { + shiftX: number; + }; + noteheadCircleXStemDown: { + shiftX: number; + }; + noteheadDiamondHalfStemUp: { + shiftX: number; + }; + noteheadDiamondBlackStemUp: { + shiftX: number; + }; + noteheadDiamondWholeStemUp: { + shiftX: number; + }; + noteheadXBlackStemUp: { + shiftX: number; + }; + noteheadXHalfStemUp: { + shiftX: number; + }; + noteheadXHalfStemDown: { + shiftX: number; + }; + noteheadXWholeStemUp: { + shiftX: number; + }; + noteheadXWholeStemDown: { + shiftX: number; + }; + noteheadSquareWhiteStemDown: { + shiftX: number; + }; + noteheadSquareWhiteStemUp: { + shiftX: number; + }; + noteheadSquareBlackStemUp: { + shiftX: number; + }; + noteheadTriangleUpWholeStemUp: { + shiftX: number; + }; + }; + }; + chordSymbol: { + global: { + superscriptOffset: number; + subscriptOffset: number; + kerningOffset: number; + lowerKerningText: string[]; + upperKerningText: string[]; + spacing: number; + superSubRatio: number; + }; + csymDiminished: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymHalfDiminished: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymAugmented: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymParensLeftTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymParensRightTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymBracketLeftTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymBracketRightTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymParensLeftVeryTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymParensRightVeryTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymDiagonalArrangementSlash: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymMinor: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymMajorSeventh: { + scale: number; + leftSideBearing: number; + yOffset: number; + advanceWidth: number; + }; + accidentalSharp: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + accidentalFlat: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + }; + jazzOrnaments: { + brassScoop: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassDoitMedium: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassFallLipShort: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassLiftMedium: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassFallRoughMedium: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassBend: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassMuteClosed: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassMuteOpen: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassFlip: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassJazzTurn: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassSmear: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + }; + tuplet: { + noteHeadOffset: number; + stemOffset: number; + bottomLine: number; + topModifierOffset: number; + }; + }; + }; +}; +export default Font; diff --git a/build/types/entry/vexflow-gonville.d.ts b/build/types/entry/vexflow-gonville.d.ts new file mode 100644 index 0000000000..30b1c341ee --- /dev/null +++ b/build/types/entry/vexflow-gonville.d.ts @@ -0,0 +1,3 @@ +import { Vex } from '../src/vex'; +export * from '../src/index'; +export default Vex; diff --git a/build/types/entry/vexflow-petaluma.d.ts b/build/types/entry/vexflow-petaluma.d.ts new file mode 100644 index 0000000000..30b1c341ee --- /dev/null +++ b/build/types/entry/vexflow-petaluma.d.ts @@ -0,0 +1,3 @@ +import { Vex } from '../src/vex'; +export * from '../src/index'; +export default Vex; diff --git a/build/types/entry/vexflow.d.ts b/build/types/entry/vexflow.d.ts new file mode 100644 index 0000000000..30b1c341ee --- /dev/null +++ b/build/types/entry/vexflow.d.ts @@ -0,0 +1,3 @@ +import { Vex } from '../src/vex'; +export * from '../src/index'; +export default Vex; diff --git a/build/types/src/accidental.d.ts b/build/types/src/accidental.d.ts new file mode 100644 index 0000000000..33b50bbe8c --- /dev/null +++ b/build/types/src/accidental.d.ts @@ -0,0 +1,66 @@ +import { Glyph } from './glyph'; +import { Modifier } from './modifier'; +import { ModifierContextState } from './modifiercontext'; +import { Note } from './note'; +import { Voice } from './voice'; +export declare type Line = { + column: number; + line: number; + flatLine: boolean; + dblSharpLine: boolean; + numAcc: number; + width: number; +}; +/** + * An `Accidental` inherits from `Modifier`, and is formatted within a + * `ModifierContext`. Accidentals are modifiers that can be attached to + * notes. Support is included for both western and microtonal accidentals. + * + * See `tests/accidental_tests.ts` for usage examples. + */ +export declare class Accidental extends Modifier { + /** Accidental code provided to the constructor. */ + readonly type: string; + /** To enable logging for this class. Set `Vex.Flow.Accidental.DEBUG` to `true`. */ + static DEBUG: boolean; + protected accidental: { + code: string; + parenRightPaddingAdjustment: number; + }; + render_options: { + parenLeftPadding: number; + font_scale: number; + parenRightPadding: number; + }; + protected cautionary: boolean; + protected glyph: Glyph; + protected parenRight?: Glyph; + protected parenLeft?: Glyph; + /** Accidentals category string. */ + static get CATEGORY(): string; + /** Arrange accidentals inside a ModifierContext. */ + static format(accidentals: Accidental[], state: ModifierContextState): void; + /** Helper function to determine whether two lines of accidentals collide vertically */ + static checkCollision(line1: Line, line2: Line): boolean; + /** + * Use this method to automatically apply accidentals to a set of `voices`. + * The accidentals will be remembered between all the voices provided. + * Optionally, you can also provide an initial `keySignature`. + */ + static applyAccidentals(voices: Voice[], keySignature: string): void; + /** + * Create accidental. + * @param type value from `Vex.Flow.accidentalCodes.accidentals` table in `tables.ts`. + * For example: `#`, `##`, `b`, `n`, etc. + */ + constructor(type: string); + protected reset(): void; + /** Get width in pixels. */ + getWidth(): number; + /** Attach this accidental to `note`, which must be a `StaveNote`. */ + setNote(note: Note): this; + /** If called, draws parenthesis around accidental. */ + setAsCautionary(): this; + /** Render accidental onto canvas. */ + draw(): void; +} diff --git a/build/types/src/annotation.d.ts b/build/types/src/annotation.d.ts new file mode 100644 index 0000000000..0d50c03484 --- /dev/null +++ b/build/types/src/annotation.d.ts @@ -0,0 +1,60 @@ +import { FontInfo } from './font'; +import { Modifier } from './modifier'; +import { ModifierContextState } from './modifiercontext'; +export declare enum AnnotationHorizontalJustify { + LEFT = 1, + CENTER = 2, + RIGHT = 3, + CENTER_STEM = 4 +} +export declare enum AnnotationVerticalJustify { + TOP = 1, + CENTER = 2, + BOTTOM = 3, + CENTER_STEM = 4 +} +/** + * Annotations are modifiers that can be attached to + * notes. + * + * See `tests/annotation_tests.ts` for usage examples. + */ +export declare class Annotation extends Modifier { + /** To enable logging for this class. Set `Vex.Flow.Annotation.DEBUG` to `true`. */ + static DEBUG: boolean; + /** Annotations category string. */ + static get CATEGORY(): string; + static TEXT_FONT: Required; + /** Text annotations can be positioned and justified relative to the note. */ + static HorizontalJustify: typeof AnnotationHorizontalJustify; + static HorizontalJustifyString: Record; + static VerticalJustify: typeof AnnotationVerticalJustify; + static VerticalJustifyString: Record; + /** Arrange annotations within a `ModifierContext` */ + static format(annotations: Annotation[], state: ModifierContextState): boolean; + protected horizontalJustification: AnnotationHorizontalJustify; + protected verticalJustification: AnnotationVerticalJustify; + protected text: string; + /** + * Annotations inherit from `Modifier` and is positioned correctly when + * in a `ModifierContext`. + * Create a new `Annotation` with the string `text`. + */ + constructor(text: string); + /** + * Set vertical position of text (above or below stave). + * @param just value in `AnnotationVerticalJustify`. + */ + setVerticalJustification(just: string | AnnotationVerticalJustify): this; + /** + * Get horizontal justification. + */ + getJustification(): AnnotationHorizontalJustify; + /** + * Set horizontal justification. + * @param justification value in `Annotation.Justify`. + */ + setJustification(just: string | AnnotationHorizontalJustify): this; + /** Render text beside the note. */ + draw(): void; +} diff --git a/build/types/src/articulation.d.ts b/build/types/src/articulation.d.ts new file mode 100644 index 0000000000..d15e493e27 --- /dev/null +++ b/build/types/src/articulation.d.ts @@ -0,0 +1,62 @@ +import { Builder } from './easyscore'; +import { Glyph } from './glyph'; +import { Modifier } from './modifier'; +import { ModifierContextState } from './modifiercontext'; +import { StemmableNote } from './stemmablenote'; +export interface ArticulationStruct { + code?: string; + aboveCode?: string; + belowCode?: string; + between_lines: boolean; +} +/** + * Articulations and Accents are modifiers that can be + * attached to notes. The complete list of articulations is available in + * `tables.ts` under `Vex.Flow.articulationCodes`. + * + * See `tests/articulation_tests.ts` for usage examples. + */ +export declare class Articulation extends Modifier { + /** To enable logging for this class. Set `Vex.Flow.Articulation.DEBUG` to `true`. */ + static DEBUG: boolean; + /** Articulations category string. */ + static get CATEGORY(): string; + protected static readonly INITIAL_OFFSET: number; + /** Articulation code provided to the constructor. */ + readonly type: string; + render_options: { + font_scale: number; + }; + protected articulation: ArticulationStruct; + protected glyph: Glyph; + /** + * FIXME: + * Most of the complex formatting logic (ie: snapping to space) is + * actually done in .render(). But that logic belongs in this method. + * + * Unfortunately, this isn't possible because, by this point, stem lengths + * have not yet been finalized. Finalized stem lengths are required to determine the + * initial position of any stem-side articulation. + * + * This indicates that all objects should have their stave set before being + * formatted. It can't be an optional if you want accurate vertical positioning. + * Consistently positioned articulations that play nice with other modifiers + * won't be possible until we stop relying on render-time formatting. + * + * Ideally, when this function has completed, the vertical articulation positions + * should be ready to render without further adjustment. But the current state + * is far from this ideal. + */ + static format(articulations: Articulation[], state: ModifierContextState): boolean; + static easyScoreHook({ articulations }: { + articulations: string; + }, note: StemmableNote, builder: Builder): void; + /** + * Create a new articulation. + * @param type entry in `Vex.Flow.articulationCodes` in `tables.ts` + */ + constructor(type: string); + protected reset(): void; + /** Render articulation in position next to note. */ + draw(): void; +} diff --git a/build/types/src/barnote.d.ts b/build/types/src/barnote.d.ts new file mode 100644 index 0000000000..b3175ff022 --- /dev/null +++ b/build/types/src/barnote.d.ts @@ -0,0 +1,29 @@ +import { ModifierContext } from './modifiercontext'; +import { Note } from './note'; +import { BarlineType } from './stavebarline'; +/** + * A `BarNote` is used to render bar lines (from `barline.ts`). `BarNote`s can + * be added to a voice and rendered in the middle of a stave. Since it has no + * duration, it consumes no `tick`s, and is dealt with appropriately by the formatter. + * + * See `tests/barnote_tests.ts` for usage examples. + */ +export declare class BarNote extends Note { + /** To enable logging for this class. Set `Vex.Flow.BarNote.DEBUG` to `true`. */ + static DEBUG: boolean; + static get CATEGORY(): string; + protected metrics: { + widths: Record; + }; + protected type: BarlineType; + constructor(type?: string | BarlineType); + /** Get the type of bar note.*/ + getType(): BarlineType; + /** Set the type of bar note. */ + setType(type: string | BarlineType): this; + addToModifierContext(mc: ModifierContext): this; + /** Overridden to ignore. */ + preFormat(): this; + /** Render note to stave. */ + draw(): void; +} diff --git a/build/types/src/beam.d.ts b/build/types/src/beam.d.ts new file mode 100644 index 0000000000..1f8fdde7fd --- /dev/null +++ b/build/types/src/beam.d.ts @@ -0,0 +1,124 @@ +import { Element } from './element'; +import { Fraction } from './fraction'; +import { RenderContext } from './rendercontext'; +import { StemmableNote } from './stemmablenote'; +import { Voice } from './voice'; +/** `Beams` span over a set of `StemmableNotes`. */ +export declare class Beam extends Element { + static get CATEGORY(): string; + render_options: { + flat_beam_offset?: number; + flat_beams: boolean; + secondary_break_ticks?: number; + show_stemlets: boolean; + beam_width: number; + max_slope: number; + min_slope: number; + slope_iterations: number; + slope_cost: number; + stemlet_extension: number; + partial_beam_length: number; + min_flat_beam_offset: number; + }; + notes: StemmableNote[]; + postFormatted: boolean; + slope: number; + private readonly stem_direction; + private readonly ticks; + private y_shift; + private break_on_indices; + private beam_count; + private unbeamable?; + /** Get the direction of the beam */ + getStemDirection(): number; + /** + * Get the default beam groups for a provided time signature. + * Attempt to guess if the time signature is not found in table. + * Currently this is fairly naive. + */ + static getDefaultBeamGroups(time_sig: string): Fraction[]; + /** + * A helper function to automatically build basic beams for a voice. For more + * complex auto-beaming use `Beam.generateBeams()`. + * @param voice the voice to generate the beams for + * @param stem_direction a stem direction to apply to the entire voice + * @param groups an array of `Fraction` representing beat groupings for the beam + */ + static applyAndGetBeams(voice: Voice, stem_direction?: number, groups?: Fraction[]): Beam[]; + /** + * A helper function to autimatically build beams for a voice with + * configuration options. + * + * Example configuration object: + * + * ``` + * config = { + * groups: [new Vex.Flow.Fraction(2, 8)], + * stem_direction: -1, + * beam_rests: true, + * beam_middle_only: true, + * show_stemlets: false + * }; + * ``` + * @param notes an array of notes to create the beams for + * @param config the configuration object + * @param config.stem_direction set to apply the same direction to all notes + * @param config.beam_rests set to `true` to include rests in the beams + * @param config.beam_middle_only set to `true` to only beam rests in the middle of the beat + * @param config.show_stemlets set to `true` to draw stemlets for rests + * @param config.maintain_stem_directions set to `true` to not apply new stem directions + * @param config.groups array of `Fractions` that represent the beat structure to beam the notes + * + */ + static generateBeams(notes: StemmableNote[], config?: { + flat_beam_offset?: number; + flat_beams?: boolean; + secondary_breaks?: string; + show_stemlets?: boolean; + maintain_stem_directions?: boolean; + beam_middle_only?: boolean; + beam_rests?: boolean; + groups?: Fraction[]; + stem_direction?: number; + }): Beam[]; + constructor(notes: StemmableNote[], auto_stem?: boolean); + /** Get the notes in this beam. */ + getNotes(): StemmableNote[]; + /** Get the max number of beams in the set of notes. */ + getBeamCount(): number; + /** Set which note `indices` to break the secondary beam at. */ + breakSecondaryAt(indices: number[]): this; + /** Return the y coordinate for linear function. */ + getSlopeY(x: number, first_x_px: number, first_y_px: number, slope: number): number; + /** Calculate the best possible slope for the provided notes. */ + calculateSlope(): void; + /** Calculate a slope and y-shift for flat beams. */ + calculateFlatSlope(): void; + /** Return the Beam y offset. */ + getBeamYToDraw(): number; + /** + * Create new stems for the notes in the beam, so that each stem + * extends into the beams. + */ + applyStemExtensions(): void; + /** Return upper level beam direction. */ + lookupBeamDirection(duration: string, prev_tick: number, tick: number, next_tick: number): string; + /** Get the x coordinates for the beam lines of specific `duration`. */ + getBeamLines(duration: string): { + start: number; + end?: number; + }[]; + /** Render the stems for each note. */ + protected drawStems(ctx: RenderContext): void; + protected drawBeamLines(ctx: RenderContext): void; + /** Pre-format the beam. */ + preFormat(): this; + /** + * Post-format the beam. This can only be called after + * the notes in the beam have both `x` and `y` values. ie: they've + * been formatted and have staves. + */ + postFormat(): void; + /** Render the beam to the canvas context */ + draw(): void; +} diff --git a/build/types/src/bend.d.ts b/build/types/src/bend.d.ts new file mode 100644 index 0000000000..a9a98cd821 --- /dev/null +++ b/build/types/src/bend.d.ts @@ -0,0 +1,73 @@ +import { FontInfo } from './font'; +import { Modifier } from './modifier'; +import { ModifierContextState } from './modifiercontext'; +export interface BendPhrase { + x?: number; + type: number; + text: string; + width?: number; + draw_width?: number; +} +/** Bend implements tablature bends. */ +export declare class Bend extends Modifier { + static get CATEGORY(): string; + static get UP(): number; + static get DOWN(): number; + /** Default text font. */ + static TEXT_FONT: Required; + static format(bends: Bend[], state: ModifierContextState): boolean; + protected text: string; + protected tap: string; + protected release: boolean; + protected phrase: BendPhrase[]; + render_options: { + line_width: number; + release_width: number; + bend_width: number; + line_style: string; + }; + /** + * Example of a phrase: + * ``` + * [{ + * type: UP, + * text: "whole" + * width: 8; + * }, + * { + * type: DOWN, + * text: "whole" + * width: 8; + * }, + * { + * type: UP, + * text: "half" + * width: 8; + * }, + * { + * type: UP, + * text: "whole" + * width: 8; + * }, + * { + * type: DOWN, + * text: "1 1/2" + * width: 8; + * }] + * ``` + * @param text text for bend ("Full", "Half", etc.) (DEPRECATED) + * @param release if true, render a release. (DEPRECATED) + * @param phrase if set, ignore "text" and "release", and use the more sophisticated phrase specified + */ + constructor(text: string, release?: boolean, phrase?: BendPhrase[]); + /** Set horizontal shift in pixels. */ + setXShift(value: number): this; + setTap(value: string): this; + /** Get text provided in the constructor. */ + getText(): string; + getTextHeight(): number; + /** Recalculate width. */ + protected updateWidth(): this; + /** Draw the bend on the rendering context. */ + draw(): void; +} diff --git a/build/types/src/boundingbox.d.ts b/build/types/src/boundingbox.d.ts new file mode 100644 index 0000000000..dfe3b3bce0 --- /dev/null +++ b/build/types/src/boundingbox.d.ts @@ -0,0 +1,42 @@ +export interface Bounds { + x: number; + y: number; + w: number; + h: number; +} +export declare class BoundingBox implements Bounds { + x: number; + y: number; + w: number; + h: number; + /** + * Create a new copy. + */ + static copy(that: BoundingBox): BoundingBox; + constructor(x: number, y: number, w: number, h: number); + /** Get x position. */ + getX(): number; + /** Get y position. */ + getY(): number; + /** Get width. */ + getW(): number; + /** Get height. */ + getH(): number; + /** Set x position. */ + setX(x: number): this; + /** Set y position. */ + setY(y: number): this; + /** Set width. */ + setW(w: number): this; + /** Set height. */ + setH(h: number): this; + /** Move to position. */ + move(x: number, y: number): this; + /** Clone. */ + clone(): BoundingBox; + /** + * Merge my box with given box. Creates a bigger bounding box unless + * the given box is contained in this one. + */ + mergeWith(boundingBox: BoundingBox): this; +} diff --git a/build/types/src/boundingboxcomputation.d.ts b/build/types/src/boundingboxcomputation.d.ts new file mode 100644 index 0000000000..3ad9086536 --- /dev/null +++ b/build/types/src/boundingboxcomputation.d.ts @@ -0,0 +1,33 @@ +/** + * BoundingBoxComputation computes metrics for a bounding box by continuously + * taking canvas path commands. + * + * Warning: This class is merely a crutch to get bounding box information without + * explicit metadata. This is likely to get deprecated following SMuFL support. + * + * based on: https://github.com/canvg/canvg/blob/master/src/BoundingBox.ts (MIT License) + */ +export declare class BoundingBoxComputation { + protected x1: number; + protected y1: number; + protected x2: number; + protected y2: number; + /** Get calculated X1. */ + getX1(): number; + /** Get calculated Y1. */ + getY1(): number; + /** Get calculated width. */ + width(): number; + /** Get calculated height. */ + height(): number; + /** Add point to BoundingBox. */ + addPoint(x: number, y: number): void; + /** Add X to BoundingBox. */ + addX(x: number): void; + /** Add Y to BoundingBox. */ + addY(y: number): void; + /** Add quadratic curve to BoundingBox. */ + addQuadraticCurve(p0x: number, p0y: number, p1x: number, p1y: number, p2x: number, p2y: number): void; + /** Add bezier curve to BoundingBox. */ + addBezierCurve(p0x: number, p0y: number, p1x: number, p1y: number, p2x: number, p2y: number, p3x: number, p3y: number): void; +} diff --git a/build/types/src/canvascontext.d.ts b/build/types/src/canvascontext.d.ts new file mode 100644 index 0000000000..66c63216fe --- /dev/null +++ b/build/types/src/canvascontext.d.ts @@ -0,0 +1,89 @@ +import { FontInfo } from './font'; +import { GroupAttributes, RenderContext, TextMeasure } from './rendercontext'; +interface OffscreenCanvas extends EventTarget { + width: number; + height: number; +} +interface OffscreenCanvasRenderingContext2D extends CanvasState, CanvasTransform, CanvasCompositing, CanvasImageSmoothing, CanvasFillStrokeStyles, CanvasShadowStyles, CanvasFilters, CanvasRect, CanvasDrawPath, CanvasText, CanvasDrawImage, CanvasImageData, CanvasPathDrawingStyles, CanvasTextDrawingStyles, CanvasPath { + readonly canvas: OffscreenCanvas; +} +/** + * A rendering context for the Canvas backend. This class serves as a proxy for the + * underlying CanvasRenderingContext2D object, part of the browser's API. + */ +export declare class CanvasContext extends RenderContext { + /** The 2D rendering context from the Canvas API. Forward method calls to this object. */ + context2D: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D; + /** + * The HTMLCanvasElement or OffscreenCanvas that is associated with the above context. + * If there was no associated `` element, just store the default WIDTH / HEIGHT. + */ + canvas: HTMLCanvasElement | OffscreenCanvas | { + width: number; + height: number; + }; + /** Height of one line of text (in pixels). */ + textHeight: number; + static get WIDTH(): number; + static get HEIGHT(): number; + static get CANVAS_BROWSER_SIZE_LIMIT(): number; + /** + * Ensure that width and height do not exceed the browser limit. + * @returns array of [width, height] clamped to the browser limit. + */ + static sanitizeCanvasDims(width: number, height: number): [number, number]; + constructor(context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D); + /** + * Set all pixels to transparent black rgba(0,0,0,0). + */ + clear(): void; + openGroup(cls?: string, id?: string, attrs?: GroupAttributes): any; + closeGroup(): void; + add(child: any): void; + setFillStyle(style: string): this; + /** CanvasContext ignores `setBackgroundFillStyle()`. */ + setBackgroundFillStyle(style: string): this; + setStrokeStyle(style: string): this; + setShadowColor(color: string): this; + setShadowBlur(blur: number): this; + setLineWidth(width: number): this; + setLineCap(capType: CanvasLineCap): this; + setLineDash(dash: number[]): this; + scale(x: number, y: number): this; + resize(width: number, height: number): this; + rect(x: number, y: number, width: number, height: number): this; + fillRect(x: number, y: number, width: number, height: number): this; + /** + * Set the pixels in a rectangular area to transparent black rgba(0,0,0,0). + */ + clearRect(x: number, y: number, width: number, height: number): this; + beginPath(): this; + moveTo(x: number, y: number): this; + lineTo(x: number, y: number): this; + bezierCurveTo(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): this; + quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): this; + arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, counterclockwise: boolean): this; + fill(): this; + stroke(): this; + closePath(): this; + measureText(text: string): TextMeasure; + fillText(text: string, x: number, y: number): this; + save(): this; + restore(): this; + set fillStyle(style: string | CanvasGradient | CanvasPattern); + get fillStyle(): string | CanvasGradient | CanvasPattern; + set strokeStyle(style: string | CanvasGradient | CanvasPattern); + get strokeStyle(): string | CanvasGradient | CanvasPattern; + /** + * @param f is 1) a `FontInfo` object or + * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or + * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided). + * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt'). + * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900). + * @param style is a string (e.g., 'italic', 'normal'). + */ + setFont(f?: string | FontInfo, size?: string | number, weight?: string | number, style?: string): this; + /** Return a string of the form `'italic bold 15pt Arial'` */ + getFont(): string; +} +export {}; diff --git a/build/types/src/chordsymbol.d.ts b/build/types/src/chordsymbol.d.ts new file mode 100644 index 0000000000..7ff24dee38 --- /dev/null +++ b/build/types/src/chordsymbol.d.ts @@ -0,0 +1,149 @@ +import { FontInfo } from './font'; +import { Glyph } from './glyph'; +import { Modifier } from './modifier'; +import { ModifierContextState } from './modifiercontext'; +import { TextFormatter } from './textformatter'; +export interface ChordSymbolBlock { + text: string; + symbolType: SymbolTypes; + symbolModifier: SymbolModifiers; + xShift: number; + yShift: number; + vAlign: boolean; + width: number; + glyph?: Glyph; +} +export declare enum ChordSymbolHorizontalJustify { + LEFT = 1, + CENTER = 2, + RIGHT = 3, + CENTER_STEM = 4 +} +export declare enum ChordSymbolVerticalJustify { + TOP = 1, + BOTTOM = 2 +} +export declare enum SymbolTypes { + GLYPH = 1, + TEXT = 2, + LINE = 3 +} +export declare enum SymbolModifiers { + NONE = 1, + SUBSCRIPT = 2, + SUPERSCRIPT = 3 +} +/** + * ChordSymbol is a modifier that creates a chord symbol above/below a chord. + * As a modifier, it is attached to an existing note. + */ +export declare class ChordSymbol extends Modifier { + static DEBUG: boolean; + static get CATEGORY(): string; + static readonly HorizontalJustify: typeof ChordSymbolHorizontalJustify; + static readonly HorizontalJustifyString: Record; + static readonly VerticalJustify: typeof ChordSymbolVerticalJustify; + static readonly VerticalJustifyString: Record; + static get superSubRatio(): number; + /** Currently unused: Globally turn off text formatting, if the built-in formatting does not work for your font. */ + static set NO_TEXT_FORMAT(val: boolean); + static get NO_TEXT_FORMAT(): boolean; + static getMetricForGlyph(glyphCode: string): any; + static get engravingFontResolution(): number; + static get spacingBetweenBlocks(): number; + static getWidthForGlyph(glyph: Glyph): number; + static getYShiftForGlyph(glyph: Glyph): number; + static getXShiftForGlyph(glyph: Glyph): number; + static get superscriptOffset(): number; + static get subscriptOffset(): number; + static get kerningOffset(): number; + static readonly glyphs: Record; + static readonly symbolTypes: typeof SymbolTypes; + static readonly symbolModifiers: typeof SymbolModifiers; + static get metrics(): any; + static get lowerKerningText(): string[]; + static get upperKerningText(): string[]; + static isSuperscript(block: ChordSymbolBlock): boolean; + static isSubscript(block: ChordSymbolBlock): boolean; + /** + * Estimate the width of the whole chord symbol, based on the sum of the widths of the individual blocks. + * Estimate how many lines above/below the staff we need. + */ + static format(symbols: ChordSymbol[], state: ModifierContextState): boolean; + /** Currently unused. */ + protected static noFormat: boolean; + protected symbolBlocks: ChordSymbolBlock[]; + protected horizontal: number; + protected vertical: number; + protected useKerning: boolean; + protected reportWidth: boolean; + protected textFormatter: TextFormatter; + constructor(); + /** + * Default text font. + * Choose a font family that works well with the current music engraving font. + * @override `Element.TEXT_FONT`. + */ + static get TEXT_FONT(): Required; + /** + * The offset is specified in `em`. Scale this value by the font size in pixels. + */ + get superscriptOffset(): number; + get subscriptOffset(): number; + setReportWidth(value: boolean): this; + getReportWidth(): boolean; + updateOverBarAdjustments(): void; + updateKerningAdjustments(): void; + /** Do some basic kerning so that letter chords like 'A' don't have the extensions hanging off to the right. */ + getKerningAdjustment(j: number): number; + /** + * ChordSymbol allows multiple blocks so we can mix glyphs and font text. + * Each block can have its own vertical orientation. + */ + getSymbolBlock(params?: any): ChordSymbolBlock; + /** Add a symbol to this chord, could be text, glyph or line. */ + addSymbolBlock(parameters: any): this; + /** Add a text block. */ + addText(text: string, parameters?: any): this; + /** Add a text block with superscript modifier. */ + addTextSuperscript(text: string): this; + /** Add a text block with subscript modifier. */ + addTextSubscript(text: string): this; + /** Add a glyph block with superscript modifier. */ + addGlyphSuperscript(glyph: string): this; + /** Add a glyph block. */ + addGlyph(glyph: string, params?: any): this; + /** + * Add a glyph for each character in 'text'. If the glyph is not available, use text from the font. + * e.g. `addGlyphOrText('(+5#11)')` will use text for the '5' and '11', and glyphs for everything else. + */ + addGlyphOrText(text: string, params?: any): this; + /** Add a line of the given width, used as a continuation of the previous symbol in analysis, or lyrics, etc. */ + addLine(width: number, params?: any): this; + /** + * Set the chord symbol's font family, size, weight, style (e.g., `Arial`, `10pt`, `bold`, `italic`). + * + * @param f is 1) a `FontInfo` object or + * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or + * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided). + * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt'). + * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900). + * @param style is a string (e.g., 'italic', 'normal'). + * + * @override See: Element. + */ + setFont(f?: string | FontInfo, size?: string | number, weight?: string | number, style?: string): this; + setEnableKerning(val: boolean): this; + /** Set vertical position of text (above or below stave). */ + setVertical(vj: ChordSymbolVerticalJustify | string | number): this; + getVertical(): number; + /** Set horizontal justification. */ + setHorizontal(hj: ChordSymbolHorizontalJustify | string | number): this; + getHorizontal(): number; + getWidth(): number; + getYOffsetForText(text: string): number; + /** Render text and glyphs above/below the note. */ + draw(): void; +} diff --git a/build/types/src/clef.d.ts b/build/types/src/clef.d.ts new file mode 100644 index 0000000000..8ee9c12715 --- /dev/null +++ b/build/types/src/clef.d.ts @@ -0,0 +1,48 @@ +import { Glyph } from './glyph'; +import { Stave } from './stave'; +import { StaveModifier } from './stavemodifier'; +export interface ClefType { + point: number; + code: string; + line?: number; +} +/** + * Clef implements various types of clefs that can be rendered on a stave. + * + * See `tests/clef_tests.ts` for usage examples. + */ +export declare class Clef extends StaveModifier { + /** To enable logging for this class, set `Vex.Flow.Clef.DEBUG` to `true`. */ + static DEBUG: boolean; + static get CATEGORY(): string; + annotation?: { + code: string; + line: number; + x_shift: number; + point: number; + }; + /** + * The attribute `clef` must be a key from + * `Clef.types` + */ + clef: ClefType; + protected glyph?: Glyph; + protected attachment?: Glyph; + protected size?: string; + protected type?: string; + /** + * Every clef name is associated with a glyph code from the font file + * and a default stave line number. + */ + static get types(): Record; + /** Create a new clef. */ + constructor(type: string, size?: string, annotation?: string); + /** Set clef type, size and annotation. */ + setType(type: string, size?: string, annotation?: string): this; + /** Get clef width. */ + getWidth(): number; + /** Set associated stave. */ + setStave(stave: Stave): this; + /** Render clef. */ + draw(): void; +} diff --git a/build/types/src/clefnote.d.ts b/build/types/src/clefnote.d.ts new file mode 100644 index 0000000000..cdcb2325aa --- /dev/null +++ b/build/types/src/clefnote.d.ts @@ -0,0 +1,25 @@ +import { BoundingBox } from './boundingbox'; +import { Clef, ClefType } from './clef'; +import { ModifierContext } from './modifiercontext'; +import { Note } from './note'; +import { RenderContext } from './rendercontext'; +/** ClefNote implements clef annotations in measures. */ +export declare class ClefNote extends Note { + static get CATEGORY(): string; + protected clef_obj: Clef; + protected type: string; + protected clef: ClefType; + constructor(type: string, size?: string, annotation?: string); + /** Set clef type, size and annotation. */ + setType(type: string, size: string, annotation: string): this; + /** Get associated clef. */ + getClef(): ClefType; + /** Set associated context. */ + setContext(context: RenderContext): this; + /** Get bounding box. */ + getBoundingBox(): BoundingBox | undefined; + addToModifierContext(mc: ModifierContext): this; + preFormat(): this; + /** Render clef note. */ + draw(): void; +} diff --git a/build/types/src/crescendo.d.ts b/build/types/src/crescendo.d.ts new file mode 100644 index 0000000000..af5069b5f4 --- /dev/null +++ b/build/types/src/crescendo.d.ts @@ -0,0 +1,27 @@ +import { Note, NoteStruct } from './note'; +export interface CrescendoParams { + reverse: boolean; + height: number; + y: number; + end_x: number; + begin_x: number; +} +export declare class Crescendo extends Note { + static DEBUG: boolean; + /** Crescendo category string. */ + static get CATEGORY(): string; + protected decrescendo: boolean; + protected height: number; + protected line: number; + protected options: { + extend_left: number; + extend_right: number; + y_shift: number; + }; + constructor(noteStruct: NoteStruct); + setLine(line: number): this; + setHeight(height: number): this; + setDecrescendo(decresc: boolean): this; + preFormat(): this; + draw(): void; +} diff --git a/build/types/src/curve.d.ts b/build/types/src/curve.d.ts new file mode 100644 index 0000000000..2742f3d30e --- /dev/null +++ b/build/types/src/curve.d.ts @@ -0,0 +1,41 @@ +import { Element } from './element'; +import { Note } from './note'; +export interface CurveOptions { + /** Two control points for the bezier curves. */ + cps?: { + x: number; + y: number; + }[]; + thickness?: number; + x_shift?: number; + y_shift?: number; + position?: string | number; + position_end?: string | number; + invert?: boolean; +} +export declare enum CurvePosition { + NEAR_HEAD = 1, + NEAR_TOP = 2 +} +export declare class Curve extends Element { + static get CATEGORY(): string; + render_options: Required; + protected from: Note; + protected to: Note; + static get Position(): typeof CurvePosition; + static get PositionString(): Record; + constructor(from: Note, to: Note, options: CurveOptions); + setNotes(from: Note, to: Note): this; + /** + * @return {boolean} Returns true if this is a partial bar. + */ + isPartial(): boolean; + renderCurve(params: { + last_y: number; + last_x: number; + first_y: number; + first_x: number; + direction: number; + }): void; + draw(): boolean; +} diff --git a/build/types/src/dot.d.ts b/build/types/src/dot.d.ts new file mode 100644 index 0000000000..7cfff84e6f --- /dev/null +++ b/build/types/src/dot.d.ts @@ -0,0 +1,20 @@ +import { Modifier } from './modifier'; +import { ModifierContextState } from './modifiercontext'; +import { Note } from './note'; +export declare class Dot extends Modifier { + static get CATEGORY(): string; + protected radius: number; + protected dot_shiftY: number; + /** Returns the dots associated to a Note. */ + static getDots(note: Note): Dot[]; + /** Add a dot on the specified keys to the notes. */ + static buildAndAttach(notes: Note[], options?: { + index?: number; + all?: boolean; + }): void; + static format(dots: Dot[], state: ModifierContextState): boolean; + constructor(); + setNote(note: Note): this; + setDotShiftY(y: number): this; + draw(): void; +} diff --git a/build/types/src/easyscore.d.ts b/build/types/src/easyscore.d.ts new file mode 100644 index 0000000000..f4bfaa316e --- /dev/null +++ b/build/types/src/easyscore.d.ts @@ -0,0 +1,148 @@ +import { Accidental } from './accidental'; +import { Factory } from './factory'; +import { Note } from './note'; +import { Grammar, Match, Parser, Result, Rule, RuleFunction } from './parser'; +import { RenderContext } from './rendercontext'; +import { StemmableNote } from './stemmablenote'; +import { TupletOptions } from './tuplet'; +import { Voice } from './voice'; +export declare type CommitHook = (obj: any, note: StemmableNote, builder: Builder) => void; +export declare class EasyScoreGrammar implements Grammar { + builder: Builder; + constructor(builder: Builder); + begin(): RuleFunction; + LINE(): Rule; + PIECE(): Rule; + PIECES(): Rule; + PARAMS(): Rule; + CHORDORNOTE(): Rule; + CHORD(): Rule; + NOTES(): Rule; + NOTE(): Rule; + SINGLENOTE(): Rule; + ACCIDENTAL(): Rule; + DOTS(): Rule; + TYPE(): Rule; + DURATION(): Rule; + OPTS(): Rule; + KEYVALS(): Rule; + KEYVAL(): Rule; + VAL(): Rule; + KEY(): Rule; + DVAL(): Rule; + SVAL(): Rule; + NOTENAME(): Rule; + OCTAVE(): Rule; + ACCIDENTALS(): Rule; + MICROTONES(): Rule; + DURATIONS(): Rule; + TYPES(): Rule; + LPAREN(): Rule; + RPAREN(): Rule; + COMMA(): Rule; + DOT(): Rule; + SLASH(): Rule; + MAYBESLASH(): Rule; + EQUALS(): Rule; + LBRACKET(): Rule; + RBRACKET(): Rule; + EOL(): Rule; +} +export interface NotePiece { + key: string; + accid?: string | null; + octave?: string; +} +export declare class Piece { + chord: NotePiece[]; + duration: string; + dots: number; + type?: string; + options: { + [x: string]: string; + }; + constructor(duration: string); +} +export interface BuilderElements { + notes: StemmableNote[]; + accidentals: (Accidental | undefined)[][]; +} +export interface BuilderOptions extends Record { + stem?: string; + clef?: string; +} +export declare class Builder { + factory: Factory; + elements: BuilderElements; + options: BuilderOptions; + piece: Piece; + commitHooks: CommitHook[]; + rollingDuration: string; + constructor(factory: Factory); + reset(options?: BuilderOptions): void; + getFactory(): Factory; + getElements(): BuilderElements; + addCommitHook(commitHook: CommitHook): void; + resetPiece(): void; + setNoteDots(dots: Match[]): void; + setNoteDuration(duration?: string): void; + setNoteType(type?: string): void; + addNoteOption(key: string, value: string): void; + addNote(key?: string, accid?: string | null, octave?: string): void; + addSingleNote(key: string, accid?: string | null, octave?: string): void; + addChord(notes: Match[]): void; + commitPiece(): void; +} +export interface EasyScoreOptions { + factory?: Factory; + builder?: Builder; + commitHooks?: CommitHook[]; + throwOnError?: boolean; +} +export interface EasyScoreDefaults extends Record { + clef?: string; + time?: string; + stem?: string; +} +/** + * EasyScore implements a parser for a simple language to generate VexFlow objects. + */ +export declare class EasyScore { + static DEBUG: boolean; + defaults: EasyScoreDefaults; + options: EasyScoreOptions; + factory: Factory; + builder: Builder; + grammar: EasyScoreGrammar; + parser: Parser; + constructor(options?: EasyScoreOptions); + /** + * Set the score defaults. + * clef must be set appropriately to avoid errors when adding Staves. + * @param defaults.clef default clef ( treble | bass ...) see {@link Clef.types} + * @param defaults.time default time signature ( 4/4 | 9/8 ...) + * @param defaults.stem default stem arrangement (auto | up | down) + * @returns this + */ + set(defaults: EasyScoreDefaults): this; + /** + * @param options.factory is required. + * @returns this + */ + setOptions(options: EasyScoreOptions): this; + setContext(context: RenderContext): this; + parse(line: string, options?: BuilderOptions): Result; + beam(notes: StemmableNote[], options?: { + autoStem?: boolean; + secondaryBeamBreaks?: number[]; + }): StemmableNote[]; + tuplet(notes: StemmableNote[], options?: TupletOptions): StemmableNote[]; + notes(line: string, options?: BuilderOptions): StemmableNote[]; + voice(notes: Note[], options?: { + time?: string; + options?: { + softmaxFactor: number; + }; + }): Voice; + addCommitHook(commitHook: CommitHook): void; +} diff --git a/build/types/src/element.d.ts b/build/types/src/element.d.ts new file mode 100644 index 0000000000..b2c1ac85ad --- /dev/null +++ b/build/types/src/element.d.ts @@ -0,0 +1,202 @@ +import { BoundingBox } from './boundingbox'; +import { FontInfo } from './font'; +import { Registry } from './registry'; +import { RenderContext } from './rendercontext'; +/** Element attributes. */ +export interface ElementAttributes { + [name: string]: any; + id: string; + el?: any; + type: string; + classes: Record; +} +/** Element style */ +export interface ElementStyle { + /** + * CSS color used for the shadow. + * + * Examples: 'red', '#ff0000', '#ff000010', 'rgb(255,0,0)' + * + * See [CSS Legal Color Values](https://www.w3schools.com/cssref/css_colors_legal.asp) + */ + shadowColor?: string; + /** + * Level of blur applied to shadows. + * + * Values that are not finite numbers greater than or equal to zero are ignored. + */ + shadowBlur?: number; + /** + * CSS color used with context fill command. + * + * Examples: 'red', '#ff0000', '#ff000010', 'rgb(255,0,0)' + * + * See [CSS Legal Color Values](https://www.w3schools.com/cssref/css_colors_legal.asp) + */ + fillStyle?: string; + /** + * CSS color used with context stroke command. + * + * Examples: 'red', '#ff0000', '#ff000010', 'rgb(255,0,0)' + * + * See [CSS Legal Color Values](https://www.w3schools.com/cssref/css_colors_legal.asp) + */ + strokeStyle?: string; + /** + * Line width, 1.0 by default. + */ + lineWidth?: number; +} +/** + * Element implements a generic base class for VexFlow, with implementations + * of general functions and properties that can be inherited by all VexFlow elements. + */ +export declare abstract class Element { + static get CATEGORY(): string; + protected static ID: number; + protected static newID(): string; + /** + * Default font for text. This is not related to music engraving. Instead, see `Flow.setMusicFont(...fontNames)` + * to customize the font for musical symbols placed on the score. + */ + static TEXT_FONT: Required; + private context?; + protected rendered: boolean; + protected style?: ElementStyle; + private attrs; + protected boundingBox?: BoundingBox; + protected registry?: Registry; + /** + * Some elements include text. + * The `textFont` property contains information required to style the text (i.e., font family, size, weight, and style). + * It is undefined by default, and can be set using `setFont(...)` or `resetFont()`. + */ + protected textFont?: Required; + constructor(); + /** Get element category string. */ + getCategory(): string; + /** + * Set the element style used to render. + * + * Example: + * ```typescript + * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' }); + * element.draw(); + * ``` + * Note: If the element draws additional sub-elements (ie.: Modifiers in a Stave), + * the style can be applied to all of them by means of the context: + * ```typescript + * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' }); + * element.getContext().setFillStyle('red'); + * element.getContext().setStrokeStyle('red'); + * element.draw(); + * ``` + * or using drawWithStyle: + * ```typescript + * element.setStyle({ fillStyle: 'red', strokeStyle: 'red' }); + * element.drawWithStyle(); + * ``` + */ + setStyle(style: ElementStyle): this; + /** Get the element style used for rendering. */ + getStyle(): ElementStyle | undefined; + /** Apply the element style to `context`. */ + applyStyle(context?: RenderContext | undefined, style?: ElementStyle | undefined): this; + /** Restore the style of `context`. */ + restoreStyle(context?: RenderContext | undefined, style?: ElementStyle | undefined): this; + /** + * Draw the element and all its sub-elements (ie.: Modifiers in a Stave) + * with the element style. + */ + drawWithStyle(): void; + /** Draw an element. */ + abstract draw(...args: any[]): void; + /** Check if it has a class label (An element can have multiple class labels). */ + hasClass(className: string): boolean; + /** Add a class label (An element can have multiple class labels). */ + addClass(className: string): this; + /** Remove a class label (An element can have multiple class labels). */ + removeClass(className: string): this; + /** Call back from registry after the element is registered. */ + onRegister(registry: Registry): this; + /** Return the rendered status. */ + isRendered(): boolean; + /** Set the rendered status. */ + setRendered(rendered?: boolean): this; + /** Return the element attributes. */ + getAttributes(): ElementAttributes; + /** Return an attribute. */ + getAttribute(name: string): any; + /** Set an attribute. */ + setAttribute(name: string, value: any): this; + /** Get the boundingBox. */ + getBoundingBox(): BoundingBox | undefined; + /** Return the context. */ + getContext(): RenderContext | undefined; + /** Set the context. */ + setContext(context?: RenderContext): this; + /** Validate and return the context. */ + checkContext(): RenderContext; + /** + * Provide a CSS compatible font string (e.g., 'bold 16px Arial'). + */ + set font(f: string); + /** Returns the CSS compatible font string. */ + get font(): string; + /** + * Set the element's font family, size, weight, style (e.g., `Arial`, `10pt`, `bold`, `italic`). + * @param font is 1) a `FontInfo` object or + * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or + * 3) a string representing the font family (at least one of `size`, `weight`, or `style` must also be provided). + * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt'). + * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900). + * @param style is a string (e.g., 'italic', 'normal'). + * If no arguments are provided, then the font is set to the default font. + * Each Element subclass may specify its own default by overriding the static `TEXT_FONT` property. + */ + setFont(font?: string | FontInfo, size?: string | number, weight?: string | number, style?: string): this; + getFont(): string; + /** + * Reset the text font to the style indicated by the static `TEXT_FONT` property. + * Subclasses can call this to initialize `textFont` for the first time. + */ + resetFont(): void; + /** Return a copy of the current FontInfo object. */ + get fontInfo(): Required; + set fontInfo(fontInfo: FontInfo); + /** Change the font size, while keeping everything else the same. */ + setFontSize(size?: string | number): this; + /** + * @returns a CSS font-size string (e.g., '18pt', '12px', '1em'). + * See Element.fontSizeInPixels or Element.fontSizeInPoints if you need to get a number for calculation purposes. + */ + getFontSize(): string; + /** + * The size is 1) a string of the form '10pt' or '16px', compatible with the CSS font-size property. + * or 2) a number, which is interpreted as a point size (i.e. 12 == '12pt'). + */ + set fontSize(size: string | number); + /** + * @returns a CSS font-size string (e.g., '18pt', '12px', '1em'). + */ + get fontSize(): string; + /** + * @returns the font size in `pt`. + */ + get fontSizeInPoints(): number; + /** + * @returns the font size in `px`. + */ + get fontSizeInPixels(): number; + /** + * @returns a CSS font-style string (e.g., 'italic'). + */ + get fontStyle(): string; + set fontStyle(style: string); + /** + * @returns a CSS font-weight string (e.g., 'bold'). + * As in CSS, font-weight is always returned as a string, even if it was set as a number. + */ + get fontWeight(): string; + set fontWeight(weight: string | number); +} diff --git a/build/types/src/factory.d.ts b/build/types/src/factory.d.ts new file mode 100644 index 0000000000..ca4e1e790e --- /dev/null +++ b/build/types/src/factory.d.ts @@ -0,0 +1,271 @@ +import { Accidental } from './accidental'; +import { Annotation, AnnotationHorizontalJustify, AnnotationVerticalJustify } from './annotation'; +import { Articulation } from './articulation'; +import { BarNote } from './barnote'; +import { Beam } from './beam'; +import { ChordSymbol } from './chordsymbol'; +import { ClefNote } from './clefnote'; +import { Curve, CurveOptions } from './curve'; +import { EasyScore, EasyScoreOptions } from './easyscore'; +import { Element } from './element'; +import { FontInfo } from './font'; +import { Formatter, FormatterOptions } from './formatter'; +import { FretHandFinger } from './frethandfinger'; +import { GhostNote } from './ghostnote'; +import { Glyph } from './glyph'; +import { GlyphNote, GlyphNoteOptions } from './glyphnote'; +import { GraceNote, GraceNoteStruct } from './gracenote'; +import { GraceNoteGroup } from './gracenotegroup'; +import { KeySigNote } from './keysignote'; +import { ModifierContext } from './modifiercontext'; +import { MultiMeasureRest, MultimeasureRestRenderOptions } from './multimeasurerest'; +import { Note, NoteStruct } from './note'; +import { NoteSubGroup } from './notesubgroup'; +import { PedalMarking } from './pedalmarking'; +import { RenderContext } from './rendercontext'; +import { RepeatNote } from './repeatnote'; +import { Stave, StaveOptions } from './stave'; +import { BarlineType } from './stavebarline'; +import { StaveConnector } from './staveconnector'; +import { StaveLine } from './staveline'; +import { StaveNote, StaveNoteStruct } from './stavenote'; +import { StaveTie } from './stavetie'; +import { StemmableNote } from './stemmablenote'; +import { StringNumber } from './stringnumber'; +import { System, SystemOptions } from './system'; +import { TabNote, TabNoteStruct } from './tabnote'; +import { TabStave } from './tabstave'; +import { TextBracket } from './textbracket'; +import { TextDynamics } from './textdynamics'; +import { TextNote, TextNoteStruct } from './textnote'; +import { TickContext } from './tickcontext'; +import { TimeSigNote } from './timesignote'; +import { Tuplet, TupletOptions } from './tuplet'; +import { VibratoBracket } from './vibratobracket'; +import { Voice, VoiceTime } from './voice'; +export interface FactoryOptions { + stave?: { + space: number; + }; + renderer?: { + elementId: string | null; + backend?: number; + width: number; + height: number; + background?: string; + }; + font?: FontInfo; +} +/** + * Factory implements a high level API around VexFlow. + */ +export declare class Factory { + /** To enable logging for this class. Set `Vex.Flow.Factory.DEBUG` to `true`. */ + static DEBUG: boolean; + /** Default text font. */ + static TEXT_FONT: Required; + /** + * Static simplified function to access constructor without providing FactoryOptions + * + * Example: + * + * Create an SVG renderer and attach it to the DIV element named "boo" to render using 1200 and 600 + * + * `const vf: Factory = Vex.Flow.Factory.newFromElementId('boo', 1200, 600 );` + */ + static newFromElementId(elementId: string | null, width?: number, height?: number): Factory; + protected options: Required; + protected stave?: Stave; + protected context: RenderContext; + protected staves: Stave[]; + protected voices: Voice[]; + protected renderQ: Element[]; + protected systems: System[]; + /** + * Example: + * + * Create an SVG renderer and attach it to the DIV element named "boo" to render using 1200 and 600 + * + * `const vf: Factory = new Vex.Flow.Factory({renderer: { elementId: 'boo', width: 1200, height: 600 }});` + */ + constructor(options?: FactoryOptions); + reset(): void; + setOptions(options?: FactoryOptions): void; + initRenderer(): void; + getContext(): RenderContext; + setContext(context: RenderContext): this; + getStave(): Stave | undefined; + getVoices(): Voice[]; + /** Return pixels from current stave spacing. */ + Stave(params?: { + x?: number; + y?: number; + width?: number; + options?: StaveOptions; + }): Stave; + TabStave(params?: { + x?: number; + y?: number; + width?: number; + options?: StaveOptions; + }): TabStave; + StaveNote(noteStruct: StaveNoteStruct): StaveNote; + GlyphNote(glyph: Glyph, noteStruct: NoteStruct, options?: GlyphNoteOptions): GlyphNote; + RepeatNote(type: string, noteStruct?: NoteStruct, options?: GlyphNoteOptions): RepeatNote; + GhostNote(noteStruct: string | NoteStruct): GhostNote; + TextNote(noteStruct: TextNoteStruct): TextNote; + BarNote(params?: { + type?: BarlineType | string; + }): BarNote; + ClefNote(params?: { + type?: string; + options?: { + size?: string; + annotation?: string; + }; + }): ClefNote; + TimeSigNote(params?: { + time?: string; + }): TimeSigNote; + KeySigNote(params: { + key: string; + cancelKey?: string; + alterKey?: string[]; + }): KeySigNote; + TabNote(noteStruct: TabNoteStruct): TabNote; + GraceNote(noteStruct: GraceNoteStruct): GraceNote; + GraceNoteGroup(params: { + notes: StemmableNote[]; + slur?: boolean; + }): GraceNoteGroup; + Accidental(params: { + type: string; + }): Accidental; + Annotation(params?: { + text?: string; + hJustify?: string | AnnotationHorizontalJustify; + vJustify?: string | AnnotationVerticalJustify; + font?: FontInfo; + }): Annotation; + ChordSymbol(params?: { + vJustify?: string; + hJustify?: string; + kerning?: boolean; + reportWidth?: boolean; + fontFamily?: string; + fontSize?: number; + fontWeight?: string; + }): ChordSymbol; + Articulation(params?: { + type?: string; + position?: string | number; + }): Articulation; + TextDynamics(params?: { + text?: string; + duration?: string; + dots?: number; + line?: number; + }): TextDynamics; + Fingering(params: { + number?: string; + position?: string; + }): FretHandFinger; + StringNumber(params: { + number: string; + position: string; + }): StringNumber; + TickContext(): TickContext; + ModifierContext(): ModifierContext; + MultiMeasureRest(params: MultimeasureRestRenderOptions): MultiMeasureRest; + Voice(params?: { + time?: VoiceTime | string; + options?: { + softmaxFactor: number; + }; + }): Voice; + StaveConnector(params: { + top_stave: Stave; + bottom_stave: Stave; + type: string; + }): StaveConnector; + Formatter(options?: FormatterOptions): Formatter; + Tuplet(params?: { + notes?: Note[]; + options?: TupletOptions; + }): Tuplet; + Beam(params: { + notes: StemmableNote[]; + options?: { + autoStem?: boolean; + secondaryBeamBreaks?: number[]; + }; + }): Beam; + Curve(params: { + from: Note; + to: Note; + options: CurveOptions; + }): Curve; + StaveTie(params: { + from?: Note | null; + to?: Note | null; + first_indices?: number[]; + last_indices?: number[]; + text?: string; + options?: { + direction?: number; + }; + }): StaveTie; + StaveLine(params: { + from: StaveNote; + to: StaveNote; + first_indices: number[]; + last_indices: number[]; + options?: { + text?: string; + font?: FontInfo; + }; + }): StaveLine; + VibratoBracket(params: { + from: Note | null; + to: Note | null; + options: { + harsh?: boolean; + line?: number; + }; + }): VibratoBracket; + TextBracket(params: { + from: Note; + to: Note; + text: string; + options: { + superscript: string; + position: string; + line?: number; + font?: FontInfo; + }; + }): TextBracket; + System(params?: SystemOptions): System; + /** + * Creates EasyScore. Normally the first step after constructing a Factory. For example: + * ``` + * const vf: Factory = new Vex.Flow.Factory({renderer: { elementId: 'boo', width: 1200, height: 600 }}); + * const score: EasyScore = vf.EasyScore(); + * ``` + * @param options.factory optional instance of Factory + * @param options.builder instance of Builder + * @param options.commitHooks function to call after a note element is created + * @param options.throwOnError throw error in case of parsing error + */ + EasyScore(options?: EasyScoreOptions): EasyScore; + PedalMarking(params?: { + notes?: StaveNote[]; + options?: { + style: string; + }; + }): PedalMarking; + NoteSubGroup(params?: { + notes?: Note[]; + }): NoteSubGroup; + /** Render the score. */ + draw(): void; +} diff --git a/build/types/src/flow.d.ts b/build/types/src/flow.d.ts new file mode 100644 index 0000000000..92ff1562bf --- /dev/null +++ b/build/types/src/flow.d.ts @@ -0,0 +1,245 @@ +import { Accidental } from './accidental'; +import { Annotation } from './annotation'; +import { Articulation } from './articulation'; +import { BarNote } from './barnote'; +import { Beam } from './beam'; +import { Bend } from './bend'; +import { BoundingBox } from './boundingbox'; +import { BoundingBoxComputation } from './boundingboxcomputation'; +import { CanvasContext } from './canvascontext'; +import { ChordSymbol } from './chordsymbol'; +import { Clef } from './clef'; +import { ClefNote } from './clefnote'; +import { Crescendo } from './crescendo'; +import { Curve } from './curve'; +import { Dot } from './dot'; +import { EasyScore } from './easyscore'; +import { Element } from './element'; +import { Factory } from './factory'; +import { Font, FontModule } from './font'; +import { Formatter } from './formatter'; +import { Fraction } from './fraction'; +import { FretHandFinger } from './frethandfinger'; +import { GhostNote } from './ghostnote'; +import { Glyph } from './glyph'; +import { GlyphNote } from './glyphnote'; +import { GraceNote } from './gracenote'; +import { GraceNoteGroup } from './gracenotegroup'; +import { GraceTabNote } from './gracetabnote'; +import { KeyManager } from './keymanager'; +import { KeySignature } from './keysignature'; +import { KeySigNote } from './keysignote'; +import { Modifier, ModifierPosition } from './modifier'; +import { ModifierContext } from './modifiercontext'; +import { MultiMeasureRest } from './multimeasurerest'; +import { Music } from './music'; +import { Note } from './note'; +import { NoteHead } from './notehead'; +import { NoteSubGroup } from './notesubgroup'; +import { Ornament } from './ornament'; +import { Parenthesis } from './parenthesis'; +import { Parser } from './parser'; +import { PedalMarking } from './pedalmarking'; +import { Registry } from './registry'; +import { RenderContext } from './rendercontext'; +import { Renderer } from './renderer'; +import { RepeatNote } from './repeatnote'; +import { Stave } from './stave'; +import { Barline, BarlineType } from './stavebarline'; +import { StaveConnector } from './staveconnector'; +import { StaveHairpin } from './stavehairpin'; +import { StaveLine } from './staveline'; +import { StaveModifier } from './stavemodifier'; +import { StaveNote } from './stavenote'; +import { Repetition } from './staverepetition'; +import { StaveTempo } from './stavetempo'; +import { StaveText } from './stavetext'; +import { StaveTie } from './stavetie'; +import { Volta } from './stavevolta'; +import { Stem } from './stem'; +import { StringNumber } from './stringnumber'; +import { Stroke } from './strokes'; +import { SVGContext } from './svgcontext'; +import { System } from './system'; +import { TabNote } from './tabnote'; +import { TabSlide } from './tabslide'; +import { TabStave } from './tabstave'; +import { TabTie } from './tabtie'; +import { TextBracket } from './textbracket'; +import { TextDynamics } from './textdynamics'; +import { TextFormatter } from './textformatter'; +import { TextNote } from './textnote'; +import { TickContext } from './tickcontext'; +import { TimeSignature } from './timesignature'; +import { TimeSigNote } from './timesignote'; +import { Tremolo } from './tremolo'; +import { Tuning } from './tuning'; +import { Tuplet } from './tuplet'; +import { Vibrato } from './vibrato'; +import { VibratoBracket } from './vibratobracket'; +import { Voice } from './voice'; +export declare class Flow { + static get BUILD(): { + /** version number. */ + VERSION: string; + /** git commit ID that this library was built from. */ + ID: string; + /** The date when this library was compiled. */ + DATE: string; + }; + static Accidental: typeof Accidental; + static Annotation: typeof Annotation; + static Articulation: typeof Articulation; + static Barline: typeof Barline; + static BarNote: typeof BarNote; + static Beam: typeof Beam; + static Bend: typeof Bend; + static BoundingBox: typeof BoundingBox; + static BoundingBoxComputation: typeof BoundingBoxComputation; + static CanvasContext: typeof CanvasContext; + static ChordSymbol: typeof ChordSymbol; + static Clef: typeof Clef; + static ClefNote: typeof ClefNote; + static Crescendo: typeof Crescendo; + static Curve: typeof Curve; + static Dot: typeof Dot; + static EasyScore: typeof EasyScore; + static Element: typeof Element; + static Factory: typeof Factory; + static get Flow(): typeof Flow; + static Font: typeof Font; + static Formatter: typeof Formatter; + static Fraction: typeof Fraction; + static FretHandFinger: typeof FretHandFinger; + static GhostNote: typeof GhostNote; + static Glyph: typeof Glyph; + static GlyphNote: typeof GlyphNote; + static GraceNote: typeof GraceNote; + static GraceNoteGroup: typeof GraceNoteGroup; + static GraceTabNote: typeof GraceTabNote; + static KeyManager: typeof KeyManager; + static KeySignature: typeof KeySignature; + static KeySigNote: typeof KeySigNote; + static Modifier: typeof Modifier; + static ModifierContext: typeof ModifierContext; + static MultiMeasureRest: typeof MultiMeasureRest; + static Music: typeof Music; + static Note: typeof Note; + static NoteHead: typeof NoteHead; + static NoteSubGroup: typeof NoteSubGroup; + static Ornament: typeof Ornament; + static Parenthesis: typeof Parenthesis; + static Parser: typeof Parser; + static PedalMarking: typeof PedalMarking; + static Registry: typeof Registry; + static RenderContext: typeof RenderContext; + static Renderer: typeof Renderer; + static RepeatNote: typeof RepeatNote; + static Repetition: typeof Repetition; + static Stave: typeof Stave; + static StaveConnector: typeof StaveConnector; + static StaveHairpin: typeof StaveHairpin; + static StaveLine: typeof StaveLine; + static StaveModifier: typeof StaveModifier; + static StaveNote: typeof StaveNote; + static StaveTempo: typeof StaveTempo; + static StaveText: typeof StaveText; + static StaveTie: typeof StaveTie; + static Stem: typeof Stem; + static StringNumber: typeof StringNumber; + static Stroke: typeof Stroke; + static SVGContext: typeof SVGContext; + static System: typeof System; + static TabNote: typeof TabNote; + static TabSlide: typeof TabSlide; + static TabStave: typeof TabStave; + static TabTie: typeof TabTie; + static TextBracket: typeof TextBracket; + static TextDynamics: typeof TextDynamics; + static TextFormatter: typeof TextFormatter; + static TextNote: typeof TextNote; + static TickContext: typeof TickContext; + static TimeSignature: typeof TimeSignature; + static TimeSigNote: typeof TimeSigNote; + static Tremolo: typeof Tremolo; + static Tuning: typeof Tuning; + static Tuplet: typeof Tuplet; + static Vibrato: typeof Vibrato; + static VibratoBracket: typeof VibratoBracket; + static Voice: typeof Voice; + static Volta: typeof Volta; + static BarlineType: typeof BarlineType; + static ModifierPosition: typeof ModifierPosition; + /** + * Examples: + * ``` + * Vex.Flow.setMusicFont('Petaluma'); + * Vex.Flow.setMusicFont('Bravura', 'Gonville'); + * ``` + * + * **CASE 1**: You are using `vexflow.js`, which includes all music fonts (Bravura, Gonville, Petaluma, Custom). + * In this case, calling this method is optional, since VexFlow already defaults to a music font stack of: + * 'Bravura', 'Gonville', 'Custom'. + * + * **CASE 2**: You are using `vexflow-bravura.js` or `vexflow-petaluma.js` or `vexflow-gonville.js`, + * which includes a single music font. Calling this method is unnecessary. + * + * **CASE 3**: You are using the light weight `vexflow-core.js` to take advantage of lazy loading for fonts. + * In this case, the default music font stack is empty. + * Example: + * ``` + * await Vex.Flow.fetchMusicFont('Petaluma'); + * Vex.Flow.setMusicFont('Petaluma'); + * ... (do VexFlow stuff) ... + * ``` + * See `demos/fonts/` for more examples. + * + * @returns an array of Font objects corresponding to the provided `fontNames`. + */ + static setMusicFont(...fontNames: string[]): Font[]; + /** + * Used with vexflow-core which supports dynamic font loading. + */ + static fetchMusicFont(fontName: string, fontModuleOrPath?: string | FontModule): Promise; + static getMusicFont(): string[]; + static get NOTATION_FONT_SCALE(): number; + static set NOTATION_FONT_SCALE(value: number); + static get TABLATURE_FONT_SCALE(): number; + static set TABLATURE_FONT_SCALE(value: number); + static get RESOLUTION(): number; + static set RESOLUTION(value: number); + static get SLASH_NOTEHEAD_WIDTH(): number; + static set SLASH_NOTEHEAD_WIDTH(value: number); + static get STAVE_LINE_DISTANCE(): number; + static set STAVE_LINE_DISTANCE(value: number); + static get STAVE_LINE_THICKNESS(): number; + static set STAVE_LINE_THICKNESS(value: number); + static get STEM_HEIGHT(): number; + static set STEM_HEIGHT(value: number); + static get STEM_WIDTH(): number; + static set STEM_WIDTH(value: number); + static get TIME4_4(): { + num_beats: number; + beat_value: number; + resolution: number; + }; + static get accidentalMap(): Record; + static get unicode(): Record; + static keySignature(spec: string): { + type: string; + line: number; + }[]; + static hasKeySignature(spec: string): boolean; + static getKeySignatures(): Record; + static clefProperties(clef: string): { + line_shift: number; + }; + static keyProperties(key: string, clef?: string, params?: any): any; + static durationToTicks(duration: string): number; +} diff --git a/build/types/src/font.d.ts b/build/types/src/font.d.ts new file mode 100644 index 0000000000..afb7598c11 --- /dev/null +++ b/build/types/src/font.d.ts @@ -0,0 +1,181 @@ +export interface FontInfo { + /** CSS font-family, e.g., 'Arial', 'Helvetica Neue, Arial, sans-serif', 'Times, serif' */ + family?: string; + /** + * CSS font-size (e.g., '10pt', '12px'). + * For backwards compatibility with 3.0.9, plain numbers are assumed to be specified in 'pt'. + */ + size?: number | string; + /** `bold` or a number (e.g., 900) as inspired by CSS font-weight. */ + weight?: string | number; + /** `italic` as inspired by CSS font-style. */ + style?: string; +} +export declare type FontModule = { + data: FontData; + metrics: FontMetrics; +}; +export interface FontData { + glyphs: Record; + fontFamily?: string; + resolution: number; + generatedOn?: string; +} +/** Specified in the `xxx_metrics.ts` files. */ +export interface FontMetrics extends Record { + name: string; + smufl: boolean; + stave?: Record; + accidental?: Record; + clef?: Record; + pedalMarking?: Record>; + digits?: Record; + articulation?: Record>; + tremolo?: Record>; + noteHead?: Record>; + glyphs: Record>; +} +export interface FontGlyph { + x_min: number; + x_max: number; + y_min?: number; + y_max?: number; + ha: number; + leftSideBearing?: number; + advanceWidth?: number; + o?: string; + cached_outline?: number[]; +} +export declare enum FontWeight { + NORMAL = "normal", + BOLD = "bold" +} +export declare enum FontStyle { + NORMAL = "normal", + ITALIC = "italic" +} +export declare class Font { + /** Default sans-serif font family. */ + static SANS_SERIF: string; + /** Default serif font family. */ + static SERIF: string; + /** Default font size in `pt`. */ + static SIZE: number; + /** Given a length (for units: pt, px, em, %, in, mm, cm) what is the scale factor to convert it to px? */ + static scaleToPxFrom: Record; + /** + * @param fontSize a font size to convert. Can be specified as a CSS length string (e.g., '16pt', '1em') + * or as a number (the unit is assumed to be 'pt'). See `Font.scaleToPxFrom` for the supported + * units (e.g., pt, em, %). + * @returns the number of pixels that is equivalent to `fontSize` + */ + static convertSizeToPixelValue(fontSize?: string | number): number; + /** + * @param fontSize a font size to convert. Can be specified as a CSS length string (e.g., '16pt', '1em') + * or as a number (the unit is assumed to be 'pt'). See `Font.scaleToPxFrom` for the supported + * units (e.g., pt, em, %). + * @returns the number of points that is equivalent to `fontSize` + */ + static convertSizeToPointValue(fontSize?: string | number): number; + /** + * @param f + * @param size + * @param weight + * @param style + * @returns the `size` field will include the units (e.g., '12pt', '16px'). + */ + static validate(f?: string | FontInfo, size?: string | number, weight?: string | number, style?: string): Required; + /** + * @param cssFontShorthand a string formatted as CSS font shorthand (e.g., 'italic bold 15pt Arial'). + */ + static fromCSSString(cssFontShorthand: string): Required; + /** + * @returns a CSS font shorthand string of the form `italic bold 16pt Arial`. + */ + static toCSSString(fontInfo?: FontInfo): string; + /** + * @param fontSize a number representing a font size, or a string font size with units. + * @param scaleFactor multiply the size by this factor. + * @returns size * scaleFactor (e.g., 16pt * 3 = 48pt, 8px * 0.5 = 4px, 24 * 2 = 48). + * If the fontSize argument was a number, the return value will be a number. + * If the fontSize argument was a string, the return value will be a string. + */ + static scaleSize(fontSize: T, scaleFactor: number): T; + /** + * @param weight a string (e.g., 'bold') or a number (e.g., 600 / semi-bold in the OpenType spec). + * @returns true if the font weight indicates bold. + */ + static isBold(weight?: string | number): boolean; + /** + * @param style + * @returns true if the font style indicates 'italic'. + */ + static isItalic(style?: string): boolean; + /** + * Customize this field to specify a different CDN for delivering web fonts. + * Alternative: https://cdn.jsdelivr.net/npm/vexflow-fonts@1.0.3/ + * Or you can use your own host. + */ + static WEB_FONT_HOST: string; + /** + * These font files will be loaded from the CDN specified by `Font.WEB_FONT_HOST` when + * `await Font.loadWebFonts()` is called. Customize this field to specify a different + * set of fonts to load. See: `Font.loadWebFonts()`. + */ + static WEB_FONT_FILES: Record; + /** + * @param fontName + * @param woffURL The absolute or relative URL to the woff file. + * @param includeWoff2 If true, we assume that a woff2 file is in + * the same folder as the woff file, and will append a `2` to the url. + */ + static loadWebFont(fontName: string, woffURL: string, includeWoff2?: boolean): Promise; + /** + * Load the web fonts that are used by ChordSymbol. For example, `flow.html` calls: + * `await Vex.Flow.Font.loadWebFonts();` + * Alternatively, you may load web fonts with a stylesheet link (e.g., from Google Fonts), + * and a @font-face { font-family: ... } rule in your CSS. + * If you do not load either of these fonts, ChordSymbol will fall back to Times or Arial, + * depending on the current music engraving font. + * + * You can customize `Font.WEB_FONT_HOST` and `Font.WEB_FONT_FILES` to load different fonts + * for your app. + */ + static loadWebFonts(): Promise; + static loadTextFonts(): void; + /** + * @param fontName + * @param data optionally set the Font object's `.data` property. + * This is usually done when setting up a font for the first time. + * @param metrics optionally set the Font object's `.metrics` property. + * This is usually done when setting up a font for the first time. + * @returns a Font object with the given `fontName`. + * Reuse an existing Font object if a matching one is found. + */ + static load(fontName: string, data?: FontData, metrics?: FontMetrics): Font; + protected name: string; + protected data?: FontData; + protected metrics?: FontMetrics; + /** + * Use `Font.load(fontName)` to get a Font object. + * Do not call this constructor directly. + */ + private constructor(); + getName(): string; + getData(): FontData; + getMetrics(): FontMetrics; + setData(data: FontData): void; + setMetrics(metrics: FontMetrics): void; + hasData(): boolean; + getResolution(): number; + getGlyphs(): Record; + /** + * Use the provided key to look up a value in this font's metrics file (e.g., bravura_metrics.ts, petaluma_metrics.ts). + * @param key is a string separated by periods (e.g., stave.endPaddingMax, clef.lineCount.'5'.shiftY). + * @param defaultValue is returned if the lookup fails. + * @returns the retrieved value (or `defaultValue` if the lookup fails). + */ + lookupMetric(key: string, defaultValue?: Record | number): any; + /** For debugging. */ + toString(): string; +} diff --git a/build/types/src/fonts/bravura_glyphs.d.ts b/build/types/src/fonts/bravura_glyphs.d.ts new file mode 100644 index 0000000000..d165377537 --- /dev/null +++ b/build/types/src/fonts/bravura_glyphs.d.ts @@ -0,0 +1,3239 @@ +export declare const BravuraFont: { + glyphs: { + bracketTop: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + bracketBottom: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + barlineTick: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + breathMarkTick: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + segno: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + coda: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + gClef: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + cClef: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + fClef: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + unpitchedPercussionClef1: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + '6stringTabClef': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig0: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig1: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig2: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig3: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig4: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig5: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig6: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig7: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig8: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig9: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigCommon: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigCutCommon: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigPlus: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigPlusSmall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigMinus: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigParensRight: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigParensRightSmall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigParensLeft: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigParensLeftSmall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadDoubleWhole: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadWhole: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadHalf: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadBlack: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadXWhole: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadXHalf: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadXBlack: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadCircleX: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadTriangleUpWhole: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadTriangleUpHalf: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadTriangleUpBlack: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadDiamondWhole: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadDiamondHalf: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadDiamondBlack: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadSquareWhite: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadSquareBlack: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadParenthesis: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadParenthesisRight: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadParenthesisLeft: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + augmentationDot: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + tremolo1: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag8thUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag8thDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag16thUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag16thDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag32ndUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag32ndDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag64thUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag64thDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag128thUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag128thDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalFlat: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalNatural: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalSharp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalDoubleSharp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalDoubleFlat: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalParensLeft: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalParensRight: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalQuarterToneFlatStein: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalThreeQuarterTonesFlatZimmermann: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalQuarterToneSharpStein: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalThreeQuarterTonesSharpStein: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalBuyukMucennebFlat: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalBakiyeFlat: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalKomaSharp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalKucukMucennebSharp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalKoron: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalSori: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articAccentAbove: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articAccentBelow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articTenutoAbove: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articTenutoBelow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articStaccatoAbove: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articStaccatoBelow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articStaccatissimoAbove: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articStaccatissimoBelow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articMarcatoAbove: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articMarcatoBelow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + fermataAbove: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + fermataBelow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + breathMarkComma: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + breathMarkUpbow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + caesura: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + caesuraCurved: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + restMaxima: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + restDoubleWhole: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + restWhole: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + restHalf: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + restQuarter: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + rest8th: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + rest16th: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + rest32nd: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + rest64th: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + rest128th: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + dynamicPiano: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + dynamicMezzo: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + dynamicForte: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + dynamicRinforzando: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + dynamicSforzando: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + dynamicZ: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentTrill: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentTurn: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentTurnSlash: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentMordent: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentShortTrill: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentTremblement: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentPrecompAppoggTrill: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentPrecompSlideTrillDAnglebert: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentPrecompSlideTrillBach: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentPrecompTrillSuffixDandrieu: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentPrecompDoubleCadenceUpperPrefix: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentPrecompDoubleCadenceUpperPrefixTurn: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentPrecompTrillLowerSuffix: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassScoop: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassDoitMedium: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassFallLipShort: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassLiftMedium: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassFallRoughMedium: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassBend: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassMuteClosed: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassMuteOpen: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassFlip: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassJazzTurn: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassSmear: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + stringsDownBow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + stringsUpBow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + stringsHarmonic: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + pluckedSnapPizzicatoAbove: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + pluckedSnapPizzicatoBelow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + pluckedLeftHandPizzicato: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + keyboardPedalPed: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + keyboardPedalUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + pictChokeCymbal: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + wiggleArpeggiatoUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + arrowheadBlackUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + arrowheadBlackDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + arpeggiatoUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + arpeggiatoDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + repeat1Bar: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + repeat2Bars: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + repeat4Bars: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + repeatBarSlash: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymDiminished: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymHalfDiminished: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymAugmented: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymMajorSeventh: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymMinor: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymParensLeftTall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymParensRightTall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymBracketLeftTall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymBracketRightTall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymParensLeftVeryTall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymParensRightVeryTall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymDiagonalArrangementSlash: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5v7KleismaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5v7KleismaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5CommaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5CommaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal7CommaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal7CommaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal25SmallDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal25SmallDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal35MediumDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal35MediumDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal11MediumDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal11MediumDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal11LargeDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal11LargeDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal35LargeDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal35LargeDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp25SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat25SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp7CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat7CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp5CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat5CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp5v7kDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat5v7kUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp5v7kUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat5v7kDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp5CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat5CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp7CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat7CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp25SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat25SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp35MUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat35MDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp11MUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat11MDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp11LUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat11LDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp35LUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat35LDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp25SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat25SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp7CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat7CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp5CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat5CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp5v7kDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat5v7kUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal7v11KleismaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal7v11KleismaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal17CommaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal17CommaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal55CommaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal55CommaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal7v11CommaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal7v11CommaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5v11SmallDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5v11SmallDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp5v11SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat5v11SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp7v11CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat7v11CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp55CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat55CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp17CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat17CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp7v11kDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat7v11kUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp7v11kUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat7v11kDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp17CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat17CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp55CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat55CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp7v11CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat7v11CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp5v11SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat5v11SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp5v11SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat5v11SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp7v11CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat7v11CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp55CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat55CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp17CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat17CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp7v11kDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat7v11kUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal23CommaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal23CommaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5v19CommaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5v19CommaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5v23SmallDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5v23SmallDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp5v23SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat5v23SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp5v19CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat5v19CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp23CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat23CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp23CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat23CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp5v19CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat5v19CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp5v23SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat5v23SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp5v23SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat5v23SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp5v19CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat5v19CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp23CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat23CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal19SchismaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal19SchismaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal17KleismaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal17KleismaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal143CommaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal143CommaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal11v49CommaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal11v49CommaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal19CommaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal19CommaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal7v19CommaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal7v19CommaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal49SmallDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal49SmallDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal23SmallDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal23SmallDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5v13MediumDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5v13MediumDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal11v19MediumDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal11v19MediumDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal49MediumDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal49MediumDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5v49MediumDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5v49MediumDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal49LargeDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal49LargeDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal11v19LargeDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal11v19LargeDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5v13LargeDiesisUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5v13LargeDiesisDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp23SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat23SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp49SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat49SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp7v19CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat7v19CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp19CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat19CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp11v49CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat11v49CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp143CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat143CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp17kDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat17kUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp19sDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat19sUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp19sUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat19sDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp17kUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat17kDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp143CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat143CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp11v49CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat11v49CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp19CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat19CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp7v19CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat7v19CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp49SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat49SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp23SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat23SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp5v13MUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat5v13MDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp11v19MUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat11v19MDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp49MUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat49MDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp5v49MUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat5v49MDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp49LUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat49LDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp11v19LUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat11v19LDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalSharp5v13LUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFlat5v13LDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp23SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat23SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp49SDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat49SUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp7v19CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat7v19CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp19CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat19CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp11v49CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat11v49CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp143CDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat143CUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp17kDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat17kUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleSharp19sDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalDoubleFlat19sUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalShaftUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalShaftDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalAcute: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalGrave: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal1MinaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal1MinaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal2MinasUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal2MinasDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal1TinaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal1TinaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal2TinasUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal2TinasDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal3TinasUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal3TinasDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal4TinasUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal4TinasDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5TinasUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal5TinasDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal6TinasUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal6TinasDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal7TinasUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal7TinasDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal8TinasUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal8TinasDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal9TinasUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittal9TinasDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFractionalTinaUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accSagittalFractionalTinaDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalNarrowReversedFlat: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalNarrowReversedFlatAndFlat: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalWilsonPlus: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalWilsonMinus: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + }; + fontFamily: string; + resolution: number; + generatedOn: string; +}; diff --git a/build/types/src/fonts/bravura_metrics.d.ts b/build/types/src/fonts/bravura_metrics.d.ts new file mode 100644 index 0000000000..8c68b84bcf --- /dev/null +++ b/build/types/src/fonts/bravura_metrics.d.ts @@ -0,0 +1,530 @@ +/** + * The Bravura font was created by Daniel Spreadbury @ Steinberg. + * https://github.com/steinbergmedia/bravura/ + */ +export declare const BravuraMetrics: { + name: string; + smufl: boolean; + stave: { + padding: number; + endPaddingMax: number; + endPaddingMin: number; + unalignedNotePadding: number; + }; + accidental: { + noteheadAccidentalPadding: number; + leftPadding: number; + accidentalSpacing: number; + }; + clef: { + default: { + point: number; + width: number; + }; + small: { + point: number; + width: number; + }; + annotations: { + '8va': { + smuflCode: string; + default: { + point: number; + treble: { + line: number; + shiftX: number; + }; + }; + small: { + point: number; + treble: { + line: number; + shiftX: number; + }; + }; + }; + '8vb': { + smuflCode: string; + default: { + point: number; + treble: { + line: number; + shiftX: number; + }; + bass: { + line: number; + shiftX: number; + }; + }; + small: { + point: number; + treble: { + line: number; + shiftX: number; + }; + bass: { + line: number; + shiftX: number; + }; + }; + }; + }; + lineCount: { + '8': { + point: number; + shiftY: number; + }; + '7': { + point: number; + shiftY: number; + }; + '6': { + point: number; + shiftY: number; + }; + '5': { + point: number; + shiftY: number; + }; + '4': { + point: number; + shiftY: number; + }; + }; + }; + parenthesis: { + default: { + point: number; + width: number; + }; + gracenote: { + point: number; + width: number; + }; + }; + pedalMarking: { + up: { + point: number; + }; + down: { + point: number; + }; + }; + digits: { + shiftLine: number; + point: number; + tupletPoint: number; + shiftY: number; + }; + articulation: { + articStaccatissimoAbove: { + padding: number; + }; + articStaccatissimoBelow: { + padding: number; + }; + }; + tremolo: { + default: { + point: number; + spacing: number; + offsetYStemUp: number; + offsetYStemDown: number; + offsetXStemUp: number; + offsetXStemDown: number; + }; + grace: { + point: number; + spacing: number; + offsetYStemUp: number; + offsetYStemDown: number; + offsetXStemUp: number; + offsetXStemDown: number; + }; + }; + staveRepetition: { + default: { + offsetY: number; + offsetSymbol: number; + spacing: number; + }; + }; + stem: { + heightAdjustmentForFlag: number; + noteHead: { + noteheadTriangleUpHalf: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadTriangleUpBlack: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadTriangleUpWhole: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadXHalf: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadXBlack: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadXWhole: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadHalf: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadBlack: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadSquareWhite: { + offsetYBaseStemDown: number; + offsetYBaseStemUp: number; + }; + }; + }; + glyphs: { + coda: { + point: number; + shiftX: number; + shiftY: number; + }; + segno: { + shiftX: number; + }; + flag: { + shiftX: number; + tabStem: { + shiftX: number; + }; + staveTempo: { + shiftX: number; + }; + }; + clef: { + gClef: { + default: { + scale: number; + shiftY: number; + }; + small: { + shiftY: number; + }; + }; + fClef: { + default: { + shiftY: number; + }; + }; + }; + ornament: { + ornamentTurn: { + scale: number; + }; + ornamentTurnSlash: { + scale: number; + }; + }; + stringNumber: { + verticalPadding: number; + stemPadding: number; + leftPadding: number; + rightPadding: number; + }; + stroke: { + arrowheadBlackDown: { + straight: { + shiftX: number; + }; + wiggly: { + shiftX: number; + shiftY: number; + }; + }; + arrowheadBlackUp: { + straight: { + shiftX: number; + }; + wiggly: { + shiftX: number; + shiftY: number; + }; + }; + }; + textNote: { + point: number; + breathMarkTick: { + point: number; + shiftY: number; + }; + breathMarkComma: { + point: number; + }; + segno: { + point: number; + shiftX: number; + shiftY: number; + }; + coda: { + point: number; + shiftX: number; + shiftY: number; + }; + ornamentTrill: { + shiftX: number; + shiftY: number; + }; + ornamentTurn: { + point: number; + }; + ornamentTurnSlash: { + point: number; + }; + ornamentMordent: { + shiftX: number; + }; + ornamentShortTrill: { + shiftX: number; + }; + }; + noteHead: { + minPadding: number; + standard: { + restQuarterStemUp: { + point: number; + }; + restQuarterStemDown: { + point: number; + }; + }; + custom: { + noteheadCircleXStemUp: { + shiftX: number; + }; + noteheadCircleXStemDown: { + shiftX: number; + }; + noteheadDiamondHalfStemUp: { + shiftX: number; + }; + noteheadDiamondBlackStemUp: { + shiftX: number; + }; + noteheadDiamondWholeStemUp: { + shiftX: number; + }; + noteheadXHalfStemUp: { + shiftX: number; + }; + noteheadXHalfStemDown: { + shiftX: number; + }; + noteheadXWholeStemUp: { + shiftX: number; + }; + noteheadXWholeStemDown: { + shiftX: number; + }; + noteheadSquareWhiteStemDown: { + shiftX: number; + }; + noteheadSquareWhiteStemUp: { + shiftX: number; + }; + noteheadSquareBlackStemUp: { + shiftX: number; + }; + noteheadTriangleUpWholeStemUp: { + shiftX: number; + }; + }; + }; + chordSymbol: { + global: { + superscriptOffset: number; + subscriptOffset: number; + kerningOffset: number; + lowerKerningText: string[]; + upperKerningText: string[]; + spacing: number; + superSubRatio: number; + }; + csymDiminished: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymHalfDiminished: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymAugmented: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymParensLeftTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymParensRightTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymBracketLeftTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymBracketRightTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymParensLeftVeryTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymParensRightVeryTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymDiagonalArrangementSlash: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymMinor: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymMajorSeventh: { + scale: number; + leftSideBearing: number; + yOffset: number; + advanceWidth: number; + }; + accidentalSharp: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + accidentalFlat: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + }; + jazzOrnaments: { + brassScoop: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassDoitMedium: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassFallLipShort: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassLiftMedium: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassFallRoughMedium: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassBend: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassMuteClosed: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassMuteOpen: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassFlip: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassJazzTurn: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassSmear: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + }; + tuplet: { + noteHeadOffset: number; + stemOffset: number; + bottomLine: number; + topModifierOffset: number; + }; + }; +}; diff --git a/build/types/src/fonts/custom_glyphs.d.ts b/build/types/src/fonts/custom_glyphs.d.ts new file mode 100644 index 0000000000..0bb62984ec --- /dev/null +++ b/build/types/src/fonts/custom_glyphs.d.ts @@ -0,0 +1,78 @@ +export declare const CustomFont: { + resolution: number; + fontFamily: string; + glyphs: { + noteheadSquareWhite: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadSquareBlack: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalBuyukMucennebFlat: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalBakiyeFlat: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalKucukMucennebSharp: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalKoron: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalSori: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + vexAccidentalMicrotonal2: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + vexAccidentalMicrotonal3: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + vexAccidentalMicrotonal4: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + vexNoteHeadRectBlack: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + vexNoteHeadRectWhite: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + }; +}; diff --git a/build/types/src/fonts/custom_metrics.d.ts b/build/types/src/fonts/custom_metrics.d.ts new file mode 100644 index 0000000000..3f88d3695f --- /dev/null +++ b/build/types/src/fonts/custom_metrics.d.ts @@ -0,0 +1,5 @@ +export declare const CustomMetrics: { + name: string; + smufl: boolean; + glyphs: {}; +}; diff --git a/build/types/src/fonts/gonville_glyphs.d.ts b/build/types/src/fonts/gonville_glyphs.d.ts new file mode 100644 index 0000000000..6a25c9c61d --- /dev/null +++ b/build/types/src/fonts/gonville_glyphs.d.ts @@ -0,0 +1,828 @@ +export declare const GonvilleFont: { + glyphs: { + bracketTop: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + bracketBottom: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + barlineTick: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + breathMarkTick: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + segno: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + coda: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + gClef: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + cClef: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + fClef: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + unpitchedPercussionClef1: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + '6stringTabClef': { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSig0: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSig1: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSig2: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSig3: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSig4: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSig5: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSig6: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSig7: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSig8: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSig9: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSigCommon: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSigCutCommon: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSigPlus: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSigPlusSmall: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSigMinus: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSigParensRight: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSigParensRightSmall: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSigParensLeft: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + timeSigParensLeftSmall: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadDoubleWhole: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadWhole: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadHalf: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadBlack: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadXWhole: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadXHalf: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadXBlack: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadCircleX: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadTriangleUpWhole: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadTriangleUpHalf: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadTriangleUpBlack: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadDiamondWhole: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadDiamondHalf: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + noteheadDiamondBlack: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + augmentationDot: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + tremolo1: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + flag8thUp: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + flag8thDown: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + flag16thUp: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + flag16thDown: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + flag32ndUp: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + flag32ndDown: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + flag64thUp: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + flag64thDown: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + flag128thUp: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + flag128thDown: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalFlat: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalNatural: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalSharp: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalDoubleSharp: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalDoubleFlat: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalParensLeft: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalParensRight: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalQuarterToneFlatStein: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalThreeQuarterTonesFlatZimmermann: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalQuarterToneSharpStein: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalThreeQuarterTonesSharpStein: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalBuyukMucennebFlat: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalBakiyeFlat: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalKomaSharp: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + accidentalKucukMucennebSharp: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + articAccentAbove: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + articAccentBelow: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + articTenutoAbove: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + articTenutoBelow: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + articStaccatoAbove: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + articStaccatoBelow: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + articStaccatissimoAbove: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + articStaccatissimoBelow: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + articMarcatoAbove: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + articMarcatoBelow: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + fermataAbove: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + fermataBelow: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + breathMarkComma: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + breathMarkUpbow: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + caesura: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + caesuraCurved: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + restMaxima: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + restDoubleWhole: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + restWhole: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + restHalf: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + restQuarter: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + rest8th: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + rest16th: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + rest32nd: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + rest64th: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + rest128th: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + dynamicPiano: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + dynamicMezzo: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + dynamicForte: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + dynamicRinforzando: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + dynamicSforzando: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + dynamicZ: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + ornamentTrill: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + ornamentTurn: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + ornamentTurnSlash: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + ornamentMordent: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + ornamentShortTrill: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + ornamentTremblement: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + ornamentPrecompAppoggTrill: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + ornamentPrecompSlideTrillDAnglebert: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + ornamentPrecompSlideTrillBach: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + ornamentPrecompTrillSuffixDandrieu: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + ornamentPrecompDoubleCadenceUpperPrefix: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + ornamentPrecompDoubleCadenceUpperPrefixTurn: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + ornamentPrecompTrillLowerSuffix: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + stringsDownBow: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + stringsUpBow: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + stringsHarmonic: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + pluckedSnapPizzicatoAbove: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + pluckedSnapPizzicatoBelow: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + pluckedLeftHandPizzicato: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + keyboardPedalPed: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + keyboardPedalUp: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + pictChokeCymbal: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + wiggleArpeggiatoUp: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + arrowheadBlackUp: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + arrowheadBlackDown: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + vexAccidentalMicrotonal1: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + vexAccidentalMicrotonal2: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + vexWiggleArpeggioUp: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + vexNoteHeadMutedBreve: { + x_min: number; + x_max: number; + ha: number; + o: string; + }; + }; + cssFontWeight: string; + ascender: number; + underlinePosition: number; + cssFontStyle: string; + boundingBox: { + yMin: number; + xMin: number; + yMax: number; + xMax: number; + }; + resolution: number; + original_font_information: { + postscript_name: string; + version_string: string; + vendor_url: string; + full_font_name: string; + font_family_name: string; + copyright: string; + description: string; + trademark: string; + designer: string; + designer_url: string; + unique_font_identifier: string; + license_url: string; + license_description: string; + manufacturer_name: string; + font_sub_family_name: string; + }; + descender: number; + fontFamily: string; + lineHeight: number; + underlineThickness: number; +}; diff --git a/build/types/src/fonts/gonville_metrics.d.ts b/build/types/src/fonts/gonville_metrics.d.ts new file mode 100644 index 0000000000..8ec47e9937 --- /dev/null +++ b/build/types/src/fonts/gonville_metrics.d.ts @@ -0,0 +1,434 @@ +/** + * The Gonville font was created by Simon Tatham. + * https://www.chiark.greenend.org.uk/~sgtatham/gonville/ + */ +export declare const GonvilleMetrics: { + name: string; + smufl: boolean; + stave: { + padding: number; + endPaddingMax: number; + endPaddingMin: number; + unalignedNotePadding: number; + }; + accidental: { + noteheadAccidentalPadding: number; + leftPadding: number; + accidentalSpacing: number; + }; + clef: { + default: { + point: number; + width: number; + }; + small: { + point: number; + width: number; + }; + annotations: { + '8va': { + smuflCode: string; + default: { + point: number; + treble: { + line: number; + shiftX: number; + }; + }; + small: { + point: number; + treble: { + line: number; + shiftX: number; + }; + }; + }; + '8vb': { + smuflCode: string; + default: { + point: number; + treble: { + line: number; + shiftX: number; + }; + bass: { + line: number; + shiftX: number; + }; + }; + small: { + point: number; + treble: { + line: number; + shiftX: number; + }; + bass: { + line: number; + shiftX: number; + }; + }; + }; + }; + lineCount: { + '8': { + point: number; + shiftY: number; + }; + '7': { + point: number; + shiftY: number; + }; + '6': { + point: number; + shiftY: number; + }; + '5': { + point: number; + shiftY: number; + }; + '4': { + point: number; + shiftY: number; + }; + }; + }; + parenthesis: { + default: { + point: number; + width: number; + }; + gracenote: { + point: number; + width: number; + }; + }; + pedalMarking: { + up: { + point: number; + }; + down: { + point: number; + }; + }; + digits: { + point: number; + tupletPoint: number; + }; + tremolo: { + default: { + point: number; + spacing: number; + offsetYStemUp: number; + offsetYStemDown: number; + offsetXStemUp: number; + offsetXStemDown: number; + }; + grace: { + point: number; + spacing: number; + offsetYStemUp: number; + offsetYStemDown: number; + offsetXStemUp: number; + offsetXStemDown: number; + }; + }; + staveRepetition: { + default: { + offsetY: number; + offsetSymbol: number; + spacing: number; + }; + }; + stem: { + heightAdjustmentForFlag: number; + noteHead: { + noteheadTriangleUpHalf: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadTriangleUpBlack: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadTriangleUpWhole: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadXHalf: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadXBlack: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadXWhole: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadHalf: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadBlack: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadSquareWhite: { + offsetYBaseStemDown: number; + offsetYBaseStemUp: number; + }; + }; + }; + glyphs: { + flag: { + shiftX: number; + flag8thDown: { + shiftX: number; + }; + flag16thDown: { + shiftX: number; + }; + flag32ndDown: { + shiftX: number; + shiftY: number; + }; + flag64thDown: { + shiftX: number; + shiftY: number; + }; + flag128thDown: { + shiftX: number; + shiftY: number; + }; + flag32ndUp: { + shiftY: number; + }; + flag64thUp: { + shiftY: number; + }; + flag128thUp: { + shiftY: number; + }; + }; + stringNumber: { + verticalPadding: number; + stemPadding: number; + leftPadding: number; + rightPadding: number; + }; + textNote: { + point: number; + default: {}; + ornamentTrill: { + shiftX: number; + shiftY: number; + }; + }; + noteHead: { + minPadding: number; + custom: { + noteheadDiamondWholeStemUp: { + shiftX: number; + }; + noteheadCircleXStemUp: { + shiftX: number; + }; + noteheadXWholeStemUp: { + shiftX: number; + }; + noteheadTriangleUpWholeStemUp: { + shiftX: number; + }; + }; + }; + chordSymbol: { + global: { + superscriptOffset: number; + subscriptOffset: number; + kerningOffset: number; + lowerKerningText: string[]; + upperKerningText: string[]; + spacing: number; + superSubRatio: number; + }; + csymDiminished: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymHalfDiminished: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymAugmented: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymParensLeftTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymParensRightTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymBracketLeftTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymBracketRightTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymParensLeftVeryTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymParensRightVeryTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymDiagonalArrangementSlash: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymMinor: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymMajorSeventh: { + scale: number; + leftSideBearing: number; + yOffset: number; + advanceWidth: number; + }; + accidentalSharp: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + accidentalFlat: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + }; + jazzOrnaments: { + brassScoop: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassDoitMedium: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassFallLipShort: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassLiftMedium: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassFallRoughMedium: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassBend: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassMuteClosed: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassMuteOpen: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassFlip: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassJazzTurn: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassSmear: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + }; + tremolo: { + default: { + shiftY: number; + }; + grace: { + shiftY: number; + }; + }; + tuplet: { + noteHeadOffset: number; + stemOffset: number; + bottomLine: number; + topModifierOffset: number; + }; + }; +}; diff --git a/build/types/src/fonts/load_all.d.ts b/build/types/src/fonts/load_all.d.ts new file mode 100644 index 0000000000..c8159357a9 --- /dev/null +++ b/build/types/src/fonts/load_all.d.ts @@ -0,0 +1 @@ +export declare function loadAllMusicFonts(): void; diff --git a/build/types/src/fonts/load_bravura.d.ts b/build/types/src/fonts/load_bravura.d.ts new file mode 100644 index 0000000000..368afa2244 --- /dev/null +++ b/build/types/src/fonts/load_bravura.d.ts @@ -0,0 +1 @@ +export declare function loadBravura(): void; diff --git a/build/types/src/fonts/load_custom.d.ts b/build/types/src/fonts/load_custom.d.ts new file mode 100644 index 0000000000..2b3b5207a7 --- /dev/null +++ b/build/types/src/fonts/load_custom.d.ts @@ -0,0 +1 @@ +export declare function loadCustom(): void; diff --git a/build/types/src/fonts/load_gonville.d.ts b/build/types/src/fonts/load_gonville.d.ts new file mode 100644 index 0000000000..1dad266116 --- /dev/null +++ b/build/types/src/fonts/load_gonville.d.ts @@ -0,0 +1 @@ +export declare function loadGonville(): void; diff --git a/build/types/src/fonts/load_petaluma.d.ts b/build/types/src/fonts/load_petaluma.d.ts new file mode 100644 index 0000000000..db8a66540a --- /dev/null +++ b/build/types/src/fonts/load_petaluma.d.ts @@ -0,0 +1 @@ +export declare function loadPetaluma(): void; diff --git a/build/types/src/fonts/petaluma_glyphs.d.ts b/build/types/src/fonts/petaluma_glyphs.d.ts new file mode 100644 index 0000000000..7a4983d6c5 --- /dev/null +++ b/build/types/src/fonts/petaluma_glyphs.d.ts @@ -0,0 +1,1335 @@ +export declare const PetalumaFont: { + glyphs: { + bracketTop: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + bracketBottom: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + barlineTick: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + breathMarkTick: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + segno: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + coda: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + gClef: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + cClef: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + fClef: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + unpitchedPercussionClef1: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + '6stringTabClef': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig0: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig1: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig2: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig3: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig4: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig5: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig6: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig7: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig8: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSig9: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigCommon: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigCutCommon: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigPlus: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigPlusSmall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigMinus: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigParensRight: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigParensRightSmall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigParensLeft: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + timeSigParensLeftSmall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadDoubleWhole: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadWhole: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadHalf: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadBlack: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadXWhole: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadXHalf: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadXBlack: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadCircleX: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadTriangleUpWhole: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadTriangleUpHalf: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadTriangleUpBlack: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadDiamondWhole: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadDiamondHalf: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadDiamondBlack: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadSquareWhite: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadSquareBlack: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadParenthesis: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadParenthesisRight: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + noteheadParenthesisLeft: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + augmentationDot: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + tremolo1: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag8thUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag8thDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag16thUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag16thDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag32ndUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag32ndDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag64thUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag64thDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag128thUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + flag128thDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalFlat: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalNatural: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalSharp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalDoubleSharp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalDoubleFlat: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalParensLeft: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalParensRight: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalQuarterToneFlatStein: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalThreeQuarterTonesFlatZimmermann: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalQuarterToneSharpStein: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalThreeQuarterTonesSharpStein: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalBuyukMucennebFlat: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalBakiyeFlat: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalKomaSharp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalKucukMucennebSharp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalKoron: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalSori: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articAccentAbove: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articAccentBelow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articTenutoAbove: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articTenutoBelow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articStaccatoAbove: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articStaccatoBelow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articStaccatissimoAbove: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articStaccatissimoBelow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articMarcatoAbove: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + articMarcatoBelow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + fermataAbove: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + fermataBelow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + breathMarkComma: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + breathMarkUpbow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + caesura: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + caesuraCurved: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + restMaxima: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + restDoubleWhole: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + restWhole: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + restHalf: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + restQuarter: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + rest8th: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + rest16th: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + rest32nd: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + rest64th: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + rest128th: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + dynamicPiano: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + dynamicMezzo: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + dynamicForte: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + dynamicRinforzando: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + dynamicSforzando: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + dynamicZ: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentTrill: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentTurn: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentTurnSlash: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentMordent: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentShortTrill: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentTremblement: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentPrecompAppoggTrill: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentPrecompSlideTrillDAnglebert: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentPrecompSlideTrillBach: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentPrecompTrillSuffixDandrieu: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentPrecompDoubleCadenceUpperPrefix: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentPrecompDoubleCadenceUpperPrefixTurn: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + ornamentPrecompTrillLowerSuffix: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassScoop: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassDoitMedium: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassFallLipShort: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassLiftMedium: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassFallRoughMedium: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassBend: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassMuteClosed: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassMuteOpen: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassFlip: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassJazzTurn: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + brassSmear: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + stringsDownBow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + stringsUpBow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + stringsHarmonic: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + pluckedSnapPizzicatoAbove: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + pluckedSnapPizzicatoBelow: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + pluckedLeftHandPizzicato: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + keyboardPedalPed: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + keyboardPedalUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + pictChokeCymbal: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + wiggleArpeggiatoUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + arpeggiatoUp: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + arpeggiatoDown: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + repeat1Bar: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + repeat2Bars: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + repeat4Bars: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + repeatBarSlash: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymDiminished: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymHalfDiminished: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymAugmented: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymMajorSeventh: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymMinor: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymParensLeftTall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymParensRightTall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymBracketLeftTall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymBracketRightTall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymParensLeftVeryTall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymParensRightVeryTall: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + csymDiagonalArrangementSlash: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalNarrowReversedFlat: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalNarrowReversedFlatAndFlat: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalWilsonPlus: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + accidentalWilsonMinus: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + o: string; + }; + }; + fontFamily: string; + resolution: number; + generatedOn: string; +}; diff --git a/build/types/src/fonts/petaluma_metrics.d.ts b/build/types/src/fonts/petaluma_metrics.d.ts new file mode 100644 index 0000000000..d181a4276c --- /dev/null +++ b/build/types/src/fonts/petaluma_metrics.d.ts @@ -0,0 +1,559 @@ +/** + * The Petaluma font was created by Steinberg Media. + * https://github.com/steinbergmedia/petaluma + */ +export declare const PetalumaMetrics: { + name: string; + smufl: boolean; + stave: { + padding: number; + endPaddingMax: number; + endPaddingMin: number; + unalignedNotePadding: number; + }; + accidental: { + noteheadAccidentalPadding: number; + leftPadding: number; + accidentalSpacing: number; + }; + clef: { + default: { + point: number; + width: number; + }; + small: { + point: number; + width: number; + }; + annotations: { + '8va': { + smuflCode: string; + default: { + point: number; + treble: { + line: number; + shiftX: number; + }; + }; + small: { + point: number; + treble: { + line: number; + shiftX: number; + }; + }; + }; + '8vb': { + smuflCode: string; + default: { + point: number; + treble: { + line: number; + shiftX: number; + }; + bass: { + line: number; + shiftX: number; + }; + }; + small: { + point: number; + treble: { + line: number; + shiftX: number; + }; + bass: { + line: number; + shiftX: number; + }; + }; + }; + }; + lineCount: { + '8': { + point: number; + shiftY: number; + }; + '7': { + point: number; + shiftY: number; + }; + '6': { + point: number; + shiftY: number; + }; + '5': { + point: number; + shiftY: number; + }; + '4': { + point: number; + shiftY: number; + }; + }; + }; + parenthesis: { + default: { + point: number; + width: number; + }; + gracenote: { + point: number; + width: number; + }; + }; + pedalMarking: { + up: { + point: number; + }; + down: { + point: number; + }; + }; + digits: { + shiftLine: number; + point: number; + tupletPoint: number; + shiftY: number; + }; + articulation: { + articStaccatissimoAbove: { + padding: number; + }; + articStaccatissimoBelow: { + padding: number; + }; + }; + tremolo: { + default: { + point: number; + spacing: number; + offsetYStemUp: number; + offsetYStemDown: number; + offsetXStemUp: number; + offsetXStemDown: number; + }; + grace: { + point: number; + spacing: number; + offsetYStemUp: number; + offsetYStemDown: number; + offsetXStemUp: number; + offsetXStemDown: number; + }; + }; + staveRepetition: { + default: { + offsetY: number; + offsetSymbol: number; + spacing: number; + }; + }; + noteHead: { + displaced: { + shiftX: number; + }; + }; + stem: { + heightAdjustmentForFlag: number; + noteHead: { + noteheadTriangleUpHalf: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadTriangleUpBlack: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadTriangleUpWhole: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadXHalf: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadXBlack: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadXWhole: { + offsetYBaseStemUp: number; + offsetYBaseStemDown: number; + }; + noteheadHalf: { + offsetYBaseStemDown: number; + offsetYBaseStemUp: number; + }; + noteheadBlack: { + offsetYBaseStemDown: number; + offsetYBaseStemUp: number; + }; + noteheadSquareWhite: { + offsetYBaseStemDown: number; + offsetYBaseStemUp: number; + }; + }; + }; + glyphs: { + coda: { + point: number; + shiftX: number; + shiftY: number; + }; + segno: { + shiftX: number; + }; + flag: { + shiftX: number; + flag16thUp: { + shiftX: number; + }; + flag32ndUp: { + shiftX: number; + }; + flag64thUp: { + shiftX: number; + }; + flag128thUp: { + shiftX: number; + }; + flag16thDown: { + shiftX: number; + }; + flag32ndDown: { + shiftX: number; + }; + flag64thDown: { + shiftX: number; + }; + flag128thDown: { + shiftX: number; + }; + tabStem: { + shiftX: number; + }; + staveTempo: { + shiftX: number; + }; + }; + clef: { + gClef: { + default: { + scale: number; + shiftY: number; + }; + small: { + shiftY: number; + }; + }; + fClef: { + default: { + shiftY: number; + }; + }; + }; + ornament: { + ornamentTurn: { + scale: number; + }; + ornamentTurnSlash: { + scale: number; + }; + }; + stringNumber: { + verticalPadding: number; + stemPadding: number; + leftPadding: number; + rightPadding: number; + }; + stroke: { + arrowheadBlackDown: { + straight: { + shiftX: number; + }; + wiggly: { + shiftX: number; + shiftY: number; + }; + }; + arrowheadBlackUp: { + straight: { + shiftX: number; + }; + wiggly: { + shiftX: number; + shiftY: number; + }; + }; + }; + textNote: { + point: number; + breathMarkTick: { + point: number; + shiftY: number; + }; + breathMarkComma: { + point: number; + }; + segno: { + point: number; + shiftX: number; + shiftY: number; + }; + coda: { + point: number; + shiftX: number; + shiftY: number; + }; + ornamentTrill: { + shiftX: number; + shiftY: number; + }; + ornamentMordent: { + shiftX: number; + }; + ornamentShortTrill: { + shiftX: number; + }; + }; + noteHead: { + minPadding: number; + standard: { + noteheadBlackStemUp: { + shiftX: number; + }; + noteheadHalfStemUp: { + shiftX: number; + }; + noteheadWholeStemUp: { + shiftX: number; + }; + }; + custom: { + noteheadCircleXStemUp: { + shiftX: number; + }; + noteheadCircleXStemDown: { + shiftX: number; + }; + noteheadDiamondHalfStemUp: { + shiftX: number; + }; + noteheadDiamondBlackStemUp: { + shiftX: number; + }; + noteheadDiamondWholeStemUp: { + shiftX: number; + }; + noteheadXBlackStemUp: { + shiftX: number; + }; + noteheadXHalfStemUp: { + shiftX: number; + }; + noteheadXHalfStemDown: { + shiftX: number; + }; + noteheadXWholeStemUp: { + shiftX: number; + }; + noteheadXWholeStemDown: { + shiftX: number; + }; + noteheadSquareWhiteStemDown: { + shiftX: number; + }; + noteheadSquareWhiteStemUp: { + shiftX: number; + }; + noteheadSquareBlackStemUp: { + shiftX: number; + }; + noteheadTriangleUpWholeStemUp: { + shiftX: number; + }; + }; + }; + chordSymbol: { + global: { + superscriptOffset: number; + subscriptOffset: number; + kerningOffset: number; + lowerKerningText: string[]; + upperKerningText: string[]; + spacing: number; + superSubRatio: number; + }; + csymDiminished: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymHalfDiminished: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymAugmented: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymParensLeftTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymParensRightTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymBracketLeftTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymBracketRightTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymParensLeftVeryTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymParensRightVeryTall: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymDiagonalArrangementSlash: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymMinor: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + csymMajorSeventh: { + scale: number; + leftSideBearing: number; + yOffset: number; + advanceWidth: number; + }; + accidentalSharp: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + accidentalFlat: { + scale: number; + leftSideBearing: number; + advanceWidth: number; + yOffset: number; + }; + }; + jazzOrnaments: { + brassScoop: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassDoitMedium: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassFallLipShort: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassLiftMedium: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassFallRoughMedium: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassBend: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassMuteClosed: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassMuteOpen: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassFlip: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassJazzTurn: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + brassSmear: { + scale: number; + xOffset: number; + yOffset: number; + stemUpYOffset: number; + reportedWidth: number; + }; + }; + tuplet: { + noteHeadOffset: number; + stemOffset: number; + bottomLine: number; + topModifierOffset: number; + }; + }; +}; diff --git a/build/types/src/fonts/petalumascript_glyphs.d.ts b/build/types/src/fonts/petalumascript_glyphs.d.ts new file mode 100644 index 0000000000..82295a6a3a --- /dev/null +++ b/build/types/src/fonts/petalumascript_glyphs.d.ts @@ -0,0 +1,863 @@ +export declare const PetalumaScriptFont: { + spacing: number; + glyphs: { + ' ': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '0': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '1': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '2': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '3': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '4': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '5': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '6': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '7': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '8': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '9': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '!': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '"': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '#': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + $: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '%': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '&': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + "'": { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '(': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + ')': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '*': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '+': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + ',': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '-': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '.': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '/': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + ':': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + ';': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '<': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '=': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '>': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '?': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '@': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + A: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + B: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + C: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + D: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + E: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + F: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + G: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + H: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + I: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + J: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + K: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + L: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + M: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + N: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + O: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + P: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + Q: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + R: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + S: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + T: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + U: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + V: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + W: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + X: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + Y: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + Z: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '[': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '\\': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + ']': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '^': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + _: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '`': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + a: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + b: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + c: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + d: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + e: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + f: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + g: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + h: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + i: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + j: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + k: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + l: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + m: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + n: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + o: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + p: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + q: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + r: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + s: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + t: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + u: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + v: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + w: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + x: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + y: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + z: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '{': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '|': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '}': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '~': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + }; + fontFamily: string; + resolution: number; + generatedOn: string; +}; diff --git a/build/types/src/fonts/robotoslab_glyphs.d.ts b/build/types/src/fonts/robotoslab_glyphs.d.ts new file mode 100644 index 0000000000..3bfa79f006 --- /dev/null +++ b/build/types/src/fonts/robotoslab_glyphs.d.ts @@ -0,0 +1,863 @@ +export declare const RobotoSlabFont: { + spacing: number; + glyphs: { + ' ': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '0': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '1': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '2': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '3': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '4': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '5': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '6': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '7': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '8': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '9': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '!': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '"': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '#': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + $: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '%': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '&': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + "'": { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '(': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + ')': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '*': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '+': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + ',': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '-': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '.': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '/': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + ':': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + ';': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '<': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '=': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '>': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '?': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '@': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + A: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + B: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + C: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + D: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + E: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + F: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + G: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + H: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + I: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + J: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + K: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + L: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + M: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + N: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + O: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + P: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + Q: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + R: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + S: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + T: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + U: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + V: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + W: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + X: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + Y: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + Z: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '[': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '\\': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + ']': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '^': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + _: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '`': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + a: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + b: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + c: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + d: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + e: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + f: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + g: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + h: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + i: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + j: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + k: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + l: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + m: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + n: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + o: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + p: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + q: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + r: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + s: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + t: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + u: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + v: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + w: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + x: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + y: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + z: { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '{': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '|': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '}': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + '~': { + x_min: number; + x_max: number; + y_min: number; + y_max: number; + ha: number; + leftSideBearing: number; + advanceWidth: number; + }; + }; + fontFamily: string; + resolution: number; + generatedOn: string; +}; diff --git a/build/types/src/fonts/textfonts.d.ts b/build/types/src/fonts/textfonts.d.ts new file mode 100644 index 0000000000..a9a1721cd3 --- /dev/null +++ b/build/types/src/fonts/textfonts.d.ts @@ -0,0 +1 @@ +export declare function loadTextFonts(): void; diff --git a/build/types/src/formatter.d.ts b/build/types/src/formatter.d.ts new file mode 100644 index 0000000000..56511f0a1e --- /dev/null +++ b/build/types/src/formatter.d.ts @@ -0,0 +1,203 @@ +import { BoundingBox } from './boundingbox'; +import { ModifierContext } from './modifiercontext'; +import { RenderContext } from './rendercontext'; +import { Stave } from './stave'; +import { StemmableNote } from './stemmablenote'; +import { TabNote } from './tabnote'; +import { TabStave } from './tabstave'; +import { Tickable } from './tickable'; +import { TickContext } from './tickcontext'; +import { Voice } from './voice'; +export interface FormatterOptions { + /** Defaults to 100. */ + softmaxFactor?: number; + /** Defaults to `false`. */ + globalSoftmax?: boolean; + /** Defaults to 5. */ + maxIterations?: number; +} +export interface FormatParams { + align_rests?: boolean; + stave?: Stave; + context?: RenderContext; + auto_beam?: boolean; +} +export interface AlignmentContexts { + list: number[]; + map: Record; + array: T[]; + resolutionMultiplier: number; +} +/** + * Format implements the formatting and layout algorithms that are used + * to position notes in a voice. The algorithm can align multiple voices both + * within a stave, and across multiple staves. + * + * To do this, the formatter breaks up voices into a grid of rational-valued + * `ticks`, to which each note is assigned. Then, minimum widths are assigned + * to each tick based on the widths of the notes and modifiers in that tick. This + * establishes the smallest amount of space required for each tick. + * + * Finally, the formatter distributes the left over space proportionally to + * all the ticks, setting the `x` values of the notes in each tick. + * + * See `tests/formatter_tests.ts` for usage examples. The helper functions included + * here (`FormatAndDraw`, `FormatAndDrawTab`) also serve as useful usage examples. + */ +export declare class Formatter { + static DEBUG: boolean; + protected hasMinTotalWidth: boolean; + protected minTotalWidth: number; + protected contextGaps: { + total: number; + gaps: { + x1: number; + x2: number; + }[]; + }; + protected justifyWidth: number; + protected totalCost: number; + protected totalShift: number; + protected tickContexts?: AlignmentContexts; + protected formatterOptions: Required; + protected modifierContexts?: AlignmentContexts; + protected voices: Voice[]; + protected lossHistory: number[]; + protected durationStats: Record; + /** + * Helper function to layout "notes" one after the other without + * regard for proportions. Useful for tests and debugging. + */ + static SimpleFormat(notes: Tickable[], x?: number, { paddingBetween }?: { + paddingBetween?: number | undefined; + }): void; + /** Helper function to plot formatter debug info. */ + static plotDebugging(ctx: RenderContext, formatter: Formatter, xPos: number, y1: number, y2: number, options?: { + stavePadding: number; + }): void; + /** + * Helper function to format and draw a single voice. Returns a bounding + * box for the notation. + * @param ctx the rendering context + * @param stave the stave to which to draw (`Stave` or `TabStave`) + * @param notes array of `Note` instances (`Note`, `TextNote`, `TabNote`, etc.) + * @param params one of below: + * * Setting `autobeam` only `(context, stave, notes, true)` or + * `(ctx, stave, notes, {autobeam: true})` + * * Setting `align_rests` a struct is needed `(context, stave, notes, {align_rests: true})` + * * Setting both a struct is needed `(context, stave, notes, { + * autobeam: true, align_rests: true})` + * * `autobeam` automatically generates beams for the notes. + * * `align_rests` aligns rests with nearby notes. + */ + static FormatAndDraw(ctx: RenderContext, stave: Stave, notes: StemmableNote[], params?: FormatParams | boolean): BoundingBox | undefined; + /** + * Helper function to format and draw aligned tab and stave notes in two + * separate staves. + * @param ctx the rendering context + * @param tabstave a `TabStave` instance on which to render `TabNote`s. + * @param stave a `Stave` instance on which to render `Note`s. + * @param notes array of `Note` instances for the stave (`Note`, `BarNote`, etc.) + * @param tabnotes array of `Note` instances for the tab stave (`TabNote`, `BarNote`, etc.) + * @param autobeam automatically generate beams. + * @param params a configuration object: + * * `autobeam` automatically generates beams for the notes. + * * `align_rests` aligns rests with nearby notes. + */ + static FormatAndDrawTab(ctx: RenderContext, tabstave: TabStave, stave: Stave, tabnotes: TabNote[], notes: Tickable[], autobeam: boolean, params: FormatParams): void; + /** + * Automatically set the vertical position of rests based on previous/next note positions. + * @param tickables an array of Tickables. + * @param alignAllNotes If `false`, only align rests that are within a group of beamed notes. + * @param alignTuplets If `false`, ignores tuplets. + */ + static AlignRestsToNotes(tickables: Tickable[], alignAllNotes: boolean, alignTuplets?: boolean): void; + constructor(options?: FormatterOptions); + /** + * Find all the rests in each of the `voices` and align them to neighboring notes. + * + * @param voices + * @param alignAllNotes If `false`, only align rests within beamed groups of notes. If `true`, align all rests. + */ + alignRests(voices: Voice[], alignAllNotes: boolean): void; + /** + * Estimate the width required to render 'voices'. This is done by: + * 1. Sum the widths of all the tick contexts + * 2. Estimate the padding. + * The latter is done by calculating the padding 3 different ways, and taking the + * greatest value: + * 1. the padding required for unaligned notes in different voices + * 2. the padding based on the stddev of the tickable widths + * 3. the padding based on the stddev of the tickable durations. + * + * The last 2 quantities estimate a 'width entropy', where notes might need more + * room than the proportional formatting gives them. A measure of all same duration + * and width will need no extra padding, and all these quantities will be + * zero in that case. + * + * @param voices the voices that contain the notes + * @returns the estimated width in pixels + */ + preCalculateMinTotalWidth(voices: Voice[]): number; + /** + * Get minimum width required to render all voices. Either `format` or + * `preCalculateMinTotalWidth` must be called before this method. + */ + getMinTotalWidth(): number; + /** Calculate the resolution multiplier for `voices`. */ + static getResolutionMultiplier(voices: Voice[]): number; + /** Create a `ModifierContext` for each tick in `voices`. */ + createModifierContexts(voices: Voice[]): AlignmentContexts; + /** + * Create a `TickContext` for each tick in `voices`. Also calculate the + * total number of ticks in voices. + */ + createTickContexts(voices: Voice[]): AlignmentContexts; + /** + * This is the core formatter logic. Format voices and justify them + * to `justifyWidth` pixels. `renderingContext` is required to justify elements + * that can't retreive widths without a canvas. This method sets the `x` positions + * of all the tickables/notes in the formatter. + */ + preFormat(justifyWidth?: number, renderingContext?: RenderContext, voicesParam?: Voice[], stave?: Stave): number; + /** Calculate the total cost of this formatting decision. */ + evaluate(): number; + /** + * Run a single iteration of rejustification. At a high level, this method calculates + * the overall "loss" (or cost) of this layout, and repositions tickcontexts in an + * attempt to reduce the cost. You can call this method multiple times until it finds + * and oscillates around a global minimum. + * @param alpha the "learning rate" for the formatter. It determines how much of a shift + * the formatter should make based on its cost function. + */ + tune(options?: { + alpha?: number; + }): number; + /** + * This is the top-level call for all formatting logic completed + * after `x` *and* `y` values have been computed for the notes + * in the voices. + */ + postFormat(): this; + /** + * Take all `voices` and create `ModifierContext`s out of them. This tells + * the formatters that the voices belong on a single stave. + */ + joinVoices(voices: Voice[]): this; + /** + * Align rests in voices, justify the contexts, and position the notes + * so voices are aligned and ready to render onto the stave. This method + * mutates the `x` positions of all tickables in `voices`. + * + * Voices are full justified to fit in `justifyWidth` pixels. + * + * Set `options.context` to the rendering context. Set `options.align_rests` + * to true to enable rest alignment. + */ + format(voices: Voice[], justifyWidth?: number, options?: FormatParams): this; + formatToStave(voices: Voice[], stave: Stave, optionsParam?: FormatParams): this; + getTickContext(tick: number): TickContext | undefined; +} diff --git a/build/types/src/fraction.d.ts b/build/types/src/fraction.d.ts new file mode 100644 index 0000000000..41aad5c956 --- /dev/null +++ b/build/types/src/fraction.d.ts @@ -0,0 +1,62 @@ +/** Fraction represents a rational number. */ +export declare class Fraction { + static get CATEGORY(): string; + private static __staticFractionA; + private static __staticFractionB; + private static __staticFractionTmp; + /** + * GCD: Greatest common divisor using the Euclidean algorithm. + * Note: GCD(0, 0) => 0 and GCD(0, n) => n. + */ + static GCD(a: number, b: number): number; + /** LCM: Lowest common multiple. */ + static LCM(a: number, b: number): number; + /** Lowest common multiple for more than two numbers. */ + static LCMM(args: number[]): number; + numerator: number; + denominator: number; + /** Set the numerator and denominator. */ + constructor(numerator?: number, denominator?: number); + /** Set the numerator and denominator. */ + set(numerator?: number, denominator?: number): this; + /** Return the value of the fraction. */ + value(): number; + /** Simplify numerator and denominator using GCD. */ + simplify(): this; + /** Add value of another fraction. */ + add(param1?: Fraction | number, param2?: number): this; + /** Substract value of another fraction. */ + subtract(param1?: Fraction | number, param2?: number): this; + /** Multiply by value of another fraction. */ + multiply(param1?: Fraction | number, param2?: number): this; + /** Divide by value of another Fraction. */ + divide(param1?: Fraction | number, param2?: number): this; + /** Simplify both sides and check if they are equal. */ + equals(compare: Fraction | number): boolean; + /** Greater than operator. */ + greaterThan(compare: Fraction | number): boolean; + /** Greater than or equals operator. */ + greaterThanEquals(compare: Fraction | number): boolean; + /** Less than operator. */ + lessThan(compare: Fraction | number): boolean; + /** Less than or equals operator. */ + lessThanEquals(compare: Fraction | number): boolean; + /** Return a new copy with current values. */ + clone(): Fraction; + /** Copy value of another fraction. */ + copy(other: Fraction | number): this; + /** Return the integer component (eg. 5/2 => 2). */ + quotient(): number; + /** Return the remainder component (eg. 5/2 => 1). */ + remainder(): number; + /** Calculate absolute value. */ + makeAbs(): this; + /** Return a raw string representation (eg. "5/2"). */ + toString(): string; + /** Return a simplified string respresentation. */ + toSimplifiedString(): string; + /** Return string representation in mixed form. */ + toMixedString(): string; + /** Parse a fraction string. */ + parse(str: string): this; +} diff --git a/build/types/src/frethandfinger.d.ts b/build/types/src/frethandfinger.d.ts new file mode 100644 index 0000000000..d7946ce0b6 --- /dev/null +++ b/build/types/src/frethandfinger.d.ts @@ -0,0 +1,22 @@ +import { Builder } from './easyscore'; +import { FontInfo } from './font'; +import { Modifier } from './modifier'; +import { ModifierContextState } from './modifiercontext'; +import { StemmableNote } from './stemmablenote'; +export declare class FretHandFinger extends Modifier { + static get CATEGORY(): string; + static TEXT_FONT: Required; + static format(nums: FretHandFinger[], state: ModifierContextState): boolean; + static easyScoreHook({ fingerings }: { + fingerings?: string | undefined; + } | undefined, note: StemmableNote, builder: Builder): void; + protected finger: string; + protected x_offset: number; + protected y_offset: number; + constructor(finger: string); + setFretHandFinger(finger: string): this; + getFretHandFinger(): string; + setOffsetX(x: number): this; + setOffsetY(y: number): this; + draw(): void; +} diff --git a/build/types/src/ghostnote.d.ts b/build/types/src/ghostnote.d.ts new file mode 100644 index 0000000000..ba30a4337b --- /dev/null +++ b/build/types/src/ghostnote.d.ts @@ -0,0 +1,16 @@ +import { ModifierContext } from './modifiercontext'; +import { NoteStruct } from './note'; +import { Stave } from './stave'; +import { StemmableNote } from './stemmablenote'; +export declare class GhostNote extends StemmableNote { + static get CATEGORY(): string; + constructor(parameter: string | NoteStruct); + /** + * @returns true if this note is a type of rest. Rests don't have pitches, but take up space in the score. + */ + isRest(): boolean; + setStave(stave: Stave): this; + addToModifierContext(mc: ModifierContext): this; + preFormat(): this; + draw(): void; +} diff --git a/build/types/src/glyph.d.ts b/build/types/src/glyph.d.ts new file mode 100644 index 0000000000..306fc204cd --- /dev/null +++ b/build/types/src/glyph.d.ts @@ -0,0 +1,135 @@ +import { BoundingBox } from './boundingbox'; +import { Element } from './element'; +import { Font, FontGlyph } from './font'; +import { RenderContext } from './rendercontext'; +import { Stave } from './stave'; +import { Stem } from './stem'; +export interface GlyphProps { + code_head: string; + dot_shiftY: number; + position: string; + rest: boolean; + line_below: number; + line_above: number; + stem_beam_extension: number; + stem: Stem; + code: string; + code_flag_upstem: string; + code_flag_downstem: string; + flag: boolean; + width: number; + text: string; + beam_count: number; + shift_y: number; + getWidth(a?: number): number; + getMetrics(): GlyphMetrics; +} +export interface GlyphOptions { + category?: string; +} +export interface GlyphMetrics { + width: number; + height: number; + x_min: number; + x_max: number; + x_shift: number; + y_shift: number; + scale: number; + ha: number; + outline: number[]; + font: Font; +} +export declare const enum OutlineCode { + MOVE = 0, + LINE = 1, + QUADRATIC = 2, + BEZIER = 3 +} +declare class GlyphCacheEntry { + metrics: GlyphMetrics; + bbox: BoundingBox; + point: number; + constructor(fontStack: Font[], code: string, category?: string); +} +declare class GlyphCache { + protected cache: Map>; + lookup(code: string, category?: string): GlyphCacheEntry; +} +export declare class Glyph extends Element { + static get CATEGORY(): string; + protected static cache: GlyphCache; + static CURRENT_CACHE_KEY: string; + static MUSIC_FONT_STACK: Font[]; + /** + * Pass a key of the form `glyphs.{category}.{code}.{key}` to Font.lookupMetric(). If the initial lookup fails, + * try again with the path `glyphs.{category}.{key}`. If the second lookup fails, return the defaultValue. + * + * @param font + * @param category any metric path under 'glyphs', so 'stem.up' could resolve to glyphs.stem.up.shiftX, glyphs.stem.up.shiftY, etc. + * @param code + * @param key + * @param defaultValue + */ + static lookupFontMetric(font: Font, category: string, code: string, key: string, defaultValue: number): number; + static lookupGlyph(fontStack: Font[], code: string): { + font: Font; + glyph: FontGlyph; + }; + static loadMetrics(fontStack: Font[], code: string, category?: string): GlyphMetrics; + /** + * Renders glyphs from the default font stack. + * + * @param ctx Canvas or SVG context + * @param x_pos x coordinate + * @param y_pos y coordinate + * @param point the point size of the font + * @param code the glyph code in font.getGlyphs() + * @param options + * @returns + */ + static renderGlyph(ctx: RenderContext, x_pos: number, y_pos: number, point: number, code: string, options?: { + category?: string; + scale?: number; + }): GlyphMetrics; + static renderOutline(ctx: RenderContext, outline: number[], scale: number, x_pos: number, y_pos: number): void; + static getOutlineBoundingBox(outline: number[], scale: number, x_pos: number, y_pos: number): BoundingBox; + static getWidth(code: string, point: number, category?: string): number; + bbox: BoundingBox; + code: string; + metrics: GlyphMetrics; + topGlyphs: Glyph[]; + botGlyphs: Glyph[]; + protected options: GlyphOptions; + protected originShift: { + x: number; + y: number; + }; + protected x_shift: number; + protected y_shift: number; + scale: number; + protected point: number; + protected stave?: Stave; + /** + * @param code + * @param point + * @param options + */ + constructor(code: string, point: number, options?: GlyphOptions); + draw(...args: any[]): void; + getCode(): string; + setOptions(options: any): void; + setPoint(point: number): this; + setStave(stave: Stave): this; + setXShift(x_shift: number): this; + setYShift(y_shift: number): this; + reset(): void; + checkMetrics(): GlyphMetrics; + getMetrics(): GlyphMetrics; + setOriginX(x: number): void; + setOriginY(y: number): void; + setOrigin(x: number, y: number): void; + render(ctx: RenderContext, x: number, y: number): void; + checkStave(): Stave; + renderToStave(x: number): void; +} +export {}; diff --git a/build/types/src/glyphnote.d.ts b/build/types/src/glyphnote.d.ts new file mode 100644 index 0000000000..0f0279eaf7 --- /dev/null +++ b/build/types/src/glyphnote.d.ts @@ -0,0 +1,17 @@ +import { BoundingBox } from './boundingbox'; +import { Glyph } from './glyph'; +import { Note, NoteStruct } from './note'; +export interface GlyphNoteOptions { + ignoreTicks?: boolean; + line?: number; +} +export declare class GlyphNote extends Note { + static get CATEGORY(): string; + protected options: Required; + constructor(glyph: Glyph | undefined, noteStruct: NoteStruct, options?: GlyphNoteOptions); + setGlyph(glyph: Glyph): this; + getBoundingBox(): BoundingBox; + preFormat(): this; + drawModifiers(): void; + draw(): void; +} diff --git a/build/types/src/gracenote.d.ts b/build/types/src/gracenote.d.ts new file mode 100644 index 0000000000..55c1f26593 --- /dev/null +++ b/build/types/src/gracenote.d.ts @@ -0,0 +1,19 @@ +import { StaveNote, StaveNoteStruct } from './stavenote'; +export interface GraceNoteStruct extends StaveNoteStruct { + slash?: boolean; +} +export declare class GraceNote extends StaveNote { + static get CATEGORY(): string; + static get LEDGER_LINE_OFFSET(): number; + static get SCALE(): number; + protected slash: boolean; + protected slur: boolean; + constructor(noteStruct: GraceNoteStruct); + getStemExtension(): number; + getStaveNoteScale(): number; + draw(): void; + calcBeamedNotesSlashBBox(slashStemOffset: number, slashBeamOffset: number, protrusions: { + beam: number; + stem: number; + }): Record; +} diff --git a/build/types/src/gracenotegroup.d.ts b/build/types/src/gracenotegroup.d.ts new file mode 100644 index 0000000000..9b807374d1 --- /dev/null +++ b/build/types/src/gracenotegroup.d.ts @@ -0,0 +1,33 @@ +import { Beam } from './beam'; +import { Formatter } from './formatter'; +import { Modifier } from './modifier'; +import { ModifierContextState } from './modifiercontext'; +import { Note } from './note'; +import { StaveTie } from './stavetie'; +import { StemmableNote } from './stemmablenote'; +import { TabTie } from './tabtie'; +import { Voice } from './voice'; +/** GraceNoteGroup is used to format and render grace notes. */ +export declare class GraceNoteGroup extends Modifier { + static DEBUG: boolean; + static get CATEGORY(): string; + protected readonly voice: Voice; + protected readonly grace_notes: StemmableNote[]; + protected readonly show_slur?: boolean; + protected preFormatted: boolean; + protected formatter?: Formatter; + render_options: { + slur_y_shift: number; + }; + protected slur?: StaveTie | TabTie; + protected beams: Beam[]; + /** Arranges groups inside a `ModifierContext`. */ + static format(gracenote_groups: GraceNoteGroup[], state: ModifierContextState): boolean; + constructor(grace_notes: StemmableNote[], show_slur?: boolean); + preFormat(): void; + beamNotes(grace_notes?: StemmableNote[]): this; + setWidth(width: number): this; + getWidth(): number; + getGraceNotes(): Note[]; + draw(): void; +} diff --git a/build/types/src/gracetabnote.d.ts b/build/types/src/gracetabnote.d.ts new file mode 100644 index 0000000000..fe6bcf3819 --- /dev/null +++ b/build/types/src/gracetabnote.d.ts @@ -0,0 +1,5 @@ +import { TabNote, TabNoteStruct } from './tabnote'; +export declare class GraceTabNote extends TabNote { + static get CATEGORY(): string; + constructor(noteStruct: TabNoteStruct); +} diff --git a/build/types/src/index.d.ts b/build/types/src/index.d.ts new file mode 100644 index 0000000000..b73ff3b748 --- /dev/null +++ b/build/types/src/index.d.ts @@ -0,0 +1,91 @@ +import { Vex } from './vex'; +export * from './accidental'; +export * from './annotation'; +export * from './articulation'; +export * from './barnote'; +export * from './beam'; +export * from './bend'; +export * from './boundingbox'; +export * from './boundingboxcomputation'; +export * from './canvascontext'; +export * from './chordsymbol'; +export * from './clef'; +export * from './clefnote'; +export * from './crescendo'; +export * from './curve'; +export * from './dot'; +export * from './easyscore'; +export * from './element'; +export * from './factory'; +export * from './flow'; +export * from './font'; +export * from './formatter'; +export * from './fraction'; +export * from './frethandfinger'; +export * from './ghostnote'; +export * from './glyph'; +export * from './glyphnote'; +export * from './gracenote'; +export * from './gracenotegroup'; +export * from './gracetabnote'; +export * from './keymanager'; +export * from './keysignature'; +export * from './keysignote'; +export * from './modifier'; +export * from './modifiercontext'; +export * from './multimeasurerest'; +export * from './music'; +export * from './note'; +export * from './notehead'; +export * from './notesubgroup'; +export * from './ornament'; +export * from './parenthesis'; +export * from './parser'; +export * from './pedalmarking'; +export * from './registry'; +export * from './rendercontext'; +export * from './renderer'; +export * from './repeatnote'; +export * from './stave'; +export * from './stavebarline'; +export * from './staveconnector'; +export * from './stavehairpin'; +export * from './staveline'; +export * from './stavemodifier'; +export * from './stavenote'; +export * from './staverepetition'; +export * from './stavesection'; +export * from './stavetempo'; +export * from './stavetext'; +export * from './stavetie'; +export * from './stavevolta'; +export * from './stem'; +export * from './stemmablenote'; +export * from './stringnumber'; +export * from './strokes'; +export * from './svgcontext'; +export * from './system'; +export * from './tabnote'; +export * from './tabslide'; +export * from './tabstave'; +export * from './tabtie'; +export * from './textbracket'; +export * from './textdynamics'; +export * from './textformatter'; +export * from './textnote'; +export * from './tickable'; +export * from './tickcontext'; +export * from './timesigglyph'; +export * from './timesignature'; +export * from './timesignote'; +export * from './tremolo'; +export * from './tuning'; +export * from './tuplet'; +export * from './typeguard'; +export * from './util'; +export * from './vibrato'; +export * from './vibratobracket'; +export * from './voice'; +export * from './web'; +export { Vex }; +export default Vex; diff --git a/build/types/src/keymanager.d.ts b/build/types/src/keymanager.d.ts new file mode 100644 index 0000000000..dfa97e269f --- /dev/null +++ b/build/types/src/keymanager.d.ts @@ -0,0 +1,25 @@ +import { KeyParts, Music } from './music'; +export declare class KeyManager { + protected music: Music; + protected keyParts: KeyParts; + protected keyString: string; + protected key: string; + protected scale: number[]; + protected scaleMap: Record; + protected scaleMapByValue: Record; + protected originalScaleMapByValue: Record; + constructor(key: string); + setKey(key: string): this; + getKey(): string; + reset(): this; + getAccidental(key: string): { + note: string; + accidental?: string; + change?: boolean; + }; + selectNote(note: string): { + note: string; + accidental?: string; + change: boolean; + }; +} diff --git a/build/types/src/keysignature.d.ts b/build/types/src/keysignature.d.ts new file mode 100644 index 0000000000..e6c7f34eeb --- /dev/null +++ b/build/types/src/keysignature.d.ts @@ -0,0 +1,50 @@ +import { Glyph } from './glyph'; +import { Stave } from './stave'; +import { StaveModifier } from './stavemodifier'; +export declare class KeySignature extends StaveModifier { + static get CATEGORY(): string; + protected glyphFontScale: number; + protected glyphs: Glyph[]; + protected xPositions: number[]; + protected paddingForced: boolean; + protected formatted?: boolean; + protected cancelKeySpec?: string; + protected accList: { + type: string; + line: number; + }[]; + protected keySpec?: string; + protected alterKeySpec?: string[]; + static accidentalSpacing: Record; + constructor(keySpec: string, cancelKeySpec?: string, alterKeySpec?: string[]); + convertToGlyph(acc: { + type: string; + line: number; + }, nextAcc: { + type: string; + line: number; + }): void; + cancelKey(spec: string): this; + convertToCancelAccList(spec: string): { + type: string; + accList: { + type: string; + line: number; + }[]; + } | undefined; + addToStave(stave: Stave): this; + convertAccLines(clef: string, type?: string, accList?: { + type: string; + line: number; + }[]): void; + getPadding(index: number): number; + getWidth(): number; + setKeySig(keySpec: string, cancelKeySpec?: string, alterKeySpec?: string[]): this; + alterKey(alterKeySpec: string[]): this; + convertToAlterAccList(alterKeySpec: string[]): void; + format(): void; + draw(): void; +} diff --git a/build/types/src/keysignote.d.ts b/build/types/src/keysignote.d.ts new file mode 100644 index 0000000000..56032e4c37 --- /dev/null +++ b/build/types/src/keysignote.d.ts @@ -0,0 +1,11 @@ +import { KeySignature } from './keysignature'; +import { ModifierContext } from './modifiercontext'; +import { Note } from './note'; +export declare class KeySigNote extends Note { + static get CATEGORY(): string; + protected keySignature: KeySignature; + constructor(keySpec: string, cancelKeySpec?: string, alterKeySpec?: string[]); + addToModifierContext(mc: ModifierContext): this; + preFormat(): this; + draw(): void; +} diff --git a/build/types/src/modifier.d.ts b/build/types/src/modifier.d.ts new file mode 100644 index 0000000000..73758e277a --- /dev/null +++ b/build/types/src/modifier.d.ts @@ -0,0 +1,97 @@ +import { Element } from './element'; +import { ModifierContext } from './modifiercontext'; +import { Note } from './note'; +export declare enum ModifierPosition { + CENTER = 0, + LEFT = 1, + RIGHT = 2, + ABOVE = 3, + BELOW = 4 +} +/** + * `Modifier` is an abstract interface for notational elements that modify + * a `Note`. Examples of modifiers are `Accidental`, `Annotation`, `Stroke`, etc. + * + * For a `Modifier` instance to be positioned correctly, it must be part of + * a `ModifierContext`. All modifiers in the same context are rendered relative to + * one another. + * + * Typically, all modifiers to a note are part of the same `ModifierContext` instance. Also, + * in multi-voice staves, all modifiers to notes on the same `tick` are part of the same + * `ModifierContext`. This ensures that multiple voices don't trample all over each other. + */ +export declare class Modifier extends Element { + /** + * Modifiers category string. Every modifier has a different category. + * The `ModifierContext` uses this to determine the type and order of the modifiers. + */ + static get CATEGORY(): string; + /** Modifiers can be positioned almost anywhere, relative to a note. */ + static get Position(): typeof ModifierPosition; + static get PositionString(): Record; + protected note?: Note; + protected index?: number; + protected width: number; + protected text_line: number; + protected position: ModifierPosition; + protected y_shift: number; + protected x_shift: number; + private spacingFromNextModifier; + private modifierContext?; + constructor(); + /** Called when position changes. */ + protected reset(): void; + /** Get modifier widths. */ + getWidth(): number; + /** Set modifier widths. */ + setWidth(width: number): this; + /** Get attached note (`StaveNote`, `TabNote`, etc.) */ + getNote(): Note; + /** + * Used in draw() to check and get the attached note (`StaveNote`, `TabNote`, etc.). + * Also verifies that the index is valid. + */ + checkAttachedNote(): Note; + /** + * Set attached note. + * @param note (`StaveNote`, `TabNote`, etc.) + */ + setNote(note: Note): this; + /** Get note index, which is a specific note in a chord. */ + getIndex(): number | undefined; + /** Check and get note index, which is a specific note in a chord. */ + checkIndex(): number; + /** Set note index, which is a specific note in a chord. */ + setIndex(index: number): this; + /** Get `ModifierContext`. */ + getModifierContext(): ModifierContext | undefined; + /** Check and get `ModifierContext`. */ + checkModifierContext(): ModifierContext; + /** Every modifier must be part of a `ModifierContext`. */ + setModifierContext(c: ModifierContext): this; + /** Get position. */ + getPosition(): number; + /** + * Set position. + * @param position CENTER | LEFT | RIGHT | ABOVE | BELOW + */ + setPosition(position: string | number): this; + /** Set the `text_line` for the modifier. */ + setTextLine(line: number): this; + /** Shift modifier down `y` pixels. Negative values shift up. */ + setYShift(y: number): this; + /** Set spacing from next modifier. */ + setSpacingFromNextModifier(x: number): void; + /** Get spacing from next modifier. */ + getSpacingFromNextModifier(): number; + /** + * Shift modifier `x` pixels in the direction of the modifier. Negative values + * shift reverse. + */ + setXShift(x: number): this; + /** Get shift modifier `x` */ + getXShift(): number; + /** Render the modifier onto the canvas. */ + draw(): void; + alignSubNotesWithNote(subNotes: Note[], note: Note): void; +} diff --git a/build/types/src/modifiercontext.d.ts b/build/types/src/modifiercontext.d.ts new file mode 100644 index 0000000000..a84ce5d838 --- /dev/null +++ b/build/types/src/modifiercontext.d.ts @@ -0,0 +1,45 @@ +import { Modifier } from './modifier'; +import { StaveNote } from './stavenote'; +import { TabNote } from './tabnote'; +import { Tickable } from './tickable'; +export interface ModifierContextState { + right_shift: number; + left_shift: number; + text_line: number; + top_text_line: number; +} +export interface ModifierContextMetrics { + width: number; + spacing: number; +} +export declare type ModifierContextMember = Tickable | Modifier | StaveNote | TabNote; +export declare class ModifierContext { + static DEBUG: boolean; + protected state: ModifierContextState; + protected members: Record; + protected preFormatted: boolean; + protected postFormatted: boolean; + protected formatted: boolean; + protected width: number; + protected spacing: number; + addModifier(member: ModifierContextMember): this; + /** + * this.members maps CATEGORY strings to arrays of Tickable | Modifier | StaveNote | TabNote. + * Here we add a new member to this.members, and create a new array if needed. + * @param member + * @returns this + */ + addMember(member: ModifierContextMember): this; + /** + * @deprecated + */ + getModifiers(category: string): ModifierContextMember[]; + getMembers(category: string): ModifierContextMember[]; + getWidth(): number; + getLeftShift(): number; + getRightShift(): number; + getState(): ModifierContextState; + getMetrics(): ModifierContextMetrics; + preFormat(): void; + postFormat(): void; +} diff --git a/build/types/src/multimeasurerest.d.ts b/build/types/src/multimeasurerest.d.ts new file mode 100644 index 0000000000..f63dee846d --- /dev/null +++ b/build/types/src/multimeasurerest.d.ts @@ -0,0 +1,61 @@ +import { Element } from './element'; +import { RenderContext } from './rendercontext'; +import { Stave } from './stave'; +export interface MultimeasureRestRenderOptions { + /** Extracted by Factory.MultiMeasureRest() and passed to the MultiMeasureRest constructor. */ + number_of_measures: number; + /** Use rest symbols. Defaults to `false`, which renders a thick horizontal line with serifs at both ends. */ + use_symbols?: boolean; + /** Horizontal spacing between rest symbol glyphs (if `use_symbols` is `true`).*/ + symbol_spacing?: number; + /** Show the number of measures at the top. Defaults to `true`. */ + show_number?: boolean; + /** Vertical position of the "number of measures" text (measured in stave lines). Defaults to -0.5, which is above the stave. 6.5 is below the stave. */ + number_line?: number; + /** Font size of the "number of measures" text. */ + number_glyph_point?: number; + /** Left padding from `stave.getX()`. */ + padding_left?: number; + /** Right padding from `stave.getX() + stave.getWidth()` */ + padding_right?: number; + /** Vertical position of the rest line or symbols, expressed as stave lines. Default: 2. The top stave line is 1, and the bottom stave line is 5. */ + line?: number; + /** Defaults to the number of vertical pixels between stave lines. Used for serif height or 2-bar / 4-bar symbol height. */ + spacing_between_lines_px?: number; + /** Size of the semibreve (1-bar) rest symbol. Other symbols are scaled accordingly. */ + semibreve_rest_glyph_scale?: number; + /** Thickness of the rest line. Used when `use_symbols` is false. Defaults to half the space between stave lines. */ + line_thickness?: number; + /** Thickness of the rest line's serif. Used when `use_symbols` is false. */ + serif_thickness?: number; +} +export declare class MultiMeasureRest extends Element { + static get CATEGORY(): string; + render_options: Required; + protected xs: { + left: number; + right: number; + }; + protected number_of_measures: number; + protected stave?: Stave; + private hasPaddingLeft; + private hasPaddingRight; + private hasLineThickness; + private hasSymbolSpacing; + /** + * + * @param number_of_measures Number of measures. + * @param options The options object. + */ + constructor(number_of_measures: number, options: MultimeasureRestRenderOptions); + getXs(): { + left: number; + right: number; + }; + setStave(stave: Stave): this; + getStave(): Stave | undefined; + checkStave(): Stave; + drawLine(stave: Stave, ctx: RenderContext, left: number, right: number, spacingBetweenLines: number): void; + drawSymbols(stave: Stave, ctx: RenderContext, left: number, right: number, spacingBetweenLines: number): void; + draw(): void; +} diff --git a/build/types/src/music.d.ts b/build/types/src/music.d.ts new file mode 100644 index 0000000000..aa3e40e206 --- /dev/null +++ b/build/types/src/music.d.ts @@ -0,0 +1,91 @@ +export interface NoteAccidental { + note: number; + accidental: AccidentalValue; +} +export interface NoteParts { + root: string; + accidental: string; +} +export interface KeyParts { + root: string; + accidental: string; + type: string; +} +export declare type KeyValue = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11; +export declare type RootValue = 0 | 1 | 2 | 3 | 4 | 5 | 6; +export declare type AccidentalValue = -2 | -1 | 0 | 1 | 2; +export interface Key { + root_index: RootValue; + int_val: KeyValue; +} +/** Music implements some standard music theory routines. */ +export declare class Music { + /** Number of an canonical notes (12). */ + static get NUM_TONES(): number; + /** Names of root notes ('c', 'd',...) */ + static get roots(): string[]; + /** Values of the root notes.*/ + static get root_values(): KeyValue[]; + /** Indices of the root notes.*/ + static get root_indices(): Record; + /** Names of canonical notes ('c', 'c#', 'd',...). */ + static get canonical_notes(): string[]; + /** Names of diatonic intervals ('unison', 'm2', 'M2',...). */ + static get diatonic_intervals(): string[]; + /** NoteAccidental associated to diatonic intervals. */ + static get diatonic_accidentals(): Record; + /** Semitones shift associated to intervals .*/ + static get intervals(): Record; + /** Semitones shifts associated with scales. */ + static get scales(): Record; + /** Scales associated with m (minor) and M (major). */ + static get scaleTypes(): Record; + /** Accidentals abbreviations. */ + static get accidentals(): string[]; + /** Note values. */ + static get noteValues(): Record; + protected isValidNoteValue(note: number): boolean; + protected isValidIntervalValue(interval: number): boolean; + /** Return root and accidental associated to a note. */ + getNoteParts(noteString: string): NoteParts; + /** Return root, accidental and type associated to a key. */ + getKeyParts(keyString: string): KeyParts; + /** Note value associated to a note name. */ + getNoteValue(noteString: string): number; + /** Interval value associated to an interval name. */ + getIntervalValue(intervalString: string): number; + /** Canonical note name associated to a value. */ + getCanonicalNoteName(noteValue: number): string; + /** Interval name associated to a value. */ + getCanonicalIntervalName(intervalValue: number): string; + /** + * Given a note, interval, and interval direction, produce the relative note. + */ + getRelativeNoteValue(noteValue: number, intervalValue: number, direction?: number): number; + /** + * Given a root and note value, produce the relative note name. + */ + getRelativeNoteName(root: string, noteValue: number): string; + /** + * Return scale tones, given intervals. Each successive interval is + * relative to the previous one, e.g., Major Scale: + * + * TTSTTTS = [2,2,1,2,2,2,1] + * + * When used with key = 0, returns C scale (which is isomorphic to + * interval list). + */ + getScaleTones(key: number, intervals: number[]): number[]; + /** + * Return the interval of a note, given a diatonic scale. + * e.g., given the scale C, and the note E, returns M3. + */ + getIntervalBetween(note1: number, note2: number, direction?: number): number; + /** + * Create a scale map that represents the pitch state for a + * `keySignature`. For example, passing a `G` to `keySignature` would + * return a scale map with every note naturalized except for `F` which + * has an `F#` state. + */ + createScaleMap(keySignature: string): Record; +} diff --git a/build/types/src/note.d.ts b/build/types/src/note.d.ts new file mode 100644 index 0000000000..7c86604143 --- /dev/null +++ b/build/types/src/note.d.ts @@ -0,0 +1,230 @@ +import { Beam } from './beam'; +import { Fraction } from './fraction'; +import { GlyphProps } from './glyph'; +import { Modifier } from './modifier'; +import { RenderContext } from './rendercontext'; +import { Stave } from './stave'; +import { Stroke } from './strokes'; +import { Tickable } from './tickable'; +import { TickContext } from './tickcontext'; +import { Voice } from './voice'; +export interface KeyProps { + stem_down_x_offset: number; + stem_up_x_offset: number; + key: string; + octave: number; + line: number; + int_value: number; + accidental: string; + code: string; + stroke: number; + shift_right: number; + displaced: boolean; +} +export interface NoteMetrics { + /** The total width of the note (including modifiers). */ + width: number; + glyphWidth?: number; + /** The width of the note head only. */ + notePx: number; + /** Start `X` for left modifiers. */ + modLeftPx: number; + /** Start `X` for right modifiers. */ + modRightPx: number; + /** Extra space on left of note. */ + leftDisplacedHeadPx: number; + glyphPx: number; + /** Extra space on right of note. */ + rightDisplacedHeadPx: number; +} +export interface NoteDuration { + duration: string; + dots: number; + type: string; +} +export interface ParsedNote { + duration: string; + type: string; + customTypes: string[]; + dots: number; + ticks: number; +} +export interface NoteStruct { + /** Array of pitches, e.g: `['c/4', 'e/4', 'g/4']` */ + keys?: string[]; + /** The time length (e.g., `q` for quarter, `h` for half, `8` for eighth etc.). */ + duration?: string; + line?: number; + /** The number of dots, which affects the duration. */ + dots?: number; + /** The note type (e.g., `r` for rest, `s` for slash notes, etc.). */ + type?: string; + align_center?: boolean; + duration_override?: Fraction; +} +/** + * Note implements an abstract interface for notes and chords that + * are rendered on a stave. Notes have some common properties: All of them + * have a value (e.g., pitch, fret, etc.) and a duration (quarter, half, etc.) + * + * Some notes have stems, heads, dots, etc. Most notational elements that + * surround a note are called *modifiers*, and every note has an associated + * array of them. All notes also have a rendering context and belong to a stave. + */ +export declare abstract class Note extends Tickable { + static get CATEGORY(): string; + /** Debug helper. Displays various note metrics for the given note. */ + static plotMetrics(ctx: RenderContext, note: Tickable, yPos: number): void; + protected static parseDuration(durationString?: string): NoteDuration | undefined; + protected static parseNoteStruct(noteStruct: NoteStruct): ParsedNote | undefined; + glyph?: any; + keys: string[]; + keyProps: KeyProps[]; + protected stave?: Stave; + render_options: { + draw_stem_through_stave?: boolean; + draw_dots?: boolean; + draw_stem?: boolean; + y_shift: number; + extend_left?: number; + extend_right?: number; + glyph_font_scale: number; + annotation_spacing: number; + glyph_font_size?: number; + scale: number; + font: string; + stroke_px: number; + }; + protected duration: string; + protected leftDisplacedHeadPx: number; + protected rightDisplacedHeadPx: number; + protected noteType: string; + protected customGlyphs: GlyphProps[]; + protected ys: number[]; + protected customTypes: string[]; + protected playNote?: Note; + protected beam?: Beam; + /** + * Every note is a tickable, i.e., it can be mutated by the `Formatter` class for + * positioning and layout. + * + * @param noteStruct To create a new note you need to provide a `noteStruct`. + */ + constructor(noteStruct: NoteStruct); + /** + * Get the play note, which is arbitrary data that can be used by an + * audio player. + */ + getPlayNote(): Note | undefined; + /** + * Set the play note, which is arbitrary data that can be used by an + * audio player. + */ + setPlayNote(note: Note): this; + /** + * @returns true if this note is a type of rest. + * + * Rests don't have pitches, but take up space in the score. + * Subclasses should override this default implementation. + */ + isRest(): boolean; + /** Add stroke. */ + addStroke(index: number, stroke: Stroke): this; + /** Get the target stave. */ + getStave(): Stave | undefined; + /** Check and get the target stave. */ + checkStave(): Stave; + /** Set the target stave. */ + setStave(stave: Stave): this; + /** Get spacing to the left of the notes. */ + getLeftDisplacedHeadPx(): number; + /** Get spacing to the right of the notes. */ + getRightDisplacedHeadPx(): number; + /** Set spacing to the left of the notes. */ + setLeftDisplacedHeadPx(x: number): this; + /** Set spacing to the right of the notes. */ + setRightDisplacedHeadPx(x: number): this; + /** True if this note has no duration (e.g., bar notes, spacers, etc.). */ + shouldIgnoreTicks(): boolean; + /** Get the stave line number for the note. */ + getLineNumber(isTopNote?: boolean): number; + /** Get the stave line number for rest. */ + getLineForRest(): number; + /** Get the glyph associated with this note. */ + getGlyph(): any; + /** Get the glyph width. */ + getGlyphWidth(): number; + /** + * Set Y positions for this note. Each Y value is associated with + * an individual pitch/key within the note/chord. + */ + setYs(ys: number[]): this; + /** + * Get Y positions for this note. Each Y value is associated with + * an individual pitch/key within the note/chord. + */ + getYs(): number[]; + /** + * Get the Y position of the space above the stave onto which text can + * be rendered. + */ + getYForTopText(text_line: number): number; + /** Return the voice that this note belongs in. */ + getVoice(): Voice; + /** Attach this note to `voice`. */ + setVoice(voice: Voice): this; + /** Get the `TickContext` for this note. */ + getTickContext(): TickContext; + /** Set the `TickContext` for this note. */ + setTickContext(tc: TickContext): this; + /** Accessor to duration. */ + getDuration(): string; + /** Accessor to isDotted. */ + isDotted(): boolean; + /** Accessor to hasStem. */ + hasStem(): boolean; + /** Accessor to note type. */ + getNoteType(): string; + /** Get the beam. */ + getBeam(): Beam | undefined; + /** Check and get the beam. */ + checkBeam(): Beam; + /** Check it has a beam. */ + hasBeam(): boolean; + /** Set the beam. */ + setBeam(beam: Beam): this; + /** + * Attach a modifier to this note. + * @param modifier the Modifier to add. + * @param index of the key to modify. + * @returns this + */ + addModifier(modifier: Modifier, index?: number): this; + getModifiersByType(type: string): Modifier[]; + /** Get the coordinates for where modifiers begin. */ + getModifierStartXY(position?: number, index?: number, options?: any): { + x: number; + y: number; + }; + getRightParenthesisPx(index: number): number; + getLeftParenthesisPx(index: number): number; + getFirstDotPx(): number; + /** Get the metrics for this note. */ + getMetrics(): NoteMetrics; + /** + * Get the absolute `X` position of this note's tick context. This + * excludes x_shift, so you'll need to factor it in if you're + * looking for the post-formatted x-position. + */ + getAbsoluteX(): number; + /** Get the direction of the stem. */ + getStemDirection(): number; + /** Get the top and bottom `y` values of the stem. */ + getStemExtents(): Record; + /** Get the `x` coordinate to the right of the note. */ + getTieRightX(): number; + /** Get the `x` coordinate to the left of the note. */ + getTieLeftX(): number; + getKeys(): string[]; + getKeyProps(): KeyProps[]; +} diff --git a/build/types/src/notehead.d.ts b/build/types/src/notehead.d.ts new file mode 100644 index 0000000000..5b368e5f51 --- /dev/null +++ b/build/types/src/notehead.d.ts @@ -0,0 +1,70 @@ +import { BoundingBox } from './boundingbox'; +import { ElementStyle } from './element'; +import { GlyphProps } from './glyph'; +import { Note, NoteStruct } from './note'; +import { Stave } from './stave'; +export interface NoteHeadStruct extends NoteStruct { + line?: number; + glyph_font_scale?: number; + slashed?: boolean; + style?: ElementStyle; + stem_down_x_offset?: number; + stem_up_x_offset?: number; + custom_glyph_code?: string; + x_shift?: number; + stem_direction?: number; + displaced?: boolean; + note_type?: string; + x?: number; + y?: number; + index?: number; +} +/** + * `NoteHeads` are typically not manipulated + * directly, but used internally in `StaveNote`. + * + * See `tests/notehead_tests.ts` for usage examples. + */ +export declare class NoteHead extends Note { + /** To enable logging for this class. Set `Vex.Flow.NoteHead.DEBUG` to `true`. */ + static DEBUG: boolean; + static get CATEGORY(): string; + glyph_code: string; + protected custom_glyph: boolean; + protected stem_up_x_offset: number; + protected stem_down_x_offset: number; + protected displaced: boolean; + protected stem_direction: number; + protected x: number; + protected y: number; + protected line: number; + protected index?: number; + protected slashed: boolean; + constructor(noteStruct: NoteHeadStruct); + /** Get the width of the notehead. */ + getWidth(): number; + /** Determine if the notehead is displaced. */ + isDisplaced(): boolean; + /** Get the glyph data. */ + getGlyph(): GlyphProps; + /** Set the X coordinate. */ + setX(x: number): this; + /** Get the Y coordinate. */ + getY(): number; + /** Set the Y coordinate. */ + setY(y: number): this; + /** Get the stave line the notehead is placed on. */ + getLine(): number; + /** Set the stave line the notehead is placed on. */ + setLine(line: number): this; + /** Get the canvas `x` coordinate position of the notehead. */ + getAbsoluteX(): number; + /** Get the `BoundingBox` for the `NoteHead`. */ + getBoundingBox(): BoundingBox; + /** Set notehead to a provided `stave`. */ + setStave(stave: Stave): this; + /** Pre-render formatting. */ + preFormat(): this; + /** Draw the notehead. */ + draw(): void; +} diff --git a/build/types/src/notesubgroup.d.ts b/build/types/src/notesubgroup.d.ts new file mode 100644 index 0000000000..4bc695ed2f --- /dev/null +++ b/build/types/src/notesubgroup.d.ts @@ -0,0 +1,18 @@ +import { Formatter } from './formatter'; +import { Modifier } from './modifier'; +import { ModifierContextState } from './modifiercontext'; +import { Note } from './note'; +import { Voice } from './voice'; +export declare class NoteSubGroup extends Modifier { + static get CATEGORY(): string; + static format(groups: NoteSubGroup[], state: ModifierContextState): boolean; + protected subNotes: Note[]; + protected preFormatted: boolean; + protected formatter: Formatter; + protected voice: Voice; + constructor(subNotes: Note[]); + preFormat(): void; + setWidth(width: number): this; + getWidth(): number; + draw(): void; +} diff --git a/build/types/src/ornament.d.ts b/build/types/src/ornament.d.ts new file mode 100644 index 0000000000..52680f952d --- /dev/null +++ b/build/types/src/ornament.d.ts @@ -0,0 +1,76 @@ +import { Glyph } from './glyph'; +import { Modifier } from './modifier'; +import { ModifierContextState } from './modifiercontext'; +/** + * Ornament implements ornaments as modifiers that can be + * attached to notes. The complete list of ornaments is available in + * `tables.ts` under `Vex.Flow.ornamentCodes`. + * + * See `tests/ornament_tests.ts` for usage examples. + */ +export declare class Ornament extends Modifier { + /** To enable logging for this class. Set `Vex.Flow.Ornament.DEBUG` to `true`. */ + static DEBUG: boolean; + /** Ornaments category string. */ + static get CATEGORY(): string; + protected ornament: { + code: string; + }; + protected stemUpYOffset: number; + protected ornamentAlignWithNoteHead: string[] | boolean; + protected type: string; + protected delayed: boolean; + protected reportedWidth: number; + protected adjustForStemDirection: boolean; + render_options: { + accidentalUpperPadding: number; + accidentalLowerPadding: number; + font_scale: number; + }; + protected glyph: Glyph; + protected accidentalUpper?: Glyph; + protected accidentalLower?: Glyph; + protected delayXShift?: number; + /** Arrange ornaments inside `ModifierContext` */ + static format(ornaments: Ornament[], state: ModifierContextState): boolean; + /** + * ornamentNoteTransition means the jazz ornament represents an effect from one note to another, + * these are generally on the top of the staff. + */ + static get ornamentNoteTransition(): string[]; + /** + * ornamentAttack indicates something that happens in the attach, placed before the note and + * any accidentals + */ + static get ornamentAttack(): string[]; + /** + * The ornament is aligned based on the note head, but without regard to whether the + * stem goes up or down. + */ + static get ornamentAlignWithNoteHead(): string[]; + /** + * An ornament that happens on the release of the note, generally placed after the + * note and overlapping the next beat/measure.. + */ + static get ornamentRelease(): string[]; + /** ornamentArticulation goes above/below the note based on space availablity */ + static get ornamentArticulation(): string[]; + /** + * Legacy ornaments have hard-coded metrics. If additional ornament types are + * added, get their metrics here. + */ + getMetrics(): any; + /** + * Create a new ornament of type `type`, which is an entry in + * `Vex.Flow.ornamentCodes` in `tables.ts`. + */ + constructor(type: string); + /** Set whether the ornament is to be delayed. */ + setDelayed(delayed: boolean): this; + /** Set the upper accidental for the ornament. */ + setUpperAccidental(accid: string): this; + /** Set the lower accidental for the ornament. */ + setLowerAccidental(accid: string): this; + /** Render ornament in position next to note. */ + draw(): void; +} diff --git a/build/types/src/parenthesis.d.ts b/build/types/src/parenthesis.d.ts new file mode 100644 index 0000000000..5189a3edda --- /dev/null +++ b/build/types/src/parenthesis.d.ts @@ -0,0 +1,22 @@ +import { Modifier, ModifierPosition } from './modifier'; +import { ModifierContextState } from './modifiercontext'; +import { Note } from './note'; +/** Parenthesis implements parenthesis modifiers for notes. */ +export declare class Parenthesis extends Modifier { + static get CATEGORY(): string; + protected point: number; + /** Add parentheses to the notes. */ + static buildAndAttach(notes: Note[]): void; + /** Arrange parentheses inside a ModifierContext. */ + static format(parentheses: Parenthesis[], state: ModifierContextState): boolean; + /** + * Constructor + * + * @param position Modifier.Position.LEFT (default) or Modifier.Position.RIGHT + */ + constructor(position: ModifierPosition); + /** Set the associated note. */ + setNote(note: Note): this; + /** Render the parenthesis. */ + draw(): void; +} diff --git a/build/types/src/parser.d.ts b/build/types/src/parser.d.ts new file mode 100644 index 0000000000..443779d26a --- /dev/null +++ b/build/types/src/parser.d.ts @@ -0,0 +1,45 @@ +export declare type Match = string | Match[] | null; +export declare type RuleFunction = () => Rule; +export declare type TriggerFunction = (state?: { + matches: Match[]; +}) => void; +export interface Rule { + token?: string; + noSpace?: boolean; + expect?: RuleFunction[]; + zeroOrMore?: boolean; + oneOrMore?: boolean; + maybe?: boolean; + or?: boolean; + run?: TriggerFunction; +} +export interface Result { + success: boolean; + pos?: number; + incrementPos?: number; + matchedString?: string; + matches?: Match[]; + numMatches?: number; + results?: GroupedResults; + errorPos?: number; +} +export declare type GroupedResults = (Result | Result[])[]; +export interface Grammar { + begin(): RuleFunction; +} +export declare class Parser { + static DEBUG: boolean; + protected grammar: Grammar; + protected line: string; + protected pos: number; + protected errorPos: number; + constructor(grammar: Grammar); + parse(line: string): Result; + matchFail(returnPos: number): void; + matchSuccess(): void; + matchToken(token: string, noSpace?: boolean): Result; + expectOne(rule: Rule, maybe?: boolean): Result; + expectOneOrMore(rule: Rule, maybe?: boolean): Result; + expectZeroOrMore(rule: Rule): Result; + expect(ruleFunc: RuleFunction): Result; +} diff --git a/build/types/src/pedalmarking.d.ts b/build/types/src/pedalmarking.d.ts new file mode 100644 index 0000000000..0cc5adb864 --- /dev/null +++ b/build/types/src/pedalmarking.d.ts @@ -0,0 +1,69 @@ +import { Element } from './element'; +import { FontInfo } from './font'; +import { StaveNote } from './stavenote'; +/** + * PedalMarking implements different types of pedal markings. These notation + * elements indicate to the performer when to depress and release the a pedal. + * + * In order to create "Sostenuto", and "una corda" markings, you must set + * custom text for the release/depress pedal markings. + */ +export declare class PedalMarking extends Element { + /** To enable logging for this class. Set `Vex.Flow.PedalMarking.DEBUG` to `true`. */ + static DEBUG: boolean; + static get CATEGORY(): string; + static TEXT_FONT: Required; + protected line: number; + protected type: number; + protected custom_depress_text: string; + protected custom_release_text: string; + render_options: { + color: string; + bracket_height: number; + text_margin_right: number; + bracket_line_width: number; + }; + protected notes: StaveNote[]; + /** Glyph data */ + static readonly GLYPHS: Record; + /** Pedal type as number. */ + static readonly type: { + TEXT: number; + BRACKET: number; + MIXED: number; + }; + /** Pedal type as string. */ + static readonly typeString: Record; + /** + * Create a sustain pedal marking. Returns the defaults PedalMarking. + * Which uses the traditional "Ped" and "*"" markings. + */ + static createSustain(notes: StaveNote[]): PedalMarking; + /** Create a sostenuto pedal marking */ + static createSostenuto(notes: StaveNote[]): PedalMarking; + /** Create an una corda pedal marking */ + static createUnaCorda(notes: StaveNote[]): PedalMarking; + constructor(notes: StaveNote[]); + /** Set pedal type. */ + setType(type: string | number): this; + /** + * Set custom text for the `depress`/`release` pedal markings. No text is + * set if the parameter is falsy. + */ + setCustomText(depress: string, release?: string): this; + /** Set the staff line to render the markings on. */ + setLine(line: number): this; + /** Draw the bracket based pedal markings. */ + drawBracketed(): void; + /** + * Draw the text based pedal markings. This defaults to the traditional + * "Ped" and "*"" symbols if no custom text has been provided. + */ + drawText(): void; + /** Render the pedal marking in position on the rendering context. */ + draw(): void; +} diff --git a/build/types/src/publicpath.d.ts b/build/types/src/publicpath.d.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/build/types/src/registry.d.ts b/build/types/src/registry.d.ts new file mode 100644 index 0000000000..6959b79f28 --- /dev/null +++ b/build/types/src/registry.d.ts @@ -0,0 +1,40 @@ +import { Element } from './element'; +declare class Index { + [key: string]: { + [key: string]: { + [key: string]: Element; + }; + }; + constructor(); +} +export interface RegistryUpdate { + id: string; + name: string; + value: string | undefined; + oldValue: string | undefined; +} +export declare class Registry { + private static defaultRegistry?; + static getDefaultRegistry(): Registry | undefined; + static enableDefaultRegistry(registry: Registry): void; + static disableDefaultRegistry(): void; + protected index: Index; + constructor(); + clear(): this; + setIndexValue(name: string, value: string, id: string, elem: Element): void; + updateIndex({ id, name, value, oldValue }: RegistryUpdate): void; + /** + * Register element `elem` with this registry. + * This adds the element to its index and watches it for attribute changes. + * @param elem + * @param id + * @returns this + */ + register(elem: Element, id?: string): this; + getElementById(id: string): Element | undefined; + getElementsByAttribute(attribute: string, value: string): Element[]; + getElementsByType(type: string): Element[]; + getElementsByClass(className: string): Element[]; + onUpdate(info: RegistryUpdate): this; +} +export {}; diff --git a/build/types/src/rendercontext.d.ts b/build/types/src/rendercontext.d.ts new file mode 100644 index 0000000000..e4bb0882ae --- /dev/null +++ b/build/types/src/rendercontext.d.ts @@ -0,0 +1,64 @@ +import { FontInfo } from './font'; +export interface TextMeasure { + x: number; + y: number; + width: number; + height: number; +} +export interface GroupAttributes { + pointerBBox: boolean; +} +export declare abstract class RenderContext { + static get CATEGORY(): string; + abstract clear(): void; + abstract setFillStyle(style: string): this; + abstract setBackgroundFillStyle(style: string): this; + abstract setStrokeStyle(style: string): this; + abstract setShadowColor(color: string): this; + abstract setShadowBlur(blur: number): this; + abstract setLineWidth(width: number): this; + abstract setLineCap(capType: CanvasLineCap): this; + abstract setLineDash(dashPattern: number[]): this; + abstract scale(x: number, y: number): this; + abstract rect(x: number, y: number, width: number, height: number): this; + abstract resize(width: number, height: number): this; + abstract fillRect(x: number, y: number, width: number, height: number): this; + abstract clearRect(x: number, y: number, width: number, height: number): this; + abstract beginPath(): this; + abstract moveTo(x: number, y: number): this; + abstract lineTo(x: number, y: number): this; + abstract bezierCurveTo(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): this; + abstract quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): this; + abstract arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, counterclockwise: boolean): this; + abstract fill(attributes?: any): this; + abstract stroke(): this; + abstract closePath(): this; + abstract fillText(text: string, x: number, y: number): this; + abstract save(): this; + abstract restore(): this; + abstract openGroup(cls?: string, id?: string, attrs?: GroupAttributes): any; + abstract closeGroup(): void; + abstract add(child: any): void; + abstract measureText(text: string): TextMeasure; + abstract set fillStyle(style: string | CanvasGradient | CanvasPattern); + abstract get fillStyle(): string | CanvasGradient | CanvasPattern; + abstract set strokeStyle(style: string | CanvasGradient | CanvasPattern); + abstract get strokeStyle(): string | CanvasGradient | CanvasPattern; + abstract setFont(f?: string | FontInfo, size?: string | number, weight?: string | number, style?: string): this; + abstract getFont(): string; + set font(f: string); + get font(): string; + /** + * This is kept for backwards compatibility with 3.0.9. + * @deprecated use `setFont(...)` instead since it now supports CSS font shorthand. + */ + setRawFont(f: string): this; +} +/** + * Draw a tiny dot marker on the specified context. A great debugging aid. + * @param ctx context + * @param x dot x coordinate + * @param y dot y coordinate + * @param color + */ +export declare function drawDot(ctx: RenderContext, x: number, y: number, color?: string): void; diff --git a/build/types/src/renderer.d.ts b/build/types/src/renderer.d.ts new file mode 100644 index 0000000000..13055c123f --- /dev/null +++ b/build/types/src/renderer.d.ts @@ -0,0 +1,35 @@ +import { RenderContext } from './rendercontext'; +export declare type ContextBuilder = typeof Renderer.getSVGContext | typeof Renderer.getCanvasContext; +export declare enum RendererBackends { + CANVAS = 1, + SVG = 2 +} +export declare enum RendererLineEndType { + NONE = 1, + UP = 2, + DOWN = 3 +} +/** + * Support Canvas & SVG rendering contexts. + */ +export declare class Renderer { + static Backends: typeof RendererBackends; + static LineEndType: typeof RendererLineEndType; + static lastContext?: RenderContext; + static buildContext(elementId: string | HTMLCanvasElement | HTMLDivElement, backend: number, width: number, height: number, background?: string): RenderContext; + static getCanvasContext(elementId: string, width: number, height: number, background?: string): RenderContext; + static getSVGContext(elementId: string, width: number, height: number, background?: string): RenderContext; + static drawDashedLine(context: RenderContext, fromX: number, fromY: number, toX: number, toY: number, dashPattern: number[]): void; + protected ctx: RenderContext; + /** + * @param canvasId can be: + * - a string element ID (of a canvas or div element) + * - a canvas element + * - a div element, which will contain the SVG output + * @param backend Renderer.Backends.CANVAS or Renderer.Backends.SVG + */ + constructor(context: RenderContext); + constructor(canvas: string | HTMLCanvasElement | HTMLDivElement, backend: number); + resize(width: number, height: number): this; + getContext(): RenderContext; +} diff --git a/build/types/src/repeatnote.d.ts b/build/types/src/repeatnote.d.ts new file mode 100644 index 0000000000..f3df63ab8c --- /dev/null +++ b/build/types/src/repeatnote.d.ts @@ -0,0 +1,6 @@ +import { GlyphNote, GlyphNoteOptions } from './glyphnote'; +import { NoteStruct } from './note'; +export declare class RepeatNote extends GlyphNote { + static get CATEGORY(): string; + constructor(type: string, noteStruct?: NoteStruct, options?: GlyphNoteOptions); +} diff --git a/build/types/src/stave.d.ts b/build/types/src/stave.d.ts new file mode 100644 index 0000000000..e237a6b6b8 --- /dev/null +++ b/build/types/src/stave.d.ts @@ -0,0 +1,186 @@ +import { BoundingBox, Bounds } from './boundingbox'; +import { Element, ElementStyle } from './element'; +import { FontInfo } from './font'; +import { BarlineType } from './stavebarline'; +import { StaveModifier } from './stavemodifier'; +import { StaveTempoOptions } from './stavetempo'; +export interface StaveLineConfig { + visible?: boolean; +} +export interface StaveOptions { + bottom_text_position?: number; + line_config?: StaveLineConfig[]; + space_below_staff_ln?: number; + space_above_staff_ln?: number; + vertical_bar_width?: number; + fill_style?: string; + left_bar?: boolean; + right_bar?: boolean; + spacing_between_lines_px?: number; + top_text_position?: number; + num_lines?: number; +} +export declare class Stave extends Element { + static get CATEGORY(): string; + static TEXT_FONT: Required; + readonly options: Required; + protected start_x: number; + protected clef: string; + protected endClef?: string; + protected x: number; + protected y: number; + protected width: number; + protected height: number; + protected formatted: boolean; + protected end_x: number; + protected measure: number; + protected bounds: Bounds; + protected readonly modifiers: StaveModifier[]; + protected defaultLedgerLineStyle: ElementStyle; + static get defaultPadding(): number; + static get rightPadding(): number; + constructor(x: number, y: number, width: number, options?: StaveOptions); + /** Set default style for ledger lines. */ + setDefaultLedgerLineStyle(style: ElementStyle): void; + /** Get default style for ledger lines. */ + getDefaultLedgerLineStyle(): ElementStyle; + space(spacing: number): number; + resetLines(): void; + setNoteStartX(x: number): this; + getNoteStartX(): number; + getNoteEndX(): number; + getTieStartX(): number; + getTieEndX(): number; + getX(): number; + getNumLines(): number; + setNumLines(n: number): this; + setY(y: number): this; + getY(): number; + getTopLineTopY(): number; + getBottomLineBottomY(): number; + setX(x: number): this; + setWidth(width: number): this; + getWidth(): number; + getStyle(): ElementStyle; + setMeasure(measure: number): this; + /** + * Gets the pixels to shift from the beginning of the stave + * following the modifier at the provided index + * @param {Number} index The index from which to determine the shift + * @return {Number} The amount of pixels shifted + */ + getModifierXShift(index?: number): number; + /** Coda & Segno Symbol functions */ + setRepetitionType(type: number, yShift?: number): this; + setVoltaType(type: number, number_t: string, y: number): this; + setSection(section: string, y: number, xOffset?: number, fontSize?: number): this; + setTempo(tempo: StaveTempoOptions, y: number): this; + setText(text: string, position: number, options?: { + shift_x?: number; + shift_y?: number; + justification?: number; + }): this; + getHeight(): number; + getSpacingBetweenLines(): number; + getBoundingBox(): BoundingBox; + getBottomY(): number; + getBottomLineY(): number; + /** @returns the y for the *center* of a staff line */ + getYForLine(line: number): number; + getLineForY(y: number): number; + getYForTopText(line?: number): number; + getYForBottomText(line?: number): number; + getYForNote(line: number): number; + getYForGlyphs(): number; + addModifier(modifier: StaveModifier, position?: number): this; + addEndModifier(modifier: StaveModifier): this; + setBegBarType(type: number | BarlineType): this; + setEndBarType(type: number | BarlineType): this; + setClef(clefSpec: string, size?: string, annotation?: string, position?: number): this; + getClef(): string; + setEndClef(clefSpec: string, size?: string, annotation?: string): this; + getEndClef(): string | undefined; + setKeySignature(keySpec: string, cancelKeySpec?: string, position?: number): this; + setEndKeySignature(keySpec: string, cancelKeySpec?: string): this; + setTimeSignature(timeSpec: string, customPadding?: number, position?: number): this; + setEndTimeSignature(timeSpec: string, customPadding?: number): this; + /** + * Add a key signature to the stave. + * + * Example: + * `stave.addKeySignature('Db');` + * @param keySpec new key specification `[A-G][b|#]?` + * @param cancelKeySpec + * @param position + * @returns + */ + addKeySignature(keySpec: string, cancelKeySpec?: string, position?: number): this; + /** + * Add a clef to the stave. + * + * Example: + * + * stave.addClef('treble') + * @param clef clef (treble|bass|...) see {@link Clef.types} + * @param size + * @param annotation + * @param position + * @returns + */ + addClef(clef: string, size?: string, annotation?: string, position?: number): this; + addEndClef(clef: string, size?: string, annotation?: string): this; + /** + * Add a time signature to the stave + * + * Example: + * + * `stave.addTimeSignature('4/4');` + * @param timeSpec time signature specification `(C\||C|\d\/\d)` + * @param customPadding + * @param position + * @returns + */ + addTimeSignature(timeSpec: string, customPadding?: number, position?: number): this; + addEndTimeSignature(timeSpec: string, customPadding?: number): this; + addTrebleGlyph(): this; + /** + * @param position + * @param category + * @returns array of StaveModifiers that match the provided position and category. + */ + getModifiers(position?: number, category?: string): StaveModifier[]; + /** + * Use the modifier's `getCategory()` as a key for the `order` array. + * The retrieved value is used to sort modifiers from left to right (0 to to 3). + */ + sortByCategory(items: StaveModifier[], order: Record): void; + format(): void; + /** + * All drawing functions below need the context to be set. + */ + draw(): this; + getVerticalBarWidth(): number; + /** + * Get the current configuration for the Stave. + * @return {Array} An array of configuration objects. + */ + getConfigForLines(): StaveLineConfig[]; + /** + * Configure properties of the lines in the Stave + * @param line_number The index of the line to configure. + * @param line_config An configuration object for the specified line. + * @throws RuntimeError "StaveConfigError" When the specified line number is out of + * range of the number of lines specified in the constructor. + */ + setConfigForLine(line_number: number, line_config: StaveLineConfig): this; + /** + * Set the staff line configuration array for all of the lines at once. + * @param lines_configuration An array of line configuration objects. These objects + * are of the same format as the single one passed in to setLineConfiguration(). + * The caller can set null for any line config entry if it is desired that the default be used + * @throws RuntimeError "StaveConfigError" When the lines_configuration array does not have + * exactly the same number of elements as the num_lines configuration object set in + * the constructor. + */ + setConfigForLines(lines_configuration: StaveLineConfig[]): this; +} diff --git a/build/types/src/stavebarline.d.ts b/build/types/src/stavebarline.d.ts new file mode 100644 index 0000000000..67b51bb437 --- /dev/null +++ b/build/types/src/stavebarline.d.ts @@ -0,0 +1,28 @@ +import { Stave } from './stave'; +import { LayoutMetrics, StaveModifier } from './stavemodifier'; +export declare enum BarlineType { + SINGLE = 1, + DOUBLE = 2, + END = 3, + REPEAT_BEGIN = 4, + REPEAT_END = 5, + REPEAT_BOTH = 6, + NONE = 7 +} +export declare class Barline extends StaveModifier { + static get CATEGORY(): string; + protected widths: Record; + protected paddings: Record; + protected layoutMetricsMap: Record; + protected thickness: number; + protected type: BarlineType; + static get type(): typeof BarlineType; + static get typeString(): Record; + constructor(type: BarlineType | string); + getType(): number; + setType(type: string | number): this; + draw(stave: Stave): void; + drawVerticalBar(stave: Stave, x: number, double_bar?: boolean): void; + drawVerticalEndBar(stave: Stave, x: number): void; + drawRepeatBar(stave: Stave, x: number, begin: boolean): void; +} diff --git a/build/types/src/staveconnector.d.ts b/build/types/src/staveconnector.d.ts new file mode 100644 index 0000000000..e24449c4c2 --- /dev/null +++ b/build/types/src/staveconnector.d.ts @@ -0,0 +1,67 @@ +import { Element } from './element'; +import { FontInfo } from './font'; +import { Stave } from './stave'; +/** StaveConnector implements the connector lines between staves of a system. */ +export declare class StaveConnector extends Element { + static get CATEGORY(): string; + static TEXT_FONT: Required; + /** + * SINGLE_LEFT and SINGLE are the same value for compatibility + * with older versions of vexflow which didn't have right sided + * stave connectors. + */ + static readonly type: { + SINGLE_RIGHT: number; + SINGLE_LEFT: number; + SINGLE: number; + DOUBLE: number; + BRACE: number; + BRACKET: number; + BOLD_DOUBLE_LEFT: number; + BOLD_DOUBLE_RIGHT: number; + THIN_DOUBLE: number; + NONE: number; + }; + /** + * Connector type: + * * "singleRight" + * * "singleLeft" + * * "single" + * * "double" + * * "brace" + * * "bracket" + * * "boldDoubleLeft" + * * "boldDoubleRight" + * * "thinDouble" + * * "none" + */ + static readonly typeString: Record; + protected width: number; + protected texts: { + content: string; + options: { + shift_x: number; + shift_y: number; + }; + }[]; + protected type: number; + readonly top_stave: Stave; + readonly bottom_stave: Stave; + readonly thickness: number; + protected x_shift: number; + constructor(top_stave: Stave, bottom_stave: Stave); + /** + * Set type. + * @param type see {@link StaveConnector.type} & {@link StaveConnector.typeString} + */ + setType(type: number | string): this; + /** Set optional associated Text. */ + setText(text: string, options?: { + shift_x?: number; + shift_y?: number; + }): this; + setXShift(x_shift: number): this; + getXShift(): number; + /** Render connector and associated text. */ + draw(): void; +} diff --git a/build/types/src/stavehairpin.d.ts b/build/types/src/stavehairpin.d.ts new file mode 100644 index 0000000000..ef02eb2563 --- /dev/null +++ b/build/types/src/stavehairpin.d.ts @@ -0,0 +1,56 @@ +import { Element } from './element'; +import { Note } from './note'; +import { RenderContext } from './rendercontext'; +export interface StaveHairpinRenderOptions { + right_shift_ticks?: number; + left_shift_ticks?: number; + left_shift_px: number; + right_shift_px: number; + height: number; + y_shift: number; +} +export declare class StaveHairpin extends Element { + static get CATEGORY(): string; + protected hairpin: number; + protected position: number; + render_options: StaveHairpinRenderOptions; + protected notes: Record; + protected first_note?: Note; + protected last_note?: Note; + static readonly type: { + CRESC: number; + DECRESC: number; + }; + static FormatByTicksAndDraw(ctx: RenderContext, formatter: { + pixelsPerTick: number; + }, notes: Record, type: number, position: number, options: StaveHairpinRenderOptions): void; + /** + * Create a new hairpin from the specified notes. + * + * @param {!Object} notes The notes to tie up. + * Notes is a struct that has: + * + * { + * first_note: Note, + * last_note: Note, + * } + * @param {!Object} type The type of hairpin + */ + constructor(notes: Record, type: number); + setPosition(position: number): this; + setRenderOptions(options: StaveHairpinRenderOptions): this; + /** + * Set the notes to attach this hairpin to. + * + * @param {!Object} notes The start and end notes. + */ + setNotes(notes: Record): this; + renderHairpin(params: { + first_x: number; + last_x: number; + first_y: number; + last_y: number; + staff_height: number; + }): void; + draw(): void; +} diff --git a/build/types/src/staveline.d.ts b/build/types/src/staveline.d.ts new file mode 100644 index 0000000000..2e07fd53d6 --- /dev/null +++ b/build/types/src/staveline.d.ts @@ -0,0 +1,57 @@ +import { Element } from './element'; +import { FontInfo } from './font'; +import { RenderContext } from './rendercontext'; +import { StaveNote } from './stavenote'; +export interface StaveLineNotes { + first_note: StaveNote; + first_indices: number[]; + last_note: StaveNote; + last_indices: number[]; +} +export declare class StaveLine extends Element { + static get CATEGORY(): string; + /** Default text font. */ + static TEXT_FONT: Required; + static readonly TextVerticalPosition: { + TOP: number; + BOTTOM: number; + }; + static readonly TextJustification: { + LEFT: number; + CENTER: number; + RIGHT: number; + }; + render_options: { + padding_left: number; + padding_right: number; + line_width: number; + line_dash?: number[]; + rounded_end: boolean; + color?: string; + draw_start_arrow: boolean; + draw_end_arrow: boolean; + arrowhead_length: number; + arrowhead_angle: number; + text_position_vertical: number; + text_justification: number; + }; + protected text: string; + protected notes: StaveLineNotes; + protected first_note: StaveNote; + protected first_indices: number[]; + protected last_note: StaveNote; + protected last_indices: number[]; + constructor(notes: StaveLineNotes); + setText(text: string): this; + setNotes(notes: StaveLineNotes): this; + applyLineStyle(): void; + applyFontStyle(): void; + protected drawArrowLine(ctx: RenderContext, pt1: { + x: number; + y: number; + }, pt2: { + x: number; + y: number; + }): void; + draw(): this; +} diff --git a/build/types/src/stavemodifier.d.ts b/build/types/src/stavemodifier.d.ts new file mode 100644 index 0000000000..911c624afb --- /dev/null +++ b/build/types/src/stavemodifier.d.ts @@ -0,0 +1,44 @@ +import { Element } from './element'; +import { Glyph } from './glyph'; +import { Stave } from './stave'; +export interface LayoutMetrics { + xMin: number; + xMax: number; + paddingLeft: number; + paddingRight: number; +} +export declare enum StaveModifierPosition { + CENTER = 0, + LEFT = 1, + RIGHT = 2, + ABOVE = 3, + BELOW = 4, + BEGIN = 5, + END = 6 +} +export declare class StaveModifier extends Element { + static get CATEGORY(): string; + static get Position(): typeof StaveModifierPosition; + protected width: number; + protected x: number; + protected padding: number; + protected position: StaveModifierPosition; + protected stave?: Stave; + protected layoutMetrics?: LayoutMetrics; + constructor(); + getPosition(): number; + setPosition(position: number): this; + getStave(): Stave | undefined; + checkStave(): Stave; + setStave(stave: Stave): this; + getWidth(): number; + setWidth(width: number): this; + getX(): number; + setX(x: number): this; + placeGlyphOnLine(glyph: Glyph, stave: Stave, line?: number, customShift?: number): void; + getPadding(index: number): number; + setPadding(padding: number): this; + setLayoutMetrics(layoutMetrics: LayoutMetrics): this; + getLayoutMetrics(): LayoutMetrics | undefined; + draw(...args: any[]): void; +} diff --git a/build/types/src/stavenote.d.ts b/build/types/src/stavenote.d.ts new file mode 100644 index 0000000000..af9d76f37c --- /dev/null +++ b/build/types/src/stavenote.d.ts @@ -0,0 +1,152 @@ +import { Beam } from './beam'; +import { BoundingBox } from './boundingbox'; +import { ElementStyle } from './element'; +import { ModifierContextState } from './modifiercontext'; +import { Note, NoteStruct } from './note'; +import { NoteHead } from './notehead'; +import { Stave } from './stave'; +import { StemOptions } from './stem'; +import { StemmableNote } from './stemmablenote'; +export interface StaveNoteHeadBounds { + y_top: number; + y_bottom: number; + displaced_x?: number; + non_displaced_x?: number; + highest_line: number; + lowest_line: number; + highest_displaced_line?: number; + lowest_displaced_line?: number; + highest_non_displaced_line: number; + lowest_non_displaced_line: number; +} +export interface StaveNoteFormatSettings { + line: number; + maxLine: number; + minLine: number; + isrest: boolean; + stemDirection?: number; + stemMax: number; + stemMin: number; + voice_shift: number; + is_displaced: boolean; + note: StaveNote; +} +export interface StaveNoteStruct extends NoteStruct { + /** `Stem.UP` or `Stem.DOWN`. */ + stem_direction?: number; + auto_stem?: boolean; + stem_down_x_offset?: number; + stem_up_x_offset?: number; + stroke_px?: number; + glyph_font_scale?: number; + octave_shift?: number; + clef?: string; +} +export declare class StaveNote extends StemmableNote { + static DEBUG: boolean; + static get CATEGORY(): string; + /** + * @deprecated Use Stem.UP. + */ + static get STEM_UP(): number; + /** + * @deprecated Use Stem.DOWN. + */ + static get STEM_DOWN(): number; + static get LEDGER_LINE_OFFSET(): number; + static get minNoteheadPadding(): number; + /** Format notes inside a ModifierContext. */ + static format(notes: StaveNote[], state: ModifierContextState): boolean; + static postFormat(notes: Note[]): boolean; + minLine: number; + maxLine: number; + protected readonly clef: string; + protected readonly octave_shift?: number; + protected displaced: boolean; + protected dot_shiftY: number; + protected use_default_head_x: boolean; + protected ledgerLineStyle: ElementStyle; + protected flagStyle?: ElementStyle; + private _noteHeads; + constructor(noteStruct: StaveNoteStruct); + reset(): this; + setBeam(beam: Beam): this; + buildStem(): this; + buildNoteHeads(): void; + autoStem(): void; + calculateOptimalStemDirection(): number; + calculateKeyProps(): void; + getBoundingBox(): BoundingBox; + getLineNumber(isTopNote?: boolean): number; + /** + * @returns true if this note is a type of rest. Rests don't have pitches, but take up space in the score. + */ + isRest(): boolean; + isChord(): boolean; + hasStem(): boolean; + hasFlag(): boolean; + getStemX(): number; + getYForTopText(textLine: number): number; + getYForBottomText(textLine: number): number; + setStave(stave: Stave): this; + isDisplaced(): boolean; + setNoteDisplaced(displaced: boolean): this; + getTieRightX(): number; + getTieLeftX(): number; + getLineForRest(): number; + getModifierStartXY(position: number, index: number, options?: { + forceFlagRight?: boolean; + }): { + x: number; + y: number; + }; + setStyle(style: ElementStyle): this; + setStemStyle(style: ElementStyle): this; + getStemStyle(): ElementStyle | undefined; + setLedgerLineStyle(style: ElementStyle): void; + getLedgerLineStyle(): ElementStyle; + setFlagStyle(style: ElementStyle): void; + getFlagStyle(): ElementStyle | undefined; + setKeyStyle(index: number, style: ElementStyle): this; + setKeyLine(index: number, line: number): this; + getKeyLine(index: number): number; + getVoiceShiftWidth(): number; + calcNoteDisplacements(): void; + preFormat(): void; + /** + * @typedef {Object} noteHeadBounds + * @property {number} y_top the highest notehead bound + * @property {number} y_bottom the lowest notehead bound + * @property {number|Null} displaced_x the starting x for displaced noteheads + * @property {number|Null} non_displaced_x the starting x for non-displaced noteheads + * @property {number} highest_line the highest notehead line in traditional music line + * numbering (bottom line = 1, top line = 5) + * @property {number} lowest_line the lowest notehead line + * @property {number|false} highest_displaced_line the highest staff line number + * for a displaced notehead + * @property {number|false} lowest_displaced_line + * @property {number} highest_non_displaced_line + * @property {number} lowest_non_displaced_line + */ + /** + * Get the staff line and y value for the highest & lowest noteheads + * @returns {noteHeadBounds} + */ + getNoteHeadBounds(): StaveNoteHeadBounds; + getNoteHeadBeginX(): number; + getNoteHeadEndX(): number; + get noteHeads(): NoteHead[]; + /** @deprecated use StaveNote.noteHeads instead. */ + get note_heads(): NoteHead[]; + drawLedgerLines(): void; + drawModifiers(): void; + shouldDrawFlag(): boolean; + drawFlag(): void; + drawNoteHeads(): void; + drawStem(stemOptions?: StemOptions): void; + /** + * Override stemmablenote stem extension to adjust for distance from middle line. + */ + getStemExtension(): number; + draw(): void; +} diff --git a/build/types/src/staverepetition.d.ts b/build/types/src/staverepetition.d.ts new file mode 100644 index 0000000000..afa3bf95c0 --- /dev/null +++ b/build/types/src/staverepetition.d.ts @@ -0,0 +1,32 @@ +import { FontInfo } from './font'; +import { Stave } from './stave'; +import { StaveModifier } from './stavemodifier'; +export declare class Repetition extends StaveModifier { + static get CATEGORY(): string; + static TEXT_FONT: Required; + static readonly type: { + NONE: number; + CODA_LEFT: number; + CODA_RIGHT: number; + SEGNO_LEFT: number; + SEGNO_RIGHT: number; + DC: number; + DC_AL_CODA: number; + DC_AL_FINE: number; + DS: number; + DS_AL_CODA: number; + DS_AL_FINE: number; + FINE: number; + TO_CODA: number; + }; + protected symbol_type: number; + protected x_shift: number; + protected y_shift: number; + constructor(type: number, x: number, y_shift: number); + setShiftX(x: number): this; + setShiftY(y: number): this; + draw(stave: Stave, x: number): this; + drawCodaFixed(stave: Stave, x: number): this; + drawSignoFixed(stave: Stave, x: number): this; + drawSymbolText(stave: Stave, x: number, text: string, draw_coda: boolean): this; +} diff --git a/build/types/src/stavesection.d.ts b/build/types/src/stavesection.d.ts new file mode 100644 index 0000000000..6d92ccb12d --- /dev/null +++ b/build/types/src/stavesection.d.ts @@ -0,0 +1,15 @@ +import { FontInfo } from './font'; +import { Stave } from './stave'; +import { StaveModifier } from './stavemodifier'; +export declare class StaveSection extends StaveModifier { + static get CATEGORY(): string; + static TEXT_FONT: Required; + protected section: string; + protected shift_x: number; + protected shift_y: number; + constructor(section: string, x: number, shift_y: number); + setStaveSection(section: string): this; + setShiftX(x: number): this; + setShiftY(y: number): this; + draw(stave: Stave, shift_x: number): this; +} diff --git a/build/types/src/stavetempo.d.ts b/build/types/src/stavetempo.d.ts new file mode 100644 index 0000000000..6fe3003fd7 --- /dev/null +++ b/build/types/src/stavetempo.d.ts @@ -0,0 +1,25 @@ +import { FontInfo } from './font'; +import { Stave } from './stave'; +import { StaveModifier } from './stavemodifier'; +export interface StaveTempoOptions { + bpm?: number; + duration?: string; + dots?: number; + name?: string; +} +export declare class StaveTempo extends StaveModifier { + static get CATEGORY(): string; + static TEXT_FONT: Required; + protected tempo: StaveTempoOptions; + protected shift_x: number; + protected shift_y: number; + /** Font size for note. */ + render_options: { + glyph_font_scale: number; + }; + constructor(tempo: StaveTempoOptions, x: number, shift_y: number); + setTempo(tempo: StaveTempoOptions): this; + setShiftX(x: number): this; + setShiftY(y: number): this; + draw(stave: Stave, shift_x: number): this; +} diff --git a/build/types/src/stavetext.d.ts b/build/types/src/stavetext.d.ts new file mode 100644 index 0000000000..23a01dd860 --- /dev/null +++ b/build/types/src/stavetext.d.ts @@ -0,0 +1,25 @@ +import { FontInfo } from './font'; +import { Stave } from './stave'; +import { StaveModifier } from './stavemodifier'; +export declare class StaveText extends StaveModifier { + static get CATEGORY(): string; + static TEXT_FONT: Required; + protected options: { + shift_x: number; + shift_y: number; + justification: number; + }; + protected text: string; + protected shift_x?: number; + protected shift_y?: number; + constructor(text: string, position: number, options?: { + shift_x?: number; + shift_y?: number; + justification?: number; + }); + setStaveText(text: string): this; + setShiftX(x: number): this; + setShiftY(y: number): this; + setText(text: string): this; + draw(stave: Stave): this; +} diff --git a/build/types/src/stavetie.d.ts b/build/types/src/stavetie.d.ts new file mode 100644 index 0000000000..d795c750df --- /dev/null +++ b/build/types/src/stavetie.d.ts @@ -0,0 +1,59 @@ +import { Element } from './element'; +import { FontInfo } from './font'; +import { Note } from './note'; +export interface TieNotes { + first_note?: Note | null; + last_note?: Note | null; + first_indices?: number[]; + last_indices?: number[]; +} +export declare class StaveTie extends Element { + static get CATEGORY(): string; + /** Default text font. */ + static TEXT_FONT: Required; + render_options: { + cp2: number; + last_x_shift: number; + tie_spacing: number; + cp1: number; + first_x_shift: number; + text_shift_x: number; + y_shift: number; + }; + protected text?: string; + protected notes: TieNotes; + protected direction?: number; + /** + * @param notes is a struct that has: + * + * { + * first_note: Note, + * last_note: Note, + * first_indices: [n1, n2, n3], + * last_indices: [n1, n2, n3] + * } + * + * @param text + */ + constructor(notes: TieNotes, text?: string); + setDirection(direction: number): this; + /** + * Set the notes to attach this tie to. + * + * @param {!Object} notes The notes to tie up. + */ + setNotes(notes: TieNotes): this; + /** + * @return {boolean} Returns true if this is a partial bar. + */ + isPartial(): boolean; + renderTie(params: { + direction: number; + first_x_px: number; + last_x_px: number; + last_ys: number[]; + first_ys: number[]; + }): void; + renderText(first_x_px: number, last_x_px: number): void; + draw(): boolean; +} diff --git a/build/types/src/stavevolta.d.ts b/build/types/src/stavevolta.d.ts new file mode 100644 index 0000000000..d23dddce6c --- /dev/null +++ b/build/types/src/stavevolta.d.ts @@ -0,0 +1,21 @@ +import { FontInfo } from './font'; +import { Stave } from './stave'; +import { StaveModifier } from './stavemodifier'; +export declare enum VoltaType { + NONE = 1, + BEGIN = 2, + MID = 3, + END = 4, + BEGIN_END = 5 +} +export declare class Volta extends StaveModifier { + static get CATEGORY(): string; + static get type(): typeof VoltaType; + static TEXT_FONT: Required; + protected volta: number; + protected number: string; + protected y_shift: number; + constructor(type: number, number: string, x: number, y_shift: number); + setShiftY(y: number): this; + draw(stave: Stave, x: number): this; +} diff --git a/build/types/src/stem.d.ts b/build/types/src/stem.d.ts new file mode 100644 index 0000000000..026f2f10e0 --- /dev/null +++ b/build/types/src/stem.d.ts @@ -0,0 +1,55 @@ +import { BoundingBox } from './boundingbox'; +import { Element } from './element'; +export interface StemOptions { + stem_down_y_base_offset?: number; + stem_up_y_base_offset?: number; + stem_down_y_offset?: number; + stem_up_y_offset?: number; + stemletHeight?: number; + isStemlet?: boolean; + hide?: boolean; + stem_direction?: number; + stem_extension?: number; + y_bottom?: number; + y_top?: number; + x_end?: number; + x_begin?: number; +} +export declare class Stem extends Element { + /** To enable logging for this class. Set `Vex.Flow.Stem.DEBUG` to `true`. */ + static DEBUG: boolean; + static get CATEGORY(): string; + static get UP(): number; + static get DOWN(): number; + static get WIDTH(): number; + static get HEIGHT(): number; + protected hide: boolean; + protected isStemlet: boolean; + protected stemletHeight: number; + protected x_begin: number; + protected x_end: number; + protected y_top: number; + protected stem_up_y_offset: number; + protected y_bottom: number; + protected stem_down_y_offset: number; + protected stem_up_y_base_offset: number; + protected stem_down_y_base_offset: number; + protected stem_direction: number; + protected stem_extension: number; + protected renderHeightAdjustment: number; + constructor(options?: StemOptions); + setOptions(options?: StemOptions): void; + setNoteHeadXBounds(x_begin: number, x_end: number): this; + setDirection(direction: number): void; + setExtension(ext: number): void; + getExtension(): number; + setYBounds(y_top: number, y_bottom: number): void; + getHeight(): number; + getBoundingBox(): BoundingBox; + getExtents(): Record; + setVisibility(isVisible: boolean): this; + setStemlet(isStemlet: boolean, stemletHeight: number): this; + adjustHeightForFlag(): void; + adjustHeightForBeam(): void; + draw(): void; +} diff --git a/build/types/src/stemmablenote.d.ts b/build/types/src/stemmablenote.d.ts new file mode 100644 index 0000000000..068f64e5ef --- /dev/null +++ b/build/types/src/stemmablenote.d.ts @@ -0,0 +1,36 @@ +import { Glyph, GlyphProps } from './glyph'; +import { Note, NoteStruct } from './note'; +import { Stem, StemOptions } from './stem'; +export declare abstract class StemmableNote extends Note { + static get CATEGORY(): string; + stem_direction?: number; + stem?: Stem; + protected flag?: Glyph; + protected stem_extension_override?: number; + constructor(noteStruct: NoteStruct); + getStem(): Stem | undefined; + checkStem(): Stem; + setStem(stem: Stem): this; + buildStem(): this; + buildFlag(category?: string): void; + getBaseCustomNoteHeadGlyph(): GlyphProps; + getStemLength(): number; + getBeamCount(): number; + getStemMinimumLength(): number; + getStemDirection(): number; + setStemDirection(direction?: number): this; + getStemX(): number; + getCenterGlyphX(): number; + getStemExtension(): number; + setStemLength(height: number): this; + getStemExtents(): Record; + /** Gets the `y` value for the top modifiers at a specific `textLine`. */ + getYForTopText(textLine: number): number; + /** Gets the `y` value for the bottom modifiers at a specific `textLine`. */ + getYForBottomText(textLine: number): number; + hasFlag(): boolean; + /** Post formats the note. */ + postFormat(): this; + /** Renders the stem onto the canvas. */ + drawStem(stemOptions: StemOptions): void; +} diff --git a/build/types/src/stringnumber.d.ts b/build/types/src/stringnumber.d.ts new file mode 100644 index 0000000000..ad11ddc65c --- /dev/null +++ b/build/types/src/stringnumber.d.ts @@ -0,0 +1,27 @@ +import { FontInfo } from './font'; +import { Modifier } from './modifier'; +import { ModifierContextState } from './modifiercontext'; +import { Note } from './note'; +export declare class StringNumber extends Modifier { + static get CATEGORY(): string; + static TEXT_FONT: Required; + static get metrics(): any; + static format(nums: StringNumber[], state: ModifierContextState): boolean; + radius: number; + protected last_note?: Note; + protected string_number: string; + protected x_offset: number; + protected y_offset: number; + protected text_line: number; + protected stem_offset: number; + protected dashed: boolean; + protected leg: number; + constructor(number: string); + setLineEndType(leg: number): this; + setStringNumber(number: string): this; + setOffsetX(x: number): this; + setOffsetY(y: number): this; + setLastNote(note: Note): this; + setDashed(dashed: boolean): this; + draw(): void; +} diff --git a/build/types/src/strokes.d.ts b/build/types/src/strokes.d.ts new file mode 100644 index 0000000000..8e6329489c --- /dev/null +++ b/build/types/src/strokes.d.ts @@ -0,0 +1,33 @@ +import { FontInfo } from './font'; +import { Modifier } from './modifier'; +import { ModifierContextState } from './modifiercontext'; +import { Note } from './note'; +export declare class Stroke extends Modifier { + static get CATEGORY(): string; + static readonly Type: { + BRUSH_DOWN: number; + BRUSH_UP: number; + ROLL_DOWN: number; + ROLL_UP: number; + RASQUEDO_DOWN: number; + RASQUEDO_UP: number; + ARPEGGIO_DIRECTIONLESS: number; + }; + static TEXT_FONT: Required; + static format(strokes: Stroke[], state: ModifierContextState): boolean; + protected options: { + all_voices: boolean; + }; + protected all_voices: boolean; + protected type: number; + protected note_end?: Note; + render_options: { + font_scale: number; + }; + constructor(type: number, options?: { + all_voices: boolean; + }); + getPosition(): number; + addEndNote(note: Note): this; + draw(): void; +} diff --git a/build/types/src/svgcontext.d.ts b/build/types/src/svgcontext.d.ts new file mode 100644 index 0000000000..9c4d62cec5 --- /dev/null +++ b/build/types/src/svgcontext.d.ts @@ -0,0 +1,131 @@ +import { FontInfo } from './font'; +import { GroupAttributes, RenderContext, TextMeasure } from './rendercontext'; +export declare type Attributes = Record; +export interface State { + state: Attributes; + attributes: Attributes; + shadow_attributes: Attributes; + lineWidth: number; +} +declare class MeasureTextCache { + protected txt?: SVGTextElement; + protected cache: Record>; + lookup(text: string, svg: SVGSVGElement, attributes: Attributes): TextMeasure; + measureImpl(text: string, svg: SVGSVGElement, attributes: Attributes): TextMeasure; +} +/** + * SVG rendering context with an API similar to CanvasRenderingContext2D. + */ +export declare class SVGContext extends RenderContext { + protected static measureTextCache: MeasureTextCache; + element: HTMLElement; + svg: SVGSVGElement; + width: number; + height: number; + path: string; + pen: { + x: number; + y: number; + }; + lineWidth: number; + attributes: Attributes; + shadow_attributes: Attributes; + state: Attributes; + state_stack: State[]; + parent: SVGGElement; + groups: SVGGElement[]; + backgroundFillStyle: string; + /** Formatted as CSS font shorthand (e.g., 'italic bold 12pt Arial') */ + protected fontCSSString: string; + constructor(element: HTMLElement); + /** + * Use one of the overload signatures to create an SVG element of a specific type. + * The last overload accepts an arbitrary string, and is identical to the + * implementation signature. + * Feel free to add new overloads for other SVG element types as required. + */ + create(svgElementType: 'g'): SVGGElement; + create(svgElementType: 'path'): SVGPathElement; + create(svgElementType: 'rect'): SVGRectElement; + create(svgElementType: 'svg'): SVGSVGElement; + create(svgElementType: 'text'): SVGTextElement; + create(svgElementType: string): SVGElement; + openGroup(cls?: string, id?: string, attrs?: GroupAttributes): SVGGElement; + closeGroup(): void; + add(elem: SVGElement): void; + setFillStyle(style: string): this; + /** + * Used to set the fill color for `clearRect()`. This allows us to simulate + * cutting a "hole" into the SVG drawing. + */ + setBackgroundFillStyle(style: string): this; + setStrokeStyle(style: string): this; + setShadowColor(color: string): this; + /** + * @param blur A non-negative float specifying the level of shadow blur, where 0 + * represents no blur and larger numbers represent increasingly more blur. + * @returns this + */ + setShadowBlur(blur: number): this; + /** + * @param width + * @returns this + */ + setLineWidth(width: number): this; + /** + * @param lineDash an array of integers in the form of [dash, space, dash, space, etc...] + * @returns this + * + * See: [SVG `stroke-dasharray` attribute](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray) + */ + setLineDash(lineDash: number[]): this; + /** + * @param capType + * @returns this + */ + setLineCap(capType: CanvasLineCap): this; + resize(width: number, height: number): this; + scale(x: number, y: number): this; + /** + * 1 arg: string in the "x y w h" format + * 4 args: x:number, y:number, w:number, h:number + */ + setViewBox(viewBox_or_minX: string | number, minY?: number, width?: number, height?: number): void; + applyAttributes(element: SVGElement, attributes: Attributes): SVGElement; + clear(): void; + rect(x: number, y: number, width: number, height: number, attributes?: Attributes): this; + fillRect(x: number, y: number, width: number, height: number): this; + clearRect(x: number, y: number, width: number, height: number): this; + beginPath(): this; + moveTo(x: number, y: number): this; + lineTo(x: number, y: number): this; + bezierCurveTo(x1: number, y1: number, x2: number, y2: number, x: number, y: number): this; + quadraticCurveTo(x1: number, y1: number, x: number, y: number): this; + arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, counterclockwise: boolean): this; + closePath(): this; + private getShadowStyle; + fill(attributes?: Attributes): this; + stroke(): this; + measureText(text: string): TextMeasure; + fillText(text: string, x: number, y: number): this; + save(): this; + restore(): this; + set fillStyle(style: string | CanvasGradient | CanvasPattern); + get fillStyle(): string | CanvasGradient | CanvasPattern; + set strokeStyle(style: string | CanvasGradient | CanvasPattern); + get strokeStyle(): string | CanvasGradient | CanvasPattern; + /** + * @param f is 1) a `FontInfo` object or + * 2) a string formatted as CSS font shorthand (e.g., 'bold 10pt Arial') or + * 3) a string representing the font family (one of `size`, `weight`, or `style` must also be provided). + * @param size a string specifying the font size and unit (e.g., '16pt'), or a number (the unit is assumed to be 'pt'). + * @param weight is a string (e.g., 'bold', 'normal') or a number (100, 200, ... 900). It is inserted + * into the font-weight attribute (e.g., font-weight="bold") + * @param style is a string (e.g., 'italic', 'normal') that is inserted into the + * font-style attribute (e.g., font-style="italic") + */ + setFont(f?: string | FontInfo, size?: string | number, weight?: string | number, style?: string): this; + /** Return a string of the form `'italic bold 15pt Arial'` */ + getFont(): string; +} +export {}; diff --git a/build/types/src/system.d.ts b/build/types/src/system.d.ts new file mode 100644 index 0000000000..78b061e811 --- /dev/null +++ b/build/types/src/system.d.ts @@ -0,0 +1,92 @@ +import { Element } from './element'; +import { Factory } from './factory'; +import { FormatParams, Formatter, FormatterOptions } from './formatter'; +import { RenderContext } from './rendercontext'; +import { Stave, StaveOptions } from './stave'; +import { StaveConnector } from './staveconnector'; +import { Voice } from './voice'; +export interface SystemFormatterOptions extends FormatterOptions { + alpha?: number; +} +export interface SystemStave { + voices: Voice[]; + stave?: Stave; + noJustification?: boolean; + options?: StaveOptions; + spaceAbove?: number; + spaceBelow?: number; + debugNoteMetrics?: boolean; +} +/** + * Formatting for systems created/drawn from factory: + * + * If width is provided, the system will use the specified width. + * + * If noJustification flag is 'true', there is no justification between voices + * Otherwise, autoWidth defaults to true. + * + * If autowidth is true, the system uses format.preCalculateMinWidth + * for the width of all voices, and default stave padding + */ +export interface SystemOptions { + factory?: Factory; + noPadding?: boolean; + debugFormatter?: boolean; + spaceBetweenStaves?: number; + formatIterations?: number; + autoWidth?: boolean; + x?: number; + width?: number; + y?: number; + details?: SystemFormatterOptions; + formatOptions?: FormatParams; + noJustification?: boolean; +} +/** + * System implements a musical system, which is a collection of staves, + * each which can have one or more voices. All voices across all staves in + * the system are formatted together. + */ +export declare class System extends Element { + static get CATEGORY(): string; + protected options: Required; + protected factory: Factory; + protected formatter?: Formatter; + protected startX?: number; + protected lastY?: number; + protected parts: Required[]; + protected connector?: StaveConnector; + protected debugNoteMetricsYs?: { + y: number; + voice: Voice; + }[]; + constructor(params?: SystemOptions); + /** Set formatting options. */ + setOptions(options?: SystemOptions): void; + /** Set associated context. */ + setContext(context: RenderContext): this; + /** + * Add connector between staves. + * @param type see {@link StaveConnector.typeString} + */ + addConnector(type?: string): StaveConnector; + /** + * Add a stave to the system. + * + * Example (one voice): + * + * `system.addStave({voices: [score.voice(score.notes('C#5/q, B4, A4, G#4'))]});` + * + * Example (two voices): + * + * `system.addStave({voices: [` + * `score.voice(score.notes('C#5/q, B4, A4, G#4', {stem: 'up'})),` + * `score.voice(score.notes('C#4/h, C#4', {stem: 'down'}))` + * `]});` + */ + addStave(params: SystemStave): Stave; + /** Format the system. */ + format(): void; + /** Render the system. */ + draw(): void; +} diff --git a/build/types/src/tables.d.ts b/build/types/src/tables.d.ts new file mode 100644 index 0000000000..bac3867b12 --- /dev/null +++ b/build/types/src/tables.d.ts @@ -0,0 +1,96 @@ +import { ArticulationStruct } from './articulation'; +import { Font } from './font'; +import { Fraction } from './fraction'; +export declare class Tables { + static STEM_WIDTH: number; + static STEM_HEIGHT: number; + static STAVE_LINE_THICKNESS: number; + static RESOLUTION: number; + /** + * Customize this by calling Flow.setMusicFont(...fontNames); + */ + static MUSIC_FONT_STACK: Font[]; + /** + * @returns the `Font` object at the head of the music font stack. + */ + static currentMusicFont(): Font; + static NOTATION_FONT_SCALE: number; + static TABLATURE_FONT_SCALE: number; + static SLASH_NOTEHEAD_WIDTH: number; + static STAVE_LINE_DISTANCE: number; + static TEXT_HEIGHT_OFFSET_HACK: number; + static clefProperties(clef: string): { + line_shift: number; + }; + /** + * @param keyOctaveGlyph a string in the format "key/octave" (e.g., "c/5") or "key/octave/custom-note-head-code" (e.g., "g/5/t3"). + * @param clef + * @param params a struct with one option, `octave_shift` for clef ottavation (0 = default; 1 = 8va; -1 = 8vb, etc.). + * @returns properties for the specified note. + */ + static keyProperties(keyOctaveGlyph: string, clef?: string, params?: { + octave_shift?: number; + }): any; + static integerToNote(integer?: number): string; + static tabToGlyph(fret: string, scale?: number): { + text: string; + code?: string; + getWidth: () => number; + shift_y: number; + }; + static textWidth(text: string): number; + static articulationCodes(artic: string): ArticulationStruct; + static accidentalMap: Record; + static accidentalCodes(acc: string): { + code: string; + parenRightPaddingAdjustment: number; + }; + static accidentalColumnsTable: Record; + static ornamentCodes(acc: string): { + code: string; + }; + static keySignature(spec: string): { + type: string; + line: number; + }[]; + static getKeySignatures(): Record; + static hasKeySignature(spec: string): boolean; + static unicode: { + sharp: string; + flat: string; + natural: string; + triangle: string; + 'o-with-slash': string; + degrees: string; + circle: string; + }; + /** + * Convert duration aliases to the number based duration. + * If the input isn't an alias, simply return the input. + * @param duration + * @returns Example: 'q' -> '4', '8' -> '8' + */ + static sanitizeDuration(duration: string): string; + /** Convert the `duration` to a fraction. */ + static durationToFraction(duration: string): Fraction; + /** Convert the `duration` to a number. */ + static durationToNumber(duration: string): number; + static durationToTicks(duration: string): number; + static getGlyphProps(duration: string, type?: string): any | undefined; + static validTypes: Record; + static TIME4_4: { + num_beats: number; + beat_value: number; + resolution: number; + }; +} diff --git a/build/types/src/tabnote.d.ts b/build/types/src/tabnote.d.ts new file mode 100644 index 0000000000..d5c69b7337 --- /dev/null +++ b/build/types/src/tabnote.d.ts @@ -0,0 +1,41 @@ +import { GlyphProps } from './glyph'; +import { Stave } from './stave'; +import { StaveNoteStruct } from './stavenote'; +import { StemmableNote } from './stemmablenote'; +export interface TabNotePosition { + str: number; + fret: number | string; +} +export interface TabNoteStruct extends StaveNoteStruct { + positions: TabNotePosition[]; +} +export declare class TabNote extends StemmableNote { + static get CATEGORY(): string; + protected ghost: boolean; + protected glyphs: GlyphProps[]; + protected positions: TabNotePosition[]; + constructor(noteStruct: TabNoteStruct, draw_stem?: boolean); + greatestString: () => number; + leastString: () => number; + reset(): this; + setGhost(ghost: boolean): this; + hasStem(): boolean; + getStemExtension(): number; + updateWidth(): void; + setStave(stave: Stave): this; + getPositions(): TabNotePosition[]; + getModifierStartXY(position: number, index: number): { + x: number; + y: number; + }; + getLineForRest(): number; + preFormat(): void; + getStemX(): number; + getStemY(): number; + getStemExtents(): Record; + drawFlag(): void; + drawModifiers(): void; + drawStemThrough(): void; + drawPositions(): void; + draw(): void; +} diff --git a/build/types/src/tabslide.d.ts b/build/types/src/tabslide.d.ts new file mode 100644 index 0000000000..553e52f321 --- /dev/null +++ b/build/types/src/tabslide.d.ts @@ -0,0 +1,34 @@ +import { FontInfo } from './font'; +import { TieNotes } from './stavetie'; +import { TabTie } from './tabtie'; +export declare class TabSlide extends TabTie { + static get CATEGORY(): string; + static TEXT_FONT: Required; + static get SLIDE_UP(): number; + static get SLIDE_DOWN(): number; + static createSlideUp(notes: TieNotes): TabSlide; + static createSlideDown(notes: TieNotes): TabSlide; + /** + * @param notes is a struct of the form: + * { + * first_note: Note, + * last_note: Note, + * first_indices: [n1, n2, n3], + * last_indices: [n1, n2, n3] + * } + * @param notes.first_note the starting note of the slide + * @param notes.last_note the ending note of the slide + * @param notes.first_indices specifies which string + fret positions of the TabNote are used in this slide. zero indexed. + * @param notes.last_indices currently unused. we assume it's the same as first_indices. + * + * @param direction TabSlide.SLIDE_UP or TabSlide.SLIDE_DOWN + */ + constructor(notes: TieNotes, direction?: number); + renderTie(params: { + direction: number; + first_x_px: number; + last_x_px: number; + last_ys: number[]; + first_ys: number[]; + }): void; +} diff --git a/build/types/src/tabstave.d.ts b/build/types/src/tabstave.d.ts new file mode 100644 index 0000000000..ac87718cd2 --- /dev/null +++ b/build/types/src/tabstave.d.ts @@ -0,0 +1,7 @@ +import { Stave, StaveOptions } from './stave'; +export declare class TabStave extends Stave { + static get CATEGORY(): string; + constructor(x: number, y: number, width: number, options?: StaveOptions); + getYForGlyphs(): number; + addTabGlyph(): this; +} diff --git a/build/types/src/tabtie.d.ts b/build/types/src/tabtie.d.ts new file mode 100644 index 0000000000..bfc26fa027 --- /dev/null +++ b/build/types/src/tabtie.d.ts @@ -0,0 +1,18 @@ +import { StaveTie, TieNotes } from './stavetie'; +export declare class TabTie extends StaveTie { + static get CATEGORY(): string; + static createHammeron(notes: TieNotes): TabTie; + static createPulloff(notes: TieNotes): TabTie; + /** + * @param notes is a struct that has: + * { + * first_note: Note, + * last_note: Note, + * first_indices: [n1, n2, n3], + * last_indices: [n1, n2, n3] + * } + * + * @param text + */ + constructor(notes: TieNotes, text?: string); +} diff --git a/build/types/src/textbracket.d.ts b/build/types/src/textbracket.d.ts new file mode 100644 index 0000000000..201f9d49fb --- /dev/null +++ b/build/types/src/textbracket.d.ts @@ -0,0 +1,55 @@ +import { Element } from './element'; +import { FontInfo } from './font'; +import { Note } from './note'; +import { RenderContext } from './rendercontext'; +export interface TextBracketParams { + start: Note; + stop: Note; + text?: string; + superscript?: string; + position?: number | string; +} +export declare enum TextBracketPosition { + TOP = 1, + BOTTOM = -1 +} +export declare class TextBracket extends Element { + static DEBUG: boolean; + static get CATEGORY(): string; + static TEXT_FONT: Required; + render_options: { + dashed: boolean; + color: string; + line_width: number; + underline_superscript: boolean; + show_bracket: boolean; + dash: number[]; + bracket_height: number; + }; + protected readonly text: string; + protected readonly superscript: string; + protected line: number; + readonly position: TextBracketPosition; + readonly start: Note; + readonly stop: Note; + static get Position(): typeof TextBracketPosition; + static get PositionString(): Record; + /** + * @deprecated Use `TextBracket.Position` instead. + */ + static get Positions(): typeof TextBracketPosition; + /** + * @deprecated Use `TextBracket.PositionString` instead. + */ + static get PositionsString(): Record; + constructor({ start, stop, text, superscript, position }: TextBracketParams); + /** + * Apply the text backet styling to the provided context. + * @param ctx + * @returns this + */ + applyStyle(ctx: RenderContext): this; + setDashed(dashed: boolean, dash?: number[]): this; + setLine(line: number): this; + draw(): void; +} diff --git a/build/types/src/textdynamics.d.ts b/build/types/src/textdynamics.d.ts new file mode 100644 index 0000000000..fa07c00a82 --- /dev/null +++ b/build/types/src/textdynamics.d.ts @@ -0,0 +1,39 @@ +import { Glyph } from './glyph'; +import { Note } from './note'; +import { TextNoteStruct } from './textnote'; +/** + * `TextDynamics` renders traditional + * text dynamics markings, **ie: p, f, sfz, rfz, ppp** + * + * You can render any dynamics string that contains a combination of + * the following letters: P, M, F, Z, R, S + */ +export declare class TextDynamics extends Note { + /** To enable logging for this class. Set `Vex.Flow.TextDynamics.DEBUG` to `true`. */ + static DEBUG: boolean; + static get CATEGORY(): string; + protected sequence: string; + protected line: number; + protected glyphs: Glyph[]; + /** The glyph data for each dynamics letter. */ + static get GLYPHS(): Record; + /** + * Create the dynamics marking. + * + * A `TextDynamics` object inherits from `Note` so that it can be formatted + * within a `Voice`. + * + * @param noteStruct an object that contains a `duration` property and a + * `sequence` of letters that represents the letters to render. + */ + constructor(noteStruct: TextNoteStruct); + /** Set the Stave line on which the note should be placed. */ + setLine(line: number): this; + /** Preformat the dynamics text. */ + preFormat(): this; + /** Draw the dynamics text on the rendering context. */ + draw(): void; +} diff --git a/build/types/src/textformatter.d.ts b/build/types/src/textformatter.d.ts new file mode 100644 index 0000000000..041b612873 --- /dev/null +++ b/build/types/src/textformatter.d.ts @@ -0,0 +1,109 @@ +import { FontGlyph, FontInfo } from './font'; +export interface TextFormatterInfo extends Record { + family: string; + resolution?: number; + glyphs?: Record; + serifs: boolean; + monospaced: boolean; + italic: boolean; + bold: boolean; + maxSizeGlyph?: string; + superscriptOffset?: number; + subscriptOffset?: number; + description: string; +} +export declare class TextFormatter { + /** To enable logging for this class. Set `Vex.Flow.TextFormatter.DEBUG` to `true`. */ + static DEBUG: boolean; + /** + * Return all registered font families. + */ + static getFontFamilies(): TextFormatterInfo[]; + /** + * Call `TextFormatter.registerInfo(info)` to register font information before using this method. + * + * This method creates a formatter for the font that most closely matches the requested font. + * We compare font family, bold, and italic attributes. + * This method will return a fallback formatter if there are no matches. + */ + static create(requestedFont?: FontInfo): TextFormatter; + /** + * @param fontFamily used as a key to the font registry. + * @returns the same info object that was passed in via `TextFormatter.registerInfo(info)` + */ + static getInfo(fontFamily: string): TextFormatterInfo | undefined; + /** + * Apps may register their own fonts and metrics, and those metrics + * will be available to the app for formatting. + * + * Metrics can be generated from a font file using fontgen_text.js in the tools/fonts directory. + * @param info + * @param overwrite + */ + static registerInfo(info: TextFormatterInfo, overwrite?: boolean): void; + /** Font family. */ + protected family: string; + /** Specified in `pt` units. */ + protected size: number; + /** Font metrics are extracted at 1000 upem (units per em). */ + protected resolution: number; + /** + * For text formatting, we do not require glyph outlines, but instead rely on glyph + * bounding box metrics such as: + * ``` + * { + * x_min: 48, + * x_max: 235, + * y_min: -17, + * y_max: 734, + * ha: 751, + * leftSideBearing: 48, + * advanceWidth: 286, + * } + * ``` + */ + protected glyphs: Record; + protected description?: string; + protected serifs: boolean; + protected monospaced: boolean; + protected italic: boolean; + protected bold: boolean; + protected superscriptOffset: number; + protected subscriptOffset: number; + protected maxSizeGlyph: string; + protected cacheKey: string; + /** + * Use `TextFormatter.create(...)` to build an instance from information previously + * registered via `TextFormatter.registerInfo(info)`. + */ + private constructor(); + updateParams(params: TextFormatterInfo): void; + /** Create a hash with the current font data, so we can cache computed widths. */ + updateCacheKey(): void; + /** + * The glyphs table is indexed by the character (e.g., 'C', '@'). + * See: robotoslab_glyphs.ts & petalumascript_glyphs.ts. + */ + getGlyphMetrics(character: string): FontGlyph; + get maxHeight(): number; + /** + * Retrieve the character's advanceWidth as a fraction of an `em` unit. + * For the space character ' ' as defined in the: + * petalumascript_glyphs.ts: 250 advanceWidth in the 1000 unitsPerEm font returns 0.25. + * robotoslab_glyphs.ts: 509 advanceWidth in the 2048 unitsPerEm font returns 0.2485. + */ + getWidthForCharacterInEm(c: string): number; + /** + * Retrieve the total width of `text` in `em` units. + */ + getWidthForTextInEm(text: string): number; + /** The width of the text (in `em`) is scaled by the font size (in `px`). */ + getWidthForTextInPx(text: string): number; + /** + * @param size in pt. + */ + setFontSize(size: number): this; + /** `this.size` is specified in points. Convert to pixels. */ + get fontSizeInPixels(): number; + getResolution(): number; +} diff --git a/build/types/src/textnote.d.ts b/build/types/src/textnote.d.ts new file mode 100644 index 0000000000..adea05e67d --- /dev/null +++ b/build/types/src/textnote.d.ts @@ -0,0 +1,49 @@ +import { FontInfo } from './font'; +import { Note, NoteStruct } from './note'; +export declare enum Justification { + LEFT = 1, + CENTER = 2, + RIGHT = 3 +} +export interface TextNoteStruct extends NoteStruct { + text?: string; + glyph?: string; + ignore_ticks?: boolean; + smooth?: boolean; + font?: FontInfo; + subscript?: string; + superscript?: string; +} +/** + * `TextNote` is a notation element that is positioned in time. Generally + * meant for objects that sit above/below the staff and inline with each other. + * `TextNote` has to be assigned to a `Stave` before rendering by means of `setStave`. + * Examples of this would be such as dynamics, lyrics, chord changes, etc. + */ +export declare class TextNote extends Note { + static get CATEGORY(): string; + static TEXT_FONT: Required; + static get Justification(): typeof Justification; + /** Glyph data. */ + static get GLYPHS(): Record; + protected text: string; + protected superscript?: string; + protected subscript?: string; + protected smooth: boolean; + protected justification: Justification; + protected line: number; + constructor(noteStruct: TextNoteStruct); + /** Set the horizontal justification of the TextNote. */ + setJustification(just: Justification): this; + /** Set the Stave line on which the note should be placed. */ + setLine(line: number): this; + /** Pre-render formatting. */ + preFormat(): void; + /** + * Renders the TextNote. + * `TextNote` has to be assigned to a `Stave` before rendering by means of `setStave`. + */ + draw(): void; +} diff --git a/build/types/src/tickable.d.ts b/build/types/src/tickable.d.ts new file mode 100644 index 0000000000..2af87518bd --- /dev/null +++ b/build/types/src/tickable.d.ts @@ -0,0 +1,140 @@ +import { Element } from './element'; +import { Fraction } from './fraction'; +import { Modifier } from './modifier'; +import { ModifierContext } from './modifiercontext'; +import { Stave } from './stave'; +import { TickContext } from './tickcontext'; +import { Tuplet } from './tuplet'; +import { Voice } from './voice'; +/** Formatter metrics interface */ +export interface FormatterMetrics { + duration: string; + freedom: { + left: number; + right: number; + }; + iterations: number; + space: { + used: number; + mean: number; + deviation: number; + }; +} +/** + * Tickable represents a element that sit on a score and + * has a duration, i.e., Tickables occupy space in the musical rendering dimension. + */ +export declare abstract class Tickable extends Element { + static get CATEGORY(): string; + protected ignore_ticks: boolean; + protected tupletStack: Tuplet[]; + protected tuplet?: Tuplet; + protected ticks: Fraction; + protected center_x_shift: number; + protected voice?: Voice; + protected width: number; + protected x_shift: number; + protected modifierContext?: ModifierContext; + protected tickContext?: TickContext; + protected modifiers: Modifier[]; + protected tickMultiplier: Fraction; + protected formatterMetrics: FormatterMetrics; + protected intrinsicTicks: number; + protected align_center: boolean; + private _preFormatted; + private _postFormatted; + constructor(); + /** Reset the Tickable, this function will be overloaded. */ + reset(): this; + /** Return the ticks. */ + getTicks(): Fraction; + /** Check if it ignores the ticks. */ + shouldIgnoreTicks(): boolean; + /** Ignore the ticks. */ + setIgnoreTicks(flag: boolean): this; + /** Set width of note. Used by the formatter for positioning. */ + setWidth(width: number): void; + /** Get width of note. Used by the formatter for positioning. */ + getWidth(): number; + /** Displace note by `x` pixels. Used by the formatter. */ + setXShift(x: number): this; + /** Get the `x` displaced pixels of the note. */ + getXShift(): number; + /** Get `x` position of this tick context. */ + getX(): number; + /** Return the formatterMetrics. */ + getFormatterMetrics(): FormatterMetrics; + /** Return the center `x` shift. */ + getCenterXShift(): number; + /** Set the center `x` shift. */ + setCenterXShift(centerXShift: number): this; + isCenterAligned(): boolean; + setCenterAlignment(align_center: boolean): this; + /** + * Return the associated voice. Every tickable must be associated with a voice. + * This allows formatters and preFormatter to associate them with the right modifierContexts. + */ + getVoice(): Voice; + /** Set the associated voice. */ + setVoice(voice: Voice): void; + /** Get the tuplet. */ + getTuplet(): Tuplet | undefined; + /** Return the intrinsic ticks. */ + getTupletStack(): Tuplet[]; + /** + * Reset the specific Tuplet if this is not provided, all tuplets are reset. + * Remove any prior tuplets from the tick calculation and + * reset the intrinsic tick value. + */ + resetTuplet(tuplet?: Tuplet): this; + /** Attach to new tuplet. */ + setTuplet(tuplet: Tuplet): this; + /** + * Add self to the provided ModifierContext `mc`. + * If this tickable has modifiers, set modifierContext. + * @returns this + */ + addToModifierContext(mc: ModifierContext): this; + /** + * Optional, if tickable has modifiers, associate a Modifier. + * @param mod the modifier + */ + addModifier(modifier: Modifier, index?: number): this; + /** Get the list of associated modifiers. */ + getModifiers(): Modifier[]; + /** Set the Tick Context. */ + setTickContext(tc: TickContext): void; + checkTickContext(message?: string): TickContext; + /** Preformat the Tickable. */ + preFormat(): void; + /** Set preformatted status. */ + set preFormatted(value: boolean); + get preFormatted(): boolean; + /** Postformat the Tickable. */ + postFormat(): this; + /** Set postformatted status. */ + set postFormatted(value: boolean); + get postFormatted(): boolean; + /** Return the intrinsic ticks. */ + getIntrinsicTicks(): number; + /** Set the intrinsic ticks. */ + setIntrinsicTicks(intrinsicTicks: number): void; + /** Get the tick multiplier. */ + getTickMultiplier(): Fraction; + /** Apply a tick multiplier. */ + applyTickMultiplier(numerator: number, denominator: number): void; + /** Set the duration. */ + setDuration(duration: Fraction): void; + getAbsoluteX(): number; + /** Attach this note to a modifier context. */ + setModifierContext(mc?: ModifierContext): this; + /** Get `ModifierContext`. */ + getModifierContext(): ModifierContext | undefined; + /** Check and get `ModifierContext`. */ + checkModifierContext(): ModifierContext; + /** Get the target stave. */ + abstract getStave(): Stave | undefined; + /** Set the target stave. */ + abstract setStave(stave: Stave): this; + abstract getMetrics(): any; +} diff --git a/build/types/src/tickcontext.d.ts b/build/types/src/tickcontext.d.ts new file mode 100644 index 0000000000..20e5a92957 --- /dev/null +++ b/build/types/src/tickcontext.d.ts @@ -0,0 +1,82 @@ +import { Fraction } from './fraction'; +import { NoteMetrics } from './note'; +import { Tickable } from './tickable'; +export interface TickContextMetrics extends NoteMetrics { + totalLeftPx: number; + totalRightPx: number; +} +export interface TickContextOptions { + tickID: number; +} +/** + * TickContext formats abstract tickable objects, such as notes, chords, tabs, etc. + */ +export declare class TickContext { + protected readonly tickID: number; + protected readonly tickables: Tickable[]; + protected readonly tickablesByVoice: Record; + protected currentTick: Fraction; + protected maxTicks: Fraction; + protected padding: number; + protected xBase: number; + protected x: number; + protected xOffset: number; + protected notePx: number; + protected glyphPx: number; + protected leftDisplacedHeadPx: number; + protected rightDisplacedHeadPx: number; + protected modLeftPx: number; + protected modRightPx: number; + protected totalLeftPx: number; + protected totalRightPx: number; + protected maxTickable?: Tickable; + protected minTicks?: Fraction; + protected minTickable?: Tickable; + tContexts: TickContext[]; + protected preFormatted: boolean; + protected postFormatted: boolean; + protected width: number; + protected formatterMetrics: { + freedom: { + left: number; + right: number; + }; + }; + static getNextContext(tContext: TickContext): TickContext | undefined; + constructor(options?: TickContextOptions); + getTickID(): number; + getX(): number; + setX(x: number): this; + getXBase(): number; + setXBase(xBase: number): void; + getXOffset(): number; + setXOffset(xOffset: number): void; + getWidth(): number; + setPadding(padding: number): this; + getMaxTicks(): Fraction; + getMinTicks(): Fraction | undefined; + getMaxTickable(): Tickable | undefined; + getMinTickable(): Tickable | undefined; + getTickables(): Tickable[]; + /** + * Introduced on 2020-04-17 as getTickablesForVoice(voiceIndex). + * https://github.com/0xfe/vexflow/blame/dc97b0cc5bb93171c0038638c34362dc958222ca/src/tickcontext.js#L63 + * Renamed on 2021-08-05 to getTickableForVoice(voiceIndex). Method renamed to singular, since it returns one Tickable. + */ + getTickableForVoice(voiceIndex: number): Tickable; + getTickablesByVoice(): Record; + getCenterAlignedTickables(): Tickable[]; + /** Gets widths context, note and left/right modifiers for formatting. */ + getMetrics(): TickContextMetrics; + getCurrentTick(): Fraction; + setCurrentTick(tick: Fraction): void; + addTickable(tickable: Tickable, voiceIndex?: number): this; + preFormat(): this; + postFormat(): this; + getFormatterMetrics(): { + freedom: { + left: number; + right: number; + }; + }; +} diff --git a/build/types/src/timesigglyph.d.ts b/build/types/src/timesigglyph.d.ts new file mode 100644 index 0000000000..982fc6b06a --- /dev/null +++ b/build/types/src/timesigglyph.d.ts @@ -0,0 +1,14 @@ +import { Glyph, GlyphMetrics } from './glyph'; +import { TimeSignature } from './timesignature'; +export declare class TimeSignatureGlyph extends Glyph { + timeSignature: TimeSignature; + topStartX: number; + botStartX: number; + width: number; + xMin: number; + constructor(timeSignature: TimeSignature, topDigits: string, botDigits: string, code: string, point: number, options?: { + category: string; + }); + getMetrics(): GlyphMetrics; + renderToStave(x: number): void; +} diff --git a/build/types/src/timesignature.d.ts b/build/types/src/timesignature.d.ts new file mode 100644 index 0000000000..9e88c30395 --- /dev/null +++ b/build/types/src/timesignature.d.ts @@ -0,0 +1,26 @@ +import { Glyph } from './glyph'; +import { StaveModifier } from './stavemodifier'; +export interface TimeSignatureInfo { + glyph: Glyph; + line?: number; + num: boolean; +} +export declare class TimeSignature extends StaveModifier { + static get CATEGORY(): string; + static get glyphs(): Record; + point: number; + bottomLine: number; + topLine: number; + protected info: TimeSignatureInfo; + protected validate_args: boolean; + constructor(timeSpec?: string, customPadding?: number, validate_args?: boolean); + parseTimeSpec(timeSpec: string): TimeSignatureInfo; + makeTimeSignatureGlyph(topDigits: string, botDigits: string): Glyph; + getInfo(): TimeSignatureInfo; + setTimeSig(timeSpec: string): this; + draw(): void; +} diff --git a/build/types/src/timesignote.d.ts b/build/types/src/timesignote.d.ts new file mode 100644 index 0000000000..3907a793bb --- /dev/null +++ b/build/types/src/timesignote.d.ts @@ -0,0 +1,11 @@ +import { ModifierContext } from './modifiercontext'; +import { Note } from './note'; +import { TimeSignatureInfo } from './timesignature'; +export declare class TimeSigNote extends Note { + static get CATEGORY(): string; + protected timeSigInfo: TimeSignatureInfo; + constructor(timeSpec: string, customPadding?: number); + addToModifierContext(mc: ModifierContext): this; + preFormat(): this; + draw(): void; +} diff --git a/build/types/src/tremolo.d.ts b/build/types/src/tremolo.d.ts new file mode 100644 index 0000000000..8a5f3db4f1 --- /dev/null +++ b/build/types/src/tremolo.d.ts @@ -0,0 +1,17 @@ +import { Modifier } from './modifier'; +/** Tremolo implements tremolo notation. */ +export declare class Tremolo extends Modifier { + static get CATEGORY(): string; + protected readonly code: string; + protected readonly num: number; + /** Extra spacing required for big strokes. */ + y_spacing_scale: number; + /** Font scaling for big strokes. */ + extra_stroke_scale: number; + /** + * @param num number of bars + */ + constructor(num: number); + /** Draw the tremolo on the rendering context. */ + draw(): void; +} diff --git a/build/types/src/tuning.d.ts b/build/types/src/tuning.d.ts new file mode 100644 index 0000000000..c0195742e2 --- /dev/null +++ b/build/types/src/tuning.d.ts @@ -0,0 +1,23 @@ +/** `Tuning` implements varies types of tunings for tablature. */ +export declare class Tuning { + protected tuningValues: number[]; + static get names(): Record; + /** + * Constructor. + * @param tuningString tuning name (eg. 'dagdad') or comma separated note strings + */ + constructor(tuningString?: string); + /** Return the note number associated to the note string. */ + noteToInteger(noteString: string): number; + /** + * Set tuning identified by tuning name (eg. 'dagdad') + * @param tuningString tuning name (eg. 'dagdad') or comma separated note strings + */ + setTuning(tuningString: string): void; + /** Return the note number associated with a tablature string. */ + getValueForString(stringNum: string | number): number; + /** Return the note number associated with a tablature string and fret. */ + getValueForFret(fretNum: string | number, stringNum: string | number): number; + /** Return the note string associated with tablature string and fret. */ + getNoteForFret(fretNum: string | number, stringNum: string | number): string; +} diff --git a/build/types/src/tuplet.d.ts b/build/types/src/tuplet.d.ts new file mode 100644 index 0000000000..a89a597479 --- /dev/null +++ b/build/types/src/tuplet.d.ts @@ -0,0 +1,105 @@ +/** + * ## Description + * + * Create a new tuplet from the specified notes. The notes must + * be part of the same voice. If they are of different rhythmic + * values, then options.num_notes must be set. + * + * @constructor + * @param {Array.} A set of notes: staveNotes, + * notes, etc... any class that inherits stemmableNote at some + * point in its prototype chain. + * @param options: object { + * + * num_notes: fit this many notes into... + * notes_occupied: ...the space of this many notes + * + * Together, these two properties make up the tuplet ratio + * in the form of num_notes : notes_occupied. + * num_notes defaults to the number of notes passed in, so + * it is important that if you omit this property, all of + * the notes passed should be of the same note value. + * notes_occupied defaults to 2 -- so you should almost + * certainly pass this parameter for anything other than + * a basic triplet. + * + * location: + * default 1, which is above the notes: ┌─── 3 ───┐ + * -1 is below the notes └─── 3 ───┘ + * + * bracketed: boolean, draw a bracket around the tuplet number + * when true: ┌─── 3 ───┐ when false: 3 + * defaults to true if notes are not beamed, false otherwise + * + * ratioed: boolean + * when true: ┌─── 7:8 ───┐, when false: ┌─── 7 ───┐ + * defaults to true if the difference between num_notes and + * notes_occupied is greater than 1. + * + * y_offset: int, default 0 + * manually offset a tuplet, for instance to avoid collisions + * with articulations, etc... + * } + */ +import { Element } from './element'; +import { Glyph } from './glyph'; +import { Note } from './note'; +export interface TupletOptions { + beats_occupied?: number; + bracketed?: boolean; + location?: number; + notes_occupied?: number; + num_notes?: number; + ratioed?: boolean; + y_offset?: number; +} +export declare const enum TupletLocation { + BOTTOM = -1, + TOP = 1 +} +export declare class Tuplet extends Element { + static get CATEGORY(): string; + notes: Note[]; + protected options: TupletOptions; + protected num_notes: number; + protected point: number; + protected bracketed: boolean; + protected y_pos: number; + protected x_pos: number; + protected width: number; + protected location: number; + protected notes_occupied: number; + protected ratioed: boolean; + protected numerator_glyphs: Glyph[]; + protected denom_glyphs: Glyph[]; + static get LOCATION_TOP(): number; + static get LOCATION_BOTTOM(): number; + static get NESTING_OFFSET(): number; + static get metrics(): any; + constructor(notes: Note[], options?: TupletOptions); + attach(): void; + detach(): void; + /** + * Set whether or not the bracket is drawn. + */ + setBracketed(bracketed: boolean): this; + /** + * Set whether or not the ratio is shown. + */ + setRatioed(ratioed: boolean): this; + /** + * Set the tuplet indicator to be displayed either on the top or bottom of the stave. + */ + setTupletLocation(location: number): this; + getNotes(): Note[]; + getNoteCount(): number; + beatsOccupiedDeprecationWarning(): void; + getBeatsOccupied(): number; + setBeatsOccupied(beats: number): void; + getNotesOccupied(): number; + setNotesOccupied(notes: number): void; + resolveGlyphs(): void; + getNestedTupletCount(): number; + getYPosition(): number; + draw(): void; +} diff --git a/build/types/src/typeguard.d.ts b/build/types/src/typeguard.d.ts new file mode 100644 index 0000000000..e1399a8862 --- /dev/null +++ b/build/types/src/typeguard.d.ts @@ -0,0 +1,99 @@ +import { Accidental } from './accidental'; +import { Annotation } from './annotation'; +import { Dot } from './dot'; +import { GraceNote } from './gracenote'; +import { GraceNoteGroup } from './gracenotegroup'; +import { Note } from './note'; +import { RenderContext } from './rendercontext.js'; +import { Barline } from './stavebarline'; +import { StaveNote } from './stavenote'; +import { StemmableNote } from './stemmablenote'; +import { TabNote } from './tabnote'; +/** + * Use instead of `instanceof` as a more flexible type guard. + * @param obj check if this object's CATEGORY matches the provided category. + * @param category a string representing a category of VexFlow objects. + * @param checkAncestors defaults to `true`, so we walk up the prototype chain to look for a matching `CATEGORY`. + * If `false`, we do not check the superclass or other ancestors. + * @returns true if `obj` has a static `CATEGORY` property that matches `category`. + */ +export declare function isCategory(obj: any, category: string, checkAncestors?: boolean): obj is T; +export declare const isAccidental: (obj: unknown) => obj is Accidental; +export declare const isAnnotation: (obj: unknown) => obj is Annotation; +export declare const isBarline: (obj: unknown) => obj is Barline; +export declare const isDot: (obj: unknown) => obj is Dot; +export declare const isGraceNote: (obj: unknown) => obj is GraceNote; +export declare const isGraceNoteGroup: (obj: unknown) => obj is GraceNoteGroup; +export declare const isNote: (obj: unknown) => obj is Note; +export declare const isRenderContext: (obj: unknown) => obj is RenderContext; +export declare const isStaveNote: (obj: unknown) => obj is StaveNote; +export declare const isStemmableNote: (obj: unknown) => obj is StemmableNote; +export declare const isTabNote: (obj: unknown) => obj is TabNote; +export declare const enum Category { + Accidental = "Accidental", + Annotation = "Annotation", + Articulation = "Articulation", + Barline = "Barline", + BarNote = "BarNote", + Beam = "Beam", + Bend = "Bend", + ChordSymbol = "ChordSymbol", + Clef = "Clef", + ClefNote = "ClefNote", + Crescendo = "Crescendo", + Curve = "Curve", + Dot = "Dot", + Element = "Element", + Fraction = "Fraction", + FretHandFinger = "FretHandFinger", + GhostNote = "GhostNote", + Glyph = "Glyph", + GlyphNote = "GlyphNote", + GraceNote = "GraceNote", + GraceNoteGroup = "GraceNoteGroup", + GraceTabNote = "GraceTabNote", + KeySignature = "KeySignature", + KeySigNote = "KeySigNote", + Modifier = "Modifier", + MultiMeasureRest = "MultiMeasureRest", + Note = "Note", + NoteHead = "NoteHead", + NoteSubGroup = "NoteSubGroup", + Ornament = "Ornament", + Parenthesis = "Parenthesis", + PedalMarking = "PedalMarking", + RenderContext = "RenderContext", + RepeatNote = "RepeatNote", + Repetition = "Repetition", + Stave = "Stave", + StaveConnector = "StaveConnector", + StaveHairpin = "StaveHairpin", + StaveLine = "StaveLine", + StaveModifier = "StaveModifier", + StaveNote = "StaveNote", + StaveSection = "StaveSection", + StaveTempo = "StaveTempo", + StaveText = "StaveText", + StaveTie = "StaveTie", + Stem = "Stem", + StemmableNote = "StemmableNote", + StringNumber = "StringNumber", + Stroke = "Stroke", + System = "System", + TabNote = "TabNote", + TabSlide = "TabSlide", + TabStave = "TabStave", + TabTie = "TabTie", + TextBracket = "TextBracket", + TextDynamics = "TextDynamics", + TextNote = "TextNote", + Tickable = "Tickable", + TimeSignature = "TimeSignature", + TimeSigNote = "TimeSigNote", + Tremolo = "Tremolo", + Tuplet = "Tuplet", + Vibrato = "Vibrato", + VibratoBracket = "VibratoBracket", + Voice = "Voice", + Volta = "Volta" +} diff --git a/build/types/src/util.d.ts b/build/types/src/util.d.ts new file mode 100644 index 0000000000..7ff01c89f8 --- /dev/null +++ b/build/types/src/util.d.ts @@ -0,0 +1,27 @@ +/** `RuntimeError` will be thrown by VexFlow classes in case of error. */ +export declare class RuntimeError extends Error { + code: string; + constructor(code: string, message?: string); +} +/** VexFlow can be used outside of the browser (e.g., Node) where `window` may not be defined. */ +export declare function globalObject(): typeof globalThis & any; +/** + * Check that `x` is of type `T` and not `undefined`. + * If `x` is `undefined`, throw a RuntimeError with the optionally provided error code and message. + */ +export declare function defined(x?: T, code?: string, message?: string): T; +/** Default log function sends all arguments to console. */ +export declare function log(block: string, ...args: any[]): void; +/** Dump warning to console. */ +export declare function warn(...args: any[]): void; +/** Locate the mid point between stave lines. Returns a fractional line if a space. */ +export declare function midLine(a: number, b: number): number; +/** + * Used by various classes (e.g., SVGContext) to provide a + * unique prefix to element names (or other keys in shared namespaces). + */ +export declare function prefix(text: string): string; +/** + * Convert an arbitrary angle in radians to the equivalent one in the range [0, pi). + */ +export declare function normalizeAngle(a: number): number; diff --git a/build/types/src/version.d.ts b/build/types/src/version.d.ts new file mode 100644 index 0000000000..e5292457ed --- /dev/null +++ b/build/types/src/version.d.ts @@ -0,0 +1,3 @@ +export declare const VERSION: string; +export declare const ID: string; +export declare const DATE: string; diff --git a/build/types/src/vex.d.ts b/build/types/src/vex.d.ts new file mode 100644 index 0000000000..d05bfe36fe --- /dev/null +++ b/build/types/src/vex.d.ts @@ -0,0 +1,18 @@ +import { Flow } from './flow'; +import { RuntimeError } from './util'; +export declare class Vex { + static Flow: typeof Flow; + /** + * Take `arr` and return a new list consisting of the sorted, unique, + * contents of arr. Does not modify `arr`. + */ + static sortAndUnique(arr: any[], cmp: any, eq: any): any[]; + /** Check if array `arr` contains `obj`. */ + static contains(arr: any[], obj: any): boolean; + static getCanvasContext(canvasSelector: string): RenderingContext; + /** Benchmark. Run function `f` once and report time elapsed shifted by `s` milliseconds. */ + static benchmark(s: any, f: any): void; + static stackTrace(): string | undefined; + static RERR: RuntimeError; + static RuntimeError: RuntimeError; +} diff --git a/build/types/src/vibrato.d.ts b/build/types/src/vibrato.d.ts new file mode 100644 index 0000000000..adfa194c07 --- /dev/null +++ b/build/types/src/vibrato.d.ts @@ -0,0 +1,29 @@ +import { Modifier } from './modifier'; +import { ModifierContext, ModifierContextState } from './modifiercontext'; +import { RenderContext } from './rendercontext'; +export interface VibratoRenderOptions { + wave_height: number; + wave_girth: number; + vibrato_width: number; + harsh: boolean; + wave_width: number; +} +/** `Vibrato` implements diverse vibratos. */ +export declare class Vibrato extends Modifier { + static get CATEGORY(): string; + render_options: VibratoRenderOptions; + /** Arrange vibratos inside a `ModifierContext`. */ + static format(vibratos: Vibrato[], state: ModifierContextState, context: ModifierContext): boolean; + constructor(); + /** Set harsh vibrato. */ + setHarsh(harsh: boolean): this; + /** Set vibrato width in pixels. */ + setVibratoWidth(width: number): this; + /** Draw the vibrato on the rendering context. */ + draw(): void; + /** + * Static rendering method that can be called from + * other classes (e.g. VibratoBracket). + */ + static renderVibrato(ctx: RenderContext, x: number, y: number, opts: VibratoRenderOptions): void; +} diff --git a/build/types/src/vibratobracket.d.ts b/build/types/src/vibratobracket.d.ts new file mode 100644 index 0000000000..3d823d14e1 --- /dev/null +++ b/build/types/src/vibratobracket.d.ts @@ -0,0 +1,33 @@ +import { Element } from './element'; +import { Note } from './note'; +/** `VibratoBracket` renders vibrato effect between two notes. */ +export declare class VibratoBracket extends Element { + /** To enable logging for this class. Set `Vex.Flow.VibratoBracket.DEBUG` to `true`. */ + static DEBUG: boolean; + static get CATEGORY(): string; + protected line: number; + protected start?: Note; + protected stop?: Note; + render_options: { + vibrato_width: number; + wave_height: number; + wave_girth: number; + harsh: boolean; + wave_width: number; + }; + /** + * Either the stop or start note must be set, or both of them. + * An undefined value for the start or stop note indicates that the vibrato + * is drawn from the beginning or until the end of the stave accordingly. + */ + constructor(bracket_data: { + stop?: Note | null; + start?: Note | null; + }); + /** Set line position of the vibrato bracket. */ + setLine(line: number): this; + /** Set harsh vibrato bracket. */ + setHarsh(harsh: boolean): this; + /** Draw the vibrato bracket on the rendering context. */ + draw(): void; +} diff --git a/build/types/src/voice.d.ts b/build/types/src/voice.d.ts new file mode 100644 index 0000000000..aada824349 --- /dev/null +++ b/build/types/src/voice.d.ts @@ -0,0 +1,108 @@ +import { BoundingBox } from './boundingbox'; +import { Element } from './element'; +import { Fraction } from './fraction'; +import { RenderContext } from './rendercontext'; +import { Stave } from './stave'; +import { Tickable } from './tickable'; +export interface VoiceTime { + num_beats: number; + beat_value: number; + /** Defaults to `Flow.RESOLUTION` if not provided. */ + resolution?: number; +} +export declare enum VoiceMode { + STRICT = 1, + SOFT = 2, + FULL = 3 +} +/** + * `Voice` is mainly a container object to group `Tickables` for formatting. + */ +export declare class Voice extends Element { + static get CATEGORY(): string; + /** + * Modes allow the addition of ticks in three different ways: + * - STRICT: This is the default. Ticks must fill the voice. + * - SOFT: Ticks can be added without restrictions. + * - FULL: Ticks do not need to fill the voice, but can't exceed the maximum tick length. + */ + static get Mode(): typeof VoiceMode; + protected resolutionMultiplier: number; + protected smallestTickCount: Fraction; + protected stave?: Stave; + protected mode: VoiceMode; + protected expTicksUsed?: number; + protected preFormatted: boolean; + protected options: { + softmaxFactor: number; + }; + protected readonly totalTicks: Fraction; + protected readonly ticksUsed: Fraction; + protected readonly largestTickWidth: number; + protected readonly tickables: Tickable[]; + protected readonly time: Required; + constructor(time?: VoiceTime | string, options?: { + softmaxFactor: number; + }); + /** Get the total ticks in the voice. */ + getTotalTicks(): Fraction; + /** Get the total ticks used in the voice by all the tickables. */ + getTicksUsed(): Fraction; + /** Get the largest width of all the tickables. */ + getLargestTickWidth(): number; + /** Get the tick count for the shortest tickable */ + getSmallestTickCount(): Fraction; + /** Get the tickables in the voice. */ + getTickables(): Tickable[]; + /** Get the voice mode. */ + getMode(): number; + /** + * Set the voice mode. + * @param mode value from `VoiceMode` + */ + setMode(mode: number): this; + /** Get the resolution multiplier for the voice. */ + getResolutionMultiplier(): number; + /** Get the actual tick resolution for the voice. */ + getActualResolution(): number; + /** Set the voice's stave. */ + setStave(stave: Stave): this; + getStave(): Stave | undefined; + /** Get the bounding box for the voice. */ + getBoundingBox(): BoundingBox | undefined; + /** Set the voice mode to strict or soft. */ + setStrict(strict: boolean): this; + /** Determine if the voice is complete according to the voice mode. */ + isComplete(): boolean; + /** + * We use softmax to layout the tickables proportional to the exponent of + * their duration. The softmax factor is used to determine the 'linearness' of + * the layout. + * + * The softmax of all the tickables in this voice should sum to 1. + */ + setSoftmaxFactor(factor: number): this; + /** + * Calculate the sum of the exponents of all the ticks in this voice to use + * as the denominator of softmax. + */ + protected reCalculateExpTicksUsed(): number; + /** Get the softmax-scaled value of a tick duration. 'tickValue' is a number. */ + softmax(tickValue: number): number; + /** Add a tickable to the voice. */ + addTickable(tickable: Tickable): this; + /** Add an array of tickables to the voice. */ + addTickables(tickables: Tickable[]): this; + /** Preformat the voice by applying the voice's stave to each note. */ + preFormat(): this; + checkStave(): Stave; + /** + * Render the voice onto the canvas `context` and an optional `stave`. + * If `stave` is omitted, it is expected that the notes have staves + * already set. + * + * This method also calculates the voice's boundingBox while drawing + * the notes. Note the similarities with this.getBoundingBox(). + */ + draw(context?: RenderContext, stave?: Stave): void; +} diff --git a/build/types/src/web.d.ts b/build/types/src/web.d.ts new file mode 100644 index 0000000000..e5bd19628f --- /dev/null +++ b/build/types/src/web.d.ts @@ -0,0 +1,2 @@ +export declare function isHTMLCanvas(element: any): element is HTMLCanvasElement; +export declare function isHTMLDiv(element: any): element is HTMLDivElement; diff --git a/package-lock.json b/package-lock.json index 56e3a0e567..7fae9d6347 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vexflow", - "version": "4.0.1-alpha.1", + "version": "4.0.1-alpha.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "vexflow", - "version": "4.0.1-alpha.1", + "version": "4.0.1-alpha.2", "license": "MIT", "devDependencies": { "@typescript-eslint/eslint-plugin": "^5.8.1", diff --git a/package.json b/package.json index ac456f8f6f..02624f5ef8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vexflow", - "version": "4.0.1-alpha.1", + "version": "4.0.1-alpha.2", "description": "A JavaScript library for rendering music notation and guitar tablature.", "exports": { ".": {